diff --git a/.build.ps1 b/.build.ps1 index 7f4ab196eba34..6f29acab3cc15 100644 --- a/.build.ps1 +++ b/.build.ps1 @@ -154,7 +154,7 @@ task DownloadLinter -If (-not (Test-Path $tools.Linter.Path)) { } task RunLinter DownloadLinter, { - exec { & $tools.Linter.Path run -v --disable-all --deadline=3m --enable=misspell --enable=ineffassign $directories } + exec { & $tools.Linter.Path run -v --disable-all --deadline=3m --enable=misspell --enable=ineffassign --enable=varcheck $directories } } task GoModTidy { diff --git a/.github/labeler.yml b/.github/labeler.yml index dc15adb5d9ad6..d0f691dae5597 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -1,6 +1,7 @@ sig/execution: - distsql/* - executor/* + - !executor/brie* - util/chunk/* - util/disk/* - util/execdetails/* @@ -22,12 +23,20 @@ sig/planner: component/statistics: - statistics/* -sig/DDL: +sig/sql-infra: - ddl/* - domain/* - infoschema/* + - session/* + - server/* + - privilege/* + - plugin/* + - config/* - meta/* - owner/* component/config: - config/* + +sig/migrate: + - executor/brie* diff --git a/.github/workflows/assign_project.yml b/.github/workflows/assign_project.yml index 3d8999ee5a29f..87a8ee8b3f70b 100644 --- a/.github/workflows/assign_project.yml +++ b/.github/workflows/assign_project.yml @@ -53,7 +53,7 @@ jobs: - name: Run issues assignment to project SIG DDL Kanban uses: srggrs/assign-one-project-github-action@1.2.0 if: | - contains(github.event.issue.labels.*.name, 'sig/DDL') || + contains(github.event.issue.labels.*.name, 'sig/infra') || contains(github.event.issue.labels.*.name, 'component/binlog') || contains(github.event.issue.labels.*.name, 'component/charset') || contains(github.event.issue.labels.*.name, 'component/infoschema') || diff --git a/.gitignore b/.gitignore index e11a1a162adaa..f1d8731e36d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ explain_test cmd/explaintest/explain-test.out cmd/explaintest/explaintest_tidb-server cmd/explaintest/portgenerator +cmd/explaintest/s/ *.fail.go tools/bin/ vendor diff --git a/Dockerfile b/Dockerfile index 8ca9f24570bbb..46d7d05db347e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -40,6 +40,9 @@ RUN make # Executable image FROM alpine +RUN apk add --no-cache \ + curl + COPY --from=builder /go/src/github.com/pingcap/tidb/bin/tidb-server /tidb-server COPY --from=builder /usr/local/bin/dumb-init /usr/local/bin/dumb-init diff --git a/Makefile b/Makefile index bc6c3fbafd056..e5bed537cc8f3 100644 --- a/Makefile +++ b/Makefile @@ -11,63 +11,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -PROJECT=tidb -GOPATH ?= $(shell go env GOPATH) -P=8 - -# Ensure GOPATH is set before running build process. -ifeq "$(GOPATH)" "" - $(error Please set the environment variable GOPATH before running `make`) -endif -FAIL_ON_STDOUT := awk '{ print } END { if (NR > 0) { exit 1 } }' - -CURDIR := $(shell pwd) -path_to_add := $(addsuffix /bin,$(subst :,/bin:,$(GOPATH))):$(PWD)/tools/bin -export PATH := $(path_to_add):$(PATH) - -GO := GO111MODULE=on go -GOBUILD := $(GO) build $(BUILD_FLAG) -tags codes -GOBUILDCOVERAGE := GOPATH=$(GOPATH) cd tidb-server; $(GO) test -coverpkg="../..." -c . -GOTEST := $(GO) test -p $(P) -OVERALLS := GO111MODULE=on overalls -STATICCHECK := GO111MODULE=on staticcheck -TIDB_EDITION ?= Community - -# Ensure TIDB_EDITION is set to Community or Enterprise before running build process. -ifneq "$(TIDB_EDITION)" "Community" -ifneq "$(TIDB_EDITION)" "Enterprise" - $(error Please set the correct environment variable TIDB_EDITION before running `make`) -endif -endif - -ARCH := "`uname -s`" -LINUX := "Linux" -MAC := "Darwin" -PACKAGE_LIST := go list ./...| grep -vE "cmd" -PACKAGES ?= $$($(PACKAGE_LIST)) -PACKAGE_DIRECTORIES := $(PACKAGE_LIST) | sed 's|github.com/pingcap/$(PROJECT)/||' -FILES := $$(find $$($(PACKAGE_DIRECTORIES)) -name "*.go") - -FAILPOINT_ENABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|tools)" | xargs tools/bin/failpoint-ctl enable) -FAILPOINT_DISABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|tools)" | xargs tools/bin/failpoint-ctl disable) - -LDFLAGS += -X "github.com/pingcap/parser/mysql.TiDBReleaseVersion=$(shell git describe --tags --dirty --always)" -LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBBuildTS=$(shell date -u '+%Y-%m-%d %H:%M:%S')" -LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitHash=$(shell git rev-parse HEAD)" -LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitBranch=$(shell git rev-parse --abbrev-ref HEAD)" -LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBEdition=$(TIDB_EDITION)" - -TEST_LDFLAGS = -X "github.com/pingcap/tidb/config.checkBeforeDropLDFlag=1" -COVERAGE_SERVER_LDFLAGS = -X "github.com/pingcap/tidb/tidb-server.isCoverageServer=1" - -CHECK_LDFLAGS += $(LDFLAGS) ${TEST_LDFLAGS} - -TARGET = "" - -# VB = Vector Benchmark -VB_FILE = -VB_FUNC = - +include Makefile.common .PHONY: all clean test gotest server dev benchkv benchraw check checklist parser tidy ddltest @@ -88,7 +32,7 @@ dev: checklist check test # Install the check tools. check-setup:tools/bin/revive tools/bin/goword tools/bin/gometalinter tools/bin/gosec -check: fmt errcheck unconvert lint tidy testSuite check-static vet staticcheck +check: fmt errcheck unconvert lint tidy testSuite check-static vet staticcheck errdoc # These need to be fixed before they can be ran regularly check-fail: goword check-slow @@ -108,6 +52,7 @@ check-static: tools/bin/golangci-lint tools/bin/golangci-lint run -v --disable-all --deadline=3m \ --enable=misspell \ --enable=ineffassign \ + --enable=varcheck \ $$($(PACKAGE_DIRECTORIES)) check-slow:tools/bin/gometalinter tools/bin/gosec @@ -127,6 +72,10 @@ gogenerate: @echo "go generate ./..." ./tools/check/check-gogenerate.sh +errdoc:tools/bin/errdoc-gen + @echo "generator errors.toml" + ./tools/check/check-errdoc.sh + lint:tools/bin/revive @echo "linting" @tools/bin/revive -formatter friendly -config tools/check/revive.toml $(FILES) @@ -147,10 +96,8 @@ testSuite: @echo "testSuite" ./tools/check/check_testSuite.sh -clean: +clean: failpoint-disable $(GO) clean -i ./... - rm -rf *.out - rm -rf parser # Split tests for CI to run `make test` in parallel. test: test_part_1 test_part_2 @@ -177,16 +124,16 @@ gotest: failpoint-enable ifeq ("$(TRAVIS_COVERAGE)", "1") @echo "Running in TRAVIS_COVERAGE mode." $(GO) get github.com/go-playground/overalls - @export log_level=error; \ + @export log_level=info; \ $(OVERALLS) -project=github.com/pingcap/tidb \ -covermode=count \ - -ignore='.git,vendor,cmd,docs,LICENSES' \ + -ignore='.git,vendor,cmd,docs,tests,LICENSES' \ -concurrency=4 \ -- -coverpkg=./... \ || { $(FAILPOINT_DISABLE); exit 1; } else @echo "Running in native mode." - @export log_level=fatal; export TZ='Asia/Shanghai'; \ + @export log_level=info; export TZ='Asia/Shanghai'; \ $(GOTEST) -ldflags '$(TEST_LDFLAGS)' $(EXTRA_TEST_ARGS) -cover $(PACKAGES) -check.p true -check.timeout 4s || { $(FAILPOINT_DISABLE); exit 1; } endif @$(FAILPOINT_DISABLE) @@ -205,17 +152,6 @@ tikv_integration_test: failpoint-enable $(GOTEST) ./store/tikv/. -with-tikv=true || { $(FAILPOINT_DISABLE); exit 1; } @$(FAILPOINT_DISABLE) -RACE_FLAG = -ifeq ("$(WITH_RACE)", "1") - RACE_FLAG = -race - GOBUILD = GOPATH=$(GOPATH) $(GO) build -endif - -CHECK_FLAG = -ifeq ("$(WITH_CHECK)", "1") - CHECK_FLAG = $(TEST_LDFLAGS) -endif - server: ifeq ($(TARGET), "") CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(CHECK_FLAG)' -o bin/tidb-server tidb-server/main.go @@ -301,6 +237,9 @@ tools/bin/unconvert: tools/check/go.mod tools/bin/failpoint-ctl: go.mod $(GO) build -o $@ github.com/pingcap/failpoint/failpoint-ctl +tools/bin/errdoc-gen: go.mod + $(GO) build -o $@ github.com/pingcap/errors/errdoc-gen + tools/bin/golangci-lint: curl -sfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh| sh -s -- -b ./tools/bin v1.29.0 diff --git a/Makefile.common b/Makefile.common new file mode 100644 index 0000000000000..8885dc6c3a979 --- /dev/null +++ b/Makefile.common @@ -0,0 +1,80 @@ +# Copyright 2020 PingCAP, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. + +PROJECT=tidb +GOPATH ?= $(shell go env GOPATH) +P=8 + +# Ensure GOPATH is set before running build process. +ifeq "$(GOPATH)" "" + $(error Please set the environment variable GOPATH before running `make`) +endif +FAIL_ON_STDOUT := awk '{ print } END { if (NR > 0) { exit 1 } }' + +CURDIR := $(shell pwd) +path_to_add := $(addsuffix /bin,$(subst :,/bin:,$(GOPATH))):$(PWD)/tools/bin +export PATH := $(path_to_add):$(PATH) + +GO := GO111MODULE=on go +GOBUILD := $(GO) build $(BUILD_FLAG) -tags codes +GOBUILDCOVERAGE := GOPATH=$(GOPATH) cd tidb-server; $(GO) test -coverpkg="../..." -c . +GOTEST := $(GO) test -p $(P) +OVERALLS := GO111MODULE=on overalls +STATICCHECK := GO111MODULE=on staticcheck +TIDB_EDITION ?= Community + +# Ensure TIDB_EDITION is set to Community or Enterprise before running build process. +ifneq "$(TIDB_EDITION)" "Community" +ifneq "$(TIDB_EDITION)" "Enterprise" + $(error Please set the correct environment variable TIDB_EDITION before running `make`) +endif +endif + +ARCH := "`uname -s`" +LINUX := "Linux" +MAC := "Darwin" +PACKAGE_LIST := go list ./...| grep -vE "cmd|github.com\/pingcap\/tidb\/tests" +PACKAGES ?= $$($(PACKAGE_LIST)) +PACKAGE_DIRECTORIES := $(PACKAGE_LIST) | sed 's|github.com/pingcap/$(PROJECT)/||' +FILES := $$(find $$($(PACKAGE_DIRECTORIES)) -name "*.go") + +FAILPOINT_ENABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|tools)" | xargs tools/bin/failpoint-ctl enable) +FAILPOINT_DISABLE := $$(find $$PWD/ -type d | grep -vE "(\.git|tools)" | xargs tools/bin/failpoint-ctl disable) + +LDFLAGS += -X "github.com/pingcap/parser/mysql.TiDBReleaseVersion=$(shell git describe --tags --dirty --always)" +LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBBuildTS=$(shell date -u '+%Y-%m-%d %H:%M:%S')" +LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitHash=$(shell git rev-parse HEAD)" +LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBGitBranch=$(shell git rev-parse --abbrev-ref HEAD)" +LDFLAGS += -X "github.com/pingcap/tidb/util/versioninfo.TiDBEdition=$(TIDB_EDITION)" + +TEST_LDFLAGS = -X "github.com/pingcap/tidb/config.checkBeforeDropLDFlag=1" +COVERAGE_SERVER_LDFLAGS = -X "github.com/pingcap/tidb/tidb-server.isCoverageServer=1" + +CHECK_LDFLAGS += $(LDFLAGS) ${TEST_LDFLAGS} + +TARGET = "" + +# VB = Vector Benchmark +VB_FILE = +VB_FUNC = + +RACE_FLAG = +ifeq ("$(WITH_RACE)", "1") + RACE_FLAG = -race + GOBUILD = GOPATH=$(GOPATH) $(GO) build +endif + +CHECK_FLAG = +ifeq ("$(WITH_CHECK)", "1") + CHECK_FLAG = $(TEST_LDFLAGS) +endif diff --git a/README.md b/README.md index b49c3cf987aa2..3668531ac7193 100644 --- a/README.md +++ b/README.md @@ -10,11 +10,10 @@ [![Coverage Status](https://codecov.io/gh/pingcap/tidb/branch/master/graph/badge.svg)](https://codecov.io/gh/pingcap/tidb) [![GoDoc](https://img.shields.io/badge/Godoc-reference-blue.svg)](https://godoc.org/github.com/pingcap/tidb) -- [**Slack Channel**](https://pingcap.com/tidbslack/) +- [**Slack Channel**](https://slack.tidb.io/invite?team=tidb-community&channel=everyone&ref=pingcap-tidb) - **Twitter**: [@PingCAP](https://twitter.com/PingCAP) - [**Reddit**](https://www.reddit.com/r/TiDB/) -- **Mailing list**: [Google Group](https://groups.google.com/forum/#!forum/tidb-user) -- [**Blog**](https://www.pingcap.com/blog/) +- **Mailing list**: [lists.tidb.io](https://lists.tidb.io/g/main/subgroups) - [**For support, please contact PingCAP**](http://bit.ly/contact_us_via_github) ## What is TiDB? @@ -27,17 +26,17 @@ TiDB ("Ti" stands for Titanium) is an open-source NewSQL database that supports - __MySQL Compatible Syntax__ - TiDB acts like it is a MySQL 5.7 server to your applications. You can continue to use all of the existing MySQL client libraries, and in many cases, you will not need to change a single line of code in your application. Because TiDB is built from scratch, not a MySQL fork, please check out the list of [known compatibility differences](https://pingcap.com/docs/v3.0/reference/mysql-compatibility/). + TiDB acts like it is a MySQL 5.7 server to your applications. You can continue to use all of the existing MySQL client libraries, and in many cases, you will not need to change a single line of code in your application. Because TiDB is built from scratch, not a MySQL fork, please check out the list of [known compatibility differences](https://docs.pingcap.com/tidb/stable/mysql-compatibility). - __Distributed Transactions with Strong Consistency__ - TiDB internally shards table into small range-based chunks that we refer to as "regions". Each region defaults to approximately 100MiB in size, and TiDB uses a Two-phase commit internally to ensure that regions are maintained in a transactionally consistent way. + TiDB internally shards table into small range-based chunks that we refer to as "Regions". Each Region defaults to approximately 100 MiB in size, and TiDB uses a Two-phase commit internally to ensure that Regions are maintained in a transactionally consistent way. - __Cloud Native__ TiDB is designed to work in the cloud -- public, private, or hybrid -- making deployment, provisioning, operations, and maintenance simple. - The storage layer of TiDB, called TiKV, [became](https://www.cncf.io/blog/2018/08/28/cncf-to-host-tikv-in-the-sandbox/) a [Cloud Native Computing Foundation](https://www.cncf.io/) member project in 2018. The architecture of the TiDB platform also allows SQL processing and storage to be scaled independently of each other in a very cloud-friendly manner. + The storage layer of TiDB, called TiKV, is a [Cloud Native Computing Foundation (CNCF) Graduated](https://www.cncf.io/announcements/2020/09/02/cloud-native-computing-foundation-announces-tikv-graduation/) project. The architecture of the TiDB platform also allows SQL processing and storage to be scaled independently of each other in a very cloud-friendly manner. - __Minimize ETL__ @@ -47,12 +46,10 @@ TiDB ("Ti" stands for Titanium) is an open-source NewSQL database that supports TiDB uses the Raft consensus algorithm to ensure that data is highly available and safely replicated throughout storage in Raft groups. In the event of failure, a Raft group will automatically elect a new leader for the failed member, and self-heal the TiDB cluster without any required manual intervention. Failure and self-healing operations are also transparent to applications. -For more details and latest updates, see [official TiDB blog](https://www.pingcap.com/blog/). - +For more details and latest updates, see [TiDB docs](https://docs.pingcap.com/tidb/stable) and [release notes](https://docs.pingcap.com/tidb/dev/release-notes). ## Quick start - See [Quick Start Guide](https://pingcap.com/docs/stable/quick-start-with-tidb/ ), which includes deployment methods using TiUP, Ansible, Docker, and Kubernetes. ### To start developing TiDB @@ -61,20 +58,22 @@ The [community repository](https://github.com/pingcap/community) hosts all infor [contribution-map](https://github.com/pingcap/tidb-map/blob/master/maps/contribution-map.md#tidb-is-an-open-source-distributed-htap-database-compatible-with-the-mysql-protocol) -Contributions are welcomed and greatly appreciated. See -[CONTRIBUTING.md](https://github.com/pingcap/community/blob/master/CONTRIBUTING.md) -for details on submitting patches and the contribution workflow. For more contributing information, click on the contributor icon above. +Contributions are welcomed and greatly appreciated. See [Contribution Guide](https://github.com/pingcap/community/blob/master/contributors/README.md) for details on submitting patches and the contribution workflow. For more contributing information, click on the contributor icon above. ## Adopters -View the current list of in-production TiDB adopters [here](https://pingcap.com/docs/adopters/). +View the current list of in-production TiDB adopters [here](https://docs.pingcap.com/tidb/stable/adopters). + +## Case studies + +- [English](https://pingcap.com/case-studies) +- [简体中文](https://pingcap.com/cases-cn/) ## Roadmap Read the [Roadmap](https://pingcap.com/docs/ROADMAP). - -## Getting Help +## Getting help - [**Stack Overflow**](https://stackoverflow.com/questions/tagged/tidb) - [**User Group (Chinese)**](https://asktug.com) @@ -84,13 +83,24 @@ Read the [Roadmap](https://pingcap.com/docs/ROADMAP). + [English](https://pingcap.com/docs) + [简体中文](https://pingcap.com/docs-cn) +## Blog + +- [English](https://www.pingcap.com/blog/) +- [简体中文](https://pingcap.com/blog-cn/) + +## TiDB Monthly + +[TiDB Monthly](https://pingcap.com/weekly/) + ## Architecture ![architecture](./docs/architecture.png) ## License + TiDB is under the Apache 2.0 license. See the [LICENSE](./LICENSE) file for details. ## Acknowledgments + - Thanks [cznic](https://github.com/cznic) for providing some great open source tools. - Thanks [GolevelDB](https://github.com/syndtr/goleveldb), [BoltDB](https://github.com/boltdb/bolt), and [RocksDB](https://github.com/facebook/rocksdb) for their powerful storage engines. diff --git a/bindinfo/bind_test.go b/bindinfo/bind_test.go index 8663761f3bd44..1eb7e1478b2f9 100644 --- a/bindinfo/bind_test.go +++ b/bindinfo/bind_test.go @@ -15,9 +15,11 @@ package bindinfo_test import ( "context" + "crypto/tls" "flag" "fmt" "os" + "strconv" "testing" "time" @@ -31,10 +33,13 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/metrics" + plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" + utilparser "github.com/pingcap/tidb/util/parser" "github.com/pingcap/tidb/util/stmtsummary" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" @@ -44,7 +49,10 @@ import ( func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } autoid.SetStep(5000) TestingT(t) } @@ -58,6 +66,40 @@ type testSuite struct { *parser.Parser } +type mockSessionManager struct { + PS []*util.ProcessInfo +} + +func (msm *mockSessionManager) ShowProcessList() map[uint64]*util.ProcessInfo { + ret := make(map[uint64]*util.ProcessInfo) + for _, item := range msm.PS { + ret[item.ID] = item + } + return ret +} + +func (msm *mockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, bool) { + for _, item := range msm.PS { + if item.ID == id { + return item, true + } + } + return &util.ProcessInfo{}, false +} + +func (msm *mockSessionManager) Kill(cid uint64, query bool) { +} + +func (msm *mockSessionManager) KillAllConnections() { +} + +func (msm *mockSessionManager) UpdateTLSConfig(cfg *tls.Config) { +} + +func (msm *mockSessionManager) ServerID() uint64 { + return 1 +} + var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in bind test") func (s *testSuite) SetUpSuite(c *C) { @@ -101,10 +143,17 @@ func (s *testSuite) TearDownTest(c *C) { } func (s *testSuite) cleanBindingEnv(tk *testkit.TestKit) { - tk.MustExec("truncate table mysql.bind_info") + tk.MustExec("delete from mysql.bind_info where source != 'builtin'") s.domain.BindHandle().Clear() } +func normalizeWithDefaultDB(c *C, sql, db string) (string, string) { + testParser := parser.New() + stmt, err := testParser.ParseOneStmt(sql, "", "") + c.Assert(err, IsNil) + return parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmt, "test", "")) +} + func (s *testSuite) TestBindParse(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) @@ -112,8 +161,8 @@ func (s *testSuite) TestBindParse(c *C) { tk.MustExec("create table t(i int)") tk.MustExec("create index index_t on t(i)") - originSQL := "select * from t" - bindSQL := "select * from t use index(index_t)" + originSQL := "select * from `test` . `t`" + bindSQL := "select * from `test` . `t` use index(index_t)" defaultDb := "test" status := "using" charset := "utf8mb4" @@ -127,12 +176,12 @@ func (s *testSuite) TestBindParse(c *C) { c.Check(err, IsNil) c.Check(bindHandle.Size(), Equals, 1) - sql, hash := parser.NormalizeDigest("select * from t") + sql, hash := parser.NormalizeDigest("select * from test . t") bindData := bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t`") bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select * from t use index(index_t)") + c.Check(bind.BindSQL, Equals, "select * from `test` . `t` use index(index_t)") c.Check(bindData.Db, Equals, "test") c.Check(bind.Status, Equals, "using") c.Check(bind.Charset, Equals, "utf8mb4") @@ -158,6 +207,27 @@ func (s *testSuite) TestBindParse(c *C) { tk.MustExec(`create binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())`) tk.MustExec(`drop binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())`) + // Test Update / Delete. + tk.MustExec("create table t1(a int, b int, c int, key(b), key(c))") + tk.MustExec("create table t2(a int, b int, c int, key(b), key(c))") + tk.MustExec("create binding for delete from t1 where b = 1 and c > 1 using delete /*+ use_index(t1, c) */ from t1 where b = 1 and c > 1") + tk.MustExec("drop binding for delete from t1 where b = 1 and c > 1 using delete /*+ use_index(t1, c) */ from t1 where b = 1 and c > 1") + tk.MustExec("create binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.c = 1 using delete /*+ hash_join(t1, t2), use_index(t1, c) */ t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.c = 1") + tk.MustExec("drop binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.c = 1 using delete /*+ hash_join(t1, t2), use_index(t1, c) */ t1, t2 from t1 inner join t2 on t1.b = t2.b where t1.c = 1") + tk.MustExec("create binding for update t1 set a = 1 where b = 1 and c > 1 using update /*+ use_index(t1, c) */ t1 set a = 1 where b = 1 and c > 1") + tk.MustExec("drop binding for update t1 set a = 1 where b = 1 and c > 1 using update /*+ use_index(t1, c) */ t1 set a = 1 where b = 1 and c > 1") + tk.MustExec("create binding for update t1, t2 set t1.a = 1 where t1.b = t2.b using update /*+ inl_join(t1) */ t1, t2 set t1.a = 1 where t1.b = t2.b") + tk.MustExec("drop binding for update t1, t2 set t1.a = 1 where t1.b = t2.b using update /*+ inl_join(t1) */ t1, t2 set t1.a = 1 where t1.b = t2.b") + // Test Insert / Replace. + tk.MustExec("create binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert into t1 select /*+ use_index(t2,c) */ * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("drop binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert into t1 select /*+ use_index(t2,c) */ * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("create binding for replace into t1 select * from t2 where t2.b = 1 and t2.c > 1 using replace into t1 select /*+ use_index(t2,c) */ * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("drop binding for replace into t1 select * from t2 where t2.b = 1 and t2.c > 1 using replace into t1 select /*+ use_index(t2,c) */ * from t2 where t2.b = 1 and t2.c > 1") + err = tk.ExecToErr("create binding for insert into t1 values(1,1,1) using insert into t1 values(1,1,1)") + c.Assert(err.Error(), Equals, "create binding only supports INSERT / REPLACE INTO SELECT") + err = tk.ExecToErr("create binding for replace into t1 values(1,1,1) using replace into t1 values(1,1,1)") + c.Assert(err.Error(), Equals, "create binding only supports INSERT / REPLACE INTO SELECT") + // Test errors. tk.MustExec(`drop table if exists t1`) tk.MustExec("create table t1(i int, s varchar(20))") @@ -178,46 +248,109 @@ var testSQLs = []struct { createSQL: "binding for select * from t where i>100 using select * from t use index(index_t) where i>100", overlaySQL: "binding for select * from t where i>99 using select * from t use index(index_t) where i>99", querySQL: "select * from t where i > 30.0", - originSQL: "select * from t where i > ?", - bindSQL: "select * from t use index(index_t) where i>99", + originSQL: "select * from `test` . `t` where `i` > ?", + bindSQL: "SELECT * FROM `test`.`t` USE INDEX (`index_t`) WHERE `i` > 99", dropSQL: "binding for select * from t where i>100", - memoryUsage: float64(97), + memoryUsage: float64(126), }, { createSQL: "binding for select * from t union all select * from t using select * from t use index(index_t) union all select * from t use index()", overlaySQL: "", querySQL: "select * from t union all select * from t", - originSQL: "select * from t union all select * from t", - bindSQL: "select * from t use index(index_t) union all select * from t use index()", + originSQL: "select * from `test` . `t` union all select * from `test` . `t`", + bindSQL: "SELECT * FROM `test`.`t` USE INDEX (`index_t`) UNION ALL SELECT * FROM `test`.`t` USE INDEX ()", dropSQL: "binding for select * from t union all select * from t", - memoryUsage: float64(138), + memoryUsage: float64(182), }, { createSQL: "binding for (select * from t) union all (select * from t) using (select * from t use index(index_t)) union all (select * from t use index())", overlaySQL: "", querySQL: "(select * from t) union all (select * from t)", - originSQL: "( select * from t ) union all ( select * from t )", - bindSQL: "(select * from t use index(index_t)) union all (select * from t use index())", + originSQL: "( select * from `test` . `t` ) union all ( select * from `test` . `t` )", + bindSQL: "(SELECT * FROM `test`.`t` USE INDEX (`index_t`)) UNION ALL (SELECT * FROM `test`.`t` USE INDEX ())", dropSQL: "binding for (select * from t) union all (select * from t)", - memoryUsage: float64(150), + memoryUsage: float64(194), }, { createSQL: "binding for select * from t intersect select * from t using select * from t use index(index_t) intersect select * from t use index()", overlaySQL: "", querySQL: "select * from t intersect select * from t", - originSQL: "select * from t intersect select * from t", - bindSQL: "select * from t use index(index_t) intersect select * from t use index()", + originSQL: "select * from `test` . `t` intersect select * from `test` . `t`", + bindSQL: "SELECT * FROM `test`.`t` USE INDEX (`index_t`) INTERSECT SELECT * FROM `test`.`t` USE INDEX ()", dropSQL: "binding for select * from t intersect select * from t", - memoryUsage: float64(138), + memoryUsage: float64(182), }, { createSQL: "binding for select * from t except select * from t using select * from t use index(index_t) except select * from t use index()", overlaySQL: "", querySQL: "select * from t except select * from t", - originSQL: "select * from t except select * from t", - bindSQL: "select * from t use index(index_t) except select * from t use index()", + originSQL: "select * from `test` . `t` except select * from `test` . `t`", + bindSQL: "SELECT * FROM `test`.`t` USE INDEX (`index_t`) EXCEPT SELECT * FROM `test`.`t` USE INDEX ()", dropSQL: "binding for select * from t except select * from t", - memoryUsage: float64(132), + memoryUsage: float64(176), + }, + { + createSQL: "binding for select * from t using select /*+ use_index(t,index_t)*/ * from t", + overlaySQL: "", + querySQL: "select * from t ", + originSQL: "select * from `test` . `t`", + bindSQL: "SELECT /*+ use_index(`t` `index_t`)*/ * FROM `test`.`t`", + dropSQL: "binding for select * from t", + memoryUsage: float64(106), + }, + { + createSQL: "binding for delete from t where i = 1 using delete /*+ use_index(t,index_t) */ from t where i = 1", + overlaySQL: "", + querySQL: "delete from t where i = 2", + originSQL: "delete from `test` . `t` where `i` = ?", + bindSQL: "DELETE /*+ use_index(`t` `index_t`)*/ FROM `test`.`t` WHERE `i` = 1", + dropSQL: "binding for delete from t where i = 1", + memoryUsage: float64(130), + }, + { + createSQL: "binding for delete t, t1 from t inner join t1 on t.s = t1.s where t.i = 1 using delete /*+ use_index(t,index_t), hash_join(t,t1) */ t, t1 from t inner join t1 on t.s = t1.s where t.i = 1", + overlaySQL: "", + querySQL: "delete t, t1 from t inner join t1 on t.s = t1.s where t.i = 2", + originSQL: "delete `test` . `t` , `test` . `t1` from `test` . `t` join `test` . `t1` on `t` . `s` = `t1` . `s` where `t` . `i` = ?", + bindSQL: "DELETE /*+ use_index(`t` `index_t`) hash_join(`t`, `t1`)*/ `test`.`t`,`test`.`t1` FROM `test`.`t` JOIN `test`.`t1` ON `t`.`s` = `t1`.`s` WHERE `t`.`i` = 1", + dropSQL: "binding for delete t, t1 from t inner join t1 on t.s = t1.s where t.i = 1", + memoryUsage: float64(297), + }, + { + createSQL: "binding for update t set s = 'a' where i = 1 using update /*+ use_index(t,index_t) */ t set s = 'a' where i = 1", + overlaySQL: "", + querySQL: "update t set s='b' where i=2", + originSQL: "update `test` . `t` set `s` = ? where `i` = ?", + bindSQL: "UPDATE /*+ use_index(`t` `index_t`)*/ `test`.`t` SET `s`='a' WHERE `i` = 1", + dropSQL: "binding for update t set s = 'a' where i = 1", + memoryUsage: float64(144), + }, + { + createSQL: "binding for update t, t1 set t.s = 'a' where t.i = t1.i using update /*+ inl_join(t1) */ t, t1 set t.s = 'a' where t.i = t1.i", + overlaySQL: "", + querySQL: "update t , t1 set t.s='b' where t.i=t1.i", + originSQL: "update ( `test` . `t` ) join `test` . `t1` set `t` . `s` = ? where `t` . `i` = `t1` . `i`", + bindSQL: "UPDATE /*+ inl_join(`t1`)*/ (`test`.`t`) JOIN `test`.`t1` SET `t`.`s`='a' WHERE `t`.`i` = `t1`.`i`", + dropSQL: "binding for update t, t1 set t.s = 'a' where t.i = t1.i", + memoryUsage: float64(212), + }, + { + createSQL: "binding for insert into t1 select * from t where t.i = 1 using insert into t1 select /*+ use_index(t,index_t) */ * from t where t.i = 1", + overlaySQL: "", + querySQL: "insert into t1 select * from t where t.i = 2", + originSQL: "insert into `test` . `t1` select * from `test` . `t` where `t` . `i` = ?", + bindSQL: "INSERT INTO `test`.`t1` SELECT /*+ use_index(`t` `index_t`)*/ * FROM `test`.`t` WHERE `t`.`i` = 1", + dropSQL: "binding for insert into t1 select * from t where t.i = 1", + memoryUsage: float64(194), + }, + { + createSQL: "binding for replace into t1 select * from t where t.i = 1 using replace into t1 select /*+ use_index(t,index_t) */ * from t where t.i = 1", + overlaySQL: "", + querySQL: "replace into t1 select * from t where t.i = 2", + originSQL: "replace into `test` . `t1` select * from `test` . `t` where `t` . `i` = ?", + bindSQL: "REPLACE INTO `test`.`t1` SELECT /*+ use_index(`t` `index_t`)*/ * FROM `test`.`t` WHERE `t`.`i` = 1", + dropSQL: "binding for replace into t1 select * from t where t.i = 1", + memoryUsage: float64(196), }, } @@ -245,12 +378,14 @@ func (s *testSuite) TestGlobalBinding(c *C) { } pb := &dto.Metric{} - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) - sql, hash := parser.NormalizeDigest(testSQL.querySQL) + sql, hash := normalizeWithDefaultDB(c, testSQL.querySQL, "test") bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) @@ -302,9 +437,11 @@ func (s *testSuite) TestGlobalBinding(c *C) { bindData = s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, IsNil) - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeGlobal, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) // From newly created global bind handle. c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) @@ -352,9 +489,11 @@ func (s *testSuite) TestSessionBinding(c *C) { } pb := &dto.Metric{} - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, float64(1)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, testSQL.memoryUsage) handle := tk.Se.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) @@ -400,9 +539,11 @@ func (s *testSuite) TestSessionBinding(c *C) { c.Check(bindData.OriginalSQL, Equals, testSQL.originSQL) c.Check(len(bindData.Bindings), Equals, 0) - metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + err = metrics.BindTotalGauge.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) - metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + err = metrics.BindMemoryUsage.WithLabelValues(metrics.ScopeSession, bindinfo.Using).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetGauge().GetValue(), Equals, float64(0)) } } @@ -424,7 +565,8 @@ func (s *testSuite) TestGlobalAndSessionBindingBothExist(c *C) { metrics.BindUsageCounter.Reset() c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue) pb := &dto.Metric{} - metrics.BindUsageCounter.WithLabelValues(metrics.ScopeGlobal).Write(pb) + err := metrics.BindUsageCounter.WithLabelValues(metrics.ScopeGlobal).Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetCounter().GetValue(), Equals, float64(1)) // Test 'tidb_use_plan_baselines' @@ -507,13 +649,13 @@ func (s *testSuite) TestBindingSymbolList(c *C) { c.Assert(tk.MustUseIndex("select a, b from t where a = 3 limit 1, 100", "ib(b)"), IsTrue) // Normalize - sql, hash := parser.NormalizeDigest("select a, b from t where a = 1 limit 0, 1") + sql, hash := parser.NormalizeDigest("select a, b from test . t where a = 1 limit 0, 1") bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Assert(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select a , b from t where a = ? limit ...") + c.Check(bindData.OriginalSQL, Equals, "select `a` , `b` from `test` . `t` where `a` = ? limit ...") bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select a, b from t use index (ib) where a = 1 limit 0, 1") + c.Check(bind.BindSQL, Equals, "SELECT `a`,`b` FROM `test`.`t` USE INDEX (`ib`) WHERE `a` = 1 LIMIT 0,1") c.Check(bindData.Db, Equals, "test") c.Check(bind.Status, Equals, "using") c.Check(bind.Charset, NotNil) @@ -522,6 +664,60 @@ func (s *testSuite) TestBindingSymbolList(c *C) { c.Check(bind.UpdateTime, NotNil) } +func (s *testSuite) TestDMLSQLBind(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c int, key idx_b(b), key idx_c(c))") + tk.MustExec("create table t2(a int, b int, c int, key idx_b(b), key idx_c(c))") + + tk.MustExec("delete from t1 where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t1:idx_b") + c.Assert(tk.MustUseIndex("delete from t1 where b = 1 and c > 1", "idx_b(b)"), IsTrue) + tk.MustExec("create global binding for delete from t1 where b = 1 and c > 1 using delete /*+ use_index(t1,idx_c) */ from t1 where b = 1 and c > 1") + tk.MustExec("delete from t1 where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t1:idx_c") + c.Assert(tk.MustUseIndex("delete from t1 where b = 1 and c > 1", "idx_c(c)"), IsTrue) + + c.Assert(tk.HasPlan("delete t1, t2 from t1 inner join t2 on t1.b = t2.b", "HashJoin"), IsTrue) + tk.MustExec("create global binding for delete t1, t2 from t1 inner join t2 on t1.b = t2.b using delete /*+ inl_join(t1) */ t1, t2 from t1 inner join t2 on t1.b = t2.b") + c.Assert(tk.HasPlan("delete t1, t2 from t1 inner join t2 on t1.b = t2.b", "IndexJoin"), IsTrue) + + tk.MustExec("update t1 set a = 1 where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t1:idx_b") + c.Assert(tk.MustUseIndex("update t1 set a = 1 where b = 1 and c > 1", "idx_b(b)"), IsTrue) + tk.MustExec("create global binding for update t1 set a = 1 where b = 1 and c > 1 using update /*+ use_index(t1,idx_c) */ t1 set a = 1 where b = 1 and c > 1") + tk.MustExec("delete from t1 where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t1:idx_c") + c.Assert(tk.MustUseIndex("update t1 set a = 1 where b = 1 and c > 1", "idx_c(c)"), IsTrue) + + c.Assert(tk.HasPlan("update t1, t2 set t1.a = 1 where t1.b = t2.b", "HashJoin"), IsTrue) + tk.MustExec("create global binding for update t1, t2 set t1.a = 1 where t1.b = t2.b using update /*+ inl_join(t1) */ t1, t2 set t1.a = 1 where t1.b = t2.b") + c.Assert(tk.HasPlan("update t1, t2 set t1.a = 1 where t1.b = t2.b", "IndexJoin"), IsTrue) + + tk.MustExec("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t2:idx_b") + c.Assert(tk.MustUseIndex("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2", "idx_b(b)"), IsTrue) + tk.MustExec("create global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert /*+ use_index(t2,idx_c) */ into t1 select * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t2:idx_b") + c.Assert(tk.MustUseIndex("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2", "idx_b(b)"), IsTrue) + tk.MustExec("drop global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("create global binding for insert into t1 select * from t2 where t2.b = 1 and t2.c > 1 using insert into t1 select /*+ use_index(t2,idx_c) */ * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t2:idx_c") + c.Assert(tk.MustUseIndex("insert into t1 select * from t2 where t2.b = 2 and t2.c > 2", "idx_c(c)"), IsTrue) + + tk.MustExec("replace into t1 select * from t2 where t2.b = 2 and t2.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t2:idx_b") + c.Assert(tk.MustUseIndex("replace into t1 select * from t2 where t2.b = 2 and t2.c > 2", "idx_b(b)"), IsTrue) + tk.MustExec("create global binding for replace into t1 select * from t2 where t2.b = 1 and t2.c > 1 using replace into t1 select /*+ use_index(t2,idx_c) */ * from t2 where t2.b = 1 and t2.c > 1") + tk.MustExec("replace into t1 select * from t2 where t2.b = 2 and t2.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t2:idx_c") + c.Assert(tk.MustUseIndex("replace into t1 select * from t2 where t2.b = 2 and t2.c > 2", "idx_c(c)"), IsTrue) +} + func (s *testSuite) TestBestPlanInBaselines(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) @@ -539,15 +735,15 @@ func (s *testSuite) TestBestPlanInBaselines(c *C) { c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:ib") c.Assert(tk.MustUseIndex("select a, b from t where b = 3 limit 1, 100", "ib(b)"), IsTrue) - tk.MustExec(`create global binding for select a, b from t where a = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t, ia) */ a, b from t where a = 1 limit 0, 1`) - tk.MustExec(`create global binding for select a, b from t where b = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t, ib) */ a, b from t where b = 1 limit 0, 1`) + tk.MustExec(`create global binding for select a, b from t where a = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t ia) */ a, b from t where a = 1 limit 0, 1`) + tk.MustExec(`create global binding for select a, b from t where b = 1 limit 0, 1 using select /*+ use_index(@sel_1 test.t ib) */ a, b from t where b = 1 limit 0, 1`) - sql, hash := parser.NormalizeDigest("select a, b from t where a = 1 limit 0, 1") + sql, hash := normalizeWithDefaultDB(c, "select a, b from t where a = 1 limit 0, 1", "test") bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select a , b from t where a = ? limit ...") + c.Check(bindData.OriginalSQL, Equals, "select `a` , `b` from `test` . `t` where `a` = ? limit ...") bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select /*+ use_index(@sel_1 test.t, ia) */ a, b from t where a = 1 limit 0, 1") + c.Check(bind.BindSQL, Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `ia`)*/ `a`,`b` FROM `test`.`t` WHERE `a` = 1 LIMIT 0,1") c.Check(bindData.Db, Equals, "test") c.Check(bind.Status, Equals, "using") @@ -574,12 +770,12 @@ func (s *testSuite) TestErrorBind(c *C) { _, err := tk.Exec("create global binding for select * from t where i>100 using select * from t use index(index_t) where i>100") c.Assert(err, IsNil, Commentf("err %v", err)) - sql, hash := parser.NormalizeDigest("select * from t where i > ?") + sql, hash := parser.NormalizeDigest("select * from test . t where i > ?") bindData := s.domain.BindHandle().GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where i > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `i` > ?") bind := bindData.Bindings[0] - c.Check(bind.BindSQL, Equals, "select * from t use index(index_t) where i>100") + c.Check(bind.BindSQL, Equals, "SELECT * FROM `test`.`t` USE INDEX (`index_t`) WHERE `i` > 100") c.Check(bindData.Db, Equals, "test") c.Check(bind.Status, Equals, "using") c.Check(bind.Charset, NotNil) @@ -604,6 +800,13 @@ func (s *testSuite) TestErrorBind(c *C) { func (s *testSuite) TestPreparedStmt(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) + + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(false) // requires plan cache disabled, or the IndexNames = 1 on first test. + tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int, index idx(a))") @@ -619,6 +822,104 @@ func (s *testSuite) TestPreparedStmt(c *C) { tk.MustExec("drop binding for select * from t") tk.MustExec("execute stmt1") c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 0) + + tk.MustExec("drop table t") + tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c(c))") + tk.MustExec("set @p = 1") + + tk.MustExec("prepare stmt from 'delete from t where b = ? and c > ?'") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_b") + tk.MustExec("create binding for delete from t where b = 2 and c > 2 using delete /*+ use_index(t,idx_c) */ from t where b = 2 and c > 2") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + + tk.MustExec("prepare stmt from 'update t set a = 1 where b = ? and c > ?'") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_b") + tk.MustExec("create binding for update t set a = 2 where b = 2 and c > 2 using update /*+ use_index(t,idx_c) */ t set a = 2 where b = 2 and c > 2") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 like t") + tk.MustExec("prepare stmt from 'insert into t1 select * from t where t.b = ? and t.c > ?'") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_b") + tk.MustExec("create binding for insert into t1 select * from t where t.b = 2 and t.c > 2 using insert into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 2 and t.c > 2") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + + tk.MustExec("prepare stmt from 'replace into t1 select * from t where t.b = ? and t.c > ?'") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_b") + tk.MustExec("create binding for replace into t1 select * from t where t.b = 2 and t.c > 2 using replace into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 2 and t.c > 2") + tk.MustExec("execute stmt using @p,@p") + c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") +} + +func (s *testSuite) TestDMLCapturePlanBaseline(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + tk.MustExec(" set @@tidb_capture_plan_baselines = on") + defer func() { + tk.MustExec(" set @@tidb_capture_plan_baselines = off") + }() + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, key idx_b(b), key idx_c(c))") + tk.MustExec("create table t1 like t") + s.domain.BindHandle().CaptureBaselines() + tk.MustQuery("show global bindings").Check(testkit.Rows()) + tk.MustExec("delete from t where b = 1 and c > 1") + tk.MustExec("delete from t where b = 1 and c > 1") + tk.MustExec("update t set a = 1 where b = 1 and c > 1") + tk.MustExec("update t set a = 1 where b = 1 and c > 1") + tk.MustExec("insert into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("insert into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("replace into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("replace into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("insert into t1 values(1,1,1)") + tk.MustExec("insert into t1 values(1,1,1)") + tk.MustExec("replace into t1 values(1,1,1)") + tk.MustExec("replace into t1 values(1,1,1)") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 0) + + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("delete from t where b = 1 and c > 1") + tk.MustExec("delete from t where b = 1 and c > 1") + tk.MustExec("update t set a = 1 where b = 1 and c > 1") + tk.MustExec("update t set a = 1 where b = 1 and c > 1") + tk.MustExec("insert into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("insert into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("replace into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("replace into t1 select * from t where t.b = 1 and t.c > 1") + tk.MustExec("insert into t1 values(1,1,1)") + tk.MustExec("insert into t1 values(1,1,1)") + tk.MustExec("replace into t1 values(1,1,1)") + tk.MustExec("replace into t1 values(1,1,1)") + tk.MustExec("admin capture bindings") + rows = tk.MustQuery("show global bindings").Sort().Rows() + c.Assert(len(rows), Equals, 4) + c.Assert(rows[0][0], Equals, "delete from `test` . `t` where `b` = ? and `c` > ?") + c.Assert(rows[0][1], Equals, "DELETE /*+ use_index(@`del_1` `test`.`t` `idx_b`)*/ FROM `test`.`t` WHERE `b` = 1 AND `c` > 1") + c.Assert(rows[1][0], Equals, "insert into `test` . `t1` select * from `test` . `t` where `t` . `b` = ? and `t` . `c` > ?") + c.Assert(rows[1][1], Equals, "INSERT INTO `test`.`t1` SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_b`)*/ * FROM `test`.`t` WHERE `t`.`b` = 1 AND `t`.`c` > 1") + c.Assert(rows[2][0], Equals, "replace into `test` . `t1` select * from `test` . `t` where `t` . `b` = ? and `t` . `c` > ?") + c.Assert(rows[2][1], Equals, "REPLACE INTO `test`.`t1` SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_b`)*/ * FROM `test`.`t` WHERE `t`.`b` = 1 AND `t`.`c` > 1") + c.Assert(rows[3][0], Equals, "update `test` . `t` set `a` = ? where `b` = ? and `c` > ?") + c.Assert(rows[3][1], Equals, "UPDATE /*+ use_index(@`upd_1` `test`.`t` `idx_b`)*/ `test`.`t` SET `a`=1 WHERE `b` = 1 AND `c` > 1") } func (s *testSuite) TestCapturePlanBaseline(c *C) { @@ -630,7 +931,7 @@ func (s *testSuite) TestCapturePlanBaseline(c *C) { tk.MustExec(" set @@tidb_capture_plan_baselines = off") }() tk.MustExec("use test") - tk.MustExec("drop table if exists t, t1") + tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") s.domain.BindHandle().CaptureBaselines() tk.MustQuery("show global bindings").Check(testkit.Rows()) @@ -646,8 +947,115 @@ func (s *testSuite) TestCapturePlanBaseline(c *C) { tk.MustExec("admin capture bindings") rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][0], Equals, "select * from t where a > ?") - c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `t` WHERE `a`>10") + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `a` > ?") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` > 10") +} + +func (s *testSuite) TestCaptureDBCaseSensitivity(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + tk.MustExec("drop database if exists SPM") + tk.MustExec("create database SPM") + tk.MustExec("use SPM") + tk.MustExec("create table t(a int, b int, key(b))") + tk.MustExec("create global binding for select * from t using select /*+ use_index(t) */ * from t") + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("select /*+ use_index(t,b) */ * from t") + tk.MustExec("select /*+ use_index(t,b) */ * from t") + tk.MustExec("admin capture bindings") + // The capture should ignore the case sensitivity for DB name when checking if any binding exists, + // so there would be no new binding captured. + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(`t` )*/ * FROM `SPM`.`t`") + c.Assert(rows[0][8], Equals, "manual") +} + +func (s *testSuite) TestBaselineDBLowerCase(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + tk.MustExec("drop database if exists SPM") + tk.MustExec("create database SPM") + tk.MustExec("use SPM") + tk.MustExec("create table t(a int, b int)") + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("update t set a = a + 1") + tk.MustExec("update t set a = a + 1") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "update `spm` . `t` set `a` = `a` + ?") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustExec("drop global binding for update t set a = a + 1") + rows = tk.MustQuery("show global bindings").Rows() + // DROP GLOBAL BINGING should remove the binding even if we are in SPM database. + c.Assert(len(rows), Equals, 0) + + tk.MustExec("create global binding for select * from t using select * from t") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `spm` . `t`") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustExec("drop global binding for select * from t") + rows = tk.MustQuery("show global bindings").Rows() + // DROP GLOBAL BINGING should remove the binding even if we are in SPM database. + c.Assert(len(rows), Equals, 0) + + tk.MustExec("create session binding for select * from t using select * from t") + rows = tk.MustQuery("show session bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `spm` . `t`") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustExec("drop session binding for select * from t") + rows = tk.MustQuery("show session bindings").Rows() + // DROP SESSION BINGING should remove the binding even if we are in SPM database. + c.Assert(len(rows), Equals, 0) + + s.cleanBindingEnv(tk) + // Simulate existing bindings with upper case default_db. + tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'using', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + + bindinfo.Manual + "')") + tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( + "select * from `spm` . `t` SPM", + )) + tk.MustExec("admin reload bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `spm` . `t`") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustExec("drop global binding for select * from t") + rows = tk.MustQuery("show global bindings").Rows() + // DROP GLOBAL BINGING should remove the binding even if we are in SPM database. + c.Assert(len(rows), Equals, 0) + + s.cleanBindingEnv(tk) + // Simulate existing bindings with upper case default_db. + tk.MustExec("insert into mysql.bind_info values('select * from `spm` . `t`', 'select * from `spm` . `t`', 'SPM', 'using', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + + bindinfo.Manual + "')") + tk.MustQuery("select original_sql, default_db from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( + "select * from `spm` . `t` SPM", + )) + tk.MustExec("admin reload bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `spm` . `t`") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustExec("create global binding for select * from t using select * from t") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `spm` . `t`") + // default_db should have lower case. + c.Assert(rows[0][2], Equals, "spm") + tk.MustQuery("select original_sql, default_db, status from mysql.bind_info where original_sql = 'select * from `spm` . `t`'").Check(testkit.Rows( + "select * from `spm` . `t` spm using", + )) } func (s *testSuite) TestCaptureBaselinesDefaultDB(c *C) { @@ -677,6 +1085,36 @@ func (s *testSuite) TestCaptureBaselinesDefaultDB(c *C) { c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 0) } +func (s *testSuite) TestCapturePreparedStmt(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, key idx_b(b), key idx_c(c))") + c.Assert(tk.MustUseIndex("select * from t where b = 1 and c > 1", "idx_b(b)"), IsTrue) + tk.MustExec("prepare stmt from 'select /*+ use_index(t,idx_c) */ * from t where b = ? and c > ?'") + tk.MustExec("set @p = 1") + tk.MustExec("execute stmt using @p, @p") + tk.MustExec("execute stmt using @p, @p") + + tk.MustQuery("show global bindings").Check(testkit.Rows()) + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `b` = ? and `c` > ?") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`)*/ * FROM `test`.`t` WHERE `b` = ? AND `c` > ?") + + c.Assert(tk.MustUseIndex("select /*+ use_index(t,idx_b) */ * from t where b = 1 and c > 1", "idx_c(c)"), IsTrue) + tk.MustExec("admin flush bindings") + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `b` = ? and `c` > ?") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`)*/ * FROM `test`.`t` WHERE `b` = ? AND `c` > ?") +} + func (s *testSuite) TestDropSingleBindings(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) @@ -691,11 +1129,11 @@ func (s *testSuite) TestDropSingleBindings(c *C) { // The size of bindings is equal to one. Because for one normalized sql, // the `create binding` clears all the origin bindings. c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][1], Equals, "select * from t use index(idx_b)") + c.Assert(rows[0][1], Equals, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)") tk.MustExec("drop binding for select * from t using select * from t use index(idx_a)") rows = tk.MustQuery("show bindings").Rows() c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][1], Equals, "select * from t use index(idx_b)") + c.Assert(rows[0][1], Equals, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)") tk.MustExec("drop table t") tk.MustExec("drop binding for select * from t using select * from t use index(idx_b)") rows = tk.MustQuery("show bindings").Rows() @@ -709,17 +1147,77 @@ func (s *testSuite) TestDropSingleBindings(c *C) { // The size of bindings is equal to one. Because for one normalized sql, // the `create binding` clears all the origin bindings. c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][1], Equals, "select * from t use index(idx_b)") + c.Assert(rows[0][1], Equals, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)") tk.MustExec("drop global binding for select * from t using select * from t use index(idx_a)") rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][1], Equals, "select * from t use index(idx_b)") + c.Assert(rows[0][1], Equals, "SELECT * FROM `test`.`t` USE INDEX (`idx_b`)") tk.MustExec("drop table t") tk.MustExec("drop global binding for select * from t using select * from t use index(idx_b)") rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 0) } +func (s *testSuite) TestDMLEvolveBaselines(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c(c))") + tk.MustExec("insert into t values (1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5)") + tk.MustExec("analyze table t") + tk.MustExec("set @@tidb_evolve_plan_baselines=1") + + tk.MustExec("create global binding for delete from t where b = 1 and c > 1 using delete /*+ use_index(t,idx_c) */ from t where b = 1 and c > 1") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + tk.MustExec("delete /*+ use_index(t,idx_b) */ from t where b = 2 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + tk.MustExec("admin flush bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + + tk.MustExec("create global binding for update t set a = 1 where b = 1 and c > 1 using update /*+ use_index(t,idx_c) */ t set a = 1 where b = 1 and c > 1") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 2) + tk.MustExec("update /*+ use_index(t,idx_b) */ t set a = 2 where b = 2 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + tk.MustExec("admin flush bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 2) + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 2) + + tk.MustExec("create table t1 like t") + tk.MustExec("create global binding for insert into t1 select * from t where t.b = 1 and t.c > 1 using insert into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 1 and t.c > 1") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 3) + tk.MustExec("insert into t1 select /*+ use_index(t,idx_b) */ * from t where t.b = 2 and t.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + tk.MustExec("admin flush bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 3) + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 3) + + tk.MustExec("create global binding for replace into t1 select * from t where t.b = 1 and t.c > 1 using replace into t1 select /*+ use_index(t,idx_c) */ * from t where t.b = 1 and t.c > 1") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 4) + tk.MustExec("replace into t1 select /*+ use_index(t,idx_b) */ * from t where t.b = 2 and t.c > 2") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + tk.MustExec("admin flush bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 4) + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 4) +} + func (s *testSuite) TestAddEvolveTasks(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) @@ -736,12 +1234,12 @@ func (s *testSuite) TestAddEvolveTasks(c *C) { tk.MustExec("admin flush bindings") rows := tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 2) - c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a`>=4 AND `b`>=1 AND `c`=0") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0") c.Assert(rows[1][3], Equals, "pending verify") tk.MustExec("admin evolve bindings") rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 2) - c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a`>=4 AND `b`>=1 AND `c`=0") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0") status := rows[1][3].(string) c.Assert(status == "using" || status == "rejected", IsTrue) } @@ -760,7 +1258,7 @@ func (s *testSuite) TestRuntimeHintsInEvolveTasks(c *C) { tk.MustExec("admin flush bindings") rows := tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 2) - c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`)*/ * FROM `test`.`t` WHERE `a`>=4 AND `b`>=1 AND `c`=0") // MAX_EXECUTION_TIME is ignored + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`)*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0") // MAX_EXECUTION_TIME is ignored s.cleanBindingEnv(tk) tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 and c = 0 using select /*+ MAX_EXECUTION_TIME(5000) */* from t use index(idx_a) where a >= 1 and b >= 1 and c = 0") @@ -768,7 +1266,7 @@ func (s *testSuite) TestRuntimeHintsInEvolveTasks(c *C) { tk.MustExec("admin flush bindings") rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 2) - c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`), max_execution_time(5000)*/ * FROM `test`.`t` WHERE `a`>=4 AND `b`>=1 AND `c`=0") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idx_c`), max_execution_time(5000)*/ * FROM `test`.`t` WHERE `a` >= 4 AND `b` >= 1 AND `c` = 0") } func (s *testSuite) TestBindingCache(c *C) { @@ -797,13 +1295,13 @@ func (s *testSuite) TestDefaultSessionVars(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) tk.MustQuery(`show variables like "%baselines%"`).Sort().Check(testkit.Rows( - "tidb_capture_plan_baselines off", - "tidb_evolve_plan_baselines off", - "tidb_use_plan_baselines on")) + "tidb_capture_plan_baselines OFF", + "tidb_evolve_plan_baselines OFF", + "tidb_use_plan_baselines ON")) tk.MustQuery(`show global variables like "%baselines%"`).Sort().Check(testkit.Rows( - "tidb_capture_plan_baselines off", - "tidb_evolve_plan_baselines off", - "tidb_use_plan_baselines on")) + "tidb_capture_plan_baselines OFF", + "tidb_evolve_plan_baselines OFF", + "tidb_use_plan_baselines ON")) } func (s *testSuite) TestCaptureBaselinesScope(c *C) { @@ -811,16 +1309,16 @@ func (s *testSuite) TestCaptureBaselinesScope(c *C) { tk2 := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk1) tk1.MustQuery(`show session variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines off", + "tidb_capture_plan_baselines OFF", )) tk1.MustQuery(`show global variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines off", + "tidb_capture_plan_baselines OFF", )) tk1.MustQuery(`select @@session.tidb_capture_plan_baselines`).Check(testkit.Rows( - "off", + "0", )) tk1.MustQuery(`select @@global.tidb_capture_plan_baselines`).Check(testkit.Rows( - "off", + "0", )) tk1.MustExec("set @@session.tidb_capture_plan_baselines = on") @@ -828,28 +1326,28 @@ func (s *testSuite) TestCaptureBaselinesScope(c *C) { tk1.MustExec(" set @@session.tidb_capture_plan_baselines = off") }() tk1.MustQuery(`show session variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines on", + "tidb_capture_plan_baselines ON", )) tk1.MustQuery(`show global variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines off", + "tidb_capture_plan_baselines OFF", )) tk1.MustQuery(`select @@session.tidb_capture_plan_baselines`).Check(testkit.Rows( - "on", + "1", )) tk1.MustQuery(`select @@global.tidb_capture_plan_baselines`).Check(testkit.Rows( - "off", + "0", )) tk2.MustQuery(`show session variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines on", + "tidb_capture_plan_baselines ON", )) tk2.MustQuery(`show global variables like "tidb_capture_plan_baselines"`).Check(testkit.Rows( - "tidb_capture_plan_baselines off", + "tidb_capture_plan_baselines OFF", )) tk2.MustQuery(`select @@session.tidb_capture_plan_baselines`).Check(testkit.Rows( - "on", + "1", )) tk2.MustQuery(`select @@global.tidb_capture_plan_baselines`).Check(testkit.Rows( - "off", + "0", )) } @@ -949,11 +1447,11 @@ func (s *testSuite) TestEvolveInvalidBindings(c *C) { tk.MustExec("create table t(a int, b int, index idx_a(a))") tk.MustExec("create global binding for select * from t where a > 10 using select /*+ USE_INDEX(t) */ * from t where a > 10") // Manufacture a rejected binding by hacking mysql.bind_info. - tk.MustExec("insert into mysql.bind_info values('select * from t where a > ?', 'select /*+ USE_INDEX(t,idx_a) */ * from t where a > 10', 'test', 'rejected', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + + tk.MustExec("insert into mysql.bind_info values('select * from test . t where a > ?', 'SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10', 'test', 'rejected', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + bindinfo.Manual + "')") - tk.MustQuery("select bind_sql, status from mysql.bind_info").Sort().Check(testkit.Rows( - "select /*+ USE_INDEX(t) */ * from t where a > 10 using", - "select /*+ USE_INDEX(t,idx_a) */ * from t where a > 10 rejected", + tk.MustQuery("select bind_sql, status from mysql.bind_info where source != 'builtin'").Sort().Check(testkit.Rows( + "SELECT /*+ USE_INDEX(`t` )*/ * FROM `test`.`t` WHERE `a` > 10 using", + "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10 rejected", )) // Reload cache from mysql.bind_info. s.domain.BindHandle().Clear() @@ -965,10 +1463,10 @@ func (s *testSuite) TestEvolveInvalidBindings(c *C) { rows := tk.MustQuery("show global bindings").Sort().Rows() c.Assert(len(rows), Equals, 2) // Make sure this "using" binding is not overrided. - c.Assert(rows[0][1], Equals, "select /*+ USE_INDEX(t) */ * from t where a > 10") + c.Assert(rows[0][1], Equals, "SELECT /*+ USE_INDEX(`t` )*/ * FROM `test`.`t` WHERE `a` > 10") status := rows[0][3].(string) c.Assert(status == "using", IsTrue) - c.Assert(rows[1][1], Equals, "select /*+ USE_INDEX(t,idx_a) */ * from t where a > 10") + c.Assert(rows[1][1], Equals, "SELECT /*+ USE_INDEX(t,idx_a) */ * FROM test.t WHERE a > 10") status = rows[1][3].(string) c.Assert(status == "using" || status == "rejected", IsTrue) } @@ -1013,10 +1511,10 @@ func (s *testSuite) TestHintsSetEvolveTask(c *C) { bindHandle := s.domain.BindHandle() bindHandle.SaveEvolveTasksToStore() // Verify the added Binding for evolution contains valid ID and Hint, otherwise, panic may happen. - sql, hash := parser.NormalizeDigest("select * from t where a > ?") + sql, hash := normalizeWithDefaultDB(c, "select * from t where a > ?", "test") bindData := bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 2) bind := bindData.Bindings[1] c.Assert(bind.Status, Equals, bindinfo.PendingVerify) @@ -1033,10 +1531,10 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(test.t, idx_a) */ * from t where a > 10") bindHandle := s.domain.BindHandle() // Verify the added Binding contains ID with restored query block. - sql, hash := parser.NormalizeDigest("select * from t where a > ?") + sql, hash := normalizeWithDefaultDB(c, "select * from t where a > ?", "test") bindData := bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind := bindData.Bindings[0] c.Assert(bind.ID, Equals, "use_index(@`sel_1` `test`.`t` `idx_a`)") @@ -1045,7 +1543,7 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(t, idx_a) */ * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.ID, Equals, "use_index(@`sel_1` `test`.`t` `idx_a`)") @@ -1054,7 +1552,7 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(@sel_1 t, idx_a) */ * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.ID, Equals, "use_index(@`sel_1` `test`.`t` `idx_a`)") @@ -1063,7 +1561,7 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(@qb1 t, idx_a) qb_name(qb1) */ * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.ID, Equals, "use_index(@`sel_1` `test`.`t` `idx_a`)") @@ -1072,7 +1570,7 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select /*+ use_index(T, IDX_A) */ * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.ID, Equals, "use_index(@`sel_1` `test`.`t` `idx_a`)") @@ -1083,7 +1581,7 @@ func (s *testSuite) TestHintsSetID(c *C) { tk.MustExec("create global binding for select * from t where a > 10 using select * from t where a > 10") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.ID, Equals, "") @@ -1121,8 +1619,8 @@ func (s *testSuite) TestCapturePlanBaselineIgnoreTiFlash(c *C) { // Don't have the TiFlash plan even we have TiFlash replica. rows = tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][0], Equals, "select * from t") - c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `t`") + c.Assert(rows[0][0], Equals, "select * from `test` . `t`") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t`") } func (s *testSuite) TestNotEvolvePlanForReadStorageHint(c *C) { @@ -1163,7 +1661,7 @@ func (s *testSuite) TestNotEvolvePlanForReadStorageHint(c *C) { rows = tk.MustQuery("show global bindings").Rows() // None evolve task, because of the origin binding is a read_from_storage binding. c.Assert(len(rows), Equals, 1) - c.Assert(rows[0][1], Equals, "select /*+ read_from_storage(tiflash[t]) */ * from t where a >= 1 and b >= 1") + c.Assert(rows[0][1], Equals, "SELECT /*+ read_from_storage(tiflash[`t`])*/ * FROM `test`.`t` WHERE `a` >= 1 AND `b` >= 1") c.Assert(rows[0][3], Equals, "using") } @@ -1216,7 +1714,7 @@ func (s *testSuite) TestReCreateBindAfterEvolvePlan(c *C) { tk.MustExec("admin flush bindings") rows := tk.MustQuery("show global bindings").Rows() c.Assert(len(rows), Equals, 2) - c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a`>=0 AND `b`>=0") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` )*/ * FROM `test`.`t` WHERE `a` >= 0 AND `b` >= 0") c.Assert(rows[1][3], Equals, "pending verify") tk.MustExec("create global binding for select * from t where a >= 1 and b >= 1 using select * from t use index(idx_b) where a >= 1 and b >= 1") @@ -1259,7 +1757,7 @@ func (s *testSuite) TestInvisibleIndex(c *C) { tk.MustExec("drop binding for select * from t") } -func (s *testSuite) TestbindingSource(c *C) { +func (s *testSuite) TestBindingSource(c *C) { tk := testkit.NewTestKit(c, s.store) s.cleanBindingEnv(tk) tk.MustExec("use test") @@ -1269,10 +1767,10 @@ func (s *testSuite) TestbindingSource(c *C) { // Test Source for SQL created sql tk.MustExec("create global binding for select * from t where a > 10 using select * from t ignore index(idx_a) where a > 10") bindHandle := s.domain.BindHandle() - sql, hash := parser.NormalizeDigest("select * from t where a > ?") + sql, hash := normalizeWithDefaultDB(c, "select * from t where a > ?", "test") bindData := bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 1) bind := bindData.Bindings[0] c.Assert(bind.Source, Equals, bindinfo.Manual) @@ -1281,10 +1779,10 @@ func (s *testSuite) TestbindingSource(c *C) { tk.MustExec("set @@tidb_evolve_plan_baselines=1") tk.MustQuery("select * from t where a > 10") bindHandle.SaveEvolveTasksToStore() - sql, hash = parser.NormalizeDigest("select * from t where a > ?") + sql, hash = normalizeWithDefaultDB(c, "select * from t where a > ?", "test") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a > ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` > ?") c.Assert(len(bindData.Bindings), Equals, 2) bind = bindData.Bindings[1] c.Assert(bind.Source, Equals, bindinfo.Evolve) @@ -1302,11 +1800,295 @@ func (s *testSuite) TestbindingSource(c *C) { tk.MustExec("select * from t ignore index(idx_a) where a < 10") tk.MustExec("admin capture bindings") bindHandle.CaptureBaselines() - sql, hash = parser.NormalizeDigest("select * from t where a < ?") + sql, hash = normalizeWithDefaultDB(c, "select * from t where a < ?", "test") bindData = bindHandle.GetBindRecord(hash, sql, "test") c.Check(bindData, NotNil) - c.Check(bindData.OriginalSQL, Equals, "select * from t where a < ?") + c.Check(bindData.OriginalSQL, Equals, "select * from `test` . `t` where `a` < ?") c.Assert(len(bindData.Bindings), Equals, 1) bind = bindData.Bindings[0] c.Assert(bind.Source, Equals, bindinfo.Capture) } + +func (s *testSuite) TestSPMHitInfo(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t1(id int)") + tk.MustExec("create table t2(id int)") + + c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "HashJoin"), IsTrue) + c.Assert(tk.HasPlan("SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue) + + tk.MustExec("SELECT * from t1,t2 where t1.id = t2.id") + tk.MustQuery(`select @@last_plan_from_binding;`).Check(testkit.Rows("0")) + tk.MustExec("create global binding for SELECT * from t1,t2 where t1.id = t2.id using SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1,t2 where t1.id = t2.id") + + c.Assert(tk.HasPlan("SELECT * from t1,t2 where t1.id = t2.id", "MergeJoin"), IsTrue) + tk.MustExec("SELECT * from t1,t2 where t1.id = t2.id") + tk.MustQuery(`select @@last_plan_from_binding;`).Check(testkit.Rows("1")) + tk.MustExec("drop global binding for SELECT * from t1,t2 where t1.id = t2.id") +} + +func (s *testSuite) TestIssue19836(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, key (a));") + tk.MustExec("CREATE SESSION BINDING FOR select * from t where a = 1 limit 5, 5 USING select * from t ignore index (a) where a = 1 limit 5, 5;") + tk.MustExec("PREPARE stmt FROM 'select * from t where a = 40 limit ?, ?';") + tk.MustExec("set @a=1;") + tk.MustExec("set @b=2;") + tk.MustExec("EXECUTE stmt USING @a, @b;") + tk.Se.SetSessionManager(&mockSessionManager{ + PS: []*util.ProcessInfo{tk.Se.ShowProcess()}, + }) + explainResult := testkit.Rows( + "Limit_8 2.00 0 root time:0s, loops:0 offset:1, count:2 N/A N/A", + "└─TableReader_14 3.00 0 root time:0s, loops:0 data:Limit_13 N/A N/A", + " └─Limit_13 3.00 0 cop[tikv] offset:0, count:3 N/A N/A", + " └─Selection_12 3.00 0 cop[tikv] eq(test.t.a, 40) N/A N/A", + " └─TableFullScan_11 3000.00 0 cop[tikv] table:t keep order:false, stats:pseudo N/A N/A", + ) + tk.MustQuery("explain for connection " + strconv.FormatUint(tk.Se.ShowProcess().ID, 10)).Check(explainResult) +} + +func (s *testSuite) TestReCreateBind(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index idx(a))") + + tk.MustQuery("select * from mysql.bind_info").Check(testkit.Rows()) + tk.MustQuery("show global bindings").Check(testkit.Rows()) + + tk.MustExec("create global binding for select * from t using select * from t") + tk.MustQuery("select original_sql, status from mysql.bind_info").Check(testkit.Rows( + "select * from `test` . `t` using", + )) + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t`") + c.Assert(rows[0][3], Equals, "using") + + tk.MustExec("create global binding for select * from t using select * from t") + tk.MustQuery("select original_sql, status from mysql.bind_info").Check(testkit.Rows( + "select * from `test` . `t` using", + )) + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t`") + c.Assert(rows[0][3], Equals, "using") +} + +func (s *testSuite) TestDMLIndexHintBind(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, c int, key idx_b(b), key idx_c(c))") + + tk.MustExec("delete from t where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_b") + c.Assert(tk.MustUseIndex("delete from t where b = 1 and c > 1", "idx_b(b)"), IsTrue) + tk.MustExec("create global binding for delete from t where b = 1 and c > 1 using delete from t use index(idx_c) where b = 1 and c > 1") + tk.MustExec("delete from t where b = 1 and c > 1") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_c") + c.Assert(tk.MustUseIndex("delete from t where b = 1 and c > 1", "idx_c(c)"), IsTrue) +} + +func (s *testSuite) TestCapturedBindingCharset(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("use test") + tk.MustExec("create table t(name varchar(25), index idx(name))") + + tk.MustExec("set character_set_connection = 'ascii'") + tk.MustExec("update t set name = 'hello' where name <= 'abc'") + tk.MustExec("update t set name = 'hello' where name <= 'abc'") + tk.MustExec("set character_set_connection = 'utf8mb4'") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "update `test` . `t` set `name` = ? where `name` <= ?") + c.Assert(rows[0][1], Equals, "UPDATE /*+ use_index(@`upd_1` `test`.`t` `idx`)*/ `test`.`t` SET `name`='hello' WHERE `name` <= 'abc'") + // Charset and Collation are empty now, they are not used currently. + c.Assert(rows[0][6], Equals, "") + c.Assert(rows[0][7], Equals, "") +} + +func (s *testSuite) TestConcurrentCapture(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + // Simulate an existing binding generated by concurrent CREATE BINDING, which has not been synchronized to current tidb-server yet. + // Actually, it is more common to be generated by concurrent baseline capture, I use Manual just for simpler test verification. + tk.MustExec("insert into mysql.bind_info values('select * from `test` . `t`', 'select * from `test` . `t`', '', 'using', '2000-01-01 09:00:00', '2000-01-01 09:00:00', '', '','" + + bindinfo.Manual + "')") + tk.MustQuery("select original_sql, source from mysql.bind_info where source != 'builtin'").Check(testkit.Rows( + "select * from `test` . `t` manual", + )) + stmtsummary.StmtSummaryByDigestMap.Clear() + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("select * from t") + tk.MustExec("select * from t") + tk.MustExec("admin capture bindings") + tk.MustQuery("select original_sql, source from mysql.bind_info where source != 'builtin'").Check(testkit.Rows( + "select * from `test` . `t` capture", + )) +} + +func (s *testSuite) TestUpdateSubqueryCapture(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c int, key idx_b(b))") + tk.MustExec("create table t2(a int, b int)") + stmtsummary.StmtSummaryByDigestMap.Clear() + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("update t1 set b = 1 where b = 2 and (a in (select a from t2 where b = 1) or c in (select a from t2 where b = 1))") + tk.MustExec("update t1 set b = 1 where b = 2 and (a in (select a from t2 where b = 1) or c in (select a from t2 where b = 1))") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + bindSQL := "UPDATE /*+ use_index(@`upd_1` `test`.`t1` `idx_b`), use_index(@`sel_1` `test`.`t2` ), hash_join(@`upd_1` `test`.`t1`), use_index(@`sel_2` `test`.`t2` )*/ `test`.`t1` SET `b`=1 WHERE `b` = 2 AND (`a` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1) OR `c` IN (SELECT `a` FROM `test`.`t2` WHERE `b` = 1))" + c.Assert(rows[0][1], Equals, bindSQL) + tk.MustExec(bindSQL) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) +} + +func (s *testSuite) TestIssue20417(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`CREATE TABLE t ( + pk VARBINARY(36) NOT NULL PRIMARY KEY, + b BIGINT NOT NULL, + c BIGINT NOT NULL, + pad VARBINARY(2048), + INDEX idxb(b), + INDEX idxc(c) + )`) + + // Test for create binding + s.cleanBindingEnv(tk) + tk.MustExec("create global binding for select * from t using select /*+ use_index(t, idxb) */ * from t") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t`") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(`t` `idxb`)*/ * FROM `test`.`t`") + c.Assert(tk.MustUseIndex("select * from t", "idxb(b)"), IsTrue) + c.Assert(tk.MustUseIndex("select * from test.t", "idxb(b)"), IsTrue) + + tk.MustExec("create global binding for select * from t WHERE b=2 AND c=3924541 using select /*+ use_index(@sel_1 test.t idxb) */ * from t WHERE b=2 AND c=3924541") + c.Assert(tk.MustUseIndex("SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`)*/ * FROM `test`.`t` WHERE `b`=2 AND `c`=3924541", "idxb(b)"), IsTrue) + c.Assert(tk.MustUseIndex("SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`)*/ * FROM `t` WHERE `b`=2 AND `c`=3924541", "idxb(b)"), IsTrue) + + // Test for capture baseline + s.cleanBindingEnv(tk) + stmtsummary.StmtSummaryByDigestMap.Clear() + tk.MustExec("set @@tidb_capture_plan_baselines = on") + s.domain.BindHandle().CaptureBaselines() + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("select * from t where b=2 and c=213124") + tk.MustExec("select * from t where b=2 and c=213124") + tk.MustExec("admin capture bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `b` = ? and `c` = ?") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxb`)*/ * FROM `test`.`t` WHERE `b` = 2 AND `c` = 213124") + tk.MustExec("set @@tidb_capture_plan_baselines = off") + + // Test for evolve baseline + s.cleanBindingEnv(tk) + tk.MustExec("set @@tidb_evolve_plan_baselines=1") + tk.MustExec("create global binding for select * from t WHERE c=3924541 using select /*+ use_index(@sel_1 test.t idxb) */ * from t WHERE c=3924541") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `c` = ?") + c.Assert(rows[0][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxb`)*/ * FROM `test`.`t` WHERE `c` = 3924541") + tk.MustExec("select /*+ use_index(t idxc)*/ * from t where c=3924541") + c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idxb") + tk.MustExec("admin flush bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[1][0], Equals, "select * from `test` . `t` where `c` = ?") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`), use_index(`t` `idxc`)*/ * FROM `test`.`t` WHERE `c` = 3924541") + c.Assert(rows[1][3], Equals, "pending verify") + tk.MustExec("admin evolve bindings") + rows = tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[1][0], Equals, "select * from `test` . `t` where `c` = ?") + c.Assert(rows[1][1], Equals, "SELECT /*+ use_index(@`sel_1` `test`.`t` `idxc`), use_index(`t` `idxc`)*/ * FROM `test`.`t` WHERE `c` = 3924541") + status := rows[1][3].(string) + c.Assert(status == "using" || status == "rejected", IsTrue) + tk.MustExec("set @@tidb_evolve_plan_baselines=0") +} + +func (s *testSuite) TestCaptureWithZeroSlowLogThreshold(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + stmtsummary.StmtSummaryByDigestMap.Clear() + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("set tidb_slow_log_threshold = 0") + tk.MustExec("select * from t") + tk.MustExec("select * from t") + tk.MustExec("set tidb_slow_log_threshold = 300") + tk.MustExec("admin capture bindings") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t`") +} + +func (s *testSuite) TestExplainTableStmts(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int, value decimal(5,2))") + tk.MustExec("table t") + tk.MustExec("explain table t") + tk.MustExec("desc table t") +} + +func (s *testSuite) TestSPMWithoutUseDatabase(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk1 := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + s.cleanBindingEnv(tk1) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, key(a))") + tk.MustExec("create global binding for select * from t using select * from t force index(a)") + + err := tk1.ExecToErr("select * from t") + c.Assert(err, ErrorMatches, "*No database selected") + tk1.MustQuery(`select @@last_plan_from_binding;`).Check(testkit.Rows("0")) + c.Assert(tk1.MustUseIndex("select * from test.t", "a"), IsTrue) + tk1.MustExec("select * from test.t") + tk1.MustQuery(`select @@last_plan_from_binding;`).Check(testkit.Rows("1")) +} + +func (s *testSuite) TestBindingWithoutCharset(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.cleanBindingEnv(tk) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10) CHARACTER SET utf8)") + tk.MustExec("create global binding for select * from t where a = 'aa' using select * from t where a = 'aa'") + rows := tk.MustQuery("show global bindings").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(rows[0][0], Equals, "select * from `test` . `t` where `a` = ?") + c.Assert(rows[0][1], Equals, "SELECT * FROM `test`.`t` WHERE `a` = 'aa'") +} diff --git a/bindinfo/cache.go b/bindinfo/cache.go index a7f216d7ca951..46364affbd74d 100644 --- a/bindinfo/cache.go +++ b/bindinfo/cache.go @@ -42,6 +42,8 @@ const ( Capture = "capture" // Evolve indicates the binding is evolved by TiDB from old bindings. Evolve = "evolve" + // Builtin indicates the binding is a builtin record for internal locking purpose. It is also the status for the builtin binding. + Builtin = "builtin" ) // Binding stores the basic bind hint info. @@ -118,16 +120,20 @@ func (br *BindRecord) prepareHints(sctx sessionctx.Context) error { if (bind.Hint != nil && bind.ID != "") || bind.Status == deleted { continue } - if sctx != nil { - _, err := getHintsForSQL(sctx, bind.BindSQL) - if err != nil { - return err - } - } - hintsSet, warns, err := hint.ParseHintsSet(p, bind.BindSQL, bind.Charset, bind.Collation, br.Db) + hintsSet, stmt, warns, err := hint.ParseHintsSet(p, bind.BindSQL, bind.Charset, bind.Collation, br.Db) if err != nil { return err } + if sctx != nil { + paramChecker := ¶mMarkerChecker{} + stmt.Accept(paramChecker) + if !paramChecker.hasParamMarker { + _, err = getHintsForSQL(sctx, bind.BindSQL) + if err != nil { + return err + } + } + } hintsStr, err := hintsSet.Restore() if err != nil { return err @@ -210,7 +216,7 @@ func (br *BindRecord) shallowCopy() *BindRecord { } func (br *BindRecord) isSame(other *BindRecord) bool { - return br.OriginalSQL == other.OriginalSQL && br.Db == other.Db + return br.OriginalSQL == other.OriginalSQL } var statusIndex = map[string]int{ diff --git a/bindinfo/handle.go b/bindinfo/handle.go index a120463db8b79..6111910395d55 100644 --- a/bindinfo/handle.go +++ b/bindinfo/handle.go @@ -25,15 +25,11 @@ import ( "github.com/pingcap/parser" "github.com/pingcap/parser/ast" - "github.com/pingcap/parser/format" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" @@ -94,6 +90,8 @@ const ( OwnerKey = "/tidb/bindinfo/owner" // Prompt is the prompt for bindinfo owner manager. Prompt = "bindinfo" + // BuiltinPseudoSQL4BindLock is used to simulate LOCK TABLE for mysql.bind_info. + BuiltinPseudoSQL4BindLock = "builtin_pseudo_sql_for_bind_lock" ) type bindRecordUpdate struct { @@ -123,24 +121,27 @@ func NewBindHandle(ctx sessionctx.Context) *BindHandle { func (h *BindHandle) Update(fullLoad bool) (err error) { h.bindInfo.Lock() lastUpdateTime := h.bindInfo.lastUpdateTime - h.bindInfo.Unlock() + updateTime := lastUpdateTime.String() + if fullLoad { + updateTime = "0000-00-00 00:00:00" + } - sql := "select original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source from mysql.bind_info" - if !fullLoad { - sql += " where update_time > \"" + lastUpdateTime.String() + "\"" + exec := h.sctx.Context.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT original_sql, bind_sql, default_db, status, create_time, update_time, charset, collation, source + FROM mysql.bind_info WHERE update_time > %? ORDER BY update_time`, updateTime) + if err != nil { + return err } - // We need to apply the updates by order, wrong apply order of same original sql may cause inconsistent state. - sql += " order by update_time" - // No need to acquire the session context lock for ExecRestrictedSQL, it + // No need to acquire the session context lock for ExecRestrictedStmt, it // uses another background session. - rows, _, err := h.sctx.Context.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + rows, _, err := exec.ExecRestrictedStmt(context.Background(), stmt) + if err != nil { + h.bindInfo.Unlock() return err } - // Make sure there is only one goroutine writes the cache. - h.bindInfo.Lock() newCache := h.bindInfo.Value.Load().(cache).copy() defer func() { h.bindInfo.lastUpdateTime = lastUpdateTime @@ -149,15 +150,19 @@ func (h *BindHandle) Update(fullLoad bool) (err error) { }() for _, row := range rows { + // Skip the builtin record which is designed for binding synchronization. + if row.GetString(0) == BuiltinPseudoSQL4BindLock { + continue + } hash, meta, err := h.newBindRecord(row) + if err != nil { + logutil.BgLogger().Debug("[sql-bind] failed to generate bind record from data row", zap.Error(err)) + continue + } // Update lastUpdateTime to the newest one. if meta.Bindings[0].UpdateTime.Compare(lastUpdateTime) > 0 { lastUpdateTime = meta.Bindings[0].UpdateTime } - if err != nil { - logutil.BgLogger().Info("update bindinfo failed", zap.Error(err)) - continue - } oldRecord := newCache.getBindRecord(hash, meta.OriginalSQL, meta.Db) newRecord := merge(oldRecord, meta).removeDeletedBindings() @@ -179,61 +184,63 @@ func (h *BindHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRecor return err } - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + record.Db = strings.ToLower(record.Db) + h.bindInfo.Lock() h.sctx.Lock() - _, err = exec.ExecuteInternal(context.TODO(), "BEGIN") - if err != nil { + defer func() { h.sctx.Unlock() + h.bindInfo.Unlock() + }() + exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + _, err = exec.ExecuteInternal(context.TODO(), "BEGIN PESSIMISTIC") + if err != nil { return } - normalizedSQL := parser.DigestNormalized(record.OriginalSQL) - oldRecord := h.GetBindRecord(normalizedSQL, record.OriginalSQL, record.Db) - defer func() { if err != nil { _, err1 := exec.ExecuteInternal(context.TODO(), "ROLLBACK") - h.sctx.Unlock() terror.Log(err1) return } _, err = exec.ExecuteInternal(context.TODO(), "COMMIT") - h.sctx.Unlock() if err != nil { return } - // Make sure there is only one goroutine writes the cache and uses parser. - h.bindInfo.Lock() - if oldRecord != nil { - h.removeBindRecord(normalizedSQL, oldRecord) - } - h.appendBindRecord(normalizedSQL, record) - h.bindInfo.Unlock() + sqlDigest := parser.DigestNormalized(record.OriginalSQL) + h.setBindRecord(sqlDigest, record) }() - txn, err1 := h.sctx.Context.Txn(true) - if err1 != nil { - return err1 + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = h.lockBindInfoTable(); err != nil { + return err } - now := types.NewTime(types.FromGoTime(oracle.GetTimeFromTS(txn.StartTS())), mysql.TypeTimestamp, 3) - - if oldRecord != nil { - for _, binding := range oldRecord.Bindings { - _, err1 = exec.ExecuteInternal(context.TODO(), h.logicalDeleteBindInfoSQL(record.OriginalSQL, record.Db, now, binding.BindSQL)) - if err != nil { - return err1 - } - } + // Binding recreation should physically delete previous bindings. + _, err = exec.ExecuteInternal(context.TODO(), `DELETE FROM mysql.bind_info WHERE original_sql = %?`, record.OriginalSQL) + if err != nil { + return err } + now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) + for i := range record.Bindings { record.Bindings[i].CreateTime = now record.Bindings[i].UpdateTime = now - // insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(context.TODO(), h.insertBindInfoSQL(record.OriginalSQL, record.Db, record.Bindings[i])) + // Insert the BindRecord to the storage. + _, err = exec.ExecuteInternal(context.TODO(), `INSERT INTO mysql.bind_info VALUES (%?,%?, %?, %?, %?, %?, %?, %?, %?)`, + record.OriginalSQL, + record.Bindings[i].BindSQL, + record.Db, + record.Bindings[i].Status, + record.Bindings[i].CreateTime.String(), + record.Bindings[i].UpdateTime.String(), + record.Bindings[i].Charset, + record.Bindings[i].Collation, + record.Bindings[i].Source, + ) if err != nil { return err } @@ -248,6 +255,7 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) return err } + record.Db = strings.ToLower(record.Db) oldRecord := h.GetBindRecord(parser.DigestNormalized(record.OriginalSQL), record.OriginalSQL, record.Db) var duplicateBinding *Binding if oldRecord != nil { @@ -262,47 +270,45 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) } } - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + h.bindInfo.Lock() h.sctx.Lock() - _, err = exec.ExecuteInternal(context.TODO(), "BEGIN") - if err != nil { + defer func() { h.sctx.Unlock() + h.bindInfo.Unlock() + }() + exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + _, err = exec.ExecuteInternal(context.TODO(), "BEGIN PESSIMISTIC") + if err != nil { return } defer func() { if err != nil { _, err1 := exec.ExecuteInternal(context.TODO(), "ROLLBACK") - h.sctx.Unlock() terror.Log(err1) return } _, err = exec.ExecuteInternal(context.TODO(), "COMMIT") - h.sctx.Unlock() if err != nil { return } - // Make sure there is only one goroutine writes the cache and uses parser. - h.bindInfo.Lock() h.appendBindRecord(parser.DigestNormalized(record.OriginalSQL), record) - h.bindInfo.Unlock() }() - txn, err1 := h.sctx.Context.Txn(true) - if err1 != nil { - return err1 + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = h.lockBindInfoTable(); err != nil { + return err } - if duplicateBinding != nil { - _, err = exec.ExecuteInternal(context.TODO(), h.deleteBindInfoSQL(record.OriginalSQL, record.Db, duplicateBinding.BindSQL)) + _, err = exec.ExecuteInternal(context.TODO(), `DELETE FROM mysql.bind_info WHERE original_sql = %? AND bind_sql = %?`, record.OriginalSQL, duplicateBinding.BindSQL) if err != nil { return err } } - now := types.NewTime(types.FromGoTime(oracle.GetTimeFromTS(txn.StartTS())), mysql.TypeTimestamp, 3) + now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) for i := range record.Bindings { if duplicateBinding != nil { record.Bindings[i].CreateTime = duplicateBinding.CreateTime @@ -311,8 +317,18 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) } record.Bindings[i].UpdateTime = now - // insert the BindRecord to the storage. - _, err = exec.ExecuteInternal(context.TODO(), h.insertBindInfoSQL(record.OriginalSQL, record.Db, record.Bindings[i])) + // Insert the BindRecord to the storage. + _, err = exec.ExecuteInternal(context.TODO(), `INSERT INTO mysql.bind_info VALUES (%?, %?, %?, %?, %?, %?, %?, %?, %?)`, + record.OriginalSQL, + record.Bindings[i].BindSQL, + record.Db, + record.Bindings[i].Status, + record.Bindings[i].CreateTime.String(), + record.Bindings[i].UpdateTime.String(), + record.Bindings[i].Charset, + record.Bindings[i].Collation, + record.Bindings[i].Source, + ) if err != nil { return err } @@ -322,25 +338,28 @@ func (h *BindHandle) AddBindRecord(sctx sessionctx.Context, record *BindRecord) // DropBindRecord drops a BindRecord to the storage and BindRecord int the cache. func (h *BindHandle) DropBindRecord(originalSQL, db string, binding *Binding) (err error) { - exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + db = strings.ToLower(db) + h.bindInfo.Lock() h.sctx.Lock() - _, err = exec.ExecuteInternal(context.TODO(), "BEGIN") - if err != nil { + defer func() { h.sctx.Unlock() - return + h.bindInfo.Unlock() + }() + exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + _, err = exec.ExecuteInternal(context.TODO(), "BEGIN PESSIMISTIC") + if err != nil { + return err } - + var deleteRows int defer func() { if err != nil { _, err1 := exec.ExecuteInternal(context.TODO(), "ROLLBACK") - h.sctx.Unlock() terror.Log(err1) return } _, err = exec.ExecuteInternal(context.TODO(), "COMMIT") - h.sctx.Unlock() - if err != nil { + if err != nil || deleteRows == 0 { return } @@ -348,28 +367,50 @@ func (h *BindHandle) DropBindRecord(originalSQL, db string, binding *Binding) (e if binding != nil { record.Bindings = append(record.Bindings, *binding) } - // Make sure there is only one goroutine writes the cache and uses parser. - h.bindInfo.Lock() h.removeBindRecord(parser.DigestNormalized(originalSQL), record) - h.bindInfo.Unlock() }() - txn, err1 := h.sctx.Context.Txn(true) - if err1 != nil { - return err1 + // Lock mysql.bind_info to synchronize with CreateBindRecord / AddBindRecord / DropBindRecord on other tidb instances. + if err = h.lockBindInfoTable(); err != nil { + return err } - updateTs := types.NewTime(types.FromGoTime(oracle.GetTimeFromTS(txn.StartTS())), mysql.TypeTimestamp, 3) + updateTs := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3).String() - bindSQL := "" - if binding != nil { - bindSQL = binding.BindSQL + if binding == nil { + _, err = exec.ExecuteInternal(context.TODO(), `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %?`, + deleted, updateTs, originalSQL, updateTs) + } else { + _, err = exec.ExecuteInternal(context.TODO(), `UPDATE mysql.bind_info SET status = %?, update_time = %? WHERE original_sql = %? AND update_time < %? AND bind_sql = %?`, + deleted, updateTs, originalSQL, updateTs, binding.BindSQL) } - _, err = exec.ExecuteInternal(context.TODO(), h.logicalDeleteBindInfoSQL(originalSQL, db, updateTs, bindSQL)) + deleteRows = int(h.sctx.Context.GetSessionVars().StmtCtx.AffectedRows()) return err } +// lockBindInfoTable simulates `LOCK TABLE mysql.bind_info WRITE` by acquiring a pessimistic lock on a +// special builtin row of mysql.bind_info. Note that this function must be called with h.sctx.Lock() held. +// We can replace this implementation to normal `LOCK TABLE mysql.bind_info WRITE` if that feature is +// generally available later. +// This lock would enforce the CREATE / DROP GLOBAL BINDING statements to be executed sequentially, +// even if they come from different tidb instances. +func (h *BindHandle) lockBindInfoTable() error { + // h.sctx already locked. + exec, _ := h.sctx.Context.(sqlexec.SQLExecutor) + _, err := exec.ExecuteInternal(context.TODO(), h.LockBindInfoSQL()) + return err +} + +// LockBindInfoSQL simulates LOCK TABLE by updating a same row in each pessimistic transaction. +func (h *BindHandle) LockBindInfoSQL() string { + sql, err := sqlexec.EscapeSQL("UPDATE mysql.bind_info SET source= %? WHERE original_sql= %?", Builtin, BuiltinPseudoSQL4BindLock) + if err != nil { + return "" + } + return sql +} + // tmpBindRecordMap is used to temporarily save bind record changes. // Those changes will be flushed into store periodically. type tmpBindRecordMap struct { @@ -387,7 +428,7 @@ func (tmpMap *tmpBindRecordMap) flushToStore() { if bindRecord.updateTime.IsZero() { err := tmpMap.flushFunc(bindRecord.bindRecord) if err != nil { - logutil.BgLogger().Error("flush bind record failed", zap.Error(err)) + logutil.BgLogger().Debug("[sql-bind] flush bind record failed", zap.Error(err)) } bindRecord.updateTime = time.Now() continue @@ -466,7 +507,7 @@ func (h *BindHandle) newBindRecord(row chunk.Row) (string, *BindRecord, error) { } bindRecord := &BindRecord{ OriginalSQL: row.GetString(0), - Db: row.GetString(2), + Db: strings.ToLower(row.GetString(2)), Bindings: []Binding{hint}, } hash := parser.DigestNormalized(bindRecord.OriginalSQL) @@ -477,6 +518,16 @@ func (h *BindHandle) newBindRecord(row chunk.Row) (string, *BindRecord, error) { return hash, bindRecord, err } +// setBindRecord sets the BindRecord to the cache, if there already exists a BindRecord, +// it will be overridden. +func (h *BindHandle) setBindRecord(hash string, meta *BindRecord) { + newCache := h.bindInfo.Value.Load().(cache).copy() + oldRecord := newCache.getBindRecord(hash, meta.OriginalSQL, meta.Db) + newCache.setBindRecord(hash, meta) + h.bindInfo.Value.Store(newCache) + updateMetrics(metrics.ScopeGlobal, oldRecord, meta, false) +} + // appendBindRecord addes the BindRecord to the cache, all the stale BindRecords are // removed from the cache after this operation. func (h *BindHandle) appendBindRecord(hash string, meta *BindRecord) { @@ -522,7 +573,7 @@ func (c cache) removeDeletedBindRecord(hash string, meta *BindRecord) { func (c cache) setBindRecord(hash string, meta *BindRecord) { metas := c[hash] for i := range metas { - if metas[i].Db == meta.Db && metas[i].OriginalSQL == meta.OriginalSQL { + if metas[i].OriginalSQL == meta.OriginalSQL { metas[i] = meta return } @@ -551,76 +602,32 @@ func copyBindRecordUpdateMap(oldMap map[string]*bindRecordUpdate) map[string]*bi func (c cache) getBindRecord(hash, normdOrigSQL, db string) *BindRecord { bindRecords := c[hash] for _, bindRecord := range bindRecords { - if bindRecord.OriginalSQL == normdOrigSQL && bindRecord.Db == db { + if bindRecord.OriginalSQL == normdOrigSQL { return bindRecord } } return nil } -func (h *BindHandle) deleteBindInfoSQL(normdOrigSQL, db, bindSQL string) string { - return fmt.Sprintf( - `DELETE FROM mysql.bind_info WHERE original_sql=%s AND default_db=%s AND bind_sql=%s`, - expression.Quote(normdOrigSQL), - expression.Quote(db), - expression.Quote(bindSQL), - ) -} - -func (h *BindHandle) insertBindInfoSQL(orignalSQL string, db string, info Binding) string { - return fmt.Sprintf(`INSERT INTO mysql.bind_info VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)`, - expression.Quote(orignalSQL), - expression.Quote(info.BindSQL), - expression.Quote(db), - expression.Quote(info.Status), - expression.Quote(info.CreateTime.String()), - expression.Quote(info.UpdateTime.String()), - expression.Quote(info.Charset), - expression.Quote(info.Collation), - expression.Quote(info.Source), - ) -} - -func (h *BindHandle) logicalDeleteBindInfoSQL(originalSQL, db string, updateTs types.Time, bindingSQL string) string { - sql := fmt.Sprintf(`UPDATE mysql.bind_info SET status=%s,update_time=%s WHERE original_sql=%s and default_db=%s`, - expression.Quote(deleted), - expression.Quote(updateTs.String()), - expression.Quote(originalSQL), - expression.Quote(db)) - if bindingSQL == "" { - return sql - } - return sql + fmt.Sprintf(` and bind_sql = %s`, expression.Quote(bindingSQL)) -} - // CaptureBaselines is used to automatically capture plan baselines. func (h *BindHandle) CaptureBaselines() { parser4Capture := parser.New() - schemas, sqls := stmtsummary.StmtSummaryByDigestMap.GetMoreThanOnceSelect() - for i := range sqls { - stmt, err := parser4Capture.ParseOneStmt(sqls[i], "", "") + bindableStmts := stmtsummary.StmtSummaryByDigestMap.GetMoreThanOnceBindableStmt() + for _, bindableStmt := range bindableStmts { + stmt, err := parser4Capture.ParseOneStmt(bindableStmt.Query, bindableStmt.Charset, bindableStmt.Collation) if err != nil { - logutil.BgLogger().Debug("parse SQL failed", zap.String("SQL", sqls[i]), zap.Error(err)) + logutil.BgLogger().Debug("[sql-bind] parse SQL failed in baseline capture", zap.String("SQL", bindableStmt.Query), zap.Error(err)) continue } - normalizedSQL, digiest := parser.NormalizeDigest(sqls[i]) - dbName := utilparser.GetDefaultDB(stmt, schemas[i]) - if r := h.GetBindRecord(digiest, normalizedSQL, dbName); r != nil && r.HasUsingBinding() { + if insertStmt, ok := stmt.(*ast.InsertStmt); ok && insertStmt.Select == nil { continue } - h.sctx.Lock() - h.sctx.GetSessionVars().CurrentDB = schemas[i] - oriIsolationRead := h.sctx.GetSessionVars().IsolationReadEngines - // TODO: support all engines plan hint in capture baselines. - h.sctx.GetSessionVars().IsolationReadEngines = map[kv.StoreType]struct{}{kv.TiKV: {}} - hints, err := getHintsForSQL(h.sctx.Context, sqls[i]) - h.sctx.GetSessionVars().IsolationReadEngines = oriIsolationRead - h.sctx.Unlock() - if err != nil { - logutil.BgLogger().Debug("generate hints failed", zap.String("SQL", sqls[i]), zap.Error(err)) + dbName := utilparser.GetDefaultDB(stmt, bindableStmt.Schema) + normalizedSQL, digest := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(stmt, dbName, bindableStmt.Query)) + if r := h.GetBindRecord(digest, normalizedSQL, dbName); r != nil && r.HasUsingBinding() { continue } - bindSQL := GenerateBindSQL(context.TODO(), stmt, hints) + bindSQL := GenerateBindSQL(context.TODO(), stmt, bindableStmt.PlanHint, true, dbName) if bindSQL == "" { continue } @@ -633,9 +640,9 @@ func (h *BindHandle) CaptureBaselines() { Source: Capture, } // We don't need to pass the `sctx` because the BindSQL has been validated already. - err = h.AddBindRecord(nil, &BindRecord{OriginalSQL: normalizedSQL, Db: dbName, Bindings: []Binding{binding}}) + err = h.CreateBindRecord(nil, &BindRecord{OriginalSQL: normalizedSQL, Db: dbName, Bindings: []Binding{binding}}) if err != nil { - logutil.BgLogger().Info("capture baseline failed", zap.String("SQL", sqls[i]), zap.Error(err)) + logutil.BgLogger().Debug("[sql-bind] create bind record failed in baseline capture", zap.String("SQL", bindableStmt.Query), zap.Error(err)) } } } @@ -643,16 +650,20 @@ func (h *BindHandle) CaptureBaselines() { func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { origVals := sctx.GetSessionVars().UsePlanBaselines sctx.GetSessionVars().UsePlanBaselines = false - recordSets, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), fmt.Sprintf("explain format='hint' %s", sql)) + + // Usually passing a sprintf to ExecuteInternal is not recommended, but in this case + // it is safe because ExecuteInternal does not permit MultiStatement execution. Thus, + // the statement won't be able to "break out" from EXPLAIN. + rs, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), fmt.Sprintf("EXPLAIN FORMAT='hint' %s", sql)) sctx.GetSessionVars().UsePlanBaselines = origVals - if len(recordSets) > 0 { - defer terror.Log(recordSets[0].Close()) + if rs != nil { + defer terror.Call(rs.Close) } if err != nil { return "", err } - chk := recordSets[0].NewChunk() - err = recordSets[0].Next(context.TODO(), chk) + chk := rs.NewChunk() + err = rs.Next(context.TODO(), chk) if err != nil { return "", err } @@ -660,32 +671,56 @@ func getHintsForSQL(sctx sessionctx.Context, sql string) (string, error) { } // GenerateBindSQL generates binding sqls from stmt node and plan hints. -func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string) string { +func GenerateBindSQL(ctx context.Context, stmtNode ast.StmtNode, planHint string, captured bool, defaultDB string) string { // If would be nil for very simple cases such as point get, we do not need to evolve for them. if planHint == "" { return "" } - paramChecker := ¶mMarkerChecker{} - stmtNode.Accept(paramChecker) - // We need to evolve on current sql, but we cannot restore values for paramMarkers yet, - // so just ignore them now. - if paramChecker.hasParamMarker { - return "" + if !captured { + paramChecker := ¶mMarkerChecker{} + stmtNode.Accept(paramChecker) + // We need to evolve on current sql, but we cannot restore values for paramMarkers yet, + // so just ignore them now. + if paramChecker.hasParamMarker { + return "" + } } // We need to evolve plan based on the current sql, not the original sql which may have different parameters. // So here we would remove the hint and inject the current best plan hint. hint.BindHint(stmtNode, &hint.HintsSet{}) - var sb strings.Builder - restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &sb) - err := stmtNode.Restore(restoreCtx) - if err != nil { - logutil.Logger(ctx).Warn("Restore SQL failed", zap.Error(err)) + bindSQL := utilparser.RestoreWithDefaultDB(stmtNode, defaultDB, "") + if bindSQL == "" { + return "" + } + switch n := stmtNode.(type) { + case *ast.DeleteStmt: + deleteIdx := strings.Index(bindSQL, "DELETE") + // Remove possible `explain` prefix. + bindSQL = bindSQL[deleteIdx:] + return strings.Replace(bindSQL, "DELETE", fmt.Sprintf("DELETE /*+ %s*/", planHint), 1) + case *ast.UpdateStmt: + updateIdx := strings.Index(bindSQL, "UPDATE") + // Remove possible `explain` prefix. + bindSQL = bindSQL[updateIdx:] + return strings.Replace(bindSQL, "UPDATE", fmt.Sprintf("UPDATE /*+ %s*/", planHint), 1) + case *ast.SelectStmt: + selectIdx := strings.Index(bindSQL, "SELECT") + // Remove possible `explain` prefix. + bindSQL = bindSQL[selectIdx:] + return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) + case *ast.InsertStmt: + insertIdx := int(0) + if n.IsReplace { + insertIdx = strings.Index(bindSQL, "REPLACE") + } else { + insertIdx = strings.Index(bindSQL, "INSERT") + } + // Remove possible `explain` prefix. + bindSQL = bindSQL[insertIdx:] + return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) } - bindSQL := sb.String() - selectIdx := strings.Index(bindSQL, "SELECT") - // Remove possible `explain` prefix. - bindSQL = bindSQL[selectIdx:] - return strings.Replace(bindSQL, "SELECT", fmt.Sprintf("SELECT /*+ %s*/", planHint), 1) + logutil.Logger(ctx).Debug("[sql-bind] unexpected statement type when generating bind SQL", zap.Any("statement", stmtNode)) + return "" } type paramMarkerChecker struct { @@ -720,9 +755,17 @@ func (h *BindHandle) SaveEvolveTasksToStore() { } func getEvolveParameters(ctx sessionctx.Context) (time.Duration, time.Time, time.Time, error) { - sql := fmt.Sprintf("select variable_name, variable_value from mysql.global_variables where variable_name in ('%s', '%s', '%s')", - variable.TiDBEvolvePlanTaskMaxTime, variable.TiDBEvolvePlanTaskStartTime, variable.TiDBEvolvePlanTaskEndTime) - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + stmt, err := ctx.(sqlexec.RestrictedSQLExecutor).ParseWithParams( + context.TODO(), + "SELECT variable_name, variable_value FROM mysql.global_variables WHERE variable_name IN (%?, %?, %?)", + variable.TiDBEvolvePlanTaskMaxTime, + variable.TiDBEvolvePlanTaskStartTime, + variable.TiDBEvolvePlanTaskEndTime, + ) + if err != nil { + return 0, time.Time{}, time.Time{}, err + } + rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return 0, time.Time{}, time.Time{}, err } @@ -756,6 +799,10 @@ const ( // acceptFactor is the factor to decide should we accept the pending verified plan. // A pending verified plan will be accepted if it performs at least `acceptFactor` times better than the accepted plans. acceptFactor = 1.5 + // verifyTimeoutFactor is how long to wait to verify the pending plan. + // For debugging purposes it is useful to wait a few times longer than the current execution time so that + // an informative error can be written to the log. + verifyTimeoutFactor = 2.0 // nextVerifyDuration is the duration that we will retry the rejected plans. nextVerifyDuration = 7 * 24 * time.Hour ) @@ -789,7 +836,7 @@ func (h *BindHandle) getOnePendingVerifyJob() (string, string, Binding) { func (h *BindHandle) getRunningDuration(sctx sessionctx.Context, db, sql string, maxTime time.Duration) (time.Duration, error) { ctx := context.TODO() if db != "" { - _, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, fmt.Sprintf("use `%s`", db)) + _, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, "use %n", db) if err != nil { return 0, err } @@ -808,6 +855,7 @@ func (h *BindHandle) getRunningDuration(sctx sessionctx.Context, db, sql string, return time.Since(startTime), nil case <-timer.C: cancelFunc() + logutil.BgLogger().Debug("[sql-bind] plan verification timed out", zap.Duration("timeElapsed", time.Since(startTime)), zap.String("query", sql)) } <-resultChan return -1, nil @@ -822,23 +870,22 @@ func runSQL(ctx context.Context, sctx sessionctx.Context, sql string, resultChan resultChan <- fmt.Errorf("run sql panicked: %v", string(buf)) } }() - recordSets, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) + rs, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { - if len(recordSets) > 0 { - terror.Call(recordSets[0].Close) + if rs != nil { + terror.Call(rs.Close) } resultChan <- err return } - recordSet := recordSets[0] - chk := recordSets[0].NewChunk() + chk := rs.NewChunk() for { - err = recordSet.Next(ctx, chk) + err = rs.Next(ctx, chk) if err != nil || chk.NumRows() == 0 { break } } - terror.Call(recordSets[0].Close) + terror.Call(rs.Close) resultChan <- err } @@ -857,7 +904,7 @@ func (h *BindHandle) HandleEvolvePlanTask(sctx sessionctx.Context, adminEvolve b return nil } sctx.GetSessionVars().UsePlanBaselines = true - acceptedPlanTime, err := h.getRunningDuration(sctx, db, binding.BindSQL, maxTime) + currentPlanTime, err := h.getRunningDuration(sctx, db, binding.BindSQL, maxTime) // If we just return the error to the caller, this job will be retried again and again and cause endless logs, // since it is still in the bind record. Now we just drop it and if it is actually retryable, // we will hope for that we can capture this evolve task again. @@ -866,16 +913,22 @@ func (h *BindHandle) HandleEvolvePlanTask(sctx sessionctx.Context, adminEvolve b } // If the accepted plan timeouts, it is hard to decide the timeout for verify plan. // Currently we simply mark the verify plan as `using` if it could run successfully within maxTime. - if acceptedPlanTime > 0 { - maxTime = time.Duration(float64(acceptedPlanTime) / acceptFactor) + if currentPlanTime > 0 { + maxTime = time.Duration(float64(currentPlanTime) * verifyTimeoutFactor) } sctx.GetSessionVars().UsePlanBaselines = false verifyPlanTime, err := h.getRunningDuration(sctx, db, binding.BindSQL, maxTime) if err != nil { return h.DropBindRecord(originalSQL, db, &binding) } - if verifyPlanTime < 0 { + if verifyPlanTime == -1 || (float64(verifyPlanTime)*acceptFactor > float64(currentPlanTime)) { binding.Status = Rejected + digestText, _ := parser.NormalizeDigest(binding.BindSQL) // for log desensitization + logutil.BgLogger().Debug("[sql-bind] new plan rejected", + zap.Duration("currentPlanTime", currentPlanTime), + zap.Duration("verifyPlanTime", verifyPlanTime), + zap.String("digestText", digestText), + ) } else { binding.Status = Using } diff --git a/bindinfo/session_handle.go b/bindinfo/session_handle.go index a594e3270a53a..2604d5b563f52 100644 --- a/bindinfo/session_handle.go +++ b/bindinfo/session_handle.go @@ -14,6 +14,7 @@ package bindinfo import ( + "strings" "time" "github.com/pingcap/parser" @@ -51,6 +52,7 @@ func (h *SessionHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRe if err != nil { return err } + record.Db = strings.ToLower(record.Db) now := types.NewTime(types.FromGoTime(time.Now().In(sctx.GetSessionVars().StmtCtx.TimeZone)), mysql.TypeTimestamp, 3) for i := range record.Bindings { record.Bindings[i].CreateTime = now @@ -64,6 +66,7 @@ func (h *SessionHandle) CreateBindRecord(sctx sessionctx.Context, record *BindRe // DropBindRecord drops a BindRecord in the cache. func (h *SessionHandle) DropBindRecord(originalSQL, db string, binding *Binding) error { + db = strings.ToLower(db) oldRecord := h.GetBindRecord(originalSQL, db) var newRecord *BindRecord record := &BindRecord{OriginalSQL: originalSQL, Db: db} @@ -85,7 +88,7 @@ func (h *SessionHandle) GetBindRecord(normdOrigSQL, db string) *BindRecord { hash := parser.DigestNormalized(normdOrigSQL) bindRecords := h.ch[hash] for _, bindRecord := range bindRecords { - if bindRecord.OriginalSQL == normdOrigSQL && bindRecord.Db == db { + if bindRecord.OriginalSQL == normdOrigSQL { return bindRecord } } diff --git a/circle.yml b/circle.yml index 5f78e7f3855c5..621621981ff83 100644 --- a/circle.yml +++ b/circle.yml @@ -3,7 +3,7 @@ version: 2 jobs: build: docker: - - image: golang:1.13 + - image: golang:1.16 working_directory: /go/src/github.com/pingcap/tidb steps: - checkout diff --git a/cmd/benchdb/main.go b/cmd/benchdb/main.go index 4d9e40daae6af..532c0597ce8fa 100644 --- a/cmd/benchdb/main.go +++ b/cmd/benchdb/main.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store" + "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -55,7 +56,7 @@ func main() { flag.PrintDefaults() err := logutil.InitZapLogger(logutil.NewLogConfig(*logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) terror.MustNil(err) - err = store.Register("tikv", tikv.Driver{}) + err = store.Register("tikv", driver.TiKVDriver{}) terror.MustNil(err) ut := newBenchDB() works := strings.Split(*runJobs, "|") @@ -97,7 +98,7 @@ func newBenchDB() *benchDB { terror.MustNil(err) se, err := session.CreateSession(store) terror.MustNil(err) - _, err = se.Execute(context.Background(), "use test") + _, err = se.ExecuteInternal(context.Background(), "use test") terror.MustNil(err) return &benchDB{ @@ -106,14 +107,23 @@ func newBenchDB() *benchDB { } } -func (ut *benchDB) mustExec(sql string) { - rss, err := ut.session.Execute(context.Background(), sql) +func (ut *benchDB) mustExec(sql string, args ...interface{}) { + // executeInternal only return one resultSet for this. + rs, err := ut.session.ExecuteInternal(context.Background(), sql, args...) + defer func() { + if rs != nil { + err = rs.Close() + if err != nil { + log.Fatal(err.Error()) + } + } + }() if err != nil { log.Fatal(err.Error()) + return } - if len(rss) > 0 { + if rs != nil { ctx := context.Background() - rs := rss[0] req := rs.NewChunk() for { err := rs.Next(ctx, req) @@ -170,7 +180,7 @@ func (ut *benchDB) mustParseSpec(s string) (start, end, count int) { func (ut *benchDB) createTable() { cLog("create table") - createSQL := "CREATE TABLE IF NOT EXISTS " + *tableName + ` ( + createSQL := `CREATE TABLE IF NOT EXISTS %n ( id bigint(20) NOT NULL, name varchar(32) NOT NULL, exp bigint(20) NOT NULL DEFAULT '0', @@ -178,12 +188,12 @@ func (ut *benchDB) createTable() { PRIMARY KEY (id), UNIQUE KEY name (name) )` - ut.mustExec(createSQL) + ut.mustExec(createSQL, *tableName) } func (ut *benchDB) truncateTable() { cLog("truncate table") - ut.mustExec("truncate table " + *tableName) + ut.mustExec("truncate table %n", *tableName) } func (ut *benchDB) runCountTimes(name string, count int, f func()) { @@ -225,9 +235,8 @@ func (ut *benchDB) insertRows(spec string) { break } rand.Read(buf) - insetQuery := fmt.Sprintf("insert %s (id, name, data) values (%d, '%d', '%x')", - *tableName, id, id, buf) - ut.mustExec(insetQuery) + insertQuery := "insert %n (id, name, data) values(%?, %?, %?)" + ut.mustExec(insertQuery, *tableName, id, id, buf) id++ } ut.mustExec("commit") @@ -245,8 +254,8 @@ func (ut *benchDB) updateRandomRows(spec string) { break } id := rand.Intn(end-start) + start - updateQuery := fmt.Sprintf("update %s set exp = exp + 1 where id = %d", *tableName, id) - ut.mustExec(updateQuery) + updateQuery := "update %n set exp = exp + 1 where id = %?" + ut.mustExec(updateQuery, *tableName, id) runCount++ } ut.mustExec("commit") @@ -257,8 +266,8 @@ func (ut *benchDB) updateRangeRows(spec string) { start, end, count := ut.mustParseSpec(spec) ut.runCountTimes("update-range", count, func() { ut.mustExec("begin") - updateQuery := fmt.Sprintf("update %s set exp = exp + 1 where id >= %d and id < %d", *tableName, start, end) - ut.mustExec(updateQuery) + updateQuery := "update %n set exp = exp + 1 where id >= %? and id < %?" + ut.mustExec(updateQuery, *tableName, start, end) ut.mustExec("commit") }) } @@ -266,8 +275,8 @@ func (ut *benchDB) updateRangeRows(spec string) { func (ut *benchDB) selectRows(spec string) { start, end, count := ut.mustParseSpec(spec) ut.runCountTimes("select", count, func() { - selectQuery := fmt.Sprintf("select * from %s where id >= %d and id < %d", *tableName, start, end) - ut.mustExec(selectQuery) + selectQuery := "select * from %n where id >= %? and id < %?" + ut.mustExec(selectQuery, *tableName, start, end) }) } diff --git a/cmd/benchkv/main.go b/cmd/benchkv/main.go index a37e30f6b74c3..23bfd44a7476a 100644 --- a/cmd/benchkv/main.go +++ b/cmd/benchkv/main.go @@ -28,7 +28,7 @@ import ( "github.com/pingcap/log" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/driver" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "go.uber.org/zap" @@ -69,7 +69,7 @@ var ( // Init initializes information. func Init() { - driver := tikv.Driver{} + driver := driver.TiKVDriver{} var err error store, err = driver.Open(fmt.Sprintf("tikv://%s?cluster=1", *pdAddr)) terror.MustNil(err) diff --git a/cmd/benchraw/main.go b/cmd/benchraw/main.go index 2ca4b68b9bfb0..1bdbdaf01d621 100644 --- a/cmd/benchraw/main.go +++ b/cmd/benchraw/main.go @@ -25,8 +25,8 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/config" "go.uber.org/zap" ) diff --git a/cmd/ddltest/column_test.go b/cmd/ddltest/column_test.go index adfd7dfe3c866..baf176f8ea953 100644 --- a/cmd/ddltest/column_test.go +++ b/cmd/ddltest/column_test.go @@ -26,6 +26,7 @@ import ( plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" log "github.com/sirupsen/logrus" goctx "golang.org/x/net/context" @@ -42,7 +43,7 @@ func (s *TestDDLSuite) checkAddColumn(c *C, rowID int64, defaultVal interface{}, newInsertCount := int64(0) oldUpdateCount := int64(0) newUpdateCount := int64(0) - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { col1Val := data[0].GetValue() col2Val := data[1].GetValue() col3Val := data[2].GetValue() @@ -93,7 +94,7 @@ func (s *TestDDLSuite) checkDropColumn(c *C, rowID int64, alterColumn *table.Col } insertCount := int64(0) updateCount := int64(0) - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if reflect.DeepEqual(data[1].GetValue(), data[0].GetValue()) { // Check inserted row. insertCount++ diff --git a/cmd/ddltest/ddl_test.go b/cmd/ddltest/ddl_test.go index 9226946f67718..f233e5ea25482 100644 --- a/cmd/ddltest/ddl_test.go +++ b/cmd/ddltest/ddl_test.go @@ -41,8 +41,9 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store" - "github.com/pingcap/tidb/store/tikv" + tidbdriver "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/testkit" @@ -97,11 +98,11 @@ type TestDDLSuite struct { } func (s *TestDDLSuite) SetUpSuite(c *C) { - logutil.InitLogger(&logutil.LogConfig{Config: zaplog.Config{Level: *logLevel}}) + err := logutil.InitLogger(&logutil.LogConfig{Config: zaplog.Config{Level: *logLevel}}) + c.Assert(err, IsNil) s.quit = make(chan struct{}) - var err error s.store, err = store.New(fmt.Sprintf("tikv://%s%s", *etcd, *tikvPath)) c.Assert(err, IsNil) @@ -304,7 +305,11 @@ func (s *TestDDLSuite) startServer(i int, fp *os.File) (*server, error) { } log.Warnf("ping addr %v failed, retry count %d err %v", addr, i, err) - db.Close() + err = db.Close() + if err != nil { + log.Warnf("close db failed, retry count %d err %v", i, err) + break + } time.Sleep(sleepTime) sleepTime += sleepTime } @@ -533,7 +538,7 @@ func (s *TestDDLSuite) Bootstrap(c *C) { tk.MustExec("create table test_mixed (c1 int, c2 int, primary key(c1))") tk.MustExec("create table test_inc (c1 int, c2 int, primary key(c1))") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists test_insert_common, test_conflict_insert_common, " + "test_update_common, test_conflict_update_common, test_delete_common, test_conflict_delete_common, " + "test_mixed_common, test_inc_common") @@ -545,7 +550,7 @@ func (s *TestDDLSuite) Bootstrap(c *C) { tk.MustExec("create table test_conflict_delete_common (c1 int, c2 int, primary key(c1, c2))") tk.MustExec("create table test_mixed_common (c1 int, c2 int, primary key(c1, c2))") tk.MustExec("create table test_inc_common (c1 int, c2 int, primary key(c1, c2))") - tk.MustExec("set @@tidb_enable_clustered_index = 0") + tk.Se.GetSessionVars().EnableClusteredIndex = false } func (s *TestDDLSuite) TestSimple(c *C) { @@ -600,7 +605,7 @@ func (s *TestDDLSuite) TestSimpleInsert(c *C) { tbl := s.getTable(c, "test_insert") handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) c.Assert(data[0].GetValue(), Equals, data[1].GetValue()) return true, nil @@ -651,7 +656,7 @@ func (s *TestDDLSuite) TestSimpleConflictInsert(c *C) { tbl := s.getTable(c, tblName) handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) c.Assert(keysMap, HasKey, data[0].GetValue()) c.Assert(data[0].GetValue(), Equals, data[1].GetValue()) @@ -704,7 +709,7 @@ func (s *TestDDLSuite) TestSimpleUpdate(c *C) { tbl := s.getTable(c, tblName) handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) key := data[0].GetInt64() c.Assert(data[1].GetValue(), Equals, keysMap[key]) @@ -777,7 +782,7 @@ func (s *TestDDLSuite) TestSimpleConflictUpdate(c *C) { tbl := s.getTable(c, tblName) handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) c.Assert(keysMap, HasKey, data[0].GetValue()) @@ -827,7 +832,7 @@ func (s *TestDDLSuite) TestSimpleDelete(c *C) { tbl := s.getTable(c, tblName) handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) return true, nil }) @@ -897,7 +902,7 @@ func (s *TestDDLSuite) TestSimpleConflictDelete(c *C) { tbl := s.getTable(c, tblName) handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) c.Assert(keysMap, HasKey, data[0].GetValue()) return true, nil @@ -967,7 +972,7 @@ func (s *TestDDLSuite) TestSimpleMixed(c *C) { tbl := s.getTable(c, tblName) updateCount := int64(0) insertCount := int64(0) - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if reflect.DeepEqual(data[1].GetValue(), data[0].GetValue()) { insertCount++ } else if reflect.DeepEqual(data[1].GetValue(), defaultValue) && data[0].GetInt64() < int64(rowCount) { @@ -1037,7 +1042,7 @@ func (s *TestDDLSuite) TestSimpleInc(c *C) { c.Assert(err, IsNil) tbl := s.getTable(c, "test_inc") - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if reflect.DeepEqual(data[0].GetValue(), int64(0)) { if *enableRestart { c.Assert(data[1].GetValue(), GreaterEqual, int64(rowCount)) @@ -1061,5 +1066,5 @@ func addEnvPath(newPath string) { func init() { rand.Seed(time.Now().UnixNano()) - store.Register("tikv", tikv.Driver{}) + store.Register("tikv", tidbdriver.TiKVDriver{}) } diff --git a/cmd/ddltest/index_test.go b/cmd/ddltest/index_test.go index 4e8f7094a2ec3..1101486de37b2 100644 --- a/cmd/ddltest/index_test.go +++ b/cmd/ddltest/index_test.go @@ -25,8 +25,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/store/tikv/gcworker" + "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" @@ -51,7 +50,7 @@ func (s *TestDDLSuite) checkAddIndex(c *C, indexInfo *model.IndexInfo) { // read handles form table handles := kv.NewHandleMap() - err = tbl.IterRecords(ctx, tbl.FirstKey(), tbl.Cols(), + err = tables.IterRecords(tbl, ctx, tbl.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) return true, nil @@ -65,7 +64,8 @@ func (s *TestDDLSuite) checkAddIndex(c *C, indexInfo *model.IndexInfo) { txn, err := ctx.Txn(false) c.Assert(err, IsNil) defer func() { - txn.Rollback() + err = txn.Rollback() + c.Assert(err, IsNil) }() it, err := idx.SeekFirst(txn) @@ -88,7 +88,7 @@ func (s *TestDDLSuite) checkAddIndex(c *C, indexInfo *model.IndexInfo) { } func (s *TestDDLSuite) checkDropIndex(c *C, indexInfo *model.IndexInfo) { - gcWorker, err := gcworker.NewMockGCWorker(s.store.(tikv.Storage)) + gcWorker, err := gcworker.NewMockGCWorker(s.store) c.Assert(err, IsNil) err = gcWorker.DeleteRanges(goctx.Background(), uint64(math.MaxInt32)) c.Assert(err, IsNil) @@ -104,7 +104,10 @@ func (s *TestDDLSuite) checkDropIndex(c *C, indexInfo *model.IndexInfo) { c.Assert(err, IsNil) txn, err := ctx.Txn(false) c.Assert(err, IsNil) - defer txn.Rollback() + defer func(){ + err := txn.Rollback() + c.Assert(err, IsNil) + }() it, err := idx.SeekFirst(txn) c.Assert(err, IsNil) diff --git a/cmd/explaintest/config.toml b/cmd/explaintest/config.toml index 289b4ef48e71d..e35fc14acf709 100644 --- a/cmd/explaintest/config.toml +++ b/cmd/explaintest/config.toml @@ -10,3 +10,4 @@ status-host = "127.0.0.1" stats-lease = "0" [experimental] +allow-expression-index = true diff --git a/cmd/explaintest/main.go b/cmd/explaintest/main.go index d632ac4973141..3fff10a5f8415 100644 --- a/cmd/explaintest/main.go +++ b/cmd/explaintest/main.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" "github.com/pingcap/parser/ast" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/logutil" @@ -656,13 +657,15 @@ func main() { "set @@tidb_window_concurrency=4", "set @@tidb_projection_concurrency=4", "set @@tidb_distsql_scan_concurrency=15", - "set @@tidb_enable_clustered_index=0;", + "set @@global.tidb_enable_clustered_index=0;", } for _, sql := range resets { if _, err = mdb.Exec(sql); err != nil { log.Fatal(fmt.Sprintf("%s failed", sql), zap.Error(err)) } } + // Wait global variables to reload. + time.Sleep(domain.GlobalVariableCacheExpiry) if _, err = mdb.Exec("set sql_mode='STRICT_TRANS_TABLES'"); err != nil { log.Fatal("set sql_mode='STRICT_TRANS_TABLES' failed", zap.Error(err)) diff --git a/cmd/explaintest/r/access_path_selection.result b/cmd/explaintest/r/access_path_selection.result index 5b569d0a8e528..b31f7ce896668 100644 --- a/cmd/explaintest/r/access_path_selection.result +++ b/cmd/explaintest/r/access_path_selection.result @@ -5,40 +5,40 @@ KEY `IDX_a` (`a`), KEY `IDX_b` (`b`), KEY `IDX_ab` (`a`, `b`) ); -explain select a from access_path_selection where a < 3; +explain format = 'brief' select a from access_path_selection where a < 3; id estRows task access object operator info -IndexReader_6 3323.33 root index:IndexRangeScan_5 -└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:IDX_a(a) range:[-inf,3), keep order:false, stats:pseudo -explain select a, b from access_path_selection where a < 3; +IndexReader 3323.33 root index:IndexRangeScan +└─IndexRangeScan 3323.33 cop[tikv] table:access_path_selection, index:IDX_a(a) range:[-inf,3), keep order:false, stats:pseudo +explain format = 'brief' select a, b from access_path_selection where a < 3; id estRows task access object operator info -IndexReader_6 3323.33 root index:IndexRangeScan_5 -└─IndexRangeScan_5 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo -explain select a, b from access_path_selection where b < 3; +IndexReader 3323.33 root index:IndexRangeScan +└─IndexRangeScan 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo +explain format = 'brief' select a, b from access_path_selection where b < 3; id estRows task access object operator info -TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.access_path_selection.b, 3) - └─TableFullScan_5 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo -explain select a, b from access_path_selection where a < 3 and b < 3; +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(test.access_path_selection.b, 3) + └─TableFullScan 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo +explain format = 'brief' select a, b from access_path_selection where a < 3 and b < 3; id estRows task access object operator info -IndexReader_11 1104.45 root index:Selection_10 -└─Selection_10 1104.45 cop[tikv] lt(test.access_path_selection.b, 3) - └─IndexRangeScan_9 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo -explain select a, b from access_path_selection where a > 10 order by _tidb_rowid; +IndexReader 1104.45 root index:Selection +└─Selection 1104.45 cop[tikv] lt(test.access_path_selection.b, 3) + └─IndexRangeScan 3323.33 cop[tikv] table:access_path_selection, index:IDX_ab(a, b) range:[-inf,3), keep order:false, stats:pseudo +explain format = 'brief' select a, b from access_path_selection where a > 10 order by _tidb_rowid; id estRows task access object operator info -Projection_6 3333.33 root test.access_path_selection.a, test.access_path_selection.b -└─TableReader_13 3333.33 root data:Selection_12 - └─Selection_12 3333.33 cop[tikv] gt(test.access_path_selection.a, 10) - └─TableFullScan_11 10000.00 cop[tikv] table:access_path_selection keep order:true, stats:pseudo -explain select max(_tidb_rowid) from access_path_selection; +Projection 3333.33 root test.access_path_selection.a, test.access_path_selection.b +└─TableReader 3333.33 root data:Selection + └─Selection 3333.33 cop[tikv] gt(test.access_path_selection.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:access_path_selection keep order:true, stats:pseudo +explain format = 'brief' select max(_tidb_rowid) from access_path_selection; id estRows task access object operator info -StreamAgg_13 1.00 root funcs:max(test.access_path_selection._tidb_rowid)->Column#4 -└─Limit_17 1.00 root offset:0, count:1 - └─TableReader_27 1.00 root data:Limit_26 - └─Limit_26 1.00 cop[tikv] offset:0, count:1 - └─TableFullScan_25 1.25 cop[tikv] table:access_path_selection keep order:true, desc, stats:pseudo -explain select count(1) from access_path_selection; +StreamAgg 1.00 root funcs:max(test.access_path_selection._tidb_rowid)->Column#4 +└─Limit 1.00 root offset:0, count:1 + └─TableReader 1.00 root data:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─TableFullScan 1.25 cop[tikv] table:access_path_selection keep order:true, desc, stats:pseudo +explain format = 'brief' select count(1) from access_path_selection; id estRows task access object operator info -StreamAgg_28 1.00 root funcs:count(Column#18)->Column#4 -└─TableReader_29 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tikv] funcs:count(1)->Column#18 - └─TableFullScan_24 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo +StreamAgg 1.00 root funcs:count(Column#18)->Column#4 +└─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#18 + └─TableFullScan 10000.00 cop[tikv] table:access_path_selection keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/black_list.result b/cmd/explaintest/r/black_list.result index 86306cabfd399..96879cfd47379 100644 --- a/cmd/explaintest/r/black_list.result +++ b/cmd/explaintest/r/black_list.result @@ -1,56 +1,56 @@ use test; drop table if exists t; create table t (a int); -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo insert into mysql.opt_rule_blacklist values('predicate_push_down'); admin reload opt_rule_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -Selection_5 8000.00 root lt(test.t.a, 1) -└─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 8000.00 root lt(test.t.a, 1) +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo delete from mysql.opt_rule_blacklist where name='predicate_push_down'; admin reload opt_rule_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo insert into mysql.expr_pushdown_blacklist values('<', 'tikv,tiflash,tidb', 'for test'); admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -Selection_5 8000.00 root lt(test.t.a, 1) -└─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 8000.00 root lt(test.t.a, 1) +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo delete from mysql.expr_pushdown_blacklist where name='<' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo insert into mysql.expr_pushdown_blacklist values('lt', 'tikv,tiflash,tidb', 'for test'); admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -Selection_5 8000.00 root lt(test.t.a, 1) -└─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Selection 8000.00 root lt(test.t.a, 1) +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo delete from mysql.expr_pushdown_blacklist where name='lt' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; id estRows task access object operator info -TableReader_7 3323.33 root data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.a, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 3323.33 root data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/clustered_index.result b/cmd/explaintest/r/clustered_index.result new file mode 100644 index 0000000000000..2dded83f272bd --- /dev/null +++ b/cmd/explaintest/r/clustered_index.result @@ -0,0 +1,131 @@ +drop database if exists with_cluster_index; +create database with_cluster_index; +drop database if exists wout_cluster_index; +create database wout_cluster_index; +use with_cluster_index; +set @@tidb_enable_clustered_index = 1; +create table tbl_0 ( col_0 decimal not null , col_1 blob(207) , col_2 text , col_3 datetime default '1986-07-01' , col_4 bigint unsigned default 1504335725690712365 , primary key idx_0 ( col_3,col_2(1),col_1(6) ) , key idx_1 ( col_3 ) , unique key idx_2 ( col_3 ) , unique key idx_3 ( col_0 ) , key idx_4 ( col_1(1),col_2(1) ) , key idx_5 ( col_2(1) ) ) ; +create table tbl_1 ( col_5 char(135) , col_6 bit(17) default 50609 not null , col_7 char(202) default 'IoQWYoGdbbgBDlxpDHQ' , col_8 char(213) , col_9 time not null , primary key idx_6 ( col_6 ) , unique key idx_7 ( col_5 ) ) ; +create table tbl_2 ( col_10 datetime default '1976-05-11' , col_11 datetime , col_12 float , col_13 double(56,29) default 18.0118 , col_14 char not null , primary key idx_8 ( col_14,col_13,col_10 ) , key idx_9 ( col_11 ) ) ; +create table tbl_3 ( col_15 tinyint default -91 not null , col_16 bit(61) default 990141831018971350 not null , col_17 double(244,22) default 3985 not null , col_18 binary(32) default 'kxMlWqvpxXNBlxoU' , col_19 text(401) , primary key idx_10 ( col_18,col_19(4) ) , key idx_11 ( col_17,col_18,col_19(2),col_15,col_16 ) , unique key idx_12 ( col_17 ) ) ; +create table tbl_4 ( col_20 double(230,16) default 8.49 not null , col_21 int unsigned not null , col_22 enum('Alice','Bob','Charlie','David') not null , col_23 float default 3066.13040283622 , col_24 datetime default '1980-10-27' not null , primary key idx_13 ( col_22,col_24 ) , key idx_14 ( col_23,col_20 ) , key idx_15 ( col_24 ) , key idx_16 ( col_20 ) , unique key idx_17 ( col_24 ) , key idx_18 ( col_21 ) ) ; +load stats 's/with_cluster_index_tbl_0.json'; +load stats 's/with_cluster_index_tbl_1.json'; +load stats 's/with_cluster_index_tbl_2.json'; +load stats 's/with_cluster_index_tbl_3.json'; +load stats 's/with_cluster_index_tbl_4.json'; +use wout_cluster_index; +set @@tidb_enable_clustered_index = 0; +create table tbl_0 ( col_0 decimal not null , col_1 blob(207) , col_2 text , col_3 datetime default '1986-07-01' , col_4 bigint unsigned default 1504335725690712365 , primary key idx_0 ( col_3,col_2(1),col_1(6) ) , key idx_1 ( col_3 ) , unique key idx_2 ( col_3 ) , unique key idx_3 ( col_0 ) , key idx_4 ( col_1(1),col_2(1) ) , key idx_5 ( col_2(1) ) ) ; +create table tbl_1 ( col_5 char(135) , col_6 bit(17) default 50609 not null , col_7 char(202) default 'IoQWYoGdbbgBDlxpDHQ' , col_8 char(213) , col_9 time not null , primary key idx_6 ( col_6 ) , unique key idx_7 ( col_5 ) ) ; +create table tbl_2 ( col_10 datetime default '1976-05-11' , col_11 datetime , col_12 float , col_13 double(56,29) default 18.0118 , col_14 char not null , primary key idx_8 ( col_14,col_13,col_10 ) , key idx_9 ( col_11 ) ) ; +create table tbl_3 ( col_15 tinyint default -91 not null , col_16 bit(61) default 990141831018971350 not null , col_17 double(244,22) default 3985 not null , col_18 binary(32) default 'kxMlWqvpxXNBlxoU' , col_19 text(401) , primary key idx_10 ( col_18,col_19(4) ) , key idx_11 ( col_17,col_18,col_19(2),col_15,col_16 ) , unique key idx_12 ( col_17 ) ) ; +create table tbl_4 ( col_20 double(230,16) default 8.49 not null , col_21 int unsigned not null , col_22 enum('Alice','Bob','Charlie','David') not null , col_23 float default 3066.13040283622 , col_24 datetime default '1980-10-27' not null , primary key idx_13 ( col_22,col_24 ) , key idx_14 ( col_23,col_20 ) , key idx_15 ( col_24 ) , key idx_16 ( col_20 ) , unique key idx_17 ( col_24 ) , key idx_18 ( col_21 ) ) ; +load stats 's/wout_cluster_index_tbl_0.json'; +load stats 's/wout_cluster_index_tbl_1.json'; +load stats 's/wout_cluster_index_tbl_2.json'; +load stats 's/wout_cluster_index_tbl_3.json'; +load stats 's/wout_cluster_index_tbl_4.json'; +explain select count(*) from with_cluster_index.tbl_0 where col_0 < 5429 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8 + └─IndexRangeScan_16 798.90 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,5429), keep order:false +explain select count(*) from wout_cluster_index.tbl_0 where col_0 < 5429 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#9)->Column#7 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#9 + └─IndexRangeScan_16 798.90 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,5429), keep order:false +explain select count(*) from with_cluster_index.tbl_0 where col_0 < 41 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8 + └─IndexRangeScan_16 41.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,41), keep order:false +explain select count(*) from wout_cluster_index.tbl_0 where col_0 < 41 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#9)->Column#7 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#9 + └─IndexRangeScan_16 41.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,41), keep order:false +explain select col_14 from with_cluster_index.tbl_2 where col_11 <> '2013-11-01' ; +id estRows task access object operator info +Projection_4 4509.00 root with_cluster_index.tbl_2.col_14 +└─IndexReader_6 4509.00 root index:IndexRangeScan_5 + └─IndexRangeScan_5 4509.00 cop[tikv] table:tbl_2, index:idx_9(col_11) range:[-inf,2013-11-01 00:00:00), (2013-11-01 00:00:00,+inf], keep order:false +explain select col_14 from wout_cluster_index.tbl_2 where col_11 <> '2013-11-01' ; +id estRows task access object operator info +Projection_4 4509.00 root wout_cluster_index.tbl_2.col_14 +└─TableReader_7 4509.00 root data:Selection_6 + └─Selection_6 4509.00 cop[tikv] ne(wout_cluster_index.tbl_2.col_11, 2013-11-01 00:00:00.000000) + └─TableFullScan_5 4673.00 cop[tikv] table:tbl_2 keep order:false +explain select sum( col_4 ) from with_cluster_index.tbl_0 where col_3 != '1993-12-02' ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:sum(Column#8)->Column#6 +└─TableReader_18 1.00 root data:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:sum(with_cluster_index.tbl_0.col_4)->Column#8 + └─TableRangeScan_16 2244.00 cop[tikv] table:tbl_0 range:[-inf,1993-12-02 00:00:00), (1993-12-02 00:00:00,+inf], keep order:false +explain select sum( col_4 ) from wout_cluster_index.tbl_0 where col_3 != '1993-12-02' ; +id estRows task access object operator info +StreamAgg_37 1.00 root funcs:sum(Column#20)->Column#7 +└─TableReader_38 1.00 root data:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:sum(wout_cluster_index.tbl_0.col_4)->Column#20 + └─Selection_36 2244.00 cop[tikv] ne(wout_cluster_index.tbl_0.col_3, 1993-12-02 00:00:00.000000) + └─TableFullScan_35 2244.00 cop[tikv] table:tbl_0 keep order:false +explain select col_0 from with_cluster_index.tbl_0 where col_0 <= 0 ; +id estRows task access object operator info +IndexReader_6 1.00 root index:IndexRangeScan_5 +└─IndexRangeScan_5 1.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,0], keep order:false +explain select col_0 from wout_cluster_index.tbl_0 where col_0 <= 0 ; +id estRows task access object operator info +IndexReader_6 1.00 root index:IndexRangeScan_5 +└─IndexRangeScan_5 1.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,0], keep order:false +explain select col_3 from with_cluster_index.tbl_0 where col_3 >= '1981-09-15' ; +id estRows task access object operator info +TableReader_6 1859.31 root data:TableRangeScan_5 +└─TableRangeScan_5 1859.31 cop[tikv] table:tbl_0 range:[1981-09-15 00:00:00,+inf], keep order:false +explain select col_3 from wout_cluster_index.tbl_0 where col_3 >= '1981-09-15' ; +id estRows task access object operator info +IndexReader_10 1859.31 root index:IndexRangeScan_9 +└─IndexRangeScan_9 1859.31 cop[tikv] table:tbl_0, index:idx_2(col_3) range:[1981-09-15 00:00:00,+inf], keep order:false +explain select tbl_2.col_14 , tbl_0.col_1 from with_cluster_index.tbl_2 right join with_cluster_index.tbl_0 on col_3 = col_11 ; +id estRows task access object operator info +MergeJoin_6 2533.51 root right outer join, left key:with_cluster_index.tbl_2.col_11, right key:with_cluster_index.tbl_0.col_3 +├─IndexReader_21(Build) 4509.00 root index:IndexFullScan_20 +│ └─IndexFullScan_20 4509.00 cop[tikv] table:tbl_2, index:idx_9(col_11) keep order:true +└─TableReader_23(Probe) 2244.00 root data:TableFullScan_22 + └─TableFullScan_22 2244.00 cop[tikv] table:tbl_0 keep order:true +explain select tbl_2.col_14 , tbl_0.col_1 from wout_cluster_index.tbl_2 right join wout_cluster_index.tbl_0 on col_3 = col_11 ; +id estRows task access object operator info +HashJoin_22 2533.51 root right outer join, equal:[eq(wout_cluster_index.tbl_2.col_11, wout_cluster_index.tbl_0.col_3)] +├─TableReader_40(Build) 2244.00 root data:TableFullScan_39 +│ └─TableFullScan_39 2244.00 cop[tikv] table:tbl_0 keep order:false +└─TableReader_43(Probe) 4509.00 root data:Selection_42 + └─Selection_42 4509.00 cop[tikv] not(isnull(wout_cluster_index.tbl_2.col_11)) + └─TableFullScan_41 4673.00 cop[tikv] table:tbl_2 keep order:false +explain select count(*) from with_cluster_index.tbl_0 where col_0 <= 0 ; +id estRows task access object operator info +StreamAgg_16 1.00 root funcs:count(Column#8)->Column#6 +└─IndexReader_17 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8 + └─IndexRangeScan_11 1.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,0], keep order:false +explain select count(*) from wout_cluster_index.tbl_0 where col_0 <= 0 ; +id estRows task access object operator info +StreamAgg_16 1.00 root funcs:count(Column#9)->Column#7 +└─IndexReader_17 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#9 + └─IndexRangeScan_11 1.00 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[-inf,0], keep order:false +explain select count(*) from with_cluster_index.tbl_0 where col_0 >= 803163 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#8)->Column#6 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#8 + └─IndexRangeScan_16 109.70 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[803163,+inf], keep order:false +explain select count(*) from wout_cluster_index.tbl_0 where col_0 >= 803163 ; +id estRows task access object operator info +StreamAgg_17 1.00 root funcs:count(Column#9)->Column#7 +└─IndexReader_18 1.00 root index:StreamAgg_9 + └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#9 + └─IndexRangeScan_16 109.70 cop[tikv] table:tbl_0, index:idx_3(col_0) range:[803163,+inf], keep order:false diff --git a/cmd/explaintest/r/explain-non-select-stmt.result b/cmd/explaintest/r/explain-non-select-stmt.result index 51337c7b18aa0..cdfdf56d4cc2f 100644 --- a/cmd/explaintest/r/explain-non-select-stmt.result +++ b/cmd/explaintest/r/explain-non-select-stmt.result @@ -1,29 +1,29 @@ use test; drop table if exists t; create table t(a bigint, b bigint); -explain insert into t values(1, 1); +explain format = 'brief' insert into t values(1, 1); id estRows task access object operator info -Insert_1 N/A root N/A -explain insert into t select * from t; +Insert N/A root N/A +explain format = 'brief' insert into t select * from t; id estRows task access object operator info -Insert_1 N/A root N/A -└─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain delete from t where a > 100; +Insert N/A root N/A +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' delete from t where a > 100; id estRows task access object operator info -Delete_4 N/A root N/A -└─TableReader_8 3333.33 root data:Selection_7 - └─Selection_7 3333.33 cop[tikv] gt(test.t.a, 100) - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain update t set b = 100 where a = 200; +Delete N/A root N/A +└─TableReader 3333.33 root data:Selection + └─Selection 3333.33 cop[tikv] gt(test.t.a, 100) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' update t set b = 100 where a = 200; id estRows task access object operator info -Update_4 N/A root N/A -└─TableReader_8 10.00 root data:Selection_7 - └─Selection_7 10.00 cop[tikv] eq(test.t.a, 200) - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain replace into t select a, 100 from t; +Update N/A root N/A +└─TableReader 10.00 root data:Selection + └─Selection 10.00 cop[tikv] eq(test.t.a, 200) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' replace into t select a, 100 from t; id estRows task access object operator info -Insert_1 N/A root N/A -└─Projection_5 10000.00 root test.t.a, 100->Column#6 - └─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Insert N/A root N/A +└─Projection 10000.00 root test.t.a, 100->Column#6 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain.result b/cmd/explaintest/r/explain.result index cd87312a0d2dd..259a7c49be9ea 100644 --- a/cmd/explaintest/r/explain.result +++ b/cmd/explaintest/r/explain.result @@ -26,21 +26,21 @@ drop table if exists t; create table t(id int primary key, a int, b int); set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; -explain select group_concat(a) from t group by id; +explain format = 'brief' select group_concat(a) from t group by id; id estRows task access object operator info -StreamAgg_8 8000.00 root group by:Column#6, funcs:group_concat(Column#5 separator ",")->Column#4 -└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, test.t.id - └─TableReader_15 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:true, stats:pseudo -explain select group_concat(a, b) from t group by id; +StreamAgg 8000.00 root group by:Column#6, funcs:group_concat(Column#5 separator ",")->Column#4 +└─Projection 10000.00 root cast(test.t.a, var_string(20))->Column#5, test.t.id + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:true, stats:pseudo +explain format = 'brief' select group_concat(a, b) from t group by id; id estRows task access object operator info -StreamAgg_8 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6 separator ",")->Column#4 -└─Projection_18 10000.00 root cast(test.t.a, var_string(20))->Column#5, cast(test.t.b, var_string(20))->Column#6, test.t.id - └─TableReader_15 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:true, stats:pseudo +StreamAgg 8000.00 root group by:Column#7, funcs:group_concat(Column#5, Column#6 separator ",")->Column#4 +└─Projection 10000.00 root cast(test.t.a, var_string(20))->Column#5, cast(test.t.b, var_string(20))->Column#6, test.t.id + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:true, stats:pseudo drop table t; drop view if exists v; create view v as select cast(replace(substring_index(substring_index("",',',1),':',-1),'"','') as CHAR(32)) as event_id; desc v; Field Type Null Key Default Extra -event_id varchar(32) YES NULL +event_id varchar(32) NO NULL diff --git a/cmd/explaintest/r/explain_complex.result b/cmd/explaintest/r/explain_complex.result index aecbf3a3e9be7..b3c79948a142e 100644 --- a/cmd/explaintest/r/explain_complex.result +++ b/cmd/explaintest/r/explain_complex.result @@ -103,72 +103,73 @@ CREATE TABLE `rr` ( `bm` tinyint(1) DEFAULT '0', PRIMARY KEY (`aid`,`dic`) ); -explain SELECT `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5`, count(dic) as install_device FROM `dt` use index (cmi) WHERE (`ds` >= '2016-09-01') AND (`ds` <= '2016-11-03') AND (`cm` IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5` ORDER BY `ds2` DESC; +explain format = 'brief' SELECT `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5`, count(dic) as install_device FROM `dt` use index (cmi) WHERE (`ds` >= '2016-09-01') AND (`ds` <= '2016-11-03') AND (`cm` IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5` ORDER BY `ds2` DESC; id estRows task access object operator info -Projection_7 53.00 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 -└─Sort_8 53.00 root test.dt.ds2:desc - └─HashAgg_16 53.00 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 - └─IndexLookUp_17 53.00 root - ├─IndexRangeScan_13(Build) 2650.00 cop[tikv] table:dt, index:cmi(cm) range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false, stats:pseudo - └─HashAgg_11(Probe) 53.00 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 - └─Selection_15 66.25 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) - └─TableRowIDScan_14 2650.00 cop[tikv] table:dt keep order:false, stats:pseudo -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; +Projection 53.00 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 +└─Sort 53.00 root test.dt.ds2:desc + └─HashAgg 53.00 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 + └─IndexLookUp 53.00 root + ├─IndexRangeScan(Build) 2650.00 cop[tikv] table:dt, index:cmi(cm) range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false, stats:pseudo + └─HashAgg(Probe) 53.00 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 + └─Selection 66.25 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) + └─TableRowIDScan 2650.00 cop[tikv] table:dt keep order:false, stats:pseudo +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; id estRows task access object operator info -Projection_13 1.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t -└─Limit_16 1.00 root offset:0, count:2500 - └─HashAgg_19 1.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t - └─HashJoin_34 0.00 root inner join, equal:[eq(test.dd.aid, test.st.aid) eq(test.dd.ip, test.st.ip)], other cond:gt(test.dd.t, test.st.t) - ├─IndexLookUp_52(Build) 0.00 root - │ ├─IndexRangeScan_49(Build) 3333.33 cop[tikv] table:dd, index:t(t) range:(1478143908,+inf], keep order:false, stats:pseudo - │ └─Selection_51(Probe) 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), not(isnull(test.dd.ip)) - │ └─TableRowIDScan_50 3333.33 cop[tikv] table:dd keep order:false, stats:pseudo - └─IndexLookUp_41(Probe) 3.33 root - ├─IndexRangeScan_38(Build) 3333.33 cop[tikv] table:gad, index:t(t) range:(1478143908,+inf], keep order:false, stats:pseudo - └─Selection_40(Probe) 3.33 cop[tikv] eq(test.st.pt, "android"), not(isnull(test.st.ip)) - └─TableRowIDScan_39 3333.33 cop[tikv] table:gad keep order:false, stats:pseudo -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; +Projection 1.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t +└─Limit 1.00 root offset:0, count:2500 + └─HashAgg 1.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t + └─Projection 0.00 root test.st.id, test.st.aid, test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t, test.dd.id, test.dd.dic, test.dd.ip, test.dd.t + └─HashJoin 0.00 root inner join, equal:[eq(test.dd.aid, test.st.aid) eq(test.dd.ip, test.st.ip)], other cond:gt(test.dd.t, test.st.t) + ├─IndexLookUp(Build) 0.00 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:dd, index:t(t) range:(1478143908,+inf], keep order:false, stats:pseudo + │ └─Selection(Probe) 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), not(isnull(test.dd.ip)) + │ └─TableRowIDScan 3333.33 cop[tikv] table:dd keep order:false, stats:pseudo + └─IndexLookUp(Probe) 3.33 root + ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:gad, index:t(t) range:(1478143908,+inf], keep order:false, stats:pseudo + └─Selection(Probe) 3.33 cop[tikv] eq(test.st.pt, "android"), not(isnull(test.st.ip)) + └─TableRowIDScan 3333.33 cop[tikv] table:gad keep order:false, stats:pseudo +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; id estRows task access object operator info -Projection_10 0.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext -└─Limit_13 0.00 root offset:0, count:3000 - └─IndexMergeJoin_26 0.00 root inner join, inner:IndexLookUp_24, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.st.dic, test.dd.mac), lt(test.st.t, test.dd.t) - ├─IndexLookUp_35(Build) 0.00 root - │ ├─IndexRangeScan_32(Build) 3333.33 cop[tikv] table:gad, index:t(t) range:(1477971479,+inf], keep order:false, stats:pseudo - │ └─Selection_34(Probe) 0.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), not(isnull(test.st.dic)) - │ └─TableRowIDScan_33 3333.33 cop[tikv] table:gad keep order:false, stats:pseudo - └─IndexLookUp_24(Probe) 0.00 root - ├─IndexRangeScan_21(Build) 10000.00 cop[tikv] table:sdk, index:aid(aid, dic) range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true, stats:pseudo - └─Selection_23(Probe) 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) - └─TableRowIDScan_22 10000.00 cop[tikv] table:sdk keep order:false, stats:pseudo -explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; +Projection 0.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext +└─Limit 0.00 root offset:0, count:3000 + └─IndexJoin 0.00 root inner join, inner:IndexLookUp, outer key:test.st.aid, inner key:test.dd.aid, equal cond:eq(test.st.aid, test.dd.aid), eq(test.st.dic, test.dd.mac), other cond:lt(test.st.t, test.dd.t) + ├─IndexLookUp(Build) 0.00 root + │ ├─IndexRangeScan(Build) 3333.33 cop[tikv] table:gad, index:t(t) range:(1477971479,+inf], keep order:false, stats:pseudo + │ └─Selection(Probe) 0.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), not(isnull(test.st.dic)) + │ └─TableRowIDScan 3333.33 cop[tikv] table:gad keep order:false, stats:pseudo + └─IndexLookUp(Probe) 0.00 root + ├─IndexRangeScan(Build) 10000.00 cop[tikv] table:sdk, index:aid(aid, dic) range: decided by [eq(test.dd.aid, test.st.aid)], keep order:false, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) + └─TableRowIDScan 10000.00 cop[tikv] table:sdk keep order:false, stats:pseudo +explain format = 'brief' SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; id estRows task access object operator info -Projection_5 1.00 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 -└─HashAgg_6 1.00 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 - └─IndexLookUp_13 0.00 root - ├─IndexRangeScan_10(Build) 250.00 cop[tikv] table:st, index:t(t) range:[1478188800,1478275200], keep order:false, stats:pseudo - └─Selection_12(Probe) 0.00 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") - └─TableRowIDScan_11 250.00 cop[tikv] table:st keep order:false, stats:pseudo -explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; +Projection 1.00 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 +└─HashAgg 1.00 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 + └─IndexLookUp 0.00 root + ├─IndexRangeScan(Build) 250.00 cop[tikv] table:st, index:t(t) range:[1478188800,1478275200], keep order:false, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") + └─TableRowIDScan 250.00 cop[tikv] table:st keep order:false, stats:pseudo +explain format = 'brief' select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; id estRows task access object operator info -Projection_10 0.00 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 -└─Limit_13 0.00 root offset:0, count:2000 - └─IndexMergeJoin_43 0.00 root inner join, inner:IndexLookUp_41, outer key:test.rr.aid, test.rr.dic, inner key:test.dt.aid, test.dt.dic - ├─TableReader_61(Build) 3.33 root data:Selection_60 - │ └─Selection_60 3.33 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) - │ └─TableFullScan_59 10000.00 cop[tikv] table:rr keep order:false, stats:pseudo - └─IndexLookUp_41(Probe) 0.00 root - ├─Selection_39(Build) 1.00 cop[tikv] not(isnull(test.dt.dic)) - │ └─IndexRangeScan_37 1.00 cop[tikv] table:dt, index:aid(aid, dic) range: decided by [eq(test.dt.aid, test.rr.aid) eq(test.dt.dic, test.rr.dic)], keep order:true, stats:pseudo - └─Selection_40(Probe) 0.00 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592) - └─TableRowIDScan_38 1.00 cop[tikv] table:dt keep order:false, stats:pseudo -explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; +Projection 0.01 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 +└─Limit 0.01 root offset:0, count:2000 + └─IndexJoin 0.01 root inner join, inner:IndexLookUp, outer key:test.rr.aid, test.rr.dic, inner key:test.dt.aid, test.dt.dic, equal cond:eq(test.rr.aid, test.dt.aid), eq(test.rr.dic, test.dt.dic) + ├─TableReader(Build) 3.33 root data:Selection + │ └─Selection 3.33 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) + │ └─TableFullScan 10000.00 cop[tikv] table:rr keep order:false, stats:pseudo + └─IndexLookUp(Probe) 0.00 root + ├─Selection(Build) 1.00 cop[tikv] not(isnull(test.dt.dic)) + │ └─IndexRangeScan 1.00 cop[tikv] table:dt, index:aid(aid, dic) range: decided by [eq(test.dt.aid, test.rr.aid) eq(test.dt.dic, test.rr.dic)], keep order:false, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592) + └─TableRowIDScan 1.00 cop[tikv] table:dt keep order:false, stats:pseudo +explain format = 'brief' select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; id estRows task access object operator info -Projection_5 1.00 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 -└─HashAgg_6 1.00 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr - └─IndexLookUp_21 0.00 root - ├─IndexRangeScan_18(Build) 0.40 cop[tikv] table:pp, index:sp(uid, pi) range:[18089709 510017,18089709 510017], [18089709 520017,18089709 520017], [18090780 510017,18090780 510017], [18090780 520017,18090780 520017], keep order:false, stats:pseudo - └─Selection_20(Probe) 0.00 cop[tikv] eq(test.pp.ps, 2), ge(test.pp.ppt, 1478188800), lt(test.pp.ppt, 1478275200) - └─TableRowIDScan_19 0.40 cop[tikv] table:pp keep order:false, stats:pseudo +Projection 1.00 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 +└─HashAgg 1.00 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr + └─IndexLookUp 0.00 root + ├─IndexRangeScan(Build) 0.40 cop[tikv] table:pp, index:sp(uid, pi) range:[18089709 510017,18089709 510017], [18089709 520017,18089709 520017], [18090780 510017,18090780 510017], [18090780 520017,18090780 520017], keep order:false, stats:pseudo + └─Selection(Probe) 0.00 cop[tikv] eq(test.pp.ps, 2), ge(test.pp.ppt, 1478188800), lt(test.pp.ppt, 1478275200) + └─TableRowIDScan 0.40 cop[tikv] table:pp keep order:false, stats:pseudo CREATE TABLE `tbl_001` (`a` int, `b` int); CREATE TABLE `tbl_002` (`a` int, `b` int); CREATE TABLE `tbl_003` (`a` int, `b` int); @@ -178,29 +179,29 @@ CREATE TABLE `tbl_006` (`a` int, `b` int); CREATE TABLE `tbl_007` (`a` int, `b` int); CREATE TABLE `tbl_008` (`a` int, `b` int); CREATE TABLE `tbl_009` (`a` int, `b` int); -explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; +explain format = 'brief' select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; id estRows task access object operator info -HashAgg_34 72000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 -└─Projection_63 90000.00 root cast(Column#28, decimal(65,0) BINARY)->Column#31, Column#29 - └─Union_35 90000.00 root - ├─TableReader_38 10000.00 root data:TableFullScan_37 - │ └─TableFullScan_37 10000.00 cop[tikv] table:tbl_001 keep order:false, stats:pseudo - ├─TableReader_41 10000.00 root data:TableFullScan_40 - │ └─TableFullScan_40 10000.00 cop[tikv] table:tbl_002 keep order:false, stats:pseudo - ├─TableReader_44 10000.00 root data:TableFullScan_43 - │ └─TableFullScan_43 10000.00 cop[tikv] table:tbl_003 keep order:false, stats:pseudo - ├─TableReader_47 10000.00 root data:TableFullScan_46 - │ └─TableFullScan_46 10000.00 cop[tikv] table:tbl_004 keep order:false, stats:pseudo - ├─TableReader_50 10000.00 root data:TableFullScan_49 - │ └─TableFullScan_49 10000.00 cop[tikv] table:tbl_005 keep order:false, stats:pseudo - ├─TableReader_53 10000.00 root data:TableFullScan_52 - │ └─TableFullScan_52 10000.00 cop[tikv] table:tbl_006 keep order:false, stats:pseudo - ├─TableReader_56 10000.00 root data:TableFullScan_55 - │ └─TableFullScan_55 10000.00 cop[tikv] table:tbl_007 keep order:false, stats:pseudo - ├─TableReader_59 10000.00 root data:TableFullScan_58 - │ └─TableFullScan_58 10000.00 cop[tikv] table:tbl_008 keep order:false, stats:pseudo - └─TableReader_62 10000.00 root data:TableFullScan_61 - └─TableFullScan_61 10000.00 cop[tikv] table:tbl_009 keep order:false, stats:pseudo +HashAgg 72000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 +└─Projection 90000.00 root cast(Column#28, decimal(32,0) BINARY)->Column#31, Column#29 + └─Union 90000.00 root + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_001 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_002 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_003 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_004 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_005 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_006 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_007 keep order:false, stats:pseudo + ├─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tbl_008 keep order:false, stats:pseudo + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:tbl_009 keep order:false, stats:pseudo CREATE TABLE org_department ( id int(11) NOT NULL AUTO_INCREMENT, ctx int(11) DEFAULT '0' COMMENT 'organization id', @@ -241,22 +242,22 @@ created_on datetime DEFAULT NULL, updated_on datetime DEFAULT NULL, UNIQUE KEY org_employee_position_pk (hotel_id,user_id,position_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -explain SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; +explain format = 'brief' SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; id estRows task access object operator info -Sort_10 1.00 root test.org_department.left_value -└─HashAgg_15 1.00 root group by:test.org_department.id, funcs:firstrow(test.org_department.id)->test.org_department.id, funcs:firstrow(test.org_department.ctx)->test.org_department.ctx, funcs:firstrow(test.org_department.name)->test.org_department.name, funcs:firstrow(test.org_department.left_value)->test.org_department.left_value, funcs:firstrow(test.org_department.right_value)->test.org_department.right_value, funcs:firstrow(test.org_department.depth)->test.org_department.depth, funcs:firstrow(test.org_department.leader_id)->test.org_department.leader_id, funcs:firstrow(test.org_department.status)->test.org_department.status, funcs:firstrow(test.org_department.created_on)->test.org_department.created_on, funcs:firstrow(test.org_department.updated_on)->test.org_department.updated_on - └─Selection_22 0.01 root or(eq(test.org_employee_position.user_id, 62), or(eq(test.org_department.id, 20), eq(test.org_department.id, 20))) - └─HashJoin_24 0.02 root left outer join, equal:[eq(test.org_position.id, test.org_employee_position.position_id)] - ├─IndexMergeJoin_42(Build) 0.01 root left outer join, inner:IndexLookUp_40, outer key:test.org_department.id, inner key:test.org_position.department_id - │ ├─IndexLookUp_62(Build) 0.01 root - │ │ ├─IndexRangeScan_59(Build) 10.00 cop[tikv] table:d, index:org_department_ctx_index(ctx) range:[1,1], keep order:false, stats:pseudo - │ │ └─Selection_61(Probe) 0.01 cop[tikv] eq(test.org_department.status, 1000) - │ │ └─TableRowIDScan_60 10.00 cop[tikv] table:d keep order:false, stats:pseudo - │ └─IndexLookUp_40(Probe) 1.25 root - │ ├─Selection_38(Build) 1250.00 cop[tikv] not(isnull(test.org_position.department_id)) - │ │ └─IndexRangeScan_36 1251.25 cop[tikv] table:p, index:org_position_department_id_index(department_id) range: decided by [eq(test.org_position.department_id, test.org_department.id)], keep order:true, stats:pseudo - │ └─Selection_39(Probe) 1.25 cop[tikv] eq(test.org_position.status, 1000) - │ └─TableRowIDScan_37 1250.00 cop[tikv] table:p keep order:false, stats:pseudo - └─TableReader_72(Probe) 9.99 root data:Selection_71 - └─Selection_71 9.99 cop[tikv] eq(test.org_employee_position.status, 1000), not(isnull(test.org_employee_position.position_id)) - └─TableFullScan_70 10000.00 cop[tikv] table:ep keep order:false, stats:pseudo +Sort 1.00 root test.org_department.left_value +└─HashAgg 1.00 root group by:test.org_department.id, funcs:firstrow(test.org_department.id)->test.org_department.id, funcs:firstrow(test.org_department.ctx)->test.org_department.ctx, funcs:firstrow(test.org_department.name)->test.org_department.name, funcs:firstrow(test.org_department.left_value)->test.org_department.left_value, funcs:firstrow(test.org_department.right_value)->test.org_department.right_value, funcs:firstrow(test.org_department.depth)->test.org_department.depth, funcs:firstrow(test.org_department.leader_id)->test.org_department.leader_id, funcs:firstrow(test.org_department.status)->test.org_department.status, funcs:firstrow(test.org_department.created_on)->test.org_department.created_on, funcs:firstrow(test.org_department.updated_on)->test.org_department.updated_on + └─Selection 0.01 root or(eq(test.org_employee_position.user_id, 62), or(eq(test.org_department.id, 20), eq(test.org_department.id, 20))) + └─HashJoin 0.02 root left outer join, equal:[eq(test.org_position.id, test.org_employee_position.position_id)] + ├─IndexJoin(Build) 0.01 root left outer join, inner:IndexLookUp, outer key:test.org_department.id, inner key:test.org_position.department_id, equal cond:eq(test.org_department.id, test.org_position.department_id) + │ ├─IndexLookUp(Build) 0.01 root + │ │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:d, index:org_department_ctx_index(ctx) range:[1,1], keep order:false, stats:pseudo + │ │ └─Selection(Probe) 0.01 cop[tikv] eq(test.org_department.status, 1000) + │ │ └─TableRowIDScan 10.00 cop[tikv] table:d keep order:false, stats:pseudo + │ └─IndexLookUp(Probe) 1.25 root + │ ├─Selection(Build) 1250.00 cop[tikv] not(isnull(test.org_position.department_id)) + │ │ └─IndexRangeScan 1251.25 cop[tikv] table:p, index:org_position_department_id_index(department_id) range: decided by [eq(test.org_position.department_id, test.org_department.id)], keep order:false, stats:pseudo + │ └─Selection(Probe) 1.25 cop[tikv] eq(test.org_position.status, 1000) + │ └─TableRowIDScan 1250.00 cop[tikv] table:p keep order:false, stats:pseudo + └─TableReader(Probe) 9.99 root data:Selection + └─Selection 9.99 cop[tikv] eq(test.org_employee_position.status, 1000), not(isnull(test.org_employee_position.position_id)) + └─TableFullScan 10000.00 cop[tikv] table:ep keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain_complex_stats.result b/cmd/explaintest/r/explain_complex_stats.result index 6aac4462e7763..46fed25d76094 100644 --- a/cmd/explaintest/r/explain_complex_stats.result +++ b/cmd/explaintest/r/explain_complex_stats.result @@ -113,69 +113,68 @@ bm tinyint(1) DEFAULT '0' comment '[[set=0,1]]', PRIMARY KEY (aid,dic) ); load stats 's/explain_complex_stats_rr.json'; -explain SELECT ds, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(dic) as install_device FROM dt use index (cm) WHERE (ds >= '2016-09-01') AND (ds <= '2016-11-03') AND (cm IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY ds, p1, p2, p3, p4, p5, p6_md5, p7_md5 ORDER BY ds2 DESC; +explain format = 'brief' SELECT ds, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(dic) as install_device FROM dt use index (cm) WHERE (ds >= '2016-09-01') AND (ds <= '2016-11-03') AND (cm IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY ds, p1, p2, p3, p4, p5, p6_md5, p7_md5 ORDER BY ds2 DESC; id estRows task access object operator info -Projection_7 21.53 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 -└─Sort_8 21.53 root test.dt.ds2:desc - └─HashAgg_16 21.53 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 - └─IndexLookUp_17 21.53 root - ├─IndexRangeScan_13(Build) 128.32 cop[tikv] table:dt, index:cm(cm) range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false - └─HashAgg_11(Probe) 21.53 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 - └─Selection_15 21.56 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) - └─TableRowIDScan_14 128.32 cop[tikv] table:dt keep order:false -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.bm = 0 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; +Projection 21.53 root test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, Column#21 +└─Sort 21.53 root test.dt.ds2:desc + └─HashAgg 21.53 root group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(Column#32)->Column#21, funcs:firstrow(test.dt.ds)->test.dt.ds, funcs:firstrow(Column#34)->test.dt.ds2, funcs:firstrow(test.dt.p1)->test.dt.p1, funcs:firstrow(test.dt.p2)->test.dt.p2, funcs:firstrow(test.dt.p3)->test.dt.p3, funcs:firstrow(test.dt.p4)->test.dt.p4, funcs:firstrow(test.dt.p5)->test.dt.p5, funcs:firstrow(test.dt.p6_md5)->test.dt.p6_md5, funcs:firstrow(test.dt.p7_md5)->test.dt.p7_md5 + └─IndexLookUp 21.53 root + ├─IndexRangeScan(Build) 128.32 cop[tikv] table:dt, index:cm(cm) range:[1062,1062], [1086,1086], [1423,1423], [1424,1424], [1425,1425], [1426,1426], [1427,1427], [1428,1428], [1429,1429], [1430,1430], [1431,1431], [1432,1432], [1433,1433], [1434,1434], [1435,1435], [1436,1436], [1437,1437], [1438,1438], [1439,1439], [1440,1440], [1441,1441], [1442,1442], [1443,1443], [1444,1444], [1445,1445], [1446,1446], [1447,1447], [1448,1448], [1449,1449], [1450,1450], [1451,1451], [1452,1452], [1488,1488], [1489,1489], [1490,1490], [1491,1491], [1492,1492], [1493,1493], [1494,1494], [1495,1495], [1496,1496], [1497,1497], [1550,1550], [1551,1551], [1552,1552], [1553,1553], [1554,1554], [1555,1555], [1556,1556], [1557,1557], [1558,1558], [1559,1559], [1597,1597], [1598,1598], [1599,1599], [1600,1600], [1601,1601], [1602,1602], [1603,1603], [1604,1604], [1605,1605], [1606,1606], [1607,1607], [1608,1608], [1609,1609], [1610,1610], [1611,1611], [1612,1612], [1613,1613], [1614,1614], [1615,1615], [1616,1616], [1623,1623], [1624,1624], [1625,1625], [1626,1626], [1627,1627], [1628,1628], [1629,1629], [1630,1630], [1631,1631], [1632,1632], [1709,1709], [1719,1719], [1720,1720], [1843,1843], [2813,2813], [2814,2814], [2815,2815], [2816,2816], [2817,2817], [2818,2818], [2819,2819], [2820,2820], [2821,2821], [2822,2822], [2823,2823], [2824,2824], [2825,2825], [2826,2826], [2827,2827], [2828,2828], [2829,2829], [2830,2830], [2831,2831], [2832,2832], [2833,2833], [2834,2834], [2835,2835], [2836,2836], [2837,2837], [2838,2838], [2839,2839], [2840,2840], [2841,2841], [2842,2842], [2843,2843], [2844,2844], [2845,2845], [2846,2846], [2847,2847], [2848,2848], [2849,2849], [2850,2850], [2851,2851], [2852,2852], [2853,2853], [2854,2854], [2855,2855], [2856,2856], [2857,2857], [2858,2858], [2859,2859], [2860,2860], [2861,2861], [2862,2862], [2863,2863], [2864,2864], [2865,2865], [2866,2866], [2867,2867], [2868,2868], [2869,2869], [2870,2870], [2871,2871], [2872,2872], [3139,3139], [3140,3140], [3141,3141], [3142,3142], [3143,3143], [3144,3144], [3145,3145], [3146,3146], [3147,3147], [3148,3148], [3149,3149], [3150,3150], [3151,3151], [3152,3152], [3153,3153], [3154,3154], [3155,3155], [3156,3156], [3157,3157], [3158,3158], [3386,3386], [3387,3387], [3388,3388], [3389,3389], [3390,3390], [3391,3391], [3392,3392], [3393,3393], [3394,3394], [3395,3395], [3664,3664], [3665,3665], [3666,3666], [3667,3667], [3668,3668], [3670,3670], [3671,3671], [3672,3672], [3673,3673], [3674,3674], [3676,3676], [3677,3677], [3678,3678], [3679,3679], [3680,3680], [3681,3681], [3682,3682], [3683,3683], [3684,3684], [3685,3685], [3686,3686], [3687,3687], [3688,3688], [3689,3689], [3690,3690], [3691,3691], [3692,3692], [3693,3693], [3694,3694], [3695,3695], [3696,3696], [3697,3697], [3698,3698], [3699,3699], [3700,3700], [3701,3701], [3702,3702], [3703,3703], [3704,3704], [3705,3705], [3706,3706], [3707,3707], [3708,3708], [3709,3709], [3710,3710], [3711,3711], [3712,3712], [3713,3713], [3714,3714], [3715,3715], [3960,3960], [3961,3961], [3962,3962], [3963,3963], [3964,3964], [3965,3965], [3966,3966], [3967,3967], [3968,3968], [3978,3978], [3979,3979], [3980,3980], [3981,3981], [3982,3982], [3983,3983], [3984,3984], [3985,3985], [3986,3986], [3987,3987], [4208,4208], [4209,4209], [4210,4210], [4211,4211], [4212,4212], [4304,4304], [4305,4305], [4306,4306], [4307,4307], [4308,4308], [4866,4866], [4867,4867], [4868,4868], [4869,4869], [4870,4870], [4871,4871], [4872,4872], [4873,4873], [4874,4874], [4875,4875], keep order:false + └─HashAgg(Probe) 21.53 cop[tikv] group by:test.dt.ds, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5, funcs:count(test.dt.dic)->Column#32, funcs:firstrow(test.dt.ds2)->Column#34 + └─Selection 21.56 cop[tikv] ge(test.dt.ds, 2016-09-01 00:00:00.000000), le(test.dt.ds, 2016-11-03 00:00:00.000000) + └─TableRowIDScan 128.32 cop[tikv] table:dt keep order:false +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.bm = 0 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; id estRows task access object operator info -Projection_13 424.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t -└─Limit_16 424.00 root offset:0, count:2500 - └─HashAgg_19 424.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t - └─HashJoin_34 424.00 root inner join, equal:[eq(test.st.aid, test.dd.aid) eq(test.st.ip, test.dd.ip)], other cond:gt(test.dd.t, test.st.t) - ├─TableReader_37(Build) 424.00 root data:Selection_36 - │ └─Selection_36 424.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.pt, "android"), gt(test.st.t, 1478143908), not(isnull(test.st.ip)) - │ └─TableRangeScan_35 1999.00 cop[tikv] table:gad range:[0,+inf], keep order:false - └─TableReader_44(Probe) 455.80 root data:Selection_43 - └─Selection_43 455.80 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), gt(test.dd.t, 1478143908), not(isnull(test.dd.ip)), not(isnull(test.dd.t)) - └─TableRangeScan_42 2000.00 cop[tikv] table:dd range:[0,+inf], keep order:false -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; +Projection 424.00 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext, test.st.t +└─Limit 424.00 root offset:0, count:2500 + └─HashAgg 424.00 root group by:test.dd.dic, test.st.aid, funcs:firstrow(test.st.id)->test.st.id, funcs:firstrow(test.st.aid)->test.st.aid, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5, funcs:firstrow(test.st.ext)->test.st.ext, funcs:firstrow(test.st.t)->test.st.t, funcs:firstrow(test.dd.id)->test.dd.id, funcs:firstrow(test.dd.dic)->test.dd.dic, funcs:firstrow(test.dd.ip)->test.dd.ip, funcs:firstrow(test.dd.t)->test.dd.t + └─HashJoin 424.00 root inner join, equal:[eq(test.st.aid, test.dd.aid) eq(test.st.ip, test.dd.ip)], other cond:gt(test.dd.t, test.st.t) + ├─TableReader(Build) 424.00 root data:Selection + │ └─Selection 424.00 cop[tikv] eq(test.st.bm, 0), eq(test.st.pt, "android"), gt(test.st.t, 1478143908), not(isnull(test.st.ip)) + │ └─TableRangeScan 1999.00 cop[tikv] table:gad range:[0,+inf], keep order:false + └─TableReader(Probe) 455.80 root data:Selection + └─Selection 455.80 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "android"), gt(test.dd.t, 1478143908), not(isnull(test.dd.ip)), not(isnull(test.dd.t)) + └─TableRangeScan 2000.00 cop[tikv] table:dd range:[0,+inf], keep order:false +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; id estRows task access object operator info -Projection_10 170.34 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext -└─Limit_13 170.34 root offset:0, count:3000 - └─IndexMergeJoin_26 170.34 root inner join, inner:IndexLookUp_24, outer key:test.st.aid, inner key:test.dd.aid, other cond:eq(test.st.dic, test.dd.mac), lt(test.st.t, test.dd.t) - ├─TableReader_31(Build) 170.34 root data:Selection_30 - │ └─Selection_30 170.34 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), gt(test.st.t, 1477971479), not(isnull(test.st.dic)) - │ └─TableRangeScan_29 1999.00 cop[tikv] table:gad range:[0,+inf], keep order:false - └─IndexLookUp_24(Probe) 1.00 root - ├─IndexRangeScan_21(Build) 3.93 cop[tikv] table:sdk, index:aid(aid, dic) range: decided by [eq(test.dd.aid, test.st.aid)], keep order:true - └─Selection_23(Probe) 1.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) - └─TableRowIDScan_22 3.93 cop[tikv] table:sdk keep order:false -explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; +Projection 170.34 root test.st.id, test.dd.id, test.st.aid, test.st.cm, test.dd.dic, test.dd.ip, test.dd.t, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, test.st.ext +└─Limit 170.34 root offset:0, count:3000 + └─IndexJoin 170.34 root inner join, inner:IndexLookUp, outer key:test.st.aid, inner key:test.dd.aid, equal cond:eq(test.st.aid, test.dd.aid), eq(test.st.dic, test.dd.mac), other cond:lt(test.st.t, test.dd.t) + ├─TableReader(Build) 170.34 root data:Selection + │ └─Selection 170.34 cop[tikv] eq(test.st.bm, 0), eq(test.st.dit, "mac"), eq(test.st.pt, "ios"), gt(test.st.t, 1477971479), not(isnull(test.st.dic)) + │ └─TableRangeScan 1999.00 cop[tikv] table:gad range:[0,+inf], keep order:false + └─IndexLookUp(Probe) 1.00 root + ├─IndexRangeScan(Build) 3.93 cop[tikv] table:sdk, index:aid(aid, dic) range: decided by [eq(test.dd.aid, test.st.aid)], keep order:false + └─Selection(Probe) 1.00 cop[tikv] eq(test.dd.bm, 0), eq(test.dd.pt, "ios"), gt(test.dd.t, 1477971479), not(isnull(test.dd.mac)), not(isnull(test.dd.t)) + └─TableRowIDScan 3.93 cop[tikv] table:sdk keep order:false +explain format = 'brief' SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; id estRows task access object operator info -Projection_5 39.28 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 -└─HashAgg_6 39.28 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 - └─IndexLookUp_13 39.38 root - ├─IndexRangeScan_10(Build) 160.23 cop[tikv] table:st, index:t(t) range:[1478188800,1478275200], keep order:false - └─Selection_12(Probe) 39.38 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") - └─TableRowIDScan_11 160.23 cop[tikv] table:st keep order:false -explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; +Projection 39.28 root test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, Column#20, Column#21 +└─HashAgg 39.28 root group by:test.st.cm, test.st.p1, test.st.p2, test.st.p3, test.st.p4, test.st.p5, test.st.p6_md5, test.st.p7_md5, funcs:count(1)->Column#20, funcs:count(distinct test.st.ip)->Column#21, funcs:firstrow(test.st.cm)->test.st.cm, funcs:firstrow(test.st.p1)->test.st.p1, funcs:firstrow(test.st.p2)->test.st.p2, funcs:firstrow(test.st.p3)->test.st.p3, funcs:firstrow(test.st.p4)->test.st.p4, funcs:firstrow(test.st.p5)->test.st.p5, funcs:firstrow(test.st.p6_md5)->test.st.p6_md5, funcs:firstrow(test.st.p7_md5)->test.st.p7_md5 + └─IndexLookUp 39.38 root + ├─IndexRangeScan(Build) 160.23 cop[tikv] table:st, index:t(t) range:[1478188800,1478275200], keep order:false + └─Selection(Probe) 39.38 cop[tikv] eq(test.st.aid, "cn.sbkcq"), eq(test.st.pt, "android") + └─TableRowIDScan 160.23 cop[tikv] table:st keep order:false +explain format = 'brief' select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; id estRows task access object operator info -Projection_10 428.32 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 -└─Limit_13 428.32 root offset:0, count:2000 - └─IndexMergeJoin_28 428.32 root inner join, inner:Projection_26, outer key:test.dt.aid, test.dt.dic, inner key:test.rr.aid, test.rr.dic - ├─TableReader_58(Build) 428.32 root data:Selection_57 - │ └─Selection_57 428.32 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592), not(isnull(test.dt.dic)) - │ └─TableRangeScan_56 2000.00 cop[tikv] table:dt range:[0,+inf], keep order:false - └─Projection_26(Probe) 1.00 root test.rr.aid, test.rr.pt, test.rr.dic, test.rr.gid, test.rr.acd, test.rr.t - └─IndexLookUp_25 1.00 root - ├─IndexRangeScan_22(Build) 1.00 cop[tikv] table:rr, index:PRIMARY(aid, dic) range: decided by [eq(test.rr.aid, test.dt.aid) eq(test.rr.dic, test.dt.dic)], keep order:true - └─Selection_24(Probe) 1.00 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) - └─TableRowIDScan_23 1.00 cop[tikv] table:rr keep order:false -explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; +Projection 428.32 root test.dt.id, test.dt.aid, test.dt.pt, test.dt.dic, test.dt.cm, test.rr.gid, test.rr.acd, test.rr.t, test.dt.p1, test.dt.p2, test.dt.p3, test.dt.p4, test.dt.p5, test.dt.p6_md5, test.dt.p7_md5 +└─Limit 428.32 root offset:0, count:2000 + └─IndexJoin 428.32 root inner join, inner:IndexLookUp, outer key:test.dt.aid, test.dt.dic, inner key:test.rr.aid, test.rr.dic, equal cond:eq(test.dt.aid, test.rr.aid), eq(test.dt.dic, test.rr.dic) + ├─TableReader(Build) 428.32 root data:Selection + │ └─Selection 428.32 cop[tikv] eq(test.dt.bm, 0), eq(test.dt.pt, "ios"), gt(test.dt.t, 1478185592), not(isnull(test.dt.dic)) + │ └─TableRangeScan 2000.00 cop[tikv] table:dt range:[0,+inf], keep order:false + └─IndexLookUp(Probe) 1.00 root + ├─IndexRangeScan(Build) 1.00 cop[tikv] table:rr, index:PRIMARY(aid, dic) range: decided by [eq(test.rr.aid, test.dt.aid) eq(test.rr.dic, test.dt.dic)], keep order:false + └─Selection(Probe) 1.00 cop[tikv] eq(test.rr.pt, "ios"), gt(test.rr.t, 1478185592) + └─TableRowIDScan 1.00 cop[tikv] table:rr keep order:false +explain format = 'brief' select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; id estRows task access object operator info -Projection_5 207.86 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 -└─HashAgg_6 207.86 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr - └─IndexLookUp_17 207.86 root - ├─IndexRangeScan_14(Build) 627.00 cop[tikv] table:pp, index:ps(ps) range:[2,2], keep order:false - └─Selection_16(Probe) 207.86 cop[tikv] ge(test.pp.ppt, 1478188800), in(test.pp.pi, 510017, 520017), in(test.pp.uid, 18089709, 18090780), lt(test.pp.ppt, 1478275200) - └─TableRowIDScan_15 627.00 cop[tikv] table:pp keep order:false +Projection 207.86 root test.pp.pc, test.pp.cr, Column#22, Column#23, Column#24 +└─HashAgg 207.86 root group by:test.pp.cr, test.pp.pc, funcs:count(distinct test.pp.uid)->Column#22, funcs:count(test.pp.oid)->Column#23, funcs:sum(test.pp.am)->Column#24, funcs:firstrow(test.pp.pc)->test.pp.pc, funcs:firstrow(test.pp.cr)->test.pp.cr + └─IndexLookUp 207.86 root + ├─IndexRangeScan(Build) 627.00 cop[tikv] table:pp, index:ps(ps) range:[2,2], keep order:false + └─Selection(Probe) 207.86 cop[tikv] ge(test.pp.ppt, 1478188800), in(test.pp.pi, 510017, 520017), in(test.pp.uid, 18089709, 18090780), lt(test.pp.ppt, 1478275200) + └─TableRowIDScan 627.00 cop[tikv] table:pp keep order:false drop table if exists tbl_001; CREATE TABLE tbl_001 (a int, b int); load stats 's/explain_complex_stats_tbl_001.json'; @@ -203,26 +202,26 @@ load stats 's/explain_complex_stats_tbl_008.json'; drop table if exists tbl_009; CREATE TABLE tbl_009 (a int, b int); load stats 's/explain_complex_stats_tbl_009.json'; -explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; +explain format = 'brief' select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; id estRows task access object operator info -HashAgg_34 18000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 -└─Projection_63 18000.00 root cast(Column#28, decimal(65,0) BINARY)->Column#31, Column#29 - └─Union_35 18000.00 root - ├─TableReader_38 2000.00 root data:TableFullScan_37 - │ └─TableFullScan_37 2000.00 cop[tikv] table:tbl_001 keep order:false - ├─TableReader_41 2000.00 root data:TableFullScan_40 - │ └─TableFullScan_40 2000.00 cop[tikv] table:tbl_002 keep order:false - ├─TableReader_44 2000.00 root data:TableFullScan_43 - │ └─TableFullScan_43 2000.00 cop[tikv] table:tbl_003 keep order:false - ├─TableReader_47 2000.00 root data:TableFullScan_46 - │ └─TableFullScan_46 2000.00 cop[tikv] table:tbl_004 keep order:false - ├─TableReader_50 2000.00 root data:TableFullScan_49 - │ └─TableFullScan_49 2000.00 cop[tikv] table:tbl_005 keep order:false - ├─TableReader_53 2000.00 root data:TableFullScan_52 - │ └─TableFullScan_52 2000.00 cop[tikv] table:tbl_006 keep order:false - ├─TableReader_56 2000.00 root data:TableFullScan_55 - │ └─TableFullScan_55 2000.00 cop[tikv] table:tbl_007 keep order:false - ├─TableReader_59 2000.00 root data:TableFullScan_58 - │ └─TableFullScan_58 2000.00 cop[tikv] table:tbl_008 keep order:false - └─TableReader_62 2000.00 root data:TableFullScan_61 - └─TableFullScan_61 2000.00 cop[tikv] table:tbl_009 keep order:false +HashAgg 18000.00 root group by:Column#32, funcs:sum(Column#31)->Column#30 +└─Projection 18000.00 root cast(Column#28, decimal(32,0) BINARY)->Column#31, Column#29 + └─Union 18000.00 root + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_001 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_002 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_003 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_004 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_005 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_006 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_007 keep order:false + ├─TableReader 2000.00 root data:TableFullScan + │ └─TableFullScan 2000.00 cop[tikv] table:tbl_008 keep order:false + └─TableReader 2000.00 root data:TableFullScan + └─TableFullScan 2000.00 cop[tikv] table:tbl_009 keep order:false diff --git a/cmd/explaintest/r/explain_easy.result b/cmd/explaintest/r/explain_easy.result index 7b92ecbaeefd8..0d7bc00eccddb 100644 --- a/cmd/explaintest/r/explain_easy.result +++ b/cmd/explaintest/r/explain_easy.result @@ -11,269 +11,267 @@ set @@session.tidb_opt_insubq_to_join_and_agg=1; set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; set @@session.tidb_window_concurrency = 1; -explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); -id estRows task access object operator info -HashJoin_12 8000.00 root semi join, equal:[eq(Column#13, Column#11)] -├─StreamAgg_27(Build) 1.00 root funcs:sum(Column#16)->Column#11 -│ └─TableReader_28 1.00 root data:StreamAgg_19 -│ └─StreamAgg_19 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 -│ └─TableFullScan_26 10000.00 cop[tikv] table:s keep order:false, stats:pseudo -└─Projection_13(Probe) 10000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a, decimal(20,0) BINARY)->Column#13 - └─TableReader_15 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo -explain select * from t1; -id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 order by c2; -id estRows task access object operator info -IndexLookUp_12 10000.00 root -├─IndexFullScan_10(Build) 10000.00 cop[tikv] table:t1, index:c2(c2) keep order:true, stats:pseudo -└─TableRowIDScan_11(Probe) 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 order by c2; -id estRows task access object operator info -Sort_4 10000.00 root test.t2.c2 -└─TableReader_8 10000.00 root data:TableFullScan_7 - └─TableFullScan_7 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where t1.c1 > 0; -id estRows task access object operator info -TableReader_6 3333.33 root data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(0,+inf], keep order:false, stats:pseudo -explain select t1.c1, t1.c2 from t1 where t1.c2 = 1; -id estRows task access object operator info -IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo -explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; -id estRows task access object operator info -HashJoin_23 4166.67 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] -├─TableReader_33(Build) 3333.33 root data:TableRangeScan_32 -│ └─TableRangeScan_32 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo -└─TableReader_36(Probe) 9990.00 root data:Selection_35 - └─Selection_35 9990.00 cop[tikv] not(isnull(test.t2.c1)) - └─TableFullScan_34 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain update t1 set t1.c2 = 2 where t1.c1 = 1; -id estRows task access object operator info -Update_3 N/A root N/A -└─Point_Get_1 1.00 root table:t1 handle:1 -explain delete from t1 where t1.c2 = 1; -id estRows task access object operator info -Delete_4 N/A root N/A -└─IndexLookUp_11 10.00 root - ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo - └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; -id estRows task access object operator info -Projection_11 9990.00 root cast(Column#8, bigint(21) BINARY)->Column#7 -└─HashJoin_21 9990.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] - ├─HashAgg_28(Build) 7992.00 root group by:test.t2.c2, funcs:count(Column#9)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 - │ └─TableReader_29 7992.00 root data:HashAgg_23 - │ └─HashAgg_23 7992.00 cop[tikv] group by:test.t2.c2, funcs:count(test.t2.c2)->Column#9 - │ └─Selection_27 9990.00 cop[tikv] not(isnull(test.t2.c2)) - │ └─TableFullScan_26 10000.00 cop[tikv] table:b keep order:false, stats:pseudo - └─TableReader_34(Probe) 10000.00 root data:TableFullScan_33 - └─TableFullScan_33 10000.00 cop[tikv] table:a keep order:false, stats:pseudo -explain select * from t2 order by t2.c2 limit 0, 1; -id estRows task access object operator info -TopN_7 1.00 root test.t2.c2, offset:0, count:1 -└─TableReader_15 1.00 root data:TopN_14 - └─TopN_14 1.00 cop[tikv] test.t2.c2, offset:0, count:1 - └─TableFullScan_13 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; -id estRows task access object operator info -IndexLookUp_11 11.08 root -├─IndexRangeScan_8(Build) 33.33 cop[tikv] table:t1, index:c2(c2) range:(1 1,1 +inf], keep order:false, stats:pseudo -└─Selection_10(Probe) 11.08 cop[tikv] lt(test.t1.c3, 1) - └─TableRowIDScan_9 33.33 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where c1 = 1 and c2 > 1; -id estRows task access object operator info -Selection_6 0.33 root gt(test.t1.c2, 1) -└─Point_Get_5 1.00 root table:t1 handle:1 -explain select sum(t1.c1 in (select c1 from t2)) from t1; -id estRows task access object operator info -StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 -└─Projection_23 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 - └─HashJoin_22 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.c1, test.t2.c1) - ├─IndexReader_21(Build) 10000.00 root index:IndexFullScan_20 - │ └─IndexFullScan_20 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─TableReader_15(Probe) 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select c1 from t1 where c1 in (select c2 from t2); -id estRows task access object operator info -HashJoin_19 9990.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] -├─HashAgg_23(Build) 7992.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 -│ └─TableReader_30 9990.00 root data:Selection_29 -│ └─Selection_29 9990.00 cop[tikv] not(isnull(test.t2.c2)) -│ └─TableFullScan_28 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_32(Probe) 10000.00 root data:TableFullScan_31 - └─TableFullScan_31 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; -id estRows task access object operator info -Projection_12 10000.00 root ifnull(Column#7, 0)->Column#7 -└─MergeJoin_13 10000.00 root left outer join, left key:test.t1.c1, right key:test.t1.c1 - ├─Projection_18(Build) 8000.00 root 1->Column#7, test.t1.c1 - │ └─TableReader_20 10000.00 root data:TableFullScan_19 - │ └─TableFullScan_19 10000.00 cop[tikv] table:s keep order:true, stats:pseudo - └─TableReader_17(Probe) 10000.00 root data:TableFullScan_16 - └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo -explain select * from information_schema.columns; -id estRows task access object operator info -MemTableScan_4 10000.00 root table:COLUMNS -explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; -id estRows task access object operator info -Projection_12 10000.00 root eq(test.t1.c2, test.t2.c2)->Column#8 -└─Apply_14 10000.00 root CARTESIAN left outer join - ├─TableReader_16(Build) 10000.00 root data:TableFullScan_15 - │ └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─Projection_43(Probe) 1.00 root test.t2.c1, test.t2.c2 - └─IndexLookUp_42 1.00 root limit embedded(offset:0, count:1) - ├─Limit_41(Build) 1.00 cop[tikv] offset:0, count:1 - │ └─IndexRangeScan_39 1.00 cop[tikv] table:t2, index:c1(c1) range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true, stats:pseudo - └─TableRowIDScan_40(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 order by c1 desc limit 1; -id estRows task access object operator info -Limit_10 1.00 root offset:0, count:1 -└─TableReader_20 1.00 root data:Limit_19 - └─Limit_19 1.00 cop[tikv] offset:0, count:1 - └─TableFullScan_18 1.00 cop[tikv] table:t1 keep order:true, desc, stats:pseudo -explain select * from t4 use index(idx) where a > 1 and b > 1 and c > 1 limit 1; -id estRows task access object operator info -Limit_9 1.00 root offset:0, count:1 -└─IndexLookUp_16 1.00 root - ├─Selection_13(Build) 3.00 cop[tikv] gt(test.t4.b, 1) - │ └─IndexRangeScan_11 9.00 cop[tikv] table:t4, index:idx(a, b) range:(1,+inf], keep order:false, stats:pseudo - └─Limit_15(Probe) 1.00 cop[tikv] offset:0, count:1 - └─Selection_14 1.00 cop[tikv] gt(test.t4.c, 1) - └─TableRowIDScan_12 3.00 cop[tikv] table:t4 keep order:false, stats:pseudo -explain select * from t4 where a > 1 and c > 1 limit 1; -id estRows task access object operator info -Limit_8 1.00 root offset:0, count:1 -└─TableReader_14 1.00 root data:Limit_13 - └─Limit_13 1.00 cop[tikv] offset:0, count:1 - └─Selection_12 1.00 cop[tikv] gt(test.t4.c, 1) - └─TableRangeScan_11 3.00 cop[tikv] table:t4 range:(1,+inf], keep order:false, stats:pseudo -explain select ifnull(null, t1.c1) from t1; -id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select if(10, t1.c1, t1.c2) from t1; -id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select c1 from t2 union select c1 from t2 union all select c1 from t2; -id estRows task access object operator info -Union_17 26000.00 root -├─HashAgg_21 16000.00 root group by:Column#10, funcs:firstrow(Column#12)->Column#10 -│ └─Union_22 16000.00 root -│ ├─StreamAgg_27 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 -│ │ └─IndexReader_40 10000.00 root index:IndexFullScan_39 -│ │ └─IndexFullScan_39 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo -│ └─StreamAgg_45 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 -│ └─IndexReader_58 10000.00 root index:IndexFullScan_57 -│ └─IndexFullScan_57 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo -└─IndexReader_63 10000.00 root index:IndexFullScan_62 - └─IndexFullScan_62 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo -explain select c1 from t2 union all select c1 from t2 union select c1 from t2; -id estRows task access object operator info -HashAgg_18 24000.00 root group by:Column#10, funcs:firstrow(Column#11)->Column#10 -└─Union_19 24000.00 root - ├─StreamAgg_24 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 - │ └─IndexReader_37 10000.00 root index:IndexFullScan_36 - │ └─IndexFullScan_36 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo - ├─StreamAgg_42 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 - │ └─IndexReader_55 10000.00 root index:IndexFullScan_54 - │ └─IndexFullScan_54 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo - └─StreamAgg_60 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 - └─IndexReader_73 10000.00 root index:IndexFullScan_72 - └─IndexFullScan_72 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo +explain format = 'brief' select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); +id estRows task access object operator info +HashJoin 8000.00 root semi join, equal:[eq(Column#13, Column#11)] +├─StreamAgg(Build) 1.00 root funcs:sum(Column#16)->Column#11 +│ └─TableReader 1.00 root data:StreamAgg +│ └─StreamAgg 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 +│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo +└─Projection(Probe) 10000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a, decimal(20,0) BINARY)->Column#13 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +explain format = 'brief' select * from t1; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 order by c2; +id estRows task access object operator info +IndexLookUp 10000.00 root +├─IndexFullScan(Build) 10000.00 cop[tikv] table:t1, index:c2(c2) keep order:true, stats:pseudo +└─TableRowIDScan(Probe) 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 order by c2; +id estRows task access object operator info +Sort 10000.00 root test.t2.c2 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where t1.c1 > 0; +id estRows task access object operator info +TableReader 3333.33 root data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(0,+inf], keep order:false, stats:pseudo +explain format = 'brief' select t1.c1, t1.c2 from t1 where t1.c2 = 1; +id estRows task access object operator info +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo +explain format = 'brief' select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; +id estRows task access object operator info +HashJoin 4166.67 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] +├─TableReader(Build) 3333.33 root data:TableRangeScan +│ └─TableRangeScan 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo +└─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(test.t2.c1)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' update t1 set t1.c2 = 2 where t1.c1 = 1; +id estRows task access object operator info +Update N/A root N/A +└─Point_Get 1.00 root table:t1 handle:1 +explain format = 'brief' delete from t1 where t1.c2 = 1; +id estRows task access object operator info +Delete N/A root N/A +└─IndexLookUp 10.00 root + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; +id estRows task access object operator info +Projection 9990.00 root cast(Column#8, bigint(21) BINARY)->Column#7 +└─HashJoin 9990.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] + ├─HashAgg(Build) 7992.00 root group by:test.t2.c2, funcs:count(Column#9)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 + │ └─TableReader 7992.00 root data:HashAgg + │ └─HashAgg 7992.00 cop[tikv] group by:test.t2.c2, funcs:count(test.t2.c2)->Column#9 + │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.c2)) + │ └─TableFullScan 10000.00 cop[tikv] table:b keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:a keep order:false, stats:pseudo +explain format = 'brief' select * from t2 order by t2.c2 limit 0, 1; +id estRows task access object operator info +TopN 1.00 root test.t2.c2, offset:0, count:1 +└─TableReader 1.00 root data:TopN + └─TopN 1.00 cop[tikv] test.t2.c2, offset:0, count:1 + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; +id estRows task access object operator info +IndexLookUp 11.08 root +├─IndexRangeScan(Build) 33.33 cop[tikv] table:t1, index:c2(c2) range:(1 1,1 +inf], keep order:false, stats:pseudo +└─Selection(Probe) 11.08 cop[tikv] lt(test.t1.c3, 1) + └─TableRowIDScan 33.33 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where c1 = 1 and c2 > 1; +id estRows task access object operator info +Selection 0.33 root gt(test.t1.c2, 1) +└─Point_Get 1.00 root table:t1 handle:1 +explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; +id estRows task access object operator info +StreamAgg 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 + └─HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.c1, test.t2.c1) + ├─IndexReader(Build) 10000.00 root index:IndexFullScan + │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select c1 from t1 where c1 in (select c2 from t2); +id estRows task access object operator info +HashJoin 9990.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] +├─HashAgg(Build) 7992.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 +│ └─TableReader 9990.00 root data:Selection +│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.c2)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; +id estRows task access object operator info +Projection 10000.00 root ifnull(Column#7, 0)->Column#7 +└─MergeJoin 10000.00 root left outer join, left key:test.t1.c1, right key:test.t1.c1 + ├─Projection(Build) 8000.00 root 1->Column#7, test.t1.c1 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:s keep order:true, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo +explain format = 'brief' select * from information_schema.columns; +id estRows task access object operator info +MemTableScan 10000.00 root table:COLUMNS +explain format = 'brief' select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; +id estRows task access object operator info +Projection 10000.00 root eq(test.t1.c2, test.t2.c2)->Column#8 +└─Apply 10000.00 root CARTESIAN left outer join + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─Projection(Probe) 1.00 root test.t2.c1, test.t2.c2 + └─IndexLookUp 1.00 root limit embedded(offset:0, count:1) + ├─Limit(Build) 1.00 cop[tikv] offset:0, count:1 + │ └─IndexRangeScan 1.00 cop[tikv] table:t2, index:c1(c1) range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true, stats:pseudo + └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 order by c1 desc limit 1; +id estRows task access object operator info +Limit 1.00 root offset:0, count:1 +└─TableReader 1.00 root data:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─TableFullScan 1.00 cop[tikv] table:t1 keep order:true, desc, stats:pseudo +explain format = 'brief' select * from t4 use index(idx) where a > 1 and b > 1 and c > 1 limit 1; +id estRows task access object operator info +Limit 1.00 root offset:0, count:1 +└─IndexLookUp 1.00 root + ├─Selection(Build) 3.00 cop[tikv] gt(test.t4.b, 1) + │ └─IndexRangeScan 9.00 cop[tikv] table:t4, index:idx(a, b) range:(1,+inf], keep order:false, stats:pseudo + └─Limit(Probe) 1.00 cop[tikv] offset:0, count:1 + └─Selection 1.00 cop[tikv] gt(test.t4.c, 1) + └─TableRowIDScan 3.00 cop[tikv] table:t4 keep order:false, stats:pseudo +explain format = 'brief' select * from t4 where a > 1 and c > 1 limit 1; +id estRows task access object operator info +Limit 1.00 root offset:0, count:1 +└─TableReader 1.00 root data:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─Selection 1.00 cop[tikv] gt(test.t4.c, 1) + └─TableRangeScan 3.00 cop[tikv] table:t4 range:(1,+inf], keep order:false, stats:pseudo +explain format = 'brief' select ifnull(null, t1.c1) from t1; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select if(10, t1.c1, t1.c2) from t1; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select c1 from t2 union select c1 from t2 union all select c1 from t2; +id estRows task access object operator info +Union 26000.00 root +├─HashAgg 16000.00 root group by:Column#10, funcs:firstrow(Column#12)->Column#10 +│ └─Union 16000.00 root +│ ├─StreamAgg 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 +│ │ └─IndexReader 10000.00 root index:IndexFullScan +│ │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo +│ └─StreamAgg 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#12, funcs:firstrow(test.t2.c1)->Column#10 +│ └─IndexReader 10000.00 root index:IndexFullScan +│ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo +└─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo +explain format = 'brief' select c1 from t2 union all select c1 from t2 union select c1 from t2; +id estRows task access object operator info +HashAgg 24000.00 root group by:Column#10, funcs:firstrow(Column#11)->Column#10 +└─Union 24000.00 root + ├─StreamAgg 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 + │ └─IndexReader 10000.00 root index:IndexFullScan + │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo + ├─StreamAgg 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 + │ └─IndexReader 10000.00 root index:IndexFullScan + │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo + └─StreamAgg 8000.00 root group by:test.t2.c1, funcs:firstrow(test.t2.c1)->Column#11, funcs:firstrow(test.t2.c1)->Column#10 + └─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:true, stats:pseudo select * from information_schema.tidb_indexes where table_name='t4'; TABLE_SCHEMA TABLE_NAME NON_UNIQUE KEY_NAME SEQ_IN_INDEX COLUMN_NAME SUB_PART INDEX_COMMENT Expression INDEX_ID IS_VISIBLE test t4 0 PRIMARY 1 a NULL NULL 0 YES test t4 1 idx 1 a NULL NULL 1 YES test t4 1 idx 2 b NULL NULL 1 YES test t4 1 expr_idx 1 NULL NULL (`a` + `b` + 1) 2 YES -explain select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; -id estRows task access object operator info -StreamAgg_13 1.00 root funcs:count(1)->Column#5 -└─StreamAgg_28 1.00 root funcs:firstrow(Column#9)->Column#7 - └─TableReader_29 1.00 root data:StreamAgg_17 - └─StreamAgg_17 1.00 cop[tikv] funcs:firstrow(1)->Column#9 - └─Selection_27 10.00 cop[tikv] eq(test.t1.c3, 100) - └─TableFullScan_26 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select 1 from (select count(c2), count(c3) from t1) k; -id estRows task access object operator info -Projection_5 1.00 root 1->Column#6 -└─StreamAgg_21 1.00 root funcs:firstrow(Column#14)->Column#9 - └─TableReader_22 1.00 root data:StreamAgg_9 - └─StreamAgg_9 1.00 cop[tikv] funcs:firstrow(1)->Column#14 - └─TableFullScan_19 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select count(1) from (select max(c2), count(c3) as m from t1) k; -id estRows task access object operator info -StreamAgg_11 1.00 root funcs:count(1)->Column#6 -└─StreamAgg_27 1.00 root funcs:firstrow(Column#13)->Column#8 - └─TableReader_28 1.00 root data:StreamAgg_15 - └─StreamAgg_15 1.00 cop[tikv] funcs:firstrow(1)->Column#13 - └─TableFullScan_25 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select count(1) from (select count(c2) from t1 group by c3) k; -id estRows task access object operator info -StreamAgg_11 1.00 root funcs:count(1)->Column#5 -└─HashAgg_22 8000.00 root group by:test.t1.c3, funcs:firstrow(1)->Column#7 - └─TableReader_19 10000.00 root data:TableFullScan_18 - └─TableFullScan_18 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(1)->Column#5 +└─StreamAgg 1.00 root funcs:firstrow(Column#9)->Column#7 + └─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:firstrow(1)->Column#9 + └─Selection 10.00 cop[tikv] eq(test.t1.c3, 100) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select 1 from (select count(c2), count(c3) from t1) k; +id estRows task access object operator info +Projection 1.00 root 1->Column#6 +└─StreamAgg 1.00 root funcs:firstrow(Column#14)->Column#9 + └─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:firstrow(1)->Column#14 + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select count(1) from (select max(c2), count(c3) as m from t1) k; +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(1)->Column#6 +└─StreamAgg 1.00 root funcs:firstrow(Column#13)->Column#8 + └─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:firstrow(1)->Column#13 + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select count(1) from (select count(c2) from t1 group by c3) k; +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(1)->Column#5 +└─HashAgg 8000.00 root group by:test.t1.c3, funcs:firstrow(1)->Column#7 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo set @@session.tidb_opt_insubq_to_join_and_agg=0; -explain select sum(t1.c1 in (select c1 from t2)) from t1; -id estRows task access object operator info -StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 -└─Projection_23 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 - └─HashJoin_22 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.c1, test.t2.c1) - ├─IndexReader_21(Build) 10000.00 root index:IndexFullScan_20 - │ └─IndexFullScan_20 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo - └─TableReader_15(Probe) 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select 1 in (select c2 from t2) from t1; -id estRows task access object operator info -HashJoin_7 10000.00 root CARTESIAN left outer semi join -├─TableReader_14(Build) 10.00 root data:Selection_13 -│ └─Selection_13 10.00 cop[tikv] eq(1, test.t2.c2) -│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8 - └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select sum(6 in (select c2 from t2)) from t1; -id estRows task access object operator info -StreamAgg_12 1.00 root funcs:sum(Column#10)->Column#8 -└─Projection_22 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 - └─HashJoin_21 10000.00 root CARTESIAN left outer semi join - ├─TableReader_20(Build) 10.00 root data:Selection_19 - │ └─Selection_19 10.00 cop[tikv] eq(6, test.t2.c2) - │ └─TableFullScan_18 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_15(Probe) 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; +id estRows task access object operator info +StreamAgg 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 + └─HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.c1, test.t2.c1) + ├─IndexReader(Build) 10000.00 root index:IndexFullScan + │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:c1(c1) keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select 1 in (select c2 from t2) from t1; +id estRows task access object operator info +HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(1, test.t2.c2) +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select sum(6 in (select c2 from t2)) from t1; +id estRows task access object operator info +StreamAgg 1.00 root funcs:sum(Column#10)->Column#8 +└─Projection 10000.00 root cast(Column#7, decimal(65,0) BINARY)->Column#10 + └─HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(6, test.t2.c2) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo explain format="dot" select sum(t1.c1 in (select c1 from t2)) from t1; dot contents -digraph StreamAgg_12 { -subgraph cluster12{ +digraph StreamAgg_9 { +subgraph cluster9{ node [style=filled, color=lightgrey] color=black label = "root" -"StreamAgg_12" -> "Projection_23" -"Projection_23" -> "HashJoin_22" -"HashJoin_22" -> "TableReader_15" -"HashJoin_22" -> "IndexReader_21" +"StreamAgg_9" -> "Projection_20" +"Projection_20" -> "HashJoin_19" +"HashJoin_19" -> "TableReader_12" +"HashJoin_19" -> "IndexReader_18" } -subgraph cluster14{ +subgraph cluster11{ node [style=filled, color=lightgrey] color=black label = "cop" -"TableFullScan_14" +"TableFullScan_11" } -subgraph cluster20{ +subgraph cluster17{ node [style=filled, color=lightgrey] color=black label = "cop" -"IndexFullScan_20" +"IndexFullScan_17" } -"TableReader_15" -> "TableFullScan_14" -"IndexReader_21" -> "IndexFullScan_20" +"TableReader_12" -> "TableFullScan_11" +"IndexReader_18" -> "IndexFullScan_17" } explain format="dot" select 1 in (select c2 from t2) from t1; @@ -285,7 +283,7 @@ node [style=filled, color=lightgrey] color=black label = "root" "HashJoin_7" -> "TableReader_9" -"HashJoin_7" -> "TableReader_14" +"HashJoin_7" -> "TableReader_13" } subgraph cluster8{ node [style=filled, color=lightgrey] @@ -293,196 +291,196 @@ color=black label = "cop" "TableFullScan_8" } -subgraph cluster13{ +subgraph cluster12{ node [style=filled, color=lightgrey] color=black label = "cop" -"Selection_13" -> "TableFullScan_12" +"TableFullScan_12" } "TableReader_9" -> "TableFullScan_8" -"TableReader_14" -> "Selection_13" +"TableReader_13" -> "TableFullScan_12" } drop table if exists t1, t2, t3, t4; drop table if exists t; create table t(a int primary key, b int, c int, index idx(b)); -explain select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; -id estRows task access object operator info -Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_15(Build) 10000.00 root data:TableFullScan_14 - │ └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:false, stats:pseudo - └─StreamAgg_20(Probe) 1.00 root funcs:count(1)->Column#10 - └─MergeJoin_54 12.50 root inner join, left key:test.t.a, right key:test.t.a - ├─TableReader_49(Build) 1.00 root data:TableRangeScan_48 - │ └─TableRangeScan_48 1.00 cop[tikv] table:t1 range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo - └─TableReader_47(Probe) 1.00 root data:TableRangeScan_46 - └─TableRangeScan_46 1.00 cop[tikv] table:s range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; -id estRows task access object operator info -Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_15(Build) 10000.00 root data:TableFullScan_14 - │ └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:false, stats:pseudo - └─StreamAgg_20(Probe) 1.00 root funcs:count(1)->Column#10 - └─IndexMergeJoin_46 12.50 root inner join, inner:TableReader_41, outer key:test.t.a, inner key:test.t.a - ├─IndexReader_33(Build) 10.00 root index:IndexRangeScan_32 - │ └─IndexRangeScan_32 10.00 cop[tikv] table:s, index:idx(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo - └─TableReader_41(Probe) 1.00 root data:TableRangeScan_40 - └─TableRangeScan_40 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:true, stats:pseudo -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; -id estRows task access object operator info -Projection_11 10000.00 root Column#11 -└─Apply_13 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_15(Build) 10000.00 root data:TableFullScan_14 - │ └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:false, stats:pseudo - └─StreamAgg_20(Probe) 1.00 root funcs:count(1)->Column#10 - └─IndexMergeJoin_48 12.49 root inner join, inner:TableReader_43, outer key:test.t.c, inner key:test.t.a - ├─IndexLookUp_35(Build) 9.99 root - │ ├─IndexRangeScan_32(Build) 10.00 cop[tikv] table:s, index:idx(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo - │ └─Selection_34(Probe) 9.99 cop[tikv] not(isnull(test.t.c)) - │ └─TableRowIDScan_33 10.00 cop[tikv] table:s keep order:false, stats:pseudo - └─TableReader_43(Probe) 1.00 root data:TableRangeScan_42 - └─TableRangeScan_42 1.00 cop[tikv] table:t1 range: decided by [test.t.c], keep order:true, stats:pseudo +explain format = 'brief' select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#11 +└─Apply 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─MergeJoin 12.50 root inner join, left key:test.t.a, right key:test.t.a + ├─TableReader(Build) 1.00 root data:TableRangeScan + │ └─TableRangeScan 1.00 cop[tikv] table:t1 range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:s range: decided by [eq(test.t.a, test.t.a)], keep order:true, stats:pseudo +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#11 +└─Apply 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─IndexJoin 12.50 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a) + ├─IndexReader(Build) 10.00 root index:IndexRangeScan + │ └─IndexRangeScan 10.00 cop[tikv] table:s, index:idx(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:false, stats:pseudo +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#11 +└─Apply 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─IndexJoin 12.49 root inner join, inner:TableReader, outer key:test.t.c, inner key:test.t.a, equal cond:eq(test.t.c, test.t.a) + ├─IndexLookUp(Build) 9.99 root + │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:s, index:idx(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo + │ └─Selection(Probe) 9.99 cop[tikv] not(isnull(test.t.c)) + │ └─TableRowIDScan 10.00 cop[tikv] table:s keep order:false, stats:pseudo + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:t1 range: decided by [test.t.c], keep order:false, stats:pseudo insert into t values(1, 1, 1), (2, 2 ,2), (3, 3, 3), (4, 3, 4),(5,3,5); analyze table t; -explain select t.c in (select count(*) from t s, t t1 where s.b = t.a and s.b = 3 and s.a = t1.a) from t; -id estRows task access object operator info -Projection_11 5.00 root Column#11 -└─Apply_13 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_15(Build) 5.00 root data:TableFullScan_14 - │ └─TableFullScan_14 5.00 cop[tikv] table:t keep order:false - └─StreamAgg_20(Probe) 1.00 root funcs:count(1)->Column#10 - └─MergeJoin_62 2.40 root inner join, left key:test.t.a, right key:test.t.a - ├─TableReader_52(Build) 4.00 root data:Selection_51 - │ └─Selection_51 4.00 cop[tikv] eq(3, test.t.a) - │ └─TableFullScan_50 5.00 cop[tikv] table:t1 keep order:true - └─IndexReader_49(Probe) 2.40 root index:Selection_48 - └─Selection_48 2.40 cop[tikv] eq(3, test.t.a) - └─IndexRangeScan_47 3.00 cop[tikv] table:s, index:idx(b) range:[3,3], keep order:true -explain select t.c in (select count(*) from t s left join t t1 on s.a = t1.a where 3 = t.a and s.b = 3) from t; -id estRows task access object operator info -Projection_10 5.00 root Column#11 -└─Apply_12 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_14(Build) 5.00 root data:TableFullScan_13 - │ └─TableFullScan_13 5.00 cop[tikv] table:t keep order:false - └─StreamAgg_19(Probe) 1.00 root funcs:count(1)->Column#10 - └─MergeJoin_50 2.40 root left outer join, left key:test.t.a, right key:test.t.a - ├─TableReader_40(Build) 4.00 root data:Selection_39 - │ └─Selection_39 4.00 cop[tikv] eq(3, test.t.a) - │ └─TableFullScan_38 5.00 cop[tikv] table:t1 keep order:true - └─IndexReader_37(Probe) 2.40 root index:Selection_36 - └─Selection_36 2.40 cop[tikv] eq(3, test.t.a) - └─IndexRangeScan_35 3.00 cop[tikv] table:s, index:idx(b) range:[3,3], keep order:true -explain select t.c in (select count(*) from t s right join t t1 on s.a = t1.a where 3 = t.a and t1.b = 3) from t; -id estRows task access object operator info -Projection_10 5.00 root Column#11 -└─Apply_12 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) - ├─TableReader_14(Build) 5.00 root data:TableFullScan_13 - │ └─TableFullScan_13 5.00 cop[tikv] table:t keep order:false - └─StreamAgg_19(Probe) 1.00 root funcs:count(1)->Column#10 - └─MergeJoin_49 2.40 root right outer join, left key:test.t.a, right key:test.t.a - ├─TableReader_36(Build) 4.00 root data:Selection_35 - │ └─Selection_35 4.00 cop[tikv] eq(3, test.t.a) - │ └─TableFullScan_34 5.00 cop[tikv] table:s keep order:true - └─IndexReader_39(Probe) 2.40 root index:Selection_38 - └─Selection_38 2.40 cop[tikv] eq(3, test.t.a) - └─IndexRangeScan_37 3.00 cop[tikv] table:t1, index:idx(b) range:[3,3], keep order:true +explain format = 'brief' select t.c in (select count(*) from t s, t t1 where s.b = t.a and s.b = 3 and s.a = t1.a) from t; +id estRows task access object operator info +Projection 5.00 root Column#11 +└─Apply 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 5.00 root data:TableFullScan + │ └─TableFullScan 5.00 cop[tikv] table:t keep order:false + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─MergeJoin 2.40 root inner join, left key:test.t.a, right key:test.t.a + ├─TableReader(Build) 4.00 root data:Selection + │ └─Selection 4.00 cop[tikv] eq(3, test.t.a) + │ └─TableFullScan 5.00 cop[tikv] table:t1 keep order:true + └─IndexReader(Probe) 2.40 root index:Selection + └─Selection 2.40 cop[tikv] eq(3, test.t.a) + └─IndexRangeScan 3.00 cop[tikv] table:s, index:idx(b) range:[3,3], keep order:true +explain format = 'brief' select t.c in (select count(*) from t s left join t t1 on s.a = t1.a where 3 = t.a and s.b = 3) from t; +id estRows task access object operator info +Projection 5.00 root Column#11 +└─Apply 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 5.00 root data:TableFullScan + │ └─TableFullScan 5.00 cop[tikv] table:t keep order:false + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─MergeJoin 2.40 root left outer join, left key:test.t.a, right key:test.t.a + ├─TableReader(Build) 4.00 root data:Selection + │ └─Selection 4.00 cop[tikv] eq(3, test.t.a) + │ └─TableFullScan 5.00 cop[tikv] table:t1 keep order:true + └─IndexReader(Probe) 2.40 root index:Selection + └─Selection 2.40 cop[tikv] eq(3, test.t.a) + └─IndexRangeScan 3.00 cop[tikv] table:s, index:idx(b) range:[3,3], keep order:true +explain format = 'brief' select t.c in (select count(*) from t s right join t t1 on s.a = t1.a where 3 = t.a and t1.b = 3) from t; +id estRows task access object operator info +Projection 5.00 root Column#11 +└─Apply 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#10) + ├─TableReader(Build) 5.00 root data:TableFullScan + │ └─TableFullScan 5.00 cop[tikv] table:t keep order:false + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#10 + └─MergeJoin 2.40 root right outer join, left key:test.t.a, right key:test.t.a + ├─TableReader(Build) 4.00 root data:Selection + │ └─Selection 4.00 cop[tikv] eq(3, test.t.a) + │ └─TableFullScan 5.00 cop[tikv] table:s keep order:true + └─IndexReader(Probe) 2.40 root index:Selection + └─Selection 2.40 cop[tikv] eq(3, test.t.a) + └─IndexRangeScan 3.00 cop[tikv] table:t1, index:idx(b) range:[3,3], keep order:true drop table if exists t; create table t(a int unsigned); -explain select t.a = '123455' from t; -id estRows task access object operator info -Projection_3 10000.00 root eq(test.t.a, 123455)->Column#3 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select t.a > '123455' from t; -id estRows task access object operator info -Projection_3 10000.00 root gt(test.t.a, 123455)->Column#3 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select t.a != '123455' from t; -id estRows task access object operator info -Projection_3 10000.00 root ne(test.t.a, 123455)->Column#3 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select t.a = 12345678912345678998789678687678.111 from t; -id estRows task access object operator info -Projection_3 10000.00 root 0->Column#3 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select t.a = '123455' from t; +id estRows task access object operator info +Projection 10000.00 root eq(test.t.a, 123455)->Column#3 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select t.a > '123455' from t; +id estRows task access object operator info +Projection 10000.00 root gt(test.t.a, 123455)->Column#3 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select t.a != '123455' from t; +id estRows task access object operator info +Projection 10000.00 root ne(test.t.a, 123455)->Column#3 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select t.a = 12345678912345678998789678687678.111 from t; +id estRows task access object operator info +Projection 10000.00 root 0->Column#3 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a bigint, b bigint, index idx(a, b)); -explain select * from t where a in (1, 2) and a in (1, 3); -id estRows task access object operator info -IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:idx(a, b) range:[1,1], keep order:false, stats:pseudo -explain select * from t where b in (1, 2) and b in (1, 3); -id estRows task access object operator info -TableReader_7 10.00 root data:Selection_6 -└─Selection_6 10.00 cop[tikv] in(test.t.b, 1, 2), in(test.t.b, 1, 3) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where a = 1 and a = 1; -id estRows task access object operator info -IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:idx(a, b) range:[1,1], keep order:false, stats:pseudo -explain select * from t where a = 1 and a = 2; -id estRows task access object operator info -TableDual_5 0.00 root rows:0 -explain select * from t where b = 1 and b = 2; -id estRows task access object operator info -TableDual_5 0.00 root rows:0 -explain select * from t t1 join t t2 where t1.b = t2.b and t2.b is null; -id estRows task access object operator info -Projection_7 0.00 root test.t.a, test.t.b, test.t.a, test.t.b -└─HashJoin_9 0.00 root inner join, equal:[eq(test.t.b, test.t.b)] - ├─TableReader_12(Build) 0.00 root data:Selection_11 - │ └─Selection_11 0.00 cop[tikv] isnull(test.t.b), not(isnull(test.t.b)) - │ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_18(Probe) 9990.00 root data:Selection_17 - └─Selection_17 9990.00 cop[tikv] not(isnull(test.t.b)) - └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t t1 where not exists (select * from t t2 where t1.b = t2.b); -id estRows task access object operator info -HashJoin_9 8000.00 root anti semi join, equal:[eq(test.t.b, test.t.b)] -├─TableReader_15(Build) 10000.00 root data:TableFullScan_14 -│ └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_11(Probe) 10000.00 root data:TableFullScan_10 - └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t where a in (1, 2) and a in (1, 3); +id estRows task access object operator info +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t, index:idx(a, b) range:[1,1], keep order:false, stats:pseudo +explain format = 'brief' select * from t where b in (1, 2) and b in (1, 3); +id estRows task access object operator info +TableReader 10.00 root data:Selection +└─Selection 10.00 cop[tikv] in(test.t.b, 1, 2), in(test.t.b, 1, 3) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a = 1 and a = 1; +id estRows task access object operator info +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t, index:idx(a, b) range:[1,1], keep order:false, stats:pseudo +explain format = 'brief' select * from t where a = 1 and a = 2; +id estRows task access object operator info +TableDual 8000.00 root rows:0 +explain format = 'brief' select * from t where b = 1 and b = 2; +id estRows task access object operator info +TableDual 8000.00 root rows:0 +explain format = 'brief' select * from t t1 join t t2 where t1.b = t2.b and t2.b is null; +id estRows task access object operator info +Projection 0.00 root test.t.a, test.t.b, test.t.a, test.t.b +└─HashJoin 0.00 root inner join, equal:[eq(test.t.b, test.t.b)] + ├─TableReader(Build) 0.00 root data:Selection + │ └─Selection 0.00 cop[tikv] isnull(test.t.b), not(isnull(test.t.b)) + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 9990.00 root data:Selection + └─Selection 9990.00 cop[tikv] not(isnull(test.t.b)) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t t1 where not exists (select * from t t2 where t1.b = t2.b); +id estRows task access object operator info +HashJoin 8000.00 root anti semi join, equal:[eq(test.t.b, test.t.b)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table if exists t; create table t(a bigint primary key); -explain select * from t where a = 1 and a = 2; +explain format = 'brief' select * from t where a = 1 and a = 2; id estRows task access object operator info -TableDual_5 0.00 root rows:0 -explain select null or a > 1 from t; +TableDual 8000.00 root rows:0 +explain format = 'brief' select null or a > 1 from t; id estRows task access object operator info -Projection_3 10000.00 root or(, gt(test.t.a, 1))->Column#2 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where a = 1 for update; +Projection 10000.00 root or(, gt(test.t.a, 1))->Column#2 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where a = 1 for update; id estRows task access object operator info -Point_Get_1 1.00 root table:t handle:1, lock +Point_Get 1.00 root table:t handle:1, lock drop table if exists ta, tb; create table ta (a varchar(20)); create table tb (a varchar(20)); begin; insert tb values ('1'); -explain select * from ta where a = 1; +explain format = 'brief' select * from ta where a = 1; id estRows task access object operator info -TableReader_7 8000.00 root data:Selection_6 -└─Selection_6 8000.00 cop[tikv] eq(cast(test.ta.a), 1) - └─TableFullScan_5 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +TableReader 8000.00 root data:Selection +└─Selection 8000.00 cop[tikv] eq(cast(test.ta.a), 1) + └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo rollback; drop table if exists t1, t2; create table t1(a int, b int, c int, primary key(a, b)); create table t2(a int, b int, c int, primary key(a)); -explain select t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; +explain format = 'brief' select t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; id estRows task access object operator info -IndexReader_9 10000.00 root index:IndexFullScan_8 -└─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -explain select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; id estRows task access object operator info -IndexReader_11 10000.00 root index:IndexFullScan_10 -└─IndexFullScan_10 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo CREATE TABLE `test01` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `stat_date` int(11) NOT NULL DEFAULT '0', @@ -497,260 +495,261 @@ CREATE TABLE `test02` ( `region_name` varchar(128) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -EXPLAIN SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS; -id estRows task access object operator info -StreamAgg_22 1.00 root funcs:count(1)->Column#22 -└─HashAgg_25 1.00 root group by:Column#32, Column#33, Column#34, funcs:firstrow(1)->Column#31 - └─Projection_46 0.01 root Column#14, Column#15, coalesce(test.test02.region_name, 不详)->Column#34 - └─IndexMergeJoin_34 0.01 root left outer join, inner:TableReader_29, outer key:Column#16, inner key:test.test02.id - ├─Union_37(Build) 0.01 root - │ ├─Projection_38 0.00 root test.test01.stat_date, test.test01.show_date, test.test01.region_id - │ │ └─TableDual_39 0.00 root rows:0 - │ └─Projection_40 0.01 root test.test01.stat_date, test.test01.show_date, test.test01.region_id - │ └─TableReader_43 0.01 root data:Selection_42 - │ └─Selection_42 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), ge(test.test01.stat_date, 20191202), gt(cast(test.test01.registration_num), 0), le(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202) - │ └─TableFullScan_41 10000.00 cop[tikv] table:test01 keep order:false, stats:pseudo - └─TableReader_29(Probe) 1.00 root data:TableRangeScan_28 - └─TableRangeScan_28 1.00 cop[tikv] table:b range: decided by [Column#16], keep order:true, stats:pseudo +explain format = 'brief' SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS; +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(1)->Column#22 +└─HashAgg 8000.00 root group by:Column#32, Column#33, Column#34, funcs:firstrow(1)->Column#31 + └─Projection 10000.01 root Column#14, Column#15, coalesce(test.test02.region_name, 不详)->Column#34 + └─HashJoin 10000.01 root left outer join, equal:[eq(Column#16, test.test02.id)] + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:b keep order:false, stats:pseudo + └─Union(Probe) 8000.01 root + ├─TableDual 8000.00 root rows:0 + └─Projection 0.01 root test.test01.stat_date, test.test01.show_date, test.test01.region_id + └─TableReader 0.01 root data:Selection + └─Selection 0.01 cop[tikv] eq(test.test01.period, 1), ge(test.test01.stat_date, 20191202), ge(test.test01.stat_date, 20191202), gt(cast(test.test01.registration_num), 0), le(test.test01.stat_date, 20191202), le(test.test01.stat_date, 20191202) + └─TableFullScan 10000.00 cop[tikv] table:test01 keep order:false, stats:pseudo drop table if exists t; create table t(a int, nb int not null, nc int not null); -explain select ifnull(a, 0) from t; -id estRows task access object operator info -Projection_3 10000.00 root ifnull(test.t.a, 0)->Column#5 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select ifnull(nb, 0) from t; -id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select ifnull(nb, 0), ifnull(nc, 0) from t; -id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select ifnull(a, 0), ifnull(nb, 0) from t; -id estRows task access object operator info -Projection_3 10000.00 root ifnull(test.t.a, 0)->Column#5, test.t.nb -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select ifnull(nb, 0), ifnull(nb, 0) from t; -id estRows task access object operator info -Projection_3 10000.00 root test.t.nb, test.t.nb -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select 1+ifnull(nb, 0) from t; -id estRows task access object operator info -Projection_3 10000.00 root plus(1, test.t.nb)->Column#5 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select 1+ifnull(a, 0) from t; -id estRows task access object operator info -Projection_3 10000.00 root plus(1, ifnull(test.t.a, 0))->Column#5 -└─TableReader_5 10000.00 root data:TableFullScan_4 - └─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select 1+ifnull(nb, 0) from t where nb=1; -id estRows task access object operator info -Projection_4 10.00 root plus(1, test.t.nb)->Column#5 -└─TableReader_7 10.00 root data:Selection_6 - └─Selection_6 10.00 cop[tikv] eq(test.t.nb, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(ta.nb, 1) or ta.nb is null; -id estRows task access object operator info -HashJoin_7 8320.83 root left outer join, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] -├─TableReader_14(Build) 6656.67 root data:Selection_13 -│ └─Selection_13 6656.67 cop[tikv] or(test.t.nb, 0) -│ └─TableFullScan_12 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo -└─TableReader_11(Probe) 6656.67 root data:Selection_10 - └─Selection_10 6656.67 cop[tikv] or(test.t.nb, 0) - └─TableFullScan_9 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo -explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; -id estRows task access object operator info -HashJoin_7 6656.67 root right outer join, equal:[eq(test.t.nb, test.t.nb)] -├─TableReader_11(Build) 2218.89 root data:Selection_10 -│ └─Selection_10 2218.89 cop[tikv] gt(test.t.a, 1), or(test.t.nb, 0) -│ └─TableFullScan_9 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo -└─TableReader_14(Probe) 6656.67 root data:Selection_13 - └─Selection_13 6656.67 cop[tikv] or(test.t.nb, 0) - └─TableFullScan_12 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo -explain select * from t ta inner join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; -id estRows task access object operator info -HashJoin_9 2773.61 root inner join, equal:[eq(test.t.nb, test.t.nb)] -├─TableReader_12(Build) 2218.89 root data:Selection_11 -│ └─Selection_11 2218.89 cop[tikv] gt(test.t.a, 1), or(test.t.nb, 0) -│ └─TableFullScan_10 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo -└─TableReader_15(Probe) 6656.67 root data:Selection_14 - └─Selection_14 6656.67 cop[tikv] or(test.t.nb, 0) - └─TableFullScan_13 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo -explain select ifnull(t.nc, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; -id estRows task access object operator info -Projection_12 10000.00 root Column#14 -└─Apply_14 10000.00 root left outer semi join, equal:[eq(test.t.nc, Column#13)] - ├─TableReader_16(Build) 10000.00 root data:TableFullScan_15 - │ └─TableFullScan_15 10000.00 cop[tikv] table:t keep order:false, stats:pseudo - └─HashAgg_19(Probe) 1.00 root funcs:count(Column#15)->Column#13 - └─HashJoin_20 9.99 root inner join, equal:[eq(test.t.a, test.t.a)] - ├─HashAgg_30(Build) 7.99 root group by:test.t.a, funcs:count(Column#16)->Column#15, funcs:firstrow(test.t.a)->test.t.a - │ └─TableReader_31 7.99 root data:HashAgg_25 - │ └─HashAgg_25 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#16 - │ └─Selection_29 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) - │ └─TableFullScan_28 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─TableReader_24(Probe) 9.99 root data:Selection_23 - └─Selection_23 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) - └─TableFullScan_22 10000.00 cop[tikv] table:s keep order:false, stats:pseudo -explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; -id estRows task access object operator info -Selection_7 10000.00 root or(ifnull(test.t.a, 1), isnull(test.t.a)) -└─HashJoin_8 12500.00 root left outer join, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] - ├─TableReader_13(Build) 10000.00 root data:TableFullScan_12 - │ └─TableFullScan_12 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo - └─TableReader_11(Probe) 10000.00 root data:TableFullScan_10 - └─TableFullScan_10 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo -explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; -id estRows task access object operator info -HashJoin_7 8002.00 root right outer join, equal:[eq(test.t.nb, test.t.nb)] -├─TableReader_11(Build) 3333.33 root data:Selection_10 -│ └─Selection_10 3333.33 cop[tikv] gt(test.t.a, 1) -│ └─TableFullScan_9 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo -└─TableReader_14(Probe) 8002.00 root data:Selection_13 - └─Selection_13 8002.00 cop[tikv] or(ifnull(test.t.a, 1), isnull(test.t.a)) - └─TableFullScan_12 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo -explain select ifnull(t.a, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; -id estRows task access object operator info -Projection_12 10000.00 root Column#14 -└─Apply_14 10000.00 root CARTESIAN left outer semi join, other cond:eq(ifnull(test.t.a, 1), Column#13) - ├─TableReader_16(Build) 10000.00 root data:TableFullScan_15 - │ └─TableFullScan_15 10000.00 cop[tikv] table:t keep order:false, stats:pseudo - └─HashAgg_19(Probe) 1.00 root funcs:count(Column#15)->Column#13 - └─HashJoin_20 9.99 root inner join, equal:[eq(test.t.a, test.t.a)] - ├─HashAgg_30(Build) 7.99 root group by:test.t.a, funcs:count(Column#16)->Column#15, funcs:firstrow(test.t.a)->test.t.a - │ └─TableReader_31 7.99 root data:HashAgg_25 - │ └─HashAgg_25 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#16 - │ └─Selection_29 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) - │ └─TableFullScan_28 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─TableReader_24(Probe) 9.99 root data:Selection_23 - └─Selection_23 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) - └─TableFullScan_22 10000.00 cop[tikv] table:s keep order:false, stats:pseudo +explain format = 'brief' select ifnull(a, 0) from t; +id estRows task access object operator info +Projection 10000.00 root ifnull(test.t.a, 0)->Column#5 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select ifnull(nb, 0) from t; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select ifnull(nb, 0), ifnull(nc, 0) from t; +id estRows task access object operator info +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select ifnull(a, 0), ifnull(nb, 0) from t; +id estRows task access object operator info +Projection 10000.00 root ifnull(test.t.a, 0)->Column#5, test.t.nb +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select ifnull(nb, 0), ifnull(nb, 0) from t; +id estRows task access object operator info +Projection 10000.00 root test.t.nb, test.t.nb +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select 1+ifnull(nb, 0) from t; +id estRows task access object operator info +Projection 10000.00 root plus(1, test.t.nb)->Column#5 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select 1+ifnull(a, 0) from t; +id estRows task access object operator info +Projection 10000.00 root plus(1, ifnull(test.t.a, 0))->Column#5 +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select 1+ifnull(nb, 0) from t where nb=1; +id estRows task access object operator info +Projection 10.00 root plus(1, test.t.nb)->Column#5 +└─TableReader 10.00 root data:Selection + └─Selection 10.00 cop[tikv] eq(test.t.nb, 1) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(ta.nb, 1) or ta.nb is null; +id estRows task access object operator info +HashJoin 8320.83 root left outer join, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] +├─TableReader(Build) 6656.67 root data:Selection +│ └─Selection 6656.67 cop[tikv] or(test.t.nb, 0) +│ └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo +└─TableReader(Probe) 6656.67 root data:Selection + └─Selection 6656.67 cop[tikv] or(test.t.nb, 0) + └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +explain format = 'brief' select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; +id estRows task access object operator info +HashJoin 6656.67 root right outer join, equal:[eq(test.t.nb, test.t.nb)] +├─TableReader(Build) 2218.89 root data:Selection +│ └─Selection 2218.89 cop[tikv] gt(test.t.a, 1), or(test.t.nb, 0) +│ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +└─TableReader(Probe) 6656.67 root data:Selection + └─Selection 6656.67 cop[tikv] or(test.t.nb, 0) + └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo +explain format = 'brief' select * from t ta inner join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; +id estRows task access object operator info +HashJoin 2773.61 root inner join, equal:[eq(test.t.nb, test.t.nb)] +├─TableReader(Build) 2218.89 root data:Selection +│ └─Selection 2218.89 cop[tikv] gt(test.t.a, 1), or(test.t.nb, 0) +│ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +└─TableReader(Probe) 6656.67 root data:Selection + └─Selection 6656.67 cop[tikv] or(test.t.nb, 0) + └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo +explain format = 'brief' select ifnull(t.nc, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#14 +└─Apply 10000.00 root left outer semi join, equal:[eq(test.t.nc, Column#13)] + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─HashAgg(Probe) 1.00 root funcs:count(Column#15)->Column#13 + └─HashJoin 9.99 root inner join, equal:[eq(test.t.a, test.t.a)] + ├─HashAgg(Build) 7.99 root group by:test.t.a, funcs:count(Column#16)->Column#15, funcs:firstrow(test.t.a)->test.t.a + │ └─TableReader 7.99 root data:HashAgg + │ └─HashAgg 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#16 + │ └─Selection 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─TableReader(Probe) 9.99 root data:Selection + └─Selection 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) + └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo +explain format = 'brief' select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; +id estRows task access object operator info +Selection 10000.00 root or(ifnull(test.t.a, 1), isnull(test.t.a)) +└─HashJoin 12500.00 root left outer join, equal:[eq(test.t.nb, test.t.nb)], left cond:[gt(test.t.a, 1)] + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +explain format = 'brief' select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; +id estRows task access object operator info +HashJoin 8002.00 root right outer join, equal:[eq(test.t.nb, test.t.nb)] +├─TableReader(Build) 3333.33 root data:Selection +│ └─Selection 3333.33 cop[tikv] gt(test.t.a, 1) +│ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo +└─TableReader(Probe) 8002.00 root data:Selection + └─Selection 8002.00 cop[tikv] or(ifnull(test.t.a, 1), isnull(test.t.a)) + └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo +explain format = 'brief' select ifnull(t.a, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#14 +└─Apply 10000.00 root left outer semi join, equal:[eq(Column#15, Column#13)] + ├─Projection(Build) 10000.00 root test.t.a, ifnull(test.t.a, 1)->Column#15 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─HashAgg(Probe) 1.00 root funcs:count(Column#17)->Column#13 + └─HashJoin 9.99 root inner join, equal:[eq(test.t.a, test.t.a)] + ├─HashAgg(Build) 7.99 root group by:test.t.a, funcs:count(Column#18)->Column#17, funcs:firstrow(test.t.a)->test.t.a + │ └─TableReader 7.99 root data:HashAgg + │ └─HashAgg 7.99 cop[tikv] group by:test.t.a, funcs:count(1)->Column#18 + │ └─Selection 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─TableReader(Probe) 9.99 root data:Selection + └─Selection 9.99 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a)) + └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo drop table if exists t; create table t(a int); -explain select * from t where _tidb_rowid = 0; +explain format = 'brief' select * from t where _tidb_rowid = 0; id estRows task access object operator info -Point_Get_1 1.00 root table:t handle:0 -explain select * from t where _tidb_rowid > 0; +Point_Get 1.00 root table:t handle:0 +explain format = 'brief' select * from t where _tidb_rowid > 0; id estRows task access object operator info -Projection_4 8000.00 root test.t.a -└─TableReader_6 10000.00 root data:TableRangeScan_5 - └─TableRangeScan_5 10000.00 cop[tikv] table:t range:(0,+inf], keep order:false, stats:pseudo -explain select a, _tidb_rowid from t where a > 0; +Projection 8000.00 root test.t.a +└─TableReader 10000.00 root data:TableRangeScan + └─TableRangeScan 10000.00 cop[tikv] table:t range:(0,+inf], keep order:false, stats:pseudo +explain format = 'brief' select a, _tidb_rowid from t where a > 0; id estRows task access object operator info -TableReader_7 3333.33 root data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t.a, 0) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where _tidb_rowid > 0 and a > 0; +TableReader 3333.33 root data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t.a, 0) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where _tidb_rowid > 0 and a > 0; id estRows task access object operator info -Projection_4 2666.67 root test.t.a -└─TableReader_7 2666.67 root data:Selection_6 - └─Selection_6 2666.67 cop[tikv] gt(test.t.a, 0) - └─TableRangeScan_5 3333.33 cop[tikv] table:t range:(0,+inf], keep order:false, stats:pseudo +Projection 2666.67 root test.t.a +└─TableReader 2666.67 root data:Selection + └─Selection 2666.67 cop[tikv] gt(test.t.a, 0) + └─TableRangeScan 3333.33 cop[tikv] table:t range:(0,+inf], keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int, c int); -explain select * from (select * from t order by (select 2)) t order by a, b; +explain format = 'brief' select * from (select * from t order by (select 2)) t order by a, b; id estRows task access object operator info -Sort_12 10000.00 root test.t.a, test.t.b -└─TableReader_18 10000.00 root data:TableFullScan_17 - └─TableFullScan_17 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from (select * from t order by c) t order by a, b; +Sort 10000.00 root test.t.a, test.t.b +└─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from (select * from t order by c) t order by a, b; id estRows task access object operator info -Sort_6 10000.00 root test.t.a, test.t.b -└─Sort_9 10000.00 root test.t.c - └─TableReader_12 10000.00 root data:TableFullScan_11 - └─TableFullScan_11 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Sort 10000.00 root test.t.a, test.t.b +└─Sort 10000.00 root test.t.c + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; set @@session.tidb_opt_insubq_to_join_and_agg=1; -explain SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; -id estRows task access object operator info -Sort_13 2.00 root Column#3 -└─HashAgg_17 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 - └─Union_18 2.00 root - ├─HashAgg_19 1.00 root group by:1, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 - │ └─TableDual_22 1.00 root rows:1 - └─HashAgg_25 1.00 root group by:1, funcs:firstrow(1)->Column#6, funcs:firstrow(1)->Column#3 - └─TableDual_28 1.00 root rows:1 -explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); -id estRows task access object operator info -HashAgg_15 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 -└─Union_16 2.00 root - ├─HashAgg_17 1.00 root group by:1, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 - │ └─TableDual_20 1.00 root rows:1 - └─StreamAgg_27 1.00 root group by:Column#2, funcs:firstrow(Column#2)->Column#6, funcs:firstrow(Column#2)->Column#3 - └─Projection_32 1.00 root 1->Column#2 - └─TableDual_33 1.00 root rows:1 +explain format = 'brief' SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; +id estRows task access object operator info +Sort 2.00 root Column#3 +└─HashAgg 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 + └─Union 2.00 root + ├─HashAgg 1.00 root group by:1, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 + │ └─TableDual 1.00 root rows:1 + └─HashAgg 1.00 root group by:1, funcs:firstrow(1)->Column#6, funcs:firstrow(1)->Column#3 + └─TableDual 1.00 root rows:1 +explain format = 'brief' SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); +id estRows task access object operator info +HashAgg 2.00 root group by:Column#3, funcs:firstrow(Column#6)->Column#3 +└─Union 2.00 root + ├─HashAgg 1.00 root group by:1, funcs:firstrow(0)->Column#6, funcs:firstrow(0)->Column#3 + │ └─TableDual 1.00 root rows:1 + └─StreamAgg 1.00 root group by:Column#2, funcs:firstrow(Column#2)->Column#6, funcs:firstrow(Column#2)->Column#3 + └─Projection 1.00 root 1->Column#2 + └─TableDual 1.00 root rows:1 create table t (i int key, j int, unique key (i, j)); begin; insert into t values (1, 1); -explain update t set j = -j where i = 1 and j = 1; +explain format = 'brief' update t set j = -j where i = 1 and j = 1; id estRows task access object operator info -Update_3 N/A root N/A -└─Point_Get_1 1.00 root table:t, index:i(i, j) +Update N/A root N/A +└─Selection 1.00 root eq(test.t.j, 1) + └─Point_Get 1.00 root table:t handle:1 rollback; drop table if exists t; create table t(a int); begin; insert into t values (1); -explain select * from t left outer join t t1 on t.a = t1.a where t.a not between 1 and 2; -id estRows task access object operator info -HashJoin_9 8320.83 root left outer join, equal:[eq(test.t.a, test.t.a)] -├─UnionScan_15(Build) 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))), not(isnull(test.t.a)) -│ └─TableReader_18 6656.67 root data:Selection_17 -│ └─Selection_17 6656.67 cop[tikv] not(isnull(test.t.a)), or(lt(test.t.a, 1), gt(test.t.a, 2)) -│ └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─UnionScan_11(Probe) 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))) - └─TableReader_14 6656.67 root data:Selection_13 - └─Selection_13 6656.67 cop[tikv] or(lt(test.t.a, 1), gt(test.t.a, 2)) - └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t left outer join t t1 on t.a = t1.a where t.a not between 1 and 2; +id estRows task access object operator info +HashJoin 8320.83 root left outer join, equal:[eq(test.t.a, test.t.a)] +├─UnionScan(Build) 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))), not(isnull(test.t.a)) +│ └─TableReader 6656.67 root data:Selection +│ └─Selection 6656.67 cop[tikv] not(isnull(test.t.a)), or(lt(test.t.a, 1), gt(test.t.a, 2)) +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─UnionScan(Probe) 6656.67 root not(and(ge(test.t.a, 1), le(test.t.a, 2))) + └─TableReader 6656.67 root data:Selection + └─Selection 6656.67 cop[tikv] or(lt(test.t.a, 1), gt(test.t.a, 2)) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo rollback; drop table if exists t; create table t(a time, b date); insert into t values (1, "1000-01-01"), (2, "1000-01-02"), (3, "1000-01-03"); analyze table t; -explain select * from t where a = 1; +explain format = 'brief' select * from t where a = 1; id estRows task access object operator info -TableReader_7 1.00 root data:Selection_6 -└─Selection_6 1.00 cop[tikv] eq(test.t.a, 00:00:01.000000) - └─TableFullScan_5 3.00 cop[tikv] table:t keep order:false -explain select * from t where b = "1000-01-01"; +TableReader 1.00 root data:Selection +└─Selection 1.00 cop[tikv] eq(test.t.a, 00:00:01.000000) + └─TableFullScan 3.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where b = "1000-01-01"; id estRows task access object operator info -TableReader_7 1.00 root data:Selection_6 -└─Selection_6 1.00 cop[tikv] eq(test.t.b, 1000-01-01 00:00:00.000000) - └─TableFullScan_5 3.00 cop[tikv] table:t keep order:false +TableReader 1.00 root data:Selection +└─Selection 1.00 cop[tikv] eq(test.t.b, 1000-01-01 00:00:00.000000) + └─TableFullScan 3.00 cop[tikv] table:t keep order:false drop table t; create table t(a int); insert into t values (1),(2),(2),(2),(9),(9),(9),(10); analyze table t with 1 buckets; -explain select * from t where a >= 3 and a <= 8; +explain format = 'brief' select * from t where a >= 3 and a <= 8; id estRows task access object operator info -TableReader_7 0.00 root data:Selection_6 -└─Selection_6 0.00 cop[tikv] ge(test.t.a, 3), le(test.t.a, 8) - └─TableFullScan_5 8.00 cop[tikv] table:t keep order:false +TableReader 0.00 root data:Selection +└─Selection 0.00 cop[tikv] ge(test.t.a, 3), le(test.t.a, 8) + └─TableFullScan 8.00 cop[tikv] table:t keep order:false drop table t; create table t(a int, b int, index idx_ab(a, b)); -explain select a, b from t where a in (1) order by b; +explain format = 'brief' select a, b from t where a in (1) order by b; id estRows task access object operator info -IndexReader_12 10.00 root index:IndexRangeScan_11 -└─IndexRangeScan_11 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:true, stats:pseudo -explain select a, b from t where a = 1 order by b; +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:true, stats:pseudo +explain format = 'brief' select a, b from t where a = 1 order by b; id estRows task access object operator info -IndexReader_12 10.00 root index:IndexRangeScan_11 -└─IndexRangeScan_11 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:true, stats:pseudo +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:true, stats:pseudo drop table if exists t; create table t(a int, b int); -explain select a, b from (select a, b, avg(b) over (partition by a)as avg_b from t) as tt where a > 10 and b < 10 and a > avg_b; -id estRows task access object operator info -Projection_8 2666.67 root test.t.a, test.t.b -└─Selection_9 2666.67 root gt(cast(test.t.a), Column#5), lt(test.t.b, 10) - └─Window_10 3333.33 root avg(cast(test.t.b, decimal(65,4) BINARY))->Column#5 over(partition by test.t.a) - └─Sort_14 3333.33 root test.t.a - └─TableReader_13 3333.33 root data:Selection_12 - └─Selection_12 3333.33 cop[tikv] gt(test.t.a, 10) - └─TableFullScan_11 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select a, b from (select a, b, avg(b) over (partition by a)as avg_b from t) as tt where a > 10 and b < 10 and a > avg_b; +id estRows task access object operator info +Projection 2666.67 root test.t.a, test.t.b +└─Selection 2666.67 root gt(cast(test.t.a), Column#5), lt(test.t.b, 10) + └─Window 3333.33 root avg(cast(test.t.b, decimal(15,4) BINARY))->Column#5 over(partition by test.t.a) + └─Sort 3333.33 root test.t.a + └─TableReader 3333.33 root data:Selection + └─Selection 3333.33 cop[tikv] gt(test.t.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int); explain format="dot" select * from t where a < 2; @@ -774,15 +773,74 @@ label = "cop" drop table if exists t; create table t(a binary(16) not null, b varchar(2) default null, c varchar(100) default 'aaaa', key (a,b)); -explain select * from t where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; +explain format = 'brief' select * from t where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; id estRows task access object operator info -IndexLookUp_10 0.10 root -├─IndexRangeScan_8(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:["[250 52 225 9 60 180 40 72 87 52 227 145 127 0 0 0]" "xb","[250 52 225 9 60 180 40 72 87 52 227 145 127 0 0 0]" "xb"], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo -explain update t set c = 'ssss' where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; +IndexLookUp 0.10 root +├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:[0xFA34E1093CB428485734E3917F000000 "xb",0xFA34E1093CB428485734E3917F000000 "xb"], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' update t set c = 'ssss' where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; id estRows task access object operator info -Update_4 N/A root N/A -└─IndexLookUp_11 0.10 root - ├─IndexRangeScan_9(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:["[250 52 225 9 60 180 40 72 87 52 227 145 127 0 0 0]" "xb","[250 52 225 9 60 180 40 72 87 52 227 145 127 0 0 0]" "xb"], keep order:false, stats:pseudo - └─TableRowIDScan_10(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +Update N/A root N/A +└─IndexLookUp 0.10 root + ├─IndexRangeScan(Build) 0.10 cop[tikv] table:t, index:a(a, b) range:[0xFA34E1093CB428485734E3917F000000 "xb",0xFA34E1093CB428485734E3917F000000 "xb"], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 0.10 cop[tikv] table:t keep order:false, stats:pseudo +drop table if exists t; +create table t(a int, b int); +explain format = 'brief' select (select count(n.a) from t) from t n; +id estRows task access object operator info +Projection 1.00 root Column#8 +└─Apply 1.00 root CARTESIAN left outer join + ├─StreamAgg(Build) 1.00 root funcs:count(test.t.a)->Column#7 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:n keep order:false, stats:pseudo + └─MaxOneRow(Probe) 1.00 root + └─Projection 2.00 root Column#7 + └─TableReader 2.00 root data:TableFullScan + └─TableFullScan 2.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select (select sum((select count(a)))) from t; +id estRows task access object operator info +Projection 1.00 root Column#7 +└─Apply 1.00 root CARTESIAN left outer join + ├─StreamAgg(Build) 1.00 root funcs:count(test.t.a)->Column#5 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─HashAgg(Probe) 1.00 root funcs:sum(Column#12)->Column#7 + └─HashJoin 1.00 root CARTESIAN left outer join + ├─HashAgg(Build) 1.00 root group by:1, funcs:sum(Column#14)->Column#12 + │ └─Projection 1.00 root cast(Column#6, decimal(42,0) BINARY)->Column#14 + │ └─MaxOneRow 1.00 root + │ └─Projection 1.00 root Column#5 + │ └─TableDual 1.00 root rows:1 + └─TableDual(Probe) 1.00 root rows:1 +explain format = 'brief' select count(a) from t group by b order by (select count(a)); +id estRows task access object operator info +Sort 8000.00 root Column#4 +└─HashJoin 8000.00 root CARTESIAN left outer join + ├─TableDual(Build) 1.00 root rows:1 + └─HashAgg(Probe) 8000.00 root group by:test.t.b, funcs:count(Column#8)->Column#4 + └─TableReader 8000.00 root data:HashAgg + └─HashAgg 8000.00 cop[tikv] group by:test.t.b, funcs:count(test.t.a)->Column#8 + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select (select sum(count(a))) from t; +id estRows task access object operator info +Projection 1.00 root Column#5 +└─Apply 1.00 root CARTESIAN left outer join + ├─StreamAgg(Build) 1.00 root funcs:count(test.t.a)->Column#4 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo + └─StreamAgg(Probe) 1.00 root funcs:sum(Column#7)->Column#5 + └─Projection 1.00 root cast(Column#4, decimal(42,0) BINARY)->Column#7 + └─TableDual 1.00 root rows:1 +explain format = 'brief' select sum(a), (select sum(a)), count(a) from t group by b order by (select count(a)); +id estRows task access object operator info +Projection 8000.00 root Column#4, Column#4, Column#5 +└─Sort 8000.00 root Column#5 + └─HashJoin 8000.00 root CARTESIAN left outer join + ├─TableDual(Build) 1.00 root rows:1 + └─HashJoin(Probe) 8000.00 root CARTESIAN left outer join + ├─TableDual(Build) 1.00 root rows:1 + └─HashAgg(Probe) 8000.00 root group by:test.t.b, funcs:sum(Column#13)->Column#4, funcs:count(Column#14)->Column#5 + └─TableReader 8000.00 root data:HashAgg + └─HashAgg 8000.00 cop[tikv] group by:test.t.b, funcs:sum(test.t.a)->Column#13, funcs:count(test.t.a)->Column#14 + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; diff --git a/cmd/explaintest/r/explain_easy_stats.result b/cmd/explaintest/r/explain_easy_stats.result index eae0be5ab8b5d..92eee10bfc47c 100644 --- a/cmd/explaintest/r/explain_easy_stats.result +++ b/cmd/explaintest/r/explain_easy_stats.result @@ -12,120 +12,119 @@ set @@session.tidb_opt_agg_push_down = 1; set @@session.tidb_opt_insubq_to_join_and_agg=1; set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; -explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); -id estRows task access object operator info -HashJoin_12 1600.00 root semi join, equal:[eq(Column#13, Column#11)] -├─StreamAgg_27(Build) 1.00 root funcs:sum(Column#16)->Column#11 -│ └─TableReader_28 1.00 root data:StreamAgg_19 -│ └─StreamAgg_19 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 -│ └─TableFullScan_26 2000.00 cop[tikv] table:s keep order:false -└─Projection_13(Probe) 2000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a, decimal(20,0) BINARY)->Column#13 - └─TableReader_15 2000.00 root data:TableFullScan_14 - └─TableFullScan_14 2000.00 cop[tikv] table:t3 keep order:false -explain select * from t1; -id estRows task access object operator info -TableReader_5 1999.00 root data:TableFullScan_4 -└─TableFullScan_4 1999.00 cop[tikv] table:t1 keep order:false -explain select * from t1 order by c2; -id estRows task access object operator info -IndexLookUp_12 1999.00 root -├─IndexFullScan_10(Build) 1999.00 cop[tikv] table:t1, index:c2(c2) keep order:true -└─TableRowIDScan_11(Probe) 1999.00 cop[tikv] table:t1 keep order:false -explain select * from t2 order by c2; -id estRows task access object operator info -Sort_4 1985.00 root test.t2.c2 -└─TableReader_8 1985.00 root data:TableFullScan_7 - └─TableFullScan_7 1985.00 cop[tikv] table:t2 keep order:false -explain select * from t1 where t1.c1 > 0; -id estRows task access object operator info -TableReader_6 1999.00 root data:TableRangeScan_5 -└─TableRangeScan_5 1999.00 cop[tikv] table:t1 range:(0,+inf], keep order:false -explain select t1.c1, t1.c2 from t1 where t1.c2 = 1; -id estRows task access object operator info -IndexReader_6 0.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 0.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false -explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; -id estRows task access object operator info -HashJoin_22 2481.25 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] -├─TableReader_36(Build) 1985.00 root data:Selection_35 -│ └─Selection_35 1985.00 cop[tikv] not(isnull(test.t2.c1)) -│ └─TableFullScan_34 1985.00 cop[tikv] table:t2 keep order:false -└─TableReader_33(Probe) 1998.00 root data:TableRangeScan_32 - └─TableRangeScan_32 1998.00 cop[tikv] table:t1 range:(1,+inf], keep order:false -explain update t1 set t1.c2 = 2 where t1.c1 = 1; -id estRows task access object operator info -Update_3 N/A root N/A -└─Point_Get_1 1.00 root table:t1 handle:1 -explain delete from t1 where t1.c2 = 1; -id estRows task access object operator info -Delete_4 N/A root N/A -└─IndexLookUp_11 0.00 root - ├─IndexRangeScan_9(Build) 0.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false - └─TableRowIDScan_10(Probe) 0.00 cop[tikv] table:t1 keep order:false -explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; -id estRows task access object operator info -Projection_11 1985.00 root cast(Column#8, bigint(21) BINARY)->Column#7 -└─HashJoin_21 1985.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] - ├─HashAgg_25(Build) 1985.00 root group by:test.t2.c2, funcs:count(test.t2.c2)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 - │ └─TableReader_32 1985.00 root data:Selection_31 - │ └─Selection_31 1985.00 cop[tikv] not(isnull(test.t2.c2)) - │ └─TableFullScan_30 1985.00 cop[tikv] table:b keep order:false - └─TableReader_34(Probe) 1999.00 root data:TableFullScan_33 - └─TableFullScan_33 1999.00 cop[tikv] table:a keep order:false -explain select * from t2 order by t2.c2 limit 0, 1; -id estRows task access object operator info -TopN_7 1.00 root test.t2.c2, offset:0, count:1 -└─TableReader_15 1.00 root data:TopN_14 - └─TopN_14 1.00 cop[tikv] test.t2.c2, offset:0, count:1 - └─TableFullScan_13 1985.00 cop[tikv] table:t2 keep order:false -explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; -id estRows task access object operator info -IndexLookUp_11 0.00 root -├─IndexRangeScan_8(Build) 0.00 cop[tikv] table:t1, index:c2(c2) range:(1 1,1 +inf], keep order:false -└─Selection_10(Probe) 0.00 cop[tikv] lt(test.t1.c3, 1) - └─TableRowIDScan_9 0.00 cop[tikv] table:t1 keep order:false -explain select * from t1 where c1 = 1 and c2 > 1; -id estRows task access object operator info -Selection_6 0.50 root gt(test.t1.c2, 1) -└─Point_Get_5 1.00 root table:t1 handle:1 -explain select c1 from t1 where c1 in (select c2 from t2); -id estRows task access object operator info -HashJoin_19 1985.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] -├─HashAgg_23(Build) 1985.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 -│ └─TableReader_30 1985.00 root data:Selection_29 -│ └─Selection_29 1985.00 cop[tikv] not(isnull(test.t2.c2)) -│ └─TableFullScan_28 1985.00 cop[tikv] table:t2 keep order:false -└─TableReader_32(Probe) 1999.00 root data:TableFullScan_31 - └─TableFullScan_31 1999.00 cop[tikv] table:t1 keep order:false -explain select * from information_schema.columns; -id estRows task access object operator info -MemTableScan_4 10000.00 root table:COLUMNS -explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; -id estRows task access object operator info -Projection_12 1999.00 root eq(test.t1.c2, test.t2.c2)->Column#8 -└─Apply_14 1999.00 root CARTESIAN left outer join - ├─TableReader_16(Build) 1999.00 root data:TableFullScan_15 - │ └─TableFullScan_15 1999.00 cop[tikv] table:t1 keep order:false - └─Projection_43(Probe) 1.00 root test.t2.c1, test.t2.c2 - └─IndexLookUp_42 1.00 root limit embedded(offset:0, count:1) - ├─Limit_41(Build) 1.00 cop[tikv] offset:0, count:1 - │ └─IndexRangeScan_39 1.25 cop[tikv] table:t2, index:c1(c1) range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true - └─TableRowIDScan_40(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 order by c1 desc limit 1; -id estRows task access object operator info -Limit_10 1.00 root offset:0, count:1 -└─TableReader_20 1.00 root data:Limit_19 - └─Limit_19 1.00 cop[tikv] offset:0, count:1 - └─TableFullScan_18 1.00 cop[tikv] table:t1 keep order:true, desc +explain format = 'brief' select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); +id estRows task access object operator info +HashJoin 1600.00 root semi join, equal:[eq(Column#13, Column#11)] +├─StreamAgg(Build) 1.00 root funcs:sum(Column#16)->Column#11 +│ └─TableReader 1.00 root data:StreamAgg +│ └─StreamAgg 1.00 cop[tikv] funcs:sum(test.t3.a)->Column#16 +│ └─TableFullScan 2000.00 cop[tikv] table:s keep order:false +└─Projection(Probe) 2000.00 root test.t3.a, test.t3.b, test.t3.c, test.t3.d, cast(test.t3.a, decimal(20,0) BINARY)->Column#13 + └─TableReader 2000.00 root data:TableFullScan + └─TableFullScan 2000.00 cop[tikv] table:t3 keep order:false +explain format = 'brief' select * from t1; +id estRows task access object operator info +TableReader 1999.00 root data:TableFullScan +└─TableFullScan 1999.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select * from t1 order by c2; +id estRows task access object operator info +IndexLookUp 1999.00 root +├─IndexFullScan(Build) 1999.00 cop[tikv] table:t1, index:c2(c2) keep order:true +└─TableRowIDScan(Probe) 1999.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select * from t2 order by c2; +id estRows task access object operator info +Sort 1985.00 root test.t2.c2 +└─TableReader 1985.00 root data:TableFullScan + └─TableFullScan 1985.00 cop[tikv] table:t2 keep order:false +explain format = 'brief' select * from t1 where t1.c1 > 0; +id estRows task access object operator info +TableReader 1999.00 root data:TableRangeScan +└─TableRangeScan 1999.00 cop[tikv] table:t1 range:(0,+inf], keep order:false +explain format = 'brief' select t1.c1, t1.c2 from t1 where t1.c2 = 1; +id estRows task access object operator info +IndexReader 0.00 root index:IndexRangeScan +└─IndexRangeScan 0.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false +explain format = 'brief' select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; +id estRows task access object operator info +HashJoin 2481.25 root left outer join, equal:[eq(test.t1.c2, test.t2.c1)] +├─TableReader(Build) 1985.00 root data:Selection +│ └─Selection 1985.00 cop[tikv] not(isnull(test.t2.c1)) +│ └─TableFullScan 1985.00 cop[tikv] table:t2 keep order:false +└─TableReader(Probe) 1998.00 root data:TableRangeScan + └─TableRangeScan 1998.00 cop[tikv] table:t1 range:(1,+inf], keep order:false +explain format = 'brief' update t1 set t1.c2 = 2 where t1.c1 = 1; +id estRows task access object operator info +Update N/A root N/A +└─Point_Get 1.00 root table:t1 handle:1 +explain format = 'brief' delete from t1 where t1.c2 = 1; +id estRows task access object operator info +Delete N/A root N/A +└─IndexLookUp 0.00 root + ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t1, index:c2(c2) range:[1,1], keep order:false + └─TableRowIDScan(Probe) 0.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; +id estRows task access object operator info +Projection 1985.00 root cast(Column#8, bigint(21) BINARY)->Column#7 +└─HashJoin 1985.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] + ├─HashAgg(Build) 1985.00 root group by:test.t2.c2, funcs:count(test.t2.c2)->Column#8, funcs:firstrow(test.t2.c2)->test.t2.c2 + │ └─TableReader 1985.00 root data:Selection + │ └─Selection 1985.00 cop[tikv] not(isnull(test.t2.c2)) + │ └─TableFullScan 1985.00 cop[tikv] table:b keep order:false + └─TableReader(Probe) 1999.00 root data:TableFullScan + └─TableFullScan 1999.00 cop[tikv] table:a keep order:false +explain format = 'brief' select * from t2 order by t2.c2 limit 0, 1; +id estRows task access object operator info +TopN 1.00 root test.t2.c2, offset:0, count:1 +└─TableReader 1.00 root data:TopN + └─TopN 1.00 cop[tikv] test.t2.c2, offset:0, count:1 + └─TableFullScan 1985.00 cop[tikv] table:t2 keep order:false +explain format = 'brief' select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; +id estRows task access object operator info +IndexLookUp 0.00 root +├─IndexRangeScan(Build) 0.00 cop[tikv] table:t1, index:c2(c2) range:(1 1,1 +inf], keep order:false +└─Selection(Probe) 0.00 cop[tikv] lt(test.t1.c3, 1) + └─TableRowIDScan 0.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select * from t1 where c1 = 1 and c2 > 1; +id estRows task access object operator info +Selection 0.50 root gt(test.t1.c2, 1) +└─Point_Get 1.00 root table:t1 handle:1 +explain format = 'brief' select c1 from t1 where c1 in (select c2 from t2); +id estRows task access object operator info +HashJoin 1985.00 root inner join, equal:[eq(test.t1.c1, test.t2.c2)] +├─HashAgg(Build) 1985.00 root group by:test.t2.c2, funcs:firstrow(test.t2.c2)->test.t2.c2 +│ └─TableReader 1985.00 root data:Selection +│ └─Selection 1985.00 cop[tikv] not(isnull(test.t2.c2)) +│ └─TableFullScan 1985.00 cop[tikv] table:t2 keep order:false +└─TableReader(Probe) 1999.00 root data:TableFullScan + └─TableFullScan 1999.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select * from information_schema.columns; +id estRows task access object operator info +MemTableScan 10000.00 root table:COLUMNS +explain format = 'brief' select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; +id estRows task access object operator info +Projection 1999.00 root eq(test.t1.c2, test.t2.c2)->Column#8 +└─Apply 1999.00 root CARTESIAN left outer join + ├─TableReader(Build) 1999.00 root data:TableFullScan + │ └─TableFullScan 1999.00 cop[tikv] table:t1 keep order:false + └─Projection(Probe) 1.00 root test.t2.c1, test.t2.c2 + └─IndexLookUp 1.00 root limit embedded(offset:0, count:1) + ├─Limit(Build) 1.00 cop[tikv] offset:0, count:1 + │ └─IndexRangeScan 1.25 cop[tikv] table:t2, index:c1(c1) range: decided by [eq(test.t1.c1, test.t2.c1)], keep order:true + └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 order by c1 desc limit 1; +id estRows task access object operator info +Limit 1.00 root offset:0, count:1 +└─TableReader 1.00 root data:Limit + └─Limit 1.00 cop[tikv] offset:0, count:1 + └─TableFullScan 1.00 cop[tikv] table:t1 keep order:true, desc set @@session.tidb_opt_insubq_to_join_and_agg=0; -explain select 1 in (select c2 from t2) from t1; -id estRows task access object operator info -HashJoin_7 1999.00 root CARTESIAN left outer semi join -├─TableReader_14(Build) 0.00 root data:Selection_13 -│ └─Selection_13 0.00 cop[tikv] eq(1, test.t2.c2) -│ └─TableFullScan_12 1985.00 cop[tikv] table:t2 keep order:false -└─TableReader_9(Probe) 1999.00 root data:TableFullScan_8 - └─TableFullScan_8 1999.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select 1 in (select c2 from t2) from t1; +id estRows task access object operator info +HashJoin 1999.00 root CARTESIAN left outer semi join, other cond:eq(1, test.t2.c2) +├─TableReader(Build) 1985.00 root data:TableFullScan +│ └─TableFullScan 1985.00 cop[tikv] table:t2 keep order:false +└─TableReader(Probe) 1999.00 root data:TableFullScan + └─TableFullScan 1999.00 cop[tikv] table:t1 keep order:false explain format="dot" select 1 in (select c2 from t2) from t1; dot contents @@ -135,7 +134,7 @@ node [style=filled, color=lightgrey] color=black label = "root" "HashJoin_7" -> "TableReader_9" -"HashJoin_7" -> "TableReader_14" +"HashJoin_7" -> "TableReader_13" } subgraph cluster8{ node [style=filled, color=lightgrey] @@ -143,48 +142,48 @@ color=black label = "cop" "TableFullScan_8" } -subgraph cluster13{ +subgraph cluster12{ node [style=filled, color=lightgrey] color=black label = "cop" -"Selection_13" -> "TableFullScan_12" +"TableFullScan_12" } "TableReader_9" -> "TableFullScan_8" -"TableReader_14" -> "Selection_13" +"TableReader_13" -> "TableFullScan_12" } -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1; id estRows task access object operator info -Point_Get_1 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0; +Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0; id estRows task access object operator info -TableDual_5 0.00 root rows:0 -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 1; +TableDual 0.00 root rows:0 +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 1; id estRows task access object operator info -Limit_9 1.00 root offset:1, count:1 -└─Point_Get_11 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 0; +Limit 1.00 root offset:1, count:1 +└─Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 0; id estRows task access object operator info -Limit_9 0.00 root offset:1, count:0 -└─Point_Get_11 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1; +Limit 0.00 root offset:1, count:0 +└─Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1; id estRows task access object operator info -Point_Get_1 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 ORDER BY a; +Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 ORDER BY a; id estRows task access object operator info -Point_Get_1 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b; +Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b; id estRows task access object operator info -Point_Get_1 1.00 root table:index_prune, index:PRIMARY(a, b) -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b ORDER BY a limit 1; +Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b ORDER BY a limit 1; id estRows task access object operator info -Point_Get_1 1.00 root table:index_prune, index:PRIMARY(a, b) +Point_Get 1.00 root table:index_prune, index:PRIMARY(a, b) drop table if exists t1, t2, t3, index_prune; set @@session.tidb_opt_insubq_to_join_and_agg=1; drop table if exists tbl; create table tbl(column1 int, column2 int, index idx(column1, column2)); load stats 's/explain_easy_stats_tbl_dnf.json'; -explain select * from tbl where (column1=0 and column2=1) or (column1=1 and column2=3) or (column1=2 and column2=5); +explain format = 'brief' select * from tbl where (column1=0 and column2=1) or (column1=1 and column2=3) or (column1=2 and column2=5); id estRows task access object operator info -IndexReader_6 3.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 3.00 cop[tikv] table:tbl, index:idx(column1, column2) range:[0 1,0 1], [1 3,1 3], [2 5,2 5], keep order:false +IndexReader 3.00 root index:IndexRangeScan +└─IndexRangeScan 3.00 cop[tikv] table:tbl, index:idx(column1, column2) range:[0 1,0 1], [1 3,1 3], [2 5,2 5], keep order:false diff --git a/cmd/explaintest/r/explain_generate_column_substitute.result b/cmd/explaintest/r/explain_generate_column_substitute.result index f0e442aa24d4f..821988170dd87 100644 --- a/cmd/explaintest/r/explain_generate_column_substitute.result +++ b/cmd/explaintest/r/explain_generate_column_substitute.result @@ -109,8 +109,8 @@ a b c e 5 -1 6 4 desc select a+1 from t order by a+1; id estRows task access object operator info -IndexReader_13 10000.00 root index:IndexFullScan_12 -└─IndexFullScan_12 10000.00 cop[tikv] table:t, index:idx_c(c) keep order:true, stats:pseudo +IndexReader_14 10000.00 root index:IndexFullScan_13 +└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:idx_c(c) keep order:true, stats:pseudo select a+1 from t order by a+1; a+1 0 @@ -122,8 +122,8 @@ a+1 6 desc select b+a from t order by b+a; id estRows task access object operator info -IndexReader_13 10000.00 root index:IndexFullScan_12 -└─IndexFullScan_12 10000.00 cop[tikv] table:t, index:idx_e(e) keep order:true, stats:pseudo +IndexReader_14 10000.00 root index:IndexFullScan_13 +└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:idx_e(e) keep order:true, stats:pseudo select b+a from t order by b+a; b+a -3 @@ -168,7 +168,7 @@ desc select * from t where a+1=3; id estRows task access object operator info Projection_4 10.00 root test.t.a, test.t.b, test.t.c, test.t.e └─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a+1=3; a b c e @@ -176,16 +176,16 @@ a b c e desc select a+1 from t where a+1=3; id estRows task access object operator info IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[3,3], keep order:false, stats:pseudo +└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo select a+1 from t where a+1=3; a+1 3 desc select c from t where a+1=3; id estRows task access object operator info Projection_4 10.00 root test.t.c -└─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─IndexLookUp_11 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo + └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select c from t where a+1=3; c 3 @@ -193,7 +193,7 @@ desc select * from t where b+a=3; id estRows task access object operator info Projection_4 10.00 root test.t.a, test.t.b, test.t.c, test.t.e └─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where b+a=3; a b c e @@ -201,23 +201,23 @@ a b c e desc select b+a from t where b+a=3; id estRows task access object operator info IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) range:[3,3], keep order:false, stats:pseudo +└─IndexRangeScan_5 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo select b+a from t where b+a=3; b+a 3 desc select e from t where b+a=3; id estRows task access object operator info Projection_4 10.00 root test.t.e -└─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) range:[3,3], keep order:false, stats:pseudo - └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +└─IndexLookUp_11 10.00 root + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo + └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo select e from t where b+a=3; e 3 desc select a+1 from t where a+1 in (1, 2, 3); id estRows task access object operator info IndexReader_6 30.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 30.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo +└─IndexRangeScan_5 30.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo select a+1 from t where a+1 in (1, 2, 3); a+1 1 @@ -228,7 +228,7 @@ desc select * from t where a+1 in (1, 2, 3); id estRows task access object operator info Projection_4 30.00 root test.t.a, test.t.b, test.t.c, test.t.e └─IndexLookUp_10 30.00 root - ├─IndexRangeScan_8(Build) 30.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_8(Build) 30.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo └─TableRowIDScan_9(Probe) 30.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a+1 in (1, 2, 3); a b c e @@ -239,7 +239,7 @@ a b c e desc select a+1 from t where a+1 between 1 and 4; id estRows task access object operator info IndexReader_6 250.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 250.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[1,4], keep order:false, stats:pseudo +└─IndexRangeScan_5 250.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,4], keep order:false, stats:pseudo select a+1 from t where a+1 between 1 and 4; a+1 1 @@ -250,7 +250,7 @@ desc select * from t where a+1 between 1 and 4; id estRows task access object operator info Projection_4 250.00 root test.t.a, test.t.b, test.t.c, test.t.e └─IndexLookUp_10 250.00 root - ├─IndexRangeScan_8(Build) 250.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[1,4], keep order:false, stats:pseudo + ├─IndexRangeScan_8(Build) 250.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[1,4], keep order:false, stats:pseudo └─TableRowIDScan_9(Probe) 250.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t where a+1 between 1 and 4; a b c e @@ -263,7 +263,7 @@ id estRows task access object operator info Projection_5 10000.00 root test.t.a, test.t.b, test.t.c, test.t.e └─Projection_13 10000.00 root test.t.a, test.t.b, test.t.c, test.t.e, EMPTY_NAME └─IndexLookUp_12 10000.00 root - ├─IndexFullScan_10(Build) 10000.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) keep order:true, stats:pseudo + ├─IndexFullScan_10(Build) 10000.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) keep order:true, stats:pseudo └─TableRowIDScan_11(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select * from t order by a+1; a b c e @@ -276,8 +276,8 @@ a b c e 5 -1 6 4 desc select a+1 from t order by a+1; id estRows task access object operator info -IndexReader_13 10000.00 root index:IndexFullScan_12 -└─IndexFullScan_12 10000.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) keep order:true, stats:pseudo +IndexReader_14 10000.00 root index:IndexFullScan_13 +└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) keep order:true, stats:pseudo select a+1 from t order by a+1; a+1 0 @@ -289,8 +289,8 @@ a+1 6 desc select b+a from t order by b+a; id estRows task access object operator info -IndexReader_13 10000.00 root index:IndexFullScan_12 -└─IndexFullScan_12 10000.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) keep order:true, stats:pseudo +IndexReader_14 10000.00 root index:IndexFullScan_13 +└─IndexFullScan_13 10000.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) keep order:true, stats:pseudo select b+a from t order by b+a; b+a -3 @@ -304,78 +304,88 @@ desc update t set a=1 where a+1 = 3; id estRows task access object operator info Update_4 N/A root N/A └─IndexLookUp_11 10.00 root - ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo desc update t set a=2, b = 3 where b+a = 3; id estRows task access object operator info Update_4 N/A root N/A └─IndexLookUp_11 10.00 root - ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo desc delete from t where a+1 = 3; id estRows task access object operator info Delete_4 N/A root N/A └─IndexLookUp_11 10.00 root - ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(_V$_expr_idx_c_0) range:[3,3], keep order:false, stats:pseudo + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_c(`a` + 1) range:[3,3], keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo desc delete from t where b+a = 0; id estRows task access object operator info Delete_4 N/A root N/A └─IndexLookUp_11 10.00 root - ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(_V$_expr_idx_e_0) range:[0,0], keep order:false, stats:pseudo + ├─IndexRangeScan_9(Build) 10.00 cop[tikv] table:t, index:expr_idx_e(`b` + `a`) range:[0,0], keep order:false, stats:pseudo └─TableRowIDScan_10(Probe) 10.00 cop[tikv] table:t keep order:false, stats:pseudo +alter table t drop index expr_idx_c; +alter table t drop index expr_idx_e; +truncate table t; +alter table t add UNIQUE expr_idx_c((a+1)); +alter table t add UNIQUE expr_idx_e((b+a)); +insert into t values (2, 2.1, default, default); +desc select * from t where a+1 = 3; +id estRows task access object operator info +Projection_4 1.00 root test.t.a, test.t.b, test.t.c, test.t.e +└─Point_Get_5 1.00 root table:t, index:expr_idx_c(`a` + 1) drop table if exists t0; create table t0(c0 float(24), c1 double as (c0) unique); -explain select c0 from t0; +explain format = 'brief' select c0 from t0; id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo -- TableRead drop table if exists t0; create table t0(c0 float(25), c1 double as (c0) unique); -explain select c0 from t0; +explain format = 'brief' select c0 from t0; id estRows task access object operator info -IndexReader_7 10000.00 root index:IndexFullScan_6 -└─IndexFullScan_6 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo -- IndexRead drop table if exists t0; -create table t0(c0 double(24), c1 double as (c0) unique); -explain select c0 from t0; +create table t0(c0 double, c1 double as (c0) unique); +explain format = 'brief' select c0 from t0; id estRows task access object operator info -IndexReader_7 10000.00 root index:IndexFullScan_6 -└─IndexFullScan_6 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo -- IndexRead drop table if exists t0; -create table t0(c0 double(25), c1 double as (c0) unique); -explain select c0 from t0; +create table t0(c0 double, c1 double as (c0) unique); +explain format = 'brief' select c0 from t0; id estRows task access object operator info -IndexReader_7 10000.00 root index:IndexFullScan_6 -└─IndexFullScan_6 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo -- IndexRead drop table if exists t0; create table t0(c0 float(24), c1 float as (c0) unique); -explain select c0 from t0; +explain format = 'brief' select c0 from t0; id estRows task access object operator info -IndexReader_7 10000.00 root index:IndexFullScan_6 -└─IndexFullScan_6 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo +IndexReader 10000.00 root index:IndexFullScan +└─IndexFullScan 10000.00 cop[tikv] table:t0, index:c1(c1) keep order:false, stats:pseudo -- IndexRead drop table if exists t0; create table t0(c0 float(25), c1 float as (c0) unique); -explain select c0 from t0; +explain format = 'brief' select c0 from t0; id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo -- TableRead drop table if exists t0; -create table t0(c0 double(24), c1 float as (c0) unique); -explain select c0 from t0; +create table t0(c0 double, c1 float as (c0) unique); +explain format = 'brief' select c0 from t0; id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo -- TableRead drop table if exists t0; -create table t0(c0 double(25), c1 float as (c0) unique); -explain select c0 from t0; +create table t0(c0 double, c1 float as (c0) unique); +explain format = 'brief' select c0 from t0; id estRows task access object operator info -TableReader_5 10000.00 root data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain_indexmerge.result b/cmd/explaintest/r/explain_indexmerge.result index ef7f6cdf80088..4a048b40da7f7 100644 --- a/cmd/explaintest/r/explain_indexmerge.result +++ b/cmd/explaintest/r/explain_indexmerge.result @@ -4,65 +4,65 @@ create index tb on t (b); create index tc on t (c); create index td on t (d); load stats 's/explain_indexmerge_stats_t.json'; -explain select * from t where a < 50 or b < 50; +explain format = 'brief' select * from t where a < 50 or b < 50; id estRows task access object operator info -TableReader_7 98.00 root data:Selection_6 -└─Selection_6 98.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 50)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select * from t where (a < 50 or b < 50) and f > 100; +TableReader 98.00 root data:Selection +└─Selection 98.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 50)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; id estRows task access object operator info -TableReader_7 98.00 root data:Selection_6 -└─Selection_6 98.00 cop[tikv] gt(test.t.f, 100), or(lt(test.t.a, 50), lt(test.t.b, 50)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select * from t where b < 50 or c < 50; +TableReader 98.00 root data:Selection +└─Selection 98.00 cop[tikv] gt(test.t.f, 100), or(lt(test.t.a, 50), lt(test.t.b, 50)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where b < 50 or c < 50; id estRows task access object operator info -TableReader_7 98.00 root data:Selection_6 -└─Selection_6 98.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 50)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false +TableReader 98.00 root data:Selection +└─Selection 98.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 50)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false set session tidb_enable_index_merge = on; -explain select * from t where a < 50 or b < 50; -id estRows task access object operator info -IndexMerge_11 98.00 root -├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false -├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false -└─TableRowIDScan_10(Probe) 98.00 cop[tikv] table:t keep order:false -explain select * from t where (a < 50 or b < 50) and f > 100; -id estRows task access object operator info -IndexMerge_12 98.00 root -├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false -├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false -└─Selection_11(Probe) 98.00 cop[tikv] gt(test.t.f, 100) - └─TableRowIDScan_10 98.00 cop[tikv] table:t keep order:false -explain select * from t where a < 50 or b < 5000000; -id estRows task access object operator info -TableReader_7 4999999.00 root data:Selection_6 -└─Selection_6 4999999.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 5000000)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select * from t where b < 50 or c < 50; -id estRows task access object operator info -IndexMerge_11 98.00 root -├─IndexRangeScan_8(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false -├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false -└─TableRowIDScan_10(Probe) 98.00 cop[tikv] table:t keep order:false -explain select * from t where b < 50 or c < 5000000; -id estRows task access object operator info -TableReader_7 4999999.00 root data:Selection_6 -└─Selection_6 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select * from t where a < 50 or b < 50 or c < 50; -id estRows task access object operator info -IndexMerge_12 147.00 root -├─TableRangeScan_8(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false -├─IndexRangeScan_9(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false -├─IndexRangeScan_10(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false -└─TableRowIDScan_11(Probe) 147.00 cop[tikv] table:t keep order:false -explain select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; -id estRows task access object operator info -IndexMerge_17 0.00 root -├─TableRangeScan_13(Build) 9.00 cop[tikv] table:t range:[-inf,10), keep order:false -├─IndexRangeScan_14(Build) 9.00 cop[tikv] table:t, index:td(d) range:[-inf,10), keep order:false -└─Selection_16(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.b, 10000), lt(test.t.c, 10000)) - └─TableRowIDScan_15 18.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where a < 50 or b < 50; +id estRows task access object operator info +IndexMerge 98.00 root +├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false +└─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; +id estRows task access object operator info +IndexMerge 98.00 root +├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false +└─Selection(Probe) 98.00 cop[tikv] gt(test.t.f, 100) + └─TableRowIDScan 98.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where a < 50 or b < 5000000; +id estRows task access object operator info +TableReader 4999999.00 root data:Selection +└─Selection 4999999.00 cop[tikv] or(lt(test.t.a, 50), lt(test.t.b, 5000000)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where b < 50 or c < 50; +id estRows task access object operator info +IndexMerge 98.00 root +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false +└─TableRowIDScan(Probe) 98.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where b < 50 or c < 5000000; +id estRows task access object operator info +TableReader 4999999.00 root data:Selection +└─Selection 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where a < 50 or b < 50 or c < 50; +id estRows task access object operator info +IndexMerge 147.00 root +├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tc(c) range:[-inf,50), keep order:false +└─TableRowIDScan(Probe) 147.00 cop[tikv] table:t keep order:false +explain format = 'brief' select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; +id estRows task access object operator info +IndexMerge 0.00 root +├─TableRangeScan(Build) 9.00 cop[tikv] table:t range:[-inf,10), keep order:false +├─IndexRangeScan(Build) 9.00 cop[tikv] table:t, index:td(d) range:[-inf,10), keep order:false +└─Selection(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.b, 10000), lt(test.t.c, 10000)) + └─TableRowIDScan 18.00 cop[tikv] table:t keep order:false explain format="dot" select * from t where (a < 50 or b < 50) and f > 100; dot contents @@ -97,39 +97,56 @@ label = "cop" } set session tidb_enable_index_merge = off; -explain select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; -id estRows task access object operator info -IndexMerge_9 3560000.00 root -├─TableRangeScan_5(Build) 500000.00 cop[tikv] table:t range:[-inf,500000], keep order:false -├─IndexRangeScan_6(Build) 1000000.00 cop[tikv] table:t, index:tb(b) range:[-inf,1000000], keep order:false -├─IndexRangeScan_7(Build) 3000000.00 cop[tikv] table:t, index:tc(c) range:[-inf,3000000], keep order:false -└─TableRowIDScan_8(Probe) 3560000.00 cop[tikv] table:t keep order:false -explain select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; -id estRows task access object operator info -IndexMerge_8 4999999.00 root -├─IndexRangeScan_5(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false -├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tc(c) range:[-inf,5000000), keep order:false -└─TableRowIDScan_7(Probe) 4999999.00 cop[tikv] table:t keep order:false -explain select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; -id estRows task access object operator info -IndexMerge_9 0.00 root -├─IndexRangeScan_5(Build) 9999.00 cop[tikv] table:t, index:tb(b) range:[-inf,10000), keep order:false -├─IndexRangeScan_6(Build) 9999.00 cop[tikv] table:t, index:tc(c) range:[-inf,10000), keep order:false -└─Selection_8(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10)) - └─TableRowIDScan_7 19978.00 cop[tikv] table:t keep order:false -explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; -id estRows task access object operator info -TableReader_7 4999999.00 root data:Selection_6 -└─Selection_6 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; -id estRows task access object operator info -TableReader_7 4999999.00 root data:Selection_6 -└─Selection_6 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) - └─TableFullScan_5 5000000.00 cop[tikv] table:t keep order:false -explain select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; -id estRows task access object operator info -IndexMerge_8 4999999.00 root -├─TableRangeScan_5(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false -├─IndexRangeScan_6(Build) 4999999.00 cop[tikv] table:t, index:tb(b) range:[-inf,5000000), keep order:false -└─TableRowIDScan_7(Probe) 4999999.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; +id estRows task access object operator info +IndexMerge 3560000.00 root +├─TableRangeScan(Build) 500000.00 cop[tikv] table:t range:[-inf,500000], keep order:false +├─IndexRangeScan(Build) 1000000.00 cop[tikv] table:t, index:tb(b) range:[-inf,1000000], keep order:false +├─IndexRangeScan(Build) 3000000.00 cop[tikv] table:t, index:tc(c) range:[-inf,3000000], keep order:false +└─TableRowIDScan(Probe) 3560000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; +id estRows task access object operator info +IndexMerge 4999999.00 root +├─IndexRangeScan(Build) 49.00 cop[tikv] table:t, index:tb(b) range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 4999999.00 cop[tikv] table:t, index:tc(c) range:[-inf,5000000), keep order:false +└─TableRowIDScan(Probe) 4999999.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; +id estRows task access object operator info +IndexMerge 0.00 root +├─IndexRangeScan(Build) 9999.00 cop[tikv] table:t, index:tb(b) range:[-inf,10000), keep order:false +├─IndexRangeScan(Build) 9999.00 cop[tikv] table:t, index:tc(c) range:[-inf,10000), keep order:false +└─Selection(Probe) 0.00 cop[tikv] lt(test.t.f, 10), or(lt(test.t.a, 10), lt(test.t.d, 10)) + └─TableRowIDScan 19978.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; +id estRows task access object operator info +TableReader 4999999.00 root data:Selection +└─Selection 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; +id estRows task access object operator info +TableReader 4999999.00 root data:Selection +└─Selection 4999999.00 cop[tikv] or(lt(test.t.b, 50), lt(test.t.c, 5000000)) + └─TableFullScan 5000000.00 cop[tikv] table:t keep order:false +explain format = 'brief' select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; +id estRows task access object operator info +IndexMerge 4999999.00 root +├─TableRangeScan(Build) 49.00 cop[tikv] table:t range:[-inf,50), keep order:false +├─IndexRangeScan(Build) 4999999.00 cop[tikv] table:t, index:tb(b) range:[-inf,5000000), keep order:false +└─TableRowIDScan(Probe) 4999999.00 cop[tikv] table:t keep order:false +set session tidb_enable_index_merge = on; +drop table if exists t; +CREATE TABLE t ( +`id` int(11) NOT NULL, +`aid` bigint, +`c1` varchar(255) DEFAULT NULL, +`c2` varchar(255) DEFAULT NULL, +PRIMARY KEY (`id`), +KEY `aid_c1` (`aid`,`c1`), +KEY `aid_c2` (`aid`,`c2`) +); +desc select /*+ USE_INDEX_MERGE(t, aid_c1, aid_c2) */ * from t where (aid = 1 and c1='aaa') or (aid = 2 and c2='bbb'); +id estRows task access object operator info +IndexMerge_8 269.49 root +├─IndexRangeScan_5(Build) 0.10 cop[tikv] table:t, index:aid_c1(aid, c1) range:[1 "aaa",1 "aaa"], keep order:false, stats:pseudo +├─IndexRangeScan_6(Build) 0.10 cop[tikv] table:t, index:aid_c2(aid, c2) range:[2 "bbb",2 "bbb"], keep order:false, stats:pseudo +└─TableRowIDScan_7(Probe) 269.49 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/explain_join_stats.result b/cmd/explaintest/r/explain_join_stats.result index 73bb6e2671ba4..15e68179c5085 100644 --- a/cmd/explaintest/r/explain_join_stats.result +++ b/cmd/explaintest/r/explain_join_stats.result @@ -4,24 +4,24 @@ create table e(a int, b int, key idx_a(a), key idx_b(b)) ENGINE=InnoDB DEFAULT C load stats 's/explain_join_stats_e.json'; create table lo(a int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (a)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30002; load stats 's/explain_join_stats_lo.json'; -explain select count(*) from e, lo where lo.a=e.a and e.b=22336; +explain format = 'brief' select count(*) from e, lo where lo.a=e.a and e.b=22336; id estRows task access object operator info -StreamAgg_13 1.00 root funcs:count(1)->Column#5 -└─HashJoin_89 19977.00 root inner join, equal:[eq(test.lo.a, test.e.a)] - ├─TableReader_50(Build) 250.00 root data:TableFullScan_49 - │ └─TableFullScan_49 250.00 cop[tikv] table:lo keep order:false - └─IndexLookUp_61(Probe) 19977.00 root - ├─IndexRangeScan_58(Build) 19977.00 cop[tikv] table:e, index:idx_b(b) range:[22336,22336], keep order:false - └─Selection_60(Probe) 19977.00 cop[tikv] not(isnull(test.e.a)) - └─TableRowIDScan_59 19977.00 cop[tikv] table:e keep order:false -explain select /*+ TIDB_INLJ(e) */ count(*) from e, lo where lo.a=e.a and e.b=22336; +StreamAgg 1.00 root funcs:count(1)->Column#5 +└─HashJoin 19977.00 root inner join, equal:[eq(test.lo.a, test.e.a)] + ├─TableReader(Build) 250.00 root data:TableFullScan + │ └─TableFullScan 250.00 cop[tikv] table:lo keep order:false + └─IndexLookUp(Probe) 19977.00 root + ├─IndexRangeScan(Build) 19977.00 cop[tikv] table:e, index:idx_b(b) range:[22336,22336], keep order:false + └─Selection(Probe) 19977.00 cop[tikv] not(isnull(test.e.a)) + └─TableRowIDScan 19977.00 cop[tikv] table:e keep order:false +explain format = 'brief' select /*+ TIDB_INLJ(e) */ count(*) from e, lo where lo.a=e.a and e.b=22336; id estRows task access object operator info -StreamAgg_12 1.00 root funcs:count(1)->Column#5 -└─IndexJoin_56 19977.00 root inner join, inner:IndexLookUp_55, outer key:test.lo.a, inner key:test.e.a - ├─TableReader_40(Build) 250.00 root data:TableFullScan_39 - │ └─TableFullScan_39 250.00 cop[tikv] table:lo keep order:false - └─IndexLookUp_55(Probe) 79.91 root - ├─Selection_53(Build) 4080.00 cop[tikv] not(isnull(test.e.a)) - │ └─IndexRangeScan_51 4080.00 cop[tikv] table:e, index:idx_a(a) range: decided by [eq(test.e.a, test.lo.a)], keep order:false - └─Selection_54(Probe) 79.91 cop[tikv] eq(test.e.b, 22336) - └─TableRowIDScan_52 4080.00 cop[tikv] table:e keep order:false +StreamAgg 1.00 root funcs:count(1)->Column#5 +└─IndexJoin 19977.00 root inner join, inner:IndexLookUp, outer key:test.lo.a, inner key:test.e.a, equal cond:eq(test.lo.a, test.e.a) + ├─TableReader(Build) 250.00 root data:TableFullScan + │ └─TableFullScan 250.00 cop[tikv] table:lo keep order:false + └─IndexLookUp(Probe) 79.91 root + ├─Selection(Build) 4080.00 cop[tikv] not(isnull(test.e.a)) + │ └─IndexRangeScan 4080.00 cop[tikv] table:e, index:idx_a(a) range: decided by [eq(test.e.a, test.lo.a)], keep order:false + └─Selection(Probe) 79.91 cop[tikv] eq(test.e.b, 22336) + └─TableRowIDScan 4080.00 cop[tikv] table:e keep order:false diff --git a/cmd/explaintest/r/explain_union_scan.result b/cmd/explaintest/r/explain_union_scan.result index 087f0d62efa21..1ef48623efd4a 100644 --- a/cmd/explaintest/r/explain_union_scan.result +++ b/cmd/explaintest/r/explain_union_scan.result @@ -10,22 +10,22 @@ load stats "s/explain_union_scan.json"; insert into city values("06766b3ef41d484d8878606393f1ed0b", 88, "chongqing", "chongqing city"); begin; update city set province_id = 77 where id="06766b3ef41d484d8878606393f1ed0b"; -explain select t1.*, t2.province_id as provinceID, t2.city_name as cityName, t3.description as description from city t1 inner join city t2 on t1.id = t2.id left join city t3 on t1.province_id = t3.province_id where t1.province_id > 1 and t1.province_id < 100 limit 10; +explain format = 'brief' select t1.*, t2.province_id as provinceID, t2.city_name as cityName, t3.description as description from city t1 inner join city t2 on t1.id = t2.id left join city t3 on t1.province_id = t3.province_id where t1.province_id > 1 and t1.province_id < 100 limit 10; id estRows task access object operator info -Limit_20 10.00 root offset:0, count:10 -└─HashJoin_22 10.00 root left outer join, equal:[eq(test.city.province_id, test.city.province_id)] - ├─Limit_25(Build) 10.00 root offset:0, count:10 - │ └─IndexJoin_38 10.00 root inner join, inner:UnionScan_37, outer key:test.city.id, inner key:test.city.id - │ ├─UnionScan_47(Build) 10.00 root - │ │ └─TableReader_49 10.00 root data:TableFullScan_48 - │ │ └─TableFullScan_48 10.00 cop[tikv] table:t2 keep order:false - │ └─UnionScan_37(Probe) 1.00 root gt(test.city.province_id, 1), lt(test.city.province_id, 100) - │ └─IndexLookUp_36 1.00 root - │ ├─IndexRangeScan_33(Build) 1.00 cop[tikv] table:t1, index:PRIMARY(id) range: decided by [eq(test.city.id, test.city.id)], keep order:false - │ └─Selection_35(Probe) 1.00 cop[tikv] gt(test.city.province_id, 1), lt(test.city.province_id, 100) - │ └─TableRowIDScan_34 1.00 cop[tikv] table:t1 keep order:false - └─UnionScan_57(Probe) 536284.00 root gt(test.city.province_id, 1), lt(test.city.province_id, 100), not(isnull(test.city.province_id)) - └─TableReader_60 536284.00 root data:Selection_59 - └─Selection_59 536284.00 cop[tikv] gt(test.city.province_id, 1), lt(test.city.province_id, 100), not(isnull(test.city.province_id)) - └─TableFullScan_58 536284.00 cop[tikv] table:t3 keep order:false +Limit 10.00 root offset:0, count:10 +└─HashJoin 10.00 root left outer join, equal:[eq(test.city.province_id, test.city.province_id)] + ├─Limit(Build) 10.00 root offset:0, count:10 + │ └─IndexJoin 10.00 root inner join, inner:UnionScan, outer key:test.city.id, inner key:test.city.id, equal cond:eq(test.city.id, test.city.id) + │ ├─UnionScan(Build) 10.00 root + │ │ └─TableReader 10.00 root data:TableFullScan + │ │ └─TableFullScan 10.00 cop[tikv] table:t2 keep order:false + │ └─UnionScan(Probe) 1.00 root gt(test.city.province_id, 1), lt(test.city.province_id, 100) + │ └─IndexLookUp 1.00 root + │ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:PRIMARY(id) range: decided by [eq(test.city.id, test.city.id)], keep order:false + │ └─Selection(Probe) 1.00 cop[tikv] gt(test.city.province_id, 1), lt(test.city.province_id, 100) + │ └─TableRowIDScan 1.00 cop[tikv] table:t1 keep order:false + └─UnionScan(Probe) 536284.00 root gt(test.city.province_id, 1), lt(test.city.province_id, 100), not(isnull(test.city.province_id)) + └─TableReader 536284.00 root data:Selection + └─Selection 536284.00 cop[tikv] gt(test.city.province_id, 1), lt(test.city.province_id, 100), not(isnull(test.city.province_id)) + └─TableFullScan 536284.00 cop[tikv] table:t3 keep order:false commit; diff --git a/cmd/explaintest/r/generated_columns.result b/cmd/explaintest/r/generated_columns.result index 7ab25230bd2ec..761dfc6053354 100644 --- a/cmd/explaintest/r/generated_columns.result +++ b/cmd/explaintest/r/generated_columns.result @@ -1,4 +1,4 @@ -set @@tidb_partition_prune_mode='dynamic-only'; +set @@tidb_partition_prune_mode='dynamic'; DROP TABLE IF EXISTS person; CREATE TABLE person ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, @@ -7,12 +7,12 @@ address_info JSON, city VARCHAR(64) AS (JSON_UNQUOTE(JSON_EXTRACT(address_info, '$.city'))) STORED, KEY (city) ); -EXPLAIN SELECT name, id FROM person WHERE city = 'Beijing'; +EXPLAIN format = 'brief' SELECT name, id FROM person WHERE city = 'Beijing'; id estRows task access object operator info -Projection_4 10.00 root test.person.name, test.person.id -└─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:person, index:city(city) range:["Beijing","Beijing"], keep order:false, stats:pseudo - └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:person keep order:false, stats:pseudo +Projection 10.00 root test.person.name, test.person.id +└─IndexLookUp 10.00 root + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:person, index:city(city) range:["Beijing","Beijing"], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 10.00 cop[tikv] table:person keep order:false, stats:pseudo DROP TABLE IF EXISTS `sgc`; CREATE TABLE `sgc` ( `j1` JSON DEFAULT NULL, @@ -23,24 +23,24 @@ KEY `idx_a` (`a`), KEY `idx_b` (`b`), KEY `idx_a_b` (`a`,`b`) ); -EXPLAIN SELECT a FROM sgc where a < 3; +EXPLAIN format = 'brief' SELECT a FROM sgc where a < 3; id estRows task access object operator info -IndexReader_6 3323.33 root index:IndexRangeScan_5 -└─IndexRangeScan_5 3323.33 cop[tikv] table:sgc, index:idx_a(a) range:[-inf,3), keep order:false, stats:pseudo -EXPLAIN SELECT a, b FROM sgc where a < 3; +IndexReader 3323.33 root index:IndexRangeScan +└─IndexRangeScan 3323.33 cop[tikv] table:sgc, index:idx_a(a) range:[-inf,3), keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT a, b FROM sgc where a < 3; id estRows task access object operator info -IndexReader_6 3323.33 root index:IndexRangeScan_5 -└─IndexRangeScan_5 3323.33 cop[tikv] table:sgc, index:idx_a_b(a, b) range:[-inf,3), keep order:false, stats:pseudo -EXPLAIN SELECT a, b from sgc where b < 3; +IndexReader 3323.33 root index:IndexRangeScan +└─IndexRangeScan 3323.33 cop[tikv] table:sgc, index:idx_a_b(a, b) range:[-inf,3), keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT a, b from sgc where b < 3; id estRows task access object operator info -IndexReader_13 3323.33 root index:Selection_12 -└─Selection_12 3323.33 cop[tikv] lt(test.sgc.b, 3) - └─IndexFullScan_11 10000.00 cop[tikv] table:sgc, index:idx_a_b(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT a, b from sgc where a < 3 and b < 3; +IndexReader 3323.33 root index:Selection +└─Selection 3323.33 cop[tikv] lt(test.sgc.b, 3) + └─IndexFullScan 10000.00 cop[tikv] table:sgc, index:idx_a_b(a, b) keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT a, b from sgc where a < 3 and b < 3; id estRows task access object operator info -IndexReader_11 1104.45 root index:Selection_10 -└─Selection_10 1104.45 cop[tikv] lt(test.sgc.b, 3) - └─IndexRangeScan_9 3323.33 cop[tikv] table:sgc, index:idx_a_b(a, b) range:[-inf,3), keep order:false, stats:pseudo +IndexReader 1104.45 root index:Selection +└─Selection 1104.45 cop[tikv] lt(test.sgc.b, 3) + └─IndexRangeScan 3323.33 cop[tikv] table:sgc, index:idx_a_b(a, b) range:[-inf,3), keep order:false, stats:pseudo DROP TABLE IF EXISTS sgc1, sgc2; CREATE TABLE `sgc1` ( @@ -70,26 +70,26 @@ VALUES ('{"a": 1}', '{"1": "1"}'), INSERT INTO sgc2(j1, j2) VALUES ('{"a": 1}', '{"1": "1"}'); ANALYZE TABLE sgc1, sgc2; -EXPLAIN SELECT /*+ TIDB_INLJ(sgc1, sgc2) */ * from sgc1 join sgc2 on sgc1.a=sgc2.a; -id estRows task access object operator info -IndexJoin_26 5.00 root inner join, inner:IndexLookUp_25, outer key:test.sgc2.a, inner key:test.sgc1.a -├─TableReader_47(Build) 1.00 root data:Selection_46 -│ └─Selection_46 1.00 cop[tikv] not(isnull(test.sgc2.a)) -│ └─TableFullScan_45 1.00 cop[tikv] table:sgc2 keep order:false -└─IndexLookUp_25(Probe) 5.00 root - ├─Selection_24(Build) 5.00 cop[tikv] not(isnull(test.sgc1.a)) - │ └─IndexRangeScan_22 5.00 cop[tikv] table:sgc1, index:idx_a(a) range: decided by [eq(test.sgc1.a, test.sgc2.a)], keep order:false - └─TableRowIDScan_23(Probe) 5.00 cop[tikv] table:sgc1 keep order:false -EXPLAIN SELECT * from sgc1 join sgc2 on sgc1.a=sgc2.a; -id estRows task access object operator info -Projection_6 5.00 root test.sgc1.j1, test.sgc1.j2, test.sgc1.a, test.sgc1.b, test.sgc2.j1, test.sgc2.j2, test.sgc2.a, test.sgc2.b -└─HashJoin_38 5.00 root inner join, equal:[eq(test.sgc2.a, test.sgc1.a)] - ├─TableReader_57(Build) 1.00 root data:Selection_56 - │ └─Selection_56 1.00 cop[tikv] not(isnull(test.sgc2.a)) - │ └─TableFullScan_55 1.00 cop[tikv] table:sgc2 keep order:false - └─TableReader_66(Probe) 5.00 root data:Selection_65 - └─Selection_65 5.00 cop[tikv] not(isnull(test.sgc1.a)) - └─TableFullScan_64 5.00 cop[tikv] table:sgc1 keep order:false +EXPLAIN format = 'brief' SELECT /*+ TIDB_INLJ(sgc1, sgc2) */ * from sgc1 join sgc2 on sgc1.a=sgc2.a; +id estRows task access object operator info +IndexJoin 5.00 root inner join, inner:IndexLookUp, outer key:test.sgc2.a, inner key:test.sgc1.a, equal cond:eq(test.sgc2.a, test.sgc1.a) +├─TableReader(Build) 1.00 root data:Selection +│ └─Selection 1.00 cop[tikv] not(isnull(test.sgc2.a)) +│ └─TableFullScan 1.00 cop[tikv] table:sgc2 keep order:false +└─IndexLookUp(Probe) 5.00 root + ├─Selection(Build) 5.00 cop[tikv] not(isnull(test.sgc1.a)) + │ └─IndexRangeScan 5.00 cop[tikv] table:sgc1, index:idx_a(a) range: decided by [eq(test.sgc1.a, test.sgc2.a)], keep order:false + └─TableRowIDScan(Probe) 5.00 cop[tikv] table:sgc1 keep order:false +EXPLAIN format = 'brief' SELECT * from sgc1 join sgc2 on sgc1.a=sgc2.a; +id estRows task access object operator info +Projection 5.00 root test.sgc1.j1, test.sgc1.j2, test.sgc1.a, test.sgc1.b, test.sgc2.j1, test.sgc2.j2, test.sgc2.a, test.sgc2.b +└─HashJoin 5.00 root inner join, equal:[eq(test.sgc2.a, test.sgc1.a)] + ├─TableReader(Build) 1.00 root data:Selection + │ └─Selection 1.00 cop[tikv] not(isnull(test.sgc2.a)) + │ └─TableFullScan 1.00 cop[tikv] table:sgc2 keep order:false + └─TableReader(Probe) 5.00 root data:Selection + └─Selection 5.00 cop[tikv] not(isnull(test.sgc1.a)) + └─TableFullScan 5.00 cop[tikv] table:sgc1 keep order:false DROP TABLE IF EXISTS sgc3; CREATE TABLE sgc3 ( j JSON, @@ -103,39 +103,39 @@ PARTITION p3 VALUES LESS THAN (4), PARTITION p4 VALUES LESS THAN (5), PARTITION p5 VALUES LESS THAN (6), PARTITION max VALUES LESS THAN MAXVALUE); -EXPLAIN SELECT * FROM sgc3 WHERE a <= 1; +EXPLAIN format = 'brief' SELECT * FROM sgc3 WHERE a <= 1; id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.sgc3.a, 1) - └─TableFullScan_5 10000.00 cop[tikv] table:sgc3 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM sgc3 WHERE a < 7; +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] le(test.sgc3.a, 1) + └─TableFullScan 10000.00 cop[tikv] table:sgc3 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT * FROM sgc3 WHERE a < 7; id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.sgc3.a, 7) - └─TableFullScan_5 10000.00 cop[tikv] table:sgc3 keep order:false, stats:pseudo +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.sgc3.a, 7) + └─TableFullScan 10000.00 cop[tikv] table:sgc3 keep order:false, stats:pseudo DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT, b INT AS (a+1) VIRTUAL, c INT AS (b+1) VIRTUAL, d INT AS (c+1) VIRTUAL, KEY(b), INDEX IDX(c, d)); INSERT INTO t1 (a) VALUES (0); -EXPLAIN SELECT b FROM t1 WHERE b=1; -id estRows task access object operator info -IndexReader_6 10.00 root index:IndexRangeScan_5 -└─IndexRangeScan_5 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo -EXPLAIN SELECT b, c, d FROM t1 WHERE b=1; -id estRows task access object operator info -Projection_4 10.00 root test.t1.b, test.t1.c, test.t1.d -└─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo - └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b=1; -id estRows task access object operator info -IndexLookUp_10 10.00 root -├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT c FROM t1 WHERE c=2 AND d=3; -id estRows task access object operator info -Projection_4 0.10 root test.t1.c -└─IndexReader_6 0.10 root index:IndexRangeScan_5 - └─IndexRangeScan_5 0.10 cop[tikv] table:t1, index:IDX(c, d) range:[2 3,2 3], keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT b FROM t1 WHERE b=1; +id estRows task access object operator info +IndexReader 10.00 root index:IndexRangeScan +└─IndexRangeScan 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT b, c, d FROM t1 WHERE b=1; +id estRows task access object operator info +Projection 10.00 root test.t1.b, test.t1.c, test.t1.d +└─IndexLookUp 10.00 root + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT * FROM t1 WHERE b=1; +id estRows task access object operator info +IndexLookUp 10.00 root +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:b(b) range:[1,1], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT c FROM t1 WHERE c=2 AND d=3; +id estRows task access object operator info +Projection 0.10 root test.t1.c +└─IndexReader 0.10 root index:IndexRangeScan + └─IndexRangeScan 0.10 cop[tikv] table:t1, index:IDX(c, d) range:[2 3,2 3], keep order:false, stats:pseudo DROP TABLE IF EXISTS person; CREATE TABLE person ( id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, @@ -144,68 +144,70 @@ address_info JSON, city_no INT AS (JSON_EXTRACT(address_info, '$.city_no')) VIRTUAL, KEY(city_no)); INSERT INTO person (name, address_info) VALUES ("John", CAST('{"city_no": 1}' AS JSON)); -EXPLAIN SELECT name FROM person where city_no=1; +EXPLAIN format = 'brief' SELECT name FROM person where city_no=1; id estRows task access object operator info -Projection_4 10.00 root test.person.name -└─IndexLookUp_10 10.00 root - ├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:person, index:city_no(city_no) range:[1,1], keep order:false, stats:pseudo - └─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:person keep order:false, stats:pseudo +Projection 10.00 root test.person.name +└─IndexLookUp 10.00 root + ├─IndexRangeScan(Build) 10.00 cop[tikv] table:person, index:city_no(city_no) range:[1,1], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 10.00 cop[tikv] table:person keep order:false, stats:pseudo DROP TABLE IF EXISTS t1; CREATE TABLE t1 (a INT, b INT GENERATED ALWAYS AS (-a) VIRTUAL, c INT GENERATED ALWAYS AS (-a) STORED, index (c)); INSERT INTO t1 (a) VALUES (2), (1), (1), (3), (NULL); -EXPLAIN SELECT sum(a) FROM t1 GROUP BY b; -id estRows task access object operator info -HashAgg_5 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 -└─Projection_12 10000.00 root cast(test.t1.a, decimal(65,0) BINARY)->Column#6, test.t1.b - └─TableReader_9 10000.00 root data:TableFullScan_8 - └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT sum(a) FROM t1 GROUP BY c; -id estRows task access object operator info -HashAgg_11 8000.00 root group by:test.t1.c, funcs:sum(Column#6)->Column#5 -└─TableReader_12 8000.00 root data:HashAgg_5 - └─HashAgg_5 8000.00 cop[tikv] group by:test.t1.c, funcs:sum(test.t1.a)->Column#6 - └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT sum(b) FROM t1 GROUP BY a; -id estRows task access object operator info -HashAgg_5 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 -└─Projection_12 10000.00 root cast(test.t1.b, decimal(65,0) BINARY)->Column#6, test.t1.a - └─TableReader_9 10000.00 root data:TableFullScan_8 - └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT sum(b) FROM t1 GROUP BY c; -id estRows task access object operator info -HashAgg_5 8000.00 root group by:Column#9, funcs:sum(Column#8)->Column#5 -└─Projection_18 10000.00 root cast(test.t1.b, decimal(65,0) BINARY)->Column#8, test.t1.c - └─TableReader_11 10000.00 root data:TableFullScan_10 - └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT sum(c) FROM t1 GROUP BY a; -id estRows task access object operator info -HashAgg_9 8000.00 root group by:test.t1.a, funcs:sum(Column#6)->Column#5 -└─TableReader_10 8000.00 root data:HashAgg_5 - └─HashAgg_5 8000.00 cop[tikv] group by:test.t1.a, funcs:sum(test.t1.c)->Column#6 - └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT sum(c) FROM t1 GROUP BY b; -id estRows task access object operator info -HashAgg_5 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 -└─Projection_12 10000.00 root cast(test.t1.c, decimal(65,0) BINARY)->Column#6, test.t1.b - └─TableReader_9 10000.00 root data:TableFullScan_8 - └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(a) FROM t1 GROUP BY b; +id estRows task access object operator info +HashAgg 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 +└─Projection 10000.00 root cast(test.t1.a, decimal(32,0) BINARY)->Column#6, test.t1.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(a) FROM t1 GROUP BY c; +id estRows task access object operator info +HashAgg 8000.00 root group by:test.t1.c, funcs:sum(Column#6)->Column#5 +└─TableReader 8000.00 root data:HashAgg + └─HashAgg 8000.00 cop[tikv] group by:test.t1.c, funcs:sum(test.t1.a)->Column#6 + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(b) FROM t1 GROUP BY a; +id estRows task access object operator info +HashAgg 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 +└─Projection 10000.00 root cast(test.t1.b, decimal(32,0) BINARY)->Column#6, test.t1.a + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(b) FROM t1 GROUP BY c; +id estRows task access object operator info +HashAgg 8000.00 root group by:Column#9, funcs:sum(Column#8)->Column#5 +└─Projection 10000.00 root cast(test.t1.b, decimal(32,0) BINARY)->Column#8, test.t1.c + └─Projection 10000.00 root test.t1.b, test.t1.c + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(c) FROM t1 GROUP BY a; +id estRows task access object operator info +HashAgg 8000.00 root group by:test.t1.a, funcs:sum(Column#6)->Column#5 +└─TableReader 8000.00 root data:HashAgg + └─HashAgg 8000.00 cop[tikv] group by:test.t1.a, funcs:sum(test.t1.c)->Column#6 + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +EXPLAIN format = 'brief' SELECT sum(c) FROM t1 GROUP BY b; +id estRows task access object operator info +HashAgg 8000.00 root group by:Column#7, funcs:sum(Column#6)->Column#5 +└─Projection 10000.00 root cast(test.t1.c, decimal(32,0) BINARY)->Column#6, test.t1.b + └─Projection 10000.00 root test.t1.b, test.t1.c + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo DROP TABLE IF EXISTS tu; CREATE TABLE tu (a INT, b INT, c INT GENERATED ALWAYS AS (a + b) VIRTUAL, primary key (a), unique key uk(c)); INSERT INTO tu(a, b) VALUES(1, 2); -EXPLAIN SELECT * FROM tu WHERE c = 1; +EXPLAIN format = 'brief' SELECT * FROM tu WHERE c = 1; id estRows task access object operator info -Point_Get_5 1.00 root table:tu, index:uk(c) -EXPLAIN SELECT a, c FROM tu WHERE c = 1; +Point_Get 1.00 root table:tu, index:uk(c) +EXPLAIN format = 'brief' SELECT a, c FROM tu WHERE c = 1; id estRows task access object operator info -Projection_4 1.00 root test.tu.a, test.tu.c -└─Point_Get_5 1.00 root table:tu, index:uk(c) -EXPLAIN SELECT * FROM tu WHERE c in(1, 2, 3); +Projection 1.00 root test.tu.a, test.tu.c +└─Point_Get 1.00 root table:tu, index:uk(c) +EXPLAIN format = 'brief' SELECT * FROM tu WHERE c in(1, 2, 3); id estRows task access object operator info -Batch_Point_Get_5 3.00 root table:tu, index:uk(c) keep order:false, desc:false -EXPLAIN SELECT c, a FROM tu WHERE c in(1, 2, 3); +Batch_Point_Get 3.00 root table:tu, index:uk(c) keep order:false, desc:false +EXPLAIN format = 'brief' SELECT c, a FROM tu WHERE c in(1, 2, 3); id estRows task access object operator info -Projection_4 3.00 root test.tu.c, test.tu.a -└─Batch_Point_Get_5 3.00 root table:tu, index:uk(c) keep order:false, desc:false +Projection 3.00 root test.tu.c, test.tu.a +└─Batch_Point_Get 3.00 root table:tu, index:uk(c) keep order:false, desc:false diff --git a/cmd/explaintest/r/index_join.result b/cmd/explaintest/r/index_join.result index 851d74e672c43..e4518acaa2ef4 100644 --- a/cmd/explaintest/r/index_join.result +++ b/cmd/explaintest/r/index_join.result @@ -6,49 +6,49 @@ insert into t2 values(1, 1); analyze table t1, t2; set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; -explain select /*+ TIDB_INLJ(t1, t2) */ * from t1 join t2 on t1.a=t2.a; +explain format = 'brief' select /*+ TIDB_INLJ(t1, t2) */ * from t1 join t2 on t1.a=t2.a; id estRows task access object operator info -IndexJoin_25 5.00 root inner join, inner:IndexLookUp_24, outer key:test.t2.a, inner key:test.t1.a -├─TableReader_43(Build) 1.00 root data:Selection_42 -│ └─Selection_42 1.00 cop[tikv] not(isnull(test.t2.a)) -│ └─TableFullScan_41 1.00 cop[tikv] table:t2 keep order:false -└─IndexLookUp_24(Probe) 5.00 root - ├─Selection_23(Build) 5.00 cop[tikv] not(isnull(test.t1.a)) - │ └─IndexRangeScan_21 5.00 cop[tikv] table:t1, index:idx(a) range: decided by [eq(test.t1.a, test.t2.a)], keep order:false - └─TableRowIDScan_22(Probe) 5.00 cop[tikv] table:t1 keep order:false -explain select * from t1 join t2 on t1.a=t2.a; +IndexJoin 5.00 root inner join, inner:IndexLookUp, outer key:test.t2.a, inner key:test.t1.a, equal cond:eq(test.t2.a, test.t1.a) +├─TableReader(Build) 1.00 root data:Selection +│ └─Selection 1.00 cop[tikv] not(isnull(test.t2.a)) +│ └─TableFullScan 1.00 cop[tikv] table:t2 keep order:false +└─IndexLookUp(Probe) 5.00 root + ├─Selection(Build) 5.00 cop[tikv] not(isnull(test.t1.a)) + │ └─IndexRangeScan 5.00 cop[tikv] table:t1, index:idx(a) range: decided by [eq(test.t1.a, test.t2.a)], keep order:false + └─TableRowIDScan(Probe) 5.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select * from t1 join t2 on t1.a=t2.a; id estRows task access object operator info -Projection_6 5.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b -└─HashJoin_37 5.00 root inner join, equal:[eq(test.t2.a, test.t1.a)] - ├─TableReader_48(Build) 1.00 root data:Selection_47 - │ └─Selection_47 1.00 cop[tikv] not(isnull(test.t2.a)) - │ └─TableFullScan_46 1.00 cop[tikv] table:t2 keep order:false - └─TableReader_54(Probe) 5.00 root data:Selection_53 - └─Selection_53 5.00 cop[tikv] not(isnull(test.t1.a)) - └─TableFullScan_52 5.00 cop[tikv] table:t1 keep order:false +Projection 5.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b +└─HashJoin 5.00 root inner join, equal:[eq(test.t2.a, test.t1.a)] + ├─TableReader(Build) 1.00 root data:Selection + │ └─Selection 1.00 cop[tikv] not(isnull(test.t2.a)) + │ └─TableFullScan 1.00 cop[tikv] table:t2 keep order:false + └─TableReader(Probe) 5.00 root data:Selection + └─Selection 5.00 cop[tikv] not(isnull(test.t1.a)) + └─TableFullScan 5.00 cop[tikv] table:t1 keep order:false drop table if exists t1, t2; create table t1(a int not null, b int not null); create table t2(a int not null, b int not null, key a(a)); set @@tidb_opt_insubq_to_join_and_agg=0; -explain select /*+ TIDB_INLJ(t2@sel_2) */ * from t1 where t1.a in (select t2.a from t2); +explain format = 'brief' select /*+ TIDB_INLJ(t2@sel_2) */ * from t1 where t1.a in (select t2.a from t2); id estRows task access object operator info -IndexJoin_10 8000.00 root semi join, inner:IndexReader_9, outer key:test.t1.a, inner key:test.t2.a -├─TableReader_18(Build) 10000.00 root data:TableFullScan_17 -│ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─IndexReader_9(Probe) 1.25 root index:IndexRangeScan_8 - └─IndexRangeScan_8 1.25 cop[tikv] table:t2, index:a(a) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false, stats:pseudo +IndexJoin 8000.00 root semi join, inner:IndexReader, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a) +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─IndexReader(Probe) 1.25 root index:IndexRangeScan + └─IndexRangeScan 1.25 cop[tikv] table:t2, index:a(a) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false, stats:pseudo show warnings; Level Code Message set @@tidb_opt_insubq_to_join_and_agg=1; drop table if exists t1, t2; create table t1(a int not null, b int not null, key a(a)); create table t2(a int not null, b int not null, key a(a)); -explain select /*+ TIDB_INLJ(t1) */ * from t1 where t1.a in (select t2.a from t2); +explain format = 'brief' select /*+ TIDB_INLJ(t1) */ * from t1 where t1.a in (select t2.a from t2); id estRows task access object operator info -IndexJoin_13 10000.00 root inner join, inner:IndexLookUp_12, outer key:test.t2.a, inner key:test.t1.a -├─StreamAgg_26(Build) 8000.00 root group by:test.t2.a, funcs:firstrow(test.t2.a)->test.t2.a -│ └─IndexReader_39 10000.00 root index:IndexFullScan_38 -│ └─IndexFullScan_38 10000.00 cop[tikv] table:t2, index:a(a) keep order:true, stats:pseudo -└─IndexLookUp_12(Probe) 1.25 root - ├─IndexRangeScan_10(Build) 1.25 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, test.t2.a)], keep order:false, stats:pseudo - └─TableRowIDScan_11(Probe) 1.25 cop[tikv] table:t1 keep order:false, stats:pseudo +IndexJoin 10000.00 root inner join, inner:IndexLookUp, outer key:test.t2.a, inner key:test.t1.a, equal cond:eq(test.t2.a, test.t1.a) +├─StreamAgg(Build) 8000.00 root group by:test.t2.a, funcs:firstrow(test.t2.a)->test.t2.a +│ └─IndexReader 10000.00 root index:IndexFullScan +│ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:a(a) keep order:true, stats:pseudo +└─IndexLookUp(Probe) 1.25 root + ├─IndexRangeScan(Build) 1.25 cop[tikv] table:t1, index:a(a) range: decided by [eq(test.t1.a, test.t2.a)], keep order:false, stats:pseudo + └─TableRowIDScan(Probe) 1.25 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/partition_pruning.result b/cmd/explaintest/r/partition_pruning.result index fd5930d18ae1b..b3c3a8b3169b9 100644 --- a/cmd/explaintest/r/partition_pruning.result +++ b/cmd/explaintest/r/partition_pruning.result @@ -14,18 +14,18 @@ PARTITION p4 VALUES LESS THAN (5), PARTITION p5 VALUES LESS THAN (6), PARTITION max VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE a < 7; +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE a < 7; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,7), keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,7), keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo DROP TABLE t1; # # Bug#49742: Partition Pruning not working correctly for RANGE @@ -44,29 +44,29 @@ SELECT * FROM t1 WHERE a < 1 order by a; a -1 0 -EXPLAIN SELECT * FROM t1 WHERE a < 1; +explain format = 'brief' SELECT * FROM t1 WHERE a < 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 2 order by a; a -1 0 1 -EXPLAIN SELECT * FROM t1 WHERE a < 2; +explain format = 'brief' SELECT * FROM t1 WHERE a < 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,2), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,2), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 3 order by a; a -1 0 1 2 -EXPLAIN SELECT * FROM t1 WHERE a < 3; +explain format = 'brief' SELECT * FROM t1 WHERE a < 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,3), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,3), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 4 order by a; a -1 @@ -74,10 +74,10 @@ a 1 2 3 -EXPLAIN SELECT * FROM t1 WHERE a < 4; +explain format = 'brief' SELECT * FROM t1 WHERE a < 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,4), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,4), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 5 order by a; a -1 @@ -86,10 +86,10 @@ a 2 3 4 -EXPLAIN SELECT * FROM t1 WHERE a < 5; +explain format = 'brief' SELECT * FROM t1 WHERE a < 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,5), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,5), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 6 order by a; a -1 @@ -99,10 +99,10 @@ a 3 4 5 -EXPLAIN SELECT * FROM t1 WHERE a < 6; +explain format = 'brief' SELECT * FROM t1 WHERE a < 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4,p5 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,6), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4,p5 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,6), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 7 order by a; a -1 @@ -113,29 +113,29 @@ a 4 5 6 -EXPLAIN SELECT * FROM t1 WHERE a < 7; +explain format = 'brief' SELECT * FROM t1 WHERE a < 7; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,7), keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,7), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 1 order by a; a -1 0 1 -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 2 order by a; a -1 0 1 2 -EXPLAIN SELECT * FROM t1 WHERE a <= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,2], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,2], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 3 order by a; a -1 @@ -143,10 +143,10 @@ a 1 2 3 -EXPLAIN SELECT * FROM t1 WHERE a <= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,3], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,3], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 4 order by a; a -1 @@ -155,10 +155,10 @@ a 2 3 4 -EXPLAIN SELECT * FROM t1 WHERE a <= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,4], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,4], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 5 order by a; a -1 @@ -168,10 +168,10 @@ a 3 4 5 -EXPLAIN SELECT * FROM t1 WHERE a <= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4,p5 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,5], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4,p5 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,5], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 6 order by a; a -1 @@ -182,10 +182,10 @@ a 4 5 6 -EXPLAIN SELECT * FROM t1 WHERE a <= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,6], keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,6], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 7 order by a; a -1 @@ -197,59 +197,59 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a <= 7; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 7; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,7], keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,7], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 1 order by a; a 1 -EXPLAIN SELECT * FROM t1 WHERE a = 1; +explain format = 'brief' SELECT * FROM t1 WHERE a = 1; id estRows task access object operator info -TableReader_6 1.00 root partition:p1 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo +TableReader 1.00 root partition:p1 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 2 order by a; a 2 -EXPLAIN SELECT * FROM t1 WHERE a = 2; +explain format = 'brief' SELECT * FROM t1 WHERE a = 2; id estRows task access object operator info -TableReader_6 1.00 root partition:p2 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[2,2], keep order:false, stats:pseudo +TableReader 1.00 root partition:p2 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[2,2], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 3 order by a; a 3 -EXPLAIN SELECT * FROM t1 WHERE a = 3; +explain format = 'brief' SELECT * FROM t1 WHERE a = 3; id estRows task access object operator info -TableReader_6 1.00 root partition:p3 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[3,3], keep order:false, stats:pseudo +TableReader 1.00 root partition:p3 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[3,3], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 4 order by a; a 4 -EXPLAIN SELECT * FROM t1 WHERE a = 4; +explain format = 'brief' SELECT * FROM t1 WHERE a = 4; id estRows task access object operator info -TableReader_6 1.00 root partition:p4 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[4,4], keep order:false, stats:pseudo +TableReader 1.00 root partition:p4 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[4,4], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 5 order by a; a 5 -EXPLAIN SELECT * FROM t1 WHERE a = 5; +explain format = 'brief' SELECT * FROM t1 WHERE a = 5; id estRows task access object operator info -TableReader_6 1.00 root partition:p5 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo +TableReader 1.00 root partition:p5 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 6 order by a; a 6 -EXPLAIN SELECT * FROM t1 WHERE a = 6; +explain format = 'brief' SELECT * FROM t1 WHERE a = 6; id estRows task access object operator info -TableReader_6 1.00 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[6,6], keep order:false, stats:pseudo +TableReader 1.00 root partition:max data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[6,6], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 7 order by a; a 7 -EXPLAIN SELECT * FROM t1 WHERE a = 7; +explain format = 'brief' SELECT * FROM t1 WHERE a = 7; id estRows task access object operator info -TableReader_6 1.00 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[7,7], keep order:false, stats:pseudo +TableReader 1.00 root partition:max data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[7,7], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 1 order by a; a 1 @@ -260,10 +260,10 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p1,p2,p3,p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[1,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p1,p2,p3,p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[1,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 2 order by a; a 2 @@ -273,10 +273,10 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p2,p3,p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[2,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p2,p3,p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[2,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 3 order by a; a 3 @@ -285,10 +285,10 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p3,p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[3,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p3,p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[3,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 4 order by a; a 4 @@ -296,37 +296,37 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[4,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[4,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 5 order by a; a 5 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[5,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[5,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 6 order by a; a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[6,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[6,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 7 order by a; a 7 8 -EXPLAIN SELECT * FROM t1 WHERE a >= 7; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 7; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[7,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[7,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 1 order by a; a 2 @@ -336,10 +336,10 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 1; +explain format = 'brief' SELECT * FROM t1 WHERE a > 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p2,p3,p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p2,p3,p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 2 order by a; a 3 @@ -348,10 +348,10 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 2; +explain format = 'brief' SELECT * FROM t1 WHERE a > 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p3,p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p3,p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 3 order by a; a 4 @@ -359,44 +359,44 @@ a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 3; +explain format = 'brief' SELECT * FROM t1 WHERE a > 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p4,p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(3,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p4,p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(3,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 4 order by a; a 5 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 4; +explain format = 'brief' SELECT * FROM t1 WHERE a > 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p5,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(4,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p5,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(4,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 5 order by a; a 6 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 5; +explain format = 'brief' SELECT * FROM t1 WHERE a > 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(5,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(5,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 6 order by a; a 7 8 -EXPLAIN SELECT * FROM t1 WHERE a > 6; +explain format = 'brief' SELECT * FROM t1 WHERE a > 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(6,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(6,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 7 order by a; a 8 -EXPLAIN SELECT * FROM t1 WHERE a > 7; +explain format = 'brief' SELECT * FROM t1 WHERE a > 7; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(7,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(7,+inf], keep order:false, stats:pseudo DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY) PARTITION BY RANGE (a) ( @@ -411,29 +411,29 @@ SELECT * FROM t1 WHERE a < 1 order by a; a -1 0 -EXPLAIN SELECT * FROM t1 WHERE a < 1; +explain format = 'brief' SELECT * FROM t1 WHERE a < 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 2 order by a; a -1 0 1 -EXPLAIN SELECT * FROM t1 WHERE a < 2; +explain format = 'brief' SELECT * FROM t1 WHERE a < 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,2), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,2), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 3 order by a; a -1 0 1 2 -EXPLAIN SELECT * FROM t1 WHERE a < 3; +explain format = 'brief' SELECT * FROM t1 WHERE a < 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,3), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,3), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 4 order by a; a -1 @@ -441,10 +441,10 @@ a 1 2 3 -EXPLAIN SELECT * FROM t1 WHERE a < 4; +explain format = 'brief' SELECT * FROM t1 WHERE a < 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,4), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,4), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 5 order by a; a -1 @@ -453,10 +453,10 @@ a 2 3 4 -EXPLAIN SELECT * FROM t1 WHERE a < 5; +explain format = 'brief' SELECT * FROM t1 WHERE a < 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,5), keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,5), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a < 6 order by a; a -1 @@ -466,29 +466,29 @@ a 3 4 5 -EXPLAIN SELECT * FROM t1 WHERE a < 6; +explain format = 'brief' SELECT * FROM t1 WHERE a < 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,6), keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,6), keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 1 order by a; a -1 0 1 -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,1], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 2 order by a; a -1 0 1 2 -EXPLAIN SELECT * FROM t1 WHERE a <= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,2], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,2], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 3 order by a; a -1 @@ -496,10 +496,10 @@ a 1 2 3 -EXPLAIN SELECT * FROM t1 WHERE a <= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,3], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,3], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 4 order by a; a -1 @@ -508,10 +508,10 @@ a 2 3 4 -EXPLAIN SELECT * FROM t1 WHERE a <= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,4], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p0,p1,p2,p3,p4 data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,4], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 5 order by a; a -1 @@ -521,10 +521,10 @@ a 3 4 5 -EXPLAIN SELECT * FROM t1 WHERE a <= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,5], keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,5], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a <= 6 order by a; a -1 @@ -535,52 +535,52 @@ a 4 5 6 -EXPLAIN SELECT * FROM t1 WHERE a <= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:all data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[-inf,6], keep order:false, stats:pseudo +TableReader 3333.33 root partition:all data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[-inf,6], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 1; a 1 -EXPLAIN SELECT * FROM t1 WHERE a = 1; +explain format = 'brief' SELECT * FROM t1 WHERE a = 1; id estRows task access object operator info -TableReader_6 1.00 root partition:p1 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo +TableReader 1.00 root partition:p1 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 2; a 2 -EXPLAIN SELECT * FROM t1 WHERE a = 2; +explain format = 'brief' SELECT * FROM t1 WHERE a = 2; id estRows task access object operator info -TableReader_6 1.00 root partition:p2 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[2,2], keep order:false, stats:pseudo +TableReader 1.00 root partition:p2 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[2,2], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 3; a 3 -EXPLAIN SELECT * FROM t1 WHERE a = 3; +explain format = 'brief' SELECT * FROM t1 WHERE a = 3; id estRows task access object operator info -TableReader_6 1.00 root partition:p3 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[3,3], keep order:false, stats:pseudo +TableReader 1.00 root partition:p3 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[3,3], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 4; a 4 -EXPLAIN SELECT * FROM t1 WHERE a = 4; +explain format = 'brief' SELECT * FROM t1 WHERE a = 4; id estRows task access object operator info -TableReader_6 1.00 root partition:p4 data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[4,4], keep order:false, stats:pseudo +TableReader 1.00 root partition:p4 data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[4,4], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 5; a 5 -EXPLAIN SELECT * FROM t1 WHERE a = 5; +explain format = 'brief' SELECT * FROM t1 WHERE a = 5; id estRows task access object operator info -TableReader_6 1.00 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo +TableReader 1.00 root partition:max data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a = 6; a 6 -EXPLAIN SELECT * FROM t1 WHERE a = 6; +explain format = 'brief' SELECT * FROM t1 WHERE a = 6; id estRows task access object operator info -TableReader_6 1.00 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[6,6], keep order:false, stats:pseudo +TableReader 1.00 root partition:max data:TableRangeScan +└─TableRangeScan 1.00 cop[tikv] table:t1 range:[6,6], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 1 order by a; a 1 @@ -590,10 +590,10 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p1,p2,p3,p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[1,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p1,p2,p3,p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[1,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 2 order by a; a 2 @@ -602,10 +602,10 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p2,p3,p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[2,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p2,p3,p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[2,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 3 order by a; a 3 @@ -613,37 +613,37 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p3,p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[3,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p3,p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[3,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 4 order by a; a 4 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[4,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[4,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 5 order by a; a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[5,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[5,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a >= 6 order by a; a 6 7 -EXPLAIN SELECT * FROM t1 WHERE a >= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:[6,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:[6,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 1 order by a; a 2 @@ -652,10 +652,10 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a > 1; +explain format = 'brief' SELECT * FROM t1 WHERE a > 1; id estRows task access object operator info -TableReader_6 3333.33 root partition:p2,p3,p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p2,p3,p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(1,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 2 order by a; a 3 @@ -663,44 +663,44 @@ a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a > 2; +explain format = 'brief' SELECT * FROM t1 WHERE a > 2; id estRows task access object operator info -TableReader_6 3333.33 root partition:p3,p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p3,p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 3 order by a; a 4 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a > 3; +explain format = 'brief' SELECT * FROM t1 WHERE a > 3; id estRows task access object operator info -TableReader_6 3333.33 root partition:p4,max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(3,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:p4,max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(3,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 4 order by a; a 5 6 7 -EXPLAIN SELECT * FROM t1 WHERE a > 4; +explain format = 'brief' SELECT * FROM t1 WHERE a > 4; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(4,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(4,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 5 order by a; a 6 7 -EXPLAIN SELECT * FROM t1 WHERE a > 5; +explain format = 'brief' SELECT * FROM t1 WHERE a > 5; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(5,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(5,+inf], keep order:false, stats:pseudo SELECT * FROM t1 WHERE a > 6 order by a; a 7 -EXPLAIN SELECT * FROM t1 WHERE a > 6; +explain format = 'brief' SELECT * FROM t1 WHERE a > 6; id estRows task access object operator info -TableReader_6 3333.33 root partition:max data:TableRangeScan_5 -└─TableRangeScan_5 3333.33 cop[tikv] table:t1 range:(6,+inf], keep order:false, stats:pseudo +TableReader 3333.33 root partition:max data:TableRangeScan +└─TableRangeScan 3333.33 cop[tikv] table:t1 range:(6,+inf], keep order:false, stats:pseudo DROP TABLE t1; # test of RANGE and index CREATE TABLE t1 (a DATE, KEY(a)) @@ -730,221 +730,221 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090402 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 10.00 root partition:p20090402 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090402 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 10.00 root partition:p20090402 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090402 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 10.00 root partition:p20090402 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo DROP TABLE t1; # Test with DATE column NOT NULL CREATE TABLE t1 ( @@ -961,221 +961,221 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 0.00 root partition:p20090402 index:Selection_9 -└─Selection_9 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 0.00 root partition:p20090402 index:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 0.00 root partition:p20090402 index:Selection_9 -└─Selection_9 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -id estRows task access object operator info -IndexReader_10 10.00 root partition:p20090403 index:Selection_9 -└─Selection_9 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 0.00 root partition:p20090402 index:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +id estRows task access object operator info +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +id estRows task access object operator info +IndexReader 10.00 root partition:p20090403 index:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +id estRows task access object operator info +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402,p20090403 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 0.00 root partition:p20090403 index:Selection_9 -└─Selection_9 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 0.00 root partition:p20090403 index:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3323.33 root partition:p20090401,p20090402 index:Selection_9 -└─Selection_9 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3323.33 root partition:p20090401,p20090402 index:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 0.00 root partition:p20090402 index:Selection_9 -└─Selection_9 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 0.00 root partition:p20090402 index:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -IndexReader_10 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection_9 -└─Selection_9 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) - └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo +IndexReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 index:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:PRIMARY(a, b) keep order:false, stats:pseudo DROP TABLE t1; # Test with DATETIME column NULL CREATE TABLE t1 ( @@ -1191,221 +1191,221 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 10.00 root partition:p20090402 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 10.00 root partition:p20090402 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090402 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 10.00 root partition:p20090402 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 10.00 root partition:p20090402 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 10.00 root partition:p20090402 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo DROP TABLE t1; # Test with DATE column NULL CREATE TABLE t1 ( @@ -1421,221 +1421,221 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 0.00 root partition:p20090402 data:Selection_6 -└─Selection_6 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 0.00 root partition:p20090402 data:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 0.00 root partition:p20090402 data:Selection_6 -└─Selection_6 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -id estRows task access object operator info -TableReader_7 10.00 root partition:p20090403 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 0.00 root partition:p20090402 data:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:59.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +id estRows task access object operator info +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +id estRows task access object operator info +TableReader 10.00 root partition:p20090403 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +id estRows task access object operator info +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402,p20090403 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 0.00 root partition:p20090403 data:Selection_6 -└─Selection_6 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 0.00 root partition:p20090403 data:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-03 00:00:01) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3323.33 root partition:p20090401,p20090402 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3323.33 root partition:p20090401,p20090402 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 0.00 root partition:p20090402 data:Selection_6 -└─Selection_6 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 0.00 root partition:p20090402 data:Selection +└─Selection 0.00 cop[tikv] eq(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -EXPLAIN SELECT * FROM t1 +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); id estRows task access object operator info -TableReader_7 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 3333.33 root partition:p20090402,p20090403,p20090404,p20090405 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.b, 2009-04-02 23:59:58) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo DROP TABLE t1; # For better code coverage of the patch CREATE TABLE t1 ( @@ -1649,11 +1649,11 @@ PARTITION p20090404 VALUES LESS THAN (TO_DAYS('2009-04-05')), PARTITION p20090405 VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL); # test with an invalid date, which lead to item->null_value is set. -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); id estRows task access object operator info -TableReader_7 0.00 root partition:all data:Selection_6 -└─Selection_6 0.00 cop[tikv] lt(test.t1.b, NULL) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 0.00 root partition:all data:Selection +└─Selection 0.00 cop[tikv] lt(test.t1.b, NULL) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo DROP TABLE t1; CREATE TABLE t1 (a INT NOT NULL AUTO_INCREMENT, @@ -1675,26 +1675,26 @@ partition p0 values less than (10), partition p1 values less than (20) ); insert into t3 values (5),(15); -explain select * from t3 where a=11; -id estRows task access object operator info -TableReader_7 10.00 root partition:p1 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t3.a, 11) - └─TableFullScan_5 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo -explain select * from t3 where a=10; -id estRows task access object operator info -TableReader_7 10.00 root partition:p1 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t3.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo -explain select * from t3 where a=20; -id estRows task access object operator info -TableReader_7 10.00 root partition:dual data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t3.a, 20) - └─TableFullScan_5 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo -explain select * from t3 where a=30; -id estRows task access object operator info -TableReader_7 10.00 root partition:dual data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t3.a, 30) - └─TableFullScan_5 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +explain format = 'brief' select * from t3 where a=11; +id estRows task access object operator info +TableReader 10.00 root partition:p1 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t3.a, 11) + └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +explain format = 'brief' select * from t3 where a=10; +id estRows task access object operator info +TableReader 10.00 root partition:p1 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t3.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +explain format = 'brief' select * from t3 where a=20; +id estRows task access object operator info +TableReader 10.00 root partition:dual data:Selection +└─Selection 10.00 cop[tikv] eq(test.t3.a, 20) + └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +explain format = 'brief' select * from t3 where a=30; +id estRows task access object operator info +TableReader 10.00 root partition:dual data:Selection +└─Selection 10.00 cop[tikv] eq(test.t3.a, 30) + └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo create table t7 (a int not null) partition by RANGE(a) ( partition p10 values less than (10), partition p30 values less than (30), @@ -1703,121 +1703,121 @@ partition p70 values less than (70), partition p90 values less than (90) ); insert into t7 values (10),(30),(50); -explain select * from t7 where a < 5; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 5) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 9; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 9; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 9; -id estRows task access object operator info -TableReader_7 10.00 root partition:p10 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 9; -id estRows task access object operator info -TableReader_7 3333.33 root partition:all data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 9; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 10; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 10; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10,p30 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 10; -id estRows task access object operator info -TableReader_7 10.00 root partition:p30 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 10; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 10; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 89; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 89; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 89; -id estRows task access object operator info -TableReader_7 10.00 root partition:p90 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 89; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 89; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 90; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 90; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 90; -id estRows task access object operator info -TableReader_7 10.00 root partition:dual data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 90; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 90; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 91; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 91) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 11 and a < 29; -id estRows task access object operator info -TableReader_7 250.00 root partition:p30 data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 5; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 5) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 9; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 9; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 9; +id estRows task access object operator info +TableReader 10.00 root partition:p10 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 9; +id estRows task access object operator info +TableReader 3333.33 root partition:all data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 9; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 10; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 10; +id estRows task access object operator info +TableReader 3323.33 root partition:p10,p30 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 10; +id estRows task access object operator info +TableReader 10.00 root partition:p30 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 10; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 10; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 89; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 89; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 89; +id estRows task access object operator info +TableReader 10.00 root partition:p90 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 89; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 89; +id estRows task access object operator info +TableReader 3333.33 root partition:p90 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 90; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 90; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 90; +id estRows task access object operator info +TableReader 10.00 root partition:dual data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 90; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 90; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 91; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 91) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 11 and a < 29; +id estRows task access object operator info +TableReader 250.00 root partition:p30 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo drop table t7; create table t7 (a int unsigned not null) partition by RANGE(a) ( partition p10 values less than (10), @@ -1827,148 +1827,148 @@ partition p70 values less than (70), partition p90 values less than (90) ); insert into t7 values (10),(30),(50); -explain select * from t7 where a < 5; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 5) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 9; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 9; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 9; -id estRows task access object operator info -TableReader_7 10.00 root partition:p10 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 9; -id estRows task access object operator info -TableReader_7 3333.33 root partition:all data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 9; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 9) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 10; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 10; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p10,p30 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 10; -id estRows task access object operator info -TableReader_7 10.00 root partition:p30 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 10; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 10; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p30,p50,p70,p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 10) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 89; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 89; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 89; -id estRows task access object operator info -TableReader_7 10.00 root partition:p90 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 89; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 89; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p90 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 89) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a < 90; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a <= 90; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a = 90; -id estRows task access object operator info -TableReader_7 10.00 root partition:dual data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 90; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a >= 90; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t7.a, 90) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 91; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t7.a, 91) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo -explain select * from t7 where a > 11 and a < 29; -id estRows task access object operator info -TableReader_7 250.00 root partition:p30 data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) - └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 5; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 5) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 9; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 9; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 9; +id estRows task access object operator info +TableReader 10.00 root partition:p10 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 9; +id estRows task access object operator info +TableReader 3333.33 root partition:all data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 9; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 9) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 10; +id estRows task access object operator info +TableReader 3323.33 root partition:p10 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 10; +id estRows task access object operator info +TableReader 3323.33 root partition:p10,p30 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 10; +id estRows task access object operator info +TableReader 10.00 root partition:p30 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 10; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 10; +id estRows task access object operator info +TableReader 3333.33 root partition:p30,p50,p70,p90 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 10) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 89; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 89; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 89; +id estRows task access object operator info +TableReader 10.00 root partition:p90 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 89; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 89; +id estRows task access object operator info +TableReader 3333.33 root partition:p90 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 89) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a < 90; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a <= 90; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a = 90; +id estRows task access object operator info +TableReader 10.00 root partition:dual data:Selection +└─Selection 10.00 cop[tikv] eq(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 90; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a >= 90; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t7.a, 90) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 91; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t7.a, 91) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo +explain format = 'brief' select * from t7 where a > 11 and a < 29; +id estRows task access object operator info +TableReader 250.00 root partition:p30 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t7.a, 11), lt(test.t7.a, 29) + └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo create table t8 (a date not null) partition by RANGE(YEAR(a)) ( partition p0 values less than (1980), partition p1 values less than (1990), partition p2 values less than (2000) ); insert into t8 values ('1985-05-05'),('1995-05-05'); -explain select * from t8 where a < '1980-02-02'; +explain format = 'brief' select * from t8 where a < '1980-02-02'; id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t8.a, 1980-02-02 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t8 keep order:false, stats:pseudo create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( partition p0 values less than (732299), -- 2004-12-19 partition p1 values less than (732468), -- 2005-06-06 partition p2 values less than (732664) -- 2005-12-19 ); insert into t9 values ('2005-05-05'), ('2005-04-04'); -explain select * from t9 where a < '2004-12-19'; +explain format = 'brief' select * from t9 where a < '2004-12-19'; id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t9.a, 2004-12-19 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t9 keep order:false, stats:pseudo -explain select * from t9 where a <= '2004-12-19'; +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t9.a, 2004-12-19 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t9 keep order:false, stats:pseudo +explain format = 'brief' select * from t9 where a <= '2004-12-19'; id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t9.a, 2004-12-19 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t9 keep order:false, stats:pseudo +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t9.a, 2004-12-19 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t9 keep order:false, stats:pseudo drop table t7,t8,t9; create table t1 ( a1 int not null @@ -1979,21 +1979,21 @@ partition p1 values less than (6), partition p2 values less than (9) ); insert into t1 values (1),(2),(3); -explain select * from t1 where a1 > 3; +explain format = 'brief' select * from t1 where a1 > 3; id estRows task access object operator info -TableReader_7 3333.33 root partition:p1,p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t1.a1, 3) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where a1 >= 3; +TableReader 3333.33 root partition:p1,p2 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t1.a1, 3) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a1 >= 3; id estRows task access object operator info -TableReader_7 3333.33 root partition:p1,p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t1.a1, 3) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where a1 < 3 and a1 > 3; +TableReader 3333.33 root partition:p1,p2 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t1.a1, 3) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a1 < 3 and a1 > 3; id estRows task access object operator info -TableReader_7 0.00 root partition:dual data:Selection_6 -└─Selection_6 0.00 cop[tikv] gt(test.t1.a1, 3), lt(test.t1.a1, 3) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 0.00 root partition:dual data:Selection +└─Selection 0.00 cop[tikv] gt(test.t1.a1, 3), lt(test.t1.a1, 3) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t1; CREATE TABLE `t1` ( `a` int(11) default NULL @@ -2021,45 +2021,45 @@ insert into t2 select a,2 from t1 where a >= 200 and a < 400; insert into t2 select a,3 from t1 where a >= 400 and a < 600; insert into t2 select a,4 from t1 where a >= 600 and a < 800; insert into t2 select a,5 from t1 where a >= 800 and a < 1001; -explain select * from t2; -id estRows task access object operator info -TableReader_5 10000.00 root partition:all data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a < 801 and a > 200; -id estRows task access object operator info -TableReader_7 250.00 root partition:p1,p2,p3,p4 data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a < 801 and a > 800; -id estRows task access object operator info -TableReader_7 0.00 root partition:p4 data:Selection_6 -└─Selection_6 0.00 cop[tikv] gt(test.t2.a, 800), lt(test.t2.a, 801) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a > 600; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p3,p4 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t2.a, 600) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a > 600 and b = 1; -id estRows task access object operator info -TableReader_7 3.33 root partition:p3,p4 data:Selection_6 -└─Selection_6 3.33 cop[tikv] eq(test.t2.b, 1), gt(test.t2.a, 600) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a > 600 and b = 4; -id estRows task access object operator info -TableReader_7 3.33 root partition:p3,p4 data:Selection_6 -└─Selection_6 3.33 cop[tikv] eq(test.t2.b, 4), gt(test.t2.a, 600) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a > 600 and b = 5; -id estRows task access object operator info -TableReader_7 3.33 root partition:p3,p4 data:Selection_6 -└─Selection_6 3.33 cop[tikv] eq(test.t2.b, 5), gt(test.t2.a, 600) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b = 5; -id estRows task access object operator info -TableReader_7 10.00 root partition:all data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.b, 5) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2; +id estRows task access object operator info +TableReader 10000.00 root partition:all data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a < 801 and a > 200; +id estRows task access object operator info +TableReader 250.00 root partition:p1,p2,p3,p4 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t2.a, 200), lt(test.t2.a, 801) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a < 801 and a > 800; +id estRows task access object operator info +TableReader 0.00 root partition:p4 data:Selection +└─Selection 0.00 cop[tikv] gt(test.t2.a, 800), lt(test.t2.a, 801) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a > 600; +id estRows task access object operator info +TableReader 3333.33 root partition:p3,p4 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t2.a, 600) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a > 600 and b = 1; +id estRows task access object operator info +TableReader 3.33 root partition:p3,p4 data:Selection +└─Selection 3.33 cop[tikv] eq(test.t2.b, 1), gt(test.t2.a, 600) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a > 600 and b = 4; +id estRows task access object operator info +TableReader 3.33 root partition:p3,p4 data:Selection +└─Selection 3.33 cop[tikv] eq(test.t2.b, 4), gt(test.t2.a, 600) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a > 600 and b = 5; +id estRows task access object operator info +TableReader 3.33 root partition:p3,p4 data:Selection +└─Selection 3.33 cop[tikv] eq(test.t2.b, 5), gt(test.t2.a, 600) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b = 5; +id estRows task access object operator info +TableReader 10.00 root partition:all data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.b, 5) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo flush status; update t2 set b = 100 where b = 6; show status like 'Handler_read_rnd_next'; @@ -2101,85 +2101,85 @@ insert into t2 select a,6 from t1 where a >= 600 and a < 700; insert into t2 select a,7 from t1 where a >= 700 and a < 800; insert into t2 select a,8 from t1 where a >= 800 and a < 900; insert into t2 select a,9 from t1 where a >= 900 and a < 1001; -explain select * from t2; -id estRows task access object operator info -TableReader_5 10000.00 root partition:all data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a = 101; -id estRows task access object operator info -TableReader_7 10.00 root partition:p0 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.a, 101) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a = 550; -id estRows task access object operator info -TableReader_7 10.00 root partition:p2 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.a, 550) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a = 833; -id estRows task access object operator info -TableReader_7 10.00 root partition:p4 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.a, 833) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where a in (10,20,30); -id estRows task access object operator info -TableReader_7 30.00 root partition:p0 data:Selection_6 -└─Selection_6 30.00 cop[tikv] in(test.t2.a, 10, 20, 30) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where (a = 100 OR a = 900); -id estRows task access object operator info -TableReader_7 20.00 root partition:p0,p4 data:Selection_6 -└─Selection_6 20.00 cop[tikv] or(eq(test.t2.a, 100), eq(test.t2.a, 900)) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where (a > 100 AND a < 600); -id estRows task access object operator info -TableReader_7 250.00 root partition:p0,p1,p2 data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t2.a, 100), lt(test.t2.a, 600) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b = 4; -id estRows task access object operator info -IndexLookUp_10 10.00 root partition:all -├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t2, index:b(b) range:[4,4], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b = 6; -id estRows task access object operator info -IndexLookUp_10 10.00 root partition:all -├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t2, index:b(b) range:[6,6], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b in (1,3,5); -id estRows task access object operator info -IndexLookUp_10 30.00 root partition:all -├─IndexRangeScan_8(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b in (2,4,6); -id estRows task access object operator info -IndexLookUp_10 30.00 root partition:all -├─IndexRangeScan_8(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b in (7,8,9); -id estRows task access object operator info -IndexLookUp_10 30.00 root partition:all -├─IndexRangeScan_8(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b > 5; -id estRows task access object operator info -TableReader_7 3333.33 root partition:all data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t2.b, 5) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b > 5 and b < 8; -id estRows task access object operator info -IndexLookUp_10 250.00 root partition:all -├─IndexRangeScan_8(Build) 250.00 cop[tikv] table:t2, index:b(b) range:(5,8), keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 250.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b > 5 and b < 7; -id estRows task access object operator info -IndexLookUp_10 250.00 root partition:all -├─IndexRangeScan_8(Build) 250.00 cop[tikv] table:t2, index:b(b) range:(5,7), keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 250.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t2 where b > 0 and b < 5; -id estRows task access object operator info -IndexLookUp_10 250.00 root partition:all -├─IndexRangeScan_8(Build) 250.00 cop[tikv] table:t2, index:b(b) range:(0,5), keep order:false, stats:pseudo -└─TableRowIDScan_9(Probe) 250.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2; +id estRows task access object operator info +TableReader 10000.00 root partition:all data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a = 101; +id estRows task access object operator info +TableReader 10.00 root partition:p0 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.a, 101) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a = 550; +id estRows task access object operator info +TableReader 10.00 root partition:p2 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.a, 550) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a = 833; +id estRows task access object operator info +TableReader 10.00 root partition:p4 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.a, 833) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a in (10,20,30); +id estRows task access object operator info +TableReader 30.00 root partition:p0 data:Selection +└─Selection 30.00 cop[tikv] in(test.t2.a, 10, 20, 30) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where (a = 100 OR a = 900); +id estRows task access object operator info +TableReader 20.00 root partition:p0,p4 data:Selection +└─Selection 20.00 cop[tikv] or(eq(test.t2.a, 100), eq(test.t2.a, 900)) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where (a > 100 AND a < 600); +id estRows task access object operator info +TableReader 250.00 root partition:p0,p1,p2 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t2.a, 100), lt(test.t2.a, 600) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b = 4; +id estRows task access object operator info +IndexLookUp 10.00 root partition:all +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t2, index:b(b) range:[4,4], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b = 6; +id estRows task access object operator info +IndexLookUp 10.00 root partition:all +├─IndexRangeScan(Build) 10.00 cop[tikv] table:t2, index:b(b) range:[6,6], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b in (1,3,5); +id estRows task access object operator info +IndexLookUp 30.00 root partition:all +├─IndexRangeScan(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[1,1], [3,3], [5,5], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b in (2,4,6); +id estRows task access object operator info +IndexLookUp 30.00 root partition:all +├─IndexRangeScan(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[2,2], [4,4], [6,6], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b in (7,8,9); +id estRows task access object operator info +IndexLookUp 30.00 root partition:all +├─IndexRangeScan(Build) 30.00 cop[tikv] table:t2, index:b(b) range:[7,7], [8,8], [9,9], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 30.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b > 5; +id estRows task access object operator info +TableReader 3333.33 root partition:all data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t2.b, 5) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b > 5 and b < 8; +id estRows task access object operator info +IndexLookUp 250.00 root partition:all +├─IndexRangeScan(Build) 250.00 cop[tikv] table:t2, index:b(b) range:(5,8), keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 250.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b > 5 and b < 7; +id estRows task access object operator info +IndexLookUp 312.50 root partition:all +├─IndexRangeScan(Build) 312.50 cop[tikv] table:t2, index:b(b) range:[6,6], keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 312.50 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where b > 0 and b < 5; +id estRows task access object operator info +IndexLookUp 250.00 root partition:all +├─IndexRangeScan(Build) 250.00 cop[tikv] table:t2, index:b(b) range:(0,5), keep order:false, stats:pseudo +└─TableRowIDScan(Probe) 250.00 cop[tikv] table:t2 keep order:false, stats:pseudo flush status; update t2 set a = 111 where b = 10; show status like 'Handler_read_rnd_next'; @@ -2226,14 +2226,14 @@ show status like 'Handler_read_next'; Variable_name Value drop table t1, t2; create table t1 (s1 int); -explain select 1 from t1 union all select 2; -id estRows task access object operator info -Union_8 10001.00 root -├─Projection_9 10000.00 root 1->Column#5 -│ └─TableReader_11 10000.00 root data:TableFullScan_10 -│ └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -└─Projection_12 1.00 root 2->Column#5 - └─TableDual_13 1.00 root rows:1 +explain format = 'brief' select 1 from t1 union all select 2; +id estRows task access object operator info +Union 10001.00 root +├─Projection 10000.00 root 1->Column#5 +│ └─TableReader 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +└─Projection 1.00 root 2->Column#5 + └─TableDual 1.00 root rows:1 drop table t1; create table t1 (a int) partition by range(a) ( @@ -2249,66 +2249,66 @@ partition p2 values less than (255) ); insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); -explain select * from t1 where a=0; -id estRows task access object operator info -TableReader_7 10.00 root partition:p0 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.a, 0) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a=0; -id estRows task access object operator info -TableReader_7 10.00 root partition:p0 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.a, 0) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where a=0xFE; -id estRows task access object operator info -TableReader_7 10.00 root partition:p2 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t1.a, 254) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a=0xFE; -id estRows task access object operator info -TableReader_7 10.00 root partition:p2 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t2.a, 254) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where a > 0xFE AND a <= 0xFF; -id estRows task access object operator info -TableReader_7 250.00 root partition:dual data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t1.a, 254), le(test.t1.a, 255) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a > 0xFE AND a <= 0xFF; -id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t2.a, 254), le(test.t2.a, 255) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where a >= 0xFE AND a <= 0xFF; -id estRows task access object operator info -TableReader_7 250.00 root partition:p2 data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 254), le(test.t1.a, 255) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a >= 0xFE AND a <= 0xFF; -id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t2.a, 254), le(test.t2.a, 255) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where a < 64 AND a >= 63; -id estRows task access object operator info -TableReader_7 250.00 root partition:p0 data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 63), lt(test.t1.a, 64) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a < 64 AND a >= 63; -id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t2.a, 63), lt(test.t2.a, 64) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -explain select * from t1 where a <= 64 AND a >= 63; -id estRows task access object operator info -TableReader_7 250.00 root partition:p0,p1 data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 63), le(test.t1.a, 64) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t2 where a <= 64 AND a >= 63; -id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t2.a, 63), le(test.t2.a, 64) - └─TableFullScan_5 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a=0; +id estRows task access object operator info +TableReader 10.00 root partition:p0 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.a, 0) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a=0; +id estRows task access object operator info +TableReader 10.00 root partition:p0 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.a, 0) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a=0xFE; +id estRows task access object operator info +TableReader 10.00 root partition:p2 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t1.a, 254) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a=0xFE; +id estRows task access object operator info +TableReader 10.00 root partition:p2 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t2.a, 254) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a > 0xFE AND a <= 0xFF; +id estRows task access object operator info +TableReader 250.00 root partition:dual data:Selection +└─Selection 250.00 cop[tikv] gt(test.t1.a, 254), le(test.t1.a, 255) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a > 0xFE AND a <= 0xFF; +id estRows task access object operator info +TableReader 250.00 root partition:dual data:Selection +└─Selection 250.00 cop[tikv] gt(test.t2.a, 254), le(test.t2.a, 255) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a >= 0xFE AND a <= 0xFF; +id estRows task access object operator info +TableReader 250.00 root partition:p2 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 254), le(test.t1.a, 255) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a >= 0xFE AND a <= 0xFF; +id estRows task access object operator info +TableReader 250.00 root partition:p2 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t2.a, 254), le(test.t2.a, 255) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a < 64 AND a >= 63; +id estRows task access object operator info +TableReader 250.00 root partition:p0 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 63), lt(test.t1.a, 64) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a < 64 AND a >= 63; +id estRows task access object operator info +TableReader 250.00 root partition:p0 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t2.a, 63), lt(test.t2.a, 64) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a <= 64 AND a >= 63; +id estRows task access object operator info +TableReader 250.00 root partition:p0,p1 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 63), le(test.t1.a, 64) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t2 where a <= 64 AND a >= 63; +id estRows task access object operator info +TableReader 250.00 root partition:p0,p1 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t2.a, 63), le(test.t2.a, 64) + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo drop table t1; drop table t2; create table t1(a bigint unsigned not null) partition by range(a+0) ( @@ -2319,23 +2319,23 @@ partition p4 values less than (2305561538531950591) ); insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); -explain select * from t1 where +explain format = 'brief' select * from t1 where a >= 2305561538531885056-10 and a <= 2305561538531885056-8; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where +TableReader 250.00 root partition:p3 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 2305561538531885046), le(test.t1.a, 2305561538531885048) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +TableReader 250.00 root partition:dual data:Selection +└─Selection 250.00 cop[tikv] gt(test.t1.a, 18446744073709551596), lt(test.t1.a, 18446744073709551598) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t1.a, 18446744073709551615) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t1.a, 18446744073709551615) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t1; create table t1 (a bigint) partition by range(a+0) ( partition p1 values less than (-1000), @@ -2344,11 +2344,11 @@ partition p3 values less than (10), partition p4 values less than (1000) ); insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); -explain select * from t1 where a>-2 and a <=0; +explain format = 'brief' select * from t1 where a>-2 and a <=0; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 250.00 root partition:p3 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t1.a, -2), le(test.t1.a, 0) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t1; CREATE TABLE t1 ( recdate DATETIME NOT NULL ) PARTITION BY RANGE( TO_DAYS(recdate) ) ( @@ -2359,11 +2359,11 @@ INSERT INTO t1 VALUES ('2007-03-01 12:00:00'); INSERT INTO t1 VALUES ('2007-03-07 12:00:00'); INSERT INTO t1 VALUES ('2007-03-08 12:00:00'); INSERT INTO t1 VALUES ('2007-03-15 12:00:00'); -explain select * from t1 where recdate < '2007-03-08 00:00:00'; +explain format = 'brief' select * from t1 where recdate < '2007-03-08 00:00:00'; id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.recdate, 2007-03-08 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.recdate, 2007-03-08 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t1; CREATE TABLE t1 ( recdate DATETIME NOT NULL ) PARTITION BY RANGE( YEAR(recdate) ) ( @@ -2374,11 +2374,11 @@ INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); INSERT INTO t1 VALUES ('2005-03-01 12:00:00'); INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); -explain select * from t1 where recdate < '2006-01-01 00:00:00'; +explain format = 'brief' select * from t1 where recdate < '2006-01-01 00:00:00'; id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t1.recdate, 2006-01-01 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t1.recdate, 2006-01-01 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t1; create table t0 (a int); insert into t0 values (0),(1),(2),(3),(4),(5),(6),(7),(8),(9); @@ -2389,61 +2389,61 @@ partition p1 values less than (128), partition p2 values less than (255) ); insert into t1 select A.a + 10*B.a from t0 A, t0 B; -explain select * from t1 where a between 10 and 13; +explain format = 'brief' select * from t1 where a between 10 and 13; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 13) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select * from t1 where a between 10 and 10+33; +TableReader 250.00 root partition:p0 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 13) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select * from t1 where a between 10 and 10+33; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 43) - └─TableFullScan_5 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +TableReader 250.00 root partition:p0 data:Selection +└─Selection 250.00 cop[tikv] ge(test.t1.a, 10), le(test.t1.a, 43) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t0, t1; drop table if exists t; create table t(a timestamp) partition by range(unix_timestamp(a)) (partition p0 values less than(unix_timestamp('2019-02-16 14:20:00')), partition p1 values less than (maxvalue)); -explain select * from t where a between timestamp'2019-02-16 14:19:00' and timestamp'2019-02-16 14:21:00'; +explain format = 'brief' select * from t where a between timestamp'2019-02-16 14:19:00' and timestamp'2019-02-16 14:21:00'; id estRows task access object operator info -TableReader_7 250.00 root partition:all data:Selection_6 -└─Selection_6 250.00 cop[tikv] ge(test.t.a, 2019-02-16 14:19:00), le(test.t.a, 2019-02-16 14:21:00) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 250.00 root partition:all data:Selection +└─Selection 250.00 cop[tikv] ge(test.t.a, 2019-02-16 14:19:00), le(test.t.a, 2019-02-16 14:21:00) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t(a int) partition by range(a) (partition p0 values less than (100), partition p1 values less than (200), partition p2 values less than (300)); begin; -explain select * from t; +explain format = 'brief' select * from t; id estRows task access object operator info -TableReader_5 10000.00 root partition:all data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10000.00 root partition:all data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo insert into t values(1); -explain select * from t; +explain format = 'brief' select * from t; id estRows task access object operator info -Projection_4 10000.00 root test.t.a -└─UnionScan_5 10000.00 root - └─TableReader_7 10000.00 root partition:all data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Projection 10000.00 root test.t.a +└─UnionScan 10000.00 root + └─TableReader 10000.00 root partition:all data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo rollback; begin; insert into t values(101); -explain select * from t; +explain format = 'brief' select * from t; id estRows task access object operator info -Projection_4 10000.00 root test.t.a -└─UnionScan_5 10000.00 root - └─TableReader_7 10000.00 root partition:all data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Projection 10000.00 root test.t.a +└─UnionScan 10000.00 root + └─TableReader 10000.00 root partition:all data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo rollback; begin; insert into t values(201); -explain select * from t; +explain format = 'brief' select * from t; id estRows task access object operator info -Projection_4 10000.00 root test.t.a -└─UnionScan_5 10000.00 root - └─TableReader_7 10000.00 root partition:all data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Projection 10000.00 root test.t.a +└─UnionScan 10000.00 root + └─TableReader 10000.00 root partition:all data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo rollback; -explain select * from t; +explain format = 'brief' select * from t; id estRows task access object operator info -TableReader_5 10000.00 root partition:all data:TableFullScan_4 -└─TableFullScan_4 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10000.00 root partition:all data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; CREATE TABLE `t` ( `a` int(11) DEFAULT NULL, @@ -2466,115 +2466,115 @@ partition p0 values less than (unix_timestamp('2020-04-05 00:00:00')), partition p1 values less than (unix_timestamp('2020-04-15 00:00:00')), partition p2 values less than (unix_timestamp('2020-04-25 00:00:00')) ); -explain select * from t where ts = '2020-04-06 00:00:00' -- p1; -id estRows task access object operator info -TableReader_7 10.00 root partition:p1 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t.ts, 2020-04-06 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts = '2020-04-05 00:00:00.001' -- p1; -id estRows task access object operator info -TableReader_7 10.00 root partition:p1 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t.ts, 2020-04-05 00:00:00.001000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-15 00:00:00' -- p2; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t.ts, 2020-04-15 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-14 23:59:59.999' -- p1,p2; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p1,p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t.ts, 2020-04-14 23:59:59.999000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-15 00:00:00.001' -- p2; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t.ts, 2020-04-15 00:00:00.001000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-26 00:00:00.001' -- dual; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] gt(test.t.ts, 2020-04-26 00:00:00.001000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts >= '2020-04-04 12:22:32' -- p0,p1,p2; -id estRows task access object operator info -TableReader_7 3333.33 root partition:all data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t.ts, 2020-04-04 12:22:32.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts >= '2020-04-05 00:00:00' -- p1,p2; -id estRows task access object operator info -TableReader_7 3333.33 root partition:p1,p2 data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t.ts, 2020-04-05 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts >= '2020-04-25 00:00:00' -- dual; -id estRows task access object operator info -TableReader_7 3333.33 root partition:dual data:Selection_6 -└─Selection_6 3333.33 cop[tikv] ge(test.t.ts, 2020-04-25 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2020-04-25 00:00:00' -- p0,p1,p2; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2020-04-25 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2020-04-15 00:00:00.001' -- p0,p1,p2; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2020-04-15 00:00:00.001000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2020-04-15 00:00:00' -- expect perfect : p0,p1, obtain: p0,p1,p2; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2020-04-15 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2020-04-14 23:59:59.999' -- p0,p1; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2020-04-14 23:59:59.999000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2020-04-03 00:00:00' -- p0; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p0 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2020-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts < '2021-05-03 00:00:00' -- p0,p1,p2; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] lt(test.t.ts, 2021-05-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts <= '2020-04-05 00:00:00' -- p0,p1; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t.ts, 2020-04-05 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts <= '2020-04-03 00:00:00' -- p0; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p0 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t.ts, 2020-04-03 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts <= '2020-04-14 23:59:59.123' -- p0,p1; -id estRows task access object operator info -TableReader_7 3323.33 root partition:p0,p1 data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t.ts, 2020-04-14 23:59:59.123000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts <= '2020-04-25 00:00:00' -- p0,p1,p2; -id estRows task access object operator info -TableReader_7 3323.33 root partition:all data:Selection_6 -└─Selection_6 3323.33 cop[tikv] le(test.t.ts, 2020-04-25 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-25 00:00:00' or ts < '2020-01-02 00:00:00' -- p0; -id estRows task access object operator info -TableReader_7 6656.67 root partition:p0 data:Selection_6 -└─Selection_6 6656.67 cop[tikv] or(gt(test.t.ts, 2020-04-25 00:00:00.000000), lt(test.t.ts, 2020-01-02 00:00:00.000000)) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select * from t where ts > '2020-04-02 00:00:00' and ts < '2020-04-07 00:00:00' -- p0,p1; -id estRows task access object operator info -TableReader_7 250.00 root partition:p0,p1 data:Selection_6 -└─Selection_6 250.00 cop[tikv] gt(test.t.ts, 2020-04-02 00:00:00.000000), lt(test.t.ts, 2020-04-07 00:00:00.000000) - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts = '2020-04-06 00:00:00' -- p1; +id estRows task access object operator info +TableReader 10.00 root partition:p1 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t.ts, 2020-04-06 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts = '2020-04-05 00:00:00.001' -- p1; +id estRows task access object operator info +TableReader 10.00 root partition:p1 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t.ts, 2020-04-05 00:00:00.001000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-15 00:00:00' -- p2; +id estRows task access object operator info +TableReader 3333.33 root partition:p2 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t.ts, 2020-04-15 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-14 23:59:59.999' -- p1,p2; +id estRows task access object operator info +TableReader 3333.33 root partition:p1,p2 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t.ts, 2020-04-14 23:59:59.999000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-15 00:00:00.001' -- p2; +id estRows task access object operator info +TableReader 3333.33 root partition:p2 data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t.ts, 2020-04-15 00:00:00.001000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-26 00:00:00.001' -- dual; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] gt(test.t.ts, 2020-04-26 00:00:00.001000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts >= '2020-04-04 12:22:32' -- p0,p1,p2; +id estRows task access object operator info +TableReader 3333.33 root partition:all data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t.ts, 2020-04-04 12:22:32.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts >= '2020-04-05 00:00:00' -- p1,p2; +id estRows task access object operator info +TableReader 3333.33 root partition:p1,p2 data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t.ts, 2020-04-05 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts >= '2020-04-25 00:00:00' -- dual; +id estRows task access object operator info +TableReader 3333.33 root partition:dual data:Selection +└─Selection 3333.33 cop[tikv] ge(test.t.ts, 2020-04-25 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2020-04-25 00:00:00' -- p0,p1,p2; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2020-04-25 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2020-04-15 00:00:00.001' -- p0,p1,p2; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2020-04-15 00:00:00.001000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2020-04-15 00:00:00' -- expect perfect : p0,p1, obtain: p0,p1,p2; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2020-04-15 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2020-04-14 23:59:59.999' -- p0,p1; +id estRows task access object operator info +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2020-04-14 23:59:59.999000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2020-04-03 00:00:00' -- p0; +id estRows task access object operator info +TableReader 3323.33 root partition:p0 data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2020-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts < '2021-05-03 00:00:00' -- p0,p1,p2; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] lt(test.t.ts, 2021-05-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts <= '2020-04-05 00:00:00' -- p0,p1; +id estRows task access object operator info +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t.ts, 2020-04-05 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts <= '2020-04-03 00:00:00' -- p0; +id estRows task access object operator info +TableReader 3323.33 root partition:p0 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t.ts, 2020-04-03 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts <= '2020-04-14 23:59:59.123' -- p0,p1; +id estRows task access object operator info +TableReader 3323.33 root partition:p0,p1 data:Selection +└─Selection 3323.33 cop[tikv] le(test.t.ts, 2020-04-14 23:59:59.123000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts <= '2020-04-25 00:00:00' -- p0,p1,p2; +id estRows task access object operator info +TableReader 3323.33 root partition:all data:Selection +└─Selection 3323.33 cop[tikv] le(test.t.ts, 2020-04-25 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-25 00:00:00' or ts < '2020-01-02 00:00:00' -- p0; +id estRows task access object operator info +TableReader 6656.67 root partition:p0 data:Selection +└─Selection 6656.67 cop[tikv] or(gt(test.t.ts, 2020-04-25 00:00:00.000000), lt(test.t.ts, 2020-01-02 00:00:00.000000)) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select * from t where ts > '2020-04-02 00:00:00' and ts < '2020-04-07 00:00:00' -- p0,p1; +id estRows task access object operator info +TableReader 250.00 root partition:p0,p1 data:Selection +└─Selection 250.00 cop[tikv] gt(test.t.ts, 2020-04-02 00:00:00.000000), lt(test.t.ts, 2020-04-07 00:00:00.000000) + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t; create table t (id int, name varchar(20)) partition by hash(id) partitions 128; -explain SELECT * FROM t partition (p1) where name = '1'; +explain format = 'brief' SELECT * FROM t partition (p1) where name = '1'; id estRows task access object operator info -TableReader_7 10.00 root partition:p1 data:Selection_6 -└─Selection_6 10.00 cop[tikv] eq(test.t.name, "1") - └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +TableReader 10.00 root partition:p1 data:Selection +└─Selection 10.00 cop[tikv] eq(test.t.name, "1") + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/select.result b/cmd/explaintest/r/select.result index abf7c36adb382..902834b9c3ef3 100644 --- a/cmd/explaintest/r/select.result +++ b/cmd/explaintest/r/select.result @@ -239,12 +239,12 @@ insert into t1 values(5, 6, 7); insert into t1 values(6, 7, 8); insert into t1 values(7, 8, 9); insert into t1 values(9, 10, 11); -explain select a, c from t1 use index(idx) order by a limit 5; +explain format = 'brief' select a, c from t1 use index(idx) order by a limit 5; id estRows task access object operator info -TopN_7 5.00 root test.t1.a, offset:0, count:5 -└─IndexReader_15 5.00 root index:TopN_14 - └─TopN_14 5.00 cop[tikv] test.t1.a, offset:0, count:5 - └─IndexFullScan_13 10000.00 cop[tikv] table:t1, index:idx(b, c) keep order:false, stats:pseudo +TopN 5.00 root test.t1.a, offset:0, count:5 +└─IndexReader 5.00 root index:TopN + └─TopN 5.00 cop[tikv] test.t1.a, offset:0, count:5 + └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx(b, c) keep order:false, stats:pseudo select c, a from t1 use index(idx) order by a limit 5; c a 3 1 @@ -254,92 +254,92 @@ c a 7 5 drop table if exists t; create table t (a int, b int, c int, key idx(a, b, c)); -explain select count(a) from t; +explain format = 'brief' select count(a) from t; id estRows task access object operator info -StreamAgg_20 1.00 root funcs:count(Column#13)->Column#5 -└─TableReader_21 1.00 root data:StreamAgg_8 - └─StreamAgg_8 1.00 cop[tikv] funcs:count(test.t.a)->Column#13 - └─TableFullScan_18 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +StreamAgg 1.00 root funcs:count(Column#13)->Column#5 +└─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:count(test.t.a)->Column#13 + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo select count(a) from t; count(a) 0 insert t values(0,0,0); -explain select distinct b from t group by a; +explain format = 'brief' select distinct b from t group by a; id estRows task access object operator info -HashAgg_7 8000.00 root group by:test.t.b, funcs:firstrow(test.t.b)->test.t.b -└─StreamAgg_22 8000.00 root group by:test.t.a, funcs:firstrow(Column#9)->test.t.b - └─IndexReader_23 8000.00 root index:StreamAgg_11 - └─StreamAgg_11 8000.00 cop[tikv] group by:test.t.a, funcs:firstrow(test.t.b)->Column#9 - └─IndexFullScan_21 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo +HashAgg 8000.00 root group by:test.t.b, funcs:firstrow(test.t.b)->test.t.b +└─StreamAgg 8000.00 root group by:test.t.a, funcs:firstrow(Column#9)->test.t.b + └─IndexReader 8000.00 root index:StreamAgg + └─StreamAgg 8000.00 cop[tikv] group by:test.t.a, funcs:firstrow(test.t.b)->Column#9 + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo select distinct b from t group by a; b 0 -explain select count(b) from t group by a; +explain format = 'brief' select count(b) from t group by a; id estRows task access object operator info -StreamAgg_19 8000.00 root group by:test.t.a, funcs:count(Column#10)->Column#5 -└─IndexReader_20 8000.00 root index:StreamAgg_8 - └─StreamAgg_8 8000.00 cop[tikv] group by:test.t.a, funcs:count(test.t.b)->Column#10 - └─IndexFullScan_18 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo +StreamAgg 8000.00 root group by:test.t.a, funcs:count(Column#10)->Column#5 +└─IndexReader 8000.00 root index:StreamAgg + └─StreamAgg 8000.00 cop[tikv] group by:test.t.a, funcs:count(test.t.b)->Column#10 + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo select count(b) from t group by a; count(b) 1 insert t values(1,1,1),(3,3,6),(3,2,5),(2,1,4),(1,1,3),(1,1,2); -explain select count(a) from t where b>0 group by a, b; +explain format = 'brief' select count(a) from t where b>0 group by a, b; id estRows task access object operator info -StreamAgg_25 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#10)->Column#5 -└─IndexReader_26 2666.67 root index:StreamAgg_9 - └─StreamAgg_9 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#10 - └─Selection_24 3333.33 cop[tikv] gt(test.t.b, 0) - └─IndexFullScan_23 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo +StreamAgg 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#10)->Column#5 +└─IndexReader 2666.67 root index:StreamAgg + └─StreamAgg 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#10 + └─Selection 3333.33 cop[tikv] gt(test.t.b, 0) + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b; count(a) 3 1 1 1 -explain select count(a) from t where b>0 group by a, b order by a; +explain format = 'brief' select count(a) from t where b>0 group by a, b order by a; id estRows task access object operator info -Projection_7 2666.67 root Column#5 -└─StreamAgg_36 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#15)->Column#5, funcs:firstrow(test.t.a)->test.t.a - └─IndexReader_37 2666.67 root index:StreamAgg_34 - └─StreamAgg_34 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#15 - └─Selection_28 3333.33 cop[tikv] gt(test.t.b, 0) - └─IndexFullScan_27 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo +Projection 2666.67 root Column#5 +└─StreamAgg 2666.67 root group by:test.t.a, test.t.b, funcs:count(Column#15)->Column#5, funcs:firstrow(test.t.a)->test.t.a + └─IndexReader 2666.67 root index:StreamAgg + └─StreamAgg 2666.67 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#15 + └─Selection 3333.33 cop[tikv] gt(test.t.b, 0) + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b order by a; count(a) 3 1 1 1 -explain select count(a) from t where b>0 group by a, b order by a limit 1; +explain format = 'brief' select count(a) from t where b>0 group by a, b order by a limit 1; id estRows task access object operator info -Projection_9 1.00 root Column#5 -└─Limit_15 1.00 root offset:0, count:1 - └─StreamAgg_44 1.00 root group by:test.t.a, test.t.b, funcs:count(Column#16)->Column#5, funcs:firstrow(test.t.a)->test.t.a - └─IndexReader_45 1.00 root index:StreamAgg_40 - └─StreamAgg_40 1.00 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#16 - └─Selection_43 1.25 cop[tikv] gt(test.t.b, 0) - └─IndexFullScan_42 3.75 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo +Projection 1.00 root Column#5 +└─Limit 1.00 root offset:0, count:1 + └─StreamAgg 1.00 root group by:test.t.a, test.t.b, funcs:count(Column#16)->Column#5, funcs:firstrow(test.t.a)->test.t.a + └─IndexReader 1.00 root index:StreamAgg + └─StreamAgg 1.00 cop[tikv] group by:test.t.a, test.t.b, funcs:count(test.t.a)->Column#16 + └─Selection 1.25 cop[tikv] gt(test.t.b, 0) + └─IndexFullScan 3.75 cop[tikv] table:t, index:idx(a, b, c) keep order:true, stats:pseudo select count(a) from t where b>0 group by a, b order by a limit 1; count(a) 3 drop table if exists t; create table t (id int primary key, a int, b int); -explain select * from (t t1 left join t t2 on t1.a = t2.a) left join (t t3 left join t t4 on t3.a = t4.a) on t2.b = 1; +explain format = 'brief' select * from (t t1 left join t t2 on t1.a = t2.a) left join (t t3 left join t t4 on t3.a = t4.a) on t2.b = 1; id estRows task access object operator info -HashJoin_10 155937656.25 root CARTESIAN left outer join, left cond:[eq(test.t.b, 1)] -├─HashJoin_19(Build) 12487.50 root left outer join, equal:[eq(test.t.a, test.t.a)] -│ ├─TableReader_25(Build) 9990.00 root data:Selection_24 -│ │ └─Selection_24 9990.00 cop[tikv] not(isnull(test.t.a)) -│ │ └─TableFullScan_23 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo -│ └─TableReader_22(Probe) 10000.00 root data:TableFullScan_21 -│ └─TableFullScan_21 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo -└─HashJoin_12(Probe) 12487.50 root left outer join, equal:[eq(test.t.a, test.t.a)] - ├─TableReader_18(Build) 9990.00 root data:Selection_17 - │ └─Selection_17 9990.00 cop[tikv] not(isnull(test.t.a)) - │ └─TableFullScan_16 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_15(Probe) 10000.00 root data:TableFullScan_14 - └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin 155937656.25 root CARTESIAN left outer join, left cond:[eq(test.t.b, 1)] +├─HashJoin(Build) 12487.50 root left outer join, equal:[eq(test.t.a, test.t.a)] +│ ├─TableReader(Build) 9990.00 root data:Selection +│ │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a)) +│ │ └─TableFullScan 10000.00 cop[tikv] table:t4 keep order:false, stats:pseudo +│ └─TableReader(Probe) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo +└─HashJoin(Probe) 12487.50 root left outer join, equal:[eq(test.t.a, test.t.a)] + ├─TableReader(Build) 9990.00 root data:Selection + │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a)) + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table if exists t; create table t(a bigint primary key, b bigint); desc select * from t where a = 1; @@ -372,103 +372,118 @@ TableReader_5 10000.00 root partition:p1,p2 data:TableFullScan_4 └─TableFullScan_4 10000.00 cop[tikv] table:th keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int); -explain select a != any (select a from t t2) from t t1; +explain format = 'brief' select a != any (select a from t t2) from t t1; id estRows task access object operator info -Projection_8 10000.00 root and(or(or(gt(Column#8, 1), ne(test.t.a, Column#7)), if(ne(Column#9, 0), , 0)), and(ne(Column#10, 0), if(isnull(test.t.a), , 1)))->Column#11 -└─HashJoin_9 10000.00 root CARTESIAN inner join - ├─StreamAgg_14(Build) 1.00 root funcs:max(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 - │ └─Projection_19 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a), decimal(65,0) BINARY)->Column#15 - │ └─TableReader_18 10000.00 root data:TableFullScan_17 - │ └─TableFullScan_17 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_12(Probe) 10000.00 root data:TableFullScan_11 - └─TableFullScan_11 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select a = all (select a from t t2) from t t1; +Projection 10000.00 root and(or(or(gt(Column#8, 1), ne(test.t.a, Column#7)), if(ne(Column#9, 0), , 0)), and(ne(Column#10, 0), if(isnull(test.t.a), , 1)))->Column#11 +└─HashJoin 10000.00 root CARTESIAN inner join + ├─StreamAgg(Build) 1.00 root funcs:max(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 + │ └─Projection 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a), decimal(22,0) BINARY)->Column#15 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select a = all (select a from t t2) from t t1; id estRows task access object operator info -Projection_8 10000.00 root or(and(and(le(Column#8, 1), eq(test.t.a, Column#7)), if(ne(Column#9, 0), , 1)), or(eq(Column#10, 0), if(isnull(test.t.a), , 0)))->Column#11 -└─HashJoin_9 10000.00 root CARTESIAN inner join - ├─StreamAgg_14(Build) 1.00 root funcs:firstrow(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 - │ └─Projection_19 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a), decimal(65,0) BINARY)->Column#15 - │ └─TableReader_18 10000.00 root data:TableFullScan_17 - │ └─TableFullScan_17 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_12(Probe) 10000.00 root data:TableFullScan_11 - └─TableFullScan_11 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +Projection 10000.00 root or(and(and(le(Column#8, 1), eq(test.t.a, Column#7)), if(ne(Column#9, 0), , 1)), or(eq(Column#10, 0), if(isnull(test.t.a), , 0)))->Column#11 +└─HashJoin 10000.00 root CARTESIAN inner join + ├─StreamAgg(Build) 1.00 root funcs:firstrow(Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:count(1)->Column#10 + │ └─Projection 10000.00 root test.t.a, test.t.a, cast(isnull(test.t.a), decimal(22,0) BINARY)->Column#15 + │ └─TableReader 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table if exists t; create table t(a int, b int); drop table if exists s; create table s(a varchar(20), b varchar(20)); -explain select a in (select a from s where s.b = t.b) from t; +explain format = 'brief' select a in (select a from s where s.b = t.b) from t; id estRows task access object operator info -HashJoin_10 10000.00 root left outer semi join, equal:[eq(Column#8, Column#9)], other cond:eq(cast(test.t.a), cast(test.s.a)) -├─Projection_14(Build) 10000.00 root test.s.a, cast(test.s.b, double BINARY)->Column#9 -│ └─TableReader_16 10000.00 root data:TableFullScan_15 -│ └─TableFullScan_15 10000.00 cop[tikv] table:s keep order:false, stats:pseudo -└─Projection_11(Probe) 10000.00 root test.t.a, cast(test.t.b, double BINARY)->Column#8 - └─TableReader_13 10000.00 root data:TableFullScan_12 - └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select a in (select a+b from t t2 where t2.b = t1.b) from t t1; +HashJoin 10000.00 root left outer semi join, equal:[eq(Column#8, Column#9)], other cond:eq(cast(test.t.a), cast(test.s.a)) +├─Projection(Build) 10000.00 root test.s.a, cast(test.s.b, double BINARY)->Column#9 +│ └─TableReader 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo +└─Projection(Probe) 10000.00 root test.t.a, cast(test.t.b, double BINARY)->Column#8 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select a in (select a+b from t t2 where t2.b = t1.b) from t t1; id estRows task access object operator info -HashJoin_8 10000.00 root left outer semi join, equal:[eq(test.t.b, test.t.b)], other cond:eq(test.t.a, plus(test.t.a, test.t.b)) -├─TableReader_12(Build) 10000.00 root data:TableFullScan_11 -│ └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_10(Probe) 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin 10000.00 root left outer semi join, equal:[eq(test.t.b, test.t.b)], other cond:eq(test.t.a, plus(test.t.a, test.t.b)) +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t; create table t(a int not null, b int); -explain select a in (select a from t t2 where t2.b = t1.b) from t t1; +explain format = 'brief' select a in (select a from t t2 where t2.b = t1.b) from t t1; id estRows task access object operator info -HashJoin_8 10000.00 root left outer semi join, equal:[eq(test.t.b, test.t.b) eq(test.t.a, test.t.a)] -├─TableReader_12(Build) 10000.00 root data:TableFullScan_11 -│ └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_10(Probe) 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select 1 from (select sleep(1)) t; +HashJoin 10000.00 root left outer semi join, equal:[eq(test.t.b, test.t.b) eq(test.t.a, test.t.a)] +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select 1 from (select sleep(1)) t; id estRows task access object operator info -Projection_4 1.00 root 1->Column#2 -└─Projection_5 1.00 root sleep(1)->Column#1 - └─TableDual_6 1.00 root rows:1 +Projection 1.00 root 1->Column#2 +└─Projection 1.00 root sleep(1)->Column#1 + └─TableDual 1.00 root rows:1 drop table if exists t; create table t(a int, b int); -explain select a from t order by rand(); +explain format = 'brief' select a from t order by rand(); id estRows task access object operator info -Projection_8 10000.00 root test.t.a -└─Sort_4 10000.00 root Column#4 - └─Projection_9 10000.00 root test.t.a, rand()->Column#4 - └─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select a, b from t order by abs(2); +Projection 10000.00 root test.t.a +└─Sort 10000.00 root Column#4 + └─Projection 10000.00 root test.t.a, rand()->Column#4 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select a, b from t order by abs(2); id estRows task access object operator info -TableReader_8 10000.00 root data:TableFullScan_7 -└─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select a from t order by abs(rand())+1; +TableReader 10000.00 root data:TableFullScan +└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select a from t order by abs(rand())+1; id estRows task access object operator info -Projection_8 10000.00 root test.t.a -└─Sort_4 10000.00 root Column#4 - └─Projection_9 10000.00 root test.t.a, plus(abs(rand()), 1)->Column#4 - └─TableReader_7 10000.00 root data:TableFullScan_6 - └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +Projection 10000.00 root test.t.a +└─Sort 10000.00 root Column#4 + └─Projection 10000.00 root test.t.a, plus(abs(rand()), 1)->Column#4 + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t1; create table t1(a int, b int); drop table if exists t2; create table t2(a int, b int); -explain select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b); +explain format = 'brief' select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b); id estRows task access object operator info -HashJoin_10 7984.01 root semi join, equal:[eq(test.t1.a, test.t2.a)], other cond:gt(test.t2.b, test.t1.b) -├─TableReader_16(Build) 9980.01 root data:Selection_15 -│ └─Selection_15 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b)) -│ └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_13(Probe) 9980.01 root data:Selection_12 - └─Selection_12 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b)) - └─TableFullScan_11 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin 7984.01 root semi join, equal:[eq(test.t1.a, test.t2.a)], other cond:gt(test.t2.b, test.t1.b) +├─TableReader(Build) 9980.01 root data:Selection +│ └─Selection 9980.01 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.b)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 9980.01 root data:Selection + └─Selection 9980.01 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.b)) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table t; CREATE TABLE t (id int(10) unsigned NOT NULL AUTO_INCREMENT, i int(10) unsigned DEFAULT NULL, -x int(10) unsigned DEFAULT 0, +x int(10) unsigned DEFAULT '0', PRIMARY KEY (`id`) ); -explain select row_number() over( partition by i ) - x as rnk from t; +explain format = 'brief' select row_number() over( partition by i ) - x as rnk from t; id estRows task access object operator info -Projection_7 10000.00 root minus(Column#5, test.t.x)->Column#7 -└─Window_8 10000.00 root row_number()->Column#5 over(partition by test.t.i) - └─Sort_11 10000.00 root test.t.i - └─TableReader_10 10000.00 root data:TableRangeScan_9 - └─TableRangeScan_9 10000.00 cop[tikv] table:t range:[0,+inf], keep order:false, stats:pseudo +Projection 10000.00 root minus(Column#5, test.t.x)->Column#7 +└─Window 10000.00 root row_number()->Column#5 over(partition by test.t.i) + └─Sort 10000.00 root test.t.i + └─TableReader 10000.00 root data:TableRangeScan + └─TableRangeScan 10000.00 cop[tikv] table:t range:[0,+inf], keep order:false, stats:pseudo +create table precise_types ( +a BIGINT UNSIGNED NOT NULL, +b BIGINT NOT NULL, +c DECIMAL(21,1) NOT NULL, +d DOUBLE(21,1) NOT NULL +); +insert into precise_types values ( +18446744073709551614, +-9223372036854775806, +99999999999999999999, +18446744073709551614 +); +SELECT a, b, c, d FROM precise_types; +a b c d +18446744073709551614 -9223372036854775806 99999999999999999999.0 1.8446744073709552e19 diff --git a/cmd/explaintest/r/subquery.result b/cmd/explaintest/r/subquery.result index 68285589bed12..50c83dc1800f6 100644 --- a/cmd/explaintest/r/subquery.result +++ b/cmd/explaintest/r/subquery.result @@ -4,40 +4,40 @@ create table t1(a bigint, b bigint); create table t2(a bigint, b bigint); set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; -explain select * from t1 where t1.a in (select t1.b + t2.b from t2); +explain format = 'brief' select * from t1 where t1.a in (select t1.b + t2.b from t2); id estRows task access object operator info -HashJoin_8 8000.00 root CARTESIAN semi join, other cond:eq(test.t1.a, plus(test.t1.b, test.t2.b)) -├─TableReader_12(Build) 10000.00 root data:TableFullScan_11 -│ └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_10(Probe) 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin 8000.00 root CARTESIAN semi join, other cond:eq(test.t1.a, plus(test.t1.b, test.t2.b)) +├─TableReader(Build) 10000.00 root data:TableFullScan +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo drop table if exists t; create table t(a int primary key, b int, c int, d int, index idx(b,c,d)); insert into t values(1,1,1,1),(2,2,2,2),(3,2,2,2),(4,2,2,2),(5,2,2,2); analyze table t; -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c = 1 and s.d = t.a and s.a = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c = 1 and s.d = t.a and s.a = t1.a) from t; id estRows task access object operator info -Projection_11 5.00 root Column#14 -└─Apply_13 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#13) - ├─TableReader_15(Build) 5.00 root data:TableFullScan_14 - │ └─TableFullScan_14 5.00 cop[tikv] table:t keep order:false - └─StreamAgg_22(Probe) 1.00 root funcs:count(1)->Column#13 - └─IndexMergeJoin_31 0.50 root inner join, inner:TableReader_26, outer key:test.t.a, inner key:test.t.a - ├─IndexReader_35(Build) 1.00 root index:IndexRangeScan_34 - │ └─IndexRangeScan_34 1.00 cop[tikv] table:s, index:idx(b, c, d) range: decided by [eq(test.t.b, 1) eq(test.t.c, 1) eq(test.t.d, test.t.a)], keep order:false - └─TableReader_26(Probe) 1.00 root data:TableRangeScan_25 - └─TableRangeScan_25 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:true +Projection 5.00 root Column#14 +└─Apply 5.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#13) + ├─TableReader(Build) 5.00 root data:TableFullScan + │ └─TableFullScan 5.00 cop[tikv] table:t keep order:false + └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#13 + └─IndexJoin 0.50 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a) + ├─IndexReader(Build) 1.00 root index:IndexRangeScan + │ └─IndexRangeScan 1.00 cop[tikv] table:s, index:idx(b, c, d) range: decided by [eq(test.t.b, 1) eq(test.t.c, 1) eq(test.t.d, test.t.a)], keep order:false + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:false drop table if exists t; create table t(a int, b int, c int); -explain select a from t t1 where t1.a = (select max(t2.a) from t t2 where t1.b=t2.b and t1.c=t2.b); +explain format = 'brief' select a from t t1 where t1.a = (select max(t2.a) from t t2 where t1.b=t2.b and t1.c=t2.b); id estRows task access object operator info -HashJoin_12 7992.00 root inner join, equal:[eq(test.t.b, test.t.b) eq(test.t.c, test.t.b) eq(test.t.a, Column#9)] -├─Selection_17(Build) 6393.60 root not(isnull(Column#9)) -│ └─HashAgg_23 7992.00 root group by:test.t.b, funcs:max(Column#10)->Column#9, funcs:firstrow(test.t.b)->test.t.b -│ └─TableReader_24 7992.00 root data:HashAgg_18 -│ └─HashAgg_18 7992.00 cop[tikv] group by:test.t.b, funcs:max(test.t.a)->Column#10 -│ └─Selection_22 9990.00 cop[tikv] not(isnull(test.t.b)) -│ └─TableFullScan_21 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo -└─TableReader_16(Probe) 9970.03 root data:Selection_15 - └─Selection_15 9970.03 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b)), not(isnull(test.t.c)) - └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo +HashJoin 7992.00 root inner join, equal:[eq(test.t.b, test.t.b) eq(test.t.c, test.t.b) eq(test.t.a, Column#9)] +├─Selection(Build) 6393.60 root not(isnull(Column#9)) +│ └─HashAgg 7992.00 root group by:test.t.b, funcs:max(Column#10)->Column#9, funcs:firstrow(test.t.b)->test.t.b +│ └─TableReader 7992.00 root data:HashAgg +│ └─HashAgg 7992.00 cop[tikv] group by:test.t.b, funcs:max(test.t.a)->Column#10 +│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.b)) +│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +└─TableReader(Probe) 9970.03 root data:Selection + └─Selection 9970.03 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b)), not(isnull(test.t.c)) + └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/topn_push_down.result b/cmd/explaintest/r/topn_push_down.result index faf5549b980b5..9c74ebc4209ae 100644 --- a/cmd/explaintest/r/topn_push_down.result +++ b/cmd/explaintest/r/topn_push_down.result @@ -154,7 +154,7 @@ KEY `idx_delivery_status_delivery_user_id` (`delivery_status`,`delivery_user_id` KEY `idx_trade_uuid` (`trade_uuid`(10)), KEY `idx_third_tran_no` (`third_tran_no`(10)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=''; -EXPLAIN SELECT te.expect_time AS expected_time FROM +explain format = 'brief' SELECT te.expect_time AS expected_time FROM tr tr inner JOIN te te ON te.trade_id = tr.id left JOIN p p ON p.relate_id = tr.id WHERE @@ -167,23 +167,22 @@ te.expect_time BETWEEN '2018-04-23 00:00:00.0' AND '2018-04-23 23:59:59.0' ORDER BY te.expect_time asc LIMIT 0, 5; id estRows task access object operator info -Limit_19 0.00 root offset:0, count:5 -└─IndexJoin_118 0.00 root left outer join, inner:IndexReader_117, outer key:test.tr.id, inner key:test.p.relate_id - ├─TopN_127(Build) 0.00 root test.te.expect_time, offset:0, count:5 - │ └─IndexMergeJoin_53 0.00 root inner join, inner:Projection_51, outer key:test.tr.id, inner key:test.te.trade_id - │ ├─IndexLookUp_98(Build) 0.00 root - │ │ ├─Selection_96(Build) 0.00 cop[tikv] eq(test.tr.business_type, 18), eq(test.tr.trade_type, 1) - │ │ │ └─IndexRangeScan_94 10.00 cop[tikv] table:tr, index:idx_shop_identy_trade_status_business_type(shop_identy, trade_status, business_type, trade_pay_status, trade_type, delivery_type, source, biz_date) range:[810094178,810094178], keep order:false, stats:pseudo - │ │ └─Selection_97(Probe) 0.00 cop[tikv] eq(test.tr.brand_identy, 32314), eq(test.tr.domain_type, 2) - │ │ └─TableRowIDScan_95 0.00 cop[tikv] table:tr keep order:false, stats:pseudo - │ └─Projection_51(Probe) 1.25 root test.te.trade_id, test.te.expect_time - │ └─IndexLookUp_50 1.25 root - │ ├─IndexRangeScan_47(Build) 50.00 cop[tikv] table:te, index:idx_trade_id(trade_id) range: decided by [eq(test.te.trade_id, test.tr.id)], keep order:true, stats:pseudo - │ └─Selection_49(Probe) 1.25 cop[tikv] ge(test.te.expect_time, 2018-04-23 00:00:00.000000), le(test.te.expect_time, 2018-04-23 23:59:59.000000) - │ └─TableRowIDScan_48 50.00 cop[tikv] table:te keep order:false, stats:pseudo - └─IndexReader_117(Probe) 1.25 root index:Selection_116 - └─Selection_116 1.25 cop[tikv] not(isnull(test.p.relate_id)) - └─IndexRangeScan_115 1.25 cop[tikv] table:p, index:payment_relate_id(relate_id) range: decided by [eq(test.p.relate_id, test.tr.id)], keep order:false, stats:pseudo +Limit 0.00 root offset:0, count:5 +└─IndexJoin 0.00 root left outer join, inner:IndexReader, outer key:test.tr.id, inner key:test.p.relate_id, equal cond:eq(test.tr.id, test.p.relate_id) + ├─TopN(Build) 0.00 root test.te.expect_time, offset:0, count:5 + │ └─IndexJoin 0.00 root inner join, inner:IndexLookUp, outer key:test.tr.id, inner key:test.te.trade_id, equal cond:eq(test.tr.id, test.te.trade_id) + │ ├─IndexLookUp(Build) 0.00 root + │ │ ├─Selection(Build) 0.00 cop[tikv] eq(test.tr.business_type, 18), eq(test.tr.trade_type, 1) + │ │ │ └─IndexRangeScan 10.00 cop[tikv] table:tr, index:idx_shop_identy_trade_status_business_type(shop_identy, trade_status, business_type, trade_pay_status, trade_type, delivery_type, source, biz_date) range:[810094178,810094178], keep order:false, stats:pseudo + │ │ └─Selection(Probe) 0.00 cop[tikv] eq(test.tr.brand_identy, 32314), eq(test.tr.domain_type, 2) + │ │ └─TableRowIDScan 0.00 cop[tikv] table:tr keep order:false, stats:pseudo + │ └─IndexLookUp(Probe) 1.25 root + │ ├─IndexRangeScan(Build) 50.00 cop[tikv] table:te, index:idx_trade_id(trade_id) range: decided by [eq(test.te.trade_id, test.tr.id)], keep order:false, stats:pseudo + │ └─Selection(Probe) 1.25 cop[tikv] ge(test.te.expect_time, 2018-04-23 00:00:00.000000), le(test.te.expect_time, 2018-04-23 23:59:59.000000) + │ └─TableRowIDScan 50.00 cop[tikv] table:te keep order:false, stats:pseudo + └─IndexReader(Probe) 1.25 root index:Selection + └─Selection 1.25 cop[tikv] not(isnull(test.p.relate_id)) + └─IndexRangeScan 1.25 cop[tikv] table:p, index:payment_relate_id(relate_id) range: decided by [eq(test.p.relate_id, test.tr.id)], keep order:false, stats:pseudo desc select 1 as a from dual order by a limit 1; id estRows task access object operator info Projection_6 1.00 root 1->Column#1 @@ -211,62 +210,61 @@ Apply_17 9990.00 root semi join, equal:[eq(test.t1.a, test.t2.a)] │ └─Selection_19 9990.00 cop[tikv] not(isnull(test.t1.a)) │ └─TableFullScan_18 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo └─Selection_21(Probe) 0.80 root not(isnull(test.t2.a)) - └─Projection_22 1.00 root test.t2.a - └─Limit_23 1.00 root offset:0, count:1 - └─TableReader_29 1.00 root data:Limit_28 - └─Limit_28 1.00 cop[tikv] offset:0, count:1 - └─Selection_27 1.00 cop[tikv] gt(test.t2.b, test.t1.b) - └─TableFullScan_26 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo + └─Limit_23 1.00 root offset:0, count:1 + └─TableReader_29 1.00 root data:Limit_28 + └─Limit_28 1.00 cop[tikv] offset:0, count:1 + └─Selection_27 1.00 cop[tikv] gt(test.t2.b, test.t1.b) + └─TableFullScan_26 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo drop table if exists t; create table t(a int not null, index idx(a)); -explain select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id estRows task access object operator info -Limit_11 5.00 root offset:0, count:5 -└─IndexJoin_15 5.00 root inner join, inner:IndexReader_14, outer key:test.t.a, inner key:test.t.a - ├─TableReader_23(Build) 4.00 root data:TableFullScan_22 - │ └─TableFullScan_22 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─IndexReader_14(Probe) 1.25 root index:IndexRangeScan_13 - └─IndexRangeScan_13 1.25 cop[tikv] table:t2, index:idx(a) range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo -explain select /*+ TIDB_INLJ(t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +Limit 5.00 root offset:0, count:5 +└─IndexJoin 5.00 root inner join, inner:IndexReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a) + ├─TableReader(Build) 4.00 root data:TableFullScan + │ └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─IndexReader(Probe) 1.25 root index:IndexRangeScan + └─IndexRangeScan 1.25 cop[tikv] table:t2, index:idx(a) range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id estRows task access object operator info -Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(test.t.a) - └─IndexJoin_17 5.00 root left outer join, inner:IndexReader_16, outer key:test.t.a, inner key:test.t.a - ├─TableReader_25(Build) 4.00 root data:TableFullScan_24 - │ └─TableFullScan_24 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─IndexReader_16(Probe) 1.25 root index:IndexRangeScan_15 - └─IndexRangeScan_15 1.25 cop[tikv] table:t2, index:idx(a) range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo -explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +Limit 5.00 root offset:0, count:5 +└─Selection 5.00 root isnull(test.t.a) + └─IndexJoin 5.00 root left outer join, inner:IndexReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a) + ├─TableReader(Build) 4.00 root data:TableFullScan + │ └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─IndexReader(Probe) 1.25 root index:IndexRangeScan + └─IndexRangeScan 1.25 cop[tikv] table:t2, index:idx(a) range: decided by [eq(test.t.a, test.t.a)], keep order:false, stats:pseudo +explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id estRows task access object operator info -Limit_11 5.00 root offset:0, count:5 -└─MergeJoin_12 5.00 root inner join, left key:test.t.a, right key:test.t.a - ├─IndexReader_17(Build) 4.00 root index:IndexFullScan_16 - │ └─IndexFullScan_16 4.00 cop[tikv] table:t2, index:idx(a) keep order:true, stats:pseudo - └─IndexReader_15(Probe) 4.00 root index:IndexFullScan_14 - └─IndexFullScan_14 4.00 cop[tikv] table:t1, index:idx(a) keep order:true, stats:pseudo -explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +Limit 5.00 root offset:0, count:5 +└─MergeJoin 5.00 root inner join, left key:test.t.a, right key:test.t.a + ├─IndexReader(Build) 4.00 root index:IndexFullScan + │ └─IndexFullScan 4.00 cop[tikv] table:t2, index:idx(a) keep order:true, stats:pseudo + └─IndexReader(Probe) 4.00 root index:IndexFullScan + └─IndexFullScan 4.00 cop[tikv] table:t1, index:idx(a) keep order:true, stats:pseudo +explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id estRows task access object operator info -Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(test.t.a) - └─MergeJoin_14 5.00 root left outer join, left key:test.t.a, right key:test.t.a - ├─IndexReader_19(Build) 4.00 root index:IndexFullScan_18 - │ └─IndexFullScan_18 4.00 cop[tikv] table:t2, index:idx(a) keep order:true, stats:pseudo - └─IndexReader_17(Probe) 4.00 root index:IndexFullScan_16 - └─IndexFullScan_16 4.00 cop[tikv] table:t1, index:idx(a) keep order:true, stats:pseudo -explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +Limit 5.00 root offset:0, count:5 +└─Selection 5.00 root isnull(test.t.a) + └─MergeJoin 5.00 root left outer join, left key:test.t.a, right key:test.t.a + ├─IndexReader(Build) 4.00 root index:IndexFullScan + │ └─IndexFullScan 4.00 cop[tikv] table:t2, index:idx(a) keep order:true, stats:pseudo + └─IndexReader(Probe) 4.00 root index:IndexFullScan + └─IndexFullScan 4.00 cop[tikv] table:t1, index:idx(a) keep order:true, stats:pseudo +explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; id estRows task access object operator info -Limit_11 5.00 root offset:0, count:5 -└─HashJoin_31 5.00 root inner join, equal:[eq(test.t.a, test.t.a)] - ├─TableReader_38(Build) 10000.00 root data:TableFullScan_37 - │ └─TableFullScan_37 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo - └─TableReader_34(Probe) 4.00 root data:TableFullScan_33 - └─TableFullScan_33 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo -explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +Limit 5.00 root offset:0, count:5 +└─HashJoin 5.00 root inner join, equal:[eq(test.t.a, test.t.a)] + ├─TableReader(Build) 10000.00 root data:TableFullScan + │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo + └─TableReader(Probe) 4.00 root data:TableFullScan + └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo +explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; id estRows task access object operator info -Limit_12 5.00 root offset:0, count:5 -└─Selection_13 5.00 root isnull(test.t.a) - └─HashJoin_25 5.00 root left outer join, equal:[eq(test.t.a, test.t.a)] - ├─TableReader_27(Build) 4.00 root data:TableFullScan_26 - │ └─TableFullScan_26 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo - └─TableReader_31(Probe) 10000.00 root data:TableFullScan_30 - └─TableFullScan_30 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo +Limit 5.00 root offset:0, count:5 +└─Selection 5.00 root isnull(test.t.a) + └─HashJoin 5.00 root left outer join, equal:[eq(test.t.a, test.t.a)] + ├─TableReader(Build) 4.00 root data:TableFullScan + │ └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false, stats:pseudo + └─TableReader(Probe) 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo diff --git a/cmd/explaintest/r/topn_pushdown.result b/cmd/explaintest/r/topn_pushdown.result index ce87bbd941792..1b0be3c8e2190 100644 --- a/cmd/explaintest/r/topn_pushdown.result +++ b/cmd/explaintest/r/topn_pushdown.result @@ -1,8 +1,8 @@ -explain select * from ((select 4 as a) union all (select 33 as a)) tmp order by a desc limit 1; +explain format = 'brief' select * from ((select 4 as a) union all (select 33 as a)) tmp order by a desc limit 1; id estRows task access object operator info -TopN_17 1.00 root Column#3:desc, offset:0, count:1 -└─Union_21 2.00 root - ├─Projection_22 1.00 root 4->Column#3 - │ └─TableDual_23 1.00 root rows:1 - └─Projection_24 1.00 root 33->Column#3 - └─TableDual_25 1.00 root rows:1 +TopN 1.00 root Column#3:desc, offset:0, count:1 +└─Union 2.00 root + ├─Projection 1.00 root 4->Column#3 + │ └─TableDual 1.00 root rows:1 + └─Projection 1.00 root 33->Column#3 + └─TableDual 1.00 root rows:1 diff --git a/cmd/explaintest/r/tpch.result b/cmd/explaintest/r/tpch.result index 7bcf26b206de6..bb6a2e6201ee0 100644 --- a/cmd/explaintest/r/tpch.result +++ b/cmd/explaintest/r/tpch.result @@ -96,7 +96,7 @@ ascending order of RETURNFLAG and LINESTATUS. A count of the number of lineitems included. Planner enhancement: none. */ -explain +explain format = 'brief' select l_returnflag, l_linestatus, @@ -119,13 +119,13 @@ order by l_returnflag, l_linestatus; id estRows task access object operator info -Sort_6 2.94 root tpch.lineitem.l_returnflag, tpch.lineitem.l_linestatus -└─Projection_8 2.94 root tpch.lineitem.l_returnflag, tpch.lineitem.l_linestatus, Column#18, Column#19, Column#20, Column#21, Column#22, Column#23, Column#24, Column#25 - └─HashAgg_14 2.94 root group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(Column#26)->Column#18, funcs:sum(Column#27)->Column#19, funcs:sum(Column#28)->Column#20, funcs:sum(Column#29)->Column#21, funcs:avg(Column#30, Column#31)->Column#22, funcs:avg(Column#32, Column#33)->Column#23, funcs:avg(Column#34, Column#35)->Column#24, funcs:count(Column#36)->Column#25, funcs:firstrow(tpch.lineitem.l_returnflag)->tpch.lineitem.l_returnflag, funcs:firstrow(tpch.lineitem.l_linestatus)->tpch.lineitem.l_linestatus - └─TableReader_15 2.94 root data:HashAgg_9 - └─HashAgg_9 2.94 cop[tikv] group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(tpch.lineitem.l_quantity)->Column#26, funcs:sum(tpch.lineitem.l_extendedprice)->Column#27, funcs:sum(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)))->Column#28, funcs:sum(mul(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), plus(1, tpch.lineitem.l_tax)))->Column#29, funcs:count(tpch.lineitem.l_quantity)->Column#30, funcs:sum(tpch.lineitem.l_quantity)->Column#31, funcs:count(tpch.lineitem.l_extendedprice)->Column#32, funcs:sum(tpch.lineitem.l_extendedprice)->Column#33, funcs:count(tpch.lineitem.l_discount)->Column#34, funcs:sum(tpch.lineitem.l_discount)->Column#35, funcs:count(1)->Column#36 - └─Selection_13 293795345.00 cop[tikv] le(tpch.lineitem.l_shipdate, 1998-08-15) - └─TableFullScan_12 300005811.00 cop[tikv] table:lineitem keep order:false +Sort 2.94 root tpch.lineitem.l_returnflag, tpch.lineitem.l_linestatus +└─Projection 2.94 root tpch.lineitem.l_returnflag, tpch.lineitem.l_linestatus, Column#18, Column#19, Column#20, Column#21, Column#22, Column#23, Column#24, Column#25 + └─HashAgg 2.94 root group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(Column#26)->Column#18, funcs:sum(Column#27)->Column#19, funcs:sum(Column#28)->Column#20, funcs:sum(Column#29)->Column#21, funcs:avg(Column#30, Column#31)->Column#22, funcs:avg(Column#32, Column#33)->Column#23, funcs:avg(Column#34, Column#35)->Column#24, funcs:count(Column#36)->Column#25, funcs:firstrow(tpch.lineitem.l_returnflag)->tpch.lineitem.l_returnflag, funcs:firstrow(tpch.lineitem.l_linestatus)->tpch.lineitem.l_linestatus + └─TableReader 2.94 root data:HashAgg + └─HashAgg 2.94 cop[tikv] group by:tpch.lineitem.l_linestatus, tpch.lineitem.l_returnflag, funcs:sum(tpch.lineitem.l_quantity)->Column#26, funcs:sum(tpch.lineitem.l_extendedprice)->Column#27, funcs:sum(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)))->Column#28, funcs:sum(mul(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), plus(1, tpch.lineitem.l_tax)))->Column#29, funcs:count(tpch.lineitem.l_quantity)->Column#30, funcs:sum(tpch.lineitem.l_quantity)->Column#31, funcs:count(tpch.lineitem.l_extendedprice)->Column#32, funcs:sum(tpch.lineitem.l_extendedprice)->Column#33, funcs:count(tpch.lineitem.l_discount)->Column#34, funcs:sum(tpch.lineitem.l_discount)->Column#35, funcs:count(1)->Column#36 + └─Selection 293795345.00 cop[tikv] le(tpch.lineitem.l_shipdate, 1998-08-15) + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q2 Minimum Cost Supplier Query This query finds which supplier should be selected to place an order for a given part in a given region. @@ -136,7 +136,7 @@ the query lists the supplier's account balance, name and nation; the part's numb address, phone number and comment information. Planner enhancement: join reorder. */ -explain +explain format = 'brief' select s_acctbal, s_name, @@ -182,39 +182,40 @@ s_name, p_partkey limit 100; id estRows task access object operator info -Projection_37 100.00 root tpch.supplier.s_acctbal, tpch.supplier.s_name, tpch.nation.n_name, tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_comment -└─TopN_40 100.00 root tpch.supplier.s_acctbal:desc, tpch.nation.n_name, tpch.supplier.s_name, tpch.part.p_partkey, offset:0, count:100 - └─HashJoin_46 155496.00 root inner join, equal:[eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) eq(tpch.partsupp.ps_supplycost, Column#50)] - ├─HashJoin_60(Build) 155496.00 root inner join, equal:[eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)] - │ ├─TableReader_90(Build) 155496.00 root data:Selection_89 - │ │ └─Selection_89 155496.00 cop[tikv] eq(tpch.part.p_size, 30), like(tpch.part.p_type, "%STEEL", 92) - │ │ └─TableFullScan_88 10000000.00 cop[tikv] table:part keep order:false - │ └─HashJoin_63(Probe) 8155010.44 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] - │ ├─HashJoin_65(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ │ ├─HashJoin_78(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] - │ │ │ ├─TableReader_83(Build) 1.00 root data:Selection_82 - │ │ │ │ └─Selection_82 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") - │ │ │ │ └─TableFullScan_81 5.00 cop[tikv] table:region keep order:false - │ │ │ └─TableReader_80(Probe) 25.00 root data:TableFullScan_79 - │ │ │ └─TableFullScan_79 25.00 cop[tikv] table:nation keep order:false - │ │ └─TableReader_85(Probe) 500000.00 root data:TableFullScan_84 - │ │ └─TableFullScan_84 500000.00 cop[tikv] table:supplier keep order:false - │ └─TableReader_87(Probe) 40000000.00 root data:TableFullScan_86 - │ └─TableFullScan_86 40000000.00 cop[tikv] table:partsupp keep order:false - └─Selection_91(Probe) 6524008.35 root not(isnull(Column#50)) - └─HashAgg_94 8155010.44 root group by:tpch.partsupp.ps_partkey, funcs:min(tpch.partsupp.ps_supplycost)->Column#50, funcs:firstrow(tpch.partsupp.ps_partkey)->tpch.partsupp.ps_partkey - └─HashJoin_98 8155010.44 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] - ├─HashJoin_100(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ ├─HashJoin_113(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] - │ │ ├─TableReader_118(Build) 1.00 root data:Selection_117 - │ │ │ └─Selection_117 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") - │ │ │ └─TableFullScan_116 5.00 cop[tikv] table:region keep order:false - │ │ └─TableReader_115(Probe) 25.00 root data:TableFullScan_114 - │ │ └─TableFullScan_114 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_120(Probe) 500000.00 root data:TableFullScan_119 - │ └─TableFullScan_119 500000.00 cop[tikv] table:supplier keep order:false - └─TableReader_122(Probe) 40000000.00 root data:TableFullScan_121 - └─TableFullScan_121 40000000.00 cop[tikv] table:partsupp keep order:false +Projection 100.00 root tpch.supplier.s_acctbal, tpch.supplier.s_name, tpch.nation.n_name, tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_comment +└─TopN 100.00 root tpch.supplier.s_acctbal:desc, tpch.nation.n_name, tpch.supplier.s_name, tpch.part.p_partkey, offset:0, count:100 + └─Projection 155496.00 root tpch.part.p_partkey, tpch.part.p_mfgr, tpch.supplier.s_name, tpch.supplier.s_address, tpch.supplier.s_phone, tpch.supplier.s_acctbal, tpch.supplier.s_comment, tpch.nation.n_name + └─HashJoin 155496.00 root inner join, equal:[eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) eq(tpch.partsupp.ps_supplycost, Column#50)] + ├─HashJoin(Build) 155496.00 root inner join, equal:[eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)] + │ ├─TableReader(Build) 155496.00 root data:Selection + │ │ └─Selection 155496.00 cop[tikv] eq(tpch.part.p_size, 30), like(tpch.part.p_type, "%STEEL", 92) + │ │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + │ └─HashJoin(Probe) 8155010.44 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + │ ├─HashJoin(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ │ ├─HashJoin(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] + │ │ │ ├─TableReader(Build) 1.00 root data:Selection + │ │ │ │ └─Selection 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") + │ │ │ │ └─TableFullScan 5.00 cop[tikv] table:region keep order:false + │ │ │ └─TableReader(Probe) 25.00 root data:TableFullScan + │ │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + │ └─TableReader(Probe) 40000000.00 root data:TableFullScan + │ └─TableFullScan 40000000.00 cop[tikv] table:partsupp keep order:false + └─Selection(Probe) 6524008.35 root not(isnull(Column#50)) + └─HashAgg 8155010.44 root group by:tpch.partsupp.ps_partkey, funcs:min(tpch.partsupp.ps_supplycost)->Column#50, funcs:firstrow(tpch.partsupp.ps_partkey)->tpch.partsupp.ps_partkey + └─HashJoin 8155010.44 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashJoin(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─HashJoin(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] + │ │ ├─TableReader(Build) 1.00 root data:Selection + │ │ │ └─Selection 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") + │ │ │ └─TableFullScan 5.00 cop[tikv] table:region keep order:false + │ │ └─TableReader(Probe) 25.00 root data:TableFullScan + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─TableReader(Probe) 40000000.00 root data:TableFullScan + └─TableFullScan 40000000.00 cop[tikv] table:partsupp keep order:false /* Q3 Shipping Priority Query This query retrieves the 10 unshipped orders with the highest value. @@ -224,7 +225,7 @@ of a given date. Orders are listed in decreasing order of revenue. If more than orders with the largest revenue are listed. planner enhancement: if group-by item have primary key, non-priamry key is useless. */ -explain +explain format = 'brief' select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, @@ -249,21 +250,21 @@ revenue desc, o_orderdate limit 10; id estRows task access object operator info -Projection_14 10.00 root tpch.lineitem.l_orderkey, Column#35, tpch.orders.o_orderdate, tpch.orders.o_shippriority -└─TopN_17 10.00 root Column#35:desc, tpch.orders.o_orderdate, offset:0, count:10 - └─HashAgg_23 40252367.98 root group by:Column#48, Column#49, Column#50, funcs:sum(Column#44)->Column#35, funcs:firstrow(Column#45)->tpch.orders.o_orderdate, funcs:firstrow(Column#46)->tpch.orders.o_shippriority, funcs:firstrow(Column#47)->tpch.lineitem.l_orderkey - └─Projection_81 91515927.49 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#44, tpch.orders.o_orderdate, tpch.orders.o_shippriority, tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey, tpch.orders.o_orderdate, tpch.orders.o_shippriority - └─HashJoin_40 91515927.49 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] - ├─HashJoin_71(Build) 22592975.51 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - │ ├─TableReader_77(Build) 1498236.00 root data:Selection_76 - │ │ └─Selection_76 1498236.00 cop[tikv] eq(tpch.customer.c_mktsegment, "AUTOMOBILE") - │ │ └─TableFullScan_75 7500000.00 cop[tikv] table:customer keep order:false - │ └─TableReader_74(Probe) 36870000.00 root data:Selection_73 - │ └─Selection_73 36870000.00 cop[tikv] lt(tpch.orders.o_orderdate, 1995-03-13 00:00:00.000000) - │ └─TableFullScan_72 75000000.00 cop[tikv] table:orders keep order:false - └─TableReader_80(Probe) 163047704.27 root data:Selection_79 - └─Selection_79 163047704.27 cop[tikv] gt(tpch.lineitem.l_shipdate, 1995-03-13 00:00:00.000000) - └─TableFullScan_78 300005811.00 cop[tikv] table:lineitem keep order:false +Projection 10.00 root tpch.lineitem.l_orderkey, Column#35, tpch.orders.o_orderdate, tpch.orders.o_shippriority +└─TopN 10.00 root Column#35:desc, tpch.orders.o_orderdate, offset:0, count:10 + └─HashAgg 40252367.98 root group by:Column#48, Column#49, Column#50, funcs:sum(Column#44)->Column#35, funcs:firstrow(Column#45)->tpch.orders.o_orderdate, funcs:firstrow(Column#46)->tpch.orders.o_shippriority, funcs:firstrow(Column#47)->tpch.lineitem.l_orderkey + └─Projection 91515927.49 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#44, tpch.orders.o_orderdate, tpch.orders.o_shippriority, tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey, tpch.orders.o_orderdate, tpch.orders.o_shippriority + └─HashJoin 91515927.49 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] + ├─HashJoin(Build) 22592975.51 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ ├─TableReader(Build) 1498236.00 root data:Selection + │ │ └─Selection 1498236.00 cop[tikv] eq(tpch.customer.c_mktsegment, "AUTOMOBILE") + │ │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + │ └─TableReader(Probe) 36870000.00 root data:Selection + │ └─Selection 36870000.00 cop[tikv] lt(tpch.orders.o_orderdate, 1995-03-13 00:00:00.000000) + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─TableReader(Probe) 163047704.27 root data:Selection + └─Selection 163047704.27 cop[tikv] gt(tpch.lineitem.l_shipdate, 1995-03-13 00:00:00.000000) + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q4 Order Priority Checking Query This query determines how well the order priority system is working and gives an assessment of customer satisfaction. @@ -271,7 +272,7 @@ The Order Priority Checking Query counts the number of orders ordered in a given at least one lineitem was received by the customer later than its committed date. The query lists the count of such orders for each order priority sorted in ascending priority order. */ -explain +explain format = 'brief' select o_orderpriority, count(*) as order_count @@ -294,17 +295,17 @@ o_orderpriority order by o_orderpriority; id estRows task access object operator info -Sort_10 1.00 root tpch.orders.o_orderpriority -└─Projection_12 1.00 root tpch.orders.o_orderpriority, Column#27 - └─HashAgg_15 1.00 root group by:tpch.orders.o_orderpriority, funcs:count(1)->Column#27, funcs:firstrow(tpch.orders.o_orderpriority)->tpch.orders.o_orderpriority - └─IndexHashJoin_23 2340750.00 root semi join, inner:IndexLookUp_20, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey - ├─TableReader_42(Build) 2925937.50 root data:Selection_41 - │ └─Selection_41 2925937.50 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-04-01) - │ └─TableFullScan_40 75000000.00 cop[tikv] table:orders keep order:false - └─IndexLookUp_20(Probe) 4.05 root - ├─IndexRangeScan_17(Build) 5.06 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false - └─Selection_19(Probe) 4.05 cop[tikv] lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate) - └─TableRowIDScan_18 5.06 cop[tikv] table:lineitem keep order:false +Sort 1.00 root tpch.orders.o_orderpriority +└─Projection 1.00 root tpch.orders.o_orderpriority, Column#27 + └─HashAgg 1.00 root group by:tpch.orders.o_orderpriority, funcs:count(1)->Column#27, funcs:firstrow(tpch.orders.o_orderpriority)->tpch.orders.o_orderpriority + └─IndexHashJoin 2340750.00 root semi join, inner:IndexLookUp, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey, equal cond:eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey) + ├─TableReader(Build) 2925937.50 root data:Selection + │ └─Selection 2925937.50 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-04-01) + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─IndexLookUp(Probe) 4.05 root + ├─IndexRangeScan(Build) 5.06 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false + └─Selection(Probe) 4.05 cop[tikv] lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate) + └─TableRowIDScan 5.06 cop[tikv] table:lineitem keep order:false /* Q5 Local Supplier Volume Query This query lists the revenue volume done through local suppliers. @@ -316,7 +317,7 @@ revenue. Revenue volume for all qualifying lineitems in a particular nation is d l_discount)). Planner enhancement: join reorder. */ -explain +explain format = 'brief' select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue @@ -342,29 +343,30 @@ n_name order by revenue desc; id estRows task access object operator info -Sort_23 5.00 root Column#49:desc -└─Projection_25 5.00 root tpch.nation.n_name, Column#49 - └─HashAgg_28 5.00 root group by:Column#52, funcs:sum(Column#50)->Column#49, funcs:firstrow(Column#51)->tpch.nation.n_name - └─Projection_86 11822812.50 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#50, tpch.nation.n_name, tpch.nation.n_name - └─HashJoin_38 11822812.50 root inner join, equal:[eq(tpch.supplier.s_nationkey, tpch.customer.c_nationkey) eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] - ├─TableReader_84(Build) 7500000.00 root data:TableFullScan_83 - │ └─TableFullScan_83 7500000.00 cop[tikv] table:customer keep order:false - └─HashJoin_52(Probe) 11822812.50 root inner join, equal:[eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)] - ├─TableReader_82(Build) 11822812.50 root data:Selection_81 - │ └─Selection_81 11822812.50 cop[tikv] ge(tpch.orders.o_orderdate, 1994-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-01-01) - │ └─TableFullScan_80 75000000.00 cop[tikv] table:orders keep order:false - └─HashJoin_55(Probe) 61163763.01 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] - ├─HashJoin_57(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ ├─HashJoin_70(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] - │ │ ├─TableReader_75(Build) 1.00 root data:Selection_74 - │ │ │ └─Selection_74 1.00 cop[tikv] eq(tpch.region.r_name, "MIDDLE EAST") - │ │ │ └─TableFullScan_73 5.00 cop[tikv] table:region keep order:false - │ │ └─TableReader_72(Probe) 25.00 root data:TableFullScan_71 - │ │ └─TableFullScan_71 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_77(Probe) 500000.00 root data:TableFullScan_76 - │ └─TableFullScan_76 500000.00 cop[tikv] table:supplier keep order:false - └─TableReader_79(Probe) 300005811.00 root data:TableFullScan_78 - └─TableFullScan_78 300005811.00 cop[tikv] table:lineitem keep order:false +Sort 5.00 root Column#49:desc +└─Projection 5.00 root tpch.nation.n_name, Column#49 + └─HashAgg 5.00 root group by:Column#52, funcs:sum(Column#50)->Column#49, funcs:firstrow(Column#51)->tpch.nation.n_name + └─Projection 11822812.50 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#50, tpch.nation.n_name, tpch.nation.n_name + └─Projection 11822812.50 root tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.nation.n_name + └─HashJoin 11822812.50 root inner join, equal:[eq(tpch.supplier.s_nationkey, tpch.customer.c_nationkey) eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] + ├─TableReader(Build) 7500000.00 root data:TableFullScan + │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + └─HashJoin(Probe) 11822812.50 root inner join, equal:[eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)] + ├─TableReader(Build) 11822812.50 root data:Selection + │ └─Selection 11822812.50 cop[tikv] ge(tpch.orders.o_orderdate, 1994-01-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1995-01-01) + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─HashJoin(Probe) 61163763.01 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + ├─HashJoin(Build) 100000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─HashJoin(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] + │ │ ├─TableReader(Build) 1.00 root data:Selection + │ │ │ └─Selection 1.00 cop[tikv] eq(tpch.region.r_name, "MIDDLE EAST") + │ │ │ └─TableFullScan 5.00 cop[tikv] table:region keep order:false + │ │ └─TableReader(Probe) 25.00 root data:TableFullScan + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─TableReader(Probe) 300005811.00 root data:TableFullScan + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q6 Forecasting Revenue Change Query This query quantifies the amount of revenue increase that would have resulted from eliminating certain companywide @@ -376,7 +378,7 @@ increased if these discounts had been eliminated for lineitems with l_quantity l potential revenue increase is equal to the sum of [l_extendedprice * l_discount] for all lineitems with discounts and quantities in the qualifying range. */ -explain +explain format = 'brief' select sum(l_extendedprice * l_discount) as revenue from @@ -387,11 +389,11 @@ and l_shipdate < date_add('1994-01-01', interval '1' year) and l_discount between 0.06 - 0.01 and 0.06 + 0.01 and l_quantity < 24; id estRows task access object operator info -StreamAgg_20 1.00 root funcs:sum(Column#20)->Column#18 -└─TableReader_21 1.00 root data:StreamAgg_9 - └─StreamAgg_9 1.00 cop[tikv] funcs:sum(mul(tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount))->Column#20 - └─Selection_19 3713857.91 cop[tikv] ge(tpch.lineitem.l_discount, 0.05), ge(tpch.lineitem.l_shipdate, 1994-01-01 00:00:00.000000), le(tpch.lineitem.l_discount, 0.07), lt(tpch.lineitem.l_quantity, 24), lt(tpch.lineitem.l_shipdate, 1995-01-01) - └─TableFullScan_18 300005811.00 cop[tikv] table:lineitem keep order:false +StreamAgg 1.00 root funcs:sum(Column#20)->Column#18 +└─TableReader 1.00 root data:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:sum(mul(tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount))->Column#20 + └─Selection 3713857.91 cop[tikv] ge(tpch.lineitem.l_discount, 0.05), ge(tpch.lineitem.l_shipdate, 1994-01-01 00:00:00.000000), le(tpch.lineitem.l_discount, 0.07), lt(tpch.lineitem.l_quantity, 24), lt(tpch.lineitem.l_shipdate, 1995-01-01) + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q7 Volume Shipping Query This query determines the value of goods shipped between certain nations to help in the re-negotiation of shipping @@ -402,7 +404,7 @@ The query lists the supplier nation, the customer nation, the year, and the reve that year. The query orders the answer by Supplier nation, Customer nation, and year (all ascending). Planner enahancement: join reorder. */ -explain +explain format = 'brief' select supp_nation, cust_nation, @@ -443,30 +445,31 @@ supp_nation, cust_nation, l_year; id estRows task access object operator info -Sort_22 769.96 root tpch.nation.n_name, tpch.nation.n_name, Column#50 -└─Projection_24 769.96 root tpch.nation.n_name, tpch.nation.n_name, Column#50, Column#52 - └─HashAgg_27 769.96 root group by:Column#50, tpch.nation.n_name, tpch.nation.n_name, funcs:sum(Column#51)->Column#52, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#50)->Column#50 - └─Projection_28 1957240.42 root tpch.nation.n_name, tpch.nation.n_name, extract(YEAR, tpch.lineitem.l_shipdate)->Column#50, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#51 - └─HashJoin_40 1957240.42 root inner join, equal:[eq(tpch.customer.c_nationkey, tpch.nation.n_nationkey)], other cond:or(and(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")), and(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN"))) - ├─TableReader_94(Build) 2.00 root data:Selection_93 - │ └─Selection_93 2.00 cop[tikv] or(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN")) - │ └─TableFullScan_92 25.00 cop[tikv] table:n2 keep order:false - └─HashJoin_51(Probe) 24465505.20 root inner join, equal:[eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] - ├─TableReader_91(Build) 7500000.00 root data:TableFullScan_90 - │ └─TableFullScan_90 7500000.00 cop[tikv] table:customer keep order:false - └─IndexMergeJoin_62(Probe) 24465505.20 root inner join, inner:TableReader_57, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey - ├─HashJoin_66(Build) 24465505.20 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] - │ ├─HashJoin_79(Build) 40000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ │ ├─TableReader_84(Build) 2.00 root data:Selection_83 - │ │ │ └─Selection_83 2.00 cop[tikv] or(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")) - │ │ │ └─TableFullScan_82 25.00 cop[tikv] table:n1 keep order:false - │ │ └─TableReader_81(Probe) 500000.00 root data:TableFullScan_80 - │ │ └─TableFullScan_80 500000.00 cop[tikv] table:supplier keep order:false - │ └─TableReader_87(Probe) 91446230.29 root data:Selection_86 - │ └─Selection_86 91446230.29 cop[tikv] ge(tpch.lineitem.l_shipdate, 1995-01-01 00:00:00.000000), le(tpch.lineitem.l_shipdate, 1996-12-31 00:00:00.000000) - │ └─TableFullScan_85 300005811.00 cop[tikv] table:lineitem keep order:false - └─TableReader_57(Probe) 1.00 root data:TableRangeScan_56 - └─TableRangeScan_56 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:true +Sort 769.96 root tpch.nation.n_name, tpch.nation.n_name, Column#50 +└─Projection 769.96 root tpch.nation.n_name, tpch.nation.n_name, Column#50, Column#52 + └─HashAgg 769.96 root group by:Column#50, tpch.nation.n_name, tpch.nation.n_name, funcs:sum(Column#51)->Column#52, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#50)->Column#50 + └─Projection 1957240.42 root tpch.nation.n_name, tpch.nation.n_name, extract(YEAR, tpch.lineitem.l_shipdate)->Column#50, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#51 + └─Projection 1957240.42 root tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.lineitem.l_shipdate, tpch.nation.n_name, tpch.nation.n_name + └─HashJoin 1957240.42 root inner join, equal:[eq(tpch.customer.c_nationkey, tpch.nation.n_nationkey)], other cond:or(and(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")), and(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN"))) + ├─TableReader(Build) 2.00 root data:Selection + │ └─Selection 2.00 cop[tikv] or(eq(tpch.nation.n_name, "INDIA"), eq(tpch.nation.n_name, "JAPAN")) + │ └─TableFullScan 25.00 cop[tikv] table:n2 keep order:false + └─HashJoin(Probe) 24465505.20 root inner join, equal:[eq(tpch.orders.o_custkey, tpch.customer.c_custkey)] + ├─TableReader(Build) 7500000.00 root data:TableFullScan + │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + └─IndexJoin(Probe) 24465505.20 root inner join, inner:TableReader, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey, equal cond:eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey) + ├─HashJoin(Build) 24465505.20 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ ├─HashJoin(Build) 40000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ │ ├─TableReader(Build) 2.00 root data:Selection + │ │ │ └─Selection 2.00 cop[tikv] or(eq(tpch.nation.n_name, "JAPAN"), eq(tpch.nation.n_name, "INDIA")) + │ │ │ └─TableFullScan 25.00 cop[tikv] table:n1 keep order:false + │ │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + │ └─TableReader(Probe) 91446230.29 root data:Selection + │ └─Selection 91446230.29 cop[tikv] ge(tpch.lineitem.l_shipdate, 1995-01-01 00:00:00.000000), le(tpch.lineitem.l_shipdate, 1996-12-31 00:00:00.000000) + │ └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:false /* Q8 National Market Share Query This query determines how the market share of a given nation within a given region has changed over two years for @@ -476,7 +479,7 @@ The market share for a given nation within a given region is defined as the frac from the given nation. The query determines this for the years 1995 and 1996 presented in this order. Planner enhancement: join reorder. */ -explain +explain format = 'brief' select o_year, sum(case @@ -515,38 +518,39 @@ o_year order by o_year; id estRows task access object operator info -Sort_29 719.02 root Column#62 -└─Projection_31 719.02 root Column#62, div(Column#64, Column#65)->Column#66 - └─HashAgg_34 719.02 root group by:Column#78, funcs:sum(Column#75)->Column#64, funcs:sum(Column#76)->Column#65, funcs:firstrow(Column#77)->Column#62 - └─Projection_123 563136.02 root case(eq(tpch.nation.n_name, INDIA), Column#63, 0)->Column#75, Column#63, Column#62, Column#62 - └─Projection_35 563136.02 root extract(YEAR, tpch.orders.o_orderdate)->Column#62, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#63, tpch.nation.n_name - └─HashJoin_45 563136.02 root inner join, equal:[eq(tpch.supplier.s_nationkey, tpch.nation.n_nationkey)] - ├─TableReader_121(Build) 25.00 root data:TableFullScan_120 - │ └─TableFullScan_120 25.00 cop[tikv] table:n2 keep order:false - └─HashJoin_56(Probe) 563136.02 root inner join, equal:[eq(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey)] - ├─TableReader_119(Build) 500000.00 root data:TableFullScan_118 - │ └─TableFullScan_118 500000.00 cop[tikv] table:supplier keep order:false - └─HashJoin_69(Probe) 563136.02 root inner join, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] - ├─TableReader_117(Build) 61674.00 root data:Selection_116 - │ └─Selection_116 61674.00 cop[tikv] eq(tpch.part.p_type, "SMALL PLATED COPPER") - │ └─TableFullScan_115 10000000.00 cop[tikv] table:part keep order:false - └─IndexHashJoin_77(Probe) 90788402.51 root inner join, inner:IndexLookUp_74, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey - ├─HashJoin_87(Build) 22413367.93 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - │ ├─HashJoin_89(Build) 1500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] - │ │ ├─HashJoin_102(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] - │ │ │ ├─TableReader_107(Build) 1.00 root data:Selection_106 - │ │ │ │ └─Selection_106 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") - │ │ │ │ └─TableFullScan_105 5.00 cop[tikv] table:region keep order:false - │ │ │ └─TableReader_104(Probe) 25.00 root data:TableFullScan_103 - │ │ │ └─TableFullScan_103 25.00 cop[tikv] table:n1 keep order:false - │ │ └─TableReader_109(Probe) 7500000.00 root data:TableFullScan_108 - │ │ └─TableFullScan_108 7500000.00 cop[tikv] table:customer keep order:false - │ └─TableReader_112(Probe) 22413367.93 root data:Selection_111 - │ └─Selection_111 22413367.93 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), le(tpch.orders.o_orderdate, 1996-12-31 00:00:00.000000) - │ └─TableFullScan_110 75000000.00 cop[tikv] table:orders keep order:false - └─IndexLookUp_74(Probe) 4.05 root - ├─IndexRangeScan_72(Build) 4.05 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false - └─TableRowIDScan_73(Probe) 4.05 cop[tikv] table:lineitem keep order:false +Sort 719.02 root Column#62 +└─Projection 719.02 root Column#62, div(Column#64, Column#65)->Column#66 + └─HashAgg 719.02 root group by:Column#78, funcs:sum(Column#75)->Column#64, funcs:sum(Column#76)->Column#65, funcs:firstrow(Column#77)->Column#62 + └─Projection 563136.02 root case(eq(tpch.nation.n_name, INDIA), Column#63, 0)->Column#75, Column#63, Column#62, Column#62 + └─Projection 563136.02 root extract(YEAR, tpch.orders.o_orderdate)->Column#62, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#63, tpch.nation.n_name + └─Projection 563136.02 root tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.orders.o_orderdate, tpch.nation.n_name + └─HashJoin 563136.02 root inner join, equal:[eq(tpch.supplier.s_nationkey, tpch.nation.n_nationkey)] + ├─TableReader(Build) 25.00 root data:TableFullScan + │ └─TableFullScan 25.00 cop[tikv] table:n2 keep order:false + └─HashJoin(Probe) 563136.02 root inner join, equal:[eq(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey)] + ├─TableReader(Build) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─HashJoin(Probe) 563136.02 root inner join, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] + ├─TableReader(Build) 61674.00 root data:Selection + │ └─Selection 61674.00 cop[tikv] eq(tpch.part.p_type, "SMALL PLATED COPPER") + │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + └─IndexHashJoin(Probe) 90788402.51 root inner join, inner:IndexLookUp, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey, equal cond:eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey) + ├─HashJoin(Build) 22413367.93 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ ├─HashJoin(Build) 1500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] + │ │ ├─HashJoin(Build) 5.00 root inner join, equal:[eq(tpch.region.r_regionkey, tpch.nation.n_regionkey)] + │ │ │ ├─TableReader(Build) 1.00 root data:Selection + │ │ │ │ └─Selection 1.00 cop[tikv] eq(tpch.region.r_name, "ASIA") + │ │ │ │ └─TableFullScan 5.00 cop[tikv] table:region keep order:false + │ │ │ └─TableReader(Probe) 25.00 root data:TableFullScan + │ │ │ └─TableFullScan 25.00 cop[tikv] table:n1 keep order:false + │ │ └─TableReader(Probe) 7500000.00 root data:TableFullScan + │ │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + │ └─TableReader(Probe) 22413367.93 root data:Selection + │ └─Selection 22413367.93 cop[tikv] ge(tpch.orders.o_orderdate, 1995-01-01 00:00:00.000000), le(tpch.orders.o_orderdate, 1996-12-31 00:00:00.000000) + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─IndexLookUp(Probe) 4.05 root + ├─IndexRangeScan(Build) 4.05 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false + └─TableRowIDScan(Probe) 4.05 cop[tikv] table:lineitem keep order:false /* Q9 Product Type Profit Measure Query This query determines how much profit is made on a given line of parts, broken out by supplier nation and year. @@ -557,7 +561,7 @@ parts in the specified line. The query lists the nations in ascending alphabetic and profit in descending order by year (most recent first). Planner enhancement: join reorder. */ -explain +explain format = 'brief' select nation, o_year, @@ -591,28 +595,29 @@ order by nation, o_year desc; id estRows task access object operator info -Sort_25 2406.00 root tpch.nation.n_name, Column#53:desc -└─Projection_27 2406.00 root tpch.nation.n_name, Column#53, Column#55 - └─HashAgg_30 2406.00 root group by:Column#53, tpch.nation.n_name, funcs:sum(Column#54)->Column#55, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#53)->Column#53 - └─Projection_31 971049283.51 root tpch.nation.n_name, extract(YEAR, tpch.orders.o_orderdate)->Column#53, minus(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), mul(tpch.partsupp.ps_supplycost, tpch.lineitem.l_quantity))->Column#54 - └─HashJoin_44 971049283.51 root inner join, equal:[eq(tpch.lineitem.l_suppkey, tpch.partsupp.ps_suppkey) eq(tpch.lineitem.l_partkey, tpch.partsupp.ps_partkey)] - ├─TableReader_106(Build) 40000000.00 root data:TableFullScan_105 - │ └─TableFullScan_105 40000000.00 cop[tikv] table:partsupp keep order:false - └─HashJoin_56(Probe) 241379546.70 root inner join, equal:[eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)] - ├─TableReader_104(Build) 75000000.00 root data:TableFullScan_103 - │ └─TableFullScan_103 75000000.00 cop[tikv] table:orders keep order:false - └─HashJoin_79(Probe) 241379546.70 root inner join, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] - ├─TableReader_102(Build) 8000000.00 root data:Selection_101 - │ └─Selection_101 8000000.00 cop[tikv] like(tpch.part.p_name, "%dim%", 92) - │ └─TableFullScan_100 10000000.00 cop[tikv] table:part keep order:false - └─HashJoin_82(Probe) 300005811.00 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] - ├─HashJoin_93(Build) 500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ ├─TableReader_97(Build) 25.00 root data:TableFullScan_96 - │ │ └─TableFullScan_96 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_95(Probe) 500000.00 root data:TableFullScan_94 - │ └─TableFullScan_94 500000.00 cop[tikv] table:supplier keep order:false - └─TableReader_99(Probe) 300005811.00 root data:TableFullScan_98 - └─TableFullScan_98 300005811.00 cop[tikv] table:lineitem keep order:false +Sort 2406.00 root tpch.nation.n_name, Column#53:desc +└─Projection 2406.00 root tpch.nation.n_name, Column#53, Column#55 + └─HashAgg 2406.00 root group by:Column#53, tpch.nation.n_name, funcs:sum(Column#54)->Column#55, funcs:firstrow(tpch.nation.n_name)->tpch.nation.n_name, funcs:firstrow(Column#53)->Column#53 + └─Projection 241379546.70 root tpch.nation.n_name, extract(YEAR, tpch.orders.o_orderdate)->Column#53, minus(mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), mul(tpch.partsupp.ps_supplycost, tpch.lineitem.l_quantity))->Column#54 + └─Projection 241379546.70 root tpch.lineitem.l_quantity, tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.partsupp.ps_supplycost, tpch.orders.o_orderdate, tpch.nation.n_name + └─HashJoin 241379546.70 root inner join, equal:[eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)] + ├─TableReader(Build) 75000000.00 root data:TableFullScan + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─HashJoin(Probe) 241379546.70 root inner join, equal:[eq(tpch.lineitem.l_suppkey, tpch.partsupp.ps_suppkey) eq(tpch.lineitem.l_partkey, tpch.partsupp.ps_partkey)] + ├─TableReader(Build) 40000000.00 root data:TableFullScan + │ └─TableFullScan 40000000.00 cop[tikv] table:partsupp keep order:false + └─HashJoin(Probe) 241379546.70 root inner join, equal:[eq(tpch.lineitem.l_partkey, tpch.part.p_partkey)] + ├─TableReader(Build) 8000000.00 root data:Selection + │ └─Selection 8000000.00 cop[tikv] like(tpch.part.p_name, "%dim%", 92) + │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + └─HashJoin(Probe) 300005811.00 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + ├─HashJoin(Build) 500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─TableReader(Build) 25.00 root data:TableFullScan + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─TableReader(Probe) 300005811.00 root data:TableFullScan + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q10 Returned Item Reporting Query The query identifies customers who might be having problems with the parts that are shipped to them. @@ -623,7 +628,7 @@ lost. The customers are listed in descending order of lost revenue. Revenue lost sum(l_extendedprice*(1-l_discount)) for all qualifying lineitems. Planner enhancement: join reorder, if group-by item have primary key, non-priamry key is useless. */ -explain +explain format = 'brief' select c_custkey, c_name, @@ -657,24 +662,25 @@ order by revenue desc limit 20; id estRows task access object operator info -Projection_17 20.00 root tpch.customer.c_custkey, tpch.customer.c_name, Column#39, tpch.customer.c_acctbal, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_comment -└─TopN_20 20.00 root Column#39:desc, offset:0, count:20 - └─HashAgg_26 3017307.69 root group by:Column#53, Column#54, Column#55, Column#56, Column#57, Column#58, Column#59, funcs:sum(Column#45)->Column#39, funcs:firstrow(Column#46)->tpch.customer.c_custkey, funcs:firstrow(Column#47)->tpch.customer.c_name, funcs:firstrow(Column#48)->tpch.customer.c_address, funcs:firstrow(Column#49)->tpch.customer.c_phone, funcs:firstrow(Column#50)->tpch.customer.c_acctbal, funcs:firstrow(Column#51)->tpch.customer.c_comment, funcs:firstrow(Column#52)->tpch.nation.n_name - └─Projection_67 12222016.17 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#45, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_acctbal, tpch.customer.c_comment, tpch.nation.n_name, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_acctbal, tpch.customer.c_phone, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_comment - └─IndexHashJoin_34 12222016.17 root inner join, inner:IndexLookUp_31, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey - ├─HashJoin_44(Build) 3017307.69 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - │ ├─TableReader_63(Build) 3017307.69 root data:Selection_62 - │ │ └─Selection_62 3017307.69 cop[tikv] ge(tpch.orders.o_orderdate, 1993-08-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1993-11-01) - │ │ └─TableFullScan_61 75000000.00 cop[tikv] table:orders keep order:false - │ └─HashJoin_56(Probe) 7500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] - │ ├─TableReader_60(Build) 25.00 root data:TableFullScan_59 - │ │ └─TableFullScan_59 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_58(Probe) 7500000.00 root data:TableFullScan_57 - │ └─TableFullScan_57 7500000.00 cop[tikv] table:customer keep order:false - └─IndexLookUp_31(Probe) 4.05 root - ├─IndexRangeScan_28(Build) 16.44 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false - └─Selection_30(Probe) 4.05 cop[tikv] eq(tpch.lineitem.l_returnflag, "R") - └─TableRowIDScan_29 16.44 cop[tikv] table:lineitem keep order:false +Projection 20.00 root tpch.customer.c_custkey, tpch.customer.c_name, Column#39, tpch.customer.c_acctbal, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_comment +└─TopN 20.00 root Column#39:desc, offset:0, count:20 + └─HashAgg 3017307.69 root group by:Column#53, Column#54, Column#55, Column#56, Column#57, Column#58, Column#59, funcs:sum(Column#45)->Column#39, funcs:firstrow(Column#46)->tpch.customer.c_custkey, funcs:firstrow(Column#47)->tpch.customer.c_name, funcs:firstrow(Column#48)->tpch.customer.c_address, funcs:firstrow(Column#49)->tpch.customer.c_phone, funcs:firstrow(Column#50)->tpch.customer.c_acctbal, funcs:firstrow(Column#51)->tpch.customer.c_comment, funcs:firstrow(Column#52)->tpch.nation.n_name + └─Projection 12222016.17 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#45, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_acctbal, tpch.customer.c_comment, tpch.nation.n_name, tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_acctbal, tpch.customer.c_phone, tpch.nation.n_name, tpch.customer.c_address, tpch.customer.c_comment + └─Projection 12222016.17 root tpch.customer.c_custkey, tpch.customer.c_name, tpch.customer.c_address, tpch.customer.c_phone, tpch.customer.c_acctbal, tpch.customer.c_comment, tpch.lineitem.l_extendedprice, tpch.lineitem.l_discount, tpch.nation.n_name + └─IndexHashJoin 12222016.17 root inner join, inner:IndexLookUp, outer key:tpch.orders.o_orderkey, inner key:tpch.lineitem.l_orderkey, equal cond:eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey) + ├─HashJoin(Build) 3017307.69 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ ├─TableReader(Build) 3017307.69 root data:Selection + │ │ └─Selection 3017307.69 cop[tikv] ge(tpch.orders.o_orderdate, 1993-08-01 00:00:00.000000), lt(tpch.orders.o_orderdate, 1993-11-01) + │ │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + │ └─HashJoin(Probe) 7500000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] + │ ├─TableReader(Build) 25.00 root data:TableFullScan + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 7500000.00 root data:TableFullScan + │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + └─IndexLookUp(Probe) 4.05 root + ├─IndexRangeScan(Build) 16.44 cop[tikv] table:lineitem, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey)], keep order:false + └─Selection(Probe) 4.05 cop[tikv] eq(tpch.lineitem.l_returnflag, "R") + └─TableRowIDScan 16.44 cop[tikv] table:lineitem keep order:false /* Q11 Important Stock Identification Query This query finds the most important subset of suppliers' stock in a given nation. @@ -682,7 +688,7 @@ The Important Stock Identification Query finds, from scanning the available stoc the parts that represent a significant percentage of the total value of all available parts. The query displays the part number and the value of those parts in descending order of value. */ -explain +explain format = 'brief' select ps_partkey, sum(ps_supplycost * ps_availqty) as value @@ -711,20 +717,20 @@ and n_name = 'MOZAMBIQUE' order by value desc; id estRows task access object operator info -Projection_57 1304801.67 root tpch.partsupp.ps_partkey, Column#18 -└─Sort_58 1304801.67 root Column#18:desc - └─Selection_60 1304801.67 root gt(Column#18, NULL) - └─HashAgg_63 1631002.09 root group by:Column#44, funcs:sum(Column#42)->Column#18, funcs:firstrow(Column#43)->tpch.partsupp.ps_partkey - └─Projection_89 1631002.09 root mul(tpch.partsupp.ps_supplycost, cast(tpch.partsupp.ps_availqty, decimal(20,0) BINARY))->Column#42, tpch.partsupp.ps_partkey, tpch.partsupp.ps_partkey - └─HashJoin_67 1631002.09 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] - ├─HashJoin_80(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ ├─TableReader_85(Build) 1.00 root data:Selection_84 - │ │ └─Selection_84 1.00 cop[tikv] eq(tpch.nation.n_name, "MOZAMBIQUE") - │ │ └─TableFullScan_83 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_82(Probe) 500000.00 root data:TableFullScan_81 - │ └─TableFullScan_81 500000.00 cop[tikv] table:supplier keep order:false - └─TableReader_87(Probe) 40000000.00 root data:TableFullScan_86 - └─TableFullScan_86 40000000.00 cop[tikv] table:partsupp keep order:false +Projection 1304801.67 root tpch.partsupp.ps_partkey, Column#35 +└─Sort 1304801.67 root Column#35:desc + └─Selection 1304801.67 root gt(Column#35, NULL) + └─HashAgg 1631002.09 root group by:Column#44, funcs:sum(Column#42)->Column#35, funcs:firstrow(Column#43)->tpch.partsupp.ps_partkey + └─Projection 1631002.09 root mul(tpch.partsupp.ps_supplycost, cast(tpch.partsupp.ps_availqty, decimal(20,0) BINARY))->Column#42, tpch.partsupp.ps_partkey, tpch.partsupp.ps_partkey + └─HashJoin 1631002.09 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashJoin(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─TableReader(Build) 1.00 root data:Selection + │ │ └─Selection 1.00 cop[tikv] eq(tpch.nation.n_name, "MOZAMBIQUE") + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─TableReader(Probe) 40000000.00 root data:TableFullScan + └─TableFullScan 40000000.00 cop[tikv] table:partsupp keep order:false /* Q12 Shipping Modes and Order Priority Query This query determines whether selecting less expensive modes of shipping is negatively affecting the critical-priority @@ -735,7 +741,7 @@ two different specified ship modes. Only lineitems that were actually shipped be The late lineitems are partitioned into two groups, those with priority URGENT or HIGH, and those with a priority other than URGENT or HIGH. */ -explain +explain format = 'brief' select l_shipmode, sum(case @@ -765,16 +771,17 @@ l_shipmode order by l_shipmode; id estRows task access object operator info -Sort_9 1.00 root tpch.lineitem.l_shipmode -└─Projection_11 1.00 root tpch.lineitem.l_shipmode, Column#27, Column#28 - └─HashAgg_14 1.00 root group by:Column#40, funcs:sum(Column#37)->Column#27, funcs:sum(Column#38)->Column#28, funcs:firstrow(Column#39)->tpch.lineitem.l_shipmode - └─Projection_54 10023369.01 root cast(case(or(eq(tpch.orders.o_orderpriority, 1-URGENT), eq(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0), decimal(65,0) BINARY)->Column#37, cast(case(and(ne(tpch.orders.o_orderpriority, 1-URGENT), ne(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0), decimal(65,0) BINARY)->Column#38, tpch.lineitem.l_shipmode, tpch.lineitem.l_shipmode - └─IndexMergeJoin_24 10023369.01 root inner join, inner:TableReader_19, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey - ├─TableReader_50(Build) 10023369.01 root data:Selection_49 - │ └─Selection_49 10023369.01 cop[tikv] ge(tpch.lineitem.l_receiptdate, 1997-01-01 00:00:00.000000), in(tpch.lineitem.l_shipmode, "RAIL", "FOB"), lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate), lt(tpch.lineitem.l_receiptdate, 1998-01-01), lt(tpch.lineitem.l_shipdate, tpch.lineitem.l_commitdate) - │ └─TableFullScan_48 300005811.00 cop[tikv] table:lineitem keep order:false - └─TableReader_19(Probe) 1.00 root data:TableRangeScan_18 - └─TableRangeScan_18 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:true +Sort 1.00 root tpch.lineitem.l_shipmode +└─Projection 1.00 root tpch.lineitem.l_shipmode, Column#27, Column#28 + └─HashAgg 1.00 root group by:Column#40, funcs:sum(Column#37)->Column#27, funcs:sum(Column#38)->Column#28, funcs:firstrow(Column#39)->tpch.lineitem.l_shipmode + └─Projection 10023369.01 root cast(case(or(eq(tpch.orders.o_orderpriority, 1-URGENT), eq(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0), decimal(22,0) BINARY)->Column#37, cast(case(and(ne(tpch.orders.o_orderpriority, 1-URGENT), ne(tpch.orders.o_orderpriority, 2-HIGH)), 1, 0), decimal(22,0) BINARY)->Column#38, tpch.lineitem.l_shipmode, tpch.lineitem.l_shipmode + └─Projection 10023369.01 root tpch.orders.o_orderpriority, tpch.lineitem.l_shipmode + └─IndexJoin 10023369.01 root inner join, inner:TableReader, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey, equal cond:eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey) + ├─TableReader(Build) 10023369.01 root data:Selection + │ └─Selection 10023369.01 cop[tikv] ge(tpch.lineitem.l_receiptdate, 1997-01-01 00:00:00.000000), in(tpch.lineitem.l_shipmode, "RAIL", "FOB"), lt(tpch.lineitem.l_commitdate, tpch.lineitem.l_receiptdate), lt(tpch.lineitem.l_receiptdate, 1998-01-01), lt(tpch.lineitem.l_shipdate, tpch.lineitem.l_commitdate) + │ └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:false /* Q13 Customer Distribution Query This query seeks relationships between customers and the size of their orders. @@ -783,7 +790,7 @@ who have no record of orders, past or present. It counts and reports how many cu have 1, 2, 3, etc. A check is made to ensure that the orders counted do not fall into one of several special categories of orders. Special categories are identified in the order comment column by looking for a particular pattern. */ -explain +explain format = 'brief' select c_count, count(*) as custdist @@ -805,16 +812,16 @@ order by custdist desc, c_count desc; id estRows task access object operator info -Sort_9 7500000.00 root Column#19:desc, Column#18:desc -└─Projection_11 7500000.00 root Column#18, Column#19 - └─HashAgg_14 7500000.00 root group by:Column#18, funcs:count(1)->Column#19, funcs:firstrow(Column#18)->Column#18 - └─HashAgg_17 7500000.00 root group by:tpch.customer.c_custkey, funcs:count(tpch.orders.o_orderkey)->Column#18 - └─HashJoin_21 60000000.00 root left outer join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - ├─TableReader_23(Build) 7500000.00 root data:TableFullScan_22 - │ └─TableFullScan_22 7500000.00 cop[tikv] table:customer keep order:false - └─TableReader_26(Probe) 60000000.00 root data:Selection_25 - └─Selection_25 60000000.00 cop[tikv] not(like(tpch.orders.o_comment, "%pending%deposits%", 92)) - └─TableFullScan_24 75000000.00 cop[tikv] table:orders keep order:false +Sort 7500000.00 root Column#19:desc, Column#18:desc +└─Projection 7500000.00 root Column#18, Column#19 + └─HashAgg 7500000.00 root group by:Column#18, funcs:count(1)->Column#19, funcs:firstrow(Column#18)->Column#18 + └─HashAgg 7500000.00 root group by:tpch.customer.c_custkey, funcs:count(tpch.orders.o_orderkey)->Column#18 + └─HashJoin 60000000.00 root left outer join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + ├─TableReader(Build) 7500000.00 root data:TableFullScan + │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + └─TableReader(Probe) 60000000.00 root data:Selection + └─Selection 60000000.00 cop[tikv] not(like(tpch.orders.o_comment, "%pending%deposits%", 92)) + └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false /* Q14 Promotion Effect Query This query monitors the market response to a promotion such as TV advertisements or a special campaign. @@ -822,7 +829,7 @@ The Promotion Effect Query determines what percentage of the revenue in a given promotional parts. The query considers only parts actually shipped in that month and gives the percentage. Revenue is defined as (l_extendedprice * (1-l_discount)). */ -explain +explain format = 'brief' select 100.00 * sum(case when p_type like 'PROMO%' @@ -837,15 +844,15 @@ l_partkey = p_partkey and l_shipdate >= '1996-12-01' and l_shipdate < date_add('1996-12-01', interval '1' month); id estRows task access object operator info -Projection_8 1.00 root div(mul(100.00, Column#27), Column#28)->Column#29 -└─StreamAgg_13 1.00 root funcs:sum(Column#31)->Column#27, funcs:sum(Column#32)->Column#28 - └─Projection_41 4121984.49 root case(like(tpch.part.p_type, PROMO%, 92), mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), 0)->Column#31, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#32 - └─IndexMergeJoin_38 4121984.49 root inner join, inner:TableReader_33, outer key:tpch.lineitem.l_partkey, inner key:tpch.part.p_partkey - ├─TableReader_27(Build) 4121984.49 root data:Selection_26 - │ └─Selection_26 4121984.49 cop[tikv] ge(tpch.lineitem.l_shipdate, 1996-12-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1997-01-01) - │ └─TableFullScan_25 300005811.00 cop[tikv] table:lineitem keep order:false - └─TableReader_33(Probe) 1.00 root data:TableRangeScan_32 - └─TableRangeScan_32 1.00 cop[tikv] table:part range: decided by [tpch.lineitem.l_partkey], keep order:true +Projection 1.00 root div(mul(100.00, Column#27), Column#28)->Column#29 +└─StreamAgg 1.00 root funcs:sum(Column#31)->Column#27, funcs:sum(Column#32)->Column#28 + └─Projection 4121984.49 root case(like(tpch.part.p_type, PROMO%, 92), mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount)), 0)->Column#31, mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#32 + └─IndexJoin 4121984.49 root inner join, inner:TableReader, outer key:tpch.lineitem.l_partkey, inner key:tpch.part.p_partkey, equal cond:eq(tpch.lineitem.l_partkey, tpch.part.p_partkey) + ├─TableReader(Build) 4121984.49 root data:Selection + │ └─Selection 4121984.49 cop[tikv] ge(tpch.lineitem.l_shipdate, 1996-12-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1997-01-01) + │ └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false + └─TableReader(Probe) 1.00 root data:TableRangeScan + └─TableRangeScan 1.00 cop[tikv] table:part range: decided by [tpch.lineitem.l_partkey], keep order:false /* Q15 Top Supplier Query This query determines the top supplier so it can be rewarded, given more business, or identified for special recognition. @@ -894,7 +901,7 @@ customer's requirements. The customer is interested in parts of eight different type, not of a given brand, and not from a supplier who has had complaints registered at the Better Business Bureau. Results must be presented in descending count and ascending brand, type, and size. */ -explain +explain format = 'brief' select p_brand, p_type, @@ -926,19 +933,20 @@ p_brand, p_type, p_size; id estRows task access object operator info -Sort_13 14.41 root Column#23:desc, tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size -└─Projection_15 14.41 root tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size, Column#23 - └─HashAgg_16 14.41 root group by:tpch.part.p_brand, tpch.part.p_size, tpch.part.p_type, funcs:count(distinct tpch.partsupp.ps_suppkey)->Column#23, funcs:firstrow(tpch.part.p_brand)->tpch.part.p_brand, funcs:firstrow(tpch.part.p_type)->tpch.part.p_type, funcs:firstrow(tpch.part.p_size)->tpch.part.p_size - └─HashJoin_28 3863988.24 root anti semi join, equal:[eq(tpch.partsupp.ps_suppkey, tpch.supplier.s_suppkey)] - ├─TableReader_66(Build) 400000.00 root data:Selection_65 - │ └─Selection_65 400000.00 cop[tikv] like(tpch.supplier.s_comment, "%Customer%Complaints%", 92) - │ └─TableFullScan_64 500000.00 cop[tikv] table:supplier keep order:false - └─IndexMergeJoin_38(Probe) 4829985.30 root inner join, inner:IndexReader_36, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey - ├─TableReader_59(Build) 1200618.43 root data:Selection_58 - │ └─Selection_58 1200618.43 cop[tikv] in(tpch.part.p_size, 48, 19, 12, 4, 41, 7, 21, 39), ne(tpch.part.p_brand, "Brand#34"), not(like(tpch.part.p_type, "LARGE BRUSHED%", 92)) - │ └─TableFullScan_57 10000000.00 cop[tikv] table:part keep order:false - └─IndexReader_36(Probe) 4.02 root index:IndexRangeScan_35 - └─IndexRangeScan_35 4.02 cop[tikv] table:partsupp, index:PRIMARY(PS_PARTKEY, PS_SUPPKEY) range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:true +Sort 14.41 root Column#23:desc, tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size +└─Projection 14.41 root tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size, Column#23 + └─HashAgg 14.41 root group by:tpch.part.p_brand, tpch.part.p_size, tpch.part.p_type, funcs:count(distinct tpch.partsupp.ps_suppkey)->Column#23, funcs:firstrow(tpch.part.p_brand)->tpch.part.p_brand, funcs:firstrow(tpch.part.p_type)->tpch.part.p_type, funcs:firstrow(tpch.part.p_size)->tpch.part.p_size + └─HashJoin 3863988.24 root anti semi join, equal:[eq(tpch.partsupp.ps_suppkey, tpch.supplier.s_suppkey)] + ├─TableReader(Build) 400000.00 root data:Selection + │ └─Selection 400000.00 cop[tikv] like(tpch.supplier.s_comment, "%Customer%Complaints%", 92) + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─Projection(Probe) 4829985.30 root tpch.partsupp.ps_suppkey, tpch.part.p_brand, tpch.part.p_type, tpch.part.p_size + └─IndexHashJoin 4829985.30 root inner join, inner:IndexReader, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey, equal cond:eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) + ├─TableReader(Build) 1200618.43 root data:Selection + │ └─Selection 1200618.43 cop[tikv] in(tpch.part.p_size, 48, 19, 12, 4, 41, 7, 21, 39), ne(tpch.part.p_brand, "Brand#34"), not(like(tpch.part.p_type, "LARGE BRUSHED%", 92)) + │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + └─IndexReader(Probe) 4.02 root index:IndexRangeScan + └─IndexRangeScan 4.02 cop[tikv] table:partsupp, index:PRIMARY(PS_PARTKEY, PS_SUPPKEY) range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:false /* Q17 Small-Quantity-Order Revenue Query This query determines how much average yearly revenue would be lost if orders were no longer filled for small @@ -949,7 +957,7 @@ What would be the average yearly gross (undiscounted) loss in revenue if orders of less than 20% of this average were no longer taken? Planner enahancement: aggregation pull up through join. */ -explain +explain format = 'brief' select sum(l_extendedprice) / 7.0 as avg_yearly from @@ -968,19 +976,19 @@ where l_partkey = p_partkey ); id estRows task access object operator info -Projection_16 1.00 root div(Column#46, 7.0)->Column#47 -└─StreamAgg_21 1.00 root funcs:sum(tpch.lineitem.l_extendedprice)->Column#46 - └─HashJoin_53 293773.83 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)], other cond:lt(tpch.lineitem.l_quantity, mul(0.2, Column#44)) - ├─HashJoin_37(Build) 293773.83 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)] - │ ├─TableReader_42(Build) 9736.49 root data:Selection_41 - │ │ └─Selection_41 9736.49 cop[tikv] eq(tpch.part.p_brand, "Brand#44"), eq(tpch.part.p_container, "WRAP PKG") - │ │ └─TableFullScan_40 10000000.00 cop[tikv] table:part keep order:false - │ └─TableReader_39(Probe) 300005811.00 root data:TableFullScan_38 - │ └─TableFullScan_38 300005811.00 cop[tikv] table:lineitem keep order:false - └─HashAgg_47(Probe) 9943040.00 root group by:tpch.lineitem.l_partkey, funcs:avg(Column#50, Column#51)->Column#44, funcs:firstrow(tpch.lineitem.l_partkey)->tpch.lineitem.l_partkey - └─TableReader_48 9943040.00 root data:HashAgg_43 - └─HashAgg_43 9943040.00 cop[tikv] group by:tpch.lineitem.l_partkey, funcs:count(tpch.lineitem.l_quantity)->Column#50, funcs:sum(tpch.lineitem.l_quantity)->Column#51 - └─TableFullScan_46 300005811.00 cop[tikv] table:lineitem keep order:false +Projection 1.00 root div(Column#46, 7.0)->Column#47 +└─StreamAgg 1.00 root funcs:sum(tpch.lineitem.l_extendedprice)->Column#46 + └─HashJoin 293773.83 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)], other cond:lt(tpch.lineitem.l_quantity, mul(0.2, Column#44)) + ├─HashJoin(Build) 293773.83 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)] + │ ├─TableReader(Build) 9736.49 root data:Selection + │ │ └─Selection 9736.49 cop[tikv] eq(tpch.part.p_brand, "Brand#44"), eq(tpch.part.p_container, "WRAP PKG") + │ │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + │ └─TableReader(Probe) 300005811.00 root data:TableFullScan + │ └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false + └─HashAgg(Probe) 9943040.00 root group by:tpch.lineitem.l_partkey, funcs:avg(Column#50, Column#51)->Column#44, funcs:firstrow(tpch.lineitem.l_partkey)->tpch.lineitem.l_partkey + └─TableReader 9943040.00 root data:HashAgg + └─HashAgg 9943040.00 cop[tikv] group by:tpch.lineitem.l_partkey, funcs:count(tpch.lineitem.l_quantity)->Column#50, funcs:sum(tpch.lineitem.l_quantity)->Column#51 + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q18 Large Volume Customer Query The Large Volume Customer Query ranks customers based on their having placed a large quantity order. Large @@ -989,7 +997,7 @@ The Large Volume Customer Query finds a list of the top 100 customers who have e The query lists the customer name, customer key, the order key, date and total price and the quantity for the order. Planner enhancement: cost estimation is not so good, join reorder. The inner subquery's result is only 300+ rows. */ -explain +explain format = 'brief' select c_name, c_custkey, @@ -1024,23 +1032,23 @@ o_totalprice desc, o_orderdate limit 100; id estRows task access object operator info -Projection_24 100.00 root tpch.customer.c_name, tpch.customer.c_custkey, tpch.orders.o_orderkey, tpch.orders.o_orderdate, tpch.orders.o_totalprice, Column#54 -└─TopN_27 100.00 root tpch.orders.o_totalprice:desc, tpch.orders.o_orderdate, offset:0, count:100 - └─HashAgg_33 59251097.60 root group by:tpch.customer.c_custkey, tpch.customer.c_name, tpch.orders.o_orderdate, tpch.orders.o_orderkey, tpch.orders.o_totalprice, funcs:sum(tpch.lineitem.l_quantity)->Column#54, funcs:firstrow(tpch.customer.c_custkey)->tpch.customer.c_custkey, funcs:firstrow(tpch.customer.c_name)->tpch.customer.c_name, funcs:firstrow(tpch.orders.o_orderkey)->tpch.orders.o_orderkey, funcs:firstrow(tpch.orders.o_totalprice)->tpch.orders.o_totalprice, funcs:firstrow(tpch.orders.o_orderdate)->tpch.orders.o_orderdate - └─HashJoin_48 240004648.80 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] - ├─HashJoin_72(Build) 59251097.60 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] - │ ├─Selection_89(Build) 59251097.60 root gt(Column#52, 314) - │ │ └─HashAgg_96 74063872.00 root group by:tpch.lineitem.l_orderkey, funcs:sum(Column#66)->Column#52, funcs:firstrow(tpch.lineitem.l_orderkey)->tpch.lineitem.l_orderkey - │ │ └─TableReader_97 74063872.00 root data:HashAgg_90 - │ │ └─HashAgg_90 74063872.00 cop[tikv] group by:tpch.lineitem.l_orderkey, funcs:sum(tpch.lineitem.l_quantity)->Column#66 - │ │ └─TableFullScan_95 300005811.00 cop[tikv] table:lineitem keep order:false - │ └─HashJoin_84(Probe) 75000000.00 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - │ ├─TableReader_88(Build) 7500000.00 root data:TableFullScan_87 - │ │ └─TableFullScan_87 7500000.00 cop[tikv] table:customer keep order:false - │ └─TableReader_86(Probe) 75000000.00 root data:TableFullScan_85 - │ └─TableFullScan_85 75000000.00 cop[tikv] table:orders keep order:false - └─TableReader_101(Probe) 300005811.00 root data:TableFullScan_100 - └─TableFullScan_100 300005811.00 cop[tikv] table:lineitem keep order:false +Projection 100.00 root tpch.customer.c_name, tpch.customer.c_custkey, tpch.orders.o_orderkey, tpch.orders.o_orderdate, tpch.orders.o_totalprice, Column#54 +└─TopN 100.00 root tpch.orders.o_totalprice:desc, tpch.orders.o_orderdate, offset:0, count:100 + └─HashAgg 59251097.60 root group by:tpch.customer.c_custkey, tpch.customer.c_name, tpch.orders.o_orderdate, tpch.orders.o_orderkey, tpch.orders.o_totalprice, funcs:sum(tpch.lineitem.l_quantity)->Column#54, funcs:firstrow(tpch.customer.c_custkey)->tpch.customer.c_custkey, funcs:firstrow(tpch.customer.c_name)->tpch.customer.c_name, funcs:firstrow(tpch.orders.o_orderkey)->tpch.orders.o_orderkey, funcs:firstrow(tpch.orders.o_totalprice)->tpch.orders.o_totalprice, funcs:firstrow(tpch.orders.o_orderdate)->tpch.orders.o_orderdate + └─HashJoin 240004648.80 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] + ├─HashJoin(Build) 59251097.60 root inner join, equal:[eq(tpch.orders.o_orderkey, tpch.lineitem.l_orderkey)] + │ ├─Selection(Build) 59251097.60 root gt(Column#52, 314) + │ │ └─HashAgg 74063872.00 root group by:tpch.lineitem.l_orderkey, funcs:sum(Column#66)->Column#52, funcs:firstrow(tpch.lineitem.l_orderkey)->tpch.lineitem.l_orderkey + │ │ └─TableReader 74063872.00 root data:HashAgg + │ │ └─HashAgg 74063872.00 cop[tikv] group by:tpch.lineitem.l_orderkey, funcs:sum(tpch.lineitem.l_quantity)->Column#66 + │ │ └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false + │ └─HashJoin(Probe) 75000000.00 root inner join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + │ ├─TableReader(Build) 7500000.00 root data:TableFullScan + │ │ └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false + │ └─TableReader(Probe) 75000000.00 root data:TableFullScan + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─TableReader(Probe) 300005811.00 root data:TableFullScan + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q19 Discounted Revenue Query The Discounted Revenue Query reports the gross discounted revenue attributed to the sale of selected parts handled @@ -1050,7 +1058,7 @@ The Discounted Revenue query finds the gross discounted revenue for all orders f that were shipped by air and delivered in person. Parts are selected based on the combination of specific brands, a list of containers, and a range of sizes. */ -explain +explain format = 'brief' select sum(l_extendedprice* (1 - l_discount)) as revenue from @@ -1087,15 +1095,15 @@ and l_shipmode in ('AIR', 'AIR REG') and l_shipinstruct = 'DELIVER IN PERSON' ); id estRows task access object operator info -StreamAgg_13 1.00 root funcs:sum(Column#28)->Column#27 -└─Projection_46 733887.82 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#28 - └─HashJoin_45 733887.82 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)], other cond:or(and(and(eq(tpch.part.p_brand, "Brand#52"), in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG")), and(ge(tpch.lineitem.l_quantity, 4), and(le(tpch.lineitem.l_quantity, 14), le(tpch.part.p_size, 5)))), or(and(and(eq(tpch.part.p_brand, "Brand#11"), in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK")), and(ge(tpch.lineitem.l_quantity, 18), and(le(tpch.lineitem.l_quantity, 28), le(tpch.part.p_size, 10)))), and(and(eq(tpch.part.p_brand, "Brand#51"), in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG")), and(ge(tpch.lineitem.l_quantity, 29), and(le(tpch.lineitem.l_quantity, 39), le(tpch.part.p_size, 15)))))) - ├─TableReader_32(Build) 24323.12 root data:Selection_31 - │ └─Selection_31 24323.12 cop[tikv] ge(tpch.part.p_size, 1), or(and(eq(tpch.part.p_brand, "Brand#52"), and(in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG"), le(tpch.part.p_size, 5))), or(and(eq(tpch.part.p_brand, "Brand#11"), and(in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK"), le(tpch.part.p_size, 10))), and(eq(tpch.part.p_brand, "Brand#51"), and(in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG"), le(tpch.part.p_size, 15))))) - │ └─TableFullScan_30 10000000.00 cop[tikv] table:part keep order:false - └─TableReader_29(Probe) 6286493.79 root data:Selection_28 - └─Selection_28 6286493.79 cop[tikv] eq(tpch.lineitem.l_shipinstruct, "DELIVER IN PERSON"), in(tpch.lineitem.l_shipmode, "AIR", "AIR REG"), or(and(ge(tpch.lineitem.l_quantity, 4), le(tpch.lineitem.l_quantity, 14)), or(and(ge(tpch.lineitem.l_quantity, 18), le(tpch.lineitem.l_quantity, 28)), and(ge(tpch.lineitem.l_quantity, 29), le(tpch.lineitem.l_quantity, 39)))) - └─TableFullScan_27 300005811.00 cop[tikv] table:lineitem keep order:false +StreamAgg 1.00 root funcs:sum(Column#28)->Column#27 +└─Projection 733887.82 root mul(tpch.lineitem.l_extendedprice, minus(1, tpch.lineitem.l_discount))->Column#28 + └─HashJoin 733887.82 root inner join, equal:[eq(tpch.part.p_partkey, tpch.lineitem.l_partkey)], other cond:or(and(and(eq(tpch.part.p_brand, "Brand#52"), in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG")), and(ge(tpch.lineitem.l_quantity, 4), and(le(tpch.lineitem.l_quantity, 14), le(tpch.part.p_size, 5)))), or(and(and(eq(tpch.part.p_brand, "Brand#11"), in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK")), and(ge(tpch.lineitem.l_quantity, 18), and(le(tpch.lineitem.l_quantity, 28), le(tpch.part.p_size, 10)))), and(and(eq(tpch.part.p_brand, "Brand#51"), in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG")), and(ge(tpch.lineitem.l_quantity, 29), and(le(tpch.lineitem.l_quantity, 39), le(tpch.part.p_size, 15)))))) + ├─TableReader(Build) 24323.12 root data:Selection + │ └─Selection 24323.12 cop[tikv] ge(tpch.part.p_size, 1), or(and(eq(tpch.part.p_brand, "Brand#52"), and(in(tpch.part.p_container, "SM CASE", "SM BOX", "SM PACK", "SM PKG"), le(tpch.part.p_size, 5))), or(and(eq(tpch.part.p_brand, "Brand#11"), and(in(tpch.part.p_container, "MED BAG", "MED BOX", "MED PKG", "MED PACK"), le(tpch.part.p_size, 10))), and(eq(tpch.part.p_brand, "Brand#51"), and(in(tpch.part.p_container, "LG CASE", "LG BOX", "LG PACK", "LG PKG"), le(tpch.part.p_size, 15))))) + │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + └─TableReader(Probe) 6286493.79 root data:Selection + └─Selection 6286493.79 cop[tikv] eq(tpch.lineitem.l_shipinstruct, "DELIVER IN PERSON"), in(tpch.lineitem.l_shipmode, "AIR", "AIR REG"), or(and(ge(tpch.lineitem.l_quantity, 4), le(tpch.lineitem.l_quantity, 14)), or(and(ge(tpch.lineitem.l_quantity, 18), le(tpch.lineitem.l_quantity, 28)), and(ge(tpch.lineitem.l_quantity, 29), le(tpch.lineitem.l_quantity, 39)))) + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q20 Potential Part Promotion Query The Potential Part Promotion Query identifies suppliers in a particular nation having selected parts that may be candidates @@ -1104,7 +1112,7 @@ The Potential Part Promotion query identifies suppliers who have an excess of a defined to be more than 50% of the parts like the given part that the supplier shipped in a given year for a given nation. Only parts whose names share a certain naming convention are considered. */ -explain +explain format = 'brief' select s_name, s_address @@ -1143,29 +1151,29 @@ and n_name = 'ALGERIA' order by s_name; id estRows task access object operator info -Sort_28 20000.00 root tpch.supplier.s_name -└─HashJoin_32 20000.00 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] - ├─HashJoin_45(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ ├─TableReader_50(Build) 1.00 root data:Selection_49 - │ │ └─Selection_49 1.00 cop[tikv] eq(tpch.nation.n_name, "ALGERIA") - │ │ └─TableFullScan_48 25.00 cop[tikv] table:nation keep order:false - │ └─TableReader_47(Probe) 500000.00 root data:TableFullScan_46 - │ └─TableFullScan_46 500000.00 cop[tikv] table:supplier keep order:false - └─HashAgg_53(Probe) 257492.04 root group by:tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey - └─Projection_54 257492.04 root tpch.partsupp.ps_suppkey - └─Selection_55 257492.04 root gt(cast(tpch.partsupp.ps_availqty), mul(0.5, Column#44)) - └─HashAgg_58 321865.05 root group by:tpch.partsupp.ps_partkey, tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_availqty)->tpch.partsupp.ps_availqty, funcs:sum(tpch.lineitem.l_quantity)->Column#44 - └─HashJoin_62 9711455.06 root left outer join, equal:[eq(tpch.partsupp.ps_partkey, tpch.lineitem.l_partkey) eq(tpch.partsupp.ps_suppkey, tpch.lineitem.l_suppkey)] - ├─IndexHashJoin_69(Build) 321865.05 root inner join, inner:IndexLookUp_66, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey - │ ├─TableReader_98(Build) 80007.93 root data:Selection_97 - │ │ └─Selection_97 80007.93 cop[tikv] like(tpch.part.p_name, "green%", 92) - │ │ └─TableFullScan_96 10000000.00 cop[tikv] table:part keep order:false - │ └─IndexLookUp_66(Probe) 4.02 root - │ ├─IndexRangeScan_64(Build) 4.02 cop[tikv] table:partsupp, index:PRIMARY(PS_PARTKEY, PS_SUPPKEY) range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:false - │ └─TableRowIDScan_65(Probe) 4.02 cop[tikv] table:partsupp keep order:false - └─TableReader_103(Probe) 44189356.65 root data:Selection_102 - └─Selection_102 44189356.65 cop[tikv] ge(tpch.lineitem.l_shipdate, 1993-01-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1994-01-01) - └─TableFullScan_101 300005811.00 cop[tikv] table:lineitem keep order:false +Sort 20000.00 root tpch.supplier.s_name +└─HashJoin 20000.00 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.partsupp.ps_suppkey)] + ├─HashJoin(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ ├─TableReader(Build) 1.00 root data:Selection + │ │ └─Selection 1.00 cop[tikv] eq(tpch.nation.n_name, "ALGERIA") + │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + └─HashAgg(Probe) 257492.04 root group by:tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey + └─Projection 257492.04 root tpch.partsupp.ps_suppkey + └─Selection 257492.04 root gt(cast(tpch.partsupp.ps_availqty), mul(0.5, Column#44)) + └─HashAgg 321865.05 root group by:tpch.partsupp.ps_partkey, tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_suppkey)->tpch.partsupp.ps_suppkey, funcs:firstrow(tpch.partsupp.ps_availqty)->tpch.partsupp.ps_availqty, funcs:sum(tpch.lineitem.l_quantity)->Column#44 + └─HashJoin 9711455.06 root left outer join, equal:[eq(tpch.partsupp.ps_partkey, tpch.lineitem.l_partkey) eq(tpch.partsupp.ps_suppkey, tpch.lineitem.l_suppkey)] + ├─IndexHashJoin(Build) 321865.05 root inner join, inner:IndexLookUp, outer key:tpch.part.p_partkey, inner key:tpch.partsupp.ps_partkey, equal cond:eq(tpch.part.p_partkey, tpch.partsupp.ps_partkey) + │ ├─TableReader(Build) 80007.93 root data:Selection + │ │ └─Selection 80007.93 cop[tikv] like(tpch.part.p_name, "green%", 92) + │ │ └─TableFullScan 10000000.00 cop[tikv] table:part keep order:false + │ └─IndexLookUp(Probe) 4.02 root + │ ├─IndexRangeScan(Build) 4.02 cop[tikv] table:partsupp, index:PRIMARY(PS_PARTKEY, PS_SUPPKEY) range: decided by [eq(tpch.partsupp.ps_partkey, tpch.part.p_partkey)], keep order:false + │ └─TableRowIDScan(Probe) 4.02 cop[tikv] table:partsupp keep order:false + └─TableReader(Probe) 44189356.65 root data:Selection + └─Selection 44189356.65 cop[tikv] ge(tpch.lineitem.l_shipdate, 1993-01-01 00:00:00.000000), lt(tpch.lineitem.l_shipdate, 1994-01-01) + └─TableFullScan 300005811.00 cop[tikv] table:lineitem keep order:false /* Q21 Suppliers Who Kept Orders Waiting Query This query identifies certain suppliers who were not able to ship required parts in a timely manner. @@ -1173,7 +1181,7 @@ The Suppliers Who Kept Orders Waiting query identifies suppliers, for a given na multi-supplier order (with current status of 'F') where they were the only supplier who failed to meet the committed delivery date. */ -explain +explain format = 'brief' select s_name, count(*) as numwait @@ -1215,32 +1223,32 @@ numwait desc, s_name limit 100; id estRows task access object operator info -Projection_25 100.00 root tpch.supplier.s_name, Column#72 -└─TopN_28 100.00 root Column#72:desc, tpch.supplier.s_name, offset:0, count:100 - └─HashAgg_34 12800.00 root group by:tpch.supplier.s_name, funcs:count(1)->Column#72, funcs:firstrow(tpch.supplier.s_name)->tpch.supplier.s_name - └─IndexHashJoin_42 7828961.66 root anti semi join, inner:IndexLookUp_39, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey) - ├─IndexHashJoin_82(Build) 9786202.08 root semi join, inner:IndexLookUp_79, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey), ne(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey) - │ ├─IndexMergeJoin_101(Build) 12232752.60 root inner join, inner:TableReader_96, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey - │ │ ├─HashJoin_105(Build) 12232752.60 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] - │ │ │ ├─HashJoin_118(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] - │ │ │ │ ├─TableReader_123(Build) 1.00 root data:Selection_122 - │ │ │ │ │ └─Selection_122 1.00 cop[tikv] eq(tpch.nation.n_name, "EGYPT") - │ │ │ │ │ └─TableFullScan_121 25.00 cop[tikv] table:nation keep order:false - │ │ │ │ └─TableReader_120(Probe) 500000.00 root data:TableFullScan_119 - │ │ │ │ └─TableFullScan_119 500000.00 cop[tikv] table:supplier keep order:false - │ │ │ └─TableReader_126(Probe) 240004648.80 root data:Selection_125 - │ │ │ └─Selection_125 240004648.80 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) - │ │ │ └─TableFullScan_124 300005811.00 cop[tikv] table:l1 keep order:false - │ │ └─TableReader_96(Probe) 0.49 root data:Selection_95 - │ │ └─Selection_95 0.49 cop[tikv] eq(tpch.orders.o_orderstatus, "F") - │ │ └─TableRangeScan_94 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:true - │ └─IndexLookUp_79(Probe) 4.05 root - │ ├─IndexRangeScan_77(Build) 4.05 cop[tikv] table:l2, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false - │ └─TableRowIDScan_78(Probe) 4.05 cop[tikv] table:l2 keep order:false - └─IndexLookUp_39(Probe) 4.05 root - ├─IndexRangeScan_36(Build) 5.06 cop[tikv] table:l3, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false - └─Selection_38(Probe) 4.05 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) - └─TableRowIDScan_37 5.06 cop[tikv] table:l3 keep order:false +Projection 100.00 root tpch.supplier.s_name, Column#72 +└─TopN 100.00 root Column#72:desc, tpch.supplier.s_name, offset:0, count:100 + └─HashAgg 12800.00 root group by:tpch.supplier.s_name, funcs:count(1)->Column#72, funcs:firstrow(tpch.supplier.s_name)->tpch.supplier.s_name + └─IndexHashJoin 7828961.66 root anti semi join, inner:IndexLookUp, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, equal cond:eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey), other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey) + ├─IndexHashJoin(Build) 9786202.08 root semi join, inner:IndexLookUp, outer key:tpch.lineitem.l_orderkey, inner key:tpch.lineitem.l_orderkey, equal cond:eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey), other cond:ne(tpch.lineitem.l_suppkey, tpch.lineitem.l_suppkey), ne(tpch.lineitem.l_suppkey, tpch.supplier.s_suppkey) + │ ├─IndexJoin(Build) 12232752.60 root inner join, inner:TableReader, outer key:tpch.lineitem.l_orderkey, inner key:tpch.orders.o_orderkey, equal cond:eq(tpch.lineitem.l_orderkey, tpch.orders.o_orderkey) + │ │ ├─HashJoin(Build) 12232752.60 root inner join, equal:[eq(tpch.supplier.s_suppkey, tpch.lineitem.l_suppkey)] + │ │ │ ├─HashJoin(Build) 20000.00 root inner join, equal:[eq(tpch.nation.n_nationkey, tpch.supplier.s_nationkey)] + │ │ │ │ ├─TableReader(Build) 1.00 root data:Selection + │ │ │ │ │ └─Selection 1.00 cop[tikv] eq(tpch.nation.n_name, "EGYPT") + │ │ │ │ │ └─TableFullScan 25.00 cop[tikv] table:nation keep order:false + │ │ │ │ └─TableReader(Probe) 500000.00 root data:TableFullScan + │ │ │ │ └─TableFullScan 500000.00 cop[tikv] table:supplier keep order:false + │ │ │ └─TableReader(Probe) 240004648.80 root data:Selection + │ │ │ └─Selection 240004648.80 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) + │ │ │ └─TableFullScan 300005811.00 cop[tikv] table:l1 keep order:false + │ │ └─TableReader(Probe) 0.49 root data:Selection + │ │ └─Selection 0.49 cop[tikv] eq(tpch.orders.o_orderstatus, "F") + │ │ └─TableRangeScan 1.00 cop[tikv] table:orders range: decided by [tpch.lineitem.l_orderkey], keep order:false + │ └─IndexLookUp(Probe) 4.05 root + │ ├─IndexRangeScan(Build) 4.05 cop[tikv] table:l2, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false + │ └─TableRowIDScan(Probe) 4.05 cop[tikv] table:l2 keep order:false + └─IndexLookUp(Probe) 4.05 root + ├─IndexRangeScan(Build) 5.06 cop[tikv] table:l3, index:PRIMARY(L_ORDERKEY, L_LINENUMBER) range: decided by [eq(tpch.lineitem.l_orderkey, tpch.lineitem.l_orderkey)], keep order:false + └─Selection(Probe) 4.05 cop[tikv] gt(tpch.lineitem.l_receiptdate, tpch.lineitem.l_commitdate) + └─TableRowIDScan 5.06 cop[tikv] table:l3 keep order:false /* Q22 Global Sales Opportunity Query The Global Sales Opportunity Query identifies geographies where there are customers who may be likely to make a @@ -1249,7 +1257,7 @@ This query counts how many customers within a specific range of country codes ha but who have a greater than average “positive” account balance. It also reflects the magnitude of that balance. Country code is defined as the first two characters of c_phone. */ -explain +explain format = 'brief' select cntrycode, count(*) as numcust, @@ -1288,14 +1296,14 @@ cntrycode order by cntrycode; id estRows task access object operator info -Sort_39 1.00 root Column#27 -└─Projection_41 1.00 root Column#27, Column#28, Column#29 - └─HashAgg_44 1.00 root group by:Column#27, funcs:count(1)->Column#28, funcs:sum(tpch.customer.c_acctbal)->Column#29, funcs:firstrow(Column#27)->Column#27 - └─Projection_45 0.00 root substring(tpch.customer.c_phone, 1, 2)->Column#27, tpch.customer.c_acctbal - └─HashJoin_46 0.00 root anti semi join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] - ├─TableReader_52(Build) 75000000.00 root data:TableFullScan_51 - │ └─TableFullScan_51 75000000.00 cop[tikv] table:orders keep order:false - └─Selection_50(Probe) 0.00 root in(substring(tpch.customer.c_phone, 1, 2), "20", "40", "22", "30", "39", "42", "21") - └─TableReader_49 0.00 root data:Selection_48 - └─Selection_48 0.00 cop[tikv] gt(tpch.customer.c_acctbal, NULL) - └─TableFullScan_47 7500000.00 cop[tikv] table:customer keep order:false +Sort 1.00 root Column#27 +└─Projection 1.00 root Column#27, Column#28, Column#29 + └─HashAgg 1.00 root group by:Column#27, funcs:count(1)->Column#28, funcs:sum(tpch.customer.c_acctbal)->Column#29, funcs:firstrow(Column#27)->Column#27 + └─Projection 0.00 root substring(tpch.customer.c_phone, 1, 2)->Column#27, tpch.customer.c_acctbal + └─HashJoin 0.00 root anti semi join, equal:[eq(tpch.customer.c_custkey, tpch.orders.o_custkey)] + ├─TableReader(Build) 75000000.00 root data:TableFullScan + │ └─TableFullScan 75000000.00 cop[tikv] table:orders keep order:false + └─Selection(Probe) 0.00 root in(substring(tpch.customer.c_phone, 1, 2), "20", "40", "22", "30", "39", "42", "21") + └─TableReader 0.00 root data:Selection + └─Selection 0.00 cop[tikv] gt(tpch.customer.c_acctbal, NULL) + └─TableFullScan 7500000.00 cop[tikv] table:customer keep order:false diff --git a/cmd/explaintest/r/window_function.result b/cmd/explaintest/r/window_function.result index ee2ce0f91b6f1..6c92b63dcd0d3 100644 --- a/cmd/explaintest/r/window_function.result +++ b/cmd/explaintest/r/window_function.result @@ -3,124 +3,124 @@ drop table if exists t; create table t (a int, b int, c timestamp, index idx(a)); set @@tidb_enable_window_function = 1; set @@session.tidb_window_concurrency = 1; -explain select sum(a) over() from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over() - └─IndexReader_12 10000.00 root index:IndexFullScan_11 - └─IndexFullScan_11 10000.00 cop[tikv] table:t, index:idx(a) keep order:false, stats:pseudo -explain select sum(a) over(partition by a) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a) - └─IndexReader_10 10000.00 root index:IndexFullScan_9 - └─IndexFullScan_9 10000.00 cop[tikv] table:t, index:idx(a) keep order:true, stats:pseudo -explain select sum(a) over(partition by a order by b) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between unbounded preceding and current row) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b rows unbounded preceding) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between unbounded preceding and current row) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between 1 preceding and 1 following) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between 1 preceding and 1 following) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.c range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) - └─Sort_11 10000.00 root test.t.a, test.t.c - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over() from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over() + └─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a) keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a) + └─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a) keep order:true, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between unbounded preceding and current row) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b rows unbounded preceding) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between unbounded preceding and current row) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between 1 preceding and 1 following) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between 1 preceding and 1 following) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.c range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) + └─Sort 10000.00 root test.t.a, test.t.c + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo set @@session.tidb_window_concurrency = 4; -explain select sum(a) over() from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over() - └─IndexReader_12 10000.00 root index:IndexFullScan_11 - └─IndexFullScan_11 10000.00 cop[tikv] table:t, index:idx(a) keep order:false, stats:pseudo -explain select sum(a) over(partition by a) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a) - └─IndexReader_10 10000.00 root index:IndexFullScan_9 - └─IndexFullScan_9 10000.00 cop[tikv] table:t, index:idx(a) keep order:true, stats:pseudo -explain select sum(a) over(partition by a order by b) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Shuffle_12 10000.00 root execution info: concurrency:4, data source:TableReader_10 - └─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between unbounded preceding and current row) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b rows unbounded preceding) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Shuffle_12 10000.00 root execution info: concurrency:4, data source:TableReader_10 - └─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between unbounded preceding and current row) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Shuffle_12 10000.00 root execution info: concurrency:4, data source:TableReader_10 - └─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between 1 preceding and 1 following) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Shuffle_12 10000.00 root execution info: concurrency:4, data source:TableReader_10 - └─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between 1 preceding and 1 following) - └─Sort_11 10000.00 root test.t.a, test.t.b - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo -explain select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; -id estRows task access object operator info -Projection_7 10000.00 root Column#6 -└─Shuffle_12 10000.00 root execution info: concurrency:4, data source:TableReader_10 - └─Window_8 10000.00 root sum(cast(test.t.a, decimal(65,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.c range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) - └─Sort_11 10000.00 root test.t.a, test.t.c - └─TableReader_10 10000.00 root data:TableFullScan_9 - └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over() from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over() + └─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a) keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a) + └─IndexReader 10000.00 root index:IndexFullScan + └─IndexFullScan 10000.00 cop[tikv] table:t, index:idx(a) keep order:true, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Shuffle 10000.00 root execution info: concurrency:4, data sources:[TableReader] + └─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between unbounded preceding and current row) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b rows unbounded preceding) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Shuffle 10000.00 root execution info: concurrency:4, data sources:[TableReader] + └─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between unbounded preceding and current row) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Shuffle 10000.00 root execution info: concurrency:4, data sources:[TableReader] + └─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b rows between 1 preceding and 1 following) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Shuffle 10000.00 root execution info: concurrency:4, data sources:[TableReader] + └─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.b range between 1 preceding and 1 following) + └─Sort 10000.00 root test.t.a, test.t.b + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo +explain format = 'brief' select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; +id estRows task access object operator info +Projection 10000.00 root Column#6 +└─Shuffle 10000.00 root execution info: concurrency:4, data sources:[TableReader] + └─Window 10000.00 root sum(cast(test.t.a, decimal(32,0) BINARY))->Column#6 over(partition by test.t.a order by test.t.c range between interval "2:30" "MINUTE_SECOND" preceding and interval "2:30" "MINUTE_SECOND" following) + └─Sort 10000.00 root test.t.a, test.t.c + └─TableReader 10000.00 root data:TableFullScan + └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo drop table if exists t1; create table t1(a int primary key, b int); insert into t1 values(1, 1), (2, 1); analyze table t1; -explain select sum(a) over(partition by b) from t1; +explain format = 'brief' select sum(a) over(partition by b) from t1; id estRows task access object operator info -Projection_7 2.00 root Column#4 -└─Window_8 2.00 root sum(cast(test.t1.a, decimal(65,0) BINARY))->Column#4 over(partition by test.t1.b) - └─Sort_11 2.00 root test.t1.b - └─TableReader_10 2.00 root data:TableFullScan_9 - └─TableFullScan_9 2.00 cop[tikv] table:t1 keep order:false +Projection 2.00 root Column#4 +└─Window 2.00 root sum(cast(test.t1.a, decimal(32,0) BINARY))->Column#4 over(partition by test.t1.b) + └─Sort 2.00 root test.t1.b + └─TableReader 2.00 root data:TableFullScan + └─TableFullScan 2.00 cop[tikv] table:t1 keep order:false insert into t1 values(3, 3); analyze table t1; -explain select sum(a) over(partition by b) from t1; -id estRows task access object operator info -Projection_7 3.00 root Column#4 -└─Shuffle_12 3.00 root execution info: concurrency:2, data source:TableReader_10 - └─Window_8 3.00 root sum(cast(test.t1.a, decimal(65,0) BINARY))->Column#4 over(partition by test.t1.b) - └─Sort_11 3.00 root test.t1.b - └─TableReader_10 3.00 root data:TableFullScan_9 - └─TableFullScan_9 3.00 cop[tikv] table:t1 keep order:false +explain format = 'brief' select sum(a) over(partition by b) from t1; +id estRows task access object operator info +Projection 3.00 root Column#4 +└─Shuffle 3.00 root execution info: concurrency:2, data sources:[TableReader] + └─Window 3.00 root sum(cast(test.t1.a, decimal(32,0) BINARY))->Column#4 over(partition by test.t1.b) + └─Sort 3.00 root test.t1.b + └─TableReader 3.00 root data:TableFullScan + └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false diff --git a/cmd/explaintest/run-tests.sh b/cmd/explaintest/run-tests.sh index b614a9ced73f3..56cad85d32898 100755 --- a/cmd/explaintest/run-tests.sh +++ b/cmd/explaintest/run-tests.sh @@ -26,6 +26,7 @@ record=0 record_case="" create=0 create_case="" +stats="s" set -eu trap 'set +e; PIDS=$(jobs -p); [ -n "$PIDS" ] && kill -9 $PIDS' EXIT @@ -94,6 +95,13 @@ function build_explain_test() GO111MODULE=on go build -o $explain_test } +function extract_stats() +{ + echo "extracting statistics: $stats" + rm -rf $stats + unzip -qq s.zip +} + while getopts "t:s:r:b:c:i:h:p" opt; do case $opt in t) @@ -141,6 +149,8 @@ while getopts "t:s:r:b:c:i:h:p" opt; do esac done +extract_stats + if [ $build -eq 1 ]; then if [ -z "$tidb_server" ]; then build_tidb_server @@ -208,7 +218,7 @@ if [ "${TIDB_TEST_STORE_NAME}" = "tikv" ]; then $tidb_server -P "$port" -status "$status" -config config.toml -store tikv -path "${TIKV_PATH}" > $explain_test_log 2>&1 & SERVER_PID=$! else - $tidb_server -P "$port" -status "$status" -config config.toml -store mocktikv -path "" > $explain_test_log 2>&1 & + $tidb_server -P "$port" -status "$status" -config config.toml -store unistore -path "" > $explain_test_log 2>&1 & SERVER_PID=$! fi echo "tidb-server(PID: $SERVER_PID) started" diff --git a/cmd/explaintest/s.zip b/cmd/explaintest/s.zip new file mode 100644 index 0000000000000..c3f94fe26af69 Binary files /dev/null and b/cmd/explaintest/s.zip differ diff --git a/cmd/explaintest/s/explain_complex_stats_dd.json b/cmd/explaintest/s/explain_complex_stats_dd.json deleted file mode 100644 index 9c32a16063cee..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_dd.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"dd","columns":{"aid":{"histogram":{"ndv":1994,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MTU=","repeats":1},{"count":13,"lower_bound":"MTg=","upper_bound":"MUI=","repeats":1},{"count":19,"lower_bound":"MUU=","upper_bound":"MUo=","repeats":1},{"count":25,"lower_bound":"MU0=","upper_bound":"MVA=","repeats":1},{"count":31,"lower_bound":"MVM=","upper_bound":"MVU=","repeats":1},{"count":37,"lower_bound":"MWM=","upper_bound":"MWY=","repeats":1},{"count":43,"lower_bound":"MWc=","upper_bound":"MWo=","repeats":1},{"count":49,"lower_bound":"MWs=","upper_bound":"MW8=","repeats":1},{"count":55,"lower_bound":"MXA=","upper_bound":"MXk=","repeats":1},{"count":61,"lower_bound":"MXo=","upper_bound":"MjU=","repeats":1},{"count":67,"lower_bound":"Mjg=","upper_bound":"MkM=","repeats":1},{"count":75,"lower_bound":"MkU=","upper_bound":"Mkk=","repeats":1},{"count":83,"lower_bound":"Mko=","upper_bound":"MlM=","repeats":1},{"count":91,"lower_bound":"MlQ=","upper_bound":"Mlg=","repeats":1},{"count":99,"lower_bound":"MmE=","upper_bound":"MmU=","repeats":1},{"count":107,"lower_bound":"MmY=","upper_bound":"Mm8=","repeats":1},{"count":115,"lower_bound":"MnE=","upper_bound":"MzU=","repeats":1},{"count":123,"lower_bound":"MzY=","upper_bound":"M0I=","repeats":1},{"count":131,"lower_bound":"M0Q=","upper_bound":"M0c=","repeats":1},{"count":139,"lower_bound":"M04=","upper_bound":"M1Q=","repeats":1},{"count":147,"lower_bound":"M1U=","upper_bound":"M1o=","repeats":1},{"count":155,"lower_bound":"M2E=","upper_bound":"M2w=","repeats":1},{"count":163,"lower_bound":"M3E=","upper_bound":"M3g=","repeats":1},{"count":171,"lower_bound":"M3o=","upper_bound":"NDU=","repeats":1},{"count":179,"lower_bound":"NDY=","upper_bound":"NEI=","repeats":1},{"count":187,"lower_bound":"NEQ=","upper_bound":"NEw=","repeats":1},{"count":195,"lower_bound":"NE4=","upper_bound":"NFI=","repeats":1},{"count":203,"lower_bound":"NFM=","upper_bound":"NFg=","repeats":1},{"count":211,"lower_bound":"NFk=","upper_bound":"NGo=","repeats":1},{"count":219,"lower_bound":"NGs=","upper_bound":"NG8=","repeats":1},{"count":227,"lower_bound":"NHA=","upper_bound":"NHg=","repeats":1},{"count":235,"lower_bound":"NHo=","upper_bound":"NTE=","repeats":1},{"count":243,"lower_bound":"NTM=","upper_bound":"NUI=","repeats":1},{"count":251,"lower_bound":"NUc=","upper_bound":"NU4=","repeats":1},{"count":259,"lower_bound":"NU8=","upper_bound":"NVQ=","repeats":1},{"count":267,"lower_bound":"NVY=","upper_bound":"NWc=","repeats":1},{"count":275,"lower_bound":"NWg=","upper_bound":"NWw=","repeats":1},{"count":283,"lower_bound":"NW4=","upper_bound":"NXE=","repeats":1},{"count":291,"lower_bound":"NXI=","upper_bound":"NXk=","repeats":1},{"count":299,"lower_bound":"Ng==","upper_bound":"Njg=","repeats":1},{"count":307,"lower_bound":"Njk=","upper_bound":"NkU=","repeats":1},{"count":315,"lower_bound":"NkY=","upper_bound":"Nk8=","repeats":1},{"count":323,"lower_bound":"NlI=","upper_bound":"Nlg=","repeats":1},{"count":331,"lower_bound":"Nlo=","upper_bound":"NmY=","repeats":1},{"count":338,"lower_bound":"Nmc=","upper_bound":"Nm4=","repeats":1},{"count":344,"lower_bound":"Nm8=","upper_bound":"NnE=","repeats":1},{"count":350,"lower_bound":"NnM=","upper_bound":"NnU=","repeats":1},{"count":356,"lower_bound":"Nnc=","upper_bound":"Nno=","repeats":1},{"count":362,"lower_bound":"NzI=","upper_bound":"NzY=","repeats":1},{"count":368,"lower_bound":"Nzc=","upper_bound":"N0I=","repeats":1},{"count":374,"lower_bound":"N0M=","upper_bound":"N0U=","repeats":1},{"count":380,"lower_bound":"N0Y=","upper_bound":"N0g=","repeats":1},{"count":386,"lower_bound":"N0s=","upper_bound":"N1A=","repeats":1},{"count":392,"lower_bound":"N1E=","upper_bound":"N1Q=","repeats":1},{"count":398,"lower_bound":"N1U=","upper_bound":"N1o=","repeats":1},{"count":406,"lower_bound":"N2M=","upper_bound":"N2Y=","repeats":1},{"count":414,"lower_bound":"N2c=","upper_bound":"N2s=","repeats":1},{"count":422,"lower_bound":"N24=","upper_bound":"N3g=","repeats":1},{"count":430,"lower_bound":"N3k=","upper_bound":"ODU=","repeats":1},{"count":438,"lower_bound":"ODc=","upper_bound":"OEQ=","repeats":1},{"count":446,"lower_bound":"OEU=","upper_bound":"OEo=","repeats":1},{"count":454,"lower_bound":"OEs=","upper_bound":"OFA=","repeats":1},{"count":462,"lower_bound":"OFI=","upper_bound":"OFU=","repeats":1},{"count":470,"lower_bound":"OGM=","upper_bound":"OG0=","repeats":1},{"count":478,"lower_bound":"OG4=","upper_bound":"OHY=","repeats":1},{"count":486,"lower_bound":"OHg=","upper_bound":"OTM=","repeats":1},{"count":494,"lower_bound":"OTQ=","upper_bound":"OUM=","repeats":1},{"count":502,"lower_bound":"OUQ=","upper_bound":"OUo=","repeats":1},{"count":510,"lower_bound":"OUs=","upper_bound":"OVI=","repeats":1},{"count":518,"lower_bound":"OVM=","upper_bound":"OVY=","repeats":1},{"count":526,"lower_bound":"OVg=","upper_bound":"OWI=","repeats":1},{"count":534,"lower_bound":"OWM=","upper_bound":"OWs=","repeats":1},{"count":542,"lower_bound":"OXE=","upper_bound":"QQ==","repeats":1},{"count":550,"lower_bound":"QTA=","upper_bound":"QTU=","repeats":1},{"count":558,"lower_bound":"QTc=","upper_bound":"QUE=","repeats":1},{"count":566,"lower_bound":"QUM=","upper_bound":"QU0=","repeats":1},{"count":574,"lower_bound":"QU8=","upper_bound":"QVc=","repeats":1},{"count":582,"lower_bound":"QVg=","upper_bound":"QWI=","repeats":1},{"count":590,"lower_bound":"QWM=","upper_bound":"QWc=","repeats":1},{"count":598,"lower_bound":"QWg=","upper_bound":"QW4=","repeats":1},{"count":606,"lower_bound":"QXE=","upper_bound":"QXY=","repeats":1},{"count":614,"lower_bound":"QXc=","upper_bound":"QjY=","repeats":1},{"count":622,"lower_bound":"Qjc=","upper_bound":"QkY=","repeats":1},{"count":630,"lower_bound":"Qkk=","upper_bound":"Qk8=","repeats":1},{"count":638,"lower_bound":"QlA=","upper_bound":"QlM=","repeats":1},{"count":646,"lower_bound":"QlQ=","upper_bound":"QmE=","repeats":1},{"count":654,"lower_bound":"QmI=","upper_bound":"Qmw=","repeats":1},{"count":662,"lower_bound":"Qm0=","upper_bound":"QnA=","repeats":1},{"count":669,"lower_bound":"QnE=","upper_bound":"Qnc=","repeats":1},{"count":675,"lower_bound":"Qno=","upper_bound":"QzM=","repeats":1},{"count":681,"lower_bound":"QzQ=","upper_bound":"Qzg=","repeats":1},{"count":687,"lower_bound":"Qzk=","upper_bound":"Q0M=","repeats":1},{"count":693,"lower_bound":"Q0Q=","upper_bound":"Q0g=","repeats":1},{"count":699,"lower_bound":"Q04=","upper_bound":"Q1A=","repeats":1},{"count":705,"lower_bound":"Q1M=","upper_bound":"Q1Y=","repeats":1},{"count":711,"lower_bound":"Q1c=","upper_bound":"Q2I=","repeats":1},{"count":717,"lower_bound":"Q2M=","upper_bound":"Q2c=","repeats":1},{"count":723,"lower_bound":"Q2g=","upper_bound":"Q2s=","repeats":1},{"count":729,"lower_bound":"Q20=","upper_bound":"Q3M=","repeats":1},{"count":737,"lower_bound":"Q3Q=","upper_bound":"Q3o=","repeats":1},{"count":745,"lower_bound":"RA==","upper_bound":"RDk=","repeats":1},{"count":753,"lower_bound":"REE=","upper_bound":"REQ=","repeats":1},{"count":761,"lower_bound":"REU=","upper_bound":"REs=","repeats":1},{"count":769,"lower_bound":"REw=","upper_bound":"RFE=","repeats":1},{"count":777,"lower_bound":"RFI=","upper_bound":"RFo=","repeats":1},{"count":785,"lower_bound":"RGY=","upper_bound":"RGs=","repeats":1},{"count":793,"lower_bound":"RGw=","upper_bound":"RHQ=","repeats":1},{"count":801,"lower_bound":"RHg=","upper_bound":"RTA=","repeats":1},{"count":809,"lower_bound":"RTI=","upper_bound":"RTc=","repeats":1},{"count":817,"lower_bound":"RTg=","upper_bound":"RUQ=","repeats":1},{"count":825,"lower_bound":"RUU=","upper_bound":"RVE=","repeats":1},{"count":833,"lower_bound":"RVM=","upper_bound":"RVc=","repeats":1},{"count":841,"lower_bound":"RWI=","upper_bound":"RWY=","repeats":1},{"count":849,"lower_bound":"RWo=","upper_bound":"RW0=","repeats":1},{"count":857,"lower_bound":"RW4=","upper_bound":"RXU=","repeats":1},{"count":865,"lower_bound":"RXY=","upper_bound":"RjM=","repeats":1},{"count":873,"lower_bound":"Rjc=","upper_bound":"RkQ=","repeats":1},{"count":881,"lower_bound":"RkY=","upper_bound":"Rko=","repeats":1},{"count":889,"lower_bound":"Rk0=","upper_bound":"RlE=","repeats":1},{"count":897,"lower_bound":"RlM=","upper_bound":"RmM=","repeats":1},{"count":905,"lower_bound":"RmU=","upper_bound":"Rmw=","repeats":1},{"count":913,"lower_bound":"Rm0=","upper_bound":"RnI=","repeats":1},{"count":921,"lower_bound":"RnM=","upper_bound":"RnY=","repeats":1},{"count":929,"lower_bound":"Rnc=","upper_bound":"Rno=","repeats":1},{"count":937,"lower_bound":"Rzg=","upper_bound":"R0k=","repeats":1},{"count":945,"lower_bound":"R0s=","upper_bound":"R08=","repeats":1},{"count":953,"lower_bound":"R1A=","upper_bound":"R1Q=","repeats":1},{"count":961,"lower_bound":"R1Y=","upper_bound":"R1o=","repeats":1},{"count":969,"lower_bound":"R2E=","upper_bound":"R2U=","repeats":1},{"count":977,"lower_bound":"R2Y=","upper_bound":"R24=","repeats":1},{"count":985,"lower_bound":"R28=","upper_bound":"SDI=","repeats":1},{"count":993,"lower_bound":"SDQ=","upper_bound":"SEE=","repeats":1},{"count":1000,"lower_bound":"SEU=","upper_bound":"SE0=","repeats":1},{"count":1006,"lower_bound":"SFE=","upper_bound":"SFQ=","repeats":1},{"count":1012,"lower_bound":"SFU=","upper_bound":"SFc=","repeats":1},{"count":1018,"lower_bound":"SFk=","upper_bound":"SGM=","repeats":1},{"count":1024,"lower_bound":"SGQ=","upper_bound":"SGg=","repeats":1},{"count":1030,"lower_bound":"SGo=","upper_bound":"SHA=","repeats":1},{"count":1036,"lower_bound":"SHE=","upper_bound":"SHM=","repeats":1},{"count":1042,"lower_bound":"SHQ=","upper_bound":"SHY=","repeats":1},{"count":1048,"lower_bound":"SHk=","upper_bound":"SQ==","repeats":1},{"count":1054,"lower_bound":"STA=","upper_bound":"SUE=","repeats":1},{"count":1060,"lower_bound":"SUM=","upper_bound":"SUk=","repeats":1},{"count":1068,"lower_bound":"SUs=","upper_bound":"SVA=","repeats":1},{"count":1076,"lower_bound":"SVI=","upper_bound":"SVg=","repeats":1},{"count":1084,"lower_bound":"SVk=","upper_bound":"SWU=","repeats":1},{"count":1092,"lower_bound":"SWc=","upper_bound":"SWo=","repeats":1},{"count":1100,"lower_bound":"SWs=","upper_bound":"SXA=","repeats":1},{"count":1108,"lower_bound":"SXE=","upper_bound":"SXQ=","repeats":1},{"count":1116,"lower_bound":"SXY=","upper_bound":"SjA=","repeats":1},{"count":1124,"lower_bound":"SjE=","upper_bound":"Sjk=","repeats":1},{"count":1132,"lower_bound":"SkI=","upper_bound":"Skc=","repeats":1},{"count":1140,"lower_bound":"Sko=","upper_bound":"Sk4=","repeats":1},{"count":1148,"lower_bound":"Sk8=","upper_bound":"Slo=","repeats":1},{"count":1156,"lower_bound":"SmQ=","upper_bound":"Smo=","repeats":1},{"count":1164,"lower_bound":"Sms=","upper_bound":"SnA=","repeats":1},{"count":1172,"lower_bound":"SnM=","upper_bound":"SzE=","repeats":1},{"count":1180,"lower_bound":"SzY=","upper_bound":"S0Q=","repeats":1},{"count":1188,"lower_bound":"S0U=","upper_bound":"S0o=","repeats":1},{"count":1196,"lower_bound":"S0s=","upper_bound":"S1A=","repeats":1},{"count":1204,"lower_bound":"S1I=","upper_bound":"S1Y=","repeats":1},{"count":1212,"lower_bound":"S1g=","upper_bound":"S2E=","repeats":1},{"count":1220,"lower_bound":"S2I=","upper_bound":"S2Y=","repeats":1},{"count":1228,"lower_bound":"S2c=","upper_bound":"S2o=","repeats":1},{"count":1236,"lower_bound":"S20=","upper_bound":"S3I=","repeats":1},{"count":1244,"lower_bound":"S3Y=","upper_bound":"TDA=","repeats":1},{"count":1252,"lower_bound":"TDI=","upper_bound":"TDU=","repeats":1},{"count":1260,"lower_bound":"TDc=","upper_bound":"TEM=","repeats":1},{"count":1268,"lower_bound":"TEU=","upper_bound":"TEo=","repeats":1},{"count":1276,"lower_bound":"TEs=","upper_bound":"TE8=","repeats":1},{"count":1284,"lower_bound":"TFA=","upper_bound":"TFg=","repeats":1},{"count":1292,"lower_bound":"TGE=","upper_bound":"TG0=","repeats":1},{"count":1300,"lower_bound":"TG4=","upper_bound":"THU=","repeats":1},{"count":1308,"lower_bound":"TTA=","upper_bound":"TUQ=","repeats":1},{"count":1316,"lower_bound":"TUU=","upper_bound":"TUs=","repeats":1},{"count":1324,"lower_bound":"TUw=","upper_bound":"TVc=","repeats":1},{"count":1331,"lower_bound":"TVk=","upper_bound":"TWI=","repeats":1},{"count":1337,"lower_bound":"TWM=","upper_bound":"TWk=","repeats":1},{"count":1343,"lower_bound":"TWs=","upper_bound":"TW4=","repeats":1},{"count":1349,"lower_bound":"TXA=","upper_bound":"TXI=","repeats":1},{"count":1355,"lower_bound":"TXQ=","upper_bound":"TXo=","repeats":1},{"count":1361,"lower_bound":"Tg==","upper_bound":"TjE=","repeats":1},{"count":1367,"lower_bound":"TjQ=","upper_bound":"TjY=","repeats":1},{"count":1373,"lower_bound":"Tjc=","upper_bound":"TkE=","repeats":1},{"count":1379,"lower_bound":"TkI=","upper_bound":"TkU=","repeats":1},{"count":1385,"lower_bound":"TkY=","upper_bound":"Tkk=","repeats":1},{"count":1391,"lower_bound":"Tko=","upper_bound":"Tk0=","repeats":1},{"count":1399,"lower_bound":"Tk4=","upper_bound":"Tlg=","repeats":1},{"count":1407,"lower_bound":"TmE=","upper_bound":"Tmg=","repeats":1},{"count":1415,"lower_bound":"Tmk=","upper_bound":"Tmw=","repeats":1},{"count":1423,"lower_bound":"Tm4=","upper_bound":"TnM=","repeats":1},{"count":1431,"lower_bound":"Tnc=","upper_bound":"TzI=","repeats":1},{"count":1439,"lower_bound":"TzM=","upper_bound":"T0E=","repeats":1},{"count":1447,"lower_bound":"T0I=","upper_bound":"T0c=","repeats":1},{"count":1455,"lower_bound":"T0o=","upper_bound":"T04=","repeats":1},{"count":1463,"lower_bound":"T08=","upper_bound":"T1I=","repeats":1},{"count":1471,"lower_bound":"T1M=","upper_bound":"T1c=","repeats":1},{"count":1479,"lower_bound":"T1o=","upper_bound":"T2c=","repeats":1},{"count":1487,"lower_bound":"T2g=","upper_bound":"T28=","repeats":1},{"count":1495,"lower_bound":"T3A=","upper_bound":"T3c=","repeats":1},{"count":1503,"lower_bound":"T3g=","upper_bound":"UDI=","repeats":1},{"count":1511,"lower_bound":"UDQ=","upper_bound":"UDk=","repeats":1},{"count":1519,"lower_bound":"UEE=","upper_bound":"UEc=","repeats":1},{"count":1527,"lower_bound":"UEk=","upper_bound":"UE0=","repeats":1},{"count":1535,"lower_bound":"UE8=","upper_bound":"UFQ=","repeats":1},{"count":1543,"lower_bound":"UFU=","upper_bound":"UFk=","repeats":1},{"count":1551,"lower_bound":"UFo=","upper_bound":"UGU=","repeats":1},{"count":1559,"lower_bound":"UGY=","upper_bound":"UGw=","repeats":1},{"count":1567,"lower_bound":"UG0=","upper_bound":"UHM=","repeats":1},{"count":1575,"lower_bound":"UHQ=","upper_bound":"UTQ=","repeats":1},{"count":1583,"lower_bound":"UTU=","upper_bound":"UUE=","repeats":1},{"count":1591,"lower_bound":"UUg=","upper_bound":"UU4=","repeats":1},{"count":1599,"lower_bound":"UU8=","upper_bound":"UVc=","repeats":1},{"count":1607,"lower_bound":"UVg=","upper_bound":"UWI=","repeats":1},{"count":1615,"lower_bound":"UWM=","upper_bound":"UWo=","repeats":1},{"count":1623,"lower_bound":"UWs=","upper_bound":"UW8=","repeats":1},{"count":1631,"lower_bound":"UXA=","upper_bound":"UXc=","repeats":1},{"count":1639,"lower_bound":"UXo=","upper_bound":"UjI=","repeats":1},{"count":1647,"lower_bound":"UjU=","upper_bound":"UkE=","repeats":1},{"count":1655,"lower_bound":"UkM=","upper_bound":"Ukc=","repeats":1},{"count":1662,"lower_bound":"Ukk=","upper_bound":"Ukw=","repeats":1},{"count":1668,"lower_bound":"Uk4=","upper_bound":"UlA=","repeats":1},{"count":1674,"lower_bound":"UlE=","upper_bound":"Umc=","repeats":1},{"count":1680,"lower_bound":"Um8=","upper_bound":"UnM=","repeats":1},{"count":1686,"lower_bound":"UnQ=","upper_bound":"Unc=","repeats":1},{"count":1692,"lower_bound":"Ung=","upper_bound":"UzA=","repeats":1},{"count":1698,"lower_bound":"UzE=","upper_bound":"UzU=","repeats":1},{"count":1704,"lower_bound":"Uzk=","upper_bound":"U0U=","repeats":1},{"count":1710,"lower_bound":"U0c=","upper_bound":"U0s=","repeats":1},{"count":1716,"lower_bound":"U04=","upper_bound":"U1E=","repeats":1},{"count":1722,"lower_bound":"U1c=","upper_bound":"U2E=","repeats":1},{"count":1728,"lower_bound":"U2I=","upper_bound":"U2Q=","repeats":1},{"count":1736,"lower_bound":"U2U=","upper_bound":"U2k=","repeats":1},{"count":1744,"lower_bound":"U2s=","upper_bound":"U3I=","repeats":1},{"count":1752,"lower_bound":"U3U=","upper_bound":"VDE=","repeats":1},{"count":1760,"lower_bound":"VDI=","upper_bound":"VDY=","repeats":1},{"count":1768,"lower_bound":"VDc=","upper_bound":"VEU=","repeats":1},{"count":1776,"lower_bound":"VEY=","upper_bound":"VEo=","repeats":1},{"count":1784,"lower_bound":"VEw=","upper_bound":"VFM=","repeats":1},{"count":1792,"lower_bound":"VFQ=","upper_bound":"VFo=","repeats":1},{"count":1800,"lower_bound":"VGE=","upper_bound":"VGk=","repeats":1},{"count":1808,"lower_bound":"VGo=","upper_bound":"VG8=","repeats":1},{"count":1816,"lower_bound":"VHA=","upper_bound":"VHg=","repeats":1},{"count":1824,"lower_bound":"VHk=","upper_bound":"VTE=","repeats":1},{"count":1832,"lower_bound":"VTM=","upper_bound":"VTk=","repeats":1},{"count":1840,"lower_bound":"VUE=","upper_bound":"VUQ=","repeats":1},{"count":1848,"lower_bound":"VUg=","upper_bound":"VUs=","repeats":1},{"count":1856,"lower_bound":"VU0=","upper_bound":"VVA=","repeats":1},{"count":1864,"lower_bound":"VVY=","upper_bound":"VWE=","repeats":1},{"count":1872,"lower_bound":"VWI=","upper_bound":"VXI=","repeats":1},{"count":1880,"lower_bound":"VXM=","upper_bound":"VXc=","repeats":1},{"count":1888,"lower_bound":"VXk=","upper_bound":"VjE=","repeats":1},{"count":1896,"lower_bound":"VjI=","upper_bound":"Vjk=","repeats":1},{"count":1904,"lower_bound":"VkE=","upper_bound":"VkU=","repeats":1},{"count":1912,"lower_bound":"Vkg=","upper_bound":"Vkw=","repeats":1},{"count":1920,"lower_bound":"VlE=","upper_bound":"VmU=","repeats":1},{"count":1928,"lower_bound":"Vmk=","upper_bound":"Vm0=","repeats":1},{"count":1936,"lower_bound":"Vm4=","upper_bound":"VnU=","repeats":1},{"count":1944,"lower_bound":"Vnc=","upper_bound":"VzA=","repeats":1},{"count":1952,"lower_bound":"VzI=","upper_bound":"VzY=","repeats":1},{"count":1960,"lower_bound":"Vzg=","upper_bound":"V0U=","repeats":1},{"count":1968,"lower_bound":"V0Y=","upper_bound":"Yw==","repeats":1},{"count":1976,"lower_bound":"ZA==","upper_bound":"bA==","repeats":1},{"count":1984,"lower_bound":"bQ==","upper_bound":"dQ==","repeats":1},{"count":1992,"lower_bound":"dg==","upper_bound":"eQ==","repeats":1},{"count":1994,"lower_bound":"eg==","upper_bound":"eg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,1,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,0,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,1,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,1,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,0,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,1,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,1,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,0,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,2,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,1,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,1,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,2,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,3,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,1,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,1,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,2,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,0,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,2,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,2,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,0,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,2,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,1,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,2,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,3,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,2,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,2,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,1,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,0,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,1,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,1,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,1,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,0,1,0,1,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952036208640000},"dic":{"histogram":{"ndv":1994,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MTM=","repeats":1},{"count":13,"lower_bound":"MTY=","upper_bound":"MTk=","repeats":1},{"count":19,"lower_bound":"MUI=","upper_bound":"MUo=","repeats":1},{"count":25,"lower_bound":"MU4=","upper_bound":"MVE=","repeats":1},{"count":31,"lower_bound":"MVg=","upper_bound":"MVo=","repeats":1},{"count":37,"lower_bound":"MWI=","upper_bound":"MWU=","repeats":1},{"count":43,"lower_bound":"MWY=","upper_bound":"MWg=","repeats":1},{"count":49,"lower_bound":"MWk=","upper_bound":"MWs=","repeats":1},{"count":55,"lower_bound":"MWw=","upper_bound":"MW4=","repeats":1},{"count":61,"lower_bound":"MW8=","upper_bound":"MXE=","repeats":1},{"count":67,"lower_bound":"MXQ=","upper_bound":"MXo=","repeats":1},{"count":75,"lower_bound":"Mg==","upper_bound":"MjY=","repeats":1},{"count":83,"lower_bound":"Mjc=","upper_bound":"MkE=","repeats":1},{"count":91,"lower_bound":"MkI=","upper_bound":"Mkg=","repeats":1},{"count":99,"lower_bound":"Mkk=","upper_bound":"Mk8=","repeats":1},{"count":107,"lower_bound":"MlA=","upper_bound":"Mlc=","repeats":1},{"count":115,"lower_bound":"Mlg=","upper_bound":"MmQ=","repeats":1},{"count":123,"lower_bound":"MmU=","upper_bound":"Mms=","repeats":1},{"count":131,"lower_bound":"Mmw=","upper_bound":"MnE=","repeats":1},{"count":139,"lower_bound":"MnQ=","upper_bound":"Mno=","repeats":1},{"count":147,"lower_bound":"Mw==","upper_bound":"MzQ=","repeats":1},{"count":155,"lower_bound":"MzY=","upper_bound":"M0M=","repeats":1},{"count":163,"lower_bound":"M0Q=","upper_bound":"M1A=","repeats":1},{"count":171,"lower_bound":"M1E=","upper_bound":"M1o=","repeats":1},{"count":179,"lower_bound":"M2I=","upper_bound":"M2c=","repeats":1},{"count":187,"lower_bound":"M2k=","upper_bound":"M2w=","repeats":1},{"count":195,"lower_bound":"M20=","upper_bound":"M3E=","repeats":1},{"count":203,"lower_bound":"M3I=","upper_bound":"M3Y=","repeats":1},{"count":211,"lower_bound":"M3k=","upper_bound":"NDU=","repeats":1},{"count":219,"lower_bound":"NDY=","upper_bound":"NEY=","repeats":1},{"count":227,"lower_bound":"NEc=","upper_bound":"NFA=","repeats":1},{"count":235,"lower_bound":"NFE=","upper_bound":"NFQ=","repeats":1},{"count":243,"lower_bound":"NFY=","upper_bound":"NGM=","repeats":1},{"count":251,"lower_bound":"NGQ=","upper_bound":"NGw=","repeats":1},{"count":259,"lower_bound":"NG0=","upper_bound":"NHg=","repeats":1},{"count":267,"lower_bound":"NHo=","upper_bound":"NTE=","repeats":1},{"count":275,"lower_bound":"NTI=","upper_bound":"NTU=","repeats":1},{"count":283,"lower_bound":"NTY=","upper_bound":"NTk=","repeats":1},{"count":291,"lower_bound":"NUQ=","upper_bound":"NUw=","repeats":1},{"count":299,"lower_bound":"NU4=","upper_bound":"NVU=","repeats":1},{"count":307,"lower_bound":"NVY=","upper_bound":"NWY=","repeats":1},{"count":315,"lower_bound":"NWc=","upper_bound":"NWs=","repeats":1},{"count":323,"lower_bound":"NWw=","upper_bound":"NXE=","repeats":1},{"count":331,"lower_bound":"NXc=","upper_bound":"NjA=","repeats":1},{"count":338,"lower_bound":"NjE=","upper_bound":"NkE=","repeats":1},{"count":344,"lower_bound":"NkM=","upper_bound":"Nkc=","repeats":1},{"count":350,"lower_bound":"Nkk=","upper_bound":"Nks=","repeats":1},{"count":356,"lower_bound":"Nk0=","upper_bound":"NlQ=","repeats":1},{"count":362,"lower_bound":"NlU=","upper_bound":"NmE=","repeats":1},{"count":368,"lower_bound":"NmI=","upper_bound":"NmQ=","repeats":1},{"count":374,"lower_bound":"Nmg=","upper_bound":"Nm8=","repeats":1},{"count":380,"lower_bound":"NnE=","upper_bound":"NnU=","repeats":1},{"count":386,"lower_bound":"NnY=","upper_bound":"Nnk=","repeats":1},{"count":392,"lower_bound":"NzA=","upper_bound":"NzQ=","repeats":1},{"count":398,"lower_bound":"NzU=","upper_bound":"N0I=","repeats":1},{"count":406,"lower_bound":"N0U=","upper_bound":"N04=","repeats":1},{"count":414,"lower_bound":"N08=","upper_bound":"N1I=","repeats":1},{"count":422,"lower_bound":"N1M=","upper_bound":"N1o=","repeats":1},{"count":430,"lower_bound":"N2E=","upper_bound":"N2w=","repeats":1},{"count":438,"lower_bound":"N24=","upper_bound":"N3U=","repeats":1},{"count":446,"lower_bound":"N3k=","upper_bound":"ODQ=","repeats":1},{"count":454,"lower_bound":"ODU=","upper_bound":"OEU=","repeats":1},{"count":462,"lower_bound":"OEc=","upper_bound":"OE8=","repeats":1},{"count":470,"lower_bound":"OFA=","upper_bound":"OFM=","repeats":1},{"count":478,"lower_bound":"OFQ=","upper_bound":"OGc=","repeats":1},{"count":486,"lower_bound":"OGg=","upper_bound":"OHM=","repeats":1},{"count":494,"lower_bound":"OHU=","upper_bound":"OHk=","repeats":1},{"count":502,"lower_bound":"OHo=","upper_bound":"OTc=","repeats":1},{"count":510,"lower_bound":"OTk=","upper_bound":"OUM=","repeats":1},{"count":518,"lower_bound":"OUQ=","upper_bound":"OU4=","repeats":1},{"count":526,"lower_bound":"OVA=","upper_bound":"OVc=","repeats":1},{"count":534,"lower_bound":"OWE=","upper_bound":"OWg=","repeats":1},{"count":542,"lower_bound":"OWk=","upper_bound":"OW4=","repeats":1},{"count":550,"lower_bound":"OW8=","upper_bound":"OXI=","repeats":1},{"count":558,"lower_bound":"OXM=","upper_bound":"QTA=","repeats":1},{"count":566,"lower_bound":"QTI=","upper_bound":"QTc=","repeats":1},{"count":574,"lower_bound":"QTg=","upper_bound":"QUM=","repeats":1},{"count":582,"lower_bound":"QUU=","upper_bound":"QUo=","repeats":1},{"count":590,"lower_bound":"QU4=","upper_bound":"QVQ=","repeats":1},{"count":598,"lower_bound":"QVU=","upper_bound":"QVk=","repeats":1},{"count":606,"lower_bound":"QWI=","upper_bound":"QWg=","repeats":1},{"count":614,"lower_bound":"QWk=","upper_bound":"QW8=","repeats":1},{"count":622,"lower_bound":"QXM=","upper_bound":"QXg=","repeats":1},{"count":630,"lower_bound":"QjA=","upper_bound":"QjU=","repeats":1},{"count":638,"lower_bound":"QjY=","upper_bound":"QkQ=","repeats":1},{"count":646,"lower_bound":"Qkg=","upper_bound":"Qk4=","repeats":1},{"count":654,"lower_bound":"QlA=","upper_bound":"Qlg=","repeats":1},{"count":662,"lower_bound":"Qlk=","upper_bound":"QmQ=","repeats":1},{"count":669,"lower_bound":"QmU=","upper_bound":"Qm0=","repeats":1},{"count":675,"lower_bound":"Qm8=","upper_bound":"QnE=","repeats":1},{"count":681,"lower_bound":"QnM=","upper_bound":"QnU=","repeats":1},{"count":687,"lower_bound":"Qnc=","upper_bound":"Qno=","repeats":1},{"count":693,"lower_bound":"QzE=","upper_bound":"QzY=","repeats":1},{"count":699,"lower_bound":"Qzc=","upper_bound":"Q0U=","repeats":1},{"count":705,"lower_bound":"Q0Y=","upper_bound":"Q0g=","repeats":1},{"count":711,"lower_bound":"Q0w=","upper_bound":"Q1E=","repeats":1},{"count":717,"lower_bound":"Q1Q=","upper_bound":"Q1g=","repeats":1},{"count":723,"lower_bound":"Q1o=","upper_bound":"Q2M=","repeats":1},{"count":729,"lower_bound":"Q2Y=","upper_bound":"Q2w=","repeats":1},{"count":737,"lower_bound":"Q24=","upper_bound":"Q3Y=","repeats":1},{"count":745,"lower_bound":"Q3g=","upper_bound":"RDE=","repeats":1},{"count":753,"lower_bound":"RDY=","upper_bound":"REI=","repeats":1},{"count":761,"lower_bound":"REQ=","upper_bound":"REw=","repeats":1},{"count":769,"lower_bound":"RFA=","upper_bound":"RFM=","repeats":1},{"count":777,"lower_bound":"RFU=","upper_bound":"RGE=","repeats":1},{"count":785,"lower_bound":"RGI=","upper_bound":"RG0=","repeats":1},{"count":793,"lower_bound":"RHA=","upper_bound":"RHg=","repeats":1},{"count":801,"lower_bound":"RHo=","upper_bound":"RTk=","repeats":1},{"count":809,"lower_bound":"RUI=","upper_bound":"RUU=","repeats":1},{"count":817,"lower_bound":"RUc=","upper_bound":"RVM=","repeats":1},{"count":825,"lower_bound":"RVU=","upper_bound":"RWE=","repeats":1},{"count":833,"lower_bound":"RWI=","upper_bound":"RWU=","repeats":1},{"count":841,"lower_bound":"RWY=","upper_bound":"RWk=","repeats":1},{"count":849,"lower_bound":"RWo=","upper_bound":"RXE=","repeats":1},{"count":857,"lower_bound":"RXY=","upper_bound":"RXk=","repeats":1},{"count":865,"lower_bound":"RXo=","upper_bound":"Rjc=","repeats":1},{"count":873,"lower_bound":"Rjk=","upper_bound":"Rkg=","repeats":1},{"count":881,"lower_bound":"Rks=","upper_bound":"RlA=","repeats":1},{"count":889,"lower_bound":"RlI=","upper_bound":"RlY=","repeats":1},{"count":897,"lower_bound":"Rlg=","upper_bound":"RmI=","repeats":1},{"count":905,"lower_bound":"RmM=","upper_bound":"Rmg=","repeats":1},{"count":913,"lower_bound":"Rmk=","upper_bound":"Rm8=","repeats":1},{"count":921,"lower_bound":"RnA=","upper_bound":"RnQ=","repeats":1},{"count":929,"lower_bound":"RnU=","upper_bound":"Rno=","repeats":1},{"count":937,"lower_bound":"RzM=","upper_bound":"Rzg=","repeats":1},{"count":945,"lower_bound":"Rzk=","upper_bound":"R0Q=","repeats":1},{"count":953,"lower_bound":"R0Y=","upper_bound":"R08=","repeats":1},{"count":961,"lower_bound":"R1E=","upper_bound":"R1U=","repeats":1},{"count":969,"lower_bound":"R1c=","upper_bound":"R2M=","repeats":1},{"count":977,"lower_bound":"R2Q=","upper_bound":"R2o=","repeats":1},{"count":985,"lower_bound":"R2w=","upper_bound":"R3E=","repeats":1},{"count":993,"lower_bound":"R3I=","upper_bound":"R3k=","repeats":1},{"count":1000,"lower_bound":"R3o=","upper_bound":"SDE=","repeats":1},{"count":1006,"lower_bound":"SDQ=","upper_bound":"SDc=","repeats":1},{"count":1012,"lower_bound":"SEI=","upper_bound":"SEQ=","repeats":1},{"count":1018,"lower_bound":"SEY=","upper_bound":"SEk=","repeats":1},{"count":1024,"lower_bound":"SEs=","upper_bound":"SE8=","repeats":1},{"count":1030,"lower_bound":"SFM=","upper_bound":"SFU=","repeats":1},{"count":1036,"lower_bound":"SFY=","upper_bound":"SFk=","repeats":1},{"count":1042,"lower_bound":"SGE=","upper_bound":"SGM=","repeats":1},{"count":1048,"lower_bound":"SGQ=","upper_bound":"SGc=","repeats":1},{"count":1054,"lower_bound":"SGs=","upper_bound":"SG4=","repeats":1},{"count":1060,"lower_bound":"SG8=","upper_bound":"SHY=","repeats":1},{"count":1068,"lower_bound":"SHc=","upper_bound":"STM=","repeats":1},{"count":1076,"lower_bound":"STU=","upper_bound":"SUI=","repeats":1},{"count":1084,"lower_bound":"SUM=","upper_bound":"SUk=","repeats":1},{"count":1092,"lower_bound":"SUo=","upper_bound":"SVA=","repeats":1},{"count":1100,"lower_bound":"SVE=","upper_bound":"SVU=","repeats":1},{"count":1108,"lower_bound":"SVY=","upper_bound":"SWo=","repeats":1},{"count":1116,"lower_bound":"SWw=","upper_bound":"SXI=","repeats":1},{"count":1124,"lower_bound":"SXM=","upper_bound":"SXc=","repeats":1},{"count":1132,"lower_bound":"SXo=","upper_bound":"SjQ=","repeats":1},{"count":1140,"lower_bound":"SjY=","upper_bound":"SkI=","repeats":1},{"count":1148,"lower_bound":"SkQ=","upper_bound":"Sks=","repeats":1},{"count":1156,"lower_bound":"Skw=","upper_bound":"SlE=","repeats":1},{"count":1164,"lower_bound":"SlQ=","upper_bound":"Slg=","repeats":1},{"count":1172,"lower_bound":"SmQ=","upper_bound":"Smo=","repeats":1},{"count":1180,"lower_bound":"Smw=","upper_bound":"SnM=","repeats":1},{"count":1188,"lower_bound":"SnQ=","upper_bound":"SzU=","repeats":1},{"count":1196,"lower_bound":"SzY=","upper_bound":"S0g=","repeats":1},{"count":1204,"lower_bound":"S0k=","upper_bound":"S1E=","repeats":1},{"count":1212,"lower_bound":"S1I=","upper_bound":"S1c=","repeats":1},{"count":1220,"lower_bound":"S1k=","upper_bound":"S2Y=","repeats":1},{"count":1228,"lower_bound":"S2c=","upper_bound":"S3I=","repeats":1},{"count":1236,"lower_bound":"S3M=","upper_bound":"S3g=","repeats":1},{"count":1244,"lower_bound":"TDE=","upper_bound":"TDU=","repeats":1},{"count":1252,"lower_bound":"TDc=","upper_bound":"TEI=","repeats":1},{"count":1260,"lower_bound":"TEM=","upper_bound":"TEo=","repeats":1},{"count":1268,"lower_bound":"TEs=","upper_bound":"TE4=","repeats":1},{"count":1276,"lower_bound":"TE8=","upper_bound":"TFU=","repeats":1},{"count":1284,"lower_bound":"TFc=","upper_bound":"TGQ=","repeats":1},{"count":1292,"lower_bound":"TGU=","upper_bound":"TGw=","repeats":1},{"count":1300,"lower_bound":"TG0=","upper_bound":"THU=","repeats":1},{"count":1308,"lower_bound":"TTA=","upper_bound":"TTc=","repeats":1},{"count":1316,"lower_bound":"TTk=","upper_bound":"TUQ=","repeats":1},{"count":1324,"lower_bound":"TUU=","upper_bound":"TVA=","repeats":1},{"count":1331,"lower_bound":"TVM=","upper_bound":"TVk=","repeats":1},{"count":1337,"lower_bound":"TVo=","upper_bound":"TWQ=","repeats":1},{"count":1343,"lower_bound":"TWY=","upper_bound":"TW0=","repeats":1},{"count":1349,"lower_bound":"TXE=","upper_bound":"TXQ=","repeats":1},{"count":1355,"lower_bound":"TXc=","upper_bound":"TXo=","repeats":1},{"count":1361,"lower_bound":"Tg==","upper_bound":"TjQ=","repeats":1},{"count":1367,"lower_bound":"TkI=","upper_bound":"TkU=","repeats":1},{"count":1373,"lower_bound":"TkY=","upper_bound":"Tkg=","repeats":1},{"count":1379,"lower_bound":"Tko=","upper_bound":"Tk8=","repeats":1},{"count":1385,"lower_bound":"TlM=","upper_bound":"Tlg=","repeats":1},{"count":1391,"lower_bound":"TmY=","upper_bound":"Tmg=","repeats":1},{"count":1399,"lower_bound":"Tms=","upper_bound":"TnE=","repeats":1},{"count":1407,"lower_bound":"TnI=","upper_bound":"Tno=","repeats":1},{"count":1415,"lower_bound":"TzE=","upper_bound":"TzU=","repeats":1},{"count":1423,"lower_bound":"Tzg=","upper_bound":"T0g=","repeats":1},{"count":1431,"lower_bound":"T0o=","upper_bound":"T08=","repeats":1},{"count":1439,"lower_bound":"T1A=","upper_bound":"T1Q=","repeats":1},{"count":1447,"lower_bound":"T1Y=","upper_bound":"T2E=","repeats":1},{"count":1455,"lower_bound":"T2M=","upper_bound":"T2k=","repeats":1},{"count":1463,"lower_bound":"T24=","upper_bound":"T3E=","repeats":1},{"count":1471,"lower_bound":"T3I=","upper_bound":"T3U=","repeats":1},{"count":1479,"lower_bound":"T3o=","upper_bound":"UDM=","repeats":1},{"count":1487,"lower_bound":"UDQ=","upper_bound":"UEU=","repeats":1},{"count":1495,"lower_bound":"UEg=","upper_bound":"UEs=","repeats":1},{"count":1503,"lower_bound":"UE4=","upper_bound":"UFE=","repeats":1},{"count":1511,"lower_bound":"UFI=","upper_bound":"UGE=","repeats":1},{"count":1519,"lower_bound":"UGI=","upper_bound":"UGU=","repeats":1},{"count":1527,"lower_bound":"UGY=","upper_bound":"UG4=","repeats":1},{"count":1535,"lower_bound":"UHI=","upper_bound":"UHU=","repeats":1},{"count":1543,"lower_bound":"UHY=","upper_bound":"UTQ=","repeats":1},{"count":1551,"lower_bound":"UTg=","upper_bound":"UUs=","repeats":1},{"count":1559,"lower_bound":"UUw=","upper_bound":"UVI=","repeats":1},{"count":1567,"lower_bound":"UVM=","upper_bound":"UVY=","repeats":1},{"count":1575,"lower_bound":"UVg=","upper_bound":"UWE=","repeats":1},{"count":1583,"lower_bound":"UWM=","upper_bound":"UWg=","repeats":1},{"count":1591,"lower_bound":"UWk=","upper_bound":"UW0=","repeats":1},{"count":1599,"lower_bound":"UW8=","upper_bound":"UXI=","repeats":1},{"count":1607,"lower_bound":"UXM=","upper_bound":"UXg=","repeats":1},{"count":1615,"lower_bound":"UXk=","upper_bound":"UjE=","repeats":1},{"count":1623,"lower_bound":"UjM=","upper_bound":"Ujc=","repeats":1},{"count":1631,"lower_bound":"Ujg=","upper_bound":"UkI=","repeats":1},{"count":1639,"lower_bound":"UkM=","upper_bound":"UkY=","repeats":1},{"count":1647,"lower_bound":"Ukg=","upper_bound":"Uk0=","repeats":1},{"count":1655,"lower_bound":"Uk4=","upper_bound":"Ulc=","repeats":1},{"count":1662,"lower_bound":"Ulg=","upper_bound":"UmE=","repeats":1},{"count":1668,"lower_bound":"UmI=","upper_bound":"Umg=","repeats":1},{"count":1674,"lower_bound":"Umk=","upper_bound":"Umw=","repeats":1},{"count":1680,"lower_bound":"Um0=","upper_bound":"UnE=","repeats":1},{"count":1686,"lower_bound":"UnI=","upper_bound":"UzA=","repeats":1},{"count":1692,"lower_bound":"UzQ=","upper_bound":"Uzg=","repeats":1},{"count":1698,"lower_bound":"Uzk=","upper_bound":"U0U=","repeats":1},{"count":1704,"lower_bound":"U0c=","upper_bound":"U0s=","repeats":1},{"count":1710,"lower_bound":"U0w=","upper_bound":"U04=","repeats":1},{"count":1716,"lower_bound":"U1I=","upper_bound":"U1U=","repeats":1},{"count":1722,"lower_bound":"U1Y=","upper_bound":"U2M=","repeats":1},{"count":1728,"lower_bound":"U2U=","upper_bound":"U2g=","repeats":1},{"count":1736,"lower_bound":"U20=","upper_bound":"U3A=","repeats":1},{"count":1744,"lower_bound":"U3E=","upper_bound":"U3Y=","repeats":1},{"count":1752,"lower_bound":"U3c=","upper_bound":"VA==","repeats":1},{"count":1760,"lower_bound":"VDM=","upper_bound":"VEE=","repeats":1},{"count":1768,"lower_bound":"VEM=","upper_bound":"VEg=","repeats":1},{"count":1776,"lower_bound":"VEo=","upper_bound":"VFA=","repeats":1},{"count":1784,"lower_bound":"VFE=","upper_bound":"VFY=","repeats":1},{"count":1792,"lower_bound":"VFc=","upper_bound":"VFo=","repeats":1},{"count":1800,"lower_bound":"VGI=","upper_bound":"VGc=","repeats":1},{"count":1808,"lower_bound":"VGo=","upper_bound":"VHQ=","repeats":1},{"count":1816,"lower_bound":"VHc=","upper_bound":"VTQ=","repeats":1},{"count":1824,"lower_bound":"VTc=","upper_bound":"VUQ=","repeats":1},{"count":1832,"lower_bound":"VUY=","upper_bound":"VUs=","repeats":1},{"count":1840,"lower_bound":"VU4=","upper_bound":"VVE=","repeats":1},{"count":1848,"lower_bound":"VVM=","upper_bound":"VVg=","repeats":1},{"count":1856,"lower_bound":"VVo=","upper_bound":"VWc=","repeats":1},{"count":1864,"lower_bound":"VWg=","upper_bound":"VWs=","repeats":1},{"count":1872,"lower_bound":"VWw=","upper_bound":"VW8=","repeats":1},{"count":1880,"lower_bound":"VXA=","upper_bound":"VXQ=","repeats":1},{"count":1888,"lower_bound":"VXc=","upper_bound":"Vg==","repeats":1},{"count":1896,"lower_bound":"VjI=","upper_bound":"Vjc=","repeats":1},{"count":1904,"lower_bound":"VkE=","upper_bound":"VkY=","repeats":1},{"count":1912,"lower_bound":"Vkc=","upper_bound":"Vk8=","repeats":1},{"count":1920,"lower_bound":"VlU=","upper_bound":"VmE=","repeats":1},{"count":1928,"lower_bound":"VmI=","upper_bound":"VmY=","repeats":1},{"count":1936,"lower_bound":"Vmo=","upper_bound":"VnM=","repeats":1},{"count":1944,"lower_bound":"VnQ=","upper_bound":"VzA=","repeats":1},{"count":1952,"lower_bound":"VzE=","upper_bound":"Vzg=","repeats":1},{"count":1960,"lower_bound":"V0Q=","upper_bound":"WA==","repeats":1},{"count":1968,"lower_bound":"WQ==","upper_bound":"ZA==","repeats":1},{"count":1976,"lower_bound":"ZQ==","upper_bound":"bA==","repeats":1},{"count":1984,"lower_bound":"bQ==","upper_bound":"cg==","repeats":1},{"count":1992,"lower_bound":"cw==","upper_bound":"eA==","repeats":1},{"count":1994,"lower_bound":"eQ==","upper_bound":"eQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,2,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,0,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,1,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,1,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,0,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,0,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,1,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,1,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,2,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,1,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,1,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,1,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,2,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,3,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,2,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,1,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,1,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,0,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,2,1,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,2,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,0,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,3,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,1,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,1,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,3,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,2,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,2,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,1,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,0,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,2,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,0,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,1,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,0,1,0,1,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952036356751360},"dim":{"histogram":{"ndv":1971,"buckets":[{"count":7,"lower_bound":"MDAweldtNVp3WlVkNGN1eU1YZkY2SGh2YU9mNlc=","upper_bound":"MDVRWFM3cGtvbzJta3gxVjdM","repeats":1},{"count":13,"lower_bound":"MDY0Wno3WWZYQnVNUVN3ZmRPYkpQSWFVVHQ=","upper_bound":"MEJZVHdqTzJvU1Y1U2I4Z3YwSQ==","repeats":1},{"count":19,"lower_bound":"MERzMlhRNGZiR1JRREltelMxOVZz","upper_bound":"MExwNm1ienVI","repeats":1},{"count":25,"lower_bound":"MFJ0WGp3TVM1b3FuaDRsY3Bm","upper_bound":"MGFr","repeats":1},{"count":31,"lower_bound":"MGJneERwa3NTWFZLR0pneA==","upper_bound":"MHNCYg==","repeats":1},{"count":37,"lower_bound":"MHR6eGwzdnU3dDZBUXR4MjNycTQ=","upper_bound":"MHpwb1Z1V1E5OTha","repeats":1},{"count":43,"lower_bound":"MUNsZXA=","upper_bound":"MVRXZlpUUjNaQ0lzdzB3WkZzMg==","repeats":1},{"count":49,"lower_bound":"MVRkSXgwQkJUUkZkYnQ0","upper_bound":"MVp2R1VFTVF3c0VGdzV5Sldmc0dPeQ==","repeats":1},{"count":55,"lower_bound":"MWI5TThlTHRmQWwzdU9mU3FCMnoxYTljUTdN","upper_bound":"MWZGZ21uVDlCOWZDa3lGdEpGcA==","repeats":1},{"count":61,"lower_bound":"MWp3SDBpa0tkRTA0dXFMYTRCWTc=","upper_bound":"MW1JYUF5","repeats":1},{"count":67,"lower_bound":"MXdydlZqRDZBc1BlMVlaZW5YQ0t3","upper_bound":"MjlpQU9vQ1VRUjU5SHdjU01JWG9BS0dMaUZpN3JDUw==","repeats":1},{"count":75,"lower_bound":"MkM0YnMxRzRkdjlmUWN4UzVFeVU=","upper_bound":"MklxUk1FeU9NdnQxemFzYnFHSEJvMTkwMGJtZg==","repeats":1},{"count":83,"lower_bound":"Mk1YTzdScmtL","upper_bound":"MlhVYXh2QTJoSWdXdHI=","repeats":1},{"count":91,"lower_bound":"MmF5S1kybWpuTnFESnVxR0piSE9UQXdYYjc1Qg==","upper_bound":"MnJ1c0hYM28=","repeats":1},{"count":99,"lower_bound":"MnNRSVFrQWtFYmNqcnVlUUhoSGZyMmo5UG1MVTFocg==","upper_bound":"MnpVZjFoRHFq","repeats":1},{"count":107,"lower_bound":"MnpYdHJvUlM4RHUxRDNSM0dNZmk=","upper_bound":"M0JUQ1M=","repeats":1},{"count":115,"lower_bound":"M0NBWE1tcHN3bXVXblF4WQ==","upper_bound":"M09CUzRzNTZWMEZpNWk=","repeats":1},{"count":123,"lower_bound":"M1RpOUJ3MFo=","upper_bound":"M2NZbW9udXRHY3Z2YnUwU24=","repeats":1},{"count":131,"lower_bound":"M2puYlVtVDBkUzNPczhLVHFqbk5VWWwzM05wOXdSck8=","upper_bound":"NA==","repeats":1},{"count":139,"lower_bound":"NDhkd2RQMA==","upper_bound":"NEhVNDd5a0VReE5SY201V3pPcUdiRzlha2ZuYnFwdQ==","repeats":1},{"count":147,"lower_bound":"NE91SDA3QUI2bmhkRGlYVGlZOFo5Q1ROUjhY","upper_bound":"NGJ3S2FBZDY0MlBUNzVqQnZkMlE=","repeats":1},{"count":155,"lower_bound":"NGNQZUZKcWU3","upper_bound":"NGpLTmtzZ0ZiaTBLNktKVnNzMjhT","repeats":1},{"count":163,"lower_bound":"NHA=","upper_bound":"NHhUU29JT1lzS2xWalE0MEM=","repeats":1},{"count":171,"lower_bound":"NQ==","upper_bound":"NTRzZUlEZFRmVmpRczNQZXQyYzFaSWpnT0ViOUczbTk=","repeats":1},{"count":179,"lower_bound":"NUFKTlpCZjQwbnVM","upper_bound":"NU9uUzM2QTFpNlFpQ3dUNlpYNkw=","repeats":1},{"count":187,"lower_bound":"NVVDclhHRmtq","upper_bound":"NVhyMWRtdXRVYmt1aG9iNkpheXQxWExlVzV0emdx","repeats":1},{"count":195,"lower_bound":"NWI=","upper_bound":"NW5jZ0tRM0pKTWlo","repeats":1},{"count":203,"lower_bound":"NW9yOEpSeFQ5R2RPYjY=","upper_bound":"NjY1Y2ZtSnB1ak1pUGpFMml6dzc=","repeats":1},{"count":211,"lower_bound":"NjZGZlZWVjdxWURuVnFKZkZ2","upper_bound":"NkhjdzYwN0ROdg==","repeats":1},{"count":219,"lower_bound":"NlBOYjZ6ZQ==","upper_bound":"NnU=","repeats":1},{"count":227,"lower_bound":"NnVXWUdBR0ZJcGtKdmw2R1hvcHNwc2kwRm9CT056aA==","upper_bound":"NnpHRmhRWXlSSVJUYjJWdUE4cVpE","repeats":1},{"count":235,"lower_bound":"NzR6cUdQZjVM","upper_bound":"N01aeWw=","repeats":1},{"count":243,"lower_bound":"N01sdjVLaVRveUFjbGhaRlFVa3BCVFFDVFdFTnk=","upper_bound":"N3JaanZpQVhoNg==","repeats":1},{"count":251,"lower_bound":"N3J6cHRNcHpVSmRhWlQ5NTF2eHFnakEy","upper_bound":"OER3ODJwT1RUeQ==","repeats":1},{"count":259,"lower_bound":"OEdqb1Y1QXA=","upper_bound":"OFhFQTJhSnc5MFV1S2ptVG0xUkNDTnNWTWNrUQ==","repeats":1},{"count":267,"lower_bound":"OFlEQUtkSHZqVUFW","upper_bound":"OGNSaDlzODJ2NTJnanEwbEt2MnUza1VLZ0JB","repeats":1},{"count":275,"lower_bound":"OGN2a2FwUnFRMHZIeERrRUpOSkg=","upper_bound":"OHJ6ZUNPaFBiNHFhV0lqS0NzS2gxZDdCdlM4T1Y=","repeats":1},{"count":283,"lower_bound":"OHUzaEN2aTFQOFJkclh3Vg==","upper_bound":"OTVzQ0NoNFJjbUZJNnBJRkw0R3ZWZFRFTWxXd3E1bEE=","repeats":1},{"count":291,"lower_bound":"OUpWRzhpWXlyUDZTOHFUU095","upper_bound":"OWJBdA==","repeats":1},{"count":299,"lower_bound":"OWJ4U2dtczNGdEg2U3Z4ZkxtS3lQTQ==","upper_bound":"OW1Dazh2Y2NFNThKcVBENENlMA==","repeats":1},{"count":307,"lower_bound":"OW1TVXU=","upper_bound":"QTNPd1o=","repeats":1},{"count":315,"lower_bound":"QUFrbk9kMHZnRTNhMXYwTE1pamYxTm5L","upper_bound":"QUxETFoxaE9zV3FWWXlWWjJqakdYTg==","repeats":1},{"count":323,"lower_bound":"QVI1dHI=","upper_bound":"QWxGc2RkS09naXZhV05oM1FIeWV5UlQ=","repeats":1},{"count":331,"lower_bound":"QW0=","upper_bound":"QXVDampDTTlGbw==","repeats":1},{"count":338,"lower_bound":"QXZSSlNKYVlES09LZmJs","upper_bound":"Qkg5MEVx","repeats":1},{"count":344,"lower_bound":"QktURmxoY0lhV0QzTXlhRjZwamVDTmgwY0ZTYVA=","upper_bound":"Qk9VdjRUUGRoOU1rVVdGelNG","repeats":1},{"count":350,"lower_bound":"QlFYcU9uTmVwaHhHNFZCRGZqQTMwSVBU","upper_bound":"QlFnd3U4TWQ1dHZtYw==","repeats":1},{"count":356,"lower_bound":"QlUx","upper_bound":"QmFB","repeats":1},{"count":362,"lower_bound":"QmZKTHZ2WFY2eUNGM0k=","upper_bound":"QmtLaTFVeDU=","repeats":1},{"count":368,"lower_bound":"QmxCbENTU3pCZVY=","upper_bound":"QnEyb2lZblpNQzBPdw==","repeats":1},{"count":374,"lower_bound":"QnZ2TUlydWF3NHA=","upper_bound":"Q0gxU0xDSg==","repeats":1},{"count":380,"lower_bound":"Q0pOYnJjMEpKcldQRUVtbk0w","upper_bound":"Q1RrM3Jwajd2eFRPdFhpbGNRVzA=","repeats":1},{"count":386,"lower_bound":"Q1VJY3NETzVl","upper_bound":"Q1hmMkxVY24wV2Y=","repeats":1},{"count":392,"lower_bound":"Q1o3RDdma2ZCak04Q29iY1RUcEgzaA==","upper_bound":"Q2JHcDhrbFZVY1FrVEZIRnNBbnF5","repeats":1},{"count":398,"lower_bound":"Q2QzdkR2Y3lXUkZjYktsRzNnSTJPcA==","upper_bound":"Q2hmN0JpQjNRWm1oOTdKRVlJdTZCZ1NYRDU=","repeats":1},{"count":406,"lower_bound":"Q2xrc1k3a1poM1hyZXl1ZHdkelo=","upper_bound":"RDQ4eXdvOHRvbEo4RkVMYg==","repeats":1},{"count":414,"lower_bound":"REF6T0M5RDFKZjhqUkRCUQ==","upper_bound":"REd5VWxKMFVhdEgzV1JZaHMyd3Z6TDBlSlBnYQ==","repeats":1},{"count":422,"lower_bound":"REhDdzg4","upper_bound":"RFJZWE9DbnlYem9iZkg1ZTFlOGNSM2g=","repeats":1},{"count":430,"lower_bound":"RFJtS0s=","upper_bound":"RHY1TDRqVWlwM2hkajlUbFZhZnEwUXNjSlNx","repeats":1},{"count":438,"lower_bound":"RHhDdW1tcHlnWVdSTldLOWhvWQ==","upper_bound":"RVE=","repeats":1},{"count":446,"lower_bound":"RVFDZWg=","upper_bound":"RWVKZmlWWEJucG9oMnhpQmpPbmNvUm5Xb21scGpq","repeats":1},{"count":454,"lower_bound":"RWVTZzZ6aTI4SEpSMTMzTw==","upper_bound":"RW8wT0xYcjk2ZThDOFB2cVphaA==","repeats":1},{"count":462,"lower_bound":"RjN2cGFoUUN6Um5XWFp1U0Y4WjNGMlRx","upper_bound":"RjVSamRvaDlx","repeats":1},{"count":470,"lower_bound":"RjZVb3VrNU9OMmhZYlE=","upper_bound":"RmJib251b3ZtaXB1TGgzNk1X","repeats":1},{"count":478,"lower_bound":"RmhYM2FWZ2tJWA==","upper_bound":"RnA5bTl3OUJ2OEhzSQ==","repeats":1},{"count":486,"lower_bound":"RzA=","upper_bound":"RzlsS1VyYTZQWVNPMlZhTTJoSU8yc2xCWQ==","repeats":1},{"count":494,"lower_bound":"R0ZjRDZsek1wY1J5VWVHUTBUQg==","upper_bound":"R1FwVEN1cjFrZXFqbng0ZUZycEM1","repeats":1},{"count":502,"lower_bound":"R1Npd1FqYlNnUms0akJiUnpxZHR2bUVFalhPZ1Y=","upper_bound":"R1pSV3B4SFh5NlNhVkR6M3VCb3VwNzRGWXdWYnNt","repeats":1},{"count":510,"lower_bound":"R1p6VlNCOU9Ld0o4aThvdVR1WjdHUTc=","upper_bound":"R3JrSzhTR3RMNHpGWWtmaA==","repeats":1},{"count":518,"lower_bound":"R3ZTWFhqTXh6MmdNZWd2QjdlMmJrakpPbk9ROVJmcw==","upper_bound":"SDU4RHZpZUxhTWVlYg==","repeats":1},{"count":526,"lower_bound":"SDZCT0NuVGZxSzU=","upper_bound":"SEdobFYydml6N3hIUlpCRFJoOWdNQ1NON0RzWk40RGU=","repeats":1},{"count":534,"lower_bound":"SEs3M1l4YjRYcURSNg==","upper_bound":"SFhESFBEakpvc0hmVVBveXh4bmpmTkJqWUt6bmk4aA==","repeats":1},{"count":542,"lower_bound":"SGJiRkdDOTZ6OWZS","upper_bound":"SHZrNnFhTk5ZRERCZ2cxRmdXUk5HZ05Bc1U=","repeats":1},{"count":550,"lower_bound":"SHlTT0h0QVNMdnc=","upper_bound":"STZiVW5QYUViVg==","repeats":1},{"count":558,"lower_bound":"SUJzZzNWUHowRA==","upper_bound":"SUYzWkhuU2xLWTBHbGozcXVIa1FGRUdvRFI0eQ==","repeats":1},{"count":566,"lower_bound":"SUgxMlRHQ1lublpi","upper_bound":"SU1HUlc=","repeats":1},{"count":574,"lower_bound":"SU5NMEdmZnVlblU2ZzRBZlp3U3FUdw==","upper_bound":"SWFFWkZPcmY3cXpQMXoyMExsTUVjcVRuWmVNQTVucA==","repeats":1},{"count":582,"lower_bound":"SWpSQWV1ajdw","upper_bound":"SXI=","repeats":1},{"count":590,"lower_bound":"SXNMZXRoU1hGemt5OVZLVHY5RVZFRVlpU0hGZXM=","upper_bound":"SXdlWEl5WExzN3ZjT2VhWGxmR2pCazF2bg==","repeats":1},{"count":598,"lower_bound":"SXp5RlBQVzlnaEMz","upper_bound":"SkNqa1N5WWQ=","repeats":1},{"count":606,"lower_bound":"SkVOZDdtN1BSTEY5T0Fab2c2ajJl","upper_bound":"SlM4WXZuRVZZNTRMYlZOTEJHUmc=","repeats":1},{"count":614,"lower_bound":"SlpDdHcxN3NEcjBNQnhFYlk3T21GbFYz","upper_bound":"SmZtNHVMdWdQWUc=","repeats":1},{"count":622,"lower_bound":"SmhwNEc=","upper_bound":"SnNTbGgyelRNNjh2OWRMd09mYnFsbkhOUGlkcm5I","repeats":1},{"count":630,"lower_bound":"Sw==","upper_bound":"S0JvYVRaZ1Vtd1I1QUtSWVI1","repeats":1},{"count":638,"lower_bound":"S0ZYOW4=","upper_bound":"S0w1VGh6QkNMaGY=","repeats":1},{"count":646,"lower_bound":"S05mWQ==","upper_bound":"S2M2SG52","repeats":1},{"count":654,"lower_bound":"S2VCSUFvdnBCeWxuSGxPVDdxWlhmWUdhRzE0c0Y=","upper_bound":"S21LQm85WE1Xckt3VnRxNg==","repeats":1},{"count":662,"lower_bound":"S244","upper_bound":"S3VROU5Fdkp2VFg=","repeats":1},{"count":669,"lower_bound":"S3llSXE1cU5KVA==","upper_bound":"TDhsbW5wUk9wTGRSU2xpZXNWVkptS1JmU08=","repeats":1},{"count":675,"lower_bound":"TEdkM3hwU0N5RDU=","upper_bound":"TE5CazFGZHg0RndrTUpudU5uak0=","repeats":1},{"count":681,"lower_bound":"TFI5dW5aMkdQMEQ=","upper_bound":"TFZoR3hxMWFWcWFFSUxReVdRNWNJMTR3eQ==","repeats":1},{"count":687,"lower_bound":"TFhsN2RyQg==","upper_bound":"TGZib2FGbDFHbktmbmZUUXZyTnhqR09r","repeats":1},{"count":693,"lower_bound":"TG1JY0hWdzltemh0","upper_bound":"THJ1WXB6NTVWVWpTdjFHam1qZnNRUkJ6ZlJUVWs=","repeats":1},{"count":699,"lower_bound":"THNMMUViNnAzMVhRUFo3bg==","upper_bound":"TThnUDZQWGROT21VTGpm","repeats":1},{"count":705,"lower_bound":"TUZVbjdo","upper_bound":"TUpBcjlWemVZMmc4YmtwUTA1OU9SRElkbkZwaWZyazM=","repeats":1},{"count":711,"lower_bound":"TUxUUnpEbzlUZUwwNQ==","upper_bound":"TWJjYVRaNk9uY0p3UWc0ajZ6M1hsYnl4VVZ6ZHg5ag==","repeats":1},{"count":717,"lower_bound":"TWRUdDVFeHFMVTVqd295QVFVT2pnNVhqcURvS0FvSnM=","upper_bound":"TWlsMGZ4RE9IZDIyR3d2eDVGa0E1RGF2WmFU","repeats":1},{"count":723,"lower_bound":"TXdGaVFmSVdBTVNkSg==","upper_bound":"TXp0bzg3NkNCZkc=","repeats":1},{"count":729,"lower_bound":"Tg==","upper_bound":"TkJoWGpWMlJ6YzE=","repeats":1},{"count":737,"lower_bound":"TkVxcWptaUJnTXY1azRweXU2bzU0YVcyaDZQVFg=","upper_bound":"Tk9aTUx3emRmM1ZJY3g=","repeats":1},{"count":745,"lower_bound":"TlZB","upper_bound":"Tm9XUk80RDdmOUFKcXRvY25LNkptSE1neDROMA==","repeats":1},{"count":753,"lower_bound":"TnFhMXdtcU4=","upper_bound":"TzFhNzlaSkdrSldvOW5lV3Q=","repeats":1},{"count":761,"lower_bound":"TzJYd0x2S0VrRVYybkk0b0NjMzlpZ2Q=","upper_bound":"T0FtSmFwWnNENUthcQ==","repeats":1},{"count":769,"lower_bound":"T0NZR1BM","upper_bound":"T0w5Y0MxTWZpRjN6aDVTc1R1OUcxYm9vdllWdFA2NGY=","repeats":1},{"count":777,"lower_bound":"T01xdlRpYWhpMzA4RmJy","upper_bound":"T2dkTTN0dTlUQmUxTWpWd3ZzN2xDNFY=","repeats":1},{"count":785,"lower_bound":"T2tDeEx4RmNKNXd5aDF2ag==","upper_bound":"T3EwZ0pjck44bTZmcFNzMmI2WDdLa041aE9IS3Frb0k=","repeats":1},{"count":793,"lower_bound":"T3JIQk1NT3k3","upper_bound":"T3ZHT2VEdWZrTk9aVzBYMFZNb2VFbnVlNWVT","repeats":1},{"count":801,"lower_bound":"T3pESDlqNVB0Wk85Rjg=","upper_bound":"UEVJdXo=","repeats":1},{"count":809,"lower_bound":"UEZ3eDQ3Y0JveFMzYkRoNnI1cnR0WmI1SmhObnU=","upper_bound":"UEw=","repeats":1},{"count":817,"lower_bound":"UE1RbWJDYjBGQTF4NjNUR2NIQWVPZ0hWM0UwVkxRREs=","upper_bound":"UFp2VkJl","repeats":1},{"count":825,"lower_bound":"UGIxNUpRQ3pJaU1OOWduVGRvWk1aMw==","upper_bound":"UGRXbjQ5aFB6RTRXekpBT2xpQUo3WExS","repeats":1},{"count":833,"lower_bound":"UHBMZzZFczRsQ291SnNLSXdi","upper_bound":"UHNxNmYzc2ljZ3gxOHZra1ExbWFEVjY4d3Z5Uzcw","repeats":1},{"count":841,"lower_bound":"UHR6SzZ6VUxOd2pXeldSelJNYWJEUHA=","upper_bound":"UHppenFoQzBjWEs4cGE=","repeats":1},{"count":849,"lower_bound":"UTI2TzF0clZrZldQNTVFNw==","upper_bound":"UTdIOUNTekhTUlF1V1FxMlhHclpBSERtRjM4","repeats":1},{"count":857,"lower_bound":"UTdiWlZNOFBibmR6dFBVUE1DaXJCS0RDdVBTbm9Ycg==","upper_bound":"UUpRaXJxdU9SbERkZVZqTg==","repeats":1},{"count":865,"lower_bound":"UWQ3MElSUjlacE5sR0l1ZnVORndYSmM0WVVHbmo=","upper_bound":"UXNrbzhSS3VKOUY0","repeats":1},{"count":873,"lower_bound":"UXN1Ums5a0c=","upper_bound":"UXp0SjNGMXlqSnhpSnBRa0pIZDR0eExLOVJna1E=","repeats":1},{"count":881,"lower_bound":"UjFyVzV5dlZLSG0xeDhFbmpBTnFqSXFXcVdLT2tXZQ==","upper_bound":"UlRJenFQeUVnQTJkQkpzWm1ZYlBDenA=","repeats":1},{"count":889,"lower_bound":"Ulk=","upper_bound":"UnA5MHh4RzlZcGNVc1UyWmttWDNPaGt3","repeats":1},{"count":897,"lower_bound":"UnRiY3R0MzU=","upper_bound":"U0NDRmRPbHI4Yjk=","repeats":1},{"count":905,"lower_bound":"U0ZFbzZSYWQ=","upper_bound":"U1NNM05pTmd2alFCUjBRNzdPckFHUEFGZmJrcm9C","repeats":1},{"count":913,"lower_bound":"U2FBb0FMTVpH","upper_bound":"U2lhelZlRzJkWg==","repeats":1},{"count":921,"lower_bound":"U2wyMUl3a3NpR1JLZWFXZUNuYzVWMm9YelJzZ1g=","upper_bound":"U3JqYmp3S09PRGQxWnpYdzVjdXhNbGhwTzNEV2Y=","repeats":1},{"count":929,"lower_bound":"U3NVT21FU1Z3YnExV3NKaEVibnZPWVpOR1E5eU5XMA==","upper_bound":"U3Y3UmdadVZodkhTZTRtT2poSWQ3aWp4TGhneDR2","repeats":1},{"count":937,"lower_bound":"U3ZEelllT04=","upper_bound":"VA==","repeats":1},{"count":945,"lower_bound":"VDE1RG1yeGxiMlZLZEJW","upper_bound":"VDRENmdNaENCMkFDWGpaSEtyNXk4Y1pjVg==","repeats":1},{"count":953,"lower_bound":"VDVXeGhnRQ==","upper_bound":"VEp1OFVUbVhkMHVqeg==","repeats":1},{"count":961,"lower_bound":"VGE=","upper_bound":"VG5PZjAzb0syeUlMQ3BvVm5tbm1xOW5IaEY3NA==","repeats":1},{"count":969,"lower_bound":"VTBJQg==","upper_bound":"VTlOTThaR3d4czB2","repeats":1},{"count":977,"lower_bound":"VUZCbmpDcExzdmdTVEh0bTI1Y2E=","upper_bound":"VWZ4TEhBekdnNTc1UTY3WVo=","repeats":1},{"count":985,"lower_bound":"VWlJMA==","upper_bound":"VXdydEZYVTdKR3RnTzJmbFNEWE0yYldVNHloVA==","repeats":1},{"count":993,"lower_bound":"VXg=","upper_bound":"VjE5VG80TFJ6VjJ2dg==","repeats":1},{"count":1000,"lower_bound":"VjFKUFE3V05wamI0UlYxZTFRZQ==","upper_bound":"VkM0cmlRUkdub1ZwcDFucjk0UjhqSA==","repeats":1},{"count":1006,"lower_bound":"VkM1TmtjY3l5S00zclJhUnNZc003RFQzcWhxMEI1","upper_bound":"VkQ3a1JtVldvY2tVOWNOVg==","repeats":1},{"count":1012,"lower_bound":"VlB3V0F2Sm5YZ2ow","upper_bound":"Vlk=","repeats":1},{"count":1018,"lower_bound":"VmxsSXc3MmJ6TXhqZkpZVEI4TkpDWGN4T1c5","upper_bound":"VnFQazBIOFhGUHowR3BROFV4a2F2RExPbA==","repeats":1},{"count":1024,"lower_bound":"VnFyRWdmQ1RxbkxUdEg3QzF3YmcxSjY0ZnBXcUg=","upper_bound":"VnJNbVBMZDJLNjlZRkk1QmQ=","repeats":1},{"count":1030,"lower_bound":"VnJt","upper_bound":"VzJGNEVjckVrMUx3QzQ5OFU=","repeats":1},{"count":1036,"lower_bound":"VzRtNXJw","upper_bound":"VzlwaFVh","repeats":1},{"count":1042,"lower_bound":"V0JuMUxuQXg3c1pYRko5dlVBZkd0VWN6YVd0RFZxbEM=","upper_bound":"V2NFVFBwT3pZQ0NRQW9ndHdCWXhQdlo=","repeats":1},{"count":1048,"lower_bound":"V2N2d3hNWWFvMHM0VWZ0c2RsRThiSENSM0hueA==","upper_bound":"V2dtMkZnMGV2ekVyR2o1R3ZzWmlVRVpOM2k1SjVX","repeats":1},{"count":1054,"lower_bound":"V25RYjk=","upper_bound":"V3lFRklSM2ZlUXlXTFBtbmwyZVVNemYxU3Zra2Q2a3M=","repeats":1},{"count":1060,"lower_bound":"WA==","upper_bound":"WDBlMVFDQ3l0MGdKMFlMU2hQMFhlelI1VlY=","repeats":1},{"count":1068,"lower_bound":"WDRsckV3eXpadg==","upper_bound":"WEdQbWJuT1RmaW51RjJrTGszZ09Wa0U3azUyZA==","repeats":1},{"count":1076,"lower_bound":"WEhSaW5OYQ==","upper_bound":"WFRC","repeats":1},{"count":1084,"lower_bound":"WFl4WnhDU0Z4R3J5RjJFZ3hkeEpXeWRuTktLejE1","upper_bound":"WGNaaVk0V2ZqcVBxR2hneGo2Vmx3aHFWT0VPekQ=","repeats":1},{"count":1092,"lower_bound":"WGVnbHR5clE=","upper_bound":"WHFlNXZnSjFVck4wUFpNNXQ1TjFXZVZ0OGE=","repeats":1},{"count":1100,"lower_bound":"WHU3VTNjYmR3bXV2c2hldDVnYw==","upper_bound":"WUJTUURONUNUVVNGMHpuWUQ4eGNpWDRqSm5CMVZrVkw=","repeats":1},{"count":1108,"lower_bound":"WUdGd25MZ25RM09mT2RKcXB5cTNocGtlT3FIVmk=","upper_bound":"WUxKTVZ1MlFIcA==","repeats":1},{"count":1116,"lower_bound":"WU1lMXVtRmpyUlBLbHZINw==","upper_bound":"WVJZaEUwSA==","repeats":1},{"count":1124,"lower_bound":"WVY5aHVNeWozY1RYbGdZQnEzOXQwVk8=","upper_bound":"WWF5QnJodnl3eU9QaE03ZlRmY2dm","repeats":1},{"count":1132,"lower_bound":"WWVtVDVzRQ==","upper_bound":"WXJZb2Q1aw==","repeats":1},{"count":1140,"lower_bound":"WXhNdDVyRVE0Qmw4QjVURlkzbm5u","upper_bound":"WkVDS2tueUND","repeats":1},{"count":1148,"lower_bound":"Wk9m","upper_bound":"WnZ2NU9ZeQ==","repeats":1},{"count":1156,"lower_bound":"WnpYZWRlWnQ=","upper_bound":"YTRkWUNDRUtzODJnNmlKM1EyRjhGRThF","repeats":1},{"count":1164,"lower_bound":"YTZUcDZpNGVNQUNrYzc0cUI4ZkhtcEpwaw==","upper_bound":"YU1Fa1d5SkFWajlrOFA5TWFsRGw=","repeats":1},{"count":1172,"lower_bound":"YVBIYkx5UHdLZ0ZUM3cz","upper_bound":"YWRXbUtzaFVudWlWQ3pUZQ==","repeats":1},{"count":1180,"lower_bound":"YWZDNDVIaXlVNTJsU2VDMWlwbWpuZk9nSU5neDM=","upper_bound":"YW55cElZUTFkbWs1VVdISGZqWWdMOHFpNUZlZXZB","repeats":1},{"count":1188,"lower_bound":"YXBLYXRGdnBGVTVWSA==","upper_bound":"YjR1b0NnUTV4bGtUeXZ3NnVuNA==","repeats":1},{"count":1196,"lower_bound":"YkE1bg==","upper_bound":"YkNTWTdaVUt3Y2p2SQ==","repeats":1},{"count":1204,"lower_bound":"YkZNekM=","upper_bound":"Yk9Idjdid2xyaFdHNDJzT2o4TXg3c1lwNA==","repeats":1},{"count":1212,"lower_bound":"YlVxOUhmWmpKUWw4TDE=","upper_bound":"YmgwWkhrV3g=","repeats":1},{"count":1220,"lower_bound":"YmxleWkxb2wzRUQxdzdVWlJmb1VIU2JlZw==","upper_bound":"YnFvUmY4VG1ZZU9GOEhlSFdBcU9wam9IcQ==","repeats":1},{"count":1228,"lower_bound":"YnJ0RTlKdzJ6SVF0VW5pdWhFaE5mZ3Fia3oxSE1i","upper_bound":"YzNsVzZnWUduTUNVeEJE","repeats":1},{"count":1236,"lower_bound":"YzU=","upper_bound":"YzkzTjN2T2tGb3NidFhmUW9vMms=","repeats":1},{"count":1244,"lower_bound":"Y0xVajJSdw==","upper_bound":"Y1JRZ21iWHpy","repeats":1},{"count":1252,"lower_bound":"Y1VIdmxZMzU=","upper_bound":"Y1drcVhXSEhqTkY5eWxvamZ4OTI=","repeats":1},{"count":1260,"lower_bound":"Y2MyakVMQ1UwVTdGMjZyYlVwOHZCRzJIQnBF","upper_bound":"Y2xSR2M=","repeats":1},{"count":1268,"lower_bound":"Y21oY3QzdzNNVHFXdUtCaVhLM1diMDVDZGhvYktDZg==","upper_bound":"Y29Ga0hDMnNWU3hnY2lpTDByVWk3TTBv","repeats":1},{"count":1276,"lower_bound":"Y3NObWVwNWdzR3c1aE1FdXZMUmZTS2xGUkxBdzFVNw==","upper_bound":"ZEdGSWRSNHZOeHBoeEpTSk4xc011dzRh","repeats":1},{"count":1284,"lower_bound":"ZEh5VERPT29oR09JUWtXc01nSnNWMEg0WjFCVGQ=","upper_bound":"ZE5UYlN2N3VVR29hd0lEWEpkQnhXV1hEYlFN","repeats":1},{"count":1292,"lower_bound":"ZFRjVHpydFhq","upper_bound":"ZG5FbWE=","repeats":1},{"count":1300,"lower_bound":"ZQ==","upper_bound":"ZTNsVVN5SmtjZzJTUHVL","repeats":1},{"count":1308,"lower_bound":"ZUMybVo=","upper_bound":"ZUpYcU9DQU1FTXQ4NXZ3aG1PSzF6YmdBYmk=","repeats":1},{"count":1316,"lower_bound":"ZUt2RWF6UGJCaUt0cTdUVURVMDZDdWxr","upper_bound":"ZVVMZlRYbEE1VDZRaXVMSjFJZ0FQazBRYzNQeEhT","repeats":1},{"count":1324,"lower_bound":"ZVZmZHd0WDdMUG56cmdLaDVFb2pm","upper_bound":"ZW1YdUtTRHh6VA==","repeats":1},{"count":1331,"lower_bound":"ZW5oa3dQNkpTY3lXQWNERFFFRDFzbmJWcUFVclh3","upper_bound":"ZW92QTAwOEhyRm9CbDdN","repeats":1},{"count":1337,"lower_bound":"ZXIyZnY=","upper_bound":"ZXR6MWtaWnNIb1FydWZZdmM5eHczQTdsSmg3QXFp","repeats":1},{"count":1345,"lower_bound":"ZXY4UGNJb3VVbEc=","upper_bound":"Zg==","repeats":2},{"count":1351,"lower_bound":"ZjlFZ2ZOaGRGZzVXTlNURkw0UlJjc1FTN1VNYw==","upper_bound":"ZkE=","repeats":1},{"count":1357,"lower_bound":"ZkcxZU9hSzFxU0RhN3ExRms=","upper_bound":"ZlNmWmFCeTJHMTlMN2FlMGRieUliOFdo","repeats":1},{"count":1363,"lower_bound":"ZldTVEl4Vw==","upper_bound":"ZmJRVG9oTWhCSA==","repeats":1},{"count":1369,"lower_bound":"ZmhlMlF4SFBaWFQ1","upper_bound":"ZnU4UUh6YkxVMFBhcjQzVElSVzkyYjlsQ01GZkN4Yw==","repeats":1},{"count":1375,"lower_bound":"ZzFNTmdZaG5wdlVKTkd0MjFibkZxdVNt","upper_bound":"Z0Y2cw==","repeats":1},{"count":1381,"lower_bound":"Z0dhVmhONVRLczc=","upper_bound":"Z0t2TUx6eDZqVg==","repeats":1},{"count":1387,"lower_bound":"Z044OXEwWmladG9FUnhnRjFURHV4bk5qVlEzRE56eQ==","upper_bound":"Z1I0Y0xpS3lJanI=","repeats":1},{"count":1393,"lower_bound":"Z1JsNTlTSVdVMHRET2E0QXZYTllZbkE5UHFZ","upper_bound":"Z2hacXBqMFBZakk4T0lUNFZK","repeats":1},{"count":1403,"lower_bound":"Z2tGNUF6aWJPSlBkOFFONWJkQVhBNXFIT2Q=","upper_bound":"aA==","repeats":2},{"count":1411,"lower_bound":"aDQzNWM=","upper_bound":"aENEVDA1VUVBZk5FMVVXdDZweUZkeA==","repeats":1},{"count":1419,"lower_bound":"aEcwZmFMTElYMjFqYW93Zg==","upper_bound":"aE1jZE5TV3k=","repeats":1},{"count":1427,"lower_bound":"aFB0","upper_bound":"aGZ1Q0oxMkR6OEg1WEdKS3JRYWxJc2VzTDZo","repeats":1},{"count":1435,"lower_bound":"aGduV0djWk1xR0phQmZhVU8=","upper_bound":"aHZHeGl5Zw==","repeats":1},{"count":1443,"lower_bound":"aHo2eDJlZ2VCN2FiTERQeEwwOQ==","upper_bound":"aQ==","repeats":2},{"count":1451,"lower_bound":"aTF3MTh4Z3Axejk4UllnWlpVaW5YZ3RkZ2ZRckl5V2E=","upper_bound":"aThY","repeats":1},{"count":1459,"lower_bound":"aTlUcFczcXhhUA==","upper_bound":"aWF2alpEVVhZNkJtUERFM3JURzc=","repeats":1},{"count":1467,"lower_bound":"aWNGUm9Jdw==","upper_bound":"aXVuR3NSelhIT0lXZUpwM21sMw==","repeats":1},{"count":1475,"lower_bound":"ajN5OHlGNmxFc2NLcVYwWHg=","upper_bound":"ajlFaTlra3A1UVcxaXV3TXNOUzhOd3RNdkQ0OUdO","repeats":1},{"count":1483,"lower_bound":"akJQ","upper_bound":"aks5VEpqQ1M4RHNoOGNhaDI=","repeats":1},{"count":1491,"lower_bound":"alduQk5PUFhyd3A=","upper_bound":"ank1","repeats":1},{"count":1499,"lower_bound":"azFLejlCRXFCUw==","upper_bound":"a1E=","repeats":1},{"count":1507,"lower_bound":"a1R0blpRcDI4cHg0TWVxOXJmNVJL","upper_bound":"a2R2Vll2cU1tcmdzT3RWMlpYSU0xMGhaekxlYg==","repeats":1},{"count":1515,"lower_bound":"a2VKcmpPSU9RZVRwQWwxZnRoRDRTRmdj","upper_bound":"a21FMHRpekt4YQ==","repeats":1},{"count":1523,"lower_bound":"a3BZ","upper_bound":"bDlQbEFOU2k0NXBVRkdqVERoYkMzS3M=","repeats":1},{"count":1531,"lower_bound":"bEV6cGFIQ2FVUUxzN0FsZmhaaThvaHR3","upper_bound":"bGYwaldsMnhVSmFkSEJxTUlaQTJDb2lVWEVkbW91","repeats":1},{"count":1539,"lower_bound":"bGhpS3laOE5PRGRpU1cyNEJ6M1QwS3dDc29m","upper_bound":"bHVhcVdi","repeats":1},{"count":1547,"lower_bound":"bHdwV2ZERjNtQjRSWnM1b2hRRUZV","upper_bound":"bTV3dHB3ZkNadVdPcHB4Wlk2SlVhMQ==","repeats":1},{"count":1555,"lower_bound":"bTdlMnpsZ0QyeGtWVXNDNQ==","upper_bound":"bUVTb3ZjaTV2RA==","repeats":1},{"count":1563,"lower_bound":"bUdyMG5aQlBuVGJCOUs5ZUFrZUVYdnBB","upper_bound":"bUpuOTVoZXVTMjlNZkplOVAxVENVbUpvQkpYZUNS","repeats":1},{"count":1571,"lower_bound":"bVAxUDZDeVI3Zg==","upper_bound":"bWR6OHZiTTJZcmxxZWQ2dXJObUxaS1pxaTBXMkZt","repeats":1},{"count":1579,"lower_bound":"bWhY","upper_bound":"bWxRY0JtWFlvWGJLY2VRYUpmZzlTdkZiWU1h","repeats":1},{"count":1587,"lower_bound":"bW84b3NBc2NpWUIxNTRGN2Fk","upper_bound":"bXkybTREQkN3QXpra3BVMkw=","repeats":1},{"count":1595,"lower_bound":"bXlqNWpSSTFzYjE1aEMzSEplVTdQMw==","upper_bound":"bkFFaWZuaEREUDVMY2hYc2RTWUJ1ekVnNWVTaw==","repeats":1},{"count":1603,"lower_bound":"bkJCV3BP","upper_bound":"bkdKcHM0","repeats":1},{"count":1611,"lower_bound":"bktaWlRQcjUwWGZ3aQ==","upper_bound":"bmFzendUdDBp","repeats":1},{"count":1619,"lower_bound":"bmQ0Y0E0NEVaU3NEV2JZOQ==","upper_bound":"bmpqMVRpYjBkYk9QUGtJ","repeats":1},{"count":1627,"lower_bound":"bmxrcXNaS3NFMEJ5QlhiVXNkN08=","upper_bound":"bndubDlPNVRQSWhmbFllc2JXSmpwUElqRA==","repeats":1},{"count":1635,"lower_bound":"bw==","upper_bound":"b0Uyc0U2M3hVbg==","repeats":1},{"count":1643,"lower_bound":"b0VkZktKOVZVbEViREJndmpjbw==","upper_bound":"b0t4WWdqZzlYRk1aMzNZenFFNXo1MWE=","repeats":1},{"count":1651,"lower_bound":"b1NLaFIyaGp3Y1Jpcm5ITEFDOXRIekZtTm9R","upper_bound":"b25FZFhPbWlnVFg=","repeats":1},{"count":1659,"lower_bound":"b3JLNA==","upper_bound":"cDdqVE9zaA==","repeats":1},{"count":1666,"lower_bound":"cEE0dE5vcXpvVWhtTUJYSU1GUTlhU050MGdaNld4Tg==","upper_bound":"cERka2lFTW9FU1hQeURRS3E=","repeats":1},{"count":1672,"lower_bound":"cERzWDI=","upper_bound":"cEs5Y042cGd3SU1kVjFpVUh2a0F1M1NPWGhs","repeats":1},{"count":1678,"lower_bound":"cExNNmFvM2ZTSzNITzBsaE5GeUl2alVsSHFvbUtFVFc=","upper_bound":"cFRFNGxIaURTemRSVFE=","repeats":1},{"count":1684,"lower_bound":"cFZpVWFBWkhDUnZo","upper_bound":"cFprNTIy","repeats":1},{"count":1690,"lower_bound":"cGFWa2R3MHNQWmhERVE5SUpNOVR1eVM=","upper_bound":"cQ==","repeats":1},{"count":1696,"lower_bound":"cTlBdWY0SVk1bHk=","upper_bound":"cUVZeWl5emw1ZjNTTUF3SHBy","repeats":1},{"count":1702,"lower_bound":"cVJYYTlBRkpTcnZBaDlva1RpV0VRbHpPbFJqY0w=","upper_bound":"cVU=","repeats":1},{"count":1708,"lower_bound":"cVhqQTF2SFN5VzhkQ3AxdEJPTg==","upper_bound":"cWZocGI2c044Snk0Q05ZUg==","repeats":1},{"count":1714,"lower_bound":"cWdmbUs5SmZWbzhqTFdIaGJVa1BXZVQ4bG4zVnlMSXE=","upper_bound":"cXBN","repeats":1},{"count":1720,"lower_bound":"cXVqYVVrdVVHT1dPMEZXNklTNmVvQWozUWQ=","upper_bound":"cXdLRA==","repeats":1},{"count":1726,"lower_bound":"cXhkQWhnYg==","upper_bound":"cjFTdWM4YklKNWJ0UUZkNDZ0R0U=","repeats":1},{"count":1734,"lower_bound":"cjRzVlo3MGVUamRoOVUweEFE","upper_bound":"ckZWNDZBdml4","repeats":1},{"count":1742,"lower_bound":"ckpXVGFCVXVR","upper_bound":"clp0MjJaWjZkbGhRRE16M0libHdtbk9XeUdO","repeats":1},{"count":1750,"lower_bound":"cmFZcUJBM0Y2","upper_bound":"cmJWdldKTVZv","repeats":1},{"count":1758,"lower_bound":"cmNCVGd5eEU=","upper_bound":"cnFXM0Y5aDVqcTZLYmxyaGNU","repeats":1},{"count":1766,"lower_bound":"cnRSWFVMRVFKeEdoNkhMTDVqMVpUVDZ1UWVXbw==","upper_bound":"cnoyUnhm","repeats":1},{"count":1774,"lower_bound":"czE4a2RUY1M2bEh2ZHI1czcxU0FVSnRX","upper_bound":"c0lxTmE2TUpKZlIzTWJhZmFVTzJi","repeats":1},{"count":1782,"lower_bound":"c0xOYWQ5MTFwOTR4","upper_bound":"c1hZNDVLdm5jVkxYNFc5MlRRSmlQajZtNTFUWDdD","repeats":1},{"count":1790,"lower_bound":"c2I4MmNpRkI2VllGMFBPQnpyNEVkZmdIMlpz","upper_bound":"c2p3YXJtdGtl","repeats":1},{"count":1798,"lower_bound":"c25tR1NzM1F5cDNDUkRG","upper_bound":"dA==","repeats":1},{"count":1806,"lower_bound":"dDJZRTh1NU9DVmt3QVdrZg==","upper_bound":"dEJTY1BTOHNLeFNQSGw=","repeats":1},{"count":1814,"lower_bound":"dEc2OHZkMjly","upper_bound":"dGc4UWtleFNt","repeats":1},{"count":1822,"lower_bound":"dGhlUUFOMWNhcmJ1bXJoeWZSdWlH","upper_bound":"dHhyZ2E0MUUyVGpjb3BhWmQ1RkJLQw==","repeats":1},{"count":1830,"lower_bound":"dTFJbw==","upper_bound":"dUpzbUJSWjl5c3ZEOUlMZw==","repeats":1},{"count":1838,"lower_bound":"dUtrMVN1SVEwZFlqQWJrNjI=","upper_bound":"dVU4azJ1cHk5cml1RTJqVVdJUVBQdUlnMElH","repeats":1},{"count":1846,"lower_bound":"dVZyVFZSbGpU","upper_bound":"dWE1MXJyaDNvVFBwSWhuWlZ1UUZu","repeats":1},{"count":1854,"lower_bound":"dWFFUzZNVGxHUHp2UFY5","upper_bound":"dXQ=","repeats":1},{"count":1862,"lower_bound":"dXV0azY0RVZmWmJua0VsWk9jTzgzVHZxMGUzRk1kUw==","upper_bound":"dkNoN211ZVhjSjg=","repeats":1},{"count":1870,"lower_bound":"dkY4eVRZak1LQkQ2","upper_bound":"dmNPQ0xzS3NGRUxX","repeats":1},{"count":1878,"lower_bound":"dmxrVG84Y1BQNURaYjI=","upper_bound":"dnhQVFAyS3F4S3cyRDRrRm1ySzFUSQ==","repeats":1},{"count":1886,"lower_bound":"dzFpNVc1OEJGVDJWVlBDN0V5UGpMdzVSOTVmOVU=","upper_bound":"dzRudkV4UEZrOQ==","repeats":1},{"count":1894,"lower_bound":"d0FIWmtMN2xWNllVYmlKRWhJbWJM","upper_bound":"d0tYN3JsSGhTQTJvNFdRWHh3bjU=","repeats":1},{"count":1902,"lower_bound":"d1JxWWI5SEJpcEp0MUU3Yw==","upper_bound":"d2N1WUU3d0RFdFI=","repeats":1},{"count":1910,"lower_bound":"d2RGYWFzMzZidXZxVm1aSHJRQWN0MXNIYXptRQ==","upper_bound":"d2lWamdZNGRmbHFxMFhxcHVwSTZBT1g4OWJBWUpV","repeats":1},{"count":1918,"lower_bound":"d242eVd6T2Q1NXNjaUVXT3RSVGE2bW9ieFVHWDJE","upper_bound":"eDB0YzZzZGtsUlRm","repeats":1},{"count":1926,"lower_bound":"eEJXZUhqcEFDNHBoaQ==","upper_bound":"eFVUTEN3cVNtQkQwcXI=","repeats":1},{"count":1934,"lower_bound":"eFg0UnE=","upper_bound":"eG5zVFdmeA==","repeats":1},{"count":1942,"lower_bound":"eHRWcktYVVZz","upper_bound":"eTFBYmR1VWI=","repeats":1},{"count":1950,"lower_bound":"eTYzYlRHbThDekxMYjQyMG9pa0lB","upper_bound":"eWJzampScXBQM2htNTVqWXU1QzJCYThZTnpjbg==","repeats":1},{"count":1958,"lower_bound":"eXE=","upper_bound":"eXhCY29nSFNrRk11RmRoNw==","repeats":1},{"count":1966,"lower_bound":"eXphaE42dWxlanN6QVRhc3g3","upper_bound":"ejhMaE9OaE04dkI4TlhqbE84bjVaWHBPTGRhbnBUNHU=","repeats":1},{"count":1974,"lower_bound":"ekE=","upper_bound":"ekVqME9LNVp4TDFCRDI5c2prdEY=","repeats":1},{"count":1982,"lower_bound":"ekp0aWp6WQ==","upper_bound":"elgwdFNFYzVW","repeats":1},{"count":1990,"lower_bound":"empRZEpybVE=","upper_bound":"enRoZ1pM","repeats":1},{"count":1994,"lower_bound":"enRzSjl3MUJHN1VXdA==","upper_bound":"enY4VG9QNWZ5ZW9zdlVRRDRZUkdiMUw0RQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,0,0,0,0,1,0,1,2,2,0,1,1,0,0,0,3,0,1,0,3,1,0,1,3,1,0,0,1,1,2,1,2,0,1,0,1,2,2,1,0,1,0,1,0,3,3,3,0,0,1,0,1,3,0,1,0,1,0,1,0,1,1,2,0,0,1,0,1,1,0,3,3,0,0,1,1,0,1,2,0,1,1,1,0,0,1,0,0,2,2,1,0,3,2,0,1,2,0,0,2,3,0,1,2,0,2,0,0,1,2,2,1,0,0,2,0,0,1,0,1,1,1,0,0,2,2,2,2,0,3,0,1,0,0,2,1,1,0,1,1,0,0,0,2,1,0,0,2,0,0,1,0,1,2,1,2,1,1,0,1,1,0,1,1,1,2,1,1,0,1,1,1,3,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,2,0,1,0,3,3,1,1,2,1,2,0,0,1,0,0,2,3,0,1,1,1,2,0,1,2,1,0,4,0,0,2,0,0,1,3,1,1,0,1,1,0,2,1,0,2,4,1,0,1,1,3,2,1,3,1,1,1,0,0,0,0,0,1,2,1,1,0,1,1,0,1,2,2,1,2,1,3,1,0,1,2,1,1,2,2,1,0,0,0,0,1,3,1,1,1,1,1,0,0,0,1,1,1,0,2,0,2,0,0,0,0,0,2,2,1,2,2,1,0,1,0,1,1,2,0,1,1,2,2,0,1,2,1,3,0,1,0,1,1,0,2,2,0,0,0,3,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,2,0,0,0,0,0,1,1,0,1,0,0,1,1,0,0,1,2,0,1,0,2,0,1,2,1,0,1,2,0,0,1,1,3,1,1,3,3,2,2,0,0,0,1,2,1,2,2,1,0,0,1,2,1,2,1,0,1,1,0,0,2,1,0,1,2,1,0,0,1,0,1,0,1,1,0,2,1,1,0,0,0,0,1,1,1,0,2,0,2,0,1,2,0,0,1,0,2,0,2,1,2,0,1,1,1,1,1,0,0,1,1,0,0,0,3,1,2,1,1,0,1,0,1,1,2,1,0,1,1,1,2,2,0,0,0,1,0,0,0,2,3,0,0,0,1,0,3,0,3,2,0,1,2,0,0,0,1,1,0,3,0,3,0,2,2,1,2,0,0,1,0,1,0,0,1,1,3,0,0,0,0,1,0,2,2,0,0,0,0,0,2,0,0,1,0,2,2,0,1,0,1,1,0,0,2,1,1,2,0,0,2,0,2,0,2,1,0,1,0,1,2,1,0,1,0,0,1,0,2,0,1,0,0,2,2,3,2,1,1,1,2,1,3,1,2,1,2,0,1,3,0,0,2,2,3,1,2,2,0,2,3,1,1,3,2,1,1,1,0,1,3,0,2,0,0,2,1,2,2,0,1,2,0,0,0,1,2,1,0,0,0,1,2,2,1,0,1,2,1,1,0,1,0,2,0,2,2,1,0,3,1,1,0,3,0,0,0,2,1,0,0,2,1,2,1,2,2,1,2,0,2,1,0,1,0,4,0,0,1,1,3,3,1,0,0,0,0,0,2,0,0,0,1,0,0,0,0,2,1,0,1,0,0,1,1,1,3,1,0,0,0,1,4,1,2,2,0,2,0,2,2,0,2,2,1,1,0,1,1,2,0,0,1,1,0,0,1,1,0,2,2,0,0,0,1,2,0,0,2,2,1,0,1,0,0,1,1,1,2,2,2,2,3,1,0,1,2,1,1,0,1,0,1,1,3,2,1,0,2,1,2,1,3,2,0,4,1,0,3,0,3,2,1,1,1,0,0,1,0,0,0,0,2,1,0,2,0,1,0,0,0,3,0,1,2,1,1,0,0,1,3,1,0,1,3,0,0,1,1,1,2,1,0,1,2,3,1,2,0,1,0,1,0,0,0,1,1,0,0,1,1,1,1,1,1,0,2,0,3,0,2,1,1,2,1,2,0,0,4,1,1,1,1,1,1,1,2,2,3,0,1,1,0,0,1,0,2,1,0,0,0,0,2,0,2,1,0,0,3,0,2,2,1,2,0,4,2,0,1,0,2,1,4,1,2,2,1,0,3,2,0,2,1,0,1,1,0,1,1,0,1,3,0,0,2,0,0,0,1,0,1,1,1,2,1,1,0,0,2,1,1,0,0,2,1,0,1,0,2,0,0,2,2,0,1,3,1,1,0,1,0,0,0,1,2,2,0,0,1,0,1,1,0,2,1,1,0,0,0,1,3,0,2,2,1,1,1,1,1,3,1,0,0,1,2,1,3,0,1,0,0,1,1,0,1,0,1,0,0,3,3,0,1,2,0,0,1,1,3,1,1,0,1,0,2,1,0,0,1,2,1,0,3,0,3,0,1,0,1,0,0,0,2,2,4,1,1,2,1,1,0,4,1,1,2,0,0,2,0,1,0,2,0,0,2,1,0,0,1,1,0,1,2,0,0,2,3,2,2,1,0,2,1,0,1,1,1,2,2,2,2,3,1,2,3,0,0,1,1,1,3,0,1,1,0,1,0,2,2,1,0,1,0,3,1,2,1,1,2,0,2,5,1,0,1,0,1,0,2,2,3,0,1,1,3,0,0,0,1,1,2,1,1,2,2,1,1,1,1,2,0,1,0,0,0,4,1,3,0,3,0,1,1,0,3,1,1,1,1,2,0,0,1,0,3,0,2,0,2,0,2,2,1,2,1,0,1,1,1,0,0,1,2,0,2,1,3,0,0,2,0,0,4,0,0,0,1,0,2,0,1,0,0,1,0,2,0,0,0,3,0,1,3,2,2,1,1,3,0,0,1,2,0,0,0,0,1,2,1,1,0,0,0,0,1,1,0,3,0,1,0,1,2,0,3,1,2,1,1,2,0,1,1,0,0,3,1,1,2,2,0,1,0,1,3,0,0,2,0,1,1,1,0,5,1,1,0,1,3,2,1,0,0,0,2,3,1,0,1,0,2,2,1,1,1,1,0,0,1,0,1,2,1,2,1,2,2,0,2,2,0,3,2,0,0,1,0,1,2,0,1,0,0,1,0,0,0,1,0,2,0,1,0,0,0,0,1,0,0,1,2,0,1,0,2,1,1,1,1,1,1,1,2,2,2,0,0,3,0,0,0,1,0,0,0,0,2,0,0,0,4,0,1,1,0,1,0,3,1,1,1,2,4,1,1,2,1,0,4,1,1,2,2,2,1,1,2,0,0,1,2,1,1,1,0,0,0,4,1,0,0,0,3,1,1,3,1,1,2,1,1,0,1,0,1,1,1,0,0,0,1,1,1,0,0,0,1,0,1,1,2,0,1,0,2,0,0,2,0,0,2,1,1,0,5,2,1,0,0,0,1,0,0,1,0,2,1,1,0,0,1,0,2,0,0,0,1,0,2,1,0,1,1,0,1,1,0,0,1,2,2,3,2,6,0,1,1,1,0,0,0,2,2,1,2,2,1,0,0,0,1,3,0,2,1,1,2,1,1,1,0,2,0,0,1,1,4,1,0,1,1,1,1,2,1,0,0,1,1,1,0,0,0,1,0,1,1,0,0,2,4,2,1,3,0,1,0,4,1,0,2,2,0,0,1,0,1,1,1,1,5,1,1,0,3,1,1,1,1,1,1,2,1,2,2,1,0,0,2,0,1,2,0,1,2,1,0,2,1,1,0,2,0,0,1,0,1,2,2,1,0,0,1,4,0,1,0,0,2,1,2,0,2,1,0,1,0,1,1,3,2,1,0,1,0,0,0,2,1,1,2,2,2,0,3,1,1,0,2,2,2,1,3,2,0,1,1,1,3,0,1,0,0,0,0,0,3,4,1,1,0,2,1,0,2,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,0,2,0,1,3,1,0,1,0,1,1,0,1,0,3,1,1,2,0,1,4,0,2,2,2,0,0,1,0,2,2,0,2,1,0,0,0,0,1,0,2,1,0,0,1,0,1,1,1,2,0,0,0,0,1,2,1,1,0,1,1,0,1,0,2,2,1,1,1,1,0,2,2,0,3,0,0,3,0,0,1,1,2,0,1,0,2,1,0,0,0,2,3,1,0,1,1,2,2,0,0,1,0,0,2,1,0,2,0,0,0,0,0,0,2,2,0,1,0,1,0,2,2,0,0,1,1,0,1,1,1,1,3,0,1,1,1,0,0,1,1,2,1,1,0,0,1,3,0,0,0,4,1,2,3,1,0,0,1,2,1,1,0,2,2,1,3,2,1,0,0,3,0,1,1,0,2,1,0,0,0,2,1,1,3,0,1,1,2,1,1,1,2,3,0,3,1,0,0,0,2,0,1,3,0,0,2,2,0,0,0,1,0,2,1,3,1,5,0,1,1,0,0,1,1,0,1,3,2,2,0,2,0,1,0,1,0,0,1,0,3,0,3,1,3,1,0,0,2,0,0,0,1,2,0,1,0,0,0,2,2,0,1,1,1,4,0,1,1,1,1,1,2,1,0,1,0,1,1,1,2,3,1,0,0,1,1,0,2,0,1,0,1,1,0,1,0,1,0,2,0,0,1,2,0,1,2,2,2,2,3,0,1,1,0,0,2,2,0,2,0,1,2,0,1]},{"counters":[0,2,2,2,0,1,0,1,1,0,0,2,0,0,0,2,0,0,2,2,0,0,0,2,1,0,2,0,0,2,0,0,0,0,1,0,0,1,1,3,3,2,0,1,2,0,3,0,3,1,1,2,0,1,1,2,0,2,1,0,1,7,0,0,0,0,0,0,1,0,0,1,2,4,4,0,3,0,2,0,1,0,0,1,1,0,0,1,0,1,3,0,1,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,0,1,0,0,1,0,0,1,1,0,0,3,0,1,1,0,0,2,2,1,0,1,1,0,0,0,1,2,1,1,0,0,1,2,2,3,0,0,2,1,2,1,1,0,0,0,0,0,1,2,2,2,1,1,1,0,1,3,0,1,1,0,3,2,1,1,0,0,0,0,1,0,1,1,0,2,1,1,0,1,1,0,2,1,0,3,0,1,1,0,2,0,0,0,0,0,2,1,1,2,2,2,1,1,0,3,3,0,0,0,1,1,0,2,0,0,2,0,3,1,0,0,2,1,0,1,0,2,0,1,2,2,3,2,1,1,0,0,1,0,3,0,0,1,0,2,0,0,2,0,1,0,0,1,0,2,4,0,3,0,0,1,0,2,0,2,3,1,1,2,1,1,1,2,0,0,2,1,0,0,3,1,0,0,1,2,1,1,2,1,1,2,2,1,3,4,2,0,1,2,0,0,1,0,1,1,1,5,1,2,1,0,0,0,1,0,1,0,1,0,0,1,2,0,0,2,1,1,1,1,0,2,2,0,2,0,1,1,0,0,0,0,0,0,1,1,1,1,2,0,1,0,0,1,2,2,3,0,1,0,1,2,1,1,2,1,1,0,5,0,0,1,1,1,0,2,1,1,2,1,2,0,0,1,1,0,2,0,1,0,1,2,1,2,0,0,1,1,0,1,2,0,5,1,0,1,3,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,2,1,0,1,3,0,1,1,1,0,0,1,2,0,1,2,3,1,0,0,2,1,2,0,0,1,1,1,0,2,0,2,3,0,2,2,1,1,1,0,0,0,2,1,2,0,1,1,1,2,3,3,3,2,0,1,1,1,0,0,2,1,1,0,1,0,0,0,0,2,0,1,3,0,0,2,2,1,0,2,1,0,0,0,1,0,1,1,0,0,0,0,0,0,1,0,1,1,1,1,0,0,1,1,2,1,2,2,1,1,1,0,2,5,0,1,0,1,0,1,2,3,2,0,2,2,2,1,0,0,1,0,1,0,1,1,0,2,1,0,1,1,2,0,1,0,0,2,1,2,0,1,0,1,2,3,1,3,0,0,0,1,1,1,0,0,1,0,2,1,2,1,2,2,0,0,0,1,1,2,0,2,0,0,1,0,1,1,1,0,1,0,3,2,0,2,0,0,2,3,0,2,1,0,1,0,1,1,1,1,0,1,3,0,3,0,0,1,0,1,0,2,2,2,0,1,2,1,3,0,1,0,1,1,0,1,0,0,2,0,2,0,1,0,1,5,0,3,1,0,0,1,0,0,0,2,2,1,2,0,1,1,3,1,3,2,1,0,3,1,2,1,0,0,1,2,0,0,0,0,1,1,0,1,0,0,1,1,0,2,0,0,0,1,1,2,1,0,1,0,0,1,1,0,2,1,2,0,2,1,1,1,0,0,2,1,0,2,1,2,0,4,1,0,0,1,0,1,1,1,0,2,1,1,0,1,1,1,1,1,2,0,0,1,0,1,0,0,2,1,1,0,1,1,0,1,2,0,0,0,1,3,2,2,0,0,2,2,0,0,3,1,1,1,2,1,0,1,1,0,1,1,1,0,1,0,1,2,1,0,0,1,0,1,1,0,1,3,0,0,1,3,1,1,1,0,0,1,1,2,0,2,1,3,0,0,1,0,2,0,0,1,0,3,1,1,3,2,4,2,1,4,1,1,0,0,2,1,2,1,1,2,1,1,1,1,0,2,3,1,0,1,0,1,2,2,0,0,0,0,1,0,3,3,0,1,1,1,0,1,1,1,0,1,0,2,0,2,0,0,2,1,2,0,3,2,0,0,1,2,0,0,2,5,1,0,3,2,0,1,2,0,2,1,1,1,3,1,1,0,0,3,1,3,1,1,0,0,0,1,1,0,0,0,3,0,0,1,0,1,2,2,2,0,1,2,2,1,2,2,0,0,1,1,0,1,0,0,1,1,1,3,0,2,1,1,1,0,1,2,2,1,0,1,3,3,4,4,3,1,0,2,0,2,0,3,1,2,1,1,2,2,0,0,1,0,1,0,0,0,5,0,0,2,0,0,0,0,1,0,0,1,1,1,1,1,1,1,0,0,2,1,0,3,1,1,2,0,1,2,3,0,0,2,3,1,1,1,1,2,1,1,1,0,1,1,1,1,0,1,0,0,0,0,3,0,3,0,1,0,1,1,1,0,1,1,2,0,2,1,1,1,1,2,2,1,1,2,2,1,0,2,3,0,2,2,4,0,1,3,1,1,1,2,0,0,2,0,0,2,1,2,1,1,0,1,3,0,1,0,0,3,0,0,0,2,0,0,0,0,1,0,1,3,0,2,1,0,1,1,2,0,1,0,1,1,2,2,0,0,0,5,1,2,1,2,0,0,1,1,2,2,1,2,1,2,2,2,4,0,2,0,0,0,0,1,0,0,2,0,2,0,1,1,0,0,0,1,2,3,4,0,2,0,0,0,1,1,1,1,0,0,1,1,0,0,1,2,1,2,0,3,1,1,0,0,0,0,0,2,0,0,2,1,2,1,0,2,2,0,2,0,2,0,1,1,0,1,0,1,1,0,0,1,0,1,0,1,3,1,0,0,2,1,1,1,0,3,0,0,2,0,1,1,0,0,0,0,0,1,0,1,2,2,2,0,2,1,1,0,0,0,0,2,3,0,1,1,0,1,3,0,1,1,2,0,1,1,2,0,0,1,0,0,2,1,1,1,1,1,1,2,2,2,2,1,0,1,0,0,0,3,0,2,0,3,1,1,0,1,2,1,0,1,0,1,0,3,0,1,3,0,1,1,2,0,0,2,0,1,3,3,0,1,1,0,1,0,1,1,1,1,2,1,0,0,2,2,1,0,0,1,0,1,0,1,0,0,2,2,1,3,0,1,1,0,1,0,1,1,0,1,0,1,1,2,0,1,1,1,0,1,2,2,3,2,2,5,2,0,1,1,1,1,2,2,2,0,1,3,2,1,0,1,1,1,1,2,1,1,0,0,1,0,0,1,0,0,0,2,0,1,1,1,1,1,2,1,3,2,1,1,0,2,3,1,1,2,1,0,0,2,0,0,2,2,0,2,4,1,1,1,0,0,0,0,1,0,3,1,1,1,1,0,1,1,2,2,1,0,1,0,0,1,0,0,0,2,1,2,0,1,2,1,1,0,0,0,0,0,1,3,0,2,1,0,1,2,0,0,2,2,0,0,3,2,4,0,0,0,0,0,1,2,0,0,1,2,1,1,1,1,1,2,1,0,0,1,1,0,1,0,0,1,2,1,1,0,2,1,0,0,1,1,0,0,1,1,2,1,0,3,1,1,1,1,1,2,2,1,1,0,0,0,1,1,0,1,1,3,0,0,4,2,1,1,1,2,1,2,0,1,1,0,1,0,2,0,0,0,0,0,1,0,0,2,1,1,2,0,0,1,2,1,4,0,2,0,0,0,0,2,0,0,0,2,1,1,2,0,0,0,1,2,0,1,1,2,3,0,0,1,1,1,0,2,3,0,1,0,1,0,5,0,3,0,1,0,0,0,1,2,2,5,1,2,0,2,2,1,0,0,1,0,1,1,2,2,0,3,0,1,1,1,2,0,0,0,2,0,1,2,2,1,1,2,1,1,0,1,0,0,2,2,1,0,2,1,2,1,0,3,0,1,0,1,0,1,2,3,1,3,0,0,2,0,2,3,1,0,0,1,2,1,1,1,0,2,2,1,1,0,1,2,3,1,0,1,3,1,2,0,1,2,1,1,2,2,0,2,1,0,0,0,1,0,1,1,1,0,1,0,2,1,2,0,2,1,0,1,1,0,0,0,0,1,0,1,1,0,0,0,0,0,1,2,1,0,0,1,1,4,0,1,0,3,2,1,6,2,2,0,0,1,1,1,2,2,0,2,1,0,2,1,0,1,1,0,1,0,0,0,0,1,2,1,1,0,1,1,0,4,2,2,1,1,0,0,0,0,1,1,3,1,1,0,0,1,0,1,0,0,0,0,0,3,1,1,1,1,1,1,0,4,3,0,1,0,0,0,3,0,2,0,2,1,2,1,3,1,3,3,1,0,2,1,1,2,1,1,1,2,0,0,0,0,4,0,2,0,1,0,1,0,2,2,0,1,2,0,2,1,0,1,3,0,1,1,2,3,2,2,1,1,0,0,2,0,1,0,0,3,1,0,1,0,0,1,1,1,2,3,1,1,2,1,1,0,1,1,1,0,2,1,2,1,0,0,0,1,1,0,2,0,0,0,1,2,2,2,0,0,2,1,1,1,2,0,1,1,0,0,0,0,1,1,0,2,1,0,1,0,0,0,0,2,3,0,0,2,0,2,1,2,0,0,0,2,1,0,1,2,1,0,1,0,0]},{"counters":[0,1,1,3,0,0,2,1,0,4,1,1,0,2,2,1,0,0,1,2,1,0,2,1,1,1,0,2,2,0,0,1,1,2,2,2,0,0,1,2,1,0,2,0,2,4,1,0,0,1,0,1,1,0,1,0,3,2,0,0,1,1,6,2,0,2,1,3,1,0,0,0,1,2,3,3,2,2,1,2,1,1,1,1,0,1,0,1,0,1,3,2,0,1,1,2,1,1,1,1,2,4,2,1,1,1,2,1,0,0,0,1,0,0,0,0,1,1,1,2,1,1,1,2,2,0,1,1,1,0,0,3,3,0,0,1,0,0,0,0,1,0,0,5,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,0,0,1,0,1,2,2,1,1,0,0,0,1,0,0,0,1,1,3,1,0,2,0,0,1,3,1,0,0,1,4,1,0,1,4,1,3,2,0,2,0,1,1,1,1,0,0,0,1,1,1,0,1,1,0,0,1,2,0,1,3,1,2,0,0,1,0,1,0,0,0,4,0,1,2,1,1,1,0,1,1,2,1,0,0,0,0,0,0,1,1,2,2,0,0,1,2,3,2,2,1,0,1,1,0,0,1,1,1,0,1,1,1,0,0,0,4,1,1,1,1,0,0,0,3,1,0,0,1,1,0,1,3,3,0,1,0,0,0,0,1,0,1,0,1,2,0,0,1,2,1,1,1,0,1,0,4,1,1,0,1,1,0,1,1,0,3,0,0,0,0,1,2,3,1,2,0,2,1,1,1,1,1,1,1,1,0,2,0,3,1,1,1,2,1,0,0,0,0,1,0,0,2,1,1,0,0,1,0,0,2,1,2,1,1,0,1,2,3,0,2,0,1,1,0,1,1,1,2,1,4,3,0,1,1,1,0,3,1,0,1,0,3,1,1,0,0,1,0,2,0,1,3,2,1,0,2,0,1,2,1,0,2,2,0,2,1,1,1,0,2,0,1,0,2,2,2,0,3,1,0,2,2,2,0,1,1,0,1,2,0,2,1,0,0,0,0,0,2,2,0,1,3,0,2,0,2,0,0,1,3,1,0,0,0,0,1,3,1,2,3,3,0,0,0,0,2,1,2,1,0,0,1,1,0,0,0,0,0,1,2,1,0,0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,1,1,5,0,2,1,3,1,1,0,0,0,1,3,2,1,1,1,2,1,2,0,0,1,0,0,2,1,0,1,0,0,2,1,1,0,2,3,1,1,1,1,2,1,1,2,0,1,1,1,0,2,1,3,1,2,1,1,2,0,1,0,0,1,2,1,0,1,1,4,0,2,0,0,0,0,0,0,0,2,0,3,3,0,1,0,0,2,3,2,2,0,1,3,1,0,0,1,1,0,2,1,0,0,1,4,2,2,0,0,1,2,1,1,0,0,0,0,2,0,2,1,1,0,0,2,0,0,2,1,2,1,1,2,0,0,2,3,0,3,0,1,1,1,2,0,2,0,1,2,4,2,1,0,1,1,1,1,1,0,3,0,0,2,1,0,1,0,1,0,0,1,0,0,3,0,3,3,1,0,0,1,5,0,0,1,2,2,0,1,2,0,0,1,0,0,1,0,2,1,0,0,0,0,2,0,0,0,1,1,0,2,0,1,1,0,0,2,0,0,2,0,0,0,1,1,1,1,2,1,2,1,0,3,0,0,0,2,0,3,1,0,1,4,1,1,0,2,0,1,2,1,0,1,0,0,0,1,2,2,1,0,0,2,1,1,3,1,2,0,2,1,0,2,1,0,1,2,2,0,0,2,1,1,0,1,1,1,1,0,2,1,1,0,0,1,1,1,1,0,2,2,2,2,1,0,1,0,0,1,0,2,0,3,0,0,1,0,0,0,2,2,0,1,0,1,1,0,0,0,4,0,1,0,1,0,3,3,1,0,0,0,1,3,0,0,4,0,1,1,2,1,1,0,1,0,0,0,1,0,1,0,1,1,2,2,1,2,1,0,1,1,1,0,1,2,2,0,0,0,4,2,0,0,0,1,1,0,2,0,0,0,1,2,3,0,1,1,1,3,1,1,3,0,1,0,0,0,1,0,1,0,2,0,0,1,1,0,1,1,2,1,0,1,0,1,2,0,1,0,0,1,0,0,0,1,3,1,0,1,1,1,2,0,0,0,2,0,0,2,0,0,1,1,1,0,3,0,0,0,2,4,0,2,0,0,2,0,0,1,2,1,1,0,0,2,2,2,1,2,2,2,0,1,2,0,0,0,1,1,1,2,0,1,1,3,1,0,0,1,0,1,1,2,0,4,2,2,0,2,1,1,1,3,1,1,0,0,1,0,0,2,2,0,2,3,2,1,0,2,0,1,2,0,2,4,1,1,1,1,1,1,3,0,1,1,1,4,0,1,0,0,0,2,0,2,1,0,1,2,1,0,2,1,2,1,2,1,0,0,0,2,0,0,2,1,0,0,1,3,2,0,1,2,1,3,2,2,0,1,2,4,0,0,3,1,1,0,1,2,0,0,0,2,0,1,2,0,1,1,2,1,0,0,0,0,0,0,1,2,1,2,2,0,1,0,0,0,0,1,1,2,0,0,1,4,1,2,0,0,2,0,3,0,1,2,3,0,1,0,3,1,1,0,2,1,0,0,1,3,0,0,0,1,0,2,0,0,0,1,2,3,0,0,2,1,3,0,2,0,0,1,1,0,0,0,0,1,1,2,1,1,1,1,1,1,2,2,0,1,2,1,0,0,1,2,1,0,2,2,1,0,2,0,1,0,0,1,1,2,1,1,0,0,1,0,1,1,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,3,1,1,0,1,2,1,4,0,2,4,0,0,0,2,1,0,0,2,0,2,1,3,3,0,0,0,0,2,1,1,0,0,0,0,2,0,3,0,0,1,4,0,1,1,4,0,1,0,0,1,2,3,1,1,0,1,1,3,0,1,0,0,0,1,2,1,1,2,0,0,0,3,1,1,0,1,2,0,1,1,0,1,1,1,1,1,3,1,1,1,3,0,0,1,1,1,1,0,0,1,0,0,3,1,0,2,0,1,0,0,1,1,2,0,0,2,1,0,2,3,1,0,0,0,2,0,0,1,0,1,1,0,1,1,1,2,2,1,1,0,0,3,0,0,1,0,0,0,2,1,2,0,1,0,0,0,1,2,4,1,2,0,1,0,1,0,0,2,1,2,1,1,1,3,2,0,0,0,0,1,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,1,1,0,0,0,1,1,1,2,1,2,0,1,0,0,2,0,0,1,1,1,0,0,1,0,0,2,2,2,1,1,1,1,3,1,0,3,2,0,4,2,1,0,4,3,3,1,0,1,0,1,0,2,0,0,0,1,2,0,2,1,2,1,0,1,3,1,1,0,2,3,1,1,0,2,3,0,2,1,0,1,1,2,0,0,2,0,4,1,1,2,0,0,0,1,2,1,4,2,1,1,0,1,1,1,1,1,0,3,1,0,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,3,1,2,3,3,1,4,1,1,2,0,1,2,3,0,2,2,1,2,0,0,3,5,1,1,1,2,2,0,1,1,1,1,0,3,2,1,2,1,2,0,2,1,1,1,0,1,1,1,1,2,0,3,0,0,1,1,2,0,0,1,0,2,3,3,0,0,1,1,1,1,2,0,0,1,1,1,0,2,1,0,0,0,1,1,0,0,2,1,0,0,1,0,0,1,1,0,1,2,1,0,0,0,1,1,0,2,1,0,1,0,0,0,2,0,1,0,0,1,0,0,4,1,1,2,1,2,1,0,3,2,0,3,0,1,1,0,3,0,1,1,1,1,0,1,2,1,0,0,1,2,0,1,1,0,2,1,2,1,1,0,3,0,2,0,1,0,1,0,1,0,0,0,0,1,2,1,3,0,2,1,2,3,1,0,1,2,0,0,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,2,1,0,1,1,0,2,2,0,1,1,0,0,0,0,0,0,0,1,0,2,1,1,0,0,0,1,1,1,3,1,1,2,1,2,1,0,1,1,3,1,1,2,1,0,2,0,1,3,0,0,0,1,0,2,2,1,1,2,2,1,1,1,1,3,2,0,0,1,1,4,0,1,0,0,0,2,0,1,2,2,0,0,0,2,0,1,1,2,2,0,1,2,1,0,4,0,2,0,3,1,0,0,2,1,2,0,2,3,1,0,1,1,1,2,1,0,2,0,1,1,2,4,2,1,1,0,1,2,0,0,2,0,1,0,1,2,0,1,1,0,1,1,2,2,0,1,0,3,0,0,0,1,0,1,1,0,0,2,0,1,2,2,2,0,1,0,1,0,0,1,0,1,2,3,4,1,1,2,2,2,3,0,0,1,1,0,1,3,0,0,2,0,1,3,0,1,2,0,1,0,1,2,1,1,1,0,0,1,0,2,2,0,0,1,1,1,2,1,0,1,0,1,1,1,2,4,2,0,1,1,1,1,0,1,1,2,1,0,2,2,1,3,0,2,0,1,0,2,1,0,1,2,1,0,1,2,0,0,2]},{"counters":[2,0,0,1,1,1,0,5,1,0,2,0,1,1,2,3,0,2,0,1,0,0,2,2,2,1,0,1,2,2,1,2,1,3,0,1,0,0,1,0,1,2,3,1,0,0,0,3,1,2,0,1,2,1,0,0,1,0,0,0,2,0,0,0,2,0,0,1,0,0,1,1,1,0,3,2,1,1,1,2,1,4,0,3,0,0,2,1,1,2,0,1,0,1,1,0,1,2,0,2,2,0,1,1,0,0,2,1,0,2,2,0,1,1,0,0,0,0,2,3,0,0,0,0,1,0,1,0,2,1,2,0,1,0,0,0,3,1,1,2,1,0,2,0,0,2,2,2,1,1,0,0,0,1,1,2,0,1,1,0,1,2,1,1,1,0,0,1,3,0,0,2,3,0,0,1,1,5,1,1,0,0,1,0,2,0,0,1,1,0,0,0,1,2,0,0,2,0,0,2,0,1,1,0,0,1,2,1,0,1,0,0,2,1,0,1,1,0,1,1,0,1,2,1,1,1,1,1,2,3,0,1,3,0,1,1,0,2,2,0,2,1,5,1,1,3,0,0,2,0,1,0,0,0,4,0,1,1,0,1,1,0,2,1,1,0,1,1,0,1,1,1,0,0,1,0,1,0,2,1,0,0,1,0,0,0,0,0,0,0,3,0,0,1,2,1,0,1,1,1,0,0,2,0,1,0,0,1,0,1,0,1,0,0,1,1,0,0,0,1,2,4,0,2,0,0,2,3,1,0,0,0,0,2,0,2,1,0,2,1,1,4,0,2,1,3,0,2,1,1,1,1,0,1,3,5,1,0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,1,1,3,0,3,0,0,1,0,2,2,2,0,0,0,1,0,1,0,0,2,1,1,1,3,1,1,0,4,0,1,3,2,2,0,3,0,2,3,1,2,0,1,1,2,0,0,2,0,0,3,3,3,0,1,1,1,2,0,0,0,1,2,1,0,0,2,1,0,0,0,0,0,1,1,0,0,1,1,1,3,1,1,1,1,0,0,0,2,1,2,0,0,0,2,1,0,1,2,1,2,3,0,0,1,1,2,0,0,0,2,2,3,0,0,1,1,1,0,0,1,1,3,0,1,3,0,0,1,0,0,0,2,0,2,0,2,1,0,1,1,0,0,0,1,3,2,1,0,0,1,0,0,2,0,2,0,1,1,0,0,1,0,1,1,0,0,0,0,0,1,0,1,0,1,2,0,0,2,1,1,3,0,0,0,0,1,0,1,1,1,2,3,2,1,0,0,3,1,0,1,0,1,0,0,0,1,0,2,1,1,0,1,1,3,2,1,1,0,2,1,2,0,0,0,0,2,1,2,1,0,2,3,2,2,0,1,0,0,0,4,1,0,0,0,0,1,1,3,3,2,0,0,0,2,2,0,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,1,0,1,0,3,1,2,0,1,0,2,0,2,0,0,1,1,1,0,0,1,2,0,1,0,1,0,2,2,1,1,1,2,0,2,1,2,0,1,0,0,0,1,3,1,1,0,0,1,0,2,1,4,1,1,3,1,0,1,1,2,0,0,1,1,1,1,0,1,0,1,1,1,2,0,0,2,0,2,2,1,0,1,1,1,2,0,0,0,0,0,2,3,0,0,0,1,1,0,0,0,1,2,2,1,0,2,0,1,0,2,4,1,0,0,1,1,1,1,0,1,0,0,0,2,0,1,0,1,1,1,1,0,1,2,2,0,1,1,2,1,0,3,1,2,1,2,1,2,2,1,0,1,3,1,0,1,3,1,0,2,0,1,0,1,0,0,1,0,0,3,1,2,0,1,0,1,0,0,1,0,1,1,0,2,0,1,1,3,1,1,2,1,1,0,4,0,2,3,1,0,0,1,0,2,2,1,1,2,1,1,3,1,2,1,1,1,0,1,1,0,1,1,1,0,0,2,1,0,0,1,0,4,0,1,1,1,1,2,1,2,1,1,0,2,0,2,3,1,2,0,2,0,1,0,2,3,0,1,1,1,0,0,2,1,0,1,1,2,0,1,2,3,3,1,0,1,3,2,2,5,2,1,1,3,0,0,1,0,0,0,1,1,0,1,1,1,1,0,0,0,0,0,0,2,1,0,3,1,1,0,1,0,0,1,1,1,1,1,0,1,2,3,0,2,0,0,0,0,0,0,2,0,4,1,1,1,2,0,2,0,0,1,0,1,2,2,2,4,0,1,1,0,3,1,0,1,1,0,1,1,2,0,0,2,0,1,1,0,2,0,0,0,0,2,1,1,2,0,0,3,1,0,0,1,0,0,0,3,0,2,1,2,1,0,1,1,1,2,0,0,4,1,0,3,2,0,1,2,2,0,1,1,0,0,1,4,0,0,2,1,0,2,0,0,0,0,1,1,1,3,1,1,1,0,4,1,1,0,1,1,3,0,1,1,1,0,1,0,2,0,0,0,1,1,0,2,0,1,1,0,0,0,2,0,2,0,0,0,0,0,0,1,1,0,1,2,1,2,0,2,1,0,1,2,1,1,1,0,2,0,0,2,2,1,2,0,1,1,4,1,1,0,1,0,1,2,1,2,0,1,0,0,2,0,2,0,1,1,0,0,0,1,0,4,1,0,2,2,1,2,3,1,0,0,0,1,1,1,2,1,2,0,1,1,1,0,3,0,3,1,1,4,2,0,1,0,1,0,3,1,1,2,0,0,0,3,0,0,3,0,3,1,1,1,0,0,2,2,0,2,0,3,2,2,0,0,2,1,0,0,1,1,0,0,1,0,0,0,3,0,1,0,1,1,1,2,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,2,1,2,1,0,4,1,0,0,2,0,4,0,1,0,0,1,0,3,1,1,0,2,1,1,1,0,1,0,1,1,2,0,1,0,1,1,0,1,4,0,0,0,0,1,3,2,3,2,0,0,2,1,0,1,2,0,3,0,2,3,0,1,0,1,0,0,2,2,1,2,0,1,2,3,0,1,0,0,2,0,2,1,0,0,2,1,1,1,1,3,3,0,2,3,0,2,1,1,0,1,1,1,2,0,0,0,1,4,4,1,3,0,1,0,1,1,0,1,0,3,1,2,0,1,0,0,2,0,2,1,0,0,0,2,2,0,0,0,3,1,2,2,2,2,2,1,2,0,0,1,1,1,1,1,0,1,1,0,3,2,1,0,0,3,0,0,1,1,1,1,1,0,2,0,3,1,2,0,2,0,0,1,1,0,3,2,0,1,3,2,1,0,0,2,2,0,1,1,0,1,1,2,3,1,1,2,3,0,0,0,3,0,1,0,3,3,0,1,0,2,0,1,5,1,1,2,3,1,2,0,0,0,1,2,2,0,1,1,1,1,0,2,2,1,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,1,0,0,1,1,1,2,0,0,0,1,3,0,0,1,1,0,4,1,2,0,1,0,2,1,2,0,2,1,1,3,4,0,0,2,0,0,0,2,0,0,1,0,1,4,1,3,1,1,0,0,1,0,1,0,2,3,2,0,0,1,2,0,0,0,0,0,1,1,1,1,1,1,2,1,0,2,1,1,2,2,0,0,1,0,1,0,0,1,1,2,1,2,1,1,0,1,3,2,0,4,0,1,0,0,0,0,3,1,1,1,1,3,1,1,1,0,3,1,1,1,2,1,1,1,0,0,1,0,0,3,0,0,1,3,0,0,0,2,1,0,0,1,3,1,2,2,1,2,2,3,0,1,0,3,0,2,2,2,1,0,2,1,1,3,0,2,2,0,0,0,1,2,0,0,0,0,2,2,0,0,1,1,0,1,0,1,1,1,2,0,0,0,2,0,0,2,2,0,0,2,1,1,1,0,0,0,7,0,0,3,0,1,1,0,1,1,2,2,1,0,1,0,0,0,0,1,5,1,0,1,0,3,1,2,0,1,2,0,0,0,2,3,3,1,1,0,1,2,1,3,1,0,0,2,2,2,1,2,3,0,0,0,1,1,1,1,2,2,5,1,1,2,1,2,2,1,4,2,0,0,1,1,3,0,1,1,1,0,0,0,3,0,2,0,1,1,2,0,1,1,3,2,2,3,3,0,2,0,2,1,1,6,0,0,1,2,1,1,0,1,1,0,0,1,1,1,1,2,1,0,0,1,1,0,1,0,2,0,1,1,1,1,1,1,3,0,0,1,2,2,0,2,0,1,1,0,1,2,1,1,2,2,2,2,0,0,0,1,0,0,0,1,1,1,1,2,1,0,2,0,1,1,1,1,2,0,1,0,2,0,3,1,1,3,0,0,1,0,0,0,0,0,0,0,0,0,1,0,2,2,1,0,0,0,0,0,0,0,1,1,0,1,3,0,0,2,0,0,0,1,1,1,0,0,3,0,0,1,0,1,3,0,3,2,0,1,2,1,1,1,1,0,0,1,3,1,1,1,0,0,2,0,2,0,0,0,0,0,0,0,3,1,1,1,2,0,1,1,1,0,1,0,0,3,1,0,1,1,3,2,0,0,0,2,1,5,1,4,1,2,1,1,1,2,0,0,1,2,1,3,2,1,1]},{"counters":[0,0,0,6,1,0,2,0,0,3,1,0,3,0,1,1,2,1,0,0,0,2,1,0,0,0,0,0,2,0,1,1,0,1,0,0,0,0,1,1,1,2,1,3,0,1,0,1,0,0,1,0,2,2,0,2,1,1,0,0,3,2,1,0,1,0,2,1,0,2,0,2,0,1,0,2,0,0,0,2,1,1,1,1,1,2,2,4,0,0,0,1,3,3,0,0,0,6,0,1,2,4,1,0,1,1,2,0,1,1,0,2,1,0,1,0,2,1,0,0,0,1,1,0,2,0,3,1,0,0,1,1,0,1,1,0,0,1,2,1,1,0,0,1,0,0,0,0,0,1,0,3,2,0,0,0,0,0,0,1,0,2,0,1,1,1,0,2,0,1,1,0,1,1,0,2,1,0,0,2,2,0,1,3,1,1,0,2,2,0,0,1,1,2,1,0,1,1,1,1,0,1,0,1,1,1,2,0,2,1,2,0,0,0,0,0,3,1,2,0,1,1,2,1,0,1,1,1,2,0,1,2,0,2,0,2,1,1,2,0,1,1,0,1,0,2,3,1,2,2,0,1,0,0,1,2,0,3,1,1,0,0,2,2,2,0,1,2,4,1,2,2,1,0,1,4,1,1,1,2,1,2,2,1,2,0,2,2,1,1,1,0,1,0,1,1,0,1,1,0,0,1,1,0,0,1,1,1,0,0,1,1,1,0,1,2,1,2,3,1,1,0,0,3,1,0,0,0,2,1,1,1,1,0,0,0,0,1,2,2,1,2,0,3,1,3,0,2,0,0,0,2,1,0,0,1,2,1,2,2,0,1,0,0,1,2,3,2,2,1,2,1,0,1,0,2,0,0,0,1,0,2,3,0,1,0,1,2,0,2,0,0,1,2,0,3,1,0,0,3,0,1,2,1,0,0,2,0,1,1,0,3,0,1,0,3,0,3,0,0,2,1,0,3,0,2,1,1,1,1,1,0,2,1,3,2,0,1,0,1,1,1,0,0,1,2,2,1,0,1,1,2,2,0,0,2,0,0,4,1,1,1,0,1,0,0,1,0,0,2,1,0,1,2,0,3,1,1,2,0,1,0,1,1,1,3,1,1,1,2,0,3,1,1,0,0,0,2,1,1,0,4,2,3,0,5,1,1,2,0,1,0,1,0,0,0,2,0,1,1,0,2,1,1,0,2,0,1,3,0,1,1,1,0,1,2,0,1,0,1,1,0,2,1,0,0,0,0,1,1,3,1,0,2,3,1,0,0,0,2,0,1,0,0,0,3,0,0,1,0,3,0,0,0,1,1,2,2,1,2,0,2,0,0,0,2,1,2,1,0,0,3,1,1,0,2,0,1,1,0,2,0,1,0,0,2,0,2,0,1,1,1,0,2,2,1,2,0,1,0,0,0,1,2,0,1,1,0,2,2,2,1,0,1,0,0,1,0,0,2,0,0,2,1,0,3,2,4,3,0,2,0,0,0,2,0,2,0,1,2,1,0,1,2,2,0,1,0,0,1,0,1,1,0,0,0,1,0,3,1,0,2,1,1,1,0,0,0,0,1,0,0,1,0,1,1,0,3,1,0,2,0,1,0,4,1,0,0,0,1,0,3,1,3,2,1,0,2,0,3,1,2,0,1,2,0,1,1,0,0,0,1,0,2,2,1,1,1,1,0,2,2,1,1,1,0,0,0,2,0,1,1,2,0,2,0,0,0,0,1,0,0,2,1,0,1,1,0,1,0,0,0,0,1,0,1,1,0,3,0,1,1,2,3,1,1,1,2,3,3,2,2,3,0,2,0,0,1,3,1,0,2,1,2,1,0,2,1,0,2,3,0,3,1,1,0,2,2,0,1,3,0,2,0,1,1,0,1,1,3,1,2,1,0,1,3,0,2,2,0,2,2,1,1,3,1,2,0,5,1,0,1,1,0,1,0,1,2,2,2,2,0,2,1,1,2,1,0,1,0,1,2,2,3,3,3,0,0,0,0,1,2,0,1,0,3,2,0,2,0,0,1,0,0,3,0,1,0,1,1,1,2,1,2,2,1,3,0,0,0,1,3,2,1,0,1,1,0,1,1,0,1,3,1,2,0,2,1,0,1,0,1,3,0,1,0,1,2,1,1,0,0,2,1,0,2,0,4,0,2,0,2,1,2,0,2,1,2,0,1,4,0,0,0,1,0,0,0,0,1,1,1,1,0,0,1,1,2,3,1,0,1,0,0,1,0,1,0,0,3,1,0,3,0,1,0,1,1,0,0,2,1,2,0,0,0,0,0,0,0,0,2,0,1,2,0,1,0,2,1,0,0,0,2,1,1,1,1,2,1,0,4,1,0,2,2,1,1,0,0,1,1,2,2,1,1,1,1,0,0,2,0,0,1,4,1,0,1,1,1,2,3,1,2,1,0,2,1,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,1,1,2,2,1,4,0,0,1,1,0,1,1,1,4,2,0,0,0,0,1,0,1,1,3,2,1,0,2,0,4,1,1,0,3,1,0,0,3,1,0,1,1,1,2,0,1,1,0,0,2,0,1,2,2,1,0,1,2,1,1,2,2,2,1,1,1,0,0,1,1,1,1,1,1,0,0,2,0,0,1,0,1,1,0,0,0,2,1,1,0,0,2,0,1,3,0,2,0,2,1,0,1,1,1,0,0,0,0,0,1,1,1,1,0,1,3,0,0,0,2,1,0,1,1,0,0,0,0,0,3,1,2,4,2,2,0,1,2,1,1,1,0,1,3,0,0,0,3,2,1,1,2,3,3,0,3,0,2,2,0,1,2,1,0,1,0,2,0,1,1,1,2,1,1,0,2,0,0,0,0,1,1,0,0,2,0,1,0,1,2,1,2,1,1,0,1,3,0,1,0,0,1,1,2,2,1,0,0,0,1,1,2,1,3,0,0,1,0,1,1,0,0,1,0,4,2,0,2,1,0,0,0,0,0,1,1,3,0,4,2,0,1,2,0,1,1,1,0,1,1,1,0,1,0,2,0,0,2,1,0,2,3,1,0,0,0,2,2,1,0,0,0,1,0,1,0,1,2,0,2,3,1,2,2,2,1,0,1,0,2,3,1,2,2,2,3,1,1,0,0,1,0,0,1,0,1,3,0,0,0,1,1,0,0,3,2,2,1,1,0,0,0,1,1,2,0,0,4,3,0,2,1,0,2,0,1,2,1,2,1,0,1,0,1,0,0,1,1,1,2,0,2,0,1,0,0,0,2,1,0,0,1,1,0,1,2,1,1,0,0,0,2,1,0,0,0,0,2,0,0,2,0,1,2,1,1,2,2,1,2,0,1,0,0,2,2,2,0,0,0,0,3,1,1,5,1,2,0,2,1,2,2,1,0,0,0,0,0,0,0,0,2,3,3,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,1,1,1,0,0,1,0,4,0,0,1,1,1,2,3,1,0,2,3,0,2,1,0,1,3,0,1,1,0,1,1,1,1,1,1,0,1,1,0,0,0,2,1,2,0,1,2,0,1,2,0,1,1,0,0,0,1,2,0,2,3,1,2,2,1,1,0,0,2,0,3,2,0,1,1,1,1,3,0,2,0,1,1,1,2,1,2,3,2,1,2,1,0,1,2,0,1,1,0,1,1,0,0,1,0,0,0,3,0,3,3,0,0,2,1,2,0,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,1,3,3,0,2,1,0,0,1,1,1,0,1,1,0,0,0,2,3,0,0,1,0,0,1,0,0,2,0,2,2,0,0,0,1,1,1,1,0,2,1,1,3,1,0,2,2,4,1,0,4,0,2,1,0,0,1,1,2,1,0,3,1,1,1,0,0,0,0,0,1,1,0,2,1,0,0,1,0,1,1,1,0,1,0,2,1,5,1,1,0,2,3,0,0,0,0,0,0,3,1,1,2,0,1,1,4,2,2,1,1,0,1,2,3,1,0,1,0,1,0,1,1,4,2,1,3,0,2,0,1,1,1,0,0,0,2,2,1,2,1,2,3,0,2,3,0,2,1,0,0,0,2,0,3,0,0,3,2,1,0,1,2,2,0,0,2,1,1,0,0,0,3,2,1,4,1,1,0,1,0,0,2,2,0,1,1,0,0,1,1,0,0,2,0,2,4,0,1,1,2,0,4,0,1,2,1,0,1,0,0,2,2,3,3,2,3,0,1,1,0,1,0,1,2,0,1,1,1,1,0,1,1,1,1,0,2,0,2,1,1,1,1,2,0,0,1,3,0,1,1,0,0,0,1,0,0,0,0,0,1,4,2,2,0,1,0,4,0,0,0,0,1,2,3,1,2,0,2,0,1,0,3,0,2,0,2,0,0,1,1,1,1,0,2,1,2,1,0,2,1,3,2,0,0,1,1,0,1,0,1,0,0,0,2,0,0,1,1,1,4,1,0,1,1,1,0,1,2,1,2,0,1,0,1,1,1,0,0,3,0,6,0,0,2,0,1,2,2,0,2,3,1,1,0,1,2,2,2,2,3,1,0,3,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,1,1,0,2,0,2,2,0,0]}]},"null_count":0,"last_update_version":397952036454793216},"id":{"histogram":{"ndv":1994,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"OQ==","repeats":1},{"count":16,"lower_bound":"MTA=","upper_bound":"MjA=","repeats":1},{"count":24,"lower_bound":"MjE=","upper_bound":"Mjk=","repeats":1},{"count":32,"lower_bound":"MzA=","upper_bound":"Mzc=","repeats":1},{"count":40,"lower_bound":"Mzg=","upper_bound":"NDU=","repeats":1},{"count":48,"lower_bound":"NDY=","upper_bound":"NTM=","repeats":1},{"count":56,"lower_bound":"NTQ=","upper_bound":"NjE=","repeats":1},{"count":64,"lower_bound":"NjI=","upper_bound":"Njk=","repeats":1},{"count":72,"lower_bound":"NzA=","upper_bound":"Nzc=","repeats":1},{"count":80,"lower_bound":"Nzg=","upper_bound":"ODU=","repeats":1},{"count":88,"lower_bound":"ODY=","upper_bound":"OTM=","repeats":1},{"count":96,"lower_bound":"OTQ=","upper_bound":"MTAx","repeats":1},{"count":104,"lower_bound":"MTAy","upper_bound":"MTA5","repeats":1},{"count":112,"lower_bound":"MTEw","upper_bound":"MTE3","repeats":1},{"count":120,"lower_bound":"MTE4","upper_bound":"MTI1","repeats":1},{"count":128,"lower_bound":"MTI2","upper_bound":"MTMz","repeats":1},{"count":136,"lower_bound":"MTM0","upper_bound":"MTQx","repeats":1},{"count":144,"lower_bound":"MTQy","upper_bound":"MTQ5","repeats":1},{"count":152,"lower_bound":"MTUw","upper_bound":"MTU3","repeats":1},{"count":160,"lower_bound":"MTU4","upper_bound":"MTY1","repeats":1},{"count":168,"lower_bound":"MTY2","upper_bound":"MTcz","repeats":1},{"count":176,"lower_bound":"MTc0","upper_bound":"MTgx","repeats":1},{"count":184,"lower_bound":"MTgy","upper_bound":"MTg5","repeats":1},{"count":192,"lower_bound":"MTkw","upper_bound":"MTk3","repeats":1},{"count":200,"lower_bound":"MTk4","upper_bound":"MjA1","repeats":1},{"count":208,"lower_bound":"MjA2","upper_bound":"MjEz","repeats":1},{"count":216,"lower_bound":"MjE0","upper_bound":"MjIx","repeats":1},{"count":224,"lower_bound":"MjIy","upper_bound":"MjI5","repeats":1},{"count":232,"lower_bound":"MjMw","upper_bound":"MjM3","repeats":1},{"count":240,"lower_bound":"MjM4","upper_bound":"MjQ1","repeats":1},{"count":248,"lower_bound":"MjQ2","upper_bound":"MjUz","repeats":1},{"count":256,"lower_bound":"MjU0","upper_bound":"MjYx","repeats":1},{"count":264,"lower_bound":"MjYy","upper_bound":"MjY5","repeats":1},{"count":272,"lower_bound":"Mjcw","upper_bound":"Mjc3","repeats":1},{"count":280,"lower_bound":"Mjc4","upper_bound":"Mjg1","repeats":1},{"count":288,"lower_bound":"Mjg2","upper_bound":"Mjkz","repeats":1},{"count":296,"lower_bound":"Mjk0","upper_bound":"MzAx","repeats":1},{"count":304,"lower_bound":"MzAy","upper_bound":"MzA5","repeats":1},{"count":312,"lower_bound":"MzEw","upper_bound":"MzE3","repeats":1},{"count":320,"lower_bound":"MzE4","upper_bound":"MzI1","repeats":1},{"count":328,"lower_bound":"MzI2","upper_bound":"MzMz","repeats":1},{"count":336,"lower_bound":"MzM0","upper_bound":"MzQx","repeats":1},{"count":344,"lower_bound":"MzQy","upper_bound":"MzQ5","repeats":1},{"count":352,"lower_bound":"MzUw","upper_bound":"MzU3","repeats":1},{"count":360,"lower_bound":"MzU4","upper_bound":"MzY1","repeats":1},{"count":368,"lower_bound":"MzY2","upper_bound":"Mzcz","repeats":1},{"count":376,"lower_bound":"Mzc0","upper_bound":"Mzgx","repeats":1},{"count":384,"lower_bound":"Mzgy","upper_bound":"Mzg5","repeats":1},{"count":392,"lower_bound":"Mzkw","upper_bound":"Mzk3","repeats":1},{"count":400,"lower_bound":"Mzk4","upper_bound":"NDA1","repeats":1},{"count":408,"lower_bound":"NDA2","upper_bound":"NDEz","repeats":1},{"count":416,"lower_bound":"NDE0","upper_bound":"NDIx","repeats":1},{"count":424,"lower_bound":"NDIy","upper_bound":"NDI5","repeats":1},{"count":432,"lower_bound":"NDMw","upper_bound":"NDM3","repeats":1},{"count":440,"lower_bound":"NDM4","upper_bound":"NDQ1","repeats":1},{"count":448,"lower_bound":"NDQ2","upper_bound":"NDUz","repeats":1},{"count":456,"lower_bound":"NDU0","upper_bound":"NDYx","repeats":1},{"count":464,"lower_bound":"NDYy","upper_bound":"NDY5","repeats":1},{"count":472,"lower_bound":"NDcw","upper_bound":"NDc3","repeats":1},{"count":480,"lower_bound":"NDc4","upper_bound":"NDg1","repeats":1},{"count":488,"lower_bound":"NDg2","upper_bound":"NDkz","repeats":1},{"count":496,"lower_bound":"NDk0","upper_bound":"NTAx","repeats":1},{"count":504,"lower_bound":"NTAy","upper_bound":"NTA5","repeats":1},{"count":512,"lower_bound":"NTEw","upper_bound":"NTE3","repeats":1},{"count":520,"lower_bound":"NTE4","upper_bound":"NTI1","repeats":1},{"count":528,"lower_bound":"NTI2","upper_bound":"NTMz","repeats":1},{"count":536,"lower_bound":"NTM0","upper_bound":"NTQx","repeats":1},{"count":544,"lower_bound":"NTQy","upper_bound":"NTQ5","repeats":1},{"count":552,"lower_bound":"NTUw","upper_bound":"NTU3","repeats":1},{"count":560,"lower_bound":"NTU4","upper_bound":"NTY1","repeats":1},{"count":568,"lower_bound":"NTY2","upper_bound":"NTcz","repeats":1},{"count":576,"lower_bound":"NTc0","upper_bound":"NTgx","repeats":1},{"count":584,"lower_bound":"NTgy","upper_bound":"NTg5","repeats":1},{"count":592,"lower_bound":"NTkw","upper_bound":"NTk3","repeats":1},{"count":600,"lower_bound":"NTk4","upper_bound":"NjA1","repeats":1},{"count":608,"lower_bound":"NjA2","upper_bound":"NjEz","repeats":1},{"count":616,"lower_bound":"NjE0","upper_bound":"NjIx","repeats":1},{"count":624,"lower_bound":"NjIy","upper_bound":"NjI5","repeats":1},{"count":632,"lower_bound":"NjMw","upper_bound":"NjM3","repeats":1},{"count":640,"lower_bound":"NjM4","upper_bound":"NjQ1","repeats":1},{"count":648,"lower_bound":"NjQ2","upper_bound":"NjUz","repeats":1},{"count":656,"lower_bound":"NjU0","upper_bound":"NjYx","repeats":1},{"count":664,"lower_bound":"NjYy","upper_bound":"NjY5","repeats":1},{"count":672,"lower_bound":"Njcw","upper_bound":"Njc3","repeats":1},{"count":680,"lower_bound":"Njc4","upper_bound":"Njg1","repeats":1},{"count":688,"lower_bound":"Njg2","upper_bound":"Njkz","repeats":1},{"count":696,"lower_bound":"Njk0","upper_bound":"NzAx","repeats":1},{"count":704,"lower_bound":"NzAy","upper_bound":"NzA5","repeats":1},{"count":712,"lower_bound":"NzEw","upper_bound":"NzE3","repeats":1},{"count":720,"lower_bound":"NzE4","upper_bound":"NzI1","repeats":1},{"count":728,"lower_bound":"NzI2","upper_bound":"NzMz","repeats":1},{"count":736,"lower_bound":"NzM0","upper_bound":"NzQx","repeats":1},{"count":744,"lower_bound":"NzQy","upper_bound":"NzQ5","repeats":1},{"count":752,"lower_bound":"NzUw","upper_bound":"NzU3","repeats":1},{"count":760,"lower_bound":"NzU4","upper_bound":"NzY1","repeats":1},{"count":768,"lower_bound":"NzY2","upper_bound":"Nzcz","repeats":1},{"count":776,"lower_bound":"Nzc0","upper_bound":"Nzgx","repeats":1},{"count":784,"lower_bound":"Nzgy","upper_bound":"Nzg5","repeats":1},{"count":792,"lower_bound":"Nzkw","upper_bound":"Nzk3","repeats":1},{"count":800,"lower_bound":"Nzk4","upper_bound":"ODA1","repeats":1},{"count":808,"lower_bound":"ODA2","upper_bound":"ODEz","repeats":1},{"count":816,"lower_bound":"ODE0","upper_bound":"ODIx","repeats":1},{"count":824,"lower_bound":"ODIy","upper_bound":"ODI5","repeats":1},{"count":832,"lower_bound":"ODMw","upper_bound":"ODM3","repeats":1},{"count":840,"lower_bound":"ODM4","upper_bound":"ODQ1","repeats":1},{"count":848,"lower_bound":"ODQ2","upper_bound":"ODUz","repeats":1},{"count":856,"lower_bound":"ODU0","upper_bound":"ODYx","repeats":1},{"count":864,"lower_bound":"ODYy","upper_bound":"ODY5","repeats":1},{"count":872,"lower_bound":"ODcw","upper_bound":"ODc3","repeats":1},{"count":880,"lower_bound":"ODc4","upper_bound":"ODg1","repeats":1},{"count":888,"lower_bound":"ODg2","upper_bound":"ODkz","repeats":1},{"count":896,"lower_bound":"ODk0","upper_bound":"OTAx","repeats":1},{"count":904,"lower_bound":"OTAy","upper_bound":"OTA5","repeats":1},{"count":912,"lower_bound":"OTEw","upper_bound":"OTE3","repeats":1},{"count":920,"lower_bound":"OTE4","upper_bound":"OTI1","repeats":1},{"count":928,"lower_bound":"OTI2","upper_bound":"OTMz","repeats":1},{"count":936,"lower_bound":"OTM0","upper_bound":"OTQx","repeats":1},{"count":944,"lower_bound":"OTQy","upper_bound":"OTQ5","repeats":1},{"count":952,"lower_bound":"OTUw","upper_bound":"OTU3","repeats":1},{"count":960,"lower_bound":"OTU4","upper_bound":"OTY1","repeats":1},{"count":968,"lower_bound":"OTY2","upper_bound":"OTcz","repeats":1},{"count":976,"lower_bound":"OTc0","upper_bound":"OTgx","repeats":1},{"count":984,"lower_bound":"OTgy","upper_bound":"OTg5","repeats":1},{"count":992,"lower_bound":"OTkw","upper_bound":"OTk3","repeats":1},{"count":1000,"lower_bound":"OTk4","upper_bound":"MTAwNQ==","repeats":1},{"count":1008,"lower_bound":"MTAwNg==","upper_bound":"MTAxMw==","repeats":1},{"count":1016,"lower_bound":"MTAxNA==","upper_bound":"MTAyMQ==","repeats":1},{"count":1024,"lower_bound":"MTAyMg==","upper_bound":"MTAyOQ==","repeats":1},{"count":1032,"lower_bound":"MTAzMA==","upper_bound":"MTAzNw==","repeats":1},{"count":1040,"lower_bound":"MTAzOA==","upper_bound":"MTA0NQ==","repeats":1},{"count":1048,"lower_bound":"MTA0Ng==","upper_bound":"MTA1Mw==","repeats":1},{"count":1056,"lower_bound":"MTA1NA==","upper_bound":"MTA2MQ==","repeats":1},{"count":1064,"lower_bound":"MTA2Mg==","upper_bound":"MTA2OQ==","repeats":1},{"count":1072,"lower_bound":"MTA3MA==","upper_bound":"MTA3Nw==","repeats":1},{"count":1080,"lower_bound":"MTA3OA==","upper_bound":"MTA4NQ==","repeats":1},{"count":1088,"lower_bound":"MTA4Ng==","upper_bound":"MTA5Mw==","repeats":1},{"count":1096,"lower_bound":"MTA5NA==","upper_bound":"MTEwMQ==","repeats":1},{"count":1104,"lower_bound":"MTEwMg==","upper_bound":"MTEwOQ==","repeats":1},{"count":1112,"lower_bound":"MTExMA==","upper_bound":"MTExNw==","repeats":1},{"count":1120,"lower_bound":"MTExOA==","upper_bound":"MTEyNQ==","repeats":1},{"count":1128,"lower_bound":"MTEyNg==","upper_bound":"MTEzMw==","repeats":1},{"count":1136,"lower_bound":"MTEzNA==","upper_bound":"MTE0MQ==","repeats":1},{"count":1144,"lower_bound":"MTE0Mg==","upper_bound":"MTE0OQ==","repeats":1},{"count":1152,"lower_bound":"MTE1MA==","upper_bound":"MTE1Nw==","repeats":1},{"count":1160,"lower_bound":"MTE1OA==","upper_bound":"MTE2NQ==","repeats":1},{"count":1168,"lower_bound":"MTE2Ng==","upper_bound":"MTE3Mw==","repeats":1},{"count":1176,"lower_bound":"MTE3NA==","upper_bound":"MTE4MQ==","repeats":1},{"count":1184,"lower_bound":"MTE4Mg==","upper_bound":"MTE4OQ==","repeats":1},{"count":1192,"lower_bound":"MTE5MA==","upper_bound":"MTE5Nw==","repeats":1},{"count":1200,"lower_bound":"MTE5OA==","upper_bound":"MTIwNQ==","repeats":1},{"count":1208,"lower_bound":"MTIwNg==","upper_bound":"MTIxMw==","repeats":1},{"count":1216,"lower_bound":"MTIxNA==","upper_bound":"MTIyMQ==","repeats":1},{"count":1224,"lower_bound":"MTIyMg==","upper_bound":"MTIyOQ==","repeats":1},{"count":1232,"lower_bound":"MTIzMA==","upper_bound":"MTIzNw==","repeats":1},{"count":1240,"lower_bound":"MTIzOA==","upper_bound":"MTI0NQ==","repeats":1},{"count":1248,"lower_bound":"MTI0Ng==","upper_bound":"MTI1Mw==","repeats":1},{"count":1256,"lower_bound":"MTI1NA==","upper_bound":"MTI2MQ==","repeats":1},{"count":1264,"lower_bound":"MTI2Mg==","upper_bound":"MTI2OQ==","repeats":1},{"count":1272,"lower_bound":"MTI3MA==","upper_bound":"MTI3Nw==","repeats":1},{"count":1280,"lower_bound":"MTI3OA==","upper_bound":"MTI4NQ==","repeats":1},{"count":1288,"lower_bound":"MTI4Ng==","upper_bound":"MTI5Mw==","repeats":1},{"count":1296,"lower_bound":"MTI5NA==","upper_bound":"MTMwMQ==","repeats":1},{"count":1304,"lower_bound":"MTMwMg==","upper_bound":"MTMwOQ==","repeats":1},{"count":1312,"lower_bound":"MTMxMA==","upper_bound":"MTMxNw==","repeats":1},{"count":1320,"lower_bound":"MTMxOA==","upper_bound":"MTMyNQ==","repeats":1},{"count":1328,"lower_bound":"MTMyNg==","upper_bound":"MTMzMw==","repeats":1},{"count":1336,"lower_bound":"MTMzNA==","upper_bound":"MTM0MQ==","repeats":1},{"count":1344,"lower_bound":"MTM0Mg==","upper_bound":"MTM0OQ==","repeats":1},{"count":1352,"lower_bound":"MTM1MA==","upper_bound":"MTM1Nw==","repeats":1},{"count":1360,"lower_bound":"MTM1OA==","upper_bound":"MTM2NQ==","repeats":1},{"count":1368,"lower_bound":"MTM2Ng==","upper_bound":"MTM3Mw==","repeats":1},{"count":1376,"lower_bound":"MTM3NA==","upper_bound":"MTM4MQ==","repeats":1},{"count":1384,"lower_bound":"MTM4Mg==","upper_bound":"MTM4OQ==","repeats":1},{"count":1392,"lower_bound":"MTM5MA==","upper_bound":"MTM5Nw==","repeats":1},{"count":1400,"lower_bound":"MTM5OA==","upper_bound":"MTQwNQ==","repeats":1},{"count":1408,"lower_bound":"MTQwNg==","upper_bound":"MTQxMw==","repeats":1},{"count":1416,"lower_bound":"MTQxNA==","upper_bound":"MTQyMQ==","repeats":1},{"count":1424,"lower_bound":"MTQyMg==","upper_bound":"MTQyOQ==","repeats":1},{"count":1432,"lower_bound":"MTQzMA==","upper_bound":"MTQzNw==","repeats":1},{"count":1440,"lower_bound":"MTQzOA==","upper_bound":"MTQ0NQ==","repeats":1},{"count":1448,"lower_bound":"MTQ0Ng==","upper_bound":"MTQ1Mw==","repeats":1},{"count":1456,"lower_bound":"MTQ1NA==","upper_bound":"MTQ2MQ==","repeats":1},{"count":1464,"lower_bound":"MTQ2Mg==","upper_bound":"MTQ2OQ==","repeats":1},{"count":1472,"lower_bound":"MTQ3MA==","upper_bound":"MTQ3Nw==","repeats":1},{"count":1480,"lower_bound":"MTQ3OA==","upper_bound":"MTQ4NQ==","repeats":1},{"count":1488,"lower_bound":"MTQ4Ng==","upper_bound":"MTQ5Mw==","repeats":1},{"count":1496,"lower_bound":"MTQ5NA==","upper_bound":"MTUwMQ==","repeats":1},{"count":1504,"lower_bound":"MTUwMg==","upper_bound":"MTUwOQ==","repeats":1},{"count":1512,"lower_bound":"MTUxMA==","upper_bound":"MTUxNw==","repeats":1},{"count":1520,"lower_bound":"MTUxOA==","upper_bound":"MTUyNQ==","repeats":1},{"count":1528,"lower_bound":"MTUyNg==","upper_bound":"MTUzMw==","repeats":1},{"count":1536,"lower_bound":"MTUzNA==","upper_bound":"MTU0MQ==","repeats":1},{"count":1544,"lower_bound":"MTU0Mg==","upper_bound":"MTU0OQ==","repeats":1},{"count":1552,"lower_bound":"MTU1MA==","upper_bound":"MTU1Nw==","repeats":1},{"count":1560,"lower_bound":"MTU1OA==","upper_bound":"MTU2NQ==","repeats":1},{"count":1568,"lower_bound":"MTU2Ng==","upper_bound":"MTU3Mw==","repeats":1},{"count":1576,"lower_bound":"MTU3NA==","upper_bound":"MTU4MQ==","repeats":1},{"count":1584,"lower_bound":"MTU4Mg==","upper_bound":"MTU4OQ==","repeats":1},{"count":1592,"lower_bound":"MTU5MA==","upper_bound":"MTU5Nw==","repeats":1},{"count":1600,"lower_bound":"MTU5OA==","upper_bound":"MTYwNQ==","repeats":1},{"count":1608,"lower_bound":"MTYwNg==","upper_bound":"MTYxMw==","repeats":1},{"count":1616,"lower_bound":"MTYxNA==","upper_bound":"MTYyMQ==","repeats":1},{"count":1624,"lower_bound":"MTYyMg==","upper_bound":"MTYyOQ==","repeats":1},{"count":1632,"lower_bound":"MTYzMA==","upper_bound":"MTYzNw==","repeats":1},{"count":1640,"lower_bound":"MTYzOA==","upper_bound":"MTY0NQ==","repeats":1},{"count":1648,"lower_bound":"MTY0Ng==","upper_bound":"MTY1Mw==","repeats":1},{"count":1656,"lower_bound":"MTY1NA==","upper_bound":"MTY2MQ==","repeats":1},{"count":1664,"lower_bound":"MTY2Mg==","upper_bound":"MTY2OQ==","repeats":1},{"count":1672,"lower_bound":"MTY3MA==","upper_bound":"MTY3Nw==","repeats":1},{"count":1680,"lower_bound":"MTY3OA==","upper_bound":"MTY4NQ==","repeats":1},{"count":1688,"lower_bound":"MTY4Ng==","upper_bound":"MTY5Mw==","repeats":1},{"count":1696,"lower_bound":"MTY5NA==","upper_bound":"MTcwMQ==","repeats":1},{"count":1704,"lower_bound":"MTcwMg==","upper_bound":"MTcwOQ==","repeats":1},{"count":1712,"lower_bound":"MTcxMA==","upper_bound":"MTcxNw==","repeats":1},{"count":1720,"lower_bound":"MTcxOA==","upper_bound":"MTcyNQ==","repeats":1},{"count":1728,"lower_bound":"MTcyNg==","upper_bound":"MTczMw==","repeats":1},{"count":1736,"lower_bound":"MTczNA==","upper_bound":"MTc0MQ==","repeats":1},{"count":1744,"lower_bound":"MTc0Mg==","upper_bound":"MTc0OQ==","repeats":1},{"count":1752,"lower_bound":"MTc1MA==","upper_bound":"MTc1Nw==","repeats":1},{"count":1760,"lower_bound":"MTc1OA==","upper_bound":"MTc2NQ==","repeats":1},{"count":1768,"lower_bound":"MTc2Ng==","upper_bound":"MTc3Mw==","repeats":1},{"count":1776,"lower_bound":"MTc3NA==","upper_bound":"MTc4MQ==","repeats":1},{"count":1784,"lower_bound":"MTc4Mg==","upper_bound":"MTc4OQ==","repeats":1},{"count":1792,"lower_bound":"MTc5MA==","upper_bound":"MTc5Nw==","repeats":1},{"count":1800,"lower_bound":"MTc5OA==","upper_bound":"MTgwNQ==","repeats":1},{"count":1808,"lower_bound":"MTgwNg==","upper_bound":"MTgxMw==","repeats":1},{"count":1816,"lower_bound":"MTgxNA==","upper_bound":"MTgyMQ==","repeats":1},{"count":1824,"lower_bound":"MTgyMg==","upper_bound":"MTgyOQ==","repeats":1},{"count":1832,"lower_bound":"MTgzMA==","upper_bound":"MTgzNw==","repeats":1},{"count":1840,"lower_bound":"MTgzOA==","upper_bound":"MTg0NQ==","repeats":1},{"count":1848,"lower_bound":"MTg0Ng==","upper_bound":"MTg1Mw==","repeats":1},{"count":1856,"lower_bound":"MTg1NA==","upper_bound":"MTg2MQ==","repeats":1},{"count":1864,"lower_bound":"MTg2Mg==","upper_bound":"MTg2OQ==","repeats":1},{"count":1872,"lower_bound":"MTg3MA==","upper_bound":"MTg3Nw==","repeats":1},{"count":1880,"lower_bound":"MTg3OA==","upper_bound":"MTg4NQ==","repeats":1},{"count":1888,"lower_bound":"MTg4Ng==","upper_bound":"MTg5Mw==","repeats":1},{"count":1896,"lower_bound":"MTg5NA==","upper_bound":"MTkwMQ==","repeats":1},{"count":1904,"lower_bound":"MTkwMg==","upper_bound":"MTkwOQ==","repeats":1},{"count":1912,"lower_bound":"MTkxMA==","upper_bound":"MTkxNw==","repeats":1},{"count":1920,"lower_bound":"MTkxOA==","upper_bound":"MTkyNQ==","repeats":1},{"count":1928,"lower_bound":"MTkyNg==","upper_bound":"MTkzMw==","repeats":1},{"count":1936,"lower_bound":"MTkzNA==","upper_bound":"MTk0MQ==","repeats":1},{"count":1944,"lower_bound":"MTk0Mg==","upper_bound":"MTk0OQ==","repeats":1},{"count":1952,"lower_bound":"MTk1MA==","upper_bound":"MTk1Nw==","repeats":1},{"count":1960,"lower_bound":"MTk1OA==","upper_bound":"MTk2NQ==","repeats":1},{"count":1968,"lower_bound":"MTk2Ng==","upper_bound":"MTk3Mw==","repeats":1},{"count":1976,"lower_bound":"MTk3NA==","upper_bound":"MTk4MQ==","repeats":1},{"count":1984,"lower_bound":"MTk4Mg==","upper_bound":"MTk4OQ==","repeats":1},{"count":1992,"lower_bound":"MTk5MA==","upper_bound":"MTk5Nw==","repeats":1},{"count":1994,"lower_bound":"MTk5OA==","upper_bound":"MTk5OQ==","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952036103520256},"bm":{"histogram":{"ndv":2,"buckets":[{"count":1062,"lower_bound":"MA==","upper_bound":"MA==","repeats":533},{"count":1994,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":467}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1013,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952036659527680},"mac":{"histogram":{"ndv":1971,"buckets":[{"count":7,"lower_bound":"MDFHa0x4czBlR1JJVFl0VlJaa1Rw","upper_bound":"MEtIWWd3QWhtMmg=","repeats":1},{"count":13,"lower_bound":"ME11UFBZVW1MVA==","upper_bound":"MFE=","repeats":1},{"count":19,"lower_bound":"MFJxS2dnY2UyUngyQkZFSWlFREdQSUlndTU0Qw==","upper_bound":"MGxh","repeats":1},{"count":25,"lower_bound":"MHBCQ1RoYUtvWlRYVFlNaVg=","upper_bound":"MURYSWNWb3lGSXJlMllXQ0M=","repeats":1},{"count":31,"lower_bound":"MUdQbXBpWDdxS3JPUENBaTVmSU1hRGJqdA==","upper_bound":"MUoydHFodDdkc1hOVTlVWnVJZE5saWUyeEdh","repeats":1},{"count":37,"lower_bound":"MVVPNzlybHJWYTlyZVptTjcyenBzMnpaSw==","upper_bound":"MWNISG1ZdHdtR3JCZG5HRE1Ld1RGR2o=","repeats":1},{"count":43,"lower_bound":"MWpycjREWGYyeEtTWg==","upper_bound":"MW1SeWJGSmR4dTJqeDVpcGR6S0pzbHUxangwR04=","repeats":1},{"count":49,"lower_bound":"MW1WaFk=","upper_bound":"Mg==","repeats":1},{"count":55,"lower_bound":"MjZtWW5DSnVWUkZKa1ZXNWxGektsN2NteQ==","upper_bound":"MkduYXBaNEd2eHhRYjVBelNRRVZYVlk=","repeats":1},{"count":61,"lower_bound":"Mk0zZm9iNXpHRUNJQTcyWDYxbElLekpRQWlEWA==","upper_bound":"MnEzZkc1MTJKaEhNVzlGOXNlczF2SnI1SXFRNXBC","repeats":1},{"count":67,"lower_bound":"MnRnUQ==","upper_bound":"MnhaOVFtZDQ3ZzEw","repeats":1},{"count":75,"lower_bound":"Mw==","upper_bound":"MzhMUFZFM0lUZ1V4RjB2OUFFVHR4ag==","repeats":1},{"count":83,"lower_bound":"M0IwTkdadw==","upper_bound":"M01DMVBqcDlxc2Fnc0h6Qldu","repeats":1},{"count":91,"lower_bound":"M1VPdThnRw==","upper_bound":"M2F3Z3NIYUxMd0Rp","repeats":1},{"count":99,"lower_bound":"M2M1VnRVdlZ6Z3Bqd05VNDdmdjJ3OXR5dkFVOTQ=","upper_bound":"M3RVMUVoaDltcXI1QkYzMQ==","repeats":1},{"count":107,"lower_bound":"NA==","upper_bound":"NDJ3eDJVTFltMEEydm5Zd044aFE=","repeats":1},{"count":115,"lower_bound":"NDUwWg==","upper_bound":"NFJwSVljUE02SjBRV08yRXdKd2pmY1pkeEpV","repeats":1},{"count":123,"lower_bound":"NFY4TVk3TVIzY0s=","upper_bound":"NFljVUcya0NYUXhz","repeats":1},{"count":131,"lower_bound":"NGlUS1NMdw==","upper_bound":"NHUyRkE2dw==","repeats":1},{"count":139,"lower_bound":"NHZZTA==","upper_bound":"NTl4RmdJ","repeats":1},{"count":147,"lower_bound":"NUQ0aG5BMEJ6WGd5d1pRVlRhc053dUFaZXgyNzJn","upper_bound":"NU1MOTJXNGZ5UFNCREFwVGxjcXBtb204WVJXTm1kNlI=","repeats":1},{"count":155,"lower_bound":"NU5OaXA4WklwQldPVmtQSVd0NkZEdXpodGw=","upper_bound":"NXBJMlg=","repeats":1},{"count":163,"lower_bound":"NXEyQTlsUktaN1lR","upper_bound":"NXpUWEE=","repeats":1},{"count":171,"lower_bound":"NXpmbEs2d00=","upper_bound":"NkF5SzF6akZjd0JuR1A0aWU=","repeats":1},{"count":179,"lower_bound":"Nkx6Y3FEV0FkR1c0NXZxNUl2cWpXOUg=","upper_bound":"NmVqRzA2NkoxaUFFRmI2MnFaVzNQU3RCTTQ=","repeats":1},{"count":187,"lower_bound":"Nm94RHJla005MUN5eU96eEI5NEZ0d0pITXFrRFJ0YmI=","upper_bound":"NnlSMkRKZWRVTm90T3pHWlIz","repeats":1},{"count":195,"lower_bound":"Nw==","upper_bound":"NzhER2NHNnRySVNseldwWQ==","repeats":1},{"count":203,"lower_bound":"N0RBUWtOT2tCTkFYZDF6Sm9ZMw==","upper_bound":"N0pabUl6bG9VT29mVGN1U2g=","repeats":1},{"count":211,"lower_bound":"N05lVmRZSzIxTXBEMHZIUlhVSDVWeTRmRGgyT3JF","upper_bound":"N2Fmb2NYMGQ=","repeats":1},{"count":219,"lower_bound":"N2lKbFdrSQ==","upper_bound":"N3N3TFJVME1uSjlFU0dXTjlYMEp3MThpS0dkZFZKVw==","repeats":1},{"count":227,"lower_bound":"ODVZb3BmWEd3a2lzSUw4","upper_bound":"OFBGdkw5c0o5bUo0Y09LeXJp","repeats":1},{"count":235,"lower_bound":"OFlWZjB5MFRF","upper_bound":"OGRYMDQ4TGh5NGlJMThzVWl2","repeats":1},{"count":243,"lower_bound":"OGZi","upper_bound":"OG1FenhDc2ZQRmE4NGR5QXpkWnhFUGJCVGI=","repeats":1},{"count":251,"lower_bound":"OHFEMGh5MzVvbWMyaW4=","upper_bound":"OHRyeEZWSG5GdXpTTEpqNUpUWlc=","repeats":1},{"count":259,"lower_bound":"OHZDaEU3VzFaYWdZbnlCeTl3bXNIZlJwSkRu","upper_bound":"OUJwTWpDVGE5TTJXY2t4Zg==","repeats":1},{"count":267,"lower_bound":"OUJ0MnpqSkJIazNJenY=","upper_bound":"OUk=","repeats":1},{"count":275,"lower_bound":"OUk5YUg5NTVvZnNP","upper_bound":"OVdZZjA4amtTZlhGcQ==","repeats":1},{"count":283,"lower_bound":"OVlnN09sc29ZNUlGdHI4VXdrT1BTVTY=","upper_bound":"OWVxSHZoZFpMVGQzWA==","repeats":1},{"count":291,"lower_bound":"OWZDQ2ZVUkRUeA==","upper_bound":"OXVORlZOMFpEemVOVmxlbmF2R09zY1VW","repeats":1},{"count":299,"lower_bound":"OXdVaGVv","upper_bound":"QTNVZFlVeE5QOXE1U1dwMnZnVmhOMGlWUkNpUg==","repeats":1},{"count":307,"lower_bound":"QTVGTGhDaQ==","upper_bound":"QUVjelI0MlA=","repeats":1},{"count":315,"lower_bound":"QU4xVGhSQW5HcG9vb1E3cw==","upper_bound":"QVc=","repeats":1},{"count":323,"lower_bound":"QWRDSjFyekV5MUQ4NncySW9sTHNFMGlveA==","upper_bound":"QW1BSnZTY1dEVDd5M2tqZnprM0c2a3JqV09wYQ==","repeats":1},{"count":331,"lower_bound":"QXY0eHFxM3lxSGkzQkVZQWxpYkxT","upper_bound":"QjJzRmJTNmgya3k=","repeats":1},{"count":338,"lower_bound":"QkZvb2QwZk9D","upper_bound":"QlZJMzUyZ0x2cVlUaGg2ZGtqeUY=","repeats":1},{"count":344,"lower_bound":"QldOTlY0Qg==","upper_bound":"QlkyMTlBTHd1","repeats":1},{"count":350,"lower_bound":"QmExV1hsTm85T3d1b0ZsTndHQ3lPcXE=","upper_bound":"QmlvOXAweWRTcnRCbzZwSXk5Und1bw==","repeats":1},{"count":356,"lower_bound":"QnF1UDJKZDN4UUhHbFhRUzRYekhPMEM1U0pvQjgxZzc=","upper_bound":"QnhTWWZvZ1d6dzkzWm54bW5ZNWNGR1phSHdKUHlaag==","repeats":1},{"count":362,"lower_bound":"Qnl5bllEektVWTBzR0JxWWFtTmFORlZ1MEQ4M1Ix","upper_bound":"Q0NPVW00RVRld0wzR3NuclV4VA==","repeats":1},{"count":368,"lower_bound":"Q0g=","upper_bound":"Q0lsNjVhYkloWlYzM2FsTWIzcXh6YjNPN2ZFT1I0dQ==","repeats":1},{"count":374,"lower_bound":"Q1BIaA==","upper_bound":"Q1l5WlMyVU45SHU0","repeats":1},{"count":380,"lower_bound":"Q2M3UjRz","upper_bound":"Q2Z2ZW9HOA==","repeats":1},{"count":386,"lower_bound":"Q25OTE9BeFBHRUIySWJBZGQyag==","upper_bound":"Q3d5Q1BWQjlEdUxQNQ==","repeats":1},{"count":392,"lower_bound":"Q3g0VmNiR293TUli","upper_bound":"RDFyQnpPYnZaNjR3ZFhWc2Y=","repeats":1},{"count":398,"lower_bound":"RDJkVUxRd01ZbTJY","upper_bound":"RERtTTN2UmRINg==","repeats":1},{"count":406,"lower_bound":"REVLcEhMbGN1TG82bW5TNmtWVWVC","upper_bound":"RE1wZElFNlZQNWI=","repeats":1},{"count":414,"lower_bound":"RE8=","upper_bound":"RFo3MXVm","repeats":1},{"count":422,"lower_bound":"RGV1RXhQ","upper_bound":"RGtnZTM=","repeats":1},{"count":430,"lower_bound":"RHJDbndQYUIyUnl4anA4R29ub0l6QmJMYWs5a3E=","upper_bound":"RTVGTzJrWjNMZkNITk1Tb0NFUFBpRHU=","repeats":1},{"count":438,"lower_bound":"RURwRWZybkRKMDludHd4VmJoVlpMeFFCbA==","upper_bound":"RUk1YjFNTTBTRUkzcElQYjRuTjdTTk4xMGhqdVlD","repeats":1},{"count":446,"lower_bound":"RU9aYnZ5SUthQ1BIWFVxU3JQ","upper_bound":"RWFHcEE1MzM=","repeats":1},{"count":454,"lower_bound":"RWJqNmRBS2NhTnpod0RzVXJNYk40VFo=","upper_bound":"RWx4WmNDTGdacTI4SERNekR4U3hObQ==","repeats":1},{"count":462,"lower_bound":"RW5TN3JXS2lNY1ZZ","upper_bound":"Rjl5Wms2YUhkVA==","repeats":1},{"count":470,"lower_bound":"RkE0Yzc0N2FOUTM=","upper_bound":"RkdZZWNZdGZTNE0yZmh3MnNNTm1ITDJybTdUbjc=","repeats":1},{"count":478,"lower_bound":"Rk8wTVAza2cxSEtEQjRvM1loZTRwU1BsekM4UQ==","upper_bound":"RloxTkFXNUlsc1l2VThIMzZxYTVqcEZramd0WGl6TQ==","repeats":1},{"count":486,"lower_bound":"RnprUHowd0RJSkNMUw==","upper_bound":"Rzh5Sk0wVWE=","repeats":1},{"count":494,"lower_bound":"R085TkxpNkNDNlZycHg4dTVOTGU0MnE=","upper_bound":"R1lVRmNNa3VRVGJDQ25sUjkzemRzZnRRc0trVDVDQzg=","repeats":1},{"count":502,"lower_bound":"R2RYbTlUWjBET2J3UVU1OWoydlRLcFRKTm1saw==","upper_bound":"R2ZtYTNteWE4ek5vYnVSeVN4cVFNZ3FWd0U1QlBO","repeats":1},{"count":510,"lower_bound":"R2lwZ3dMeA==","upper_bound":"R3gxQnhBaQ==","repeats":1},{"count":518,"lower_bound":"SDA=","upper_bound":"SEtoTnlXMGt6bFlrRHMwZQ==","repeats":1},{"count":526,"lower_bound":"SEt0ZE92Y1B6ZnJPSm5vSm42TGkzZWZ3bHQ2b0pKenA=","upper_bound":"SFBuN0FCcEpndWkzV3htYUkxUVpsRXZET0kwN1o=","repeats":1},{"count":534,"lower_bound":"SFdKejd3c2xQOEFrVFJiWDcxZnpITFNH","upper_bound":"SHQ1R0lyN3lXOXU=","repeats":1},{"count":542,"lower_bound":"SHlLdXFYczdwTUd2SVhnc0V2eW1EaFNrdm1xRQ==","upper_bound":"STJwa2FDVU16S0NLUzJoeThidEJqYTc=","repeats":1},{"count":550,"lower_bound":"STNjTA==","upper_bound":"SUli","repeats":1},{"count":558,"lower_bound":"SVR0WjBiUlBDRDA1TVN4N2tUT2dFbUd2","upper_bound":"SWcwQ1lOV04xNU91MEQ2Q3FOd3o2c2swd0pLekY=","repeats":1},{"count":566,"lower_bound":"SWc5RTl0ZmQ2","upper_bound":"Sg==","repeats":2},{"count":574,"lower_bound":"Sjg3MkVGdUQ4TUprWVhmRw==","upper_bound":"SkdyTU54c3BYYzZvTjBwbFRDcmpLeEY=","repeats":1},{"count":582,"lower_bound":"Skg=","upper_bound":"SlF3alA0VzdtQ0RoZkpSa3o=","repeats":1},{"count":590,"lower_bound":"SlNOeA==","upper_bound":"SmtUMGN2ejlmWjdqZkxYWG1wSnlLYQ==","repeats":1},{"count":598,"lower_bound":"Sm9CSm5jUmhIRUZQY1BYa25HQjB1MFl4MFY=","upper_bound":"SnJDb2hodFRZbGVqcUJWUjl0dHhldnlaZw==","repeats":1},{"count":606,"lower_bound":"SnJQWWV4Y2VlV25ZblhT","upper_bound":"S0hDUVFs","repeats":1},{"count":614,"lower_bound":"S0hLQURqQ0tQc0c2RXZaUzJWZw==","upper_bound":"S2ExeUtBTkd3Q1NMaw==","repeats":1},{"count":622,"lower_bound":"S2tjVTVTc1dON1RMVGtxV3hOZXdvMWtucWViN0o=","upper_bound":"S3o5M1hsV1dIeg==","repeats":1},{"count":630,"lower_bound":"TDMzT3hHVDhXRU1nbmxUUTEzQUt5Rw==","upper_bound":"TEwzMkpSZkV5SkdLVFpYODAxdDV6ZHpsYVVU","repeats":1},{"count":638,"lower_bound":"TE04V2xqMFA4Y295aTUxclFmVzYzNA==","upper_bound":"TFdVOFVzRTQxVXhTSTNtSGRQejBkR0JKbFQ4bA==","repeats":1},{"count":646,"lower_bound":"TFhxbEo1RFRTSFl4Nms5REdrTkpqQ0ZI","upper_bound":"TGU2c2RjcnVjQ3I0QUc1RQ==","repeats":1},{"count":654,"lower_bound":"TGdzWkg1alh4dlVJc0diOWlZc0JWNkhUY2RGMkJKZmU=","upper_bound":"THB5eQ==","repeats":1},{"count":662,"lower_bound":"THM1QnVZMURxckxJdEJ6RGtpSA==","upper_bound":"THlxWGdVM1FMUDE5cmg1eg==","repeats":1},{"count":669,"lower_bound":"TTE5WDE=","upper_bound":"TTRFMmI2TEFNNk40YjZFcnVuRnlpZFhzTzRPUlQ=","repeats":1},{"count":675,"lower_bound":"TThTem1YY1RWbjd4NVpnUG4=","upper_bound":"TUt0eks=","repeats":1},{"count":681,"lower_bound":"TVIxRG5LaUNCWDNRNlpIV1liMVFh","upper_bound":"TVlSZldoMnE5SzdtMEI=","repeats":1},{"count":687,"lower_bound":"TWU4QWkyYTVvZ01nYWlvcTVhS2V4czV5bVc=","upper_bound":"TXZ2emh3TA==","repeats":1},{"count":693,"lower_bound":"TXhtTWx1S3NoTU5lOERGQ0ptTW1wMkds","upper_bound":"TXlmZ1B3Sm9OT1psc1lNWG8xVno=","repeats":1},{"count":699,"lower_bound":"TjBEbnpwY3owaE56UmRSZUg=","upper_bound":"TjFOWnZmTWUwOExnWDJwd1I4dlUz","repeats":1},{"count":705,"lower_bound":"TjhrU1ZzWmJjRkd1cjk5aktaVm5QQlVP","upper_bound":"TkNjcUt6MUNxN294NWlIZ0owaTVqVU8=","repeats":1},{"count":711,"lower_bound":"TkRBbnR4QlFNZkM2VkFLZGFKVklPQVhuNWFD","upper_bound":"TkgxWXpWMFhy","repeats":1},{"count":717,"lower_bound":"TkxhczVwZk1EOWlCMG12NHk4ZlVNem9TZU0wR2hB","upper_bound":"TlJZaVAwQXkwUnZ2bQ==","repeats":1},{"count":723,"lower_bound":"TlJsQ1Yz","upper_bound":"TlNSMTdDUVV1MFAycU5wbGVjOE1P","repeats":1},{"count":729,"lower_bound":"TmM2SGVaYw==","upper_bound":"TnFhTG5VWTNXc3JzSnZOc2d6TA==","repeats":1},{"count":737,"lower_bound":"TnJmWTNGRHlnTlBoY3ZpVGJjcW5lMlRISVJyM1Y=","upper_bound":"Tw==","repeats":1},{"count":745,"lower_bound":"T0U5RUh3QjJvT3F3","upper_bound":"T1h3cXlu","repeats":1},{"count":753,"lower_bound":"T1k=","upper_bound":"T2RscXFKMUZmQktJSg==","repeats":1},{"count":761,"lower_bound":"T2l4Rk1iZ1c2VTVkbTZCSVJmVmpGNGVzRDY1","upper_bound":"UERTSk1paFNjS1hOZUdBM2FFTVdXTWh6cg==","repeats":1},{"count":769,"lower_bound":"UEUwMlBlMDV6b3ZjaXU3eTNSaWtGRUltYjFzMVdVc1c=","upper_bound":"UElRTVc0b1VWeTRzaGM2","repeats":1},{"count":777,"lower_bound":"UEl2Vk9mUWVubHlkQ0NoN08wTllHS0taN2M=","upper_bound":"UFRtRlBhdWZGWlpG","repeats":1},{"count":785,"lower_bound":"UFZ1TXRqY3c5QTFZUzBPaTZYWm8=","upper_bound":"UFloSXVsNTRxWlFBNkdCWUxINGVSeA==","repeats":1},{"count":793,"lower_bound":"UGJDcVFHazhY","upper_bound":"UHJSb0hLb0lTVzVFZmd0Ujh0M01HTnM0NWc=","repeats":1},{"count":801,"lower_bound":"UHRBQnBCR0dZUFR2cTZVV2R2eHZHY1UwSDh0","upper_bound":"UTAxTnFx","repeats":1},{"count":809,"lower_bound":"UTQzc042czk1cjZPZFVmdmVu","upper_bound":"UUFWWTR1Q08xT0l0UGsyVEphdg==","repeats":1},{"count":817,"lower_bound":"UUJES01zZg==","upper_bound":"UVU2cg==","repeats":1},{"count":825,"lower_bound":"UVZTVXd0QWd1eUg0Q2gwZ3hJbG5WZElLeU0=","upper_bound":"UWV4VnNPbnJMWTAxc2VjSjFIaVZp","repeats":1},{"count":833,"lower_bound":"UXVpdWxpQzFZOFRVb09RVHZzNkJydw==","upper_bound":"UXpCdzBYcTJtM0ZIQ1ZRSGx3R2ptVXVYMg==","repeats":1},{"count":841,"lower_bound":"Ug==","upper_bound":"UjZWTXYxVGVSd29EUHRBT2ZTRGFuQ0p3enBETTBBTDc=","repeats":1},{"count":849,"lower_bound":"UjZ0dXVkTlF6bUMwUkZWTVpvMk5DcExtM2RvNmFXSg==","upper_bound":"UkJ5SWZmTFM=","repeats":1},{"count":857,"lower_bound":"UkVZcG5XREtZYjV5WDhMRXpZM0FOSzJ3WnFvYUk=","upper_bound":"UkpEZFBl","repeats":1},{"count":865,"lower_bound":"Uk1kTENMSHVGbVlBVTBTb1FLdm1pblM=","upper_bound":"UlRCdU1xemRFUG8wRms=","repeats":1},{"count":873,"lower_bound":"Ulc=","upper_bound":"UmNVRng1ZGRsZUNJZ2haZVFxcGNoT3FiWWt0ZzlK","repeats":1},{"count":881,"lower_bound":"UmRuRVdUVEN4SDE2bEZ2bFI0Qm4zZW50amVCVA==","upper_bound":"U0FOeWtvRjUwNFJJSjlja3lXQVhi","repeats":1},{"count":889,"lower_bound":"U0Q1dE5Ta3Nu","upper_bound":"U0hCVWwxMUVQdFZK","repeats":1},{"count":897,"lower_bound":"U0p2ZUhVOGJBUWtUc0VXMEx4Z0xmOGhaMFM=","upper_bound":"U1FFaXpOdGlxVVBsamJ6UHlwMTg=","repeats":1},{"count":905,"lower_bound":"U1VKNURWcWxnMTBDd1c=","upper_bound":"U1ZwcXpVU3Y1NHAwMk1oOHhyRg==","repeats":1},{"count":913,"lower_bound":"U1hST0Ra","upper_bound":"U2RZNlRieEdTNldSUw==","repeats":1},{"count":921,"lower_bound":"U2lpYlZEZTBoN0JiSEZEUjJCd3R5RQ==","upper_bound":"VEYzeUFFcDBvV0ZKeUhrdnpw","repeats":1},{"count":929,"lower_bound":"VExuVHl4azhNM0pFTEUwTTUzdG90TWR5d2JtQlBu","upper_bound":"VFcxYW4=","repeats":1},{"count":937,"lower_bound":"VFpCblVvcEZsVzZTZU5LTEhi","upper_bound":"VGN5","repeats":1},{"count":945,"lower_bound":"VGZtMWdwNXFCckxCTE9lekZLN2NOZWlpeURyanZLeA==","upper_bound":"VG1oTDdmSVhEbWVCVWpL","repeats":1},{"count":953,"lower_bound":"VHNNelo=","upper_bound":"VHVlQktFY01qdVJOamo=","repeats":1},{"count":961,"lower_bound":"VQ==","upper_bound":"VTZ3amc3UW1Wc25QeVZEQTVUR3JsM0JBd3E=","repeats":1},{"count":969,"lower_bound":"VUFTUDdXdHRUZ3NIeDUwWXc3WmI=","upper_bound":"VUxqYlpjTnVkRjd2U1hGZHh0WHdzSQ==","repeats":1},{"count":977,"lower_bound":"VVRW","upper_bound":"VXBtUEpzQVJ2TlJ5eEhl","repeats":1},{"count":985,"lower_bound":"VXpDbWwxWUNYVUY0OXoxanNTT25FQ1RjZFNGSHk=","upper_bound":"VjRQaUlxT2NFNg==","repeats":1},{"count":993,"lower_bound":"VjYyYmo1VURvQlg2VktaQk5jQnpTa1JLdDViS1U=","upper_bound":"VkFxeA==","repeats":1},{"count":1000,"lower_bound":"VkQxZVBJUEdxekdjVA==","upper_bound":"Vk42UUoyeTRxUVk5c0tSaXhr","repeats":1},{"count":1006,"lower_bound":"VlMydEpVb2Q3bk5CdUVoeUt4RVQ0U0lxeng=","upper_bound":"VmNSb0xqR1RKdGRuclI3S3lINw==","repeats":1},{"count":1012,"lower_bound":"VmRpckd1eA==","upper_bound":"VmZJNHVWa3RMQ3Nsb0d2SDI=","repeats":1},{"count":1018,"lower_bound":"Vmh2YnpzYmc=","upper_bound":"VnBmd2taUkFURlpUVXVxTnBjbENxYml5OU1NRU9GbA==","repeats":1},{"count":1024,"lower_bound":"VnF3UVJKVk1Wb3pyWXRKUzJrNUlY","upper_bound":"VnlteGZUWXNWa0JDVg==","repeats":1},{"count":1030,"lower_bound":"VzE5OWt4M1czT0xTbmFTVGs=","upper_bound":"VzhGMVA4ODJaM29SQ0Zy","repeats":1},{"count":1036,"lower_bound":"V0FacGxDT2pkQQ==","upper_bound":"V1dOajNpNUw4TDhrUFpZMENJR2NDcG81Qmw=","repeats":1},{"count":1042,"lower_bound":"V1g4cXpF","upper_bound":"V2VUMGdvNA==","repeats":1},{"count":1048,"lower_bound":"V2ZXOWxhU0VlYW94a0VONFZLMVlqWlVabXhQOXRH","upper_bound":"V2x3SWdUZjZHbHo0WEkyV21QQUxIVFM2WXd4S052","repeats":1},{"count":1054,"lower_bound":"V29FWg==","upper_bound":"V3AzWW5uc0RxTVg=","repeats":1},{"count":1060,"lower_bound":"V3ZncE4xaA==","upper_bound":"WA==","repeats":1},{"count":1068,"lower_bound":"WDBoTA==","upper_bound":"WDhORUE5dFl4QUg5c1cxVjFOdWRiSUM=","repeats":1},{"count":1076,"lower_bound":"WEJVUGdMeGZaU1BjRnlNaVFuaWRtQQ==","upper_bound":"WE16WlJhakxoanMzajQ5","repeats":1},{"count":1084,"lower_bound":"WE9DMlRTMTJGQ3U=","upper_bound":"WGRWeFREYW84V1FlaVVuSG85OHV1dTZR","repeats":1},{"count":1092,"lower_bound":"WGZ0U0tTaW02MHBUUlVIdFp3blBZa2dVYXdW","upper_bound":"WHd1M3RMVGYz","repeats":1},{"count":1100,"lower_bound":"WHlRNlpXd3h0TQ==","upper_bound":"WTdzMk56Z2l4aEE=","repeats":1},{"count":1108,"lower_bound":"WUFMM3dUYmxuVzFQMXBoRjN1b0RTM1Rj","upper_bound":"WVI3dkdEOW1mWkN0djN2ZWNhbTJhUG9GY21kcA==","repeats":1},{"count":1116,"lower_bound":"WVN0Z0FKWUJ1","upper_bound":"WWFZWURubTFFaWswcVQwSm9QMU8=","repeats":1},{"count":1124,"lower_bound":"WWlSUVNIY085SWpFMlphOTBaT2pDNUk3bG93","upper_bound":"Wg==","repeats":1},{"count":1132,"lower_bound":"WjJnYzE5OUdyUnZqZ29YanQzS1lYSVpDa24=","upper_bound":"WkxEWEhrNUpPZEhNRFpsU2NxYg==","repeats":1},{"count":1140,"lower_bound":"Wk0yUXlmbTN0SXN4RTE0dWZLM3pTUw==","upper_bound":"WlhWUWhxWGJEa3pZeURWM2JBUTF5RlJSdHhP","repeats":1},{"count":1148,"lower_bound":"WmlQRjdOSDVoR1lxZnRo","upper_bound":"Wm8=","repeats":1},{"count":1156,"lower_bound":"Wm9IUkp1bkZOUDgxVFdFRg==","upper_bound":"YQ==","repeats":2},{"count":1164,"lower_bound":"YTNTaXhBOUVvcnNMQ1dYQkJXczVBSDI=","upper_bound":"YUdOSmUwaXVt","repeats":1},{"count":1172,"lower_bound":"YUhpMlJkdQ==","upper_bound":"YVBtcU5UN1RNSnV2","repeats":1},{"count":1180,"lower_bound":"YVo2Q000YUxSS0tlWkF0bnh4aW9ucA==","upper_bound":"YWp4YkNHTk1aem1UMzZ4cHhINlB1TQ==","repeats":1},{"count":1188,"lower_bound":"YWtpamR1YVpYRTJZdjg0Qm1QUkYzd295V1JQbUYwSW0=","upper_bound":"YXZPQUkxVGZNalo0aVBoY2dXUFN5MU9E","repeats":1},{"count":1196,"lower_bound":"YXlwNWFaR3NDTUJUSjRXY3A2SG1PMlg=","upper_bound":"YkVqc1NzWUN5cUw0eXdhamY=","repeats":1},{"count":1204,"lower_bound":"Yks4dVByVWs4ZlNud3AwS1pxNGVoQmx5b3BuM2FyczA=","upper_bound":"YlVtbURoUjk=","repeats":1},{"count":1212,"lower_bound":"YmM2RE5tOWRmdkI0MzE4TVJhTEp6ZQ==","upper_bound":"YzBCdnUwWg==","repeats":1},{"count":1220,"lower_bound":"YzdycA==","upper_bound":"Y0RCTUxZeENQZ0w1Mg==","repeats":1},{"count":1228,"lower_bound":"Y1JBM0xaenVVVTNxMXdsRktiVWlCWERTQg==","upper_bound":"Y3U3alVaYzJNSWls","repeats":1},{"count":1236,"lower_bound":"Y3ZMOGhiUmNhZ3ZDeXFJN25mQQ==","upper_bound":"ZDNm","repeats":1},{"count":1244,"lower_bound":"ZDhWUWdt","upper_bound":"ZFI4SjUwR3E=","repeats":1},{"count":1252,"lower_bound":"ZFNsNzExdW1hUDNOSzlpbFdlZ1l6QklBSk0yaGtGSDY=","upper_bound":"ZFZnVEhNRUY5ZjQ0ZGhEYURCcm9tTFVM","repeats":1},{"count":1260,"lower_bound":"ZFpicHgxWVJHMDdabnpaNFExaHNZRg==","upper_bound":"ZQ==","repeats":1},{"count":1268,"lower_bound":"ZTJoWVdLU1FhODdMUmZJUktNNml5OUoyQUtHcg==","upper_bound":"ZVBIQnZOVWJ1OG1oaDhackNKaGYwSUY5NnpB","repeats":1},{"count":1276,"lower_bound":"ZVJtYVRSWXVkUndFRmpVT2Q=","upper_bound":"ZVlOVE5mUmpQR2pyMkoy","repeats":1},{"count":1284,"lower_bound":"ZWVMdjNWdTNsa0l3MTh1N3Vqcg==","upper_bound":"ZXZHVlRvSDhDWmxUZA==","repeats":1},{"count":1292,"lower_bound":"ZXZYZ3ViYWhuU0Nj","upper_bound":"ZXpSVnZtSlg0bExYYXNkczJvcDdM","repeats":1},{"count":1300,"lower_bound":"Zg==","upper_bound":"ZkkxbkhDWTVV","repeats":1},{"count":1308,"lower_bound":"ZklnZ0lIVFNhWWJOUldFT0tZYQ==","upper_bound":"ZmlsZFFlZUtEaTg3SHNwcEtvYjI=","repeats":1},{"count":1316,"lower_bound":"ZnM1ZUVRcHlXTFFRbEhlRlFYNms4MFE=","upper_bound":"ZzI2R2RVdGg=","repeats":1},{"count":1324,"lower_bound":"ZzdTS0hKUWxZS3NXa3YxS2JVZG5JWlFSc01ySlpY","upper_bound":"Z0Q4OHVuYzY3M0lTdDNlSEw4azdNZ2xuU2M0RzRI","repeats":1},{"count":1331,"lower_bound":"Z0g=","upper_bound":"Z0tSdGtRb3p1WWpDUUVCY1RVS2hP","repeats":1},{"count":1337,"lower_bound":"Z055Qnh1ZExT","upper_bound":"Z09SbGY1NWVpNHlYUkJjbFRYNmM=","repeats":1},{"count":1343,"lower_bound":"Z1NCa3VnSk92dFRU","upper_bound":"Z1hvVnI5ZU5FZHhRQ0NLYUd1WkRHcA==","repeats":1},{"count":1349,"lower_bound":"Z1ltZ1RreXZOdWx2dmw1WG9nR0Rw","upper_bound":"Z3d4ZzZ6ejc=","repeats":1},{"count":1355,"lower_bound":"Z3lMeExHTFJCRVFycHlQR0s=","upper_bound":"aDIwdG9Ia2o=","repeats":1},{"count":1361,"lower_bound":"aDVhZmdIYnpIalRIVmNZZlU=","upper_bound":"aEJo","repeats":1},{"count":1367,"lower_bound":"aERDUUYzaFhIVE5IVnl6TDJXdGV6cVI=","upper_bound":"aEpwc004STQxbldUeW9OdUlFWFZa","repeats":1},{"count":1373,"lower_bound":"aExEamg0SkFwMWpkWmI=","upper_bound":"aFFwOEd2bg==","repeats":1},{"count":1379,"lower_bound":"aFg2Tk5rejlBd3o3SnFtU00zcUdwRm5oNkdsc2Z5Ug==","upper_bound":"aFhn","repeats":1},{"count":1385,"lower_bound":"aFlKSGo2eVNJ","upper_bound":"aGZQMk44cFgzUjVBMzlOSUYxY3VmWUhFQVdY","repeats":1},{"count":1391,"lower_bound":"aGtoSUZoT05nR2hqaVlVOFE5MjYwdw==","upper_bound":"aHF3ag==","repeats":1},{"count":1399,"lower_bound":"aHRIb2xaRQ==","upper_bound":"aTRyMmhG","repeats":1},{"count":1407,"lower_bound":"aUFjSEoxYW5CSUZU","upper_bound":"aURWeWlYZkRVMEwwSjhhbDY5WlBQTTd2","repeats":1},{"count":1415,"lower_bound":"aUhaV2lCUjZwSFdiMGU=","upper_bound":"aVp2U2lDOFZ0NHpPS3lReUZrY1BsSDRPVlE=","repeats":1},{"count":1423,"lower_bound":"aWV0TWRPUllraWpqV0M3VXJHZ1A0aHpF","upper_bound":"aWxaaDVNWk01d3pUVThyRm56Ng==","repeats":1},{"count":1431,"lower_bound":"aW1Ha3RiZmJ5aWFrNmR0TWFpYXdBN2FrSE1w","upper_bound":"aXE0eXR3S2RWNm01T3NpV3I=","repeats":1},{"count":1439,"lower_bound":"aXZOaGZvN0JheG0yUE0=","upper_bound":"ag==","repeats":1},{"count":1447,"lower_bound":"ajNOeGgxbUZpUjhEWXBHbTlNdlhYZQ==","upper_bound":"ajhkWHM1Z290WFczNUxBdUZhTjB6REZtNA==","repeats":1},{"count":1455,"lower_bound":"ajk2QWlHYk1hMDFMZTNJTjdTNGxk","upper_bound":"akh0WkhBVmVzcXlUbVdubnVyYkxUcmM5M3NXOHRN","repeats":1},{"count":1463,"lower_bound":"ako=","upper_bound":"amV2ODdZTEtCMVg=","repeats":1},{"count":1471,"lower_bound":"amdXbDY4aHNZQ3BEQVNYTUFZWXU=","upper_bound":"anBFTk8=","repeats":1},{"count":1479,"lower_bound":"anVuZ2t3QXpiZE5HSnNjeFhRQ1duZXpDZ0ROUXM=","upper_bound":"azVQSXNzdW1WMUI=","repeats":1},{"count":1487,"lower_bound":"azdndXR5MmNxaGJZUWJVQUNoaFBEakhSTzBzanY=","upper_bound":"a05UR3lHaFpPVmU1Q2pqR0p5MmxjYTR1SXpxUjQ=","repeats":1},{"count":1495,"lower_bound":"a09QNzhDMVc1WDNhWXQ=","upper_bound":"a2gzSEZQc1RwelhXb0NJZGcyUUFXSA==","repeats":1},{"count":1503,"lower_bound":"a2lrQUNHVmJSRDJmQjg=","upper_bound":"a3pBTmlhejc0Y29nTFRMYjhBNnNO","repeats":1},{"count":1511,"lower_bound":"bA==","upper_bound":"bENVRmR6N1hydkRYdzB4QUlMNmNMUGZiaDc4OWU=","repeats":1},{"count":1519,"lower_bound":"bERLRDA=","upper_bound":"bFJDb2p1V0k0Y1EyZWIyQ3JycHhN","repeats":1},{"count":1527,"lower_bound":"bFN3MkFl","upper_bound":"bFhnSklzUGhTQ3ZIOFlDYTNDMUlIV1NnZG9TbTdpTk4=","repeats":1},{"count":1535,"lower_bound":"bGY=","upper_bound":"bHdxekpyMXprQ3VCT2JYRlVxeFhTbmY2UDNFcFBr","repeats":1},{"count":1543,"lower_bound":"bHg5N2FtdWlTSjRnN0Q3S2N6b0RpVkt1TE12dA==","upper_bound":"bTMzYjdwVkpUdkZ1","repeats":1},{"count":1551,"lower_bound":"bTRlWXR1Vm1naXlrQkRzMQ==","upper_bound":"bUVRVHY0dW44NG8=","repeats":1},{"count":1559,"lower_bound":"bUZaT3RwNDVTMXhXU2tCdA==","upper_bound":"bU9w","repeats":1},{"count":1567,"lower_bound":"bU9wQmh4MU5j","upper_bound":"bWJtS0Q2Nk9i","repeats":1},{"count":1575,"lower_bound":"bWRBRlpVU3A=","upper_bound":"bWlyMGI4OUNDRQ==","repeats":1},{"count":1583,"lower_bound":"bWppSEU5Uw==","upper_bound":"bXNq","repeats":1},{"count":1591,"lower_bound":"bXU3SVNqdGV3cGZKRQ==","upper_bound":"bjdWMW54cVYwNzQyS3EzRTZMcHBwMjdMeTg=","repeats":1},{"count":1599,"lower_bound":"bkFiaUQ4S0U=","upper_bound":"bkt6Uktyeg==","repeats":1},{"count":1607,"lower_bound":"bk1tTmNUYjFSbGU=","upper_bound":"blhtVmVSSXhBNzFGYmhJWlQzMzBqMVN4OUE0SFc=","repeats":1},{"count":1615,"lower_bound":"bmV2aThHbnpzN3BHZ2RyZmdqQVROZms3ZTBtTW41dg==","upper_bound":"bmtWVg==","repeats":1},{"count":1623,"lower_bound":"bmtvbWFPZzI=","upper_bound":"bzhiRW81U1RIUnBxOEpEbjJqdWRlcEdLTnk=","repeats":1},{"count":1631,"lower_bound":"bzlYWjB2RnhXUU9vYmdXZQ==","upper_bound":"b0xDdEVXQjQ1NGQw","repeats":1},{"count":1639,"lower_bound":"b1FoVnlma01EOG5ldW9YZ1lmTE53ZWlKZ1Yybkw=","upper_bound":"b2N3d3Rtbg==","repeats":1},{"count":1647,"lower_bound":"b2k3YXd2YjZYWWhSemFqT3NMWmxyQzRnWg==","upper_bound":"cDFa","repeats":1},{"count":1655,"lower_bound":"cDJFSkw1bEs=","upper_bound":"cEtCcXF6N080","repeats":1},{"count":1662,"lower_bound":"cE1mZ0RZMWZjbjVacA==","upper_bound":"cGh4dVhHY3FlNjlrTjdiRVM4OA==","repeats":1},{"count":1668,"lower_bound":"cHA5a1FsVG9NVFVPMm90dg==","upper_bound":"cQ==","repeats":2},{"count":1674,"lower_bound":"cTBpZGU5a24xdHl1WGoyYmk4Qlg3dg==","upper_bound":"cTZTd0pISEY=","repeats":1},{"count":1680,"lower_bound":"cUhUMERRbnZjbmx3eUtmelpWRUc3VzVrNGJ6TA==","upper_bound":"cUw0elh1TVhrbEd5ekY5ZzFjaGNNMQ==","repeats":1},{"count":1686,"lower_bound":"cU1jZEZMeFdiZGk=","upper_bound":"cVhrMzlSMzhIOGFXdlRUSThINU9FREtSUXlnVlpM","repeats":1},{"count":1692,"lower_bound":"cVpJcUdhUWlsRkJkV21VOUhP","upper_bound":"cXZvOUVsZVAzS0xrVFhwbTl6dmJJWFFCMzcyTVdtSA==","repeats":1},{"count":1698,"lower_bound":"cXpiV1hZZmR5QzlobDN0UTNPSHdNcFQzZUI=","upper_bound":"cg==","repeats":1},{"count":1704,"lower_bound":"cjN4cjE0Z3BiZklteFE=","upper_bound":"ckFtekJ2ZEpTdTVPUWxLQjI1dHVHdGRrNGNzWA==","repeats":1},{"count":1710,"lower_bound":"cllQSkgxcldw","upper_bound":"cmt1b1drVGJqa3k=","repeats":1},{"count":1716,"lower_bound":"cmxJdU1rRVhvWmxjRQ==","upper_bound":"cm83WXJoRkZpeQ==","repeats":1},{"count":1722,"lower_bound":"cm9kc2VnR1EybVF3ZTJsYVpl","upper_bound":"cnV2MVNOUldQRkFyT3dtcVhhTDNLcg==","repeats":1},{"count":1728,"lower_bound":"cnZv","upper_bound":"cnlhUHhEb1ZWZGU=","repeats":1},{"count":1736,"lower_bound":"c0FaQm43SA==","upper_bound":"c0lYU0NhYW5vM0t1dWlE","repeats":1},{"count":1744,"lower_bound":"c0pXU21rOU41TA==","upper_bound":"c1JBOQ==","repeats":1},{"count":1752,"lower_bound":"c1R3bThq","upper_bound":"c1lvNkJ5QmpqdQ==","repeats":1},{"count":1760,"lower_bound":"c1psWjV4RFZm","upper_bound":"c2hWQ0JlVGtxYzRy","repeats":1},{"count":1768,"lower_bound":"c2hwY09XbDhYUWJHRllIeTl3dkVBU3ROZEF6Rkg=","upper_bound":"c210QkI3NmRwc0FDVGhKTTNZcjg=","repeats":1},{"count":1776,"lower_bound":"c3FNMzdZSWNQWEhYVmhqT1IwUnZ5S0lleW5RcG5EYg==","upper_bound":"dEJWOTRY","repeats":1},{"count":1784,"lower_bound":"dElTWjVkaw==","upper_bound":"dFN6M0VBN3E2YzJZRUhRSGZXb3FTTDRFaVhocA==","repeats":1},{"count":1792,"lower_bound":"dFhFUGFKd01ZaDEyR0dNVHpDV3g3eWV5STB3cE9ycFQ=","upper_bound":"dGhNSlpJOHZXYUVNQ3VwTw==","repeats":1},{"count":1800,"lower_bound":"dGxrZ05iT0Q3SEpTME1mamNXVzE=","upper_bound":"dHM5WjhoakRDU3o1ZnBmUTQ4QVJCZ3g4WWtXUVhq","repeats":1},{"count":1808,"lower_bound":"dHd2NDFr","upper_bound":"dQ==","repeats":1},{"count":1816,"lower_bound":"dTA0d1c1","upper_bound":"dTJSWEVUV2ZoVjkzZ05Cbm9qdXpXNg==","repeats":1},{"count":1824,"lower_bound":"dTJTNU4yRTBqTEZKc2VLWm0=","upper_bound":"dThIbg==","repeats":1},{"count":1832,"lower_bound":"dThkcXNQRjg5UHRLeHpEYnA0R0lEVjY1TVo=","upper_bound":"dUtaQTlSSFVNZTJpbQ==","repeats":1},{"count":1840,"lower_bound":"dUw2RVRKM21veWMxSVZNMTRBZ1Q=","upper_bound":"dWx5Vk4zWVFBTnZLemNodFFtZDB0Sks=","repeats":1},{"count":1848,"lower_bound":"dW5SeXhjMWc2eU1Rc242dnJsR3N4dmxJ","upper_bound":"dg==","repeats":1},{"count":1856,"lower_bound":"dk1IelpXUHRJMHBWTTQzUmo0blFsS3AwTzIzS3Y3","upper_bound":"dlY=","repeats":1},{"count":1864,"lower_bound":"dmdyc1lj","upper_bound":"dnQ1dVh1M2J3N3B3UDJlME9CVEdPWDFzbg==","repeats":1},{"count":1872,"lower_bound":"dnVLTjNNbjJBUTFYUjRXdw==","upper_bound":"dzBPeUtSS0xMVUFpTXdIUjlvMFUycjRLdUc4","repeats":1},{"count":1880,"lower_bound":"dzJjSkNteVlkbDFocTNNVU5xUWFwQkl0TUtY","upper_bound":"d1RkTg==","repeats":1},{"count":1888,"lower_bound":"d1c4bkhsaXdKRnpXdUZYcGI3Sg==","upper_bound":"d29VT2RWdk5pRjJkZnZGUQ==","repeats":1},{"count":1896,"lower_bound":"d3dJV1F6NThRQnpHN0hMUmZ6TkZxRnlTbXcw","upper_bound":"eDlzQktSZm12U1YxZzZn","repeats":1},{"count":1904,"lower_bound":"eERlYmZkcHFlZTI2SE1mQjN1YmYyZzJR","upper_bound":"eEhPWHR0a0txRXpJV2p0M3FmSUhhNE1HWHJ3Sw==","repeats":1},{"count":1912,"lower_bound":"eEl1aTR4VUJXMkNwNmo=","upper_bound":"eE1u","repeats":1},{"count":1920,"lower_bound":"eE5OM2Fpd1A3eGR1eDV2SGZmbjFpWEl4cGg=","upper_bound":"eFh0anVPd0cySUYzTjRtbnNYWnFsVGpKRnVUZVBzUQ==","repeats":1},{"count":1928,"lower_bound":"eGR3anZic0w=","upper_bound":"eG9uYkpFZFBaWUtGYUpxaDlEWm1GM3Vxaw==","repeats":1},{"count":1936,"lower_bound":"eHNvelU4SjhIRU1nTg==","upper_bound":"eUd2","repeats":1},{"count":1944,"lower_bound":"eUpx","upper_bound":"eVF1MHUzdUQ4b0Q=","repeats":1},{"count":1952,"lower_bound":"eVI0cXRxek9kN3J1","upper_bound":"eWVabnU=","repeats":1},{"count":1960,"lower_bound":"eWY5S3B0Z2dnVG9X","upper_bound":"eW5RTGdZaVFDSGNaY1dCQXdkWmY=","repeats":1},{"count":1968,"lower_bound":"eW9DMFVyMjVyWHk=","upper_bound":"eXVrNFZ3T0s0dkw=","repeats":1},{"count":1976,"lower_bound":"eXY0OWlLM1M2NEN3NWVmNjI=","upper_bound":"ejUzemtIV25WR3BNdWJ0cg==","repeats":1},{"count":1984,"lower_bound":"ekQxb1ZRSmRvZ2lmUE13ZDg=","upper_bound":"ek1FYg==","repeats":1},{"count":1992,"lower_bound":"ek82bUpNQWVxM0JabFlLUU5ucjNLd3llZDFxV0M0VDk=","upper_bound":"emxE","repeats":1},{"count":1994,"lower_bound":"end0ZWxGc0tHNDg5eFc1OXNXU0dj","upper_bound":"end0ZWxGc0tHNDg5eFc1OXNXU0dj","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,0,2,0,2,0,0,1,2,0,1,0,1,1,3,1,3,1,2,2,1,0,2,0,1,0,1,0,0,1,2,0,2,1,0,1,3,2,0,0,1,1,1,1,3,2,5,1,0,0,0,0,1,0,0,0,1,0,2,1,0,2,1,0,0,0,2,0,0,1,0,1,3,2,1,0,2,1,3,1,1,1,2,1,0,1,2,0,0,1,0,1,0,1,3,1,1,1,2,1,3,0,3,0,0,0,0,1,1,0,1,0,0,4,0,1,1,2,2,0,0,1,0,0,1,1,1,0,1,1,0,1,2,0,1,1,2,3,1,0,2,0,2,1,0,2,3,0,0,0,0,1,0,1,1,1,3,4,1,1,1,1,0,1,1,1,2,0,1,3,0,1,0,3,0,0,2,0,2,0,2,0,2,1,0,1,1,1,0,0,0,1,0,0,0,1,0,1,2,3,0,1,1,2,0,3,3,2,2,1,1,0,0,1,1,0,0,0,2,2,1,2,0,1,1,1,1,1,0,1,0,0,1,1,1,3,0,0,1,1,1,0,0,2,1,0,1,0,1,2,0,2,1,0,1,1,2,0,1,2,2,1,0,0,0,0,2,1,2,1,1,0,0,0,4,1,0,2,0,0,1,0,1,0,2,2,0,2,1,1,0,4,0,1,0,1,1,4,3,0,1,2,1,0,1,2,1,1,2,0,0,0,2,0,0,1,2,3,4,0,0,0,1,0,1,0,0,1,1,3,0,0,2,2,1,1,0,1,1,1,0,2,2,0,1,2,1,0,1,1,1,2,0,0,2,2,1,4,2,0,1,0,1,0,1,2,1,3,0,0,0,0,2,0,0,3,2,0,0,0,2,0,0,2,0,2,0,2,1,0,1,3,2,1,0,2,1,0,0,0,2,2,1,0,0,2,0,1,1,0,1,1,2,0,2,0,2,1,3,0,1,0,0,0,2,2,0,0,0,0,2,0,1,1,1,0,1,0,0,1,0,1,1,2,0,3,1,1,0,0,1,0,0,0,2,1,3,0,4,1,1,1,2,1,4,1,0,0,0,2,0,1,1,2,0,1,1,0,1,1,1,0,0,1,2,1,0,1,1,1,2,1,0,0,2,3,1,1,2,2,1,1,1,2,1,1,0,0,2,1,1,2,0,2,2,0,1,3,1,0,0,2,4,0,1,0,2,2,1,1,0,0,3,2,2,3,1,1,1,0,5,0,0,2,3,1,0,0,0,0,1,1,1,1,2,1,1,0,2,2,1,1,0,1,1,0,1,1,1,2,0,0,1,2,0,1,0,1,0,1,2,0,0,1,1,3,0,2,1,0,0,0,0,1,2,1,0,0,0,0,0,1,1,3,0,2,0,1,1,2,1,1,0,1,3,0,1,3,1,1,3,0,0,1,0,1,2,1,2,2,1,0,3,1,1,1,0,2,0,3,0,0,0,0,1,0,1,0,1,2,1,1,1,1,1,1,1,0,0,1,0,5,0,4,2,0,3,0,1,0,0,2,1,0,0,0,0,5,0,1,1,0,3,2,0,2,0,0,0,0,1,2,0,0,0,1,0,2,1,1,2,0,0,0,0,3,0,0,0,0,2,2,1,0,2,0,2,1,1,2,1,1,2,3,0,0,0,0,2,1,0,1,0,0,0,0,1,2,1,1,2,0,1,2,1,0,2,1,2,1,0,1,0,1,1,2,0,1,1,0,1,0,1,1,1,2,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,2,1,2,0,1,0,0,0,0,1,0,1,0,2,1,3,1,1,1,2,0,0,0,2,0,0,1,2,1,1,1,0,2,1,1,3,0,0,2,2,1,0,1,1,3,0,0,0,0,1,2,1,0,0,3,1,0,2,2,2,4,0,0,1,2,2,2,2,0,0,0,1,2,1,1,2,0,0,0,0,0,3,0,0,2,0,4,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,1,1,0,1,2,0,2,1,1,1,3,1,0,1,2,2,0,0,0,1,0,0,3,0,0,0,1,0,1,1,1,2,1,3,1,4,0,1,2,2,0,0,0,0,2,2,0,1,0,0,0,0,0,2,0,1,0,1,1,1,1,0,0,2,0,0,2,3,3,1,1,0,2,0,1,2,1,1,1,1,3,1,1,0,1,1,2,1,0,2,0,4,1,0,0,2,0,0,0,1,0,2,2,0,2,0,0,0,2,1,4,0,2,0,1,0,0,2,1,1,2,2,3,1,1,0,0,2,0,2,1,2,3,0,1,0,0,2,1,1,0,1,1,0,0,2,0,2,0,0,0,0,0,0,0,3,1,2,3,0,0,2,1,2,1,3,1,3,3,3,1,0,1,0,0,0,1,1,0,0,1,0,1,0,2,0,2,0,4,1,1,1,0,1,1,0,1,3,1,1,1,0,1,2,1,1,2,2,0,0,0,1,1,0,0,1,3,1,1,0,1,2,0,1,1,0,0,3,3,0,0,0,1,1,1,0,3,0,1,0,0,0,1,0,2,0,1,0,1,3,2,1,2,0,0,0,0,1,1,1,4,1,1,1,4,1,1,1,1,2,0,4,1,2,1,0,0,2,3,1,0,1,1,2,1,1,2,3,1,0,3,1,3,1,2,3,1,2,0,0,0,1,0,0,1,1,0,0,2,1,0,1,0,0,1,2,2,1,3,1,1,0,1,1,0,1,2,2,0,2,2,1,0,0,2,0,0,0,0,1,1,0,3,2,3,1,0,1,3,0,1,3,2,4,0,1,1,0,2,2,1,4,0,0,0,0,0,3,1,0,1,1,0,4,1,0,0,1,1,0,2,0,1,1,1,0,1,1,0,1,0,2,0,1,0,1,0,0,1,3,0,1,3,1,2,0,1,0,0,0,0,0,0,1,1,2,0,0,0,3,1,1,0,1,1,3,0,0,1,1,0,1,1,1,1,0,1,1,1,2,0,0,0,1,2,2,0,0,2,0,1,0,2,2,1,1,1,1,0,2,0,0,1,0,1,1,0,1,0,1,2,0,1,0,0,2,1,3,1,0,1,1,0,1,2,1,1,0,1,0,1,0,0,0,1,2,0,1,0,0,1,2,2,1,1,1,4,0,1,2,0,0,0,2,0,1,1,2,2,1,2,0,2,0,1,3,3,1,2,0,3,0,1,2,0,4,2,2,0,0,3,0,0,2,0,0,0,2,1,1,0,2,1,1,2,0,2,1,0,2,0,0,3,2,2,0,3,0,1,0,1,1,0,1,0,1,0,0,1,1,1,0,0,0,0,1,3,0,0,2,0,1,2,0,1,2,1,0,2,1,1,0,0,2,0,0,1,0,3,1,0,0,1,3,0,1,2,4,2,0,2,0,0,2,1,0,3,2,1,1,0,1,1,2,1,4,0,1,0,1,1,1,2,1,4,0,0,0,1,1,1,1,1,0,2,1,0,1,1,2,0,1,1,1,1,2,1,2,2,0,3,0,1,1,0,1,1,2,0,1,2,1,3,0,0,2,2,0,0,2,0,3,0,2,0,1,0,1,2,1,0,0,1,1,4,1,0,1,3,0,1,1,0,2,0,1,1,1,0,1,0,1,1,1,1,0,1,2,1,2,1,0,1,2,1,0,0,2,3,0,1,0,1,0,1,2,1,0,2,0,0,1,1,1,1,0,2,0,1,1,0,1,1,0,3,1,3,0,0,0,1,1,0,0,2,2,1,1,1,1,2,2,1,0,1,1,0,1,1,1,0,2,1,0,2,0,1,1,1,2,2,0,1,0,2,1,0,3,0,1,1,1,2,2,0,1,0,2,1,1,2,0,1,0,0,1,3,2,1,1,1,1,1,1,1,3,1,1,0,0,1,3,1,1,1,0,0,0,1,2,1,2,1,2,0,0,1,3,0,0,0,1,2,0,0,1,0,3,0,1,2,1,2,2,1,1,2,1,1,2,1,0,0,0,1,0,1,0,0,2,1,1,1,1,1,2,0,1,2,2,2,3,1,0,1,1,0,3,0,1,1,1,0,2,0,2,0,1,0,0,3,0,2,0,1,2,1,1,1,2,0,1,1,0,2,1,0,1,2,0,0,0,1,0,1,2,3,3,0,1,2,2,2,1,1,1,1,0,0,3,0,2,1,0,0,0,1,1,1,0,3,1,0,3,2,1,0,1,3,1,2,1,1,2,1,0,1,1,0,0,1,1,0,0,1,1,0,0,0,2,1,0,0,2,1,0,5,1,0,1,0,1,2,0,1,4,0,1,0,0,0,1,0,1,1,0,2,0,0,5,0,0,0,2,1,0,1,1,1,0,1,1,0,0,0,3,1,5,1,2,2,1,2,0,0,3,0,1,1,0,0,1,1,1,1,0,1,1,3,0,3,0,0,0,0,0,0,0,1,1,1,0,4,0,2,3,0,1,1,1,1,0,1,2,2,1,1,2,0,1,1,0,1,1,2,0,0,2,2,0,1,1,2,0,0,1,0,0,1,3,0,2,2,1,0,1,2,0,0,0,1,3,1,1,1,1,0,0,2,1,1,2,3,0,0,1,1,1,0,0,1,1,2,1,2,1,0,1,1,1,0,1]},{"counters":[2,0,0,0,0,2,0,1,0,1,4,1,0,0,2,1,2,0,0,3,3,2,1,1,1,1,0,0,0,1,2,2,0,1,0,1,0,1,1,0,2,1,3,1,3,0,1,2,0,1,1,0,2,1,1,2,2,1,1,1,1,3,3,1,0,0,1,0,1,1,1,0,0,1,0,2,2,1,2,1,0,2,0,0,2,2,2,0,0,0,1,0,0,0,1,1,2,2,1,3,2,1,0,1,0,0,0,1,1,1,3,2,0,0,0,1,0,2,0,0,0,0,1,2,0,3,1,1,1,0,4,2,1,1,3,0,3,1,0,0,0,0,2,1,0,0,1,1,1,2,0,3,0,2,2,1,1,1,1,0,2,1,2,0,1,2,0,4,1,1,1,1,1,0,1,0,0,1,2,4,2,0,0,0,0,1,1,0,1,1,0,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,1,0,1,2,0,2,0,3,1,1,2,2,0,0,2,1,0,2,0,0,0,0,0,1,0,2,1,0,0,2,0,1,1,0,2,0,1,1,2,1,0,1,1,0,1,2,1,2,2,0,3,1,0,0,1,1,0,1,2,2,0,0,1,3,1,0,1,1,0,0,0,1,1,1,4,0,1,0,1,2,2,0,2,2,1,1,4,3,0,1,1,2,0,1,0,0,0,1,4,1,0,0,0,3,0,0,3,1,3,1,1,1,1,1,1,1,0,1,1,0,1,0,2,0,0,0,2,2,0,0,0,0,0,2,1,1,1,1,3,0,0,2,0,0,0,1,0,1,0,1,1,2,2,0,3,2,0,1,1,1,0,2,1,0,2,2,2,0,1,1,1,0,1,0,1,0,5,1,0,2,1,1,3,1,0,1,5,2,1,2,2,0,0,0,1,0,0,0,2,1,2,0,2,1,0,1,1,3,0,0,1,1,2,1,0,2,1,0,2,1,0,3,2,3,0,0,0,2,1,0,1,0,2,1,0,0,2,0,0,2,0,0,2,2,1,1,0,1,2,0,1,2,1,1,0,3,0,1,1,1,0,0,2,0,0,1,1,1,1,0,0,0,1,3,0,1,0,3,0,0,0,3,0,0,0,2,2,2,1,3,1,0,1,0,2,0,1,0,1,1,1,0,1,0,1,0,2,0,2,0,0,1,0,2,0,1,2,1,1,1,0,1,0,0,1,0,3,3,1,1,1,1,1,1,0,1,2,3,3,1,0,0,1,2,0,3,0,1,0,0,0,0,1,1,0,1,1,1,3,1,1,1,0,0,1,1,1,1,2,1,1,0,1,0,0,1,0,1,2,1,2,0,2,0,1,1,1,2,1,1,0,0,1,0,0,1,1,3,0,1,1,0,3,1,0,1,1,0,0,1,2,1,0,1,1,0,0,4,3,1,1,0,0,2,0,1,1,0,1,2,0,0,2,2,2,2,2,1,2,2,0,0,1,1,1,0,1,1,1,0,1,1,1,1,0,2,1,2,2,1,2,3,0,3,0,1,1,0,0,1,0,1,1,0,0,1,1,3,0,1,3,1,1,1,0,0,1,0,2,2,0,2,0,0,1,1,1,0,1,0,0,0,0,1,1,1,1,0,2,0,0,2,4,1,0,1,1,0,1,0,1,1,0,5,0,3,0,1,2,0,1,1,0,1,2,3,1,0,1,2,1,2,1,0,0,0,0,0,0,0,1,2,0,3,0,1,2,1,1,0,1,0,2,2,1,2,0,1,2,0,0,2,3,1,4,1,0,2,1,1,1,0,1,1,1,2,0,0,2,2,1,4,0,0,0,0,1,0,0,3,0,1,1,1,0,1,1,1,2,0,0,2,2,0,2,1,1,0,1,4,3,2,2,0,1,3,0,0,2,2,0,2,0,1,0,1,1,0,0,0,0,1,0,5,0,2,1,0,2,0,2,1,1,3,0,2,1,2,1,1,0,3,2,2,1,2,2,0,1,0,0,2,1,0,1,0,0,0,0,2,1,0,1,1,0,1,2,1,2,2,2,2,1,0,0,0,2,1,2,0,1,1,0,1,1,3,0,0,1,0,2,0,1,1,1,0,0,2,2,0,2,1,2,0,2,1,0,1,2,2,0,0,1,1,0,0,1,1,1,2,0,1,0,1,0,2,1,2,0,0,1,0,1,3,1,1,1,2,0,0,2,1,1,0,0,3,1,2,0,0,1,1,0,0,2,0,1,1,3,1,1,0,0,0,0,1,2,1,0,1,2,1,2,2,1,1,1,0,1,0,1,2,4,3,2,0,0,1,1,1,0,1,2,0,1,3,0,0,1,0,2,3,2,0,2,1,1,1,1,1,1,4,2,0,0,2,0,0,0,1,0,2,0,1,3,1,0,1,0,0,1,1,2,1,0,3,2,0,1,1,0,3,0,0,2,0,1,0,3,1,1,1,2,1,1,0,1,2,2,0,1,0,0,0,0,1,0,0,1,1,2,2,0,1,0,0,1,1,1,0,1,1,2,1,1,1,3,1,2,1,0,0,2,1,2,0,2,1,0,1,1,0,2,0,1,0,1,3,1,0,1,0,2,3,1,0,1,2,0,0,5,0,1,0,0,1,1,1,1,2,2,3,1,0,0,2,0,0,3,3,0,1,1,2,1,0,0,1,0,0,1,2,2,2,0,1,1,0,0,1,0,0,1,0,1,0,2,0,0,0,0,1,0,0,0,0,1,3,2,1,0,3,3,1,0,2,0,3,2,3,1,1,1,0,0,1,1,1,0,2,0,2,0,0,1,0,1,2,2,1,1,0,0,1,0,2,0,1,1,1,0,0,0,1,2,0,0,2,0,0,1,0,0,0,0,0,0,0,0,2,0,1,0,0,1,1,0,1,0,0,1,0,0,2,1,0,1,1,1,0,1,2,0,1,0,4,0,1,3,1,1,0,3,1,2,1,2,1,1,0,0,0,3,0,0,0,1,0,0,0,1,1,0,2,1,1,0,1,1,0,2,1,2,0,2,1,0,0,2,1,0,1,2,0,2,1,3,1,0,2,1,2,0,0,1,1,1,1,1,2,2,1,0,2,3,0,1,1,2,1,2,0,2,1,1,0,2,1,1,1,0,1,0,1,2,2,1,0,0,0,2,0,1,4,4,3,0,0,1,2,3,1,1,1,1,2,1,1,2,1,1,0,1,0,1,1,3,2,3,4,1,1,1,2,4,2,1,2,0,0,0,0,1,0,0,3,3,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,2,1,0,1,0,1,1,0,0,2,0,1,3,0,0,3,3,1,3,0,1,0,1,1,1,1,1,0,2,0,1,1,2,0,2,1,0,0,0,1,0,2,1,0,1,2,0,0,0,0,1,1,0,0,0,0,1,0,3,0,0,1,0,2,2,1,0,0,1,0,1,4,2,2,0,3,0,3,0,0,2,0,1,1,1,0,1,0,1,2,2,2,0,3,4,0,2,1,0,1,1,0,1,1,0,0,2,0,2,1,0,1,2,1,0,1,0,1,3,0,2,0,0,2,2,0,1,2,2,1,0,0,0,0,1,1,3,0,0,0,0,0,1,1,1,2,1,1,1,0,0,0,1,0,1,1,1,1,2,1,1,0,0,2,1,1,0,0,1,0,3,2,1,2,1,1,0,3,0,0,1,0,2,1,2,1,1,1,0,2,2,1,1,0,0,1,0,3,0,4,1,0,1,0,0,2,3,0,0,1,1,2,1,0,1,0,1,1,3,1,0,1,1,1,1,0,0,1,1,2,1,1,1,1,2,0,2,0,2,0,4,2,0,1,1,2,2,1,1,1,2,4,0,1,2,1,0,0,2,1,1,0,0,1,0,1,0,1,3,2,1,0,0,0,1,1,0,0,1,1,2,2,2,1,1,1,0,0,0,0,1,0,1,1,2,0,2,0,0,1,1,1,0,0,0,2,0,0,1,2,1,1,0,0,2,1,0,2,0,1,3,2,0,0,1,1,3,1,0,0,1,0,4,1,1,3,0,0,0,1,2,1,2,1,2,1,1,0,1,2,1,1,2,0,0,1,1,2,1,4,2,1,1,1,3,0,2,0,1,1,0,1,0,3,2,0,2,2,0,1,1,3,1,0,1,2,2,2,1,0,1,1,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,1,0,1,2,2,1,1,0,1,1,0,2,1,1,1,2,2,1,1,1,1,1,0,1,1,2,0,0,4,0,4,0,2,0,0,3,1,2,1,1,4,3,1,0,1,2,2,1,1,0,1,0,0,0,3,2,0,1,0,1,3,0,1,2,2,1,2,0,1,0,0,4,3,0,3,1,0,0,0,0,0,0,1,4,2,1,1,1,1,0,1,2,0,0,0,2,1,1,0,0,0,2,1,3,0,0,2,0,0,1,0,0,0,1,1,0,0,3,1,1,1,2,0,0,2,1,2,2,1,1,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,2,0,1,4,1,0,2,1,1,2,0,0,1,1,2,1,2,1,0,2,0,1,0,0,0,0,1,1,3,2,4,1,1,2,1,0,1,1,0,3,1,2,1,1,0,1]},{"counters":[2,0,0,2,0,1,0,3,1,2,0,0,3,1,0,1,1,1,0,1,1,0,2,0,1,1,0,1,1,0,0,1,0,0,0,0,1,1,2,0,0,3,1,0,1,3,1,3,1,1,0,1,0,0,1,0,1,2,1,0,0,0,2,2,1,1,1,1,1,0,1,0,1,3,0,2,1,0,0,3,0,1,0,1,0,2,1,3,3,1,1,3,1,2,0,1,2,3,1,1,1,2,2,0,1,0,1,1,2,0,0,3,2,1,1,0,0,0,1,1,0,1,1,1,0,2,1,0,2,0,2,3,1,0,1,5,0,1,1,1,4,0,4,0,1,2,2,0,0,1,0,1,0,1,3,1,0,3,1,1,0,1,1,1,0,0,1,0,1,2,0,1,1,1,0,0,0,1,0,1,2,0,0,1,3,1,1,0,0,2,0,2,2,2,0,0,0,3,3,3,1,3,2,2,0,0,0,0,1,0,0,1,2,1,1,0,0,3,2,1,1,0,0,0,2,1,0,3,0,1,3,2,0,0,1,2,0,0,0,0,1,3,1,0,1,0,4,0,3,0,0,0,1,0,1,0,0,1,1,1,3,0,0,2,1,2,0,1,0,3,1,0,0,1,0,0,0,4,2,0,1,3,2,1,0,1,0,1,0,1,1,3,1,0,0,0,0,3,1,0,0,0,2,2,1,0,1,1,1,2,0,1,0,1,0,2,0,4,0,0,1,0,2,0,1,1,1,3,0,0,2,2,4,0,0,1,2,1,1,1,0,0,2,0,0,0,2,1,2,2,2,2,2,1,1,1,1,2,1,0,0,2,2,0,1,0,0,0,0,0,0,0,0,2,2,1,0,0,2,0,0,0,1,1,1,1,0,1,1,0,1,1,2,2,1,0,2,1,2,0,2,1,1,0,3,0,0,2,1,0,1,2,2,0,0,2,3,0,0,1,1,3,0,0,1,0,0,1,1,4,2,1,0,2,2,1,0,0,0,2,0,2,2,0,1,0,0,1,0,0,2,2,3,4,1,0,2,1,1,0,2,0,1,1,3,0,0,1,0,0,1,2,3,3,1,2,0,0,1,2,1,2,1,2,0,1,2,1,0,1,0,1,0,0,0,1,1,1,1,0,0,2,0,0,1,3,1,2,0,1,0,3,3,0,1,1,1,0,0,0,0,0,1,1,1,1,1,0,2,0,0,1,1,2,0,1,0,1,0,3,1,1,0,2,1,0,2,0,0,2,0,3,2,1,1,4,0,1,3,1,1,0,0,2,1,2,0,4,0,1,0,0,2,0,2,0,0,0,0,1,2,1,2,3,1,1,1,2,1,1,0,1,2,1,1,2,0,2,0,0,3,1,1,0,1,0,1,0,1,1,1,0,1,2,0,1,1,3,0,0,1,0,0,0,0,1,1,0,0,3,0,1,0,0,2,0,2,0,0,1,1,2,0,0,1,0,2,1,1,0,0,0,1,0,0,1,0,1,3,3,4,0,0,0,1,2,2,2,0,3,1,1,1,1,2,2,0,3,0,0,2,2,1,1,1,0,1,4,2,1,0,1,2,1,2,1,0,2,0,2,1,0,1,1,1,0,1,1,0,1,0,1,0,2,1,1,2,3,1,3,1,1,2,1,2,0,0,1,0,1,1,0,0,1,2,0,1,0,1,1,0,0,3,1,2,0,0,2,0,0,2,0,1,0,1,2,0,2,0,0,1,2,3,2,0,1,0,0,0,0,0,1,0,2,0,0,0,1,0,2,2,0,0,1,1,1,1,0,0,1,0,2,2,2,1,1,2,0,3,0,2,0,1,1,0,0,0,0,0,2,1,0,5,2,1,0,1,0,0,0,1,0,1,1,0,0,2,1,1,2,0,4,1,1,2,0,1,0,1,3,1,1,0,1,2,0,0,1,0,1,2,3,0,1,0,0,1,1,0,1,0,0,0,0,1,2,5,0,0,3,1,2,0,0,0,1,1,3,0,1,1,0,0,0,2,0,0,1,0,2,2,0,1,1,0,0,0,1,3,0,2,3,1,1,3,3,0,1,0,0,2,0,0,0,0,0,1,0,1,0,3,1,1,2,5,1,4,0,2,1,2,1,0,1,0,0,0,1,2,0,1,1,0,3,1,2,1,3,2,0,0,0,2,2,1,3,1,0,2,0,1,1,3,2,2,0,1,1,0,2,1,1,1,1,0,0,1,2,0,3,3,0,1,2,2,1,2,3,0,2,2,0,1,3,1,1,3,1,0,1,0,2,0,0,1,2,0,1,0,1,2,1,1,1,2,0,3,0,1,1,5,1,0,2,3,2,0,7,1,0,0,0,0,2,0,0,0,0,2,1,1,1,4,1,1,0,0,0,2,1,1,1,1,0,1,1,0,1,0,3,1,1,1,0,1,0,0,1,1,0,1,2,3,3,2,0,0,0,2,3,3,1,1,1,0,2,2,1,0,1,1,1,0,1,0,0,0,1,3,3,1,1,2,1,0,1,2,1,1,0,1,2,4,1,1,1,0,1,0,0,0,2,0,1,0,1,0,1,1,3,0,2,1,4,1,0,0,0,1,2,0,0,1,0,2,0,1,1,0,1,1,2,1,1,0,0,0,2,3,2,1,0,1,1,1,3,1,2,0,0,2,1,1,1,1,4,3,1,2,3,1,2,0,0,0,2,1,0,2,4,1,2,0,0,1,0,1,0,3,0,1,1,0,2,2,0,1,4,3,0,2,3,0,1,1,2,3,0,1,1,1,0,1,0,3,0,1,2,0,0,0,0,0,0,2,0,2,1,2,1,0,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,3,0,3,3,0,2,0,0,0,2,2,1,1,1,2,2,1,0,2,3,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,1,2,1,0,1,0,1,6,2,1,1,2,1,1,1,1,1,0,1,2,1,1,0,1,1,2,3,0,2,2,1,1,2,0,2,0,3,2,2,2,2,0,1,1,2,1,0,1,0,1,0,0,1,1,2,2,1,1,1,3,0,0,2,1,0,0,2,1,1,0,1,1,0,2,1,1,0,0,3,2,2,2,1,2,1,1,0,0,0,0,0,1,1,0,0,1,0,0,1,0,1,0,3,1,1,0,1,1,3,1,1,0,2,1,2,0,1,2,0,1,0,2,1,0,0,0,2,0,0,1,1,1,1,2,2,0,0,0,1,1,1,1,1,0,0,2,1,0,0,1,0,0,1,0,1,2,1,0,0,0,3,0,3,1,1,1,0,1,0,2,0,0,1,4,1,0,1,1,0,1,0,0,1,0,0,1,1,0,0,1,2,1,0,0,0,0,1,2,0,0,1,0,1,1,1,1,1,1,0,0,0,0,0,1,0,1,4,1,0,2,1,1,1,0,2,0,1,1,0,2,0,2,1,2,2,1,1,3,3,0,2,1,3,4,1,2,2,0,2,1,1,0,1,1,0,0,0,0,2,1,0,0,2,1,0,0,0,0,1,2,0,1,1,0,1,0,0,1,0,0,1,2,2,1,0,1,0,2,0,1,4,1,0,1,0,2,0,0,0,1,1,1,4,0,1,1,1,1,0,3,1,1,1,1,1,1,1,2,4,1,0,0,1,3,1,1,1,0,1,2,0,1,0,1,1,0,0,1,0,1,1,0,1,0,3,4,2,0,2,2,2,0,0,0,2,1,1,1,0,3,0,1,1,0,0,2,3,0,1,1,1,1,1,0,0,0,2,1,2,1,0,1,0,0,0,0,1,0,0,2,0,4,1,0,0,4,2,0,0,2,1,0,1,1,2,1,1,1,1,2,1,1,1,4,0,0,1,0,1,0,0,0,1,0,2,0,0,1,1,0,0,0,1,1,2,0,0,1,1,0,0,0,1,0,0,1,2,2,3,2,1,0,2,0,1,1,0,0,0,0,0,3,0,2,2,1,1,1,0,2,1,2,3,0,1,0,1,1,2,0,0,0,0,0,1,1,0,0,0,1,3,0,1,1,0,0,2,1,1,0,2,2,0,0,0,2,1,0,1,0,1,0,1,0,0,0,1,1,2,0,1,0,0,0,1,2,3,0,1,1,1,1,0,1,1,2,4,0,0,3,1,1,0,1,1,3,1,0,2,1,0,1,1,2,1,1,2,1,0,0,1,1,1,0,1,1,1,1,0,1,2,1,3,0,2,0,1,1,1,2,2,1,2,0,0,3,0,1,0,0,2,0,1,0,2,3,0,1,4,0,1,0,1,0,0,1,2,0,0,1,0,1,1,1,1,1,2,2,0,2,0,1,2,3,2,1,0,0,1,0,0,1,0,0,1,0,2,1,0,1,1,0,0,0,0,2,1,0,0,0,3,0,0,1,2,1,2,0,0,0,1,2,3,3,3,0,2,1,2,0,1,2,0,0,0,2,0,1,0,0,0,2,0,1,0,0,1,1,1,3,1,3,0,2,2,1,0,1,0,0,0,1,0,2,2,1,2,0,1,0,2,1,0,2,0,1,3,4,2,0,0,0,0,1,0,0,1,2,3,1,3,1,2,0,1,0,0,1,0,1,0,2,1,1,2,1,1,1,0,0,1,0,0,2]},{"counters":[1,0,1,0,0,1,0,1,0,0,0,0,2,1,0,2,0,3,2,1,1,0,0,1,2,0,0,0,0,1,1,0,1,3,0,0,0,1,0,0,0,0,0,4,1,0,1,0,2,0,1,0,1,0,0,2,3,1,1,1,0,0,0,0,6,0,1,2,0,0,0,0,2,0,0,1,1,2,2,1,0,0,2,0,1,2,2,5,0,1,3,1,1,2,1,4,1,2,1,0,0,0,1,0,1,0,1,1,0,1,0,1,0,1,2,1,2,1,1,4,0,2,2,1,0,2,1,0,2,0,0,0,0,0,0,2,1,1,1,3,1,1,1,1,0,0,3,2,2,0,0,0,1,0,2,0,1,1,0,2,2,1,3,2,0,2,0,0,0,0,1,1,0,0,2,1,0,0,1,2,0,1,0,1,2,0,0,2,1,1,0,0,2,2,2,0,1,0,2,0,0,2,0,1,3,0,1,2,1,0,0,1,3,0,0,3,0,0,1,1,2,1,1,2,1,0,1,1,0,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,2,1,1,0,0,1,2,0,0,2,1,0,0,0,0,3,1,0,1,1,1,1,3,2,0,1,2,2,2,2,0,0,1,1,0,1,0,0,0,0,1,2,1,1,1,2,0,0,1,3,2,3,1,2,1,2,0,2,3,0,3,2,4,3,4,0,2,1,1,0,1,0,0,0,0,1,0,3,4,1,0,0,2,1,0,0,0,0,0,0,0,1,0,3,0,0,2,0,2,0,1,0,2,0,1,0,0,4,1,1,2,1,1,1,0,0,0,3,1,0,0,0,2,1,0,0,1,0,2,0,3,0,0,0,0,0,1,4,0,0,1,1,2,0,0,0,2,0,0,3,0,1,2,2,2,1,1,3,1,1,1,1,0,2,0,2,4,1,0,0,2,1,0,0,0,0,6,1,0,2,0,1,1,0,0,3,1,0,1,3,0,2,1,1,1,2,0,2,1,0,0,2,2,2,4,0,1,3,0,0,3,2,1,1,0,4,2,2,1,0,0,0,0,0,1,3,1,2,0,2,0,1,0,1,0,1,0,3,1,1,0,0,1,0,0,0,0,1,1,2,0,1,2,1,1,1,0,0,1,1,1,0,0,1,2,1,1,1,1,1,4,1,2,1,0,0,1,2,3,0,2,1,0,1,0,2,1,1,1,1,0,2,2,1,1,2,2,1,1,0,2,0,0,0,1,2,0,2,2,1,2,2,0,0,1,1,1,2,1,0,1,1,1,0,2,0,2,0,4,1,2,0,3,1,0,2,0,0,0,1,1,1,1,0,1,3,1,0,0,2,2,1,0,1,0,1,0,0,0,0,0,2,0,1,0,2,4,0,1,2,0,1,1,1,1,0,0,1,0,1,2,1,0,0,0,0,0,0,0,0,2,2,1,2,0,1,1,0,2,1,0,0,1,0,1,1,1,3,3,2,1,0,0,1,0,1,2,0,0,0,1,0,1,0,4,1,2,1,1,0,1,0,2,1,0,2,0,1,4,0,3,1,0,3,1,0,0,1,0,0,2,0,2,1,1,1,0,1,2,0,2,0,1,0,3,0,0,1,2,0,0,2,1,0,0,1,5,1,1,0,0,0,2,1,1,0,1,0,0,1,1,0,1,2,0,1,1,0,0,3,0,1,1,2,1,2,1,1,1,1,2,2,1,3,1,1,2,0,2,1,1,4,1,0,3,0,0,0,1,3,2,1,2,4,0,2,0,2,1,2,1,0,1,0,1,0,2,1,1,2,2,1,0,0,2,3,1,1,1,0,1,1,2,4,0,2,1,0,0,1,2,1,1,1,0,2,2,0,0,1,2,0,0,2,0,1,3,2,3,0,0,1,1,0,0,1,0,0,1,1,2,1,1,2,1,0,2,1,1,1,1,1,0,0,0,0,1,1,0,1,0,0,1,0,1,2,1,0,1,1,2,0,0,0,1,0,1,1,2,0,1,0,1,1,1,2,1,0,0,0,1,1,1,1,0,0,0,1,0,3,1,0,1,0,2,2,1,4,1,0,2,3,0,1,3,3,2,1,1,2,2,2,2,0,2,1,2,2,0,0,1,0,1,2,0,1,2,1,1,1,1,2,0,2,1,0,1,0,1,1,0,1,0,2,0,0,1,0,1,1,1,0,2,0,0,1,0,0,1,1,2,3,2,3,0,1,0,2,0,0,2,2,0,0,1,0,1,0,2,0,1,2,1,1,1,2,0,2,0,0,1,0,1,0,0,3,0,5,0,3,0,0,1,0,0,0,0,2,0,1,0,3,0,3,1,0,0,0,2,0,1,1,1,2,0,1,1,3,1,2,1,1,1,1,0,0,2,0,1,0,0,0,2,1,1,1,1,2,2,0,1,1,0,0,1,1,2,1,1,1,3,1,1,0,0,1,2,2,0,0,1,5,0,0,2,0,0,2,1,2,2,0,1,1,2,1,1,0,1,1,0,1,0,1,0,1,2,0,3,1,1,0,3,0,2,1,0,0,1,1,1,1,0,1,1,2,0,0,1,0,1,1,3,1,2,1,0,3,3,2,1,2,1,1,1,0,1,1,3,0,2,3,1,2,1,0,1,0,2,2,1,0,0,1,2,3,2,1,0,1,1,2,0,0,0,0,0,0,0,0,3,0,2,0,0,3,2,0,2,0,1,1,1,1,1,3,1,1,2,3,1,0,0,0,1,0,0,0,0,0,3,1,2,1,1,3,0,3,2,0,0,1,1,0,0,1,0,5,0,1,0,1,2,0,2,2,0,0,2,0,1,1,1,0,4,0,0,1,0,1,2,2,1,0,2,1,1,2,1,1,1,1,0,0,2,1,0,1,2,0,0,1,1,0,2,3,0,2,0,1,3,1,0,1,2,1,0,1,1,2,0,1,4,2,2,0,2,0,2,0,1,1,0,0,2,0,0,3,1,2,0,0,0,2,0,2,2,0,1,0,1,2,0,0,1,0,0,1,1,0,2,0,0,2,2,0,0,0,1,1,0,1,0,3,2,1,0,0,1,0,1,1,1,0,0,0,0,1,0,1,1,0,2,0,1,0,0,1,0,0,2,1,0,1,1,3,0,3,0,2,3,1,2,2,3,2,0,1,1,1,1,0,1,1,1,2,3,0,4,3,1,2,2,0,0,1,1,0,2,0,0,1,3,3,0,1,0,1,1,0,1,2,0,1,1,1,3,0,0,0,1,1,0,0,0,0,1,0,0,2,1,1,0,0,1,0,0,1,1,0,2,0,0,1,2,1,1,3,0,2,1,1,0,3,0,0,0,2,1,2,0,0,0,1,0,1,1,1,1,2,0,0,1,1,0,1,1,0,1,2,0,3,1,0,1,1,1,0,0,0,0,1,1,1,0,0,1,0,1,1,0,2,0,2,0,2,1,1,1,0,0,2,0,2,0,2,0,0,1,1,0,0,2,1,1,0,1,0,3,1,0,1,0,1,2,0,2,2,1,0,1,1,1,2,1,1,0,1,0,1,0,0,2,0,0,2,3,0,4,0,1,1,0,0,0,2,0,2,1,0,3,1,1,0,2,1,1,1,1,1,0,1,1,3,1,1,1,0,1,2,1,1,2,1,1,2,0,0,1,0,0,0,1,2,2,0,1,1,4,1,1,2,1,0,0,3,0,1,1,2,0,0,4,1,1,2,2,1,1,3,2,2,0,0,0,1,1,2,1,0,0,0,0,0,0,0,0,2,1,0,1,0,0,1,1,1,1,1,2,1,1,1,1,0,1,2,1,2,1,2,0,0,0,2,0,4,3,1,2,2,0,0,1,1,1,0,1,1,2,1,2,2,0,1,2,1,0,1,2,0,2,1,1,2,2,1,2,1,1,0,1,0,0,1,0,0,0,0,0,1,0,1,2,1,1,0,1,0,0,0,2,0,0,3,1,0,0,0,0,0,2,2,1,2,2,3,2,2,1,1,1,2,1,2,0,3,2,1,3,1,4,3,1,1,0,1,0,0,3,1,1,0,0,0,0,1,1,0,3,4,1,0,3,1,1,0,0,2,2,0,0,1,1,2,3,1,0,1,2,0,0,1,0,1,0,0,2,0,2,0,3,1,0,0,0,1,1,2,0,1,2,0,0,2,0,2,1,2,1,1,1,2,2,2,1,2,1,2,0,0,1,0,1,1,1,4,0,0,0,0,1,0,1,0,0,2,0,0,1,2,1,3,0,0,1,0,2,0,1,1,1,0,0,1,1,1,2,3,0,1,2,0,0,0,2,2,1,0,0,1,1,0,1,0,2,0,0,0,0,0,3,0,2,1,1,0,1,0,4,0,2,1,2,1,0,4,1,0,0,1,1,2,0,0,1,0,0,0,1,0,5,2,3,1,1,0,2,0,2,2,0,0,1,2,2,0,0,0,0,1,0,2,1,2,2,2,0,1,1,1,2,0,2,3,0,0,1,0,3,3,0,1,0,2,1,0,2,1,0,1,0,0,1,0,1,2,0,1,0,1,1,1,1,1,1,0,0,2,1,2,3,1,0,1,1,0,1,2,2,2,1,1,0,0,2,1,0,2,2,1,4,0,0,2,0,2,0,0,3,3,0,1]},{"counters":[3,1,1,0,3,1,2,0,2,2,7,1,0,1,3,3,1,2,1,1,4,2,1,1,1,1,3,1,1,1,0,0,1,0,1,1,2,0,1,0,1,0,2,2,2,3,1,2,1,0,0,1,0,3,3,0,2,1,0,1,1,2,2,0,1,1,3,2,0,2,0,2,1,1,1,2,0,0,0,1,2,1,0,0,0,0,2,1,0,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,3,3,2,1,0,0,1,0,0,0,0,3,1,3,0,0,1,0,0,2,5,0,0,2,0,0,0,1,1,2,3,2,0,0,3,0,3,1,1,0,3,1,0,0,2,0,0,3,1,0,3,2,0,0,2,0,2,0,0,0,1,1,1,2,2,0,1,1,0,0,0,3,1,0,1,0,1,1,0,0,1,1,2,0,1,1,0,2,2,3,2,2,0,1,2,2,0,1,3,1,0,1,1,0,0,3,1,2,2,2,2,0,0,1,0,0,0,1,2,2,0,0,3,1,1,2,2,1,1,1,0,3,1,0,0,2,1,0,0,1,0,0,1,0,2,2,1,1,2,2,2,0,0,1,2,1,2,0,2,1,0,1,0,3,0,1,0,0,1,3,1,0,1,0,2,1,0,1,1,1,3,1,0,3,1,2,0,0,1,2,2,4,0,1,2,0,0,4,0,1,0,2,0,0,2,0,0,1,1,2,1,0,1,1,2,0,0,1,2,0,0,2,1,0,3,0,0,0,0,0,0,1,1,0,1,2,0,3,0,1,1,0,1,1,1,2,0,0,1,0,0,0,3,1,0,3,0,1,3,0,0,0,4,2,0,0,0,0,0,0,1,1,1,0,0,3,3,0,2,1,0,1,1,1,3,1,2,0,0,1,0,1,4,0,2,1,1,1,0,2,0,0,0,0,1,1,2,0,1,0,2,1,1,3,2,0,1,0,3,1,0,1,1,1,2,1,1,1,0,0,1,0,0,4,0,2,0,0,1,3,0,4,0,1,0,1,1,1,1,2,0,2,1,1,0,3,1,0,2,1,1,1,0,0,1,2,1,1,0,1,1,3,2,1,1,2,0,1,1,3,2,2,1,0,1,0,2,1,0,3,1,0,2,1,1,1,0,1,1,2,0,0,1,0,3,2,1,0,1,1,1,0,1,0,2,1,0,0,1,0,2,0,1,3,0,0,1,2,0,0,0,0,2,1,0,3,1,0,2,0,0,1,2,2,1,0,0,1,0,1,1,1,0,1,2,0,0,1,5,1,1,0,0,0,2,1,1,0,3,1,0,5,0,1,0,0,1,2,2,1,0,2,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,1,2,2,2,2,2,1,2,0,2,1,2,2,0,3,0,1,1,0,1,3,1,0,2,0,0,1,0,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,3,2,0,1,1,3,0,2,0,0,2,0,1,0,1,0,2,2,0,1,1,0,1,0,1,0,2,0,0,0,1,1,0,0,1,1,1,1,1,2,0,0,0,1,1,0,1,1,2,3,0,2,0,1,0,1,0,1,1,0,0,2,1,0,1,2,1,2,1,2,2,0,1,0,3,0,2,0,1,0,0,3,0,0,2,2,0,0,1,1,1,1,1,1,1,2,1,0,0,0,0,0,0,2,0,1,1,2,0,0,0,0,1,0,0,4,0,1,1,1,3,3,1,1,0,1,1,1,1,0,1,2,1,0,0,1,0,1,1,0,1,0,1,1,2,0,2,1,1,1,0,1,0,1,1,2,0,1,4,2,6,0,1,0,2,3,2,0,0,1,0,2,1,0,1,1,0,3,2,3,3,2,0,2,3,0,0,1,0,1,1,2,0,1,1,1,0,1,0,0,1,1,3,1,1,1,4,1,1,0,1,2,0,1,0,1,0,1,2,0,1,0,2,0,0,0,2,1,1,1,0,1,2,1,2,1,2,0,0,0,1,2,1,2,4,0,1,0,0,2,1,1,0,2,0,3,0,0,1,1,1,2,0,0,3,1,1,0,0,1,1,0,0,1,0,1,4,1,0,0,1,2,0,2,1,0,0,0,0,1,1,1,4,1,2,0,1,1,0,1,0,1,2,0,0,0,0,0,3,1,0,1,0,2,1,3,0,1,2,1,1,2,1,1,1,1,1,1,2,0,1,0,0,0,3,0,0,1,1,0,0,1,1,1,0,0,0,3,1,0,0,0,2,0,0,0,1,1,2,2,3,1,1,2,0,5,0,1,0,1,1,2,0,0,1,2,2,2,1,2,1,2,2,2,0,0,3,3,2,1,1,1,2,1,0,3,0,2,0,2,1,2,0,1,0,5,0,1,0,2,0,0,0,1,3,1,0,2,3,0,0,0,1,3,1,1,1,0,0,0,0,1,2,3,1,1,1,3,0,0,2,1,0,0,2,2,0,2,1,1,2,2,2,3,1,0,1,1,1,1,0,1,2,0,0,0,2,1,0,1,0,0,0,1,0,0,0,2,0,2,2,2,1,2,0,0,0,1,1,1,0,1,3,1,2,1,0,1,0,0,0,0,2,0,1,1,2,1,1,1,1,1,0,2,1,0,0,1,1,0,1,1,1,0,0,1,0,1,0,0,1,1,0,0,1,1,1,1,3,1,1,0,1,2,0,1,2,0,2,0,2,0,1,0,0,0,1,0,1,2,0,2,0,0,2,0,1,2,1,3,2,1,0,0,1,1,2,2,0,0,2,3,1,1,1,1,1,1,3,0,0,4,3,0,2,1,1,1,1,2,0,3,0,0,1,0,0,0,0,1,0,1,4,1,1,2,1,2,1,0,1,1,0,0,1,0,1,1,0,0,1,1,2,0,0,0,0,0,0,0,0,5,2,1,0,1,2,0,3,1,1,2,0,2,2,1,1,0,1,1,1,0,0,0,0,0,2,2,0,1,0,2,2,1,0,0,1,2,0,2,1,2,3,1,1,1,2,0,0,1,1,0,2,0,1,1,1,0,2,1,1,1,3,0,0,1,2,0,3,1,0,3,0,3,4,1,2,1,1,1,0,1,1,0,1,1,0,0,1,2,2,0,1,1,1,1,1,1,0,1,0,1,0,2,0,0,1,1,0,1,1,1,2,0,0,1,1,2,0,1,1,1,0,1,0,0,1,2,0,1,1,2,2,1,1,0,0,1,0,3,0,1,1,4,1,1,0,1,1,1,1,2,1,0,0,2,2,1,0,1,1,1,1,1,1,0,1,2,1,2,0,1,4,0,1,2,0,1,1,2,1,0,2,1,0,1,0,0,1,1,0,0,2,1,3,1,1,1,0,1,1,0,1,0,2,0,0,4,0,1,0,3,0,1,0,0,1,0,0,1,1,0,1,1,2,2,3,2,1,0,0,0,1,1,0,0,1,0,1,0,0,0,1,3,2,4,2,1,0,1,1,1,1,2,0,1,1,2,0,1,1,0,3,1,0,0,1,0,1,0,1,1,3,3,2,0,1,0,2,0,1,2,2,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,0,0,0,1,2,0,1,0,0,0,1,0,0,0,0,1,0,0,1,1,1,1,0,1,3,1,0,1,1,0,2,1,3,0,2,2,0,0,1,0,0,1,3,0,2,0,1,1,0,0,2,0,1,1,2,3,0,2,3,1,2,1,0,0,1,1,2,1,3,1,0,1,0,1,2,1,0,2,1,1,1,2,0,2,0,2,1,2,1,0,0,3,1,1,2,0,0,2,1,1,1,0,1,1,0,0,1,0,0,1,2,1,1,1,2,2,0,3,0,1,3,4,2,2,0,3,0,1,1,2,1,1,0,2,1,2,1,0,1,1,0,0,3,0,1,1,2,1,0,2,0,0,0,0,3,1,2,0,1,0,2,0,1,1,0,1,2,2,2,1,3,1,0,0,1,1,0,1,0,1,0,0,1,0,0,2,3,1,4,2,1,0,1,2,3,1,1,0,0,2,1,0,1,1,0,1,0,2,0,1,3,0,1,4,0,0,1,2,0,0,1,0,0,2,1,2,1,1,3,0,0,2,1,1,2,1,0,0,1,0,0,2,0,0,2,1,2,1,2,3,0,1,1,1,1,0,0,2,1,0,1,1,3,2,0,1,0,0,0,0,1,1,0,1,0,2,1,4,0,0,4,1,0,1,1,0,1,2,0,1,3,2,1,3,0,0,2,0,0,2,5,2,1,0,1,1,0,0,1,3,0,0,2,0,1,0,0,1,0,0,2,1,2,1,0,1,1,1,1,1,0,1,0,0,2,0,2,0,2,0,1,0,1,1,0,2,0,0,0,1,0,2,0,0,0,1,0,0,0,2,1,0,0,1,1,3,1,2,1,1,0,0,1,1,1,0,1,1,2,0,0,0,0,2,0,0,2,0,0,0,2,2,4,2,1,1,2,0,0,0,0,1,0,1,1,0,0,1,1,1,0,0,2,1,1,1,1,0,0,0,2,1,0,0,0,3,0,0,0,1,1,1,0,1,3,2,3,0,3,2,5,0,0,0,1,0,3,1,2,1,2,1,1,1,3,0,1,2,2,1,1]}]},"null_count":0,"last_update_version":397952036575379456},"pt":{"histogram":{"ndv":2,"buckets":[{"count":981,"lower_bound":"YW5kcm9pZA==","upper_bound":"YW5kcm9pZA==","repeats":492},{"count":1994,"lower_bound":"aW9z","upper_bound":"aW9z","repeats":508}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952036319002624}},"indices":{"aid":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+AEwAAAAAAAAAPg=","upper_bound":"ATE1AAAAAAAA+QExNAAAAAAAAPk=","repeats":1},{"count":16,"lower_bound":"ATE2AAAAAAAA+QExNgAAAAAAAPk=","upper_bound":"ATFEAAAAAAAA+QExRAAAAAAAAPk=","repeats":1},{"count":24,"lower_bound":"ATFFAAAAAAAA+QExRQAAAAAAAPk=","upper_bound":"ATFMAAAAAAAA+QExTAAAAAAAAPk=","repeats":1},{"count":32,"lower_bound":"ATFNAAAAAAAA+QExTQAAAAAAAPk=","upper_bound":"ATFUAAAAAAAA+QExVAAAAAAAAPk=","repeats":1},{"count":40,"lower_bound":"ATFVAAAAAAAA+QExVQAAAAAAAPk=","upper_bound":"ATFiAAAAAAAA+QExYgAAAAAAAPk=","repeats":1},{"count":48,"lower_bound":"ATFjAAAAAAAA+QExYwAAAAAAAPk=","upper_bound":"ATFqAAAAAAAA+QExaQAAAAAAAPk=","repeats":1},{"count":56,"lower_bound":"ATFrAAAAAAAA+QExawAAAAAAAPk=","upper_bound":"ATFyAAAAAAAA+QExcgAAAAAAAPk=","repeats":1},{"count":64,"lower_bound":"ATFzAAAAAAAA+QExcwAAAAAAAPk=","upper_bound":"ATF6AAAAAAAA+QExegAAAAAAAPk=","repeats":1},{"count":72,"lower_bound":"ATIAAAAAAAAA+AEyAAAAAAAAAPg=","upper_bound":"ATI2AAAAAAAA+QEyOQAAAAAAAPk=","repeats":1},{"count":80,"lower_bound":"ATI3AAAAAAAA+QEyNgAAAAAAAPk=","upper_bound":"ATJFAAAAAAAA+QEyRQAAAAAAAPk=","repeats":1},{"count":88,"lower_bound":"ATJGAAAAAAAA+QEyRgAAAAAAAPk=","upper_bound":"ATJNAAAAAAAA+QEyTQAAAAAAAPk=","repeats":1},{"count":96,"lower_bound":"ATJOAAAAAAAA+QEyTgAAAAAAAPk=","upper_bound":"ATJVAAAAAAAA+QEyVQAAAAAAAPk=","repeats":1},{"count":104,"lower_bound":"ATJWAAAAAAAA+QEyVgAAAAAAAPk=","upper_bound":"ATJjAAAAAAAA+QEyYwAAAAAAAPk=","repeats":1},{"count":112,"lower_bound":"ATJkAAAAAAAA+QEyZAAAAAAAAPk=","upper_bound":"ATJrAAAAAAAA+QEyawAAAAAAAPk=","repeats":1},{"count":120,"lower_bound":"ATJsAAAAAAAA+QEybAAAAAAAAPk=","upper_bound":"ATJzAAAAAAAA+QEzMwAAAAAAAPk=","repeats":1},{"count":128,"lower_bound":"ATJ0AAAAAAAA+QEycwAAAAAAAPk=","upper_bound":"ATMAAAAAAAAA+AE0AAAAAAAAAPg=","repeats":1},{"count":136,"lower_bound":"ATMwAAAAAAAA+QEyegAAAAAAAPk=","upper_bound":"ATM3AAAAAAAA+QEzNwAAAAAAAPk=","repeats":1},{"count":144,"lower_bound":"ATM4AAAAAAAA+QEzOAAAAAAAAPk=","upper_bound":"ATNGAAAAAAAA+QEzRwAAAAAAAPk=","repeats":1},{"count":152,"lower_bound":"ATNHAAAAAAAA+QEzRgAAAAAAAPk=","upper_bound":"ATNOAAAAAAAA+QEzTQAAAAAAAPk=","repeats":1},{"count":160,"lower_bound":"ATNPAAAAAAAA+QEzTwAAAAAAAPk=","upper_bound":"ATNWAAAAAAAA+QEzVgAAAAAAAPk=","repeats":1},{"count":168,"lower_bound":"ATNXAAAAAAAA+QEzWAAAAAAAAPk=","upper_bound":"ATNkAAAAAAAA+QEzZAAAAAAAAPk=","repeats":1},{"count":176,"lower_bound":"ATNlAAAAAAAA+QEzZQAAAAAAAPk=","upper_bound":"ATNsAAAAAAAA+QEzbQAAAAAAAPk=","repeats":1},{"count":184,"lower_bound":"ATNtAAAAAAAA+QEzbAAAAAAAAPk=","upper_bound":"ATN0AAAAAAAA+QEzdAAAAAAAAPk=","repeats":1},{"count":192,"lower_bound":"ATN1AAAAAAAA+QEzdQAAAAAAAPk=","upper_bound":"ATQwAAAAAAAA+QE0MgAAAAAAAPk=","repeats":1},{"count":200,"lower_bound":"ATQxAAAAAAAA+QE0MAAAAAAAAPk=","upper_bound":"ATQ4AAAAAAAA+QE0OAAAAAAAAPk=","repeats":1},{"count":208,"lower_bound":"ATQ5AAAAAAAA+QE0OQAAAAAAAPk=","upper_bound":"ATRHAAAAAAAA+QE0RwAAAAAAAPk=","repeats":1},{"count":216,"lower_bound":"ATRIAAAAAAAA+QE0SAAAAAAAAPk=","upper_bound":"ATRPAAAAAAAA+QE0TwAAAAAAAPk=","repeats":1},{"count":224,"lower_bound":"ATRQAAAAAAAA+QE0UAAAAAAAAPk=","upper_bound":"ATRXAAAAAAAA+QE0VwAAAAAAAPk=","repeats":1},{"count":232,"lower_bound":"ATRYAAAAAAAA+QE0WAAAAAAAAPk=","upper_bound":"ATRlAAAAAAAA+QE0ZQAAAAAAAPk=","repeats":1},{"count":240,"lower_bound":"ATRmAAAAAAAA+QE0ZgAAAAAAAPk=","upper_bound":"ATRtAAAAAAAA+QE0bQAAAAAAAPk=","repeats":1},{"count":248,"lower_bound":"ATRuAAAAAAAA+QE0bgAAAAAAAPk=","upper_bound":"ATR1AAAAAAAA+QE0dQAAAAAAAPk=","repeats":1},{"count":256,"lower_bound":"ATR2AAAAAAAA+QE0dgAAAAAAAPk=","upper_bound":"ATUxAAAAAAAA+QE1MQAAAAAAAPk=","repeats":1},{"count":264,"lower_bound":"ATUyAAAAAAAA+QE1MgAAAAAAAPk=","upper_bound":"ATU5AAAAAAAA+QE1OQAAAAAAAPk=","repeats":1},{"count":272,"lower_bound":"ATVBAAAAAAAA+QE1QQAAAAAAAPk=","upper_bound":"ATVIAAAAAAAA+QE1SAAAAAAAAPk=","repeats":1},{"count":280,"lower_bound":"ATVJAAAAAAAA+QE1SQAAAAAAAPk=","upper_bound":"ATVQAAAAAAAA+QE1TwAAAAAAAPk=","repeats":1},{"count":288,"lower_bound":"ATVRAAAAAAAA+QE1UQAAAAAAAPk=","upper_bound":"ATVYAAAAAAAA+QE1WAAAAAAAAPk=","repeats":1},{"count":296,"lower_bound":"ATVZAAAAAAAA+QE1WQAAAAAAAPk=","upper_bound":"ATVmAAAAAAAA+QE1ZgAAAAAAAPk=","repeats":1},{"count":304,"lower_bound":"ATVnAAAAAAAA+QE1ZwAAAAAAAPk=","upper_bound":"ATVuAAAAAAAA+QE1bgAAAAAAAPk=","repeats":1},{"count":312,"lower_bound":"ATVvAAAAAAAA+QE1bwAAAAAAAPk=","upper_bound":"ATV2AAAAAAAA+QE1dgAAAAAAAPk=","repeats":1},{"count":320,"lower_bound":"ATV3AAAAAAAA+QE1dwAAAAAAAPk=","upper_bound":"ATYyAAAAAAAA+QE2MgAAAAAAAPk=","repeats":1},{"count":328,"lower_bound":"ATYzAAAAAAAA+QE2MwAAAAAAAPk=","upper_bound":"ATZBAAAAAAAA+QE2QQAAAAAAAPk=","repeats":1},{"count":336,"lower_bound":"ATZCAAAAAAAA+QE2QgAAAAAAAPk=","upper_bound":"ATZJAAAAAAAA+QE2SQAAAAAAAPk=","repeats":1},{"count":344,"lower_bound":"ATZKAAAAAAAA+QE2SgAAAAAAAPk=","upper_bound":"ATZRAAAAAAAA+QE2UQAAAAAAAPk=","repeats":1},{"count":352,"lower_bound":"ATZSAAAAAAAA+QE2UgAAAAAAAPk=","upper_bound":"ATZZAAAAAAAA+QE2WQAAAAAAAPk=","repeats":1},{"count":360,"lower_bound":"ATZaAAAAAAAA+QE2WgAAAAAAAPk=","upper_bound":"ATZnAAAAAAAA+QE2ZwAAAAAAAPk=","repeats":1},{"count":368,"lower_bound":"ATZoAAAAAAAA+QE2aAAAAAAAAPk=","upper_bound":"ATZvAAAAAAAA+QE2bwAAAAAAAPk=","repeats":1},{"count":376,"lower_bound":"ATZwAAAAAAAA+QE2cAAAAAAAAPk=","upper_bound":"ATZ3AAAAAAAA+QE2dwAAAAAAAPk=","repeats":1},{"count":384,"lower_bound":"ATZ4AAAAAAAA+QE2eAAAAAAAAPk=","upper_bound":"ATczAAAAAAAA+QE3MgAAAAAAAPk=","repeats":1},{"count":392,"lower_bound":"ATc0AAAAAAAA+QE3NAAAAAAAAPk=","upper_bound":"ATdCAAAAAAAA+QE3QgAAAAAAAPk=","repeats":1},{"count":400,"lower_bound":"ATdDAAAAAAAA+QE3QwAAAAAAAPk=","upper_bound":"ATdKAAAAAAAA+QE3SgAAAAAAAPk=","repeats":1},{"count":408,"lower_bound":"ATdLAAAAAAAA+QE3SwAAAAAAAPk=","upper_bound":"ATdSAAAAAAAA+QE3UgAAAAAAAPk=","repeats":1},{"count":416,"lower_bound":"ATdTAAAAAAAA+QE3UwAAAAAAAPk=","upper_bound":"ATdaAAAAAAAA+QE3WgAAAAAAAPk=","repeats":1},{"count":424,"lower_bound":"ATdhAAAAAAAA+QE3YQAAAAAAAPk=","upper_bound":"ATdoAAAAAAAA+QE3aAAAAAAAAPk=","repeats":1},{"count":432,"lower_bound":"ATdpAAAAAAAA+QE3awAAAAAAAPk=","upper_bound":"ATdwAAAAAAAA+QE3bwAAAAAAAPk=","repeats":1},{"count":440,"lower_bound":"ATdxAAAAAAAA+QE3cAAAAAAAAPk=","upper_bound":"ATd4AAAAAAAA+QE3eAAAAAAAAPk=","repeats":1},{"count":448,"lower_bound":"ATd5AAAAAAAA+QE3eQAAAAAAAPk=","upper_bound":"ATg0AAAAAAAA+QE4NAAAAAAAAPk=","repeats":1},{"count":456,"lower_bound":"ATg1AAAAAAAA+QE4NQAAAAAAAPk=","upper_bound":"AThDAAAAAAAA+QE4QwAAAAAAAPk=","repeats":1},{"count":464,"lower_bound":"AThEAAAAAAAA+QE4RAAAAAAAAPk=","upper_bound":"AThLAAAAAAAA+QE4SwAAAAAAAPk=","repeats":1},{"count":472,"lower_bound":"AThMAAAAAAAA+QE4TAAAAAAAAPk=","upper_bound":"AThTAAAAAAAA+QE4UgAAAAAAAPk=","repeats":1},{"count":480,"lower_bound":"AThUAAAAAAAA+QE4UwAAAAAAAPk=","upper_bound":"AThhAAAAAAAA+QE4WgAAAAAAAPk=","repeats":1},{"count":488,"lower_bound":"AThiAAAAAAAA+QE4YgAAAAAAAPk=","upper_bound":"AThpAAAAAAAA+QE4aAAAAAAAAPk=","repeats":1},{"count":496,"lower_bound":"AThqAAAAAAAA+QE4aQAAAAAAAPk=","upper_bound":"AThxAAAAAAAA+QE4cAAAAAAAAPk=","repeats":1},{"count":504,"lower_bound":"AThyAAAAAAAA+QE4cQAAAAAAAPk=","upper_bound":"ATh5AAAAAAAA+QE4eAAAAAAAAPk=","repeats":1},{"count":512,"lower_bound":"ATh6AAAAAAAA+QE4eQAAAAAAAPk=","upper_bound":"ATk1AAAAAAAA+QE5NAAAAAAAAPk=","repeats":1},{"count":520,"lower_bound":"ATk2AAAAAAAA+QE5NQAAAAAAAPk=","upper_bound":"ATlEAAAAAAAA+QE5RAAAAAAAAPk=","repeats":1},{"count":528,"lower_bound":"ATlFAAAAAAAA+QE5RQAAAAAAAPk=","upper_bound":"ATlMAAAAAAAA+QE5SwAAAAAAAPk=","repeats":1},{"count":536,"lower_bound":"ATlNAAAAAAAA+QE5TAAAAAAAAPk=","upper_bound":"ATlUAAAAAAAA+QE5VAAAAAAAAPk=","repeats":1},{"count":544,"lower_bound":"ATlVAAAAAAAA+QE5VQAAAAAAAPk=","upper_bound":"ATliAAAAAAAA+QE5YgAAAAAAAPk=","repeats":1},{"count":552,"lower_bound":"ATljAAAAAAAA+QE5YwAAAAAAAPk=","upper_bound":"ATlqAAAAAAAA+QE5agAAAAAAAPk=","repeats":1},{"count":560,"lower_bound":"ATlrAAAAAAAA+QE5awAAAAAAAPk=","upper_bound":"ATlyAAAAAAAA+QE5cQAAAAAAAPk=","repeats":1},{"count":568,"lower_bound":"ATlzAAAAAAAA+QE5cwAAAAAAAPk=","upper_bound":"ATl6AAAAAAAA+QE5eQAAAAAAAPk=","repeats":1},{"count":576,"lower_bound":"AUEAAAAAAAAA+AFBAAAAAAAAAPg=","upper_bound":"AUE2AAAAAAAA+QFBNgAAAAAAAPk=","repeats":1},{"count":584,"lower_bound":"AUE3AAAAAAAA+QFBNwAAAAAAAPk=","upper_bound":"AUFFAAAAAAAA+QFBRQAAAAAAAPk=","repeats":1},{"count":592,"lower_bound":"AUFGAAAAAAAA+QFBRgAAAAAAAPk=","upper_bound":"AUFNAAAAAAAA+QFBTQAAAAAAAPk=","repeats":1},{"count":600,"lower_bound":"AUFOAAAAAAAA+QFBTgAAAAAAAPk=","upper_bound":"AUFVAAAAAAAA+QFBVQAAAAAAAPk=","repeats":1},{"count":608,"lower_bound":"AUFWAAAAAAAA+QFBVgAAAAAAAPk=","upper_bound":"AUFjAAAAAAAA+QFBYwAAAAAAAPk=","repeats":1},{"count":616,"lower_bound":"AUFkAAAAAAAA+QFBZAAAAAAAAPk=","upper_bound":"AUFrAAAAAAAA+QFBawAAAAAAAPk=","repeats":1},{"count":624,"lower_bound":"AUFsAAAAAAAA+QFBbAAAAAAAAPk=","upper_bound":"AUFzAAAAAAAA+QFBdAAAAAAAAPk=","repeats":1},{"count":632,"lower_bound":"AUF0AAAAAAAA+QFBcwAAAAAAAPk=","upper_bound":"AUIAAAAAAAAA+AFCAAAAAAAAAPg=","repeats":1},{"count":640,"lower_bound":"AUIwAAAAAAAA+QFCMAAAAAAAAPk=","upper_bound":"AUI3AAAAAAAA+QFCNwAAAAAAAPk=","repeats":1},{"count":648,"lower_bound":"AUI4AAAAAAAA+QFCOAAAAAAAAPk=","upper_bound":"AUJGAAAAAAAA+QFCRgAAAAAAAPk=","repeats":1},{"count":656,"lower_bound":"AUJHAAAAAAAA+QFCSAAAAAAAAPk=","upper_bound":"AUJOAAAAAAAA+QFCTgAAAAAAAPk=","repeats":1},{"count":664,"lower_bound":"AUJPAAAAAAAA+QFCTwAAAAAAAPk=","upper_bound":"AUJWAAAAAAAA+QFCVwAAAAAAAPk=","repeats":1},{"count":672,"lower_bound":"AUJXAAAAAAAA+QFCVgAAAAAAAPk=","upper_bound":"AUJkAAAAAAAA+QFCZQAAAAAAAPk=","repeats":1},{"count":680,"lower_bound":"AUJlAAAAAAAA+QFCZAAAAAAAAPk=","upper_bound":"AUJsAAAAAAAA+QFCbAAAAAAAAPk=","repeats":1},{"count":688,"lower_bound":"AUJtAAAAAAAA+QFCbQAAAAAAAPk=","upper_bound":"AUJ0AAAAAAAA+QFCdAAAAAAAAPk=","repeats":1},{"count":696,"lower_bound":"AUJ1AAAAAAAA+QFCdQAAAAAAAPk=","upper_bound":"AUMwAAAAAAAA+QFDMAAAAAAAAPk=","repeats":1},{"count":704,"lower_bound":"AUMxAAAAAAAA+QFDMQAAAAAAAPk=","upper_bound":"AUM4AAAAAAAA+QFDOAAAAAAAAPk=","repeats":1},{"count":712,"lower_bound":"AUM5AAAAAAAA+QFDOQAAAAAAAPk=","upper_bound":"AUNHAAAAAAAA+QFDRwAAAAAAAPk=","repeats":1},{"count":720,"lower_bound":"AUNIAAAAAAAA+QFDSgAAAAAAAPk=","upper_bound":"AUNPAAAAAAAA+QFDUgAAAAAAAPk=","repeats":1},{"count":728,"lower_bound":"AUNQAAAAAAAA+QFDTwAAAAAAAPk=","upper_bound":"AUNXAAAAAAAA+QFDVwAAAAAAAPk=","repeats":1},{"count":736,"lower_bound":"AUNYAAAAAAAA+QFDWAAAAAAAAPk=","upper_bound":"AUNlAAAAAAAA+QFDZQAAAAAAAPk=","repeats":1},{"count":744,"lower_bound":"AUNmAAAAAAAA+QFDZgAAAAAAAPk=","upper_bound":"AUNtAAAAAAAA+QFDbQAAAAAAAPk=","repeats":1},{"count":752,"lower_bound":"AUNuAAAAAAAA+QFDbgAAAAAAAPk=","upper_bound":"AUN1AAAAAAAA+QFDdQAAAAAAAPk=","repeats":1},{"count":760,"lower_bound":"AUN2AAAAAAAA+QFDdgAAAAAAAPk=","upper_bound":"AUQxAAAAAAAA+QFEMQAAAAAAAPk=","repeats":1},{"count":768,"lower_bound":"AUQyAAAAAAAA+QFEMgAAAAAAAPk=","upper_bound":"AUQ5AAAAAAAA+QFEOQAAAAAAAPk=","repeats":1},{"count":776,"lower_bound":"AURBAAAAAAAA+QFEQQAAAAAAAPk=","upper_bound":"AURIAAAAAAAA+QFESAAAAAAAAPk=","repeats":1},{"count":784,"lower_bound":"AURJAAAAAAAA+QFESQAAAAAAAPk=","upper_bound":"AURQAAAAAAAA+QFEUAAAAAAAAPk=","repeats":1},{"count":792,"lower_bound":"AURRAAAAAAAA+QFEUgAAAAAAAPk=","upper_bound":"AURYAAAAAAAA+QFEWAAAAAAAAPk=","repeats":1},{"count":800,"lower_bound":"AURZAAAAAAAA+QFEWQAAAAAAAPk=","upper_bound":"AURmAAAAAAAA+QFEZgAAAAAAAPk=","repeats":1},{"count":808,"lower_bound":"AURnAAAAAAAA+QFEZwAAAAAAAPk=","upper_bound":"AURuAAAAAAAA+QFEbgAAAAAAAPk=","repeats":1},{"count":816,"lower_bound":"AURvAAAAAAAA+QFEbwAAAAAAAPk=","upper_bound":"AUR2AAAAAAAA+QFEdgAAAAAAAPk=","repeats":1},{"count":824,"lower_bound":"AUR3AAAAAAAA+QFEdwAAAAAAAPk=","upper_bound":"AUUyAAAAAAAA+QFFMgAAAAAAAPk=","repeats":1},{"count":832,"lower_bound":"AUUzAAAAAAAA+QFFMwAAAAAAAPk=","upper_bound":"AUVBAAAAAAAA+QFFQQAAAAAAAPk=","repeats":1},{"count":840,"lower_bound":"AUVCAAAAAAAA+QFHdQAAAAAAAPk=","upper_bound":"AUVJAAAAAAAA+QFFSAAAAAAAAPk=","repeats":1},{"count":848,"lower_bound":"AUVKAAAAAAAA+QFFSQAAAAAAAPk=","upper_bound":"AUVRAAAAAAAA+QFFUAAAAAAAAPk=","repeats":1},{"count":856,"lower_bound":"AUVSAAAAAAAA+QFFUQAAAAAAAPk=","upper_bound":"AUVZAAAAAAAA+QFFWAAAAAAAAPk=","repeats":1},{"count":864,"lower_bound":"AUVaAAAAAAAA+QFFWQAAAAAAAPk=","upper_bound":"AUVnAAAAAAAA+QFFZgAAAAAAAPk=","repeats":1},{"count":872,"lower_bound":"AUVoAAAAAAAA+QFFZwAAAAAAAPk=","upper_bound":"AUVvAAAAAAAA+QFFbgAAAAAAAPk=","repeats":1},{"count":880,"lower_bound":"AUVwAAAAAAAA+QFFbwAAAAAAAPk=","upper_bound":"AUV3AAAAAAAA+QFFdgAAAAAAAPk=","repeats":1},{"count":888,"lower_bound":"AUV4AAAAAAAA+QFFdwAAAAAAAPk=","upper_bound":"AUYzAAAAAAAA+QFGMgAAAAAAAPk=","repeats":1},{"count":896,"lower_bound":"AUY0AAAAAAAA+QFGMwAAAAAAAPk=","upper_bound":"AUZCAAAAAAAA+QFGQQAAAAAAAPk=","repeats":1},{"count":904,"lower_bound":"AUZDAAAAAAAA+QFGQgAAAAAAAPk=","upper_bound":"AUZKAAAAAAAA+QFGSQAAAAAAAPk=","repeats":1},{"count":912,"lower_bound":"AUZLAAAAAAAA+QFGSgAAAAAAAPk=","upper_bound":"AUZSAAAAAAAA+QFGUQAAAAAAAPk=","repeats":1},{"count":920,"lower_bound":"AUZTAAAAAAAA+QFGUgAAAAAAAPk=","upper_bound":"AUZaAAAAAAAA+QFGWQAAAAAAAPk=","repeats":1},{"count":928,"lower_bound":"AUZhAAAAAAAA+QFGWgAAAAAAAPk=","upper_bound":"AUZoAAAAAAAA+QFGZwAAAAAAAPk=","repeats":1},{"count":936,"lower_bound":"AUZpAAAAAAAA+QFGaAAAAAAAAPk=","upper_bound":"AUZwAAAAAAAA+QFGbwAAAAAAAPk=","repeats":1},{"count":944,"lower_bound":"AUZxAAAAAAAA+QFGcAAAAAAAAPk=","upper_bound":"AUZ4AAAAAAAA+QFGdwAAAAAAAPk=","repeats":1},{"count":952,"lower_bound":"AUZ5AAAAAAAA+QFGeAAAAAAAAPk=","upper_bound":"AUc0AAAAAAAA+QFHMwAAAAAAAPk=","repeats":1},{"count":960,"lower_bound":"AUc1AAAAAAAA+QFHNAAAAAAAAPk=","upper_bound":"AUdDAAAAAAAA+QFHQgAAAAAAAPk=","repeats":1},{"count":968,"lower_bound":"AUdEAAAAAAAA+QFHQwAAAAAAAPk=","upper_bound":"AUdLAAAAAAAA+QFHSgAAAAAAAPk=","repeats":1},{"count":976,"lower_bound":"AUdMAAAAAAAA+QFHSwAAAAAAAPk=","upper_bound":"AUdTAAAAAAAA+QFHUgAAAAAAAPk=","repeats":1},{"count":984,"lower_bound":"AUdUAAAAAAAA+QFHUwAAAAAAAPk=","upper_bound":"AUdhAAAAAAAA+QFHWgAAAAAAAPk=","repeats":1},{"count":992,"lower_bound":"AUdiAAAAAAAA+QFHYQAAAAAAAPk=","upper_bound":"AUdpAAAAAAAA+QFHaAAAAAAAAPk=","repeats":1},{"count":1000,"lower_bound":"AUdqAAAAAAAA+QFHaQAAAAAAAPk=","upper_bound":"AUdxAAAAAAAA+QFHcAAAAAAAAPk=","repeats":1},{"count":1008,"lower_bound":"AUdyAAAAAAAA+QFHcQAAAAAAAPk=","upper_bound":"AUd5AAAAAAAA+QFHeQAAAAAAAPk=","repeats":1},{"count":1016,"lower_bound":"AUd6AAAAAAAA+QFHegAAAAAAAPk=","upper_bound":"AUg1AAAAAAAA+QFINQAAAAAAAPk=","repeats":1},{"count":1024,"lower_bound":"AUg2AAAAAAAA+QFINgAAAAAAAPk=","upper_bound":"AUhEAAAAAAAA+QFIRAAAAAAAAPk=","repeats":1},{"count":1032,"lower_bound":"AUhFAAAAAAAA+QFIRQAAAAAAAPk=","upper_bound":"AUhMAAAAAAAA+QFITAAAAAAAAPk=","repeats":1},{"count":1040,"lower_bound":"AUhNAAAAAAAA+QFITQAAAAAAAPk=","upper_bound":"AUhUAAAAAAAA+QFIVAAAAAAAAPk=","repeats":1},{"count":1048,"lower_bound":"AUhVAAAAAAAA+QFIVQAAAAAAAPk=","upper_bound":"AUhiAAAAAAAA+QFIYgAAAAAAAPk=","repeats":1},{"count":1056,"lower_bound":"AUhjAAAAAAAA+QFIYwAAAAAAAPk=","upper_bound":"AUhqAAAAAAAA+QFIagAAAAAAAPk=","repeats":1},{"count":1064,"lower_bound":"AUhrAAAAAAAA+QFIawAAAAAAAPk=","upper_bound":"AUhyAAAAAAAA+QFIcgAAAAAAAPk=","repeats":1},{"count":1072,"lower_bound":"AUhzAAAAAAAA+QFIcwAAAAAAAPk=","upper_bound":"AUh6AAAAAAAA+QFIegAAAAAAAPk=","repeats":1},{"count":1080,"lower_bound":"AUkAAAAAAAAA+AFJAAAAAAAAAPg=","upper_bound":"AUk2AAAAAAAA+QFJNgAAAAAAAPk=","repeats":1},{"count":1088,"lower_bound":"AUk3AAAAAAAA+QFJNwAAAAAAAPk=","upper_bound":"AUlFAAAAAAAA+QFJRQAAAAAAAPk=","repeats":1},{"count":1096,"lower_bound":"AUlGAAAAAAAA+QFJRwAAAAAAAPk=","upper_bound":"AUlNAAAAAAAA+QFJTQAAAAAAAPk=","repeats":1},{"count":1104,"lower_bound":"AUlOAAAAAAAA+QFJTgAAAAAAAPk=","upper_bound":"AUlVAAAAAAAA+QFJVQAAAAAAAPk=","repeats":1},{"count":1112,"lower_bound":"AUlWAAAAAAAA+QFJVgAAAAAAAPk=","upper_bound":"AUljAAAAAAAA+QFJYwAAAAAAAPk=","repeats":1},{"count":1120,"lower_bound":"AUlkAAAAAAAA+QFJZAAAAAAAAPk=","upper_bound":"AUlrAAAAAAAA+QFJawAAAAAAAPk=","repeats":1},{"count":1128,"lower_bound":"AUlsAAAAAAAA+QFJbAAAAAAAAPk=","upper_bound":"AUlzAAAAAAAA+QFJcwAAAAAAAPk=","repeats":1},{"count":1136,"lower_bound":"AUl0AAAAAAAA+QFJdAAAAAAAAPk=","upper_bound":"AUoAAAAAAAAA+AFKAAAAAAAAAPg=","repeats":1},{"count":1144,"lower_bound":"AUowAAAAAAAA+QFKMAAAAAAAAPk=","upper_bound":"AUo3AAAAAAAA+QFKNwAAAAAAAPk=","repeats":1},{"count":1152,"lower_bound":"AUo4AAAAAAAA+QFKOAAAAAAAAPk=","upper_bound":"AUpGAAAAAAAA+QFKRgAAAAAAAPk=","repeats":1},{"count":1160,"lower_bound":"AUpHAAAAAAAA+QFKRwAAAAAAAPk=","upper_bound":"AUpOAAAAAAAA+QFKTgAAAAAAAPk=","repeats":1},{"count":1168,"lower_bound":"AUpPAAAAAAAA+QFKTwAAAAAAAPk=","upper_bound":"AUpWAAAAAAAA+QFKVgAAAAAAAPk=","repeats":1},{"count":1176,"lower_bound":"AUpXAAAAAAAA+QFKVwAAAAAAAPk=","upper_bound":"AUpkAAAAAAAA+QFKZAAAAAAAAPk=","repeats":1},{"count":1184,"lower_bound":"AUplAAAAAAAA+QFKZQAAAAAAAPk=","upper_bound":"AUpsAAAAAAAA+QFKbAAAAAAAAPk=","repeats":1},{"count":1192,"lower_bound":"AUptAAAAAAAA+QFKbQAAAAAAAPk=","upper_bound":"AUp0AAAAAAAA+QFKdAAAAAAAAPk=","repeats":1},{"count":1200,"lower_bound":"AUp1AAAAAAAA+QFKdQAAAAAAAPk=","upper_bound":"AUswAAAAAAAA+QFLMAAAAAAAAPk=","repeats":1},{"count":1208,"lower_bound":"AUsxAAAAAAAA+QFLMQAAAAAAAPk=","upper_bound":"AUs4AAAAAAAA+QFLOAAAAAAAAPk=","repeats":1},{"count":1216,"lower_bound":"AUs5AAAAAAAA+QFLOQAAAAAAAPk=","upper_bound":"AUtHAAAAAAAA+QFLRwAAAAAAAPk=","repeats":1},{"count":1224,"lower_bound":"AUtIAAAAAAAA+QFLSAAAAAAAAPk=","upper_bound":"AUtPAAAAAAAA+QFLTwAAAAAAAPk=","repeats":1},{"count":1232,"lower_bound":"AUtQAAAAAAAA+QFLUAAAAAAAAPk=","upper_bound":"AUtXAAAAAAAA+QFLVwAAAAAAAPk=","repeats":1},{"count":1240,"lower_bound":"AUtYAAAAAAAA+QFLWAAAAAAAAPk=","upper_bound":"AUtlAAAAAAAA+QFLZQAAAAAAAPk=","repeats":1},{"count":1248,"lower_bound":"AUtmAAAAAAAA+QFLZgAAAAAAAPk=","upper_bound":"AUttAAAAAAAA+QFLbQAAAAAAAPk=","repeats":1},{"count":1256,"lower_bound":"AUtuAAAAAAAA+QFLbgAAAAAAAPk=","upper_bound":"AUt1AAAAAAAA+QFLdQAAAAAAAPk=","repeats":1},{"count":1264,"lower_bound":"AUt2AAAAAAAA+QFLdgAAAAAAAPk=","upper_bound":"AUwxAAAAAAAA+QFMMQAAAAAAAPk=","repeats":1},{"count":1272,"lower_bound":"AUwyAAAAAAAA+QFMMgAAAAAAAPk=","upper_bound":"AUw5AAAAAAAA+QFMOQAAAAAAAPk=","repeats":1},{"count":1280,"lower_bound":"AUxBAAAAAAAA+QFMQQAAAAAAAPk=","upper_bound":"AUxIAAAAAAAA+QFMSAAAAAAAAPk=","repeats":1},{"count":1288,"lower_bound":"AUxJAAAAAAAA+QFMSQAAAAAAAPk=","upper_bound":"AUxQAAAAAAAA+QFMUAAAAAAAAPk=","repeats":1},{"count":1296,"lower_bound":"AUxRAAAAAAAA+QFMUQAAAAAAAPk=","upper_bound":"AUxYAAAAAAAA+QFMWAAAAAAAAPk=","repeats":1},{"count":1304,"lower_bound":"AUxZAAAAAAAA+QFMWQAAAAAAAPk=","upper_bound":"AUxmAAAAAAAA+QFMZgAAAAAAAPk=","repeats":1},{"count":1312,"lower_bound":"AUxnAAAAAAAA+QFMZwAAAAAAAPk=","upper_bound":"AUxuAAAAAAAA+QFMbgAAAAAAAPk=","repeats":1},{"count":1320,"lower_bound":"AUxvAAAAAAAA+QFMbwAAAAAAAPk=","upper_bound":"AUx2AAAAAAAA+QFMdgAAAAAAAPk=","repeats":1},{"count":1328,"lower_bound":"AUx3AAAAAAAA+QFMdwAAAAAAAPk=","upper_bound":"AU0yAAAAAAAA+QFNMgAAAAAAAPk=","repeats":1},{"count":1336,"lower_bound":"AU0zAAAAAAAA+QFNMwAAAAAAAPk=","upper_bound":"AU1BAAAAAAAA+QFNQQAAAAAAAPk=","repeats":1},{"count":1344,"lower_bound":"AU1CAAAAAAAA+QFNQgAAAAAAAPk=","upper_bound":"AU1JAAAAAAAA+QFNSQAAAAAAAPk=","repeats":1},{"count":1352,"lower_bound":"AU1KAAAAAAAA+QFNSgAAAAAAAPk=","upper_bound":"AU1RAAAAAAAA+QFNUQAAAAAAAPk=","repeats":1},{"count":1360,"lower_bound":"AU1SAAAAAAAA+QFNUgAAAAAAAPk=","upper_bound":"AU1ZAAAAAAAA+QFNWQAAAAAAAPk=","repeats":1},{"count":1368,"lower_bound":"AU1aAAAAAAAA+QFNWgAAAAAAAPk=","upper_bound":"AU1nAAAAAAAA+QFNZwAAAAAAAPk=","repeats":1},{"count":1376,"lower_bound":"AU1oAAAAAAAA+QFNaAAAAAAAAPk=","upper_bound":"AU1vAAAAAAAA+QFNbwAAAAAAAPk=","repeats":1},{"count":1384,"lower_bound":"AU1wAAAAAAAA+QFNcAAAAAAAAPk=","upper_bound":"AU13AAAAAAAA+QFNdwAAAAAAAPk=","repeats":1},{"count":1392,"lower_bound":"AU14AAAAAAAA+QFNeAAAAAAAAPk=","upper_bound":"AU4zAAAAAAAA+QFOMwAAAAAAAPk=","repeats":1},{"count":1400,"lower_bound":"AU40AAAAAAAA+QFONAAAAAAAAPk=","upper_bound":"AU5CAAAAAAAA+QFOQgAAAAAAAPk=","repeats":1},{"count":1408,"lower_bound":"AU5DAAAAAAAA+QFOQwAAAAAAAPk=","upper_bound":"AU5KAAAAAAAA+QFOSgAAAAAAAPk=","repeats":1},{"count":1416,"lower_bound":"AU5LAAAAAAAA+QFOSwAAAAAAAPk=","upper_bound":"AU5SAAAAAAAA+QFOUgAAAAAAAPk=","repeats":1},{"count":1424,"lower_bound":"AU5TAAAAAAAA+QFOUwAAAAAAAPk=","upper_bound":"AU5aAAAAAAAA+QFOWgAAAAAAAPk=","repeats":1},{"count":1432,"lower_bound":"AU5hAAAAAAAA+QFOYQAAAAAAAPk=","upper_bound":"AU5oAAAAAAAA+QFOaAAAAAAAAPk=","repeats":1},{"count":1440,"lower_bound":"AU5pAAAAAAAA+QFOaQAAAAAAAPk=","upper_bound":"AU5wAAAAAAAA+QFOcAAAAAAAAPk=","repeats":1},{"count":1448,"lower_bound":"AU5xAAAAAAAA+QFOcQAAAAAAAPk=","upper_bound":"AU54AAAAAAAA+QFOeAAAAAAAAPk=","repeats":1},{"count":1456,"lower_bound":"AU55AAAAAAAA+QFOeQAAAAAAAPk=","upper_bound":"AU80AAAAAAAA+QFPNAAAAAAAAPk=","repeats":1},{"count":1464,"lower_bound":"AU81AAAAAAAA+QFPNQAAAAAAAPk=","upper_bound":"AU9DAAAAAAAA+QFPQwAAAAAAAPk=","repeats":1},{"count":1472,"lower_bound":"AU9EAAAAAAAA+QFPRAAAAAAAAPk=","upper_bound":"AU9LAAAAAAAA+QFPSwAAAAAAAPk=","repeats":1},{"count":1480,"lower_bound":"AU9MAAAAAAAA+QFPTAAAAAAAAPk=","upper_bound":"AU9TAAAAAAAA+QFPUwAAAAAAAPk=","repeats":1},{"count":1488,"lower_bound":"AU9UAAAAAAAA+QFPVAAAAAAAAPk=","upper_bound":"AU9hAAAAAAAA+QFPYQAAAAAAAPk=","repeats":1},{"count":1496,"lower_bound":"AU9iAAAAAAAA+QFPYgAAAAAAAPk=","upper_bound":"AU9pAAAAAAAA+QFPaQAAAAAAAPk=","repeats":1},{"count":1504,"lower_bound":"AU9qAAAAAAAA+QFPagAAAAAAAPk=","upper_bound":"AU9xAAAAAAAA+QFPcQAAAAAAAPk=","repeats":1},{"count":1512,"lower_bound":"AU9yAAAAAAAA+QFPcgAAAAAAAPk=","upper_bound":"AU95AAAAAAAA+QFPeQAAAAAAAPk=","repeats":1},{"count":1520,"lower_bound":"AU96AAAAAAAA+QFPegAAAAAAAPk=","upper_bound":"AVA1AAAAAAAA+QFQNQAAAAAAAPk=","repeats":1},{"count":1528,"lower_bound":"AVA2AAAAAAAA+QFQQQAAAAAAAPk=","upper_bound":"AVBEAAAAAAAA+QFQRAAAAAAAAPk=","repeats":1},{"count":1536,"lower_bound":"AVBFAAAAAAAA+QFQRQAAAAAAAPk=","upper_bound":"AVBMAAAAAAAA+QFQTAAAAAAAAPk=","repeats":1},{"count":1544,"lower_bound":"AVBNAAAAAAAA+QFQTQAAAAAAAPk=","upper_bound":"AVBUAAAAAAAA+QFQVAAAAAAAAPk=","repeats":1},{"count":1552,"lower_bound":"AVBVAAAAAAAA+QFQVQAAAAAAAPk=","upper_bound":"AVBiAAAAAAAA+QFQYgAAAAAAAPk=","repeats":1},{"count":1560,"lower_bound":"AVBjAAAAAAAA+QFQYwAAAAAAAPk=","upper_bound":"AVBqAAAAAAAA+QFQagAAAAAAAPk=","repeats":1},{"count":1568,"lower_bound":"AVBrAAAAAAAA+QFQawAAAAAAAPk=","upper_bound":"AVByAAAAAAAA+QFQcgAAAAAAAPk=","repeats":1},{"count":1576,"lower_bound":"AVBzAAAAAAAA+QFQcwAAAAAAAPk=","upper_bound":"AVB6AAAAAAAA+QFQegAAAAAAAPk=","repeats":1},{"count":1584,"lower_bound":"AVEAAAAAAAAA+AFRAAAAAAAAAPg=","upper_bound":"AVE2AAAAAAAA+QFRNgAAAAAAAPk=","repeats":1},{"count":1592,"lower_bound":"AVE3AAAAAAAA+QFRNwAAAAAAAPk=","upper_bound":"AVFFAAAAAAAA+QFRRQAAAAAAAPk=","repeats":1},{"count":1600,"lower_bound":"AVFGAAAAAAAA+QFRRgAAAAAAAPk=","upper_bound":"AVFNAAAAAAAA+QFRTQAAAAAAAPk=","repeats":1},{"count":1608,"lower_bound":"AVFOAAAAAAAA+QFRTgAAAAAAAPk=","upper_bound":"AVFVAAAAAAAA+QFRVQAAAAAAAPk=","repeats":1},{"count":1616,"lower_bound":"AVFWAAAAAAAA+QFRVgAAAAAAAPk=","upper_bound":"AVFjAAAAAAAA+QFRYwAAAAAAAPk=","repeats":1},{"count":1624,"lower_bound":"AVFkAAAAAAAA+QFRZAAAAAAAAPk=","upper_bound":"AVFrAAAAAAAA+QFRawAAAAAAAPk=","repeats":1},{"count":1632,"lower_bound":"AVFsAAAAAAAA+QFRbAAAAAAAAPk=","upper_bound":"AVFzAAAAAAAA+QFRcwAAAAAAAPk=","repeats":1},{"count":1640,"lower_bound":"AVF0AAAAAAAA+QFRdAAAAAAAAPk=","upper_bound":"AVIAAAAAAAAA+AFSAAAAAAAAAPg=","repeats":1},{"count":1648,"lower_bound":"AVIwAAAAAAAA+QFSMAAAAAAAAPk=","upper_bound":"AVI3AAAAAAAA+QFSNwAAAAAAAPk=","repeats":1},{"count":1656,"lower_bound":"AVI4AAAAAAAA+QFSOAAAAAAAAPk=","upper_bound":"AVJGAAAAAAAA+QFSRgAAAAAAAPk=","repeats":1},{"count":1664,"lower_bound":"AVJHAAAAAAAA+QFSRwAAAAAAAPk=","upper_bound":"AVJOAAAAAAAA+QFSTgAAAAAAAPk=","repeats":1},{"count":1672,"lower_bound":"AVJPAAAAAAAA+QFSTwAAAAAAAPk=","upper_bound":"AVJWAAAAAAAA+QFSVgAAAAAAAPk=","repeats":1},{"count":1680,"lower_bound":"AVJXAAAAAAAA+QFSVwAAAAAAAPk=","upper_bound":"AVJkAAAAAAAA+QFSZAAAAAAAAPk=","repeats":1},{"count":1688,"lower_bound":"AVJlAAAAAAAA+QFSZQAAAAAAAPk=","upper_bound":"AVJsAAAAAAAA+QFSbAAAAAAAAPk=","repeats":1},{"count":1696,"lower_bound":"AVJtAAAAAAAA+QFSbQAAAAAAAPk=","upper_bound":"AVJ0AAAAAAAA+QFSdAAAAAAAAPk=","repeats":1},{"count":1704,"lower_bound":"AVJ1AAAAAAAA+QFSdQAAAAAAAPk=","upper_bound":"AVMwAAAAAAAA+QFTMAAAAAAAAPk=","repeats":1},{"count":1712,"lower_bound":"AVMxAAAAAAAA+QFTMQAAAAAAAPk=","upper_bound":"AVM4AAAAAAAA+QFTOAAAAAAAAPk=","repeats":1},{"count":1720,"lower_bound":"AVM5AAAAAAAA+QFTOQAAAAAAAPk=","upper_bound":"AVNHAAAAAAAA+QFTRwAAAAAAAPk=","repeats":1},{"count":1728,"lower_bound":"AVNIAAAAAAAA+QFTSAAAAAAAAPk=","upper_bound":"AVNPAAAAAAAA+QFTTwAAAAAAAPk=","repeats":1},{"count":1736,"lower_bound":"AVNQAAAAAAAA+QFTUAAAAAAAAPk=","upper_bound":"AVNXAAAAAAAA+QFTVwAAAAAAAPk=","repeats":1},{"count":1744,"lower_bound":"AVNYAAAAAAAA+QFTWAAAAAAAAPk=","upper_bound":"AVNlAAAAAAAA+QFTZQAAAAAAAPk=","repeats":1},{"count":1752,"lower_bound":"AVNmAAAAAAAA+QFTZgAAAAAAAPk=","upper_bound":"AVNtAAAAAAAA+QFTbQAAAAAAAPk=","repeats":1},{"count":1760,"lower_bound":"AVNuAAAAAAAA+QFTbgAAAAAAAPk=","upper_bound":"AVN1AAAAAAAA+QFTdQAAAAAAAPk=","repeats":1},{"count":1768,"lower_bound":"AVN2AAAAAAAA+QFTdgAAAAAAAPk=","upper_bound":"AVQxAAAAAAAA+QFUMQAAAAAAAPk=","repeats":1},{"count":1776,"lower_bound":"AVQyAAAAAAAA+QFUMgAAAAAAAPk=","upper_bound":"AVQ5AAAAAAAA+QFUOQAAAAAAAPk=","repeats":1},{"count":1784,"lower_bound":"AVRBAAAAAAAA+QFUQQAAAAAAAPk=","upper_bound":"AVRIAAAAAAAA+QFUSAAAAAAAAPk=","repeats":1},{"count":1792,"lower_bound":"AVRJAAAAAAAA+QFUSQAAAAAAAPk=","upper_bound":"AVRQAAAAAAAA+QFUUAAAAAAAAPk=","repeats":1},{"count":1800,"lower_bound":"AVRRAAAAAAAA+QFUUQAAAAAAAPk=","upper_bound":"AVRYAAAAAAAA+QFUWAAAAAAAAPk=","repeats":1},{"count":1808,"lower_bound":"AVRZAAAAAAAA+QFUWQAAAAAAAPk=","upper_bound":"AVRmAAAAAAAA+QFUZgAAAAAAAPk=","repeats":1},{"count":1816,"lower_bound":"AVRnAAAAAAAA+QFUZwAAAAAAAPk=","upper_bound":"AVRuAAAAAAAA+QFUbgAAAAAAAPk=","repeats":1},{"count":1824,"lower_bound":"AVRvAAAAAAAA+QFUbwAAAAAAAPk=","upper_bound":"AVR2AAAAAAAA+QFUdgAAAAAAAPk=","repeats":1},{"count":1832,"lower_bound":"AVR3AAAAAAAA+QFUdwAAAAAAAPk=","upper_bound":"AVUyAAAAAAAA+QFVMgAAAAAAAPk=","repeats":1},{"count":1840,"lower_bound":"AVUzAAAAAAAA+QFVMwAAAAAAAPk=","upper_bound":"AVVBAAAAAAAA+QFVQQAAAAAAAPk=","repeats":1},{"count":1848,"lower_bound":"AVVCAAAAAAAA+QFVQgAAAAAAAPk=","upper_bound":"AVVJAAAAAAAA+QFVSQAAAAAAAPk=","repeats":1},{"count":1856,"lower_bound":"AVVKAAAAAAAA+QFVSgAAAAAAAPk=","upper_bound":"AVVRAAAAAAAA+QFVUQAAAAAAAPk=","repeats":1},{"count":1864,"lower_bound":"AVVSAAAAAAAA+QFVUgAAAAAAAPk=","upper_bound":"AVVZAAAAAAAA+QFVWQAAAAAAAPk=","repeats":1},{"count":1872,"lower_bound":"AVVaAAAAAAAA+QFVWgAAAAAAAPk=","upper_bound":"AVVnAAAAAAAA+QFVaAAAAAAAAPk=","repeats":1},{"count":1880,"lower_bound":"AVVoAAAAAAAA+QFVZwAAAAAAAPk=","upper_bound":"AVVvAAAAAAAA+QFVbwAAAAAAAPk=","repeats":1},{"count":1888,"lower_bound":"AVVwAAAAAAAA+QFVcAAAAAAAAPk=","upper_bound":"AVV3AAAAAAAA+QFVdwAAAAAAAPk=","repeats":1},{"count":1896,"lower_bound":"AVV4AAAAAAAA+QFVeAAAAAAAAPk=","upper_bound":"AVYzAAAAAAAA+QFWMwAAAAAAAPk=","repeats":1},{"count":1904,"lower_bound":"AVY0AAAAAAAA+QFWNAAAAAAAAPk=","upper_bound":"AVZCAAAAAAAA+QFWQgAAAAAAAPk=","repeats":1},{"count":1912,"lower_bound":"AVZDAAAAAAAA+QFWQwAAAAAAAPk=","upper_bound":"AVZKAAAAAAAA+QFWSgAAAAAAAPk=","repeats":1},{"count":1920,"lower_bound":"AVZLAAAAAAAA+QFWSwAAAAAAAPk=","upper_bound":"AVZSAAAAAAAA+QFWUgAAAAAAAPk=","repeats":1},{"count":1928,"lower_bound":"AVZTAAAAAAAA+QFWUwAAAAAAAPk=","upper_bound":"AVZaAAAAAAAA+QFWWgAAAAAAAPk=","repeats":1},{"count":1936,"lower_bound":"AVZhAAAAAAAA+QFWYQAAAAAAAPk=","upper_bound":"AVZoAAAAAAAA+QFWaAAAAAAAAPk=","repeats":1},{"count":1944,"lower_bound":"AVZpAAAAAAAA+QFWaQAAAAAAAPk=","upper_bound":"AVZwAAAAAAAA+QFWcAAAAAAAAPk=","repeats":1},{"count":1952,"lower_bound":"AVZxAAAAAAAA+QFWcQAAAAAAAPk=","upper_bound":"AVZ4AAAAAAAA+QFWeAAAAAAAAPk=","repeats":1},{"count":1960,"lower_bound":"AVZ5AAAAAAAA+QFWeQAAAAAAAPk=","upper_bound":"AVc0AAAAAAAA+QFXNAAAAAAAAPk=","repeats":1},{"count":1968,"lower_bound":"AVc1AAAAAAAA+QFXNQAAAAAAAPk=","upper_bound":"AVdDAAAAAAAA+QFXQwAAAAAAAPk=","repeats":1},{"count":1976,"lower_bound":"AVdEAAAAAAAA+QFXRAAAAAAAAPk=","upper_bound":"AWIAAAAAAAAA+AFiAAAAAAAAAPg=","repeats":1},{"count":1984,"lower_bound":"AWMAAAAAAAAA+AFjAAAAAAAAAPg=","upper_bound":"AWoAAAAAAAAA+AFpAAAAAAAAAPg=","repeats":1},{"count":1992,"lower_bound":"AWsAAAAAAAAA+AFrAAAAAAAAAPg=","upper_bound":"AXIAAAAAAAAA+AFxAAAAAAAAAPg=","repeats":1},{"count":2000,"lower_bound":"AXMAAAAAAAAA+AFzAAAAAAAAAPg=","upper_bound":"AXoAAAAAAAAA+AF5AAAAAAAAAPg=","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952035919495168},"t":{"histogram":{"ndv":101,"buckets":[{"count":30,"lower_bound":"A4AAAABYGq+c","upper_bound":"A4AAAABYGq+c","repeats":30},{"count":48,"lower_bound":"A4AAAABYGq+d","upper_bound":"A4AAAABYGq+d","repeats":18},{"count":63,"lower_bound":"A4AAAABYGq+e","upper_bound":"A4AAAABYGq+e","repeats":15},{"count":79,"lower_bound":"A4AAAABYGq+f","upper_bound":"A4AAAABYGq+f","repeats":16},{"count":103,"lower_bound":"A4AAAABYGq+g","upper_bound":"A4AAAABYGq+g","repeats":24},{"count":131,"lower_bound":"A4AAAABYGq+h","upper_bound":"A4AAAABYGq+h","repeats":28},{"count":156,"lower_bound":"A4AAAABYGq+i","upper_bound":"A4AAAABYGq+i","repeats":25},{"count":177,"lower_bound":"A4AAAABYGq+j","upper_bound":"A4AAAABYGq+j","repeats":21},{"count":202,"lower_bound":"A4AAAABYGq+k","upper_bound":"A4AAAABYGq+k","repeats":25},{"count":230,"lower_bound":"A4AAAABYGq+l","upper_bound":"A4AAAABYGq+l","repeats":28},{"count":244,"lower_bound":"A4AAAABYGq+m","upper_bound":"A4AAAABYGq+m","repeats":14},{"count":262,"lower_bound":"A4AAAABYGq+n","upper_bound":"A4AAAABYGq+n","repeats":18},{"count":297,"lower_bound":"A4AAAABYGq+o","upper_bound":"A4AAAABYGq+o","repeats":35},{"count":310,"lower_bound":"A4AAAABYGq+p","upper_bound":"A4AAAABYGq+p","repeats":13},{"count":328,"lower_bound":"A4AAAABYGq+q","upper_bound":"A4AAAABYGq+q","repeats":18},{"count":343,"lower_bound":"A4AAAABYGq+r","upper_bound":"A4AAAABYGq+r","repeats":15},{"count":364,"lower_bound":"A4AAAABYGq+s","upper_bound":"A4AAAABYGq+s","repeats":21},{"count":382,"lower_bound":"A4AAAABYGq+t","upper_bound":"A4AAAABYGq+t","repeats":18},{"count":402,"lower_bound":"A4AAAABYGq+u","upper_bound":"A4AAAABYGq+u","repeats":20},{"count":420,"lower_bound":"A4AAAABYGq+v","upper_bound":"A4AAAABYGq+v","repeats":18},{"count":442,"lower_bound":"A4AAAABYGq+w","upper_bound":"A4AAAABYGq+w","repeats":22},{"count":462,"lower_bound":"A4AAAABYGq+x","upper_bound":"A4AAAABYGq+x","repeats":20},{"count":484,"lower_bound":"A4AAAABYGq+y","upper_bound":"A4AAAABYGq+y","repeats":22},{"count":509,"lower_bound":"A4AAAABYGq+z","upper_bound":"A4AAAABYGq+z","repeats":25},{"count":527,"lower_bound":"A4AAAABYGq+0","upper_bound":"A4AAAABYGq+0","repeats":18},{"count":543,"lower_bound":"A4AAAABYGq+1","upper_bound":"A4AAAABYGq+1","repeats":16},{"count":575,"lower_bound":"A4AAAABYGq+2","upper_bound":"A4AAAABYGq+2","repeats":32},{"count":586,"lower_bound":"A4AAAABYGq+3","upper_bound":"A4AAAABYGq+3","repeats":11},{"count":616,"lower_bound":"A4AAAABYGq+4","upper_bound":"A4AAAABYGq+4","repeats":30},{"count":634,"lower_bound":"A4AAAABYGq+5","upper_bound":"A4AAAABYGq+5","repeats":18},{"count":665,"lower_bound":"A4AAAABYGq+6","upper_bound":"A4AAAABYGq+6","repeats":31},{"count":678,"lower_bound":"A4AAAABYGq+7","upper_bound":"A4AAAABYGq+7","repeats":13},{"count":696,"lower_bound":"A4AAAABYGq+8","upper_bound":"A4AAAABYGq+8","repeats":18},{"count":718,"lower_bound":"A4AAAABYGq+9","upper_bound":"A4AAAABYGq+9","repeats":22},{"count":744,"lower_bound":"A4AAAABYGq++","upper_bound":"A4AAAABYGq++","repeats":26},{"count":760,"lower_bound":"A4AAAABYGq+/","upper_bound":"A4AAAABYGq+/","repeats":16},{"count":782,"lower_bound":"A4AAAABYGq/A","upper_bound":"A4AAAABYGq/A","repeats":22},{"count":799,"lower_bound":"A4AAAABYGq/B","upper_bound":"A4AAAABYGq/B","repeats":17},{"count":819,"lower_bound":"A4AAAABYGq/C","upper_bound":"A4AAAABYGq/C","repeats":20},{"count":841,"lower_bound":"A4AAAABYGq/D","upper_bound":"A4AAAABYGq/D","repeats":22},{"count":859,"lower_bound":"A4AAAABYGq/E","upper_bound":"A4AAAABYGq/E","repeats":18},{"count":868,"lower_bound":"A4AAAABYGq/F","upper_bound":"A4AAAABYGq/F","repeats":9},{"count":889,"lower_bound":"A4AAAABYGq/G","upper_bound":"A4AAAABYGq/G","repeats":21},{"count":901,"lower_bound":"A4AAAABYGq/H","upper_bound":"A4AAAABYGq/H","repeats":12},{"count":919,"lower_bound":"A4AAAABYGq/I","upper_bound":"A4AAAABYGq/I","repeats":18},{"count":940,"lower_bound":"A4AAAABYGq/J","upper_bound":"A4AAAABYGq/J","repeats":21},{"count":960,"lower_bound":"A4AAAABYGq/K","upper_bound":"A4AAAABYGq/K","repeats":20},{"count":980,"lower_bound":"A4AAAABYGq/L","upper_bound":"A4AAAABYGq/L","repeats":20},{"count":992,"lower_bound":"A4AAAABYGq/M","upper_bound":"A4AAAABYGq/M","repeats":12},{"count":1013,"lower_bound":"A4AAAABYGq/N","upper_bound":"A4AAAABYGq/N","repeats":21},{"count":1028,"lower_bound":"A4AAAABYGq/O","upper_bound":"A4AAAABYGq/O","repeats":15},{"count":1041,"lower_bound":"A4AAAABYGq/P","upper_bound":"A4AAAABYGq/P","repeats":13},{"count":1065,"lower_bound":"A4AAAABYGq/Q","upper_bound":"A4AAAABYGq/Q","repeats":24},{"count":1082,"lower_bound":"A4AAAABYGq/R","upper_bound":"A4AAAABYGq/R","repeats":17},{"count":1104,"lower_bound":"A4AAAABYGq/S","upper_bound":"A4AAAABYGq/S","repeats":22},{"count":1122,"lower_bound":"A4AAAABYGq/T","upper_bound":"A4AAAABYGq/T","repeats":18},{"count":1137,"lower_bound":"A4AAAABYGq/U","upper_bound":"A4AAAABYGq/U","repeats":15},{"count":1155,"lower_bound":"A4AAAABYGq/V","upper_bound":"A4AAAABYGq/V","repeats":18},{"count":1178,"lower_bound":"A4AAAABYGq/W","upper_bound":"A4AAAABYGq/W","repeats":23},{"count":1201,"lower_bound":"A4AAAABYGq/X","upper_bound":"A4AAAABYGq/X","repeats":23},{"count":1210,"lower_bound":"A4AAAABYGq/Y","upper_bound":"A4AAAABYGq/Y","repeats":9},{"count":1229,"lower_bound":"A4AAAABYGq/Z","upper_bound":"A4AAAABYGq/Z","repeats":19},{"count":1244,"lower_bound":"A4AAAABYGq/a","upper_bound":"A4AAAABYGq/a","repeats":15},{"count":1262,"lower_bound":"A4AAAABYGq/b","upper_bound":"A4AAAABYGq/b","repeats":18},{"count":1283,"lower_bound":"A4AAAABYGq/c","upper_bound":"A4AAAABYGq/c","repeats":21},{"count":1297,"lower_bound":"A4AAAABYGq/d","upper_bound":"A4AAAABYGq/d","repeats":14},{"count":1314,"lower_bound":"A4AAAABYGq/e","upper_bound":"A4AAAABYGq/e","repeats":17},{"count":1332,"lower_bound":"A4AAAABYGq/f","upper_bound":"A4AAAABYGq/f","repeats":18},{"count":1353,"lower_bound":"A4AAAABYGq/g","upper_bound":"A4AAAABYGq/g","repeats":21},{"count":1380,"lower_bound":"A4AAAABYGq/h","upper_bound":"A4AAAABYGq/h","repeats":27},{"count":1409,"lower_bound":"A4AAAABYGq/i","upper_bound":"A4AAAABYGq/i","repeats":29},{"count":1427,"lower_bound":"A4AAAABYGq/j","upper_bound":"A4AAAABYGq/j","repeats":18},{"count":1449,"lower_bound":"A4AAAABYGq/k","upper_bound":"A4AAAABYGq/k","repeats":22},{"count":1465,"lower_bound":"A4AAAABYGq/l","upper_bound":"A4AAAABYGq/l","repeats":16},{"count":1493,"lower_bound":"A4AAAABYGq/m","upper_bound":"A4AAAABYGq/m","repeats":28},{"count":1514,"lower_bound":"A4AAAABYGq/n","upper_bound":"A4AAAABYGq/n","repeats":21},{"count":1530,"lower_bound":"A4AAAABYGq/o","upper_bound":"A4AAAABYGq/o","repeats":16},{"count":1540,"lower_bound":"A4AAAABYGq/p","upper_bound":"A4AAAABYGq/p","repeats":10},{"count":1557,"lower_bound":"A4AAAABYGq/q","upper_bound":"A4AAAABYGq/q","repeats":17},{"count":1577,"lower_bound":"A4AAAABYGq/r","upper_bound":"A4AAAABYGq/r","repeats":20},{"count":1600,"lower_bound":"A4AAAABYGq/s","upper_bound":"A4AAAABYGq/s","repeats":23},{"count":1625,"lower_bound":"A4AAAABYGq/t","upper_bound":"A4AAAABYGq/t","repeats":25},{"count":1642,"lower_bound":"A4AAAABYGq/u","upper_bound":"A4AAAABYGq/u","repeats":17},{"count":1664,"lower_bound":"A4AAAABYGq/v","upper_bound":"A4AAAABYGq/v","repeats":22},{"count":1686,"lower_bound":"A4AAAABYGq/w","upper_bound":"A4AAAABYGq/w","repeats":22},{"count":1705,"lower_bound":"A4AAAABYGq/x","upper_bound":"A4AAAABYGq/x","repeats":19},{"count":1728,"lower_bound":"A4AAAABYGq/y","upper_bound":"A4AAAABYGq/y","repeats":23},{"count":1743,"lower_bound":"A4AAAABYGq/z","upper_bound":"A4AAAABYGq/z","repeats":15},{"count":1768,"lower_bound":"A4AAAABYGq/0","upper_bound":"A4AAAABYGq/0","repeats":25},{"count":1786,"lower_bound":"A4AAAABYGq/1","upper_bound":"A4AAAABYGq/1","repeats":18},{"count":1808,"lower_bound":"A4AAAABYGq/2","upper_bound":"A4AAAABYGq/2","repeats":22},{"count":1830,"lower_bound":"A4AAAABYGq/3","upper_bound":"A4AAAABYGq/3","repeats":22},{"count":1850,"lower_bound":"A4AAAABYGq/4","upper_bound":"A4AAAABYGq/4","repeats":20},{"count":1876,"lower_bound":"A4AAAABYGq/5","upper_bound":"A4AAAABYGq/5","repeats":26},{"count":1892,"lower_bound":"A4AAAABYGq/6","upper_bound":"A4AAAABYGq/6","repeats":16},{"count":1910,"lower_bound":"A4AAAABYGq/7","upper_bound":"A4AAAABYGq/7","repeats":18},{"count":1928,"lower_bound":"A4AAAABYGq/8","upper_bound":"A4AAAABYGq/8","repeats":18},{"count":1955,"lower_bound":"A4AAAABYGq/9","upper_bound":"A4AAAABYGq/9","repeats":27},{"count":1971,"lower_bound":"A4AAAABYGq/+","upper_bound":"A4AAAABYGq/+","repeats":16},{"count":1985,"lower_bound":"A4AAAABYGq//","upper_bound":"A4AAAABYGq//","repeats":14},{"count":2000,"lower_bound":"A4AAAABYGrAA","upper_bound":"A4AAAABYGrAA","repeats":15}]},"cm_sketch":{"rows":[{"counters":[26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,18,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,18,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,22,0,0,0,15,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,25,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,20,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,25,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,18,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,12,0,0,0,0,0,0,0,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,26,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,22,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,18,0,0,0,0,21,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,55,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,18,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,22,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,18,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,16,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,25,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,20,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,26,0,0,0,0,26,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,24,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,22,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,15,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,16,0,0,0,33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,29,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,20,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,18,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,22,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,27,18,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,16,0,17,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,20,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,16,0,18,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,20,0,0,0,0,0,0,29,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,17,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,28,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,20,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,18,0,0,0,0,0,35,0,0,0,11,0,0,9,0,0,0,0,0,17,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,31,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,18,0,0,0,22,0,22,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,24,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,18,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,23,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,23,0,0,0,0,9,0,25,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,12,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,26,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,29,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,16,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,18,0,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,21,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,27,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,22,0,0,18,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,30,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,0,22,30,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,15,0,22,0,13,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,35,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952036684431360},"ip":{"histogram":{"ndv":1905,"buckets":[{"count":8,"lower_bound":"ATA2UWJ1RzZ6/wAAAAAAAAAA9w==","upper_bound":"ATBWN3MzNTVI/0NlWTBHNEUA/g==","repeats":1},{"count":18,"lower_bound":"ATBlTFVDcVMw/2JaQmV0AAAA/A==","upper_bound":"ATE1dDBuWjl4/0hJRFFpc1kA/g==","repeats":1},{"count":26,"lower_bound":"ATE2TWV5UkVz/0tkYjAwSlAA/g==","upper_bound":"ATFCM3d5Z2pQ/2MAAAAAAAAA+A==","repeats":1},{"count":34,"lower_bound":"ATFEa2J4elgA/g==","upper_bound":"ATFWR2MzAAAA/A==","repeats":1},{"count":42,"lower_bound":"ATFYb0xnVXNk/2NDAAAAAAAA+Q==","upper_bound":"ATFqZwAAAAAA+g==","repeats":1},{"count":50,"lower_bound":"ATFsb2lEOGlU/zdLT21OAAAA/A==","upper_bound":"ATIAAAAAAAAA+A==","repeats":1},{"count":58,"lower_bound":"ATIxMndRZDVS/2xkRGYyNgAA/Q==","upper_bound":"ATJBQzBTYWkA/g==","repeats":1},{"count":66,"lower_bound":"ATJEVQAAAAAA+g==","upper_bound":"ATJRdzd3bFZH/zY1aEIAAAAA+w==","repeats":1},{"count":74,"lower_bound":"ATJReHBkSUpr/3oyNGZJcwAA/Q==","upper_bound":"ATJkaW53AAAA/A==","repeats":1},{"count":82,"lower_bound":"ATJqAAAAAAAA+Q==","upper_bound":"ATJ0dloxVDRL/2xmAAAAAAAA+Q==","repeats":1},{"count":90,"lower_bound":"ATJ1RGxiMDlw/0FzeAAAAAAA+g==","upper_bound":"ATMxUnkAAAAA+w==","repeats":1},{"count":98,"lower_bound":"ATM0VlE3a3Zy/2lEAAAAAAAA+Q==","upper_bound":"ATNHQ1kAAAAA+w==","repeats":1},{"count":106,"lower_bound":"ATNLRkZXS014/1hHZXEAAAAA+w==","upper_bound":"ATNSeTlTVmgy/0ZBZgAAAAAA+g==","repeats":1},{"count":114,"lower_bound":"ATNVdkU3AAAA/A==","upper_bound":"ATNuOVFwAAAA/A==","repeats":1},{"count":122,"lower_bound":"ATNuRUUybVhO/0RSRXBXVQAA/Q==","upper_bound":"ATN0WnBnRlNm/3RObwAAAAAA+g==","repeats":1},{"count":131,"lower_bound":"ATN1AAAAAAAA+Q==","upper_bound":"ATREUHEzczUA/g==","repeats":1},{"count":139,"lower_bound":"ATRFZ24AAAAA+w==","upper_bound":"ATRVQnI4NUU3/20AAAAAAAAA+A==","repeats":1},{"count":147,"lower_bound":"ATRZM2o5R2QA/g==","upper_bound":"ATRoWm9YYVNV/0twMkpRAAAA/A==","repeats":1},{"count":155,"lower_bound":"ATRqTUMAAAAA+w==","upper_bound":"ATR0UVU2cHhv/2k1WEgAAAAA+w==","repeats":1},{"count":164,"lower_bound":"ATR0ZHZFZnJE/zNXSXp6AAAA/A==","upper_bound":"ATUyeHlmWkV0/3pFAAAAAAAA+Q==","repeats":1},{"count":172,"lower_bound":"ATU1VWdqZjl1/0thAAAAAAAA+Q==","upper_bound":"ATVKQldoWEZ6/2YAAAAAAAAA+A==","repeats":1},{"count":180,"lower_bound":"ATVLTAAAAAAA+g==","upper_bound":"ATVYT1ZlSW5Y/1oAAAAAAAAA+A==","repeats":1},{"count":188,"lower_bound":"ATVaMDhJNAAA/Q==","upper_bound":"ATVuNUN6UQAA/Q==","repeats":1},{"count":199,"lower_bound":"ATVyNkkwRWNB/zRtAAAAAAAA+Q==","upper_bound":"ATY2AAAAAAAA+Q==","repeats":1},{"count":207,"lower_bound":"ATY3bmk4UQAA/Q==","upper_bound":"ATZGckxyNXdD/3B4d0JmY1gA/g==","repeats":1},{"count":215,"lower_bound":"ATZHaFBMOG83/0diOVp5AAAA/A==","upper_bound":"ATZhcjV3AAAA/A==","repeats":1},{"count":223,"lower_bound":"ATZmc2FyOHBw/wAAAAAAAAAA9w==","upper_bound":"ATZxZzFobVNo/0RhaVUAAAAA+w==","repeats":1},{"count":232,"lower_bound":"ATZ1ZUdYc0dG/1VwUlEAAAAA+w==","upper_bound":"ATc4R1pEQTZz/1oAAAAAAAAA+A==","repeats":1},{"count":240,"lower_bound":"ATc4b3VzN0lF/wAAAAAAAAAA9w==","upper_bound":"ATdJamg3MDNZ/3V0aUE3c0IA/g==","repeats":1},{"count":248,"lower_bound":"ATdPUEF0M0VN/1JnAAAAAAAA+Q==","upper_bound":"ATdiOUUzSGpi/2wAAAAAAAAA+A==","repeats":1},{"count":256,"lower_bound":"ATdiYTRmNU4A/g==","upper_bound":"ATdsZ0pYAAAA/A==","repeats":1},{"count":264,"lower_bound":"ATdvem9sN3VJ/0xFAAAAAAAA+Q==","upper_bound":"ATgwMDZzVDFJ/1ZkaktuAAAA/A==","repeats":1},{"count":272,"lower_bound":"ATg2AAAAAAAA+Q==","upper_bound":"AThQZHR3UDZm/2hEZwAAAAAA+g==","repeats":1},{"count":280,"lower_bound":"AThRSGdHMXU4/zZtZEoAAAAA+w==","upper_bound":"AThhM1FFTHU3/1hOVVBLAAAA/A==","repeats":1},{"count":288,"lower_bound":"AThjZFkxR0RO/3g4AAAAAAAA+Q==","upper_bound":"AThuNTl0OVJj/0pwAAAAAAAA+Q==","repeats":1},{"count":296,"lower_bound":"AThuTDhtbEhQ/3BPAAAAAAAA+Q==","upper_bound":"ATh4TU9jWEcy/2pMS1B2ZwAA/Q==","repeats":1},{"count":304,"lower_bound":"ATh5VWpyMzA4/1lLVgAAAAAA+g==","upper_bound":"ATk5Znhqakd6/3pPV0c4TzAA/g==","repeats":1},{"count":312,"lower_bound":"ATk5bmlEamMA/g==","upper_bound":"ATlNano3QVNZ/2lhUzh1cEcA/g==","repeats":1},{"count":320,"lower_bound":"ATlVAAAAAAAA+Q==","upper_bound":"ATlqNmh3WAAA/Q==","repeats":1},{"count":330,"lower_bound":"ATlrZThkTUYA/g==","upper_bound":"AUE4AAAAAAAA+Q==","repeats":1},{"count":338,"lower_bound":"AUE4OGVHV290/0llagAAAAAA+g==","upper_bound":"AUFNdgAAAAAA+g==","repeats":1},{"count":346,"lower_bound":"AUFPbEs5N284/2xYNzkAAAAA+w==","upper_bound":"AUFVSk5RSjgA/g==","repeats":1},{"count":354,"lower_bound":"AUFWMmx2Y2xz/3F4MDAAAAAA+w==","upper_bound":"AUFmMzVlNXZ0/3oxSTRrAAAA/A==","repeats":1},{"count":362,"lower_bound":"AUFnbU8xMDBJ/zloUAAAAAAA+g==","upper_bound":"AUFyYVl4aFE5/zYAAAAAAAAA+A==","repeats":1},{"count":371,"lower_bound":"AUF0RmRYa2xN/2d2AAAAAAAA+Q==","upper_bound":"AUIyY29NZ2dv/1B1ZFgAAAAA+w==","repeats":1},{"count":379,"lower_bound":"AUIzWmc2ZXZr/01BdzNPeWIA/g==","upper_bound":"AUJHcmVwRHlY/0hXaAAAAAAA+g==","repeats":1},{"count":387,"lower_bound":"AUJHdFEAAAAA+w==","upper_bound":"AUJXTFhNRDRK/1gAAAAAAAAA+A==","repeats":1},{"count":395,"lower_bound":"AUJYAAAAAAAA+Q==","upper_bound":"AUJ4T2JSam8A/g==","repeats":1},{"count":403,"lower_bound":"AUMAAAAAAAAA+A==","upper_bound":"AUNETjhieXlT/0oAAAAAAAAA+A==","repeats":1},{"count":411,"lower_bound":"AUNGM1U2Y3lK/zhQTzlpAAAA/A==","upper_bound":"AUNTMFppUmow/2lVVG4AAAAA+w==","repeats":1},{"count":419,"lower_bound":"AUNVdFYAAAAA+w==","upper_bound":"AUNlT0VnUWVJ/244TXFKMgAA/Q==","repeats":1},{"count":427,"lower_bound":"AUNoQTJoTjhV/2syS0JFTQAA/Q==","upper_bound":"AUN0UWo3amdK/0VWTTBlQgAA/Q==","repeats":1},{"count":436,"lower_bound":"AUN1S0JZRWZT/zFBZjMAAAAA+w==","upper_bound":"AUQxVjBQMU5G/wAAAAAAAAAA9w==","repeats":1},{"count":444,"lower_bound":"AUQxcTl2T3ha/wAAAAAAAAAA9w==","upper_bound":"AURLWVNqaTVx/3ZWWThJAAAA/A==","repeats":1},{"count":452,"lower_bound":"AURQQjFkRDg3/0FwVVM3bTUA/g==","upper_bound":"AURmAAAAAAAA+Q==","repeats":1},{"count":460,"lower_bound":"AURnWmNMQUMA/g==","upper_bound":"AURxYk1ucHBp/2lmTjVSMAAA/Q==","repeats":1},{"count":469,"lower_bound":"AUR2dQAAAAAA+g==","upper_bound":"AUVBcwAAAAAA+g==","repeats":1},{"count":477,"lower_bound":"AUVCVDVrQzZo/1k4QmJLMQAA/Q==","upper_bound":"AUVOTFlLd21I/zY3AAAAAAAA+Q==","repeats":1},{"count":485,"lower_bound":"AUVPdTlRdmtD/1RNYnJPNUcA/g==","upper_bound":"AUVhNmMAAAAA+w==","repeats":1},{"count":493,"lower_bound":"AUVjM0EAAAAA+w==","upper_bound":"AUVra2pnQzhK/zBMaWUAAAAA+w==","repeats":1},{"count":501,"lower_bound":"AUVuU2x2AAAA/A==","upper_bound":"AUV4TG5vcmQA/g==","repeats":1},{"count":509,"lower_bound":"AUYAAAAAAAAA+A==","upper_bound":"AUY5TjBmAAAA/A==","repeats":1},{"count":517,"lower_bound":"AUZDAAAAAAAA+Q==","upper_bound":"AUZLUjZQVUdD/wAAAAAAAAAA9w==","repeats":1},{"count":525,"lower_bound":"AUZOTjJpZFJK/0tuc1lJVgAA/Q==","upper_bound":"AUZiTHBIcVhx/wAAAAAAAAAA9w==","repeats":1},{"count":533,"lower_bound":"AUZicGxVUE1N/zJEUwAAAAAA+g==","upper_bound":"AUZvAAAAAAAA+Q==","repeats":1},{"count":542,"lower_bound":"AUZzbUpFUAAA/Q==","upper_bound":"AUcAAAAAAAAA+A==","repeats":3},{"count":550,"lower_bound":"AUcwajR2eXhC/0pEakNzR1EA/g==","upper_bound":"AUdSSVJTV3dD/2hRQ2JBTAAA/Q==","repeats":1},{"count":558,"lower_bound":"AUdVAAAAAAAA+Q==","upper_bound":"AUdhcgAAAAAA+g==","repeats":1},{"count":566,"lower_bound":"AUdiaExqV0Mz/3hpAAAAAAAA+Q==","upper_bound":"AUgAAAAAAAAA+A==","repeats":1},{"count":574,"lower_bound":"AUgwaHpsSAAA/Q==","upper_bound":"AUhCUTlmRE1a/1NSZTVaVloA/g==","repeats":1},{"count":582,"lower_bound":"AUhFRzQAAAAA+w==","upper_bound":"AUhQd3pxeXpo/0NRVHJvAAAA/A==","repeats":1},{"count":590,"lower_bound":"AUhTMW1VNk5Y/zVDQ0Y2NgAA/Q==","upper_bound":"AUhnVXdBaDFm/zliZ1J5YkcA/g==","repeats":1},{"count":598,"lower_bound":"AUhoeXJkZk1O/zMAAAAAAAAA+A==","upper_bound":"AUh3MllJNHRy/zZEZkFRbzYA/g==","repeats":1},{"count":606,"lower_bound":"AUkAAAAAAAAA+A==","upper_bound":"AUlCSzJsQ29R/0F3WAAAAAAA+g==","repeats":1},{"count":614,"lower_bound":"AUlDeDVxMnRz/0xFSHZPTlMA/g==","upper_bound":"AUlLZWtxAAAA/A==","repeats":1},{"count":622,"lower_bound":"AUlMeUgwAAAA/A==","upper_bound":"AUlVVUY3Q1hQ/2RKOHU0V0oA/g==","repeats":1},{"count":630,"lower_bound":"AUlXeHhRcVV2/3FZWHAAAAAA+w==","upper_bound":"AUl0VzNXek1B/0pYRgAAAAAA+g==","repeats":1},{"count":638,"lower_bound":"AUl0WAAAAAAA+g==","upper_bound":"AUoAAAAAAAAA+A==","repeats":2},{"count":646,"lower_bound":"AUowUHNMTGRl/2UAAAAAAAAA+A==","upper_bound":"AUpUNkN4WXhp/3FuQnIAAAAA+w==","repeats":1},{"count":654,"lower_bound":"AUpaMVJyd0RS/1ZONwAAAAAA+g==","upper_bound":"AUpzVgAAAAAA+g==","repeats":1},{"count":663,"lower_bound":"AUp0bGdVMTNK/0xSaGxLAAAA/A==","upper_bound":"AUs5RkoAAAAA+w==","repeats":1},{"count":671,"lower_bound":"AUtCTHYAAAAA+w==","upper_bound":"AUtMRTdZcDhJ/2dFM2tudQAA/Q==","repeats":1},{"count":679,"lower_bound":"AUtNAAAAAAAA+Q==","upper_bound":"AUthSTBLUlBa/zFGOTlGU3IA/g==","repeats":1},{"count":687,"lower_bound":"AUtibUZQQmhD/2cwb0VGUgAA/Q==","upper_bound":"AUttYjVWcEdk/1AAAAAAAAAA+A==","repeats":1},{"count":695,"lower_bound":"AUtuQQAAAAAA+g==","upper_bound":"AUw0d3NESWZa/zBqcXFEAAAA/A==","repeats":1},{"count":703,"lower_bound":"AUw1aExNM0ZX/1N3UmtLAAAA/A==","upper_bound":"AUxPUEJVSGRa/25xN1N3AAAA/A==","repeats":1},{"count":711,"lower_bound":"AUxPZnkAAAAA+w==","upper_bound":"AUxhAAAAAAAA+Q==","repeats":1},{"count":719,"lower_bound":"AUxhV1hySWhF/3MxaAAAAAAA+g==","upper_bound":"AUxuanFvAAAA/A==","repeats":1},{"count":727,"lower_bound":"AUxzVzE5V3B0/0YAAAAAAAAA+A==","upper_bound":"AU0zRkhEZEI5/2xOOUY4AAAA/A==","repeats":1},{"count":735,"lower_bound":"AU0zdWRGblRj/2pGbVQ2UwAA/Q==","upper_bound":"AU1SeDR0V3Fz/3IAAAAAAAAA+A==","repeats":1},{"count":743,"lower_bound":"AU1VTndNcTRL/3pKWVNGAAAA/A==","upper_bound":"AU1iMQAAAAAA+g==","repeats":1},{"count":751,"lower_bound":"AU1jRkZUanpy/zdtRDdsNQAA/Q==","upper_bound":"AU1wOGxBRThE/2VMdkZpAAAA/A==","repeats":1},{"count":759,"lower_bound":"AU11QU9WZ3hS/21hT2xKdWEA/g==","upper_bound":"AU5FMmRERjQ5/21EUTVZN2EA/g==","repeats":1},{"count":767,"lower_bound":"AU5HajVmODJH/28xalRaAAAA/A==","upper_bound":"AU5TeHIAAAAA+w==","repeats":1},{"count":775,"lower_bound":"AU5VRndOAAAA/A==","upper_bound":"AU53ZkVFVgAA/Q==","repeats":1},{"count":783,"lower_bound":"AU54MHp5VjNv/0ZLVnoAAAAA+w==","upper_bound":"AU84AAAAAAAA+Q==","repeats":1},{"count":791,"lower_bound":"AU84dGFkQnNY/zJVRDQAAAAA+w==","upper_bound":"AU9Ra1dEUQAA/Q==","repeats":1},{"count":799,"lower_bound":"AU9VY3ZnWkhw/0ZVAAAAAAAA+Q==","upper_bound":"AU9tdGVGeVBh/1E2cAAAAAAA+g==","repeats":1},{"count":807,"lower_bound":"AU9vTWVqY2JS/0dTAAAAAAAA+Q==","upper_bound":"AVAzSVp3Z0wA/g==","repeats":1},{"count":815,"lower_bound":"AVBBZHpqAAAA/A==","upper_bound":"AVBKaVRVMHFj/zlRZjEAAAAA+w==","repeats":1},{"count":823,"lower_bound":"AVBLVUhLQUtK/zdLNkl5cQAA/Q==","upper_bound":"AVBnMUdYAAAA/A==","repeats":1},{"count":831,"lower_bound":"AVBoAAAAAAAA+Q==","upper_bound":"AVBwc2NQRWxG/1NyejAAAAAA+w==","repeats":1},{"count":840,"lower_bound":"AVByU2NlWHVU/2N0M0gAAAAA+w==","upper_bound":"AVEAAAAAAAAA+A==","repeats":4},{"count":848,"lower_bound":"AVEwOVFUY0Vi/2RSAAAAAAAA+Q==","upper_bound":"AVFEekhTcwAA/Q==","repeats":1},{"count":856,"lower_bound":"AVFGMUJjaTA2/2VPVlBoSGgA/g==","upper_bound":"AVFUYWJpZTZl/1JPR2VOAAAA/A==","repeats":1},{"count":864,"lower_bound":"AVFWaXNSemF5/zBWYlcwYWEA/g==","upper_bound":"AVFuAAAAAAAA+Q==","repeats":1},{"count":872,"lower_bound":"AVFuUWJuajhQ/0kAAAAAAAAA+A==","upper_bound":"AVF3agAAAAAA+g==","repeats":1},{"count":880,"lower_bound":"AVIwREwzAAAA/A==","upper_bound":"AVJGQQAAAAAA+g==","repeats":1},{"count":888,"lower_bound":"AVJHdE5UdTQ1/29iRTV0AAAA/A==","upper_bound":"AVJTd2Vlc2VW/1BBZTZHWFkA/g==","repeats":1},{"count":896,"lower_bound":"AVJZbwAAAAAA+g==","upper_bound":"AVJnWQAAAAAA+g==","repeats":1},{"count":904,"lower_bound":"AVJnZEZBaXVU/0tTRHUzTgAA/Q==","upper_bound":"AVJ2TW9LMDV1/3MyTFBxeQAA/Q==","repeats":1},{"count":913,"lower_bound":"AVJ3RkJEaTlm/2liWGJSMwAA/Q==","upper_bound":"AVMzAAAAAAAA+Q==","repeats":1},{"count":922,"lower_bound":"AVM1MmdQUgAA/Q==","upper_bound":"AVNGAAAAAAAA+Q==","repeats":2},{"count":930,"lower_bound":"AVNKNlk2TgAA/Q==","upper_bound":"AVNSMFFqSkNx/1NwV0Q5R2sA/g==","repeats":1},{"count":938,"lower_bound":"AVNSMjUAAAAA+w==","upper_bound":"AVNkQnZnUk9Y/0dyMXdLSgAA/Q==","repeats":1},{"count":947,"lower_bound":"AVNkZWdSdXMw/3NWM0NITwAA/Q==","upper_bound":"AVQAAAAAAAAA+A==","repeats":4},{"count":955,"lower_bound":"AVQydHRGMwAA/Q==","upper_bound":"AVRGcXF4AAAA/A==","repeats":1},{"count":963,"lower_bound":"AVRGdAAAAAAA+g==","upper_bound":"AVRUM0E2NVpF/zV1anBLAAAA/A==","repeats":1},{"count":971,"lower_bound":"AVRUU2o0SnFG/1RoAAAAAAAA+Q==","upper_bound":"AVRmRnZvN0Jm/zB4AAAAAAAA+Q==","repeats":1},{"count":979,"lower_bound":"AVRocmMAAAAA+w==","upper_bound":"AVR5AAAAAAAA+Q==","repeats":1},{"count":987,"lower_bound":"AVR5QUl1YzkA/g==","upper_bound":"AVU1M0k2ZjBv/0paWG1TAAAA/A==","repeats":1},{"count":995,"lower_bound":"AVU3aGFwdmpm/0VxRVlMagAA/Q==","upper_bound":"AVVHZFdjAAAA/A==","repeats":1},{"count":1003,"lower_bound":"AVVJYzZaNmtz/3g1enZxAAAA/A==","upper_bound":"AVVRYzU1SUg1/3RrdjhUcjAA/g==","repeats":1},{"count":1011,"lower_bound":"AVVTNDJNVjI1/wAAAAAAAAAA9w==","upper_bound":"AVVtbgAAAAAA+g==","repeats":1},{"count":1019,"lower_bound":"AVVvS1YAAAAA+w==","upper_bound":"AVV6Q0FTemQx/3hXV0swAAAA/A==","repeats":1},{"count":1027,"lower_bound":"AVYAAAAAAAAA+A==","upper_bound":"AVZBTHAxeWcA/g==","repeats":1},{"count":1035,"lower_bound":"AVZBd1VQegAA/Q==","upper_bound":"AVZKV3c5RTlQ/zJ6dFJSYzkA/g==","repeats":1},{"count":1043,"lower_bound":"AVZQZjlFOUxS/3cAAAAAAAAA+A==","upper_bound":"AVZheHNzV0kA/g==","repeats":1},{"count":1051,"lower_bound":"AVZjAAAAAAAA+Q==","upper_bound":"AVZ3AAAAAAAA+Q==","repeats":1},{"count":1059,"lower_bound":"AVZ5TGhCdDJn/3dZWXl1MAAA/Q==","upper_bound":"AVdBV3ZuMgAA/Q==","repeats":1},{"count":1067,"lower_bound":"AVdCN2gxeXp2/3psMmEAAAAA+w==","upper_bound":"AVdPUjNFNnRD/2lET25WAAAA/A==","repeats":1},{"count":1075,"lower_bound":"AVdQAAAAAAAA+Q==","upper_bound":"AVdodGluYkx3/0ZmMzMAAAAA+w==","repeats":1},{"count":1083,"lower_bound":"AVdqZm05WUls/3dtMXhlAAAA/A==","upper_bound":"AVgAAAAAAAAA+A==","repeats":1},{"count":1091,"lower_bound":"AVgwTTdreHF0/045bkVvNAAA/Q==","upper_bound":"AVhIYk5MQ1dz/0F6WkNzc0EA/g==","repeats":1},{"count":1099,"lower_bound":"AVhIZ3ZTZEo5/2hBdQAAAAAA+g==","upper_bound":"AVhlRTcwMzdB/wAAAAAAAAAA9w==","repeats":1},{"count":1107,"lower_bound":"AVhmAAAAAAAA+Q==","upper_bound":"AVhyUwAAAAAA+g==","repeats":1},{"count":1115,"lower_bound":"AVh1QTM2eWtI/wAAAAAAAAAA9w==","upper_bound":"AVlBQUw4T1pS/wAAAAAAAAAA9w==","repeats":1},{"count":1123,"lower_bound":"AVlDMgAAAAAA+g==","upper_bound":"AVlMNEswOENN/1pWODAAAAAA+w==","repeats":1},{"count":1131,"lower_bound":"AVlOWHpaenJB/1hHMXl0AAAA/A==","upper_bound":"AVlXTTIyTEw2/0pvAAAAAAAA+Q==","repeats":1},{"count":1139,"lower_bound":"AVlZRER3UzVZ/wAAAAAAAAAA9w==","upper_bound":"AVlrTFZ5a3BZ/20AAAAAAAAA+A==","repeats":1},{"count":1147,"lower_bound":"AVlrUEQ0dFNG/wAAAAAAAAAA9w==","upper_bound":"AVl3aER6UndQ/0IAAAAAAAAA+A==","repeats":1},{"count":1155,"lower_bound":"AVl3cDRob0Vz/3AAAAAAAAAA+A==","upper_bound":"AVoyZVhiAAAA/A==","repeats":1},{"count":1163,"lower_bound":"AVo1ZGdTZmFp/21mTEZlAAAA/A==","upper_bound":"AVpYbkVyNUwz/1V5ZUEAAAAA+w==","repeats":1},{"count":1171,"lower_bound":"AVphbTBZSFh0/3NLVGpkQwAA/Q==","upper_bound":"AVp1OXdCQXRs/2kAAAAAAAAA+A==","repeats":1},{"count":1179,"lower_bound":"AVp1UTc5UFcA/g==","upper_bound":"AWFBM2UAAAAA+w==","repeats":1},{"count":1187,"lower_bound":"AWFKQ29NAAAA/A==","upper_bound":"AWFUTGR4cWJv/zBBYQAAAAAA+g==","repeats":1},{"count":1195,"lower_bound":"AWFWWTluRWdT/2t5AAAAAAAA+Q==","upper_bound":"AWFmeFkAAAAA+w==","repeats":1},{"count":1203,"lower_bound":"AWFnZ2xjbDNQ/1VmeWxtAAAA/A==","upper_bound":"AWFzVmJpVUcA/g==","repeats":1},{"count":1211,"lower_bound":"AWFzb0pvQjhJ/3kyRgAAAAAA+g==","upper_bound":"AWI3WAAAAAAA+g==","repeats":1},{"count":1219,"lower_bound":"AWI4YTNsUFQA/g==","upper_bound":"AWJTUVdWeQAA/Q==","repeats":1},{"count":1227,"lower_bound":"AWJTeDNMWXRE/2R1UVEAAAAA+w==","upper_bound":"AWJpV1cAAAAA+w==","repeats":1},{"count":1235,"lower_bound":"AWJrMWdmbQAA/Q==","upper_bound":"AWJ4AAAAAAAA+Q==","repeats":1},{"count":1243,"lower_bound":"AWJ4VnhQMzRT/wAAAAAAAAAA9w==","upper_bound":"AWNIdk1YQ25Z/2p3YmlmNVYA/g==","repeats":1},{"count":1251,"lower_bound":"AWNSUktTRXpz/1c4REREaEwA/g==","upper_bound":"AWNtZHpZNUZl/zliWWIAAAAA+w==","repeats":1},{"count":1262,"lower_bound":"AWNzNzE3bkpQ/0NLbkEAAAAA+w==","upper_bound":"AWQAAAAAAAAA+A==","repeats":4},{"count":1270,"lower_bound":"AWQ4SDlibgAA/Q==","upper_bound":"AWRLSwAAAAAA+g==","repeats":1},{"count":1278,"lower_bound":"AWRVV3hYSkFx/2hkWVE0Y1oA/g==","upper_bound":"AWRuTDlSNGto/3c5SnIyegAA/Q==","repeats":1},{"count":1286,"lower_bound":"AWRzAAAAAAAA+Q==","upper_bound":"AWR5ejkwYlJm/2NPWQAAAAAA+g==","repeats":1},{"count":1294,"lower_bound":"AWR6UEdjWmYA/g==","upper_bound":"AWVEM3hMdDRs/2dma0d6AAAA/A==","repeats":1},{"count":1302,"lower_bound":"AWVFSE41TnZ4/0ZlOUtwTwAA/Q==","upper_bound":"AWVZAAAAAAAA+Q==","repeats":1},{"count":1310,"lower_bound":"AWVhAAAAAAAA+Q==","upper_bound":"AWVpRUkyNlc3/2RSdmFRMQAA/Q==","repeats":1},{"count":1318,"lower_bound":"AWVsAAAAAAAA+Q==","upper_bound":"AWYAAAAAAAAA+A==","repeats":1},{"count":1326,"lower_bound":"AWYwYgAAAAAA+g==","upper_bound":"AWY4RXB3cHlw/0ZwckNyOFYA/g==","repeats":1},{"count":1334,"lower_bound":"AWZEVk4yekFv/3oAAAAAAAAA+A==","upper_bound":"AWZRVQAAAAAA+g==","repeats":1},{"count":1342,"lower_bound":"AWZUV1VWbQAA/Q==","upper_bound":"AWZoAAAAAAAA+Q==","repeats":1},{"count":1350,"lower_bound":"AWZsOXlsZjI4/2x5NUVIAAAA/A==","upper_bound":"AWZ5MHZtQ01M/0U5WVQxaQAA/Q==","repeats":1},{"count":1358,"lower_bound":"AWZ5OGEAAAAA+w==","upper_bound":"AWdGd3NHAAAA/A==","repeats":1},{"count":1366,"lower_bound":"AWdIbHFEZFFa/2pGQUhFAAAA/A==","upper_bound":"AWdlbm0AAAAA+w==","repeats":1},{"count":1374,"lower_bound":"AWdnVjcAAAAA+w==","upper_bound":"AWd1TE5YNkpL/0UxagAAAAAA+g==","repeats":1},{"count":1382,"lower_bound":"AWd5AAAAAAAA+Q==","upper_bound":"AWg1YUd1SUpC/1cwdEFDOQAA/Q==","repeats":1},{"count":1390,"lower_bound":"AWg2MGdtUWh1/0hERQAAAAAA+g==","upper_bound":"AWhSS2NkazEA/g==","repeats":1},{"count":1398,"lower_bound":"AWhUcUZVcjVL/2IAAAAAAAAA+A==","upper_bound":"AWhnS0RuAAAA/A==","repeats":1},{"count":1406,"lower_bound":"AWhpTm1oTXFm/3E5Y2llM0MA/g==","upper_bound":"AWh6SUJuYXBw/2pPAAAAAAAA+Q==","repeats":1},{"count":1414,"lower_bound":"AWh6UnBURnF5/3k1TlkAAAAA+w==","upper_bound":"AWlDcnhMcWlN/3hrTHZoAAAA/A==","repeats":1},{"count":1422,"lower_bound":"AWlFUkRyUDFw/052ZmhGQlkA/g==","upper_bound":"AWlXQVQAAAAA+w==","repeats":1},{"count":1430,"lower_bound":"AWlZbGt2VGdX/2k4N0wAAAAA+w==","upper_bound":"AWlsAAAAAAAA+Q==","repeats":2},{"count":1438,"lower_bound":"AWlwYmFlZHIx/1oAAAAAAAAA+A==","upper_bound":"AWl2M1kyZWkA/g==","repeats":1},{"count":1446,"lower_bound":"AWl3AAAAAAAA+Q==","upper_bound":"AWo2cmx3UG1h/0IyAAAAAAAA+Q==","repeats":1},{"count":1454,"lower_bound":"AWo2dEcxc3RR/wAAAAAAAAAA9w==","upper_bound":"AWpVRFJ4SlYA/g==","repeats":1},{"count":1462,"lower_bound":"AWpVWEJMWk1H/zA5cm5VMnEA/g==","upper_bound":"AWpkdzJ6eHF3/0RwT1g1UUEA/g==","repeats":1},{"count":1470,"lower_bound":"AWpmcHo1Nno1/zJoU0cAAAAA+w==","upper_bound":"AWpubVpEcVQA/g==","repeats":1},{"count":1478,"lower_bound":"AWpzWmZRWW81/3RRQ2tTRwAA/Q==","upper_bound":"AWtCMQAAAAAA+g==","repeats":1},{"count":1486,"lower_bound":"AWtGMVh6c2dq/zZIAAAAAAAA+Q==","upper_bound":"AWtRNlpoVQAA/Q==","repeats":1},{"count":1494,"lower_bound":"AWtSeVYAAAAA+w==","upper_bound":"AWtoS0JWVHR1/21vMWNYQncA/g==","repeats":1},{"count":1502,"lower_bound":"AWtpQmN6UmlI/3AAAAAAAAAA+A==","upper_bound":"AWtyQ0RQcXE3/zJNSAAAAAAA+g==","repeats":1},{"count":1510,"lower_bound":"AWtzWlZCZ1hM/0R1cmJ0AAAA/A==","upper_bound":"AWw5RVF0YUZp/0R2VnpCUgAA/Q==","repeats":1},{"count":1518,"lower_bound":"AWxBZU1ReTNP/242ZWpsUAAA/Q==","upper_bound":"AWxSTAAAAAAA+g==","repeats":1},{"count":1526,"lower_bound":"AWxWAAAAAAAA+Q==","upper_bound":"AWxzRzFTZUxz/09rZk5yeAAA/Q==","repeats":1},{"count":1534,"lower_bound":"AWxzalhoUHF5/1Q5AAAAAAAA+Q==","upper_bound":"AW01SmJUcDhG/zFqAAAAAAAA+Q==","repeats":1},{"count":1542,"lower_bound":"AW02AAAAAAAA+Q==","upper_bound":"AW1QaHBLYXNJ/3kAAAAAAAAA+A==","repeats":1},{"count":1550,"lower_bound":"AW1QeWIAAAAA+w==","upper_bound":"AW1yNVYAAAAA+w==","repeats":1},{"count":1558,"lower_bound":"AW13cVV4MgAA/Q==","upper_bound":"AW4zRDREc2Qw/2EAAAAAAAAA+A==","repeats":1},{"count":1566,"lower_bound":"AW40TUkwZWZv/0xvMnRzTnQA/g==","upper_bound":"AW5PRUwAAAAA+w==","repeats":1},{"count":1574,"lower_bound":"AW5PU20ycHV4/1p5YzNvAAAA/A==","upper_bound":"AW5lRFVEejhY/0FuaEpLeQAA/Q==","repeats":1},{"count":1582,"lower_bound":"AW5oajVpAAAA/A==","upper_bound":"AW54RGVmdjJh/3pZYktNSgAA/Q==","repeats":1},{"count":1590,"lower_bound":"AW54eUJJSjFP/0NXMkpNUgAA/Q==","upper_bound":"AW83cGNxdTdW/3pjUktxAAAA/A==","repeats":1},{"count":1598,"lower_bound":"AW84N2VoQldM/3p0NAAAAAAA+g==","upper_bound":"AW9PWlJvSgAA/Q==","repeats":1},{"count":1606,"lower_bound":"AW9UMFptAAAA/A==","upper_bound":"AW9qeHNTNURN/zMAAAAAAAAA+A==","repeats":1},{"count":1614,"lower_bound":"AW9tUnJ3RVVU/3FOUEliAAAA/A==","upper_bound":"AW96cmhWR1VV/2ZrAAAAAAAA+Q==","repeats":1},{"count":1622,"lower_bound":"AXAAAAAAAAAA+A==","upper_bound":"AXA3UFhoUGtG/2IzAAAAAAAA+Q==","repeats":1},{"count":1630,"lower_bound":"AXBDQ3kwAAAA/A==","upper_bound":"AXBpVzVkcHc3/1dpa0VBUEsA/g==","repeats":1},{"count":1638,"lower_bound":"AXBqdEFvUFB2/zAAAAAAAAAA+A==","upper_bound":"AXB4OGozRUw3/2dxSUoyAAAA/A==","repeats":1},{"count":1646,"lower_bound":"AXB5b29iS2FK/zlSREFVUQAA/Q==","upper_bound":"AXEzaDJyMlpN/2tUWU4AAAAA+w==","repeats":1},{"count":1654,"lower_bound":"AXFEWGM5dmlL/0hqek5HAAAA/A==","upper_bound":"AXFTbXI5TTNJ/21Pd2NzUgAA/Q==","repeats":1},{"count":1662,"lower_bound":"AXFUNU1SME1Y/zlkUVpWVUYA/g==","upper_bound":"AXFwUQAAAAAA+g==","repeats":1},{"count":1670,"lower_bound":"AXFwWnRlcnVm/1VQeHRGZHEA/g==","upper_bound":"AXIzAAAAAAAA+Q==","repeats":1},{"count":1678,"lower_bound":"AXI1OTRJU25k/zQ4WVAAAAAA+w==","upper_bound":"AXJVVkwAAAAA+w==","repeats":1},{"count":1686,"lower_bound":"AXJYUk56MUx6/zMyAAAAAAAA+Q==","upper_bound":"AXJvRXNrMENL/2o1RlhCAAAA/A==","repeats":1},{"count":1698,"lower_bound":"AXJvbk9QeHll/wAAAAAAAAAA9w==","upper_bound":"AXMAAAAAAAAA+A==","repeats":6},{"count":1706,"lower_bound":"AXMxZgAAAAAA+g==","upper_bound":"AXNBNnhocGU1/2JRMFBHakMA/g==","repeats":1},{"count":1714,"lower_bound":"AXNCMAAAAAAA+g==","upper_bound":"AXNMAAAAAAAA+Q==","repeats":1},{"count":1722,"lower_bound":"AXNOAAAAAAAA+Q==","upper_bound":"AXNWWHZhVAAA/Q==","repeats":1},{"count":1730,"lower_bound":"AXNXQzF5Q1IA/g==","upper_bound":"AXNoTUF2AAAA/A==","repeats":1},{"count":1738,"lower_bound":"AXNqeGkwNXl5/0Njbk1CRHQA/g==","upper_bound":"AXN4dlp4UE5J/01qbDVKAAAA/A==","repeats":1},{"count":1746,"lower_bound":"AXQAAAAAAAAA+A==","upper_bound":"AXRDc0p6YlV3/zhlbQAAAAAA+g==","repeats":1},{"count":1754,"lower_bound":"AXRDdlkAAAAA+w==","upper_bound":"AXROAAAAAAAA+Q==","repeats":1},{"count":1762,"lower_bound":"AXRRVU4AAAAA+w==","upper_bound":"AXRkSjEAAAAA+w==","repeats":1},{"count":1770,"lower_bound":"AXRkYm9sUUlX/0FTVFJrUAAA/Q==","upper_bound":"AXRuUAAAAAAA+g==","repeats":1},{"count":1778,"lower_bound":"AXRvAAAAAAAA+Q==","upper_bound":"AXR5bVFpZzVV/wAAAAAAAAAA9w==","repeats":1},{"count":1786,"lower_bound":"AXUAAAAAAAAA+A==","upper_bound":"AXU2TEJDS1RX/0ZHTjFoAAAA/A==","repeats":1},{"count":1794,"lower_bound":"AXU5enBSSQAA/Q==","upper_bound":"AXVOOWtrVUd6/255SgAAAAAA+g==","repeats":1},{"count":1802,"lower_bound":"AXVQRmtma3dw/zJ2SGZaAAAA/A==","upper_bound":"AXVWRFQxS3oA/g==","repeats":1},{"count":1810,"lower_bound":"AXVXUwAAAAAA+g==","upper_bound":"AXVsTnVJUGUz/05oVXMAAAAA+w==","repeats":1},{"count":1818,"lower_bound":"AXVtdQAAAAAA+g==","upper_bound":"AXV5bFpuYzV1/wAAAAAAAAAA9w==","repeats":1},{"count":1826,"lower_bound":"AXV6aTVXTAAA/Q==","upper_bound":"AXZGSUtkZWxi/2Q5OG53AAAA/A==","repeats":1},{"count":1834,"lower_bound":"AXZIOAAAAAAA+g==","upper_bound":"AXZhVVVyTlV4/wAAAAAAAAAA9w==","repeats":1},{"count":1842,"lower_bound":"AXZkAAAAAAAA+Q==","upper_bound":"AXZxZks5VUVG/3NEaWkAAAAA+w==","repeats":1},{"count":1850,"lower_bound":"AXcAAAAAAAAA+A==","upper_bound":"AXdCAAAAAAAA+Q==","repeats":1},{"count":1858,"lower_bound":"AXdCYzQAAAAA+w==","upper_bound":"AXdMS1VCYW5I/0JNUGZSAAAA/A==","repeats":1},{"count":1866,"lower_bound":"AXdNS1dPdQAA/Q==","upper_bound":"AXdiUmJUN2MA/g==","repeats":1},{"count":1874,"lower_bound":"AXdmSFMzZFZ0/wAAAAAAAAAA9w==","upper_bound":"AXd4AAAAAAAA+Q==","repeats":1},{"count":1883,"lower_bound":"AXd4OUJ1dVJw/2N1QXhVTgAA/Q==","upper_bound":"AXgAAAAAAAAA+A==","repeats":7},{"count":1891,"lower_bound":"AXgzTkJVaW5P/1BnQ1FzOQAA/Q==","upper_bound":"AXhEaGt2Rnlp/2dDWgAAAAAA+g==","repeats":1},{"count":1899,"lower_bound":"AXhIS0RrekJ3/2ZNaVRTAAAA/A==","upper_bound":"AXhoM1dWZUpt/3hjeVI5AAAA/A==","repeats":1},{"count":1910,"lower_bound":"AXhoRDkzAAAA/A==","upper_bound":"AXkAAAAAAAAA+A==","repeats":5},{"count":1918,"lower_bound":"AXkwUnZ6aWVK/1g3AAAAAAAA+Q==","upper_bound":"AXlFM3lOUwAA/Q==","repeats":1},{"count":1926,"lower_bound":"AXlGMDkxAAAA/A==","upper_bound":"AXlUVmZSZFpx/3hVAAAAAAAA+Q==","repeats":1},{"count":1934,"lower_bound":"AXlWUkVDbXBX/0NFWGZ4MnEA/g==","upper_bound":"AXlrN2phY1lP/1pWczE2dAAA/Q==","repeats":1},{"count":1942,"lower_bound":"AXltOUphVFU0/2sAAAAAAAAA+A==","upper_bound":"AXl6YTV4TDdu/2lobQAAAAAA+g==","repeats":1},{"count":1950,"lower_bound":"AXoAAAAAAAAA+A==","upper_bound":"AXpJTlRvN1Za/0tacAAAAAAA+g==","repeats":1},{"count":1958,"lower_bound":"AXpJZkNTYmwA/g==","upper_bound":"AXpaWVVPSzJz/3g3AAAAAAAA+Q==","repeats":1},{"count":1966,"lower_bound":"AXpiAAAAAAAA+Q==","upper_bound":"AXpmNnpoUHlt/3A2AAAAAAAA+Q==","repeats":1},{"count":1974,"lower_bound":"AXpnZmUAAAAA+w==","upper_bound":"AXp3SFQ3eWg5/2dlVwAAAAAA+g==","repeats":1},{"count":1977,"lower_bound":"AXp4WG96UDM0/2k2ekVkZDkA/g==","upper_bound":"AXp5bHNwV3Bk/0ZhAAAAAAAA+Q==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,2,1,1,0,2,0,1,3,0,0,2,1,0,0,0,0,0,2,1,0,0,0,0,1,1,2,0,1,1,0,5,2,2,0,0,1,1,1,1,3,1,4,0,1,3,1,1,2,0,0,0,0,1,1,1,0,1,1,0,1,1,2,0,1,2,1,0,1,0,0,0,0,0,1,2,1,2,3,1,2,2,0,0,1,1,1,0,0,0,1,0,2,0,1,1,0,1,1,1,1,0,3,0,4,1,2,1,2,1,1,1,1,2,1,0,0,0,2,3,1,1,1,0,0,1,3,1,1,1,0,1,2,0,2,2,0,1,1,0,2,0,1,1,1,0,1,0,1,1,1,2,1,1,2,1,1,2,0,1,2,4,0,0,0,1,0,2,2,2,3,1,1,1,4,8,2,0,2,0,2,0,1,3,2,0,5,3,1,1,1,2,1,0,0,0,1,1,2,1,1,1,0,1,0,2,1,1,0,1,0,1,0,2,1,0,0,0,1,1,1,2,0,1,4,1,2,0,0,0,1,1,1,2,0,1,1,1,2,1,1,2,0,1,1,0,1,2,0,0,0,1,1,1,1,1,2,1,0,1,0,5,3,0,0,1,0,1,0,3,3,0,1,1,1,1,1,0,0,0,0,1,0,1,0,1,0,0,0,0,1,2,1,0,1,8,1,1,0,0,1,2,0,0,1,1,3,0,5,0,2,0,2,0,1,1,3,0,3,0,1,2,1,1,1,2,0,1,0,2,0,1,3,0,1,0,3,1,0,3,0,5,2,1,2,0,0,4,1,0,3,0,1,2,0,0,0,0,1,1,0,4,0,1,1,1,1,0,3,1,1,0,0,10,2,0,1,0,0,0,2,0,3,1,2,1,0,0,2,0,0,0,0,2,1,2,1,1,2,5,1,1,2,3,2,0,3,3,0,0,1,2,0,3,1,1,1,1,3,0,1,3,2,1,0,1,2,1,1,2,1,0,1,3,2,1,0,0,0,1,1,1,1,0,1,1,2,2,0,2,2,0,0,0,1,2,1,0,1,0,0,1,0,2,2,1,4,0,0,0,1,2,1,0,1,0,1,0,0,1,2,0,1,3,1,2,0,2,0,0,1,1,1,1,1,1,1,1,0,1,1,0,1,1,2,1,0,0,1,1,2,1,1,0,1,1,1,2,2,0,0,0,0,0,0,0,3,3,0,2,0,0,1,1,0,1,3,2,1,1,1,0,0,0,1,1,0,0,2,3,1,1,0,0,2,0,0,0,0,1,1,2,2,1,0,0,2,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,1,2,0,1,0,2,1,0,1,2,1,0,1,1,1,4,0,1,1,2,1,2,2,2,4,1,0,2,0,3,0,1,3,1,0,0,2,0,1,2,1,0,0,0,0,1,0,1,1,1,2,2,3,1,0,1,1,0,2,0,0,0,0,0,0,0,1,1,2,0,1,0,1,0,5,0,0,2,1,2,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,1,1,0,2,0,2,1,0,0,2,2,0,0,0,0,0,2,2,1,1,0,1,0,1,2,1,0,2,0,1,0,0,2,4,2,2,1,0,0,2,1,0,0,0,3,1,0,2,3,0,0,0,1,1,0,0,0,0,0,2,0,1,0,1,0,2,0,1,2,1,0,0,1,1,1,1,1,3,2,0,1,0,2,0,1,2,1,0,0,1,1,1,3,0,1,2,0,0,0,0,0,0,3,0,2,0,0,2,0,0,0,0,1,1,1,0,1,0,0,1,0,0,1,1,0,0,2,1,1,1,1,0,0,2,1,0,1,3,2,2,0,0,0,1,1,0,0,2,0,2,1,2,0,1,1,2,0,0,2,0,1,1,1,2,0,0,0,3,0,1,2,1,2,1,0,3,0,0,1,0,0,2,1,1,1,0,0,1,0,1,0,2,0,2,0,2,1,0,1,1,2,0,0,1,2,1,1,2,1,0,1,4,0,2,1,0,1,0,0,1,0,1,4,1,1,0,2,1,1,2,0,0,0,0,1,2,0,0,3,0,1,2,4,0,3,0,2,2,1,1,1,1,4,3,0,2,1,0,2,0,1,3,1,1,2,1,0,2,0,1,1,1,1,0,1,3,0,1,2,0,0,0,1,0,0,0,3,0,3,0,0,0,1,1,1,2,1,3,0,0,2,1,0,0,2,1,1,2,0,1,4,0,0,0,0,0,3,0,2,2,1,1,1,0,0,2,0,1,1,1,1,0,2,1,1,0,0,0,1,0,0,0,1,1,1,1,0,0,1,2,0,1,0,0,1,1,1,1,1,0,0,0,1,2,0,1,0,0,3,1,1,0,0,1,1,0,0,2,0,1,2,1,1,0,0,0,0,0,2,2,0,0,1,1,0,1,1,1,0,0,0,1,0,0,0,0,2,2,4,1,0,0,0,0,0,2,1,0,0,0,0,1,1,1,1,1,2,0,2,1,0,0,0,0,0,1,0,1,1,1,5,1,1,0,0,1,1,0,0,1,0,2,3,0,1,1,0,0,1,0,0,2,0,0,0,1,1,0,1,0,1,5,0,0,4,0,2,1,1,2,1,0,3,1,2,2,0,5,1,1,2,3,0,2,1,0,0,1,1,1,1,0,0,0,1,0,0,2,2,1,1,1,2,2,0,2,0,3,0,2,0,0,0,1,0,1,1,2,1,0,1,2,3,0,0,0,2,1,0,2,0,0,1,2,0,1,0,0,0,0,1,0,1,3,0,0,0,0,0,1,1,0,0,1,0,2,1,1,1,1,2,0,1,2,1,0,0,2,0,2,0,2,0,2,0,2,1,0,0,3,1,1,0,0,1,1,2,2,1,1,1,0,1,0,2,0,1,2,1,0,1,0,1,0,1,1,0,3,6,4,0,0,0,1,0,0,2,1,1,1,1,1,3,1,0,2,1,2,2,0,1,0,1,1,0,2,2,1,1,1,0,2,2,1,2,2,1,0,0,2,0,0,0,1,1,1,1,1,2,1,1,1,0,3,0,1,1,2,0,1,1,1,2,0,1,1,2,1,1,1,2,1,2,0,2,1,0,0,1,0,0,1,0,2,2,2,1,0,1,1,0,1,1,1,0,1,4,0,0,2,2,2,1,0,2,1,2,1,1,4,1,3,0,1,0,0,0,3,0,0,1,0,2,4,2,2,0,0,0,0,1,0,1,1,1,1,1,1,1,0,0,1,5,1,2,0,0,0,1,1,1,1,1,0,2,1,1,2,0,0,1,1,1,0,1,1,2,0,1,2,0,0,0,2,0,0,1,1,0,3,0,1,3,2,0,0,1,1,0,1,1,1,0,1,0,1,4,0,1,2,0,1,3,1,1,0,0,0,2,1,0,1,2,1,3,1,0,2,0,0,1,0,2,2,1,1,1,0,1,1,3,1,1,1,0,0,2,1,1,1,0,0,1,0,1,0,0,2,1,2,1,0,0,1,3,2,0,1,1,1,2,0,0,1,4,1,3,0,1,1,1,1,2,0,1,1,0,0,0,1,0,3,0,3,2,0,1,1,2,2,2,1,0,0,1,0,2,0,2,0,0,0,1,3,1,1,0,0,2,0,1,1,2,1,1,0,2,0,1,2,1,1,3,0,0,1,1,1,0,1,1,1,0,1,2,1,2,0,4,1,1,2,2,1,2,0,3,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,1,1,0,0,1,2,0,2,0,0,1,0,0,1,0,0,1,1,3,4,2,0,0,0,0,0,1,0,0,1,1,0,3,2,0,1,2,1,1,0,0,0,1,1,1,0,0,0,1,1,2,0,1,1,1,1,0,1,1,1,1,1,3,0,1,0,0,1,1,0,1,2,2,3,0,5,1,2,1,0,0,3,2,2,1,2,0,0,0,2,2,2,1,1,0,0,0,0,1,2,1,1,3,2,2,0,0,3,1,2,1,1,2,0,1,2,0,1,2,1,0,4,2,2,0,0,1,0,1,1,2,1,0,0,0,2,0,3,2,0,3,1,0,4,0,0,1,1,0,4,0,0,0,2,0,2,3,2,3,0,0,0,0,1,0,1,0,1,0,2,1,2,2,0,1,0,0,1,1,1,2,1,0,0,2,1,2,1,0,1,9,0,0,1,0,0,0,0,2,3,2,2,2,0,0,0,1,1,0,1,1,1,0,1,2,1,0,0,1,1,0,2,1,0,1,4,0,1,1,3,0,2,1,2,1,0,1,1,1,0,1,2,1,1,1,0,1,2,0,1,1,3,3,1,1,0,3,0,0,3,0,2,1,0,0,1,0,0,0,1,1,0,3,2,1,4,1,2,2,0,2,1,1,0,0,2,2,3,0,3,1,0,1,0,1,1,1,0,0,0,0,0,2,1,0,0,0,1,0,3,2,1,1,0,0,1,0,0,0,1,2,1,1,0,0,0,0,2,0,0,0,0,0,2,1,3,0,0,1,1,2,1,1,0,0,0,2,1,0,0,0,0,3,0,2,2,0,0,0,1,1,1,0,0,0,1,0,1,2,2,1,0,2,0,1,1,1,1,1,0,0,0,0,0,0,1,1,2]},{"counters":[1,0,1,3,2,1,0,3,0,0,0,1,0,0,1,0,0,1,3,0,1,0,1,1,1,0,0,1,0,0,2,2,1,0,0,3,2,1,0,0,2,0,2,1,0,0,2,0,2,0,0,1,2,0,1,1,0,2,1,0,0,2,2,3,2,0,2,0,2,0,0,0,0,1,1,1,3,0,1,0,1,0,0,1,1,0,0,1,0,0,3,1,2,1,0,1,1,0,1,0,3,2,1,2,1,1,1,2,0,0,0,1,2,1,0,0,2,1,2,0,1,2,1,1,1,0,0,1,0,0,1,1,0,1,0,2,2,1,1,5,0,1,1,1,0,1,3,0,1,1,1,0,1,2,3,0,2,4,1,0,4,1,2,0,1,0,1,0,2,2,1,0,2,0,1,2,2,1,2,3,1,1,2,0,1,0,2,1,0,2,0,1,0,0,1,0,0,1,1,2,4,1,1,1,2,0,0,0,1,2,3,1,0,1,1,0,0,1,0,1,0,1,1,1,0,1,0,0,0,3,0,1,0,0,1,0,4,3,1,7,0,3,0,1,1,1,2,3,0,1,0,1,0,0,1,0,0,0,1,1,3,1,1,0,1,1,4,0,1,1,2,0,2,2,1,1,3,0,2,2,0,1,0,0,2,0,1,3,1,0,0,0,0,2,0,1,1,0,1,1,2,0,0,1,0,0,0,1,0,1,2,0,4,0,0,1,0,1,3,1,2,2,0,1,0,3,0,1,1,0,4,1,0,0,1,1,3,0,1,4,1,0,0,0,3,0,1,1,1,2,1,0,1,3,1,0,1,2,0,3,1,1,0,0,0,1,1,1,0,0,0,0,5,4,2,0,3,1,3,0,0,1,1,1,1,3,0,0,0,2,1,0,1,0,0,2,1,0,5,0,1,0,1,1,1,0,0,0,2,0,1,0,0,2,0,0,1,0,0,2,2,2,1,0,1,1,0,0,1,0,0,0,2,0,0,2,1,1,0,0,1,1,0,4,0,1,2,1,0,2,0,0,1,1,2,1,1,4,2,0,0,0,0,0,1,0,2,1,1,0,1,1,2,0,1,3,1,0,0,0,0,1,2,2,0,1,1,4,0,0,0,2,1,2,0,1,0,0,0,1,1,2,1,0,2,1,2,2,0,1,1,0,3,0,3,1,3,0,1,1,1,2,0,1,2,0,4,3,6,0,1,1,0,1,2,3,0,1,2,0,0,1,0,0,3,0,0,0,0,2,0,2,1,4,0,0,1,0,1,0,0,0,1,2,2,0,0,1,0,2,1,0,0,0,1,1,0,0,1,1,2,1,3,2,0,2,3,2,1,1,1,0,0,1,1,0,1,1,3,1,0,2,1,0,0,0,0,3,2,1,0,1,0,0,0,0,0,1,1,2,0,0,4,2,1,1,1,0,0,1,0,0,0,2,3,1,0,1,0,0,1,3,0,0,2,1,0,1,0,4,0,0,1,1,1,0,0,2,2,1,0,2,1,0,2,3,1,1,0,0,1,1,1,1,1,2,0,0,0,1,0,1,1,1,1,0,1,1,1,1,0,1,1,2,1,0,0,0,2,3,1,0,0,2,0,2,2,1,0,1,0,1,1,2,1,0,0,1,0,1,1,2,0,1,4,0,1,2,0,1,0,2,1,0,0,0,1,1,1,2,1,1,1,1,1,0,0,0,1,2,2,0,1,1,2,0,3,0,2,1,0,0,2,2,1,0,1,0,3,1,0,2,1,2,2,0,1,1,0,1,2,0,0,6,1,1,0,0,4,1,0,0,1,0,2,0,2,0,1,0,2,0,2,0,1,0,0,0,3,1,1,1,0,0,0,2,0,0,1,1,5,2,1,2,0,0,1,1,1,1,1,0,1,0,0,3,2,0,1,2,1,1,2,0,0,1,0,1,1,0,1,2,0,0,2,0,0,1,2,1,0,0,2,4,2,1,3,0,0,0,0,0,3,0,2,2,1,0,1,0,1,1,1,0,0,0,1,1,2,2,0,0,0,2,1,0,2,1,1,0,0,1,1,0,2,0,1,1,2,2,1,0,1,1,0,1,1,0,1,0,3,2,0,2,1,0,3,1,1,1,2,0,1,0,0,0,1,0,1,3,1,0,4,1,1,1,1,1,0,1,2,0,1,2,0,0,0,2,3,1,1,0,0,1,2,3,0,2,0,1,0,1,0,1,2,4,1,0,1,2,2,1,2,0,1,1,1,1,0,0,1,2,0,1,3,0,1,4,2,1,1,1,2,1,1,0,1,2,0,3,1,0,1,4,1,0,1,0,7,1,1,1,0,0,0,1,1,0,1,1,1,6,0,1,0,1,0,0,3,2,1,1,1,0,3,0,2,2,0,2,2,0,3,1,1,0,0,2,0,1,1,1,1,1,3,1,0,0,0,1,0,1,1,0,0,0,2,0,3,1,1,1,2,2,1,0,0,0,2,0,2,2,2,1,0,2,3,2,1,0,0,0,1,2,2,1,0,0,1,1,1,1,1,1,0,1,2,1,1,1,1,2,1,0,0,0,0,0,2,0,3,1,2,1,3,0,2,2,1,1,0,0,1,0,0,0,1,1,0,0,2,0,2,0,2,1,3,0,0,0,2,2,3,0,0,0,1,0,0,1,0,2,4,0,1,0,0,1,1,1,2,1,0,0,2,0,3,2,0,2,0,3,1,1,2,1,0,0,0,1,1,0,2,1,0,0,0,0,1,1,1,0,0,0,1,0,0,1,0,3,1,1,1,0,2,2,1,0,0,1,3,2,2,0,2,3,1,1,0,2,0,1,2,3,2,2,0,0,1,0,1,0,1,0,0,0,0,0,2,0,0,2,1,2,0,0,1,1,1,2,1,0,1,2,2,1,0,0,0,2,1,0,1,1,1,0,1,1,2,0,1,0,1,1,0,2,0,0,0,0,0,1,0,1,2,0,2,1,1,0,1,1,0,2,1,1,0,0,1,0,0,0,2,1,0,0,0,1,0,0,1,1,0,0,1,3,1,2,0,0,4,1,1,0,1,2,1,2,0,2,2,1,1,1,2,2,0,0,1,1,1,1,0,1,1,1,1,1,2,2,0,0,0,0,2,1,0,0,2,1,0,1,1,0,0,0,0,0,0,1,0,1,0,1,0,2,1,1,0,1,0,0,0,2,1,2,1,2,1,0,1,0,3,2,1,1,0,0,1,0,0,2,2,0,0,0,0,2,0,0,1,1,0,0,1,0,1,0,1,0,0,2,2,1,1,3,1,2,1,0,1,0,0,0,1,0,3,3,2,0,2,1,0,1,0,1,2,0,1,0,2,2,1,0,5,0,0,0,0,0,0,1,1,0,0,0,1,0,2,3,0,1,0,0,1,3,0,2,1,2,3,0,0,9,2,2,1,2,0,1,0,0,1,0,3,2,0,2,1,2,1,1,1,0,0,1,1,0,2,2,1,1,0,1,1,2,2,1,1,1,2,0,3,2,0,0,1,2,2,0,1,2,1,0,3,1,0,1,1,0,0,0,1,2,0,1,1,1,2,1,2,0,1,1,2,0,1,1,2,0,0,1,1,1,0,0,2,1,0,0,0,2,2,0,2,2,2,0,1,1,1,3,0,1,0,0,0,0,0,0,2,0,1,1,1,1,2,2,1,2,0,1,0,1,1,1,1,0,1,1,3,0,2,1,3,0,2,2,0,0,0,0,1,1,0,1,1,0,3,0,2,1,1,0,1,1,0,1,0,5,0,1,2,0,1,0,0,1,1,1,2,1,1,3,0,0,2,3,0,1,1,2,2,0,3,1,0,1,0,6,2,1,0,0,0,2,1,1,1,0,3,0,0,0,3,1,2,1,2,0,1,2,1,0,0,1,0,1,3,0,1,0,2,1,2,0,1,1,0,1,1,0,1,0,0,0,0,3,3,0,0,3,3,0,0,2,0,0,1,0,2,0,0,0,1,0,4,0,3,2,0,2,0,2,1,4,1,0,1,0,0,0,1,0,1,0,0,3,0,3,0,2,2,0,0,2,1,1,0,1,0,1,2,1,0,1,0,1,1,3,0,0,1,4,3,0,1,1,0,0,0,1,2,0,2,3,0,3,1,0,0,1,1,1,0,2,1,1,1,1,0,0,1,2,0,0,2,1,1,1,0,1,0,0,1,0,2,0,1,0,0,0,1,0,3,0,0,1,2,0,0,1,0,0,1,0,2,1,1,1,1,1,2,1,1,1,0,1,0,0,0,0,4,2,1,0,0,2,0,4,1,0,3,2,0,1,1,1,2,2,1,2,1,3,3,0,2,0,5,2,1,2,3,2,2,2,2,2,3,1,0,0,0,1,0,1,0,3,3,2,3,1,0,1,0,4,2,3,2,0,1,2,0,1,6,0,0,1,0,1,0,1,1,2,1,0,0,0,1,0,2,1,0,0,0,2,0,0,2,1,1,1,1,0,2,0,0,2,0,1,0,1,1,0,0,0,0,1,0,0,1,0,1,0,2,2,0,0,0,2,0,1,2,1,0,2,3,0,0,0,2,1,0,2,1,2,0,1,1,2,0,0,0,0,0,0,0,0,2,1,0,2,0,1,2,0,1,3,1,1,0,1,0,1,1,0,0,0]},{"counters":[0,0,2,1,2,0,0,2,1,0,2,2,4,1,0,0,3,0,1,0,1,2,4,1,1,1,2,1,1,2,0,2,0,0,1,0,2,1,2,0,1,0,1,0,0,4,0,2,0,1,1,2,0,2,0,1,3,1,1,1,2,2,0,0,1,3,2,2,0,1,1,3,0,1,2,1,0,1,3,3,0,1,3,1,1,1,2,1,1,0,0,3,0,3,1,1,0,3,1,6,1,1,4,2,1,1,1,2,1,0,4,1,1,1,0,0,0,1,0,0,0,0,0,1,1,0,3,1,1,2,1,3,2,1,0,2,1,2,2,1,1,0,0,1,0,0,0,2,2,0,0,1,1,0,0,1,1,2,0,0,1,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,3,1,1,0,1,2,1,0,3,1,0,0,2,0,0,1,0,3,1,1,0,1,0,3,0,5,1,0,1,2,0,2,2,0,0,2,0,0,0,0,2,1,0,2,1,1,1,0,1,0,2,0,2,1,2,4,0,0,0,0,0,3,0,1,0,1,1,1,1,0,0,0,0,1,0,0,1,1,2,1,1,1,1,0,1,1,3,0,0,0,1,0,1,2,0,1,0,1,0,1,2,0,1,3,0,3,0,0,3,1,1,1,1,0,0,2,1,0,1,1,0,1,2,4,1,0,2,2,0,1,0,0,1,1,1,2,1,0,0,2,0,0,0,1,0,1,0,3,0,0,0,1,2,2,1,1,1,0,1,1,2,1,1,2,0,1,1,0,0,2,0,1,0,1,0,2,0,1,0,1,4,4,1,0,0,0,3,0,2,0,1,0,2,0,2,1,0,0,0,0,1,1,1,2,2,0,0,3,0,0,0,1,0,0,2,1,0,0,0,0,0,1,0,1,0,0,1,1,0,3,1,2,2,1,1,0,0,0,1,1,1,1,0,1,0,0,3,0,1,0,2,0,0,3,4,2,0,1,1,0,1,0,0,1,1,2,0,1,2,1,1,0,0,2,0,1,1,1,0,0,1,0,0,1,0,1,0,1,2,3,1,0,1,2,2,1,0,1,0,0,1,0,2,3,0,0,0,1,0,1,0,2,1,2,0,0,0,0,1,2,3,3,2,1,0,1,0,2,0,0,1,0,3,0,0,1,1,2,2,0,2,0,3,1,3,1,2,1,2,0,0,1,1,2,0,0,1,1,0,1,2,1,0,0,0,0,0,2,0,1,1,1,0,1,2,0,0,2,1,0,1,3,1,1,1,0,1,1,0,0,1,0,0,0,1,1,2,1,0,1,0,1,2,1,4,1,3,2,0,2,0,0,1,0,1,4,2,1,1,1,3,1,1,1,1,1,3,0,0,0,2,0,1,1,0,2,1,0,0,0,1,1,2,1,0,2,0,0,0,0,0,1,1,1,2,1,0,2,1,1,1,2,0,2,1,0,0,0,1,1,1,1,0,0,0,1,0,2,0,1,0,2,0,0,0,3,1,1,1,3,4,1,1,1,0,1,1,2,1,3,1,0,7,1,1,2,0,3,0,0,2,1,0,0,1,3,4,1,0,0,1,0,3,1,0,2,2,1,0,2,1,0,1,0,2,0,1,0,2,1,2,0,0,1,1,2,0,1,0,2,1,0,3,0,0,0,1,0,1,0,7,0,1,1,2,2,1,0,1,2,3,1,2,0,2,1,0,0,0,1,0,0,0,0,0,0,0,2,1,0,2,0,3,0,2,1,0,2,1,0,0,3,2,1,0,0,3,2,3,2,1,1,0,0,1,4,0,1,3,1,2,3,1,1,1,0,0,1,2,1,0,1,0,3,1,0,1,1,0,1,0,1,0,1,0,2,0,6,0,0,0,1,2,2,0,2,1,1,0,1,0,0,1,2,0,1,0,3,1,5,1,0,1,0,0,1,1,1,2,0,1,1,0,1,0,3,2,1,1,1,0,0,1,0,0,1,1,0,2,2,1,1,1,0,2,1,0,2,0,1,1,1,1,2,0,0,0,2,2,0,1,0,0,0,1,4,1,0,2,0,0,1,1,1,0,0,1,1,0,0,2,4,1,3,1,2,0,2,1,0,2,0,0,1,0,0,0,0,1,0,1,0,5,3,0,0,0,1,5,1,0,2,1,1,1,1,1,0,0,2,1,2,1,1,3,0,0,2,0,1,1,1,0,2,0,3,1,0,1,1,0,1,1,0,0,2,0,1,2,2,1,0,0,1,0,1,1,0,1,2,0,0,2,1,4,0,2,0,1,0,0,2,1,1,1,0,0,1,1,0,1,0,2,1,0,1,1,0,0,1,2,0,1,3,1,0,0,1,1,1,1,0,1,0,1,0,2,0,0,2,1,0,0,2,0,0,0,0,2,1,2,1,0,1,1,2,1,4,0,1,1,1,2,2,1,0,1,0,2,2,0,2,2,0,3,1,1,0,1,0,0,0,2,3,1,0,1,1,0,1,3,1,0,1,1,1,1,1,0,0,2,0,0,2,3,1,6,0,0,0,0,0,0,1,0,2,0,0,1,0,3,3,2,2,0,0,0,1,0,1,2,2,1,1,0,0,0,2,0,1,0,2,3,2,3,0,7,1,0,2,3,0,0,1,2,0,0,1,0,2,0,0,0,1,1,1,0,1,2,0,1,1,0,1,1,0,2,0,0,2,2,1,1,0,2,0,0,1,0,0,0,1,1,1,3,1,3,1,0,1,3,1,1,0,0,0,2,4,2,0,0,3,2,3,0,2,0,0,1,0,1,0,1,2,1,1,0,0,1,1,1,0,1,2,0,2,2,0,2,0,2,1,0,1,2,2,0,1,1,3,0,0,1,2,0,3,1,1,0,2,1,2,2,4,2,4,2,6,1,0,0,1,0,0,1,1,2,0,1,0,0,1,2,1,0,1,0,2,0,2,0,1,1,2,2,1,3,1,1,1,1,1,2,0,5,3,1,0,1,1,0,1,2,0,2,0,1,2,2,1,0,1,0,0,2,0,1,0,2,0,1,0,2,1,1,1,2,1,1,2,0,0,0,0,2,0,0,0,0,0,0,2,0,0,1,3,2,0,1,0,0,2,0,1,0,1,1,1,1,0,0,0,2,1,2,1,6,0,1,1,1,1,1,1,0,1,2,0,1,1,1,1,3,1,1,4,2,1,0,0,1,2,1,0,1,1,2,1,0,0,1,2,1,3,0,0,0,0,1,1,2,1,1,0,0,3,1,2,1,1,4,4,0,2,3,1,0,0,1,0,0,2,2,2,1,0,2,0,1,1,3,2,0,1,1,0,1,2,0,2,1,0,2,1,2,0,1,0,1,0,0,0,2,1,4,0,1,2,2,2,1,1,0,0,0,4,1,0,0,2,1,0,1,3,0,0,0,1,0,1,0,2,0,1,0,0,3,0,0,2,0,0,1,2,0,3,0,0,2,2,0,1,2,1,1,1,0,3,1,1,2,1,0,0,5,1,1,0,1,0,1,2,0,1,1,0,3,1,1,0,1,2,1,0,2,0,2,2,0,1,3,0,1,1,1,1,0,1,1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,2,0,1,0,1,0,2,0,1,1,2,2,1,1,1,1,2,3,0,2,1,1,2,1,0,1,2,3,1,1,1,0,0,1,0,1,0,1,0,2,0,0,3,0,0,1,0,0,1,0,1,1,2,1,1,1,3,1,2,1,0,1,2,0,0,0,4,1,0,1,0,0,0,1,2,2,0,2,2,2,1,1,0,1,1,0,0,1,2,1,0,1,0,0,0,1,2,1,2,0,0,1,1,2,1,2,0,3,1,3,3,1,2,1,3,2,1,1,1,0,1,2,1,0,0,1,2,0,0,2,2,2,0,0,0,1,3,2,2,0,1,2,0,1,0,1,0,1,0,1,0,0,0,1,1,1,2,1,2,1,0,3,0,1,1,0,0,1,1,0,0,3,1,2,1,0,0,0,2,1,0,1,0,2,0,0,1,0,3,0,3,0,0,1,4,1,2,1,0,2,2,3,1,0,1,3,1,0,0,0,1,1,0,1,2,2,0,1,0,2,0,0,0,0,2,1,1,1,0,2,2,0,1,0,0,0,1,3,0,2,0,2,1,1,1,0,3,1,0,1,0,2,1,2,3,0,2,0,0,0,0,2,1,1,1,0,0,1,1,0,1,1,0,4,0,2,1,0,3,2,0,2,0,0,1,1,1,1,0,0,3,0,1,1,0,0,1,0,2,1,0,0,1,1,0,0,1,0,2,1,3,0,2,0,2,1,0,0,0,1,0,0,2,0,4,0,0,1,0,2,2,0,2,3,3,1,0,1,0,1,0,1,0,2,0,2,0,1,0,0,0,1,1,1,0,2,0,0,0,0,1,1,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,1,0,2,0,0,3,1,2,0,0,3,1,1,1,0,0,0,1,2,0,0,0,0,0,2,2,1,1,1,0,2,0,2,0,1,1,0,1,0,2,3,0,0,1,0,4,0,1,0,0,0,4,1,0,1,0,0,3,2,0,0,0,2,1,2,0,0,0,0,2,0,2,1,2,0]},{"counters":[1,0,1,0,1,0,0,0,1,1,0,1,4,1,1,1,1,0,1,1,0,0,1,0,1,1,1,2,0,1,1,0,1,0,0,2,2,2,2,1,1,0,2,0,1,4,2,1,2,1,1,2,0,2,1,2,2,0,0,2,0,1,1,2,0,0,1,1,0,0,0,0,1,2,1,0,0,1,1,0,3,1,1,1,1,0,0,1,0,1,1,0,1,1,2,0,1,1,4,2,1,2,1,1,0,1,1,0,2,2,0,0,1,1,0,1,1,0,0,1,0,1,0,0,1,1,3,1,0,2,0,2,1,2,0,3,2,1,0,0,1,1,1,0,0,1,1,1,1,0,1,0,2,1,0,2,1,3,1,1,2,1,2,4,1,0,2,0,1,0,1,0,2,1,1,2,2,1,2,0,1,0,2,1,3,0,0,0,1,0,0,0,3,1,4,1,1,0,3,1,0,2,0,1,1,1,1,2,0,3,0,1,1,0,3,1,1,1,0,0,1,3,0,2,0,0,0,2,1,1,1,1,1,1,1,0,3,2,0,0,0,0,0,3,1,5,2,0,5,1,1,2,0,0,2,1,0,2,1,1,0,1,0,1,1,0,2,0,1,1,2,1,1,0,1,2,1,0,0,3,0,0,0,0,0,0,2,1,3,1,0,4,1,2,1,0,2,1,1,0,0,2,3,0,0,2,0,0,0,0,1,2,1,1,0,0,2,0,0,1,0,1,1,1,1,0,0,0,1,1,0,0,3,0,2,0,0,0,1,0,2,0,1,0,0,1,2,1,0,0,2,5,0,0,2,1,0,3,0,3,0,1,0,0,0,2,2,1,1,1,0,1,0,1,1,0,1,0,1,1,2,2,0,1,1,0,1,1,0,0,2,0,0,0,0,1,1,0,0,2,0,0,0,0,1,1,1,0,0,1,1,0,4,1,2,4,2,2,0,3,4,0,0,1,0,1,3,1,2,0,0,0,1,1,2,1,0,0,1,0,0,0,1,1,0,4,3,1,1,0,0,2,2,0,1,0,0,1,1,0,0,0,9,0,0,1,1,0,2,0,5,0,1,0,0,0,1,1,3,2,1,2,0,0,2,2,3,1,2,1,1,0,1,2,0,0,0,0,0,2,1,2,0,2,2,0,0,2,2,3,0,1,1,1,2,1,0,0,1,1,1,6,0,0,2,0,2,3,1,0,2,1,1,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1,0,1,4,0,3,0,0,1,3,2,0,0,0,1,0,0,0,1,0,0,3,1,0,2,2,1,1,2,1,0,0,2,0,1,0,1,2,1,1,1,1,1,0,1,0,0,1,0,1,2,0,0,1,0,1,1,3,1,0,1,0,1,0,0,2,1,1,1,1,0,0,4,0,0,0,0,3,0,0,0,1,1,1,2,0,0,1,1,0,0,1,0,1,2,0,0,0,4,1,1,3,1,1,2,4,2,1,1,2,0,4,1,1,1,2,1,1,0,1,0,1,2,0,0,0,3,3,1,1,1,0,0,4,1,0,2,2,0,1,1,0,0,1,2,2,2,1,2,1,0,0,1,1,0,2,3,1,0,1,0,0,1,0,1,3,0,0,1,0,0,0,1,0,0,1,1,2,2,1,0,0,0,1,0,2,1,1,2,1,0,2,1,1,0,3,1,0,2,0,1,0,1,0,1,1,1,0,0,0,0,2,0,1,1,4,0,0,0,1,0,2,0,0,1,0,2,1,1,0,0,0,0,2,1,3,1,4,3,2,0,0,0,1,1,3,1,1,3,0,1,5,1,2,1,2,0,1,0,0,1,3,7,1,0,0,1,1,2,0,2,1,0,0,2,0,0,4,0,1,0,0,2,4,2,0,0,1,2,7,0,3,2,0,1,0,0,1,1,0,3,1,3,1,0,1,0,1,3,1,2,1,1,1,2,5,2,0,1,1,2,2,1,1,1,0,0,0,1,1,1,0,1,1,0,0,0,1,0,1,1,1,3,0,2,2,0,2,1,1,1,0,0,3,0,1,0,0,2,2,2,2,2,1,3,0,3,0,1,2,1,2,3,0,1,0,1,2,1,0,1,1,0,2,1,0,0,0,0,1,1,2,0,2,1,2,1,0,2,2,1,0,2,0,1,0,1,2,1,1,0,0,0,2,1,1,1,0,0,1,1,1,2,1,0,0,1,1,1,1,2,2,0,1,0,1,0,1,3,1,1,1,0,0,1,0,2,0,0,0,1,1,0,0,2,2,0,0,2,0,0,0,3,2,2,1,1,0,0,0,1,0,0,0,1,1,0,1,0,1,0,0,1,2,2,1,1,0,1,0,2,1,0,0,1,1,2,3,1,3,0,1,0,0,1,2,1,1,0,0,1,2,3,1,1,1,2,1,0,3,0,1,2,2,0,0,3,0,1,1,0,0,1,0,1,0,1,1,3,3,0,1,2,0,1,2,3,0,1,1,1,0,0,3,2,2,0,0,2,2,1,2,0,0,0,0,1,2,4,0,0,1,1,1,2,1,1,0,1,1,0,0,2,1,0,4,1,2,0,2,0,1,2,0,0,0,2,6,1,0,0,1,4,2,2,1,2,1,0,1,0,1,2,1,0,1,0,1,1,0,1,1,0,0,1,1,2,0,1,2,0,0,0,1,0,0,3,1,0,0,2,3,2,2,2,0,0,0,0,1,0,0,1,0,1,1,3,1,2,0,2,1,2,1,1,1,2,1,2,0,1,1,0,0,0,0,0,0,1,2,0,2,2,0,0,0,1,2,1,1,1,1,0,3,0,1,0,0,0,0,0,0,2,2,2,1,0,2,3,1,1,1,2,1,0,1,1,0,0,2,1,1,1,1,0,2,1,4,1,0,0,0,0,2,0,2,2,1,1,0,1,1,0,3,3,2,0,0,0,0,0,1,1,1,0,1,0,1,0,1,2,0,1,1,1,0,0,1,1,2,1,0,1,0,0,5,0,4,0,2,0,1,0,2,2,0,0,0,2,2,5,0,1,1,1,1,1,0,0,1,0,0,3,0,1,0,1,3,2,0,3,1,1,1,1,1,2,0,1,1,1,2,0,3,1,4,2,1,1,1,0,1,0,2,1,0,1,0,1,2,1,0,3,0,3,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,2,1,0,0,1,0,0,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,1,1,0,1,1,1,2,2,1,1,1,0,0,1,1,0,1,0,1,2,1,1,0,0,2,1,2,0,1,3,0,0,1,4,1,1,1,0,1,2,1,0,2,1,1,0,3,1,1,2,1,1,0,1,0,0,0,0,0,1,3,0,1,1,1,0,1,0,0,1,0,1,1,2,0,2,0,2,3,1,2,0,0,1,2,3,1,0,0,2,0,1,1,1,1,1,0,0,0,0,0,1,1,0,1,1,0,1,0,3,2,0,2,1,2,0,1,1,4,2,1,2,1,2,1,1,0,0,2,1,2,0,0,0,1,1,0,1,0,1,0,3,0,0,1,0,1,1,2,0,0,0,1,0,2,1,1,0,2,0,3,1,0,1,0,0,1,2,1,0,1,2,0,1,1,2,4,0,2,3,1,0,0,1,0,0,2,3,1,3,0,1,1,1,0,0,1,2,0,1,0,2,0,0,0,2,0,1,1,0,2,0,1,0,2,0,0,2,0,1,0,1,1,3,0,1,3,0,0,1,1,4,3,1,0,0,1,0,1,0,1,0,1,0,1,0,0,0,1,1,0,0,2,0,0,0,1,1,1,1,1,1,2,0,1,2,1,1,2,0,3,0,1,1,0,0,1,1,0,0,1,0,0,1,2,1,4,1,2,0,3,1,1,2,0,2,2,4,1,0,3,1,3,2,1,1,0,1,1,1,3,0,0,2,0,0,1,2,1,0,0,3,2,0,2,3,0,1,1,0,0,2,1,1,2,0,2,2,1,0,0,1,0,1,1,1,0,1,0,0,0,0,1,0,2,0,3,0,0,3,1,0,0,0,1,0,0,1,0,0,2,0,2,1,1,1,0,2,1,1,0,1,0,0,4,1,0,0,1,3,5,1,2,0,0,0,2,1,2,1,2,1,1,0,1,0,1,1,0,0,1,0,3,0,1,1,1,0,0,0,0,1,0,3,0,0,6,1,2,0,1,0,0,0,1,2,0,0,2,2,1,0,1,0,2,0,1,0,2,0,1,0,0,0,0,0,1,1,2,3,1,0,4,1,1,3,1,0,0,1,3,1,1,2,2,2,1,1,0,0,2,1,1,0,1,0,2,3,0,0,0,1,1,0,2,2,2,2,1,1,0,0,1,0,0,1,0,1,1,0,2,0,1,5,2,2,1,0,0,1,0,2,0,1,1,0,0,1,2,0,1,1,1,0,1,0,1,1,0,2,1,0,1,2,1,0,0,1,2,1,2,2,0,1,0,0,0,2,1,1,0,1,1,2,1,2,0,0,2,0,0,4,0,1,1,1,3,0,0,1,1,1,0,1,0,0,1,4,1,0,0,1,3,0,3,4,0,0,0,1,0,3,4,0,1,1,0,1,2,0,2,2,1,1,0,0,1,0]},{"counters":[1,0,2,1,0,0,0,1,1,1,1,1,1,1,1,1,4,0,1,2,2,1,1,0,0,0,4,1,1,3,1,2,0,0,2,1,1,1,2,2,2,0,1,1,0,1,1,0,1,0,0,1,2,0,0,1,3,0,0,3,0,1,0,1,1,1,2,1,0,2,2,0,1,0,0,1,0,0,1,1,4,1,1,2,2,1,1,1,1,1,0,0,2,4,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,2,1,0,1,0,1,1,2,1,1,1,0,0,1,0,4,1,0,1,1,2,1,0,2,1,0,0,1,3,1,1,0,2,3,2,0,0,1,2,2,1,1,2,0,0,1,0,1,0,1,0,1,0,0,1,0,1,3,1,1,1,0,1,2,1,0,6,0,1,0,1,0,0,1,1,1,0,3,1,0,1,2,1,0,2,1,2,0,0,0,1,1,1,2,1,2,1,3,0,1,0,3,0,1,2,0,1,2,1,0,3,1,1,0,0,0,0,1,0,0,2,0,0,0,1,2,0,0,1,2,1,1,0,1,1,0,1,2,0,1,1,1,2,0,0,0,2,1,1,0,0,1,1,2,4,3,0,1,1,2,0,0,0,0,0,0,1,1,2,0,2,1,0,1,1,1,2,2,2,2,1,2,1,2,3,1,0,1,0,1,4,0,2,1,0,1,1,1,3,1,2,5,0,0,0,1,0,1,2,1,1,3,1,2,0,1,0,2,2,1,1,1,0,3,0,0,1,1,0,1,1,1,0,1,1,0,0,1,0,2,1,1,0,1,1,1,1,1,0,0,3,1,0,0,2,0,0,0,0,2,2,0,0,0,1,0,1,4,1,4,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,1,4,0,0,3,2,0,3,1,0,0,0,1,2,0,0,0,0,0,2,1,1,3,0,2,2,1,0,0,1,3,1,0,2,1,1,0,0,1,0,0,0,0,1,1,1,2,0,0,1,4,0,1,1,1,1,1,2,2,7,3,2,2,2,0,1,1,0,2,1,1,2,0,0,0,0,0,1,2,0,0,2,0,1,1,1,1,1,0,1,0,2,0,2,1,1,3,0,4,1,1,1,0,8,1,0,3,3,0,3,1,1,3,0,4,2,1,0,1,1,0,0,3,0,1,0,3,1,0,0,2,0,2,2,0,0,0,2,1,1,0,2,0,2,1,2,3,4,0,2,0,0,1,0,3,1,1,1,1,1,1,0,1,1,1,2,1,0,2,0,0,0,3,1,2,1,1,0,0,0,1,1,0,1,1,0,0,1,1,1,2,1,3,0,3,3,1,0,1,1,0,0,3,1,0,1,1,2,2,1,0,0,1,0,2,0,1,1,0,2,0,1,5,0,0,2,0,0,0,1,0,0,1,0,2,3,0,0,0,0,2,0,1,0,1,1,0,2,0,0,0,0,1,1,3,1,2,0,2,0,2,0,1,1,2,1,0,2,3,0,1,1,0,3,0,1,0,3,1,0,0,0,2,1,0,0,2,1,0,1,1,3,1,2,1,2,2,0,2,1,2,1,3,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,1,3,1,0,0,0,1,0,1,1,0,1,0,0,0,1,0,2,3,3,7,0,0,1,0,0,2,1,2,2,1,4,0,3,0,0,0,1,0,1,1,5,0,0,1,0,0,0,2,0,1,0,1,1,0,0,1,1,0,2,1,1,1,1,0,2,0,0,0,0,2,1,0,2,0,2,1,0,1,0,1,3,1,0,0,0,0,1,0,0,1,2,0,0,1,0,2,1,2,0,0,1,1,1,1,0,1,1,1,3,2,0,0,0,4,0,0,0,3,1,0,0,1,1,4,2,0,0,2,0,3,1,1,2,2,2,1,1,2,1,1,0,1,1,0,2,3,2,2,0,0,2,5,0,1,1,1,1,1,0,0,1,1,1,0,0,2,0,0,1,0,1,2,0,0,0,0,0,0,3,1,0,2,0,2,0,1,0,1,1,0,3,0,2,0,1,1,1,1,1,2,1,0,0,0,3,1,1,0,4,2,0,0,0,0,1,0,0,1,3,0,0,0,1,1,1,2,0,1,1,1,2,1,0,1,1,0,1,1,2,3,2,2,1,1,0,2,0,1,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,2,4,8,0,2,0,1,1,1,0,1,1,1,1,0,0,0,2,0,0,3,0,0,2,1,3,1,2,0,1,0,1,2,1,1,0,0,0,1,0,1,0,4,0,1,0,4,2,0,1,0,0,0,1,1,4,0,0,1,1,2,1,1,3,1,0,1,0,3,0,1,3,2,1,0,2,2,2,1,3,1,0,1,0,1,0,2,0,0,2,1,2,1,2,2,3,1,2,0,1,0,0,1,0,1,1,1,1,0,2,0,0,1,4,1,2,1,1,0,5,0,0,1,1,2,0,3,1,3,1,0,1,2,3,2,1,1,0,0,0,0,0,0,2,1,2,0,1,2,1,1,1,2,0,0,2,0,2,0,1,0,1,0,2,2,0,0,0,0,1,1,0,0,0,0,4,0,3,2,1,1,1,3,1,1,0,0,0,0,1,2,0,4,2,1,1,0,0,4,0,2,1,0,2,1,1,1,1,0,1,0,0,1,1,1,2,1,2,3,0,1,0,1,1,1,1,1,1,0,0,1,0,0,0,1,2,0,1,2,2,0,0,0,0,2,3,0,2,0,1,1,2,1,6,0,1,1,0,0,0,0,0,1,1,0,1,0,1,4,1,2,4,2,1,0,0,0,1,0,1,1,1,1,0,2,1,0,0,0,0,0,2,2,1,0,1,2,0,2,1,2,2,0,2,1,0,1,0,0,1,1,1,1,0,2,0,0,1,1,0,2,0,0,0,0,1,0,3,3,3,2,1,0,3,0,2,2,2,1,0,2,1,0,2,1,1,1,0,1,1,0,1,2,1,0,0,1,0,1,2,2,3,2,2,1,0,1,1,2,2,2,0,2,2,0,5,1,0,0,0,0,0,3,1,2,2,1,1,0,2,0,0,2,0,1,0,1,1,0,1,1,1,3,0,1,2,0,1,1,0,1,3,1,0,3,0,1,1,2,2,1,0,1,1,0,2,1,0,0,1,1,0,0,1,0,2,0,0,1,0,1,2,1,1,0,1,2,0,2,1,0,1,0,0,1,0,0,0,1,2,0,1,0,0,2,2,0,0,1,0,0,1,1,2,0,0,3,3,2,3,0,2,2,1,1,0,0,0,0,0,0,1,2,0,0,1,0,3,4,0,1,1,1,0,1,1,0,1,1,1,1,0,1,0,0,1,1,1,1,1,2,0,1,2,1,1,1,1,2,0,1,1,1,0,2,1,0,2,3,0,0,2,0,5,1,1,0,0,0,0,1,1,1,0,2,1,0,1,0,0,1,1,1,2,0,1,2,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,3,0,0,2,0,0,1,3,0,1,1,1,1,0,0,1,0,0,0,0,1,1,0,2,0,1,0,1,1,1,1,3,0,0,1,0,3,3,0,1,1,1,2,0,0,0,1,0,1,4,1,0,2,1,0,1,0,0,2,1,3,1,0,1,0,1,1,0,0,0,0,0,0,0,2,1,0,1,1,1,1,1,0,2,1,0,1,0,1,0,2,1,2,2,1,2,1,0,1,1,2,1,0,1,0,0,3,1,0,1,1,1,1,0,0,1,1,1,2,1,0,2,0,1,1,0,1,1,2,0,1,2,1,0,0,2,0,3,1,2,0,1,1,1,0,1,3,2,5,0,1,1,0,1,0,1,1,2,1,0,0,2,1,0,4,1,1,1,0,1,0,1,2,2,2,2,0,2,1,0,1,1,1,3,1,1,0,1,0,0,0,0,1,1,1,1,1,2,0,0,1,0,1,1,2,0,5,0,0,2,0,2,2,2,2,1,0,1,1,0,1,2,2,1,0,2,1,0,2,0,2,0,0,2,1,1,5,0,0,1,1,0,1,1,0,2,0,0,1,0,0,1,1,1,1,1,0,2,2,1,1,2,2,2,3,2,1,0,2,0,4,1,0,1,1,0,0,2,0,1,2,0,2,0,2,0,0,1,0,1,1,2,0,1,0,0,0,1,0,3,3,1,0,0,1,0,0,0,0,3,2,1,1,0,0,0,0,2,2,3,3,0,0,1,1,1,1,2,0,0,2,2,0,1,2,0,0,0,0,2,2,0,0,4,2,0,2,0,5,0,1,1,2,3,0,2,0,0,1,1,0,2,2,0,3,0,2,1,1,0,1,0,0,0,2,2,0,2,0,1,1,0,0,0,1,1,0,0,0,1,0,0,2,0,0,1,2,1,2,2,0,0,1,0,2,2,1,1,0,1,1,0,0,1,1,2,2,0,0,1,1,1,1,0,0,0,0,2,0,0,0,1,1,1,1,4,3,2,0,0,0,1,0,4,2,0,1,0,1,0,1,0,0,0,0,2,1,1,2,0,0,1,1,1,0,0,0,1,3,0,0,1,0,0,1,1,1]}]},"null_count":0,"last_update_version":397952035866542080},"pi":{"histogram":{"ndv":1981,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+AFsUXlDRlhtS/9zR05rWGdZAP4=","upper_bound":"ATFNAAAAAAAA+QFVd3J0RlhVN/9KR3RnTzJmbP9TRFhNMmJXVf80eWhUAAAAAPs=","repeats":1},{"count":16,"lower_bound":"ATFQAAAAAAAA+QFiVmZTREU3OP9oV1AxcWJlQ/84VVdVTjgAAP0=","upper_bound":"ATFXAAAAAAAA+QFnelR6ME9vQv9YMDRCYXBXav9uQVQ5dElRNv9XU2dCbQAAAPw=","repeats":1},{"count":24,"lower_bound":"ATFYAAAAAAAA+QFWcVBrMEg4WP9GUHowR3BROP9VeGthdkRMT/9sAAAAAAAAAPg=","upper_bound":"ATFlAAAAAAAA+QE3clpqdmlBWP9oNgAAAAAAAPk=","repeats":1},{"count":32,"lower_bound":"ATFmAAAAAAAA+QE5T3NsZzAAAP0=","upper_bound":"ATFtAAAAAAAA+QFQaEpjZTUAAP0=","repeats":1},{"count":40,"lower_bound":"ATFuAAAAAAAA+QE1NHNlSURkVP9mVmpRczNQZf90MmMxWklqZ/9PRWI5RzNtOf8AAAAAAAAAAPc=","upper_bound":"ATF1AAAAAAAA+QF6RUVhQkk3Z/9heHVFQnJSZv8AAAAAAAAAAPc=","repeats":1},{"count":48,"lower_bound":"ATF2AAAAAAAA+QFQYjE1SlFDev9JaU1OOWduVP9kb1pNWjMAAP0=","upper_bound":"ATIxAAAAAAAA+QFzdDBTRGRlRf9oQzRNNU9KYv8AAAAAAAAAAPc=","repeats":1},{"count":56,"lower_bound":"ATIyAAAAAAAA+QFZSGtuU3RZd/9wOTgyUgAAAPw=","upper_bound":"ATI5AAAAAAAA+QF1TkJVR1l4ef8zMTlQbEtoRf9OWkJTRnowc/9uV1RjTER0Q/8AAAAAAAAAAPc=","repeats":1},{"count":64,"lower_bound":"ATJBAAAAAAAA+QFEQXpPQzlEMf9KZjhqUkRCUf8AAAAAAAAAAPc=","upper_bound":"ATJIAAAAAAAA+QEwNVFYUzdwa/9vbzJta3gxVv83TAAAAAAAAPk=","repeats":1},{"count":72,"lower_bound":"ATJJAAAAAAAA+QE2dVdZR0FHRv9JcGtKdmw2R/9Yb3BzcHNpMP9Gb0JPTnpoAP4=","upper_bound":"ATJQAAAAAAAA+QF5dgAAAAAAAPk=","repeats":1},{"count":80,"lower_bound":"ATJRAAAAAAAA+QFXUjg4RFdlAP4=","upper_bound":"ATJYAAAAAAAA+QFncGx0Z1RKZP9VSEV0TUpUbf9NQ1E3UTBnSv9ia3YAAAAAAPo=","repeats":1},{"count":88,"lower_bound":"ATJZAAAAAAAA+QFsAAAAAAAAAPg=","upper_bound":"ATJmAAAAAAAA+QFoSVBxazVmdP9JSW92MVUAAP0=","repeats":1},{"count":96,"lower_bound":"ATJnAAAAAAAA+QFsMDlNb2g2VP9lS0ROWmd0dv9FbUhLZHRtNf9rRWd5AAAAAPs=","upper_bound":"ATJuAAAAAAAA+QFRMjZPMXRyVv9rZldQNTVFN/8AAAAAAAAAAPc=","repeats":1},{"count":104,"lower_bound":"ATJvAAAAAAAA+QFvclNFTlptc/9nNmIwWWFEUP9uS3h1T25UWP8wAAAAAAAAAPg=","upper_bound":"ATJ2AAAAAAAA+QE1WG1GYnh1cv92bG1RNXJWT/9FcXZ1b0IAAP0=","repeats":1},{"count":112,"lower_bound":"ATJ3AAAAAAAA+QFoaEM1RjAAAP0=","upper_bound":"ATMyAAAAAAAA+QFZdzd4AAAAAPs=","repeats":1},{"count":120,"lower_bound":"ATMzAAAAAAAA+QFwQTR0Tm9xev9vVWhtTUJYSf9NRlE5YVNOdP8wZ1o2V3hOAP4=","upper_bound":"ATNBAAAAAAAA+QF4dFZyS1hVVv9zAAAAAAAAAPg=","repeats":1},{"count":128,"lower_bound":"ATNCAAAAAAAA+QFMUjl1bloyR/9QMEQAAAAAAPo=","upper_bound":"ATNJAAAAAAAA+QF4NUNFdjkzRP9aZW1kdGg0ef80alMwUHkAAP0=","repeats":1},{"count":136,"lower_bound":"ATNKAAAAAAAA+QFPa3YAAAAAAPo=","upper_bound":"ATNRAAAAAAAA+QFiZU4zbWxHRP83MEhNVFEyAP4=","repeats":1},{"count":144,"lower_bound":"ATNSAAAAAAAA+QF5NjNiVEdtOP9DekxMYjQyMP9vaWtJQQAAAPw=","upper_bound":"ATNZAAAAAAAA+QFnZQAAAAAAAPk=","repeats":1},{"count":152,"lower_bound":"ATNaAAAAAAAA+QFNd0ZpUWZJV/9BTVNkSgAAAPw=","upper_bound":"ATNnAAAAAAAA+QF1YUFhMWpubf9QUVdTTTk2SP9UAAAAAAAAAPg=","repeats":1},{"count":160,"lower_bound":"ATNoAAAAAAAA+QFkNTVJbnp5bv9DN0tBcXUAAP0=","upper_bound":"ATNvAAAAAAAA+QFodERLSGM1Sv9LZEhUVzZ4Nv9KdkZ0T1dBV/9FMmgAAAAAAPo=","repeats":1},{"count":168,"lower_bound":"ATNwAAAAAAAA+QFkSm9ocnh0Vv9DZW0yTDlGR/84MUdvMzQxdv8weHY0AAAAAPs=","upper_bound":"ATN3AAAAAAAA+QFZaGhWZzF3M/9VYlhvQVdzYf8wT0hTc05WQ/9rZ1ZTOFoAAP0=","repeats":1},{"count":176,"lower_bound":"ATN4AAAAAAAA+QE4WXFobVlLaP9IbmQ5YU5iaf90U0tjVTdSQf8AAAAAAAAAAPc=","upper_bound":"ATQzAAAAAAAA+QFtaGFWOHUxSf82AAAAAAAAAPg=","repeats":1},{"count":184,"lower_bound":"ATQ0AAAAAAAA+QFTdDg3cEVFav95eWd2AAAAAPs=","upper_bound":"ATRCAAAAAAAA+QFsd3BXZkRGM/9tQjRSWnM1b/9oUUVGVQAAAPw=","repeats":1},{"count":192,"lower_bound":"ATRDAAAAAAAA+QF6clBFQTNRdv9acmhxSEVpT/9TUnY2QkNEaf80YTYzZ05SAP4=","upper_bound":"ATRKAAAAAAAA+QFLbjgAAAAAAPo=","repeats":1},{"count":200,"lower_bound":"ATRLAAAAAAAA+QFQd0xMb1ByTv9FeFV5Q0Iycv9xclo2Y1dIOf9hMUFPUwAAAPw=","upper_bound":"ATRSAAAAAAAA+QFvdDVaQ2FnVf84YzZHeHRqbv9PaW9sd3VlRv9qAAAAAAAAAPg=","repeats":1},{"count":208,"lower_bound":"ATRTAAAAAAAA+QF4Rk9haHlOc/9RdjNoZFJQSP9Lc2ZBNUcAAP0=","upper_bound":"ATRaAAAAAAAA+QFoYTdUNU80M/84AAAAAAAAAPg=","repeats":1},{"count":216,"lower_bound":"ATRhAAAAAAAA+QFEczZEQUhTUP9WSAAAAAAAAPk=","upper_bound":"ATRoAAAAAAAA+QF5clRDdmVQdv8AAAAAAAAAAPc=","repeats":1},{"count":224,"lower_bound":"ATRpAAAAAAAA+QFmAAAAAAAAAPg=","upper_bound":"ATRwAAAAAAAA+QFoNWp2VTFWUf9HAAAAAAAAAPg=","repeats":1},{"count":232,"lower_bound":"ATRxAAAAAAAA+QEzZ3pWdmRtVv9sAAAAAAAAAPg=","upper_bound":"ATR4AAAAAAAA+QE2SGN3NjA3RP9OdgAAAAAAAPk=","repeats":1},{"count":240,"lower_bound":"ATR5AAAAAAAA+QFXdUxPaXRQOf9peHNxdkZMev9JNmxQTERFR/80bkVtYwAAAPw=","upper_bound":"ATU0AAAAAAAA+QFxeWpCb2tiMf83AAAAAAAAAPg=","repeats":1},{"count":248,"lower_bound":"ATU1AAAAAAAA+QFQYmZxMWdOZP9OeTBaTzdYev9BdFFHY1JPYf9qT3gAAAAAAPo=","upper_bound":"ATVDAAAAAAAA+QFVYzJwTEpGev9rdzZWV2s3Qf9UcVB0bkxDef9oNG1TAAAAAPs=","repeats":1},{"count":256,"lower_bound":"ATVEAAAAAAAA+QFuZVcAAAAAAPo=","upper_bound":"ATVLAAAAAAAA+QFpYVQyUjYAAP0=","repeats":1},{"count":264,"lower_bound":"ATVMAAAAAAAA+QFVaWd5UlV1RP9LQUNkS1JLdf9XagAAAAAAAPk=","upper_bound":"ATVTAAAAAAAA+QF0Q09JZDlpUf9VaXd2RWEwb/9HY01YWVEyS/9ueXNTOAAAAPw=","repeats":1},{"count":272,"lower_bound":"ATVUAAAAAAAA+QFOZkdRaUgxSv8AAAAAAAAAAPc=","upper_bound":"ATVhAAAAAAAA+QEySXFSTUV5T/9NdnQxemFzYv9xR0hCbzE5MP8wYm1mAAAAAPs=","repeats":1},{"count":280,"lower_bound":"ATViAAAAAAAA+QE5bFBDa1pnZv95anJRUDhyaP8AAAAAAAAAAPc=","upper_bound":"ATVpAAAAAAAA+QFSMXJXNXl2Vv9LSG0xeDhFbv9qQU5xaklxV/9xV0tPa1dlAP4=","repeats":1},{"count":288,"lower_bound":"ATVqAAAAAAAA+QFXSjhwa2M4Of96ZmIAAAAAAPo=","upper_bound":"ATVxAAAAAAAA+QF2Y2QwRzI4Nv8xcWYAAAAAAPo=","repeats":1},{"count":296,"lower_bound":"ATVyAAAAAAAA+QFWN3FNbEl4af9SS3VnbE9GYf9ZdzVBTU8xZP9DRm0AAAAAAPo=","upper_bound":"ATV5AAAAAAAA+QFtOFQwAAAAAPs=","repeats":1},{"count":304,"lower_bound":"ATV6AAAAAAAA+QFCZkpMdnZYVv82eUNGM0kAAP0=","upper_bound":"ATY1AAAAAAAA+QFma0JLU0ZPc/9JYkMAAAAAAPo=","repeats":1},{"count":312,"lower_bound":"ATY2AAAAAAAA+QF1WncxTTJ3Qf9TMkVSQk0wOP8AAAAAAAAAAPc=","upper_bound":"ATZEAAAAAAAA+QF3OHA3NkJzef93RUpPZ21ENv9LZ05XcVljav8zbVZIY2FSZ/8AAAAAAAAAAPc=","repeats":1},{"count":320,"lower_bound":"ATZFAAAAAAAA+QFwRGRraUVNb/9FU1hQeURRS/9xAAAAAAAAAPg=","upper_bound":"ATZMAAAAAAAA+QFQdHpLNnpVTP9Od2pXeldSev9STWFiRFBwAP4=","repeats":1},{"count":328,"lower_bound":"ATZNAAAAAAAA+QF0NkZpAAAAAPs=","upper_bound":"ATZUAAAAAAAA+QFSdGJjdHQzNf8AAAAAAAAAAPc=","repeats":1},{"count":336,"lower_bound":"ATZVAAAAAAAA+QFjTXRic1N3MP9UQVdleUpIUf8zTgAAAAAAAPk=","upper_bound":"ATZiAAAAAAAA+QFHOWxLVXJhNv9QWVNPMlZhTf8yaElPMnNsQv9ZAAAAAAAAAPg=","repeats":1},{"count":344,"lower_bound":"ATZjAAAAAAAA+QFuQkdVUQAAAPw=","upper_bound":"ATZqAAAAAAAA+QFpAAAAAAAAAPg=","repeats":1},{"count":352,"lower_bound":"ATZrAAAAAAAA+QFVSUVWZ0o2Z/83bHg1b2QAAP0=","upper_bound":"ATZyAAAAAAAA+QFLU3V3TGVvQ/8yYzFCYnlpM/94bnQ3Mk5FSf80WgAAAAAAAPk=","repeats":1},{"count":360,"lower_bound":"ATZzAAAAAAAA+QFCMDB4a0ZORv9EQ04wYnNHbP9oYWIAAAAAAPo=","upper_bound":"ATZ6AAAAAAAA+QFDTnlscHk0ZP9oWVFWU25vN/9sd21uQVpKY/9EAAAAAAAAAPg=","repeats":1},{"count":368,"lower_bound":"ATcAAAAAAAAA+AFZWFdhSFZqef9kWE1QRWVTdP85SUJKAAAAAPs=","upper_bound":"ATc2AAAAAAAA+QE2ekdGaFFZef9SSVJUYjJWdf9BOHFaRAAAAPw=","repeats":1},{"count":376,"lower_bound":"ATc3AAAAAAAA+QFPNEJQVHN1Yv9TTzF3TU16Vv9DTXgAAAAAAPo=","upper_bound":"ATdFAAAAAAAA+QFwY2ZEUkhuRf82OXVvclJtS/8AAAAAAAAAAPc=","repeats":1},{"count":384,"lower_bound":"ATdGAAAAAAAA+QFaelhlZGVadP8AAAAAAAAAAPc=","upper_bound":"ATdNAAAAAAAA+QFKcm4AAAAAAPo=","repeats":1},{"count":392,"lower_bound":"ATdOAAAAAAAA+QFqZmZqdHJ0Tf9wTwAAAAAAAPk=","upper_bound":"ATdVAAAAAAAA+QFVZnhMSEF6R/9nNTc1UTY3Wf9aAAAAAAAAAPg=","repeats":1},{"count":400,"lower_bound":"ATdWAAAAAAAA+QFsYVF5bW5HNv9DaTFZcWF4d/9KT2cAAAAAAPo=","upper_bound":"ATdjAAAAAAAA+QF0YTd0MXl1Rf8xMkVRbVNUZv91MHR0UFpyeP8AAAAAAAAAAPc=","repeats":1},{"count":408,"lower_bound":"ATdkAAAAAAAA+QF4bUVpS255Qf8zZ215czEzM/9ZNVpZQW02Qf8AAAAAAAAAAPc=","upper_bound":"ATdrAAAAAAAA+QE4YWM1ZjdOZP9lUAAAAAAAAPk=","repeats":1},{"count":416,"lower_bound":"ATdsAAAAAAAA+QFFNXRTQUt5Mf9VSFZ6NmF5U/9RQXlBYTMAAP0=","upper_bound":"ATdzAAAAAAAA+QFrY1g4Y2NuUf90RTRsUGJRef9PU3FTQmtqQf9mSUVnNGsAAP0=","repeats":1},{"count":424,"lower_bound":"ATd0AAAAAAAA+QFsT2VtTUUxUv9sbERUTlJFVf9pMHcAAAAAAPo=","upper_bound":"ATgAAAAAAAAA+AFzbEhMAAAAAPs=","repeats":1},{"count":432,"lower_bound":"ATgwAAAAAAAA+QFZOTlyNjl0eP81RFJ2aAAAAPw=","upper_bound":"ATg3AAAAAAAA+QFPYW5MT0M2TP9UNG9GZlM0bf9tZnpTV3RMZf9abGYyVwAAAPw=","repeats":1},{"count":440,"lower_bound":"ATg4AAAAAAAA+QE4OUYxZXplMf9iV25RQm5TAP4=","upper_bound":"AThGAAAAAAAA+QFrNQAAAAAAAPk=","repeats":1},{"count":448,"lower_bound":"AThHAAAAAAAA+QFsa1lZSwAAAPw=","upper_bound":"AThOAAAAAAAA+QFsakYAAAAAAPo=","repeats":1},{"count":456,"lower_bound":"AThPAAAAAAAA+QExTzdDRUpxZf9jT2VlUTNlNP9uZXhOQlkxZP95bgAAAAAAAPk=","upper_bound":"AThWAAAAAAAA+QFzMThrZFRjU/82bEh2ZHI1c/83MVNBVUp0V/8AAAAAAAAAAPc=","repeats":1},{"count":464,"lower_bound":"AThXAAAAAAAA+QE4Y3ZrYXBScf9RMHZIeERrRf9KTkpIAAAAAPs=","upper_bound":"AThkAAAAAAAA+QFYUUdLWDRvWf9CcTNrTlU3ef83R2hCTG44Y/81SXIAAAAAAPo=","repeats":1},{"count":472,"lower_bound":"AThlAAAAAAAA+QFuTHI1YUJ5V/9LYnZxbWhxZv9BZ2pDOTg4Zf9BSWpJTgAAAPw=","upper_bound":"AThsAAAAAAAA+QE2QnhuVUFjN/9IaHIyanl4av9WODZyUwAAAPw=","repeats":1},{"count":480,"lower_bound":"AThtAAAAAAAA+QE2WklIcUxtV/93ZzZaMgAAAPw=","upper_bound":"ATh0AAAAAAAA+QFLeWVJcTVxTv9KVAAAAAAAAPk=","repeats":1},{"count":488,"lower_bound":"ATh1AAAAAAAA+QFTZnVrSGFMVP8yTGNTUG9uAP4=","upper_bound":"ATkwAAAAAAAA+QExUVVLRTlNaf9paVBSNVhoAP4=","repeats":1},{"count":496,"lower_bound":"ATkxAAAAAAAA+QF6ZmdhOTBEMP9YdUN2UHIAAP0=","upper_bound":"ATk4AAAAAAAA+QFkdDE1dThYTP9qOXdubGlVAP4=","repeats":1},{"count":504,"lower_bound":"ATk5AAAAAAAA+QE4bGZyYmM1bv9xAAAAAAAAAPg=","upper_bound":"ATlHAAAAAAAA+QFIbVFjYXFDd/9TRnhvUwAAAPw=","repeats":1},{"count":512,"lower_bound":"ATlIAAAAAAAA+QFUekZ6cHFaQ/9wd0ZMQ3ZGZP94NzdWWFBjeP84AAAAAAAAAPg=","upper_bound":"ATlPAAAAAAAA+QFEanJRWWx0bv9WeWsAAAAAAPo=","repeats":1},{"count":520,"lower_bound":"ATlQAAAAAAAA+QFiT0h2N2J3bP9yaFdHNDJzT/9qOE14N3NZcP80AAAAAAAAAPg=","upper_bound":"ATlXAAAAAAAA+QFLdWl6VnZMWv9Ic1BBdDN5NP9PWVNPcXVEcP80ZDkAAAAAAPo=","repeats":1},{"count":528,"lower_bound":"ATlYAAAAAAAA+QFIcDcAAAAAAPo=","upper_bound":"ATllAAAAAAAA+QF0ZWc3QWhvbP9RQWFFc0pKUP9XWVYAAAAAAPo=","repeats":1},{"count":536,"lower_bound":"ATlmAAAAAAAA+QFvUUVqQVFMU/9SZk5sWmVDZP9WZk1QVVMAAP0=","upper_bound":"ATltAAAAAAAA+QE2dQAAAAAAAPk=","repeats":1},{"count":544,"lower_bound":"ATluAAAAAAAA+QFGNVJqZG9oOf9xAAAAAAAAAPg=","upper_bound":"ATl1AAAAAAAA+QFWdAAAAAAAAPk=","repeats":1},{"count":552,"lower_bound":"ATl2AAAAAAAA+QFIWVZRNFByWv9kNFpKNFIycv8AAAAAAAAAAPc=","upper_bound":"AUExAAAAAAAA+QFZcQAAAAAAAPk=","repeats":1},{"count":560,"lower_bound":"AUEyAAAAAAAA+QFsRjg1NHZZM/9qOURYZTFwAP4=","upper_bound":"AUE5AAAAAAAA+QE1cTZMSzRva/83Vktlek1sTf9JV2d0MWZpRv8xMko5AAAAAPs=","repeats":1},{"count":568,"lower_bound":"AUFBAAAAAAAA+QFROW5Db1UwUv9kZWkxUXJvVP93c0E1SVJPUf9rQ21GVG8AAP0=","upper_bound":"AUFIAAAAAAAA+QFzbzhYTHFXN/9LZTI1VUNlUP8zaW10N0RHav90bFZpZEsAAP0=","repeats":1},{"count":576,"lower_bound":"AUFJAAAAAAAA+QFkalRhaGxERP8zZHNOcTRKAP4=","upper_bound":"AUFQAAAAAAAA+QFENDh5d284dP9vbEo4RkVMYv8AAAAAAAAAAPc=","repeats":1},{"count":584,"lower_bound":"AUFRAAAAAAAA+QFCTGp5Nk1CZ/9Rc0taOWhMSP9ha3hvZ1lUbP9lY1B5amkAAP0=","upper_bound":"AUFYAAAAAAAA+QFIbkpZT0IzMf9QZjMwUzQ1OP92NGRCOWMAAP0=","repeats":1},{"count":592,"lower_bound":"AUFZAAAAAAAA+QFBM093WgAAAPw=","upper_bound":"AUFmAAAAAAAA+QF2NllZQVdDVf9NRHZkZWhVVv9Cd1E0Y0FDSf81OThpckVqN/8AAAAAAAAAAPc=","repeats":1},{"count":600,"lower_bound":"AUFnAAAAAAAA+QFQTAAAAAAAAPk=","upper_bound":"AUFuAAAAAAAA+QFCUWd3dThNZP81dHZtYwAAAPw=","repeats":1},{"count":608,"lower_bound":"AUFvAAAAAAAA+QE2ckM1M0FmTf9udgAAAAAAAPk=","upper_bound":"AUF2AAAAAAAA+QFtaFdYWWJEa/9GVGtkSlRpN/9HAAAAAAAAAPg=","repeats":1},{"count":616,"lower_bound":"AUF3AAAAAAAA+QFkbEM0Nk85R/9nQTBzTGdKNv9FNG8yUHNoQ/8AAAAAAAAAAPc=","upper_bound":"AUIyAAAAAAAA+QF1cGJRWjJxMv9yajd5Z29YTv9RbExMAAAAAPs=","repeats":1},{"count":624,"lower_bound":"AUIzAAAAAAAA+QFhc3lxZkxhAP4=","upper_bound":"AUJBAAAAAAAA+QFaRHpNRXRyZf9XV25nRXluN/84UVhSZ2VzMf9pOUVicVl3Vv8AAAAAAAAAAPc=","repeats":1},{"count":632,"lower_bound":"AUJCAAAAAAAA+QFSeU5sMVlUZ/90VEVTbnl4VP9QS1ZhMEtmSP9Ic3FrakhDdv8AAAAAAAAAAPc=","upper_bound":"AUJJAAAAAAAA+QFrZmpneFROS/9weUJGAAAAAPs=","repeats":1},{"count":640,"lower_bound":"AUJKAAAAAAAA+QE1YWtwSUJ6ev8zWElmTmFhRP8yYldSSgAAAPw=","upper_bound":"AUJRAAAAAAAA+QFyTDcAAAAAAPo=","repeats":1},{"count":648,"lower_bound":"AUJSAAAAAAAA+QFXblFiOQAAAPw=","upper_bound":"AUJZAAAAAAAA+QFMVmhHeHExYf9WcWFFSUxRef9XUTVjSTE0d/95AAAAAAAAAPg=","repeats":1},{"count":656,"lower_bound":"AUJaAAAAAAAA+QFuaHl6cWtjUv9ETElrNUs3N/83dlV6dEtlcv9CbVhKAAAAAPs=","upper_bound":"AUJnAAAAAAAA+QFhbnlwSVlRMf9kbWs1VVdISP9mallnTDhxaf81RmVldkEAAP0=","repeats":1},{"count":664,"lower_bound":"AUJoAAAAAAAA+QFCS1RGbGhjSf9hV0QzTXlhRv82cGplQ05oMP9jRlNhUAAAAPw=","upper_bound":"AUJvAAAAAAAA+QExajVlcQAAAPw=","repeats":1},{"count":672,"lower_bound":"AUJwAAAAAAAA+QFHMAAAAAAAAPk=","upper_bound":"AUJ3AAAAAAAA+QFhWk05Z3ZiTf9KWjZvb3p1U/96TDdyTVU4a/8AAAAAAAAAAPc=","repeats":1},{"count":680,"lower_bound":"AUJ4AAAAAAAA+QFJenlGUFBXOf9naEMzAAAAAPs=","upper_bound":"AUMzAAAAAAAA+QF1ekswbWRoNf9DWXdqNXdFQ/9mNzE4TkhxAP4=","repeats":1},{"count":688,"lower_bound":"AUM0AAAAAAAA+QFaNGljMnhsQf9zNXNQVjF2Rf9Ndm5YdThFdf9WMgAAAAAAAPk=","upper_bound":"AUNCAAAAAAAA+QF1dldEUU5kdP9KWTdSd3poVf96ZAAAAAAAAPk=","repeats":1},{"count":696,"lower_bound":"AUNDAAAAAAAA+QF0SnJzV29PZ/9wdlQzSWRCdv93T1UAAAAAAPo=","upper_bound":"AUNKAAAAAAAA+QFZUEpKOXR3ev9QSDRXZG9tT/95bVBxaQAAAPw=","repeats":1},{"count":704,"lower_bound":"AUNLAAAAAAAA+QF2UFZRNTd4bP9OSgAAAAAAAPk=","upper_bound":"AUNSAAAAAAAA+QE3d3BnRDNEWv9HQlFkYWNyWP9DbE8yMEFYaP9FeE1FYwAAAPw=","repeats":1},{"count":712,"lower_bound":"AUNTAAAAAAAA+QFOejBZcWh1Zv9IeGtoWHJxT/9WdgAAAAAAAPk=","upper_bound":"AUNaAAAAAAAA+QFqSUV4RXVzTv81YW1HUFBybP9qMG52TVBWZ/9WSE9mAAAAAPs=","repeats":1},{"count":720,"lower_bound":"AUNhAAAAAAAA+QFySVZNVDMAAP0=","upper_bound":"AUNoAAAAAAAA+QFVUzRZcFZCQ/9HNgAAAAAAAPk=","repeats":1},{"count":728,"lower_bound":"AUNpAAAAAAAA+QFxZVNIWHFEef80aTFBUnkAAP0=","upper_bound":"AUNwAAAAAAAA+QF0ODdtQWtDNv9CSmpkOTNmQv9UTAAAAAAAAPk=","repeats":1},{"count":736,"lower_bound":"AUNxAAAAAAAA+QFWckdJc0EyQv9BUThVeGJYSf9NamtjU1J0cf80AAAAAAAAAPg=","upper_bound":"AUN4AAAAAAAA+QFlSlhxT0NBTf9FTXQ4NXZ3aP9tT0sxemJnQf9iaQAAAAAAAPk=","repeats":1},{"count":744,"lower_bound":"AUN5AAAAAAAA+QE3ZGtaRTlmZP95bmUAAAAAAPo=","upper_bound":"AUQ0AAAAAAAA+QFCSU5RdElvZf9GRlJLZ3JqAP4=","repeats":1},{"count":752,"lower_bound":"AUQ1AAAAAAAA+QFwVzV0RkVrVP91enpTamQ5Nv9PQWNYbjlGR/9kSwAAAAAAAPk=","upper_bound":"AURDAAAAAAAA+QE2MWZsMwAAAPw=","repeats":1},{"count":760,"lower_bound":"AUREAAAAAAAA+QE3Z1dCaAAAAPw=","upper_bound":"AURLAAAAAAAA+QFyVkRtNE5jdv9kSkdvTVhKdv9mYlJNTgAAAPw=","repeats":1},{"count":768,"lower_bound":"AURMAAAAAAAA+QFlVzk0AAAAAPs=","upper_bound":"AURTAAAAAAAA+QEzTnRsAAAAAPs=","repeats":1},{"count":776,"lower_bound":"AURUAAAAAAAA+QFxc2pPd2tKRP81ZkREWjVFAP4=","upper_bound":"AURhAAAAAAAA+QFYAAAAAAAAAPg=","repeats":1},{"count":784,"lower_bound":"AURiAAAAAAAA+QEwMnlpRGp0R/8AAAAAAAAAAPc=","upper_bound":"AURpAAAAAAAA+QFlbmhrd1A2Sv9TY3lXQWNERP9RRUQxc25iVv9xQVVyWHcAAP0=","repeats":1},{"count":792,"lower_bound":"AURqAAAAAAAA+QFpQXp3RUZLNP94eE56VEI4a/8AAAAAAAAAAPc=","upper_bound":"AURxAAAAAAAA+QFVNXB0WjFlM/9id05yZTN2bf84V0JnaDJmbv8xbnhoUW8AAP0=","repeats":1},{"count":800,"lower_bound":"AURyAAAAAAAA+QFERmg4allaMP9HcUJZREZ1Mf93bjZFUGpPWf9hSlVSbmMAAP0=","upper_bound":"AUR5AAAAAAAA+QEzVGk5QncwWv8AAAAAAAAAAPc=","repeats":1},{"count":808,"lower_bound":"AUR6AAAAAAAA+QFJTUdSVwAAAPw=","upper_bound":"AUU1AAAAAAAA+QFMNnNwUE9KNf85NkYxR2F2bf9OUWdFAAAAAPs=","repeats":1},{"count":816,"lower_bound":"AUU2AAAAAAAA+QFZRFh4RFpoSP90NwAAAAAAAPk=","upper_bound":"AUVEAAAAAAAA+QE0cAAAAAAAAPk=","repeats":1},{"count":824,"lower_bound":"AUVFAAAAAAAA+QF3MkdwMXNPV/84c3dsOEJSbv9uQThxelJYY/91aGxSQksAAP0=","upper_bound":"AUVMAAAAAAAA+QE1WFAxAAAAAPs=","repeats":1},{"count":832,"lower_bound":"AUVNAAAAAAAA+QFSUHl0blBSQv9odEprclBVVP9Ia09nZGxDWv8wSnpIZGV6AP4=","upper_bound":"AUVUAAAAAAAA+QFaT3NJaFM0Rv85cAAAAAAAAPk=","repeats":1},{"count":840,"lower_bound":"AUVVAAAAAAAA+QEyeXg4Y2d1c/9QNUcyMlRJU/9aSTdmAAAAAPs=","upper_bound":"AUViAAAAAAAA+QF5cUw0ek9XZ/9jAAAAAAAAAPg=","repeats":1},{"count":848,"lower_bound":"AUVjAAAAAAAA+QF3UnFZYjlIQv9pcEp0MUU3Y/8AAAAAAAAAAPc=","upper_bound":"AUVqAAAAAAAA+QFxeU1KAAAAAPs=","repeats":1},{"count":856,"lower_bound":"AUVrAAAAAAAA+QFyMVN1YzhiSf9KNWJ0UUZkNP82dEdFAAAAAPs=","upper_bound":"AUVyAAAAAAAA+QFydlFUc1JBNv9naVJSQndocv9jRwAAAAAAAPk=","repeats":1},{"count":864,"lower_bound":"AUVzAAAAAAAA+QFRSlFpcnF1T/9SbERkZVZqTv8AAAAAAAAAAPc=","upper_bound":"AUV6AAAAAAAA+QFsQnR3Q1gAAP0=","repeats":1},{"count":872,"lower_bound":"AUYAAAAAAAAA+AFDS0g4NzEyRv9IeFlBSQAAAPw=","upper_bound":"AUY2AAAAAAAA+QFPa0N4THhGY/9KNXd5aDF2av8AAAAAAAAAAPc=","repeats":1},{"count":880,"lower_bound":"AUY3AAAAAAAA+QFoNzNCSm5HMf9mNXdCZHZ0dv9MMXlPSncAAP0=","upper_bound":"AUZFAAAAAAAA+QFOQmhYalYyUv96YzEAAAAAAPo=","repeats":1},{"count":888,"lower_bound":"AUZGAAAAAAAA+QFiWHU5Z0lPYf9SUTBWUzRtT/81ajFLbUwAAP0=","upper_bound":"AUZNAAAAAAAA+QFHV0lUQWI0av9lOUpPbwAAAPw=","repeats":1},{"count":896,"lower_bound":"AUZOAAAAAAAA+QFrQU1aAAAAAPs=","upper_bound":"AUZVAAAAAAAA+QFuYXN6d1R0MP9pAAAAAAAAAPg=","repeats":1},{"count":904,"lower_bound":"AUZWAAAAAAAA+QFQM215MWlZOf92aXFlR21sd/94dVFpbHJac/9lbE91NlVWQf8AAAAAAAAAAPc=","upper_bound":"AUZjAAAAAAAA+QE0aVBORgAAAPw=","repeats":1},{"count":912,"lower_bound":"AUZkAAAAAAAA+QFuWTlES05MVv9FQW5NWUdTMP80bXpzZjE1S/9Nd3F4aWRVZ/8AAAAAAAAAAPc=","upper_bound":"AUZrAAAAAAAA+QF1S3FYeFdKOf8AAAAAAAAAAPc=","repeats":1},{"count":920,"lower_bound":"AUZsAAAAAAAA+QExVWF3QzZIbv9VcAAAAAAAAPk=","upper_bound":"AUZzAAAAAAAA+QFKQlJaUHJ3MP9zdlRXQ1FUTv9JU2JMQlQzSP9HAAAAAAAAAPg=","repeats":1},{"count":928,"lower_bound":"AUZ0AAAAAAAA+QFrAAAAAAAAAPg=","upper_bound":"AUcAAAAAAAAA+AFuY2d4c1RLY/9EeVZRWjdPRP9hV1F6TW1DMf80UQAAAAAAAPk=","repeats":1},{"count":936,"lower_bound":"AUcwAAAAAAAA+QFIU1FPTGNpN/9DUk5ZMFBqZv9BU3FkQW42Q/8AAAAAAAAAAPc=","upper_bound":"AUc3AAAAAAAA+QFqSzlUSmpDU/84RHNoOGNhaP8yAAAAAAAAAPg=","repeats":1},{"count":944,"lower_bound":"AUc4AAAAAAAA+QFJTTc4YmhkdP9rT0FVcERsWP8wVnBDAAAAAPs=","upper_bound":"AUdGAAAAAAAA+QFxU1RzcHdrQf9lSklwbWhBRf9rVHI5ME5wef9lZjNkelh5bf8AAAAAAAAAAPc=","repeats":1},{"count":952,"lower_bound":"AUdHAAAAAAAA+QFJcGd4YU02Sf9oY3RsWWFiSP9jY3l3AAAAAPs=","upper_bound":"AUdOAAAAAAAA+QFLS243UDNSVv9GaVBWMAAAAPw=","repeats":1},{"count":960,"lower_bound":"AUdPAAAAAAAA+QFZZW1UNXNFAP4=","upper_bound":"AUdWAAAAAAAA+QFmdHRaWVFUcf9jQjQ1a2w2d/80Q296AAAAAPs=","repeats":1},{"count":968,"lower_bound":"AUdXAAAAAAAA+QFhM25jWDZMc/9MS0NqeUR4SP9yekE1UTdQbP9HT0d3WgAAAPw=","upper_bound":"AUdkAAAAAAAA+QFYR1BtYm5PVP9maW51RjJrTP9rM2dPVmtFN/9rNTJkAAAAAPs=","repeats":1},{"count":976,"lower_bound":"AUdlAAAAAAAA+QFBdUNqakNNOf9GbwAAAAAAAPk=","upper_bound":"AUdsAAAAAAAA+QFXNG01cnAAAP0=","repeats":1},{"count":984,"lower_bound":"AUdtAAAAAAAA+QFna0Y1QXppYv9PSlBkOFFONf9iZEFYQTVxSP9PZAAAAAAAAPk=","upper_bound":"AUd0AAAAAAAA+QFnemlEcHZIdv94anBUangAAP0=","repeats":1},{"count":992,"lower_bound":"AUd1AAAAAAAA+QFlTHd3SlNab/9Yczg2SDJ4RP9udUVvMHlubP8AAAAAAAAAAPc=","upper_bound":"AUgwAAAAAAAA+QFJQnNnM1ZQev8wRAAAAAAAAPk=","repeats":1},{"count":1000,"lower_bound":"AUgxAAAAAAAA+QFGZVdGdFZqbP9RRUNzQ2p1Sf9Sd2hldDNJev9QAAAAAAAAAPg=","upper_bound":"AUg4AAAAAAAA+QFDYkdwOGtsVv9VY1FrVEZIRv9zQW5xeQAAAPw=","repeats":1},{"count":1008,"lower_bound":"AUg5AAAAAAAA+QFwVmlVYUFaSP9DUnZoAAAAAPs=","upper_bound":"AUhHAAAAAAAA+QE5dkJDQW13M/8AAAAAAAAAAPc=","repeats":1},{"count":1016,"lower_bound":"AUhIAAAAAAAA+QFFeWoAAAAAAPo=","upper_bound":"AUhPAAAAAAAA+QFOSHZGWWkAAP0=","repeats":1},{"count":1024,"lower_bound":"AUhQAAAAAAAA+QFlM2xVU3lKa/9jZzJTUHVLAP4=","upper_bound":"AUhXAAAAAAAA+QF2eHFBME9VTv9kSTI5AAAAAPs=","repeats":1},{"count":1032,"lower_bound":"AUhYAAAAAAAA+QF2bGtUbzhjUP9QNURaYjIAAP0=","upper_bound":"AUhlAAAAAAAA+QE0MXlQcUNuMP81dFllUwAAAPw=","repeats":1},{"count":1040,"lower_bound":"AUhmAAAAAAAA+QFDVUljc0RPNf9lAAAAAAAAAPg=","upper_bound":"AUhtAAAAAAAA+QFEZlBLUG5hVv9ad0Z6VXk4Qf9LVHVXNUM1AP4=","repeats":1},{"count":1048,"lower_bound":"AUhuAAAAAAAA+QFpMzNCdEVDT/8AAAAAAAAAAPc=","upper_bound":"AUh1AAAAAAAA+QFQUGp6MWhKQ/90Tm9MbW9kQv9DTXdoZngzAP4=","repeats":1},{"count":1056,"lower_bound":"AUh2AAAAAAAA+QFrS2d2TENsa/9ibkRuUlhqNP9kRlpoTkhxbP9kSkFDAAAAAPs=","upper_bound":"AUkxAAAAAAAA+QF5TWhDeFdMTP8AAAAAAAAAAPc=","repeats":1},{"count":1064,"lower_bound":"AUkyAAAAAAAA+QFCTWhwOHdDUf9Td29yT1oxMf9sdWlOZ0VnVv94bkJBbQAAAPw=","upper_bound":"AUk5AAAAAAAA+QF2eFBUUDJLcf94S3cyRDRrRv9tcksxVEkAAP0=","repeats":1},{"count":1072,"lower_bound":"AUlBAAAAAAAA+QFzZ1F2SXFwAP4=","upper_bound":"AUlIAAAAAAAA+QFRc0FGM0Fpav9aUEdZODFpUf9vUUd3eXdXbP9vAAAAAAAAAPg=","repeats":1},{"count":1080,"lower_bound":"AUlJAAAAAAAA+QF5d085MWFRVP81Q2hvQ0hJSf9kcTA4QTkAAP0=","upper_bound":"AUlQAAAAAAAA+QFSN0JPAAAAAPs=","repeats":1},{"count":1088,"lower_bound":"AUlRAAAAAAAA+QFTMUJ2VHF6bf9COFMAAAAAAPo=","upper_bound":"AUlYAAAAAAAA+QE3b3YAAAAAAPo=","repeats":1},{"count":1096,"lower_bound":"AUlZAAAAAAAA+QFjNQAAAAAAAPk=","upper_bound":"AUlmAAAAAAAA+QFERkJyNnlpN/9WZ1FselhSYf9NWVdlOGtSMv9Xb0pvNQAAAPw=","repeats":1},{"count":1104,"lower_bound":"AUlnAAAAAAAA+QFHNXpidUcwdf9yVWlyZEs5aP9xd1RwOXI5AP4=","upper_bound":"AUluAAAAAAAA+QFoAAAAAAAAAPg=","repeats":1},{"count":1112,"lower_bound":"AUlvAAAAAAAA+QE4AAAAAAAAAPg=","upper_bound":"AUl2AAAAAAAA+QFyZWlVaHZkd/9JWmhkZk1qd/96AAAAAAAAAPg=","repeats":1},{"count":1120,"lower_bound":"AUl3AAAAAAAA+QFteTJtNERCQ/93QXpra3BVMv9MAAAAAAAAAPg=","upper_bound":"AUoyAAAAAAAA+QFmOVkzOEQxev9FdTd5N2FZAP4=","repeats":1},{"count":1128,"lower_bound":"AUozAAAAAAAA+QFoRnRPYlFKAP4=","upper_bound":"AUpBAAAAAAAA+QFjbjNWSUVsc/85AAAAAAAAAPg=","repeats":1},{"count":1136,"lower_bound":"AUpCAAAAAAAA+QFnMU1OZ1lobv9wdlVKTkd0Mv8xYm5GcXVTbf8AAAAAAAAAAPc=","upper_bound":"AUpJAAAAAAAA+QFtN2UyemxnRP8yeGtWVXNDNf8AAAAAAAAAAPc=","repeats":1},{"count":1144,"lower_bound":"AUpKAAAAAAAA+QFGNEd0cHJkeP92ZW1GZUVHR/9zVlZveAAAAPw=","upper_bound":"AUpRAAAAAAAA+QFUbk9mMDNvS/8yeUlMQ3BvVv9ubW5tcTluSP9oRjc0AAAAAPs=","repeats":1},{"count":1152,"lower_bound":"AUpSAAAAAAAA+QFwYVZrZHcwc/9QWmhERVE5Sf9KTTlUdXlTAP4=","upper_bound":"AUpZAAAAAAAA+QFoNDM1YwAAAPw=","repeats":1},{"count":1160,"lower_bound":"AUpaAAAAAAAA+QE3NHpxR1BmNf9MAAAAAAAAAPg=","upper_bound":"AUpnAAAAAAAA+QFaeQAAAAAAAPk=","repeats":1},{"count":1168,"lower_bound":"AUpoAAAAAAAA+QFDWjdEN2ZrZv9Cak04Q29iY/9UVHBIM2gAAP0=","upper_bound":"AUpvAAAAAAAA+QFYeXRwdkR2OP9EcWJwRWZtWv9sOVdBbThlYf8AAAAAAAAAAPc=","repeats":1},{"count":1176,"lower_bound":"AUpwAAAAAAAA+QFrNmlidldRd/8AAAAAAAAAAPc=","upper_bound":"AUp3AAAAAAAA+QE5aDV2bWVsS/9hVVY2VUZtTf9DZ0pwWgAAAPw=","repeats":1},{"count":1184,"lower_bound":"AUp4AAAAAAAA+QFxUlhhOUFGSv9TcnZBaDlva/9UaVdFUWx6T/9sUmpjTAAAAPw=","upper_bound":"AUszAAAAAAAA+QF4aGdkVlVKSf9MS3RZRG9HSP83AAAAAAAAAPg=","repeats":1},{"count":1192,"lower_bound":"AUs0AAAAAAAA+QFPMWE3OVpKR/9rSldvOW5lV/90AAAAAAAAAPg=","upper_bound":"AUtCAAAAAAAA+QFMcEk2VDcwWf9CAAAAAAAAAPg=","repeats":1},{"count":1200,"lower_bound":"AUtDAAAAAAAA+QFINThEdmllTP9hTWVlYgAAAPw=","upper_bound":"AUtKAAAAAAAA+QFkbkVtYQAAAPw=","repeats":1},{"count":1208,"lower_bound":"AUtLAAAAAAAA+QFuVE5KRnNTOf9tYlJaWjQ1Mf90dmdoNEoxMf8AAAAAAAAAAPc=","upper_bound":"AUtSAAAAAAAA+QFZTwAAAAAAAPk=","repeats":1},{"count":1216,"lower_bound":"AUtTAAAAAAAA+QFibjkAAAAAAPo=","upper_bound":"AUtaAAAAAAAA+QEwaE5EWVJpN/9MUHhhVmdwRf9Yb1h2Wmdac/9iUzJ4UGZ6AP4=","repeats":1},{"count":1224,"lower_bound":"AUthAAAAAAAA+QFubWxtQUowNf9YYjgxa0pOaf9xUXRjbW90Sf9qUXcAAAAAAPo=","upper_bound":"AUtoAAAAAAAA+QFicWp6b0I1Rv96TWl2UExRSP9WNk9SAAAAAPs=","repeats":1},{"count":1232,"lower_bound":"AUtpAAAAAAAA+QFkS280dGh4MP9jZEtGaHNRbf9OcEVWYXM2Yf8xNUVCAAAAAPs=","upper_bound":"AUtwAAAAAAAA+QF2RTJVQWJMSP9IQWZtSQAAAPw=","repeats":1},{"count":1240,"lower_bound":"AUtxAAAAAAAA+QE1RWM5S1FKbv81bFAAAAAAAPo=","upper_bound":"AUt4AAAAAAAA+QEyRXJNZUJqMf9UQVhYTmVHM/91ZFoxcTczN/9KVGgAAAAAAPo=","repeats":1},{"count":1248,"lower_bound":"AUt5AAAAAAAA+QFMRDN4MlRsev9pN1g2aXRoNP8yNlNWczROcf84NWJOegAAAPw=","upper_bound":"AUw0AAAAAAAA+QFrAAAAAAAAAPg=","repeats":1},{"count":1256,"lower_bound":"AUw1AAAAAAAA+QE4UAAAAAAAAPk=","upper_bound":"AUxDAAAAAAAA+QEzT0JTNHM1Nv9WMEZpNWkAAP0=","repeats":1},{"count":1264,"lower_bound":"AUxEAAAAAAAA+QE1bkJnU1VURP9wSlpyREpzZ/83YlJxZXp5NP9yQwAAAAAAAPk=","upper_bound":"AUxLAAAAAAAA+QF1aUZYWDRZVv9Jc3JLVzdmMP9FaE5mM1Ixdf83dE0AAAAAAPo=","repeats":1},{"count":1272,"lower_bound":"AUxMAAAAAAAA+QFMZmVWdlBNRf9OAAAAAAAAAPg=","upper_bound":"AUxTAAAAAAAA+QFKajVGd1RyMP8weGk3TFgwWf83WkgAAAAAAPo=","repeats":1},{"count":1280,"lower_bound":"AUxUAAAAAAAA+QFyYlB5AAAAAPs=","upper_bound":"AUxhAAAAAAAA+QFla2pkaTJuav9JZFFGemg3Vv92ZG5wZQAAAPw=","repeats":1},{"count":1288,"lower_bound":"AUxiAAAAAAAA+QFPcE4yZHlSWf85NHJxN1Jjaf95AAAAAAAAAPg=","upper_bound":"AUxpAAAAAAAA+QFrbFhqbWJmS/9Sdm8AAAAAAPo=","repeats":1},{"count":1296,"lower_bound":"AUxqAAAAAAAA+QFZVjlodU15av8zY1RYbGdZQv9xMzl0MFZPAP4=","upper_bound":"AUxxAAAAAAAA+QF3dmNDWlJZVP9uWGhwRWswRf80AAAAAAAAAPg=","repeats":1},{"count":1304,"lower_bound":"AUxyAAAAAAAA+QFrRmFmMllLSv9xSjZIb3FkVf9IQWE2bklEZv9WN3JhblVjAP4=","upper_bound":"AUx5AAAAAAAA+QExUFdCazZSQ/82ZUJ6bHIAAP0=","repeats":1},{"count":1312,"lower_bound":"AUx6AAAAAAAA+QE4WEVBMmFKd/85MFV1S2ptVP9tMVJDQ05zVv9NY2tRAAAAAPs=","upper_bound":"AU01AAAAAAAA+QF3ckNrckJHZP9nMVZnc0lmZ/9Yc3k0dGYAAP0=","repeats":1},{"count":1320,"lower_bound":"AU02AAAAAAAA+QFISzczWXhiNP9YcURSNgAAAPw=","upper_bound":"AU1EAAAAAAAA+QE1Wm9vZ2Vqbv8AAAAAAAAAAPc=","repeats":1},{"count":1328,"lower_bound":"AU1FAAAAAAAA+QFuRUVaTGhhc/9HQnVtTVVHWP9uVERUcEcAAP0=","upper_bound":"AU1MAAAAAAAA+QFxSmNhZAAAAPw=","repeats":1},{"count":1336,"lower_bound":"AU1NAAAAAAAA+QEzAAAAAAAAAPg=","upper_bound":"AU1UAAAAAAAA+QExYjlNOGVMdP9mQWwzdU9mU/9xQjJ6MWE5Y/9RN00AAAAAAPo=","repeats":1},{"count":1344,"lower_bound":"AU1VAAAAAAAA+QEzZ2tiU3hnWv9ES2dYRkx1Y/9rdzB3blNRMf9NRG5QAAAAAPs=","upper_bound":"AU1iAAAAAAAA+QFCNjI4M0xMQ/81eDZNUTh1cP82SklmM25hMv9BdllCcXdpAP4=","repeats":1},{"count":1352,"lower_bound":"AU1jAAAAAAAA+QFFNHBJaGVBYf9LbHYxbDRYRf9BYXVPdmhKbP8yYnRrVgAAAPw=","upper_bound":"AU1qAAAAAAAA+QEyYXlLWTJtav9uTnFESnVxR/9KYkhPVEF3WP9iNzVCAAAAAPs=","repeats":1},{"count":1360,"lower_bound":"AU1rAAAAAAAA+QE0VVJIM2JxOf9ZQUFoUGswOf9OOWg5TkZHOf9JYXAyb3YAAP0=","upper_bound":"AU1yAAAAAAAA+QFJT3QAAAAAAPo=","repeats":1},{"count":1368,"lower_bound":"AU1zAAAAAAAA+QFQc1ZSelVZef85S2Y2RlJwRv9yamFwAAAAAPs=","upper_bound":"AU16AAAAAAAA+QE3bEJnM2E1OP9JUFVlQ1A4Rv9vaQAAAAAAAPk=","repeats":1},{"count":1376,"lower_bound":"AU4AAAAAAAAA+AF2TThVUkFxOP91NjZxR3JYZf9sYWNsOQAAAPw=","upper_bound":"AU42AAAAAAAA+QE0Q0hRaVp6aP8wNlZiAAAAAPs=","repeats":1},{"count":1384,"lower_bound":"AU43AAAAAAAA+QFiAAAAAAAAAPg=","upper_bound":"AU5FAAAAAAAA+QFIWERIUERqSv9vc0hmVVBvef94eG5qZk5Cav9ZS3puaThoAP4=","repeats":1},{"count":1392,"lower_bound":"AU5GAAAAAAAA+QFPRGEyYWNhSP9HUEliZTdIRP8wMk0wcWZxYf9DUVVBRlZlAP4=","upper_bound":"AU5NAAAAAAAA+QFmakVTAAAAAPs=","repeats":1},{"count":1400,"lower_bound":"AU5OAAAAAAAA+QFaT2YAAAAAAPo=","upper_bound":"AU5VAAAAAAAA+QFTOXZLN1Rhev9CNnV4Q1lOWf82SUl1YUFQU/8wSFdpSgAAAPw=","repeats":1},{"count":1408,"lower_bound":"AU5WAAAAAAAA+QE4cnplQ09oUP9iNHFhV0lqS/9Dc0toMWQ3Qv92UzhPVgAAAPw=","upper_bound":"AU5jAAAAAAAA+QFYY1ppWTRXZv9qcVBxR2hneP9qNlZsd2hxVv9PRU96RAAAAPw=","repeats":1},{"count":1416,"lower_bound":"AU5kAAAAAAAA+QFxcE0AAAAAAPo=","upper_bound":"AU5rAAAAAAAA+QFKYVZFNU5nUP9YYwAAAAAAAPk=","repeats":1},{"count":1424,"lower_bound":"AU5sAAAAAAAA+QFuRXgzYTNIQf9LVXhIdTd2d/9mb2xBZAAAAPw=","upper_bound":"AU5zAAAAAAAA+QFEYmR0OHRrbP9zR2ZiblhSYv9XQzVVN2hyAP4=","repeats":1},{"count":1432,"lower_bound":"AU50AAAAAAAA+QFieXZVYgAAAPw=","upper_bound":"AU8AAAAAAAAA+AFoQmg4eVE1M/9lNkYwUmFwYf8wUFR2dQAAAPw=","repeats":1},{"count":1440,"lower_bound":"AU8wAAAAAAAA+QF0VWpFTGtrZP9DTWVuSmJDYf94WWVtVGhuev9XZEFkcWMAAP0=","upper_bound":"AU83AAAAAAAA+QFyNmRnTDFkcf9ISkhtUFhQaf9sdHNBTGtpZ/82AAAAAAAAAPg=","repeats":1},{"count":1448,"lower_bound":"AU84AAAAAAAA+QFzSXFOYTZNSv9KZlIzTWJhZv9hVU8yYgAAAPw=","upper_bound":"AU9GAAAAAAAA+QFmMWM5MjBmQv9zNFp5SlMxUv9Zb3hsR2pXb/9SSXE2AAAAAPs=","repeats":1},{"count":1456,"lower_bound":"AU9HAAAAAAAA+QFCOVZRS3hYN/9PaHVwM2hhcf9VUmVTVTNsUf9TWAAAAAAAAPk=","upper_bound":"AU9OAAAAAAAA+QFIZUp0VVNnbv8AAAAAAAAAAPc=","repeats":1},{"count":1464,"lower_bound":"AU9PAAAAAAAA+QE4SjNrNVpVU/9hVHFGT2Y3Rv9jWThLb1JZSP95AAAAAAAAAPg=","upper_bound":"AU9WAAAAAAAA+QFZYjgzaFdycP9yYgAAAAAAAPk=","repeats":1},{"count":1472,"lower_bound":"AU9XAAAAAAAA+QEwZFFuNHhscf9ORjV3am85Vv8zQ1dqSmZzAP4=","upper_bound":"AU9kAAAAAAAA+QE3SzNJMGNuT/9RAAAAAAAAAPg=","repeats":1},{"count":1480,"lower_bound":"AU9lAAAAAAAA+QF4b3hvUjJXWv8AAAAAAAAAAPc=","upper_bound":"AU9sAAAAAAAA+QE1bmNnS1EzSv9KTWloAAAAAPs=","repeats":1},{"count":1488,"lower_bound":"AU9tAAAAAAAA+QFncTB5R0gAAP0=","upper_bound":"AU90AAAAAAAA+QF6WUN0dHpJQv9DZG5LQ29rM/9GYmZQAAAAAPs=","repeats":1},{"count":1496,"lower_bound":"AU91AAAAAAAA+QFHVnBFellkav9VTQAAAAAAAPk=","upper_bound":"AVAwAAAAAAAA+QFsVnUwAAAAAPs=","repeats":1},{"count":1504,"lower_bound":"AVAxAAAAAAAA+QE1OGxIZjFYSP9YVnYzQ3FETP9wTnRGUDY5RP9XQ1JqWmNpAP4=","upper_bound":"AVA4AAAAAAAA+QFBSwAAAAAAAPk=","repeats":1},{"count":1512,"lower_bound":"AVA5AAAAAAAA+QFoQ1FuaVAAAP0=","upper_bound":"AVBHAAAAAAAA+QFIVgAAAAAAAPk=","repeats":1},{"count":1520,"lower_bound":"AVBIAAAAAAAA+QFlSDlRU0pGQ/9kdAAAAAAAAPk=","upper_bound":"AVBPAAAAAAAA+QFaSmY0RVdzOP80VGZsWm9Baf9GWDJVAAAAAPs=","repeats":1},{"count":1528,"lower_bound":"AVBQAAAAAAAA+QExR0VDZnlFaP84QUxiMzYzSP80ZmpPQQAAAPw=","upper_bound":"AVBXAAAAAAAA+QE0aktOa3NnRv9iaTBLNktKVv9zczI4UwAAAPw=","repeats":1},{"count":1536,"lower_bound":"AVBYAAAAAAAA+QFGcDltOXc5Qv92OEhzSQAAAPw=","upper_bound":"AVBlAAAAAAAA+QE3U0FRWFNpc/9JbmpGAAAAAPs=","repeats":1},{"count":1544,"lower_bound":"AVBmAAAAAAAA+QF3WG50dzJENv9Fckd4RXJ1Uv9veWsAAAAAAPo=","upper_bound":"AVBtAAAAAAAA+QFxRVl5aXl6bP81ZjNTTUF3SP9wcgAAAAAAAPk=","repeats":1},{"count":1552,"lower_bound":"AVBuAAAAAAAA+QFrd0hqeEhnV/9LRnQAAAAAAPo=","upper_bound":"AVB1AAAAAAAA+QEzcwAAAAAAAPk=","repeats":1},{"count":1560,"lower_bound":"AVB2AAAAAAAA+QFwWms1MjIAAP0=","upper_bound":"AVExAAAAAAAA+QFCOFEzeWdFT/8xNjRWYTdzVf9sU1RYS09aM/91YWF4clYAAP0=","repeats":1},{"count":1568,"lower_bound":"AVEyAAAAAAAA+QFqM3k4eUY2bP9Fc2NLcVYwWP94AAAAAAAAAPg=","upper_bound":"AVE5AAAAAAAA+QE3bTlwNXRjUf82bzZjSEEAAP0=","repeats":1},{"count":1576,"lower_bound":"AVFBAAAAAAAA+QFiRk16QwAAAPw=","upper_bound":"AVFIAAAAAAAA+QFnVEEyQVo0Nv82c3o0OUtXaf93cTZuSzZ3Tf91ZXNyTVE1Uv8AAAAAAAAAAPc=","repeats":1},{"count":1584,"lower_bound":"AVFJAAAAAAAA+QFoSUlhY0t5N/9IUnVzSzlQN/8AAAAAAAAAAPc=","upper_bound":"AVFQAAAAAAAA+QFwVHpyb0dPbf9jejFLYkNnSP9kTmhhWHAwdv9QOE0AAAAAAPo=","repeats":1},{"count":1592,"lower_bound":"AVFRAAAAAAAA+QFQOTRDelNTSf9rdXhoMkF0Sv9sM1ZTAAAAAPs=","upper_bound":"AVFYAAAAAAAA+QF5cGl2eklyd/9VcTZnUzAyTP8zTTB4RXp1Zv8AAAAAAAAAAPc=","repeats":1},{"count":1600,"lower_bound":"AVFZAAAAAAAA+QFQAAAAAAAAAPg=","upper_bound":"AVFmAAAAAAAA+QFTRXBWQUdIMP82TklPNkdHNf9KN0QAAAAAAPo=","repeats":1},{"count":1608,"lower_bound":"AVFnAAAAAAAA+QF0MllFOHU1T/9DVmt3QVdrZv8AAAAAAAAAAPc=","upper_bound":"AVFuAAAAAAAA+QF6MFJyRGp1AP4=","repeats":1},{"count":1616,"lower_bound":"AVFvAAAAAAAA+QEzM1lCUmQ4Uf9YNEFsUWc1Q/9SUWwAAAAAAPo=","upper_bound":"AVF2AAAAAAAA+QFvVW5wcFNrQ/9aSjIxYjg3Nf8weXVrRmxUWP84AAAAAAAAAPg=","repeats":1},{"count":1624,"lower_bound":"AVF3AAAAAAAA+QFyRlY0NkF2af94AAAAAAAAAPg=","upper_bound":"AVIyAAAAAAAA+QEyc1FJUWtBa/9FYmNqcnVlUf9IaEhmcjJqOf9QbUxVMWhyAP4=","repeats":1},{"count":1632,"lower_bound":"AVIzAAAAAAAA+QE4M002RTFmU/9hOVVOU1B5V/9jWlloZnFRdf9VS1E2AAAAAPs=","upper_bound":"AVJBAAAAAAAA+QFGAAAAAAAAAPg=","repeats":1},{"count":1640,"lower_bound":"AVJCAAAAAAAA+QFvQTBKTTFKUf9temU2dWlpZ/9mRmdZUE1CUf9DAAAAAAAAAPg=","upper_bound":"AVJJAAAAAAAA+QFJYUVaRk9yZv83cXpQMXoyMP9MbE1FY3FUbv9aZU1BNW5wAP4=","repeats":1},{"count":1648,"lower_bound":"AVJKAAAAAAAA+QE5Y0VPVGw3TP94YwAAAAAAAPk=","upper_bound":"AVJRAAAAAAAA+QFCRFNGWXZoUf92bQAAAAAAAPk=","repeats":1},{"count":1656,"lower_bound":"AVJSAAAAAAAA+QFRc3VSazlrR/8AAAAAAAAAAPc=","upper_bound":"AVJZAAAAAAAA+QEzWGZ2VmFCV/9nUjZKcVgwS/9ZZ2RnMTk3Uf9hVUptZmlKRP8AAAAAAAAAAPc=","repeats":1},{"count":1664,"lower_bound":"AVJaAAAAAAAA+QFVNUwwaFZIaf9tbWJVZFR0af95RXplaTFCMP8xbwAAAAAAAPk=","upper_bound":"AVJnAAAAAAAA+QFIOEdKMUs1cP9GMQAAAAAAAPk=","repeats":1},{"count":1672,"lower_bound":"AVJoAAAAAAAA+QE3b3E0c2JyRv8AAAAAAAAAAPc=","upper_bound":"AVJvAAAAAAAA+QFVSjJucmRoaf9vdThhT3ZPOf9qSVdMRmVTbv8yb00AAAAAAPo=","repeats":1},{"count":1680,"lower_bound":"AVJwAAAAAAAA+QE0a0xNVjAyNv9vbDBGZzVzZP9EZXhpbkxDS/9ORVU0Z2pBAP4=","upper_bound":"AVJ3AAAAAAAA+QFBMVZJAAAAAPs=","repeats":1},{"count":1688,"lower_bound":"AVJ4AAAAAAAA+QFuZDRjQTQ0Rf9aU3NEV2JZOf8AAAAAAAAAAPc=","upper_bound":"AVMzAAAAAAAA+QFYWUIweWsAAP0=","repeats":1},{"count":1696,"lower_bound":"AVM0AAAAAAAA+QFvRWRmS0o5Vv9VbEViREJndv9qY28AAAAAAPo=","upper_bound":"AVNCAAAAAAAA+QEzWGM0cVRPU/9ucVBGbmdSZ/9CN0VuNQAAAPw=","repeats":1},{"count":1704,"lower_bound":"AVNDAAAAAAAA+QE2b3JsY2NMU/9ZRU5yZUxnYf9sUklhcUgxAP4=","upper_bound":"AVNKAAAAAAAA+QFsOVBsQU5Taf80NXBVRkdqVP9EaGJDM0tzAP4=","repeats":1},{"count":1712,"lower_bound":"AVNLAAAAAAAA+QF6Rmx0NGltbf9GWDdlNEhtU/95bGN2cnNwdf9DQ2MAAAAAAPo=","upper_bound":"AVNSAAAAAAAA+QFFQgAAAAAAAPk=","repeats":1},{"count":1720,"lower_bound":"AVNTAAAAAAAA+QFRWWIyYU1xef9PZ1MwRHEAAP0=","upper_bound":"AVNaAAAAAAAA+QFrdjFZWjhwef9ZVTRpAAAAAPs=","repeats":1},{"count":1728,"lower_bound":"AVNhAAAAAAAA+QFRdUFOcEluev9JM09jaUJ0Mv9kdFA2b1dYbP9nTFNJWUloAP4=","upper_bound":"AVNoAAAAAAAA+QFhZkM0NUhpef9VNTJsU2VDMf9pcG1qbmZPZ/9JTmd4MwAAAPw=","repeats":1},{"count":1736,"lower_bound":"AVNpAAAAAAAA+QFQeml6cWhDMP9jWEs4cGEAAP0=","upper_bound":"AVNwAAAAAAAA+QEzam5iVW1UMP9kUzNPczhLVP9xam5OVVlsM/8zTnA5d1JyT/8AAAAAAAAAAPc=","repeats":1},{"count":1744,"lower_bound":"AVNxAAAAAAAA+QF5emxLVUxVd/9nRDlPdGh5AP4=","upper_bound":"AVN4AAAAAAAA+QFXMWVZMjB1UP9CMkFzbVZWWv90YUxFbkEwdP9PQgAAAAAAAPk=","repeats":1},{"count":1752,"lower_bound":"AVN5AAAAAAAA+QFoZnVDSjEyRP96OEg1WEdKS/9yUWFsSXNlc/9MNmgAAAAAAPo=","upper_bound":"AVQ0AAAAAAAA+QFpY0ZSb0l3AP4=","repeats":1},{"count":1760,"lower_bound":"AVQ1AAAAAAAA+QFZaUYxc0U3Zv9nVlpxQkUxWv9KdgAAAAAAAPk=","upper_bound":"AVRDAAAAAAAA+QFtSmhEOUpHUP9yZ3FJR2t0RP9MWUtHTGkxR/9KMlRZaQAAAPw=","repeats":1},{"count":1768,"lower_bound":"AVREAAAAAAAA+QFUajFCNUpicv81WTU2MWkAAP0=","upper_bound":"AVRLAAAAAAAA+QFrUQAAAAAAAPk=","repeats":1},{"count":1776,"lower_bound":"AVRMAAAAAAAA+QFhZU9WTnhEAP4=","upper_bound":"AVRTAAAAAAAA+QFlcjJmdgAAAPw=","repeats":1},{"count":1784,"lower_bound":"AVRUAAAAAAAA+QFKZWdkVk9uQf9lNgAAAAAAAPk=","upper_bound":"AVRhAAAAAAAA+QFmYlFUb2hNaP9CSAAAAAAAAPk=","repeats":1},{"count":1792,"lower_bound":"AVRiAAAAAAAA+QFiQTVuAAAAAPs=","upper_bound":"AVRpAAAAAAAA+QFKS28wUUNPdP9LcDIySGJNMf9xZUxHSGk4TP8zNgAAAAAAAPk=","repeats":1},{"count":1800,"lower_bound":"AVRqAAAAAAAA+QFxWGpBMXZIU/95VzhkQ3AxdP9CT04AAAAAAPo=","upper_bound":"AVRxAAAAAAAA+QFlM1lxdWFOU/9zAAAAAAAAAPg=","repeats":1},{"count":1808,"lower_bound":"AVRyAAAAAAAA+QFwTVp4WkF5Wf9FZWM2RjNuav9JdXFXZUhZV/9jAAAAAAAAAPg=","upper_bound":"AVR5AAAAAAAA+QFmTXpoVjQ3Uf9QN3ZHeDBQS/9jbgAAAAAAAPk=","repeats":1},{"count":1816,"lower_bound":"AVR6AAAAAAAA+QFhNFk0Umo5Mf81SlllY25Baf9jd0lacUJhVP9wdWVNAAAAAPs=","upper_bound":"AVU1AAAAAAAA+QEzQ0FYTW1wc/93bXVXblF4Wf8AAAAAAAAAAPc=","repeats":1},{"count":1824,"lower_bound":"AVU2AAAAAAAA+QFVN1gzbE5Dd/9jWk1ValhQQf9LMnZPeXBkaf9sRwAAAAAAAPk=","upper_bound":"AVVEAAAAAAAA+QFycEdGVDQ4ev81OVZGZG43Tf9LcDI4aAAAAPw=","repeats":1},{"count":1832,"lower_bound":"AVVFAAAAAAAA+QE2Y1c5SHl1WP9qOTJRSEVYNv84YXhYc1hwSf9PAAAAAAAAAPg=","upper_bound":"AVVMAAAAAAAA+QFqREI4MTVra/92ZmszWAAAAPw=","repeats":1},{"count":1840,"lower_bound":"AVVNAAAAAAAA+QFMTkJrMUZkeP80RndrTUpudf9ObmpNAAAAAPs=","upper_bound":"AVVUAAAAAAAA+QE5Y05kM05RVf9rN2V4WWFWSv9rYgAAAAAAAPk=","repeats":1},{"count":1848,"lower_bound":"AVVVAAAAAAAA+QFzWm8ySzBaRP82S3puM2cAAP0=","upper_bound":"AVViAAAAAAAA+QFnQlQydE42Uv9NbVZoeUpHcf9RbVdhVnV0Y/8wAAAAAAAAAPg=","repeats":1},{"count":1856,"lower_bound":"AVVjAAAAAAAA+QFxQlY4c2hyTv85RWVGbFh1df93OUpkagAAAPw=","upper_bound":"AVVqAAAAAAAA+QFJbklKTUM0WP9adgAAAAAAAPk=","repeats":1},{"count":1864,"lower_bound":"AVVrAAAAAAAA+QFEUm1LSwAAAPw=","upper_bound":"AVVyAAAAAAAA+QEydjg5Wjc4ZP91QgAAAAAAAPk=","repeats":1},{"count":1872,"lower_bound":"AVVzAAAAAAAA+QFPQW1KYXBac/9ENUthcQAAAPw=","upper_bound":"AVV6AAAAAAAA+QFNTjNFRjlkdv9JUAAAAAAAAPk=","repeats":1},{"count":1880,"lower_bound":"AVYAAAAAAAAA+AFSVVJJb1NXdf9ISzFqbjUzdf95T0JvWms2Zf9YZwAAAAAAAPk=","upper_bound":"AVY2AAAAAAAA+QFjV2txWFdISP9qTkY5eWxvav9meDkyAAAAAPs=","repeats":1},{"count":1888,"lower_bound":"AVY3AAAAAAAA+QFPNjdwRHBJAP4=","upper_bound":"AVZFAAAAAAAA+QF1NEZMT2wyM/9uOTVYd01yS/8AAAAAAAAAAPc=","repeats":1},{"count":1896,"lower_bound":"AVZGAAAAAAAA+QFCV3dmSzYxev9jZVk2STF0aP8wTHdLZ2NOb/93OXAAAAAAAPo=","upper_bound":"AVZNAAAAAAAA+QE2ZG90RE0zMf9YdllMS0plMv9yAAAAAAAAAPg=","repeats":1},{"count":1904,"lower_bound":"AVZOAAAAAAAA+QFxVm9ENAAAAPw=","upper_bound":"AVZVAAAAAAAA+QFVRm8yUXJOWv9YY2xqYWUzQv9GWAAAAAAAAPk=","repeats":1},{"count":1912,"lower_bound":"AVZWAAAAAAAA+QFZRXB4dXBtcP85RVEydVkyAP4=","upper_bound":"AVZjAAAAAAAA+QE2UE5iNnplAP4=","repeats":1},{"count":1920,"lower_bound":"AVZkAAAAAAAA+QFVMTEycDB0cv9DVWQAAAAAAPo=","upper_bound":"AVZrAAAAAAAA+QFyRkZGakxpWP9MZ1gwck5CV/8xOEs5AAAAAPs=","repeats":1},{"count":1928,"lower_bound":"AVZsAAAAAAAA+QExOG1DejZXSv84YWhoa3FuOP94TTlrTQAAAPw=","upper_bound":"AVZzAAAAAAAA+QFwOU1CRFhDUf81ekJxUHZUOP9QWFRnOG04U/8zZnhkZQAAAPw=","repeats":1},{"count":1936,"lower_bound":"AVZ0AAAAAAAA+QFjbFJHYwAAAPw=","upper_bound":"AVcAAAAAAAAA+AE3VlFSOTc1dP90Y2ZpOFVZN/9VT0w4UQAAAPw=","repeats":1},{"count":1944,"lower_bound":"AVcwAAAAAAAA+QFWbGxJdzcyYv96TXhqZkpZVP9COE5KQ1hjeP9PVzkAAAAAAPo=","upper_bound":"AVc3AAAAAAAA+QE5bUNrOHZjY/9FNThKcVBENP9DZTAAAAAAAPo=","repeats":1},{"count":1952,"lower_bound":"AVc4AAAAAAAA+QFVZnRKAAAAAPs=","upper_bound":"AVdGAAAAAAAA+QFxVEhvYk03Zv9oQUdHQUEzMP9wQWRNYUVMM/9obgAAAAAAAPk=","repeats":1},{"count":1960,"lower_bound":"AVgAAAAAAAAA+AFrOXZnclNPT/9NR2JET3ZSAP4=","upper_bound":"AWUAAAAAAAAA+AE4ckI2aQAAAPw=","repeats":1},{"count":1968,"lower_bound":"AWYAAAAAAAAA+AEzVHVRYVdpMv9MaWhlNjJhS/8AAAAAAAAAAPc=","upper_bound":"AW0AAAAAAAAA+AF2d2IAAAAAAPo=","repeats":1},{"count":1976,"lower_bound":"AW4AAAAAAAAA+AFHalYxd3JCcv9XaDJCAAAAAPs=","upper_bound":"AXUAAAAAAAAA+AFrS2I5UVc0S/9HdW5yQ3JFVv9iNE5EVmpvSP9aYVdTS1NVAP4=","repeats":1},{"count":1981,"lower_bound":"AXYAAAAAAAAA+AFWcm0AAAAAAPo=","upper_bound":"AXoAAAAAAAAA+AFNaWwwZnhET/9IZDIyR3d2eP81RmtBNURhdv9aYVQAAAAAAPo=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,3,1,2,2,2,1,0,1,1,1,1,0,1,1,2,1,1,1,0,0,1,1,1,2,0,2,1,0,0,1,0,1,1,0,1,0,1,1,1,0,1,0,0,0,0,1,2,0,1,2,1,1,0,0,0,2,1,1,0,5,0,0,0,2,2,1,1,1,2,3,0,1,1,2,0,2,0,1,0,2,3,2,2,2,0,1,1,1,0,4,0,0,0,1,0,0,0,2,1,0,1,1,0,0,0,1,1,2,0,0,1,1,3,3,0,0,1,0,1,2,0,0,1,1,1,1,1,3,2,0,0,2,2,1,1,0,1,1,2,1,2,1,0,1,2,2,0,0,1,0,0,2,1,2,1,4,1,1,2,1,1,1,0,1,1,0,0,5,2,2,0,2,3,1,1,0,3,1,2,1,1,4,0,1,1,0,1,1,0,0,0,0,0,3,2,1,2,1,5,2,1,0,1,1,2,0,0,2,0,1,1,0,1,1,1,0,1,0,1,1,0,2,3,0,1,3,2,1,0,2,0,0,1,0,1,1,0,0,0,0,2,0,2,1,0,2,0,3,0,2,1,2,0,0,2,0,0,2,0,3,2,1,1,2,0,0,2,1,1,0,2,1,0,1,1,0,4,2,2,0,0,2,1,0,0,0,1,0,1,1,0,2,2,1,1,0,1,2,1,0,2,1,3,0,1,2,2,1,3,0,3,1,2,1,2,1,0,1,1,0,2,0,1,1,3,0,3,1,1,1,3,0,0,1,1,1,1,2,0,2,2,0,0,3,2,0,0,1,0,0,0,1,1,1,1,2,0,0,0,1,0,2,0,1,0,0,0,0,1,0,2,0,0,3,0,1,0,1,2,3,2,1,0,3,0,1,2,1,1,0,2,2,1,3,1,0,1,1,2,0,1,0,2,0,0,0,0,2,0,2,2,2,1,1,0,0,1,0,1,2,0,1,0,1,2,1,0,0,0,0,2,1,4,1,0,1,1,2,0,2,1,4,2,3,3,1,0,0,1,1,3,1,0,1,3,0,1,0,1,1,1,1,1,1,0,2,0,1,0,1,0,0,1,4,0,2,0,2,1,1,1,3,0,1,3,0,0,1,1,0,1,0,1,2,0,0,1,1,1,2,0,3,6,0,0,1,0,0,0,2,0,0,1,1,2,0,3,0,3,1,3,1,0,1,0,0,1,2,0,1,0,1,3,0,2,1,0,0,1,0,0,1,1,0,3,1,0,2,1,2,0,1,0,0,2,0,4,2,0,2,1,1,1,0,1,1,0,0,1,0,1,1,0,1,0,2,1,2,0,0,3,0,0,1,1,1,0,1,2,2,0,1,2,0,1,0,1,1,2,3,1,1,1,1,0,1,1,2,0,1,0,0,4,1,2,2,1,3,0,0,0,0,0,1,0,1,0,1,2,0,1,2,1,1,3,0,0,0,0,0,2,0,5,1,1,0,1,0,2,2,0,1,1,0,1,0,2,1,2,0,1,1,1,0,3,1,2,0,1,1,0,0,1,3,0,1,0,0,1,1,0,2,1,1,1,0,2,1,1,1,1,0,0,0,0,0,2,1,1,1,0,1,2,0,2,3,0,2,0,0,0,0,2,2,2,2,1,0,1,1,1,0,1,0,1,1,2,2,1,5,2,1,1,1,3,0,3,5,0,2,0,0,1,0,0,0,0,2,1,0,0,2,0,2,2,0,0,1,2,3,0,1,0,3,0,0,2,2,1,1,1,1,1,0,2,0,1,0,0,2,1,1,1,3,0,3,2,0,0,1,1,0,0,0,0,1,0,1,1,2,2,1,1,0,1,3,0,1,3,2,0,0,1,3,2,2,1,0,2,1,0,0,1,0,1,1,0,2,0,1,2,0,0,1,0,0,2,3,1,1,1,1,1,3,3,0,0,0,0,0,0,1,1,0,2,3,0,1,0,1,0,1,2,0,1,0,1,1,1,1,1,0,2,0,2,0,0,1,1,1,5,1,0,2,1,0,1,0,1,1,1,1,0,3,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,2,0,1,0,0,1,3,0,1,1,0,1,1,3,1,1,1,0,1,2,0,1,0,2,1,1,1,2,2,1,0,0,1,0,0,0,0,0,2,0,1,0,2,0,1,0,2,0,2,1,1,2,2,1,2,1,2,2,2,3,0,1,0,0,0,1,2,1,1,1,0,2,3,1,2,0,1,2,0,0,1,0,0,1,0,0,2,0,1,0,1,1,2,2,1,3,0,0,0,0,0,0,1,0,0,1,1,1,2,2,1,0,2,0,1,2,1,1,1,1,2,0,0,0,2,0,1,1,1,0,1,1,1,0,2,0,0,0,1,1,0,1,1,0,1,0,0,1,3,1,1,1,0,3,0,0,3,3,0,1,1,0,0,0,3,1,1,1,2,1,0,1,1,1,0,1,1,2,0,1,0,0,1,0,1,1,0,2,0,1,0,0,3,0,0,1,0,2,1,0,2,1,1,1,1,3,1,2,0,1,0,1,0,1,1,0,1,1,0,0,1,0,1,1,0,0,2,3,0,0,1,1,1,2,0,0,1,0,2,2,0,3,2,1,0,1,2,0,0,2,1,2,1,1,2,0,0,0,0,0,0,0,1,1,1,1,0,1,2,2,0,0,0,0,1,2,2,2,0,1,0,1,0,0,1,2,1,0,0,1,0,0,1,1,1,2,1,2,1,1,0,0,0,1,1,4,1,2,2,1,2,0,1,1,2,0,0,0,0,1,2,1,3,0,0,1,3,0,0,1,1,2,0,1,3,2,0,1,1,0,0,0,3,1,2,0,0,1,0,1,0,0,3,2,3,2,1,0,0,2,2,1,0,2,0,0,0,0,0,0,1,0,0,0,2,1,0,1,0,2,0,0,1,0,2,0,0,1,0,1,1,2,3,0,1,0,1,1,0,2,1,1,0,0,0,1,0,1,1,2,1,1,0,2,0,0,0,2,2,2,2,2,3,1,0,0,0,1,2,0,2,1,0,0,1,3,1,1,3,4,0,1,2,0,3,1,1,2,0,1,0,0,0,1,0,2,1,2,0,2,2,0,1,0,1,1,0,0,0,2,0,0,0,1,1,0,2,0,0,1,2,0,2,0,0,0,0,1,1,5,0,2,2,1,0,1,1,1,2,0,1,1,2,1,3,0,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,0,1,1,3,1,1,1,1,1,1,0,2,2,0,2,1,0,0,1,0,2,0,0,1,0,1,3,2,1,1,0,1,1,1,0,0,2,0,0,2,4,0,0,1,2,1,1,1,1,0,2,1,2,1,1,1,3,0,0,1,3,1,0,2,0,1,1,0,2,2,1,0,1,0,0,0,2,1,0,1,0,1,0,0,3,0,2,1,1,0,0,0,0,2,4,0,2,0,0,4,0,1,1,0,1,0,3,2,1,2,0,1,2,0,1,0,0,2,0,3,0,0,3,2,1,0,0,0,0,0,2,1,0,0,1,0,1,1,1,0,1,1,1,2,1,1,1,1,3,0,3,1,0,1,2,0,0,1,1,2,0,2,3,0,3,1,0,0,0,1,0,0,2,1,2,0,0,1,1,0,1,1,2,1,1,0,1,0,2,1,0,1,0,1,2,1,0,0,2,1,0,4,0,1,0,0,4,0,0,1,0,0,1,1,1,2,0,2,0,1,2,1,3,0,0,2,1,1,2,0,0,0,2,0,2,1,2,0,0,2,3,0,2,2,1,0,2,1,1,1,3,0,2,0,3,1,2,0,2,2,2,0,1,0,1,0,1,1,1,1,1,2,2,1,0,1,1,2,0,0,0,0,1,2,2,2,1,2,2,1,3,3,1,2,2,0,0,2,2,0,0,1,1,1,0,3,5,1,0,0,1,3,0,2,0,2,0,2,0,2,0,3,0,2,1,1,0,1,1,0,1,2,1,0,1,0,1,0,0,1,2,0,0,0,1,1,3,4,0,2,3,0,1,0,1,0,3,2,1,0,1,3,0,1,0,0,0,0,0,0,1,1,0,1,3,3,0,1,2,0,1,0,0,0,1,1,1,0,3,3,2,0,1,1,1,0,0,1,1,1,0,2,0,0,2,0,1,1,1,1,1,0,0,1,1,1,0,4,0,0,2,2,2,0,2,2,1,0,1,1,0,0,0,2,0,2,1,1,1,1,0,1,1,0,0,2,2,0,0,0,1,0,1,3,3,3,0,1,1,0,0,0,0,0,1,0,0,3,0,2,2,2,1,2,0,0,0,1,0,0,1,0,2,1,1,1,0,0,1,1,3,2,0,0,0,1,1,0,0,1,1,1,0,0,2,2,0,1,0,1,4,1,0,0,0,3,0,1,0,0,2,1,0,2,1,2,4,0,2,1,2,1,0,1,0,0,1,2,0,0,2,1,1,2,1,1,1,0,2,1,1,2,1,3,3,0,0,1,1,2,2,3,0,0,1,1,1,3,0,2,1,3,4,3,0,0,1,0,1,0,1,0,2,0,0,0,0,2,0,1,1,0,1,1,0,0,0,0,1,1,2,2,1,1,1,0,1,1,0,0,2,1,0]},{"counters":[1,0,2,2,1,1,1,1,1,2,1,1,0,1,1,2,2,3,0,0,2,1,0,1,1,1,1,1,1,0,3,0,1,0,1,2,0,0,1,0,0,1,0,2,2,2,2,2,1,2,3,2,1,1,2,1,0,3,0,1,1,2,1,2,1,0,1,0,1,1,4,0,2,2,1,0,1,0,0,0,0,0,1,1,2,1,0,3,2,1,2,1,1,1,0,1,1,0,0,2,0,1,3,1,1,0,1,1,2,0,1,0,1,2,0,0,2,1,1,0,1,0,0,2,0,1,2,2,1,1,0,1,1,2,1,1,1,1,0,2,0,0,2,1,3,2,3,0,1,0,1,0,1,0,0,0,3,0,0,0,1,0,0,4,0,3,1,2,4,0,1,2,1,0,1,2,1,0,1,0,0,2,0,1,2,0,0,2,1,0,0,0,2,3,1,1,1,0,0,0,0,1,1,2,0,0,1,0,0,0,2,2,1,1,1,1,0,0,2,0,1,2,2,2,0,1,0,0,1,2,1,1,1,0,2,0,3,2,1,1,1,1,0,2,1,1,2,2,0,0,2,1,0,0,0,2,1,0,0,0,2,0,2,0,0,1,1,1,0,1,1,1,0,0,3,2,0,0,0,1,0,2,0,0,1,0,1,0,2,1,0,1,1,1,1,1,4,2,3,1,0,0,1,0,1,2,0,2,1,1,1,0,0,2,1,0,0,1,1,2,1,0,0,0,0,1,1,0,3,2,0,1,1,1,1,1,1,4,0,0,1,1,0,0,2,1,0,0,0,2,2,0,5,3,2,2,1,1,0,1,1,0,1,2,1,3,0,1,0,1,1,0,0,2,1,0,0,0,0,1,1,2,2,3,0,1,0,2,0,2,2,1,1,0,4,1,1,1,1,1,2,0,2,2,2,0,2,1,3,0,1,2,0,0,0,0,1,1,2,1,1,1,3,0,2,1,0,1,0,2,2,2,2,0,2,2,1,1,2,3,3,0,0,1,0,2,3,2,2,1,1,0,4,0,0,0,3,2,0,1,1,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,3,0,0,1,1,3,1,0,0,1,0,1,2,1,2,0,0,0,1,1,0,2,2,1,2,1,2,1,1,2,1,4,0,1,1,0,1,3,0,0,1,0,1,0,0,0,1,0,0,1,0,2,0,2,1,1,1,0,0,2,0,1,1,2,0,2,0,1,1,4,0,0,1,2,1,0,2,0,2,1,2,1,1,2,2,0,1,3,1,0,1,1,1,1,0,0,0,0,2,0,3,1,2,1,0,0,1,1,1,2,2,1,0,0,1,1,0,0,3,2,4,0,0,0,1,0,1,1,2,0,2,3,0,1,3,1,3,1,0,1,0,1,1,0,0,1,3,2,1,1,1,1,1,1,2,0,4,1,0,0,1,2,2,1,2,0,0,0,0,1,0,1,2,2,1,2,1,0,2,0,0,1,0,0,0,4,2,0,1,3,2,0,1,3,0,2,2,0,1,2,2,0,0,0,0,2,0,0,0,1,0,0,0,2,0,2,2,0,2,0,2,1,1,0,1,0,0,2,3,0,0,0,1,0,0,0,2,2,0,1,1,1,0,2,0,2,1,4,0,1,1,2,1,0,2,1,0,2,0,1,1,0,1,1,1,1,0,2,3,1,3,0,1,1,2,2,1,2,0,2,0,3,1,0,1,1,2,0,0,1,1,1,0,0,1,0,2,1,2,4,0,0,4,1,1,1,1,1,0,1,2,1,1,1,0,0,0,0,0,0,2,2,1,0,0,0,2,0,0,0,0,2,1,0,0,1,0,0,1,0,3,0,1,2,1,0,2,0,2,1,1,0,2,0,2,4,0,0,1,0,2,0,0,2,1,0,1,2,2,3,1,2,2,0,2,1,1,1,0,0,0,0,1,0,0,1,2,2,2,3,1,0,0,2,2,0,0,1,0,1,2,0,1,1,0,0,1,1,1,1,0,2,2,1,2,2,0,2,0,1,1,0,1,0,3,0,2,0,2,2,2,0,0,2,1,0,1,4,0,2,0,1,1,1,2,0,2,0,2,1,2,0,2,0,1,1,1,1,0,1,0,1,2,1,0,0,1,0,0,0,1,2,1,2,1,2,2,2,0,0,0,1,1,1,0,2,1,2,2,1,2,1,3,2,1,1,3,0,1,2,2,1,0,2,1,1,1,2,2,1,1,0,1,1,0,2,0,1,0,2,1,0,1,1,0,2,0,1,0,2,2,1,1,1,0,0,0,0,1,0,2,1,3,1,0,2,0,0,1,0,1,1,0,0,1,0,0,1,0,0,0,0,0,1,1,2,0,1,1,1,0,1,1,3,2,1,1,2,0,1,2,1,0,1,1,0,1,2,0,2,4,0,0,0,1,2,2,0,3,0,2,0,1,1,0,1,1,0,1,1,2,1,1,0,2,0,1,1,0,0,1,1,2,0,0,1,1,3,3,0,0,1,2,0,1,2,1,0,1,1,0,3,1,0,2,0,2,1,1,0,0,1,1,0,0,0,0,1,1,2,1,0,0,1,0,0,0,1,0,2,1,1,0,0,3,0,1,1,0,0,1,1,0,0,1,1,2,3,0,2,0,1,1,0,0,1,2,0,0,1,1,1,0,1,0,0,0,0,1,1,0,2,4,0,2,1,2,2,1,0,0,0,1,2,2,1,0,0,0,1,1,1,0,0,2,3,1,3,0,2,1,2,2,1,2,0,1,2,4,1,1,0,1,1,2,1,1,3,1,0,1,0,1,0,1,1,0,0,1,1,0,1,0,0,2,2,0,1,2,0,1,3,2,3,1,0,0,0,0,0,1,0,2,1,1,0,0,3,1,1,1,1,0,0,2,0,1,2,0,1,0,4,2,3,2,1,4,2,2,0,0,1,1,2,1,0,0,0,1,2,1,2,0,1,0,1,0,0,2,1,0,3,0,1,0,1,0,0,1,0,1,0,1,1,1,1,3,0,0,0,0,1,1,2,2,0,3,1,3,2,2,0,2,2,1,0,0,0,2,2,1,1,3,2,1,1,1,0,0,0,1,0,0,1,2,1,1,1,1,0,1,1,2,1,3,0,1,0,0,0,0,3,1,1,3,1,1,1,1,3,0,4,2,2,1,0,0,3,2,0,0,0,1,2,0,1,1,1,0,1,0,1,2,0,3,2,2,0,1,1,0,1,0,4,0,1,1,0,1,1,1,1,0,1,0,1,1,1,0,2,0,1,0,3,2,2,0,1,0,2,0,0,2,1,4,0,0,0,2,1,1,3,2,3,1,0,4,0,0,0,0,2,0,2,0,1,2,1,1,2,0,0,0,1,3,0,0,1,0,1,0,0,0,0,1,3,0,1,0,3,0,0,0,2,1,0,1,2,0,1,0,0,2,3,1,0,1,1,2,0,1,2,0,1,0,2,0,1,0,2,4,1,1,3,1,1,1,1,2,0,3,1,1,0,0,0,4,3,1,0,3,2,1,0,0,1,1,1,2,0,0,1,1,0,1,2,0,0,1,0,0,0,1,1,1,1,0,3,1,1,2,1,0,2,2,0,0,0,2,2,1,1,1,0,0,1,2,3,1,1,1,3,0,1,0,0,0,0,1,1,2,0,2,0,0,1,2,0,3,1,0,1,0,0,0,1,0,0,0,0,3,1,0,1,0,0,0,0,0,1,0,1,3,1,1,0,0,0,1,2,2,1,1,0,2,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,0,0,1,3,0,4,0,3,3,0,0,0,0,0,1,0,1,2,1,1,0,0,1,1,0,0,0,2,0,3,3,1,3,0,3,0,0,0,0,1,0,2,1,1,1,2,0,0,2,0,0,1,2,3,1,0,0,1,2,2,2,0,1,0,1,2,1,2,1,3,2,1,1,0,1,1,2,2,1,1,1,1,2,2,2,1,2,1,0,0,1,1,4,0,2,0,2,0,0,0,2,2,0,0,1,0,1,1,0,2,2,2,2,0,0,0,1,0,1,2,0,2,0,0,1,3,2,0,0,2,0,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,1,0,2,0,0,1,2,0,0,0,0,0,2,2,3,1,0,2,1,3,0,2,0,0,1,0,1,2,1,1,0,3,0,2,1,0,0,1,3,1,0,1,1,0,1,0,0,0,0,0,2,1,2,1,0,2,0,1,1,1,0,2,0,0,1,0,2,1,0,1,2,2,1,2,0,2,0,3,1,1,1,3,1,1,3,0,1,0,0,1,2,2,1,1,1,0,2,1,1,1,0,1,3,1,1,0,0,1,3,0,3,2,3,0,1,1,0,0,1,0,2,1,0,0,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,3,3,0,0,0,1,0,2,2,1,3,1,2,2,1,0,2,1,1,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,1,1,2,0,1,0,4,0,0,0,1,3,4,0,0,1,1,1,0,1,1,1,2,2,1,1,1,1,0,0,1,0,2,1,1,0,0,0,0,0,0]},{"counters":[1,0,1,0,1,0,3,2,0,1,2,1,0,2,0,1,1,1,0,2,0,0,0,1,2,2,1,0,2,1,1,0,0,2,0,0,1,0,2,1,1,2,0,0,1,1,2,0,1,2,0,1,0,0,1,0,3,1,0,1,2,0,0,2,0,1,1,1,0,1,2,1,3,1,3,0,2,1,0,3,1,1,1,2,1,1,0,1,2,1,1,2,1,1,0,1,0,1,0,1,0,0,1,1,1,0,0,2,3,0,2,2,1,0,1,0,1,1,2,2,3,1,1,1,3,0,1,0,0,0,1,1,0,0,0,3,0,2,0,2,2,1,1,2,0,1,1,0,1,1,1,0,1,1,0,0,0,1,1,0,0,0,1,2,0,2,1,0,1,1,0,2,1,0,0,0,1,2,0,1,1,2,2,2,2,0,1,1,0,2,0,0,2,3,1,1,0,0,1,0,3,0,0,2,1,2,0,0,1,1,0,0,0,0,1,2,1,0,0,0,1,1,0,1,3,0,1,1,2,2,1,0,0,1,3,1,1,3,1,0,1,1,3,0,1,1,1,1,0,0,4,1,0,2,1,3,1,1,1,1,0,0,0,0,0,0,2,2,0,0,0,1,0,4,0,2,2,3,0,1,0,0,2,0,1,0,1,2,2,1,1,0,0,1,2,0,0,1,1,1,0,0,2,1,0,0,0,3,0,1,0,0,2,0,1,0,1,0,0,2,1,1,2,0,1,1,1,3,1,1,0,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1,0,2,0,0,1,2,1,1,1,3,0,0,1,3,1,1,0,0,3,1,2,0,0,2,2,1,2,1,2,2,1,1,1,3,1,1,3,0,2,0,1,4,0,2,1,1,1,0,1,4,3,1,0,0,1,1,1,0,3,0,1,4,0,0,0,1,1,0,2,1,0,1,0,1,0,3,0,1,2,0,0,1,1,1,0,2,1,3,4,0,1,1,1,3,1,0,0,2,0,0,0,0,1,0,2,0,2,0,1,1,0,1,1,0,2,2,1,2,1,0,2,1,2,0,1,1,3,2,0,2,2,0,4,1,2,0,2,2,1,0,1,1,1,0,1,1,1,0,1,0,0,0,1,2,1,2,1,0,0,1,0,3,1,0,1,1,0,3,2,1,0,1,0,1,0,1,0,1,1,0,3,3,1,4,1,0,3,0,0,1,2,1,1,5,2,0,1,1,1,0,0,2,1,0,3,1,0,0,1,1,1,1,0,0,2,1,2,0,2,1,1,0,0,1,0,0,1,2,1,1,1,0,1,0,2,1,2,1,0,2,1,0,2,0,1,1,0,1,1,0,1,5,1,1,0,1,1,2,4,1,0,2,2,2,0,0,0,0,2,0,1,1,0,1,3,0,2,3,1,0,2,1,3,2,2,0,1,2,1,0,0,0,1,0,0,2,0,1,0,0,2,2,5,0,1,0,2,1,1,1,0,0,1,2,1,1,1,1,2,1,0,1,0,0,1,2,0,4,1,1,2,1,2,1,1,0,0,0,1,1,0,2,1,0,1,0,0,1,2,1,1,2,0,1,0,1,2,0,0,0,1,1,1,0,0,1,3,0,2,1,1,4,1,2,2,0,0,0,0,1,0,1,0,1,0,1,0,0,0,0,1,0,2,0,0,1,2,1,1,3,0,1,1,0,0,2,2,0,0,0,1,1,1,0,0,0,0,0,0,2,2,1,2,0,1,1,1,1,0,1,0,0,3,4,1,4,1,1,0,1,1,0,1,1,1,1,1,0,1,1,2,2,1,2,1,0,2,1,1,0,3,2,2,0,0,0,1,1,0,3,0,0,2,1,0,2,5,1,2,2,1,1,0,0,1,0,0,2,0,2,0,1,1,0,0,1,1,4,1,0,1,1,0,0,0,1,0,1,0,1,0,3,1,2,1,1,1,0,0,0,1,1,1,0,1,0,1,0,0,1,1,1,2,0,0,2,0,0,3,1,1,0,1,1,0,1,0,1,1,3,1,0,0,2,0,1,0,1,3,0,4,1,0,1,0,1,1,1,0,0,0,1,2,4,1,1,0,1,1,0,0,0,2,0,4,0,0,1,2,2,0,0,1,0,1,2,0,1,2,1,1,1,1,2,0,1,2,0,0,3,1,1,1,0,0,1,3,0,2,0,2,0,0,2,2,0,2,3,0,0,1,2,1,1,0,0,2,0,0,2,2,1,3,1,1,1,0,1,1,2,2,1,1,0,0,0,1,0,0,1,1,1,0,4,0,0,0,0,1,1,0,0,0,2,1,1,2,1,0,1,2,2,0,2,1,1,2,0,1,1,1,1,1,2,0,1,1,0,0,0,1,1,3,1,1,3,0,1,0,2,1,0,2,1,2,0,0,2,1,1,0,1,1,0,3,0,1,3,2,1,1,0,2,0,0,0,2,1,4,0,1,1,0,1,1,1,1,0,1,0,1,1,2,0,0,1,1,1,2,6,0,0,1,1,1,0,1,1,1,4,2,0,2,1,1,1,0,3,1,0,1,1,0,1,1,1,1,2,0,0,0,1,1,0,1,1,0,0,1,0,1,0,0,2,1,2,3,3,1,1,0,0,2,1,1,1,2,0,2,0,0,0,1,1,2,0,0,3,0,2,2,2,4,0,0,2,1,1,1,0,1,3,0,1,0,1,2,2,2,2,1,1,3,0,2,2,2,1,4,1,1,0,2,1,0,1,1,2,3,2,0,3,0,4,2,1,2,2,0,0,1,2,2,2,1,0,0,4,0,2,0,1,1,0,2,1,0,1,2,0,1,0,1,0,1,0,0,1,0,2,2,0,0,0,0,4,1,0,2,1,1,1,0,1,0,1,0,0,1,1,1,0,1,1,1,1,1,1,1,1,0,0,1,1,2,1,0,3,0,0,0,1,0,0,3,0,1,0,1,2,1,1,0,2,1,1,2,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,0,2,1,1,1,2,1,1,2,1,0,1,0,3,0,0,1,0,0,0,1,2,0,2,0,3,2,0,0,2,1,1,0,1,3,1,0,1,0,3,1,0,1,3,1,1,1,0,1,1,1,2,0,1,0,0,0,1,0,0,0,0,1,1,0,1,0,0,2,0,0,0,1,3,0,1,1,0,3,2,2,0,0,0,2,0,0,1,2,3,1,1,1,1,3,1,0,0,1,1,2,1,1,1,2,1,0,0,1,1,0,0,0,2,2,1,2,1,2,1,0,1,0,1,1,0,1,0,1,3,2,0,2,3,2,0,0,2,1,1,3,0,1,0,0,0,2,2,0,1,0,0,3,1,1,0,1,0,0,2,2,0,3,0,1,0,0,1,0,1,1,1,3,2,1,2,1,3,1,0,2,2,2,1,2,2,0,1,1,0,1,1,0,6,1,1,2,1,1,2,1,0,0,1,1,0,2,0,0,0,0,2,0,0,0,1,0,2,2,3,1,2,2,0,1,0,0,0,0,1,0,0,1,0,1,2,0,1,4,0,2,0,0,1,0,0,0,0,2,3,0,1,0,0,0,0,1,1,3,1,0,3,2,1,1,1,1,1,1,0,1,0,2,0,2,0,1,0,1,3,3,1,0,0,0,2,1,1,4,0,1,2,2,1,3,0,1,0,0,1,2,0,1,0,1,0,1,1,1,1,1,1,0,1,2,0,0,1,2,1,1,0,0,1,1,1,0,2,0,1,1,1,3,0,0,0,1,0,0,0,7,1,0,1,1,1,1,0,1,1,1,2,0,1,2,3,0,0,2,0,0,2,0,0,1,1,0,1,1,0,1,2,1,0,2,1,1,2,0,0,0,0,0,1,0,0,2,1,1,0,0,3,0,1,1,1,1,2,1,0,1,1,1,1,0,2,1,1,2,2,2,1,2,2,0,2,0,0,2,2,1,0,1,2,1,1,1,0,0,0,4,2,0,2,0,0,3,4,2,2,2,0,1,0,0,0,1,0,1,0,1,1,2,0,0,1,4,3,2,2,0,2,2,0,1,1,0,1,1,0,0,2,2,3,1,0,1,0,0,1,0,0,1,0,1,2,0,1,1,0,0,1,2,0,0,0,0,0,1,0,1,3,2,1,1,3,1,0,1,2,1,0,1,0,0,0,1,1,2,0,0,1,1,1,0,0,1,3,1,1,0,1,1,2,1,1,0,0,0,2,0,2,4,0,1,3,1,3,0,1,0,2,0,0,3,1,1,1,1,0,0,0,0,1,1,0,1,2,0,0,2,0,3,1,1,2,2,1,2,2,1,2,0,1,0,0,0,3,3,0,1,4,1,1,1,1,1,1,2,1,0,1,2,1,0,2,1,0,0,3,1,1,0,0,0,1,0,1,1,1,0,3,1,1,4,2,2,2,2,1,1,2,1,0,0,0,2,0,0,2,0,1,2,1,2,1,1,2,0,1,0,1,2,1,0,1,2,1,1,0,0,0,0,0,1,0,0,0,3,0,1,1,0,1,0,1,0,2,1,3,1,1,2,0,1,1,0,1,2,0,1,0,2,0,1,2,0,1,0,1,1,3,2,0,0,1,0,2,1,2,0,3,0,0,0,0]},{"counters":[1,1,1,0,2,1,0,2,0,0,0,0,1,1,1,2,1,0,1,0,0,1,2,0,1,3,3,0,0,1,1,2,1,2,2,1,1,1,2,1,2,1,0,2,3,0,2,0,1,0,0,2,1,2,0,1,3,1,0,1,1,1,3,0,2,0,2,0,0,0,1,0,0,0,0,0,1,2,1,3,1,1,1,1,1,2,2,0,0,0,1,1,2,1,1,4,0,2,1,0,0,1,0,0,0,1,2,1,0,0,1,0,2,0,3,2,3,2,1,0,1,2,1,1,1,1,2,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,1,3,3,2,1,7,1,2,0,1,0,1,1,2,1,0,1,3,0,0,2,0,0,4,0,1,1,0,1,3,3,1,2,3,0,1,1,1,0,2,0,0,0,0,0,1,0,1,1,0,2,0,1,1,0,1,1,1,0,0,1,0,2,0,0,2,1,1,1,0,1,1,1,2,0,0,0,0,2,1,0,0,1,0,1,1,0,1,3,1,1,0,1,4,0,4,0,1,0,0,1,0,1,0,3,1,2,0,1,0,0,1,0,1,0,1,0,0,0,0,1,3,0,1,1,2,2,2,0,1,2,2,1,1,1,0,3,1,1,2,0,1,0,0,0,1,3,0,3,2,0,0,2,1,0,0,1,1,2,0,1,1,2,3,0,0,1,0,0,1,0,0,2,1,0,0,1,2,1,1,0,0,0,3,0,0,0,2,0,1,0,0,1,0,0,1,0,1,0,2,1,0,2,0,3,1,0,1,1,1,0,1,1,2,0,3,3,0,1,2,1,2,1,0,2,2,1,1,0,0,0,0,0,0,0,0,0,0,2,1,3,1,3,0,0,0,0,1,1,1,2,4,2,1,1,3,0,1,2,3,2,1,0,0,0,1,1,1,0,1,4,1,3,2,1,1,0,1,0,0,0,2,0,0,1,2,2,0,2,0,1,0,4,1,2,2,1,1,2,3,0,0,0,3,2,1,1,0,1,0,1,0,1,1,3,0,0,1,2,1,2,2,1,0,0,0,2,2,3,1,0,0,0,0,1,2,0,2,2,1,1,0,3,2,2,1,1,0,2,1,0,1,3,0,0,1,0,0,0,2,0,1,1,1,0,1,1,4,1,1,3,1,5,0,1,1,1,0,1,0,0,2,0,1,1,0,2,0,0,3,0,1,2,0,0,2,1,0,0,2,0,0,4,2,3,2,1,1,2,1,2,1,0,1,1,3,1,1,1,0,0,0,0,2,0,0,2,0,1,0,1,1,2,2,1,3,0,2,1,2,1,1,3,2,2,3,0,4,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,1,2,1,0,1,0,2,1,2,1,0,2,2,0,1,0,2,1,1,1,0,1,0,1,1,1,1,0,1,2,1,1,0,0,2,2,0,0,2,0,3,0,0,0,0,1,1,0,1,0,1,1,4,0,1,2,1,0,3,3,1,0,1,0,2,2,3,2,1,0,0,2,1,0,1,1,2,2,1,1,1,0,1,1,2,0,3,1,0,2,0,2,1,1,2,0,1,3,1,2,0,1,2,1,0,0,0,1,2,0,0,0,2,0,2,3,0,3,1,1,0,2,0,1,3,1,0,1,0,2,0,1,1,2,0,1,3,0,2,0,0,1,2,0,5,3,1,0,2,0,1,1,0,0,0,1,0,1,1,0,0,0,1,0,2,2,0,1,1,1,2,1,1,1,0,2,3,0,1,1,0,3,0,1,0,1,1,1,0,0,0,1,0,3,0,1,1,1,2,0,1,0,0,0,1,1,0,1,1,0,0,1,1,2,0,1,1,2,0,1,3,0,1,1,1,0,1,2,0,1,0,2,2,0,0,1,4,2,2,0,1,2,2,2,0,2,0,0,0,0,0,1,2,2,0,3,1,0,0,1,0,0,1,0,1,1,2,1,1,1,2,1,1,2,0,0,0,0,0,0,1,0,1,2,2,0,1,0,0,1,0,0,1,0,2,1,0,1,3,1,0,1,2,2,0,0,0,1,0,2,1,1,1,0,1,1,1,1,1,2,2,3,2,0,2,0,2,0,4,3,2,2,1,1,0,0,1,1,0,1,0,1,0,2,0,0,1,1,1,2,1,0,1,1,2,0,0,0,0,0,0,1,0,3,0,0,0,0,0,1,1,0,1,1,1,0,3,3,0,2,4,2,0,0,1,0,0,0,0,0,5,2,1,2,3,0,2,3,0,3,2,1,0,1,0,0,1,0,0,1,0,1,1,0,1,0,2,0,0,2,2,1,1,0,0,1,0,0,0,0,0,0,1,1,2,0,0,1,2,2,1,3,0,1,0,0,1,0,1,1,1,3,3,1,0,1,1,0,2,0,1,1,1,0,2,1,1,2,2,0,2,0,1,1,0,2,3,1,1,0,3,0,0,0,0,0,0,3,0,3,2,0,0,2,1,0,0,0,0,2,1,2,1,3,1,2,0,1,2,1,3,0,0,1,1,2,3,0,0,0,1,3,0,0,0,0,3,0,0,4,1,2,0,1,2,1,1,1,2,1,0,1,0,1,1,1,0,2,2,1,0,0,0,4,1,0,1,1,1,0,0,0,2,0,2,2,3,3,0,1,2,2,0,3,1,2,0,0,2,0,1,1,0,2,0,0,0,2,0,0,0,3,0,0,1,0,1,0,0,4,3,0,1,0,0,1,2,1,0,3,1,1,1,2,0,1,0,2,0,1,3,1,1,1,2,2,2,1,0,1,3,0,1,2,0,1,3,0,1,1,2,0,4,1,0,0,0,1,1,0,0,1,0,0,1,2,1,1,0,0,0,2,0,0,0,0,0,0,0,1,1,1,1,2,0,1,0,0,0,1,3,2,0,2,1,2,0,2,2,1,0,3,1,1,0,0,2,0,1,3,1,2,2,2,3,1,0,1,1,1,1,0,2,0,1,0,1,3,0,2,3,1,1,1,0,1,0,0,2,1,3,0,2,0,0,0,1,1,1,1,0,0,0,0,0,1,0,1,1,1,0,0,1,1,1,1,1,1,2,2,0,2,0,2,1,1,2,1,2,2,0,0,1,0,0,4,0,0,0,0,2,1,0,0,1,0,0,1,0,1,1,1,0,2,1,0,1,4,0,1,0,0,2,0,2,1,0,0,0,0,1,0,1,3,1,0,1,4,1,1,1,1,2,0,0,1,0,0,0,0,3,4,0,1,0,1,0,0,2,1,0,1,0,1,1,0,1,1,0,0,1,2,1,0,0,1,1,2,3,0,0,1,1,0,2,1,2,1,0,0,1,3,0,0,1,2,3,2,0,1,0,1,3,1,0,0,1,0,1,1,2,1,1,0,1,1,0,1,0,2,0,2,2,2,1,0,1,0,0,3,2,0,0,0,0,0,4,1,1,2,1,2,0,2,0,3,2,0,0,1,0,0,2,0,2,4,0,0,1,1,1,3,0,0,1,2,0,2,3,0,0,3,0,1,1,0,1,1,0,2,1,0,1,1,1,1,1,1,2,0,2,1,3,0,1,0,0,0,2,1,1,0,1,0,0,1,0,3,1,0,0,1,0,0,1,0,2,0,2,1,0,0,2,1,1,1,1,1,1,0,1,0,3,1,1,3,0,0,0,0,0,1,1,2,1,1,0,1,2,1,2,2,1,0,2,1,1,2,0,0,1,0,1,0,1,2,0,0,0,1,1,0,0,0,1,0,0,1,1,1,0,1,0,1,1,0,1,0,3,1,0,0,2,0,2,2,0,1,2,1,1,1,1,1,0,2,1,2,0,0,1,2,0,1,2,0,2,0,0,4,0,2,0,1,0,0,0,2,0,1,2,1,3,1,3,1,2,3,0,2,1,2,1,1,0,0,2,0,0,1,0,1,1,0,1,1,1,3,0,0,1,1,0,1,1,1,0,0,2,1,2,1,1,1,0,0,1,0,1,1,1,3,1,1,2,2,1,1,1,0,0,0,2,0,1,1,1,0,0,1,2,0,2,1,1,1,1,0,2,0,0,1,1,0,2,3,0,1,1,1,1,1,0,0,0,1,0,1,1,1,1,1,0,0,0,0,1,1,2,1,3,0,1,4,2,0,2,1,2,0,0,0,0,2,1,0,2,1,1,1,0,3,0,1,0,1,0,0,1,1,0,0,3,2,2,4,0,1,4,0,0,2,1,0,1,2,2,1,0,0,3,3,3,2,1,1,0,1,2,1,1,0,0,2,2,1,2,1,1,0,0,0,0,2,1,1,1,1,3,2,1,1,1,0,3,0,0,1,2,1,2,1,0,1,1,0,0,1,2,1,1,1,1,2,0,0,0,0,0,3,0,1,1,1,0,1,1,2,0,0,0,1,1,0,2,2,1,3,1,3,4,2,3,0,0,1,1,1,0,1,1,1,2,1,2,1,1,0,0,2,0,1,1,2,1,0,3,1,0,0,1,3,1,0,2,1,0,2,1,1,0,0,0,4,0,1,1,3,0,1,3,0,1,0,0,1,0,1,0,1,0,1,0,0,0,0,2,1,3,0,1,1,1,0,0,2,0,0,1,1,1,2,3,0,0,0,0,1,1,1,1,1,0]},{"counters":[1,2,0,3,1,0,2,0,2,0,2,1,2,1,0,0,0,1,0,1,3,1,2,1,2,2,1,0,1,2,0,1,0,0,3,0,0,0,1,2,1,1,0,1,1,1,2,0,3,0,4,0,1,0,1,0,0,1,1,1,1,0,1,1,2,4,1,1,0,1,3,2,0,1,0,1,0,1,0,1,0,2,0,3,0,1,0,2,1,1,1,1,2,1,1,0,1,2,2,2,3,0,1,1,1,1,1,2,1,2,1,2,2,0,0,1,0,1,3,0,0,0,1,0,1,3,1,3,1,0,0,2,1,1,4,0,1,0,1,3,1,0,0,0,0,1,2,0,0,0,1,1,2,1,2,2,2,1,1,1,2,1,0,1,1,2,0,0,3,1,0,2,1,0,2,1,1,0,1,2,3,2,0,0,1,2,0,0,2,2,0,1,1,2,1,1,0,0,0,2,2,0,0,0,0,0,3,2,3,2,1,1,3,3,2,1,1,0,0,0,1,0,2,1,0,2,0,1,2,0,2,1,1,1,1,2,1,2,0,0,1,2,2,1,2,0,0,3,2,0,1,0,2,0,0,2,1,1,0,2,1,0,1,0,2,2,2,1,0,2,2,2,0,3,3,0,1,0,2,4,0,1,2,0,0,2,1,2,1,2,1,0,2,1,0,0,0,0,0,1,0,1,1,0,0,1,2,1,0,0,1,2,1,0,2,0,0,1,0,1,1,1,2,1,0,0,1,1,1,1,1,1,0,0,1,1,0,1,1,3,2,0,0,1,2,0,1,0,0,0,1,0,3,3,1,0,0,2,1,1,0,1,0,0,1,0,0,2,1,1,2,0,1,1,1,1,0,0,4,0,0,0,1,0,1,1,0,0,1,2,1,1,0,2,0,0,1,1,1,2,0,0,3,1,1,0,2,2,0,2,1,0,1,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,1,3,2,2,1,1,0,0,0,1,2,0,0,0,2,2,1,0,0,0,2,1,0,1,0,2,1,1,0,1,2,2,0,1,0,2,1,1,0,0,2,1,2,1,0,1,0,0,0,0,2,0,3,3,2,2,1,3,1,1,0,1,3,0,1,2,0,0,3,1,0,0,2,1,0,0,2,4,0,1,1,2,0,0,0,1,1,1,1,0,0,1,2,0,1,0,0,0,4,1,2,2,1,0,2,0,0,2,0,1,0,0,2,0,0,0,2,1,2,1,0,0,2,1,2,1,2,1,0,1,1,1,1,2,0,2,2,1,2,0,1,1,2,2,0,2,1,3,0,2,1,2,0,1,2,0,0,1,0,1,2,0,0,1,0,1,1,0,2,1,1,0,0,6,2,2,0,3,1,0,0,1,2,0,2,0,1,0,1,2,1,1,0,2,2,1,0,2,1,0,3,2,1,2,0,1,0,0,0,0,2,2,1,2,0,0,0,1,0,1,3,0,1,0,0,1,0,2,2,2,1,1,1,1,0,1,0,1,2,0,0,2,2,2,0,2,1,1,3,1,1,1,1,1,2,0,0,0,1,2,0,0,5,2,1,0,0,2,2,5,2,0,0,0,1,3,0,1,0,1,0,3,4,1,2,1,0,2,0,0,1,0,0,0,0,1,0,0,0,3,1,0,2,2,2,0,0,0,2,1,2,0,1,1,2,2,2,3,2,2,0,0,2,0,2,2,1,1,1,0,1,2,0,2,1,0,0,0,0,0,1,1,0,1,0,0,1,1,0,0,1,1,2,0,0,1,3,2,1,1,1,0,0,0,1,1,1,0,1,1,0,1,1,0,1,2,0,0,1,0,2,1,1,1,1,1,1,0,1,2,0,1,2,0,1,2,0,2,4,3,2,0,0,2,0,2,0,2,0,0,1,2,0,0,2,1,0,1,3,0,0,0,0,1,0,3,0,0,1,2,0,0,0,0,0,1,0,1,0,2,2,0,3,3,0,0,0,0,0,0,1,0,0,1,0,1,0,1,0,0,0,2,1,2,2,2,0,0,3,0,0,0,0,2,3,1,3,0,1,0,1,0,1,0,0,2,1,0,1,1,0,1,2,0,0,0,2,0,0,1,2,1,3,3,0,1,1,1,0,0,2,1,0,0,0,1,0,1,1,1,0,0,1,0,0,0,1,1,0,1,0,2,1,0,0,0,2,0,0,0,3,1,2,0,1,2,1,3,0,0,0,2,2,0,1,1,0,0,2,1,4,4,0,2,3,1,1,0,0,1,1,1,0,0,1,2,0,2,0,0,1,1,1,0,1,2,1,1,1,1,0,3,0,1,1,1,1,0,1,1,0,1,0,1,1,0,3,1,2,0,2,2,0,1,1,1,0,2,2,0,0,1,1,1,2,1,0,2,1,1,0,2,0,4,0,1,0,1,0,1,0,0,2,0,0,1,0,1,0,3,1,0,1,1,0,2,0,0,1,0,2,1,1,1,1,1,2,0,0,1,1,1,1,2,2,1,0,0,0,1,2,4,3,1,1,1,0,3,2,2,0,0,0,0,1,0,0,1,4,2,0,1,0,2,2,2,0,3,0,0,2,0,2,0,3,1,3,0,4,2,0,1,1,1,2,1,0,0,0,2,1,0,0,1,2,3,1,1,1,0,1,1,1,1,2,0,2,0,0,0,2,1,0,0,0,1,3,2,1,0,1,2,0,0,0,0,0,1,0,0,2,0,0,0,0,1,2,1,1,0,0,1,3,2,1,3,0,1,0,1,0,1,1,0,1,1,1,1,0,2,1,1,1,2,0,0,3,0,1,0,2,0,0,0,1,3,1,1,1,2,2,0,2,1,1,2,3,2,0,2,0,0,0,1,1,0,2,1,0,2,3,0,1,1,2,0,1,1,2,1,0,2,0,2,1,0,0,0,0,2,1,0,1,1,2,0,0,2,2,2,1,1,0,1,2,2,0,0,1,0,1,1,2,0,2,1,4,2,2,1,0,1,2,0,1,0,0,2,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,1,3,2,2,2,1,4,2,0,1,1,1,0,1,2,2,1,1,0,3,1,1,1,3,2,2,0,0,0,1,1,2,0,1,1,0,1,2,1,1,2,0,1,2,1,1,2,2,0,0,1,0,1,2,3,0,2,1,1,1,0,1,0,3,1,2,0,0,1,2,2,0,1,0,0,0,2,3,0,0,0,0,0,0,0,1,0,0,2,1,3,1,1,2,3,1,0,1,2,3,2,2,2,0,0,0,0,0,1,0,1,0,1,1,0,0,3,0,1,0,1,1,1,1,2,1,1,0,1,3,2,0,1,0,3,0,0,1,0,0,0,0,2,2,2,0,1,3,2,1,1,1,0,2,0,0,2,0,1,3,2,0,0,2,1,1,0,3,2,2,0,1,2,1,0,2,2,1,1,1,2,0,0,1,2,0,1,0,0,1,1,1,0,0,1,1,0,0,1,2,0,0,1,0,1,1,0,1,2,1,1,0,0,0,0,1,0,1,0,1,1,1,2,0,0,1,1,1,3,0,1,2,1,0,3,1,2,1,1,1,2,0,4,3,2,0,1,1,0,0,3,1,1,0,1,1,0,0,1,1,3,1,1,2,1,2,1,0,2,0,0,2,1,0,1,0,2,0,0,0,1,0,0,3,2,1,0,1,1,2,1,1,0,0,1,1,1,1,0,1,2,0,0,0,2,2,2,2,0,1,1,2,1,0,2,1,1,2,0,2,0,1,1,0,0,0,0,0,0,3,1,3,1,0,0,2,1,0,2,2,1,1,1,0,2,1,0,0,1,2,1,0,1,0,2,0,0,0,0,5,0,2,0,2,1,1,0,3,0,1,0,1,2,3,0,1,1,0,0,1,2,1,0,0,1,0,1,2,0,2,0,0,0,2,0,0,1,3,1,0,1,1,1,0,1,0,3,0,1,2,1,1,3,0,0,1,1,0,1,2,2,1,1,1,2,0,0,1,0,1,2,0,0,0,3,1,0,0,2,1,2,0,0,2,3,0,0,1,2,1,3,0,1,3,0,1,2,0,1,1,1,0,2,0,3,0,2,1,0,0,1,3,2,0,2,0,1,0,0,1,1,1,1,1,0,2,0,1,0,0,2,5,0,0,1,1,0,2,0,1,1,3,0,1,1,2,0,2,2,0,1,0,1,0,0,0,2,4,1,0,1,2,0,0,0,1,3,2,1,2,0,0,2,1,1,0,1,0,3,0,1,2,3,1,1,0,1,1,1,0,1,3,1,1,0,2,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,3,5,0,2,0,2,1,1,0,0,2,0,1,1,2,1,1,2,1,1,0,1,2,0,0,0,0,3,1,1,1,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,1,0,1,4,3,0,2,2,1,0,2,0,3,0,0,1,1,0,2,1,1,0,3,0,0,0,1,1,0,1,0,1,1,1,1,3,0,2,2,2,0,0,0,3,2,1,0,1,1,0,1,2,2,0,3,0,1,3,1,0,0,1,0,0,0,1,0,0,2,0,0,1,2,2,2,1,1,1,3,1,0,1,3,1,1,0]}]},"null_count":0,"last_update_version":397952036009934848}},"count":2000,"modify_count":0,"version":0} diff --git a/cmd/explaintest/s/explain_complex_stats_dt.json b/cmd/explaintest/s/explain_complex_stats_dt.json deleted file mode 100644 index c3bb509acdbb3..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_dt.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"dt","columns":{"aid":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MTY=","repeats":1},{"count":16,"lower_bound":"MTc=","upper_bound":"MUY=","repeats":1},{"count":24,"lower_bound":"MUc=","upper_bound":"MUw=","repeats":1},{"count":32,"lower_bound":"MU0=","upper_bound":"MVM=","repeats":1},{"count":40,"lower_bound":"MVU=","upper_bound":"MWI=","repeats":1},{"count":48,"lower_bound":"MWU=","upper_bound":"MXI=","repeats":1},{"count":56,"lower_bound":"MXM=","upper_bound":"MXc=","repeats":1},{"count":64,"lower_bound":"MXg=","upper_bound":"MjA=","repeats":1},{"count":72,"lower_bound":"MjE=","upper_bound":"Mjg=","repeats":1},{"count":80,"lower_bound":"MkI=","upper_bound":"Mkg=","repeats":1},{"count":88,"lower_bound":"Mkk=","upper_bound":"Mk4=","repeats":1},{"count":96,"lower_bound":"Mk8=","upper_bound":"MlY=","repeats":1},{"count":104,"lower_bound":"Mlg=","upper_bound":"Mmg=","repeats":1},{"count":112,"lower_bound":"Mms=","upper_bound":"MnE=","repeats":1},{"count":120,"lower_bound":"MnQ=","upper_bound":"MzE=","repeats":1},{"count":128,"lower_bound":"MzI=","upper_bound":"MzU=","repeats":1},{"count":136,"lower_bound":"MzY=","upper_bound":"M0U=","repeats":1},{"count":144,"lower_bound":"M0Y=","upper_bound":"M00=","repeats":1},{"count":152,"lower_bound":"M04=","upper_bound":"M1U=","repeats":1},{"count":160,"lower_bound":"M1c=","upper_bound":"M2o=","repeats":1},{"count":168,"lower_bound":"M20=","upper_bound":"M3I=","repeats":1},{"count":176,"lower_bound":"M3Q=","upper_bound":"M3g=","repeats":1},{"count":184,"lower_bound":"M3o=","upper_bound":"NDY=","repeats":1},{"count":192,"lower_bound":"NDc=","upper_bound":"NEY=","repeats":1},{"count":200,"lower_bound":"NEc=","upper_bound":"NEo=","repeats":1},{"count":208,"lower_bound":"NEs=","upper_bound":"NE4=","repeats":1},{"count":216,"lower_bound":"NFE=","upper_bound":"NFQ=","repeats":1},{"count":224,"lower_bound":"NFc=","upper_bound":"NGI=","repeats":1},{"count":232,"lower_bound":"NGY=","upper_bound":"NHI=","repeats":1},{"count":240,"lower_bound":"NHQ=","upper_bound":"NTM=","repeats":1},{"count":248,"lower_bound":"NTU=","upper_bound":"NTk=","repeats":1},{"count":256,"lower_bound":"NUE=","upper_bound":"NUQ=","repeats":1},{"count":264,"lower_bound":"NUg=","upper_bound":"NUs=","repeats":1},{"count":272,"lower_bound":"NUw=","upper_bound":"NVI=","repeats":1},{"count":280,"lower_bound":"NVM=","upper_bound":"NWE=","repeats":1},{"count":288,"lower_bound":"NWI=","upper_bound":"NWc=","repeats":1},{"count":296,"lower_bound":"NWs=","upper_bound":"Ng==","repeats":1},{"count":304,"lower_bound":"NjA=","upper_bound":"NjY=","repeats":1},{"count":312,"lower_bound":"Njc=","upper_bound":"NkM=","repeats":1},{"count":320,"lower_bound":"NkU=","upper_bound":"Nkw=","repeats":1},{"count":328,"lower_bound":"Nk0=","upper_bound":"NlE=","repeats":1},{"count":336,"lower_bound":"NlM=","upper_bound":"NmE=","repeats":1},{"count":344,"lower_bound":"NmI=","upper_bound":"Nmc=","repeats":1},{"count":352,"lower_bound":"Nmg=","upper_bound":"Nmw=","repeats":1},{"count":360,"lower_bound":"Nm0=","upper_bound":"NnE=","repeats":1},{"count":368,"lower_bound":"NnI=","upper_bound":"NnY=","repeats":1},{"count":376,"lower_bound":"Nnk=","upper_bound":"NzQ=","repeats":1},{"count":384,"lower_bound":"N0I=","upper_bound":"N0c=","repeats":1},{"count":392,"lower_bound":"N0g=","upper_bound":"N1M=","repeats":1},{"count":400,"lower_bound":"N1Q=","upper_bound":"N1k=","repeats":1},{"count":408,"lower_bound":"N1o=","upper_bound":"N2U=","repeats":1},{"count":416,"lower_bound":"N2k=","upper_bound":"N24=","repeats":1},{"count":424,"lower_bound":"N28=","upper_bound":"N3Q=","repeats":1},{"count":432,"lower_bound":"N3c=","upper_bound":"ODE=","repeats":1},{"count":440,"lower_bound":"ODI=","upper_bound":"OEI=","repeats":1},{"count":448,"lower_bound":"OEU=","upper_bound":"OEo=","repeats":1},{"count":456,"lower_bound":"OEs=","upper_bound":"OFI=","repeats":1},{"count":464,"lower_bound":"OFM=","upper_bound":"OFk=","repeats":1},{"count":472,"lower_bound":"OFo=","upper_bound":"OGY=","repeats":1},{"count":480,"lower_bound":"OGk=","upper_bound":"OHI=","repeats":1},{"count":488,"lower_bound":"OHQ=","upper_bound":"OHk=","repeats":1},{"count":496,"lower_bound":"OQ==","upper_bound":"OTY=","repeats":1},{"count":504,"lower_bound":"OTc=","upper_bound":"OUE=","repeats":1},{"count":512,"lower_bound":"OUI=","upper_bound":"OUg=","repeats":1},{"count":520,"lower_bound":"OUs=","upper_bound":"OVE=","repeats":1},{"count":528,"lower_bound":"OVI=","upper_bound":"OVY=","repeats":1},{"count":536,"lower_bound":"OWE=","upper_bound":"OWY=","repeats":1},{"count":544,"lower_bound":"OWc=","upper_bound":"OW0=","repeats":1},{"count":552,"lower_bound":"OW4=","upper_bound":"OXI=","repeats":1},{"count":560,"lower_bound":"OXQ=","upper_bound":"QTM=","repeats":1},{"count":568,"lower_bound":"QTU=","upper_bound":"QUc=","repeats":1},{"count":576,"lower_bound":"QUk=","upper_bound":"QU0=","repeats":1},{"count":584,"lower_bound":"QU4=","upper_bound":"QVE=","repeats":1},{"count":592,"lower_bound":"QVY=","upper_bound":"QWI=","repeats":1},{"count":600,"lower_bound":"QWM=","upper_bound":"QWc=","repeats":1},{"count":608,"lower_bound":"QWg=","upper_bound":"QW0=","repeats":1},{"count":616,"lower_bound":"QW8=","upper_bound":"QXQ=","repeats":1},{"count":624,"lower_bound":"Qg==","upper_bound":"QjU=","repeats":1},{"count":632,"lower_bound":"QjY=","upper_bound":"QkM=","repeats":1},{"count":640,"lower_bound":"QkQ=","upper_bound":"Qks=","repeats":1},{"count":648,"lower_bound":"Qk8=","upper_bound":"QlQ=","repeats":1},{"count":656,"lower_bound":"QlU=","upper_bound":"Qlk=","repeats":1},{"count":664,"lower_bound":"QmM=","upper_bound":"Qmg=","repeats":1},{"count":672,"lower_bound":"Qmk=","upper_bound":"Qmw=","repeats":1},{"count":680,"lower_bound":"Qm0=","upper_bound":"QnM=","repeats":1},{"count":688,"lower_bound":"QnQ=","upper_bound":"QzE=","repeats":1},{"count":696,"lower_bound":"QzI=","upper_bound":"QzY=","repeats":1},{"count":704,"lower_bound":"Qzc=","upper_bound":"Q0Y=","repeats":1},{"count":712,"lower_bound":"Q0c=","upper_bound":"Q0s=","repeats":1},{"count":720,"lower_bound":"Q0w=","upper_bound":"Q1I=","repeats":1},{"count":728,"lower_bound":"Q1M=","upper_bound":"Q1g=","repeats":1},{"count":736,"lower_bound":"Q2E=","upper_bound":"Q2c=","repeats":1},{"count":744,"lower_bound":"Q2g=","upper_bound":"Q24=","repeats":1},{"count":752,"lower_bound":"Q28=","upper_bound":"RDA=","repeats":1},{"count":760,"lower_bound":"RDE=","upper_bound":"RDc=","repeats":1},{"count":768,"lower_bound":"RDk=","upper_bound":"REU=","repeats":1},{"count":776,"lower_bound":"REY=","upper_bound":"REs=","repeats":1},{"count":784,"lower_bound":"REw=","upper_bound":"RFA=","repeats":1},{"count":792,"lower_bound":"RFE=","upper_bound":"RFU=","repeats":1},{"count":800,"lower_bound":"RFc=","upper_bound":"RGE=","repeats":1},{"count":808,"lower_bound":"RGI=","upper_bound":"RGY=","repeats":1},{"count":816,"lower_bound":"RGc=","upper_bound":"RHQ=","repeats":1},{"count":824,"lower_bound":"RHU=","upper_bound":"RTI=","repeats":1},{"count":832,"lower_bound":"RTM=","upper_bound":"RTg=","repeats":1},{"count":840,"lower_bound":"RTk=","upper_bound":"RUY=","repeats":1},{"count":848,"lower_bound":"RUc=","upper_bound":"RUo=","repeats":1},{"count":856,"lower_bound":"RU0=","upper_bound":"RVM=","repeats":1},{"count":864,"lower_bound":"RVQ=","upper_bound":"RVo=","repeats":1},{"count":872,"lower_bound":"RWM=","upper_bound":"RWs=","repeats":1},{"count":880,"lower_bound":"RWw=","upper_bound":"RXA=","repeats":1},{"count":888,"lower_bound":"RXM=","upper_bound":"RXo=","repeats":1},{"count":896,"lower_bound":"RjI=","upper_bound":"RkI=","repeats":1},{"count":904,"lower_bound":"RkY=","upper_bound":"RlQ=","repeats":1},{"count":912,"lower_bound":"RlY=","upper_bound":"RmE=","repeats":1},{"count":920,"lower_bound":"RmM=","upper_bound":"RmY=","repeats":1},{"count":928,"lower_bound":"Rmc=","upper_bound":"Rms=","repeats":1},{"count":936,"lower_bound":"Rm0=","upper_bound":"Rnk=","repeats":1},{"count":944,"lower_bound":"RzM=","upper_bound":"Rzg=","repeats":1},{"count":952,"lower_bound":"Rzk=","upper_bound":"R0U=","repeats":1},{"count":960,"lower_bound":"R0Y=","upper_bound":"R0s=","repeats":1},{"count":968,"lower_bound":"R0w=","upper_bound":"R08=","repeats":1},{"count":976,"lower_bound":"R1A=","upper_bound":"R1Q=","repeats":1},{"count":984,"lower_bound":"R1U=","upper_bound":"R2E=","repeats":1},{"count":992,"lower_bound":"R2Q=","upper_bound":"R2c=","repeats":1},{"count":1000,"lower_bound":"R2g=","upper_bound":"R28=","repeats":1},{"count":1008,"lower_bound":"R3A=","upper_bound":"R3Y=","repeats":1},{"count":1016,"lower_bound":"R3c=","upper_bound":"SDM=","repeats":1},{"count":1024,"lower_bound":"SDQ=","upper_bound":"SDc=","repeats":1},{"count":1032,"lower_bound":"SDg=","upper_bound":"SEQ=","repeats":1},{"count":1040,"lower_bound":"SEY=","upper_bound":"SFA=","repeats":1},{"count":1048,"lower_bound":"SFU=","upper_bound":"SGE=","repeats":1},{"count":1056,"lower_bound":"SGI=","upper_bound":"SGw=","repeats":1},{"count":1064,"lower_bound":"SG4=","upper_bound":"SHU=","repeats":1},{"count":1072,"lower_bound":"SHY=","upper_bound":"STY=","repeats":1},{"count":1080,"lower_bound":"STg=","upper_bound":"SUk=","repeats":1},{"count":1088,"lower_bound":"SUo=","upper_bound":"SVM=","repeats":1},{"count":1096,"lower_bound":"SVQ=","upper_bound":"SVk=","repeats":1},{"count":1104,"lower_bound":"SVo=","upper_bound":"SWg=","repeats":1},{"count":1112,"lower_bound":"SWs=","upper_bound":"SXE=","repeats":1},{"count":1120,"lower_bound":"SXI=","upper_bound":"SXY=","repeats":1},{"count":1128,"lower_bound":"SXg=","upper_bound":"SjM=","repeats":1},{"count":1136,"lower_bound":"SjY=","upper_bound":"Skc=","repeats":1},{"count":1144,"lower_bound":"Skk=","upper_bound":"Sk4=","repeats":1},{"count":1152,"lower_bound":"SlA=","upper_bound":"SlQ=","repeats":1},{"count":1160,"lower_bound":"Slk=","upper_bound":"Smk=","repeats":1},{"count":1168,"lower_bound":"Sms=","upper_bound":"SnQ=","repeats":1},{"count":1176,"lower_bound":"SnU=","upper_bound":"Snk=","repeats":1},{"count":1184,"lower_bound":"Sw==","upper_bound":"Szg=","repeats":1},{"count":1192,"lower_bound":"Szk=","upper_bound":"S0c=","repeats":1},{"count":1200,"lower_bound":"S0g=","upper_bound":"S00=","repeats":1},{"count":1208,"lower_bound":"S1E=","upper_bound":"S1U=","repeats":1},{"count":1216,"lower_bound":"S1g=","upper_bound":"S2U=","repeats":1},{"count":1224,"lower_bound":"S2g=","upper_bound":"S3U=","repeats":1},{"count":1232,"lower_bound":"S3Y=","upper_bound":"TDQ=","repeats":1},{"count":1240,"lower_bound":"TDc=","upper_bound":"TEI=","repeats":1},{"count":1248,"lower_bound":"TEM=","upper_bound":"TEc=","repeats":1},{"count":1256,"lower_bound":"TEo=","upper_bound":"TE8=","repeats":1},{"count":1264,"lower_bound":"TFE=","upper_bound":"TFU=","repeats":1},{"count":1272,"lower_bound":"TFk=","upper_bound":"TGQ=","repeats":1},{"count":1280,"lower_bound":"TGU=","upper_bound":"TGw=","repeats":1},{"count":1288,"lower_bound":"TG8=","upper_bound":"THY=","repeats":1},{"count":1296,"lower_bound":"THc=","upper_bound":"TTE=","repeats":1},{"count":1304,"lower_bound":"TTM=","upper_bound":"TTc=","repeats":1},{"count":1312,"lower_bound":"TUY=","upper_bound":"TUk=","repeats":1},{"count":1320,"lower_bound":"TUo=","upper_bound":"TU4=","repeats":1},{"count":1328,"lower_bound":"TU8=","upper_bound":"TVM=","repeats":1},{"count":1336,"lower_bound":"TVY=","upper_bound":"TWE=","repeats":1},{"count":1344,"lower_bound":"TWI=","upper_bound":"TWc=","repeats":1},{"count":1352,"lower_bound":"TWk=","upper_bound":"TXA=","repeats":1},{"count":1360,"lower_bound":"TXE=","upper_bound":"TXc=","repeats":1},{"count":1368,"lower_bound":"TXk=","upper_bound":"TjE=","repeats":1},{"count":1376,"lower_bound":"TjI=","upper_bound":"Tjk=","repeats":1},{"count":1384,"lower_bound":"TkE=","upper_bound":"Tkc=","repeats":1},{"count":1392,"lower_bound":"Tkg=","upper_bound":"Tkw=","repeats":1},{"count":1400,"lower_bound":"Tk0=","upper_bound":"TlI=","repeats":1},{"count":1408,"lower_bound":"TlM=","upper_bound":"Tlg=","repeats":1},{"count":1416,"lower_bound":"TmI=","upper_bound":"Tmw=","repeats":1},{"count":1424,"lower_bound":"Tm8=","upper_bound":"TnQ=","repeats":1},{"count":1432,"lower_bound":"TnU=","upper_bound":"TzE=","repeats":1},{"count":1440,"lower_bound":"TzI=","upper_bound":"TzY=","repeats":1},{"count":1448,"lower_bound":"Tzk=","upper_bound":"T0U=","repeats":1},{"count":1456,"lower_bound":"T0c=","upper_bound":"T0w=","repeats":1},{"count":1464,"lower_bound":"T1Q=","upper_bound":"T1k=","repeats":1},{"count":1472,"lower_bound":"T2I=","upper_bound":"T2Y=","repeats":1},{"count":1480,"lower_bound":"T2s=","upper_bound":"T24=","repeats":1},{"count":1488,"lower_bound":"T3E=","upper_bound":"T3g=","repeats":1},{"count":1496,"lower_bound":"T3o=","upper_bound":"UDQ=","repeats":1},{"count":1504,"lower_bound":"UDU=","upper_bound":"UEE=","repeats":1},{"count":1512,"lower_bound":"UEY=","upper_bound":"UE4=","repeats":1},{"count":1520,"lower_bound":"UFE=","upper_bound":"UFQ=","repeats":1},{"count":1528,"lower_bound":"UFc=","upper_bound":"UFo=","repeats":1},{"count":1536,"lower_bound":"UGQ=","upper_bound":"UGg=","repeats":1},{"count":1544,"lower_bound":"UGs=","upper_bound":"UG4=","repeats":1},{"count":1552,"lower_bound":"UHA=","upper_bound":"UHg=","repeats":1},{"count":1560,"lower_bound":"UHk=","upper_bound":"UTM=","repeats":1},{"count":1568,"lower_bound":"UTQ=","upper_bound":"UTk=","repeats":1},{"count":1576,"lower_bound":"UUQ=","upper_bound":"UUg=","repeats":1},{"count":1584,"lower_bound":"UUw=","upper_bound":"UVA=","repeats":1},{"count":1592,"lower_bound":"UVM=","upper_bound":"UVY=","repeats":1},{"count":1600,"lower_bound":"UVc=","upper_bound":"UVo=","repeats":1},{"count":1608,"lower_bound":"UWM=","upper_bound":"UWg=","repeats":1},{"count":1616,"lower_bound":"UWs=","upper_bound":"UW4=","repeats":1},{"count":1624,"lower_bound":"UXE=","upper_bound":"UXU=","repeats":1},{"count":1632,"lower_bound":"UXY=","upper_bound":"UjE=","repeats":1},{"count":1640,"lower_bound":"UjI=","upper_bound":"Ujc=","repeats":1},{"count":1648,"lower_bound":"Ujk=","upper_bound":"UkY=","repeats":1},{"count":1656,"lower_bound":"Ukc=","upper_bound":"Uk0=","repeats":1},{"count":1664,"lower_bound":"Uk4=","upper_bound":"UlM=","repeats":1},{"count":1672,"lower_bound":"UlQ=","upper_bound":"Ulk=","repeats":1},{"count":1680,"lower_bound":"Ulo=","upper_bound":"UmY=","repeats":1},{"count":1688,"lower_bound":"Umc=","upper_bound":"Ums=","repeats":1},{"count":1696,"lower_bound":"Umw=","upper_bound":"UnM=","repeats":1},{"count":1704,"lower_bound":"UnQ=","upper_bound":"Ung=","repeats":1},{"count":1712,"lower_bound":"Uw==","upper_bound":"UzU=","repeats":1},{"count":1720,"lower_bound":"Uzk=","upper_bound":"U0Q=","repeats":1},{"count":1728,"lower_bound":"U0g=","upper_bound":"U0s=","repeats":1},{"count":1736,"lower_bound":"U00=","upper_bound":"U1A=","repeats":1},{"count":1744,"lower_bound":"U1E=","upper_bound":"U1o=","repeats":1},{"count":1752,"lower_bound":"U2E=","upper_bound":"U2s=","repeats":1},{"count":1760,"lower_bound":"U3E=","upper_bound":"U3Y=","repeats":1},{"count":1768,"lower_bound":"U3c=","upper_bound":"U3o=","repeats":1},{"count":1776,"lower_bound":"VDA=","upper_bound":"VDU=","repeats":1},{"count":1784,"lower_bound":"VDc=","upper_bound":"VEY=","repeats":1},{"count":1792,"lower_bound":"VEg=","upper_bound":"VEw=","repeats":1},{"count":1800,"lower_bound":"VE0=","upper_bound":"VFA=","repeats":1},{"count":1808,"lower_bound":"VFE=","upper_bound":"VFg=","repeats":1},{"count":1816,"lower_bound":"VFk=","upper_bound":"VGY=","repeats":1},{"count":1824,"lower_bound":"VGc=","upper_bound":"VHA=","repeats":1},{"count":1832,"lower_bound":"VHE=","upper_bound":"VHQ=","repeats":1},{"count":1840,"lower_bound":"VHY=","upper_bound":"VTI=","repeats":1},{"count":1848,"lower_bound":"VTc=","upper_bound":"VU0=","repeats":1},{"count":1856,"lower_bound":"VU4=","upper_bound":"VVI=","repeats":1},{"count":1864,"lower_bound":"VVM=","upper_bound":"VWE=","repeats":1},{"count":1872,"lower_bound":"VWI=","upper_bound":"VWY=","repeats":1},{"count":1880,"lower_bound":"VWg=","upper_bound":"VW8=","repeats":1},{"count":1888,"lower_bound":"VXA=","upper_bound":"VXY=","repeats":1},{"count":1896,"lower_bound":"VXc=","upper_bound":"VjE=","repeats":1},{"count":1904,"lower_bound":"VjM=","upper_bound":"Vjg=","repeats":1},{"count":1912,"lower_bound":"Vjk=","upper_bound":"VkM=","repeats":1},{"count":1920,"lower_bound":"VkQ=","upper_bound":"Vkk=","repeats":1},{"count":1928,"lower_bound":"Vkw=","upper_bound":"Vk8=","repeats":1},{"count":1936,"lower_bound":"VlI=","upper_bound":"Vlc=","repeats":1},{"count":1944,"lower_bound":"VmE=","upper_bound":"Vmw=","repeats":1},{"count":1952,"lower_bound":"Vm0=","upper_bound":"VnQ=","repeats":1},{"count":1960,"lower_bound":"VnU=","upper_bound":"VzA=","repeats":1},{"count":1968,"lower_bound":"VzE=","upper_bound":"VzY=","repeats":1},{"count":1976,"lower_bound":"Vzg=","upper_bound":"Wg==","repeats":1},{"count":1984,"lower_bound":"Yg==","upper_bound":"Zg==","repeats":1},{"count":1992,"lower_bound":"aQ==","upper_bound":"bg==","repeats":1},{"count":2000,"lower_bound":"bw==","upper_bound":"eg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,2,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,1,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,2,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,2,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,1,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,1,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,2,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,1,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,3,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,2,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,2,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,3,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,4,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,2,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,2,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,2,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,1,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,3,2,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,3,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,1,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,3,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,2,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,2,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,4,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,3,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,3,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,2,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,1,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,2,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,1,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,2,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,1,1,0,2,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952028532539392},"dic":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MTg=","repeats":1},{"count":16,"lower_bound":"MTk=","upper_bound":"MUQ=","repeats":1},{"count":24,"lower_bound":"MUU=","upper_bound":"MU0=","repeats":1},{"count":32,"lower_bound":"MU8=","upper_bound":"MVQ=","repeats":1},{"count":40,"lower_bound":"MVU=","upper_bound":"MVo=","repeats":1},{"count":48,"lower_bound":"MWI=","upper_bound":"MWY=","repeats":1},{"count":56,"lower_bound":"MWg=","upper_bound":"MW4=","repeats":1},{"count":64,"lower_bound":"MW8=","upper_bound":"MXU=","repeats":1},{"count":72,"lower_bound":"MXY=","upper_bound":"MXo=","repeats":1},{"count":80,"lower_bound":"MjA=","upper_bound":"Mjk=","repeats":1},{"count":88,"lower_bound":"MkE=","upper_bound":"Mkg=","repeats":1},{"count":96,"lower_bound":"Mkk=","upper_bound":"MlA=","repeats":1},{"count":104,"lower_bound":"MlM=","upper_bound":"Mlk=","repeats":1},{"count":112,"lower_bound":"MmI=","upper_bound":"Mmg=","repeats":1},{"count":120,"lower_bound":"Mm8=","upper_bound":"MnI=","repeats":1},{"count":128,"lower_bound":"MnM=","upper_bound":"Mnk=","repeats":1},{"count":136,"lower_bound":"Mno=","upper_bound":"MzU=","repeats":1},{"count":144,"lower_bound":"MzY=","upper_bound":"M0M=","repeats":1},{"count":152,"lower_bound":"M0w=","upper_bound":"M1M=","repeats":1},{"count":160,"lower_bound":"M1Q=","upper_bound":"M2Y=","repeats":1},{"count":168,"lower_bound":"M2k=","upper_bound":"M3A=","repeats":1},{"count":176,"lower_bound":"M3I=","upper_bound":"NDA=","repeats":1},{"count":184,"lower_bound":"NDc=","upper_bound":"NEM=","repeats":1},{"count":192,"lower_bound":"NEQ=","upper_bound":"NEs=","repeats":1},{"count":200,"lower_bound":"NE0=","upper_bound":"NFM=","repeats":1},{"count":208,"lower_bound":"NFQ=","upper_bound":"NFo=","repeats":1},{"count":216,"lower_bound":"NGE=","upper_bound":"NGg=","repeats":1},{"count":224,"lower_bound":"NGk=","upper_bound":"NG0=","repeats":1},{"count":232,"lower_bound":"NHI=","upper_bound":"NHc=","repeats":1},{"count":240,"lower_bound":"NTE=","upper_bound":"NUE=","repeats":1},{"count":248,"lower_bound":"NUI=","upper_bound":"NUc=","repeats":1},{"count":256,"lower_bound":"NUk=","upper_bound":"NU4=","repeats":1},{"count":264,"lower_bound":"NU8=","upper_bound":"NVU=","repeats":1},{"count":272,"lower_bound":"NVg=","upper_bound":"NWU=","repeats":1},{"count":280,"lower_bound":"NWY=","upper_bound":"NWs=","repeats":1},{"count":288,"lower_bound":"NWw=","upper_bound":"NXE=","repeats":1},{"count":296,"lower_bound":"NXQ=","upper_bound":"NXg=","repeats":1},{"count":304,"lower_bound":"NXo=","upper_bound":"NjM=","repeats":1},{"count":312,"lower_bound":"NjQ=","upper_bound":"NkE=","repeats":1},{"count":320,"lower_bound":"NkM=","upper_bound":"Nkg=","repeats":1},{"count":328,"lower_bound":"Nkk=","upper_bound":"NlE=","repeats":1},{"count":336,"lower_bound":"NlI=","upper_bound":"NmY=","repeats":1},{"count":344,"lower_bound":"Nmg=","upper_bound":"NnE=","repeats":1},{"count":352,"lower_bound":"NnU=","upper_bound":"NzE=","repeats":1},{"count":360,"lower_bound":"NzI=","upper_bound":"N0M=","repeats":1},{"count":368,"lower_bound":"N0Q=","upper_bound":"N0k=","repeats":1},{"count":376,"lower_bound":"N0o=","upper_bound":"N1E=","repeats":1},{"count":384,"lower_bound":"N1I=","upper_bound":"N1c=","repeats":1},{"count":392,"lower_bound":"N1g=","upper_bound":"N2Y=","repeats":1},{"count":400,"lower_bound":"N2k=","upper_bound":"N3Y=","repeats":1},{"count":408,"lower_bound":"N3g=","upper_bound":"OEE=","repeats":1},{"count":416,"lower_bound":"OEI=","upper_bound":"OEo=","repeats":1},{"count":424,"lower_bound":"OEs=","upper_bound":"OE4=","repeats":1},{"count":432,"lower_bound":"OE8=","upper_bound":"OFQ=","repeats":1},{"count":440,"lower_bound":"OFg=","upper_bound":"OGQ=","repeats":1},{"count":448,"lower_bound":"OGY=","upper_bound":"OGw=","repeats":1},{"count":456,"lower_bound":"OG4=","upper_bound":"OHM=","repeats":1},{"count":464,"lower_bound":"OHQ=","upper_bound":"OHo=","repeats":1},{"count":472,"lower_bound":"OQ==","upper_bound":"OTI=","repeats":1},{"count":480,"lower_bound":"OTU=","upper_bound":"OUM=","repeats":1},{"count":488,"lower_bound":"OUQ=","upper_bound":"OUo=","repeats":1},{"count":496,"lower_bound":"OU0=","upper_bound":"OVE=","repeats":1},{"count":504,"lower_bound":"OVM=","upper_bound":"OVg=","repeats":1},{"count":512,"lower_bound":"OVk=","upper_bound":"OWQ=","repeats":1},{"count":520,"lower_bound":"OWU=","upper_bound":"OWw=","repeats":1},{"count":528,"lower_bound":"OW0=","upper_bound":"OXM=","repeats":1},{"count":536,"lower_bound":"OXU=","upper_bound":"OXg=","repeats":1},{"count":544,"lower_bound":"OXk=","upper_bound":"QTM=","repeats":1},{"count":552,"lower_bound":"QTQ=","upper_bound":"QUM=","repeats":1},{"count":560,"lower_bound":"QUU=","upper_bound":"QUo=","repeats":1},{"count":568,"lower_bound":"QUs=","upper_bound":"QU8=","repeats":1},{"count":576,"lower_bound":"QVA=","upper_bound":"QVY=","repeats":1},{"count":584,"lower_bound":"QVc=","upper_bound":"QWI=","repeats":1},{"count":592,"lower_bound":"QWU=","upper_bound":"QWw=","repeats":1},{"count":600,"lower_bound":"QW0=","upper_bound":"QXI=","repeats":1},{"count":608,"lower_bound":"QXQ=","upper_bound":"QXg=","repeats":1},{"count":616,"lower_bound":"QXk=","upper_bound":"QjY=","repeats":1},{"count":624,"lower_bound":"Qjk=","upper_bound":"QkY=","repeats":1},{"count":632,"lower_bound":"Qkc=","upper_bound":"Qkw=","repeats":1},{"count":640,"lower_bound":"Qk8=","upper_bound":"Qlc=","repeats":1},{"count":648,"lower_bound":"Qlg=","upper_bound":"QmQ=","repeats":1},{"count":656,"lower_bound":"QmY=","upper_bound":"Qms=","repeats":1},{"count":664,"lower_bound":"Qmw=","upper_bound":"Qnc=","repeats":1},{"count":672,"lower_bound":"Qw==","upper_bound":"QzQ=","repeats":1},{"count":680,"lower_bound":"Qzg=","upper_bound":"Q0Q=","repeats":1},{"count":688,"lower_bound":"Q0g=","upper_bound":"Q0s=","repeats":1},{"count":696,"lower_bound":"Q0w=","upper_bound":"Q1E=","repeats":1},{"count":704,"lower_bound":"Q1M=","upper_bound":"Q1g=","repeats":1},{"count":712,"lower_bound":"Q1o=","upper_bound":"Q2U=","repeats":1},{"count":720,"lower_bound":"Q2Y=","upper_bound":"Q2s=","repeats":1},{"count":728,"lower_bound":"Q2w=","upper_bound":"Q3E=","repeats":1},{"count":736,"lower_bound":"Q3M=","upper_bound":"Q3k=","repeats":1},{"count":744,"lower_bound":"RDA=","upper_bound":"RDc=","repeats":1},{"count":752,"lower_bound":"RDg=","upper_bound":"REM=","repeats":1},{"count":760,"lower_bound":"REQ=","upper_bound":"REg=","repeats":1},{"count":768,"lower_bound":"REk=","upper_bound":"RE8=","repeats":1},{"count":776,"lower_bound":"RFM=","upper_bound":"RFc=","repeats":1},{"count":784,"lower_bound":"RFg=","upper_bound":"RGI=","repeats":1},{"count":792,"lower_bound":"RGQ=","upper_bound":"RGo=","repeats":1},{"count":800,"lower_bound":"RGs=","upper_bound":"RHA=","repeats":1},{"count":808,"lower_bound":"RHE=","upper_bound":"RHk=","repeats":1},{"count":816,"lower_bound":"RTI=","upper_bound":"RTc=","repeats":1},{"count":824,"lower_bound":"RTk=","upper_bound":"RUM=","repeats":1},{"count":832,"lower_bound":"RUQ=","upper_bound":"RU8=","repeats":1},{"count":840,"lower_bound":"RVA=","upper_bound":"RVU=","repeats":1},{"count":848,"lower_bound":"RVc=","upper_bound":"RWM=","repeats":1},{"count":856,"lower_bound":"RWU=","upper_bound":"RWk=","repeats":1},{"count":864,"lower_bound":"RWw=","upper_bound":"RXI=","repeats":1},{"count":872,"lower_bound":"RXQ=","upper_bound":"RXk=","repeats":1},{"count":880,"lower_bound":"RjA=","upper_bound":"RjQ=","repeats":1},{"count":888,"lower_bound":"RjY=","upper_bound":"Rkk=","repeats":1},{"count":896,"lower_bound":"Rko=","upper_bound":"RlA=","repeats":1},{"count":904,"lower_bound":"RlE=","upper_bound":"Rlo=","repeats":1},{"count":912,"lower_bound":"RmE=","upper_bound":"RmU=","repeats":1},{"count":920,"lower_bound":"Rmc=","upper_bound":"RnM=","repeats":1},{"count":928,"lower_bound":"RnQ=","upper_bound":"Rng=","repeats":1},{"count":936,"lower_bound":"Rno=","upper_bound":"RzE=","repeats":1},{"count":944,"lower_bound":"RzM=","upper_bound":"Rzk=","repeats":1},{"count":952,"lower_bound":"R0M=","upper_bound":"R0g=","repeats":1},{"count":960,"lower_bound":"R0o=","upper_bound":"R1A=","repeats":1},{"count":968,"lower_bound":"R1M=","upper_bound":"R2E=","repeats":1},{"count":976,"lower_bound":"R2M=","upper_bound":"R2s=","repeats":1},{"count":984,"lower_bound":"R3A=","upper_bound":"R3Q=","repeats":1},{"count":992,"lower_bound":"R3c=","upper_bound":"SA==","repeats":1},{"count":1000,"lower_bound":"SDA=","upper_bound":"SDY=","repeats":1},{"count":1008,"lower_bound":"SDc=","upper_bound":"SEc=","repeats":1},{"count":1016,"lower_bound":"SEg=","upper_bound":"SE4=","repeats":1},{"count":1024,"lower_bound":"SE8=","upper_bound":"SFI=","repeats":1},{"count":1032,"lower_bound":"SFM=","upper_bound":"SGM=","repeats":1},{"count":1040,"lower_bound":"SGQ=","upper_bound":"SG4=","repeats":1},{"count":1048,"lower_bound":"SG8=","upper_bound":"SHM=","repeats":1},{"count":1056,"lower_bound":"SHQ=","upper_bound":"SHo=","repeats":1},{"count":1064,"lower_bound":"SQ==","upper_bound":"STQ=","repeats":1},{"count":1072,"lower_bound":"STU=","upper_bound":"SUQ=","repeats":1},{"count":1080,"lower_bound":"SUU=","upper_bound":"SUo=","repeats":1},{"count":1088,"lower_bound":"SUs=","upper_bound":"SVQ=","repeats":1},{"count":1096,"lower_bound":"SVc=","upper_bound":"SWE=","repeats":1},{"count":1104,"lower_bound":"SWM=","upper_bound":"SWk=","repeats":1},{"count":1112,"lower_bound":"SWo=","upper_bound":"SW8=","repeats":1},{"count":1120,"lower_bound":"SXE=","upper_bound":"SXY=","repeats":1},{"count":1128,"lower_bound":"SXg=","upper_bound":"SjE=","repeats":1},{"count":1136,"lower_bound":"SjI=","upper_bound":"Sjg=","repeats":1},{"count":1144,"lower_bound":"Sjk=","upper_bound":"Skw=","repeats":1},{"count":1152,"lower_bound":"Sk0=","upper_bound":"SlQ=","repeats":1},{"count":1160,"lower_bound":"SlU=","upper_bound":"SmM=","repeats":1},{"count":1168,"lower_bound":"SmU=","upper_bound":"Sms=","repeats":1},{"count":1176,"lower_bound":"Smw=","upper_bound":"SnI=","repeats":1},{"count":1184,"lower_bound":"Sng=","upper_bound":"SzA=","repeats":1},{"count":1192,"lower_bound":"SzE=","upper_bound":"SzU=","repeats":1},{"count":1200,"lower_bound":"Szg=","upper_bound":"S0Q=","repeats":1},{"count":1208,"lower_bound":"S0Y=","upper_bound":"S00=","repeats":1},{"count":1216,"lower_bound":"S04=","upper_bound":"S1E=","repeats":1},{"count":1224,"lower_bound":"S1c=","upper_bound":"S2Q=","repeats":1},{"count":1232,"lower_bound":"S2U=","upper_bound":"S2g=","repeats":1},{"count":1240,"lower_bound":"S2k=","upper_bound":"S28=","repeats":1},{"count":1248,"lower_bound":"S3Q=","upper_bound":"TDA=","repeats":1},{"count":1256,"lower_bound":"TDE=","upper_bound":"TDY=","repeats":1},{"count":1264,"lower_bound":"TDk=","upper_bound":"TEM=","repeats":1},{"count":1272,"lower_bound":"TEQ=","upper_bound":"TEc=","repeats":1},{"count":1280,"lower_bound":"TEk=","upper_bound":"TE8=","repeats":1},{"count":1288,"lower_bound":"TFA=","upper_bound":"TFg=","repeats":1},{"count":1296,"lower_bound":"TFo=","upper_bound":"TGM=","repeats":1},{"count":1304,"lower_bound":"TGQ=","upper_bound":"TGk=","repeats":1},{"count":1312,"lower_bound":"TGo=","upper_bound":"TG4=","repeats":1},{"count":1320,"lower_bound":"THA=","upper_bound":"THg=","repeats":1},{"count":1328,"lower_bound":"TQ==","upper_bound":"TTg=","repeats":1},{"count":1336,"lower_bound":"TTk=","upper_bound":"TUU=","repeats":1},{"count":1344,"lower_bound":"TUo=","upper_bound":"TVE=","repeats":1},{"count":1352,"lower_bound":"TVI=","upper_bound":"TVc=","repeats":1},{"count":1360,"lower_bound":"TVo=","upper_bound":"TWQ=","repeats":1},{"count":1368,"lower_bound":"TWY=","upper_bound":"TW0=","repeats":1},{"count":1376,"lower_bound":"TW4=","upper_bound":"TXQ=","repeats":1},{"count":1384,"lower_bound":"TXU=","upper_bound":"TXo=","repeats":1},{"count":1392,"lower_bound":"TjE=","upper_bound":"TjQ=","repeats":1},{"count":1400,"lower_bound":"TjU=","upper_bound":"TkE=","repeats":1},{"count":1408,"lower_bound":"TkI=","upper_bound":"Tkc=","repeats":1},{"count":1416,"lower_bound":"Tkg=","upper_bound":"TlE=","repeats":1},{"count":1424,"lower_bound":"TlQ=","upper_bound":"TmQ=","repeats":1},{"count":1432,"lower_bound":"TmU=","upper_bound":"Tmk=","repeats":1},{"count":1440,"lower_bound":"Tmo=","upper_bound":"Tm8=","repeats":1},{"count":1448,"lower_bound":"TnI=","upper_bound":"Tnc=","repeats":1},{"count":1456,"lower_bound":"Tnk=","upper_bound":"TzE=","repeats":1},{"count":1464,"lower_bound":"TzU=","upper_bound":"T0c=","repeats":1},{"count":1472,"lower_bound":"T0g=","upper_bound":"T00=","repeats":1},{"count":1480,"lower_bound":"T1A=","upper_bound":"T1Q=","repeats":1},{"count":1488,"lower_bound":"T1U=","upper_bound":"T2I=","repeats":1},{"count":1496,"lower_bound":"T2Q=","upper_bound":"T2s=","repeats":1},{"count":1504,"lower_bound":"T24=","upper_bound":"T3I=","repeats":1},{"count":1512,"lower_bound":"T3M=","upper_bound":"T3o=","repeats":1},{"count":1520,"lower_bound":"UDA=","upper_bound":"UDU=","repeats":1},{"count":1528,"lower_bound":"UDc=","upper_bound":"UEE=","repeats":1},{"count":1536,"lower_bound":"UEM=","upper_bound":"UEg=","repeats":1},{"count":1544,"lower_bound":"UEo=","upper_bound":"UFA=","repeats":1},{"count":1552,"lower_bound":"UFE=","upper_bound":"UFo=","repeats":1},{"count":1560,"lower_bound":"UGI=","upper_bound":"UGY=","repeats":1},{"count":1568,"lower_bound":"UGc=","upper_bound":"UHA=","repeats":1},{"count":1576,"lower_bound":"UHI=","upper_bound":"UHg=","repeats":1},{"count":1584,"lower_bound":"UHk=","upper_bound":"UTA=","repeats":1},{"count":1592,"lower_bound":"UTI=","upper_bound":"UUE=","repeats":1},{"count":1600,"lower_bound":"UUU=","upper_bound":"UU0=","repeats":1},{"count":1608,"lower_bound":"UU4=","upper_bound":"UVc=","repeats":1},{"count":1616,"lower_bound":"UWE=","upper_bound":"UWg=","repeats":1},{"count":1624,"lower_bound":"UWo=","upper_bound":"UW8=","repeats":1},{"count":1632,"lower_bound":"UXE=","upper_bound":"UXU=","repeats":1},{"count":1640,"lower_bound":"UXo=","upper_bound":"UjQ=","repeats":1},{"count":1648,"lower_bound":"UjU=","upper_bound":"Ujk=","repeats":1},{"count":1656,"lower_bound":"UkE=","upper_bound":"Ukg=","repeats":1},{"count":1664,"lower_bound":"Ukk=","upper_bound":"Uk4=","repeats":1},{"count":1672,"lower_bound":"Uk8=","upper_bound":"UlQ=","repeats":1},{"count":1680,"lower_bound":"Ulc=","upper_bound":"Ulo=","repeats":1},{"count":1688,"lower_bound":"UmE=","upper_bound":"Umg=","repeats":1},{"count":1696,"lower_bound":"Umk=","upper_bound":"Um4=","repeats":1},{"count":1704,"lower_bound":"UnI=","upper_bound":"Unk=","repeats":1},{"count":1712,"lower_bound":"UzA=","upper_bound":"UzY=","repeats":1},{"count":1720,"lower_bound":"U0I=","upper_bound":"U0o=","repeats":1},{"count":1728,"lower_bound":"U0s=","upper_bound":"U1E=","repeats":1},{"count":1736,"lower_bound":"U1I=","upper_bound":"U1Y=","repeats":1},{"count":1744,"lower_bound":"U1g=","upper_bound":"U2U=","repeats":1},{"count":1752,"lower_bound":"U2Y=","upper_bound":"U2o=","repeats":1},{"count":1760,"lower_bound":"U2w=","upper_bound":"U3I=","repeats":1},{"count":1768,"lower_bound":"U3Q=","upper_bound":"VA==","repeats":1},{"count":1776,"lower_bound":"VDA=","upper_bound":"VDU=","repeats":1},{"count":1784,"lower_bound":"VDY=","upper_bound":"VEQ=","repeats":1},{"count":1792,"lower_bound":"VEU=","upper_bound":"VE4=","repeats":1},{"count":1800,"lower_bound":"VE8=","upper_bound":"VFI=","repeats":1},{"count":1808,"lower_bound":"VFM=","upper_bound":"VGE=","repeats":1},{"count":1816,"lower_bound":"VGM=","upper_bound":"VGk=","repeats":1},{"count":1824,"lower_bound":"VGo=","upper_bound":"VHk=","repeats":1},{"count":1832,"lower_bound":"VHo=","upper_bound":"VTI=","repeats":1},{"count":1840,"lower_bound":"VTM=","upper_bound":"VUI=","repeats":1},{"count":1848,"lower_bound":"VUM=","upper_bound":"VUw=","repeats":1},{"count":1856,"lower_bound":"VU8=","upper_bound":"VVg=","repeats":1},{"count":1864,"lower_bound":"VWI=","upper_bound":"VWY=","repeats":1},{"count":1872,"lower_bound":"VWc=","upper_bound":"VWo=","repeats":1},{"count":1880,"lower_bound":"VWs=","upper_bound":"VW4=","repeats":1},{"count":1888,"lower_bound":"VW8=","upper_bound":"VXM=","repeats":1},{"count":1896,"lower_bound":"VXY=","upper_bound":"Vg==","repeats":1},{"count":1904,"lower_bound":"VjI=","upper_bound":"Vjg=","repeats":1},{"count":1912,"lower_bound":"Vjk=","upper_bound":"Vkc=","repeats":1},{"count":1920,"lower_bound":"Vkg=","upper_bound":"Vk4=","repeats":1},{"count":1928,"lower_bound":"VlE=","upper_bound":"Vlg=","repeats":1},{"count":1936,"lower_bound":"Vlk=","upper_bound":"VmY=","repeats":1},{"count":1944,"lower_bound":"Vmc=","upper_bound":"Vmo=","repeats":1},{"count":1952,"lower_bound":"Vms=","upper_bound":"VnI=","repeats":1},{"count":1960,"lower_bound":"VnM=","upper_bound":"Vnc=","repeats":1},{"count":1968,"lower_bound":"Vnk=","upper_bound":"VzQ=","repeats":1},{"count":1976,"lower_bound":"VzU=","upper_bound":"V0M=","repeats":1},{"count":1984,"lower_bound":"V0U=","upper_bound":"Yw==","repeats":1},{"count":1992,"lower_bound":"Zg==","upper_bound":"bA==","repeats":1},{"count":2000,"lower_bound":"bQ==","upper_bound":"eg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,2,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,1,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,2,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,2,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,1,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,1,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,2,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,1,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,3,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,2,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,2,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,3,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,4,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,2,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,2,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,2,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,1,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,3,2,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,3,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,1,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,3,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,2,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,2,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,4,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,3,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,3,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,2,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,1,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,2,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,1,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,2,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,1,1,0,2,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952028645785600},"ds":{"histogram":{"ndv":366,"buckets":[{"count":14,"lower_bound":"MjAxNi0wMS0wMQ==","upper_bound":"MjAxNi0wMS0wMQ==","repeats":14},{"count":28,"lower_bound":"MjAxNi0wMS0wMg==","upper_bound":"MjAxNi0wMS0wNA==","repeats":8},{"count":40,"lower_bound":"MjAxNi0wMS0wNQ==","upper_bound":"MjAxNi0wMS0wNg==","repeats":6},{"count":52,"lower_bound":"MjAxNi0wMS0wNw==","upper_bound":"MjAxNi0wMS0wNw==","repeats":12},{"count":64,"lower_bound":"MjAxNi0wMS0wOA==","upper_bound":"MjAxNi0wMS0wOQ==","repeats":6},{"count":74,"lower_bound":"MjAxNi0wMS0xMA==","upper_bound":"MjAxNi0wMS0xMQ==","repeats":6},{"count":86,"lower_bound":"MjAxNi0wMS0xMg==","upper_bound":"MjAxNi0wMS0xNA==","repeats":8},{"count":94,"lower_bound":"MjAxNi0wMS0xNQ==","upper_bound":"MjAxNi0wMS0xNQ==","repeats":8},{"count":102,"lower_bound":"MjAxNi0wMS0xNg==","upper_bound":"MjAxNi0wMS0xNw==","repeats":2},{"count":114,"lower_bound":"MjAxNi0wMS0xOA==","upper_bound":"MjAxNi0wMS0yMA==","repeats":8},{"count":126,"lower_bound":"MjAxNi0wMS0yMQ==","upper_bound":"MjAxNi0wMS0yMQ==","repeats":12},{"count":134,"lower_bound":"MjAxNi0wMS0yMg==","upper_bound":"MjAxNi0wMS0yMw==","repeats":2},{"count":142,"lower_bound":"MjAxNi0wMS0yNA==","upper_bound":"MjAxNi0wMS0yNA==","repeats":8},{"count":160,"lower_bound":"MjAxNi0wMS0yNQ==","upper_bound":"MjAxNi0wMS0yNw==","repeats":12},{"count":168,"lower_bound":"MjAxNi0wMS0yOA==","upper_bound":"MjAxNi0wMS0yOA==","repeats":8},{"count":180,"lower_bound":"MjAxNi0wMS0yOQ==","upper_bound":"MjAxNi0wMS0zMA==","repeats":8},{"count":194,"lower_bound":"MjAxNi0wMS0zMQ==","upper_bound":"MjAxNi0wMi0wMg==","repeats":8},{"count":202,"lower_bound":"MjAxNi0wMi0wMw==","upper_bound":"MjAxNi0wMi0wMw==","repeats":8},{"count":212,"lower_bound":"MjAxNi0wMi0wNA==","upper_bound":"MjAxNi0wMi0wNQ==","repeats":8},{"count":222,"lower_bound":"MjAxNi0wMi0wNg==","upper_bound":"MjAxNi0wMi0wNw==","repeats":8},{"count":232,"lower_bound":"MjAxNi0wMi0wOA==","upper_bound":"MjAxNi0wMi0wOQ==","repeats":4},{"count":240,"lower_bound":"MjAxNi0wMi0xMA==","upper_bound":"MjAxNi0wMi0xMA==","repeats":8},{"count":250,"lower_bound":"MjAxNi0wMi0xMQ==","upper_bound":"MjAxNi0wMi0xMg==","repeats":4},{"count":260,"lower_bound":"MjAxNi0wMi0xMw==","upper_bound":"MjAxNi0wMi0xMw==","repeats":10},{"count":270,"lower_bound":"MjAxNi0wMi0xNA==","upper_bound":"MjAxNi0wMi0xNA==","repeats":10},{"count":280,"lower_bound":"MjAxNi0wMi0xNQ==","upper_bound":"MjAxNi0wMi0xNg==","repeats":6},{"count":292,"lower_bound":"MjAxNi0wMi0xNw==","upper_bound":"MjAxNi0wMi0xNw==","repeats":12},{"count":300,"lower_bound":"MjAxNi0wMi0xOA==","upper_bound":"MjAxNi0wMi0xOQ==","repeats":2},{"count":310,"lower_bound":"MjAxNi0wMi0yMA==","upper_bound":"MjAxNi0wMi0yMQ==","repeats":4},{"count":318,"lower_bound":"MjAxNi0wMi0yMg==","upper_bound":"MjAxNi0wMi0yMw==","repeats":4},{"count":328,"lower_bound":"MjAxNi0wMi0yNA==","upper_bound":"MjAxNi0wMi0yNA==","repeats":10},{"count":342,"lower_bound":"MjAxNi0wMi0yNQ==","upper_bound":"MjAxNi0wMi0yNg==","repeats":10},{"count":350,"lower_bound":"MjAxNi0wMi0yNw==","upper_bound":"MjAxNi0wMi0yOA==","repeats":4},{"count":358,"lower_bound":"MjAxNi0wMi0yOQ==","upper_bound":"MjAxNi0wMi0yOQ==","repeats":8},{"count":366,"lower_bound":"MjAxNi0wMy0wMQ==","upper_bound":"MjAxNi0wMy0wMQ==","repeats":8},{"count":382,"lower_bound":"MjAxNi0wMy0wMg==","upper_bound":"MjAxNi0wMy0wMw==","repeats":12},{"count":394,"lower_bound":"MjAxNi0wMy0wNA==","upper_bound":"MjAxNi0wMy0wNg==","repeats":8},{"count":406,"lower_bound":"MjAxNi0wMy0wNw==","upper_bound":"MjAxNi0wMy0wOA==","repeats":8},{"count":418,"lower_bound":"MjAxNi0wMy0wOQ==","upper_bound":"MjAxNi0wMy0xMA==","repeats":6},{"count":426,"lower_bound":"MjAxNi0wMy0xMQ==","upper_bound":"MjAxNi0wMy0xMg==","repeats":6},{"count":438,"lower_bound":"MjAxNi0wMy0xMw==","upper_bound":"MjAxNi0wMy0xNA==","repeats":10},{"count":450,"lower_bound":"MjAxNi0wMy0xNQ==","upper_bound":"MjAxNi0wMy0xNg==","repeats":6},{"count":460,"lower_bound":"MjAxNi0wMy0xNw==","upper_bound":"MjAxNi0wMy0xNw==","repeats":10},{"count":470,"lower_bound":"MjAxNi0wMy0xOA==","upper_bound":"MjAxNi0wMy0xOQ==","repeats":6},{"count":480,"lower_bound":"MjAxNi0wMy0yMA==","upper_bound":"MjAxNi0wMy0yMA==","repeats":10},{"count":490,"lower_bound":"MjAxNi0wMy0yMQ==","upper_bound":"MjAxNi0wMy0yMg==","repeats":8},{"count":500,"lower_bound":"MjAxNi0wMy0yMw==","upper_bound":"MjAxNi0wMy0yNA==","repeats":6},{"count":514,"lower_bound":"MjAxNi0wMy0yNQ==","upper_bound":"MjAxNi0wMy0yNw==","repeats":8},{"count":524,"lower_bound":"MjAxNi0wMy0yOA==","upper_bound":"MjAxNi0wMy0yOA==","repeats":10},{"count":536,"lower_bound":"MjAxNi0wMy0yOQ==","upper_bound":"MjAxNi0wMy0zMA==","repeats":6},{"count":544,"lower_bound":"MjAxNi0wMy0zMQ==","upper_bound":"MjAxNi0wNC0wMg==","repeats":2},{"count":554,"lower_bound":"MjAxNi0wNC0wNA==","upper_bound":"MjAxNi0wNC0wNQ==","repeats":4},{"count":562,"lower_bound":"MjAxNi0wNC0wNg==","upper_bound":"MjAxNi0wNC0wNw==","repeats":4},{"count":572,"lower_bound":"MjAxNi0wNC0wOA==","upper_bound":"MjAxNi0wNC0wOQ==","repeats":6},{"count":580,"lower_bound":"MjAxNi0wNC0xMA==","upper_bound":"MjAxNi0wNC0xMA==","repeats":8},{"count":592,"lower_bound":"MjAxNi0wNC0xMQ==","upper_bound":"MjAxNi0wNC0xMQ==","repeats":12},{"count":600,"lower_bound":"MjAxNi0wNC0xMg==","upper_bound":"MjAxNi0wNC0xMg==","repeats":8},{"count":610,"lower_bound":"MjAxNi0wNC0xMw==","upper_bound":"MjAxNi0wNC0xMw==","repeats":10},{"count":618,"lower_bound":"MjAxNi0wNC0xNA==","upper_bound":"MjAxNi0wNC0xNQ==","repeats":2},{"count":626,"lower_bound":"MjAxNi0wNC0xNg==","upper_bound":"MjAxNi0wNC0xNg==","repeats":8},{"count":636,"lower_bound":"MjAxNi0wNC0xNw==","upper_bound":"MjAxNi0wNC0xOQ==","repeats":4},{"count":644,"lower_bound":"MjAxNi0wNC0yMA==","upper_bound":"MjAxNi0wNC0yMA==","repeats":8},{"count":654,"lower_bound":"MjAxNi0wNC0yMQ==","upper_bound":"MjAxNi0wNC0yMg==","repeats":6},{"count":664,"lower_bound":"MjAxNi0wNC0yMw==","upper_bound":"MjAxNi0wNC0yNQ==","repeats":8},{"count":680,"lower_bound":"MjAxNi0wNC0yNg==","upper_bound":"MjAxNi0wNC0yNw==","repeats":12},{"count":690,"lower_bound":"MjAxNi0wNC0yOA==","upper_bound":"MjAxNi0wNC0yOA==","repeats":10},{"count":704,"lower_bound":"MjAxNi0wNC0yOQ==","upper_bound":"MjAxNi0wNC0zMA==","repeats":10},{"count":712,"lower_bound":"MjAxNi0wNS0wMQ==","upper_bound":"MjAxNi0wNS0wMg==","repeats":2},{"count":724,"lower_bound":"MjAxNi0wNS0wMw==","upper_bound":"MjAxNi0wNS0wNA==","repeats":6},{"count":732,"lower_bound":"MjAxNi0wNS0wNQ==","upper_bound":"MjAxNi0wNS0wNQ==","repeats":8},{"count":746,"lower_bound":"MjAxNi0wNS0wNw==","upper_bound":"MjAxNi0wNS0wNw==","repeats":14},{"count":754,"lower_bound":"MjAxNi0wNS0wOA==","upper_bound":"MjAxNi0wNS0wOQ==","repeats":4},{"count":766,"lower_bound":"MjAxNi0wNS0xMA==","upper_bound":"MjAxNi0wNS0xMQ==","repeats":10},{"count":774,"lower_bound":"MjAxNi0wNS0xMg==","upper_bound":"MjAxNi0wNS0xMg==","repeats":8},{"count":788,"lower_bound":"MjAxNi0wNS0xMw==","upper_bound":"MjAxNi0wNS0xNA==","repeats":8},{"count":800,"lower_bound":"MjAxNi0wNS0xNQ==","upper_bound":"MjAxNi0wNS0xNw==","repeats":8},{"count":816,"lower_bound":"MjAxNi0wNS0xOA==","upper_bound":"MjAxNi0wNS0xOQ==","repeats":10},{"count":826,"lower_bound":"MjAxNi0wNS0yMA==","upper_bound":"MjAxNi0wNS0yMg==","repeats":4},{"count":844,"lower_bound":"MjAxNi0wNS0yMw==","upper_bound":"MjAxNi0wNS0yNA==","repeats":12},{"count":858,"lower_bound":"MjAxNi0wNS0yNQ==","upper_bound":"MjAxNi0wNS0yNg==","repeats":10},{"count":870,"lower_bound":"MjAxNi0wNS0yOA==","upper_bound":"MjAxNi0wNS0yOQ==","repeats":6},{"count":878,"lower_bound":"MjAxNi0wNS0zMA==","upper_bound":"MjAxNi0wNS0zMQ==","repeats":6},{"count":886,"lower_bound":"MjAxNi0wNi0wMQ==","upper_bound":"MjAxNi0wNi0wMg==","repeats":4},{"count":902,"lower_bound":"MjAxNi0wNi0wMw==","upper_bound":"MjAxNi0wNi0wNA==","repeats":10},{"count":910,"lower_bound":"MjAxNi0wNi0wNQ==","upper_bound":"MjAxNi0wNi0wNQ==","repeats":8},{"count":920,"lower_bound":"MjAxNi0wNi0wNg==","upper_bound":"MjAxNi0wNi0wNw==","repeats":6},{"count":934,"lower_bound":"MjAxNi0wNi0wOA==","upper_bound":"MjAxNi0wNi0xMA==","repeats":8},{"count":942,"lower_bound":"MjAxNi0wNi0xMQ==","upper_bound":"MjAxNi0wNi0xMQ==","repeats":8},{"count":950,"lower_bound":"MjAxNi0wNi0xMg==","upper_bound":"MjAxNi0wNi0xMw==","repeats":2},{"count":970,"lower_bound":"MjAxNi0wNi0xNA==","upper_bound":"MjAxNi0wNi0xNQ==","repeats":16},{"count":978,"lower_bound":"MjAxNi0wNi0xNg==","upper_bound":"MjAxNi0wNi0xNw==","repeats":2},{"count":988,"lower_bound":"MjAxNi0wNi0xOA==","upper_bound":"MjAxNi0wNi0xOQ==","repeats":8},{"count":998,"lower_bound":"MjAxNi0wNi0yMA==","upper_bound":"MjAxNi0wNi0yMA==","repeats":10},{"count":1006,"lower_bound":"MjAxNi0wNi0yMQ==","upper_bound":"MjAxNi0wNi0yMg==","repeats":4},{"count":1014,"lower_bound":"MjAxNi0wNi0yMw==","upper_bound":"MjAxNi0wNi0yMw==","repeats":8},{"count":1022,"lower_bound":"MjAxNi0wNi0yNA==","upper_bound":"MjAxNi0wNi0yNQ==","repeats":4},{"count":1030,"lower_bound":"MjAxNi0wNi0yNg==","upper_bound":"MjAxNi0wNi0yNw==","repeats":2},{"count":1038,"lower_bound":"MjAxNi0wNi0yOA==","upper_bound":"MjAxNi0wNi0zMA==","repeats":2},{"count":1050,"lower_bound":"MjAxNi0wNy0wMQ==","upper_bound":"MjAxNi0wNy0wMg==","repeats":8},{"count":1058,"lower_bound":"MjAxNi0wNy0wMw==","upper_bound":"MjAxNi0wNy0wNA==","repeats":6},{"count":1066,"lower_bound":"MjAxNi0wNy0wNQ==","upper_bound":"MjAxNi0wNy0wNQ==","repeats":8},{"count":1080,"lower_bound":"MjAxNi0wNy0wNg==","upper_bound":"MjAxNi0wNy0wNw==","repeats":8},{"count":1092,"lower_bound":"MjAxNi0wNy0wOA==","upper_bound":"MjAxNi0wNy0wOQ==","repeats":6},{"count":1106,"lower_bound":"MjAxNi0wNy0xMA==","upper_bound":"MjAxNi0wNy0xMQ==","repeats":8},{"count":1114,"lower_bound":"MjAxNi0wNy0xMg==","upper_bound":"MjAxNi0wNy0xMg==","repeats":8},{"count":1122,"lower_bound":"MjAxNi0wNy0xMw==","upper_bound":"MjAxNi0wNy0xNA==","repeats":6},{"count":1130,"lower_bound":"MjAxNi0wNy0xNg==","upper_bound":"MjAxNi0wNy0xOA==","repeats":2},{"count":1140,"lower_bound":"MjAxNi0wNy0xOQ==","upper_bound":"MjAxNi0wNy0yMQ==","repeats":4},{"count":1154,"lower_bound":"MjAxNi0wNy0yMg==","upper_bound":"MjAxNi0wNy0yNQ==","repeats":8},{"count":1174,"lower_bound":"MjAxNi0wNy0yNg==","upper_bound":"MjAxNi0wNy0yNw==","repeats":14},{"count":1186,"lower_bound":"MjAxNi0wNy0yOA==","upper_bound":"MjAxNi0wNy0yOQ==","repeats":6},{"count":1196,"lower_bound":"MjAxNi0wNy0zMA==","upper_bound":"MjAxNi0wNy0zMA==","repeats":10},{"count":1204,"lower_bound":"MjAxNi0wNy0zMQ==","upper_bound":"MjAxNi0wOC0wMQ==","repeats":2},{"count":1212,"lower_bound":"MjAxNi0wOC0wMg==","upper_bound":"MjAxNi0wOC0wMg==","repeats":8},{"count":1224,"lower_bound":"MjAxNi0wOC0wMw==","upper_bound":"MjAxNi0wOC0wNQ==","repeats":6},{"count":1232,"lower_bound":"MjAxNi0wOC0wNg==","upper_bound":"MjAxNi0wOC0wNg==","repeats":8},{"count":1240,"lower_bound":"MjAxNi0wOC0wNw==","upper_bound":"MjAxNi0wOC0wOQ==","repeats":2},{"count":1250,"lower_bound":"MjAxNi0wOC0xMA==","upper_bound":"MjAxNi0wOC0xMQ==","repeats":6},{"count":1264,"lower_bound":"MjAxNi0wOC0xMg==","upper_bound":"MjAxNi0wOC0xMw==","repeats":8},{"count":1272,"lower_bound":"MjAxNi0wOC0xNA==","upper_bound":"MjAxNi0wOC0xNw==","repeats":2},{"count":1284,"lower_bound":"MjAxNi0wOC0xOA==","upper_bound":"MjAxNi0wOC0xOA==","repeats":12},{"count":1294,"lower_bound":"MjAxNi0wOC0xOQ==","upper_bound":"MjAxNi0wOC0xOQ==","repeats":10},{"count":1304,"lower_bound":"MjAxNi0wOC0yMA==","upper_bound":"MjAxNi0wOC0yMA==","repeats":10},{"count":1316,"lower_bound":"MjAxNi0wOC0yMQ==","upper_bound":"MjAxNi0wOC0yMg==","repeats":8},{"count":1328,"lower_bound":"MjAxNi0wOC0yMw==","upper_bound":"MjAxNi0wOC0yNA==","repeats":6},{"count":1338,"lower_bound":"MjAxNi0wOC0yNQ==","upper_bound":"MjAxNi0wOC0yNg==","repeats":8},{"count":1348,"lower_bound":"MjAxNi0wOC0yNw==","upper_bound":"MjAxNi0wOC0yNw==","repeats":10},{"count":1358,"lower_bound":"MjAxNi0wOC0yOA==","upper_bound":"MjAxNi0wOC0zMA==","repeats":8},{"count":1372,"lower_bound":"MjAxNi0wOC0zMQ==","upper_bound":"MjAxNi0wOC0zMQ==","repeats":14},{"count":1382,"lower_bound":"MjAxNi0wOS0wMQ==","upper_bound":"MjAxNi0wOS0wMQ==","repeats":10},{"count":1392,"lower_bound":"MjAxNi0wOS0wMg==","upper_bound":"MjAxNi0wOS0wMw==","repeats":4},{"count":1400,"lower_bound":"MjAxNi0wOS0wNA==","upper_bound":"MjAxNi0wOS0wNQ==","repeats":6},{"count":1412,"lower_bound":"MjAxNi0wOS0wNg==","upper_bound":"MjAxNi0wOS0wNg==","repeats":12},{"count":1426,"lower_bound":"MjAxNi0wOS0wNw==","upper_bound":"MjAxNi0wOS0wOA==","repeats":8},{"count":1440,"lower_bound":"MjAxNi0wOS0wOQ==","upper_bound":"MjAxNi0wOS0xMA==","repeats":10},{"count":1448,"lower_bound":"MjAxNi0wOS0xMQ==","upper_bound":"MjAxNi0wOS0xMg==","repeats":2},{"count":1458,"lower_bound":"MjAxNi0wOS0xMw==","upper_bound":"MjAxNi0wOS0xNA==","repeats":6},{"count":1466,"lower_bound":"MjAxNi0wOS0xNQ==","upper_bound":"MjAxNi0wOS0xNg==","repeats":2},{"count":1478,"lower_bound":"MjAxNi0wOS0xNw==","upper_bound":"MjAxNi0wOS0xOQ==","repeats":6},{"count":1486,"lower_bound":"MjAxNi0wOS0yMA==","upper_bound":"MjAxNi0wOS0yMA==","repeats":8},{"count":1502,"lower_bound":"MjAxNi0wOS0yMQ==","upper_bound":"MjAxNi0wOS0yMQ==","repeats":16},{"count":1518,"lower_bound":"MjAxNi0wOS0yMw==","upper_bound":"MjAxNi0wOS0yNA==","repeats":14},{"count":1526,"lower_bound":"MjAxNi0wOS0yNQ==","upper_bound":"MjAxNi0wOS0yNg==","repeats":4},{"count":1538,"lower_bound":"MjAxNi0wOS0yNw==","upper_bound":"MjAxNi0wOS0yOA==","repeats":10},{"count":1546,"lower_bound":"MjAxNi0wOS0yOQ==","upper_bound":"MjAxNi0wOS0zMA==","repeats":4},{"count":1554,"lower_bound":"MjAxNi0xMC0wMQ==","upper_bound":"MjAxNi0xMC0wMg==","repeats":4},{"count":1562,"lower_bound":"MjAxNi0xMC0wMw==","upper_bound":"MjAxNi0xMC0wMw==","repeats":8},{"count":1572,"lower_bound":"MjAxNi0xMC0wNA==","upper_bound":"MjAxNi0xMC0wNg==","repeats":4},{"count":1586,"lower_bound":"MjAxNi0xMC0wNw==","upper_bound":"MjAxNi0xMC0wOA==","repeats":12},{"count":1596,"lower_bound":"MjAxNi0xMC0wOQ==","upper_bound":"MjAxNi0xMC0wOQ==","repeats":10},{"count":1606,"lower_bound":"MjAxNi0xMC0xMA==","upper_bound":"MjAxNi0xMC0xMQ==","repeats":4},{"count":1614,"lower_bound":"MjAxNi0xMC0xMg==","upper_bound":"MjAxNi0xMC0xMw==","repeats":2},{"count":1624,"lower_bound":"MjAxNi0xMC0xNA==","upper_bound":"MjAxNi0xMC0xNQ==","repeats":8},{"count":1638,"lower_bound":"MjAxNi0xMC0xNg==","upper_bound":"MjAxNi0xMC0xOA==","repeats":8},{"count":1652,"lower_bound":"MjAxNi0xMC0xOQ==","upper_bound":"MjAxNi0xMC0yMQ==","repeats":8},{"count":1666,"lower_bound":"MjAxNi0xMC0yMg==","upper_bound":"MjAxNi0xMC0yNA==","repeats":8},{"count":1680,"lower_bound":"MjAxNi0xMC0yNQ==","upper_bound":"MjAxNi0xMC0yNg==","repeats":8},{"count":1690,"lower_bound":"MjAxNi0xMC0yNw==","upper_bound":"MjAxNi0xMC0yOA==","repeats":8},{"count":1700,"lower_bound":"MjAxNi0xMC0yOQ==","upper_bound":"MjAxNi0xMS0wMQ==","repeats":4},{"count":1708,"lower_bound":"MjAxNi0xMS0wMg==","upper_bound":"MjAxNi0xMS0wMw==","repeats":2},{"count":1718,"lower_bound":"MjAxNi0xMS0wNA==","upper_bound":"MjAxNi0xMS0wNg==","repeats":6},{"count":1726,"lower_bound":"MjAxNi0xMS0wNw==","upper_bound":"MjAxNi0xMS0wNw==","repeats":8},{"count":1736,"lower_bound":"MjAxNi0xMS0wOQ==","upper_bound":"MjAxNi0xMS0xMA==","repeats":6},{"count":1746,"lower_bound":"MjAxNi0xMS0xMQ==","upper_bound":"MjAxNi0xMS0xMQ==","repeats":10},{"count":1756,"lower_bound":"MjAxNi0xMS0xMg==","upper_bound":"MjAxNi0xMS0xMw==","repeats":4},{"count":1764,"lower_bound":"MjAxNi0xMS0xNA==","upper_bound":"MjAxNi0xMS0xNA==","repeats":8},{"count":1774,"lower_bound":"MjAxNi0xMS0xNQ==","upper_bound":"MjAxNi0xMS0xNQ==","repeats":10},{"count":1784,"lower_bound":"MjAxNi0xMS0xNg==","upper_bound":"MjAxNi0xMS0xNw==","repeats":8},{"count":1802,"lower_bound":"MjAxNi0xMS0xOA==","upper_bound":"MjAxNi0xMS0xOQ==","repeats":14},{"count":1814,"lower_bound":"MjAxNi0xMS0yMA==","upper_bound":"MjAxNi0xMS0yMQ==","repeats":10},{"count":1822,"lower_bound":"MjAxNi0xMS0yMg==","upper_bound":"MjAxNi0xMS0yMw==","repeats":4},{"count":1834,"lower_bound":"MjAxNi0xMS0yNA==","upper_bound":"MjAxNi0xMS0yNQ==","repeats":6},{"count":1842,"lower_bound":"MjAxNi0xMS0yNg==","upper_bound":"MjAxNi0xMS0yOA==","repeats":2},{"count":1858,"lower_bound":"MjAxNi0xMS0yOQ==","upper_bound":"MjAxNi0xMS0zMA==","repeats":10},{"count":1868,"lower_bound":"MjAxNi0xMi0wMQ==","upper_bound":"MjAxNi0xMi0wMg==","repeats":4},{"count":1876,"lower_bound":"MjAxNi0xMi0wMw==","upper_bound":"MjAxNi0xMi0wNA==","repeats":6},{"count":1884,"lower_bound":"MjAxNi0xMi0wNQ==","upper_bound":"MjAxNi0xMi0wNw==","repeats":2},{"count":1894,"lower_bound":"MjAxNi0xMi0wOA==","upper_bound":"MjAxNi0xMi0wOQ==","repeats":4},{"count":1902,"lower_bound":"MjAxNi0xMi0xMA==","upper_bound":"MjAxNi0xMi0xMA==","repeats":8},{"count":1910,"lower_bound":"MjAxNi0xMi0xMQ==","upper_bound":"MjAxNi0xMi0xMg==","repeats":4},{"count":1918,"lower_bound":"MjAxNi0xMi0xMw==","upper_bound":"MjAxNi0xMi0xMw==","repeats":8},{"count":1930,"lower_bound":"MjAxNi0xMi0xNA==","upper_bound":"MjAxNi0xMi0xNw==","repeats":6},{"count":1938,"lower_bound":"MjAxNi0xMi0xOA==","upper_bound":"MjAxNi0xMi0xOA==","repeats":8},{"count":1946,"lower_bound":"MjAxNi0xMi0xOQ==","upper_bound":"MjAxNi0xMi0yMA==","repeats":4},{"count":1954,"lower_bound":"MjAxNi0xMi0yMQ==","upper_bound":"MjAxNi0xMi0yMg==","repeats":2},{"count":1964,"lower_bound":"MjAxNi0xMi0yMw==","upper_bound":"MjAxNi0xMi0yNQ==","repeats":4},{"count":1978,"lower_bound":"MjAxNi0xMi0yNg==","upper_bound":"MjAxNi0xMi0yNw==","repeats":8},{"count":1990,"lower_bound":"MjAxNi0xMi0yOA==","upper_bound":"MjAxNi0xMi0yOQ==","repeats":6},{"count":2000,"lower_bound":"MjAxNi0xMi0zMQ==","upper_bound":"MjAxNi0xMi0zMQ==","repeats":10}]},"cm_sketch":{"rows":[{"counters":[0,7,2,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,6,3,0,0,0,9,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,4,0,0,5,0,0,0,0,0,9,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,12,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,4,0,9,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,4,4,0,0,0,0,7,0,8,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,8,0,0,6,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,3,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,5,0,0,0,0,0,5,0,3,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,2,0,0,0,0,0,0,3,0,0,0,0,0,7,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,9,0,0,0,0,0,0,0,0,0,5,0,12,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,17,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,8,4,5,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,5,0,7,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,4,8,0,0,0,0,0,0,0,0,0,0,0,0,8,0,2,0,0,0,0,0,0,0,0,0,0,0,13,3,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,11,0,8,0,0,0,5,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,7,8,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,0,3,0,0,0,0,0,0,6,0,0,0,0,0,0,2,5,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,0,10,2,0,0,0,5,7,0,0,0,0,8,0,0,0,0,6,0,8,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,7,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,10,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,4,0,0,0,0,0,4,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,7,0,6,5,0,0,0,0,9,4,0,0,10,0,0,0,0,0,0,0,7,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,4,0,9,0,0,0,9,0,8,5,0,5,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,2,0,0,3,0,0,0,0,0,4,0,0,0,0,0,0,0,6,1,0,0,0,0,0,0,0,0,0,0,0,5,7,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,10,0,0,0,0,0,0,0,5,0,0,0,0,0,5,4,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,2,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,2,0,0,0,6,0,0,0,0,0,0,8,0,0,0,0,0,4,6,0,8,5,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,4,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,9,0,8,0,11,0,0,0,0,0,0,0,0,6,3,0,0,0,4,0,7,0,2,0,0,0,7,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,5,0,0,0,0,3,0,0,9,0,0,0,0,0,0,0,0,0,0,4,6,0,5,0,8,0,13,0,0,0,5,0,0,0,0,0,9,3,0,4,2,0,0,0,0,3,0,0,0,1,0,0,9,0,0,0,0,0,0,0,0,0,0,0,5,0,0,6,0,0,3,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,8,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,8,0,11,0,0,0,0,0,0,0,0,8,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,2,0,19,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,4,6,0,0,0,0,0,12,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,10,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,16,0,0,0,0,0,0,0,0,7,0,6,0,0,0,8,0,0,0,0,0,6,0,0,0,0,0,0,0,0,15,0,4,6,0,10,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,6,0,7,0,0,2,0,3,0,0,0,0,0,0,0,0,0,0,0,7,0,12,0,6,0,0,0,0,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,7,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,0,0,0,0,0,0,0,0,9,0,0,5,3,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,0,0,3,0,5,5,9,0,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,0,0,7,6,0,0,0,0,0,0,7,0,0,13,0,7,6,0,0,0,0,0,0,2,0,1,0,7,0,0,0,0,8,0,6,0,0,0,0,4,0,0,10,0,6,0,0,15,0,7,0,0,0,0,0,0,0,0,0,7,14,5,0,0,0,4,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,13,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,8,5,0,0,0,0,0,5,0,6,4,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,4,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,4,0,0,4,0,0,0,0,0,0,0,0,0,4,0,0,0,9,0,0,0,0,0,0,0,7,1,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,1,9,5,4,6,0,0,0,0,0,0,0,0,5,0,4,8,0,0,0,0,0]},{"counters":[0,7,0,0,0,0,0,0,2,0,0,0,0,4,0,0,0,4,7,0,0,0,0,2,0,2,0,0,0,0,0,5,0,0,0,9,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,7,0,2,0,6,0,0,0,0,4,0,0,0,9,0,0,0,7,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,6,0,0,3,5,0,0,0,4,8,0,0,0,0,0,0,0,3,0,5,0,9,0,6,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,5,0,0,0,0,5,0,0,0,0,0,5,0,0,0,7,0,0,0,0,0,0,4,2,0,8,0,0,4,0,6,0,5,9,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,8,0,5,0,0,0,0,0,0,0,6,0,6,0,0,0,7,0,0,0,0,11,0,0,0,0,0,0,0,11,4,4,0,0,0,4,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,9,0,0,5,0,0,0,0,6,6,8,15,0,0,4,0,9,0,0,0,8,0,0,0,0,0,8,12,0,0,0,0,5,0,0,0,4,0,8,0,0,0,5,0,0,0,4,0,0,0,8,0,0,0,6,0,0,0,0,0,0,0,4,0,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,6,0,10,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,5,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,9,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,8,0,2,0,0,0,0,2,0,9,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,7,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,3,0,6,0,0,5,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,9,6,0,0,0,0,4,0,16,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,3,0,0,0,0,16,0,0,0,0,0,6,0,0,0,0,5,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,4,0,0,0,0,0,0,0,5,0,5,0,1,0,6,6,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,9,15,0,0,0,0,0,0,0,0,5,0,0,4,0,0,11,0,0,0,0,0,8,0,0,6,4,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,4,10,0,0,3,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,9,5,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,7,2,0,0,0,0,10,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,5,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,0,0,0,0,0,0,0,0,0,5,0,4,0,2,0,3,0,0,0,0,0,0,0,3,0,0,0,0,3,0,0,0,0,0,0,0,0,7,4,0,0,2,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,8,0,0,0,0,0,0,0,6,4,0,0,4,0,0,9,0,0,0,0,14,0,5,2,0,0,8,0,0,0,0,5,0,0,8,12,7,0,6,7,0,0,0,2,0,0,0,0,0,7,0,0,5,0,0,0,0,0,0,3,0,0,0,0,5,0,0,0,0,0,7,0,0,0,0,0,8,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,8,10,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,0,7,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,5,0,0,2,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,6,0,8,0,7,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,6,4,7,0,5,0,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,7,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,3,7,0,0,0,0,6,0,7,0,0,7,0,0,6,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,1,0,0,0,0,0,9,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,8,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,5,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,8,0,0,0,7,0,13,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,8,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,4,0,12,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,6,4,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,0,1,0,0,2,3,0,0,0,10,0,0,0,0,0,0,0,0,7,4,0,0,0,0,2,0,0,0,0,0,0,8,0,0,0,7,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,7,7,0,0,0,0,0,0,0,1,0,0,11,0,0,0,7,0,0,0,0,0,0,18,0,0,0,0,0,0,0,8,3,0,9,0,7,7,0,7,0,7,0,7,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,4,0,0,0,0,0,0,3,0,0,0,2,0,4,0,0,0,0,5,0,0,0,0,7,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,5,0,0,0,0,7,0,0,0,0,0,0,6,0,0,5,0,0,0,0,0,0,0,0,0,0,5,0,5,9,0,0,0,0,0,0,0,6,0,0,6,0,8,0,0,0,1,2,0,0,0,0,0,0,3,0,14,5,0,0,0,0,0,0,0,0,0,0,4,0,0,6,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,10,2,0,0,0,8,7,7,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,10,0,0,0,0,4,0,0,0,5,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,5,0,0,7,7,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,0,0,0,0,6,0,0,6,0,0,0,0,0,5,5,5,0,0,0,0,5,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,7,4,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,6,0,2,0,0,3,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,7,12,0,0,0,0,8,12,3,0,8,3,0,0,0,10,0,0,0,0,0,0,9,0,0,9,0,0,0,0,0,0,0,0,0,6,0,0,0,0,5,0,0,9,0,0,0,0,6,0,0,0,0,0,13,0,5,0,0,0,3,5,0,0,0,3,0,7,0,7,0,7,11,0,0,0,7,0,8,0,0,0,0,0,3,0,4,0,0,4,0,0,0,0,1,0,5,0,0,0,0,5,4,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,14,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,4,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,0,5,0,0,3,0,0,0,0,0,0,0,7,6,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,9,0,0,0,4,0,4,0,6,0,4,3,7,0,0,0,4,0,0,0,0,0,0,0,0,14,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,12,0,0,2,0,0,0,0,0,0,0,0,0,0,0,3,0,4,0,4,0,5,0,0,0,0,0,0,2,5,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,5,0,0,0,0,6,4,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,7,0,0,4,0,0,0,0,0,0,0,0,0,0,0,9,0,8,0,0,3,0,6,0,0,3,0,0,6,0,0,0,7,0,0,0,0,7,0,0,0,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,13,4,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,8,6,0,0,0,0,0,2,0,0,0,7,0,0,0,8,0,0,3,0,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,4,0,0,7,0,0,0,0,0,0,6,0,2,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,6,0,14,0,5,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,8,0,0,0,0,0,0,4,0,0,0,0,4,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,7,0,0,7,0,0,7,0,0,0,4,10,0,0,0,0,1,0,4,0,0,0,0,0,5,0,0,5,0,2,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,11,0,14,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,2,0,0,0,0,5,0,0,0,0,0,0,0,5,0,11,7,0,0,2,9,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,4,0,0,0,0,5,0,0,6,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,11,0,5,0,0,0,9,0,0,0,0,0,0,0,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,4,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,7,0,7,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,8,0,0,6,0,0,0,0,4,6,2,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,3,0,0,7,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,1,0,0,0,0,9,4,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,8,0,4,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,3,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,3,9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,10,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,4,0,3,0,0,5,1,0,0,9,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,13,0,0,0,7,0,0,0,0,8,0,0,0,6,6,7,0,0,10,0,0,5,9,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,8,0,0,0,0,0,0,0,0,5,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,4,0,0,0,0,0,12,0,8,0,0,0,0,0,0,0,0,0,0,2,4,8,0,0,0,0,0,5,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,1,0,0,0,0,3,5,2,0,3,0,8,0,0,6,0,0,0,4,0,0,0,0,0,0,0,8,0,0,0,0,0,8,0,0,7,5,0,0,3,0,0,0,4,0,0,0,0,0,0,7,0,0,7,5,7,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,11,0,0,4,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,2,0,0,7,0,0,0,0,5,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0]},{"counters":[0,3,0,0,0,0,8,0,0,0,0,3,0,0,6,0,11,0,0,7,0,0,0,0,0,2,3,0,0,0,0,0,0,7,0,0,5,0,0,0,0,8,0,0,0,0,0,0,0,7,0,0,0,0,0,6,0,0,4,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,4,0,9,0,0,0,0,11,7,0,0,0,0,5,0,0,7,0,0,0,6,0,0,0,0,4,0,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,8,0,6,16,0,0,0,7,0,0,0,0,0,0,5,0,5,0,0,7,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,7,0,1,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,3,0,0,0,0,9,0,0,0,0,0,0,0,0,4,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,13,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,5,19,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,0,0,6,0,0,0,3,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,1,4,0,0,0,12,0,0,0,0,0,0,0,9,7,0,0,0,0,0,0,4,0,0,0,0,0,8,0,0,0,7,0,0,9,0,0,0,0,0,10,0,0,0,5,0,0,8,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,6,0,0,6,0,0,4,3,0,5,0,0,5,7,0,0,0,0,0,7,0,2,0,0,0,0,0,0,0,0,6,0,0,2,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,4,0,0,0,0,0,0,0,3,0,6,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,0,0,3,0,4,0,0,0,21,0,0,0,0,0,0,0,0,0,0,6,0,0,0,6,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,9,0,4,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,4,0,0,0,0,0,0,7,0,0,0,0,6,0,0,0,14,6,0,0,0,0,0,4,0,0,8,0,0,0,7,8,0,0,5,0,6,0,0,0,0,0,8,0,0,0,0,0,0,0,0,6,0,6,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,6,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,4,0,0,4,0,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,11,0,0,0,5,7,0,0,4,0,0,6,4,0,0,0,7,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,2,4,0,2,0,0,0,0,0,6,0,0,0,0,3,0,0,0,0,0,0,8,4,0,0,0,0,0,0,6,0,7,8,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,10,0,0,0,0,0,0,7,0,5,0,0,0,0,0,0,7,5,7,0,8,0,2,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,8,0,0,0,0,0,13,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,6,3,0,7,0,0,0,0,0,0,0,0,3,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,0,0,6,4,0,0,0,0,0,0,0,2,11,0,0,8,3,0,6,7,10,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,11,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,4,0,0,0,0,0,0,3,0,5,0,0,0,0,0,0,11,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,2,5,0,0,5,4,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,3,0,0,0,0,0,0,7,0,0,0,2,0,0,0,0,0,5,0,0,0,0,0,0,0,0,10,5,0,0,0,0,0,0,7,2,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,0,4,0,0,0,0,4,0,0,0,0,0,8,4,0,5,0,0,0,7,9,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,6,0,0,0,0,0,8,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,9,0,0,0,0,0,0,9,0,3,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,8,2,0,0,6,0,0,4,0,0,0,1,4,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,7,0,0,4,0,0,0,0,8,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,2,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,3,0,0,0,0,0,6,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,6,0,0,0,0,5,0,0,7,3,6,0,0,11,0,0,11,0,0,0,0,9,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,7,0,0,9,0,0,0,0,0,0,9,4,0,0,0,0,9,0,0,0,3,4,4,0,0,0,7,2,0,0,0,4,0,7,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0,0,8,0,0,6,5,0,0,0,0,0,4,0,11,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,6,9,6,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,0,7,0,0,0,4,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,5,6,3,0,5,10,0,0,0,0,3,0,0,0,0,0,0,2,0,8,0,5,0,0,0,0,0,0,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,1,4,10,9,0,0,0,0,0,0,9,0,0,0,0,1,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,8,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,0,0,15,0,4,8,0,0,0,0,5,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,8,0,5,0,5,0,7,0,0,0,4,6,0,4,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,6,0,0,0,0,0,0,0,13,9,0,0,4,0,6,0,0,0,0,0,0,0,0,0,4,3,0,2,5,0,0,5,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,8,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,3,4,0,0,6,5,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,6,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,3,0,0,0,0,0,0,7,0,0,4,0,0,0,0,0,0,0,0,2,8,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,3,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,8,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,9,4,0,0,0,0,0,0,15,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,6,0,5,0,0,0,0,9,0,0,0,0,7,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,7,0,13,6,0,0,0,0,0,0,3,4,0,0,0,0,0,6,0,0,0,0,0,7,0,0,0,0,0,0,0,8,0,0,0,6,9,0,0,0,0,0,6,0,0,0,8,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,7,0,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,10,0,0,0,0,0,0,0,0,12,0,4,0,0,0,0,0,0,0,0,0,0,0,0,3,0,4,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,6,0,0,0,0,0,0,0,0,4,0,8,0,0,5,0,0,5,0,7,0,0,0,0,0,0,0,0,0,4,0,0,6,0,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,7,0,0,0,5,9,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,6,0,0,7,0,0,0,0,0,0,10,0,0,0,0,0,1,0,0,0,0,5,0,8,6,0,0,0,0,0,0,0,6,0,3,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,5,3,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,11,4,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,7,0,0,6,0,0,0,0,2,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,4,0,0,5,0,0,0,1,0,7,0,0,13,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,2,0,0,0,0,0,0,0,0,7,13,0,0,5,0,0,0,0,2,0,0,0,0,0,0,0,5,0,0,0,6,3,0,0,4,0,0,0,0,0,0,0,0,0,8,7,0,0,2,0,9,0,0,0,5,0,0,0,0,0,0,0,10,5,5,0,0,0,0,0,5,0,0,0,7,0,6,0,6,4,0,0,0,6,0,0,0,5,0,4,0,0,0,0,0,7,0,0,0,4,0,5,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,5,0,5,0,0,0,0,0,0,0,0,4,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,5,0,0,0,0,0,0,16,0,0,0,0,0,5,5,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,7,0,3,0,0,0,0,5,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,6,0,0,6,0,0,0,0,0,0,0,0,7,7,0,0,0,0,3,0,10,0,5,0,7,0,0,12,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,1,0,0,0,9,0,0,0,15,0,6,14,0,0,0,0,0,0,0,0,4,6,8,0,0,8,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,5,0,0,6,0,0,0,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,6,0,0,0,4,0,2,0,0,0,0,0,0,2,0,0,0,0,0,12,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,0,0,5,0,5,0,0,0,7,0,0,0,0,0,0,0,9,0,0,0,5,0,0,2,0,0,0,0,0,5,0,5,0,4,0,0,0,0,0,0,0,0,7,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,7,0,0,0,0,4,0,10,0,6,3,7,0,6,0,4,9,6,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,8,0,0,0,0,8,0,0,0,2,0,0,0,4,0,0,0,0,0,0,0,0,0,7,4,0,0,0,0,0,0,0,0,0,0,0,3,0,0,6,0,8,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,5,0,0,0,4,0,7,8,0,0,0,0,0,0,0,8,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,5,0,0,0,0,0,7,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,10,0,5,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,3,0,0,0,7,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,3,0,0,2,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,6,0,0,0,3,0,0,0,3,0,9,0,4,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,8,9,0,5,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,5,0,0,2,0,0,0,0,0,0,0,0,0,9,0,4,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,4,0,2,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,7,8,0,0,0,0,0,9,0,5,0,23,5,7,0,12,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0,0,4,0,9,0,4,0,0,3,0,0,0,0,0,0,5,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,11,0,0,0,0]}]},"null_count":0,"last_update_version":397952028703981568},"ds2":{"histogram":{"ndv":1921,"buckets":[{"count":8,"lower_bound":"MDI4UDVT","upper_bound":"MEIydA==","repeats":1},{"count":16,"lower_bound":"MExKMw==","upper_bound":"MFh2elFlem5wQXB4","repeats":1},{"count":24,"lower_bound":"MFlD","upper_bound":"MGpreFFETXVUTkQ=","repeats":1},{"count":32,"lower_bound":"MQ==","upper_bound":"MTJGTlhi","repeats":1},{"count":40,"lower_bound":"MTNlQmNyUHNVSDk=","upper_bound":"MThRWkM=","repeats":1},{"count":48,"lower_bound":"MUFQajJKSVhCT2pHNg==","upper_bound":"MVFXZklNQnc=","repeats":1},{"count":56,"lower_bound":"MVREeGJaaGta","upper_bound":"MWYwRThHNk9INzhM","repeats":1},{"count":64,"lower_bound":"MWY4cEZv","upper_bound":"MXd5U2taSzdrSw==","repeats":1},{"count":72,"lower_bound":"Mg==","upper_bound":"MjloQ1RIeEVFWmhx","repeats":1},{"count":80,"lower_bound":"MkVw","upper_bound":"MlROS0ljRkY=","repeats":1},{"count":88,"lower_bound":"MlpyVGs=","upper_bound":"MnVQaExONQ==","repeats":1},{"count":96,"lower_bound":"MngxNFdM","upper_bound":"MzNtbXZNWkM=","repeats":1},{"count":104,"lower_bound":"MzV6bUxL","upper_bound":"M09QWFQ=","repeats":1},{"count":112,"lower_bound":"M1JodHF2SDZY","upper_bound":"M2ZlS2o0aVRzNQ==","repeats":1},{"count":122,"lower_bound":"M3JnRHRrZVhPQUVN","upper_bound":"NA==","repeats":5},{"count":130,"lower_bound":"NDIzYVJucg==","upper_bound":"NDluYzE=","repeats":1},{"count":138,"lower_bound":"NERhYVJs","upper_bound":"NFNWdXByaksxM0t2TA==","repeats":1},{"count":146,"lower_bound":"NGFQTzJoeVRDcg==","upper_bound":"NHFKU29PRk9iWnhU","repeats":1},{"count":154,"lower_bound":"NTBSa1dRdFNlZndwZw==","upper_bound":"NTdy","repeats":1},{"count":162,"lower_bound":"NUtmag==","upper_bound":"NVVadmZCNTA=","repeats":1},{"count":170,"lower_bound":"NVVsZ2c2UkRY","upper_bound":"NWdHMnNw","repeats":1},{"count":180,"lower_bound":"NWs=","upper_bound":"Ng==","repeats":3},{"count":188,"lower_bound":"NkU5WlRB","upper_bound":"Nk52ZFpRalFZdw==","repeats":1},{"count":196,"lower_bound":"NlU=","upper_bound":"NmRJNQ==","repeats":1},{"count":204,"lower_bound":"NmdUQjZNNQ==","upper_bound":"NnVYODNxdVYw","repeats":1},{"count":212,"lower_bound":"NnY2Nm1NcnE0N0I=","upper_bound":"NzVob242","repeats":1},{"count":220,"lower_bound":"NzlsN0tJNQ==","upper_bound":"N1F6OHZaeVNM","repeats":1},{"count":228,"lower_bound":"N1N6ZWI4enpNZQ==","upper_bound":"N2U2SXpvaFEw","repeats":1},{"count":236,"lower_bound":"N2dTanRzRWZm","upper_bound":"N2lGVUJHNElqaHJtMg==","repeats":1},{"count":244,"lower_bound":"N2lZOGVyN3RGN0NlUw==","upper_bound":"N3NrMUhZT0NOV0t4UQ==","repeats":1},{"count":252,"lower_bound":"N3RV","upper_bound":"OEJJUzh4MmtycWROMQ==","repeats":1},{"count":260,"lower_bound":"OEJSU0VRYWREZVQ4Zw==","upper_bound":"OE0yQVdxVUFJSWFvNQ==","repeats":1},{"count":268,"lower_bound":"OFBu","upper_bound":"OFozU294b09YTk0=","repeats":1},{"count":276,"lower_bound":"OGZ1Ug==","upper_bound":"OHIweDh0S0Q1b2E=","repeats":1},{"count":284,"lower_bound":"OQ==","upper_bound":"OTlYTDRZQjFIaFZLcA==","repeats":1},{"count":292,"lower_bound":"OUFlQ3RRTA==","upper_bound":"OUY3Qng=","repeats":1},{"count":300,"lower_bound":"OUZBVGZ2eXozaHNT","upper_bound":"OU1FQXRjRm5EMFBl","repeats":1},{"count":308,"lower_bound":"OVFvWG41UlA=","upper_bound":"OWNhYlhaUGtrTg==","repeats":1},{"count":316,"lower_bound":"OWRtbFZzcWk2b1g=","upper_bound":"QTBGakw=","repeats":1},{"count":324,"lower_bound":"QTlVUzAydXE5WFdNNg==","upper_bound":"QUhacFhWbW9EYWpk","repeats":1},{"count":332,"lower_bound":"QUllcFVLUw==","upper_bound":"QU9X","repeats":1},{"count":340,"lower_bound":"QU9qc1U=","upper_bound":"QWtjZ00=","repeats":1},{"count":348,"lower_bound":"QW5SdUI2","upper_bound":"QXhpaHY=","repeats":1},{"count":356,"lower_bound":"QkE2","upper_bound":"Qk0ycU9GS3M2RlJB","repeats":1},{"count":364,"lower_bound":"QlVVVTZUYg==","upper_bound":"Qm9XY1p2","repeats":1},{"count":372,"lower_bound":"QnBpbGg2OFNZTEJKVg==","upper_bound":"QzRDS2lscFlV","repeats":1},{"count":380,"lower_bound":"Qzgw","upper_bound":"Q0U4YU9WR2VRRUtNYQ==","repeats":1},{"count":388,"lower_bound":"Q0ZMVGlEcDFQcWdJ","upper_bound":"Q2EzY3pi","repeats":1},{"count":396,"lower_bound":"Q2k2RXZW","upper_bound":"Q2p2ZHhFVzIyS2Q=","repeats":1},{"count":404,"lower_bound":"Q3BuTQ==","upper_bound":"RA==","repeats":1},{"count":412,"lower_bound":"RDhJMkpGdWN3","upper_bound":"REo=","repeats":1},{"count":420,"lower_bound":"REtQ","upper_bound":"RFVsZzNpMw==","repeats":1},{"count":428,"lower_bound":"RFV4S0tESXgwVg==","upper_bound":"RGg=","repeats":1},{"count":436,"lower_bound":"RGpIQkl2Slo=","upper_bound":"RHFTUVo1MWFKcQ==","repeats":1},{"count":444,"lower_bound":"RHF2czQzYVN2SjIy","upper_bound":"RTBPUEoybkM=","repeats":1},{"count":452,"lower_bound":"RTFKM3BQbmw0MQ==","upper_bound":"RUZ1aUtGSHdET3Rm","repeats":1},{"count":460,"lower_bound":"RUpoN0I=","upper_bound":"RVQwMQ==","repeats":1},{"count":468,"lower_bound":"RVVMS3NsMXV5Umw=","upper_bound":"RWV2Z0x0VzVsdg==","repeats":1},{"count":476,"lower_bound":"RWxvMEF1bg==","upper_bound":"RjE=","repeats":1},{"count":484,"lower_bound":"RkEySQ==","upper_bound":"RlAzdm5LTURYTk9w","repeats":1},{"count":492,"lower_bound":"RlBEOUVIYTk=","upper_bound":"RmY2TWxk","repeats":1},{"count":500,"lower_bound":"RmZjZTFha01mMGw=","upper_bound":"RnI=","repeats":1},{"count":508,"lower_bound":"Rw==","upper_bound":"R1RQYXNERHMxS0M=","repeats":1},{"count":516,"lower_bound":"R1hDM2ZvVmlsMA==","upper_bound":"R2RHRno=","repeats":1},{"count":524,"lower_bound":"R2dp","upper_bound":"R2hocFZBb3hY","repeats":1},{"count":532,"lower_bound":"R2lIN1NEbXIwRnJXZg==","upper_bound":"R3p0MHhOYVhPWA==","repeats":1},{"count":540,"lower_bound":"SA==","upper_bound":"SDdBdHVM","repeats":1},{"count":548,"lower_bound":"SDlGUFFXRGQxMQ==","upper_bound":"SEpvenM=","repeats":1},{"count":556,"lower_bound":"SE95Yk1HS3dyeHBH","upper_bound":"SFNoRVhMc0xOUGY4","repeats":1},{"count":564,"lower_bound":"SFo2eWo=","upper_bound":"SG1xV3FsUGI=","repeats":1},{"count":572,"lower_bound":"SG50amtz","upper_bound":"SQ==","repeats":1},{"count":580,"lower_bound":"STFRR2ZHYg==","upper_bound":"SUdDVmxRZA==","repeats":1},{"count":588,"lower_bound":"SUlTc3VXSWRqUVo=","upper_bound":"SU9vcnpRZHZCQng=","repeats":1},{"count":596,"lower_bound":"SVFPWA==","upper_bound":"SWF5","repeats":1},{"count":604,"lower_bound":"SWM=","upper_bound":"SWpYaVJRVjVXeg==","repeats":1},{"count":612,"lower_bound":"SWtv","upper_bound":"Sg==","repeats":1},{"count":620,"lower_bound":"SjFSNW02M2Zsczg=","upper_bound":"Sjh5Rmp2SmpPVzcw","repeats":1},{"count":628,"lower_bound":"SklidjZmbWROQXRHeQ==","upper_bound":"Smhx","repeats":1},{"count":636,"lower_bound":"SnM1Smtzag==","upper_bound":"SnR2ZWtyemxUYjQx","repeats":1},{"count":644,"lower_bound":"SnZPaHk4TnRv","upper_bound":"S0R2d291","repeats":1},{"count":652,"lower_bound":"S0p3Znd5","upper_bound":"S1c0eExNTUNjMDlk","repeats":1},{"count":660,"lower_bound":"S1pFbXY=","upper_bound":"S2lrM1FqZEs4VUljZg==","repeats":1},{"count":668,"lower_bound":"S204N2lxdlY=","upper_bound":"TDlHWUNqa096","repeats":1},{"count":676,"lower_bound":"TEV1UmhVSVM2Vm4=","upper_bound":"TFZ2SlNjVUJp","repeats":1},{"count":684,"lower_bound":"TGZlWEY3MWdrUA==","upper_bound":"TG56MmMyTQ==","repeats":1},{"count":692,"lower_bound":"THE0","upper_bound":"TTcwVQ==","repeats":1},{"count":700,"lower_bound":"TThDRnNuRnY4VG9x","upper_bound":"TUlWVTJBd1A=","repeats":1},{"count":708,"lower_bound":"TUxoZVduWQ==","upper_bound":"TWM4djl1Mg==","repeats":1},{"count":716,"lower_bound":"TWc5TjRQMHdncDU=","upper_bound":"TXRTejR4U3F1SUs=","repeats":1},{"count":724,"lower_bound":"TXY4OFRoTDE=","upper_bound":"Tk83VW0=","repeats":1},{"count":732,"lower_bound":"TlNIQ2Z1OFp3ZmF4","upper_bound":"TmY1TDJDVWo=","repeats":1},{"count":740,"lower_bound":"Tmp5U3BWMDlnRllo","upper_bound":"TnNFVzdmNnp0QldkdQ==","repeats":1},{"count":748,"lower_bound":"TnNReA==","upper_bound":"Tnh4TTdYSUlzemI4","repeats":1},{"count":756,"lower_bound":"TnpqVk52emJiUzA0","upper_bound":"Tzd2MmJNZGw=","repeats":1},{"count":764,"lower_bound":"T0FjVFFrUQ==","upper_bound":"T1UyVm1BRzZtTDRjVA==","repeats":1},{"count":772,"lower_bound":"T1hobmJmaUp0dA==","upper_bound":"T2JRQmhSdHZmbEI=","repeats":1},{"count":780,"lower_bound":"T2hXeHg=","upper_bound":"T25PY2EwaTY=","repeats":1},{"count":788,"lower_bound":"T3FXS0RhVFlINTc=","upper_bound":"UDg=","repeats":1},{"count":796,"lower_bound":"UEZXbzNxeGxtYnVweg==","upper_bound":"UFNW","repeats":1},{"count":804,"lower_bound":"UFduTA==","upper_bound":"UGYyRW1Ebw==","repeats":1},{"count":812,"lower_bound":"UGZaOUluZ0Z1dTlP","upper_bound":"UHN3QUQ0SzI1ZQ==","repeats":1},{"count":820,"lower_bound":"UHZQa0NBbm1oTXM=","upper_bound":"UUIyTDZJcFRVZ0M=","repeats":1},{"count":828,"lower_bound":"UUY0bA==","upper_bound":"UVVPUGlxWEw=","repeats":1},{"count":836,"lower_bound":"UWM2","upper_bound":"UWtHaQ==","repeats":1},{"count":844,"lower_bound":"UW40eVM=","upper_bound":"UXg1YTlxUWN0","repeats":1},{"count":852,"lower_bound":"UjBl","upper_bound":"UjRM","repeats":1},{"count":860,"lower_bound":"UkND","upper_bound":"UlRBYUUwUTVzUg==","repeats":1},{"count":868,"lower_bound":"UllNbm13R1lB","upper_bound":"UmpFbHRDR0FZTThUUA==","repeats":1},{"count":876,"lower_bound":"UnJuMURvbnFKdkZ0MQ==","upper_bound":"UnpVRE16b1ZsaQ==","repeats":1},{"count":884,"lower_bound":"Uw==","upper_bound":"U0hZb2phdUJyV0t6","repeats":1},{"count":892,"lower_bound":"U0hodWRxcTQ=","upper_bound":"U2dL","repeats":1},{"count":900,"lower_bound":"U2l2dWt0WWlM","upper_bound":"U25yMVUyMGlnbGY5","repeats":1},{"count":908,"lower_bound":"U3M=","upper_bound":"VDY=","repeats":1},{"count":916,"lower_bound":"VDhGcGRaV0k=","upper_bound":"VEk3Mkh5Y0FsWjNlcA==","repeats":1},{"count":924,"lower_bound":"VEowbA==","upper_bound":"VFNxdnh3T0E=","repeats":1},{"count":932,"lower_bound":"VFN4OEhxMQ==","upper_bound":"VFo=","repeats":1},{"count":940,"lower_bound":"VFp4MVg=","upper_bound":"VHNv","repeats":1},{"count":948,"lower_bound":"VHV5","upper_bound":"VTY2bzVUVEhIYg==","repeats":1},{"count":956,"lower_bound":"VUFpN25IczV3Y2ZISQ==","upper_bound":"VUo0ZUVYQjc4UkQ2TQ==","repeats":1},{"count":964,"lower_bound":"VU0=","upper_bound":"VWk=","repeats":1},{"count":972,"lower_bound":"VWpl","upper_bound":"VXc0TlB1eWRRbE1t","repeats":1},{"count":980,"lower_bound":"VXk2enRheEw4azBZ","upper_bound":"VjR4N1NmQkxN","repeats":1},{"count":988,"lower_bound":"VkVCcQ==","upper_bound":"Vk1adDFpalhi","repeats":1},{"count":996,"lower_bound":"Vk4=","upper_bound":"VlRJ","repeats":1},{"count":1004,"lower_bound":"VmFpa3E=","upper_bound":"Vm9Fc2w=","repeats":1},{"count":1012,"lower_bound":"VnRBQUZGcExLWWpIUA==","upper_bound":"Vw==","repeats":1},{"count":1020,"lower_bound":"VzE=","upper_bound":"V0s5QU5hcmlpN3dP","repeats":1},{"count":1028,"lower_bound":"V1hmVDQ0bm5a","upper_bound":"V2lrM2FEajM=","repeats":1},{"count":1036,"lower_bound":"V293UEhE","upper_bound":"V3pEYXVWTzNB","repeats":1},{"count":1044,"lower_bound":"WA==","upper_bound":"WA==","repeats":7},{"count":1052,"lower_bound":"WDA=","upper_bound":"WDdvTThyWkhVWg==","repeats":1},{"count":1060,"lower_bound":"WE1p","upper_bound":"WGJsM1BVUWVGMlQ=","repeats":1},{"count":1068,"lower_bound":"WGcxR05FTWs=","upper_bound":"WGh5WXZXYk1JWGs=","repeats":1},{"count":1076,"lower_bound":"WGx1eg==","upper_bound":"WHZBbDY1","repeats":1},{"count":1084,"lower_bound":"WTBjZU8=","upper_bound":"WTZIRGl1VEE1","repeats":1},{"count":1092,"lower_bound":"WTdz","upper_bound":"WUVo","repeats":1},{"count":1100,"lower_bound":"WU02cw==","upper_bound":"WVdYcllWbTBxM2I=","repeats":1},{"count":1108,"lower_bound":"WVg5WHE5Rg==","upper_bound":"WWV2cEQ=","repeats":1},{"count":1116,"lower_bound":"WXNGQjFlWU8z","upper_bound":"WXh1bmtmaA==","repeats":1},{"count":1124,"lower_bound":"Wg==","upper_bound":"WjNuR1RSdkR5VFk=","repeats":1},{"count":1132,"lower_bound":"WjdVVmdXV05HQkVG","upper_bound":"WkhZZG1OOFA1ODJybw==","repeats":1},{"count":1140,"lower_bound":"Wks=","upper_bound":"Wk1CaUEz","repeats":1},{"count":1148,"lower_bound":"Wk9KRmw2T3pKMW9xeQ==","upper_bound":"WlVXTVJBOQ==","repeats":1},{"count":1156,"lower_bound":"WlhzVUJBVDE=","upper_bound":"Wm0=","repeats":1},{"count":1164,"lower_bound":"WnEwdQ==","upper_bound":"Wnc=","repeats":1},{"count":1172,"lower_bound":"WndIRHI3bVVxUkNsQg==","upper_bound":"YTRQdWdkUGg=","repeats":1},{"count":1180,"lower_bound":"YTdQQ1JURXA=","upper_bound":"YUgwZ3QwcVdF","repeats":1},{"count":1188,"lower_bound":"YU9XNnQ=","upper_bound":"Yg==","repeats":1},{"count":1196,"lower_bound":"YjNwNDFtcXlFbTM=","upper_bound":"YkxGYnpDZDc=","repeats":1},{"count":1204,"lower_bound":"YlFUbg==","upper_bound":"YlZpQjV6cWJLRnNRbg==","repeats":1},{"count":1212,"lower_bound":"YnZVR25pdUlMWXJa","upper_bound":"YzFFdWg=","repeats":1},{"count":1220,"lower_bound":"YzFsaA==","upper_bound":"Y0hTU2hEbFA=","repeats":1},{"count":1228,"lower_bound":"Y0pwNk0=","upper_bound":"Y2FUNzNpQ1JW","repeats":1},{"count":1236,"lower_bound":"Y2ZIbzY2TlRFTm9wcw==","upper_bound":"Y3lLYw==","repeats":1},{"count":1244,"lower_bound":"ZA==","upper_bound":"ZDk3SUg=","repeats":1},{"count":1252,"lower_bound":"ZENCMDJTQjU=","upper_bound":"ZEwxc0M5WFI=","repeats":1},{"count":1260,"lower_bound":"ZE9YTw==","upper_bound":"ZFJUdA==","repeats":1},{"count":1268,"lower_bound":"ZGUzNHpQ","upper_bound":"ZHhKajdQZU9QUG1x","repeats":1},{"count":1276,"lower_bound":"ZHl5ZU90","upper_bound":"ZTE3c21vWXhY","repeats":1},{"count":1284,"lower_bound":"ZUhXdUY0bU1adHg=","upper_bound":"ZWM=","repeats":1},{"count":1292,"lower_bound":"ZWZUcA==","upper_bound":"ZXlabVc4cGhPOWJTcw==","repeats":1},{"count":1300,"lower_bound":"ZjQwZ2FJek45aWln","upper_bound":"ZlA=","repeats":1},{"count":1308,"lower_bound":"ZlE=","upper_bound":"ZlJIOQ==","repeats":1},{"count":1316,"lower_bound":"ZlJsNlVlQ20=","upper_bound":"ZllDc2lXYkI=","repeats":1},{"count":1324,"lower_bound":"ZllGak01UTZqREdjMA==","upper_bound":"Zm1aMUVuendEeG9B","repeats":1},{"count":1332,"lower_bound":"Zm9ZRQ==","upper_bound":"ZnJaemVveWZ4d0g2bA==","repeats":1},{"count":1340,"lower_bound":"ZnNyWUJpTnZZaEFrbA==","upper_bound":"ZnZqZmo=","repeats":1},{"count":1348,"lower_bound":"Zw==","upper_bound":"ZzhUVXV1VnU=","repeats":1},{"count":1356,"lower_bound":"Z0d6QmFTcnhXSDBrdQ==","upper_bound":"Z1g1eVho","repeats":1},{"count":1364,"lower_bound":"Z2NwT3VHRmNJN2J6","upper_bound":"Z28=","repeats":1},{"count":1372,"lower_bound":"Z29zT1RUdTNvUg==","upper_bound":"Z3VYcG9x","repeats":1},{"count":1380,"lower_bound":"Z3YwTERMb1NNOXBD","upper_bound":"aDk5TTBDSU9s","repeats":1},{"count":1388,"lower_bound":"aElOVkc=","upper_bound":"aGdHNUozdm50","repeats":1},{"count":1396,"lower_bound":"aG10Tw==","upper_bound":"aHhxNGwzdGFYdXhXMw==","repeats":1},{"count":1404,"lower_bound":"aTBCdUQ=","upper_bound":"aTZ0MENTSUN6cEFhUA==","repeats":1},{"count":1412,"lower_bound":"aUl5","upper_bound":"aU1WUTZ0bmZlNw==","repeats":1},{"count":1420,"lower_bound":"aVExSHUzdHh1YQ==","upper_bound":"aWhQQmN4Yw==","repeats":1},{"count":1428,"lower_bound":"aW14REpRWA==","upper_bound":"ajBYNlRjSUR4","repeats":1},{"count":1436,"lower_bound":"ajdJSnVjNTVt","upper_bound":"aklmeHc1","repeats":1},{"count":1444,"lower_bound":"alJ4NzNoU2o=","upper_bound":"amYyUg==","repeats":1},{"count":1452,"lower_bound":"amdKMEY=","upper_bound":"anU=","repeats":1},{"count":1460,"lower_bound":"ang=","upper_bound":"a0FVM0lEbA==","repeats":1},{"count":1468,"lower_bound":"a0Js","upper_bound":"a0ZoblI=","repeats":1},{"count":1476,"lower_bound":"a0ptVTF4RnRF","upper_bound":"a1NhejJ3UW9JeGs=","repeats":1},{"count":1484,"lower_bound":"a1Y4Mg==","upper_bound":"a2tWMlNudjVHNg==","repeats":1},{"count":1492,"lower_bound":"a25pUw==","upper_bound":"a3d0aDRPZU1u","repeats":1},{"count":1500,"lower_bound":"a3g3Y1dET0U=","upper_bound":"bA==","repeats":1},{"count":1508,"lower_bound":"bDF0cg==","upper_bound":"bDRjaW1WeQ==","repeats":1},{"count":1516,"lower_bound":"bDlZT0l6c0VzcGZSWA==","upper_bound":"bFJQR0xzdEFT","repeats":1},{"count":1524,"lower_bound":"bFZyN2dOOEhQNUY=","upper_bound":"bGY3YUUxMU1lSGxzRQ==","repeats":1},{"count":1532,"lower_bound":"bHJUOEJQUm8zZXA=","upper_bound":"bHlKSUU4bw==","repeats":1},{"count":1540,"lower_bound":"bQ==","upper_bound":"bTRXTFJKbWk4cg==","repeats":1},{"count":1548,"lower_bound":"bTc=","upper_bound":"bUpLanByWllj","repeats":1},{"count":1556,"lower_bound":"bU1RVHhOOVg=","upper_bound":"bVkxWHgyMg==","repeats":1},{"count":1564,"lower_bound":"bWpJTjU4dGlJUg==","upper_bound":"bXBkWmcwdnlJ","repeats":1},{"count":1572,"lower_bound":"bXNF","upper_bound":"bXc0YWZoUFd3TDRZ","repeats":1},{"count":1580,"lower_bound":"bg==","upper_bound":"bjlhTw==","repeats":1},{"count":1588,"lower_bound":"bkVZVnZ2c1pNSmU=","upper_bound":"blVnNVU=","repeats":1},{"count":1596,"lower_bound":"bmVoOGlKazRZ","upper_bound":"bm9PV0RJajZaZmgx","repeats":1},{"count":1604,"lower_bound":"bnFHbW03c043Tldh","upper_bound":"bndGSENIUDNh","repeats":1},{"count":1612,"lower_bound":"bnlTUXJuSFRQ","upper_bound":"bzc=","repeats":1},{"count":1620,"lower_bound":"b0NzYTRuUTdQdEF1eg==","upper_bound":"b1N4bjIySFh6","repeats":1},{"count":1628,"lower_bound":"b1k=","upper_bound":"b281Vw==","repeats":1},{"count":1638,"lower_bound":"b3JYMmN2ZjlLck1G","upper_bound":"cA==","repeats":5},{"count":1646,"lower_bound":"cDRodklRdEp1ZWJGVA==","upper_bound":"cEpHU3BQSFZoTw==","repeats":1},{"count":1654,"lower_bound":"cE9aMktqMEY=","upper_bound":"cGR1OExFS3BHUjJE","repeats":1},{"count":1662,"lower_bound":"cGZuV243Y1ZlTXlnVQ==","upper_bound":"cG9TTllUeEdPVzd6","repeats":1},{"count":1670,"lower_bound":"cG9YeHU3Rw==","upper_bound":"cHVRTXVYSzEyTw==","repeats":1},{"count":1678,"lower_bound":"cHdCa2ltV3NKb04=","upper_bound":"cTJwYWU0Z0RYSGtRTw==","repeats":1},{"count":1686,"lower_bound":"cTc=","upper_bound":"cVk2YThGZ1NMVw==","repeats":1},{"count":1694,"lower_bound":"cWRzN2xQTw==","upper_bound":"cXIw","repeats":1},{"count":1702,"lower_bound":"cXNXR2o=","upper_bound":"cjc=","repeats":1},{"count":1710,"lower_bound":"cjhacURkcXkzRjVQ","upper_bound":"ckh0","repeats":1},{"count":1718,"lower_bound":"cktOWjFZ","upper_bound":"clY=","repeats":1},{"count":1726,"lower_bound":"clZ5Ylk4aw==","upper_bound":"cmRROEVR","repeats":1},{"count":1736,"lower_bound":"cm0zNlVYaQ==","upper_bound":"cw==","repeats":3},{"count":1744,"lower_bound":"czFDcXdScw==","upper_bound":"czVUTW5B","repeats":1},{"count":1752,"lower_bound":"czZtdzds","upper_bound":"c0Q4","repeats":1},{"count":1760,"lower_bound":"c001YnYwOUtmQU0=","upper_bound":"c2t1bUhKOEM=","repeats":1},{"count":1768,"lower_bound":"c2xyRVo5bg==","upper_bound":"dA==","repeats":1},{"count":1776,"lower_bound":"dDFzNw==","upper_bound":"dEJCcVp4a0psanA=","repeats":1},{"count":1784,"lower_bound":"dEZNRUJk","upper_bound":"dFZB","repeats":1},{"count":1792,"lower_bound":"dGU5MTMzQkQ=","upper_bound":"dHEwRmg=","repeats":1},{"count":1802,"lower_bound":"dHJtR0VI","upper_bound":"dQ==","repeats":3},{"count":1810,"lower_bound":"dTJCZVBWM2lVQWFq","upper_bound":"dTk0","repeats":1},{"count":1818,"lower_bound":"dUF3TDhXdWpp","upper_bound":"dVEzaHNUaHA=","repeats":1},{"count":1826,"lower_bound":"dVRnZ01ORlI=","upper_bound":"dWQzYm5JMzNPRQ==","repeats":1},{"count":1834,"lower_bound":"dXFUMFBVNW1PMA==","upper_bound":"djA=","repeats":1},{"count":1842,"lower_bound":"djFEMXVEcEZmZk1wVA==","upper_bound":"djdZNg==","repeats":1},{"count":1850,"lower_bound":"dkJQVQ==","upper_bound":"dlNacnNPelk=","repeats":1},{"count":1858,"lower_bound":"dlVyNXJQ","upper_bound":"dmpvRVY5enN3Zw==","repeats":1},{"count":1866,"lower_bound":"dnBLYg==","upper_bound":"dnY=","repeats":1},{"count":1874,"lower_bound":"dnd2","upper_bound":"dnp0cWc1ODZ5b3RM","repeats":1},{"count":1882,"lower_bound":"dzRNU2ZSZndrZGQ=","upper_bound":"dzk4dWRnU0lsdA==","repeats":1},{"count":1890,"lower_bound":"d0NC","upper_bound":"d1FkUDc5bw==","repeats":1},{"count":1898,"lower_bound":"d1Nia0JUa2Q3","upper_bound":"d2NsQUE0V2s=","repeats":1},{"count":1906,"lower_bound":"d2k=","upper_bound":"eA==","repeats":1},{"count":1914,"lower_bound":"eDBsYUtMWWdkandF","upper_bound":"eEFxU1hHQ1Bn","repeats":1},{"count":1922,"lower_bound":"eE5DZGtM","upper_bound":"eFhr","repeats":1},{"count":1930,"lower_bound":"eFhxS2ttSDlyZ0RFRw==","upper_bound":"eG5I","repeats":1},{"count":1938,"lower_bound":"eG9vRmhFQWx1","upper_bound":"eHY5enc=","repeats":1},{"count":1946,"lower_bound":"eHZFQw==","upper_bound":"eTFDUVUzd1p3alM=","repeats":1},{"count":1954,"lower_bound":"eTZodW01UVhnUw==","upper_bound":"eTlDR1BSVnBxQg==","repeats":1},{"count":1962,"lower_bound":"eUNLR0kxV05GTVhSeQ==","upper_bound":"eUlY","repeats":1},{"count":1970,"lower_bound":"eUtiZw==","upper_bound":"eVMwdlk=","repeats":1},{"count":1978,"lower_bound":"eVVOUXBZMA==","upper_bound":"ejBpZXFJ","repeats":1},{"count":1986,"lower_bound":"ejhIZW1WYTc4R2FO","upper_bound":"elowcFdONU1Bcmk=","repeats":1},{"count":1994,"lower_bound":"emN1RnAycU4=","upper_bound":"enNJUjhHM1BCRlRqWA==","repeats":1},{"count":2000,"lower_bound":"enNwamVpTA==","upper_bound":"enpGczBS","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,2,1,0,0,0,2,0,1,0,0,1,1,1,1,0,1,2,1,0,1,0,0,0,0,0,0,1,1,0,0,0,1,1,1,1,0,1,0,0,2,2,0,1,1,0,0,0,0,3,1,2,0,4,1,1,0,1,0,0,3,3,1,2,0,0,1,2,1,0,0,0,1,1,2,1,2,1,0,1,1,2,1,2,0,0,1,2,0,1,0,0,2,0,1,0,1,0,1,1,2,1,1,2,1,0,2,0,1,1,0,1,2,1,1,0,0,1,2,1,0,1,0,1,0,0,2,0,1,1,0,3,0,1,2,2,0,3,2,2,1,0,2,1,3,2,1,0,0,0,1,2,1,0,1,0,1,2,0,0,2,3,3,1,2,0,1,1,1,2,1,2,0,1,1,3,0,1,1,0,3,0,2,0,1,1,2,1,2,0,2,0,2,1,1,0,1,2,0,1,2,1,0,3,0,1,0,2,1,0,1,0,0,0,0,0,0,1,0,1,1,2,1,1,0,1,0,4,0,0,1,1,2,0,0,5,1,0,0,2,1,1,0,2,1,0,0,1,0,1,0,1,0,5,4,0,0,1,0,0,0,3,1,0,1,2,0,2,1,0,1,0,1,0,1,1,1,1,2,3,2,1,2,1,1,1,3,1,1,0,0,0,0,0,0,2,1,2,0,0,2,1,0,1,0,1,2,1,0,3,0,0,1,1,1,0,0,1,1,1,1,0,3,4,1,1,1,3,2,2,2,1,0,0,0,2,2,0,2,0,0,1,3,0,0,0,2,0,2,3,0,0,1,2,0,0,1,2,3,0,0,1,1,1,2,1,0,2,0,2,1,1,2,1,1,4,1,1,1,0,2,3,2,2,0,0,0,2,0,1,1,1,1,0,1,0,0,0,2,0,1,0,0,1,0,0,2,1,3,0,0,0,2,1,1,3,1,0,1,1,0,2,2,0,5,0,1,0,0,1,1,0,1,0,0,0,0,1,1,2,1,0,2,0,1,2,0,2,1,1,0,0,1,2,2,1,0,0,0,0,0,0,2,0,0,0,0,1,0,2,0,1,1,2,0,2,0,2,0,1,0,1,1,0,2,0,1,0,2,1,0,1,0,1,0,1,1,3,1,1,0,4,0,1,1,1,0,1,1,0,0,3,0,1,1,4,1,2,1,0,0,1,2,1,1,0,1,2,2,2,3,0,1,1,0,1,3,3,1,1,6,1,1,4,1,0,1,0,3,0,1,1,3,1,1,1,0,1,1,0,1,2,1,0,1,0,2,2,0,0,0,1,0,2,0,1,0,0,0,0,1,0,3,0,0,0,1,2,2,2,1,3,3,1,2,1,1,1,1,0,0,1,1,4,1,2,1,0,6,0,1,2,1,1,1,0,1,2,1,0,0,0,0,0,0,3,1,1,1,1,0,1,0,5,3,1,2,0,0,0,2,1,0,0,0,1,0,2,2,0,0,1,2,1,2,0,0,0,3,1,0,3,0,2,0,0,0,1,0,0,0,1,0,0,0,0,1,3,1,1,1,1,1,0,1,1,0,1,1,0,2,4,1,0,1,2,0,0,0,0,1,1,1,0,0,0,1,2,2,0,0,0,1,0,1,1,2,0,2,0,1,1,1,0,0,0,0,1,2,1,0,0,1,0,2,2,1,1,3,0,0,1,2,0,1,1,1,1,0,1,3,2,1,2,0,0,2,1,2,1,0,2,0,0,1,0,0,0,0,0,1,1,1,0,1,1,1,0,4,2,2,0,2,0,1,0,3,0,0,1,0,0,2,0,1,1,0,1,1,1,0,2,1,0,1,1,0,2,0,0,1,1,0,0,0,1,0,1,0,0,0,0,0,2,0,3,0,2,1,1,1,2,1,0,1,3,0,1,1,0,1,0,0,2,3,0,1,3,1,1,1,1,3,1,0,0,1,0,0,2,1,1,1,1,3,2,2,1,3,0,0,0,0,0,2,0,0,0,0,1,1,0,1,0,3,0,1,1,0,0,1,0,1,0,0,1,1,0,4,1,3,1,0,0,0,1,0,2,0,0,1,1,0,2,1,1,1,1,4,1,1,2,1,1,0,2,0,2,2,2,4,2,1,0,0,2,0,1,0,0,1,3,1,0,0,2,1,1,1,1,0,2,0,0,2,3,1,1,0,5,1,3,0,0,1,4,1,2,2,1,1,1,3,1,1,2,0,1,2,1,1,1,3,0,0,1,3,1,1,1,0,1,0,2,1,1,0,3,2,1,1,1,0,3,0,2,0,1,0,1,0,3,0,2,0,1,0,3,0,1,0,1,1,2,1,0,1,3,2,0,0,0,0,1,4,0,2,1,2,2,7,1,2,2,0,1,4,1,0,1,2,3,0,4,2,0,0,2,0,0,0,2,1,0,0,2,1,2,3,1,1,3,1,2,2,1,0,0,1,1,2,0,5,0,1,1,0,2,0,0,1,2,0,4,3,0,0,2,0,2,0,1,0,0,0,0,0,1,1,1,0,1,0,2,1,1,1,2,0,1,0,0,1,1,2,3,2,0,2,3,1,3,1,0,0,0,1,3,1,0,1,0,0,2,2,0,0,1,1,2,1,4,0,2,0,0,0,0,1,2,0,0,0,0,1,2,1,0,0,1,0,0,0,0,1,0,2,1,0,1,2,1,2,0,2,3,0,1,3,1,0,1,1,0,2,3,2,1,1,0,3,0,1,0,2,1,1,1,0,2,1,0,1,0,1,0,2,3,0,3,1,0,3,0,1,1,0,1,0,1,0,1,4,1,2,0,1,2,0,0,0,1,3,0,0,0,1,2,1,1,0,0,1,0,1,1,0,0,2,3,1,1,3,0,1,0,0,2,0,1,0,1,1,0,2,1,0,5,1,2,0,0,1,0,0,1,1,2,0,0,0,1,1,0,1,0,3,1,1,0,2,0,2,2,1,1,0,1,0,0,2,0,1,0,1,1,2,3,3,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,0,0,3,0,0,0,1,0,2,1,1,2,1,3,0,0,0,1,0,1,1,1,0,0,2,1,1,2,1,2,1,1,2,0,1,0,0,0,1,1,1,0,1,0,0,0,1,3,0,1,0,0,1,2,0,1,0,0,0,2,2,0,0,0,1,1,0,2,1,0,0,0,0,3,0,1,0,2,1,0,0,2,0,1,2,2,5,0,0,2,0,4,1,0,5,1,1,0,0,1,3,2,0,2,2,1,1,2,0,1,0,1,0,0,1,1,1,1,0,1,1,1,0,2,0,1,2,3,0,1,1,1,2,1,0,1,1,1,0,0,0,0,1,1,1,0,1,1,0,2,1,0,0,2,1,0,2,1,1,0,1,1,1,1,1,1,3,2,2,0,3,1,0,2,0,1,0,0,1,0,0,1,3,0,1,0,4,0,1,0,1,4,0,2,2,1,1,1,1,1,1,0,1,0,1,1,1,2,2,0,0,1,0,1,1,1,1,0,1,0,1,0,1,1,1,0,2,2,2,0,0,0,0,2,0,5,2,2,1,2,0,1,1,0,1,1,1,7,1,0,1,0,1,2,2,1,0,0,1,1,0,0,1,3,1,3,0,1,4,1,0,4,1,3,1,0,2,1,0,0,1,1,0,1,2,0,0,1,2,0,0,2,1,0,1,2,0,1,1,1,2,2,2,1,0,2,0,1,0,0,2,0,2,0,1,2,1,2,1,2,1,1,0,2,2,1,0,1,3,1,2,1,0,0,0,1,2,1,1,1,1,0,1,0,1,2,0,0,1,2,1,1,1,1,1,0,1,0,0,0,0,2,1,2,1,2,0,5,1,0,1,0,1,1,1,2,0,0,1,1,1,2,0,1,0,1,2,2,0,2,2,1,1,0,3,1,0,1,0,0,1,0,1,0,1,4,3,1,0,2,2,1,2,1,2,0,1,0,1,0,2,0,0,2,1,0,0,0,0,1,2,0,0,0,2,0,2,1,0,1,0,0,2,1,1,1,3,1,0,2,2,0,0,1,1,1,0,0,1,1,0,1,1,0,0,0,0,3,1,1,3,0,1,0,1,0,1,6,1,0,1,0,3,0,0,0,1,1,1,0,2,2,2,2,1,1,1,1,0,1,1,2,5,0,1,2,0,2,2,0,1,0,0,4,1,1,0,1,0,1,0,0,2,3,0,0,0,2,2,0,0,3,2,0,2,1,2,2,0,1,1,2,1,2,0,0,1,2,1,2,0,0,3,0,1,2,2,0,1,1,2,0,1,1,1,1,0,0,1,0,1,0,0,1,3,0,1,1,2,0,5,0,0,1,0,0,1,1,0,1,0,2,0,1,0,1,2,0,0,0,2,0,2,1,1,3,0,1,0,2,0,0,1,0,2,2,0,1,2,4,0,1,3,4,1,1,1,3,2,0,1,1,1,0,1,2,5,1,2,0,2,1,2,0,1,0,1,2,0,1,3,1,0,1,0,1,1,0,1,1,0,2,2,0,0,1,1,1,0,1,1,1,1,0,2,0,1,1,2,1,1,1,0,0,0,1,1,0,1,2,1,1,0,2,3,1,0,0,1,1,0,1,3,0,1,1,1,1,1,1,2,1,0]},{"counters":[0,1,0,0,0,1,0,1,0,1,6,0,1,1,2,0,0,3,1,0,2,0,0,1,1,0,2,0,0,1,0,2,0,1,0,2,3,2,0,3,0,0,1,1,1,2,1,1,2,1,0,1,1,0,4,4,0,0,3,1,1,2,1,0,2,2,0,0,1,3,0,1,0,2,1,0,3,1,1,1,2,2,1,0,1,2,2,1,0,0,1,1,2,1,1,0,0,0,0,0,2,1,1,1,1,1,4,1,1,3,1,1,1,0,1,2,0,3,0,5,1,2,1,1,0,2,1,0,1,0,1,0,0,1,0,0,0,2,0,0,2,0,0,5,0,1,1,2,3,1,2,0,0,1,2,0,2,1,0,1,0,2,0,2,0,1,0,0,0,1,0,1,0,0,0,0,2,1,0,1,4,1,0,0,2,0,0,1,2,1,2,0,1,1,0,0,1,1,1,1,0,0,2,3,1,1,2,0,0,4,0,0,0,1,1,1,0,0,1,0,1,0,1,3,3,2,1,0,0,0,1,0,0,0,1,0,2,0,0,0,2,2,1,1,3,1,1,2,0,1,0,0,0,0,2,0,2,2,0,2,0,1,0,0,0,1,0,0,0,0,0,0,2,1,1,1,3,2,3,0,1,2,1,2,2,0,0,1,2,1,1,0,3,4,0,1,1,2,0,1,4,0,0,0,3,1,1,0,2,2,1,0,0,0,1,4,2,0,1,1,1,1,0,2,2,1,0,2,1,1,2,0,3,0,0,0,0,1,1,0,0,0,1,0,2,1,1,1,1,0,1,1,1,1,0,0,1,2,2,0,1,0,0,1,0,1,5,0,2,0,1,0,2,0,1,1,0,2,2,1,2,2,1,1,0,1,0,2,0,1,1,1,5,0,0,0,2,0,0,2,3,1,0,0,0,1,1,0,2,1,1,3,0,0,0,0,3,0,1,0,0,1,0,3,0,3,0,0,1,3,1,6,2,1,0,1,0,1,1,0,2,0,0,1,2,1,1,0,5,0,1,1,0,1,1,0,1,1,1,0,1,0,2,1,2,1,3,1,0,0,2,2,0,2,2,1,0,1,0,0,4,0,1,0,0,2,1,2,0,1,1,0,0,0,1,0,2,0,2,1,0,1,1,1,1,0,0,0,1,0,1,1,3,1,1,0,1,0,1,1,3,2,0,0,2,0,2,2,0,2,1,0,2,0,2,3,1,2,1,5,1,0,1,6,1,0,2,1,1,3,0,3,1,3,0,1,1,0,0,0,1,0,2,0,0,1,0,0,1,0,0,0,2,3,0,2,0,1,2,2,3,0,0,0,0,0,1,0,1,1,3,0,1,0,2,1,0,0,0,2,0,0,1,0,1,1,3,2,0,6,0,0,2,1,2,1,2,0,2,1,1,3,1,2,1,0,2,0,1,1,2,1,1,2,1,1,1,2,0,0,2,2,2,0,0,1,1,3,3,0,2,1,0,0,1,3,0,2,1,2,0,2,1,0,0,1,0,0,0,0,3,0,0,1,1,1,2,1,1,0,3,3,2,1,1,1,1,2,2,0,0,0,2,0,0,1,1,1,0,0,3,3,1,0,1,0,0,2,1,3,0,0,2,0,1,1,0,0,1,0,1,1,2,2,0,0,0,0,5,0,2,0,1,1,4,0,0,2,2,0,1,4,0,2,1,0,4,0,1,1,0,2,1,1,2,0,4,1,1,1,0,0,0,1,2,1,0,2,0,0,0,3,1,0,1,1,1,2,2,1,0,0,2,0,2,2,1,3,0,0,1,1,1,0,2,0,1,1,0,2,0,2,0,0,0,1,1,0,1,0,1,0,2,0,1,2,0,2,1,0,1,0,1,2,0,3,0,0,2,2,1,2,1,0,1,0,1,1,0,1,0,0,2,3,2,0,0,0,0,5,1,1,1,1,1,0,0,1,1,3,0,1,4,2,3,0,0,3,0,1,1,1,1,0,1,1,1,2,0,1,0,3,1,0,1,1,0,2,1,0,3,2,0,0,0,1,1,1,0,1,3,1,0,0,0,1,0,2,1,1,0,0,2,0,0,2,0,0,1,2,0,0,2,3,1,0,2,0,0,1,2,0,1,0,1,1,1,0,2,1,0,1,3,0,1,0,1,0,0,0,0,2,0,0,1,2,1,1,0,2,0,2,2,1,0,1,0,1,4,2,0,1,1,0,0,1,0,0,0,0,1,0,0,2,0,0,4,0,0,3,0,0,0,1,1,0,2,2,2,6,0,0,0,0,1,0,0,1,1,2,2,0,0,2,0,0,1,0,1,4,3,2,2,0,0,0,1,0,3,1,1,0,1,0,0,0,1,0,1,0,2,1,2,0,2,1,1,1,3,0,4,2,1,0,2,2,1,1,0,1,0,1,0,0,1,1,1,1,1,0,1,0,2,0,1,2,1,1,0,0,0,0,4,1,3,0,3,0,4,0,0,0,0,0,2,0,2,0,3,3,2,1,0,1,1,0,2,1,1,1,4,1,1,2,2,2,1,1,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,1,0,2,0,2,3,4,3,0,2,0,2,0,1,1,0,1,3,1,0,0,0,1,0,2,0,0,4,2,0,1,1,1,0,1,1,1,2,1,5,0,1,1,2,3,0,0,1,0,0,1,1,1,0,0,0,1,0,0,2,1,0,2,3,0,0,1,4,0,2,1,1,1,1,1,1,4,1,1,0,1,0,3,2,1,0,1,0,1,0,1,0,1,2,2,2,2,2,0,0,1,1,0,0,0,2,0,0,2,0,1,0,0,2,0,1,0,3,0,0,0,1,0,0,2,0,1,3,0,0,0,1,0,3,1,1,0,0,0,1,0,0,2,2,1,0,0,1,3,0,1,2,2,1,1,1,0,0,4,2,1,0,0,3,1,0,1,1,0,2,0,2,0,1,0,0,3,0,1,2,1,1,2,0,1,0,4,1,1,0,0,1,0,0,3,0,0,0,0,1,0,1,1,0,1,1,0,1,1,1,2,0,1,0,2,1,1,0,1,0,0,2,0,1,2,1,0,0,0,1,1,1,1,3,0,2,0,0,1,1,1,2,2,2,0,1,0,0,0,1,3,0,0,0,0,0,2,0,0,2,1,0,1,0,1,0,2,0,0,3,0,1,1,0,4,0,0,1,1,2,1,1,0,0,0,3,0,0,0,0,1,1,6,4,1,0,1,1,3,0,1,0,1,1,1,1,1,3,1,2,0,0,2,1,4,0,2,0,1,1,2,3,2,0,2,0,1,2,1,2,1,1,0,0,2,1,0,2,1,4,0,2,2,1,2,0,2,0,0,0,2,0,2,2,3,1,0,1,0,0,0,0,1,0,4,1,0,1,1,1,0,1,3,1,0,0,0,0,0,3,2,2,2,1,0,0,1,0,1,2,2,1,0,2,0,2,0,1,1,1,1,0,1,1,0,1,2,1,1,0,1,1,1,1,2,2,3,0,0,2,0,0,1,1,0,2,0,0,3,0,3,0,1,2,1,2,1,5,1,0,0,1,0,1,1,0,0,0,2,1,1,1,1,0,1,0,0,2,1,2,0,0,1,1,0,1,1,1,0,1,1,0,0,2,2,3,0,0,0,1,0,0,1,3,0,2,0,0,1,0,1,2,0,1,0,0,1,1,2,2,2,1,0,0,0,5,2,0,1,1,1,1,1,0,1,3,1,2,1,0,0,1,0,1,0,2,2,0,0,0,2,0,0,2,0,1,2,1,1,0,2,1,0,1,4,1,2,1,2,0,1,0,0,2,1,0,0,0,2,0,1,1,2,2,0,1,0,0,1,2,1,1,1,0,1,0,0,0,0,1,2,1,1,0,0,1,0,0,1,0,1,1,0,0,0,1,2,1,0,1,2,0,1,0,3,1,1,1,2,0,3,2,2,1,1,0,1,0,1,3,1,0,4,3,1,2,0,2,1,4,1,0,0,1,0,0,3,0,1,2,1,2,0,0,3,1,2,1,1,3,0,2,2,0,0,0,1,1,4,0,1,1,0,1,2,1,2,1,0,1,1,0,2,1,0,0,0,1,2,0,0,0,1,1,2,1,2,1,1,0,2,1,1,2,0,0,1,0,2,1,1,0,1,1,1,0,1,0,0,0,0,2,2,1,0,1,0,0,0,1,2,1,1,1,3,1,2,0,0,0,2,1,1,2,1,0,0,1,2,0,1,1,0,1,1,3,1,0,1,1,1,1,1,1,0,1,0,0,0,0,1,1,2,1,1,0,1,1,2,1,1,1,1,1,2,1,1,0,1,2,1,3,2,2,0,1,2,2,2,1,2,1,1,0,0,0,1,1,0,0,2,0,2,4,1,1,0,0,2,1,0,0,3,2,1,0,0,0,1,0,0,0,1,3,2,1,1,0,1,0,2,1,3,1,0,1,0,0,2,0,0,1,2,0,0,0,1,1,0,0,1,1,1,1,0,1,3,0,1,0,0,1,0,0,0,1,0,2,0,2,3,4,4,2,2,0,4,2,0,1,0,3,0,0,1,0,1,3,2,1,2,0,3,0,0,0,1,4,1,2,0,2,1,1,0,1,0,0]},{"counters":[6,1,1,5,1,1,0,1,0,1,0,2,1,1,1,0,2,1,0,2,0,2,2,0,2,1,0,2,0,1,1,1,3,1,2,0,1,0,0,1,3,1,0,2,1,0,0,2,0,1,1,1,0,2,0,1,0,0,1,0,0,1,1,1,2,0,0,1,0,2,0,1,1,1,0,2,0,0,1,1,1,1,2,1,1,1,2,1,0,0,1,0,1,0,0,0,0,3,1,2,0,0,2,0,1,0,1,0,0,1,1,0,2,0,0,0,0,1,2,1,0,1,0,1,0,1,2,0,1,0,1,0,0,1,2,1,0,0,5,3,5,1,1,0,1,1,2,2,0,3,2,1,0,0,0,0,1,1,0,3,0,0,2,0,0,0,0,3,1,1,0,1,0,1,3,1,0,1,2,0,0,0,1,1,0,0,2,0,0,0,0,0,1,0,1,0,0,1,2,2,0,0,1,0,2,1,2,0,1,0,4,2,0,0,0,1,1,1,0,1,0,2,1,0,0,1,1,1,0,1,0,0,0,0,0,3,4,1,0,0,1,0,1,1,0,0,0,0,0,3,0,1,1,0,1,2,3,3,2,0,0,1,2,1,0,1,0,2,1,0,0,3,1,1,2,0,1,1,4,1,1,1,1,0,0,1,0,0,0,0,1,3,0,4,1,2,0,0,1,1,1,4,0,3,2,1,2,2,0,0,1,1,0,0,2,2,0,0,1,0,0,0,1,0,0,2,0,1,2,0,1,1,2,0,1,0,1,0,4,0,3,0,1,1,1,0,3,1,3,1,2,2,0,2,1,1,2,0,1,3,2,1,1,1,0,2,2,1,1,1,2,0,1,1,0,0,1,2,1,1,0,0,2,2,1,2,2,2,1,0,2,2,0,1,0,0,5,1,1,0,1,2,0,0,0,2,1,2,1,0,2,0,1,0,0,1,3,1,3,1,2,1,2,2,0,2,0,0,1,0,1,0,0,1,0,1,1,0,0,2,0,0,1,1,1,1,1,1,1,2,1,0,0,0,0,1,2,0,1,0,0,2,1,1,0,2,1,0,0,3,2,3,0,4,1,2,1,1,2,0,1,2,2,3,3,1,1,1,0,1,0,1,0,0,0,1,1,0,0,1,2,0,3,0,0,1,3,1,2,0,1,5,2,2,0,0,0,0,0,1,0,0,2,1,0,1,2,3,0,1,1,1,1,2,0,2,2,1,1,0,2,0,2,0,1,0,2,1,1,0,2,0,2,0,1,3,1,2,2,1,1,1,1,0,0,1,0,2,3,1,0,1,0,0,2,0,1,1,0,0,5,0,2,1,0,0,3,2,2,0,0,1,2,0,0,0,1,0,0,0,0,1,1,2,1,1,1,1,1,1,0,0,0,0,0,2,1,0,1,2,1,3,0,0,0,0,0,2,1,2,1,3,1,1,0,4,1,1,0,0,2,0,0,0,1,0,1,1,0,0,1,0,2,1,1,3,0,0,0,0,1,0,1,1,0,1,1,1,0,2,0,0,1,2,1,0,1,6,2,2,0,4,0,1,0,0,1,2,0,2,2,0,2,3,1,1,2,0,0,2,1,0,0,0,2,0,0,0,0,2,0,0,2,1,0,1,3,3,1,1,1,0,1,0,2,2,1,1,0,3,0,2,1,0,1,0,0,2,1,1,1,0,1,0,1,1,0,1,1,0,0,2,1,1,1,1,1,1,0,5,0,1,0,2,0,0,1,2,0,0,3,1,1,2,0,2,1,0,1,0,0,2,1,2,0,1,0,1,1,0,3,1,1,1,2,4,1,0,0,1,0,0,0,0,1,1,0,2,0,1,4,1,2,4,0,3,4,3,1,0,1,1,0,1,2,2,0,0,1,0,2,1,0,1,3,1,2,4,0,0,1,0,1,1,1,3,1,1,1,1,1,1,0,0,0,0,0,2,1,2,0,1,0,0,0,1,4,0,2,2,1,0,1,1,1,1,1,0,4,2,0,2,0,0,1,0,1,3,2,1,1,1,0,1,0,2,1,1,2,1,1,2,0,1,2,2,1,0,0,0,0,1,2,1,1,0,1,0,0,0,0,1,0,1,5,0,1,0,0,0,0,0,2,0,2,0,0,3,1,0,1,0,1,2,2,0,1,0,0,1,0,1,0,2,1,2,1,1,1,0,1,0,2,2,0,1,1,0,2,1,5,0,1,1,1,0,1,0,3,1,2,0,1,0,1,1,1,2,1,0,0,1,1,4,1,3,0,1,1,3,2,1,0,0,1,1,1,1,1,1,0,1,1,1,1,3,4,2,0,1,3,0,0,1,0,3,3,5,1,0,1,3,1,1,0,0,2,2,2,0,0,1,1,0,2,1,0,0,0,0,0,0,1,1,0,1,2,0,1,1,2,2,1,0,0,1,1,2,0,0,0,0,2,4,3,1,1,1,0,3,1,1,1,0,1,0,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,0,2,1,1,0,2,0,3,0,1,1,0,0,0,1,1,1,2,1,2,1,1,0,1,3,1,0,3,0,2,0,1,1,0,2,1,1,0,5,0,0,0,0,1,0,0,2,1,1,0,0,4,0,1,1,0,1,2,1,1,3,0,1,3,0,0,0,0,1,1,0,1,2,1,2,3,1,2,5,1,1,0,0,1,2,0,1,2,1,1,2,3,1,2,1,0,2,1,2,0,0,1,1,1,1,1,0,1,0,0,0,0,2,1,1,2,3,0,0,0,2,0,1,1,1,0,2,1,2,0,1,0,0,3,1,0,1,2,0,0,0,0,1,1,0,2,3,0,2,1,1,1,0,0,1,0,2,0,1,2,0,0,0,1,0,2,1,2,1,3,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,2,0,1,1,1,1,0,1,1,0,1,1,0,0,1,2,0,0,0,2,1,1,0,2,0,1,0,0,0,0,0,1,0,3,1,0,0,0,1,2,0,2,6,0,0,1,1,1,2,3,2,2,3,2,2,0,0,0,1,1,1,2,0,4,2,2,0,0,1,0,2,0,0,2,1,1,0,0,0,0,1,1,0,1,0,0,3,1,0,3,1,1,1,0,0,0,1,1,3,1,0,2,1,1,1,0,0,0,1,0,1,0,0,1,0,1,4,0,0,1,1,1,3,2,1,0,0,0,1,1,2,0,2,1,1,0,0,1,1,0,1,1,0,1,1,1,0,0,2,0,3,0,1,1,1,1,0,0,0,1,0,3,0,0,1,1,2,3,0,0,2,1,3,0,1,1,0,1,2,0,1,1,0,0,1,1,1,2,2,0,3,1,1,0,0,2,3,0,0,1,1,0,2,1,1,2,1,1,0,0,3,0,1,0,2,0,1,1,0,2,1,1,2,0,4,1,2,4,2,0,0,1,0,1,0,2,2,1,0,0,1,3,1,1,1,0,0,0,1,1,2,1,1,1,2,2,1,1,1,0,0,1,0,0,1,2,1,2,0,0,1,2,0,0,1,3,3,0,1,1,2,2,0,1,4,3,1,1,0,1,4,2,0,0,1,0,0,1,1,1,1,0,0,0,2,1,1,0,2,0,0,0,0,1,2,1,1,0,1,0,2,1,1,0,1,1,0,1,2,2,1,1,2,3,0,0,0,0,0,0,0,1,0,2,0,0,1,1,2,1,0,1,0,2,1,1,0,0,2,0,1,1,1,1,0,0,1,3,1,0,1,2,2,0,1,3,1,2,1,1,1,0,0,2,2,3,2,1,2,0,0,0,1,1,1,1,0,1,0,0,2,1,1,1,1,0,1,1,0,0,1,2,0,0,2,0,4,0,3,2,0,2,3,0,2,0,0,0,2,1,2,3,0,3,2,2,0,1,0,1,0,1,6,1,0,2,1,1,2,1,1,0,1,1,1,1,1,0,1,2,3,1,0,0,0,0,1,0,0,0,1,3,1,1,1,2,2,3,0,3,1,1,0,1,2,1,2,2,0,0,2,3,1,0,1,0,0,1,0,3,2,0,1,1,0,0,1,1,1,0,3,3,1,1,0,0,2,1,2,1,1,1,0,0,1,0,0,1,2,1,0,2,2,1,3,0,0,0,1,2,3,0,0,1,2,0,0,0,1,2,1,2,1,1,1,1,0,0,1,1,1,1,1,1,2,1,2,0,1,0,0,1,1,1,1,2,2,1,1,0,0,1,0,1,2,0,0,0,1,1,2,1,1,2,1,1,1,0,1,1,0,1,1,0,0,2,2,1,1,1,0,0,1,1,1,1,2,1,2,1,0,0,0,1,1,2,3,0,3,5,0,0,3,0,3,1,1,2,2,1,1,2,4,1,1,0,1,0,0,0,1,1,1,0,4,0,1,1,0,0,1,0,0,3,1,0,1,1,1,1,1,0,0,1,0,0,0,1,0,0,0,1,2,3,1,0,1,2,1,0,1,2,1,1,3,1,0,2,0,0,3,2,4,0,1,0,0,2,1,1,3,1,0,1,1,0,1,0,1,0,3,1,1,3,0,0,0,0,1,1,1,0,1,0,0,1,0,1,2,1,2,1,2,2,2,3,3,2,1,1,0,0,0,1,2,0,0,0,2,0,0,0]},{"counters":[1,0,1,0,2,0,2,3,0,1,1,0,0,1,3,2,1,0,3,1,0,1,1,0,2,3,2,1,1,1,0,1,1,0,0,0,0,1,1,4,0,0,4,1,0,0,1,0,0,0,1,2,1,0,2,1,1,0,1,1,1,0,1,1,6,2,0,1,0,1,0,1,0,1,2,1,1,0,1,1,0,0,1,0,1,0,1,5,0,1,2,1,1,0,3,0,2,1,2,0,3,1,0,1,0,1,1,2,1,0,2,1,2,0,1,1,0,0,0,0,0,1,1,1,2,0,3,2,0,1,2,1,1,3,2,0,4,0,2,0,0,2,0,0,1,1,0,0,0,0,0,0,1,2,1,0,1,4,0,3,0,0,1,2,3,0,2,0,2,2,1,2,4,1,1,1,1,7,1,1,3,1,4,2,1,3,0,1,0,1,1,1,1,2,2,2,0,1,0,0,1,1,0,2,1,1,2,0,1,1,3,1,1,0,1,2,1,2,0,0,0,0,0,1,0,2,1,1,1,0,2,1,1,2,1,0,1,1,0,0,3,0,0,0,2,1,1,0,0,0,1,4,2,0,0,0,1,0,1,1,1,1,3,0,0,2,0,1,0,0,0,1,2,2,0,2,0,0,1,0,0,1,0,0,2,0,0,1,2,0,3,1,0,1,0,1,0,1,5,0,2,0,1,0,1,0,0,2,1,2,3,0,0,1,1,0,0,4,1,2,1,0,1,0,0,1,2,0,3,3,1,1,0,0,2,2,1,1,0,0,1,2,0,0,1,1,1,0,1,1,1,1,0,1,0,0,2,0,0,2,2,1,1,6,2,1,1,0,1,3,0,0,1,0,1,0,2,0,1,0,7,0,1,2,1,1,3,1,1,0,0,1,0,1,0,1,0,2,1,0,3,1,0,0,4,2,0,1,3,0,1,1,0,1,0,2,3,1,0,1,1,2,1,0,1,0,1,3,0,1,0,2,2,0,1,1,2,1,1,0,1,0,4,1,1,1,1,2,1,1,0,1,0,0,0,0,1,1,3,1,3,3,0,2,2,4,1,2,2,0,0,0,1,1,3,0,1,1,0,1,2,0,1,2,0,1,3,1,1,2,1,1,3,0,1,3,0,0,0,1,0,1,2,0,1,0,1,1,1,1,2,2,1,0,0,1,2,0,0,0,2,1,0,0,2,2,0,1,1,1,0,0,2,2,2,1,0,3,0,1,0,0,3,1,1,1,0,2,2,1,0,3,2,1,1,1,1,0,0,0,0,0,2,1,0,0,1,0,1,0,3,2,0,2,1,0,0,2,2,1,1,0,0,0,0,2,3,1,2,0,4,1,0,0,2,1,3,0,1,1,0,3,1,0,0,0,1,2,2,1,0,2,0,1,2,2,0,1,0,0,0,1,0,0,1,0,0,2,2,0,1,2,1,1,1,1,1,1,2,0,2,3,1,0,1,0,2,1,0,1,0,0,1,2,1,0,2,1,3,1,0,2,5,0,2,0,1,2,0,0,1,0,1,1,2,1,0,3,0,1,0,1,0,0,0,1,0,0,3,1,0,0,3,0,1,0,1,1,1,1,1,4,1,0,2,2,0,3,0,0,2,1,1,2,2,1,0,2,1,1,0,1,8,4,0,5,1,0,1,0,1,0,2,1,0,1,2,3,0,0,0,0,1,2,1,5,1,0,1,0,2,0,1,1,0,0,2,1,0,2,0,0,1,2,1,1,0,1,1,2,0,0,2,0,2,3,1,1,1,6,0,2,1,3,0,1,2,0,0,0,1,1,0,1,1,0,0,0,0,1,0,2,2,2,1,1,0,0,0,1,2,0,0,1,0,0,3,0,1,2,1,1,0,2,0,0,0,2,0,0,1,0,0,0,0,0,1,2,0,1,0,3,2,0,2,2,2,1,1,1,0,0,1,0,0,0,0,3,0,1,0,1,0,2,0,1,1,0,0,2,0,0,1,0,0,0,2,1,0,0,1,1,3,0,1,1,2,0,0,4,6,0,0,1,1,0,1,0,1,0,0,2,0,1,0,1,0,0,1,1,1,0,0,0,0,0,0,1,0,1,2,1,2,0,1,0,0,0,1,3,2,2,2,1,1,1,1,1,0,2,4,2,0,3,1,2,0,2,1,1,2,0,0,3,0,0,0,0,2,1,1,0,1,2,0,2,0,2,0,0,0,0,0,0,3,1,1,0,2,2,1,0,0,3,0,1,0,0,0,1,1,0,4,1,1,1,3,2,0,1,0,0,0,1,1,3,1,1,0,0,1,0,0,1,0,1,0,2,0,0,2,1,1,0,3,1,0,0,1,0,1,0,0,1,0,1,1,1,3,1,0,0,0,3,2,2,0,2,1,3,0,2,1,1,0,1,1,0,0,1,1,1,1,0,1,3,1,0,3,2,1,0,0,2,0,2,1,0,0,1,1,1,2,1,2,0,0,1,0,1,1,1,1,0,0,0,1,1,0,2,1,1,2,2,2,0,1,0,4,1,1,1,1,0,5,1,1,1,0,1,1,4,3,1,0,0,0,0,1,1,0,2,1,2,2,0,0,0,0,1,1,1,1,0,0,1,1,1,2,0,2,0,0,0,0,1,1,0,2,3,1,3,1,1,1,1,4,1,0,0,1,2,5,2,3,0,0,1,0,0,0,1,1,0,1,2,1,0,0,0,2,3,0,2,0,0,0,2,0,1,1,1,0,1,1,2,1,1,1,0,0,0,3,2,0,0,1,0,2,2,0,1,1,0,2,0,0,1,2,2,0,0,0,0,1,2,2,2,1,0,0,0,3,1,2,2,1,0,0,1,0,0,1,0,1,0,0,1,0,1,1,0,2,0,0,0,1,0,2,1,0,2,0,1,1,1,2,0,1,1,0,1,2,1,2,1,1,0,0,1,2,2,3,1,1,1,0,0,2,1,3,0,1,0,0,0,2,0,1,1,0,2,0,0,0,1,1,0,1,1,1,0,1,3,2,0,1,1,0,3,1,1,2,0,1,2,0,1,5,0,1,0,1,0,0,0,1,1,2,3,0,3,1,0,2,2,5,0,1,2,3,0,0,0,1,0,2,1,2,0,0,0,0,1,0,0,1,2,0,1,3,3,1,4,1,2,1,1,1,2,5,1,1,0,0,0,3,1,1,0,4,1,1,0,1,2,1,0,1,3,2,1,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,0,0,0,1,0,0,1,3,2,0,0,0,0,0,2,2,1,0,0,2,2,2,0,0,1,1,0,1,0,3,0,0,0,1,0,1,1,0,0,2,1,1,1,0,1,0,0,0,0,2,2,0,0,1,0,0,2,1,3,1,0,1,0,3,0,2,1,0,2,0,1,2,0,2,0,1,0,0,1,1,2,2,0,1,6,0,0,2,0,2,1,0,1,1,1,2,0,1,2,0,0,3,1,0,2,1,0,0,0,2,0,0,2,0,1,0,1,0,0,0,1,1,0,1,1,4,0,1,2,1,1,1,1,0,0,1,0,1,0,0,1,1,3,2,0,1,0,1,0,0,2,0,0,0,2,1,1,1,2,0,0,1,1,0,2,3,1,0,1,1,2,2,2,2,0,1,0,0,1,0,2,0,0,1,0,0,1,0,4,0,1,3,1,0,0,1,2,1,1,0,1,3,2,0,0,0,1,2,0,0,1,0,0,0,1,2,1,0,0,0,0,0,0,1,1,2,1,0,0,1,0,0,1,2,0,2,2,1,0,0,0,0,2,0,0,0,1,0,0,0,1,1,0,2,1,3,0,0,1,3,1,0,1,0,0,3,1,0,0,3,2,0,1,1,1,0,0,0,1,1,1,1,3,2,1,0,0,0,2,1,0,1,1,0,1,1,0,0,1,1,1,1,0,0,1,0,1,1,3,2,1,2,2,0,4,1,1,2,0,0,0,2,0,0,1,2,0,4,0,1,1,1,2,1,1,3,2,2,0,2,1,2,0,1,0,1,0,2,1,7,2,1,2,0,2,1,0,1,2,1,2,0,0,2,1,1,1,1,2,2,2,0,0,1,1,1,0,2,0,4,0,0,0,1,1,0,0,1,1,2,0,0,1,0,2,0,1,0,1,5,0,1,0,1,0,0,0,0,2,2,0,0,0,1,1,1,0,0,1,4,1,1,1,4,1,1,1,2,1,0,1,1,2,1,0,1,1,1,1,2,3,3,1,0,0,1,2,3,0,2,1,0,0,0,1,1,1,3,0,0,1,2,1,0,3,1,1,2,1,0,1,0,1,2,0,0,1,4,2,2,0,4,0,3,1,0,1,0,0,1,0,1,3,1,1,3,0,3,3,1,0,2,0,1,2,0,0,2,4,0,1,2,0,1,3,1,1,0,1,0,1,1,0,3,0,0,0,2,5,1,0,0,2,1,1,0,0,1,0,0,1,0,0,0,0,2,2,0,1,1,1,1,1,0,0,0,1,1,0,2,2,0,6,1,3,1,0,1,2,1,2,1,0,0,0,0,0,0,1,0,3,2,1,0,1,1,1,0,1,0,2,0,1,0,0,0,0,2,0,1,0,2,0,2,3,0,0,4,0,0,0,2,2,0,1,0,0,6,0,1,1]},{"counters":[0,2,0,1,2,0,2,1,2,2,1,0,1,0,0,0,0,2,1,0,1,0,1,2,1,0,1,1,1,3,1,3,3,0,1,1,2,1,0,0,0,0,2,0,1,1,2,0,0,0,0,0,2,0,0,1,0,2,1,0,1,0,3,0,0,0,1,2,0,1,2,0,3,0,0,2,1,0,4,1,0,2,1,1,2,0,3,0,1,0,2,0,1,1,1,1,1,3,2,1,0,2,1,1,2,2,0,2,1,1,0,0,1,0,1,0,1,1,0,1,0,2,2,0,2,1,3,1,0,1,1,1,0,1,1,3,2,4,2,0,1,2,0,2,2,0,0,0,0,1,0,1,1,1,2,0,0,0,1,2,1,2,1,0,0,0,1,1,0,2,1,0,1,1,0,1,1,0,0,1,2,0,1,1,1,2,1,1,1,2,2,2,0,1,0,0,1,1,0,2,1,1,1,0,0,0,2,0,2,0,0,0,2,1,1,1,0,0,1,0,1,1,2,0,2,0,1,0,0,1,2,1,3,1,3,0,1,1,1,0,1,1,0,0,1,0,2,1,0,2,2,0,1,0,0,1,3,0,0,0,1,0,2,0,1,2,2,0,2,0,0,1,2,0,1,1,1,0,0,1,1,0,5,2,0,1,0,1,0,2,1,0,0,0,2,1,0,0,1,0,1,0,1,0,1,0,1,2,0,2,0,1,1,0,0,2,0,0,3,1,4,1,1,1,0,2,5,0,4,1,0,1,2,1,0,0,1,1,0,4,1,1,1,1,0,0,0,0,0,2,2,2,0,1,1,2,0,2,1,1,0,0,1,0,0,3,2,0,2,1,1,1,0,0,1,0,2,1,1,1,0,1,0,1,2,3,1,2,0,0,2,1,0,2,0,0,1,3,3,1,0,3,2,2,1,2,1,1,1,1,1,1,0,2,2,0,1,1,0,3,2,1,2,1,1,1,1,1,0,1,0,1,1,0,0,0,1,1,1,1,3,1,1,1,2,1,2,1,1,0,1,1,0,0,2,0,1,0,3,1,0,3,2,4,1,1,0,1,0,0,0,1,0,1,1,0,1,1,0,0,0,0,1,2,1,1,2,0,0,1,0,1,0,2,0,0,0,0,0,2,1,0,0,1,0,2,2,0,1,0,2,1,0,1,1,1,0,1,1,0,0,0,0,0,2,0,0,0,0,1,2,2,1,0,2,1,2,1,2,2,1,0,2,1,1,1,0,0,2,1,2,0,0,0,0,1,2,0,2,1,0,0,1,1,1,5,1,1,1,1,0,0,1,1,0,2,0,0,1,2,1,0,2,2,2,3,3,1,2,2,0,2,0,0,0,0,2,0,1,0,0,3,1,1,3,1,1,0,1,0,3,3,0,0,3,0,0,1,3,0,2,1,0,1,0,1,0,0,0,2,1,2,1,2,1,1,0,2,0,2,1,1,2,0,0,2,1,1,0,1,1,3,0,3,1,3,2,0,2,2,2,3,1,0,2,2,3,1,1,0,2,1,0,1,1,0,2,0,1,2,0,2,1,0,0,0,3,0,2,1,0,0,0,2,0,0,0,1,1,0,1,0,0,0,0,4,1,0,1,1,1,1,1,2,2,0,3,0,2,0,3,1,1,0,0,1,0,1,1,2,0,0,1,3,0,0,1,0,0,0,0,0,1,0,0,4,1,2,1,0,0,3,1,1,1,1,1,1,1,2,0,1,1,2,4,0,1,0,0,1,1,1,1,1,0,3,1,0,5,2,1,1,0,0,1,2,2,3,1,1,3,1,0,2,1,0,0,1,3,2,1,2,5,0,0,0,1,2,0,2,4,1,0,4,1,1,2,1,0,1,2,3,1,2,0,0,0,1,0,3,0,1,2,0,0,1,0,1,0,0,0,3,0,1,1,0,0,1,8,2,1,1,3,0,2,1,1,0,0,1,1,0,0,1,1,3,0,1,4,1,3,1,0,1,3,0,2,0,0,1,1,2,1,0,0,0,1,0,1,0,2,1,2,0,1,1,2,0,0,0,1,1,1,0,0,0,1,1,3,2,2,1,1,2,0,0,0,0,1,1,1,1,0,1,6,0,2,1,1,0,2,3,1,0,0,0,0,0,1,3,3,1,0,0,0,2,3,1,1,0,2,2,2,0,0,1,1,0,0,0,1,1,0,0,1,2,0,3,1,1,1,6,0,0,1,2,1,1,1,1,1,2,1,1,2,0,0,0,1,2,0,1,0,1,0,0,0,1,1,1,0,0,1,0,1,1,0,3,3,1,0,2,1,5,1,0,0,1,1,1,2,2,0,1,2,2,2,2,0,1,2,3,0,1,0,1,1,2,1,1,1,1,2,1,1,0,1,1,0,0,0,0,0,3,0,1,1,2,0,0,0,0,0,1,3,0,0,1,0,1,1,0,0,0,7,0,2,0,0,2,2,0,0,0,0,0,3,3,2,1,1,0,0,0,2,0,0,0,1,3,1,0,1,1,3,2,0,1,0,2,2,0,1,2,0,2,1,1,3,0,1,0,3,2,1,1,1,0,0,0,3,2,2,2,1,0,1,1,0,2,0,1,1,1,1,0,2,0,3,1,2,1,1,1,0,0,0,0,0,2,0,0,2,2,4,0,1,0,1,3,0,1,2,0,1,0,1,3,0,0,1,0,2,1,0,0,1,0,0,0,0,0,0,1,0,1,2,2,4,0,0,2,0,1,0,2,0,1,1,0,1,3,1,0,1,1,0,0,2,0,0,2,1,1,1,0,0,0,1,0,0,1,0,0,0,0,1,0,0,4,1,1,2,1,0,0,3,0,0,2,1,3,1,1,0,1,0,0,0,1,0,1,0,1,0,1,1,2,1,2,1,2,2,1,1,1,1,2,0,3,0,0,0,3,0,1,2,0,1,4,1,0,2,0,1,1,0,1,1,1,1,0,0,3,5,2,0,1,0,0,1,0,2,0,2,2,2,0,0,0,0,0,1,1,1,1,1,0,2,0,2,0,0,1,2,0,0,2,2,4,0,0,0,0,1,0,0,0,1,0,0,0,0,4,1,1,4,0,1,1,2,1,5,3,0,0,0,1,0,1,1,0,1,0,0,1,3,0,5,1,0,2,0,0,0,0,0,3,3,0,0,1,0,1,3,0,0,1,1,0,3,0,1,2,2,0,2,0,1,4,0,2,0,1,0,0,0,2,1,1,1,1,2,2,0,3,0,0,1,1,1,1,0,1,2,0,0,2,1,0,1,1,1,2,4,0,2,1,2,3,1,0,2,0,1,3,0,1,0,4,1,1,0,0,3,2,0,0,2,0,1,1,0,1,1,0,1,0,1,0,0,0,0,1,1,2,0,0,2,0,1,0,3,0,2,4,2,0,0,0,0,0,3,2,1,1,1,0,1,1,2,1,1,0,1,1,1,0,0,0,0,2,2,0,0,1,0,2,2,0,0,1,1,1,4,1,1,2,0,2,2,2,1,0,1,2,2,1,0,3,2,0,1,2,0,0,0,2,1,0,0,0,0,1,0,0,1,0,1,2,0,0,1,0,0,0,0,1,0,0,2,1,3,0,0,2,1,1,0,0,1,1,1,1,0,1,1,1,2,0,0,0,1,0,0,3,1,1,3,0,1,0,2,1,1,0,1,1,0,1,0,0,0,1,1,1,1,2,0,1,1,1,1,0,2,2,1,1,2,1,1,3,1,1,7,0,0,0,0,2,1,0,1,1,1,0,0,0,1,1,0,1,1,1,3,3,0,2,0,0,1,1,1,0,0,1,0,1,0,3,1,1,1,0,1,2,0,4,0,0,3,2,0,2,2,2,2,1,0,2,2,2,1,1,1,0,0,3,0,2,1,1,0,0,3,0,0,0,1,1,2,0,1,0,0,1,1,0,0,2,3,1,2,1,1,1,1,2,2,0,2,0,0,0,2,2,2,5,2,1,0,1,1,1,1,0,0,1,1,2,0,1,0,0,0,1,0,2,0,0,1,1,0,1,0,2,3,4,1,0,0,0,1,0,3,0,0,2,1,1,0,1,1,0,0,1,2,0,0,0,1,2,0,2,2,1,1,0,1,0,1,0,1,1,1,3,1,4,0,0,0,1,0,0,1,0,3,2,1,0,0,1,0,0,1,0,0,1,1,0,2,0,2,0,1,0,1,0,0,0,0,1,2,3,1,2,1,0,1,2,1,0,1,1,0,3,2,0,0,1,0,2,1,3,1,0,3,4,1,3,4,0,1,0,0,1,0,0,1,1,2,1,0,3,2,1,0,1,0,0,1,1,1,2,0,0,0,2,0,1,1,1,0,0,1,1,1,1,1,1,2,3,0,1,3,0,1,6,5,1,0,0,0,1,2,0,0,0,1,2,1,1,1,0,1,1,0,4,0,4,0,0,1,1,0,3,1,3,2,2,3,1,0,1,1,3,3,1,0,0,1,0,1,3,0,3,0,1,1,0,1,1,0,1,2,0,0,1,1,0,2,0,2,0,1,0,5,0,3,2,1,1,2,0,0,0,0,0,0,1,0,0,2,0,1,1,0,2,0,0,0,1,0,1,0,2,1,1,0,0,3,1,1,1,3,2,0,0,2,1,1,0,1,1,2,0,0,0]}]},"null_count":0,"last_update_version":397952028766896128},"ext":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MDNXekhMZHA0clFGZzZuMGdkR3ZqQ2dkMkdJT3E1aTNyaWZHQk1wZFhOcXVJWW5aNHUxM0E3QTA5enlGS0s1djhIeHZtQ1o0TkZXVFFtNVdORkRWUFc5dHY2YlZEYW5vdTl5MjJuRnNxNk8xeFFZTEROaGk1UVNIYk1HcThoVEpUekUxYXVOTkt1YldkcDJha05OaXU3Snp1SjZyeHplTjk1dldQZnBJeDh0a01GM1VvT0lYOEUxdUlMNmhrS2dmU0puUWlxbEs2QnNBVjFTSlMzWk5Kc1JpajUxb0pFd3laZ281SkQyWTY0bzZGVkhzbnhhZ0NoeXNtbjlYSGlBeG43d2ZzZ2pZV2ZOMXJldlpxSmxpSHJ5YkJh","upper_bound":"MEhReUUyNGZEVnpIMFhSUzExc0JkalRnWWZqQTRDNEdzN0JpUGZaTUNQQ1RtM3g2b2lBcmQwUXJEVFROOHpHREptYXJONFJzUllSV2Q1aHpiUnhwbllPdUNPc1JyenlrdEVlWFhmVWpocjA3eDdTcFg5YUh5cDdqSjJhb1VHMTJUTlBZTk01WEROTWl0NTFaMDZFRHoxOUJkTGFOUUtSUEZjZUpBZzdPdVIyM0xLVklaSEVadHhMTklVN1F1cFA1SzZFVjVXQW5iekQ2eUJGZFUzRFlzYjFoR0ZYREh2dmpUYVhZSnJXVTFndFJtdjF0NkNmTWxXV0FsT0VVcnlJT3N5T0hQSHozRFRaZ0ZTRmNreXlNZ2Z2VTFubzdVYmFid1BkTnZNRzREbVVVVGdxRDRWdzlOaG9reWc0SmNwemtCV2M1RHR1Q3ZPUEV6Q3hUQ25veEdKVmtuelJSZFZzWUpVZHQwRXV5ZGtZaE83M1FXZTVYQU80aEpCUFpxVHlyb2FaYUVTeVhBb0JaT0l0RFEx","repeats":1},{"count":16,"lower_bound":"MEpBc0w5RDBwQThGN1c0NWl5ODRGT2JWMnl1THF1QzloaXRMZGo5NmNaZldGbFE3M1NMaW83UGVyYXNnemF4b3B3NDBQS01JVzN1a09pMndsOVhsdXRoeUhJZVBnbExublIyVjNBM2xjbTZsYUM2UDhKb1pvbEF1eTRPZ2ZyMjljQm5zZlAxOEU2V3VzbDZlbzV1ZHE3eGQyRmdyV21xN0ZVNmRzYWFVY2dhRzFrSVlqUTNFbUxyeERXUks1TnZNQWxvU1NWYjVmRkRoMERZS1NydWxDZUp0WGxhb2pjMmpWS1pyVDdpNTlYSFJod2NEMnlPcnRWZmtCcXhtNE00ZlF5RnRxczh3NEk0RGFZUW5aRTVOakdqVUVHeXk5VkptZHRuTktEaXc1UTJlTWhPcWpUSjBFVXI1OVplRlBUUzhoUG5xeUxXQ0lDbWN5a1pBcVNYaDRmTDQ5dmZ5emhQS2FhdmJoUU1QR09rWGJlYlZneVJFVmt1R05lUUhwbmJ0MGNpWDFnZjdSNjFrSmthWkJxbDF2MjN2aFc4OVRTNEduRTE=","upper_bound":"MGNocnJE","repeats":1},{"count":24,"lower_bound":"MGZwbmcwYllHUFN5ZWNSVUxNRTRGUlM4emF0MU13ZVU1U2Q1UmJycWpzTnBRSnp3aHJhRFBRYlFvV3F1WHNzUmZSc0x3QzdDR1A4NDVQMXpZUWZFTWRLdXNqODJHNmhlZ3p4b3o5TU1ZWEFVMEtDZjF2QWpYa3V4RzhUaWNMaGFTbFlQdUs1M2x6eDlCUU9lU2k5VEFiTnhTN1BtV1NOSkJ2cVJacTA0Y0lJTVRXVGNESThJdFRqOHRtbU1zVVNrTjJTcVlsYXo3SnZaam9mYlYwSXA5NnZBUjRsZDcwQzZSMXhKZHFOeHhORjdvaUpMaG43bXBqVzhXQjREeTNrSGZWWlF1TzVvbGxON3BqSDBLMko0WHJETnVFSGk3Mk55YkQyZ3JRbDJDWEd5WTlQWGQ5YkpiT0pXNDlsNWFoWlBDeWdNTWF5czZYeDJSRmRmNzRvTzJ4VVZsQjNPR1NDRDZiSVdIZm9hTEt5emluSGdkaVBoTFg1aElUaXFiNThCUndWazV0M3liWlJ0TkhGelFBVWZBT0tocXBQN1BMUUM5","upper_bound":"MHhYVlhuUG5SVDhHRWF0MVo2M2ZIWjE0Uk05VVZyOE5NQVFTbnhBUkRuRTFpSEpPdnlabmJvZnRQYTlabzhNSGtBQXA4TzFqOW0=","repeats":1},{"count":32,"lower_bound":"MHhzN1doV3BFNWpiU2dYbEtJWDQweVZjOGkwZ1JkSWlIQXA2TUJyTFVwa3dyenN2M2xLbGVpZ003UnhraEYyeUFmMHhRU0o5eWJNNU0zZXByd25lMHJoV29TcUJ0Zld4d2N5M09FRGllcw==","upper_bound":"MTJWcWVYeWlQYzJrZERKMkdWdXVUanFPeDNwZnVwTzlGNW5jTjVOS0RWMTFvYTVRcTlueGVSMTRvSFZHcDdZMEtmZ0tGWkxyNExHa3Fjb3k3Z0RaTmNvQmhkZXIzcWRFTDBBNTdEcEpqVUxZUFB6R2EzUjNVMmJadjE2T3FWQUFVM2N4SFh3aGlIdm5jZTNPTk41ZTJHQjVmRFNjQ291YkVuU0pyTnp0UXZySXU0cmJ1NVRqeVdFN1gwMnRiVGZ2WlBVaEw3dGVqODhIRjJqbVZtTUlCYnVIdUdndWZGVTZBbXk0UTdjZnppT280b3pGMGhGMDUy","repeats":1},{"count":40,"lower_bound":"MTU2Y0xjUHJKTWt3WkdlRkxkQ1p6QXFGM0V5MzZLM3FIWEluY2U4VXFub25HaFlGbDlxRlFsVkhia2hCWXFnS1poT0xCc2J1WGV6UTU4VWg2MkxlMEQycHRUQ0lPZnZOWkxWSmRMNFo4YmhSRjBrMzFJMHBMWHRYdEt6MGtXNnBiS3cyTHZwNHFta1ZYRVFpeExpNEIyZkR4WHB3T3lqVWtqNk9MZzY2QVpSUklzaFRycDUzSHNETEk2ZXB2cGsxNGFCOE5TcUxOVmZxczVINHJtdE1iM2Z3enFLSmhJVHhjdEM0dzBldEJoQVpUcURYaUk2WmgzVWxnOFlaVURTaWlENFJLczZrclNaYVZUYUdWTGFLNWpnRTNVcW9UMzRJSzUxNmFSRnh2bkQ3Z2RCbWpvNUk4NTNYNXY2SHNtQ052YVdhdHZyUDFiNUsyUXlPR3BqR3IxVVExbDRCZFQ0b2xxSTFsRHJXQVQyNTEwZDFaYXd6YjhielhzcjE2ZDlhTTQySnNCd0dES2R6Rzh0WEd0eDBJSTNhQmxTSFBvVTZxTjFPZUEyUGdNMUhFak1uNkdrWXd1eFl2cFF5UXFnOHdvWEttRG9wTGlDUnJmZEVzYU14amlQdTZ2QVllc2V0ek5yUDF1TlB1TFAyZFRUdEdQdE9JVUxteUp1dDF0dDg3Tms=","upper_bound":"MVA1c203dFEzRm1uSVc5dmpMN0E3bG9pRWIwRFlyR24wdXB6Q2J3azQwZGl3eQ==","repeats":1},{"count":48,"lower_bound":"MVpGQ0hUNlJMcTVGYnRmckx4R00wZG9VYjN6OWV3d0cyYzdFQnhBZ0tTbEY=","upper_bound":"MW9lZk9rdzdqamd4VjNZMjVsN1B3ZkpBQlF2TDFBTVZjN1RjRWNHcTBPUG12cEhjZUtBc2tOREoxNWFDNHdyU3d3WUpJbHRVYnRNajEzTWpOOG1yVHk4WXdFQWNWUkc=","repeats":1},{"count":56,"lower_bound":"MXpFZ0FpZnNYZHF1ZWdPU2JNelZiUVBFYnZiekRIVE5DRlFNMXRLR3NYaU41VU1BYUNCdUdXeHNrb1VsOHRuUUp4RHRJUTVRT3dnQzN0UlhvT1hxUzE1STZtWUN1dG90Wk11MjhBWW9NcGNEMnVTV2dnd25DYlE4anNQNk9SdWFCdE9kdXZOV1NVZ1pId3FEUnpkTUJiMW1jUWduM2hMR0F2REozMmpRaGFLVW1BdE5NQlpqMzVXOEFjMlI4ZEFTUUdyYUZ5Qnk1eENBTmwwalRkRUpaNzZJb0N0RmhXbDZ1SkFGbHV0ckV1dGZuWk13OG5MMnY4Z2FMb1VPYVZZdlVyWXNJVnN1MDR2UFpUd1hpVzVQdURvZ2dTbVNKdTdEaXJPV0JDaEUwaHJ0alA4RnBWRVZ1OXZuYlJUb0NvYXRacTY1S3pYbVluMmVHblE4Q3c=","upper_bound":"MjRvWWVkYkhGcjBhbVVpMENnU2tEcGRWa0J5Rjd2Yno1bGlZU3YyOTlQWlkxUFgyY0xkT0thMmllYnpVcmJ5b3p2VW9jRzk4djdWdWlTc0xMR1VTelpQWkQ1VWQ4R2tzZXJXV3VyOXRUaUNJbkhiWHNVeGhsMGxhakZ2TlhwZ0Q0NzhMQVRHYlRwQXlJeDNZSGM3UExpSGNnU0dpTk9UNVFQSGZIRVg0YW1FQUhIMVFaRGtCekpLSTFJb2tnYWhQUTlYNG5VOXBUb3RSTTB3M0RKcUZtUlA1cHpHR2pZSURZdThaY0NpSHBVSUdRSTJscXQ5UGZRQWRmYjFuU21MaEdNbGNPWkc5bGs2d0tOWXU3WlRXUzkyNUM4OERTN3F1UlQ3eVpmSUZubEpSbHJqS2VlZHVjTG9TWjJRbm53SHJjRmtlc0FqUlNPcm53ck83N09SWUhaUEZqaE9uWHliejdCUVpCa2xKc05rNnJ3MGd2RWxHZnliRVV0a0dVdVFKdkkzNFloODVjN0lxWlhCdXh2a1h0cU5sVDREVlJLcXJSNWlkYjVCUkNYR0ZVUjR5czNBSmc5c1NKNVdPMUNOWW9Ia2lmSkdLNTBDTTlqZDM5TUVIZDBxWjZhU3R4MVpDcjlGQ2dsY2VPOExxdEI2WnZlRXZtdmthTmVEdUo3Q2VKNDI=","repeats":1},{"count":64,"lower_bound":"MjZDYkFYcmd5c1pvRGk0N05LRE92b2RXYkpjVmtmSEVPRDEybjJLeWFjY2FGcVJkM00wMDBTQ2VDQlJKdUp4ZjZiSXBsaHQ3alpIdEJaS1Blc3NBdk40N0I2eGJsdU9jSVdteEFUZ3gxTEhTU2ZBRUVUdzRtUFdIY3o3eGZuMjhWdmdxZlRkcUdLcm90YklBb1Y5cHdXWTU1Z0c3dzRkcVhlWjFYOHBvWWlKR3hNdEFZNk5IQndkeGpHRzVtYXFCMmFsc01IeGdlVlFrVTg3OUpnbm1XOXNRQ2RFdGRPcVhtdEliWDFjbDJlNXczMmRkakU0dnJuVjU4Zk96WHBOWU91empLMXpMb0w2bTlKT25TcTFVSGdmV2xVN0RzNGpvdndyck16aVZqaExLM2NzSFk5cmt4SU1KSlpUblhDZW9iVkc2amdZWlI4dzgzUXp5WjlaSGcyWUtuMkt1OTVUZHFtMHJ6NWw4Ym9JY1dMbGRTN2M3ZlJReFR4OXFXMVFneTU0YUs2UGFoVEhLMHp5cnpQSVBDOGg2T3hQRnY2MThacQ==","upper_bound":"MkZkOVE3Qk9MOGU0U3BWY0psd2lPbFZYdnpLMHNWeFZFakhuOVNvNnVqZjRUeDMyeEJYcnlsOXpiUFNjNEt6Wmw2ZWxYQlFCZVZQMEx0N0Z0ZDA2WWRRSWZGY2l4akZST0FvTWtIZ3dqTkw4QzFKbWRScWRlMFVWOHZJTTduTkpUVjJBZ1dhSVpSOTBzamdmOERETzVhclBNS3l1d2hOZ29PWjU4MXgzVzQ1bENFdnZXYktCYmN2eWpEaEFIM1VhWDlxdXFVamU2RUVEVzA4UDdXMTdaRW1TeENQVXlJNGFUb1A0aFhLaWdyRUVPTzdJYzZ5S3NzNTlHNVV3R0xNeHdhWHRrbTM=","repeats":1},{"count":72,"lower_bound":"Mkl4ZzVESkF5Y0dXNlZIbWhRb0dSbnlYenRYdzZjYmpDUWRGaWNZOEp5VG5VSTlMVDRoS1pnemkwVmY5","upper_bound":"MmNic1VTZmdIWnpVWjhnNUdWZDJxSldQc2Z1N3hlSnFZMVkwZ2E3U2UyaGZNN3JENU9qMmUwbWswNnN4cTB2OVI3NmZodDF4U1VsWGZNTmU2WlFOMVlIdWlERXFvcThSSTk0VHhoVUNjc2Njd2hXamhxaGdsZjUzRmJmdGVnOE9rRE04d3NTY2NheWYwQTRQemNHYTdFSTg5NkxnTFIzVG55T2pIek5JNWs4RVFldEY4RVdoR3lQSXc3aHhyRzExRFdydWJiNFA4ZU5JU1hUMFFDUFlnczhVN1k1a3l4VWRhUWJBV1ZSU3p4VUF6c3VERFJkaVRQWHBqRzBtRDIwclpkeWZGak5sNG9DdTFEdXNOckpXbWV2QnBReUc2WmNtWnViajVQOWQxbVRmVmRMTkl5bWc1TE5FUjBCZjdLUWpKWTdsejRVMHprcDcyUXFVdGU=","repeats":1},{"count":80,"lower_bound":"MmdxdDdDaTB5Y1A4S0ZvTEpNVE1QRmE=","upper_bound":"MnMxTWV6aERBRXdkYXcxbU8zTXloWUt2Q0VFdHlJUUxtWXFJcTFweTREeGsyMDJpMllaNg==","repeats":1},{"count":88,"lower_bound":"MndLYVRKZFBtZklONW5yVXAyRUZaeklBNzQzNjlRWTlPdTJoZ2hXWXkxQXJ5TUlaWVpkak1ZWUZ0dzR3","upper_bound":"M1NFdDFLY1BWZFJBdmFKVjZncTFkbWJkb1UwbE5Ma0JLa3JMQzJaT1hrWUQxd0pYWTdLdDNvR2E0SFRHYjBoaUptYlQyYjMwbDBWaTE0NDNFNFFkZFI5WTFTUlh3SHNLWkZjVG5UT0o=","repeats":1},{"count":96,"lower_bound":"M1o=","upper_bound":"M21ZaWhYSWE3QW01MGs2aHBQYWcwNFVHaGY4dGs3N3VPdEtncHkxZDB1eHMydURNazUyV2FQY3NGSnlVRXcwQUxJWnQ3aWZjaER1T0pLZm9hSlBOc0R4UHk0aGZPSHFqUWszUE9ZUU9GaXpPTG1BRWh6cXc2WmdVb2ttUkRxaWtHWW0za2pzZ25vYmpYMFo1YmpjbHNEd0VPZ1Q1SjdSNlZSR1V5ZVdKUWpjVzZJdnVDemlIVDl4OXhUcHpPdG5MOWVvQWJRTkpuYldYS2FyeXRDcWtFVUlrTXNGRXQzUkJCUGNCdHd6VUxCUUN6NDF5WEd6d1FCVnd6bUx2aWZtUnY1eHVmb3dLTDFyaEV2bUlacFkxS3pEMnFqNUg1NmNXYW8zanQ4Q2tRc1o3UVNSd3dJNHdCQXJOSFo3Q3ZIYTkyWnVERzlYY0dpRllHckpYNUt1eWJMSHVxUEJac3FrWnJCWGd3Z3VXc01vQ0V6MA==","repeats":1},{"count":104,"lower_bound":"M21hbzUzUTY4RWVBeUJyYnA5MEU4ZW5mbFZWUTZKVXNCT2ZueVJOZEd1RzQzd3RSMFlLdHFvem1QQnp0VEtvNmZORnNOMjM4MmRodnd1Wmxvd1QwVnRNSFhvbU8xNVg4OFN2UXJpT0xoUG5OTEZWRm1FY0VKMkZyWkYzcVl2Ymg0V1czZEZCcXFia2tiOUpPcHpvME1tcUtabUxVa0l6dWs1Ym1uTk4wTFFoWndUalVtT3U5TlY4Ujd0MDhWdlJhaTNkN09HaG1lRHM0am16Y0YwUnk0ZmdFZURIOFNSN1F4RVR1Q2REVnpFbkExbTVFeFR5NnFjdVVlTmw1dHQ4aFhsQlRiUHBYSHhGWk1kOU9KR0xaWUhlaUpOUjlHTFdBUmJCdFJUQ1U2NGI3RkVya2lMa2QxZExkUFVGZW4wY29EN2xJM2lFQzBxVDRYNUFscFNaMVVObGo1dW5DejZrZzRZSm12d09nVFJYUWxxRTlrbURGV0FZOFBPUDdvWnpYek83SGgwdFFDTlRFVFhGd1lXNlhmYjZlc0dPQngzS0x3cVY=","upper_bound":"NDVPS2NkOFJDYmREQUg4MjZlb0l2QjdoWU81T3JNajNTVmlpaHVTTUZubmNYdUV6YW1UVERzMWhYUkY5cGJqTkNiMUc=","repeats":1},{"count":112,"lower_bound":"NDVQN2o1TTgydFp2U01OZ3VhZktnTHpQQTN6bjZESktud05aQW9mc1BPNnJpT1F3azdCcEVxbGxTdkhvYVlGTGtsQUQyN0swdXYyV2RiYlZyWVhpMzNzQzc2Sm1vV3gzODhCUmZacFpyZEZVODJFZDFQbVgwdVFhOA==","upper_bound":"NDlYb0pmekhrVE5KeHBmME5na284SGNJS3NqZW8yajM0Y0pSdFRka1NkMmhqMUlFMWlpU2FteFdHNWxnTDdBSTlLdzRyUnVQbHl4SE5taU42QmZwVFZ0S3lXb2x4OE5SdHRmU2QyajhxRVdzd1QxMVlaemY0aVpQd3lJQUg2VDlJSnJNakpURGFveGVJa3BvTTlQcmZSYWZqdDJiWTFoQTA4TnR1NGFPbVlCVURwQzFmam9ZcHFKRWZ4NTVvZnhQbElWdkxnM1lDVm85WU9YVEJFeWFsaUhSS1ZJQVZQeUNQemdCR1I1bmprN0lzRHhKdks0Nnl1bkpVMGRzTVBFNmJsUm5tNUFRVTkzUmc0clFjTGMzVUY1REhDOVJEMWFtTG54NWZiWW9YZVM2YXl4YlNhQ0t2Q0F5TEZZb0RmUWRIOWVFRVF5bkUwcGdrand4RzI3SlZVZDBLM2QwZE1GazhMSjM5akxJTXRPTlVxVkFBeDA1TExiZ3VhNWk2amhVc25MVjg3NEZSd1R2RGVU","repeats":1},{"count":120,"lower_bound":"NERzNWxjdWdpd3dxY2ZVWmFkbU90ZjVIdWt2bExnUEpyTFNKTlBWVE9zVUlVTG50aTJPNVA2WFhxdFJwZlJsdlkyRkxQeUlOQkVUeGZNYWl1dlN0a1h4Y1RoV0h1MEIwSTNtT2ZVWVIzcGI0N1JqcFhXTWpndkhHQno4TFBkbTJZQjd4N3VUN3lkRVJ4TGF2cE1ETGExbzIxUEd0dDcxOTNyZg==","upper_bound":"NEhRcFdNMVJnem12R3RkZ1h5aTQ0UGJqVmcwazljdGZNMHM2RlZpbnltaTN3ZU1sa2hOaDZ2aXNPaHVMeXhNdGJ4YW5Jb1FqT1FFRnpNMk1GdU15em1aZ2Z1TW56cWJTVXQ5R3FBd2xObHcyYW9jeXZHc005VkJGQ1NZbzVYVjV1aGkzdWNJeUVpOTFGOEFJbjZ6N3NqWllBT1Q=","repeats":1},{"count":128,"lower_bound":"NE1Ed1VQNHJCNmt4TEU1TzAxSnhNQ1FPc09XUzJuZXJhS2FqQmUzdTNMVHM5RUdoVHg=","upper_bound":"NFhUVXU0dGhXZDBmcjZvazUyOTJUYkdnZ015c0hTSjhRcFpiVEFHaXd5YW1ZclNjRVFKSlByTUhPbjJWUGIxY2c5ZW9XdUZBMTdoM2M3T3ZkcTgyMlFsbWpKanJnT1NtdEhSeDEwbGJQcmJXQ2FBclF1THZXRkg5eGREQkhvSGJwbzRvbzUwMlRSSUVFa2FOSTJZZUw3dWxBaHkzemsyaXBEMmNjS1ZEbmUyMzU0aXBTTG5uN1l0U3NRakI5NEJyb0NuSWhHZFpvRmZqZE84ak9UVU1QRVBYa0hGams1RUFRWWdqeVdnUmlkR0JmeTlWTk03WThPVHFIN3dTZVROZlVlM09lWDdrWWFPc01HWkhic2NHd2ZWelRTS1FHVzQyNEJvd0N0RnJvUzRMbmpyMmlKVDlYcFo2aFhxcXVMOEtYejhoSGN5VGFnbXNJVzZDVkZrQzViaVZJRURWMldNc1lrRVYxUm9vUEJXWXlmRzc3bFNoZGhIQlJOV3BaUjFPd3g4djJRTTJjVE00amgyT1R4SVdNaVV2WndCak1wMUViSEZrbmpZeGZ0RVN3V281bUxpR05HakFXN0ZhbTRLTFFvRjI2Rm9NNjNsbmNnMnNiUw==","repeats":1},{"count":136,"lower_bound":"NGZXa0dQY2FsTkE0UGZuZjFuMElzQVYyOHdPNXIyV2ZsYWttaGpMSjN6OFlFV01pcEZOWXFRSVNEZmd4cVlQWDZEekxtRFFmTG9PdUhMMlFUN0E4UTlITjJ5SVpNNDQ2OVhPdjl2d2FXSlJDZnZFbWdDWG5RUDdqWXBXY3R3OGNPRmRFdU9PN2dMM203ZngyUm5IZkM0YmNoVnhZMnpzTmJxNzU4NFJVQkVSS0I5Q1ByT2daMHdHU0Y4VHdnUVV6VzRXam51cFBGQjRwZEVmUFF5Vnp0REJDYllPT3pEVm8zRGNGd21INGtxN2lMSUt4WHZLdFdUWm9EVld4dzcyd3lXS01XTjRUeWp0OVJHTk1pelRsWk1hcGxTYWJXdFZEWjFaQnZDTnZIWFU4VUZxUzFpSldWemlrQ0R2bzlxZkRibW1OcFkxdGFZeEtGV2RGMElTODRxTU5ITlRoYkNNV0NDVEIwUUlXbTdnbmphRjNPcGZSdEJJVkM0WG1SVHI1bFFwc2dCanBWVVhVeTRtQXh3ZTQ3cUpBQWgwNlpyMzg3RmlIQTVlYlp4cFc5QzlQTThYVEtqZjFuRXpxc0QxRnNXbVVWUlpERmFSUGo3M3lBZ2RnblFpUkFyOG5pWFVJMmZaOGlwVVFPc0pKbjJyUEVnNkxDY0tN","upper_bound":"NThNRUZTc0lOVUtYQm5S","repeats":1},{"count":144,"lower_bound":"NThRaGs=","upper_bound":"NUlSSDdOZWc4YkI1M1VHUzRDYzRzdUVRanBPRTFjbWR0YTZYVWtqUXJlVkV0NDZWaDNDQnQwaHBIVExhTzhyV3NiOVpjSkRGVGZlcGR4VzVZSXBnUmp3eExndU11MER6MzNoOERxWURWekdOeDZFU09jaTYwQmkwMjRuOEJNTmsySURiVkQxSWV0enNqeFA4cEdIeHRvQzhyeTV3d1hYRGRHYWtiUFNlc3Y1eE1yMFVFUUttRHltUkFoZjVkYlFPbEptUkpvWlZmRVkzZHZqVGU3MXJQWjEzb3NmTVNWN1lSZGlMNVppdmxaV2dVektOdFZMYURnUmdibkZpSjVmTG1HRXZScXZ6RklidWRWaXRudTg3QUFqTXRSc2lFM2hobW4xc2ZkQ0FpeFhvNGJoT012b0E4bFRaZ1JncVhqUDBZaFRBR2V2WnpYbnBwNUxrU2xXcm9kbTdyOWhoR2drbjlESXlBczEyaDVuaE1RUElleWRkOEhkVW9vSHlPRW9tSmtoVGlKRDF2VWxlUElEUE01cm1xTXFxSzNyVk9UWVpLenVCNktETUhFZFRLNXhaaDd3SUNMZnRva1JtNnRTNUdYYXcwQ0U0S0UxZE1VUFVSSmNGS0cyR1JsRjJ4d1M=","repeats":1},{"count":152,"lower_bound":"NU5vNVBUd2Q5NDM3ZlVEb3NaRnpTZndzU000OVliRm5WVVFoM1BLWE05b0RoZExXV1htQUJNd2pjbTRORXpIQVlCSGFtOGRPOWlCcG5WNExuNU5qRVJLNE43UHZ3c0FPWG45UGNaYjd3WVZNT2J1bUhaaGxiWm51M1Z0VThoM1FkTks5bDZpNDF3RTlYZFFVTGxRMER3NzI4WGdNbUdYbHhZM05KTDRQbkN4UkM5bldxeVdvblZIV2Y0ZzYyT2NDN3pLRkM5MHdKSnhRc0thMjJEenJ5akh0NXh1bktmbTZ0VGtZUXNIVjVIemFqOWxucENsaERQUElQbkVTNmlkcjUwcUJ0UnJNeFRRNXhNaGNhQlpVRk5sZExFQ2w3Um1jVHNhMTBPWkV2TTR6YWp5Z29KdW9MTjJkN0NqZjBwcjlHU21SWThvSUdYU0ZFbFhIRHRwV0s1MW85emZVMU4xYzJYTENPRmJqbUczSjNlY0JEZGhGN1poeVBZcFRFZEdOWVkyR0MzOVRKeUE4aWxxa29KcmUxVFNuQktvUU5WUDhocFlDdkN4M05wQUROVzMyS2luNlYwSk10NUE5TktteGdtWEVCT0dQbWhYbVlra1NqemhDM243Q3U4VG44THdvQXNhOFRKNVJoMTFkb05kOEtud0swdmFLNHR1VXZ6WDgxR3FsR1lLUkJhR1p5STF5emp6RQ==","upper_bound":"NVpIWVo1YXE0eGphUmxPdnlVQmd4bWZMcHpxMEFJZVg1cHNPa3RDNE1iNkRSMzBPdjBOYUNYSE9hRUJFWVVaSUhQOW5TUzVDa2tWVDNwNEZnUGJ2WnZCaGRlelh0VUFqaDByZ2RaRzljbW9aUTBqMWZaZFU3M2RQZjlkMldxTGxIVFpGNk1VVGhSNURLSDBJaEZZeTdxcFBqcDJKdjFMOU9qakVuSjZHVG4zbmpWVFo0WTNjQmJYODZyRGxWOGd5RnNzOGtKOVlaRHgwNkdReUZLdEFubnFTNTBFR1JiWHgxQTllTlJmNlVqNExyWkFxNmdCckZ3RDdqdnhWWHBYWmpRUHAzMzdzbGhPYVB0S3B5djM4WVV2cGV6aDlwZHladmZETm1KTjFRck1nb0xmZnNxZ1owTUNYWnV3WU1zbnM0QUNNUWtJWkxlYTFiWDFmZjhmVTdNOVBEVkRBWU5zeXNGb3poODE1SHhSaA==","repeats":1},{"count":160,"lower_bound":"NWFVS1FMS2p5TjVZVzVvRDlsRWh2UFBuM2FXTnlRQTlTTjlwQUpGb2FyckhmWkt3ZktpMmdKSEo=","upper_bound":"NWp6WU5WUU9ZckgwZ3hQdUlTM1FBWDRIVVpQdXVnM2s0MEZseXVFSVdVdVlDOGx4aHowOGtSRGlXZVcxa05BWkgxdlJYWndxd25nbG16cXNydUppdGJINmluc25oRmYxODVFT3Jma2dXYkx4U0pjaE1RM2E0ZlJad1k5dk9MSGNOWmhhWUl2QzdKaG5LQUJ6T0JYRTlLQ1dKS3JtUURNNlU0UVh3alNSQzNSMTNUYTcwMXJ3RVh1NlRGSVpYeUlhVWtUUlozVkZuNGU2TlE=","repeats":1},{"count":168,"lower_bound":"NXEwenBBb1cxM0FuZVpTR0VTdzRMc0hOVmZyWVVB","upper_bound":"NXpFRjRQU0V5ZDJ4c0F4Q2hJSUlRVUlrMXhBbUkxWUxBekEyMlhrbXNPNlc3TjFvZmdSMGUzOUhnZVFFZUplN2pwUnZCcXVFT29EVktsOEl3cHE1ZlRiNzN0RHRiVEZURjl5YnV3ZGs5NndjaGllZFlTMHdUSjJvRmxiVjJ5b2k2OXBXeUI3Vzh3dDI3eXNTek5zeUxmeUh6MGVoaldlSnZZdzA1aHJyaGVsV2dKYkYzQ3FobktqRHdzVmkzYkJLSHFFc2cwMk9iNE5OWGtTU3VwbTBWS2JBZTlxUzBWbDcxc0J0Y3pQR25HbzE3TzJmNk1yWFZUUGNJM1RmRXhOS2VDWnk3bER6bUNLTnBXRlVaTkVFYjJWbjd2RkZPbnk5V1Jra2h3dHVaVm1RdGpKZ1U5emVaU3VGb2pqeWJsZTI2TG1PSFU1TWJBZU53VnczYW5RaklBR2NsUlRheGJlVHVMR0V6cTJuSWtJTkFjbFhYdGc0c1VWTFh3aWFRa0g2Z3ZLVTVhQkdzb3Z4SExBTEg0T1dTTjl6Snlna3dLVFY3M2dGaHE5M3N2SzFPY3hHVlN4Z25xTDhyaGlMUjUwZlpVbkNMaHAxTXF4MzlY","repeats":1},{"count":176,"lower_bound":"NXpWalNJSkNmbmMwVFlaU3lNcmkxTFV5TmhkeWtLcUhid2J3SG95WUxsaVJxbzJqMUlDd3RDVzJzVkZHM1E1Vjl5MjQ5alRqeGFsQ01zdjFua0tGSzJMZXRiV3g4RmxFaGRHV01vSFdmWkRrZkZDWDVqQjZ0MEZobUZoMWo3alJMOFJMYVZVZEd4cTZneDd6U2JrY3lXV1V2MXRRZ1VUYnZLaHZMWVdINkFIQ08xMjYyRnJSRHpEcHJwNHZaSjZBR1p1RVpqRDBRYTQxSzI3SmpSUGdnWXQ5UzJxYjhNZGVmN2NGUk1HMFh0eEp6RHNib3lKUEdqSGtyWXI1bFVXRGIzcW9BazY1NU5wZFA4SzlPODV2eUcyc08yc0VVZ01lS3NEOGZCb2k4M0ZtMnhSaU5CTlFPenNIN0ttd1YySm1udU44MmU2OGtvMTdtc3NqRGtZNkpGNXRjcm1ORWV5cHVHaVBmc0NwdmxQR09BOHRNY3g5cHU1MjdrN05mR1Q=","upper_bound":"NjhXcXUzYm14a0dlNEpJRzE1aEhPVUlTQjR0TTFhR1NSQlVpZzJJNjBWaE9Ibnl4dE5RdDRrUWJYZk5pWEQ5UENsek5OSVY2eXlLY2x0blJPT3FaVUdnWEFJNHp3QzNQeVFCalZiRGNCaTMxeFFkdndFemFZc0I3UXlxek9pTHk3am5Vb0ZzTVVHUmRUYXhOUlA4QTdjazN1NktCS1ZVNXhMNXFCNE92Qk5ZZ2gyT0ZienZYSjhScWlyYTJjN21xag==","repeats":1},{"count":184,"lower_bound":"NjlkVVJ2VkJpOWk5SVhUNW5NcXg5M3A4OVVhUGlSQ09seGNFMXhUZ0NtSTlYZnJTNFI4Ykluaml0dEwycmhVeU1vNkp4eDBRNDZ2U1NEVmhxYzRuelJPWkdkRUt4dnpqNFc1czRRYjFVTXZWMG51NHJXZ0w2WW52NUZtZE1rZ3U0VE4=","upper_bound":"Nkc2QUVqMW5kcDV1MFJNc0k3SXBuYktyQVRIYzJHdzBOZkpxc3NncmdkcWlIWnR5TzdDQ05PMzZXZnQxY0tQRng4TDM2Vnp5cVM0ejZja2dIQ0VreWRjY3k4Vmh5azRtZjk2YWdlNGhjS0NwZmw2QzZsem5ydkRCSVlqeFd1UmoyWHZYTzY1bUlkaXpGY1VURDRhOEFrcTczM21JakNKdlhrRG9rZ0FoWHpCYTNxWTA4T2xYT3k3d3l5WEVJRFRyc0ltUnpJQjN6bGlDMDlhTmNNT1d3OWVlTGZ4NDh0OGl5VFdyUmNZdGR6eHBOeWp1dVJYOVJxaFF2ZFpPZGlHWDdyUzE3QjVDUXJBWGxZNVZ3MTdBWG05b3VtOHhFZElaRUxnWWVsNmFxQTlPSUZqNG1JcHJtZ3F2aDlTb1F5RjdwQUhVelJGUXNmeFc0UHRGSWtQeEZHZVV1R1hGU3U0YlJPcThzd2kwNUswVGlwVDdJUHpZcHJTeVQwdzV1VUNkYnE=","repeats":1},{"count":192,"lower_bound":"NlFZZHA0VTh1ZXczWHhmUFBCMWgwY1Q1SDgzTmlUVnd3ZWltbFNCZVVqa3prcjJ4a1J0dGkwcUxMVjJ1SkpRS2ZCTWpvd0R1aXlvMnZuWk5CWG5mMUYzR0FKamVwNjh4a2VpaXJQb2dCR2dUb3Jpd1ZlUjBTY1p6clBKN21Lc1c5RmxhM1Y0VUpoaTU2ZnU1RGhiMUYwNm5HRHlCSDUwNGx0YVVMVXZxbkxaNjFkVWVkdXVTcUJObjZKcW1jMkhLd0VKSlc4QVF1SldyZ3g1eGZ3VGRmS2tIUmdMZ09kdmJZQ0M4NjhpZ3NWZjJzd3FHTHJHZ09kMnZGUVBvems4Zg==","upper_bound":"NmRIamkybEFNenNSR2V1Z05OTHh2QW1idzRjODZtcUg2Z3FWWWZ4NmpEVWRPQmJQN0F5Yk1GV0Jia2NPUXZhOWo1b0NIc2hoNnJheVUyUWFuSDJhZnQ5d2hXNDlReVZkOG9NdnhYUzdybE40ajBzRGlBdkNrakJmQk92MXhEWlY0NHNTWEpzVzAyRVFNSjZOV2lRZXdPRGdOd0hia1Foek9aR1FFcDNHT3YwRHo3R1VwekxWb2R6ck1waUxaV0xJM1JNWG1qdFZsU2Y1R3Vm","repeats":1},{"count":200,"lower_bound":"NmVQME1yWTU4RTd5bmhON1VqWUZvanFqcnRDclo1bjZRU25xTWZzdmVnQU01V2YyVEV3ellLb25zS1d5aEdCZXRmbTBXRkQxTnJVaGZFYXJ1VkRobXR1VWhNS3gzeUJlNXFZeg==","upper_bound":"NmhsRDFpdndpNUswb2F6cUJscnZiSDBPZDVmemF2VnBXSGpGOU5CYjk4SkEwd0hLTDlnbDdJNURqaVhGSTJucktCYjI5M29pZVYxcW5pdHUyVloyWkNPRFJWV3JSMWhXNW0wUThld2hyYTNoSFdMSEF4aEV2cDRwS2J6QmpUV1BQdWxtaVdCU0htTUhIRzQwUjRTalNaeUppNVBZZDhrS3hHdmt6em5OZFVGT0gxcnJ2RWltd290QnR3TmZoejVEcU1VNEpVT2diYWtZcmJaV0xIYUx6cVVmMVZqTEVvYjIxQzJBQ01nWHp1ZXY2bnMzdHp4blpHNEY0THg2dzFPRDdFQXJqZnJSZjc4a0JxUDJMbFNheUg=","repeats":1},{"count":208,"lower_bound":"NmlyYlZUdmc4b1o4M1VQanZsN1RGcEl1Q2VZNWJmWjNuUDhkc3cwU25uaE13RzJpajE2Rk5YSnNvRTlNT1MwQ0JIQ2VRcDZsdmNNdTNva0YxNU5qRU12aGZBNDlUbUhNSHh1V0JDRE9ZUU5tVXNiaVQxRnpOY3BlQllSQVZ1a24=","upper_bound":"Nno4VkhCUE5pNkx2SkVTdEt5UllkWGIwM2l1MzBuMlYxMTRmM2FNT3d6STZ1MUpmZjl1RkpUWlBxdlg2TUhHdFJUa0lidGZGT0NRV2VCZDlnWFA3dlB5NjlKczVMTFRGUEUzY01VTkpwb1FEbzNBeDFaaEJVNTlTMWdrTTZzVkQ2TmxtcjNRSmU3T09zYjc2blo2OWpoREpxYnVJNnN5ejJTOEk2OHZYc3FVYkQ5VVkzd1lmWlBDZ3pLMGxiV2VvWFBQY2ZCS2JoRmZFMGpwRzkwRFdMMENISEwyWlI2SkNhVkFzVmc4azF6Ums2NjVkeGMwb25xenlkNnlmR1RFdUxDdXFITzRoVkludnVlbDhrMmZXV2hjYmcwT3dRUGxqTlR6NW5ZdmxYYU5DZFpQNWhESGJ6S2pXQXhXOWhpSVlibW9Cd2N2Ug==","repeats":1},{"count":216,"lower_bound":"NzA2VEJIRXZCbXJGRW1XNE9nQ3N6alRoNUs0Yzk0TW43QXp0a0NMbEhJR245b3VscjBSNWdOQ1ZzVUNybmlGWGVSZEVncm16YnpaNlNJSFFQM2xEMWJUeGJyMkdnZDhTYUlOaHpOTlE4ZExreFhDNVRMaHBEV2RVUlpQWHpUblV2NHJlWFVZdDNFY2dkUmx6RGVpUFpxZGFKQkgybVpuc1ZoY3kzYzlxSGw1Y0poQVFmNmFpOTJBeHc4eWdNQmdWOUV4TXJyVjdUVlgzUXhWOFhoNzB1Mml3S25udkc=","upper_bound":"NzdQZXB3MWtjVmZnUE93Sk4xaUNzUXFEaHF5aXhBN1NEWlR1VHljbDVTQ05nVGd5Rm9TdzVEM01kYjR5VXNQdTBjcGFzbnBEQ0dzN0FHT2NocDZLQkh5UmFGRmVVQUhIb1Nld2p4RGpCaGo2U2VIbTFnQXZDbnMxWGx4aGJVSE15eFpqdkllZWdYVzliZnRCZFJpUnl3b05MdFREVVM4ZDZpdldEYjB6MURpN29aajFYanNQQ1ZaRlUzZ2ZGVVdCTWZmSEgwaUp6QUpjeVRWMHBrUw==","repeats":1},{"count":224,"lower_bound":"N0FaNUpQZkd2ZEJXcGJuWEhhUWVRSG9tbDFSUFZzY0RQdUNQVlVVOExTZlpQTXFUUDVqbWI5dHhzRXNJUXZlVzdXWDZQTGIwMTdET0NiVkZ2V0d1cVNDZkUxVnZtNkMwd3dNeTUzbVFzeHp1eVM1Z04xcnhuWmwwRVlEd1Q4YmNTUU01UHhoN3Vuc29qWmMxYkhUa3VRdU1Ucg==","upper_bound":"N0NyZkRFRHU5ZFdXeGd2c0h5UTZSQmlnekh6TTdGbVh0cUExQWZ2Smdyb2tiTHRYNUlhallRN1FtbVUyTVVybG4yRmZScGltTmlta0tHVTZjT0w0ekVJeE9RQkR4ZHNQRlNxWWlKM2tGaUhOY2p6OTE=","repeats":1},{"count":232,"lower_bound":"N0xTTG54ZHREN1V1QnVtRzkyN09SdjlETGxTQnlZMzd6OFAwWWZGUkQyS2FjUjV6SDF0anZZMXF1VmZxNEtuTnBzUEw1UlM3eW8=","upper_bound":"N21YZFJCUXkyc2FuRTdGbVdSeFlyOXBDd2pyZFhlN1JU","repeats":1},{"count":240,"lower_bound":"N3AxaGFCOWxLT1FoV1FlZEtWc1hVRE1WNktsd3VQMTA5dVpBRW1TeTZjRGV6MmJEcmduazB2c284MGt3eHFXckI3Q0JwODNLS1RHd0ZMOU5tRFdwOFkxQ2Fna3FJbmM5dlNwbG15WnJQckdrMnhHYkNMQXUzZmd4aUxHdm1FT1Jpdm14ZDU3RjFMUndsYjdXdUx5aVpOUkd4aUl0TW1Za2E5OEpoOW83S2dkTXpoSW4xYmRIbmNOczdSbGgyZG1XdkhiSzdERzc4bEN1aGR3UU9pVGh6V2JDS3JidW5BVXZjc0k4Z1J4QkZFTWthdkZjbkFRUXZJUw==","upper_bound":"N3pJZFlmV2M0YURNMDc0T2dqT0ZVd0xNZHRSbllRMjNKbFQ4VnFGYlZvMm1hM09FS0lhOG1RTGl3S0JwalNpaVRxWm84QWMwUVZ1M3M4UWkzNnN4N0xNQlF1c0Q3WTdQU1pOQmVjdkhidFBaQjV0VHp4M0NjbzVqSDQ=","repeats":1},{"count":248,"lower_bound":"ODJ4ZmFHTkxjeFJnekd4YzBRT2g4RzNIM3JUdTdWRFVMSTdQQ0M1NUZ1MmtSa1hDekdFZXRJZm5ZMnBZeExmaHZaS2pobFM3NGhRWm1oVDI5RHRsVWNBS3JSS2diTDJOdTlCYjRRdHFwbWpVRWxYWkQ2OGQ=","upper_bound":"OFRmVllEazg3c2NVZmRwMUxicXhXYVptaXNQdk5KMUZyMnJSSndUWWJWb3hUZk9oR1NRS0RsbkE3c1dodVVGZzdkUmhoNVhNaTJGZnhIY3Y2eFBsMzdFUDYySjVuRXhaNlpkWlZUalhyVGxmTlBPUm5Zbkg0ZFJEekFSVFcwR1g3TW95TmJsVFd0Z2ozb3NvR1hMcWllNk1WZkxDTmtVaURuODlqdWxzdmhmaEFQQ0JPN1AwTVg1UjJVazBTSkVPM0FEZXZVZEdiWDVkTktIa0Y1bXV4MFVBMjRCMWx0b09DSWRITGd0Rg==","repeats":1},{"count":256,"lower_bound":"OFRzMW8xUDNkcmlJWllNa3RBVkNKbXNwVzdRdVlOemthTmZ5emliM3RD","upper_bound":"OFpKUWdpVU5YZldCOE5kZnBqM0RYTUZjeHQ3dU1taHd1SkZyTFJpeHQ1OXpyajFwU1NIZ2FveXpSbWY0cFVxcEVVNkQwUG5mcEt0aHE5TEI0MGFYRUI4eWJmWG5HbU9oZldneUtOS0lJaXhydTZQWVpRRk1uWjNjWEFjWnBua3NuZ0p6Q3pUZ0xKUkhGa2hHb25NaUNONGYwYXNDNHU5SEdDYk1rRzRUOElBcEM2V1BSb0hYU3ZCNzJaeGhSTzQ5S0JqV2VBZzlsYTlkU3FpT1BSYjR5M25RMnM5RUxaMEVU","repeats":1},{"count":264,"lower_bound":"OGJjTU1FTmV4Slg0cmswNnV0MXpKSjVIOUVqNHZQaWgxUlBGcG9Ia1dnT1pyTmM5Zg==","upper_bound":"OHpjVVpNTHdoZGE2c2J0VFBmeHdacUY1VjVOZWRFbWJFMjg5ZXpHaXNyTmFSV0Jxa2V6ZGtVTzVEdElzSFpodGRBOExpbXVOQ3BhS2JDYm5YTWtxZzZsZTZ6Y2ZnaUN2d29EVnBCTURSeDh5aW5vOVBaMXRmU2lma1RLbnRXZkVacmM0YXppN3VUWWdZVDI3","repeats":1},{"count":272,"lower_bound":"OTd3WFpkSG1uZThpcTVyWHJtV0NMSElZcHp1OEtIMmJEREdRWUluZnE3T0xROExsQ212SVV4TnUxSlZYazByMGhpbkkyaG9iUHBsU2pHcnlNSm5NOTJmWFl5TXhDRnRpZVplSEt5RFhhUnhncjYyZDR4SVFIZnpTZ2UyN1BUcldYVjA4SFB5aUpDQVlrQzhxdkJCOEhweDExbW5ZckpYanlkRWZqaXM0cjNDMkZQNndSNDEyRW56MkM3WHZTMzRWS0V2a3NVZGV4SFRLSzZjQmZmQVZ3YUVYendCT2ozY1d6TUZrRGptTWh6ZTBvVzNhTk96QzZJVjhoeEhSQjY3SWdZV1RwbFoyd1VldDdWN0pVcWdjdmx4dUl0QURtRDV2N3VBSmpiN3IzaU5PbVd6dFFDY29MeUFFZ21UbTRlejlGRVl0MGpBNE5wUFViZ3JtSGdhNTNnc3hrZUd2eVZOQmJrMmxVNFpCc1NHRVFEbG96YXdja2xOYngwcmVHdllaQWFSTGdiZTV5dVNJY1VGQXRJNHVURnBnUWN0bmdlTENyTjQzb2tQaWdLallIbUpYRnhMZHFFNFBVSnJlVWdFd2c1c1ViMGlFMUU4RkszNk1mdkVOd1VJRzZOYnVWM1N0TUx3NUtwRWFwd3d4ajk3WjlHcnhvR2dTSFBGYW5oSFBLWm1Wa3JFYkRCUXJ3OVlVNEwzeXZE","upper_bound":"OUY3Q1lEdG9YTWxZdGwwakdGQWZTVWtZRGJ1b1lKSTFEb2FDU2diNUdoYkVMQnhlMDVXSUF1T3BJZ2dzaDNQa2laZ0dUdU85eThXUHd5MjhHSTBLbkhqOGdqNFd0UlRqRmcyZk4wTmpDUmRFdWgyVUVRMFlYekpiOFdIY3dRUkNrcEJDRjl4Tlp4OTVHWDNmR083aVBUZEZKQm1DNnJoeWliT3BCempWVkNqemNpc3l1cDYyVG9PZE83WU5OajNtUGhYTm5rU3A2YW96QnE2elNWbVJJWWtwVURaZVM4VVRseGhERDEwN3lNSk5UclFQT0hCcVRvUm1uTkltanFKd2M2ZDVwY3prTWhvR1VvNVYzY004RUhaNFNLWXc1WU1SS2hRTHFlTzVSN0RtVFc4U1BQOHU3S2RMNDRDZ0tCeU1lNDhRUFFiSnpJMlhRTXJHWjRUeE4=","repeats":1},{"count":280,"lower_bound":"OUZxR1hxbnlBTGhQT253NDZlVEJDZHlrbGhET2F2UUxNNHRHUVBBRE5yb3BVYktQR0p5SXNWcko0RG5PN2dDOWtUb3UwV2xndDVENU1WcWFaWWlGVzdidDZiVHZKN01XZll4S0l2MXNNWjFXVG1sYUFyMXJlRjVETnNzR0M3d3djMTlEemM3QmY5M21zOWFPODRBVjF1ODY3ZVpuMDhQOVR2SVZWbDVFakFUVGZkOWhRcmx3aXlqNmF5MlM2emd6MFZBRHVnQmFzTk14eEpRaEZYTHh0Vzl4RXoxOFdZYTlyS21WaWFsemhibFpWZGJiWnM3dXVEQTk4QlN5eTFu","upper_bound":"OVNaRDVwdUltbEJZTW9pWThab2dsUXRXRUxwV2g2SmprdElvVlFGR0EzVFdqY1ZCU3FmY0h5WEp6YkkyRTVwcUI1QWE0SWZJSlpOTWF2VHBCcVZPZDU2RHVNYU5ZcDJ0Vkl0a0xSUkhYUkJ1cWg1TlAyRGZTM2FHTVE2TjU3QjdwWFhkNGJWejFBSk92ampEYkVWZFYzU0lwT3I1SjlJRU4xWTFvTkRMZlJiWGVqb09haWlKU0U3bW9GU2RjNzJ1cFhqM3k4bXNHSG9aS0M2Tm5GcVNvTGpVcWc3Q1J3bFRaSTlOMWVKVnFzRFVPdUNueFZHMkgwSUpOM0pNWUZJeVp2NWphckI3NXYwU3o0cE56R1h0M2hVbEQwQUFFSXo3bHdKRkVMd3dSWEprQ0NCM1FMemZjZ1JpV2dDNk82SmNibHZzems2WndxR2JtNWxZbVk4b09tdE4wdnBTUWZWUndlS0RzRmFDOHZkQTYxMmtOMFk1Q0tkVzJGS3RiQk5TSmZ1dWtPcU40Z2F0endPYnFEd0Q3SURYcndBdXI2dERFWm15REU1WjJZR0NUdzdhY0JZdkN6MXBjbFkzdzFvMVVXQmYwYVZFR0lYN25XYVI1RlhjaDdiY3JDSWYzT3B3eW5OVzNEdUU3MGFBbURoN25QdXVZNlAwTHZpWUM2RmUydTFITHdpZ1Y1NGpI","repeats":1},{"count":288,"lower_bound":"OVh1M1ZLTzRibU5oVjk1Zjl3SEdhYkFpZTZpZmFjVFJwcnkybHluM05jdXBPSXNpWnc0eG1ORVZWYTFyU1hYMkpBd29JaWIyWkRJdWI5V01LaXVpUVBCYlpuNEFqSUM4bkF5V1hpaUl2cWJCcnNad0hpUmc0bWw3ZWJaczdSNnhWZVVjWlRJeThxSDk2SlVlQ3JzbG0xVGR5c2dPZnNNZ3NFT2NDZUlpWXVsWlJDaUdiag==","upper_bound":"OW5ZUTgyVWFlNExYNzVEQXN0cjZFN1JLZVhlY2ZyZU5jY3pYNnozTzFHNEJsTFJpcU1aaU9uVkNyZg==","repeats":1},{"count":296,"lower_bound":"OXFRYXRWNlN3Mm5ubG1iUXVEUDNzelNiNDlPb0dobFFsS05GUVZpcGNpWHQxV2ZZZHRsWHJLZkVKWk5HSHZiVnUxSTZOWUZPU3ZhOGxHMTJudE45cWV3aG1zc0FTVG1zcGIySEhEUzdBMXJieHVzS3RnUG1MdEMxQ09RNmZPU1lTSXk2QWdaTk5rWFFNSFg4UmJIRWpMYmdmYzZua0k2aWpyOHE4dzVPNjkxeWNzTUpUYlRCSFdMWk1lTnRvbXI2Q1FyYmFoMElac1M1MHJWeEFQNTFLeWtjMWtSd2U1NTNQTW9OM3ZKb1ZZS2FYd2hjWXBGMEtGbXJRY29pYzJ4Y1QwUGNicWo3Wm1kQUFyRTRYdDFkbjd4MDhKV1RneVUyT0lLTUwzNXQ1SHlTMnkxZU9WbjcyOUJtaGtOSG1jczUwWDkzTVVlUmdJblZO","upper_bound":"OXhCanlLb1lpbmtQcnQ3NUNCN0tpWDhFWUJxbzhEOU5mRHU4UWlpMGk3M2htVkdsQmVKRjZLcjkycWoyTGVuczlJWGxWWHJLN1M5VkhDa2h1b05DWg==","repeats":1},{"count":304,"lower_bound":"QTB4WXdQV1V3T1Q3a0NQdnZjaGtEdEN2OEJuWVVPcDR3cFpZOWtWVGxxQ281Z3JPSmRZWEp1bk1CcXh0NjFhWmNBVGY4bXFrbTNLZHpSR2NBYkRpVkZGT2JQZldFUFhUYk9ZWkJWVGtEcFpZV1dyV25aZ2cwZU5uTDM0VDNqTWR1d0EwVG1zNGdqZDZnQnVET09JemtERnNiR2U1NE85SU1KTGJnTVdONmlodHBvdkh2S2NzTnZ3MDV6UktKZEt2SFVHMDcydGtHbUM3NjlkZUJ2MkYxNUty","upper_bound":"QTlSSFhxQXJ0RUdjMTZBTWYyeGRKNmNtMVEyTDJuSFJUM0VWZDZXYWxwRWN4cWcxbHBVcVZ1V1B4SE9xc3hwUUFSWEk=","repeats":1},{"count":312,"lower_bound":"QUlqUnFEOHVhenozV3lZc3dwaW5sOGo5eWpQT2pyWWFQcnlmQlJYNzFWdGRLMWYzRjZHenpCTjBsVGtwSnVFWXNMY2xodER5MjBicW15eWZnOEFoUmN4MzJ5YkF3QjQ3eXpnQUVER3JDQUUwOG9ES1M3bWNUaUtnVkdPZHRJTGF4a0QxZlVTQmllNjdvd3JXS1hDMU1TODIyM21jeFg3bDVVNlhxbFNmQTRsYXczbHIxeVllWElwV3FQZHBtNXpMNzZiMFdzVVllaFJSMlRXUkNncjBTMnZjY0lhZlNwNFpFYUJFSW9KRmFNUWhyUlpNQTFV","upper_bound":"QU52R1k1c05JNXJMMlhEVmJzcHZqZDFKOXlRSWxSVmpORjVwbUtkQ2V1Qm81NzcwVkF3SGQwUEllcWxwZ3V0SHpTY0l0ZnZFbmNiUFZTcU9xN2h2ZElkOWNNOFU2MFdFR0lyU1c3UjcydXJSelA3SVA5emlYbmlucHdycmFHc2tMOUU1RGpnOXB1R09zRGtNdzREMlU0WW9OU3dWZmZvdHBHQjJ1dHhmU0JzZThxcTI1VkpaOWZ4MlFYMkhhSWQ1bFh0ZFRSUm1ONWpnT0FCRzBWTkJVZmk3RFhxdksyR3IxNHdqS2QzODBqWWlHUmZJZE05bFNnc0Q0ckVaQnJKazNFZVpPTzNtc2tFcFFjcmF3YnIzdTdXWGNMZ0JZSmJEdXhKREVWZW52OFBEZ0VlOERXZDNzYWwxQmRDR2xXelBBcEpZZnJpWko2T0NhUU4zWXM2SVkwSWNFM3FRdg==","repeats":1},{"count":320,"lower_bound":"QVNVdWs0QXhYNjJ5dUNIUHFVQ0J2RzBZYlRYUU9CeFVPZUl5QWMyTzhUNzFpc1BSUnhBTjBOWkdwaG9ReUcxT0JJTUUxMFpJU0JMcjRGYW5hTXBkNlpHWjQ5NmZSSnd1RHQ2bVdrMGkwVDJDNUdhdFRMVEN2VDZZTTU0NHdXZmpqdUhNREk1OGlRWThqRndFNVhDRVpGZEFvN2FPTEdPSEd0RDU3N3hyMEJHUGkzOURsbnhwNUJRbzZ2YjROUTYycUxZa0k2eE9mVnhSQWpxVW1UZEdFdGJMRmx4RDR3WHl6N3hSS2M2TlNRa1dqTlpncmtNaDdLQ0U=","upper_bound":"QVdkTzRoTmVUOVQ0anRtcEYxckg3UFBIdDV3d3hvcDdma2V6cXIzQ0lDa0xON3lNVmU0cE1YV1ZrOHl4VkdSZ2NzRVA2ZkZCcTNlSFRIVlpuRmt0ZHpTYTh2WjVMY3pMdlZTU2V0QTlhODhpa1BNWm4xWUFvbENhWHRpaDBwemhXV1JWc2lOd0NPYlN6U3liMERGZEJPQjVpanp2UE45NmlKS2pBUkFac0dRMWZWQU5aUDdRUnZGZVBXZjVkY0pjSk5oRmZ6clBvUEprVEhySkE3aUQwZzJXVW1QdzQySEtoRVpuRzB5SVVZTlhsRW11Tmx6ZGJSTFlSc0FKM0RhUTgzb3NJbjIwYUh1UVVKYXhITjEwVG42bXh4bEpSN0JvdVprZVdPYTY3R1JWSklLUmM1UGpoOTUySmdJVW5CT1JvTm9PU1k5UkpaeHRDZmxMY1EwSkJkZ1N5dXlBTDNrbFlNSzhGSElEeUo1aTdmUk5UMUl2NGdqNnZ3b01xVG51RHo4RHJaVWV1SVhwNFp1U0ZjY2ZYSkh1dk9keERrUElwN2c2MTdFUWdoZ0dZeVR0d090WWZpWHQxS1JUNWpFV3hWVmZMUUJ5V09EaU5DSmtPQjlIREVLdmhlSjRRUkVFWFZzY1lscm1EOGNpQmx2UmxJamgzYklhTDhpUHBQQw==","repeats":1},{"count":328,"lower_bound":"QVpZd3pGSEJUZVhRN2lHdG9QM05WT0xidW0zblJDTGlBSmVZVXZ2SHFYTlZIT01Fc3hqUjZhR3M4Y25QZXN1UDJpRFNnbmVMU0xoVVNNR2VyY05KSHhFamJac3E5STJ4Q2FGSDV5ZHFNNzU5WkpoRmw2d29hcTVVa1VWQ0hEQTdHTGFDWEsxRTFGWm03Ukx6T1AwdGdYMVgxMXdDakdBYTdOcnlMMFpxUGJFVDExNDR5M2lPNnV6eFE0M1ZvWXhpZHFIUDBOd1NsY3BwSU1IUzh0dU16YmJoQkV3bHhFcmhJVkcwU1V5Zjl4ZEhaRjFtSm9hcUxYM3plSzQ4NVBQMzAxUEdTWDNpMjAySnhEenJZNjMxaGd1YVRTM2lVTEhMeHFYRUJ0OE14ckxVdVJzd1BDd2lqeFZMTWJRQlJxUHV0M1dnamZGTkxYSndsS1pIak1sMlFRTWVBMzZwbDVzcVFNQmZSazIxams4c2h6SXZ6Y2JuempZZXkxSENEc1VwcVVEUkoyZkZPQUpEeWx3TVdmbWtKTWRqNEVaNEdiTmV3ZEJocm1ZdXRjNlI0VjRYMlpqRFdtUUt1bzh3V09YRGh5NTBCYWMwMVU0bEREd2t6RmRwYlVhMXBTY1lzNVUzakU=","upper_bound":"QXYwRlRVc2tFSGhxTHdyc2Zoa1NIRjE3SjQ0Y3UybWNnOEc1SHp4UUJ2Rmx2UlQycmpuYk84bHY1ZVFvOWhIN3QyUjN2QnBpOGRPTDJFM3dTejRzVUhQOXBsT3N2TjhvalhRTlh0ag==","repeats":1},{"count":336,"lower_bound":"QXhLU1diYnZSVVRPbnMycDBlOFMzNTI1cDJqQXRxWWJkcnV6VmthUk1ieXhNSllLcDlLUzY0QVVWeGs4ZXVmcUR2Wmt6VUU1TVdaSlpjeVZ4VklPZktESndxWXdZeVBuNDRXSjJWUDNoNkUwRENrenZ1U0s4dHBPS21iQ00yTGhSa2pVQTY1dVlQc1VRcGpZakNBMXVJbzU0QlhRc2IyWHkzWjZFcUtOWUtLWmsyc21QNjBRc2ZnMGVGVmdqc1kwQThSVUJJUXVLRG1GODZVZmVJUUkwTmhSNmZWQTRVY09ydld5UXZsd1dES1Fld21yVWF4dDhlWEtqZmt4Y3lUNzhoMkMzNzNQUFF6N05FbmlBT3NkRGlpMUlDVTZ1d20zV3hYQWpCbFplMjZTYUluSFNNY3hpU1Rtd05SREx2Z01TWkI4dzhFVnFEeVpMTWlJMXJ4V1NMNzhyWHdrVHFEdUlIY2lhR2NQUWhqUVB5VkF4eWVlME5POTIxaGF0TDY=","upper_bound":"QkNwQ253akJ1bHV1Qzk3MUJ5TWgzRXVSV0lLZDdOcmw5WHk0eFpCdVM1d0VacjR3WnJjWEcwNVU4VVpJMEFEQmphMmRybnp1dk5rOUthako4","repeats":1},{"count":344,"lower_bound":"QkdOYnVRYkhhaXQ3WWQyZFQ3RTZiNzJMMGVpZlBuVm9DdExYSnBhcUdUQU1jU1REYnVZVDBYTGJLZVdkc20wSnZDRzd4MjJQR245TUpwZGZoRGUySzdlU3ZNY3pJSGd1TVk5bmVGYzcyMzJUdkwySG9yeXFRQlcxOUNBVWIwNGUwSEx0S3VPMnp0c1lrNGR2eThrZlc5YTRSeWtzSEtCcDhNQ3NVWWJYYkZlSzV5OVpmeWJmdTY5WUROV0VJNUJrUGZYSGYwSllENEc0N0c2SnVBREMwaTBO","upper_bound":"Qk9qY2N1UGtSUE5QcTdOeHVoMHBrb0RoWVYzYTd1UHFTSlNnSDkyWGRkV25IVzdGV1BFYnhuSnk4eDd6MXdNUHdWS2tya1dOSlZ5SmZZY0RrQkoyUEx3TmZMbGVvc0RmNEhlM0dhWnRqVFhZVWVGbFdoNFlCMDhBaUlUVzNBRWdod1c1VnJ5QmFOUWpTSFVQRmdFUVM4ajdoZW9jelZXem9ZUFptU29EY0lTV1gzeW5XYjZaTGxkVTR2S2VGRzBaUHQzd2lLbURXVlN3OEk2dlp0Vll5MElpc0FFMVpQTVJtVkpzRkFRZ2dLNnpBUUd3b3g1N0ExWHp5U1hXOGpZdm1SOURTbXk0ajFBZTdjRGxKTzIxcXZuc29oTEdnNHVkRlB5cDlCa0l3d29odk8wczJsa3dXdlJNTkFhZFVNRFRlMkFrTTBWckJrTnRNa1dnSjBzMDZYYVF3UGNOcHpsN21aWHVDS3RIc3FKc25Rb3FrSmpsdm5pczczU2NzSGpMaU8zYzhwY0FRQ2dRZFFjbmwz","repeats":1},{"count":352,"lower_bound":"Qk96eFFrc1VuUHZiQlowZ1BwUFZvMm1BWlpjaTZTQ3FQbnNreFR3NnFlNDNaMnNMWWdPM1lGb01OTHdJbnphZ00yMVM2RzlPQXhiOGpCVE96eXZQdnAzNGpWdFViM2U3SU5hblRsdHRsb2swQ3JRV3JhejI4UHEzbjFxM0NZcjQxZm1T","upper_bound":"QlN6MFlSa2V0SUNHUVo0bUhOUndhbHJiT2tMNTAyUGROYnpXUUtVVlNoVGk2OWhWekNFd3FITXJZT01pdDI3Q2ltRjE1OEQxbllSUzQwUU1LT0N1VkV3MWE3ZlBCVXNZelY0MlN3S1FLbUJsaGZObGVnYjNJeTEza3F3VXJYUVZhZ0tNZ3lMdkg2SFFYazVrcTVIZ3FBS0J2VnVPSUU3SzJaWHg1cGl6Z2VzdG5jb1hlSHgzeExtaVgxdWY0ekZPTVFuTHRuR21LSXRtSVVDVXhySmY2ODdZVDNzS013ZWlEUHRBVVpCYVZWVEJaWW5OalVBQnNhako1S1VwQ2dDdHh6c1BPNXhzeDNuSENPOVBaZTFYYTV2blFrT0MycDREVDV3M3NwNjU1VFZ5ZW80M3VRVzBRdkVlYTZMYUJuYWpQTlpCcll3UlVrdTFJbUhmeEFEVkRRSFQxbFZkOXRsbXBwMFd4enQ3bkV5cUJvdURmZGhORmhWbG5KSlRuMjNyd0RBaXBGZlkxa3d3Ujk2M2R1bXpFcDh5VHhsbjc1R0V3VTNZazVQYmhRZGdTRVhpQWlHWTVXTnNzOE5oZDZ4bVlhNEd2Y2p0eXVha3VPa0wyY3RMRzFHWDYwRU1sVjFsVkpmUEJVbHRMbzFmS3V3QlpsMQ==","repeats":1},{"count":360,"lower_bound":"Qlk1WDY2ZVk5T1JoUUo5RHYwQnVIVE44TFpObHpGZ0EzTU9WQ0Z1T2dhWU81MUpINWFsTlJpRlp2eTVUcmZjdzl0MGpmY3N0U2N4N2dSRmptYlE2NVZrcE1KYXh0Z0Ryd2REWFliRWlkeUZhcFhqSlA3MW1zYXJZazZNbHQ2c3lHdUd6dVlQZkxySUpPbXNrVzJkeXhsY3BubWNoaWZoYkZGbzh3R2IxQm5sRzc2ZmNWUThMY1h6RlVxZlRmTVBDaXN5UEZ3MWpkaVVrajBCbDJuSWNYbUtZZXUwMUZpQ2JFVEt0NlJMc0Y5MHBIY0dzTzZPOHBVNHNCZ3dvbmZsbmQyZmFKU2drczJ1UDFjT0VYMmpMb1pFOXd3M3dTOGN5eGdlRUJhZ09HaWxzQk1aWHZMSnJTWHY5YVltZkdVN0kzbTBWUmZlajFLcTZRN2JzMHJZWFFJNTRZMzFzTVNjbzdxdGVhMHJxRjFJYWVqWkVnNWFQMnJVVWJpcXZGYjM5Q3NkZFRB","upper_bound":"QmduaXlmVXk5dVUxWW5XODZOSTc1NER3V2pMS3czY2JBTmVkdENUSDhwVXJtdFVIMTA3OHJlWml0SkVWQU52djJ3UUttTTdiM2xpZGNBTDZxUlBLNzFwc3dvUlNub2Vxc0JTbXZ3Rmo4YkdpUnFRMmkwa25DQ2Y5bzJ3UmlDUXp1YUkweUNGMldHYk9GTlFv","repeats":1},{"count":368,"lower_bound":"QmpycUFRa2o3bDl3SHpwbGFPTzRWQndSaldSSFpDNHNiNTNSUDZ4VVlLZm56bDFmcWN2S2pROWRWc3Jnd3pzSjlzSVNqdEc3OW8ybFpSektqMVpTYTl5aFB2WVEzZmVRS3NLb1VSRkFidzAwYUVuSDQwWXNZSW1sTjlkM3R5dEpjZGN2eGJPaUszdmNVbDZYQjlpY0g2SWtDUmpXb3kzODRGSVZmdzN4VWZPV0hr","upper_bound":"QnFXaEczV1JiTlExbkNhSlpqdEFSemN6UmQ1dXFleFFYbXdMMQ==","repeats":1},{"count":376,"lower_bound":"QnVmNGdNWVVnbmxHU3BoWGxYNVozcEVpQk14NUVoUjF3V2JENTQ4dUpuenlGUjVBRG80TWZOcmJQaEU0c3lDU3VzdTVsWG9CVlAyQkllUzFtQWVpYk9WN2hOejhLMVYxM00=","upper_bound":"Q0F5V3RxS1Nxb09MazlRb1d6TTFDSDNSQTVIYjQzVWtOdXJZaDVPR042V3JlRWhWNnd1S1hCMXlpUVlpMFBjcXB1NUJRam9BM1lsZUxEaVRTejBXMFNPbmREMUxIUllWTklIZXZ5cXRvNWFQWGk1b0tVRUtpWWRhRW5tSlJ4M25KZVBYU0ZsV2VURWFxVnM3WU9melRuMDA2SW1TeUdrYzZmMHBYS2xnMWdGTGJNN2g0enFJcGRwVUFhTG5TSUtHYXJQVXcweVJlOHRiUWladUtXM0c4dUNCV3VibzRZNzBtdEllcGRFQjZZNW9HclBWMlBMT3F2QXc1azk0OTRqRUk4cEFYSUExeEJSS0NhVnJzQ0ZDRG05SnJoTmxSZkFIRkZmbzNrdVJOdnFzYW0=","repeats":1},{"count":384,"lower_bound":"Q1I0RUV3V0VBb2tCUnhRVlNBVzBzUVRnVThLM1JiZUgyWnRpMnJHODdOdkdMUzdSdE5KSjZueVU0ZjFrTFVJSUNGWDhkbUN6UGhoaFM1Tk9HanJJQkY3Q3pPNHhxb0pMVUZvZjBPQnRYTkFQV1R1VzZkRG1IVTFqS0pNakdNMDk4VGp0VHI2bWljODdITzcxbzRLUUZTNDNhSldEVEFzem9pWGNHYkxsUmZ3SjVNa2Jka241WGg4WGt6VUcyU1NmVDVMTVpBN2xzV002bTFFTWprM2ZFVFVoQUhrQmxQYlBqMlNUaWMzVkVaT3hDVkd0dHNQYWNncU1zc3hHdzQzYXlPc1hPMTNkUzRickZkZ25yRktTSGJpMlhLd0NVNzVQTFNlc2pwbnpkTHF0UEZsU1EwMVlvMmpWTzVhTjFpU0xQcHVUbVRsdHpRa3IwY085bno2SkJVdHR1eHliWkQ3RUMyM2xlQkF6Q0VBbnBEMHBnWktoZExTSWlkbGNVYlVhTGFkQlVZQ1hVWWcxMzFVY2w5OUZWeTI1MW1uWlhPNmppeUVWZ1ZKYnltR1BMVkxOMkVVZVkxelQ5dEw0aGFpbTNYVjNscw==","upper_bound":"Q1dWbE5FS0h0MWpoMW92VHI4cVdCZVF5VVdsNW85NmRPQWltejRLM2tQOWdhNWxiZVBVRGkwUU9LeUhjYlZDSWFhSG9ONmJiMlJRZkFkOWF2QmZzWW52RlY2bW93Nm5jbG9ieEFnYnh5b3J2Wg==","repeats":1},{"count":392,"lower_bound":"Q2NyQUNLNDN3OXU5cFRPbEdaN3ZtSTdWOFdKOEl4SkF5bkNsS1pLSFoyQmVxVkROV2tQVVlWWG9LbWhIZFlaRVh0MW9HM1RrdTVQN0RBU1NzWFMwQUpqc0NIaHJqcEdYeFIyZjljU0tuWEtkUTVxRlcydWtGeUpUWGZaMWVJVXVTM21qTXJYYVR6c1JHQ0g2U2ZlZmRuVU5vUWVCWU9hM0pWYldFZW05OTdRcG1YdXFWQ2RBV3NIWGYwRFB0MXhYZE9OR1lLZFVzSFZ3V1pQWGlKNlA2b0NpNkczellTdGNoRlpSNEFydXp0bVhvMlR6eTlTZVV6NG5uRTltWXNnNUZYR2hrbXpVN2k3ek9jbGt1aVVzRXJaWnhNRzd5dXR2WnZUM3liMTZjVg==","upper_bound":"Q2lETTNSNkhNbVJJSWs1QUZSWFFURGx3dFg3Q1VkZnZKOWhQeHdPeVJEZzVUb0lIUm13eEVOM3pmY2lsYU5pTlBXY2tCS1d5SFFlRjc2ZmxBV0hZaDJib3JQbHlRVkZyMzNZdGRjTHVTMmMwNG1LZTBXWHJqbHBPMXp5d2Z4elJnTGtHYTc0UnZ5ZWk1elhHdWRodnFrQjNPY3psamxnZHdha052Q1JUMUtyR0ptYmViSUp4NXc1VFZkdUFCV2N1cndHOHpaZW1kSmNqVlFWZ0lMQk9VV0dqUFk3cWtZaFhid3dqVFlJbTZCNFBvY1pRbG9qWlUyT1ZKYkFwMmRpZld0SFM1dEdmWmg0RVBVSllSelp0blJsMWFNUmlxU0UxNGtlWmFaTXNhNjhYSG1WWEdua2pYZzlyNGJMMzlFYjAwNEs0Qm9COXp5czllN3ltRU5KSE5ZNk5SZ0luNkhoUEVxaWs5bGpYblE0eUpOOVcyeTZoTmdVeEp3UkVpUmlLalp0QUpZaE5wUWt1dnBJZzMwTDJxSFRqaE5iVjZuWUNZMmZJQ2NnZWxXejI5NThCZ1ZvRlhJaXdYdHRIVXJaVlNKSTZSanEzb1BJNXNlVW1oRU9JUHAxaVdCNG1rT2dWQ2V3VklmUGlXdjFsMW5zRjBxMGhwZXZEMGlqM2Q3c1c1","repeats":1},{"count":400,"lower_bound":"Q2pjM0tEcWlxVEZhaUc3b29PQUdlalozOXVqaUhUeGtUZEQyeENoQ0oxdnM3M0o3TGFkN1dzYkJGRWNoTHo3a25FSFN1ZlhZY0VmY09xWjQ0a1N5S0gyNDY5VlFlNGVWOXJZU1FSbXVFb1BTU0owWnY5QmZubVRhVWNqeVhMS3VXME5nczdHZHVhbWM3U0Q3alNDZThlOVZzYktpQnp4Y1hRUlhiNU5hWTNicHBSTnVSakVwQzU2VWJqeWlYME5VNTZDOUpvRncxeDNsZDBhWEdvcloxbVRSMmY2M3ZQMFV3dTNFSjdZUXU5MDBhcjZac0hvMDM0ZGU0V2hiZHo3TmxtRG5hZFZnYzVYeGdsaGtoZ29NVkFHSEZzMEt6MmY3dE1zMUhwUnJVOEVjSlpQb2s1SURx","upper_bound":"Q3Fhc2ZlUmRta1kzZkkxaW1FOHdwRWE2RzBUN0tqTlkyb0hVTzhFeG5oVXZTWEpLdEJvUXBYMmFzalZwQmt5QmQwMkp4VERaZkhoMHBBbnRuRUlPczJBQ1VQekluZ2lBTGZxaWI1SVZJZnN1WXQzazVINHFleE4zcHNLNkRFaUNrMHFLWnlWQnZrRExCd1J1ZVkwSnBsY3dRTmh0bUNrYkRHcW5uVmNiaHpob25FelE5Wjd1YzZ1Z0taU3RFczhDOGVBVFVqbEtwOW9najJabXlvY2twNnFEdGtIZlowc2k2Vnp2dWVjR0hCeEdadldjTFp2a3MzMURZeXgyNDdWRGF3WkJ1MWx1RUpTS3ZodThhSEUwN3U2QkRoeFp3RW5iNVYwQXUyaVVzNTFFZ1JyUDMxOHFWeGVDeEFoM3o2Q29PRWVCVmZCU1lzVnREd0o2ODZEeWRhNzRTWXlRV3NCRHRDVllGb29jcFZ2Nm8=","repeats":1},{"count":408,"lower_bound":"Q3NBRWlFVExIMjEwMkpIZDdnUnFKTG1EcUl1aGZXa0lWWk1NcTR1cjZvWFpJTVZtVHVoSDh2OGlQaE1YWVhNS3g0YkZXQ3c2VUVmVGJabnZyYkhvcTNhUUZPWmJwV2cwU2xkNVNrNGRvODltOGZVb3EzemlpZHVHNXpucHN1VlY1Y2NEWGN1N05VMjRUUm5BN0FzMzhJU2d4OFYyS204M29KeEZMb2w2QklQcEZLdE1sU1dxNFhJd2lHT0xXT2dlVWhNZkVHZUlJd1FpdXBNTFAwdGZXTE4zOFN6cG9sVlpwOGRlMkQ4UWM3a0dXTUpYVFdLNnZ0YXRhSlBHTmJOT0ptSU9uYndUZFhBaklkdncwUWljTDloOWpQWDU2Z0x4Z2Zrd0w1NVVyeUlUU052bE0=","upper_bound":"REFVbUlpVm0zb2pFbDM4aXoxaEhEZzlVUkR6eW52Z0R4OUNlUlpnQ0tYUE5UWkNSVXA0T3BJYVBYRThCOUp5T3Y1YUJoOXU0cVJLVnZ5Rm1Fc0d1UjlwcUxMRHQxaFFQcnlTMEU5WUpOVndWWm0zM0FPUGdSYUs4dkJqSmIxS0l0S2RuYThJbGxCWFZZM1Z5TFQ3dFpDSHpDNmRtMTlDd3BEcGlNc0JjVGg4Y3M2MGc4Z2RxVnhEbGpjejBCMWFFNmw0dkJGaWlVNEtJblY2N0t5S3pNV1I2eTZsUk1tVDZiYkM5VHZ0MURpclAwOWNQZE9LZW41b1duVkxJQ2RHeGRwUFowZ3gwSFhwenZGTGhGU2NkdEZZMmZ3UVlSWTYxemJGMmNKcFZRaFEydno3T1pidnpzSkhWZkxFVW5SRFpVMHViVUh1TjFDRjVpeE1ieDZobFdSd1hiOWhudlkyd3dQc2hkYlM1MVpRWlF3Q0ltQmRGMWFXbm9xaEZyWG1VUHFrbmhNckJy","repeats":1},{"count":416,"lower_bound":"REpqcG9jSVhrMzNqaWNsSw==","upper_bound":"RFUxdll3WndvUjYzbzc4alhVN2prak1VczFENDVDRDlEd3RSTmF4YVZYbG9XMEd0Q2NWb1ZWaDA0ZzlIYkZZdjZYY0RWYlAyQzc4d2RBU2FzbllleTVtd0VLTHRJd1lkbEtnV0g1U01qQlc4Q0tpMGFyTWNGVFNPbTF1OTNoOVRScXVqcmYxajNxRzhaOFQxeEduODZBOHhJclR5cHp5eWIyaVBBWnZtbzB0azVneVpqbGt2ZnNjT0hXTGFRSDFmNnI5cnNvM0htcTl0R1BaUlRSMkhrMUhScHdaOFpwTXFDb0dQNGpRSXY0eHJSczJnUHhabjd6UmFjVnRCc1NzOHZ5eUlGQzY3SkRjUU9OQUlkZEI5blMzbEh0ZjhBRGlQWEVIM2dscVV0OTF5cTUzZVpnUFhqWkhQM2VlV0dkT2N6ZTZ4R2lzS0xldnNwMW5uSXFLV3dWSnIyanB4YnpqdUR0VDlGdXVMTzBWU1djTVdZaGxBMFBQRFhkZlc0cGFJcHFuQ2pmWXQySW1Ma0tUUWhZN3poUg==","repeats":1},{"count":424,"lower_bound":"RGJlS1VqODVObVNscGFDUTh4WFB5Q3NBdnRvUkVnb2xjbzU1cjlXTXU5c21EcUpMcmtkeTRySjdEcWxza2lyVFBTcXlyaWlFT2huWjlpS3pFeDJtV21UNWtRMHUxWk12TjdzWjJia2V3ejJmSTFoeXg3aHdENUlnQlRQUno3c3RHTzdDUFZXZElQeGRXUHZpMThYTUE4bHR6TlU5SWIwWUVENFdyRzRJS2RtdTFYWWVNZ1l3Wm9SZmliZzlUcUhZUmwwTXRtZnFFRTVL","upper_bound":"RHVGcjMwMmZuTDlscGloVjVERWM1aHR3WnZoMTBJQUxhMDRZTjB1TFZ1aXBzbFV4eWVjM2tXWFRvUVVmQllEUlJpQ0IySVh2ZHFsZjdKOXNpZjhNTA==","repeats":1},{"count":432,"lower_bound":"RHVjWHczNzBLQkpqeTN2eDVPTEliYlV4d0xTVllwUndiYjVrNFpZVmdRcE5nY0xmdFRZejhLYlhTcXNWT3JRcnIxb1lraTd3eW5qTnpoS3dXQ1o0M0dKcVdiWXFRS0JJN05QYkVmajZ6WmRSd0JDWmd0b1RhSkpGUVc=","upper_bound":"RTVIU2JRdGdLdEdYYmFRUW1LTnJoRTJzV3BiRVk1TGU1Q0FaUVMyM1h6RllzaXNjcHl4OHExWW15cHlhRGJNQzI3TTJzSXhUMUllS01xQzVyQWVuU3gxM0FVdWVDWDhHbUI5S0l1UWJHZVJPaUJtbFBwT3ozb1RTMGpkWlJ5bVRVNnBvYXdGM2ZrMlp0eGk3VUExZE9QOE9YOVM5MXJSaTFKblBta3F1Q2w1MEV4bDF5U0t4U2ozWE5VRjdYNVhVcG4zMTNwYzc3NzRrcjRuV1RRaEQ4SWNwWFhzUmY5dlc4UDVXRzg2ZWRKM1FZU01rZmk4SldCa09sZG1rdFJGV0FweUJ2OWphcmtHVXl2Z1ZhV3pFYUJmc0VvVGlxMUtLVUdhUlZoY0hzSVk4Mk5IcFpwWXNKcGZVeG9mSGF4UHowdlZyOGJ1SXFIcHpyd1hsYzNTZW9aRVBmM0FQbUVMTFkwN3pGZlk0bzhKalVtbkwzNUxZV3BPWEhzRW0wdlB5N09iZzJLTjdUaXNUM1VQTFl2NjNaZ1NKVExLd1JRYjRZY0xIZHZU","repeats":1},{"count":440,"lower_bound":"RTdHUnh5VUV4VGs5UENORjdaZHdLazJWUnVmalRUV1BDeU0yeDc1ZWlTQWxtUFgwQ1FFSE50SFRNNHNzS21MMlB0NWxKREVKVWpic2ZRS29iMVpadEpuTkFqbG9tRkhTR1RoUE0zSUI4djB6cWxCVHRlYVVVY1hyOGFjUXBVSUlVNjlhMVRQbUxvcWdvYTBjYTR4akF6Q210VFgxNzE3RlJLWmcwTVBnSW5sUEhSZHJhNThMek9GeFZHRWx2OUVzeDJoMFNKbjlJVmxZdG1oNVphRWwwQ0diZVFRT2dBcnNYbk92S1g4WXYzbEt6MlBlUll4WE42b1AzcHhGZm15Q0hwTHFnOE9PTzZUeDFueDJWb2VhOWJhZVlZdmtMb3NYM1dmM0J2Mlk2cUFTSnBjcDBJZmVQbW5jY3hsS2h0ajI2VnBJQ0dNWU9OdTdSWkJ2YmtkODVWTDhLUXlZT1VVcmFZMjBxQzBZcEt1UjdU","upper_bound":"RUZmMjVualdLdWF1bVNsOFp0Rlo3VjVXemh2RkRKSnVMZlBJcnhFZGw1THFQeHpVa0VLUDFrZFd2R0lzREttcXJwak1GS3FwZHNaeGszclVTRUtmSWwwa3VQMU85VjNZeHhRRnpJUzRidWpHVzIxU0w1Mm1yb3dNUGNNY25zR01rN0cyeFd0cW9OZ0FXckpBRVZUVnZpT1ZVNjhJamFuMUZ2bGtHZ1h4Q3A1R2FaV0hVOXNSckN1SE1WUFpsZUtSZ002RGNVSjJCUkRHYm1PaUdiRXZrbnBOaUE2OTVxQzVUbU4=","repeats":1},{"count":448,"lower_bound":"RUhWR3lZV3lOYWlHMjgwRldjQXBMMFJsZWJRSkZjOUtwaTlhQ01xOEtYUEZiY0tTUUVtY1BGWE00dXg0U2RRdUVXdkV2UGJNUVpVUUFFQWExSkJNVDZBalNxR1FjQUY3aUZwT25KYlFLQmRuaXRHaDBXRUlLMWR0R1ZWWk1JYUJFb0toV3VoTnRQVGpTZ2RvMlFqSHdzMExuT3lrWG85MXRpa0pRblVjNHRiV3NhZzB1V0tpQkZDRWpRb0RyYmNxa3l0eVl2VXgxRW03MEV6aUpOVEJVdjJYUDRPbklha1V0VVJRQTFyWGJBckpWcm5zME1TcWhOZVBEWDh1eG5rTk9ZQnBDdktxME1WZ3ltUmR0SldRT01MNlh0SzgyY3lHMXFvd0VBcloxcVpXamx2THE4SEE4azE5cTdXTkJLUzY3YXBVOXRtUzk5TnVDS3dVSWRkb2phSEQ1Z2tFWFVuS2JEdGRKeTNtVw==","upper_bound":"RWJWZ0VXOEVYTURic2c4MjRudFVTcXhveUJmdkppYkUxRnh4MVA4VTk0WlpaaWZPU3lsWksxeE82djZjREx1YVlPMHNTNGx6WUhqV1VtQ2QwTVBuTVU0cTJTSE1QSzBhUmc1emJwVENacUJ2cmVSY1M2R1FPeUo2dmVXMG14QTREQjRVd252dUcxR0hXdUNPVnNxTzkxUEM4T0VUdmZtZlRiMDRzQk5jVjc4ZVNkZFZXSDdmWk1HRVFXNGR1S3F2dG5QUUw=","repeats":1},{"count":456,"lower_bound":"RWx3OG1XVkhpcmFpM3dhNXdua0l0akpadEFBRVhNaExHQXRKSGFxVVdyenpkbUViMVdneVpQNmdXaGZkSDRyaXFDVDdMcHJyMW1hRHZHUHhUN0VWMFIzSXI0MnVzdmJyRUZUQTM=","upper_bound":"RXdNdEtNalBRQzZFYkZ3UjRJaXl5Z0ZNTHpBOExGY285SW5KaDdvUksxZXpsOEZKVGhjZ3Frem9CYzc0c0xHWXZaS0xrVE11bDVzbDl0Nmx6SGxTZk5rMlp3UkxzeXJRNjNPMG5IZFM1OXRhVDhmRHI2Y3VVUnBZMWtsdXEwQ2QwQzRHTkthY0Q2SlJNZmhzMmdnOXpCV3B6bDZsdm44cTFzSThGSXlDNmUyTk1sQlh6ODc3M0tibWtFU09sOEJ4NDVhNnU3cm1DUm5nRGFrbzVoUDNWZUtGNHp3VGFJOWJDTUtQM0g4VUZ4TFJZVEwyakxvNjZvZE1xczlOOHVxWGs5NHhKM09Va0phRmZrbnZCU1lBd3FlM3hWNFplVmtFbWlNUU5vbXlTRG9GZjRjeThFNjZrdGdYa3pqSTgwT3JoM3JDblJlTzF1UTdjSUhqNEtseFFwOGdWRzhZbkZ0bHk5STFsUDY5YnFGejU5eW5mVWlvdEY3dlJrRldzb2Q2a3pWWExzWnhOdlpDUE1tMHBXQ1hZUXdGUThzeXB3bWF2MGtQTkNsdEh5VlpZMVU0aGwwZTlWNURpS0dDWDRUaXQ3ZHZreg==","repeats":1},{"count":464,"lower_bound":"RjYweUhabzZwc2t5N3MxbGI1a0xVTldiMnB3WmR6Q1U1UVZoOWVUc0x2ZGFBb0lnTEs3YWNpdzE0bE5WVzZWZ1J4cVpRWFBvc3E3R0lqWlJJc2psU0xvMW5RUmtBRlVoUjdPaWx0VXR3MTl6UWdLS21vRW5rSW8weEw5T1gxMUhmbmMzZHQ0MURUNkhyeG5EaUlKT08ybUZXY0hlUWxCbGtoUU1saWZ6b1hTS2t1MTNCbzZpcE1wZEM5cnFlWWxPZ2IwNWloY0FLWVZhN3JXQ3dsd3E1T2EzUW90ZVRmd3JKQkNOT1NLV0thV1VBY3lTek9WeTl6WFFiUnpaakZHU0JDdTl0cXgwc1dsT25pVHRDMExwSExWOW5pZnNkdERtRzByUFFPcU96RktCN1ZCZ2JIWGtwR2Z3RnBhakx3S3ptdlpSOGZKMmxlWll6dEtrRHJnMlBFWmVuMkxUUWttQ1d2Q09YVTFMdHRsSUxWNUlNalpyelNhanljSWNFdjQzRmxuR2lrSkZBWmZtdTVueFU3akUxR1g1ZDcyQ1ZzUGRCVnQxNVJDRDk5RVM5VkJIR1BCYXhQRDJSM2VWcXdydFVkNm5LOTRUV2FVbERKb21VemduR3FDYWVDR0hiVXBJNmFm","upper_bound":"Rjl6YzVFTlJyU29ONmZCQVl2NWVYRTdJUHpIYVE3N2NYVEFBUjlOR1JOdTBpNXhDanNGcnRUT3I3cmF4MEZmdkhWemlZSkRId2J0UTNzYnJWWWI1ZHprU0VaMFdLd2R1dVl5UmJOa3dlWWpsQ1RxVWY1OGkyb1VzVXN5OVVvZUxNbEcxYzBqOXdqVjd2UHNPMWFkZVd6V2VJUlo1SEhraTFxUk4xbnRST2VkWFRtWWU1WE1YOHJlZmRQVnZ4c2lHQmpDWUpNZ095bWNTUXFIdXYxT2hjYXZkOEdGNFdxZmxuWDZoYXc4czJ3VmtDZGdHcXpub0drbGJYVUVyR3BOcmw2dXFYb1A3WGgzRTlhNUtuWW9TY3Y5NjhWS2hRamdoMXoxMFVXZlM1eVNXeXhpQUNaRnM3MFNjSkhacG9sNzQ4RXdmd2F1SFQ4NkpKZ1daMGl3YlJOS3pUdUVUbUx5akdwd1hncGczd0hibjNrYW9mdGpKQVFiWm90Y09MUGpROE5saEFlZkZVSHFZWkJISmR4bEp1SnZ3SE9oRWk2eUFhc2szakoxc1NCMkwxZTVOa042dmtoMDRPWXI5d1JhQVlwS2dIRjhCUmo1bktNOGh1WVBDaVNHczRoZWlFdUFNUHNia3JHZ3FZZzlmVUQxTVpaY3puVkZoc0xBb2hDN2UyQVRtbm04cw==","repeats":1},{"count":472,"lower_bound":"RkFYSVdqOTBjckluRTVTcjNYbEsxUWVveWZvZkdOQkxyc2FXMGVBSlVEY2hUaDJ4elFpYnNJazFQelhjdW9ROUdOUnZ3R0lUQURIQlZaaVFiRHBEMHI3bDhCOEdWWUdBZ0N0TVRBemhXa2EwRTc4OVZ4U0VrSUFRek9NdzVNMjI3RklmbW40TnhDUHJkTWZwVjg4dlJieVpzb09XNzBVUFRlaGNyVEJTNll3YzFzbE84MFV4WlkzSTVJMzBTZ1YwYXBSamZuY1g1d0hpeFpPUG55M1lMdXpUclVEYUlkeGtmSmw1Z1NCWm1BNW5WT0VZMzAydTFqeEV1WFd5NGFOa05odWVlOVVMUGs=","upper_bound":"RldyN204R3NDTlNjbTkxOTMzdVhxOEdFeHZHUlZpd3VQeWh3b2FhUXFQTXRiY09vUE5YbUVweE9XWFoySG5ubEVQVjdIampFMUl5d1Q4NHRXcWhyQzcwMm5NQnNTU1BEUkpaZ1FqOE9YZVdQVFI5WGR1b0czZU1zU1BITkxQTzlQQlIzaWJ0Wnl4ZnlLQVUzVnV5UkhPV1FvM0VmUm5SQzVyVWhYZXc1OHgwRTF1czZqZHNGbjNFQ0oyTnI3YUFXMkVFZHM4ajJmbHU3bkI2Z0N0Tko=","repeats":1},{"count":480,"lower_bound":"RlpueVhuZnk4SHRNRnpBZlNUYTR5YTVBY3o2R0dNNzdhYnhwS004VjZUeXNLMnlSakRSQVhiOXhtQXBGdkJHZk1rY2pidTVjVXJyaFhFelpNUTRsM05NUE5mbFFMM3FQeGxjZUtKTW5Fa0h2UjlFRHZ4NnBBZFhrcGpzeHhobmF6MmZFbkZURkJKWnRlQlB5Zll5bGJUNGdzZFE4MDFLQnd4R2h6YlY2U2RWNVp6MFBmaUVHMUpYQUdqeE5BY0Z4b1dWR1FHdHE3UzBKNm1odjdZckp1M2pFN2tHNjFQOU9VMmpPMkhmTFRLcGJZbGJMTjJrck11Qjdpc1RyaW52OU5SUk50bmk4WUZmdVE4R3JvVmQyY0ZXVDBVdnlwUWhlWlNOSnBlaXZpWjRqSko5cnJCaU1sRHVtWlc3TU9LV09mUEI4WGpiSzFwa3gwV3dDMHlpVVpCRzBsSklYcnVWQWtEc0JsU3pHRw==","upper_bound":"RmR0NzlIWEpocUxoRVpIc2NXY1Q5VVNuMHBWbU5tbExZanhHVWw0aUNsd1dJOGQ5T1FPREI0bjdHSGx1M2NJM1ZWd2JTMXk4TmVKSzdSa3d3MUQ0NlNuZnhoQlhRTTFrMTZkSnpNb1A1","repeats":1},{"count":488,"lower_bound":"RmdBMkFsdTg2b2hQRUFFaFhjNTVxSFh3RFJZREQ0ajBJeDkwU1lDWkRUbGREaURKQUVjVFdGQjZqY041WlVYSlk1Njc2SE1HNThqSGFqell0ZUppR3UxOEJFTDNPQVR6VWNvRmRRWWY0cWppVFdYSThkMDJyTHJPSk9BaHVRM2lKZzVEY2xxZUFLYkVpc0VLOEdKbmVqb3Y1WW5KVldUV2dCbk91VUp3d2t1QTQ4T3dhTEdDNGhzeXBWcnR0U05jZ2NxYmYxV2I4NGNtbzc2WXdJNkpSb3VGN1lGNlpZUldScnM1MXJMNjU3eVFXbUU1b3RNV25sYTJpVkQ5T1ZpQmZpMXZJU2Y3ZWpKSjA2YTdBMDA2MzN1dEpjdzc4OGp5T0FQTnY3SFh2VmJjYnZoc1dOYzhadEJrb2tKeWtJR1Vza24zNlJzTUN2ajNkZ0dPNW9aYXJyVFR5elhidzJ5Z0NsZU54Tm5sM3lWcW5UWThIWDNVZ2dt","upper_bound":"RnFicEFLMlJmQTE5U3Njb1FSV0ZzM0xYNVk1UDdlNUpkbTdqTmZoN3dmUUk1UkoxdDZiUUQ1cHp2UXNxODVBV2wxeDJZTGIyckNleThpTFRYOW9RUUdHTmYxMnNpM3FieHdybWJoMDBJVko1Q3NtT2FtQjRrWDhDcFZnWlh2dEV1UldtRDJVN2oxRFNxc04xc001SFF4czhjNDNkZzcwVHZmQmF2VGtkSkx3UFpkMHRDYzQycWNMUHVlZlE4dEdMbk1wWmZXSldOYm52YjVxQmVLUTB5NmRWZlBSSnNnUWNDOFVyQ3Zyb3BzVkhBRjhPcmFxS1k2N25uMWd2Qmo4d1hMcGJkb0FPZmV0TlBxM1c4RmxNam9ucXRsc2RLSjdvSVY2ZzhCZ09oUzlmcDhKWkpVWkFuYWFvWDBHb1poWUZGU3NKRFgxNVFLNXpST3hJdVhjSFQ4YktFRTNVcmtiTVZwbUVrRTU5eWtDbkdaR1JiTVFVRlY1dE0=","repeats":1},{"count":496,"lower_bound":"RnRVSFlTRFVoenI3NVpxdFdQUU1HcU44VjZ5SkI3b29uTTdpMmNLM0ZCeUU2YXRocFpHSGpmSUc1WkpqTWNKUGhSQmZrY3QxSlcxdGVpc1Ewa256S3E2WWh1WVBxYXdNZVZ3SFZPaGhVMXA0V1A0bzFwemJZMUVxR0dBNDJUOWF4ZVpuQkpOTURJR0h3eFBXVUd5cFVoYlplR25seUJVWEVnTm55aFNMd3hTMDNnNDk5RmhvOFJvWE5NeGZKWkZHUmc0bGNrNG9MQXdud01FelpOdTluY0pzSllTZVd6S0RITXdOYVQzaVdyN1dOTlhZTlQwb2V3aUdNY1BnVUFmclBoaG1WdU9lQnFYeTZodWRVcmhrSDhpRGVLNFhGSmFxM0QybmF0R3htSlZvRg==","upper_bound":"RzA5dWNlNXRhRVJVWWlGQkxDcG1aVW9LZ01VSmROTktyS3ZvVG96djU4bERVTGtKMU1BeXhQbjhXMmVXY3B0NA==","repeats":1},{"count":504,"lower_bound":"RzRlRVB3NVpMUjJEVkxxTEpKZ0NOY3A2UklxTlF6RDVtNzU4QzQ4SDBXOWRPMjV5RmJsa3I3V2E0OWdoM3NPUnpLaWpZQzBnR3lIcGpmVE1ZSEdZR2VPcWxxdTlJRkJ1UmxQMEY2aXdQSWlMUjVHbUdpVERENDNmb3hFbmVSMlZaVTJLbDJmbWVyMXF0aDEwMThtU0oxZzZJS1k0YWp3MVV3azFOTXZKd1gyZExHVmNpc0g5RmNSNWJyTmFwM05rb1pKVTNnU29XZlBnaTBHcg==","upper_bound":"R0NGY2V4b3dBTFdDSkMwbkFVVHhZaXd1Z3FuYTlHSmttQUhMWnRBaXpwV3NMY3Y4eTBDU3l6YXJVNTdMSjFoWkFUN3pPOWo0dUs5dERVTldkYWVSWDVpUjR0SUN5QTJFTkdKMzJOOWRpeHdlY0djbjVzcHpzS2JodVFjZGFWNnNsejN1cUllTFlaVGZmVkI4T2lnZXRYWjdZNFI3V3NtYk1raHVKUVR6dzRVdk5BSFZmR0E1RjJmd0c2Nmw3akVyR1FaMkhBaWw4WGdPNWFaTWF6Zmd2MEJPTkNpN1ZweVRwNGVRcnQ5amg0OVlFQWFzMWFTRWpYNU5Ya2ZX","repeats":1},{"count":512,"lower_bound":"R0NYeTlyaEt3d1pnaUdVUzBoTUZTNFMyMWVyWkc4N3hVaXdCSGlUYjkwMGZlamZSd2lwWW15OWFFWWloZmJGbDFQQnA0U1pOQjVQdEw0SHRycjBlTEpkWXFMQ0JFM2Q=","upper_bound":"R0xNYzlIT2J1MmZqWnNMSGY1WDFNVGtZUTZraDRhMmxKZk5zNWtTSkVEOHhyM2xvRGxNcFFjUFRjYlF5Q0l5YjdFNXpoaFUybFdERkJBS1Fud2xpQ1J1dUs0T3ZHbmFINzIzY0xDVUY5WHlYU2gxbFdhMWd6eGdETTdmSVh1UWJNSmxDbFZ4T2gzMDVuT09YeTJQdzAwSml3TlEwbW1CenlHcjg3QVZpUTZyeGJsUlA1eGhrRFQzNDl1QnBhM1hHazBQTWJ6bHpYZE1vUWNqcW56cmxBTDU1MHJ3UUQyMVRmeGtxUXVNVXk4R284OTdObFpPS0FndWhoMUg3VUlWNTltZ21LdFFTY214UUdYYkMwcmlmTklCWVlLSjh6OHJrS3dV","repeats":1},{"count":520,"lower_bound":"R09tbEVHRmJmUll2UDdMUDBlUzRPcE12RTBlSjQ3eHVHRnpoanUyVHN1MzJZUjdVeHhRRHdvMzRxTHNVZFZBMHE5SjBpdjVVR01BZVZ5ZkZyb2lneVl3V3UzZjZVU1VxWVJzQkE2M1FLUk0wRXBaanlBWElXWnpSQndQZTdEM3NIYm9MZU1HTVI0bDZJRnZ0MmRTb0VST2FFUjRNZ1VXYmQ1bWFVN0FpVDZUd2g4aXhrODdPSnRNN3dnRWxlUEJsOTU0SmVzTWtXWTBwc29nVlRmSnlkQWJSSm1PU3JFMlFESE0yNXdtUFQyRmR0NUF6eUZndmw=","upper_bound":"R2dWdjQwdm1jNWNuMVRVTUUxRFFhUVBZdWFXUUdpTFM1UnN4U1NkSFVJNVhRWDh6VmpsbnZjZnBYSUg5eVhLYmM3UzlZUmt3WENNU1R3WmpFRGNualdxTm93YUtCcDBjS2hQOTJWZEphYjNjbkZDRnA3cnpSQVBGT3BZaHU2M2NpNG1QVEdjQ3ZHdUlZbExPQjFEZHU3T1UwdFZpMDhpamI3VWRDSGtLVVVHYVNvWHZwc0lHNFcycGlkSGk5UkJ4dk5Pak0xdjdiVDZ1RXpZMGtKYkcwRHNrUzdHOXg4Mk1TVHRHWG9yaUxIaGJHZUduWUtNSDNEWTJxclZxQ2E1U3RUUW1uVTNPdWNJcXlCTkVGSUNxWmFNWmFVNWc0cEVqZEFEM1BGR1BaeGx3WnZWeEgwVTFjVW9BcUhDakRnRmlreDJKbmxZZE43cmVDTjVKS3dGTXJuR2Jwb3JhTW5RSGloQnhxR1BEUHRPUjVUaG5VOG9FRVpyWkV1bU9sYnMxaDdDejFWNWpvSzhKUWV3YUVRUmR1WDBhTHQ2UmVjZkZPRXEwMWV0dEVyMkU2Rmc4Z1E3TmNDVVVDTVJBU1VRdGxGeUtxR1h5TW10Uzg3OTFJbGlhSzlkMlZUV0sxQXpuTUhNWkVDVUdvbTNRMk9ubG1GY3VSdWExM1laMjJtRExwZEJY","repeats":1},{"count":528,"lower_bound":"R25rQmx0UXpid2tOTmpmeHpVWFhUUnhXUklLNGo1aHZNYUE1Rm1sa3NOTmJGcE0wRWJQenBaNU1BdXozWWZLbzJkRUNtWWxpZmkzOTg4UjU4QUd2dTVqYm1ZVEpZZExqNGNldjFqT1dSYjRrUmFpVnZzbnhjbWR4dVl0OGlOeHgxR1JZU2lhdGFOSld3dDV0MFRjUDBCdEtNZndTZk5QT3VFaTNJbXFMQTdIY0J4VEtkMUZQZHN3Nm5HYzBUajhVNWl4OXNvaEVMejVMSnk1T2pWeFBmTXp2ZWZoMW12SjNGeGMxR3l0Rnp0bklBUjFFN3hOOU9ia3RsUVAzMXdYRm1JaWU1TER5RFJKMnhzZ1h6RWFjeTNYUGsxUUo=","upper_bound":"R3V0clBteG1FZFJ5N3QzdlJXWlNtMk1ySXlGOGFucDF6V3BOZHpuRVlOVlA2QlJ5NkpaMDM1YjRiQXFRdnltbmQ3RGZNM3ROSkJNcDJlakhKbkJCM2VyZGRrRjVEWHhsV1Q2a1hxaG9FSHRscUdDeGpHUVVyOVlpbEVKYWNwVlpUMGZVMjZUNkxMa21YNURFNFNDd0lsZkh4NFVzcXBNR2dUeVl5QzhBWU5hY1BJSzhGSEI2VkFlOTA0TU9BQUhrWEFaNGhlUnBGV0RvVjgySGFrWk02Z2NjN21JaTExbFFHTkZueXlLY2M=","repeats":1},{"count":536,"lower_bound":"SDNnV3ZJMEFYZA==","upper_bound":"SEJoblZWRHNzU0s3UmVHaktUWmRHa3lCR3ltTDFuSWw0c2U5ZGh1ZzFwVmFESmp2WVBIaE5UYlVESHBRbUdwdFBnNm5WTGxOVjJOZkx1YlRDcTlnb2pCV1k4RnpGYm9pelN1VnBmSFBUUmthMkdUOFB0NjcwdGFMOEdlV2I0akZWVHpxMDVPVWlEU25oOXhWMWhPYkk4YVpHS2FKNUxFWHpGTHgwSlh4U2tuUEliR205TU15YTNUMjRCdnp4ZUc4aVV0cXhweFVKM011WnRwaDJKTXB2dThMMGVOTnRwYmpyeTVGeGVyM2JBV0NFODVXNHJHZktUTE93UkdQWnRsWGlMTWFCYnNqalNjVlRwOU83NGhxTWNtMW9NNzJHVFRPVUhlN3lvVTNubkJkb1hnTzg5eUZwYTF0YzVvYUtaaE5SYzBWdG9NbnFTMEkybzlsOXlwN2RNMnhUZzN6UXljTXpzaWRPbW9rZDJ5MTdPSUIzRVRkdUhjdXUwMEo1RmNSZnhZTE5HNTd4ZzhXNU9EWUI1aERBVjUwOUpHNmZPem90TGtGeVk1UHpGblVMeDhiMGI2NFM3YVhzUUNhWXFDUGl3dWZPUDE2dVpndXFkUlN1QjJnZHdZbk9ZQWdVczVWcHVsdklGS2VmcXJSOERwZjd3NTROeQ==","repeats":1},{"count":544,"lower_bound":"SFJsNENFY3NwdmYzdmZSRlJjQjBCUUhyVkhqREFIYmc4ZXJ2M3BvczdhcFE5SmlXblBhSXNwbEVXendPNFNDQjQzQVNSQ2RVVGhlaEo4U21CSUVnN1pKMnlIektpUXUyN2NPN2N0elFMOEo0dmlpeHZ6ZXNYUVlobEMwc003U0VESFpqVGp0T2dRQlVYaHlCNFdUcDRvVW43QmdTaUZTdUlqSG5vZUNSeUlnazhtRUNuNHRDT1p4TlRKVlhuZG9kOHN2RGliM2Z6WW9FNVdpemY4UXF4TDdNYjZkanhwRjFOTG8yekZ0RkpzOFBQUkd6ZWZtYUgycDc4WEQ0cFU3bFp0eWlENXRoTmZueW05SHc3QUtEdzJQNGdqOTlhVmY1aWxWUDJTbm5WOHVqTmRwTEtUSW14VDk5MGRLY0pUdk1tMFZWbjliOG50QzE3VEtmNGl0ZE14S2pLTW9EWmJBaHJWaFN5MDhwNnlhVlF2SDlXOHVCTW1GOUFkSzFaRUpaUXdQZWQ3UzlHb1NqOHFoZzhPRm9JaWl3Mw==","upper_bound":"SFRWSlFFN3VwdUFGYnVpS0ZPQjZiOEF3Q1FDaTFRM1o0UVYzcFJLY0hNcTVER3RBS2tlS2JJZEF0b2NzNGg5cmV4dVh3eFhPV09xdDFKVUtXbGdyQlhUVTNPRzlaTXNRQ3NleG1kd1IxRHhSTXpJYkJxeTl6TWhJU3NjR0lpZFhVam84bzRlZW5WVWpLQlRNcnFkZ2ZsQ2RoNEcybU5pQVZvSmRxOEJwYkxtS1luZUQyVWc4dWF5TUNQNW1hUVZmQUxvY0gyRkJoOU9udU9vdjNIelRjWVUzaFFxc09mVjYzM211VW9xc3JYVWV3dGlFbTJFdU5mUFI4cTZMWWI5SXEwSzVIU3JHTW5lQzBwa2VRcmI2S2ZNUFNjS2owVVhWZXA0NVR4RXhCQng2R2hxaGtVQXBraTJqTlJGN1B5ZGNBejViZGpwUW1qeTJIU3dhYzA3YWlZUk1JYXVXRHB5RFpzNTZvQkw2eVJEQTRvWkZTUw==","repeats":1},{"count":552,"lower_bound":"SFhQSUdZemNtZE9vcHRONUtqbllIeDJrdFdwZ0d6YnR6akxhYjU0SzVMeWlmb3FZME04TnJpSzZ6M1M5b1dIQjlYcGI2cExWeUM5T2t5QQ==","upper_bound":"SGhOc3NkWDNmOWhKdTZmTlBlU0phbVJGc2pieUNjNmMxVWUzTTJrcHAzQW1VUjJHV1J1aElTZ3lTTGFjNUJmQWs4R2ZpeVhzeTdBeU0yMG8zSUxDWGVIdklTWE1GQ2NJcEtFY0Fnc2xwam5FM1NWV1laUFg0V1pVZDFYbUVEak9nTVhUVHpMWlZuNGlsb2JyMmdWMTBBNm1Da0ZXenpwUDVTYzFxbVNrSWQ4eGhhb3pzM09BSXpFT09VZTQycW1MVXBCNlpjQkkxc1NkdGx4QXFJQkZFdXJEak1CZ0RySmlFV3V0VnVhU2VhMUNWc1FKYUVpa2EzMnREQjdKV3hNRHp5bmJoT1lIQ2lnOFZObjNJeEJsaTI0aEpvcXg0U1E0dkZzZzZnZHhUazBKQjBTRXFUN1dtTXpranZ6SGJ2TVFzM1Fwc09GbkliWlpLang2ckhUSFUxTW1yeHBvYjRZS0JyOGptMUNneXRtc0FlWmd0YlpVOWNnRzg4b0l5UTQ0WjFtRVhIcEhWbWFMVWZ3R3lnbGNNOEpEWWlOcnJhd0l2VDltOE9mTERMdWNHV3ZqeUhGbXpQOWR2SWJLMGRhdFNGbzlRYU9nczZzRHpkVGQzQWxXbkpaZGIyV1JYOFk=","repeats":1},{"count":560,"lower_bound":"SGhuUFBkMlc0d3BMTGtiMkF3djNLd3RKQnBDV3VjbWp6YTlWUXY5YjhXTVRnT1RrRXJXa2tER1lEdGdtZUR2ejVwTVY5SGpaa3hJbTJuNU9ERm1hTVpCb2ZweTJJQ3J0c1p5eThWWlFxYlVnMENEQ05zaFpxSW1WTGc4MUFiTGh2cG8wMk40VTBLTG1SakdWcjFuWmNadGUzejJRYkxLazVFS1lMNDlGTExOVElSVTJyZDJyMlZPZmdlQmkwd0c0eWJubWVlcFA0dFFmalM0Vk81OEVtNmVRanhDMWNYY3NFbm9KOThnbGtncGVBYTUwcm9CSmhhYmF5YlBublJta01icktTeVhHMGtBNlJvdU5qV0NhREhpUUpvMmZUdWxZRWF3b2FHUWpscGNTRA==","upper_bound":"SG93NGYzZ2cyY0g2SXNIQ0YzSXlORlk0M3FzNXNSODFxN3VJRUJNNXRHbVBUV25URTFYQ2ZxWFZHT0NxM2FZS0NZaDlCa2NYWGZRU2htaXl3TXJjcHc2M2FmZjI5NWtGWE5QTlNQSDkwSjhpc1d6cnpGSkxhbXhma01oNGpKbWpMMkFNN1B2RDc5TUhvMWNNNVoyQ0lGcVY3Vkpnb1JicGsxdTA0QW5mSUk4ajBNc0x6cjdhVlZHZFMxVkVrYnIyT0t1MFJNM09EYWxydFNBcGJEb3ZvdloyS3o4NVpwRjFJZWJaYWpoTEFaNFgxNlNxWFJ0TjVUODBmSHFlbnNIYVFlOVVB","repeats":1},{"count":568,"lower_bound":"SHdBVDd2dUxPdGJoM1NGN2g2eWkwalRqdjR3MW5LaGVYRmRLc2VORGcyUFE5MlVMc3VJRHBQZlgzV0RjREJ1VmtMNG9KcHhaMGhabUlnblZQMlV0Q2k4dXBVUHd5R1czYVNDaWt4bzBTU2I5N0lPRnRoU3VJUGZuWEdKU1VWZ2pIc0ZzRlpIZXdXWFVRNHNVSkdCbGl3TTJ4dDdVYXRiTVZxOUdoZXhHUHE5ZmgzZUFSNE5pRmttcExKdXA0NHJFd0UybkU0cjAycnJ6ajM4enl2MkI0M0VPMzRCTm9RcEVBVnN0ZFIxbjVobU9wVUhGVTA3ajB5cWVIWGhlT0NsQmJvUHNlQ1g0YjVQVjJNMGZ3dmVvR3FyY2dSanpOektwc2ZZT1ZLNFFwRGNwaENoN0dIMEg3RlZjMnNqSEwzdlhBaloyRG1zZzNHUnJyb3RTQUx5djZ1NlUzbmpud3dkRHJZWUR3b3lIb2FQdXN2ckJCS0ZoU1Zn","upper_bound":"STQxZm9PZ1dhY2RjTUlZbjVxVHpPRVNud1BpaHlmbXU4UGpuNFU0MW1JR0s4VktVemFndlRxblhJVXFzT3c1SUtPT2R3Y0pjMGxDWmxlUUFBSGl1RmtjVlpvbjRMMHNEVWh4V1ZxaWVzV041cGlqeGgxUDhNcjlVZ0ZDN291ZWFiRnRIRHNYdU9hcVlRZUpxVk1HRk4ycFBJdXVic1EwQndXQllJcGV3STQxWFdUT3dmZk1xWG9OcllSbXZCMjYySThNaHo2MjVvelNvcTRUTkQ3RUdKN0pVUEd2a2gydTVoM0lwTUdaY0lZVW9GZVR0bUs4NmRzaWpobjBlRWlpdXJRSWFzcWdQRUZpc1A1OHg4TEk1ZUl6eW9xb1VrU04xUDBz","repeats":1},{"count":576,"lower_bound":"STVYVjlwNHJYa1RRaTJyWWxPN2pWSXltVnByTDZrekJoa2Vod2RXZU5RRXhaU2ZvUTNkSkZJenhidlAzR0NLdVhTR0U=","upper_bound":"SURMbDhHbm1iRktpMFhDN3NOcFZmTGdFWTNQYktwYmFTNTNHYVFXdkdLVlpncGdmZE91TERqQmZUcnY4U1dIeGVaUUliM3cxWGR4S1R5ZGdiM2hDc0JKNlU0cHNNdmdnb2k4SFgydmNMZnRmWTVlV2lJVnJKcENZMmFodGpSQkNQR2hTcGdQZk1OQkhNcloxVHJxQVUzZ3A0Z040WUxSVk16VmJjMnhHQm5TaVpacG1MUk4xRkNHdTBYVnVQWFpsS3paTnQyMjNjQTN5S1VzU3QwU1JXQlJzZlBYZ3UxOG9MVXZUNGtKbkRWc1hKd0x6aUw2bHd4QVlVZQ==","repeats":1},{"count":584,"lower_bound":"SUVWeTk2WUlIWlJvWlprY2pYS2ZsVWlQdnhwNU5wQlRBOWphOWZ6U0ZMa0VPelpYTEFmMnY0WFBMVVVGUUNiMXlsbFFlT0M5QXY4VGJX","upper_bound":"SUlVZFZoNWo0WEU3OUlNSjB4d1RZSmdzSzY3MXZFdnhXTVF6aWVkdUFMSHpBdDQ3VThUVk96RkVYWlp6dTlYTjlPcXh4QUVibWI2MGs2Nm5pcERzOE44TjVIdXBNVm5GMnludlRkRkh1WkF3VGs5REZxbkM5NDNVNXR3c1NWbFBMYkg1YmhJZmRpNlRGZGNPc010YWExR1ljTkRDOFZva0RrMk96VDZqSGFNRnVFTWM2Zk5oYmtDeUhyQURUeUU0VTBsWXJTWURXemRzU3IyQklaSW1BUmlveWNKM1RjZTBEaXN3ajEwQ2ZrbXNTTVlzUXJsS2JzSndJVGR3VTlHTDlCZTFkZDA1V3dpZUk1NDdvZW94djBkVjZRMm40MnA3WEc0VklUVElXRTNRZUNYdzZmbmxDc2J6MGtCMFgzQWhhMU41cElRTlJvblphZ3RQT3NzcGUwbkNLM0pGdXFxWlpSWE1tTklxRnlmMmFDZFcyNTZDV2xPc0VITTBEZkVBcWpYVXJFSXg4S3llaG11Z2xScnpIdmlXWXFaU1RNTHVpMkZtcTYwWTJaUk5MWUxUQ0lVRlpRR2xsbVVYQ3kweUtOMjhINUFHS29Wa3ZUb0RodzYxTXJpZXU0NE5RVlhwMWhLVlIwY04wYTF1Z2V1bVcweWZsVFUxeUJ5QXQyeWhzeDVrWGx5V3JJNVI4bGdNSGk5alZLYW9MNEIxUlg=","repeats":1},{"count":592,"lower_bound":"SU1ZVHA4ZTk0M2lCdUJmbjI3RnZ4VVRMT3dJVFJaYUZmYVpYU2R1UDRodkxONjRtMzgyU0tsdzVHN3BXOTJ6QUw3THZ2MW1ERnMyS2Q5S3pDR3B2M2ZHQ0lXYXpER2ZMM3ZVcXdlRVNtYVlkNlRjRFp1VkJiM2VhclA1VUtFY2VNWlZQVW44N0dXaUtIOHBHU3RYY0k5bVBEMVFEMkZIeldJRUFtQkxlVUxMNnhmb0tnYXVXV3o1Z2w5czJ5THNxUnA5TE1HdlhVYzZsczVyRlNNTDBjWmV4M3hEbUc0eGVFM042NXBIZzNhNXozZ1lkZ0ZuS2U4bUZLS21uQ2JNTjdOaTh5WVJseFVYYmxaSGRsdlBqZ2lqY05rUUhWMnNWNDQ0SE5ZSk5QYk5xekV2M2RtNjdubkZFeEJ2SUtnRHE3ZEFnbkRhb0t1bTZNek1yVkZUNVhzOTNISmJlYTY3M0cxSTFMYXlMcUc=","upper_bound":"SVZScjVTU0cwR0FNZTFuWkpkZHBUUE9MS3REcDMzMWJxYlVWZWU5RXA4SjJPWE8wSnhiT2lzalNMaTZkZFlyakRaMDJlamVQMklNUVJRNThmY3RNR1NqUVNscXB0amExMUxnWm84R1FUVXZh","repeats":1},{"count":600,"lower_bound":"SWhmSTNhZGY3c0pCdVo3OUQzejNnZXpYSno2THVkdnhCUHlpVU8xZnRvMEphVkU1aWhIS1E2RGtVVm9HZTlZamlQQ2ZPN3FUa21nNjFMUmpqRTFOUllPQ0xHbEM5Z2Y1WXdwVmV2Y2pIUXUzT09tWDRPUEJ5RHBqdFRvMWZiSWljVkVSTjg1Ukc3OGlVU3VI","upper_bound":"SXNzWWd3STg2MnVPdHZ2UkFnQWZMTEZDWFJOanhUTWJNcGl3bnJ0NDhiOWRqZklZR2VuN0tZUjB4QmhiWW5ud3FMRG1jdTVhV3ZrQg==","repeats":1},{"count":608,"lower_bound":"SXRDY09sUVN2RVNMZGxEc1lMSlB6S1JlM0NoalYzWGhuWmsyQzRrMGYyM1cxbEk5T2s1c3lMTERqUTYyZDlGNGk1UzhVTHJEMHY5aTVMb28zdjFaMWdhM2hTZ1ptempyaDJhODh0a3BSTklrWXNKbFRMYnZaUTltWXdoUzI2aDllb3RDQm1SZ2VQaUd4UFlHU1pEaHMzSXV0ck5mM0hWYTRuSEhhRnNnWHcwbFFGMFZraTk0RUNOdXFCOXZCUURxYTdHcEd6d1B1Tm02eTN5TVRBRVU4ZmdzN0FCVm9MTlpwRE9PeEVZck1yUEpPWGJzNUpMc3lhUlVVclZHMzdXZ3VxakNzY2ZBRDJMVzZMYmt3OWVDZHU4V1RwbnJaaXlFUk04VW9SSlY2V1V2ZVlqZkxtaWU=","upper_bound":"SkI5U2hTYmhYTmk1UWpZS0lnWXcxSXVCQWpxSUpXM3RldzVpOUJ0aTl1bm1xSXh3WkRvZVoxSEpNNkI=","repeats":1},{"count":616,"lower_bound":"SkQ0WFkybmRKa1A5UHZZSjNpUDYwakdmRnR4bGZ4YXZ5MnV4eGVkMGFWWmpzNkEzR0MweDJndjZsT1pWR1RWUTR2bmQ4UndMbDNmT3ZhajNiODIxTnBkY0RZNko5YjZDM1lEeGI0N3NQY2dVcXhVeVNNUlQ4OEdzd2NMSVpqblI3aU1BWGNkdEJPUW5TbFNwR0I3dXN6RVlrVHhHdGNTV3dMeURqZzIwbFFsbFRISnlsWnBZcEpkbTE1MFNIZGVqWWM3aHVvR3NoVTFIWGdyMjR1RzVxbnZBMVF3NHNsbU9YUG0weHZnMGdsU2t4eHhIU2tkMUY3cGNnSXNjVDM3dnIxOHBrVVVWaTh4Y01Bbkt2Z3QxTXBEOHhheW9rM1NBV1Z0TXRlcmF4ag==","upper_bound":"SlRQcEJKdW1kTHdRQkFQWW5JeFVhTDhDQmVPRFpzM09y","repeats":1},{"count":624,"lower_bound":"SlRkcUs3WHhjYWc1T3liMVBxTXloZUFnR3RZcTF5SXNsYUlBaVpPUkpsQVh4UWNXSlVQTFZYWFMzTW1Lc2Nxa20xYVEyOEFTZ3N0d3ZsaWJKYk5PODkzN0t3Ylc1V016WmFKMEQ0V1VDQVU2TzFrVzUwNHIxRjd2Vms5QjU0VXlHcmFGNXN5ZnhRREN2cHNsOTNiWmM1ckFZVDhXOE9CZk1KOWx5YkxEbkJQSFhwbGY4UTdrVUUyYVVINWdxdjk3VEk0Rnp3SXU3RkdhNHAwMm1BTmVlQQ==","upper_bound":"Smg5UHpIaHRrUFRmQ2IzUENnaDVzTmo2SE9EeHBwaTJSU01GSThZbzU1UUdDWkhsYVBrdHhmbDUyMWtPRktxUjd4NjFoNFVGOUwxZGVxQzM4T1FqME5sUnF1cVJJSWMzWUFRVVh6V3ZZU2pyTTM5SHZPQ2Z3OXlNMUtieFlQZ21jeG42NmpHYjRFZGpRSG05aEF2MjZUbnVHdW4=","repeats":1},{"count":632,"lower_bound":"Smh0YmVITFVhVWd6U2lkbERwSUpoTXg3bFBEV2FMV0JPMnZhRXFBWmdaUEx0SUdoVndpZVp3cm1RNUZGSXlBWUdUcVY3dnZoY0N2SFRocUo4bVBEQkNnYnBVT29nS0NvS1R4MjR0ZjlIaWtJTDVtZWZWSGdyUUZLVGVmQ2o3ZVRsWXo1RVY5Vm4yTGJBNlJSMGFrSWNaSHFhR29SOWlHQk8xYk1aSmdqZWZDbzg3MlVrWXZKMW1JVWVOZ3g3VG9SY0RTa1cyMFl3cGZGUVRDTHVCb1RaV2NzZVo2MlRvVmtUenR0bVlRZ084OW11dG44a3kydVdobw==","upper_bound":"SzVhUTd0SzVlMWw4ZmtNOUdEUHdMcHhWaWxxSGNFR29hUHhsSzBEZ0dsSGZHWGFjVjNzeVhDWDJrdzFyQUxTYkZhYnJzYkpmWXc5S2VWajJ1VTVnUnBBM0Z5enRRWWV5QVZxdDJ6Z01pTFVHTHpHa2k1M2tvOURSRmFod2ZCeDlUeTgxZG5HZFNTTEhDNURrNmZ2Tm1sOVprZlh6T1Rsa041cEQ2VWRkcTdmejVnY3kzZ0M3d2ExMkt3VzRhTzU0Umk3alJtZTNVaHpiU29udU9aN2xWODZMQXhKZFNIZHZ6cVl0bGxHRVJldFRBTVhrdzJ4dzNzUjQ1d0U0bEY5ZGdYeXdZQVNobmlkU1Fpb0NUQ3RMdnV4R1RGeWJKdndtT0lPOTdUMWJEeUxPRWxWNncxYlA1SktLd1RMalpRRlNKN3FaUXJpVzB4RDF2b0w2dVRuc1FxbQ==","repeats":1},{"count":640,"lower_bound":"SzVhZFJTeHJlcnZvR25XbTRRendRMlY4UUREMU9lc0NHZ0t5MVBrV3NRbmVqMVA2alR5ZU9vVm9pa2RObHpnc3hyZ25qd0NQYllyTk5rcFFqMlo0RUxGU2MxRVJKNVRTVHJEVDNsbXlkOGQ5dVJNeVFQNjZjd0FQV2pyNGlxVmNMbHdHRVRjTE5ROTZNQWQ5b1BO","upper_bound":"S0hUM1dEeElqRmJkM2QweTVoTnZLVTJDQUZwcml4bjl2NkNYaXhEcEh2MnNyM1B6cTFZSVY=","repeats":1},{"count":648,"lower_bound":"S0p2NWhmZXhyRWhQaDdrT0dEYXBscWVIMFJwRk5UdFBmU2R3MUdMelRLd2pBM3BockY0eFB5bnQ2aTFiV0MzSHRTb1FyU3pIWmdLMHNNQ0JwMEVXb2RCU2M1OGZ3YjlhalpOaWVpeGlsUnhJZzE=","upper_bound":"S1k2ZGRpaTZGcEtiWTk0ZDAzQ0VRWVhHWHZYdEdZOEVRamFMNzU4RGRjT1o2cWhWNWRMbVJEbmx3NFJlbmFyTmwxdnYyUk91Y1hSRXVENzdhY09pOVp1U0R5U0RIUWdlM1Z4dllVVlZTbWFpSERLS1oxT3Q3aTB5cWpyVkFEUkdBOGtpNWp2MGluaUNNOHRESklzMzNmMzBmMm5RdTNVSm40dUxKVkVwVHVUaUtqUk83N3dnYjk2MlFjQWFlSkd2dHFJd1lUZ2hyeGdwcjhEUTRZdzMxd21wd2x4ellPbVFSOTU3MllYSG84QlRCN1dHaWtmZVFua2Z4UzNJUXhHTmQxMW00VGMxZTIyelpmd0hIbjFDcFBQYTlKa2NwaUJVcnZuOXRUaWpXNEozRWpnT0MwNlBBY3RmWE9GOTRMTDhQVGh4MXZzOW0yYU9QbVFFbTFKWGgyOXR4UHVRaXpVVE1vWnJZelNaSVBlN25ISDlVakt0UUU3TWlpMzBZZ1NjY215Q3BEakJmT1psYjZlYTBHV1h2anZabG1IU1d2Q1VIc1lvOXJXNlJGSjhENVdXOERUOVhoR2o2MFVrY1daTk5UaG9WYk1ST3hrdjNvRzhKR1Ez","repeats":1},{"count":656,"lower_bound":"S2RCeTQ2UjFsWVFLU0VqUFIwTW14bEx3Q21JdkluMlYxU3BhTXh0end3VmhjU0ZyTEQzeHFUQkhKOUNZZklNNG9hdFFmV0syaFE5RjBFNHVVTlVSaEc0UGhWNDFvZDh2T1NiTEpacUQ4bDJxVm9kZnpxZVN0Q1Eya2V4THlGUjBlNEo3MTBIT1B0SGtLVTNLY09BUXdhZXJRUDFRWDRDT0t5eHpzbjQ1VkpFaVJYN0RYcUIyeHF6eEJGOVVJZEp3UnpiSFQ4M3JwVVlsOXhwaTE4Qm03dk9COHZCRFNvbWpuR1lqTlJqZFdoenA2RTAwSGlyQmk2NDQ1dk5hYWFnb1YxWm1TcU1aSHBvdlRZcGpVY203eGoyRHhtTTBXUEdPbnQ0TnhBek1BVWRCWXRadzNWOUdPOXNUZE82empmR0llWWoyS21XdFJBVk5YcWtC","upper_bound":"S3B4YWRLVUl2OEp5MUlOaHRFQUJpZ21PcWdINmhBTms2azNzZTR2ekJUd29ZS3RPWmNaQjVJWg==","repeats":1},{"count":664,"lower_bound":"S3NNdFp0UFBiWmhOTno4ODY2NmdwN1lSVjNvZHJEUVNMdVFnMFBtazhKTzdkSldoQm1yaVB5Q3lzeWltTWIxSzBCNEl4Tm96YjFVckQwT2QwMjQwOGM2Mk5wSVJoN2JFell0WVBsRjJHYTZ1ZGRwMllqZmVBRmZERVhDaEdxVm9Vb1hUM0pLWVZDZjRrUnlaVGV0bENwT0FKbmFOazN1a1UwYXlRQlE2VWNFSGNnaVBMRUc2bUEzSjBsWHBsQUoxNWJYRnlIemoweHlsS3JHUmQ4Tm5vcUs0MzNtYXVMYVNJRUFZRDcwTlFkODh3SGlEUXBDRFg5RVh6M2M3c3U3N1hxdU5VVFhBUXJldVFZNTBPTEdROTZJM0gwazRySDVSUk44ZVAwNnlpZXROQUExWHNUZDU0RUpoVUt3b3RkMlFVb0lxUXp1U2RIaUhPUVlud3M3N1JWekhp","upper_bound":"TENYeG9TdVJyQ3pjZGVKT25BbE1uV1JCTERYVzJsRDBsTjRwSUlBS25YS2tvTm5XdGs3bHBGQ2Q3WlJsZThsQnlIN0lGT1VoWlFrUDJjQUFGZVRhVlpCNFZPNk1TekRwaVJ4ejJibTZDbm5oSzZSMEtSMmlHREExRkRwZnJOTkJlMTNYMGZWZm9zcnlNZk04eVk2aHN6M3ZIdEs1U2dWbVhNVnFHc0Q3YWhCMW5zMUtsTEtUZGZWYmlydDZkMHJ0cHZMRmdpcGMxdkpaR3BPajhteGlaWE5DMGlHdDA1bnhxV0ZEZlVYTHpWdmdMMURncXVocTljQzM3Ym5EUXdwYUx0aDAzUnU1eUVlRkxyVXRXTXpxSG1OaG1zeXh2NURaVWoyb0pHQ0RqbkpleDVtYUJ6VDl3MnhXU1pDUVpVWUtmQVR4V1Q5ckFnUENlRGtLT0xlYVhpUHEwSnZPbUZQUUZUdTY4S1o2a0xBaUE5dkx4VldZVjd5bTJjZ1lzUEJURUI2M3kwUEgydktkVGZoTzlyQWNOYUdmbEJHeUxmbXlodVNEenR1Rno=","repeats":1},{"count":672,"lower_bound":"TERYUlUzdWtoa3FSQnFqT2VyZkZOMWNVWG0yVUFvZVFqb0JpcVUzR2x4eXI4Mll1Z3NuWVF5dXpod2NScUpjdVZ5dTR0WFFiSEJBVUNlWVpHQzI5eVJyUE5XYXlIdVlEc3lla3p4cU5ndkIyTnhHVGxQb2xVQ1R0U09jc0pEU3FxYXhHTjZIOW5NTUMyNkRtWW9FYUdVSGxEaHBLcXFTUkltSW9jdTVnN2tqZkdCZjMxTUZnY3pHYTZDSXd5NjNpT2QyS0V0VnMzQUxnUmJlQXJPcm5lUWNUdjg2WHhPaA==","upper_bound":"TE9MdWxhbXUzTWRGV1FVRHNpbWRFUXQ1Z1lEM1BTTUszOHU4WWtxY3gwclR4WDliSHFRamZ2R0NxcHJWcjluWURWY0x3Qmd2UXh5OHlrSDhzMVFNNkFETEozT2lISk1IQWlNTWpXZ2hFTnp5SnpjYVM5cXFjRjB3YjAwU0t1U3RZemdZRlVzMmV0bkJpMldpWUI3RURORW5lY3U0bTY2MVlDR1ZWYWk3algzc3dmbHE5aUN4WUloNU5xMEFJQkFVVFZiNFZuUHllQnRwOHZKZXIwMGxlTUdzSXd4N3IwNGh2RnBNSnNkWEthQzRxQTMwUHpCRmVWRGNhbFpoSW1TT3pKSTVJWGVjZkYwakQxTXAwT3l3bmNVcm1TbXcwSjJIRXY2cXFxU01aNjhPRUVvbTBLa2Z6VVZZUUtUY1pZTGFvem9WN0w=","repeats":1},{"count":680,"lower_bound":"TFR4Y1poS0EwaDR5V2ZzUzQ1b1IzZWJYS09YR2tITmUyN0R1aGRZOWNtUmxNbFJOMFg4ZkJUYm04anBRVnZjS1pYbnVVdWJucDFwWWRCcmdxSlVhczhLMUw4ZHF0Y3lJdE11a1JOSWloNnRtd0hJU2FCS0I4Yzc4T1Q3dUJWTnpqWGtFeUVINjJxWnM2elI4UXJVNDRrSDlnbm12YWJ4bFZEVTVvaXJRbzdMaE5sZ0RHNGlVUE1HQ0dmT3ZDS2xCbjVuZWp2Vld0QWpQTzM=","upper_bound":"TFhjOTB4ZkdGaEFlY085Z0J3QXduTnJSUTZBblFValBaN3RHOVZQTEM1d0pwUmhEaThKWFo2RE4wcXExZ29kcmQwMHpKSWQ4ejB4WTkzZVpkbjh3WEc2MXJxSG92elZWMW5ZNVI5OGRWWVRadjJZaUdiUGRwalBWREk4NG03dkt1TUtQcXdEZWNLa0RIemxyeVMxYVpKYnlQckIzUnJQb1R2MTNxb2FyM0lMTXZLc2tMTUo1N3hrTW5BZUtJamJsTlc0dEM2MHdWVUFZQTh1dk1leUlGZk5DOEVzblRLcjFlMVBXaFBNMG8yTkFJYlNIcVV4MzhTRFFxZ3QzNEgxYmxHV0k1cHdqMU1OeVNkZ3ZhQ2JNQlBGWUNOVVMxQ1V0TjhqR2U0ZlRwUWVGeHg2RHZpWERCZjVUVDNNOFJudmZCZGVWS1c4a0hLemtEVlIwSlE=","repeats":1},{"count":688,"lower_bound":"TGE1RHhMVUdKaE4wUU1zUkJTY2RLRmRFM09lTXpzU2pXeDJwQWpESEJqVE9BeFNEc1R5NnRpRkdVZnpiZlV1NGtZdzVqOGdRSEg4WFEwejE3T3BvNDNveDM3UmtIdldiTFZCUjlSVmdJSVJRNHd5bFU0OWJ0U0duR3FEUWF6T2pPMldWNG13NHlGM3R2ZFM5UkdWbExkSnBNRTQySTNZSjNBazVubmVuNnUxb0FtbmpPVmNNWWZPQVdyQVAwSmJGb3kxZHp6QlVYU2NPaEdaVUJmNTljR1g3cFo2SGtSU0Q4UmNTdjZ6Z3ZCa3JiT1AwajFlNlZEQWw0TklTbHk3VVJSNkdMSHRTSzdMOWtQR3RONXNwdkxEMERuVmh0ak5kalgxS09EMXc4bzMxWXZ3ZThwQTViOXVGeGpkQlBJcUJGRmdoWTBNeVVWRTMwdnZiOURQZ3NRREtOVVk5VVd4NzNiM2dIODJHTUpIN2xpbGllbW8yNU03bEZxbEVGTHJRVlN1OHRhYTlTZHV4cGFSNUx2MklvdFpHWXZMaFNDUmhjcUNNbVFGaFA5TGQyOGxubDJMeWJTWEJoS205WDBaZzdkSGp0ZDBrUHR3U0MxOHFiZVp3WDdxMW5CVFhCbzc0b2tXbHU2a2pRemc3cGs4NHZTYmZTamUxTFJ1aVhTWlNPSmFnVjJaeg==","upper_bound":"TGZITUdwQUFUT3VKQzNIWXZjaFA0TWZFRTdndVQ1OERtOWR0eklTSldVZ0d6elhUWFlodTVYZ3g4QmphVWFlUWxRVjlmdElRcFcwRllSVHFOMEM1QzlNNW1BcWExSWFWVUhRcDA0NWlVQmpZaEdpQkpXOFRBVG96VXF6bENWYWRQclIzTWV0TU9xVUhDRGZUUGNVa3o5c3Q3d2N6NVIyT1ZPWHJoMFZ2b0VseVNTY2EwemZDZ2dFM0pTY0V4V3k4dnJ0ZEVtQm5uSFZBTktMbTY5cXhXaEpVMFVWZnQ5STlVR3RHZXVzdllYZ1RVN3VJTG4zdGhySHNwa1Rzck1NWnVmVG04V2E1SFZBazZaNnlINWI0ZFdIanowaTJtMTF5d3R4ZTY4ZDBkVjF3c2ZDNlZ1SkZKYTZmTmRrOEVYUVA4Mm5Sc2FBTnRZWHBidHlMYTkwc2l0UnhVWg==","repeats":1},{"count":696,"lower_bound":"THBmN1pmT1FRUngzeHA4SjRCaWJVSlM3dXBNT042OFk2NmdWQllSYUpOUjJzRDh3Nm1qYjg1VlRJcWRRa3BKYkhhcUJ4U0hIdDYydW5kRG40M2EzZ24xYWM4bUdwWkVLcHZ5M1RLS05qT0JnVzMwUThXa1hLUzFBVmZQZlNMWnV4YVNZN3lHWHdMc1dxc09tNUJjdVZUQTZ0amNwOG1VRWRNQU9vWEplZGw5b1NPbEZHNFNZcDAxTFpwN0pocWVMUG1hQTJ4T2hJT2lISEVOZUtqTkk0TG04TWNISW5OYUlOcA==","upper_bound":"TTNYcnk1ZEJIRHlocm10SGg4MmxkM0hXWjVjbGlHOE9KaDg0Y09yQURCWHQ2bkk5S05JUXNhSUMxUVl1RVhkb05IekpETXFSSkpsQTFzckhoVGNRTjMzbWdVWFpFbHhldzJnVEVqcWplRjc1anVhd256OVA0amVkS1Zoc1JVNFJaMmI0cGFYSkNLbnA3QmpaUlFWOHN4UjY5aW5MMnJaVThSUjEyemlLV1luTVNTWFBFQzNCSUVET2NoVEtKMExyRXFnY2VGS3BuUEVBOG51OVNIZ0VHRG5LaFR3cWNOSXVWZWFubWR1aVV3eFRjY0JOaGM3cG1YbmRtT1J3","repeats":1},{"count":704,"lower_bound":"TURxeWZMSFZwa0E5OTFCcUhnaGg0YWkwMzhNSmNSRWtxRERlSW9QNzdmYXRHTTg2cklSZzhCdHVxZElRYklaQ0xodlVCT1ZDcTlCcjFLUlAza0JtZFJMa1VQWmVLYmY1dGY4VE1sSkZ4WWRDcHd3c3RwTm5HUXdwYjJRNTRpQ0UyVE9rYnozZXBLWkdBNGx2aEM5VnBKTU9pRHpmbjdFUWVXOEdlQ3BZaUhZc0RWWHpJT3dIV2lIT2VsczFiTUxjV24xeXlWY1NqRlhDVWw1ZTFtTEhnMnN5RDZ3a2c3UDZwTzRmQ29zbFRlYmhJMkNNNmowU1NOYVFYRkVMelVOekNEYnpVZHNlZkhET0hSMjd5djd0WTUxSnZSblFhTHNseEpTS1NxNExxNDBsdDBTZFJYSFhqQlpNUXhra0Nna1FDMFBFbnpiUmR0S2NQTVM3UDduRFBBcFFrcmRzVUdsNndhdDQ2RVNPa01iNzl6M2ppbEJxUGU2UmQxQjV5WUhyZEkzUnRJQ0o=","upper_bound":"TUxCM002Vmp3VGhPTTJtSEVBdnoybUFmckExSndENlE2THYzWkY0djRvalJhZlFJUG93WFUyMTFlVHZHU0x2VDc1RVd3bE41WXR3Y3cyeElva21lNzZjYmw0RWJXdFZEWm91eUkxNnlUaWJnTkNtV3dUU0pDZ0JES0pMRFJuSWtnWURwMFZmY0xBV2tPRzBIcXQwYVplZlBWMXc2S2ZnQUhDN0YxalkxTWlWUGhMVnNtSDJEVXFxaGFXc3JDb2dXNGVoN01oUTYzMmNVOW00YlFHQnV6WllwOUdpc0ZkR3V5UEdxTVRaNTFVa1BWNlA3cHZaTkxhaDBKSUdFNk14c2V5d0lMNzMyWHlObHlxOFJYY1hYbk56aUFBT1RwdTJ0T0ljQUFVa2RvcU9yMnFmVkc2bXEyMXk0VzMzN0JacGFDZ1hId2JzRW92SGZlVURJNm9scDVDWUFXd1J1NmZ5Ymswc1lpM0xKdUFjaHZXaXFQRm5XRGphN0UzcWZIaGZLOGRKQUZ1ODh3UnY2MGJtakZRNFBvbzB5UGtEWVlvVUw=","repeats":1},{"count":712,"lower_bound":"TVREanlRTElXSkNJOHdKZEZXclR2NTM0VXozY0lsZzZWRm5rZlVGSFFQcDBJUVNITFo=","upper_bound":"TWdzd0szNGEzc29Ta1F3Z09panlORUNOOXNNZnZzV2NVd25FSVBTejBzT2dpWjZsb09nWVNqOXgxdnJlRndhMTRIcjk3bU1SRzB3M1k1NXVHeHpHRDNmdFU3SDl1RExkdml1bWYxbWdDcGZuckpMUngwZm9oc1pVbWFQN0NqUWJ3N0l5enJNWkdSemZIZFN6WVJSVE5QanhyTklZOFhxRTJrQVdhRVhhMjl0TldZSVV4ckhMNVB6cTJ4YzFKV0hwVkduWmt0WDlEYW1SM3R0NjlqNXdCeU9SWTVJNndmSVBSemN3ZGFvdkVpY2JpWWlOc1Z1VjFLaXViczRwSEMzSnFZc3B5Z0xmRVBCVnB6cXBjekVLQ1M2ZHcySnN6RnFtbTdMd214a3ZoVlhuaXplYnZnQ3p5Zk1DRUk3VThSMVUyZVJYYUlLREl3UGlYbTZyS25xR1gwa0MwaVF2OTNEVE51QlE3MXd5c1dIWW1sMmRMTVNSVTVyQ2FyWmVCdUJpOWtyb1JGWENlMzVkUTh3b1lRUTJaTU9hd0dwdWttSk5LQg==","repeats":1},{"count":720,"lower_bound":"TWkyV0xOWjVUVzNlMW16UGRiOE9aVG1VTWRWRHRHaXFUTDJJT0xQUURCMWgyeHFnZ1hSMDkwVEhZY0k3eTIwZ3YyZkdZVm0=","upper_bound":"TWxQamhkWmRKTXNmZmlPRE95OXVXSVlRTUI0alNIdXdYUU5sSW0zd3EyYzNkQWFEQUh1bkVMWUZHd1c5dFBMQlI5WklpNTRSWFhwT0Ztd2NVaG9ab3U4TWN3aEtBNlh2NG1IOVFPcGlrUklCdVBoaGlFWmo0RkVJQ09sY0ZZeHRRQzU5clVteFBQSUR1Q3hoaGtvYmJOMEdHU2NVT2JCVTFOTHV5YjNMQlhPS0ZHd2tiMWIzb1RNVUZxQkV5d20yYkNTckZRcFhzSmZLRWdxTXZKb25VS0NOTk9xTmhN","repeats":1},{"count":728,"lower_bound":"TWxhc1g3MDBvck5kYXlTd1lpaWxuZkdaS1ozdFB5bXA3dFV1alhNOEJZem8wbTd6bDVaMGh1S2xNWjBTZldWR2o0TUZqS2JPN2d0R0psYnhOREVOaDRVb0tmMEp1VmdFWGRCelQzdW5uVk0xTUpYMGpITTNGVFRvRWJCMGxKT2RiWW93UVdWQ1JzMGlidjIzczd6cEFqaXdrSGJPM014R0FuREZRcVNGT2NvVXM4bkVyR01MUnEzclVSYjhlaE00VjR3Y1NBV1VsTWdkNHhjMm1PenZGck56ZkNod2pYbXpKV0dGMk9zR1FZUEZQa00xZ3BGTTBOSm1TTFR3UnBEQmxFaTNCcktQTFpGTzVBNHVwQUxiUUNKSkJDYUFjQjdFczBNcVE4OXdOYWJTcnZQa28zanhGcDY4aHhucm9oc3ZwV2pxcmtuQ3lNWjFjQmI1Znd2SHZsVnBKN3gzcUZyWDMzNjB2ZEI5RlU5a3YwZFpXaFFLeXN0QldSMUhnRzNJZzN5RjEyQXhZQ2JjTVpTcEFMZ2xVT1VFMUZhek5mTk52UW5GZE1yNTZzWnZIcmZTZHp1Ymx4MjJIN28=","upper_bound":"TW5uY0dEZ3JscXFnWTBiRUc0b1E1WkdBYVZSaFMzd2IxWURMbktjMnpsZUlVVTZvSHduRGpZZnl0RjQ4SURRekRHQUdrc1QxN2I0MzdqcjlISmxiaXRuN1N2clRRTEFYUm1la3ZQcnJRdEtHRDJtbnlKMktIWExaSHIwaUJwVlNMNGRsRkZWUEZXTlhiV1IxRnBpWGUxQXVac0hkUGlxNTlZdHpVNmhnd1A1cmtqcVI1bkd5a2RteTRGSUJUajJEQUpvM29VTGoyeWZKaEwxMGphbGszVzBDbGx5cU5tTkg4bHN6dVlMTnF1VzFMOUdEbWxrdjhsakRZRjNFUXRKWGdpUWtvdnYzNnlSYUJSWkxkNnpKUGhNb1pwdGFaNUh4VmF3Qnp6Ug==","repeats":1},{"count":736,"lower_bound":"TXBJR2RMQjIzOGhudjRMS2pkaldFMk1XSWVLenpSOWZzRGhmSjM2c3oxV25uTUY5ZGhNd1ZBODJzVTVKSnc2WjI3d3lERmViZXE4WlRTY0ppUHpqdDQ2dENnN25XcTJDUm9LYm1HRTVhSUV6TGdhNm5tTVQ4VzRHQzduQmFGeGt2ZlNIejRLS0I2MHIzSVNuYTlWRWlSUlg5QnlEREFqVGQ5SFlEUWVQWk0wZGhQTVV0TkxmNzUxUW5lY1RzVmJGVUVuOUhkOUxlVTJ4dmpkbjY1R3ZhQ0xOMGlqc2sxWFdWSmFTbjRvSUczNnkxQTN4d0ozc2g1ajRZZThSUkh5ZGZ6MXhzTzNYUWV0bEFBR1ZFSXV3UWZGeko3bHFpMUlabWxZdWhvVFIyY3FmYVAwQm5VZDlLeURBUjl3aVdhbWJmWkIwMExBaXh6RWFoek50bG5NN3M=","upper_bound":"TXpZTUxFUkp2SmpPWnVGcHlEVG5uYUN2SEhESUlTTUttWmtGZWdmaXY3VkFaMEVpWjRqM3JzOHJ6YlFMSXlKbmk4Y25sT1ZqOUx5bzlRbm5mSGxIZFRZZTg2Y3k4Q0tPbUhDaU5EblZXT3BBNFFvOXNaQkNXZWFNQnY5MzdqZEtzaGtjcnZSV3A3TklWbVZuQk9IdWk5WHBUdDZZd1MzVjVkcDVwQ09MZlc0aDFURm40eWJQOGlGSFNXZVRvSzBVeVJDRERvZUN1WVZyaTlyQmNrNnRhY0lTOEY3Umg4OTVVbG9GcTVUdjZyaFc1OUFGcWphclZXYWlNSUhvTnJEaUFsMjFHNHl6NWdicldFUncwS2tRMlFuUGhxNk9PaDc4eFRacFVNMDM2akFTS2k1WXI3eEk1RWJDV04zekNDVlFiTHhWUGtiZkxKMG5HRUhXQzdBQ3U5MDhOSll5ZXI0NTVmNjY=","repeats":1},{"count":744,"lower_bound":"Tg==","upper_bound":"TkxCWEZSMVp1aTlITUsyYlowM1ZnZnpaYWlTMVFNelhNT1d4cXg1M1RYNnlhMWRqZHEwc2lBR1UwaUwzcUljb0ptb0Zsd1dXY01qOWN2azE1SjI4aFdwMGt5ZUhwMU5Bd2RNNmNLWVp2OU1ZYW9wTzhGTDZwQkxJQWJMOVdaU0RiTUtR","repeats":1},{"count":752,"lower_bound":"Tk9vRXNIRQ==","upper_bound":"TllCVDRGVnRmWlRpVHlhaU4yQ3lWWW9RNG4yVW1xd2oxbVlNcnRDWnNqWXlmeEFybEVsS1B6UHY4bG13S05WRmtCOXFZSlpBM3YyRmZxZ2lJdlNTNTd2N1dHRUkwN2xKY1FPaTlGV2tCdkxzWTJNSThQc25EM1NVTWZjeGpibEUyNTFqZk8wdFJJUlVtTGdQOFFRUTdmU1FKWkRpd3Q2aG0wWWZqN0xVbDV1Z0YyZ09Nc2s4dnJZUEt0cjh4VU9hSnds","repeats":1},{"count":760,"lower_bound":"TmVKWDFmOXNqb3RoTDMyeFUwNjZ2RHlCcWtBVDJ5ZnpFYUMxbzFzMkh2","upper_bound":"TnFDNEJ6djR5VmdBREtnWkxIdHZrSlVXWnJHdTVGbnpWdnpLQkUzS0w4Z0R4WEdiY0JKS3VwMQ==","repeats":1},{"count":768,"lower_bound":"TnI4WlRmRzlUY2ptU0lyRTRDZnRSeXJ5ZXcxVm5OVjBhRlR5V2hvT3pEaXliazlZVEV2UTRzeWoyOXVlcVhIMXVYMXlDam9uVGhOSmFaRXBGckN6Wk1RbWJ3RmFvSUhWMU9GQ09CZ0Vzb1hLOVpqbHdDOWpUTUV0Z2FnUnJnNlVqYnRNY2ZjRk03MXdtZUZBb1MxSDAwbFV1MEZWWmJlWmlqYTJLY3ZPU3JGa2NtSk5LNk4wWnd1VHVhTXJkU3JodUI5Wk04YkVTbnV1MXdaVGNnTktpcXVkU0JOdEpGaDFKc2w3NjNVOWdxc1JYVFdOSFBqYXQ5S2F0RE1KM0IzUHRDakdOa3kwSUtMb2RmaVA5YUlHeThTUkR1NElCb2ZuUlpsbmdEVW5rSnZxSGJFbEhTUjdEYXhGQWlKYnluUzB4SFkzUW9Dc0xLQWR0VUUzbDJaY0xSZGpwcGJqbk4zc28zZE90QkplV3NsWVBKaXh6TGpiMEduWXhaZ2xYWTk3cGJLUzJNU09ZbjBaMUlLcG51N21zdE5USWRQQThLcFR4Q0tMNDZpUk0zU0dha3Q4bXRIOHBSamk=","upper_bound":"TzVCV0hrazBRa1U1eFRWVHJZQ2NjSUExTkVFdHJ3T09MNm9VeDM=","repeats":1},{"count":776,"lower_bound":"TzVyNnlaNlZsY1JWb2xhY0RWa1ZIcDFuUHZTa1BSbUEzdUR4ZnVxbEg5eDRGNWxHSHhMNnVuNTlXQW5vTDJkaFNSUUJBQm9xRGd6aEVHVW5NcGtTbjJadGRBM3dFalc2ek4zWEhrSFdkN1ZPeURXblF4NDZOZUZ5TDFpTko5UnRUZVJEMFZLeGd4Y3BjU3BlOUJtbTVoQjl6anRNYTZucGFzNzFhalRTYWZvOXhDYWhnY2htQndXblN0ak85dzlVSmV3aU1kR1dLSzVJUGtHVVQ4TEdsNnVrY3h5bm9GYzZNSWcwMTk0MHBHTWdyam8yN2d5cDQzSFhPUEtzajQ0d1U1R3gzWXJCZ1MwRWlhd2JIdGw0d3M2Z3hNNlpJN1ZZQjlvOFVKanhId3NUa2h4WUlpT2tPNUljeTlMdTkxaW45UklBbk5pRWNVdFRVRFlXS2RQYlF2akQwdzY3Rm11dG1MaG5hSjNVSDVJT29UUGZUMHRHeEdSTTJONmkzR1Brd0JMWlNzVnhtMk02SXV5QWxxUUM4M204ZFRKUTN1dzAyWDBsTHg4cVVibmszRERKakpncWsxanlDTE5wWTFXMVV1c2dKVkNTYk5kY1YzaVVGY2xPMQ==","upper_bound":"T0NmUXFvWExRU3k4U1RDTnJSWGtLUG5iYXcxTGFlaUVwbG9ZVEZjSExKQWl4RlpJb3JwY3UxYWdMdWdTNGZrUThwaExxNUJDQjVNYkZLcnp6M0VqNkdnb2dSNlBuV1J0OXI5aTFNcXZwZUJOU1NCeDFjTW5xMENHWGN3a0J2NlRnY25jeURlMXQ4eWZEakRDZFZYa3JCdnVDcG92YlNiMTZvRDBmWEJYNVhlNG44cThZeGFYM2tBTkRhR0pnbGJBaDJ5MXFuRUpNSW1sTkRpWVc0eDRiT1VRQ3pralJLeDhQaUVSdXh1eTB4aGNvanpNb052VHhtR21aYzJXNzlpeTZqSk5z","repeats":1},{"count":784,"lower_bound":"T0N3YU5qVjhGTndYQzNQeTYyZzdzQ1ppNDB5SUszaDR5NEF0TzZyRHk1QkZtcjhSbjNjZWdtd2V2VWNGWEtUNnVsSDdLT2EydWxPak9uNFg1d2FPNmtSNnFiUktRcjl2YnZmRWpIV3pBbVNYQ3BWTW5hZE9jNTFrZWRmV2t4Mld2V0Ztb1dFd0NrWmJZUU9abHVQZWJFaXcyNEhYMEVVT1FoNUpQdm1iNHBPSmpmbThldkQ5a3ZPc09MNjlyTlB0NXBqQ2w2NUZ0b0FBRk1PS2t3ZlJYeWtOT3l6dEd6VklwWllEMjduZzhkSFl2MVFkVjI4dXdYOUlsaXR2TWlScVNSeXpsRWlVYnkyaktLZzVmNjYxcTJKQkxINUNVbWwzTTVzZDZRNWY1aG80aG1Xb2EwYzZUcjRrV1FHbmpuMXVwaTlJbkN1dHdKRGpNNVhsVm5GTG4=","upper_bound":"T0pEaldYOE45WDNybnpES0pzb3Z5Ng==","repeats":1},{"count":792,"lower_bound":"T1Q4NzlrVXZFR1RGWnBNekQ2YTlOZ0lBZ3Fza0x5OFNveG00MW1VclVvYU8xcEN0dkdHUURQUFEzM0E5WHRwVmUycVkwQjZ0djNKZXZwaDNJdWJwUHRGTnV1cFN2UERUVmRXR3hTQWhHZFVnbWRHdkp1YjNPMmJLQzFHT3IyYlhUcEFib053aERUb1IyZUhQQ0w0UU9mcnVKN1c0VUVxa1NDTUxPZVBIQTkzSWh0OHBnbmtabmt2YVd4VngxeFNiQUo3S1lrTm1HOVBPYXBOUEpIMXJ4S244cXplRXoxTDFXSkhmamxJNnBrdEhwNkF4QW52UE9OMjRBSVIzSVJ5T2tWQXBpZmR0YTlVbU95WGFKdmVnZXpIQ0x4T0NCVUg4VkN0SHRqSDhlMWtFcmMzWllqUmhFck84VlVvTUlEd1pJQzFNSWhaMU9aN0RBRW1xWVY0VjhXZkx3eEFYRkhRVHdCdlVHcmRmdGxTeVloVW1TVE9CeUtPZ2hJQjBwMXlHdjl4bDk3RHNIUnc=","upper_bound":"T2N2d3c3VjZ1OW9EWGt4WDQ3cUh1VEJWMG13RUtPNWhZZTBkcW9QUTdxUjdXWWRVRTZsNTFUR2dDT2VmSlFZUnV4T3hBeWFMeUZ2dk54YVBnQ2hseFZpRWdVV3hvN0VYZGlHZk1ndlZnZWVZRzBGQjk3bjYwRGxxMFhXczlFMFNCc0RGSmU4VDNFMDZialhOb0JJWjByUHRSQ3pUZzJGbHJLdGF3dnJDTW01WkVGYUptWmlSRXhPbVJyOWR6YjZONnV0ejlHUnFaVXdFWVVCZ2VGUDBraWowY1FtaTBYbVVoMERnVmludGpVUEJLOWJLVTVuSW8yMjhZYXU2Ulp5a21wQU9KRGM1RXp4NlZ2SFRuVVFYZ3BCbXhpWnRkeGNoUDhIajhFSVVEMzZLMUlyaGJmUlIxbWJ1ZnVUZG5KTnlpdVZRNlFETUM0Vm9JTTVvOEFQRHdiMVl5aUpKYWpOaUtRQ3lyemFseW04OWFjdUtzVjJSNDU2Q1Y1THR0NERoSW9YZW9GY2FBM3d0czd1ekdENE5pNXFKNDMybzZlc1NEOHEyc0ttWm5GYXBNZmYyV3RWeE1aVmN1blZOZHhpOGpGU2ZTajJSV1hTRnZrWlJ2N0dFclFMQTBhaVBoZzM2UEZWb2wycVY=","repeats":1},{"count":800,"lower_bound":"T2hZVFl1T1JvSlk1QzU3QjZaYVJSNWZHNW94U3BHM1BWUEtwZ2ZaRVdPY0ZXSUl5Q1E3eXdWSzJ4Q3BubVlLZGJnMWR5RlF5a3c1VHdKUGU0dFg4NTUwNUNIU1NUQUl5Uzg0b3RYOVhGcmN1YXVwUkM1Vk1vcnJ2bjVhREFYUUtiNG9MWFQ2UFRhcmVveklabW9IOElMejB1VVJSbEZ4SVZSQ3NKeG90cFkyY3BNM0U1MUFtZjY3SEFmbUo2OTUyemlQcGs0WFdTMmNvbW9LYzJlTjU1Y0R0MVR2bHE5ZUR6aUVsUHNFU3AzaWxqaHJCMERRVHdEV2FqOE1LQzJpS2V3OW1jZXJxREFib25EVFdzbm91NFVKQUVVM0xoN1hmMUxMeDA2UA==","upper_bound":"T3phR3B2NDRseThUVDRETmJpNlpCM1hEaXp3RVpZektUYVRWUVhHWTVOOXMyNVFqUFpjcGdUZUc0VDBhYUlNczRxOTZuWlJsdnhYcWZSdEJmVDY2RXFwMkNZWjZpdFl1cWp6b3FIZnlvMlR4UDVSdHUzZThQMjZEY29TV1Vra0dnREE0RTBBZkpyZzJJRlNPUTNzQlZxQkpVWkt6b3diTmhNMWwyWVZrV3BXbUJWTGg3QzV2REpxeTJaZWYwOWdLOGZWUGM5dTJkcjVtVFpIaGRhdVg3bHNqcFRXZjlETnZRQ1RSNkYyT21hSkFNN3h2NU43U1lsVmtuY1h3YTVWNHUyMEZud0RmamlmcjJhT3Q4Y0E5cG9pejlzUlJPcmwySVZYZXZGNFJBd2NacmFBSHZyQjVXelllZWNydlZMZ1RWMkdZckFzVkNBTlo5M3RUV3ZHbzd5Y1l3aUZWd1U2d0tob3RNQjVaSXNWTzN6WUFYbk10cjdDcXhyMFM1QjlEMGNKUkt3SllFQXNHUW01MEJ4dHJ4WTc5ZVNnMlExTldXdXkyODlOZGtZWQ==","repeats":1},{"count":808,"lower_bound":"UDAyQlNhcXdHSHlJTXF0SVZBd3J0MTB0TVJ1Q1JBQmQ2dFNNOXNNRHlEaGVKYTJtcnZqUERaZldMdFA5MXNlUmFIVGMzT0RodVV5ZVVLVlVrY291UEJEd0I3VWdTbVlwWHNLUUZmZjVTRVZ4SXdyVUYyNFNBZUlraHVKcWx6WVJrTDBDN0tiNDA3aEljSndnS0FXN1BXaXBia3Jyemhia2JwQzNzb1phQkdTVmdKSGd3NnRWOGZZR1RENG5FZXVHOFV0QVh2OU9KeHVOVVQ5SXgyRXJpTExBdVZtaFViQjdsSWpNQUYxZjE2SGZzaEV5RTV6NnlPUDNoN1ZVcURxVWxqWDRLZWR2TWRpVU90QmtQZk1CU2FFSmdTRDhYT0h6UkFTUUpFYmhOTFRMRTQyc1BzMlZoTDRjUVZZZGVITmlsT3pPMFBpbUtMQUhsNUpUQkloNlhrbkhNa3VaUVZ1Skdqa3ZyTURSYXVqNDZCQ3Y3azhka1JIeVg2Y0hpTDZ4Yko3VExqN2pGdmRQbXdUQnEzN00yb3V1R21CNGlTNk41ZHExSzJ1cm5ydzF2cEdvOEx1QlJSRFdBMnVteW9CU2FrMGFvamkxQ211T1dKcEQ1dGFoQjdSM0UxRVhlcUpCbWVKWDRFdg==","upper_bound":"UDdJWGxwWTFTNmVaNEVHR3d1bHZFSXAyVW5JOXp4WER2eXVYV2RjeUN4ZXJkc0Y3Wk9HZURNa2xhS1VqbEQ4RGxuekgzR2ZQbUVlb2JTRzVSc3cyZGp2anBEYklzNllvNWxPN1BhS2lYcVFmb05XYWdxOEtqOGpYcGRBUDlsMU1FSTRJUmROYXBoSjl4SEdaOGdKWnNwYmhXbXR4dDc3eVdvTHB6eFI0M2RzaFAyMEJNSjhIUzZuUkUyV1BwUVJRSkg1SzlGM0QzVm9rSHBiWVo1eEl0NnlWdzl0S1V6alJLUE05TEh6N0N6STdTTWpwcGNVak5FaEV5cFZzcGpIM2Y2eHZMSnd0WjFIR2NOUGdsbDRFMmNzVlF1WWR2cU9mSXUyamxnMm9NQnNYeG9DMTJnWmRhUFY=","repeats":1},{"count":816,"lower_bound":"UDdTSVNCTVhVc3F0RUUyaXhrNEhnYW4yTHU2YnA1djNyejNwaXFPNHVjaEMxRTlENzd3UVFhb2IxVkg0R0hmd3dEQjg2Um12bnpaZGg4VWNyN0lGYnNpcE5kbVhLTEVnRnVKcDRKOGJvR1d4WkpWVWp6bVREMW1KU1FINDJCWExFWDZkeXJVdXlWNnNPUlYzM3FhNFJTNzV3YlRFMFpERnRIMmNwUnYzdUdndXZ0UlhtOFVJRW5mOExhWkZMSG9VelkzNUo3MnVGNzY1cHhVRE5Nb2JPd2EySWRRbnFWQTRMT1RHOXlneXV4NG8=","upper_bound":"UFA3cjNRZVRsU2kwblBycjdTQVh1a3ZUS1lnd2JaVkxSb0J5dzlNQVBnM1diT25TOXJSRG9OdGpueEo5TkZ0RTFydmlVWWdObUp4V0pNNEI4cGp3a2hITkQyVUtmM2NFamtRS0Y1RlZhMg==","repeats":1},{"count":824,"lower_bound":"UGxTaEEzQUJmd00=","upper_bound":"UThhVWpkSUpWWlF0N3BoUm1EN2xpa05QamltZzFxWEFvODQ0NGVnbFR6ZXM0ZjMwdFFaeFVaVDZLVUExR0hjMFpGZnZDd243MmhKZG9YMExSNjhx","repeats":1},{"count":832,"lower_bound":"UUJKMlNRY05SeWVFU1U0YWE4bnVuSVkxOHdNMTlBSmVacE1jQnlrOTlzQU8wYU9xUHRvbHhiU29BMWZUbU53YUliN09lYnFZNGtpZTFRU3FDbHZ4U3k1OFU0RU1Kbk13emNFdWFqRzZRUDVONnpBSFFZTVVZRmsybHM1SURkUXhVQTJPVDBsVU5WZUE5WjZLc29rNzR3","upper_bound":"UVR1QTZGaXA1OEtLNER4RzgxYndiZThsZHdPeE5iem5RN1MwUHg5RGJHczJ3UXgzZ0NhSFNnWWhFWFpNV3VpMWg1SWYyMTFYRzJ5bm9ZR3Q5dldVMXhTUjFUang5NXpGSzJtVGR1MHlCbXVQVGlFV3VBUUN0WFpRRkpzRTlQcFc0MllCUEJ0YkltMnFBZnRGbmhpaEtpOENXQ0dSN1M0QTFKb041ZUZRNTJaclRmb0x2OXFnamRLc3NJZmlGOElCR2ppbVUzY0xXVjNHWUx3WDdVUFB5MXd6SXlDRjZmczlpdEkyM1ZVZTI5clV2SDZsNmVBZDVvU1lMeEtUVnFjcVBreENjUHJCcUdTSkJSOURBQzF5Y1cwdWtuWnlsU3FaSlFNcm5ic1hPbVdmY3p1ODY0OVJsblFSTGMyeEVJbHdlSHRtcUw2S1FzRmppbWEzM1lmU0FFT1FrcjlhakpPc280cWgwMVBVMTBZdDlyQVZPZjVRcFJtTmUwN05uWFI=","repeats":1},{"count":840,"lower_bound":"UVYwOG9WRFI4amJqTDFyWTZqTlJnVmRjR0dmMEdvSmdIRkZUZUc5YzJiUHNXQ0d1bkhFTUdrZGMxVFVRRTZIbENSeXRvOFdFYnk=","upper_bound":"UWNVaWNZN2pRYjdRS3JWbkhCUXZZa1Y4VWQ2Ukhwbk9mRThKd0E4b3ZGZ3pPRnFYOTMxVjlDTEpMSUVKbjdBbFhmekJmTmJxQ3pZdXVCUHI2bnRYeXVCeWV6QzBNa21ZSnExME52VHhORTFZbnZZZDUyNVBqRUhINDhEQ2dPVW9vWU1tR0RJMHdIcVJBWTNkWGdhbUtyTHp4eTBUc2U0OFJCY2kzSlNjeDdhdnF2VTR3b01MMUZTT2w4RkhtMmZoYjlPWldrTkRXRw==","repeats":1},{"count":848,"lower_bound":"UWR5V0FqZHY0Snd0SUJBZUtRVDBCN0pwSWZCY1l2bkxBcDdtZXlFMmVMem81M083R0FhQlkxVks5WEQwdGJDQlVBVzN0V1I5UDRpY1hEOFZGQTlxWFNnMkVxM2tXTllYdVp0aWdtbE9qakw5SkVSNlhuYVhPNDNBUDVoQ29BTExlSDhlVktQekQxNTd1ZGgzMktJeXpkZzBOTUNGVnNWRXRnYVVTOTlNM1NLQ3lndWV6dlNjVWZtNzYydnViUHU1aGNpdWtoUnBpTmdEQUJrZjkwOXhDdXFKNFhKVUwyWkFES1p6cVF5MnBQYzRNbExSVmd0bWI0QWMwQVNaMEpTeXpLWEk0dnVldFFLeUdFNFBrNnFL","upper_bound":"UXBqZ0NyYWdQbHFuRTZuUDVDZjl6MmtmbWxvdmoyWkx2ZXhaVnJsWldkenBxdjBLRnU1cVlmcGRGWnhjd0xHNDhtOXRKOFppaTFWR0tWUUtKNTF0bzhpbjBET1ZySndYTXhEbU9UOVYwd3RUOXo2NlZKTm1WdklLcGhrcVRTekxFbWlFMjlsZnNITlhWZ21SRVRMZnlJTUZLN0lUb3pGWDg3M3ViMFhFVkpFeHhibjZDdzYyWmtRcldFQWRWT0Y3TFpPU0dydndzQjFlUEkxNVFqNm5TUmNJajBHWUxTMjNyTmlYZkh6Sng2TUhFcThaMDRORUNST2FUcHdzMnNDeHV4ejhEamkwbUI5d0NubDcwOXpRRjB1MGxYNFFodEltblRxTDlqbHhncUIzZTB1dVZWWTR3bjE5ajVQYmltcTFQQzUzeUhiTTdJZVpmWUxLcG9OUVFwekZEQQ==","repeats":1},{"count":856,"lower_bound":"UXFPbTFESjZYY2VLQ1NMOWpiTXYwbmpPTjIyNkZ5TEw5NEJkZFlIdUlQU3FCSUx5U3p1NjI0NUFKVDBBdUtZWUJNT3NUUEJpM3hpME9YNWVZb1Fka0ViZFkzTHNsVmx4b0FTTXI5SnNwbk9MczVXS0I4THNJcEJqVThUcUwwcDFrN3d6dUx0cGVvUUN3Qg==","upper_bound":"UjRnMExsNGVVcFVqYU9XaXFUTGVhVXhFRXFTdVZ5RUtjZXptYW5ROTE4RVhHa1dxaWZWY0JVZThud0lBbHRnY2txNlVQSFNZczV1TlNIcHJWU05zQjVOTDBUc3ZVdWwySHVsVG52T2hyVzZLcnZoOGtDTTdES2RaVGZaNVhYUzRybHlwbFFiUWl5MGIyak5CMWkzWmNmV2VjT0N1U1YyeXZv","repeats":1},{"count":864,"lower_bound":"UjV6VFF4TDFjOUhFeHpxdHVqbnZwSGtseUtIN09Ma3huUlJsVHJoV2ZlYXRPeHBnaEdTV2dmYUVibmRpTUp2UXFQRTdBME1EMlM4Ym9qRURxSDdhTDZJSEdTRVhaSDBCckFsZDQzZk5ackJ1U0syV2RWTloxYmxuMkhZWUtYZXRWcjg2ZUlKeE5nRWs1N2M4cXVyTjk5dkxCSmNBQ3FURjU5NzAzd3JuUGQ2c2xWWTVzM25tcU9hcHlLZHFvWVMzY0tpZGE0cDFjazV4cGlYWFZ4cFlvVnRZRHExZk5tb3BPdk1YS1BiYmg3cXU5T29zckw2NHF6ZUR5U3BuUFhOQm9uSERobENrQVBNNEZlN2tYYWI0Y09jREtFSDhsSFhTQWhXVWdta0JzN0pMMUNLRzNnMk16ZVMwY1hsOU53dWdRRkQ2bXVTOGFEbjNFVWhWMGxvMXIzWldEOFJkaTc1a0JTaXVhSjRlUWRpUnU3S1pRaDBNZ00=","upper_bound":"UkFqMFdhd1BvY1BoT2lKbkhzSTZocFZzcmkzTXpMSHlXU2lkWk8zU2RJSGppZmZTQzhzTHhZU2ZQaDBKWW9FMTF1SGNiVjh3V0N5blduVHBTTzI1QWxTNnAwbkRUYWhOTGYwRVdOdmRZc0tqOHZxN0dzenNscGQ2NkwxbXhRSjlpYWFXZTRJckJnaHppaEhBUHduT3k2aTVuYzVTWXRlbWNDa3VadWRHZnBKTkgzcHRwdjBlMGo3QXRxNG1xVk03R0FPSHR1OW94eFB4a0lKREtZdUd1S21zUmtnSXgzOTVJV0l4WW8yNEY5ZDRQclhiMHBCY0d6T0pSY3dmdnBsaHRrN2c2RnZGcWFaZ2ZLalZURE1ubUwwMW9OSUlqelFMVjR3ZXdvdzlPOUxvWnhhWHNCc0pjN2dQeURqNXRMNHJoOEhlaEd1MkZmamxycWJSTGpKWTZhNk1NQXVYaUdtNkdsa0dMZEpQR294bUhzQk9LTmtMSEVtckZHcnFvMmJRZU1FYm1mTmJkR2MzMkxLblVueWJINzR5czVWZWFHRzBtckFwb0NZTTc2cjJmQlFFOWs3cVFIMHBrbFJNS3VaemhXY3loUFFnczJiS2pjS09MNERZVElMYkducGF2Q3dUeVp2WE5VekQzWUZtVzUzNUhZQ29yNHBCaEpMTlRMV0JyYkQxQVY5YzBGc1o=","repeats":1},{"count":872,"lower_bound":"UkUwNXhlZ0swcHZqMnRrQlBmTUJYbUxweTV2bzZvNUZrT3psSW9MRTJyVlp5MmdMZ2lqUmN1cFRuZ292RjdiT0U0Tk9xZ2FPSm9KdjN1WWtoRE9rVFZlSzVETnIyeGdUZlAxbUM2VVpUdFFwc2cyRzMyNHZnYll2VmxXczFGaDBaYTZSZ0k2Z05lNG5UNVM5bUd3d2xvVzBjSkRrYnI5eWpQNzJLbHdrVEJCWklUZmhpd3BYUENvNEZqOVZJeDc3bHdSa0llM1N3VThra3lwUHVzTERzRXJOZW1EQklWMWdZTWZKQjE5dWZjTmw5UUlKdk1GSGdIMUQ3SWlHSmFzT2JmeW9xb2V2OG9obXJKQVlneXhLeUVWZzlPOEgwT2JaWEJCeWRTUDVvRFc2NVN1emZYMWJIUHFEM1k2S2E4V05rekdSQ2piSFdvdnlrYmxEV3Ux","upper_bound":"UlBBMXQ5Q1BldHhROU1Rb2M2SEJIZWxZd0lleFRSNGE5SHFnR0paaGF6TXlJTmdMR2tNRFRIVDRhMVlObzUxUlJiTW1JdHVJZ1F4V1FoZzZhV3JpN2lmR3kzWm45aWxESURVd3VsbEFmQ1FMbHVScUkyMnczSVBDc3A5VGdaRU53Vm1nREVwVmlSNGRGd3B5dk9BV3R6ZnR1TTZaVHVoQ09rVFJwczFwME5hdWtBVkNybHJPbmRvWkdZMVN0cm9QRVVkcXowZnNQbkVvenhKUmFMcnNzTFl4T1h2UGZhWElGcXVHa0hibGJSSzRETUw0QWhmc3ZCU2djVGc3cm1qUVZDRm1xM2pLSVIwUUc3NHNWVGx0WWFjbGt4cWpNbDZsR2hPeWthQ3VaVHlYRGVaUlp2","repeats":1},{"count":880,"lower_bound":"UlJWQg==","upper_bound":"UlYweFFPYk5jc2VYR3pVZnp2WkNhVVhrVU00YVB0UHVrdmUzd1NrcjFJMkdpajlwQ3ViWTlHUENUTXpyUTlwWldxRmVWNE04UXFOMkpsSVN1a0JwTXpPVURodmR0Nk1CSEg3Z3lWaG9pRjlhWDdXQzA4THYyQ0w0QmlXTFN6SlBGSEVlWkhXMkpTOGF1R1JZNU8yS1laeHNPemJUd01BUTZCZ2FoSW9VSElodGNaeHNlVU1OVU5zQXlKSkxRdWJBbE5YYWJzQ2pnUkZtOGgyV2FxMk1TNVdOQWpiMmpJWWFUODFoU1oyOEtERWlsY1M1OTlybjRldkJtR2ZDYnJya3VlS2R2enhDTUxUMFNDb0VaSE5wREhhZ3hzY3A0ZUNUczJXbEx0SnBDcjFxVTNwVFlvYzFKeFNVV3hTQlhSQVFVRVpHRExpWHBFWTRxUlF5QVlHVXVob2VGQWJqVVJqRUozZFRURDBxa1EwSUpNZzdkc0V4d0w0OXlUdzlXSG1sSG9ZMkRIdllJTHdLbmZQaGVXaUg5OTJCNXRGdmNud0VPeDRWY3NEaWo3YzM0cnlHV2NVSVh2UXk3RThBS2ZkalB3OU1uYU5OeHN2N1FlQzJV","repeats":1},{"count":888,"lower_bound":"UmRVRlc4VGhIQ1R3THkwMWVaQ1pkdzdPNVF3RlQzcGhwRzR4MjZQTTdFZmVmSVZqYlo3ZTFUa1VzSWZTMkZmRk9uWjhpTWhKNDdraXVHU0dHS1hka3laaVRVdzJid3ppREpnQzdHVFB1MVF1WUdoS055NUJxdW11VjB2RFlJaEZMOWxHcUVHSXB3ckhDUTAza00yWHMyWEh1OHVRMDg4ZkowQ2VLV1M1bFl5cmJmUldmZlg0WFUyMmRJZ2NvUHd6TTBINjN2UkZiSWc3VW10NkZUZnFVWU1SS3JvaVdoSTlkY2swMEZEOUIxMEZZeHNnUkp6QTFCWGJkd1JoMU9PNm9HNlBPNkw5N2ZzWg==","upper_bound":"Umxmc25IU0xhNDlndjA4bERXc3Z1ZDlITFlXWg==","repeats":1},{"count":896,"lower_bound":"UnJiemQxd3Q5d2poRk1uYXo5U3lnM29xYmE2dXdKRE0zSUdpeUVmNlRoenBwWWFXZEVvQm95QkVxRGZ2ZGFWdUlnb2QxSEZxeDhhUDV5bVg3Sk1ENFFpRzlDR0NwOHJEVllaOVZuVjhpdXVzaDJqdUxKUmp3S3kyMzNVa2lUZGN1N2wxTkxDRDAyUE9Zb0RTOEdBQld6VnRnelBzc0hoZE1EU0pPdDhnRGJ0Zjh5ek5DUmJlZXVtc2hkWXJ2d1JyaFpndlBDcXJpUUxkNUJVandEa1JVQjhzQ3NuWE00ZA==","upper_bound":"UzVPc2d4WW90aXFrQ3hDT1F6VTA5M013TnlNZ0ZhU2FDU3J6Tnp2dXhxdXlEUA==","repeats":1},{"count":904,"lower_bound":"UzZtTjhRcldRbk5RU05wZ2JTV29uR1hqN3UwQjBGeFFuVEs4WXJxSzdnUFJ2a3JhejVjUGh5bXphS3Nxb0ZhN3JaMTdBdVhrQlFtQXpxVnN6aVJLQWNRWm9hMWc5bnh3WEpjd1FmMGpUUGJkSkZhWWRyNUloaWxzaHlwd0pvaTZPMUpkTG0zVjlEY2g4T1g0aElCY05uMzZ4S2swTVQ3ZWxVTnF0YzNnVDFOczEyTmh2SHpGWEhzUmo4N2N5VjVRS2VuZFJlQUpsTEFpakFPZEpEeEpnazdNSG5EbDlqNUhOY1hXRmRHcVJZd2kxMTdhSGNuR21jb1AyTFZac3FQV0w0Vk9KWnRaeWNjaFg5OWx2bm84Vlc3WlFTd0JqYUduSzNoOUpRQ2NXc2pUbHp2aGMzd0hWTGR0cjZiZlJiY2xQRzI1b3hFbUVRTVI0c1RSeHFudVdqQmN1aEZaeU1uMURHOTNkSHcydllnSEJrcWZrdGprV0JMMldzbUJ2NDJIanFJNk5jaVZMcjVqVlRqN0c4NXJnTDNuOGNydVFpbGJXbW54SGxKNHZ4RVVtOXNOTmZ1eTJvUTE5ZmVEeEhYUWxvSmpLTFFSaDJnVmJmRWxzekNIclljb3R5WFFVMmVqQmw2ODZrR3l3SHNsNUpwOGFMVlNKeWFaR3VTNENkaFZtWDhPN3laR3V0TDB0NWdxdk14Z3Q1bWxwY3Rwdg==","upper_bound":"U2NhZHhSRGowbDVROVppV29Tamw2YXczTjdvSWhScnEwd3E3R2JOc2NOMzlibEZqSElqRVhCV29XYUo4ZlNuQmUzc0VsYkMzRUNXZHlyTWgydmdVREw1YjF4MjBDaHBQZTA1V1VHN3pCMjE0SWhWb1QyTXJTc3VKTFFNQkJBa1d2emdGdkl3Y2lIakpjdE5IODF6SGs2WnU5RFZ5aUlGVlNMdTRxekJUMFhWVTNjQ3pkWWs0aVJ5alBxMHhKaTJac3dpZm1kS3hzY1BOaWdzbW5DTGk=","repeats":1},{"count":912,"lower_bound":"U2h2RDVsUDVhMVBFMDZnYXR3ZEF0VkFqSE00Y2pvQnBab2xJT2wyWG9jUlBFRzkxZ3lwMUk5NUZzcWhEcEVlNVNVd1pCaHY2b0l6SnQxaks2OU9sSENkU2ttQ29uTDRMUnhudm5BMklFR25IVEhVMnBHR0U1VG1xeElLYzh3SWF4MVZYSlU3alN3QmFkb2tWSE5NUFMxQWtiN0ptYldaS0lnZDRjQlhDMndubDNrWmhJeDU=","upper_bound":"U3ZzZEpQWmRmOW9HemxrajFaeTdvTHpSTk1tSHB6UU9GNms3WDAybDlFMnlHbHZxbEszbUtHZWw4ZWZVTmVRQ2w5bXZ6NExwZk1yTFJDRmpFc3RJUlk1bkhzU2MwYkYzNkdtejlDcXdPN0trb29XSlFUYThETWtEN3VpZ0lXenhpelVyY2ZEV0dzdw==","repeats":1},{"count":920,"lower_bound":"U3l6TXhiNm1BVFFHUHdsaGlJZHQ2VVRxazd6R09uUGYwU0VFSEMzaEdqbml0bGhZZWxLRm9icjBiV2VhVThkRHAwOEFZTmI2a1BvNngzVFNFMEgxNUFFc3pJQWZ3UjNLT3hLZ3IxOFNKa0FyUHQxdHo2N1c2dzg5SE9SY2JRSGYyTllqODRhc01yZjVlT1RKUWFpSjJqcmVKbmFZUGNCZGtYRGp2eUhxVjlkdzNpNlVKZHpjZnNHUWhYdXVzNFBPM1c=","upper_bound":"VDdzTUN0OFBCYWNjTGFYQW54VTdsbmd1OE1vYk1UWGY3NlBpUUk1eUI1SnRtamV2WnMyZVBsc3F1cWd2WG14ZlNMSWxzdnlJQnZXUW5QZlBQSzFkYWozcEQ0RDNzNU9kQjFOZGlRTXZnTGgwWVhvM053RDNuZ3ZONXYwcjdkTmtTZGlLTUhIVDl2OWxBaHZwVW5ZYklXNnJBN3BTTEU1TEhGT3RERmZNQUZ2NmJHR09YVThaakN2QUlCOFJGUUlPRkZBV0tNejBtT25TdjNqN3ZwU2dqNW5NanNObzJ6d1hZSTB6Zm5XYlFUUXVvWHpvU1VSYUw0NlZhbTAzMEJGSXRwQWViMkhocnhoclZWbHJMM0x5","repeats":1},{"count":928,"lower_bound":"VDhsVXphb1VXdUxqZ1JnUGVkSlBkQTl4cVVGT3VrcFZYaEFlMGpydEZLUjlBUGZOT21GQVJuc3cyQ3loV2FDeDFNTVNlSVhaemNrckdaRjlDc2ViVXR2QzVDcWhhV0dLTkl5aWViZEp3dGNncjJxZ242bVN1eFNYRDBBa0JkYUJLdVJ5WEk0eGFFUFZQS0RPbnlEM1F4dkxiakV3SHRKenZOd1E0MTFZU0xSMW96RUdmSFRVMmRoTmI=","upper_bound":"VFhIZU53N2tHMUppczdyTHVSaTdJM1FMZWo5WXV4YjdjNTV4VDl6WlAxa2Zhb2VETU93d2p4V0Zqc2Y5YUJucEtVQkg=","repeats":1},{"count":936,"lower_bound":"VFllTndJNkhNTmQwSklzUFlsZnJVWUpnREVNMVdjR2tCYjRvb2duZGRnVUs5bXVSbEpOeDdzMmxNdFUwc0tQb252VHcyTWVUSDhIdjU2NzhrTGJjZ1daeUhRM2xqM3FkbGU1T2puS0JlYVVFN2tlejBsNlk5cm9QRXVLaE0yWWxuQnB5NEtmd3NUMmt2ZjV4VFR2TURmM3h5WHd1b1Zna0l6UGNvNTkxb3NZaUs=","upper_bound":"VG1ENTlWM2tkR3h5TlQyOHJHanRDSHgwZ2RjYWh5Nm5nRmhrN1lFQ1FZSHFwR3JBek1JMFNwOHV1NWhaY21JRUliNU05eG50d2tnS29BOGFnRkVZbDh0Z1pwVll5R1k4dzNTVWdGZ01rako0Y2RScmhpcDVRR1J0Nmg5VG1SeXRyMnNPcUdtMkFZcmVYb2wzS2JMY2VXa00wenYybWtpVjFwSkNybHE1VG9XSGtkV3N6c2FpQkRkT2xQV1d6R0o4ZGRSYzBHRDc1d3dGcFd6N3hQYlBoQTBMMjByWjlnMjQxU2tkTTBUTXlLOXFTU25wY3RFc0h1S0plOHVCN0xBWmlsRXFubUpzNGhPQkVKV0d1aFlCdWl3UkxvOGVsOGtCU0RHN2FZOVpzamtBVXZLSzNzaDJFSENIdEpRcXh0MmRMTW1TdlgyUHZMc2MyOTZQRm1LdHQzRUVNRGEzTmZZc1oyM2VESjliQ0UzMk4ydjdubHpOSE0za2ZoSUVUMWRmTVJvRjBacHBTUUdrckJqN01YbWJFM2tHQWhIdmdmaVlReFUyUXdxWExrRUFMMURTeEVJanBrd0MzRHhJd21kMlZKMTRs","repeats":1},{"count":944,"lower_bound":"VG13N0VmZXp6VDcyZHlRc0FCTTloV2liNVV6UVB3NzhNaVhmSUNVQ0IzdDVSejhyMVBQUXdPUVpCc01VekhIbGVpb1NvMW1zVk02N0Uyc1ZQaGNaTWpLY3ZmY01pcmlhMTQ0RFFOY1I5azQ5cTNOOTRhWFRY","upper_bound":"VTR6Mm0zNmRXcWY0NVdCWDBvMkg0SU9TYkY1VEJoSzY2cVMwWGhzWDdwTjBLcEhWQTFKRW5MeVRuVEM0bEN1VWY4WE1FcFF4SkhVWHU5UFY2VDg2OGZyc1ZuQjJoS1JoRUI0MUE4NVJzZ2tpYU8xY0VIVGdhTEVuVUJWUlpHdm5weWs1c3JPWThGT1FMdDBpcnZsSGIzQXZWZzBYYzY4c3dvNkZzUEVjOUVwSDd2eGRFSUtSbVV6WVVtNlNnVVFxd09TRVZ3aEpaWElsR0ZkRDh4VXNCUk5KeTlERmJ1MWV6aFM3OGVQa2I3dEQxVEoxYUJ3MkNodXRPSmNzd2N4Q0g2c0FDSmZGcGhEZGdueUxQQWFxWE8yN0d3V3pidURXTGZWZFdkSWtUY1FrUEMzcmQ4UWdjdE84cGdndWZYVmZZaWRaQkc1OHFTb09sclFoSm1STnc=","repeats":1},{"count":952,"lower_bound":"VTdpR3NNMWE0Mm81Q1VTZ29ub0ZQMU1lSndYd3BsTG94ZkVKQ2ZMdjh3NThKVlRtMlVrenZCWTI=","upper_bound":"VUF2NmhydzRGTTlUczdKTGVYdmxLazZKRDFiMFI0bng2ZTdQMFdOaUZxTzQ3ZEoxdm5FQ1gwekVFdmNUU1RaMHR5WlVlRUJkRnNvUnRSb0dVdkEwNG1hb0dsblBZTXhQNjFxMUdnc0VKU2RKbWRiZGNyZ3JLZDdraGVCam9KdVNkY3J5TlVMTnNWTk1XalFYSVNuWHlKWkd2WEFNRm5SZVdjcGdYTzg2V1RUWHZrNzhPMlJLSGRsbmo3dFNDU2k3S2tGbzBJM1ZjSHp2V2dPdm9GVFo1NWxCazhEUnI2SnJsbWZlY2x2S3U0RDlyT0VFY20zdUFKeEdaNE55MnRNcTdsNGxGWWJoQ3hKOHpIMk9zOGM3S2JDMm1tU3FKVGs0UzJ6ODM3N01iQnJOeFFzM01wWHluS2JTcGNmUk5SekVjemdOTlR0bVg5NE9FaGY2alNBOWFQUEhsWVMxbkZPNXEzdGh4MFRVWE12bklQU0Rjazl5QkZBTDg1eWpSTGFTdWRrSE5YRFlUNklkaURaYVJaUkcwRkhHaERZSFB1MkNIRUJUcU1qa0hu","repeats":1},{"count":960,"lower_bound":"VUZXdFJhd0N1QnlvQVRjMU9id0lWY3ZzVTdNajBpVll4TXk4ZFpXUkhpU0lWelhSRFNHSUZ2c0dzNkNUM2I3bTdLTnF1RmhleUdYV013bXVKdjN1UmhpRVFPZjN1TXNyTGlMM2xsMVdEMDkwV0R2OXZ1eDBCaGVxckQ2b2ZRUmJrTVlTMTRYU2h4aW5hVzJXZ3E1dFlnVDVVWFVnZzBjUzNoZXRtcVZVMk00aWVuZEV1N1ZvS20wbW1Zam5DdG1Nbkl5RFpFNzFUa0xWZG15ZVJUbGlLWjhjbThmZkhQQUh3ajhLdVhJY1ZSM3hnN1FzMHptYkEwTXNidmpnUldKbEtEbzZXSW5xVk9mYno0cmc0eUhROXRnOUZOTmhTYzc4","upper_bound":"VVVxb2hVbGdsUkhnZXBOU1psYzFaVUE4YURkZDU3WWE0cDE1OVNxVFJnWnNzRVA1YjFvQ3FBSVZmNUZjUlBCZ2JPVWIwYWQyd3Y5b1dESmhKR3dHZUR3Q0w3R1BvTEpFZGtlWVlHeUJxVXVzaTVNS3hvbTlkY2Q0RUJDdmppV0c3eWpHOTU2STNFRnNDbjVQTkFLeHNLZFUxa2YyTGY4c0RnZGE0cklRSjFEdDVJUEY1bmpISnpWbjltbGJ2SGJEdGJWRFhBUDZtcTloa2ppRkZIbENqbkpnU2ZHTzl5VXhJVVpVZVpRWmQ3QzFKRm9FRmpXeWlpc3EzcWJCUXV3eHB1NzBHQnJFVjRiVEkzU1hISHBlV0dMeVh2U29KWkhvZjA2NWxGQnllRm9QNUJqQzU3cktMbEJtcm5teVc1S0NnSkphS0VkcE9UN2xpZGE3a252NktVNDVaZWx6YVZXYXNkNlAybHAwZXBCcDhrYU1yMTZLQlBBMG00eWFhclRlVGVzRkdkdDVVRXVkenAyODl1eDF3OWQxTTV2SjFkUDFxTkZlakNyMWlYVFlGWG5UWlVNSTFYNzg4UG1RR0tyUnl4eHZEQ2Rz","repeats":1},{"count":968,"lower_bound":"VVVzNW5jRzZOV2VBbWFOMGIwcU82bEFYVFBubE5OZ0Fra09tSlg0cjZtUVRaNU1XbG83T1hsNk1oNWdLU1JZZzRnYXZHSmgwVUNGR1FEbXFuUVJhNnQ=","upper_bound":"VWRTeDV1RDZib3NlRFV2WWl4TGtnazZ4eUFmM0VlMEhmWjZqdjdEdkxlQ1IwVUp6MmVtRUczYVcwZVlPNkphOFpTb09BeU1xNmkyYTdWNzhGOGhMRTlGMlVpaWY5cEVSeGR0MG1kUDRmNlU0NXdobVNrVUNHd0FRZldFeWdQcVR6TGNYSXNIMlM0MDU2cURnOHF2OGdSSnZwNjZCUkN6M21JekNv","repeats":1},{"count":976,"lower_bound":"VWtHdHg3czBuVGgyQ3VTWG83a1lzUVk4SUdOcnZYVHdaT0pmWnhhMGEwZ2VjVUtNWVpPZkljQlJLQjNuZmJIZXlJaTJyQk9DcThpVlVPOHBHTFdJb0RUdDVSMHBJc29HNDhIYTBhR1kwb2VqeWFqYUR1VVdQc0hSSkRHQ3I2RXVuTnNNcFJNa0N0VHllOXRyZVFtQ29kam43bE1iQXFRQkcwRm5vekVQanpvOElqdklSMzA4OEhpTmRuRmlSSXViUWp0RTBCVklVbTZ6U2dzSk1GR0xzaUY1Y3I5WGtmeHJ2TXdnQzhhS1o5MUNLR01JMFV2enpKNEJmMlBJbGt0ZUpoNnBzRkgyUFhDaHkzejF1S1c2Qks4S1J2eXlKNGRBRzQ2UUlVRUc5cnMybWVZVmJ2M2FmQVJWZ0ZNNDJXZ0tNM1dpS3Bjc1ZJb1N0QTBKTDFWcnNadEQ2TFNaTnNLclJacXozYjNMZXNzNFRWYmdESTdZSDhKUVVLSzJGNW4zQWpTVlh5RkM1TVpiRzNJTmtPd3BCd3VDd0xFQjRKR1JZbW9qaDlXZTBIYmpRUkNZME9BT0d4aDJ1ajJ2NE1iUzh0cmN1S05hMnJCQUduVjVUN1dvWHZlUVVscVdSTXlmVDI=","upper_bound":"VjBpOEFZeU1pd0pMZUZ4NlZsR2pjSWtKMGhEaWJrSFY3MXdjTTJOTkRpVVVoYld0aGhaclY5VVpvcXUyMjM3YWtxcEtiVloxUjhQeGc4TGYxQnA4SWY0RFkwMVByUFJwb0VjdHl0REhLNlN3S2NmMFRFQ3RzMWZiRXVkZVlWaFRmMGVybVpRaEl6SGFuYWVMYlRkY2tNTDBMRFRYeDM4MjBtVUF3a3RZeEdIU0xBdjJkS3RBRG9vNVY0TFVkOEFlVVdmS1pKOXowMjRRS0lzTk1LUmxsRGhwSHZuSEFwSDk3MUVvcmpUQTUwYzBWV1lTV0dSNU1TVVgzd3hyajRvelY5VFdIV3ZJdTdsT2hJUzhBTUpCT0t1","repeats":1},{"count":984,"lower_bound":"VjhlMmRodjdqa0FteDVERnZmSEQwWnl3MEVFbGxIWFlpM2hSaU15U0lCalptSXRrd3FrbzA1TVgxTnJmU1Ywb0hqeWVqeXZjWERMazFlcVlGelJVcEYyclBlOVdlMXFOS0dIdzJOakEya1pJcUJqSnI1ZDVLcnFXSHZlcmg1R2FZNUtUalNDU3NCUnVGMGlGaVRPV1BQbDhuS1RFd1A5Y2NMOERwMXA=","upper_bound":"VkpVYXpjcm94S2g0aVdGY1N1UDdZY09ublZ4NFhrUHZ2NU5tSHg0UVpJelUzVDdkV0kzOFJDcExBeDNWeFhvckVNSDJsYk5SMjYzMlRZM3dVQ1I5TE94Q3VwZnVsZE5TaTZpd2I5WTQ3ZUlqYUdRSEJmdkJYeWJYYko5eE1tREtpekh6UTh3NkFXcUI4NmxjOHpwMlZWVVIyR01BYXc5d1JTdlJ4VXZOZUprZHNsSVlCM2Y5QXV2SklKSjNTZXpLVXFLYkczR0QwTEZWcUxMMklBNkt4ZDBDVW9RNUpqNExZUGpQUUZKSGtFa3A1RE9O","repeats":1},{"count":992,"lower_bound":"Vk1UbldPNTVmeGRzeTU4eFJ0Q2h5NzNkV3NXa2F1U2E=","upper_bound":"VlZoN3FFYjZGbVVlYWh6NG0xUDNYUkVCMWRjSFI1aUFHRUJuN1VWdzRhRkJUTktWRThOeWZJYzkzcTFtcFVpZHl3THJneEFmcVNXR2x0dGZUZFBiaElzVzBYUDFPanBtZGhQZXBlZ3lVVk12ZjhnQlFGeHBwbjdpc0pCWk11dFZqYXpneVJJWnFpY1NqdTVxY2xnYkg4akh3ZzJzTVc0dlFlWHJiOFlvaVlnVXB1Mlo2aXR6WWhscVNtNWlnT2MzMUF4UDAxTDBjQmFVaGNGd3J1aTVQYmN4NlFjOUhucXhhM3c2VktXUDQ2RVByWDdTTmcyMjB5eEJaSWNHS2F6Tm5SZENYWHBWRDI5WXNmNmZEV3QyWnhFOHNlRVpnV0c2clA5TGl3Q0I2YmdCRXBYOTNOUU96SGl5bkFWeTQwaHhJZERJa3dhMWhCZ1g3TkhmYkcwR2s5VVVXQVNxOXVFYWdlcWxkOVJuSnY3NzRZQTM0Y1M5c2NRY3NjOTJjMEVKMmFPb2lTZ2JrY0dXbGRxR2tWajlmWm1ISGpkZm8wTDJtck53dDI5Z0pCdTdMc2F1TVlrMVFFYnJ0N1NpTjh5V05vZHQ2OVUwYk02M0RpWDZ3YkY5VW9Kd1NOakx1MDhGRnFEb05zanhwTVAwcWJnb1RPdU5teUNSYnVUOXAyMUxvRXJqc0VXempUZEVqZQ==","repeats":1},{"count":1000,"lower_bound":"VmZtQjd5NWRMUWljWVR6UjFRWmJENEtzOHo5R1g0SGJXQkE2VDljT0RrdXdZWmJYSmwyTXUyYnZQbHpvdWh4ZlhoVXc4VE1pTDB0RnpqbVJ2Wmg4QUJpS3pmcmxKMzFkSHRqUDBJamxhRmpYMHpST0xqUVF0TnBNaUE0c3NMZ0dlaDl6clNGT0ltcVR2dkJibDRqUFd3RHp3cWYwV2VNYjl2Y01kTlRib3NNSlQ4V1ZtZTE3bXBCZ3JXczRMR2FiWGh6NTdPUnhMWDVKZkRNRjVyZjI3eFFNUjc4NWZIY3NoemxidzNoUjNGSVdlZjhvUGtPcVZqRlNSd3YxOEJ4cUc0MHVWSHhBdFdjV2tXZUtqTGwyeFRyN21PdUNzTFB4ZUdBTUc1OU95Q204ZjVkVjY4ckVOT1VEVFU3NXZNanc3Q0NuYjRFT3NnN1dmeWFBamVKUlZ0a1MxWGQwcDB4aVZ3ZVNKYnVjQWtpYVZSZnd5eEo4Z3hTZ3JmQ1JwSkZmQWJDenlGZzgyYWtyMTQzSkt0eDhKdWxlSVozTDlqYWUzSHBsTmhiMlI0MzVpMm84bVE1V05JanFPeG0xTjZSa21yOXZSYWNCWGdQb1c3RVBlWGlUdW5hWXU4dVdiM0xmWDhKRFBRMm1Gc0pCYVZkblRNWGdvYUhiU0NKNG9GSlFCaksweg==","upper_bound":"VnBmbVhJTjFad05DdUc4alhPSmtLc05OVVFScjRVVURTdjhicnlJTEN3Mzc2allMN3pkS2EyTW1DbjRJTHJrNlQyWEdMT0hPUXhuNjZhSXVvcDc1RGU4ZWx0TTVJZzJ4eEYwWjJtdENBQ1JXd2x5dW5vQ05PZGgzS3k4aGYyWW9UN0JONmU0QlA5QkNhZTF3eFR2c25Nb0N0UGUxSklHZU56U2c4T0hVcWF6MGdad0tMVUV4ck9wOWtzeWlFakhFM0o1R3BFSnFHZ1lIVTF5TGcxQTRiOWtnM3psbHpzYkViM1dVbkFTUWg5bEpXUk9PZGZkaEpDOFNlSjFYWmZkOTBCSmR3NUVvcXNzS29GSnJNSDlYYW1jV3ZJbHdyUnducWN6RHlMVlpHUVQ5Wkc5dTJuU1pCZW1tQXY4UkxuN0ZtQlhTR2dDa3ZpT3BzQ2RKSzF6Y3lqRnRtcUw5N3puNDNqMlZES3JmT21taDBhazBWZXhhMENURGN3bHNJVHo0WWliTGpZQmVuMmZkRGF4N1RSZU03M2kySzhTY1ZVd0JBUW40UVZsV0Fpc0JocEh0cUF5akQxNTlXeFlqaG9JcFJoZVBkTVZNclJYeFJhUjU=","repeats":1},{"count":1008,"lower_bound":"VnJuU2R3cEhzWFVvNENnVGd3SUh0QQ==","upper_bound":"VzI5dnVzcThwTWJ3MzVFeEhUdnkxSWxiY0t5SHZnZ21uVDBpUE5MMzlTU1BSUjdQSzhtMDZTb2lFclRhS3VvQWFUUWl3SHd6QWVqb3VIQTdwWUZWQ1R2UXh2cHFSM0V0dWN5R3NpMWJtbmJ3YUxXekFobXdzeTZ5MGphWTlWc0lPOGtDZ3VGalgyVkw0ckVlc3l3MEljUWxIYzIydnB6UmRnYTN5ODdrdkNISkFqdm9sVjJKWGpBUFFtNjVLMGhoVGpYM0ZvMEEzdVA5SE9DZE0weldiTkd5b1RucTdKbFBFbUtTTWwydmJjQXFRbVZHWE9EQmRjVlVSbVhDN09wZzZXQXpRRGRrMGF2UUpVTlJnNmsyb0ZOWm9oVTlYQ2N1aXRwYWlPZldheDA5T1dTVlN0dkJNRVcwTkxmdkNxR3RsUzFFb3BnRXZsTnZOMHZ2UGhMM0pXRHdsVTZCaHZ4cDNYT20ySW56ZHE5RkNOTXFEaXMzbEN5ZVdHUUlESzFRSTlySmpqdUhQenFGZTZ2a2FkaEQ2dFBQempHTDN2eUwwMHdyTjZ0OXZ6SjEySll1MWY4c0xDS2VaT0JmVHhkbHJzWFNhd2ZUd2x5U1RxOVZuclhTU1loTXhSWTM1QQ==","repeats":1},{"count":1016,"lower_bound":"VzdFY2NoTmJUVEh0RXNXTzBSZmIwYmFNQzVxa0U3ZFhOb1d5MGpKN0VWb0g3emlqQk9wRXJpQVpybDJDellXbnEzemhtdGp1UFJ5Mk83alhGQ2dXWWt4YW1NREVnSjg4MUNSd1BHVk9XU0JGbGpLY1gybjNrYm1ESWR6T1F5OXFoZTBMRzJoS3NYb0pMWVR1RTZTTFFNbzBuR0F0eWNwY1FpeTM4TjNydm9yTjh1bkZpQXExbE43UzUzaEdNWGJnV2VNZFFSVjhXdm42VURiZjFpZEtCSWJLOWtaYXFNWUJIOFN2S0lKd3dEWTM1b0ZJMHNhOUVxSjVqRzdYR1BpbW9wNzhyTTdPRUR0ak5Ka254QURhak9zVzJ2NEFIcnY4ZEs4NEZUY254M1FUVm5aa2pvbWFkY29ieWtrbm9lUVFHZnBiY0hmRTZhTEFCc1Z0TFh0SVd3Q3ZQMWRHaHlZS0puSTV4cGRTdkltd0trMkNkSEd5R1FkRUdSdERIcGNmd0x6RGp6VW9FUnZ5QkVFWDc4YnFwdTFra3kwR3VaUEdiRTNzd0JucHl2UWpEak9ldFdHNWh2cVlsb0xyZ0ppdTRUbk9uZWtPU09uS0xVUFVyWTRxNjkwUXVoN3RPM25haEI1YmQ2bkhCZTVuWmNzTVloYjBYQThnRkZDWWV4akxjam9nUDB1REg=","upper_bound":"V0RnN3NYZUp4VEl2NndQVDhLMmZqczRsNnFrZWpub0J4MW1yZFR3dXhIUUQ3aVQ0aGFqZUpTOGVIVXFGUUl4bTB3VWVDcDF1RzNIMlhhZDJIcllRUFhteTVtcEw1WkhnQmtxbnRaS2lod2NuU1pGQzVCTmFFd2d4czV2Uk40NWFJMTNYQkt4YktsQ0FMZlZ2Y3NFOHlubGVDYVJ6amxzYUhlS2dMZGxTSTFsZXpDTG43cUROQXFCQ3NaTldtdHVjdWZQbmZhYm80dGhEQngxVFVLUTBjQzZMMzZtZTVCU1BJY1BtUk5hNWNyY3kyM0t3VDFlbUt5VVJkVFBqbmhUUTUxM2VKdVc4WlN6eHRDV2d4UEVTT1Vjd014UnQwY09Fb0lDcGNENXRQRlJwc2hLOFpta1huV0pGMHlVZFUzTnFjOVJCS1Nwd0tIYWZBVEJzUjF2M0h6UkVGWXUzSGk1NU04S0F2bklReGh6aWxxMlFxeXBzaFVWVXlvT3dYVzVRcDJPZjdvMWo1QTZpaUZaN2tMSGtQcGQ5VU96enJVamg1RDZ6N2tDV25OUFlRVmlDcXZ4THUxQkNjS0x5WTl2VGpBeWZxa0t2MTNOS1Vkb08zWQ==","repeats":1},{"count":1024,"lower_bound":"V0xyZGcxY2p1T3VlNDRUeHhja0RLMXRDOWM1YWNid2FnalB0N1ZRdGJubUlQdnlRaXdDdlEwS1dPNGsxejhpMmhlYkpLVGFUNW5VaTZOQmFnbEJLc2RYdzd4RDdaV1gxR3NmZ25OVGJCOFVuSm4ya2g0ejI1aWh4SVVIYm9CRERvZ0hUT2E4WlVJdUlSRlF3MGFDYW1PWUFtWUxMelJZUWgwNmJreEZ1Wkd0QzZkSDU0QjdrQnZISVgzWWM3STZWVDN0QjVoWklSS2hDVzJzTVpJUjBuNjBZeFhmTGliRTBva1dadFlOQW1WMVlqdDV5dFVGbEI1Q3c1UDM3MUtYY1JxOWMwZEJ4dmlvbUFPN0hPdkp1UzUxbHE5UHZ5MWZwYTJQYVh5M2IzUlRacVluSU4wMGxIUEo4Vk8xYlNNcHZYV3FoM2I=","upper_bound":"V2NrSU45Nk9CWWI1NmFSMjJkZXplTnJJek1NN3BXYjE4TXQ3R25HWm14dW1pM1RDRERJRmFPVlJMcnk1ZG5PVkRuVGltRW1kakJBOE80RWhwb0pGRXNrNHE5blBFS3NyS2ZFZXlNSHp4MENOTHhKblVlZHZ6bWJpMERPR0R3dDZ6b29tdEJLV0NJOWJtdXFTVnhoT1o1dFByVGZsOGw5cjRMRjdKWnNRY1dpVXUwdVNQVXlIWW1MdnR2UmZLVlBUUHh0MWp1RWM1bHdqVE1OUno3aGlOTmExVEJVVjAzTFRqOU9aNlM2Y0RIcXNiemUyU1k3NmRSNTRNNFcwTGRkdzVvVkdLTg==","repeats":1},{"count":1032,"lower_bound":"V2d1UzJwQ1didTM5bUMycFRCSThwbHhtQXU4VWtjR21iMTNURw==","upper_bound":"V29JaXBlVmw3aE9oMmNBV002ZkRZZEJBNUFLSGhYTWl2bzNBSXA2MU1zOFkxVURSbWtFY3BvYWVyWXFsaTk5ZHNPWGFIRHZyMFBpc21EMGE1NDF3TG9DcjlHMDIwZUwySno2bW41TkZPUHVhZ0F6YWZ4MUlSWGJ4dUdCYW5tc0xGWWhZYXc0M1hHa3NaWVpBSmFKeGUwQTlLRjZWVFhFYTJ1NWc5ZDY3UE40TlFMSGdwbk8xS0hibHFMTEhCNHFJNENYbzVvN2t4eWdKYXdOTmdicTJwdE4yWXFhRFRUMEU2bUlpQzhLalNBSDJxTHpwVzZ2RE1CSllVUGlGSVZmZjBtMkdYdElzZjBLV3R3bXJYbUFvM2FmS1FMS2F3a001MU5hb2xSSjNMa0oxcEc0a2g3MnEyOHpGa0NNd1pqZW5EUzN1STNJTjZ5R2tIdUF5YkRZM0VYR1RJOXRRYjZneA==","repeats":1},{"count":1040,"lower_bound":"V3FFM3JQdWU0TzQyS1RjUzBzdXByVnpmeExXUjNHOEltOFRqbkxmRHRvdnFnaWZrSXpKTzMwSnZNWlRlb2VRMUdJV2FoZlcwcjNER3VJU0hqR01HZHNuUGxrSVV4M2M0SUdRR3dnQ0FSOG5KRkJSdW8xMnRFY0Z5WVhlNEtwWVFoblBr","upper_bound":"WDRUQVVGV0VXVFRoS2hDeWtERm5jdzJpa3ZqQVhhYTRYSkhNU084WHJnNllYSW9CTURkWDBiSjVJNWtOcjJ5ZTNvWGg5d3BTT1lVS2xmSXdoQ2o3U3ZHVVpGSTRwMEhQWTdIdHdmMEsyYUMxNFRHZnNielJSdTNGS3h6RkJ2V2FsV2RXdGJ6QzBvM1RORnpqTklDcmc1NmVYQmxjdXVxSHh4WFhyTDhmUFpIbXR1ZlpMeHdRQmRCYXg2WGxIRWttOWVxTnBnQ2dUdmZJbXZQdW1UVEVjSmdsZllaYUgwVDduNWt4QXRBZldwVW41ekRqWXcwMWEycHlhWWhmYUUwNXlBT2hZS0tWaE53RXZTcFBVaUhwQVdSUVBNZjV6MVRNUlpEM2dYczNodUZOdWNvRVpUWUszZ2ptT2hMaTdhT0ZwRGk3V1hDdzM0SERmbGllRXNRUkhPYmRzMzk5ekllWWcwaDlJWEh5bFpyT0MxRkFLUTc3THVJM0ZUcEVWZHVDM1ByN3NNdkRGYQ==","repeats":1},{"count":1048,"lower_bound":"WDl5WDh0NTVNZzVmM2lhSDV0TERhUGtvUkd1QVBodGJkZnE1bkJvVEpsWHhLUE45QmZjQUNXS3I0clFqN0J3bHNKU2g4WFhtc0lQUnNNWklYUG1OTGU4SjFSVGJrQUtoNnM5WkZZUm5JM3cyamthOEFIZWlVc1lNWUNaOHBuQWtRb2NzODlMN0VhN1o4Sm0yMjE5M294b1VoeFlNejZtdzNhelBHUlZhd1hPakJFVUZJYWF4dW15dkRoTkkwQVBuVEdxV3NRWFNOSEpIM0xPRW1BMmNWR2VSajBuanFRV3VyWjVETlNVQXVPank3UENyYTBHNHhUaDlOb2pKWWJnRG9aR243UXpkbngx","upper_bound":"WGY3ZTF0eXJtNU9Cc3M4S3BkdWdRekZaOUh1UDM1OUF2YmFiTDB5bENoeGN5SVlESldWck4zSGJSZzZ4ME1YVjd3cnMwOWpGeFNlUUlWRE0xblZoUjU4SkNHaVBHVEg5N21CMkFUN3BTV1BIaHRwSHRMZ0hIa01JM0JGNGJtdHdLbFFHNkswQ0NodXY2WUthdTZnZzBPeTNod0ZZendCaWhtMTR2NWlzelpDdFMwSFRVQlRBOVQ3SG04cGplRGx5UlVhbUdzMmVNdTJRdzU3eVVXZnBBNXc3NFlFZUc3N2JPcldPRXBEM2lkOVAxYVNWQ1hYb0dPcDlab3Q1azBlZzNZTEFvYWE3R040ajJMOUlQcVB4d3I4UE5MT095Y0FEeEJneXJFcXRpRW96bXJlR3oyb3FTUzlEYnFDb1FTMmxKRjY0bHRQeU0zTTJFWlpxdkQ2R1BMVkUxRDJRcjVYOTNQY2ppejNndk9QRGtLV2lhNGtmZVp5U3RMMThnSzBZVEdueU5ZSFd2eTNxSTRNZ1UxYVM5V3FlSXNNVXc1elM0QmRPZ05uMTdyV0VpN0NGb29Nbmgx","repeats":1},{"count":1056,"lower_bound":"WG1KRUM1M0t0WVg2Y0JMRzZ6WHV2b1VSNmVteWtEclI2QUxDTU9uVkwyQWE3TnQ4QVBES1gxdnVXVHVZa0JZcG13dFNYS2V6eE03aFVLWHVjVkg0bjZEYm9nWXpkbVB1NDlmcE9xZnNWV1JJWndyckNjbmlqaVpaT1BXWnZhaFQwRlBBQ3JacWdiQW1GRFlwRDl2NDUyRFVpTkZwdHZCU2JTalNvWXVxNlNxT2t0ZGpXT3pZRTBJSjRyM2szYnB3VHpVZlhhS0ZTNkpQSjlxSURNQ09Fa2NNd1dVS2VvN2VYbnBUeFA5dVpjdEJFNlV1V0g3S0ljVHFvNkdKakh4Z0xrc3F1eHZXVlRJa21YQmlVRTJZVUJINGlwVHhaQXdkaVdsTFlEVklq","upper_bound":"WHJNQTVGNzAwWE9tS2JMSXVmcjBNYmJ4QnNpZGpvMmo3ektvbUd5eDE1ekV6Z0l6dnVIeklZUmY0WTA5NWt1VndZYUJJVkhwOVprd0N4Q3RGcHluajhWUkV3cE5TemJ3SnhNY3lXb2s5MjM1U2t5QUdQUEpQeVBpSWFGTU9XRE81eEU1MkF5NjlCWXBPY3BqNVhTS0kxOWhsSFRSa1pJb1Y4V0k1Y243dVMwUjNrc3JTdE1CTzQ=","repeats":1},{"count":1064,"lower_bound":"WTBwcVZhaW5RY2ltYjhRdHZWRFpCWVpaSmN0ZXBSWThNOGozZ3ozNnlaeGo2TmNjVlpzd3VDZG9TbDhsQ3EyT1RnWHM5Mk5SUERyb3hKTTZGZmtET2VHUlhRcnhsRw==","upper_bound":"WUUzc0Y5R3EzTVA5VlZqZXFrZWdUMUxIQ2xLVWtTR1p6MmFFQnNRVW1Rd1RGWFgwU1ZPRVBTNHdxY3JjejFwVG5ITkp3R2FaNVFVYnJCNGxUTHRIVmNZUVVDUFpxN1FxMU9yMTY5alJTMzAxSFJDcVltR01rYXpaODZseTNqNHV5MjZuM01VWlg5SnByWlZqR09WYURwUFloVFhLd3lKQjJMUnBCemZ1QnJmdUVQNkxuOXJ6WnVEV25vU2FuTlVnbkhSQkxlSUFNRU9LdnZtbEIyQ2hRMW1kNWRXTDd5Zk83bVVzQWZ4U0JKUkdyY1N6bk1mazcyQkh3UUZMTnhXY2tmQTNKcWY4YmJxZUV1RGlBaDNBOUx6bHVKaW1vRThjaEpHRVcwdHBpdjN0RW5qdFdIdGNYTkUwU2pTdTRMWHBKY051SVVNV2pRUDE5WmRmU3BmUXU5WFdXOWNRdGVEZ2VzV0pVSWlTZlBScHNNOEJNV3Qzd1hxQlB4SFBrUDV4cjR4YkM4M1M1VkpY","repeats":1},{"count":1072,"lower_bound":"WUVMdlhWdFJEZVZZZVpoMngxUVpCZk5xM3BValpBdlJDYWlyanNOTEZITUw2RFFwdzZHSkttNXBEd3RhcTlxS0Y1c2ZCbGxHMTV3Zm9hVk5tZ3IwSjZYOE43ejIzSDAyMk9NYmxKNDllTG1hZ2RZM3BwTXVxNG1rWktiSllpQ1pRVHhQeWtnNWxiOTg2RDV3emZqeXJnc0Q4ak9UWEtCTnBpRm4zWUdtVm5ReGJObGxmdU1RMmQyak9WNlUxNk1BcFJKV0NuQjJydE0wdGptaWpQcjhaWHVyeE90S0FYdDFGZzRMZ3l3SHZ1R1VrMzZUSzNQbW1ObldPNE1VUmc4QTk0NElaeVZJbWJXWDFUTEZZOFlQeHhaejU1S2wxbjlremFQcHIwQjM4YVczTFJUSmUyOUNKSlNqZTZpUHN2RUlrUkZDSk8xYk0zZEdrM0daTXFoaFh1TlBLQlF4M3hXb3oybUZJTDFXZUVzeW1UQU04OXUwZTNVQzFNdWp3cVBUN3hGSzNzT3UwYWVaeUR5QXJUS3VlWGNqOEJMMFpteXE4cE1YTFAzOFVnTENLYzFsUmJSQjRLS0pIV0I4cWE4VUN6MUdMWWljckVVS2c0ZnE4bmpkMkJPVUxuc0duT0VSQzgycklGODVtSFVRWE5MaG5nSFZsM2l5cjVWTVZZd241YjF2TGFNZTF2ZkJpeEJoVnI4Sg==","upper_bound":"WUdPSw==","repeats":1},{"count":1080,"lower_bound":"WVV3Y2xkYlNqVk91RDZzaTNjNEE3bVlSZkFpakNTOVdXVmtxWmI3VHp4NFpjSDdiakNiTHBUMm5GWktmaWNRSHdVOVA0d1BqQUNZbkZGanQzQ2RkRGFtNE9TSG5VcGYyTG4yMnN2NGVwN3dtZ2pScGVxY1NXa3J4QkJpSEJGNG5LZEhkcGtHVDRhVnFoRUJGQW9YMHNYNUl2MFhzNWpxVzRKQmxvWVpBTXNNRGVhMzBpZE53dUdrS2JWOG5SM2pjYWpnNTMwWGxDUWNZUmtydk9IRXR6amlhRW05SThGdUdkU3hIak5vZ3U3b09mNXNMWVpSUzJaVlFYYVJEZzhsTkJTZFZJcVpnQWh6bm41dnZEY3FGeWZ5","upper_bound":"WXBhRGJ4cDA2ejRFa1hlY2M2QTFXbkpsdGd2aGlVbVd4dUdWU1dyUmhZZ3lQVkZwbGhGUnQzTEFYOW1EbmlkbWtmMDBYVEsxQmZoYTFFTmkyYTg0bXNDaHJ0R1JSMDhMcjdrSFhCclo5RGFOclU1bVZUZzZ2VnpPSmJ4Q1F5VjFwazV3cDFyRkQxNFBVM0lMbFhIOVRmRHBHVU9YQUo3QWpXMldtRmk5bllmdjc=","repeats":1},{"count":1088,"lower_bound":"WXM2ZUdOc3NWWmFxR1dpeG9jZVhoQ21SWHhRRHlUYlozUktRRTV2b1M5TW82NWxwY0FscTJLcnRjRHZrUWlGVW1jTkRtS1g1aVdwQUpuRFRZbldXZlRjVEdPankwTWRTYlltNFNvNXE5aDlqRE81RTg1dG51OU1RRmVUWnVUcmxGRzlEV3lGMTVqZE1OYU9pNnVMb0tXandWT3YycDVtdXVma1A3cGxOTmlFcE9ZY2ZwZU50RzJVVDJFNzNram83c2czZ1hzQ2JvbGdTNkgza0JBSEZhWVo1THM=","upper_bound":"WjBHc3k2dU9qUk1hQXVTN2RHMWFPS3NSb0FtODdmVHFBWG1PT0FCdENRdjJNaFFPWjZTcGtWeVNKVFpodW1pa2VpRE5jRnFuTTl6ZFBXeW03eEZ1amRPTlp2dFpBaHI3blpxRklCQkxtS1dRSG1HNkF5U29tYmZoNmZMbU9iN0duNTl1SW9xM0hzUmdmZ0FFZXFCTzloWlE2T0llT2Y3MFprZGFWV281aWJoYURlTTRMeHBENnVpSUhLanZ0NUdvcG1kckRmSUhvQkRsenkwNEs3aFNXdFVWT1Q2dGNSeXh6WnRiNmFqbXJDd0tZNkFkeWxmNlhkc2lsVWhrYUI2WWlEeHlnU3JBcnJyWmc0YkUxckswUjdTamdqWVdBZ3dSTkRzdHNWdlc0RktUTjNlMTZmOXN4c3Q1QjVybXRSRTlPcVJjNTJPRVBMUkVCTjJrNk5UczVwMmQ2UXppSFA2REJWUTZhMmFsUkdPQ0JjdFc2SVdoUmt1UngwVldoa0hlNUQ4Y01CcnNiYmVnQlBsM2VEOHNBUUhSMUV2M0ZBVHVnVHJ0U1ZOVHdCV2RnSk9FelhnU2J5UGpkUlVMaU1iUkNYRWZTSWh4NnhIS1dIMm1zc2RUVkp0QUZ5eGRETw==","repeats":1},{"count":1096,"lower_bound":"WjJKaktENFNzSmdXeTFBOU1pSmY1TUdhaTNkbVpvUHNzcFhwSkRvV3JpOUVEZGplMHFKaTRlTUxFZHE0Zk9lOVZZRUk4RjdsOWlLeDJmdG43VHN0RG1nYmVXeVluZnRDNnIzN1U3eTVoTFZYRVI=","upper_bound":"Wkw0MnZRNmhXM0RESEJRdW1Iemo0ZzVuYnlVU2dDam1QN2pTR2VZdFBoQUdDbTk5bktKSll1Q3dZVEdjTzVBbXh5SExNSWJmVHh3U0NDM1g5ekRGcWVWcjh5YnNKb1hEZUhtZUdRNTBIUA==","repeats":1},{"count":1104,"lower_bound":"Wk9MMUhHUkk3Njl2WTI4TDRzN3hMWDE0T0Fnak9POEJBTUZIb3ZHVDBLTG9TQnBnUXBUNWJmMFhvZmxPSGNPM1BteWtCMktIMnhTMkNJTHZrdldRYjc5UjBKUGxubHlzQnVkS3Ftd3NWU3k2UE84WHBYdWhjYk1MbkpzU3h1M09Lb3oyVHdIUmZoZW5OeUJ5RXZtOFpvZ0NZc240a3dPRmRIQU9sd3c3NDc5cHhWRzB2ZTYxTWhVMmpZU0NpUE43QlJvVU11RDdSZDVoamd5UGZDODFLdVk3bms1U1R0WE14TjZ5VVN0WUM4M0JubFY1WENNWWt2OXNNc05DSGE5QnowaVZyS29BWkZ6elVHd01qdE44eWpiTmJ0STE2UUtkS0RVcFdVNnF0NDU1N1NPZEE4UkZpM3JRamNJaTBEM24zUzhIelFsRW9mWmJCcTc4WkRyWUlSRFZ5VnlCd0RCM1RVd0dBSHdLaWZVaVVSblJHRm5pNWVOcjVGQ0VmQTJWRVpjdzJXZUxic25oQ3VPMURraE1zZzZrQjhpcTF4WlU0T3hKRXh6cng4cEFjbEdYTno0cHJTTlJ6dXZNSTJ4Q3cwRjA4QnV6VHQwU3Z3eVdqTnh4RmFvaU1xaVMweQ==","upper_bound":"WmNUanBMbGlxU1c1eUJVcWp0Rg==","repeats":1},{"count":1112,"lower_bound":"WmZBRjNZVGxTZ1Q=","upper_bound":"WmtYM3BscHhLMnc4bEdEZGVyUkJMTVJoQUQ5bEkwYjlwM3hza1d3ZFFkemxaRGRDZWkyNHJ4UHBUUkpaVjIwblVQS3BIbldKMHo4dmkyOEFTSE9FQ0t0MUZ0bDhJZ1F5NEpmQ2Z4WEFIbWw5QzNlNDVxWDByNTJWbzZ0OEdHaWhQVmFVYjAwMWRacVk4WjJIdkpndGo5SnZoUXZuUzAyVVBJaFJaaWVCaFZiOHgyMXA0cjRBcXV1d2Zydzc2YW5NUFRJWnJJUzNjMTB6Tlh5WDljNWV6UTk5SjN2dkI2a2tjcmpUdEo2RlhRTW40c01kSDFLbmdqbHpkbHpwTTZzY05QNDZrNGMxc1JPOEZyUmdOb0N2VXNnZkIxREN6aEJmRUlyZU9VcGFpelg5YWZHYVR1Q0Z2RjBxVDJIU2drTzhuQVdLdnUxYW1NVkV6SHhzem9uUXdScVllSGFGRW9ydUxLVXA2d1BiUTA2WUQ5OGo1MFJwN2ZCN2lYOXhuSE5uODFraVBHMlROWEQybWtiNWtnV013QklZbFl2YU1uVUlHRnVWa1Q5UjFadE5ETkxrUUJMcnVQZW1zZFNsWTZQTU4xU3k5d0w0VGlDaldCekpvNTNYU0RTa1BLS0RKNU16OXdlRHZXYjNtMlNRYnl2SnlrWG9yZ2dTR1ZMTUcwMVdRWW9Jag==","repeats":1},{"count":1120,"lower_bound":"Wm5BTTlYOXF0NGNVZUdRZklhd2ZJTTQzcUtGZmNtNzNrV2tLMmQzbW55b2xyRGR4RDBzcVYyYnh5Q2ZPYUhLYXRRYzgzd2cxamlIcDVGdktnalBRVVZRd2VqZDRmSEJhS1NtVm5FUFZFSUdZRk5jZVFCcWFNVkZOWjhxQ2xYYmNhQzZ3dFJvMVF6R1BoSTRDUUtCOWgwZUhWdEZEOWZGcG1oZENEVlUxbTZuNk8xUHhZVkhobjdQb0NJeWZyOFdXbEQ3RVQ5c3l0T1VFbFBUYmxCQXdPM1l1S3VmS05UUjFvY1U2SFVRbnJCUVpPN0MzeHk0STh5NmZxTVlzeG0ydUhuNFNxZTNPRnQ5cUlESERSYjJUQW9QWnhtOVpURFdPNXo2YVgyWWtuZ254ajBnemY0Mll6ZXBnblN1cjA2OWdEdUtqbTExR2Y4OUhWZGVrSmp5VHNkaU1pUWN6ZG91azZveVkycktvb29hOW5XUXZBRXpJVWdPdGhSZVo1THdnNUVyaG9Pa2hLZmR1aDJkS2JXRzlDQVJzaHNTa0psS1N1dTVRbmgwQmJUWmMxcVNMNGRZWTZKRmVa","upper_bound":"WnpLYVJtaHR5ZXRFVDd2VkxUdFdzQmZaSHViOVYyQUNMWVk4ZkFKWkh2d09sdHpCQm4ySnA3dXJYRUtSRU14a3Y1UDB1c3d4MUVIejlZSDI4V0NWaVZMemIxT2w5d2xVMzNVdTVFZmhDN1lVWTR6NHI3U2dBRzhUMHM2OVNzdGY2d3BQbkJpeXhIbUpkNTVZa0ZZR0dZb1phNkpjNFk5M1hYZkpHSzB5NGpVV2FYNDBiM2tsU1FxQmI1Z0RBVjJIRmJ0eVdndlJyOHVHTlBocTFmYkVrTDd1bGV3dDZFQWxhRWRGSXA3QXdXa1RVRDdSazJ2c3BVQ2dvdDhYeER3WmZ1alg2WmJQOQ==","repeats":1},{"count":1128,"lower_bound":"YTJuTnFHOG9IcE5VVW9Uc0xmS3R6YVN1dzNyWUtnMXpMeTB5QzhlR3pCN0VFZTRkTjZSa1U4T2hpd2JETVlNU2E5T2dZN0VVN2N2WUhJSnQxUGxmaXpkaTZpSU1yWmhh","upper_bound":"YThQS3M4U2NDQ3pzNmZDVE1VandIMXV3Y2tRVkk4SlFRUVp2dEhmcWZvbHVZZ1J4d0dSU1Y1SFZCYzZ5MTRuckJxSHl3TWlmblVwZHQ2eGlrUTVuTUlRdm1QMVZra1JzcURJbkxXYUxSN3VnajhSWWZjUkJZYnltdFpTbEJvR3FCNUd2WjNIT1JLY1RYcFF1RU9hUlFYTXk2NkdDQUF3ZmhYbVI4S3hRVThsdHBMa3Q4Rm01cE5XbVJIbm40d25meVREdGVnaXFIcDdVT0hDSmdMZ1hIME9Va1ZqTnZ4a3A1dHZvblJQMjVTVHhWUjQ=","repeats":1},{"count":1136,"lower_bound":"YTlMTXc0OEg5NkdKWnBJMDR5WWJVeWJjYmRJTGxWTjhDd2QyN0dQWWxFV0FWdjRNUUV6UUJqbWdkWlcyUXVSSDVZeERwbWVxUU5tTXAyWDFHdXNuM3VPWVFxRjlxVFNLTWhYQWc2QmwwNnJEcVl2NzNNN3h6TWNrd1AwR2hPeEtkZlVpRFk5b0x1TTZxc3dzUDRIWmVVU1FuaWh1VVZubmJCUHlkaHdMbzc4NEh4ZXRtZ2NyME9GdG1KWnY2c1NOYXJNYlMydDN3QUVZa2Jjdlo1aGpxSEZ4S2g1ZDU3YlZUOHg0bTNwSUo2aElmUFJlZEpLek1ITW9lYjZqUVJBTkIyNEdyMnF4TnpMWExwbDNzRlRpazQ0VWg3Vk5OTUkyZThaSkN1QkRRN3c1RkFoNXVLTVRNN2RwaUhSN1RZU1JNS2N0RlRyOXprTVZCaVl4dHhDZjY3WXIxSDhHSXpwbUw3NUVnNXB1MWhYQk52aTRuaTBzajBhYVg1NExtOURnREN2UG13ZDNEVUpQcXZQY0pGcmxKbUhFQ29QcXoxOGRZdXU2SVNpVkR5eTJBWXFnWm95aG1mTEl1MGVydm5wSlU5VGFyeEVTeHZId2J1blNNOUhoSm10aXdwMXVRa083YmprbnJDeHhUcHJseXhOSQ==","upper_bound":"YUZpT1lQOFVwVHJkZEY1WmJSbnNzZmhnNnFQVnpRQ0MxaFdOck9ydUJEWER6a0JaQWhFNW4zaXBXU25valNkaWJzRkxFVWxxbHNOMkFDcEhKajFpV0R1SUNMN3Z5eTRnRVZLOVdkWEZwNjVLNnBEcExvQXczc2xRVE92aFVOUndzSW52RHI=","repeats":1},{"count":1144,"lower_bound":"YU9IeEJEOVg0SGE3eVdUck92TlphdDVhWXI5N3FCaXYyVlpUbTBKZVpFVXR2ZEdnY1VDdEFmR0VkRVFCYnVvck90bTQ1Tk1OTzZtYmFZMDNjQW10Q2xXN0pPTUkzY2xwbW52Y0w4bXo3WW9qUHhVMThUY0ZSUWtIQXdjVmFSNElSY3hpTHR2WE5KNkxxT1htMVA1VkVGUjNBTWFkdUpwN0w5Yko0MXIxWnBFT21DTUhjRDVtZjl1QVlUaU83bHJWM2lnM2pHcWZYUHVSZHRIYU0xWUxtRmcxU3JkVmtMREhLMEo3UE1EMkhlNG1JWjdBRFRncEJFNXY2U2NJQXVsRGliZlRTbEJtaDNjN3pNSXBiYTA5U3Z3SE1ETEFteTVjZ09tb1BTNFZ3OHZYeTlXSDg4NGtndmF2ZWdZOTB3dnB0azAxQm9oeUQ5MTJKamRvMnRGMWRnVXhQa3FRbm1lTEZpcHExOVFrRGpib05RZXFTeUJpb09rNFQ3VGp6VnFhSnFqT25VendTT2dRSlhXVkNrekFWdmttZFBQQlVUc0dTMVRPYUQzSFRuMDBYTVAxaUF3cTQzeXNBM2Z4aG1UZUlhUGNaWThsQURVaGFkSGVCQUZmVUFRZjBaMGJZUVMycGthTFV2MHJaMWsySHI0Q1VXdEoxNFF0RWxCdkZ1R1BrZnNpc3RYUzN3eWlIazU5ZGk2MGdlYnY5","upper_bound":"YVZjZFlTenFPM1FqemNvMzZ5ZHJ3aHpTbE0zeFZFVG1aZ1hPc2NtZ2xDMndsQlk2bWJTQ0NUOWtJMlZSdHMybkxwaUVsZ0lCQ3VtOWs5OGUzWlZxd0xMbTRoUTFuMk5lT0xIWlVORmRQU05KSlphdExJRU4ya1p6SVJqanRqdjFkd2FwZGF3N3JyYXRJVkpRVERKTUlnRTdCZ3JQSk1jT2lUcVFpUlR6ZUhjeXJCMmpOR2JIRWUyWlZwTWpFTFJYdjJBWjNOdTRqSVlkdEtpQVp3a29TcThaQVNsc0haeG5IZ3p0YkRBNzJEVklXdTFHVjVpdHQ4bEZ3Sk4wTGRSdzB5ZVhaUnVFT3BSVFdmTGE5ejR0eFU3YmdSSnlDV0tqdVNFRXhzMzVSYlREcVRGcHo5ZVpYQlBVdWJHREFDbnpUV1NyMGYzWm8=","repeats":1},{"count":1152,"lower_bound":"YWJKOWhJVEUzNFNReDFrSld5bkY5d0I3TGQ4aERDM2xINVU2bW5xZ2RrUnJXdlN1M1hzOWR5cmgxcnRxZ1BDckJ2SXdMNnZkU0FTZ0lJakpHOThVaTI0OUFyQzYzdFZ2cnUxQ2liQ21zRkFPdkZrWDcwaWtWdUZlQWRnMlFiNXBGNFQxakhLYWRLWHhjRHp4NzNuNVFkeGExMHZaZW0yTVI4cFdwNk1HVnpTRFZiNnhKQWY3SjNtRnIwYjVOYXE5bDBKVGhtZFBXaE8xeDYwOW44dzU0MHVST1phOVlyQw==","upper_bound":"YWVtdkpQSDBVU29Ba0djTFNYczB2MUdjOTcxVjN3RHlMTDdoWlk3dG9RdUltUUd5T1ZpdG1NVWQ3dDhiQVg5SU9qUWFoaXVxbHBNSlI4N0p3bGkxc1RzQUlvN1RGNm1SY2FERzdBdWZ0eUR2MnI5WXFWS3hqd2hOcDEwU292T1JuU3NKWFVGMTZmVWlzbjB6Tk5jUms1eG5KR2twUHNWSEo5SFdLRzlLQWlzdHE1bXFYMkNMaEQ=","repeats":1},{"count":1160,"lower_bound":"YWdScEU4VUtNWThSU1I0QVZKTElKTVhEWHh6em1jUXh2SDVzdDFtVXhLN3hSZDd3UzZVWHdOVnpDV0RNM2h0UXhSa0lLaVgyVnJ3dGtmdnlQZFMxR016NUZKUUhvb0M5Ym1FS3RkUENkeG9rQmp2TXpyNmZGVGVBMnkyOU9ZenFyZE1Hb09NZXQ2UVg5Y1M0bWhueE9vTEVqN1lqZlJpMHVUUEw1WDdGSUJyNEppWHdWQ0tXdHZpY2R3cmxST2Rm","upper_bound":"YWpUZEdxQ2k4ZE5wVzFOVXZYdlhtWHVHUUJkdDZ4cHNzQU1rNnczcUJodGY1d21zZjYwWkF3RW51aGhQam9mWlZhd1JBdFdtb2xVRzBveExSeWhDbHdubmxmU1V4NGxmSlVTQmxTWTlHSVIzemRtcmJheGtMaEtSOGhSYUdtbk5TVGg2NnR1TFd1VFMySXhkdkl6QzlQdWhjdXJlZVdXd1dJdzVPZWlWbDdXV3BzWGIzd1BFNHBENTNVTjFLakRZVVJIU1dlczBmdUNudlRNc2pCUE5ROFBJTjJzd2FOemE4N2x5c25za0VtSEZpdHdVTDFmSEY5THhvOEFRTU14ME12QVNMTkNoRGtoNEJVcnAxMmh5WDlFbU9rcEZqNGRZbE1IT1VPRUdGMGhLTklmTEZ2ZXpORW1kemZZUGZ1QW9oQmN5NFJoYjdxSGZIR01YcElnU2hpbTVleHA3elcwU2hYZndoNWtTVVNHYzNjSk0zUXNTd3dDMjhGWDFaMU83ejdXNkRzMlVyOUNVSXdpQWZqV1B0REFFRU1OT0V2Z1FISEduVjFaMkhGbG5wNld0S0cyNTJvVFB5REcxejhQWWU3Y1Jw","repeats":1},{"count":1168,"lower_bound":"YWtHREk4R2MwYmdPZzlLQmlMb0xCREp1RGhscGJwZllTSG9RZ2J5SWFOMURDYW9UYjFLdlFNdHBkeVM2SGplanlIR2JEaTRvazYwc0YzbWtUY2hvc1E0ZXBTeTljMzRLN2x2VVFXS2NHeGFZUnB6ZFRKSGhGMlFqTkFuZW45UzFwNXR2aUUxbzUzQzhldGdTOXBEd1Q0dHJ6Y0JmMFl3UnhZTUdWazhlSHYwWmNHYVdmV1kwTEFtZA==","upper_bound":"YXAyN3RjVU9vYURHMlRySjV0MDBZdWU4aHVjQWFRTmVxUU9VckRNMWM0OEU0R3RDaE5qa2tQT3R1aTNRQ2tWT0k2aXhiTjcySUxHb082TGVZOVdiMWoxcExHbVBkU0w1cEdMTjJQS2NPeFU4SGNQMVVWa0RjQjhFYzhkTUZuU3ZTWlVUU3F0RnhVbExvM1JiUVMyNUNWWXRBcDdha20zdjBUdDVNcE50SHFKSlloSmc3Y2ZHQXV4WUlnaVB3bkxaQm5KSlFzM3JlNnFua1NwaGFuRlB1UDVSWVk1VA==","repeats":1},{"count":1176,"lower_bound":"YXVmRVduNHpWNG0zd2NTZ2pqVmdJTFlDd2VEaURiNVoyZGYzSnB3bGQzNFJldURqUmlVeE13c0F3SnpkNm02Yk1XZEtZNk1INzRFNGhFVnR5enhNbWNUTnlRNFBKN1dkSEtEOEI0ZVlocXNCVVdhS2hPbnFnbWNJUHcwazB6dnBpanNRaWNyYXdKWFlVSlk0S3dSamM4eXlSRVlqR0wzMW1wWjR3WGJYenBzQXB6dkliRmJqNml0SFZWd3ZoQnd0UUFiaEQ0WjBVQVlKSGpTUjhhWWJkYWhSbW01OUhkZGhlcE1vMnI1azJkSDhmTkJGdXZqVE5lQ0dLN1h0TnFCdUJnSUtwNzZ0Q1lsOGllb200MzE2eENvZG1iVWczcW5pMGpGbUdnNjVFM1ZSNFdIV2JIZ3ZLeENkbHZ6WXY1ZkFWV254c09yVGtvckc1a3AydmZLZVZvcWJwSlpKeVJ5M0VmVDJWa0lOTng1N1d6VUc1bUc3UXk5Skl3aG9FSDZ5WmlQb0FvNldxdHFjUnZ2MzN3eUhqY2ZYRUFhbXBBTkNJSkxUOXhvamlGWE16YTN2SWI3NUQ0THkyc3k0eEFxdFV1S2xMZWk2TkFvNzV1ZHlqcmhCY01ZREpUbUx6ZVVvZnZqQ0pwejlFRlQ0S29vV2VoY1pjVXp4TlhFdVR3RG9aMGVqaXVDUEExYWI3UzlSTmE=","upper_bound":"YjVtSWJOcFo4dDlPclZVMGtvVzh2Q1A1czQzTjlKQWkzVUhXTHY1dTBpS0ptUVNsM1FXdWJ0WTVsMlBxN0ZyVkxDb0xTdnVWbU9ZMWp4T3A2MG04TzVPY2xyOHo4WmhhRXNJRlVJOXFwQ1p5UTlqYjNkanUyRDFZQjRhM2V4VTZNSXNzbWl1Z0lDTDA1QkRHb21sVDhDUGZrTjRFcGt4eVRMWUxjME5sN0d0cUNLU0VzUWpZdmVpR0I5MA==","repeats":1},{"count":1184,"lower_bound":"YjZVNkFqTmhwVXpQSXdYajB6VkRZZU0ycmN3a1JTWTJyZ1lveWRUUFAxTEg2RU1wOENEaWdCN05aemFCdTRMakx4NjRNbGhlWUR6QWdrM0VvZWhYUGV1NUhUYmVRWmRoNjNocmtFV2trbVRqT2VmZFF2a0NaRkJlaDJkZElhMXlmRHBQcGtYM1J0ZTRxV3h3NXJRanQ4bHM2Y0Y1SG91T2g5MkVFMDA3cFRnalYxb3JwSnVDS2piZHVIV2hPUXEyNGpOSjFmcnI3eTlwclVnUm5SWmRYcWh1NVlma1VuS2NLeW5OSVM3UFJ5VnFGazJoVkpMYXRFZFI0SURqWnc1OHJ2aFRCS1V5SEVtZjhZUzZ5SXoxTm40dFlDRGcwU2NqWm5nNGR4eXpNT3JWQTdDTnR3VFk0YkhIY3ExbGtNUktiYXRTWGVjSlZGR1MwZlRpM2NmZHVaOXhmZ0ZaV214TmY4YUVJZWZYU3hheEJZR3lYaTVZS2NmRlZCQkNrNjhQSFZFclo1RzNQQVFQZ28wbEhtOG5GTXhhaWVHTlh5dFhRTVJPd3FmNTJ6bUY1WmRmeUhSSVlQMDZrZFFBeG1aOWF4OGRrRGlWWkFwa1R4UXlwelptRVNqcG9XeWprSVJybDZLa1RTbWpRcA==","upper_bound":"YklQUHlsRzV1a25HWVNaQjNVWVlGSXdKVWdlTjZidWZVZDJkSUp3QUIxSFBrbndsTUNXdlVYYU9GQkoxOUc5ek9FMUs0dFZOSzlaQkRFcm1MblNZZnJxajVZZGRrbXNWeWF1aG4zcFppT2MxYll4ak1hMW9nS2REeDBFTkJ0U29TVmUzc0ZEZENNTXBxMUFqejBuZFRtak9qclloUnpGblFVV2g1YnE0bWNweE50MTZYMHVvaklxRDNRZkZiUWRjM2RwYWFVdm1pZTU2cmRrQThZUVdKUUJxMjZHUEM2QTNBMFJsek1QTndySEhOenM1a2pLQU9sRVd5ZWpzQU85TEYwN2ZNeEZ2V0x3RHZqYWNqaFM1aFdPYWtrYTJsVUlUSUdFRlJuajVRVEdaYWdXejdVVTRpZFhqbEJ4VENGcWYyY0RpZXR5dW9ZREtrVUR0bnFualV1eG5YbVVySHQ3U3FVVFVHWXhYR29NRmdnelN4QWRXb3BsQjdtMzlJRHFvNFF3NFdkekplZWtobENQZnhLNkF0d0xjSFVyRlJIakpyT05CbUg4QWZQaGl3dFlGcVRGRW1HZE1iN3FKQWFwcmFxTGNyZ0VEcFVkeTRhOFpSWmFuODBsUEwxcGw4a0YyaUJwS2xleHl4RVFCUGlRb2pWejhH","repeats":1},{"count":1192,"lower_bound":"YlBHV2FBUmlYbnhjUGZ6ZGlVTXgwdmVSNW1WOTFnbkpMcnEwTWMzdTFMeGFkSUtyQWY4RGFoUHh3VjZLMWxPQjVxV3FiUHlMU2NZNUtaOWZLV2N0WG11amE0ZENqSFdwckJZbUxrdjBGTE1Ec05tU212MDdzWTJiZEpBR0RBWkRUU1h3S1Y3dzRHU2tzZXQ3UUVFM3JTM3hrRDFCYnJ2dWxTM3RzMFp4Mkp5c0JiS3VHZnZZTkIyZ2p6elQyWEh1bHRBbFo4ZHFvMURLaVZYaGRNZnFGRUY5Q3ZNZkN6U1pzRWdZQTVlbFFNNzhTMzlWQU83SHRLWFljdUtYa05XWGNpWXlBZEc3aURpd2lKZm5zbWQ2M3pteUluMEFpeHdjUnJaYmZ2Rlh6WFhCa2FwS2twV3BzTEI4TFpNYzI1SWQxempaaWFmNkx5TUJudTQ1enJ4MnhrYVFDV1NWdEhKbm1rZzVHWmJWUDNCOXlqcFhNZHlVeGxVdlZlZHhNV1NzNDdYdG0wb2g1alZOMGN3TUZaZWx4czFHdGFscVFtVzNQeUU2TGZNWnJSVGhDZlhBTVpJYjJJUW9YdXF1a3A3SzlSck8xSll1RHg5SFg1a2tpWWZNUXByU2VzMVpkYmwxVmkzSVEzcUM=","upper_bound":"Ync=","repeats":1},{"count":1200,"lower_bound":"YzJRa0pva3V5SWM1cnpBSXBjNkFEbUdEYTJoWTNYNFh6RDZJeHlUQzJPeHFsT2FXRmtLdEZxV245d3h0d1piNng4dk9SdkFDTDJIb0lqajZzQlVJQlcyT2JXc3hXRkwzQXRYT2FKeW9rTnBFVlRsM2xvWUFsVXZQZlJUclBTak1xMFlaeXRubTlHRUZ4WFJBUG1rZDNJV0ZENU91RFM2NjM5M1ZOYThwdWMwTWtDdHliMzJOQ0ZXaEQ5ZjZWbmhFbTl6RGoyOWtVQWVsRkFqWlhHdlc0a0lhcHpSVE5WdDRobDBlR3oyN0ZHZll0T2FxWTZuZVVXdjBDTFhGbjJ6THB6WW95MGZsMTAwY2ZFTUNQS29wRkZsOVNsY292OGlSckV3QTRiY2IwQk02TGNXUklZblZxUTlPZ1JEZGo4QWZ1aEs4TjVvUzZVUTdxZ2NCeXpwSDBSM1lxSXVRY3cxVzBkanl4QVFkWnNPM2JpdE8=","upper_bound":"Y0lJVUptYUZVcHRsS0V3V3V6SWNNQVJtUnFLbXBGaUFneFY2","repeats":1},{"count":1208,"lower_bound":"Y1hCaFZsN095dWdTYUIwbzlhMEsyWFVUQXJWMnpyYVh4OEpYb1JlWHd6S3RCenJzSmltaTBBNkdvM3JxWXhrVlBzSG9NQ0p4dFptTWtkUWxkc2tocXR3MFAyeWlIR211TUFNV1FVbmxsRzR1S0JadWMzTjdkd2Nua2FyTzU5VG1aV1kwVlgySDhrdnRHNG5KVzNFWWZ2RXdDcGhFUmlxN0NyczY0TnYxbkhidWdDVzBwcFRYeG8xMUsxSlhVa3R0SG1jSHF3RzhKekFqNndTZUNaZEpFTTNSeUYwQVF4SjBCbzJXWXI3WjExYTlLZTNoc0ZPc1NsNHJBWXoxNHBkZkRhcmF1MUJsWEp0M3MzeFZLVm5vVkJPd1kydzJ0cFI1b1FLRnpuM2lzcnZ6ZmVkak9IV1RYaHA4VzBwWHh2bzN5TVdlQTM3","upper_bound":"Y2FMRFRsaEowSXpOSWk4Vmx0ZUZoM29FVEhKaVpUWnZhU0NQWG5nVlpHZlY5V3ZmSHFnWE42MnhncTlabnNzYm5zQkhwbHlZV2dNOXlESmFNTWhTNHhuaXJHWXlRb3ZwQmhvdWptenR1eW5uRnFqTEE4U2lhSFFwVllhUWFLcGh5TEM2dGxyUzJ5bDFQOTNSZjRKdDJLNnZoNm9HR1cyQnViMkF2MUdHbFVRRFp4YTd1NHVaeWRLOTdybUJ4OHI2UFYwWkFxWkxLWFNFZVRTbExJVVJSQnhyczJ5cmR5OFRSbG5KWmZvWk1uVzZlRmxaME42Y0pKOU9kYU81MXFYb2lTZVVKeExyTkRlVGRoUW5Va3NuTHRMMlRBMk41bFZONjhORXpjQmlVbG5aMllNZ1Q5Q3RhNlVwVEh5bEkyUWdCV09xN3pKMU5ZbmE5N1k4bzRHajdIRTJHR1Y1U0J2TEVOeE42YTk1UHB4YnBmaEF1VmZXWThya285MGFTQXJvNXBUaG5SaUtRZVBESno5WkhaZWVONDZLZkg5ekFlU3B0QUo5aGVneVVLMGpnNHhIa2hibGxFaEhEaGpmRWozSFU3SUIxck50M3drNFZ1ZVRMUEoybm93Zlc3czloY00=","repeats":1},{"count":1216,"lower_bound":"Y2VjTXZ0d0E3Mzc3cUNIemxqZ0JKbjlDdG4zdEpKUmxNMTRnNkJxejJUbG9odDlPclBEbTR0Ujg1QUdpNjJkeHp1azJzN1RIWnVMOFZMdlhJVnZDSjZJempiU0UzaVNiUUNZaXBBb2VKb0prM3dGbW1HMkpQU2RFQnVWakxoeG82bUdKNFV5b000WEJFUElrUFhmRkduV3YwbDBvbzNsMlhNNW51Vkt6RmVtcEswVlpha1NENzlibUd6VXdzNXM3OW52aHdVUEFvRU9mVFEzaTRDOTNLYlJPajBOa3d5RDJRblJRdXIwNXZzZmwxTFRVaG9YMjRUMkpzT0pyM0RSbk43WmFwa1JQNnQxSEVGZVVuemRISUZIeG5SUVpMcGtNS05Jejd3dzhRUHdoeFpqUjdHWEFFYkVXWGJGanNnQVdoTEVrUWZucngxd0twTllDVGtJZDQ1TWlkaEVqdE9aOUpyMW0xNVpQbkhrQUNZM3JkTGpneHNEOUFLcVFyMzBNNUsxT0JnNjJuNWFwdnNIYU5SNWl0N3ZqZzd2R0NhVkFPZGJzZG5rSXBRUEtuTXdXNThxb01lS25TTTYyenpiWGg4Tko3YkRYbzFHSjNFVWZYQk1seWZ0MU5X","upper_bound":"Y25WODVPRHpzOVpIblpLaG5oZmxuSmVGTEJ6STdzR2NuQ2lDTkNzcWgyY3F6NkZjaGtkOFJPQUw2dkRESzVvbktVRE1oV25Pa3dKY1Nrbm4zMVdYQzdiMnVRRWkwbUh4ejFpMUoyV1J5aUxDb082czFtT2tzWjZETlNHUmtQY3VhNWVRMkZSWE5vUnZlVGlwM01WUUdLaDJXRHRmV2pMNDdqVUJOb3BkTTVIZjRNQ3JzVGZkSGIzaW1PNVBEdE5yZGNNeGZsN1VyYlkyUzFiWEVqSmV6Wmxmc0RuWTF2aG1mcm9RUE13c0VQMnJSbHJMRms4V3QwNG0zRXlWRFRGeTVzOUs0S0l0NjB6Ynp0TTJITmZrNTZhWE5NQzhibEJnVlhDVFVWeWJZdWhrUXNlbEZUTmpUdVlHaVl6U3UyaWpBWm9FSzNSRGczZlI3SjlaNnAxcFo5MWpXNHYzZ0gzdXI0amRlUHpXWWRhenpTN2pXRm5aTUpTMUdUZFo1ellBSnNpc3IzZ3dtYkYxdUlPMHBmWGc1NFhrMTZScjVkOTVvWTNDRFkwNFFab1JhZ29heUxZYmJRTzhoaFc=","repeats":1},{"count":1224,"lower_bound":"Y25kYVpTcXJzMHlaTHdMUTlZa21Ebnloa2llN3BoSVBNQWZ1RDNkd1dmMXVNZktWQ2FwSUg1QlVDOXJVc2dpY0FwNEZQYmVyN05Tc01uNEJMQk5LQ2h5RzVNOEgxaktrbHpGb0drYmJONTdRSlJ0UVpCT3pjUUpoc1hERTVTUmdQaVhXUjNPbUhzYXRBNFQ2dmozOGNSUUxGUXVNUFFseFBVNGFMNVlGVXBVeVFFTVA3RUx6RnoxM29RSVlIZHVJM3J0S21XYW9QcEFmZXE5dVNVZklna2thM1BiY0pIbElhSUtVZk9iN2JiSjNucGRlRVdjcUt4cTMzSTVHMlNUa1g1eWM5aVZGdXpudWNCSHMzVWpUc2s3d2h3dDM2blY2YjNTbVFScEVXOGxydXR6OU5hdFNUM2FSMVBFeGJpSGFpeUlXTXBuM3V3WnpXVkhVeHdFazlwMEpzODdpaHhxcmdHcWdwWUlwbWhXMHA5bGpiTjRKUGRLT2w0VlVLV3NycHNhSXE5WER3MW9WVDRRVzlWQ2NRelBiRm56Z05TenlvOGlYN2RFdWFtclpJcVJVbzVmZjBadTVsTTdDU3NlV3FwcEJRM2ROQnFoTkptWTZlUlBreEJIUTBPaW9PR0pjU0hXN0VUM1lIRTNIOFFGRkNKZ0pweA==","upper_bound":"Y3ZUdlNtNFZBMTN2Y3N6R0Q5QUdOWDUxYnFLaE1IazNpV1lhNGlzSnFLZnhaa1FYbmFmUTVwa3FUQVhKN09hTkE0UUp4S1lxU1EzQjA4VzF3dTJobkNYaUtEWkNQdlhXSDZNcDZzbFBqQTBwQUNQU042SmplcWVVNHhxOGJDRDhoRjFkalBRUGlWYnR3UllCRHlndUtaUFA1RllPOUdSN3NhWm1WZkJwSzVDU1NWUjVZTElwbmR3YVlyQ3BwSTFZRXoxRVh4M1VNVjFVM0Jsb2tSZk9YM1F6RjR5VXd5cktaWm5ITk1Mdzd2Z0Q2Sm5icURGa2x0TU96WFBRelZIMGtIaHVHeWE5UzdrUDd2aElMQjZSa3ZnbUY4bEtBZkh3TTFGTGhEQThZZGdHV3d5U1JCOGtX","repeats":1},{"count":1232,"lower_bound":"Y3pWOXlIV08xVkVyNVN0dDNHVEI1ODlwbEVMQU80MTZHQmxHU2lUczNqbXFMR3VPc0JZWkMyb0IzUndiMlhoQ3RBZ3h6TUNoTFJySnRQRXJsUjRSQWJXT0RzUjN6b1lBem5TYXFHQlNyeGc5d05sblJjaDdxSzh0SVZnQlliVTRocnFLQk9Pa1BuZFMzUjFaZmpTQTFsc2RsT0ZqVWE5ZmlKajVVMU1IUlBOSWNBR0JZaE9KNDd1ZU1E","upper_bound":"ZDJNendoaXM1aXN4VkM2aWx6dDFDZ1MyOWtFMkhvT2lEVmNteTJYZThVMjU2c0ZsUWp2aGswc1lnbTIyNlpSeGFNUWxFSjZl","repeats":1},{"count":1240,"lower_bound":"ZERmbnpYUmNQRUVBekUydlpoNXFlYkttaUdVdDRwcXdkT3hXd0V6YTZ6YlBBRDFmSHRpb3VFQUJ0dWROZkE1ZHRqNURMZ0t1S1NBclI0eTZrSTZNTG1XV3p0Nnd6bzF3Q2w0NG9ab2VFY1N3eHNBRDRHZjh6WVFHNFpycm9vOGlySWx0a3Y2c3pDOUlIYWpidFVKdHB2ZnVmOU01WVhqUU9haUV5RWI0OHFJMnVvZFVXZ3lieG1qTVVIaTlndXg4S1Q4STU3eTd0bQ==","upper_bound":"ZFc0SE9WM00zY1dESVVPRmhlRGIyZ0dlQkhxNFRWUHJJcFlZYk80QkQxOTZqWWp5QTNOeU9LZW1MVENJVnFaZXFYbWdqUjlNUnFQSWE2R3NKUnFwcG5LeHRoTm1wNTN6VHhJQW11YXlxdFdicTlJVjJHTE9wY0xQZDI4Wk05V09HeFN3MXlLemhsNnlCYWJMUHl1TTE3V00wSHUybVJQUk5PTEhvNzJQcENaMWFpSHVqRXQyeHJpTWFqRjRINXBuUEszN3hNYm0xRnFmSnhIRWd3eTFtNFFHdDNEQXlPd2Y3WDdVU3ZlRzJiNzVLOFh4aUIzWFBQTGQxY2tZb1E2VnVLUWxFVHdTZDRObkJoT3hNZnZXV3RhOHFQS2gwWW9LNmsxaGpodmJiMUhndUVRRzk0Vkd3YWNzVmJYQUpUWFlabU5kZA==","repeats":1},{"count":1248,"lower_bound":"ZFdjWVVwRVhQaEZscUlOdHhqaHZqc3NXZVBncExHQ25VWlgxZmhSNFkzUWJ0VDlzWWsySFRFRUcyNkdRd0l0djRsckF6ZzY2c3Jnc2ZnbHNkc2tsY2NCR0xOeHlrdWYzMDVEZ1lZRmcxMkE2TVYzUWpxcmFGb0dYQlJCVmd6aVI3dkxuaFRnZnl1TzlkMFJraUx2aVZXWVFkc2VaMHVCVUVTZnpicUVuS1I1VGZ6STFhQ2Z4U0FCMVp4Mm9LcXhoTXlhcjRSV2VXTWVhWFc2MHkwU1JZNEtoUW5BS2I2M2xNV3dhb3BQdFczUGF6TVJ2RElzQTdVajR4OEZ6NEs5a2pwa3hJc0Z5aGRqV3h0TWtkeFNGZ2RJcTNFOW54MWo3OFVWNzJRZGRBZUxsdFFEMHhGV1Y4MERXODZ5cHRoY3Y5eDF3UFM3OUhHSnlhbUJnNU1qcE1hWnN3NlR1QUd0OVFySlpCbFZRT2x2Y01YaFlVZHRCZTFuWmd5QTRlR0J2Z3ZERlc1bDRia1pZcW1hZ2h4clI=","upper_bound":"ZGZXYU9ZOWxXUGU1aXZWTUExMWI0NDkzM3c2cnp1WnY1YWRPdTZzOW1GcWxINTJBNkJBZE5aQnRFVjBya1Bib0xVS21acUFscnFXYWJpU2VRVFNRbno1aWFEaXo5dDZsY2R1NThHVjJiV2FNMDRsbk9wamwyMWgxWkFWVXhVRERpRFlDVlVVMHFONXFiY2JmcFRoOGZDYVIyVzc0OGhQaE9sWXZ1S1pGd0xBOGNlckRuQ3Y1YWRIczJZa2FHbUlKZkd1dlZNcDg3dnB5c2FFVllGTVpuZEV0Z0c3QzRHMGdMemc1TmtNT3VrMWU1ZlZvVU0wWU5vcWlSSktJTVNEOEhieVFNWHpNa1E0NjJEZm55RHN4OVFrMXdQd3BsTWRGZ1RJNGdaVDdvRm5uZlR0S3ZKZXRGWVlNdGNZOHQwMnBWbXRiV3VvWTVnWFRPQWNSY05MQUhPSXI0S2tIbVByclR0MmNzSXpBNUw=","repeats":1},{"count":1256,"lower_bound":"ZGxFZGl4OXlKTTk3YVNJYXBPQTUy","upper_bound":"ZHVjckhGNG1NQUc4aFJjSlpRbVJ4Q3ZNM0RnRlhBOVZKcWJJNklxeEVPaEthSElYOVFrVUlLV2J6RnEyMnFLTnUzcmRCSUFnZmQ4a3VOOWxQWEU2R0JYdWlncHc1MjhJVEtnUWp1T090V0F4UmZiTzZCOFhuTlNXSjZlZzc4MVJBZXpCbzBXaVpRRUczNzZrbkRHWTRiRWczQ2NVZDVoSDVYWnRXS2V6bnhLN1FvSE9zYTJKc1VlemNYdlRlVDkyOW8yZHJPcGF3ejhlYmpadkRkNHJjdXFVVg==","repeats":1},{"count":1264,"lower_bound":"ZHdBVU1menpicnZZMWtDVWJZbzRYN2xZSWtkUHdIWUhHelR4MnJacEs1RHFya0JJb3daNU1SNW1paGRTVWVZMFpIQjJtcjVOMGVIdE1FR2lSTXVhRGdnZ1FlNGtzd2dlMlBJbnNzeGhxNUJGbXFrcGR4bjM4RmloZ2ZrRlJJNXpETXdJRzlQR1hKdU0zbXgxUVFnMzVrTmFtT1BmTkx1QU01cHJyVzhDeVFpcnh1OEJrVk10VndUZmtHQ2g1ajVaaG5wYzdNR3JQVFJGZUREelE3bHF6TFlyTDB6YUdnN3lNMFNEU1NuWlAzZnFHVVdqclBEZmp4UW5OVndLQnFDR0VqdTRtUU5BVG1VelBkRkJMU1d4UkVQaGJZejh1aFJuZWNNYkZGNGhiYmp3djJPdWw2cnlJTjdVVWtHNDB4Sk95djVvTVlzYmg1UnpMNDl4aDF1T0dINWtCdUw3UXZNNmxPc3pYeHdLblZ6MTlEa0hE","upper_bound":"ZTdzcEpKcjBpbUpkU3dvMUNHRkpBWmx5RU9ZbkNGRlU0UGRuWmNTMXM5cXZ2azlMTElSbGNEMDJxWkY1dHFTSW5CdE9MM2IzV2lDVTdJV21HbzJHRnU1ak5iRkVnbUYyam1pMmpaakdyTFU5NnZzQUtSS3dUeW5FNkRXanRxMVJBT3BZQVBaU005N0xsZEpQZmVFSGVucDZJbnRxU1pDbzlkVzBpYlJlT1RXQlpIREZQY0FWSTZLMzdxQUJDOUZTdmFoYWp5SHBSa3pTa3NPWVIyWjJkQnNsNHNwUUlkSWViMW1OWGlSNW1MdE1tRVRPTDlUZlJtVzlEaVV5M2J1ZDZtdHJJMzFDOQ==","repeats":1},{"count":1272,"lower_bound":"ZThxZklvTllLUlp2WA==","upper_bound":"ZUdONVF5UENidjNkaWZTOG14Rjg1SFBPUVBVNEVkZkZnUlNLY1FPRzRBVldlMFRERGdMVmp1THRKeDhGUHRZSFBmcVdhcVdVQzJ4ek9rdTE5VzZGdVlGc1BMbk1yQWdLdlA4N0FVUzZYdGozcDF0M3hvcVl3dDJkc1JHZThibFJlenRseWtlSHFKeTZMWjM5UnZqMw==","repeats":1},{"count":1280,"lower_bound":"ZUw4SWVhMlB1YzVKY01wRlkyQjF5QzRwamJ0eGk2MkNHOVkxbDRaWFB4cUhXb05KTnFWRmRXaWpPc1hYYXBJNEtOa21ncXdXdjRZaWxDSXpRalM1ak4xQkVPRzg3VXdrb2JudFB0Q3plUU1uc3B4SWw0Mno4RjNtSnZJVTd5dE44Y0hKSkFBdUlvVU9pcXhYSGVTbkUwRjRadGh3Vm5uZnBMS2xxbWhZUzJJc01adlBkSUVDWmxpcmROc1lUaEtQaUpLMjZxd3FKVDBjZWw3NlVEdHM5WmxOV0EycnBGVHdwbm9SQWVTZEFXMHhxNFlQangwanJ2aTh1M2xwN1JibDlINEJHWUtheVpERlBhWW5JUzN6dUw0VEI4djRBaGV1MGRybG1qZGNoM2tDUFB5c1RhWnh2MG5lbXVReFRPVDAzV1NmdmRmUjRSTVk0ZDV4WTBTWUNpV09zeFhQcllXNlB3Vkp6QXRkSWtIZVFlRmZXN29HSnNJOVE5VTZhcUJad2ZvYUFqM0V6MHhqNkxIWXJJUWlmMmdKWFpxWmFCVFJOeGhHOUxa","upper_bound":"ZWVwcEdUeU82MFljQVZBTGNIMWZjNkRSM3ptSk9lQklnU2NUTGRWYmlUeVpxZEltSm5qUlhxV2NUZUlBME1KSEVNYjd2aU45aDZLOGZic1NxYUZtODNvUExQUjE2a3FPUXlRaGlIYnFJSE9SVExibGJBUXI0WjZuVkZnczJkWGFxamc0eWk5dHpmQngwUWRKRVhCNndXWVUxZ3RnNVExR3o1dHhGbldKbzFxMlBBa0NiYzBsSEJIcENOMzY2YkR3U2VCMWJEZWhaUkVRSGg2Q0JYc001Z3pOR0pGbXNKalhseW9NOG1jTmpabDNscEM0bE9sN1c2NXZndFJSSFljZFROdmF3R2ozZFpjRk9VTHA4QXF1T1FwSGpmWGxGY1QzNkZKQ3lEMGo1ZU01SFRZdG9FSHhwazc3OFZhV1pBVUViUHZ1Tms5WmpuQmNvV1JrbFBWZGxaYzMyN002NG9udWt1dVlpU2xSbWQ1c21RRDZ5NlR2ejBicXVhU3NmZGJud1BJTzRCbWpBU2lielVvTGw1bHExR3h0d0U3N2FKcjZOMlZSVTNUR3F3ZzRud3AwemNBS29iRnJWWUlPTzBKUGV6aEdxSg==","repeats":1},{"count":1288,"lower_bound":"ZWc5bGIxRGJManl3MGhqWnhBVm1XbjdtRElISXlkVTFXOHMzc0Nuc1RSdDlUREtaSGhwQ2lqSVR1emtnbTJJMmd4VDlDdWwzNzVreWxWd20zamJqV01MS2c4cGpUdmw5VmJTTUFGdjc3TlBPWmpDcDVDNmZaZXViVjc3eUxEdzhxaDRlWXhYeDBvelF1ejJzOHc0WVBxRDF5N3FwT0pZZzhWN09MdVpQZkRwaklhejM3a1BsYTgzdQ==","upper_bound":"ZWwyeDlIQUNBSTgxMmJYWTVmeFdyT0RkQ2hub25RblBSUFlVV2ZSYU1jcHJIVWhQeGFyOWxlMU1PcUFKWnZFOUlNcW1pWjg5NDhjTlNUZFl2SUEx","repeats":1},{"count":1296,"lower_bound":"ZW9abEZCamxXVnhKUE52UlFzazZWVlRtQ1MzWVVKWG5BbHdzRjBxZUt3bHhreHBSdzhvY280dzlhSGlsMEsxeHA2UTRrcE5ZOUxiVUs3WFlDejhDcnB2d0ViaHlSRVJHemxHdlRjZzJYd3JX","upper_bound":"ZjFlb09GY0hEaUdab3Q3OXdNME5rWnZwQUVhNHFnWW11d0JybXJsMFhQRmNxbW9hMTQwdU9aQ2dDUXd6WGpWcnh6V2FUN1BHU1ljbU5GY29heDlIa08welN3eU9DQ1R1VGpHMDJZaDg4a0hQTDFkZERiNGFjckQ4cno4dG1JWUVGUFNEc2QwWUkzbElDM0x5eTZTZ3U1OVVPR0hDaVRqVWpsWEZ1MHlxeVdSc0F0ejJVd3NNaGFjeDNuc3JzT09SWHRYZlZJVXZBSzczbFhnRnB6bmdLS1VkT29CcEo1WVZIa1lkMkprdXduRUxIOHd1cDhIWFdzdE5sSExkTHE0cGxvM3hEV2tWZGY0WG42YnBKbEpEYlVHNm5aUGlFdXVuTHJkckp1ZzZ4Q2xKN2RiTUduZkJLWFVGRWRURXhpQjN4TWxKQUNraTIzWENyTjJqVWYyenVnQVVSYU9pOFN5Y3QxUU1ZaFUzVlEwcDNrQ051SVpaMEdNTDlrcUNWTDBDVzc5TGxnbTlzMVh1N0tNVFpoQnNxNTEzWnBna2lRUFZtOUpLbUxsYjIzVXNHeWFCTXp4bXJQYWt1SDZWNUU5SXZ2dDR0NXl5TFFBUjc=","repeats":1},{"count":1304,"lower_bound":"ZjFpS0ZnR2MwdmtZVXlYdEhCemptaE1SbzA3dXhSQmQwc2Y1NElxcWRPcE52cHh2VVNFcDQ4cHNyeFdpWHRLMnNMb2t2ZHNGUWtNWXRuUzlRb2RvVHQ5Y3lQRnpiM0t4NG5XQllGanNzUjRPR3NFTUVEcU5jSkY0UzRiMmZXMmRRODZNcTVKelZTNUdnS2xlQm9oUDExVGJVQ3NTdXgyTGNQUm1Bb09tenhrMkpmV284VlBMeEt1eEhTaUhxS0xNc1F4ODNGYkdDUGh6SlVvNk9mSTJ2bVN1SnZrdDNyeGhJWlltUU1yd2YydU9xNzZPYmFMZ0t5N3IzNWlyaUFuRkhxTEVCVk5IMXVzZEZQU2hsMEZtVFV4VVZza09UZllCeWZFVEJtWG50NzVCRGt5bzJQZURoWkUzbHlLdlhwYmZ3aFZzZmNOUEt1UGhVa0JyM01TaVV2bmdsVE1OamdkWlowUXJkZ1hreGNnQ1JuaGdQN0c3N2MwaFkwTWZISm9PZk84MzFFZHVnQ3hIWlNqWjFaV0lKWWFWTkZYdXZtNGMzZlIyUTBrY1BONlV2QjVibE1zY3VVQndiRU5Rc3RMeHprY2QwdzdFVDM5RWhYNTBxVnA0cHltbk1QUExHT2tnQ3FGTk83VlBnWWVuUTg5ZlV1SXdScWNlRWJram9Zbzh0SGd0TUFsUmk=","upper_bound":"ZjdUckd6RGpRN2dibkRzandUMw==","repeats":1},{"count":1312,"lower_bound":"ZkRobXZtS1lBdzFzb0ZLWUZ2aGlHdEp2QTBDbmdaVHhGdWNobHdxM2ZjNVRrWlpqYkh6Z2hqdXJmb2NOYWhOUmxLdXZoT0lnM1lwZFIxNjRqOGRWMVhkbEE4Y1oyVW15UEFobXk1NHVEMnMzaURwWnAwNG05dEdZSURIdFZsVDFBNUppajllaXZ5SFpkWEUycVFVeUFITQ==","upper_bound":"Zkcxd1pBYTVJR0d5VzdVQWU3NEVvd01uMTlCcG56MGdOME5OV3RRbllJcm8zd3JVVjBCdXdvZzd4dGRZdW1xRE1qTmlFdXpQOEdpTE04NUUzTWJyVzRXNk1yMDluU3VteGpCV3dLRlBRMWNNNDhTa2lwV3Z2c2dWQ1ZqaG1uTmhKclBET2VkeElNMkJ0WXJwSE9NaEtTSjhJU1Q3QldPeG9VdjBKT3hKTEY1YTJ0YVRONXQ0cA==","repeats":1},{"count":1320,"lower_bound":"ZklvajRPZFVWSUZKVERLVGlCZXFIbEI0RFd5MEN5UG9XRml6TWZ4dmVFYllCYUpEN0dybXN2aEduczBkZ2haUklyZ3hhQ0F6U01jSzM2cUNmWjlUWUgwOHFIbGR2dEhMb2h0YlpaU29nUG1qTEtnTERvZ0p1aGpMMDVzQnZYRUozWkluSUcySzJMaGxUM0szQnNVVnB2dzFKNVlZbHdvSnJSNHY5cUR3WWtUR2c5bk1wTnJoZjRJbktNOHJpQVJZeXJ2d1NwaFZSV3VKVTBjWm1tY1UwWWd6WG5qNVFlVUlUZWUzTGhFNUNZOEx1Q2hFNzY1UWtEWnM4blFFczROZVVVNTJlUXRpdXdkRkVs","upper_bound":"ZlJNVzNBRkY0bzZmR3owbG9valFrT3hjaVZUbGRmRXpDUG9XMGhrbnc1MU8zQ0k2QzdEV1pGVHlJWnN0aTl0Z1R1cUduaXFJYnM1WGliZXFXUmZJWEo3Ums1bkVwWjBqT3poTzJUeVlEa3JMcUtKY1NEdWsxR2IxRlYwOWRQMjVvT2JheEo3OVhwcDhta2dON3YwWElMdzVOSWQ=","repeats":1},{"count":1328,"lower_bound":"ZlZCZXBFQWhPN0g1SHdRcDlyMGtuUnU3SWxBSlFySzFualEzcFFQbFpKbXNDSjV2S2ZwNDBwM2RjT2R3MW5oZ1hEcFhZaWdKeVFjTzRTS0tUTHEwZDRQRnJHd3gwNFZkaExCZnhNVVBVMERRdUVNMHY3S1FqNWRpdVBvUXpWYUV5TnhUeDdyWDllVmR0NDBTOGdmM3hxd2ExcTRCOEF5Y0ZSTnRWTUR6ZWJ2aGs=","upper_bound":"ZmVPZkR6N3VuQW0zRmxFMlY5MDVjYjBLWldWbDVsWlZiOEx3NU1DRDlsZ3BpdXJ3eGdLOUtYZkQxdkdEVThFRTJFaXlYanVnTzhTRGxBMGNkSzdFMW82ZUR3TzhkR25NemE1d2tPa3R4RHZBbmt1ZVpjdk5HOU5hTzlNZ2I2NkpUSFpCMVRMUHRWQnVXOHFUcWlJUVFVZjlNRVN0Q0JCd2o0a3hiMjZPV1F0eE9aZkJ3VGhS","repeats":1},{"count":1336,"lower_bound":"ZmZuS2ZCR1RIOGh0MGNTZ09vanM2dWFTVnBLYlk4SG9yMjdZdU1RbFJEVlhTV1p1TDVZUDFFOHBRbHhjc2R0OWwzNlBDV3ZXSlE0OG1ybnJCY250RGlWRUhWa2FESUZzRjZCOTlBeG03V0FZdFVvUFQ4eE5qaFc1QUxtTkVoZTlLenRsV0p1M09LY1dXQ2tqb3VPektyclBKWTVuajBkYTJlaE5WS1MwRzVVczZBdVFTTmR3UTlUQmlCckFReFpqSUNlY1BsVHVKQlhWUGI0UW9iRVY1ekdXc0N2dkZzRmF4WE5sSWdPSXJkS2FpVXZKd21kWE5IREpVZ0NWYVAwZUlDNUc5QVhORUpJZTVMQ2VkaEdLcmlOU3ZIMVBoQnd1ZVlCeW5WWnh0VA==","upper_bound":"Z0VyVjY1U1ZPVTdwVTh5ZUwwc3NCZWZmMkVTR1NxMzk3anNMdUdxMWtKY3pFZzQxaTRLT3BHNmQ4YnpmTzV4U2ZSNUl0cnpwMlp5ajJDSFpWSElZT2p2UlZudERnUDhIUXg4akV5Q213SXlma09jSUlxeU1OcG9lRTFZeUNZZTA4ZTRZWjBwSldWTU5TMUpHU2c4T3VDMkNmaU9XVTg0ekY4SEllNG95VmtMYjV1azdtOTlaN2c4dXJZelhuWjNHV0ZobUswZVdiR2ZUZmpTb3FiOFVVSGp6cmJ2Y3pJT0w2WkhOTFRtTEpEeHd4RzFWaVIzQU55Z0x4blFZZXZJRjZDYU1ZMlh1Z2V2Mm1sTjhlUlI0cEZYcnE4ZURsRUlMOXNoeHJsZzFkRnUwSXdicEhvQXhYZllMM1gxVnlGbGppOU5PMHp6NkpLczdYVlpaRUR5ME54MkpzZVYyb1ZmcEQ2OUMyUFplbWpPZ3lRcG9WRHUzS3lGZDdBUlJUVzk1bDFTMU5sY3kzalBHSnRZRDdNQlhhQzcxcEFlOVkyaVFpa1FvQ2Q2Z2ZoUFpYR2JQaTduNUNQU3J3aDZKWTZJYmQ3UE9BS0E=","repeats":1},{"count":1344,"lower_bound":"Z0ZEenlBaUkzcG1xcmNkQkNXQ2tmNGJVRHMwdkRXNHU1cHRPNzh2d0l1Q013Nmh3TjRLeHl3SGJUR2FlSlRtcVJ1VEtaTDRPR2g2YlhsY3ZjMXhYSmozUHY3MXpOUWFqUGlHdzNJRWRXbUVwZUxsaURCY1p0T0tpNmMwU1pBQ0Q4UldsRmoxVFRnOUZmb0Q2Q2pqZ2dncHlBNmFid3BzWXNRb3J6aHg4cFhhYnVPNXl1SW81cUpPY2xyVlpGc3NzVHpQUGxpUk5JSHlka3BRNW05VVFqUXVMZQ==","upper_bound":"Z1h4Y3hSVUhhbEEya0lWUTZlVnV5NUhFdW5FSDBGcTRSVkJTQXBUS2ZCcUJOdGxxNnI2a2hjaU1VM3o1TkhNb2oxYXpPTHZFYW4wTUd3VUxGODI4NENCbEdQNFRrMGVIcE9Wa0xibFhjN01CZFFUOFdtVndlSjk3YWRPSWxlam40V2JveUk3QUVybzVNR2RjVzE1Rm93RXA1M2s0SmpMbzQ0WlVHSmdlekJ6ejNyYzFNSG53aHRXc3RCYVdhN0xKZ1N0OERlaEJPWGZNSkZoeXNtSGZpN1A2U1p5a2lnQk1uV3dKVTh1T1RWb09ITHpZWVlFaDFzREJnWUFvRUVHMUJJZEJCWXNLbHl1d1U1VDJuNEV0eVEwTldscXh3QjNLN1VPcGdlZ0dCc1pON0YxNHRQV3QxM0FxaXVxYnVtYWVqazh3UTdNVQ==","repeats":1},{"count":1352,"lower_bound":"Z1loa0R4Tm1LZ3BLUUU2cVBFNmJRQjZzN0FYeDZ3VjV0U05VaUdRY01HZjI5SW1VaEZtQmc3ZjFzdG92SDVnSmRoeU5pVHRNaUpIWGx5SlQyMVZUVEl3WFlZbFM3aUQ3Z1RpN1AwMm5rMWRyajg0MFFzdVZPOEl4VTdJYmh3RVhhU0tVM1FUS2VMSDJOQU8xRDRoazRYUWNub04yMGlQc0lSalF3STRyTGdiU2NJNlVPVTZPcFB6eFozMDRCa3czemdSeFlwbURDSkhqVlZUd3h6SlpFWkdyd0Z0VGgzYW5RMkd5bDdmY2JySEhYUkdIcFRpeTFzczRVMWRTTWJmc3EyUjJsbXVwSkdhMjYweVo5MzZXRVFZY3dVVmtpS1JQYzdTNUNHQklucW5BZUdZSkpLNFhkOXFOMllNcDNlWDJUNTEySDVGb1A4dlNWQ3pPbzhQeGhuNFVyd0lKTEZ3cThrU2ppYXZmMUZoRzVJR3ZucFlnNENLa2hUMzJrY2dHWVVoNjRGZzlkNkNLYndxNzU0OEZJTkZacUlFWlB6VFdPTERaUmdJcFYyS0Q3ejQ3cXF3WDMyNGRHQjNTblNHRWpwMGhjNzZDU0F6UjlhTQ==","upper_bound":"Z3VhbU02UWg1YXNveFRpNHJSMmoxc05xdVVYSmlNY1JWY241U2JncklNbGZjOUZDdWNBMzJPcVhJZWp1RHZRNnJyZElqYm84YlpwS3VqSndPVFRITkhPRzRWbGlFSkxsWGczSTVRWDJEYnJEdUNVQ1JSTUhGN1dVcnp0WnVERHJVZzgwZXBjTE9BS0VxWjVUWHY3eHlLdmIybFVEVWxsOGp3VEV6M0JKdTRXWllnQlpVWjZPVXZJbHd1aVB6OWhTanhHdmIxdW9pWTVjc1Vmb2toMm56ZlhVd1B3dDR4SFllZkVsOEpGOWhaRGhPMk5LV0pjZ3dSa1hNT2NIQU5ZSGhCNUppWldUdmVJSzZWRGtVcWdLbGw0SGx6UDMxellrV3J5YWplNG9KWnVYaFZmeUVzYlZsakpDR0Q5WHlZNWRUQWFtMlUzeTlRRU55aHc5WDJTTXVPUXdNSA==","repeats":1},{"count":1360,"lower_bound":"aDJHcVpZM1JZemdYZG51MXZIMFZ6bXJndHdtQ0dPaDNpanExZ1B1ejAxcEdKRGppWVFUSVFTaHhOdUFwc2Ztck1hb0ZyY1I2UFBLVGhDcFIxazJzMWtnb3pVMUJuMXA4MlJqVHdkcHFjdWM5Q3p3VVZIRFJTcFRpOVZVRXBORVp2c1ZKMzJMMkx3ajRvWmRtWGcxaGJYN2tuZ2pOaVhPMld1UHpBa1V3cjRUaml6clRLSDdRWUR5MXpzQXZTOTZzVEJrNkVnS2RUdjl2SWxzTU1aZmpMamlDMjJDWVZsVklFWFVQaFU4aHR3bkRnaHJOckQ1aFgwa3hEYmdyUjBEWkF2R09uUzRidE1Bc3gwb1JMc0c4UHNQc2ZnSFhCZmxmTWRBcTZWU3pZWVZp","upper_bound":"aENsUXhlREUweW40blhjMFRFZmtQeUx4b0tmWTZMdmNNVVNCRGE0MXFZN05HMWg3cFVtV3lVYlAwbXdwc2ZmWUVxZ3NhZTg3U29JSk5NYlY1SXhuNUJ4SW9lbmxoV1ZGSGtJMERPcXBpQ3Z6bDY4YnlpZkJkRlhXWjdoY1c4OTNPSU1VNWJFZ3ZLWnkzRFJZY0oya3hRM2h0c25VUURPSU9mV1owM3ZIYnlMTHJ6THY2bWNXWEp6RVVGdTRkdVhNcnlJdTJURk1YUXJjcjZrOFhLRTN0U3Fkb2pwWHh1bWV5UU02azFQaVFvRVhKUHJ2dGFqbXZZUDJSVXJoamI0QTFYZ3hvSEtPN3YyVFVHRzBQZUlDMDBYWWQ2TFRwY0puc2licUloelFtbnZPaHJ6V2R3c1dPRk5hYXEzeWoxa3U5WVlxaXRDd1JNOVZMNzZMbXFTQjRYb0wxU0diSGVtTjB5eE9GUXZOR2c0cnhqaXpFTldqakZHWmIzWTB1TVBYNTQ4OVlrOW9RdldFSE5oOTVSRzFhUHROUFV2NE5kTTNITzRWSWdYVWw0cjUzcmE0QXBLRkdjRTF2SnRTOEhUVkw4VWl6eVN1SmhFQU43TUJ1czZRc0hEdHJlWnFYb1pFTUJIT2hPR2Z4OHhwSXA5THQ4QWk=","repeats":1},{"count":1368,"lower_bound":"aEN6a2k5TTY4NUVZV1FPMlpZelQ0Tm5jemNCRHFUYUp3RnJYcmVSQXg4amJRRGw0ZDJ1MnRrSzFTSm9sc2paTDRvc2xwbkhWTzg3NTY5R0ZlSWhDbDdEUVd2eXRaa1hOWThXRGtzUnlpelkwU0RlMVhnUDZWRmJnd2l2bUI5ZmNKaHVBODBiVENmZFBlRXdLbmhzbU0wTkVxZUFSQTdQU1kwOGtlNnhGRkVrZGxrT1h5eE5DN0NCcHBrQUpMSnh0clFHVnQ2eDNzTmpCWEJEYmxGS2ZtMEpCeWNiZ2xXekU3Snp2aTlaaTdDd0EyY3NTRnYzVXJDMFdkZ0pmd0tyakpUTm1WRUtRb2daS2VaMXlKRE1ld1VKdDlzTjYyTUtZY0IybFE5MmkwYkNYUDNNYUh5WUpsa2pmUTI0MEU3eWtCSTNDOXhSZnQxTEdoWFk5M3FXOGRuOHBsYzE5YnlUYmhFc3dxYUdHc2dncGdLdzdRSEdidUUwUVJzWFBvcmVNNmJqdDJ3SGxWZnY1blJ6WkRROGlmd0JXdjlWOUxKU0FtRzkwWEwyWWhwM3QwV09MeDc2NlZzVDJITnR0M013cEhLekpQekpxSnQxQkgxbTkzbzRLNURVRk1CNDh1UWpaWkkzWlFyN05tMFVoYzVHZGRFY0lFN21GbzFxYWU=","upper_bound":"aEx2NHJnamZSMjY3aTZ0QzIwZ3lRNEViazNQMnViT1NmUGswNjk0Rnl3S0dvT2U3Z3NFcWdXRW44aVZZemFMbndUU2pGQ250eE53QmFsbG15bkJCSlVhWm02MkhYMEhrZVdtOGNlczIwRk1VVHpTanlFWG4wTExuMGNvTU1UWG1ONFFaak1sU2d3ZjZlUWk2eHIzc2s2bDh2dTllMlRjcGdXZDJnMzNkQU1BdmZtVktFSTl3YmR4Y21ZZkx0azVqUHpHbWVoeDlBUTNpMERGbXQyeDJDUzJaVGs3RlQxQjRRM1JxaXJScG90bzJJQnh4dVFLTFFjcFVIVG1LYkd1eDBBVEM0NUY2THgxWWZacmRkZlc2SVd0NTVxR1E5Q044Vkdoalc5VlE=","repeats":1},{"count":1376,"lower_bound":"aFViNDEzUEhkeGhIYUhxb2ZPVmxUajdwYUZwanFlR1d1UzRZd3h1MQ==","upper_bound":"aGZFT3dIZzEzRnh2QWcwTkxUbEh5U3R2MjRLbVF3RXpHOFdzVURFa2FWQjJIYTdQWUVsSFBnUXdmN2p2am1hanJiTWg1ZE0za1dRV1AyVEVMbGFWcUlPNjlkTTY4SVpzbW96NFcwSE1PYm5XbFl2RnVoQ1RxUWVDTUxhYUxhNnMwU1pQSmVlc0xiS3d4bGZ0djIxZURqT1NPcFlhQzBNVDVJZjNvaE92ZVkzNUExREJ6UEtMaW1QVTJudDlBcEVRS1BaSXpWOUhRNDlSQ2Jpamw3VDJpM282Rm5xaVhveEtqVXphSE1vNklnZ1ZVaWlxNkZxeWtRV05Wc0JlNEsweDc3c1ZxZGhhbEs0cENOb0xZTkpmWXc0NXN5bmhtSGJicmlneVhRVmJtTW82TkRFaVJMTG54UmpVU0YxU1hDYjA3N3dYWWo2bWI4RG1MMjB0dHg1WWhQSjZiUGIzM2NTcTRXd1M1RnExdHVIQmVLVVdaVTk1V3VVYW1saHJEVWtMbDF5VTBiMEdtUHpxOUpVQVBrU1gzdTNseE5XUjAxektwaGdZQWNseU9CODh0N0xQUXh3NFVHcjljZElpcXBPazZEYW8=","repeats":1},{"count":1384,"lower_bound":"aGozMVpqajVLbUpMNk5yQ0F6b3dBeDdYWUZNcGNqMVoxbXlsRHdJRnJKZnU2S3A1S1NjTjV1WmVDZXhJU0ZkY3cxNlRnUW1POG5mVTl5cTBlN08wSlZJRFZJYnRmSQ==","upper_bound":"aHd2eDcwV2sxbnBGajdzeWVScWVPWE5SV2VLc3cxWGdDQUFWUEh6b0hjMTNKZkVXS0dFanNNMnZMTTd5MllyNkdIWEZjcks4RW1zVlBKNUdsbUhPZndnU0hKNTc0NTJuT1QxUTl0aUEyNGZZMmJQOHhhblQ0aHBvTGtBWGIzaUZUVXp5cHVaSUhQekJsdE5jVVdkSGpVdkg4T09adHV1ZWJGOHlSb204R0dPdFhNZDVRWUJUVW44UzNTNkNBT0pGN0gyNVBxelVSR0pmaGVjTnYwOUJaVGdzQmUxV2lRUzI1QVpPU0lFY0Jub0tPM2RON1hDdFZjb2M5VXkxdVFUemk4T3VoRHRkVlNPWWw0SXMzV3lybzBIWGNsSHJUZ0VPa1l4eVp3Mnp3Q0Z4bFNpblQzeWNUSVU2ZmcyN0FrVWh5MTd5T2V1WjQxaWQyNnpKUUo4ckxoNEVLbnFpZXdOVjNqdTd0ZmREWXZ5SXN6YmxYSHlXWlpPM3hwSWFUWEZUalFaalpDbGpoTjRYTks5c2t0V0VEZ1NQMmx3WURzRWIxMjhzQktENmRUS01DY2RaanpqSExYcDl6ck1QMDUxSk0wOGJqTDVkRE4zNHM=","repeats":1},{"count":1392,"lower_bound":"aTJDZTVBc2VTQnA3S2dMNmR1SDN5b3l3ZFNxdzdKekFBb1ZtOFNNUlNsYUZuM2lsNXhENUpQaWZ1dW9WRnUxRENDcGt6dWJXdzkxMkJlZ3l4YTJDZUczT3c3R3dEZ0MxeWVFR0ZEVFFEWFA0MFFGTHRIVFdNQVZYaTlqNTRFMHZSOXR2Rm8yRTZ5VldWM1FrTXJaM1hDbXY5RkdpQk05TklFeFJHc2FFcXdlRU5TODZnQUtldE1odHVvNzUxUU5pNEdJekVkVHZld2Y3SFN1NkQ1YXJEaXkxYXpUOHlpVmZOWTE2dDlhZkpPSWJPcnIzNFo4Q2t2Ug==","upper_bound":"aTZObVFYWWlIMUtlSjJiamRncWNKWA==","repeats":1},{"count":1400,"lower_bound":"aTdVNFoyTnpBYWZGTlA2UklKdms4S09PV0JU","upper_bound":"aU44WE5wWEpNVnZYQm9KQUgyMmxSZDdpcU5PS09tdjRURDVkNVU1UnJ2aVUxSGVzSURKMW45QmQwdllzNTRMb0JzZnM1T0l1ZkhWTkc5TU55bHc0SFVQa2M5RTV0QjdaQnNYTERtRm5VYVczaE5ha28weHlPZmFDTUkwRjM5a0lnRjN1WEQ5MHRpckpncTNzUmswUkdqREZGbDY0d1FtUTlyWHZGN0M4ZHM3M3c0cFY0cGJmbGo2azVQTURUYjZGNHpZd09QUXlFdWQ=","repeats":1},{"count":1408,"lower_bound":"aVVKN1Q1dFFQWWxUSXc3dHlHdHhBMGNtVEw5WGt5elpoZUNaY3p4eHhMSUY4b09YQw==","upper_bound":"aWtKMHB5bVF0NWJ6c1NpWFgxTXlKc3FmazV0WDZ0SEw4Y0hjN1J6d3RjY3FrUHNEZUN6dFlieU1BQ3plMU9WcktXZ3BBZWxzbDRuQmoycjdOSmhSZjcxbG8zb09XbGVVTWI1RWVJUWRNZmpBQXJYbndVcHp5RjNJVmtaQWlq","repeats":1},{"count":1416,"lower_bound":"aWxnQTdoVjRkTmFLamRMWEp5MUtCOWRLbjVXajdnMUZ6NldYVFVhWVh1Y1dpaEdoV0FJdmp1a0ZNZWFZVzNlek54Z0ZyYWlhOTFhWjlhSzJHMmczd1BMTHhVcXIxVzVGdWVUb3lUaGhPSWdkbk1abEE3TUdNQmk4ZVU0WU5IeGExeVB5ZG9DSUFkZFFlTWhQdTg5Um1sbU5FbE1wVzQyTEt2U0VrNFFINURCUHN2WW4zNUhtS2pNM1BtOGNoTGtMY2s5N2c0U1FHUDlBbElyYzBpSm9HRkExQ3cza0pjQUdCY25nZVowc2lZaE1LZjk4R2k5SlEyM3lvZWNpd1phYVdYNUFhTlBOVWpaZ0p5QWtJc0RWNVQzMjBRZW04ZkVCNGdLcDFmMGdMUUpnMDRyUWh3YXR0a0M0Rno3YXh3QlVJWHJKVDNWSXdwZTUySU5hNXl4eA==","upper_bound":"aXA3Rk9FUWowb3h5bVNpTHBGdjI5VUNMajVpTXhLd1VsRFJvWDNUUHVneGQ1WHNvSDVDQVh3VDZFVVhSVzZ3R294MUZaYWZPb29CRkg5WTg1ZWN1aVNmcmxKbExtaHJ6QzR4Y3p5a2NoTmpFdEQwT0pkRWRpRmFNZ2RHQlJodTNBNWtVeGZVclJPY0h5OW9PMUFVaVF1TW55Sk1UTGgxT0JBQnJERUhTeUZSNlZlWkFLbFduOGtqSUNaM0RyOVhFTWJId1JtaWVKdVFORXpmdFVYWDRwTlJFcnJ5bE95VzFZcWJYeGYzYTc5b1N6bzJQY3NYRUcwOVZacGtvNmo3SkZsUg==","repeats":1},{"count":1424,"lower_bound":"aXNFeWdBWUhtWnFVRmw4cXRla3dRdjBLcVVSY1dack54R0JHY1lBZnVza3VURHEwSk16V3J6aGkwWWlQbU1ibm5ZZXJPUFJVUmpGZVhlbVpnZTBycUM2RkhYNzNLWHNmbWhqdGJ5ajNJdDVYTG5YUDFsYlVsVUVTRmg1bndCUm1ldnVTOFBzd3lPVnNreXdOc2NHSEJHSDFxUWZjZmg2b0liWjVwNEZQRmpCM0JEV2dETTJtRDJ2OWhY","upper_bound":"aXdlNmwwbENyeExtbHZPN1FGcURxUTVKWndiWWVya0I2Y3NWbXRWS0JhbXZOamp4SzBGVklrYjdzUTJva00yY05QeHhFd2hwb3paQmd0aGczbGFCRHg=","repeats":1},{"count":1432,"lower_bound":"aXlmekFPa25SWERkUVJxd09oMGJCWldRWUNiOTJ2WWx3eU9mUmVOSFhVaUhEVFlmZHFNdktJUzRWMUJyRmFQM3FqM3B0dkJTdkM1RWp6THhGckxYd3FGOFFURE52cUdBZjhlS3h4WWd5d0dTUU1EUnFHTmVpeEZUT01FNEMxZ3BCbXJ5clcxZmlXelBuMmxhZ1BRdXdLSDh4aEJEZGdXdm9ydzJHYjJGQjFyOGh2MGloN1k3eENLV3NVOW44SUhySWNVY0k5SmxhT1ZDaTdRN0t1U2s3aE5mc3RaYWhZMmxwV1VFQkZxZ1hycTZhc0lJZ3NydTRUaXRRTTBPSHpPSkdCbHlocVE2bUZMSmtzVkI3YkJzc0J3eG1PcWphY0FFR3AzMFNTb3V1c3N5NlpIMFZxVjFwOTFMc2ZqQWlLbFFHVlc2MU16TkRLN1kwT1VqVmttSmhGNFBQMVNhYllKbXFPSEV1NmlWUHZWRWxjVzRyZEhkVHgzU3RWRTZXbjduVXBSTTduNFZ4eFprRjNsSUVMUDFaMjU0cEs4Y05adnlqM3B0VjQ4ME9PdHJraWc5bGNncTlYeWFMcHpJYlBzbFdSSXdIUFAzMlBhTGd1d3VrMzU1aQ==","upper_bound":"akFJelBwYUtSRVFuWW5NcU56Zm02QkdMdEh4TVdDNVJaekl1WWFJM0JLVHFtbU5LZ0dPRlRPbDc5NHZwTTZsb3ZweTRlWVZTM3hONFB4alhodGNZTWJLOXc1ZEJ2ZURXcWp3SWdCUWJaRW1XRHdRaFhJVmg2Ykk0MFpwdmh3YkZLUUx1NDhEcU9RNFJmUWN1TVRZRW9vUVV3MEQ4cmU2T3U5T0F3UTZ5TFRGNWs1SG9mcUM0UXdVYUQ4SVI3QThQYU5MRElua1VjRE11a3BkamVZUU1iUVJqeThxM3U1OGZ6bTZmMmIwbXVwdDltc3hhSFZsbE9hTktxclNSS1JNaEpCSFNLTjdwSnBvejhheVdKMGUyb2lkMlh6d2tiOTJZbjhiV01lTHNja2IxSE1CRG8wVk5lbGJLT0pUQ09EZ2VPTVhreXo2MWw3V1BZTkV4U0ZMVHBMVENCVm9Mc0xPR2ltdXU1NEQxQg==","repeats":1},{"count":1440,"lower_bound":"akRTQ05PSDZ1cVVob29kV0w5Q1NhR1dsRzZlYXpJOWZGaHQyZ2JyQ1o1UDNEUXBKRFhJQ1FaRXJvV0xzSWZOVUEwaTN2WHlRd09Da1R2Nkc5VktEbjhmcUxWdQ==","upper_bound":"akxDR0tmRUdaWnY5RlB6Uzh0ckR6NHA5NGpUelR6MnNmc3diN2t2WjRsVEpwSXVyZDEwVnROdjR4V3EzOGZjeWF2NGxRQnVZUGtKNjVsemNmNHdBbnNQZTdVTjhZRHZFcjJQQXZLUHVKWEZNMlJwZUV0eFI0YTJuUnBLOUVuc2VYT0JqWXU5bGJUbVNKc0RocmtQWVg1N211dHN3TmhXSVJucHFBSVlkMkNPdUZEMVVtWGdncHlMM0hOVGFKQ2FPQXRXQ2s2c3ZQUXJuc05UR2g0dzhhYWczdktORkllOUtOZ2tGYVRPblF5aXBmOHZ6RkdRTEI2NXdwbGNyQlRYYTRvbzVaWEh6QlYxT3BxMk94WWpTdU9lSHhSMWFqcm1LY0VvdGcxa2pIT3lna0Z5WGtLTlh1cDlyMnp3OHZVY0FLRnNTeUtTZTRHeFd1OUhJZUpCc29UOGtUWTlOVzZNdE10ZTBrNFJn","repeats":1},{"count":1448,"lower_bound":"ak5UT29xTzdZWEtzYlM1SFJuZ1lUeWtUdEl0UG00bDhBY25VMzdVeUpTbzZnNW5ScHhwa0s5aFRkNmQzaUQ4bXJIZkRaWDB6Q1BtS2FGTTAxRVNqTjV2aGM0Rk1UNVZaem1UT0NUdVhjM28xQUVsUm5Hd0ZLejJCWmVCTkZGZmRwTm90N3FadlJxRWlOenUxN1VwYUZUa3JNNHRqNEdDcExuM1NROEloQjVjbw==","upper_bound":"amIzYmUxdG9NMTFoOWs5ak1zdlJHblJBZVpZMnpTN2hxSFYyVEQ4YW9vc2ZXeTk2bmt1bG5KSDBCZmVVeXhpWXphTDNYWndsM2NDYm1GTUp5VHBpVlYyTkRncGlvQWt2T1FYT01hZ0taR1BPd1EwYlVoT1VaeTVuWDBCQnpVNUw1a0phVFdyTEtOVEQ5SnBMQjZJcDdVNjBjMkM1NUQyeDBLQnNIVExsSm4weFFWaVdENnJ2ZnV4dDNFTDJmVkhnZkJrZ0tjQnBPVE1PUFRZbnMweEVEdDZITXpuYlZDTFZJYmNLbjJKY0VPQnhtMlFxVEgxNENySTJqMnpmSEpHT0tXdWg5aldzZnRNYmtFWGVYSlBZY3paSzJJS3hZU3dqa1RCR0RPM2J2aXl6dHd4bFhRcmRkejJLZ0tQZTNZMzJEemxLU0JSNFZIVlA=","repeats":1},{"count":1456,"lower_bound":"amR1dkVNU3daeVl3MldzNnl1ajZnUE41TXYxckNWNmdONUllV1hUaHdicG9SWERyd2R3a1pGeERpV05SNTM0cWVKTGgzZnlaNHFYYUp0bFdWY2M1SjU3ODJ1UGRoOWVDd2VreTdVUkQ2ZTV4Y3dxYnNQQWJoZ2NwRnA0eU5YZlJDSHg3TnRvMk5tcTFjR0pGSmFqSHZ4RUxLR2Rtd0JhRXd1NzIxcEZJd1l1dVo3Z1ZMTUR4c2gzV3lvem5aamVGWHZIdXlQRFJhRWxjS2doajd5UnVYU0pONkhyNmZnRnRQMEd1Z1FSUFhmWWM1MWNTRHd2RVN6SVYyMkJvSVljYlAydHZYdThHT3Vo","upper_bound":"anJGTTdGcjR0azNKVjdYUU1UbVlNWmlZc29qeU9WdWxkUmhJQmxPcW1CN0NFeWd0WG9OenQ4WXZaMDdJUWNhSXdwZmVpRTdzY3RlaWlmd0tzRFoycjhaRU5ZbjUzZ0RXRjYxVEFaazZrU2gxV2x2SEVqb0daZjJnNmdwY2dxYW8yMGFYcDk2ODRieEpiNkZQTzNMSVg5WGN5bTlodXo3WHd1QUpONFR6YnltdlppdVRqOURjVEhFSnVONkdkMFkwRkRhV01GUmEzWG4xQ3RpSXI3TE1nQlR5RUlzQUFnVktXUGd3ZHBCQ2h6Y09UcGNiYnRpVmpMZ3dxZVRFV3B4RFlFdUJ5UEY4enpkVVZkSm1yQU5kRGpwbWNZWEFFODFDWHNjbzk5enNwdlVrNlZudTRobEgyQldHZjRXYUxYWnJuaUU3SjVlbDcxMEVPQzczUzVXdjFSdThhYXJGNEk2NDVzM2dPaEg5MXVBaW1vMVZZMWliVTgwRjhCaWl1ekR1R0lha0J1VkRPemhCaHk2MlZ4SHJwOUd6bm5iWEdMMHVVV2w1TXVwa1FqbnJQdGZrV0YxbEg0bkFxVVdGR3JOeWtobnczQW1RTWw4dnlPVVJZWTBPS2hxV1hBbXFoWXY2U2N2Z1BZRlRjaTdsYW90M0w1","repeats":1},{"count":1464,"lower_bound":"anJrMGI1cjNjaG12ZThrdXJscGRyZTJkZnFkZjlnUjh1UUdBbGllR2h3dkVldGVFbWZaN0gzNTNRNVBxdnhwaVNMNWdNS3dKa0xnYlBwZ2Q1Snd0ZWEySTlEZVZoZDk0dGJHaVAwcTNLeVJKZGlMaW5SZGJTeGVQekV3WHkxcGh5N0Y0SHBsVExkRDFLdnkzTTRCTXpkQ3dXb0kwWWhDR1QyZUtZbzdkaThxcHFMdnNrVlc5eDlWRFZqcjg0WDdKUHpnaDE1bnliZGNBRjQ5S3FudjFmbGFIV0hiQnVPRlM2dVllblh2T2tlNjE0d0NhQVNWVDlsMDI2MDRkemV4Q3l2aGR2T0ZPd0prSTZyWXJHQ0F4eFNyb3JsYlpjU1hXdzc1ZFc2ZTg0RWlySUxOV1dHazB2TjVwbklpdGNoRjVwVnE4QjRyMTR2VVlVUkdBNjRRYnRTZHgweWE1ejBjSXRlWmVuVjlGUGNoRFg3VmxIZ1hvWXBrQUplTVJSQzdNVERSd01US0lXRkp0M1cxdDEwakpYcGduSFFWb2lDTzBSNlpsanlnOGZIZDczdEp2VEVCOUNWVVA2eURBWHhpNzIwaDV3R2pqTjRjREgxOHVDbU9TdmZqaXY5NjRNZU4yUTlyQVdPTWJ2bGpiVmNGeFE=","upper_bound":"azlyeEg3WkpNcnZxUW5NZ3laN3BHcEZkenJGYTBCNXRxc0V0Qjg4MU9mczhUSFFEMzBGTE1RRkRYbVpIbndYS0FHMDdia1BYbmZnOWt4WTJIR3U4NU1QTEN0Nm1sQzF5UjBXSk5uRXBhdThocENZRlpIY3VUSWUwdU5pOVVmUndsS0xLOGc1eXNrZUlteGlybHBzMkdBSWtSV1RzbXBGSGt5Q0FiWkVzV3BOQ0dBWUVDN0JGQVNia1RzTUVaT2tHajFoUnlIZDc2VDFhVFVKdGs0R1phMXlxYkc2Nmg5SmVyZjc2ZXFCRGdIVzVGbWUxc2tOeUl5Z1hjOGhaQUtPbnk2S1lmVlhOTG1UU3JNQU1JNEhyWjJ2dENvNnBuNHR1UGdSeXlqbUd2b1FsWnpaR1FQbExJVkdBSXAxS2dBQ3BWV0d0bXptZXN0ZFlSQUt2T1NTdUNydVJmYldFamJNcFZCbk5vSlRpQ3RBUU03eVQ=","repeats":1},{"count":1472,"lower_bound":"a0N0OGhrVVFtYUdRY3Z4dDB2WE9LWEw0SkZjR1kweVJlQTJrRGsyN0VSM1JGSHFyNmNiOE9wc3VLd1dPcGJDQlJPbzJ4MmhLTktmcGNCYnphclFqcVhkYjF0R1ZJYnFMRjBxQXBDWlRrNkY4eTdYUmJrQjk3Wmo5UHZIOUpSMDZMekZYMzBhODdGVzlnSjdUaW02bXpmNW8zMEhyMDZWWjRidFJOTEJrSXV1VlZ1RzBQTnBoNGloTXVKclZGOHp0Vlgzc2RDcFI2b2NGV29BWVZGZkNqaHFRWndGYk56MTdCaHpLajFuWENTSVZvS0ROSEJ0","upper_bound":"a05nampWOE5OOGRBd0M4NWt5Nnl5RlB5cU5LV2JOaU5JZ1FqdllzZFhmaEphMWVXMzlGTFZPUjR1TnVLNEFMVEcxTWN2bFFaU2tGTVdLdjk1bkpiR3FFd3lieU9CZzVvZGFhWUJXZHFOWUg4dUJLTUU3cjdyY2YzNWZyaGdLWkxEUERqcTNKeVhaZWw0U0J6VTVUOE44VW8xc1plVncwZXRkcUl6eDJKNFRPQg==","repeats":1},{"count":1480,"lower_bound":"a1U4MUpCOXp1UlF6WjQ4YXpwcWJwYmxDRUhpY0ZVZWhrcWx4Tlg5V1ZjTmR3d2dRNVVOamhoTXZUMDRNc1B2YllscG5PaXFxbVJrU2ZmMUtMVDVNUkg2UXNneEJmVE1EakJ2THBMRnc4c2RYNFd3ek9yaG1BRGwwOTlIb2tJV0RsVnVuZ01VU25QWkx5YVdlS29IZms4bWdidURvcHJjcFhVbVcySHhVTzdsa2Y1dzFxUDF4YlljcXVUUkNOVmlHaUVJeEJHQnc3dXl4TmJ4T09xSVNqNHNGaXh5ZlhmYUVHY1NyMWdqZFRheFF0TUFLSUJxaGhOQVl1aWNtWGhxUGxuelptdWVEeGNlSTdDZmpzY3ZjV0tnaVpGRGtUbkF2S2REYU1EdnFiOWVVUnB5TDF1N3pjc2I5VFFOMG0wU1NSelpEMlJwOGFCbEJzbFBTdG9VcmV0OUNyUTJ5UFU2VUpHbGNpOGtqWVVFd0Q0eXBVY1VDekpJRzloRm9rTVZEcFQ3bkJickg1eG9iSGlSUE1vNjRYM2pQOEVDbXdOdUhnU0lhZ3E1OUNINk9odURWaUwzSVRxckRYTFZLSmZsU2Fma0xEcUdOQ0wwUkladzFiaDF4TlkxbWRoSUo0WFpQTGdhTGs1RGJGSEtVME5yWnF1ZTJtcVJybmJnTXVkSGhpU3FsRDY0ZElRREE2QTR5c1RraHBOQmU3elZGSmYyQUI=","upper_bound":"a25USmtoYUliTEFJYldmSWxDdXFnaVIzeXZQb1YzanV3YTBZZWh6eTFhdWVRVDc1YldleXBxT1QxbGdtYVVVRUR3M01nMVZZdkM0S0ZSM0pmNlhiV01jYUdhTVZYbVRIQ0xMZFFDUUNROGEyTkFjV2E3NXBIaFFXZGhMUFNiaWt4UnZVbXB3cmZIWlBiVDVHa1NFRG1tQ2dpdU1ualpSQzduNDVFZW5rdWtKMGthZHVuVGZpZ1hoMUlHdkhxZ3dweWdzVzA2NnRhS3hQc1ZVUFhmTlhhM2licGs5Ym81WDB0TkdnMjZCSUJyWFNNVDl1dTM3ZUpSWTFCVncwVnhpQTg3aVdOa01HME9JSllneVg1akRCaVJMWHlxZEhVZ3ZHTk1JQnFKRzlMN0djdjJaeVh2aVVEcGlMODNwNGFtdGQ3dmlaTFRnQm5tdVdlUEtxWFMzZXhoRElxeXp1RXRnM2pZTlh4RUQ3VFRuQTNVbHkzUWFsNXdTdThvYnltd0JVUDlreEY3SnFNajlDeGxqY1ZYMGRlU3JJSzRlclQ5dUZBRndQMVlYUmR4bktxd3lCRXp2VHhDbDEzYXk5UGhYaU9tb3NJM1c=","repeats":1},{"count":1488,"lower_bound":"a29jSEJ1STJtSWZwdGZsTWhOV25mWVJISGxrVWlJeEFBaVdSbHlwNHZOaERwMUtneGZoR1hNRHpZQVNQTFh6RHpHd1NwZnY4Q0Yyd1JhekRtQ1VLc09IclYw","upper_bound":"bDVTdVVUeVd1M2wyaFJwSU1BcngyZlhSVHJXTEZ5U0MwM0lJbjZNNkVzdkZrc3RxTWx5aVNJTjJQVmV5dTZBNmhYT2RMNVV0UWVPc3U2QXg5Q3RlNmg1QTlUdmlPdWJObFR4UnJ3anM1OUNseTZUeXFXUTNibDJ5Y015NGFEdmp1cGtlQmRnSXgzUGxBUnRVWGFrY1pLSDFPTldIcGE0QzU1SjBnbTdCcThnZVBBSE84ZnhCbkxyR3ZBWnFUYjV3dGd4MHlhMERYZGZUellQejczVGZGeXJNY1I5eDlsZUQycTFNZ2RPWFpRU3JaSXFwWEpBdUc4aDhDVlQ4WnFHQTN6N2w4Zlo3Sjg2d0pOSDE3TjE3a1R6UW5jbkFsUTNJRnpmcTZUb1BHamd0OUZ3ODgybXZOdjZWd3IwVzJpeHdpYlh5eUQwbHN1cGtqZHFodWo2dzNlcHdHdU5lR2xOMVRLaEZWeGpDOWhoUjdaZDhYWG54SjQ3SGlaV3c4elFmaVdBRnlnZklTbkV3d3gxV28xcVQyOTlGNGpjTWZ3Y3JMcEwyWmR2akFmbXdWZE9sMUNlTHBVR0E2QkZkZVZvdjYzTUMwMk5hTHZpT1c4QmlSSTQ0NWYzb3UwajMzWVpHc2lWR1I0aUNWeFZGNnVEY2tZ","repeats":1},{"count":1496,"lower_bound":"bDVjOFRrMURUSVJyTFZHdkk1NkRTUlpmNUxETmNGMjdWUndVeVB0MWpqYnExY3NOQTBuRVhrckJrM0JSS1lXWlZMbGJMdjM2UVFlbFRnV1dlbGhVUE41a1ByUXZzOXlsaVRaNUtvVUZRRGJacnpwbUR4dVZFZjdFMTNickUxS3pVeWV4MUU1eDFLdWoxTXpZSXVld0g2OFlnQ0FlMFBESmJ1M2MyWGhXZ0UxYms3RmZMamg2VTZhZ25Xd09vUVVxZ3dES1JhQlBVTmloNWNhdmdicXppajZJSTdWRnZWQ3YxbEpNSnA0VzhDaU9sTmtwSnJyN25qRTFIZXZob2ZmbTVzTjR5cHppN3o2bmU0TUxtVTVDZHlUSDVWMkY2cTZtdmtLOFhHRlRjUjJTeE1pRWxkQTJicUpUQzViMTY4T2FkbjRQS3hnQ3RLeEVPRGdKdnlDUDFqbnI=","upper_bound":"bFUzZmc4aTBnd3JEU3pkWHVxdEt4Wmc3M0JBQmY5ajRUeUxGWDlkUTNBZFdnWFprdVhiY2ZsT0NYVmluSUIzZGwxeWlaY2NkZ1JUaWx0MlRDNmNNanlKUHRLTVQzMVRsMnNWeE1KaXh5VGhBMGdrSlQ2UVdMdXp6cGFJdUQwVkVXWG1PMHU5T3F4dlBkZEQ2T0s5cUhzOVl5blNWcnBwdUh6aGdVZzFCNTJ1TnJLY2E2OHhQeFV1S0JJTHRJN3lLZmNCRnJUQW5obHR3WkNFOEVVR1VsOTEwUHY2MUc0RjVYZ1VvQXYyb0dxWXZwSlVZRXh3NmNyNXhtd2s2TW9mMW1jNUhFYVJReDdoZklJTnc0Z2dIa2l0WnlWOTl6eGhtd2hNMEx5YmFCVTBlblRqYlhwbnJJOEViazlsZklwdzZuaWJKanJzMUVkelVoNHVONWlBcDU=","repeats":1},{"count":1504,"lower_bound":"bGRoTDNsVk5QcTUwczJ5SlNTeHVzNUpFMkY3bVJncXN4VGk0WXlrU21Kd21YUWROUU1RQkFiU010cUMzek14NjNsOXdsQ0ZEektIQk5jb3h4N201enVvSkF3YlNqS2xHSmtRYlVwUW4zOHkxa2UxZDVJeTFmNVBJZmE0RmJjOVNibU1lS1FUT0p1andLT2hhZENTeVRkemZTRUo4NXBsZ3k1Y3NEOWZYQng1SzBVamxZcHU2dVF3MmU2ODh2UDZMcVllc2JIMTBWUHIyWFFsVlFDNjg0VHhuTk4zWWdEMUJYZE1McmhtbXRHSlM2MFZQakkwOHpoaTdOZFEyWlRiTXNEdlZmUk93NVUydnFnQk1mQmJybFJOTk9sWFZRdzVwN29ZS09tcUg4UjNnbFlOTmpIUXhEM3F1YjJhekhhT2w4MkV4cFhtYklqMUQzWTZNREttMW9GZUpNc25iT0hiNmVzR3p2NkFGd3gzZnVtZG1oRjJWcjJ4U2l0YUdnS3VDa2FUcVdnNlVqSENKdXkxWWZVVHROdTNmMHdzMFk5VGphaDJWU1Z3TWY0Y3d6MXB5NzQ1SUllYmxOQVpzQkIxUUM4TE5TZ0FFTW1MaFhLWXkyTVVyempFYVB5S05uS1FLVkE4YjhFY3NPN2pHaGRjM1pZeEFDVVBYeWZJeFo5allJeG9XVU5wa0RsUmljN2cxQW1XVjNVSUtKVUUzc2hk","upper_bound":"bGhhdUd0ZU0xOWgzSTJtSGNHdWhyNEFGVEg4clBUamlwUzV2YTlJRnZhY2s2SGxMdUF0ekcxNFF5Z3EwMENESEgzSExDSkdsUnhTZ1dCVThWZ3FRU1NybE1HSmtKMUJRZ3VTcUpiTXVmaGZFSUJNOFdnWWhPM005R29jUXFFUFU4TVllbzhoOU1wR3pmYzZrdlZlcVlVT0VQYkRzWmhpZmFsWFZDODc3VVNnOUxrODRrbk5jeE1sUHFZcVdCdW5MWDByMWlFczBGTUNicmNPMFZ4WWxsSXJFbmJWdE9tc3BzOWVDMGdxYW5MU0gycElKZFdDSmVONXpZR2hYbjlJbU1Sa0ZYVHhKNDN6NmE=","repeats":1},{"count":1512,"lower_bound":"bGpIVkF4MWM3NWR3N0E5Yng3NzBJblZHZmF2elk1T2dTU0FINVhhMURPTko0OHpURzh5SHRhbnp6TkJGeHVaWlU4ZFpMRGN1VHBqSk5OamRtMDhRV2haNVM3bUVpVzllQndXTG9DN3pIQUJGZzRNbHBvT2lLVWRTcjZVZnlyY0Z5SWMwMTA5c0Z6Q1RvVnFLZkwwUGs=","upper_bound":"bHNJTFE2bkYzcU82dlVPWGxrVzNDYW0wNTBNWnRJUFlJTkJuUmowdEdNeDh4Y1pIWVdFZjdEMTlPUFBMWGVTMkZYMFF2YlBOYTNzNGhYZW9QaEFiaEFUSDNQYUl6U2lwSFFpa0FuajIwT3VNUWk2ZWJ6WDRNN0pqa05tZVZqUjRCU25wbnNObzd6eExrZDVJNDRPTkJyZUJpVmtqVUJJT09rRUM0am1qcE96WHNKeUZrR0RWRThUZGpUV3hpc1g2Q2U1Tzd2cUY5ODlHSG1ZcmFBT2ZvTlNhOXpzamprd25leDJ5VzhJNGxtU3ZjRm1IVlpVV2p2amRodHMwWDNNT1E4RTJlZkpjQzluQ0w0dEZZdlh6YTNzaHlBOHE1d044VmlXZFI3NGZvdm5yYVhuWWI4UHp3dlk2bjJqRXIyYkFxS3BsVjZaTlAyYWpCTkxpS0hab3pPWlV1WTRCSTZiSU5sV3JjQlhiQThFbmV5cUhDR3FGSFRaOTh5QmpMWWY4aWJpNEQySUtGYXJWNlJEMXRmUEtZNk84NzgzaDJmQ0hoVldweEFReEIyRkhhV0VXQlN5SkR0bmcxdEVLbERpVExoZmU0RXVj","repeats":1},{"count":1520,"lower_bound":"bHcwaDJRaXJaTHJwNng3eDA2UnNYTjZQb05sYm1OUzBKR0toTFZYdU9nNFBqZVZBR3Q0anJMYnUzVzJaWXRONWx3c1VhcjhSbjFYd1dDNnBYTGhIcnRrdEEyNWY2MkNuNzg1WTVYaFJSblJWclYxUEY2dzlCRzVNMGJDNEEyRXhBS09xeklVZjhPRGhxZXNZdTNJd2NLZDZweTk5SFNnckFVdk03MGxKNW5HTGFhbEV6WHJpUDdBVlFVTzgzZjRyc0V3dW9JVDNQdGF2ZkVRbUdQZEtxTHpnTGNtMzFGQWs4bkpZOG12U1F5RmlqZjIzc2NrclA2Vzhab2RsWXN1eVd3bkdxTG9DZnFlWTJZNXJyTjc2dVVBc3dpeG1zaVQ5WVBPWWZyOWtibEIzYk1XZ0R3NnV0NEh1QkNwT3NpdnhCc09XdlFwa1cydVNhcXQ0eVd0QVJvY3RvM1ZGMWtYcE5Xd094SFZGQWVLRlV4cHdwS2pIQ2hyUmxwNlcwWnRPQzlnYzlTb0V0Yzh1elMxRUI2aHlsRGxzMHhhQlpqa3pCRkVwVWxmOXBrOVFyT0xxMUZCRnlGY3JaSnJwbWxyS203","upper_bound":"bUNOY2lFNVhEUnVpU2ZhM2lDdFFneHJ4UmdpTXpLUUptdEpwUHFpYzJJRm1ZVmtQOHNmeGRhcUt2M2pENUZJWDRiRWN2YTJ6NWZNM2cxN1hsYkhqYmJxbFFWU2NnUGJDd2hNaHR4QmJWM3hHZnAzTHVZWnNsbVh1WTR3aVlXektHTTg5dkNvajJVTU1BUktONGJTQUNSUUNaanBhVEltbjQ0R0hJamFIY1NjN0pUdUtyMnNLRlhveGgzYnJvejdqR1lKRA==","repeats":1},{"count":1528,"lower_bound":"bURMM3I1WnFtdDdtUG5qRkVuN0QxTkRLQUJ1WUpYaGlQb1Q4NFlvd1B5djQ0NXh0V21SWExjNGliTmxuUEJrc0Nndks1bWVmWFdQMzRGbGRqMTJzNWlrUFMwdnNSOURUMThMbXd3b0Jzc2l3c0V3TFVWU0lDcm5RRlE0OW8zTmM1Z3dZblB2","upper_bound":"bVZiWnpDbld6NmlXTTRDbjBBUmdiYTNOYWVQTkE1MDljT0xkYUU4MjRQbWlXTUROaFZoVVUyYW84ZW5jWE04VXZoaEx6eHVpMjRSZTBEZ21pdmhi","repeats":1},{"count":1536,"lower_bound":"bVhjVkpGQXY0NDdLanQ3QnRNUEJCUXFnUkFta3IycHA2WnpldVZlZnBHWlAwNG43MmZpNVJLTFRCaE0zcWtkc1R1eDJQdHVGYnJzb1V2blZGbWU4Sk80MXAzUmJjUHd0Qjh6cUY0RTByWnJwOXF2alJzQ0t3MjduRVhLS1NaSkVpeWRaOVk1SUF0blJodGtneUk3ZUY5T2JIOW1VcHhkeVBneGpvRGtoT2wzamFEYXE1UlduWmNmalo5SFVtdUJ1V05FMkd6QmZJMlVXa0lzVVMzWEFlMk44bHZ5cHZvRjJDdFNFQVV1OXZNMDJmU3FsVGl5SEZnQUdyNTdsRlIwQldyOXc0WGNDUm9rVWtOYUNEOHBSWEVFUWJDaDl5YTlRTW05TkdOR2l6YVVJNVEzNzB5cXd0TzNlZUVoemcwd0tLY2hyVFFrVWtCYkJkclRFTnBBc1lKS1FoVmJZQU5KZ1I1cUFqUEEwZWJ5Q1RGaGZUZ1JTVjhZREZNVW9Fa3czemloeFZFMWFaelI4OFFJZWRVcGZMQ3FtZHhHU3J1cUtWa2VZS1MxWTFGa2RlM3RTMFpNalNsRVF0NDdTcA==","upper_bound":"bWI3M1Vyb3ZHRGRsWTdtTzVnaHZGVmJ3eDNjQlZoNWtWQXh4cW4zT1M4S0p3eU0wZUtDcTEwVFJyVmZzdDAyVVpMbjZGbUhGSHhVclJGbW9qUmxySFVqYm9KeDZmN1dRSFF2UTBqS1FYZ0RvakdTQVBmZmtQODhDQkt6U2QzTGo4S3pMalZQb2pEWHFzcXZxcUI0dkF3eFpmUHFTYXZkSlVzT3dwZ0FCVEZhcVp6ZmRHVmdOVG9Nak1FSkMxYnFsbW5EemRZaVNmeHl1VGVlR0JQZFIzOTFpSHJac3hZSG5RT2ZjWWw2TFVtTlpFNzFmNVFNaEtaM2tLaHd6N2Z3TkRVdXNWeFlIYjdPMXpkN0NqejcwQm5qSw==","repeats":1},{"count":1544,"lower_bound":"bWhqT01SeVVkNDFmZ0NjcTFUNXMyeG5xbWtCY25MeWZjTHJ4MnpBejBMcW9TZDlFQWhHZWJ0eWFVNGp3VGV1SVZkTTNrOTlZMk9WVjRTZHZzOXo0Z09vMGtxSVNHU29sNDlsc0hzaXZLQ3loQUtqQnJTcnhySzViT1lVOVExd0NoWE9yNE5xSDJnOHJZR2ZJck1ZSHpUaU02RERqaWdZWTFRTVFlOG5mTWtORDZHV3ZxTWxrVDBmRUFqYWJicEppMm9vdHZlbmUzVEZTWVVtQ21hQkdkeFhIem5BenVMZWQ3VU1LdGZneUpPRUtKU0ZRQkJSSG10a1R6Y0txYVJ1WHJiMWZDY1pmRzBjbFFxa1N4ZjB0RG9nQ0ViS2RPV1IyQ3FldlJxUmc3dGswNUNCSFhXUmxLSThmbUpwN0Q4aWtrTTRmdGdJYXNKTW5udXR3NUNVUm8xbXd1eWFIR3kwNFBJaTZIM1YxVUplNDQxSDBUclZOa1RpNVRwRFRmNGZPWHFvR0xSQjdsSGJOQ2dnNjFmUzJwRGZEcE50cnFFNUNvT3lNRnBUMW1ha3VKRzJLMjhGaW93dGNsQnlKeHVOQVpqSXEyZ2NnWERzeHF5VDc0","upper_bound":"bW9DdWV5MDV1bXNVWlQ4OFVEWHR0TkpXa0JpR0NUYUF1WXhHbld3dU9pOTFWWm9RTVlWcjZ0SUw2RDdySnd1UlZPMG85WXhXb045clN0V05WY01pVHJOVHRWSzdkRExNY0d4S1FEWk1ZNw==","repeats":1},{"count":1552,"lower_bound":"bXg3UG5USHE3eDB5UEdyd1MxQ0FxYUhxaWE2S0ZKZVVqYlRYVlRydzhpQ3pzbkNnMDU0Yk5ESDcxYlptblRiQ1RZZEZUelFwSXRkdUNOMFJVYURkVTF0OHU2WHp4ellIcDdsa3QwVUw0cTR0TWRVdDNkUjJPM3lGeTlPZER5Tnkyc3BtaUdTVnloZ1NKM2VBd2RXeVJOYjBJRjRmclQzU1lUVUVrall5NVFVbUJvTjM2enJ6bE5PQVlmb2E5ejJqMTZ3Y1Y4NVlGRGtUZ1M2VUpsZkNPb0JJQ3Z5YmJteFBkRzdWcjV5ZGJTdmkxM0ZrN1FDUVM4RnpVRjdNNnN3bEVUcEl5QkppSmJWZzVPQ2RqeG5DVENIRE0wRUxsTUNFQjlPdDNpck1yRVJDVk91ZVgzVXA2bEdSRTgzZ3E5Unk4dlFabVlOb0p4YzJLWWpuRjl0QTNlUWdaMDFGZmI=","upper_bound":"bjNNajFNZ3M2Y1FEVlZ5cFd4Q1JmSlJSVXpwSWpBZHJ2OVFqdjdvbGlEalJzNG1nNDBzMkNjQjRQZGhpVFdOYTQ3Z3g3Q2lNWTVCdVNhdG1aaVphbzZZSllFNnZRRmY5QjhCT1NqY09veHJoMUE0YkpINTM5cU1kalhUR05oekRmMGdiZDI3eUZQNklWb2pORlVNd3RFZWxOQURUenFKazI5am5zbE05Q2JWaWtncnZjU1U3","repeats":1},{"count":1560,"lower_bound":"bjRGM3JXemFyTERJUGh2QXJMOGhCRFdZeFRaRzBySExyT2NTVVYyVXB0WDRQOUVxYTJBME1sc05ZWDN4V3pRZXM4NFM3bDB6T2JhZG9HcERkSGpPTkc2T3AxdkkyUVY3UUlnSFc5bkJzS1ZScFRFQlJ4dk5OVUFLWFZBazJmcmRyajFxS25RU1RJSG1sU052bnM0TEQzM3pzancwMXl2eHg0aFJLaVBNTDhWUmtTY0pqanpseHZEQmhYVzhCbXNETERwNk00S0RRUzFXRTZzMnhCTTE3MDRPTTJoT2RCeThjVm85MWltaEl5YWx5MXZ3aGhDeFBkYnBlSk5RZ2todWJTbmxCMWoxNk1yZGJtcFVDYmRKOFRtOHY5WGpac0hFTVdGTW9CT2xlOUlQUEsyYVF2bXVjT05FRWRNeHNjYWZkZnY4NnZHNHF6ZTlqMXQxdXJ2YmcwR3BNRg==","upper_bound":"bkxRcGptSllOc2RjbU9SN3d3d096YUxscVFDVHd2YVlXQ1NYTTFnVXlRR1o3NkpENjJQamtQSklrS0NveFNaenk4cldSeFNsdzNydERuN0RyRGFiZXYxcXdkaG44bUxFcFlLU0RkYnJSaWgyUGJxdG5WelQ3YzFQbm1KOFA0ZTM2OHNTZFNXZExDMzlIZ3NSRUxvWkNJWGsxY1RyTmxudHloc2VIQWdHcDNEc3Y3NWhXeXg3Nms4NW02dDl3NEY2Tmg2RnBIRWhCNTBvRzA4eFNrOQ==","repeats":1},{"count":1568,"lower_bound":"blN2eGE0SDVWYTVidHpJVWhkbDkyRFRkYWVDY3NvcHJ6WEFmVGVNWUx0Mm9QN1Vo","upper_bound":"bmdxSTJiOGNrRUhYVDhhdEFtZ2RZSXloUDZGeThRcWp1OEtmbFk1RnBucldVUW5JNDE3VE5ucU01UGtyV3Zrd3NkaHVlZkFPblNDQXhVYWI1WVNwakdDRnZackZQamUzMzYwWm9OdWNuRGNsQk9LaTBjazV0VFJkV1hsdTVCVWpqcWR4MjBVYXR5M2p2dmtzT2l5ZmdzYnFPQWRNZ09xQm9qZVE1amQ4dWFibWNOdGU=","repeats":1},{"count":1576,"lower_bound":"bmxmUlRTeERqcDlENUZDOU5BMHo3VHlVWElhd2hHVjRKdTl2TjNBUE1FVGdUNVZwWVNpUlNMVDNObGlzbHgxSU16VlNkZHRRTnQxa3hLZmVXNkxOMlp4V3JxOGRuNEJkcUk2bmlPMXNPb0hSdHpRdEtDb1B4MTFObzh5WFN0MDNTMGxIQzRpeUF3VmE0OTBCOHRlZzI0QWpPVWxCUE53WW1oVUR4ZnJZTkc1Zncxb0NlRjFISzA2cXZHYUhXank3YTJUdkV2ODg4dUtzYndhcEVReWp6UEh2Ukl0c0xPQ2JkNldFRGRUOTRUa2tpU1N0ZmJJakNqTnF2akY5SzVVd1kzZU5vWjdzbzk5V1pDTUFTNnZCblFVVkZYM1duYXdGcktsZk82NGlRQ1U5","upper_bound":"bnlXOVVRV3FMMVVFZXdpYVI2Z0NpaTBNelRCUWNzdTlQSEx6Skowb2RVYWh1WFFFdWNJOU5sVmhxb3F1akxtYmZtMVZZUkU2Yk9TUmZidlloQ3FqQ1NLSElrdUhBZmgwOGpGMVJhT1AzMTVWaWJxT2VhcFlIQW5zcVh3RkFSNlhocEI5OWFBTm50cmk3djNIc2R2cWgzNXh0N05tRVloZHFhYTVzTksySGtWUmtVSFA0MlpXQ0dCUk1md2lBc04=","repeats":1},{"count":1584,"lower_bound":"bzFiWGZwVGVqdmUzb2pteTFKZUFyUVpPUzdPNnhSR29JY2cxUHRLNE9VYlBRa1N3dU93Ukw1OXM0MnI4SGhWZ1VxaDBkVDNMODhFRGVxZXlXamh3bUNhSXNtZ2NLMTNQd1ZHSjF0T2lERjNxVmh5dnpKb1FCMnJ1Y3BkNXNBZEFPQUFjZUNGQlpoUUhnVzJCRks1RUE5ZlVQWkVIQmFnWWxIa09JVXExbFkxbjQwWmdPOUoyUXFWVlB4Y0hoallNbG8yT2F6NUpIcjFlcUFEWkJURVNCSnZNZXRObXgxdmxWaEhvZG1yMTc3ZHZZTVlibWhRN2duWFdYaWJNdXlNV1dKRmdJMHVEVWQ0am0yUVk1VXFPemo0VHhIVXpzQVlkWnBydks2NG9DSFR2NGZvbllZVWhhMzhsVks4Vldka1U3WkhnTE00anJlWFkwSk5haUhQREV2OTN3ODhUYlJ1cUJwZWc4OFZGWVMzYUF4RTl3SzhMWGM5alN2TXYxTjFNUWhVZ1p3eHZpVnlPbERVaVg5Z1d4Wmxraw==","upper_bound":"b0lLN3lpRk1pSVBQRU02cVRBRGRxTWpNejJ0R2RIMEFXdGhtbW8zNnh3QnprZThPdTBwM09EdngxeldZcGE1SW0yRWJxVmM1ZEZ4NXB4c1hiUG9PNzJPNlBOTjV5bmFFQ3ljUDNOWkxyYXlVWjVGcDBBVUJDdXVlYU1RTzJVOEd0RWtiMHVoZERvdFMxSlM5UGV3cFgxdGdNcW91cEVzcnloMU1zWkZzNk8zUVRBaHFhd1ZJQkZJREROTWV4Z2ljaXhBakNnNnNkVHpxam1GNkhKZ3dqUHJtMWgxQ0w4cFBpSEt1Y0N5WndGZUZaTk9XTGFlUGRQN0V0TVprQ2hjZDh5T2tZUjlZOVJmaW05T2FtVkUzbW1yVHVwS2NReU5iQjJXQ0tzZlJrb1hncWVuekNwcTVKQ0hMcU40UWxLMHUwd2V6VElvNFF1ZWJIaWJmU2ttMHNnUXc5aGxNeUxURE9NOUVkdWVJMkFuUkhRcDk2a2tKQ0dpM3BCN25WVmZROGVtY3hTNHJ4TWt6cEk5TGJLVWJtN1VhSk81SEFWVFlNSUhtNW5EU3ZuR3c4blNjOTVyaVVNeE9WVE9iWm1sdVZkN2ltN1N2bll1WXAwMGNJ","repeats":1},{"count":1592,"lower_bound":"b0toSVJ0N2tSYXN5dU14d3dMOFJPSnI4WXRPQlpQRjhIcHNsNWFBZ2NuYkUwR2tHM2pIcHJMNFA4bkV5RldLRXVwNzlJNklWYXBzVGdFU1JTaVM4MjlyVlFDSFFZSnRZU3pUQTNNem5wYWZScmNPSVJ4M3B6QW5UenlMZ2c0clMzTjdQYVVmUnZyenkyZlE2RElyZFc4YjdpYlJOQ25PaTRxenJDTXNGR29qV3hBaGhoajB3Rk5WeFBYdXRrNUh5NjNpdVJUTFY3dk94TGk0YXBSb0Iwb0FmQ2tGR1BmbzdBMGl5Nmh2ZE42OWJyS2VTYmVtckhEZFJQV3N4b0pQZWhEalBEa3I1S3IwVm9IMkhPNXJyNFRHc0d3eVhkMjEzUFo4UnJ5VE9IUWtqN3ZRNzI1d0l0ckxlZjhUc2IzdDJqMVlrVEVsSmU0R09mUENaeDNPTUVMbk5Uekt1SEQyU2pldFVlZGhXVUJYeTIzVENJSnA4ckpyVnJKSENuYzJaUkxQSEx0SjJtdm85NGJKZ0pTSU1WQ3pWTXhyTUdGWGJxdG5tZFk=","upper_bound":"b1doQVBVWFhqczZjQklpUkw0bEtPOEc1blBCQnQ5T2VTeUZkWjFOdXROTzdNVFF2Y0pBMEhXdlAxbkl0dFpnemJ6NXFreUJKNWx1M3dKVGt6UHhlTk1nUmdBSmZzMDZvYU5sU2JkZU9YWTBNU0lualBkZ09kb2V4cw==","repeats":1},{"count":1600,"lower_bound":"b1hkcEdXcE1KRkFNNTVjdFFwMUFwY0ZQS1FoTmNORnhtWDFUamE5VlVrV1NxZlN1aTVqZmFiMXJJVVNJSFFMb3h3ZFBDNDJKRjJvUmw2NFZpVXpqV1haS1pnc0dkQkVVajNiWkZqdWZzZ0J1Y3RNbXY0dzJHZ0s1SElmaml0SVdSZWtWNlYxVE5tSlFhNEVVZzNKTktTRE1WWFVrY1B0UE53bVVTWmxodmt1VnFrQXRmUE9wWHl6RnRMVHBKSHNOM2dZMkRGR2l0QkI2MFhBWW5VYVowd2hKdFV0andZVFo1Z0pqOXdMUkhMTmxEcGtYSDBrUVRwZzhVaWMyOGN6YVdGUlpncURvNFpSOGlDdzZoYkF4aFVzMnJiYVRuc3QxMW1lN2RITHRiQmRwOG9KWW9UY3FsYWNQekQxNmRNcnl2aGhnbW9aYm16TUZrZEt6a0FmNEU5MTJYc2kzSHBVRGlmS3VFZVhUTDl0cTg0NWlIM2pURVE=","upper_bound":"b2lka2U1V01rTW1WTXB5bXhzZ0RyVGRqU29pTlMxMHJuZEVhSnhPcXVHZnpKNmpyT2Vzczl0eUI=","repeats":1},{"count":1608,"lower_bound":"b2pTdEVqRmhkNUNiMmQxSmpYdmRJZGtzODUyNVhGaGVjRVZ1dXdxblZLNkJCQ0VrRHk4","upper_bound":"b2xBbXJLWjc5Nk05cTVhY1lhOUpPaVQxWDVXblZweUtFMmozNUFEWjIyeTRjTXFaajk3ZnFJemJmR3VZeWQ3bjN6aEttQ09GeEZUS2pKQzlFS01VT2t0OG5LYlBCbWZ0a3A3UnNnQjBmczlJVHFmeDRrVVlFM2FmVjZzcEZXZWNwNzRocFFoNkJrb1Z0Ym1EMkRSVW1LOVdmeVZycWxRVXJDVGduckFLZjZvS0g3bm80S3FTRkpuenE5TEZmOXBOSU1BY05PcVROZHZ1WjcwT2NYSFd1Uk1jSk9aQ0I0dklDWUw5V3lQbVhxYzFFSjNWd3psNjg0UGJkQzF4eWk1dWdWVDRaRGtycFROd29JbDdzbW51MGJpeUFtVVVqVUhBd2NYRWNLa1JnZnBFM3k3OG5hRG5SZkpzalU1ZmNvVlVGZnJUemgxWG9nRWNxRm5tQkZPWUdWVFRodE1sVmI0VzdVc1lRZjlOTHY3TDFDQzFuZ2ZudGVjdFR0bDZ1NE1Jam1MTnpLTGIwYmR5OWhCZEZvdml3UVhaaWtuclltWkpyT3NWSndMWEI5Vmw0YWZFT3ZUbmlHMjd0clBkU1U0NFNTem5zQ3pz","repeats":1},{"count":1616,"lower_bound":"b3JIWmJTNlo5Y3BSY1RnZGt6NmtkT2ZsRm9QSXhreVpjd2dDN255bVpEeVA5bm9CRWRITllEV2MweU9UMnRWR1kya1FsTG9NYzVuWXAzclEwbE5zbHdTZzRGc1doM1I5Z1hVNHZVTDBVN1RUN0VEUzV1U2ZHV0FCMlRuUnE1aXh6Umh3UFpaTnJlV0o4U0FXN2IxeTRPbHFWSW5KSnczcnRHdzRqVkhnR3Q2N0NhNExTMW5BOG1SZ29pZ2hIa3VsWXNCbGtBSGNJWFE3UXp3akZaM242VlNCckJhank5TFdSM3NWZHZ1dnFMNEdZbHlOaUNOWHhaekRXblZXM0E5OGttOUZJMHdqTmhVc21BWTYzekVHN3MyYnBwY3IyUVczbnVsNVBNaHU3YnJOZUIyOU9LakJ4SnBBOVhva0l3WXpLbE9VYlZleWpiSzczYU9IWWhwaFl1ZmZ2WVJycTBzaGJDNGZIZnNsNFhZemFrTXZIWmlpTWpucGdQNHdKU25Na05xU3FralZMZ0NXcldGbW95OUNKYk96N2ZtTTA1WGgxdTJhVDFveHFWUlNFQ2JEbDRMbmpUTFVMWlFWUU5DeWpTS2o2YUtUeW9rd0NsaXcxTUlNZEVndnVxR0ZDWWhCWUVyVmZPWTB0Qg==","upper_bound":"cDFnQWhUNkxlcEV0NnBGTUppbm9vYkhEbVIzWmJiQUtaaGpOTE1xdlJzTWQwS1RlTE5xcXI0b3B5UXFBYmZwRk8wbWdVOEFQUFVRdjU0T01DSUVCTXA1azFnb3VMYWxnUU16clZDOW05UzJPZ1diaHQ0b2MyMHFoMTFyQzliUU1EcUxSVmVGc1NE","repeats":1},{"count":1624,"lower_bound":"cDJFNU5OenBacVh3ajlxR2pDRDlPRDJyVGdaY1N0eUJzQjYyZWNQd3BsRHZsNDNQMGpOMmFheUc4NnhlQWlIY1h3TmRxR3dUblNxdFAzeE45czdIT2JFZXg2SktVVlBQbDRISnlDSEdaRXpHWW1EZzVGcjVySERGNEx1dEdEZ2I1VkZucE9NcGZvUk5XR01wUTRHelAwMXJBcmcyejFpT05aOG1CNk0yN0luMVNYSWNwQjNCY3JDUjhYZzAxQUxza3hlZ3ZzVXBZMUNIZWNITHA2ajBUWlQ2elBjcW1GQjdsd3Q0QnRjRUV6Q09KS2JuV2JsZGxldFN2dTFFdDY3","upper_bound":"cExLRjlxZmJoWkVGY29nQXpJU2hWM3phNDRFakc2VEZXOEkzZlZrVXdPbHl5cmM0TnpDVFlwbGF5R3JNZkpWUzZqV2Z1aTJWTU9DN1JOU01vSkYwUlI2SktET2d5VDlPRk1RNFFPYTBMcE5tNTdvQUtQcFF3a2x3aWtTSkZaMDl4MEptRW40c05JSkxPcndadnZ5SWdsaGV0S2ZEeXdacGdRakpDMVZTdVBpMURRaFJKMk1Ld0d5bk9MZ2piQ1VlY2NsWlVpaERvTTJQZmNQRXN0NENuYWh2VllXQnlVYnhmaEFmWG92cVdYWjFSTHNMY3dnV2lQOXNDV0t4SjBZeExvcjR0RnJmcTRsbEpiR21OMGlGNUxsQ1lkVzBIMDdlRTNTQnRBb2lIa2U0MDUyU2xDUmdvZWVhVlFUdGJXQ2FTT2kya24xWTZ6UVJ0M1FrcW1weXlLbUFMNGNZRThrNU5HSU9pVUZQUHVBQUhhOEtGMjUwaFRwUHJqUE5aSzlieDZIMnNnbkVCTHZqMElqYlNnTzdNYjhjbmNlMEU0Wmozc25TT0dI","repeats":1},{"count":1632,"lower_bound":"cFBsNUlid3V5RWNIVUJWdjNjSUFQcGZIZkpnVGtWVFNXSWJUd291dUd0RHFRWGljRkVoQWY5MUxwSk52b0cyN1Z6UW9lREdnUW0wZEROOThGY0hQeHNsdlNFNjI5bVllcGNmUWVFdmNLU3hpeGlXRHVZNU93MnFldUJERFV5Q20xR1NkdDY3MklKNGpKczNDNXR4Q2t6V3E3TW5iU21VZjhXUUNjSGo1MHdKcFVIZHpBOEo0SjhGMUdLMUdsdnRHTnlzZ3ZaSDE3ZDJTVHRKREFGSjZwRjVNUEVObHJCRUs5VUswTEF6aWhicVloRGtnQ3JTU2ZyODZHSkpqNTllSjJwMmQ4bVhqNVNMZ1pTMkZCbHFFaDVwSThweHJUMnU5QWw1ZlpEQXRXekJNVngzb0JZMHBkcGZTOEs3eU9Gc2NlMWFaUFIwUXAwcnlvdktoMGtWck5MMzFnZVY4bVJ0ejl4TzBIZ1VxM3o3M1N2cDM5dVR1NlpHQnBJa1BFUDMydzhFblJiNkJ5eGFQREZNRUg2OVNjM2VHbmZTWXZmVEp2aFQxV29iS2Vxb2tYMGg1cnlWTlR5R0REZ1VrNm5DUng3WE5EamZnUllBSXpSQkFkWXNi","upper_bound":"cFZod1lHOGlVVldqd2pUV1NMaVdsbExEMGIzdnVXOTZnZ25kbUZRbUxVcWxRbUQzc3NtaUtXQWMxWUduUWF1eVQxSlQyc3A1M1pVSWw2QjVUaEtDc2ZjMXJlSDNsMmI1SWxERnhXemVIdnJ6b0h3Nk9teVFYTjg0U3I3VTdyTE1VVlhlcGwzY056ZUxCYVFwT1RtNjhkY0RnZFY=","repeats":1},{"count":1640,"lower_bound":"cFpENTI2RVo3Z3pROGZRR2tTRzlPWUZzWU9qZFpXQjNlRWVwblRXc0VPSHRpelg2S0xuZ2J2VWo5Qzd4SEJYb29mbHhhTW50MUtBN0hvZk94R25nbWQxQ1d3Tm9pR1lQRE9NWDZtRFByRmdieERoR1pWdlFZZE1nMk5lZXZtb281d1hGVTNST2xjNHNPNkxMVg==","upper_bound":"cGV4aDZ2VHV5NERlOExuSmszYkpuNW8weUE5VEJKdGNzZ3h6WHN1NkhBS1lSYWJHWkxjT0tsY1M4UmJ3bGxFc25TYktpeDhuTHJiWDVhT0RwMEtYQWhjZHVFV2VrZUhJbmNaVkhJVExFc0JqWVR5bk94Y2w3RWJYVWVLR1pPOURDVGxnUVVvNDRLbENYZlFrZjRsM21ESFo=","repeats":1},{"count":1648,"lower_bound":"cGY0SW9mV2NiaW04bHF1ZmcwVGZIQUFNMnVRbTB0V3pMTXhaYUc4dUNreWdya3pvMHB6UUNEamVIZlZBekZuOFFoVEpsZWJwSjl4QkxnZzFadnpLUUZ2bXFjemlDSlBtZFR5WXZwTG1pdjkwVkZna2NOY3djazUxb1F4QzBXa2pEcTlNMkVSZTBNN05UZFBFWnZDMnRENjF1ODlHaTZLcm94TFV3b0xmU1Rza1dw","upper_bound":"cHlsdUEzMDZ1M1BYNnFkREhnb3VyZDkwbmlYSXpZbFBnWmFOWTlsUE9TWEJtclJlNDVzeTF5b0JQeXhEM0QzdFh1Qkc3OW9jWUlFS1loWlZFWnJUcnljRlhqVHE1cnVqdkRIdTN5UERwUFJNaXo5RklBOXhCa3hFeTN5M041clFkdWl6WTBPaXMwQ3JCblZkQ1FNa1c1YVRrVjlNNVo0TDZPaEk0R1psODF1ckU3S2h5ZHp5NzhLbWM=","repeats":1},{"count":1656,"lower_bound":"cHl4MnJRR3NuZjY4dnQ=","upper_bound":"cThHajZOaWcxMklJdTRDUGpJdjRPMUt2V0ZKZmx5TnZpcjBSalU0dlN6V3NVVmYxMkRpWTNPSDZRM1Z3STN2Y3FoZXNVUHhFa3FSaXJTNXhVY3I3eUZjQ1hMNXFrSzNER0d1ZEtiV2NrS21hdzZ1aHh5TDdDNlhacDJyRWxNUmd0YjgyUEZoUjE5dmo1d21yd3g3Y1RCOHo0emNEdEZBdERXc1Bka3kyMnIwNU5Sc3dJSm5xN3pMV0V4bU1yMlI2UWZXRVNpR1NFenVHbFZER1RKYjRYNUtaWnJ5UGpnODVTRE5xc3BSc3NaclNVRmhqcFU0THFlekNuRGl6TlpFNHRtbUNoaW1rQWVrNA==","repeats":1},{"count":1664,"lower_bound":"cUFJODNmQnd1QXVUeUN1OFpDUHNBT3JidDVMTzN0SmNla2JTWjRKU3pzb2RGekxieQ==","upper_bound":"cUxEdmdWdXV6SUE0eDR2ZFRnMVlVeTl4TTJLYVhzS3RIWjhSWGJWSE5YNXVETkVwTWxmWkpkVXNKdmhRMDRhTUFYb3BidVFmanlUQ25jSUJOdUgxMVhDTzNLNjNON0pPN25EbjNuOVRGaG1yU0VORnVhQTNxTnNTSG1FcUdjRE16d002VnJ3SnByYkFpMFNkRmk4bmJHOVVlV3lKbHYwbWFEVjBFR1pUUkt1bDFLT25Bd2hCVFdtSUVqSnRWTmJoYTNuSG1wVXVhYjVKTVloZEVqRDZib2l0ZmZGemJVSDdYbEE2Ykx5UjhBaXFRVGQ4aE5hY2dqQVFobEFZdXpMdzZHd25UVGV0blZTZ3kwS2o4RDJDeGhYZkRjNllTV2FEeFlhRTZ0dDlPa3Y4OVRoT3B6YTE1eG9aeU5qWkZFVG5ibElMZFVyTnMzNG1OUU1aOU1ZNHYxd2NPRDRWVzJraHR3MTAwdDJzWUpzVkRxMnRqeTNSQVRKOWJ4S1Q2bVJYR0hWWWZIcUVyTFpLVGVGWUNMSm9Sb053M29VNlFIZ3lPbEV4aGhvV0ZEamR3a2V3enNzc3hkSDBHNEZPRFdtY1RFbEZtUFZiRXYyWkFWRkhBNTVMWkE0ZXU0cWhYVkdINjdG","repeats":1},{"count":1672,"lower_bound":"cU1CTWZzZDhmTk9ReEU0azFjSGx0bkdmcm1yMUV5VmFTdlRGMFBmZUh6bVowSUlxZ3NlNUxPanlPRVgweFBCbUJkempjY24zS1J4Y3JrQWs2QUlBZ0p4dzhFa2VEUUpNVUJUa2F1V1V2ZEFXRGI0TXRnbm0zU2FDTDRiRU9mNEtkM1JNeGg5dlJFSlhwVkVvbEZ0SDM5b3hxTzIyOVUycGhuSkVWekpDQWQ1bFJqUVpncGNmYmF2TzNBS1IzUlNzUzEyYXdjelFCRGxFUFpIOU9WZnpZOGtrbmZQeU5Va2pxb29ONVhSN0U5WjJsSXJQTVJJRFByb1FnM0Y2Q0lPakE5Ums1Nkw4aXFoV0k5V20xZTVMSXZTcm5Hb1BIZmVtemFnemJOWFNCRGFadE8=","upper_bound":"cVFPN21nNVlaZjVxanZ2dGVWQzJsWXFwQU9TOXFLNVA2VmszSHA0emJENHZubFRoV3czaERXdXVVODRVVmpNR0VGek93WnNPQWpWVXdyNDc5RklDS1JobHVVT3RtQVUzcnUxU0NxWnIwRVVtc3JGZzBxNGxDVmtiblo5UUMxOXBSUzR3YW9PVzQyS0VNTllzWk13bVc0eXZNcjhyRzJsZWRIeXphVnc4aGpoSEFmYm1hM2tPYWlsNDBMaEljZE00Y3FLekNvVHhTR2g5UWFJZXVWSEJid1VPc1hWNnpjTXd6RHU5dDNzMEk1b0JkS3AwMEpOTURvUWRFVE5McEtnbHpiYW9FRlFaQk85WHFOUURRR0M4RjdMZEFPNll2bzU3N0g3bnhJWFdyQ1c5dXRLalBlSEMwWll2N3lCVXZ3ZzlGbUlpVkROeThlbGNaYWNKaXBtZ01zUjFMV1cxSHhUcElIaWMyNG1yTlVnNEQ4NkVyb2dwbFZlZHRxUFk1MDNzQkNsUHZLMVNN","repeats":1},{"count":1680,"lower_bound":"cVVoU2VSSDZOdzFuZ3c3RHhqdTdHdURPdUFQQjNwaDdaZHJDZmRsYVRvVTVGNzc0OUZaeXg2c1J2bkNvNGZ0cWRlVVJ0YmxQbk9JTWdZWGNXRkI0VWt6aHhIeVZrMlpHbDBwT2xCbndxUXZMelpqS01qM0d5dXJURDZzbzFTY1Uxakw4R0VtV1lGcjQyTjl3MFZiWEJhWWpNTmVwc2xpTmU1UFZVVnlROWIzM2d5TUNNSDg0SUJOVkFRbE1odllJblNvS3N6NnJSR09lcGNVcmFCUFR5S25qZjBRQWZhdklqNXJpdkZGTHdnaE9Bb0FNbDVjTHFzMTdTS3pUUU4yd25NRWNHMlpQN2pQOHM0ZU1qeTZJMDRJdjcweTF2eWFQT2ZBRkQ5MzM1a2M5NWhhZkdWcE05TWlVU1p5MEZQd2U1MUVwRDV5d1V4bGwzNm9vNkpyYjZ6blBVOUlScHltVGppZkd2bjJIZmdsb0JER3Z2cEZ2YVo5M0lMNlRpQUFJ","upper_bound":"cWcxNlFDVU80SGNlSG15ZlM5M3VZZ1VJc2g1Rm9BNGdDZ29XT3dVVFRibml4a25xS01ZdXBxZ21US0tncUZFV2drQjFGMlVvRmtSM0pMWVpKc1FUVmdpejAwak5yVG0zak5ldGxaWFpDa2JmY1huVzh5RTgwQ3MxTW0zZjAzOUVHODJYMG9tUThoRFl3UkdpRzlyYmE0","repeats":1},{"count":1688,"lower_bound":"cW1HRnR3c2syWlZIMkw4MkFZZFd0SjJTeXNIOEFHY0Q2ZjY2U25qcHBtY1ZJcTZOeWNLTmFxZ05YbWV6OFBQY1pKajM5ZmFPTWh3eFM3RkJwYnRiQ1lFNlQ2NjdNaVpvODQ3TkI5b2d5VlUwc3IxQmE0SUtyaWphM1ZXRXFlMnEwajVscmxGVG1OZ3o1V2s5T2I5eWowZWxTdnpnNTNmQ00yRXpGWHhYYXdvcW9tNnRjTEl5eGNQWFIxdlJPYlRWUWJpVXlOUWljTExDblVNWWxDUHo2bmN6Wjg1TldZbHBkdFpBTUgzMmhuTExES3ZqeHJRVElWNnhlRDREa1A0dU1zTGs2OUhUY2VRaDMxR3JOd3BCb2J3dkF4aE80OHljcVVwQlBlQ2MzYkNiOEFSZGxUSXlqY01sbm05M2tYQmtpNzdWZlk5Rm5idDU4Rll6RU95MGlsZTJlVnhiMVJGbHZBWlMxV3ZqZFJ0YWs5Wm9jTUV1T1BvaUlTZlFnaXNROFZUYUdheg==","upper_bound":"cXFyRGY1cDRFSUZXTmVzbjd0Y0F0UnFxNTJvVmRQUktBUEFpVGxKTVk5cHFRbEN0ZWxEYzd3SWMxMTFlTnJ1ZU53c3RNekdjaXFmWjk=","repeats":1},{"count":1696,"lower_bound":"cXN6WXpwS0pGSFlCeGVtRG0wWUVsSTNYMUtxZXlJZ0kweGp6VGhPdFpNejRyS1lGekNWbGMxWU5rU05wZzNpM3dGTnhLQWN1OHN1aXpJeUtrRkJURlhPNTZUU3dXZ2J5Smxyek9JcUVJZTVTTXF6TWZDS2VGRkR5bWJ0dzhabENUWU5DRklCYVpuc3JjVlJScVhreEFxN3hUVWQ4VUttemF3SW9EcVdaVnJWSnhQSVVlOXFlaFRoZXFFaUN0NlBSczJvQUVoRjhUSldCc2hJY0RYM3picklvV2VmTXViQTJFblVCdktveHJnTlJoRmUwU0xadzBXZWpzQjBrbEgyWldjaEJrTlNTVG04Q0V2c3RoeVNaYko0TWY0Wm1kOTNEWjI3Q0RLc1Ywbjd2S3lueVo0Unl6ZnY0U2RWYVhFM1lSYUZKQWxtRzZ2TzB6WHZFdk5WUmNNM1V5RzgzNG9qZXl6S1pCRVQwYUY1eUM0WFpKT3YzYjE3Zm9rZDJWb2xYRGI0QjJCTVFDVkNudTEwbDNEQnlWbUdDbWQzVXl2cEVCQ1hqTkVUNGRvZXl3V0Rab1hCcEk4c2d2N1JmMWxZR2VtY05hdUs1VWppb2Fkd0ljbThicnd0dDJRZzMzSTY2cGJaa1JRUEhJRzFGazg1OVlzdjNxaW9NY3AwdDIw","upper_bound":"cXdybGpMdDA2dkwxSGZXRFRDR3BHUUw5RDlvSDFBc3dVS2ZWd2t3U2RiSjlTalA2aTMzQTRIaUc2UlQ3WXRQdUxsdzhtRW40N0VDU0NnZkNXR2JaQm1aWlBkTjVSMzVMOW1HOWlTN2NIeVJ1TDZpdUlPdjlqQ2wyaFQyS0xHRGdUV0ZYa1ZWSjJkSXdTVEVnUGNHV3lpaGdDZnlYTFVLc3UwVHhYMXVDYlNTb0ZtbFM2ZmNLMVZ2SFJwazhsc3dwY204enF3akFMMkEwMUs4MmF0dDh5OFVTWnQ5VTM0cnhXeFZXR3NrS0FZY3pyaW1acUV4bWFLTE5jTHpmWkZPOFZaMHFDS2RBdUdUNEtVendpOVlYTmxFRmIxUnhCSjVQZ00wZk54cHFxcnd2TDk0MkkwU2FsTWpoUkdvM3k2bGdGcDNNT0dFMDlMS3ZHaE44THZyd2RHQk9NaEN6czM2cnltem5qT05aMnR2RldPRWRNbmlyeHVCYmpmUllzRnJab3k4ZEx0TWptYTlVTWVKZDBFeXVlTVh2YjlDTlZhQ2dvSFFDaEJUT0FETXRJOVIwVXJ6VmMzcFl0ZW9OVTZDSEJEb3pvZUxkb0x0aW44bjlpVW9tV01tRkE1TWwzRlRkemtrMW13bTQ2UVZZRkdIQmhKR01TTnZ0eW5aTno2NnQ=","repeats":1},{"count":1704,"lower_bound":"cjFWVjhrdmJJc1VrT0FBaE92eGUycWpqWUhjMUVxWlhrNnVPVjdVaTc5TW1KVXNDdER2UTRVT3pSaVZoNVVub1NVZEdFN3JDaWR1NU14Y0ljSjBDVlU3YlprMm85bTdPQnExYjcyZHZFdGd5ZGJjMlB6RjZjU2ZMQnRiVmlKTk5sUHE0Z1g0NWU5OXc=","upper_bound":"ckNNZ09EcDVEZk9nc2REVUwxTzBBbm5vRHVPQW90aGRvVmNWQ3I2MlhpWDJmcUlxMnNoWW1rNE5uTGtCaUF4Nmd6R1NnS3ZzTVFjTEhCSk5MMzdpT0VQVVY2NHpIcXo3WVZiaUFvUlZzQm9ZdTFkOUk2","repeats":1},{"count":1712,"lower_bound":"ckljSTdXWE9USkZHUlpCeDZXcW1HaExSd202YVhRa0tZeGNhcjVCYjhaTmVZcEVLclNubmdRMG5sd2VMZE9vMVZkWFZJZVoxM3JiQ3FLU3oxZ2ZkdnhuV3QwVDlIY3RzQlJVWXVodGs3d3N5cElyb1ptME4yblNyUUpjbE5SdFVpOEQyT2E=","upper_bound":"clFwR2xrVGJGT1owOURiUDNzSWx4TEphcU1WYXpySmJWSVd4bEhnYVpwNW9jWDZoZ0xnOFVLRUg4ZUFXRUlLS2ZSdzRGc0hWYzFjVlZCQjVsQTV4NjBHM2l4OFN4RG04Qk1QQVFXT29YaVkzOFQxM3BiZ05HQWlYZDVsbzBLeFdRSFNNT2kzUGdtMjNybDJmUE05MjQ2NmxmVUlCYjhEVmEzbnJSbFZEbEtLZENlelJRQWoycGwwNHl1eEk0MTZxVE1Mdnk1NzBvUHFrN0RBYU5wRXZHV0ZKdndab3VydXpydkdrQXFYa3d3cGNFU0xTV3pqR2h5cW5rUm9Gd0V5amp6T291ZFEwdzlHeGxrbXVWS3Fjd25DMFduOFhuMWI2","repeats":1},{"count":1720,"lower_bound":"clRod1p6MUtYM1JEbGRlTE13b0NxOXZERkJiMWNPTTV2cFhpcG43d2tvQk1iYW91M3FaODFRcFJyYW0zVGxKUzRVZDhsVW9nUG5vQkI4R2VPTktsb3JIQUY5VFdhRHpKdmJER1NuVGU1cDZSb09mUDFaek9mZGtCeFNCU25yTHRaZlBQQ2gyYkJ5YmtUMzNXRHJGbFdZRnZNZWFXb24zVHdiR1U5WUF0M2VNZXJNT1puclZiZnNDT2lWZG90QUp3YjV5N3hSNFNuekZmV1dvSnUxY0poSWxjd1NlejJNUlNKUUdvYUtFRVNId3N1N3NrbXJxYjVpdEVEMkNFbDVyb25rTzdqWkdPTnFkY2ZUbENVT2dpazZmdldHQWJENGJ0UDhOdkVad3MyaVlUWDdPNGx3UWs3QlNFclBLUGc5Vldlc0VHZWVrMGp3a1c2NHBIODBhUHVObERIWXBZclRqTXNCYkZOb0NYdjBKSkxJOWdmcW9sU2tGNkpNbU42b3BacVZwcjJHbTNJMEhDUHY0enFPdFZpelpZcjhkOTlUNVRuSm9L","upper_bound":"cmEwS1BqdWtDMjk0MVRtVFZrWVpIRVlMSWp6c2l1Znd5WnpweVY4M3FZUHJ2cVdiZzFPOGpCbm0yMDJHU25KdzBIRE1WZER0NUgzaDdnVVNIN293ZVZyR1lNZXNNblozSVBlbW9GcGprSkt0UFdLTFM5dHduQWJZZThyYzhDWDB5V2pORUlQS2xQQmRzMlk3eXY3ZlhHVkdadmxKczFLR1Nnand2QkE1QVZMbGJzMFdNdExTd3pvTW1jd2NNUllISGFldXNTaEh0aXAwTXZiTnVPMHlTZG9EZkRha2RSNkk5UXFpZFhUNVVoNEtNbWM3NHFkVDNhU09GdXFxbVVkYXBB","repeats":1},{"count":1728,"lower_bound":"cmFmTDdIendIeUFMeEREbEhiMG5vQTB6eXJjZHdGekVGNzNTSTlHODlqTUQ3c3M4WjhuSXVrWmNlUVVKY2hqNENXZ2RqTGxhSUJqaHh6MHhIRkNZVkdBV0k4cmZFUThOdU9ZUDBVVEFFQmRYdUV0VDkxU0dqck1QaW5CUlo2TzlpbklnRUM5aA==","upper_bound":"cmRMOHIzMWZDMTFFYjBSUFVmMlpLMjFrUjh6bDRJM1R3Nlh2ZzA=","repeats":1},{"count":1736,"lower_bound":"cmxVdEpvbkxVd0hEZUFHRWt3Vm1XOWxTNFFQN3hianRQWEx5SEc2ejljU2hQME1oVk05Y2FKdU52YUxOdkxNTGEwVVY5WmpvZE5OeVBUUnF3c1pxV0lvOG5pRjlCY2JFWXY2V2wzRTBDbFF3UGxUaGgyVnRyc2cxSk55ZjJhZ2t2c29PMDZudGx0Nm9ycHBuWWpHSzJNWGxoTkVMOQ==","upper_bound":"cm92QWdUbW9laDZpR1J6NGgwRlR0Q1VjWnNtb2Y0elRzSlJnNkppaTFnRTFjT2NTcmxoMEw2cGtHV1l5eVJlOEVpZlVWdW1YMElxT3ZTWHNNRXlkdnZTZFJ5Q2xSTEE2bllXQkU5dlhRbDl6THgwWm5mVlNGSXZ2dEtWbXpLY0RFQmJOUmdYUGlSNERHSW9sQTdNdkRpWDRSZ09FMW16aHcwaDlGQ2NSTHVNMzRHb0hvaG8weloyRTlTUW8yS0Z3NklCY2t6T1Z2YmRCQk82bzFtQTl4ZG56a1pWOWtySE5VeUJ5OHpsVk94Qzh6S2F5YWRKdzE3djhKbnJQVXUzaVFFVjk=","repeats":1},{"count":1744,"lower_bound":"cnBHWXF4TVM0Z2p3Nm9nQ1pTaFNUdWNqV1I3UmkyaU41NkFSZ08xZWhYRlNPVEJuaGxSb1dWanQwTDRlTmZOZm1ZY2dVVWc5V2R1d2Y4SFBSME5GT093M210eG9MdnJzY1lpd0FVcHJ3R2sxMzR4cDh6TWdPUnh2Mkc1WlVhd2djUEFjbjZoV0V1V0oydkFlMXRYcnNockhnM1lEQ0NmNWU3NmVqUzZnOU1aamNkTlQ2M1ZkNk1LV1dpOUZ3akxGMVZT","upper_bound":"c0FaUEpOOTROU2VCRVRkT2FFV05DY2lUbUFyaTBlOG51eHRzYTltTXdIcmlJQnM4RllLb2R5c3d0NUNIZzkxcVprcm45VnZBWlpMSDRDaUZvdXpNQW5rRnpPNFd1OTNRWVNFdUpOS1k4MDdYdU5XbVM3ZEliSVdGemlyNlFXTEU5Tlo0UGsxcWdGaWpmbjBGV25CWkhWMDUwWk8wRVdxNWFWQjBKZFVkUThKSXRiWmZQQU5JQ2h6YmZTVUhicExqakh2RHl4c0ZMY2xQeWcwYWNOUjJiMWV6UlhtdWNRaTE5cFltcWcyUzM2UmV5eHJOWlVGMHBtRWwyb1M4TlBBd0VTYlRCMWtPdVJHNEhCZjk3Yk9va3B5RW5GM1U4cUZBVW5Cb2I3MHJGRE9TdUwySGYwUmFtMGRBREFmWHh3MTBPT3A0cXBlY0h5U0dGN1ZVQUptekZmcE9JNTQ0cUZ5aDZ3ZmZqVklzUlZReVphTUlaNEtHMjg1","repeats":1},{"count":1752,"lower_bound":"c0dvbHFkeGhEV0wwcTBpd3M1S0RMWHBrallwcUl0ZGxzRmxTYlRyZ0hyY3l0eHN1aWxsRTlsc3FwblMwUjlvREs3T3N0ZURMdXNBdUxKaVQyaURYOXo1TlZackV0M3JrMUQ1Y29zdk9IMk5Ia2VxUnRmN29iZFBqRmZQQzNkYmhhV05KRUtSaUdXcGVBUHY1VjZDb1VDNXhlQWVMOHhjRDlNckZK","upper_bound":"c05nV2pLUFcwMzRMUWw1UTQxUVBEWHJ4eG9MbWp2THY1NkxZbzNLbmo3bnZld1ZCZWVVMTJ2d3BoTVpLZXdiaGJETVl5cEM4WHMzSlVRbWlBZlJuUFF5T0ZVWHJIc0NxVzlMaUNjWjRCYmZlSTBQM3pSR2VXWWZoSm01a2tSU2QxaUEzakZ1Zk1GV1dOYXJpUVcwa0kydGNVNkJkVXU1YndBWDhxNjRhcWRERXMzcGNKRWJhWFRiMWNITTdFQ3Z1SVFrMW9rakZvN1B6YlptZVM5RnY2ajZWd2djV1d4a1R1ZEtueUx6bkUxYjhkRVhQQXh4VDdTeW9MM2Z0MFhIZTJZRGkxb2djdUZJakRnc3FHMXdweEtEYXlaakM3WmxLUmdhemZETWtJdlZrQW15TlBtb2JPR25maEoxeHJBTm1BSE9TRTdPczNHUjBkR1NlZU9rMHFhRFpzSGNBY2dtWFZ4eUxacUNScW12VFNRNHlUU0lDRDA4WG9waWNOVUJudVhGekJkajZhSkVDQTlCb0NsRndDUTM2YlRYa2dEZm40VWNvUmpIQlV6RXcxV1M2M0FyWXdoREZPd1NuSEk5WUZONlNZTmRUVEwxakpmTmx1OWczd00zQkpPVUhVd0tzSHZmZXpqU2ZCblRXOFV2","repeats":1},{"count":1760,"lower_bound":"c1BrMXNyeUlVa2FxMWR4Rlhtb2lLdG9YakE0enFzS0kzdHRCMmJOZWdMUFhESm5FMUc2YlFTTmg3NXZJajc3VmQxNTRUMXJ0VEdjS0J5YnBXa0RYalRTWTlpSk5mWmJEZnhwWnNvVnpzSFdSeXdDNlRSRktWQlhFdnhiRHNDRmhrWlNxZVdtSDUxOXBIZmw3aFJSQlFTMzRQa00yRTc0M3VROUU5NTJneVhxWmVzOHZNQXUwVXJlb2JVY0JNT2NOaWNqMnV6UkpPRlB1NVNqcU9BTFh5cTBnemxpMlZNdDg1d3JPaFJzVkhublJFeXY4WTNvSDFXcHhpVzIwVmlzWkNVMnZNc0JOc2hQczRhcVUwMTlhZXNvektFSFpRajZETFNNNThtdkIwSk1zSEtKYzRVTFVGeVhiaVQ3M2FPMXlEZWNtdWY1VDY1dU1sVjI4RkJnRzUyMU9Vb3Y3S09zWDV4WmdOSFRLMmNnUml5bUhET0hzTzMwZFlZNDM4YkFpMTZUMW1wS2hlZkJ0aXFxQWkxTEpUWjZ6ZUFwVXJOSlNnOTdnZEFOc0RCOElRU0ZLb0Y1UDZSbGhFS2c0UmwxbHI2dGVwMDNFSTFsSkhZUnRNS01adDc0OXhMd1JiRXBLMEdoaWRESUNYbTBwbzd6V3dGTEt2R2tTYm1PZmhKbm5hR0ZiaXpUR0x6czR2ZkQweEJpOUNIZTBrRzdwU1dObw==","upper_bound":"c1RzUTVodWFqNGlNazd3YXlqbmRJUjV2OHowb3gzQktLY1BlZzVHV0tNUEJZUW54aGp5MGRpaXdTQ2FmMTBpWjJSOGZMcm81YmtYTUtjb2gwM3NVSTd1TGx2OEtOQ1dwZDhSekdqSnFqQkZsUEpSYVBlSTJ0eFRsVDBOMHRRc1FEaUF2T1N2OGpEODNCMml2ZjFLRklVbVB2NGFVN2s2","repeats":1},{"count":1768,"lower_bound":"c1VuVzRubXYzM1I0R3JpSTdUdEltT2ZjZlBubVdLNnhYVk9hT1VraHVoRFAxN1VsM1N3NkQ4MVUwaXRnRjRCZ2k3c2RkcGluM0RUbFdkdk52MFA2am9QVEszWEZmaEhlVjJQWjQ4Z1VOOVBlRldwNG1sdWt2STk3NjFuSlpyV0FjRDJPcnk5cjh4QllXS3R4ZUdKYk8wTXJGWFR4dXRpZWxHaE0xbWdSclVmTXhFMERzeENEOThaNklqbVE1NUxpU1o3ZFhZZEVGUGI2N0ltdEY2MFBNVlR6bUIzQ2NKNGZZanlYNEwwckVkbWNYSGVzNjE1R0hrb0IxWnNaclNqamlEMHFQT0VPbDRubTRqa1FYZlkwRVFidjMzQ3ZTMmFjdnczNXlZREI3MnY5aXhPN2RXVEpkV1p0OGJlNzVvMDlN","upper_bound":"c1hzSWpKS1N6ZzFBbk5GQWJwT0RLa0tpRW1IU0toa2Z4SGk2eHpIekR2dGhUZnpBOFc5dDdSOTcxdzZKYjcyNVcwcGFGd3paSFh3emdBUmhsRWRSUlRRYW5lQkFLR0UxalU0elBxUmg2eEx2aU1qUEJLN2ZUdkNIRGlJa3Nac1pXWENBeERhQjVQYWh5clc4SnhGRWl0Z2JnandGZ04wb2NqdzZDNXM3UjdVTENjYWFFNkluWXRyUGczdDV1S2Z4SEZSQzU0QlJEaDJqR0pKTXVlWlRPWEFPdDM3WXhyOWFGQmp6dDNGUm5pRmF6U3Z3NFIxYWhDNDh6OWIxOUNNd0ZsNGRrd245WWtZUmhUS1M5QkhsU0hMUVZhMVBTc2JLY1ZTZzIzbkFBalpaRWRjbHpGZ2RUNGEyaGFPT0M0YXpUN3FGbnpHZVJ0bXVncUZWODdwWDJmbWE1VFEzcDRYU3NiNG5wVkcxS1VHbElZUldQd0ozRVdaVXBvQmFyT1dFMnVHNHZ1WjJYQW9OWFhwZlZkYmwxaDFoTGRMTUZjSFhiTWd5bHJj","repeats":1},{"count":1776,"lower_bound":"c1lLVzRRYzJObFIycE13STU2ckk1T1dnaW43SXRyOWJQUERIcHpYWVhPekoxeEtrNFBlMThuU2l1ZFBsdzlyOUtpTnNhNXZnUFN0eGJVS1cxRXBaQU55RzVBRUNkTUZRMFZXMTd6YTZ3UWIyYzROSnZackFjaEtFeXhTbG5iMWRYbW96dGJrYUJmb0NRREVBQ0lYSzNyMVc3UW9JWkxsdlI0S3lpRldNRkU0YkUwZzlwWGFmMEtyQnJKeGFjVw==","upper_bound":"c2lhUFVIOTJHNkQzNktaNjV1cmVpU0FERnh1VFhrQWMzb0xxaUlyME83VXpNTmt3aXg5V2MzS2hrNzJrQWFtT3l6R2w0Tll1TWlDRThJSTM4S2hjQ0QyMUZOa3FrdFJXYk0ybFdneXJWRkU4TzFJd0doWThwd2ZrWTZSNGpwd2s5UnVKSWJnMmRQMEsySmRiZ3gzd1VmWlJwRTRZREQyZllYamRxQ0NKSjV0U0J5Y2tXQ09OcnlQMkZOQVNuY0NZdW5Nd1pzdHFObWVkcmRhUDc0TkNwVnRxeEV1R1MxVDBnN2dyNDd2RjI2RmFKbFF2cGJHZTd6aEpkWFJOc1RnekpoS0MycFNrbHNCaHVpeTQzbEd1R1FmamJ2cDJtb2E4dndpdzdkTkRKRkdTZ1hrZklBM2prOHh6djFTTjVzTmNKTjFkYk1lNnJYV2ZKOXdSdHBqdzhObzlmNXEzMG5QTjhZQ3R6OVdRdWpJOXl3VVlkRktXUzNEZ050aDEzVUhCY2dhRHpuS0Foc0lnOVUwMFZkaEVpa2tUN1hndDdVNmtRMHpNcU1OTXhsNFJZVFlsdjBib2NiNlhZM3p4SFhCWmRjSWpDV2swY3FP","repeats":1},{"count":1784,"lower_bound":"c2tPM2g1WEdCbjlsZEJjTTYwV2V6N0lybkRKWmFhUFl0RXpUNWF5enpETU5aTmRVVFFqTU5RWEpBbjNhUjNNeGswSWE3VFpyMktQZFNmbXQzRXNWUlRuMzdtVDI3UmhCTDhBQzdtcnhWVDY2N1dCRnNjeDdLR29iWFNCWVhOejRYZWx3aUpoSG4wMWpVZUJuN29xZ3F6c05POXRrSDBBWU95N2NSTVBWZG9jUVplSG5ZNkRiWmt2MWJieVZkVjRaQko0M05jMWhMZWFGcWZlUDExUmZuUm84U3E2MWlrS05WbFNVOERmQkEwSFhKOUVmYmxmWDRVUVVPTUNDWEc=","upper_bound":"dA==","repeats":1},{"count":1792,"lower_bound":"dDVZblJ0cWR1SFQ1MXNmSWI=","upper_bound":"dEMxV2lKeUVQbW1JS0h1dVpyb0t2anZtVVZyQktpVlFOOWRZVk5LRXFqZVhOUUV6Ym1laTVHOHRFZ01tRWh5a0xzaDhxU29jRDBQN25mcWE1dFlSZ1hENXFhUXp3VjdvMUpTSGI3MndUbmhVRk80RE1RdHQ5M25adTlJOHBEcjFIM1dLZ1FHQ0RmOQ==","repeats":1},{"count":1800,"lower_bound":"dEU5WkZha1l6dU50bmxFcWFt","upper_bound":"dFEydURZZFRKWkNnUzFx","repeats":1},{"count":1808,"lower_bound":"dFF6OEk4c2E2N3l0UGUyc2hOUVB6OGxJa29TVVF2TXVMWjRaMUJWYXZPa1FxaU92SDBGanRldlZVZ21TYTZSQ05OVWZ2M1d4eFJiWmFyMzlnMTdUMDJlZGV2aUxFQk80TmxiMGJ6SnRjRkRPenNDRzZVb01mWjVxajZPSndMNHRSQkNralBFWHl1bnlkZTB5YVdoRERFUWdkczVtTUpFakY5alhucUEzN0VWeUtBSkZrbHdubXJMTGJjdlNna0xJSlZEUlMyMGZ6STlCUjRRUFFrTzZ0aUdvYzdGcGV0VnNTVWY1WVpwOWZpTTQzaVlCNjdPZTJheUV2WGxaVlI3YThPc3BoMkhVaU9QMU9naURFaGVzbUM0VHBLNDRXS1dxc0lQMmVjTmFLSkhxdUNKRFdkejU0TEc=","upper_bound":"dFh0NXJIM3NJQndBdTltTDM4SklhYVJDdmVGUTZwck41dWp1aHpNOHpMRkZ2VGZyVlJMM1ZBeWwzT3BpVGt3VFVFQjZEZWxYWHkzYkEwQ05MNHV2Zm1xV3l4R1dCYXdIdFdWUzhnWnpiVzk0OXQ3VkFoS0p4bUNBdVQ1SmZOQWJNV0xucHdFeUpTcTQ3STVwVXJjSWVLR29aSkR1UGZYNnk=","repeats":1},{"count":1816,"lower_bound":"dGJQUzlaNHdQZGtKTVNuNzdPc29PQUluRkxFajAzaU9tZVJsa1VpY2t3RXVHWDBLTFhIakVMa1RRZllBSEtNNGtOZzFQS0dhT1oySE1raVJwbGRwQ2c4akRvZ0xzQTE5M1VpUzVoemVCVXF6TEpqSmZ4Y2Z2VjlKQXZBVGpiNVc2aDhFQWR6WG5WYklFa3B6VDBlS2xTWE5RelNnQUpId0pWWHlYUFN4d0tBSGRZaHZkekJ0YXNVaVV1RVVqTll4T3FPTnV2WDlVa3FWZThkWnEwQmdFRnJ2djBnZk90czlKTWxBODFPQmI0ZTV6SlRKTjkwTklrY1NrTHVRaFRwTnNzT0M3QWUwMHAxdlg2ZmlGUE8yZFA0ajc2NExlcUlndlV6VHdkdW43eTdEampqRTI4VVJseFZHeFpIWndkUzM2d2Jwc3pDa3JyeEpzdlNUczd2YURwYjdlUmZUZXJ6d3pBdmxaRG1Hak11aFRiTEhpZm5vMlRXYjB1Z21mMlJKY3o4ZDhGRkhOMGVEdHBUU0V4SlF0S3BTb01jS1J6SVZNVGtYMnM4bXFyWUFzdzVGbmFpWm5wZGpyZnRJVGh6Tnp0c1FPaFdGVE9LdmFPc2tOMlNuT1dpcXVqeG11ZEp6NmRVZzdtZDR1RHdBU1lRVEVZQXZ4RGhLa25CRVBwQ3hvOURZcXp2NEdrd3VMOE1VVmR0YWFPMDV6ejA=","upper_bound":"dHV6OGNqTU5UenR1M1ZVMm5QRFRSMUpVYzJmTGJUQ0lDNGlKTWhzOGhZck1XbldnRnRxcG1lWDI5U2RjdWlpYnNaN1RvejNzWmNFYUNrWDJjNldGdjBBOTFTM0JDbEZJMHNSb2NYZFZ5WjY3YWZWSEpmZmczM3c1dGg4Q2xNN1pKZTlBV2xiZzBjQ2FOSnhZTE5DOFJOMUh6Y1VKOHUycUx1R1dQcFFGdnpaSGJzZ1BCYjYxNw==","repeats":1},{"count":1824,"lower_bound":"dHc0SDBsNUM1V3RVY2VxQWJNbk9QZEc5YVp1bW5HSVlHQ0IxS0lPUVJ3ellXcmNkeGV5WUx4d1haQkJyTEZISVBmT0RRWGg2dVViVE5hSkhzaWk5akZWMDliNE9kcDVoVkhVbW9IeGt0S09DSlJucGxVNmRaeHNjWUdrSGZlcGNid201aEhCRklVV204OTI=","upper_bound":"dTdCZ0xaU3FXVkd1VFVpYmpRSklsRjVWRW1JUEJJWGROV2RYOHM5MTdIWGVQRnBIYTRmR2NzbG1SN21BQmpqcFptNUxLSWpmYUtCZGNiSWMyN014S2NHMElLVElvV1JNOUVza20wRW90VFNnalBVQTJUMUloMUhuN0FNUmY3dkloaGJCelZFY0VSeWZZdlIweHZoMk1Fb1FWRWNOWjhUWEZHWHJsZG9aeGg2N01lYmZHSE9oRlUzTEcyRllDWlJTelo4V1dpWlBaUHN2Qjh1a3FYQlN3RFRlTVc0TFZyUTBwZTBIWWJlRkVnSnQ2YVNJeVNBeThlTzVoVXBvOENKd014TDdFN3BiZUllSHlsTHRRTzNVd3MzeU1weWFCQWw2M0FRME5zMFZwOVBTUjhjZURlS1pHcWlpcG5WcTZobzdlV09UbHphTlZQS0xSdmRDODJSMHFnZEh6djNlSHpsZ1hPZG1Wd2M1S1VCTGdrM0gzYkl2RXA0Y1NVcnFtbGtmakZzUXROR1dGMHgzd3ZXc251a0VralhxRnF6a3lIYW5ycU00NXdKSA==","repeats":1},{"count":1832,"lower_bound":"dVBGbjJjQ1Z4REtrVHVzSjlseHVpSFhFMzVvdzFFMm9mWlJ5dW9XeWM3WGd2dTg5Y0JwSnZodjBYbmhPTzRWUjNJdHdqMWRCN2VITHlmTEM4dkVYcGdSR0RVMEJWZFREblp3ejh2WTRBZnc1WXhDZkFLRkFnd1dGY2hXYURsSDBESHNUdFlXMG9KRTRzV0g1TmhaQ0wxUmhZcThnRE5uQkVlbUhLZ09KOXVrTk1obUFOUDZIV0ZuRlZka094aE1USzlTVm4zYjRBMWozREF1WE0zUXZKRmo2V2FOMk5mTllwaEFFcmFybzNwZUVlSTN2UDkwRGNZeHMwUmJOclpnUDBkNjgybkxmcjZrMDMyOHhNZG1rbDZvenlwSktSUUZHMmNqTGpOOGQ2WnlnYTFaN1pNSTJ5ZnNrV0lTVnBVR3lzdjI=","upper_bound":"dVhhelB1VWdPbG9PQ3dMa0g0eHozZUtyZTFINWtmRk9ISGc4ZVA3WlBmcmd6RktZNUxWT3ZFV3dKUkVRN1hSRHVldW9LQnM0NTI5dWVZSW5tYTRpaTBwMllDaGdubUNvdGcxYjUxWnFhWHp4STNFQWdXdnQ4c3NObTF4U2JES2xOMkR0YkpmQnhCSGVBcEhlZ1NZUFJoaFFtRUw2bmxXekxneFF6VGZpZ2N4V0J5VVRaSVZPU1V0REV5WmRnZ3RiYURrV01ySk9lMnh5bm1EUFdRTWZ1SkROSlM2ZU1KSGIwS2hYekFoTnh1VUVaZzlkMVNOeUI0Wnl3TTIzbE9qR2RVMXVrZUpua0pnUjZmVVpGcQ==","repeats":1},{"count":1840,"lower_bound":"dW1BRm5ZUHR3czZBbjVZRzJsZWtER1dzdEltc2pqcGRFSXFMY2JDR2VRbEVnQzBSWDYxU216S050SmlVeUtPWWU5ejkyRkhHMkpvTzdvNFZZVDR4SmlwSXk4azZvb0pUQ2ZFajh5NHpzdHhVQWRSZDZhc015VjBWWWFWVHI5ZFNRcFRSQkRCTlRkWDNZbTZsalRLVlJwd1VPYVg3UjR4Nkkwa3k=","upper_bound":"dg==","repeats":1},{"count":1848,"lower_bound":"djNZdlFBdjdncmQwbHBpUWdRZzU5Y2s3TWoxU21pR0ZGemJRSnRjRmFWajVqMk0wSHl1M1VUa3FER1hIRFdRV0Q2QkVkRGM1ZHVKVnZ5MjZtY1ZWckxkeWVDUHNEU1JCMERFc2tJSWh2WDk1TTRkbXZ2bG9iMFplcUtkT1Zra3ZFZlhBNHN6QW1GNnVCMlREVW00MmxlVTZTUHhXRmtjVk5id2FzRlR0WjlUSDJOSHFYa3Q2azlpZkhlTnVURHcyWm5FSk9LTHpyR3FHT1JQVU9MSFRjSWZlV0pndDhXQWpqb0M5cFNRYzluUWZZclZXcGVUUXBGc285d1JtUmcy","upper_bound":"dklPRHZha0R4NzRiT0N0TUFSZ2Z1Y0JRQ3A2UHJkQkk2VlV5dko3ZVhMR3lKSkpGcUM5OGFCcWl4Z1NURjFzY0xQVVNQeDh5a1FMcDRUV3BEWlVuN1pRMVJ6VkxQMklES1phSUhSRHZ0cXhvZ0VESGNER294VDQ2allpSnR4NnJOMTZ1ZUpZT1EwNXJhRXozbTN2a0Rrc2Rndk91THNzamFJbnY5MFlPVWxhak9RYTMxTkRPV29WS1VaRVhsMW5taDIzRllsSmwyMmhFdHhtV2lHbElsMThTbFphdllXdEF1NUFVdVQwaTRKcjZtZUw1SDhhb3pkWTJEcW1rS3h1Ym1IY2FnT2MybERGSzlYUlFMUVdPM3RKbmhGRnp5NEhwVmRtRW5jYnlLYVNHcTNPZW1yMXdrNzlVSTVPdkxhZFZIQVpDZE1HY2lHMVZFVmV3TW40bHJCMll4dkJ4RTk2TmZPZWxrUjVDV3VRT1ZHNThSZnNNOWFBT3dzcU5BdkxQblR2TDFuUFF5ZkUzbVZRU3hheFdzSGlIZmtOR1duQVBzeG93V3NWeDIxZGhjODQ1RmlieU8wREh4ancxS0NhNVlHMndvV0dkamtxWWY1UWtrUTZ6WTZzSUhadnNDTXpVa091OERCUGhiTGp5UVZQZ0pNU2FScQ==","repeats":1},{"count":1856,"lower_bound":"dkpna0Q3TFhqclpKU0hPWXY2Smc0MW9BWU0yN2dwTFRrUFNWQ1Z3bWNGNFc0dTUycDNxQzlhb2xLRWR4Wmt4ZnZodlpscVlMVVVNRmFOZU03WXVxRVNsUU9RaWc1eVh2Sk9lS0FJSFBXektCQ2ZyN3VWa2syYmhYZFAwRWxubk1rS2hranNJU2JFdXpDVlhNMjBpcEVrTjJocU14TlI3ZlU3RVY2UmxDNnZJbUNERVpOMVZwTHBJb3hKbEJPQmNTYXdPamtub2xNbFhFOHhzMDNtdkpYNjlrNXFpWHN3QmVDOEdoeGtjM0ozSlh0eThncmlKWVQ3Y0pTMG56aXlqQ0ZPMzJ4RUV3MjlOaTR1SFdFc0FIbWR4UXdrZ1BDaE9RY21KRjJQVnNiUE9sTzZ6cWZZWkdlbWQ3Tm95VUtaQWxYY0k1UnBCSmlxZW5RWmc4VW1rSzdQM0k2YWFuTVowYTFtZEVLblExM0hWNUg2QVZQWlZHU0xSNEZmOUdDNFBJSlliMHhrazdBeUd3SzNZczF5Z2dBT1MyckNtRThTVkJpZlUxUTBPQ3BKRkcxUlpT","upper_bound":"dk9zRWFFam5LYWdLWHdjaW1NVlRkSUpSaDlSRUVaMUp4V2h3bFJvOEdaM0JrWjFoOTlYaWdaRURJSGxreFBpQzJ4VHFZcUZucW1MWjBZU29pR1VXZ0xYZ3hNYm1SRVh1ajNUMHBuTGdEM1FlTlBueVhQMDVUSTlybGxqZEd3eHkzVkZyZnV2WFdPeDhuUjBDeDFucGluREhKMjRpVFY1a0RtOHV5M0hZZm14N0FBcGtYWFdYc1JqOHh2OGlVM2U4bTFLYmNhd2t0OUplczhFOXVmenNoeU1rSUZYd1FYVnZyWHgxd1M=","repeats":1},{"count":1864,"lower_bound":"dlgxdkZsVUxRbjl2RkpvTWI4c0RkSTllSDFoVFZ4dGJqaXZGSlNKanZIN0dhdno5NXZrSmI4MUFEVEhGaU9IakJ0Y3VSMnFlZFkwWTBTM254bEhTVjRQQ3RYMWp4bTNMdHBYUTlsUzRFRUc3UVpUVjMyTVFMUUtEMEFNQTBraEJJR0k1QjV4b2dLNkhFbjhKckluOERPa3lsOTRJcWlBRkhrRDZpck83UGpiZ3JzR3MzWGprMnFmV2ZpRkRDVzRFZEFkTzFMYUVIZEdieXozTEtKRlF1RlJzRkVFaU1xT3B6MDJ0QlJLakJNYjZWOENLVk15NWkzaVRQY1llM1I3NkNCbVNtelpabWdEQWpIcnhZYjN2THRvR2ZOcTNubHJNd21XeVlJU0RlNTBXWWRkVWNMQ1FXMFByYVhPMDduVXBtSUpMS0cxQjI3RExxdUZBTmdpNEw1eVJxcG9KOFExcEYyZjduWmJxY0xiaDdycUlFYmc0R0V6Rkp1OGlheW14T2hLZ0xKNmdVMldrM0oxcDM4eWlJUjBseHZlWDJydzQ0blhtMFg3SjlUOEZMdnBxd0tJT28zSFdQekMwTTRSWHNORk90ZjdlNmlQSkFIV05RRk9PV2Nz","upper_bound":"dmhrVGVNbmE2SUFkdmlYT2dFS1JIV0N4bmZBWnVoaTR3T0lTUXhTd1ZhdWh6YUI2N2JKaUJpMFFuYmVMMFBoMWZoQlhiUlpSSDBGNUtnamlTTklaM3JqbzJodm9IWXB1ejloaEJtek54T3lDUkZqc1I5YTFjUTA4SlpSWFZsZURJWE95WUNMZzZLdEFNWTVoWHZPTG81VlFRdnJDQ3hUQW5veWtUbmZQTTEyZW43SWM2SHg1SDNOcWtmOGdBZ3AzV29YNkpOSmM0ZDlCSGM3bGkzcUphaGd3bmU1TTZaYURBMlpuUTdZNjBBVDJMRDJ2R3hGZUtvWlhlWmE4UzNPUWpLNlJqY3FpZzVSbG5ZMFBRaHkwb3o5TFRyTEsxMEdmaE4xR3luNmdLVDVVMHE5dVNuMlRsYktKcmM3dE84NW8xeFowdzQwd3RzNG45UjRQMm1LbUllenpPS2FTMjBYRHNCSmJFUFoyc0xiM0Y1YzFxSDNPZ29KQVZwbFVQQmhVTW1pYVdjWFJJU2lKVmdyTDR3alZGOUN2TUpld3V2d2RLakQ2dkFuTXVWRlpDbTlrRUhWazR0bXhPUGR3bXRtY1NlY1pEMUFxYXlwSHBUdllaalEzSndralhHbmNhTGFlTEQ3c25sZ0dOSXdadlZLeFBoaEE4cmFSdlgzNUQ3bFplelpRR0JjZTJZ","repeats":1},{"count":1872,"lower_bound":"dm5iRVJGSlJYM29ZMUpwRUJta2VZM204bzFuRVVTbmhkWTJiREdBWXZFa3pUVllnUjNwYmw4NHpxbnUxMEo0eEJDWkxZa29UUDBuZ3M5WERBbzFVcjhhTDJGdFcyclhXSWtRaUZvNkpaVGExQk0yeXBFMWpMeHVTYkdDMWpBZ25FbjZ1ekQ4TTlsb1ZhdVNUODh3YWdJSm1KRDA1V0NiNUtxSFlkVWk0Vk01TTZyellUU3NjMlFYOWZ4TzA2bngzdlR1aTAzTE9Qdkc5NmU5aUVpN3dPUEJNYzd6N1BUbld4Z1ZTQkVCU2hhdWJFREJlZ3hpOA==","upper_bound":"dnp4ZDlpWHUyOWRCTVJURE9nZHh6bkt6RzVrOVVmWXkyZzl6ajU4TXhnTUZRSDZpNnhXd3NXSDZMMVpXU1k4Zm5mVzVtMTdJRFZPSGxWdnNRZmFDMjVEcWtEY0pGTHFwd1kzOUFIZndlN0FObVBJdWVoUzRMSWNwejJUVHhlWlNObW83OFY3MklkT3h2QWtnMDRCckwzczVrQXByMHJYT1VlVkptN0JYYXJLNU5GUGRyc2JwbTJoRFprQlV4UHBKMjJmTThnNUVpMkxwQ0R2QmVTQUlETHFnOVg2MWZyVGNsT0lYem1HVklSRzFNdVU0MTRod3VuVDRUbzBQTzRVNHllWHJQdDlQYXhuZ0FlVkZVekpZanBNY1IxZnRtZmtRQVZzZmhqY0E1dkM0U0xDV200cGxQZldUMnRFVXhxSkNFbEdUSE5XYUtUcUhlMzRDRThLcHlnNDlGU3FRTlBvS2xsWlNuaVFZcjY1MVVoMnlmNWo=","repeats":1},{"count":1880,"lower_bound":"dzFJOW1DamQwbFpRNGRXdTJqNnpSMzI0NktZVGxLTHpwVTZvZk5uT25WTDFxZXNkVDJPTmVoZlFsdkE2emtjSzJ0UVhEZ2xEQlRZNnF5eEZiYmR1T0hZWnlsNmlTR1I=","upper_bound":"dzZpNkRhNDdRRlQxb0oyQ1pkTGtQeFV1ZXFaY1R5dlVQY2RnTzZoalByOWxZaWZXNHVhYzB4WDF5SUhhVHBMNGdwa3FyaFZLUVRrcXhFb2tpS25lZVd5NEtiSk1STHR6ZGlOVTdhaUhqZHQzZ0tUbUhlekhZZDZhVmdVSm5PaXpIcVpHcHo1UEVja3B1NmsyeU1zdmhWMGpVd29zcHRFMldKdm10S2J1U1RsODBHUW9HTVhpVjNnOU1NbFVyQVFESzJOdXRxRnZiSjQwUzRDRUJPMmpGVHFrMFFEcU1XZmxXVWJVNEpiNEk2elVIZkxJMmZMRmgzQTc1NzRZNHpSQzludlIzdVBjTVRodnc1dUlORWE4WFhPMTlaTnd3R2JTUDJPUnFZQnFxMDJYRXZkdnJ6QUNyTmtjbVFYRzlaZXo3cUR0aG8zcG10RTVHeXdheUZnZHdTTmFLZTJmSWRNQTY5RHVPWE9reHRYcEZiNXRPQVE5VXhqVFQ4Q3NDTVpSaUJuT1FjdHhZWW11VjBac2xnSW5vWDhmQ1FUcmNyT0NQczZNRHBOVlZuTGs3cjdCaUlwY2VlYmRMb3g0Ym5yRUV5SGViY3UwbEg0WGQxT29NNndXQmM3bW5VNG9HRE1nU0t4","repeats":1},{"count":1888,"lower_bound":"d0ZnZnFLeGI4N2FHZHlhU2N0TUM5dHV1OHR1UkRtMWdWOTFEUHNlb1pGZ2llOGhncUFXakNsbHI1NmZMOVAzQmttUlBab1haSmFQQ25zcDV6OExnbjdRMDJ4ZWYzMXlSc2VRU1NHNDJJRDhEWGxXT1R3MjlYaXVIZ3hOd0VVbGZwZlg5QkZzZFRrQmJQMWVnZGZIZ284bnNDTzRVb204eEVUNHJjZnhOMmVXdTZabUhiSFREVGtlS3Y0d2tnME1GaVBTWHJPQkNNRUZMWnlydDV0RHU2dGFSZ0hrQlZhbnFFcXhHVk00ZWhmOURteEE5WFBJWWF4NHNqTWE4a21LdUU3R2cycG9LeGZPdGlqNUlLZXRaSWo4NnVOZw==","upper_bound":"d09na1RFbkxEUkFBYkR0UXlWVWY5WUl6dmVJRFpmdG5Udkt6Wlh0dWZvbkVDenV2RTFOQlRpOUZxc0VwRVg0UGJZclNRQXJZVE1wVldYSG9jZWlvc3BNRDA4M0Uyc1VZREtyb3c4STBGeVM5OGdKY0JJR0ZCb2NHNUxlODNKYUQ0bGczcnNZcFFVcDhrYkRVdUUwWVRZVU01SVo1NG5rS3ZDM203NGJQMlRqN2w5dTQ3OVJxR1NYUGd0VUF2RmcwMU9qTVk=","repeats":1},{"count":1896,"lower_bound":"d1Fvb2RtVGw2bVhuOGNYNXFFYU41YVlKNWRXMHd2VTR5S0dpV0M5d1JkWXZZZzRwNmpudDR1dWJtNERyY1NkUk91RlR4RE80eUZ6WEpqWnJxZXA2YVJ0N1ZzUmlMN3FHaFVPUmJvZmVrNExQNUlUam1sb0ZXZHM2M1ZRMU5sQzcwd0JWWTZwTmZyMjgzaTVtZ0U0ankwMjVGQm1PeWE3VUlaeGpCZkUyWlZYdW5DR296UnJpODlVN29NdjdVVzFsTGUyZUZIRGMzbDFTTVdrWkduUDljYXhMaDRhQVhxQkVCZzRzTHNINDdkVUllOGszOThBckxGb2pqVHZ3a3UwYnZIbVRXTjhKcDFlbTJ3TA==","upper_bound":"d1YwMk9ic1FIdzREaU5iR2tRVXFsVmgwekRzT0pxazFaSU9nM3NuSzFzUzBXeVBGVzkwdFJOZDE4N2pTcTNNNGs3TGZVNFAzeVFQb01Ba0ZaRUlKb0dEQVZVbHk0b21Bek1URnhGOWd4V2V5MXIyTTVwZUU4NVZKTXI4NEVMYTAybjl5c1cwalVySENEOURhbjlGN1BlSWFidGdXQ0puN1NQdEY1Z2VGRnltREdjQW9lSEVBVDlpVXNrMUxWSHpEaTFDa2NWV2I1WFh6T1JLc2t4RWlEbXgyUmJTbjFZVG4wMHRQZUlnSGxhVU5LUENZem1TSktTN29KNTVtdnVpQnUwSXdKUkVZbUxCY2xub3lWT0pNcXdzRTJvVVM3Mk83T2VxQW5qeUdCNGxzcjhVUVA5bTVQdGdTYkdGcUVwUXVLaFJOMU1oSjUyd2E3QVhtVzhub2VHeDhFdlNLNkREOHVhMVBNZTZKdE9hM0dPRXV3Uk5GaEVIUEFjcENJOENScTVhekJMMjlHUkNwRVo5VmRMRjJFOEtXMVZtQmlBNWRBQzhvYWJvdndYRkpRVHVTTkZwZFFnNlpIN0htQU9JSmxFWVZ6YUtJazhUaXR0aHU3RzZZYlkyblZlcjFxZldJZmtmSGRSRjRhZndSNDZWNGIxQnJVd3dGc0lPeDM=","repeats":1},{"count":1904,"lower_bound":"d2Rsd2ZNZzBQSHZjeGUzR00xRjZtV0xYWm5wdmQ3czNOenBMWFhNQVp2N0VneWVuWW9Xd0M0R01kOXFMY0VSQ09EbUkwNEhBd0R4bUs1UUdWQXc5SEJzM2ZrbmlSdEtJcE9tVWZWbkRVNU1FclhSRUE1ZEVKd3lqa0dqSFVvZHJkSXhnZTFseXNHeEVCc2JaWUR6VlpaSHdZeHQ3am5pOG5tYlF4MHVr","upper_bound":"d2psZXBYRlRHY2pXVUFURHk3SlJhZXBRSjVIRW1Mbm5sM0luRTZjazYwc3RhdUNCanZxU0NhY0g1YllOQWpnRnlGYXN1aTFkakxpcXV6VGNDMG5HbVpBdDgxeHpPNkozZm9kTFhlS2pqSTNnMUg1amVIVnRjVUtHZ1V5aW1qV0I2bkhoM3dIaTBVdXdEYUVqS1pEaTVrZ0gzSmF3SW1lZ0FXTDZJaUZySTkxM1RiYW1YdUNwMWxZVnF3ZDdWR2hndGlZQ2VGODZBZGpwUUN5a05VdU5SR09vdWxVb3JEc1pJd054TGs1emZJVFdHVWdjb09JS1JxUVNjSXRFY0hadnFaNHFSV0I4VlQyRVRUclhKNWNMcE9kY2FPQzlhOHBoTDFaQUlFemJudFNWaGREdnpPSldTTEJMR0N2OElXeVFCbGRMbUI3ZVhFU2dtZmZHaFpUaERUdHVTbUdqdUpCMUxPVFJSZVNhMW0yWWJZTnhOUWg3M1RzQkN2a25USnd6Z2tIS3JPMU1HZ2hMZktHRDJDeHROazZ1Qk5WVUNtUjFuRDBtNVI2Q0JzY3RVeE5lYkowalVXYldNeXhzVEhUTHpYNm0wSUk3UTZDZ0ZIMkFUUlRrc2tEbWNWQjl5YUtTdm1wNHNhcXljVEU1ekk4dVNRbEE4eTljcTYyVnhLeXg1QWRoREtTUnJ6Q1doM2l6aVQyb3M3U2dTWk1iTzBLVHVv","repeats":1},{"count":1912,"lower_bound":"d2tJc2hwd00yZDFPYjZUeTE5RlNETHNGUnFDOG13enBycE1lSkRDRzlCZ0JuaHRwWGY5dVJnYnhtTUg0U0pFSzdLQXRkd1o0TFJnNHhrVW1lY1Zybm02UHVvWGdZeGZOb3BsVDhPNXFLYzZ1Z1A1Z2o2TVphVkFpSk5zb3g1SU1rcTZ3bXdLVWRDdTlPM0xEU2dwcDR4TzRIem1STTdnU2hrSm1jVUlyazhIRUpxdnBNVHNuTndWTEpsVlJPOXpNd3hRcVNSSE90N1lNZ0Q3b25NbXA2UlNjNW56TUlLUUp2Qkhu","upper_bound":"eEVNTGVES1FPc1lERE9yWUhmak9YaTNOeWFO","repeats":1},{"count":1920,"lower_bound":"eEVta3hXamk0bTlGNTRIa0V4YVZ6OTBKbW9jdllQeTJQdjk0SXV3dmtnSktVcmZtZTZtSFhCdmZKV2xoWjc2bDhQMERXeDYyNzE1cHhMYW95RmNQOHphMmVpUlhZREw1U2RWaHBxNTBQNE5ycHBERHRLbDhmYzB0ekpoWUwxa01oR1pyRkRQVmJCTVlEYUhlc2dKVUxZZ0lhWmVHbkdHUFJzQU9rMXRKTXZyaktCUE9Dalh5Snlyc1VuNGExSVg2QmwxMmdqMVpmS1kxVThlMldmaGs3NW5oWm9mcG1pTjZXSE0zQm9Tem5ncGdEcFFRc2ZiY2ZQMXFacHA1OTduYldUbk10cmZlaFAxMWpkWUN1MEM0RGMzeDJuend0NW1GaGl2M3dIQjJYamFNaDdoamwyUjNNU2o0SzNjZUx0VlhEcVlFNDN1QnlhbkNKUGFIN0J0bzVJaUdsTnhhYXpkN2xheVladg==","upper_bound":"eE43NzFBUW0wZ0Mxb3UwTEVxelpwTmtLVjhsdWV2SHZvNktqQ3pYWTlzV0E4dVFrd0lwWkZi","repeats":1},{"count":1928,"lower_bound":"eFBxOXdTMWw5YWYzOFVDN203NGFvZUhrWUNreG5qRWcxazBGbnd4VlA4MEdkMmJ5dGY5VG43YXFDMVJxUjQ5VktuOVJOMkUzWlRPVEs0eWZwQjhya0k0TVZjYXNuNkN2ZlVJQk1WWVJKSlhicDhHVGZuRU1XZTJFVE55d0s0VXJXY3Z6MnJVZmFRVEM1ZVM5TjdzTERMU2NkVmdvYzMyWXR4QVhEWWZyNTlBcFVmWXlyRXZJNDB5RWJUS1o0TTNialh0NUtzZTFUNVdHTEZ5Nm9mTDZFdGRnM29JR2J5SXkwdDhVaElQZVdXOG1TRHc1SlBJMDNTQzRvU3ZhR3VwcWo2aVlOSmhUeGVhUms1dzdaSmU3ZmgzbDM4UDJIV05LcVE=","upper_bound":"eGdnc0VvZW9DWGpBMUJ1YUxxTjVsVGxsbkQzbjNaZmJCWWozNm9jejZONXhwY2cyOTRwTFFFTXoyRGp1SDNMaVB2VG9SMWNFOXo0Q0JKaEJIZ25FWDZsNWt6Q08xQVU1SXJzTkhYcEgzeXM3MlBiV2UxbU56MUh2YllsejBHc3d2aHEzM01LcVlENGJsZXNSQ3F4cTdMYlVUY1c1dTh6aXNiRHlHZUI4OFNMczM5WVNxUExtV1pnYmZ4N1ZwYXc4SmVGQXA2TENxTWhJQ3Znb3BXb0FUbFVnUjJhVjdjbGlXcWlWTWNLdnl3VVpjZlVpZXJFTEdmZTk3dWtKNUhrQUFId2hqOUk0YWpNZjE4VVlSSGIzTTR4NHlpTkNuemFYVmNFdjNHV09ZUHdrR1BsbXVJMURLc2Z3dW1mTjdmZFJVcktnWUdjbTdtUEtJZXVTQ2xpV0NTcFNpQ0dadVd1bjZBOERuQ3ByUGxPUVYzSUJFaEZ6SzAxeGpWN2M3NHhHdXBWeTVmTERvSzh0MEFXYWcyZ2FTQUYzT0Q5dkNFYzl6d3RnVkNRbjkxS1lLOVkzT1VMdlY4ZmZUVXRzZ1NnNW9yeVZrdVZmczVRWG9MYjE2aWJHRlAxaVZmZllYNTMxMDZrRjlyd0ZWWEFLYng0","repeats":1},{"count":1936,"lower_bound":"eGd1UFVZMWhucTFKQjZHQnN0VlhTbXczck9vZVQzdndwUWE1WGF1N2xlZVFkaWszM1lmMnRHekRUUWh2aG9nN3FLSkI5dkVKNDZN","upper_bound":"eHBBMkM3ZXR1UU5PYWo2MVFWVEppVzZPR2hkZW9lYmlSOHBwZHBIQ0Y5TTF2WGFUVDI2bG5ENmJpREFHV25SNHJhSmVYQzBjYmVQQ3Y4SHNocjlCZUVRdm5NbGxuRE0xMHlpUTNCZThOYm9QbFYxTHQxR2VMOUtNckhsR2pkME4zWGpTcVBCOHl0SVM5YVhpdVpVTWNGd2FDMjYxNnNaZHZ3VWxqSWlNMG05UEN3cmozdEJzOVZlWVFSbnJoclBaN0JiVDBIYkJxQ1EzejNIRURuUEpmU0F5Y3RzaXVpMXZ2ZjZLWWxMTTdQa0tlTld2cnBGcTBreXp5REdvV3lQT2tTTUNla3o0QmFkTzJkdDdicWI1Z1EyeDZsSVp3dXhXaVh2WXplMk5UUngwNW1oME0xemlkTW0xQkdaaElHdlRQaWlMOEJDTWtVYnMwWDhJOWJCOWRxeVZSVkhJTzd2aEJCT2lJeWJ3RVVRNzVvNEtxcHM0Mm41QnNobFNCc3ZMUXN5eTNrOUdFTWpCejQ3S1hlcWw5ZW9yZHpYZTZ2M2hHWk5PTXgxQmxYMzlpWTNDTUF3TEMxN0VyWU95c0Y0d2k2bDRIS2dWUllDMWE4Umg3ZEtBV1JJVkdmc2JEa29oQ3NESA==","repeats":1},{"count":1944,"lower_bound":"eHk4Vkh4UnFrUGFaMWlpODU5QkJZT09GcVJkU0F6MDZ1U1JxeTA2RjB0MHlqMXpWN1E5RlQ1dG1NVTc5cUNicFRPUE1JcDFKY050Y3Z6c0QxeTNYaFAxaFBwN05VVEsxN29UclBSQlhONUdDbWFtbTJ2Tkp5alNhUDNlT1pCR2pUSk5iREwxVjhOOGpFS1U3dFp4bHVDNDEyYnJOV25aNnN2ZDRablBEQ3VmNUpxY0J5bExmbG1hWnkyN0hVYmFiV2U5c211bjN1Zk9y","upper_bound":"eTdtaGdkV1FFSWk4RFBJVnd5VlJya1JDWEJUalVKY1hCVTZQUWhKajdRalFENlZJVTFiU3dZMWN3bGJiRjdtYWNlc2pWR2VzWXFueFRVdnBVZVJHSHduRmVVSlVIbjFOd2JPeFVDSWxRc3BqQ1piZFpTU1JyQVFZYUFDSHFja1FmQXlOMHVSenMyaEFRZ0V6YnhBNW5rYWZxN0RLOU52b3hKMFVnakNneTEyOTNSMndWam9wODZPNHgxc1NqaExwYlFWTjVQSW5kSE10amhyaDF5UnRGUzhSYnJHcjlmYVE2dGQxY3ZyYlpSeGNLckhNNTI=","repeats":1},{"count":1952,"lower_bound":"eUJwS2FhZU43d1NlVXltUUJqajJIMjk4bm9xbWJlMHN0a2lqekhTTkpBYk5CWjBNTlRZaFp2bEJtZjB5dlNiM2Y5NHpkT1hPMHNmVE1lTEppM0FlOWtXajlvTGdyVTZ4TkNyOWFnR0FhVkJZWnlhWkRON0ttcHp1RHlFZWdmcGRiREVhZGU4OFk1UjRzYkcwN0hKbVQyT2xHc2xHTjVLYktGeUtlSklDVW5vOVhlR2xyUkh4MzdPVTg5NGh0bWNXMHN5MUM0ZmNUSDZmTWZiV3BOQmZXbkp2ejN5bENPVEI5RmhxNGxORjFiZXJrZHVxWTZsaXJqbjBqM25PWUZQVE9MMGtiTWU3UkRtNXIycEN3VUhrUW02V2ZOMzFmRVdSNk13OWhXY1ZpQUxBSUdLbWFRNHEwRURHTjZ5Z3RqYTE1dENiSDQxRWo1TG91dUtkRHdkWmxqN2V5NTM4UEFzcFBZZ1E4clZkYWxCSHVwZ3o0VUNpZHN6emtWNnhyMXA5WnZnZHdndGJFR2EwYzFDQ1NZVk5rVzl0U1RPNU1CZzIwVmhRYnB5MmVjMkxNeDFNdnVpMGpHUVZCTzZSVllqUDZiazNPeDRjODEwRnEzdHF0b09ydzVPeWpIUlZNeWhlMzlTdGVIZHZUZ2pGM1VxVGhVbEZNMQ==","upper_bound":"eVFuM0FXaUNFc1hETGU0SzRyNHpFNU5qVDJFZ29pMTFTRkFpdFlsS0dPMnlhZUNIcnpWeVcwVVJSVlpYczJSZXd1WUdvVWdWVXdmU21hVUFkSEdOV1NrckJVYlppZ2RMNmxLdU83Q0lNdUNFYkplaTZERExaMlRMSGdKUjdiRksydGJ5TUhKaFhRWkVVdGxCeFc1UDhDZzNXM0g2dERlTXB3eE1nNEV1U3FLVldpQUxWRjRTT3owUUZBS2RwU2JrdFFXdzhVcW9wbFc1V3dBeTRmM2V1Z3l6SFR4ajFIdkJlQ3d1UjlhYnVvRnJyN3RjRFZmUmRlM0Q4S1lnczBwZU1sN1JRNHNEZ2hSU2RBODZhcXVneWFSS1VLTHViV2xCc05SUE9qaHFMV09ZZWhVYlFzYg==","repeats":1},{"count":1960,"lower_bound":"eVZaeTFwQmhFVElBV3BsQmIwOElaSHhaSGVNbzFuSnNTVWxXNDZKNXNRTWUxM2VaTGVSU3luN0hzZEw2MHgwMWxzamxrZEN0MVhOb0NFRGZ0cm1JSGhRbDVWcnR5UTlrdUxsbDlLU1BmblNEWVBpblBMcmpVMUw1WHFrN3hoRFFGWmJNVzdaUDl6RW5QaHRVenNFTXQ0UWExMTZFZDRzb1k=","upper_bound":"eWZWTEZta2V4N25GcEE0TGlQU1ZQd0c2ZzFOZXdFVTBpc2c5Ym1hZmw4MzlhODNEaU8yMFR1OWxHaEFVZ1licXhxRzdEN1RNeGM1dmw2WTBSWnNRRXpWeVlyRjBKZnhXaVFBU1NEMG5wTWVIZkU1Z0t5ZGFyaFBpU2tE","repeats":1},{"count":1968,"lower_bound":"eWlYM0tZTVRXT0RjTGdLZkVlTFZXVm9mc0hjaHl6cG9hWFdBalJ0dGcxalNoQjRZOWR5RmZ2YXl0WGJlVEpEWjlYRDdYRVZDcTF2REZaaGp5OFlzUWxyRm0wUDdyakhnYkEwdHl2ZGVYNWY4YnJJUHVCbTBrc0hZbmpXUHFTdVhSM2I3dDBacmRleGVKbzhZS1BiOVZOZnBTaGRlazVqelY2bFlkM2NhcVlrcnFWV2lDZ1k3MGYyQTlnbVdqUVdDNTBjbEpNcTBLUGxETzYwS2R5Wm5zd2liS2hpbHBDbDZ1NDhmQkFuWGZBSlVpVkVBbGVvVTdpRVI3TjA5OGtVdzJYbnBCTzF3WTJSWWZQTGFTcGdTQ1F1eA==","upper_bound":"eXhQSkMxQno=","repeats":1},{"count":1976,"lower_bound":"eXh4bW5pYWlMaWdsTG9tNEY2Y20wMXF6WE1xTENkMkpmWHdrR3FzVTVhVHBlNzlFbnhUMDI3c3JidTZaUWNjYzdGZXFMSUs3NWF1bDYwclk1R0xOTENyV1p1cUpFcTVRNkMxVWx4R0VNajNaY3ZRT3ZLeUhJc05mU1ZXbWlnSXRyRUI4eUROeTgzZTd4akxocHpnQVBJbWVOUGpNdjVKUEJEb1ZJMmNHMmxkR0Y1ZlpLZmxZOUhqQ0JaZ0hZT0JOejlsSHc3T0VPQWU1MFMzblc0cmxBQ3c5dUVGZGlZcmVyNWJ5c1hkclZZN2oyRjdiamh3M2s3cGJqa0ZjZEtzZWk0S1d1RXlXbXN2cjRTR1hkVVJSV2hOb0NTMWRmUVZ5cFo3YjZNQUZnNUZHWUQ5cU9kTEVzOEswZG43YjZHc1BIWnhwY1ZzWjBSbWp0b2kyMFY3ZlpJM1BKSERzVmlZVVFubVdVWU1STjZCb1pPZjhTMjhza0FjeHp4ZDVYYnZiYnVEeHZwTjRER3g5a3NvTTlJdFQyTkV2cTJoZGg=","upper_bound":"ekhoZg==","repeats":1},{"count":1984,"lower_bound":"ekkza0tlR1JINUZZN09TekRXdGpCRTByREk5UlZ2cVhLQ2UzQkpqUnFwVEk2RXYyOG1hY0hZZlBvN1ltN2EyN210SE9aV0hXNXdFeEh5dXBlMTFnTkhJRUpQZWlEczYyUERUN1pubDR3V2V4b2NzdmdpaDZJSGo2WDVFM25NYnBDTlNVMjR6Q09BT3VmRHBQaWFqTWdmOXBwQ0pJWjdHcWljb2l4WlZKaExKYkh2MFZYTmZ6eFhUOVZoeTd6M1hqTno1SEtFZTN6YU9TVEV5ZFZIcE1RZVptcUlDMWtOMXRtTHRPS1R4amFKb0RQTE9EOEd0U3htcXYwdDlqQ0dTWXh1c0wwTkpPbzBveUdSQklxenpPM1cxSWxOemd5T1lDV1UzSGIyamdweGF5alRmbjNSNjkzMmFxb091TVlZRXZEajZaT0JQc0NhbjlDWE1DREJrWjdCaEZNem1jeVFlNTd6VHFtcHh4NzBBeTlja3JyZkJtMWlvb2R0c3dQMnZoMFc4dkkyUVlldjRkR3RBczQwYVhHZVpKNDlpcFA3cTR1Y2tJSEJCZ3E2dlhaOU04STBpYQ==","upper_bound":"elhCMkZZY2hXRlhIZGVmaHpUYVJkSG95dWZhVGliUmNPRndNOUhOQk1iMzJHcXBubFgwNXBhVG1xYzBlQU5zdVg0NEpXeVE2RU5tRmVMOWpEcGdsTWd2Q3dRSVVYWnlyRjdycnJO","repeats":1},{"count":1992,"lower_bound":"ellWZXExcDVrcjd4c1pCc0lTMXB0SnRYdVR0SWRMdEdLUDRuMzNDOWpraWtiTEFBNEZUZG1oYUZoOWN5b2lsOWpOZ1FLbnUzT2pyc3U0QmQxaWI0ZzBIVlp1MUo5aWxJQUhLaHpSNndMS3ZlQmlIdWg5eEhXN3ZRUng5d1JTNmJpQVBDZkpuZ0xzR1NuTmtsbEt6VG9oaU8zMmJoVlowMVRpTVdDMThyZ1lvcUcyelRvTDFveU9LTlVaNDZvZW05OGJwWVptUWNDSWZqNlhuYjVJTVk3ZTF1M3FUemV0TjJwTFRqazJsRkJUMUVzdG1QWmk3dGtwU3MzWEpncEhsaVVnTXBY","upper_bound":"emFyZkRySGhkWVpNWGNIYkMzU0lTMjlZWmhqb0VkSjhMeWpKYWdNVTlGT3lVWVNOWHc0aDFhcjdjRVV3dHVtdEJOdVlWVWFzcUtUYkNidnUyMGg4d294NGN1dG5Bb0NleUo2TkI4VnpwVnNSSTh1V29ubWVUcmNlbDNkbHc2VlJxZXZiTFhDcDJ6ZTV6V2tSQkx2blpVVjVsR0dxU1BCeDNESDNvNU1qR3g5V2tFdE15VWpWcVprMWZnb25qQ1Y1WEJMTnVQTG1EMkZjQnpFaTBSVjF6VXE3S3M2YXYxdmVMaTdqWTVmTUxqNU1zQlc2N3dyV1oxRWxjZmp3Mm80b3pHbmFBNmR1UnIwVnV6U2dJNDdZdEZVTHM2d0JDMDNoR1NSbnhoT25WT2YxUm1BQkRaeEdSOHowYmphV0lmNjV0WDFGT3R1SUh3T0l6TjFRVDhmcGx1bVltTzlVeHZTajg1bWRIaXNLTU5OdE9YTG5vUWo0MTNDTXBNQkJZT21xMXRGekNqbEhPMnJ5dUVsOUdaRnBHaWpzWDEwdWNQREZMbWVzZjRyZDlGY3hJaFlMMkJYU0pKQjhYeVZIeUEyNmJpZDM4S0lWQUtzM3JnaVJVMVYyQjE5bE0wMUJpaA==","repeats":1},{"count":2000,"lower_bound":"emJUck5ZZ3BjSkZGUXNXZHhuUkRtbXhPRlRyM3lFT0pMbllWZDV2cG4=","upper_bound":"emlESXJyUEtERmRpbnNOdXdHNVZNY1JBU1l6RXZUTFdvZllPOE44Q2FkdlkwRGtCQ1k2WldDVVR1SGxZTTh4MXFFTmFGcnBKbmdmZ3V2RXFoVmQ0N2RDN1hxSHZGMjRKR3ZIaTZBdFE5dTN5NmhUeUJoVXNnazJlcUpmZjZxamlKN3JXakdQV3VHd3p4ek5SRTdYUUFldDNNQUpyQ3pOdzBqY0NOZ2tKaVByNWp2ZzZPQVg0bE5xMDE2b2F6SDJ5RHBrU3haSEJXa2hMYWYySGVDWXptWW5nUVFEaFduVTRPWlBFdEFoTmVFVG11emZHY1RzcFdRUkpuYTQ2UWdaSjJPQzhtU2hqMzJmaEpDcnF2TXhJQnUxa3dmbG5iZ2VvRDVLRHNmT2EyZkU2c1FoOE9hV0JGaGNadnZIMHFhd2k4ZDQxYU1zNzZ3Nm9MbTZpNEZSQ3NZY21VeEhRZkZwTHhaeWNrYWFFSmZNZXZCQ1I0OWtJa1ZwcFhxQ0hDT3VmY1N0a0YzbnZBZlBESTEwZDdFUTJVQ0ZQMjBqeTcyYXJXWjVJcWVReGI4RkNiNlYwM1dyWTVtV3lGZXhNOFZYRm1nVnpQQmI3ZGNoRzNrV0JpV3ZYM29OVDBrTUNIMUlPa2I1ekpWMUpLYlE5dkh3NDAzQzVRaXRhMXF6VA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,2,0,1,0,1,3,0,1,1,1,1,1,1,1,1,2,2,2,2,2,3,1,1,0,0,2,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,0,2,1,2,2,1,2,1,2,2,1,4,0,2,1,1,1,0,3,0,0,1,1,2,3,0,0,0,1,0,2,1,0,2,1,1,1,1,3,2,1,1,1,1,2,1,0,2,0,0,0,0,2,0,0,1,0,0,1,1,2,2,0,2,0,1,1,1,3,1,2,1,3,0,2,0,2,0,2,0,2,0,2,0,1,1,1,0,0,2,2,0,0,1,0,2,0,0,0,0,0,1,0,0,4,0,2,0,0,0,0,1,2,2,2,0,0,1,0,1,1,0,1,0,0,2,1,2,0,3,1,2,1,0,0,0,0,1,2,3,1,0,1,0,1,1,3,1,3,1,5,1,1,3,1,0,2,3,0,1,1,1,1,2,0,2,2,0,1,1,1,2,1,0,0,0,0,1,0,1,2,0,0,1,1,0,2,1,1,0,1,1,1,0,1,1,0,1,1,0,0,0,0,1,0,0,0,4,0,0,1,0,3,0,0,1,1,2,0,1,1,2,3,1,2,1,1,2,2,1,0,0,0,0,2,2,0,0,0,2,2,2,1,4,1,0,0,0,0,2,1,1,1,2,0,1,0,1,1,2,0,1,1,4,0,1,1,1,2,0,1,0,2,0,0,0,2,1,1,1,1,1,1,0,0,2,0,0,3,2,3,0,0,1,3,2,0,0,2,1,2,0,0,1,0,1,1,2,0,2,0,1,0,0,1,0,2,1,1,0,0,0,1,1,0,0,1,3,0,0,2,0,0,0,1,0,0,1,2,0,2,2,2,0,3,1,2,1,5,2,3,0,0,2,3,1,2,0,0,0,0,2,1,0,0,2,2,0,1,1,3,0,0,0,0,3,1,0,1,1,2,0,3,1,3,0,1,0,1,2,1,1,0,2,2,1,1,2,1,1,0,1,0,0,1,0,1,3,2,1,1,3,0,2,2,0,2,0,3,0,2,1,1,1,0,2,1,0,3,1,0,0,0,1,0,1,1,0,1,1,0,0,2,3,1,0,2,0,2,1,1,0,1,0,0,0,2,0,0,0,2,2,0,1,2,1,0,3,0,1,2,0,3,0,2,2,1,0,0,1,2,1,2,0,0,0,1,1,0,0,1,0,0,1,1,1,1,0,1,1,2,0,2,1,2,0,3,2,1,1,0,2,1,1,0,2,2,0,1,1,0,1,3,0,0,0,1,0,1,0,1,2,3,3,1,1,0,2,3,1,2,1,1,1,0,0,0,1,1,0,0,0,0,1,0,2,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,3,0,0,2,2,0,1,0,0,1,0,0,0,1,3,3,0,3,1,0,1,0,2,0,2,1,1,0,0,2,2,0,0,2,1,1,1,3,0,0,2,1,0,0,1,1,4,1,0,1,0,2,0,0,0,0,1,2,0,3,0,1,0,1,3,1,0,1,0,2,4,0,0,2,3,0,1,0,1,3,1,0,2,3,1,0,1,1,2,0,1,0,1,1,2,1,1,0,1,1,1,1,1,0,1,0,0,2,0,2,1,0,0,0,1,3,2,1,0,1,0,1,0,0,3,0,0,1,1,1,1,1,2,1,1,0,1,2,1,0,0,2,0,1,1,1,2,1,0,1,1,2,0,1,0,1,2,3,2,2,1,2,2,0,2,0,1,1,1,1,2,3,1,3,0,1,1,1,0,0,0,1,2,0,0,1,1,3,1,1,3,2,1,0,3,2,0,0,1,0,0,1,1,1,0,0,2,1,0,1,1,1,0,3,2,2,0,0,2,3,0,0,2,1,1,0,0,3,0,0,2,2,2,2,1,0,1,0,0,1,0,1,0,0,0,1,0,1,1,1,1,3,1,1,5,1,1,1,0,2,2,0,0,1,0,0,0,0,1,1,0,1,0,2,1,2,1,0,1,3,0,4,0,1,0,1,1,2,0,0,1,0,2,0,2,0,1,1,0,2,2,0,0,0,2,1,1,0,0,2,0,0,1,2,1,0,0,2,1,1,1,1,0,1,0,1,1,4,0,0,1,0,2,1,1,1,0,0,3,2,4,0,0,0,1,1,0,1,0,1,0,0,2,0,0,3,2,0,1,0,0,0,0,0,1,2,0,1,0,2,1,1,0,1,1,2,0,3,1,1,0,1,1,1,2,1,0,1,0,2,2,1,0,1,1,2,0,0,0,3,1,0,0,1,1,0,2,2,3,2,1,1,2,0,2,2,1,0,2,3,0,1,2,1,3,2,2,1,0,0,0,0,2,1,1,2,4,2,3,1,2,1,0,1,0,1,2,1,1,0,0,1,1,3,0,2,2,1,0,1,0,2,3,1,1,1,0,0,1,0,0,2,4,1,1,0,1,0,1,3,0,1,2,1,0,0,0,2,2,1,0,0,1,0,1,0,1,2,1,3,4,1,2,0,1,1,0,0,0,3,0,1,2,0,2,1,0,2,1,1,0,0,0,0,0,0,3,1,1,0,0,0,2,0,1,0,0,1,0,1,0,0,1,1,0,4,1,0,2,3,3,4,1,0,1,2,1,1,0,1,3,0,2,2,0,4,1,2,1,5,1,1,1,0,3,0,1,0,0,3,0,2,1,0,1,1,2,0,0,2,2,0,0,1,1,0,0,2,3,2,0,1,1,0,1,1,2,0,1,0,2,1,2,0,0,0,0,1,2,1,0,3,2,1,0,2,0,1,0,1,3,1,0,1,1,2,0,2,1,1,0,2,1,1,0,0,0,0,2,1,1,0,1,0,2,0,0,0,0,0,1,1,0,3,0,1,1,0,1,0,0,3,0,1,1,4,2,1,1,1,1,2,1,0,2,2,2,0,2,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,1,0,0,2,0,1,2,0,0,0,0,1,1,1,0,0,0,1,0,0,0,3,0,1,0,1,0,1,0,1,1,0,2,1,2,1,0,1,2,0,3,1,2,0,3,2,0,0,1,2,1,1,1,1,2,1,1,0,1,1,0,1,0,2,1,2,0,0,1,0,0,1,0,1,2,1,1,2,2,2,2,0,3,1,1,1,0,0,1,2,1,1,0,2,1,2,1,4,0,1,1,0,1,0,0,0,1,0,0,2,0,3,1,0,1,3,2,1,1,0,3,0,1,0,0,1,0,2,0,1,1,3,0,3,0,2,1,0,1,0,0,0,1,0,0,1,1,1,1,0,2,0,2,1,0,1,1,0,3,1,0,1,1,1,0,0,0,0,1,1,0,2,0,1,0,0,1,1,0,0,1,0,1,1,0,0,0,0,0,0,0,3,0,0,1,1,1,3,2,2,0,2,1,3,1,1,2,0,1,0,1,1,2,0,1,1,1,1,1,2,2,1,0,3,1,2,1,0,0,0,2,1,0,1,0,1,1,1,1,1,0,2,1,6,0,1,0,2,1,1,1,2,0,2,0,0,2,2,2,0,3,1,1,0,0,3,0,1,1,1,2,1,2,1,1,1,1,1,0,0,0,3,2,3,3,2,1,1,2,2,0,0,1,1,2,1,0,2,0,1,0,3,0,3,0,1,1,0,2,0,1,0,0,0,3,1,2,0,2,1,3,0,2,0,0,1,2,0,1,2,0,1,0,2,1,1,0,1,1,2,0,2,1,1,4,1,1,1,1,4,1,1,0,1,0,0,0,0,2,1,1,1,1,0,1,1,2,0,2,1,3,1,1,2,1,0,1,1,5,2,1,3,0,1,0,0,0,0,4,2,1,0,1,0,3,1,1,3,1,1,0,1,1,0,0,0,1,1,0,0,4,2,1,2,1,2,2,0,0,0,1,0,1,1,0,3,1,0,2,0,2,2,2,2,1,0,0,0,1,0,0,1,2,2,0,2,0,0,1,2,0,0,1,2,1,2,0,0,1,1,0,0,0,2,0,3,2,1,1,3,5,2,1,1,0,0,1,1,1,1,1,1,2,2,2,0,0,4,1,0,0,1,1,1,0,3,1,0,1,1,1,1,0,1,0,0,2,1,1,0,3,0,1,1,1,0,1,0,3,0,0,0,0,1,1,4,1,0,1,1,0,1,1,1,1,0,2,2,1,2,1,3,0,1,1,1,1,1,1,1,0,0,4,3,2,1,1,0,1,0,3,1,3,1,3,0,0,1,0,0,0,1,0,1,0,1,3,1,0,1,0,1,3,1,1,5,1,1,0,1,0,1,1,0,0,0,1,3,1,0,3,1,0,1,0,0,1,0,4,0,0,0,2,1,0,0,0,0,2,1,2,1,0,1,1,2,0,0,2,1,0,2,0,1,2,2,1,2,2,0,1,1,1,3,0,2,0,2,2,0,1,1,0,0,1,0,1,1,1,0,0,3,0,0,3,1,0,1,0,0,0,0,0,0,2,0,1,1,1,0,2,2,1,1,1,2,1,1,0,0,0,3,1,0,0,2,0,0,0,0,0,0,2,2,1,2,1,0,1,1,3,0,1,0,0,1,0,0,1,0,1,2,2,0,0,1,0,0,4,1,0]},{"counters":[1,2,1,0,3,0,2,0,2,1,0,0,1,1,0,3,1,2,0,3,0,0,4,0,0,1,0,0,1,1,2,0,3,2,2,0,2,1,2,1,1,2,1,1,2,1,1,1,4,0,1,2,0,1,1,1,2,0,2,0,0,2,0,0,0,1,1,0,1,0,1,0,2,3,2,0,1,0,1,1,0,0,0,0,0,1,2,2,0,2,2,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,1,1,1,2,2,1,0,1,1,0,2,0,0,1,1,1,1,1,2,1,1,0,0,0,3,1,0,4,0,0,0,0,1,0,2,1,3,1,0,0,0,0,3,1,1,1,0,2,0,1,0,1,2,1,0,1,1,2,0,0,1,2,3,0,3,0,1,0,1,0,3,5,1,1,1,0,1,2,0,0,2,0,0,1,1,1,1,4,0,2,2,2,3,1,1,1,1,2,0,2,1,0,2,1,1,0,2,2,0,1,0,2,0,1,0,1,0,1,2,0,0,0,2,1,0,0,1,0,1,2,1,0,1,0,1,1,0,0,2,0,0,1,2,0,2,1,0,1,0,3,2,1,0,0,5,0,2,2,1,0,1,1,1,1,1,1,1,1,0,1,1,0,3,0,2,1,1,1,2,2,3,0,0,0,1,1,1,0,0,1,0,3,1,1,1,1,3,1,0,2,1,2,0,1,3,1,0,0,0,0,1,0,2,0,2,1,1,0,2,1,0,0,0,3,0,2,2,0,2,2,2,0,1,0,1,2,0,0,1,0,4,0,1,2,0,0,1,1,1,1,1,0,0,1,1,0,1,2,2,1,0,1,0,0,2,2,0,1,1,0,2,1,0,1,0,0,2,0,1,1,1,1,0,4,0,1,3,1,1,0,1,1,1,0,0,0,2,1,1,0,0,3,0,1,0,2,0,1,1,0,0,1,1,0,0,0,0,3,1,1,1,1,0,3,1,0,1,3,1,0,0,2,0,4,0,1,3,0,2,3,3,1,3,0,2,0,1,1,2,0,1,3,0,1,1,1,1,2,0,2,0,1,1,1,2,2,0,1,0,0,0,1,0,1,0,1,3,1,1,0,1,1,2,1,3,1,2,1,1,1,0,3,2,0,2,0,3,2,6,0,0,1,0,2,3,2,1,1,0,1,1,0,1,0,2,1,1,3,1,1,3,3,2,1,0,3,1,0,3,2,1,0,3,3,1,0,1,0,1,2,1,0,1,0,1,0,0,0,0,2,2,0,0,3,0,0,0,1,3,1,0,0,1,2,1,0,1,1,0,2,1,0,2,1,0,1,2,0,3,2,2,1,2,1,0,1,1,0,1,2,1,1,1,2,0,0,3,2,1,1,0,1,1,3,0,1,1,0,3,1,1,0,1,0,1,0,0,1,0,3,0,3,1,1,0,0,0,2,2,1,4,1,0,0,0,2,2,2,2,1,0,1,0,1,3,1,1,0,1,0,1,0,0,1,1,2,0,0,1,0,4,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,2,0,2,0,0,1,0,1,2,0,2,1,1,2,1,4,1,3,0,1,0,0,0,0,0,2,2,1,1,0,0,2,0,2,1,0,0,2,3,3,0,2,0,3,2,1,2,0,0,0,1,1,2,0,2,1,2,0,2,0,0,2,2,0,3,1,1,2,1,1,2,2,1,1,2,2,0,0,0,0,0,2,1,1,1,2,1,1,2,1,2,0,0,0,3,2,1,1,3,1,1,0,2,0,2,0,2,0,0,1,1,1,0,0,0,0,3,1,5,0,0,1,4,2,1,1,2,2,2,1,1,1,1,1,2,1,0,0,1,0,0,1,2,0,1,2,1,1,2,0,3,0,4,0,1,0,3,0,1,1,1,0,1,2,0,3,3,2,0,1,2,1,4,0,1,0,0,4,2,0,1,1,1,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,2,1,2,1,3,0,0,1,1,0,0,0,0,2,3,0,0,0,0,1,1,3,0,2,2,1,0,1,2,1,0,1,0,0,2,0,0,1,1,0,0,1,1,0,1,1,1,0,1,0,0,2,1,1,0,0,1,0,1,2,1,1,2,1,0,1,0,1,0,1,0,3,1,0,1,0,2,1,1,0,1,0,0,0,1,0,2,1,1,0,0,3,1,2,0,0,1,1,3,1,0,2,1,4,0,1,0,0,1,2,0,0,1,1,3,0,0,1,0,0,0,2,1,1,0,3,1,2,0,1,1,1,1,1,2,2,0,2,3,1,1,3,2,0,1,2,1,1,2,1,2,0,2,1,0,0,2,0,0,0,2,1,0,1,0,0,2,0,0,2,0,2,2,1,1,1,2,2,1,0,2,1,0,1,0,0,0,1,1,1,1,0,1,1,1,2,0,2,1,1,0,0,0,3,1,0,1,1,0,1,0,1,1,1,1,0,1,0,1,4,1,1,0,3,2,1,2,1,0,1,1,2,3,0,1,0,0,0,0,0,1,1,2,0,1,3,0,1,1,1,1,2,0,0,3,1,1,0,0,0,0,0,2,2,1,1,2,0,1,1,2,0,0,3,1,2,1,1,0,1,1,2,1,0,0,1,0,2,4,0,1,1,3,1,0,1,1,0,1,2,0,2,2,0,2,0,1,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,2,0,1,1,3,3,5,1,0,1,1,0,1,3,0,0,3,3,0,1,1,0,1,1,0,1,0,0,1,0,0,2,2,0,4,0,1,2,3,1,3,0,0,1,0,2,1,1,1,0,0,1,2,1,2,1,0,0,1,3,0,1,2,4,2,0,0,0,2,0,1,2,0,2,1,1,1,1,1,0,0,1,2,2,0,3,2,1,0,1,1,3,0,1,0,0,1,1,1,2,0,0,2,0,1,0,0,0,2,0,1,2,1,0,0,1,1,1,3,0,0,0,0,0,0,1,0,1,2,0,1,1,1,3,0,1,1,1,1,1,1,3,0,0,0,2,1,0,0,0,0,4,3,1,0,0,0,2,0,1,1,2,1,3,0,0,0,0,2,0,0,3,0,2,0,0,3,1,3,1,0,0,1,1,1,0,0,0,2,0,0,1,0,1,0,1,1,2,0,1,2,0,0,0,1,1,1,2,6,1,0,1,0,0,1,1,1,0,0,1,0,1,1,3,1,0,0,1,0,0,1,1,1,1,1,2,1,1,0,1,0,2,0,1,2,1,0,2,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,3,1,1,0,2,1,0,1,0,1,0,0,0,2,1,0,3,0,1,1,1,3,0,0,0,0,0,0,1,1,0,0,2,0,0,0,0,1,1,1,5,0,1,2,0,0,0,1,1,0,0,2,0,1,2,0,1,2,2,0,2,1,2,0,4,1,0,1,1,1,1,2,0,1,1,1,3,1,2,0,0,1,0,2,2,2,1,1,1,0,3,2,2,1,2,1,2,1,0,0,0,2,1,1,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,1,1,1,3,0,1,1,0,1,0,0,0,1,1,2,1,0,0,2,0,0,0,2,2,0,2,1,0,3,2,2,1,0,1,0,2,0,0,0,1,2,0,3,0,2,1,1,2,3,2,0,0,0,1,2,4,2,0,0,0,1,0,0,2,1,2,0,2,0,2,0,3,0,3,1,1,0,0,0,0,2,0,1,0,2,0,4,0,1,2,1,1,1,0,1,1,0,1,0,2,1,2,0,2,1,1,0,4,0,1,1,1,0,3,1,1,1,2,2,1,1,3,0,1,1,1,1,0,1,1,0,2,1,1,2,0,1,2,2,1,0,1,0,0,1,1,0,1,3,0,1,1,0,3,1,2,0,2,1,1,2,1,2,1,2,1,0,2,0,4,2,0,2,1,2,0,1,0,1,1,0,0,1,2,2,1,1,1,0,1,2,0,0,1,1,1,1,0,0,0,2,0,2,0,0,1,1,1,1,2,1,1,2,3,3,0,1,0,0,2,0,0,2,0,0,1,2,1,0,1,0,3,0,2,1,1,1,0,4,0,2,1,1,1,0,2,1,2,1,2,0,1,0,1,1,2,0,0,0,0,0,0,1,2,1,1,1,2,1,0,5,3,1,1,0,2,1,3,0,1,0,4,3,2,1,0,0,0,1,0,2,0,1,2,0,0,2,0,1,0,0,2,1,1,2,1,0,2,1,0,1,1,0,1,2,0,2,1,1,1,1,1,1,1,2,0,1,0,1,0,1,0,0,0,2,2,1,1,1,1,2,1,2,0,1,0,1,2,4,1,1,0,0,1,0,1,0,0,1,0,4,0,1,0,0,1,1,0,0,0,1,3,1,0,0,2,0,3,2,0,0,1,3,1,1,1,0,0,0,1,1,1,1,0,1,2,0,2,3,3,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,0,1,0,4,1,0,0,2,1,2,3,1,2,0,1,2,3,1,0,2,3,0,1,0,0,0,0,0,2,0,0,0,0,1,0,1,0,1,2,1,2,1,0]},{"counters":[2,0,1,2,1,2,0,1,2,5,1,1,0,0,2,2,2,1,3,0,2,4,1,1,1,0,0,0,2,0,2,2,2,1,0,1,4,0,1,1,3,0,1,1,1,0,1,1,2,4,0,2,0,1,3,0,1,0,2,1,0,2,3,2,1,0,2,1,3,0,0,1,1,1,1,1,2,1,0,1,1,0,1,1,1,1,1,2,0,1,1,0,1,2,1,2,1,1,1,0,0,0,1,1,2,0,1,1,1,2,0,1,0,3,0,0,2,2,2,0,0,1,1,3,2,1,0,1,3,1,0,1,0,0,1,0,0,0,1,1,0,0,1,0,1,0,2,0,2,2,1,0,1,0,1,2,1,1,1,0,0,1,0,1,2,0,0,1,1,0,0,0,1,2,0,0,1,1,0,2,0,0,1,1,1,1,0,0,3,0,2,0,0,0,2,0,2,1,2,2,2,0,2,2,1,1,1,1,2,2,2,2,2,3,0,2,1,0,0,1,0,2,0,1,1,0,0,1,5,0,1,1,2,1,1,0,2,0,3,2,1,0,0,0,0,1,2,2,0,3,1,1,0,0,2,0,2,0,1,0,1,0,2,0,1,3,1,1,0,2,3,0,0,0,2,2,1,1,1,0,0,1,1,0,0,1,1,1,0,2,1,0,2,1,0,0,1,1,0,1,0,0,1,1,0,0,2,0,0,0,0,1,1,1,0,1,1,1,0,2,1,2,3,0,2,3,1,0,0,4,2,1,1,0,2,0,0,2,0,0,1,2,2,0,1,0,3,4,1,1,0,0,1,0,2,1,0,0,0,0,2,1,2,1,1,1,2,1,2,2,2,1,1,1,0,0,2,0,0,0,1,0,1,1,1,1,1,0,1,0,0,0,1,0,0,1,3,0,1,1,3,0,2,1,1,2,4,2,0,2,0,0,0,0,0,0,2,2,1,2,1,2,0,0,1,1,0,1,2,2,0,0,3,1,1,1,2,0,1,1,2,1,1,0,1,1,1,2,2,1,0,0,2,0,3,0,1,1,1,0,1,0,1,2,1,0,2,1,1,0,2,0,2,1,1,1,0,0,5,0,0,1,0,1,2,3,3,0,6,0,0,0,1,0,1,1,1,1,0,3,2,1,1,0,3,1,1,1,1,1,0,1,1,3,0,1,1,5,1,1,4,0,2,0,2,1,0,0,2,1,2,0,0,0,3,0,2,1,4,1,1,0,0,2,0,0,1,1,0,2,1,3,0,1,1,2,0,0,1,2,3,0,1,1,1,2,0,0,2,1,1,0,1,0,0,0,1,0,1,1,1,1,0,3,0,0,0,2,0,4,0,0,1,0,1,1,0,1,1,0,0,1,2,2,0,1,2,1,1,0,1,0,0,4,0,0,2,0,0,1,0,0,3,1,1,0,1,0,1,0,0,0,0,0,1,2,1,1,2,3,2,4,0,0,0,0,1,2,0,0,0,0,1,1,0,1,0,0,0,1,2,4,2,2,1,2,0,2,1,1,0,0,0,0,1,0,4,1,0,0,1,0,0,0,0,1,0,2,0,1,0,1,1,1,2,0,1,0,0,0,0,0,0,1,1,0,0,0,1,0,1,3,1,0,1,1,3,1,2,3,0,0,0,2,1,1,0,1,0,0,1,1,0,2,1,0,1,2,1,0,0,0,1,0,0,1,2,3,1,1,0,0,1,1,1,2,2,0,0,2,0,1,1,0,1,0,1,0,0,2,1,3,3,1,3,2,0,1,0,1,0,2,1,1,0,0,1,0,0,0,0,0,4,1,2,1,1,1,2,3,0,2,3,0,0,1,0,0,0,1,0,1,0,1,1,0,2,2,0,1,2,0,1,2,1,0,2,0,0,2,1,1,2,1,1,0,1,1,0,3,0,0,1,2,1,1,1,1,1,0,2,2,1,1,0,2,1,0,1,0,1,1,3,0,0,0,2,1,0,3,1,1,1,0,3,1,1,0,0,2,0,1,1,2,0,0,0,2,0,2,1,1,1,2,1,2,1,1,2,1,1,2,1,0,0,2,0,0,3,3,1,0,0,0,2,2,1,3,0,0,1,4,0,1,0,0,2,1,0,2,0,1,0,0,0,0,1,0,1,1,2,1,2,0,1,0,1,0,0,1,1,1,0,2,0,1,1,0,1,0,0,1,2,0,2,3,3,1,3,0,2,0,1,0,1,0,3,0,1,0,0,0,1,0,0,1,1,2,1,0,0,1,0,3,1,0,0,1,1,1,0,1,0,3,1,1,0,1,0,1,3,1,1,1,1,2,2,0,2,0,1,3,0,1,3,0,3,2,0,0,1,0,0,0,6,1,1,0,1,0,0,1,0,0,0,0,1,1,2,1,1,0,0,3,2,2,1,2,0,1,2,0,2,2,1,1,0,0,0,1,1,1,1,0,2,0,2,0,1,2,2,0,0,2,0,0,0,1,2,1,1,1,1,1,2,1,1,0,1,1,3,0,1,0,0,1,0,4,2,4,0,0,2,2,0,2,0,1,1,1,3,1,3,0,0,3,0,1,1,1,1,0,2,0,1,1,1,1,1,4,1,0,1,1,0,1,3,0,2,2,0,0,0,2,0,2,0,3,0,1,1,1,0,0,1,2,0,1,0,1,2,0,0,1,0,0,1,1,4,3,2,0,1,0,1,1,2,1,0,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,2,0,1,0,0,0,0,1,1,1,2,1,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,4,1,2,3,2,1,1,2,0,0,5,0,0,0,0,0,1,2,0,0,1,5,1,1,1,2,3,2,0,0,0,2,0,3,2,4,2,0,1,1,0,1,1,1,1,0,0,1,1,0,0,1,1,3,0,1,1,1,2,2,0,0,1,0,0,0,0,0,0,2,0,3,0,0,1,3,2,0,2,2,2,3,1,0,1,2,0,3,2,0,0,3,0,2,0,2,1,0,0,1,1,1,0,0,0,1,2,2,1,0,0,1,1,1,1,4,2,2,2,1,2,0,0,0,1,3,0,3,2,1,1,0,0,0,1,0,1,0,0,3,0,0,1,1,1,0,2,1,1,3,2,1,0,0,1,1,1,2,2,2,1,0,1,1,1,0,1,1,0,1,1,2,1,1,0,1,0,2,0,0,3,1,1,0,1,0,1,0,2,1,0,0,1,0,0,0,1,1,0,0,1,1,0,2,0,1,0,1,0,1,1,2,1,1,2,1,0,1,0,1,0,3,1,2,4,1,0,0,1,1,1,1,0,0,1,1,1,0,0,3,1,2,2,0,0,1,0,2,2,2,1,3,1,2,0,0,1,0,0,0,0,2,1,0,1,3,1,1,2,1,0,1,2,1,1,5,0,1,1,0,0,0,1,1,4,1,1,0,0,0,2,1,0,4,1,2,1,0,2,1,1,1,2,2,1,3,0,0,0,4,0,0,5,0,4,1,0,2,0,2,1,1,2,1,2,0,0,0,0,0,1,1,0,2,0,0,1,0,1,1,0,2,1,2,0,2,1,1,0,3,1,2,2,1,0,2,0,1,0,0,0,1,0,3,0,1,2,1,1,2,0,3,1,0,1,1,2,0,2,0,1,1,0,0,1,0,2,1,0,1,0,0,0,0,0,2,0,0,0,2,1,0,0,1,1,0,0,1,1,0,1,0,0,0,0,3,0,2,2,2,1,0,2,1,2,1,2,1,0,1,1,0,1,0,1,2,1,1,2,0,1,3,0,2,1,0,1,0,2,1,0,1,0,1,0,1,2,2,2,1,1,2,2,2,1,0,2,4,1,2,1,0,1,0,0,0,1,1,0,0,0,1,1,1,3,1,2,1,3,0,2,0,3,2,0,0,1,4,0,1,1,2,1,1,3,1,1,0,1,0,1,1,2,1,1,2,1,0,1,2,1,2,1,1,3,2,1,0,2,2,0,1,0,2,0,1,2,0,1,0,0,2,0,1,2,2,0,0,0,1,1,1,1,3,2,0,1,1,2,2,2,1,3,0,2,2,1,1,0,0,0,2,2,1,1,1,1,0,0,0,1,0,1,0,1,1,0,0,2,1,0,0,0,2,1,1,1,0,2,0,1,0,0,0,3,2,0,3,1,0,0,1,1,1,3,1,4,0,3,0,0,0,0,2,0,0,1,0,2,1,1,0,1,0,2,4,0,0,6,0,1,1,1,0,0,0,1,0,2,0,1,1,2,1,0,1,0,1,1,0,3,0,2,2,3,0,1,2,0,0,0,0,1,0,2,0,0,0,2,1,1,1,0,1,1,1,1,1,2,0,1,1,2,1,1,2,1,1,1,2,2,0,2,1,1,3,1,1,1,0,0,4,1,2,2,1,1,2,0,0,1,1,0,1,0,1,0,1,0,1,0,0,0,1,0,0,0,3,2,1,0,1,0,0,1,3,2,1,1,1,1,2,1,1,1,0,0,1,3,1,2,3,0,0,0,1,0,1,1,0,1,1,2,0,0,2,1,1,2,2,1,0,0,1,2,3,1,1,0,1,3,1,2,0,0,0,3,2,0,0,2,0,2,0,0,3,0,1,0,2,1,1,2]},{"counters":[1,2,1,1,1,1,2,0,2,1,0,0,0,0,2,2,0,1,0,0,2,0,0,4,0,1,1,1,4,2,2,0,1,2,1,1,1,1,1,1,2,0,1,3,1,1,5,1,0,1,1,1,3,1,0,1,0,2,1,0,0,0,0,0,0,0,1,0,0,1,2,1,0,4,2,0,2,1,1,0,0,0,0,0,1,3,0,1,0,2,1,1,0,0,2,1,3,1,2,3,1,0,0,1,0,0,0,0,2,0,2,1,0,0,1,1,2,0,1,1,0,1,1,0,1,1,0,3,2,1,1,0,3,1,0,0,3,1,0,2,1,1,0,2,0,0,2,0,1,2,1,1,0,1,1,1,1,0,2,3,0,2,0,3,0,1,1,1,0,0,0,0,3,1,0,2,1,1,0,1,1,2,1,0,0,2,1,1,2,0,1,1,2,1,0,0,0,2,1,2,1,2,0,0,2,0,0,3,0,0,1,2,0,1,0,0,2,0,1,1,1,1,1,1,1,1,0,2,0,0,2,0,2,0,1,1,1,2,2,0,1,1,5,1,1,0,0,0,1,2,1,1,0,0,3,1,1,0,2,0,0,1,1,2,1,0,2,2,1,0,1,1,0,1,0,1,0,2,1,0,0,0,1,0,1,0,0,2,2,0,0,2,2,1,0,0,3,1,0,3,0,1,0,1,0,1,1,0,1,0,1,2,0,0,1,1,2,0,1,0,2,0,0,1,2,2,2,2,0,1,0,0,0,0,0,1,2,1,2,1,1,0,4,0,0,0,0,0,0,2,0,0,2,1,0,1,0,0,0,1,1,3,1,1,0,0,0,3,0,2,2,1,0,0,0,0,0,2,0,1,1,2,0,1,1,2,2,4,0,1,1,1,2,0,0,2,0,0,2,1,0,3,0,2,1,1,1,3,2,3,0,2,2,2,1,2,1,1,1,0,1,0,1,1,1,2,2,0,1,1,1,0,2,3,0,1,1,0,1,4,1,1,1,4,1,0,0,1,1,0,2,0,1,0,1,0,0,1,0,0,0,1,0,0,2,2,2,2,1,3,0,0,1,1,1,0,1,2,3,2,0,2,1,1,1,1,1,1,0,0,2,1,1,1,1,0,1,0,1,1,0,2,1,2,2,1,0,1,1,1,1,1,0,1,0,0,0,0,0,1,3,2,1,0,3,1,0,0,0,1,1,0,1,1,1,0,0,1,0,0,2,1,2,1,0,2,1,2,2,0,4,3,1,0,0,4,2,1,0,0,1,1,2,2,2,1,3,2,2,4,1,1,1,0,1,1,0,1,2,2,0,2,0,0,0,3,0,0,2,4,2,0,1,0,2,0,1,0,4,1,1,1,3,0,0,2,1,0,1,0,4,0,2,0,2,0,2,2,0,1,3,1,0,0,1,0,1,0,4,1,2,0,0,0,0,4,1,0,1,1,0,3,1,1,0,5,1,0,1,0,0,1,1,1,2,1,0,0,1,1,0,0,2,1,0,1,2,2,0,2,1,1,0,1,2,3,0,0,0,0,2,2,1,1,0,0,0,0,2,1,0,1,0,1,1,2,0,1,1,1,1,1,0,0,1,0,1,0,2,4,0,1,0,1,2,0,0,1,0,1,0,0,0,1,1,2,2,0,1,4,2,0,2,2,2,1,2,0,2,0,0,0,1,0,1,2,1,0,1,0,2,1,1,0,1,2,1,3,2,1,0,1,1,1,0,3,3,1,0,1,0,2,4,1,2,0,1,1,1,0,2,0,4,1,0,2,1,0,1,2,0,0,1,0,2,0,0,2,1,1,1,1,1,2,1,2,1,3,1,1,0,0,0,0,2,1,0,0,2,0,1,0,2,1,1,2,0,3,1,1,2,0,2,1,0,1,1,2,1,0,0,0,1,4,0,1,0,1,0,2,3,2,1,1,1,1,0,0,0,3,0,4,0,3,0,0,1,0,1,1,0,1,0,0,2,0,1,0,2,1,3,0,0,3,0,2,0,2,0,1,3,1,0,3,1,0,2,0,1,2,0,2,0,0,0,2,1,0,2,0,0,1,2,3,0,2,2,1,1,1,0,1,0,0,1,2,1,1,0,1,1,1,1,1,0,1,1,0,0,1,2,0,0,1,0,2,0,1,2,3,0,1,1,0,0,3,3,1,1,2,1,1,1,1,1,1,0,0,0,3,1,0,1,0,1,4,1,1,0,0,2,2,0,2,2,1,1,0,1,0,4,1,1,2,2,3,0,1,1,2,1,0,0,1,0,0,0,2,1,0,1,1,3,2,0,0,1,1,0,1,2,3,0,0,2,2,2,1,1,1,1,0,2,0,0,1,1,0,0,3,1,0,2,2,0,1,2,1,3,0,0,2,0,1,2,2,0,0,0,2,3,2,1,1,0,1,2,1,1,0,0,1,0,0,1,1,1,1,1,1,0,1,1,1,1,1,2,1,0,0,1,0,0,0,1,1,1,0,1,1,0,1,1,1,1,1,1,0,0,2,1,1,1,0,0,0,0,2,0,2,0,2,0,2,2,1,0,0,2,2,3,1,0,3,1,2,1,1,4,0,0,2,2,2,1,2,0,1,3,0,0,1,0,3,0,0,1,1,1,1,2,3,1,0,1,0,0,0,0,2,1,0,0,2,0,4,1,0,2,1,0,1,0,0,1,1,1,1,1,1,1,2,0,1,1,0,1,2,0,1,1,2,0,0,0,0,4,0,1,0,0,2,1,0,2,1,1,1,0,1,0,1,2,0,2,0,1,0,1,2,0,2,1,3,0,1,1,1,1,0,1,1,0,3,1,1,1,0,1,0,2,2,1,3,0,2,1,0,2,1,1,2,1,1,0,0,2,1,0,0,1,1,1,0,1,2,0,0,1,0,1,0,0,1,1,2,1,2,0,1,0,1,0,1,1,1,1,2,2,1,3,1,0,2,1,1,1,3,1,1,3,1,1,0,0,0,4,2,0,0,3,2,1,2,1,0,3,0,2,1,0,0,0,0,1,0,3,0,2,2,0,0,0,0,0,0,0,1,2,1,0,3,3,1,0,1,2,3,2,2,2,0,0,1,0,3,0,1,0,0,1,2,2,1,4,1,1,4,4,1,1,1,1,0,1,1,0,0,0,1,0,0,0,1,1,2,0,1,2,0,0,1,0,2,2,0,0,0,1,2,2,2,2,1,0,0,2,2,0,2,0,0,3,1,0,1,1,2,0,0,0,1,1,1,0,1,0,0,1,0,1,1,0,0,6,0,0,3,1,1,1,2,1,1,0,0,1,0,1,0,0,0,1,0,3,1,2,2,0,0,1,0,1,2,0,2,0,1,0,3,0,0,1,1,1,1,1,1,1,0,4,0,3,0,2,2,0,2,1,0,0,0,1,1,1,0,0,1,0,2,1,2,0,0,1,0,1,1,1,2,1,2,1,0,0,4,2,1,1,1,2,5,0,1,1,2,0,0,1,1,0,0,2,1,1,0,0,2,0,2,5,2,1,1,0,0,0,2,1,6,1,3,3,4,1,0,0,0,0,3,0,3,1,0,2,1,0,2,0,1,0,0,1,0,0,1,2,3,1,0,0,2,1,1,1,1,2,2,2,1,1,2,0,0,1,1,0,0,1,0,1,1,0,2,0,1,1,1,3,1,2,1,1,0,0,0,1,1,0,1,0,2,2,0,0,4,0,0,3,0,1,0,2,0,0,0,0,0,1,0,1,4,2,2,2,0,0,1,1,5,0,2,1,0,0,0,1,2,1,3,0,0,2,1,1,0,0,1,2,0,1,1,2,1,3,1,0,0,0,0,1,3,1,2,0,1,1,1,1,2,1,0,2,0,0,1,0,2,0,0,0,1,3,2,1,0,2,2,0,0,2,0,3,1,0,1,3,1,2,0,1,1,1,1,1,0,1,1,0,0,0,0,0,2,0,0,1,0,0,2,1,0,1,1,1,2,0,0,0,1,1,1,0,2,2,0,0,0,0,4,1,0,0,2,4,0,1,2,4,1,1,0,0,3,0,2,1,0,0,1,1,1,3,1,0,0,2,3,1,2,0,2,1,2,0,0,0,1,2,0,0,0,2,0,0,1,1,1,2,0,3,1,0,0,0,1,1,0,2,0,1,1,1,1,2,1,0,3,1,2,0,3,0,0,1,0,1,0,3,1,0,0,0,1,0,1,1,3,0,0,1,0,0,0,0,2,0,2,1,1,1,1,1,1,1,2,1,1,1,0,2,2,2,3,0,0,0,3,0,0,0,2,0,0,0,2,0,2,1,0,0,1,1,0,3,1,0,0,0,1,2,0,0,0,1,0,1,1,1,0,0,0,1,0,1,1,0,4,0,2,1,1,0,0,0,0,1,2,2,0,0,0,2,1,1,1,4,1,1,2,2,2,1,0,2,0,2,0,0,1,0,2,2,0,0,1,1,0,1,0,0,2,1,1,0,1,1,0,0,1,0,1,1,2,1,2,2,0,2,0,0,1,0,0,1,0,0,2,1,0,0,1,3,1,1,1,1,1,4,0,0,0,0,0,5,0,1,1,0,1,0,0,2,3,3,1,2,0,0,1,1,1,0,1,0,0,2,1,2,0,0,0,0,2,0,1,0,1]},{"counters":[1,0,1,1,2,0,0,1,2,3,2,0,3,0,2,1,1,2,0,0,1,1,2,0,0,1,1,1,1,0,0,2,3,0,2,0,1,0,0,0,0,0,1,1,2,1,0,4,2,2,2,0,0,1,0,0,1,1,1,0,0,2,2,1,1,0,1,3,1,0,1,1,1,0,1,2,1,0,3,0,1,1,1,2,0,0,0,4,1,2,1,1,2,2,1,5,2,1,1,1,0,1,1,1,1,0,1,1,0,1,0,2,2,0,0,1,2,1,0,1,1,0,3,0,1,0,1,0,1,0,0,2,0,1,0,0,1,1,1,3,0,0,0,0,2,2,0,2,2,0,3,1,0,0,2,2,0,0,0,1,1,0,0,2,1,1,2,0,1,4,0,3,0,1,2,0,0,2,0,0,0,1,1,0,2,2,1,0,1,1,1,0,1,3,1,2,1,1,1,1,2,1,1,1,1,3,1,3,0,3,0,1,1,1,0,1,2,2,1,0,0,2,0,0,1,2,1,2,0,0,3,1,1,1,1,1,0,2,1,0,0,0,1,2,1,1,1,0,0,1,1,0,1,1,1,2,1,1,0,1,1,1,1,0,2,1,1,2,0,0,1,1,0,0,3,1,1,1,2,1,0,1,2,3,1,1,1,1,1,0,2,0,1,0,2,2,0,0,3,2,1,0,0,1,2,1,1,0,0,0,1,0,0,1,1,0,2,0,2,2,1,1,2,1,0,1,0,0,0,1,0,1,0,2,0,0,1,0,1,2,0,0,1,1,1,0,2,0,1,1,1,0,2,0,1,4,0,2,1,0,2,4,2,1,2,0,0,1,3,1,4,1,1,0,1,3,0,0,0,1,2,2,0,1,2,0,0,2,1,3,2,0,2,1,3,0,2,1,0,2,0,0,0,0,0,1,0,2,0,0,1,2,0,2,0,0,2,0,0,1,1,1,1,2,1,1,3,0,2,0,0,1,1,0,0,2,1,1,1,1,0,0,1,2,2,0,1,0,2,1,1,1,2,0,3,1,0,2,1,1,3,3,0,1,0,2,0,1,0,0,2,4,0,0,0,0,1,1,1,1,0,0,0,1,2,1,1,2,0,0,0,4,1,0,1,0,2,0,1,0,2,0,1,0,0,1,3,2,3,2,0,0,1,0,3,1,1,0,1,1,1,0,3,1,0,1,2,1,3,0,1,0,0,1,2,1,0,1,0,1,4,2,1,0,2,1,2,0,3,1,1,0,2,0,0,2,0,3,2,2,1,0,4,1,0,0,2,0,0,0,1,2,0,0,1,2,0,1,3,0,1,0,0,2,2,1,0,0,0,0,2,3,0,2,0,1,0,1,0,0,1,1,3,3,1,3,0,0,1,1,1,0,0,1,1,0,1,0,1,1,0,0,0,0,0,3,1,1,0,1,0,1,1,1,6,1,0,0,0,1,1,1,0,1,3,1,2,3,0,4,1,0,2,0,0,1,0,1,1,1,2,1,0,1,1,1,1,1,2,0,1,0,0,0,1,1,1,1,1,0,1,0,1,1,3,1,1,0,1,0,0,1,0,0,1,1,2,1,1,0,3,0,1,1,1,2,0,0,3,0,2,0,0,1,0,1,2,0,1,1,2,0,2,1,1,1,1,1,0,0,0,0,1,1,1,4,1,1,0,1,2,2,0,1,1,0,1,1,0,2,0,0,0,1,2,0,0,1,1,0,0,3,1,0,1,0,0,0,1,1,1,1,1,3,0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,0,3,0,1,1,1,1,3,2,2,2,4,0,0,1,1,1,0,2,0,2,4,1,1,0,1,1,2,1,1,0,2,1,0,0,2,1,0,0,2,3,0,0,0,2,0,1,0,2,0,0,3,3,3,0,1,4,2,0,1,1,1,2,0,0,0,0,2,0,1,0,2,0,1,0,0,1,0,0,1,0,2,3,0,1,3,1,2,2,1,1,4,1,0,1,0,0,3,2,2,1,1,1,2,0,1,0,0,0,1,0,1,2,0,2,1,2,1,0,0,0,1,0,2,1,0,1,2,2,3,2,1,1,1,1,2,0,0,0,1,2,2,1,1,1,2,1,0,0,1,1,4,3,0,1,0,1,1,3,0,0,0,2,1,1,2,1,1,2,2,1,0,1,3,1,2,0,0,1,0,0,0,2,0,0,0,0,2,1,1,0,1,0,1,1,0,2,1,1,0,1,2,2,0,1,2,1,0,0,1,1,3,0,1,0,0,0,1,1,0,2,2,0,1,0,1,0,1,1,2,0,3,4,3,1,1,0,1,1,1,0,1,1,1,0,3,0,0,1,2,1,1,1,4,3,1,4,2,1,1,1,1,1,0,2,2,1,0,0,2,0,1,0,3,0,0,0,1,2,0,1,2,1,1,0,2,1,1,2,2,1,0,2,1,0,0,0,1,1,0,0,1,0,2,1,0,1,1,1,0,0,2,4,2,0,0,1,1,0,0,1,0,1,0,0,2,0,1,0,0,1,0,0,1,1,0,1,3,1,3,3,2,0,1,2,0,3,0,0,0,0,2,1,2,1,2,1,2,0,4,3,2,0,1,0,0,1,0,0,0,1,1,1,1,1,3,0,3,0,1,0,0,1,0,0,0,4,2,0,0,1,1,1,0,0,1,0,0,0,0,0,0,1,0,2,2,0,2,1,1,0,0,0,1,0,1,3,1,1,2,1,2,1,1,3,1,0,0,1,2,0,1,1,0,2,1,0,4,1,4,2,0,0,1,2,2,1,0,2,3,2,0,0,1,1,1,0,0,0,2,1,1,0,0,0,1,0,4,1,0,1,1,0,1,1,4,1,2,0,0,1,2,0,0,1,3,0,2,1,0,2,2,0,3,0,2,1,2,0,2,1,2,1,0,0,0,2,0,1,2,2,2,0,0,0,0,0,1,0,0,0,0,1,0,4,1,0,0,1,2,0,0,1,1,0,0,3,0,4,1,0,0,2,0,4,1,0,2,3,0,2,1,0,0,4,1,0,2,1,1,0,1,1,1,0,2,0,0,1,0,0,1,0,2,2,0,0,0,2,0,0,0,1,1,0,2,1,0,1,0,1,0,1,1,2,2,2,1,1,0,0,4,1,0,1,0,1,0,1,1,1,1,1,2,0,0,0,2,2,1,0,0,0,0,1,2,0,2,3,1,2,0,1,1,1,1,0,0,1,2,0,3,2,0,3,2,2,0,2,0,2,2,4,0,1,0,0,0,1,1,2,0,1,1,2,0,2,1,0,1,3,0,4,1,2,3,0,1,1,0,1,0,0,1,1,0,0,2,1,1,2,3,0,0,0,0,1,1,1,1,1,1,2,1,2,2,1,3,0,0,0,0,0,0,1,3,2,0,1,1,3,1,1,1,1,0,3,0,0,0,2,1,1,6,1,0,1,2,2,1,1,0,1,1,1,1,4,1,2,1,0,1,1,1,1,4,2,0,2,0,0,1,0,0,2,2,1,0,1,1,0,1,1,1,0,2,0,1,0,0,1,0,2,2,1,0,1,0,0,0,0,0,2,1,1,2,1,0,0,0,0,2,1,1,4,1,2,0,1,1,1,1,0,0,0,2,0,0,2,3,0,4,3,3,0,0,1,2,0,2,2,1,1,0,2,0,1,1,0,1,2,0,1,1,3,2,0,1,2,1,1,2,0,0,2,0,1,1,2,2,0,0,1,1,0,3,1,3,1,0,4,0,0,3,0,1,0,1,1,0,0,1,0,1,0,0,0,1,1,2,1,0,1,1,0,0,3,0,0,2,0,1,0,2,1,0,2,0,1,2,2,0,0,0,1,2,0,0,1,2,1,1,1,1,2,1,0,1,0,0,2,1,1,0,0,1,0,1,0,1,0,0,0,1,4,0,1,0,1,0,0,0,1,0,0,3,2,0,1,0,0,1,0,3,0,0,0,0,3,1,0,1,1,0,0,0,1,0,0,1,0,1,1,0,1,0,0,1,2,0,1,2,2,0,0,2,1,1,1,2,2,1,0,0,1,1,1,1,2,2,1,3,0,2,2,1,1,1,1,1,2,1,1,2,1,0,0,1,0,1,0,2,2,1,0,1,0,2,2,1,2,1,0,1,0,3,1,1,0,0,0,1,1,3,1,0,0,1,2,0,2,1,1,0,1,1,2,2,1,1,2,1,1,0,1,1,2,0,1,0,0,7,0,0,1,1,1,1,2,0,0,3,1,1,0,2,1,0,3,1,0,0,1,1,1,1,0,1,1,1,1,0,3,1,1,1,1,1,2,2,0,0,1,1,1,2,2,3,0,0,0,2,1,0,1,1,0,0,1,0,1,1,0,0,0,0,2,1,0,0,1,1,2,0,0,0,1,2,0,1,1,1,2,3,1,1,2,2,0,1,2,1,1,0,0,3,4,3,1,4,0,1,2,0,0,0,1,0,1,1,1,1,1,0,2,1,0,1,1,4,1,1,0,0,0,2,0,2,1,4,2,0,1,1,2,0,0,2,1,1,0,0,1,0,1,2,1,2,0,2,1,1,2,0,0,4,0,2,1,1,0,2,0,0,0,1,0,0,1,0,1,2,1,1,0,0,0,3,2]}]},"null_count":0,"last_update_version":397952028916580352},"id":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"Nw==","repeats":1},{"count":16,"lower_bound":"OA==","upper_bound":"MTU=","repeats":1},{"count":24,"lower_bound":"MTY=","upper_bound":"MjM=","repeats":1},{"count":32,"lower_bound":"MjQ=","upper_bound":"MzE=","repeats":1},{"count":40,"lower_bound":"MzI=","upper_bound":"Mzk=","repeats":1},{"count":48,"lower_bound":"NDA=","upper_bound":"NDc=","repeats":1},{"count":56,"lower_bound":"NDg=","upper_bound":"NTU=","repeats":1},{"count":64,"lower_bound":"NTY=","upper_bound":"NjM=","repeats":1},{"count":72,"lower_bound":"NjQ=","upper_bound":"NzE=","repeats":1},{"count":80,"lower_bound":"NzI=","upper_bound":"Nzk=","repeats":1},{"count":88,"lower_bound":"ODA=","upper_bound":"ODc=","repeats":1},{"count":96,"lower_bound":"ODg=","upper_bound":"OTU=","repeats":1},{"count":104,"lower_bound":"OTY=","upper_bound":"MTAz","repeats":1},{"count":112,"lower_bound":"MTA0","upper_bound":"MTEx","repeats":1},{"count":120,"lower_bound":"MTEy","upper_bound":"MTE5","repeats":1},{"count":128,"lower_bound":"MTIw","upper_bound":"MTI3","repeats":1},{"count":136,"lower_bound":"MTI4","upper_bound":"MTM1","repeats":1},{"count":144,"lower_bound":"MTM2","upper_bound":"MTQz","repeats":1},{"count":152,"lower_bound":"MTQ0","upper_bound":"MTUx","repeats":1},{"count":160,"lower_bound":"MTUy","upper_bound":"MTU5","repeats":1},{"count":168,"lower_bound":"MTYw","upper_bound":"MTY3","repeats":1},{"count":176,"lower_bound":"MTY4","upper_bound":"MTc1","repeats":1},{"count":184,"lower_bound":"MTc2","upper_bound":"MTgz","repeats":1},{"count":192,"lower_bound":"MTg0","upper_bound":"MTkx","repeats":1},{"count":200,"lower_bound":"MTky","upper_bound":"MTk5","repeats":1},{"count":208,"lower_bound":"MjAw","upper_bound":"MjA3","repeats":1},{"count":216,"lower_bound":"MjA4","upper_bound":"MjE1","repeats":1},{"count":224,"lower_bound":"MjE2","upper_bound":"MjIz","repeats":1},{"count":232,"lower_bound":"MjI0","upper_bound":"MjMx","repeats":1},{"count":240,"lower_bound":"MjMy","upper_bound":"MjM5","repeats":1},{"count":248,"lower_bound":"MjQw","upper_bound":"MjQ3","repeats":1},{"count":256,"lower_bound":"MjQ4","upper_bound":"MjU1","repeats":1},{"count":264,"lower_bound":"MjU2","upper_bound":"MjYz","repeats":1},{"count":272,"lower_bound":"MjY0","upper_bound":"Mjcx","repeats":1},{"count":280,"lower_bound":"Mjcy","upper_bound":"Mjc5","repeats":1},{"count":288,"lower_bound":"Mjgw","upper_bound":"Mjg3","repeats":1},{"count":296,"lower_bound":"Mjg4","upper_bound":"Mjk1","repeats":1},{"count":304,"lower_bound":"Mjk2","upper_bound":"MzAz","repeats":1},{"count":312,"lower_bound":"MzA0","upper_bound":"MzEx","repeats":1},{"count":320,"lower_bound":"MzEy","upper_bound":"MzE5","repeats":1},{"count":328,"lower_bound":"MzIw","upper_bound":"MzI3","repeats":1},{"count":336,"lower_bound":"MzI4","upper_bound":"MzM1","repeats":1},{"count":344,"lower_bound":"MzM2","upper_bound":"MzQz","repeats":1},{"count":352,"lower_bound":"MzQ0","upper_bound":"MzUx","repeats":1},{"count":360,"lower_bound":"MzUy","upper_bound":"MzU5","repeats":1},{"count":368,"lower_bound":"MzYw","upper_bound":"MzY3","repeats":1},{"count":376,"lower_bound":"MzY4","upper_bound":"Mzc1","repeats":1},{"count":384,"lower_bound":"Mzc2","upper_bound":"Mzgz","repeats":1},{"count":392,"lower_bound":"Mzg0","upper_bound":"Mzkx","repeats":1},{"count":400,"lower_bound":"Mzky","upper_bound":"Mzk5","repeats":1},{"count":408,"lower_bound":"NDAw","upper_bound":"NDA3","repeats":1},{"count":416,"lower_bound":"NDA4","upper_bound":"NDE1","repeats":1},{"count":424,"lower_bound":"NDE2","upper_bound":"NDIz","repeats":1},{"count":432,"lower_bound":"NDI0","upper_bound":"NDMx","repeats":1},{"count":440,"lower_bound":"NDMy","upper_bound":"NDM5","repeats":1},{"count":448,"lower_bound":"NDQw","upper_bound":"NDQ3","repeats":1},{"count":456,"lower_bound":"NDQ4","upper_bound":"NDU1","repeats":1},{"count":464,"lower_bound":"NDU2","upper_bound":"NDYz","repeats":1},{"count":472,"lower_bound":"NDY0","upper_bound":"NDcx","repeats":1},{"count":480,"lower_bound":"NDcy","upper_bound":"NDc5","repeats":1},{"count":488,"lower_bound":"NDgw","upper_bound":"NDg3","repeats":1},{"count":496,"lower_bound":"NDg4","upper_bound":"NDk1","repeats":1},{"count":504,"lower_bound":"NDk2","upper_bound":"NTAz","repeats":1},{"count":512,"lower_bound":"NTA0","upper_bound":"NTEx","repeats":1},{"count":520,"lower_bound":"NTEy","upper_bound":"NTE5","repeats":1},{"count":528,"lower_bound":"NTIw","upper_bound":"NTI3","repeats":1},{"count":536,"lower_bound":"NTI4","upper_bound":"NTM1","repeats":1},{"count":544,"lower_bound":"NTM2","upper_bound":"NTQz","repeats":1},{"count":552,"lower_bound":"NTQ0","upper_bound":"NTUx","repeats":1},{"count":560,"lower_bound":"NTUy","upper_bound":"NTU5","repeats":1},{"count":568,"lower_bound":"NTYw","upper_bound":"NTY3","repeats":1},{"count":576,"lower_bound":"NTY4","upper_bound":"NTc1","repeats":1},{"count":584,"lower_bound":"NTc2","upper_bound":"NTgz","repeats":1},{"count":592,"lower_bound":"NTg0","upper_bound":"NTkx","repeats":1},{"count":600,"lower_bound":"NTky","upper_bound":"NTk5","repeats":1},{"count":608,"lower_bound":"NjAw","upper_bound":"NjA3","repeats":1},{"count":616,"lower_bound":"NjA4","upper_bound":"NjE1","repeats":1},{"count":624,"lower_bound":"NjE2","upper_bound":"NjIz","repeats":1},{"count":632,"lower_bound":"NjI0","upper_bound":"NjMx","repeats":1},{"count":640,"lower_bound":"NjMy","upper_bound":"NjM5","repeats":1},{"count":648,"lower_bound":"NjQw","upper_bound":"NjQ3","repeats":1},{"count":656,"lower_bound":"NjQ4","upper_bound":"NjU1","repeats":1},{"count":664,"lower_bound":"NjU2","upper_bound":"NjYz","repeats":1},{"count":672,"lower_bound":"NjY0","upper_bound":"Njcx","repeats":1},{"count":680,"lower_bound":"Njcy","upper_bound":"Njc5","repeats":1},{"count":688,"lower_bound":"Njgw","upper_bound":"Njg3","repeats":1},{"count":696,"lower_bound":"Njg4","upper_bound":"Njk1","repeats":1},{"count":704,"lower_bound":"Njk2","upper_bound":"NzAz","repeats":1},{"count":712,"lower_bound":"NzA0","upper_bound":"NzEx","repeats":1},{"count":720,"lower_bound":"NzEy","upper_bound":"NzE5","repeats":1},{"count":728,"lower_bound":"NzIw","upper_bound":"NzI3","repeats":1},{"count":736,"lower_bound":"NzI4","upper_bound":"NzM1","repeats":1},{"count":744,"lower_bound":"NzM2","upper_bound":"NzQz","repeats":1},{"count":752,"lower_bound":"NzQ0","upper_bound":"NzUx","repeats":1},{"count":760,"lower_bound":"NzUy","upper_bound":"NzU5","repeats":1},{"count":768,"lower_bound":"NzYw","upper_bound":"NzY3","repeats":1},{"count":776,"lower_bound":"NzY4","upper_bound":"Nzc1","repeats":1},{"count":784,"lower_bound":"Nzc2","upper_bound":"Nzgz","repeats":1},{"count":792,"lower_bound":"Nzg0","upper_bound":"Nzkx","repeats":1},{"count":800,"lower_bound":"Nzky","upper_bound":"Nzk5","repeats":1},{"count":808,"lower_bound":"ODAw","upper_bound":"ODA3","repeats":1},{"count":816,"lower_bound":"ODA4","upper_bound":"ODE1","repeats":1},{"count":824,"lower_bound":"ODE2","upper_bound":"ODIz","repeats":1},{"count":832,"lower_bound":"ODI0","upper_bound":"ODMx","repeats":1},{"count":840,"lower_bound":"ODMy","upper_bound":"ODM5","repeats":1},{"count":848,"lower_bound":"ODQw","upper_bound":"ODQ3","repeats":1},{"count":856,"lower_bound":"ODQ4","upper_bound":"ODU1","repeats":1},{"count":864,"lower_bound":"ODU2","upper_bound":"ODYz","repeats":1},{"count":872,"lower_bound":"ODY0","upper_bound":"ODcx","repeats":1},{"count":880,"lower_bound":"ODcy","upper_bound":"ODc5","repeats":1},{"count":888,"lower_bound":"ODgw","upper_bound":"ODg3","repeats":1},{"count":896,"lower_bound":"ODg4","upper_bound":"ODk1","repeats":1},{"count":904,"lower_bound":"ODk2","upper_bound":"OTAz","repeats":1},{"count":912,"lower_bound":"OTA0","upper_bound":"OTEx","repeats":1},{"count":920,"lower_bound":"OTEy","upper_bound":"OTE5","repeats":1},{"count":928,"lower_bound":"OTIw","upper_bound":"OTI3","repeats":1},{"count":936,"lower_bound":"OTI4","upper_bound":"OTM1","repeats":1},{"count":944,"lower_bound":"OTM2","upper_bound":"OTQz","repeats":1},{"count":952,"lower_bound":"OTQ0","upper_bound":"OTUx","repeats":1},{"count":960,"lower_bound":"OTUy","upper_bound":"OTU5","repeats":1},{"count":968,"lower_bound":"OTYw","upper_bound":"OTY3","repeats":1},{"count":976,"lower_bound":"OTY4","upper_bound":"OTc1","repeats":1},{"count":984,"lower_bound":"OTc2","upper_bound":"OTgz","repeats":1},{"count":992,"lower_bound":"OTg0","upper_bound":"OTkx","repeats":1},{"count":1000,"lower_bound":"OTky","upper_bound":"OTk5","repeats":1},{"count":1008,"lower_bound":"MTAwMA==","upper_bound":"MTAwNw==","repeats":1},{"count":1016,"lower_bound":"MTAwOA==","upper_bound":"MTAxNQ==","repeats":1},{"count":1024,"lower_bound":"MTAxNg==","upper_bound":"MTAyMw==","repeats":1},{"count":1032,"lower_bound":"MTAyNA==","upper_bound":"MTAzMQ==","repeats":1},{"count":1040,"lower_bound":"MTAzMg==","upper_bound":"MTAzOQ==","repeats":1},{"count":1048,"lower_bound":"MTA0MA==","upper_bound":"MTA0Nw==","repeats":1},{"count":1056,"lower_bound":"MTA0OA==","upper_bound":"MTA1NQ==","repeats":1},{"count":1064,"lower_bound":"MTA1Ng==","upper_bound":"MTA2Mw==","repeats":1},{"count":1072,"lower_bound":"MTA2NA==","upper_bound":"MTA3MQ==","repeats":1},{"count":1080,"lower_bound":"MTA3Mg==","upper_bound":"MTA3OQ==","repeats":1},{"count":1088,"lower_bound":"MTA4MA==","upper_bound":"MTA4Nw==","repeats":1},{"count":1096,"lower_bound":"MTA4OA==","upper_bound":"MTA5NQ==","repeats":1},{"count":1104,"lower_bound":"MTA5Ng==","upper_bound":"MTEwMw==","repeats":1},{"count":1112,"lower_bound":"MTEwNA==","upper_bound":"MTExMQ==","repeats":1},{"count":1120,"lower_bound":"MTExMg==","upper_bound":"MTExOQ==","repeats":1},{"count":1128,"lower_bound":"MTEyMA==","upper_bound":"MTEyNw==","repeats":1},{"count":1136,"lower_bound":"MTEyOA==","upper_bound":"MTEzNQ==","repeats":1},{"count":1144,"lower_bound":"MTEzNg==","upper_bound":"MTE0Mw==","repeats":1},{"count":1152,"lower_bound":"MTE0NA==","upper_bound":"MTE1MQ==","repeats":1},{"count":1160,"lower_bound":"MTE1Mg==","upper_bound":"MTE1OQ==","repeats":1},{"count":1168,"lower_bound":"MTE2MA==","upper_bound":"MTE2Nw==","repeats":1},{"count":1176,"lower_bound":"MTE2OA==","upper_bound":"MTE3NQ==","repeats":1},{"count":1184,"lower_bound":"MTE3Ng==","upper_bound":"MTE4Mw==","repeats":1},{"count":1192,"lower_bound":"MTE4NA==","upper_bound":"MTE5MQ==","repeats":1},{"count":1200,"lower_bound":"MTE5Mg==","upper_bound":"MTE5OQ==","repeats":1},{"count":1208,"lower_bound":"MTIwMA==","upper_bound":"MTIwNw==","repeats":1},{"count":1216,"lower_bound":"MTIwOA==","upper_bound":"MTIxNQ==","repeats":1},{"count":1224,"lower_bound":"MTIxNg==","upper_bound":"MTIyMw==","repeats":1},{"count":1232,"lower_bound":"MTIyNA==","upper_bound":"MTIzMQ==","repeats":1},{"count":1240,"lower_bound":"MTIzMg==","upper_bound":"MTIzOQ==","repeats":1},{"count":1248,"lower_bound":"MTI0MA==","upper_bound":"MTI0Nw==","repeats":1},{"count":1256,"lower_bound":"MTI0OA==","upper_bound":"MTI1NQ==","repeats":1},{"count":1264,"lower_bound":"MTI1Ng==","upper_bound":"MTI2Mw==","repeats":1},{"count":1272,"lower_bound":"MTI2NA==","upper_bound":"MTI3MQ==","repeats":1},{"count":1280,"lower_bound":"MTI3Mg==","upper_bound":"MTI3OQ==","repeats":1},{"count":1288,"lower_bound":"MTI4MA==","upper_bound":"MTI4Nw==","repeats":1},{"count":1296,"lower_bound":"MTI4OA==","upper_bound":"MTI5NQ==","repeats":1},{"count":1304,"lower_bound":"MTI5Ng==","upper_bound":"MTMwMw==","repeats":1},{"count":1312,"lower_bound":"MTMwNA==","upper_bound":"MTMxMQ==","repeats":1},{"count":1320,"lower_bound":"MTMxMg==","upper_bound":"MTMxOQ==","repeats":1},{"count":1328,"lower_bound":"MTMyMA==","upper_bound":"MTMyNw==","repeats":1},{"count":1336,"lower_bound":"MTMyOA==","upper_bound":"MTMzNQ==","repeats":1},{"count":1344,"lower_bound":"MTMzNg==","upper_bound":"MTM0Mw==","repeats":1},{"count":1352,"lower_bound":"MTM0NA==","upper_bound":"MTM1MQ==","repeats":1},{"count":1360,"lower_bound":"MTM1Mg==","upper_bound":"MTM1OQ==","repeats":1},{"count":1368,"lower_bound":"MTM2MA==","upper_bound":"MTM2Nw==","repeats":1},{"count":1376,"lower_bound":"MTM2OA==","upper_bound":"MTM3NQ==","repeats":1},{"count":1384,"lower_bound":"MTM3Ng==","upper_bound":"MTM4Mw==","repeats":1},{"count":1392,"lower_bound":"MTM4NA==","upper_bound":"MTM5MQ==","repeats":1},{"count":1400,"lower_bound":"MTM5Mg==","upper_bound":"MTM5OQ==","repeats":1},{"count":1408,"lower_bound":"MTQwMA==","upper_bound":"MTQwNw==","repeats":1},{"count":1416,"lower_bound":"MTQwOA==","upper_bound":"MTQxNQ==","repeats":1},{"count":1424,"lower_bound":"MTQxNg==","upper_bound":"MTQyMw==","repeats":1},{"count":1432,"lower_bound":"MTQyNA==","upper_bound":"MTQzMQ==","repeats":1},{"count":1440,"lower_bound":"MTQzMg==","upper_bound":"MTQzOQ==","repeats":1},{"count":1448,"lower_bound":"MTQ0MA==","upper_bound":"MTQ0Nw==","repeats":1},{"count":1456,"lower_bound":"MTQ0OA==","upper_bound":"MTQ1NQ==","repeats":1},{"count":1464,"lower_bound":"MTQ1Ng==","upper_bound":"MTQ2Mw==","repeats":1},{"count":1472,"lower_bound":"MTQ2NA==","upper_bound":"MTQ3MQ==","repeats":1},{"count":1480,"lower_bound":"MTQ3Mg==","upper_bound":"MTQ3OQ==","repeats":1},{"count":1488,"lower_bound":"MTQ4MA==","upper_bound":"MTQ4Nw==","repeats":1},{"count":1496,"lower_bound":"MTQ4OA==","upper_bound":"MTQ5NQ==","repeats":1},{"count":1504,"lower_bound":"MTQ5Ng==","upper_bound":"MTUwMw==","repeats":1},{"count":1512,"lower_bound":"MTUwNA==","upper_bound":"MTUxMQ==","repeats":1},{"count":1520,"lower_bound":"MTUxMg==","upper_bound":"MTUxOQ==","repeats":1},{"count":1528,"lower_bound":"MTUyMA==","upper_bound":"MTUyNw==","repeats":1},{"count":1536,"lower_bound":"MTUyOA==","upper_bound":"MTUzNQ==","repeats":1},{"count":1544,"lower_bound":"MTUzNg==","upper_bound":"MTU0Mw==","repeats":1},{"count":1552,"lower_bound":"MTU0NA==","upper_bound":"MTU1MQ==","repeats":1},{"count":1560,"lower_bound":"MTU1Mg==","upper_bound":"MTU1OQ==","repeats":1},{"count":1568,"lower_bound":"MTU2MA==","upper_bound":"MTU2Nw==","repeats":1},{"count":1576,"lower_bound":"MTU2OA==","upper_bound":"MTU3NQ==","repeats":1},{"count":1584,"lower_bound":"MTU3Ng==","upper_bound":"MTU4Mw==","repeats":1},{"count":1592,"lower_bound":"MTU4NA==","upper_bound":"MTU5MQ==","repeats":1},{"count":1600,"lower_bound":"MTU5Mg==","upper_bound":"MTU5OQ==","repeats":1},{"count":1608,"lower_bound":"MTYwMA==","upper_bound":"MTYwNw==","repeats":1},{"count":1616,"lower_bound":"MTYwOA==","upper_bound":"MTYxNQ==","repeats":1},{"count":1624,"lower_bound":"MTYxNg==","upper_bound":"MTYyMw==","repeats":1},{"count":1632,"lower_bound":"MTYyNA==","upper_bound":"MTYzMQ==","repeats":1},{"count":1640,"lower_bound":"MTYzMg==","upper_bound":"MTYzOQ==","repeats":1},{"count":1648,"lower_bound":"MTY0MA==","upper_bound":"MTY0Nw==","repeats":1},{"count":1656,"lower_bound":"MTY0OA==","upper_bound":"MTY1NQ==","repeats":1},{"count":1664,"lower_bound":"MTY1Ng==","upper_bound":"MTY2Mw==","repeats":1},{"count":1672,"lower_bound":"MTY2NA==","upper_bound":"MTY3MQ==","repeats":1},{"count":1680,"lower_bound":"MTY3Mg==","upper_bound":"MTY3OQ==","repeats":1},{"count":1688,"lower_bound":"MTY4MA==","upper_bound":"MTY4Nw==","repeats":1},{"count":1696,"lower_bound":"MTY4OA==","upper_bound":"MTY5NQ==","repeats":1},{"count":1704,"lower_bound":"MTY5Ng==","upper_bound":"MTcwMw==","repeats":1},{"count":1712,"lower_bound":"MTcwNA==","upper_bound":"MTcxMQ==","repeats":1},{"count":1720,"lower_bound":"MTcxMg==","upper_bound":"MTcxOQ==","repeats":1},{"count":1728,"lower_bound":"MTcyMA==","upper_bound":"MTcyNw==","repeats":1},{"count":1736,"lower_bound":"MTcyOA==","upper_bound":"MTczNQ==","repeats":1},{"count":1744,"lower_bound":"MTczNg==","upper_bound":"MTc0Mw==","repeats":1},{"count":1752,"lower_bound":"MTc0NA==","upper_bound":"MTc1MQ==","repeats":1},{"count":1760,"lower_bound":"MTc1Mg==","upper_bound":"MTc1OQ==","repeats":1},{"count":1768,"lower_bound":"MTc2MA==","upper_bound":"MTc2Nw==","repeats":1},{"count":1776,"lower_bound":"MTc2OA==","upper_bound":"MTc3NQ==","repeats":1},{"count":1784,"lower_bound":"MTc3Ng==","upper_bound":"MTc4Mw==","repeats":1},{"count":1792,"lower_bound":"MTc4NA==","upper_bound":"MTc5MQ==","repeats":1},{"count":1800,"lower_bound":"MTc5Mg==","upper_bound":"MTc5OQ==","repeats":1},{"count":1808,"lower_bound":"MTgwMA==","upper_bound":"MTgwNw==","repeats":1},{"count":1816,"lower_bound":"MTgwOA==","upper_bound":"MTgxNQ==","repeats":1},{"count":1824,"lower_bound":"MTgxNg==","upper_bound":"MTgyMw==","repeats":1},{"count":1832,"lower_bound":"MTgyNA==","upper_bound":"MTgzMQ==","repeats":1},{"count":1840,"lower_bound":"MTgzMg==","upper_bound":"MTgzOQ==","repeats":1},{"count":1848,"lower_bound":"MTg0MA==","upper_bound":"MTg0Nw==","repeats":1},{"count":1856,"lower_bound":"MTg0OA==","upper_bound":"MTg1NQ==","repeats":1},{"count":1864,"lower_bound":"MTg1Ng==","upper_bound":"MTg2Mw==","repeats":1},{"count":1872,"lower_bound":"MTg2NA==","upper_bound":"MTg3MQ==","repeats":1},{"count":1880,"lower_bound":"MTg3Mg==","upper_bound":"MTg3OQ==","repeats":1},{"count":1888,"lower_bound":"MTg4MA==","upper_bound":"MTg4Nw==","repeats":1},{"count":1896,"lower_bound":"MTg4OA==","upper_bound":"MTg5NQ==","repeats":1},{"count":1904,"lower_bound":"MTg5Ng==","upper_bound":"MTkwMw==","repeats":1},{"count":1912,"lower_bound":"MTkwNA==","upper_bound":"MTkxMQ==","repeats":1},{"count":1920,"lower_bound":"MTkxMg==","upper_bound":"MTkxOQ==","repeats":1},{"count":1928,"lower_bound":"MTkyMA==","upper_bound":"MTkyNw==","repeats":1},{"count":1936,"lower_bound":"MTkyOA==","upper_bound":"MTkzNQ==","repeats":1},{"count":1944,"lower_bound":"MTkzNg==","upper_bound":"MTk0Mw==","repeats":1},{"count":1952,"lower_bound":"MTk0NA==","upper_bound":"MTk1MQ==","repeats":1},{"count":1960,"lower_bound":"MTk1Mg==","upper_bound":"MTk1OQ==","repeats":1},{"count":1968,"lower_bound":"MTk2MA==","upper_bound":"MTk2Nw==","repeats":1},{"count":1976,"lower_bound":"MTk2OA==","upper_bound":"MTk3NQ==","repeats":1},{"count":1984,"lower_bound":"MTk3Ng==","upper_bound":"MTk4Mw==","repeats":1},{"count":1992,"lower_bound":"MTk4NA==","upper_bound":"MTk5MQ==","repeats":1},{"count":2000,"lower_bound":"MTk5Mg==","upper_bound":"MTk5OQ==","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952028463071232},"insert_date":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MjAxOC0wMS0wMiAwMDo1NDowNg==","upper_bound":"MjAxOC0wMS0wMiAxNDoxNzozOQ==","repeats":1},{"count":16,"lower_bound":"MjAxOC0wMS0wMiAyMzozNTowNA==","upper_bound":"MjAxOC0wMS0wMyAxNTozMDo0MA==","repeats":1},{"count":24,"lower_bound":"MjAxOC0wMS0wMyAxOTo1ODoxNQ==","upper_bound":"MjAxOC0wMS0wNiAxNDozODozNQ==","repeats":1},{"count":32,"lower_bound":"MjAxOC0wMS0wNiAxNjo0Nzo0Ng==","upper_bound":"MjAxOC0wMS0wNyAwNzo1MToyNg==","repeats":1},{"count":40,"lower_bound":"MjAxOC0wMS0wNyAxMjozMzoxNA==","upper_bound":"MjAxOC0wMS0wOCAwNTo1OTozMA==","repeats":1},{"count":48,"lower_bound":"MjAxOC0wMS0wOSAwNTozOTozMA==","upper_bound":"MjAxOC0wMS0wOSAyMjo0Njo1MQ==","repeats":1},{"count":56,"lower_bound":"MjAxOC0wMS0xMCAwOTo1NTozMw==","upper_bound":"MjAxOC0wMS0xMCAyMToxNDo0MQ==","repeats":1},{"count":64,"lower_bound":"MjAxOC0wMS0xMSAwMDo0OTowNQ==","upper_bound":"MjAxOC0wMS0xMSAyMDowOToxMQ==","repeats":1},{"count":72,"lower_bound":"MjAxOC0wMS0xMiAwNDo0Njo1NQ==","upper_bound":"MjAxOC0wMS0xMiAxMzowNjozMQ==","repeats":1},{"count":80,"lower_bound":"MjAxOC0wMS0xMiAyMDoxMDoxMA==","upper_bound":"MjAxOC0wMS0xMyAwOToxODo0NA==","repeats":1},{"count":88,"lower_bound":"MjAxOC0wMS0xMyAxMDoxNDo1Mg==","upper_bound":"MjAxOC0wMS0xNCAxNTo0MTo1Mw==","repeats":1},{"count":96,"lower_bound":"MjAxOC0wMS0xNCAxODozMzo0MQ==","upper_bound":"MjAxOC0wMS0xNSAxMTo1ODoxMg==","repeats":1},{"count":104,"lower_bound":"MjAxOC0wMS0xNyAwNjo1NzozMA==","upper_bound":"MjAxOC0wMS0xOCAwMzo1MDoxNQ==","repeats":1},{"count":112,"lower_bound":"MjAxOC0wMS0xOCAwNjo1MDoyMw==","upper_bound":"MjAxOC0wMS0xOSAwMjo0Nzo0NA==","repeats":1},{"count":120,"lower_bound":"MjAxOC0wMS0xOSAwMzo0ODo0Mw==","upper_bound":"MjAxOC0wMS0yMCAwMjoxNTozMw==","repeats":1},{"count":128,"lower_bound":"MjAxOC0wMS0yMCAwNToxNzoyNg==","upper_bound":"MjAxOC0wMS0yMSAwMjowMzoxMw==","repeats":1},{"count":136,"lower_bound":"MjAxOC0wMS0yMSAwNjoyMDozOA==","upper_bound":"MjAxOC0wMS0yMSAxNDo0MTowNQ==","repeats":1},{"count":144,"lower_bound":"MjAxOC0wMS0yMiAwMjoxMToyNw==","upper_bound":"MjAxOC0wMS0yMyAwOTo0NTowOQ==","repeats":1},{"count":152,"lower_bound":"MjAxOC0wMS0yMyAxMzowMzo0OA==","upper_bound":"MjAxOC0wMS0yMyAyMzo1NjozOA==","repeats":1},{"count":160,"lower_bound":"MjAxOC0wMS0yNCAwMTowMDozMg==","upper_bound":"MjAxOC0wMS0yNCAxOTowMToxNQ==","repeats":1},{"count":168,"lower_bound":"MjAxOC0wMS0yNCAyMjoyMDo1NQ==","upper_bound":"MjAxOC0wMS0yNiAxNzo0MTo0MA==","repeats":1},{"count":176,"lower_bound":"MjAxOC0wMS0yNyAwMjowODozOQ==","upper_bound":"MjAxOC0wMi0wMSAwMjoxODoxMA==","repeats":1},{"count":184,"lower_bound":"MjAxOC0wMi0wMSAwODo1MDoxOQ==","upper_bound":"MjAxOC0wMi0wMSAyMDoxMjo0OQ==","repeats":1},{"count":192,"lower_bound":"MjAxOC0wMi0wMSAyMjo1MToxMw==","upper_bound":"MjAxOC0wMi0wMiAwOTo0Mjo0OQ==","repeats":1},{"count":200,"lower_bound":"MjAxOC0wMi0wMiAxMTo0MzozOA==","upper_bound":"MjAxOC0wMi0wMyAyMzowNTozOA==","repeats":1},{"count":208,"lower_bound":"MjAxOC0wMi0wMyAyMzoyNToxNg==","upper_bound":"MjAxOC0wMi0wNCAxMTo0OTozMA==","repeats":1},{"count":216,"lower_bound":"MjAxOC0wMi0wNCAxODo1MDowNg==","upper_bound":"MjAxOC0wMi0wNCAyMToyNDoyNQ==","repeats":1},{"count":224,"lower_bound":"MjAxOC0wMi0wNCAyMTo0MDoyNQ==","upper_bound":"MjAxOC0wMi0wNiAyMzoxNzo0OQ==","repeats":1},{"count":232,"lower_bound":"MjAxOC0wMi0wNyAwNDo0MjozNA==","upper_bound":"MjAxOC0wMi0wNyAxNzowOToyMA==","repeats":1},{"count":240,"lower_bound":"MjAxOC0wMi0wNyAxOTozODoyNA==","upper_bound":"MjAxOC0wMi0wOSAyMTozMDowNA==","repeats":1},{"count":248,"lower_bound":"MjAxOC0wMi0xMCAwMjozMjoxNQ==","upper_bound":"MjAxOC0wMi0xMCAwOTowOTowOA==","repeats":1},{"count":256,"lower_bound":"MjAxOC0wMi0xMCAxMjoxOTozMw==","upper_bound":"MjAxOC0wMi0xMCAxNzowMzo0OA==","repeats":1},{"count":264,"lower_bound":"MjAxOC0wMi0xMCAxODo0NjowNA==","upper_bound":"MjAxOC0wMi0xMiAyMzowNzozOA==","repeats":1},{"count":272,"lower_bound":"MjAxOC0wMi0xMyAwMzoxNDoyOQ==","upper_bound":"MjAxOC0wMi0xNCAwMzozOTo0Nw==","repeats":1},{"count":280,"lower_bound":"MjAxOC0wMi0xNCAxNzoyMDoyMQ==","upper_bound":"MjAxOC0wMi0xNiAwMDo0Njo1Nw==","repeats":1},{"count":288,"lower_bound":"MjAxOC0wMi0xNiAwNDoxODo0Nw==","upper_bound":"MjAxOC0wMi0xNyAxMTowMzo1MA==","repeats":1},{"count":296,"lower_bound":"MjAxOC0wMi0xNyAxMjoxODozNQ==","upper_bound":"MjAxOC0wMi0xOSAwNjowNTozMw==","repeats":1},{"count":304,"lower_bound":"MjAxOC0wMi0xOSAyMDoyNzoxMA==","upper_bound":"MjAxOC0wMi0yMCAyMDozNzo1NA==","repeats":1},{"count":312,"lower_bound":"MjAxOC0wMi0yMCAyMDo1NTo1Nw==","upper_bound":"MjAxOC0wMi0yMiAwMDowNToxNg==","repeats":1},{"count":320,"lower_bound":"MjAxOC0wMi0yMiAwMDo0Nzo0OA==","upper_bound":"MjAxOC0wMi0yNSAxMDo0MzowMw==","repeats":1},{"count":328,"lower_bound":"MjAxOC0wMi0yNiAwMzozNToxMw==","upper_bound":"MjAxOC0wMi0yNiAxNToxMjo0Ng==","repeats":1},{"count":336,"lower_bound":"MjAxOC0wMi0yNiAyMzo1NjowNw==","upper_bound":"MjAxOC0wMi0yNyAxMzo0ODo0Nw==","repeats":1},{"count":344,"lower_bound":"MjAxOC0wMi0yNyAxODoxODo0MQ==","upper_bound":"MjAxOC0wMi0yOCAwNzoyMDoyOQ==","repeats":1},{"count":352,"lower_bound":"MjAxOC0wMi0yOCAwODoxNjozMA==","upper_bound":"MjAxOC0wMi0yOCAxNTo0MDo1Nw==","repeats":1},{"count":360,"lower_bound":"MjAxOC0wMi0yOCAyMzowOTozMw==","upper_bound":"MjAxOC0wMy0wMiAwNDo1OTozOQ==","repeats":1},{"count":368,"lower_bound":"MjAxOC0wMy0wMiAxODoxMTo1Ng==","upper_bound":"MjAxOC0wMy0wNSAxMzo1NDo0NQ==","repeats":1},{"count":376,"lower_bound":"MjAxOC0wMy0wNiAwMzoyNzoyOA==","upper_bound":"MjAxOC0wMy0wNyAxOToxMDo0NQ==","repeats":1},{"count":384,"lower_bound":"MjAxOC0wMy0wOCAxMTo1OTozMQ==","upper_bound":"MjAxOC0wMy0wOSAxNDozMjowMA==","repeats":1},{"count":392,"lower_bound":"MjAxOC0wMy0xMSAwNDozOTo0Mg==","upper_bound":"MjAxOC0wMy0xMSAwNzoxMDo1Mw==","repeats":1},{"count":400,"lower_bound":"MjAxOC0wMy0xMSAyMDowMToyNw==","upper_bound":"MjAxOC0wMy0xMiAwNDoxOTozOA==","repeats":1},{"count":408,"lower_bound":"MjAxOC0wMy0xMiAwODoyNzozOQ==","upper_bound":"MjAxOC0wMy0xMyAwODo1NTo0NQ==","repeats":1},{"count":416,"lower_bound":"MjAxOC0wMy0xMyAwOTo1MjoxMA==","upper_bound":"MjAxOC0wMy0xNSAxOTowMjozMQ==","repeats":1},{"count":424,"lower_bound":"MjAxOC0wMy0xNSAyMzowNzowMg==","upper_bound":"MjAxOC0wMy0xNiAyMDozMToyOQ==","repeats":1},{"count":432,"lower_bound":"MjAxOC0wMy0xNyAwMDo1NDowOA==","upper_bound":"MjAxOC0wMy0xNyAxOTowMDo0NA==","repeats":1},{"count":440,"lower_bound":"MjAxOC0wMy0xNyAyMzo1Nzo1OA==","upper_bound":"MjAxOC0wMy0xOCAxNDo1ODoyMg==","repeats":1},{"count":448,"lower_bound":"MjAxOC0wMy0xOCAyMjozNDoxNQ==","upper_bound":"MjAxOC0wMy0yMCAxMDozOTozNw==","repeats":1},{"count":456,"lower_bound":"MjAxOC0wMy0yMCAxOTo1NjoyOQ==","upper_bound":"MjAxOC0wMy0yMSAyMjoxMTo0NQ==","repeats":1},{"count":464,"lower_bound":"MjAxOC0wMy0yMiAxMjowMTo0Mg==","upper_bound":"MjAxOC0wMy0yMyAxMzoxMzo1NA==","repeats":1},{"count":472,"lower_bound":"MjAxOC0wMy0yMyAyMTozMTo0Mw==","upper_bound":"MjAxOC0wMy0yNCAxOTo0NjozNQ==","repeats":1},{"count":480,"lower_bound":"MjAxOC0wMy0yNSAwOTozODowMg==","upper_bound":"MjAxOC0wMy0yNiAxMDo1MzoyMw==","repeats":1},{"count":488,"lower_bound":"MjAxOC0wMy0yNiAxMToyMjo1Ng==","upper_bound":"MjAxOC0wMy0yOCAxNjowNjoyMA==","repeats":1},{"count":496,"lower_bound":"MjAxOC0wMy0yOCAxOToxOTo1MA==","upper_bound":"MjAxOC0wMy0yOCAyMTo0MToyOQ==","repeats":1},{"count":504,"lower_bound":"MjAxOC0wNC0wMSAxNzowMTo1MQ==","upper_bound":"MjAxOC0wNC0wMyAwMDoxODo1Mw==","repeats":1},{"count":512,"lower_bound":"MjAxOC0wNC0wMyAwMDo1NTowNQ==","upper_bound":"MjAxOC0wNC0wMyAxNzoyMzoyMA==","repeats":1},{"count":520,"lower_bound":"MjAxOC0wNC0wNCAwMDoyNDowMg==","upper_bound":"MjAxOC0wNC0wNSAwNToyMTozOQ==","repeats":1},{"count":528,"lower_bound":"MjAxOC0wNC0wNSAxMjo0NzowNg==","upper_bound":"MjAxOC0wNC0wNiAxMTowMDowMQ==","repeats":1},{"count":536,"lower_bound":"MjAxOC0wNC0wNiAxMjowNDo1Mw==","upper_bound":"MjAxOC0wNC0wNyAxMToyNDo1NQ==","repeats":1},{"count":544,"lower_bound":"MjAxOC0wNC0wNyAxMzoyMjozNg==","upper_bound":"MjAxOC0wNC0wNyAxOTozODoxMQ==","repeats":1},{"count":552,"lower_bound":"MjAxOC0wNC0wOCAwMzowNzo1Ng==","upper_bound":"MjAxOC0wNC0xMCAyMTowNToxNQ==","repeats":1},{"count":560,"lower_bound":"MjAxOC0wNC0xMCAyMToxNzoxOA==","upper_bound":"MjAxOC0wNC0xMiAyMzozMTo0Mw==","repeats":1},{"count":568,"lower_bound":"MjAxOC0wNC0xMyAwNDowODoyMg==","upper_bound":"MjAxOC0wNC0xMyAxNTowMjoxOA==","repeats":1},{"count":576,"lower_bound":"MjAxOC0wNC0xMyAxNjowMzoyMA==","upper_bound":"MjAxOC0wNC0xNCAxMjowNTo0NA==","repeats":1},{"count":584,"lower_bound":"MjAxOC0wNC0xNCAxMzoyNDozNw==","upper_bound":"MjAxOC0wNC0xNiAxODoxNToxMQ==","repeats":1},{"count":592,"lower_bound":"MjAxOC0wNC0xNyAwNjo1MDozMg==","upper_bound":"MjAxOC0wNC0xOCAwNzo1Nzo1Mg==","repeats":1},{"count":600,"lower_bound":"MjAxOC0wNC0xOSAwNTozMzozNQ==","upper_bound":"MjAxOC0wNC0yMCAwNDozNDo0NA==","repeats":1},{"count":608,"lower_bound":"MjAxOC0wNC0yMCAwNzowMTo1MA==","upper_bound":"MjAxOC0wNC0yMiAxOToxNTowOQ==","repeats":1},{"count":616,"lower_bound":"MjAxOC0wNC0yMyAwMDozMTozNA==","upper_bound":"MjAxOC0wNC0yNCAwODowOTo0Nw==","repeats":1},{"count":624,"lower_bound":"MjAxOC0wNC0yNSAwNjozNTozNg==","upper_bound":"MjAxOC0wNC0yNiAwNToyMTowOQ==","repeats":1},{"count":632,"lower_bound":"MjAxOC0wNC0yNiAwNjo1MjozNg==","upper_bound":"MjAxOC0wNC0yNiAyMDoxNzozMA==","repeats":1},{"count":640,"lower_bound":"MjAxOC0wNC0yNiAyMTozODoxMQ==","upper_bound":"MjAxOC0wNC0yOCAwMDoxOTozMg==","repeats":1},{"count":648,"lower_bound":"MjAxOC0wNC0yOCAwMTo1Njo1NQ==","upper_bound":"MjAxOC0wNS0wMiAxMTozMzoyOQ==","repeats":1},{"count":656,"lower_bound":"MjAxOC0wNS0wMiAxMjozOTowMA==","upper_bound":"MjAxOC0wNS0wNSAwMDoyNzozNg==","repeats":1},{"count":664,"lower_bound":"MjAxOC0wNS0wNSAwODozODozMg==","upper_bound":"MjAxOC0wNS0wNiAwMDo0NjowMg==","repeats":1},{"count":672,"lower_bound":"MjAxOC0wNS0wNiAwMToyNDoyOQ==","upper_bound":"MjAxOC0wNS0wNyAwNToyMjo1MQ==","repeats":1},{"count":680,"lower_bound":"MjAxOC0wNS0wOCAwMjo1MTo0Ng==","upper_bound":"MjAxOC0wNS0wOSAwMDoyOTo0MA==","repeats":1},{"count":688,"lower_bound":"MjAxOC0wNS0wOSAxMjo0OTowMw==","upper_bound":"MjAxOC0wNS0xMCAxMjoyODo0NA==","repeats":1},{"count":696,"lower_bound":"MjAxOC0wNS0xMCAxNjo1OTozMg==","upper_bound":"MjAxOC0wNS0xMiAxODoxNjoxMw==","repeats":1},{"count":704,"lower_bound":"MjAxOC0wNS0xMiAyMTowNToyMw==","upper_bound":"MjAxOC0wNS0xMyAwMTo0ODo0MQ==","repeats":1},{"count":712,"lower_bound":"MjAxOC0wNS0xMyAwNToxNDo1NQ==","upper_bound":"MjAxOC0wNS0xNSAwMTozMzo0Mw==","repeats":1},{"count":720,"lower_bound":"MjAxOC0wNS0xNSAyMDo0MToyMQ==","upper_bound":"MjAxOC0wNS0xNyAwMTo1ODo0NQ==","repeats":1},{"count":728,"lower_bound":"MjAxOC0wNS0xNyAxODowMjoxOQ==","upper_bound":"MjAxOC0wNS0xOCAyMjo1Njo0OA==","repeats":1},{"count":736,"lower_bound":"MjAxOC0wNS0xOSAwMDoyMjoyOQ==","upper_bound":"MjAxOC0wNS0xOSAxODowNDo0OQ==","repeats":1},{"count":744,"lower_bound":"MjAxOC0wNS0xOSAxOTowNjo0NA==","upper_bound":"MjAxOC0wNS0yMCAxNzo1NjozNg==","repeats":1},{"count":752,"lower_bound":"MjAxOC0wNS0yMSAwMDoxMDozNA==","upper_bound":"MjAxOC0wNS0yMSAxNjo0Njo1MQ==","repeats":1},{"count":760,"lower_bound":"MjAxOC0wNS0yMSAyMzoxMzoxMg==","upper_bound":"MjAxOC0wNS0yMiAxNzo1MjoyNg==","repeats":1},{"count":768,"lower_bound":"MjAxOC0wNS0yMiAxOToyMzoyOA==","upper_bound":"MjAxOC0wNS0yMyAwNDoyMzoxNg==","repeats":1},{"count":776,"lower_bound":"MjAxOC0wNS0yMyAxMDoyMjo1Ng==","upper_bound":"MjAxOC0wNS0yNCAwMzowNjowNA==","repeats":1},{"count":784,"lower_bound":"MjAxOC0wNS0yNCAwNDoyMDo1Mw==","upper_bound":"MjAxOC0wNS0yNSAwODoyNjozMg==","repeats":1},{"count":792,"lower_bound":"MjAxOC0wNS0yNSAxNDo0MTo1Mw==","upper_bound":"MjAxOC0wNS0yNiAxNTowMzozMA==","repeats":1},{"count":800,"lower_bound":"MjAxOC0wNS0yNyAwNTowNDoxOQ==","upper_bound":"MjAxOC0wNi0wMSAwMTo0Mjo0OQ==","repeats":1},{"count":808,"lower_bound":"MjAxOC0wNi0wMSAxMzowMjoxMw==","upper_bound":"MjAxOC0wNi0wMSAyMTo1Nzo1Mg==","repeats":1},{"count":816,"lower_bound":"MjAxOC0wNi0wMiAwMzoyNToxOQ==","upper_bound":"MjAxOC0wNi0wMiAxODo1MDozNQ==","repeats":1},{"count":824,"lower_bound":"MjAxOC0wNi0wMyAwNjowNzozNA==","upper_bound":"MjAxOC0wNi0wNCAxMjoyMjo0Ng==","repeats":1},{"count":832,"lower_bound":"MjAxOC0wNi0wNCAxNzowNzo1Nw==","upper_bound":"MjAxOC0wNi0wNyAwMTozMDoxNA==","repeats":1},{"count":840,"lower_bound":"MjAxOC0wNi0wNyAwNTowMzozMQ==","upper_bound":"MjAxOC0wNi0wNyAxMjoyMDoxNQ==","repeats":1},{"count":848,"lower_bound":"MjAxOC0wNi0wOCAwNjowNzozMw==","upper_bound":"MjAxOC0wNi0wOSAxNTozODo0MA==","repeats":1},{"count":856,"lower_bound":"MjAxOC0wNi0xMCAxMjo0MToxMg==","upper_bound":"MjAxOC0wNi0xMSAwNTowOToyNQ==","repeats":1},{"count":864,"lower_bound":"MjAxOC0wNi0xMSAyMjozOToyNQ==","upper_bound":"MjAxOC0wNi0xMiAyMToxOTozMA==","repeats":1},{"count":872,"lower_bound":"MjAxOC0wNi0xMyAwNTo0MDowOQ==","upper_bound":"MjAxOC0wNi0xMyAxODo0MDozOA==","repeats":1},{"count":880,"lower_bound":"MjAxOC0wNi0xMyAyMDo1ODowNw==","upper_bound":"MjAxOC0wNi0xNSAxMTo0MjowNw==","repeats":1},{"count":888,"lower_bound":"MjAxOC0wNi0xNiAxMToxODoyMg==","upper_bound":"MjAxOC0wNi0xNyAxMjoxMToxOA==","repeats":1},{"count":896,"lower_bound":"MjAxOC0wNi0xOCAwNjowNDowMA==","upper_bound":"MjAxOC0wNi0xOSAwMTo1NTowNw==","repeats":1},{"count":904,"lower_bound":"MjAxOC0wNi0xOSAwNDo0NDozMg==","upper_bound":"MjAxOC0wNi0xOSAyMDowNDo1MQ==","repeats":1},{"count":912,"lower_bound":"MjAxOC0wNi0yMCAwMTo1MDowMg==","upper_bound":"MjAxOC0wNi0yMiAwNzowOTowMQ==","repeats":1},{"count":920,"lower_bound":"MjAxOC0wNi0yMiAxMjoyMDowNg==","upper_bound":"MjAxOC0wNi0yMyAxMTozNToxNA==","repeats":1},{"count":928,"lower_bound":"MjAxOC0wNi0yMyAxNDowNTowOQ==","upper_bound":"MjAxOC0wNi0yMyAxOToyOToyNA==","repeats":1},{"count":936,"lower_bound":"MjAxOC0wNi0yNCAwNTowNTo0Nw==","upper_bound":"MjAxOC0wNi0yNSAwMDozNTo0Nw==","repeats":1},{"count":944,"lower_bound":"MjAxOC0wNi0yNSAxMzozMjo1Ng==","upper_bound":"MjAxOC0wNi0yOCAxMzoyOTowNQ==","repeats":1},{"count":952,"lower_bound":"MjAxOC0wNi0yOCAyMjoxMToxOA==","upper_bound":"MjAxOC0wNy0wMSAwOToxNzo1OQ==","repeats":1},{"count":960,"lower_bound":"MjAxOC0wNy0wMSAxMDowNzo1Nw==","upper_bound":"MjAxOC0wNy0wMiAxNDo0NjozNA==","repeats":1},{"count":968,"lower_bound":"MjAxOC0wNy0wMyAxMjo0NTo1OA==","upper_bound":"MjAxOC0wNy0wNCAwNTo0NzoxMw==","repeats":1},{"count":976,"lower_bound":"MjAxOC0wNy0wNCAwNzoyODozMw==","upper_bound":"MjAxOC0wNy0wNSAwMjo0MTo1OA==","repeats":1},{"count":984,"lower_bound":"MjAxOC0wNy0wNSAwMzowMTowNA==","upper_bound":"MjAxOC0wNy0wNiAxODoyOTowMg==","repeats":1},{"count":992,"lower_bound":"MjAxOC0wNy0wNyAxNjoyNzoxNA==","upper_bound":"MjAxOC0wNy0wOSAxMzowNzoyNQ==","repeats":1},{"count":1000,"lower_bound":"MjAxOC0wNy0xMCAwMjoyMDozMQ==","upper_bound":"MjAxOC0wNy0xMiAwMzo0NzoxOA==","repeats":1},{"count":1008,"lower_bound":"MjAxOC0wNy0xMiAxMDoyNjozMg==","upper_bound":"MjAxOC0wNy0xMyAwODo0ODozNg==","repeats":1},{"count":1016,"lower_bound":"MjAxOC0wNy0xMyAxMToyNzoyMQ==","upper_bound":"MjAxOC0wNy0xMyAxODo1Njo0NA==","repeats":1},{"count":1024,"lower_bound":"MjAxOC0wNy0xMyAyMDo1MzoxMg==","upper_bound":"MjAxOC0wNy0xNCAxMDoxODozNQ==","repeats":1},{"count":1032,"lower_bound":"MjAxOC0wNy0xNCAxNjowMDo1Mg==","upper_bound":"MjAxOC0wNy0xNCAyMzoxMjoxNw==","repeats":1},{"count":1040,"lower_bound":"MjAxOC0wNy0xNSAxMDowMzowMQ==","upper_bound":"MjAxOC0wNy0xNiAxNTo1MDo1Mg==","repeats":1},{"count":1048,"lower_bound":"MjAxOC0wNy0xNiAxODoyMzozMQ==","upper_bound":"MjAxOC0wNy0xNyAyMDoxMTozNw==","repeats":1},{"count":1056,"lower_bound":"MjAxOC0wNy0xNyAyMToxOToxMw==","upper_bound":"MjAxOC0wNy0xOCAxMjo1MDozMg==","repeats":1},{"count":1064,"lower_bound":"MjAxOC0wNy0xOCAxNjoyNTo1OQ==","upper_bound":"MjAxOC0wNy0yMCAwMzoxNzozNw==","repeats":1},{"count":1072,"lower_bound":"MjAxOC0wNy0yMCAwNDoxNTowMQ==","upper_bound":"MjAxOC0wNy0yMSAxNjo0Mjo1Mg==","repeats":1},{"count":1080,"lower_bound":"MjAxOC0wNy0yMiAwOToyNToxNg==","upper_bound":"MjAxOC0wNy0yMyAxMToyMjo0NQ==","repeats":1},{"count":1088,"lower_bound":"MjAxOC0wNy0yMyAxMjowMzoxNA==","upper_bound":"MjAxOC0wNy0yNCAwNTo0NDoxNA==","repeats":1},{"count":1096,"lower_bound":"MjAxOC0wNy0yNCAyMTozMjo0OQ==","upper_bound":"MjAxOC0wNy0yNyAwNTowNToyMw==","repeats":1},{"count":1104,"lower_bound":"MjAxOC0wNy0yNyAwNToxNjoyNQ==","upper_bound":"MjAxOC0wNy0yNyAxODoyNjozMQ==","repeats":1},{"count":1112,"lower_bound":"MjAxOC0wNy0yNyAxODo0NjowNw==","upper_bound":"MjAxOC0wNy0yOCAwNzo1MzoxMw==","repeats":1},{"count":1120,"lower_bound":"MjAxOC0wNy0yOCAyMzowNzo1MA==","upper_bound":"MjAxOC0wOC0wMiAwNTowNTo1OA==","repeats":1},{"count":1128,"lower_bound":"MjAxOC0wOC0wMiAwODowMzozNQ==","upper_bound":"MjAxOC0wOC0wMyAwODo1NToyNQ==","repeats":1},{"count":1136,"lower_bound":"MjAxOC0wOC0wMyAxODozODoxMA==","upper_bound":"MjAxOC0wOC0wNSAwOToxMToxNg==","repeats":1},{"count":1144,"lower_bound":"MjAxOC0wOC0wNSAxODowMTowOA==","upper_bound":"MjAxOC0wOC0wNiAwOTowMzo1Mg==","repeats":1},{"count":1152,"lower_bound":"MjAxOC0wOC0wNiAxNDo0NjozOQ==","upper_bound":"MjAxOC0wOC0wNyAwNTowNjo1NQ==","repeats":1},{"count":1160,"lower_bound":"MjAxOC0wOC0wOCAwMDoxNDoxMQ==","upper_bound":"MjAxOC0wOC0xMCAxNDoxNDo1NA==","repeats":1},{"count":1168,"lower_bound":"MjAxOC0wOC0xMSAxMzo0NjozNg==","upper_bound":"MjAxOC0wOC0xMiAwNzo1NjoyNw==","repeats":1},{"count":1176,"lower_bound":"MjAxOC0wOC0xMiAxNjozODoxOA==","upper_bound":"MjAxOC0wOC0xMyAxNzozNjo1OQ==","repeats":1},{"count":1184,"lower_bound":"MjAxOC0wOC0xMyAxODowMzozMA==","upper_bound":"MjAxOC0wOC0xNCAxNDoyMTo0Nw==","repeats":1},{"count":1192,"lower_bound":"MjAxOC0wOC0xNCAxNDozOTowOA==","upper_bound":"MjAxOC0wOC0xNSAxMjozODoxMg==","repeats":1},{"count":1200,"lower_bound":"MjAxOC0wOC0xNiAwNDoxMTo1Mw==","upper_bound":"MjAxOC0wOC0xNyAwMjoxMDo1Mw==","repeats":1},{"count":1208,"lower_bound":"MjAxOC0wOC0xNyAwMjozMzoxMw==","upper_bound":"MjAxOC0wOC0xNyAxNzo1NToxNw==","repeats":1},{"count":1216,"lower_bound":"MjAxOC0wOC0xOSAwNjo1MToyMA==","upper_bound":"MjAxOC0wOC0yMCAwNjo1MDo0OQ==","repeats":1},{"count":1224,"lower_bound":"MjAxOC0wOC0yMCAxOTo0OTowOA==","upper_bound":"MjAxOC0wOC0yMSAwNTozNzowMQ==","repeats":1},{"count":1232,"lower_bound":"MjAxOC0wOC0yMSAwNjoyODoyNA==","upper_bound":"MjAxOC0wOC0yMSAyMjo1NDozOQ==","repeats":1},{"count":1240,"lower_bound":"MjAxOC0wOC0yMSAyMzoxMDoxMg==","upper_bound":"MjAxOC0wOC0yMiAxMjo0NTo0OA==","repeats":1},{"count":1248,"lower_bound":"MjAxOC0wOC0yMiAxMzo1NjowOQ==","upper_bound":"MjAxOC0wOC0yMyAwNjozNToyOA==","repeats":1},{"count":1256,"lower_bound":"MjAxOC0wOC0yMyAyMTo0ODoxNw==","upper_bound":"MjAxOC0wOC0yNCAyMjo1NDo1NQ==","repeats":1},{"count":1264,"lower_bound":"MjAxOC0wOC0yNSAwNDozMjoyOQ==","upper_bound":"MjAxOC0wOC0yNSAwOToxMTo0MQ==","repeats":1},{"count":1272,"lower_bound":"MjAxOC0wOC0yNSAxMDo0Mzo1Nw==","upper_bound":"MjAxOC0wOC0yNSAxNTowMToyOA==","repeats":1},{"count":1280,"lower_bound":"MjAxOC0wOC0yNSAyMzowNDozMw==","upper_bound":"MjAxOC0wOC0yNiAxNjo1ODoyMQ==","repeats":1},{"count":1288,"lower_bound":"MjAxOC0wOC0yNyAwNzo1OTo0Nw==","upper_bound":"MjAxOC0wOC0yOCAxMToxNzoyNw==","repeats":1},{"count":1296,"lower_bound":"MjAxOC0wOC0yOCAxNzo1ODo0OQ==","upper_bound":"MjAxOC0wOS0wMSAxNjozNzowMA==","repeats":1},{"count":1304,"lower_bound":"MjAxOC0wOS0wMSAxNzoxNToyNg==","upper_bound":"MjAxOC0wOS0wMyAxNzoxOToyOQ==","repeats":1},{"count":1312,"lower_bound":"MjAxOC0wOS0wNCAwMjoxOTowNg==","upper_bound":"MjAxOC0wOS0wNyAxNzo0MDowMw==","repeats":1},{"count":1320,"lower_bound":"MjAxOC0wOS0wNyAxODowNTowMw==","upper_bound":"MjAxOC0wOS0wOCAwOToyMDoxMw==","repeats":1},{"count":1328,"lower_bound":"MjAxOC0wOS0wOCAxNDoyNjo0Nw==","upper_bound":"MjAxOC0wOS0wOSAwMjo1NTo0NA==","repeats":1},{"count":1336,"lower_bound":"MjAxOC0wOS0wOSAwOTo0Njo1NQ==","upper_bound":"MjAxOC0wOS0xMCAxMzoyMzozOQ==","repeats":1},{"count":1344,"lower_bound":"MjAxOC0wOS0xMCAyMzoyNDoxNA==","upper_bound":"MjAxOC0wOS0xMiAwMzo1ODowOA==","repeats":1},{"count":1352,"lower_bound":"MjAxOC0wOS0xMiAwNzo0NjoxNw==","upper_bound":"MjAxOC0wOS0xMyAxNToyODozNg==","repeats":1},{"count":1360,"lower_bound":"MjAxOC0wOS0xMyAyMDozMToyNA==","upper_bound":"MjAxOC0wOS0xNCAxNDoyMToxOQ==","repeats":1},{"count":1368,"lower_bound":"MjAxOC0wOS0xNCAyMjo0MToyNw==","upper_bound":"MjAxOC0wOS0xNiAxMjozMTo0MA==","repeats":1},{"count":1376,"lower_bound":"MjAxOC0wOS0xNiAyMTo0MDozMA==","upper_bound":"MjAxOC0wOS0xOCAwNTozMDo1OQ==","repeats":1},{"count":1384,"lower_bound":"MjAxOC0wOS0xOCAwNTo1NDoxOQ==","upper_bound":"MjAxOC0wOS0xOSAxNzoxMDoxNA==","repeats":1},{"count":1392,"lower_bound":"MjAxOC0wOS0xOSAyMzo1NjoyMA==","upper_bound":"MjAxOC0wOS0yMCAyMDoyMTo0Mg==","repeats":1},{"count":1400,"lower_bound":"MjAxOC0wOS0yMSAxMjoyMjowMQ==","upper_bound":"MjAxOC0wOS0yMiAyMzozNTowMw==","repeats":1},{"count":1408,"lower_bound":"MjAxOC0wOS0yMyAxOTo1MDozMw==","upper_bound":"MjAxOC0wOS0yNCAxODowMDo1Ng==","repeats":1},{"count":1416,"lower_bound":"MjAxOC0wOS0yNSAxNToyMToxNw==","upper_bound":"MjAxOC0wOS0yNiAwNjozMzowMA==","repeats":1},{"count":1424,"lower_bound":"MjAxOC0wOS0yNiAxNDo1MToxNg==","upper_bound":"MjAxOC0wOS0yNyAwNzowNzoxNA==","repeats":1},{"count":1432,"lower_bound":"MjAxOC0wOS0yOCAxMjoxMzo1OQ==","upper_bound":"MjAxOC0wOS0yOCAyMToxMzoyNg==","repeats":1},{"count":1440,"lower_bound":"MjAxOC0xMC0wMSAwMTozOTowNA==","upper_bound":"MjAxOC0xMC0wMSAwOTowNTowNw==","repeats":1},{"count":1448,"lower_bound":"MjAxOC0xMC0wMSAxMjoxMzozOQ==","upper_bound":"MjAxOC0xMC0wMiAwNDoxODo1NQ==","repeats":1},{"count":1456,"lower_bound":"MjAxOC0xMC0wMiAxMTo0Mjo0OQ==","upper_bound":"MjAxOC0xMC0wMiAxOTo0MDoyMw==","repeats":1},{"count":1464,"lower_bound":"MjAxOC0xMC0wMyAxNDoyMjo1NA==","upper_bound":"MjAxOC0xMC0wMyAxODo0Nzo1Ng==","repeats":1},{"count":1472,"lower_bound":"MjAxOC0xMC0wNCAwMzo0MDo1OA==","upper_bound":"MjAxOC0xMC0wNSAwODo1Nzo0OA==","repeats":1},{"count":1480,"lower_bound":"MjAxOC0xMC0wNSAwOTo1Mjo1MQ==","upper_bound":"MjAxOC0xMC0wNiAwMzozMjowOQ==","repeats":1},{"count":1488,"lower_bound":"MjAxOC0xMC0wNiAyMzozOTo0NA==","upper_bound":"MjAxOC0xMC0wOCAwNzo1NjoyMg==","repeats":1},{"count":1496,"lower_bound":"MjAxOC0xMC0wOCAxODo1Mjo0MQ==","upper_bound":"MjAxOC0xMC0xMCAwMTowODoxNA==","repeats":1},{"count":1504,"lower_bound":"MjAxOC0xMC0xMCAwODowMjoxNg==","upper_bound":"MjAxOC0xMC0xMCAyMjozNDozNw==","repeats":1},{"count":1512,"lower_bound":"MjAxOC0xMC0xMCAyMzowNTowMw==","upper_bound":"MjAxOC0xMC0xMyAwMDo1NzoyOQ==","repeats":1},{"count":1520,"lower_bound":"MjAxOC0xMC0xMyAxNTozNzo0MA==","upper_bound":"MjAxOC0xMC0xNiAwMjoyOTozNw==","repeats":1},{"count":1528,"lower_bound":"MjAxOC0xMC0xNiAwOToyNjowMA==","upper_bound":"MjAxOC0xMC0xNiAxODo0NzowMQ==","repeats":1},{"count":1536,"lower_bound":"MjAxOC0xMC0xNiAxOToyMToxOQ==","upper_bound":"MjAxOC0xMC0xNyAxMDowOTo1NA==","repeats":1},{"count":1544,"lower_bound":"MjAxOC0xMC0xNyAxMDo1MToxMg==","upper_bound":"MjAxOC0xMC0xOCAwMjozNzo0Nw==","repeats":1},{"count":1552,"lower_bound":"MjAxOC0xMC0xOCAwMzo0ODozOA==","upper_bound":"MjAxOC0xMC0xOSAwMjo0NDozMw==","repeats":1},{"count":1560,"lower_bound":"MjAxOC0xMC0xOSAyMToyNDozNQ==","upper_bound":"MjAxOC0xMC0yMSAwMDoyNzozMA==","repeats":1},{"count":1568,"lower_bound":"MjAxOC0xMC0yMSAwNzo0OTozOQ==","upper_bound":"MjAxOC0xMC0yMSAxODo1MTo1MQ==","repeats":1},{"count":1576,"lower_bound":"MjAxOC0xMC0yMiAxMzo1Mjo0Nw==","upper_bound":"MjAxOC0xMC0yNCAwOTozNTo1NA==","repeats":1},{"count":1584,"lower_bound":"MjAxOC0xMC0yNCAyMTowMjoxMQ==","upper_bound":"MjAxOC0xMC0yNSAyMjoxNjo1OQ==","repeats":1},{"count":1592,"lower_bound":"MjAxOC0xMC0yNSAyMjoxNzozNg==","upper_bound":"MjAxOC0xMC0yNiAwODo0NTo0MQ==","repeats":1},{"count":1600,"lower_bound":"MjAxOC0xMC0yNyAwODo0MTo1Mg==","upper_bound":"MjAxOC0xMC0yNyAyMTo0NTo0Mw==","repeats":1},{"count":1608,"lower_bound":"MjAxOC0xMC0yOCAxMToyMTozOA==","upper_bound":"MjAxOC0xMS0wMSAwNjoxMToyNQ==","repeats":1},{"count":1616,"lower_bound":"MjAxOC0xMS0wMSAxNTo0ODo0Mg==","upper_bound":"MjAxOC0xMS0wMSAyMTo0NjoyMA==","repeats":1},{"count":1624,"lower_bound":"MjAxOC0xMS0wMiAwNDowNDowOA==","upper_bound":"MjAxOC0xMS0wMiAyMDo1MDoxMA==","repeats":1},{"count":1632,"lower_bound":"MjAxOC0xMS0wMiAyMzoxOTozMA==","upper_bound":"MjAxOC0xMS0wNCAwNjozNToxMQ==","repeats":1},{"count":1640,"lower_bound":"MjAxOC0xMS0wNCAxNzowMDoxMg==","upper_bound":"MjAxOC0xMS0wNSAwNDo1MToxNw==","repeats":1},{"count":1648,"lower_bound":"MjAxOC0xMS0wNSAwNToxOTozOA==","upper_bound":"MjAxOC0xMS0wNiAwNTo0NTozMg==","repeats":1},{"count":1656,"lower_bound":"MjAxOC0xMS0wNiAxMDoyNToxNQ==","upper_bound":"MjAxOC0xMS0wNyAwMTo1MjoxOA==","repeats":1},{"count":1664,"lower_bound":"MjAxOC0xMS0wNyAwNTo1Mjo1Nw==","upper_bound":"MjAxOC0xMS0wOCAxOTowMToyMA==","repeats":1},{"count":1672,"lower_bound":"MjAxOC0xMS0wOCAyMzo1NTowMQ==","upper_bound":"MjAxOC0xMS0wOSAxNDoyMDoyMA==","repeats":1},{"count":1680,"lower_bound":"MjAxOC0xMS0wOSAxOTo1Njo1OQ==","upper_bound":"MjAxOC0xMS0xMCAxMzozOTo1MA==","repeats":1},{"count":1688,"lower_bound":"MjAxOC0xMS0xMSAxMDoyNToxMQ==","upper_bound":"MjAxOC0xMS0xMyAwODowMTozNg==","repeats":1},{"count":1696,"lower_bound":"MjAxOC0xMS0xMyAwODo1NToyNQ==","upper_bound":"MjAxOC0xMS0xMyAxNToxMTozMQ==","repeats":1},{"count":1704,"lower_bound":"MjAxOC0xMS0xMyAxNjowNDo0OA==","upper_bound":"MjAxOC0xMS0xNSAwNDoxNzozNA==","repeats":1},{"count":1712,"lower_bound":"MjAxOC0xMS0xNSAxNzozNToxNg==","upper_bound":"MjAxOC0xMS0xNyAwMTozNjozMQ==","repeats":1},{"count":1720,"lower_bound":"MjAxOC0xMS0xNyAwNjoxODozOQ==","upper_bound":"MjAxOC0xMS0xOCAxNjowNTozNQ==","repeats":1},{"count":1728,"lower_bound":"MjAxOC0xMS0xOCAxNjoyNDozMw==","upper_bound":"MjAxOC0xMS0xOSAwMDo1Njo1MQ==","repeats":1},{"count":1736,"lower_bound":"MjAxOC0xMS0xOSAwNzoyOToxMg==","upper_bound":"MjAxOC0xMS0yMCAxNzozMDo1NA==","repeats":1},{"count":1744,"lower_bound":"MjAxOC0xMS0yMCAxODo1NTo1Mg==","upper_bound":"MjAxOC0xMS0yMSAxMDo1Njo1MQ==","repeats":1},{"count":1752,"lower_bound":"MjAxOC0xMS0yMSAxMTo0MjoxMQ==","upper_bound":"MjAxOC0xMS0yMiAwMzoyODo0Mg==","repeats":1},{"count":1760,"lower_bound":"MjAxOC0xMS0yMiAwNzowOToyMQ==","upper_bound":"MjAxOC0xMS0yMyAxNDozMDozOQ==","repeats":1},{"count":1768,"lower_bound":"MjAxOC0xMS0yMyAxNjo0MDoyMQ==","upper_bound":"MjAxOC0xMS0yNSAyMDowNDoyMw==","repeats":1},{"count":1776,"lower_bound":"MjAxOC0xMS0yNSAyMTowNjowNw==","upper_bound":"MjAxOC0xMS0yNiAwODo1MDo1NQ==","repeats":1},{"count":1784,"lower_bound":"MjAxOC0xMS0yNiAxMToyNjowOQ==","upper_bound":"MjAxOC0xMS0yNyAwMDo1NDo1Mw==","repeats":1},{"count":1792,"lower_bound":"MjAxOC0xMS0yNyAxOTowNjo0MA==","upper_bound":"MjAxOC0xMS0yOCAxNzo0MTowMA==","repeats":1},{"count":1800,"lower_bound":"MjAxOC0xMS0yOCAyMjo1NzowMg==","upper_bound":"MjAxOC0xMi0wMSAwNjo1NTowOA==","repeats":1},{"count":1808,"lower_bound":"MjAxOC0xMi0wMiAxMzowMzo0Mg==","upper_bound":"MjAxOC0xMi0wMyAwOTozMzo0MA==","repeats":1},{"count":1816,"lower_bound":"MjAxOC0xMi0wMyAyMDowMzo0NQ==","upper_bound":"MjAxOC0xMi0wNSAwNzoyMToxMQ==","repeats":1},{"count":1824,"lower_bound":"MjAxOC0xMi0wNSAxMzo1MToxOQ==","upper_bound":"MjAxOC0xMi0wNSAyMzoxODo1Mg==","repeats":1},{"count":1832,"lower_bound":"MjAxOC0xMi0wNiAwMjowMTozNQ==","upper_bound":"MjAxOC0xMi0wNyAwMzozMToxMw==","repeats":1},{"count":1840,"lower_bound":"MjAxOC0xMi0wNyAwMzo1NTo1NQ==","upper_bound":"MjAxOC0xMi0wOCAwMTo1ODoyMQ==","repeats":1},{"count":1848,"lower_bound":"MjAxOC0xMi0wOCAwMjoxMTo1OQ==","upper_bound":"MjAxOC0xMi0xMCAwMjo1ODoyNQ==","repeats":1},{"count":1856,"lower_bound":"MjAxOC0xMi0xMCAwOTozODoxMw==","upper_bound":"MjAxOC0xMi0xMCAxOTowMjowMA==","repeats":1},{"count":1864,"lower_bound":"MjAxOC0xMi0xMSAwMjoxODo0Ng==","upper_bound":"MjAxOC0xMi0xMSAxNzo0NDozMA==","repeats":1},{"count":1872,"lower_bound":"MjAxOC0xMi0xMSAxODoyNTo0OA==","upper_bound":"MjAxOC0xMi0xMiAxMzozOTowOA==","repeats":1},{"count":1880,"lower_bound":"MjAxOC0xMi0xMiAxNzoyNDo0NQ==","upper_bound":"MjAxOC0xMi0xMyAxODo1MDowMg==","repeats":1},{"count":1888,"lower_bound":"MjAxOC0xMi0xMyAyMDowODozNg==","upper_bound":"MjAxOC0xMi0xNCAwODoyODoxNw==","repeats":1},{"count":1896,"lower_bound":"MjAxOC0xMi0xNCAyMTowNDoyNw==","upper_bound":"MjAxOC0xMi0xNSAxMjozOToyMg==","repeats":1},{"count":1904,"lower_bound":"MjAxOC0xMi0xNSAxNDowMDowNw==","upper_bound":"MjAxOC0xMi0xNyAxNjo0MTo1Ng==","repeats":1},{"count":1912,"lower_bound":"MjAxOC0xMi0xOCAxNDowNDo0Nw==","upper_bound":"MjAxOC0xMi0xOSAxMjozNTo0Nw==","repeats":1},{"count":1920,"lower_bound":"MjAxOC0xMi0xOSAxODo0Mjo1Mg==","upper_bound":"MjAxOC0xMi0yMCAwMzo1NTo1Ng==","repeats":1},{"count":1928,"lower_bound":"MjAxOC0xMi0yMCAyMToxODo0Ng==","upper_bound":"MjAxOC0xMi0yMSAwOTowMzozMA==","repeats":1},{"count":1936,"lower_bound":"MjAxOC0xMi0yMSAxMTowMjozNg==","upper_bound":"MjAxOC0xMi0yMSAxNToxMjo1Mg==","repeats":1},{"count":1944,"lower_bound":"MjAxOC0xMi0yMSAyMzowMTozMQ==","upper_bound":"MjAxOC0xMi0yMiAwNDozODoyMg==","repeats":1},{"count":1952,"lower_bound":"MjAxOC0xMi0yMiAwODo1Njo1MA==","upper_bound":"MjAxOC0xMi0yMyAwMjoyMzo1MA==","repeats":1},{"count":1960,"lower_bound":"MjAxOC0xMi0yMyAxMjoxODoxNQ==","upper_bound":"MjAxOC0xMi0yNCAwNzozNzozNA==","repeats":1},{"count":1968,"lower_bound":"MjAxOC0xMi0yNSAwMzoyODoyMw==","upper_bound":"MjAxOC0xMi0yNSAxMToxOTowMA==","repeats":1},{"count":1976,"lower_bound":"MjAxOC0xMi0yNSAxNTowOToyMA==","upper_bound":"MjAxOC0xMi0yNiAwMTo0MToxNw==","repeats":1},{"count":1984,"lower_bound":"MjAxOC0xMi0yNiAxNzozNjowNg==","upper_bound":"MjAxOC0xMi0yNyAxOTowNzozOQ==","repeats":1},{"count":1992,"lower_bound":"MjAxOC0xMi0yOCAwMzoxMzoxOA==","upper_bound":"MjAxOC0xMi0yOCAxMTozNToxMw==","repeats":1},{"count":2000,"lower_bound":"MjAxOC0xMi0yOCAxMzo1NzozOA==","upper_bound":"MjAxOC0xMi0yOCAyMToyMTo0MA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,0,1,0,1,0,2,1,0,0,1,3,3,1,1,2,1,0,1,1,0,1,1,0,0,1,1,0,0,3,4,2,0,5,2,1,0,1,2,0,1,3,0,2,1,0,3,1,0,0,0,1,0,2,1,0,1,2,0,2,1,1,1,1,3,0,1,4,0,0,0,1,1,1,2,2,2,1,0,1,1,1,0,1,1,1,3,0,1,2,1,2,1,0,1,1,1,0,0,0,1,1,0,0,0,0,1,2,0,0,0,3,1,1,1,0,2,1,1,1,1,2,0,0,1,1,0,0,3,3,0,0,0,1,4,0,0,1,2,1,0,1,0,4,0,0,2,0,2,0,0,1,0,0,0,0,1,2,2,2,3,2,2,0,1,1,2,0,0,0,0,0,2,1,0,2,2,3,1,1,1,2,1,2,4,0,1,0,1,1,1,1,0,1,2,3,1,1,1,0,0,2,0,2,0,2,2,0,4,2,1,1,2,1,0,0,1,1,0,1,0,1,1,0,1,0,2,2,2,0,1,0,1,1,1,0,3,2,0,3,1,0,1,2,1,0,1,1,1,0,0,0,0,1,2,2,1,3,0,0,1,0,2,1,0,4,2,2,1,0,0,0,1,0,0,0,1,0,4,1,0,0,1,1,1,2,2,0,1,2,2,3,2,2,0,0,0,1,0,0,2,1,1,0,0,0,2,1,3,1,1,0,1,1,1,3,0,1,1,0,1,2,0,0,1,0,1,0,1,0,0,1,1,3,1,2,0,0,1,0,0,2,1,0,4,0,1,2,1,1,1,1,1,1,1,0,2,0,0,0,0,2,1,2,1,1,1,0,2,1,0,1,2,1,0,2,2,1,2,1,0,0,2,0,1,0,0,1,0,0,3,0,0,2,1,3,1,1,0,1,2,2,2,3,2,0,0,1,0,1,1,0,0,2,0,0,1,3,2,1,1,1,1,1,1,0,1,2,1,2,1,1,2,0,0,1,1,1,1,1,1,0,0,0,1,3,0,0,3,2,0,3,3,0,2,0,2,2,0,0,1,3,1,0,0,0,5,1,0,1,1,2,1,1,1,2,0,0,0,0,2,4,1,0,1,2,2,2,0,0,0,0,2,2,1,1,1,4,0,1,2,3,0,2,1,5,3,2,1,0,0,0,0,1,1,1,1,1,3,0,2,2,0,1,2,1,1,1,0,2,0,1,0,4,1,0,0,0,4,0,0,0,1,1,3,2,0,0,1,0,2,2,0,2,0,0,0,2,2,2,1,2,1,1,0,0,1,2,0,1,1,3,2,0,0,1,3,0,1,2,0,0,1,1,0,0,1,1,1,1,0,0,1,1,1,2,3,0,2,1,2,2,3,4,1,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,2,1,1,1,1,0,0,1,1,1,2,2,1,2,0,2,3,0,1,0,4,0,0,0,1,0,1,0,1,0,0,0,2,1,1,1,2,0,3,0,1,1,0,1,1,1,2,1,1,1,0,2,0,1,0,1,1,0,0,1,0,4,0,1,2,0,1,1,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,2,0,0,1,1,0,4,3,1,2,0,1,1,0,0,1,3,2,0,2,2,1,0,3,2,1,0,0,0,1,0,0,1,0,1,0,3,0,1,0,2,5,1,3,2,0,0,2,0,0,0,0,0,0,0,1,0,2,2,0,0,2,1,1,1,0,0,1,0,0,0,0,0,0,1,0,3,2,0,1,0,1,0,0,1,0,0,1,2,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,2,1,0,1,1,1,1,0,1,3,0,1,0,1,0,0,2,0,4,0,0,4,2,0,0,1,3,0,1,0,0,3,1,2,1,0,0,0,1,2,3,2,1,0,0,0,1,0,1,1,1,3,0,0,1,0,0,1,1,0,0,1,0,1,1,0,1,1,0,0,1,1,0,0,1,2,0,0,1,1,0,1,2,0,1,4,1,2,1,0,1,1,3,1,0,0,0,0,1,1,2,1,3,1,1,1,0,3,2,0,2,0,0,1,0,0,0,2,2,2,0,1,2,1,1,0,2,2,0,0,1,1,0,1,2,0,1,0,1,1,1,2,1,0,1,2,1,0,1,0,0,0,0,0,0,0,3,2,1,0,0,3,0,0,1,0,0,1,0,0,1,1,0,0,1,2,2,0,1,0,1,2,2,1,1,3,2,2,1,0,1,0,0,1,2,0,2,1,1,0,0,0,1,0,2,2,1,0,0,2,0,0,0,0,1,1,2,1,2,1,2,2,0,0,1,1,1,0,2,1,1,1,1,0,1,0,1,1,2,0,0,1,0,0,1,2,0,2,0,1,0,2,3,0,0,3,1,1,2,1,0,4,1,1,1,0,0,0,3,1,2,1,2,2,0,0,0,1,0,0,0,1,0,1,0,2,1,0,1,2,1,0,0,0,2,0,2,1,3,0,1,1,1,2,1,1,1,2,1,1,0,1,0,0,1,0,1,1,1,1,1,1,0,5,2,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,2,0,1,2,1,1,0,1,2,2,0,2,0,0,1,2,0,0,1,1,0,0,0,0,0,1,0,1,1,2,3,1,2,1,0,0,0,2,2,1,0,1,2,2,0,1,1,1,0,0,1,0,1,1,2,0,1,3,1,2,3,2,2,2,2,1,4,1,2,1,3,1,1,0,1,2,3,3,2,1,0,0,1,3,3,0,2,2,2,1,0,1,0,0,0,2,0,0,2,1,0,1,1,0,1,0,0,1,0,0,2,0,0,2,0,0,1,1,0,2,2,1,1,0,0,2,2,0,0,2,0,2,2,2,0,2,0,0,0,2,2,1,1,0,0,2,1,0,3,4,1,0,0,1,0,2,2,0,2,1,1,1,3,2,1,2,0,0,3,1,4,1,0,0,2,2,3,2,0,1,2,0,1,1,1,1,1,0,0,0,1,1,1,0,0,2,0,1,0,0,1,1,2,0,0,2,0,2,2,1,0,1,2,1,2,0,0,1,0,1,1,3,2,3,1,1,1,2,0,1,1,0,1,1,0,1,0,1,1,1,2,2,0,1,1,1,2,0,0,1,2,1,0,2,0,2,1,1,0,1,1,2,1,1,2,1,2,0,1,1,2,2,1,1,1,0,1,2,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,3,1,2,0,3,3,2,1,1,0,0,0,1,1,2,2,2,2,0,1,0,0,1,0,1,0,0,2,0,2,1,2,2,2,2,0,0,0,2,1,1,2,0,0,0,0,0,2,0,1,0,2,1,0,0,0,0,0,0,4,0,2,2,1,0,1,1,0,0,1,2,0,0,2,0,1,1,1,0,0,0,2,1,3,1,1,3,1,1,2,0,3,1,2,2,2,3,1,0,4,1,2,2,2,1,2,1,1,3,0,2,3,1,0,2,2,2,0,1,2,2,1,0,0,0,0,1,1,4,0,0,2,0,3,0,1,0,2,0,0,0,0,1,1,3,1,2,0,0,1,1,2,0,2,1,0,1,1,2,3,1,0,0,1,1,1,0,0,0,1,4,1,0,1,0,0,2,1,0,0,1,1,0,4,0,1,0,1,0,3,2,2,0,0,0,0,2,0,0,0,2,1,2,1,1,1,2,1,1,3,1,2,0,1,0,0,0,0,1,0,1,0,2,0,3,0,2,0,1,0,1,0,2,1,1,2,1,0,0,1,1,1,0,0,1,0,0,1,0,2,0,0,0,2,1,2,1,1,2,1,1,2,1,2,1,1,0,1,0,1,0,0,2,0,0,2,2,1,1,0,3,1,0,0,2,1,0,0,1,4,1,2,0,0,0,0,1,0,2,0,1,0,0,1,0,0,0,2,0,1,1,2,0,0,1,0,2,0,1,0,3,1,0,0,0,0,1,2,0,1,0,2,0,1,1,1,2,2,1,2,2,2,1,1,1,2,0,0,2,1,0,2,2,1,0,1,1,4,0,1,1,2,0,1,1,0,2,1,1,1,1,1,3,0,0,0,4,1,1,1,0,0,2,0,2,0,0,0,0,1,0,1,0,1,1,1,1,0,0,1,0,3,3,1,3,0,3,1,0,3,0,0,0,0,1,3,1,2,1,0,2,0,1,1,0,1,0,1,0,1,2,0,3,1,1,1,0,1,0,2,0,2,2,1,1,1,1,2,1,3,1,0,2,0,2,2,0,1,4,0,1,1,0,1,0,1,0,1,2,3,1,0,0,2,0,2,1,0,1,1,1,0,1,1,1,1,0,2,2,0,1,0,1,1,0,2,2,0,3,0,3,3,0,1,1,1,0,1,1,1,1,0,0,1,1,0,0,2,2,0,2,0,0,0,1,1,0,0,1,0,2,0,4,1,0,0,0,1,3,1,2,1,0,0,2,2,2,0,2,3,2,0,0,1,1,3,0,2,1,0,0,1,2,1,1,1,1,4,0,0,2,1,1,1,1,0,2,3,1,2,0,1,2,0,2,0,1,0,1,2,4,3,3]},{"counters":[0,1,0,2,1,0,2,1,0,1,2,1,2,1,3,0,0,1,1,0,1,1,1,0,0,1,0,2,0,1,0,1,2,3,0,1,0,0,1,0,1,1,1,0,1,1,0,3,1,2,0,0,0,0,3,0,1,1,0,1,0,2,1,0,0,0,0,0,0,0,8,1,1,1,4,0,1,1,2,2,1,0,0,1,0,3,0,1,1,0,3,1,0,1,0,3,3,3,0,0,2,3,1,2,0,2,1,2,0,0,0,1,3,3,2,1,0,0,1,0,3,2,0,2,0,4,3,1,0,0,0,0,1,0,1,1,1,0,2,1,2,1,1,2,0,1,0,1,1,1,0,2,2,1,2,0,0,0,0,0,1,1,0,1,0,1,3,2,3,0,1,1,2,0,0,0,1,0,1,2,1,0,0,0,1,3,1,0,1,2,1,1,1,0,2,1,0,2,1,1,2,1,2,0,0,2,1,0,2,1,1,0,0,1,2,1,2,0,0,1,0,2,0,0,2,1,1,1,1,3,1,3,0,1,2,0,0,1,1,3,2,1,0,0,1,1,0,2,2,1,3,0,1,1,1,0,0,2,1,2,1,0,1,0,0,1,4,0,0,2,2,1,0,0,1,0,1,2,0,0,0,5,3,0,0,1,1,2,1,1,0,0,2,1,2,0,0,0,2,3,0,0,2,3,0,0,1,1,0,1,0,0,0,2,0,0,0,1,2,0,0,0,2,0,1,1,1,1,1,0,1,2,1,1,2,1,0,0,1,0,0,1,0,2,0,3,2,1,0,0,1,4,0,0,0,2,1,2,0,2,0,1,0,1,0,0,1,2,1,0,0,2,1,3,2,2,2,1,2,0,0,0,3,0,2,0,1,1,1,2,1,0,0,3,1,3,1,1,2,1,2,1,1,3,1,0,0,0,1,1,2,0,3,0,1,1,0,1,1,0,1,2,0,0,1,1,1,1,2,1,1,3,2,0,1,2,2,1,0,1,1,1,1,1,2,2,1,2,1,1,2,0,1,0,1,0,0,1,1,0,1,0,1,0,1,0,0,0,0,2,0,1,1,1,0,0,0,1,0,1,0,1,1,3,0,3,1,1,3,0,0,2,0,0,0,1,1,0,0,1,3,2,1,0,1,1,0,0,0,1,0,2,1,1,2,1,0,2,0,0,0,1,3,0,1,1,0,0,0,1,1,3,0,1,1,0,0,0,1,3,4,3,1,0,1,0,0,1,0,0,3,0,1,2,1,0,1,0,5,2,1,2,2,0,1,3,0,2,2,1,1,1,0,1,0,0,0,3,4,1,3,1,2,2,2,1,0,0,1,0,1,1,0,1,0,1,1,0,1,0,2,0,1,3,4,0,1,0,0,0,0,2,0,1,1,0,1,1,0,0,1,0,1,0,3,0,1,1,1,0,1,0,0,2,0,1,2,0,1,4,0,1,1,0,0,2,0,0,1,1,3,3,0,1,1,2,1,1,0,1,0,2,1,1,1,0,0,2,0,0,0,1,0,1,3,0,2,1,1,0,0,1,1,0,0,1,1,4,1,2,0,0,1,0,2,1,0,0,0,1,0,1,1,1,0,2,1,3,2,1,2,0,2,1,1,0,1,0,1,1,0,1,0,1,1,3,1,3,0,2,1,1,1,3,1,2,2,0,1,0,0,0,2,2,2,1,1,0,1,0,4,2,0,1,2,1,1,1,1,0,1,0,1,2,2,1,1,1,1,0,1,2,0,1,0,0,2,0,0,1,0,2,2,1,0,1,0,0,1,1,1,0,1,1,2,2,0,3,1,0,1,1,0,0,1,2,5,1,0,0,2,3,1,1,0,3,1,0,2,0,0,2,0,2,0,2,1,0,4,1,1,1,1,1,0,0,0,2,0,0,0,1,0,1,0,0,0,0,0,1,2,0,1,1,0,2,1,1,2,2,1,1,3,0,0,1,2,1,1,1,0,0,1,1,0,2,1,0,0,1,1,2,0,3,2,0,0,0,3,0,0,0,0,2,2,1,2,2,4,0,2,0,2,2,0,0,1,4,0,0,0,2,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,3,0,0,1,1,1,3,3,2,1,1,0,1,2,3,1,1,1,0,0,0,0,0,1,2,0,0,2,1,3,0,4,0,1,1,0,1,0,0,1,1,0,1,0,1,2,0,0,2,1,0,0,0,2,0,0,1,1,0,0,1,1,1,2,1,0,3,1,2,4,3,1,2,0,0,2,1,0,1,2,0,0,1,3,1,1,1,1,1,1,2,1,0,0,0,1,1,0,1,0,2,1,0,0,0,2,4,1,0,1,1,2,0,3,1,1,0,3,0,0,0,0,0,0,0,3,2,0,2,2,0,0,2,1,0,0,2,1,0,1,0,2,1,1,0,1,2,2,1,1,0,0,0,0,0,0,0,1,1,4,1,1,1,1,1,2,2,1,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,3,0,0,0,1,1,0,3,1,1,1,1,0,1,1,1,0,0,0,1,2,0,0,1,2,1,1,0,0,0,0,0,2,0,1,1,1,0,0,3,1,1,1,1,1,1,2,1,1,0,2,0,3,1,2,0,1,1,2,0,2,2,2,0,0,2,0,0,0,0,0,1,0,0,3,0,2,1,2,0,1,1,1,2,1,0,0,0,1,1,0,0,3,1,1,0,0,3,0,0,0,0,0,1,1,0,1,1,0,2,0,1,2,0,1,0,2,0,0,0,2,0,0,0,2,2,2,1,0,1,1,1,2,0,0,0,1,1,1,1,0,0,1,2,0,0,3,0,2,2,1,1,1,2,1,1,1,2,2,0,3,1,2,0,0,0,1,1,0,3,1,2,0,2,1,1,2,0,1,0,1,1,2,2,0,2,0,2,1,0,1,1,1,1,0,0,2,1,0,0,0,0,0,1,1,2,1,1,2,1,1,0,1,2,1,0,1,2,2,2,1,0,1,1,3,0,0,2,0,0,1,1,1,2,2,3,1,1,0,0,0,2,0,2,3,2,1,0,2,2,0,0,0,3,2,0,1,0,2,1,2,0,2,2,3,0,0,1,2,1,2,2,3,0,1,3,1,0,1,1,0,0,4,0,2,1,2,3,2,4,2,0,0,0,3,0,0,0,0,3,4,1,1,2,3,1,3,1,1,0,1,1,1,3,0,0,2,2,1,2,3,2,1,1,0,1,2,4,1,2,0,0,0,2,0,1,0,1,0,0,1,0,3,0,1,0,2,0,1,1,0,0,0,1,1,0,0,1,1,0,1,0,3,0,1,0,2,0,0,1,1,2,0,2,2,0,0,1,0,0,1,1,0,0,0,0,2,3,3,1,0,1,0,2,3,1,0,0,0,0,2,2,1,1,2,0,1,2,0,1,2,0,0,4,1,1,0,0,0,1,1,0,2,1,0,0,1,1,2,0,0,2,2,2,3,0,1,2,3,1,2,1,0,1,0,0,4,3,3,0,1,1,0,3,2,0,0,2,1,0,0,1,0,0,2,0,0,2,1,0,1,3,1,1,1,0,2,1,1,1,1,0,2,1,0,0,0,2,1,1,1,1,1,1,1,1,1,1,1,2,2,1,3,1,0,2,1,1,1,0,1,0,0,2,1,3,1,0,3,0,3,0,0,2,1,1,0,0,1,0,2,2,1,0,1,2,1,2,1,2,3,2,1,2,0,0,1,1,0,2,0,0,0,0,0,0,2,0,0,0,0,2,1,0,0,2,0,1,0,1,0,1,0,2,0,1,0,1,3,0,2,1,0,2,1,1,1,1,0,0,1,1,3,0,0,0,2,2,1,1,1,0,0,0,1,2,1,1,1,1,1,1,1,3,3,1,2,0,0,2,0,4,1,1,1,1,2,0,0,0,1,0,1,0,1,0,0,0,0,1,1,2,3,1,1,1,0,4,1,2,2,1,1,1,1,0,1,0,1,2,0,0,2,2,1,0,4,2,1,1,0,3,1,0,1,2,0,0,0,2,0,1,1,0,4,1,2,0,2,0,1,0,0,0,0,4,1,1,1,1,2,1,0,0,0,0,1,1,1,1,0,2,0,1,0,0,0,2,0,0,1,0,2,2,2,1,1,0,1,0,3,2,2,1,1,0,1,1,1,1,0,2,0,1,1,0,2,1,2,1,0,2,2,1,1,0,3,4,2,0,0,0,0,0,0,1,0,0,1,1,1,2,1,2,0,2,2,2,0,2,0,1,0,0,0,0,0,3,0,2,1,2,2,1,2,0,1,2,2,3,2,1,2,2,1,1,0,1,0,1,1,1,1,0,1,1,2,4,1,1,1,0,2,0,0,0,1,1,1,4,0,2,0,2,1,1,0,2,1,2,1,1,2,2,0,0,2,0,3,1,1,1,0,1,2,0,0,3,0,2,3,1,1,1,1,2,2,3,0,0,1,1,1,0,3,0,0,1,0,1,1,1,1,0,0,1,2,0,1,0,1,0,1,0,1,0,2,1,4,3,2,3,1,2,0,1,0,0,2,0,0,0,0,0,0,5,1,0,0,1,2,3,0,2,0,2,2,1,0,0,2,1]},{"counters":[0,1,1,1,1,2,2,2,1,0,0,1,0,2,2,0,0,1,0,0,1,1,0,1,1,0,2,1,1,1,1,1,0,0,2,0,2,2,2,0,0,3,0,0,0,2,1,0,1,1,2,0,1,0,0,0,1,2,1,1,0,1,0,1,6,1,2,0,0,1,1,1,0,2,0,1,1,1,0,2,2,1,0,0,1,2,0,2,1,1,3,2,5,1,0,2,3,0,1,0,0,1,3,1,0,2,2,1,2,0,0,0,3,1,2,2,3,0,0,0,4,0,4,0,3,1,2,0,2,2,0,2,1,2,1,0,0,2,2,1,3,2,2,2,1,1,1,0,4,1,0,2,0,1,1,1,1,2,0,1,1,3,0,2,0,1,2,0,2,0,2,4,1,1,2,2,1,1,1,1,0,1,1,1,0,1,0,4,2,0,0,1,2,1,0,1,2,3,2,0,2,1,1,2,3,1,3,0,0,1,0,0,1,0,2,0,1,0,0,2,1,2,0,0,0,2,1,0,0,1,0,0,1,1,1,3,1,0,1,1,0,1,1,1,0,0,0,0,1,1,1,1,1,0,0,0,2,0,1,0,1,0,1,1,2,0,1,1,2,2,0,0,0,3,1,4,2,0,0,0,2,1,0,1,0,1,1,1,3,2,1,1,1,2,0,1,3,0,0,2,0,2,1,0,0,0,1,0,2,1,3,2,1,1,0,3,2,1,1,0,0,3,1,0,0,2,0,0,2,1,1,2,1,2,0,1,0,1,0,2,0,2,0,0,3,2,0,0,0,1,1,1,2,2,0,2,1,0,1,0,2,1,1,1,1,0,2,1,1,0,1,0,0,0,0,2,1,0,1,0,3,1,1,1,0,3,0,0,1,0,0,0,1,0,3,0,0,2,2,0,2,0,1,1,2,2,2,2,1,1,1,2,1,0,1,0,0,0,1,3,0,0,0,1,2,0,1,1,1,2,1,1,0,2,2,0,2,3,1,0,2,2,1,1,2,0,0,2,0,2,1,0,0,1,1,1,1,1,1,2,0,1,0,1,2,0,0,3,4,1,0,0,1,1,0,1,0,0,1,3,0,0,0,2,1,1,1,3,0,0,1,0,2,1,1,1,2,0,1,1,1,2,1,1,0,0,0,1,1,0,1,0,0,0,2,0,1,2,2,0,2,2,0,1,2,0,0,2,0,1,1,2,1,0,0,1,2,2,0,1,0,2,1,1,1,0,0,0,1,1,1,0,0,2,0,0,0,0,0,0,2,1,0,3,0,2,1,0,0,0,2,1,1,0,3,0,1,1,0,1,0,3,0,1,1,0,2,2,1,0,1,0,1,0,0,0,2,1,2,0,0,1,2,0,2,1,1,3,0,0,2,2,1,0,0,0,1,2,0,2,0,0,0,2,1,0,2,2,0,3,0,2,0,2,0,1,1,1,1,0,0,1,1,2,1,1,2,1,1,2,2,0,0,1,1,1,2,1,1,1,4,1,0,2,0,2,0,2,0,1,0,0,1,1,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,2,1,1,1,1,0,1,0,1,1,2,0,0,2,0,0,0,2,2,2,0,1,2,1,2,2,1,2,3,1,2,1,1,0,1,1,3,0,0,1,1,1,0,2,1,1,1,1,0,3,0,0,0,1,1,0,2,1,1,0,0,0,1,1,1,0,0,1,0,0,1,2,3,2,1,1,2,1,1,1,0,1,0,0,4,0,0,0,1,0,1,1,0,1,1,1,3,0,2,0,0,1,2,1,1,2,0,0,2,0,1,1,1,0,3,0,2,3,0,3,1,1,0,0,2,0,0,2,0,1,2,1,2,2,1,0,2,0,0,1,0,1,3,2,0,1,0,2,0,2,1,0,0,1,0,1,1,1,1,2,1,0,3,0,1,0,0,0,0,0,1,1,3,1,0,0,2,0,1,3,4,4,1,0,2,0,1,1,1,1,2,1,1,1,2,1,2,1,2,0,2,0,1,2,2,0,0,1,0,1,1,2,3,1,1,2,0,2,1,0,1,0,3,3,2,2,0,1,3,2,3,0,1,0,1,1,0,0,0,0,2,3,1,1,1,0,0,1,0,2,1,2,1,0,1,2,2,0,2,1,0,2,1,2,1,0,0,0,0,1,0,0,1,0,1,3,0,0,0,1,1,0,1,1,1,0,0,1,2,0,1,1,0,0,1,0,1,1,1,1,1,0,2,0,0,2,0,0,1,1,1,1,0,1,3,2,4,1,0,1,1,2,2,2,1,0,1,3,0,1,1,0,0,1,1,0,0,0,1,1,1,2,2,1,0,1,0,1,1,1,1,1,0,1,2,1,1,2,0,1,1,2,1,0,2,1,1,2,1,1,1,1,1,2,0,0,1,0,0,1,2,2,0,0,0,1,1,0,1,1,1,2,0,1,1,2,1,0,0,2,1,1,2,1,3,0,0,1,0,0,0,0,1,0,1,2,1,2,0,1,2,1,1,2,1,1,0,2,1,0,0,1,1,2,5,2,1,2,2,1,0,0,0,1,0,2,2,1,1,0,0,3,0,3,0,0,0,0,1,1,2,1,0,0,2,2,1,0,1,2,1,1,1,1,0,0,2,0,1,1,1,1,2,2,1,0,1,1,1,2,4,1,1,1,1,1,0,0,0,0,3,2,0,0,0,3,1,0,1,1,0,1,1,3,1,0,1,0,4,2,1,1,2,1,0,2,2,1,0,1,0,1,1,1,0,0,0,0,2,1,2,3,3,2,2,0,1,0,1,0,2,0,1,3,2,1,2,1,1,2,2,1,0,2,2,1,1,0,0,1,0,2,0,0,2,1,2,0,2,1,0,0,0,0,2,0,1,0,0,2,1,0,0,1,2,2,1,0,0,3,0,0,0,1,0,3,1,1,2,0,1,1,2,2,1,1,1,2,1,1,3,0,0,0,3,2,0,3,0,2,1,1,1,0,0,3,2,1,0,0,0,0,2,0,2,1,0,1,0,0,3,0,3,0,0,0,2,1,3,0,3,0,3,0,1,2,2,0,0,0,0,2,0,2,2,1,1,0,1,0,0,1,0,2,2,1,1,2,1,3,2,1,0,1,3,0,2,0,3,1,1,0,1,0,1,0,1,1,1,1,1,0,2,1,0,1,0,2,1,1,5,1,0,1,0,0,0,3,0,2,0,1,1,0,0,2,0,0,0,1,1,4,3,3,0,1,1,0,0,4,1,0,0,1,1,0,0,0,1,0,1,1,0,0,2,0,0,1,1,1,0,0,1,1,5,0,0,2,1,1,3,0,2,2,0,0,2,0,1,0,0,1,0,1,2,1,0,0,1,1,2,1,0,0,0,1,1,1,1,3,0,1,3,2,1,1,1,3,1,1,0,0,1,2,2,2,0,5,1,3,0,0,0,0,0,0,0,0,2,2,1,1,3,1,1,0,3,6,0,0,1,2,2,0,0,0,0,0,0,2,0,1,1,1,0,4,0,2,2,3,1,0,1,3,0,1,1,0,1,1,2,0,1,1,2,2,1,0,4,0,1,1,1,3,1,0,0,1,0,1,0,1,1,3,2,2,0,1,1,1,0,0,0,0,1,1,0,3,0,0,1,0,2,1,0,3,0,1,1,1,1,0,1,1,0,1,0,0,0,1,2,0,0,1,0,0,1,0,0,4,0,0,2,0,0,1,1,1,1,0,0,0,3,2,0,2,2,2,0,1,0,0,2,1,0,0,1,3,0,3,0,1,1,1,0,2,2,2,0,2,2,0,0,2,1,0,2,2,2,2,1,1,1,1,0,0,1,0,0,2,0,1,0,2,3,1,0,2,1,0,0,2,2,3,1,1,0,1,0,0,1,1,0,0,3,0,1,0,0,0,0,0,0,0,1,1,3,0,1,0,2,0,2,0,1,0,1,0,1,0,1,0,0,1,1,0,2,0,0,0,1,1,2,2,1,1,1,0,0,0,1,0,3,0,0,0,0,0,0,1,2,1,1,2,1,0,1,2,0,0,1,1,0,1,0,2,0,2,1,2,1,0,1,2,0,3,1,1,1,2,0,2,0,3,0,0,0,1,1,0,1,2,0,0,3,2,1,1,2,0,0,0,2,0,0,2,1,0,0,2,1,1,0,1,2,0,1,2,0,1,1,1,2,3,2,3,1,2,3,3,1,0,1,0,3,0,2,0,1,1,2,1,1,1,3,4,0,1,1,0,1,0,0,1,2,0,0,1,1,0,2,2,2,0,2,2,1,2,1,1,2,1,0,0,0,0,1,2,1,2,0,1,1,2,1,0,0,0,1,2,0,2,1,1,1,0,0,3,1,1,1,0,0,2,0,0,0,2,1,0,2,0,0,1,2,1,2,0,2,1,0,0,1,3,1,0,4,0,1,2,2,0,0,0,2,1,2,0,0,1,1,1,0,1,1,0,1,2,2,2,0,0,2,0,0,0,0,0,1,1,1,2,2,2,3,0,0,1,1,3,1,1,2,1,0,1,0,2,1,2,2,0,2,1,1,0,0,0,1,0,0,1,3,2,0,3,1,0,1,3,0,0,0,0,1,4,0,0,0,0,0,0,0,1,0,2,1,0]},{"counters":[2,4,2,1,1,2,1,2,0,1,1,1,0,1,0,2,1,0,0,1,1,1,1,2,1,2,0,1,2,1,1,0,1,2,0,0,1,1,0,1,2,0,0,0,2,1,0,0,2,1,1,0,0,1,3,0,2,0,1,1,1,0,1,0,1,0,4,0,3,0,0,2,5,1,0,0,1,2,0,1,1,3,0,3,2,0,3,1,1,2,1,1,1,3,0,0,0,0,1,0,0,1,1,5,0,2,0,2,0,2,2,0,2,0,1,2,0,0,0,0,1,2,2,0,1,2,0,1,3,3,0,1,0,1,1,0,0,0,1,0,0,0,3,2,4,1,1,1,1,0,1,2,1,0,0,0,0,1,1,1,0,1,1,0,1,3,0,2,0,0,2,0,2,0,1,0,0,0,1,1,2,1,3,0,0,1,1,1,0,1,2,1,0,1,2,1,1,1,1,1,2,1,0,1,2,2,1,0,0,1,0,2,0,3,0,0,0,2,1,2,1,3,3,1,2,0,2,0,0,0,2,0,3,0,0,1,0,1,0,2,3,2,2,1,2,3,2,0,2,1,1,0,2,1,2,1,2,3,1,1,0,2,1,1,1,0,1,1,1,1,3,1,0,0,0,0,1,0,0,2,1,0,0,1,1,1,1,2,0,1,2,1,1,0,0,1,0,0,0,1,0,1,1,2,3,1,1,1,1,0,0,0,0,0,0,1,2,1,1,2,5,0,1,0,1,0,1,1,0,0,1,0,2,0,2,1,1,0,1,1,2,0,0,1,4,1,0,2,0,0,2,0,1,1,3,2,0,1,2,0,1,2,2,1,0,0,0,2,0,0,2,1,2,1,0,1,0,0,0,1,1,2,0,1,2,2,1,0,1,1,1,0,0,1,0,1,2,1,0,1,1,2,4,0,0,0,0,2,1,1,1,1,2,1,0,0,2,2,2,1,0,3,2,3,0,0,2,0,2,0,1,0,1,0,0,3,0,3,1,1,2,0,2,2,2,1,4,0,1,0,0,0,1,1,4,4,1,0,1,0,1,1,2,0,0,2,2,1,0,1,1,2,2,1,2,1,1,1,2,1,1,0,1,1,0,3,1,0,2,1,0,1,1,2,0,2,1,1,0,0,0,1,0,2,2,2,1,1,1,0,0,0,2,1,0,2,4,1,2,0,2,1,3,1,1,0,1,0,2,1,0,0,3,1,1,3,1,0,1,1,1,0,0,1,0,1,0,0,2,2,3,3,1,2,3,3,0,1,0,1,1,0,0,2,2,2,0,2,3,0,0,1,1,0,0,1,2,2,1,0,2,0,1,2,1,0,1,0,1,1,0,1,0,1,1,1,0,0,0,2,0,1,2,1,0,0,0,1,0,2,3,0,2,2,3,1,2,2,1,2,2,1,0,1,2,1,0,2,0,1,0,1,1,3,0,0,1,0,0,1,3,1,0,0,0,0,0,1,0,0,1,1,0,1,1,0,2,0,1,0,1,1,1,1,1,3,2,0,0,1,1,1,2,0,1,1,0,2,1,0,1,2,2,1,0,0,0,0,2,1,2,1,0,3,2,1,0,1,0,0,0,2,1,0,2,1,1,0,3,1,0,2,2,0,0,0,1,3,1,1,1,0,1,0,0,1,1,2,1,1,2,0,0,1,0,3,0,1,2,0,1,0,2,0,0,0,0,1,1,2,1,0,1,1,1,0,0,2,2,3,0,0,0,1,1,1,0,1,0,2,0,1,1,1,0,0,2,2,1,1,1,3,1,1,0,0,1,1,1,0,3,1,3,0,1,1,2,1,1,1,1,3,1,2,0,1,0,1,1,0,1,2,2,0,3,1,2,2,1,0,2,0,1,0,2,0,1,0,1,0,0,1,3,0,1,0,2,0,0,2,1,0,4,0,0,1,0,1,1,0,3,1,1,0,2,1,2,0,0,1,0,1,2,1,0,2,1,1,1,1,0,0,1,1,1,0,2,1,0,2,3,1,2,0,0,0,0,1,1,0,2,0,1,1,1,0,0,1,1,1,1,1,0,1,2,2,2,2,0,0,1,0,0,0,1,0,2,0,0,4,2,0,1,1,0,1,0,2,0,1,1,1,2,0,0,1,2,0,1,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,1,0,1,0,1,3,0,0,0,0,1,2,0,2,2,0,1,1,2,0,0,2,0,2,1,2,1,3,1,2,1,2,2,1,0,2,0,0,1,4,0,0,1,0,0,1,4,1,1,2,0,1,0,0,1,2,0,0,0,2,0,1,0,0,2,1,0,2,0,0,1,0,2,0,0,0,2,1,1,1,1,2,2,2,2,0,1,1,1,0,0,0,1,0,0,0,1,2,0,3,2,3,0,1,3,1,2,0,1,2,0,0,3,0,1,1,1,1,0,1,0,1,0,2,3,1,1,0,2,2,1,2,0,1,1,0,2,1,1,0,2,1,1,3,1,0,0,1,2,2,2,0,4,1,0,1,1,1,2,1,1,3,0,0,1,3,2,1,0,3,1,1,0,1,3,1,1,3,3,0,0,1,1,2,1,0,1,2,0,1,2,1,0,2,2,0,0,2,0,1,1,0,1,0,0,1,0,2,2,2,3,0,1,2,1,1,0,2,0,3,0,1,2,2,0,0,1,1,0,0,0,1,0,1,2,1,2,0,3,1,0,0,0,0,0,1,0,1,3,0,2,1,0,1,2,0,1,0,2,2,0,0,2,0,1,4,1,0,0,0,0,1,1,2,1,1,1,0,2,2,1,0,1,1,1,0,1,1,2,1,2,0,0,1,2,1,2,3,0,0,2,0,1,0,1,2,2,0,0,2,2,1,0,1,0,0,1,1,1,4,0,1,1,0,1,2,2,1,1,1,1,1,1,0,0,2,0,2,0,1,1,1,1,0,0,2,1,4,1,2,0,2,0,1,1,1,0,0,1,1,3,0,0,0,1,0,1,3,1,2,0,2,1,1,0,1,1,2,0,1,0,2,0,2,1,2,0,1,2,0,2,1,1,4,2,0,1,0,3,0,2,0,2,0,2,1,0,1,2,0,1,0,0,0,0,1,1,0,0,2,2,0,1,2,3,4,0,0,3,0,1,0,1,1,0,1,3,0,2,0,1,0,0,0,2,0,0,1,1,0,0,1,1,2,1,1,1,0,0,2,1,2,2,0,1,0,1,0,1,1,2,3,0,1,0,1,1,0,0,0,1,1,1,0,0,0,0,1,1,0,5,1,0,3,0,1,1,0,0,1,0,3,4,1,0,1,0,3,0,1,0,0,0,0,2,0,2,1,0,1,2,0,1,1,0,0,0,1,2,2,1,1,1,1,0,2,2,2,2,2,1,1,0,1,0,2,0,0,0,0,1,1,1,0,1,2,0,2,0,0,0,0,2,0,1,0,1,2,0,0,2,0,0,0,2,0,0,4,0,1,0,1,0,1,0,1,3,1,0,0,0,0,0,1,0,2,0,0,2,2,1,1,3,2,0,3,1,0,1,0,0,1,2,0,0,1,3,1,3,1,1,1,0,1,1,0,1,1,1,1,4,1,0,4,0,1,0,0,0,0,0,3,0,1,0,0,0,1,1,0,0,4,1,1,0,1,1,2,2,2,3,0,2,1,2,1,1,2,0,0,1,1,3,1,0,1,1,0,0,1,1,2,0,0,1,0,1,2,1,0,3,2,2,1,0,2,2,1,1,0,0,1,0,0,1,1,2,0,1,0,1,1,0,1,2,0,2,0,1,0,0,2,2,0,3,1,0,0,1,1,5,2,0,1,0,2,1,2,2,1,0,0,1,1,2,3,1,0,0,1,3,1,2,1,1,2,1,1,0,1,2,1,1,0,0,0,1,0,1,1,0,1,1,0,2,2,2,2,0,2,0,2,2,1,0,0,0,1,0,0,0,2,0,0,4,0,0,1,2,0,0,1,3,3,1,1,1,0,3,2,1,0,1,0,0,1,2,2,2,0,2,3,1,0,1,1,0,0,1,1,1,1,3,1,1,1,1,0,2,1,1,0,4,0,0,1,2,2,0,3,2,1,0,0,0,0,0,3,3,0,0,1,1,1,1,3,0,1,1,1,0,1,1,1,1,3,0,0,0,1,0,1,1,1,0,1,2,0,2,2,0,3,0,1,2,1,0,1,1,0,1,2,0,1,1,2,1,0,0,2,2,1,1,0,1,1,1,0,1,1,0,2,0,1,1,2,0,0,0,0,0,0,1,1,3,0,1,2,2,1,2,0,0,2,1,3,0,1,0,1,1,0,1,0,0,1,2,1,1,3,1,0,3,2,1,0,1,0,1,1,1,0,1,1,1,2,2,2,0,0,1,2,2,0,0,1,0,1,0,1,2,1,1,1,1,2,2,1,0,1,1,2,0,1,1,5,1,2,0,1,1,2,1,1,2,1,3,1,0,2,0,0,2,1,2,0,0,0,0,0,2,2,0,1,1,1,1,0,0,2,0,1,2,0,2,3,2,2,0,1,0,1,1,0,1,0,1,0,0,4,1,1,3,0,0,0,2,2,1,1,0,1,0,0,1,0,0,2,1,2,0,2,0,1,0,1,1,1,0,0,0,0,1,0]},{"counters":[1,1,0,2,0,0,2,1,1,1,1,0,0,2,1,0,3,1,2,0,0,1,0,1,2,2,0,2,1,0,1,0,0,1,1,0,0,1,0,2,0,2,2,2,2,0,0,2,3,1,0,0,5,0,1,1,1,0,0,2,0,2,2,1,1,1,2,1,0,4,1,0,1,2,0,0,1,1,2,0,0,1,2,0,0,0,0,1,0,1,0,1,0,0,2,1,1,0,2,1,0,2,0,2,0,1,0,2,1,2,1,2,0,2,0,2,2,1,2,2,3,1,0,1,0,1,3,0,1,0,1,1,2,2,0,0,0,0,0,1,1,1,0,1,5,0,1,1,1,1,3,0,1,1,0,1,1,1,3,0,1,1,2,1,0,0,4,0,1,2,1,2,0,1,1,1,0,1,0,2,1,0,1,0,0,1,1,0,0,1,2,0,1,1,1,1,1,1,0,3,1,2,1,1,1,0,0,1,1,0,2,3,1,1,1,2,1,1,1,2,0,0,1,0,1,1,3,2,0,0,0,1,0,1,0,0,0,0,0,1,1,0,0,1,1,2,1,3,2,1,1,1,1,2,0,2,0,1,2,1,2,1,2,0,2,1,2,2,5,0,1,0,0,1,4,1,4,0,0,0,0,0,0,3,3,2,2,0,0,1,1,1,0,1,1,0,2,0,1,3,0,1,1,1,0,1,0,0,0,1,0,0,3,0,0,1,0,1,2,0,1,2,1,0,2,0,0,0,0,1,0,0,0,1,2,3,2,4,1,0,2,2,1,0,1,0,1,0,0,1,2,2,1,2,1,1,4,0,1,0,1,3,1,0,1,1,1,3,3,4,3,0,2,0,0,0,5,0,0,4,1,0,0,0,0,2,1,0,3,1,2,4,0,0,2,0,1,3,0,2,1,1,4,1,0,0,1,0,1,0,0,1,0,2,1,0,1,0,2,1,1,2,2,0,2,0,0,5,2,3,1,0,0,0,2,1,3,2,0,1,1,0,0,1,0,3,1,0,2,2,0,0,1,0,0,2,0,4,1,0,1,0,2,1,1,0,1,0,1,1,1,0,0,0,0,0,2,1,1,0,1,1,2,1,0,0,0,1,0,0,1,0,0,2,4,2,1,1,0,0,0,0,1,0,0,0,0,0,3,2,3,2,0,1,0,1,2,2,1,2,4,1,0,0,1,2,1,2,1,2,1,0,0,1,1,1,0,0,1,2,0,4,0,0,0,2,2,4,1,1,0,2,1,0,1,0,1,2,5,0,0,1,1,3,0,0,1,0,0,1,2,0,1,2,1,3,2,3,2,1,4,2,1,1,0,2,1,2,0,0,0,0,0,1,0,0,1,1,0,1,2,1,2,1,1,0,2,1,0,2,2,0,2,1,0,0,0,2,0,2,1,1,0,2,1,0,2,2,1,2,0,2,0,1,1,1,0,2,1,1,0,1,0,2,2,2,1,2,1,0,1,0,0,0,2,2,4,0,1,1,0,0,0,1,4,0,0,0,0,4,1,3,0,3,1,0,2,2,1,3,3,0,2,1,0,1,1,0,2,4,0,1,0,1,1,1,1,0,1,0,0,3,1,0,2,0,0,1,1,0,1,1,1,2,0,0,0,2,2,1,0,0,0,3,2,1,0,0,3,1,3,0,1,1,0,0,1,3,1,2,1,2,1,0,0,0,1,0,1,1,1,3,0,0,1,1,2,3,2,0,0,0,1,0,1,0,3,2,2,0,3,1,1,1,0,1,3,0,0,0,1,1,1,1,1,0,0,1,1,0,0,2,2,0,2,1,0,2,2,0,0,1,0,1,0,2,1,1,0,1,0,1,1,2,1,0,0,1,1,2,2,0,1,1,0,0,1,1,1,1,0,1,0,1,3,0,0,0,2,0,0,2,0,3,1,1,1,1,1,1,0,1,0,0,0,1,1,0,0,2,1,1,2,1,0,0,3,0,2,4,0,3,0,1,2,0,1,0,0,0,3,0,2,1,1,1,1,0,0,2,0,0,0,1,0,0,1,1,2,4,0,0,0,2,1,0,1,0,1,2,0,1,2,0,1,1,1,0,0,1,2,1,1,0,1,1,2,0,3,0,0,1,2,2,0,0,0,1,0,3,1,1,2,0,0,0,0,1,1,0,0,2,2,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,0,0,1,1,2,2,4,0,0,0,0,4,0,3,1,1,0,1,0,1,0,2,2,1,3,1,2,0,0,1,1,1,1,0,1,1,0,1,1,2,1,3,2,1,2,0,1,1,1,1,1,1,0,2,0,0,3,1,1,1,2,1,1,1,3,1,0,0,1,0,1,1,1,2,0,1,1,0,1,0,0,0,1,0,1,2,0,1,1,2,1,3,0,0,1,0,0,1,0,0,0,1,1,0,2,0,0,0,1,0,1,1,0,3,0,1,0,1,0,1,1,1,1,0,1,1,2,0,4,1,2,0,3,2,1,1,1,2,0,1,2,3,0,1,1,0,0,1,0,2,1,0,2,1,2,1,0,0,1,1,1,0,1,2,1,0,0,2,1,1,2,1,2,1,0,0,2,1,0,0,0,2,0,1,2,0,0,1,1,2,0,2,2,2,0,1,1,0,0,1,2,1,1,1,1,1,0,0,0,0,1,1,0,3,2,1,2,0,0,0,5,2,2,2,0,0,1,1,0,0,1,0,0,2,1,2,0,0,1,3,0,1,1,0,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,3,0,2,0,1,0,2,0,2,1,0,2,2,1,0,2,2,1,0,1,0,0,0,1,0,0,0,1,0,1,1,1,0,3,0,1,1,0,1,1,1,0,1,1,2,0,2,3,1,1,1,3,1,1,4,0,2,1,2,1,0,1,0,0,3,1,0,2,2,1,1,3,2,1,1,1,0,2,1,0,0,1,3,0,0,2,0,1,0,1,1,2,1,0,0,1,1,2,0,1,0,0,0,3,4,0,0,1,0,0,2,1,1,0,1,1,0,0,0,2,1,0,1,0,0,1,1,1,0,1,2,1,0,2,0,1,1,0,0,3,1,2,1,1,1,2,1,0,1,2,1,3,1,1,1,0,2,0,4,0,0,1,2,0,2,2,0,1,0,3,1,0,2,0,0,0,0,1,1,1,0,1,1,1,3,1,0,1,0,1,0,1,0,0,1,1,2,1,2,0,2,2,2,2,1,0,0,1,2,1,1,0,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,1,1,0,0,1,0,0,1,1,1,1,0,0,2,0,0,1,4,1,1,0,0,0,1,1,1,1,0,1,3,2,0,4,2,1,2,2,1,2,1,0,2,1,1,1,0,0,0,1,0,1,0,3,2,1,0,1,0,1,3,2,1,2,1,2,1,0,0,0,4,2,0,0,2,0,1,1,0,2,1,1,0,1,1,1,0,0,1,2,0,0,0,2,1,2,0,1,0,0,1,0,1,0,2,0,0,1,0,0,0,3,3,1,1,0,4,1,1,1,0,1,0,0,1,2,1,2,2,0,1,1,0,1,1,0,0,0,1,0,1,1,1,1,0,3,2,0,0,2,1,1,0,2,1,0,2,1,2,2,1,0,1,1,3,1,4,0,1,0,1,1,0,1,1,1,1,0,1,2,1,1,0,0,1,1,0,2,0,0,1,0,0,1,2,2,1,1,1,1,0,1,0,0,0,0,1,3,1,1,0,0,1,1,0,2,0,0,1,1,2,1,1,0,3,0,1,1,0,0,1,0,1,2,1,1,2,0,0,1,5,0,1,1,0,1,0,0,0,3,3,0,2,1,2,2,0,3,1,0,0,1,0,0,3,0,1,2,3,0,1,2,2,1,2,0,3,2,1,1,1,0,0,1,0,3,3,1,3,1,1,0,1,3,2,0,0,2,0,2,2,1,1,0,0,0,1,1,2,0,1,1,0,0,0,4,1,0,2,2,2,1,0,0,1,1,0,1,1,1,0,0,0,1,0,1,2,1,1,1,1,0,1,2,1,0,0,1,2,1,1,1,0,1,0,0,0,1,4,0,2,1,1,0,3,2,1,1,1,0,2,3,0,0,1,1,1,1,1,1,2,2,0,3,0,1,0,1,1,1,2,1,2,0,0,2,1,1,0,1,1,2,5,2,1,3,2,0,3,2,1,0,0,1,0,0,0,2,2,1,1,3,2,1,1,0,1,0,2,1,1,2,1,0,1,3,1,3,2,0,1,0,2,1,0,1,1,3,0,0,1,4,0,3,1,2,0,1,2,3,0,2,1,1,0,1,2,0,0,2,0,0,0,2,0,1,0,2,3,0,1,1,0,0,2,1,2,0,0,0,1,0,0,2,0,1,2,1,1,0,0,1,1,0,2,0,2,1,2,3,0,1,0,1,0,2,1,2,1,1,4,0,1,0,1,0,0,1,4,1,0,0,1,1,1,1,0,0,2,3,1,2,1,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,1,1,2,1,1,1,1,3,1,1,0,1,2,4,0,1,1,3,0,1,2,0,1,1,1,1,3,2,1,0,1,0]}]},"null_count":0,"last_update_version":397952029915873280},"bgm":{"histogram":{"ndv":2,"buckets":[{"count":962,"lower_bound":"MA==","upper_bound":"MA==","repeats":962},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1038}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952029909057536},"bm":{"histogram":{"ndv":2,"buckets":[{"count":1002,"lower_bound":"MA==","upper_bound":"MA==","repeats":1002},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":998}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,958,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1042,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952029871570944},"p1":{"histogram":{"ndv":1990,"buckets":[{"count":8,"lower_bound":"MDBOUU1FTVpNZ0tadnQwVENUWFRmbjNnS0pPWXQ4RGVHc0xaZTA3VVB1aXlXdFgwRjU=","upper_bound":"MEMwd3FzM1RrNjBVRmFLVzBYM2lSd1pMamt5azlLUkxWUmVNRFByc3JuZEtp","repeats":1},{"count":16,"lower_bound":"MEhINFNBMVFEZjZQ","upper_bound":"MFZZUzIyQw==","repeats":1},{"count":24,"lower_bound":"MFdmWmwzY3VkTk1KNEV1aHNRbXhqTTA4R3p0SnRFdkIxeVprWGVmTXNjcGFHSFBUWEtia0xOTElRZTdVTTJw","upper_bound":"MHNCUjY0c2N0enZhSHBpQWs1SmNFR0tLTU15Z0x6WGs1MG5CaG02","repeats":1},{"count":32,"lower_bound":"MHNCeVNmQkdRZGh2akt0c3k=","upper_bound":"MHZlTw==","repeats":1},{"count":40,"lower_bound":"MHgx","upper_bound":"MTEwYWhBcFRPUkNlWTFRVld3bXhBTmZvMEFDS2Z1VWFhcGpvaA==","repeats":1},{"count":48,"lower_bound":"MTZSazFrTnU3aUgwSDdHYjZUbGxESDdST0VlUkRTS3g1Q2pxaUwyRTRnQ0ZWTg==","upper_bound":"MUFXUE5LYUVTNXBNT21hUHJ5czE5","repeats":1},{"count":56,"lower_bound":"MUVGd3dobDFKbVE1SnpUNmJIV1hWUGoyZ1lPaExYNEtrVk5w","upper_bound":"MWFUQkk0bnVwOWhQcmxoU2ZS","repeats":1},{"count":64,"lower_bound":"MWR6Y3hRclNZTU1DNEI4bU5jU05wY21BeldSVVM=","upper_bound":"MWV6bDBTWlBKaExFd0tHZnczTFFvUElseEN6c0J0OXdQR2VsZ1hSOXRob0l5ZEw4ZHpZS054REMx","repeats":1},{"count":72,"lower_bound":"MWZlRzRMaU9zdTlUQWdyVk9ReEt3eENYSFdBVldaSDNhZEdFQXlCazk=","upper_bound":"MW9DeDBGOUczREVHazVRa2x5Tm9hb2JQZlo1eDR4RkRib0Z6U016YVQ5WXdFN0I1UVM4N0l1eTZsbXFGaHZqeg==","repeats":1},{"count":80,"lower_bound":"MXA3","upper_bound":"MjNtR2pxSFdzNkxRb2ZaVkVzNjRBT3oxdzdYZ0lUeFJ2eGdpT0ZLVUtuUFRQWDBCdUlsWVg=","repeats":1},{"count":88,"lower_bound":"MjZUaGl4SEJwOTF1TDdVMmFwUg==","upper_bound":"MjlEZDlsRnZnV092VjNsb2s2TW1Id0FQWDVxajRkNmx2S3lIRFlrUzFlSGRkUEhHZnNkZ0tXcFZvaHA5QVVJ","repeats":1},{"count":96,"lower_bound":"MjlJT3k4bWdLckEzUVFrUURjQmlZSmxZM0NlT1NOZHdoRQ==","upper_bound":"MkZwcUNm","repeats":1},{"count":104,"lower_bound":"Mkd0ZVpWYnEz","upper_bound":"MmZaQlYyS0JIMkVsZVB3Y0NtQnlIeTFDQVpqSGJQQkZtbHA2bk9WTFRs","repeats":1},{"count":112,"lower_bound":"MmpLb0pDZjNFVWtxaUU4TE9JVGp5NFJOQkp1b2FPZmtE","upper_bound":"MnlPdE82QWdQTW9ROHdBTUZsMEFLSmlGNTh6QzBLcEQ5cmRTOUF0bW9VV0t4UWt1","repeats":1},{"count":120,"lower_bound":"MzJVRHFuWEkyckU1d2Y3R2RoTHNlMXVG","upper_bound":"M1Zyb0F4eXVENHZUQ2hEcTdNczN1VGxuRlBQeHhRc0xSNzJVbVRWTFd0M3M1Z0hmZmJBRnd0","repeats":1},{"count":128,"lower_bound":"M1doR3RjM1ZEUHVyR2hqQlBPUlNnUFNCNHJKb3dQYjkyWlR3U0tVblZNS0lmTzRl","upper_bound":"M2N6UEZ1NWEzeXNMVDJsaGlGTzZ0MW0xaXNqZUN3RWtmckllcHhMNk5qbVRu","repeats":1},{"count":136,"lower_bound":"M2k=","upper_bound":"NDJVUDlsSm9RMlR3YU5oWG13ZWZvckNsQ0pYVnk5S3puY2s=","repeats":1},{"count":144,"lower_bound":"NDQ0Um8zMFhIdjdiYUIxaVRqNw==","upper_bound":"NEE1QkZOdVBCM0dqaWlyclIxWk5YZ0Rsd09qVmNaS3I4QVY2dWk=","repeats":1},{"count":152,"lower_bound":"NERIRXM3Ym1lRHJGa3p5anMwMWNMZ3RNUFNWeHk3ODE1dnhneTZFSlhvMnc3","upper_bound":"NGRCOXdHbDluZHNPd28xVWRiVVhMd1Z4T2lxMm9OVGdMQTBOdkNqZGxPdHRyS3hBdHlPYXIzYkNKSHFJQTI=","repeats":1},{"count":160,"lower_bound":"NGhOYkVPckNtQjcyOVJzZm95dA==","upper_bound":"NHdkSEFROEtJTkU=","repeats":1},{"count":168,"lower_bound":"NUVVYXFyOEZrdnRJVWk5ZXU4TWQ0dXAwMDE0cE13d2w2RlFKZG5ka1dxbUJ3UXRJR1hOUnZneFo=","upper_bound":"NVBZOFd2c294eTh0VWJ5ZTFmS1JPb0lHZlVTdDNPUVl5","repeats":1},{"count":176,"lower_bound":"NVY0SkIydjJzM1dpcHVRSVdsSURwbjZYdEMx","upper_bound":"NWpSNjBuOWdtWW5EWVp1VVVvcXBIZTg0UHhFVQ==","repeats":1},{"count":184,"lower_bound":"NXBlV1JjcnAzWjUx","upper_bound":"NXRyQTE2aWw0VThxTGo3VWMx","repeats":1},{"count":192,"lower_bound":"NXZvcW5EQ3N2bVdMQmdqVTVGSU5lWnkweWtEdm9VVTZzWHF2aDNLTzFHUA==","upper_bound":"NkZ3WmhYUld1RjY1Y0lnUDVxNVc4Z2VyY2NYaUt2cExEQW0xS2w5ckZTd1BxdGJlS0x0UllDVzZuRGs=","repeats":1},{"count":200,"lower_bound":"Nkh6WFVGTHZCYXBqaA==","upper_bound":"Nlk=","repeats":1},{"count":208,"lower_bound":"NmNv","upper_bound":"NnJVUnJVWTcySTZEenFaZ3V2REFUbzJ3MWtQbHpNOG12M2I=","repeats":1},{"count":216,"lower_bound":"NnVRMmx3Vjd2OTF3NzYwSDdUYndHQWphcmlUVzVoNzk0cTNVWVNy","upper_bound":"NzNsTTJwVXFpd0U1RDllUmdhNUgyUW5HRFp5cXU3Y0ZBdnE3Z0ZrdVA0Y0ZJY1dBTWZwdmNkMVpIU1RSMm1Y","repeats":1},{"count":224,"lower_bound":"N0VjNVZWMjMweUhWUVphVGo4VVUycWgySmMwUG5OYVZkVm9YOVVCYk1KMnFSeXVyMzNtMGI3Y1kzS1U=","upper_bound":"N0k2OWVSRg==","repeats":1},{"count":232,"lower_bound":"N0pJT050","upper_bound":"N1I0M3dHNlh6S2xBempiUE8zSE5taHZEdXpPZWx5MUZEdnlzQVNPTjZa","repeats":1},{"count":240,"lower_bound":"N1RnRm53bjFNMmdYbGNqZW1jQ1ht","upper_bound":"N2Q5WHNDbkZSckVjbFhLZUFJWG04MWNKRW1EU1VXaTNudUpOSGFodW9DczJnS0wwVWw=","repeats":1},{"count":248,"lower_bound":"N2VQQ1ZmZUhIN2ZteGNzWnlGaTdJVW5CV00wb2RZMXgyVE8xdWpxNVFVNmpNcHZqUUprMkVwZHR3eA==","upper_bound":"N2pOdVBHTjl6ODBNSEUzODlZcVFnbmpQejZCVHU2MTZpOERqNnlqaGNIclhLS08wYmdPakFieE9aOWpXdQ==","repeats":1},{"count":256,"lower_bound":"N3A5bWNDbjV1VGd2VzNuU2hOV0RPREw1bG5qdmRaWGZqM2ZsdEhEck1QanUxc3E=","upper_bound":"N3lQdnBqeEZuWjJoVjE1Zm5FSmMxQjdHVmdKU200TkhvSUVaUlM4MWl3Sg==","repeats":1},{"count":264,"lower_bound":"ODBHZA==","upper_bound":"ODdSNEc=","repeats":1},{"count":272,"lower_bound":"OEpYWElNSndmNUdLcE1yblEzZFVIUmQ2YlJZ","upper_bound":"OFBBRkk2WVZmbXpPZlQ=","repeats":1},{"count":280,"lower_bound":"OFBJbnF0dE93c1JQUFBGcFVIMDlqRkcxeWx1ZVJVU2sx","upper_bound":"OHJlNGFaTWp5ZGRPQkhVNks2UlU1cHNrZ3BCd1U1dTU2YjJUaWg=","repeats":1},{"count":288,"lower_bound":"OHMyQm1hOFNKS1B3S1FsYnpDdDd4MzVrNXRrQk5odg==","upper_bound":"OHdDVG1hZTlrU283WDFxZ1lRNkFLME5ORkRvWThqTjlaU1lMMU5JclNvUWpkalpiaGR5czNUSlhkdQ==","repeats":1},{"count":296,"lower_bound":"OHduOE0xVkVjVWVtdEREUnNzdkltQUp2WTZDdUtRVGtGRzF0blN4a08xOTc4Nw==","upper_bound":"OTNrOUVKVDNhcjJsR2Ftdk5OUVRaN1pDUDBqbDlMc09KeVBQWG4xWnBjUjBQY21raW9GUXpUTw==","repeats":1},{"count":304,"lower_bound":"OTR0UVl6S25DVkhjakpYYmZFMEpKZjVqTmI1ZkFtUVlybVY2a2lNQ1VjQTgyWXdH","upper_bound":"OUQ2R2hJbk0=","repeats":1},{"count":312,"lower_bound":"OUV4VVBtMzBtaHNjOWtJbkwxTVBKS0F0bjFtb3FDR3dseXFnbXRLNFdhMThBb05VbDdhWmEyMzh0Rm5VZg==","upper_bound":"OVI5NEt3endKbm5KV3UzMHltR2lJNDh0QW1zdXNrVFJ2eDdCdG1RVEFQYlg3Y3FHSklGNGQ=","repeats":1},{"count":320,"lower_bound":"OWJ6TmQ3M1o3NVp6Q1Z4dXlRNXRxVU43RUE3Zm9hMnprS3lYUzFQ","upper_bound":"OW1FWExLVXZONEtVZDBTR21ZbFhNOXN3MVNiZVI3TmZ4TmlFeTN3RzM=","repeats":1},{"count":328,"lower_bound":"OW9PbA==","upper_bound":"OXlnSG9UMVhu","repeats":1},{"count":336,"lower_bound":"OXpkdGJUMGRKcHdtMVNIdFVxZTFTYTFYa3VvdWFQNlZRQTFiQjk5RFNBa1RJb0JHbnlycEhBSk5x","upper_bound":"QTNVTVc0MENZeUlrRXRaaDg2cEpGdTB5b2N3Z3p2akxJRFozcA==","repeats":1},{"count":344,"lower_bound":"QTR1b1dn","upper_bound":"QUF6ZlpjY1NkY2ZqQTRldDhPOXlZcVRMcGZ6SjZ3TmJBcmsyQzE4a2RKbFpOQzJ2enk0Tw==","repeats":1},{"count":352,"lower_bound":"QUI1S29DOE9pT1BCQk56RDBKZHhhT3NnWVRUV2tvMUZLQnNR","upper_bound":"QU94ZjBp","repeats":1},{"count":360,"lower_bound":"QVJlOW9hVWRqajAwOUU1blg0U2J4S1NaZ291WHhPZA==","upper_bound":"QVVjM0R4V1BSV3E5aXB2","repeats":1},{"count":368,"lower_bound":"QVYzU0JINDZseHlNQzFHVWdiM2I=","upper_bound":"QWl3bg==","repeats":1},{"count":376,"lower_bound":"QXhMd3JjSTJ2VDllS01pVmhaOHNjT2Y5MHY3Nmc1","upper_bound":"QjFLS3hEbEE3QXdoRlk2S0VVWndlZ1hxd2J6QUVlN2NjeDUyR3FYbHozZ0N6eHNJMkw=","repeats":1},{"count":384,"lower_bound":"QjJpYnRUNzY4SXl4Q2NpQm4yYlF3","upper_bound":"QkVYUTNJVGIyMHFhYlBPUw==","repeats":1},{"count":392,"lower_bound":"QlE2V2VZ","upper_bound":"QmM2eWR6ZVBoSndzZkFOWGNENWJxWWhWdzFDMXFTaXlBSEY2","repeats":1},{"count":400,"lower_bound":"QmNjclk5N0J5dmxMd1hHd052R2hQS1U4eTB4TDlvaXZIaElNOG81UW4weWRPVTZGTUtqQXpnQkM=","upper_bound":"QnBRRHZpbzZtQjYyQnRwbVJXVEJ1UHhkaEJXMXRidzhkazB2OU5WbFBsWW1ERlgzcg==","repeats":1},{"count":408,"lower_bound":"QnJQS1BPZ000VUlhenFkcFYycFRiOTJJQklLV0Y4anlvOUkyazBadnZU","upper_bound":"QzJ0aENCaTNrYXdPQkR6V280b0QyNkZIVmtIUVVWTUVaZEU1S3hQ","repeats":1},{"count":416,"lower_bound":"QzJ3WGF1ckNxVVIxOEJYUg==","upper_bound":"QzkyM1cxT1pqeWV3eUZmdTVpWGta","repeats":1},{"count":424,"lower_bound":"Q0NoTFk3ZW5veFJ6T1ZGM1Z5QWFLZ21OeU9SMDZlMUJYQVR3bjdlNjVzYXdWUllMM2N4cThYZ1I=","upper_bound":"Q0h3a3VmZVZSM25McA==","repeats":1},{"count":432,"lower_bound":"Q0k0RnVSdXRFbEtxNWJrMDc=","upper_bound":"Q1ZMcFRKQ0w5N1hUb1pY","repeats":1},{"count":440,"lower_bound":"Q2JDUlZvSHBCMHZ3Q2JmUHBNdkNONVBjMzZ0M0VMMVFlMDZ3M201SWJL","upper_bound":"Q3BBeVV2SFFSSFAwSmZhRVVKb2daOHEzNVFtZHNOdGlDWGh4NEhDMG5YTDRGQ2dmUzRw","repeats":1},{"count":448,"lower_bound":"Q3F0c2o0VjJKa0laQmxRa2NIV0xYZExhWmJNZGlxVlBDSGo3Zm9VaVdLUkRJZTQ0Zw==","upper_bound":"Q3VFd1JsM09DSXFmSw==","repeats":1},{"count":456,"lower_bound":"RDNTOU9nZFhYejJhZ2MwWVZGYkk3b1JiN1E=","upper_bound":"REJFaWttYVFrbVVPVmpYSVJSRklpRzNxWEpSMDFnN00zVzFKcHZSY2lkdzNHdEM4Q29vaUJHeQ==","repeats":1},{"count":464,"lower_bound":"RFJUSlJFTExXTkY5aXpzQ0Fs","upper_bound":"RFliY1k4Y2lFUDg0NHdPQUIwRG1uU3U=","repeats":1},{"count":472,"lower_bound":"RGNoTDdicUhqcWNGd0dkZEhEYjJJVXJOVmE0","upper_bound":"RG5IWE9sVnBHZDM0UjJLZ1BKcFU1OGlkNGlWMlQ1UjcwWkt3aEtBT2EyUDMyNXhVS0hkckJibU80SlJobG1j","repeats":1},{"count":480,"lower_bound":"RHFLd2x5aVpEbmtLSFNKTUlYellsd3BKV3RyQVI4SXowVmszbDBTSkRtdUNERjk4QWlldnhKV0gwaA==","upper_bound":"RTM5NG96Y21KTXN0QUVXRGIxMWtjMzF2UGVrNjd1aUFlazh6SVhaTGtJQkdTSDhraURaTEZtMGg0NUJJM29Q","repeats":1},{"count":488,"lower_bound":"RUJjY2Q1YVYwWm91OXQzS0tkbXZqZQ==","upper_bound":"RU00VXJsNzBGcTl6dGJvRlRYMmNuM1haOU1TQVhac1Zkd2lQTlp4U1o0ckk4QUU2YXJYMzEyS0Rxb2Y=","repeats":1},{"count":496,"lower_bound":"RU16S1dsMDNEUU9ST0dqVllQOHgxaFNvZFg3eHFpTENoenhweFBuYlY0MVFzSA==","upper_bound":"RVBrODVVNGljdmR4WFl3TzlBWno5","repeats":1},{"count":504,"lower_bound":"RVFPcm80ZE5STXlHMHE1bjY4RmNlVzk4Ym00SlNQMkN4S0RtdXpLcmpPbXVRUVNZcm50Y2VzQQ==","upper_bound":"RVpOd285WHVjeTdDdzhCMmFRZDFFOTBJM1FCWWlXZGxwa1RHWGg3UjQ=","repeats":1},{"count":512,"lower_bound":"RWozbjBiSXVxTU1lcjlLUENlUllZMHFyRE5ENE8=","upper_bound":"RXNpeUtSdTRR","repeats":1},{"count":520,"lower_bound":"RXQ2YmpGdURFVFlDeDhadVdOd1hyYUo2am9DRVdVWm5QUlR1VWZhZThDQ0hVNVBudVlUQTkwRU1UcHpCbU5UaA==","upper_bound":"RXZ1bjRSRkhkZzY=","repeats":1},{"count":528,"lower_bound":"RXdIUFplSHNPc2dXR01vMDlvQkZFRUZxeU5UQVNGanFHS0FoZU1NVWtjWm9ZTjVSS09GOVF2WGpiSQ==","upper_bound":"RjZyVkxhaXd2NHJBbHpDeWV1VzFQZ0RIRVpmbVJE","repeats":1},{"count":536,"lower_bound":"RjhiMHFPZ2VVakhhaHlLNG5TOXhMQWV6bGEwb3d6TmpCZW4wOEJqVzQzcjFDRXJJZw==","upper_bound":"RkpFRVBjbTdKZExLcVFKTWtuNHE0SmxkR0RnZFEwY3NVYmNEcGo2Z2s4OW8xczJvWVA=","repeats":1},{"count":544,"lower_bound":"RkpIT2pIN2lFQ0lqSlJseUlOYmwxT0I2VFlI","upper_bound":"RlR4RDZZbnVWbW1OY1pCUmRheFRJd3NxWFpFV1JUS0IzMDlMcTN5SEVUU3BrWERG","repeats":1},{"count":552,"lower_bound":"RmhQbTNmbmlpdkdIQldabGZIUkowOTRJS2tTenFVQ1NWdGxTN3h5YThQb2duZXczdw==","upper_bound":"Rm8wdEhNVmsxbXo4MzJD","repeats":1},{"count":560,"lower_bound":"RnB2ZDV3Y3hnTlE4V2ZQVkRuMVFQMUY3ekkzVUFEaHdRb1kwMVR2OXlZSjlUcVZhc1ZqT2dlZVdL","upper_bound":"RzJFbWg0ZzQ0ZkhGSERpM1prR2dWWWJBdlI5bXlrRVM5cTYxYjZOOFBBS09ES0Mw","repeats":1},{"count":568,"lower_bound":"RzNhcGtqRHFvb2JLZHdFYlhJRG9JOE8yaXk1MkRwM1pTcEtwMWVOS3h0dWpJbkozMTV4bkRJOQ==","upper_bound":"R0Vwd1pVTmcyQVhqMkNwbEdsNnlTRFZPZFBZaWNFdHpjNTBrdw==","repeats":1},{"count":576,"lower_bound":"R0hT","upper_bound":"R1dx","repeats":1},{"count":584,"lower_bound":"R1pMU0N0TXNHU044NEQ1cHAxRw==","upper_bound":"R2VBMXdzQ25CMmlaNVNjcE83VnVxa1FIbGt2QkJzQXlUUkNUdU51b1M2Ymhka0VUOWp4SGpuZ1BQbQ==","repeats":1},{"count":592,"lower_bound":"R2ZJU2tCUGlOekdZRGdNckhzSE4=","upper_bound":"R2o3ak5SY2toazZ3MUw4dkh4cEJmc1JDUQ==","repeats":1},{"count":600,"lower_bound":"R3p4OFVLYmxsek11ckRqYXJwOW00bm9HUW9wR3I=","upper_bound":"SDM1Y1NSRFFhVWlKemdvakR4ME9uQWVZNFlJb2dRajNvbFVsMWpuODRITXFQU3JwUjREQQ==","repeats":1},{"count":608,"lower_bound":"SDQ=","upper_bound":"SDZOcWRkNEl5SE1FYkxUVG5MaVhObHdSQkxocUhlcg==","repeats":1},{"count":616,"lower_bound":"SEN6Zk9LNWE1Z3ZONE1oTTJiYTR3QTAza1Zyd0dJaUNPSkFoUjVOcWtORzNldTlXQ1VPdVUyMmhndVNxSE0=","upper_bound":"SFZRcnRwQ2VpS3ZUdTh6N0s5RU1hSHlyeGtlMnlyWlE=","repeats":1},{"count":624,"lower_bound":"SFcydU9RV1ZQQVRHMFVHMnZuR3VOV3NTODh5U1FCSW54ck5rR1JyMEJPRk1tdERGdHJibWE1VWw0b0k=","upper_bound":"SGxFQ0VyMXkyeUJHT2VFa0F6UDV5MFphRA==","repeats":1},{"count":632,"lower_bound":"SHBRRWx6","upper_bound":"SHlZV0NSSUdBSk9nRVZESjZiVDhYNkJx","repeats":1},{"count":640,"lower_bound":"STk=","upper_bound":"SVNnY0dkamFlRXZVdG5PWmlUZ3pBcFU4MW1IM2R4ajVDeWxpRnQwN1ljTGZKN2pO","repeats":1},{"count":648,"lower_bound":"SWU2NFRaWWRuY1lkTVBraDhtV3I0WnE3QlpOd1pJMXNCaDBTNm8=","upper_bound":"SXRjUEhyWWo=","repeats":1},{"count":656,"lower_bound":"SXZaYlZyZWlTd2F4THdoUWdSdEFvTlJ0THVE","upper_bound":"SXl1bFFCdnlXaFROcDlQVHJZOA==","repeats":1},{"count":664,"lower_bound":"SjZuMDFnd2ZsU2NBSVQyVmQ4WldJY3dQWW5xazdKczF6UlBx","upper_bound":"SkU=","repeats":1},{"count":672,"lower_bound":"SkZvV1RKdDU0Q0QwR1Nx","upper_bound":"Sk4xVW1mOHFmcFF3T3paOER3Sk94TVRuRzN5VzVkSDlXSEF1cFJLOXVxSnNmcmkxSkx2VnViYTFUYzc5","repeats":1},{"count":680,"lower_bound":"SlVGNWxLdWxDNFowa2Raa2c=","upper_bound":"SmNOS0RmbjdvSHQ3YlZOdWpydURyMmJK","repeats":1},{"count":688,"lower_bound":"Smdzcko0Y0ZzTDBTbWtyVE1vTFZBMzBrNGlRSkZyVDUwUnhrNk5kZ0ZxZ3diQmZZMw==","upper_bound":"SnZnYlZueW1LdlV0UW5KdUZkMjlhZjRKYWFMTWZhaw==","repeats":1},{"count":696,"lower_bound":"SnhTdVB2TGN3Rkc=","upper_bound":"SnppUFdPNnZ1YUVKYkdnZzY4YmhzQ2ZwT0ViZERNVHMydEtxYWVjWWZoZmNMTjNINjkw","repeats":1},{"count":704,"lower_bound":"Snp2bGNVSGJlM3VVZFBoUllN","upper_bound":"SzZkOVZIN2Z1aFJ1Vk5QSVoxbU1DajRVeHBoZ25IYUp3UmhnWlRxSDBRY0pJRXlyb1RXSkxwd2U=","repeats":1},{"count":712,"lower_bound":"SzZlVjBTb0pvNw==","upper_bound":"S0JwbGZzRVpuek1MTmxFbkV2dGlzQU14dU1vUkMzWXlnZUdsdjNUcnFJelZaRE0wbVVm","repeats":1},{"count":720,"lower_bound":"S0NkTkl6TWpnejlRd082TVRNUmlEUVphdmx0OW0=","upper_bound":"S0dnb3NRbXdKRTFKZHhYYg==","repeats":1},{"count":728,"lower_bound":"S0hsRUh4RGIwYk1Fd2I4dnQ1bmRBOWFpWVR0WU1IZkR2NG53RzczNlk4OXB0Y09ldmJBMlBMZ0w=","upper_bound":"S2FSTVlvSWVIT3FMSUJGZkpPUzZ2cDFuOExoblRPRW9ydHJVZ2NDbEtMOVNvYUttUHU2M2RSQ0I3ano=","repeats":1},{"count":736,"lower_bound":"S2RNVEFvR0FPT084YURoUW9aTjg1bjlHeDhRS3o0cVBaTFE2b0JaOFN4a2YyeFB2WlMw","upper_bound":"S2wwSURWeUsxMGxXYjhCZWlqSFFZUG4x","repeats":1},{"count":744,"lower_bound":"S3J2UURsS29iVFBUdmg5eDlpSVlDOG9WMXBrZlR4M1Y5aExXenNYc3pPNXpxV1l4MnJQeDVj","upper_bound":"TDJReldFalM0ejZRa2cwOG0=","repeats":1},{"count":752,"lower_bound":"TEZ2RHliZXdLSmRxVGc2TEw4bXRVdGVLSE1iZmcwT3ZFOGVrNWIwVzZzR2JyV0NtUjFxUmpna0RaZEU=","upper_bound":"TFBQVXo1bGxKekltYTF6TnIzeDNNbmpTVFJiWXROM0RvS0RqdEtXMzZEVEJiQjRPQkk5NEo4WUJHcEk=","repeats":1},{"count":760,"lower_bound":"TFQwVVlDME1qMkp1TmRIdlJFWHowNE5rYjcyU0NTckdIS2dRMw==","upper_bound":"TGFiNkNlb3lSVVZZOUJnVjZ2UTE=","repeats":1},{"count":768,"lower_bound":"TGN6T2J5OFVlczlNZ2E5OU93T0x6N2xQdXhNQk90U3RBSUw3emtWYUp0NlM=","upper_bound":"TG1NUk0zWXQy","repeats":1},{"count":776,"lower_bound":"TG9zbGtibTFtZDdhN1lkaGs=","upper_bound":"THhuMGNYaTV0T0h3TWtwY2VRd1Ni","repeats":1},{"count":784,"lower_bound":"TTV3NjFMS3hqZGk1Y2xOa3NwQTZ4cnk=","upper_bound":"TUtHNTQ3RDRQQjhuc1BBbTQ4QTc1bmpMMjZiYmdtZWRCRlE=","repeats":1},{"count":792,"lower_bound":"TU0=","upper_bound":"TWVTUXh3d2FwMEFDRFd3blpjeg==","repeats":1},{"count":800,"lower_bound":"TWppOVJYZnNOTUhONUlzdXh0MThsRng2Mkx5ZHpIVXlROVlMWE5pSnV1eGRSVVBRT0t3ZlZCYjU=","upper_bound":"TXFsSEc5VXRmNDkz","repeats":1},{"count":808,"lower_bound":"TXVKVjc3Q0NEaTlOZzNiNWdxQXl1NEFqNHh1Mm9xdThGS0ZhNElFSnlQRGFNdUZEVmtNdHAwd1BHQVJEcEQ2","upper_bound":"TjNySTJUMzZoTEI=","repeats":1},{"count":816,"lower_bound":"TlNvNU5TT200MG16TUdVWjdTaGx3dmxBSTRUZzlDMUpjRXF6SHBWeXZRUFoxOHNEWg==","upper_bound":"TmlYN0phdXZzZlAwcFpqUk1mQUNVanQ=","repeats":1},{"count":824,"lower_bound":"TmpINVZsVWZY","upper_bound":"TzVxRA==","repeats":1},{"count":832,"lower_bound":"TzlObklsWXpBSmd6Tm83bnpBSms=","upper_bound":"T0trRkZ0bTlD","repeats":1},{"count":840,"lower_bound":"T1BFWlJuOGZtWjlsVnhPY2pWUzdmbGU4WnJmWFhObTRzeElBcDh5azJ1UERhUjBKaHVJdk9IYXll","upper_bound":"T2J2b0FzZWx5a053","repeats":1},{"count":848,"lower_bound":"T2R2S3dwMGJETHhaaTdXOEwzdDh1ODllUg==","upper_bound":"T2pPR0dsanlsdA==","repeats":1},{"count":856,"lower_bound":"T2p6bVNaNTBaVkJWMTkwYm9SUDhKVkFzMDBvY3FKb2pYMXJVSmR6c0ltMFhMd3c1MFRl","upper_bound":"T3g4TE50Mnd4Y0xzdjVqR3lERkZYb1Y=","repeats":1},{"count":864,"lower_bound":"UEt5dVdOa3hVWER1YnZ6RmhIUG9LaEFPaFFTRldUUkExRXlPNFF6dA==","upper_bound":"UGN5QlpuYldleVZ5RXJXcFk4cHhYbHlvTzZuRjQ5a0NmVklhSVpsbXBhTU9KWHZMSlREZjlmSXhuUEk=","repeats":1},{"count":872,"lower_bound":"UGk4QkNBOXh6SnNSVllDMTF1cVlGalkzazdydWdCOUZGaFF2OGxSYlY=","upper_bound":"UHVRd3BwNkQyYmw5VVlDWXU1eTY2UW01T2I0djdsMkkyOVRQZA==","repeats":1},{"count":880,"lower_bound":"UUlKREV6Y0hLTXc3YVhtZ3VZ","upper_bound":"UVI3bWwzekdWb205Q3ExWlpna2pxc0NXT0NLcUp3enoxbnh0UTMyU0ZvaWxL","repeats":1},{"count":888,"lower_bound":"UWViSWZSNFFKbEdkdUo1bDlZSG1JSDlmMzRxTXlzNENvSDIyZTIwOXNZcEJQTHU1dEF1WA==","upper_bound":"UWw1eHg1Q1UzMmRldUF1R1hlRHRaeThVbG1lYQ==","repeats":1},{"count":896,"lower_bound":"UW0wdWlaTm9lQ0hQd3pXVjRHTFdTeEtTczdNTmk2b0t6NDVtS2FhamJuSWNBTg==","upper_bound":"UjJpTFlUMFNDWHdFRXI0U3JVOXhTUUhKUUpMd0lkUU5YVkl0OHlM","repeats":1},{"count":904,"lower_bound":"UjN5bnByNlVJMXZ6YzVkdDFNaVdXTWFaZjI3TnBmWU1kNGpIaWtDYXAyRDNrYjF1cQ==","upper_bound":"UjdFSjdpdExyc0dmUEFUWTlzREZOQjNXcHRGMktJRkI4TzhiOUQwNm8=","repeats":1},{"count":912,"lower_bound":"UkY4Wkh5YW1FMnFEMjlXZnFYbXNINmNTNTVhakJtNWVRY1lEU1VMUFB3Q1hzc3psbXZXS0h2VFZEaA==","upper_bound":"UmhEQkJ2SjUwQkp2eTdHaDNQV1h0eUszekdEVjZWNXptckJGZms3b3hOWUlWT0dGUXludEttdUlCcWgw","repeats":1},{"count":920,"lower_bound":"Um9IOEw=","upper_bound":"UnFhcGJFZnhqbHZlN2VPMUlKYlpvdDQ5cjAzZldrN1g1d09yNHdFMVJuZnNrb1hhUlVCUk9VeGJlaUloczA=","repeats":1},{"count":928,"lower_bound":"Undqa05qVnh5WHhBa1c4VDREZDVkTURnWU1QU0VGbw==","upper_bound":"U0swdGtOS3FjYUNpMUY2U0NCR3BkMg==","repeats":1},{"count":936,"lower_bound":"U0w3bHpEN3prMUZBeVF3bERTb2JpWENIQkJXOFRJU2lISmk2cDdFek91alk4WkN2bEZQSTdRYw==","upper_bound":"U05nMnI1YUlFUHpmRTcySUJSYXJic0lkM2dOVHExZG5RT0lIaUtsb3VFRXNuaEIwbVdoZWlvODcySEdZZw==","repeats":1},{"count":944,"lower_bound":"U1N3MQ==","upper_bound":"U256Tzdv","repeats":1},{"count":952,"lower_bound":"U3lybHE0c1A1","upper_bound":"VDcweXdYZ0RYTTV4Y3c5N0M4Nk9wV21TdUtBcWx2OUhGNXdLRlNPSUZQaENqdEs4OWgxTEIyUw==","repeats":1},{"count":960,"lower_bound":"VDc0RVJQVlRpQTBheVltREJYT0lPNHhyM3dMZlBvVEZSY2s=","upper_bound":"VElEZ05INTBiOWpLOHM2YXFO","repeats":1},{"count":968,"lower_bound":"VFZ3R2R6elRTSg==","upper_bound":"VFppMGZsZk1pRzFoUnM1blk4T2l4ajNCdDNWNXd5M1RJYjJCa3dxaGo3c1ZlQ2ZzREhZ","repeats":1},{"count":976,"lower_bound":"VGYxWkpZNGhEdWMzaEZyODc1anVteG1ITHFSSnZEb01XV0x5d0R2WnNwZXV4Z3FaQ2JpV0JJ","upper_bound":"VHRPZmt6QQ==","repeats":1},{"count":984,"lower_bound":"VHljQTdCU1dIRw==","upper_bound":"VUJQRlFlOHBJWUVyQnJGbTNJelFvNlJDWjhkbTEwVTlVU2ZKRG1FTkU0MmV3NkYyQXRGZ3pH","repeats":1},{"count":992,"lower_bound":"VUN1TEJpWUw4UWtwN1UwZHFpNHR0bFhjR09INjhnRExMeU8=","upper_bound":"VVNibG5DZnFUODV6ZGF0YVhJV1Zab01oeUNIb3loT0VOYXMzb1I0a3g=","repeats":1},{"count":1000,"lower_bound":"VVRFRFBoWTVBbkJFNmtlOUt3WlpBTUhXcDhQY2pmYVhBbXc0MkdSM09lSUZBNnREMg==","upper_bound":"VWV4MWVTY1VPRG12VlFlTU80NlI5WkREeGVHR05rQ3dGNHlja0lITzRvUQ==","repeats":1},{"count":1008,"lower_bound":"VWhEaXB5NFFjYVd3TUFUS0NnNzY3RUdDVVZncjR5U21GcFlKb1pYRWpwd0xUcW9P","upper_bound":"VXhJeDhS","repeats":1},{"count":1016,"lower_bound":"VjBhN2xDSVVUOGRXSXlOQ0dEcVhjTXVpWW9ROHo5TmlXOVlsMmRtRG5aZk96ZA==","upper_bound":"VkJ5","repeats":1},{"count":1024,"lower_bound":"VkRGbzdWdWpZWUhBNmVDMDU=","upper_bound":"Vk1RSFRrTU8=","repeats":1},{"count":1032,"lower_bound":"VmRIRFBSalBzbTJVOTczazVxYm50cXhl","upper_bound":"Vmp3UlBWRVFER2QyZUl5cnRlUXVIcDFUUDI0ZUtyM0hDRmFTUW5FQzZWbEtBWDQyVlB3RTlVNQ==","repeats":1},{"count":1040,"lower_bound":"VnA=","upper_bound":"VnZtWW9xY0ZueDNFaWQ1ampTTEw=","repeats":1},{"count":1048,"lower_bound":"VnhJcGptYWUxbmpaZ09tcDBM","upper_bound":"VzJKOE5KN0tGWkNMUHFoc3RUb0dqeldIMWFVV2ZNcW53S0tNMHpEUHpGN0dIbmtrYnV3R1pMVzRhbDFWN2hw","repeats":1},{"count":1056,"lower_bound":"VzNhWEZSWGRMdEM=","upper_bound":"V0lVR29MbjlWM3RaaFZiRTBhZg==","repeats":1},{"count":1064,"lower_bound":"V05SdXJ3T1Z4R2xDWkU2WTRIWFUzVTN4bnloWDZSd1NPSmVOOGEzVHBoQXVEWU5YMm1kVQ==","upper_bound":"V1BGOGd1WGZlcUFGZFBFcW1IMnF3dFBPY0FUY280VFlkMEFvMjJGSTRiek9RdXRoUlRXWEk5","repeats":1},{"count":1072,"lower_bound":"V1NMeldTMHNKZEtTa0JZRDF2OXhxWFBRNVoxRHg2RVBnZWZPeUdOSlJqSHdObm1GMmdJcWxXVEJV","upper_bound":"V1Z1VUhKcFRCR0xZeWgyRjJ1d3gySGlVeEU3VEF1VjRMRVluaw==","repeats":1},{"count":1080,"lower_bound":"V1gyd1d1ajZhNHV2bEw2UmtJUw==","upper_bound":"V2VYS2pwSlNIOERsc3RadzNVeHhWREtHeVg=","repeats":1},{"count":1088,"lower_bound":"V2lOMk1EVUM=","upper_bound":"V3ZVbHpHYXZwUU9ycTZ1MW5qeG5LMFlCeURBbjE4Mm5BTFRRMDR2T093TQ==","repeats":1},{"count":1096,"lower_bound":"V3kxbWFjdktvQTBGZ3BDWUZkemkxMm9TQUpOTEtaNlR3YXk=","upper_bound":"WEt3UzBTQXgzZVk5amtVWTdJem9FVmVVaURrdGphVUQzc2JpY0tqSXRSQmthaDZDZzY2MA==","repeats":1},{"count":1104,"lower_bound":"WE1CVkdaREs3TQ==","upper_bound":"WHE4dEZ3Q2JtQ29yTEVLME9XdGZobGJZOXM5MU9OamhrQzhJcVhGQ2s3Q05KbUNZRDl4d3M=","repeats":1},{"count":1112,"lower_bound":"WHlBcGFzajVGMFVrbVV0UDVVODZxVHBYamtOSUNUdDEzejFuYmZpanJybkdjaUN6OHRpZTJVZw==","upper_bound":"WTBDVndSU0tOdWlFTnlTRWU5Ykl1TUtYT3JwSjZFQkg0UmgxZFI5REppZU5FWDJLanMz","repeats":1},{"count":1120,"lower_bound":"WTIzTlU0MU13UWdheEJmMHc5WktLdU84bzhlcnVvdmxzMmhtelZIc1hVMw==","upper_bound":"WTRaR0s3TFpudHdQS1hybGNEdkpMN2pCYm51a1V4bmVXUUxzeGs1TFVxazdFY2hZd2VJbXhQek95Sk0=","repeats":1},{"count":1128,"lower_bound":"WUdJMVpVaE9ja1BXN3p5SDhiUnFsRDE=","upper_bound":"WWZpaENYUlZSN0F6SmwyU1NOQkVi","repeats":1},{"count":1136,"lower_bound":"WWdRTzhPVXRFWlU=","upper_bound":"WXg0aFA4VTExOHZDS1g0Y1Fkb0hFVHNnMWlsRzlwaFVaYXFw","repeats":1},{"count":1144,"lower_bound":"WXo3SjFFRWJBeUx2ajZjUjZNZzA5SVRpejFuRXJvbXpUeWJ1eVFGZw==","upper_bound":"WkEzN2pkYVBIWDNkUU4xaFN1","repeats":1},{"count":1152,"lower_bound":"WkJDVllZRllkN1drOUhwOHZTcjZQUHJJT2Q3RjRIa3p4WEptVGxrM1plNFk=","upper_bound":"WkVYREZMSDVIazZxNnpMSWUwSFNTOHlOMzFnbFNNRlBXSA==","repeats":1},{"count":1160,"lower_bound":"WkczSzM3","upper_bound":"WlBwYUZRTDBPQXVHSEFEdEhqbTNJUkEycE9xaWloQ2lyWVFDWnV6V1BNRThYTkw4WEhUalFpVw==","repeats":1},{"count":1168,"lower_bound":"WlFpRWMwOWpYV21MNmUwV1hXNENzYm9qSWZjWnB2ZlptRHFLOExBMGVicXBJTjYzb3BrbE0yYkZSOUE=","upper_bound":"WlZHeVl4dXkwNnZMWU1DUVliajE0Tjl3dEdndzRWbFNET3RLd2NIRkM1enM1ZE80NEQ2","repeats":1},{"count":1176,"lower_bound":"WmNJUm9lSDdBZ0gyOWREQk9heElsYVI4RkduZTlkUklnY2R2a1NYMVdLQXJ1T1ZKNTV6UQ==","upper_bound":"WnFiT1JmdHhlQ3pzeDVJZWh1emVCZExadkFTZmlOTm1paHc5dmtQYmVsS1JDN3Js","repeats":1},{"count":1184,"lower_bound":"WnJEaHo5MEJ1SHc4TDRVcE5H","upper_bound":"Wnd1SGh6eWR1RFlnTzlxeEZrRHA=","repeats":1},{"count":1192,"lower_bound":"YTRuZnFqank=","upper_bound":"YURLekJHaXNuWVZHNm1DYzVTdDhUNmhzT2E=","repeats":1},{"count":1200,"lower_bound":"YU4wQklwRndHZEVpcEhyR0dJMEppZGZSOG8zUVBsTndma1BJZTBraUJXU0czdk5FRTFFR0ZUVmdTbFN4cFRWQw==","upper_bound":"YWFGcmRQeVgwRzRjZFRjRzJlSzM2bGQ2eXU4Ymp6dFVUYkRVck9GcHFuQ3pUR2FWZ0M4Zw==","repeats":1},{"count":1208,"lower_bound":"YWI1bTNYQlJ3ZU1nSXFrcA==","upper_bound":"YWxXYUZENWlVTmRkdUt0aU04bU9md2lScWl2UUM=","repeats":1},{"count":1216,"lower_bound":"YXN5bVpyVzZPYlBN","upper_bound":"YjNDMG5EaVowb2c3alRzRGxoZExSSEdSRk8=","repeats":1},{"count":1224,"lower_bound":"YkVoUlVMa3I2Vjh6TUw2VmNlS1FKV01mR1hnVkxnZg==","upper_bound":"YktMRkxBR1psTGxiRG5SV3E5QUtpcmRXR1c0a0lCVjVNbTQ5SVd5","repeats":1},{"count":1232,"lower_bound":"YkxCaXJKNXkxeGtsM1BITDQ=","upper_bound":"YlNDY25BZEVGQnhPYmxjOEVGa05tNkxKYzloakZFOWRoM2g=","repeats":1},{"count":1240,"lower_bound":"YlVmS1JabzhnUEh1Vk5oZFNOS0hIMkZNbXM0bnRBRW1sbUZ2","upper_bound":"YmdUWGxxUzJPZmk0QUZHZzJyQ0VKbTZhOEY2R0s=","repeats":1},{"count":1248,"lower_bound":"YmlLRlA5bU9lZDdRMTBPTWFWZzMxTWF0SVlXV29MQm9RWnl4T2dYZWNrY2JZb3RpUw==","upper_bound":"YnMyZTJ0UFJKZkdKNWxsdjdFOVdUY0FvNDNMV3VpbGxxMnEzelF6RjBibnNINHpo","repeats":1},{"count":1256,"lower_bound":"YnNtZEg1b0E=","upper_bound":"Y0NhNGlmTQ==","repeats":1},{"count":1264,"lower_bound":"Y0N2OE94RVZKNm8xa1FXRkJlclozVThBeG5UZFRKcEhRSlBWdXd1bWE5M0hwM1hVSnNGQU8zTFZLUHZTSXU=","upper_bound":"Y2cw","repeats":1},{"count":1272,"lower_bound":"Y2hxMlZRNkNNelVXcThZdW1vajBsUTV2RkhkUXB3MDM=","upper_bound":"Y2s5OVlQOTlwcWRxVnFKZ1NsbjYzMGhTWVQ0Sg==","repeats":1},{"count":1280,"lower_bound":"Y3JNc0Fkank1","upper_bound":"ZDI1UlF2RDhnYkJwZTExVjJMa0dtc05qUTdHWWVLNGwwN1hUcmppcW5FVmJUT3h1RnBBRkM=","repeats":1},{"count":1288,"lower_bound":"ZDN2WHJocVM0cmNGNUN3UXRMZ3Fjc3pYNmRuMkRjZ2R3UzJXQlM1dTJaOGVBeW5nTTFBeWlzdDZmVlQ5Nlp2Tg==","upper_bound":"ZEFvNHhGODZVZkJseVc2bTVMaEc2Z0FGZFJJQVpxUFF6T3U=","repeats":1},{"count":1296,"lower_bound":"ZEV2S2w5VjBSb3Q1VVJzeE80Q0QyTVhGUnVFYmJ6dTU3UmdCYkVIdGpTRnJWbkNUaU10","upper_bound":"ZE1GMzhCczB3VHhBVkI2UmhQdjJsZFpvWg==","repeats":1},{"count":1304,"lower_bound":"ZFJ1RWwxZnd0ZlJoOTlTY0xEUzVPQm9lbg==","upper_bound":"ZGdxUHhGTFFTOUZiRzI0bG5hakVtWnBUdnpNOGx5SHpEWEI5Slh5VXZEUkh5THloOFZl","repeats":1},{"count":1312,"lower_bound":"ZG5JeWVxZDZRanFvSm80cGpRZUtjSmZsNzNwZUtkc2RlMHh5RWhiR2VpbkxOM3F0d2RiWE01M0I=","upper_bound":"ZVBNa0F2ZjhLaHNPUXhhcDBLaFgxVQ==","repeats":1},{"count":1320,"lower_bound":"ZVNIRWFhTmpLY2l3V2Ztc29qUUlLcDVrcg==","upper_bound":"ZWRpMjVtaFhEcTBsQ1Jwb0w5Z2M=","repeats":1},{"count":1328,"lower_bound":"ZWZRYnlVbEFTM2x1WkdXTG9icVJEZm1Ocm1MZ0pSOHRsc0g=","upper_bound":"ZXFqUjU4V3RMcVA2bms4NE1sdWtZS25zU2U3Y0JzUE1Oa1U3Zjk5R1dUTUVtZkk3Wk9FTVM=","repeats":1},{"count":1336,"lower_bound":"ZXZjR3JZdFU0alA3aE81OU1jT21YUXVaSg==","upper_bound":"ZjFoclV5cTY=","repeats":1},{"count":1344,"lower_bound":"ZjNHNFBnZGNKN2tMM3p5UVh1OGVXMlVRZm1kcQ==","upper_bound":"ZkJFVlBsSjM3ZHFRMlljNA==","repeats":1},{"count":1352,"lower_bound":"Zkd0OGd0NEZabEk1M085dnhqenJHU2dzVmZ1U0I2YUdHek9YYWxqWW1NRERYZFZ3QVg2U1pzQQ==","upper_bound":"Zk5BRjlqT1EyTWF2d2xSQmp1VTRuanRMWXpOd3NzTG0=","repeats":1},{"count":1360,"lower_bound":"Zk5JREV5","upper_bound":"ZlBXOFJUTXk0UUNpdHBpNjV1azBKd0NFaE9vS3JKc0VOc0pMM3QzMjV0UmI1aXVIVTM1aA==","repeats":1},{"count":1368,"lower_bound":"Zlh3cHJjTkt3NUQ3MTNlZ3NiUmxKOWU5UHNaZG90c0VGWXhBaUJhdDdw","upper_bound":"ZmYxalFoeXROSTd6dUt1dzJqNFFDZUxkU2MwZFIyOFRtRGs0","repeats":1},{"count":1376,"lower_bound":"ZmhNV2VQZnFNMDdpR2lxU29IcUpDNTRTTzBlbEVIdE9zMmRrM09sUkM3UzBxU2dWdHJLUTN6Y2txdjZKag==","upper_bound":"Zm9oVzNwbA==","repeats":1},{"count":1384,"lower_bound":"ZndnTkNzMnVqWHg=","upper_bound":"Z1pxa01mb3o5NmVtREM=","repeats":1},{"count":1392,"lower_bound":"Z29vR29wczFVc2s2bnFGUjByVllJWk1rZWx6bDJyaDBEU1Qzc2ZTRmoyRjlSZXlTeFVZZGFkeFl5UHZJ","upper_bound":"Z3ZYbE51YzU5cnZYWDRvUHk5RXpIajhYMmVYVklkWXJtUXZPS29sZDk4","repeats":1},{"count":1400,"lower_bound":"Z3dvaDgwSUdjb2JNaFZuTklQN0QzempRSmx4WlUxbHBhb3dQREMwc0dnQjlnT3BRd0lkY09mZFc=","upper_bound":"aER6M05ETzBZbVVLbmxnZHdOODYwcUVCelZz","repeats":1},{"count":1408,"lower_bound":"aEpnYVhGNHF2VFoySjc1WkF5Y3ZYclJpNHRkNDZvVEpsNXR1Z3g2ZU9RWUZyTk91TDBVOVp0WURBcHNEYmpXaQ==","upper_bound":"aFNweXNTOGRTZUJyWWhjVXdKbENHY2lMbVV2bUxv","repeats":1},{"count":1416,"lower_bound":"aFV5aGJDQlR4YlRQSk1qUzFXdm1S","upper_bound":"aGRCV3hscXRYRU9XUGozWHBXMHVlSVBOaWxXaE5JRlNaMTJBYjR6b0RVZmdNeElnZlRPVjF6OG1JeEc=","repeats":1},{"count":1424,"lower_bound":"aHFWU1BtUlQxeWlUU0tWd2dwSUJET25IZ0dBNUI1d3N6aEVNZXdpY1gxMw==","upper_bound":"aHVVS3NWUmRyT1dlOHoySllBdlZZVG40QjVBSkNxV3gyMnJkcUROTmc3YkhjekQ5OXJla2x5NjdM","repeats":1},{"count":1432,"lower_bound":"aHV6eXdzMlBJdTVqQXVtZFJLZnF5NDg=","upper_bound":"aTFLVjhlZUdVSFlQanhFUnZqUllaVGNEdERQ","repeats":1},{"count":1440,"lower_bound":"aTFZY21uZnpvU1dLZlFXc0ZLYnE0MFd2YUptc2gydlp1d1NOUnVVTTRv","upper_bound":"aVFQVndheW1qNVNQQ0k1MFBOcUlYZlNwWkU3N0dZdEI2ZGVyUUh6RmE1WEJseg==","repeats":1},{"count":1448,"lower_bound":"aVZOZURjTjhuMVlmUWl4ZTlodDhQMVA=","upper_bound":"aW94QWhMT2Ra","repeats":1},{"count":1456,"lower_bound":"aXdITUJMbWdpNWlOYnlIT2RVZXpxbHR2anlJaEYzSUZEWVljdVRuVHVtNkk=","upper_bound":"aXpxZ3JvY1lFQU1VdXlScTVqbDk0NUJhMWxtYncxZVg4SXpYMFRyMVgxMW1Ld2lGRXBRbVV2NGdNcU10aXg=","repeats":1},{"count":1464,"lower_bound":"ajJwbWpjZEhUWkRNdXhDb0JJeXNyVXZqdEhzQUxscnNEdzdlVTd6RXVnTUtNdUxycw==","upper_bound":"akpIcXoxdQ==","repeats":1},{"count":1472,"lower_bound":"aks0R2d5QWJkMXhaSVMxOE5sUXM=","upper_bound":"alVJSkdSRTBIbzQ1akZFQ3d0d1EycjJWdWdTbjlaSVFiSGlVS1dIYUhtYzV2","repeats":1},{"count":1480,"lower_bound":"aldKQlFtS3hyWUNEa09CU3RpblppTHc4THRkVlZxcjN0SGpYclJ1VVBt","upper_bound":"ald4QVFWUlBmVWRIR2Z0VWluckVZS0pUNEZNZw==","repeats":1},{"count":1488,"lower_bound":"amZKYnpuNGZUM29jMEZ6OHVqTW9JQnlxMEo=","upper_bound":"a0NnUjRvS3hUTDR5cGhVbFFNYkhKeXZ5eFNHcGkxM1BVVk9JWDY=","repeats":1},{"count":1496,"lower_bound":"a0Zncmo5a2I4TmIyeld1aEd1Y3QybnZvWHkzdzBoUEFXOEhZ","upper_bound":"a090MU9DbERIaTJMWGVQUA==","repeats":1},{"count":1504,"lower_bound":"a1FpUmpaWTNRQ1ZVeHN5dUZlaVdyWW9ZZ3FIQThjWkVIbzZOMjl6TGZvZTA=","upper_bound":"a2RTc3NZbGtLd1BRVXRGYWR5eTA2NFAzQVhkbzRSSzN5TGZJdFpPT1VjVWNjSGJRbFd5RzM4c3lBT3ZHbw==","repeats":1},{"count":1512,"lower_bound":"a2ZONFBY","upper_bound":"a3h0dGJQY0ZEaXZLWEI3cnRZYXhyMEZOTEYxZUU3MmZaTQ==","repeats":1},{"count":1520,"lower_bound":"bDF1MzdWWVB3aEluMjRFWnNDUzZYcUxIZmM0WkZCZEtlQUhGeEZSWHFpUFM1NFNCV0lqenh5aDR5eFowU2tk","upper_bound":"bDhzalI1WHZiazIxcE9uNzYwdDVXYk81SU9DUnNQY09PdjR2d1cySnJFYlpzbXpOT2d6SThXSk1tRDhTejJI","repeats":1},{"count":1528,"lower_bound":"bEhNb3hybm9qdjRFZEcybk11QWpGTElWVDI1aEI1cGRzcURKekF4S1VxcHloa2NBa0g2bjZBS09R","upper_bound":"bGYyQVBpZVNCZjNmNk83cm5iaVRmbGc=","repeats":1},{"count":1536,"lower_bound":"bGZNbW0wbFo3dGhYazNqSk1JOUZjU0VpMUhlTGhlR1pXNnBkODk=","upper_bound":"bG53cTBoS2M2emFhaHM3VFdBTEcxQ0VISklVejUxMTNxQkNsS3FvOXIyb1haVVN1ajBVN3RRb251MDdWT0xXZw==","repeats":1},{"count":1544,"lower_bound":"bHB3U0UzUGpkbDB0S0VKWlNPN1Q2VzhLQ2Q3czF5b1RadHhIdGQ0aHhP","upper_bound":"bTlWUUE=","repeats":1},{"count":1552,"lower_bound":"bUNhdk05NVZLdjlsZHlyRVluRElSdjFNQWJvNmNPcnJO","upper_bound":"bVRuQTkyZA==","repeats":1},{"count":1560,"lower_bound":"bVZIUlVhdWR2d2RlWHhSUllE","upper_bound":"bWI2YTY5ajJ3R1l2ZmdldFM2TFprNXZEVmQ4dGpocEtmdnRKaXdjSmtOc2tCd3hTUzVDZDM1d0c3elZTb2FR","repeats":1},{"count":1568,"lower_bound":"bWJMR0JQZ1M=","upper_bound":"bWhhVHN1VDZ4TU14WHNNMFVoa2l1UjhoWGx4dFU2Y1VoRnA0QnluR3hQ","repeats":1},{"count":1576,"lower_bound":"bWlkQnNzVjEx","upper_bound":"bW41cmRzNUY3Zg==","repeats":1},{"count":1584,"lower_bound":"bXJsazYybTFMVk1PQzEzSnVvUWlSUlo5QXlnTU1pU0d3VDhIanRkVzE1Mk4yWkc=","upper_bound":"bXhYVzNKak1jVVJzck4xRzhpZWJWck9TSWhLejJwdnczNks0SXdvSUFJdFh6Mng4Zk81b0lMQXpl","repeats":1},{"count":1592,"lower_bound":"bjhRT0ttSXhoNWFkZ2xGR0ZFV2Ns","upper_bound":"bk1kSzZVUFIzS2ZPUU5hZlh4VkJRQ05mUjJ2VUhQSFNUaUhBVnJ5WG1MN05qczY0N0pVRTVLZQ==","repeats":1},{"count":1600,"lower_bound":"blNDV2loS2NDcjc5cVRBVTlDeg==","upper_bound":"blpET3RmVmx0UHZ6Skxxbmp0OGc3VklTcw==","repeats":1},{"count":1608,"lower_bound":"bmM5VUU0REx2WTVVRm9MUzN4QmxQODBoMXF5Tmg0MTlHWTNjdHlVT3hxZ3dvbDVVNlNlbmZ2SVd0","upper_bound":"bmtWb25CMm80d0NYU3pNNkpuUnlsRjE5S2J3YVBzTGlPa3g1U1Q=","repeats":1},{"count":1616,"lower_bound":"bm4zZFRDbg==","upper_bound":"bnVTdndxR1V5V3hZaDhscVp0TXp2SVVLY2Vod3RIcXFROXVoclRoQngzZzJiSzVVRnROeU9DdTlT","repeats":1},{"count":1624,"lower_bound":"bng=","upper_bound":"b0RxbnIxMjNGZEtNdERGa1lYWmpBZTlBOUlMNQ==","repeats":1},{"count":1632,"lower_bound":"b1ZBWVNpZ2t1NUdCZ2FyelhzdDBUZEtkdXNGRzRISU9lY21ldGpxUDljTElXcHRnRHBqVFRSSXY1ag==","upper_bound":"b3B6eXg=","repeats":1},{"count":1640,"lower_bound":"b3FMMUNvQkxqWWFpbFdCMnFnN0VOSkNEMUJGUW9HV0ZTb2tEVg==","upper_bound":"b3V5UGRHRDJlRmtNQXJETE4xUUtzNlM=","repeats":1},{"count":1648,"lower_bound":"cA==","upper_bound":"cEZuT2F1NkFxZkp2YUE4VG1KYU1SRXMwbVJvNjRERUVo","repeats":1},{"count":1656,"lower_bound":"cEgwNDJuQUNRR1dMWjBiTE1DS01raGRrSDFpTG9GOWsxNTVNYnJGWWJteXVnT3Vp","upper_bound":"cTlIbnFxWVlmWU9RQXlNN3dTQTNvdm9qRG9HeFVBYnVQcWZpczBENWU4cmE0T0hpdkI1TU4wT2c=","repeats":1},{"count":1664,"lower_bound":"cUN4VlpXS3hiV0o=","upper_bound":"cUo0M3Awd0Q5TVp4blo0VXJVTXNj","repeats":1},{"count":1672,"lower_bound":"cUtCZUc3TFIwRERzYkJ5Zm9KV3psVkZqWmFEejgwV2V2YlYzWGNoNHZwVHhZYVdMMHVoSzBaM3pnMg==","upper_bound":"cWJnaXRDTWQ2WDJuR1VCV3E5VXl3dA==","repeats":1},{"count":1680,"lower_bound":"cWhKVWVBU084QmFKZzBlRmVUSjFoMVZNbVVWdkZWams2dm5WenRhanNoRHBRelU=","upper_bound":"cXBJRDdscTZZZkJGUXRzYjA5NWhRMm1yM1piTmhSdEk=","repeats":1},{"count":1688,"lower_bound":"cXMzNHhSaGNuT280VjBkVnRTZEtPVGkyS0NPWUJNazBuVjB3ZjJoZlJWRA==","upper_bound":"cXdia2R0eDN1akM1NUVEc2hab2c5SmlqTkN0ME5sZ2dGVQ==","repeats":1},{"count":1696,"lower_bound":"cg==","upper_bound":"cjU5Q0s3OE5qZU1Bemh2aFcxWEF2TmYxWEpNWUNsVUVtUTdYejFGWEM=","repeats":1},{"count":1704,"lower_bound":"cjc5WU1wbHlTa2Q1bzdlY2IyZlBES2dpZkN1OFk2Mng5enFTMnN2Zk1BSzdITDNrQw==","upper_bound":"ckhGdXhRSUMxY1NPcVF5YUFVTDFoMUFkNFdyQ3RnMnNFVThlZ3k0V29CSjJycFc=","repeats":1},{"count":1712,"lower_bound":"ck1tTVJISk5ablpDMHRyWkVjUW9NdVhtQWw0Zmg=","upper_bound":"clg0eWxxOXFubHE3TkNmR214NmtINUVaRnNrRFpYOEdiZHNzdnBObUE2NnUxSmZPdDQ=","repeats":1},{"count":1720,"lower_bound":"clhTbDk0WnNwUnF1dmtIeFpxdGJKMnk4aUVJS00xWktzWFI4S2IyMXZObERveGNZQzRyU0pGNldjcDVVcA==","upper_bound":"cmx1SnNyR3ZMNndSeEppUWZDNXFqZURwejZHeTNKQUFvUENSSkJZazJUMnpGUW9vSFBDUEd5TEpadkdk","repeats":1},{"count":1728,"lower_bound":"cm0yOXQzMTFvaGt4Wk9nVGxTUUJtdEtR","upper_bound":"cnNMbEVPRzFNR2RMdHE=","repeats":1},{"count":1736,"lower_bound":"cnNueHk4U1IzaFpZdzZWemwwVQ==","upper_bound":"czNRVnM0VXNmOHd2TnZYaTU4UkdQS2VROG8zaTg5cHptR3NrbWhHanN6ZThyaDV3Szd1","repeats":1},{"count":1744,"lower_bound":"czQwZmd4NzZKamJZYVN1VDhRRm5pdmg0ZmNuVVM0MWlKVnhzbVd6Mw==","upper_bound":"c0M=","repeats":1},{"count":1752,"lower_bound":"c0lNSVV4bGt2ZVhLMUxFZ3YxcXRuWHdHWjI=","upper_bound":"c0t5SA==","repeats":1},{"count":1760,"lower_bound":"c1B4RGxuZXY=","upper_bound":"c2VtTDFSZElBcFJhcUpVaU5RZkNBMmkxdFdER0JZ","repeats":1},{"count":1768,"lower_bound":"c242NTY5WlRnRVRnVjl4cHd2TkpCMkpIU3RjRU1WVUVCYUlQTkJ1eEZjZFE2emlMVUlUNUxDeWNpcHFsWjFl","upper_bound":"dDFGdXYzRU5QODlhQm9uNkpaUlhzUw==","repeats":1},{"count":1776,"lower_bound":"dDFubE9xb2VBWFcyQTFadE1oSHlQaXVBNGtiWjllQlRV","upper_bound":"dEFaelVYb1JXa3MyQzdFWVg1WUlOTnA=","repeats":1},{"count":1784,"lower_bound":"dEJDSXVuUUo=","upper_bound":"dEs4bHljYXVMaHA5cTR5","repeats":1},{"count":1792,"lower_bound":"dFE1T0F3YmhrSml1T3Vm","upper_bound":"dFlXS2xyc1pRRXVaZ3FnTXJzc2Nm","repeats":1},{"count":1800,"lower_bound":"dFo=","upper_bound":"dGtIckdjbW1KZ0loS0hMSXZBc2JkMERFUzk5OHJrdmZnS21rMnRUWFBQ","repeats":1},{"count":1808,"lower_bound":"dGxVNmFnTWt0UHo1bkt5YUhLWGlpVGFWZmJDMkhnNEpnUDhZTWludzRI","upper_bound":"dUxENDVwSmhDdGZrT3VRWWFtUjhtblZLVUp6ckliSGc=","repeats":1},{"count":1816,"lower_bound":"dU1lQWZHdnIwNWhra2NKNW12Qmw=","upper_bound":"dVNJQ3FUVE82NVN1T1A2bzVkTnVvRzc5ek5iN1o3NmJRdnQ5REo1YkFIdWZTWVVkM2o=","repeats":1},{"count":1824,"lower_bound":"dWdH","upper_bound":"dXI1MU1YdmF6QUpLWlliYUY=","repeats":1},{"count":1832,"lower_bound":"dXpTQUx1WllrYmNFMUR6Z1dORlFnc0x3UEUzT0ZYRHd2Y1gzZVk=","upper_bound":"djh6R1g3bHNpdU94MlVxVzRYODc4eEViQThZTUo5QXNZQ1djeDBOWjF3c0E2V1ZT","repeats":1},{"count":1840,"lower_bound":"dkUycG13U3l3d0NzQXNsTWM2TmNY","upper_bound":"dlBHV1Q=","repeats":1},{"count":1848,"lower_bound":"dlh0MmwxUXlEc0c=","upper_bound":"dms4ZkRkUEdEaVM0ZWN3c205aWpB","repeats":1},{"count":1856,"lower_bound":"dmtKN1M2U0hpeVQ4UlIybE5zSmNmQ1NMdkdWcVRGR1JYekJyazNHZmhlUXpYTXA2V2ZSZ081b0dUTnY=","upper_bound":"dnE1emNjQWMyY3lVWW9FNjB6U2xpUWRHclhJQ0JhM09UNA==","repeats":1},{"count":1864,"lower_bound":"dnI4a1dTUmlTNnhQbjc5SDlCWjYwdkNJYUhpY21xWURYNUhaaU5seHFqR2ZGWFl2ZU1mOW03SFo=","upper_bound":"d0NVbmdjSWZId0xIeTVNS2dOWmpkTlpzRVlUZHVuWjBhUHJEZDcyYzAyOE1ueQ==","repeats":1},{"count":1872,"lower_bound":"d0R1cGFxcVluZ0kzNXFlWkI3b0lqN2Fnb25jN01FdnZrUWRiMmVFT1VFbWFHcWd3T1VqVEJnaFVKN1A=","upper_bound":"d1NRUnc=","repeats":1},{"count":1880,"lower_bound":"d1VDUW9xeWZLVTlRcVZqRXZFOHNFU2pTbnlMUjZmMFIxUEsxT29JR3p5VE9WeGgzS2k=","upper_bound":"d2FEYUlwNVlUSmV6ZmFqSlRvQWl4ZEJyWEZLNnd2eWFGVlFnODBqVUJaWnk4NA==","repeats":1},{"count":1888,"lower_bound":"d2JwV0w=","upper_bound":"d3NYNzVnZEc=","repeats":1},{"count":1896,"lower_bound":"d3VFbW9VS0tYaXdCb1I1","upper_bound":"eDRpRWdPTVpxSEZIa2QzdklPc25HbzVCUjlGOXhYdDhmRkpUOXhtUTNn","repeats":1},{"count":1904,"lower_bound":"eDk5cUZVb2xQRFQwN1Y2SXYwWUJTcERwYk0yU0JHNGdiWmplcEdkbEg3Q3ExT0FvVDgwUmFNMjYxRGdHUTh0","upper_bound":"eFF5ZE1JM2RwYzN0eWdHNzNTb3RvMVpEcEFzWmlzRlNXRmxKUmt4TTVQRU9IMEdRekNwTnVDUA==","repeats":1},{"count":1912,"lower_bound":"eFZsRk5SSWN1ag==","upper_bound":"eGVNT05FOGhXZUhodm5MV1k0S3dYSFFhSmFWR09nOVk3bEdIcg==","repeats":1},{"count":1920,"lower_bound":"eGs0MDRReUhaWnlHcVhO","upper_bound":"eHBlWVlib0lBeDdueTR3YmZzZFk5Ylk=","repeats":1},{"count":1928,"lower_bound":"eHFaMDZJaVRUU0JuWnRiNjJTczJlNkVUelRvdGlMdnFOdnMxN3FTUWFBbGRSaVRBZmphdWx2","upper_bound":"eHNONUc4SWl4YWRUMVBsTUR5QVozMGRVVEFOa00yNERWODJXeQ==","repeats":1},{"count":1936,"lower_bound":"eHlMdTdvbkFjcXBpbXFQNTBiM1FocVBCVGZMWXdiYWtkdkUxYjdibWY0dEpXeTVLSTFF","upper_bound":"eTIwckJIUWdYRUNUWjFWUTN5aWlOTjZiSHZDUE1YOUtEZlpHUTA2N0s1aUVsVnNt","repeats":1},{"count":1944,"lower_bound":"eTNT","upper_bound":"eUdwdEJIYmpyWGlIbjU4TGkyZzRsd0U3Nk50UlhDQ1h4WTh6dVhqVkMweUJ1cDhMR0tFbjVkVXBWRTFPWjA=","repeats":1},{"count":1952,"lower_bound":"eU9uQmhzdHlGOWhJUkxPYW5WSXk0Zm5EbVFtRmlCTFBkZjc2OFdDZ1FoVU52dmFxYg==","upper_bound":"eVZQTHRIcGJBdVBIb21NRnh6ZGRxaHVRU0E4bTIyWG1UZm5q","repeats":1},{"count":1960,"lower_bound":"eVdnT3Z5YkJNRjlqdWl3UWluNWJueGwwSG9DY1FpYTg0Q2gxY3Y=","upper_bound":"eW5LZ2J0cHFpTklQeDJxTGtCWGg4SjJrV1FrM2Q4UlB0OE40Q2tl","repeats":1},{"count":1968,"lower_bound":"eXFHa1puNXhJQVNKV2J5eVpjTUVMQUVYend5M3dXaGtOc29ENEQydG5WOFpJ","upper_bound":"eXhFcE12REJFekJhZmdBZUtUT0hFUzJ3dGowQWpQUkE5VDdhNUpjSHNGYnk4VXdFUFNDRkFaUFIxMGtMeEpC","repeats":1},{"count":1976,"lower_bound":"eg==","upper_bound":"ejM=","repeats":1},{"count":1984,"lower_bound":"ejc5bmRtT2RaU21nZjZIalk3YnVuS0xG","upper_bound":"ekRxRVV4RjY4b1BjalgzVzNSRlF6Qw==","repeats":1},{"count":1992,"lower_bound":"ekxuYnluTkYxRzlnRGs0emk=","upper_bound":"elRvcmpCNFFIZWtoQ0s3ZEd5dExZUw==","repeats":1},{"count":2000,"lower_bound":"elhiUW40dnlING9zTXFmN0ZRdDVRMmRBdFRyZWdP","upper_bound":"enltbWhCUmNaaXZMeEtEVFpXM2VBN1dET3JYOFZPWk9hQjlzck0wdWpEakkwU0VMOTg1eXFNV0pt","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,0,1,1,3,0,0,2,0,0,2,1,0,1,0,0,1,0,1,0,5,0,2,0,0,2,0,0,0,1,2,1,1,2,2,1,1,0,0,1,0,1,1,0,0,0,0,1,1,0,1,0,0,4,0,2,3,2,3,2,0,0,2,1,0,0,1,1,2,1,1,2,2,1,0,0,1,2,2,1,5,1,0,0,2,1,2,3,2,1,1,1,1,2,3,1,2,0,0,1,0,2,2,1,0,0,1,2,0,0,0,1,1,0,0,1,1,0,1,0,5,1,0,1,2,2,1,1,0,1,2,0,2,1,1,0,1,0,0,1,0,1,1,0,1,0,1,0,2,1,0,0,1,1,2,0,1,1,3,3,0,2,1,1,1,0,1,2,0,0,0,0,1,1,0,0,2,2,1,4,2,1,1,1,2,1,1,1,1,2,0,1,1,1,1,2,1,0,0,0,2,2,1,0,0,1,1,1,0,0,2,3,1,1,0,1,0,0,0,1,0,1,2,2,0,1,1,2,0,3,0,2,2,1,0,0,0,0,0,2,0,1,1,1,0,0,1,1,2,0,1,2,2,0,0,0,0,1,3,0,0,1,0,3,3,2,0,1,0,3,0,0,1,1,2,1,0,1,1,0,0,2,1,1,0,2,2,3,0,2,0,1,1,2,1,3,0,1,0,0,1,2,1,0,0,0,3,1,3,1,0,3,0,2,1,1,0,3,0,3,0,1,2,5,0,0,0,2,2,2,0,1,1,0,0,1,2,0,2,1,1,1,1,1,0,0,0,0,1,1,2,2,1,0,0,1,1,1,1,1,2,2,0,2,0,1,0,1,2,1,0,3,0,0,0,5,0,0,1,1,1,0,1,1,1,1,1,0,0,1,2,2,1,1,2,2,0,1,0,2,0,1,1,0,0,1,0,1,1,3,1,1,3,2,0,1,1,0,2,0,0,0,3,1,0,0,1,0,0,2,2,1,1,0,3,1,1,1,0,2,0,1,0,2,2,0,2,0,1,2,0,1,0,1,1,0,2,1,1,0,0,0,1,1,0,0,1,0,3,1,1,0,2,1,1,2,0,1,0,0,1,1,2,0,0,1,0,0,1,0,0,2,0,1,2,0,1,2,0,1,0,2,1,4,3,1,0,0,1,0,2,1,1,4,1,1,0,0,0,1,1,0,2,1,1,2,0,0,0,0,2,3,1,0,1,4,0,2,0,0,0,2,0,2,2,0,3,0,1,0,0,1,5,5,1,2,1,1,2,1,1,2,0,0,1,2,1,1,1,0,0,1,1,5,0,1,2,0,0,3,0,1,0,2,1,3,0,1,2,0,1,0,0,1,1,2,1,0,0,2,1,2,2,2,0,3,0,0,4,1,1,1,0,2,0,1,1,1,1,3,1,1,2,0,0,2,2,0,1,0,0,0,0,1,3,2,0,2,2,0,0,0,2,2,1,1,0,1,2,3,0,0,1,2,0,0,2,0,3,0,2,2,0,1,0,1,0,3,2,0,3,0,2,0,1,2,0,0,0,2,2,2,0,1,0,0,1,0,0,0,2,1,0,0,0,2,1,3,0,0,0,1,0,1,0,1,0,0,1,1,2,1,2,1,2,2,2,2,1,1,2,1,0,0,0,0,2,0,0,1,4,1,2,0,0,0,1,1,1,1,0,1,1,0,0,1,2,0,1,1,2,1,1,1,0,0,0,0,1,2,2,1,0,0,0,0,1,1,3,0,2,1,0,1,3,1,0,3,1,1,1,2,1,2,2,0,1,1,0,1,2,1,2,1,1,0,1,1,1,2,1,1,1,0,0,0,0,0,1,1,1,1,0,0,2,0,2,0,2,0,0,0,1,0,2,0,1,0,0,3,0,1,0,0,2,1,0,0,1,2,1,0,1,1,1,2,1,0,0,0,0,2,0,2,2,1,2,0,0,1,0,1,1,2,0,1,1,0,1,1,0,0,1,1,1,1,1,0,1,0,3,4,1,2,2,1,0,0,3,1,1,1,3,0,0,0,3,3,0,0,2,1,1,1,0,0,1,1,2,0,1,1,3,0,1,0,0,0,2,2,1,0,2,1,0,0,1,0,1,1,3,0,0,1,0,0,2,1,3,1,3,1,2,1,1,2,1,1,1,2,1,5,1,1,0,5,2,1,2,1,0,0,1,0,1,1,2,6,4,0,0,1,0,0,0,1,0,3,1,1,2,0,0,1,1,0,0,0,0,0,1,1,4,0,1,0,3,2,1,2,0,1,1,1,5,0,0,1,2,1,2,2,0,0,1,1,0,1,2,1,1,1,0,0,2,1,2,0,1,0,2,0,2,0,1,2,2,2,1,0,0,0,2,0,1,0,1,0,3,1,1,0,0,3,0,2,1,0,1,1,1,1,1,0,0,0,1,5,0,0,0,1,0,1,0,0,2,2,2,3,0,0,1,3,0,0,1,0,2,0,1,1,2,1,1,2,2,0,0,1,1,2,3,2,0,3,2,0,0,0,1,0,0,2,0,0,0,0,0,2,0,1,2,2,0,1,2,0,1,1,1,2,1,0,4,0,0,2,0,2,0,0,0,0,1,0,0,0,0,1,1,1,0,1,5,0,0,1,1,4,1,2,1,0,1,2,0,1,2,0,1,1,0,2,1,3,0,2,1,1,2,0,1,3,1,0,0,1,0,0,0,2,1,3,1,0,2,0,0,2,1,1,0,0,0,0,2,0,1,0,1,1,1,1,0,3,0,1,1,3,2,1,1,0,0,1,1,0,3,2,0,1,0,0,3,2,3,0,1,0,1,0,1,1,1,0,0,2,1,0,1,2,3,1,0,1,0,0,0,1,2,0,3,0,2,0,0,1,0,0,2,0,1,3,0,2,0,2,1,0,1,2,0,1,3,0,1,1,1,1,1,0,0,1,2,0,2,1,1,1,0,2,0,0,1,2,1,2,0,0,1,4,1,1,1,1,0,3,2,0,1,3,0,1,1,3,4,2,1,0,0,2,0,1,1,0,0,0,0,1,2,0,0,4,0,1,0,1,2,1,1,1,1,0,1,0,0,1,1,1,0,2,1,0,0,0,2,0,1,0,2,1,1,2,1,4,2,0,0,0,0,0,0,0,1,2,3,2,2,4,0,1,1,0,0,2,1,1,3,1,0,1,1,1,1,1,3,1,1,0,0,1,1,0,0,0,0,1,1,2,0,0,0,0,1,1,2,0,0,1,1,1,1,0,5,0,1,0,1,0,1,0,0,1,0,1,0,0,2,0,3,2,1,0,0,0,0,3,2,0,0,2,0,1,0,0,1,0,1,1,1,3,0,1,1,1,0,0,2,0,0,2,3,1,3,0,1,0,0,0,1,0,0,1,0,1,2,2,4,3,0,0,0,2,2,1,1,0,0,2,0,1,0,0,0,1,0,3,1,2,1,5,0,2,2,0,1,0,1,1,0,0,1,0,0,0,1,1,0,0,0,1,3,0,1,0,0,2,1,0,0,0,3,0,2,0,1,2,2,1,0,3,0,0,0,0,1,1,3,1,2,1,0,0,2,0,1,1,1,2,0,3,2,0,1,3,3,1,0,1,2,2,0,2,2,1,0,2,1,1,0,1,2,1,1,0,0,2,0,0,1,0,1,4,0,1,1,0,1,1,1,0,1,1,0,2,0,0,0,0,1,0,1,2,1,0,0,2,0,3,1,1,2,0,2,0,1,1,0,1,0,2,1,4,3,0,0,1,0,1,2,2,1,0,2,1,0,0,0,3,1,1,1,0,1,2,0,0,2,1,1,1,1,1,2,3,0,0,1,1,3,0,0,3,0,1,0,3,0,1,1,0,0,1,0,0,3,3,0,1,3,3,1,0,1,0,1,1,0,0,1,2,2,0,0,1,1,0,0,0,2,2,2,1,2,1,4,0,0,1,0,0,0,1,1,2,1,1,0,1,1,1,1,2,0,6,1,0,2,1,2,1,0,1,0,1,1,0,0,1,1,0,1,0,0,4,2,1,0,0,2,0,1,1,0,0,1,0,1,0,1,1,1,2,0,1,0,1,1,1,2,0,0,1,2,2,0,0,1,1,2,1,1,1,1,1,0,0,2,1,0,1,0,0,0,2,0,3,1,2,0,0,0,2,1,0,1,0,0,1,1,1,1,1,1,2,1,1,1,0,0,1,1,3,0,1,2,3,1,1,0,0,0,3,1,2,3,0,0,0,0,1,0,3,1,3,1,1,1,0,0,1,1,2,0,2,0,0,3,0,2,3,1,0,1,0,1,0,0,1,2,0,1,1,1,1,0,0,0,2,2,0,3,0,4,2,3,0,2,1,0,2,0,3,1,2,2,0,0,1,1,2,1,1,0,2,0,1,2,2,0,0,1,1,0,0,0,1,0,2,0,0,1,0,2,0,0,0,0,1,1,1,2,0,1,1,2,0,0,2,1,1,1,0,0,2,0,1,1,2,0,2,1,1,0,1,1,3,0,2,1,1,1,1,0,0,0,0,0,1,2,1,0,1,0,0,1,1,3,4,2,0,1,1,0,1,0,0,0,2,1,1,3,1,1,2,1,0,2,2,1,1,2,0,3,1,2,0,3,3,4,3,0,2,0,1,1]},{"counters":[0,3,1,1,0,3,2,2,1,0,0,0,0,0,0,2,0,1,0,1,0,3,0,1,1,0,1,1,2,0,2,0,1,2,1,2,1,1,2,0,1,3,0,2,0,0,1,0,1,1,1,0,0,0,0,3,2,1,1,2,2,0,0,0,2,0,2,0,1,1,2,1,0,2,1,2,2,1,1,1,2,0,2,2,0,1,1,1,3,0,1,2,0,1,0,1,0,1,1,1,0,3,1,1,1,0,1,0,0,0,3,1,1,1,2,1,0,1,2,1,0,0,1,0,0,0,1,1,0,1,3,1,0,1,0,0,0,2,0,1,0,0,2,0,3,0,0,1,4,4,1,2,3,0,1,1,1,0,0,3,1,0,1,1,2,1,2,2,0,0,0,2,1,4,0,3,0,1,1,2,2,2,1,2,1,0,4,1,1,1,1,1,1,0,0,2,1,0,1,0,2,1,0,1,1,1,2,1,0,0,1,0,2,0,1,1,1,0,4,1,0,0,2,1,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,3,0,0,0,1,0,2,4,0,2,3,3,2,3,0,0,0,1,1,0,3,0,2,0,1,0,3,0,2,3,2,0,2,1,0,2,1,2,0,0,0,1,2,3,1,0,4,0,1,1,0,2,0,2,1,0,2,1,0,0,0,3,2,0,2,0,1,1,0,0,0,0,0,1,0,0,1,1,0,1,1,2,1,2,0,0,1,1,0,1,0,1,3,1,3,1,0,0,0,1,0,0,0,2,1,0,0,1,1,3,1,0,2,1,0,2,0,2,0,0,2,1,1,3,0,0,0,0,0,2,1,0,0,0,0,0,2,2,2,1,2,0,1,3,2,0,0,1,0,0,0,0,2,1,0,1,2,1,0,0,1,0,2,0,0,0,1,3,1,0,1,0,1,1,0,0,1,1,1,0,0,1,1,0,3,0,1,1,1,4,1,2,0,1,0,1,1,2,0,1,0,2,2,0,2,2,1,0,1,0,0,2,0,0,2,1,1,0,2,0,2,0,0,2,1,0,0,1,1,0,1,0,0,1,0,0,0,2,2,1,2,1,3,3,0,2,0,0,2,3,1,0,7,1,2,0,1,0,2,3,1,0,0,1,1,0,1,0,0,2,1,1,0,0,0,1,0,2,1,0,0,0,1,0,1,2,1,0,1,0,3,2,0,0,1,0,2,0,5,4,3,1,1,0,0,0,3,1,0,2,2,0,4,1,2,0,2,1,0,0,0,2,0,0,0,1,0,0,1,1,1,1,0,1,1,1,1,0,1,1,3,1,1,0,1,2,1,1,1,2,0,0,2,1,1,3,0,3,1,1,1,0,0,2,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,2,0,2,1,1,1,2,2,3,1,0,1,1,1,2,1,3,0,0,1,0,1,2,0,0,1,0,1,2,3,1,1,2,0,1,0,0,0,0,2,2,1,0,0,0,0,1,2,1,2,0,2,0,0,2,2,1,3,0,0,0,3,3,1,1,3,1,0,2,0,2,2,1,2,1,2,0,4,0,1,1,1,2,1,0,2,1,0,2,0,2,1,0,1,0,0,0,1,0,0,1,1,1,3,3,0,2,1,2,2,0,0,0,3,1,2,0,0,1,1,1,0,2,2,0,4,1,0,1,1,2,0,1,0,0,0,1,3,0,1,3,1,1,0,0,2,1,2,4,0,0,2,0,2,1,1,2,0,1,2,0,3,0,1,2,0,0,0,2,2,1,0,1,3,1,1,0,2,0,0,0,1,0,1,0,1,0,1,2,2,0,1,1,2,3,1,1,1,0,1,1,1,1,0,3,1,0,0,0,3,1,1,1,1,0,2,0,1,0,2,1,3,0,0,2,4,2,1,0,0,3,0,1,2,1,2,3,0,0,0,3,2,3,0,0,0,1,0,2,1,0,1,0,1,1,0,1,0,1,1,2,2,1,1,0,1,0,1,1,1,0,0,1,1,2,0,0,1,0,1,1,0,0,1,0,2,1,3,1,1,1,1,2,1,0,0,1,1,3,2,2,2,2,3,1,0,0,0,1,2,0,1,2,0,2,2,0,1,0,0,1,1,1,0,1,3,2,1,0,0,1,0,1,0,0,0,2,1,2,4,2,1,1,0,0,1,1,0,1,0,0,1,0,1,0,0,1,0,0,1,0,3,0,0,3,2,1,0,0,3,0,2,1,3,1,2,1,3,1,1,2,1,1,0,1,3,1,2,3,2,2,0,1,1,2,1,2,0,0,3,1,1,0,1,2,3,0,2,1,2,1,0,1,0,0,1,2,0,1,1,0,1,0,0,1,1,0,2,0,0,0,0,0,3,1,0,3,0,1,1,0,2,1,1,0,0,1,1,0,0,0,0,0,3,0,0,2,2,0,1,0,0,0,0,1,2,1,0,0,0,1,1,0,0,1,0,2,1,0,1,0,1,2,4,4,0,0,2,1,2,1,1,1,1,2,0,3,1,0,0,1,0,1,1,0,1,1,0,1,0,1,1,1,2,1,0,2,0,0,1,0,4,2,2,4,0,1,0,0,1,0,0,0,0,2,1,1,0,1,1,1,3,3,0,0,1,1,2,1,1,1,0,0,1,3,0,2,0,2,1,5,2,0,1,2,4,1,1,1,0,0,0,1,1,1,0,0,0,0,0,4,1,0,2,0,0,0,1,1,0,0,0,1,0,1,3,0,2,1,0,1,0,0,0,1,0,0,0,1,0,0,0,0,1,2,4,4,2,0,0,0,0,1,1,0,0,0,0,1,3,2,2,0,3,0,0,2,1,3,2,1,0,1,2,2,1,0,1,1,2,1,0,0,0,1,2,1,2,0,1,2,1,3,2,1,1,4,0,0,2,1,0,2,1,0,1,1,1,1,3,0,0,0,0,2,1,2,0,2,1,2,1,0,1,1,2,0,0,0,0,0,3,2,1,0,0,0,0,0,0,1,1,1,2,2,2,0,1,1,0,1,2,2,0,1,1,0,2,2,1,0,0,1,1,1,1,2,2,2,2,0,2,0,3,3,1,0,0,1,1,0,2,0,1,0,1,3,1,0,1,2,0,1,2,0,2,0,5,2,0,1,1,1,2,0,1,0,2,1,2,0,0,0,2,0,0,3,0,1,2,1,0,1,3,0,0,1,4,1,3,0,1,0,1,1,0,0,0,2,1,0,0,2,3,0,2,0,0,0,2,2,1,2,1,3,0,0,1,1,1,0,0,0,0,2,1,2,1,0,0,1,1,1,0,2,1,0,0,3,1,1,0,1,1,4,1,2,2,1,2,1,2,1,0,1,0,3,1,0,1,3,2,1,2,1,1,1,0,0,2,0,2,2,0,0,3,0,2,0,0,0,1,0,0,0,0,3,1,2,1,1,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,2,0,2,0,1,0,2,1,2,0,1,0,3,3,0,1,2,0,1,0,0,0,1,1,1,1,1,3,0,2,1,0,1,1,1,0,2,1,0,1,0,0,0,0,1,2,2,1,0,0,0,3,0,2,1,0,1,0,0,0,1,1,1,2,0,1,0,1,1,2,2,1,3,0,0,1,2,4,0,3,1,2,3,3,0,0,2,2,0,2,1,0,2,0,2,1,2,3,0,4,2,3,0,1,3,1,0,1,0,1,2,1,1,2,0,0,3,0,1,0,1,1,1,1,0,3,1,0,1,5,0,0,1,3,0,2,2,1,1,0,1,3,1,0,1,0,0,2,2,0,1,0,1,2,1,0,2,0,0,0,0,2,1,2,2,0,0,0,1,2,1,3,2,0,0,0,1,1,3,3,1,0,0,1,0,0,1,0,1,0,0,1,1,1,3,1,1,2,1,1,0,0,0,1,1,0,0,1,0,1,1,1,1,0,2,0,0,2,0,0,0,0,1,1,0,0,0,2,1,0,0,2,2,0,1,1,2,2,0,0,1,2,0,1,0,0,3,1,1,1,0,0,0,0,2,0,0,3,1,3,0,1,0,1,0,0,1,0,1,2,0,5,2,2,1,1,1,0,0,0,2,2,0,1,2,0,0,1,1,0,2,2,1,0,0,3,0,0,1,1,1,0,1,2,1,0,2,0,0,2,0,1,0,1,1,0,0,0,1,1,1,0,2,2,2,1,0,2,2,1,1,0,2,1,0,0,1,0,1,1,1,0,2,0,1,1,2,0,2,0,0,2,3,1,1,0,2,1,1,0,0,0,0,2,0,0,1,1,1,2,1,1,2,0,1,0,0,3,0,4,0,0,0,2,0,0,0,1,3,0,1,1,1,3,0,2,1,1,1,2,0,1,1,0,0,2,0,1,1,0,1,2,0,0,0,2,0,2,0,2,1,1,1,0,3,0,0,0,0,0,1,3,0,0,2,2,2,4,1,2,0,0,2,1,1,0,1,0,1,3,2,1,2,2,0,0,1,0,0,1,1,3,0,1,2,2,0,0,1,0,1,0,1,0,1,2,3,0,0,0,2,3,3,2,0,2,0,2,1,2,3,3,2,0,3,3,2,1,2,0,0,0,0,0,1,2]},{"counters":[3,0,0,2,2,1,0,1,1,0,0,2,0,0,0,1,3,0,0,2,3,0,2,3,1,2,1,0,1,0,0,2,0,1,1,0,2,0,1,5,1,2,2,0,0,0,0,1,1,0,2,2,0,0,2,2,0,0,1,2,1,0,0,0,1,0,0,1,0,0,0,1,1,0,1,0,2,1,1,2,1,0,1,2,2,0,0,1,1,2,1,0,1,0,3,1,1,1,1,0,1,1,0,3,3,0,1,0,0,1,0,3,0,0,2,0,1,1,0,2,2,1,2,0,1,1,0,0,0,1,1,0,0,2,0,1,0,2,1,1,2,2,1,0,0,0,2,1,0,1,0,1,0,0,1,4,0,0,1,0,3,1,2,1,1,0,0,0,0,0,0,1,2,1,1,0,2,2,2,0,0,2,1,2,0,1,2,2,0,2,0,0,0,1,1,2,2,2,1,2,1,0,1,0,0,2,1,0,1,0,0,1,1,0,3,1,0,2,0,0,1,1,1,2,2,0,0,1,2,1,0,0,0,1,1,2,2,2,3,0,0,2,0,2,1,0,1,0,1,0,1,1,1,0,3,0,2,1,0,0,0,1,1,4,3,2,3,1,0,0,2,1,1,2,0,0,1,1,0,1,2,1,0,1,2,0,0,0,2,0,1,1,0,1,0,1,0,1,0,1,0,1,1,2,1,0,2,1,0,1,1,1,1,0,1,2,0,0,1,1,2,1,0,0,1,2,0,1,0,2,2,1,3,1,2,0,2,2,0,1,1,0,1,2,2,2,1,2,4,1,1,1,1,0,0,0,2,1,0,0,2,1,2,1,0,0,2,0,0,2,0,2,0,0,1,0,0,1,0,1,5,1,2,1,0,0,0,2,2,4,0,0,1,0,0,1,1,1,1,0,2,1,1,2,0,3,0,0,1,3,0,1,2,0,3,2,0,0,0,1,2,1,1,0,0,1,0,1,1,2,0,1,1,0,5,1,2,1,0,0,1,0,0,1,1,0,1,3,1,0,1,3,1,2,0,2,0,2,0,4,1,0,1,1,0,1,0,0,2,1,0,0,0,2,1,1,1,1,1,1,0,1,1,3,1,1,3,1,2,0,0,0,1,1,2,1,2,0,1,2,2,1,0,0,2,0,2,0,1,0,0,0,2,0,1,0,0,2,0,0,2,2,1,4,0,1,0,1,1,3,0,0,2,2,3,1,1,1,1,2,2,0,0,1,1,2,0,2,0,0,1,0,2,0,1,0,1,1,1,2,0,3,0,0,1,3,0,0,2,2,1,1,0,3,1,1,0,1,0,0,0,0,0,2,1,1,3,0,1,0,1,0,1,0,1,0,2,0,1,1,2,1,0,2,2,4,0,1,2,2,0,0,0,1,0,0,1,0,1,1,3,3,0,0,2,2,1,1,2,2,1,0,1,2,2,0,0,1,0,0,1,2,0,2,1,1,1,1,3,1,2,3,1,1,1,0,0,1,3,0,2,0,2,1,0,2,1,1,2,2,0,1,2,0,1,0,0,0,5,0,0,2,2,2,2,0,1,1,1,0,0,1,0,2,2,2,0,0,1,3,1,3,3,0,0,0,2,1,0,1,2,2,1,2,0,1,1,2,0,2,0,1,0,1,0,1,1,1,0,1,2,1,2,0,2,0,2,0,2,1,0,0,2,4,2,0,1,2,3,0,0,0,1,2,2,1,1,1,1,0,3,3,1,1,0,0,1,2,0,1,2,0,2,1,1,0,0,0,1,1,3,0,1,0,0,1,5,2,2,1,1,1,0,0,2,1,0,0,1,1,0,0,0,0,1,2,0,0,2,1,1,2,1,0,0,3,1,0,1,0,1,0,1,1,1,0,0,1,1,1,0,3,2,1,0,0,1,0,0,0,1,0,1,0,0,2,1,3,2,0,1,1,1,2,2,1,3,1,2,2,0,2,1,1,1,2,2,0,0,3,3,1,0,0,3,0,1,0,2,1,0,2,2,1,1,1,0,1,1,1,0,1,1,0,1,2,2,0,3,1,1,0,0,0,1,2,3,1,0,3,2,1,1,0,0,1,1,0,0,0,1,0,0,4,2,0,1,1,1,1,0,0,1,0,1,3,2,1,0,2,1,1,2,2,1,1,2,0,1,0,2,2,3,1,1,1,1,0,1,3,1,1,2,1,0,1,1,1,0,1,3,1,1,1,0,1,2,1,1,2,0,0,1,0,0,0,0,0,2,1,0,1,1,1,2,1,0,0,2,1,1,0,1,1,2,0,2,1,3,0,0,3,1,0,2,1,4,1,0,1,2,0,1,2,0,0,0,2,3,0,3,1,0,0,1,1,0,1,1,2,1,4,1,1,0,0,1,0,2,0,1,1,2,0,1,2,1,0,0,1,0,2,1,0,1,1,0,2,0,4,2,0,2,0,1,0,1,1,0,3,1,1,1,2,1,1,4,1,0,0,1,1,0,0,1,0,0,2,1,0,1,0,1,0,0,1,0,2,2,2,1,1,0,0,1,0,2,0,0,0,2,4,3,1,2,3,1,0,1,0,2,1,1,2,1,1,0,0,0,1,2,1,1,0,0,1,0,0,0,0,1,1,0,1,0,1,2,2,0,0,0,0,0,0,3,1,0,0,1,1,0,4,3,0,1,1,1,1,2,0,0,0,1,1,0,2,0,0,2,0,1,0,1,1,0,1,2,1,0,0,0,1,2,0,1,3,1,2,0,1,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,2,2,0,2,0,3,0,2,0,2,0,1,0,3,1,0,1,1,1,0,1,1,1,0,0,0,0,0,1,2,3,1,1,1,1,2,2,1,0,2,1,2,0,0,0,2,0,1,2,3,2,1,0,1,0,0,1,0,1,2,0,0,1,0,2,2,1,1,1,0,0,0,1,0,0,1,0,1,0,1,2,1,0,0,2,1,1,1,0,4,0,1,4,1,2,2,1,2,1,0,0,0,0,6,3,1,2,0,1,1,1,2,0,1,1,0,0,2,2,2,2,2,4,1,0,2,0,0,3,0,0,3,1,0,1,1,0,4,3,0,1,0,2,1,0,2,0,1,1,1,1,1,1,1,0,1,0,2,1,1,1,3,0,2,0,0,2,0,0,1,0,3,1,1,1,1,0,0,1,0,0,1,1,1,1,0,1,1,2,1,2,1,2,0,0,0,1,1,0,1,0,2,1,2,0,3,0,2,1,1,1,0,1,1,1,1,2,1,0,1,0,0,1,4,0,1,0,2,0,0,1,2,2,1,1,2,3,2,0,2,2,2,0,1,1,1,1,0,2,1,0,1,2,1,0,1,0,1,2,0,1,1,0,1,1,1,0,0,0,0,0,2,2,1,0,0,0,1,1,1,0,0,0,1,2,1,2,0,5,0,0,1,2,1,1,1,1,3,2,1,1,1,0,1,0,1,1,2,2,1,1,2,0,0,3,0,1,0,1,1,4,1,3,1,1,4,0,1,0,1,1,0,0,0,1,1,0,2,1,1,2,0,1,2,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,3,1,4,0,0,0,1,3,0,4,2,0,0,1,0,0,1,0,1,1,1,1,0,0,1,1,1,0,2,1,1,2,1,1,1,0,1,1,1,0,4,1,2,0,0,1,0,0,2,0,1,0,2,3,0,1,1,1,2,2,0,1,2,2,2,3,1,2,1,1,0,1,0,0,0,0,1,3,2,0,2,0,1,1,0,3,2,1,1,1,1,0,1,1,1,0,0,1,0,1,0,2,1,0,0,0,0,3,1,1,0,1,3,1,1,0,2,0,1,2,2,2,2,0,0,1,2,1,1,0,0,0,1,0,0,2,1,1,2,0,0,0,1,0,0,1,1,1,0,4,2,0,0,2,1,2,2,1,0,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,2,2,3,1,2,3,1,0,0,2,1,0,0,1,0,1,0,0,3,2,1,1,3,1,1,1,0,0,2,0,3,1,1,0,1,2,2,2,0,0,1,2,1,3,0,2,3,4,1,2,0,2,2,0,0,2,0,2,0,1,1,1,1,3,1,1,1,3,1,1,0,2,0,1,1,0,0,1,2,0,1,0,0,1,2,0,2,0,0,0,1,2,1,1,1,1,0,0,2,0,2,0,0,0,1,1,3,1,1,1,2,1,1,0,1,1,0,2,1,1,2,0,1,0,2,1,0,0,1,1,0,1,0,2,1,1,2,0,2,2,0,1,0,1,0,1,0,0,1,1,1,2,0,1,1,0,3,3,0,0,2,0,0,0,0,0,0,2,1,0,0,0,1,1,1,1,0,2,0,1,1,1,0,1,1,1,0,0,0,1,0,2,2,1,1,1,3,0,2,1,2,2,0,1,1,1,1,1,0,1,0,1,1,1,4,0,1,0,2,2,2,1,2,0,0,1,0,1,1,0,2,2,1,0,0,1,1,1,0,2,3,3,2,0,3,0,1,1,0,1,1,2,2,0,1,0,1,0,2,1,1,1,0,1,1,1,2,1,0,2,2,0,0,1,1,1,0,1,2,0,0,0,0,3,1,0,0]},{"counters":[1,2,2,1,1,0,1,3,0,0,0,0,2,1,1,2,4,0,1,2,2,3,0,1,1,3,1,0,1,1,0,0,1,1,0,1,0,1,0,0,0,0,1,0,0,1,3,2,1,1,0,0,2,3,1,3,0,0,1,0,1,1,1,0,2,1,2,3,0,1,1,0,2,0,1,0,0,0,2,1,0,1,0,2,0,0,0,2,1,3,1,1,0,0,1,1,1,0,0,1,4,1,0,1,1,1,2,1,2,3,0,0,1,2,0,1,0,0,1,3,1,2,1,0,2,0,1,0,1,3,1,1,0,1,1,2,0,0,1,2,2,1,0,0,2,2,1,0,1,1,0,0,1,3,0,0,1,2,1,2,0,5,0,0,0,0,1,0,0,1,3,1,3,1,2,1,2,4,0,2,0,1,0,3,1,2,3,1,1,1,1,0,2,1,1,0,0,0,1,3,2,1,0,0,0,1,0,0,0,1,1,2,0,2,3,1,0,0,1,0,0,1,0,1,2,0,0,0,3,0,1,0,2,1,1,0,2,1,1,1,0,1,1,3,4,0,1,2,1,0,1,0,2,1,0,2,0,0,1,3,0,1,2,0,0,1,1,1,3,1,1,1,2,0,1,1,1,2,1,1,0,0,2,1,0,1,1,1,0,3,1,3,0,2,2,2,2,2,1,0,0,1,1,2,1,0,0,1,1,2,1,1,3,1,0,3,0,0,1,1,1,1,0,1,1,0,1,3,1,0,1,1,1,1,1,2,1,1,0,0,2,1,2,1,0,1,0,2,0,2,0,1,2,0,1,2,2,0,0,1,1,0,0,0,1,0,0,0,1,1,1,1,0,1,2,0,2,2,0,2,1,0,1,2,1,2,0,0,1,2,0,2,3,0,2,1,2,1,2,1,3,3,1,3,2,1,0,1,0,0,0,2,1,0,4,0,1,0,0,2,2,2,2,1,2,2,1,1,0,3,1,3,0,1,0,0,1,0,3,1,1,1,0,3,0,2,1,3,0,1,0,0,1,1,1,1,0,1,2,2,1,0,1,0,1,0,3,3,0,1,1,2,1,2,2,0,0,0,2,1,3,0,1,2,1,2,1,1,2,1,1,1,0,0,1,0,0,0,3,1,0,1,2,0,0,0,1,0,1,1,1,2,1,0,0,1,3,1,2,0,0,1,0,1,2,2,2,2,3,1,2,2,0,0,1,0,0,0,1,0,1,1,1,0,0,2,1,1,1,2,1,0,0,3,0,0,0,0,1,1,2,0,2,0,0,1,0,0,0,1,0,3,2,0,0,2,0,1,3,1,0,0,0,0,0,1,1,0,1,1,2,0,0,0,2,3,2,2,0,1,1,3,1,2,1,3,2,1,2,1,2,0,2,0,1,0,1,0,1,0,0,0,1,0,4,1,1,0,0,0,0,1,1,2,2,0,0,1,1,3,3,1,1,0,3,2,2,0,1,3,2,1,1,0,1,1,1,1,0,1,0,3,0,0,1,0,1,0,2,1,1,1,2,3,1,1,2,2,1,1,2,0,3,1,0,0,3,1,1,1,1,1,0,2,0,2,0,2,2,3,1,1,0,1,3,1,0,0,1,3,1,1,0,2,0,0,0,2,3,0,0,2,2,0,2,1,3,1,1,1,1,3,1,1,1,1,0,3,0,1,2,1,3,1,1,0,1,0,1,1,0,1,0,1,0,2,0,0,2,1,2,0,0,1,0,0,1,0,2,1,1,1,2,1,1,3,0,0,1,2,1,1,0,1,1,2,0,0,2,0,1,2,3,1,1,0,1,1,3,1,1,2,1,1,2,3,0,1,3,0,1,0,2,1,1,1,4,2,0,1,1,1,0,0,0,0,1,2,1,0,0,0,0,3,0,3,3,0,0,1,0,0,2,1,0,0,0,2,0,2,2,2,0,1,1,0,1,3,0,0,0,0,0,0,2,0,1,1,4,1,0,6,0,1,0,2,3,0,1,1,1,1,2,0,1,2,3,0,0,5,3,1,1,2,4,1,0,3,1,1,2,0,1,3,1,0,0,0,1,0,2,2,1,2,0,1,2,0,0,0,1,0,2,2,0,2,1,4,0,0,1,1,1,1,2,1,2,1,0,2,0,1,0,0,1,0,0,1,1,0,0,1,1,1,2,0,0,0,0,2,1,0,1,0,1,0,0,0,0,3,4,1,0,0,0,2,2,0,1,1,1,0,0,0,0,1,0,1,1,2,1,0,0,0,0,2,1,1,0,2,0,1,3,0,0,0,2,2,2,0,0,1,1,1,0,1,1,0,0,1,1,3,1,0,0,1,1,1,1,0,0,1,1,2,3,0,0,0,0,1,1,1,0,1,0,1,0,1,0,1,2,0,1,0,0,1,2,0,1,0,0,1,1,1,0,1,1,0,1,1,1,3,0,1,0,1,1,1,2,3,3,1,0,1,0,1,0,2,1,2,1,2,1,2,2,1,0,0,2,3,1,1,1,3,2,0,2,0,2,2,3,0,3,1,1,0,2,0,0,2,1,0,0,1,0,1,1,2,0,0,0,3,3,1,1,0,1,1,2,0,1,0,4,1,0,1,1,0,2,0,0,0,0,0,1,0,0,0,2,1,1,1,0,0,2,1,2,1,1,0,3,0,1,0,2,2,1,1,1,1,2,0,2,1,0,0,1,3,1,1,3,0,1,1,2,1,2,1,0,2,0,1,0,2,0,3,1,0,1,2,3,1,2,1,1,0,0,1,2,0,1,0,3,1,1,0,2,6,0,0,1,4,0,0,1,0,2,1,0,2,0,3,1,0,1,0,2,0,2,2,0,1,1,2,0,1,1,0,1,1,0,0,0,2,2,3,1,0,1,0,0,1,0,0,1,1,1,1,1,1,2,2,2,1,1,1,0,0,0,0,1,0,2,1,2,0,1,1,0,0,1,0,1,0,2,2,5,1,1,0,1,2,1,1,0,0,2,2,1,0,1,1,1,0,0,1,0,1,1,1,1,0,0,2,2,0,2,1,1,0,0,0,3,2,1,1,1,1,0,2,3,1,0,3,0,1,1,0,0,1,0,2,1,1,0,1,2,0,1,1,0,1,0,0,2,0,1,2,0,2,0,2,0,5,2,2,0,0,1,0,1,1,1,0,2,0,0,0,0,2,0,0,4,2,0,0,3,1,2,1,0,0,0,0,0,0,0,1,1,0,1,1,2,1,2,0,1,1,1,1,2,1,0,0,2,0,2,3,0,0,2,1,1,1,1,0,1,1,0,4,0,0,1,2,2,0,3,3,3,1,0,0,1,0,1,2,1,1,1,0,0,0,2,0,1,1,1,0,2,1,0,0,1,2,1,1,1,4,0,0,1,0,0,0,1,3,0,0,2,1,0,1,1,0,1,1,1,1,1,0,0,0,0,1,0,1,1,0,1,2,1,2,0,1,0,1,3,2,1,0,0,1,0,2,0,2,0,2,0,1,0,1,2,2,0,0,0,1,0,1,0,0,1,0,3,2,2,0,0,0,0,0,0,0,0,0,2,1,2,4,2,2,0,1,2,1,1,0,0,1,1,1,1,0,2,0,2,1,1,0,1,0,0,1,1,1,1,0,2,0,1,2,1,2,0,1,0,0,3,0,1,0,1,0,0,0,1,1,1,2,0,1,0,1,1,0,0,0,2,0,1,0,2,1,2,1,3,0,2,1,0,0,1,0,1,0,5,1,0,3,0,2,1,0,1,3,0,2,1,0,0,1,0,0,0,0,2,1,3,1,1,2,3,1,1,0,1,1,0,0,1,0,1,0,0,2,0,2,1,0,1,1,0,0,1,1,2,0,0,1,0,0,0,0,0,0,1,1,0,0,0,1,2,0,0,0,1,0,4,1,0,0,2,2,0,1,1,0,0,1,2,1,0,0,0,0,2,0,4,0,0,5,0,0,2,3,1,2,1,0,4,0,0,1,1,2,1,0,1,1,0,1,3,0,0,0,0,1,0,0,2,0,0,0,1,2,2,0,1,2,2,0,0,1,2,1,3,0,1,0,3,0,0,2,4,0,2,0,1,0,1,2,1,0,2,0,1,0,1,0,1,1,0,1,1,0,0,1,0,2,1,1,1,0,1,1,1,0,1,1,0,1,2,1,1,0,2,1,0,0,1,2,0,4,0,0,3,0,0,0,2,3,1,1,0,0,0,0,0,0,0,1,0,1,1,4,1,1,2,0,2,0,1,0,0,2,0,2,0,3,0,1,1,0,2,0,0,0,1,0,2,0,3,2,2,1,0,0,0,1,2,1,2,1,1,0,0,0,0,1,3,4,0,2,0,1,1,0,0,1,1,2,3,0,0,1,0,2,1,1,4,2,0,1,1,1,0,2,2,0,2,1,2,1,1,0,1,1,2,0,0,2,2,1,3,2,1,1,1,0,1,3,0,0,0,0,1,2,0,1,1,2,1,0,1,1,1,1,0,1,2,1,2,1,0,1,1,0,0,2,2,1,1,0,0,0,1,1,1,1,2,2,0,2,1,0,0,2,0,3,1,1,1,1,0,0,1,0,0,0,2,0,2,2,1,2,0,1,1,0,2,0,1,0,2,4,0,0,0,0,1,1,4,2,1,1,0,2]},{"counters":[1,0,0,1,2,0,0,1,1,0,1,3,0,2,0,1,0,1,0,0,1,2,3,1,0,2,1,1,0,2,1,1,2,0,2,2,1,1,2,2,3,1,1,3,0,1,2,2,1,1,1,2,0,3,1,0,0,1,2,1,1,1,1,1,1,0,3,0,0,0,0,4,0,1,0,0,2,1,0,1,3,1,1,1,1,4,1,0,2,0,1,0,1,0,1,0,2,1,1,0,1,4,0,2,1,0,0,0,2,0,0,0,1,1,1,1,1,2,1,0,1,1,0,0,1,0,1,4,1,0,5,0,1,0,1,1,0,1,2,1,1,0,1,2,0,1,1,1,0,2,1,0,0,2,1,1,1,1,1,0,3,1,0,1,1,2,0,0,2,0,2,0,1,1,2,0,1,1,1,0,0,1,2,1,3,1,0,2,0,2,1,2,0,0,2,0,1,1,0,1,1,0,2,1,0,0,1,2,0,2,3,2,0,0,0,0,1,2,1,0,0,0,0,1,0,0,1,0,0,0,2,2,3,1,0,1,0,1,0,1,1,1,0,0,0,3,0,0,0,1,0,3,1,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,3,1,3,1,1,1,1,0,1,3,2,0,2,4,0,0,1,1,1,1,1,1,1,1,2,0,0,0,1,0,0,0,3,1,1,1,1,0,0,0,2,0,1,2,0,0,1,3,2,3,1,3,0,0,0,1,1,1,1,1,1,2,1,0,2,1,1,1,0,1,2,0,1,0,2,2,2,3,0,1,2,0,2,3,0,0,1,2,3,2,1,1,1,0,1,0,1,2,1,0,2,1,2,0,1,1,1,0,0,1,3,3,2,0,1,2,0,2,1,2,2,0,0,0,2,0,0,1,1,2,1,0,0,1,3,1,5,0,1,0,0,0,1,0,1,0,2,1,0,1,1,0,2,0,1,0,1,0,1,0,1,1,2,2,2,1,0,1,0,2,3,1,1,1,0,1,1,0,1,1,1,2,1,1,0,1,1,0,3,0,2,0,0,1,0,1,0,0,4,1,0,0,1,0,2,2,1,0,0,0,3,0,1,2,0,0,0,0,0,2,1,1,3,1,0,2,4,0,1,0,1,1,0,0,0,1,1,0,0,2,4,1,2,2,1,1,2,2,1,2,1,0,0,0,0,1,0,0,1,0,3,1,2,0,1,0,1,1,2,0,0,1,1,0,2,2,0,0,0,1,2,0,0,0,1,0,2,1,0,1,1,2,0,3,0,1,0,1,0,2,1,1,2,2,1,1,3,1,0,1,1,2,0,1,2,0,1,0,1,0,1,1,2,0,2,2,1,0,3,1,2,0,2,0,1,1,0,0,3,2,3,1,0,1,1,0,2,0,0,3,1,0,0,1,1,2,0,1,2,0,0,3,1,1,2,1,1,0,2,1,1,3,0,1,0,1,0,1,2,1,0,1,1,2,0,0,1,1,0,2,3,1,0,1,1,1,1,1,1,1,3,1,2,0,0,0,0,1,2,0,0,0,3,0,1,1,0,1,0,0,0,2,2,2,0,0,1,1,2,0,1,1,0,0,0,0,0,0,1,3,1,2,1,0,1,2,0,2,0,0,1,0,1,0,1,0,1,1,1,2,2,0,4,0,2,0,1,1,0,0,1,3,1,1,1,0,0,1,2,0,1,1,0,0,0,3,1,1,0,1,1,2,0,1,0,1,1,2,1,1,0,1,0,0,1,4,2,0,0,1,1,0,1,1,1,1,3,1,1,2,1,1,2,4,0,0,1,1,1,0,0,1,1,2,3,3,0,2,3,0,3,4,1,1,0,0,3,0,0,2,0,1,1,1,2,0,2,1,0,1,0,2,0,0,1,0,0,2,1,0,1,0,0,1,2,1,2,0,4,4,1,2,2,1,1,1,0,1,2,1,1,1,1,0,3,1,2,2,2,2,0,0,0,1,0,1,2,0,1,1,0,1,0,0,1,0,1,3,0,0,2,2,1,1,0,0,1,0,0,1,2,0,0,0,2,2,2,0,0,1,1,1,2,1,2,3,1,0,1,1,2,1,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,1,1,2,1,0,1,0,0,0,1,0,4,0,1,1,2,2,0,0,0,2,0,0,3,2,2,2,1,1,1,2,0,0,0,3,1,0,0,0,1,0,1,0,2,0,0,1,1,0,1,1,2,0,0,1,3,2,1,0,0,2,0,0,3,0,0,1,0,0,0,0,2,0,0,0,0,0,0,1,3,0,1,2,0,0,0,0,0,0,0,2,2,1,3,2,0,2,0,1,0,0,2,1,2,0,2,1,2,3,1,1,2,1,1,1,2,1,0,1,1,3,2,0,1,1,3,0,1,4,3,0,1,3,0,1,0,1,3,2,2,1,1,1,0,0,0,1,0,2,2,1,0,2,1,2,1,1,0,1,0,0,3,0,1,2,1,1,2,0,1,2,0,1,1,1,1,0,2,1,0,2,0,0,0,0,2,2,0,3,1,0,0,1,1,3,2,0,1,2,3,1,1,1,0,0,2,0,0,0,1,3,0,1,1,2,1,0,1,1,3,2,1,0,0,1,1,2,1,0,0,1,2,1,1,1,1,0,0,7,1,2,0,0,2,1,2,2,2,1,0,0,2,0,0,0,2,2,2,1,0,0,1,1,0,0,1,1,0,0,0,0,2,0,1,0,1,1,0,1,2,1,0,2,0,0,0,2,0,1,1,0,3,1,2,0,0,1,2,0,1,0,0,0,0,0,1,2,0,0,1,1,2,0,1,1,2,2,0,1,1,2,0,1,1,2,0,1,2,0,2,0,1,0,1,0,0,0,0,0,1,2,1,1,1,0,1,2,1,1,0,1,1,3,2,2,1,1,0,1,1,1,3,0,0,2,3,3,3,0,1,1,0,1,3,0,2,2,2,0,2,0,1,0,0,1,1,1,1,1,1,3,1,0,0,1,1,1,1,2,0,0,5,1,1,1,2,1,0,1,1,1,0,0,0,0,2,0,1,0,1,1,1,2,1,2,0,0,1,1,1,0,0,1,0,1,1,1,3,3,2,1,3,1,1,0,0,2,1,0,1,3,1,0,2,1,1,1,3,0,0,1,0,0,1,4,3,1,3,2,0,1,0,2,0,1,1,1,1,1,0,0,1,1,0,1,3,0,0,3,3,2,0,2,0,1,3,0,0,2,0,1,1,3,0,1,0,0,4,0,1,3,0,0,0,0,1,0,3,0,2,0,2,1,0,1,0,1,1,1,0,1,0,0,0,1,1,0,1,1,1,1,0,0,0,0,1,1,0,1,0,1,0,2,0,3,2,0,1,2,0,0,1,1,1,2,0,0,1,0,2,0,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,1,2,1,0,1,3,0,1,1,3,2,0,6,1,2,1,2,0,0,1,0,2,0,2,2,1,1,2,1,1,0,1,1,0,2,2,0,1,3,1,0,1,1,0,1,3,2,1,1,1,2,2,2,2,0,1,0,2,2,1,3,1,0,0,1,2,0,1,4,2,3,2,1,0,2,0,0,0,4,0,1,2,1,0,1,2,1,2,1,1,4,1,0,2,2,2,0,0,0,2,2,0,1,2,0,2,0,1,2,0,1,2,0,0,1,1,0,1,3,2,2,1,1,0,0,0,3,1,0,2,1,0,1,0,1,1,1,2,2,0,1,1,1,0,0,1,1,0,1,2,0,2,0,3,2,0,0,3,3,2,0,1,1,0,1,1,0,2,0,0,1,0,1,0,2,0,1,2,0,0,6,1,1,1,0,1,0,0,1,0,2,2,0,1,0,0,2,1,1,1,1,0,0,1,3,1,0,3,0,0,0,0,1,0,1,0,0,3,2,2,0,0,2,0,2,0,2,5,1,2,0,0,2,2,0,1,1,1,1,1,0,2,2,1,3,1,0,1,0,0,1,0,1,2,1,0,1,1,1,0,2,1,0,4,2,2,1,2,1,1,1,0,0,1,1,0,0,1,1,2,1,1,1,2,1,1,0,0,3,0,0,1,1,1,0,0,1,1,0,0,1,1,0,2,0,1,0,2,2,1,0,2,2,0,2,0,1,0,2,1,1,1,1,1,1,5,1,1,1,1,1,1,0,0,1,1,0,3,1,1,0,3,0,1,1,0,0,1,2,0,1,0,1,0,2,2,2,0,1,1,1,1,1,0,0,0,0,2,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,0,1,1,2,0,3,0,0,1,1,1,1,3,2,0,0,0,0,2,1,1,2,1,1,2,1,2,0,2,1,1,1,0,1,0,2,1,0,0,0,0,0,1,0,0,1,2,0,1,0,1,2,1,1,0,1,0,1,2,2,6,0,2,0,0,2,0,2,1,1,0,1,2,3,0,0,0,3,1,0,2,2,1,4,0,3,1,1,0,1,1,0,1,0,0,1,0,0,0,0,0,1,0,2,0,2,1,1,4,0,0,1,1,0,1,0,1,2,0,1,0,2,2,1,2,1,1,0,0,0,0,1,3,0,0,1,0,2,2,1,0,0]}]},"null_count":0,"last_update_version":397952029017767936},"p2":{"histogram":{"ndv":1991,"buckets":[{"count":8,"lower_bound":"MDMxWGExTWIxalB6c3hxdndXSVRIRU9iZGpWQWhuVW5BTnViSmpHODB2QkVHc1NuWVhFNTBUbjloYlRPdQ==","upper_bound":"MDlzQWlPRDB4VUFLWFJjeWNJRFY2Q0NJRlZn","repeats":1},{"count":16,"lower_bound":"MEJGRTl3U2RHdDV5WkV4WmtBejhrSVIxeEdTOUpXMkZIQUZQZEJ1YkdNZWsxT0E=","upper_bound":"MEVqWEppVUUyMFdLT2gxVGxXRXBLSExG","repeats":1},{"count":24,"lower_bound":"MEZJelRHMVh0ZEdhMmFJQ1FLVXI2elVZWG9ucjFXZEtkRnUzUEQxZFk1aFlMUEI0YUlsY3JNbg==","upper_bound":"MFVVaW0xRHJ5QzE3a01CWFV2","repeats":1},{"count":32,"lower_bound":"MFVsaTBiUGtlWlBGQ1FHUE9ZUzNqM3pIdWN5TnRXbVdOMWh2V2gwNjhHS1hxWGNWWVBodWtTd0RBTzFG","upper_bound":"MGRxbGRGeVMzNFNJOVZNeWR0RjlxUjhwOHg3b2lTU0pRSUo1bFJkWWE1VTRMZG4=","repeats":1},{"count":40,"lower_bound":"MHB2S3NvdDl3QTNMbEI1bkU0S2ZxTFRISEZiazdHUUdWRXJPMk5GRFBnVGN2VXc0","upper_bound":"MTNGbmZPNkVTb0I5UU12cWhKYXZLdjd5N0ZWR1N4RDNCd255eUZUdXR6Y1lvOU1rUXBZSng5SA==","repeats":1},{"count":48,"lower_bound":"MUEydFBpQTQ5eUlDM1RDTW9FZ3huS0dwTkptMzFpMDd2WTRUOHh5UTAxc1RuclFQU21y","upper_bound":"MVg3VmpuandDdVJqbVRqVEQ3VTQ1b29ZN3NtaFZyRDBFTlBJZEE=","repeats":1},{"count":56,"lower_bound":"MWQ2MEZmQ2NHbXFPVUhXNjl6QWpQbzZLN0tWeWkzTjRteDcyemNoZGR4elRaNEVoUmpadGVGWkY=","upper_bound":"MWxtRFBXNU1XS0dyOVMxUEdna29ZR0FIWWhpSzM0aUtpc0c2WTFiN2dEcXY0WHROa1FLbGdhRm1zSzc=","repeats":1},{"count":64,"lower_bound":"MW1QdzZUWmVPN2p5ZGQyUWJBVW1Oa0RhRExhb2wz","upper_bound":"MXV6MDU3QUozWjU5dnJNVVM5ckI5RUp6NXJSSWw3aUFwRFJndzRW","repeats":1},{"count":72,"lower_bound":"MXlSUlgxWUxNZGI3UkZiamNCaFlPM0FXSnJlaHVZb3ZzUmt3eVU1WXpmdEk1MEQ5RTh3","upper_bound":"MjZ3SVJIbWZNRG85Z0dLVkZvZ2gyY0VhZFJx","repeats":1},{"count":80,"lower_bound":"MjczYmhmb3paVEVsdlZ6ZjQzdWJXcmdGUnp5a3R2YVZvcTJkQmtuVmE=","upper_bound":"MkpSMQ==","repeats":1},{"count":88,"lower_bound":"MlE0bnUwZjBidGc3TzdVcXhGNUdPOVlyNnB4UkJRSXM=","upper_bound":"MlZMcUpHMUN2","repeats":1},{"count":96,"lower_bound":"Mldabw==","upper_bound":"MmJtU1AxZ0dLSXA0UUZmMk9ic3FxVHdObHdiTnhxa3FUUmVwODlVckJvRGdJVHFwaGhjbnoxMjdR","repeats":1},{"count":104,"lower_bound":"MmM=","upper_bound":"MmdjUDhCQTFxR1BkWUVTNTNWYmM2ejk5dW9xOWFPOG1vSDRQdFkwaVA=","repeats":1},{"count":112,"lower_bound":"MmloWno1MmpDRlBqYm5yTFdxRWVwTGpjeVFVWlM=","upper_bound":"MnI5SkdXYWI5OWdrcXpaVDNBUlU=","repeats":1},{"count":120,"lower_bound":"MnUxZmliUzNlRHdpUzZrMnpud2hVUXNhcktxalZFSlFXcHdDeGp2a0ExRnBtaHpmWTcxOHlJZUVvTDg=","upper_bound":"MzBmcnZFV2hyQ3RBWVRXbkZLTVI5VkhFQmtXWUw=","repeats":1},{"count":128,"lower_bound":"MzNIbHJONzMzdWQ5Yzg0eGxuTw==","upper_bound":"M01rajExVEQ1SGpZT1JWaEp1SVhCZmpLRTRzeXFW","repeats":1},{"count":136,"lower_bound":"M1FTOVQ0WFI5b3NCWUxjWlJzUWtjbkdnSDVWOWxmZUpuYzVYaXpjaE1hTlE3cm1kS1RyREE1dA==","upper_bound":"M2FncVUwTkN0T1hUZHVMZ1hzVTQzcmtURGtqQng=","repeats":1},{"count":144,"lower_bound":"M2M0R1BGRHo3MmdsWkxpZ1hHa1VkZGh6RUpuWm0xM05HajBEZFo4dlhCVENkRVRvcA==","upper_bound":"M3pBWnlDVzU5eDAwdWk4bWZYbERLVk1qVWdnZkpOejQ=","repeats":1},{"count":152,"lower_bound":"NDlVbDFtaVA0RG9iZVBxMXRv","upper_bound":"NFRNQXVFNncyb3JqZUtuNnVjTW4=","repeats":1},{"count":160,"lower_bound":"NFVSTkdCRlVhaEVJVTUwOGMwNEs3c3JLaUIybGhsSUdRSlNtTEZaQmcxbFVPb3ZidU5oMGRJanh0MHJwdg==","upper_bound":"NGVwUzdjVjRzcnNtVW5XZ2N1YUEwZm4wb1ZV","repeats":1},{"count":168,"lower_bound":"NGpYbFNGcjBvNXF2ZzdFcm5FT2VSNGt1bkRCRzd4RGYyNGNt","upper_bound":"NHY1dm9j","repeats":1},{"count":176,"lower_bound":"NHZkbW9VOThQdmtVMTNxSE1zQXlwYXBhRQ==","upper_bound":"NURjUUluTlNHWEtFdkg1Uw==","repeats":1},{"count":184,"lower_bound":"NUY=","upper_bound":"NUxU","repeats":1},{"count":192,"lower_bound":"NVVRM2ttRGxWN0Q1WXFGQzJrVktia3gwMmk5REQ1UmpkSWRtR2VsRjdiR2Nzem1kUHI5","upper_bound":"NWJDdHZCNUFoOGFoVUdyb21TNncwczc=","repeats":1},{"count":200,"lower_bound":"NWJuS1hRSg==","upper_bound":"NWxU","repeats":1},{"count":208,"lower_bound":"NW0zN0NUNU9ocmUwa0xPaHFJZzZvb2xEN2lMaldiRnVUTG55MXY=","upper_bound":"NXVndnN6NEtUcTcyM2lDbXBhTVVhbldhTnRwM2NWdVBP","repeats":1},{"count":216,"lower_bound":"NXhCRksxMHhnbzltempnNThwUjY=","upper_bound":"NjFzdmVDUHVxQ1pVOHQ0bVVjNUZoNW1tYjNVMnRNMXNzeGg0bGVaRnYxRg==","repeats":1},{"count":224,"lower_bound":"NjJXOUhrUFN6YnNyaWxIZE8zdktScm9xdHo=","upper_bound":"NlI0Y2s5dU4=","repeats":1},{"count":232,"lower_bound":"NlR2R0ZaaXU0T2s=","upper_bound":"Nmd4N0lsdlk1d0w0ZmV2N2o3QzR3YWRX","repeats":1},{"count":240,"lower_bound":"NmkxMVVleFJYREM5bm5RdmtDak5UWU1wUG83blRFY2c0b3ZvUWFFUGdtM3c=","upper_bound":"NnFvY3lEYmFieUdreVJvR1Ywc1M2VW1pT2RIWmJoUQ==","repeats":1},{"count":248,"lower_bound":"NndDQmdLNHpDWjJZR0w2dlFWQjAyU2N4aXFlSzdLT3l4aEZ3ZVlsSzdyb2Y2NA==","upper_bound":"Nw==","repeats":1},{"count":256,"lower_bound":"NzhVekdyVEVIcFZ2SkFYRGFFaTZvNzU5bDk1SGM1YVJUTQ==","upper_bound":"N0h0ZTJPNHB6bXdRZTlTRE5rNGFX","repeats":1},{"count":264,"lower_bound":"N09jNQ==","upper_bound":"ODEzVjRxdHhVWFM=","repeats":1},{"count":272,"lower_bound":"ODFOVDVMVzl4ekxlUVpzbFNNcmUzUmJiTm4xcDZXMHNQc2NWVVJ2WFpRQ2pvRDVaU1pkTUYzZGwyaXI=","upper_bound":"ODdIQWNweUxaSjYyZ2pPRWlpVDl4SVFqZA==","repeats":1},{"count":280,"lower_bound":"ODhhbTZXSw==","upper_bound":"OENQSjlHdTJQRU1FVlIzVVBCdA==","repeats":1},{"count":288,"lower_bound":"OERhQmxvMnI2d3RMYW43YldEbkhOQ2hwV3Z3NzlQYnBxekI2RFBtYnlpY2JQak1QYWh1ZEd0dw==","upper_bound":"OElQRVNJNURZaUF0ZjFvRTRhREtIUTFtQmVmcHZUZnU5OA==","repeats":1},{"count":296,"lower_bound":"OEl2cXVOY241djlXYnA=","upper_bound":"OFh4RWJvbk1QdnN3OGhPbk13Mng1YmlTM1lacHA4amJm","repeats":1},{"count":304,"lower_bound":"OGdrU20zTw==","upper_bound":"OQ==","repeats":1},{"count":312,"lower_bound":"OURveDV6RUs2ejBTdFYwT0pvbjU2VnBxU0hMeDM3RHNuN3FrUDdCN1pkYVc3MVdsTFFpZGNVc2hSTA==","upper_bound":"OUlLUDVmQzJVbkVBYkN5QlZOSG1FRXZMOTVWWW9reW8ybDAweWZLbXE=","repeats":1},{"count":320,"lower_bound":"OUo3SGdOV3pQeVNKSExoOGNZODA3b25iVnNQcmg=","upper_bound":"OVRJbEFGc0hUU090SWg2ZmVQM1JTMXZ6bnR3c2t2SDBT","repeats":1},{"count":328,"lower_bound":"OVVRVTUwMTRDeTRxYg==","upper_bound":"OVhXQWY1WUI3c0VxZGtDR05BeklIV3V5VFNtcw==","repeats":1},{"count":336,"lower_bound":"OVhuYnFEMEFoaXIyclNrQ01OZDd0NFNteWlOZFlyT3Fqekg2VHkyU3VwWjhzaDNCYWhEUjB4Ymx5OU5CbA==","upper_bound":"OXNZMkVhalJxeGNTV1BtM1JwcFN6ZTFVSHR5WlhqWEczVW5yTGhGY3kxT1dHQ0tNSUdzNFFrY2FJ","repeats":1},{"count":346,"lower_bound":"OXRWRWg1UnQ2cVRsVVMwY2kzZ0w2a1UwMjFCemxhcVZlakZYVTBYSkd2TzhmYTRCbGszQmU4","upper_bound":"QQ==","repeats":3},{"count":354,"lower_bound":"QTJ3Ukp6QmdU","upper_bound":"QUVnSU1FaW5vV0VhRUc1ZWd5dmJaTVJpeTZEeHhCYm44d0dIT2c3MVR1R3JhQ1R0Q0thR1NGbkhI","repeats":1},{"count":362,"lower_bound":"QUhKeFdIYTl0SEFOcjdUTWVDSDkyZFRrczFXQkFYTVVVMXp4Z0w=","upper_bound":"QVhzTm9ZdzdXYjFubjZUSmliZlVsazU2dVRrRnBIbmFQanRIcFdEaEhx","repeats":1},{"count":370,"lower_bound":"QVk4Y2JKNDl2UEl4UTZRS1FKdkRqelI5V2VKT0pRV2Vvb1dsMXZmY2ZmVk1hZHZERA==","upper_bound":"QWVqSDV0eDNPRlRadjU4U3ZweG1kM2J3MDBi","repeats":1},{"count":378,"lower_bound":"QWlwZzZuTVpBMmdKcDYzejNiZm1Mb3dzZUdQU3E4WEk0MFpLVzFucmtZenJS","upper_bound":"QXRsa3VlN2xV","repeats":1},{"count":386,"lower_bound":"QXY1R3l6WE9DNHA3TXg=","upper_bound":"QXpMdjE5S3NWTTU0UFpBdGw4dkRYSnNxUGRjNmtxY0NKQlJ4THNhekZhSXpkbw==","repeats":1},{"count":394,"lower_bound":"QjJLODJkOWhyZ3VTbXZzWEtDQnJ2SnA=","upper_bound":"QkU2ZXRRT1lMQWNybzg3OWpLa21KM29pUFg5RDNQU05PR05FRXlqZFNQR1BCYTdq","repeats":1},{"count":402,"lower_bound":"QkVCQ0ZyMEE1VTVrZTVBSVU0TkVwMGlid0tMbGpEUVZFWlp2UmJM","upper_bound":"Qk91b2RYNVp2eWRNdXhLcEU0ZTFYOUVkdmNEQlVLR2NIZWNOWVF1TUlkNXgyMzQ4VmphR3V2dA==","repeats":1},{"count":410,"lower_bound":"QlRHMncwdlZXcG5WaDJtMklEVW5rSFgzdEdXWGc5cA==","upper_bound":"QmQ0dlhwRUg0TEQ4bHlWdFozSG5CUUF5cXRtbEswZVRlZVFYdzJHTw==","repeats":1},{"count":418,"lower_bound":"QmhBMUV6NTdhOVd4bUdBSm5iS2JqT01tVFBHUzYwdGM2YzI4OWNxTmk5MEdhVkE=","upper_bound":"QzRwWXJtNGZSbzVrb2RGdnJua3ZCSHAyVlRLQkxVWjVIcjM3YU8yelNiQXA=","repeats":1},{"count":426,"lower_bound":"Q0dFdTU5bWhiNTlmZDlZd1k=","upper_bound":"Q201Z0Z1","repeats":1},{"count":434,"lower_bound":"Q3NoMXNYeWJnaUljTnFwMHlKREVKb3dOWGVrRDdNSW03eHZoZ2xkUFZKOHhGV0Q=","upper_bound":"RA==","repeats":1},{"count":442,"lower_bound":"RDJrRGpIQTZqV1FCbGpvcGtYc1kxdDR4dDNXQW9QamlZTVFSUUhUaVNqaVhobUVlOUZJRG5QRHgzaA==","upper_bound":"RElHNGdqQThp","repeats":1},{"count":450,"lower_bound":"RElzb0wxbVUwYVM4ZjZjam9nNGlS","upper_bound":"RFRZSDQ0NE5qakJ5TmJnTldZ","repeats":1},{"count":458,"lower_bound":"RFVIYm1HRno5YzRoN2VpNHA5VjJEZEtrc3E5eDZmVWQ=","upper_bound":"RFlpZ3E4Nkx1ZGx6THg0Qk1LSHhNelo=","repeats":1},{"count":466,"lower_bound":"RGRSVjI1aG5sanhRY2owRUNlVGtFeVNURXVYY1FJaGo3ek0xejNTVnlnbG80OExBaFM=","upper_bound":"RG1WY2dQa1hlZVd6SlJCN1U5eUthQg==","repeats":1},{"count":474,"lower_bound":"RTBiZHdjUVlYZ3k=","upper_bound":"RUFJckF0MkpHVFNZV2dPeDVreUdKWjds","repeats":1},{"count":482,"lower_bound":"RUFPTzI2MTluSzRBalI3Wm1kdnB5ejVEaGlaZWtDZlZkUjNha2c=","upper_bound":"RU5DcDZpTks2ZXhXVWdSWDlwcmNNMlA3R1BFQk1jR0JW","repeats":1},{"count":490,"lower_bound":"RVJLZUxpQVp3QWhqVFBPY2tQU1NhNkJzNEZSY0FEdHY3ZEE2cHEwdg==","upper_bound":"RVk3dzAzS1NEbkdpUkNNTWhiOXJCV1VlOUJMYmRuZ1lVT2s2WGNtU0ZkaXh3bFJiUG0wQ0FGZmRpc3U=","repeats":1},{"count":498,"lower_bound":"RWJhaUFHZ3Z5ZkVwMzQ3SVdpRw==","upper_bound":"RW5CaDkzWGwyVzRyb3Q0RHNDWUdrOQ==","repeats":1},{"count":506,"lower_bound":"RW9PMVdiVEZMVGJ3ZTdLNVgzNW5ncFljRg==","upper_bound":"RXZpWGpWSDJHWkJHcVY2aktHWDAwVnVMcVFGTWhqVUxLcUpZ","repeats":1},{"count":514,"lower_bound":"RjVVWThXZXB3WVFRWGpNNnA3aXVLdlVkaDlOMWdXV1ZTckJSQUl6UzhJWU5MbUx6c0o4a1dJbQ==","upper_bound":"RkU0c1JjYVRpS3d2WUE3TEpYbTVlRTZMdUJQdFdtZ3dBNGNickQ3ZTBGUU9ZcDg5QlFEdXcybEpLWQ==","repeats":1},{"count":522,"lower_bound":"RkdrVE11bnpQaVA0UnFjQk85Z2p6NQ==","upper_bound":"Rk9pdFp6dVR6OQ==","repeats":1},{"count":530,"lower_bound":"RmU5N21wTUhRNDA0aE1ZcjBmOENCdTJINzJkYTZnNEZENDdlbkhRTzk=","upper_bound":"RmthYUxJUVFkcndTNGl1TnJ0enN3bUdMR2dTR2RZRWpIaVNsTGZOZjJQ","repeats":1},{"count":538,"lower_bound":"RmxOMzZGUHhoVVhUd2xYV3RCS3AxQ2lEeDd2cVVqUTZSaFJrMG8=","upper_bound":"RnZLdjZHSzJRQzl4OUJEY2FIMU95dW8=","repeats":1},{"count":546,"lower_bound":"RzJsbVFXMnNaWmdjd2JObnE2ZTZDcTVUYmowajhORW1yOTgwa3Y1NldQN3ZQQTdya0ZOVE1QajAxTzNJc1k=","upper_bound":"Rzl6VHprZHRCTmlqTTBBc0ZwaGNSVnV2QW93ZlRF","repeats":1},{"count":554,"lower_bound":"R0FyR3JGejNLYlRWWlFNYTZYWXA5Tk4=","upper_bound":"R1NLSDgzMXhqZlNBdw==","repeats":1},{"count":562,"lower_bound":"R1dJakVqWmRFSWtXQkU2Sk9GN0JGRXo5TEdEVTg1dDhkYXN1","upper_bound":"R3JlSDFJakJ5N29kNXluSERCZHE1SHB2NlJYTUJkTjFsNEV6MllTU0hDNVpoVWxvT1p3azY=","repeats":1},{"count":570,"lower_bound":"R3NuWHZxZW8zTUs2alNqQU5DTkZkeUZqTjhSMVg5N1JTQVNFVk9GbG5VMlh6aEl1","upper_bound":"SA==","repeats":1},{"count":578,"lower_bound":"SDBSQkdGVE9zcGM1WTUzRE5CSw==","upper_bound":"SEVwT0laTUhyVnFSR0ZzYlFiMlRNQ0o2ZzE4OUxsekozVDF6dEhaNlhGcVFr","repeats":1},{"count":586,"lower_bound":"SEVydnYwUWVvd3RwRGtXdjFSNG9FNDAwV2VTeWl1bHhsR0Uz","upper_bound":"SFB2N2lMSU5CU3ZPTlJ0cGVVRGwwS0NKR3BUcjhYN3UzM0szWlJOU3VzTmNYUA==","repeats":1},{"count":594,"lower_bound":"SFFmVWJkMmZOUXl1d2ltU1lwa2V4NksyNHlWeEVLMmk=","upper_bound":"SFpDajNKTGg2QWxENXlIY3VkS0lYOXJUWVJkc3ZTQjcx","repeats":1},{"count":602,"lower_bound":"SGFQY0ZYb1hmNDFOdlg3eEdCSW1WdTNTVUVn","upper_bound":"SG16TjZjUGhlTEdORmpBd1F0cUFycDlPOU96S0M0WnE=","repeats":1},{"count":610,"lower_bound":"SHRJYWN4UkZ4Unc5ZXBYTklqNUdCMEU=","upper_bound":"SUdzN1drOTVOQ0swMHdMTmR5MHNtR2NBTHFW","repeats":1},{"count":618,"lower_bound":"SUpGQVdRNjNiUzJFYWZPNTFSYnBYa3g2N0cwN0dwYlJtODJpQkVw","upper_bound":"SU9RZ1kyV2NPYll2aUw5V0dpa04xYUV4dA==","repeats":1},{"count":626,"lower_bound":"SVVXTU5MdVM=","upper_bound":"SWI5VWdiTVV4cUtic2ZtZENZNkFtUkE4bUpBYndjWXJSdkJBVzE1bUprTVl4N3VqS1NPQUw=","repeats":1},{"count":634,"lower_bound":"SWNuVHlZU0IxVFR1cW01TUUycWkxV3NFRFhSZ0R6c3hBbnpXT3l4ZkxMQXZLRkhrRDBLRWh6VlRnVFI=","upper_bound":"SXFmTTljRVlVcWNNaGY=","repeats":1},{"count":642,"lower_bound":"SXZ2Z1AyYmliajBlYnRpdTUzdVlOMGt3dFpQ","upper_bound":"SjZEelBaTDZFaE9hcjVQTnhVZ29QcWhHQ2NTSkFhYVlhemJwRGdQeW4zZTg0S2JwdkxYV2RM","repeats":1},{"count":650,"lower_bound":"SjZv","upper_bound":"Sk41MVhyeEt1WFpVb0tFSEtzV1RGYnpXZkNieA==","repeats":1},{"count":658,"lower_bound":"SlZTV1RlQ1FCU0dWRkU=","upper_bound":"SmJRNnFqWnA0TUNsVEtnUWU1N2VJUE1OS0Q1Z2ZGbGhKTVV5TnpFN0NBYmpBbQ==","repeats":1},{"count":666,"lower_bound":"Smk4ZzJZT1VUcWhKNlB1dllNbW9TSm1hQjRTeGJnY1V0VXBCM2hOUVhocFBFa3ZJMVBxUFA=","upper_bound":"SnBJQ212VjJIQTdsMXZCUXFvaDlaaldGaVNXb25zejZPbEZ6UmoyN01uelBraVBwUUdl","repeats":1},{"count":674,"lower_bound":"SnBQaWtabDBZVDdDSkpLQTJpTEdhSEozVDBrZg==","upper_bound":"Sw==","repeats":3},{"count":682,"lower_bound":"SzVlampRaEgyMnZKQU4=","upper_bound":"S0RscXF5cm50MnQ2aXdldTU1MUFnbnpZV1ljT21TVjk3R3JaMUgxNVJDOGZ1cTBlcmo5","repeats":1},{"count":690,"lower_bound":"S0x2dGJsNVlTcHZJZGxtblRrOW5heWwwT2tpUTI2OXN2ZXNnTDVVTHdQN1Q1dThyZzJCWWtCQg==","upper_bound":"S1NuY1Z3VHhwRTNwSGl1QmJTU2cxMjNMU1RXRVBUaw==","repeats":1},{"count":698,"lower_bound":"S2N5SzZ0ZjB6cW9KRFNuM3RKOEZNZXZkNHQ0TE1CUHJyWVB6ZkI1UmFRRDc=","upper_bound":"S3NudFBvZHpKRHI5REtQN29iSFY2cmx6RWp4TTZKRGFXV0VLTVhsUW96aHk=","repeats":1},{"count":706,"lower_bound":"S3ZMcEZYcUw4ekxkRDVmSncyQTVaazVzQkg0eThDek8=","upper_bound":"TER3dHhiQk9uNXBmNEJvM3phbVZLajRxbnM5RDFzZllmcmxEdXBOYnF5YTJTbEpEemhFUw==","repeats":1},{"count":714,"lower_bound":"TEVQOGFDaA==","upper_bound":"TFVQeXlyVzFIbjhSR0tsblJkdUJGN3VIYml0NDlnc3p2ZDdBYg==","repeats":1},{"count":722,"lower_bound":"TFY5ZUVRNGlCR1hqbw==","upper_bound":"TGFzOENmeg==","repeats":1},{"count":730,"lower_bound":"TGxDWWFtZGNDWEpsYkJuRWRGb3k0QlRheVBiQW9KYVlYWklKSzF6MkptOXVFd0RpT2d5VzFpcVR5SmxicG50","upper_bound":"THY4TjNEY3dRRklZMDd4VmpDUldLTUFtdXZkdzBmSGZtWFlVTA==","repeats":1},{"count":738,"lower_bound":"THppZA==","upper_bound":"TTduMGVOdWpzeUszZzFick9pWmlSSklVQkNPcFlNZ2dBVzl3MzlqNHlpMXhmSmRxbW5Ib1RLaEk0a2dJdVM=","repeats":1},{"count":746,"lower_bound":"TURzOGZQVFZ2NGRxTzRya0Q4MlNUWERGR0xuWGllRXVFTnJLcG4zSjJVQTVYVWkwZGJEMjRyb0ZEUmJu","upper_bound":"TU1MY3ZXc3BlQ1RFQmRmNHhkZ0EzUA==","repeats":1},{"count":754,"lower_bound":"TU9JdlRYbkVrSjFURjZhV0tpaW5XS2pZeng4b0xLQU5BZUp0cjRLb2hX","upper_bound":"TVZ6cngzcEZ1cG1KbmhnOXRlcm5RRVlNNXoxSHN2bWIyOGVZWkk3a0k5WWhMTQ==","repeats":1},{"count":762,"lower_bound":"TWFnNDNucGVSNGFzeVRITDJRbXB1R1pOdG5aZlVMQm9BdFR2OFB1dnJ3UFp5azZVWXB0YW0=","upper_bound":"TW9hdVkzb0JCNG1yZFZ0bUo4VFhnYlhoam1TdDMyRzlEbjAwQUYzbEE3VXpyNHFicDhXOWxvMmNWVg==","repeats":1},{"count":770,"lower_bound":"TXA0bGM5","upper_bound":"TXlnQzI5N05RZzZmMWdGNjFIYTFTNGc4cUJaOTlON29MeEQ4MTNzME1vOA==","repeats":1},{"count":778,"lower_bound":"Tg==","upper_bound":"TjB6WE5QS0NaV0lJd05rVXBYVGdrUjBONXIyQzJHVHVJQ2dpTw==","repeats":1},{"count":786,"lower_bound":"TjNjVlV5clFiVEJrckNORWlzeGtBd1RUajYxdFBVUDI2V1Bzampo","upper_bound":"TkFwUDEyazJDRkIySHI0V1RoMWp2Qm1NUE9nSVN4aUM1dU9pWUlIc3NBQUo=","repeats":1},{"count":794,"lower_bound":"Tk5IVUN4YQ==","upper_bound":"TlliRU5LcnV3MEd0RFRGZkUxTHVYclI4Y21BMktzZ1ZsbFJkMDZiRWluU09TWDE=","repeats":1},{"count":802,"lower_bound":"TllqaHU5ZjMyOFBKMFNMb2JQU2E2Mjd1RVRoNkQ2ZTNEN3dNNXJUSVV5S2hPY1ZMbWVvZE9OUjZPbWJWOQ==","upper_bound":"Tms0S1ZXT2lsSkJmZHE=","repeats":1},{"count":810,"lower_bound":"TmtVSXJXeTJMb2hHbkNZN1ExdzJlSzh2dTE3aThYbWtTRGdPOFlHcVljZEFoQ2d6eUpqa3dtQkx6YVE1TmRxeQ==","upper_bound":"TnZQVlN3YmhHd285REw1QmhQSUFHMkM1c25pVEg2Uw==","repeats":1},{"count":818,"lower_bound":"TzB6ak9BRHZrcHREZ2JvOGRSeU1lSHZFamlvbnFIV0E=","upper_bound":"T0Rld1dOTHpBdDZ0dXFid2kyVnlwa2pYUzRzWjNJakYwMUJJVDllZGQ0NmE=","repeats":1},{"count":826,"lower_bound":"T0V0RG9QVzBMY3RhNXFoQTFVWDlHRTdORzFyejc0YkV4eEZjYUprdU42Z21LUXBSZm8=","upper_bound":"T0xsM2NFNE94UnpYMnZ6bTZWb0VnR2h6aGo5UXZaeVZWeWxhbTNwZw==","repeats":1},{"count":834,"lower_bound":"T1F1Tjh6aVBaTEp5dTFmUUJrQU9VREtSVEtVS2JDendueVVmOEpJR1owb2V1ZVd4MmNJWUpYQzRMb04=","upper_bound":"T2lJS29xbk54","repeats":1},{"count":842,"lower_bound":"T2xucUJlRG1WOXV3b3h5a1pY","upper_bound":"T3ROS0Fzd0ZRUHZvaFVOSW8xZHcyY2N1U3pNSTNUZG9tbm4=","repeats":1},{"count":850,"lower_bound":"T3gzQg==","upper_bound":"UExaazZrbnY1ckZqTTJjSkN2dWFHcw==","repeats":1},{"count":858,"lower_bound":"UE42NzVHR0NpVg==","upper_bound":"UGR5OU5ZcFZOZDJXemdsc2g3S2k3Ujh1Y3E2NW1XSzd1T1daZkdsM3NvNEtkcm1WTXhDMDZVcDJRMEVt","repeats":1},{"count":866,"lower_bound":"UGdISktwSENMNVQ4SFlTVzZVYjFXQ043cjBrYw==","upper_bound":"UGpMYkFMc0lkTUNXVXZnaHZYdkl0dzlDOGpWRTkzVmpvc1NDc2x2TFRqMGpqMTM=","repeats":1},{"count":874,"lower_bound":"UG1IdDZYcmVHaFJYOURxMVJmRndKaQ==","upper_bound":"UHBxNFJZWGRGTXB4TUpxbzZ4aEx2dGVnSW10N2ZTcTdCdDhNbVNwM3pvRDBy","repeats":1},{"count":882,"lower_bound":"UHJ0TzlDWlB4bkRDa0NKcnpsTjgzVUNqTW1ONlFscEpYT0VZUDQyQUR3","upper_bound":"UQ==","repeats":1},{"count":890,"lower_bound":"UTFOYzZnMk1aM2g1YjFlR1Zo","upper_bound":"UTdzR1ZMbjd4bWdZWlhxN3lsc2VpRnFPZU1sT2dJVWRyU1dpUHJCbFF3ZjB3R094Y28wQw==","repeats":1},{"count":898,"lower_bound":"UUFkZ1dla1dKMEYxRkRibVU1enhSZHpTZw==","upper_bound":"UUlWakJuVzVCTnZweUdjdDRhNE1iNTBNdjND","repeats":1},{"count":906,"lower_bound":"UUpLUUlqNkZnbVlaU25INk5CV25ETklkdUpjUnZQUWV3SjA1Y2xWS0NmNUJUaGtwU1loNTBXMlg=","upper_bound":"UVhhWTI1TDNXZDdRZXp3cUJrc29n","repeats":1},{"count":914,"lower_bound":"UWpydjlBTTNNSEFuekY0UjY5T0xBdVlPMUxmNnBUZ0tyU2ZtN3dwRHlYS1pZcUNRZA==","upper_bound":"UXo2S1hYRVpBUTJiRVhXOWcwREtaV3VEVnZRcTJSaXJydHBaNVBpOEtHYUJEYmMzcVhZWkE=","repeats":1},{"count":922,"lower_bound":"UjdMMHd6b0Z0S3hCY3BNM1dXa1p1WDlYVjZtZUV6a0NpN3d6Y0xDUDV4Z0tjRkY3Q3Qx","upper_bound":"UlRZQkdNQXdDVFplTHo4UjZMZ3Myd0JGR3FXYnpFRGpiZTNpUjJjcmJ0dnVveTFhZ2c2b1hQQzhU","repeats":1},{"count":930,"lower_bound":"UlViQVJEOHdVblE0MEdVd0xNZG5GWTRwWUtxbndHQVBxNUg5ak9IU0V6MDVubWJKOHRTNnhmTzJjSGl1NVY=","upper_bound":"Um9jTFBMNFVMbWJWOUJBUWhPVGZrem1xbFR1","repeats":1},{"count":938,"lower_bound":"UnJjZHlWclBPMGlraW9IRXFoMHRQS3lLcjZyZkhuV245OWV4ZUlM","upper_bound":"UzF6ZjZDcmVxTmFpWTZrVHpQSWhIVjNxbUx1dUVhcm1uZjN6OXFLank5dXB6STBKZFhGczE3bDdsWQ==","repeats":1},{"count":946,"lower_bound":"UzdQdUhQSlVkWHpJUlBZd0NEWTZmU3M=","upper_bound":"U1Q=","repeats":1},{"count":954,"lower_bound":"U1RWWG1xcEFHWVpsSmlM","upper_bound":"U2FubGViZzZ2a2F4N3FJSVlRempmVmEzYm1WQlBpNzUxV2U5bmRoVWI5eVNZU0QxU09ZM3kxNkQwaTc=","repeats":1},{"count":962,"lower_bound":"U2NlZ0NNcHdYcXVuYTFBbnhvVnFw","upper_bound":"U29RWmV4ZlVvS2VIckc=","repeats":1},{"count":970,"lower_bound":"U3kxS1dGU3Y2SGYyRDE=","upper_bound":"VERTSWZCRDA0cGgzNEEyWHBabGNXUkxLOWt5V3Vsbg==","repeats":1},{"count":978,"lower_bound":"VEljUU5oUjlaeWhuYXU1Tm5OMWlZOGhvVVdXSUI4UW8wMlNsT3J6c1N4eGlU","upper_bound":"VG12NUYwM3lHVQ==","repeats":1},{"count":986,"lower_bound":"VHBESQ==","upper_bound":"VHVYaHdwbGlKTnByMEYzbXR1MjdmWUxxa1RjQ25YNDBCaXdibktQTFJzTjBMekZIeVFGeGhqaWxWaw==","repeats":1},{"count":994,"lower_bound":"VHZx","upper_bound":"VTZyUGs=","repeats":1},{"count":1002,"lower_bound":"VUVPNUcyQlAyRGE5d09heUduTmw0dTI=","upper_bound":"VVM4Q09qUjBxNlhpd0tkVVFBaW9Xa1FDTw==","repeats":1},{"count":1010,"lower_bound":"VVdjRkNtbzM=","upper_bound":"VW8xUGhDZjNaU1Z0UmlhbTBlNFhhaUtNS3NhTDF0SlpNRzE2ZzlzYjk0OVBDMDBkdkJ6bHRpUnN0RG1Bdg==","repeats":1},{"count":1018,"lower_bound":"VW9LUDBCdmZFdWFnUm5jUFVITm5rdGdBSEU1M015WmRFUUExTDNPRXRmd05DZ3J4UmpO","upper_bound":"VXJHejBOSTg3TnJaSnY4Z0RHWk1ZdWJ5am1EdlllRFZGbnBzbzBRakd3T1hlNGtCbUFSaHJ6eHVRUGc=","repeats":1},{"count":1026,"lower_bound":"VXRxVkoxUFhvUnFhRWV6VmxXUEVJblpUU0JWSWFhVlZlWkZBdWdBVnhTZDRGTVU0U2xaR1FpMVQwdHF4RkRKbg==","upper_bound":"VXk4REd4UzJKaW9CdTdZOEcwQjdlWWxib3lkODFLUVNFM1VYSFA1VU8wNw==","repeats":1},{"count":1034,"lower_bound":"Vg==","upper_bound":"VjZyd0tQNERQUmdycDZkaGw=","repeats":1},{"count":1042,"lower_bound":"VkFmVFAxSldFTDhiczgxSnBjYmVNTlpSYUVFVk5FdmVuVGVCUThrTlhPSGdpNmdFT0pFa3JwdnBFdGw=","upper_bound":"Vko3bW1NY05jRTEwNFk=","repeats":1},{"count":1050,"lower_bound":"Vkw5UGoyOVg0QVJmd04yMUJHbVRyN1hJNk4xUldhanp4R2haMlNOYzBadU4zVEVVZVZiWFNrUWxTYzF5ZGk=","upper_bound":"VlpCeXk1ajBrYnRvNVRrSGRnWnVhalZwa01ubEE=","repeats":1},{"count":1058,"lower_bound":"Vlp2RjFxV1lCSGRwbmtzZTRsUFVkVVNkc0ZSS3ZOdUg1cg==","upper_bound":"Vm4=","repeats":1},{"count":1066,"lower_bound":"Vm9mV3RRNVl4Mld0VXdTNUVMMGFIbEV5TUlVRXhQZm5GWVVYdXE=","upper_bound":"VzFzTDM=","repeats":1},{"count":1074,"lower_bound":"V0ZldmlPaWlVQ3MyOW4wMlVEQ2s0c2hrN3F0UHY=","upper_bound":"V2V5bzU0elNUQmpoMmg1OFk1TGp3blFtVXh0bG5jTmVOcGpVYU41","repeats":1},{"count":1082,"lower_bound":"V2c3Ynp5Q3dyaHBpQllBeHM4d1Z0aldFQzJBWHhOeGZhUlRXYUxzWnM2ZmVRSXd3TUlteXBo","upper_bound":"V3YwMkZKTUdTVUpGRnczUlpIbUxjRExIM3ZIRjFIUFdWY1lwT0ZXeFJhTzlRR0E4WWlIemp3N0lESktk","repeats":1},{"count":1090,"lower_bound":"V3phZVpCemExbmYxU1N6OHRQa2dCRmtKZUpOUU1PZnVSMjhkd2NLa25qUTIwZmJqZDZzc0k0N3pwYg==","upper_bound":"WDVoZGhKSg==","repeats":1},{"count":1098,"lower_bound":"WDZXNXl0a1N5SWFGNUJVankxbmxMaEk2dFlkTlZDWlhvcDhJUVFVN21mMWZ5ZHdseEprS3Bqcm5ITGY0aUQ=","upper_bound":"WDd1MUJHSjBsTmdaekdoRVFhM0VxV3pTTXNJQjYyVGxpcm9US2E4WTA5QzhnY2J0RTlVa1VoUA==","repeats":1},{"count":1106,"lower_bound":"WDhwbGJBbXlYc1hLV0V4UHdqT2Q=","upper_bound":"WEVYY3JtalpKalc=","repeats":1},{"count":1114,"lower_bound":"WEYxd09hdzVPa3hld0JaQnFnUVBQbWJUcjQ1WGMxMUlCR1ppSlhqM2EzMFJvUkdD","upper_bound":"WFFXWE5GZEh1NTNKWENBZmVSeXRZTndSeHZXYUJueFo5VWFhV294UnFoMXU2V2NjaVd2bGJmUg==","repeats":1},{"count":1122,"lower_bound":"WFVrYU5uTWg=","upper_bound":"WGFPbEt2N0JOclpJYjJhMjJzdzF6VUVUMW01c2tzMXJMblZwd2tPTHZaa3JaY2Nidlc5","repeats":1},{"count":1130,"lower_bound":"WGNtc3Zya1l0ZzBQOXVab3JGT3YzdkhIamhKWjRnTTZxdjdRazhPRjJJWlU3UTYya0FWS1ZvYzlTbmxjdE8y","upper_bound":"WGloZTJCcG5XdllIY3ZpcDZMcGhRMDVOUElxbWhtbzZydDZwV203eg==","repeats":1},{"count":1138,"lower_bound":"WG5TcHZBa3pWU2ZLVUxjOUI4YlI3WmtzYlB3Sk5SeEluUjlSWWxY","upper_bound":"WHVLRVczOThmS2dmbjdWSGZEZGRoMWhueEZSVkFUSFNGZG9wbWdiOVNlaktq","repeats":1},{"count":1146,"lower_bound":"WHdJdHhyRUY4","upper_bound":"WTRyWjAxOElQRVAzcUw0V290TVBWeXAyN3ExcVdGYTJBZFdza1M=","repeats":1},{"count":1154,"lower_bound":"WTlmQWFQOGlPUjBkWWt6TW5iaW1tb3hvM0s5UE5zaDBTa0lESzFhVEM4cXNGcnN4","upper_bound":"WWJFZGlEM2NLZ2ExblNkaU56cEkwZGJSNEg0eVhZSm9xa0Z4UXQ2UjZ5MkdX","repeats":1},{"count":1162,"lower_bound":"WW1GZ2x5QTV2bE9wODFkUklsWXRJQ1pOSUtrWjAzQlR0ag==","upper_bound":"WXVCOUp1dExwbjV3NGhHbGIyMWxsb1VjdnJxYW5aVHNpR1ZuTDlLOGcxOVhvd1l6cA==","repeats":1},{"count":1170,"lower_bound":"WXhEd2w0dG9nM2lTdGkwRGNKSnBMMnVZbndMcVplMmVI","upper_bound":"WktSZUJSSWcyNkhsaGxOR2ROU1VRTDBLcktNRkl3MmdSZU5hWlk5czc=","repeats":1},{"count":1178,"lower_bound":"Wk5MeEphUXRwT2xvUzJFTjBTVXlUWkFWb2lyemptaVhSU3NCc2dId0RINWlLV2pMN1V0SFdPaWpzVm9X","upper_bound":"Wlc2","repeats":1},{"count":1186,"lower_bound":"WmVnbW5MZXRnUkE1WDlj","upper_bound":"WmtiNG9yZWp0eFhZWW1ZMjAzZTRkMEJ0dkFoeHRYc0pIa0ZsRg==","repeats":1},{"count":1194,"lower_bound":"WmxjRUNLRURWajUzZE95d29YbnRJRXR1bHc5UlFMeA==","upper_bound":"WnZ2ZVkwd3RNb1FvOGFIN1REdExlYThodkpiZUt5OU9xOHZISHBQcEpTQWNZSTFLbm12NmM=","repeats":1},{"count":1202,"lower_bound":"WnhwMUVWQU8zWlNHRzliWlliaXZTbGtrbWNDWnlNYXpiSFVWNmNRREg0R2dDQWR5VVU3a3YxbUVlTHFk","upper_bound":"YTJFVGdHWjFsNFV5TVF6NldoanZqT3ZheXdYMmJUaWNKMFc0V3ptRA==","repeats":1},{"count":1210,"lower_bound":"YTJhR1R6a00yS3FVTEhCa09TU041dUk3eDVlMmYzSQ==","upper_bound":"YUFlbU4wSg==","repeats":1},{"count":1218,"lower_bound":"YUJLbjlCdHJGT0t3STZRVm1TQ3B4dkFwMVJiOGJUNDVkbldiSHk0Y09oUlB1Qw==","upper_bound":"YU0xVDE0N0ljcFR4eW5jVzdUVzluVVFxbEhhVmwzTVRo","repeats":1},{"count":1226,"lower_bound":"YU9MeFp4Q0JUN2tsQVFLTzI1Ynh4YkdiQVRoQXo2TXQ5bnp6MkFjUENJMWt2","upper_bound":"YWY0MlE=","repeats":1},{"count":1234,"lower_bound":"YWgzckF5aWp1MHp2YlRDbmtoenNPN2l4YTF2eEpXems0dlFLaVRqRHVpWWdESUQxZmZqb0R1cjAwRnFYR1ZE","upper_bound":"YXlGS1AwaFo2N1Z4","repeats":1},{"count":1242,"lower_bound":"YXlUMlVQSTJoTjNIYnNnQkh1N3FOb245NmN1c1lhYTMzaTEwa2NCVWR6SUh0WHZDVnZqQkdU","upper_bound":"YkN4dHZnOEFOVmI5OEFXQjlPckRMTW4=","repeats":1},{"count":1250,"lower_bound":"YkVscVJK","upper_bound":"YlJGMXlpNVJ2Ykk1cTU1cFduZEs3RHJvTkdGQmhucGYxMEh0NXJGV2prQUg1","repeats":1},{"count":1258,"lower_bound":"YlQyT0ZoOHhDcWRmRlVuZjE2aVliaVJxT2l5RVZvSTRMNzBRckJJYmZXZHdRM2tlc0dI","upper_bound":"YlpJeU91eWdZcw==","repeats":1},{"count":1266,"lower_bound":"YmFkR0dWOW1Td0ptUWpTOUZ3UmtoN2R6aFJINjF2R0tISWhxTVllbVZCOVB4VDVMMkVlUjJhQW5pc24wM0I=","upper_bound":"Ym1GZmNPZFNqOTVuWEp0OTNpY1ZhYTFTMHNsR2tmc2p5QnU=","repeats":1},{"count":1274,"lower_bound":"Ym9lQXRSc05hVU9DdWJXcVlm","upper_bound":"YnJvZ2g3VWplSUtHV3JGa3hJMFRweVRySnhFZE8xc2x1T2lWeEdQWjM0","repeats":1},{"count":1282,"lower_bound":"YnhLaVFYalFSMk02RWx0NXBoUA==","upper_bound":"YzRq","repeats":1},{"count":1290,"lower_bound":"YzVPVmlLRXM3MTFwdDVMZVAyUzhQRVBzS2t6QzVGeDEyQzBXaG9TTDZHMERpUQ==","upper_bound":"Y0Z0","repeats":1},{"count":1298,"lower_bound":"Y1R0VnFVTGY=","upper_bound":"Y1cySTJRbkZQb3ZFeWtLWHdvOTBzM3RnbTlBS25BNnhlaGJ5TmV2TXhTNEtTdElETjVTUXFwZDZZYlVaYzdyZg==","repeats":1},{"count":1306,"lower_bound":"Y1pPcmhLY3AwVWlWQ0kxYVpNOU9Dak5TU3hlZFdDMm5ibXRHQ3QzU0F1SnVYQg==","upper_bound":"Y2Z3TWtGbTB5M1puWWpWeDZIS09xZEljTGxlalhId2dDNHVRUnZQVTF1cHZXTGxYTGtGN3k0ZXVCZjg1RktJ","repeats":1},{"count":1314,"lower_bound":"Y2xsYW42THhnRmYwamRwdGJMbkJYbTBMcndwZTFpVXNuYU5lRnRk","upper_bound":"ZDJIYXhEb0tPYVNvMkVaSnN1bHVIelIzZWFSWWhWMlZxdjVncm9qcHdnR3RvakQ3WEpF","repeats":1},{"count":1322,"lower_bound":"ZDJMdG9DY3UyN1B2N0xIOUo5OU5tRjlOVGpndDg4","upper_bound":"ZFJqb3ozTFRYbmh5SFl1amgwOXJ6VUxWUHJNZ3JuTUthQ1Y5UXhPQTdmelphYWM5RThjekw=","repeats":1},{"count":1330,"lower_bound":"ZFZYbzhX","upper_bound":"ZGxYbUxGOWJDWW43STdwdmNuUzdQOXN4aGswbUJjNkhwTHc1NlQ3WGdtVXRuUHVCOFIxNno=","repeats":1},{"count":1338,"lower_bound":"ZHFacXQ2UkhhUzM3amdlVDBK","upper_bound":"ZTBXS3duTXpCdTNJbmtLd2t0cTBmUklYRlJpNmNtOVMwOWdCQQ==","repeats":1},{"count":1346,"lower_bound":"ZTNFeXV2Z1h0cWM0YXFmWDlOTk5QVGJPNTEzdGow","upper_bound":"ZTdwNnRBZHhuWkhJWW9EM0VaTG5aWjJPZHFsOXE1U09vQVU=","repeats":1},{"count":1354,"lower_bound":"ZUEzdnQzTFlVdFRqblJQd2tCd1NCWW5XNTdTQg==","upper_bound":"ZUc3WDJ3eERjZWhtN2FnRm5WVVNlMHpDNnhESm8wMzlFVFdpeVpi","repeats":1},{"count":1362,"lower_bound":"ZUxmZDNnZ1pEWEtlTEFab3NhNU1nOUM0N016dlFyWXJseXFPNjQ1dzFseTJ6VHVBZmp1d0hu","upper_bound":"ZVY4c2Y1cmE1aWFvWVE1UHZtcXZ5WXM4MUhRZEdOc0l5eXpZUDRFSkZQeTAyWU43aXFCZWVNcUhzRDcy","repeats":1},{"count":1370,"lower_bound":"ZWluSGlZNXVURWdJNjZwSW1UWThxczJL","upper_bound":"ZXM5WFBQbm9YMUtPcmpQR1RPUnFoWHJGYnF2b3FSOXVNeWpXU0tVTHBhMA==","repeats":1},{"count":1378,"lower_bound":"ZjM5RjRUU3NJTmRMSzA3dmE5VGI2bmh6R0FzREc3dnFwWUM2STN3emJicFRneU8=","upper_bound":"ZkdGUWI4SDlwNFdEbDN3NDBxdERSZjdIVzFVWE02UWp2cUNCM1VocjJRTTdWdnRIWGNtSWRMSUNwNFB3TnI2","repeats":1},{"count":1386,"lower_bound":"Zkg2V1pFZXZ5b0VNdmZJY0F2aGpVMzZsZEpXNUdTR0k=","upper_bound":"ZlNDZFpIYnprb093cUpjdFNDNjZpeWRCQ21XcGRnR0JNYXVac1E0SEVNUXFlMQ==","repeats":1},{"count":1394,"lower_bound":"ZlpGZmsyNEs1SmFLTmdMUkRMaDBiRmYyaE5jMlhMTTlpU0I2QTFpaDJkbTFpaW1o","upper_bound":"ZnBhNkpyNWVxSHlMRWU3Snd5eWlLeQ==","repeats":1},{"count":1402,"lower_bound":"ZnMwcW90b1JrM3U1QnE2dmN3em5nY1BVZ3VlekpHdlJYYktEbjZCejVBN1lkbA==","upper_bound":"ZzVhVUp5RGhkaW1wdHBwWWVRejVzYjdHN2ZJd1pBanE0cDhpNDFvTFlqQTVHaXpp","repeats":1},{"count":1410,"lower_bound":"Z0NsbUR1cW94aEVzUA==","upper_bound":"Z2N3VjdDeEVjRmpWR3VNSlVHRGhBRWVqQ1lVejhKc0oxRkV5Q0JnZEVkRXpkSWE=","repeats":1},{"count":1418,"lower_bound":"Z2ZaNEI0aA==","upper_bound":"Z3M5WGM5WEhkZjh5Y3E2Y1VWMVh0NTdUTWo4ZnRqSnFOR2FjakhjNFpra2tqS2daZg==","repeats":1},{"count":1426,"lower_bound":"Z3h6T1l4OXU1ZkM3TTFER3EzcEpBUmhHNUJSelNqRXg0TDlK","upper_bound":"aDF5VG5QODB2MVhpUFFQa2IzdVpwclpaYjlOSUNhUENMaE1BbjRrSEh2UlY=","repeats":1},{"count":1434,"lower_bound":"aDNkRWJOcnJKR1UxME5UUjJPUE1WMUlIWWlmUVU=","upper_bound":"aEVESEJZU05FbnR3Wjg=","repeats":1},{"count":1442,"lower_bound":"aEZPR0xTa3NDdXVMUTRxbU1QQkRnZGFHRUZsQUk=","upper_bound":"aEtGQUtSNkNpbmM0ejg5TGwxbmFWM3hzYVBXcGxYZElzV1daWmRQelkyNndlbXlWVW5FOFozdFRnT0hHZ0o=","repeats":1},{"count":1450,"lower_bound":"aFAxMXFVMG1nOTZ6cmFEUTRBWXJhY1JnNlhiemI0SENRS1Z1ZkJrU0pDMk5rSVJLTW8=","upper_bound":"aHdrU1Z4dzE0WUU3aGNCdEdwS1dHUmdCQ1JGY2c=","repeats":1},{"count":1458,"lower_bound":"aTBiRVh4SmhPWnhw","upper_bound":"aUFscUdUVXg=","repeats":1},{"count":1466,"lower_bound":"aUJTUlZ0UEZ2Tg==","upper_bound":"aUtQZ2Q3OHR1UUYwNk83MEh5RmxoOWNrSVRxdGZoTm1waDlYZFJ0Z2c=","repeats":1},{"count":1474,"lower_bound":"aU12RHZPWlRYd3hmRkd5TEtDbHpObDBDQlFkc09hZ21EWktkdEw2Mw==","upper_bound":"aWduV1RldXg0","repeats":1},{"count":1482,"lower_bound":"ajF4UDEwcnFBV1lhSXRYSlNFRTR2SzNBMmhJem96SmVXa3J6dTM4TVpJN0VaTDc4TEcyRw==","upper_bound":"ak9RMlZXYUJJV2phbHRQZnZWaHhGRmY5UHAzaVFEekN4OGl4RGc3MGFwVnpvWTdHTHRqQ3Z6czBQMzV3ZGpQ","repeats":1},{"count":1490,"lower_bound":"alZxQm0wOFpzVw==","upper_bound":"amR6c1NtbzJWQVZkdkdM","repeats":1},{"count":1498,"lower_bound":"amZqeXU3VEtSc0Q3amF0OQ==","upper_bound":"am41bUMyUXQ5TzJFdTIxS2pJOUFDVGFxY1NIVFg5dnFSdGg4cFRWNXZXTFJJVWZVWm1kbWNJ","repeats":1},{"count":1506,"lower_bound":"anJhUmN5bmROTkZ4eWd6NVZTMFhwQmdMSE1WQXdwNHI1MVZPQ0NVWU13SWNi","upper_bound":"andJV1NsNnBWUU5QVEpTVA==","repeats":1},{"count":1514,"lower_bound":"azFuT3F5S2paSWZGSTR1SGNDOVZEZVpi","upper_bound":"azhReEE1RWY4ZGU4WmtTbGR5Mlg5MHAzYldPU2lsUGF5a2VMRTV2Sw==","repeats":1},{"count":1522,"lower_bound":"azl4YTE1bUpVRTdRMkxIaEpP","upper_bound":"a085RWtQTUlFWmtFSUl5cloya3JmM3E5VFVYZEZqN3MxNmI1RGd4","repeats":1},{"count":1530,"lower_bound":"a1FqR3pmWDlIVkJ2ekdwQlg0YlczZXJtVkxDeGNDbGkxR1U2N2hNRnd1djg0UnY=","upper_bound":"a1hlZG9OODRZQkpJYQ==","repeats":1},{"count":1538,"lower_bound":"a2RnYWxEcHI2RmRxNEN6eHp3","upper_bound":"a2ZjQ3haVUx2a3JQSjBzbklHT1NpdE9Fd1VtVEZnNzJMRGVJTHY=","repeats":1},{"count":1546,"lower_bound":"a2h3M01zY2c5U216aXE2OUN2SzFDWDBOd0tUMVZWN2doUTN1dXhmeWpFU3hwZkFo","upper_bound":"a3FDR05OZm1qblNLblZVamNtQ0V2THgwTVluQVMxTDU0Sg==","repeats":1},{"count":1554,"lower_bound":"a3VpbEl6SktvSFZxZldJYU5zbUpJaEVjYmhTNDFwa0ZjejNqY2dUaENuZw==","upper_bound":"bENNdldYRGxleElVQ0M=","repeats":1},{"count":1562,"lower_bound":"bENWMDcwbEQ4YkFjdTVRYURDdmJpZ1BkWW9xN0xzZ3k5U3VuTjJ4ZmJRQkZtTUliRDlpTkI=","upper_bound":"bEg0bkR2UjFKeFpxRzREM21kM2oybDZm","repeats":1},{"count":1570,"lower_bound":"bExXSFo3RnhpV2tVMTBTczNDMTliSHk=","upper_bound":"bFJGbFN1Z3dOMlNFQ3hHa0lQaTdOUmEycG9qenB4WTliWTRTVWlZdTk=","repeats":1},{"count":1578,"lower_bound":"bFVWWmRyRW51ZTlKYWhOM1BHbWY4WGtCWDRuYnBPNFJ5ZmtDa0xnVnZqdjVsYWhDRUw4M0pyYUtC","upper_bound":"bGNiWTVmRDFxTw==","repeats":1},{"count":1586,"lower_bound":"bGZqdDUwVzQxWXdCdnIwVmVRM1Z5UmRYRnRuajQwMXN6dGc=","upper_bound":"bHJMS1JCcmVwQ0czZkZFSVRHc3dvQ0Y3aEl3dTZkd0hJOHY3","repeats":1},{"count":1594,"lower_bound":"bHVmVUlLRjhhdURreUc1OWRweEZ1WlZWa3hZdzdPVGoxYUFKUEdIeHY=","upper_bound":"bURiaEkxS2psVEhxUEdoRVJ2THdOcjI4WjNOTzE5cVpPWW12YmNmbm1lTmF0QlhqdE9LajZKRW42Zk1yNA==","repeats":1},{"count":1602,"lower_bound":"bU12ZG9QZlV5eWJX","upper_bound":"bVI2V2dYSmw2NzlkMW9XOERGb0owczNObVFvSVI2MDhycFNIMkFiMA==","repeats":1},{"count":1610,"lower_bound":"bVY4ZzlVR2lIN3MyYjFVSzhuSjQ2R29XZTNtUk43c1hv","upper_bound":"bWNvVmxlYnN2RjFueGww","repeats":1},{"count":1618,"lower_bound":"bWZhb0hVc00=","upper_bound":"bW1iUU00Z3daN1hwWlc3aGVvekI3VmxPckRKWng3eDZtanpnWQ==","repeats":1},{"count":1626,"lower_bound":"bXU4eldqMkNLRWFXVzEwRmVQdlZ0cHFPWFh5VFcxa0tOa0w1VlROM3dSSEVuU0k0YXpUaHEyUkZUMzh6Z3h3","upper_bound":"bjNJdjNPczU=","repeats":1},{"count":1634,"lower_bound":"bjRxYjV4dWVhTDBCbTVHSm14bE4=","upper_bound":"bkk1","repeats":1},{"count":1642,"lower_bound":"bklmMzExMlpTTWUwNXRkU2dBeElRdE12amw=","upper_bound":"bm04TEJuRXM=","repeats":1},{"count":1650,"lower_bound":"bnA5cnN0UUdWZFgzQ01KTUVSYkxYOXUzdG5vSE9nR0FaaDNMQ2NERVhKQUh6Ug==","upper_bound":"bnc=","repeats":1},{"count":1658,"lower_bound":"bw==","upper_bound":"bzlIYkZFdQ==","repeats":1},{"count":1666,"lower_bound":"b0lrSmEzT0lEMk9FeFRlVXNRNTVCMHFhbWszN2c2dzh1bDlVMDJyUFd1cUgxVkk=","upper_bound":"b09QSmZScWEwSm9sN2kzcw==","repeats":1},{"count":1674,"lower_bound":"b1RuZlJsSGp4WDZ6UWF1dnBXY0V6MkM4bm1lZTk=","upper_bound":"b1lWeGNvR1VWcktFdG1iWGtKc2RQRFFEcnA5R05ueDVGZzFrTWFSd3lkcXlhR3dwNg==","repeats":1},{"count":1682,"lower_bound":"b1pEZDJ6Sml6dXd4RUFaV00xbkhkMThFdGt6S0FyTEp5OWVvR3NkMXpPSUprRkJPazVDeA==","upper_bound":"b2pWeHQ1VGE=","repeats":1},{"count":1690,"lower_bound":"b2phc3Zra1lKUXBxZEdVb0U3dTNlYTFySGRyaFZCbWh2UFNYQklVZUI3aVYyeWhSUFRnNVhsSlZ2Vw==","upper_bound":"b204aTMwTmthYmVGa3ZKeFNnV21kTjBrUDJyeGRNZUV4Qks5Q0t1d3Z5ZkhNN2lnOFlxaWhtR2U=","repeats":1},{"count":1698,"lower_bound":"b3BLb25zWlhVbzQyeTYzdmp3S0YweEJ4YjNqNE5aRVRjSUxWUTQ3NENhSG1GUTFKMw==","upper_bound":"cDRqcEJRU3JHYmhDd1FKYVNYeGY=","repeats":1},{"count":1706,"lower_bound":"cE5GMm11OURNdzVHUkNjMWpVdzBISU1hbFBiSkQydWVjSkVRTzF1VENXdks3","upper_bound":"cGZyclhYbmM1am9LTlhacFJO","repeats":1},{"count":1714,"lower_bound":"cGg5OUdvYTM=","upper_bound":"cHdVcw==","repeats":1},{"count":1722,"lower_bound":"cTFCR2I2cGh0WEFmMWdON29IdkIzdkg1YjhRSHE5SWRHdWRyV0YyUlZsVDBmbTllUFhQRXprUFVm","upper_bound":"cTZJMHZXemxtWHVJNURJc2lhZGJ2VVpXdEVGbGU0OTNJSVlTdkpqcTRq","repeats":1},{"count":1730,"lower_bound":"cUNhbFJ4MnozbEhtMlZZTjNtVnd0YUdUSHE=","upper_bound":"cVB5SWhmYkFFUmZyWTFscndVdW5CWTBaRmY4UHl6VA==","repeats":1},{"count":1738,"lower_bound":"cVJqWG9qMmZWZ3RaS2tsUGNINUhUOWFYalJLR2dsU3NYWFJJNjJqR2U=","upper_bound":"cWVqMEY4ZFJXSU1rODhURWNpOXhOVXk1","repeats":1},{"count":1746,"lower_bound":"cWo4VTliaWxOUHZnSk12ZGg2b2JnNWdDRWN0bEtmcE1uNkRnQzBjeXRvN0ZxaFM=","upper_bound":"cjBvOTFxVUltbE9sRjdmNWJvZHNi","repeats":1},{"count":1754,"lower_bound":"ckdaOWVHYWtRSDh5MnlySks0cTNNVldnZTQ0QkVNd0ZIVDRQbzhuQg==","upper_bound":"clhiT1pZS09LQVppSU9nMnhTWjVkbTdCVVpEbVg3UEJIdTNkdWR4amFTRElzVUJuTzFQY1ZOZA==","repeats":1},{"count":1762,"lower_bound":"cnRLQ1p2NDNuWFQ1OFJLWFZHcA==","upper_bound":"czVCa2ZOQkI5Q3ZxOXJoNjZJSElibjB4TmNwdVM=","repeats":1},{"count":1770,"lower_bound":"c0dwZE0=","upper_bound":"c1E5bWVESk9maDRtY2hvNFFzQ29tWVdHeWY=","repeats":1},{"count":1778,"lower_bound":"c1hYdjdjMlVabGF2MGxWWlFXTmVCek9DZ0FtWnFYRk1SMXZXMzdVa2ZZR1M1QnVhSVdSQ0VlNHlhOHMyTjM=","upper_bound":"c2oxcWN0ZW5uOWFEdThLSjRhSXgzSjNTS2NBQnIwZUVt","repeats":1},{"count":1786,"lower_bound":"c2pkQ2FIenZnMDhnazVmWExaSzZQMHZ5aHZ2VFRxMjdBTUtLQ0hBY3JzNGlFb0dnUGQ2TXNjcEpFclNJ","upper_bound":"c3d0Y0FNaW9BYmk5MlJQa2JVTjFPMkh5NmxHVHRmZzFWRG5HOWo5ZlFtRVpaZktQUEdGSw==","repeats":1},{"count":1794,"lower_bound":"c3p0WUJhZFM0cW9ZTVBXZ0gxdnA=","upper_bound":"dE1KWUZUV29FVG5GV1VLVHByUWlMcE9CQU4xeGZHMWNMeXU3RDh0OGFTbmlrVA==","repeats":1},{"count":1802,"lower_bound":"dFJ5U2lCSjNaMjZXQllyTllmQVRlbFRWRFlmcDUxdHAzZlhCRUM=","upper_bound":"dFlw","repeats":1},{"count":1810,"lower_bound":"dGdIQ1BCOTJoR1BBc1VHSGZJem85MkdCSExscHlHcVhJY1lwcDdtcWdQR1o5UmZHMjA2YVllc3pKaTRudVBZ","upper_bound":"dG9mU1ZQOEdnSmNLYWhWYWxqYVBjWURReTlZUWMwVUxINE5NdE5JeXBlN3laWEc=","repeats":1},{"count":1818,"lower_bound":"dHBSWlNURGNRam81ZGtENTNQYTJXdUt4NTRNcDhPV1BYYndlZ2VwaEJsTGgxSGd5S3pmNE9VUg==","upper_bound":"dUpQMW8zS2tPV0VQamU4NlNhcXNEUWc1TmRqQnlHaHBLc3NsbGkxQlk=","repeats":1},{"count":1826,"lower_bound":"dU1TSDV4V2szSEJXRnhQZDNwelR5SQ==","upper_bound":"dVlSZ3lFa0l4VnN4elNCYzhydTZCczVjSEJud2lSRnNLV3FEMzFDUlZoRlo5MUJuVXNXeVZBbkxnMlhQ","repeats":1},{"count":1834,"lower_bound":"dVltSFJpVWJsTVRiRXdkSmtidFVqemU=","upper_bound":"dW40SUc1UzdLV1FOQUFhWElUZFY3ZDlHUDFNazZyRU54ZndZaEpkYg==","repeats":1},{"count":1842,"lower_bound":"dXV0ZGtZNWxFaEhwRnJ6RHRKY1ZPY3hVS2tNQ1FRRA==","upper_bound":"dkEzYmVEUWVRUWE2MHUyUmJseXNabXI5VWJ1cXF5UEFZWjdGUTlKag==","repeats":1},{"count":1850,"lower_bound":"dkFuZEYxajdXUnhC","upper_bound":"dlZsRmNyOE5qNW9uZVdqRWdjbzltUEpU","repeats":1},{"count":1858,"lower_bound":"dlhNWmROTHY5NmZlemdLaDRrYWpMczVqWmlPZThYc1B5MzFTaWhUdG9mWVRkM0g1Ym4wbw==","upper_bound":"dmpucjNjVmhCNFc4M1M=","repeats":1},{"count":1866,"lower_bound":"dm1LeXB5SWQ4N2x3dWRuMm5kdldI","upper_bound":"d0FMdXpEREdZTDhobW4zcmVQSWpscEJ5NlZJMw==","repeats":1},{"count":1874,"lower_bound":"d0VxYkRHb2NGdE9qMWRoZE44V0VJbnd0QWtqVA==","upper_bound":"d1A1Rg==","repeats":1},{"count":1882,"lower_bound":"d1BJU2ozag==","upper_bound":"d1d0cDR3THBmMngxblhoNjJNbXdTUFpkVFlZWWg=","repeats":1},{"count":1890,"lower_bound":"d1hNaVFsOXpEbkpia0pNdHZ4QW01eWpxell2R2FEY1o4djRFSWVoajZ0eDA2Nm0z","upper_bound":"d3B1ODRlQ29Gb3BtUXlXaUs3","repeats":1},{"count":1898,"lower_bound":"d3FVRDVJM3JFSFVqdG9zMGdMTGo5SnVMQjNDbXhwM21MY3o=","upper_bound":"eA==","repeats":1},{"count":1906,"lower_bound":"eDV5MnVHd3FQeWJtaFhnZGE=","upper_bound":"eEF1UU13czFmRGdkS3g=","repeats":1},{"count":1914,"lower_bound":"eEJNMUpHc2ZoUVNkbjlKWUVXa3pyOWt6dXd4NWk3U3FXYkhwRTJQNWlvMHBLUkFNdFFzYWhQRHB3UEFrY1RCMA==","upper_bound":"eEwzVXNNWFFPWjBBZjRJRnA2V3NZVGYxNDM5YWRFWEIwSjFD","repeats":1},{"count":1922,"lower_bound":"eExDcTlUWg==","upper_bound":"eGcwZWhoemdtMUJZcU9LeXhhUWRYNHJqZ0VFWlhTalU3ZkNWNXZ4SEEwTXhQ","repeats":1},{"count":1930,"lower_bound":"eGdrZ0lKdkU5em93SEVpbUVaa3BEVXpWaGFRTFdhQzE4UzBnVUFMWklGYjlJSmNpdFo0cm5YRTU=","upper_bound":"eHNSN1V2bWF3Q3IxTGkxc2ZSTDBZVUo3NmRnQ1dV","repeats":1},{"count":1938,"lower_bound":"eHhEb2w4NFpEY2RrZHMzUw==","upper_bound":"eTJMVVlNRHlNbDNaRHNMdm1ndmFxeXMwdnlwN2lpdllaRmpqcnE4bnZBRVNmNW83blc=","repeats":1},{"count":1946,"lower_bound":"eTVYdmZjZElVOVZnQnR5ekFJVDlMb2ZoaWRlV1M5aFpjemY5RjlDV01xbXVYZWRkY3BrM2Q=","upper_bound":"eUF5Y1I3YldQVVhVQXFpdzFpT0JnaGRzOVdoeTBwOHBmZ3RvWm9MaUJSVWxPSXBxUHpITFA=","repeats":1},{"count":1954,"lower_bound":"eUR4NGZZaTcxMFNkbThIS3g4OTJZZjRkSUMwNFdnRTR1T2hBMmU0amVNOW5paWd6VVFZZmg=","upper_bound":"eVRCN0FrZkZYOWxPUEIyTVg2OXE3M0hMaWhoMHdQZWU0NHNwMFhCZ1F0N1VhSW5YSWlwZHdtNU1IYm0=","repeats":1},{"count":1962,"lower_bound":"eVVkNW1CS3lVOG5aUA==","upper_bound":"eWVaenlIcVh5NjFTY09yNzcxT09UZkllTGVDZ0w0Y3F5c2pQcFhxU1JpVXZBclRN","repeats":1},{"count":1970,"lower_bound":"eWcxaVRpaTVQaER0MDFpbHl5YTZHSURBcFhXZTZvcVloU3BwWktiZVRCUjFVdURWcjkyZTZKVjRwdg==","upper_bound":"eg==","repeats":1},{"count":1978,"lower_bound":"ejlYZTRkZkd4WmJRRHhRdTF6VlVUNlQ=","upper_bound":"ekh0d1h2U1BFVE9KQzlLVnNnMVlybnBkY1M2N2FwcVNj","repeats":1},{"count":1986,"lower_bound":"elFJSWFXQ0JlWFFQSWZhVDhMaEVwcHVQNEU1R0hvOXExcVF3NThBbURuR3Fha1dXQ3U0c3h5VGpTTnFVMEpm","upper_bound":"emY2blhYWVIzTUg0dGJNZ09Sbk52YkR3VWFPNUJPYTk5YWhhaFhJak11M1RhNjdNdDhYbGVneQ==","repeats":1},{"count":1994,"lower_bound":"emcwVDJqNTJMbkRrTG5xOGFjZWdP","upper_bound":"enA5ZUNOWXljaU1ta1J4Q21SWWxYQ2JrcktUaktnZ09iVWxxbkZ5aUVxSjd4emlkSFVB","repeats":1},{"count":2000,"lower_bound":"enF2emFuSw==","upper_bound":"enhqMHBrekdZcWU2NER3azZVa1VmOXFPclZhVkhOTE1oQzFYNG9TUWVzeEJER3VNZjg=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,0,2,1,1,0,1,0,0,0,4,0,0,1,1,1,1,1,0,0,1,0,2,1,0,1,0,0,1,2,0,2,2,0,1,2,4,0,1,2,1,1,2,2,1,2,0,2,0,0,0,0,0,3,0,1,2,0,1,1,1,0,0,1,0,0,2,0,0,1,3,0,1,0,1,0,2,1,1,0,1,1,2,1,0,0,0,4,3,1,0,2,2,1,4,0,1,1,1,2,1,0,1,1,0,1,0,2,1,1,2,4,2,0,0,1,1,1,0,2,0,1,0,1,1,1,0,1,1,0,1,1,2,1,0,1,0,0,2,0,0,0,1,0,0,0,2,0,0,1,0,0,2,0,2,0,2,1,0,1,0,1,1,0,1,1,0,2,3,2,0,2,2,1,1,0,1,1,0,0,0,1,0,1,0,1,1,1,1,0,0,1,1,2,0,2,1,0,1,1,2,1,0,3,1,1,1,2,3,0,2,1,0,1,0,0,1,0,1,1,1,0,0,0,1,0,2,1,0,0,1,1,2,1,2,4,3,0,0,1,1,2,0,0,0,1,1,0,0,1,1,0,2,1,2,0,1,0,0,3,5,0,0,0,1,1,0,0,1,1,0,2,0,0,0,0,1,2,1,0,0,1,1,0,1,2,1,1,0,1,1,1,0,0,1,3,2,1,1,1,2,1,3,0,3,2,1,0,1,1,0,2,0,1,1,1,0,0,1,1,1,0,0,2,2,2,0,2,2,1,1,2,0,1,2,2,0,1,2,1,1,1,1,3,0,0,0,0,0,1,1,0,1,0,1,0,2,1,0,1,1,3,0,0,2,2,2,1,1,0,1,0,0,2,2,2,0,0,1,2,3,0,2,0,0,0,1,0,0,1,0,0,2,3,0,1,2,1,2,2,0,0,0,0,2,0,1,0,0,1,0,2,0,1,4,0,0,1,0,1,1,0,1,1,0,3,3,0,1,1,0,1,1,1,0,2,1,1,1,1,2,3,1,1,2,2,1,2,1,1,1,2,0,3,1,2,2,1,3,1,1,1,1,1,1,0,1,0,3,1,1,2,1,0,1,0,2,2,1,0,2,0,2,0,0,1,3,2,1,0,1,0,2,1,2,0,1,3,2,3,0,1,1,0,1,2,1,3,2,1,0,2,2,1,1,1,2,0,1,1,0,1,2,1,1,2,3,0,0,1,0,1,2,2,1,1,0,0,1,1,2,0,0,0,2,3,1,0,1,0,1,2,2,2,0,1,0,1,1,0,2,2,1,1,1,0,0,0,2,0,0,1,2,4,1,2,2,1,0,0,0,0,1,1,1,1,0,0,2,1,0,0,1,0,0,0,0,0,2,1,1,0,1,2,0,2,2,1,2,1,0,3,0,0,1,2,3,1,0,3,3,0,0,1,0,3,1,2,4,0,2,1,0,0,2,0,4,2,1,0,1,1,1,2,1,0,1,0,0,1,2,0,0,1,1,0,1,2,1,0,0,0,3,2,0,1,2,0,0,1,1,0,0,0,1,3,4,2,1,3,2,1,3,2,1,2,1,3,1,0,0,2,2,2,1,1,0,1,1,1,0,2,1,0,2,0,3,0,3,4,0,1,3,1,1,1,3,1,0,3,2,1,1,3,1,1,2,0,0,1,0,1,0,0,2,0,0,2,0,0,1,1,0,1,2,0,1,1,0,1,0,1,3,1,1,1,1,1,0,0,1,3,0,3,1,1,3,0,0,2,3,1,1,1,1,1,0,0,3,0,0,2,2,4,0,0,1,2,0,0,1,0,2,0,0,0,0,0,3,0,2,0,0,1,2,2,0,1,2,1,2,1,0,2,0,0,1,1,1,2,2,1,0,1,0,2,2,1,0,1,0,1,0,2,1,2,0,1,1,2,1,3,2,0,0,1,0,1,3,2,1,0,1,2,0,1,0,0,0,1,3,2,1,1,2,1,2,0,0,1,1,1,0,3,0,1,1,2,2,1,1,1,1,0,2,3,1,1,1,0,0,0,0,0,1,0,0,1,1,0,0,0,2,0,3,1,0,2,2,1,0,0,2,1,2,0,0,0,2,0,1,3,1,0,2,0,2,0,0,1,2,0,2,0,0,3,3,3,0,1,0,0,1,0,1,0,0,1,0,0,1,1,2,2,0,2,1,1,1,1,0,1,1,0,1,0,0,0,1,1,1,0,3,1,2,1,1,1,0,0,0,0,2,1,1,1,2,1,0,3,0,2,0,0,0,0,1,0,2,4,0,1,0,1,0,2,0,1,0,1,1,0,1,0,0,2,1,0,0,0,0,1,0,2,0,0,0,2,0,1,1,0,1,1,2,0,0,0,1,2,2,2,1,0,0,2,0,0,4,0,1,0,0,0,0,0,1,0,0,1,2,0,1,0,1,1,1,1,2,0,1,2,1,0,2,0,0,2,0,1,0,0,1,1,1,0,1,0,0,0,1,2,0,2,3,0,2,1,0,2,1,3,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,2,1,2,1,1,2,0,1,4,1,3,3,0,1,1,0,2,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,3,1,1,2,1,0,0,3,0,1,1,0,2,3,2,0,0,1,0,0,1,0,1,0,1,2,1,2,2,0,1,0,1,2,1,1,0,1,1,1,0,1,0,2,1,2,2,0,2,1,1,2,1,3,0,0,1,2,3,0,0,2,2,1,2,0,2,1,0,0,0,0,2,3,3,0,0,1,0,2,1,0,0,1,0,0,1,2,2,0,0,3,0,0,0,1,0,1,3,1,1,2,1,0,1,1,5,1,0,1,2,0,1,2,4,2,1,1,1,0,0,1,2,0,1,2,2,1,1,0,0,0,0,0,2,2,0,1,1,1,1,0,0,1,3,0,0,0,0,4,3,1,0,0,1,1,3,2,0,1,1,1,2,1,0,1,2,2,0,0,2,2,0,1,0,2,2,1,1,1,0,1,1,0,1,1,3,0,0,2,0,1,1,1,0,1,3,3,0,1,0,1,1,1,4,0,1,2,0,0,2,0,1,1,1,0,1,1,1,2,0,1,0,1,1,3,1,5,2,0,1,0,1,2,1,0,0,1,0,0,0,1,0,2,1,1,3,1,1,1,0,2,1,0,0,0,0,1,1,1,0,0,0,0,1,0,1,2,2,1,0,0,0,2,0,0,1,0,0,2,1,1,1,0,3,0,0,1,1,2,1,1,1,1,0,1,1,1,0,1,2,2,1,1,1,2,3,3,0,0,0,1,0,3,1,1,0,1,1,2,0,0,2,1,3,1,0,0,1,1,1,3,2,0,0,1,1,0,0,0,0,0,0,0,1,0,1,1,1,3,3,0,1,1,2,2,2,2,2,2,2,1,3,0,1,0,1,0,2,2,1,1,1,1,1,1,1,0,3,2,1,2,0,0,0,1,0,0,2,4,1,2,1,0,1,1,1,0,0,1,0,0,3,1,0,3,1,0,0,0,1,1,2,1,0,2,0,3,1,1,0,2,1,1,1,0,2,1,0,0,0,1,0,2,0,2,1,3,1,1,0,1,0,4,0,2,1,0,1,1,0,0,4,1,0,1,0,0,1,1,2,1,2,1,2,2,0,3,3,1,1,0,0,1,2,0,0,1,1,1,2,0,1,1,1,1,0,1,1,3,3,1,3,0,0,1,1,0,1,1,3,0,2,0,2,2,2,1,0,0,2,1,2,0,1,4,0,1,0,1,1,2,0,1,2,1,0,2,1,2,0,1,0,5,0,3,3,0,1,0,3,1,0,0,1,2,0,0,4,1,1,3,1,0,0,2,0,0,4,1,0,0,6,0,1,1,0,2,1,0,0,0,2,2,0,4,0,2,0,2,1,0,1,1,1,1,1,1,4,2,0,3,2,1,0,1,2,0,0,1,2,2,0,2,1,3,0,1,0,1,0,1,1,0,1,0,1,1,1,1,0,0,2,2,1,1,4,0,0,1,1,0,0,0,1,1,2,0,3,0,0,0,0,1,0,1,0,2,1,2,1,2,0,0,0,0,1,2,1,1,1,1,2,2,0,0,3,0,0,1,3,2,2,0,0,1,0,3,0,1,0,2,1,0,1,1,1,1,0,1,1,0,0,1,1,1,2,2,0,0,2,1,1,1,3,1,0,2,2,0,0,2,4,1,1,2,1,1,0,0,0,0,4,0,3,1,0,1,0,0,0,1,1,1,1,1,1,2,0,1,0,1,1,1,0,2,1,1,2,1,2,0,0,1,0,2,0,1,0,1,1,1,2,2,2,0,0,2,0,0,3,2,0,0,1,1,1,0,2,1,0,1,1,0,0,3,0,1,1,1,1,1,1,1,2,1,0,0,2,0,1,0,1,2,0,0,0,0,0,1,1,1,2,0,0,2,1,1,1,3,0,2,2,1,1,1,1,1,2,0,0,2,1,1,2,0,0,0,0,0,0,2,0,0,0,1,0,1,1,1,1,2,0,1,2,1,1,0,0,1,0,0,0,0,2,0,3,0,2,0,0,2,2,3,0,2,1,0,0,1,0,2,1,1,0,2,0,1,1,1,1,1,1,1,1,0]},{"counters":[2,0,2,1,1,0,3,2,1,1,3,1,1,1,3,1,1,1,1,1,1,0,1,0,2,2,0,0,0,0,0,0,1,0,0,1,4,0,0,0,1,0,1,1,0,0,2,1,0,3,2,0,0,1,1,0,1,1,0,1,0,0,0,2,0,1,0,1,3,1,3,2,1,0,0,2,2,0,0,1,0,1,0,1,0,2,1,0,0,1,2,1,1,1,1,0,2,0,1,0,0,1,1,3,0,1,1,1,2,0,1,0,0,1,1,1,4,0,1,2,1,1,2,3,1,1,3,0,0,0,1,0,1,4,1,0,1,1,7,3,0,1,1,0,0,1,1,0,2,1,0,1,2,0,2,1,0,1,4,0,1,2,0,1,2,2,0,1,3,0,0,1,1,2,2,2,0,4,1,0,0,1,0,2,1,0,3,0,0,0,0,0,0,3,2,2,0,1,2,3,0,0,3,0,0,1,0,3,1,0,1,0,0,4,0,1,2,1,1,1,1,0,0,3,1,0,0,1,0,1,1,0,0,1,0,0,0,1,0,3,2,0,3,1,0,2,1,1,0,1,0,1,1,1,2,1,1,2,2,0,0,2,0,1,0,0,2,1,1,2,3,0,0,0,0,0,2,1,1,1,1,2,0,2,0,1,1,1,0,2,0,0,1,3,0,1,1,1,0,1,2,1,1,0,2,1,0,0,1,2,0,0,3,1,0,1,2,2,0,1,0,2,0,1,3,2,1,2,1,0,0,1,0,0,2,0,2,2,0,2,2,2,0,1,1,1,3,0,0,1,2,0,0,0,2,0,0,0,1,1,3,2,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,1,0,3,4,1,1,0,1,0,2,1,1,3,0,1,1,0,0,1,0,1,2,0,0,2,2,0,1,0,0,2,1,1,4,1,3,2,3,0,0,1,0,0,0,0,1,0,1,0,1,0,1,1,0,3,2,0,0,1,0,2,0,0,1,0,0,0,0,1,1,1,1,1,3,0,0,2,0,0,2,1,2,1,2,0,0,0,1,3,0,1,0,0,1,4,0,0,2,0,1,1,1,3,1,3,0,0,0,0,1,0,0,0,1,2,1,0,0,0,1,1,0,1,1,3,1,0,0,2,0,0,1,2,0,0,3,0,0,2,1,1,0,1,3,1,0,1,3,0,0,0,1,0,1,0,0,0,0,1,1,1,0,0,0,3,1,2,1,2,0,0,2,2,2,0,1,1,0,0,0,2,1,1,1,1,0,1,0,1,1,1,0,3,2,1,0,1,3,0,0,0,0,1,1,0,0,0,1,1,0,0,1,2,1,0,1,3,0,0,1,0,1,2,0,0,1,1,2,0,3,1,1,1,0,3,1,1,1,1,1,1,1,2,0,0,0,3,4,1,0,2,3,1,0,0,0,0,1,2,3,2,1,1,1,1,2,0,0,1,2,1,4,0,0,3,1,2,1,2,1,0,1,0,0,2,0,1,0,2,1,2,2,1,0,0,0,1,1,1,1,1,0,0,0,1,1,0,1,2,1,1,0,2,0,1,3,1,1,2,1,1,0,1,1,3,0,0,1,1,1,2,1,0,0,2,1,2,1,2,0,0,0,1,1,2,0,4,0,3,1,0,0,0,0,1,0,1,1,1,3,0,0,1,2,1,0,0,1,0,0,0,1,1,0,0,1,2,4,1,2,1,0,0,0,1,1,1,3,0,1,0,0,0,1,2,0,2,1,0,0,2,1,0,1,0,1,0,0,3,1,0,1,0,0,1,5,0,1,1,4,1,1,2,1,0,0,1,1,0,2,1,1,1,2,1,1,2,0,0,0,0,3,1,0,1,1,1,1,1,1,1,1,1,1,1,0,2,2,1,1,1,0,1,1,1,1,0,2,0,2,1,1,0,1,0,1,1,1,1,1,3,1,1,1,1,2,0,0,0,1,0,1,2,0,2,2,0,0,1,1,2,0,2,2,1,1,1,2,0,0,1,2,1,1,1,0,1,0,1,2,0,3,1,0,2,2,0,1,1,1,0,2,0,1,0,1,3,1,3,3,5,2,0,0,1,1,1,0,0,1,0,2,1,2,0,1,0,0,1,1,2,1,2,1,1,0,0,1,1,0,1,0,0,1,1,2,2,0,0,1,0,0,1,1,0,2,1,0,2,1,0,1,0,1,2,0,1,2,2,1,2,0,0,0,2,1,2,0,0,2,0,0,0,0,0,1,0,1,2,1,0,0,4,1,0,2,1,1,1,0,0,2,0,0,2,0,0,1,0,0,1,0,0,2,3,0,0,4,0,3,0,1,1,1,1,0,0,0,1,0,2,0,0,2,0,1,0,0,0,1,0,0,1,0,0,2,1,1,3,1,1,1,1,1,1,0,2,2,3,2,0,2,3,1,0,2,0,0,0,1,0,0,1,0,2,0,3,0,1,0,0,0,2,0,0,2,0,0,1,2,2,2,2,1,0,1,2,1,1,1,0,1,0,1,1,0,0,0,2,2,1,1,0,0,1,2,1,4,2,2,1,0,1,0,1,2,0,0,2,3,1,0,1,0,1,1,0,0,0,1,0,1,2,1,0,0,1,2,1,0,2,1,2,2,0,0,1,1,4,0,0,1,2,0,0,0,0,3,3,1,1,0,1,0,1,0,0,1,1,0,0,3,0,2,2,1,3,0,0,1,0,2,2,2,0,0,1,1,0,1,1,2,1,2,0,2,0,0,1,0,3,2,1,0,3,1,3,1,3,2,0,1,1,0,0,1,1,0,1,0,1,1,2,1,0,1,0,0,0,3,0,1,2,1,0,3,2,1,3,1,1,1,0,2,2,0,2,0,0,4,2,1,2,2,2,0,0,1,0,0,4,2,1,2,1,2,0,1,2,2,1,1,2,1,0,1,0,1,0,2,3,1,0,3,0,1,2,1,0,0,0,6,0,0,2,1,1,0,1,1,2,0,1,0,0,2,0,2,3,3,1,0,3,0,1,0,0,3,0,1,0,3,0,1,2,2,1,0,1,0,0,0,1,1,0,1,0,0,1,3,0,0,1,2,1,0,0,2,0,1,2,1,0,0,0,0,1,2,1,1,1,0,3,2,1,4,1,1,2,1,0,0,0,1,2,0,0,0,0,0,1,0,0,1,2,2,1,2,0,0,1,0,1,0,1,0,0,1,0,1,0,1,0,3,3,0,1,1,0,1,3,1,0,1,1,2,0,0,1,1,0,2,2,1,2,1,0,1,1,1,2,2,0,2,2,1,0,0,3,2,1,4,1,1,1,2,1,0,2,0,1,0,1,2,0,0,1,0,0,1,3,0,1,1,1,2,3,0,0,1,0,1,4,0,1,0,2,0,0,1,1,2,1,1,2,0,2,1,0,1,1,1,2,2,0,1,1,0,1,2,1,0,1,0,1,1,0,1,2,3,2,1,0,1,0,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,1,0,1,1,1,2,4,2,1,1,1,3,1,0,3,1,2,1,4,2,0,0,0,1,2,0,0,1,1,0,0,1,0,1,0,2,1,1,0,2,0,0,2,2,1,0,2,0,2,0,2,0,0,1,1,2,2,0,1,2,1,1,0,0,0,1,1,2,3,1,0,3,1,0,0,1,0,1,1,1,2,0,2,1,2,2,1,2,1,1,0,2,2,1,2,1,0,0,2,0,1,0,0,2,1,1,1,2,0,2,1,0,3,4,1,1,1,0,0,1,1,1,0,1,2,2,1,0,0,0,1,0,3,2,3,3,0,1,0,0,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,2,0,3,3,1,1,0,2,1,1,0,0,1,1,1,1,0,1,0,0,0,1,1,1,0,0,2,1,2,2,0,0,0,0,2,1,0,2,0,1,0,1,3,1,2,0,0,1,0,0,0,1,0,3,1,1,0,1,1,2,1,1,1,0,0,0,2,1,1,3,3,0,1,0,2,1,1,0,1,1,4,0,0,0,3,3,2,1,1,1,1,1,1,1,3,1,1,1,0,1,1,0,3,1,1,0,0,2,0,0,2,1,1,0,0,0,1,5,1,1,0,1,2,2,1,1,2,1,0,4,1,0,0,1,1,1,2,1,1,2,1,1,1,2,0,0,1,1,1,0,3,2,0,1,0,0,0,1,0,0,1,3,0,2,1,1,3,2,0,0,1,0,1,2,0,1,2,3,1,3,2,0,1,1,1,1,0,0,2,1,0,2,0,0,1,2,2,2,0,1,0,1,0,0,2,0,0,3,1,1,1,2,0,2,0,0,1,1,1,0,0,2,1,0,1,1,1,1,2,1,1,1,2,1,3,2,1,0,2,0,0,1,0,0,0,0,1,1,3,1,1,2,1,4,0,2,0,0,3,0,2,1,2,0,1,3,0,1,2,1,0,5,2,1,0,0,1,0,1,0,1,0,0,0,1,0,0,2,0,2,2,1,3,0,3,1,1,2,4,1,2,4,0,2,3,0,0,0,1,2,0,0,0,1,1,0,1,1,0,2,0,0,4,1,0,0,1,0,1,1,0,1,2,1,1,4,2,1,1,2,1,1,1]},{"counters":[0,1,2,2,0,5,1,0,1,1,0,0,3,0,1,2,2,1,1,2,0,0,2,1,1,0,1,2,1,1,2,2,1,1,0,2,2,1,1,1,0,1,1,1,2,1,2,0,4,1,2,0,1,1,0,0,1,2,0,1,1,4,1,0,2,0,0,1,2,1,3,1,2,3,0,1,1,1,1,2,0,0,0,1,1,0,0,0,2,3,3,2,1,1,2,1,0,2,1,4,0,1,2,1,0,0,0,0,0,1,0,1,0,1,2,1,0,0,0,0,0,2,0,1,3,1,0,1,0,0,2,3,2,3,0,3,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,3,0,1,0,2,0,1,0,1,3,1,0,0,1,2,1,1,1,0,1,1,0,1,0,0,1,1,1,1,1,0,0,1,2,2,1,1,3,4,0,1,3,1,0,1,4,1,1,1,0,0,0,1,3,4,1,0,0,0,0,0,0,1,0,0,0,2,1,2,0,3,3,2,0,2,0,0,1,4,0,1,0,0,1,1,2,1,1,1,1,1,0,2,1,1,1,0,0,2,0,2,2,2,0,2,2,1,2,1,2,0,1,0,2,1,0,0,0,0,0,0,2,1,3,1,0,0,1,3,2,2,0,0,1,1,2,0,1,0,0,2,2,1,0,1,1,2,2,2,2,0,1,0,0,1,2,0,0,2,0,1,1,2,1,2,3,0,1,3,1,1,1,0,2,1,1,1,1,0,1,3,3,3,2,3,0,1,1,1,1,1,1,1,5,0,1,1,0,1,1,1,1,2,1,1,3,1,2,1,1,1,0,0,0,0,1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,2,2,0,2,1,1,1,3,0,1,0,0,2,0,0,0,0,2,3,0,0,1,1,0,2,0,1,5,0,0,2,2,0,1,3,1,0,0,0,2,2,0,3,4,2,0,4,2,0,2,3,1,0,4,1,3,2,1,4,0,0,0,0,2,1,2,1,0,1,0,0,1,1,2,1,1,2,0,1,2,1,2,2,1,0,2,0,0,2,2,1,2,2,0,0,2,1,0,2,1,1,0,1,0,3,0,0,2,1,1,3,0,2,1,0,0,1,0,2,1,0,1,0,0,3,1,0,0,0,2,0,0,0,0,1,0,0,0,2,1,2,0,2,1,0,1,0,1,0,1,0,3,3,1,1,0,0,1,2,0,0,4,1,1,0,2,0,0,1,1,0,2,1,0,0,1,1,2,1,1,3,2,0,2,0,1,0,1,0,0,0,1,1,1,1,2,1,1,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,1,2,0,1,2,1,1,0,1,1,2,1,3,1,1,2,1,1,3,0,1,2,0,2,1,1,2,1,0,0,1,2,3,0,0,0,0,2,0,1,0,0,1,3,1,2,1,1,2,2,0,0,1,1,0,1,0,1,3,0,2,3,0,0,2,0,0,1,0,0,3,0,0,4,1,1,0,1,1,2,0,2,1,0,1,1,1,0,0,1,1,1,0,0,0,1,0,3,1,0,1,1,1,1,3,0,2,1,1,0,1,2,2,1,1,0,0,1,1,2,0,1,1,0,0,0,3,0,1,0,2,0,2,2,2,0,0,0,4,0,2,1,0,1,2,0,1,0,1,0,2,0,2,3,0,2,2,3,1,3,1,1,0,0,3,0,0,2,1,0,1,1,2,0,1,1,1,2,2,1,1,1,4,2,0,0,2,2,1,2,1,3,1,2,0,1,2,0,2,1,1,0,0,0,1,0,3,0,2,1,2,0,0,0,1,1,0,2,1,0,0,0,3,1,0,0,0,1,0,2,0,0,2,0,2,1,0,2,0,0,0,0,1,1,0,0,2,2,3,0,1,0,0,2,1,2,0,1,2,0,2,1,1,0,1,0,0,1,1,1,2,0,0,1,1,1,1,1,1,0,0,1,0,1,1,0,1,2,1,2,2,1,0,0,0,1,1,0,0,0,4,1,0,2,1,2,1,0,2,5,2,3,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,3,0,0,2,1,1,0,3,0,2,3,0,1,3,1,1,0,2,0,0,1,3,0,0,1,1,0,0,0,3,0,0,0,2,0,2,1,1,0,0,0,1,1,0,0,1,0,3,2,2,1,0,1,1,0,3,1,1,1,0,0,0,1,1,1,0,0,0,1,0,1,0,1,1,2,0,2,1,1,2,1,0,1,1,1,0,1,1,0,2,4,1,1,0,0,0,2,0,0,3,1,1,1,0,0,0,3,1,0,1,1,2,0,1,0,0,1,1,0,2,0,0,0,0,1,1,2,2,1,1,1,0,0,1,2,1,0,1,1,1,0,1,0,0,0,0,0,0,3,1,1,2,1,2,0,0,0,3,0,2,2,1,1,1,0,1,2,0,0,1,1,0,1,1,0,1,0,1,1,2,2,1,0,3,0,1,0,1,0,3,2,1,1,1,0,1,1,2,2,3,1,2,0,1,1,0,0,0,0,2,0,2,1,1,1,2,2,1,0,0,2,1,1,1,2,0,1,1,2,1,1,0,2,0,1,2,1,2,0,0,1,1,2,1,1,1,0,2,1,3,0,0,1,5,0,0,0,1,3,2,1,1,2,0,1,1,2,0,1,2,2,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,2,2,2,0,1,1,1,3,3,0,2,1,0,0,1,1,2,2,1,1,1,0,1,0,0,1,0,1,2,0,0,1,2,0,1,0,1,1,1,1,0,1,2,2,1,0,0,1,0,1,2,2,1,1,2,0,2,0,1,1,1,0,0,0,1,1,1,0,1,1,1,0,1,1,1,1,1,0,2,1,1,2,2,0,1,2,1,0,0,1,2,2,0,0,3,0,1,1,2,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,1,1,0,1,1,1,0,3,1,1,0,3,1,2,2,1,0,1,0,4,1,3,1,3,1,1,1,1,3,0,0,3,0,3,0,0,0,1,2,1,0,1,0,3,3,1,0,1,0,0,2,0,0,0,2,2,1,0,0,2,0,3,1,1,2,0,1,1,2,3,1,0,1,0,1,1,2,2,2,2,0,2,0,0,1,1,0,2,2,2,0,0,0,0,1,2,1,0,1,0,1,1,0,0,0,0,0,0,1,0,2,1,1,0,1,3,0,2,2,0,2,0,2,0,1,2,1,1,1,1,2,0,1,2,1,3,1,1,2,0,0,0,2,0,3,2,0,1,2,1,0,1,0,0,2,3,0,1,0,1,0,0,3,0,0,1,1,0,1,0,0,2,0,1,1,1,1,2,0,0,1,1,1,0,1,1,1,1,1,1,1,1,2,3,2,1,1,1,0,0,0,1,0,1,0,0,1,1,1,2,1,1,1,0,2,0,3,1,1,1,0,0,1,2,0,1,0,3,0,1,0,2,0,1,0,0,1,0,0,1,1,2,2,1,2,0,0,1,2,1,2,0,1,2,1,2,0,0,0,1,1,0,1,0,0,0,4,1,2,1,1,0,1,2,0,1,1,3,2,0,2,2,1,1,0,0,0,2,1,0,1,1,2,2,0,0,0,1,2,1,0,2,2,0,0,0,2,2,0,0,2,1,1,2,3,2,1,0,3,2,2,0,0,0,4,2,2,0,2,1,1,1,1,0,1,1,3,2,0,0,2,1,2,2,0,2,0,1,0,0,3,0,0,2,0,3,1,0,1,1,4,0,0,1,1,1,2,1,1,0,1,2,0,2,0,0,0,1,0,0,2,1,0,5,0,0,0,0,1,0,2,0,0,1,0,0,1,1,0,0,0,0,1,1,0,0,1,0,2,0,0,0,1,2,1,2,2,0,1,0,1,0,0,1,2,0,0,1,2,0,2,1,1,1,0,1,0,0,2,1,1,3,0,0,1,1,3,0,2,3,0,0,1,0,1,2,0,0,2,1,0,1,0,1,1,0,1,3,1,1,0,1,1,3,1,2,0,0,3,1,0,1,0,1,0,0,1,0,2,2,1,0,0,1,2,0,1,0,2,2,0,0,1,2,1,2,2,0,3,2,1,0,3,0,1,0,1,0,1,1,2,1,2,3,1,1,2,0,2,4,1,1,1,1,3,1,1,0,1,1,2,0,0,0,0,2,1,0,3,0,0,0,0,2,3,1,0,0,1,2,2,5,0,0,1,0,0,3,0,0,0,1,0,0,0,0,0,0,1,3,0,0,2,2,1,1,0,0,1,0,2,0,2,2,2,0,0,0,4,1,2,0,0,2,0,0,0,2,1,2,2,2,1,1,1,2,1,2,3,1,2,1,3,0,1,3,1,1,2,2,1,2,3,1,2,2,0,0,1,0,1,0,1,0,1,1,1,0,2,1,1,0,1,0,3,0,0,2,0,2,0,0,2,1,0,0,2,0,1,1,3,0,0,1,0,1,0,1,1,3,1,1,0,2,1,2,0,1,1,0,1,1,2,1,0,2,3,1,1,0,2,1,0,2,1,1,1,2,0,0,2,3,1,2,2,0,0,0,0]},{"counters":[0,2,0,1,0,1,2,2,2,1,1,0,1,1,0,0,1,0,2,1,1,1,2,1,0,1,0,0,0,0,1,0,0,0,2,0,2,0,1,1,2,0,0,0,0,0,0,1,1,0,2,2,0,2,0,1,0,0,0,0,1,0,1,0,3,1,0,2,0,3,1,0,0,1,0,0,3,0,0,0,2,0,2,1,0,1,0,1,1,2,4,2,0,2,2,1,0,1,2,0,1,0,0,2,0,1,1,0,1,0,2,0,0,3,1,3,0,1,1,2,4,1,2,3,1,0,3,0,0,0,0,2,2,0,0,1,1,2,1,0,2,0,0,1,1,0,1,2,0,1,1,0,1,2,0,0,0,0,1,2,0,2,0,0,3,4,2,0,0,3,1,1,2,2,2,0,1,1,2,0,0,0,0,4,1,0,0,0,1,1,0,0,1,1,1,0,0,4,0,4,3,0,0,1,1,2,1,1,0,1,2,3,2,1,1,2,0,2,0,0,1,0,1,0,1,2,0,0,1,1,2,0,0,1,1,1,0,1,0,0,0,0,0,1,2,4,1,1,1,0,1,1,1,0,0,4,1,1,2,0,2,0,1,1,0,1,1,0,2,2,2,1,1,0,2,0,1,0,0,0,1,1,3,0,4,2,1,0,0,2,0,2,0,0,1,0,0,2,0,2,0,2,1,0,0,1,0,2,3,0,1,0,1,0,1,0,0,0,0,1,1,0,1,0,0,2,1,0,1,2,0,1,1,3,1,1,1,2,1,4,0,3,2,0,0,1,2,3,0,1,0,1,1,1,1,0,3,0,1,2,0,3,2,0,2,0,2,2,2,1,2,1,2,0,1,1,0,1,0,0,1,2,1,1,1,2,0,0,2,2,1,1,1,1,3,1,1,0,0,1,1,1,0,0,4,1,1,1,3,1,1,1,0,0,0,1,1,0,1,0,0,2,1,2,0,2,2,1,1,4,1,1,0,0,0,1,0,3,1,2,0,0,1,0,2,1,0,0,0,1,2,1,2,2,1,0,1,0,0,0,0,1,3,2,0,0,2,0,0,2,2,0,2,1,1,3,0,0,1,1,0,1,1,5,1,2,0,1,0,1,1,1,1,1,0,0,0,2,1,0,0,0,0,1,1,0,0,1,1,1,1,1,1,1,1,1,0,1,0,0,0,2,0,1,0,0,1,2,0,1,1,2,1,1,0,2,0,0,1,0,2,2,1,0,3,3,1,1,0,1,3,0,2,0,1,0,2,1,0,0,4,3,2,3,1,2,3,2,0,0,1,1,1,1,1,1,2,2,1,3,1,1,1,2,0,0,1,1,1,0,1,0,0,1,0,0,1,1,2,0,1,0,1,1,0,1,1,4,0,1,0,1,5,1,1,0,2,1,0,0,1,2,1,2,3,1,1,1,0,1,2,2,1,0,0,0,1,0,0,1,0,1,0,3,0,4,1,2,1,0,2,1,1,1,2,0,1,4,0,0,2,1,2,1,1,0,1,1,0,1,0,2,1,1,0,0,1,3,1,0,1,0,0,2,0,1,0,2,2,3,0,3,3,0,2,0,0,1,2,1,1,1,0,2,1,0,0,0,0,1,1,0,0,0,0,1,1,4,0,0,1,0,2,0,0,2,2,0,2,1,0,2,1,1,1,0,3,1,3,1,0,2,0,3,2,2,1,2,2,2,0,2,0,0,3,1,0,1,1,0,0,1,0,1,1,0,1,0,3,1,1,1,0,1,0,1,2,1,0,1,1,1,2,1,0,3,2,2,2,1,1,1,0,2,1,1,1,0,0,0,2,1,0,0,1,1,3,2,2,1,3,0,0,0,1,1,0,0,2,1,3,0,0,0,0,2,3,3,0,0,3,0,3,2,1,0,0,1,0,1,2,1,2,0,2,2,2,3,0,0,2,1,1,1,0,0,0,1,2,0,1,1,2,0,2,0,0,1,2,0,0,1,2,0,2,2,1,0,0,1,3,0,0,1,0,0,1,0,0,0,2,1,2,1,2,0,0,0,1,1,0,0,1,0,0,2,0,5,2,1,2,0,1,1,1,1,1,2,1,0,1,1,2,2,1,0,2,0,2,2,2,1,1,1,4,0,2,1,0,2,1,0,0,1,2,1,1,0,0,2,0,0,1,3,0,4,2,1,0,0,0,0,2,1,1,1,1,3,1,1,1,0,2,0,0,1,0,2,1,1,1,2,2,1,0,0,0,2,1,1,1,1,1,1,1,0,3,0,3,0,0,0,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,1,0,2,0,2,0,1,3,2,0,0,3,1,0,0,1,0,0,2,2,0,1,0,1,0,1,0,0,1,2,0,1,0,1,0,0,1,0,1,1,2,1,0,0,0,2,1,1,1,0,0,0,3,1,1,0,0,1,1,1,3,0,2,1,2,0,2,0,0,1,1,2,0,1,1,0,0,0,1,0,1,1,2,0,0,1,1,1,1,1,2,0,1,1,0,0,1,2,3,1,1,2,0,2,0,0,1,0,0,1,1,0,3,1,1,2,1,2,1,0,2,1,1,0,1,4,1,1,0,2,0,2,1,2,3,2,0,1,1,1,1,3,0,2,1,1,1,2,4,1,0,0,0,2,0,0,2,2,0,2,1,0,1,3,2,0,6,1,2,0,1,0,1,0,1,0,5,2,2,0,2,3,1,1,0,0,1,3,1,2,1,0,0,1,1,1,0,2,1,0,1,2,0,0,0,1,1,2,1,0,1,1,0,3,1,1,1,1,1,3,0,1,1,1,1,2,0,1,1,1,0,2,1,2,0,2,0,1,2,0,0,1,2,1,0,0,0,2,0,0,2,2,0,4,3,0,0,2,1,0,1,1,3,3,0,0,0,1,0,1,1,1,1,3,1,1,0,2,2,2,0,1,3,0,2,1,0,1,0,0,0,3,2,0,2,1,2,0,0,1,1,0,2,1,1,0,0,0,1,0,1,1,1,0,1,1,0,2,0,0,0,0,4,2,1,0,1,2,1,1,1,1,3,3,0,1,2,1,1,0,2,2,2,1,1,0,0,0,2,1,1,0,0,1,2,0,1,1,0,3,1,2,1,0,0,1,0,2,5,0,3,0,0,0,2,1,1,2,0,1,0,0,1,2,1,0,2,2,0,1,0,2,0,0,1,0,2,2,0,0,2,0,2,1,0,2,2,0,0,2,0,1,1,0,1,1,0,0,2,1,2,2,2,1,0,2,4,1,1,2,0,2,0,1,1,0,1,1,0,2,1,1,2,1,1,0,1,1,2,1,0,1,0,0,0,0,0,3,2,0,1,2,0,0,0,0,1,1,0,0,2,0,0,0,0,0,0,0,2,3,0,1,0,2,1,2,0,0,1,0,0,0,0,2,1,1,0,2,0,1,0,1,0,1,1,1,0,2,3,3,0,0,2,0,1,2,1,0,0,0,1,1,0,2,2,0,1,1,2,1,1,0,2,0,3,1,1,0,0,2,1,2,0,1,2,0,1,2,3,2,3,1,1,0,1,1,1,0,1,0,0,3,3,0,2,1,1,0,0,0,2,0,2,0,0,4,1,2,3,0,1,0,0,1,2,1,0,1,0,0,2,3,1,0,0,1,1,3,2,2,0,0,2,2,1,2,1,2,0,3,0,0,2,2,0,1,1,2,0,2,0,0,1,2,0,0,0,2,1,0,0,1,0,0,0,0,1,3,2,0,1,1,1,1,1,0,0,0,2,1,0,0,0,0,0,1,1,2,1,1,0,2,0,1,1,0,1,0,0,0,0,0,1,0,1,1,2,1,1,1,2,1,0,2,1,2,0,0,2,2,0,0,0,0,1,3,1,0,0,0,1,0,2,1,0,1,3,1,1,0,3,0,1,2,0,1,2,0,1,0,2,1,3,1,1,1,0,3,3,3,2,0,1,1,1,2,1,1,1,2,3,2,0,0,0,1,0,1,1,3,0,2,0,0,1,0,0,2,2,1,0,0,3,1,0,3,1,0,0,3,1,0,1,1,0,1,4,0,0,2,2,0,1,1,0,2,1,0,0,1,1,1,1,3,2,1,0,2,2,0,2,1,1,1,3,0,1,1,2,1,1,1,0,0,1,2,2,1,2,1,0,2,0,1,0,0,2,2,3,2,1,1,5,2,1,1,0,0,1,2,2,2,1,0,3,0,0,1,0,0,1,1,0,1,1,1,0,1,0,1,2,3,1,2,2,0,0,0,0,1,3,0,1,1,2,0,2,1,0,0,0,0,1,1,0,0,1,0,2,0,5,1,1,0,0,1,3,0,1,1,1,1,1,2,1,1,1,1,1,1,1,3,0,1,0,0,2,0,2,0,0,2,0,0,2,3,0,2,3,2,1,0,0,0,3,0,1,1,2,0,1,0,0,0,2,1,2,1,0,0,1,0,0,1,1,3,0,1,5,1,2,0,0,1,0,1,1,1,1,1,2,0,1,2,0,1,0,2,0,3,2,0,0,2,1,2,1,1,0,1,2,0,1,0,1,0,0,0,1,0,1,2,1,0,1,0,1,0,1,1,1,0,2,0,0,2,0,1,1,1,1,0,1,1,0,1,1,0,1,1]},{"counters":[1,0,3,1,0,1,1,1,3,0,0,5,1,1,1,2,3,2,0,0,2,2,0,0,2,0,1,2,1,1,1,2,1,0,0,1,0,1,1,0,2,0,0,1,1,0,2,1,0,0,0,1,0,0,0,0,3,0,1,1,3,0,0,1,0,2,1,2,0,0,0,2,2,0,0,0,1,2,0,0,2,1,1,1,0,0,2,3,0,0,1,0,1,1,1,0,2,0,0,4,0,1,0,1,1,0,1,0,2,0,2,0,0,0,0,1,2,0,0,2,1,4,1,2,1,1,2,2,1,0,1,0,1,2,1,1,3,1,0,0,3,0,0,0,2,1,0,0,0,2,0,3,2,0,1,3,2,0,2,1,2,3,1,2,2,1,1,0,0,1,1,2,2,1,0,2,0,2,0,1,0,2,1,0,1,0,1,0,2,1,0,1,0,1,1,3,1,2,2,0,1,0,0,4,1,3,0,0,2,0,0,3,1,1,0,3,1,2,2,1,2,2,3,0,0,0,4,2,0,0,1,0,2,1,3,0,1,0,1,2,0,0,1,1,1,1,1,0,0,2,0,0,0,1,2,1,1,1,1,1,1,2,0,1,2,1,0,1,2,0,1,0,1,0,0,0,4,1,1,2,0,1,0,1,1,0,1,1,2,0,1,0,1,1,1,0,0,1,0,3,1,0,2,1,1,1,0,1,0,3,1,0,1,1,0,0,2,0,1,1,0,0,1,0,3,2,2,2,1,0,1,1,2,0,0,1,1,1,0,0,0,0,1,1,1,1,0,2,3,1,1,1,1,0,0,1,0,0,0,1,1,3,1,1,1,1,2,2,0,1,1,0,3,1,0,3,0,1,0,1,2,1,2,1,1,3,2,0,1,2,0,0,2,1,0,2,1,0,0,0,1,4,1,2,0,0,3,0,0,2,1,1,2,0,4,1,3,0,0,0,1,1,3,2,0,4,1,3,1,1,1,3,2,3,2,1,0,0,1,1,3,1,0,1,0,2,2,1,1,1,0,1,1,0,1,1,1,1,0,2,2,0,2,0,1,0,0,1,2,1,0,2,2,0,0,0,0,2,0,1,0,0,1,1,2,0,0,1,1,1,1,1,2,4,0,1,0,1,1,0,0,2,0,0,1,0,1,0,1,2,5,1,1,1,1,1,1,1,1,2,0,0,0,2,0,0,1,0,1,3,0,2,0,2,0,2,1,2,1,1,0,1,1,0,0,0,0,0,1,2,1,1,2,2,0,1,3,2,3,2,0,0,0,1,1,0,2,0,0,0,2,1,0,3,0,3,0,1,3,0,0,0,1,1,1,1,0,1,1,2,0,0,1,3,0,1,2,2,0,3,0,1,1,1,1,1,1,1,2,0,0,1,0,0,0,0,2,1,0,0,1,1,3,2,0,3,4,1,1,1,2,0,1,0,1,1,2,1,0,1,1,1,0,1,0,1,2,1,1,0,0,1,1,2,2,0,0,1,2,2,1,1,1,0,0,0,2,2,0,3,1,0,1,1,3,3,0,1,0,0,2,1,0,1,1,2,1,1,1,0,0,2,3,0,0,0,1,2,1,1,1,0,0,1,2,1,1,0,2,0,1,1,1,2,1,0,2,2,2,3,1,1,1,0,0,1,2,1,0,2,3,0,1,0,1,5,0,2,0,2,1,1,2,2,0,1,0,0,0,0,2,0,1,2,0,0,1,0,0,3,0,3,2,1,0,3,0,2,1,0,3,1,1,2,0,0,0,1,1,0,1,2,0,2,0,1,2,0,1,2,2,4,1,2,1,1,1,0,0,1,0,1,0,0,1,0,0,1,0,0,3,2,0,2,2,1,1,2,1,0,0,0,0,0,2,1,1,4,0,2,2,0,1,0,0,2,1,2,2,1,0,0,2,2,1,1,0,1,2,0,2,1,0,1,1,1,1,2,1,0,1,1,1,0,0,2,0,1,2,1,0,1,1,2,0,2,1,0,0,1,1,1,1,1,0,0,1,3,0,1,0,0,1,0,2,2,0,1,0,0,0,1,1,0,0,1,0,0,2,3,1,0,0,1,2,0,0,2,1,1,2,1,2,1,2,0,0,2,0,0,0,0,0,1,1,2,3,2,1,2,3,1,2,0,0,0,1,0,2,0,2,0,3,1,0,0,0,1,1,1,3,1,0,1,1,1,0,1,4,2,2,1,0,2,0,1,0,1,1,2,0,2,0,1,0,2,0,0,1,0,1,1,0,0,0,1,1,3,1,2,1,2,3,2,1,1,2,1,0,1,1,0,1,2,0,0,3,0,0,0,0,0,2,1,1,1,0,2,2,0,3,5,2,1,1,0,1,0,2,0,0,1,0,3,1,0,0,1,1,0,1,0,0,1,0,4,3,1,2,1,2,2,0,1,0,2,2,1,0,0,4,1,2,0,0,0,0,0,1,1,1,0,0,0,0,0,2,0,2,4,1,1,0,1,2,2,0,1,1,0,0,2,0,0,1,1,1,1,0,2,1,0,2,0,1,0,0,0,0,0,0,0,0,1,3,0,1,0,2,0,0,1,0,0,0,3,1,0,0,0,3,3,1,0,1,2,0,2,2,1,1,0,0,3,1,0,0,1,1,2,0,0,2,1,1,0,2,0,1,2,0,0,0,0,1,3,0,0,0,1,2,0,1,1,0,0,0,1,3,1,0,1,0,0,0,1,1,2,1,0,0,2,1,0,1,0,0,0,0,0,0,1,1,1,0,0,2,2,0,0,0,2,1,1,0,0,0,4,1,2,1,0,1,3,0,0,0,0,1,2,1,2,1,1,1,1,1,0,2,1,1,1,1,1,2,0,1,0,2,1,1,0,0,0,1,1,1,1,1,2,3,1,0,1,3,0,1,2,3,1,0,0,0,1,0,0,1,1,1,2,0,1,1,2,0,1,0,0,0,2,1,1,2,0,0,2,0,2,0,0,1,1,1,2,1,1,0,1,2,1,1,0,1,1,0,2,1,0,1,2,1,0,2,1,3,3,2,0,0,2,1,0,0,0,1,3,0,2,0,1,1,1,1,3,0,0,0,0,3,0,0,2,1,2,1,2,1,3,0,2,1,1,0,1,1,0,2,3,1,0,1,0,2,1,1,0,1,2,1,1,0,0,1,1,0,0,1,2,0,1,0,0,2,1,1,0,0,3,2,2,0,1,2,2,0,1,0,0,1,0,0,0,1,1,1,2,1,0,2,1,2,2,0,3,1,0,1,0,0,0,2,0,0,1,0,0,3,0,2,0,1,1,1,1,1,0,0,2,1,1,0,0,0,0,0,2,0,1,2,2,2,0,0,0,1,1,0,2,1,0,0,1,2,2,0,3,4,0,1,2,0,3,1,2,3,1,3,0,0,0,1,2,0,3,0,0,0,0,1,1,1,0,0,1,0,2,0,2,5,0,1,2,2,1,1,1,0,1,1,0,1,2,2,1,0,1,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,1,1,1,0,2,0,2,1,1,4,2,1,1,1,2,1,2,1,1,0,1,0,2,0,4,0,1,0,1,3,1,0,0,0,1,0,0,1,0,3,1,2,2,0,2,3,1,0,0,2,2,1,0,0,1,1,1,0,1,0,0,0,3,1,3,2,1,1,1,1,1,1,0,1,0,2,1,0,1,1,2,2,0,0,1,0,1,0,0,0,0,2,2,1,2,1,1,4,1,1,1,0,1,2,0,0,1,2,0,0,0,0,1,6,0,4,1,1,2,1,0,1,2,1,0,1,2,0,2,2,1,0,0,1,3,3,0,2,1,1,0,1,0,3,2,1,0,0,0,1,2,0,1,1,0,1,1,1,1,0,0,1,0,3,2,0,0,0,0,1,1,1,1,1,2,1,0,0,0,2,0,0,3,2,1,0,0,0,0,1,0,0,1,1,2,1,1,1,1,2,0,2,0,0,3,0,2,0,2,0,1,1,0,1,3,1,0,2,0,0,2,1,0,0,0,2,1,1,0,0,0,2,3,0,0,1,2,2,0,0,2,1,1,4,0,1,1,3,1,1,3,1,0,2,2,1,0,4,1,0,0,1,1,2,0,0,2,0,1,0,0,2,1,0,1,1,0,1,2,3,2,1,0,0,3,0,1,1,1,1,1,4,1,3,0,1,4,0,0,0,1,0,1,1,1,0,2,1,1,0,1,0,1,0,1,2,0,2,1,1,1,0,0,0,0,1,0,0,2,2,1,0,0,0,3,3,1,3,3,1,0,2,0,0,1,0,2,1,1,1,1,3,0,1,1,0,2,0,0,1,0,2,2,1,2,1,0,2,1,1,0,1,1,2,0,0,0,2,2,1,1,2,0,2,1,2,1,0,1,1,0,1,0,1,0,4,2,0,0,0,2,0,3,0,0,0,0,1,1,1,2,0,0,2,2,2,0,0,1,2,1,1,2,0,2,1,6,1,0,1,0,2,1,0,0,4,2,1,1,1,0,0,4,0,0,2,0,1,3,1,1,1,1,0,1,0,0,1,0,2,2,1,3,1,0,2,0,4,6,0,1,2,0,3,0,0,1,0,0,0,1,4,0,2,1,0,1,1,1,0,1,1,4,1,0,0,0]}]},"null_count":0,"last_update_version":397952029147267072},"p3":{"histogram":{"ndv":1992,"buckets":[{"count":8,"lower_bound":"MDExT3VzQ0FPbW9Eczc3WVd2Q29LOGFiZnlMR2JNZzhBeWNHcTJNWkE3U2RZUXVjQ2NzUGQyc3p6YTBFWWoz","upper_bound":"MDRISExSVFgwZmQ1WFMzYXA0eUhpV2Ewelgy","repeats":1},{"count":16,"lower_bound":"MExnNXFEUA==","upper_bound":"MFV5dVRpYVFxdzhmWnVLa2RsN2lzVWVOV0l6RjNrbjY0aUpseUtrWDBPTVVOS2lMY2F6VHBsZWlxM0Y=","repeats":1},{"count":24,"lower_bound":"MFc4OWtKR09wQ1hWMmdOQ0htMmdlRFhuWDhBUnh5YjlFaw==","upper_bound":"MHF5VFhneUtXa0NhOFo0UDg1UjhwaEtTVXZ4dEU3ZFdyT3ZqZw==","repeats":1},{"count":32,"lower_bound":"MHNVbVI3cFVaSWxKRW5iUVZBd2VRaVhjOVBkRlVhYmNiVQ==","upper_bound":"MHZwNHhLWWVKRUNsbDRvOW56YXZ5Z3F0UThzSWVVb1J3WjZVb2o=","repeats":1},{"count":40,"lower_bound":"MHhCRkVmWVhTU2hXM3BGNm9PMkw2ZnI5RDhBWDhsNWRWc09sOU9JR1lCZXJIZWcySWV5cHFKam9a","upper_bound":"MHp0QjNHYkU=","repeats":1},{"count":48,"lower_bound":"MTVVOVY2ZTBMVlh4ZUhvbm1ocHhpb1lJUUtIODhldG1KUTRycFVwdDZNRjVTTzFkV3ZPSkNJRVNqU0dodnVhZA==","upper_bound":"MUpIckM3SWNOWUI0bVVsY21IaXlWbThIeHhoc000d3B3cHVXMjl3dWNXYWIyMGZjT0Ru","repeats":1},{"count":56,"lower_bound":"MU1qcUdQUDl2azlYTm9qQXFucGk0Zm5BQlVvbzFzNnlqeHNScnFjcW1oSkloUWkwM1JZM3dVQ25qMQ==","upper_bound":"MVlHbVhQbWtCWHJyUnNDdlVTZnhJdUIz","repeats":1},{"count":64,"lower_bound":"MVpQWEF5cG15am9PZkROb3NUUw==","upper_bound":"MWlVb2U=","repeats":1},{"count":72,"lower_bound":"MWpSYkRkc3FGV01hSkVqSlY3WVgxU2RudUtMc09QSnF3RXg1M01qOVl6UTBVd2h3R2p0VHFDaGs4VWRZTTNz","upper_bound":"MXZvcFFQeFR3WG1PcmU=","repeats":1},{"count":80,"lower_bound":"Mg==","upper_bound":"MklSYTZjZUhxT09nVlR3bTVPdGVTdHcxYXBSSGxzVzBGbHEzSTN0","repeats":1},{"count":88,"lower_bound":"MktCQWFFYklwTFpwUkJwT09kcTdL","upper_bound":"MldxeGtxU09Rcmd6elA=","repeats":1},{"count":96,"lower_bound":"MmQ4Z0M1","upper_bound":"MnprcUg3cnJzcnB1MldjQXNXcHRnVmh2OEpNZUpKa1UwUTROYg==","repeats":1},{"count":104,"lower_bound":"MzBDMjVJempkdndmUU9Td3QxbTdUZ0psNFpYQ1VBTjJGbzhYNkNSZVJRaXRQNg==","upper_bound":"MzJ3UXo2eGtQY1NJSm9OSmQyN0VRWXFwZW1XM3Q2SE5maEt6V2xSbHkzTVRZTFM1U2lCemI0VlRBOEo=","repeats":1},{"count":112,"lower_bound":"MzhKenFFSlRtU2ttS0phWTFmZzVEdExmTjZidWE1QnJlbmluZw==","upper_bound":"M0RBekFSQXBsaFk5M1c=","repeats":1},{"count":120,"lower_bound":"M0hXajl6RjNBQ3lRV1Jhak14V2VNbHZhQTU1U1VMd3pHY0RNRnVGZ2pHVE4=","upper_bound":"M1VweWtwMkduM1c1QlpYZ0N0cktjanVaS0JxQXN1ZDlsOXNYRlhLTmd1","repeats":1},{"count":128,"lower_bound":"M2R0ZkFxd3RrWmhsQzZ5VHViTmVJdW9Md3N5RUVUcXFDQmFIYXNFQ2hDa0NnOG9LS0k=","upper_bound":"M29tTmtHN0t1Mg==","repeats":1},{"count":136,"lower_bound":"M3BCQjZuMktoYWgzVXpBbE5NbnJYbHkwNkJWcG9QUVVJbGd5V2Y=","upper_bound":"NEQzSXM4MzcyTnZ0MVU2ano=","repeats":1},{"count":144,"lower_bound":"NElYYzRwVGlWQWRLcmNF","upper_bound":"NE15dkZwWmVYVzJtQ1o=","repeats":1},{"count":152,"lower_bound":"NFJBU1BWN1BI","upper_bound":"NGFHODROYlJGbmxKZDF0RHl0MjhqSUNOSlY=","repeats":1},{"count":160,"lower_bound":"NGJsVWhxenFxemp4WE1yaWRXVVZYdHlDZnFCc3czZ0Z0UngzRDU0NzFVamZ2bEVkQ3lxWHdDVTQzTklF","upper_bound":"NTVOSkxoS3NYcEVKb1Y3eVBPeVhoS0xSOEVuV1VCeWRIV1J2VjQwYTFuME1RaVA3Mlc1bEVWYmxna3A=","repeats":1},{"count":168,"lower_bound":"NTVyZ3U=","upper_bound":"NUVnaW9oOG9RWDc0clY5eDV3SVpPMEExZ24wOUpRa1UwVE5lTDBpZzJNYWlZQ0NGMDM=","repeats":1},{"count":176,"lower_bound":"NUk3RjZHMlJ0Um03NUlReGlzQmM0V21EZDc4d0k5UjJEREloWU9NWlVxMTJYYU1uTUI1QllSWEdXekJmcEQ5","upper_bound":"NVNMS0hVNGRiMWRZUXhrNHRDelVidU9CWm13VDU4SjVMak1QamFUOU02V0NSYw==","repeats":1},{"count":184,"lower_bound":"NVpra2RqYUVjSkJjOW5GRG9MekZsSg==","upper_bound":"NXNaV3ZrU0FJQnlBSFRYOXozbkxoejF4N2lJY2d1Smc=","repeats":1},{"count":192,"lower_bound":"NXdPcmVQQQ==","upper_bound":"NjVNYWFIa1BGNmI=","repeats":1},{"count":200,"lower_bound":"NjhLVTk=","upper_bound":"NlhnckxDaWtsUFp1Wkt1aldNTUJrNmt1bGtmQUNEbkt4VFE=","repeats":1},{"count":208,"lower_bound":"NlpSdjRxeEdnS0Jhb2Fmb2c1UlhqMXZQ","upper_bound":"NmJwQmpJa1lncGN6SE00ZDRuZXRjSWVsQmFoelJteW5XMTRNbW5YVktNbFJ0SXZwWEp6c0VRdHhm","repeats":1},{"count":216,"lower_bound":"Nm5JWE9aRzZMMUVOMU9MSWExaEJFMnh4Qjh1enc=","upper_bound":"NnpEdm9kTnBXb1VVZkZNa3BOVGE4TllzdmtYbER3Rko1b1VwYVpsZ0Y5ZzR4cjlzN0pIMnR5NA==","repeats":1},{"count":224,"lower_bound":"NzFvSFBmdXJUTjFkN1hwNWM0SHp5","upper_bound":"NzlDOXpxT3BQMlgycW5OeWhnSTBvQmNkOU0zRUF3SzFYSjg0NFJ6ZmlOcWRDYTdCVWVOa2ltdll3M2c=","repeats":1},{"count":232,"lower_bound":"N0pEM0lZUHlkMU9hd2Y5Q0lGbng1TzFYWkdGa3FIR01NQjUyYVR5aWRCUlREd3dueG1vdkFqWUlGMTM=","upper_bound":"N1lrUGI=","repeats":1},{"count":240,"lower_bound":"N1pQRWVjZGVmVjU2bzVQUDBwZFFYZTNPWkR4ZlZjNVlvRzdPSFlaVWxyREdUYmxuckVMN0k=","upper_bound":"N3AxTU9sZGx5b01TQ2JmMkdtbmtGV2FPdEx6SA==","repeats":1},{"count":248,"lower_bound":"N3FQY2xQNzJmSEcycEJmWkNCNXN1dkZqbDA2SmI1M3ZVVkdUb2Nk","upper_bound":"N3hkUmJBOVdhT1E3UndqZktDa0dtN2VmUkIxRml4SUE5cFNla1I=","repeats":1},{"count":256,"lower_bound":"ODNkT0NacGJjMTVxbmN5ZGhLMzU0QmJ5UGpVMnY=","upper_bound":"OEtJVHNJS0FuUzduajVLUG9EZDNrd0JkOXpwRTd2bVJVRjhKYURZdjdvUHo=","repeats":1},{"count":264,"lower_bound":"OE1Kd3lFQzJyV0p3SVh5RlFvOWdud2M2RFV5UXlZVg==","upper_bound":"OFY3WWwwZWJndVI3QWRIdjJlMGh1S3U5UWFBSGxHcDhsU3MzeUtZUXpBNHY5bmdM","repeats":1},{"count":272,"lower_bound":"OGhtRlJkU09odXJ1Yklmc1ZkaE5DeGJVaEV2VlFhM2FpM3NnNnpYbzRpOFN1dHRiOTd1cmxPR0xE","upper_bound":"OGx0azlQaW9FVThMdDNGeFZDTlJtTWhW","repeats":1},{"count":280,"lower_bound":"OG1tczNUaEV1MjU1VEY0OHQ0aTY5U091Yg==","upper_bound":"OHNBYlpMVFI3akpqdkRD","repeats":1},{"count":288,"lower_bound":"OHRwcldBemFqbnNaUmNUS2F3UE5KRjF0MjRaTmlzS1Z3UnRaWEpWRVdBUWZIT2dmT1ZV","upper_bound":"OTRLN2ZwWElud1cwQ0xMMWJoTkt0c0ZINHBU","repeats":1},{"count":296,"lower_bound":"OTRqcWdxV21nelA3U2hvdW9hV3lUeHNHaGN2WGRDbkoyUVM=","upper_bound":"OUJDcEhNblhISlEwak00YVBvb1VyUEdhTWxkeA==","repeats":1},{"count":304,"lower_bound":"OUJoSFk4YmJaMzR0TFBscEFZY0M=","upper_bound":"OUtBTFk0dTZ3UktqejRveU1jVzB2eGlJamRVeHFkSVVwQUFHYnlhTGxGNjNvYQ==","repeats":1},{"count":312,"lower_bound":"OUtoWGJ4WjJ1RGRq","upper_bound":"OVdHQkhtQjV3c2VxOWpZc0QxQjBhQ2ZWejZTN2dyZ2htV3hCRzRNUlNISlE5UGo2RmYxQ2dDanh6Ug==","repeats":1},{"count":320,"lower_bound":"OVd0N3ZLT1RoU3dHbW83aDhqeGhLNUNkbzNsZmhvSDFZdGdTOHY0ZQ==","upper_bound":"OWJqUW1YMUVVYkFaTWl6T3V0M2Z3b0tJa2FlZnNRb0lCNWlkOGxVUWUxM2E4","repeats":1},{"count":328,"lower_bound":"OWdmV21rTmMyT0ptQjBOZnJ1bnMwZ1ZqZ0tiNTE5c1hheE41ZGNUM0pLa2tydGdaWHZzcFNpdA==","upper_bound":"OWxYZE5LSU8wMGNNRDVyN2llYlRrMTJrdmk2QVgzOVRmemt3SmQz","repeats":1},{"count":336,"lower_bound":"OW82QmFnRmg=","upper_bound":"QUI5MUU4d2l4dnppcjlweG1VdlVRag==","repeats":1},{"count":344,"lower_bound":"QUhIRE84S1lIZXcwdkkzVUU1bjlWdjRKaWVpOGtldnpUTXJaUFJXMU8yU1BMeFB2VndLTFRHeVVDcQ==","upper_bound":"QUtKZWU4U2pLd3o=","repeats":1},{"count":352,"lower_bound":"QUxTcDJMb0pMSFBPdUo2WG5XUDNyZUpaVHBL","upper_bound":"QWZGUEdkMmVqYTFtOFljcWxRdGZwblNpc0V2WjFxRVBlYVAyWUlkYUNadnZrWjNKdUZ2ZDJnTmE=","repeats":1},{"count":360,"lower_bound":"QWhK","upper_bound":"QXJBR0VkRGkxRWNHV2VzQlJZQTk3UWhQeFV4","repeats":1},{"count":368,"lower_bound":"QXZSWDFBTkNwUE1jSGJONnZ5bm5Bb0Ra","upper_bound":"Qkx0WFVtR2g3dzJzeg==","repeats":1},{"count":376,"lower_bound":"QlRJZ2REcHNEVngwS3R3cjczeDhhZjgwb0Q3ejJacWs1RFlBWQ==","upper_bound":"QlZNMlM3N01mcTJGZVhI","repeats":1},{"count":384,"lower_bound":"QlpQaDVNWHA1djF5TDJBMzVlODM5RlRURGFDeFpLM3FG","upper_bound":"QmtycFRCSTBHbVJaVGp2ekt4dGJvUXFzY2x6cGxIaERGbE9jNWdj","repeats":1},{"count":392,"lower_bound":"QnFmcDBZ","upper_bound":"QncxVk5CQndrT0hxSmRTRERlWFBMeWtxbExrYVZZY2plWkltWDFoSEI5bnkyNmlpNEk3ZDBncFFWVGo=","repeats":1},{"count":400,"lower_bound":"QzZzME5Wc3pHYlhpZmt2QXdlVkpvcUNuM3NC","upper_bound":"Q09ZamJxTGFLR0xtNWZHTHRpVmhRSkRmdGQ1VnlhQ2I0blRTaXFwMTdEdTNYajhxQ09TUkdyZ3pPeEg=","repeats":1},{"count":408,"lower_bound":"Q1NmNGlVVXVPSVAzS1M5d1dFYlpvODhURlk=","upper_bound":"Q25MeGx3R2N4b0NSaW1Y","repeats":1},{"count":416,"lower_bound":"Q3JsS04xUVg2VUN4d0w=","upper_bound":"Q3p1TlNXTGFQcTc3Mzhxd0xNaA==","repeats":1},{"count":424,"lower_bound":"RDZTanZQMG5xVkNPQ1hmYW9oOVBuVVR6NU5HNUpiZkcxUHdIM1FCdVd0d1U5Ukk=","upper_bound":"REVVU2dNUnRnQlVQMHoxWEZSbXpMellBMDNvRktqeDdLZkliTEsycmUwNmRR","repeats":1},{"count":432,"lower_bound":"REdYVmN4cWtKb1p4YXVRNkp5aDNZSw==","upper_bound":"RFRHa21Gc3hMbHpYSGJuR0p5N1FSMzh5VEZwMEQyVU16MG45bzZIZ04yVTU=","repeats":1},{"count":440,"lower_bound":"RFZsTXJBVkE=","upper_bound":"RGdJaTlBdHU0eUhscDFFOUM3cXA3dENuQlhNYU5rZlVSMk55ZjQ5ZTFjUzVhYTJ2U0Q=","repeats":1},{"count":448,"lower_bound":"RHI3REZ3UmZ2VlVIWWVtZmppZFVVYUxLaENCZ3VERnpmOFA=","upper_bound":"RQ==","repeats":1},{"count":456,"lower_bound":"RTRtSXVWY2p4dkdMZnY3WVRLZA==","upper_bound":"RUZUbmpjWURyc0pjNlZ3aHZiNDgxaWc0bnFxR1JUWXlZR2hjY3Y1NEtwd1I1SA==","repeats":1},{"count":464,"lower_bound":"RUhYZGR6bFBJUzVnSjdhbFlOelRFM3c=","upper_bound":"RVJKTTF3MEVjcnF2RUZTVXFNOWRUVllKd2VwUg==","repeats":1},{"count":472,"lower_bound":"RVZRcjZnZWpWMlRBMUZvR2QzUndRR1h6ZnpqV2hITW5rNW1wdEFwZ3NKS25heVVN","upper_bound":"RWN0MWJsU1FPdjd3WTVMSDZkZDlBM3BENHhna3VMRTJSdUVUT3o0dnl6dzVQ","repeats":1},{"count":480,"lower_bound":"RWhMd3BEaDhndkIycFhOdw==","upper_bound":"RXNqUHowWVRIMnUzNVd2U0R0TUhxQnhvT3I4S21iZUtrSGlCcm5Ball4SGw5ZUxtZQ==","repeats":1},{"count":488,"lower_bound":"RXRLRm1hUWRsS1VRSHZTZFdiWkVmdE9QeEtzMUc=","upper_bound":"RjVJUTdTR09oUWxjVXEw","repeats":1},{"count":496,"lower_bound":"RjlObTg2dzA=","upper_bound":"Rktrb1dzVlluOW9JVWpvSE5VMXZrc0I1NWVvbDBWeA==","repeats":1},{"count":504,"lower_bound":"Rkw5bUFRdE9Fd1FpTVN3eTl2anl5YjBzRTBmcTBZOE1BNkNlbDZ3M3hNZFc1THpkTzZlSVRuc3U=","upper_bound":"RlhEcjY3bGtzbmY4amdNVGhpQVdYMXBnNFN5elFiVzZrTndZMEx2Y2hmbkpCeDN0Qk5qckJJ","repeats":1},{"count":512,"lower_bound":"RlhlMjJR","upper_bound":"RmJrVVhLenU=","repeats":1},{"count":520,"lower_bound":"RmhLaGx3ZGxDZ3E1NW02QURXNThJMUlQeXBuRk9MT016QjFwYVZNR1pyYmdqaEdpN0dGcDlsbg==","upper_bound":"Rm5rWjlCUzJCWGd6aHoxRjZiZlM5bXRiMw==","repeats":1},{"count":528,"lower_bound":"RnQ1Rw==","upper_bound":"R0Q0MDJsNzdMaHN3REpiSEtuVVdKY1B2ekYxdVhvdmkydXFuOXlOMmpFclI4cVE=","repeats":1},{"count":536,"lower_bound":"R0pxVTAwemNVTHpWcGE4amVqbEMwa3o=","upper_bound":"R1ZONUR4aHlCekF3RUdEUlJqYmM2SGg2SGhIQ1RubG5CaUxBU3NjRkMyZXJvWklrVkR5eGNYTQ==","repeats":1},{"count":544,"lower_bound":"R1gzanIyUWpON2w2","upper_bound":"SENDQXJyaTBtN0J1eUFQbg==","repeats":1},{"count":552,"lower_bound":"SEhYbTBhYUpvRThiRUIycmZHeGlISVdOenpYbHhXU2ZtRWcyUjBtSWtxNU9JSTBtc0t2dmM=","upper_bound":"SE1hdzdzemNwdzZ3MWk5SkpsbGJJSTBKZW9JdlpK","repeats":1},{"count":560,"lower_bound":"SE9lRTl6cQ==","upper_bound":"SFNt","repeats":1},{"count":568,"lower_bound":"SGJvTEw0QjVaelpNaHFa","upper_bound":"STRwcDhqN09sYnkzMk9DVWluNFM1QU1OdnZYZWo5OTNPWUFNM0ds","repeats":1},{"count":576,"lower_bound":"STUxU3Rnd08waUtqbmJIdGF2ZVBsNUQyeGtnUkppdHZuZkJrOXl4NHk=","upper_bound":"SUJFWmJ5ajBBdkpmS2N1dG10ZXE2dHpka2E1cXlSMHhNMDQ4VzJ5blplRWtQdzBUc2tjU2RRa2k=","repeats":1},{"count":584,"lower_bound":"SUJR","upper_bound":"SU1XWHZyVGlCYU9ZZXZ0WkRsenlLZHJXVEZLbkV5VFBHbXoyd1BBU3NLUmNsZQ==","repeats":1},{"count":592,"lower_bound":"SU9McUFieVdRU2pjYmhEa2Rnc0RRR1VpQ1lqM2J3ZEJpUXplbHpIdHNvWHViYVdjOU11OA==","upper_bound":"SVUwVkx2TVUzaGJ4dnlvUmJGZE5QcHlFdlUyMzZaTzZuNXZNRmZTakdxYjN0OG9yQ1BXbGd5M0V0b21IOWFZ","repeats":1},{"count":600,"lower_bound":"SVVPNG5GUE5rMFJQTUU4RGlVeXNUSFdTdA==","upper_bound":"SVpOSktIWVdTaU9PSlAzR2hMdU44b29oZmFGV3Y0MnB4ZDlCUnN3ZWFpVTE=","repeats":1},{"count":608,"lower_bound":"SWFsNUI1UjUyNE1VdlU4RFdwY1M4","upper_bound":"SXZNSA==","repeats":1},{"count":616,"lower_bound":"SXg2cVpBZWVkeUE4aDd3TTRWOXBmVjhwZnFLdnplSUJEUU1EcGhubzVjNA==","upper_bound":"SjlTVzVwanNubzRSeDFkOTk0elo2MVFyVlI1c2Z2aVB6RFgzTlJ2MzJURTN1VEtINWZuS1MyRUFQR2FaZw==","repeats":1},{"count":624,"lower_bound":"SkVoTFM4MFJlWWlMOA==","upper_bound":"SktSU3lPUmZiMEE=","repeats":1},{"count":632,"lower_bound":"Skw4TWN2cE8xWTVTaWJpczRLekNjZE1VV0RRWlJRcHEyV3FIMUkyMzRtVk8=","upper_bound":"SlJSVXFsRGU4Yg==","repeats":1},{"count":640,"lower_bound":"SlJ6Q0g1VUNl","upper_bound":"Slo1UTNjWVFhM0pVcHN0QmdTTTFzUmgwb0lKSmxi","repeats":1},{"count":648,"lower_bound":"SlpxSDNINXZNT3R2Rzc5cE1jQ2EyUW5GZmZCeFVKYTY1YzF0MHlxMEU2T2QwQg==","upper_bound":"Sm1lVlY0b2pvYg==","repeats":1},{"count":656,"lower_bound":"SnNh","upper_bound":"SzBwYzdXYWY1YXBzWWduM2NJcjdvTWRRV3RlYUhjUFNNQXUwbmlEaWF3Y0VoMzgzN0lG","repeats":1},{"count":664,"lower_bound":"SzNpSU45T0V1eWJ6aEE=","upper_bound":"S0RvajgzeGkyOFVtbg==","repeats":1},{"count":672,"lower_bound":"S0d4","upper_bound":"S2QxQUxpR3VNdXRLamhuYQ==","repeats":1},{"count":680,"lower_bound":"S2RPZTZ5djlGMmdZMEJlbVBqWHhG","upper_bound":"S25NZUw=","repeats":1},{"count":688,"lower_bound":"S29naXpz","upper_bound":"TDVjc3hOdlJaYkFHS3JUcnFySmQ1d1l1V0hOcEFLeUtDaXQ=","repeats":1},{"count":696,"lower_bound":"TEFCMG1ZTm56TEIyZ1ZYSGtYZ1Yxb0JOakxId2ttTTVJbVdZUkhwMHhSNEI=","upper_bound":"TFRuOHhlOHZkeVlTbERtd3ZvVDRXTGJlWE1PY2V3ZEg5TVBZT1BNODhZRUR0YzZZak05MUNUbkRvSUZocWRVZQ==","repeats":1},{"count":704,"lower_bound":"TFZJZmNFNGZ5NFFERXNnUW94UzFmdFhxMWRRZTFBNERPVmVrenpYdWlZTGZLQmJDV0E=","upper_bound":"TFkzc1JCZURpQmRNVW0xWWUxanBOSXRyZVNTakxlUUpFZw==","repeats":1},{"count":712,"lower_bound":"TGFCQTdScmtlZ3A3MW9LTFRaWVE5MVhScEM3T0JKbHdUNnQ3OXNLZ1BCYjY0YXFhM2JVN0hOaFBF","upper_bound":"TGswWHhl","repeats":1},{"count":720,"lower_bound":"TG1aTWtJaGN5Q1F2R2ZtU0dUMzZ4VDkzR0JyUWl1UmJ2ZU94V3M1c1cxZHQ2R244TnpZ","upper_bound":"THRrT2c5dGpzcGp6SEVxVVkyYWFSaE85aE5tZFp2REtBZ2lzaGdIakc2c1dhUmU=","repeats":1},{"count":728,"lower_bound":"THgwSzJwc0QwVHE3bXI2ZlIwTHNOT1F6ZG5UZE9McGZ6eQ==","upper_bound":"THl2Tm9PaDVaS0kxME9TdHZNbFUxa2lndTE3Y0pIaURlYTcxR2RYSkpYeHg4a0Jt","repeats":1},{"count":736,"lower_bound":"TThpczVsRTkyV1lqQTFLRVpNNVBYY0dGaVc0","upper_bound":"TUNEUXZmZVBlRmVkZGd5YXFGMFNxRkZFRmNreVV3VldXbndNbngxcW5lM1RUSTIzOXV5Z0xa","repeats":1},{"count":744,"lower_bound":"TUc0WkpRaHkz","upper_bound":"TU1yM2NFOVFXeG9VM2dJelM5bnlpdkQ=","repeats":1},{"count":752,"lower_bound":"TVY1RGI0cjlvYW9aNk91aHd0UUZld0hnWk5QSUFHazRCV1BEbTlXWGxhVW1WUmY2Z1A=","upper_bound":"TWh2ZGo2OFhjcVVwNzNUNVBUMU1iM0lDckp0YXNQeTA=","repeats":1},{"count":760,"lower_bound":"TWs2S1U2a2JjVHl0azFWZlZBZnpmWFU1SjVFSVhMWVc=","upper_bound":"TXZwVFF0TGc0ZGtk","repeats":1},{"count":768,"lower_bound":"TXdINGRiWXRVZzVkSlowOE85Z1p0S3cwMm9WRHFjR05r","upper_bound":"TjVueWl2M2RQSW1JQkx0a1R3cUV1Rlo1QUtwMG5hNVplZ2x6ZFZENjBCdTVYaG1rdTNHRHlXNkJta0VTZw==","repeats":1},{"count":776,"lower_bound":"Tjhkbm90SklHcXNxdFdveVJmVTBhMzVVbWk3dVBoTHZWTkhTbVhaWWRuS0Fqa2dDMEptT2o=","upper_bound":"TlBSMUx3b0hRNFZWYW5ZNXQ4RE1pNg==","repeats":1},{"count":784,"lower_bound":"TlpncDFmd3Q5dm9yWk9zRXVrV1F4aWFRZFFZTWFmMnhsMjRFN1g=","upper_bound":"TmtnMUV3Y0dEbEprbHVCMTBVdVR4QW5I","repeats":1},{"count":792,"lower_bound":"Tm40WWd6ZXhZZWw3","upper_bound":"TnhIUGdDSDNEZUZuaFVubUI4MFdyazlhMGtkNXVEbW8=","repeats":1},{"count":800,"lower_bound":"TzNCUkpZMUIyNVJ4eWc=","upper_bound":"T0VoUWJjcDVHcThhVTJobVkyWm5GZFM5V2tmUERpMnZhbmpvOTc5WnVJM1AzcEJpdHNzRGRLd28=","repeats":1},{"count":808,"lower_bound":"T0dybHFwRElicDFtanhQWkowcDlhcDlRNzFaUmxIQVoxWWhIaXF0bGJib2ZkQk42YzRyVjQ1b2F2","upper_bound":"T1BCNkNPa3lZZEhqMjQ0V2UxSlZ3cDU=","repeats":1},{"count":816,"lower_bound":"T1ZDbUNVb1NGbHpQbjNzZVVTN0FFUkRBOERXdHFUNnhRN3FXWm0xMkhiYjFUdEpQeVZkOVA3VkhGVk1RWEpj","upper_bound":"T2JicmZTVXFDWml5ZXFseTcwSWZiQw==","repeats":1},{"count":824,"lower_bound":"T2NiT1czWEppUjUyOEpTa1JVN29HUUx5","upper_bound":"T2dsTHFhblh3RnN2","repeats":1},{"count":832,"lower_bound":"T2g3YWl0TVhpWW9SelFDNQ==","upper_bound":"T25zMHBJOVdhNEoydzZkQjlRZUhaWGpx","repeats":1},{"count":840,"lower_bound":"T3lFcXQyUXNYUmpaT1dkRm9DUkp2bGJ6Znc=","upper_bound":"UEtxZHRqVTlxMHFLWVZwTDAyY3hqblpxZTJpOTBQNmlkV3hZ","repeats":1},{"count":848,"lower_bound":"UFB1SUdOSGFvUkxTMXpX","upper_bound":"UFNNTGxrbGJ3UHppZm5mVFdpSFFQbURSOHhOanVEU2I1VnhRT2xiNDFiY0dtYw==","repeats":1},{"count":856,"lower_bound":"UFRhNG1xMlRMdTFaTHo3U1VuaWwySm5GbEk1SmUwRm9XTWY3dURZRmhzQw==","upper_bound":"UG40S0lLNXpyU2c2WUZyMkgzeVlkeGVBbmcyTUhyWEVJd3hGaTROalJNYw==","repeats":1},{"count":864,"lower_bound":"UHFaS29VOENJYlhqNUZVOU9lOXZzV0lLRXVQ","upper_bound":"UQ==","repeats":1},{"count":872,"lower_bound":"UTAxUks2dENTcWJFNHk=","upper_bound":"UUJwYw==","repeats":1},{"count":880,"lower_bound":"UUtkT3lhSUtvWTE5VWlFVHJ6aHd6ZnZoWFl1R2NiSzBBcXZkSngyQ09XSkJoY1VReTg=","upper_bound":"UVlCekdIWU4wZDBMNlVoa0E2RHNqcUlJNTBtYU5MdGRmU2JEcWFwQkRmNHV0eHJFZEdRQTk=","repeats":1},{"count":888,"lower_bound":"UWUxejl5d2N0WUY3","upper_bound":"UXJ3Z3hGdDFWdEtXWTB0dXFDckMzQlF3aFZxalc4SkVtRXk1WEgzYXVncFpEc0RrU05jT3Z5ZDNicw==","repeats":1},{"count":896,"lower_bound":"UXYzdHgwVQ==","upper_bound":"UjhMZlZmNm9BRFpGb2JrcHdUYXJQWFM=","repeats":1},{"count":904,"lower_bound":"UkVScDdLTjNDZXM5d2hBOHY5bGM1dVZLSG1qZGdC","upper_bound":"UktVeE5oQ2I0RXB3S2RLM0hmSXJPcWJqRkRtQWtnbFF2M2JsWWhUY1hPWDNpN09FeA==","repeats":1},{"count":912,"lower_bound":"UlE5enc3NzdlUmZXMm9LU0dHOExyZ0VJVW1VZExxWE51cDhqTTlEU0hl","upper_bound":"Umd0b3JFZ0g5eE8xQUJrZ0tncWl1cExtSmpMWEpuUzRMYzRwaThIQzY1eFlPMjE=","repeats":1},{"count":920,"lower_bound":"UnBXMmVUY1ZYa3VlS1BoOUVYSQ==","upper_bound":"UzQzeGE0ZlI1ZXduOURtaW1WR1lBODMzVngxeDFHaWMxRTJDaUNCenA2QU1YcFd2RGhtamk=","repeats":1},{"count":928,"lower_bound":"UzRmYjVFQTc5R0U=","upper_bound":"U0lQU2ZrZ0ZHdVlKSHNwQ0hTZnVYeVNWdERVM25VOXJhN2JWcjhMQU5VYThEZGVzMHZXTXdD","repeats":1},{"count":936,"lower_bound":"U0lta3JUbWE0a2t1Z2xSeXZUb2R1aVdFdjYyU1Q2TEc0Z0xOWnpBb05hUDBSaUR4aEU3cVV1akl6VkVnR3N1ZA==","upper_bound":"U05OYzVCR0RvM0dzTHVKWDQ=","repeats":1},{"count":944,"lower_bound":"U1diVlN6UnNOa29kWHNLaUNOV1JlWTRvb05GWmJyaVdISUhtTGhOUGE2Yg==","upper_bound":"U2phanZ2VjdXb2VqRHQ=","repeats":1},{"count":952,"lower_bound":"U21GUDRNU25FZnpHZWRzcXFMYkdvbk5FQ09VZUV1U2pRQVNCZ3RIRVRHTzdia1d5WnBzTEZPWEs=","upper_bound":"U25yOUkxbE8zS0poZTg=","repeats":1},{"count":960,"lower_bound":"U29aZ2JnOGRxTlo=","upper_bound":"VDBnTVFLSEp5NUx6eDBoRGJqY2lISTZtZVdKQ2h0dnpKWmRvR3BLUG9iano2dGE=","repeats":1},{"count":968,"lower_bound":"VDRGeXRqbDd5","upper_bound":"VERnaVVUcW51UWFteTZXVGt3bjNxQndBVEpFQllQN0g=","repeats":1},{"count":976,"lower_bound":"VEZqUVRUNGJ3TVFFM2paVEp2VkI0VDJaNGUyZ3FKdDlCYWk=","upper_bound":"VGR5WVhL","repeats":1},{"count":984,"lower_bound":"VGxZdkJ1N3owemVEOWQ5V25FcnVvcDdUMlppVmlZbHJiV2FXcURy","upper_bound":"VHFTZnN2M2dsakpVQnc1c0tUMFN1akZOQlVkRUd0Ylc2Z0RsTXF0Wkh0ZDIwN0ZoTzhHYVR3cnhTTFI2","repeats":1},{"count":992,"lower_bound":"VHdScXNxcFBEWFN5Z0hGNHpMNG5JOTlPMlkyVTBxQmxtTVNNNTk1ck8=","upper_bound":"VURoU09ka0lnVXFnSm9sMkdNUUNYQ0p5dGZVWUN3TGI4MWpIUzIyVmNXUWRjenViZldZWDVjdndS","repeats":1},{"count":1000,"lower_bound":"VVF6RVBIUGo0WGp1Sks4TGh1R0I=","upper_bound":"VVpIMFFhQ3VTQ1BJS1o2Q2tYVFpmeW5jM1g=","repeats":1},{"count":1008,"lower_bound":"VWY3","upper_bound":"VXB6VkRJaU1YbVhIdDZ6UDl2THpQTUw4dGdRZm1RYXJuag==","repeats":1},{"count":1016,"lower_bound":"VXM5WQ==","upper_bound":"VXcwYWhHNkJ0S21UbW0yakliWWlNNVliVVdBYjZZdmRGZnZOeG5USXFxMFUySDhFczNzR2pSZ1U4UGQxUw==","repeats":1},{"count":1024,"lower_bound":"VXczM1Y1SnN4WE1WQ0sya0F3OEV5OVFlYVQ4QVFZcmk=","upper_bound":"VkU0QnB1TDlmSzFreHphYTJuSXptTVoxVXU=","repeats":1},{"count":1032,"lower_bound":"VkdDeDJEYkhOMTVxRW9lTA==","upper_bound":"Vk16OTYwRTBSSzVYN0l5aGx0aDVTMXg5NHdCRw==","repeats":1},{"count":1040,"lower_bound":"Vk9NdzVDTXV1bHdySE52Z1pBYzh6aFljSENQQm9HQUgyRg==","upper_bound":"VmM1MWxpR2pGS1VvNVo3S2xNeGdXaVd5amxNbXFRaA==","repeats":1},{"count":1048,"lower_bound":"VmlGZXB2ZUxKVA==","upper_bound":"VnhndVFOQ0VPQXFKcGl6UVhQd0FRUzBhR3FKbGFIOXZvSmFJZ3U=","repeats":1},{"count":1056,"lower_bound":"VnpFaTFTRHRQRTIxY1AwNEFOdmFOUXNCZ01CeDYxbmw5NWFEeDFLa25Obg==","upper_bound":"V2laZUpVcHdt","repeats":1},{"count":1064,"lower_bound":"V3d2TDlYakNMdWtGVGRZME9MblZ1NVJvdFdZaDF2ZUNUYVk0MXQ=","upper_bound":"WEtxb21hdzVXSXQ4RkFIYXdnc0oxcXR4TWFuT1V2NUVrY3R1Y1VUSjhYRmRkUm9vMEJXb2xpcHc=","repeats":1},{"count":1072,"lower_bound":"WFM0R3V0NzB3bkJMbG5jeFQxZHQ4Z3VSdFhmRUlZSHFvT2FON3V6d3JG","upper_bound":"WFZJQUNwNkIzZ1psYUFRakRycG84UzNxNFhmT3kxQ1I2Nw==","repeats":1},{"count":1080,"lower_bound":"WFZNUk1PRUxDUDJzdGduWE93Z2NRRjU5dlphUjFrMTdYdnFQc2RrMGI5YTZPSGNXbmhFcjdkakJSZQ==","upper_bound":"WFkwbGZDUWJSeGR0MGdReDNteVdQeFRR","repeats":1},{"count":1088,"lower_bound":"WFkzRzFSZHdwazdPWEJFWEtrNFFZcmtUTWFlb0VlUjMx","upper_bound":"WGdmdGV4cEhNbFJtN29Kdzk5U29wNUVNVHEydGVONndzOE1xd09lTjN0N29PTW1uZWtuMTg=","repeats":1},{"count":1096,"lower_bound":"WGg1MHM5dnQ0azBOTXVQeFZXUWp3Q3VSOHpuRjRyZlBnQjdrbUtURzg4eUlt","upper_bound":"WHdNemdYTUdkcEVEck1FUzg=","repeats":1},{"count":1104,"lower_bound":"WTBCRzJ2M3VIb2dwVm5SSW4yVkU4UUhvZ0RQVXJuaThDNXFES0tCT251Tmt4VUZZam9Ebmk2c1R0Z2k=","upper_bound":"WThRdElEc2NpRVhkazR5VQ==","repeats":1},{"count":1112,"lower_bound":"WUJISExJQnZvT2dkNWpOazRhMGpwdUVWbG1BRTdVQWhWWUcwSlc4SVI4dVVzRTdqbktncTZn","upper_bound":"WUk1MWI2ZGhId2NNelFTTzl2YjJYM1kxZHR6MDNwMXI=","repeats":1},{"count":1120,"lower_bound":"WUxqVG9tZ21XTkJtT1JSRGxLRQ==","upper_bound":"WVA2R09iZzcyNVN5MlU=","repeats":1},{"count":1128,"lower_bound":"WVBWT2t1cUxxRjFxTkc2R3M1dGNTaHNVRDR3UFNPYjNSVGxGTGl0","upper_bound":"WWE1YkNnc3NCZElObTI4dzBjbVJTbzB5VHhqcjdkTmtHc1o1dktRVW83T29qV3c4Q2w0VldXaTVtQWRuRA==","repeats":1},{"count":1136,"lower_bound":"WWNsMVdoeEg3VkM=","upper_bound":"WXBCUk82U0dzN0t0Q1hYNHlYMmpqMjJLaUVPQ3JwWTR6a2VuMG5xcW1kd1NJWlBYS08yNUp2emo=","repeats":1},{"count":1144,"lower_bound":"WXhpTWR3aHQxVlpvYVBrdlRCRGo4eEJs","upper_bound":"WkRvTUx3QUhGTXdyZXI3NWhWTXdOMXJyZmtOWDM4U3g4TEwwbGg4T0NXM242TEZOdUsxMEUwb3NSUDVuYWY=","repeats":1},{"count":1152,"lower_bound":"WkpPU1lLYXNWVk0w","upper_bound":"WkxPaXl6eEgzOXVnT1llTVVHbDI3Rkc5","repeats":1},{"count":1160,"lower_bound":"WlJkRHNCSXJzbXR6dzBC","upper_bound":"WlZJYm5xUFBZQmZEeXRmcA==","repeats":1},{"count":1168,"lower_bound":"WlgwVHhmWU5HRzlCZElvVDFWRWVJZjZ6b0tsUDM2bQ==","upper_bound":"Wms1TVB6Q3VwcUZEenFWYUtRYkhkVVR4Y1M0V3FyVUxBdA==","repeats":1},{"count":1176,"lower_bound":"Wm01NGVvRmFsYU5EQnQ1U1FhSGo5OGpjWDludzExd011MVRRZ0ZLZnNzMkpQSzY=","upper_bound":"WnBVS05ia1ZlR0NsQkVtSlFtMUpQ","repeats":1},{"count":1184,"lower_bound":"WnBoZXdsaWZGSjMzTEUwY3RhblVHaVFoakxiTkxPV3hwNWFVUmd0YnAy","upper_bound":"WnlLazJFUWdkR0o=","repeats":1},{"count":1192,"lower_bound":"YUZzZnhmZ0gwcnlDOU00aGF3cENZRFpBbUhEQVBhcENCaHBXQVJZSE1uaEF5MG5PbTY1TWhPMkFQRlFsbQ==","upper_bound":"YUswS3FLNW9DMTVqV0liYzlhaFB0QnhLSU5QWTRwUXl3dEZ5NVNZVWM2aHAz","repeats":1},{"count":1200,"lower_bound":"YVQ3VUNzQ2VQQlpNT01FTXM2clJZdkhEWmJ0cXJDWU9UYmUwUndVWXlUUmZ4U0pXMTdQdHBmTElWUU00WG1p","upper_bound":"YWNIY25VWUZoVmVVeWl1WWxyUTBIVWoxaTNlWlNEbkx0RGtDNkltcms0cENJUnVJTnRPOWphbnpzOA==","repeats":1},{"count":1208,"lower_bound":"YWNORnZCSjVJYURlN0d5bmQyNVowS3Ny","upper_bound":"YW40UzVtVkd4N00=","repeats":1},{"count":1216,"lower_bound":"YXFTNVh5R2Q0RzRqVkVQdjV5","upper_bound":"YXU1UDY1MXF5QnJBNkZUUW1B","repeats":1},{"count":1224,"lower_bound":"YXVlUGNxQVA5dW9LZVNuOFhzZDhqQ3FNYQ==","upper_bound":"YjBnZzNURlY0R21uNkhRWllpSUVUM0NGaGZINmtqR0Zoa1ZIN1F5THh2b2M3cktvSjQ5alFC","repeats":1},{"count":1232,"lower_bound":"YjN3VGI=","upper_bound":"Yk8zYk12cGxWMmlhYU5yQ1ZWTkg4Mm9BMA==","repeats":1},{"count":1240,"lower_bound":"YlBIeG8zRmcyNzhPU2NCdzg4TzdXQkJTNVpySGhFMTBaQXg2ZGw5VENxVXg5ODFa","upper_bound":"YmZ1QkpaRHp3M05VdjRUTWpCdDY1R1pJVDFOS0t5djUxamlJb2FTVjl2MExrQzhpQ3FXTThVcW9CblZp","repeats":1},{"count":1248,"lower_bound":"YmdSZkZwclVUMk1GeDJMZ0tGU01Pc01LN3QwNjl0RzVzUXdMTEF5SjJ6","upper_bound":"YnlpUGtJY01jSU9NTzRJSTE2YTFzc0RnTXJTcg==","repeats":1},{"count":1256,"lower_bound":"Yw==","upper_bound":"Y0VnNmFVN1FiUnI4RE5GeHY5d2FtWnF5ZGVEbnlVUUFja3o=","repeats":1},{"count":1264,"lower_bound":"Y0hsVzJMRFdFd0VUclJrcW9JeUpnZFUyQ0JQd085WWxSUEdKTjdyM1JMblhoOEdrNk90cHFjdEpTNUp3NEc4RA==","upper_bound":"Y1lLMVdsMTdpQ1FTQ2tvOGFFb2g4NEE=","repeats":1},{"count":1272,"lower_bound":"Y1ljaDVubEZiY1JVMmQxSmZuQURkTGpiNA==","upper_bound":"Y2VlZ2c=","repeats":1},{"count":1280,"lower_bound":"Y2hZbkR5WmpqdDhqa3JHd0Q3b0ZhRkdYSkY5SGs4VGRqVko5dURoOFZZSlFF","upper_bound":"ZDJMMWI0Q1pZVW5JaWxKSnFKUklrMmJTZEhiNG9XZjhnWkZzT2tYVA==","repeats":1},{"count":1288,"lower_bound":"ZDh1NHlRVkdxOQ==","upper_bound":"ZExDQkdkWWFoNThHcUtTbzRYY0FJb1RZTTJ4dkRpRnJ6R2hMZTllZmJEa2RhT1RDVXpJSmJpTkJ3c1NNQ0lW","repeats":1},{"count":1296,"lower_bound":"ZExTVFZVT2lybVBYRnNGeVFlMGFDS1JUa3ZISWxmd05UaVpMdE1lSndMNUdxbnI0YUN0QkNWZE5HeFFsTHM=","upper_bound":"ZGdYYjB0YjVl","repeats":1},{"count":1304,"lower_bound":"ZGhBbXk=","upper_bound":"ZHBFWGVRdWo1VUlnMU1Pcks4ZTZkVUhGeUNENEJQSjRyWU9CRHV5UTlJRnYxR1c5RGIwQm4yMFlvN2U=","repeats":1},{"count":1312,"lower_bound":"ZHRVSm9TdE9qM3h2Y2lQM0FMM1BpTW5ldm1qeGVtbWJCRUliY09iY1pPa0p3OWp1dmhZd1YxUg==","upper_bound":"ZTVIRElhTmY3Y1d6eDFLSDFQZVN0YWczbTNHQlVEUlZGQXo3bVVkaktTQ3NkT2NvREw1","repeats":1},{"count":1320,"lower_bound":"ZTdRY2tsanFOazlFaHo4Y0I1S0w0","upper_bound":"ZUozUUhycg==","repeats":1},{"count":1328,"lower_bound":"ZU5mS3BmQlAyc0VXbFhIUE5lcUJlaTNvMkZBR0ZOejFHVA==","upper_bound":"ZVlwVGw2emJHNGFFODN1VzdBdUdGY29SYWJvSXNlc1ljYXo2ZlZuTWxvMHI2M3QwQm5kbWc=","repeats":1},{"count":1336,"lower_bound":"ZWNNcGJ6cXFtVHhSdmVKZlVlMFhz","upper_bound":"ZWxiV2xWbjZjMA==","repeats":1},{"count":1344,"lower_bound":"ZWx6VEdZbVJIOVJVUTBKZ3U4bGU=","upper_bound":"ZXc3d2h0b01FTDNYVVg2","repeats":1},{"count":1352,"lower_bound":"ZXpXcFZYRHF1S21zb0s3dHVBSTBRakhnZTZZVWZKMW9HeUdtckd2akRCMDBQQmM3M3Y=","upper_bound":"ZjN6TURicFE3WEZybVVDSVZCRzE5Skxhem01bXlMSXI=","repeats":1},{"count":1360,"lower_bound":"ZkI=","upper_bound":"ZllQcHJvelR1WQ==","repeats":1},{"count":1368,"lower_bound":"ZmVBWmdqSzJDR004U1pRQktwc0tValQ=","upper_bound":"Zm5CQWpXRDVCWEs=","repeats":1},{"count":1376,"lower_bound":"ZnBjYW9PeVNqaTI=","upper_bound":"ZzFCRFpiYzZ2b0NoQUQ4a1RxQ0trRnd4ZQ==","repeats":1},{"count":1384,"lower_bound":"Z0RxVnJCVUxSSGZ6WGNHYnhyUDZJdHhLMWtaNzBBNA==","upper_bound":"Z1BWVGNMU0ZNSDg5ZEU=","repeats":1},{"count":1392,"lower_bound":"Z1I3blpG","upper_bound":"Z1p0YkZ0ZkhjUzEzYUNWMzV2SXliMDBKdk1MWGZMczU3QmM1SklRTVo4cDQ2NmRiYk5iOExtWldYWDE=","repeats":1},{"count":1400,"lower_bound":"Z2FFVXBlcGJETHdiNzVyU2JKc3E5U2ZWbzY4eWNHVzlsbXk0ZWs4N1UwOUhCaDl6RVdSb3QzU3o=","upper_bound":"Z2lTTg==","repeats":1},{"count":1408,"lower_bound":"Z2s5bEJhZWhYY2VkbTZ6Y2htZWdIUnRWU0RKRk4=","upper_bound":"aEZnUk9pbHpVZGVyNGlQdTJqWkR5MGQ=","repeats":1},{"count":1416,"lower_bound":"aEhLWUlRQ1dOVnZMcUtkcDR6Yk41cHh1c3Z5cFQ3YmVsZFB2YjdleVo=","upper_bound":"aGE=","repeats":1},{"count":1424,"lower_bound":"aGJEQnZR","upper_bound":"aGNVbHg4TEh5RnBPWjZid1F1cmEydEp0VQ==","repeats":1},{"count":1432,"lower_bound":"aHBBVmhLcUR4OGc=","upper_bound":"aHR1NFN5TmZ1ZzJL","repeats":1},{"count":1440,"lower_bound":"aHlyV3VobXlsSUhqbjlPR21GMG43ajBRNUh5YVdieWh6WlZJSXFGYjdCVTI4bDBiN2Y=","upper_bound":"aTUxOXlPSXdtM2pWVUdHVmRsNEtGMnNNaXFDTHpkV2loNjU=","repeats":1},{"count":1448,"lower_bound":"aTk1dXpFUnRiRU5SV3dQN3lWdDdrU3lJY0hpRUxuNGNWeWtONnRhWUtMNkdENTd5UA==","upper_bound":"aUcwTHk=","repeats":1},{"count":1456,"lower_bound":"aUdRNUppQ1VaTHo3M0dnOUFHYmFURGV1","upper_bound":"aU9BVjNPRGlNWXNUcUZTMFRXblZ4YWJRU0Z4eEVkVjMzYk42Um5ON3dYdUpZZ1FRRWJqQ3J6MXY0RHZhMFJT","repeats":1},{"count":1464,"lower_bound":"aVhUMWZJS2I4eDUyZkJBY2pzNzZ1UzEwaXNSWk8xOGtzaDc=","upper_bound":"aWowV1RhamdhcXNpeVl6M2xHRUp4cTY5S041Y0p0TnFwc0g4UWpOcTE=","repeats":1},{"count":1472,"lower_bound":"aXAzbGtYbHo5OG1rTkpjbUdiUzB0TW93NHE1dFJaTDFMRHNwbzlTUGFzaGlsMVAwTE9NOQ==","upper_bound":"akNGVXFsOUxEUEVlNlRJbzg1NG9zOUVBMFJYeGtNZUhuM0xkREZ4Vlc=","repeats":1},{"count":1480,"lower_bound":"akR3ZGFYVmxHUEF3aElXZnVTT05kMk5TdGltc0VPYXdzUTIydg==","upper_bound":"akxLN1Jwc0R6ZXU=","repeats":1},{"count":1488,"lower_bound":"akxvTHlQeDRTSGZPRXdsTWtkaWVmanl1RmFFT3F2ZlZ1QWFaaA==","upper_bound":"alFDUllGUDU0Z3l1WjNk","repeats":1},{"count":1496,"lower_bound":"amh6ekR6c2RPQnk1QUg3bVloR3JOUENWYw==","upper_bound":"amtCbnB6Q2M3WXd6bUxNbmZM","repeats":1},{"count":1504,"lower_bound":"anAxTFhOUnVNTU1WRm9MMUxkSVc5NktmMEEzUUFWVm5icXdtcFVhWHAyUUg5YWIyZ1M=","upper_bound":"anozRk9lZ1FKenZQNlY0aG5MdE5lbExJeVRCdjc5NllyRUNGbXFJZGJ2ejE2SlNlWUgzSkdoaTc=","repeats":1},{"count":1512,"lower_bound":"azBJczY3Z2U2TEw1dWgyNGpZVjBMRzBuMUU=","upper_bound":"azVhOG5GZTgwdDZ6aGdEQ21CUGJ2UGJWclVtVUhrVVRKUDgwdkhxQnhXZmw3cHE3eUV2VGk=","repeats":1},{"count":1520,"lower_bound":"a0RSQTRFMzM=","upper_bound":"a1dnQWlzdnlRTGVsbWwxVmd3Y0ZHMHcwTDRIZUc5QXRqcE4zR01ZQWlvNnda","repeats":1},{"count":1528,"lower_bound":"a1o4akg3VTVrMWVjRGhEOEp0YktqQ21UaVExSkNza1VZekd2SWpwQU9QVFBJTHQ=","upper_bound":"a2RnelJNSlZCc3hDcjdlWURPdWtqdWJKckRBQnBGT0VlR1oyUzA=","repeats":1},{"count":1536,"lower_bound":"a2gyOGYwUGFIT1pjYjh5SzZiUlJPVTJlazJn","upper_bound":"bDJvZFRGSnZiWVZa","repeats":1},{"count":1544,"lower_bound":"bDVIcVNvZHRtUlk4bTB6VnpBSEhlSktUZm96NGRwRlhtQndpUFdQQkRzaWlKNE9CdjlrWlVxUEI=","upper_bound":"bEJSaGptdDdVaHlEWDVrUnpDWkFYTnJ0RkQ2WEp0aE1DcWRoTEM=","repeats":1},{"count":1552,"lower_bound":"bENMMEdEOUNuaUpnQk9IVWZqeVRpUmV0","upper_bound":"bE1xRkpZZmJxMTNQbnFEN3JjVHUwYTdBR3N0dFhMbmZnZ3V2ZFBpcG96eWxlUU9uQjQ=","repeats":1},{"count":1560,"lower_bound":"bHMybGk5SDZDaEZJRXd1ZGZoNUh2a1ZQbERNNXVKZ1d4bGN3amRteENOaXg5UnhOaFZyV0ZuZA==","upper_bound":"bQ==","repeats":1},{"count":1568,"lower_bound":"bTRlTmhpWkNSY25nYmk1S2tsYWVEaXpTZXA3ZEV6aw==","upper_bound":"bUZ5OEdDSmxwZlF6MDFVQnJBWVk=","repeats":1},{"count":1576,"lower_bound":"bUhzRzF6QTlCekxFOGtGZ2V0UXFQVm1jS0RZZnI5Y2lTOHJJTEIzWjRUeXlCeU0zMFdi","upper_bound":"bWVWMVFBekxjalBTYVIxUmVra0JiSE04djhCckNuSWo=","repeats":1},{"count":1584,"lower_bound":"bWZkTFYyYjZmV1V2UnFVQmtyVUpldzkxYkVHdWpRSWVhaWdRS0JYRnc3QUM0ZzhUUTZXaHVpUG00YklodjM=","upper_bound":"bWxlb3JkZ1ZrZFd6cXBJWTFBa2REYVlhb0VTVWM2MXFSQjZRSmRlT1o1c0JHWUhqZ2ltd29INkNJUw==","repeats":1},{"count":1592,"lower_bound":"bW0xa3FUUGJNNEZEcDNuMlJZY1ZSY3Y3U3BZMWtmN2w5cUxjdmY3SVJkSGRCNA==","upper_bound":"bjlFVFcwekNpcEwxOTI3UmhYR0FtMXN3OUNIWnVVcWVXRzlCVXdXZE0=","repeats":1},{"count":1600,"lower_bound":"bkE3Snh5ejhlM1NjYlhjRzM1eHZ2UGE4","upper_bound":"bk1nbTI=","repeats":1},{"count":1608,"lower_bound":"bk5sNlV6MG9jNXZLdGJCZXBlbDdOalMxbGFDRlViTDJucDVFY21zUEV4VllsVzZBdw==","upper_bound":"bmQ2a2JrRkRETW4xTjc0VVRDRjRGZHViVFdhaDZVckZ5Y3RZUVpJV0Uydm5XQnlNdk5RMWI2N1ByNUN1M2ZBeQ==","repeats":1},{"count":1616,"lower_bound":"bmR1aEg2V2Y=","upper_bound":"bmlxTkJxOEFDTDhnSjJtM2J1VG5JazhHbU5C","repeats":1},{"count":1624,"lower_bound":"bmpZRjhzT0JaQW9EbVBJUWY3NFFwWmFLOWNVWkl3eWVoRVV6RGc4SllWQmFTYVdVMGlXYw==","upper_bound":"bnZ1Qw==","repeats":1},{"count":1632,"lower_bound":"bnh0RDNCZlJUWWxZcXBRRzlwZ1BmdmtPWEhhNjdWeXc=","upper_bound":"b1M0dGNsb2Fud00yemlIMXhHNVVCQnlYdkxPVFVSa2VPcUFrM0NKS1FSU2x5TXB0Y3AxamQzOTg5YXM2NWNz","repeats":1},{"count":1640,"lower_bound":"b1Q2aGxPdWM5c2IzY3ZuNEFCNUsyaG15aTVoOXE0c1Z6MWE3a3RtMGNIZ25XWlg=","upper_bound":"b2luV3lGWVE2eGUydkI3eDJJalhoMXpGWUl0","repeats":1},{"count":1648,"lower_bound":"b2lxc25JN0N5SWZFVUJlbWxRYWl5Sg==","upper_bound":"b3VqcGxYdjNiZUpuck1YYlpPWUN6V0pSaThwaHl1VGt3TEhubTJReUd6SGxRQmN4RlNtc2M=","repeats":1},{"count":1656,"lower_bound":"b3c2ag==","upper_bound":"cDNSRjEyS1Azem1GVDlQMENlSHZ2ZHpaZDZNRVRCYQ==","repeats":1},{"count":1664,"lower_bound":"cDNZSlRHTA==","upper_bound":"cEI=","repeats":1},{"count":1672,"lower_bound":"cEJsT0ZLcTRybUY3Z2M0SUR1RTROQm5EdGlqbVluNHdMbHk=","upper_bound":"cEhxYTZLdmlydzJndERBMjQyZlFZTllKUWMwdlhTazhCZzl3RXU0UjVCVlNr","repeats":1},{"count":1680,"lower_bound":"cEl1Zm42M002VA==","upper_bound":"cFdCSWsxaW02QTIwb3BHeEVPTjUzaTJsRGZZSEJPcEpVc0czMnNtc3p1bTgzNTRSMktRRjAzQk8y","repeats":1},{"count":1688,"lower_bound":"cFo1cmVlYTBsUkxldmlHNUk0cDJuZHlROEdhVzVyRDQwODNhd2pESzVTWW8yMjJhUnFuVjdnSjI0MkhHUw==","upper_bound":"cGkwcG1Da2dvWGZpUDVTV2R4RjJ1WkZ6THo=","repeats":1},{"count":1696,"lower_bound":"cG16aDRSVzFuc2xIZTJrekhkRnRpbHhWYVMyN1lmdXdYVnJt","upper_bound":"cTExbWNUTzNQbG4xNzNQbDYzRHpB","repeats":1},{"count":1704,"lower_bound":"cTFaTE05WlRjblc2ckpYMQ==","upper_bound":"cUFsWlFVZmVuRXk2TVJ4d2sxNjVqWnFxbWNtVTVoaWR3ekVYYnZR","repeats":1},{"count":1712,"lower_bound":"cUdwM2RTcTFsTUw5NmRib1pVam9mQko4UFR1czhyZVFUdVRRM0FDbzRQNQ==","upper_bound":"cVAzb3hUdTBpTkZ6Nm1wQ1BtdDMzcjFXT1QxanFtbjZRUVhzeXY=","repeats":1},{"count":1720,"lower_bound":"cVlwMFVEdnh1SWFTc1ltSUt4dklGaWJKbk13MVNHZDVnYg==","upper_bound":"cWNOYnJqS1ptSU1PNmhETzZrNWZjZ1VzWDJHRTNTSW5tYmNaOTkwYWZ2aDBrajRaS3dYdg==","repeats":1},{"count":1728,"lower_bound":"cW5xb2pVQjRVeFBUTERBWGRITE1WNTJ4RmxZamxVdmU0S3k0THRvdFFrRDA4N0lUMEl0Q01uZ1RvS1FVVg==","upper_bound":"cg==","repeats":1},{"count":1736,"lower_bound":"cjA1eHEya09FUDBTSWZJa3Jnc1VvYVNwdnFBZWxmUkRC","upper_bound":"ckRBQmJjZXlRTE12M09vNlVaM0U=","repeats":1},{"count":1744,"lower_bound":"cko1anZqZTNOQk1uZG4xazJSTTJ1ZkVTNzNQeTJDb0pQYjVqQm5ZTGFJVw==","upper_bound":"clphWE02NkswT1R4aDVwSzFBcGd5QlZMcDdlOFJZVExTWVNjMUlweFlOUzNXZUxvaUlUeVBLTGxSN0p2TU4=","repeats":1},{"count":1752,"lower_bound":"cm16bTB5dlNzRHJOd3M4VXA=","upper_bound":"czVY","repeats":1},{"count":1760,"lower_bound":"czhiam4zUWZySndKY1RjN3lNWWtEb0tJNnQ0ZFg5R2FRM3hhd0M=","upper_bound":"c0Nld25PZ3ZwVGU0MkFoNlg3QmZ1WkU=","repeats":1},{"count":1768,"lower_bound":"c0ZMekRkd1V1YU52SFpmeGFIajIxMFdNbmF3cGJHTFpuQnFTeVJCWHhPb3NrejJ1Umts","upper_bound":"c014Uk1FWktqZkYxVTNkSFhQM1R3VVVzVGRwNTFrMms4NVB1OGJZRmtndkxkeUVXUWN4WA==","repeats":1},{"count":1776,"lower_bound":"c1BnNFk0cG01dmFqWU5VdW1DTjNvZzBWeFd5","upper_bound":"c2xmcWtFdmdicw==","repeats":1},{"count":1784,"lower_bound":"c256MVpYeW52MnA5","upper_bound":"c3RyWEJ4ckI0YXJZQXdaU3hPSnFrREJKWFdlWVR1YQ==","repeats":1},{"count":1792,"lower_bound":"c3hzazVEM1Y0MEcza255RVFCd3gxNGpiTnYyUHBpU3VjMmE4bXdtTEdVZTZvU0JpcVlJSEpkTnNmVzY5dQ==","upper_bound":"dEFWcnVF","repeats":1},{"count":1800,"lower_bound":"dEJKU09uSFlSUUw=","upper_bound":"dE9BTEZpdjZqU0p3NjB0azBtdG41OU83ZXR3OFM=","repeats":1},{"count":1808,"lower_bound":"dFRrS2FlRTM5S1VUUWc3dlNYS1l6MDNKMktQcDVrMWNsUnI=","upper_bound":"dGhBdDBaQklrMzVNOW43a1B3SWFKZnhoMA==","repeats":1},{"count":1816,"lower_bound":"dGxZMmxIMFVOZWpTYk1LZnBvcXVmaGQ1UDBPcUlJYkxXcTlsaldjQXhQUFJ5OTZzdXlpR2o2ZDdrUXVQMkFs","upper_bound":"dHlVN3pRVXpkV3FW","repeats":1},{"count":1824,"lower_bound":"dUFlMTdKTHJKMHZ3ck5jOXFxTksxUmxPbUlvVmh1TktpWUFZU3ROOUdjM3pwYlRza2JiZ2N2V0ZJSA==","upper_bound":"dVVTWHVTT2w2akwxSGg2d3J4WnZGclBsMm4ya0Q2","repeats":1},{"count":1832,"lower_bound":"dVllWVE2WkVRdnVQZ1BKQ0dsZQ==","upper_bound":"dWR5bUQ=","repeats":1},{"count":1840,"lower_bound":"dWw2QkxGag==","upper_bound":"dXRFWG1VbmtMVzdqT1lPYkpoQVFoRHdXOXJrSmwwaHUyQktFNk5qczViWjQ3Mjc4OTk3TnpqT3BXTms=","repeats":1},{"count":1848,"lower_bound":"dXc5N0tZWnhEaDdyblNUWDAwZXA=","upper_bound":"djV0N1l6b2V5dEliZENMTzk2cEZ1UEVrSWdqRGFFVW1ib1lNbWdabldFQ1ZpY0VMN2VXbUtBUjM=","repeats":1},{"count":1856,"lower_bound":"djhhM253V3BGekpNREtiTU5MbERZM2pycXV2eURJbGtLcFJ6bHF2RkdRZUZGZ3pLV3Q5Wk9GMnFOSw==","upper_bound":"dk84RnVyTTBhc2NTUUJBazRLbzAyalZ1Z1lYclFx","repeats":1},{"count":1864,"lower_bound":"dlBidU04SlZkNlVpeVhBQTdhcUl3MEYyUHBrMlNYY0NWQ2w2SHVxUWlVZzRyVjU1TkYxdzBza1FFdE9Z","upper_bound":"dlpzUTlzWmo3ZVQ5NG5tRDhZWXprUlJHWEZiQUVzNGY3aXFPZTJRVkds","repeats":1},{"count":1872,"lower_bound":"dmIyTnVlRnA2N3gz","upper_bound":"dnV0ZjBPSXh4bmw2bFdWYUxuYkhXWEpMRXJNQzVveDYyc3ZHOGVTVg==","repeats":1},{"count":1880,"lower_bound":"dnZnSUdzb0ZnakdENmpuMW1tZ0hmRVNkd0pLRVBWckhh","upper_bound":"dnp1RkVFajBXMDdZVFB4UDFRSmtEVEo=","repeats":1},{"count":1888,"lower_bound":"dzZSMWpUS3drb3Q5VTh0R2NwUXEycWNockxhQVdzeTI4RGFFOHc=","upper_bound":"d0h4a3RkMllj","repeats":1},{"count":1896,"lower_bound":"d0w=","upper_bound":"d1MxTXp3bVpoaUJndTFiRmxsR0pkU2FPaGx5dWU1c0xrbjRDMUprQlF5ZmtqYzRLR3M=","repeats":1},{"count":1904,"lower_bound":"d1REbW1PampPenJXTkVSQjZDdU1CcQ==","upper_bound":"d2drbVNIcFBlYkVjaDhDZDdHcHpndjhMb2h2STFwUWprTFZpeTZVem1lcW9GWFJYUUV0UGhBbFBFVGRR","repeats":1},{"count":1912,"lower_bound":"d2lWNTExajFHYnJEWW80bWdpYlh4UDJjSnE2NlRKbG10ejQ0Yk1CNWg0ZXE=","upper_bound":"d203MVo=","repeats":1},{"count":1920,"lower_bound":"d3BIcFNDWlVteU85UEhhU0RNZENQTUZtMEdPY0p3ZmhZVzdnSWJkTEE=","upper_bound":"eDY2Yjd2Tg==","repeats":1},{"count":1928,"lower_bound":"eDZZdjU1ODlidG9jMW5YYkRJVTV5RA==","upper_bound":"eFB0QVdXTFlLYw==","repeats":1},{"count":1936,"lower_bound":"eFI0","upper_bound":"eGZESDNKMWJEYnVqdlNzNkJhZVFKdnFFZXFPM2RKYXcxNjlnbFZ3","repeats":1},{"count":1944,"lower_bound":"eGdSaVpZOVg4WGszMmJpamNoRWlRS1NHSg==","upper_bound":"eURLcWphRjg1cE43MUxDUWtkTXJ2VENuc1M3Q3JWakp0azlWS0x1ZWQ=","repeats":1},{"count":1952,"lower_bound":"eU5ZR20=","upper_bound":"eVhnV1N4Yml0OXhiWm5DbTQ0YVNOZzUwUHBwT0puWXBPRWRQUzVLZEVrS09mdnRJQw==","repeats":1},{"count":1960,"lower_bound":"eVhoUEtoT1o3UkltdTFa","upper_bound":"eWdCQXhoQnVLWg==","repeats":1},{"count":1968,"lower_bound":"eWlQTW9rN3dMRmEwRlhSYkF5TExCa2oybGU1MFZnWXRGdWNOVjd6OWUxeg==","upper_bound":"ejFQVE93Y3J4b0QzQXNPT0tOcEU3REVIckx0c3Z5Q01WQ3owQVRMQw==","repeats":1},{"count":1976,"lower_bound":"ejRqQWczU1JBSkJUbHpHdzRV","upper_bound":"ekdHNTFEaWpHSlRWcWlHZVBTN3lGcVpxV2ZsSzVpbXZaaHNMaGZzQzZKUm9vZlZB","repeats":1},{"count":1984,"lower_bound":"ekg4c3dCb0prN0lHajk3TmVXcG5uRzZLV2Z6YzcyaWNPZFRmdlhrZlhZajFYRW1o","upper_bound":"elU2QW9vTGl6cHJlNHIzaDhYRjBBSHp5Y3RpN2RYOHlXRVlsMnI1QVVvZTIzYkU3a2FPVDN2","repeats":1},{"count":1992,"lower_bound":"eldCbjBBTw==","upper_bound":"emh0aTdrb0RWNjZvRjBHWUxzV1UxMlNRRHhsRkxzWkVSR3laRUU2Zmp4M1pabng5ckl0VGNKMThwb3o1NXZIdg==","repeats":1},{"count":2000,"lower_bound":"emh6UU9LZ3d1OEpDd1pUVXE=","upper_bound":"enUwWXN2dVBiYzYzRmN3UUdMUnlWaDdyclZRc2JmTlFJbHNMTw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,1,0,0,2,2,1,0,1,2,0,0,2,2,5,1,1,2,1,1,1,3,1,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,2,0,0,1,0,2,1,1,0,0,2,1,2,0,0,0,0,2,1,0,2,2,0,0,1,0,2,1,0,3,3,0,2,1,1,0,0,5,1,1,1,0,1,1,2,1,1,0,1,0,1,1,0,2,3,1,1,1,0,0,1,0,1,2,0,0,0,1,2,1,0,0,0,1,2,1,2,1,1,1,2,0,1,0,2,2,1,0,1,2,2,1,0,2,0,2,2,1,0,1,2,0,1,2,2,2,0,1,1,2,2,0,1,0,0,0,0,0,2,0,1,1,0,4,2,0,0,0,0,2,0,2,4,1,4,0,0,2,0,0,0,1,1,2,0,3,2,1,0,2,0,0,2,2,2,1,0,3,0,1,1,3,1,1,0,1,1,0,0,0,0,0,2,3,0,3,1,0,0,1,2,0,0,1,1,2,0,2,2,0,1,1,2,2,0,1,0,1,1,4,0,0,0,0,2,1,1,1,2,0,2,2,2,4,1,0,1,1,1,0,1,2,0,1,0,0,0,1,0,2,0,0,0,1,2,1,1,0,2,5,0,2,4,0,2,3,0,0,1,1,1,2,1,0,2,0,0,1,2,0,1,1,1,0,2,2,1,1,0,1,2,0,0,2,0,1,3,2,1,1,2,1,0,2,0,3,2,0,0,1,0,0,1,0,1,1,1,1,1,3,0,0,1,1,2,1,0,1,1,0,3,0,1,0,0,1,1,0,4,2,2,1,0,2,0,1,1,1,1,0,0,0,1,1,1,2,1,0,0,2,0,4,1,1,2,2,1,1,2,3,0,0,1,0,0,1,2,2,4,2,0,0,2,1,2,2,0,1,1,0,3,1,1,1,0,1,2,1,0,1,0,2,1,1,0,0,2,0,1,1,1,4,3,2,1,1,1,2,2,0,0,0,2,0,1,1,1,1,2,3,1,2,0,1,0,1,0,0,0,0,0,0,1,1,2,1,1,2,2,0,0,1,1,1,1,0,2,1,0,0,2,3,3,1,0,1,0,1,2,3,0,1,0,3,0,1,1,0,0,2,1,1,2,3,1,0,1,1,1,2,0,0,1,0,1,1,1,0,0,2,1,1,0,2,0,0,1,0,3,1,0,3,0,0,1,1,0,1,3,1,2,0,2,2,1,0,0,2,1,0,2,1,0,0,2,1,2,2,2,1,3,1,2,2,0,3,1,1,4,0,2,0,0,1,5,0,1,0,0,0,2,1,0,1,0,2,1,1,3,1,1,1,1,1,1,0,2,0,1,1,1,1,0,1,0,1,2,1,0,1,1,0,1,1,1,0,1,0,2,1,1,0,1,1,0,3,2,0,1,1,0,1,2,0,0,0,1,2,1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,2,0,1,2,1,2,2,1,0,2,0,2,1,1,2,0,1,1,1,1,3,1,3,0,2,0,1,0,1,1,0,2,1,3,1,0,0,2,1,1,0,0,2,0,1,3,1,0,1,0,0,0,0,0,1,0,2,0,2,2,0,0,0,0,2,1,0,0,2,0,1,1,0,1,1,3,2,0,2,2,1,2,0,0,1,2,1,0,0,4,1,0,1,0,0,0,2,1,0,1,1,2,2,0,2,2,1,1,2,1,0,0,1,2,2,0,0,3,2,2,2,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,3,0,1,1,2,0,5,2,2,1,2,0,0,3,1,0,2,0,3,1,0,1,2,1,0,1,0,3,0,1,2,1,2,0,1,0,1,0,1,0,1,1,3,4,2,0,0,0,1,0,0,0,0,1,2,0,0,3,0,0,1,0,1,1,2,0,0,0,1,2,1,1,1,0,3,1,1,1,0,0,2,1,0,0,0,2,0,1,0,2,2,0,0,2,0,4,1,0,0,0,0,0,0,0,0,4,1,1,2,0,0,1,0,0,0,3,0,0,0,1,2,0,1,2,2,0,0,0,2,0,0,0,1,1,2,0,4,0,2,1,0,1,1,0,1,3,1,1,1,2,0,2,0,0,0,3,1,2,0,2,1,2,1,3,1,1,1,0,2,1,1,3,0,1,1,1,0,2,1,1,2,1,0,2,1,2,2,1,0,2,1,0,1,0,0,1,4,1,2,0,1,2,0,0,0,2,1,1,1,0,2,2,4,2,1,0,1,0,2,2,1,1,1,1,0,1,0,0,0,1,0,0,2,0,2,1,1,1,0,0,3,0,1,2,1,3,0,1,0,0,3,0,1,1,1,2,0,2,3,2,0,3,0,2,2,3,0,0,1,1,1,2,1,0,0,3,0,0,2,0,0,0,1,1,2,1,1,0,1,0,1,2,0,1,0,2,2,0,3,0,0,0,0,1,1,0,1,3,0,2,0,3,0,2,0,1,1,3,1,0,1,1,0,1,2,2,5,0,1,2,0,1,1,2,4,3,0,1,2,1,0,2,0,1,2,1,1,1,2,2,2,1,1,0,2,1,0,0,0,1,2,1,2,1,0,0,1,2,0,1,2,0,3,0,2,1,2,0,0,2,2,0,0,0,0,2,0,1,0,2,1,1,2,1,0,0,1,0,0,0,0,1,0,1,1,0,2,1,2,0,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,3,1,1,2,1,0,1,0,0,0,1,1,3,3,0,0,1,2,2,1,1,0,0,0,1,1,0,1,3,0,1,1,1,0,5,3,0,1,0,1,0,0,1,1,1,0,1,1,2,0,1,3,1,0,2,0,1,4,1,1,4,1,0,1,0,0,3,4,0,0,1,0,0,1,3,0,2,1,1,2,0,2,1,1,2,1,0,1,2,1,0,2,0,1,0,1,0,1,0,1,1,1,1,2,1,0,0,0,2,0,3,2,1,1,1,2,0,1,1,0,0,1,0,2,0,2,1,1,0,1,2,1,1,1,0,0,1,3,0,0,1,0,0,0,2,1,1,1,2,2,0,2,2,1,1,1,0,4,0,0,2,1,2,0,0,2,1,1,1,2,2,0,2,0,0,2,1,0,1,1,0,2,0,0,0,1,0,2,0,1,0,1,1,0,4,0,2,3,0,0,0,1,0,3,1,0,2,3,3,2,1,1,2,0,0,1,0,3,0,0,2,2,0,1,4,0,0,0,0,0,0,1,1,0,1,0,0,1,1,1,0,2,0,3,1,2,1,2,1,2,2,3,1,1,1,0,0,2,0,1,3,1,2,0,2,3,3,1,0,1,0,0,1,0,1,1,2,1,0,1,5,1,0,1,2,1,2,0,2,2,2,0,0,1,1,0,3,0,2,0,1,2,3,3,0,0,0,0,2,1,1,0,1,1,0,1,0,0,2,0,0,1,0,1,1,0,0,1,1,1,1,0,2,1,1,0,0,1,0,3,1,2,0,2,0,3,0,3,1,0,0,0,0,0,0,1,1,2,0,0,1,0,2,1,2,1,2,0,2,0,3,1,0,1,0,0,1,0,1,0,0,0,2,1,2,2,2,1,1,1,1,0,1,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,2,0,2,0,1,1,2,1,1,0,0,1,0,1,0,0,2,1,2,1,0,0,5,1,0,1,1,0,0,2,1,0,1,1,1,1,0,0,1,2,0,1,1,1,1,1,0,1,0,1,1,2,1,1,1,2,1,2,0,2,2,3,3,1,1,0,0,0,0,2,0,1,0,0,0,0,2,0,2,0,0,1,0,0,0,2,2,1,2,1,1,1,0,1,0,0,0,2,1,0,2,1,0,0,1,2,2,0,0,0,0,1,0,0,0,0,1,0,2,0,0,1,0,0,3,3,2,0,1,2,1,1,1,0,1,3,0,4,2,1,3,1,0,0,1,0,0,1,0,1,1,0,1,0,1,1,1,0,3,1,1,0,0,1,0,2,0,0,1,0,0,1,1,1,1,1,1,1,2,3,0,0,1,0,3,2,1,1,2,1,0,0,0,0,1,3,4,1,0,2,1,2,2,0,0,1,2,2,0,4,0,1,1,1,1,1,0,0,1,0,0,0,2,0,1,0,1,0,3,1,2,2,1,0,1,1,3,1,1,1,0,0,0,0,1,0,2,0,2,1,0,3,1,0,0,1,1,1,0,0,4,0,1,2,0,0,3,0,0,4,1,1,2,2,0,1,1,1,1,2,0,2,0,0,1,1,1,1,1,1,0,3,2,2,1,2,0,0,0,0,0,0,0,0,2,0,1,0,0,1,1,0,1,1,0,4,0,1,1,1,1,0,1,1,0,0,1,0,3,1,1,0,2,0,1,0,0,1,2,0,1,0,5,0,1,1,0,3,2,2,1,2,0,2,2,1,2,0,4,0,0,1,0,1,1,1,3,3,1,0,0,2,2,0,0,0,3,0,1,0,0,0,2,0,1,2,1,0,0,1,0,1,2,1,2,2,1,1,3,0,2,0,2,0,0,1,1,4,0,1,1,0,1,1,0,0,0,0,0,2,1,1]},{"counters":[1,3,1,0,1,0,2,1,0,3,2,1,2,0,0,2,0,0,1,1,1,2,2,0,0,0,0,2,0,1,2,0,1,0,0,1,1,1,1,1,0,2,2,2,3,2,0,1,0,4,1,0,1,1,3,2,2,0,2,2,2,1,1,1,1,2,0,0,0,0,1,1,3,1,1,0,3,1,1,1,2,1,0,0,1,2,1,0,0,1,1,1,0,1,2,1,0,1,2,3,0,1,1,0,0,3,1,1,2,0,1,1,1,2,1,1,2,0,1,2,1,0,0,2,1,0,1,0,1,2,0,3,0,1,3,2,0,2,1,1,0,0,0,0,0,1,2,2,0,0,0,0,4,1,0,2,0,0,1,2,1,0,3,0,0,1,0,0,0,1,1,1,1,2,1,1,2,1,1,2,0,0,1,0,0,1,0,0,0,1,0,1,2,2,1,2,3,0,0,3,1,0,0,2,1,2,0,1,2,2,0,0,0,2,0,0,0,2,0,2,3,2,0,3,3,0,1,0,0,1,0,1,1,3,1,2,3,0,0,3,0,1,0,1,1,2,0,0,3,1,3,1,0,1,0,2,1,0,2,0,2,1,0,1,0,0,2,0,1,4,1,1,0,1,1,1,0,1,1,2,1,1,0,1,2,1,0,1,1,2,0,2,3,1,2,1,1,1,0,1,4,1,1,0,0,0,1,1,0,1,2,2,3,0,0,0,1,4,1,0,1,1,0,1,1,1,1,0,3,0,2,2,1,0,0,0,0,0,0,0,1,3,0,0,2,0,0,0,2,0,0,0,2,0,2,2,1,1,1,0,1,2,1,3,1,3,1,0,0,2,0,0,1,1,2,0,0,1,2,2,2,3,0,1,1,0,1,0,4,0,1,1,2,0,2,0,1,1,0,1,0,4,0,0,0,3,1,0,1,3,1,1,3,1,3,1,0,0,1,1,0,0,3,2,0,0,0,1,0,1,2,1,1,0,0,1,1,1,0,2,2,2,1,1,0,1,1,0,1,0,1,1,1,0,0,2,1,0,2,2,2,1,0,1,0,1,3,1,2,0,0,0,0,0,1,1,0,0,1,0,4,2,4,0,0,0,2,0,1,2,1,1,0,0,2,4,0,0,2,1,1,0,1,1,1,0,0,0,0,1,1,0,2,4,1,0,1,0,2,0,2,1,0,0,0,1,1,1,0,3,0,0,0,1,0,2,1,0,1,1,1,0,0,2,0,1,1,0,3,1,3,0,1,0,1,2,1,1,2,1,3,0,1,0,1,1,0,1,3,2,0,1,1,0,2,0,2,1,1,0,4,3,0,0,1,1,0,2,1,2,1,1,0,0,1,1,0,0,1,0,1,0,0,3,1,0,1,0,0,3,1,1,3,3,2,1,1,0,1,0,2,0,0,0,1,2,1,2,0,1,1,0,3,1,2,1,1,1,2,0,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,3,1,1,2,1,2,1,1,2,1,1,0,1,0,1,0,2,0,0,0,2,1,0,0,2,0,2,1,0,2,0,0,1,0,0,1,1,0,0,0,2,1,1,0,1,1,0,0,0,0,2,1,0,0,2,1,0,1,0,0,2,0,0,4,1,1,0,0,1,0,3,4,2,2,2,1,0,1,1,0,1,0,1,3,2,0,2,2,1,1,3,2,2,0,0,1,1,1,0,0,0,3,1,0,0,0,2,0,1,1,1,1,0,1,2,2,2,0,1,2,0,0,0,2,1,0,1,1,1,1,1,1,2,1,1,1,1,1,0,0,2,0,0,1,0,0,1,2,3,1,0,1,1,0,0,0,2,2,1,0,1,1,1,1,0,0,1,0,1,2,1,1,0,1,1,3,1,1,0,0,1,1,2,1,2,0,2,0,1,2,0,0,0,3,1,0,0,3,2,0,0,1,4,0,0,2,0,4,3,1,3,0,1,0,0,1,0,1,0,1,0,1,2,1,1,0,1,0,2,0,1,2,0,0,2,2,2,5,0,0,3,1,0,0,1,0,3,1,0,1,2,1,0,1,1,1,0,2,0,1,5,0,1,1,0,0,2,1,2,1,1,2,0,1,1,1,0,1,0,1,2,0,2,0,0,3,0,1,0,1,1,0,1,0,1,3,0,0,2,1,1,1,1,2,0,0,1,2,2,1,0,2,1,1,1,3,1,1,0,0,1,1,0,1,0,1,0,1,0,1,0,1,2,0,2,0,1,2,0,2,1,4,0,1,0,3,1,3,1,0,0,1,1,4,0,2,1,2,1,1,1,1,0,1,0,0,2,0,1,3,0,0,2,1,1,0,1,1,1,4,3,4,0,1,0,2,2,2,0,1,2,1,0,1,1,3,2,3,0,0,0,0,1,1,0,3,1,3,2,0,0,0,0,2,1,1,1,1,1,0,1,2,1,1,0,1,1,2,1,1,0,5,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,2,1,0,0,1,1,0,3,1,2,2,1,0,0,1,1,1,1,2,2,2,3,0,0,3,0,0,1,1,0,0,1,0,0,1,2,0,1,0,1,0,0,0,1,1,0,0,2,1,2,2,0,2,1,1,2,0,1,2,0,3,2,1,2,1,2,2,0,0,1,1,2,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,2,2,0,0,1,1,1,1,1,2,0,4,2,1,3,4,1,0,0,2,1,0,1,0,1,2,0,1,1,1,1,0,0,1,1,1,0,1,1,5,2,1,2,1,1,0,1,1,1,0,1,3,2,0,0,0,1,1,3,0,1,0,1,3,2,1,0,2,2,1,2,1,2,0,0,1,1,3,0,1,1,1,0,0,0,0,2,3,1,1,0,0,2,1,0,0,0,0,1,3,0,2,1,0,2,1,0,1,2,0,0,0,0,0,1,1,2,0,0,0,0,1,1,2,1,2,0,0,0,2,1,2,0,0,2,2,1,1,1,0,1,1,0,1,0,1,1,1,3,0,1,2,0,1,0,2,0,2,0,0,1,0,3,0,1,0,1,2,1,1,0,0,2,1,0,1,1,2,2,0,0,1,3,1,2,0,1,0,2,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,1,1,2,1,1,1,0,1,1,0,0,0,0,2,1,2,2,1,1,5,1,1,5,0,2,0,2,0,0,0,1,0,1,0,0,1,0,4,0,2,1,0,1,2,0,0,0,2,1,0,0,2,0,0,1,0,1,2,0,2,0,2,0,1,0,2,2,0,1,3,0,2,1,2,0,2,0,1,0,0,2,3,1,0,1,0,1,0,0,1,2,2,0,1,0,1,0,1,4,0,1,2,2,0,2,2,0,2,0,1,2,1,1,0,0,2,1,1,1,0,2,1,3,0,1,1,1,0,2,2,3,0,0,1,0,0,1,0,0,2,0,1,0,2,0,0,1,3,1,1,0,2,1,1,1,4,1,2,0,0,3,0,2,2,1,0,1,1,0,1,3,0,1,2,3,0,1,2,0,0,2,2,3,0,0,0,1,1,1,0,0,2,2,1,0,0,1,0,1,0,2,1,2,0,1,0,1,1,1,1,0,1,1,3,0,0,1,3,2,2,2,0,0,0,0,0,2,0,1,1,0,0,1,0,2,1,2,2,0,0,1,0,2,0,2,0,4,0,0,0,3,1,0,1,0,2,1,0,0,1,1,0,2,2,0,2,1,1,0,1,1,0,0,1,0,0,0,2,4,0,0,0,2,0,1,4,0,1,1,5,0,1,1,1,2,1,0,0,0,0,1,2,0,2,1,0,1,2,1,1,1,0,2,1,2,1,0,1,0,0,0,1,1,2,1,1,2,1,0,0,0,1,1,0,1,0,1,0,1,2,0,0,3,0,0,0,2,2,1,3,1,0,1,0,1,0,0,0,1,0,0,0,3,1,4,2,2,1,0,3,0,1,1,3,1,2,0,1,0,1,0,0,2,1,4,0,0,2,0,1,2,0,0,3,1,0,2,1,1,2,0,1,0,1,0,0,4,1,0,2,2,1,2,1,0,1,2,0,2,2,0,2,0,2,1,1,1,1,3,1,1,0,0,0,1,3,0,1,1,1,3,1,4,1,0,0,1,1,1,0,0,1,2,2,0,0,1,1,0,1,2,1,0,4,1,1,1,0,0,2,3,3,0,0,0,1,1,3,1,3,3,1,0,1,1,0,1,0,4,0,1,2,1,1,1,1,1,0,0,1,0,0,0,3,0,3,3,2,1,1,1,1,0,0,0,1,1,1,0,0,1,2,2,0,0,0,2,1,1,1,2,1,1,1,1,1,1,0,0,1,1,0,2,2,1,2,1,0,2,0,2,0,0,2,1,1,0,0,2,0,2,2,0,0,0,1,2,1,0,1,2,1,0,0,1,1,1,0,0,0,0,2,1,0,2,0,0,1,0,2,1,0,0,1,2,0,1,1,1,0,0,1,1,2,1,1,0,1,0,2,1,2,1,1,2,2,2,0,1,2,2,4,1,2,2,2,1,1,1,0,3,1,0,2,2,1,1,1,1,1,1,2,2,0,1,3,1,0,2,1,1,2,0]},{"counters":[1,2,3,2,1,0,2,1,2,4,0,0,1,1,1,1,0,0,0,2,0,0,1,2,2,1,0,0,0,3,0,1,2,0,1,0,0,1,1,0,1,1,3,0,0,1,0,2,2,1,0,0,1,0,2,1,4,1,1,0,0,0,0,0,0,2,1,0,3,1,2,1,2,2,1,1,0,3,1,1,0,1,1,0,0,1,1,1,2,0,2,1,0,0,0,1,0,1,2,0,1,0,2,0,1,2,0,1,0,0,1,5,2,1,2,0,2,2,1,1,1,2,0,0,0,1,0,1,2,4,2,0,0,2,1,0,2,0,0,0,1,2,0,0,6,3,0,1,1,0,1,2,1,1,0,1,2,1,2,0,1,0,0,0,2,0,1,0,1,2,0,0,0,3,0,1,0,0,2,1,1,0,1,2,5,1,0,1,5,1,0,1,0,3,1,1,1,1,0,0,0,0,0,0,1,0,3,2,0,2,1,0,0,0,0,2,0,0,0,1,0,0,2,2,0,1,3,2,1,1,1,2,2,2,0,1,0,0,3,2,0,4,2,0,0,0,2,1,4,0,0,2,1,1,3,3,6,1,1,0,0,3,0,0,3,1,1,2,0,0,2,1,1,1,1,1,0,0,0,0,1,0,0,2,0,0,2,0,1,1,3,0,3,1,1,3,0,2,0,2,3,1,3,1,1,1,1,2,0,4,1,0,1,2,1,4,0,1,0,3,0,0,0,3,0,3,1,0,1,0,1,1,0,0,0,1,3,0,1,2,1,0,1,0,2,1,1,2,0,1,1,1,0,1,2,0,2,1,0,1,0,0,1,0,2,0,0,0,0,1,1,0,2,0,0,0,1,1,1,0,1,2,0,1,0,2,0,2,3,0,4,2,1,3,3,2,0,2,2,2,0,1,0,1,1,2,2,1,1,0,2,1,1,0,2,0,0,3,1,2,1,1,0,3,2,1,1,0,1,3,2,1,0,3,0,1,0,0,1,1,1,1,1,2,2,0,2,1,0,1,2,1,0,1,1,0,0,0,3,1,2,0,0,2,0,1,3,2,0,1,1,1,2,0,0,0,1,0,0,1,1,0,0,0,1,1,1,3,0,1,1,2,2,0,2,0,0,0,1,2,1,0,2,1,0,1,0,4,0,1,4,2,2,2,1,0,1,4,0,0,0,1,1,2,0,2,1,2,1,2,2,0,1,1,1,0,0,0,0,1,2,1,5,0,0,0,2,3,0,2,2,2,2,1,2,1,3,0,1,1,2,0,1,0,2,1,1,0,0,0,0,1,1,1,4,0,0,1,0,1,2,1,1,1,1,1,1,1,0,2,1,2,1,1,1,0,1,0,0,2,1,0,1,1,1,1,0,0,1,0,1,2,1,0,4,1,0,0,2,1,2,1,2,2,1,0,0,1,0,1,2,1,1,0,0,0,3,0,2,1,0,1,0,0,0,2,1,1,2,1,1,2,1,1,4,2,3,2,1,1,0,0,2,1,0,1,1,1,2,1,2,0,1,1,0,1,0,3,3,1,1,3,0,1,1,1,0,0,0,3,2,0,0,0,0,3,1,1,0,4,0,0,0,1,0,0,0,1,3,0,1,1,3,2,1,1,2,0,0,0,0,0,1,0,0,1,0,0,2,1,0,1,0,0,0,1,2,0,0,0,0,1,1,0,0,1,1,0,0,0,3,2,2,2,2,0,1,1,0,1,2,1,1,1,2,2,1,1,2,1,1,0,3,0,1,1,1,2,5,1,0,2,1,1,0,2,0,0,2,1,3,1,2,1,0,2,0,0,1,1,3,1,0,1,3,0,1,0,0,1,0,1,2,4,0,1,0,2,1,1,0,0,2,1,1,1,2,2,0,0,0,0,1,2,1,3,3,5,0,2,0,2,0,1,2,0,2,0,1,0,1,2,0,3,0,0,0,0,1,0,1,1,2,0,2,1,0,1,0,1,0,0,2,1,1,0,0,0,2,1,0,0,1,1,1,2,1,0,0,1,1,0,0,0,0,1,0,0,0,0,3,1,3,0,0,1,1,0,0,0,0,1,0,1,0,1,2,1,2,1,1,2,1,1,1,1,1,1,0,4,1,0,0,2,1,1,1,0,0,0,0,0,1,2,0,1,1,0,1,1,0,1,0,2,1,0,2,1,2,1,0,0,1,1,1,0,1,2,1,0,0,0,0,1,0,0,1,1,3,2,0,3,2,0,1,0,0,1,0,2,1,0,1,0,1,2,1,1,1,1,0,1,1,0,1,2,0,1,1,0,2,0,0,0,1,0,2,0,0,0,2,2,0,0,2,1,0,0,2,1,1,2,0,1,1,2,0,2,3,1,0,1,2,1,1,0,0,1,2,0,4,1,1,0,0,2,0,1,0,1,2,1,0,1,0,1,1,0,1,2,0,0,2,1,0,0,2,1,1,0,3,1,0,0,0,0,4,0,2,1,4,1,0,1,0,2,0,1,0,2,2,0,0,0,1,0,2,2,0,0,1,1,1,2,1,1,1,0,1,0,0,0,3,2,1,1,0,0,4,0,1,1,1,3,0,0,0,0,0,3,0,0,0,0,2,1,1,1,1,1,2,2,3,1,1,1,0,0,4,0,0,2,2,0,0,2,0,0,1,1,0,2,1,1,0,2,0,1,2,1,2,2,0,0,0,2,2,0,1,0,4,0,0,4,2,2,0,2,0,0,0,2,0,0,2,0,1,1,1,0,0,1,2,0,2,0,1,0,1,1,1,2,0,1,0,1,2,0,2,0,0,0,1,2,0,2,1,0,2,0,0,1,1,1,3,0,2,0,0,0,1,1,1,1,0,1,2,1,1,0,0,1,0,0,1,2,0,2,0,1,0,0,1,1,2,0,1,1,1,2,1,1,0,0,0,0,0,2,1,0,1,0,0,1,2,1,1,0,1,3,0,1,1,2,1,1,5,1,0,1,1,2,2,0,1,1,0,2,3,1,0,2,1,1,2,1,0,1,2,2,0,2,1,0,0,2,2,2,0,0,0,1,0,0,3,4,0,0,1,2,0,4,0,0,1,1,0,1,0,0,0,2,0,0,1,1,1,1,0,0,0,1,2,1,2,2,0,2,0,1,0,0,1,2,0,1,0,2,1,2,0,1,2,2,2,2,1,1,0,0,1,0,1,1,2,0,2,1,1,0,0,1,0,1,1,2,2,0,0,0,1,0,1,2,0,0,2,1,0,3,0,0,2,3,0,2,1,1,0,0,0,3,1,1,0,1,0,2,1,1,1,0,0,0,0,0,2,2,0,2,0,0,2,2,1,2,2,2,2,0,1,1,0,0,4,2,2,0,1,2,0,0,2,0,0,1,0,0,1,2,1,1,2,2,1,0,2,1,3,1,0,0,1,1,0,0,0,0,0,0,0,2,1,2,0,0,0,0,1,2,0,2,0,0,0,2,1,1,0,0,1,1,1,0,0,1,2,0,1,1,2,0,2,1,0,2,3,0,1,0,1,0,1,2,2,1,0,0,1,1,3,0,2,1,0,0,2,0,2,1,2,5,1,0,2,2,1,0,0,3,0,0,1,2,0,2,1,1,2,1,2,1,1,2,1,0,0,0,1,0,3,2,1,0,0,1,1,1,1,0,2,1,0,2,1,2,0,3,2,0,2,2,0,1,2,1,0,0,0,1,2,1,2,0,2,1,0,0,2,1,1,2,0,0,3,1,1,1,0,2,1,1,3,2,0,2,3,1,0,3,1,2,2,0,0,0,2,0,2,0,0,4,2,1,0,1,4,1,1,1,0,1,2,0,0,0,1,2,2,0,1,1,1,1,0,1,1,0,3,2,3,1,4,0,0,0,1,4,0,1,0,0,1,0,2,1,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,1,2,0,1,0,2,0,0,2,2,0,1,0,0,0,2,0,0,1,0,0,1,0,0,0,0,1,1,0,1,1,0,1,0,2,2,0,1,0,0,0,3,1,2,1,0,0,1,2,0,2,2,1,1,1,1,1,0,2,1,1,1,1,1,3,1,0,2,3,1,2,5,0,0,2,1,0,0,2,1,0,0,0,2,1,1,0,1,0,1,3,1,0,2,2,1,0,0,0,2,0,1,2,6,1,3,1,2,3,1,0,0,1,1,1,1,2,2,2,0,1,2,0,0,0,0,0,2,0,1,0,0,0,0,1,0,2,2,1,1,1,1,0,1,1,0,0,0,0,1,0,1,3,0,0,0,1,2,1,2,0,2,0,0,1,2,0,1,2,1,2,1,1,1,1,0,0,0,2,0,1,1,0,0,1,0,1,2,0,1,0,0,0,0,0,0,2,3,1,0,0,0,0,4,3,2,0,0,1,1,3,1,1,1,0,0,0,0,0,1,0,0,1,1,3,3,1,1,1,2,0,1,1,0,0,0,1,0,0,2,0,1,1,2,0,1,2,1,0,2,2,1,0,1,1,1,2,1,1,0,0,1,1,0,1,1,0,1,3,4,1,2,1,2,1,1,3,0,0,1,1,1,3,1,2,0,0,0,0,1,1,0,1,0,1,0,3,1,2,3,2,2,1,0,4,2,2,2,3,1,2,3,0,2,1,0,2]},{"counters":[0,0,2,0,2,0,1,1,0,0,1,0,1,3,1,0,0,1,1,0,2,1,0,0,0,1,1,1,1,5,3,0,1,1,0,2,1,3,1,2,0,0,2,3,2,1,2,0,2,0,1,1,5,0,0,1,2,0,0,1,1,2,1,0,2,1,1,0,3,1,1,1,0,0,1,0,1,0,1,1,4,1,1,1,1,2,0,1,0,1,3,0,0,2,2,1,1,1,0,2,1,1,2,0,3,0,0,0,2,1,0,1,0,2,0,2,2,0,2,0,0,1,1,0,1,2,1,0,1,1,2,2,0,2,1,0,2,2,1,0,0,0,2,0,0,2,1,1,1,0,1,1,2,1,2,0,2,0,0,3,0,0,1,1,1,0,1,0,1,0,1,0,0,4,3,1,1,1,0,1,1,0,1,0,0,1,1,2,1,0,1,3,0,2,1,2,1,0,1,0,0,0,2,1,0,0,0,0,0,1,1,0,0,0,1,3,1,1,1,0,1,3,1,1,0,2,0,1,1,0,0,1,0,1,1,0,0,2,1,0,1,0,0,3,0,1,0,1,0,1,0,2,1,2,2,1,0,3,0,2,1,1,1,1,2,0,1,1,1,0,1,2,1,1,2,1,1,2,0,1,1,0,0,0,2,2,3,0,3,0,0,0,1,2,0,1,1,1,0,0,1,4,0,1,1,1,1,0,1,0,1,1,0,1,4,1,0,3,2,0,1,2,0,2,0,2,2,3,3,1,1,0,3,2,0,0,1,2,0,1,1,0,1,0,1,1,0,0,0,3,0,2,0,0,2,2,3,0,1,0,2,2,1,3,0,0,0,0,1,0,0,3,2,1,0,0,0,2,1,1,1,3,1,1,1,1,0,0,2,1,0,0,0,0,1,1,0,1,1,2,1,2,3,1,1,0,1,0,0,0,0,3,0,0,0,0,0,1,0,2,1,0,2,1,1,0,1,1,0,2,0,0,1,0,1,2,0,0,0,0,1,1,0,1,0,0,0,0,0,1,2,1,1,0,2,2,0,0,0,1,0,2,2,2,1,0,0,1,0,0,1,0,3,1,0,3,2,2,1,0,3,2,0,4,1,2,1,2,1,3,2,0,2,1,2,1,1,1,1,1,0,1,1,2,0,0,4,2,0,3,2,1,0,1,1,0,2,2,2,1,2,0,0,0,2,0,1,0,0,0,1,1,3,1,1,1,1,1,4,0,0,0,1,3,1,2,1,0,0,0,2,1,1,2,0,1,1,0,1,1,3,0,0,0,1,1,1,1,1,0,1,1,1,0,4,0,0,2,1,1,1,1,0,1,2,2,3,3,2,0,1,2,3,1,0,1,2,1,2,1,0,0,2,0,1,3,0,2,0,0,1,1,1,1,0,1,0,2,1,3,0,1,0,1,0,2,0,0,0,0,0,2,2,1,0,0,0,0,0,3,1,1,0,0,2,1,0,0,1,4,2,1,0,1,1,2,0,2,0,0,1,2,1,2,3,0,0,1,0,2,1,1,1,0,4,1,0,1,0,1,2,0,0,0,0,1,1,1,2,2,0,1,1,0,2,1,2,0,0,0,1,1,2,1,0,0,0,2,2,1,2,0,1,1,0,2,1,0,1,0,0,1,0,0,1,1,1,1,0,1,1,1,1,3,3,0,0,2,0,1,0,0,0,0,2,4,2,2,1,0,0,2,1,0,0,1,1,1,1,2,0,0,3,0,0,1,0,0,2,1,0,3,0,2,1,1,0,0,0,1,1,0,2,2,0,0,1,0,1,4,2,0,0,1,3,1,1,2,2,1,0,1,1,1,1,1,1,0,0,1,0,1,2,1,2,0,0,1,2,1,0,0,1,4,1,1,0,2,0,3,1,1,0,1,1,2,0,1,3,1,0,2,0,1,0,3,0,0,1,0,3,0,0,0,1,0,1,2,2,2,0,2,1,0,1,3,1,1,2,1,0,1,1,1,1,0,3,0,1,1,1,0,1,3,1,2,1,0,0,1,3,1,2,0,1,1,2,1,3,0,1,1,1,2,0,0,0,0,2,1,3,0,0,2,3,0,1,1,3,1,2,1,0,0,0,1,1,0,0,3,1,0,1,2,1,1,3,1,0,0,3,1,1,1,1,3,2,1,0,2,0,0,3,0,2,0,0,0,0,1,2,0,2,2,1,2,0,0,1,0,0,1,0,1,1,0,2,5,2,1,1,1,0,3,0,1,0,1,2,2,2,0,1,0,1,0,1,1,1,2,0,1,3,1,0,6,0,0,2,2,2,1,0,0,1,5,1,2,1,1,1,0,0,0,2,1,0,1,2,1,1,0,1,0,0,1,0,0,0,1,1,1,1,2,1,1,0,0,1,1,2,2,0,1,2,1,2,0,0,1,0,1,2,1,1,1,1,0,0,1,1,2,2,1,1,2,1,1,3,0,1,2,2,1,1,0,2,1,0,1,0,1,1,1,3,0,1,0,0,0,3,1,0,1,4,2,1,2,1,1,0,0,3,1,2,3,1,1,0,4,1,0,2,3,0,1,2,1,0,1,2,1,0,1,1,2,2,0,1,1,0,1,0,1,0,2,2,1,0,1,0,0,0,1,2,0,1,2,2,1,2,3,1,0,2,1,0,0,1,0,0,1,1,2,3,0,2,2,3,1,1,1,1,2,0,1,0,1,1,0,2,3,0,1,1,2,1,0,2,0,0,0,2,0,0,1,1,2,3,1,0,1,0,0,0,1,1,1,0,1,0,0,1,2,2,0,0,0,3,0,1,1,0,1,1,0,0,2,2,0,0,0,0,1,1,0,2,1,4,2,1,1,1,1,0,1,1,2,0,0,3,2,0,0,0,1,2,0,2,1,1,1,1,0,1,2,1,0,2,0,0,0,0,0,0,0,3,1,3,1,2,1,1,1,0,1,0,0,0,2,1,0,3,0,0,3,2,2,1,3,0,2,1,1,3,1,0,1,1,0,3,1,0,0,4,0,1,0,1,0,2,1,0,0,1,2,1,2,2,0,1,1,1,2,1,1,3,3,2,1,1,3,0,2,0,0,4,0,0,2,1,0,1,1,0,2,1,2,1,1,0,0,3,1,0,1,1,3,2,1,0,0,1,0,2,1,0,3,1,0,1,0,0,1,0,1,0,1,0,3,3,2,0,1,0,1,3,0,3,1,0,2,0,0,0,1,0,2,1,0,1,1,2,2,1,2,1,1,4,2,3,1,0,0,0,1,1,0,1,0,3,2,4,1,1,2,2,1,1,1,0,0,0,1,0,1,1,2,1,2,2,0,0,2,0,1,2,0,0,0,1,1,0,1,1,2,1,0,3,0,0,0,1,0,0,1,1,3,0,1,0,1,3,1,1,0,0,0,0,0,1,0,3,1,0,1,0,0,1,1,1,2,1,2,0,1,0,0,0,0,1,1,0,2,0,1,0,2,1,0,0,1,0,0,0,0,2,0,1,1,1,1,1,2,0,0,1,1,1,2,0,0,1,2,0,1,0,1,1,0,1,1,0,1,2,1,3,0,1,0,2,1,1,2,1,1,0,3,0,1,1,3,1,1,0,0,1,1,1,0,0,2,0,0,1,1,1,0,1,0,2,0,1,1,0,0,0,3,0,1,0,0,1,0,0,1,0,1,0,1,0,0,1,1,1,1,1,1,3,0,2,1,0,0,1,0,1,1,3,2,0,0,1,0,5,2,2,1,1,0,1,0,0,0,1,1,0,0,0,1,2,2,0,0,0,0,0,2,0,2,2,0,1,2,2,3,0,2,2,1,1,0,0,1,0,2,1,0,0,2,2,1,1,0,0,0,2,2,2,1,1,2,0,0,2,1,1,2,1,0,2,2,1,1,1,0,1,0,1,0,3,1,0,1,1,0,2,1,0,2,1,0,0,0,0,0,1,2,0,0,2,1,1,2,1,0,1,1,1,0,1,0,1,1,2,2,0,0,0,0,2,1,2,1,1,0,0,0,0,0,1,0,2,0,1,1,3,1,1,0,5,1,2,1,2,1,1,1,2,2,3,2,2,0,0,2,1,1,0,2,1,1,0,2,0,1,1,2,0,0,0,1,1,2,2,2,0,1,0,2,0,0,2,0,0,1,0,0,1,0,2,2,1,2,0,0,2,1,5,0,2,2,2,1,2,0,5,0,0,1,1,5,1,1,3,0,0,1,1,2,2,0,1,1,6,3,2,2,1,0,2,2,1,0,2,0,0,0,0,1,0,1,0,2,1,0,0,2,2,1,1,0,0,1,1,0,1,1,0,1,2,3,0,3,1,0,0,2,1,2,4,0,2,1,2,0,0,0,1,1,3,0,1,0,2,1,0,0,0,1,2,0,1,0,0,2,1,0,1,0,2,0,1,0,0,1,1,1,0,0,1,0,2,2,3,0,0,1,2,0,0,1,2,1,1,2,1,1,1,0,1,1,0,2,0,0,1,1,1,1,0,1,1,0,2,0,0,1,1,0,3,0,1,1,1,2,0,1,1,1,1,1,0,0,3,0,0,0,2,2,0,0,1,1,0,2,1,1,0,1,1,1,0,1,1,1,0,1,1,0,2,1,1,0,1,1,1,1,0,1,1,0,0,0,2,2,1,0]},{"counters":[1,0,1,3,0,1,2,0,2,0,2,1,0,0,0,2,1,1,1,2,1,1,0,1,1,1,0,0,0,0,0,0,1,1,0,2,1,0,0,1,0,0,0,0,1,1,1,1,1,0,1,0,0,1,1,1,1,0,1,2,0,0,1,1,1,1,1,0,0,1,1,0,0,0,0,0,2,1,4,1,0,2,2,0,0,1,1,1,0,3,1,0,2,1,0,0,1,1,0,0,0,2,0,0,0,3,0,0,0,1,2,1,3,0,1,1,2,1,0,0,1,0,1,0,0,1,2,1,2,2,1,2,2,0,1,1,0,0,1,2,1,0,1,0,1,2,2,1,0,2,0,0,2,1,0,0,0,0,1,0,0,3,0,0,0,1,2,1,1,1,1,2,1,1,2,0,0,0,1,1,1,1,1,2,2,4,2,0,0,1,0,2,3,1,0,0,0,3,1,0,1,1,2,1,0,0,0,0,1,1,3,1,1,0,1,3,2,0,0,0,1,0,2,0,0,0,1,0,1,0,1,1,1,4,0,1,0,1,0,2,2,3,2,2,0,0,2,2,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,2,0,5,1,1,1,0,1,0,2,0,2,1,1,5,1,3,0,1,3,1,1,0,1,2,0,0,3,2,0,0,1,1,1,0,1,1,2,1,2,2,1,1,1,1,0,1,3,0,1,0,2,2,1,0,3,0,0,0,0,1,2,1,1,0,1,0,2,1,0,3,0,1,1,1,1,1,0,0,0,1,0,0,1,2,3,1,0,1,0,2,1,1,2,4,1,1,1,1,2,1,0,0,0,0,1,0,1,0,1,1,0,0,1,1,2,0,0,0,0,1,0,0,1,2,1,1,2,2,0,0,1,0,1,0,1,2,2,1,3,1,0,1,3,0,0,0,1,1,0,1,0,2,1,2,0,4,2,3,1,0,0,0,1,1,1,2,1,0,0,1,2,4,0,1,1,0,1,2,2,5,2,0,0,2,1,2,1,0,2,0,1,1,0,0,0,1,0,0,0,0,2,1,1,0,3,0,3,1,2,3,3,0,1,2,0,1,1,1,1,0,1,1,1,0,1,2,1,2,1,2,2,0,3,0,2,1,0,1,1,1,0,0,0,1,0,0,2,1,1,0,2,2,1,1,1,1,3,1,2,1,0,1,1,1,1,1,1,1,0,2,1,1,1,2,1,1,1,1,0,0,0,2,1,0,3,2,1,0,1,1,1,1,0,0,1,2,2,0,2,0,1,1,2,0,1,1,0,3,1,1,2,0,0,2,0,1,0,1,1,1,2,0,2,2,0,1,1,2,0,3,0,1,0,0,0,1,1,0,3,1,2,1,1,2,2,0,0,1,2,0,2,3,1,0,2,1,2,0,2,2,1,1,2,3,4,0,1,2,1,2,0,1,0,0,1,0,1,0,0,1,2,1,0,2,5,0,2,1,0,2,0,2,0,1,0,1,0,0,0,0,0,0,3,2,1,1,1,0,0,1,1,3,2,0,0,1,2,1,1,2,1,1,0,3,0,0,0,0,2,0,1,0,3,1,0,2,1,1,0,2,0,1,0,1,1,0,0,2,1,1,1,2,1,1,1,2,0,2,1,1,1,1,0,2,1,1,0,0,1,0,1,1,3,1,0,0,0,2,1,1,2,1,2,2,2,2,1,2,0,1,4,2,0,2,0,0,1,1,0,2,1,2,0,0,0,1,0,2,0,2,2,1,2,1,1,0,3,2,1,0,4,0,0,0,0,1,2,1,1,1,2,1,0,0,0,0,0,0,2,1,0,0,1,1,1,0,1,0,3,4,1,2,1,0,0,0,1,2,0,0,0,0,2,1,1,2,0,2,0,0,3,0,0,1,2,0,1,1,1,0,2,2,1,0,1,0,1,0,1,2,1,0,0,0,1,1,0,1,1,0,2,3,0,0,1,1,0,0,2,2,1,0,0,0,1,2,1,0,0,0,2,0,1,0,2,3,1,2,1,2,1,0,2,0,0,0,0,1,0,0,1,2,0,3,1,0,0,0,1,1,2,0,1,0,0,0,2,1,0,2,3,0,1,0,2,2,2,1,0,0,0,0,1,1,2,1,1,0,1,1,0,1,1,1,1,0,0,2,3,0,1,0,1,1,2,0,1,0,3,1,2,1,0,0,2,0,1,1,1,1,2,1,1,2,1,1,0,0,1,1,1,0,1,0,0,0,0,1,1,0,0,1,1,1,0,1,0,1,2,0,3,2,1,1,1,1,2,0,2,1,0,3,3,1,0,1,2,0,1,1,2,1,1,0,1,1,4,0,1,0,1,0,1,0,0,1,2,0,0,0,2,2,1,0,2,3,1,1,2,3,1,3,3,0,0,3,2,0,3,1,2,1,0,2,2,1,3,2,0,1,0,1,1,0,2,0,1,0,0,0,1,3,1,1,1,0,1,1,1,0,1,0,0,1,1,2,2,2,2,0,1,2,0,1,0,1,0,2,0,0,2,1,1,2,5,1,1,1,1,1,1,1,0,1,0,0,3,1,0,1,1,1,1,0,1,1,0,3,0,2,1,0,0,1,0,2,1,2,1,3,1,2,3,0,0,1,1,1,1,1,1,2,1,0,1,1,1,1,1,4,2,2,1,1,1,1,2,0,1,0,2,2,1,0,0,0,2,3,2,0,1,1,0,0,2,0,1,0,0,1,0,0,0,2,2,2,1,3,1,2,0,0,1,0,2,0,2,1,0,1,1,0,1,1,1,1,1,1,2,1,1,1,0,2,0,0,1,1,0,0,0,1,2,1,0,0,0,1,4,3,2,0,1,1,0,2,0,0,2,0,0,0,3,0,0,0,0,3,1,1,2,1,0,3,1,0,3,3,1,2,1,0,3,0,0,2,1,0,1,1,1,0,2,0,0,6,1,1,0,1,1,4,1,0,2,1,2,2,1,1,0,0,0,1,2,1,1,4,1,0,1,1,0,1,2,0,0,0,1,0,2,1,0,2,2,1,1,2,1,2,0,2,1,0,1,0,1,0,2,2,0,1,0,1,1,3,3,0,1,2,3,1,2,0,0,0,1,2,2,0,3,0,1,0,0,1,0,0,2,0,0,0,0,0,0,1,2,2,1,0,0,1,2,4,0,1,1,0,2,0,1,0,0,0,1,0,1,4,0,1,0,0,2,1,2,1,4,1,1,0,2,2,2,1,2,0,0,2,0,2,0,1,2,2,0,1,0,0,0,2,0,0,0,0,0,1,0,1,1,0,2,1,1,1,0,2,0,1,2,2,0,1,2,1,1,4,0,1,2,1,1,2,2,3,2,2,1,2,0,0,0,1,0,2,0,2,1,1,3,0,0,2,2,2,0,1,1,3,1,1,1,0,2,1,0,2,0,2,0,0,0,1,0,1,0,0,1,1,1,0,1,1,0,1,3,0,0,0,0,0,4,1,2,1,0,0,0,0,1,1,1,0,1,0,0,0,1,1,3,0,0,0,0,0,2,1,1,1,0,0,0,0,2,0,0,1,4,2,1,0,1,0,1,2,1,1,0,1,2,0,1,1,1,0,1,1,0,1,1,0,1,1,2,2,0,1,1,2,3,2,1,2,0,2,0,0,1,2,1,3,1,0,1,0,0,1,1,1,1,0,3,1,0,2,2,1,1,1,0,1,1,2,0,1,1,5,0,2,3,2,1,1,0,0,4,0,0,0,0,1,4,1,1,0,0,0,4,2,0,1,5,1,3,1,1,0,0,4,1,2,1,1,1,1,0,0,0,2,1,1,1,1,1,0,0,0,0,0,1,0,0,1,0,1,0,1,0,3,1,0,1,2,1,3,1,0,2,1,0,2,1,3,0,1,1,0,0,1,2,2,1,1,0,1,1,0,1,2,1,0,0,3,1,0,1,1,4,2,0,0,3,0,1,1,1,0,1,1,3,1,2,1,0,1,1,0,0,4,3,0,0,2,2,1,0,1,2,1,0,1,3,1,1,1,2,4,0,2,0,1,0,1,0,2,0,1,1,0,1,0,0,0,2,0,2,1,2,3,0,1,4,0,0,2,0,1,1,3,4,0,2,1,1,0,1,0,0,0,0,1,2,0,0,1,2,2,0,1,1,1,1,1,0,3,1,1,4,2,2,1,0,0,0,1,1,0,0,0,2,0,1,1,2,1,0,0,0,0,1,0,1,1,1,1,1,1,2,0,0,0,1,2,0,1,1,0,1,2,1,0,1,0,0,1,2,0,2,0,2,1,0,1,5,2,0,5,0,0,0,0,0,1,0,2,0,2,0,1,4,2,0,0,1,0,1,0,0,1,0,1,0,2,1,5,4,1,1,1,1,2,1,0,1,0,0,1,0,0,0,1,0,1,1,0,1,1,4,1,0,0,1,2,1,1,0,1,2,0,0,0,1,1,1,1,0,0,1,1,1,0,0,1,1,1,2,0,1,0,0,1,1,2,1,1,3,0,1,0,0,2,2,1,2,0,1,0,1,1,1,1,0,1,1,0,1,1,1,2,1,2,0,1,1,1,1,0,0,1,1,2,2,1,3,1,0,1,2,1,1,3,1,1,1,2,1,0,0,1,1,0,0,0,1,0]}]},"null_count":0,"last_update_version":397952029249503232},"p4":{"histogram":{"ndv":1991,"buckets":[{"count":8,"lower_bound":"MDBERE5UbXI2SlJ3eUR1TGs3OUtwYndEZ29JZHhsZ1N0MjF3RHhtQmxMQnF1elNob0ZGVkF6MTZuQjV5cg==","upper_bound":"ME5zRVFiVHNHMHRDcDV5M295MXNna1VCWUx3aW41","repeats":1},{"count":16,"lower_bound":"ME9QYUNreEVBN0prcDc3ZDhIaXMycGg2R0lITUoyVldkcmYyMg==","upper_bound":"MFRGamlLcmdCU0d0MW1vTDFwZFdwRGdPdWU=","repeats":1},{"count":24,"lower_bound":"MGFkQUJTYk9UZ1pYU2U5eXNsUkd6YjdaSGQ4THpidE5mZ1NZQnRMVnB0QlM=","upper_bound":"MGZzRlVOdkFueG1wMjBubUltaGh6aGJYeU5sc0hWcw==","repeats":1},{"count":32,"lower_bound":"MTk3NzVhajlGcEc2ODFka1JqWVB0dmRW","upper_bound":"MUQ4WFBYdUFERQ==","repeats":1},{"count":40,"lower_bound":"MURhYmVsbldpS3NOMnBrNTVNeDh4bzVjdG96QmJ0VUhuMGF6c2htTXhPNnl6YVI=","upper_bound":"MVZCSWhFdUozaUZKYVk2MXhTMFdxRnl1RlNqdGpieUMwYkx3SmRqcGlIT3R1R1FCVThIS214ajc5QQ==","repeats":1},{"count":48,"lower_bound":"MVZSMzdRaGtxQw==","upper_bound":"MWxWOXZtYWY1MjBITWhlbHFZQ0Y3b0dDdUFsU09XN21jVmlZenFCeGFmejBkWHMyMk4yY0x0UUFDYTZuUA==","repeats":1},{"count":56,"lower_bound":"MWxmZFhoMUV6OXY2ZFE4VGJwUnVSZWlJNm9zOExKajdaZ2x2YXlFdkQ0","upper_bound":"MXVaTFVURjBpazBuU0xYdE5Bb2NYaTE3c1ZxTmtkRUlvc1BUSk9KV1lseGxpZDlsNjdsSTJKa0NyNFp1SW5qcQ==","repeats":1},{"count":64,"lower_bound":"MjJQQk1hVHJE","upper_bound":"MkZ6cDJRWTZpQlQzS256OTdkYWtaeG1IcEVPa3ltdHk1RzduMTZ5UWtlSW1yajJIZDU1RmVOQw==","repeats":1},{"count":72,"lower_bound":"MlI3M3FuVVhXODFKS0o4THgyd2t5elpxNXZ1VGF6","upper_bound":"MmJzazVrUjN6Nmcxc3ZGbWJqYWl5","repeats":1},{"count":80,"lower_bound":"MmN4SFVlemVObVM2azJ1SHY1YTB5aFlreWsyVzY3MEF1b1duZkpGbmpGd3JXeA==","upper_bound":"MnIxcFhxZGRFdGdoSHk4QVpmTFRtSTVlNktORTQxTkFsaFNSbThMamVITWd6","repeats":1},{"count":88,"lower_bound":"MnRSb25nSlB1eTk1UW95SmRSanNORmwzY1ZVVHFlRTJuWA==","upper_bound":"MnZKUzdkNXlSZEJkY0NCT2ptYWNWdlNuMDkxWmREeHhoU09NM29aMjhQZnowaVNCazBDNA==","repeats":1},{"count":96,"lower_bound":"MzBDeWFjMlRuV1BkV2swd2gxSE9UZXVYd0U5OE9BQk5nb0I2ZlZ4emp1OEZD","upper_bound":"MzhiYWlraUhtQ0E0WFZFUmx6SlBXQm4xejBaMXN6c2RXMURWQmJnY0Y0Tw==","repeats":1},{"count":104,"lower_bound":"M0RkYXd3MHVyQ3B2Q1pabk93VWg5clVpenFIMnJWb3E2TTJyRUE4ZDVpTklSNmNtdU4y","upper_bound":"M2E2blI=","repeats":1},{"count":112,"lower_bound":"M2NWM242RDJjN3NObnFHdHJIc3I1WVNaT2dGQ0NlcjllaXE5RlFTSXE=","upper_bound":"M2hpT1FxWWl4R2xYZlZFeTN2ZmVXblY5NVg2dHJnUmo2dExqQ0J5Vm5xakw=","repeats":1},{"count":120,"lower_bound":"M2ljdU1WSm5iYUpZWUVZc09mVldkblBXT0VSWmhXS0NvU1NOV0JDV3A2d3RkT3Z6ZGxxeDM2NTJmYmtBUU94","upper_bound":"M204a016dzlrQUc=","repeats":1},{"count":128,"lower_bound":"M25vdTZDRXBUVWdndElQT1RzN3FtRThVY21wYmtNSDd6REZiTXJzbWJzNw==","upper_bound":"NA==","repeats":1},{"count":136,"lower_bound":"NDFXTk1YWGZydmRiVkwyYVZFT0k5azQwOVFmaHZWeWJvc1lBdW5FSlJ2THRnY2J3OHY=","upper_bound":"NEVvTkE2MFVIamY2YjUxT1Y4TUd5Z05JY1dUMW5XNFVCTHVBMlhXWU9HanZFS0U=","repeats":1},{"count":144,"lower_bound":"NEZSdFBwR3VwbzdjSnZuNkVDQ0JYenRJ","upper_bound":"NE9pS01KbVFnWTdpRGM0WHhlQWNyWHJoUFJBWA==","repeats":1},{"count":152,"lower_bound":"NFJ3cVpwb1I1V3dZ","upper_bound":"NGNVN1A2RFkxS1laR3hJTHJjU2trdkZNMWI0b0E2VFJkaDVtUzRMeHB4RmlsdHpDb3BxMDNrMGI=","repeats":1},{"count":160,"lower_bound":"NGRsN1dKM2xKNG54MlE0cmpZUjVNUUFJak9pRElobm5FUDJ5","upper_bound":"NGdUZ0xwcHEyQmZacFU5dG9SY2ZrdA==","repeats":1},{"count":168,"lower_bound":"NGdqblBjQks1RldoSFFBa0FnU1J1OFFlNXY0dFdrV2t3WmNhMUdnd3hQZURl","upper_bound":"NHBuN0JGOEtJZ0NxRWJmVzI1ZGNpR1JDT3QwVFJrRTFYV2FnQW0=","repeats":1},{"count":176,"lower_bound":"NHNVMkY1Q2c5cHJsVnlPcGxhdzcwREYwaFdmNEFwaGRUaWJlZGo2WmFOU0pCbVZIWVdYYXd2NFFmNTdITA==","upper_bound":"NUlBUGh1cUk=","repeats":1},{"count":184,"lower_bound":"NU5v","upper_bound":"NWNMZXpUVVhVUGd3cVZHUTExb3IzT01BWk9lajVDdE5XbTlPVGdpbGQ=","repeats":1},{"count":192,"lower_bound":"NW1hRTZTTmJmRXR6enhkUkRnWFZ3UjQ=","upper_bound":"NXdUbGxlUTNRaWpxQmZXc1lCVVVrQU9HbzRnTmt4Qjg1VFlkeVNZcXdPYzI0bDVDMjhRZm8xSEZpa3YxN1FaWQ==","repeats":1},{"count":200,"lower_bound":"NXo5VWNrM0ZmellXNHpPV25TQUFTZDZDRjZiY1BwRFliN3BtNEhGRDVaeDlrTm5QZW1WWWszSnk=","upper_bound":"NlVVVWpWWllYbTlpU1ZDeQ==","repeats":1},{"count":208,"lower_bound":"NlkxcVVOeUYyak5obHk3RWhKV0g0ZUwzTVN2ZEtaVWljczA=","upper_bound":"NmpSblNUcW1kT2ZZOGhGS0hESVZFRlhBSWZK","repeats":1},{"count":216,"lower_bound":"NmtEeW1IT3kzQXdwdmdieEMwZ3E2Mkg4U3FNTk9MZDg=","upper_bound":"NnNxemdNc1g0bUhSRHlUSjZmV3p4TDNmWXBza0VMWkJDMVd5RjZKb2phUDVPMTdCVFpRMlhtN0lYM2NKaUVm","repeats":1},{"count":224,"lower_bound":"NnZLRjFEWnNEeG16cG1LaHBPU0pnSFpUQ3Azc1ZETWlyd0RXREJYUU1qenV0UkJIWFBwS2RnVA==","upper_bound":"NzJEVDVkdklFbzR1VGRwUk55RkppQk03R2xsb3RxNHY0WkhJQnJFNjZTRDZUT245Mg==","repeats":1},{"count":232,"lower_bound":"NzlK","upper_bound":"N0RHUUNvRnRjZHdSOGs3bExn","repeats":1},{"count":240,"lower_bound":"N0l2SXRRRU4zUEtkaTgzUmg5TXgzbWhvSUhuYmlJT3Ztd0s5ZU1nemkzTk0wbmtEdmRueXJTQmxaMA==","upper_bound":"N1hYTjUz","repeats":1},{"count":248,"lower_bound":"N1hvZ3QyZng3WmxMUFRLcVduYVBrZWlqUDJibUFpRUFzS3R0ZDhndlVR","upper_bound":"N2syTXRWTU9KdGs0eW0=","repeats":1},{"count":256,"lower_bound":"N2t0T3dyNEVlU1p4MmtCQmxZWTk0WXZTb292VnRoNHdxQTA3ZG51bFN4NTNOQ1d1UXVOZjhCQ2tBYzg=","upper_bound":"N3NpblJockhFdXJkUk9MVUlmUWx3ZmduNjdQV0g=","repeats":1},{"count":264,"lower_bound":"N3RtMDByRkhGN1ZrWnFCYkNwckF4NnBCSzg3Q0NsSG9hSDFLb2lMdlRYSg==","upper_bound":"ODdpb2V4UDE=","repeats":1},{"count":272,"lower_bound":"OEVieXBBNlRZS2g4U3lyanIyVXRvU1lvMjdWSEZmSmFtV1dsYW5LRjBKWVRvR3M=","upper_bound":"OEpXRkpoZW5Md1B4bFRtVHB0VXFueg==","repeats":1},{"count":280,"lower_bound":"OE9ZMHZCMFczNFJsZklQYWR0RkpIT0FRTW1HY2JTOENQRXhudDQzY0FBNFpUNXM=","upper_bound":"OGNtQ0MzZDZLd0tQTDVHTGlKdVNEZERVbzlP","repeats":1},{"count":288,"lower_bound":"OGUybjZ5V1VISHJlSzdyMThTOTBIWWRKb3RRdmVIVmxFWDVW","upper_bound":"OGpLQkxWVU80RmhEVzBvQm5GbHBKSzBIWG1XY2dTSVVad1VLUGlIMkl3QVdOZGF5NElrVmVV","repeats":1},{"count":296,"lower_bound":"OG5vU1FNV2RjZw==","upper_bound":"OTI4aWFEMDRNSjdiVU5aemJDUFBWRVJtMA==","repeats":1},{"count":304,"lower_bound":"OTR2RlFBekp3T0FXenVzOHJlOFFLUQ==","upper_bound":"OUZ6cTk0MFB3R2RVRG1MdQ==","repeats":1},{"count":312,"lower_bound":"OU9nbTF0MWRMYVA1anVMNDRHWmVtUXc0WElwYkVJYzI5MQ==","upper_bound":"OWhXdjE2TDhJZ0pFZnJhZVlqTlRHZmxwVDJHWUc3Yjc=","repeats":1},{"count":320,"lower_bound":"OW9JU3FLU2VwYk1la0YycEpCRTRnOUFlSmZwSXFvbnZTcUtyMlJza1M2b2cxVGF0Z05hRGRkTlFp","upper_bound":"QVdlTFRNQ0hENExSOGd1","repeats":1},{"count":328,"lower_bound":"QVlNMlQ5c0txSExJZFZiWnhrb2NUbjlVMHVGVnNXcm0=","upper_bound":"QWVnM0RDRUJhOGp1YlN1dUhtZ3RHbnpTNEx3bnd5aGo4bUNRRkVwekZPSTRxSFZZVFpJT1NYc2ZmYg==","repeats":1},{"count":336,"lower_bound":"QXF2ekkyU2dVOW5xbHR3RUdvYUR3YmhCZ0Vveml2VWViRUowMVc4a1BUd2pRZw==","upper_bound":"QjI0M29iaGxUUWJXakE0aG5q","repeats":1},{"count":344,"lower_bound":"QjJsazZEUUM=","upper_bound":"QkRNZGdIaGxwNVhBdUI5Wldqb3FBM0dEM3JDRGQ4SEE=","repeats":1},{"count":352,"lower_bound":"Qk1yOFk4MkRCeVFzeTQ2Sw==","upper_bound":"Qms=","repeats":1},{"count":360,"lower_bound":"QmtHeWIxVmhJSWNob0tJOUhMNVdyUXpWOTRJVA==","upper_bound":"QzFYZzZVMzU=","repeats":1},{"count":368,"lower_bound":"QzUydXFKbTQ3TDdrZGt2VnhFenU5TWZwTU1QcFNvWmpHTW1IWFNXcjVkWGN3Vw==","upper_bound":"Q0ZQTG80Z1loQ3A1YW9abVVEQnJ0NjNtdDZKc1J3T3hnUjNwMm5PeEdRVElwdA==","repeats":1},{"count":376,"lower_bound":"Q096bGNBbmJ4T3M4enN2RjJsSlYxSVlwRTRyZURCcGpiQTRhR2VUTWhEUHBETUk3SzBNelZNdnln","upper_bound":"Q1dWckxwRnNmY1lDS0xaVENGV1owcDg2cUpPRk1zemdnQW9PSw==","repeats":1},{"count":384,"lower_bound":"Q1pCRWNrUmRaS2lqTHFHc1lpOGwxN3pveUVRd1ZmdlE3dHJMZE5XMzhiVGdETGszcHlNdFhmSUxVcGtKNXI=","upper_bound":"Q2ZCeWptcExJSg==","repeats":1},{"count":392,"lower_bound":"Q24=","upper_bound":"Q3Y4TjJabEM2MXRZazJGTXc=","repeats":1},{"count":400,"lower_bound":"Q3dDSkpPNVNIb1hBTllWbklHQm1iV0pp","upper_bound":"RDNrQ0ZjcjZBTkhK","repeats":1},{"count":408,"lower_bound":"RDc4WFZSSjU4WlM4MU5RS2thZ0NIWFc0Ym1DVFFIa1NqeWVwNXVCS09W","upper_bound":"REliTkU3VWk1UzJLTmVVdk9FaW0zag==","repeats":1},{"count":416,"lower_bound":"REpaTTA4WThCTHJySERRRXFRV2xpQ0NBOE14eEllOEZ5RWxGd1hFcUlHVHdHV2dzbXBZTDdGNg==","upper_bound":"RFI1anRWQ0xrMGJRU3BLN25ZTnBmMVE=","repeats":1},{"count":424,"lower_bound":"RFNkZk14","upper_bound":"RGNMOUFPc3JtbFpsWjlmNzZrS2o2STJzWVd5Z21SUE9INDFnZQ==","repeats":1},{"count":432,"lower_bound":"RGxqUTNJeEVBUjM0NWI3OXluT0dZdVVrWVBwdlZOSXlwd1dsVzZxTkw3dUc=","upper_bound":"RTJwN1hvOTFYakw1NzI4MjBFeXNuNEk2Q0RvVEczOTBnVTZSTVlkc1g3WmJjTnFCNklpaTU2","repeats":1},{"count":440,"lower_bound":"RUNXeG9zWXB6","upper_bound":"RVBwVFdOa0pQWWdNajhEM093MUM=","repeats":1},{"count":448,"lower_bound":"RWpDaFhqN29mVFJSV0JudVFqaTFTeXBsVG5kZHlaVFh0MWg0T3I4MlQ=","upper_bound":"RXhVWE1PdU1RMnc2cWJvUGZmM2dMT1o3djdYRnd1d2JzdTBzYkJOM3N1b3pKV3gzRUFQ","repeats":1},{"count":456,"lower_bound":"Rg==","upper_bound":"RlRnUElLQlFoU2p6","repeats":1},{"count":464,"lower_bound":"RnB0VUhhVEFKZk5kcjVaeTFqMlVxMjhpbEJFYkM5NHhrYnVvYmdBRks5V1Qydm0=","upper_bound":"RzJmUTNNRnQ3MW45WG50NE9kZXMydm4wRFVlbnRnbkNFNzJZbWQ5eXkzYkZob1RqZElVZw==","repeats":1},{"count":472,"lower_bound":"RzQ3YnVtVVZ6c2J2TnVhU0NMaXF4YVllVHZYbkdJNXlLSktxZ0taMXN2","upper_bound":"R0M=","repeats":1},{"count":480,"lower_bound":"R0NZcFNmS01zUWxYTHNZajNlOFAwZDdZ","upper_bound":"R1EwT2xsbTFrSGFKNlN2Vlc=","repeats":1},{"count":488,"lower_bound":"R1NIN0xEZ0dXYk9pRXdXa1hhYkt2RTBhRW9pTkpSMEp0NWZHOXJJbExJRW5PMVJR","upper_bound":"R2F4N05qdGdrUXdEYkh0dU5vM1BLNTA4d2NJNE56M3V6Ng==","repeats":1},{"count":496,"lower_bound":"R2V0ZWJzMzdnUFlsbHBianE3NlhaT3R6djhodzA3YnJqc3lUeG5YcmRXd0EySkNxSkFYd1B4c0h1b2lNN0NV","upper_bound":"R3A0eWxublp3dEVpbjIyeW5OU3lNWngwVFlCdmo2blh3WnIwREg=","repeats":1},{"count":504,"lower_bound":"R3I2TnF5eVZqNG5sQmxNOE1mU0MwclRrWWRlcjNWWXBIZTVwZ1RraHpKZVZqOVJ0eDhGenFqZFZVSmVUdA==","upper_bound":"R3ppaE5GUHF1M3VGZU9mTVhwVzh4ZTV1b2Y2WXY3N05pRGxpTlEzRDE=","repeats":1},{"count":512,"lower_bound":"SDA2UXVmc3V6eFBINlo4SmJQSHpjSGNWVDVa","upper_bound":"SEZLSnBxMkNsazJWSzdRREtxYzZQSVV5M29rejlhNGhKbncyRnlIVkxET1NQc2tCckIyZ21YZmJaU2lsQzE=","repeats":1},{"count":520,"lower_bound":"SEgxeGRPSnlBamlOdFNnZkJyTkhpT1ZEdGo0NllJQmJkN2lX","upper_bound":"SFluM3FWaVA3RXFzUllWT0NTNFJVRzJUbEtCRmlnRGJCTUpVN0w=","repeats":1},{"count":528,"lower_bound":"SFl4UW56QnhzUU1QcTJ2d2dl","upper_bound":"SHV4ZjBtZkxIUno4cXZ5bnBqbW5WczRwYjlTaW5IV1BWOEtUb2hqa0pad3B6eXI1dA==","repeats":1},{"count":536,"lower_bound":"SHc=","upper_bound":"STBPOWVTcjREUW1DVmtKZkMwVzdsVQ==","repeats":1},{"count":544,"lower_bound":"STNYSWU0WjR5MHpMcWVGb3JhQW1RYkQ=","upper_bound":"SVFTanZPaUVpVWJSV2wxUmJB","repeats":1},{"count":552,"lower_bound":"SVpaRk90RUpQR2I0ZlJPT0hzTEo4dk9XVlp5ZA==","upper_bound":"SXFvSmRRMnV5b2lVWFNPZk81Ym9aZHpoMlJVenNNS2s=","repeats":1},{"count":560,"lower_bound":"SXg=","upper_bound":"SXpTaEV0RWJWeHFyb0hveWcwWGxXRTZtV2ZmeXJTWXE5","repeats":1},{"count":568,"lower_bound":"SjFqODUwTUdrRzNVRHo0dE1BMGszbm9MSHRDOWF4Rk9Fa2FMWEgzY3ZOTWJvM0swY2VsNm9nV0cx","upper_bound":"SkIxUFNxbTY=","repeats":1},{"count":576,"lower_bound":"SkJIbkxUdVE2WDVUSFQyTmlnTG1qdjVrSmU=","upper_bound":"SlFDOXFWWjJYRVNGenpKbzdlZWl4Y2pqbDdWQ3JuREFPY0szVjBVU1h3","repeats":1},{"count":584,"lower_bound":"SlRPZHNnNVpRU25zZQ==","upper_bound":"SmE=","repeats":1},{"count":592,"lower_bound":"SmRkRk9D","upper_bound":"SnJEc3hRVEVwbldVU2VXcE5qQXFIcDIyU25tdUw5c253QzZvQzVqanM1NFhydTBIYlZq","repeats":1},{"count":600,"lower_bound":"Sno5SQ==","upper_bound":"S0MxVW5Zd3ZLdw==","repeats":1},{"count":608,"lower_bound":"S0o5Y1BWTUxlbDlVT3hrd2pYT3VJZnpIeUgxQW5a","upper_bound":"S1daamtIU2w4SlpwRFZTR0pMaUJyQkROb2RzZGxPaDE5ODUwT1FVcElKSmZ3NnBuZDRTcmFLR3pKVG14","repeats":1},{"count":616,"lower_bound":"S1hodzVoQzVpbTczWjQ2Z3hiTXlRYWoydHhJSEtzaGx2N3F6ZDdGU0J4bDRJYmxobmU=","upper_bound":"S2NPOHd4SHVG","repeats":1},{"count":624,"lower_bound":"S2RObDJIa2VmVkNiaWhWWVlrUWVkSEh1Y0RwU1VvNEFVeWcyQlRVTjc2S0paOUg0ZzZ3YW1nRGthQg==","upper_bound":"S3RTMElWOG1ZbVdyZ2J4c2lFQzk=","repeats":1},{"count":632,"lower_bound":"S3hDR0V1UmpINWMzRG91Tk00YTI=","upper_bound":"TDdkdjN5QjNSS3ZSeGlLd1ZkNHZIdUhQblBMMmJTcQ==","repeats":1},{"count":640,"lower_bound":"TEJqNGU5NnRWdm9JcTBEbGZFeWhiRFdzS1huV29hUjFCYVpseDRFT3ZaN0piZTBFUkxGZHlSMlQ1WFY=","upper_bound":"TEoxc1htNTFCMnlSOWZtS3F4ZGQ0UlNGaTh5VXl0YThNcU54VVRqYjJiUGVEWEdaSUIzak4=","repeats":1},{"count":648,"lower_bound":"TFBNYWQ3ZGxxZUFYMWtoVEg1M2dNV1JvZXVSSUZleWtvR0x6UGdNVEt1cVU=","upper_bound":"TFR6QlY3WUVDenZWdWtXVXlOdzAzMFFTdE9yZ09lV09pSDhKTg==","repeats":1},{"count":656,"lower_bound":"TGFtWFdhc2dOajBmSjNNcnBxSHBOTXVJeXlJZHNUTXltWjU=","upper_bound":"THYxd1lGc2pia0pncmtnNnVkQ2d1SURiZ1YyMGlFOHdyQUUxQ3g=","repeats":1},{"count":664,"lower_bound":"TQ==","upper_bound":"TTJXS240YVZaMkVDSzZBWVA5VlV4dHpHek0=","repeats":1},{"count":672,"lower_bound":"TTJnSnlVeE9HWVJCeG8wckdIZXFEYjE=","upper_bound":"TUd6VHpUZXNMNXJxdlFGbHBLc05CdEpjamRGR2JuWTJvOGJKSmx1MA==","repeats":1},{"count":680,"lower_bound":"TUt2dnFaQw==","upper_bound":"TVMzU0c4dmM0c0hBMjNJQWd6M05MeXYyTFdrN1pXUEhVeW9GZmJkdDk4ajI1cDNt","repeats":1},{"count":688,"lower_bound":"TVVNVDdydTZYdzFIcEdkTkFCMGZEdXlRMk1xZFVsd0k2ZWQ4VDdUcFZHSmRoT0NsYU9xSW1kSTU2ZmE1bw==","upper_bound":"TXFDbXNuT2JrVnFaczRtb05ZZnRTNEZvZkNOSHNZemo1RGY0dVE4R0pxNzJDRXhpMVhmMTU3ZUxhamYw","repeats":1},{"count":696,"lower_bound":"TXJEV21sbFhXaExRRGJMeUhVb0plbDlmUlBVdzR1VDNxSVpVcEhRQg==","upper_bound":"TkxtaHZBVGFGTg==","repeats":1},{"count":704,"lower_bound":"Tk1kc0lkMEpGaEU3b1JpZQ==","upper_bound":"TldHWXc4RFRtY3pYcWo=","repeats":1},{"count":712,"lower_bound":"TmF1ajFCUDVZTUNVaQ==","upper_bound":"TmcxYmtTY3lOM1F0VmNyd3QyVmVUVVNCQzFPNTFOTWZZNHR1S2g=","repeats":1},{"count":720,"lower_bound":"Tmk=","upper_bound":"TmpRMDlUc25QU3JFTmkweUR6VTJuWTAxQW10Zm8=","repeats":1},{"count":728,"lower_bound":"Tm9SN1BYR1RGNU9HbGhaRHZOZzFMSUtaS3lVTDM0TUc4M2FTMmN4","upper_bound":"TndIQldoNW8zeWtucWdYZ3lhckhlOGdBNE83OUhUYnRYYTBOZmNoZUdkQ0w1d0k3Y0NTdXJudlBOa0E=","repeats":1},{"count":736,"lower_bound":"Tnh3M2s0Y0tsSUFvRkZO","upper_bound":"TzlUaHVhM1BOb2I3NnN4d25mbUluUDRpMDFmNExlU3BkUmZqTlRnR2JWdXhwbEJJVw==","repeats":1},{"count":744,"lower_bound":"T0E3eUhGUlpIQ3hqb1QwakZTYWpvT3d2dWdjQnhxVndnTTVObzlkZEFZWGVHUFVYTnp6Y3RYM1NMbGZvMg==","upper_bound":"T0pFbkhRNTZyZzdNV3c1SnlzRThPdzNyUHc1ejl2TFlyTUxJNjc=","repeats":1},{"count":752,"lower_bound":"T01JV1ZOdkZ0MHdXUlB2dERDN1lmbEZCZ21qdHlzUzhYUTdDQnNiNzJqWHRGOTRRV0xjdm5vcE95","upper_bound":"T1JLbm1lUGltQkVla0lBTVdvSmRQbk5sQkplOTB2MnE3S1kzOWFWYjZGZDQ=","repeats":1},{"count":760,"lower_bound":"T1JkenUwNlN4cHQ0S0dLOVQw","upper_bound":"T2Jsa05XZ0hkWXJ5eGEzbDZ1Z0l6dmk5THk2NUVWTElvYUZP","repeats":1},{"count":768,"lower_bound":"T2s4VTNIa0dubzYzQktjTk5nOW5LVjUydk9oYg==","upper_bound":"T29lS3JzcUtsaHM0ZHhCakRWYWFoRzAwb1NOYjRJR3lBOERORU5FSnlNUTNOZDR4b2hzQU1GV3ZvOQ==","repeats":1},{"count":776,"lower_bound":"T290akpMbXNIQVpTQk55eG9zU0NHaUZhRzRRWHljRWtlM3BHS1FQckVsRUxpcVNzcTlTVXN4M2dNc3Y0dA==","upper_bound":"UA==","repeats":1},{"count":784,"lower_bound":"UDAwRTdKQUNOcVpPZG9RNHc2V2tvUmJjaFR4WWVQaHJNVU1jMndNOGlzbGZ1ekRSVnQyOWZlcA==","upper_bound":"UDZuNkZjOWdnb2d4VA==","repeats":1},{"count":792,"lower_bound":"UDdQOVFzdEYzdzB0SWFlMHhZOFBpS1B5MW4yOFBuTEcza1Bi","upper_bound":"UEh2V2VVMnRIMmM5QzB4RFNibkJGOGRGc2pxYTJsd1d2WEMwb3pBWlMy","repeats":1},{"count":800,"lower_bound":"UE1Ed3Q5dEFQNElHNk1mQ05JdVFNUUZwQkRBVEZtMk1TWnJBQ1NPR1RkNnU1RGZ0QjY=","upper_bound":"UGJvanVqaTlNVTZLUmdUMjFIeTZLdGltc3RaSXUxQ2JSTldaU3lQZTc5Wk16NFNYakwzWEo=","repeats":1},{"count":808,"lower_bound":"UGdJNkFiZw==","upper_bound":"UTFydmRnQ3ZjUnJZRFdmd2w4RjVZa2dpU09TcDNo","repeats":1},{"count":816,"lower_bound":"UTU5Uk1IS0tRYVBmdmhIek1rS01jMEhP","upper_bound":"UUJ5YnlKOWN2dGEwMWtodWxjdUNMT0ZuQlY1Z3VsdlN4azBNZ3o=","repeats":1},{"count":824,"lower_bound":"UUYwNzc2dVpZVmV6OXlRYzAyYjNTZW43bHJLblp1SUZLTGI3TkIwVmx0dURJSDNXUm1OeWpHcEIzNUNS","upper_bound":"UUt4SWE3cEVLRGRpejli","repeats":1},{"count":832,"lower_bound":"UUxlSVY2T3prbDZ0eEIzM3BETWhSS1F5RkZ0Q1VMWGVKRmVyUE1kWkRPMW1WYk1MbGNkN1o3Mg==","upper_bound":"UWJ3S1Nra1pXVWhCMTUyNk9kUG53OQ==","repeats":1},{"count":840,"lower_bound":"UWNnZFBVM2lOZmlLTEtQWmdRVGh6U2pSOXViZXpSbHk3ZVg=","upper_bound":"UjIyYThzOU5ENUpMN0M5c1NmSXNSRw==","repeats":1},{"count":848,"lower_bound":"UjM2RWxnaU5kR3dQUkZaeTQ2UU52SnhkY2o4WnVsVlFNSW12WmphOGNHYjBaNldaNw==","upper_bound":"UjVucmZYRmhVenJaeHBMQmU0aTZ5Ym5wOXQ1aEtYcUVJRllGZlRFaGRPSnZTUHhsNmZPcHo1","repeats":1},{"count":856,"lower_bound":"UjdET0dscmFvUFpT","upper_bound":"UlFl","repeats":1},{"count":864,"lower_bound":"UlhPbWt2UQ==","upper_bound":"UmU4MUUydGc4TlQ=","repeats":1},{"count":872,"lower_bound":"Ums4S29hUjFaRFlDQnJpZmllbmtONVB1YkU=","upper_bound":"UndGV0hySFZWT2NTSHE=","repeats":1},{"count":880,"lower_bound":"U0psVDFFTk4=","upper_bound":"U1RYWmRUdHVwQm9RNA==","repeats":1},{"count":888,"lower_bound":"U1ViUHh0TUlX","upper_bound":"U2VEa09ZRGlUNDZTOTFmY0ZacERvbmJZTWExckpPbm5FaDEyalVLeGZNQjhFbE0wOE0zcmFlOGtiMVVa","repeats":1},{"count":896,"lower_bound":"U2VvRnRvVUVmNXRjWFBS","upper_bound":"U2pybmVFc1ZCM3VzZW5JbzlJR2R2Y2dkd29Ud1FHTE9TN2JJbVNOdUJPYndtdmZ1","repeats":1},{"count":904,"lower_bound":"U29oazB5bHhzZDNLWTE3bk1WSkswYVpmZlFxR1VRb1FjNjFtMFFRZXl6TlE5eHlC","upper_bound":"VDMzTEJ0elNwVDkwRFFmWlN6UEpFSjlXSUZKRGl0M3VKRXhkejd2WWtvRGZoV1BBRm5WQ3BoeQ==","repeats":1},{"count":912,"lower_bound":"VDNBNkRxUG5DSm53MmNYSURmS3RkcHVFdllOdGFOS3lhcktnQU5JR096WGcxbDI2M0pLMFM=","upper_bound":"VDc0OW1oZGF3UFQ2Ug==","repeats":1},{"count":920,"lower_bound":"VEJKZTQydTVvWkZmNEo0S2JkTjBI","upper_bound":"VFViNHpQMXBJZzBoY2dTZ3VLQ09VNUI1SGU4N1o2dlVhaDAya0NlYQ==","repeats":1},{"count":928,"lower_bound":"VGFWMm13UjJFSkRPWEs1Z0Y0TnZXVkhSUlRtSjZvRUE3RGMxVGQ5MjlJNXhB","upper_bound":"VGRnWDlJcXdHTms=","repeats":1},{"count":936,"lower_bound":"VHFtMzNTcTBiV0F1TFZSRzVLQm0ydnRBSnMwSHk0Zk1aNTBaRHN3eA==","upper_bound":"VTdaZUtwbXFXZEdYQTZhTE8yZWZtWFdreHBEVEI=","repeats":1},{"count":944,"lower_bound":"VThjSGJhMTFDbmoxWnZlazBQMFI0cHRXQUdseGlPcHo1N1ZiVjEyTXdjRFh6RA==","upper_bound":"VU1lcFhvMEVHOUVoVHJBODhxV1BzU3pET0xwcHZ2bTkweUZ1MG9RZEFjcw==","repeats":1},{"count":952,"lower_bound":"VU1xRTRkZ0VYUXlNNUlhVHZHcmZZTWJYeWZzVEpFMlRsczF3aFRtNg==","upper_bound":"VVdUdlRpdzFyeks=","repeats":1},{"count":960,"lower_bound":"VVpXUHhDUg==","upper_bound":"VWNpVk04VQ==","repeats":1},{"count":968,"lower_bound":"VWpzdVNXeFIwWW8=","upper_bound":"VXdsNkFFcGtQQ0FHZDVLSFFuMXYxWk4wd0FvSFp5Z0F3NXYwQQ==","repeats":1},{"count":976,"lower_bound":"VXh0OHF2Tml3ZUJHNTVWd1o3cnpzY0dpQTU5TWFSU0pwVWVXWHVZRDQ4NQ==","upper_bound":"VjR2Zm5sSjdiN0ZWanhrc2VFZmEwd2RzOFY3NnU2bWZhcmpraDA3dG00WG80eTlKWnQ0ZW9EbVNmaQ==","repeats":1},{"count":984,"lower_bound":"VjlvVEt2VkFidzUzR24wMnIwemp0dEVUYmtaaWwyNw==","upper_bound":"VkhkNDAzSW5JS0RYNGc0NFY2THpseXJXNGQzeW04d0E1V3NPRXJZNUtHRlU5YWk=","repeats":1},{"count":992,"lower_bound":"VkhwblBQZ200czJ6WkVpNXNheEN5aEtpcVpxeXNhZWdCVQ==","upper_bound":"VkxwVm43dDFBWlpMZnQyTFFPR0FGU1VrRWUyZGVBMHJQcU1IRGlFV2NLTjBGcmUwSUJvdXhRYVJBZU04Tlc=","repeats":1},{"count":1000,"lower_bound":"Vk50cXRDMg==","upper_bound":"VmJtdzJKcEU4WVpTVGlrV3hUWVhybTVs","repeats":1},{"count":1008,"lower_bound":"VmRjRHVBcFFEMXQxajltSzhBMDc=","upper_bound":"VnJVY2h6Tk1mOXJEZWx1VXhWZE9Hdjc3cHd5RjFZbVBxRmNOYVlOSmxETGpid2E0V2tic2E2QkV3Mng5Sg==","repeats":1},{"count":1016,"lower_bound":"VnJoOG1XU28zVjdsWHk=","upper_bound":"VzBJTHRXQThzZFJJMm5FMGhCU0JNUEJuTlE4QWxNdDI0M0xWWmg0cw==","repeats":1},{"count":1024,"lower_bound":"VzQzem1FejBMc2VwWW9RRHV5M3k0","upper_bound":"V0gxSnpZY3lYaHZrWmtab1VjS2lic3pPRGFZUGJKVkQxRHZaMm1ZdUN0NXhFZ25uRnY1QjRsMTFZWUg=","repeats":1},{"count":1032,"lower_bound":"V0hBYkhZSXZrdXh0ZzdrcGFmbzJBbzA4QTlrVEtUQVloSEp6d3lOa3VteWRUNVoxSFNBTmpjalhXV1Aw","upper_bound":"V1R6eklKR3JJ","repeats":1},{"count":1040,"lower_bound":"V2RNWHNzMzhtZnBvZlNpR1JuY2JBdndVazNCRklmdnl6","upper_bound":"V21BQUdzVmJR","repeats":1},{"count":1048,"lower_bound":"V3I=","upper_bound":"WDhOem5ma3JKSU5YRlZGbkdaOTlvWVBIMGltVGd5NEVkUko4WTUwbXpwSE9zbnd5dnZleFdBVGJq","repeats":1},{"count":1056,"lower_bound":"WEZHYkNxc2RSVGJCOFY2RGhwaVA1","upper_bound":"WEtvZ0Z6eW1ocG5UWG53Q0RJNGJUdVM2U1FxNnVYMVJ2ZkdKdGtYeG5WS3ZPRjNCZERENkw1MWFu","repeats":1},{"count":1064,"lower_bound":"WE1iTDE5WA==","upper_bound":"WFBOSlc1Mks4eTdoYkxhVGpkMHc0R2ZsMmZ6a2Z0SVlzeXA0Mk9sMEZGc0ZWVQ==","repeats":1},{"count":1072,"lower_bound":"WFVwa0VzaElxbTVheE9B","upper_bound":"WGhnVnpoVUNjMGZqcUM1cTNsNktQSDV2SHhVOTZhM1lkV3JBTFI1d29Gd1Voam1HYzJZV2Z3bTE2WkNpZw==","repeats":1},{"count":1080,"lower_bound":"WGpSdzc0WE5nb0FVNHBXZURqTlRndHp6cUJ6Sw==","upper_bound":"WG41NjdZNEt1NXN1SFF0a1RhQk5NVmprYlpMTGNKTDNmMWpq","repeats":1},{"count":1088,"lower_bound":"WG5HeUxLYmJvckhhZzJwRQ==","upper_bound":"WHNTbU01cUUxdlJPajVrSHFmT3VrdjdkMURPa3NyWmNBZU5od2QwSVp6QVBTaHB3STQ=","repeats":1},{"count":1096,"lower_bound":"WHRZZ2cyYVp5T2ZNVWRSQ3ZNM3A2NEdFVmt2ZlV6aEpQUE16b0Y=","upper_bound":"WTY4NFZBYjQ2Qm8yRlY4T3NCclJxMXJaVlQ2djNMWE10eWlRUg==","repeats":1},{"count":1104,"lower_bound":"WUNneXNHdVJJcXRlZGdMem1FdU9oMmpEV0hrMmJZQzVkOFE2Tm8=","upper_bound":"WVU4T0NqWmR5MmkyWVRFN0xtUHc0UFpQTGpzMWlOY1NPN0lLWDkwT0RI","repeats":1},{"count":1112,"lower_bound":"WWVLNmNBcndUTg==","upper_bound":"WXFWUjdOSTRt","repeats":1},{"count":1120,"lower_bound":"WXUwU2g1OXE=","upper_bound":"WjJJSkNKa21qRFpUQlRSSzdTS09nejJ3RjJOb1RlNlprbElLV3JYSFM1U0J5dA==","repeats":1},{"count":1128,"lower_bound":"WjM2Yzc0NnZJVWx1aTN6UDBIbHY0Wld2ZUU=","upper_bound":"WklXMmtwa2Q0","repeats":1},{"count":1136,"lower_bound":"WkppN3ZCNklNVUZpVFZkdUpaaFJhYzAwV2hxcmhO","upper_bound":"WmRzMzRHelhFY1BiNGluRmR5aFlXdWtiUUlCOFRyTHpSc3dGYVo=","repeats":1},{"count":1144,"lower_bound":"WmdMTVU0RGxOV2xTVzJsMUdsMDR4ZUw5cmRzUDdyRWtHaDdTMlY3","upper_bound":"WnFUVHB6bzU5QWFOVWZGVkh3SVptNm8zV2k2eGE2eHdqNU51ODZMZXNPWUp0aWs4MQ==","repeats":1},{"count":1152,"lower_bound":"WnV5OHZQSDNQOERPTElKb2laWTdVMDN6NVhtWjZXZw==","upper_bound":"YUF1SnM4RVg=","repeats":1},{"count":1160,"lower_bound":"YUxvT2dBdDA2TTdxenFKaXUzSWlPbm52MkU1bU41Z2VEcm5KRWNKYll4Tno5eU4=","upper_bound":"YVlJUzExTkJHd3VWbHVKTEdzdG9DVVlTMHRlVjBUREwzTmFDZHFmZVdzWkNWRWF0aWxISFU5Rm1CWmE0dw==","repeats":1},{"count":1168,"lower_bound":"YWRyR1dmVXc0Q0hOZGw4MTk1bXNlcEJt","upper_bound":"YW9wcTNDTTFqNWtqUUk3ZG15aVE2elZXSEk0QUtnRjU3RHU1RTNBaGw3Wm9rb25DeDdmVFVkSTQ=","repeats":1},{"count":1176,"lower_bound":"YXhoVWsxQ0JaZEJvNVlwOQ==","upper_bound":"Yk9QQ0ZIY1o=","repeats":1},{"count":1184,"lower_bound":"YlB1QnlBdGpFV0ZydVFoZVJpZUJpMWJZa0JBR29IcA==","upper_bound":"YlNNbFVVcTdRVXA3ZUZkSmE2NURqZTJwNkY0cmx3UVlqWTVQ","repeats":1},{"count":1192,"lower_bound":"YldHeA==","upper_bound":"YnI1QVNVcW42UmNSbHdYWk5zdE95ZzJTNGF0WGVxS1N0T014OXVKVWtSYlpGR2RWN25pMzhCbjdSclA=","repeats":1},{"count":1200,"lower_bound":"YnQ=","upper_bound":"Y0dveVJTTVY=","repeats":1},{"count":1208,"lower_bound":"Y0k2VnVTRFhReDJFRmdvV2xobmpxSzdwNWVwcEhOZmxFOXRJRjkwOG9qR2s=","upper_bound":"Y09xZjdEYkxTbG1ZQjNLeVZMVjhzeHhGNUIxeFU0dHFjZUlJ","repeats":1},{"count":1216,"lower_bound":"Y1RWdUpNRDJtR1FaaE8yOGozY0tOTUFjbUloRnJQa0c=","upper_bound":"Y1hmdVRJOHNtNmhFanJlaVVRYm9GQnA4UktzMFZ0dzlyNlkxdkJjQUxZTnhI","repeats":1},{"count":1224,"lower_bound":"Y1lRS2V6ZkFaTW1Fb09BbjhuVHFJY1FvblRLeEhHT0ZidndHd2p0TldUSVlmaW0=","upper_bound":"Y2tRZ3NnUWZHa01SblJqSFVVUkFUS202WW9VaVIxcjNmMHI=","repeats":1},{"count":1232,"lower_bound":"Y3owWmw4","upper_bound":"ZDVPVG0zWk9aOE5Qa3VzTWhJNTNMdjN6dWdtZ1NtV0hnOXJtZFdxU0pObHpmVlBDamtEZUpm","repeats":1},{"count":1240,"lower_bound":"ZEM3NTJpbjJFbUpYNUxOOFYwUzVvNG9rQUVvNg==","upper_bound":"ZFBiUjl6VGtKc28wdFpLMXNaTVh4UkM=","repeats":1},{"count":1248,"lower_bound":"ZFFHajVZQWRCczlQamlHNlNQUkVCV050V1NUUW5xVHlFSFZk","upper_bound":"ZFZzR2V4UGtXNlhZZldyNzVmUHlNQnU3UFFJN1kwN0Vab0w1ZWxHRlZEQQ==","repeats":1},{"count":1256,"lower_bound":"ZFdjN3dUdjExMk8wS0czc1IwS3JsVFo5WQ==","upper_bound":"ZGNBWWoyODFrQmVZekM3U3dvdXp2","repeats":1},{"count":1264,"lower_bound":"ZG1pOEFVbGUxZklpN2k2ZG83Z3dTdmR4OURSbFVXaEd2UmkxSkJINmQ=","upper_bound":"ZHNkNzdIbGpubGVjWERTM1FkTFVlUE43RXJLNUZ0RW5CQlVNNm5JTXlMTUh6cTA1ZVR2eTlhNDdKYU13TGM=","repeats":1},{"count":1272,"lower_bound":"ZQ==","upper_bound":"ZURGYUtEcjh1QzQ3aUY5YzdZcEEzUkloNXlCT21ZQk1kM2JYTDVDS2RtbHJsUWtkTTdOWkc0NDBaaG5V","repeats":1},{"count":1280,"lower_bound":"ZUhwNHVxZjVQdzkwQXBMZHdWMVFtWklQaDBtUTQ3b2MyMmhVVlVpN0NIeDBzNkp2VlZzWThDVnZmdUhvOFlIeQ==","upper_bound":"ZUxuU3lZRzRTU2R3UHoxQWRKWWppd21HTzZLUW5VRDNoQ1d3VG5seFFuellyVVliQWE5eDF2bTUxRFJM","repeats":1},{"count":1288,"lower_bound":"ZVBqamNyejhSTFJ0R2tpV2d0b0NwVllheTFZbktoV0d3S24xZWxZdWFhbWk5NXVnallreWFGcGY=","upper_bound":"ZWNKRmp3UE1tZWlMM3dEM3dYSXpQSTNxWjNwN0ZWdg==","repeats":1},{"count":1296,"lower_bound":"ZWRTcFhNRTVKYnY5Tm9LeVNBUkRrV2M0ZQ==","upper_bound":"ZXNnWjdTRnlSUDJNOHZTRHRMRTd5M1Z6RUNUcFdzeVh0UEZYSTk1azY=","repeats":1},{"count":1304,"lower_bound":"Zg==","upper_bound":"ZklRTkZnZXI0NmczaU1BMTdTR0VhNlVhcA==","repeats":1},{"count":1312,"lower_bound":"Zkto","upper_bound":"ZlgxVnNQWkpLOHVXcjhic0ZtVmpybjZrajJ6V2w4NlZUb3Q=","repeats":1},{"count":1320,"lower_bound":"ZlpWTWk=","upper_bound":"ZnZybWJ0VjU=","repeats":1},{"count":1328,"lower_bound":"Znc=","upper_bound":"Z0E3a0lWWG1GOEt2YVEzRU1NUzRUejd4","repeats":1},{"count":1336,"lower_bound":"Z0NrOUpES01CcHRxbGFYaFE5SXZ0UmJ0","upper_bound":"Z0g2eHUxcjdwQkxD","repeats":1},{"count":1344,"lower_bound":"Z2N6eFN3T0tLS0xxNkRoVzdnSnhmWUFjMDFsUzRMdmZNMFUxYUNKd3NlaFhzdkoxSnlzeFVZ","upper_bound":"Z3BuZ0EzQUdUUEc4dlVQTXMyZ1l6Vnc=","repeats":1},{"count":1352,"lower_bound":"Z3Q5Ykd2eVBwNlJzM1h3WFlxMkhqRHZQWQ==","upper_bound":"Z3dSM241YWtqNndQMk1PMVJ1WGpsZzRNR0pvTGxCOWFsMnRPUXpGUHUxMElLdWdUNVlaQWJYU1kyd1c=","repeats":1},{"count":1360,"lower_bound":"Z3owS2ZTdlViT2ZwbmtuYTFnYjJXTW00eUg5WEhsRTl6ZW9zNWJDTnMySQ==","upper_bound":"aDhhMmFIV3g=","repeats":1},{"count":1368,"lower_bound":"aDlXeFlZWXFZbGhybHRKMGFt","upper_bound":"aFZ3dldOZ0o2ZVdpVmp3elY2RVRRbnliQTRkY1pvVzE0QjN1","repeats":1},{"count":1376,"lower_bound":"aFh4MHBEa2ZCNkw2UWEzS1hPRnBiNHE4OFhpVjVZQzV4","upper_bound":"aGdIa2pjb0F4QTRGbG1m","repeats":1},{"count":1384,"lower_bound":"aGowcVppd2Z4QllVaXRwOWZM","upper_bound":"aHRtbVQ=","repeats":1},{"count":1392,"lower_bound":"aHVGQ1ZSNzkxaEc4MEEzSFJhNk1DRkJ0QWNIRHVtU1ZreDhPSENQbVlYMg==","upper_bound":"aHZoaGI=","repeats":1},{"count":1400,"lower_bound":"aHZ5UGoyOHFYRnk5WGVENXphWEw5anY3WEZ5clk1M0dCeEhqVkh1QUx5Z0lZZ3FHTjlHOEJ1SzFX","upper_bound":"aTdia1ZpM2JDeHlTa1lCeVdHdUlXUVdHNFREVHFtZ0xORlZseTNRRFRZVjluSDA5WFUydQ==","repeats":1},{"count":1408,"lower_bound":"aUhseWJxcDdNZVBPSENnWVNyNkc3MUVsWDdWMjVIQkNXMENZc0I=","upper_bound":"aU1JdHBqYVhVN0xCaGFCWU5KWnU4SQ==","repeats":1},{"count":1416,"lower_bound":"aU50WlVadDhSU2VqVE05QkF0WVJUcmdJeFM0cDZsMEw=","upper_bound":"aWNzU0ExbUNwMzhK","repeats":1},{"count":1424,"lower_bound":"aWN4cmg3M09hZ1FwRnZzTGluVHI0TlViZzJHTW9nQU1DUzh1","upper_bound":"aW9aY2VSTzdYU3RwekdxejducjZ3d2xsV3RzUm9uRERialBQemNK","repeats":1},{"count":1432,"lower_bound":"aXNJd3Z4cElu","upper_bound":"ajU1UE9DSml6RWplcjBrUXAyTWdFcVcwcVhyZ1BEenE2WDNQVlo0R0dnMTJrQjBwSUFiUHVXT1pEc3A=","repeats":1},{"count":1440,"lower_bound":"ajdPMDFHbmptZXNwbVk=","upper_bound":"ald6V1NpNzNHeHBldFlnSzRCUVQ4bkJrSXl2aDdRa04wWA==","repeats":1},{"count":1448,"lower_bound":"amQ1Q2JHbVlUNUh2Wg==","upper_bound":"amlveE9DQXhwSm5uWE5QMlJVZ3R0TTY=","repeats":1},{"count":1456,"lower_bound":"am9pM2NXUERXRkh6OFcyRWIyeDgyZGNyZjlXVXlsRDRFalVZYWpBSTBzeUtWSXVEWDVvU2hNdHVPaA==","upper_bound":"azBseWIyc0RHNWo1UGRqRmNQaW0xTzJwVjlZOEhs","repeats":1},{"count":1464,"lower_bound":"azJ3NkQzUThtUGZsbEI3VWdHS25ZWHJCYnRMNjdkV2Zseg==","upper_bound":"azZVZ1NsTmdJVlZ4Q0VLT2RXdmZEWEF4","repeats":1},{"count":1472,"lower_bound":"azc5bEM4WjV3","upper_bound":"a0hCUkpYRjdkaUtaU0RmSjlQMmNnS1hDczAyT2tCZU52V1ZyektDQTFhekNnOGN6ejU5UmpValFZMXc=","repeats":1},{"count":1480,"lower_bound":"a0pkS0hDbXZaMFNrZzRLclZQbDl5cGExd0tYN1NSbGJFRUExa25QRXdVSlI3M01pWEtWN3pyaA==","upper_bound":"a1UxSTRzelI4bDNqREdERXlVYm1sbWREQ1lJYkFuM0laVmF4SDFOMG1PU3NSS2xGSE50SFJMMzk0","repeats":1},{"count":1488,"lower_bound":"a1ZiREs0bkxSbGZpWnNkYUZZcUlidGcySjUzWUZsRg==","upper_bound":"a204WHc3cmNFMHBWUjd6MHpxRUEzbWJVV2VTU3Y0Wm9DNjNEZ2VJODYx","repeats":1},{"count":1496,"lower_bound":"a3NVSFE2SVZkZ0RoNnJvWWtXQjdTaEUzeVpud3h6QnJ1U3JDcmxHaFFlQ0E1OTZ0T2xoZlZqSGN2YzJjakw=","upper_bound":"bA==","repeats":5},{"count":1504,"lower_bound":"bDVHN09nc1NBaGU3a0hCN3htZmZoaDRLa3F4","upper_bound":"bEFQdUdOMVBaU1Z3UkY=","repeats":1},{"count":1512,"lower_bound":"bEI1VDBWZlp1dUxMckw2TmtBSWdaekp2NTBveU10SDhoN05SMFRuaFoxU2czYm42WXk=","upper_bound":"bElyV1BEQ2FrSXE1TVlQSjR5MkN0NXhmeUU0TEF1UnpDNHVuS0FMWFZSbTRicTdCM1FlNFFzSFoz","repeats":1},{"count":1520,"lower_bound":"bEpIYlNaSFlRSUZEWUpwWURxazVPRw==","upper_bound":"bFA2V0dpSWw1cWNQeXZNNzhVbTNGaUp3OUczZGtSc3d0T0dweUg5Qm9rSFpMVDJKTXBZY2UwVGs=","repeats":1},{"count":1528,"lower_bound":"bFNWMVlhN01TaXhTejNCbE85OTNud3k4UVFrQlEyWUJuUXV2NGpTYnY0dDF6WUxt","upper_bound":"bGZFYk9jaGNvQTlTUFNwTUNQMllhNER1d2c3UVFCdjNwRG50dkRCTjJPdDJ0Tg==","repeats":1},{"count":1536,"lower_bound":"bGt1N21TQUk5MnZpbEFFSjVOVVQyZktMcW9IZ2ZQMVd0YUNSVktwd2JYTm96cGFvZUlHV1h6cA==","upper_bound":"bTVwTVlyNExpVzR6OG9YNw==","repeats":1},{"count":1544,"lower_bound":"bUdONU9QeGRzVVQyNUNoOGRxdFVteVkzYVJSY0JPQk9x","upper_bound":"bVNXaUt1dUZYb1FQRERGWGR1ZzJBVW1ITzFFS053Unp0eDc1bGdtNU4=","repeats":1},{"count":1552,"lower_bound":"bVlIMFo1dWFwZmRHcjZwU3JFQ0lJa1dreG9iQU1FSDgyRkdoRQ==","upper_bound":"bWt1VUxEWTNoYXE5S05wbjh1MmFVQTNLMDlxQ2RkQUo=","repeats":1},{"count":1560,"lower_bound":"bWxsTFY3NEkwYVFaeFI3VWRLRnQ2ME1hRDNNWUVSbXoyTnRkTW5vcnd0TVFNamhOaE5RM0dl","upper_bound":"bXBMZ09pUXFManFvdzZGcVh1T0ZTOXhqNkp2S0JTdlNTQkJDc1lSbnR1Nlk5RkRQd2tTVzVDUQ==","repeats":1},{"count":1568,"lower_bound":"bXdqalAzVWtTY1d5WG9zNExuUTBvSVJQTmJZTTk2ODE4N2hTQ2x0VTBwZHNVMFlHcGg3UA==","upper_bound":"bjN4d2NwWmtyM21jTEppTUYzcUpxdk9yWA==","repeats":1},{"count":1576,"lower_bound":"bjRaak0weXhi","upper_bound":"bkFLb1RNbGc3QVdSY0lIZlMwSkJIOTlMcjFGUmhFbA==","repeats":1},{"count":1584,"lower_bound":"bkFWaGZJeGhyNDdQOEljRDh2aGNxbU1oN01wdEgzZ3hXZnF6MW9UV1paVWZtUUhwZUE=","upper_bound":"bldkdjNaS2xJMWxhdTNNamtYMEdrV2NrdFA5MnpyMnQ1eHZaWEsweGExOVVVTHg=","repeats":1},{"count":1592,"lower_bound":"bmRkSw==","upper_bound":"bnB0dG9KNFN2UTE3R0NpOXgzTmtpY0dTNTFHbENHT05HaEI=","repeats":1},{"count":1600,"lower_bound":"bzBFTFJSMEV5SGd0d2RpNjU5TEhDTm82TTlUV080YkFmZzRTeXcxbg==","upper_bound":"b0NweVZFaFVDS3ZrWXBDSm1wMnJIS2ZEeksw","repeats":1},{"count":1608,"lower_bound":"b0RwRXYxaW5ZbGpKVllaeEgxMW5OcDRkdWg4Y053RmhVRnpBR3VGNw==","upper_bound":"b0xJR0RMTFR5WFg2QmVtaWVaMWlmSmNIWFBnc1FsTzVJUExIVTlCbnNEd0swRUFHNGJjUGRwYw==","repeats":1},{"count":1616,"lower_bound":"b005enNSako2Vw==","upper_bound":"b1dQUGVHRGV2SXdTdnM=","repeats":1},{"count":1624,"lower_bound":"b1pxRlg3VlJPclhlVmYwQmhrMVRrZzNQSjROR1ZDcnVTV3BUT2UxMlJiWFdNTnVKU1oyQXN3bUE=","upper_bound":"b2tKUndpWEZ3ZmpqSW4wVmx4YnliZkljdTc5cjN3aTU1ZUM5aDdzQjJ4c2dwWExJbTY=","repeats":1},{"count":1632,"lower_bound":"b29SUlRHSTdHSmVGSFdpcW1URjRocGVa","upper_bound":"cDNtZDdnSUZnb3kyNXV3RUxZZmpPWGdaZjRwY2FyQkNjakZzYk1L","repeats":1},{"count":1640,"lower_bound":"cDhtbmUwOXZMY2ltbUphbVozM3I5RnVlWWgza0Z5SQ==","upper_bound":"cFdVU3F0UG0=","repeats":1},{"count":1648,"lower_bound":"cFpyNkd5d0ZJQ3NmYg==","upper_bound":"cHJObndsc1BoRFUz","repeats":1},{"count":1656,"lower_bound":"cHJaVlVtN1MyQU1EV0xYQjl5NXZ0THZDU3h3YU1JS3ZsVE9VNjRNWGxnVlJsMHkyVks=","upper_bound":"cTJzeFc5ZGVONFRPdzFLV0duMXYySkd0UGdEcDJydHRhQ0NlUjgxOEZhbjNCWnQzU1N1RG9oaTVNanZO","repeats":1},{"count":1664,"lower_bound":"cTRNNEpOUnFuNnNXTUExeTc1VDlDZUZ5RVZBMVJ3VGJveFBoVXV5ZmFIY2NR","upper_bound":"cUJPS0FYSHEzYzNqdTdRN2Q=","repeats":1},{"count":1672,"lower_bound":"cUNjMXBGUHZhb2VFNjNycWxwUmp1bXpVc2E=","upper_bound":"cUgydlNBMWFEQWpwQ1ByWm9oZ1NMMHJZaWlzclIzUWROSVVvbVRsNjViOUhIQUxKV0dRSmpsZHdrZHI=","repeats":1},{"count":1680,"lower_bound":"cUhjNFBxQTBibE51UDZmM3lWR0Z1M2I1aUk0M0FlU3JGc1RO","upper_bound":"cVhoU1cwMDNYc0s2bTBBeVMwRThiZENkQmRZbGFTbTIyWHFtc1U=","repeats":1},{"count":1688,"lower_bound":"cWNLTUFsYjBwSUk4UlRwUmFvbHlmRA==","upper_bound":"cXVGd0tjT2V4RWZlb3FQQ3RZbG04NUxVZDFMVzIwanVxUFJ2MDRjU2F6Wm5rS2doUVNzRFc4ZVA=","repeats":1},{"count":1696,"lower_bound":"cXdmZUNlWkRoYXFDMFloWXVkS1VsTmZSYWNWRURqNVR6","upper_bound":"cjhYVWhxR2RmaHhBbTRVOWVFdUNwM3hrQjhmaEpKSzVscTk=","repeats":1},{"count":1704,"lower_bound":"ckZBWjNFMk92T2VOWjNlYmJzTjFxdThoZDloR0RyNE9RR01GWldBbUNwZ3ZMUHhBcFkyQXFyaEU=","upper_bound":"cmRId3U0Qkx5eEN4cEtrejZ5M2lFb0JKSnJEb29CV0Z3VGMweUdOMFlidW12em96TjBTeUxrSERYcGp3bQ==","repeats":1},{"count":1712,"lower_bound":"cmkzbnhIbTVFZjZQTnB0RjMxZ250dmwxVzNtVHhkalRhSzVWVGpzYVBNcFc1VQ==","upper_bound":"cm5hQXR5MXQ=","repeats":1},{"count":1720,"lower_bound":"cm9JZDdLRnFXZ0VyMDFPNjRKbjl0a2ZjOWgzb256Wk0=","upper_bound":"czVaQnV3eUR3ZnNkQ2I4MHppUFN3TVpybU92S0FaYmw0TzJ5c0pR","repeats":1},{"count":1728,"lower_bound":"czdxTVJTNVBRUTlBdTdjdFlrSzBoaGlrZDFNV25IY3pKd1NzekFLZE1sTUxBTE84eDNxanVBYg==","upper_bound":"c0syVkFmSlFTa0pEMDZUc2FxV2d3N2I1NU9ubHJ6bjVMVEZnQ2hpbjVza0pF","repeats":1},{"count":1736,"lower_bound":"c01mZEVpMXU5","upper_bound":"c1Z3cXR4WlBZZmc0Z0Y2WXZlbENJc3ZSclA0eW5kbGs3WU1tRXdPVDBpazF4MnFBMlVXSw==","repeats":1},{"count":1744,"lower_bound":"c1dLQTZ2ZEFadHpUTjl5ODJpWTJQMGVHTTN0YmJ5cG9TVENNOVdCN2R3S1lvWEtHYVNtelpET3Yx","upper_bound":"c2dCMGdXZWZLQ2Y1dk9VRGFLYk1wekloanphOUJJOFRRaVRBQUM3ZEpVejQwUmcyNmZ6ZVJBNTRq","repeats":1},{"count":1752,"lower_bound":"c3BIakF6UWQ3NWdES1QzcWRuZEFVdnE0UnRmQWtJRg==","upper_bound":"c3ZRN3d4SjJvQW9OcEd4UzA4S0c0RFEyMFVNWHB1S2NwRU1PTm9yaw==","repeats":1},{"count":1760,"lower_bound":"c3hDMzZFNzFZUVNZVW5PbTJaQ1FzaVdnMmh2ZXd5dG4xdUVrRFFvZ0pq","upper_bound":"dEROU2pVS2V5ZFRhdVAxQ0lkWUxqMUFxT2tENkV4MjRRekdaM1VwUA==","repeats":1},{"count":1768,"lower_bound":"dER2cDM3dm5HcTBmQ1hHZGxEbHBqY2JESHFtSzFMWloyekRaMzZiVkFvMWd3NmxTU0pFdDk=","upper_bound":"dEhVWGNm","repeats":1},{"count":1776,"lower_bound":"dElrSjdEZQ==","upper_bound":"dFZDcjRtZUF0WFF0VVVzdWFKYW5NR2pPZDM0QWtSUUZHSmw3a2RGZzZLTXBUUXI2REdjTDBFVjdERHh2cW5QNw==","repeats":1},{"count":1784,"lower_bound":"dFdkWUx0NTlIMWRJRjJrblJoUzMwd0tsbUw2SmpLaTlLYTJOU2szVTNnbThCanU4","upper_bound":"dGtVM1ZBQ3o5eTJkWjR5QWxMTHRuVVYxdg==","repeats":1},{"count":1792,"lower_bound":"dGxLTjU2dVdUdUVCaFJG","upper_bound":"dHJ3U1N4SXVjaUNpakhCaTA2Wg==","repeats":1},{"count":1800,"lower_bound":"dHc5anNBUm9mMGxLR3NsaG1EUUxZWmpldGJRZXZoQThnR0w1YXpub0hDRGM=","upper_bound":"dTJv","repeats":1},{"count":1808,"lower_bound":"dTcxdDlI","upper_bound":"dUVWcWNkUFFHdkdKU3BJdzRRZVBNU0YxOGpP","repeats":1},{"count":1816,"lower_bound":"dUZHSDZVcmhCczNsTFVqU0RpQk5rZk1PeFk2b1BiQzNMWmt0ZkI=","upper_bound":"dVBZczloSzE3U2tVRUZldDF4VmFLR1VLZkx4Smh4ZDBCQmIzcnJpUXl0Z2JPeWhFN0NSSw==","repeats":1},{"count":1824,"lower_bound":"dWpQMWx3cTVZUWNRbEphbEw3WUtIaEw=","upper_bound":"dXRJeUJyWElMQXRxWUoyUWpiTlRJVlJmYQ==","repeats":1},{"count":1832,"lower_bound":"dXRsaWxPZUU1ZHdkN3J3NDlPYnV4bk81eVRPUDBQUWZRblRtcTFBWjQ3bHJydXFHbU5OMHF3Z09XV1I=","upper_bound":"djNRZ1NERFF6cXRQZkduTWdyS0lBV25XbXh4Q3V5c1pTRUo5ajRKbU9LTjQ1WFE5dDlnTXZlR2c0Uw==","repeats":1},{"count":1840,"lower_bound":"dkZaUUIybkxuWFVGcW8yaHJaa05I","upper_bound":"dktYNkFERGdkZzVqUEtBQXZhQUh2ZEhyV3djRlBKQU43YUFxcDA=","repeats":1},{"count":1848,"lower_bound":"dlNoY1VITnBTUDdkdmFPeGVCSnBncVE0R2xhQlNPeTV1ZXUwMVFIaksyTURLRXp1aDRQd0N3","upper_bound":"dlpmRU01cmFjNXBYRlc5b1pFd2pXQ3NHMXNmbjVLcXZ5cmZp","repeats":1},{"count":1856,"lower_bound":"dmNYQ1EyUDlUN05oS0k2NjM5UkJGZ1VnMlFETjREOElRNHZj","upper_bound":"dm9OSW44M1A1SFNvMkl5TGFBVk1WeEpabTZEaDhURGFIZENXckhUYXcz","repeats":1},{"count":1864,"lower_bound":"dm9TcFdLTW5Ec0hlSWUxRW1FOUVRRGJmRXBWV1E5YUV0TWh1RDczcjh1SlozWkVBbGV0RGFC","upper_bound":"dnFrb1F1ZjZhWU42ZG9Oam02ZlJHNDI1Qm5VZw==","repeats":1},{"count":1872,"lower_bound":"dnF2TzNsQ2xlRHRyUjdmUWtPQWlhQTVqZXJ2SG9rY0lubHdFQXJTYUhpUWJyUlRk","upper_bound":"dnkzR2V0THBDeWRrbkdDNFh2aXE5aFM5MndwRkVxM0NUcGQxQXYxZkllc3pTdGlidWk2Q1RQaWNjcGpXYVRCZg==","repeats":1},{"count":1880,"lower_bound":"dnoyODhZbHFGNGpwVWlheTdCeDZ2MzVSZkFFQTNObnJTaFdpYjd5alZWblhhc29RVTB6U3BD","upper_bound":"d0NQZkdOMlRRelM3TlZsR1o1QUNQWkpwSUdHald4eGl1bE9aTlhmQm4zNXJ0MVhGdw==","repeats":1},{"count":1888,"lower_bound":"d0RtaEVHTm1EMGROZHZ5TnRo","upper_bound":"d0liV2c3b00zRUlidVFGRkw=","repeats":1},{"count":1896,"lower_bound":"d0swVkl1UmZlaDl6NU1sRTVqNW1CYlJZa1phWjE=","upper_bound":"d1Q5bg==","repeats":1},{"count":1904,"lower_bound":"d2h1OU9iZw==","upper_bound":"d3JFbG5YdmdVUjl1SVdIajlremY0b1N4cHYwNA==","repeats":1},{"count":1912,"lower_bound":"eDJjWWtVbFhIMloyeDhBOFJrek9BZGR0RktkREQ2WHk2NWk=","upper_bound":"eEcxazdmMGlDSlp5eXo5QVMzeUh4V3RweHhFU1BuT01JVmNtSmlseU5paW96bktPaGZQYVpzSUhweHY=","repeats":1},{"count":1920,"lower_bound":"eEdyeUgyTTJndEtLd0l0QWFhVnJZYmRJczVpNEVnVHQ1djBJUnZZZEFBaTlz","upper_bound":"eFlhaE9hVWh0OGV6T2dJ","repeats":1},{"count":1928,"lower_bound":"eFphTE1NR1B1T25Fd3NXd2hLUGg2Ykl2THd5Tlg=","upper_bound":"eGpHRHZCWWdmdW1sdlhoaUk4Q29BY2pZTE9jT0tIVWxpTklDcTNMbmR4OTFW","repeats":1},{"count":1936,"lower_bound":"eHBxYmo4UEw3NVlqWUltWkFtckEzSHdpSTFCTDlUQ0dTZUd4c3JMUDE2NjVIT1hZVEJGemJM","upper_bound":"eHY3aFNoOE5EdUZLTDkzSVFHaUxUYVExdkpmWWtnZ0FNWEF0VXdHUHlmVXlsMHR2czRQWWdDV2JGekk2Qks=","repeats":1},{"count":1944,"lower_bound":"eHhaa1FXODFJRW9NNkViVXlUbVBGOFBKc0NiQ1ZyQmM1bzE2ekg=","upper_bound":"eUJ6Wg==","repeats":1},{"count":1952,"lower_bound":"eUdGSlJKWVRveWtaSUdpa0pneVpkblU3Y3IyREFWN1dVdVlwSXdXQjBKNmRKbDhXdjNzVlNUVGhIU08=","upper_bound":"eUtBSkhqc2hRY3ZSTmQycmlubjIwdkY=","repeats":1},{"count":1960,"lower_bound":"eVdTSkdTWXJzbjZmSzV0RXFXVHExZUY0OEpXRG82QmVHR3ZMbEhKUG9sN1N5RnpaN0NoemNZN05QTWdq","upper_bound":"eW1PTA==","repeats":1},{"count":1968,"lower_bound":"eW1PTlMwOFFFWTRQN1luMmhBRg==","upper_bound":"eXV0NmJqRTV3eHBrSm9JRGVHTTFQNzQ0a0FYdE9PTFk=","repeats":1},{"count":1976,"lower_bound":"ekNm","upper_bound":"elgwVlhWV2FUS0pENTlWNTVWSWFUcW11ZEZ3MDIwUUpPUDdySmRid1lOYThwQUMzMEdYdjV3Uw==","repeats":1},{"count":1984,"lower_bound":"elpTc0IwWmxLZDM=","upper_bound":"emZXTEJ5T1c1cXNNVXlrQUpHRHRFVkNDM045WXhob1ZxMmhUWGZNbE5PaWhQbkNEcDlXSFI=","repeats":1},{"count":1992,"lower_bound":"empvTEdmYWRXR3dpeGVPY2t6T1dtRQ==","upper_bound":"em1BUDRveGFpcmVhU1ZrNERWVnJ2TGFlZ3lRbnBHc041NENxY2pnMUh3WkZqTlFoYlJ3SXFqd0wxZURubm0zZw==","repeats":1},{"count":2000,"lower_bound":"enI2T3RsUnEzMzdwZXFtZGxzdnJ0dEtiY2luZnVrMkFNb05ITA==","upper_bound":"enhsVmxQNDY0dDhrNkdqUlBCQw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,1,0,0,1,1,0,0,2,1,1,0,0,1,2,2,0,2,1,0,5,1,0,1,0,1,1,0,0,0,1,2,1,0,2,1,1,1,0,1,0,0,1,0,1,0,1,0,1,0,0,0,2,4,0,1,0,1,0,0,0,2,2,2,1,2,0,1,2,1,3,1,0,0,2,2,0,3,1,2,1,0,0,1,3,1,0,1,1,3,1,3,1,1,2,1,1,1,0,3,0,2,1,0,2,4,0,0,1,0,1,2,1,0,2,1,1,2,1,2,2,2,0,1,0,0,1,1,1,1,0,1,1,1,2,1,0,1,1,0,1,0,1,1,3,1,0,0,0,1,4,1,1,1,0,2,2,0,1,2,1,5,1,0,0,0,0,0,0,1,2,3,2,3,0,2,0,3,2,0,1,1,1,0,2,2,1,1,1,1,1,1,4,0,1,1,0,0,1,0,0,1,1,1,0,1,0,1,0,0,2,2,1,0,0,1,0,1,2,3,0,2,1,0,4,1,1,0,1,0,3,0,0,1,2,2,1,1,1,0,0,0,2,1,0,1,1,0,1,1,1,3,0,0,1,1,2,1,0,0,0,3,2,1,0,1,0,2,0,2,0,1,1,3,0,0,1,0,1,2,2,1,1,1,0,1,2,0,2,1,0,2,0,2,1,1,0,0,1,1,0,0,0,1,0,2,1,1,2,0,0,1,3,1,1,0,1,1,1,0,0,1,2,0,0,1,2,2,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,1,2,0,2,1,1,0,0,0,0,1,1,0,3,0,1,3,1,0,0,3,1,0,0,0,1,0,1,0,2,1,0,0,1,1,0,1,0,1,2,0,0,0,0,1,1,2,0,0,2,1,1,1,1,3,1,0,0,1,0,0,1,2,0,1,0,0,2,0,0,0,0,1,2,2,2,0,0,1,1,3,1,1,2,2,2,1,0,1,2,0,2,2,2,2,0,1,1,1,1,2,3,0,1,1,0,1,0,1,2,2,1,0,1,3,0,4,1,0,0,0,2,0,1,2,3,0,3,1,1,2,1,1,0,1,0,2,2,1,0,1,0,2,1,0,3,0,2,1,0,0,0,1,1,2,0,1,0,1,1,0,2,1,1,3,2,0,1,1,1,1,1,1,1,1,0,3,3,0,0,0,1,0,0,2,0,0,0,1,1,3,0,2,0,3,1,0,3,0,1,0,2,1,1,0,1,0,2,0,1,1,4,1,0,1,0,3,2,2,1,0,0,2,0,2,0,2,1,0,0,0,1,3,2,1,0,0,1,0,1,1,0,0,1,1,2,1,1,2,2,1,0,0,1,3,1,2,2,2,0,2,0,1,1,0,1,1,2,0,2,2,2,2,1,0,0,4,0,0,0,0,0,1,2,1,1,1,1,3,2,0,1,2,3,0,2,2,1,0,2,0,0,0,0,1,0,2,0,1,1,2,0,1,0,1,1,1,0,1,1,0,2,2,2,1,3,2,0,3,0,3,1,1,1,0,2,1,1,0,1,1,0,1,2,0,1,1,1,1,0,0,1,2,0,1,1,1,0,0,1,0,1,0,3,4,2,0,1,2,2,3,0,1,0,1,0,1,0,0,1,0,1,0,1,2,1,0,1,3,3,1,1,0,0,2,3,0,0,0,0,0,0,0,0,0,1,0,1,2,0,2,2,2,1,1,1,0,1,0,0,1,4,3,1,0,0,1,0,1,2,2,0,2,1,2,0,1,0,1,0,0,0,2,2,1,0,1,0,1,0,1,1,0,1,3,1,2,2,1,0,1,3,0,3,1,0,2,2,2,0,1,1,0,1,2,1,0,0,2,0,1,2,2,1,2,2,1,1,0,1,0,1,2,0,0,0,1,0,2,0,0,0,0,1,0,0,0,2,1,2,0,1,1,1,0,3,2,2,0,2,1,0,0,3,1,0,0,0,2,1,0,1,2,0,0,2,0,1,0,0,0,2,2,2,1,1,3,0,2,1,0,2,2,1,1,1,1,1,3,1,1,0,1,2,0,1,2,1,1,0,1,2,1,1,0,5,2,1,2,1,0,1,0,0,0,3,2,2,0,1,1,3,0,1,3,1,2,2,2,0,1,0,3,0,1,2,0,1,2,3,2,0,1,1,0,2,1,0,1,1,3,1,0,1,1,0,0,0,1,3,0,0,0,1,1,3,1,4,1,0,1,1,1,0,0,2,2,1,1,1,0,0,0,2,0,0,0,1,0,0,0,0,2,1,1,1,0,0,1,0,1,5,0,0,1,0,0,0,1,0,1,0,0,1,0,2,1,2,0,2,1,1,0,2,2,0,1,2,1,4,2,2,1,1,2,3,2,1,3,2,0,1,1,0,3,1,3,2,0,1,2,0,1,0,0,1,1,1,0,3,1,2,0,1,0,0,1,0,1,2,1,1,0,1,0,0,2,0,1,0,3,0,1,0,0,0,0,2,2,1,4,2,0,1,2,0,1,4,3,2,0,2,1,0,2,1,3,0,1,0,2,0,3,0,1,2,1,2,1,0,1,2,1,1,0,1,1,0,0,0,3,1,0,1,2,1,0,1,2,2,2,0,2,1,0,1,1,0,2,0,2,3,1,2,0,3,1,0,0,1,0,1,0,0,1,0,3,0,0,0,1,0,0,0,0,1,1,3,0,1,1,1,0,1,1,0,2,2,0,0,1,1,2,0,1,1,1,1,0,0,1,0,2,0,0,0,2,1,0,0,2,0,0,1,1,0,0,4,0,0,1,0,1,2,0,3,1,0,1,2,1,1,2,0,0,0,2,0,1,0,3,1,1,1,1,0,1,2,1,3,2,3,0,0,0,1,0,1,0,2,0,2,3,0,1,1,2,4,0,1,2,0,1,2,0,0,0,0,2,1,2,0,1,1,0,0,1,2,1,2,0,2,0,3,2,2,4,2,1,2,1,2,3,1,0,3,0,0,0,0,1,0,0,0,1,3,0,0,0,0,0,0,0,0,0,4,0,1,1,0,0,2,1,2,1,0,2,0,1,1,0,1,0,0,2,2,0,1,0,0,0,0,1,0,0,0,0,0,1,3,0,0,2,0,1,0,0,1,2,1,2,0,1,2,1,2,1,1,1,0,0,0,0,1,2,1,3,1,2,2,2,1,2,0,3,0,2,0,1,3,4,1,0,3,0,0,0,1,0,0,2,0,1,1,0,1,0,1,0,1,0,1,1,0,2,1,0,1,3,0,1,0,0,1,1,0,0,0,0,0,1,0,1,0,2,1,0,1,1,1,2,1,1,0,1,0,0,1,0,0,2,0,1,1,2,0,1,3,0,1,2,0,2,1,2,1,0,2,2,2,2,1,1,0,2,0,3,0,0,1,4,2,1,1,0,2,1,0,1,1,0,1,0,0,0,0,1,1,1,1,1,1,3,1,1,2,0,1,1,0,0,2,1,1,0,1,2,1,2,0,0,1,1,0,1,0,1,0,0,1,0,1,0,1,1,0,0,1,1,1,1,0,0,1,1,1,2,0,2,1,2,1,2,1,2,1,1,2,1,0,0,0,1,0,1,0,1,1,0,1,1,1,2,3,0,2,0,2,1,5,0,0,0,1,1,2,0,0,4,0,0,1,1,1,1,1,1,0,0,1,4,0,0,0,0,2,1,1,2,0,0,1,1,0,1,2,0,0,0,0,2,0,1,1,0,1,2,1,1,0,1,1,1,1,1,0,1,1,0,0,1,3,2,1,2,2,0,2,0,0,1,0,1,2,0,0,1,1,0,3,1,1,0,0,0,1,0,0,2,2,1,1,2,1,0,0,1,0,2,0,1,1,1,0,2,1,2,1,0,0,0,0,0,3,0,1,0,0,1,2,0,1,1,1,0,1,4,0,1,0,0,0,0,0,1,0,1,3,1,0,0,0,1,2,0,1,0,0,3,0,1,1,2,0,1,2,1,1,0,2,2,3,1,2,0,1,1,1,1,2,2,1,0,1,1,0,1,2,1,3,0,0,3,2,2,0,2,0,0,0,1,0,3,3,1,1,0,0,1,0,2,0,0,3,1,0,3,2,2,1,0,1,0,3,1,0,1,3,1,0,1,0,1,1,2,2,1,1,2,1,3,2,3,0,0,3,2,1,1,1,0,1,1,3,1,0,2,2,2,0,2,1,1,1,1,0,1,1,1,3,1,1,4,0,0,1,1,0,0,3,2,1,0,0,0,1,0,0,1,1,0,1,2,3,3,1,0,1,2,0,0,1,1,0,1,2,0,0,6,1,2,0,3,1,1,3,2,1,1,1,1,1,1,1,2,2,1,2,0,0,1,1,2,2,0,1,0,1,0,0,0,3,1,1,0,1,2,1,0,0,1,1,0,0,1,1,1,0,0,2,0,1,1,1,1,1,1,0,2,1,0,2,1,0,2,1,1,1,0,1,1,1,2,0,2,2,2,0,2,0,0,1,1,2,2,1,2,1,2,2,2,2,2,0,0,1,0,2,0,1,1,0,1,0,1,2,0,1,1,7,1,0,1,2,0,0,1,3,2,0,1,0,1,2,1,1,0,0,1,0,0,1,2,0,2,1,1,3,0,0,1,0,1,0]},{"counters":[0,1,0,1,1,0,0,0,1,1,0,2,1,0,1,0,0,1,1,4,1,0,0,0,0,1,0,0,3,0,0,0,2,0,0,0,2,2,1,2,2,0,0,1,1,1,1,3,1,2,0,1,1,2,0,1,1,2,1,3,3,2,1,1,0,2,3,0,1,1,0,0,0,0,3,1,0,0,1,0,0,0,1,1,1,1,0,2,0,0,2,0,0,1,3,0,3,1,2,0,0,1,0,0,1,1,1,0,1,2,1,1,2,0,0,0,0,2,0,1,0,1,2,1,1,1,2,2,1,2,1,0,0,4,2,1,0,0,2,0,3,0,1,0,0,1,1,0,1,1,0,1,0,1,3,0,0,2,0,3,3,2,2,1,1,1,0,4,1,1,1,0,1,0,1,0,1,0,0,0,1,0,0,1,1,4,0,0,1,1,0,0,2,1,0,0,0,2,0,0,2,2,0,0,2,2,0,2,1,1,0,1,0,0,1,0,0,2,0,0,0,1,3,0,0,4,1,1,2,2,2,1,0,1,1,1,3,0,0,0,0,1,1,0,2,0,0,2,1,0,1,1,0,2,0,1,0,2,4,0,0,1,0,0,0,2,0,1,0,1,0,3,1,0,1,2,2,1,1,0,1,2,0,0,0,1,3,2,1,1,0,0,1,1,0,1,1,0,0,0,1,1,1,0,2,2,0,0,0,2,0,2,1,0,1,1,1,4,1,2,2,1,0,3,0,1,1,1,0,0,0,1,0,0,0,0,1,4,0,0,0,2,1,2,0,1,1,1,0,2,0,1,1,1,1,1,3,2,0,0,3,2,0,3,1,1,3,0,1,3,0,0,0,0,0,1,0,2,2,1,1,0,1,2,2,0,1,1,0,1,2,1,1,1,1,1,2,0,0,2,0,1,1,1,2,1,3,1,0,1,1,2,0,2,2,1,0,0,1,2,1,4,0,2,2,1,1,1,0,1,0,2,4,4,1,0,0,2,2,1,0,2,1,1,2,1,0,0,2,4,2,2,3,2,0,0,0,0,1,1,1,1,0,1,0,1,0,4,0,2,1,2,2,1,0,1,0,1,1,1,2,3,0,0,0,1,0,0,1,3,0,2,0,2,1,2,0,1,2,0,1,3,1,3,2,0,3,0,1,1,0,1,0,3,1,1,2,0,0,2,4,1,1,1,1,0,2,0,1,1,2,1,0,0,2,0,0,1,1,2,0,0,0,1,0,0,3,3,0,1,0,1,2,1,2,2,1,2,0,2,1,0,3,1,1,0,2,1,0,0,1,1,0,1,1,0,4,1,1,2,0,1,1,0,1,0,2,1,2,1,1,0,0,0,0,1,0,1,0,1,1,0,2,2,1,0,0,0,0,2,1,3,1,0,1,1,2,0,1,1,0,4,1,4,0,0,0,2,1,3,0,3,1,4,1,0,1,1,1,1,1,0,2,0,0,1,0,2,1,0,1,1,0,2,3,1,0,0,1,0,0,1,1,2,0,4,1,1,0,1,0,0,0,0,1,3,0,1,1,2,1,4,2,0,3,0,0,0,0,3,0,2,1,4,2,1,1,1,3,2,0,0,0,0,1,0,2,0,3,0,1,0,2,0,0,2,0,1,1,1,0,1,0,0,0,1,2,2,2,0,0,0,3,2,1,1,1,2,0,3,0,1,0,0,1,1,3,0,1,0,1,2,1,0,0,1,0,0,0,0,1,1,2,1,0,1,0,1,1,1,0,2,2,2,0,3,1,1,1,1,0,1,0,1,3,0,2,2,0,1,0,1,0,2,2,0,0,1,0,0,2,2,0,2,2,1,2,0,1,0,1,1,2,1,2,0,3,1,2,0,2,0,1,3,1,0,2,1,1,0,1,0,1,2,1,1,4,1,3,1,1,0,1,2,1,0,0,0,1,0,2,1,2,0,1,1,2,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,2,1,0,1,1,0,0,2,1,0,1,0,2,3,1,1,2,1,2,0,2,1,0,0,2,0,0,1,2,3,0,0,4,0,1,3,0,2,2,0,1,0,0,0,4,1,1,0,0,2,1,1,1,1,0,1,0,0,1,1,0,1,1,0,4,0,1,2,1,0,0,0,1,2,0,2,1,0,0,1,1,0,1,0,2,1,0,1,2,2,0,1,2,0,0,0,1,1,1,0,1,3,0,1,1,2,1,3,1,0,2,0,1,0,0,1,0,2,0,1,0,2,0,2,0,3,6,2,2,2,2,0,3,1,1,1,2,4,2,0,0,2,0,2,1,2,0,0,2,2,1,1,1,1,0,2,2,0,0,2,0,2,0,1,3,1,2,1,0,2,1,0,0,0,0,1,2,0,2,1,0,1,2,0,0,0,0,0,0,1,0,1,0,3,1,1,4,0,0,2,1,0,1,1,0,0,2,1,2,2,0,1,0,4,1,1,0,0,0,2,1,0,1,0,3,0,2,2,0,0,1,1,1,1,2,0,1,0,0,0,2,1,1,1,3,0,3,0,1,1,1,3,0,0,1,3,2,1,1,1,2,1,1,0,1,1,0,1,1,1,1,1,1,1,2,2,0,0,1,1,1,0,0,0,0,0,1,1,0,1,1,1,0,2,2,1,2,2,2,2,1,0,2,0,1,0,1,0,1,0,2,2,0,0,0,2,0,4,1,1,3,0,1,1,0,0,1,0,1,2,3,2,4,2,2,2,0,1,1,0,0,1,0,2,0,2,1,2,0,0,1,2,3,0,1,0,2,0,1,1,0,0,0,2,2,2,1,1,1,1,1,0,0,1,1,0,1,1,0,0,0,1,1,0,3,0,0,3,0,1,1,0,0,2,1,3,1,0,0,0,0,3,1,1,0,0,3,1,1,1,3,2,1,0,0,1,0,3,0,2,0,1,1,0,2,1,0,0,0,1,0,0,3,1,3,1,1,1,3,1,1,3,1,1,1,0,0,1,1,0,1,1,2,2,2,3,2,0,0,2,0,0,1,1,1,2,0,2,2,0,0,0,0,1,0,1,0,0,2,1,1,0,1,0,2,0,2,0,3,1,1,3,1,0,2,2,2,4,0,1,0,1,1,0,2,1,2,0,0,0,1,3,3,2,0,2,1,0,2,0,1,0,1,1,0,1,1,0,1,1,0,0,0,1,1,1,1,2,1,2,1,4,0,1,3,1,2,0,3,0,1,1,2,1,0,1,1,2,0,1,1,0,1,4,1,1,0,0,2,3,3,0,0,0,0,0,2,0,0,2,0,0,1,1,2,1,2,1,1,0,2,0,2,5,1,1,0,4,0,2,1,0,5,0,0,1,2,2,0,1,1,1,1,2,0,1,4,0,2,1,1,3,0,1,2,2,2,0,0,0,0,3,0,0,2,2,1,1,1,0,2,1,4,1,2,0,0,1,0,1,0,1,0,1,1,0,0,2,1,0,1,1,2,0,0,0,1,2,2,1,3,0,1,0,1,2,1,0,1,2,0,0,0,0,0,1,3,0,1,1,1,1,1,1,0,0,2,0,0,0,2,0,1,2,0,1,0,2,1,1,0,0,0,2,2,0,1,0,1,0,0,0,0,1,0,1,1,0,0,2,0,1,1,0,0,0,0,2,0,0,0,2,1,3,0,1,0,1,1,0,0,1,0,0,1,2,1,1,0,3,1,1,1,1,0,2,1,2,1,0,2,2,1,1,3,1,0,1,1,2,0,2,1,0,1,1,0,1,2,0,1,0,2,0,0,0,0,2,0,1,0,1,1,2,1,2,0,1,0,1,0,3,1,3,1,1,3,2,2,2,0,3,1,0,1,1,0,0,0,0,0,3,2,2,1,2,0,0,1,1,1,0,1,0,0,2,1,1,0,1,0,1,1,0,0,3,0,0,2,1,2,1,1,1,1,0,1,0,2,1,0,0,0,0,0,1,2,1,0,2,0,0,3,0,1,0,1,1,1,1,2,0,2,2,0,1,1,0,1,1,0,2,1,0,1,1,1,1,1,0,1,2,0,1,0,1,0,0,2,0,0,0,2,0,2,3,0,0,0,0,1,2,0,3,1,1,1,2,2,2,1,0,2,1,2,1,2,3,0,0,3,0,1,1,1,1,2,0,0,1,1,2,0,1,1,4,1,0,0,3,0,2,1,1,1,1,2,0,0,0,1,2,5,1,3,1,0,1,1,2,1,1,0,0,2,0,1,0,0,1,1,0,0,0,1,0,3,0,1,0,0,0,0,2,1,0,2,0,1,1,2,1,3,2,1,2,1,0,1,1,1,1,2,0,1,1,1,1,2,2,1,0,1,0,2,1,1,0,3,0,3,1,2,2,2,0,1,0,0,0,3,0,1,2,2,1,0,0,0,1,2,1,0,1,2,0,0,0,0,0,0,1,1,0,0,0,2,1,2,0,0,0,0,0,3,1,1,0,1,2,1,2,0,2,2,0,1,0,0,1,0,0,1,0,2,0,0,0,0,4,2,0,1,1,0,0,1,2,2,0,1,2,2,1,1,1,0,3,2,2,1,2,1,1,1,0,0,2,2,1,0,0,1,0,2,1,1,2,0,1,1,2,0,2,0,2,2,2,1,1,0,0,0,1,0]},{"counters":[1,1,0,1,1,0,0,2,1,1,0,1,2,0,2,0,0,0,0,1,1,1,1,2,0,0,1,1,2,0,2,1,2,1,0,1,5,0,0,0,1,2,4,2,0,1,2,2,4,0,2,2,0,0,1,0,1,1,2,0,2,2,1,0,0,2,2,1,0,3,1,0,1,0,3,0,2,1,1,1,2,0,1,2,2,0,0,2,2,1,0,0,2,2,1,0,1,1,4,1,2,1,1,0,1,2,1,2,1,1,2,0,0,1,3,1,1,1,2,1,2,0,2,0,3,0,0,1,1,1,1,2,0,0,0,2,2,2,0,1,1,2,0,0,1,1,1,2,0,0,1,1,1,1,0,1,0,0,2,2,0,1,1,0,1,0,0,0,1,0,0,1,1,2,1,0,0,0,0,0,0,0,0,2,2,1,2,1,2,0,1,1,1,0,2,0,1,2,2,0,0,1,1,0,1,0,1,1,1,0,1,0,2,0,1,3,2,1,1,1,1,2,0,1,0,0,1,1,1,2,1,0,2,2,1,0,3,1,0,0,2,1,1,0,2,1,1,1,0,1,2,0,1,1,2,0,2,1,3,2,1,0,3,4,1,1,0,0,3,3,1,0,1,0,0,3,1,2,2,0,1,1,0,1,0,2,1,0,0,1,0,0,0,0,0,0,2,3,2,0,1,2,4,0,0,2,0,1,1,1,1,2,1,0,3,3,1,2,1,3,0,3,1,1,3,1,1,1,2,0,1,0,3,0,0,0,0,2,0,1,2,2,2,0,0,0,1,1,0,2,0,0,1,0,0,1,0,2,0,0,2,2,0,0,2,1,1,0,0,3,0,0,1,1,1,2,3,1,2,1,0,1,0,1,3,2,2,1,2,1,1,1,1,1,0,1,0,0,1,1,1,1,1,1,3,2,0,0,1,1,1,0,2,0,1,1,1,2,1,0,1,1,1,1,1,0,0,2,1,1,1,1,0,0,3,0,0,0,1,1,2,0,0,0,0,0,0,0,1,0,0,2,2,1,2,1,0,1,0,0,0,0,1,2,1,3,0,2,4,1,2,1,1,3,1,2,2,0,0,0,2,1,1,2,1,0,1,0,1,0,2,1,0,2,1,1,3,1,0,1,0,1,1,1,0,1,0,2,1,1,2,1,0,2,1,1,2,1,0,0,1,0,1,2,1,2,3,0,3,0,0,1,1,0,1,3,1,3,1,0,1,1,2,2,0,2,0,1,0,1,2,0,1,2,2,2,2,0,0,0,1,1,1,2,1,1,2,1,0,1,0,1,0,0,1,0,0,2,0,1,1,2,0,1,0,0,3,1,1,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,2,0,2,1,1,0,1,2,0,1,0,2,0,0,0,1,0,1,1,0,2,0,1,2,1,0,1,1,0,0,2,0,2,2,2,1,0,0,2,1,0,2,2,0,1,0,1,0,1,2,1,0,0,4,2,1,2,1,0,0,1,0,2,0,0,0,0,0,1,0,1,2,0,3,1,0,0,1,1,0,3,1,1,0,1,0,0,1,2,0,1,1,0,0,1,1,1,2,0,0,1,4,1,0,1,1,0,0,0,0,0,1,2,2,2,3,2,1,0,0,0,0,2,0,0,2,0,2,0,0,2,0,0,0,4,1,2,0,0,2,0,1,0,1,0,1,2,1,5,2,1,2,1,0,1,0,2,0,1,1,1,1,2,1,0,2,0,0,0,2,0,0,2,1,4,1,0,1,3,0,1,0,1,2,1,0,1,0,1,2,1,0,3,1,1,0,3,3,0,0,1,1,0,2,1,1,3,1,2,0,3,0,0,0,0,3,0,0,1,0,1,1,0,0,1,4,2,4,1,2,0,1,0,0,1,1,1,0,0,3,2,2,1,1,0,3,2,1,0,0,1,1,0,0,1,2,0,0,1,0,1,0,1,1,2,0,1,0,2,0,0,0,2,0,1,0,0,2,0,1,0,1,0,0,3,4,0,3,1,2,1,0,1,1,1,1,1,0,1,1,2,1,0,3,0,2,1,4,1,0,2,0,1,1,2,0,1,0,1,1,1,0,1,1,2,3,0,1,0,0,3,4,1,0,1,1,1,3,1,2,1,0,1,0,0,2,2,1,0,0,0,0,0,2,0,0,2,1,3,0,1,0,0,0,0,1,0,2,1,0,0,0,0,0,0,0,2,0,3,1,0,0,0,0,1,0,1,0,2,3,3,1,1,1,0,0,1,0,1,0,2,2,1,0,1,0,1,1,1,2,1,0,1,1,1,0,0,2,2,1,0,2,0,2,0,0,1,1,0,0,0,1,0,3,0,2,3,0,1,2,2,1,1,0,0,1,1,4,1,0,2,1,1,1,2,0,2,0,1,1,1,1,1,1,0,0,2,1,0,1,1,4,0,1,1,5,2,0,0,2,1,1,0,2,1,0,0,3,1,1,1,0,0,1,0,0,1,1,0,3,2,2,1,0,1,0,1,3,2,0,1,2,1,1,0,0,0,3,0,0,3,0,1,1,1,2,1,1,0,2,2,0,0,0,1,0,1,1,2,3,3,2,0,0,0,0,1,1,1,0,2,1,1,0,2,1,0,2,1,0,0,1,1,1,0,1,0,1,2,1,2,1,2,0,2,1,1,1,0,0,1,1,1,0,4,1,0,2,2,2,0,1,1,2,1,0,1,2,1,0,1,0,2,4,0,2,1,1,0,0,4,1,2,0,2,0,0,1,0,0,1,1,1,0,2,1,0,1,0,0,1,2,4,0,1,0,4,2,0,3,0,0,3,2,0,1,0,1,0,2,1,1,1,1,2,2,2,2,0,1,3,0,0,0,1,0,2,1,0,4,1,0,1,3,2,1,1,0,1,0,0,0,2,1,0,0,0,0,2,0,1,1,2,2,3,2,2,0,1,1,0,0,1,1,1,1,2,3,0,0,0,1,4,2,1,0,1,0,0,0,0,3,0,1,1,0,0,1,0,0,2,0,1,1,1,1,1,0,1,1,1,2,2,2,0,0,1,0,0,1,0,0,0,0,0,1,1,0,4,0,0,0,1,1,2,1,2,0,2,0,1,1,1,2,0,2,1,0,0,2,3,3,0,1,0,1,1,1,0,4,1,1,0,0,1,2,2,1,1,1,0,1,1,0,0,3,0,1,1,1,0,1,1,0,0,1,0,1,1,3,1,2,1,2,0,1,0,0,1,3,0,0,1,0,0,0,0,0,0,1,2,1,0,0,0,0,1,1,1,0,2,0,1,2,0,0,1,2,1,4,1,1,0,0,0,1,0,3,3,1,2,2,1,1,1,2,0,2,1,2,3,2,0,1,1,0,0,2,0,1,0,0,1,2,2,0,1,0,1,2,0,3,0,1,2,0,1,1,0,6,1,0,3,3,1,0,0,1,0,1,0,1,2,3,1,0,3,0,1,0,0,1,1,2,1,1,0,1,2,0,1,0,3,1,1,2,1,3,1,0,1,1,1,0,0,0,0,0,1,0,2,2,0,0,3,0,1,2,1,0,1,0,0,0,0,1,1,2,0,2,0,1,0,3,1,4,0,2,0,0,1,1,2,1,1,4,0,1,1,1,1,0,0,1,0,1,1,0,0,1,2,2,1,3,1,0,2,0,1,0,4,1,2,2,0,1,1,1,1,3,0,0,0,0,0,0,1,1,2,1,1,2,1,0,1,0,1,2,0,2,2,1,1,2,5,0,0,1,1,0,3,2,1,2,1,0,0,0,1,0,4,1,0,1,3,1,0,2,1,0,4,1,5,0,0,0,2,2,3,0,1,0,4,1,0,1,1,2,0,0,1,0,3,4,0,0,3,1,0,4,2,1,0,0,0,0,0,0,0,1,2,1,0,0,2,1,1,1,0,2,0,2,2,2,2,0,0,0,1,1,0,1,0,0,0,1,1,2,0,1,0,0,0,0,0,0,0,0,0,0,1,2,1,0,1,1,0,1,1,0,1,3,0,2,1,1,1,0,0,0,0,3,0,0,2,1,1,0,0,0,0,1,2,0,1,3,0,0,1,2,0,0,1,1,1,0,1,1,0,0,2,0,3,2,3,2,1,2,0,1,0,1,2,0,3,0,2,3,1,1,1,0,3,0,0,2,1,2,0,0,1,0,2,0,2,1,1,1,1,2,1,1,1,0,3,0,1,0,0,1,2,0,0,2,1,1,1,2,1,1,1,2,3,0,4,3,2,2,0,0,2,0,2,2,0,0,2,0,0,0,1,0,0,1,0,0,0,0,2,2,1,0,1,4,1,0,2,1,2,1,2,0,0,1,1,2,0,3,1,0,0,0,1,0,0,1,2,0,0,2,0,0,1,3,1,1,1,2,0,0,0,1,3,0,0,1,0,0,2,1,1,0,2,2,2,0,1,0,0,0,0,2,2,1,0,0,0,3,0,0,1,1,1,1,1,0,1,2,1,0,0,1,1,0,0,2,0,0,1,0,1,0,1,0,1,2,1,2,0,1,0,0,0,1,2,1,0,1,0,2,1,2,0,2,2,1,1,1,1,2,1,0,1,1,1,1,0,1,2,1,1,2,2,3,0,2,0,1,1,1,2,3,2,0]},{"counters":[3,1,1,3,0,2,0,1,2,0,0,0,0,2,2,2,0,2,1,3,1,1,0,1,0,1,1,1,2,0,2,3,0,1,1,1,1,0,0,1,0,1,0,1,1,3,0,3,2,3,1,0,0,2,0,0,1,0,1,0,0,2,1,0,1,0,2,2,3,2,1,3,0,0,1,0,0,0,3,2,0,1,1,2,0,1,2,1,1,1,2,2,1,2,1,1,0,3,1,3,3,0,1,1,0,1,0,0,0,1,2,1,3,2,0,0,1,1,1,0,1,1,0,0,0,2,1,1,0,1,1,0,0,2,3,1,0,1,1,0,1,0,0,0,3,3,1,1,1,2,0,0,0,2,1,0,0,1,2,0,0,1,0,0,1,0,0,0,1,0,1,1,0,3,1,2,0,1,0,3,1,1,1,2,0,0,2,0,0,1,0,0,3,1,2,0,1,1,1,1,0,2,4,1,2,1,1,0,0,1,1,1,1,2,1,2,1,0,0,0,1,1,0,1,2,1,2,2,0,0,0,0,1,0,2,1,1,2,0,2,3,0,0,2,0,0,2,2,0,1,2,4,1,0,1,2,1,2,1,1,2,2,1,0,0,1,0,2,1,0,0,1,1,0,1,0,1,1,0,1,1,0,1,1,2,1,1,1,1,2,0,1,0,0,1,2,2,2,0,1,1,2,2,5,0,0,1,1,2,1,0,0,0,1,1,0,0,1,0,0,1,0,0,4,0,1,2,0,1,1,1,0,0,2,0,1,3,0,0,2,0,2,0,1,0,1,0,0,1,1,2,1,1,4,1,1,1,0,0,2,0,0,0,1,1,1,1,0,0,1,2,4,0,1,0,3,0,1,0,2,1,0,2,0,1,0,2,0,0,1,1,1,1,1,3,3,1,2,2,0,2,0,1,0,2,0,0,1,1,1,1,0,1,1,2,2,0,0,1,2,0,3,0,0,1,1,1,1,1,1,3,1,2,2,0,0,0,0,1,1,3,2,2,1,0,0,0,1,0,0,0,0,2,4,1,2,1,0,0,0,2,0,0,1,0,1,1,0,0,0,1,1,1,2,1,2,0,1,2,1,2,0,4,2,3,0,2,1,2,2,2,0,1,0,1,2,1,1,0,0,2,2,1,1,0,1,3,3,3,0,2,1,1,1,0,1,1,1,2,0,2,1,4,0,0,1,0,0,0,1,1,0,1,4,0,0,1,0,0,0,1,1,0,0,1,2,0,2,0,2,0,1,0,1,1,3,2,1,0,1,3,1,0,1,0,3,3,1,2,3,3,1,1,0,0,2,1,1,3,0,0,2,1,1,2,1,3,0,0,1,2,0,1,1,2,0,1,1,1,0,1,1,1,0,2,0,0,1,0,1,1,1,1,2,0,0,0,1,1,0,0,2,1,1,1,0,0,1,0,1,0,2,0,2,0,0,1,2,2,1,0,0,0,1,0,1,2,0,1,0,2,0,0,1,1,0,1,0,0,1,1,1,3,0,1,2,3,2,0,0,0,0,2,1,0,2,2,1,1,1,2,2,0,1,0,2,0,1,0,2,1,2,0,1,1,1,0,3,0,1,1,1,1,1,1,2,0,1,2,2,0,2,0,1,1,4,3,0,2,2,1,1,5,0,0,1,2,4,0,0,2,2,0,0,1,1,3,1,0,2,0,0,4,1,1,2,1,2,2,1,2,0,0,1,0,1,1,1,1,0,0,1,1,0,0,0,1,0,2,0,0,0,1,2,1,3,0,1,0,2,0,0,1,3,1,0,1,1,3,1,1,1,1,1,3,0,1,0,0,1,1,0,1,2,0,1,1,3,0,1,2,1,1,1,1,0,0,1,2,0,0,0,0,1,1,0,0,2,1,2,0,0,0,0,2,1,1,3,3,2,2,1,0,0,1,1,1,4,0,0,1,2,2,1,0,2,0,1,1,0,1,2,0,0,2,1,2,0,0,3,1,0,0,1,1,1,0,4,0,0,1,0,1,2,0,0,0,3,1,3,1,0,3,1,1,1,2,0,1,2,0,2,0,2,0,2,0,1,1,2,1,1,1,1,2,3,0,1,2,1,1,1,0,3,1,0,2,2,0,0,0,1,1,1,1,0,1,0,1,1,1,1,0,0,2,0,0,1,0,0,1,0,1,0,0,1,1,1,0,2,1,1,2,3,3,1,1,1,1,2,1,0,3,1,2,2,1,0,1,0,1,0,2,0,1,1,0,1,0,2,2,3,2,1,0,1,0,0,1,2,0,1,1,2,2,1,3,3,1,2,0,0,1,0,1,0,1,1,1,1,0,1,1,0,2,2,4,1,1,0,3,2,1,0,1,0,1,0,0,1,0,2,1,1,2,3,0,1,2,0,1,0,1,3,3,0,3,0,2,0,0,0,0,1,2,1,0,1,0,1,0,0,2,0,1,1,1,0,0,1,0,0,0,1,0,1,1,2,0,1,0,0,2,1,2,2,0,3,2,2,0,0,1,2,0,0,0,4,0,0,1,0,0,2,0,0,1,1,0,2,2,1,0,0,4,1,0,0,2,0,0,3,2,0,1,2,1,0,2,1,1,0,0,0,1,1,1,3,2,0,1,1,0,1,1,1,0,2,0,5,2,1,1,1,3,4,2,1,3,1,0,0,2,0,0,1,0,2,1,0,2,1,0,0,0,0,2,2,1,1,2,1,1,3,0,3,0,1,1,4,1,0,0,0,0,3,1,0,0,1,1,0,1,0,0,2,2,1,2,1,1,2,3,2,2,0,0,1,1,1,0,2,1,1,1,1,0,1,1,0,2,0,0,1,1,0,2,1,0,1,1,0,1,1,0,0,1,0,0,2,0,1,0,3,1,1,0,2,1,3,1,2,0,3,1,0,1,0,0,1,0,0,2,1,2,0,1,1,1,0,1,0,0,3,0,1,3,1,0,0,4,0,2,0,0,0,2,0,2,1,2,0,0,1,2,2,1,1,2,1,1,0,1,1,0,1,2,0,1,0,0,3,2,1,0,1,0,1,1,0,0,1,1,0,0,3,0,2,0,4,3,1,0,1,0,0,1,0,0,1,2,2,1,1,1,4,0,1,1,0,0,1,1,0,0,1,2,0,0,1,1,1,1,0,2,0,1,0,1,0,1,0,2,2,2,1,0,1,2,3,1,0,0,3,1,2,0,0,0,0,0,0,1,0,0,2,0,2,0,0,0,1,1,0,2,0,0,1,1,2,0,0,2,1,1,1,2,3,1,2,0,0,1,1,1,1,0,0,0,1,0,0,1,1,1,3,1,1,0,2,1,0,0,1,1,1,3,0,1,0,1,1,1,1,0,1,1,2,0,0,4,2,3,0,2,1,1,0,2,0,0,2,1,2,0,0,0,0,0,1,2,2,0,1,0,0,1,0,1,1,0,3,0,1,2,0,3,0,1,3,3,2,1,1,1,0,0,3,1,3,3,2,1,1,0,0,0,0,2,0,1,1,1,0,1,1,1,1,1,1,2,0,0,1,1,2,1,1,3,0,1,1,0,1,1,1,0,1,0,1,0,0,1,4,2,0,2,2,2,2,1,0,1,1,0,0,2,0,1,1,3,0,0,1,1,0,1,0,2,2,0,0,0,0,2,2,4,0,1,2,1,0,0,1,0,1,0,1,0,0,0,0,2,0,1,1,1,2,2,0,2,1,1,0,2,2,1,2,1,1,0,0,2,0,2,1,2,0,2,1,2,1,1,1,1,1,1,2,0,0,0,1,0,1,0,2,2,3,2,0,0,0,0,1,0,0,0,1,1,0,0,2,0,1,1,1,1,0,1,0,1,3,1,3,0,2,1,0,3,0,0,1,2,0,1,1,2,0,2,0,0,0,0,1,0,0,3,1,1,1,0,0,0,1,0,2,1,0,0,1,3,1,3,1,0,2,2,0,1,2,0,3,2,1,0,1,0,0,0,0,0,1,0,1,0,0,2,0,1,1,1,1,0,0,1,1,2,0,0,0,1,2,1,0,1,0,1,1,1,2,0,2,1,3,1,2,2,2,2,1,1,1,1,1,1,1,3,0,0,2,0,1,2,0,1,0,0,0,3,2,0,1,0,0,1,1,0,1,0,2,1,1,3,0,0,0,1,2,0,0,0,2,0,1,0,0,1,0,1,1,1,0,3,2,2,4,1,2,0,1,1,0,1,1,1,1,1,3,2,2,0,1,0,0,0,2,1,1,0,1,2,1,0,0,1,2,2,2,3,0,1,1,0,2,1,0,1,0,1,1,0,1,2,3,0,3,1,1,1,1,2,1,0,1,3,1,1,0,0,2,1,0,2,2,0,3,2,1,0,2,1,1,1,0,1,0,0,1,1,0,0,1,0,0,2,0,4,2,1,0,1,1,1,2,0,0,2,0,2,2,1,2,0,2,0,0,0,1,1,1,0,1,2,1,1,2,2,0,1,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,2,1,2,1,2,0,1,0,0,1,0,2,0,0,1,1,0,0,5,1,2,1,0,2,0,2,4,1,0,0,1,2,1,1,4,1,0,0,0,2,2,0,1,1,1,2,0,1,3,1,2,2,1,0,1,2,0,1,1,1,1,0,1]},{"counters":[1,2,1,0,1,1,0,0,0,1,1,2,0,0,0,2,1,1,1,0,1,2,1,0,1,2,0,0,3,0,2,0,1,4,0,0,2,1,3,2,1,0,1,2,0,1,1,4,1,2,1,1,0,2,1,0,1,0,0,1,1,0,2,3,1,1,1,0,0,1,2,1,2,1,0,1,2,1,1,2,2,2,1,1,2,1,1,1,1,2,1,1,2,3,1,0,0,2,1,1,2,3,1,2,1,0,2,1,0,0,0,0,2,2,0,0,2,2,0,1,0,2,0,0,1,2,3,0,1,1,1,2,1,3,2,0,3,0,1,2,1,1,4,1,1,3,2,0,2,1,2,0,0,0,3,1,0,0,1,1,3,1,1,0,2,0,0,2,1,0,0,0,0,1,1,1,0,2,0,0,2,3,3,1,0,1,1,2,2,1,1,1,1,0,1,1,0,1,0,1,0,1,1,0,1,0,0,2,1,0,1,1,2,2,0,0,0,1,2,0,1,1,0,1,2,1,1,0,1,0,1,1,0,0,1,1,2,1,4,1,2,3,1,1,2,0,2,1,0,2,1,3,2,0,2,0,0,0,0,4,0,0,1,0,1,0,0,3,2,0,1,1,2,0,1,2,0,0,1,0,0,0,1,1,0,3,1,1,2,2,1,1,1,4,0,0,0,1,0,3,1,2,0,1,1,3,1,2,0,2,1,1,1,2,1,1,0,1,0,0,1,2,2,0,2,1,0,0,5,1,1,0,1,1,0,1,0,1,0,1,1,1,0,1,0,2,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,2,0,2,1,0,2,0,1,1,2,1,0,0,1,0,0,1,0,1,1,1,2,0,0,1,0,0,0,0,1,2,1,1,2,2,0,2,1,2,0,0,2,0,0,3,1,2,2,0,0,1,2,1,0,0,1,0,1,1,1,0,3,1,1,0,3,1,1,0,1,0,1,0,1,2,1,1,1,0,0,0,0,1,0,0,3,1,0,1,1,1,1,1,1,0,3,2,1,0,4,0,0,0,0,1,0,2,4,0,0,1,3,0,1,1,0,2,2,1,1,0,0,1,1,0,3,2,2,1,2,0,1,0,1,1,2,2,0,0,2,0,0,1,3,2,1,0,1,1,1,2,0,2,2,0,0,2,3,0,2,1,2,2,1,0,0,0,1,0,0,2,2,0,1,1,1,0,2,1,1,0,2,0,1,0,2,2,1,1,2,1,0,2,0,0,3,0,0,0,1,1,0,1,1,2,1,2,0,1,2,2,2,1,1,0,1,3,1,0,1,2,2,1,1,0,1,1,1,1,0,2,1,0,2,1,1,2,1,0,1,1,0,1,3,2,0,0,1,1,0,0,1,3,2,0,2,0,1,0,0,0,0,0,0,1,0,0,1,1,2,0,2,1,1,2,0,0,0,2,1,0,1,1,1,2,2,0,3,1,0,1,1,1,0,1,1,2,1,0,0,2,2,0,0,1,1,1,0,0,1,0,1,1,2,0,1,1,0,0,0,1,0,2,1,1,0,1,0,0,0,0,2,1,0,0,1,1,0,0,0,1,3,0,2,1,0,2,0,1,1,1,2,2,1,2,1,1,2,0,1,0,1,2,0,2,1,2,1,2,0,1,3,3,1,2,1,0,0,0,0,2,0,4,0,1,2,1,1,3,0,1,0,2,0,1,0,1,0,0,1,0,1,1,0,1,1,1,0,2,1,0,1,3,3,0,2,1,2,0,0,1,0,0,3,0,0,2,1,5,1,0,1,0,1,1,1,0,0,0,1,2,0,0,1,0,1,1,0,1,0,3,0,3,0,0,0,2,2,0,1,0,1,1,1,0,2,0,1,1,1,1,0,0,1,0,1,1,0,1,1,0,2,0,1,0,0,0,3,1,1,3,0,1,0,0,3,1,1,2,1,1,2,0,1,2,3,0,1,2,1,1,1,1,3,0,1,0,1,0,0,3,0,0,2,0,1,1,1,0,0,0,0,2,2,1,2,1,1,2,2,1,2,0,0,1,1,3,0,0,1,1,3,2,0,0,0,0,0,2,0,2,1,1,1,1,1,1,0,0,3,3,1,2,4,2,4,0,0,0,1,2,0,2,0,0,1,1,0,0,1,1,1,1,0,1,2,1,0,0,1,0,0,1,2,0,0,0,2,0,1,2,2,1,2,2,0,1,1,1,0,1,0,0,0,0,1,0,2,0,3,4,0,1,0,1,2,0,0,3,0,3,0,0,1,1,1,1,1,2,1,1,2,0,0,0,3,0,0,2,1,2,3,2,1,2,3,1,1,1,0,0,1,0,0,1,0,0,2,0,0,3,0,1,1,1,1,0,2,1,0,1,2,3,2,1,0,0,1,1,4,0,0,1,1,2,0,1,1,2,2,2,0,1,0,2,0,0,2,1,0,2,0,2,0,3,0,0,0,2,0,0,0,2,0,1,3,2,0,0,0,1,0,2,1,2,1,0,0,4,0,1,1,0,1,0,1,0,3,2,2,1,0,1,2,0,0,0,1,0,0,1,1,1,2,0,0,1,1,1,1,0,0,1,4,2,1,1,1,2,1,1,2,0,2,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,2,3,1,2,0,0,1,0,2,2,0,1,2,1,2,2,1,2,1,0,0,0,5,2,0,1,0,1,2,2,1,1,0,0,0,0,0,1,1,1,0,3,2,0,1,2,0,2,0,1,0,1,0,0,2,3,1,1,0,1,2,1,2,0,0,3,2,1,2,6,1,0,0,2,0,1,0,0,3,1,0,0,0,0,2,1,1,0,1,1,0,2,0,0,4,1,2,0,0,2,0,0,1,1,2,3,1,4,2,2,1,1,2,1,0,1,0,1,1,6,1,2,1,0,0,1,1,2,1,3,0,0,4,1,2,1,1,1,0,3,2,2,1,0,1,0,2,1,1,0,1,0,0,1,2,0,1,0,0,0,0,0,0,0,1,1,2,1,1,0,1,2,0,0,0,1,0,0,1,2,1,1,2,0,1,1,1,1,2,2,0,0,1,0,1,1,1,4,0,0,2,0,1,2,0,2,1,1,2,0,0,0,2,1,1,1,2,0,0,1,0,1,2,1,1,0,0,0,0,0,0,0,1,2,1,1,2,2,4,2,4,0,3,0,0,0,0,2,0,1,0,0,2,0,1,1,1,0,3,1,2,1,0,2,0,0,0,1,2,1,4,0,1,2,2,0,3,0,0,2,0,2,0,0,0,0,1,1,1,1,2,0,1,0,0,2,2,1,0,1,2,4,0,1,2,1,2,0,0,0,0,0,1,1,2,1,1,0,0,0,0,0,0,1,0,3,5,1,0,2,3,0,1,1,2,1,1,0,0,2,2,2,3,2,3,2,0,3,2,1,1,1,0,1,2,1,2,0,1,1,1,1,0,3,0,1,1,1,0,1,1,1,1,2,0,2,0,3,3,2,1,0,0,0,1,1,1,0,1,2,1,1,1,1,0,0,0,2,1,1,0,1,0,1,0,0,1,0,1,0,2,2,1,1,2,0,1,1,0,1,1,1,2,0,2,0,0,1,5,0,1,0,1,2,0,2,2,0,1,1,2,0,1,2,1,2,0,1,0,0,0,0,0,1,0,1,0,1,0,1,1,2,1,0,2,0,0,1,1,0,0,0,2,0,3,1,1,1,1,1,2,1,4,1,1,1,0,0,2,0,0,1,1,1,1,1,0,0,3,0,2,0,1,2,1,0,0,0,0,1,0,0,0,2,0,1,1,2,2,2,4,1,3,1,0,3,2,1,0,0,1,0,0,1,1,4,2,2,0,0,2,1,1,1,0,0,1,1,0,1,2,1,2,1,1,0,2,1,3,1,1,1,1,2,2,0,1,1,0,1,0,2,0,0,2,0,0,3,3,1,1,3,0,3,1,0,1,1,0,1,1,0,0,2,1,3,1,1,3,0,1,1,2,0,1,0,1,0,1,2,1,0,0,1,1,0,0,0,1,0,1,0,1,2,0,1,2,0,1,0,1,3,1,0,0,2,2,0,0,1,2,0,1,1,1,0,0,0,2,0,2,2,1,3,1,0,0,2,0,0,1,2,3,0,0,0,0,1,2,0,1,1,1,1,1,2,0,1,1,0,4,0,1,1,2,0,1,1,0,1,2,0,1,1,1,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,2,0,2,2,1,0,1,0,1,0,0,1,1,0,0,0,2,0,1,0,0,0,1,1,0,1,1,0,0,1,4,2,3,2,0,0,0,0,1,1,0,2,2,1,1,2,0,2,1,1,2,2,1,0,0,2,0,0,0,0,0,2,2,0,0,1,1,3,1,1,0,2,2,1,2,2,1,0,1,2,1,0,0,0,1,1,1,1,2,0,0,1,2,0,1,1,0,2,2,3,0,0,2,2,1,2,2,0,1,0,4,0,2,0,4,2,2,2,1,2,0,0,1,1,1,0,0,0,0,2,2,0,3,1,1,0,1,1,1,2,3,0,0,1,2,0,1,1,1,0,0,2,0,1,0,0,0,2,1,1,0,1,3,2,0,0,0,2]}]},"null_count":0,"last_update_version":397952029351739392},"p5":{"histogram":{"ndv":1997,"buckets":[{"count":8,"lower_bound":"MDJsVzk5blJKeDJWaFgyRjZpcw==","upper_bound":"MEJpSklPSHFlWUJNZFUzOENLMUIyS3RiT0h4WEptbE95M0thMUp2UG94U1pleUNiMjFUeU13MWlDckZ5RA==","repeats":1},{"count":16,"lower_bound":"MEZMSWtTNUwyWDhzTmUxMHBFTHFzaVdzZVJGdGtsb0VKMGlYRXBRbVBWTHgwSUQ5MXdVazEwSElSTnc4RHc=","upper_bound":"ME1mU1pENkg4b0xkQzRJNGtuMHR5QkxFMTRKbWQ3blFQaTcwcHNicGp6akJmWDdhWDI3Z2ZN","repeats":1},{"count":24,"lower_bound":"MFE5WHhFTHMyZTVLbGUyUzhyRjI0NVFzSklvWmtI","upper_bound":"MFpXV2lJMjFuVDhzTm9vT2ROOTA=","repeats":1},{"count":32,"lower_bound":"MGE0amhVQld0QjJpd1VPa3FEd2tTOFZhTDM2R2VXMGRy","upper_bound":"MGtnQng5UzRCS2hidmZn","repeats":1},{"count":40,"lower_bound":"MGwwTkwzRFVUQUNHM2d0VnVFVWU=","upper_bound":"MThCMFpwbzNGNXlFUFJQMVJlZzN1aVZkYnh4VGN2d3lmQjcz","repeats":1},{"count":48,"lower_bound":"MUlqcDJpZ1lVcEZ4QURpVEIzdlVFaFZNRHEzNzNzMGZteUtpU0VuVFpNNTNLMUpVY0hNZQ==","upper_bound":"MVV0Y2lQWHJuUjZPbmNMMXg2dFdNdWY2TkxCaXAwUjRyT0pjaW9MNVFV","repeats":1},{"count":56,"lower_bound":"MWZYa0daSWVwSVBwRWZUc0I3S0tvVVA0c0M1SE5KZ2Uxd1hlRXpPU0NBeURUOU9CSDZSRzJjbHdM","upper_bound":"MXpxdFBnZmJUSEx4V1gzQzBXejZJOGJPRGtVN1RCbUdFT3dlR0p6amhnajlXdWhQS0hPcmt4cUJEYWlvbGhp","repeats":1},{"count":64,"lower_bound":"Mg==","upper_bound":"MjFzaFMxVnBPS0hVOUdoTzc5Nm9WMlhLMVZUdUpuTThsVFlickVaNElCU1M1bzdzeGwxU001VHhh","repeats":1},{"count":72,"lower_bound":"MjlLSk9BQzBhSk9tNGw0MHlCMW9PWjBiSW1OeTRiTEZUaWlnMDNzS0hXTFlYUThTOVJQUERD","upper_bound":"MkpNcGMwWFlkWTU1dno3RUZ2d2NOblM4NTRWbTZXRUs5RDFOMWFHekQ3SU5RYjVp","repeats":1},{"count":80,"lower_bound":"MkxCWk9ZUHNEanBVanM4RHk0ZHNFT24xOEg1QmxsYkE5amY1ZWJmME5EUGtlSm1a","upper_bound":"MlQ2d3kydXlTMUpYRDJoYWxjZmwybTFMSlh0RXlPTGhiMlVTaGtESElqYVdMMko=","repeats":1},{"count":88,"lower_bound":"MlQ3TklFSk90QXR3bEdibTY1MWxNVVhPZGN4YlpwQWVNa3Y3cHJaOVZ3YXVxR1pOTlBqbzhIOVBQOXc=","upper_bound":"MmNEa2diTFM2OVR5NWVBY0xHeDhvaTdXOWFQWHBPTWRDUFl3SFFSOXpNOFVlQXBPeTV0Wm9KN3U0aUhpZFRYdg==","repeats":1},{"count":96,"lower_bound":"MmNJTTV0Mm9iQWVPajFxSWRSQThYOUtFc0hNUEZWVkxkNTJUOEJNMGE2NkRwdThMOGJha1I=","upper_bound":"MmhvRW1ya0dOdU1Gc2huZ0lpM1B6MHVTTlcwbA==","repeats":1},{"count":104,"lower_bound":"MnNlUXVaOUlGcFZRSjhmbEVwc3BtVkcxQTF5ODVFOFA0ZWowRGk5","upper_bound":"MzlBSUQ3WUJwSXJsaWJ1WDJRN1had0JUQWNpNk5aNE9IRg==","repeats":1},{"count":112,"lower_bound":"M0JaUWZaQjVOU2t0UEw5Z0xmMGNTMGxuVTZPN0NhcTYwdjdlNm43c0t0","upper_bound":"M05FQw==","repeats":1},{"count":120,"lower_bound":"M1AyN05ITnBBSHpTQlRFQ3J5bg==","upper_bound":"M1gyUVZBRXh6bWdVQXBjRW9STVVjN2NFYVFFa2llWUpjN1lIbDNMQVRTcFdxWWZKRUFMMmlGY2xvQg==","repeats":1},{"count":128,"lower_bound":"M1pYbUdwMTlXMkJ2Vzk=","upper_bound":"M2FmOUp1UEhNWnJSZUtTY0NhVGZsU3BtMEVMR2xJTUg0MU10dXBnM2VQdkF0ZXBrUEpRckdYNXV0Y0hESTNzSw==","repeats":1},{"count":136,"lower_bound":"M2NLbTg3MnZpSFF0dDRLaWx3WTlZbWV1N01hWjc4V2FqRDlaVU5tcHpZZHNYdw==","upper_bound":"M3V1Zmt6d2Q2ZW0wemN1b0FRUHRTcE1jSFk2WHo1RHZuaTlCdWNYTEY0M25LMURaUWRQcVdpYlAz","repeats":1},{"count":144,"lower_bound":"M3pEYmhueGJFcWh2QWlWSmwxVW1ONGRSWW11SGFKSjY4aG5nWGs=","upper_bound":"NDRMNnhnT3l3UlZtVEQxem43aGZYdEs0bFhDQktJT0s4cWQ1am1xR1pleUQ5M0lDWjI=","repeats":1},{"count":152,"lower_bound":"NDV0cVBzVnlkMmswSGU=","upper_bound":"NEdHR21CZm5zcUU3dm4=","repeats":1},{"count":160,"lower_bound":"NElCSXQ3b2ROVG9sb1pKeGFFdk9pRE1XS3J6QnVDSDBQZWR2bzZwMkVSUkU2R2tKYg==","upper_bound":"NFRWN3VjUE01N3E4OGQ1RFNLMXZVWDZkQ3BBdFkyeWxtNXRs","repeats":1},{"count":168,"lower_bound":"NFVaZlpRS2dVcjlPaGZQRWFOS0NVQjNJcWtFSmlueVRJNVFXejJFRllCcEMzaQ==","upper_bound":"NGM4UWtwbXdINno3aUJSbE5aMg==","repeats":1},{"count":176,"lower_bound":"NGxWZGJjSUhoYktnbUVCNE94Z2lJOEZNSFA=","upper_bound":"NHhHaVVndU5iVjZ6Nm9MemhvTDFQclo3a0x4STdIMXNDcFhWT0NG","repeats":1},{"count":184,"lower_bound":"NTNGNjhkcUVOc2xtcUNweXg4VDlSR3NEQWw=","upper_bound":"NURVUnE3T1k2NVlSTTVOdDJ6VXRSRjYzNXVXclA=","repeats":1},{"count":192,"lower_bound":"NUt3RWRMTm4ySXNKUWVCU0xOTnhzRGpLQzRIblU3OHc2UG9MNQ==","upper_bound":"NWZIemNkNnBlRzdxcDZqMlV0R01CVUZGdWpxQlZ4RVlzVVA=","repeats":1},{"count":200,"lower_bound":"NWhDZmJEOEJIcDFxSERmNGg=","upper_bound":"NW1ZQXByR3dRRzNHblpIajJWTFlTNHVVTGNrSHF3UWJ2SENxOEhKc2NGSGxSYU9NdTY=","repeats":1},{"count":208,"lower_bound":"NXZRVGU2djlaNmNjbFNVT1VxNFM0Q3RKQkppNGxCYVhFTzJLc1h6MzQyWEU0","upper_bound":"NjFpQkI0MUw4bGtMckwwVUR1TEk5R1lGclpLUWdjT3BSZkljY0w=","repeats":1},{"count":216,"lower_bound":"NjRyb05Wc2o2YlZqVW9JMkxiWEtJMlkydWtjajBCNmc5","upper_bound":"NlNsZmRST21jZDV0cHNUOEt5djlneG5JOHNXSkRSb29aUG11","repeats":1},{"count":224,"lower_bound":"Nldv","upper_bound":"NmVYQ1RZWkZDTTNxdHBjWTNNT1o2THFWdkFHRW9OdzJRYWE1cA==","repeats":1},{"count":232,"lower_bound":"NmVqVlBwMTRwbUZYdnBpdmZmVnJOWmRlMUpOYlZk","upper_bound":"Nmh3WlF1TlZRMTRvRExJeEhYS2dRV3FEemR3YjRRMzBON1NPaVltaA==","repeats":1},{"count":240,"lower_bound":"NmlVQ2wyOURBT0FtSFR1OEdaSWlLTw==","upper_bound":"NnptMmJ1RUpJQ1JIeThMakQ3bFFkSHRFSWt5bW5RTWp1WEtRV3BJVFlZcjlZZUdkM1ZsdGI=","repeats":1},{"count":248,"lower_bound":"NzJkYUZPYzVPd1pSUmdRSWxvQlpaVU5rc1JMYnVGV0cwTTMyQ05SZTFaOG9VbUV0U0JSSW1nRlBkU3RyejJR","upper_bound":"NzZCWVJETW9uRm54dFNUWlBOSHNPQld2cw==","repeats":1},{"count":256,"lower_bound":"NzlDcEFhc3J4WDZTc2ZqeGtMcUdIVENaUHRxbkhrQ3pYZXk=","upper_bound":"N0hKOWdIbE1X","repeats":1},{"count":264,"lower_bound":"N0hKbUJyYk9qNlN3MndCSWVzRlBmUTBXQ0NWVGdkT2s=","upper_bound":"N1hqbkYxb2J3UEJUQ2J5enNQSWFQR1YyYjBVV0E5MUdL","repeats":1},{"count":272,"lower_bound":"N2ZOa0RtQjVITkdiRlZTdFlGMWg1QU81djg2NFF5TVBpVHc3R21kbWswS2p4WjJwajg4cFVLRkUzYzBQMDFK","upper_bound":"N2tvVUN3dmJMd0lENkV6V3Z3U3MwNmgzamV1ZDJmdXFEcGh6QmRxTUU=","repeats":1},{"count":280,"lower_bound":"N29RZ05NVnZwYkVmNXk5","upper_bound":"N3FEZQ==","repeats":1},{"count":288,"lower_bound":"N3JRS3E=","upper_bound":"ODJKZVdMVGw=","repeats":1},{"count":296,"lower_bound":"OEdXSTdiNDFCSHNYaGxuN0ZaRnd6ZGFTeHpxZWdlZQ==","upper_bound":"OExTS3JON1FzbVRmM2c3WXpVR0NYWXBqekNRZ0U=","repeats":1},{"count":304,"lower_bound":"OE5reXRpbHltb3BwbkVQNE51ZTdSVjM0bnNiOU9XVHhMOVpKSnV3aXpWRjc4aUNZTDZHNVJkcg==","upper_bound":"OFg0WEV1VGZLVVYxRk5YRkxOM3diM3haTEZ5eTJkZVpZaloyandBbUxCMVRrdlRRQUdRRU9YMlE3NHFIUg==","repeats":1},{"count":312,"lower_bound":"OFk3SE9RTHpCS3A3eVdQRw==","upper_bound":"OGtDNFN4S0NsTElPSURSckRDeHY=","repeats":1},{"count":320,"lower_bound":"OG5SbHh4Q0FURXU5Z3ZiSA==","upper_bound":"OHRseldTbVhYbTY4WFVMT1dxOHJlNmEzd3BKY2o2TzFpS3p5c1Z1Y3FRelU5TEowYjJ3RDRYeHZ5TkZjRlI2","repeats":1},{"count":328,"lower_bound":"OHZmM2ZJYWdpMlpmSERaU25zc2ZrQjB2YnhUdVdjbg==","upper_bound":"OTlrRGo=","repeats":1},{"count":336,"lower_bound":"OUQ=","upper_bound":"OVNIMEtBcFF4dkhYRHVmS2RsUEp2R0MwWlRZQ3BrOWpDWVlMMFF2WHg2eGJSbk5TTEVJVDFETzFDb21nMmU=","repeats":1},{"count":344,"lower_bound":"OVdkaklZYkdCd3pDR0VZdjBrRkloNFM1WHczRG16bXluVklBYnd4MjVLdkk0bTVBQ0t4am42Z2o4UQ==","upper_bound":"OXlTczNRcG1yYkh0ZjZnMFhzUndJZllBUEFsTmUzbXB1dGhENENaRTBZVTB5NFU4QQ==","repeats":1},{"count":352,"lower_bound":"QTN4R1A=","upper_bound":"QTdOTjBoemdOOEFrZWluWTRPenBHN1htMmJTb1ZZbll1WHhUeVFBSXd4MkdrMzUwM1Y=","repeats":1},{"count":360,"lower_bound":"QUExdkROaHQyOVQ5Y0YweTQ=","upper_bound":"QUdMRFRwZ3U0b2J2b1A4QTZuT055blU=","repeats":1},{"count":368,"lower_bound":"QUg2QnZDdVZIaGh3SHJCRUcw","upper_bound":"QU44RGtpc20zVm5YdFNXZmJJNUU3UVhQcUNKbmtvREFqcWpTVlRkTklSdlV3TFA3QlFoRGdqd2w=","repeats":1},{"count":376,"lower_bound":"QVFXMFRsYmR3aWh1OG9OWkVTQWp1Q0NmS3ZSaGdGQkdMakNIRmtUeXZDTlRBT1doMjZ1eEw=","upper_bound":"QWNJZ25UWDhVM2Y4b1lUakZ6Q3VzREpXejRoUXpEY1RkWWphMWhNT0VNck9na0hUZ0tGck1TM1lyOE9DWDJm","repeats":1},{"count":384,"lower_bound":"QWpBWm9lTVU3MXVMZUhrSzFiWGUydUs3MklTNUxJ","upper_bound":"QW42RlBjOE8wMUZkWnBHbllLTm92OFFyaENNVnVRVnQ3UHJ5WDdIb1JKTldY","repeats":1},{"count":392,"lower_bound":"QXBMc2RKOTYzZkVSQUg4cW1rUldwck5PT1FaZVZFaWVBS1l6a1E1TDBQWHN4cDRDVEZyS2lYZjI=","upper_bound":"QXRhQUZPTTZWaEgzbmJ3RW8xSkdBMThOenR1TDRHV3dkZQ==","repeats":1},{"count":400,"lower_bound":"QjBUdmpzTGxTTTR6U0ZIamdzV055Mmp4VkFJZEVkZnBLRlhwQlJncnNSUUU0TU1ST21VeHRTalUwZw==","upper_bound":"QkM4OE93WU9GRUg2d2VicnJnNVVJTHVhNG5pQjFRdFZTZ1RlankwdmFzSWVqdGlLUFFCangxcVVJOTF0OU4=","repeats":1},{"count":408,"lower_bound":"QkNsVXpPVVBiWVlXS3ZFNVE=","upper_bound":"QmZaV0VI","repeats":1},{"count":416,"lower_bound":"QmtRdlpLbEhwNUY=","upper_bound":"QnZkZTB4Z05qTUQ5cWNEd2kw","repeats":1},{"count":424,"lower_bound":"QnlEdFFScG5wRDJkNUlwRDlkWVJjYXltM0RpN1h3U2k1ODB6WGdUWHNOTk5kcnBoVWtjdmZldmdiM2g=","upper_bound":"QnprSjZub2xJZUlDS2E2ZTZ6T2RLbk5xblFHckdSdzgzajF5QkxOb291MUJyenJvaXprdzczbUdwVUhsNTdBNQ==","repeats":1},{"count":432,"lower_bound":"QzJwaWVQc1JzUmNCUEhvQUhC","upper_bound":"Q0VtU2xzMGtxeFNobm41cTNMbnRZWEc0VjVGQzdITVppa1FERVJMVnJVUDA1b3I=","repeats":1},{"count":440,"lower_bound":"Q0hXa2I2MWQ0OGg3VHNLSE5CVDhIclBMaGZpbzg2emtpZnlnT0tVQ2RqQVVJQXExY0k=","upper_bound":"Q2FmWjA5aHBuQWlZdEZP","repeats":1},{"count":448,"lower_bound":"Q2xTUFNJY3RwVVJkUXRRNkNqYThqbEJRakVRS3F5QkpiTEc2NjlXdlp5bDMxTTU=","upper_bound":"Q3FYTmJycjJWZDE5cm14Z0hDSk9Kbmh1cWpyUlJIakxsa3hibWFpVTVGMTNlZmxteGlISnIzc1JsQlJyQkVX","repeats":1},{"count":456,"lower_bound":"Q3hGcjNEU3VuZnpCYVhTTjJvSm9wOXp0QjNsZWU4Vg==","upper_bound":"RDdkYUU0bGk5UWNNb1g=","repeats":1},{"count":464,"lower_bound":"RDhZZXhwOTk4ZGZCTVJETTRrSEtsNzFodWN1cWVw","upper_bound":"REtnR0NxcUs1YVJjbERVMGZIZ2tZeDJ2T3lOeWVmazY=","repeats":1},{"count":472,"lower_bound":"RExXY0dYdzhnSFNsRVZTbFgxMXY0SnJZV3FDNlNvdk1icUlhY1Z1M0NpVkptb3FsQXE3","upper_bound":"RFBkdDhJQUNq","repeats":1},{"count":480,"lower_bound":"RFJaaUJ4b0I=","upper_bound":"RGp6VnNndmltQk9MMDNXM3h5NVRwdzZmR1dseUdHQVUwWExtQkNab09iNlZ2UzNWRWhtTGpkNnJKQmk1","repeats":1},{"count":488,"lower_bound":"RG5rZG5D","upper_bound":"RTcxQ3BJZnBIVFREcGVSU0R4MW9yejlqNldhNHNkS0RDMG84T2dnSmdKM1M5U0MxNUV3TlVh","repeats":1},{"count":496,"lower_bound":"RTdIQ0c0UTBNSUJlSDNS","upper_bound":"RUdjVWVjZ3ROVXhkcTIzeUY1STZrdmJJdm1nRkVFYlpaVmpVMmNGcndjb3RVWnZCWkJUaklFYWlNeg==","repeats":1},{"count":504,"lower_bound":"RU5SaXI0blJkSmJpSGNucUY3Mlo0cDBWWXptRHJHWg==","upper_bound":"RVhsemlPd0F3M0czRFpxS09Nekw2YUlkQVMySTRwcW1URGI=","repeats":1},{"count":512,"lower_bound":"RVpNVVptb3d3M2JGdmI2djNxZ2UwaVQ2ZEplcXRrbkkzb0YyQw==","upper_bound":"RWJubjlleTV0NGx4TUVJUjJONm03dlJRQXV5aG5xRXdTaXZGckhzbVJNSGdrWEY0ZmY=","repeats":1},{"count":520,"lower_bound":"RWU1","upper_bound":"RW5YT1VvTU1xOUtiY2kwdGNYNDN2OGlTcDI4bzBndFlPZjZwQQ==","repeats":1},{"count":528,"lower_bound":"RW9QelBXUXRDNmVYTU1LMm90OEpqYk9kVkxQS0hoWG1BMWRUag==","upper_bound":"RXF1VlpadFh3T1Z4SHp4NllKNExsOUtrVXBaamwxdGFPOWV1cnVoWFFhSDdlTA==","repeats":1},{"count":536,"lower_bound":"RXJkclJhbkZJU0JGMHZ6Z3lKaE4zNmp3aDZPb0pod3RaY1FKZ2FodE0=","upper_bound":"RjZON1A5TmhmY1RlZWhtTA==","repeats":1},{"count":544,"lower_bound":"RjdIU2VXMm9wQUxhOWQ1YWJaMWZNbk81Y204WHVhZXMwakdST293ZXk=","upper_bound":"Rkw4bmJzRVJNWUVlOFJFZGJLS1Z1RVF2eU92eHMyQ0JOSXNXSE8w","repeats":1},{"count":552,"lower_bound":"RlJNV2FaSTU1b2ZMSlhqZ1MycUtMUnlSRkU0WmZSTEFsWlMzU2VPRG9ZYlZ4Wg==","upper_bound":"RmRFWTRMR1MyNW5BUUhTYUNPM0Jod2I0UVZuZW1qeVBIbnlaaXZNT0JXQlhSeUR3d1J6N3NPbGV4Rw==","repeats":1},{"count":560,"lower_bound":"RmVMZTlPNkU=","upper_bound":"Rm91NWQwQjB5c291VEE3bjNMUTFmSVpKTlZMcTdx","repeats":1},{"count":568,"lower_bound":"RnFpdWEyNUlUUUdIS0d2YUl4U3QyTE44TUdNQkprRzI1cnhBZDR2","upper_bound":"RzNBdlh6T0RiZzd2UldtQ05yY3lyeFkwVlA0T2VoYXJHbGxEUXh1eEdlcEsyTmtXb3BxQ0hZRzFVclE=","repeats":1},{"count":576,"lower_bound":"RzVMb0pTR0t0SDgwanNBUlFaVTJMd2ZvVUZhN0VlOFRpeVk3Zjd6N2RIRjIycDJTOERjNW1RZ1hRNXlacw==","upper_bound":"R0hUZ2VVSzFEQVhJeFVuRmhrVVpsWnptTDI5VVVVcGdWUDBYN3NpMUZDaGlidXZhWWd4c0s0eGM=","repeats":1},{"count":584,"lower_bound":"R0tXNXVaNTBZN3hLVHJoRFRCdzlLcllnQmJGOHVCSnZnV2pQckR2WVM0S1h2azBNUDQ=","upper_bound":"R1hLZFhvTVBMVDlWWTBINDZVcmp2emZSVlJaZHBJNHU0","repeats":1},{"count":592,"lower_bound":"R2FyUmZtVGozOGxQcVFKS2hUZjVYM2xnYlhrV3pHam1IUnl1OFJlVA==","upper_bound":"R29hbE9oTUp0ZW9qSDZNYmVycExQYXRVeDUyYkc=","repeats":1},{"count":600,"lower_bound":"R3lvNzF1MVUyckFzdnZCMXV5S2Z4cW0wNWJFWW1IZnFtNDY1V3V4NE5YZGowVEpBZ25EYTYxYWo4","upper_bound":"SDhxc0hVeVRqbXBSRXJFUnpJZkNLT3hWcEF3d1Q4emtMTkVuWGtWM1JXaEI=","repeats":1},{"count":608,"lower_bound":"SEJuVHlZVTlIWnJRSzJUdHBrTVpndzdpNkpqZTg3UkcxTk5aN1dZMUJsc0djdUJDbEZrSlpDSW9sWA==","upper_bound":"SElxZmRVdWZDMjZqbXZVZnl4cWtZNQ==","repeats":1},{"count":616,"lower_bound":"SE15RjJxV2JYd1lBcnJSRXNUak0zYThPamdGb1JkQVFTRWVj","upper_bound":"SFplempwOUg0VkFUODZKSkJSbHc0RG1sQ21SQVVKNldRQVE3VEhnOTc0N2FydA==","repeats":1},{"count":624,"lower_bound":"SHJmd0d2ZEJocQ==","upper_bound":"SUFnYkx6clA=","repeats":1},{"count":632,"lower_bound":"SUUyUUxJSmFqYWRBM3BRR2pOdFdLNVF2RWZLOTJZQ05OMUgybWhkd1BNenYzOFFCd1Y=","upper_bound":"SVNTaGp4NWJ4VEhJUmE0WEw2ekJqeEVBVXJjMVB3cWp5RlBpMVJD","repeats":1},{"count":640,"lower_bound":"SVRLMTROcmhQMHVhdFVOYmprNGl4TXJoYzFDY1d2Z1o=","upper_bound":"SVZXaHZnUkdxU0ZGbmNpdHBpZUppZVJM","repeats":1},{"count":648,"lower_bound":"SVowblZ5VFF4TTN6REhraFRva2lCMWZNNDVnVkJhWnRCNFRUaHNNTUtaTnlONERFdVdKWjE=","upper_bound":"SWlrM2xzWXFkR1FjaFlqSEx2bms1bU03MlM=","repeats":1},{"count":656,"lower_bound":"SXFuclMxZkhCeUszT1VGSmZDODZNYlJMb3JjTmVLOUNSTDZObmpibkp3YmRmNWM=","upper_bound":"SjFNTU0ybXZTY09iZWJicnJPcGNFNEN6T2FKY21CV01sVTlOYTc=","repeats":1},{"count":664,"lower_bound":"SkM3SkV1WlFONVhIclhYc0VpNUhNbzJqUUVEN0QxdEN6QnJoTFRaYmhHbnpMa2dFaA==","upper_bound":"SlFab2hV","repeats":1},{"count":672,"lower_bound":"SlJMWVJyaTRXUVZzWXVNN2d5TFlwelhQR282VGRzVg==","upper_bound":"Sll3Z0FpSUJ5YnBlZ0R4RzdaUHZ6VWFVY3F2OXltZWs3UlprSzdLWjNEaW83S0VCb1hMbnZTbnFLbk10cWVJYQ==","repeats":1},{"count":680,"lower_bound":"SmZ0d0JhaENtSThESUprTDhlRXNCQ3RJams2YlB5NWJJcDBFQmJETmVTcHhO","upper_bound":"SnV6SnRwdG1SU0pXZ25NYg==","repeats":1},{"count":688,"lower_bound":"SnZCbWVWNWlKY01GSlFOM1NNaG1lWFJDWXNmUGVoV3NUTDJJaFYxeXA4N21uampr","upper_bound":"SzF1QUNVbm1SOEc4M29KZktrRE1QUk1MY1RMRlB3Q1NhUUtnNG1Gb3l3","repeats":1},{"count":696,"lower_bound":"SzJPckY0czBKSkN2cGttd3FE","upper_bound":"Szk3RmZXak00OEdYakRsZlY3Y0F4dGVNcXJtckpLaGJ4VFJYQ1FTajk=","repeats":1},{"count":704,"lower_bound":"S0E0YXMzVWNUM0E4U0JXbUdqSw==","upper_bound":"S0Y1RXU=","repeats":1},{"count":712,"lower_bound":"S0g=","upper_bound":"S1lONlZSc3lsbU1UUE81VWVJM3NvU2NCMFBQWmkyNmtZaUtpbWEzU28xZA==","repeats":1},{"count":720,"lower_bound":"S2FzaGQ=","upper_bound":"S2wya2RRTlUwMWNyM0ppNA==","repeats":1},{"count":728,"lower_bound":"S2xhRmd5NWVia1lDSVFiMTR0SUpSenVqaVNGWjhxYWs=","upper_bound":"S3djWmNiQmVaU1J5UmpBUzZRODJZNmdJNTM1dWh1bGdoUjE1eGtqUXpoaGd2NXJwcEkxeVZkRTVnSXVvdA==","repeats":1},{"count":736,"lower_bound":"S3lLYVhzTUNqUmExSEtMUW5FME9qZGk4Wm1jOUZnczdPdEFhSW9pOXRQMG5NaA==","upper_bound":"TDUxejZMTzNweG5C","repeats":1},{"count":744,"lower_bound":"TE5ONFNwalY3SnE4dHFhZGdVWHM3TjZmUzJ2V0w4MlRWUGxH","upper_bound":"TFpBSHdaTFlCVFNXdEZzVVE3TTVZbkZFa2tMbWEzY3lnZw==","repeats":1},{"count":752,"lower_bound":"TGIxRHEwTHQwTWc2MVNHMTF1NkdZaEVNa1BCcUJHdFFwRW1ZSUVtdkVOVGR5aTgx","upper_bound":"TGpBcnZ0OVNtZlQ2bWc3TQ==","repeats":1},{"count":760,"lower_bound":"TGt5R1VBbURvdElITGxtRXBrbDk3bWRBa3A3U1ZXSDVVR1JZZGlE","upper_bound":"TG9MZXhERjVUaUhhT3hpSmtDbTJQeWtwTDBCSVVIbnZYYzFsdDU3b2Jnang=","repeats":1},{"count":768,"lower_bound":"THBERGZvMjBoYlA4WGszVWhwZ2NvT0hBRlpweA==","upper_bound":"TTRPMEI4QTVQclBmeFlrZ2pmRWo5V2szYXVIa1pwMDNFRTY2RG81ZDNzZXA5dW5YV0l2","repeats":1},{"count":776,"lower_bound":"TTZnUU1TYUxkMlkyNUFESzhWOHlxUm9BbEhaNzhtU1lSdkNuVTFr","upper_bound":"TUhFZ1F1cUNNQ1VYRG9ISzRXMHho","repeats":1},{"count":784,"lower_bound":"TUxBMldMVHBvaVBwWDNnVXY2S0dVazhYbWFUQXRvbDZWNw==","upper_bound":"TWVIalBvQmRpTTFzZ2lPc1JlWjVwWmRKTElTWUI=","repeats":1},{"count":792,"lower_bound":"TWZUNmNJdVN4ZG03UUYxa3U3NkpPYkw3SXk2ampwMk9hUg==","upper_bound":"TXNyb1RvUnlObE9xaGJTTXluR2R3SWNIZmhKb2hNZQ==","repeats":1},{"count":800,"lower_bound":"TXVyekx1MkNHWFJUSjJSbmF5bTB1bzRxZVN1QmZGWkpZZllEOVJkejVGNVJIcA==","upper_bound":"TjNteDlZR3dHNUVvS3hmR0Z2UVI0Z0VRRkZCaWZjVENTM3hBTWtNcmRm","repeats":1},{"count":808,"lower_bound":"Tjg0VmZPM1MxdXZIN1VyaHNxNzdzWmpmeEZJb3ZSRGpxSldnMlg2S25ERVFQdGJaZUo3NkpReFBQMg==","upper_bound":"TmM=","repeats":1},{"count":816,"lower_bound":"Tmx3eA==","upper_bound":"TnNuVXZveFJoc0ladzg1ZQ==","repeats":1},{"count":824,"lower_bound":"TnVhT1o1eTJvbEc4dTB6YUhLUWdFMkh0S0t5YmhIZ05xNkR1WGxvdHRuWncxck5NcmNlSEh1Nw==","upper_bound":"T0ZjUGViSkZNemxDRXZYcGF3blYyUVd3eA==","repeats":1},{"count":832,"lower_bound":"T0Z2Z2Y2WTI0M3NtTkN0SkUwWVNpTVpJMUg4aTRva3BEMWFhUGdabEFvYVByUTE1RlZRYXh2ODhSRjFtS0c=","upper_bound":"T09XaGU4ODEzR1c3SWNLZFlwVklqNnNtTTV1dDdEeA==","repeats":1},{"count":840,"lower_bound":"T1NoTDFrRExlUW1YT1czSEtTSTlVREJGN2ZxWlpXaEpmMHJx","upper_bound":"T2NRaFRJams3emRKMGFRb0xzTU1iT1BLQnZvaTVDVnM4ZHFtalJpTjUzV1FVR1dCYw==","repeats":1},{"count":848,"lower_bound":"T2RGT2laUUszbXdGSFBqdTRPWmFOOTB0VXRpU0pEdEhMNTVOSw==","upper_bound":"T3dEcW0xNVVnaWRkNVpmZ1Y3MkVnRWJjQVE1eURoVkhmNkYwWDdhWg==","repeats":1},{"count":856,"lower_bound":"UDFTcHFiM2Y3NUFCeGF5SFk=","upper_bound":"UEthYVZnY2FGMTVVa0djWEVrYlEwcjBvSXp1QjkxOEFob3NXTHNuZWo5NVVTZm5IcTI4dmk=","repeats":1},{"count":864,"lower_bound":"UEtnMVZYVDVZRjQzZnFrU1JETVBXcnlZM0pwYURRN0E5M2VoaGk=","upper_bound":"UFM=","repeats":1},{"count":872,"lower_bound":"UFVXU0ZFVk9HbW56RDNnTklPcWl1S282ak9McXNSQ1dNS1l1cXc0MWNUYVF1Vm43RklLUUk=","upper_bound":"UGR3MXNSQ1ZZWVQ5SXRsdDRjTml6Qkp6SDAzTE9qV2FtOVpyWHZHS0tUVDlMektacVFNejJ2b0ZxYmk4cm9D","repeats":1},{"count":880,"lower_bound":"UGxtb1AwcWFHT0tKVlcyeHUySGh3NFpxQmZoQzRCMHB6ZkdzdUxKcFJrUEdzd2lBUG92a1Z6bmlZeUhseg==","upper_bound":"UTdOSWJM","repeats":1},{"count":888,"lower_bound":"UUdiT3pWOXZBazJWNVA=","upper_bound":"UVNLZExYVDRyelpkQURRakM5eGx4NFhVOFU4UVdEOTZTaVE3Q0R0bEg=","repeats":1},{"count":896,"lower_bound":"UVNkdE5uTFFrUTdXY0VCQjYzVEhHeENzOHg3","upper_bound":"UWRwY2wzamxmNFJOeWNtZ21uNEpJazBWZllYOWd4RGNDM3FlcURScUhscmd2WFN0SUNFNFduQ0JNOVlHaQ==","repeats":1},{"count":904,"lower_bound":"UWd1Y2RzYmNuako2VnUwNEh2ZDZKNmNwTXNOTlh1b0tkdTJ4aHFQRWhnTndEdHpNM0ZLTmtuZUt1b1g=","upper_bound":"UXd5aElkZVNJcHFaNWJmYlBnNkl4b28wbjhjc3R4N25NQ092UWJFN1Fock1jM3RmMFhudHgydzQyUEdaNGs3","repeats":1},{"count":912,"lower_bound":"UjNETkZ0eFpNUEdtT1ZtWg==","upper_bound":"UjlNQmU2dDNwREg=","repeats":1},{"count":920,"lower_bound":"UkFKWGp6MWU4bGM0QzFCbVA3SkI5QndDRGVKc1hLbjVheFlUb3l4REZldXRGSTBMZU1Xb3g=","upper_bound":"UllCUzJGVE9rekZ6UWNxdlV2WlJxbjd4VWU=","repeats":1},{"count":928,"lower_bound":"UmJBMEM5SnpXNHUwNWhtVQ==","upper_bound":"UnJheDFnMGJ1ZjBWMjJmbExJa1hsak4xMWN3M1RxcUpMekRGRXBTeU11TWdMQVN4bjV2RmRHdkNXYkN0SXdUcA==","repeats":1},{"count":936,"lower_bound":"UnZpT0F4V29jZVpFSGVySURxYXJmRGExUmpCaExUZ1V1WFlUZEpLZ003WDVrOUlPb0lOeEtPeTBXQWs1UU1Z","upper_bound":"UzJnTlNma1FNTVBXTVZpQzVySGRkTDI=","repeats":1},{"count":944,"lower_bound":"UzVybVhiZnZRWDlaSGpLcjZwNGlNd2xCNk9BZzg2blBtN1AyaEtTQ1JDU2RLT212aFlL","upper_bound":"U0wwdlc0eQ==","repeats":1},{"count":952,"lower_bound":"U01LMEpCeFlGdU13WE8zR29XZjZoUVhKTDhyVlYxcXA0eExMNFBRUnlhT2pSeUQ=","upper_bound":"U2UwdExUVFI1NGJtakRRTXZWUE0wVmRUZ0RudzVNRFk1NmNUakc=","repeats":1},{"count":960,"lower_bound":"U2VLMGp3TUFqT015N2VqTDNvU3U1","upper_bound":"U3FrbQ==","repeats":1},{"count":968,"lower_bound":"U3I1eldWVXR2aElMQVlPOA==","upper_bound":"VDVHWWoy","repeats":1},{"count":976,"lower_bound":"VDg=","upper_bound":"VEdOdlQ0YW9DUm90YUx3Z0pXWjE=","repeats":1},{"count":984,"lower_bound":"VEpUVVRnZ29LRlhremNYWmk5YWhBWmRTWkRHN0V4NVloTzQySw==","upper_bound":"VFJpMmdWZlBXSkFXZU42c0M3MGdJdjM=","repeats":1},{"count":992,"lower_bound":"VFcyQ1FOdnJRMDVHY1VqWGhXb1Rmczg5aw==","upper_bound":"VHEyd0Q2QlVSWmpYTlk5M05USGlPTEl4RldvWG92VzZRVnMxMnJTOVNMVWFYVVlOMXFLZA==","repeats":1},{"count":1000,"lower_bound":"VHEzalhvcEVrU25Uc2tyY0J2VWN2aTdMZUVtTHZqMUxBemQzbmxIb25EaEhSR01WaERyQVRFaEpBZWdLVU04","upper_bound":"VHZMaXdUUUQ3d01SczdjV1NjRGhxOXIzWGYwVE5XREZrQThvZ1lDWVltc24xRGxHNmhXR0Y=","repeats":1},{"count":1008,"lower_bound":"VHdJNDBRQVJEbzA1cU5LOTNMU3Yyb0RJMlRrUEtQaVB6UTBqQlpPdw==","upper_bound":"VURkMjJMT1dMZ1N1d1k3Y1V3eHB1a0RpT2NoT2dUbjlrZHcyOGQ2c2FjY1pHd2lkMVU=","repeats":1},{"count":1016,"lower_bound":"VUhLM05RZmxpUkNTUXZReEJ5YXlvMHNTaDhwVm1jaTdlUHlvY3VYUVpROUp2UFJkUE95dXl1clBKV0pJQ2hldQ==","upper_bound":"VU9IaTVDVUNhM0JwQWM5RHN5THN0RjhJeVEw","repeats":1},{"count":1024,"lower_bound":"VWNIbDZGN3prWDJQZUNvbXI5ZUZqRTVSZFQ4OA==","upper_bound":"VWdNZnhHU016UGZGNERsNWdtZzl0YW1vR3Y5dWxFR3d1U2c=","repeats":1},{"count":1032,"lower_bound":"VWtHbUM0c0JKYkg5SG0yRmhabXJQYzM=","upper_bound":"VXIwTThoNDNmc0hteEM0SnpESXo0Yg==","repeats":1},{"count":1040,"lower_bound":"VjQ=","upper_bound":"VlU3Wlg=","repeats":1},{"count":1048,"lower_bound":"VlhFMXJqR2RTU1JrM2xZYUJJemRaZlptVkI3akpuWWdHSGRCVjFPQkc4UGJU","upper_bound":"VnBMVkxvY3V2UlNVeTdHUHZFZ0hTQmt1Umw4RGx5","repeats":1},{"count":1056,"lower_bound":"VnF4dzVsT3FEd0tyY1JyR0RyY1I2azJ3TnU=","upper_bound":"VzVacjJ6eGtzTWk=","repeats":1},{"count":1064,"lower_bound":"VzlDOGdYTEZQRkxrNnlrdTIxdFdZNkx5Y3Q5Z0tKN3VrUmVDQUp1SWVmZFdhTXlK","upper_bound":"V1QwZg==","repeats":1},{"count":1072,"lower_bound":"V1Q2TXBvVmJHRW9wd1JVZVRRUmRuUmtIUXJrSWdBcFVHVlRsbGR3OUZmb0xITjM1dFlHQkFmM1doZGlM","upper_bound":"V2Z5S1cxOE9Uc056SHRKWndVdXByVThKZ0FMeVRxcmY4UWx5VHlwS1FB","repeats":1},{"count":1080,"lower_bound":"V2lGZWpLWVoyaGZYRVJzVFNwTEM3WW12cHdxSTM3TWU5V3ZNMzBQU3gwNHNxWHZTaGNTQk16TEk0cw==","upper_bound":"V29za2RPcUhlUG9JYUkwaE1PZ0JPbVNIbVU1MU9KdE9hZ0k2YjhXbGtD","repeats":1},{"count":1088,"lower_bound":"V3VFb0xqNUVSclB4Y1hhTjBh","upper_bound":"WDBpbkdTaWF6UkFhZFA0dVl3Nk5yRDBRMk9pUDNRek1uYXlpYUg=","repeats":1},{"count":1096,"lower_bound":"WDFyTjdNUlpPdVNwUGdQU3V6aTk=","upper_bound":"WExOaGJtTHNGS3FzZlk=","repeats":1},{"count":1104,"lower_bound":"WE4=","upper_bound":"WFcxRFJwWTVmSDg4TkpSeHJZdGc1SWU=","repeats":1},{"count":1112,"lower_bound":"WGNOZTd0TGQ1UEFLUk5WTGpLeUhsSzVvUlFsamg2SGVPcElqWXpNVHJCeEF3UmpPczg3cw==","upper_bound":"WGpXZkphajJFR2FHWg==","repeats":1},{"count":1120,"lower_bound":"WGw3dkdweFdlRWtXNzFUc25oZjk1ZXhsSEpQSEdFSGhDUkI2d1JLYUNTRTlHY2Z0ZmJVaHBSS3RwTkY4","upper_bound":"WG4=","repeats":1},{"count":1128,"lower_bound":"WHN1UVVUdUFnNEd2MFpObHZ0bG1HQVl0QU4xUA==","upper_bound":"WTdpWmFobGE=","repeats":1},{"count":1136,"lower_bound":"WUZsN09PUzJaM3pCVDVMc21ma0NhQ1Zzc0ZBNVZTY0pIRVFuWHFnSXpSVFNJbXdjcWRkQXJJdVFLT3BZ","upper_bound":"WVNaMVdQdkE=","repeats":1},{"count":1144,"lower_bound":"WVVwOWlURmJ2SE9sbW9LQjZCeVh4Z2lkQWoxc0d3OWVlcFU2dTNOM3FGcUNHcG1RdU9takF1dlU0Q24=","upper_bound":"WWZlUWRqV3h5S0x3cHpUS2M2R0dHWW83V0N2Zk11VlhNSTl6ckRncm9oNmZBQmdNU09sdjQwek8wRVdtMjAxag==","repeats":1},{"count":1152,"lower_bound":"WWxKTW9lcVdOekNraDZFZ1dFQW5aU1IwemhGakE=","upper_bound":"WW45Ym1BV0FLcTZGQUgwN0V0bU5UOTE3SXo=","repeats":1},{"count":1160,"lower_bound":"WXFrd2ZaaVRlWUs=","upper_bound":"WjZXODFoMlZJNXBOZVlxM1FCeDV4cWNQSnN6bEZrd3pKOVBWMndENWpjQkJPeGduVjdSaA==","repeats":1},{"count":1168,"lower_bound":"WkFhd0xQYTNRVHgxRGc4T3FLMEYxMzdoZlJEeXFmamI2U0Y=","upper_bound":"WktUdUdxdUVQZVJsREE0SjQ=","repeats":1},{"count":1176,"lower_bound":"WlBqSkdFRFJ1NE1pdXlYQzhrRloyaWRxOGgyZFVwNFQzRHJ4alVUSEhOUEF2Rzh6SVBpbFp4MWF4eWxmT1ll","upper_bound":"WlZLbmljZ2FvT3JEdDJsT2F2Q2xrelZmdFphS3JkY0ptMjl2","repeats":1},{"count":1184,"lower_bound":"WlgyaWk5SFF1VUFKSEU2","upper_bound":"WmpxT2R2bmNRd3E4d3FLVW0xcEJ1UVp2eGM0T0hRckNaeGtiQmdzVGNta2p1aGVqUTBLYUhrbQ==","repeats":1},{"count":1192,"lower_bound":"Wm9rY25zbXljZkwwbFI2UHZFTk1KWFBWWU9MUTBwVTlvR1NEZldVdnJweTFMVk8xeVNZQU9xeWU2MHo=","upper_bound":"WnhnYVF5SERhakJ3bDRocUh4Zk45N3lrUkZ1Q1dJUkU=","repeats":1},{"count":1200,"lower_bound":"WnlRRGtlRnNYdktxdnhOZ0g3M3gwdVFrVHlLQjR1WThyQUpzbGVhZVc1","upper_bound":"YUVYNVNwOFlUNUg5T25Bd1RmdFR4V2lJaWJSblJOOXJHY3RTUDloZUVtYURsSUdq","repeats":1},{"count":1208,"lower_bound":"YUVYaFFobXJPeERCbnRVOGlJUmNmMGpqZG1yYVdHakZSNE5aNVNo","upper_bound":"YXRaUko5ODVpeHY5WDljVG1Ob3FaUWFTallyaTFIN2lVT3BZa1E1bFFs","repeats":1},{"count":1216,"lower_bound":"YXdRVklJVVVyN2psU2I4T2JwOVhjOA==","upper_bound":"YjFY","repeats":1},{"count":1224,"lower_bound":"YklZbU5R","upper_bound":"YldtNEh5NmRYb2RLSGN3YkdKcw==","repeats":1},{"count":1232,"lower_bound":"YmJuR0ZDbGhoT3ZWc1pmeU40UjkyN3ZhYmd6VXpLTkIzS0JWbndtSmF0M1ZDcFJmdzVudFk=","upper_bound":"Ym44WUJjeG9nSXM=","repeats":1},{"count":1240,"lower_bound":"YnVGNjJlOXMwcWV3MmtVeHZvVTdJRFpQRmFhcEVSbGNGc0VzdHNEeFg=","upper_bound":"Y0lRT01zTGoxdzBsd0hnZmtpTEw5MThlSzRjNVZKTjZCUTRTa0FBQzM3QWMyQlJiSVVrMllPMjU=","repeats":1},{"count":1248,"lower_bound":"Y1dW","upper_bound":"Y1pqOEp6Vjhac1RXSVlGRkZVdjhFSzhjcTRGV0tTVzJqdm44cXVBRGZ0SWZWMUpxV3JPZG1NV0JPc21tZEpxTg==","repeats":1},{"count":1256,"lower_bound":"Y2F5MEI5M0NFNEIwcG1KRkE3QWg3YW9nZVZGeQ==","upper_bound":"Y2R1","repeats":1},{"count":1264,"lower_bound":"Y2xIWWplRXhoSVd2Zm9RZEwzZFpqZ1B0QVRPVWt0ekZyZWQyT2hVZ0dyaWN2cHZuTHlBVW1yRDVibnF4","upper_bound":"ZDB1WVpDeUZrOVppMmM2Y0pIa25MUlZyZ085SVJOaFJRM0hvZUpEOWJEZGYyMlc=","repeats":1},{"count":1272,"lower_bound":"ZDNUVTRzbHQ4OXBzUHN1cGRTY0tzUWo4MWYxREVXdTgz","upper_bound":"ZDk1a25ERk02ZEpYdFlJR1BpMER1YnNBdUdMR0RtQ1QxR3puVlh4bjRyNU1TSVEwbGZhRjlNaXVSTlNiTVRn","repeats":1},{"count":1280,"lower_bound":"ZEhmM21lMEZ6c2pyZkdkdktVSFNLM2VwOFI4M3Q3Y3pwN2YwVUxHR21EM0dMenNVNw==","upper_bound":"ZE9VZ2w1enVuZ2c4QndvVWN1T2RTMFVaUG82aVo5SmRWMHVuUjl2cW9QODhlWVpmWA==","repeats":1},{"count":1288,"lower_bound":"ZFM3ZGZDN09IVzk4N2dGYVpMM3d4R0xYakFqc3NMQTNrMFFtekRycE95SVVEWUhSREhZQ2ZXOGFwUWUy","upper_bound":"ZGd0UmJY","repeats":1},{"count":1296,"lower_bound":"ZG1KUVJpeWJJREhaRG1WRTJrT25BZUJr","upper_bound":"ZQ==","repeats":1},{"count":1304,"lower_bound":"ZTJQM1JrOFlQUUNwV3VvcGRmbw==","upper_bound":"ZUR0bnFaTmRmMVcwZDB0SmtjMDhObUZHVkI2bkNyWHozdjU=","repeats":1},{"count":1312,"lower_bound":"ZUVVNnF0c0pFSVpReVZmWWxVcGxlaEV4T2M0M1A0SEtp","upper_bound":"ZWliZG5kdTRzQnMzbG13cU1wNnYyZXJXZDdnMWlPb3NYUEsyaldRVDZYTDdxdlk0TnI=","repeats":1},{"count":1320,"lower_bound":"ZWxyNlFEdmdKd1g1aUdMZlZJZ0xWbzlwbjFqTnc2VzRTVnpabWZ3WGxVaXZINm5CT1VZalhqZGQ2d0c=","upper_bound":"ZjFEYWk3ZjFxUnRYbHJGenpmMXdFdUNxTzl0VnVSdE5mOURya2NuRFU=","repeats":1},{"count":1328,"lower_bound":"ZmJCSWdyRDJnbUs0","upper_bound":"ZnZqYTJlUGI0aGdLeExwcFJCWGo0","repeats":1},{"count":1336,"lower_bound":"ZndXQ2p6SEEzeG5nZ1VQamZQUks1eG51YkZRRHppQmdKZWVZSzE3TEszS3JYbVJwVmxUWHdJVXI=","upper_bound":"Z01pY1U0RlYya0pYTVBYeUo=","repeats":1},{"count":1344,"lower_bound":"Z09YNVVrUU1FbGJoMEhNY3VXaVlyWHE3SDNwS1g2OEtxTU9UQQ==","upper_bound":"Z1VMZ2daRlZmSGFwdnp4YjRLZEphcDFEeVJ2MXJnaTh0a3dZeUwwS1NiZDU=","repeats":1},{"count":1352,"lower_bound":"Z1Vw","upper_bound":"Z2J1Z0pqR0lhRExMZEFkRE5rWVJmNVFGSUFtbEg0RFc1bzlobDdBeG9uOFlhQ3Q=","repeats":1},{"count":1360,"lower_bound":"Z2lNV21IOW5jM0lqMjZHYVluOEZOQ040MUtFSVQxMllzem0=","upper_bound":"Z3FGem40MGNjR2w4azFLcVdoOHlKWmJmY3hiY1AxRTVvRDlWRkJTYQ==","repeats":1},{"count":1368,"lower_bound":"Z3FYdzY0eUV5eUNJQnFiT3lmaUpOdXBOZDBPaw==","upper_bound":"aDZxSm04cEZYYWZ4b3RBdUdFOVQwcWRZQmNlbE9DUUJB","repeats":1},{"count":1376,"lower_bound":"aEJYUDA4RmxVMmFHTjhVRWZPUHpYbzk4SXRjUzV0YXQ=","upper_bound":"aE1UdlRtYXBOSXQ=","repeats":1},{"count":1384,"lower_bound":"aFFabjFZTkNEajNwZmszRkQ1Y0owUU8=","upper_bound":"aFNjN1lCa2U5UzhIcw==","repeats":1},{"count":1392,"lower_bound":"aFdWNkhiWkUzb05yWnhvNTZLTw==","upper_bound":"aHFiYThuaUdQOVc0SzlGYlNSVw==","repeats":1},{"count":1400,"lower_bound":"aHZhV05VTDJGdUcwZzhHRFZ2dzlSeU10UHlmRkc=","upper_bound":"aTg=","repeats":1},{"count":1408,"lower_bound":"aUNEQUlLVVF1MmpVbVJMSzRwYlVTdEJsTUhyT1c=","upper_bound":"aVFvMVNFQmhBZHA1TWhVeEtLcjhQY1lDQzJzVzN1ajVCUHdqdjFwWjdxR1I5dzlOanVI","repeats":1},{"count":1416,"lower_bound":"aVM0bnh6T1FyTWpTdkJsaW9YaHZhZkljQ1NSclk=","upper_bound":"aWd2NTRhT0E2b0FmWjlkdnVLWTBpWFQ4TmRidXVEZ0JkSDM5dEJsT3VmM1VaNlg=","repeats":1},{"count":1424,"lower_bound":"aW5SajdqTzg1WjJ6bm5NVjFPUFNpWUlybUxyRTBlMWxORUxKTnhGY056UkY=","upper_bound":"aXY5MFg1Y0lLY3FWbzQ1R2VWc2MyM3ZQUEJVUmExaE1CUg==","repeats":1},{"count":1432,"lower_bound":"aXZEWExMZ1dpVktWZlR4bng1ZVQ=","upper_bound":"ajNiSG5Cb0Y0V2JMemJkZ2swZ0pGSWhkUENqYlNFQ0xVdjNrdEh2RDJaT0p2YQ==","repeats":1},{"count":1440,"lower_bound":"ajRUNkdMdURzWDNkSzFmekpyRGVsZTJobkpvM1BKMA==","upper_bound":"ajdWSGJrZEpCZTBDcjFocFBIbXkyOVA=","repeats":1},{"count":1448,"lower_bound":"akFXdlJUcnRuM1JuMVg0VHU0ZXlxbHc1cGlBRnA3VFpJcmdUMGExek9lY25M","upper_bound":"akRlVDA=","repeats":1},{"count":1456,"lower_bound":"akozYjk2U3BiWGd0dEJWdEFpUkR6Vld5bG8=","upper_bound":"amtQYmpBS01ESDB6b1VwSjlzTzlsVEUyRFBIckN3bGQ4UXZhUzhJUUZyZ0ZyQnZ5Vmg=","repeats":1},{"count":1464,"lower_bound":"am04aFNodWxNd2E3V2xoT29KdHZFQjV2bw==","upper_bound":"azFqQzBqaTRwclllcEVMZEpJS0tuajY2V3VjS2tHaXVnckIyNDBQMXhrTkNwVzdYbmtoSm80OFhMUWQ=","repeats":1},{"count":1472,"lower_bound":"a0FEN0c0YUF4TWdQR0lkNDQzRURISHBzREJZc3NCZXV3QQ==","upper_bound":"a1RKb2hsU1c0SDlmclJBakJISE8=","repeats":1},{"count":1480,"lower_bound":"a2JKeFdldElCNG9qemdvSVRaQ2ZLeDJUOHFRM1I=","upper_bound":"a2p5SjdHcWZhR0F4eUpybFE0YllnaVlnMEpreTJzV1NJZU8zYmJZeHUyS1lpcnZpM0V0TDJIMVBMVk9w","repeats":1},{"count":1488,"lower_bound":"a29ENDdMNW03WTRVZkVzdTJFN2xRendYWVJsQ1JyTFV2aXpjaWlLWmhzR1BpVkJlblZTYU5P","upper_bound":"a3ZucHVGZg==","repeats":1},{"count":1496,"lower_bound":"bDJBMWRaemJqYzNMZ2wyb3dBWWF1M2xDYmEzNUtzQ2FJUVg2RlFrUHBSWWUwZnVsZW80czhnbQ==","upper_bound":"bDdQeEIwN1kyaTZOT2JpNlNMZm0wSnBBSHJpTnZSdkQxMWZzTnZleVRkTG5Wemk3Mmk=","repeats":1},{"count":1504,"lower_bound":"bDhjeG41WGtr","upper_bound":"bExtVHhWT203dEZQNnA=","repeats":1},{"count":1512,"lower_bound":"bFR4VXdZNDc3Y0RvYkVwZUh4dEQxSmZpZWF3czgzRkV2SXBPRkRuSlF5dnhiZDRVVk9QMDFrNFdHaA==","upper_bound":"bGVieFF2dkpweEt1T005czJIUHFIR1RVc1pCTTROMFJpV3hUUFBFMDA4UGNiQm1sSVNCd2wwMmtQZkplQg==","repeats":1},{"count":1520,"lower_bound":"bGZDOG1YZ1VQWHJFV3ZX","upper_bound":"bHdxeFhhN1ZGTng5TmswTkNuOGhZcg==","repeats":1},{"count":1528,"lower_bound":"bHhneG5jYkc0NTdMSE9reGFT","upper_bound":"bTN2cmlMYzYwelBSTUNSSVM3S3hxU1JmNVVDMlZLTGdSNFA1SklC","repeats":1},{"count":1536,"lower_bound":"bUY3MEh5R3Vibkx4cFZjZEZuS1V1SDR3S1FjWkdLNw==","upper_bound":"bVEzak94V2MyTlN5RkNJckgxcGc=","repeats":1},{"count":1544,"lower_bound":"bVI1SWxMSzRXcmptYUNIZUNzalcxaDRvRnd4VGpJM0trUEZiaDRKelN4Qmps","upper_bound":"bWIxMDRVWjJoeG02WVAzaGhxMzR2djd2Zm1vQUtvc3dsTGxiUGxjazBi","repeats":1},{"count":1552,"lower_bound":"bWM5Z3JWNUMzVGVDUjVNZW5hUkFkT0Z5cjBhWGppMWJ3dlBOMlBMMnN5MFY3bmcxTndxckl6dkpuUWplYw==","upper_bound":"bWhMb2FXZGlpSFNsUUFaeUdybVpWOElTZ3J6c1pwMnpk","repeats":1},{"count":1560,"lower_bound":"bXFBYmlsdHhZZnlBSndG","upper_bound":"bXR2SDlQUFA2TE55bnV0dA==","repeats":1},{"count":1568,"lower_bound":"bXYwZnZlazRrbUhlakRJcDc5eEQ1dnhPMnREUktCZGFMMkxCb21oWnNBV1NBOEtRYWJFQXNKQ2FXRA==","upper_bound":"bjFFVDRCMEtuY3F1ZXhFdFNSQWM0bFpMeA==","repeats":1},{"count":1576,"lower_bound":"bkJVVlpoRGxmOHJyeU5MUjY0RDFDcmo2TmdpWk0=","upper_bound":"blBCRDJDZlpReldOUUJ1NTE=","repeats":1},{"count":1584,"lower_bound":"blFoOEdzdA==","upper_bound":"blJ1cFVHTE9hWmNpNEU0S2ZDOG9jN2dGZGs=","repeats":1},{"count":1592,"lower_bound":"blN6bFBCQ1k5YjMyRDltVk9ZSjNtc3RlY0x3UE5pNENPTUVDeFhyRkZhVHl5TkNUS1NrWkZQV3JiWA==","upper_bound":"bldYejRUT3BNWFlnYTRaanZOTg==","repeats":1},{"count":1600,"lower_bound":"bldhZ0J0bm9ucVkzY2F5QlpLanpScw==","upper_bound":"bmZJRXRaYzNQODQyM2h5VEhWRUdLY25uTk51ZFFLV1gwb3ljaXZrZ1k5YzZzcmltdw==","repeats":1},{"count":1608,"lower_bound":"bmcxcFFjTElENkpkSXZpVU5CVWZz","upper_bound":"bmpGOFR1bHI5TmwzTXh1M01md0xrc292UndEUU9TZEd5ZzlGUUVvYnZMMmEzUFZLdExBZkpQcHdWd2hnVQ==","repeats":1},{"count":1616,"lower_bound":"bm9yOFY0bWp0NGdYNUJNSTFFRFFk","upper_bound":"bnNiNXVJd2dKUzI1b3hUU2pDM2ttM3lENXQ2SFBzNVhoYmRjQWtwTTBhaE1objlaOVB0c1RXeFVVMGtIZ2g=","repeats":1},{"count":1624,"lower_bound":"bnRaUFdZalozOHVE","upper_bound":"bzdUSDV0c2ttTWdJdFJXWVl2YU1qbU1QNXg5czcybVVoUmR6MTVGYnIxcmJ6ZFR1aGNGekRNa1JRaG5IRnp2dA==","repeats":1},{"count":1632,"lower_bound":"b0JhaEJ4ZFVLU1B5ZjRRYUlDUURaMGVIZlBSY2FQMw==","upper_bound":"b0lodDVQZFI1ZjFrRzRXVndpWnFjTEV4M2E1N2hVUGVQWnVlYWc4Tjg0SnF5STNrWWhMSHZ2VDNoQkJrV2VHQw==","repeats":1},{"count":1640,"lower_bound":"b0l0YjhadXRvZEJ2UFJiM3Y5UXZjMDh6S2xoM1NC","upper_bound":"b1Njdjgzb1lhanR5bjRUOEhiRzhsc1NaRXFwMnh4NnVaM0U=","repeats":1},{"count":1648,"lower_bound":"b1h0THZ2ZA==","upper_bound":"b3JROW1jZ1pHNnNnSVJqeQ==","repeats":1},{"count":1656,"lower_bound":"b3N0ME1POVRoeFhiM0FTUGVScXIyYnNrSg==","upper_bound":"cDhHcllTSDRPVnFTbGZBanNBd1I=","repeats":1},{"count":1664,"lower_bound":"cDlHa2w3MEZ6","upper_bound":"cElYa1dHU0RKR2Uyd2hv","repeats":1},{"count":1672,"lower_bound":"cEpmVlZ1dktQRkFZS212N3VObFQ=","upper_bound":"cGF0ZmZ5TDBHUG9GZ0lISFBqbWNYNERYclZHUzk=","repeats":1},{"count":1680,"lower_bound":"cGJGUk5ja0FRd1JzTGlRbko5bmE4ZVZEUWNHejFVTjc=","upper_bound":"cHFDa0JMWUxOeFRITkZNc1p5TEtSMGwwekVsVWcwb1duTTRFb0pVbEhkUWFudnNlTFZCeEJjT2t0UQ==","repeats":1},{"count":1688,"lower_bound":"cHpTTzNuUjdGMjBudXIzUWNBTlBGc3I3WXY2NElRb0lhVHAybUdubWV4","upper_bound":"cUFNUGhRNnYyWDBCd3ZVS0VBMGtUeURiNnd4ajZFNGg=","repeats":1},{"count":1696,"lower_bound":"cUM4YVFUbENEZ2Z2OWNnT2VlSUZzMlZqczc5SXNMRkNCMThKeUlySEZsZGpDVDY1NUtrU1Vi","upper_bound":"cUhwandXSU1jN3g4b3JSSWFCTDJ5","repeats":1},{"count":1704,"lower_bound":"cUlUYnBaUmRUMUJFc2p5QWs=","upper_bound":"cVhaTmRxWHhGN2w2UjZhUA==","repeats":1},{"count":1712,"lower_bound":"cVpwSFMwQjZqMWNrNk94VGl5OUF2ZjR5UmU5aUJxWXo3NlBpdDVuanQ=","upper_bound":"cXJsTA==","repeats":1},{"count":1720,"lower_bound":"cXQwVm5ld2ZWMkwzT0dnMklaM0hVa1JybE9CcEdEOHlqTUdmVm45b0ZWU0RWVmJNamFoM3djekQ2MDJVa2s=","upper_bound":"ckdXT1ZQTmoyNGxLdVdPd0ZoeTc2ZE84bzRObjB1TU5tSWdhYnl0QXNTaXFUUFNndkRaZ0NVdHlQYVB0","repeats":1},{"count":1728,"lower_bound":"cklId3FCOWJVeGVzdDNLR2xQRFBRMmdnaVF6Rk9IeXgxZFFVV1BQaW02bWV2dmE0NXFkVW4=","upper_bound":"cmQwU1BNdlV5SmhmNDZmRm9PWGF5Mw==","repeats":1},{"count":1736,"lower_bound":"cmR2aWlnYg==","upper_bound":"cnU0dXRGUW9pOTQ1c2NCQWNma2lXRG96aEFMZ25pMzdlVlNxbXg3Q0UwT3pFMnVGeGVVSlN5","repeats":1},{"count":1744,"lower_bound":"czVQYjUwblZu","upper_bound":"c0NOREl4cjUxdFpiYjJkemI2ZmN5WXQ5UHRyZjc2NGtPY1FQ","repeats":1},{"count":1752,"lower_bound":"c0c1c3V6cFdBNG5TaVlLTTgxUUNpWnFrU3E4QmFnYWxTNnhoRkhUUmhoY1Q=","upper_bound":"c0tCTURUOEEwUlc0bW5QcUhxTXNZSjZYNjhjRVB6dDhZVjJPRHp2VW0=","repeats":1},{"count":1760,"lower_bound":"c1NxSlBnbnA0SXpFZG9nYThiV25YRDdOU1FvbGowUE9CcHFNeWU5ODJBemhnN0xpbg==","upper_bound":"c2hTb0lpZ3VaNHZvZDJGZVl0UmhjVTZpdE84bkRjcTN5clJva0ZmSld4UHgzOWdxZno2VW1JTTBj","repeats":1},{"count":1768,"lower_bound":"c2xDcjVhcg==","upper_bound":"c3E1T09wZktySHlmYzgzWjZWbjVNaXhydWZyaUVqSjBJbGNiSQ==","repeats":1},{"count":1776,"lower_bound":"c3J3dHR5cjdFMXQyODI1RHBLOWJnODlHNG9OUWxpT0FYQnFxSQ==","upper_bound":"c3dwY3c2S3JKSHo=","repeats":1},{"count":1784,"lower_bound":"dDFoa3N6WUo3S1k1dTVWWTUxY3J0MTA2amFhMWlDelF2cWRneVNiVGNud1NYSjNOcEZneUtQbWl1Yk0xWg==","upper_bound":"dEFUa0NxYjJ3Zm5QblQxZThwQw==","repeats":1},{"count":1792,"lower_bound":"dEprTFltZ0M4Ng==","upper_bound":"dGRHaHpDc1pPVEhWNkpPOFFDOGszbFlmOFg=","repeats":1},{"count":1800,"lower_bound":"dGhSaldtN1pzWDg1a3dId3J5SmVDTUJrb1k1VQ==","upper_bound":"dHRmWkNRbFRPbzNyOFBTRkJFcmNDdm02elVXU0dxQ0Juc3M4d2VmV21hbFBCcEVrYXVXSVdBMTZrWDg=","repeats":1},{"count":1808,"lower_bound":"dHVLMTVJTWhGYVRuNUJ5bU1PdkpicVBiaWlXTUhnTWlMbnRUdEgwaA==","upper_bound":"dTZhcThFWFpHSlcyRlIydktaSzJ5NTZGb3FrOVlBNDdnZmNwSjA3RzQ=","repeats":1},{"count":1816,"lower_bound":"dTdGMWFPamljcDQzSEhwQzZzaFlWM0N5TVRyUA==","upper_bound":"dUMwdlJsWmQ5Tnprdk5RNjJFU0NTM3l0aThzdG1LSklRWnAxMU1FN1MzdHR4Tg==","repeats":1},{"count":1824,"lower_bound":"dVBTUUhwaFpvQ3dKR0xkb0RBWWpOSklYdWJOVExONGQ3MHQ=","upper_bound":"dVQ5a0d0Mm9qQ1JQb0w4T0pWdUlxcGpvTDYx","repeats":1},{"count":1832,"lower_bound":"dVlza1FUdm1TYVg4TGlTWkw4bG1FbEk=","upper_bound":"dXBGNXk2VUVIVllPclZRQnRZZUF1SA==","repeats":1},{"count":1840,"lower_bound":"dXVtTnBCdmZxR2JkSk1ITGoxcUJmcXcxWGNkRGhkRXdo","upper_bound":"djFiVWloT1lGdExXMWN6c0l5WXFZRFR2NXFkcjRPdHY2ZHZMRWNNRWl3Rg==","repeats":1},{"count":1848,"lower_bound":"djF5UlRqbnNGVmJJWkVvNUp0SUhrUDR6SG95ZjRHc25wNDVTdXpVeXBhZw==","upper_bound":"dkgxYU90OE0=","repeats":1},{"count":1856,"lower_bound":"dk15VWJ2MDBVNTF3N01EMFdsSkdZS1VBamtVdjJDSlRNd1JlTHlIOE43NDB0aVZ3SjVzWGhPSw==","upper_bound":"dlZFNm1ia0kyVlVZSmE1TW1pdDhlZVY5eHo4Uw==","repeats":1},{"count":1864,"lower_bound":"dmJyUlpiTThodDF3OGxHak1kSQ==","upper_bound":"dnh2Q0JrU05ieDM=","repeats":1},{"count":1872,"lower_bound":"dzAxdXVta29QSmRINVBuVlZQWnpvR3Q5eG9yaml4","upper_bound":"dzJPY1NuUWxtR2k2SHc=","repeats":1},{"count":1880,"lower_bound":"dzZvZU9Pa3M=","upper_bound":"d0lJOGJKWDh1RmtnMG9jSFh1RWMw","repeats":1},{"count":1888,"lower_bound":"d0x5WFc5QkZWcjRKSGwyMHpreXpOOFI=","upper_bound":"d1ozUmdaVk5LRDh1cElrZ3N4WUd4NjNF","repeats":1},{"count":1896,"lower_bound":"d2FBMVNwc2Q0a2lKNUFtS1lQRzR1VjlQWnVXb1Z1MlNodHJZU3NjVA==","upper_bound":"d2NvczJtQmg=","repeats":1},{"count":1904,"lower_bound":"d2N3Y2tVbkxJ","upper_bound":"d296a2Y1UHRlejJnaW5wNDdTNm0xRUlWVjRvbDIzOTNLVWNidDNPOWFTeQ==","repeats":1},{"count":1912,"lower_bound":"d3ZOMWlxcDhKb2hEaEZJN1pIY08yRm43WQ==","upper_bound":"eA==","repeats":1},{"count":1920,"lower_bound":"eDIycDh3OW5CeGtDdnBjM3RMTllPOWRXSHFPWUxBSGlHMXpNVHdVbg==","upper_bound":"eE1WcjFwc1k2bkhaek5rd284YTQxZTdBMnNSb2hJZ1RWTUNEb3VhMmQ=","repeats":1},{"count":1928,"lower_bound":"eFVsaXVMYW9XSHFZQ3BnUW8=","upper_bound":"eGFiUHlGZ095TmY4VngxQ0dSeGFmeGJHZ0QzSXRUNnZWcmpRZk55eDRkTmFieFlLQUxhNnhW","repeats":1},{"count":1936,"lower_bound":"eGF5RU5oMnprMg==","upper_bound":"eHNQd200VkM4ZHJ1T1hGZjZaYWNkdkI4S1ZkQm95RjF5YXpMcE53NEZDUE9xaGpJQ1JOaGU1dk40ZmxIMDZzYw==","repeats":1},{"count":1944,"lower_bound":"eHNRaHgxTGxCYWxMVUV6d3ZVUWVQSFd4N01BamhYVElvRHpKSGV1SXFSS3NuT0pPNFNSZXlYa3R5d1NUSA==","upper_bound":"eUIwR1dqMEhwdm9neDBDcmZIaU1xTUlmWEg=","repeats":1},{"count":1952,"lower_bound":"eUdsRmJKUzFQOWpTN3VteFU1NVU1amZZVHluMmIyY256WlBrUDlz","upper_bound":"eUlCZnVKeEszSFBs","repeats":1},{"count":1960,"lower_bound":"eUtVQ3JETHFLWE50N3RlR3RCTWE2UzBqeEtXSU1vdXhhN3dZZ29OeVJLNm5EYktzN21Jcmh0cVFrVlhj","upper_bound":"eWtMZ25YRGZZSjFPeVNpOGRDV1NyeGRWaUNLOWo1dEtDZWZaZURSaTVWYU82NTA4ZlJIYU5EQXRZVWVxVg==","repeats":1},{"count":1968,"lower_bound":"eWtuQVg3NWU=","upper_bound":"eXhwY05MNGlaZjRvVGc2WFU2YVlPU1dlQnB0OGNa","repeats":1},{"count":1976,"lower_bound":"eXp3azhZZTRZZjY5OFI3SWtjNXRxM04ydDVuQXg2clI=","upper_bound":"ekZJR2R1RnpqSXVWcU5qM3JQNmFMUGtzc1RSZVAwQWZVaEpVbUdGS0RobQ==","repeats":1},{"count":1984,"lower_bound":"ekpBUG5TYURYRzNn","upper_bound":"elFEOVRZeTBVSTBBaThmS2R4VGJ4Nlh6aWVwWmhMMmh2ZXNSZGJsbWJVNE9obDE=","repeats":1},{"count":1992,"lower_bound":"elJudElTeGFhR3ZqVTZMa0hMd0hrclhib3FIbHphQTlGYVBzcFpUN2NZTlcyRXNpeHBycnZjYzZUWWVmSm1RRQ==","upper_bound":"emV5QU9MNEJndTh3bVpSVEFkQTBWRTV0","repeats":1},{"count":2000,"lower_bound":"emYwRjRKOEpaTmM1ejI3U3o4UTNuNWx3N29TeEptUlJJWXJSM2pYUUtCSWxuRVhabVlaVURxZkIwTWVWc2NFaQ==","upper_bound":"endjVlBJUHJXSEJseVgyVTR3ZFg=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,3,0,1,0,1,1,3,0,0,2,1,6,2,0,0,0,1,2,3,1,2,3,2,0,1,2,2,0,2,1,3,2,1,1,0,1,0,0,4,2,2,1,0,0,0,0,1,1,0,2,1,0,0,0,1,3,0,1,2,2,1,2,0,0,2,0,1,0,0,2,0,1,1,0,1,3,1,1,2,1,0,0,0,2,1,0,3,0,1,0,2,1,0,2,2,0,1,0,1,0,2,2,1,1,0,1,1,4,2,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,2,0,0,2,1,1,0,1,2,2,1,2,1,0,1,1,0,1,0,1,1,1,1,2,1,0,3,0,1,2,0,1,1,0,0,0,2,1,0,2,1,1,0,2,0,0,2,0,0,2,1,2,2,3,0,0,1,2,2,1,1,0,0,1,0,2,0,1,1,0,1,2,0,0,1,1,0,1,1,0,2,3,2,1,4,3,0,0,0,1,0,1,0,0,3,0,1,0,0,1,0,3,0,0,1,1,2,4,2,1,0,2,0,0,0,4,1,0,1,1,1,0,1,2,0,2,2,1,0,2,0,1,1,1,0,1,3,1,0,1,1,0,1,1,0,0,0,0,3,0,0,1,1,0,3,0,1,2,0,1,0,0,1,1,2,3,1,0,2,2,1,0,1,2,2,2,1,1,1,2,4,0,0,0,1,0,1,0,2,4,1,1,1,1,1,0,0,0,0,1,1,3,1,0,4,3,1,2,3,0,0,1,0,0,0,0,0,2,2,1,1,2,0,1,0,1,1,0,1,2,0,2,2,2,0,1,1,1,0,2,0,0,1,0,0,2,0,0,2,1,0,0,0,1,2,1,1,1,0,0,1,0,0,0,0,1,0,0,2,0,1,0,0,2,1,0,2,1,1,2,1,2,1,1,0,0,0,1,1,0,3,0,2,0,1,0,0,2,1,0,1,1,1,0,1,2,2,0,0,0,1,1,1,2,0,1,2,0,1,0,1,1,1,0,2,1,1,0,0,0,0,0,1,0,3,1,0,1,2,0,0,3,1,0,0,2,1,0,0,1,1,1,1,0,0,2,0,1,1,1,1,1,1,3,1,1,2,0,1,1,0,0,1,1,0,1,1,0,3,1,1,0,0,1,2,1,3,1,4,1,3,0,2,1,1,4,2,3,4,3,3,2,1,2,1,1,0,2,2,0,0,0,2,2,0,0,0,2,2,1,2,0,1,0,0,0,1,0,1,0,1,0,3,2,0,2,0,0,1,0,0,0,1,1,0,4,1,1,2,1,1,1,1,2,1,2,1,0,2,1,0,2,0,2,4,0,2,0,1,0,1,1,1,1,1,1,1,1,1,1,4,1,0,0,0,1,1,2,2,1,1,0,0,0,2,1,0,1,0,0,0,0,0,1,0,2,1,0,3,0,3,0,2,0,1,3,1,0,2,1,0,1,1,1,0,1,0,0,1,1,1,2,0,0,0,0,1,1,2,1,1,1,1,3,0,0,0,1,2,3,2,1,1,0,1,0,0,1,0,0,0,1,0,1,3,0,0,0,0,0,2,2,0,1,0,1,0,1,0,0,2,1,0,1,0,0,1,0,1,0,2,3,1,1,2,2,1,1,1,0,1,1,0,1,2,1,1,0,1,2,0,2,1,1,0,1,0,1,0,0,3,1,1,0,2,0,0,1,0,1,0,2,1,0,0,0,1,2,0,2,1,1,2,2,0,2,1,1,2,2,3,1,1,0,1,1,0,0,0,1,0,1,2,1,1,1,2,2,1,1,1,0,2,2,1,3,0,3,1,1,3,1,2,0,0,3,1,1,1,1,1,1,2,1,0,0,2,2,1,0,0,0,1,1,1,3,0,1,0,0,0,0,0,0,2,1,0,1,0,0,1,1,0,2,0,2,1,2,2,2,1,1,2,2,1,0,2,1,0,1,1,1,1,0,0,2,1,4,2,1,2,1,2,0,0,0,0,1,2,0,0,1,1,0,1,1,1,0,0,2,0,0,1,2,1,1,0,3,0,1,1,1,1,0,1,0,1,0,1,1,0,1,0,0,1,1,0,0,0,3,2,1,1,1,4,0,1,1,1,2,0,1,0,1,0,2,2,0,2,2,1,1,2,0,0,4,0,1,0,1,1,1,1,1,0,2,3,0,2,0,2,0,0,0,1,0,1,3,2,1,0,2,1,1,3,0,1,1,1,0,3,2,1,2,2,3,2,2,0,2,0,2,1,0,1,0,1,1,3,0,0,1,1,0,3,0,1,1,0,1,0,1,1,2,0,1,0,1,2,1,0,2,0,0,2,2,3,0,3,0,1,0,4,0,1,1,4,3,1,0,4,0,1,1,1,2,0,0,3,1,1,1,3,1,2,1,1,0,1,1,0,1,0,1,1,0,0,0,2,0,0,0,1,0,1,1,0,0,1,0,2,0,1,3,0,1,1,2,3,0,0,1,2,1,1,0,2,0,2,0,0,0,1,0,1,1,0,0,1,1,0,0,1,2,0,3,2,3,0,3,1,4,2,1,1,2,0,2,1,3,1,1,1,0,0,0,2,0,1,2,2,3,0,1,1,0,3,0,1,1,0,1,1,0,2,2,0,1,1,0,1,2,1,1,0,1,1,1,1,2,2,2,1,0,1,1,1,0,0,0,1,1,0,1,1,0,1,0,1,2,1,1,1,2,0,1,0,0,1,2,1,0,2,1,1,1,1,0,1,0,1,1,0,1,0,1,0,0,2,1,2,1,3,0,1,1,1,1,0,0,1,1,1,2,0,2,1,1,1,0,1,1,1,1,1,0,2,1,2,1,0,0,0,0,1,1,1,0,1,0,1,1,2,2,2,0,0,0,1,1,0,0,1,1,2,0,2,0,1,1,0,0,0,1,1,2,0,1,0,1,0,0,1,1,2,1,0,0,0,0,4,0,1,0,0,0,3,0,1,0,0,0,2,2,0,1,2,0,0,1,0,1,0,0,0,0,0,2,2,0,2,1,2,1,1,0,0,1,1,1,1,0,0,0,2,0,1,0,1,0,1,0,0,0,0,0,1,2,0,0,2,1,1,3,0,4,1,1,2,5,0,1,0,1,1,2,0,4,1,1,4,0,2,1,0,0,0,0,1,0,1,0,4,1,0,3,0,1,1,0,2,2,0,0,1,1,3,2,3,1,2,2,1,0,0,1,0,3,2,0,1,1,2,0,0,2,2,3,0,1,1,3,1,2,0,0,0,0,0,1,0,0,2,2,1,2,1,1,0,0,1,2,2,0,1,1,1,1,3,1,0,1,1,2,1,0,2,1,2,3,0,0,0,0,0,2,0,1,0,0,1,1,2,1,1,0,1,2,0,0,1,2,2,0,0,2,0,0,1,2,3,0,1,0,1,1,0,1,1,1,1,3,4,2,1,1,0,1,0,1,1,3,2,1,2,1,0,2,0,4,0,3,3,1,1,1,3,0,1,2,2,1,0,0,3,0,0,1,2,0,1,1,0,0,0,1,1,0,2,3,0,1,0,1,2,1,1,1,0,1,1,2,0,0,1,0,1,0,1,0,0,1,1,1,1,3,0,0,0,0,2,0,0,1,1,1,1,1,2,1,1,0,3,0,3,3,1,1,2,1,0,1,1,1,2,1,2,2,1,0,2,3,1,1,0,1,1,0,0,1,1,1,0,2,2,1,2,2,1,2,4,2,0,1,0,0,0,1,3,1,1,1,0,0,0,1,0,1,0,0,3,0,3,0,2,1,0,1,1,1,0,0,1,0,1,1,1,2,0,1,3,0,0,2,1,0,0,0,0,1,3,2,2,2,0,0,0,3,3,0,1,0,1,1,3,1,0,1,2,0,1,2,1,2,0,1,1,1,2,1,0,2,1,0,1,1,1,1,1,0,3,0,0,0,2,1,0,4,0,0,1,0,0,2,0,0,1,0,0,0,0,0,0,1,3,1,1,0,3,1,4,2,2,1,3,0,0,1,1,0,1,1,1,1,0,2,1,1,0,2,0,0,1,0,2,2,3,3,1,0,0,1,0,2,2,0,3,0,0,0,0,0,1,0,0,2,1,1,1,1,1,1,0,0,1,0,1,0,1,1,1,1,0,1,1,2,0,1,1,3,0,2,1,0,1,1,0,2,0,0,3,0,3,0,2,1,1,2,0,1,0,0,0,0,0,1,2,0,0,0,1,0,2,3,0,1,0,0,2,1,1,1,0,0,2,0,0,0,0,2,1,3,3,0,1,1,1,1,3,0,1,1,3,0,2,1,0,0,0,0,1,1,3,1,2,0,2,0,0,1,1,0,0,2,0,0,0,0,0,0,3,1,1,1,2,1,0,2,2,1,2,0,0,1,0,1,0,0,2,3,2,1,0,0,0,1,2,1,1,2,1,2,1,2,1,0,0,2,0,2,2,1,1,4,1,0,2,1,2,0,2,2,2,0,0,1,1,1,2,1,1,1,4,0,0,3,2,0,0,1,1,1,0,0,1,0,2,1,1,3,1,2,1,1,1,0,1,2,1,1,2,0,2,0,2,2,1,0,0,1,0,3,1,3,1,1,3,1,1,0,0,1,1,0,2,3,2,0,1]},{"counters":[2,3,0,1,0,0,1,3,0,2,2,0,0,0,1,2,2,0,2,3,1,3,2,0,0,3,1,1,0,2,1,0,0,0,2,1,0,0,0,0,0,0,1,0,1,1,0,1,1,0,2,1,0,0,1,2,0,2,0,1,0,0,0,0,1,1,4,4,1,0,2,1,1,0,2,0,2,3,1,2,1,0,2,3,0,0,1,1,1,0,0,1,0,0,1,2,0,0,0,1,1,0,1,0,0,2,1,3,0,0,3,2,0,1,3,0,1,0,1,0,2,0,2,0,0,3,0,1,2,0,1,1,1,2,0,1,1,2,2,1,0,1,1,0,0,3,0,1,1,0,0,1,1,1,0,4,1,4,0,0,2,0,0,1,0,0,0,2,1,2,2,1,0,1,0,0,0,1,0,1,1,0,1,2,1,0,1,1,0,1,1,1,0,0,2,1,2,0,1,0,2,1,1,0,0,0,1,2,1,1,1,1,2,4,4,1,0,0,2,1,1,0,1,1,1,1,1,1,1,2,1,3,1,2,0,0,0,0,0,1,0,0,0,3,2,0,0,2,0,1,0,0,2,2,2,2,1,1,4,1,0,1,0,2,1,0,1,0,1,1,2,1,1,1,1,0,1,0,3,4,3,2,0,0,0,1,1,0,1,2,0,0,2,2,1,1,2,2,0,0,2,0,1,0,0,3,0,1,2,0,2,2,0,3,1,2,2,0,1,1,2,4,1,0,0,0,0,0,1,0,1,0,1,0,0,2,1,0,0,2,1,0,1,1,0,1,0,2,2,2,1,2,1,3,0,0,5,0,2,2,1,1,1,0,0,0,1,1,0,1,0,0,1,1,0,1,2,1,1,1,2,0,2,1,1,1,2,1,2,1,2,1,0,0,1,2,2,0,1,0,3,1,1,1,0,2,0,1,2,1,3,2,0,1,1,2,2,0,0,1,1,0,2,2,0,3,0,0,2,1,1,1,2,1,1,0,0,2,0,2,0,1,0,0,0,0,0,1,2,1,2,0,0,2,1,0,1,0,1,0,0,0,0,3,1,1,1,1,2,0,2,1,0,1,0,0,1,0,2,0,2,0,0,1,1,2,0,1,2,2,2,0,1,1,0,0,0,2,2,1,1,0,1,1,1,2,1,0,1,1,2,0,1,0,0,0,0,0,0,2,0,1,0,1,0,3,0,2,0,0,0,0,2,1,0,1,1,0,0,0,1,0,2,1,2,0,1,1,1,3,1,1,3,0,1,1,1,2,1,0,2,0,1,0,0,1,0,0,3,0,2,1,0,1,0,1,0,0,1,1,1,1,1,0,0,2,0,3,1,0,2,0,0,1,0,2,1,0,1,2,0,1,1,1,0,0,3,2,0,0,1,1,1,1,0,0,0,0,0,3,0,0,1,0,3,3,2,0,0,0,0,0,1,1,1,1,0,1,2,2,1,1,0,1,0,1,0,3,2,2,1,0,1,0,1,3,2,0,0,1,0,1,3,1,0,0,0,0,0,0,1,2,2,0,1,0,1,1,2,1,2,0,1,0,0,0,3,1,0,1,1,2,0,0,3,2,0,0,1,0,4,2,0,2,0,0,0,2,0,0,0,1,0,0,0,1,0,0,1,0,0,2,2,1,0,2,3,0,3,2,0,2,1,2,0,1,2,2,2,1,2,1,1,3,3,2,3,1,1,1,2,2,1,1,1,0,0,0,0,1,0,1,1,1,1,2,0,0,1,1,2,0,3,1,1,1,1,1,1,0,0,1,0,0,0,1,1,1,1,0,3,0,2,1,3,2,0,0,2,1,4,2,1,0,1,1,1,1,2,0,1,0,2,2,1,1,0,2,1,1,1,0,0,0,2,0,4,1,1,2,1,0,0,1,2,2,1,3,0,0,0,1,3,1,0,2,0,2,2,3,1,0,1,1,1,0,1,0,1,2,0,0,0,3,0,0,0,2,3,1,0,0,1,0,1,0,0,2,1,4,3,2,1,0,0,0,1,2,1,1,3,0,1,0,2,1,0,1,1,1,1,3,1,0,2,1,0,0,0,1,1,0,1,2,1,0,3,2,1,1,0,3,0,2,0,0,2,1,0,0,1,0,3,1,1,1,0,0,2,1,2,1,1,0,0,1,1,2,1,0,0,3,2,2,2,1,2,0,0,0,0,1,1,0,0,0,0,1,0,2,1,0,0,3,1,2,1,1,0,2,0,1,2,2,0,0,0,1,1,0,0,2,2,2,0,0,1,0,1,2,4,1,2,2,2,0,1,3,1,2,2,0,2,0,0,1,1,0,3,0,0,3,1,1,2,0,3,0,1,3,2,1,2,1,0,1,0,1,1,2,2,1,0,0,1,0,1,1,0,0,2,2,1,0,3,1,1,1,2,1,3,3,3,0,2,3,1,0,0,0,3,0,0,1,3,2,2,0,1,2,0,3,0,0,0,0,2,1,0,1,1,0,0,2,0,3,0,0,1,1,3,1,0,1,2,1,2,0,0,1,2,2,0,2,1,0,0,1,1,1,1,1,0,1,6,0,0,0,0,1,0,3,1,1,0,2,3,3,2,1,3,1,1,1,0,2,0,0,1,4,0,1,1,0,2,0,0,1,1,1,0,0,0,1,1,2,2,1,1,0,0,1,0,0,1,1,0,0,1,2,0,2,0,1,0,1,0,1,1,1,1,2,2,1,0,0,1,1,0,1,0,3,0,2,0,0,1,3,3,0,0,1,0,0,2,0,2,1,0,0,1,2,1,2,0,0,3,1,3,2,1,1,1,0,2,2,2,1,1,1,0,2,2,1,1,1,2,1,0,0,2,0,0,1,1,1,1,2,2,0,0,0,0,0,1,3,1,1,2,1,1,2,1,0,0,0,2,3,0,2,0,1,1,2,1,2,3,1,0,1,0,0,2,1,1,0,2,1,2,0,1,1,1,1,2,0,1,1,0,1,0,0,3,0,0,0,2,0,1,2,1,1,1,1,1,0,1,0,2,1,2,0,0,1,0,1,0,3,1,2,1,2,2,1,1,0,2,0,1,5,1,3,0,1,2,1,0,1,0,0,1,0,1,0,0,0,0,0,0,0,2,1,1,0,1,3,1,1,0,1,1,2,1,1,2,1,2,0,0,2,2,1,0,3,1,2,2,0,1,1,0,1,1,2,2,0,0,1,0,0,0,3,1,3,3,0,1,0,2,0,1,0,0,0,2,1,0,1,1,1,0,2,4,0,0,0,2,0,1,1,2,1,0,3,1,1,0,1,0,1,1,2,2,1,1,3,1,2,0,0,1,1,0,2,1,2,1,3,2,0,1,0,2,1,1,1,1,1,1,1,3,0,0,0,1,2,0,1,1,0,1,0,1,1,1,1,4,2,0,1,0,3,1,0,3,2,1,0,1,3,2,2,0,1,0,3,3,0,0,1,2,0,2,0,1,2,0,2,0,2,1,1,0,1,2,0,1,2,2,1,0,2,0,0,0,1,2,0,1,2,0,1,2,2,1,1,0,0,0,1,0,2,1,2,1,0,2,1,0,0,0,2,0,0,0,0,1,1,0,1,1,1,0,0,0,1,0,0,0,2,3,1,0,0,0,0,0,4,2,1,1,0,0,1,1,1,1,1,0,2,1,2,3,2,1,3,0,0,0,2,0,1,2,1,1,0,0,0,0,2,0,0,1,1,1,2,1,1,2,0,2,1,1,2,2,2,2,0,1,2,1,0,1,0,1,3,1,1,3,0,0,0,2,1,1,1,0,1,1,1,4,1,2,0,0,0,4,1,3,3,1,1,2,1,0,0,0,2,2,0,1,0,1,0,1,0,0,1,1,1,1,1,2,1,1,3,2,0,2,1,1,0,3,1,0,0,0,1,0,0,1,4,1,2,0,0,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,0,1,1,1,2,0,1,3,1,0,0,1,0,0,0,0,0,0,1,1,1,1,1,0,1,1,2,0,0,1,1,0,0,1,0,1,1,0,0,1,3,0,0,0,1,2,0,0,0,1,2,1,0,1,1,1,1,0,3,1,1,1,1,2,0,1,2,2,1,1,0,1,3,0,1,0,0,2,1,2,3,2,1,0,1,0,0,2,1,3,1,0,0,1,0,0,2,4,2,1,1,0,2,0,0,0,0,0,1,0,1,1,2,0,1,1,2,1,0,3,0,1,0,0,1,2,0,2,2,1,0,0,1,0,0,0,0,2,1,0,0,3,1,4,1,2,1,1,1,0,1,1,1,3,2,1,1,1,1,0,0,0,0,2,0,2,2,1,0,0,0,1,1,2,3,0,2,0,0,0,1,0,1,2,0,0,1,1,0,1,1,1,1,1,0,0,0,3,1,1,1,0,1,0,1,1,0,2,1,2,2,3,1,0,1,0,1,2,1,2,1,0,2,0,0,0,0,1,1,0,1,3,2,1,1,1,0,1,2,2,1,0,2,1,1,0,2,0,0,1,0,4,2,2,1,1,0,2,1,1,4,0,1,0,1,2,0,2,3,3,2,0,1,0,1,4,2,1,0,1,0,1,0,1,2,2,1,1,2,0,1,1,0,0,0,0,1,0,1,0,0,0,0,2,2,2,2]},{"counters":[0,3,0,2,3,0,1,0,0,1,1,1,0,0,1,0,0,2,1,0,0,0,1,0,1,2,0,0,0,1,3,0,0,0,2,0,0,0,0,1,1,1,1,4,0,1,1,3,1,0,1,1,1,1,1,1,1,0,1,0,3,2,0,0,2,3,0,1,1,0,0,0,2,1,2,0,0,1,2,1,2,1,1,1,0,1,0,1,2,1,0,1,1,2,2,1,0,1,1,1,1,2,1,0,0,0,4,0,0,2,0,1,0,1,0,0,3,1,1,0,2,2,1,2,0,1,1,1,1,2,1,2,1,1,2,2,0,1,1,3,1,2,0,2,1,0,2,1,0,0,1,1,3,3,1,0,3,1,0,1,0,0,1,1,0,1,2,2,0,1,1,2,0,3,1,0,1,1,0,0,0,0,1,1,1,1,1,2,0,0,1,0,0,0,0,2,0,1,1,0,2,1,1,2,1,1,1,2,0,2,0,0,1,0,2,0,0,2,0,0,0,1,4,0,1,0,1,0,0,0,0,1,1,2,0,1,0,3,2,0,0,0,3,1,1,0,1,0,3,1,0,2,3,2,3,1,3,1,0,1,3,1,1,1,1,0,2,0,1,5,3,1,1,0,1,1,4,1,0,0,1,0,1,2,0,1,1,0,0,0,0,0,2,2,0,0,1,0,0,0,1,3,0,3,1,3,0,0,0,2,1,2,0,0,3,3,2,1,0,2,2,1,2,2,1,2,0,1,2,0,0,2,0,2,0,0,2,1,1,2,0,0,2,0,4,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,3,0,2,4,0,1,0,2,3,1,0,3,0,0,1,1,2,1,2,3,2,1,1,1,0,0,0,1,2,0,3,2,2,0,0,2,0,1,1,0,0,0,2,3,0,2,0,0,0,2,0,0,1,1,0,2,0,1,0,1,1,0,0,1,0,1,1,5,2,1,0,1,1,1,1,0,2,3,0,2,1,1,1,1,0,4,0,2,0,0,2,2,2,3,2,1,0,1,0,1,1,0,1,1,1,1,0,0,3,1,0,2,0,2,0,0,1,0,1,0,0,2,1,2,3,0,2,0,0,0,0,1,2,2,1,1,0,1,0,1,1,2,2,0,0,1,1,2,1,1,2,0,1,2,0,0,0,1,1,2,0,0,1,0,0,0,2,0,0,0,0,0,1,0,0,1,0,1,2,0,1,1,1,1,2,2,1,2,1,0,1,2,2,2,0,2,6,3,1,0,1,1,1,0,1,0,2,0,2,1,0,1,1,1,0,0,2,0,0,2,3,1,1,1,0,2,1,2,2,0,1,0,0,0,2,5,1,3,0,1,0,2,1,2,0,0,1,1,1,2,1,2,1,2,0,0,1,0,1,0,0,0,1,2,0,0,0,2,1,0,0,0,1,1,2,2,0,0,2,0,0,0,2,2,2,2,1,1,0,4,3,1,1,1,0,0,1,0,0,1,1,3,0,0,3,0,1,0,0,0,1,0,0,0,3,2,1,1,2,1,1,3,1,3,2,0,3,2,2,0,1,0,1,1,1,2,1,1,1,0,2,2,0,1,0,0,0,0,0,1,0,2,0,1,1,0,2,1,0,1,2,0,2,1,0,1,0,0,0,2,0,2,0,0,0,1,0,0,0,1,2,2,0,2,1,2,2,0,0,0,0,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,1,0,1,1,1,0,1,1,2,3,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,2,1,0,0,0,1,1,4,2,1,1,0,0,1,1,0,0,1,0,1,2,0,0,2,2,4,2,1,1,1,1,1,0,1,4,0,2,3,1,0,1,0,1,3,0,0,0,0,0,2,1,2,0,2,1,2,2,1,1,1,1,0,3,0,2,0,0,0,1,0,2,0,2,0,1,0,0,0,2,1,0,0,1,1,0,0,0,0,0,0,1,1,0,1,0,2,0,1,0,1,2,1,1,1,2,0,2,0,0,0,2,1,1,0,1,1,0,1,1,0,0,3,0,1,0,1,4,1,3,2,2,1,0,0,0,1,1,2,0,3,1,1,1,0,0,0,2,0,1,3,1,2,1,1,1,0,1,4,0,1,1,1,1,1,1,1,0,0,0,0,0,1,2,2,3,1,1,1,2,1,0,2,0,1,0,0,2,2,1,5,0,1,1,1,1,2,2,2,4,0,0,2,1,2,0,0,2,0,1,1,1,0,2,2,4,0,0,1,1,1,0,0,2,0,1,2,0,3,0,1,1,0,1,2,0,1,1,1,1,1,1,1,1,6,1,0,1,0,1,2,2,1,2,0,2,1,1,2,0,0,0,0,1,0,5,2,0,1,0,1,3,1,0,1,1,1,0,1,1,0,0,0,1,0,0,1,3,0,0,0,1,0,2,3,2,1,0,0,1,0,2,1,0,4,1,0,0,0,1,0,2,1,1,1,1,0,1,2,2,1,0,0,1,1,0,1,0,2,0,1,3,1,0,2,0,1,1,1,0,0,2,0,2,1,0,1,1,4,0,0,1,1,0,0,4,1,0,1,1,0,0,0,1,1,1,1,1,0,1,2,2,0,2,0,2,0,0,0,1,0,1,2,1,2,1,0,1,0,1,0,2,1,1,2,1,2,3,3,2,0,0,2,3,1,0,0,0,0,1,2,0,2,3,0,1,1,2,1,2,1,1,0,1,1,4,1,1,1,1,2,3,1,0,1,1,0,2,1,1,1,0,0,0,0,0,2,0,0,1,0,0,0,1,1,1,0,1,2,1,1,2,2,0,1,2,1,4,0,2,3,1,0,0,0,3,0,1,1,0,2,1,0,1,0,0,1,2,0,2,2,0,1,3,0,2,1,1,0,0,0,1,0,1,1,2,1,3,0,0,0,1,1,1,1,0,1,1,1,2,1,0,0,2,3,2,3,1,2,1,6,0,2,0,1,2,0,0,0,0,2,0,2,0,0,0,1,2,1,2,1,0,2,3,2,0,1,0,0,2,0,2,1,1,2,2,0,0,2,1,0,0,0,0,1,2,2,1,1,0,0,1,1,0,0,1,2,3,1,1,1,2,1,0,3,0,1,2,0,1,0,1,3,0,0,0,2,1,2,2,2,0,3,1,0,0,1,1,3,1,0,0,0,0,2,2,0,2,0,0,3,0,0,1,2,1,0,0,0,1,0,3,2,0,1,0,1,1,0,2,1,1,2,1,1,1,2,1,0,0,0,0,1,0,1,0,3,0,0,2,1,1,3,1,5,2,1,0,1,0,1,3,1,2,0,2,0,0,0,0,0,0,0,0,0,0,1,2,1,1,1,2,1,1,1,1,2,2,1,0,2,2,2,3,0,1,1,1,0,0,0,2,2,1,1,0,2,0,0,1,2,1,1,2,4,2,1,2,1,2,0,1,1,0,2,0,0,0,0,0,1,1,2,3,0,0,0,0,2,2,0,2,1,1,1,1,0,2,0,3,0,2,0,0,0,1,3,0,1,1,1,1,2,1,1,1,0,0,1,0,0,0,1,0,0,2,2,3,2,0,1,0,1,0,0,3,1,2,2,2,0,1,0,0,0,0,1,0,2,1,0,0,0,1,0,1,1,2,2,1,1,1,1,1,1,1,0,1,0,1,2,0,1,0,1,0,0,0,1,1,0,3,2,0,2,1,0,1,0,1,2,3,0,1,1,1,1,1,0,0,0,0,1,2,1,1,2,0,0,2,3,2,1,1,1,1,1,0,0,0,2,2,3,0,1,0,1,0,0,0,0,1,0,0,2,2,1,1,1,1,0,2,1,1,1,3,1,1,0,2,0,1,2,1,1,1,1,0,1,2,0,0,0,0,2,0,0,2,2,1,0,0,0,1,0,1,0,0,1,1,1,1,3,1,2,1,2,0,1,0,1,3,1,0,0,3,2,1,0,2,0,1,1,1,1,1,0,0,0,0,1,2,1,1,1,0,2,2,1,0,3,2,1,4,0,0,0,0,1,0,0,0,0,0,2,2,2,0,0,1,1,3,0,4,2,2,3,0,0,2,1,1,3,1,1,1,0,3,0,1,2,1,2,1,1,3,1,1,0,0,0,0,1,0,2,0,0,2,1,1,1,2,2,1,1,3,0,1,0,1,2,0,0,1,1,0,1,0,0,1,3,3,1,1,0,1,2,2,0,2,0,2,0,3,2,2,2,2,2,1,2,1,2,2,2,2,1,0,0,0,1,0,2,0,0,0,0,1,0,0,0,1,1,2,0,0,1,0,0,3,2,1,2,1,1,1,2,3,0,2,0,1,2,3,1,1,0,1,2,0,1,0,1,2,1,0,1,2,0,0,1,1,0,1,1,2,0,2,1,3,3,1,2,0,2,1,2,1,1,0,1,0,3,2,0,1,1,1,1,1,2,0,4,0,1,2,1,0,0,2,0,0,1,0,1,1,1,1,1,0,0,2,1,1,0,1,0,1,1,2,2,2,1,2,5,1,3,0,1,0,1,1,1,1,1,2,1,1,4,0,0,2,0,1,1,1,1,1,0,2,1,0,0,0,2,3,1,0,1,1,0,0,1,2]},{"counters":[0,1,1,1,0,0,1,1,1,1,1,0,2,0,0,0,2,0,1,0,1,0,0,2,0,1,1,2,1,1,0,0,1,0,2,3,1,2,1,2,0,2,1,0,1,1,1,1,3,0,0,0,1,0,0,1,0,2,0,2,1,1,1,2,0,1,3,1,3,1,1,0,0,1,0,2,0,2,0,0,1,1,1,0,1,0,0,2,0,0,0,2,0,2,1,1,1,0,0,0,1,2,1,0,1,1,0,1,1,0,0,1,0,2,3,1,1,1,2,2,1,2,1,1,1,0,2,0,1,2,1,2,0,2,1,4,3,0,1,1,1,0,1,3,2,0,0,0,0,2,2,1,2,1,0,3,1,1,1,2,2,1,2,1,1,1,0,0,0,0,2,0,1,0,2,0,0,2,2,2,0,0,1,1,0,0,3,2,0,1,0,1,0,0,0,3,0,2,2,2,1,3,0,0,1,3,0,0,1,1,2,1,0,1,0,0,1,1,0,2,2,1,1,2,4,0,0,0,1,3,0,0,0,0,2,0,0,1,1,0,1,3,0,1,2,1,3,1,2,1,0,1,2,3,1,2,3,2,1,1,1,0,1,1,0,0,1,1,3,2,0,1,2,1,0,1,3,0,0,2,1,2,2,1,1,1,1,0,2,1,0,0,0,1,0,3,1,1,0,0,1,2,1,0,0,4,1,0,1,2,0,0,1,2,0,0,0,2,3,0,3,0,2,1,1,1,0,2,1,1,2,0,1,1,0,0,1,1,0,0,1,1,0,1,2,0,1,2,0,1,1,0,1,0,0,1,1,2,2,1,0,0,0,0,0,1,2,1,1,4,2,0,1,0,0,3,1,3,1,1,1,1,0,0,0,1,3,2,1,0,2,2,1,0,1,0,0,0,1,1,1,0,0,3,0,0,0,1,1,1,1,1,0,0,0,1,2,1,0,0,0,0,1,0,0,1,1,0,1,1,1,1,0,3,1,0,0,1,1,1,1,1,2,0,0,0,2,1,0,2,1,3,2,3,2,1,1,0,2,1,2,0,1,2,1,3,0,2,0,3,2,0,0,3,1,0,1,1,2,1,1,2,0,2,0,2,0,1,2,1,1,2,2,1,2,1,2,0,3,0,0,1,1,0,0,0,1,0,1,1,1,2,2,2,3,2,1,0,1,1,2,0,0,0,3,0,1,0,3,1,0,2,5,1,2,1,0,0,0,1,2,2,2,0,1,5,1,2,0,0,0,0,2,2,0,1,0,1,1,1,1,1,1,0,3,1,2,0,1,3,1,3,1,0,0,2,1,0,1,2,1,1,1,2,0,3,0,0,1,1,0,0,2,0,1,1,0,0,2,0,0,1,4,2,1,1,1,2,2,1,2,0,3,3,0,0,0,2,2,1,1,1,1,1,0,0,1,2,1,3,1,3,0,1,3,4,0,3,1,0,2,1,0,1,0,2,1,0,3,2,1,2,0,1,1,0,3,3,3,1,0,0,1,0,0,0,1,1,1,2,1,1,2,2,1,1,0,1,1,0,2,0,0,1,1,0,0,1,2,0,0,2,1,0,1,0,0,1,0,2,0,2,0,0,2,1,0,0,3,2,2,0,3,1,2,1,0,2,2,0,1,0,1,0,1,1,1,3,2,1,1,2,2,0,0,2,2,0,4,1,1,3,1,0,1,0,1,1,2,1,1,1,3,2,0,0,2,1,2,0,0,0,0,1,1,0,1,0,1,3,1,1,0,1,1,2,1,1,1,2,1,3,1,0,0,1,2,1,2,2,0,1,4,1,1,2,0,1,2,3,0,0,0,1,0,0,3,0,2,1,0,1,0,1,2,1,1,0,6,0,3,1,2,1,0,0,2,0,1,0,2,0,1,1,0,0,1,1,1,2,2,1,1,1,1,2,1,4,1,1,0,1,1,0,1,2,0,2,0,2,0,1,0,1,0,2,4,2,2,0,1,2,1,1,2,0,0,1,2,0,0,0,0,2,0,0,2,0,0,0,3,2,0,1,1,2,1,1,0,1,0,1,1,1,0,1,1,1,0,0,0,1,0,1,2,1,3,0,0,0,0,2,0,2,1,0,1,0,2,1,2,4,1,1,0,0,1,1,1,3,0,0,2,4,3,1,2,1,2,1,0,2,1,2,2,2,1,1,0,1,1,2,2,1,1,2,1,2,1,0,1,1,0,1,1,2,2,1,1,2,0,0,0,0,1,1,1,1,0,0,3,1,2,2,0,2,1,1,1,1,0,2,0,1,1,0,0,1,0,1,2,1,2,1,2,1,1,0,0,0,2,0,0,1,4,0,1,2,2,0,0,0,0,0,2,0,2,0,0,1,1,1,0,1,0,2,1,1,0,2,0,1,3,0,1,2,0,1,1,1,2,2,1,1,0,0,2,0,0,0,1,0,2,2,1,1,2,2,1,0,2,3,0,0,3,0,1,0,1,4,0,0,0,1,1,0,1,0,2,2,0,0,0,0,0,1,1,0,1,0,2,1,3,1,0,0,2,0,0,2,0,0,1,1,1,1,2,0,0,1,0,0,0,2,4,2,0,0,0,1,0,1,0,2,0,1,1,1,0,1,0,1,1,2,1,1,1,1,1,0,1,0,1,0,0,1,2,1,1,0,0,1,1,1,2,0,1,0,1,1,2,2,2,1,1,1,0,0,1,0,1,2,1,1,0,1,1,0,0,0,1,1,2,1,0,0,2,2,1,3,1,2,2,1,0,2,1,0,2,2,1,1,0,0,0,0,0,2,1,2,0,0,0,0,0,0,1,2,0,0,0,0,3,1,0,0,0,0,1,0,1,0,2,0,1,1,2,1,2,1,0,0,2,1,0,0,2,1,1,4,2,2,2,0,1,1,1,1,1,0,1,1,0,1,1,1,0,1,0,1,1,1,1,0,0,2,0,1,2,1,1,1,1,1,2,1,2,2,4,2,0,0,1,1,0,1,1,1,1,1,1,0,1,0,0,1,0,0,0,0,1,2,1,1,1,2,1,2,2,1,0,0,1,2,1,0,0,2,1,1,3,1,0,3,0,1,2,1,2,0,4,1,2,1,1,2,3,0,1,2,0,1,1,0,1,1,0,1,1,1,0,1,0,4,3,0,1,3,1,2,1,0,1,0,1,1,0,1,1,1,1,0,0,1,2,2,1,4,3,0,0,1,1,1,0,1,1,0,1,2,1,2,1,1,0,1,2,2,1,0,1,0,0,2,0,0,0,0,1,0,1,0,2,1,0,1,0,2,0,2,1,0,1,0,2,0,2,3,0,1,4,1,0,1,0,1,0,1,1,0,0,2,1,2,2,1,0,2,2,0,1,1,1,1,2,1,0,2,2,0,0,2,1,1,0,2,0,0,2,0,2,1,1,5,0,0,2,2,0,0,0,2,0,0,1,1,2,1,3,0,1,0,1,2,1,0,2,1,0,0,0,0,1,3,0,4,2,2,1,0,1,1,1,0,0,1,0,0,0,2,2,3,4,0,2,0,0,1,0,1,0,0,0,1,2,2,2,1,0,0,1,0,0,0,0,1,1,0,2,1,1,0,1,0,0,0,1,2,0,1,0,0,1,1,2,2,1,0,2,1,1,1,0,0,0,1,0,0,1,2,1,0,0,0,0,0,3,1,0,2,0,3,0,1,1,1,2,2,0,1,0,1,4,1,0,1,1,0,0,1,2,2,1,2,0,2,0,1,2,1,1,0,1,0,1,1,1,0,4,1,0,0,0,2,0,0,0,1,0,1,1,0,0,0,2,0,0,0,0,0,1,2,0,0,0,1,0,1,0,0,1,0,0,3,1,1,0,1,1,1,0,0,4,1,2,0,2,2,4,3,0,0,0,0,3,2,0,0,0,3,2,0,0,0,0,1,3,1,1,1,2,1,0,1,0,0,1,0,1,0,2,0,2,0,0,3,2,1,0,0,2,1,2,1,0,0,0,1,0,1,2,0,0,2,0,1,1,1,0,0,0,0,1,0,0,0,5,1,2,1,0,0,1,0,1,1,0,0,1,2,1,1,0,0,3,0,0,3,3,0,0,2,0,0,0,1,0,1,0,3,1,1,0,1,0,0,3,2,0,0,4,0,1,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,1,1,1,0,1,1,3,1,0,0,0,2,3,0,0,0,1,1,1,0,1,0,0,2,1,3,1,0,1,0,1,1,0,3,3,2,0,0,1,2,2,2,2,0,1,0,1,2,2,1,0,2,0,0,1,1,1,3,3,1,1,0,0,1,2,0,0,0,0,0,1,0,2,1,2,1,0,2,0,1,0,0,0,0,2,1,2,1,2,1,2,1,4,1,1,0,1,3,0,0,2,0,2,1,0,1,1,3,0,1,2,0,1,0,0,1,0,0,2,2,2,0,0,2,1,1,1,0,1,0,0,1,1,1,0,0,0,1,0,0,3,1,2,0,1,1,0,1,2,0,1,1,1,3,2,6,0,1,1,0,2,1,4,1,2,1,0,1,0,0,1,2,2,2,0,1,2,4,1,2,0,1,2,1,1,1,2,2,1,0,0,1,0,1,1,0,0,0,0,0,1,0,1,1,1,1,1,2,1,1]},{"counters":[0,2,0,0,1,1,0,0,0,1,1,1,1,2,0,1,4,2,2,1,0,1,0,0,1,2,0,1,1,2,2,2,1,1,1,3,1,0,2,2,1,0,0,2,2,0,0,0,0,3,1,1,0,2,1,3,0,1,0,1,0,2,0,3,0,2,1,0,2,0,1,4,2,0,1,1,1,1,0,0,4,0,3,0,3,4,2,0,0,0,2,0,1,1,2,1,0,0,1,2,0,0,0,2,0,1,0,2,3,2,2,0,2,1,3,1,2,1,1,0,0,3,1,0,1,3,1,1,0,2,0,2,0,1,0,0,1,0,1,1,1,0,1,1,1,0,1,2,0,2,0,1,0,0,1,1,2,1,2,1,1,0,0,2,1,0,1,0,0,1,1,0,0,0,4,2,0,1,0,1,0,3,0,1,2,1,2,0,0,3,1,0,0,0,0,0,2,0,0,0,2,0,0,3,2,1,0,0,0,1,0,2,3,3,0,0,2,1,1,0,2,0,1,1,0,3,1,0,1,1,0,1,1,3,1,3,0,0,3,1,1,1,2,2,0,1,3,1,0,2,2,0,1,1,1,0,0,1,0,2,0,2,1,1,1,0,0,1,3,1,1,0,1,0,1,1,1,0,2,3,0,0,2,0,1,2,0,0,1,2,0,2,2,0,2,1,1,0,1,1,1,1,1,1,0,1,0,1,0,0,2,0,2,2,2,1,1,0,2,0,2,0,1,0,1,0,2,1,1,3,0,0,1,0,1,0,0,0,1,3,2,1,2,0,3,0,0,1,0,2,1,1,0,2,2,2,1,3,0,0,1,0,0,1,1,3,1,1,2,1,1,1,2,1,0,0,0,2,1,0,0,1,2,1,0,2,1,2,0,0,3,0,2,1,1,1,0,0,0,1,1,1,2,1,0,0,0,1,4,1,1,1,1,1,0,2,0,1,1,0,1,0,1,0,0,0,1,2,0,2,0,1,1,0,0,3,1,1,0,1,1,1,1,1,1,0,1,1,2,2,0,0,0,1,1,1,0,1,0,1,0,0,1,0,0,2,1,0,1,0,1,1,2,1,0,1,1,0,0,1,0,3,0,2,0,1,0,0,0,1,1,1,1,1,3,1,1,1,0,0,1,4,1,1,1,0,0,3,0,0,0,0,1,0,1,2,1,1,0,1,2,2,0,1,0,2,0,0,1,3,1,2,0,1,0,0,0,3,1,1,0,0,0,1,1,0,2,1,0,1,1,1,1,3,0,3,1,1,1,0,0,2,0,1,0,1,2,2,1,0,2,1,2,1,0,3,0,2,1,0,0,1,1,0,2,1,0,1,2,1,0,1,0,0,1,2,3,1,3,1,1,1,1,0,1,2,5,2,1,2,1,2,1,1,1,2,5,1,1,0,1,1,2,3,0,0,1,0,0,1,3,1,0,0,3,1,0,2,0,1,0,4,1,2,1,0,1,2,2,0,0,1,0,1,1,0,0,2,0,1,0,0,0,0,1,0,0,0,0,2,1,0,1,3,0,1,1,1,0,0,3,2,4,0,2,2,1,0,0,1,0,0,0,2,1,0,3,1,1,0,1,1,1,1,0,1,2,2,0,1,1,0,2,1,1,1,0,2,0,0,1,3,1,1,2,1,0,2,0,0,0,0,2,1,0,0,2,0,2,3,0,1,0,0,0,2,2,0,0,3,0,0,1,2,0,1,2,4,3,1,0,1,0,0,0,1,3,0,1,1,2,0,0,2,3,0,1,1,1,1,1,1,0,0,1,2,0,3,1,0,1,1,1,0,0,1,0,1,1,0,4,0,0,0,0,0,4,0,1,3,2,2,0,2,1,3,1,0,1,1,1,0,2,2,1,2,0,0,0,3,1,3,0,3,0,0,1,0,0,1,1,1,1,1,2,2,0,0,0,1,0,2,0,3,3,3,0,3,0,2,0,1,2,1,0,0,3,0,1,2,3,1,1,1,1,1,0,2,1,1,1,0,0,4,1,1,2,0,0,0,1,0,1,1,1,1,2,1,2,0,0,0,0,0,0,2,0,0,2,0,1,1,0,1,1,1,2,1,0,0,1,1,4,0,4,3,0,1,0,0,0,1,0,2,1,1,0,2,0,3,1,4,0,0,1,0,1,1,1,2,2,4,0,1,0,1,0,1,0,0,1,0,1,1,0,2,1,2,0,1,2,2,3,0,0,3,0,0,0,0,0,1,1,2,0,0,0,1,1,0,0,0,0,0,0,2,0,2,2,1,1,1,0,1,1,1,1,0,2,0,1,1,0,3,0,0,1,0,1,0,1,0,1,0,0,1,1,2,1,1,2,2,0,2,1,1,0,4,0,1,2,0,1,0,2,0,0,2,0,1,1,0,1,1,3,2,1,0,0,1,2,2,0,0,4,1,2,1,0,0,0,3,1,0,0,1,0,1,0,3,0,3,0,3,0,1,1,2,0,0,2,1,1,1,1,1,1,0,0,1,0,0,0,1,0,0,1,0,0,2,2,1,0,0,1,0,1,0,0,0,2,0,0,0,0,0,0,3,1,4,1,1,1,1,2,1,1,1,0,0,0,1,1,0,2,2,3,0,3,1,3,1,3,5,4,1,0,1,0,0,0,1,1,0,1,2,0,0,1,2,2,1,0,0,1,1,0,0,1,0,2,1,0,0,3,0,2,0,1,2,1,0,2,1,2,2,0,1,0,1,2,1,1,2,1,0,1,1,2,1,1,1,0,0,1,2,2,1,0,1,2,1,3,2,2,1,1,1,0,1,1,2,1,2,1,0,1,0,1,1,2,1,2,3,2,2,1,0,1,1,1,1,0,1,2,0,0,0,0,1,4,2,0,2,0,1,0,0,0,2,2,1,1,1,2,0,1,3,3,1,0,2,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,2,0,2,0,0,0,1,0,2,1,1,3,1,1,0,0,1,0,2,2,0,0,1,1,1,2,0,0,0,2,0,0,2,0,3,1,0,0,0,0,3,1,3,1,1,1,0,2,0,1,1,2,1,0,1,0,0,1,1,3,3,0,2,0,0,1,0,0,1,2,0,0,1,2,0,2,2,0,4,1,1,2,0,2,1,3,0,0,1,1,0,1,1,0,2,0,2,4,2,1,1,0,1,0,0,1,2,0,1,0,0,0,3,1,1,0,0,1,0,0,1,1,1,0,0,0,1,1,2,0,1,1,1,0,0,0,0,1,2,0,1,1,0,3,1,1,2,1,1,0,2,1,0,0,0,0,0,3,1,0,1,1,0,0,0,0,0,2,3,0,2,0,1,0,3,0,0,2,1,0,1,0,0,1,1,0,0,2,2,1,1,0,2,1,2,2,1,3,1,1,0,2,0,2,0,0,2,0,2,0,1,1,0,0,0,0,1,0,1,0,2,1,1,3,1,1,1,2,2,0,0,2,1,0,2,1,4,0,0,0,1,0,0,1,1,0,1,1,2,2,1,0,2,2,3,0,2,1,0,1,1,2,2,3,2,0,1,0,0,1,0,1,3,2,1,2,0,0,1,1,0,0,2,0,1,0,0,2,2,1,1,1,1,2,0,1,1,0,0,0,2,2,0,0,0,0,0,2,1,2,0,0,2,3,0,3,2,2,0,1,0,0,0,1,1,2,0,4,1,1,2,1,3,0,3,2,0,1,0,6,3,1,0,2,0,1,1,2,0,0,1,3,1,1,0,0,0,2,3,1,0,0,1,0,2,0,1,0,1,1,0,0,4,3,0,0,0,2,0,3,1,1,1,1,0,1,3,1,2,2,1,1,1,1,2,3,0,0,1,2,1,1,1,0,0,0,2,1,2,0,1,3,1,1,0,2,1,0,0,0,0,1,2,2,0,0,3,6,1,1,0,1,1,0,1,0,2,1,1,0,1,1,1,0,1,1,1,0,0,0,2,1,2,1,0,0,1,0,2,1,2,1,2,2,1,2,1,0,1,2,0,2,1,1,2,0,2,1,4,0,1,0,2,2,1,1,1,1,0,0,0,0,0,1,2,1,2,1,1,0,0,2,1,0,0,4,1,0,1,1,0,0,1,0,3,0,1,1,0,1,1,0,1,0,1,2,1,3,2,1,1,0,3,1,1,3,0,1,3,0,1,0,0,1,1,1,3,1,0,0,1,1,1,2,1,0,1,1,1,1,1,1,0,2,2,0,1,0,0,0,1,3,0,0,1,1,1,3,1,3,0,0,1,3,1,3,3,0,1,3,2,1,0,2,0,2,1,1,1,0,2,0,1,0,1,1,2,2,1,4,1,1,1,1,0,4,0,2,2,0,0,1,2,1,2,1,1,3,1,0,2,3,2,0,1,1,1,3,1,1,2,0,2,1,0,0,1,1,0,1,0,0,0,0,0,1,1,2,1,0,2,0,2,2,2,1,0,1,0,1,1,0,1,1,1,2,0,0,0,1,0,1,1,1,2,0,2,0,0,0,3,0,0,1,4,0,0,3,0,0,1,2,0,1,3,0,0,0,2,0,1,0,0,1,1,1,1,2,1,1,0,0,1,1,0,0,1,0,0,3,0,3,0,2,0,1,1,0,2,2,1,5,1,0,2,0]}]},"null_count":0,"last_update_version":397952029460529152},"p6_md5":{"histogram":{"ndv":1975,"buckets":[{"count":8,"lower_bound":"MDB5bA==","upper_bound":"MDNGWmI0OHJ2UWdJcXFsVA==","repeats":1},{"count":16,"lower_bound":"MDR1WVUyTlpmNUZvR1U=","upper_bound":"MEU0OGsxSDJoa1JrTDVoVDZMRFRHSmVicw==","repeats":1},{"count":24,"lower_bound":"MEdzQ3lJQTZsZVp1V240dlllaDBMSGdNVUlCS1V0SVI=","upper_bound":"ME02VWUxeERROFI=","repeats":1},{"count":32,"lower_bound":"MFBsZ3cycDhmRTJROW8=","upper_bound":"MGt0TXB0eE43VjhoQWp0M3M=","repeats":1},{"count":40,"lower_bound":"MHVMeGxL","upper_bound":"MQ==","repeats":5},{"count":48,"lower_bound":"MUEweThKTzdzUENneg==","upper_bound":"MUdDZnEwYzNU","repeats":1},{"count":56,"lower_bound":"MUthNjNJekpyRWlVWEF1NjVmUkw3RnYyeldSaU52Y00=","upper_bound":"MVVDUmV5b3dlaFBhNg==","repeats":1},{"count":64,"lower_bound":"MVd1NHREdDAz","upper_bound":"MVpQY3RGWk1NRXZncjFKR2wxNkpa","repeats":1},{"count":72,"lower_bound":"MWI1Nk1LSnBhWFNydDE5","upper_bound":"MW1YYQ==","repeats":1},{"count":80,"lower_bound":"MW5nTTBadVpPS0NXckNDbVppaw==","upper_bound":"MXdlUTNCWWVmcXNy","repeats":1},{"count":88,"lower_bound":"MjhpZk13RWNKOWxPMw==","upper_bound":"MkgwSXpTakJBcmdqcHpQN25raGRFSWpINE11ekxY","repeats":1},{"count":96,"lower_bound":"MkxEbzFTd2NGZjRJa2NzSWJhODR4VUJYUQ==","upper_bound":"MlNCYkVVdw==","repeats":1},{"count":104,"lower_bound":"MlZ0T2ZVR252NktQ","upper_bound":"MmxsZ3hJOGYxRXRaWFBZZQ==","repeats":1},{"count":112,"lower_bound":"Mm04MjBX","upper_bound":"MzR6d0o4","repeats":1},{"count":120,"lower_bound":"M0JyUFdrUUlQ","upper_bound":"M2Nsd3Q=","repeats":1},{"count":128,"lower_bound":"M2pyaVFXQ2JYUlJMdVJIMFA4MExMeHdHNQ==","upper_bound":"NDVEeEtoUnU3UTdJZlRpSEhNMHFFOU04ZA==","repeats":1},{"count":136,"lower_bound":"NDd0eHVUcURXYjJT","upper_bound":"NFVZWE93d2pwWkE=","repeats":1},{"count":144,"lower_bound":"NFlUdXNSUXh6S1RwaTZCSkhKNQ==","upper_bound":"NG5KbTBMemQzZlNmNkRJcU90MTRqRUh5bnhEZHd1NQ==","repeats":1},{"count":152,"lower_bound":"NG5SQjlzVTBsTnQycnpIT3l1TGFW","upper_bound":"NHRqcm1VRmtyT1Q=","repeats":1},{"count":160,"lower_bound":"NQ==","upper_bound":"NUg4a1BNenI3SFBU","repeats":1},{"count":168,"lower_bound":"NUlqeVJvRnJQdlY0WG9Tem8yaXFyUkJFdw==","upper_bound":"NU9ZTHpOVldlZ3IyUWlDZk1BWFBX","repeats":1},{"count":176,"lower_bound":"NVNPNGFJT3IzTzRkeEVvRDRIOWIxYjE0R1BEbVlDUA==","upper_bound":"NVhDTFl4SlZXazBaN2hIR3FmZ2x0Z0h2","repeats":1},{"count":184,"lower_bound":"NVhPRkN3UXRsbHROY0RhMUFLbE1mS2g=","upper_bound":"NWx6MG5yRlRycUVKdHpDMA==","repeats":1},{"count":192,"lower_bound":"NXhWRjVPRWw5YmtPUXZ6YU1EOUI4VkRl","upper_bound":"NkVJZUdacGhoUlBVcXVoOTZodDZGVlBkMFJqY3ZBNA==","repeats":1},{"count":200,"lower_bound":"NklOTmgybnNKaFZ3NW9pNklITEZldQ==","upper_bound":"Nkxlc0pGRkpjMVNoU1dHa2k0Vk5iMnVnQkM2","repeats":1},{"count":208,"lower_bound":"NlU3Z3pqUmZWbVg3a3hmd0I=","upper_bound":"NmxMdkdkd09IZ0RTVnZhODMy","repeats":1},{"count":216,"lower_bound":"NmxPWEU=","upper_bound":"NnhRUU9uNHJVdm9tRVhvR3FFU2s4","repeats":1},{"count":224,"lower_bound":"NnhUUUdIUDJm","upper_bound":"Nzl3blNhdXZCUHhpblY=","repeats":1},{"count":232,"lower_bound":"N0EzMDRhWE9Mcw==","upper_bound":"N0lhVXBQNmhm","repeats":1},{"count":240,"lower_bound":"N0pRUVJXclFVNm9j","upper_bound":"N01vZzA=","repeats":1},{"count":248,"lower_bound":"N1Z6eVVySzVUaDVRU3d1bw==","upper_bound":"N292dEtERU91M1pjSnNiVnRPOUpodWJH","repeats":1},{"count":256,"lower_bound":"N3I3YTlQWDM5","upper_bound":"N3VIc0VPQWxta3JRZVhlT0trWG4=","repeats":1},{"count":264,"lower_bound":"N3lSV2lYOHE2bGNpR2xTWU5JdHo4cnk=","upper_bound":"OEV1Q3cx","repeats":1},{"count":272,"lower_bound":"OEZyNTVrSFRPcFFLc0hmanY0","upper_bound":"OFVOaFhUbExRRWFMaUVKdWtURGg=","repeats":1},{"count":280,"lower_bound":"OFlhMzJKek9oMWh1Y0JEblVkOXhaZkU4Q0dQVHdaNg==","upper_bound":"OGFqTkk5","repeats":1},{"count":288,"lower_bound":"OGNmZVNNazhQbQ==","upper_bound":"OGhQQ2Jtb2NOT3lqUkt0RnpCaU1WYXNoeUtORw==","repeats":1},{"count":296,"lower_bound":"OG1yZnZyNmtxOHN0SXZQWWRMMDlNWkJsUHpnclM3YnU=","upper_bound":"OQ==","repeats":1},{"count":304,"lower_bound":"OTFXTmtkVWpRSA==","upper_bound":"OTZGWFlFWWNUY0Q5U29tQ21uaTlQdA==","repeats":1},{"count":312,"lower_bound":"OTdk","upper_bound":"OUxLN0dhOHl4T2FxOHMyVFBnUmhveDRBd3ZjeGdTN1U=","repeats":1},{"count":320,"lower_bound":"OVFYMkY4ZlBzUk1jMVlnUXZxVE84bWxzck4=","upper_bound":"OXFkZUZKc0NVakk4Z1laUHRIdmEwMFduTWs3QW4=","repeats":1},{"count":328,"lower_bound":"OXI=","upper_bound":"QURlWjRpT2xvZGJ4TkRMUXdhRHBkMVl6WkdkbXh1","repeats":1},{"count":336,"lower_bound":"QUdJNTk1VnpyUEV3SU8=","upper_bound":"QVBwZGFjWHI=","repeats":1},{"count":344,"lower_bound":"QVVPTldEQU5ycGdieWFE","upper_bound":"QWJpam8=","repeats":1},{"count":352,"lower_bound":"QWRkcWxpT0g5cjIxTDlSOFk1YThkN2g=","upper_bound":"QXJ5OUM1aEpXNjRSbHR4WmlMVkpIU0hDWUxFZncx","repeats":1},{"count":360,"lower_bound":"QXMxYUFm","upper_bound":"QjJtek40eUFOOUg1","repeats":1},{"count":368,"lower_bound":"Qk1HblNPRVBQUWFORHBud3VzWXlPMEI=","upper_bound":"QlQwYQ==","repeats":1},{"count":376,"lower_bound":"QlU0N2x5QjJYTTFTZVdN","upper_bound":"QmppZnBGbzFXYzdCY1J0c0RQUGw4Tw==","repeats":1},{"count":384,"lower_bound":"QmthQmh2Q0JmSTFkUWE3R2R2U2FJZ1JKUkdydG9QTg==","upper_bound":"QnZ5Z3RO","repeats":1},{"count":392,"lower_bound":"QzBqVVE1ZA==","upper_bound":"Q0Vlb0tNU1phTFd4ZzJSc2p6NHYwRlZqaTRIOQ==","repeats":1},{"count":400,"lower_bound":"Q0VmRjl2QzBUTmJBN1hMVXc2ZA==","upper_bound":"Q1JqNm5TZkRjRHNEa3NXc2hp","repeats":1},{"count":408,"lower_bound":"Q1VEd05JRkJ1REVk","upper_bound":"Q2o=","repeats":1},{"count":416,"lower_bound":"Q29aR01V","upper_bound":"Q3hXRVhIYw==","repeats":1},{"count":424,"lower_bound":"RDI1MVFnajc1WFVpVHZNSWN5czViVjMxdE1IRjE=","upper_bound":"RDhUaUlKRw==","repeats":1},{"count":432,"lower_bound":"REU4OE9EUWNaVGRabXZ6UWZqbFhTV3ZGOWtB","upper_bound":"REdhdDJkeEJqaTVVODZkVG5TVk1Y","repeats":1},{"count":440,"lower_bound":"RFk4VFlUQWVmWGlKdA==","upper_bound":"RGJsNGdCQkhBSDdSOG96ZkRwbklHRGZLdW5H","repeats":1},{"count":448,"lower_bound":"RGlmaA==","upper_bound":"RG80amNNMzl4eTlPSlphSFVLS2t3WlBhU1h6R1dhUg==","repeats":1},{"count":456,"lower_bound":"RG9DWTlY","upper_bound":"RHZtWFhYdlE4YzdJZWg0WlN3TjdsbDhYcmt0RWs=","repeats":1},{"count":464,"lower_bound":"RTRCTFJjR2ZORXdaYXY0R0RCcXJiYnhNOHM=","upper_bound":"RUJNeVUyOGpZQmRtZk5qbGFZQUtjNTI=","repeats":1},{"count":472,"lower_bound":"RUxHcHI2MllYSnpaVzMyOA==","upper_bound":"RVBoeXdGazZXYU1WNU9VUWpOamQ=","repeats":1},{"count":480,"lower_bound":"RVhWWHY4NThYUUptUjNUWlZLa0E5RXNxQg==","upper_bound":"RWVQTHZhT015RWg0SE1nZUZrVVBpTXZqRQ==","repeats":1},{"count":488,"lower_bound":"RWdIemJ3a2I2NVU4","upper_bound":"RXBuZGpVVkJNT2VMWTI=","repeats":1},{"count":496,"lower_bound":"RXJST2pNSEpNM0E=","upper_bound":"RkNUWmpnQ3R2YkJy","repeats":1},{"count":504,"lower_bound":"RkVUTmFqbFhIc05UNlFWN3pDMmFTN1ZOOTU1OEFEV0M=","upper_bound":"RlJpejc=","repeats":1},{"count":512,"lower_bound":"RlV1VzJ4SnJwNA==","upper_bound":"RmVmem5YUTRZeQ==","repeats":1},{"count":520,"lower_bound":"RmdMUUJiRWNla2p5MWhwaW5a","upper_bound":"RzVYSmRkZkk=","repeats":1},{"count":528,"lower_bound":"R0FnZEp2ZEJOUldr","upper_bound":"R00ybWlFeWVXVEhtbTE=","repeats":1},{"count":536,"lower_bound":"R09WZVltZzhWZ3BydmwyR2FPdnhXN0wxN0hhN1c=","upper_bound":"R1haZmJUY29sQkJ2dEJuZDQ=","repeats":1},{"count":544,"lower_bound":"R1lYNENSYm1HUng2eXY5bUp2ZGllT3l6Q21vQ2RC","upper_bound":"R2NaVlgyVXhPVlk=","repeats":1},{"count":552,"lower_bound":"R2Rhc3Rpa3Fu","upper_bound":"R2pvbVhEeWZ5dQ==","repeats":1},{"count":560,"lower_bound":"R2xmSQ==","upper_bound":"R3cyYWw=","repeats":1},{"count":568,"lower_bound":"R3k5ZnlFMTJUZkk=","upper_bound":"SEFpdERGdHM1d1U=","repeats":1},{"count":576,"lower_bound":"SEh3YWRZZ2JiY1dlWml6OWhR","upper_bound":"SGdlcEhQazRtYVNSbA==","repeats":1},{"count":584,"lower_bound":"SGtLeVhWcTAxc0prUVdlZ1NrenlacUd0NnVCajNZZg==","upper_bound":"SQ==","repeats":1},{"count":592,"lower_bound":"STZ4SnZ0UGJSUnNzOUVBRE9J","upper_bound":"SVE4cWo2TGlURVIybmY=","repeats":1},{"count":600,"lower_bound":"SVJOa3VhTEJTaQ==","upper_bound":"SWR5TlZYYUNnNXBoZkdnTUMxWlFIQXdIZVpVQ1k=","repeats":1},{"count":608,"lower_bound":"SWp2OGI=","upper_bound":"SXNOdnFuMzZ2WGlwcTNWdDIwNU4zR0EwQXJP","repeats":1},{"count":616,"lower_bound":"SXV1WVpFZkphUDBuMnBwYzZWOXZrRA==","upper_bound":"SkluM3NlOGZ3aWla","repeats":1},{"count":624,"lower_bound":"Sk1ud2R6UFp3YnNOZFpMMUJZOHg=","upper_bound":"Sk50WVp0aWF0UmsxYXBzcDBqSGVHMnBVUFVPeU4=","repeats":1},{"count":632,"lower_bound":"Sk53TFNIUzg=","upper_bound":"SmV0a0dMODhJcmhjM1Z2WXhOam1Xb2NnVnhRV1duY08=","repeats":1},{"count":640,"lower_bound":"SmZkZ3VlbDZid2JSaFdrSWV5bDE0TEdFbGdwNFUwZg==","upper_bound":"SnJJR29HMEw0bDZBZDhxaA==","repeats":1},{"count":648,"lower_bound":"SnZkZml2MHRoYmpEWDRMUnk1N3plTw==","upper_bound":"SzBvRXl6TGNYUTFWeTI4NjBpaEx3czVlTUhadk9tc2g=","repeats":1},{"count":656,"lower_bound":"SzZHaGFkcXJuamVZQzBhaFRwMDc1Zm9DUkw0","upper_bound":"S0o2dWJTRXhMQjZpcG40ZnNnZjdyeWNrZXc5UQ==","repeats":1},{"count":664,"lower_bound":"S0x0Nk02UEdRamNNWEk4Wg==","upper_bound":"S1RldXJsSDJLelVycTZBcQ==","repeats":1},{"count":672,"lower_bound":"S1ZUTG1KNno0QlI=","upper_bound":"S29VS253c0hBVGp6c1B5Y2Y1b3UxNA==","repeats":1},{"count":680,"lower_bound":"S3NSQ1p4bmV6QU1CaXFDYlY5bTJaQlNpSlNWZGI=","upper_bound":"S3RQVGczdkhzd0ZDVVB3UGk2","repeats":1},{"count":688,"lower_bound":"TA==","upper_bound":"TEd4WWk0a0lvTGlRSWRl","repeats":1},{"count":696,"lower_bound":"TEhZa3ZMYWcwc3R0eE1LbFQxUHp3","upper_bound":"TFptN282UUZveDR5VTFuSGVITWg1Ym9UY093","repeats":1},{"count":704,"lower_bound":"TGFCNzBPTVRHOHlHM2Q=","upper_bound":"TGtReEZIR2haOFJaUnVjbQ==","repeats":1},{"count":712,"lower_bound":"THFn","upper_bound":"THZaWnlESFRFZjI5WG1H","repeats":1},{"count":720,"lower_bound":"TUJRMVhPVVlGQVNwOQ==","upper_bound":"TVBISnRma3BRWnB6MGI3Wmg=","repeats":1},{"count":728,"lower_bound":"TVR5ek1Ma05ZRFg=","upper_bound":"TVczaTBmQmpyZUdIT2c1cTh2QU1JaTZ4M3UyanNTWA==","repeats":1},{"count":736,"lower_bound":"TWV1dlV4TUg=","upper_bound":"TXpwVWZKZW9hckR2SA==","repeats":1},{"count":744,"lower_bound":"Tg==","upper_bound":"TkJPTA==","repeats":1},{"count":752,"lower_bound":"TkJwaTk5cEJPWFdJT2dYVk54Sg==","upper_bound":"TkpWTjVI","repeats":1},{"count":760,"lower_bound":"Tk02M3I2TEc1UXZlR256UWpBZG8xczBlTTk4WWFUTk8=","upper_bound":"TmFzSWc5cWV6TG0=","repeats":1},{"count":768,"lower_bound":"TmRLQg==","upper_bound":"TnRZRWRXYzZIV1gzTUxwZA==","repeats":1},{"count":776,"lower_bound":"TnRsb2doRWxDYWkydmpOODRYQ0ZUWmI2bk8x","upper_bound":"TzVMZ2NFNzhnVm85blg1Vk5wdlFha2hzQjBwVFM=","repeats":1},{"count":784,"lower_bound":"TzgxdEVUcGhMb2RIenN6","upper_bound":"T0tGMFdsNUs=","repeats":1},{"count":792,"lower_bound":"T01pRnk4NXdYWFZFUllMZQ==","upper_bound":"T2U5UHVMcW1CZTY=","repeats":1},{"count":800,"lower_bound":"T2VNMmtjNGx3Y1oxSDlyYzdyd2c=","upper_bound":"T204Q0VoRHVBdGMyank4SW9MT2Z3ZUNFMUk3ejU=","repeats":1},{"count":808,"lower_bound":"T255VWhLMWp5RVhrTXFRdFhRb0pYcmtJQUJydXhBdTE=","upper_bound":"T3VheGxWMGZsSFE0elJtV3FxVnRhR3Q=","repeats":1},{"count":816,"lower_bound":"T3k1VkxuUzJOY082UTVlMlFu","upper_bound":"UDEyZVFSdWcxNXlVTUdvMkJJb08z","repeats":1},{"count":824,"lower_bound":"UDRrRHM=","upper_bound":"UERUdDhyeHRLVlBuU1Y5bDdZOTNj","repeats":1},{"count":832,"lower_bound":"UElMZUMwQWFQWlFTeVUxbVBLbHh3MWJGTQ==","upper_bound":"UFhpaFFGNjBTM1Vjekc1ZVpzNFhPMnc2RHp6bw==","repeats":1},{"count":840,"lower_bound":"UFlQSHJO","upper_bound":"UGttS205dmc2NE9BRQ==","repeats":1},{"count":848,"lower_bound":"UHJHM3puS0lzenlEMlFmU2Y1VkJNbFFiU3Nyclc=","upper_bound":"UQ==","repeats":1},{"count":856,"lower_bound":"UUVkM2I4TnhBSjh3ZjBTN1A5RG84MUk5djRwbQ==","upper_bound":"UU1m","repeats":1},{"count":864,"lower_bound":"UU5RdUdT","upper_bound":"UWhNRjhoYXRQZ1MzdjZmNXBtVWxwWDFLazRSNDg3","repeats":1},{"count":872,"lower_bound":"UWpsSGR5NlU4dDNXZGFZdFh3Y1F2WXl4aTBpT0plQ04=","upper_bound":"UXBKenVSQWs4Y1E=","repeats":1},{"count":880,"lower_bound":"UXd5a1BlelRyQ21YTGpFd2Q2SXEwelpqNnpuVVJj","upper_bound":"UjBlV1BIeDR2ZUFLQlBw","repeats":1},{"count":888,"lower_bound":"UjRRQWV0REhuSGdEeG5DWU1xRE1TdU9raTRobw==","upper_bound":"UkNYOXA3d0F6TA==","repeats":1},{"count":896,"lower_bound":"UkZpRg==","upper_bound":"UllrRmE5T2lTRDU3OWV1OEJGam1rOWV1Wg==","repeats":1},{"count":904,"lower_bound":"Ulo2SEk4cWdvM3JvQ3VWMjNtZ3ZkMHYwVA==","upper_bound":"UmxBbVpCRFVZeWVrVk9LcWtNN29BV1JLbHFYMzA=","repeats":1},{"count":912,"lower_bound":"Umx2VXRtSg==","upper_bound":"Uw==","repeats":3},{"count":920,"lower_bound":"UzFvZkZMT1FL","upper_bound":"U0tDU0NHazg=","repeats":1},{"count":928,"lower_bound":"U1BhOEdqQnVNWUFVcg==","upper_bound":"U1ZpVW1r","repeats":1},{"count":936,"lower_bound":"U2RJa0V1YU1Pd3YzQWtQOWFEZnlRaVIyYQ==","upper_bound":"U2hUbG1lZG51cFJqTVFHbFRoZTRhSVBi","repeats":1},{"count":944,"lower_bound":"U2hVRUdSNUhVS0tvbUIzdEdKeUI3","upper_bound":"U3RrMUNpR3g2UGgxTVJOazg1d2JnWg==","repeats":1},{"count":952,"lower_bound":"U3Uxa09IRFJ0NHZYZg==","upper_bound":"U3ptcXNBMnlSenJMRHdKNWJPV3p1ZHZMUw==","repeats":1},{"count":960,"lower_bound":"VEIzQTF5NGo4NXFJem9ZdW0=","upper_bound":"VE1OazR1","repeats":1},{"count":968,"lower_bound":"VE9YeWxaWnlpSWRHUGpzSEhtdHBXZkNCeVR6","upper_bound":"VFZCTjhaOEpPZXgy","repeats":1},{"count":976,"lower_bound":"VFo4T1J0aEZTbzc2VjBFNGJiQVhvTnY0SA==","upper_bound":"VGNkWlpKbzI1REJwS3g5NDdiVjVoMTlqMUJF","repeats":1},{"count":984,"lower_bound":"VG1mS3gwRVZVckN5a05PWkxzeXhkYg==","upper_bound":"VUlOUDBKeFBKNlRkWVBnQnhqdG0y","repeats":1},{"count":992,"lower_bound":"VVFWcnhIYUc5c1o=","upper_bound":"VVdo","repeats":1},{"count":1000,"lower_bound":"VVdpNUZlMTNscnlqcVQwY25PSXZMcHFTSg==","upper_bound":"VW9ydnlya1BaenJVYk5lSW1xU0xOdEhHVkkzVE4=","repeats":1},{"count":1008,"lower_bound":"VXNTWVlPTXNKN0lrdHJJQzd6SnpuMlBkVFk3","upper_bound":"VkxE","repeats":1},{"count":1016,"lower_bound":"Vk9CbnBKQVZaSkx3ZTlFTWxoanF2TjVnTA==","upper_bound":"VlhhTklXVlplcm4=","repeats":1},{"count":1024,"lower_bound":"VmJTS3YyRjVlTjBMVHF6NTcxbQ==","upper_bound":"Vmh4dGZvT2FlZlV0Rm9aTDBwMGJFanRmZg==","repeats":1},{"count":1032,"lower_bound":"Vms=","upper_bound":"Vnd1TERnVGFmVnR5","repeats":1},{"count":1040,"lower_bound":"Vzc=","upper_bound":"V0tDaHFCcVNoRHU0bFFCY2swWnpuNXFxT1ph","repeats":1},{"count":1048,"lower_bound":"V0wyMVd1VjhtQUt3eVdYRnV3dmg=","upper_bound":"V1pVMzBZdkhtcEZ6cWg=","repeats":1},{"count":1056,"lower_bound":"V2tGaW9QM3phMA==","upper_bound":"V3dRaXZzVWs=","repeats":1},{"count":1064,"lower_bound":"WA==","upper_bound":"WEN4eTJQY1psSE9TWFVTdlJNMklFdUJPeQ==","repeats":1},{"count":1072,"lower_bound":"WERWMTE3bDdUU3RTcEM2aVNPVEl1Vw==","upper_bound":"WFFjRjFIWXN6","repeats":1},{"count":1080,"lower_bound":"WFUyMFg2ODVkT0tHejNLMFVCWjczT2NE","upper_bound":"WGpSc082S09SMm9VOW84SzRD","repeats":1},{"count":1088,"lower_bound":"WG9ZVjg1NzZNZWFjMg==","upper_bound":"WHZxMmxjUDl1TERyNng3dHdtWFBGYU9s","repeats":1},{"count":1096,"lower_bound":"WHpqag==","upper_bound":"WUQw","repeats":1},{"count":1104,"lower_bound":"WUhvS3FJdGhPeDVUbHdkWGpCSU8=","upper_bound":"WWFNOG9OQkVDWEpyVW1FdXVYYXJFZ2R4eUFPbDN1","repeats":1},{"count":1112,"lower_bound":"WWM5TkJUOFZSd2VGbEcwblU=","upper_bound":"WjVQd0hzelI=","repeats":1},{"count":1120,"lower_bound":"WkJOeEE1VUtxTzdq","upper_bound":"WmNsamd5","repeats":1},{"count":1128,"lower_bound":"WmpXUQ==","upper_bound":"Wm85T2lTVQ==","repeats":1},{"count":1136,"lower_bound":"WnZlaDlYMnBGQ3Z4","upper_bound":"YURXTkRXQWUwVHZFVmpJTlJOd0w=","repeats":1},{"count":1144,"lower_bound":"YUdoNnQ=","upper_bound":"YVRWc2lVRG5tQXdYZWk1U2Fv","repeats":1},{"count":1152,"lower_bound":"YVlUVndQSlVnUFJZRnhJVzBYZ3ZH","upper_bound":"YWNXWWViT2tiZVVQYQ==","repeats":1},{"count":1160,"lower_bound":"YWVlUlljUE43bWtkWkxjMFE=","upper_bound":"YWxGNFlMZTRBak1vR2w4djBP","repeats":1},{"count":1168,"lower_bound":"YW5DeUdRYmRLWWhn","upper_bound":"YXFFUGZSS2M0UnVRemU=","repeats":1},{"count":1176,"lower_bound":"YXZHbEhZUFNqQTJaaFViNm1XS3Nhaw==","upper_bound":"YjV1YkJoRzNQUDVsalB5WlluZEliMGFxbmlkSWVV","repeats":1},{"count":1184,"lower_bound":"YkJqWnpIOEU0WWk=","upper_bound":"YkluZ3kzUUhTR0JESHU=","repeats":1},{"count":1192,"lower_bound":"Yk1wQ3h1NVhJcjhta0VDSWtDdw==","upper_bound":"YmJqOGVKMWtRVUcwYVNic1pvUW9paVQ0TlQ=","repeats":1},{"count":1200,"lower_bound":"YmU=","upper_bound":"Ym5QRg==","repeats":1},{"count":1208,"lower_bound":"YnNFd2VBd1MzMjQ=","upper_bound":"YnpLSWNNY0kyNWdJSGxQR3EwVHJ2a292bmhxbA==","repeats":1},{"count":1216,"lower_bound":"YzBFOXhtcjFWUTVCS0c=","upper_bound":"Yzg3djNobk0=","repeats":1},{"count":1224,"lower_bound":"Y0FueVpqbUlWNQ==","upper_bound":"Y1JicjZSeWhKdlMwQ1IyU2ZjVEJMazdD","repeats":1},{"count":1232,"lower_bound":"Y1N6","upper_bound":"Y1p5ZHJq","repeats":1},{"count":1240,"lower_bound":"Y2ppTmI2enFiZHh4cnQ=","upper_bound":"ZDFBZDRBbDNiOVpnT3Iwd0R2djJxMw==","repeats":1},{"count":1248,"lower_bound":"ZDFTUHVheHhpY0ZYcktyeml3REhoeWJ6UVo=","upper_bound":"ZEJDQjJPMjBYakduYU1qRTl6ODdNeGhzNnpt","repeats":1},{"count":1256,"lower_bound":"ZFpYa1VTTUZUSjllTFFXRDhralRCaA==","upper_bound":"ZGQ=","repeats":1},{"count":1264,"lower_bound":"ZGQ2S3REYlI1NExmQTN3Q21yMEdzWmI5T01uZHhm","upper_bound":"ZQ==","repeats":1},{"count":1272,"lower_bound":"ZTBYSmh4a3NKU2xpUHgzZWU=","upper_bound":"ZTZTazNIVFNJcGxyWlJoUjI3TzdOYTg0b3NB","repeats":1},{"count":1280,"lower_bound":"ZUVkUlVJYk5aVU5WWHFJNzNEOU4=","upper_bound":"ZVJ5Smx4TDFjQXRJYTZIMEtxd2NoeHhZaXYxb01ieQ==","repeats":1},{"count":1288,"lower_bound":"ZVU1bjdnNjlESXk2MWNQd09iMmZ0VWdCeUxu","upper_bound":"ZW44bVh0TnhKczZTTk92NWo2UVJObk5tMDRaN3Bv","repeats":1},{"count":1296,"lower_bound":"ZW9M","upper_bound":"ZXVDQklidkxK","repeats":1},{"count":1304,"lower_bound":"ZXZGUFZxYWxGdkJPUnVxc0h6UVZUeG1z","upper_bound":"ZXhKOUxvMEd1UE1aVjVkd29PeDQxb21pVDNSZA==","repeats":1},{"count":1312,"lower_bound":"ZjZsYUxhQUY=","upper_bound":"ZkZzcUxUOEJRRzFxNUYyRWNOdTRKS2JkSA==","repeats":1},{"count":1320,"lower_bound":"ZkhoMVhack1yYg==","upper_bound":"Zk9aSXJCV3hkand1NjVUNHJXeW5PdEllag==","repeats":1},{"count":1328,"lower_bound":"ZlQzZ0NPczVybzJxbEo0bmdPejBVUXE=","upper_bound":"ZmdDR0FLNnYwVlBu","repeats":1},{"count":1336,"lower_bound":"Zm0xSmVLTnlzdmR4RHh1OG9PWA==","upper_bound":"ZzV3aFVhandmcElyNnh4STU=","repeats":1},{"count":1344,"lower_bound":"ZzZFTFdlS1loRGQ5bjhkUFhvSFU2djZaRUU=","upper_bound":"Z0IzRGs4bVNjbnoyMmpIQk9LTmUxUEVzTjg4Tw==","repeats":1},{"count":1352,"lower_bound":"Z0VRT1hyMG1GOEp3ekg=","upper_bound":"Z0lNNUtFRENVaA==","repeats":1},{"count":1360,"lower_bound":"Z0o3dW83ZUVk","upper_bound":"Z1lldzh5NklGVGx2bXo4Vw==","repeats":1},{"count":1368,"lower_bound":"Z2JQNlMwa0U0c2NhTndKdndlNldoSTJERjFaZ2JE","upper_bound":"Z3FxRG42Zzc5","repeats":1},{"count":1376,"lower_bound":"Z3J2bmVSbHVsdg==","upper_bound":"aDBIMzd3d1luMUtaZW56VU5qbTdXdU0zMHB1UEE=","repeats":1},{"count":1384,"lower_bound":"aDI3ckszRFhselFybVNSdVFCMU11Zmd0bldzYg==","upper_bound":"aDhRdlMxNXBZaVF0UUkzM2tRemRIZQ==","repeats":1},{"count":1392,"lower_bound":"aDhlam1USw==","upper_bound":"aEZvMnhCOVB3cXA=","repeats":1},{"count":1400,"lower_bound":"aEhubGhkS041TzNjTVdLWEtFZGxrclRLSGlpSm1kZG0=","upper_bound":"aGF0UDB5T1I5","repeats":1},{"count":1408,"lower_bound":"aHdMMXc1M1dGNk55ZGR5Z2UzZGdOVlg0Zw==","upper_bound":"aUY2enRVb0d3MEJPbA==","repeats":1},{"count":1416,"lower_bound":"aUZj","upper_bound":"aVltcXZQM0FxWHlhQVR0YjNYQ3dRelNq","repeats":1},{"count":1424,"lower_bound":"aVpVREZlTE9pT3dLOWdPc3VsSFdRaFJ5SQ==","upper_bound":"aWdDajY1YmtxRFN0aDM=","repeats":1},{"count":1432,"lower_bound":"aWhCVlFPTFNaaW5rZGNYS3pQR1A0bWh5SWk4eG84","upper_bound":"aWtCcE9zRmVn","repeats":1},{"count":1440,"lower_bound":"aXEwdUU0S1VQTVNjME4yQ05MNmVsNkQ=","upper_bound":"aXhiek4ycDc1YUNPa3EwU2FtUnM=","repeats":1},{"count":1448,"lower_bound":"aXhwVHluZ2daNVQxazluTzZXZklqTg==","upper_bound":"ajNaS0ZLTWZvYzVocFVyYWgz","repeats":1},{"count":1456,"lower_bound":"ajdDSkVTcG8=","upper_bound":"ak9BYVltRVF0Qjc=","repeats":1},{"count":1464,"lower_bound":"ak9KalJvaFV5OThJSVRiZFdR","upper_bound":"amFYd0xuWDVKMXlLZVZZdWxNQQ==","repeats":1},{"count":1472,"lower_bound":"amFiQnMzTzRoNkFnTDNmV3VvckpGRnlpTA==","upper_bound":"amVsdUpmNg==","repeats":1},{"count":1480,"lower_bound":"amtoUDNxYnlieTFVSllUcGNUejZHN0JxVw==","upper_bound":"am1WV1Z4aGhCYmVocmRtSnIwUWNrQll2NA==","repeats":1},{"count":1488,"lower_bound":"am1wZ0NGM3pmVjRNcjNqeFpWTTFraThudA==","upper_bound":"anRpRGU3YWNyYU1vN1VFTUFTaQ==","repeats":1},{"count":1496,"lower_bound":"azBR","upper_bound":"azlQV2xtSnd4VGEwek9kWldYRU82U1FCNFlmQXE=","repeats":1},{"count":1504,"lower_bound":"a0V1b1ZFSkRraFBN","upper_bound":"a1E5SGFEb3doNzEzRmFkS25scFFORUVObVEwMA==","repeats":1},{"count":1512,"lower_bound":"a2NKcGh2bWtWNGVyMzg=","upper_bound":"a2w=","repeats":1},{"count":1520,"lower_bound":"a3IybnNvRVlNSUcyUGJW","upper_bound":"a3pZVXdzeFZlZDE4Q2U=","repeats":1},{"count":1528,"lower_bound":"bDRW","upper_bound":"bEp0RE9XUW0y","repeats":1},{"count":1536,"lower_bound":"bE94","upper_bound":"bFRETU9z","repeats":1},{"count":1544,"lower_bound":"bFZMR1VDNkVZenhIRGVrZUdtNkxqbllhcHFmTks=","upper_bound":"bGdrSDdkQ29FNTc3bEk=","repeats":1},{"count":1552,"lower_bound":"bGd4RGlRV2xadWttZ2gxYWVtS01sYTc=","upper_bound":"bHNSV1ZZbzFKeVB6VzQ=","repeats":1},{"count":1560,"lower_bound":"bHRJVkxlVTdIellhdXI2ckJ4ZEZ2","upper_bound":"bTN2M0ZLc0p0Yw==","repeats":1},{"count":1568,"lower_bound":"bTdOeVM0T3BodDd2WVRjelBZ","upper_bound":"bURRbThrRkxPNGRtb2V3","repeats":1},{"count":1576,"lower_bound":"bUU2SEVIWm5Na3NJeFNWWGpTRGwyY0tlenk1Zg==","upper_bound":"bUw4Rk5G","repeats":1},{"count":1584,"lower_bound":"bUx6SnRBZEpNSkUwOVlQbHdXVlNSeg==","upper_bound":"bVNmd0F6NElFSzRz","repeats":1},{"count":1592,"lower_bound":"bWF6bGJCbU5OOGN1RlQ1","upper_bound":"bWYxQUNRZHNOcjA=","repeats":1},{"count":1600,"lower_bound":"bWZxR0gyRGgzaTc1MkJBcVZkcDJIQTVZNHhkbFc=","upper_bound":"bWx5Rg==","repeats":1},{"count":1608,"lower_bound":"bW85aVhIUkFmZGZjZGNqRXFGcHpq","upper_bound":"bXZ3ZE1wSng2UUF5RHJ1Wk9G","repeats":1},{"count":1616,"lower_bound":"bXdsS2N0Tmtreg==","upper_bound":"bkNJejNuNzZDaVEzQ0VDakRNTklw","repeats":1},{"count":1624,"lower_bound":"bmM0STBxZzB5T0xu","upper_bound":"bm5LaUNU","repeats":1},{"count":1632,"lower_bound":"bm9qYmNWRk5xUnM1NmtUS1owYkJsUHdOQk5rbw==","upper_bound":"bzBTTmdRaE00TzdIdzQ=","repeats":1},{"count":1640,"lower_bound":"bzJZWA==","upper_bound":"bzlXSDJFd1UwelM3RUNnN21QSXNYa1R2","repeats":1},{"count":1648,"lower_bound":"b0dtY2RrWTZVeUpaZEdmU3pTOEhXcjdS","upper_bound":"b1JpWmtMUEE2Qnc1MEJUVkZCejExR1p1TjZMUg==","repeats":1},{"count":1656,"lower_bound":"b2ZaWmEzcnhJbFBoRFJiVlpuNnN5","upper_bound":"b2pOM2Y3V3hwT0NzU1hCWA==","repeats":1},{"count":1664,"lower_bound":"b2plT0xPQ1Q=","upper_bound":"b25ndmwxNldERDFCaXZWT1EycTg4OU8xNWZSQnE=","repeats":1},{"count":1672,"lower_bound":"b3BlUEdjaGxrcnhpZ2FTNQ==","upper_bound":"b3ZmOTU1OUY3dm5KcHVZNVNl","repeats":1},{"count":1680,"lower_bound":"b3hGME94UlY3YXYxcGFub0Y=","upper_bound":"cEpIYnhJU2ZW","repeats":1},{"count":1688,"lower_bound":"cFFhUkF5c3U0OEI2aGlGWnc4d0ZFSmM=","upper_bound":"cFk3OGdVS1BQMmVQN2lkNXVCRklkY0lGYzJkajZRRQ==","repeats":1},{"count":1696,"lower_bound":"cGNVdk5rRU9kZjJVT1pTQg==","upper_bound":"cGtCcXJ6eVA2","repeats":1},{"count":1704,"lower_bound":"cG5BSVVQbGV0Wk9mNA==","upper_bound":"cTRiak4=","repeats":1},{"count":1712,"lower_bound":"cURLYk1lTW5XNUxKd3ZQckFPNGV3N1BtVQ==","upper_bound":"cVVqVkhhRHRFaVlPS1ZU","repeats":1},{"count":1720,"lower_bound":"cWFtYjR2","upper_bound":"cWtwcUJzZGdWNnM5NnBYTXZZT3VHN3Vp","repeats":1},{"count":1728,"lower_bound":"cXYxVHBhQ2VSNGwyWDlqQWlNUGEyMWM=","upper_bound":"ckNCVlc4dkFJdmhDb0N5a2ZTT3hEUHhaSXNjUkQ3dWU=","repeats":1},{"count":1736,"lower_bound":"ckRxcGhqR1NiU2k2SEw4T2RIdzB2dVk2YzM0SldSQ2M=","upper_bound":"ck5jYm1SNE9iTVBLZkVYUXpTbENjeWFOaHZ0cW5xNDc=","repeats":1},{"count":1744,"lower_bound":"clRRU2lpbUsyZm4=","upper_bound":"cmFKZWpiUWNMNTY3S0oxZW5sVG5SdmJ1b0NuTHhMMGU=","repeats":1},{"count":1752,"lower_bound":"cmVjNVJRQ1ptdmlqS0xkTE5KaA==","upper_bound":"c0F6b2EyMWM5WmZhZ21sVEs=","repeats":1},{"count":1760,"lower_bound":"c0NBeG5RY0laWFcyY0I=","upper_bound":"c0lxQ2NIOXNH","repeats":1},{"count":1768,"lower_bound":"c0l0dA==","upper_bound":"c1BUY2RnblNWdnJPUGsza0VPNkVpanR6bTQ5","repeats":1},{"count":1776,"lower_bound":"c1I0UldMY0JoZklJemhqUVQxUjdqZHBIaTlQ","upper_bound":"c2FDeHVneTV6NXpJaGh1THc=","repeats":1},{"count":1784,"lower_bound":"c2N1bDFLdXpZa1p5cGZqTWNjMlFOUWhZMUpOY3JLZA==","upper_bound":"c2VxWGd5QzlTVkNPeUp1T3libG9VUExzT3lM","repeats":1},{"count":1792,"lower_bound":"c2l1MTlNZ0tYTUpFMExxYVdVSzk=","upper_bound":"c3MwRU8zZEpIVVk3NW1Ya201YUFsdWNCZWpqdElLM1k=","repeats":1},{"count":1800,"lower_bound":"c3RQSWo=","upper_bound":"dA==","repeats":1},{"count":1808,"lower_bound":"dDZEYktXcGxaSFA=","upper_bound":"dDdkeGVaRA==","repeats":1},{"count":1816,"lower_bound":"dDlmcVNQS1ViWGZBZ3ozRHdzME9aMXZMSQ==","upper_bound":"dE81NVo=","repeats":1},{"count":1824,"lower_bound":"dFk3ZQ==","upper_bound":"dHBoVFFxTmROR21QOFlnWFhZYlN1bkY1TVRUMTR3","repeats":1},{"count":1832,"lower_bound":"dThIWVZabG5u","upper_bound":"dUt4M3cwaXo=","repeats":1},{"count":1840,"lower_bound":"dUxzSFlkWms3blc2U3J5ZHBvRXpqNUM4Vm4=","upper_bound":"dWFIZVMycXZJSVBtZWN5MFNya2tjRTRXNnNITFg5","repeats":1},{"count":1848,"lower_bound":"dWNsQnZ5N0hhQWp5RlNtcmFjS2o0U3FWOA==","upper_bound":"dWl6","repeats":1},{"count":1856,"lower_bound":"dW5ZSA==","upper_bound":"djNIc3dmNVA=","repeats":1},{"count":1864,"lower_bound":"dkJaeWVqc0JwQUlVbFg=","upper_bound":"dkZlRGtqanp3UVBpNEZs","repeats":1},{"count":1872,"lower_bound":"dlFEd0FRT2NRY0Ja","upper_bound":"dnREYw==","repeats":1},{"count":1880,"lower_bound":"dw==","upper_bound":"dzE5V3ZKQ2FOT21JVlI0MkJaODVQYlpZMWo=","repeats":1},{"count":1888,"lower_bound":"dzRWaGF3WWFlZWpvZEU5ek4ydDc=","upper_bound":"d0RIM0J1aUg0MktMV1I=","repeats":1},{"count":1896,"lower_bound":"d0ZlOXRoUFZlQ05vaUU=","upper_bound":"d1RtT3lTaFk4Vw==","repeats":1},{"count":1904,"lower_bound":"d1RxSFBTVjA4Rw==","upper_bound":"d24=","repeats":1},{"count":1912,"lower_bound":"eDJUR3M3RHdwYVhLYWYxNVpoZkdGNjE=","upper_bound":"eDZYVHhISWZiZUM3Z21nMHN3RFdrN2Y0YzJlc0U=","repeats":1},{"count":1920,"lower_bound":"eEQ=","upper_bound":"eGNrUzVBMlI4QUhEN1ZTV0k1WW1acQ==","repeats":1},{"count":1928,"lower_bound":"eGZaNFh5ZVZvUTd1b2VqZDRDM3FZQWNIaG12","upper_bound":"eGpKYWdMYUtGS0hhdWp2V09MZVpXd3hub0o=","repeats":1},{"count":1936,"lower_bound":"eG5NeGl2b2lZWEtNUw==","upper_bound":"eHVLTzk=","repeats":1},{"count":1944,"lower_bound":"eTA5RjVyTUVudkNKbDl6VHdPZ2dhM3A=","upper_bound":"eTVQaVlZZldXTWxMQVEydk90UXRP","repeats":1},{"count":1952,"lower_bound":"eU1OWmFQRFRhN1dHOG1FTA==","upper_bound":"eVJBcnl1ellS","repeats":1},{"count":1960,"lower_bound":"eVNCVGxvcDlRTk1pQzIzSmdYd2pnSThSMHR4","upper_bound":"eWs4Q0Z0aVhGVkdqcGFlcG8ySmxDaHNsRlZiVDI=","repeats":1},{"count":1968,"lower_bound":"eWxSUk9GcURZbXhEMTF1VkZMMEtq","upper_bound":"eXRLUnk4ZjJkNEM1QmZVUFFqVUpGQkVYUFBLdTA=","repeats":1},{"count":1976,"lower_bound":"eXpLSUlhak5mOUdlN0Z6Mzl0WlVkVA==","upper_bound":"ejdXaDI5Yk5meQ==","repeats":1},{"count":1984,"lower_bound":"ejk2dmszTEYzUDBzZU8ySjNLSFNRZVM=","upper_bound":"elQybVZmaHV4eXJ5aER1Nw==","repeats":1},{"count":1992,"lower_bound":"elRVajl3T2huejdKbTA2VTduY0l5SElITDNhRGNq","upper_bound":"emlQcXp6dmlWR05XMHVO","repeats":1},{"count":2000,"lower_bound":"emt1bmJ6SWp6NXBFS0dBUk1mNW9lSzV5aVR2UEhrVHY=","upper_bound":"enluSUFkQ2cwTHVwV0VNcUJxa25RNVZQUHI4bGlUSg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,1,0,2,0,0,2,3,0,2,0,3,0,3,2,2,1,1,1,2,1,1,3,0,0,2,1,0,3,2,0,2,0,1,1,0,1,0,2,2,0,1,1,0,1,1,1,2,0,2,1,2,0,1,3,2,0,1,1,1,1,0,2,0,1,1,0,1,3,0,0,1,1,2,2,0,0,2,1,1,1,0,5,2,1,4,0,1,6,1,1,1,2,3,3,0,1,0,1,1,0,2,1,1,0,1,2,1,1,1,1,1,0,1,0,2,1,4,1,1,4,2,0,1,1,1,0,2,0,1,1,2,1,0,0,0,0,0,2,0,1,2,0,1,2,3,2,1,1,0,1,1,2,0,0,1,1,0,1,2,0,2,2,0,3,1,1,0,0,0,2,1,2,1,1,1,0,4,1,1,1,1,1,2,0,3,0,0,0,0,0,0,2,3,1,1,0,0,0,0,2,1,3,0,0,0,0,1,1,0,2,2,0,2,3,0,1,2,0,0,0,1,3,0,1,2,2,1,1,2,2,1,0,2,0,5,1,0,0,1,0,1,1,1,0,2,1,0,5,0,2,1,1,0,2,4,0,0,0,1,3,1,1,0,1,0,1,0,2,1,0,1,0,1,0,0,1,1,0,1,0,1,1,0,1,2,1,1,0,1,2,2,0,1,0,1,1,0,0,2,0,1,2,0,1,1,1,0,0,0,0,1,1,1,1,0,0,3,0,1,0,0,3,1,3,0,1,0,1,2,2,1,1,0,0,3,2,0,2,0,1,0,2,2,1,0,2,2,1,1,2,1,2,3,1,1,0,1,0,2,0,0,1,0,1,2,0,0,2,1,2,2,3,2,3,0,1,1,1,0,0,0,1,3,0,0,1,3,2,0,1,2,0,1,0,1,0,2,1,1,1,1,1,0,0,2,3,0,0,3,2,0,0,0,1,0,0,1,0,1,1,0,1,2,0,0,0,1,0,0,0,2,0,1,1,2,0,1,1,1,0,1,3,0,1,1,2,3,1,0,3,1,0,0,1,0,1,0,0,1,1,2,0,1,1,2,2,1,2,1,0,1,1,2,2,3,1,0,1,1,0,0,0,0,2,0,2,2,3,2,1,2,1,0,0,0,1,1,2,0,2,1,0,2,1,3,3,0,1,4,2,2,1,1,1,0,1,4,1,0,2,0,2,1,0,2,2,0,2,2,0,0,0,1,1,1,1,0,2,1,3,1,0,3,1,0,1,3,1,0,1,1,0,1,1,1,1,0,0,0,0,1,1,0,0,1,1,3,0,2,1,0,1,0,0,1,1,1,0,0,1,1,1,1,2,1,0,2,1,1,0,3,0,0,2,0,0,0,1,2,1,0,1,1,1,0,0,1,5,1,0,0,1,1,2,1,0,0,0,0,0,0,1,0,2,3,1,0,2,2,2,0,1,1,2,1,1,0,0,2,0,2,0,1,0,0,0,1,1,0,0,1,0,0,1,0,1,1,2,1,3,2,1,0,1,1,2,1,0,0,1,3,1,1,0,1,0,1,0,1,2,1,0,1,0,1,2,2,1,1,1,0,1,1,1,0,0,0,0,0,1,1,1,0,1,1,0,0,0,1,0,0,0,2,0,1,2,0,0,1,0,1,0,3,0,1,2,0,0,1,3,0,2,0,1,1,2,2,2,1,1,0,1,1,1,2,1,0,0,0,0,3,0,0,2,1,4,1,1,1,0,1,3,1,2,2,4,0,1,1,1,0,1,3,3,0,1,0,0,2,2,2,2,1,1,1,0,3,1,0,0,0,2,1,2,1,0,2,0,1,0,0,3,2,3,0,0,0,1,0,1,1,1,0,0,0,0,0,3,0,2,0,0,2,0,0,0,3,1,1,1,3,2,0,0,3,0,1,1,2,1,1,0,1,1,2,1,1,1,2,0,3,2,2,2,0,1,1,1,0,0,3,0,1,1,2,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,0,2,0,0,1,0,3,2,2,0,1,0,1,0,0,0,0,0,2,0,1,1,0,0,0,2,1,2,1,1,2,2,1,2,2,1,1,1,2,3,1,1,1,1,0,1,2,1,0,1,1,0,2,1,0,0,2,1,1,0,0,2,1,0,0,1,1,1,1,2,1,3,1,0,1,2,1,1,3,2,0,1,0,0,2,1,0,1,2,1,1,0,0,0,1,0,0,0,3,0,1,1,0,0,2,1,2,0,1,0,1,0,2,1,2,1,1,0,0,2,0,0,1,1,1,1,0,0,0,2,0,2,3,0,0,0,0,2,0,0,2,0,0,1,0,0,1,1,1,0,1,1,0,2,1,0,0,1,2,1,0,4,0,0,3,2,0,2,2,1,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,1,0,4,0,1,0,2,1,0,0,3,1,1,2,0,1,5,1,0,1,0,0,1,2,2,3,0,1,1,0,1,3,1,2,1,2,0,2,3,2,1,1,1,0,0,2,0,2,1,1,2,2,2,3,0,2,0,2,3,1,1,1,0,3,2,1,2,0,1,1,0,1,0,0,0,1,1,0,0,3,2,0,1,1,1,3,2,0,1,0,1,2,1,1,0,1,2,1,1,1,1,2,0,0,1,1,3,0,1,2,1,0,0,4,0,0,1,2,1,1,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,0,0,0,1,2,1,1,0,2,2,1,2,2,0,0,0,0,1,1,1,1,0,1,0,1,1,1,1,0,0,1,1,0,1,0,2,0,3,2,1,1,0,1,0,2,2,0,1,2,0,2,2,1,2,0,0,2,1,0,0,2,2,1,0,0,0,0,1,1,0,0,1,0,2,1,0,1,1,3,0,0,1,2,0,2,1,1,1,1,1,1,1,2,2,2,1,0,1,3,0,1,1,2,0,0,2,1,2,1,0,0,1,0,0,0,0,1,0,0,0,0,0,2,2,1,1,2,0,2,1,0,0,4,0,0,0,0,4,1,2,1,1,2,0,0,0,1,1,0,1,2,0,0,0,1,0,1,3,2,0,1,0,2,0,0,1,2,4,1,1,3,1,0,2,0,2,0,0,1,0,1,1,1,1,2,0,0,0,0,0,0,0,1,2,2,2,0,0,3,1,1,3,1,0,2,0,0,0,2,5,0,1,1,1,0,2,0,1,0,1,0,1,1,1,2,4,1,1,2,2,0,3,0,1,0,0,0,1,1,1,1,0,0,1,1,2,1,3,1,0,1,1,0,0,2,1,0,0,1,1,0,0,1,0,4,3,3,0,2,1,0,0,1,0,0,0,0,0,1,1,0,1,0,0,0,1,0,2,2,2,1,1,1,1,3,0,1,0,1,2,2,2,1,1,0,2,0,0,0,6,1,0,1,0,0,0,0,0,1,1,0,1,2,0,0,0,1,3,2,1,1,2,1,1,1,2,1,0,0,0,2,1,1,1,1,1,1,1,0,0,3,2,3,0,0,0,1,1,0,1,1,1,0,1,2,1,1,0,1,1,2,0,2,1,1,1,1,3,1,2,2,0,1,1,1,1,0,0,0,0,1,1,0,0,3,3,1,0,2,1,2,2,1,1,2,0,0,0,1,0,1,0,0,2,0,0,0,0,1,0,1,2,5,1,0,2,0,0,2,2,0,0,0,3,1,2,0,1,0,0,1,1,0,1,0,1,0,1,2,1,1,1,0,0,0,0,1,0,3,0,1,3,0,0,0,0,0,0,1,0,1,0,1,1,1,3,0,3,2,0,2,0,0,0,2,1,1,1,1,1,0,0,0,1,0,2,0,2,1,3,1,2,1,1,2,1,1,1,1,1,0,1,1,1,1,1,2,0,1,1,0,1,0,2,0,0,3,1,0,1,1,0,1,1,0,3,2,1,1,1,0,0,2,1,0,1,2,1,2,0,0,3,1,0,1,2,2,1,1,0,1,1,1,2,0,1,0,2,1,0,4,2,1,2,0,1,3,4,0,0,0,0,1,0,0,2,3,1,1,1,0,1,0,1,0,1,0,1,1,1,2,2,0,0,1,1,1,0,3,0,1,4,3,1,0,1,0,1,2,1,1,1,1,0,2,0,0,0,0,2,1,2,0,1,2,0,1,1,0,1,0,2,3,3,1,0,1,1,1,2,0,2,0,1,2,0,2,1,1,3,1,0,0,1,1,2,2,1,1,1,3,0,1,1,1,1,1,0,0,1,2,1,1,1,1,0,3,2,1,1,0,2,1,0,3,0,4,0,1,0,0,5,0,2,1,2,2,1,2,2,0,2,1,0,1,1,0,1,0,0,0,1,1,3,2,1,0,1,1,0,1,1,0,0,1,1,1,0,0,1,3,0,1,0,1,0,3,1,2,1,3,1,0,1,3,1,0,1,1,0,2,3,0,2,0,0,0,1,0,1,1,1,0,1,0,0,2,0,1,0,2,2,2,2,1,0,0,0,1,1,0,0,3,0,2,0,1,1,2,0,2,3,2,0,1,1,0,1,1,2,0,0,1,0,0,0,1,1,0,1,1,1,4,2,0,1,2,0,2,1,0,0,3,3,1,1,2,2,1,0,2,2,2,0]},{"counters":[1,0,2,1,0,0,1,2,1,2,2,2,0,2,0,3,0,0,1,3,1,0,1,0,1,0,1,0,1,2,0,0,1,1,2,1,1,0,0,5,1,1,1,1,1,2,2,3,0,2,0,2,0,2,1,2,0,1,2,1,1,1,1,0,2,0,0,3,0,0,2,1,0,0,0,1,0,0,0,0,1,1,1,3,4,1,3,1,0,1,1,2,0,0,0,1,1,0,1,2,1,3,0,5,0,2,1,0,1,1,3,0,2,0,1,0,1,0,0,0,0,3,0,1,0,1,4,1,2,2,0,0,0,0,1,1,0,3,1,0,2,1,1,1,0,0,3,1,1,2,0,2,3,0,0,1,0,2,2,1,0,3,1,0,0,1,0,0,2,3,1,2,1,2,0,2,1,0,2,2,3,0,0,0,1,2,0,1,3,1,0,3,1,3,2,1,1,1,1,0,1,0,0,0,1,2,1,1,0,1,0,2,0,2,1,0,2,1,0,2,0,0,2,0,0,1,2,0,0,1,1,1,1,0,2,2,0,2,0,1,1,1,1,1,0,1,0,0,2,0,2,3,0,1,0,1,1,3,0,2,0,3,2,1,0,1,0,1,0,0,4,3,2,0,0,1,0,0,0,0,0,1,1,0,1,1,1,1,3,1,1,0,2,1,0,2,3,1,2,0,0,1,0,0,1,1,0,2,3,1,0,2,1,1,0,2,2,0,2,0,0,0,0,2,1,2,1,1,0,0,2,0,2,2,0,4,1,0,1,3,0,1,1,0,1,0,0,0,0,1,0,1,0,0,2,2,1,4,0,1,1,4,3,1,0,0,0,2,3,1,2,1,0,0,1,0,5,0,1,1,1,0,0,2,1,2,2,2,0,0,1,3,1,1,1,0,0,0,2,1,1,0,2,0,1,0,2,1,2,0,1,1,0,2,3,3,2,1,0,1,0,1,3,0,1,1,2,0,0,0,1,1,0,0,0,0,2,1,1,2,0,4,2,1,0,2,1,0,2,4,2,1,0,0,1,1,1,1,1,1,0,0,0,0,0,2,0,4,0,0,4,0,0,1,0,2,0,1,0,0,0,0,2,1,1,1,2,1,0,2,0,0,1,2,0,1,0,0,1,0,2,1,0,1,3,1,0,0,1,0,1,0,2,4,1,1,0,0,1,0,2,2,3,1,1,1,1,3,0,0,1,1,1,1,1,3,1,2,0,2,0,0,2,1,2,0,0,4,0,1,1,2,2,2,2,0,1,1,1,2,3,1,1,1,1,1,1,1,1,2,1,3,1,3,2,0,0,1,3,0,0,1,1,0,1,2,2,1,2,4,2,0,0,0,0,0,1,0,1,2,0,0,2,0,1,0,2,1,2,5,0,2,2,1,0,1,4,0,2,0,2,1,1,0,2,0,1,0,4,2,0,1,4,1,0,0,1,0,0,1,0,0,1,2,1,0,1,2,1,0,2,0,0,0,1,2,0,0,2,0,0,1,1,1,0,1,0,1,1,1,1,1,0,1,0,2,1,0,1,0,1,1,2,0,1,1,0,2,2,1,1,1,1,1,0,1,0,0,3,1,1,0,3,1,1,1,2,1,1,0,0,1,1,1,0,0,3,1,0,1,4,0,0,0,0,3,1,0,0,1,1,0,1,1,5,2,1,1,1,1,0,3,1,3,1,0,2,4,1,1,0,0,0,0,1,0,1,1,2,0,1,2,2,0,2,1,0,0,0,0,0,1,1,2,1,1,1,1,4,1,3,2,0,0,0,0,1,2,0,0,0,3,0,1,4,0,3,0,3,3,0,2,1,0,1,1,2,2,1,1,0,1,1,2,0,2,2,0,1,2,0,0,0,0,3,0,2,2,1,1,0,0,0,1,1,0,1,0,0,2,4,0,1,2,0,2,0,1,1,0,2,1,1,1,3,0,0,1,3,0,3,2,0,2,2,0,1,8,0,0,1,1,1,1,1,2,0,0,0,4,0,1,0,1,0,1,0,0,0,0,0,1,1,1,1,2,1,1,1,1,2,1,1,0,0,1,2,3,2,0,1,1,0,2,0,0,2,1,2,0,0,2,2,2,0,2,2,2,0,1,1,1,0,0,1,2,2,1,1,0,0,0,0,2,0,1,1,2,1,3,2,0,0,2,2,0,1,3,1,2,1,0,0,1,2,0,0,0,0,0,3,1,1,0,0,0,0,1,1,0,2,1,1,1,0,2,1,0,1,1,0,0,1,1,1,1,4,1,4,0,1,0,0,0,0,3,0,2,0,0,1,1,0,0,1,1,3,1,1,0,1,0,1,3,3,2,1,0,2,2,0,1,1,1,1,0,0,1,1,1,0,1,4,1,0,2,1,1,2,2,4,1,1,2,1,0,3,1,1,1,1,0,0,2,2,1,0,0,0,0,0,0,1,0,1,1,4,2,1,3,2,0,2,0,1,1,1,0,0,2,1,1,0,1,1,2,1,1,0,0,0,1,2,0,0,3,2,1,2,1,0,2,2,1,1,1,1,1,0,1,0,1,0,0,2,0,0,0,2,1,2,0,1,0,0,0,1,0,1,0,0,0,0,0,0,1,3,1,1,1,2,3,4,1,0,1,0,2,2,0,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,2,1,0,0,2,0,0,1,2,0,2,0,1,1,1,0,0,1,1,1,0,0,0,1,1,2,1,0,0,1,0,1,0,2,1,0,0,1,0,1,0,1,1,3,1,2,1,0,0,0,0,0,0,1,0,0,0,1,3,0,0,1,0,0,1,1,1,1,1,1,2,0,1,2,1,2,0,2,1,0,3,1,3,0,1,0,2,1,1,2,2,0,0,3,2,1,4,0,0,0,0,0,1,1,1,3,1,2,0,0,1,0,1,2,1,2,0,0,2,1,0,0,3,2,0,1,1,0,0,0,0,0,0,0,2,0,0,0,2,0,0,2,0,1,0,0,0,1,0,0,0,1,0,7,1,1,1,0,3,1,0,0,0,0,2,0,0,4,1,2,0,3,2,1,1,1,0,4,0,0,1,0,0,2,1,4,0,0,0,1,2,0,0,0,3,2,0,0,1,0,2,0,0,4,0,0,2,1,2,1,1,0,0,1,0,1,1,0,0,0,2,0,2,1,1,1,2,2,0,1,3,2,0,0,1,1,0,1,0,1,2,0,0,0,3,2,4,0,0,2,1,0,2,0,0,2,1,1,1,0,3,2,2,0,1,0,0,1,1,1,0,0,2,3,0,3,0,4,2,0,1,0,0,0,1,1,1,0,0,0,0,1,0,1,2,2,3,1,1,1,1,0,1,2,1,2,1,1,1,0,1,0,1,1,0,2,1,1,0,2,0,1,1,1,2,1,1,1,1,1,1,0,2,0,0,1,1,4,1,0,1,1,0,0,2,0,1,3,0,1,0,1,1,0,1,0,0,1,1,0,1,0,2,1,3,1,4,4,2,0,1,0,1,1,2,1,1,0,1,1,1,0,2,2,1,0,0,2,0,2,0,0,2,0,2,1,0,0,2,1,3,0,3,0,1,3,1,2,2,0,3,0,0,1,0,1,0,3,1,2,1,3,1,1,2,0,0,0,2,0,0,0,1,0,2,1,1,2,1,0,0,0,0,2,1,0,0,0,1,1,5,0,1,0,1,0,2,2,1,0,1,0,1,1,0,0,0,0,0,2,0,0,1,2,0,1,0,0,0,0,1,1,0,1,2,0,1,1,0,2,0,1,5,1,0,1,0,0,2,0,1,1,0,0,1,0,1,0,1,3,1,2,2,0,1,0,2,2,0,2,1,0,1,0,0,1,1,1,2,0,0,1,1,2,2,1,1,2,0,0,1,0,1,1,1,1,2,2,1,0,1,1,0,1,2,0,0,0,2,1,0,1,2,0,0,1,1,2,2,0,1,0,2,0,0,1,0,0,0,0,0,1,2,0,3,1,2,3,1,2,2,1,1,1,0,0,0,1,0,0,2,0,1,0,0,0,2,0,0,2,0,4,0,0,1,0,1,1,2,0,1,0,0,1,0,3,0,0,1,2,0,2,0,3,1,1,0,1,1,0,1,1,0,0,0,1,3,1,1,1,0,1,0,0,1,0,2,0,1,1,0,1,0,1,1,2,0,0,2,0,1,2,0,2,0,1,2,0,0,0,0,2,1,1,0,3,1,0,1,1,0,4,1,0,1,3,0,2,3,0,0,1,0,3,2,0,1,1,0,2,1,0,0,2,0,0,0,1,2,2,0,0,2,0,3,1,2,0,1,1,1,1,1,1,0,1,1,0,1,1,2,1,0,1,0,0,1,1,2,1,1,0,1,1,3,1,0,0,1,1,1,0,0,1,0,1,0,1,2,2,2,1,3,1,1,1,2,0,2,0,1,2,0,0,0,0,1,2,0,1,1,0,2,0,0,0,2,2,3,2,0,0,0,2,0,1,1,0,2,0,1,0,1,0,0,1,2,0,0,2,1,2,1,0,0,1,4,0,2,1,2,0,1,2,1,4,2,2,3,0,1,5,1,1,0,1,4,0,2,0,0,0,0,1,1,1,0,0,1,2,0,3,1,1,3,2,1,0,3,2,0,4,1]},{"counters":[2,0,1,2,0,1,3,0,0,1,2,2,0,0,1,1,1,1,1,1,2,2,1,0,1,1,2,1,3,1,0,0,1,0,1,1,1,0,2,1,0,2,1,0,0,0,0,5,1,1,0,0,1,1,1,0,0,0,1,3,2,1,1,2,0,2,2,1,0,1,1,1,0,1,2,1,1,0,0,1,2,0,1,4,4,2,3,2,0,1,0,0,3,0,0,1,0,2,1,0,2,0,0,0,1,2,1,0,0,0,0,5,0,0,1,3,0,0,0,2,1,0,2,1,0,4,0,0,2,0,0,1,0,2,2,0,1,1,1,1,3,1,3,2,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,2,0,0,1,0,2,3,1,1,1,0,0,1,1,0,2,2,1,2,0,1,1,0,3,0,0,4,2,1,0,0,0,1,1,0,0,1,0,1,1,0,0,1,0,1,1,1,1,0,3,2,1,0,0,1,0,1,1,1,0,1,0,3,0,1,2,1,1,0,1,0,1,1,2,0,2,0,2,1,2,0,1,1,0,2,1,1,2,0,0,1,0,0,1,1,2,0,2,1,0,1,1,2,1,0,2,2,0,2,2,0,0,1,0,1,0,0,1,0,2,0,1,2,1,3,3,0,1,1,0,1,0,1,1,1,0,2,2,1,1,2,0,1,1,1,0,0,1,1,1,1,3,0,1,1,3,1,0,0,0,1,2,2,0,2,1,1,1,2,1,0,0,1,4,0,1,1,2,1,2,1,2,0,2,1,2,1,0,1,3,0,0,0,0,1,0,0,0,0,1,0,1,2,1,0,1,0,0,1,1,2,1,0,0,1,0,0,0,1,2,2,1,0,1,3,1,0,0,0,2,1,0,1,1,0,0,0,0,2,1,2,0,1,0,2,1,0,0,0,1,1,0,0,0,0,3,1,0,0,1,2,1,1,1,3,2,3,1,0,0,2,1,0,1,0,2,1,0,0,2,0,0,0,2,1,0,1,2,0,1,1,1,0,1,0,0,0,2,1,2,0,2,1,1,0,0,0,0,2,1,0,1,1,0,2,0,1,1,1,1,0,0,1,0,1,0,0,1,0,1,1,1,0,0,0,0,0,0,1,0,1,1,0,0,1,0,0,0,2,0,2,1,3,0,1,0,1,1,0,1,2,1,0,0,0,1,1,2,0,0,1,0,1,0,1,1,0,0,0,1,3,2,1,1,0,1,2,1,1,1,1,0,1,0,0,1,1,0,0,2,0,1,1,0,0,0,0,1,1,3,1,1,0,0,0,1,2,0,0,0,1,2,0,0,1,2,1,3,0,2,1,3,1,1,0,2,0,3,2,1,1,1,1,1,3,1,3,2,0,0,0,1,1,1,1,0,0,1,2,1,2,1,0,0,1,1,1,0,0,1,1,0,1,0,2,0,1,2,1,0,2,2,0,0,1,1,2,1,0,0,2,0,0,1,1,4,0,1,1,2,2,0,1,2,0,1,1,3,0,1,0,2,2,1,2,0,1,1,4,2,1,0,4,0,1,1,0,0,1,2,0,1,2,2,0,4,1,0,0,0,3,2,1,2,3,0,1,2,2,4,1,2,0,1,0,1,0,1,0,2,1,4,2,1,0,0,0,1,1,0,1,3,1,1,1,2,2,1,2,0,2,0,0,0,0,2,0,1,2,0,2,0,5,2,3,0,1,0,2,2,0,0,1,1,0,1,1,1,2,2,0,2,0,1,2,2,2,3,1,1,1,1,1,3,0,0,0,1,1,1,0,2,0,2,1,0,1,2,1,1,1,3,3,2,0,0,0,1,1,3,0,0,2,1,0,0,0,1,2,1,2,0,2,4,0,1,2,3,0,0,0,0,2,1,1,3,0,2,0,1,1,1,2,0,1,1,0,0,0,0,2,1,1,2,0,0,1,1,2,1,0,0,4,0,1,1,3,1,1,0,2,0,2,3,1,0,2,1,1,1,0,2,2,2,2,1,1,0,2,3,1,0,2,0,2,1,1,0,0,2,1,2,1,1,0,2,1,0,0,0,1,1,1,0,0,2,0,0,0,0,1,0,1,0,0,2,1,0,0,1,1,1,2,1,1,0,1,0,2,1,1,2,1,3,0,0,0,0,3,1,2,2,1,1,1,0,1,0,1,1,0,1,2,0,3,0,3,0,0,0,0,3,2,2,0,0,0,1,1,1,0,1,1,1,2,0,0,0,2,0,0,1,0,4,0,4,2,1,0,3,0,2,0,0,0,3,2,2,1,0,0,1,1,0,2,0,1,2,0,0,1,2,0,1,2,1,0,0,1,1,2,2,0,0,1,0,1,1,0,1,0,1,1,0,0,0,1,4,0,0,0,1,0,2,1,1,1,2,0,0,3,1,1,1,0,3,1,3,1,2,2,1,0,0,1,0,2,0,1,0,2,3,0,1,0,1,2,2,0,1,0,0,3,0,0,2,3,2,2,2,2,0,1,1,4,2,2,3,0,2,0,2,0,1,1,0,2,0,0,2,0,0,2,0,3,0,4,0,0,0,0,0,2,1,0,0,0,1,2,0,1,1,1,2,1,2,0,1,0,1,2,1,1,2,0,5,1,0,2,0,0,1,0,1,2,1,1,2,0,2,0,2,1,2,0,0,1,0,1,2,0,3,1,0,1,0,1,2,1,1,1,0,2,1,1,1,0,0,2,1,1,1,2,1,1,2,0,1,1,0,1,1,2,1,1,4,2,1,0,0,1,2,0,1,3,0,1,0,1,0,2,3,0,0,1,1,0,1,2,1,1,1,0,0,0,0,2,1,1,2,2,1,1,0,0,0,2,0,0,2,1,0,0,2,0,1,1,0,1,1,0,0,1,1,0,1,2,0,1,1,1,1,1,0,0,1,0,1,3,0,2,0,0,3,1,1,3,0,2,1,1,3,1,0,0,1,1,2,0,1,0,1,0,1,3,0,1,1,0,2,2,1,2,0,1,0,0,1,1,3,0,1,0,0,3,0,3,2,3,0,0,0,0,0,2,2,0,0,1,2,0,0,2,1,1,1,1,1,2,0,1,1,0,1,1,1,1,2,1,0,1,1,1,4,0,0,4,1,0,1,0,1,1,0,0,1,2,1,1,0,1,0,1,1,0,1,1,0,2,1,1,1,1,3,3,2,0,0,0,3,0,2,1,3,0,1,0,3,2,0,1,1,0,0,1,0,0,2,1,2,1,1,0,1,2,3,1,1,1,0,1,3,0,0,1,0,0,0,0,1,0,0,2,0,0,0,2,1,1,2,0,0,1,0,0,3,1,0,1,1,2,2,3,0,1,6,3,0,1,2,2,1,0,1,1,1,2,2,3,2,0,2,0,1,1,0,0,3,5,0,0,0,1,0,2,1,1,0,0,2,0,1,0,3,1,1,2,1,1,1,1,0,0,2,0,1,2,1,1,1,2,1,2,1,2,0,0,1,0,1,0,2,1,0,1,2,2,1,0,0,0,0,0,3,1,1,0,0,0,1,2,0,0,0,1,0,0,0,1,2,0,4,0,3,0,0,3,3,2,0,1,0,0,1,1,0,2,3,2,2,1,0,0,0,0,1,0,2,0,0,0,2,0,1,0,1,1,1,0,3,2,1,0,0,0,0,1,1,1,0,2,1,0,2,2,2,2,0,1,0,0,1,1,1,2,2,0,0,0,0,0,1,1,1,2,2,1,0,2,1,0,3,5,0,4,0,0,1,2,2,0,1,4,2,1,0,2,1,3,0,2,0,1,1,0,0,0,2,2,0,1,2,0,2,1,0,0,1,0,0,2,1,1,1,2,0,0,2,2,2,0,0,1,2,0,2,0,1,1,2,1,2,2,1,0,3,2,6,1,1,0,2,1,4,1,1,0,1,1,4,1,1,1,0,2,0,1,0,0,1,2,2,1,1,1,1,0,2,0,0,0,0,2,3,1,0,5,0,0,0,1,2,1,1,1,0,1,2,0,2,1,0,1,0,0,2,2,1,0,2,1,1,1,1,0,1,3,0,1,0,0,0,2,0,1,0,3,1,1,3,1,2,0,3,2,0,2,0,3,0,1,0,0,1,1,3,0,0,3,0,2,2,0,2,0,1,2,1,1,1,1,1,0,1,1,1,1,0,1,2,3,1,0,2,2,1,2,0,2,1,0,3,1,2,1,0,3,1,1,3,0,1,0,0,1,1,1,1,2,0,1,0,0,1,0,0,0,2,0,2,1,0,1,0,0,0,3,0,1,0,0,1,2,0,2,2,1,0,1,2,3,1,0,2,0,0,2,0,0,4,0,1,0,1,2,2,1,1,1,2,1,1,1,2,1,0,1,1,1,2,1,0,1,3,1,2,0,1,2,0,0,1,1,0,0,2,0,1,1,1,2,1,2,0,2,1,0,2,0,1,1,1,1,0,0,0,0,3,0,0,1,0,1,1,0,2,1,0,0,2,1,1,2,1,0,1,1,1,1,1,2,0,1,0,1,0,1,1,1,2,2,0,0,0,1,1,1,0,2,0,3,1,0,1,1,1,0,0,1,1,2,1,2,2,0,2,1,0,1,1,0,1,2,2,1,0,1,1,1,2,3,0,1,3,0,0,1,0,0]},{"counters":[2,0,0,2,0,1,1,1,1,0,3,2,0,1,0,0,1,1,1,0,1,1,2,2,0,1,1,0,1,1,0,1,1,1,0,0,1,0,2,1,2,4,0,0,2,0,1,0,1,1,3,0,0,1,0,0,2,1,0,0,2,1,1,0,1,4,2,1,0,1,1,0,1,3,0,0,3,1,1,1,1,0,1,0,0,0,3,0,0,0,1,1,3,0,2,1,0,1,0,1,1,1,2,1,3,0,0,0,1,3,1,0,1,2,3,2,0,0,1,3,0,0,2,1,2,2,2,1,1,0,0,0,3,2,3,1,2,0,1,1,0,0,2,0,2,0,1,0,0,0,1,0,2,2,0,0,0,0,1,1,2,1,3,2,1,0,0,0,2,0,1,0,2,0,1,0,0,1,0,1,0,0,1,1,0,2,1,0,2,2,2,0,0,2,0,0,0,1,1,2,2,1,2,0,0,0,1,0,0,2,0,1,1,1,0,1,0,0,0,1,2,0,0,0,3,1,1,1,0,1,3,0,1,1,1,4,1,2,0,0,1,1,0,1,1,1,1,1,2,0,1,2,1,2,2,1,1,1,1,0,1,0,1,1,1,1,2,0,2,0,0,1,3,1,0,1,1,1,0,1,1,2,0,2,2,1,0,0,2,0,0,2,0,2,2,1,3,1,2,0,1,3,0,0,0,0,0,0,4,0,0,0,0,1,2,0,0,2,0,1,0,2,2,1,0,1,1,1,0,0,0,2,5,0,1,1,1,2,1,0,0,0,0,4,1,1,0,1,1,0,3,0,1,1,0,0,0,1,0,0,0,1,3,4,1,0,0,3,0,0,1,0,2,0,0,0,2,0,2,0,6,1,0,1,1,1,0,0,0,2,0,3,1,2,0,3,1,1,1,2,2,0,0,1,2,3,0,0,1,1,0,1,0,1,0,1,1,0,1,0,0,0,2,1,1,2,1,3,0,0,0,2,2,1,1,0,3,0,1,0,0,0,1,1,1,1,1,2,0,1,4,1,0,2,1,5,0,2,2,0,3,1,1,1,1,2,0,3,0,1,0,2,2,1,0,1,0,3,0,0,1,1,1,2,1,1,0,2,1,1,0,1,1,1,1,2,1,0,3,1,1,0,0,0,2,2,3,2,1,0,0,0,0,0,0,0,1,0,0,0,0,2,4,3,0,2,0,0,0,0,1,1,0,2,0,2,2,1,2,3,0,0,0,1,2,2,2,1,0,1,0,1,1,2,1,2,1,1,2,1,3,1,1,2,0,0,2,2,2,0,0,3,0,2,1,0,1,3,1,2,2,1,0,3,0,2,2,2,0,0,1,0,0,3,0,0,1,1,4,0,1,0,0,2,2,0,0,0,0,1,1,1,1,1,1,1,2,1,1,0,2,0,0,1,0,2,1,1,0,2,0,3,0,0,1,1,1,2,0,0,0,1,0,1,1,1,2,0,1,1,2,0,1,3,1,2,2,1,0,0,0,2,2,0,2,2,0,0,0,3,0,2,0,1,0,1,2,1,0,1,2,0,2,0,0,0,1,1,2,1,1,0,1,2,3,2,1,1,0,0,0,0,1,1,1,0,2,0,1,0,1,0,2,0,2,3,3,4,0,1,2,1,2,0,2,1,0,1,2,0,1,0,0,0,2,0,2,0,3,2,2,0,1,0,1,2,3,4,0,2,1,1,2,2,0,1,0,1,1,0,1,0,0,2,0,1,2,2,1,0,0,0,1,1,2,0,0,1,0,1,1,1,2,1,1,1,0,1,1,2,1,1,0,0,2,0,0,0,0,0,1,2,0,2,1,0,4,1,1,1,2,0,1,1,0,2,2,1,0,3,0,1,0,1,1,1,0,0,2,2,3,0,1,3,0,0,0,1,0,0,1,0,0,1,4,0,2,0,1,0,0,2,1,0,1,1,2,3,0,2,1,1,0,0,3,1,1,2,0,2,5,1,0,0,2,0,0,0,1,1,0,2,0,1,0,1,1,2,2,2,3,2,0,1,1,0,0,0,2,1,2,4,0,1,0,1,0,1,1,0,0,4,0,0,0,0,1,0,1,3,0,0,0,2,0,1,2,1,1,1,3,2,1,0,3,2,0,0,0,2,0,1,0,1,2,1,2,2,0,0,1,2,3,0,1,0,0,3,1,0,3,0,1,0,0,1,2,1,1,2,0,0,0,1,1,0,1,1,2,1,2,1,0,0,1,1,1,2,1,1,2,1,1,0,1,0,1,1,1,1,2,3,0,1,2,2,1,2,0,0,2,0,0,1,0,2,0,0,2,0,0,1,1,1,1,2,1,1,1,2,3,2,0,1,0,0,1,1,2,2,1,0,1,4,3,4,2,2,0,1,0,1,0,1,2,1,3,0,1,1,0,1,1,0,3,0,0,1,2,1,1,1,1,1,3,0,0,0,1,4,1,2,0,1,1,1,3,1,0,1,2,0,0,0,0,0,0,2,2,1,0,1,0,1,2,1,1,0,0,0,0,1,2,2,3,4,2,0,1,0,0,1,1,2,0,0,1,0,3,0,2,2,1,1,1,0,1,2,0,0,0,0,0,0,2,4,0,2,1,0,1,0,1,1,1,1,1,1,3,1,1,1,1,1,2,0,1,1,2,3,0,2,1,0,2,0,2,2,1,2,0,2,3,1,0,2,0,3,0,2,3,0,1,3,1,2,3,1,1,0,0,1,0,2,3,1,0,0,0,2,1,0,0,0,2,2,1,2,1,0,0,0,0,0,3,2,0,0,0,1,1,0,0,0,0,3,0,1,0,1,1,0,0,0,0,1,1,0,0,1,0,2,1,0,0,0,0,1,1,0,0,2,2,0,0,0,1,0,0,1,2,3,3,3,0,0,0,0,1,0,2,0,0,1,0,1,0,1,2,1,2,2,1,0,1,2,0,1,0,0,1,0,0,2,0,1,3,2,1,1,2,0,1,1,2,2,2,3,0,1,2,1,0,0,0,0,1,1,1,1,0,1,0,1,0,1,0,1,1,0,1,2,0,0,2,1,2,1,0,3,0,0,0,1,1,2,0,3,0,0,0,1,3,1,2,3,0,4,0,3,2,0,1,1,1,2,2,0,1,2,1,0,1,5,1,0,0,1,0,3,1,1,0,0,0,1,1,2,2,1,1,4,1,0,0,0,0,2,0,0,3,0,0,3,3,1,0,1,2,2,1,1,1,1,1,2,0,0,3,0,0,0,1,2,1,0,2,0,0,0,0,1,0,1,4,2,0,1,1,1,1,0,3,1,0,2,1,2,0,2,0,1,2,0,0,1,1,1,2,0,0,0,0,2,0,0,2,2,1,0,2,0,4,0,0,0,1,4,0,0,1,0,0,0,2,1,1,1,1,1,1,3,1,1,1,0,2,1,0,0,1,1,0,3,2,0,0,2,1,0,0,1,1,2,1,0,0,0,0,0,1,0,0,1,1,0,0,0,2,1,0,2,1,0,1,0,1,3,1,1,0,1,0,1,0,1,1,4,1,0,1,3,0,2,0,2,2,1,1,3,0,0,1,1,0,1,1,1,0,4,3,0,2,1,1,0,1,0,1,3,1,0,0,2,1,0,2,0,2,1,1,1,0,3,0,1,0,1,1,2,2,2,0,2,3,1,0,0,1,0,2,2,2,1,2,0,1,0,1,0,1,1,2,0,1,1,0,1,1,0,1,0,1,1,0,2,0,3,2,1,0,0,2,2,0,1,0,0,1,0,1,0,2,0,1,0,2,0,3,0,0,2,0,0,4,1,1,1,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,2,1,2,0,0,0,1,1,1,1,1,3,0,1,1,2,1,1,1,0,1,0,1,3,0,1,1,0,1,1,1,1,2,0,3,1,2,0,1,1,1,1,2,0,2,1,0,2,1,2,1,0,0,3,0,1,3,1,0,2,0,1,4,0,1,1,0,0,1,1,0,0,0,3,1,1,3,0,1,1,0,1,1,2,1,1,0,0,0,0,2,1,1,2,3,0,0,2,1,0,1,1,1,1,1,0,1,1,2,4,0,0,1,1,1,1,0,2,3,1,2,0,0,0,1,0,0,1,0,0,1,2,4,1,0,3,2,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,0,1,1,0,3,3,2,1,0,1,0,2,1,0,4,1,1,0,1,0,0,0,0,1,1,2,0,2,1,0,1,0,0,1,2,1,2,1,0,0,1,1,0,0,2,1,1,1,0,1,3,1,0,0,1,0,0,0,1,0,0,3,0,0,1,3,4,1,1,0,0,3,0,2,2,2,3,0,2,4,2,0,3,1,0,0,3,0,1,2,0,1,1,1,1,1,0,2,0,0,2,0,1,1,2,1,1,0,1,0,0,0,1,0,0,2,2,3,1,0,0,0,2,1,1,0,1,3,1,2,0,1,1,0,0,0,0,1,0,1,1,0,1,0,2,1,1,1,0,0,0,0,0,3,0,1,1,1,2,1,2,0,2,1,0,4,2,0,0,1,3,0,1,3,0,1,1,1,2,1,0,1,2,1,0,1,2,0,0,2,2,0,0,2,0,0,1,0,1,2,1,2,3]},{"counters":[1,1,1,1,0,3,1,0,1,0,0,1,2,1,2,0,1,3,1,1,2,2,1,0,0,0,0,1,2,1,0,0,1,0,1,1,1,1,1,1,2,2,0,0,1,0,0,1,0,0,2,1,1,2,2,0,1,1,1,2,0,0,0,1,1,0,0,0,0,2,2,2,1,2,3,0,1,0,1,0,1,2,2,0,0,0,2,1,1,0,2,4,1,0,3,1,0,1,3,0,0,2,1,0,1,0,0,0,2,0,1,0,2,1,1,0,1,4,1,1,1,1,1,1,0,1,2,3,2,0,0,1,2,1,1,1,0,0,1,0,0,1,2,0,0,1,1,1,0,0,1,0,3,2,0,0,3,3,0,1,1,3,0,1,2,0,2,2,0,0,0,1,3,1,1,0,2,0,0,3,1,2,0,0,2,1,0,0,0,2,0,0,1,0,1,2,2,1,1,0,1,1,0,1,0,4,1,2,2,0,1,1,2,1,0,1,1,1,0,1,0,0,2,1,1,0,0,1,0,0,1,1,2,1,0,0,1,1,2,0,2,1,1,2,1,0,4,1,0,2,1,0,1,1,0,0,0,2,1,1,2,0,3,0,0,0,0,0,2,1,2,2,0,1,1,0,1,1,1,0,0,1,2,0,0,2,3,2,0,0,2,0,0,1,2,0,0,0,0,0,0,0,1,0,1,1,2,0,2,0,1,1,0,2,1,3,1,0,0,0,1,1,3,0,2,3,1,0,2,2,1,0,0,1,2,2,2,0,1,1,1,0,0,1,0,1,3,3,2,1,0,2,3,1,1,2,0,1,0,0,2,1,0,1,0,0,0,1,3,1,3,0,0,0,2,1,1,1,3,1,2,0,2,1,2,2,1,1,0,2,1,2,1,0,2,0,2,0,1,0,2,0,1,0,2,0,1,2,1,1,0,0,1,2,2,2,0,3,2,1,1,0,0,2,0,2,0,1,1,0,1,2,0,1,0,1,1,2,1,1,2,0,1,2,0,1,0,0,0,0,1,1,1,0,3,0,0,2,0,1,1,1,0,1,1,0,0,0,0,2,1,1,2,1,2,0,1,0,1,0,1,1,1,0,3,0,3,2,0,2,1,0,2,4,2,2,0,1,1,0,0,0,0,1,4,0,0,2,1,3,0,1,1,0,0,0,2,1,4,1,0,2,0,0,0,1,1,1,2,2,1,1,0,0,1,1,0,1,0,0,0,0,0,1,1,0,2,0,1,2,0,0,2,2,1,3,1,1,0,1,1,0,2,0,1,0,1,1,1,0,2,1,1,0,2,0,1,0,2,0,0,2,0,1,0,0,2,0,0,1,0,0,0,1,1,1,2,2,0,1,1,1,1,1,0,0,2,0,0,1,0,0,1,0,1,1,0,2,0,4,1,0,0,0,2,1,2,1,1,3,1,0,3,1,1,2,1,0,0,3,0,1,0,0,0,1,0,0,2,0,1,1,0,3,1,1,2,1,1,2,1,1,0,0,1,1,0,1,0,2,1,0,0,1,2,1,0,3,0,1,3,2,0,2,1,0,1,3,3,1,1,1,0,1,1,1,0,1,0,1,1,0,2,0,1,2,1,2,0,1,0,0,0,4,2,0,2,0,1,4,1,3,1,0,1,0,1,2,0,0,0,1,0,2,1,2,1,0,0,3,1,2,2,0,0,0,1,2,3,2,2,1,0,2,0,0,0,0,0,1,0,2,2,2,2,1,0,1,1,1,2,0,1,1,0,1,2,0,1,1,0,2,1,1,0,3,0,4,0,1,0,2,1,2,1,1,1,0,0,0,1,1,2,1,0,2,0,2,0,2,2,2,0,3,0,3,1,1,1,1,1,0,1,0,1,1,2,1,3,2,0,1,1,0,1,2,2,0,1,1,2,1,1,1,1,0,2,0,3,1,0,0,0,1,2,0,1,1,2,1,0,0,1,2,2,0,3,0,1,0,0,0,0,1,1,0,3,0,1,2,1,0,0,1,2,1,2,2,0,0,1,1,1,5,0,1,2,0,2,1,1,0,0,1,1,0,0,1,2,1,0,1,1,2,1,1,2,0,0,1,1,0,0,1,1,1,0,0,2,0,1,0,3,0,1,1,0,0,2,0,0,0,1,2,0,0,0,2,0,0,4,5,5,1,0,0,0,1,0,1,2,2,2,2,3,1,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,1,0,2,1,0,1,4,1,2,0,1,2,3,3,1,1,0,0,1,2,1,1,0,1,0,0,0,1,0,1,2,3,2,0,2,0,0,0,1,2,0,2,0,1,0,1,0,1,0,0,3,1,1,0,2,0,1,2,1,6,0,0,0,1,1,0,0,1,0,2,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,1,1,2,1,0,2,1,1,1,0,0,0,1,0,2,0,2,0,0,0,1,1,0,0,0,1,0,0,0,1,1,1,2,0,0,2,0,1,0,3,2,0,2,1,1,1,0,1,0,2,0,2,0,0,1,2,1,0,0,1,0,2,0,0,1,1,1,1,1,0,0,0,1,2,3,2,0,1,0,1,2,1,1,1,0,2,2,0,2,0,1,0,0,0,0,1,3,1,1,1,3,2,1,2,2,1,0,0,1,2,2,2,0,3,2,0,3,2,2,2,1,0,0,0,0,1,0,1,2,2,1,0,3,0,0,1,1,1,1,1,1,0,0,1,1,0,0,0,0,0,3,0,1,1,0,0,1,0,0,3,1,1,1,2,1,0,1,0,1,0,0,1,0,1,0,0,1,2,2,0,1,1,1,3,2,0,1,2,1,0,3,2,2,2,0,1,3,3,2,1,1,0,1,0,0,2,0,1,2,0,0,2,0,2,0,1,0,0,0,1,1,2,1,4,1,1,0,0,1,0,1,1,2,0,2,1,1,0,2,1,2,1,0,1,1,1,1,2,2,2,4,2,1,1,0,2,2,0,0,2,2,1,2,1,2,2,0,0,2,1,1,2,0,0,1,0,0,1,0,0,0,2,3,2,5,2,2,2,1,0,0,0,2,0,2,0,0,2,0,2,0,0,0,1,2,2,4,2,1,1,0,0,1,1,1,0,2,1,0,1,1,1,3,1,1,0,2,1,0,1,0,0,2,0,1,1,1,1,2,1,1,2,0,0,2,2,2,0,0,1,3,0,1,2,1,1,1,1,0,2,1,1,2,3,2,0,2,0,0,1,0,1,2,2,2,0,1,1,3,0,0,1,0,0,0,0,1,1,1,2,2,0,0,1,2,1,1,1,2,1,0,1,1,1,0,0,1,1,0,2,1,0,1,0,3,2,1,0,1,0,1,2,0,0,0,2,2,1,3,2,1,3,0,0,1,1,2,2,1,1,1,2,2,1,0,0,1,1,3,1,2,1,1,1,1,2,2,2,0,0,1,0,0,2,0,1,0,1,2,2,0,2,1,0,2,2,0,1,2,1,1,1,1,1,0,2,0,0,0,0,1,5,1,0,4,0,0,0,2,3,3,0,0,1,0,0,1,2,0,0,0,1,1,1,0,1,3,2,1,0,2,1,1,1,1,1,1,0,2,1,0,1,4,1,0,2,1,0,1,2,2,1,2,0,0,0,2,0,1,0,1,0,1,1,0,1,0,2,1,1,1,1,1,2,0,1,1,0,1,0,1,1,1,1,1,4,6,2,5,0,1,2,1,0,0,0,1,0,1,0,2,0,0,2,1,1,0,1,0,1,0,3,1,0,2,2,0,1,1,1,0,1,0,0,0,0,0,2,1,1,0,1,0,1,1,1,2,0,0,0,0,0,1,2,1,1,1,0,0,1,1,2,1,4,1,2,3,1,1,2,0,2,1,1,1,0,1,1,0,0,1,2,0,1,1,0,0,1,1,2,1,2,1,0,2,0,2,0,2,0,3,1,0,2,0,1,1,0,1,0,0,0,1,0,1,3,1,1,0,3,1,2,3,2,0,4,0,2,0,2,2,1,0,2,0,1,3,3,3,1,0,2,3,0,0,2,2,0,2,1,3,0,1,0,0,0,0,2,0,0,0,1,0,3,1,1,2,0,2,1,1,1,1,1,1,0,0,1,2,1,0,0,0,0,0,1,0,1,2,1,0,0,1,0,0,1,5,0,0,2,0,3,1,0,1,1,2,2,3,0,0,1,0,0,0,0,0,1,3,0,2,1,1,1,0,0,1,0,0,2,3,2,2,2,2,0,1,1,0,0,0,1,1,2,2,1,0,1,1,1,0,1,1,2,1,0,0,1,2,0,1,1,0,3,1,3,1,0,1,0,0,2,0,1,1,1,1,0,0,0,2,1,2,0,2,0,0,2,0,1,0,0,3,1,0,1,0,0,2,1,0,0,0,0,0,1,0,2,1,1,3,1,1,2,2,1,0,4,2,0,1,1,3,1,3,2,2,1,1,0,0,1,2,0,1,1,1,0,0,3,1,1,1,2,0,1,0,1,0,1,0,1,1,1,1,2,1,1,1,0,0,0,2,5,0,0,0,2,2,1,0,0,0,2,2,1,1,2,4,1,2,1,2,2,1,0,1,1,1,1,0,0,3,4,0,0,2,0,4,3,1,1]}]},"null_count":0,"last_update_version":397952029585047552},"p7_md5":{"histogram":{"ndv":1982,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MDdTZ1Q=","repeats":1},{"count":16,"lower_bound":"MEFPU2xKQ2I2MFlJT0gxSzBESjBQT2tWeXJVYkwz","upper_bound":"MExMVW90UVdDa1BLVU1kYVM5b1pNbw==","repeats":1},{"count":24,"lower_bound":"ME5hU2VMY2ZablFIRE1CaUVjd3R4UWZ3aw==","upper_bound":"MFh2RUduMnVUZUNvd0ZFN2NRWG5WdUF1RzRJaGMx","repeats":1},{"count":32,"lower_bound":"MFpibWthb0x5YUY=","upper_bound":"MG8xQ01WWjVraQ==","repeats":1},{"count":40,"lower_bound":"MHB6","upper_bound":"MHV3NGVHSWxJOG1CY1dyVDdBVVhiUXhTNkJONQ==","repeats":1},{"count":48,"lower_bound":"MHlVODVyc3FyYnVCWFRWVTE=","upper_bound":"MTk4Nnh4b1VETG1remw=","repeats":1},{"count":56,"lower_bound":"MURacmszazA1SlpTY3dj","upper_bound":"MUtwMFNTd1VJVDJVazRFczM3SmFDNnhwaVdX","repeats":1},{"count":64,"lower_bound":"MUxEdnlzdExWNQ==","upper_bound":"MW5r","repeats":1},{"count":72,"lower_bound":"MXZrNmk=","upper_bound":"Mjg1b2p4ZXRIMzE=","repeats":1},{"count":80,"lower_bound":"MkVHZjdNOXpJbVl0TnVIVnNiNmtnQlVBcDNyRA==","upper_bound":"MkZEYm1EVk9iVDQ0R2g5Y2xRTXdB","repeats":1},{"count":88,"lower_bound":"Mkd2b0Y=","upper_bound":"Mk91OG1oVDl1NVk5bUJRME1tTGM=","repeats":1},{"count":96,"lower_bound":"MlNR","upper_bound":"MmROdHpraVIxRmRLWlFzdVJXd2FGY0tScFBS","repeats":1},{"count":106,"lower_bound":"MmhBR0pLVEZ0YnF3eTAxcnhyaTJlMUxJS0lPZmtveEw=","upper_bound":"Mw==","repeats":3},{"count":114,"lower_bound":"MzBsa0JrOHIxOWVF","upper_bound":"MzZiOFFzazBEWkRtd1IwS0hDeHNkMWcyTTFRN0RzVQ==","repeats":1},{"count":122,"lower_bound":"MzljVUF2NnFkcFJ2QXFvNVN1WjhF","upper_bound":"M0wwTXZ2ejJZdTRqbkY1Q0F6M0FPVnY=","repeats":1},{"count":130,"lower_bound":"M0xwNXpDUGF6dUxCWlFpVElNZjdoYTFqTGxUeVo=","upper_bound":"M29KaWY0eFNDYjNKaFQ=","repeats":1},{"count":138,"lower_bound":"M29UMnlqTnlINU5zcXhFWjhnWjRpODRYRg==","upper_bound":"NDMxTkdsMWpaNXdSVWh5UXFqQm1SYXBONm94bGxmcEM=","repeats":1},{"count":146,"lower_bound":"NDlKaUFkWUtKVFIxQzg=","upper_bound":"NFVZZ1BzMDBtTTdnRlEyMEtqdjNGa0NSSGNS","repeats":1},{"count":154,"lower_bound":"NFVxWkY=","upper_bound":"NGVoTDd5NG9LRXpCd0UyOWZ4Q1Z5","repeats":1},{"count":162,"lower_bound":"NGc4Z2lkSW56S2RxRGVwZnlhd3VXT1BpMmRPZVU=","upper_bound":"NHQ2bG5aRlRU","repeats":1},{"count":170,"lower_bound":"NHZ3RlVKc1czQjJxUUpGVFIzNGg=","upper_bound":"NTQ5UEVha09hRjF2ekhsZFJuc3lKRjF0TUQ4bg==","repeats":1},{"count":178,"lower_bound":"NTVOc3d1RmlZN2p1NWlsQXM5cno=","upper_bound":"NUt6","repeats":1},{"count":186,"lower_bound":"NVhMYWVwQ1BW","upper_bound":"NWFHWWFmQmZSNTQxbWtUSDIxaDhtRWs1MEZOd091VVE=","repeats":1},{"count":194,"lower_bound":"NWVNZw==","upper_bound":"NXZUVEpyUldVaU52ZzMzMndIUFNhT3Rtckxqcm8=","repeats":1},{"count":202,"lower_bound":"NXdxOFdmMU5wMFR3M1RtaFk5eDJKaXRnWWk=","upper_bound":"NjluV2NTZ1B0V1dlVg==","repeats":1},{"count":210,"lower_bound":"NkIzOGsxRjhsdTJaNEZBc3Q2RHVmNzdLd002NGw2","upper_bound":"NlFaT3g4bGhrMWxnVmhQ","repeats":1},{"count":218,"lower_bound":"NlJrclBTUGlOamdUU1JSYzM=","upper_bound":"Nm9yWG96V3JoaGdHdXo5VVdOTnRMVGo0VGlI","repeats":1},{"count":226,"lower_bound":"NnFhQWxqd3JhdFZxZ0NINUpkcQ==","upper_bound":"N0ZwQk15b1o3WmpYTDRI","repeats":1},{"count":234,"lower_bound":"N0dnRDE4c0d4Tnk=","upper_bound":"N1BlR3NwMEcweUNLTm85U1lZTkhNZDJBNDd0Y0Q3RA==","repeats":1},{"count":242,"lower_bound":"N1RINjBxeGpaQTZjM2x0SXJ5VlpGN1hTUnZV","upper_bound":"N2M2dEwwckE0S0kxMERIVFVLYjk=","repeats":1},{"count":250,"lower_bound":"N2hPVnVtQUJrV3FUQXMzeEdJM01JMVpPcWRLMUdJNXU=","upper_bound":"N2t4R0t5b09KM0k4aFRxZlIxVlU3aEZyQ0Jjbg==","repeats":1},{"count":258,"lower_bound":"N25Oa1dMT2tmbnZHOU5y","upper_bound":"OA==","repeats":1},{"count":266,"lower_bound":"ODFtaFFqWVhiNm5GMXFGZ3d0RTI=","upper_bound":"ODZHZ2lvQnRJbVZHVEVJVU9pcWU=","repeats":1},{"count":274,"lower_bound":"ODg1WXVyc3lXTHA2T01UYXIzWWpw","upper_bound":"OEJzTzFxS2k4","repeats":1},{"count":282,"lower_bound":"OERKdE9mckR1eGtXOA==","upper_bound":"OEljRUJoeHlNSlM5MUpxdzNJU1dCSGljWVhreHNzTQ==","repeats":1},{"count":290,"lower_bound":"OEtNVzltQVk=","upper_bound":"OFZSY1BLVkNnYg==","repeats":1},{"count":298,"lower_bound":"OFpPZFNGMlRtNkVUTm94","upper_bound":"OGs5QWlRNHhQd3prakNUZ0ZRZUM=","repeats":1},{"count":306,"lower_bound":"OG9LRXduMDl3aG4=","upper_bound":"OTFwazR1REl3TThLcTl0V0FFRENMcmRM","repeats":1},{"count":314,"lower_bound":"OTg1ZHFVdVpTdDVzeg==","upper_bound":"OUgzMUVNMEE=","repeats":1},{"count":322,"lower_bound":"OUs=","upper_bound":"OVQ5Uk5Rc0JJZDNzQ2tTazhMZHpMVDZwVw==","repeats":1},{"count":330,"lower_bound":"OVZiVGl3WmNSalZHbWVrV1NiMW1oVGV6bg==","upper_bound":"OWM0V1NtbmppelBZVXN3VzlsbGw=","repeats":1},{"count":338,"lower_bound":"OWVVT0JqRDdZbHRtaEEyYUJyRkZkTHg0UDRpWnhSYQ==","upper_bound":"OXQ0T0w1NFlLOA==","repeats":1},{"count":346,"lower_bound":"QQ==","upper_bound":"QTNUWlJ3NUhuUEl3c3phalkzV3RZdFRQ","repeats":1},{"count":354,"lower_bound":"QTZxVVBpRmxjMlZFbFVDVThG","upper_bound":"QUhoMHhQcmJxdUdIbzFyZg==","repeats":1},{"count":362,"lower_bound":"QUtzQjhYZUk=","upper_bound":"QVVyUGpZbUNT","repeats":1},{"count":370,"lower_bound":"QVZIb3hDdXM0aFJuRWNrZXd0UEN4MQ==","upper_bound":"QWJXUEJ4YTBvTFpZSDI=","repeats":1},{"count":378,"lower_bound":"QWQ2RXQ2OWV6TVlXSUpzSFdTVldleHQ=","upper_bound":"QXB0bDFKeWNiNlB3Z1UzQUJ1SHVi","repeats":1},{"count":386,"lower_bound":"QXFldWJUaVBUdFdCdnRueDF1M1VrWXZLWnU=","upper_bound":"QjBmUEE4N2VDYlFFOU51eHNKTW1CZDZqZHZsRUl1","repeats":1},{"count":394,"lower_bound":"QjBxNEdS","upper_bound":"Qktz","repeats":1},{"count":402,"lower_bound":"QlJBaUJuNFFTNFAyWnp1","upper_bound":"QmRRS2FOcDQ=","repeats":1},{"count":410,"lower_bound":"Qmt3VzV0ZElI","upper_bound":"QnRValJjRlpCczFmUE5sM0doUDdN","repeats":1},{"count":418,"lower_bound":"QzBuOXZ5RUpNZ0dudDJ4UEUyVmVYaTZoYTg=","upper_bound":"QzV1NzJUMHFOZ3k3N1JyREdoRUdBcUw=","repeats":1},{"count":426,"lower_bound":"Qzc5amRPRmtCclBxZnNUcFRERHZncnBxR1Y=","upper_bound":"Q1dyTXF4NTViU1gxTjN1QVltS3p5cw==","repeats":1},{"count":434,"lower_bound":"Q1ljS0tPelg=","upper_bound":"Q3FXbHZzT0FMZ3dqMUlqRQ==","repeats":1},{"count":442,"lower_bound":"Q3JTcw==","upper_bound":"RA==","repeats":1},{"count":450,"lower_bound":"RDdQMEx0","upper_bound":"RE53S2JLcGk3MjBFTXN3SkI2OHA2Wmd4MmdxVmJR","repeats":1},{"count":458,"lower_bound":"RFRkd0NCMW56ODBP","upper_bound":"RGQ2dG5saGVzSkhxaEh0dWY5SGpKVE9NRkY2WmRT","repeats":1},{"count":466,"lower_bound":"RGRSdUZXTXZ4YkM4aVloN0RPNmRZSFM=","upper_bound":"RGw5dWhxRnJYSGtXUnc5bWha","repeats":1},{"count":474,"lower_bound":"RHFZSTk=","upper_bound":"RHc5RzY=","repeats":1},{"count":482,"lower_bound":"RHo2VVRNd0tZZDNzeG52VE9xTEJYdDdRT2FK","upper_bound":"RTh2WGsxOWZIN04=","repeats":1},{"count":490,"lower_bound":"RUE3TkdFM3Q=","upper_bound":"RVVPN0xGakRCbEVtU1hSenNodE5LRkkwRw==","repeats":1},{"count":498,"lower_bound":"RVVWWg==","upper_bound":"RWR0TmRUbzlVR1ZjbDYwRjgyTTJvRmJ3ejZIRk54Rmg=","repeats":1},{"count":506,"lower_bound":"RWx4aUZvRG5wb2hYVFY5d1N2","upper_bound":"RXNUZTF1dXgyZEs4c1VWanNSUThlTlA=","repeats":1},{"count":514,"lower_bound":"RXVYdTlveWdraVdPTlR3TGZyYmcxV1Y3bTRQMg==","upper_bound":"Rg==","repeats":1},{"count":522,"lower_bound":"RjdjNzZaMUp0cVZiTWNhc1FxVWNpdTFH","upper_bound":"RkhNbEU2ODZpbVZEbUJCb3Y0anRTb1V5","repeats":1},{"count":530,"lower_bound":"RkhPZEtGekxSamlQOFdiMW85ZA==","upper_bound":"RlJGaDNaWUNtT1RWNXBURlVwdWVKS2VmTUh2SzFVNWI=","repeats":1},{"count":538,"lower_bound":"RlJhbUxucGF1MFk4eldVenlyYnROUlJ2SHlxc2o3OA==","upper_bound":"Rmp2MXB0dTRFcEdBcjg1","repeats":1},{"count":546,"lower_bound":"RnFhTUtnT2Jtd1hLU1BHS01Rd1hiMlhv","upper_bound":"RnlXbG5YenVodHpBeW1PR1Z4RFBS","repeats":1},{"count":554,"lower_bound":"Rnl3Q1dNRjNkdFpqZG15NUw=","upper_bound":"RzZUY1k=","repeats":1},{"count":562,"lower_bound":"R0J5enR5dUxHeEdFQUNxTjJLM2h6OVZQ","upper_bound":"R01PNXM0c2pYZHNQTmlaUW4wQ2lqcGFWSWc=","repeats":1},{"count":570,"lower_bound":"R09xbXRtRjNaaEljMGl3UkF1R2l5","upper_bound":"R1p1MDlZY3F6Smpzakw0UjN2NUNhWkV2VW8zUVc=","repeats":1},{"count":578,"lower_bound":"R2JudmRib1VLZGFZSFQ2SkFpbjBwdVlp","upper_bound":"R2sxYjZnbWxvVHhaUkRtRXdUelRINXE3NVFGSHBHTw==","repeats":1},{"count":586,"lower_bound":"R21EMk9nbnhBRUg1NkhlZDVWSjlrQ0I=","upper_bound":"R3gxQjVycmh0blZxQnNMeDRjT3l5","repeats":1},{"count":594,"lower_bound":"R3kyZjY2OEROV2hsb0hYQmlHaFdD","upper_bound":"SDRiRDNrTlBzQTh3ZWZX","repeats":1},{"count":602,"lower_bound":"SDdJbjdoY2xsNkRSZ2lJ","upper_bound":"SE91YzhSdUJzbEQ=","repeats":1},{"count":610,"lower_bound":"SFFsQzFUQUFvczdqY0lhUFFPekpCWkFPNg==","upper_bound":"SGJGaFBLc2dnaThWYw==","repeats":1},{"count":618,"lower_bound":"SGNuN0NGSWc3bjE1U3V4b05XUE41bkg4ZXE=","upper_bound":"SU5iZk5laWR0MFU=","repeats":1},{"count":626,"lower_bound":"SVoyWVNNRGNubFB6dktIa0tWeHhMY2paRzJtUmlQ","upper_bound":"SWkwT0FZZ3lHVElEWkhaZHlZOXhrYlVZVUE=","repeats":1},{"count":634,"lower_bound":"SWoyQUthaHZldGo3QjRzaGJLdjJObEdWYzE=","upper_bound":"SXRWeENzZ0xa","repeats":1},{"count":642,"lower_bound":"SXk=","upper_bound":"SjVlb1ZNMVgwSXNRa0ZDRDd2MDBwcVVEcUtVYXlO","repeats":1},{"count":650,"lower_bound":"SkNPOXZVaE1qVFJUMTc=","upper_bound":"SkxzSWxuRE5QQU52","repeats":1},{"count":658,"lower_bound":"SlNCVUw0Z0NiV0RGTVZ6bw==","upper_bound":"SmFEQml1eW5xbzdhWWFRUXJFU0dVdUtlNXM0","repeats":1},{"count":666,"lower_bound":"SmcxQU41ZGZVNVo4","upper_bound":"SnVBd0ZYZzI5T3llc2hsbg==","repeats":1},{"count":674,"lower_bound":"SnY1b0xDUUp6NkQ0OUloUFBSUzRIdGdIeA==","upper_bound":"SzJrZnpCQ1VMS2IwY0h1T2dyVVpK","repeats":1},{"count":682,"lower_bound":"SzdVcTdsWWNJOVhMcnJs","upper_bound":"S05GWG12czJJbVJIM1BwMVoxdHBhSUptMHN4","repeats":1},{"count":690,"lower_bound":"S1A0am5CNkk5QlZvV09qWDRhSUM=","upper_bound":"S2JtUVlLOXhPNnVWdmE3Y0JPTXgzbWNm","repeats":1},{"count":698,"lower_bound":"S2JzajlWMzNJbGJoMFZtZ1pEdVZk","upper_bound":"S2tkNXNlcjN4cg==","repeats":1},{"count":706,"lower_bound":"S2tm","upper_bound":"S3JpWE5waFNDMUh4Ym93SmZTMnEzN2RjS3pWZjY=","repeats":1},{"count":714,"lower_bound":"TA==","upper_bound":"TDhVaUVrSEdkTTY4djNKcTVlam0=","repeats":1},{"count":722,"lower_bound":"TEs3RldqY21FSGNtbEFVUDYzSXI4dk5iTA==","upper_bound":"TFZUZWhjRklNeUF2ZFhNVVdZZGs=","repeats":1},{"count":730,"lower_bound":"TFlG","upper_bound":"THJaZDh4","repeats":1},{"count":738,"lower_bound":"THRNbnBwU2ZLWFdNRnVvZFVIUHVGcFZuYg==","upper_bound":"TUNHY2Fqa2swb3l0a3dSZHdpRWJidFVz","repeats":1},{"count":746,"lower_bound":"TURKVjB3QVNvd0U3TUZMZTYzM0oxU01RRTJtOQ==","upper_bound":"TVhVWlA4MzdaRHpV","repeats":1},{"count":754,"lower_bound":"TVk=","upper_bound":"TXU=","repeats":1},{"count":762,"lower_bound":"TXdxZ1VFckZLZXgyeUd6MXo=","upper_bound":"TjdPaFoxNnFRMktYbUt5RlF6OHl2","repeats":1},{"count":770,"lower_bound":"TkFUV3R0MHpiQVRXSlZmMA==","upper_bound":"TkxKemtwOXJX","repeats":1},{"count":778,"lower_bound":"TkxNYUtzTXIxendyZG1WTk8z","upper_bound":"Tm4=","repeats":1},{"count":786,"lower_bound":"TnFKVA==","upper_bound":"TzFIU1pPMWJ2Uw==","repeats":1},{"count":794,"lower_bound":"T0NBalRncnF2Q29taEpnaDFRdA==","upper_bound":"T0pyWGRubXBUVDNUZFY=","repeats":1},{"count":802,"lower_bound":"T1BZYllIbXRhaVljd3ZGUTl4YXRJbVVIWlE=","upper_bound":"T1RWSktG","repeats":1},{"count":810,"lower_bound":"T1VDN3Y5WVVXdWNWblVuQ2I3d1BkMVJC","upper_bound":"T2p0QVpnc0o2Q294SFdKQlJoT0l1Rw==","repeats":1},{"count":818,"lower_bound":"T3FZVTdKY3llaU9MS3h1OHQ=","upper_bound":"UDZXMXJzbVg5RmJoUWdi","repeats":1},{"count":826,"lower_bound":"UDdkcQ==","upper_bound":"UFBuZEZH","repeats":1},{"count":834,"lower_bound":"UFE=","upper_bound":"UGNidFU1WnhqT1RlTlR5Umk1eWRsVFg3N3Vt","repeats":1},{"count":842,"lower_bound":"UGVaMm04MjVXeGszN3dKZ2dFRm5PUzlLUkNqWVEwRXY=","upper_bound":"UHRKWHpONlBXNXpLWDN4VHdlMnBI","repeats":1},{"count":850,"lower_bound":"UHlvNUtDMW1FR2VGcXJRZVJ4blplTE1xem4=","upper_bound":"UTdaa3ZYb0ZjME1mNlY5V2J4TFlQRTBjbXlTWlFibA==","repeats":1},{"count":858,"lower_bound":"UThnbEJGYzJIQjREekJ0Z0lGNjVFS3FQZ3J5aEs=","upper_bound":"UVBGOTE1ZUVyZnh4UmRmS0FUZGZZZWRKZUs3Rg==","repeats":1},{"count":866,"lower_bound":"UVBmYw==","upper_bound":"UVU5","repeats":1},{"count":874,"lower_bound":"UVZhNmlYejJCRW1oNA==","upper_bound":"UWtPTFliY0Rhb2ROUmZrc0gxdnBIeA==","repeats":1},{"count":882,"lower_bound":"UW1wQmZYY0x5TWpFMlZBRVpoeEEzcXY=","upper_bound":"UXo5SHYwT0dsVGFWbTNTa1JlWnhvVVZu","repeats":1},{"count":890,"lower_bound":"UjJicWtsc2ZydGV2Sld6bA==","upper_bound":"UkM5T1JINnB2ZHBIWUR3TDFTNDFMVUJtT083U1pCUW0=","repeats":1},{"count":898,"lower_bound":"UkNVNXpDdGJWVHZmczRtSmU=","upper_bound":"UlRwdXZCbWd1anI5OW5CTUQ5eG4=","repeats":1},{"count":906,"lower_bound":"Ulc0SEVUMjc=","upper_bound":"UmltOXZBNDNzQkFrMw==","repeats":1},{"count":914,"lower_bound":"Um1EU3EwQWN2ag==","upper_bound":"UndLak5INmxKc3RCRXVDbzBjR21VRkhs","repeats":1},{"count":922,"lower_bound":"UndTaXV2UWpGMUxINVBCdTIxMW1TOGQ1bmZTVEVXNg==","upper_bound":"U0JsVGw2ZFl0ZjJWcXh6Q1VIWHdhdjVLRFJDbDI=","repeats":1},{"count":930,"lower_bound":"U0xOVlE2OHRRYVZiU3hsRUxIMVljalBDNQ==","upper_bound":"U1RlZW1wNmNUSE12UUdjeXYwV1FnSExXN0RhRmo2Yk0=","repeats":1},{"count":938,"lower_bound":"U1g1YlR4THJ5THJwRWpXd2xnOER1VXVSMWZ3","upper_bound":"U2ZwMjNROEN1YjdKTnBNNUpYeFdoT1U0bQ==","repeats":1},{"count":946,"lower_bound":"U2lQRGtXM3Y=","upper_bound":"U21FWUlhY0ZNaUo=","repeats":1},{"count":954,"lower_bound":"U28xTlFwUnBEU283ZnBEMA==","upper_bound":"U3o0VXVWVGZJdldi","repeats":1},{"count":962,"lower_bound":"VDB3aTZ4SHFs","upper_bound":"VDdHV0h1UDNZWDJWZVEzN00=","repeats":1},{"count":970,"lower_bound":"VEgzV3JScEhXRFFqV2FxbklwR0FYWEZLVHJwRlNhY2E=","upper_bound":"VFlnWGMxcw==","repeats":1},{"count":978,"lower_bound":"VGJSQVU5ajNwb3JrZXd3OXBBRWxjV3Q2anJncGs=","upper_bound":"VHBEdnVldU90ZWo1VHVsVkd4TXND","repeats":1},{"count":986,"lower_bound":"VHBXNElydnlyckxrUzVUZFJQ","upper_bound":"VTRCYUZKZlFJVHNJ","repeats":1},{"count":994,"lower_bound":"VTZLRkJOVE1a","upper_bound":"VUpsZkNnT1hUU2VWY2Ewd0V6UVB1N1BReWZ2S2Ny","repeats":1},{"count":1002,"lower_bound":"VVAxVVhLc2tHM0d3NE9HZXIyV3FyTkQ1UVhGTQ==","upper_bound":"VVVUVElJdVFkclhT","repeats":1},{"count":1010,"lower_bound":"VVZnUG5ZMXp4b0dRaldUNlFM","upper_bound":"VWJ5aVY5V2FJa3B3cGxiUkV6czhVSVFOOXoxdFlT","repeats":1},{"count":1018,"lower_bound":"VWNnakFyODNWREJMeUFqZlJ4Q1lM","upper_bound":"VXBCSGZoNE5CelFRVg==","repeats":1},{"count":1026,"lower_bound":"VXBnSjJMelNGWFRUZA==","upper_bound":"VXhxaUVnWQ==","repeats":1},{"count":1034,"lower_bound":"VXlBMzlSVzZh","upper_bound":"VjlMbXZKdzVlVXR2ZW5hWVQxa2Fhdk5KbQ==","repeats":1},{"count":1042,"lower_bound":"Vjlpb2t0NWg=","upper_bound":"Vkl4c2N2TDFMN2JvWGIzSVphN0I=","repeats":1},{"count":1050,"lower_bound":"VkxIaDFFSnJVZ0VCdVZJcjBxaE5RVFF1","upper_bound":"Vk9nb2laVmhScW1yQnQ=","repeats":1},{"count":1058,"lower_bound":"VmFvelk0SGVqRDY=","upper_bound":"VnBMbkk3","repeats":1},{"count":1066,"lower_bound":"VnJMaGJFaVkzNlNxcw==","upper_bound":"VzMzZFY2SEdBTg==","repeats":1},{"count":1074,"lower_bound":"VzRyY3FjZzV2M2c=","upper_bound":"V0dLVGkwemlCYnlVUWtNOFl0RTE3bnRY","repeats":1},{"count":1082,"lower_bound":"V0o0WFY=","upper_bound":"V01aVXFuWWhZTw==","repeats":1},{"count":1090,"lower_bound":"V1NrNkhPVlBDQXZlY3ptako0eVRxVXR1bUxNcTJkeWY=","upper_bound":"V2Y3YnBPcE9IWXdEMFg=","repeats":1},{"count":1098,"lower_bound":"V2ZnTGFLVEdmbmRoTktBdG0=","upper_bound":"WDB2YXZuNVNGTWNLdGp5bnhkcGt2NTk=","repeats":1},{"count":1106,"lower_bound":"WDIyNzdQOHBh","upper_bound":"WE5qR2lNZUZ2ZG1oZ24=","repeats":1},{"count":1114,"lower_bound":"WFEwajU=","upper_bound":"WGEyVnVLNnJzcjgxOThGMHJvYg==","repeats":1},{"count":1122,"lower_bound":"WGF5VmF1Zk52UklFdlg1dVVXRXhRa1Q1a0p2NTJYTg==","upper_bound":"WHdu","repeats":1},{"count":1130,"lower_bound":"WHhDb0JIeEZJWFJBeQ==","upper_bound":"WTNjUkNLd2ZxUEJHaE40MG04Z0p4","repeats":1},{"count":1138,"lower_bound":"WUVR","upper_bound":"WUtQcFh2dFQ4ekdtWXNLaXRmQkFjUVFSNDBBUmJlMA==","repeats":1},{"count":1146,"lower_bound":"WU9JT3U4TmM3V2puZnhVQXdDWEM=","upper_bound":"WVpVaEI2dEN1","repeats":1},{"count":1154,"lower_bound":"WWM5TGtLamR5aUhNT05SNjBHNkNUOUU2enA2cmJz","upper_bound":"WWs4azBLdHNrV1dhY05SY01LOQ==","repeats":1},{"count":1162,"lower_bound":"WW1MbHNMR2dQbnhXdEd6NU91RWxIczZ1ag==","upper_bound":"WXhXbVM5Y1RjVllGVFF5UFo=","repeats":1},{"count":1170,"lower_bound":"WXpncldtSzFyU0NKdGplVXp3cmZUbHFhaW1BaFU=","upper_bound":"WjhJZVdmZXpBaGQwcVFQSg==","repeats":1},{"count":1178,"lower_bound":"WjhkMUZRcWdobDhTQnk1dg==","upper_bound":"WktLUmFkUDNDMUt0eGZUMTRRVQ==","repeats":1},{"count":1186,"lower_bound":"Wk5MejRmU3VMQXpjdXJsUTdUQVVGZ2FCWE83b2dMWks=","upper_bound":"WmpwcXRIR0N6RzRqYUlJS3VKNWxCUThHc2pLZEc=","repeats":1},{"count":1194,"lower_bound":"WmxaMU03d1hTdTE0","upper_bound":"WnZpM0JVeGdpRHpnd2dVV0FMYTBOM2Q5Yg==","repeats":1},{"count":1202,"lower_bound":"Wnp5TFpZOHQ0VENkV3pkNUNqWVJCdA==","upper_bound":"YUVQaDAzMG1lek1GQTZ3R1Q=","repeats":1},{"count":1210,"lower_bound":"YUpZdg==","upper_bound":"YVl2NUxpbE1DdkNKQjJ6","repeats":1},{"count":1218,"lower_bound":"YWFHbVY5OTMzVQ==","upper_bound":"YXRi","repeats":1},{"count":1226,"lower_bound":"YjFyVDhOSUZOU091SEE1RURqazhFaFJObzJU","upper_bound":"YkxiSVcwcA==","repeats":1},{"count":1234,"lower_bound":"YlY3RUpuUWJBREgzejNBWVZhNVJMeThD","upper_bound":"YmtOSDRMem1hNnRLdUx1VGRkU0lVczl3MGRNZEV2Qw==","repeats":1},{"count":1242,"lower_bound":"YnBmNUJ3bFExajdQcjBhRVBqdk8=","upper_bound":"YnREakpPeFpWTG05ZGlZYldlMHgwMlk1","repeats":1},{"count":1250,"lower_bound":"Yzg4a1BYR3VHWVF6cHdlVVMzRkM4Y2FvTDRubk0=","upper_bound":"Y20wTEhIQzZhR3ZOYk15RW5xN2hXWUhhS0k1WFM=","repeats":1},{"count":1258,"lower_bound":"Y3FaQ29vRVRpTA==","upper_bound":"ZA==","repeats":1},{"count":1266,"lower_bound":"ZDE1NjZEWVJ0","upper_bound":"ZDVYUDhJMk9SbVN5bA==","repeats":1},{"count":1274,"lower_bound":"ZENZeXVFUUV6NEF4RE5xNFZwbURBOTZ0dVpNeHhUYw==","upper_bound":"ZFBtbzI3Wk9NNm5qTG1hWUNI","repeats":1},{"count":1282,"lower_bound":"ZFFjZEtqNFdP","upper_bound":"ZFdROUNjTmVrRnc5Tw==","repeats":1},{"count":1290,"lower_bound":"ZGQ2NW1uNjA1am5LS216MDlxYlF0Z2tE","upper_bound":"ZG9TYXJubTZlQWw=","repeats":1},{"count":1300,"lower_bound":"ZHJrTHZvTkJybzNGZFFIZFA=","upper_bound":"ZQ==","repeats":3},{"count":1308,"lower_bound":"ZTd5dkhBTnZoZnN4QUFYbUtBWERBZ25uYmtXMW4=","upper_bound":"ZWFPSm1HbWpQT290SzJwNmxHZ2RVSEp2MmVHSUl1a2Y=","repeats":1},{"count":1316,"lower_bound":"ZWVUUUVSdw==","upper_bound":"ZWhjRzBYVUdjZVpsVXp4MThuSnBBVnl3enE=","repeats":1},{"count":1324,"lower_bound":"ZWh2N0FoYkR2ZXc=","upper_bound":"ZXZwYnY3SQ==","repeats":1},{"count":1332,"lower_bound":"ZXhpTE1UcjdyWHpxeFVFUWlGMkk=","upper_bound":"ZjNqNg==","repeats":1},{"count":1340,"lower_bound":"ZkFRcUVuYUdvYmNFOUprYWpSdUxiSmJUMQ==","upper_bound":"ZlBUOHVBeTN4ZnJQdGtaMUhBQ3V0","repeats":1},{"count":1348,"lower_bound":"ZlRJcm93bjJRSmtRQWZZS1JIM2YxZmg=","upper_bound":"ZmVHcTNIVHFtSzB6akFOOHJneDNwQUo2QkFNZA==","repeats":1},{"count":1356,"lower_bound":"ZmZOSzFHRFNTRjRYQVE1TkZLQ01Vdkw5M3RldkQ=","upper_bound":"ZnJvTDgyMzh0N05iMw==","repeats":1},{"count":1364,"lower_bound":"ZnVTd1dLcjZrNkNsdTZm","upper_bound":"ZzJyRlhWWXpaOU1KMm15b2hJNnZHcWJQdw==","repeats":1},{"count":1372,"lower_bound":"ZzRkRFM=","upper_bound":"Z0hIaXdXSDlibG4=","repeats":1},{"count":1380,"lower_bound":"Z0s=","upper_bound":"Z2JaQ0N1R2VyclFrZmpBNEhIY2Zm","repeats":1},{"count":1388,"lower_bound":"Z2M0UUs=","upper_bound":"Z2lOaFdwUWRrVHFxbnpEcjRxZkk=","repeats":1},{"count":1396,"lower_bound":"Z2p6cVNwMTFITkVsTkFSd3VScFpPRVlDeDJP","upper_bound":"Z3k=","repeats":1},{"count":1404,"lower_bound":"Z3lFWlNRT1ZVVXBXdXJXWGFm","upper_bound":"aDlrdm9xc3oyS0h3QW43Q2Z6SFZ6Z0U=","repeats":1},{"count":1412,"lower_bound":"aDly","upper_bound":"aFBBVExR","repeats":1},{"count":1420,"lower_bound":"aFJMWVNCVQ==","upper_bound":"aGR3QWJMczZ3dmZNUWRLdQ==","repeats":1},{"count":1428,"lower_bound":"aGY2RUo0eUFmeDg=","upper_bound":"aHRYUFJhQ0NzRGxmNUlaQWY2TDdCWFpX","repeats":1},{"count":1436,"lower_bound":"aHk1dldISE5iVVU3WFI0TzJDNmFYbXNOczk=","upper_bound":"aUFYSnVtb3BvcUtFTXpZT29Oa1JwNktOREo2","repeats":1},{"count":1444,"lower_bound":"aVE3","upper_bound":"aVl3NVBRZlZGbEVUT05kamhobFhSUkI3TThDRg==","repeats":1},{"count":1452,"lower_bound":"aWE3SVNVZ1RRbmZReExJOXpIM3dQbHFRbnpDUEFh","upper_bound":"aWd3MGh6MWw5RWFQNEFMdw==","repeats":1},{"count":1460,"lower_bound":"aXZPbw==","upper_bound":"ajdncGlVdk5pRjY5VWFZMEYxOXp6","repeats":1},{"count":1468,"lower_bound":"akNkc1p1bDZsOFQyUTBEM3Ziak1oamRjdnRBcmo1cA==","upper_bound":"akpuQThYVGdzNkdNUUNYUUJvcFN5","repeats":1},{"count":1476,"lower_bound":"akxldkFpdzlTcHlIYlBIcWU5UGZxVFc4azdjQ3d4OXE=","upper_bound":"alF6cGo3WGJRT2s=","repeats":1},{"count":1484,"lower_bound":"alJCdnNiWXhBbUdSUWI=","upper_bound":"aml1Tlp6SE0zVlV4SHlVTHBsUg==","repeats":1},{"count":1492,"lower_bound":"amxoU2tkUnlWZWhlOHdIMlg=","upper_bound":"anQ=","repeats":1},{"count":1500,"lower_bound":"anRHaXpQREd4MXhHT3NXcUhsakRaWHQ2","upper_bound":"anpNQ0RyZDhuTnJ6Rnd2YlBSYUZ1ZmY=","repeats":1},{"count":1508,"lower_bound":"aw==","upper_bound":"a0FJTEpoMkxaQQ==","repeats":1},{"count":1516,"lower_bound":"a0M0ZjFXaVk0VFhDZDlmdk43UFY4U3k=","upper_bound":"a014Szd6b3lBNnAxY3I=","repeats":1},{"count":1524,"lower_bound":"a05WVURZ","upper_bound":"a1h0Vmc1Q1J6TlpqcVdsUnNKUQ==","repeats":1},{"count":1532,"lower_bound":"a1lVT3lYb0l1RGxuU2ZDQw==","upper_bound":"a2UwMnFIOWZoQlV5R3ZpWlU=","repeats":1},{"count":1540,"lower_bound":"a2Y0Y1ROblVneHFMWGh2Rw==","upper_bound":"a3ZXZVprQUMwUUxVUkVuSWpNbjFnNg==","repeats":1},{"count":1548,"lower_bound":"a3djcXlNdHRoREthNzkybll6dUZvQ1dEYQ==","upper_bound":"bDFZQVlsYmxkdTZpMFU=","repeats":1},{"count":1556,"lower_bound":"bDR6VnQxR09ucFlBSm53VzR3","upper_bound":"bEo=","repeats":1},{"count":1564,"lower_bound":"bEoy","upper_bound":"bE1ncjBrNEdsZ1RR","repeats":1},{"count":1572,"lower_bound":"bFFxOTlpR3ZQTWpwbEdOYlUycHdnYVMw","upper_bound":"bGFjT1pBUEExNE5DUlRKN1FKblRDczdueGk=","repeats":1},{"count":1580,"lower_bound":"bGM=","upper_bound":"bHg2QXJ2aXRSU2oxdEc=","repeats":1},{"count":1588,"lower_bound":"bTBKeWdFSUM0eWw2YndGcWc1","upper_bound":"bTR5NUY3ZW9QcmFUSEgyTTZTcGVXMmVkR3RC","repeats":1},{"count":1596,"lower_bound":"bTZ0RmgwRVZ1TURTSlZ3","upper_bound":"bVRiSTVVdGhwa2RCMG8=","repeats":1},{"count":1604,"lower_bound":"bVhUT01wYlJlVDZOVGRoNzlyYmF6TlZ4RGFZMGNnSWw=","upper_bound":"bW1HNGFobXhxcEFHV2NqZXNFZnRBNnc=","repeats":1},{"count":1612,"lower_bound":"bW5tQmxI","upper_bound":"bjJjVTRxS3hkOA==","repeats":1},{"count":1620,"lower_bound":"bjNrQ0dtSEp4VnVnb1hxQXdVbGFlTDNzM1BJ","upper_bound":"bjlSVTFYWWo=","repeats":1},{"count":1628,"lower_bound":"bjlzcnY=","upper_bound":"bkVoTHpNT211Q1BJbmNnZzFtemVQOHdzbVY=","repeats":1},{"count":1636,"lower_bound":"bkVycnpTUE53c0hOc1lxa0UyQ2JvdQ==","upper_bound":"blllemp5bVRJQTZpb0dKcjF6Qw==","repeats":1},{"count":1644,"lower_bound":"bllucTNQd3hOOWtS","upper_bound":"bmZuWGhLNHF5","repeats":1},{"count":1652,"lower_bound":"bmo3MTVpc2g1WDhxeThiV3VpZzMzM0s2bXJrS2E=","upper_bound":"bnZncm13REJyVXM4eFpTckdKZ2lPOEFKWTNCSmU=","repeats":1},{"count":1660,"lower_bound":"bnZvNWNiWXlMZ3FmQ2Q3","upper_bound":"bzJ5aQ==","repeats":1},{"count":1668,"lower_bound":"bzRSVw==","upper_bound":"b2Z3OERXS1ZIQU1UVURMSWpCbVhVREFMd01Dcg==","repeats":1},{"count":1676,"lower_bound":"b2h1amtvaTJiZE9n","upper_bound":"b3Z2dTBCRG55OEREUWxPVHZyVE1pWlQ=","repeats":1},{"count":1684,"lower_bound":"b3g3QnVY","upper_bound":"cDZhM2dxcm9kVkM0Y0k5b3I=","repeats":1},{"count":1692,"lower_bound":"cDZjSjlSMUVObk1QazRXMGxLNXZMTkRrZQ==","upper_bound":"cEJIQlZqT21oTnVpb0E=","repeats":1},{"count":1700,"lower_bound":"cEY0R1NxVA==","upper_bound":"cFhrV1BiYUdCRkFp","repeats":1},{"count":1708,"lower_bound":"cFpLdw==","upper_bound":"cG1PMk1QOFF6QUpHdWFGdHJx","repeats":1},{"count":1716,"lower_bound":"cTNNYW9YbzBrb2pzVVk4M2ljVGJWYUtBdlNHZW12ag==","upper_bound":"cVN3cFpmVVQ1TXoyRE94VWU0","repeats":1},{"count":1724,"lower_bound":"cVlNbFFnYnFKTnpNMEJVNkNodTZreER4NzdW","upper_bound":"cWJKaFdLeg==","repeats":1},{"count":1732,"lower_bound":"cWNCWmN3OUNabTlZVjUxdm9tWGVlbWZXZVViME8=","upper_bound":"cWtldlNseFM=","repeats":1},{"count":1740,"lower_bound":"cW5KdzZjaXk0Wg==","upper_bound":"cg==","repeats":1},{"count":1748,"lower_bound":"cjBWR3lLTWpOUU1VN3ZqUjJtNmhLY3VXQTg1Yg==","upper_bound":"cjZ1STNWTGhqMWczekhRZEdBazI0SWJWeQ==","repeats":1},{"count":1756,"lower_bound":"cjdiMEhTYzIxeG80","upper_bound":"ckJqUUp5OGNkcXZQdnZoNTJ5NjJvTWZtUEE0","repeats":1},{"count":1764,"lower_bound":"ckVPTQ==","upper_bound":"ck9EOXY=","repeats":1},{"count":1772,"lower_bound":"clREWUVjenBoZ2ZnZUhNTA==","upper_bound":"cmYzZTFMMkVkZ0xoQ1BIU2o=","repeats":1},{"count":1780,"lower_bound":"cmlKalVJUjNPenkzeHpN","upper_bound":"cnBneTFjbkdLRg==","repeats":1},{"count":1788,"lower_bound":"cnFEdklCWlRKZlN4QTZuYkFnczA=","upper_bound":"czJ2NVhJOTRkSUd5RVF1WFV5bg==","repeats":1},{"count":1796,"lower_bound":"czU3SzdGbXlQN0pxQThCV3JKaGk=","upper_bound":"c1RI","repeats":1},{"count":1804,"lower_bound":"c2FYUEt5UWRHdlZUZURQbklsT21ZcXBh","upper_bound":"c2Y4WDhJNjB1TmdVWHNiSXlUN1h0YmNMVw==","repeats":1},{"count":1812,"lower_bound":"c2gzUWloTnZuejVZSTZlVg==","upper_bound":"dEFCMDBwejhpVjF2ZWRjWjk4c1NUTkc0RTNWb0xVQQ==","repeats":1},{"count":1820,"lower_bound":"dEJVSkRHeXZpSTE0MjdtZ2xvNEhUbGtG","upper_bound":"dEhONGE4VXNJMEhQTlNlclRCYg==","repeats":1},{"count":1828,"lower_bound":"dEl2bGVRcWl3U1M4VmxQSVoyazRoRFplcm56","upper_bound":"dGFoN0JMV3g=","repeats":1},{"count":1836,"lower_bound":"dGV0RmhPU28xTEF3VlFtSzBFbDJIY0ZtQzByMkRkbkU=","upper_bound":"dHA1cFFaY3V5WGhPSUlIWndreTVo","repeats":1},{"count":1844,"lower_bound":"dHpXd2JMd1ZZYmRvcjZXUTN5SGUwYg==","upper_bound":"dTNoeHVVWmxpbEhrSmJGaHZYQXJYRw==","repeats":1},{"count":1852,"lower_bound":"dTZzZFJa","upper_bound":"dU50djFnekw4N2Q=","repeats":1},{"count":1860,"lower_bound":"dU8xd2xIM0dX","upper_bound":"dWR6RE9Kd0o4TmpEUDJxWA==","repeats":1},{"count":1868,"lower_bound":"dWZaR29jYg==","upper_bound":"dXBXcVNyVU1qU0IwYk80dXZIeDBQRA==","repeats":1},{"count":1876,"lower_bound":"dXNqRmpNelBpQUZwNWU=","upper_bound":"dXpEamJTb2cwTVNsbkE2d2FsbURSMA==","repeats":1},{"count":1884,"lower_bound":"djV6eTI1VlJXbWl6M0V5M2RFOUFm","upper_bound":"dkVibTlaenZH","repeats":1},{"count":1892,"lower_bound":"dk5GdVNI","upper_bound":"dmJmcTEzSnA=","repeats":1},{"count":1900,"lower_bound":"dmlSUXI=","upper_bound":"dzhFMzJYcTR2","repeats":1},{"count":1908,"lower_bound":"dzhXUFV3MEU5","upper_bound":"d0ZDckNaV29SeGc=","repeats":1},{"count":1916,"lower_bound":"d0dlUXVIYmVReklsMlBnc3BOdg==","upper_bound":"d0lSbU1lalJ3b1BkeFpjSk9WbUxGUTMyWDFBRQ==","repeats":1},{"count":1924,"lower_bound":"d2N4bG9YOEpWSmdGbA==","upper_bound":"eDR3MnNV","repeats":1},{"count":1932,"lower_bound":"eDdrUG5WS2F5","upper_bound":"eEJJY0lZWmtScXZIVzRJNUExNlhP","repeats":1},{"count":1940,"lower_bound":"eFRRaWZ1YVdR","upper_bound":"eGQ3dk5Tc2pp","repeats":1},{"count":1948,"lower_bound":"eGU=","upper_bound":"eGlMakxUQzRFMWxwZ1BSd3c=","repeats":1},{"count":1956,"lower_bound":"eHVjTDAyRnNM","upper_bound":"eTJL","repeats":1},{"count":1964,"lower_bound":"eTV6a002cUFLT3o4SmhKYU5qM2FUTnN1OWhkTVdMNA==","upper_bound":"eUl2WWZLM2l6ZUlXR2lxd1hRY1VsWEdiWnlydk5Q","repeats":1},{"count":1972,"lower_bound":"eWJRSHhq","upper_bound":"eW9zNWttNGw=","repeats":1},{"count":1980,"lower_bound":"eXJXRDF4VHFNRmVTWXR6a0ZQRE4wU29acDJpeWdj","upper_bound":"eg==","repeats":1},{"count":1988,"lower_bound":"ejVCTUtsZWtadHc1cnNieE4wa3pJN0Z4ZmpH","upper_bound":"elVtQ1ZxY0hTYXBtNA==","repeats":1},{"count":1996,"lower_bound":"emQzRzNndm56UUNXbjdqOG9R","upper_bound":"em1WMEExQ1R0ZktLOWpPc0NFc3k=","repeats":1},{"count":2000,"lower_bound":"enVTdUxpR1hVeENR","upper_bound":"enlxeHZHN2w3NTdLUmpNRg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,0,1,1,1,1,0,0,0,1,1,0,1,0,0,3,0,0,1,0,0,1,0,1,1,2,2,0,0,1,1,1,2,2,0,1,1,1,1,3,0,1,0,0,0,1,1,2,1,1,1,1,4,4,1,0,2,3,0,1,3,2,1,0,2,0,1,0,2,0,1,0,1,0,1,0,0,2,0,0,1,0,1,0,1,1,1,1,1,1,2,1,2,1,0,1,0,1,0,1,0,0,0,2,2,0,0,0,0,1,1,0,0,1,1,0,0,2,0,1,0,1,1,0,2,1,0,0,0,1,2,1,1,0,0,1,1,1,1,1,1,0,3,2,1,1,2,1,1,2,0,0,0,0,0,2,1,2,0,3,1,0,2,1,1,1,1,2,0,0,1,1,2,1,1,2,1,1,1,0,0,0,0,0,2,1,1,1,3,1,1,1,1,2,1,1,0,1,1,0,2,0,2,1,0,3,0,2,1,1,2,2,4,0,0,1,0,0,2,2,0,1,0,1,1,1,0,0,3,1,0,2,2,1,1,0,0,2,1,0,2,0,1,5,1,0,2,1,0,0,2,1,2,0,2,1,0,0,0,2,0,2,0,1,1,2,0,1,3,0,0,1,2,3,0,0,2,1,2,6,1,0,1,2,1,0,2,1,1,1,1,1,1,0,1,0,1,2,1,2,1,1,2,0,2,1,1,3,1,0,0,0,3,2,1,1,1,1,0,0,0,3,4,3,1,0,1,1,0,1,1,1,1,0,0,0,0,3,0,3,0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,2,2,4,0,1,0,1,0,2,0,2,1,1,2,0,1,1,0,2,0,3,1,0,1,1,1,1,0,1,1,1,1,1,0,2,0,0,4,0,1,0,2,3,1,1,1,0,1,0,0,0,2,1,1,2,1,3,5,0,1,0,1,1,0,2,2,1,1,0,2,1,1,3,2,0,2,0,0,0,0,0,0,1,1,3,0,1,1,1,2,1,2,0,1,1,0,1,1,2,0,1,0,0,0,0,1,1,3,1,0,2,1,0,0,0,3,3,2,0,0,1,2,0,0,1,1,0,2,0,1,0,0,2,1,0,0,1,4,0,3,1,1,0,1,0,0,3,2,0,0,3,2,0,3,1,1,0,1,4,2,1,1,4,2,1,5,2,0,2,1,2,1,0,0,1,2,0,0,0,1,0,0,2,2,0,1,1,3,0,1,2,1,0,1,2,1,3,1,1,2,2,1,0,1,0,2,4,1,2,0,0,2,2,1,4,2,1,1,1,0,0,0,1,1,1,0,2,2,1,0,0,1,1,0,0,1,1,0,1,1,0,0,0,0,0,0,0,0,3,1,2,1,1,4,1,1,2,0,0,0,0,1,1,1,1,2,0,1,1,1,1,1,2,1,0,1,0,0,1,1,1,0,0,1,1,0,1,0,1,1,1,1,2,0,1,1,3,1,4,0,1,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,2,0,2,1,2,0,0,2,0,1,0,0,2,1,2,1,1,1,1,1,3,0,0,2,0,2,0,2,1,0,2,2,0,0,1,0,0,2,0,0,2,0,1,1,1,1,0,0,2,0,1,0,2,2,2,2,2,1,0,1,0,1,1,0,2,0,1,1,0,1,1,2,2,1,0,2,0,0,0,1,3,0,3,1,1,0,1,0,0,1,0,0,1,1,0,0,0,1,0,0,1,0,1,0,0,2,2,0,0,3,1,4,0,0,3,1,1,3,1,0,1,1,0,1,3,1,1,1,0,0,0,1,2,0,0,0,2,1,1,1,1,0,1,1,3,1,2,0,1,2,0,1,1,2,1,0,1,1,0,1,1,2,2,1,1,0,2,0,1,0,2,1,1,0,1,2,5,1,1,2,1,0,0,1,0,1,1,1,2,2,0,0,0,0,3,0,2,1,1,1,3,0,1,1,3,0,0,2,1,0,0,0,0,1,0,0,1,0,0,0,1,1,0,1,2,0,1,1,1,1,1,1,2,1,1,3,0,1,0,0,0,0,1,1,0,1,1,2,1,1,1,1,0,2,1,0,1,0,1,0,2,0,1,1,1,1,2,0,1,1,0,0,1,0,2,2,2,1,1,0,1,3,0,5,2,0,3,0,1,2,1,2,0,0,0,1,1,3,1,3,1,0,0,0,2,0,0,3,2,1,1,0,0,2,1,1,1,0,1,2,1,1,0,1,3,0,2,1,2,1,1,1,1,0,0,2,0,0,0,3,0,0,0,2,1,0,0,1,1,1,1,2,1,1,0,0,1,3,1,1,1,2,0,0,0,3,0,0,1,2,3,0,0,0,2,0,3,2,0,0,1,0,0,2,3,2,0,1,3,1,0,1,0,1,0,1,2,0,1,0,0,0,2,2,1,0,1,4,2,3,3,2,2,0,1,1,3,0,1,0,2,1,1,1,1,0,2,1,3,0,1,0,2,1,0,0,2,0,0,1,0,1,2,0,1,2,1,1,1,1,1,0,2,0,2,0,1,0,2,1,1,0,2,1,0,1,0,0,0,0,1,1,4,1,0,1,2,1,0,0,5,2,3,1,0,0,1,1,2,1,2,0,1,2,2,0,2,2,2,1,3,1,1,1,1,0,2,1,0,3,0,0,0,1,0,2,0,1,3,0,3,3,2,2,1,1,0,0,1,1,0,1,1,3,2,1,1,0,0,2,2,0,2,0,1,1,0,2,0,0,2,0,1,1,3,0,0,0,1,0,1,1,0,1,2,3,1,0,1,0,2,0,0,1,1,2,0,1,0,3,1,2,1,0,0,1,0,0,0,1,2,0,1,2,1,0,1,0,0,1,0,2,1,0,1,1,1,1,1,0,0,1,0,1,1,0,2,0,1,0,1,3,1,1,1,8,0,0,1,0,1,0,1,2,0,1,1,0,1,1,0,3,2,1,1,1,0,3,2,0,0,1,1,0,2,1,1,0,0,0,0,1,2,0,1,0,0,1,2,0,0,1,0,3,0,0,0,2,0,0,0,1,0,2,1,1,3,0,0,2,0,0,1,1,1,0,1,3,0,2,2,1,0,0,1,2,1,0,1,1,1,0,1,0,1,1,2,1,1,1,1,1,1,1,2,1,1,1,0,2,0,4,0,1,0,0,1,0,1,2,3,2,1,2,5,1,0,1,0,1,1,2,0,1,3,1,2,0,2,1,2,2,1,0,0,0,0,1,1,0,2,4,0,1,3,0,1,0,0,0,0,0,2,2,0,1,0,2,0,0,1,0,1,2,0,0,1,0,1,0,0,0,1,0,1,2,1,0,1,1,1,1,1,0,0,3,2,0,0,0,1,0,0,0,0,2,0,1,1,3,2,0,0,1,0,1,1,0,2,3,1,0,0,1,0,0,1,1,3,3,1,2,1,1,1,0,1,0,3,1,1,0,0,2,0,0,2,1,0,1,0,0,0,0,0,1,0,2,2,0,0,0,1,2,1,0,2,0,2,2,0,0,1,2,3,3,1,0,1,1,4,2,3,2,2,1,2,1,1,3,4,1,1,0,0,0,1,1,0,2,0,3,0,1,1,1,2,1,2,1,2,2,0,2,1,2,1,1,0,1,0,1,2,1,0,1,0,1,0,1,0,0,1,0,2,2,1,0,2,1,1,1,1,2,3,2,1,1,0,1,0,0,1,2,1,2,0,1,1,0,1,3,0,1,0,2,2,0,2,0,3,3,0,2,0,1,0,2,0,0,1,0,1,0,2,0,1,2,1,1,0,1,1,0,1,0,1,0,1,1,0,1,1,1,1,2,1,0,0,1,4,0,2,0,0,2,1,0,0,2,2,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,1,0,1,4,0,1,3,1,0,0,0,1,0,0,2,0,2,1,0,0,2,1,0,2,0,1,0,0,2,2,2,1,0,0,2,0,0,0,0,1,3,0,3,1,3,0,1,0,1,0,3,2,0,3,0,1,0,1,2,1,4,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,1,2,2,1,1,3,1,0,0,3,0,1,1,1,1,0,1,1,0,1,1,3,1,1,0,0,4,0,2,1,0,0,0,2,1,0,0,1,0,0,1,1,2,1,0,0,3,0,0,0,2,3,1,1,3,3,1,2,1,1,1,0,1,0,1,0,1,1,3,0,1,0,2,2,0,0,1,2,0,1,1,1,0,1,1,4,1,2,2,1,1,1,1,2,2,0,1,1,2,3,1,1,0,2,0,0,1,1,0,0,1,2,2,0,1,1,1,1,0,0,0,1,1,2,2,1,0,0,1,0,2,2,2,2,0,4,2,1,3,0,1,1,0,2,0,1,1,4,2,1,2,1,1,2,1,1,1,0,1,0,0,2,0,0,2,2,1,2,3,2,1,1,1,1,0,0,0,0,1,0,3,2,0,2,2,3,1,1,2,2,1,1,1,0,0,0,0,1,0,1,2,1,1,2,0,0,0,2,1,0,0,1,1,1,0,2,1,1,0,0,0,1,0,2,2,0,2,0,0,1,1,2,0,2,1,3,0,2,2,0,5]},{"counters":[0,0,1,0,3,2,1,0,2,1,0,2,1,1,1,0,1,0,2,1,0,1,1,0,1,0,1,0,1,1,0,0,0,0,2,0,0,0,1,3,5,1,1,2,1,2,1,3,1,0,1,3,0,0,0,1,0,1,0,1,1,0,0,2,1,0,2,0,0,1,0,0,0,2,3,0,1,0,2,1,1,0,0,0,2,0,2,0,0,0,1,1,3,0,1,1,0,0,1,2,0,1,2,0,1,1,2,0,2,0,2,1,1,0,0,0,2,0,0,2,0,0,0,2,1,2,0,2,2,0,4,2,1,1,2,0,1,3,2,2,0,1,0,0,0,1,1,0,2,1,0,0,1,1,0,1,3,0,1,1,0,1,2,1,1,1,2,2,0,0,0,0,0,0,2,1,1,1,0,0,2,2,0,3,2,0,1,2,3,2,3,0,0,2,0,0,0,0,1,1,0,0,0,1,0,0,1,1,2,1,1,0,0,1,3,1,3,0,1,0,0,1,1,3,0,1,1,1,0,2,2,1,3,1,1,1,1,1,1,1,1,0,0,0,1,1,3,1,2,2,1,1,0,0,1,2,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,2,1,2,1,2,0,0,1,3,2,1,3,0,0,2,1,2,2,1,1,1,0,1,2,2,2,0,1,0,2,2,1,0,4,0,2,1,2,1,2,2,1,0,1,1,1,1,0,0,0,0,1,1,0,2,3,0,1,0,1,0,1,1,1,2,1,1,0,2,0,1,0,1,2,1,3,0,0,0,1,0,1,1,0,0,1,1,1,2,1,0,1,0,1,2,0,2,0,3,2,0,1,3,1,0,1,0,4,0,0,1,1,1,0,2,0,1,1,3,0,1,1,0,0,1,0,2,1,2,0,1,0,1,3,1,0,3,2,0,1,1,2,0,0,2,2,2,0,0,1,0,2,0,0,0,1,1,0,1,1,3,2,1,2,3,2,1,1,1,0,0,0,1,1,3,0,1,2,0,1,2,3,1,0,1,0,1,0,0,0,0,1,0,0,1,1,2,0,2,2,2,2,0,2,0,0,4,1,3,0,2,0,1,0,0,1,0,1,2,1,3,2,1,1,1,4,1,0,3,2,3,1,1,1,0,2,2,0,1,0,0,2,1,0,1,0,0,0,0,1,0,0,1,2,2,1,0,2,0,0,3,1,1,1,1,1,0,3,2,0,0,0,1,0,1,1,0,1,3,0,1,1,2,1,0,0,1,1,1,0,0,0,2,1,2,1,1,1,1,1,0,3,1,0,0,2,0,2,1,0,0,0,3,1,0,1,3,2,1,2,0,0,1,3,1,1,1,0,1,2,0,1,1,0,1,1,0,2,1,1,0,2,2,1,1,2,1,0,1,0,0,0,0,1,2,2,0,0,0,1,0,0,0,1,2,0,1,0,0,3,2,2,1,1,2,0,1,1,2,1,0,1,2,2,2,1,0,0,2,0,0,1,0,0,1,0,0,0,2,0,0,1,1,3,1,0,1,1,0,1,0,1,1,2,0,0,0,0,2,0,0,3,2,0,5,3,1,2,1,1,0,0,2,0,0,1,1,1,1,0,1,2,1,0,0,0,1,0,1,1,1,1,0,1,3,0,0,0,1,1,2,1,1,0,1,2,0,2,0,1,2,0,1,0,2,5,2,1,0,2,1,0,0,1,2,2,0,0,1,1,2,1,1,2,1,1,3,1,2,1,2,0,0,1,0,2,2,0,3,0,3,3,1,2,1,0,0,0,2,1,1,0,1,0,0,1,0,1,2,1,1,0,1,1,1,0,1,0,2,0,0,1,1,0,0,0,0,0,4,1,0,0,1,2,1,0,1,0,1,0,1,0,0,0,3,1,1,1,0,1,1,0,0,1,1,0,0,0,2,1,1,0,1,2,0,1,1,2,0,0,0,0,1,0,0,0,2,0,0,2,0,0,2,1,1,0,0,2,1,0,1,3,0,1,1,0,2,1,0,3,2,1,1,1,1,0,1,2,2,0,0,1,1,4,2,2,1,0,2,0,0,2,1,2,2,1,1,0,1,0,3,0,4,0,2,0,0,1,1,1,1,2,2,0,1,1,1,1,0,0,0,2,0,1,1,2,1,0,1,0,3,1,0,0,0,0,3,1,3,1,0,2,2,1,1,1,0,1,0,2,3,2,0,1,2,0,1,1,2,2,0,1,0,2,0,0,0,1,0,0,1,2,1,1,0,1,0,3,2,0,2,0,0,1,2,1,0,0,0,1,0,1,0,0,0,0,1,0,1,1,2,1,2,3,3,2,0,1,3,0,0,1,0,0,0,1,4,3,0,2,1,1,0,1,1,3,2,0,0,2,2,1,1,1,2,0,2,2,0,1,2,0,2,1,1,2,0,1,1,2,2,0,2,0,0,2,2,1,0,1,0,1,4,0,1,0,0,1,3,0,1,0,2,1,1,3,1,0,1,0,1,0,0,1,2,1,0,2,0,1,0,0,1,0,1,0,2,2,0,1,1,0,1,1,1,2,1,3,0,0,2,2,2,1,0,0,0,2,0,2,1,0,0,2,1,0,0,0,0,0,2,1,0,2,1,0,1,0,2,1,2,0,1,0,3,0,0,0,1,0,1,0,0,1,0,0,1,1,3,0,0,0,1,2,1,1,1,0,2,3,2,0,2,1,0,1,0,0,2,1,0,2,2,2,0,2,0,1,0,0,2,3,0,2,0,0,2,0,1,2,2,1,0,1,1,3,1,0,1,0,1,0,0,0,0,1,1,1,4,2,1,1,1,1,2,0,2,0,1,0,2,1,1,1,0,3,2,0,2,1,0,0,0,0,1,0,1,0,1,0,2,0,1,2,0,3,1,0,0,0,1,0,1,1,1,0,1,3,2,1,1,0,1,2,1,0,3,0,2,2,2,1,2,2,2,0,1,0,0,1,2,2,1,1,1,0,1,0,1,2,1,0,1,0,0,0,2,2,1,1,0,1,1,2,0,1,0,2,0,0,1,2,4,1,1,0,1,3,0,2,1,0,0,0,1,4,0,0,2,0,0,0,2,2,1,1,0,2,2,0,1,1,2,1,1,0,4,1,1,1,0,3,1,0,2,1,1,1,1,1,0,1,1,1,1,1,4,0,4,2,3,0,0,3,0,3,1,0,3,2,0,2,3,3,1,1,0,0,1,0,1,1,0,1,2,0,0,2,0,1,1,0,0,1,3,0,0,1,2,2,1,1,0,0,2,0,1,0,1,1,0,0,1,1,0,1,2,1,1,2,0,0,1,0,1,1,1,0,1,0,0,0,2,0,1,2,2,1,1,3,1,2,2,0,0,1,4,1,1,0,2,0,0,1,2,1,0,2,1,0,0,0,1,1,0,0,0,0,1,1,4,2,2,1,0,1,0,1,3,1,3,2,0,0,2,1,0,1,0,4,0,1,2,0,1,2,2,1,2,3,4,0,1,0,1,0,1,0,2,0,2,4,1,0,0,0,1,2,3,1,1,2,0,1,1,1,3,0,1,2,1,2,3,1,0,1,2,0,1,2,1,4,2,0,2,1,2,1,0,1,3,3,1,0,0,1,0,0,2,0,0,2,1,0,2,2,1,1,1,0,1,2,1,2,0,1,2,1,1,1,2,1,0,2,1,0,1,0,1,1,0,0,1,1,3,0,0,0,1,0,0,1,0,1,2,0,2,1,1,1,0,1,3,1,0,1,1,2,2,0,1,0,1,1,1,0,1,0,1,1,1,1,1,1,1,0,2,0,0,1,0,3,1,2,0,1,0,2,1,1,0,0,2,0,1,2,3,1,3,0,0,0,1,1,1,0,1,1,1,2,1,1,1,3,2,0,0,1,0,2,1,1,0,0,1,0,2,0,1,1,0,1,0,2,2,1,1,1,2,1,3,0,0,0,2,0,0,1,1,1,3,3,2,2,0,0,1,0,2,1,1,2,1,1,4,0,0,0,0,0,1,1,0,2,1,2,1,0,1,0,1,2,0,0,1,0,0,0,1,0,1,1,1,1,1,1,0,1,1,1,1,1,1,3,2,1,1,1,0,1,1,2,1,0,0,0,1,0,0,1,0,5,2,1,2,1,0,2,0,1,3,1,0,1,1,1,2,2,2,0,1,0,3,1,5,1,0,3,0,1,0,0,2,1,0,1,2,2,2,2,1,1,0,0,3,0,2,2,1,3,2,0,1,0,3,0,0,2,0,0,2,1,1,2,0,1,1,1,1,0,1,1,2,1,1,2,0,2,0,0,0,1,0,1,0,1,1,1,1,1,1,0,1,0,1,0,0,1,0,1,1,0,1,3,1,2,2,2,0,1,0,0,2,1,1,1,1,2,0,2,1,0,0,2,1,1,2,1,4,0,1,1,0,2,1,2,1,1,0,0,2,0,0,1,1,0,0,2,1,0,2,1,0,1,0,0,0,1,0,0,1,2,0,0,2,1,2,2,0,1,2,2,1,0,1,0,0,1,0,1,2,0,0,1,1,1,0,0,0,3,0,0,0,1,1,1,1,1,0,0,1,0,1,0,1,1,5,0,2,2,0,3,1,2,1,1,2,2,1,1,0,1,1,2,0,1,1]},{"counters":[1,0,2,1,1,0,0,0,0,1,0,3,0,1,4,1,1,1,3,0,2,0,1,0,1,1,2,1,0,1,2,0,1,0,1,0,0,2,1,0,0,0,5,1,1,1,0,1,1,1,0,1,0,0,1,3,1,1,3,1,1,3,0,0,0,0,2,2,1,1,1,1,2,2,1,2,0,0,3,0,1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,1,2,0,0,0,1,0,1,1,1,1,1,2,2,2,2,2,2,0,1,1,0,1,0,1,2,1,2,0,3,0,1,0,0,0,1,1,1,1,0,1,1,0,2,2,1,1,1,1,1,2,1,1,1,0,1,0,0,0,4,0,1,2,1,0,0,2,2,3,0,0,0,0,0,0,0,3,2,0,0,0,2,1,1,1,1,2,0,1,0,1,0,2,1,2,2,0,0,3,2,2,0,2,4,3,1,1,0,1,1,0,1,1,1,1,2,2,0,1,1,1,1,1,1,0,2,0,1,1,3,0,0,0,2,0,2,2,0,1,2,1,1,0,0,1,1,3,0,1,2,2,1,1,1,3,1,0,1,1,0,0,4,0,0,1,0,2,3,1,2,0,2,1,0,0,0,1,0,2,0,0,1,1,0,2,1,1,0,0,1,3,0,4,3,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,1,0,2,0,0,0,0,2,1,0,0,1,1,2,0,0,0,0,1,2,1,3,0,0,0,1,0,3,1,1,5,0,1,3,1,3,0,0,0,2,1,1,0,3,1,2,1,1,2,1,1,3,0,0,2,2,0,1,0,0,2,2,0,0,1,1,2,1,1,0,0,0,0,3,0,2,0,2,2,2,0,1,2,0,0,1,3,1,0,3,0,2,1,0,3,0,1,4,0,2,1,0,1,0,1,0,1,1,0,3,0,1,0,0,0,2,1,5,0,0,1,1,3,2,1,1,0,1,0,2,1,0,3,0,2,2,0,2,0,1,2,0,2,0,3,0,2,1,1,0,2,1,1,1,2,0,0,0,0,0,3,2,1,1,3,0,0,1,1,0,2,2,0,1,0,1,2,0,0,3,1,0,0,0,1,1,2,0,0,0,2,1,0,1,0,0,0,2,0,2,0,2,3,0,1,1,2,0,1,0,1,2,2,1,1,0,0,1,2,1,0,0,1,1,2,0,1,3,0,0,2,1,1,0,1,1,2,1,0,2,0,4,1,0,0,0,0,2,0,4,1,2,2,2,1,0,2,3,3,1,1,1,1,2,0,2,1,0,0,2,2,0,0,1,2,1,0,1,0,1,2,0,2,0,0,1,1,0,2,0,1,0,1,1,0,1,5,1,3,0,1,3,1,1,3,0,3,0,1,0,1,1,0,0,1,0,2,1,1,1,0,0,1,1,0,1,1,0,2,1,0,2,1,2,0,1,2,0,1,1,4,0,1,1,2,1,0,0,0,0,2,2,1,0,0,0,3,1,0,1,0,1,1,0,2,2,3,1,3,1,1,0,2,0,1,1,2,0,1,1,2,0,1,0,1,0,2,0,0,0,0,1,0,1,4,3,0,1,0,1,1,2,2,0,1,2,1,1,0,2,1,2,0,1,1,0,0,4,1,0,0,2,2,0,1,1,2,2,0,1,0,1,1,0,1,0,0,2,1,0,3,1,1,1,1,1,0,2,0,1,1,2,1,1,3,0,1,1,1,1,2,0,0,1,2,2,2,0,0,0,2,1,1,0,1,2,2,2,1,2,0,5,2,1,2,3,1,1,2,2,0,0,1,0,0,0,4,1,1,0,0,0,1,1,1,0,0,1,3,1,1,1,1,0,1,2,0,2,0,0,3,3,1,1,0,1,0,2,1,2,2,1,0,1,0,1,0,0,0,1,0,0,2,1,1,1,0,3,0,0,0,2,2,1,1,1,0,1,0,1,3,2,1,0,0,1,2,2,3,1,1,2,0,0,0,0,1,1,2,0,0,2,1,0,2,1,0,0,2,0,0,1,1,0,0,1,0,0,0,3,0,1,1,1,0,1,0,0,2,2,0,0,0,0,0,0,0,1,0,2,2,1,0,1,0,0,0,1,1,0,0,0,3,1,0,0,0,2,0,1,1,2,1,2,1,1,0,0,1,1,2,1,0,0,1,0,2,3,1,1,2,2,0,1,1,3,0,2,1,1,0,1,0,0,0,1,0,2,1,1,3,0,1,1,0,0,0,1,1,1,3,0,1,0,1,0,1,1,1,1,2,0,0,1,2,0,0,2,3,0,0,2,1,0,0,0,1,1,2,2,0,2,4,1,1,0,3,2,0,0,0,2,1,4,1,4,4,0,1,1,1,1,1,1,2,0,3,1,1,1,0,2,0,0,0,2,3,3,2,1,3,0,0,1,1,2,1,1,0,0,2,0,0,0,2,0,1,1,1,2,0,0,1,0,1,2,1,0,0,1,1,1,2,0,2,2,0,0,1,1,1,0,1,3,1,0,1,0,0,0,2,1,0,1,1,3,5,2,1,2,1,2,1,3,0,1,0,2,2,1,2,0,1,1,3,0,1,1,1,0,1,1,2,0,1,2,1,1,1,1,0,0,1,2,0,0,1,0,0,2,0,2,0,2,1,0,2,0,0,1,0,2,2,0,0,1,1,0,0,1,1,0,2,1,0,0,0,0,0,1,2,0,0,0,2,1,2,0,0,2,1,0,2,1,2,2,0,0,0,1,0,0,1,0,0,3,0,1,0,1,2,2,0,2,1,1,0,0,1,0,0,0,1,1,2,2,0,2,1,1,2,1,3,1,1,1,1,2,1,1,0,0,1,2,1,0,0,0,3,0,0,0,2,1,0,1,3,3,1,1,0,1,2,1,0,3,1,2,0,0,0,0,0,0,1,2,1,4,1,1,0,3,1,1,0,1,0,0,1,2,2,4,2,2,1,2,1,1,1,1,1,1,1,0,0,1,0,0,1,2,2,0,0,3,0,0,1,0,1,1,2,0,2,1,1,0,2,0,4,2,0,2,1,0,0,0,0,1,2,1,1,0,0,0,1,2,0,1,0,0,0,1,3,0,2,0,0,1,0,1,1,3,0,0,0,1,1,1,0,0,0,1,0,1,1,4,1,2,0,0,0,2,1,2,2,2,1,4,2,1,0,3,0,0,1,1,2,0,1,1,0,1,1,0,0,1,1,3,2,1,2,1,1,1,1,1,1,0,0,2,1,0,2,0,1,0,0,3,1,2,1,3,1,1,0,1,2,2,0,2,1,0,0,0,0,3,1,0,0,1,1,3,2,1,1,2,0,0,1,0,0,1,1,1,0,1,1,1,2,0,0,2,1,3,1,1,0,0,1,1,3,2,0,0,0,0,0,2,1,2,0,1,0,3,2,2,2,1,3,0,1,1,1,3,0,2,0,1,1,0,2,0,3,1,0,1,2,0,2,1,3,2,0,1,3,1,0,1,0,1,1,1,0,3,2,2,0,2,1,0,0,0,0,3,1,1,2,1,1,1,0,1,0,0,1,2,1,0,1,2,0,2,0,3,1,2,1,3,0,2,2,2,4,3,1,0,2,1,0,0,1,1,1,1,1,1,0,1,1,0,1,1,1,0,2,2,1,0,2,0,3,1,2,1,0,1,0,0,0,0,0,0,0,2,0,1,2,2,0,3,3,1,0,1,1,1,2,2,1,0,2,1,1,1,2,0,0,1,0,0,0,0,1,1,1,3,1,1,1,1,1,0,2,1,0,0,2,1,4,0,0,1,2,0,1,0,0,1,1,1,1,1,3,0,0,1,0,1,1,2,3,1,1,2,0,0,2,1,0,2,0,1,1,2,1,0,0,1,0,0,0,2,4,1,0,0,1,3,1,1,2,0,1,2,0,1,1,0,1,0,3,0,0,0,2,1,0,2,0,0,3,0,1,2,0,2,1,3,2,1,0,1,0,0,0,0,0,2,1,0,3,2,1,1,4,0,1,1,0,0,1,1,1,1,0,3,1,1,1,0,0,2,0,1,0,0,1,1,1,1,1,2,0,1,2,0,3,1,2,0,0,1,1,0,1,0,1,1,1,1,0,1,0,0,2,1,0,1,1,1,0,2,0,0,2,1,1,0,0,0,2,1,0,2,0,2,2,0,0,0,1,1,2,3,2,1,1,1,2,1,0,0,2,3,2,1,2,1,0,1,1,1,1,2,0,1,1,1,0,0,1,0,1,0,0,2,1,1,1,1,2,2,0,0,0,1,0,2,0,3,1,0,1,1,2,0,1,0,0,2,0,0,1,1,1,2,0,2,2,1,1,0,0,0,0,3,1,0,1,1,3,1,0,0,0,0,1,0,0,1,2,2,1,0,0,2,1,1,0,1,0,0,1,1,2,1,2,0,0,1,0,0,1,0,2,2,0,0,1,1,2,1,1,1,2,1,3,1,0,0,2,1,0,3,2,0,4,1,0,0,1,1,1,0,0,0,1,2,1,1,1,0,0,1,2,0,0,3,2,1,2,2,0,1,1,2,2,1,3,0,1,0,1,3,1,2,1,2,0,1,0,1,1,0,1,1,1,2,1,0,0,0,0,0,2,0,1,0,1,2,1,0,0]},{"counters":[1,1,0,0,2,1,0,0,3,0,1,0,0,4,2,2,0,1,0,2,1,0,3,1,1,0,2,1,0,1,1,0,1,0,1,2,0,2,1,0,1,0,2,3,1,4,5,3,1,2,3,1,1,0,1,2,1,2,0,0,2,1,2,1,3,0,0,1,1,1,3,2,3,2,2,1,1,0,0,0,4,0,2,2,0,2,1,2,0,2,3,0,1,2,3,1,0,1,2,2,0,0,1,1,1,3,2,2,0,1,1,0,0,0,4,0,1,0,2,4,2,1,1,0,1,1,1,4,1,0,2,0,1,0,2,2,1,0,1,1,2,0,1,0,0,1,1,0,1,0,0,1,1,2,1,0,1,0,1,2,0,1,1,3,0,3,0,1,4,1,0,4,0,1,0,0,0,5,1,2,0,0,2,0,1,0,1,2,1,2,2,3,2,2,1,0,1,0,0,2,2,2,1,1,2,0,2,1,1,2,1,1,1,1,0,1,0,1,1,2,1,0,0,1,1,1,0,1,2,0,0,0,1,2,1,3,0,0,3,1,1,1,0,2,2,3,1,3,0,0,1,2,0,0,1,1,0,0,1,1,1,1,2,1,0,1,1,2,0,1,2,1,0,1,1,1,3,1,0,0,0,0,1,1,0,1,0,0,1,0,0,0,0,0,3,0,0,0,0,0,1,0,1,1,0,0,0,1,1,1,3,2,0,1,2,2,0,0,1,0,0,1,1,1,1,0,1,2,1,1,2,1,0,1,2,1,1,1,1,2,1,0,1,1,0,1,2,0,0,2,2,0,1,1,1,2,1,3,1,1,0,0,1,4,1,0,0,1,3,0,1,0,0,1,0,3,3,0,1,1,1,0,1,3,1,2,0,0,2,1,1,1,0,0,0,1,0,0,0,0,2,1,1,1,0,1,2,2,1,2,2,1,1,0,0,0,4,1,1,0,0,1,1,2,0,1,0,1,2,2,1,1,0,0,2,1,2,0,0,0,1,1,1,0,1,2,0,2,1,1,0,0,0,0,1,0,0,2,0,0,1,2,3,1,0,2,1,3,0,0,0,2,3,1,1,1,1,1,0,2,0,0,0,2,0,2,1,0,1,3,0,1,2,2,0,1,0,1,0,1,0,1,0,3,0,1,2,1,2,0,0,1,3,2,0,1,1,1,2,1,0,0,1,0,3,0,1,0,0,0,2,1,1,2,2,1,1,0,0,0,1,1,0,0,3,0,2,2,0,0,3,0,1,1,1,0,1,1,1,1,0,1,1,2,1,0,3,1,0,1,2,2,1,1,2,0,3,1,1,0,0,2,0,0,1,4,2,0,3,1,1,3,2,1,2,0,1,1,1,2,1,1,1,0,0,2,0,1,2,0,1,1,4,2,0,0,0,1,1,1,0,0,1,2,1,1,2,3,0,3,2,0,1,1,1,0,0,0,2,1,0,1,2,2,1,0,2,2,0,2,0,1,1,4,2,1,3,1,1,1,2,1,3,1,1,1,3,3,1,0,0,1,1,0,1,1,3,1,1,0,2,2,0,1,2,0,2,0,0,2,0,0,0,1,0,0,1,1,1,1,1,2,0,1,0,0,0,0,1,1,0,0,1,0,0,0,2,2,1,2,0,0,0,1,1,0,0,2,1,1,1,1,1,1,1,1,0,4,1,2,2,1,1,0,1,2,2,1,1,1,2,1,3,0,2,0,1,1,0,1,0,1,1,0,0,0,0,1,1,0,1,3,0,1,1,2,0,2,1,0,3,1,0,1,0,1,1,0,1,2,0,3,1,1,1,0,0,2,0,1,0,0,0,0,1,1,0,2,0,1,0,1,5,1,0,1,2,0,0,1,1,0,0,0,1,0,1,1,0,2,1,1,0,2,3,0,3,1,2,1,3,1,0,3,0,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,0,1,3,2,1,0,0,1,1,0,1,2,5,0,2,2,0,2,0,1,2,0,1,1,0,2,1,0,1,5,1,1,0,1,4,0,1,1,2,1,1,0,2,2,0,1,0,0,0,1,0,1,0,0,1,1,1,0,0,0,2,2,1,0,0,0,0,1,1,3,1,2,3,0,1,1,1,2,1,0,0,0,2,0,0,4,0,0,2,2,3,2,1,1,2,0,1,2,1,1,0,0,0,1,1,0,0,1,0,0,0,2,0,0,0,2,0,2,2,0,2,1,2,1,1,1,0,1,1,0,0,0,1,0,1,3,2,1,0,0,3,1,0,0,1,2,0,0,0,2,0,3,2,0,1,0,1,1,2,1,2,2,1,1,1,1,1,2,0,0,1,0,0,0,1,1,2,1,0,2,0,3,1,1,1,1,0,1,1,1,1,2,3,0,2,2,0,2,3,0,0,2,0,0,1,1,1,1,0,3,0,1,0,1,2,0,0,1,0,0,0,1,2,0,1,0,0,0,1,3,0,0,0,3,2,0,2,0,1,1,2,2,0,0,0,1,2,0,0,1,0,0,3,3,1,2,0,3,0,1,3,0,0,2,1,0,2,4,1,0,2,2,1,0,2,0,1,0,0,1,2,1,2,4,0,2,2,0,0,2,2,1,0,0,2,3,0,0,1,1,1,1,3,2,0,0,0,0,1,0,0,1,0,2,0,0,1,1,0,1,0,1,1,3,1,4,0,0,0,0,0,2,1,2,2,0,0,0,1,0,4,1,2,0,3,0,0,1,1,0,0,0,2,1,0,0,1,0,2,0,0,1,3,1,0,0,1,1,1,2,1,1,2,4,2,0,0,1,2,1,0,1,3,2,1,0,5,1,2,1,0,0,0,1,2,0,0,1,1,3,2,0,1,3,1,0,1,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,2,0,2,0,1,1,1,1,1,0,1,0,1,0,1,1,0,1,1,1,0,0,1,2,1,1,0,0,1,0,0,0,3,0,1,2,1,1,0,0,1,1,3,1,1,3,1,0,2,0,0,0,2,2,2,1,2,0,1,1,0,0,1,1,3,1,0,0,2,2,0,0,1,4,1,1,0,1,2,0,2,2,2,1,0,0,2,1,1,0,1,3,0,0,0,1,0,0,3,0,2,1,0,3,0,3,1,4,0,0,1,0,0,1,2,1,1,2,2,1,1,1,3,1,1,2,2,0,1,0,0,1,1,3,0,0,2,1,0,0,1,0,1,3,0,0,1,0,4,0,2,1,1,0,1,1,1,0,0,0,0,0,0,1,1,2,0,0,1,3,0,1,1,0,2,1,0,3,1,1,2,1,0,0,1,1,2,1,1,4,2,1,1,1,0,1,1,3,1,1,1,0,3,0,3,2,2,0,2,1,0,0,0,0,4,0,1,1,2,1,1,0,3,0,0,0,2,1,2,0,0,1,1,1,1,3,0,0,0,0,1,0,0,0,1,0,1,1,1,2,0,1,1,0,1,0,1,1,2,0,0,1,2,2,3,0,0,0,0,0,1,0,0,0,0,0,2,0,0,1,1,1,0,1,1,3,2,1,1,0,1,0,0,3,0,1,3,1,3,2,3,0,0,0,3,0,2,4,2,3,2,0,1,1,1,0,0,1,3,0,3,1,0,0,0,0,0,0,1,0,0,0,0,1,1,2,2,0,0,1,0,4,1,0,2,0,0,0,2,0,2,1,0,0,0,0,1,1,2,1,0,0,0,0,1,3,0,0,3,0,2,2,1,2,0,0,0,1,0,0,2,1,2,2,1,0,2,3,3,0,3,1,1,1,2,2,1,0,0,0,0,2,1,2,2,1,1,0,1,2,2,0,0,1,1,3,1,1,2,2,2,1,0,2,0,0,0,1,2,0,2,0,1,0,2,0,2,0,0,3,2,0,2,1,2,1,1,1,1,1,2,0,0,0,0,1,0,1,2,0,1,0,1,2,1,1,0,0,0,1,1,0,2,0,2,0,1,0,1,1,1,1,1,1,0,2,1,2,3,0,2,0,2,0,1,2,1,0,0,2,0,1,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,0,2,0,0,0,2,0,1,1,1,1,1,0,1,0,1,0,2,0,0,1,2,1,1,0,1,1,1,1,2,2,0,1,1,1,1,0,1,1,1,2,3,1,1,1,2,3,1,1,1,1,1,0,2,2,0,1,0,3,1,0,3,0,0,2,4,0,1,1,0,2,1,1,2,1,1,1,0,1,0,1,0,0,0,1,0,1,0,4,0,0,2,2,0,1,2,0,1,0,0,0,2,1,1,0,1,2,1,0,2,0,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,0,0,1,1,1,1,2,2,0,0,1,1,1,1,2,1,2,2,0,1,2,1,0,0,3,0,3,1,1,0,1,0,0,1,1,0,2,0,1,1,1,3,0,2,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,1,1,0,1,1,2,3,1,0,0,1,1,1,0,1,2,1,1,1,1,0,0,1,2,1,0,1,4,0,1,2,1,0,1,3,0,1,2,3,3,0,0,1,1,3,0,3,0,3,1,0,1,3,0,2,0,1,0,1,1,0,2]},{"counters":[0,1,1,0,0,0,0,0,1,1,1,2,1,1,1,0,1,2,0,2,1,1,0,1,1,0,0,0,1,1,2,1,2,1,0,1,1,0,1,2,3,2,1,4,1,2,0,0,1,1,0,1,0,2,3,0,1,1,0,1,1,0,1,1,2,1,0,0,1,0,0,0,0,0,3,0,3,1,1,0,3,0,0,0,1,1,2,2,0,1,1,0,1,1,0,1,3,1,2,0,0,2,0,2,0,2,1,0,1,1,0,1,0,1,1,0,1,0,1,0,2,2,1,0,1,1,3,2,2,0,1,2,0,1,1,0,0,0,2,0,2,0,1,1,3,4,0,2,0,0,1,1,2,1,0,1,1,1,0,2,0,2,0,1,1,0,1,1,1,1,1,1,2,1,5,2,3,0,1,0,0,1,1,1,3,1,2,0,1,0,2,2,0,1,0,0,0,0,0,2,0,0,0,1,1,3,0,3,0,1,1,0,2,1,0,0,0,2,2,1,1,3,1,0,1,1,1,1,3,1,1,1,1,2,2,0,5,1,1,0,2,0,0,1,1,1,0,3,0,0,2,1,2,2,1,3,0,1,2,3,0,1,1,0,2,0,0,1,0,2,2,1,1,2,1,1,3,0,4,3,1,1,1,0,1,0,3,1,0,3,0,0,1,0,1,2,0,2,3,0,2,0,1,1,1,1,0,0,1,3,1,1,1,1,0,2,1,0,1,1,1,1,0,2,0,1,1,1,0,0,1,0,1,2,1,1,0,1,0,1,3,1,1,0,3,0,1,0,2,2,0,0,1,0,0,1,0,2,0,0,0,1,1,1,1,0,0,0,0,0,0,3,2,1,0,1,1,2,0,0,0,1,0,0,1,0,1,0,0,2,2,1,0,1,1,4,0,3,1,1,1,2,2,2,3,0,2,0,1,1,2,0,0,4,0,1,0,0,0,0,3,3,1,0,1,1,1,1,3,1,1,0,0,0,1,0,0,3,1,1,2,1,0,1,1,0,1,0,1,1,0,0,1,0,1,1,0,1,3,1,1,0,1,0,0,6,1,1,1,1,2,2,0,1,1,2,0,1,0,2,2,0,0,2,0,0,0,2,1,1,0,1,0,0,1,4,1,1,1,0,0,2,0,0,0,1,3,0,2,0,1,1,0,0,2,1,0,0,1,0,3,1,0,2,0,1,1,0,4,0,0,0,0,1,1,1,1,0,0,0,0,2,0,0,2,0,1,2,1,1,1,1,4,2,0,0,1,1,1,0,3,0,1,0,0,1,0,3,1,3,1,0,0,2,1,2,0,0,2,1,0,0,0,0,2,2,0,1,0,2,0,0,1,1,0,0,1,1,1,0,1,0,0,2,0,0,0,0,0,3,0,1,1,1,1,0,2,2,1,2,1,0,1,1,0,0,0,1,2,0,0,2,2,0,2,0,0,1,2,2,1,0,0,1,0,1,0,2,2,1,1,1,1,1,0,1,0,1,4,1,3,0,0,2,1,0,1,2,3,1,0,1,0,0,1,3,0,0,1,0,3,1,1,0,0,0,2,1,0,0,0,0,1,1,0,0,4,1,3,1,2,2,1,1,2,0,0,1,4,2,0,0,1,1,0,0,2,1,2,0,1,0,1,1,2,0,1,2,1,2,2,2,0,0,1,0,1,1,2,1,2,1,1,1,3,0,0,3,0,1,0,1,0,2,3,0,0,2,2,0,1,1,0,2,2,0,1,0,1,0,0,0,0,0,2,2,0,1,1,1,1,0,0,0,0,2,0,3,2,0,1,3,4,0,1,2,1,3,0,0,2,0,1,1,1,0,2,1,1,1,3,3,1,2,0,3,0,2,1,0,2,0,4,1,0,1,0,1,3,1,0,1,1,0,1,0,0,1,2,4,0,2,0,0,1,0,0,0,0,1,0,1,1,0,0,1,0,1,2,1,3,1,0,1,2,1,0,1,0,0,2,1,1,1,1,3,2,2,4,1,2,0,0,2,1,0,0,0,1,1,3,1,3,2,0,1,1,1,0,2,2,3,0,0,3,1,0,0,0,2,1,0,0,2,1,1,0,1,2,1,2,0,3,0,1,0,1,1,1,1,0,0,0,0,0,1,1,3,0,1,1,0,3,0,4,3,0,1,2,1,2,1,0,2,2,1,0,1,0,1,1,2,1,0,0,0,0,0,1,1,3,2,0,1,2,0,1,0,0,3,0,2,3,2,1,3,2,0,0,2,1,0,0,1,3,0,0,1,2,0,0,1,0,1,1,0,0,1,1,2,1,0,0,2,0,1,0,1,0,0,0,0,0,2,2,3,1,0,1,3,1,3,2,1,0,2,1,0,0,0,1,2,1,1,4,1,2,2,0,1,0,0,1,1,0,0,0,1,0,0,0,1,2,0,1,2,1,3,2,2,0,0,3,1,3,1,2,0,2,0,0,1,1,1,1,1,3,1,1,4,1,4,0,0,1,2,1,3,1,1,0,2,1,1,1,2,1,0,2,1,1,2,1,1,1,0,0,1,0,1,2,0,0,3,2,0,1,0,0,1,0,3,1,2,0,1,3,1,1,0,1,1,3,2,2,0,0,0,0,1,0,3,0,0,1,1,1,1,1,1,1,0,0,3,2,0,1,4,1,1,0,0,1,0,0,3,1,1,0,0,2,0,1,0,0,0,0,1,3,0,2,0,0,2,1,1,1,0,3,0,0,1,0,1,1,0,0,1,1,0,0,0,1,1,1,1,0,1,1,0,1,4,2,1,3,1,0,0,0,4,0,2,2,0,1,1,2,0,0,2,1,3,1,2,1,0,0,3,0,0,1,1,5,1,0,2,0,1,0,1,1,0,2,0,0,0,3,2,1,2,2,0,0,1,1,1,3,1,1,1,0,1,2,1,3,2,1,2,0,1,3,2,0,1,2,1,1,1,2,1,0,1,5,1,1,1,3,2,1,1,3,2,3,1,3,0,0,1,0,1,2,3,1,1,1,0,1,2,0,1,0,1,1,0,0,0,3,1,0,0,0,1,0,2,2,3,0,1,1,1,0,0,2,1,0,1,3,1,1,3,2,2,1,0,0,0,2,0,0,2,1,1,1,1,1,0,2,1,6,1,1,1,2,0,2,1,1,0,0,0,0,3,1,2,1,1,1,1,1,0,0,0,3,1,1,2,0,1,0,2,2,1,1,0,0,0,1,4,3,2,1,0,1,0,2,2,1,1,0,1,1,0,1,0,2,1,2,1,2,1,1,0,1,1,1,2,1,2,0,1,1,1,0,1,3,0,1,1,0,0,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,2,1,0,1,0,2,0,1,0,1,0,0,1,1,0,1,2,0,2,0,0,0,1,0,1,1,0,0,1,2,1,0,0,1,2,0,2,2,0,4,0,0,1,1,1,0,1,1,2,2,1,0,0,0,2,0,0,0,3,1,3,0,0,1,2,1,1,0,0,1,1,0,2,1,0,4,0,2,0,0,2,1,2,1,4,1,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,1,1,2,0,0,0,0,0,2,2,0,1,0,0,0,2,0,1,1,1,1,0,0,0,1,1,2,0,1,2,0,0,2,1,2,1,0,0,1,3,0,1,1,4,1,1,0,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,2,5,1,1,0,4,2,1,1,1,1,3,0,0,0,4,0,0,0,0,1,0,1,0,0,1,0,1,1,2,3,2,1,0,1,1,1,3,0,2,1,1,2,1,1,2,0,0,2,3,1,3,1,0,0,0,1,2,1,1,2,0,0,2,0,0,1,4,1,1,0,1,1,3,0,0,0,0,0,1,3,2,0,2,2,0,1,0,0,0,1,1,2,1,3,2,1,0,1,0,0,1,1,5,0,0,0,0,0,2,2,2,2,0,2,0,0,0,2,1,1,0,1,0,0,3,3,2,2,0,2,1,1,1,1,0,3,1,1,1,2,1,1,0,2,2,1,0,2,0,1,1,0,0,2,3,1,1,4,1,2,2,1,0,2,1,0,3,1,0,0,0,0,0,0,0,1,1,0,0,0,4,0,1,2,0,1,0,0,1,2,2,0,0,0,0,0,0,2,0,1,1,2,0,0,2,1,0,0,1,0,1,1,1,1,1,0,0,0,0,1,3,1,3,1,1,0,1,1,1,0,1,1,1,0,0,2,3,0,0,1,2,1,1,1,2,1,2,3,0,0,2,0,0,1,2,0,0,1,0,0,0,3,1,0,1,1,0,1,2,1,1,1,0,0,1,3,1,0,0,2,4,2,0,0,3,1,1,3,0,3,3,1,2,0,1,0,1,2,1,3,1,2,2,0,0,0,0,0,1,0,2,2,0,2,0,2,0,0,0,1,0,1,2,3,0,1,0,0,0,0,1,0,0,0,2,1,0,0,3,1,0,0,2,2,0,1,1,2,1,1,1,0,0,0,0,2,3,0,0,0,0,0,1,1,3,0,0,0,1,0,0,0,1,2,1,0,4,2,2,3,1,1,1,1,1,0,0,0,1,0,0,0,0,1,1,0,1,0,0,0,2,1,0,1,3,1,1,0]}]},"null_count":0,"last_update_version":397952029736042496},"pt":{"histogram":{"ndv":2,"buckets":[{"count":1026,"lower_bound":"YW5kcm9pZA==","upper_bound":"YW5kcm9pZA==","repeats":1026},{"count":2000,"lower_bound":"aW9z","upper_bound":"aW9z","repeats":974}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952028624027648},"t":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MTQ3Nzk3NjAxMw==","upper_bound":"MTQ3Nzk4NDkyOA==","repeats":1},{"count":16,"lower_bound":"MTQ3Nzk4OTcyNQ==","upper_bound":"MTQ3Nzk5ODc2OQ==","repeats":1},{"count":24,"lower_bound":"MTQ3ODAwMjYwNA==","upper_bound":"MTQ3ODAxMzM4Mw==","repeats":1},{"count":32,"lower_bound":"MTQ3ODAxNTEwNQ==","upper_bound":"MTQ3ODAyOTI4NQ==","repeats":1},{"count":40,"lower_bound":"MTQ3ODAzMDI4Mg==","upper_bound":"MTQ3ODAzMjAwOQ==","repeats":1},{"count":48,"lower_bound":"MTQ3ODAzMzQxOA==","upper_bound":"MTQ3ODA0MDc0Nw==","repeats":1},{"count":56,"lower_bound":"MTQ3ODA0MTQ1OQ==","upper_bound":"MTQ3ODA0NTIxMw==","repeats":1},{"count":64,"lower_bound":"MTQ3ODA0NTU3Ng==","upper_bound":"MTQ3ODA2MDI3Nw==","repeats":1},{"count":72,"lower_bound":"MTQ3ODA2NDg0Mg==","upper_bound":"MTQ3ODA3NDc1MA==","repeats":1},{"count":80,"lower_bound":"MTQ3ODA3NDg4MQ==","upper_bound":"MTQ3ODA3OTYxOQ==","repeats":1},{"count":88,"lower_bound":"MTQ3ODA4MjAzOA==","upper_bound":"MTQ3ODA4Nzc2OA==","repeats":1},{"count":96,"lower_bound":"MTQ3ODA4ODk2MQ==","upper_bound":"MTQ3ODA5Mjg2Mw==","repeats":1},{"count":104,"lower_bound":"MTQ3ODA5NzM5OQ==","upper_bound":"MTQ3ODEwMjA5MQ==","repeats":1},{"count":112,"lower_bound":"MTQ3ODEwMjU1Ng==","upper_bound":"MTQ3ODEwNzgyMw==","repeats":1},{"count":120,"lower_bound":"MTQ3ODEwOTYwMQ==","upper_bound":"MTQ3ODExNDUwMA==","repeats":1},{"count":128,"lower_bound":"MTQ3ODExNDc4OQ==","upper_bound":"MTQ3ODExOTk2MA==","repeats":1},{"count":136,"lower_bound":"MTQ3ODEyMjI5MQ==","upper_bound":"MTQ3ODEyMzk3Nw==","repeats":1},{"count":144,"lower_bound":"MTQ3ODEyNDM2OQ==","upper_bound":"MTQ3ODEzMDg0NQ==","repeats":1},{"count":152,"lower_bound":"MTQ3ODEzNDA4Ng==","upper_bound":"MTQ3ODEzNDc0Ng==","repeats":1},{"count":160,"lower_bound":"MTQ3ODEzNDkzNA==","upper_bound":"MTQ3ODEzOTQ2OQ==","repeats":1},{"count":168,"lower_bound":"MTQ3ODE0MDUzNg==","upper_bound":"MTQ3ODE0OTQ3Mw==","repeats":1},{"count":176,"lower_bound":"MTQ3ODE0OTYwNg==","upper_bound":"MTQ3ODE1MTcxMA==","repeats":1},{"count":184,"lower_bound":"MTQ3ODE1MzAxMA==","upper_bound":"MTQ3ODE2MDI4MQ==","repeats":1},{"count":192,"lower_bound":"MTQ3ODE2MTcyMg==","upper_bound":"MTQ3ODE3MjEwNQ==","repeats":1},{"count":200,"lower_bound":"MTQ3ODE3NTYwMg==","upper_bound":"MTQ3ODE3OTQyNg==","repeats":1},{"count":208,"lower_bound":"MTQ3ODE4MTE4Nw==","upper_bound":"MTQ3ODE5Mjg2NA==","repeats":1},{"count":216,"lower_bound":"MTQ3ODE5MzkwNA==","upper_bound":"MTQ3ODIwMzAyOA==","repeats":1},{"count":224,"lower_bound":"MTQ3ODIwOTc1NQ==","upper_bound":"MTQ3ODIxNzc1OA==","repeats":1},{"count":232,"lower_bound":"MTQ3ODIyNDM1Mw==","upper_bound":"MTQ3ODIzODYzNg==","repeats":1},{"count":240,"lower_bound":"MTQ3ODIzOTkwMw==","upper_bound":"MTQ3ODI0Mzc0Mw==","repeats":1},{"count":248,"lower_bound":"MTQ3ODI0OTE5NQ==","upper_bound":"MTQ3ODI1NzYyMw==","repeats":1},{"count":256,"lower_bound":"MTQ3ODI2MTU5MQ==","upper_bound":"MTQ3ODI2OTc2Ng==","repeats":1},{"count":264,"lower_bound":"MTQ3ODI2OTgyNg==","upper_bound":"MTQ3ODI3MjMzMA==","repeats":1},{"count":272,"lower_bound":"MTQ3ODI4MzQzNg==","upper_bound":"MTQ3ODI5NzkxOA==","repeats":1},{"count":280,"lower_bound":"MTQ3ODI5OTY0OA==","upper_bound":"MTQ3ODMwMjQzNQ==","repeats":1},{"count":288,"lower_bound":"MTQ3ODMwMzkwOA==","upper_bound":"MTQ3ODMxMzc4MA==","repeats":1},{"count":296,"lower_bound":"MTQ3ODMxNDQ4MA==","upper_bound":"MTQ3ODMxNzA1OQ==","repeats":1},{"count":304,"lower_bound":"MTQ3ODMxOTY4Mw==","upper_bound":"MTQ3ODMyOTQ5Mw==","repeats":1},{"count":312,"lower_bound":"MTQ3ODMzMTE2NQ==","upper_bound":"MTQ3ODMzMjEzNQ==","repeats":1},{"count":320,"lower_bound":"MTQ3ODMzMjk4Ng==","upper_bound":"MTQ3ODMzNDYyMQ==","repeats":1},{"count":328,"lower_bound":"MTQ3ODMzNjE5Ng==","upper_bound":"MTQ3ODM0MTkyMw==","repeats":1},{"count":336,"lower_bound":"MTQ3ODM0Mjc5NA==","upper_bound":"MTQ3ODM0NTI5OQ==","repeats":1},{"count":344,"lower_bound":"MTQ3ODM1MjQxNg==","upper_bound":"MTQ3ODM2MzMzMQ==","repeats":1},{"count":352,"lower_bound":"MTQ3ODM2MzczNw==","upper_bound":"MTQ3ODM3MDkwNQ==","repeats":1},{"count":360,"lower_bound":"MTQ3ODM3MDk4Mg==","upper_bound":"MTQ3ODM3NDU0NA==","repeats":1},{"count":368,"lower_bound":"MTQ3ODM3NjAyMw==","upper_bound":"MTQ3ODM4MTgxNg==","repeats":1},{"count":376,"lower_bound":"MTQ3ODM4MjEyMg==","upper_bound":"MTQ3ODM4NzY4Nw==","repeats":1},{"count":384,"lower_bound":"MTQ3ODM5MDU0MQ==","upper_bound":"MTQ3ODM5NzcwMw==","repeats":1},{"count":392,"lower_bound":"MTQ3ODQwMDA1Ng==","upper_bound":"MTQ3ODQwODAwNg==","repeats":1},{"count":400,"lower_bound":"MTQ3ODQwODAxOA==","upper_bound":"MTQ3ODQxMDY4OQ==","repeats":1},{"count":408,"lower_bound":"MTQ3ODQxMTk1NA==","upper_bound":"MTQ3ODQxNDY4Ng==","repeats":1},{"count":416,"lower_bound":"MTQ3ODQxODY2MA==","upper_bound":"MTQ3ODQzMzEyMA==","repeats":1},{"count":424,"lower_bound":"MTQ3ODQzODg1Mg==","upper_bound":"MTQ3ODQ0MTQ5Mw==","repeats":1},{"count":432,"lower_bound":"MTQ3ODQ0MzMyNg==","upper_bound":"MTQ3ODQ0ODM3NA==","repeats":1},{"count":440,"lower_bound":"MTQ3ODQ1MTIzMQ==","upper_bound":"MTQ3ODQ1NzkwNw==","repeats":1},{"count":448,"lower_bound":"MTQ3ODQ1NzkzNA==","upper_bound":"MTQ3ODQ2NDM3OQ==","repeats":1},{"count":456,"lower_bound":"MTQ3ODQ2NTU0Mw==","upper_bound":"MTQ3ODQ3MTQ5OQ==","repeats":1},{"count":464,"lower_bound":"MTQ3ODQ3NDAxNQ==","upper_bound":"MTQ3ODQ4ODU4NA==","repeats":1},{"count":472,"lower_bound":"MTQ3ODQ4OTk1OQ==","upper_bound":"MTQ3ODQ5NDc1OA==","repeats":1},{"count":480,"lower_bound":"MTQ3ODUwNTI1OA==","upper_bound":"MTQ3ODUxODU2Mg==","repeats":1},{"count":488,"lower_bound":"MTQ3ODUyMTIxMw==","upper_bound":"MTQ3ODUyODQyNQ==","repeats":1},{"count":496,"lower_bound":"MTQ3ODUzMDk0MA==","upper_bound":"MTQ3ODUzNDUzNg==","repeats":1},{"count":504,"lower_bound":"MTQ3ODUzNTE4MA==","upper_bound":"MTQ3ODUzODA2MA==","repeats":1},{"count":512,"lower_bound":"MTQ3ODU0MDgzOA==","upper_bound":"MTQ3ODU0MzU1OA==","repeats":1},{"count":520,"lower_bound":"MTQ3ODU0Nzc1OQ==","upper_bound":"MTQ3ODU1NzA5NA==","repeats":1},{"count":528,"lower_bound":"MTQ3ODU1NzIxNw==","upper_bound":"MTQ3ODU2NTMyMg==","repeats":1},{"count":536,"lower_bound":"MTQ3ODU2NjE0NA==","upper_bound":"MTQ3ODU3NDE3OA==","repeats":1},{"count":544,"lower_bound":"MTQ3ODU3NDMyNA==","upper_bound":"MTQ3ODU4MTg5NQ==","repeats":1},{"count":552,"lower_bound":"MTQ3ODU4MjE2Ng==","upper_bound":"MTQ3ODU4OTQ0NQ==","repeats":1},{"count":560,"lower_bound":"MTQ3ODU4OTk5NQ==","upper_bound":"MTQ3ODU5MzU2Mw==","repeats":1},{"count":568,"lower_bound":"MTQ3ODU5NDEyMA==","upper_bound":"MTQ3ODU5ODgyMw==","repeats":1},{"count":576,"lower_bound":"MTQ3ODYwMDU4NA==","upper_bound":"MTQ3ODYwMzMxOA==","repeats":1},{"count":584,"lower_bound":"MTQ3ODYwMzU4NA==","upper_bound":"MTQ3ODYwNTM5MA==","repeats":1},{"count":592,"lower_bound":"MTQ3ODYwNzI0Ng==","upper_bound":"MTQ3ODYwOTYxNw==","repeats":1},{"count":600,"lower_bound":"MTQ3ODYxMDYxMw==","upper_bound":"MTQ3ODYxMzkxNg==","repeats":1},{"count":608,"lower_bound":"MTQ3ODYxNjQxMQ==","upper_bound":"MTQ3ODYyMzkzMQ==","repeats":1},{"count":616,"lower_bound":"MTQ3ODYyNDA3Nw==","upper_bound":"MTQ3ODYyNzk5OA==","repeats":1},{"count":624,"lower_bound":"MTQ3ODYzMTA5Mw==","upper_bound":"MTQ3ODYzNDUzMA==","repeats":1},{"count":632,"lower_bound":"MTQ3ODYzNDk3NQ==","upper_bound":"MTQ3ODYzNzgyMg==","repeats":1},{"count":640,"lower_bound":"MTQ3ODYzODcyNw==","upper_bound":"MTQ3ODY0NDQ4MQ==","repeats":1},{"count":648,"lower_bound":"MTQ3ODY0NTIxNA==","upper_bound":"MTQ3ODY0Njg5MA==","repeats":1},{"count":656,"lower_bound":"MTQ3ODY0NzI3Nw==","upper_bound":"MTQ3ODY1OTkyMA==","repeats":1},{"count":664,"lower_bound":"MTQ3ODY2MTc0MA==","upper_bound":"MTQ3ODY2NDE4NA==","repeats":1},{"count":672,"lower_bound":"MTQ3ODY2NjM5OA==","upper_bound":"MTQ3ODY3MTE0Mw==","repeats":1},{"count":680,"lower_bound":"MTQ3ODY3MTUzOA==","upper_bound":"MTQ3ODY3NDM5Mg==","repeats":1},{"count":688,"lower_bound":"MTQ3ODY3NTY5OQ==","upper_bound":"MTQ3ODY4Nzk2Ng==","repeats":1},{"count":696,"lower_bound":"MTQ3ODY4ODgyNw==","upper_bound":"MTQ3ODY5NTg3OA==","repeats":1},{"count":704,"lower_bound":"MTQ3ODY5ODU5Mw==","upper_bound":"MTQ3ODcwNzA4Mg==","repeats":1},{"count":712,"lower_bound":"MTQ3ODcwODA0OQ==","upper_bound":"MTQ3ODcxMjAxMQ==","repeats":1},{"count":720,"lower_bound":"MTQ3ODcxMzM1NQ==","upper_bound":"MTQ3ODcxODE1Ng==","repeats":1},{"count":728,"lower_bound":"MTQ3ODcxODY0Mw==","upper_bound":"MTQ3ODcyMDU4Mw==","repeats":1},{"count":736,"lower_bound":"MTQ3ODcyMTU5Ng==","upper_bound":"MTQ3ODcyNzc2MA==","repeats":1},{"count":744,"lower_bound":"MTQ3ODczMTI4NA==","upper_bound":"MTQ3ODczNDY0Mg==","repeats":1},{"count":752,"lower_bound":"MTQ3ODczNzIzMA==","upper_bound":"MTQ3ODc0MTQ5OA==","repeats":1},{"count":760,"lower_bound":"MTQ3ODc0NDE2NA==","upper_bound":"MTQ3ODc0NzgwOA==","repeats":1},{"count":768,"lower_bound":"MTQ3ODc0NzkxNA==","upper_bound":"MTQ3ODc2NTA3OA==","repeats":1},{"count":776,"lower_bound":"MTQ3ODc2NTI3NA==","upper_bound":"MTQ3ODc3MDM3NQ==","repeats":1},{"count":784,"lower_bound":"MTQ3ODc3MzE4NQ==","upper_bound":"MTQ3ODc3OTc2MQ==","repeats":1},{"count":792,"lower_bound":"MTQ3ODc4MTg4MQ==","upper_bound":"MTQ3ODc4NTk2Mg==","repeats":1},{"count":800,"lower_bound":"MTQ3ODc5MTY5NA==","upper_bound":"MTQ3ODc5NjgzMg==","repeats":1},{"count":808,"lower_bound":"MTQ3ODc5OTE1NQ==","upper_bound":"MTQ3ODgwNzA0NA==","repeats":1},{"count":816,"lower_bound":"MTQ3ODgwNzk5NA==","upper_bound":"MTQ3ODgxNDA2OA==","repeats":1},{"count":824,"lower_bound":"MTQ3ODgxNDE1Ng==","upper_bound":"MTQ3ODgyNzI3MA==","repeats":1},{"count":832,"lower_bound":"MTQ3ODgyNzY2Mw==","upper_bound":"MTQ3ODgzODgzMQ==","repeats":1},{"count":840,"lower_bound":"MTQ3ODgzOTAxMQ==","upper_bound":"MTQ3ODg0MzAwNA==","repeats":1},{"count":848,"lower_bound":"MTQ3ODg0NjIzNQ==","upper_bound":"MTQ3ODg1MTM2Ng==","repeats":1},{"count":856,"lower_bound":"MTQ3ODg1MzI4MQ==","upper_bound":"MTQ3ODg1NDc1Nw==","repeats":1},{"count":864,"lower_bound":"MTQ3ODg2MTA2Mg==","upper_bound":"MTQ3ODg2OTIyMw==","repeats":1},{"count":872,"lower_bound":"MTQ3ODg3MTUxMQ==","upper_bound":"MTQ3ODg3NDkzNg==","repeats":1},{"count":880,"lower_bound":"MTQ3ODg3NjA3Mg==","upper_bound":"MTQ3ODg3ODM4Mw==","repeats":1},{"count":888,"lower_bound":"MTQ3ODg4MTc0Mg==","upper_bound":"MTQ3ODg4NzgwMg==","repeats":1},{"count":896,"lower_bound":"MTQ3ODg4Nzk0NA==","upper_bound":"MTQ3ODg5MTg1MQ==","repeats":1},{"count":904,"lower_bound":"MTQ3ODg5Mjc4Nw==","upper_bound":"MTQ3ODg5Nzg5Nw==","repeats":1},{"count":912,"lower_bound":"MTQ3ODg5ODk2Ng==","upper_bound":"MTQ3ODg5OTc2MQ==","repeats":1},{"count":920,"lower_bound":"MTQ3ODg5OTkwMw==","upper_bound":"MTQ3ODkwNzY2OQ==","repeats":1},{"count":928,"lower_bound":"MTQ3ODkxMjgzNQ==","upper_bound":"MTQ3ODkxOTUzOQ==","repeats":1},{"count":936,"lower_bound":"MTQ3ODkxOTkxNQ==","upper_bound":"MTQ3ODkyNzAyMQ==","repeats":1},{"count":944,"lower_bound":"MTQ3ODkzNTk2MQ==","upper_bound":"MTQ3ODk0MTQyMg==","repeats":1},{"count":952,"lower_bound":"MTQ3ODk0MzQ2Ng==","upper_bound":"MTQ3ODk0NTA1OA==","repeats":1},{"count":960,"lower_bound":"MTQ3ODk0NTk5Nw==","upper_bound":"MTQ3ODk1MTc3Ng==","repeats":1},{"count":968,"lower_bound":"MTQ3ODk1MjA0NQ==","upper_bound":"MTQ3ODk2MTY5MQ==","repeats":1},{"count":976,"lower_bound":"MTQ3ODk2MzQ3Nw==","upper_bound":"MTQ3ODk3MDMzNg==","repeats":1},{"count":984,"lower_bound":"MTQ3ODk3MzY4OA==","upper_bound":"MTQ3ODk4MDk5MQ==","repeats":1},{"count":992,"lower_bound":"MTQ3ODk4NjI3Mg==","upper_bound":"MTQ3OTAwMTIyOQ==","repeats":1},{"count":1000,"lower_bound":"MTQ3OTAwMjU5MQ==","upper_bound":"MTQ3OTAwOTQyNw==","repeats":1},{"count":1008,"lower_bound":"MTQ3OTAxMDQxOA==","upper_bound":"MTQ3OTAxMTcxOA==","repeats":1},{"count":1016,"lower_bound":"MTQ3OTAxMjg5Mw==","upper_bound":"MTQ3OTAyMTg1Mg==","repeats":1},{"count":1024,"lower_bound":"MTQ3OTAyMjg1NQ==","upper_bound":"MTQ3OTAyNTg3MA==","repeats":1},{"count":1032,"lower_bound":"MTQ3OTAyOTcyOQ==","upper_bound":"MTQ3OTA0OTk1OA==","repeats":1},{"count":1040,"lower_bound":"MTQ3OTA1MTE4Mw==","upper_bound":"MTQ3OTA1NDkyNw==","repeats":1},{"count":1048,"lower_bound":"MTQ3OTA1NzkyNw==","upper_bound":"MTQ3OTA2NzM0OA==","repeats":1},{"count":1056,"lower_bound":"MTQ3OTA3MDY0Mg==","upper_bound":"MTQ3OTA3MzcyOA==","repeats":1},{"count":1064,"lower_bound":"MTQ3OTA4MDczOA==","upper_bound":"MTQ3OTA4Njk5Ng==","repeats":1},{"count":1072,"lower_bound":"MTQ3OTA4Nzg5Nw==","upper_bound":"MTQ3OTA5NTQ4NQ==","repeats":1},{"count":1080,"lower_bound":"MTQ3OTA5OTQxOQ==","upper_bound":"MTQ3OTEwMzEzMw==","repeats":1},{"count":1088,"lower_bound":"MTQ3OTEwNzg1Ng==","upper_bound":"MTQ3OTExMDU3NA==","repeats":1},{"count":1096,"lower_bound":"MTQ3OTExMjU2NQ==","upper_bound":"MTQ3OTExODA2MQ==","repeats":1},{"count":1104,"lower_bound":"MTQ3OTEyMjgzMA==","upper_bound":"MTQ3OTEyOTY3Mg==","repeats":1},{"count":1112,"lower_bound":"MTQ3OTEzMDgzOQ==","upper_bound":"MTQ3OTE0MDE0Ng==","repeats":1},{"count":1120,"lower_bound":"MTQ3OTE0MTExMA==","upper_bound":"MTQ3OTE1MzM5Ng==","repeats":1},{"count":1128,"lower_bound":"MTQ3OTE1NTA1NQ==","upper_bound":"MTQ3OTE1OTg5Mw==","repeats":1},{"count":1136,"lower_bound":"MTQ3OTE2NjE3OA==","upper_bound":"MTQ3OTE2OTE2NQ==","repeats":1},{"count":1144,"lower_bound":"MTQ3OTE2OTUyNg==","upper_bound":"MTQ3OTE3MzYwMA==","repeats":1},{"count":1152,"lower_bound":"MTQ3OTE3Mzg3Mw==","upper_bound":"MTQ3OTE3NTA3Mg==","repeats":1},{"count":1160,"lower_bound":"MTQ3OTE3NTI5Nw==","upper_bound":"MTQ3OTE4MDcyMQ==","repeats":1},{"count":1168,"lower_bound":"MTQ3OTE4MTMxOQ==","upper_bound":"MTQ3OTE5Mjc2NA==","repeats":1},{"count":1176,"lower_bound":"MTQ3OTE5MzI2NA==","upper_bound":"MTQ3OTIwMjI4Mg==","repeats":1},{"count":1184,"lower_bound":"MTQ3OTIwNTA4Mg==","upper_bound":"MTQ3OTIxOTE0Nw==","repeats":1},{"count":1192,"lower_bound":"MTQ3OTIyMDIxMg==","upper_bound":"MTQ3OTIyMjM2Mw==","repeats":1},{"count":1200,"lower_bound":"MTQ3OTIyMjM4OQ==","upper_bound":"MTQ3OTIyODgwOA==","repeats":1},{"count":1208,"lower_bound":"MTQ3OTIyODg5OQ==","upper_bound":"MTQ3OTIzNTI0Mw==","repeats":1},{"count":1216,"lower_bound":"MTQ3OTIzOTIxNg==","upper_bound":"MTQ3OTI0Mzc3OQ==","repeats":1},{"count":1224,"lower_bound":"MTQ3OTI0NTQ3MA==","upper_bound":"MTQ3OTI1MzQ5OA==","repeats":1},{"count":1232,"lower_bound":"MTQ3OTI1NDEyNg==","upper_bound":"MTQ3OTI2MjE3Mw==","repeats":1},{"count":1240,"lower_bound":"MTQ3OTI2MzgyMw==","upper_bound":"MTQ3OTI2NjMxNg==","repeats":1},{"count":1248,"lower_bound":"MTQ3OTI3NTgxMA==","upper_bound":"MTQ3OTI4MDExMA==","repeats":1},{"count":1256,"lower_bound":"MTQ3OTI4MDgyMw==","upper_bound":"MTQ3OTI4OTEzMQ==","repeats":1},{"count":1264,"lower_bound":"MTQ3OTI4OTk5OQ==","upper_bound":"MTQ3OTI5NTc2Ng==","repeats":1},{"count":1272,"lower_bound":"MTQ3OTMwODM0OQ==","upper_bound":"MTQ3OTMxMTI0Ng==","repeats":1},{"count":1280,"lower_bound":"MTQ3OTMxNDA0OQ==","upper_bound":"MTQ3OTMxODIyMw==","repeats":1},{"count":1288,"lower_bound":"MTQ3OTMxOTU5MA==","upper_bound":"MTQ3OTMyNDI0Mg==","repeats":1},{"count":1296,"lower_bound":"MTQ3OTMyNDY2OA==","upper_bound":"MTQ3OTMyNzM1Ng==","repeats":1},{"count":1304,"lower_bound":"MTQ3OTMyODEyMg==","upper_bound":"MTQ3OTMzMTU1Mw==","repeats":1},{"count":1312,"lower_bound":"MTQ3OTMzMTY3Nw==","upper_bound":"MTQ3OTMzNzUyMQ==","repeats":1},{"count":1320,"lower_bound":"MTQ3OTMzNzY1Ng==","upper_bound":"MTQ3OTM0MDYzMQ==","repeats":1},{"count":1328,"lower_bound":"MTQ3OTM0MDc1OA==","upper_bound":"MTQ3OTM0OTA1Mg==","repeats":1},{"count":1336,"lower_bound":"MTQ3OTM1MjU3MA==","upper_bound":"MTQ3OTM1OTYxOQ==","repeats":1},{"count":1344,"lower_bound":"MTQ3OTM2NTA5MA==","upper_bound":"MTQ3OTM3NDQ5OA==","repeats":1},{"count":1352,"lower_bound":"MTQ3OTM3NDg3OQ==","upper_bound":"MTQ3OTM3NzEwMA==","repeats":1},{"count":1360,"lower_bound":"MTQ3OTM3OTY3NQ==","upper_bound":"MTQ3OTM4NTMzOQ==","repeats":1},{"count":1368,"lower_bound":"MTQ3OTM4NjUyNw==","upper_bound":"MTQ3OTM5NTE2NA==","repeats":1},{"count":1376,"lower_bound":"MTQ3OTM5NTc2OQ==","upper_bound":"MTQ3OTQwMDQ5Mg==","repeats":1},{"count":1384,"lower_bound":"MTQ3OTQwMjg5Mg==","upper_bound":"MTQ3OTQxMDExMw==","repeats":1},{"count":1392,"lower_bound":"MTQ3OTQxMDI0Mw==","upper_bound":"MTQ3OTQxNDIwMQ==","repeats":1},{"count":1400,"lower_bound":"MTQ3OTQxNzk3OA==","upper_bound":"MTQ3OTQyNDY2Mw==","repeats":1},{"count":1408,"lower_bound":"MTQ3OTQyNjc5MA==","upper_bound":"MTQ3OTQyOTI4Ng==","repeats":1},{"count":1416,"lower_bound":"MTQ3OTQzMTk4Mw==","upper_bound":"MTQ3OTQzODc0OQ==","repeats":1},{"count":1424,"lower_bound":"MTQ3OTQzOTU0Ng==","upper_bound":"MTQ3OTQ1NDc2NQ==","repeats":1},{"count":1432,"lower_bound":"MTQ3OTQ1NTE5Ng==","upper_bound":"MTQ3OTQ2MDE2OQ==","repeats":1},{"count":1440,"lower_bound":"MTQ3OTQ2MDg0NA==","upper_bound":"MTQ3OTQ2MzkyOQ==","repeats":1},{"count":1448,"lower_bound":"MTQ3OTQ2NDM0MQ==","upper_bound":"MTQ3OTQ2OTcwNg==","repeats":1},{"count":1456,"lower_bound":"MTQ3OTQ3MTQ4OA==","upper_bound":"MTQ3OTQ3MzA2MQ==","repeats":1},{"count":1464,"lower_bound":"MTQ3OTQ3NDA2OA==","upper_bound":"MTQ3OTQ4NDI4OA==","repeats":1},{"count":1472,"lower_bound":"MTQ3OTQ4NTM4Ng==","upper_bound":"MTQ3OTQ5NDU5NQ==","repeats":1},{"count":1480,"lower_bound":"MTQ3OTQ5NjYwOA==","upper_bound":"MTQ3OTUwNjQwMQ==","repeats":1},{"count":1488,"lower_bound":"MTQ3OTUwODA1MQ==","upper_bound":"MTQ3OTUxMDQyMg==","repeats":1},{"count":1496,"lower_bound":"MTQ3OTUxMDkyMA==","upper_bound":"MTQ3OTUyMTAwOQ==","repeats":1},{"count":1504,"lower_bound":"MTQ3OTUyOTA5OA==","upper_bound":"MTQ3OTUzMDg3Mw==","repeats":1},{"count":1512,"lower_bound":"MTQ3OTUzMTg3OA==","upper_bound":"MTQ3OTUzOTI2Nw==","repeats":1},{"count":1520,"lower_bound":"MTQ3OTUzOTkyMw==","upper_bound":"MTQ3OTU0NzE5Ng==","repeats":1},{"count":1528,"lower_bound":"MTQ3OTU0OTI0NQ==","upper_bound":"MTQ3OTU1NDkxMw==","repeats":1},{"count":1536,"lower_bound":"MTQ3OTU1NjUyMw==","upper_bound":"MTQ3OTU2MTQwMA==","repeats":1},{"count":1544,"lower_bound":"MTQ3OTU2MjU0MA==","upper_bound":"MTQ3OTU2NjU2NQ==","repeats":1},{"count":1552,"lower_bound":"MTQ3OTU2Njc3MA==","upper_bound":"MTQ3OTU3NDkyMQ==","repeats":1},{"count":1560,"lower_bound":"MTQ3OTU3Njg0NA==","upper_bound":"MTQ3OTU4NzYyMw==","repeats":1},{"count":1568,"lower_bound":"MTQ3OTU4NzY2MQ==","upper_bound":"MTQ3OTU5NjQ2NA==","repeats":1},{"count":1576,"lower_bound":"MTQ3OTU5NjcwMw==","upper_bound":"MTQ3OTU5ODc1MA==","repeats":1},{"count":1584,"lower_bound":"MTQ3OTU5OTg1Mw==","upper_bound":"MTQ3OTYwOTAwNg==","repeats":1},{"count":1592,"lower_bound":"MTQ3OTYwOTc5Ng==","upper_bound":"MTQ3OTYxNjc5Ng==","repeats":1},{"count":1600,"lower_bound":"MTQ3OTYxNjgzNw==","upper_bound":"MTQ3OTYyNzYxOA==","repeats":1},{"count":1608,"lower_bound":"MTQ3OTYzMDA2Ng==","upper_bound":"MTQ3OTYzMjkwMQ==","repeats":1},{"count":1616,"lower_bound":"MTQ3OTYzMzUzMg==","upper_bound":"MTQ3OTYzODA3Mg==","repeats":1},{"count":1624,"lower_bound":"MTQ3OTY0MTI2NA==","upper_bound":"MTQ3OTY1Mzc5Mg==","repeats":1},{"count":1632,"lower_bound":"MTQ3OTY2MDg1Mg==","upper_bound":"MTQ3OTY2NDA0MQ==","repeats":1},{"count":1640,"lower_bound":"MTQ3OTY2NDQ1Mg==","upper_bound":"MTQ3OTY2ODE0OA==","repeats":1},{"count":1648,"lower_bound":"MTQ3OTY2OTE5NQ==","upper_bound":"MTQ3OTY3MTA3OA==","repeats":1},{"count":1656,"lower_bound":"MTQ3OTY3Mjg1Ng==","upper_bound":"MTQ3OTY3ODk1Mw==","repeats":1},{"count":1664,"lower_bound":"MTQ3OTY3OTk0OQ==","upper_bound":"MTQ3OTY4NDA5Mw==","repeats":1},{"count":1672,"lower_bound":"MTQ3OTY4NDE5OA==","upper_bound":"MTQ3OTY5MjMzNQ==","repeats":1},{"count":1680,"lower_bound":"MTQ3OTY5Mjk3Mw==","upper_bound":"MTQ3OTY5ODIwNQ==","repeats":1},{"count":1688,"lower_bound":"MTQ3OTY5OTA1Mw==","upper_bound":"MTQ3OTcwODM5OQ==","repeats":1},{"count":1696,"lower_bound":"MTQ3OTcwODY3Nw==","upper_bound":"MTQ3OTcxMTMxNg==","repeats":1},{"count":1704,"lower_bound":"MTQ3OTcxMTY5Mw==","upper_bound":"MTQ3OTcxMjY3NA==","repeats":1},{"count":1712,"lower_bound":"MTQ3OTcxMjczMw==","upper_bound":"MTQ3OTcxNzU2Nw==","repeats":1},{"count":1720,"lower_bound":"MTQ3OTcxODMyMA==","upper_bound":"MTQ3OTcxOTQyOQ==","repeats":1},{"count":1728,"lower_bound":"MTQ3OTcyMDM1MQ==","upper_bound":"MTQ3OTcyMzI5Mg==","repeats":1},{"count":1736,"lower_bound":"MTQ3OTcyNDI2Ng==","upper_bound":"MTQ3OTcyODQ3Nw==","repeats":1},{"count":1744,"lower_bound":"MTQ3OTcyOTI2Nw==","upper_bound":"MTQ3OTc0NTczMg==","repeats":1},{"count":1752,"lower_bound":"MTQ3OTc1Mzc0OQ==","upper_bound":"MTQ3OTc1OTYwOQ==","repeats":1},{"count":1760,"lower_bound":"MTQ3OTc2MDE0NA==","upper_bound":"MTQ3OTc2MjM5MQ==","repeats":1},{"count":1768,"lower_bound":"MTQ3OTc2NzIwNQ==","upper_bound":"MTQ3OTc2ODUzOA==","repeats":1},{"count":1776,"lower_bound":"MTQ3OTc3MDU5Ng==","upper_bound":"MTQ3OTc3NjUyMA==","repeats":1},{"count":1784,"lower_bound":"MTQ3OTc3OTMwMA==","upper_bound":"MTQ3OTc4NjcxNA==","repeats":1},{"count":1792,"lower_bound":"MTQ3OTc4Njc2Mg==","upper_bound":"MTQ3OTc5MTU1OQ==","repeats":1},{"count":1800,"lower_bound":"MTQ3OTc5Mzc0OA==","upper_bound":"MTQ3OTgwMjcyMg==","repeats":1},{"count":1808,"lower_bound":"MTQ3OTgwNTk3NA==","upper_bound":"MTQ3OTgxMTQ4NQ==","repeats":1},{"count":1816,"lower_bound":"MTQ3OTgxMjA3NA==","upper_bound":"MTQ3OTgxNjU2Mg==","repeats":1},{"count":1824,"lower_bound":"MTQ3OTgyMDE0NA==","upper_bound":"MTQ3OTgzMDM5NA==","repeats":1},{"count":1832,"lower_bound":"MTQ3OTgzNDkzNw==","upper_bound":"MTQ3OTg0MTAyNg==","repeats":1},{"count":1840,"lower_bound":"MTQ3OTg0Mjk3Mw==","upper_bound":"MTQ3OTg0ODYyMg==","repeats":1},{"count":1848,"lower_bound":"MTQ3OTg0ODk0MA==","upper_bound":"MTQ3OTg1MjM2MA==","repeats":1},{"count":1856,"lower_bound":"MTQ3OTg1MzgwMw==","upper_bound":"MTQ3OTg2MDkwNg==","repeats":1},{"count":1864,"lower_bound":"MTQ3OTg2OTQzOQ==","upper_bound":"MTQ3OTg3NTMxOQ==","repeats":1},{"count":1872,"lower_bound":"MTQ3OTg3NzMzNg==","upper_bound":"MTQ3OTg3OTg4OA==","repeats":1},{"count":1880,"lower_bound":"MTQ3OTg4MDAxMA==","upper_bound":"MTQ3OTg4NTI0NA==","repeats":1},{"count":1888,"lower_bound":"MTQ3OTg4OTY4Ng==","upper_bound":"MTQ3OTg5OTU3Ng==","repeats":1},{"count":1896,"lower_bound":"MTQ3OTkwMDA1NA==","upper_bound":"MTQ3OTkwODYyMw==","repeats":1},{"count":1904,"lower_bound":"MTQ3OTkxMDgwMw==","upper_bound":"MTQ3OTkxODA1Ng==","repeats":1},{"count":1912,"lower_bound":"MTQ3OTkxODUxOA==","upper_bound":"MTQ3OTkyNTQzMQ==","repeats":1},{"count":1920,"lower_bound":"MTQ3OTkyNzQ2OA==","upper_bound":"MTQ3OTkzMTg0MQ==","repeats":1},{"count":1928,"lower_bound":"MTQ3OTkzNDI1OQ==","upper_bound":"MTQ3OTk0MDI5Nw==","repeats":1},{"count":1936,"lower_bound":"MTQ3OTk0MDU1OA==","upper_bound":"MTQ3OTk0NjUwOQ==","repeats":1},{"count":1944,"lower_bound":"MTQ3OTk1MDMxNQ==","upper_bound":"MTQ3OTk1MjY4NA==","repeats":1},{"count":1952,"lower_bound":"MTQ3OTk1NTM0Mw==","upper_bound":"MTQ3OTk1ODI1Mw==","repeats":1},{"count":1960,"lower_bound":"MTQ3OTk2MDkzNA==","upper_bound":"MTQ3OTk3MDI4NQ==","repeats":1},{"count":1968,"lower_bound":"MTQ3OTk3MTA2Mw==","upper_bound":"MTQ3OTk3MjM4Ng==","repeats":1},{"count":1976,"lower_bound":"MTQ3OTk3MzQ0Mg==","upper_bound":"MTQ3OTk3NTAxMw==","repeats":1},{"count":1984,"lower_bound":"MTQ3OTk3ODQ4NA==","upper_bound":"MTQ3OTk4MDYwNA==","repeats":1},{"count":1992,"lower_bound":"MTQ3OTk4MTg5NQ==","upper_bound":"MTQ3OTk5MTMwNw==","repeats":1},{"count":2000,"lower_bound":"MTQ3OTk5NjAxOQ==","upper_bound":"MTQ3OTk5ODY2OQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,1,2,1,2,2,1,0,1,0,1,2,1,0,0,1,0,0,1,2,0,0,0,0,2,1,3,2,0,1,0,0,1,2,2,1,2,2,1,1,2,3,2,2,0,0,0,0,0,0,0,0,0,2,0,1,4,1,1,0,0,0,2,0,3,0,0,3,0,1,1,2,1,0,1,1,0,2,2,0,0,0,1,2,2,0,0,3,3,1,0,2,0,1,3,0,2,2,1,1,0,1,2,2,0,1,1,1,1,0,1,1,1,1,2,3,0,0,2,0,0,2,3,1,0,0,0,0,0,1,0,1,1,0,1,0,0,2,1,1,1,3,2,0,2,0,1,1,1,0,0,1,0,0,2,0,1,2,0,2,2,1,0,1,0,0,3,0,2,0,0,0,0,2,1,1,1,1,1,1,1,0,0,2,3,0,1,2,0,1,0,2,0,1,0,0,1,2,0,1,0,2,0,1,3,1,1,2,1,1,2,0,0,0,2,1,1,1,0,2,2,2,1,0,1,1,2,1,1,0,0,1,2,3,0,1,1,0,2,2,1,0,1,2,1,1,1,0,0,1,3,0,0,2,2,0,0,2,1,0,0,1,2,1,1,3,1,2,1,1,1,2,0,2,0,3,0,4,0,3,0,0,4,3,2,1,0,0,2,1,2,2,0,2,0,1,1,0,2,2,2,0,1,1,0,2,1,2,3,4,1,1,1,1,1,1,2,0,0,0,0,1,1,2,2,2,1,1,0,0,2,2,1,1,0,4,1,0,0,0,1,1,1,0,0,3,1,1,3,0,2,3,4,0,1,0,1,3,3,0,0,1,3,1,2,2,0,1,3,0,3,1,0,1,0,3,2,1,1,4,0,3,2,1,0,1,0,0,1,1,0,2,2,0,0,3,1,1,1,1,0,2,2,0,1,3,1,1,2,4,0,2,0,1,2,1,1,1,0,1,0,2,0,1,0,0,1,0,2,1,2,1,1,1,0,1,2,3,0,1,0,1,0,2,1,1,1,3,2,1,1,3,1,1,4,1,0,0,0,1,1,1,0,1,2,0,1,1,4,0,2,2,1,0,1,0,1,1,0,1,1,1,0,1,2,0,2,0,0,0,3,0,0,1,0,0,0,0,0,1,1,1,2,6,0,2,2,0,0,3,1,1,0,2,2,2,0,1,2,0,1,0,0,2,4,0,2,1,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,2,2,2,0,0,0,2,3,1,1,0,1,0,0,0,0,1,2,1,2,0,0,1,0,0,1,2,1,1,1,3,1,1,1,2,3,4,0,1,0,1,0,2,0,0,0,1,0,0,2,1,1,0,1,0,1,1,0,1,0,0,0,0,0,0,0,1,1,0,0,2,0,0,3,1,3,3,1,1,0,1,1,1,1,0,0,0,2,2,0,2,1,1,0,2,0,1,0,0,0,0,2,0,0,2,0,2,4,2,3,0,1,1,3,0,1,0,3,1,2,2,1,1,0,0,1,1,1,1,0,2,1,0,2,4,1,2,2,4,1,0,1,1,2,1,1,0,1,0,1,0,0,0,0,1,2,0,3,0,2,2,1,2,1,0,0,1,2,0,1,1,0,1,1,0,1,1,2,2,0,1,2,1,1,3,0,0,0,0,1,2,0,0,2,1,2,2,2,3,1,1,1,0,1,0,0,0,1,1,0,2,1,0,0,1,1,2,0,0,1,1,0,2,3,0,1,0,1,0,3,1,1,0,0,0,0,0,1,0,0,0,0,0,1,1,3,0,0,1,2,0,2,1,0,1,0,1,2,1,0,0,1,0,0,1,0,2,3,1,2,0,3,3,5,1,1,0,0,0,0,0,0,1,3,3,1,1,1,1,2,1,0,1,2,1,1,2,0,4,0,1,3,0,3,0,1,2,1,2,1,1,0,2,3,1,2,0,2,0,0,1,0,0,2,0,1,1,1,1,0,1,1,0,2,2,2,1,0,0,2,0,0,0,2,2,0,2,0,1,4,1,2,2,2,0,1,0,0,1,0,1,0,2,3,2,1,2,4,2,1,1,1,0,3,0,1,1,0,1,1,0,1,3,0,1,1,1,0,2,1,2,1,0,0,1,2,3,0,0,1,1,1,0,1,0,1,2,0,0,2,2,1,1,1,0,2,2,1,1,0,0,0,0,0,2,0,0,0,3,0,2,0,0,1,0,2,1,1,3,1,3,1,1,1,0,1,1,1,2,0,0,1,2,0,1,0,0,1,1,1,0,1,0,0,2,0,1,1,0,1,1,1,1,2,1,0,0,0,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,1,2,2,1,1,0,1,1,0,0,2,0,1,1,1,2,2,1,1,3,2,1,0,2,0,2,0,0,1,2,1,2,1,1,1,2,1,1,1,1,1,0,3,1,3,0,1,2,1,2,0,0,2,0,1,0,0,0,1,1,0,0,2,0,1,2,0,2,0,1,0,2,3,0,1,0,3,1,0,1,1,0,0,1,5,0,1,2,1,2,0,2,1,1,0,2,1,0,0,0,0,0,2,2,1,1,2,0,0,1,2,0,3,2,0,1,0,0,3,1,2,1,0,0,2,1,1,2,1,1,1,1,0,0,1,1,1,1,4,1,2,0,3,2,1,1,1,0,1,4,1,0,1,0,2,2,0,1,0,0,1,1,1,1,2,2,3,0,0,1,1,0,0,2,0,0,3,2,1,1,1,1,0,1,2,1,1,3,1,0,0,3,0,0,0,1,0,0,1,1,2,0,1,2,0,2,1,1,3,0,0,1,0,2,3,0,1,1,1,3,0,2,0,3,0,1,1,1,0,2,0,0,2,0,1,0,1,0,1,0,1,1,0,3,0,0,1,1,0,0,2,1,1,0,2,1,0,0,0,1,0,2,3,0,4,2,0,2,0,0,0,0,1,0,0,4,1,0,2,0,1,1,0,0,1,1,0,1,2,0,0,1,0,3,1,0,2,2,2,1,3,1,0,0,0,0,0,0,2,1,3,0,1,0,0,1,2,0,2,1,1,2,0,1,2,0,0,2,0,1,2,1,1,0,0,0,1,0,3,2,1,2,2,1,1,0,1,2,0,2,1,1,1,0,0,0,2,1,0,0,2,0,0,1,0,2,1,0,0,2,0,1,1,1,1,0,1,0,2,0,0,0,1,0,1,1,1,0,1,2,0,0,2,2,1,1,2,0,3,0,4,1,1,2,1,0,3,0,0,0,1,3,3,1,1,1,1,1,4,1,1,1,2,0,0,2,1,0,0,0,0,0,2,0,1,1,2,0,1,2,2,0,0,0,2,0,1,0,1,3,1,1,1,0,0,2,0,1,0,2,1,1,0,1,2,1,1,0,3,0,0,3,0,0,1,2,1,0,3,2,0,2,2,2,1,1,0,0,0,0,0,0,0,0,1,2,0,1,0,0,3,2,0,1,1,1,0,1,1,3,1,1,3,2,0,1,2,0,1,2,0,1,1,0,3,0,1,4,3,1,0,0,1,0,1,2,0,1,0,1,0,0,2,0,2,1,0,0,1,1,2,1,0,1,1,2,1,1,0,0,0,2,3,0,0,0,1,0,2,1,1,1,2,2,1,1,1,1,0,1,0,0,1,0,1,0,1,1,2,1,0,0,0,2,1,3,0,0,4,1,1,2,3,0,1,0,2,3,0,2,0,0,0,0,2,1,2,2,0,0,0,1,1,1,1,2,1,0,0,0,1,1,0,1,1,0,3,2,0,0,0,2,1,0,2,0,1,2,0,2,0,2,2,3,1,1,0,1,0,0,2,1,1,0,0,2,0,2,1,0,0,1,1,2,1,2,1,2,2,1,1,1,1,0,0,0,1,1,2,1,0,0,1,0,1,0,1,1,1,2,0,1,1,2,1,1,0,0,2,1,0,2,1,0,2,0,1,0,1,2,0,0,0,2,0,3,2,0,3,2,0,0,1,1,2,0,0,1,1,2,0,0,2,1,0,0,1,0,1,1,1,2,0,1,0,1,1,1,2,0,0,0,1,2,0,1,2,3,0,0,0,3,2,0,1,0,1,0,1,2,2,1,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,4,0,2,1,4,0,2,2,3,1,0,4,2,2,1,2,1,0,3,0,1,2,1,1,3,1,1,1,1,1,0,0,0,0,3,3,2,1,1,1,1,1,0,1,0,0,1,0,1,2,2,0,0,0,0,0,1,0,0,0,1,2,2,0,0,0,2,0,1,0,1,3,2,1,0,1,0,0,0,0,2,0,1,0,1,1,1,0,0,0,0,0,0,2,0,2,1,1,0,0,1,0,2,0,2,0,0,0,1,1,2,3,1,0,1,0,0,1,1,0,3,1,1,0,2,2,3,0,1,2,2,1,1,0,0,0,1,0,1,2,3,1,1,0,1,1,1,3,3,1,2,3,2,1,0,1,2,0,1,0,0,0,1,0,1,2,1,0,0,1,0,0,0,1,0,3,0,0,1,1,0,1,2,0,0,0,0,0,1,0,2,1,2,0,0,1,2,2,0,3,2,1]},{"counters":[0,4,0,0,3,1,0,2,0,1,1,1,1,2,1,1,2,3,2,1,1,0,0,2,1,1,0,1,0,1,1,0,0,3,1,1,2,1,0,0,1,1,1,1,2,3,0,1,0,1,1,1,0,1,1,3,0,1,0,1,3,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,1,1,0,0,2,2,0,1,1,2,0,0,0,0,2,0,0,3,1,0,1,0,3,0,0,2,1,1,0,1,3,3,2,3,0,2,1,1,1,0,0,3,1,0,1,0,1,2,1,2,2,1,0,1,0,1,2,0,3,1,1,5,0,3,0,0,0,2,0,1,2,1,1,0,0,3,1,1,0,1,3,1,1,0,2,2,0,1,1,2,1,1,1,0,2,0,1,0,2,1,0,1,1,1,1,1,0,1,1,0,1,0,1,0,1,1,1,1,0,2,3,2,2,3,1,3,0,0,2,2,2,1,0,0,3,1,1,1,1,2,0,1,1,1,0,1,0,0,1,0,2,0,4,0,1,2,1,0,2,2,1,0,1,3,2,0,1,2,2,4,0,0,1,0,2,1,1,2,0,0,4,0,0,0,1,0,0,1,1,1,1,0,1,1,0,2,2,1,1,1,0,0,1,0,0,0,0,1,1,0,2,1,1,0,2,1,1,1,1,3,1,1,0,1,0,1,1,1,2,2,0,0,1,1,0,2,2,4,0,0,1,1,1,2,1,1,3,2,1,0,0,2,0,0,1,1,1,0,0,0,0,1,2,1,1,0,1,3,2,1,3,0,0,2,1,1,2,1,0,0,0,1,0,0,3,0,1,3,2,1,1,2,1,0,1,0,0,0,0,1,1,0,2,1,0,0,0,2,3,0,2,1,2,0,1,0,0,1,1,1,0,1,2,3,1,3,1,2,0,0,1,0,0,1,1,2,2,1,2,2,1,2,1,1,1,0,1,1,1,1,0,1,0,0,3,1,2,2,2,0,4,0,3,2,2,0,1,0,2,1,3,0,0,1,0,1,1,0,2,0,1,0,0,0,1,0,0,0,0,1,4,1,3,0,1,3,1,1,1,1,3,1,0,0,0,0,1,2,3,1,3,1,1,2,2,2,2,1,0,2,1,0,1,1,0,1,0,1,0,0,2,2,0,0,1,1,0,0,0,0,1,3,0,3,1,1,0,0,2,0,1,0,0,2,2,0,2,2,2,0,0,1,1,2,1,2,0,4,0,1,1,0,1,2,0,0,0,3,1,1,2,0,2,0,1,1,0,2,2,0,2,1,0,1,1,3,2,0,0,1,0,0,0,1,3,0,1,0,1,2,3,0,0,0,2,2,1,1,2,1,1,3,1,1,1,3,1,1,0,1,0,1,1,0,2,1,0,2,3,0,0,2,0,1,1,0,0,0,1,0,1,1,1,2,2,0,0,1,3,2,2,1,0,0,3,1,1,0,0,0,1,0,1,3,2,0,0,0,0,1,2,0,2,0,1,1,0,1,0,0,2,1,0,1,0,2,0,2,1,0,0,0,1,1,1,0,0,0,3,2,3,0,1,2,1,0,1,0,2,2,1,2,0,1,0,1,1,0,2,1,3,2,0,3,2,0,1,0,1,2,0,0,1,1,0,1,0,1,1,1,0,0,1,0,3,0,0,0,0,0,3,0,0,1,1,0,0,1,2,1,0,0,1,0,0,1,1,1,2,0,0,1,0,1,0,1,0,1,0,0,0,4,3,2,2,4,0,0,1,0,2,0,0,1,0,2,0,0,0,1,0,2,2,1,1,1,0,0,0,0,0,0,0,0,1,2,0,0,0,0,1,1,0,0,1,0,3,1,1,2,2,0,2,2,1,1,0,1,1,0,0,1,1,1,0,1,0,1,2,3,1,4,2,1,3,0,1,3,0,0,1,1,4,2,1,0,1,3,5,1,0,0,1,0,0,1,0,0,0,3,3,1,1,0,1,0,0,0,2,1,1,1,0,0,2,2,2,2,1,0,1,1,1,2,1,2,2,2,1,1,1,1,1,0,2,2,0,1,0,0,2,2,2,2,1,1,0,1,1,0,0,2,2,1,2,1,0,0,2,0,0,0,1,0,0,0,2,2,1,2,0,0,1,1,0,1,1,2,0,1,1,1,2,2,1,3,0,0,1,1,0,1,2,2,0,0,2,0,1,1,0,4,3,1,3,3,2,1,0,1,1,1,2,2,3,0,2,2,1,1,0,0,1,0,0,0,1,0,1,2,0,1,5,1,0,1,0,2,1,1,0,2,1,1,1,1,0,1,3,3,0,1,0,0,1,0,1,2,2,1,0,0,1,2,1,0,1,2,2,2,1,1,1,3,1,2,2,0,0,1,3,1,0,0,2,0,0,0,1,1,2,0,0,0,0,2,1,1,0,1,1,0,1,0,0,0,3,1,5,1,2,1,0,1,1,0,0,0,1,2,0,0,1,2,2,0,0,1,0,1,1,0,0,1,0,0,1,1,2,2,0,2,0,1,2,1,1,0,1,2,0,0,0,1,1,1,0,2,0,0,0,1,3,0,1,2,0,0,1,0,2,1,1,1,2,0,1,0,1,2,0,2,1,2,0,0,1,0,4,0,3,1,2,1,3,0,1,0,2,0,0,0,1,1,1,1,1,0,2,1,0,0,2,2,0,1,0,1,0,2,1,0,1,0,0,1,1,2,1,1,2,3,3,1,3,0,0,0,1,1,0,1,0,1,1,0,2,0,2,1,2,0,1,0,1,2,0,0,0,2,1,3,1,2,2,0,0,0,0,2,0,1,3,1,0,0,3,2,0,3,1,0,2,0,0,0,0,1,1,3,2,0,0,2,1,1,0,0,1,1,1,1,3,0,1,1,1,2,0,0,1,0,1,0,0,1,1,1,3,2,0,0,0,1,0,1,1,2,1,2,1,0,2,1,1,0,0,0,1,0,1,1,1,0,1,1,2,1,1,0,1,0,1,1,0,1,2,1,0,0,1,1,2,1,0,1,0,0,1,0,4,1,0,0,0,1,0,0,0,1,1,2,2,1,0,2,0,0,1,1,0,0,0,1,0,1,2,2,1,1,0,3,2,1,7,0,1,0,1,0,1,1,0,1,0,1,1,4,2,2,3,1,1,0,0,0,2,0,4,2,1,0,0,1,0,0,0,1,2,0,0,1,1,1,1,0,0,2,0,2,0,1,1,1,0,0,0,1,1,0,2,1,2,3,1,1,1,0,0,1,1,1,1,1,1,0,1,0,0,3,1,0,0,0,0,1,1,1,0,1,3,1,0,2,0,2,0,2,0,2,0,1,0,2,2,0,1,0,2,0,1,2,2,1,1,1,1,2,1,1,0,0,1,0,1,1,2,0,0,0,2,0,0,2,1,0,2,0,2,2,3,1,2,1,0,0,2,1,2,2,1,1,1,2,1,1,1,1,1,2,1,2,1,3,0,2,1,0,2,1,0,1,2,0,0,0,0,4,0,0,1,1,0,2,1,1,1,1,0,0,0,0,2,0,1,2,1,0,1,1,3,4,1,0,1,0,1,0,1,0,1,2,1,0,1,0,0,0,2,2,3,2,1,0,1,0,1,1,0,2,2,0,0,1,2,2,0,2,1,1,2,1,0,2,3,2,2,3,1,1,2,3,0,1,0,1,1,1,1,0,3,1,2,2,0,0,0,0,0,1,0,0,0,1,0,5,1,0,0,0,0,2,0,2,1,0,1,0,0,2,0,1,3,1,0,0,2,1,3,1,0,0,1,0,1,1,0,2,0,1,4,1,1,2,0,0,2,0,2,0,2,2,1,1,1,0,3,0,0,1,1,2,0,2,0,0,0,0,1,0,0,3,0,0,2,3,1,2,2,1,3,1,2,1,0,1,4,0,0,2,1,1,1,1,0,0,1,0,0,3,4,1,0,1,0,0,1,3,1,1,1,1,0,1,3,2,0,0,0,0,0,1,3,0,0,0,0,0,2,0,2,0,4,1,1,1,1,2,0,1,1,1,0,1,2,0,0,0,0,1,0,2,1,1,0,1,0,1,2,3,0,1,0,0,2,0,1,0,1,0,0,0,1,0,3,1,0,2,3,2,2,1,0,4,0,1,1,1,2,0,1,0,1,0,0,2,2,0,2,1,3,2,0,0,1,1,3,2,0,0,0,1,1,1,1,1,0,2,2,0,0,0,0,0,1,4,1,2,1,0,0,0,1,3,1,0,0,1,1,0,1,1,4,1,2,2,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,2,2,2,0,1,0,2,0,0,3,4,1,0,1,0,0,2,1,1,0,0,2,2,1,0,1,0,2,0,0,4,0,0,0,2,0,1,0,2,0,2,0,0,0,0,1,2,2,1,2,2,2,1,2,1,1,0,1,3,0,1,2,0,2,2,0,0,2,1,3,2,2,2,0,1,4,1,1,2,3,0,1,2,1,1,0,1,1,2,1,1,2,1,0,0,2,1,0,0,1,4,1,0,0,0,2,0,1,0,0,1,2,0,2,0,1,1,0,0,1,0,1,0,2,0,1,0,2,1,2,1,0,1,2,1,1,0,0,1,0,1,2,0,0,0,3,1,1,1,0,1]},{"counters":[1,2,2,0,0,0,2,1,0,2,1,1,2,3,0,0,2,1,3,3,0,0,1,0,1,0,1,2,1,0,0,1,0,0,0,4,0,1,0,2,0,1,0,1,3,1,2,0,1,0,1,4,2,1,3,0,2,0,0,2,1,0,0,2,0,1,5,1,3,1,2,3,0,1,1,0,0,0,2,0,0,1,0,0,2,0,1,0,2,3,0,1,1,0,0,1,0,1,0,1,2,3,0,0,2,1,0,2,0,0,1,2,0,0,1,1,0,2,3,2,3,3,1,2,3,0,2,0,0,0,3,0,0,0,1,0,1,2,0,1,2,3,1,1,0,0,0,1,2,2,1,3,0,0,2,1,0,2,1,1,0,0,0,1,1,0,1,5,2,0,2,2,2,0,0,0,0,2,0,0,0,2,2,1,3,0,1,1,3,0,0,0,2,0,0,2,2,0,1,0,3,4,1,2,1,2,3,0,2,2,0,1,0,0,0,2,0,0,2,1,1,0,2,0,1,0,2,0,1,1,1,1,0,1,2,4,1,1,1,1,2,1,3,2,1,0,0,1,2,2,0,0,1,0,2,1,0,2,2,1,0,0,1,2,0,1,1,0,1,0,1,0,1,0,4,0,1,2,2,2,2,1,3,1,0,2,2,0,1,2,1,1,0,0,0,0,1,0,2,1,3,0,0,1,0,0,2,0,0,2,1,1,2,3,1,0,0,0,0,2,2,1,1,0,0,2,0,5,1,1,0,0,0,0,0,1,1,1,0,0,2,2,0,0,1,0,2,0,1,1,1,0,0,2,0,0,0,1,1,2,1,3,0,1,0,1,0,0,1,2,1,0,0,0,1,2,0,1,1,0,2,4,1,3,0,2,1,2,2,0,1,0,1,1,1,0,5,0,0,0,1,5,0,0,0,0,0,1,1,2,2,3,0,1,0,3,3,0,1,1,1,1,1,1,2,2,0,1,0,1,1,2,1,0,0,1,0,1,3,0,0,1,1,1,1,0,1,0,3,0,0,2,0,4,3,2,3,0,1,0,0,1,0,1,4,0,2,0,1,1,3,1,0,1,0,1,1,3,0,0,1,4,0,0,0,0,1,2,0,3,1,1,2,1,2,1,1,0,1,2,2,1,0,1,2,1,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0,3,1,0,2,2,1,2,0,2,0,0,0,2,0,1,1,0,2,1,1,0,1,1,1,1,0,0,0,0,0,0,0,1,2,1,0,0,0,1,0,1,0,1,4,1,0,2,1,0,2,1,1,1,4,2,4,5,2,0,2,0,1,1,1,2,0,2,1,1,1,0,2,1,1,1,2,0,3,3,0,1,2,1,0,2,1,0,3,1,0,0,0,1,3,2,0,0,0,0,1,0,0,1,1,0,1,1,1,1,2,1,1,2,2,4,2,2,1,2,0,0,2,2,1,1,0,2,2,1,2,3,0,4,0,0,1,0,0,3,3,3,0,1,1,1,0,2,1,1,1,0,1,0,2,0,1,0,1,0,2,0,0,0,1,1,2,0,2,0,1,2,2,2,1,0,0,3,2,0,1,2,0,1,1,0,2,2,0,1,1,0,4,3,0,0,1,1,2,1,1,1,0,0,2,4,1,1,1,0,1,0,2,1,1,1,0,0,1,3,3,1,0,0,1,1,0,0,0,0,1,0,0,2,0,1,0,1,1,2,3,2,1,0,0,0,2,1,2,3,0,1,2,0,1,0,2,1,2,2,2,1,1,1,2,1,2,0,0,2,0,4,0,0,0,1,1,0,0,0,1,0,1,1,2,3,2,0,1,0,0,1,2,0,1,0,1,1,2,0,2,1,3,2,0,0,0,2,0,1,1,2,0,2,1,2,1,0,1,0,0,0,1,0,0,0,1,0,1,0,0,1,1,2,0,1,2,0,0,1,2,2,1,1,0,0,1,4,0,1,0,0,1,1,1,2,1,0,1,2,1,0,0,1,3,0,0,1,1,0,0,1,2,0,1,1,2,2,2,0,1,0,1,3,0,0,2,1,1,1,1,0,0,2,0,0,1,0,0,1,3,0,0,1,3,1,3,1,3,0,1,2,0,1,1,1,1,2,1,1,0,2,1,1,0,3,0,2,1,0,2,0,2,4,0,1,1,1,1,0,1,2,0,1,5,1,1,4,4,0,0,2,1,0,1,0,1,1,2,0,1,0,1,1,0,3,1,1,0,0,2,2,1,0,0,3,0,1,1,1,2,2,0,2,0,1,1,0,0,1,0,0,1,2,0,3,0,2,1,1,0,2,0,0,0,1,2,2,0,0,1,1,0,0,0,1,0,1,0,1,0,1,2,0,1,0,1,1,1,0,1,0,2,3,1,0,0,2,1,0,0,0,1,0,1,0,0,1,0,0,1,1,1,1,0,2,1,1,1,0,0,0,0,2,1,0,0,0,3,0,1,0,1,1,0,1,2,1,1,0,0,2,3,1,1,0,1,0,2,1,1,1,1,0,2,0,1,0,0,0,1,1,1,2,0,3,2,2,0,0,4,3,0,2,1,1,0,0,1,0,2,3,0,0,0,0,0,2,2,0,1,2,0,1,2,0,1,1,1,0,2,0,0,0,0,0,2,1,1,2,1,0,1,0,0,1,1,2,1,0,0,1,1,1,4,2,0,0,2,2,2,1,1,0,1,3,2,2,0,1,2,1,0,0,3,1,0,2,0,0,3,0,2,0,0,1,2,2,0,0,0,0,2,0,2,1,2,0,2,0,0,2,2,1,2,0,2,1,0,1,0,2,0,0,3,1,2,2,1,0,1,0,1,2,1,1,1,1,3,0,1,2,1,1,0,1,0,3,0,0,2,3,0,0,1,0,1,2,2,0,1,0,0,1,2,2,2,2,1,1,1,0,0,2,1,2,0,1,2,2,2,0,1,1,0,2,2,1,2,0,0,0,0,0,1,1,0,1,0,3,0,3,1,1,0,1,1,1,1,2,1,1,1,2,0,0,1,1,1,2,3,3,0,0,0,1,2,1,3,1,1,1,1,1,1,1,2,1,1,3,0,0,1,0,2,2,0,1,2,0,1,0,0,2,0,1,1,2,1,1,1,2,1,3,0,1,0,0,0,1,0,0,2,1,0,0,0,1,0,1,1,2,0,1,1,0,0,1,1,1,0,0,0,0,1,1,1,1,1,0,2,0,4,1,0,0,1,3,0,0,0,1,1,0,1,1,2,0,1,0,0,1,0,1,0,1,0,0,1,0,0,3,1,0,0,0,1,2,0,0,2,1,0,0,0,1,2,0,1,2,2,2,2,0,0,0,3,1,0,0,2,2,0,1,0,1,1,1,2,0,0,1,1,0,1,0,1,2,0,2,0,1,0,2,0,1,1,2,0,0,0,0,2,0,1,0,2,0,1,1,1,0,0,0,1,1,0,0,1,0,0,0,1,2,0,1,0,0,4,0,2,0,1,1,1,1,2,1,1,0,0,0,0,1,0,2,1,0,1,0,1,0,2,1,0,0,2,1,0,2,0,0,0,1,0,0,2,1,2,1,1,1,0,2,2,0,3,1,1,1,1,2,0,3,1,1,1,1,0,0,0,0,1,0,1,2,0,1,0,0,0,1,1,1,0,0,0,2,2,0,1,0,2,1,1,1,0,2,1,1,1,3,0,2,0,2,2,3,0,3,1,0,0,0,0,2,1,3,2,2,2,1,1,1,0,1,1,1,2,1,1,2,0,1,3,0,2,1,1,0,2,3,1,2,1,0,2,1,1,0,2,0,0,1,1,1,1,0,1,3,2,0,0,2,4,2,0,3,1,0,0,1,0,0,3,2,0,1,0,0,1,1,0,0,3,0,1,1,0,0,2,1,3,0,0,1,0,1,0,1,2,4,0,0,0,3,0,1,2,0,0,0,1,2,0,1,1,0,0,1,0,1,2,2,2,1,1,0,2,0,0,0,1,3,0,1,2,0,3,1,1,1,0,0,1,0,1,1,3,2,0,1,0,0,1,0,0,0,0,1,0,0,2,1,3,1,2,2,3,0,0,1,1,1,1,0,1,1,1,0,3,0,2,2,0,1,0,1,0,0,0,1,1,0,2,1,2,1,0,1,0,1,1,0,0,0,0,2,1,0,1,2,1,1,1,0,1,1,1,1,0,3,2,0,0,0,0,1,0,2,3,1,3,1,1,0,0,2,1,3,1,1,3,1,0,0,1,3,2,2,3,0,1,1,1,1,0,1,2,1,2,0,0,0,1,1,0,1,1,0,1,0,2,0,2,3,1,0,2,1,3,1,1,1,1,3,4,0,2,0,1,0,0,0,1,3,3,1,1,2,1,1,1,0,2,1,0,3,0,2,1,3,0,2,0,0,1,1,0,0,1,0,0,2,2,0,1,0,3,3,0,2,2,0,0,1,2,1,1,2,3,2,1,0,0,0,1,1,0,0,0,1,2,1,1,1,1,0,0,0,1,0,0,0,1,0,2,0,0,1,2,0,1,1,1,3,0,0,1,2,1,3,0,0,0,3,2,0,1,1,1,1,2,1,0,1,0,1,1,0,2,1,1,2,1,1,1,1,1,0,0,2,5,1,0,1,0,1]},{"counters":[1,2,0,1,3,3,0,2,1,0,0,0,1,2,1,2,0,1,0,1,2,3,0,1,1,1,2,0,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,0,0,1,3,0,1,0,1,0,0,6,1,0,0,1,1,0,1,1,1,1,1,0,2,0,3,1,0,1,2,1,2,0,1,0,3,1,0,0,1,0,1,1,0,1,2,0,3,1,1,1,0,1,0,0,0,1,0,2,0,0,0,1,1,0,0,2,0,0,0,1,1,0,0,0,0,1,1,2,1,2,0,1,0,0,1,1,1,0,1,2,0,1,3,0,2,3,2,0,1,1,0,3,1,2,0,2,0,2,0,1,0,1,0,2,0,0,2,1,3,0,1,2,1,2,0,1,0,0,0,0,0,2,0,0,0,1,1,0,1,0,1,0,2,0,0,1,1,0,1,4,0,2,0,2,0,2,0,2,1,0,1,1,0,0,3,0,0,0,2,1,0,1,1,0,3,0,0,1,3,2,3,1,0,0,1,0,2,0,2,1,2,0,1,0,2,0,1,0,1,1,2,1,2,0,1,0,2,0,1,1,0,1,1,0,0,0,1,0,0,1,3,0,0,0,1,1,2,1,3,1,1,1,1,2,2,0,2,0,0,1,1,1,0,3,1,2,0,3,2,1,0,1,0,1,2,1,1,0,1,1,0,0,0,1,1,1,0,0,2,2,2,2,1,0,2,0,1,0,2,1,2,2,2,1,1,1,2,1,1,0,1,1,1,3,0,1,1,2,1,1,0,1,0,1,1,1,1,1,4,1,2,3,1,1,0,0,0,0,0,1,0,1,3,0,0,0,5,1,0,1,0,1,0,0,4,1,1,1,2,0,4,0,1,3,2,2,1,0,2,1,0,2,0,1,2,1,0,1,2,2,0,3,0,1,1,2,1,0,1,1,0,2,0,2,2,1,0,1,1,0,0,0,2,0,0,1,0,1,2,0,1,2,1,2,1,1,0,2,1,1,1,0,0,1,2,0,1,1,6,2,2,2,1,2,2,1,0,1,2,0,1,3,0,1,0,2,0,0,1,1,2,1,1,0,2,3,2,0,0,1,0,0,0,0,0,1,2,2,1,0,1,1,0,2,0,1,0,4,2,1,2,0,0,2,1,0,0,1,0,0,0,0,1,0,1,1,1,2,3,1,0,0,1,1,1,1,1,0,3,2,1,3,1,2,0,0,1,0,1,2,2,0,2,0,1,0,0,4,1,1,0,1,1,1,1,2,1,0,1,0,1,0,1,1,2,0,1,0,1,0,4,0,1,2,0,1,1,3,1,2,0,1,4,3,1,0,2,2,0,1,1,2,2,1,0,2,2,0,0,0,2,0,0,4,0,1,1,4,1,0,1,1,0,0,2,1,1,0,3,2,1,0,2,0,0,0,3,1,0,0,1,1,2,0,0,2,2,2,2,1,0,0,0,0,1,1,1,2,1,0,1,1,2,1,1,1,1,2,1,0,1,1,1,4,2,2,0,0,1,2,2,0,2,0,1,0,1,2,0,0,5,1,1,0,0,1,1,2,0,0,0,1,1,1,0,0,0,0,2,0,1,2,0,3,4,0,1,0,3,1,0,2,0,1,2,0,1,0,0,0,0,1,2,1,0,0,0,0,0,0,1,1,0,0,1,0,2,1,2,0,0,1,0,3,0,2,0,0,0,2,1,2,1,1,3,4,2,1,3,0,1,3,2,0,1,1,1,1,4,3,1,1,1,2,0,1,1,1,0,4,1,0,0,0,1,0,2,3,2,0,0,0,1,1,0,1,1,1,1,0,3,0,1,1,2,0,1,1,1,1,0,1,2,0,3,1,0,0,2,0,0,0,1,2,0,0,0,1,0,1,1,1,2,1,0,1,3,0,3,2,0,1,4,2,0,2,0,1,2,1,0,1,0,1,1,0,0,3,1,2,0,1,1,0,2,0,0,1,1,2,0,2,0,1,2,0,1,0,1,2,2,0,0,1,4,1,0,0,2,1,0,1,2,1,2,0,2,0,0,2,1,2,3,1,2,1,1,2,0,2,1,2,0,1,0,0,0,1,1,1,2,3,2,0,2,1,0,0,1,1,1,0,0,2,1,3,2,0,1,1,2,1,1,0,1,1,0,0,2,0,1,4,1,2,0,1,0,1,0,0,0,0,2,1,2,2,0,1,3,1,0,1,2,1,0,1,1,0,1,2,0,0,4,0,0,0,3,0,0,3,0,0,1,1,0,0,1,1,1,1,0,2,2,0,1,1,1,1,2,2,0,0,0,1,2,0,2,1,3,0,0,1,2,2,2,0,2,2,0,1,1,1,0,1,0,3,1,0,2,1,1,2,2,1,1,1,0,1,1,0,0,2,1,1,0,1,0,2,1,0,0,1,1,1,1,3,0,2,0,1,0,1,0,0,1,0,1,0,0,2,1,0,0,1,3,1,2,1,1,2,0,1,0,1,1,0,1,0,2,1,1,1,3,0,0,1,1,1,0,0,0,1,2,0,0,3,1,1,0,1,1,0,1,1,0,1,0,1,1,1,4,3,2,1,1,0,1,1,2,0,0,1,0,1,2,2,0,1,1,1,1,1,1,1,2,1,3,0,0,1,1,0,0,1,0,1,0,3,0,2,1,0,1,1,0,1,1,1,2,1,3,2,2,2,0,0,0,2,1,0,0,0,0,0,1,0,0,3,1,3,1,1,1,0,1,0,0,0,0,1,0,0,1,2,3,0,4,0,2,2,1,0,0,2,2,1,1,1,3,0,0,0,3,0,1,1,2,1,1,1,1,2,3,2,1,0,1,1,2,2,4,0,0,2,0,1,1,0,1,0,2,0,2,0,0,2,2,3,2,2,5,2,1,0,2,1,1,0,1,1,0,0,1,1,0,0,2,0,1,0,3,0,2,0,2,1,2,1,0,0,1,0,0,1,2,0,2,0,2,1,0,0,0,1,2,2,1,1,1,1,1,0,0,1,0,0,1,0,1,2,0,0,1,0,1,0,1,3,1,0,3,1,0,0,0,0,1,1,0,1,0,2,1,1,3,0,0,1,1,1,1,1,2,0,1,0,1,1,1,0,2,0,0,1,2,0,0,0,1,2,4,0,0,1,3,1,1,4,1,0,1,3,2,1,0,0,0,1,2,0,0,1,0,1,0,0,1,0,2,1,0,1,0,0,2,1,0,1,2,1,1,0,3,2,0,0,1,1,1,1,0,2,2,2,2,1,1,3,0,2,2,3,1,0,1,4,2,0,0,1,0,2,0,1,0,1,1,1,0,0,1,1,2,1,1,2,1,1,1,0,2,1,1,0,0,0,0,3,2,1,2,0,2,1,0,1,0,1,1,0,2,1,1,1,1,3,1,1,0,2,0,0,2,0,1,2,1,2,0,2,0,1,1,4,0,2,0,3,0,1,0,2,0,0,1,1,0,0,1,1,4,1,0,1,1,1,0,0,1,0,1,0,1,0,0,2,6,3,3,2,0,0,0,1,0,3,0,1,1,1,0,0,0,2,1,0,1,0,0,1,0,0,2,3,3,0,0,2,1,0,2,1,2,1,0,1,0,1,1,0,2,0,0,1,2,0,0,2,0,1,2,1,0,1,0,4,0,1,2,0,2,1,2,1,0,1,1,1,0,1,0,1,0,1,1,0,0,1,1,0,0,0,0,0,1,2,0,3,2,2,0,2,2,3,1,1,2,2,2,2,1,1,0,1,2,0,2,1,1,1,2,0,0,1,2,4,2,2,0,1,1,1,0,1,1,1,1,0,0,2,2,0,2,2,1,0,0,0,2,0,1,0,0,0,1,2,1,2,2,0,1,1,1,2,3,0,1,1,0,3,2,2,1,1,0,1,1,3,3,1,1,0,1,0,2,0,0,1,1,0,1,1,1,1,1,1,2,2,0,0,0,0,3,3,0,2,1,0,0,0,0,1,2,0,2,2,1,0,0,3,2,0,1,1,3,2,1,0,1,0,0,0,0,3,1,0,1,1,2,0,1,1,2,0,3,3,1,1,1,2,0,0,0,1,0,0,0,0,1,1,2,1,0,0,1,0,0,2,0,0,2,1,0,1,0,4,0,0,0,0,1,0,1,1,3,2,1,3,1,1,0,0,2,0,0,0,1,0,2,1,1,1,1,1,1,3,0,0,1,1,1,1,2,1,1,2,0,1,0,1,1,0,1,0,1,0,0,2,3,0,1,0,0,1,1,0,1,2,0,0,1,1,5,2,1,0,0,0,0,2,1,0,1,3,1,0,2,1,1,1,1,0,0,0,1,1,0,2,2,0,1,3,1,0,0,1,0,0,0,0,1,0,3,1,1,2,0,2,1,1,0,0,1,1,1,0,0,1,1,1,1,1,3,0,1,3,0,0,0,2,1,1,0,1,0,0,0,1,1,0,1,0,3,0,1,2,2,0,0,2,0,2,0,2,4,4,1,1,2,1,0,1,1,1,1,1,0,2,3,2,0,0,1,0,2,0,1,0,0,0,1,1,1,1,3,3,1,0,0,1,0,0,1,2,0,2,0,1,0,1,0,1,1,1,2,1,1,1,2,0,0,1,1,4,1,0,1,0,1,0,0,1,0,1]},{"counters":[3,3,2,0,0,0,2,2,3,1,1,1,4,0,3,0,1,0,2,2,0,1,1,3,1,0,0,0,1,0,0,0,0,1,0,1,1,1,1,1,1,1,0,2,2,1,1,2,1,0,0,0,1,0,1,1,2,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,1,2,1,0,2,0,2,1,0,2,0,1,2,0,0,2,1,0,0,1,0,0,1,0,2,1,0,2,1,3,0,0,1,2,1,0,1,2,1,0,0,4,0,0,0,2,0,1,2,3,1,0,1,2,0,0,1,1,2,2,1,0,1,2,0,0,0,0,1,1,2,2,1,1,1,1,1,0,1,0,0,0,0,1,2,0,0,0,2,0,1,0,2,1,0,2,1,1,1,1,0,0,1,1,0,0,1,0,0,2,0,0,0,1,2,0,0,1,1,0,2,1,2,0,1,1,0,0,1,0,1,2,1,0,0,1,3,0,1,1,0,0,0,1,2,0,0,1,0,2,2,0,1,1,3,0,1,0,1,1,2,0,0,0,0,1,0,1,2,1,0,0,0,1,1,0,0,0,1,2,0,0,0,0,2,1,0,0,0,1,0,2,2,0,2,2,3,0,2,2,2,2,2,3,3,0,1,1,0,0,3,3,0,1,0,0,1,2,1,1,1,1,1,0,3,2,1,2,1,0,0,0,0,1,0,2,0,0,3,0,1,0,0,2,0,2,1,1,0,1,0,1,2,1,1,3,1,1,2,0,0,2,0,3,3,1,3,0,2,2,2,0,2,0,1,2,0,1,1,1,0,0,2,2,0,0,3,2,0,0,0,0,0,0,1,2,0,1,3,0,1,2,3,0,2,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,1,2,1,0,1,4,3,0,2,1,0,1,0,0,0,4,1,0,2,0,2,0,2,2,1,2,2,1,0,0,2,0,0,0,0,1,2,2,2,1,0,0,0,1,2,0,0,0,3,2,1,1,1,0,0,0,1,2,0,0,0,0,0,2,2,0,0,1,1,1,2,2,1,1,1,2,2,1,0,1,3,0,0,0,1,1,0,1,1,1,0,1,0,1,1,1,2,1,1,2,1,0,1,1,1,0,0,3,0,1,3,3,1,2,0,0,0,2,2,0,0,1,1,0,0,2,2,1,4,1,0,1,2,1,0,0,1,1,0,2,1,0,0,0,2,1,1,3,4,0,0,0,1,1,1,0,1,0,1,1,0,4,0,1,1,0,0,2,2,0,4,1,1,2,1,0,1,0,0,3,0,0,0,1,2,2,2,3,0,1,0,0,1,0,0,0,0,3,0,1,1,0,1,1,0,0,0,0,1,1,2,1,0,3,0,1,1,2,0,1,0,1,0,1,0,0,1,1,0,0,3,1,0,1,1,1,2,1,1,1,1,0,0,2,1,0,2,0,1,2,4,1,4,1,1,1,0,1,1,0,1,1,0,0,1,0,3,2,1,2,1,1,2,1,0,0,1,1,1,0,1,0,0,0,0,2,1,0,0,1,1,0,1,0,0,1,2,1,1,2,2,2,1,1,0,1,2,0,2,2,0,2,1,1,1,1,1,2,0,2,2,0,1,0,2,2,0,2,0,0,1,1,2,2,0,0,0,0,1,2,0,0,3,1,0,1,0,1,0,1,1,0,1,0,0,0,0,0,1,0,0,1,1,2,1,2,1,1,1,0,1,0,0,3,1,0,0,1,1,0,1,3,0,1,2,1,1,2,3,1,2,0,0,0,1,1,1,0,1,0,3,0,4,1,0,0,1,2,0,1,0,0,1,1,0,3,1,0,1,0,0,1,0,0,0,2,3,0,1,2,1,2,1,0,1,1,0,0,0,1,1,0,1,1,0,0,1,0,2,1,0,1,2,0,1,0,1,2,5,1,1,0,2,0,2,1,2,1,2,0,0,2,0,0,1,1,1,3,2,1,0,3,1,2,1,1,1,2,1,2,4,0,1,0,3,1,2,3,0,0,2,1,0,1,3,1,0,1,0,1,0,0,2,0,0,0,1,2,0,0,1,2,1,1,2,0,1,1,1,0,1,1,2,0,1,1,0,0,1,1,1,1,0,0,2,0,0,2,0,3,1,2,3,1,0,2,0,1,1,0,0,1,1,0,1,2,1,1,0,0,0,2,2,0,0,2,2,0,2,0,0,0,2,2,0,1,0,0,0,1,0,1,3,2,0,0,0,0,0,2,0,0,2,0,2,1,0,3,0,0,0,1,0,1,0,3,1,2,2,1,0,3,0,2,1,1,0,2,0,0,1,0,0,2,1,4,1,1,1,2,1,1,1,2,0,0,0,0,2,1,0,1,3,0,2,0,1,0,1,0,0,1,2,0,1,0,1,3,3,0,1,1,0,1,0,1,1,1,1,0,0,0,2,0,1,0,0,0,1,1,2,3,0,1,1,2,1,1,0,1,2,0,1,0,2,0,3,1,0,0,2,0,0,1,0,0,2,1,0,2,0,0,1,0,1,0,1,0,2,1,0,1,0,4,1,2,3,1,2,0,1,3,1,0,2,1,2,1,1,2,1,3,1,2,2,0,1,0,0,0,0,1,2,2,1,1,1,1,0,0,1,3,1,1,1,2,0,3,1,0,0,2,2,2,3,0,3,2,1,1,2,2,3,1,1,1,2,3,1,0,0,0,0,2,1,0,0,1,1,2,1,1,0,4,2,1,3,1,1,0,1,3,1,0,2,0,0,2,1,0,0,0,2,0,1,2,1,1,0,3,2,1,0,1,3,1,0,1,2,1,1,1,0,1,1,2,0,1,1,1,0,2,0,0,3,0,2,0,0,0,2,0,3,0,1,1,1,1,1,2,3,1,1,1,2,0,2,1,1,4,1,2,3,3,3,1,0,0,0,3,1,0,2,0,0,1,2,0,1,1,0,2,2,2,2,0,3,1,0,3,0,0,1,1,1,0,2,0,1,1,1,0,1,0,2,2,0,2,0,1,0,2,0,1,1,0,1,1,2,1,0,2,1,3,1,1,3,0,0,3,1,2,2,2,1,4,0,1,3,1,1,1,1,3,0,1,1,2,3,1,0,0,2,0,1,1,0,1,0,1,2,2,0,0,0,1,0,1,0,0,1,0,2,1,0,2,2,1,0,0,1,1,0,1,1,0,3,0,1,2,1,1,2,1,3,0,2,0,0,1,2,0,1,1,2,0,0,0,0,1,0,2,0,1,4,1,1,2,0,2,2,2,0,2,1,1,1,1,1,1,0,2,1,1,0,2,1,0,1,1,1,3,4,0,2,1,1,1,0,0,0,2,2,0,2,1,2,0,1,0,4,0,0,1,0,1,0,1,0,2,1,2,0,1,1,1,1,2,0,0,1,1,1,2,1,1,0,0,2,0,3,5,1,1,0,1,3,2,0,0,2,1,1,0,2,1,1,1,2,0,1,0,0,3,1,1,0,2,2,1,2,2,2,0,1,1,0,4,1,1,2,0,5,3,3,0,1,0,1,1,0,0,1,2,0,2,1,1,0,2,0,1,2,2,2,0,3,1,1,2,0,1,0,0,0,0,1,1,0,1,0,1,1,3,0,3,1,0,1,1,0,1,1,0,1,1,1,2,0,0,2,0,0,0,2,0,1,1,2,4,1,1,1,2,1,0,0,2,1,0,0,2,1,2,0,1,1,0,0,3,1,2,1,2,1,1,1,2,2,1,0,2,2,0,0,0,1,2,1,0,2,0,0,0,1,2,1,1,2,1,2,1,1,0,1,0,2,0,3,1,2,1,1,1,1,0,2,1,0,1,3,0,0,1,1,0,1,0,1,2,0,0,2,1,1,3,1,2,0,2,0,0,0,0,0,2,0,2,1,0,1,0,0,0,2,0,1,1,1,1,4,1,0,1,2,2,0,1,1,3,2,0,0,0,2,4,1,0,1,1,1,0,1,0,0,3,1,0,1,1,3,1,0,0,1,0,1,1,1,1,1,1,1,0,0,2,1,0,0,0,0,0,0,2,3,0,0,2,1,1,0,1,0,1,3,1,1,0,2,3,2,0,0,1,0,2,1,1,1,3,1,1,1,1,1,0,1,0,0,2,1,0,0,1,1,1,1,3,1,3,0,0,1,0,2,1,1,0,0,2,0,2,0,1,0,0,1,1,1,2,1,2,0,1,1,1,2,2,0,1,0,0,0,1,1,2,1,0,0,0,1,0,0,1,1,1,1,2,1,3,1,1,0,1,2,1,1,1,0,0,3,1,0,1,1,0,2,1,1,0,3,2,1,1,1,0,1,1,0,0,0,1,1,0,1,1,1,0,1,1,1,0,0,1,0,0,1,1,3,0,2,1,1,1,1,1,0,1,0,2,0,1,0,1,1,2,0,0,2,2,1,0,1,1,1,2,1,2,0,1,1,3,2,1,0,0,3,1,2,2,1,2,0,0,0,1,1,2,0,1,1,1,0,2,2,1,1,0,0,1,0,2,3,3,0,0,0,0,1,1,4,1,0,1,1,1,1,1,1,1,0,2,0,0,1,2,1,1,0,0,0,1,2,1,1,2,3,1,0,1,2,1,1,1,1,3,3,1,0,1,0,2,1,1,0,0]}]},"null_count":0,"last_update_version":397952028837675008}},"indices":{"aid":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+AEwAAAAAAAAAPg=","upper_bound":"ATE1AAAAAAAA+QExNQAAAAAAAPk=","repeats":1},{"count":16,"lower_bound":"ATE2AAAAAAAA+QExNgAAAAAAAPk=","upper_bound":"ATFEAAAAAAAA+QExRAAAAAAAAPk=","repeats":1},{"count":24,"lower_bound":"ATFFAAAAAAAA+QExRQAAAAAAAPk=","upper_bound":"ATFMAAAAAAAA+QExTAAAAAAAAPk=","repeats":1},{"count":32,"lower_bound":"ATFNAAAAAAAA+QExTQAAAAAAAPk=","upper_bound":"ATFUAAAAAAAA+QExVAAAAAAAAPk=","repeats":1},{"count":40,"lower_bound":"ATFVAAAAAAAA+QExVQAAAAAAAPk=","upper_bound":"ATFiAAAAAAAA+QExYgAAAAAAAPk=","repeats":1},{"count":48,"lower_bound":"ATFjAAAAAAAA+QExYwAAAAAAAPk=","upper_bound":"ATFqAAAAAAAA+QExagAAAAAAAPk=","repeats":1},{"count":56,"lower_bound":"ATFrAAAAAAAA+QExawAAAAAAAPk=","upper_bound":"ATFyAAAAAAAA+QExcgAAAAAAAPk=","repeats":1},{"count":64,"lower_bound":"ATFzAAAAAAAA+QE0TQAAAAAAAPk=","upper_bound":"ATF6AAAAAAAA+QExeQAAAAAAAPk=","repeats":1},{"count":72,"lower_bound":"ATIAAAAAAAAA+AEyAAAAAAAAAPg=","upper_bound":"ATI2AAAAAAAA+QEyNQAAAAAAAPk=","repeats":1},{"count":80,"lower_bound":"ATI3AAAAAAAA+QEyNgAAAAAAAPk=","upper_bound":"ATJFAAAAAAAA+QEyRAAAAAAAAPk=","repeats":1},{"count":88,"lower_bound":"ATJGAAAAAAAA+QEyRQAAAAAAAPk=","upper_bound":"ATJNAAAAAAAA+QEyTAAAAAAAAPk=","repeats":1},{"count":96,"lower_bound":"ATJOAAAAAAAA+QEyTQAAAAAAAPk=","upper_bound":"ATJVAAAAAAAA+QEyVAAAAAAAAPk=","repeats":1},{"count":104,"lower_bound":"ATJWAAAAAAAA+QE3SAAAAAAAAPk=","upper_bound":"ATJjAAAAAAAA+QEyYQAAAAAAAPk=","repeats":1},{"count":112,"lower_bound":"ATJkAAAAAAAA+QEyYgAAAAAAAPk=","upper_bound":"ATJrAAAAAAAA+QEyaAAAAAAAAPk=","repeats":1},{"count":120,"lower_bound":"ATJsAAAAAAAA+QEyaQAAAAAAAPk=","upper_bound":"ATJzAAAAAAAA+QEycAAAAAAAAPk=","repeats":1},{"count":128,"lower_bound":"ATJ0AAAAAAAA+QEycQAAAAAAAPk=","upper_bound":"ATMAAAAAAAAA+AEzAAAAAAAAAPg=","repeats":1},{"count":136,"lower_bound":"ATMwAAAAAAAA+QEyeAAAAAAAAPk=","upper_bound":"ATM3AAAAAAAA+QEzNAAAAAAAAPk=","repeats":1},{"count":144,"lower_bound":"ATM4AAAAAAAA+QEzNQAAAAAAAPk=","upper_bound":"ATNGAAAAAAAA+QEzQwAAAAAAAPk=","repeats":1},{"count":152,"lower_bound":"ATNHAAAAAAAA+QEzRAAAAAAAAPk=","upper_bound":"ATNOAAAAAAAA+QEzSwAAAAAAAPk=","repeats":1},{"count":160,"lower_bound":"ATNPAAAAAAAA+QEzTAAAAAAAAPk=","upper_bound":"ATNWAAAAAAAA+QEzUwAAAAAAAPk=","repeats":1},{"count":168,"lower_bound":"ATNXAAAAAAAA+QEzVAAAAAAAAPk=","upper_bound":"ATNkAAAAAAAA+QEzYQAAAAAAAPk=","repeats":1},{"count":176,"lower_bound":"ATNlAAAAAAAA+QEzYgAAAAAAAPk=","upper_bound":"ATNsAAAAAAAA+QEzaQAAAAAAAPk=","repeats":1},{"count":184,"lower_bound":"ATNtAAAAAAAA+QEzagAAAAAAAPk=","upper_bound":"ATN0AAAAAAAA+QEzcQAAAAAAAPk=","repeats":1},{"count":192,"lower_bound":"ATN1AAAAAAAA+QEzcgAAAAAAAPk=","upper_bound":"ATQwAAAAAAAA+QEzeAAAAAAAAPk=","repeats":1},{"count":200,"lower_bound":"ATQxAAAAAAAA+QEzeQAAAAAAAPk=","upper_bound":"ATQ4AAAAAAAA+QE0NQAAAAAAAPk=","repeats":1},{"count":208,"lower_bound":"ATQ5AAAAAAAA+QE0NgAAAAAAAPk=","upper_bound":"ATRHAAAAAAAA+QE0RAAAAAAAAPk=","repeats":1},{"count":216,"lower_bound":"ATRIAAAAAAAA+QE0RQAAAAAAAPk=","upper_bound":"ATRPAAAAAAAA+QE0TAAAAAAAAPk=","repeats":1},{"count":224,"lower_bound":"ATRQAAAAAAAA+QE0TgAAAAAAAPk=","upper_bound":"ATRXAAAAAAAA+QE0VQAAAAAAAPk=","repeats":1},{"count":232,"lower_bound":"ATRYAAAAAAAA+QE0VgAAAAAAAPk=","upper_bound":"ATRlAAAAAAAA+QE0YwAAAAAAAPk=","repeats":1},{"count":240,"lower_bound":"ATRmAAAAAAAA+QE0ZAAAAAAAAPk=","upper_bound":"ATRtAAAAAAAA+QE0awAAAAAAAPk=","repeats":1},{"count":248,"lower_bound":"ATRuAAAAAAAA+QE0bAAAAAAAAPk=","upper_bound":"ATR1AAAAAAAA+QE0cwAAAAAAAPk=","repeats":1},{"count":256,"lower_bound":"ATR2AAAAAAAA+QE0dAAAAAAAAPk=","upper_bound":"ATUxAAAAAAAA+QE0egAAAAAAAPk=","repeats":1},{"count":264,"lower_bound":"ATUyAAAAAAAA+QE1MAAAAAAAAPk=","upper_bound":"ATU5AAAAAAAA+QE1NwAAAAAAAPk=","repeats":1},{"count":272,"lower_bound":"ATVBAAAAAAAA+QE1OAAAAAAAAPk=","upper_bound":"ATVIAAAAAAAA+QE1RgAAAAAAAPk=","repeats":1},{"count":280,"lower_bound":"ATVJAAAAAAAA+QE1RwAAAAAAAPk=","upper_bound":"ATVQAAAAAAAA+QE1TgAAAAAAAPk=","repeats":1},{"count":288,"lower_bound":"ATVRAAAAAAAA+QE1TwAAAAAAAPk=","upper_bound":"ATVYAAAAAAAA+QE1VgAAAAAAAPk=","repeats":1},{"count":296,"lower_bound":"ATVZAAAAAAAA+QE1VwAAAAAAAPk=","upper_bound":"ATVmAAAAAAAA+QE1ZAAAAAAAAPk=","repeats":1},{"count":304,"lower_bound":"ATVnAAAAAAAA+QE1ZQAAAAAAAPk=","upper_bound":"ATVuAAAAAAAA+QE1bAAAAAAAAPk=","repeats":1},{"count":312,"lower_bound":"ATVvAAAAAAAA+QE1bQAAAAAAAPk=","upper_bound":"ATV2AAAAAAAA+QE1dAAAAAAAAPk=","repeats":1},{"count":320,"lower_bound":"ATV3AAAAAAAA+QE1dQAAAAAAAPk=","upper_bound":"ATYyAAAAAAAA+QE2MAAAAAAAAPk=","repeats":1},{"count":328,"lower_bound":"ATYzAAAAAAAA+QE2MQAAAAAAAPk=","upper_bound":"ATZBAAAAAAAA+QE2OAAAAAAAAPk=","repeats":1},{"count":336,"lower_bound":"ATZCAAAAAAAA+QE2OQAAAAAAAPk=","upper_bound":"ATZJAAAAAAAA+QE2RwAAAAAAAPk=","repeats":1},{"count":344,"lower_bound":"ATZKAAAAAAAA+QE2SAAAAAAAAPk=","upper_bound":"ATZRAAAAAAAA+QE2TwAAAAAAAPk=","repeats":1},{"count":352,"lower_bound":"ATZSAAAAAAAA+QE2UAAAAAAAAPk=","upper_bound":"ATZZAAAAAAAA+QE2VwAAAAAAAPk=","repeats":1},{"count":360,"lower_bound":"ATZaAAAAAAAA+QE2WAAAAAAAAPk=","upper_bound":"ATZnAAAAAAAA+QE2ZQAAAAAAAPk=","repeats":1},{"count":368,"lower_bound":"ATZoAAAAAAAA+QE2ZgAAAAAAAPk=","upper_bound":"ATZvAAAAAAAA+QE2bQAAAAAAAPk=","repeats":1},{"count":376,"lower_bound":"ATZwAAAAAAAA+QE2bgAAAAAAAPk=","upper_bound":"ATZ3AAAAAAAA+QE2dQAAAAAAAPk=","repeats":1},{"count":384,"lower_bound":"ATZ4AAAAAAAA+QE2dgAAAAAAAPk=","upper_bound":"ATczAAAAAAAA+QE3MQAAAAAAAPk=","repeats":1},{"count":392,"lower_bound":"ATc0AAAAAAAA+QE3MgAAAAAAAPk=","upper_bound":"ATdCAAAAAAAA+QE3OQAAAAAAAPk=","repeats":1},{"count":400,"lower_bound":"ATdDAAAAAAAA+QE3QQAAAAAAAPk=","upper_bound":"ATdKAAAAAAAA+QE3SQAAAAAAAPk=","repeats":1},{"count":408,"lower_bound":"ATdLAAAAAAAA+QE3SgAAAAAAAPk=","upper_bound":"ATdSAAAAAAAA+QE3UQAAAAAAAPk=","repeats":1},{"count":416,"lower_bound":"ATdTAAAAAAAA+QE3UgAAAAAAAPk=","upper_bound":"ATdaAAAAAAAA+QE3WQAAAAAAAPk=","repeats":1},{"count":424,"lower_bound":"ATdhAAAAAAAA+QE3WgAAAAAAAPk=","upper_bound":"ATdoAAAAAAAA+QE3ZwAAAAAAAPk=","repeats":1},{"count":432,"lower_bound":"ATdpAAAAAAAA+QE3aAAAAAAAAPk=","upper_bound":"ATdwAAAAAAAA+QE3cAAAAAAAAPk=","repeats":1},{"count":440,"lower_bound":"ATdxAAAAAAAA+QE3cQAAAAAAAPk=","upper_bound":"ATd4AAAAAAAA+QE3eAAAAAAAAPk=","repeats":1},{"count":448,"lower_bound":"ATd5AAAAAAAA+QE3eQAAAAAAAPk=","upper_bound":"ATg0AAAAAAAA+QE4NAAAAAAAAPk=","repeats":1},{"count":456,"lower_bound":"ATg1AAAAAAAA+QE4NQAAAAAAAPk=","upper_bound":"AThDAAAAAAAA+QE4QwAAAAAAAPk=","repeats":1},{"count":464,"lower_bound":"AThEAAAAAAAA+QE4RAAAAAAAAPk=","upper_bound":"AThLAAAAAAAA+QE4SwAAAAAAAPk=","repeats":1},{"count":472,"lower_bound":"AThMAAAAAAAA+QE4TAAAAAAAAPk=","upper_bound":"AThTAAAAAAAA+QE4UwAAAAAAAPk=","repeats":1},{"count":480,"lower_bound":"AThUAAAAAAAA+QE4VAAAAAAAAPk=","upper_bound":"AThhAAAAAAAA+QFCWQAAAAAAAPk=","repeats":1},{"count":488,"lower_bound":"AThiAAAAAAAA+QE4WgAAAAAAAPk=","upper_bound":"AThpAAAAAAAA+QE4ZwAAAAAAAPk=","repeats":1},{"count":496,"lower_bound":"AThqAAAAAAAA+QE4aAAAAAAAAPk=","upper_bound":"AThxAAAAAAAA+QE4bwAAAAAAAPk=","repeats":1},{"count":504,"lower_bound":"AThyAAAAAAAA+QE4cAAAAAAAAPk=","upper_bound":"ATh5AAAAAAAA+QE4dwAAAAAAAPk=","repeats":1},{"count":512,"lower_bound":"ATh6AAAAAAAA+QE4eAAAAAAAAPk=","upper_bound":"ATk1AAAAAAAA+QE5MwAAAAAAAPk=","repeats":1},{"count":520,"lower_bound":"ATk2AAAAAAAA+QE5NAAAAAAAAPk=","upper_bound":"ATlEAAAAAAAA+QE5QgAAAAAAAPk=","repeats":1},{"count":528,"lower_bound":"ATlFAAAAAAAA+QE5QwAAAAAAAPk=","upper_bound":"ATlMAAAAAAAA+QE5SgAAAAAAAPk=","repeats":1},{"count":536,"lower_bound":"ATlNAAAAAAAA+QE5SwAAAAAAAPk=","upper_bound":"ATlUAAAAAAAA+QE5UQAAAAAAAPk=","repeats":1},{"count":544,"lower_bound":"ATlVAAAAAAAA+QE5UgAAAAAAAPk=","upper_bound":"ATliAAAAAAAA+QE5WQAAAAAAAPk=","repeats":1},{"count":552,"lower_bound":"ATljAAAAAAAA+QE5WgAAAAAAAPk=","upper_bound":"ATlqAAAAAAAA+QE5ZwAAAAAAAPk=","repeats":1},{"count":560,"lower_bound":"ATlrAAAAAAAA+QE5aAAAAAAAAPk=","upper_bound":"ATlyAAAAAAAA+QE5bwAAAAAAAPk=","repeats":1},{"count":568,"lower_bound":"ATlzAAAAAAAA+QE5cAAAAAAAAPk=","upper_bound":"ATl6AAAAAAAA+QE5eAAAAAAAAPk=","repeats":1},{"count":576,"lower_bound":"AUEAAAAAAAAA+AFBAAAAAAAAAPg=","upper_bound":"AUE2AAAAAAAA+QFBNAAAAAAAAPk=","repeats":1},{"count":584,"lower_bound":"AUE3AAAAAAAA+QFBNQAAAAAAAPk=","upper_bound":"AUFFAAAAAAAA+QFBQwAAAAAAAPk=","repeats":1},{"count":592,"lower_bound":"AUFGAAAAAAAA+QFBRAAAAAAAAPk=","upper_bound":"AUFNAAAAAAAA+QFBSwAAAAAAAPk=","repeats":1},{"count":600,"lower_bound":"AUFOAAAAAAAA+QFBTAAAAAAAAPk=","upper_bound":"AUFVAAAAAAAA+QFBUwAAAAAAAPk=","repeats":1},{"count":608,"lower_bound":"AUFWAAAAAAAA+QFBVAAAAAAAAPk=","upper_bound":"AUFjAAAAAAAA+QFBYQAAAAAAAPk=","repeats":1},{"count":616,"lower_bound":"AUFkAAAAAAAA+QFBYgAAAAAAAPk=","upper_bound":"AUFrAAAAAAAA+QFBaQAAAAAAAPk=","repeats":1},{"count":624,"lower_bound":"AUFsAAAAAAAA+QFBagAAAAAAAPk=","upper_bound":"AUFzAAAAAAAA+QFBcQAAAAAAAPk=","repeats":1},{"count":632,"lower_bound":"AUF0AAAAAAAA+QFBcgAAAAAAAPk=","upper_bound":"AUIAAAAAAAAA+AFCAAAAAAAAAPg=","repeats":1},{"count":640,"lower_bound":"AUIwAAAAAAAA+QFBeQAAAAAAAPk=","upper_bound":"AUI3AAAAAAAA+QFCNQAAAAAAAPk=","repeats":1},{"count":648,"lower_bound":"AUI4AAAAAAAA+QFCNgAAAAAAAPk=","upper_bound":"AUJGAAAAAAAA+QFCRAAAAAAAAPk=","repeats":1},{"count":656,"lower_bound":"AUJHAAAAAAAA+QFCRQAAAAAAAPk=","upper_bound":"AUJOAAAAAAAA+QFCTAAAAAAAAPk=","repeats":1},{"count":664,"lower_bound":"AUJPAAAAAAAA+QFCTQAAAAAAAPk=","upper_bound":"AUJWAAAAAAAA+QFCVAAAAAAAAPk=","repeats":1},{"count":672,"lower_bound":"AUJXAAAAAAAA+QFCVQAAAAAAAPk=","upper_bound":"AUJkAAAAAAAA+QFCYwAAAAAAAPk=","repeats":1},{"count":680,"lower_bound":"AUJlAAAAAAAA+QFCZAAAAAAAAPk=","upper_bound":"AUJsAAAAAAAA+QFCawAAAAAAAPk=","repeats":1},{"count":688,"lower_bound":"AUJtAAAAAAAA+QFCbAAAAAAAAPk=","upper_bound":"AUJ0AAAAAAAA+QFCcwAAAAAAAPk=","repeats":1},{"count":696,"lower_bound":"AUJ1AAAAAAAA+QFCdAAAAAAAAPk=","upper_bound":"AUMwAAAAAAAA+QFCegAAAAAAAPk=","repeats":1},{"count":704,"lower_bound":"AUMxAAAAAAAA+QFDMAAAAAAAAPk=","upper_bound":"AUM4AAAAAAAA+QFDNgAAAAAAAPk=","repeats":1},{"count":712,"lower_bound":"AUM5AAAAAAAA+QFDNwAAAAAAAPk=","upper_bound":"AUNHAAAAAAAA+QFDRQAAAAAAAPk=","repeats":1},{"count":720,"lower_bound":"AUNIAAAAAAAA+QFDRgAAAAAAAPk=","upper_bound":"AUNPAAAAAAAA+QFDTQAAAAAAAPk=","repeats":1},{"count":728,"lower_bound":"AUNQAAAAAAAA+QFDTgAAAAAAAPk=","upper_bound":"AUNXAAAAAAAA+QFDVQAAAAAAAPk=","repeats":1},{"count":736,"lower_bound":"AUNYAAAAAAAA+QFDVgAAAAAAAPk=","upper_bound":"AUNlAAAAAAAA+QFDYwAAAAAAAPk=","repeats":1},{"count":744,"lower_bound":"AUNmAAAAAAAA+QFDZAAAAAAAAPk=","upper_bound":"AUNtAAAAAAAA+QFDawAAAAAAAPk=","repeats":1},{"count":752,"lower_bound":"AUNuAAAAAAAA+QFDbAAAAAAAAPk=","upper_bound":"AUN1AAAAAAAA+QFDcwAAAAAAAPk=","repeats":1},{"count":760,"lower_bound":"AUN2AAAAAAAA+QFDdAAAAAAAAPk=","upper_bound":"AUQxAAAAAAAA+QFDegAAAAAAAPk=","repeats":1},{"count":768,"lower_bound":"AUQyAAAAAAAA+QFEMAAAAAAAAPk=","upper_bound":"AUQ5AAAAAAAA+QFENwAAAAAAAPk=","repeats":1},{"count":776,"lower_bound":"AURBAAAAAAAA+QFEOAAAAAAAAPk=","upper_bound":"AURIAAAAAAAA+QFERgAAAAAAAPk=","repeats":1},{"count":784,"lower_bound":"AURJAAAAAAAA+QFERwAAAAAAAPk=","upper_bound":"AURQAAAAAAAA+QFETgAAAAAAAPk=","repeats":1},{"count":792,"lower_bound":"AURRAAAAAAAA+QFETwAAAAAAAPk=","upper_bound":"AURYAAAAAAAA+QFEVgAAAAAAAPk=","repeats":1},{"count":800,"lower_bound":"AURZAAAAAAAA+QFEVwAAAAAAAPk=","upper_bound":"AURmAAAAAAAA+QFEZAAAAAAAAPk=","repeats":1},{"count":808,"lower_bound":"AURnAAAAAAAA+QFEZQAAAAAAAPk=","upper_bound":"AURuAAAAAAAA+QFEbAAAAAAAAPk=","repeats":1},{"count":816,"lower_bound":"AURvAAAAAAAA+QFEbQAAAAAAAPk=","upper_bound":"AUR2AAAAAAAA+QFEdAAAAAAAAPk=","repeats":1},{"count":824,"lower_bound":"AUR3AAAAAAAA+QFEdQAAAAAAAPk=","upper_bound":"AUUyAAAAAAAA+QFFMAAAAAAAAPk=","repeats":1},{"count":832,"lower_bound":"AUUzAAAAAAAA+QFFMQAAAAAAAPk=","upper_bound":"AUVBAAAAAAAA+QFFOAAAAAAAAPk=","repeats":1},{"count":840,"lower_bound":"AUVCAAAAAAAA+QFFOQAAAAAAAPk=","upper_bound":"AUVJAAAAAAAA+QFFRwAAAAAAAPk=","repeats":1},{"count":848,"lower_bound":"AUVKAAAAAAAA+QFFSAAAAAAAAPk=","upper_bound":"AUVRAAAAAAAA+QFFTwAAAAAAAPk=","repeats":1},{"count":856,"lower_bound":"AUVSAAAAAAAA+QFFUAAAAAAAAPk=","upper_bound":"AUVZAAAAAAAA+QFFVwAAAAAAAPk=","repeats":1},{"count":864,"lower_bound":"AUVaAAAAAAAA+QFFWAAAAAAAAPk=","upper_bound":"AUVnAAAAAAAA+QFFZQAAAAAAAPk=","repeats":1},{"count":872,"lower_bound":"AUVoAAAAAAAA+QFFZgAAAAAAAPk=","upper_bound":"AUVvAAAAAAAA+QFFbQAAAAAAAPk=","repeats":1},{"count":880,"lower_bound":"AUVwAAAAAAAA+QFFbgAAAAAAAPk=","upper_bound":"AUV3AAAAAAAA+QFFdQAAAAAAAPk=","repeats":1},{"count":888,"lower_bound":"AUV4AAAAAAAA+QFFdgAAAAAAAPk=","upper_bound":"AUYzAAAAAAAA+QFGMQAAAAAAAPk=","repeats":1},{"count":896,"lower_bound":"AUY0AAAAAAAA+QFGMgAAAAAAAPk=","upper_bound":"AUZCAAAAAAAA+QFGOQAAAAAAAPk=","repeats":1},{"count":904,"lower_bound":"AUZDAAAAAAAA+QFGQQAAAAAAAPk=","upper_bound":"AUZKAAAAAAAA+QFGSAAAAAAAAPk=","repeats":1},{"count":912,"lower_bound":"AUZLAAAAAAAA+QFGSQAAAAAAAPk=","upper_bound":"AUZSAAAAAAAA+QFGUAAAAAAAAPk=","repeats":1},{"count":920,"lower_bound":"AUZTAAAAAAAA+QFGUQAAAAAAAPk=","upper_bound":"AUZaAAAAAAAA+QFGWAAAAAAAAPk=","repeats":1},{"count":928,"lower_bound":"AUZhAAAAAAAA+QFGWQAAAAAAAPk=","upper_bound":"AUZoAAAAAAAA+QFGZgAAAAAAAPk=","repeats":1},{"count":936,"lower_bound":"AUZpAAAAAAAA+QFGZwAAAAAAAPk=","upper_bound":"AUZwAAAAAAAA+QFGbgAAAAAAAPk=","repeats":1},{"count":944,"lower_bound":"AUZxAAAAAAAA+QFGbwAAAAAAAPk=","upper_bound":"AUZ4AAAAAAAA+QFGdgAAAAAAAPk=","repeats":1},{"count":952,"lower_bound":"AUZ5AAAAAAAA+QFGdwAAAAAAAPk=","upper_bound":"AUc0AAAAAAAA+QFHMgAAAAAAAPk=","repeats":1},{"count":960,"lower_bound":"AUc1AAAAAAAA+QFHMwAAAAAAAPk=","upper_bound":"AUdDAAAAAAAA+QFHQQAAAAAAAPk=","repeats":1},{"count":968,"lower_bound":"AUdEAAAAAAAA+QFHQgAAAAAAAPk=","upper_bound":"AUdLAAAAAAAA+QFHSQAAAAAAAPk=","repeats":1},{"count":976,"lower_bound":"AUdMAAAAAAAA+QFHSgAAAAAAAPk=","upper_bound":"AUdTAAAAAAAA+QFHUQAAAAAAAPk=","repeats":1},{"count":984,"lower_bound":"AUdUAAAAAAAA+QFHUgAAAAAAAPk=","upper_bound":"AUdhAAAAAAAA+QFHWQAAAAAAAPk=","repeats":1},{"count":992,"lower_bound":"AUdiAAAAAAAA+QFHWgAAAAAAAPk=","upper_bound":"AUdpAAAAAAAA+QFHZwAAAAAAAPk=","repeats":1},{"count":1000,"lower_bound":"AUdqAAAAAAAA+QFHaAAAAAAAAPk=","upper_bound":"AUdxAAAAAAAA+QFHbwAAAAAAAPk=","repeats":1},{"count":1008,"lower_bound":"AUdyAAAAAAAA+QFHcAAAAAAAAPk=","upper_bound":"AUd5AAAAAAAA+QFHeAAAAAAAAPk=","repeats":1},{"count":1016,"lower_bound":"AUd6AAAAAAAA+QFHeQAAAAAAAPk=","upper_bound":"AUg1AAAAAAAA+QFINAAAAAAAAPk=","repeats":1},{"count":1024,"lower_bound":"AUg2AAAAAAAA+QFINQAAAAAAAPk=","upper_bound":"AUhEAAAAAAAA+QFIQwAAAAAAAPk=","repeats":1},{"count":1032,"lower_bound":"AUhFAAAAAAAA+QFIRAAAAAAAAPk=","upper_bound":"AUhMAAAAAAAA+QFISwAAAAAAAPk=","repeats":1},{"count":1040,"lower_bound":"AUhNAAAAAAAA+QFITAAAAAAAAPk=","upper_bound":"AUhUAAAAAAAA+QFIUwAAAAAAAPk=","repeats":1},{"count":1048,"lower_bound":"AUhVAAAAAAAA+QFIVAAAAAAAAPk=","upper_bound":"AUhiAAAAAAAA+QFIYQAAAAAAAPk=","repeats":1},{"count":1056,"lower_bound":"AUhjAAAAAAAA+QFIYgAAAAAAAPk=","upper_bound":"AUhqAAAAAAAA+QFIaQAAAAAAAPk=","repeats":1},{"count":1064,"lower_bound":"AUhrAAAAAAAA+QFIagAAAAAAAPk=","upper_bound":"AUhyAAAAAAAA+QFIcQAAAAAAAPk=","repeats":1},{"count":1072,"lower_bound":"AUhzAAAAAAAA+QFIcgAAAAAAAPk=","upper_bound":"AUh6AAAAAAAA+QFIeQAAAAAAAPk=","repeats":1},{"count":1080,"lower_bound":"AUkAAAAAAAAA+AFJAAAAAAAAAPg=","upper_bound":"AUk2AAAAAAAA+QFJNQAAAAAAAPk=","repeats":1},{"count":1088,"lower_bound":"AUk3AAAAAAAA+QFJNgAAAAAAAPk=","upper_bound":"AUlFAAAAAAAA+QFJRAAAAAAAAPk=","repeats":1},{"count":1096,"lower_bound":"AUlGAAAAAAAA+QFJRQAAAAAAAPk=","upper_bound":"AUlNAAAAAAAA+QFJTAAAAAAAAPk=","repeats":1},{"count":1104,"lower_bound":"AUlOAAAAAAAA+QFJTQAAAAAAAPk=","upper_bound":"AUlVAAAAAAAA+QFJVAAAAAAAAPk=","repeats":1},{"count":1112,"lower_bound":"AUlWAAAAAAAA+QFJVQAAAAAAAPk=","upper_bound":"AUljAAAAAAAA+QFJYgAAAAAAAPk=","repeats":1},{"count":1120,"lower_bound":"AUlkAAAAAAAA+QFJYwAAAAAAAPk=","upper_bound":"AUlrAAAAAAAA+QFJagAAAAAAAPk=","repeats":1},{"count":1128,"lower_bound":"AUlsAAAAAAAA+QFJawAAAAAAAPk=","upper_bound":"AUlzAAAAAAAA+QFJcgAAAAAAAPk=","repeats":1},{"count":1136,"lower_bound":"AUl0AAAAAAAA+QFJcwAAAAAAAPk=","upper_bound":"AUoAAAAAAAAA+AFKAAAAAAAAAPg=","repeats":1},{"count":1144,"lower_bound":"AUowAAAAAAAA+QFJegAAAAAAAPk=","upper_bound":"AUo3AAAAAAAA+QFKNgAAAAAAAPk=","repeats":1},{"count":1152,"lower_bound":"AUo4AAAAAAAA+QFKNwAAAAAAAPk=","upper_bound":"AUpGAAAAAAAA+QFKRQAAAAAAAPk=","repeats":1},{"count":1160,"lower_bound":"AUpHAAAAAAAA+QFKRgAAAAAAAPk=","upper_bound":"AUpOAAAAAAAA+QFKTQAAAAAAAPk=","repeats":1},{"count":1168,"lower_bound":"AUpPAAAAAAAA+QFKTgAAAAAAAPk=","upper_bound":"AUpWAAAAAAAA+QFKVQAAAAAAAPk=","repeats":1},{"count":1176,"lower_bound":"AUpXAAAAAAAA+QFKVgAAAAAAAPk=","upper_bound":"AUpkAAAAAAAA+QFKZAAAAAAAAPk=","repeats":1},{"count":1184,"lower_bound":"AUplAAAAAAAA+QFKZQAAAAAAAPk=","upper_bound":"AUpsAAAAAAAA+QFKbAAAAAAAAPk=","repeats":1},{"count":1192,"lower_bound":"AUptAAAAAAAA+QFKbQAAAAAAAPk=","upper_bound":"AUp0AAAAAAAA+QFKdAAAAAAAAPk=","repeats":1},{"count":1200,"lower_bound":"AUp1AAAAAAAA+QFKdQAAAAAAAPk=","upper_bound":"AUswAAAAAAAA+QFKegAAAAAAAPk=","repeats":1},{"count":1208,"lower_bound":"AUsxAAAAAAAA+QFLMQAAAAAAAPk=","upper_bound":"AUs4AAAAAAAA+QFLOAAAAAAAAPk=","repeats":1},{"count":1216,"lower_bound":"AUs5AAAAAAAA+QFLOQAAAAAAAPk=","upper_bound":"AUtHAAAAAAAA+QFLRwAAAAAAAPk=","repeats":1},{"count":1224,"lower_bound":"AUtIAAAAAAAA+QFLSAAAAAAAAPk=","upper_bound":"AUtPAAAAAAAA+QFLTwAAAAAAAPk=","repeats":1},{"count":1232,"lower_bound":"AUtQAAAAAAAA+QFLUAAAAAAAAPk=","upper_bound":"AUtXAAAAAAAA+QFLVwAAAAAAAPk=","repeats":1},{"count":1240,"lower_bound":"AUtYAAAAAAAA+QFLWAAAAAAAAPk=","upper_bound":"AUtlAAAAAAAA+QFLZQAAAAAAAPk=","repeats":1},{"count":1248,"lower_bound":"AUtmAAAAAAAA+QFLZgAAAAAAAPk=","upper_bound":"AUttAAAAAAAA+QFLbQAAAAAAAPk=","repeats":1},{"count":1256,"lower_bound":"AUtuAAAAAAAA+QFLbgAAAAAAAPk=","upper_bound":"AUt1AAAAAAAA+QFLdQAAAAAAAPk=","repeats":1},{"count":1264,"lower_bound":"AUt2AAAAAAAA+QFLdgAAAAAAAPk=","upper_bound":"AUwxAAAAAAAA+QFMMQAAAAAAAPk=","repeats":1},{"count":1272,"lower_bound":"AUwyAAAAAAAA+QFMMgAAAAAAAPk=","upper_bound":"AUw5AAAAAAAA+QFMOQAAAAAAAPk=","repeats":1},{"count":1280,"lower_bound":"AUxBAAAAAAAA+QFMQQAAAAAAAPk=","upper_bound":"AUxIAAAAAAAA+QFMSAAAAAAAAPk=","repeats":1},{"count":1288,"lower_bound":"AUxJAAAAAAAA+QFMSQAAAAAAAPk=","upper_bound":"AUxQAAAAAAAA+QFMUAAAAAAAAPk=","repeats":1},{"count":1296,"lower_bound":"AUxRAAAAAAAA+QFMUQAAAAAAAPk=","upper_bound":"AUxYAAAAAAAA+QFMWAAAAAAAAPk=","repeats":1},{"count":1304,"lower_bound":"AUxZAAAAAAAA+QFMWQAAAAAAAPk=","upper_bound":"AUxmAAAAAAAA+QFMZgAAAAAAAPk=","repeats":1},{"count":1312,"lower_bound":"AUxnAAAAAAAA+QFMZwAAAAAAAPk=","upper_bound":"AUxuAAAAAAAA+QFMbgAAAAAAAPk=","repeats":1},{"count":1320,"lower_bound":"AUxvAAAAAAAA+QFMbwAAAAAAAPk=","upper_bound":"AUx2AAAAAAAA+QFMdgAAAAAAAPk=","repeats":1},{"count":1328,"lower_bound":"AUx3AAAAAAAA+QFMdwAAAAAAAPk=","upper_bound":"AU0yAAAAAAAA+QFNMgAAAAAAAPk=","repeats":1},{"count":1336,"lower_bound":"AU0zAAAAAAAA+QFNMwAAAAAAAPk=","upper_bound":"AU1BAAAAAAAA+QFNQQAAAAAAAPk=","repeats":1},{"count":1344,"lower_bound":"AU1CAAAAAAAA+QFNQgAAAAAAAPk=","upper_bound":"AU1JAAAAAAAA+QFNSQAAAAAAAPk=","repeats":1},{"count":1352,"lower_bound":"AU1KAAAAAAAA+QFNSgAAAAAAAPk=","upper_bound":"AU1RAAAAAAAA+QFNUQAAAAAAAPk=","repeats":1},{"count":1360,"lower_bound":"AU1SAAAAAAAA+QFNUgAAAAAAAPk=","upper_bound":"AU1ZAAAAAAAA+QFNWQAAAAAAAPk=","repeats":1},{"count":1368,"lower_bound":"AU1aAAAAAAAA+QFNWgAAAAAAAPk=","upper_bound":"AU1nAAAAAAAA+QFNZwAAAAAAAPk=","repeats":1},{"count":1376,"lower_bound":"AU1oAAAAAAAA+QFNaAAAAAAAAPk=","upper_bound":"AU1vAAAAAAAA+QFNbwAAAAAAAPk=","repeats":1},{"count":1384,"lower_bound":"AU1wAAAAAAAA+QFNcAAAAAAAAPk=","upper_bound":"AU13AAAAAAAA+QFNdwAAAAAAAPk=","repeats":1},{"count":1392,"lower_bound":"AU14AAAAAAAA+QFNeAAAAAAAAPk=","upper_bound":"AU4zAAAAAAAA+QFOMwAAAAAAAPk=","repeats":1},{"count":1400,"lower_bound":"AU40AAAAAAAA+QFONAAAAAAAAPk=","upper_bound":"AU5CAAAAAAAA+QFOQgAAAAAAAPk=","repeats":1},{"count":1408,"lower_bound":"AU5DAAAAAAAA+QFOQwAAAAAAAPk=","upper_bound":"AU5KAAAAAAAA+QFOSgAAAAAAAPk=","repeats":1},{"count":1416,"lower_bound":"AU5LAAAAAAAA+QFOSwAAAAAAAPk=","upper_bound":"AU5SAAAAAAAA+QFOUgAAAAAAAPk=","repeats":1},{"count":1424,"lower_bound":"AU5TAAAAAAAA+QFOUwAAAAAAAPk=","upper_bound":"AU5aAAAAAAAA+QFOWgAAAAAAAPk=","repeats":1},{"count":1432,"lower_bound":"AU5hAAAAAAAA+QFOYQAAAAAAAPk=","upper_bound":"AU5oAAAAAAAA+QFOaAAAAAAAAPk=","repeats":1},{"count":1440,"lower_bound":"AU5pAAAAAAAA+QFOaQAAAAAAAPk=","upper_bound":"AU5wAAAAAAAA+QFOcAAAAAAAAPk=","repeats":1},{"count":1448,"lower_bound":"AU5xAAAAAAAA+QFOcQAAAAAAAPk=","upper_bound":"AU54AAAAAAAA+QFOeAAAAAAAAPk=","repeats":1},{"count":1456,"lower_bound":"AU55AAAAAAAA+QFOeQAAAAAAAPk=","upper_bound":"AU80AAAAAAAA+QFPNAAAAAAAAPk=","repeats":1},{"count":1464,"lower_bound":"AU81AAAAAAAA+QFPNQAAAAAAAPk=","upper_bound":"AU9DAAAAAAAA+QFPQwAAAAAAAPk=","repeats":1},{"count":1472,"lower_bound":"AU9EAAAAAAAA+QFPRAAAAAAAAPk=","upper_bound":"AU9LAAAAAAAA+QFPSwAAAAAAAPk=","repeats":1},{"count":1480,"lower_bound":"AU9MAAAAAAAA+QFPTAAAAAAAAPk=","upper_bound":"AU9TAAAAAAAA+QFPVAAAAAAAAPk=","repeats":1},{"count":1488,"lower_bound":"AU9UAAAAAAAA+QFPUwAAAAAAAPk=","upper_bound":"AU9hAAAAAAAA+QFPYQAAAAAAAPk=","repeats":1},{"count":1496,"lower_bound":"AU9iAAAAAAAA+QFPYgAAAAAAAPk=","upper_bound":"AU9pAAAAAAAA+QFPaQAAAAAAAPk=","repeats":1},{"count":1504,"lower_bound":"AU9qAAAAAAAA+QFPagAAAAAAAPk=","upper_bound":"AU9xAAAAAAAA+QFPcQAAAAAAAPk=","repeats":1},{"count":1512,"lower_bound":"AU9yAAAAAAAA+QFPcgAAAAAAAPk=","upper_bound":"AU95AAAAAAAA+QFPeAAAAAAAAPk=","repeats":1},{"count":1520,"lower_bound":"AU96AAAAAAAA+QFPegAAAAAAAPk=","upper_bound":"AVA1AAAAAAAA+QFQNQAAAAAAAPk=","repeats":1},{"count":1528,"lower_bound":"AVA2AAAAAAAA+QFQNgAAAAAAAPk=","upper_bound":"AVBEAAAAAAAA+QFQRAAAAAAAAPk=","repeats":1},{"count":1536,"lower_bound":"AVBFAAAAAAAA+QFQRQAAAAAAAPk=","upper_bound":"AVBMAAAAAAAA+QFQTAAAAAAAAPk=","repeats":1},{"count":1544,"lower_bound":"AVBNAAAAAAAA+QFQTQAAAAAAAPk=","upper_bound":"AVBUAAAAAAAA+QFQVAAAAAAAAPk=","repeats":1},{"count":1552,"lower_bound":"AVBVAAAAAAAA+QFQVQAAAAAAAPk=","upper_bound":"AVBiAAAAAAAA+QFQYgAAAAAAAPk=","repeats":1},{"count":1560,"lower_bound":"AVBjAAAAAAAA+QFQYwAAAAAAAPk=","upper_bound":"AVBqAAAAAAAA+QFQagAAAAAAAPk=","repeats":1},{"count":1568,"lower_bound":"AVBrAAAAAAAA+QFQawAAAAAAAPk=","upper_bound":"AVByAAAAAAAA+QFQcgAAAAAAAPk=","repeats":1},{"count":1576,"lower_bound":"AVBzAAAAAAAA+QFQcwAAAAAAAPk=","upper_bound":"AVB6AAAAAAAA+QFQegAAAAAAAPk=","repeats":1},{"count":1584,"lower_bound":"AVEAAAAAAAAA+AFRAAAAAAAAAPg=","upper_bound":"AVE2AAAAAAAA+QFRNgAAAAAAAPk=","repeats":1},{"count":1592,"lower_bound":"AVE3AAAAAAAA+QFRNwAAAAAAAPk=","upper_bound":"AVFFAAAAAAAA+QFRRQAAAAAAAPk=","repeats":1},{"count":1600,"lower_bound":"AVFGAAAAAAAA+QFRRgAAAAAAAPk=","upper_bound":"AVFNAAAAAAAA+QFRTQAAAAAAAPk=","repeats":1},{"count":1608,"lower_bound":"AVFOAAAAAAAA+QFRTgAAAAAAAPk=","upper_bound":"AVFVAAAAAAAA+QFRVQAAAAAAAPk=","repeats":1},{"count":1616,"lower_bound":"AVFWAAAAAAAA+QFRVgAAAAAAAPk=","upper_bound":"AVFjAAAAAAAA+QFRYwAAAAAAAPk=","repeats":1},{"count":1624,"lower_bound":"AVFkAAAAAAAA+QFRZAAAAAAAAPk=","upper_bound":"AVFrAAAAAAAA+QFRawAAAAAAAPk=","repeats":1},{"count":1632,"lower_bound":"AVFsAAAAAAAA+QFRbAAAAAAAAPk=","upper_bound":"AVFzAAAAAAAA+QFRcwAAAAAAAPk=","repeats":1},{"count":1640,"lower_bound":"AVF0AAAAAAAA+QFRdAAAAAAAAPk=","upper_bound":"AVIAAAAAAAAA+AFSAAAAAAAAAPg=","repeats":1},{"count":1648,"lower_bound":"AVIwAAAAAAAA+QFSMAAAAAAAAPk=","upper_bound":"AVI3AAAAAAAA+QFSNwAAAAAAAPk=","repeats":1},{"count":1656,"lower_bound":"AVI4AAAAAAAA+QFSOAAAAAAAAPk=","upper_bound":"AVJGAAAAAAAA+QFSRgAAAAAAAPk=","repeats":1},{"count":1664,"lower_bound":"AVJHAAAAAAAA+QFSRwAAAAAAAPk=","upper_bound":"AVJOAAAAAAAA+QFSTgAAAAAAAPk=","repeats":1},{"count":1672,"lower_bound":"AVJPAAAAAAAA+QFSTwAAAAAAAPk=","upper_bound":"AVJWAAAAAAAA+QFSVgAAAAAAAPk=","repeats":1},{"count":1680,"lower_bound":"AVJXAAAAAAAA+QFSVwAAAAAAAPk=","upper_bound":"AVJkAAAAAAAA+QFSZAAAAAAAAPk=","repeats":1},{"count":1688,"lower_bound":"AVJlAAAAAAAA+QFSZQAAAAAAAPk=","upper_bound":"AVJsAAAAAAAA+QFSbAAAAAAAAPk=","repeats":1},{"count":1696,"lower_bound":"AVJtAAAAAAAA+QFSbQAAAAAAAPk=","upper_bound":"AVJ0AAAAAAAA+QFSdAAAAAAAAPk=","repeats":1},{"count":1704,"lower_bound":"AVJ1AAAAAAAA+QFSdQAAAAAAAPk=","upper_bound":"AVMwAAAAAAAA+QFTMAAAAAAAAPk=","repeats":1},{"count":1712,"lower_bound":"AVMxAAAAAAAA+QFTMQAAAAAAAPk=","upper_bound":"AVM4AAAAAAAA+QFTOAAAAAAAAPk=","repeats":1},{"count":1720,"lower_bound":"AVM5AAAAAAAA+QFTOQAAAAAAAPk=","upper_bound":"AVNHAAAAAAAA+QFTRwAAAAAAAPk=","repeats":1},{"count":1728,"lower_bound":"AVNIAAAAAAAA+QFTSAAAAAAAAPk=","upper_bound":"AVNPAAAAAAAA+QFTTwAAAAAAAPk=","repeats":1},{"count":1736,"lower_bound":"AVNQAAAAAAAA+QFTUAAAAAAAAPk=","upper_bound":"AVNXAAAAAAAA+QFTVwAAAAAAAPk=","repeats":1},{"count":1744,"lower_bound":"AVNYAAAAAAAA+QFTWAAAAAAAAPk=","upper_bound":"AVNlAAAAAAAA+QFTZQAAAAAAAPk=","repeats":1},{"count":1752,"lower_bound":"AVNmAAAAAAAA+QFTZgAAAAAAAPk=","upper_bound":"AVNtAAAAAAAA+QFTbQAAAAAAAPk=","repeats":1},{"count":1760,"lower_bound":"AVNuAAAAAAAA+QFTbgAAAAAAAPk=","upper_bound":"AVN1AAAAAAAA+QFTdQAAAAAAAPk=","repeats":1},{"count":1768,"lower_bound":"AVN2AAAAAAAA+QFTdgAAAAAAAPk=","upper_bound":"AVQxAAAAAAAA+QFUMQAAAAAAAPk=","repeats":1},{"count":1776,"lower_bound":"AVQyAAAAAAAA+QFUMgAAAAAAAPk=","upper_bound":"AVQ5AAAAAAAA+QFUOQAAAAAAAPk=","repeats":1},{"count":1784,"lower_bound":"AVRBAAAAAAAA+QFUQQAAAAAAAPk=","upper_bound":"AVRIAAAAAAAA+QFUSAAAAAAAAPk=","repeats":1},{"count":1792,"lower_bound":"AVRJAAAAAAAA+QFUSQAAAAAAAPk=","upper_bound":"AVRQAAAAAAAA+QFUUAAAAAAAAPk=","repeats":1},{"count":1800,"lower_bound":"AVRRAAAAAAAA+QFUUQAAAAAAAPk=","upper_bound":"AVRYAAAAAAAA+QFUWAAAAAAAAPk=","repeats":1},{"count":1808,"lower_bound":"AVRZAAAAAAAA+QFUWQAAAAAAAPk=","upper_bound":"AVRmAAAAAAAA+QFUZgAAAAAAAPk=","repeats":1},{"count":1816,"lower_bound":"AVRnAAAAAAAA+QFUZwAAAAAAAPk=","upper_bound":"AVRuAAAAAAAA+QFUbgAAAAAAAPk=","repeats":1},{"count":1824,"lower_bound":"AVRvAAAAAAAA+QFUbwAAAAAAAPk=","upper_bound":"AVR2AAAAAAAA+QFUdgAAAAAAAPk=","repeats":1},{"count":1832,"lower_bound":"AVR3AAAAAAAA+QFUdwAAAAAAAPk=","upper_bound":"AVUyAAAAAAAA+QFVMgAAAAAAAPk=","repeats":1},{"count":1840,"lower_bound":"AVUzAAAAAAAA+QFVMwAAAAAAAPk=","upper_bound":"AVVBAAAAAAAA+QFVOQAAAAAAAPk=","repeats":1},{"count":1848,"lower_bound":"AVVCAAAAAAAA+QFVQQAAAAAAAPk=","upper_bound":"AVVJAAAAAAAA+QFVSQAAAAAAAPk=","repeats":1},{"count":1856,"lower_bound":"AVVKAAAAAAAA+QFVSgAAAAAAAPk=","upper_bound":"AVVRAAAAAAAA+QFVUQAAAAAAAPk=","repeats":1},{"count":1864,"lower_bound":"AVVSAAAAAAAA+QFVUgAAAAAAAPk=","upper_bound":"AVVZAAAAAAAA+QFVWQAAAAAAAPk=","repeats":1},{"count":1872,"lower_bound":"AVVaAAAAAAAA+QFVWgAAAAAAAPk=","upper_bound":"AVVnAAAAAAAA+QFVZwAAAAAAAPk=","repeats":1},{"count":1880,"lower_bound":"AVVoAAAAAAAA+QFVaAAAAAAAAPk=","upper_bound":"AVVvAAAAAAAA+QFVbwAAAAAAAPk=","repeats":1},{"count":1888,"lower_bound":"AVVwAAAAAAAA+QFVcAAAAAAAAPk=","upper_bound":"AVV3AAAAAAAA+QFVdwAAAAAAAPk=","repeats":1},{"count":1896,"lower_bound":"AVV4AAAAAAAA+QFVeAAAAAAAAPk=","upper_bound":"AVYzAAAAAAAA+QFWMwAAAAAAAPk=","repeats":1},{"count":1904,"lower_bound":"AVY0AAAAAAAA+QFWNAAAAAAAAPk=","upper_bound":"AVZCAAAAAAAA+QFWQgAAAAAAAPk=","repeats":1},{"count":1912,"lower_bound":"AVZDAAAAAAAA+QFWQwAAAAAAAPk=","upper_bound":"AVZKAAAAAAAA+QFWSgAAAAAAAPk=","repeats":1},{"count":1920,"lower_bound":"AVZLAAAAAAAA+QFWSwAAAAAAAPk=","upper_bound":"AVZSAAAAAAAA+QFWUgAAAAAAAPk=","repeats":1},{"count":1928,"lower_bound":"AVZTAAAAAAAA+QFWUwAAAAAAAPk=","upper_bound":"AVZaAAAAAAAA+QFWWgAAAAAAAPk=","repeats":1},{"count":1936,"lower_bound":"AVZhAAAAAAAA+QFWYQAAAAAAAPk=","upper_bound":"AVZoAAAAAAAA+QFWaAAAAAAAAPk=","repeats":1},{"count":1944,"lower_bound":"AVZpAAAAAAAA+QFWaQAAAAAAAPk=","upper_bound":"AVZwAAAAAAAA+QFWcAAAAAAAAPk=","repeats":1},{"count":1952,"lower_bound":"AVZxAAAAAAAA+QFWcQAAAAAAAPk=","upper_bound":"AVZ4AAAAAAAA+QFWeAAAAAAAAPk=","repeats":1},{"count":1960,"lower_bound":"AVZ5AAAAAAAA+QFWeQAAAAAAAPk=","upper_bound":"AVc0AAAAAAAA+QFXNAAAAAAAAPk=","repeats":1},{"count":1968,"lower_bound":"AVc1AAAAAAAA+QFXNQAAAAAAAPk=","upper_bound":"AVdDAAAAAAAA+QFXQwAAAAAAAPk=","repeats":1},{"count":1976,"lower_bound":"AVdEAAAAAAAA+QFXRAAAAAAAAPk=","upper_bound":"AWIAAAAAAAAA+AFhAAAAAAAAAPg=","repeats":1},{"count":1984,"lower_bound":"AWMAAAAAAAAA+AFjAAAAAAAAAPg=","upper_bound":"AWoAAAAAAAAA+AFqAAAAAAAAAPg=","repeats":1},{"count":1992,"lower_bound":"AWsAAAAAAAAA+AFrAAAAAAAAAPg=","upper_bound":"AXIAAAAAAAAA+AFyAAAAAAAAAPg=","repeats":1},{"count":2000,"lower_bound":"AXMAAAAAAAAA+AFzAAAAAAAAAPg=","upper_bound":"AXoAAAAAAAAA+AF6AAAAAAAAAPg=","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952028260171776},"cm":{"histogram":{"ndv":1566,"buckets":[{"count":11,"lower_bound":"BAAAAAAAAAPs","upper_bound":"BAAAAAAAAAP8","repeats":2},{"count":22,"lower_bound":"BAAAAAAAAAP+","upper_bound":"BAAAAAAAAAQN","repeats":1},{"count":33,"lower_bound":"BAAAAAAAAAQP","upper_bound":"BAAAAAAAAAQd","repeats":1},{"count":41,"lower_bound":"BAAAAAAAAAQe","upper_bound":"BAAAAAAAAAQ0","repeats":1},{"count":52,"lower_bound":"BAAAAAAAAAQ1","upper_bound":"BAAAAAAAAARG","repeats":1},{"count":61,"lower_bound":"BAAAAAAAAARM","upper_bound":"BAAAAAAAAARp","repeats":1},{"count":71,"lower_bound":"BAAAAAAAAARr","upper_bound":"BAAAAAAAAAR9","repeats":2},{"count":81,"lower_bound":"BAAAAAAAAAR+","upper_bound":"BAAAAAAAAASS","repeats":1},{"count":89,"lower_bound":"BAAAAAAAAASW","upper_bound":"BAAAAAAAAASl","repeats":1},{"count":100,"lower_bound":"BAAAAAAAAASn","upper_bound":"BAAAAAAAAAS1","repeats":1},{"count":110,"lower_bound":"BAAAAAAAAAS3","upper_bound":"BAAAAAAAAATK","repeats":1},{"count":120,"lower_bound":"BAAAAAAAAATN","upper_bound":"BAAAAAAAAATZ","repeats":1},{"count":130,"lower_bound":"BAAAAAAAAATb","upper_bound":"BAAAAAAAAATl","repeats":1},{"count":143,"lower_bound":"BAAAAAAAAATm","upper_bound":"BAAAAAAAAATz","repeats":1},{"count":154,"lower_bound":"BAAAAAAAAAT0","upper_bound":"BAAAAAAAAAUD","repeats":1},{"count":165,"lower_bound":"BAAAAAAAAAUF","upper_bound":"BAAAAAAAAAUe","repeats":1},{"count":174,"lower_bound":"BAAAAAAAAAUf","upper_bound":"BAAAAAAAAAUr","repeats":2},{"count":185,"lower_bound":"BAAAAAAAAAUs","upper_bound":"BAAAAAAAAAVA","repeats":1},{"count":196,"lower_bound":"BAAAAAAAAAVE","upper_bound":"BAAAAAAAAAVa","repeats":1},{"count":208,"lower_bound":"BAAAAAAAAAVb","upper_bound":"BAAAAAAAAAVx","repeats":2},{"count":218,"lower_bound":"BAAAAAAAAAVz","upper_bound":"BAAAAAAAAAV/","repeats":1},{"count":229,"lower_bound":"BAAAAAAAAAWA","upper_bound":"BAAAAAAAAAWP","repeats":1},{"count":238,"lower_bound":"BAAAAAAAAAWQ","upper_bound":"BAAAAAAAAAWn","repeats":2},{"count":248,"lower_bound":"BAAAAAAAAAWo","upper_bound":"BAAAAAAAAAW8","repeats":1},{"count":257,"lower_bound":"BAAAAAAAAAW9","upper_bound":"BAAAAAAAAAXR","repeats":1},{"count":266,"lower_bound":"BAAAAAAAAAXS","upper_bound":"BAAAAAAAAAXh","repeats":1},{"count":274,"lower_bound":"BAAAAAAAAAXi","upper_bound":"BAAAAAAAAAXx","repeats":1},{"count":284,"lower_bound":"BAAAAAAAAAXy","upper_bound":"BAAAAAAAAAYA","repeats":1},{"count":293,"lower_bound":"BAAAAAAAAAYF","upper_bound":"BAAAAAAAAAYV","repeats":1},{"count":301,"lower_bound":"BAAAAAAAAAYZ","upper_bound":"BAAAAAAAAAYl","repeats":1},{"count":313,"lower_bound":"BAAAAAAAAAYr","upper_bound":"BAAAAAAAAAZC","repeats":1},{"count":322,"lower_bound":"BAAAAAAAAAZF","upper_bound":"BAAAAAAAAAZt","repeats":1},{"count":330,"lower_bound":"BAAAAAAAAAZu","upper_bound":"BAAAAAAAAAZ+","repeats":1},{"count":339,"lower_bound":"BAAAAAAAAAaB","upper_bound":"BAAAAAAAAAaP","repeats":2},{"count":348,"lower_bound":"BAAAAAAAAAaR","upper_bound":"BAAAAAAAAAad","repeats":1},{"count":356,"lower_bound":"BAAAAAAAAAah","upper_bound":"BAAAAAAAAAat","repeats":1},{"count":365,"lower_bound":"BAAAAAAAAAau","upper_bound":"BAAAAAAAAAa5","repeats":2},{"count":375,"lower_bound":"BAAAAAAAAAa7","upper_bound":"BAAAAAAAAAbI","repeats":2},{"count":384,"lower_bound":"BAAAAAAAAAbL","upper_bound":"BAAAAAAAAAbg","repeats":1},{"count":395,"lower_bound":"BAAAAAAAAAbj","upper_bound":"BAAAAAAAAAbw","repeats":2},{"count":403,"lower_bound":"BAAAAAAAAAb3","upper_bound":"BAAAAAAAAAcF","repeats":2},{"count":411,"lower_bound":"BAAAAAAAAAcI","upper_bound":"BAAAAAAAAAcc","repeats":2},{"count":420,"lower_bound":"BAAAAAAAAAcl","upper_bound":"BAAAAAAAAAcx","repeats":1},{"count":429,"lower_bound":"BAAAAAAAAAcz","upper_bound":"BAAAAAAAAAc9","repeats":1},{"count":438,"lower_bound":"BAAAAAAAAAdC","upper_bound":"BAAAAAAAAAdV","repeats":1},{"count":446,"lower_bound":"BAAAAAAAAAde","upper_bound":"BAAAAAAAAAdx","repeats":1},{"count":454,"lower_bound":"BAAAAAAAAAd4","upper_bound":"BAAAAAAAAAeD","repeats":1},{"count":463,"lower_bound":"BAAAAAAAAAeE","upper_bound":"BAAAAAAAAAeY","repeats":1},{"count":471,"lower_bound":"BAAAAAAAAAeZ","upper_bound":"BAAAAAAAAAe3","repeats":1},{"count":479,"lower_bound":"BAAAAAAAAAe6","upper_bound":"BAAAAAAAAAfD","repeats":1},{"count":487,"lower_bound":"BAAAAAAAAAfJ","upper_bound":"BAAAAAAAAAfY","repeats":1},{"count":496,"lower_bound":"BAAAAAAAAAfd","upper_bound":"BAAAAAAAAAf4","repeats":2},{"count":505,"lower_bound":"BAAAAAAAAAf5","upper_bound":"BAAAAAAAAAgM","repeats":1},{"count":515,"lower_bound":"BAAAAAAAAAgN","upper_bound":"BAAAAAAAAAgZ","repeats":1},{"count":523,"lower_bound":"BAAAAAAAAAgb","upper_bound":"BAAAAAAAAAgu","repeats":1},{"count":531,"lower_bound":"BAAAAAAAAAgx","upper_bound":"BAAAAAAAAAg7","repeats":2},{"count":541,"lower_bound":"BAAAAAAAAAhB","upper_bound":"BAAAAAAAAAhR","repeats":2},{"count":551,"lower_bound":"BAAAAAAAAAhU","upper_bound":"BAAAAAAAAAhj","repeats":3},{"count":560,"lower_bound":"BAAAAAAAAAhk","upper_bound":"BAAAAAAAAAh7","repeats":2},{"count":568,"lower_bound":"BAAAAAAAAAh/","upper_bound":"BAAAAAAAAAiO","repeats":1},{"count":576,"lower_bound":"BAAAAAAAAAiP","upper_bound":"BAAAAAAAAAih","repeats":1},{"count":588,"lower_bound":"BAAAAAAAAAij","upper_bound":"BAAAAAAAAAiy","repeats":2},{"count":598,"lower_bound":"BAAAAAAAAAiz","upper_bound":"BAAAAAAAAAjB","repeats":2},{"count":609,"lower_bound":"BAAAAAAAAAjC","upper_bound":"BAAAAAAAAAjS","repeats":4},{"count":618,"lower_bound":"BAAAAAAAAAjT","upper_bound":"BAAAAAAAAAjf","repeats":1},{"count":626,"lower_bound":"BAAAAAAAAAjh","upper_bound":"BAAAAAAAAAju","repeats":1},{"count":635,"lower_bound":"BAAAAAAAAAjy","upper_bound":"BAAAAAAAAAkH","repeats":2},{"count":644,"lower_bound":"BAAAAAAAAAkI","upper_bound":"BAAAAAAAAAkQ","repeats":2},{"count":652,"lower_bound":"BAAAAAAAAAkS","upper_bound":"BAAAAAAAAAks","repeats":1},{"count":660,"lower_bound":"BAAAAAAAAAku","upper_bound":"BAAAAAAAAAk1","repeats":2},{"count":668,"lower_bound":"BAAAAAAAAAk3","upper_bound":"BAAAAAAAAAlD","repeats":1},{"count":676,"lower_bound":"BAAAAAAAAAlG","upper_bound":"BAAAAAAAAAlT","repeats":1},{"count":686,"lower_bound":"BAAAAAAAAAlU","upper_bound":"BAAAAAAAAAld","repeats":2},{"count":695,"lower_bound":"BAAAAAAAAAlj","upper_bound":"BAAAAAAAAAlz","repeats":2},{"count":704,"lower_bound":"BAAAAAAAAAl0","upper_bound":"BAAAAAAAAAl/","repeats":2},{"count":713,"lower_bound":"BAAAAAAAAAmB","upper_bound":"BAAAAAAAAAmS","repeats":1},{"count":721,"lower_bound":"BAAAAAAAAAmT","upper_bound":"BAAAAAAAAAmf","repeats":1},{"count":731,"lower_bound":"BAAAAAAAAAmg","upper_bound":"BAAAAAAAAAmy","repeats":2},{"count":739,"lower_bound":"BAAAAAAAAAm0","upper_bound":"BAAAAAAAAAnC","repeats":2},{"count":747,"lower_bound":"BAAAAAAAAAnD","upper_bound":"BAAAAAAAAAnP","repeats":1},{"count":755,"lower_bound":"BAAAAAAAAAnQ","upper_bound":"BAAAAAAAAAng","repeats":1},{"count":763,"lower_bound":"BAAAAAAAAAnk","upper_bound":"BAAAAAAAAAnz","repeats":1},{"count":771,"lower_bound":"BAAAAAAAAAn1","upper_bound":"BAAAAAAAAAn9","repeats":3},{"count":779,"lower_bound":"BAAAAAAAAAoB","upper_bound":"BAAAAAAAAAoU","repeats":1},{"count":787,"lower_bound":"BAAAAAAAAAoW","upper_bound":"BAAAAAAAAAoq","repeats":1},{"count":796,"lower_bound":"BAAAAAAAAAoz","upper_bound":"BAAAAAAAAApG","repeats":1},{"count":804,"lower_bound":"BAAAAAAAAApI","upper_bound":"BAAAAAAAAApY","repeats":1},{"count":812,"lower_bound":"BAAAAAAAAApZ","upper_bound":"BAAAAAAAAApt","repeats":1},{"count":820,"lower_bound":"BAAAAAAAAApy","upper_bound":"BAAAAAAAAAqC","repeats":1},{"count":828,"lower_bound":"BAAAAAAAAAqD","upper_bound":"BAAAAAAAAAqM","repeats":2},{"count":838,"lower_bound":"BAAAAAAAAAqN","upper_bound":"BAAAAAAAAAqb","repeats":3},{"count":847,"lower_bound":"BAAAAAAAAAqc","upper_bound":"BAAAAAAAAAq0","repeats":2},{"count":855,"lower_bound":"BAAAAAAAAAq1","upper_bound":"BAAAAAAAAArG","repeats":1},{"count":863,"lower_bound":"BAAAAAAAAArJ","upper_bound":"BAAAAAAAAArU","repeats":2},{"count":871,"lower_bound":"BAAAAAAAAArb","upper_bound":"BAAAAAAAAAro","repeats":2},{"count":879,"lower_bound":"BAAAAAAAAAru","upper_bound":"BAAAAAAAAAr+","repeats":2},{"count":888,"lower_bound":"BAAAAAAAAAr/","upper_bound":"BAAAAAAAAAsS","repeats":1},{"count":896,"lower_bound":"BAAAAAAAAAsb","upper_bound":"BAAAAAAAAAsu","repeats":1},{"count":904,"lower_bound":"BAAAAAAAAAsy","upper_bound":"BAAAAAAAAAtD","repeats":1},{"count":912,"lower_bound":"BAAAAAAAAAtF","upper_bound":"BAAAAAAAAAtQ","repeats":1},{"count":920,"lower_bound":"BAAAAAAAAAtZ","upper_bound":"BAAAAAAAAAtg","repeats":2},{"count":928,"lower_bound":"BAAAAAAAAAtk","upper_bound":"BAAAAAAAAAt9","repeats":1},{"count":938,"lower_bound":"BAAAAAAAAAuA","upper_bound":"BAAAAAAAAAuM","repeats":1},{"count":948,"lower_bound":"BAAAAAAAAAuN","upper_bound":"BAAAAAAAAAuY","repeats":3},{"count":958,"lower_bound":"BAAAAAAAAAuZ","upper_bound":"BAAAAAAAAAuj","repeats":2},{"count":967,"lower_bound":"BAAAAAAAAAum","upper_bound":"BAAAAAAAAAu6","repeats":1},{"count":975,"lower_bound":"BAAAAAAAAAu+","upper_bound":"BAAAAAAAAAvD","repeats":1},{"count":983,"lower_bound":"BAAAAAAAAAvE","upper_bound":"BAAAAAAAAAvT","repeats":1},{"count":991,"lower_bound":"BAAAAAAAAAvU","upper_bound":"BAAAAAAAAAvj","repeats":1},{"count":999,"lower_bound":"BAAAAAAAAAvm","upper_bound":"BAAAAAAAAAvu","repeats":1},{"count":1007,"lower_bound":"BAAAAAAAAAvv","upper_bound":"BAAAAAAAAAwF","repeats":1},{"count":1015,"lower_bound":"BAAAAAAAAAwH","upper_bound":"BAAAAAAAAAwQ","repeats":1},{"count":1023,"lower_bound":"BAAAAAAAAAwS","upper_bound":"BAAAAAAAAAwf","repeats":1},{"count":1032,"lower_bound":"BAAAAAAAAAwh","upper_bound":"BAAAAAAAAAw4","repeats":1},{"count":1040,"lower_bound":"BAAAAAAAAAw6","upper_bound":"BAAAAAAAAAxD","repeats":2},{"count":1049,"lower_bound":"BAAAAAAAAAxG","upper_bound":"BAAAAAAAAAxQ","repeats":1},{"count":1058,"lower_bound":"BAAAAAAAAAxS","upper_bound":"BAAAAAAAAAxd","repeats":2},{"count":1068,"lower_bound":"BAAAAAAAAAxf","upper_bound":"BAAAAAAAAAxq","repeats":1},{"count":1078,"lower_bound":"BAAAAAAAAAxs","upper_bound":"BAAAAAAAAAx3","repeats":2},{"count":1086,"lower_bound":"BAAAAAAAAAx7","upper_bound":"BAAAAAAAAAyG","repeats":1},{"count":1098,"lower_bound":"BAAAAAAAAAyL","upper_bound":"BAAAAAAAAAyg","repeats":4},{"count":1108,"lower_bound":"BAAAAAAAAAyh","upper_bound":"BAAAAAAAAAyz","repeats":2},{"count":1117,"lower_bound":"BAAAAAAAAAy1","upper_bound":"BAAAAAAAAAzC","repeats":1},{"count":1126,"lower_bound":"BAAAAAAAAAzE","upper_bound":"BAAAAAAAAAzU","repeats":1},{"count":1134,"lower_bound":"BAAAAAAAAAzW","upper_bound":"BAAAAAAAAAzk","repeats":1},{"count":1145,"lower_bound":"BAAAAAAAAAzm","upper_bound":"BAAAAAAAAAzt","repeats":3},{"count":1154,"lower_bound":"BAAAAAAAAAzv","upper_bound":"BAAAAAAAAAz/","repeats":1},{"count":1162,"lower_bound":"BAAAAAAAAA0F","upper_bound":"BAAAAAAAAA0c","repeats":1},{"count":1170,"lower_bound":"BAAAAAAAAA0h","upper_bound":"BAAAAAAAAA0s","repeats":1},{"count":1179,"lower_bound":"BAAAAAAAAA0t","upper_bound":"BAAAAAAAAA09","repeats":2},{"count":1187,"lower_bound":"BAAAAAAAAA1J","upper_bound":"BAAAAAAAAA1V","repeats":1},{"count":1197,"lower_bound":"BAAAAAAAAA1X","upper_bound":"BAAAAAAAAA1e","repeats":3},{"count":1205,"lower_bound":"BAAAAAAAAA1g","upper_bound":"BAAAAAAAAA10","repeats":1},{"count":1214,"lower_bound":"BAAAAAAAAA13","upper_bound":"BAAAAAAAAA2A","repeats":2},{"count":1222,"lower_bound":"BAAAAAAAAA2C","upper_bound":"BAAAAAAAAA2L","repeats":1},{"count":1230,"lower_bound":"BAAAAAAAAA2O","upper_bound":"BAAAAAAAAA2U","repeats":2},{"count":1238,"lower_bound":"BAAAAAAAAA2a","upper_bound":"BAAAAAAAAA2s","repeats":2},{"count":1246,"lower_bound":"BAAAAAAAAA2t","upper_bound":"BAAAAAAAAA28","repeats":1},{"count":1254,"lower_bound":"BAAAAAAAAA2+","upper_bound":"BAAAAAAAAA3L","repeats":1},{"count":1262,"lower_bound":"BAAAAAAAAA3M","upper_bound":"BAAAAAAAAA3Y","repeats":2},{"count":1270,"lower_bound":"BAAAAAAAAA3Z","upper_bound":"BAAAAAAAAA3t","repeats":1},{"count":1280,"lower_bound":"BAAAAAAAAA3u","upper_bound":"BAAAAAAAAA34","repeats":3},{"count":1288,"lower_bound":"BAAAAAAAAA35","upper_bound":"BAAAAAAAAA4F","repeats":1},{"count":1296,"lower_bound":"BAAAAAAAAA4H","upper_bound":"BAAAAAAAAA4X","repeats":1},{"count":1304,"lower_bound":"BAAAAAAAAA4f","upper_bound":"BAAAAAAAAA4u","repeats":1},{"count":1312,"lower_bound":"BAAAAAAAAA4w","upper_bound":"BAAAAAAAAA47","repeats":1},{"count":1321,"lower_bound":"BAAAAAAAAA48","upper_bound":"BAAAAAAAAA5O","repeats":2},{"count":1329,"lower_bound":"BAAAAAAAAA5Q","upper_bound":"BAAAAAAAAA5Y","repeats":3},{"count":1337,"lower_bound":"BAAAAAAAAA5b","upper_bound":"BAAAAAAAAA5q","repeats":1},{"count":1345,"lower_bound":"BAAAAAAAAA5s","upper_bound":"BAAAAAAAAA6C","repeats":1},{"count":1353,"lower_bound":"BAAAAAAAAA6E","upper_bound":"BAAAAAAAAA6T","repeats":1},{"count":1361,"lower_bound":"BAAAAAAAAA6V","upper_bound":"BAAAAAAAAA6k","repeats":1},{"count":1369,"lower_bound":"BAAAAAAAAA6r","upper_bound":"BAAAAAAAAA63","repeats":3},{"count":1378,"lower_bound":"BAAAAAAAAA65","upper_bound":"BAAAAAAAAA7B","repeats":2},{"count":1386,"lower_bound":"BAAAAAAAAA7D","upper_bound":"BAAAAAAAAA7R","repeats":1},{"count":1394,"lower_bound":"BAAAAAAAAA7T","upper_bound":"BAAAAAAAAA7g","repeats":2},{"count":1403,"lower_bound":"BAAAAAAAAA7n","upper_bound":"BAAAAAAAAA70","repeats":2},{"count":1411,"lower_bound":"BAAAAAAAAA71","upper_bound":"BAAAAAAAAA8B","repeats":1},{"count":1419,"lower_bound":"BAAAAAAAAA8E","upper_bound":"BAAAAAAAAA8P","repeats":1},{"count":1427,"lower_bound":"BAAAAAAAAA8R","upper_bound":"BAAAAAAAAA8Z","repeats":1},{"count":1435,"lower_bound":"BAAAAAAAAA8b","upper_bound":"BAAAAAAAAA8r","repeats":1},{"count":1443,"lower_bound":"BAAAAAAAAA8t","upper_bound":"BAAAAAAAAA83","repeats":1},{"count":1451,"lower_bound":"BAAAAAAAAA85","upper_bound":"BAAAAAAAAA9H","repeats":2},{"count":1460,"lower_bound":"BAAAAAAAAA9K","upper_bound":"BAAAAAAAAA9U","repeats":3},{"count":1468,"lower_bound":"BAAAAAAAAA9Z","upper_bound":"BAAAAAAAAA9o","repeats":2},{"count":1476,"lower_bound":"BAAAAAAAAA9q","upper_bound":"BAAAAAAAAA9/","repeats":2},{"count":1485,"lower_bound":"BAAAAAAAAA+B","upper_bound":"BAAAAAAAAA+P","repeats":2},{"count":1493,"lower_bound":"BAAAAAAAAA+U","upper_bound":"BAAAAAAAAA+i","repeats":1},{"count":1501,"lower_bound":"BAAAAAAAAA+r","upper_bound":"BAAAAAAAAA+1","repeats":2},{"count":1509,"lower_bound":"BAAAAAAAAA+2","upper_bound":"BAAAAAAAAA/C","repeats":1},{"count":1518,"lower_bound":"BAAAAAAAAA/D","upper_bound":"BAAAAAAAAA/I","repeats":2},{"count":1526,"lower_bound":"BAAAAAAAAA/J","upper_bound":"BAAAAAAAAA/P","repeats":2},{"count":1534,"lower_bound":"BAAAAAAAAA/Q","upper_bound":"BAAAAAAAAA/f","repeats":2},{"count":1542,"lower_bound":"BAAAAAAAAA/g","upper_bound":"BAAAAAAAAA/w","repeats":1},{"count":1550,"lower_bound":"BAAAAAAAAA/z","upper_bound":"BAAAAAAAABAL","repeats":1},{"count":1558,"lower_bound":"BAAAAAAAABAQ","upper_bound":"BAAAAAAAABAZ","repeats":1},{"count":1566,"lower_bound":"BAAAAAAAABAa","upper_bound":"BAAAAAAAABAm","repeats":1},{"count":1574,"lower_bound":"BAAAAAAAABAs","upper_bound":"BAAAAAAAABA+","repeats":1},{"count":1582,"lower_bound":"BAAAAAAAABBA","upper_bound":"BAAAAAAAABBL","repeats":1},{"count":1590,"lower_bound":"BAAAAAAAABBM","upper_bound":"BAAAAAAAABBc","repeats":2},{"count":1598,"lower_bound":"BAAAAAAAABBf","upper_bound":"BAAAAAAAABBx","repeats":1},{"count":1606,"lower_bound":"BAAAAAAAABB0","upper_bound":"BAAAAAAAABCI","repeats":1},{"count":1614,"lower_bound":"BAAAAAAAABCN","upper_bound":"BAAAAAAAABCb","repeats":2},{"count":1622,"lower_bound":"BAAAAAAAABCe","upper_bound":"BAAAAAAAABCt","repeats":1},{"count":1631,"lower_bound":"BAAAAAAAABCu","upper_bound":"BAAAAAAAABC7","repeats":2},{"count":1639,"lower_bound":"BAAAAAAAABC9","upper_bound":"BAAAAAAAABDF","repeats":1},{"count":1647,"lower_bound":"BAAAAAAAABDH","upper_bound":"BAAAAAAAABDb","repeats":1},{"count":1655,"lower_bound":"BAAAAAAAABDc","upper_bound":"BAAAAAAAABDq","repeats":1},{"count":1663,"lower_bound":"BAAAAAAAABDs","upper_bound":"BAAAAAAAABEE","repeats":1},{"count":1671,"lower_bound":"BAAAAAAAABEG","upper_bound":"BAAAAAAAABEU","repeats":1},{"count":1679,"lower_bound":"BAAAAAAAABEd","upper_bound":"BAAAAAAAABEn","repeats":1},{"count":1687,"lower_bound":"BAAAAAAAABEp","upper_bound":"BAAAAAAAABEy","repeats":1},{"count":1696,"lower_bound":"BAAAAAAAABE1","upper_bound":"BAAAAAAAABE/","repeats":2},{"count":1704,"lower_bound":"BAAAAAAAABFC","upper_bound":"BAAAAAAAABFJ","repeats":1},{"count":1712,"lower_bound":"BAAAAAAAABFK","upper_bound":"BAAAAAAAABFa","repeats":1},{"count":1721,"lower_bound":"BAAAAAAAABFb","upper_bound":"BAAAAAAAABFn","repeats":2},{"count":1729,"lower_bound":"BAAAAAAAABFo","upper_bound":"BAAAAAAAABFv","repeats":2},{"count":1737,"lower_bound":"BAAAAAAAABFx","upper_bound":"BAAAAAAAABGB","repeats":1},{"count":1745,"lower_bound":"BAAAAAAAABGH","upper_bound":"BAAAAAAAABGW","repeats":1},{"count":1753,"lower_bound":"BAAAAAAAABGX","upper_bound":"BAAAAAAAABGv","repeats":1},{"count":1761,"lower_bound":"BAAAAAAAABGy","upper_bound":"BAAAAAAAABHI","repeats":1},{"count":1769,"lower_bound":"BAAAAAAAABHJ","upper_bound":"BAAAAAAAABHT","repeats":1},{"count":1777,"lower_bound":"BAAAAAAAABHW","upper_bound":"BAAAAAAAABHe","repeats":2},{"count":1786,"lower_bound":"BAAAAAAAABHg","upper_bound":"BAAAAAAAABHr","repeats":3},{"count":1794,"lower_bound":"BAAAAAAAABHs","upper_bound":"BAAAAAAAABHz","repeats":1},{"count":1802,"lower_bound":"BAAAAAAAABH0","upper_bound":"BAAAAAAAABIC","repeats":1},{"count":1810,"lower_bound":"BAAAAAAAABID","upper_bound":"BAAAAAAAABIS","repeats":1},{"count":1819,"lower_bound":"BAAAAAAAABIa","upper_bound":"BAAAAAAAABIn","repeats":2},{"count":1828,"lower_bound":"BAAAAAAAABIp","upper_bound":"BAAAAAAAABIy","repeats":2},{"count":1836,"lower_bound":"BAAAAAAAABI2","upper_bound":"BAAAAAAAABI6","repeats":2},{"count":1844,"lower_bound":"BAAAAAAAABI7","upper_bound":"BAAAAAAAABJK","repeats":2},{"count":1853,"lower_bound":"BAAAAAAAABJP","upper_bound":"BAAAAAAAABJi","repeats":2},{"count":1861,"lower_bound":"BAAAAAAAABJl","upper_bound":"BAAAAAAAABJv","repeats":2},{"count":1869,"lower_bound":"BAAAAAAAABJw","upper_bound":"BAAAAAAAABJ6","repeats":1},{"count":1878,"lower_bound":"BAAAAAAAABJ/","upper_bound":"BAAAAAAAABKQ","repeats":2},{"count":1887,"lower_bound":"BAAAAAAAABKU","upper_bound":"BAAAAAAAABKf","repeats":2},{"count":1895,"lower_bound":"BAAAAAAAABKl","upper_bound":"BAAAAAAAABK7","repeats":1},{"count":1904,"lower_bound":"BAAAAAAAABK+","upper_bound":"BAAAAAAAABLV","repeats":3},{"count":1912,"lower_bound":"BAAAAAAAABLY","upper_bound":"BAAAAAAAABLh","repeats":1},{"count":1920,"lower_bound":"BAAAAAAAABLi","upper_bound":"BAAAAAAAABLp","repeats":3},{"count":1928,"lower_bound":"BAAAAAAAABLq","upper_bound":"BAAAAAAAABL0","repeats":1},{"count":1937,"lower_bound":"BAAAAAAAABL3","upper_bound":"BAAAAAAAABMI","repeats":2},{"count":1945,"lower_bound":"BAAAAAAAABMN","upper_bound":"BAAAAAAAABMV","repeats":1},{"count":1953,"lower_bound":"BAAAAAAAABMX","upper_bound":"BAAAAAAAABMe","repeats":1},{"count":1962,"lower_bound":"BAAAAAAAABMq","upper_bound":"BAAAAAAAABM9","repeats":2},{"count":1970,"lower_bound":"BAAAAAAAABM+","upper_bound":"BAAAAAAAABNJ","repeats":1},{"count":1978,"lower_bound":"BAAAAAAAABNM","upper_bound":"BAAAAAAAABNZ","repeats":1},{"count":1986,"lower_bound":"BAAAAAAAABNb","upper_bound":"BAAAAAAAABNo","repeats":2},{"count":1995,"lower_bound":"BAAAAAAAABNq","upper_bound":"BAAAAAAAABN7","repeats":3}]},"cm_sketch":{"rows":[{"counters":[1,0,0,1,0,0,0,2,1,0,0,2,0,0,4,2,0,4,0,1,1,2,3,1,1,1,2,2,2,1,0,2,2,0,2,0,0,1,2,0,0,0,1,2,2,0,3,0,0,0,0,1,0,0,1,2,0,0,0,4,2,1,0,2,1,1,0,2,1,1,3,3,2,2,1,1,0,0,1,0,0,0,0,0,0,2,1,1,1,0,0,0,2,1,0,4,0,1,2,0,1,2,2,0,0,0,0,0,1,1,3,3,2,1,0,1,2,0,0,0,0,0,0,0,1,0,0,3,2,1,0,0,1,3,2,0,1,0,2,3,0,2,1,1,2,1,1,0,0,0,0,0,1,0,0,1,0,2,0,0,1,0,3,0,0,0,0,0,0,1,1,0,1,0,2,1,0,0,0,0,2,1,0,2,1,0,1,3,0,1,0,3,0,2,0,3,0,1,0,0,0,0,1,1,0,1,2,4,1,1,1,1,1,0,0,0,0,3,0,0,0,0,2,0,0,1,2,0,0,0,2,0,0,2,0,1,1,0,0,0,1,2,2,0,2,0,2,1,0,0,3,4,0,0,1,1,0,0,0,0,0,0,0,1,1,0,0,1,2,3,0,2,0,1,0,0,3,1,2,0,2,1,1,0,0,1,0,2,3,2,0,0,4,0,0,1,4,0,0,0,2,4,1,0,1,0,1,1,0,2,0,3,5,0,0,0,0,1,0,0,0,2,0,0,1,0,2,2,1,0,1,0,3,1,3,0,2,0,3,1,2,1,0,0,0,0,1,2,2,5,1,0,0,0,0,0,0,0,0,0,0,1,1,2,0,0,3,1,0,0,1,4,0,0,1,0,0,0,0,0,0,3,0,4,0,1,3,2,3,0,1,4,0,4,0,0,0,2,0,0,4,1,1,2,0,0,1,0,0,0,1,3,1,2,2,0,0,0,2,3,1,0,2,0,0,0,2,0,1,1,1,0,0,3,2,0,1,0,3,0,1,0,1,0,0,1,0,1,0,1,0,1,0,0,0,1,0,0,4,1,0,0,1,1,1,1,1,0,1,4,1,0,3,2,0,0,0,1,1,0,8,0,0,2,1,0,1,1,0,1,1,5,0,0,0,2,0,0,0,1,0,2,1,0,0,1,0,1,1,1,2,0,2,3,2,0,2,2,2,3,0,2,0,0,1,0,1,0,4,0,0,0,5,1,2,0,2,1,0,0,0,1,0,0,1,2,1,0,0,1,0,1,3,0,1,2,1,0,0,0,1,2,0,2,1,0,1,0,0,2,0,3,2,0,0,1,3,1,6,0,2,0,2,4,1,1,0,0,1,0,0,0,0,1,0,3,0,2,1,2,1,3,0,3,0,1,1,6,0,1,4,0,2,4,2,2,2,1,0,2,0,1,0,2,1,0,3,5,1,0,0,2,0,0,1,1,1,2,0,1,1,0,0,0,0,5,1,0,1,1,2,3,0,0,1,0,2,0,1,1,1,0,0,0,0,2,1,1,1,1,4,0,4,2,1,1,0,0,0,2,2,3,0,2,0,1,2,0,4,2,0,1,0,0,0,2,0,1,3,4,2,0,0,2,0,0,0,0,0,0,2,0,0,2,1,3,0,0,0,0,2,1,0,2,0,0,1,2,0,3,0,0,0,0,2,0,1,1,0,1,0,0,4,0,1,3,1,0,0,0,0,3,0,0,1,2,0,2,0,1,0,0,0,0,0,1,1,2,2,0,1,1,2,2,0,4,0,2,4,1,0,2,2,1,0,1,2,2,0,0,0,5,1,0,2,4,0,2,3,2,0,1,4,4,0,0,1,1,0,0,1,0,1,0,0,0,1,2,2,0,1,2,0,1,0,0,0,3,0,0,1,0,0,0,1,5,3,1,0,0,3,3,0,1,3,1,5,0,0,1,0,1,0,5,0,4,1,2,0,4,0,0,1,1,1,0,0,0,1,2,1,2,0,0,0,1,0,4,0,1,1,0,0,3,0,0,2,0,0,0,1,1,0,1,2,0,1,0,1,0,1,0,1,0,1,0,2,3,2,1,3,3,0,1,2,3,0,0,0,2,1,1,2,0,0,0,0,0,1,2,1,2,4,0,0,0,0,0,0,1,1,0,2,2,1,0,1,2,2,1,1,0,2,0,2,3,0,6,2,1,0,0,0,0,2,0,1,1,2,0,0,0,0,2,3,2,3,1,2,0,5,0,3,2,1,1,1,0,4,0,0,1,0,2,0,2,2,1,1,0,1,1,1,0,1,1,1,2,3,2,0,3,0,2,0,2,1,0,0,2,0,2,0,0,3,0,0,2,1,0,3,0,1,0,0,0,1,0,4,2,1,2,0,2,1,1,3,0,1,0,0,0,1,0,0,0,0,2,0,4,1,0,0,0,0,1,0,1,0,2,4,0,0,1,1,1,0,0,2,3,3,1,0,2,2,0,0,1,3,1,0,1,1,1,1,0,0,0,0,0,2,0,0,3,0,0,3,2,0,0,0,5,3,0,0,2,0,0,0,0,2,2,0,0,5,0,1,2,0,0,2,0,1,1,1,0,3,0,1,0,0,2,0,2,0,0,1,0,3,1,0,1,2,2,0,2,0,2,2,1,2,1,0,2,0,0,0,1,1,0,0,0,1,3,0,0,0,3,0,2,1,0,2,0,1,0,0,0,1,1,0,0,1,1,0,0,4,2,3,0,1,1,5,0,1,0,0,0,1,0,1,1,3,4,0,0,0,2,0,5,1,0,1,1,2,2,3,0,3,6,1,2,3,1,0,0,0,0,2,0,0,1,4,1,0,1,1,1,1,2,2,0,0,0,0,0,0,1,1,0,0,0,3,1,0,1,0,0,0,0,1,1,1,0,0,1,2,0,0,0,1,0,0,0,0,0,0,3,0,1,0,0,1,0,0,0,2,4,1,1,3,1,0,1,1,0,0,4,0,1,0,0,1,0,2,0,0,1,3,3,1,2,0,0,1,2,2,1,2,1,0,0,1,1,2,1,0,0,4,0,0,0,0,0,0,0,0,2,1,0,2,1,0,2,0,1,0,3,3,0,0,3,2,0,0,0,1,1,1,0,1,1,1,0,1,0,0,2,2,6,0,2,1,1,3,1,2,2,4,1,1,0,0,1,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,1,2,1,0,2,2,1,0,0,0,0,2,1,0,0,2,0,0,0,1,0,6,2,0,1,3,5,0,0,0,0,2,1,0,3,0,0,0,0,2,3,0,1,0,0,0,0,2,4,3,0,1,2,0,1,0,2,0,1,0,1,2,1,1,0,0,1,1,2,2,2,2,1,1,1,0,3,2,0,1,0,0,0,1,0,0,0,1,2,2,0,3,4,1,1,1,1,0,1,1,1,0,3,0,0,0,4,2,0,1,1,1,1,2,0,0,0,1,0,1,0,0,1,0,2,0,1,1,1,1,2,2,0,3,1,1,0,0,0,2,2,0,1,0,1,1,0,0,2,0,1,2,0,1,1,0,0,1,3,0,0,0,2,0,1,1,1,2,0,0,0,1,1,0,1,0,0,2,0,0,1,0,1,3,2,0,0,0,0,1,3,4,0,2,1,0,0,0,1,0,2,3,0,0,2,1,0,2,3,1,0,2,2,0,3,2,0,0,0,0,0,0,2,2,0,0,0,1,1,0,3,3,1,1,1,3,0,0,2,0,0,1,1,2,0,0,1,2,5,1,0,4,0,0,0,0,0,4,2,0,0,3,1,0,1,1,1,4,0,3,5,0,1,2,2,0,1,2,0,1,1,0,0,1,0,0,1,3,1,3,1,1,1,3,0,2,1,0,0,1,0,4,1,0,5,1,0,2,0,0,2,1,2,0,1,1,0,0,1,0,1,1,1,0,1,0,0,0,3,1,0,0,0,0,0,2,1,3,0,2,0,0,1,0,3,0,1,0,3,1,0,0,2,1,6,0,0,2,1,1,1,4,1,3,0,1,0,2,1,0,0,1,1,1,0,0,0,0,1,1,2,0,2,0,0,2,0,1,1,0,2,0,2,0,2,0,2,0,0,0,1,4,1,0,0,0,0,3,3,0,0,0,1,2,0,2,2,0,1,0,0,0,1,0,0,2,1,0,0,1,1,0,1,1,0,0,0,0,3,0,1,1,2,1,4,0,0,0,4,1,1,2,0,2,1,1,0,0,2,0,5,0,3,1,1,1,4,0,1,1,2,0,2,2,0,0,0,1,2,2,0,3,2,4,1,1,0,0,3,2,0,3,0,2,0,0,1,4,1,3,0,0,0,2,2,0,0,0,3,5,0,1,0,0,1,3,2,0,0,0,0,0,1,0,1,1,2,0,1,1,0,2,1,2,1,2,0,4,2,0,0,1,0,0,1,0,1,0,1,0,1,3,2,2,1,3,0,1,0,0,0,0,0,0,1,2,0,0,0,0,1,0,1,0,0,0,1,0,0,2,0,1,1,0,3,1,0,2,0,0,0,2,0,1,0,0,5,2,0,2,1,1,0,1,1,0,0,2,0,0,0,1,1,0,0,0,2,0,0,0,6,0,3,0,2,1,0,4,0,0,0,0,0,2,2,1]},{"counters":[0,2,0,2,2,1,1,1,0,0,0,1,0,1,1,1,0,2,10,1,1,0,1,1,1,0,3,4,1,3,0,1,0,0,0,0,1,0,0,0,0,1,1,3,3,1,0,1,0,0,0,3,0,1,1,0,1,0,1,2,1,0,0,0,0,0,1,0,1,3,2,0,2,1,1,0,2,2,1,0,3,0,2,0,1,0,0,0,1,0,0,0,0,0,0,0,1,2,0,1,0,0,0,1,1,1,0,3,1,0,0,2,0,3,0,0,0,1,0,1,0,3,2,0,1,2,2,2,0,2,0,1,0,1,0,0,0,3,4,1,0,0,1,2,6,1,0,0,0,1,1,1,2,3,0,0,4,0,0,2,3,4,2,2,1,1,0,0,2,2,3,0,2,0,0,0,2,0,0,2,2,0,0,0,3,1,4,0,0,0,0,1,0,0,0,0,1,0,1,1,2,1,1,0,1,3,1,3,1,0,2,1,0,0,0,1,0,0,1,2,1,1,0,3,2,0,0,1,1,0,1,0,1,2,0,1,1,0,0,0,2,0,3,0,0,1,0,0,0,1,0,0,0,2,3,0,0,0,1,0,0,4,1,0,0,0,0,1,0,2,0,0,1,0,6,0,0,3,1,1,2,0,0,0,2,0,0,0,4,0,0,1,0,0,1,0,0,3,2,1,0,0,0,2,0,1,2,2,0,1,1,1,0,2,2,0,0,1,1,1,3,2,0,0,0,0,0,1,0,0,2,0,0,0,0,1,0,3,0,0,0,0,1,1,0,0,0,2,2,0,0,2,1,3,2,0,3,2,5,1,0,0,0,0,0,3,0,1,0,2,7,2,1,0,0,2,0,2,2,4,1,2,0,0,0,0,0,1,0,0,0,0,0,2,0,1,3,1,1,1,1,5,1,3,3,2,3,0,1,1,0,0,1,2,1,2,3,2,1,0,0,0,1,0,1,0,0,1,0,0,0,1,0,2,0,1,1,1,2,0,2,1,0,0,2,1,0,4,0,0,2,2,0,1,2,0,0,2,2,2,0,0,0,0,0,0,2,0,5,1,0,0,0,0,1,2,0,0,0,5,3,0,1,2,0,0,6,3,1,1,1,0,0,0,0,1,1,1,0,2,0,0,4,7,0,1,0,0,0,0,1,0,1,0,1,0,3,0,1,1,2,0,4,1,2,0,4,0,1,1,0,0,2,0,1,0,0,0,2,0,0,0,0,2,0,7,0,1,0,0,0,3,0,2,0,1,0,2,2,0,1,0,0,1,1,0,0,2,0,2,3,2,0,0,0,1,1,2,0,0,1,2,2,1,0,1,0,3,1,2,1,0,0,0,0,0,0,0,4,0,1,0,3,2,2,0,2,3,3,0,1,0,3,0,0,0,1,0,4,0,0,0,0,1,0,0,1,3,2,1,0,0,3,3,0,0,2,1,2,1,2,2,0,2,2,0,0,0,1,2,1,0,1,0,0,3,1,0,0,2,0,3,1,2,2,2,2,0,0,2,1,3,1,3,2,0,3,3,2,2,0,1,0,1,2,0,0,1,0,0,0,4,0,1,0,1,2,2,0,1,1,1,1,1,1,2,0,2,1,4,2,1,0,2,1,4,0,1,2,0,3,1,0,1,1,2,3,0,0,2,0,6,1,0,0,0,3,1,0,0,1,3,3,0,0,4,0,1,1,2,1,0,4,0,0,0,0,1,1,3,0,1,0,1,0,1,0,0,0,0,3,1,2,0,3,1,0,0,0,1,0,1,0,6,0,1,3,0,5,3,0,2,0,0,3,2,4,2,2,0,1,0,2,3,2,0,0,0,2,0,1,1,0,1,0,1,0,2,2,2,2,0,1,0,1,0,3,1,3,0,0,1,1,2,1,0,2,0,1,3,1,2,0,1,1,0,0,0,0,0,3,1,1,3,1,1,0,1,0,1,0,2,0,0,0,2,2,4,0,0,1,1,1,0,1,0,0,0,2,0,0,0,2,1,0,0,0,1,0,1,3,0,1,0,1,0,0,2,0,0,0,3,2,0,1,0,0,1,1,0,1,5,1,0,1,0,1,2,2,1,1,1,0,2,0,0,4,0,0,0,0,3,0,0,0,2,0,1,0,1,0,0,2,3,1,1,0,3,0,0,2,1,0,1,2,0,2,0,0,0,0,0,2,1,1,2,0,0,1,0,0,1,2,0,0,0,4,1,1,0,0,1,3,1,0,3,2,0,0,1,3,4,0,3,0,1,2,0,0,0,1,3,0,0,0,2,0,2,0,0,0,2,3,0,0,1,2,2,1,1,1,2,1,5,0,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,1,2,4,0,5,0,0,0,0,1,1,2,0,2,0,6,0,0,0,0,1,0,3,0,3,0,0,0,0,1,3,2,0,4,2,3,1,1,2,1,0,2,4,1,2,2,4,0,1,0,0,3,0,1,0,0,0,7,0,0,0,0,4,1,0,1,0,0,0,0,0,2,4,2,0,0,5,2,2,0,0,0,0,0,0,1,0,1,0,0,0,0,1,5,0,0,4,0,1,0,0,3,0,0,1,0,2,1,1,1,1,3,0,0,3,0,2,2,5,3,1,0,0,3,1,0,0,0,1,3,0,1,0,0,0,0,1,0,3,0,0,0,2,3,0,2,1,2,0,0,0,1,1,0,0,1,0,1,1,1,1,0,0,0,1,1,0,3,0,1,2,0,1,2,2,0,1,0,1,0,2,0,2,0,1,0,0,2,1,1,1,1,0,3,1,0,2,0,1,0,0,0,1,0,1,1,1,0,2,1,4,1,1,0,0,0,0,1,1,0,0,1,3,1,0,0,1,0,1,0,0,2,2,0,0,3,0,1,0,2,1,0,3,1,1,0,0,0,2,0,1,3,0,2,0,0,0,0,1,0,4,0,0,0,2,0,2,1,1,0,1,0,3,1,1,0,2,0,1,0,2,2,0,2,0,0,0,3,3,1,1,1,0,0,1,0,4,1,1,2,1,4,2,2,0,1,3,0,2,1,0,0,0,2,1,0,1,0,1,1,1,1,1,2,1,1,0,1,1,0,3,2,0,0,1,0,0,1,2,0,0,0,2,0,1,2,1,1,0,0,0,0,0,1,1,0,0,2,0,0,1,3,0,2,0,3,0,1,1,2,0,0,0,1,0,1,0,0,2,3,2,0,0,0,1,1,0,1,3,0,1,2,2,1,1,1,0,2,1,0,1,1,0,0,0,1,1,0,0,1,1,0,2,2,0,2,3,0,2,1,3,4,1,1,0,2,0,0,2,4,1,0,3,0,3,0,1,1,3,2,0,0,0,4,1,0,0,2,0,0,2,0,1,1,4,1,0,4,3,3,0,1,3,2,4,0,0,0,1,1,2,4,0,0,2,1,1,0,1,2,0,0,1,0,2,1,0,2,1,0,0,0,0,1,1,0,1,1,3,2,0,0,1,0,0,3,6,0,0,1,2,0,1,2,0,1,3,0,0,1,2,1,1,0,0,1,3,3,1,0,0,1,0,2,0,0,0,1,0,0,0,0,0,3,0,0,0,0,0,0,0,2,0,1,0,1,2,1,0,0,0,0,0,0,2,2,2,1,1,0,5,0,2,2,1,0,0,0,0,0,0,0,2,1,0,0,0,2,0,1,0,0,4,1,2,2,1,2,1,0,1,0,1,1,0,0,0,3,1,1,0,0,0,1,0,0,0,0,0,1,1,5,1,1,0,0,1,1,3,0,0,0,1,1,1,1,0,1,2,1,1,2,2,0,1,6,2,0,1,0,0,1,1,5,2,0,0,0,0,2,3,0,3,0,0,1,4,0,1,0,0,0,1,0,1,3,1,0,3,1,1,0,0,0,1,1,0,1,0,2,4,0,0,2,0,0,1,1,0,0,0,2,3,1,2,1,1,0,1,2,0,1,0,0,0,1,2,0,1,0,0,2,4,1,0,0,1,1,0,2,1,0,2,0,0,0,0,2,1,0,2,1,0,2,0,2,0,2,4,2,0,0,1,0,1,0,1,1,2,0,0,0,0,1,0,1,5,0,1,0,1,1,0,0,2,0,0,0,0,2,0,0,2,3,0,1,0,0,0,0,0,0,2,0,4,1,0,0,0,1,3,1,3,1,0,0,0,3,0,1,0,0,0,1,0,0,1,1,7,0,2,0,0,0,0,3,0,0,0,3,0,2,2,1,0,1,1,0,1,1,2,0,0,0,2,1,0,0,0,6,1,1,1,0,1,1,0,0,0,1,0,0,1,2,4,2,0,1,1,3,2,2,0,3,2,0,0,0,0,8,0,1,1,1,1,2,4,0,2,0,1,1,0,0,1,0,2,0,2,0,0,0,1,0,1,2,1,1,2,1,0,2,0,2,1,1,1,1,0,0,0,2,0,0,0,4,1,0,2,1,1,2,1,0,0,0,2,1,0,1,2,1,0,2,4,0,1,0,3,0,3,0,1,0,0,0,1,3,3,1,0,2,1,0,2,0,1,2,1,1,0,0,1,2,0,3,1,0,0,0,3,2,0,5,0,0,0,1,1,0,3,0,0,1,3,0,3,0,0,3,0,0,0,0,2,0,0,0]},{"counters":[1,1,0,1,0,3,0,4,0,0,1,3,0,3,1,1,1,1,0,2,1,0,2,3,3,1,0,0,0,0,1,0,0,0,0,0,0,0,2,1,0,1,0,1,1,0,3,0,5,2,1,0,1,2,3,1,0,0,2,4,0,1,1,0,2,0,0,1,0,1,2,3,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,1,1,1,2,1,1,0,0,1,0,0,2,3,2,0,3,1,1,0,0,0,1,0,2,2,0,0,0,0,2,0,1,0,0,0,1,1,2,0,0,0,2,1,4,1,2,0,2,2,0,0,2,3,2,1,0,0,3,0,0,0,1,0,3,0,0,0,1,1,2,1,0,0,1,1,1,7,2,1,0,1,0,0,0,3,0,0,0,0,2,0,3,0,0,0,0,0,1,1,3,0,1,1,4,3,1,1,1,1,1,0,1,3,2,0,2,2,0,1,1,0,4,6,0,1,3,1,3,0,0,1,0,0,0,2,0,0,0,2,0,2,2,0,0,1,0,1,1,5,2,3,1,2,0,0,2,2,3,1,0,0,3,2,1,1,2,1,0,2,0,0,0,1,0,0,2,0,0,2,3,0,1,1,0,2,0,6,1,3,3,0,1,0,0,0,0,5,1,0,0,2,1,1,0,0,0,1,1,0,0,2,0,2,0,0,1,0,1,0,2,0,1,0,2,0,0,0,1,1,0,0,0,3,0,0,0,2,2,0,0,0,2,1,0,0,0,0,0,1,1,2,0,5,2,0,2,1,0,0,0,0,3,0,0,0,2,0,1,1,0,0,2,0,0,0,0,1,4,1,0,1,0,0,0,0,1,0,2,0,0,1,1,2,2,0,0,2,0,0,0,2,1,0,2,2,1,1,4,0,2,2,3,3,0,2,0,1,2,0,0,0,1,0,1,1,1,2,2,1,1,3,0,1,1,0,2,0,5,2,1,1,4,0,2,1,0,1,2,0,1,0,0,0,0,1,0,0,0,3,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,2,3,0,3,0,0,1,0,1,0,0,3,0,0,0,2,0,2,1,3,0,0,1,1,0,1,0,0,2,0,0,1,2,0,0,2,0,3,0,2,1,1,3,1,2,1,0,3,0,0,1,1,2,4,0,1,1,1,1,2,3,2,0,3,1,1,2,0,1,2,2,0,0,1,1,1,0,0,1,3,2,0,0,1,1,2,0,2,0,1,1,1,1,2,1,1,2,1,5,1,2,2,0,1,5,2,0,1,0,0,0,3,0,2,2,1,0,1,4,2,3,1,0,2,1,2,0,1,0,0,2,0,0,0,1,0,2,0,1,3,0,1,4,1,0,3,0,1,0,0,0,1,2,0,0,2,0,0,0,0,5,1,0,0,1,0,0,1,1,0,3,0,1,1,0,1,2,0,1,1,1,1,1,2,1,1,0,3,2,1,0,1,0,0,2,1,0,0,0,3,0,1,4,0,1,0,0,0,2,0,2,3,1,0,2,2,3,0,0,0,4,3,0,2,3,1,0,1,0,0,0,0,4,0,2,0,0,0,0,0,3,2,2,3,0,2,1,0,0,2,3,0,2,2,0,3,4,0,3,2,3,2,3,0,1,0,1,0,1,1,2,1,2,0,1,0,1,3,0,0,1,0,1,0,2,0,0,0,0,0,2,0,0,0,0,1,0,0,4,0,0,1,0,1,2,0,2,0,3,2,0,2,1,0,1,2,1,2,3,0,0,1,0,2,0,1,0,2,0,0,2,0,0,1,0,1,0,4,0,0,0,2,0,0,0,0,0,0,2,1,0,0,2,0,0,2,2,2,2,0,2,0,0,0,1,1,0,0,3,0,0,0,2,0,2,0,4,3,0,1,5,0,3,0,0,0,1,0,0,0,0,1,1,0,1,1,3,1,1,0,0,0,2,0,2,1,1,1,0,0,2,0,2,0,0,1,1,1,3,4,4,0,0,2,0,0,0,3,0,1,0,0,2,0,1,3,2,0,0,0,1,2,0,1,1,0,2,1,0,0,2,0,1,2,0,4,0,0,0,2,2,0,0,2,0,0,4,0,3,0,1,0,3,1,1,3,4,0,0,0,0,1,3,0,2,0,0,0,0,0,0,0,0,4,0,0,1,0,0,0,0,2,0,0,0,0,0,3,1,1,0,0,1,0,2,0,1,3,0,0,0,1,0,0,0,2,0,0,3,2,0,1,1,0,0,0,4,0,0,1,0,1,0,0,0,0,0,1,2,0,3,1,2,2,1,0,0,1,1,0,0,2,0,2,0,0,0,2,0,2,1,1,2,0,0,4,0,2,2,4,2,2,0,0,0,1,0,1,0,1,1,0,0,1,0,1,1,0,1,0,0,0,0,1,1,1,1,0,0,0,2,0,0,1,6,1,1,0,0,1,0,1,0,1,1,0,0,1,1,0,0,0,1,0,1,2,1,2,0,3,2,0,0,2,2,1,1,0,0,0,0,3,1,1,0,0,0,4,3,1,5,0,1,0,2,0,0,0,1,2,0,3,1,0,3,0,2,0,2,0,0,0,0,0,4,2,0,0,1,3,0,2,0,0,0,1,1,0,0,0,0,2,0,0,0,0,0,2,1,0,0,3,0,0,2,0,1,3,0,0,0,1,1,1,0,0,1,1,0,1,1,0,1,1,2,1,0,2,5,0,1,1,1,0,1,2,0,0,1,0,1,2,2,1,1,1,1,0,1,0,0,4,0,2,1,1,1,0,4,0,0,2,0,1,1,0,0,4,2,5,0,2,0,1,0,1,2,0,0,0,1,0,3,2,1,1,1,1,0,1,1,2,2,3,0,0,1,1,3,1,1,0,1,1,0,1,0,0,0,2,2,2,0,0,0,0,3,0,0,2,0,0,0,1,0,0,0,0,0,0,2,0,1,5,0,1,2,0,1,0,1,0,0,1,2,0,0,0,1,1,0,2,1,1,1,0,1,0,0,3,1,0,2,0,2,1,0,1,1,0,0,5,3,0,1,0,0,1,1,0,2,1,3,1,2,1,1,6,0,6,2,0,0,2,3,1,1,1,2,0,1,1,0,0,2,1,0,1,1,7,3,0,4,2,0,3,0,2,2,0,0,1,0,1,1,0,0,1,1,0,2,3,0,1,2,2,0,3,1,2,0,0,1,0,2,0,2,1,1,1,4,4,1,0,4,1,1,2,4,0,1,3,1,0,1,0,0,1,0,2,0,0,1,1,0,0,1,1,0,0,0,3,5,3,3,2,0,3,0,0,0,2,0,1,0,1,0,1,0,1,1,1,2,3,3,0,2,3,0,1,3,0,0,0,0,4,1,1,3,0,0,3,0,0,1,1,0,2,1,1,1,0,1,0,1,1,3,0,0,0,2,3,2,1,1,0,3,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,2,0,4,1,0,0,0,1,1,1,0,0,0,0,0,3,3,0,5,0,0,0,3,0,0,3,1,1,0,1,1,0,1,1,1,0,3,1,0,1,1,3,2,0,0,0,1,2,1,3,0,0,2,1,0,1,1,2,4,0,0,0,0,0,0,0,0,0,0,2,1,0,1,0,4,4,3,0,0,3,8,0,0,1,1,1,0,1,0,3,3,1,2,0,0,4,0,0,0,0,2,2,2,1,0,1,0,0,2,0,0,0,0,1,0,0,0,0,1,0,0,0,3,1,0,1,0,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,2,0,2,1,1,0,1,1,2,0,2,1,0,0,0,1,0,0,1,0,0,1,1,1,0,1,5,1,1,0,6,1,0,1,0,1,1,0,0,0,1,3,0,7,2,2,1,0,1,0,0,2,1,1,4,1,1,2,2,1,0,0,0,1,5,0,0,0,0,1,1,0,0,0,1,0,0,3,1,1,0,1,0,3,0,1,2,1,4,1,0,0,2,1,0,3,4,0,1,0,2,0,0,0,1,1,4,3,2,0,0,2,0,0,0,0,3,0,0,3,0,1,0,2,2,1,0,5,0,0,0,0,0,5,2,0,1,2,2,0,1,0,1,2,0,1,1,3,2,2,0,2,0,1,1,0,2,1,2,1,2,4,0,0,2,0,6,1,1,0,1,1,1,2,1,1,5,0,0,0,1,0,0,0,1,0,2,1,0,0,4,1,0,2,4,2,2,1,0,0,2,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,3,1,1,1,3,2,0,2,4,3,0,1,0,2,0,3,0,0,2,0,0,1,0,6,2,1,0,0,1,2,2,1,0,0,0,0,1,0,3,2,0,1,0,0,2,2,2,2,1,2,2,2,0,1,1,2,1,1,0,1,0,1,0,1,0,4,0,0,0,0,0,0,1,4,0,0,0,1,1,0,1,0,1,1,2,1,1,0,0,0,0,2,2,0,0,0,1,0,0,0,2,3,3,0,0,1,1,2,0,1,0,2,1,0,1,0,3,2,1,2,2,0,0,2,0,1,1,4,1,0,1,3,1,1,1,0,2,1,0,0,0,0,2,0,2,1,0]},{"counters":[2,0,2,0,2,1,0,3,1,0,0,3,0,0,1,0,2,0,0,0,0,0,0,3,0,2,3,3,0,0,0,1,1,3,1,0,0,0,4,3,1,3,2,0,1,0,0,1,0,4,2,0,1,2,1,0,3,3,1,0,1,0,1,0,0,1,1,3,3,1,0,1,0,0,0,1,1,3,1,1,1,2,0,0,0,4,1,0,0,0,3,2,1,0,0,1,1,3,1,2,0,1,1,1,1,1,1,0,1,0,0,0,0,3,0,0,0,0,0,0,1,3,0,1,2,0,0,2,3,6,0,0,0,1,3,0,2,0,0,1,3,1,0,1,0,2,0,3,0,2,2,1,2,1,2,1,3,3,1,0,0,0,2,0,2,1,3,0,2,0,0,2,0,0,1,1,0,0,3,2,0,2,2,0,0,0,0,1,3,1,1,0,0,0,6,1,1,1,0,0,1,1,0,2,1,3,1,0,0,0,3,0,1,5,0,0,0,2,0,0,3,1,0,3,9,4,2,1,0,0,0,1,0,1,0,0,0,1,1,2,2,0,2,0,4,1,1,0,1,2,1,1,0,0,0,1,2,0,0,0,2,3,3,0,0,1,0,0,3,0,3,0,0,0,0,0,2,0,2,0,0,2,3,9,0,6,1,1,0,1,0,3,0,0,0,0,0,0,0,1,1,0,0,2,0,0,0,1,2,0,0,0,2,0,4,0,0,1,0,3,5,2,3,1,1,2,0,0,1,2,3,2,0,0,2,0,1,2,0,0,0,1,3,2,1,1,0,0,0,0,1,0,2,0,2,0,0,2,2,1,1,0,0,0,4,1,0,1,0,1,0,1,1,3,0,0,0,1,2,0,1,2,1,0,0,2,5,2,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,2,0,0,0,0,0,1,0,0,2,1,0,1,1,1,4,0,1,1,1,0,0,3,3,6,0,1,3,2,2,1,4,0,1,1,0,2,0,0,0,0,0,0,0,0,0,0,2,2,0,1,2,1,0,1,2,1,0,0,4,0,0,1,0,0,1,0,0,3,0,0,2,0,1,0,3,3,3,0,0,2,0,3,0,0,2,3,1,3,0,0,1,1,1,0,0,4,0,0,2,2,0,1,0,0,3,2,2,1,1,1,1,0,0,1,1,0,0,4,2,0,2,0,0,0,0,0,2,1,1,0,1,1,1,1,1,3,1,0,0,0,0,0,0,1,0,1,1,0,1,1,0,1,2,1,1,0,5,1,1,1,1,0,4,0,0,1,2,1,2,0,1,3,0,0,2,1,3,1,0,1,1,0,0,1,1,0,0,2,0,0,0,0,2,1,1,0,0,0,1,3,0,0,4,0,0,5,1,2,0,0,0,2,2,0,0,0,0,0,1,6,4,0,1,2,1,0,1,0,3,0,1,1,1,2,3,1,2,3,2,1,0,1,2,0,1,2,0,3,2,0,0,0,1,1,0,1,2,0,1,0,0,0,0,0,0,0,0,2,1,1,1,0,0,1,0,2,1,1,2,0,0,1,1,0,0,0,0,1,2,4,1,2,1,0,1,5,1,0,1,2,3,0,0,1,2,0,7,1,2,4,0,0,1,2,4,1,4,0,0,1,0,0,0,0,0,2,1,0,0,0,2,4,0,0,0,0,0,0,3,0,2,1,0,0,0,3,2,0,0,0,2,3,2,0,2,2,2,2,2,1,0,2,2,4,0,1,1,2,0,1,1,7,3,0,0,0,2,1,0,1,2,1,0,2,2,3,0,0,0,2,0,0,1,1,2,1,2,0,0,1,0,1,0,0,0,0,0,1,1,0,4,1,0,0,0,0,2,3,3,1,0,0,0,1,2,1,0,3,0,0,0,0,0,2,0,3,2,0,0,0,0,1,0,0,1,1,1,1,1,1,1,2,3,4,0,0,1,0,3,1,1,6,6,0,2,3,1,1,1,0,0,0,1,3,2,0,0,2,0,0,3,1,1,1,1,1,2,1,0,3,1,0,3,1,1,0,0,1,0,0,3,1,0,0,0,4,0,2,0,0,0,0,1,5,1,1,2,1,0,0,2,0,1,1,2,0,0,2,0,3,0,0,0,1,0,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,1,2,1,1,0,2,1,3,0,0,0,4,3,3,2,0,2,0,2,2,2,0,1,0,1,0,3,0,0,1,0,1,0,0,0,2,0,2,3,1,0,2,0,0,2,0,2,0,1,0,0,0,0,0,0,2,3,0,1,2,0,1,1,2,2,0,0,0,0,2,1,1,2,2,0,1,0,0,2,0,2,1,1,1,0,0,2,1,2,0,0,1,3,0,2,1,1,1,1,0,0,0,0,0,0,1,1,4,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,3,0,0,1,0,0,1,2,0,0,2,0,1,1,1,1,0,1,1,2,1,0,2,0,0,2,0,1,2,0,0,0,0,0,2,2,1,0,0,0,0,0,0,0,2,0,1,2,3,0,0,0,1,0,0,1,0,4,1,0,1,2,0,1,0,4,0,3,1,0,0,0,7,0,0,3,2,2,0,1,0,0,2,0,1,0,3,2,2,5,0,0,0,0,1,2,1,2,0,0,1,1,2,2,1,1,1,2,0,1,0,0,0,2,2,0,2,1,0,0,1,0,4,1,2,1,0,0,0,1,1,1,0,3,0,1,0,6,0,0,1,0,2,3,0,1,1,2,0,0,0,1,0,0,0,4,4,0,5,7,0,2,0,1,4,0,0,0,1,1,1,0,0,1,2,0,0,0,0,1,1,1,1,3,1,3,0,0,0,0,0,1,0,4,0,3,0,0,1,0,0,3,1,1,1,2,0,3,1,0,2,1,1,0,0,1,0,1,0,1,0,1,0,0,0,1,1,1,0,2,0,1,1,1,0,0,1,1,0,1,2,0,2,0,1,0,4,3,1,1,0,2,0,3,2,0,3,1,1,0,2,0,1,0,1,0,1,2,1,0,0,1,2,1,0,0,0,0,2,1,0,0,2,2,0,0,6,0,0,0,0,1,2,2,0,1,1,0,3,1,1,1,2,3,0,1,1,0,0,1,0,1,3,1,0,0,0,2,1,3,1,2,1,0,2,0,2,1,0,0,0,0,1,1,0,3,0,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,0,5,0,1,1,2,0,2,0,0,1,0,0,0,0,0,3,0,0,1,0,1,0,2,1,1,1,2,1,0,0,0,1,2,0,1,1,2,0,3,0,0,4,2,1,2,0,0,2,1,0,2,2,3,2,0,0,2,0,3,0,0,0,3,0,1,3,0,4,0,1,0,2,2,0,4,1,0,1,0,0,0,1,3,0,0,0,1,0,0,0,2,0,2,0,0,1,1,1,1,0,6,0,1,0,2,2,2,0,0,0,0,0,0,0,0,1,0,1,2,1,0,1,0,1,0,0,1,1,0,0,1,0,2,2,1,0,1,0,1,0,3,0,1,2,0,0,2,1,0,0,0,2,0,1,1,0,0,5,0,0,1,1,3,4,0,0,1,0,0,1,2,1,2,2,0,3,0,2,0,1,0,0,0,2,1,0,2,3,0,1,2,4,2,1,0,2,1,3,0,2,0,1,0,2,2,0,1,0,0,0,2,1,0,0,0,2,1,0,4,1,0,2,0,0,0,1,3,0,1,2,0,0,0,0,2,0,0,2,2,0,2,1,1,0,0,3,0,0,1,0,0,0,0,0,1,0,1,0,2,0,0,0,0,1,1,3,0,1,0,0,2,2,0,2,0,2,3,4,0,1,3,1,0,0,1,3,0,0,0,0,1,0,1,0,2,4,3,0,1,3,1,0,0,2,6,3,0,1,0,2,3,0,0,0,0,0,0,2,5,0,0,0,0,0,2,3,1,1,0,0,0,5,4,2,2,3,1,0,0,0,0,1,1,3,0,5,1,1,3,3,0,2,1,0,0,2,1,1,0,3,0,0,1,1,0,2,1,2,0,1,0,0,0,0,0,1,1,2,0,2,1,1,1,0,0,1,1,0,0,1,2,1,3,6,1,0,0,1,2,0,0,1,1,1,0,1,0,4,0,1,0,0,0,1,0,0,0,1,2,2,2,0,1,2,0,3,0,0,0,2,0,0,1,3,2,0,0,0,0,1,0,0,0,1,0,1,0,0,2,0,0,0,0,0,0,1,2,0,0,1,2,0,1,1,1,1,1,0,2,0,0,0,0,1,0,1,0,2,0,3,0,0,3,1,2,0,1,1,0,0,0,4,0,0,1,1,1,3,1,4,1,5,1,0,1,3,1,2,2,2,0,1,0,0,2,0,2,0,0,4,1,2,0,3,4,0,0,0,0,0,0,2,0,3,1,2,0,4,0,0,0,0,0,1,0,1,2,2,2,1,0,3,0,2,1,3,0,1,0,1,2,2,0,0,0,1,0,0,1,0,0,0,1,0,1,0,0,1,1,0,1,1,1,0,0,0,1,1,0,0,1,0,2,2,0,1,0,0,0,2,0,0,0,1,0,0,1,2,1,0,2,0,1,2,1,0,1]},{"counters":[1,2,3,0,2,2,0,0,2,0,2,0,0,1,2,3,2,2,2,0,0,0,0,1,0,0,4,0,0,0,1,0,0,1,0,0,1,0,0,1,0,3,0,1,1,1,1,0,0,0,2,0,0,0,1,0,0,1,2,1,0,0,0,0,0,0,2,2,0,0,1,3,0,0,3,1,0,2,2,1,0,1,2,2,3,0,0,0,2,0,0,0,0,0,0,3,2,0,0,0,0,2,0,0,1,0,0,0,0,0,0,0,4,5,2,1,1,0,1,0,2,0,1,0,1,3,1,0,1,4,1,0,0,0,0,1,0,0,4,0,0,0,1,1,3,1,0,3,0,0,0,2,5,0,1,1,3,1,2,1,1,1,5,0,0,1,3,1,6,1,0,3,0,2,1,2,3,0,0,0,0,1,1,2,0,0,0,3,0,0,2,1,0,4,0,0,1,2,1,1,2,1,0,3,1,1,0,2,0,0,0,0,2,1,0,1,0,1,1,2,0,1,3,0,0,0,1,1,1,1,1,2,1,1,2,0,0,0,0,2,1,1,2,0,2,0,1,0,1,4,1,0,0,0,1,1,0,0,1,1,5,0,1,1,1,2,2,3,2,0,0,0,3,1,2,0,0,0,1,0,0,0,4,0,0,0,4,2,0,1,1,0,0,0,0,0,1,0,0,4,1,0,1,0,2,1,0,2,0,0,1,0,4,2,0,1,1,2,0,1,0,0,2,0,2,2,1,6,0,1,2,1,0,2,0,0,0,2,0,0,1,0,1,2,0,3,2,0,0,2,1,0,3,4,1,0,1,0,0,0,0,1,2,0,3,1,2,0,0,0,2,1,1,0,0,2,0,0,1,0,0,2,0,2,0,2,0,1,3,2,4,1,0,0,0,0,0,0,0,0,2,1,0,0,3,1,3,2,2,1,2,2,0,0,0,0,0,0,1,1,1,2,2,2,0,1,0,0,3,0,0,0,2,3,0,0,0,0,0,2,2,0,1,0,0,2,2,0,1,1,4,0,1,2,1,2,0,0,0,2,3,2,2,1,0,4,4,2,2,1,0,1,2,2,3,3,1,0,3,0,1,5,4,0,1,0,1,1,2,0,2,0,0,1,2,0,1,2,0,0,0,0,0,0,0,0,1,3,2,1,0,2,0,0,0,0,0,1,0,3,1,2,1,0,0,0,0,0,0,1,0,3,0,1,2,3,1,1,0,1,0,0,0,0,2,1,1,0,0,2,0,1,0,1,0,0,2,1,0,1,1,4,1,3,0,4,1,0,0,0,0,0,2,1,2,3,1,1,0,1,1,2,0,0,1,0,1,0,1,1,1,0,1,0,0,1,3,0,0,1,0,0,3,2,0,2,0,3,1,4,0,0,0,1,2,0,1,2,1,0,4,0,0,1,0,0,1,4,1,2,1,1,1,0,0,0,0,1,0,1,1,0,1,2,1,0,3,1,1,1,1,1,4,1,2,2,1,0,1,2,0,0,0,3,1,1,1,0,1,0,0,1,2,0,1,0,3,0,0,2,0,1,1,0,0,3,2,1,0,1,2,5,2,0,2,3,0,3,0,0,1,0,1,0,3,0,0,0,0,2,2,0,0,1,1,2,0,1,0,0,0,0,0,2,0,0,1,1,2,4,0,0,4,2,1,0,0,0,0,0,1,4,0,2,1,2,1,0,1,1,2,2,0,0,0,0,0,0,1,1,0,2,0,0,0,2,3,2,0,2,1,5,3,0,1,0,1,0,0,0,0,1,0,2,0,0,0,0,2,0,0,0,1,2,1,0,0,4,0,0,0,0,1,4,1,0,1,0,1,0,2,3,0,0,2,0,0,1,0,3,3,1,0,1,4,3,0,1,1,0,0,0,1,0,0,0,5,0,0,1,2,0,0,1,1,0,0,1,0,3,1,0,5,1,1,1,1,1,2,0,3,2,0,1,0,4,0,0,1,1,2,0,0,1,1,0,4,2,0,1,3,4,1,1,1,0,1,2,0,2,0,1,0,1,2,2,0,0,0,4,2,0,0,0,0,0,1,4,0,0,1,0,0,3,6,0,0,3,1,1,0,0,1,0,1,2,3,1,0,1,1,0,1,3,0,2,2,0,2,0,1,1,0,0,0,0,1,1,0,1,0,0,0,1,1,0,1,0,2,5,0,0,3,0,3,0,0,0,0,1,0,1,0,1,1,0,0,3,0,1,2,0,3,0,0,0,0,0,2,0,1,0,4,0,1,0,1,1,2,3,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,2,2,1,0,1,0,0,5,2,0,4,1,3,1,4,3,0,4,3,3,4,0,0,0,0,3,1,2,1,0,3,2,0,0,0,2,0,0,2,4,2,2,0,1,4,1,3,1,1,0,0,0,1,2,1,2,0,1,2,0,0,0,1,1,0,0,0,2,0,2,3,0,0,0,0,0,3,1,1,0,0,0,2,0,1,1,0,0,1,0,0,4,2,1,0,2,1,2,1,1,3,2,0,0,0,2,2,0,5,0,3,3,2,1,0,2,1,2,1,1,1,0,0,3,0,0,1,0,6,0,4,0,0,1,0,1,2,0,0,0,0,5,2,0,0,0,1,0,2,3,0,2,4,0,0,2,0,1,0,3,0,1,0,0,2,0,1,0,2,0,0,0,0,1,1,1,0,2,0,0,1,3,0,0,1,0,0,1,2,3,4,2,0,0,1,1,0,0,1,0,0,1,3,2,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,4,2,1,2,1,1,1,0,6,1,2,3,0,1,1,0,2,0,2,0,0,4,0,1,5,1,0,0,0,1,0,0,0,1,0,0,1,1,1,1,4,0,0,0,0,0,3,0,0,0,1,2,0,0,3,0,0,1,0,0,2,1,2,0,3,0,0,4,1,1,1,0,0,0,1,2,0,0,0,3,2,2,0,0,2,0,1,0,0,0,0,0,1,0,1,2,2,0,2,2,1,0,3,0,0,1,1,1,1,3,3,1,0,0,0,1,0,1,1,1,2,0,3,2,0,3,1,2,0,3,0,0,0,1,0,0,1,0,3,1,0,0,0,1,2,5,0,1,1,0,0,2,0,1,3,1,2,2,0,0,0,3,0,0,0,1,0,0,0,1,1,1,0,1,2,0,0,0,1,2,0,1,2,0,1,1,0,0,2,2,1,1,1,0,0,0,5,0,0,0,1,1,0,2,1,1,1,0,0,1,3,1,1,1,0,1,0,3,1,2,1,1,2,0,2,0,3,2,0,2,0,1,0,0,1,0,1,0,0,2,1,0,0,0,0,1,0,0,3,1,3,0,0,0,0,0,3,0,0,0,2,0,1,3,1,4,0,2,2,6,0,0,3,3,0,2,1,1,0,3,2,2,1,1,5,4,0,1,2,3,0,1,0,1,0,0,0,0,0,0,3,0,0,0,3,1,3,2,1,3,0,0,1,2,0,2,0,1,0,1,1,0,0,1,2,1,0,0,5,1,1,2,1,0,0,0,0,0,0,0,3,1,0,0,1,1,2,2,0,1,0,1,0,2,1,1,1,2,0,0,0,0,1,2,1,0,0,0,0,0,0,0,0,1,0,0,1,4,0,0,0,1,0,2,0,2,0,1,1,1,0,1,0,0,0,2,0,0,0,0,1,0,1,2,2,1,2,0,1,1,0,0,0,1,0,1,3,0,0,0,0,2,0,1,2,3,1,1,3,3,3,0,1,1,0,1,0,1,1,1,1,3,1,1,0,3,1,0,0,0,1,0,0,0,0,1,3,0,0,2,1,0,0,0,0,2,0,0,1,2,0,0,2,0,2,0,2,0,1,3,1,1,0,0,2,0,0,0,2,1,0,0,2,3,0,1,2,0,0,2,0,2,0,0,2,1,1,0,0,4,0,1,0,1,2,0,1,4,1,0,0,1,2,0,4,0,0,1,2,1,2,0,0,0,0,1,0,1,3,0,4,0,0,1,2,0,0,1,0,1,0,0,1,0,0,1,1,0,3,0,2,0,2,1,6,1,2,0,1,0,3,1,0,0,1,1,0,0,2,0,0,0,0,0,1,0,4,6,2,3,0,0,0,1,0,1,1,0,4,0,1,0,0,0,0,0,0,0,1,0,1,0,2,1,2,0,0,1,1,0,0,0,1,0,2,0,1,1,3,0,1,1,0,0,3,2,0,0,1,2,2,0,0,0,3,0,2,1,2,1,1,2,2,2,2,2,0,2,0,0,0,0,0,1,0,1,1,1,0,2,0,2,1,0,2,0,1,5,0,0,2,1,0,1,1,0,2,3,0,1,2,0,5,0,0,0,2,0,3,2,4,1,0,1,2,0,1,0,4,2,0,0,3,1,0,2,1,0,1,0,0,0,1,2,1,0,1,1,2,0,0,0,0,2,0,0,0,1,0,0,2,1,3,2,0,2,1,1,0,0,2,2,2,1,0,2,1,2,1,1,5,3,5,2,1,1,0,1,2,0,2,2,2,0,0,5,0,1,0,3,2,2,0,3,0,3,0,0,1,0,2,1,3,0,1,2,0,0,1,2,1,2,0,1,1]}]},"null_count":0,"last_update_version":397952028392816640},"ip":{"histogram":{"ndv":1893,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+A==","upper_bound":"ATBPbnp6MThp/0gAAAAAAAAA+A==","repeats":1},{"count":16,"lower_bound":"ATBReHNWVgAA/Q==","upper_bound":"ATBibwAAAAAA+g==","repeats":1},{"count":26,"lower_bound":"ATBkAAAAAAAA+Q==","upper_bound":"ATE3aTE3YlJP/1B0aEVhMQAA/Q==","repeats":1},{"count":34,"lower_bound":"ATE3dmdjd0ZD/0xkZwAAAAAA+g==","upper_bound":"ATFWVll0AAAA/A==","repeats":1},{"count":42,"lower_bound":"ATFnAAAAAAAA+Q==","upper_bound":"ATIxc25mTHhF/zlKWHd0MnMA/g==","repeats":1},{"count":50,"lower_bound":"ATIzQVhsRDI0/zNMekJKWFYA/g==","upper_bound":"ATJHUGdsM1NU/0dJbTJUAAAA/A==","repeats":1},{"count":58,"lower_bound":"ATJKM0FMYgAA/Q==","upper_bound":"ATJXejNXAAAA/A==","repeats":1},{"count":66,"lower_bound":"ATJacXB3NFlh/1FuSQAAAAAA+g==","upper_bound":"ATJobzhqUXZU/wAAAAAAAAAA9w==","repeats":1},{"count":74,"lower_bound":"ATJpQ1ZmTXpH/0pHAAAAAAAA+Q==","upper_bound":"ATJvZQAAAAAA+g==","repeats":1},{"count":84,"lower_bound":"ATJwNk1rbndC/05QZjhYAAAA/A==","upper_bound":"ATMwYWR6QUNr/1J5YgAAAAAA+g==","repeats":1},{"count":92,"lower_bound":"ATMxNQAAAAAA+g==","upper_bound":"ATNNMGRHcmx3/wAAAAAAAAAA9w==","repeats":1},{"count":100,"lower_bound":"ATNQUmEwSlk1/wAAAAAAAAAA9w==","upper_bound":"ATNaU0xhSlhP/1pQamUAAAAA+w==","repeats":1},{"count":108,"lower_bound":"ATNaaGVldHl5/zdzTAAAAAAA+g==","upper_bound":"ATNsaDI4S0pm/0FjY0JTdAAA/Q==","repeats":1},{"count":116,"lower_bound":"ATNseVVLN1Bz/1RTNTZIVQAA/Q==","upper_bound":"ATN4QkYwdFEA/g==","repeats":1},{"count":127,"lower_bound":"ATQAAAAAAAAA+A==","upper_bound":"ATRHRzJwVW1B/1dMAAAAAAAA+Q==","repeats":1},{"count":135,"lower_bound":"ATRHVDdCNUkz/0FTNTYAAAAA+w==","upper_bound":"ATRaU0hrWHV6/0pnbAAAAAAA+g==","repeats":1},{"count":143,"lower_bound":"ATRsMXFaRlZC/zZVb25NcHAA/g==","upper_bound":"ATUyTXhBVGNo/1dPAAAAAAAA+Q==","repeats":1},{"count":151,"lower_bound":"ATUyYQAAAAAA+g==","upper_bound":"ATVTNUFGb3k2/3pRdW02AAAA/A==","repeats":1},{"count":159,"lower_bound":"ATVTOWEAAAAA+w==","upper_bound":"ATVWZW5RAAAA/A==","repeats":1},{"count":167,"lower_bound":"ATVXAAAAAAAA+Q==","upper_bound":"ATVsY0o3NmRF/2dqMwAAAAAA+g==","repeats":1},{"count":176,"lower_bound":"ATVuaGJ4MkQ4/0hSOXc4NFEA/g==","upper_bound":"ATYAAAAAAAAA+A==","repeats":2},{"count":184,"lower_bound":"ATY3alcAAAAA+w==","upper_bound":"ATZGU1FxbgAA/Q==","repeats":1},{"count":192,"lower_bound":"ATZLODA3d3A5/0NXWHdsa24A/g==","upper_bound":"ATZSWDQxQzNv/0ZqWkpBUAAA/Q==","repeats":1},{"count":200,"lower_bound":"ATZSbk95Y0tE/2IAAAAAAAAA+A==","upper_bound":"ATZqVG1vMUoA/g==","repeats":1},{"count":208,"lower_bound":"ATZrM0F6YnQx/3ROcQAAAAAA+g==","upper_bound":"ATZ2eXRzSlhG/24xbAAAAAAA+g==","repeats":1},{"count":217,"lower_bound":"ATZ3VmpQAAAA/A==","upper_bound":"ATdBAAAAAAAA+Q==","repeats":1},{"count":225,"lower_bound":"ATdBWjM5AAAA/A==","upper_bound":"ATdObjJFMgAA/Q==","repeats":1},{"count":233,"lower_bound":"ATdTUGE0AAAA/A==","upper_bound":"ATdaYU9mNHZ1/2cAAAAAAAAA+A==","repeats":1},{"count":241,"lower_bound":"ATdkZ204eTRY/3NXdQAAAAAA+g==","upper_bound":"ATdzbmg2ZlUx/2pwAAAAAAAA+Q==","repeats":1},{"count":250,"lower_bound":"ATd1N0NsAAAA/A==","upper_bound":"ATg4RkNHY1hQ/0pKUmIAAAAA+w==","repeats":1},{"count":258,"lower_bound":"ATg5U3FOdkhy/0FZUGMxdngA/g==","upper_bound":"AThEeTB4AAAA/A==","repeats":1},{"count":266,"lower_bound":"AThGSGptAAAA/A==","upper_bound":"AThRNDZwSFY4/0UAAAAAAAAA+A==","repeats":1},{"count":274,"lower_bound":"AThRTEJLZENL/0ZvMQAAAAAA+g==","upper_bound":"AThmT2Eyc0w2/1BZcXdBAAAA/A==","repeats":1},{"count":282,"lower_bound":"AThnTXhHOWVO/3l3WQAAAAAA+g==","upper_bound":"ATh2cTZvWgAA/Q==","repeats":1},{"count":290,"lower_bound":"ATh4aU9VAAAA/A==","upper_bound":"ATlIeThmbXcA/g==","repeats":1},{"count":298,"lower_bound":"ATlKQzJVa2xU/00AAAAAAAAA+A==","upper_bound":"ATlZUm9qOXY3/3Y2AAAAAAAA+Q==","repeats":1},{"count":306,"lower_bound":"ATlibgAAAAAA+g==","upper_bound":"ATlsUlo1AAAA/A==","repeats":1},{"count":317,"lower_bound":"ATlselZQQWoA/g==","upper_bound":"AUExbDZ3STYA/g==","repeats":1},{"count":325,"lower_bound":"AUE2UFE0NnFE/zF2UloAAAAA+w==","upper_bound":"AUFFV2RLOE9w/0dHTQAAAAAA+g==","repeats":1},{"count":333,"lower_bound":"AUFGQVl3cE1S/1kAAAAAAAAA+A==","upper_bound":"AUFZNkEAAAAA+w==","repeats":1},{"count":341,"lower_bound":"AUFZSgAAAAAA+g==","upper_bound":"AUF0AAAAAAAA+Q==","repeats":1},{"count":349,"lower_bound":"AUF3cUUwNUtJ/zlEQXUAAAAA+w==","upper_bound":"AUIzMzEAAAAA+w==","repeats":1},{"count":357,"lower_bound":"AUI0Um5abmp6/2ZoQmMxSAAA/Q==","upper_bound":"AUJJMlk5N3VJ/0xoeQAAAAAA+g==","repeats":1},{"count":365,"lower_bound":"AUJJWEFVZjVQ/1EwYzAAAAAA+w==","upper_bound":"AUJmcWpySEIA/g==","repeats":1},{"count":373,"lower_bound":"AUJodUs1TkZD/1Z6dwAAAAAA+g==","upper_bound":"AUJ3TWUAAAAA+w==","repeats":1},{"count":386,"lower_bound":"AUJ4Z3dWM3lO/255AAAAAAAA+Q==","upper_bound":"AUM2Y0VBNVJl/3JuAAAAAAAA+Q==","repeats":1},{"count":394,"lower_bound":"AUM4OGlXNnFo/3c0YTIAAAAA+w==","upper_bound":"AUNFcUZpVVhq/2UAAAAAAAAA+A==","repeats":1},{"count":402,"lower_bound":"AUNJWgAAAAAA+g==","upper_bound":"AUNSAAAAAAAA+Q==","repeats":1},{"count":410,"lower_bound":"AUNSdndCT0lu/2Y0AAAAAAAA+Q==","upper_bound":"AUNhNWhQOTV5/wAAAAAAAAAA9w==","repeats":1},{"count":418,"lower_bound":"AUNjN3lsQmV5/21yTGUAAAAA+w==","upper_bound":"AUN5AAAAAAAA+Q==","repeats":1},{"count":428,"lower_bound":"AUN6T2N2a1dE/05GAAAAAAAA+Q==","upper_bound":"AUQ1aHh4RVBw/2w0AAAAAAAA+Q==","repeats":1},{"count":436,"lower_bound":"AUQ2OENiZ3ZE/3VjTmJ4TVYA/g==","upper_bound":"AUROeGRRZUhR/1kAAAAAAAAA+A==","repeats":1},{"count":444,"lower_bound":"AURUMklneXU0/zF3AAAAAAAA+Q==","upper_bound":"AURaagAAAAAA+g==","repeats":2},{"count":452,"lower_bound":"AURhaQAAAAAA+g==","upper_bound":"AUR4NgAAAAAA+g==","repeats":1},{"count":463,"lower_bound":"AUR4QThVTnhY/wAAAAAAAAAA9w==","upper_bound":"AUVJaXpvbWV1/wAAAAAAAAAA9w==","repeats":1},{"count":471,"lower_bound":"AUVLcm50U1Vs/3YAAAAAAAAA+A==","upper_bound":"AUVRAAAAAAAA+Q==","repeats":1},{"count":479,"lower_bound":"AUVRa0dndlVh/zhGR1IAAAAA+w==","upper_bound":"AUVxdFBzZTJs/0NaAAAAAAAA+Q==","repeats":1},{"count":488,"lower_bound":"AUVyRWRzZjMy/1AAAAAAAAAA+A==","upper_bound":"AUY0AAAAAAAA+Q==","repeats":1},{"count":496,"lower_bound":"AUY0OURQYkJi/0pQV04xAAAA/A==","upper_bound":"AUZFTUhHAAAA/A==","repeats":1},{"count":504,"lower_bound":"AUZJa1ViRWRM/1lFNTEAAAAA+w==","upper_bound":"AUZiYmN1AAAA/A==","repeats":1},{"count":512,"lower_bound":"AUZjc3FsM1Fq/0RXAAAAAAAA+Q==","upper_bound":"AUZuRTlSQmcz/1pUaQAAAAAA+g==","repeats":1},{"count":520,"lower_bound":"AUZwMFYwaEhC/1FTZzZjAAAA/A==","upper_bound":"AUZ6NkJiAAAA/A==","repeats":1},{"count":529,"lower_bound":"AUcAAAAAAAAA+A==","upper_bound":"AUc4UlUwaWRL/3JqAAAAAAAA+Q==","repeats":1},{"count":537,"lower_bound":"AUdBNXdIeHM4/2RDdXkAAAAA+w==","upper_bound":"AUdSajcwRjRJ/2Z2T0wAAAAA+w==","repeats":1},{"count":545,"lower_bound":"AUdURVJZAAAA/A==","upper_bound":"AUdtTE44bHV4/04AAAAAAAAA+A==","repeats":1},{"count":553,"lower_bound":"AUduAAAAAAAA+Q==","upper_bound":"AUgAAAAAAAAA+A==","repeats":1},{"count":561,"lower_bound":"AUgzR2VYaDBq/01GAAAAAAAA+Q==","upper_bound":"AUhMdnJaSHNU/2NWYQAAAAAA+g==","repeats":1},{"count":569,"lower_bound":"AUhNQW5ZeQAA/Q==","upper_bound":"AUhiYmozAAAA/A==","repeats":1},{"count":577,"lower_bound":"AUhpTHhFVAAA/Q==","upper_bound":"AUh3bFNCYlYA/g==","repeats":1},{"count":585,"lower_bound":"AUkAAAAAAAAA+A==","upper_bound":"AUk1RXdXOUs3/1hpRQAAAAAA+g==","repeats":1},{"count":593,"lower_bound":"AUk2Y3kwcWRi/1EAAAAAAAAA+A==","upper_bound":"AUlISndpaFM5/0NrTQAAAAAA+g==","repeats":1},{"count":601,"lower_bound":"AUlJeERnNEky/3EwamRTAAAA/A==","upper_bound":"AUlRYWFxcHZo/3lUZgAAAAAA+g==","repeats":1},{"count":609,"lower_bound":"AUlTSE9ia1VD/3Bpb3ZLcQAA/Q==","upper_bound":"AUlnV0I1OG1t/084SgAAAAAA+g==","repeats":1},{"count":617,"lower_bound":"AUlpZEFvRU9L/wAAAAAAAAAA9w==","upper_bound":"AUl5Y1pxbkJ6/2xKAAAAAAAA+Q==","repeats":1},{"count":625,"lower_bound":"AUoAAAAAAAAA+A==","upper_bound":"AUpCAAAAAAAA+Q==","repeats":1},{"count":633,"lower_bound":"AUpCQjkyVEJk/zR5NmI2AAAA/A==","upper_bound":"AUpQd2JieUh0/wAAAAAAAAAA9w==","repeats":1},{"count":641,"lower_bound":"AUpRc2t1VUNo/wAAAAAAAAAA9w==","upper_bound":"AUpiVnVoRzZr/2s3AAAAAAAA+Q==","repeats":1},{"count":649,"lower_bound":"AUpkRGwAAAAA+w==","upper_bound":"AUp1ZWd4MEE1/3V1YzkAAAAA+w==","repeats":1},{"count":658,"lower_bound":"AUp5T2tSOUpD/2JISGZUAAAA/A==","upper_bound":"AUtGWVBWUgAA/Q==","repeats":1},{"count":666,"lower_bound":"AUtHSlYAAAAA+w==","upper_bound":"AUtRNW82SHd1/2YAAAAAAAAA+A==","repeats":1},{"count":674,"lower_bound":"AUtRZFhPd0E5/2hvbjY5emIA/g==","upper_bound":"AUtjZVhRVFBu/1hiMAAAAAAA+g==","repeats":1},{"count":682,"lower_bound":"AUtjbVFScmpT/3UAAAAAAAAA+A==","upper_bound":"AUtvTUZhQzJa/21GAAAAAAAA+Q==","repeats":1},{"count":690,"lower_bound":"AUtwcAAAAAAA+g==","upper_bound":"AUwwbnl6R1Zl/3VtcQAAAAAA+g==","repeats":1},{"count":698,"lower_bound":"AUwwb1pad3Vl/3dEUUh0Z3gA/g==","upper_bound":"AUw5bDBRUQAA/Q==","repeats":1},{"count":706,"lower_bound":"AUxEWkNCMnVn/2hLOQAAAAAA+g==","upper_bound":"AUxJWG44TmRL/2J0Wk91OAAA/Q==","repeats":1},{"count":714,"lower_bound":"AUxKQkRwbkRV/0tEVnpINAAA/Q==","upper_bound":"AUxXY0JNS0pM/2ZHc2UAAAAA+w==","repeats":1},{"count":722,"lower_bound":"AUxaNkloVlp2/zJzVzhtAAAA/A==","upper_bound":"AUx0ZDFueEF3/3YAAAAAAAAA+A==","repeats":1},{"count":731,"lower_bound":"AUx1T2tqAAAA/A==","upper_bound":"AU1ISG5pVVNB/0RKczMAAAAA+w==","repeats":1},{"count":739,"lower_bound":"AU1ITklMcDdS/0VEAAAAAAAA+Q==","upper_bound":"AU1WeWZXOQAA/Q==","repeats":1},{"count":747,"lower_bound":"AU1ZZwAAAAAA+g==","upper_bound":"AU1nQm8wTgAA/Q==","repeats":1},{"count":755,"lower_bound":"AU1oQ3UxZG84/1B5AAAAAAAA+Q==","upper_bound":"AU11ZkgxZGlM/zlhVGNTOAAA/Q==","repeats":1},{"count":763,"lower_bound":"AU11Z1JHOWNX/0ZTaEFDeW0A/g==","upper_bound":"AU5GVQAAAAAA+g==","repeats":1},{"count":771,"lower_bound":"AU5Gd01NR1cA/g==","upper_bound":"AU5WaWJPWDk0/05zc0gAAAAA+w==","repeats":1},{"count":779,"lower_bound":"AU5XZ0xVb0NS/28AAAAAAAAA+A==","upper_bound":"AU5pMAAAAAAA+g==","repeats":1},{"count":787,"lower_bound":"AU5vN0UAAAAA+w==","upper_bound":"AU8yQlFRdkJm/2lEMHAAAAAA+w==","repeats":1},{"count":795,"lower_bound":"AU8zAAAAAAAA+Q==","upper_bound":"AU9KcWlWNkh6/3l3AAAAAAAA+Q==","repeats":1},{"count":803,"lower_bound":"AU9OaGRXAAAA/A==","upper_bound":"AU9jYWhESEVW/2xxNkoAAAAA+w==","repeats":1},{"count":811,"lower_bound":"AU9nSzJMQnZV/3RpAAAAAAAA+Q==","upper_bound":"AU9zWG5lM2w0/0EAAAAAAAAA+A==","repeats":1},{"count":819,"lower_bound":"AU90Vlk3SgAA/Q==","upper_bound":"AVAAAAAAAAAA+A==","repeats":2},{"count":827,"lower_bound":"AVAyTEEAAAAA+w==","upper_bound":"AVBNeDc4N3pa/044AAAAAAAA+Q==","repeats":1},{"count":835,"lower_bound":"AVBONHkAAAAA+w==","upper_bound":"AVBaAAAAAAAA+Q==","repeats":1},{"count":843,"lower_bound":"AVBaSlNFWk9w/wAAAAAAAAAA9w==","upper_bound":"AVBtTzRDS2gA/g==","repeats":1},{"count":851,"lower_bound":"AVBuMEUAAAAA+w==","upper_bound":"AVEyAAAAAAAA+Q==","repeats":1},{"count":859,"lower_bound":"AVEya2ZwWG4A/g==","upper_bound":"AVFHUUZGWU1x/3ZzQ3hMQQAA/Q==","repeats":1},{"count":867,"lower_bound":"AVFHcTZ3UXdQ/2dRWEdCZAAA/Q==","upper_bound":"AVFTeVE2VjN4/2Z5egAAAAAA+g==","repeats":1},{"count":875,"lower_bound":"AVFWNkV6ZDU4/2JEUnBQMUgA/g==","upper_bound":"AVFpZlZHAAAA/A==","repeats":1},{"count":883,"lower_bound":"AVFrNThJUVVS/3ZaSGRGMgAA/Q==","upper_bound":"AVIyS2d1RgAA/Q==","repeats":1},{"count":891,"lower_bound":"AVIyemEAAAAA+w==","upper_bound":"AVJOMnB4SzlN/3A5cAAAAAAA+g==","repeats":1},{"count":899,"lower_bound":"AVJRTk45NlFa/zdlNlh4SgAA/Q==","upper_bound":"AVJqAAAAAAAA+Q==","repeats":1},{"count":910,"lower_bound":"AVJsV0szRGUA/g==","upper_bound":"AVMAAAAAAAAA+A==","repeats":4},{"count":918,"lower_bound":"AVMzAAAAAAAA+Q==","upper_bound":"AVNGV1d3AAAA/A==","repeats":1},{"count":926,"lower_bound":"AVNKSTBiU3Nk/1YzAAAAAAAA+Q==","upper_bound":"AVNUQk04dDMx/0FndAAAAAAA+g==","repeats":1},{"count":934,"lower_bound":"AVNUbUMyREpT/3ozAAAAAAAA+Q==","upper_bound":"AVNmOAAAAAAA+g==","repeats":1},{"count":942,"lower_bound":"AVNoYk4AAAAA+w==","upper_bound":"AVNzWElRTGJQ/1k0dgAAAAAA+g==","repeats":1},{"count":951,"lower_bound":"AVN0RzVNMnVQ/zdtYWoyeEUA/g==","upper_bound":"AVRVUDh5V2dN/1MAAAAAAAAA+A==","repeats":1},{"count":959,"lower_bound":"AVRXRm5qAAAA/A==","upper_bound":"AVRsQwAAAAAA+g==","repeats":1},{"count":967,"lower_bound":"AVRvbQAAAAAA+g==","upper_bound":"AVVGSjBOM0k5/2lESGZmAAAA/A==","repeats":1},{"count":975,"lower_bound":"AVVHQXVmbTJU/2t6YktWAAAA/A==","upper_bound":"AVVlZzV0aUIx/0J1VWRybAAA/Q==","repeats":1},{"count":983,"lower_bound":"AVVweVdaY3Jx/3VaAAAAAAAA+Q==","upper_bound":"AVY0Y0daZmMA/g==","repeats":1},{"count":991,"lower_bound":"AVZDTXY4AAAA/A==","upper_bound":"AVZQY2p1YUsA/g==","repeats":1},{"count":999,"lower_bound":"AVZRZW1LN1UA/g==","upper_bound":"AVZZeDgAAAAA+w==","repeats":1},{"count":1007,"lower_bound":"AVZiAAAAAAAA+Q==","upper_bound":"AVZtS1psWHRh/29GUQAAAAAA+g==","repeats":1},{"count":1015,"lower_bound":"AVZuSlp6UUhJ/0pkAAAAAAAA+Q==","upper_bound":"AVc3TEwAAAAA+w==","repeats":1},{"count":1023,"lower_bound":"AVc4AAAAAAAA+Q==","upper_bound":"AVdTM2tDAAAA/A==","repeats":1},{"count":1031,"lower_bound":"AVdWYTBwQQAA/Q==","upper_bound":"AVdoNGZqeWJx/wAAAAAAAAAA9w==","repeats":1},{"count":1039,"lower_bound":"AVdoZ3QAAAAA+w==","upper_bound":"AVdvbjdNSAAA/Q==","repeats":1},{"count":1049,"lower_bound":"AVdxczNLMUNk/21UcndWYQAA/Q==","upper_bound":"AVgAAAAAAAAA+A==","repeats":5},{"count":1057,"lower_bound":"AVgzejJtOTM0/0hHODkAAAAA+w==","upper_bound":"AVhQdEJhcjFN/2dCNmkAAAAA+w==","repeats":1},{"count":1065,"lower_bound":"AVhXMFNVVjdt/1BHUTB6AAAA/A==","upper_bound":"AVhlQgAAAAAA+g==","repeats":1},{"count":1073,"lower_bound":"AVhmeWl1U2h5/1dIbUlzYXkA/g==","upper_bound":"AVhxNThTVnVZ/wAAAAAAAAAA9w==","repeats":1},{"count":1081,"lower_bound":"AVhxdmxTAAAA/A==","upper_bound":"AVk1Tm01AAAA/A==","repeats":1},{"count":1089,"lower_bound":"AVk2S2FQaFFY/1pTRgAAAAAA+g==","upper_bound":"AVlOAAAAAAAA+Q==","repeats":1},{"count":1097,"lower_bound":"AVlOTEFEVQAA/Q==","upper_bound":"AVlZAAAAAAAA+Q==","repeats":1},{"count":1105,"lower_bound":"AVlZd3NCNzgA/g==","upper_bound":"AVlrUVVXYkRu/zQ4WVBjRE8A/g==","repeats":1},{"count":1113,"lower_bound":"AVlsdHQ4OWdk/28AAAAAAAAA+A==","upper_bound":"AVozZgAAAAAA+g==","repeats":1},{"count":1121,"lower_bound":"AVo1AAAAAAAA+Q==","upper_bound":"AVpLblhpRwAA/Q==","repeats":1},{"count":1129,"lower_bound":"AVpRZXhteGZQ/21FWUUAAAAA+w==","upper_bound":"AVpVaThEYW4A/g==","repeats":1},{"count":1137,"lower_bound":"AVpXSG42VGEA/g==","upper_bound":"AVpweU9NAAAA/A==","repeats":1},{"count":1146,"lower_bound":"AVpyeDJPYzMz/wAAAAAAAAAA9w==","upper_bound":"AWEAAAAAAAAA+A==","repeats":4},{"count":1154,"lower_bound":"AWEwcmM1azk4/2x3ZXFQbGEA/g==","upper_bound":"AWFJb2JqT3U4/wAAAAAAAAAA9w==","repeats":1},{"count":1162,"lower_bound":"AWFLSm0AAAAA+w==","upper_bound":"AWFObHBPTldL/wAAAAAAAAAA9w==","repeats":1},{"count":1170,"lower_bound":"AWFPOEFOZQAA/Q==","upper_bound":"AWFoNFJCaHc4/2gAAAAAAAAA+A==","repeats":1},{"count":1182,"lower_bound":"AWFqTHhjaVNm/0M3NWgAAAAA+w==","upper_bound":"AWIAAAAAAAAA+A==","repeats":5},{"count":1190,"lower_bound":"AWIxT25BT2Zp/3UxYnMAAAAA+w==","upper_bound":"AWJIUFRoREFj/zFGVgAAAAAA+g==","repeats":1},{"count":1198,"lower_bound":"AWJJTkY1SQAA/Q==","upper_bound":"AWJWNlhRNHZt/zJXb2VHb2UA/g==","repeats":1},{"count":1206,"lower_bound":"AWJWRFVTVFBj/wAAAAAAAAAA9w==","upper_bound":"AWJjcTJtWVFj/0lGZUZ5UQAA/Q==","repeats":1},{"count":1214,"lower_bound":"AWJkbG4AAAAA+w==","upper_bound":"AWJ3NFRrc0lC/zRUAAAAAAAA+Q==","repeats":1},{"count":1222,"lower_bound":"AWJ4AAAAAAAA+Q==","upper_bound":"AWM4Mk02NAAA/Q==","repeats":1},{"count":1230,"lower_bound":"AWM4OFlLVEgA/g==","upper_bound":"AWNJMk1CZWk4/wAAAAAAAAAA9w==","repeats":1},{"count":1238,"lower_bound":"AWNKTlhhdEU4/2NNAAAAAAAA+Q==","upper_bound":"AWNTYgAAAAAA+g==","repeats":1},{"count":1246,"lower_bound":"AWNUSkYAAAAA+w==","upper_bound":"AWNnb3c5ZVho/29LSDRIAAAA/A==","repeats":1},{"count":1254,"lower_bound":"AWNpQWdaMHJH/2kAAAAAAAAA+A==","upper_bound":"AWN6NGh0TG9P/3RSRQAAAAAA+g==","repeats":1},{"count":1262,"lower_bound":"AWN6UjFmb1cA/g==","upper_bound":"AWRCd2h3Y3pj/3BkbGQAAAAA+w==","repeats":1},{"count":1270,"lower_bound":"AWRFMHY4d1MA/g==","upper_bound":"AWRWUmRNcjFk/2VZamNBSwAA/Q==","repeats":1},{"count":1278,"lower_bound":"AWRXUTc3AAAA/A==","upper_bound":"AWRmWmxveWJU/wAAAAAAAAAA9w==","repeats":1},{"count":1287,"lower_bound":"AWRnTGVZdTRT/1pzdk9lAAAA/A==","upper_bound":"AWUAAAAAAAAA+A==","repeats":3},{"count":1295,"lower_bound":"AWUwUmswNm4w/1NJWkQAAAAA+w==","upper_bound":"AWVFZnRBdG1T/1FYNnoAAAAA+w==","repeats":1},{"count":1303,"lower_bound":"AWVGQmpvT2pT/wAAAAAAAAAA9w==","upper_bound":"AWVWQVFvUkh3/wAAAAAAAAAA9w==","repeats":1},{"count":1311,"lower_bound":"AWVXR3hXek9y/3c4bmYAAAAA+w==","upper_bound":"AWYwQWxyAAAA/A==","repeats":1},{"count":1319,"lower_bound":"AWYxUkl4eFpY/3dtbWY1NgAA/Q==","upper_bound":"AWZIZExkOG5y/zRyQ2YAAAAA+w==","repeats":1},{"count":1327,"lower_bound":"AWZOR1BsQwAA/Q==","upper_bound":"AWZZZDZtbUZX/3RtAAAAAAAA+Q==","repeats":1},{"count":1335,"lower_bound":"AWZmYQAAAAAA+g==","upper_bound":"AWZzWGJnTwAA/Q==","repeats":1},{"count":1343,"lower_bound":"AWZ0RkxOSll3/wAAAAAAAAAA9w==","upper_bound":"AWcxbGlud0RT/zYAAAAAAAAA+A==","repeats":1},{"count":1351,"lower_bound":"AWc0MnoyelZ0/1EwcwAAAAAA+g==","upper_bound":"AWdQZ3hpcnBm/zE4OHVJR3EA/g==","repeats":1},{"count":1359,"lower_bound":"AWdXZnZrNlMA/g==","upper_bound":"AWdsdWNyRkVY/21nRGhvAAAA/A==","repeats":1},{"count":1367,"lower_bound":"AWdvRnF3bjV3/1cAAAAAAAAA+A==","upper_bound":"AWdzYkVINlFG/0wxSnUzdwAA/Q==","repeats":1},{"count":1376,"lower_bound":"AWdzZWJuMWZh/3UAAAAAAAAA+A==","upper_bound":"AWgAAAAAAAAA+A==","repeats":2},{"count":1384,"lower_bound":"AWg0R3AAAAAA+w==","upper_bound":"AWhFS00AAAAA+w==","repeats":1},{"count":1392,"lower_bound":"AWhGAAAAAAAA+Q==","upper_bound":"AWhnbAAAAAAA+g==","repeats":1},{"count":1404,"lower_bound":"AWhpaFNrRwAA/Q==","upper_bound":"AWkAAAAAAAAA+A==","repeats":5},{"count":1412,"lower_bound":"AWkwSTY2aQAA/Q==","upper_bound":"AWk0a1VDaUI4/0p3Sm56AAAA/A==","repeats":1},{"count":1420,"lower_bound":"AWk3MzczWjhj/0JCRTZvaQAA/Q==","upper_bound":"AWlFbTJib0V5/0FRUHdkaQAA/Q==","repeats":1},{"count":1428,"lower_bound":"AWlHN0ttOUoA/g==","upper_bound":"AWlNckxvb3V4/wAAAAAAAAAA9w==","repeats":1},{"count":1436,"lower_bound":"AWlQbmdhUU5F/zNkAAAAAAAA+Q==","upper_bound":"AWljdm8wUjcz/1R0RDlidwAA/Q==","repeats":1},{"count":1444,"lower_bound":"AWlkRkxRbGxv/21LUAAAAAAA+g==","upper_bound":"AWl4eWJCRmx4/2UAAAAAAAAA+A==","repeats":1},{"count":1452,"lower_bound":"AWl6cndwWE0x/1FpAAAAAAAA+Q==","upper_bound":"AWoyOW1OSkw3/3VkAAAAAAAA+Q==","repeats":1},{"count":1460,"lower_bound":"AWo0a1AzQ2ty/1gAAAAAAAAA+A==","upper_bound":"AWpIMUpJTnRw/2FMdEEAAAAA+w==","repeats":1},{"count":1468,"lower_bound":"AWpIWUVOcWlt/0k4dAAAAAAA+g==","upper_bound":"AWpiakMwZ21F/08AAAAAAAAA+A==","repeats":1},{"count":1476,"lower_bound":"AWpjMAAAAAAA+g==","upper_bound":"AWp6Vk8AAAAA+w==","repeats":1},{"count":1484,"lower_bound":"AWsAAAAAAAAA+A==","upper_bound":"AWszeXJGV3c5/1VHYTAAAAAA+w==","repeats":1},{"count":1492,"lower_bound":"AWs2N08wVXQ5/3plYXM2RQAA/Q==","upper_bound":"AWtMa1MyAAAA/A==","repeats":1},{"count":1500,"lower_bound":"AWtOAAAAAAAA+Q==","upper_bound":"AWtZdnIzAAAA/A==","repeats":1},{"count":1510,"lower_bound":"AWtkaFNueTJs/wAAAAAAAAAA9w==","upper_bound":"AWwAAAAAAAAA+A==","repeats":4},{"count":1518,"lower_bound":"AWwwRjJ4NQAA/Q==","upper_bound":"AWxCMwAAAAAA+g==","repeats":1},{"count":1526,"lower_bound":"AWxCVwAAAAAA+g==","upper_bound":"AWxlOFRmaE10/3cAAAAAAAAA+A==","repeats":1},{"count":1534,"lower_bound":"AWxmd05RAAAA/A==","upper_bound":"AWxzVWhNTUVX/0R4Q1VMAAAA/A==","repeats":1},{"count":1543,"lower_bound":"AWx0QVNoSGx1/213WEFBUAAA/Q==","upper_bound":"AW0AAAAAAAAA+A==","repeats":5},{"count":1551,"lower_bound":"AW03QwAAAAAA+g==","upper_bound":"AW1DYzJ2blVM/0pTAAAAAAAA+Q==","repeats":1},{"count":1559,"lower_bound":"AW1ENWo1eQAA/Q==","upper_bound":"AW1ZVHRVT3No/3g1WEtwaFkA/g==","repeats":1},{"count":1567,"lower_bound":"AW1haE91VWw2/1dLRzkAAAAA+w==","upper_bound":"AW1sRFk2RXkA/g==","repeats":1},{"count":1575,"lower_bound":"AW1td0Z0MgAA/Q==","upper_bound":"AW11UwAAAAAA+g==","repeats":1},{"count":1583,"lower_bound":"AW12YzZyN0k1/1hVd1FIQVQA/g==","upper_bound":"AW42d0VXZ2FY/2kAAAAAAAAA+A==","repeats":1},{"count":1591,"lower_bound":"AW44NU1IMnB4/1phY2h6AAAA/A==","upper_bound":"AW5FWTN1RQAA/Q==","repeats":1},{"count":1599,"lower_bound":"AW5JYWU1WHBP/0lCYmwAAAAA+w==","upper_bound":"AW5UaTFvZlYx/3pBTwAAAAAA+g==","repeats":1},{"count":1607,"lower_bound":"AW5XNDRRcjFV/wAAAAAAAAAA9w==","upper_bound":"AW5obTgAAAAA+w==","repeats":1},{"count":1615,"lower_bound":"AW5pSXQ0TTd1/2dTbzFVawAA/Q==","upper_bound":"AW5zdTE5eWJK/3gAAAAAAAAA+A==","repeats":1},{"count":1624,"lower_bound":"AW52ZzlkZThU/2d2QgAAAAAA+g==","upper_bound":"AW8AAAAAAAAA+A==","repeats":5},{"count":1632,"lower_bound":"AW8weXBkZXF1/0pQUkttdGcA/g==","upper_bound":"AW9CUEFHZUpK/3k5UwAAAAAA+g==","repeats":1},{"count":1640,"lower_bound":"AW9DAAAAAAAA+Q==","upper_bound":"AW9Tc1JkZzk3/2kAAAAAAAAA+A==","repeats":1},{"count":1648,"lower_bound":"AW9VN3RGYjZ0/0xFM2lhAAAA/A==","upper_bound":"AW9rVXY2OWdo/3oAAAAAAAAA+A==","repeats":1},{"count":1656,"lower_bound":"AW9xZUJkSmpI/wAAAAAAAAAA9w==","upper_bound":"AXAwazUySHho/2ZwAAAAAAAA+Q==","repeats":1},{"count":1664,"lower_bound":"AXA1RlNsb3ll/3UAAAAAAAAA+A==","upper_bound":"AXBKM0EzAAAA/A==","repeats":1},{"count":1672,"lower_bound":"AXBLVk1kUjZr/2lIOEs3VwAA/Q==","upper_bound":"AXBiM3AAAAAA+w==","repeats":1},{"count":1680,"lower_bound":"AXBiVHFacVlR/wAAAAAAAAAA9w==","upper_bound":"AXBsMgAAAAAA+g==","repeats":1},{"count":1688,"lower_bound":"AXBsTHR3AAAA/A==","upper_bound":"AXB4UGl3YmlG/2hNbGZDSQAA/Q==","repeats":1},{"count":1696,"lower_bound":"AXB5VWo2MkNN/25pZ0MyYQAA/Q==","upper_bound":"AXFFZXRDbnMA/g==","repeats":1},{"count":1704,"lower_bound":"AXFIMzliNmhM/0ZBQmcAAAAA+w==","upper_bound":"AXFlUDJlAAAA/A==","repeats":1},{"count":1715,"lower_bound":"AXFrOQAAAAAA+g==","upper_bound":"AXIAAAAAAAAA+A==","repeats":5},{"count":1723,"lower_bound":"AXIwAAAAAAAA+Q==","upper_bound":"AXJBYlJRaHBh/0VGT1c3NAAA/Q==","repeats":1},{"count":1731,"lower_bound":"AXJDS2hrAAAA/A==","upper_bound":"AXJPb3FFZ25W/2MycEhSAAAA/A==","repeats":1},{"count":1739,"lower_bound":"AXJUUnBoUEMw/2JoAAAAAAAA+Q==","upper_bound":"AXJneUdqdFpE/0RjQgAAAAAA+g==","repeats":1},{"count":1747,"lower_bound":"AXJoVlZaeDB4/3dFVgAAAAAA+g==","upper_bound":"AXJ4dTVZAAAA/A==","repeats":1},{"count":1755,"lower_bound":"AXJ6YjdTS21o/0xrWkoAAAAA+w==","upper_bound":"AXMzSXdZRFp3/2NkVTBuUgAA/Q==","repeats":1},{"count":1763,"lower_bound":"AXMzbWVKdUNT/1ppdkQAAAAA+w==","upper_bound":"AXNKSlJkdVEA/g==","repeats":1},{"count":1771,"lower_bound":"AXNLSFdLc0pM/0h5AAAAAAAA+Q==","upper_bound":"AXNSOFFiZzA5/24AAAAAAAAA+A==","repeats":1},{"count":1779,"lower_bound":"AXNSVUdHOHIx/zN3UloydFkA/g==","upper_bound":"AXNnREIAAAAA+w==","repeats":1},{"count":1787,"lower_bound":"AXNqa1NJQVBE/wAAAAAAAAAA9w==","upper_bound":"AXN5Y2s1AAAA/A==","repeats":1},{"count":1795,"lower_bound":"AXN6dmFJTVVW/wAAAAAAAAAA9w==","upper_bound":"AXQ5T2l0VzhG/1BWSUxMAAAA/A==","repeats":1},{"count":1803,"lower_bound":"AXQ5bnpIaQAA/Q==","upper_bound":"AXRRUDh3elYA/g==","repeats":1},{"count":1811,"lower_bound":"AXRUM2lNZ2Fs/256Y1kAAAAA+w==","upper_bound":"AXRpZwAAAAAA+g==","repeats":1},{"count":1819,"lower_bound":"AXRpcEs3eElT/1g0R0JwZU4A/g==","upper_bound":"AXUAAAAAAAAA+A==","repeats":2},{"count":1827,"lower_bound":"AXUxektIYVZ3/wAAAAAAAAAA9w==","upper_bound":"AXU3d3Nhc0hw/wAAAAAAAAAA9w==","repeats":1},{"count":1835,"lower_bound":"AXU4S00AAAAA+w==","upper_bound":"AXVMck1SYllE/2dnUXM2NgAA/Q==","repeats":1},{"count":1843,"lower_bound":"AXVPVjVQZDhp/2daaDRYbzQA/g==","upper_bound":"AXVZVFJvAAAA/A==","repeats":1},{"count":1851,"lower_bound":"AXVaY1cAAAAA+w==","upper_bound":"AXVrRGJBclFk/1psN2hWSwAA/Q==","repeats":1},{"count":1859,"lower_bound":"AXVrVEdZdTFk/2ZKAAAAAAAA+Q==","upper_bound":"AXV6AAAAAAAA+Q==","repeats":1},{"count":1867,"lower_bound":"AXYAAAAAAAAA+A==","upper_bound":"AXZCbkdEAAAA/A==","repeats":1},{"count":1875,"lower_bound":"AXZJcEVHMGth/2UAAAAAAAAA+A==","upper_bound":"AXZYY09MTTRr/1MAAAAAAAAA+A==","repeats":1},{"count":1883,"lower_bound":"AXZZAAAAAAAA+Q==","upper_bound":"AXZwNUsxUkNT/3AAAAAAAAAA+A==","repeats":1},{"count":1891,"lower_bound":"AXZxRWxUYmJ5/1o1czF1ekIA/g==","upper_bound":"AXZ5RWQxbjNp/zJ3ZGxEbWwA/g==","repeats":1},{"count":1899,"lower_bound":"AXZ5enA1bzBX/1p5bGhZY3IA/g==","upper_bound":"AXdJR1pCaFg0/2ZKAAAAAAAA+Q==","repeats":1},{"count":1907,"lower_bound":"AXdKZjgAAAAA+w==","upper_bound":"AXdiWE94d2hR/3A5d1llAAAA/A==","repeats":1},{"count":1915,"lower_bound":"AXdkUDhSUGtm/zBHOFhtVHYA/g==","upper_bound":"AXd3RjUAAAAA+w==","repeats":1},{"count":1923,"lower_bound":"AXgAAAAAAAAA+A==","upper_bound":"AXhDcTkAAAAA+w==","repeats":1},{"count":1931,"lower_bound":"AXhGWFZ4eXNv/1YyAAAAAAAA+Q==","upper_bound":"AXhSZEVkWTd3/2FtZVA4AAAA/A==","repeats":1},{"count":1939,"lower_bound":"AXhVAAAAAAAA+Q==","upper_bound":"AXhtZmJvWHdV/wAAAAAAAAAA9w==","repeats":1},{"count":1947,"lower_bound":"AXhuZXJkU0J6/2NyT2JuSHEA/g==","upper_bound":"AXk1MWhzNAAA/Q==","repeats":1},{"count":1955,"lower_bound":"AXk1U1pacAAA/Q==","upper_bound":"AXlRckh6azhh/0djVDRUTQAA/Q==","repeats":1},{"count":1963,"lower_bound":"AXlSRQAAAAAA+g==","upper_bound":"AXlzUnZLY0JC/zdpc0xRAAAA/A==","repeats":1},{"count":1971,"lower_bound":"AXl0RUsAAAAA+w==","upper_bound":"AXo1AAAAAAAA+Q==","repeats":1},{"count":1979,"lower_bound":"AXo1SnV0NwAA/Q==","upper_bound":"AXpCaEpKanBO/1Q0AAAAAAAA+Q==","repeats":1},{"count":1987,"lower_bound":"AXpHaAAAAAAA+g==","upper_bound":"AXpkAAAAAAAA+Q==","repeats":1},{"count":1995,"lower_bound":"AXpoblIAAAAA+w==","upper_bound":"AXp4UnpHWk9H/0hBZU5qOFoA/g==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,3,0,2,1,2,2,2,1,0,0,1,1,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,1,3,1,1,1,0,0,0,2,1,0,3,0,0,1,1,2,1,1,4,0,0,0,0,0,0,3,2,0,0,2,0,1,1,1,1,1,0,0,0,0,1,0,1,0,1,0,0,1,0,2,0,2,0,1,0,1,1,1,1,3,1,0,1,3,0,0,3,2,0,0,0,1,0,4,1,0,2,1,0,2,3,0,0,0,0,0,2,1,0,2,2,1,1,1,3,2,1,2,2,2,0,0,4,0,1,0,1,2,1,0,1,2,1,1,1,1,0,1,0,2,1,1,2,1,0,1,2,2,1,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,6,0,0,0,0,1,1,1,0,0,1,2,0,0,2,2,0,1,0,2,0,1,1,0,1,2,1,0,0,0,0,2,0,0,1,2,0,0,0,0,1,0,1,0,0,2,1,1,1,0,1,1,1,1,0,0,1,0,1,0,0,0,0,2,1,0,2,1,0,1,1,1,3,1,0,1,1,1,1,0,2,0,2,1,2,0,1,2,2,2,1,1,0,1,5,0,0,1,0,3,0,0,0,1,0,0,2,0,0,1,0,3,0,0,0,0,0,0,1,0,2,0,1,1,0,0,0,1,1,0,1,2,1,4,1,1,1,1,0,1,1,0,0,0,0,2,0,1,1,1,0,0,0,0,1,1,2,4,2,1,1,1,1,0,1,0,0,2,1,0,0,0,1,1,1,4,0,1,0,1,0,0,1,1,3,0,5,0,2,1,4,0,0,0,1,0,1,0,5,0,0,1,1,1,0,1,2,0,2,0,1,0,1,1,1,1,3,1,0,2,5,1,0,0,2,0,0,1,0,0,1,2,0,1,0,0,0,0,1,0,1,0,0,3,0,2,0,0,4,3,0,1,0,1,1,1,1,1,0,4,1,0,3,0,0,1,0,0,0,1,1,1,1,2,1,0,2,1,4,1,0,1,1,0,0,1,2,0,1,0,0,3,2,2,2,0,1,1,2,1,1,1,1,0,1,0,1,1,1,1,2,0,0,1,2,1,0,0,1,1,0,1,0,0,1,0,3,7,0,1,1,0,0,0,2,2,2,0,4,1,1,0,0,1,2,0,0,1,1,1,2,3,3,2,0,1,0,0,0,0,2,6,0,1,1,0,0,0,2,1,1,2,1,1,1,2,1,0,1,0,1,1,2,2,0,1,1,1,1,1,2,1,0,2,0,1,1,0,1,3,0,1,1,1,1,0,0,0,1,0,1,1,1,1,1,3,0,1,0,0,0,0,6,1,1,1,1,0,0,2,0,2,2,0,0,2,2,1,0,1,2,0,2,1,2,0,0,1,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,2,0,1,1,2,1,2,1,0,0,0,1,2,0,1,0,2,1,5,1,1,0,3,1,1,0,1,2,2,1,1,1,1,0,1,0,3,1,1,0,2,0,0,3,1,1,1,2,0,0,3,0,2,1,1,0,2,2,4,1,1,1,1,4,0,2,0,3,0,1,1,0,6,2,0,1,1,1,0,1,1,0,0,2,0,1,3,1,1,0,2,0,0,1,0,0,1,1,1,0,1,1,1,0,1,1,1,0,0,1,1,1,2,0,2,0,0,2,0,1,1,1,2,0,1,2,1,1,0,0,0,0,1,1,2,1,1,0,2,1,0,0,0,2,2,5,1,2,1,0,0,0,0,1,0,4,2,0,1,1,1,0,2,1,1,1,1,0,1,1,0,3,1,0,0,1,1,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,1,1,4,0,0,2,0,5,2,2,1,0,1,1,0,0,1,0,3,1,0,2,1,0,0,2,2,2,2,1,0,4,0,1,2,1,0,1,1,2,0,1,1,0,0,0,0,3,1,2,4,1,0,1,4,1,1,1,2,0,0,3,0,1,3,0,0,1,3,0,1,0,1,1,0,0,2,2,2,1,0,2,0,0,1,2,1,0,6,3,1,1,1,0,0,2,1,0,1,1,0,2,1,0,2,1,0,1,0,1,1,2,1,2,1,0,0,0,1,1,0,0,0,1,8,1,1,1,0,0,3,0,2,1,1,1,0,1,0,0,2,1,0,0,0,0,2,1,1,1,2,0,0,0,0,2,2,0,0,0,1,1,1,1,1,0,1,0,0,2,1,2,0,1,0,0,0,1,0,1,1,1,1,0,1,1,0,2,1,0,0,0,1,0,1,3,0,0,2,1,1,0,1,2,1,0,1,0,1,0,0,0,1,1,1,0,0,2,2,0,0,1,1,2,1,0,0,0,1,0,0,1,1,1,0,0,1,0,1,0,0,0,0,2,0,1,0,0,0,2,0,1,1,0,0,0,2,0,3,0,0,1,3,2,1,0,2,1,1,1,2,2,0,0,0,0,2,0,0,0,0,0,2,2,1,2,0,2,1,1,0,0,0,2,1,1,1,2,0,1,1,0,0,0,2,1,2,1,1,0,2,1,1,0,0,1,3,2,0,0,1,4,1,0,0,0,0,2,0,0,1,0,0,1,0,1,0,0,1,1,3,0,1,2,1,1,1,2,0,1,0,1,0,3,3,1,0,2,0,0,0,1,5,0,2,0,1,0,0,0,1,1,2,2,3,0,1,2,1,1,2,0,2,0,1,0,0,0,2,3,1,0,1,0,1,0,0,0,0,0,0,1,2,0,0,0,2,0,1,1,0,1,0,1,1,0,1,0,1,2,0,4,1,2,1,1,1,2,1,1,1,0,0,0,0,1,0,6,0,2,3,0,3,0,1,0,1,0,0,2,2,1,1,0,2,0,1,1,0,0,1,2,2,2,0,4,3,0,1,1,1,2,1,1,0,0,0,0,0,1,1,1,1,2,1,1,0,0,3,1,2,1,1,1,2,2,1,1,1,0,2,2,1,0,0,1,5,0,3,0,2,2,2,0,0,0,1,1,0,1,2,1,1,0,0,1,5,1,1,0,2,0,2,1,2,0,4,0,0,1,4,1,0,1,1,0,1,2,1,1,0,1,1,0,3,0,1,0,0,2,1,0,0,1,1,0,2,2,1,1,1,0,1,2,3,1,3,0,2,1,4,0,1,0,1,0,0,1,0,2,5,2,0,0,0,0,2,2,1,1,1,1,1,2,0,1,1,1,0,0,1,2,0,3,3,4,1,1,0,1,1,1,0,0,2,1,0,0,1,0,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2,1,1,0,1,2,1,1,1,0,0,0,0,2,2,0,1,2,0,1,2,3,1,0,1,4,2,0,1,0,1,0,1,0,2,1,0,1,1,1,0,2,3,1,2,0,1,0,0,0,0,1,0,1,2,0,1,0,3,2,1,3,1,2,0,1,0,1,0,3,0,1,2,0,3,1,0,1,0,0,1,3,0,1,1,1,3,2,0,3,0,1,1,1,1,2,0,1,1,1,2,1,0,0,4,1,0,1,1,1,1,0,1,1,1,0,1,1,0,1,2,1,2,1,2,2,1,2,2,2,0,0,1,0,1,0,1,0,2,1,2,1,1,0,1,0,1,0,6,0,1,1,2,0,1,5,3,0,2,2,0,0,0,0,1,1,0,0,1,1,2,0,3,1,0,0,6,1,0,1,1,0,1,4,1,0,0,1,3,1,4,0,0,0,0,3,0,2,1,1,2,2,0,3,1,0,2,1,0,1,0,1,3,0,0,2,2,1,1,0,1,3,0,0,0,0,1,0,0,0,0,0,1,2,3,0,1,2,0,1,0,0,1,1,0,3,5,0,0,0,0,1,0,0,0,0,1,3,6,2,2,2,2,1,0,0,0,2,1,4,3,1,0,0,1,0,1,0,1,1,1,0,2,1,1,1,1,2,2,1,0,3,0,0,1,1,2,1,0,1,1,0,2,0,1,1,2,1,2,1,4,3,0,1,2,1,2,2,1,0,1,1,1,2,1,1,2,2,7,0,3,3,1,0,1,0,3,0,0,0,1,1,0,1,1,1,0,1,3,2,0,3,1,2,1,0,1,2,0,1,0,0,0,1,1,0,1,1,1,0,4,1,1,2,0,3,1,0,2,1,0,1,2,7,3,0,0,2,0,2,0,2,0,5,0,1,3,1,1,1,3,2,1,1,1,1,0,0,2,0,1,0,3,0,0,0,0,1,2,1,0,1,0,0,2,2,0,4,1,1,2,0,0,1,1,1,0,1,0,2,2,0,0,2,2,2,4,0,1,1,2,0,0,1,1,0,0,0,2,1,0,0,4,4,0,0,1,1,0,2,2,0,0,1,2,0,0,0,2,0,1,0,1,0,2,0,0,2,0,1,3,2,0,0,1,1,1,0,0,1,4,3,1,1,3,0,0,1,0,1,2,1,0,0,2,3,2,0,0,3,0,0,1,1,0,5,0,1,2,0,0,0,2,2,1,0,1,0,1,0,2,0,0,0,0,4,1,0,0,0,2,0,0,1,4,2,1,2,3,0,0,0,2,0,0,2,0,1,1,0,0,1,0]},{"counters":[1,0,1,1,0,1,2,1,1,1,0,0,1,0,1,3,0,3,1,0,0,0,1,0,2,0,1,1,0,1,1,2,1,3,0,0,0,0,1,1,1,2,2,1,1,1,1,1,1,1,2,3,0,1,0,0,1,1,2,0,0,1,3,0,2,1,0,2,2,0,0,0,0,0,2,0,0,0,0,0,3,0,0,3,0,1,0,0,0,1,2,0,1,1,1,1,0,1,1,0,2,0,1,1,1,0,2,0,0,0,0,0,1,1,3,2,1,0,2,2,3,0,1,0,0,0,0,1,1,3,3,1,1,3,0,0,2,1,2,1,0,2,0,1,0,2,0,1,0,2,0,2,1,2,2,0,0,1,1,1,0,3,1,0,2,1,2,2,0,1,1,1,1,1,2,1,2,1,0,2,0,1,0,2,3,0,6,0,3,0,1,2,2,0,0,1,0,0,0,0,2,0,2,2,3,2,0,0,1,0,2,1,0,0,0,1,1,2,1,1,1,3,1,1,1,5,1,2,1,4,2,0,1,2,1,1,1,1,0,1,0,1,1,0,1,0,2,0,0,1,0,0,2,0,1,0,2,2,1,0,2,1,0,1,0,0,3,0,0,3,3,2,1,2,1,4,0,1,2,4,0,0,0,0,2,1,2,1,1,2,1,0,0,0,0,0,0,0,1,2,0,1,1,2,1,1,0,0,1,0,1,2,4,0,1,1,0,0,5,3,0,0,1,3,1,0,0,1,1,0,2,1,0,2,0,2,1,2,0,1,1,0,0,0,5,1,0,0,1,2,0,5,0,2,1,1,3,2,2,0,0,1,0,1,1,1,0,1,1,2,1,0,2,0,1,3,7,1,0,0,2,1,0,0,1,0,1,0,1,0,3,1,3,1,2,0,2,2,7,1,2,1,0,1,0,0,3,0,0,0,2,1,1,1,3,2,0,1,1,1,1,0,0,2,0,0,2,0,2,1,0,0,1,0,0,2,2,3,0,2,0,1,0,2,1,1,0,0,2,0,0,0,0,0,2,2,1,4,1,0,0,2,0,0,0,0,0,0,1,0,1,8,0,3,2,0,0,0,1,1,1,1,0,1,1,1,2,2,0,0,1,0,0,1,1,0,1,0,0,0,0,2,0,1,3,2,0,2,0,0,2,0,0,0,3,2,1,1,1,0,1,3,1,0,1,1,3,1,6,0,3,0,1,1,2,1,1,0,0,0,1,0,1,3,2,0,2,1,1,2,2,2,0,4,1,0,0,0,1,0,1,0,0,0,0,0,2,1,0,0,1,2,0,1,0,0,2,1,0,0,0,1,0,2,1,0,0,0,3,1,0,1,1,2,2,0,1,1,2,0,2,0,1,1,1,0,1,6,0,0,2,0,1,0,4,1,1,0,2,0,1,4,3,0,1,1,1,0,0,2,0,1,2,0,1,1,0,0,1,0,1,1,0,1,0,1,0,0,0,1,0,2,1,2,1,4,0,2,1,3,0,1,1,2,2,0,0,0,1,3,0,1,1,1,1,0,0,0,2,2,0,0,2,1,2,0,1,0,1,0,0,0,0,2,1,0,0,1,3,1,0,0,0,1,1,2,2,1,0,2,0,0,3,0,1,0,0,1,0,2,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,1,1,1,0,0,1,1,0,0,1,1,0,1,2,0,0,2,0,4,3,1,1,1,2,2,1,1,2,1,0,1,0,0,2,0,1,2,0,0,0,1,0,0,0,0,1,1,0,0,0,0,2,1,0,1,0,0,2,1,1,2,3,2,0,0,0,1,0,0,0,2,0,1,0,0,0,0,0,1,2,0,4,3,2,2,1,0,2,1,1,1,0,0,0,2,0,2,1,0,2,2,0,2,0,1,0,2,1,1,1,0,1,0,0,0,1,1,1,0,0,1,2,1,2,1,1,2,1,1,0,3,0,0,3,1,1,0,0,1,1,0,0,2,0,1,1,2,1,0,0,1,2,1,0,0,2,1,0,0,0,3,1,1,0,0,3,1,1,1,1,1,1,1,1,2,1,1,2,1,0,0,0,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,3,0,1,0,2,1,1,0,0,2,2,1,0,2,1,1,1,2,0,1,1,3,1,0,1,1,0,0,1,0,0,0,0,2,1,2,0,2,2,2,0,1,0,1,3,0,1,2,0,2,0,1,1,0,1,0,1,0,1,3,1,2,1,0,0,1,1,0,0,1,0,0,1,0,2,0,3,0,0,3,1,1,1,0,3,1,1,1,0,2,3,1,3,1,0,0,1,4,0,2,0,0,0,2,0,0,1,0,1,1,0,1,1,1,1,1,3,2,1,1,0,0,1,2,2,1,1,0,2,1,1,2,2,0,1,1,4,0,0,1,1,3,0,1,2,0,3,0,0,0,2,0,1,2,0,1,2,1,0,2,0,0,2,1,3,3,0,1,1,1,0,2,2,1,0,0,0,0,2,0,3,2,0,0,2,2,1,1,2,2,0,2,1,1,0,1,3,1,2,0,1,1,0,0,0,0,0,1,1,1,1,0,1,1,0,0,1,0,0,0,1,1,0,1,0,1,2,0,0,1,0,0,2,2,1,1,2,2,7,0,1,2,0,2,1,1,1,2,2,0,1,1,0,2,1,2,0,4,0,0,3,2,1,1,0,0,1,1,1,1,3,1,1,1,1,0,0,1,1,0,0,0,0,3,4,2,0,0,1,1,4,1,1,0,1,0,1,0,3,0,0,0,2,0,3,0,1,1,0,0,5,1,0,4,1,1,0,1,0,5,0,0,2,1,3,2,0,0,2,2,0,0,0,1,0,6,0,0,1,0,0,0,2,0,3,1,0,0,0,1,0,2,3,0,1,0,1,2,1,0,0,0,3,4,0,0,1,0,0,1,1,1,1,1,1,0,3,1,0,1,1,2,1,4,1,0,4,0,0,0,0,0,1,1,0,0,3,0,0,2,1,0,0,0,1,1,4,2,0,2,0,1,2,0,2,2,0,0,1,0,2,2,0,0,0,0,0,0,0,2,2,0,0,1,0,1,4,1,0,1,1,2,1,2,1,2,2,0,1,0,1,0,2,0,2,0,0,0,0,2,2,1,2,3,1,0,2,2,1,2,1,2,1,0,0,0,1,1,0,0,1,1,1,1,2,1,2,0,1,1,1,3,1,0,1,0,1,2,1,0,1,1,0,1,1,0,0,1,0,0,0,0,0,2,0,1,1,0,0,0,0,0,3,1,0,0,0,0,0,1,1,1,2,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,3,3,2,1,0,2,0,1,0,0,0,2,0,2,0,0,0,4,2,0,1,0,1,0,3,1,1,0,3,1,1,0,2,0,3,2,0,1,2,0,1,2,1,1,2,1,3,0,3,2,0,2,1,1,1,0,2,1,1,3,1,0,2,0,1,4,0,3,0,0,4,0,1,7,3,0,0,0,2,0,3,3,2,0,1,1,1,0,1,3,2,1,2,0,0,1,1,1,2,0,0,0,2,0,2,1,2,0,2,0,1,0,3,0,1,0,0,3,2,0,2,1,1,0,0,0,2,2,0,1,2,0,0,0,1,2,2,1,1,0,1,0,1,2,2,3,0,1,1,1,0,4,0,1,2,0,1,0,0,3,0,2,0,1,0,2,0,1,2,0,0,0,1,1,1,0,3,1,2,0,0,0,0,0,1,3,2,3,3,2,1,2,0,0,0,0,1,1,1,1,1,1,0,3,0,1,1,0,1,0,1,1,0,1,0,1,0,1,0,2,2,0,0,2,2,0,2,2,0,0,1,2,0,1,0,1,0,1,0,1,0,4,1,1,1,0,1,0,0,2,0,0,2,2,3,0,2,1,2,1,0,0,0,0,4,0,2,0,0,2,3,1,1,0,1,0,1,0,3,2,1,1,1,1,0,0,1,2,2,1,1,1,0,0,0,1,1,2,0,0,2,0,1,0,0,2,1,0,0,1,0,1,0,2,1,1,1,0,1,0,0,0,0,1,1,3,2,1,1,0,1,1,2,1,1,2,1,0,0,2,0,0,2,1,1,0,0,1,0,0,1,0,1,0,0,0,1,2,0,2,1,1,3,2,0,1,2,1,0,0,1,2,2,1,4,1,0,2,1,0,1,2,1,0,0,1,0,1,3,1,2,2,0,1,2,0,3,2,0,1,0,2,0,0,0,0,4,7,1,0,0,0,2,2,1,2,1,0,1,1,0,0,4,0,1,2,0,1,2,1,0,5,0,1,1,3,2,1,2,0,1,1,0,1,0,0,1,0,2,1,1,1,0,0,2,0,2,2,1,1,1,0,0,4,1,0,0,1,1,0,3,0,1,1,0,1,1,0,0,2,2,0,1,1,2,0,0,0,0,1,1,1,0,1,1,2,1,1,0,0,2,0,1,1,1,1,0,1,1,0,2,2,0,1,2,1,1,0,2,3,7,1,1,0,2,0,0,0,2,1,2,2,2,1,1,1,3,1,0,1,2,0,2,1,2,0,1,1,1,1,1,0,3,1,1,0,0,1,0,2,1,0]},{"counters":[2,0,1,0,0,0,1,1,2,1,1,2,0,1,1,1,0,0,2,2,1,1,1,0,1,1,1,4,2,2,0,1,1,0,0,1,1,3,0,1,0,4,0,1,1,0,1,0,0,1,4,0,3,1,1,0,0,0,2,0,2,2,0,1,2,1,2,0,0,1,0,2,1,2,3,2,3,2,0,1,0,2,1,2,0,1,1,1,1,0,0,2,0,1,1,3,3,4,0,1,0,3,0,2,1,1,1,1,0,0,1,4,2,2,0,1,0,2,1,3,0,2,1,3,1,1,2,0,2,1,0,1,0,1,1,0,0,0,2,0,0,0,1,2,1,1,1,1,1,0,0,0,1,2,1,0,0,0,0,0,0,2,2,2,1,0,0,0,0,4,0,1,1,0,1,2,0,1,2,0,0,0,0,0,1,3,1,1,0,2,1,0,1,0,0,2,1,1,2,1,1,1,0,1,1,3,0,0,0,0,2,1,1,2,2,1,1,0,0,0,0,1,0,0,0,1,3,0,0,3,0,1,1,2,0,2,1,2,0,2,0,1,0,3,2,2,0,1,1,1,2,0,0,0,1,1,3,2,0,1,0,0,0,0,0,0,1,0,1,1,4,1,1,0,2,3,0,2,2,2,0,0,1,0,2,0,1,2,0,2,1,2,1,0,1,6,0,0,1,1,1,0,0,3,1,2,1,1,2,2,2,2,0,0,2,3,1,4,2,0,3,0,2,2,0,0,0,1,1,0,1,1,0,2,2,2,0,1,0,1,2,2,0,0,1,0,0,1,2,0,0,0,2,0,0,0,0,1,0,0,0,4,0,0,2,1,0,2,0,2,1,0,0,3,2,3,0,3,1,1,1,3,1,0,0,1,1,1,2,1,2,3,0,0,1,2,0,0,0,3,2,1,1,2,1,7,0,0,1,0,0,1,0,1,0,0,2,0,0,0,0,1,2,0,0,2,0,2,2,0,1,2,1,1,5,1,1,2,1,3,1,2,0,1,1,1,1,1,3,0,0,0,1,1,0,2,1,0,1,1,2,1,0,2,0,3,1,0,1,1,0,0,3,0,1,0,2,0,1,0,0,0,0,2,0,2,0,0,3,1,0,0,0,1,2,1,0,0,1,0,1,0,1,1,3,2,0,1,1,1,1,0,5,1,0,1,0,2,1,1,1,0,1,3,0,1,0,1,0,0,0,0,1,3,0,0,0,1,1,1,0,2,0,2,2,0,0,2,0,2,2,0,1,0,4,2,2,1,0,0,1,3,0,1,0,0,1,0,0,0,1,2,1,1,0,0,0,0,1,1,1,0,0,1,2,1,0,1,2,1,1,0,0,0,1,2,1,2,1,0,0,0,3,1,1,0,1,3,0,2,0,0,1,1,0,1,1,0,0,0,0,0,1,0,0,2,1,1,3,0,1,0,1,0,0,1,3,0,0,0,1,1,1,2,1,0,1,1,2,1,2,0,0,1,3,0,2,0,1,1,0,2,0,1,6,0,1,3,2,1,1,2,2,0,2,1,0,1,1,0,0,1,7,0,0,1,2,5,0,1,1,1,3,0,1,1,7,2,1,2,0,1,0,2,3,0,2,0,1,1,2,0,1,1,2,0,1,2,1,1,2,1,0,1,1,0,1,3,0,0,0,0,1,1,0,1,1,1,0,2,2,0,0,0,0,3,1,1,1,0,0,1,0,0,1,1,1,0,2,0,1,0,1,0,1,0,1,0,0,0,2,0,2,1,2,1,0,0,0,2,1,0,1,7,1,1,0,0,3,1,0,0,1,1,0,6,3,1,3,2,1,1,0,1,0,0,0,2,2,0,0,1,1,1,0,1,0,0,3,1,0,1,1,0,0,1,1,2,0,0,2,1,1,1,1,1,0,1,1,0,0,1,1,1,2,1,1,0,2,2,1,1,2,0,1,1,2,0,0,2,1,0,3,1,1,1,2,0,0,0,2,2,1,2,1,1,1,1,1,2,3,1,1,1,2,0,1,2,1,1,0,2,1,1,0,0,1,2,0,0,1,1,0,1,0,0,1,0,1,2,1,1,0,1,0,0,2,1,2,0,1,0,2,6,1,3,0,1,1,1,0,1,0,2,0,0,1,2,1,0,0,0,8,1,1,2,3,0,0,3,0,1,1,2,0,2,1,1,0,0,1,3,0,0,0,0,1,1,1,1,2,0,1,0,0,2,0,1,2,0,1,0,0,2,0,0,0,2,0,0,0,4,0,0,0,1,1,0,1,2,0,1,1,1,0,1,2,1,0,3,1,1,0,0,1,2,0,0,1,1,0,3,2,1,1,1,2,0,1,2,0,1,1,1,1,2,1,2,0,0,0,3,3,0,0,1,1,0,1,1,1,1,1,2,3,1,0,0,1,0,1,3,2,2,1,2,2,2,1,2,0,1,2,1,0,2,2,2,2,0,0,0,2,1,3,2,0,0,1,2,0,0,4,4,0,0,2,1,0,0,1,2,2,2,3,0,2,1,1,0,0,2,0,0,2,1,2,3,0,1,1,1,0,0,0,1,2,0,1,0,1,2,2,0,0,1,0,1,0,1,2,3,1,1,1,3,1,0,1,1,0,5,2,1,6,0,2,0,0,0,2,3,4,1,0,3,1,1,2,1,1,0,0,0,0,1,0,0,1,2,0,0,0,1,1,0,0,1,1,0,2,0,1,1,0,2,2,1,4,1,0,0,0,0,1,0,0,4,2,0,0,3,1,1,3,1,0,7,0,0,0,3,1,1,0,0,1,0,0,0,1,0,1,1,1,0,1,0,0,0,1,1,1,1,1,0,1,0,1,0,3,0,0,1,0,1,3,0,1,1,1,1,0,1,2,1,2,1,4,2,2,1,0,4,1,2,1,2,6,0,1,0,1,1,2,1,3,0,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,3,4,0,1,1,1,0,1,2,1,1,3,0,0,0,0,1,2,1,0,0,2,0,0,0,3,0,0,1,0,0,0,0,1,0,2,0,2,1,0,2,0,3,0,2,2,1,1,3,0,1,2,0,1,0,0,0,1,1,0,0,1,1,0,0,1,0,0,2,2,1,0,0,1,3,1,0,1,1,0,2,1,0,0,0,2,0,0,0,3,1,0,0,2,1,1,0,1,1,2,1,2,0,1,1,2,2,2,0,4,0,1,3,1,1,2,2,1,0,0,1,2,1,0,0,0,0,0,1,1,0,0,0,1,1,1,1,1,1,3,1,2,0,2,1,0,0,0,0,1,2,1,1,6,0,2,0,1,1,2,1,2,0,2,0,0,1,0,1,3,0,1,2,0,1,1,2,2,1,0,1,0,2,3,4,5,0,0,2,0,2,0,0,2,0,2,0,0,0,1,0,1,1,2,1,0,0,0,2,0,0,0,0,1,1,2,0,0,0,0,0,1,1,2,1,2,0,2,0,1,2,1,0,3,0,0,0,1,1,0,3,2,1,2,1,0,0,2,1,3,1,1,0,1,0,0,2,2,0,3,1,1,1,0,0,1,2,1,2,0,2,0,3,0,1,0,2,0,0,0,0,1,1,1,1,1,2,2,0,0,2,1,0,0,0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,0,2,1,3,1,0,0,0,1,1,0,0,4,0,1,0,0,3,1,0,1,0,0,1,1,1,2,0,2,1,1,2,3,3,0,1,1,1,0,0,0,1,0,1,0,4,1,1,0,0,0,0,2,0,3,2,0,0,0,0,0,0,0,0,0,2,1,1,1,0,0,2,2,1,0,3,2,0,3,1,1,1,0,0,1,0,1,0,2,1,1,1,0,0,1,1,0,2,2,3,2,1,1,2,1,0,2,1,1,0,0,1,1,2,0,0,1,1,1,2,0,0,2,1,2,0,0,1,0,0,1,3,2,0,0,1,1,0,0,1,0,1,1,0,1,0,0,0,0,2,1,1,0,0,0,1,0,1,1,0,0,2,0,1,0,3,0,1,3,1,2,1,0,0,1,0,0,0,3,1,1,2,2,0,1,2,0,0,2,1,0,0,1,1,0,0,1,1,0,0,0,1,0,1,1,2,1,0,0,1,1,1,0,0,0,4,0,1,0,0,1,3,2,1,0,0,2,1,0,2,0,0,1,0,0,1,1,2,1,0,0,0,2,1,0,0,1,1,3,3,2,0,2,1,1,1,0,1,2,0,0,0,2,2,2,2,2,1,2,1,1,0,4,1,0,0,0,0,1,3,0,1,0,2,0,1,1,1,0,2,1,1,1,2,2,1,1,0,1,2,0,1,2,1,1,1,2,0,0,1,4,0,0,0,2,2,2,1,1,0,2,0,1,0,2,2,1,2,0,0,2,2,0,1,0,0,1,4,0,2,1,0,3,0,1,1,5,2,1,6,1,2,2,0,0,0,2,2,0,0,2,3,0,1,0,2,0,0,1,1,0,1,0,0,2,1,0,1,1,1,2,0,1,0,2,1,0,0,1,2,1,0,2,0,0,1,0,1,2,2,0,0,1,4,1,0,5,2,0,0,0,1,0,0,1,0,2,2,0]},{"counters":[0,2,1,0,1,0,5,1,1,4,1,0,1,2,0,0,2,0,1,0,1,2,3,1,0,2,0,1,1,2,2,2,1,2,0,0,0,0,0,0,0,1,0,0,1,1,0,2,0,1,2,2,3,1,3,0,2,2,1,1,1,0,1,0,2,1,1,0,2,1,4,2,1,1,0,1,4,2,0,1,0,0,0,1,0,1,0,1,1,0,1,2,2,0,2,1,0,0,3,1,1,0,1,0,0,0,0,0,0,2,1,1,0,1,2,0,1,1,0,0,1,3,1,0,1,0,3,2,0,0,1,0,4,2,0,1,0,0,0,2,1,1,0,0,2,2,2,0,1,3,0,1,0,0,1,1,1,1,1,1,2,0,2,2,1,1,3,1,2,0,0,0,0,0,3,1,3,0,0,1,0,0,1,3,1,1,0,0,1,1,1,2,0,0,0,1,0,0,0,1,2,1,0,1,0,1,1,1,1,2,0,3,2,2,3,0,4,1,1,0,0,0,2,1,1,1,0,0,2,0,0,1,3,0,0,1,0,0,0,1,1,1,4,0,1,3,1,0,0,3,1,2,5,1,0,1,1,0,1,1,3,1,0,2,0,2,1,1,3,1,2,0,0,1,2,1,1,2,2,1,0,0,0,1,0,0,2,1,2,1,1,1,1,0,0,1,0,1,1,1,1,1,0,1,0,1,0,0,0,4,2,1,0,1,2,0,1,0,1,1,0,1,0,1,0,0,0,1,1,0,1,0,4,2,1,0,0,1,2,5,0,0,1,0,1,1,0,2,1,1,2,0,3,0,1,1,0,1,3,0,0,0,1,0,1,1,3,1,0,0,1,1,1,0,0,0,1,1,0,0,0,2,0,2,0,0,1,1,1,1,0,1,1,2,2,2,3,0,1,0,1,1,1,0,0,2,0,2,1,1,1,1,2,1,1,0,1,0,0,2,1,1,0,1,2,0,1,0,1,1,1,0,1,0,0,0,2,0,2,1,2,2,1,1,0,2,1,1,1,0,3,0,0,0,0,1,1,0,2,1,2,2,2,1,2,0,1,0,2,0,7,1,2,3,2,1,1,1,1,1,0,1,2,2,0,1,0,0,2,2,0,0,0,1,0,0,0,2,2,1,2,1,0,0,1,1,1,1,2,0,0,1,0,2,2,1,1,0,0,0,3,0,3,2,0,0,0,0,0,2,1,1,2,0,1,3,1,3,1,2,2,1,0,0,1,1,1,1,0,1,0,1,1,0,1,2,1,0,2,0,0,0,1,0,1,2,1,1,7,0,2,1,1,1,0,0,4,1,1,3,1,0,2,0,0,1,2,0,0,1,0,1,2,2,1,0,0,3,2,0,1,0,0,1,1,1,1,0,1,0,0,2,0,1,2,0,1,2,1,0,0,1,2,1,1,1,2,0,1,0,1,0,1,0,0,1,0,1,1,0,0,1,2,0,0,0,1,2,2,0,2,1,3,2,0,1,1,0,1,2,0,1,1,1,2,0,1,0,1,0,1,1,0,1,4,1,0,0,2,0,6,1,1,2,1,1,3,0,2,1,0,1,1,0,0,0,0,2,0,2,0,0,0,1,2,1,0,1,3,1,2,1,0,1,0,1,0,0,2,1,0,0,0,0,2,1,0,1,1,3,2,0,0,0,0,0,0,2,3,1,1,1,2,1,1,0,0,0,0,1,2,1,2,8,2,3,0,1,3,1,2,0,1,2,1,0,2,2,2,0,1,0,1,2,0,0,0,1,0,1,0,0,0,3,0,0,2,1,0,1,1,0,0,2,0,2,0,1,3,0,0,0,1,0,0,0,3,1,1,5,1,1,0,0,2,0,1,1,1,2,1,0,2,0,1,1,2,0,1,0,0,1,1,3,0,0,6,3,0,0,1,2,1,0,0,2,2,1,0,0,1,1,0,2,1,2,1,0,0,1,0,3,4,1,1,1,0,1,1,0,1,0,2,0,1,1,2,0,0,1,0,1,1,3,1,0,1,3,1,0,1,0,1,2,1,2,1,1,0,2,1,2,0,1,4,0,1,0,1,3,0,0,2,0,2,2,0,3,1,0,0,1,4,2,1,1,0,1,1,0,1,1,0,2,0,1,1,0,1,0,1,1,0,2,0,2,0,1,1,1,0,0,0,1,0,0,1,1,0,0,1,2,0,1,0,0,1,1,1,0,0,2,1,1,1,2,1,2,1,0,1,2,1,1,0,0,0,0,0,0,0,2,1,2,0,1,1,0,1,1,1,1,1,3,0,0,1,1,2,0,0,0,0,1,0,0,1,1,2,1,1,1,1,1,0,2,0,2,1,1,0,0,1,2,0,2,1,0,0,1,1,0,2,0,0,0,1,0,0,0,1,3,3,1,0,1,1,1,6,1,0,0,2,0,0,0,0,0,2,0,1,1,2,0,0,0,1,1,1,2,0,0,0,1,2,0,2,0,2,1,2,1,1,0,1,3,0,2,1,2,1,0,1,1,1,0,0,2,1,1,1,2,0,0,0,0,1,1,3,0,2,2,1,0,0,1,1,1,0,0,0,2,0,2,1,1,0,0,3,1,0,0,0,0,1,2,0,0,1,1,2,1,0,2,0,0,0,0,0,3,1,1,0,1,2,0,1,0,0,0,0,0,1,3,0,1,2,2,1,0,0,1,0,0,1,0,0,1,5,0,2,0,1,0,2,1,1,0,1,2,0,0,3,1,0,2,1,1,1,2,3,1,1,1,1,0,1,2,0,2,0,0,1,1,0,1,1,0,1,2,1,1,3,0,1,0,0,1,0,1,0,3,1,0,0,0,0,1,0,0,0,1,0,1,2,1,0,0,2,1,3,1,2,3,0,2,1,1,1,1,1,1,2,1,0,1,0,0,0,0,0,2,2,0,1,2,2,1,0,0,0,2,1,1,3,1,0,2,1,2,2,0,1,1,0,1,1,0,1,1,1,1,0,2,0,0,1,4,1,0,1,0,5,0,3,1,1,0,2,1,1,0,0,0,2,0,2,0,1,1,0,0,3,2,1,1,1,2,0,0,2,1,1,1,0,0,1,1,4,3,3,0,1,1,2,0,1,0,4,0,0,1,0,2,1,7,0,0,1,0,0,0,1,2,3,3,1,3,0,0,0,0,4,2,0,2,1,0,0,0,1,4,1,1,0,2,0,0,1,1,0,2,1,1,0,2,1,1,0,1,1,1,1,0,1,0,2,0,0,1,0,4,2,1,6,4,1,1,0,0,0,0,1,2,3,1,1,1,0,1,1,1,1,1,1,2,0,0,0,0,0,1,0,2,1,0,0,1,1,2,0,0,3,2,0,0,4,0,0,0,0,1,1,2,0,4,4,0,0,1,0,2,0,0,0,6,1,1,0,0,0,1,1,0,2,1,2,1,6,0,1,2,0,1,2,1,0,0,1,0,0,0,1,1,1,3,2,2,1,4,1,1,2,1,3,1,0,0,1,5,2,2,1,3,0,0,1,0,2,3,0,0,1,1,2,2,1,0,1,1,1,0,2,0,0,0,1,0,1,0,2,0,3,2,0,0,1,0,0,2,0,1,0,0,1,0,1,4,0,1,2,0,1,0,0,0,2,1,0,2,2,1,0,3,0,3,0,0,2,1,0,1,0,0,1,0,2,5,2,0,0,0,3,2,2,2,0,2,2,1,0,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,0,0,0,1,0,1,2,1,0,0,3,2,0,0,0,2,0,1,1,0,2,1,2,2,1,0,0,2,2,0,0,2,1,3,1,0,0,2,0,0,2,0,0,0,1,2,1,0,0,2,0,1,1,1,2,1,1,0,2,2,0,0,0,1,0,1,3,2,1,1,1,0,1,0,2,8,1,0,1,0,0,0,0,1,0,1,1,1,2,0,2,2,1,1,1,1,0,0,0,1,3,0,1,1,1,2,0,1,0,4,0,1,2,2,0,2,2,0,1,0,1,0,1,2,0,1,2,0,0,1,0,6,1,0,0,1,1,4,1,3,0,0,1,0,1,0,2,0,1,1,1,1,1,0,1,3,0,0,1,0,2,0,3,2,1,1,2,0,1,0,0,0,5,0,4,1,2,2,0,0,1,1,0,1,1,0,1,0,1,0,2,0,0,3,0,1,1,0,0,0,0,1,1,1,0,0,0,1,2,0,3,0,0,0,1,0,3,0,1,1,0,0,1,1,1,0,1,1,2,0,0,1,1,2,0,1,1,0,1,2,1,1,4,0,1,2,2,0,4,2,0,2,1,2,1,3,0,2,1,0,1,3,1,0,0,1,1,2,1,0,2,1,1,0,2,2,2,0,1,1,2,1,1,0,1,1,0,2,0,1,0,0,1,0,1,2,0,0,2,1,0,2,1,0,3,1,0,0,1,1,0,0,1,0,1,1,0,0,2,1,3,1,1,0,0,0,0,1,0,0,2,2,1,0,2,1,0,2,1,0,2,4,0,2,1,1,3,0,1,1,0,1,2,2,1,0,0,1,0,1,3,1,2,1,1,2,2,1,1,1,2,1,1,0,1,3,1,3,0,2,2,2,1,0,4,7,4,2,1,0,1,0,1,0,0,0,2,1,1,2,0,0]},{"counters":[2,1,1,1,2,2,2,2,0,0,0,2,0,2,1,1,6,1,1,0,0,2,2,0,1,0,7,2,1,1,2,0,0,0,1,3,1,0,0,1,2,0,0,2,1,2,0,1,1,1,2,2,0,0,1,0,2,0,0,0,2,3,0,0,0,1,1,1,1,3,0,1,0,0,2,0,1,2,2,0,0,3,0,0,2,0,0,0,1,1,1,2,0,0,0,1,0,0,1,3,0,0,0,2,0,0,1,0,2,0,1,0,0,1,0,1,0,1,1,2,2,2,0,1,8,1,0,1,1,0,2,0,0,2,2,0,2,0,0,0,3,1,2,0,0,0,3,1,0,0,0,0,2,1,0,1,1,0,2,0,0,1,1,2,1,0,1,2,1,1,4,0,0,0,2,0,0,2,3,0,3,1,1,3,2,0,3,2,3,2,0,1,1,0,0,1,0,0,0,1,0,0,2,0,1,2,1,1,2,1,1,1,1,2,3,0,1,1,3,0,1,1,3,0,0,1,2,0,2,2,0,1,0,1,2,0,2,1,0,0,0,0,1,2,0,3,1,1,0,1,2,0,0,1,0,1,0,0,0,1,1,2,2,0,0,0,1,1,0,0,3,1,0,11,3,1,1,0,2,1,1,0,1,2,0,1,1,1,1,1,0,0,0,0,1,0,1,1,0,4,0,0,1,1,0,1,1,0,6,2,0,3,0,1,1,2,1,1,1,3,0,0,1,2,1,0,0,2,1,2,1,2,0,1,1,0,1,1,1,3,2,1,1,2,0,0,2,4,2,1,1,2,0,1,2,1,3,2,1,2,0,1,0,3,3,0,1,3,1,2,2,0,1,1,0,1,3,1,2,4,2,0,0,1,0,2,1,0,1,1,1,0,2,0,1,1,2,1,2,2,3,2,0,1,1,1,1,1,0,1,2,0,2,0,1,2,0,1,0,0,3,1,0,1,1,5,1,1,0,2,0,0,1,0,1,1,0,1,1,0,0,3,1,1,2,1,1,0,0,4,2,0,1,0,1,0,1,2,3,0,1,1,3,0,0,0,2,1,2,1,0,2,1,0,2,2,4,0,3,0,2,2,2,0,0,1,1,1,0,2,1,3,2,1,1,0,0,3,1,0,0,3,1,0,2,0,5,2,0,0,0,0,1,1,0,3,0,2,1,1,0,2,1,1,2,1,2,0,1,1,1,0,0,2,1,1,0,0,2,0,1,0,1,1,2,2,1,0,2,0,3,2,0,0,2,3,1,0,0,0,1,1,0,1,0,1,1,1,2,1,0,2,0,0,0,1,1,0,0,0,0,1,0,2,0,2,0,0,0,2,1,1,2,1,1,2,0,0,2,1,1,1,1,1,0,2,0,1,0,0,2,7,1,1,1,0,1,2,1,1,0,0,0,1,2,1,3,1,1,0,2,1,1,0,0,0,0,1,0,1,1,2,0,1,0,2,1,1,0,0,0,1,1,2,0,1,1,0,2,0,0,1,2,2,0,0,2,0,2,0,0,1,0,1,2,1,2,1,1,0,1,1,1,1,1,2,0,0,1,0,0,2,0,0,1,1,0,1,2,2,0,0,1,3,0,2,1,1,0,0,1,1,3,0,1,2,1,2,1,3,1,0,1,3,0,0,0,1,0,1,3,0,0,1,0,0,3,1,1,0,1,0,0,3,3,0,1,2,0,1,0,0,0,0,0,3,1,2,0,2,0,1,0,0,0,2,1,3,5,1,0,1,0,0,1,1,1,0,0,1,1,0,1,2,1,3,2,0,0,0,0,2,1,2,2,3,2,1,2,0,0,1,2,4,1,2,1,1,1,1,0,3,1,0,0,0,1,2,0,0,0,1,1,0,1,1,1,1,1,1,0,3,0,1,1,0,0,0,0,0,0,1,0,2,0,0,0,0,5,0,0,1,0,0,0,1,0,0,0,1,1,0,1,1,2,1,0,2,1,2,0,0,1,1,0,0,2,2,1,2,5,1,1,0,0,1,0,0,3,1,3,1,3,1,2,0,0,1,1,0,1,0,0,2,1,1,1,1,0,0,2,1,0,1,1,1,0,0,1,2,0,0,0,1,0,4,2,1,0,0,1,0,0,5,1,0,1,0,0,0,1,1,1,0,1,2,0,1,3,0,0,3,2,0,3,1,1,1,1,0,1,0,1,3,2,6,2,0,0,2,0,0,1,0,1,2,2,4,0,1,0,1,0,0,0,2,0,1,0,0,5,1,0,0,0,1,0,1,1,0,0,0,1,2,2,1,2,1,1,2,1,0,1,0,1,2,1,0,0,0,1,1,0,1,2,2,0,1,2,1,1,1,2,1,0,1,0,1,2,0,0,0,0,0,1,3,1,2,0,1,0,0,4,3,2,1,0,0,1,1,0,2,0,0,0,0,3,1,0,0,0,1,1,2,0,0,0,2,0,1,2,0,1,4,1,2,1,2,1,1,1,1,0,0,0,0,3,2,1,1,1,1,0,1,2,1,0,1,1,0,5,2,1,2,2,1,1,2,0,0,1,4,2,5,1,0,0,4,0,0,1,0,3,3,0,1,1,0,1,0,0,0,0,0,2,1,0,0,1,2,2,0,0,2,3,1,1,1,1,2,2,1,0,2,0,1,1,2,1,1,3,0,1,1,2,1,0,1,1,0,3,4,2,0,0,4,2,1,4,0,3,2,1,1,2,3,2,1,1,1,0,0,2,0,0,2,4,0,1,1,1,1,1,1,0,2,2,0,1,2,1,1,0,1,0,0,1,1,0,0,2,1,0,2,2,2,0,0,0,0,1,2,0,1,2,1,1,1,0,2,0,1,1,0,0,1,0,2,0,4,0,0,0,0,0,0,0,0,0,2,3,0,0,0,0,1,1,1,1,0,1,0,1,5,2,0,0,3,1,0,1,2,0,2,0,0,1,1,0,0,0,0,2,0,0,2,0,1,0,1,1,0,1,0,0,1,0,3,1,0,0,3,0,2,2,0,0,0,0,1,1,0,3,2,0,2,1,0,1,0,1,0,2,1,0,2,2,2,0,0,2,1,1,0,0,3,0,0,0,2,1,2,2,4,1,3,2,0,2,0,1,0,0,0,2,4,1,1,0,3,2,1,0,1,0,0,4,0,0,0,2,0,1,2,0,0,1,0,0,2,0,2,0,0,2,4,0,0,1,1,2,1,1,2,1,0,2,0,0,0,0,0,0,1,0,0,2,0,3,1,1,0,0,0,1,2,0,1,0,0,0,2,0,2,0,2,0,2,1,0,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,0,0,1,3,0,2,1,0,1,2,0,2,0,1,0,0,0,0,2,0,1,4,1,1,0,0,0,0,2,0,3,3,0,1,0,1,3,1,1,1,0,1,0,0,1,1,0,0,2,0,0,0,0,5,3,0,2,2,1,2,0,0,1,0,2,0,2,1,0,1,0,2,1,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,1,2,0,0,1,0,0,0,0,0,0,0,1,1,1,3,1,0,0,1,0,0,0,2,1,1,1,0,2,2,2,2,1,1,0,1,0,1,0,3,1,1,1,2,1,0,2,0,1,4,1,0,1,0,0,2,1,0,0,2,0,1,1,1,0,0,2,0,0,2,2,0,0,0,0,1,0,2,1,0,1,1,2,0,3,1,0,0,1,0,1,0,0,1,3,2,0,0,0,1,1,1,1,0,0,0,0,0,1,0,1,1,0,0,1,0,1,3,1,1,1,0,0,1,2,1,1,0,0,7,1,0,0,1,4,0,0,1,1,1,0,1,2,2,1,1,1,0,0,2,0,1,1,0,2,1,1,1,0,6,0,1,2,1,0,1,0,6,2,0,0,1,2,0,1,0,1,1,1,0,1,1,0,1,4,0,2,2,0,0,2,1,0,0,2,0,1,0,0,2,0,0,0,0,1,2,0,1,0,1,1,1,1,2,1,1,0,0,1,0,2,0,3,0,0,1,0,0,0,0,0,1,4,1,2,1,0,0,1,1,1,2,0,0,1,0,3,2,1,3,0,3,0,1,0,0,0,0,0,2,2,2,0,1,0,2,1,1,2,0,0,4,0,2,2,0,2,0,1,0,1,0,3,1,1,0,1,2,0,3,2,1,2,1,1,1,1,0,1,2,3,1,2,1,0,0,3,1,0,2,0,3,2,1,0,3,3,1,1,0,1,2,3,0,0,0,0,0,1,4,1,2,0,1,0,0,2,2,0,1,1,2,0,1,0,1,0,1,0,1,1,0,3,1,1,1,1,0,0,3,0,0,1,1,2,2,2,1,2,2,1,1,0,2,1,1,0,0,1,0,0,0,1,0,0,2,0,0,0,1,0,2,1,1,2,1,0,1,0,1,2,2,1,1,3,0,2,0,1,1,1,1,0,1,0,2,1,1,1,1,0,0,0,1,0,0,3,0,0,0,2,2,0,2,0,1,0,1,1,1,2,0,0,0,0,2,2,1,2,1,1,0,1,0,1,3,2,1,0,0,3,4,0,2,1,2,2,1,1,0,0,1,1,1,1,1,1,0,0,4,1,2,0,2,0,0,0,1]}]},"null_count":0,"last_update_version":397952028318629888}},"count":2000,"modify_count":0,"version":0} diff --git a/cmd/explaintest/s/explain_complex_stats_pp.json b/cmd/explaintest/s/explain_complex_stats_pp.json deleted file mode 100644 index 9bf6e4bfc892c..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_pp.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"pp","columns":{"acc":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDczMTYyNTM=","upper_bound":"LTIxMzk3NTg2NzE=","repeats":1},{"count":16,"lower_bound":"LTIxMzg3OTYxMDk=","upper_bound":"LTIxMjcwMjg2NTI=","repeats":1},{"count":24,"lower_bound":"LTIxMDY4MjAxOTQ=","upper_bound":"LTIwOTkxMDg3MDQ=","repeats":1},{"count":32,"lower_bound":"LTIwODMwMTkxNjk=","upper_bound":"LTIwNzI3NTk1NzE=","repeats":1},{"count":40,"lower_bound":"LTIwNzE5NjI4MDQ=","upper_bound":"LTIwNTE4NTQzOTA=","repeats":1},{"count":48,"lower_bound":"LTIwNDU2NTc3NDU=","upper_bound":"LTIwMzgxNDMxNjQ=","repeats":1},{"count":56,"lower_bound":"LTIwMzE0MTA5MTA=","upper_bound":"LTIwMjEyMDEyNDA=","repeats":1},{"count":64,"lower_bound":"LTIwMTY2OTkxOTg=","upper_bound":"LTIwMDU5MDQyMDM=","repeats":1},{"count":72,"lower_bound":"LTIwMDAxMjgxODA=","upper_bound":"LTE5ODQ0MzQ5Mjk=","repeats":1},{"count":80,"lower_bound":"LTE5ODIxOTQxNzc=","upper_bound":"LTE5Njk0Mjc4NDk=","repeats":1},{"count":88,"lower_bound":"LTE5NTk1NDQwNzc=","upper_bound":"LTE5NTA1MTE3MDg=","repeats":1},{"count":96,"lower_bound":"LTE5NDg4MDAzNjU=","upper_bound":"LTE5NDUzMDE2OTU=","repeats":1},{"count":104,"lower_bound":"LTE5MzczMzU3MjI=","upper_bound":"LTE5MjcxMTk1MTc=","repeats":1},{"count":112,"lower_bound":"LTE5MDcxMjM4MDY=","upper_bound":"LTE4OTkyOTQ3MTM=","repeats":1},{"count":120,"lower_bound":"LTE4OTkxMzQwMDI=","upper_bound":"LTE4NzU2NDMxNzY=","repeats":1},{"count":128,"lower_bound":"LTE4NzI5MTY5Nzc=","upper_bound":"LTE4NjM1ODYwNDY=","repeats":1},{"count":136,"lower_bound":"LTE4NjM0OTcwNDQ=","upper_bound":"LTE4NjE5NTYxNzI=","repeats":1},{"count":144,"lower_bound":"LTE4NTQ2MTY3NDc=","upper_bound":"LTE4NDQyNzMwMTk=","repeats":1},{"count":152,"lower_bound":"LTE4NDQwOTU4OTk=","upper_bound":"LTE4MzgzNDA5Mzk=","repeats":1},{"count":160,"lower_bound":"LTE4MzQyNzI4MjA=","upper_bound":"LTE4MzMzMDUyNDg=","repeats":1},{"count":168,"lower_bound":"LTE4MzE3NjEzNDM=","upper_bound":"LTE4MjkyNDkzMTU=","repeats":1},{"count":176,"lower_bound":"LTE4MjY3Njk3ODY=","upper_bound":"LTE4MjI5NzQ4NDE=","repeats":1},{"count":184,"lower_bound":"LTE4MTczNTY4NTU=","upper_bound":"LTE4MDI3NzI3ODk=","repeats":1},{"count":192,"lower_bound":"LTE4MDExODMzNjQ=","upper_bound":"LTE3OTU1MTgwMzU=","repeats":1},{"count":200,"lower_bound":"LTE3OTM1NzkwOTg=","upper_bound":"LTE3NjYzNTc1NjE=","repeats":1},{"count":208,"lower_bound":"LTE3NjQyNjUwMzk=","upper_bound":"LTE3NTE4NTA1MjM=","repeats":1},{"count":216,"lower_bound":"LTE3NTEzNzI1OTM=","upper_bound":"LTE3NDUwMDE0NjM=","repeats":1},{"count":224,"lower_bound":"LTE3MzUzMDUwMTA=","upper_bound":"LTE3MzE2NDQxMzQ=","repeats":1},{"count":232,"lower_bound":"LTE3MzAxOTE4NzI=","upper_bound":"LTE3Mjg1NTk2NDg=","repeats":1},{"count":240,"lower_bound":"LTE3MjExNjAwNDQ=","upper_bound":"LTE3MDg5NjMwODk=","repeats":1},{"count":248,"lower_bound":"LTE3MDU2NjkzNTk=","upper_bound":"LTE2OTY4MjQ0MjY=","repeats":1},{"count":256,"lower_bound":"LTE2OTQzNjg0MjQ=","upper_bound":"LTE2ODIwMDc2MTE=","repeats":1},{"count":264,"lower_bound":"LTE2NzgwMDc3NDc=","upper_bound":"LTE2NTY1NzUxMTI=","repeats":1},{"count":272,"lower_bound":"LTE2NTQ2MDgzNzg=","upper_bound":"LTE2NDk5MTgyNjA=","repeats":1},{"count":280,"lower_bound":"LTE2NDQ1MTA1NDY=","upper_bound":"LTE2MzA0NTA3NDQ=","repeats":1},{"count":288,"lower_bound":"LTE2Mjc3NzM5NDA=","upper_bound":"LTE2MjA4MjA1Mzk=","repeats":1},{"count":296,"lower_bound":"LTE2MjA3MTI5NzM=","upper_bound":"LTE2MTU5MzY4NTI=","repeats":1},{"count":304,"lower_bound":"LTE2MTU0MDcyMjg=","upper_bound":"LTE2MDI0MTg5NDQ=","repeats":1},{"count":312,"lower_bound":"LTE1OTAwMDM2NzI=","upper_bound":"LTE1ODQ4OTUxNzU=","repeats":1},{"count":320,"lower_bound":"LTE1NzcyOTE4MDI=","upper_bound":"LTE1NjIyMzUwNzM=","repeats":1},{"count":328,"lower_bound":"LTE1NjEwNDQwMTI=","upper_bound":"LTE1MzUzNTIxMDk=","repeats":1},{"count":336,"lower_bound":"LTE1MzQwMzk4NDc=","upper_bound":"LTE1MjYyMjc0NzY=","repeats":1},{"count":344,"lower_bound":"LTE1MTYyMDk3Nzk=","upper_bound":"LTE1MDIwNDk0NTM=","repeats":1},{"count":352,"lower_bound":"LTE0OTk1ODI3MTU=","upper_bound":"LTE0NzYxOTAxNDk=","repeats":1},{"count":360,"lower_bound":"LTE0NzU3NDY0NDQ=","upper_bound":"LTE0NTY3OTI2NDU=","repeats":1},{"count":368,"lower_bound":"LTE0NDc4MzY5MzY=","upper_bound":"LTE0NDI1MjkwNjg=","repeats":1},{"count":376,"lower_bound":"LTE0NDAwMDY5MjU=","upper_bound":"LTE0Mjg5NTI1NjE=","repeats":1},{"count":384,"lower_bound":"LTE0MTc3OTk3OTQ=","upper_bound":"LTE0MDQ3MDQwOTg=","repeats":1},{"count":392,"lower_bound":"LTE0MDE4NjYwMDE=","upper_bound":"LTEzODYzODA2NDg=","repeats":1},{"count":400,"lower_bound":"LTEzODIwNzE1MTk=","upper_bound":"LTEzNzAwMjA4Nzc=","repeats":1},{"count":408,"lower_bound":"LTEzNjk0NzA2MDE=","upper_bound":"LTEzNDU2MTk0NDY=","repeats":1},{"count":416,"lower_bound":"LTEzMzk4NTE1MDg=","upper_bound":"LTEzMzA4OTQyMTA=","repeats":1},{"count":424,"lower_bound":"LTEzMjYzMTkwMjI=","upper_bound":"LTEzMjIxOTQ5NDY=","repeats":1},{"count":432,"lower_bound":"LTEzMjAwMzY4NDU=","upper_bound":"LTEzMDUyODE0MjY=","repeats":1},{"count":440,"lower_bound":"LTEyOTg2ODc2MjU=","upper_bound":"LTEyNjYxNDQ3ODQ=","repeats":1},{"count":448,"lower_bound":"LTEyNTkzNDQ1MDQ=","upper_bound":"LTEyNTIxMzU4NDQ=","repeats":1},{"count":456,"lower_bound":"LTEyNDYxNzUxNTA=","upper_bound":"LTEyMzI0NTM3MDY=","repeats":1},{"count":464,"lower_bound":"LTEyMjYyNzEwNzA=","upper_bound":"LTExODMzNjUyODQ=","repeats":1},{"count":472,"lower_bound":"LTExODIxOTQ5NTk=","upper_bound":"LTExNjYxNzk4NzI=","repeats":1},{"count":480,"lower_bound":"LTExNjU5NzMxMTg=","upper_bound":"LTExNDk3MTQwNzQ=","repeats":1},{"count":488,"lower_bound":"LTExMzQzMTY4NjA=","upper_bound":"LTExMjMyNzE4Nzc=","repeats":1},{"count":496,"lower_bound":"LTExMjEwMzAzNTc=","upper_bound":"LTExMTg1MDIwMjA=","repeats":1},{"count":504,"lower_bound":"LTExMDcwMjY1NjE=","upper_bound":"LTExMDQ4NzE5ODQ=","repeats":1},{"count":512,"lower_bound":"LTEwOTUzNjUzMDE=","upper_bound":"LTEwODA4NzQyODY=","repeats":1},{"count":520,"lower_bound":"LTEwNzk0NTkyNzk=","upper_bound":"LTEwNjk5MTA4NjA=","repeats":1},{"count":528,"lower_bound":"LTEwNjM1ODY2OTA=","upper_bound":"LTEwMzAyNTIyODE=","repeats":1},{"count":536,"lower_bound":"LTEwMjM4Mzk4NTU=","upper_bound":"LTEwMDE5MjU1MjM=","repeats":1},{"count":544,"lower_bound":"LTk5NjM1NTI2NQ==","upper_bound":"LTk4MzAxMjYzOA==","repeats":1},{"count":552,"lower_bound":"LTk4MDU0MTQzNQ==","upper_bound":"LTk2MjUxNTc4MA==","repeats":1},{"count":560,"lower_bound":"LTk2MDY0ODA0OQ==","upper_bound":"LTk1NTM2MjczMQ==","repeats":1},{"count":568,"lower_bound":"LTk1MTY3ODU2Mw==","upper_bound":"LTk0MjExODEyMQ==","repeats":1},{"count":576,"lower_bound":"LTk0MTE5ODUwMw==","upper_bound":"LTkyNDQ3MjQ2Ng==","repeats":1},{"count":584,"lower_bound":"LTkyMDk2MDcxOA==","upper_bound":"LTkwNzg1NTMyNA==","repeats":1},{"count":592,"lower_bound":"LTkwNzgxNDA0Nw==","upper_bound":"LTkwMDkzMTIwMQ==","repeats":1},{"count":600,"lower_bound":"LTg5NzE0NDI2Mw==","upper_bound":"LTg4MDU3MTEzNQ==","repeats":1},{"count":608,"lower_bound":"LTg1NDA4Njg5Ng==","upper_bound":"LTg0NDcxMjYwOQ==","repeats":1},{"count":616,"lower_bound":"LTgyNDI3MjE0MA==","upper_bound":"LTgwNDA4MzU2Mw==","repeats":1},{"count":624,"lower_bound":"LTc5OTY1NTI0Mw==","upper_bound":"LTc4MjY4NzEwOQ==","repeats":1},{"count":632,"lower_bound":"LTc3ODI3MzM3Mw==","upper_bound":"LTc3NzE4ODUzOQ==","repeats":1},{"count":640,"lower_bound":"LTc3NTU4NDU5MQ==","upper_bound":"LTc3MjY1NjE3MQ==","repeats":1},{"count":648,"lower_bound":"LTc2MDQ4OTY5Mg==","upper_bound":"LTc1MjE2MDExNg==","repeats":1},{"count":656,"lower_bound":"LTc0MzkwNTA1Mw==","upper_bound":"LTcyOTU0OTQ1Ng==","repeats":1},{"count":664,"lower_bound":"LTcyODczMTUxMg==","upper_bound":"LTcxNzM2NjIyNw==","repeats":1},{"count":672,"lower_bound":"LTcxMjQ5NjEwMQ==","upper_bound":"LTcwOTUyNTM3MQ==","repeats":1},{"count":680,"lower_bound":"LTcwNzU4ODEyMw==","upper_bound":"LTcwNDE1NTU4Mg==","repeats":1},{"count":688,"lower_bound":"LTcwMzA4MDIzMg==","upper_bound":"LTY5NjQxNjUxMg==","repeats":1},{"count":696,"lower_bound":"LTY4NzA3ODMzMg==","upper_bound":"LTY2OTkxMjg0Mw==","repeats":1},{"count":704,"lower_bound":"LTY2NTQyMDk0OQ==","upper_bound":"LTY0OTI0Mjc3Nw==","repeats":1},{"count":712,"lower_bound":"LTY0OTEyODc4Nw==","upper_bound":"LTY0NTMxODQ2MQ==","repeats":1},{"count":720,"lower_bound":"LTY0MzAzMjgzMA==","upper_bound":"LTYzMjU2OTk5OQ==","repeats":1},{"count":728,"lower_bound":"LTYxODQxODExOA==","upper_bound":"LTU5ODMzNDI5OA==","repeats":1},{"count":736,"lower_bound":"LTU5NTIxOTI0Nw==","upper_bound":"LTU3MzI3NDAyOA==","repeats":1},{"count":744,"lower_bound":"LTU3MjY1MTg4Nw==","upper_bound":"LTU2MjY5MzUzNw==","repeats":1},{"count":752,"lower_bound":"LTU2MDk0NzIxMw==","upper_bound":"LTU0OTg4MTgxNQ==","repeats":1},{"count":760,"lower_bound":"LTUzNzk5NTkyOA==","upper_bound":"LTUyMjA4ODAxOA==","repeats":1},{"count":768,"lower_bound":"LTUwMzc3Mjc4Mw==","upper_bound":"LTQ4NjE5Mjg5Ng==","repeats":1},{"count":776,"lower_bound":"LTQ4MTQ0Nzk0MQ==","upper_bound":"LTQ2MzEwNTg0NA==","repeats":1},{"count":784,"lower_bound":"LTQ2MTkyODYzNg==","upper_bound":"LTQ1NTIyMDk5NA==","repeats":1},{"count":792,"lower_bound":"LTQ1MzMzMjg0OA==","upper_bound":"LTQ0MDI3MzI3MA==","repeats":1},{"count":800,"lower_bound":"LTQzNjgxODYyOA==","upper_bound":"LTQyOTU0Njk5NA==","repeats":1},{"count":808,"lower_bound":"LTQyNjk5OTI0OA==","upper_bound":"LTQxNjEyMzk5NQ==","repeats":1},{"count":816,"lower_bound":"LTQxMzE2MzYxOQ==","upper_bound":"LTQwMTA5MTI1Nw==","repeats":1},{"count":824,"lower_bound":"LTM5MDc5NjQ0OQ==","upper_bound":"LTM3MDAxNzEwMQ==","repeats":1},{"count":832,"lower_bound":"LTM2NzY4NTI2NQ==","upper_bound":"LTM1NzcwNDU5Ng==","repeats":1},{"count":840,"lower_bound":"LTM1NTkzNzU3OQ==","upper_bound":"LTM0NzYzNjkyNg==","repeats":1},{"count":848,"lower_bound":"LTM0MjU0OTUzMg==","upper_bound":"LTMzMTA0OTMyNw==","repeats":1},{"count":856,"lower_bound":"LTMyNTQzNTM5Ng==","upper_bound":"LTMxMzYzMzA4MQ==","repeats":1},{"count":864,"lower_bound":"LTMwMTA5ODY0MQ==","upper_bound":"LTI5MDUxNDQxMQ==","repeats":1},{"count":872,"lower_bound":"LTI4NjYwMjY2Nw==","upper_bound":"LTI0OTM2NTEzMA==","repeats":1},{"count":880,"lower_bound":"LTI0NjI2OTkzMg==","upper_bound":"LTIzMjkzNTgzNg==","repeats":1},{"count":888,"lower_bound":"LTIzMjgzNzc2Mg==","upper_bound":"LTIyNTM0MDU4Ng==","repeats":1},{"count":896,"lower_bound":"LTIyMTAyNTgxNw==","upper_bound":"LTIxNDM5NjgwOA==","repeats":1},{"count":904,"lower_bound":"LTIxMTI2NTUzMw==","upper_bound":"LTIwNDQ1MTY0NA==","repeats":1},{"count":912,"lower_bound":"LTIwMzQ0NDMyNg==","upper_bound":"LTE5NTUwMDE1Mg==","repeats":1},{"count":920,"lower_bound":"LTE5NTQ0MzgxNw==","upper_bound":"LTE4NzM5MDcxOA==","repeats":1},{"count":928,"lower_bound":"LTE3NzUwOTY4Nw==","upper_bound":"LTE2NTc1MDI3Mg==","repeats":1},{"count":936,"lower_bound":"LTE2MzY3NTE4Ng==","upper_bound":"LTE1NjEyNjQ4MQ==","repeats":1},{"count":944,"lower_bound":"LTE1NTQxMjAyMw==","upper_bound":"LTE0NzQ2MzcxMQ==","repeats":1},{"count":952,"lower_bound":"LTE0NjAxMzM4MQ==","upper_bound":"LTEyMTI4NjYyMg==","repeats":1},{"count":960,"lower_bound":"LTEwMzcyMzcxNw==","upper_bound":"LTg5MTIyMTE2","repeats":1},{"count":968,"lower_bound":"LTc1OTQ4NDMw","upper_bound":"LTYzNzgxMjQw","repeats":1},{"count":976,"lower_bound":"LTYzMjk0MjQz","upper_bound":"LTUzMzM2ODEy","repeats":1},{"count":984,"lower_bound":"LTUxNDE4ODI0","upper_bound":"LTM3MzEyOTQx","repeats":1},{"count":992,"lower_bound":"LTI2MzA3ODIw","upper_bound":"LTE4NDY5NTU1","repeats":1},{"count":1000,"lower_bound":"LTEwOTUwOTI2","upper_bound":"LTI3NDM3ODQ=","repeats":1},{"count":1008,"lower_bound":"LTkyNDY3MQ==","upper_bound":"NDM5MzM2Mg==","repeats":1},{"count":1016,"lower_bound":"MTQzOTU4Njc=","upper_bound":"MTgyMTc5Njk=","repeats":1},{"count":1024,"lower_bound":"MjczNTY0MDA=","upper_bound":"NDM5MzU4MTE=","repeats":1},{"count":1032,"lower_bound":"NDgwNzUwNzM=","upper_bound":"NjA4ODczMTA=","repeats":1},{"count":1040,"lower_bound":"NjQ1NjE4MTk=","upper_bound":"NzcxNzMxNTE=","repeats":1},{"count":1048,"lower_bound":"NzgxNjY5NjA=","upper_bound":"OTQ1MDY4OTM=","repeats":1},{"count":1056,"lower_bound":"OTk5MzI4OTg=","upper_bound":"MTE0Mzg4NzMw","repeats":1},{"count":1064,"lower_bound":"MTE2MTY3NjYx","upper_bound":"MTI5MDk5MTM5","repeats":1},{"count":1072,"lower_bound":"MTMxOTY0Mjcw","upper_bound":"MTU2MzQ1NTg5","repeats":1},{"count":1080,"lower_bound":"MTU4NTgyNzE1","upper_bound":"MTY2NDE2MTI1","repeats":1},{"count":1088,"lower_bound":"MTc0ODg4MjE4","upper_bound":"MTgyMDM3MDM4","repeats":1},{"count":1096,"lower_bound":"MTg5MjM0MTc4","upper_bound":"MTk5NTA4NjY5","repeats":1},{"count":1104,"lower_bound":"MjIwNjIxMjU0","upper_bound":"MjM1MDE2MDYy","repeats":1},{"count":1112,"lower_bound":"MjM3NTYxMjM5","upper_bound":"MjUwMjM1Nzg1","repeats":1},{"count":1120,"lower_bound":"MjUzODQwNjI0","upper_bound":"MjU5NzIwNzAy","repeats":1},{"count":1128,"lower_bound":"MjY0MTU4ODky","upper_bound":"MjY3MDg4Mzgx","repeats":1},{"count":1136,"lower_bound":"MjY3NDk2ODQ0","upper_bound":"Mjg2Nzg5Nzk1","repeats":1},{"count":1144,"lower_bound":"Mjg4MjM1ODcy","upper_bound":"Mjk5NDM3NjE2","repeats":1},{"count":1152,"lower_bound":"MzAzMzM1ODcz","upper_bound":"MzE0NTU1MTU4","repeats":1},{"count":1160,"lower_bound":"MzIzMjM3NzA5","upper_bound":"MzUzMDczMjU3","repeats":1},{"count":1168,"lower_bound":"MzU5NjQ5Mzgz","upper_bound":"MzY4MjcxOTg0","repeats":1},{"count":1176,"lower_bound":"MzY4NjA0MzQ2","upper_bound":"Mzg2NTI2MjYw","repeats":1},{"count":1184,"lower_bound":"Mzg2NjgwNTA5","upper_bound":"MzkwNzcxNTgy","repeats":1},{"count":1192,"lower_bound":"MzkwOTkxMDE5","upper_bound":"Mzk0OTk4MDMz","repeats":1},{"count":1200,"lower_bound":"NDAxNjE1NTk4","upper_bound":"NDAzMzcxNTA4","repeats":1},{"count":1208,"lower_bound":"NDExNDAyNDYz","upper_bound":"NDIxOTgwODcz","repeats":1},{"count":1216,"lower_bound":"NDI1NzAyODMy","upper_bound":"NDMyNDIyNTc2","repeats":1},{"count":1224,"lower_bound":"NDM2NjcwODA0","upper_bound":"NDQ4NDU4NzI0","repeats":1},{"count":1232,"lower_bound":"NDQ4NDU5Mjcz","upper_bound":"NDU0Nzc5OTMw","repeats":1},{"count":1240,"lower_bound":"NDU3MTA5MTE3","upper_bound":"NDc2Njg1NzQy","repeats":1},{"count":1248,"lower_bound":"NDkzMDI2MzMw","upper_bound":"NDk4ODgwODQw","repeats":1},{"count":1256,"lower_bound":"NTA5ODkwMjA0","upper_bound":"NTIwNjgwNzIy","repeats":1},{"count":1264,"lower_bound":"NTI1MDk2NzAw","upper_bound":"NTQzNjg3MTcz","repeats":1},{"count":1272,"lower_bound":"NTQ2Njg3MDU3","upper_bound":"NTU2ODU3ODU1","repeats":1},{"count":1280,"lower_bound":"NTU2OTI1OTcx","upper_bound":"NTYyMjA0ODMx","repeats":1},{"count":1288,"lower_bound":"NTY4MjM1MDY0","upper_bound":"NTc1NjY0OTM4","repeats":1},{"count":1296,"lower_bound":"NTc3ODA1NDkz","upper_bound":"NTc5NjY0Nzk2","repeats":1},{"count":1304,"lower_bound":"NTgzNTA2ODk0","upper_bound":"NjAwOTA2NTc5","repeats":1},{"count":1312,"lower_bound":"NjA2ODk2OTU5","upper_bound":"NjE5MTQ0MDE4","repeats":1},{"count":1320,"lower_bound":"NjE5NzE2OTI5","upper_bound":"NjMxMjMyOTUx","repeats":1},{"count":1328,"lower_bound":"NjMyMzI1MTc0","upper_bound":"NjU2NjUzNDI0","repeats":1},{"count":1336,"lower_bound":"NjY3ODg1MjI3","upper_bound":"NjgzOTgwOTY2","repeats":1},{"count":1344,"lower_bound":"Njg4MTQ1MDc1","upper_bound":"Njk4NzYwNjgy","repeats":1},{"count":1352,"lower_bound":"NzAxMzU3NTQx","upper_bound":"NzE1MTUyNzI5","repeats":1},{"count":1360,"lower_bound":"NzE3MzA2NTcw","upper_bound":"NzMwMzg0NDA3","repeats":1},{"count":1368,"lower_bound":"NzM0NjQ2Njcw","upper_bound":"NzQwMDA5OTM4","repeats":1},{"count":1376,"lower_bound":"NzQ4Nzk1MDUx","upper_bound":"NzYwODY4NzIy","repeats":1},{"count":1384,"lower_bound":"NzYxODI2NDA0","upper_bound":"Nzc0Mjk3ODA0","repeats":1},{"count":1392,"lower_bound":"Nzg0MjQ3MDQ5","upper_bound":"Nzk0Mjg0NTE1","repeats":1},{"count":1400,"lower_bound":"Nzk1MDQzMjU5","upper_bound":"ODA4MjcwMDcw","repeats":1},{"count":1408,"lower_bound":"ODE0MDQ3Mzg2","upper_bound":"ODI3NDM2ODg3","repeats":1},{"count":1416,"lower_bound":"ODI3NjgzNjg2","upper_bound":"ODM1NTI4MjU5","repeats":1},{"count":1424,"lower_bound":"ODM2NDYwMjg3","upper_bound":"ODUyMDc1MTM4","repeats":1},{"count":1432,"lower_bound":"ODY0MjcyMTUw","upper_bound":"ODcwNDUwNjE2","repeats":1},{"count":1440,"lower_bound":"ODcyMTIxMjE5","upper_bound":"ODgzNDM2MDcz","repeats":1},{"count":1448,"lower_bound":"OTAzNDgwODcy","upper_bound":"OTE4MTU5Nzg4","repeats":1},{"count":1456,"lower_bound":"OTE4MzYxODE0","upper_bound":"OTI4MzQ5Nzgw","repeats":1},{"count":1464,"lower_bound":"OTMwMjE5NTM4","upper_bound":"OTQxNzY2NTI0","repeats":1},{"count":1472,"lower_bound":"OTQ2NDA1Mjgy","upper_bound":"OTUzNTIxMjEz","repeats":1},{"count":1480,"lower_bound":"OTU2NjcwODE3","upper_bound":"OTY1NTIzNzgz","repeats":1},{"count":1488,"lower_bound":"OTgwNTUyNzY2","upper_bound":"MTAwNTk3MjYzNA==","repeats":1},{"count":1496,"lower_bound":"MTAwNjIyMTk4Ng==","upper_bound":"MTAxNTg1NjI4Mg==","repeats":1},{"count":1504,"lower_bound":"MTAyNDA5NDE0MQ==","upper_bound":"MTAzMTkwODUxNQ==","repeats":1},{"count":1512,"lower_bound":"MTAzNjEwOTg3OQ==","upper_bound":"MTA0MzkyMDUyOQ==","repeats":1},{"count":1520,"lower_bound":"MTA1MDg1MjkyMQ==","upper_bound":"MTA1ODQ3MzYzMg==","repeats":1},{"count":1528,"lower_bound":"MTA2MDA0NTM2MQ==","upper_bound":"MTA3MTM3OTY2MA==","repeats":1},{"count":1536,"lower_bound":"MTA3NTk0NDQxNg==","upper_bound":"MTA4NzczODg3NA==","repeats":1},{"count":1544,"lower_bound":"MTEwMzkyMjY1OA==","upper_bound":"MTExNDY1NDQzNQ==","repeats":1},{"count":1552,"lower_bound":"MTExNzA1Mzg3OA==","upper_bound":"MTE0ODMzMDI0Mw==","repeats":1},{"count":1560,"lower_bound":"MTE1MDA0MDI0NA==","upper_bound":"MTE2ODg5MjY5NA==","repeats":1},{"count":1568,"lower_bound":"MTE2OTk3MDIzNg==","upper_bound":"MTE3OTIyMTM0NA==","repeats":1},{"count":1576,"lower_bound":"MTE4OTAyNjM1Mw==","upper_bound":"MTIwMzYzNDE5MA==","repeats":1},{"count":1584,"lower_bound":"MTIwNzExNTU1MQ==","upper_bound":"MTIyMzc0OTE0Nw==","repeats":1},{"count":1592,"lower_bound":"MTIyODg3ODcyOA==","upper_bound":"MTIzODU3MDM4Mw==","repeats":1},{"count":1600,"lower_bound":"MTI0MDA0NzYzMQ==","upper_bound":"MTI0OTg2OTIxMw==","repeats":1},{"count":1608,"lower_bound":"MTI1MjM4NjM3MA==","upper_bound":"MTI3NzIyMzY1Nw==","repeats":1},{"count":1616,"lower_bound":"MTI4MTQ2MTM1OA==","upper_bound":"MTI4OTI4MjgyNQ==","repeats":1},{"count":1624,"lower_bound":"MTI5Mzc5MTI5NQ==","upper_bound":"MTMwMjY5NDE1MA==","repeats":1},{"count":1632,"lower_bound":"MTMwNzg5NjExNg==","upper_bound":"MTMxODczMzg4Mg==","repeats":1},{"count":1640,"lower_bound":"MTMyNDgyNzk1Mg==","upper_bound":"MTM1MDY3MTUzNw==","repeats":1},{"count":1648,"lower_bound":"MTM1NjA3MTczMQ==","upper_bound":"MTM3MDM5OTcxNg==","repeats":1},{"count":1656,"lower_bound":"MTM3MTk5OTAwMA==","upper_bound":"MTQwNTE1MjE0OA==","repeats":1},{"count":1664,"lower_bound":"MTQwODE1NzIyMQ==","upper_bound":"MTQyMTg0NzU1OQ==","repeats":1},{"count":1672,"lower_bound":"MTQyNDc5NzI2MA==","upper_bound":"MTQzOTkzOTcwMQ==","repeats":1},{"count":1680,"lower_bound":"MTQ0MDA2OTIyMQ==","upper_bound":"MTQ0ODA3NDgzMA==","repeats":1},{"count":1688,"lower_bound":"MTQ1NDA2NDI0Mw==","upper_bound":"MTQ2MzEzMzM4NA==","repeats":1},{"count":1696,"lower_bound":"MTQ2NzEzOTk5Mw==","upper_bound":"MTQ3NTE2MjIxMg==","repeats":1},{"count":1704,"lower_bound":"MTQ4MzM3MzE5Mg==","upper_bound":"MTQ4ODg4NDk3Mg==","repeats":1},{"count":1712,"lower_bound":"MTQ4OTE0Mzg5Mg==","upper_bound":"MTQ5ODQwMzcyMg==","repeats":1},{"count":1720,"lower_bound":"MTUwMDkyMzg2NA==","upper_bound":"MTUwOTIzODQyNg==","repeats":1},{"count":1728,"lower_bound":"MTUyMjk5MDg5MA==","upper_bound":"MTU1NzYzODkxNQ==","repeats":1},{"count":1736,"lower_bound":"MTU1OTM2Mzc1Mw==","upper_bound":"MTU2MTkzNTU0OA==","repeats":1},{"count":1744,"lower_bound":"MTU4MTk2OTMxOQ==","upper_bound":"MTU5MDk2NzIyMg==","repeats":1},{"count":1752,"lower_bound":"MTYwMTE3NTc4Mg==","upper_bound":"MTYwOTIyNzgzNQ==","repeats":1},{"count":1760,"lower_bound":"MTYyMjQyNDkzNw==","upper_bound":"MTYyNDIwMTA1OA==","repeats":1},{"count":1768,"lower_bound":"MTYyNDI1NjkxMQ==","upper_bound":"MTYyNjE3ODM1NQ==","repeats":1},{"count":1776,"lower_bound":"MTYyNzgyMzM2Mg==","upper_bound":"MTYzNjY4Mjk2Mw==","repeats":1},{"count":1784,"lower_bound":"MTYzNzYyMjUyNA==","upper_bound":"MTY1MTU1MjI1Mw==","repeats":1},{"count":1792,"lower_bound":"MTY1MzU0NTM1Ng==","upper_bound":"MTY2NTY5MDQzNg==","repeats":1},{"count":1800,"lower_bound":"MTY3NzgxNzQ3Mg==","upper_bound":"MTY5ODc5NzYwNw==","repeats":1},{"count":1808,"lower_bound":"MTcwMjg0MTY3NA==","upper_bound":"MTcxMjY1MzQ0OQ==","repeats":1},{"count":1816,"lower_bound":"MTcxNDg1MzQ5MA==","upper_bound":"MTcyNDc5MzY1MA==","repeats":1},{"count":1824,"lower_bound":"MTczNzczMDEzMQ==","upper_bound":"MTc1MzQ3ODQ3Ng==","repeats":1},{"count":1832,"lower_bound":"MTc2MDkxMDcxMQ==","upper_bound":"MTc2NjU3MDg5NA==","repeats":1},{"count":1840,"lower_bound":"MTc2OTgyMDI2Mg==","upper_bound":"MTc4MDEyNjUzNA==","repeats":1},{"count":1848,"lower_bound":"MTc4NTUxNTEzMg==","upper_bound":"MTc5MjA2MTk4NA==","repeats":1},{"count":1856,"lower_bound":"MTc5MzQ5MTYwMg==","upper_bound":"MTgwMjA1MTY5NQ==","repeats":1},{"count":1864,"lower_bound":"MTgwODExODE0MA==","upper_bound":"MTgxNDU5MjI2Ng==","repeats":1},{"count":1872,"lower_bound":"MTgxNzgxNjU2Mg==","upper_bound":"MTgzMzEzOTA4Mg==","repeats":1},{"count":1880,"lower_bound":"MTgzOTkwMTcxNA==","upper_bound":"MTg2NjgzOTM5Nw==","repeats":1},{"count":1888,"lower_bound":"MTg3MTQ1OTgzNg==","upper_bound":"MTg3NTQ4MzcyNg==","repeats":1},{"count":1896,"lower_bound":"MTg3NTYxMjUxOQ==","upper_bound":"MTg5Mzg2NTQ2Nw==","repeats":1},{"count":1904,"lower_bound":"MTg5NTg3NjY3MQ==","upper_bound":"MTkwNjAzMTI5MQ==","repeats":1},{"count":1912,"lower_bound":"MTkwNjQ0MDc3Nw==","upper_bound":"MTkxNDM2NTc1NQ==","repeats":1},{"count":1920,"lower_bound":"MTkyNzE3MzU4Nw==","upper_bound":"MTkzNTQ0Mzc2OQ==","repeats":1},{"count":1928,"lower_bound":"MTkzOTQ2MjE0Nw==","upper_bound":"MTk0NTkwNjQ1Mg==","repeats":1},{"count":1936,"lower_bound":"MTk2Mjk2MDU5Mw==","upper_bound":"MTk3MTM1OTAyNw==","repeats":1},{"count":1944,"lower_bound":"MTk3OTUyMTY0OA==","upper_bound":"MjAxNTQ1ODM5OQ==","repeats":1},{"count":1952,"lower_bound":"MjAyMDQ0NTMyOQ==","upper_bound":"MjAyNDc1Nzc2OQ==","repeats":1},{"count":1960,"lower_bound":"MjAzMzY2MDc4Mg==","upper_bound":"MjAzODk4MTgxMg==","repeats":1},{"count":1968,"lower_bound":"MjA0NDQ5NTMxMQ==","upper_bound":"MjA1MTAzODc3Nw==","repeats":1},{"count":1976,"lower_bound":"MjA1NjAzODcyMg==","upper_bound":"MjA3NzA3OTY1NQ==","repeats":1},{"count":1984,"lower_bound":"MjA4NzI5NTkwOQ==","upper_bound":"MjEwMDE1MTIyNQ==","repeats":1},{"count":1992,"lower_bound":"MjEwMTIwNTkxOQ==","upper_bound":"MjExOTU3MzY4NA==","repeats":1},{"count":2000,"lower_bound":"MjEyNDU1NDEwMw==","upper_bound":"MjE0MTYzMzgzMQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,2,0,1,0,0,2,1,0,1,2,2,1,1,1,0,2,0,0,0,0,0,0,0,1,0,4,1,1,2,2,1,1,2,1,1,1,0,1,1,0,1,1,0,0,2,2,1,0,0,0,0,1,0,1,1,0,1,1,1,0,0,2,1,1,0,2,1,1,0,1,2,1,0,1,2,0,0,1,1,2,1,1,0,0,1,0,1,2,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,0,3,1,3,1,1,0,0,2,0,0,1,2,1,1,0,1,3,1,1,0,2,0,0,2,1,1,3,0,2,1,0,2,2,0,0,0,1,3,0,1,1,1,1,0,0,2,0,0,2,2,0,1,0,1,2,1,1,1,0,0,2,3,1,0,0,0,1,0,0,1,1,0,0,2,0,2,0,0,0,1,0,0,0,0,1,2,2,1,1,0,1,1,3,2,1,3,1,1,2,2,1,0,1,3,1,3,1,1,1,1,0,3,0,1,2,1,0,2,1,0,0,0,3,1,0,1,3,1,0,1,0,2,2,3,0,1,1,0,2,2,1,4,0,2,1,0,0,2,3,0,2,1,0,1,0,2,0,0,0,1,1,0,0,2,1,2,2,0,3,0,0,1,2,0,2,0,1,1,1,0,2,2,2,1,1,1,0,1,0,2,2,1,1,2,1,1,2,0,0,1,0,3,1,0,0,1,0,0,1,0,0,0,0,0,1,0,0,2,2,1,0,0,1,0,1,0,0,0,0,1,1,1,0,2,0,1,0,1,0,0,2,0,0,0,3,3,1,1,2,0,0,2,4,3,3,1,2,2,0,1,2,1,2,0,1,2,0,0,1,1,0,3,2,0,1,1,1,2,0,1,0,0,0,0,0,0,1,0,1,1,1,1,2,0,1,4,0,1,1,1,1,0,2,1,1,2,1,1,3,1,0,1,0,1,1,0,4,1,4,2,0,3,3,2,0,0,0,2,1,2,2,6,0,1,3,1,1,1,2,2,0,1,0,2,2,1,1,1,1,3,1,0,0,2,0,2,2,1,0,1,4,1,1,1,0,2,1,1,1,0,1,0,1,1,0,1,0,1,1,0,2,1,1,0,1,1,0,1,1,1,1,1,1,1,1,3,1,2,1,2,0,2,0,1,1,0,0,0,2,2,2,2,3,0,1,1,2,2,1,4,2,1,0,2,3,0,0,1,0,0,1,1,1,0,2,0,0,1,2,1,0,2,1,2,2,0,6,1,1,1,5,1,2,0,1,1,0,0,1,2,0,0,4,3,1,0,2,1,1,3,0,0,2,1,2,0,1,0,0,0,1,0,1,2,1,1,0,0,1,2,5,2,1,0,0,0,1,1,0,2,1,0,1,1,0,0,0,1,1,2,0,3,1,0,2,0,0,1,2,3,3,0,4,0,0,1,0,2,1,6,2,0,0,1,0,1,1,1,2,1,1,0,0,0,2,1,0,0,0,3,1,2,1,1,1,0,2,1,1,0,1,0,0,1,0,0,0,1,1,1,2,1,0,1,1,0,1,1,1,2,1,0,1,1,1,1,0,1,0,1,2,1,0,1,1,0,0,1,2,0,4,2,1,0,0,0,0,1,2,0,0,1,3,0,3,1,2,0,1,0,1,0,2,0,0,0,2,1,2,0,0,1,1,0,0,2,0,1,1,0,1,4,3,2,0,0,0,0,0,1,1,1,0,1,0,1,1,0,1,1,1,2,1,1,0,0,1,2,0,1,0,1,1,2,0,2,0,1,2,0,2,0,0,0,1,0,3,2,0,2,3,0,0,0,0,2,0,2,1,0,1,2,2,3,1,0,2,0,1,0,0,1,1,0,2,1,2,1,0,3,1,0,1,0,2,1,0,0,0,3,2,1,0,2,1,1,1,0,1,1,3,3,0,1,0,2,0,0,2,0,1,2,1,4,1,2,0,0,0,0,2,0,2,0,1,1,2,0,1,0,1,1,1,0,0,2,1,0,0,4,2,1,1,1,2,1,0,0,0,3,0,1,0,0,2,1,1,0,1,1,0,1,0,3,2,0,1,2,0,2,2,1,1,1,1,0,1,0,1,3,2,1,1,3,2,2,2,2,1,0,0,0,2,1,0,1,0,2,0,2,0,2,0,0,1,1,2,0,0,1,2,1,1,0,0,1,0,0,0,2,2,2,1,1,1,1,0,1,1,1,2,0,0,0,3,0,1,0,0,2,1,0,2,1,1,3,3,0,1,2,1,1,2,0,2,1,2,1,2,1,0,2,1,0,1,2,0,0,1,3,3,1,1,1,1,2,1,2,0,1,0,3,0,0,2,0,0,1,0,3,0,1,0,0,0,1,3,0,1,1,1,2,3,0,3,1,2,0,0,1,0,2,0,4,2,1,1,0,2,0,1,0,1,1,0,0,1,3,0,1,1,1,3,2,0,3,1,1,1,0,0,2,1,0,3,1,1,2,2,1,0,0,0,0,1,3,0,1,1,0,2,0,0,2,1,0,1,0,1,0,0,0,0,0,2,0,0,1,1,0,1,1,1,0,0,2,0,3,1,0,0,1,2,0,0,3,0,1,0,0,1,0,4,0,2,2,1,2,1,1,2,1,1,1,3,1,0,1,0,0,2,0,0,1,0,1,0,0,0,1,2,0,0,0,0,1,6,2,1,0,1,2,3,2,3,2,1,0,0,2,1,3,0,2,2,2,2,0,1,1,1,0,1,1,1,2,2,1,1,3,1,0,1,0,1,0,0,1,1,2,0,2,1,1,0,1,1,0,1,0,2,0,0,2,1,1,1,1,1,3,1,0,1,0,1,0,0,1,2,0,0,0,1,2,0,2,2,1,2,1,1,1,1,1,1,1,0,1,0,1,1,1,3,1,1,1,0,1,2,2,1,0,0,0,1,0,2,1,0,1,3,2,1,0,2,0,0,0,1,2,3,0,0,2,0,1,0,1,2,4,0,1,2,1,1,2,1,1,0,2,0,0,1,4,1,0,0,0,1,0,0,3,2,0,0,0,2,0,0,2,2,0,1,3,2,1,0,1,2,0,0,0,0,0,1,0,1,0,1,0,0,3,0,3,0,1,0,1,0,2,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,2,1,1,0,1,0,0,0,1,0,2,1,1,0,0,0,1,0,2,0,0,1,2,0,1,1,1,1,0,2,0,0,1,2,0,1,2,0,0,0,1,3,0,0,0,2,3,1,0,1,1,1,0,1,2,0,1,2,1,0,0,0,0,1,0,1,0,0,2,2,0,1,1,0,0,1,1,1,0,2,1,3,1,0,2,0,2,0,1,1,0,0,0,1,1,1,2,2,3,0,1,2,1,1,0,1,2,1,6,0,0,0,0,1,3,1,1,1,1,1,1,6,1,1,0,2,0,0,0,1,0,2,0,1,1,3,2,2,0,2,0,1,2,0,1,0,1,0,1,0,3,1,0,3,0,1,3,1,1,0,2,1,3,0,0,1,1,0,1,1,0,1,2,1,0,0,0,0,1,2,0,1,0,0,0,1,2,2,0,1,2,2,0,1,1,0,1,3,1,0,1,1,3,1,0,0,0,1,2,1,1,1,2,1,1,1,1,0,3,2,2,5,0,0,1,0,0,0,1,1,3,2,1,2,0,1,1,0,2,2,0,3,1,0,0,0,2,2,0,1,1,1,0,3,0,1,0,0,0,3,2,0,2,1,2,0,1,3,2,1,1,1,0,1,1,1,3,0,1,2,0,0,0,0,1,1,1,0,2,1,1,1,1,1,2,1,2,0,1,2,0,0,1,0,1,0,0,2,1,1,2,1,1,1,0,0,2,0,0,0,0,1,0,2,2,1,0,1,0,0,2,0,0,0,2,0,0,1,1,1,0,2,2,2,0,1,1,2,1,0,0,2,1,0,0,3,0,0,3,0,1,0,1,1,0,0,0,1,1,2,0,2,1,5,0,1,0,3,1,0,1,2,0,1,1,1,2,0,1,3,1,1,1,0,0,0,0,0,2,2,0,1,0,2,0,0,0,0,1,2,1,2,1,0,1,1,2,0,1,0,0,0,2,0,0,1,0,2,0,0,0,1,0,1,1,0,2,1,1,2,1,3,2,1,0,1,2,0,0,0,1,0,2,1,1,2,0,1,3,3,1,1,1,0,1,0,1,2,1,3,1,0,0,3,1,1,2,0,0,0,0,3,2,0,2,0,1,2,0,1,1,1,0,0,0,0,2,0,1,0,1,1,0,1,1,0,2,0,0,4,1,1,1,0,0,3,1,2,1,1,1,3,1,0,1,0,1,0,0,1,1,3,0,2,4,0,3,1,0,2,2,0,5,1,1,0,3,0,3,0,1,1,0,0,1,0,2,2,3,1,0,1,1,0,1,0,0,0,1,0,1,1,1,3,0,0,2,1,1,0,4,2,2,0,1,1,2,2,1,0,1,1,1,2,2,1,0,2,2,1,2,0,1,1,1,1,0,0,3,0,0,1,0,0,1,1,2,2,0,0,1,0,0,1,0,1,2,1,3,3,0,0,1,2,0,0,1,1,2,0,0,3,1,2,0,0,1,1,1,2,1,0,1,1,0,0,2]},{"counters":[0,1,2,1,2,0,1,0,2,1,1,1,0,2,2,2,0,0,2,0,0,3,0,1,2,1,0,1,1,1,0,2,0,0,0,1,0,2,0,3,0,3,0,1,1,1,1,0,4,0,3,0,2,1,1,1,1,1,0,0,1,1,3,1,0,2,1,1,2,2,0,3,0,1,1,0,1,1,1,2,0,3,1,2,2,1,0,2,1,0,2,2,1,3,1,1,1,2,0,0,0,0,0,1,1,0,2,2,3,0,1,3,1,1,1,0,0,1,0,0,0,2,2,2,0,1,0,1,1,0,0,1,1,1,2,2,0,1,0,1,1,0,1,2,2,0,1,0,1,1,0,1,1,0,0,1,0,2,0,1,0,0,0,1,0,0,1,2,0,1,0,0,1,1,1,2,0,5,2,1,0,0,1,1,1,1,2,3,2,2,0,0,1,0,1,2,2,0,1,1,1,2,0,0,0,2,1,0,0,0,0,1,1,0,2,1,2,1,2,1,1,1,0,0,0,0,0,1,1,1,2,2,1,2,2,3,1,0,0,0,2,1,3,1,2,1,2,1,2,0,5,3,0,1,1,0,0,1,0,0,1,0,0,3,1,1,0,1,1,1,2,2,1,0,0,1,0,0,1,0,1,1,1,1,0,2,1,3,0,1,3,1,1,2,1,0,2,1,0,0,1,1,0,2,2,1,2,2,2,0,0,1,1,0,0,0,1,0,0,0,0,0,2,2,0,1,1,1,3,0,1,1,1,0,0,2,2,1,0,2,2,0,0,1,3,2,2,1,0,1,2,3,2,0,0,0,1,0,1,0,1,2,2,0,0,2,1,0,0,2,2,3,0,1,2,2,2,1,2,1,1,0,1,2,3,0,1,0,0,3,0,1,3,1,0,1,1,1,1,1,0,0,3,2,1,1,0,2,0,0,1,0,2,2,3,1,0,0,0,2,2,0,0,0,2,3,0,0,1,0,2,1,1,2,2,0,2,3,2,0,1,1,1,0,1,3,1,2,2,2,1,1,0,0,3,4,1,1,2,2,1,0,0,1,2,1,1,3,2,0,1,0,1,1,1,0,2,0,1,1,1,0,1,0,1,0,2,0,1,0,2,0,1,3,1,1,0,0,1,3,3,1,1,1,1,0,1,1,3,1,0,0,2,1,1,1,3,0,2,0,1,0,3,0,1,0,3,0,0,0,0,1,2,1,1,0,1,0,1,3,1,0,3,1,2,0,0,0,3,0,0,1,0,2,0,0,0,0,2,0,1,1,1,0,1,2,1,1,0,1,0,0,1,2,0,2,0,2,2,3,0,2,2,3,1,1,0,0,1,1,0,0,0,1,0,1,1,0,0,0,2,0,1,1,1,2,2,1,1,1,0,2,1,2,1,2,2,0,0,1,1,1,1,1,0,0,1,2,1,0,1,2,0,2,1,2,1,1,0,1,0,3,2,3,0,2,1,2,3,2,1,0,2,0,0,0,2,1,0,2,1,1,1,1,1,0,0,1,0,0,1,1,1,0,0,0,2,2,1,2,2,0,0,1,2,0,1,0,3,3,0,1,0,1,1,1,0,0,1,3,0,1,3,1,1,1,0,0,2,0,0,1,1,2,1,1,1,1,2,2,1,4,0,1,1,1,1,2,0,1,1,1,4,1,1,1,1,1,0,2,1,2,1,0,1,1,0,0,0,0,0,1,0,4,1,0,1,1,1,2,1,1,0,2,0,0,0,0,3,1,1,1,1,1,2,4,0,0,0,0,2,1,1,1,2,1,1,0,0,0,0,1,1,0,1,2,0,0,0,0,1,0,1,1,2,3,0,2,2,2,3,1,0,1,1,1,1,1,0,2,0,0,1,2,1,1,1,2,2,1,1,2,0,0,0,0,0,3,1,1,0,5,2,0,0,2,1,3,1,1,2,1,2,0,1,1,1,0,0,0,2,2,0,1,0,0,3,2,2,1,2,0,1,1,2,1,1,0,0,2,1,3,2,1,2,2,0,1,0,0,1,1,1,4,1,1,1,0,0,4,3,1,1,1,4,2,1,1,0,3,2,2,1,2,0,1,0,1,0,1,3,1,2,2,2,2,1,3,0,1,0,0,2,0,0,2,0,0,3,1,0,1,1,2,1,1,1,1,2,1,1,2,1,0,1,0,3,3,1,1,2,0,1,0,2,1,2,1,1,1,0,0,1,0,1,1,3,2,0,0,2,0,0,0,2,1,2,0,1,0,1,0,2,0,1,1,1,2,1,1,0,0,0,1,0,0,1,0,0,0,2,3,0,2,0,0,0,1,1,0,1,1,0,1,0,1,2,1,0,0,1,1,1,2,0,0,0,2,2,0,0,0,0,1,0,0,2,1,0,2,2,0,0,1,0,2,0,0,0,1,1,1,1,1,2,1,0,0,0,0,1,1,1,3,1,3,1,1,1,1,0,1,3,0,1,1,0,1,0,2,0,1,1,0,0,0,0,1,0,1,0,0,0,1,1,0,0,0,0,2,1,2,0,0,3,1,0,0,0,0,2,0,1,0,2,2,2,1,0,0,1,1,1,0,1,2,1,0,1,1,0,2,0,4,2,1,2,0,1,0,0,0,0,2,1,0,2,1,1,2,0,1,3,2,1,4,0,2,1,0,1,2,2,0,0,1,0,1,0,1,1,3,0,1,0,1,1,1,1,1,1,0,1,1,1,1,2,3,0,2,1,2,2,1,0,0,2,0,1,1,0,1,0,0,1,1,1,2,1,2,1,2,0,3,0,5,0,1,3,2,2,1,0,0,1,1,0,1,0,2,0,0,0,1,0,0,0,0,0,3,1,1,1,0,3,0,0,1,0,0,1,1,0,0,0,0,0,2,2,2,0,4,1,1,1,0,1,0,0,0,2,2,0,1,2,2,2,1,2,1,2,2,0,2,2,0,0,2,3,0,0,1,2,0,3,2,0,2,0,0,1,2,0,2,1,1,1,2,0,1,2,1,1,1,0,0,0,1,0,1,0,2,1,0,0,1,0,2,1,0,0,1,3,0,1,0,3,0,0,0,0,1,2,3,2,1,1,0,0,1,0,2,2,0,3,0,2,1,0,2,2,0,2,2,0,0,4,0,0,0,0,0,0,0,0,2,0,0,0,2,0,3,0,0,0,1,1,1,2,1,0,2,2,0,2,0,1,0,1,0,0,0,1,1,1,0,1,0,1,1,1,3,0,0,0,1,2,0,2,0,2,1,0,0,0,0,2,1,1,0,1,2,0,1,0,0,1,0,1,3,0,1,2,3,0,2,0,0,0,0,3,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,1,1,2,2,0,0,2,0,1,1,3,0,0,1,0,0,0,0,3,3,1,1,1,0,0,2,1,1,4,1,1,0,2,3,0,0,0,0,2,1,2,0,2,1,2,1,0,1,1,0,1,1,0,2,1,1,0,0,1,2,1,2,1,1,2,0,2,1,2,1,1,1,1,5,1,1,0,0,1,0,1,1,2,1,2,1,1,0,1,0,0,1,1,0,0,0,0,0,0,2,1,4,1,1,0,1,2,2,2,1,4,0,1,0,1,1,2,0,2,0,1,0,1,1,1,0,1,1,1,1,2,2,1,1,1,0,2,1,2,0,1,0,1,2,0,1,1,2,0,1,2,1,2,2,0,1,3,1,2,1,3,1,2,2,1,0,1,0,1,1,4,1,1,2,0,0,0,1,1,0,1,1,1,1,2,0,0,0,1,1,2,1,2,1,1,1,0,1,1,2,0,1,0,1,0,0,2,0,0,2,0,2,1,0,0,1,0,2,0,3,0,0,0,1,1,1,1,0,2,1,1,3,1,2,0,0,2,1,1,2,0,0,3,0,1,0,0,3,1,0,3,2,0,1,0,1,1,2,1,2,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,0,0,2,1,1,0,1,1,0,0,5,0,0,0,1,0,0,0,0,1,1,1,1,6,0,1,1,1,2,0,0,1,0,0,1,2,2,1,0,2,1,2,0,1,4,0,2,2,0,1,0,0,2,0,0,2,2,0,1,0,1,0,3,0,3,1,0,0,0,0,0,0,1,1,1,1,1,0,0,1,2,3,1,1,0,0,3,0,1,0,0,2,1,1,0,1,1,2,2,1,2,0,2,1,1,3,1,0,1,1,1,0,0,0,0,1,1,1,1,2,0,0,1,3,1,1,0,1,0,0,1,0,2,1,1,2,2,1,2,3,1,1,1,1,2,2,3,0,0,1,1,1,0,1,1,1,1,2,0,1,0,0,1,2,2,1,1,2,1,0,1,0,3,0,0,1,1,1,4,1,1,0,0,0,1,1,0,0,0,2,0,2,1,2,1,0,1,0,0,0,0,0,2,1,1,2,2,0,0,0,1,0,0,0,3,1,1,0,3,2,1,2,4,3,0,0,0,0,1,0,2,2,2,2,0,0,1,2,1,1,1,0,1,3,0,0,1,0,0,1,2,0,2,1,0,1,2,0,0,0,2,4,1,0,2,0,1,0,1,1,1,1,0,0,0,2,0,1,2,0,2,1,0,0,0,0,0,4,2,1,2,0,2,2,3,1,0]},{"counters":[1,2,0,3,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,3,1,2,0,0,0,0,1,0,0,1,0,0,0,2,2,0,1,3,2,1,1,2,0,1,2,1,0,2,3,1,0,1,0,0,3,0,0,3,0,0,1,2,1,0,1,0,1,2,2,0,1,1,2,2,0,0,1,1,1,0,3,0,0,2,0,2,0,1,1,1,2,1,0,1,2,1,3,2,1,2,2,1,0,2,2,0,0,1,1,2,2,0,3,0,2,0,0,1,0,1,1,0,0,1,1,2,0,1,0,1,1,0,0,0,1,0,0,0,0,1,1,1,0,1,1,1,0,2,0,2,1,0,0,1,0,2,0,1,0,0,1,1,0,3,0,0,1,2,1,0,1,1,0,0,1,0,2,2,1,0,1,1,1,3,1,3,1,2,1,0,1,1,1,1,1,2,3,0,3,1,1,2,0,1,1,0,1,2,1,1,0,2,1,1,0,3,2,0,0,3,2,2,2,1,0,2,2,3,0,0,4,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,0,2,0,3,1,0,1,1,1,2,2,1,1,2,1,0,1,1,1,1,1,1,0,0,1,0,1,1,1,1,1,0,0,2,1,0,1,1,1,0,4,0,2,0,1,2,0,0,0,1,1,0,1,1,1,0,0,0,0,1,1,3,0,0,0,2,1,1,0,1,2,3,2,1,0,1,1,0,0,0,1,0,0,1,0,0,1,0,1,2,1,5,0,2,2,0,2,0,0,0,1,1,2,0,2,0,1,1,2,0,2,0,3,0,2,1,0,3,1,1,1,2,1,2,0,2,4,0,3,3,3,2,1,1,0,0,1,0,0,1,0,0,1,2,0,1,0,0,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0,2,1,2,3,2,1,1,2,0,1,1,0,1,2,0,0,0,1,2,0,0,1,1,0,2,2,0,4,0,0,0,1,2,1,1,0,1,1,1,1,1,0,0,0,2,0,0,0,0,1,1,0,1,0,1,1,0,0,1,1,1,0,3,2,0,0,0,0,1,0,0,1,2,1,3,0,0,2,0,1,1,1,2,2,1,0,0,2,1,0,2,0,2,1,0,6,0,0,1,1,0,0,1,0,0,0,2,0,0,2,1,1,2,1,0,1,2,1,0,1,1,1,2,1,1,0,1,0,0,0,2,3,1,1,0,2,2,0,0,0,0,4,1,1,1,1,0,0,0,2,2,1,1,2,1,1,1,4,1,1,2,0,1,0,0,2,3,0,2,1,2,0,0,1,1,1,0,0,1,0,1,0,0,1,3,0,4,1,0,0,0,0,1,1,0,3,2,0,0,0,3,1,2,1,1,0,0,1,1,0,3,1,0,1,1,0,0,0,0,0,3,3,1,2,0,2,0,1,1,0,1,2,0,1,1,1,1,1,3,0,2,3,0,1,1,1,2,2,2,2,0,2,2,1,0,0,0,1,0,1,1,1,0,2,1,3,1,5,0,0,0,0,1,1,3,0,0,0,3,1,1,0,2,1,0,1,0,2,3,1,1,1,1,1,2,0,1,0,1,1,0,1,1,1,0,1,1,0,0,1,1,0,0,2,2,1,2,1,1,2,1,2,2,2,2,1,1,0,0,1,0,2,1,0,1,2,1,0,1,0,0,2,0,1,1,1,0,1,3,0,1,2,1,1,0,1,1,1,1,3,1,1,3,2,0,0,1,0,2,1,0,0,1,1,0,2,4,0,1,1,2,2,1,0,1,0,2,3,0,2,1,2,2,1,0,0,1,0,2,1,0,1,1,1,3,0,0,0,1,1,0,2,0,0,0,1,0,1,1,1,0,1,1,2,1,1,1,2,1,1,1,1,1,2,1,2,0,1,2,1,0,1,0,0,0,0,2,0,0,2,0,0,0,0,1,3,1,0,0,2,5,2,1,0,3,0,1,0,0,1,1,2,0,2,3,1,1,1,1,3,1,0,2,1,0,0,3,2,0,0,2,1,1,1,1,0,1,1,2,1,0,0,1,0,1,0,1,0,2,3,1,0,1,1,0,0,1,1,0,1,1,3,1,0,0,0,1,0,1,1,1,0,0,0,3,0,1,2,2,0,0,1,2,0,0,2,0,1,1,0,2,2,0,1,0,1,2,1,1,2,1,0,2,1,2,1,2,1,0,1,1,2,1,1,1,1,3,0,0,2,1,0,1,1,0,0,2,1,3,0,3,1,2,1,0,3,1,2,2,1,0,0,0,1,2,0,1,1,1,1,2,1,2,0,0,1,0,0,1,0,0,0,1,1,2,1,0,1,0,0,1,2,1,0,0,0,0,0,3,0,0,2,1,0,2,3,1,1,2,1,1,0,1,0,1,2,2,4,3,0,0,1,3,2,0,0,0,2,3,2,2,2,1,2,1,1,0,0,2,0,0,2,1,2,3,1,0,0,1,0,0,1,2,0,0,2,1,1,0,2,1,1,1,0,1,0,0,2,5,0,4,3,1,2,0,1,0,0,1,1,1,0,1,0,0,1,1,0,4,1,3,3,1,0,2,1,0,2,0,1,2,1,0,0,0,3,1,2,1,1,2,2,2,3,0,1,2,0,1,0,0,1,0,0,1,2,2,1,2,0,0,1,1,2,3,0,1,1,2,1,1,0,0,1,0,0,0,3,1,2,0,0,0,0,0,1,0,0,0,3,1,3,0,0,1,3,0,2,0,0,0,1,0,0,1,3,0,1,2,1,1,1,2,0,1,1,1,2,2,1,1,3,2,0,3,2,2,1,0,0,3,4,0,2,1,1,1,0,3,1,0,0,3,0,0,0,0,1,1,1,0,1,0,1,0,0,1,1,2,2,2,1,1,2,1,0,2,0,0,1,1,1,1,0,0,1,1,1,1,0,0,2,2,0,2,2,0,1,3,0,0,0,1,0,1,1,1,2,0,0,0,0,1,0,1,1,1,2,2,1,1,3,1,1,1,0,1,1,0,2,1,2,1,2,1,1,1,0,0,0,0,0,3,3,0,3,3,2,1,2,2,1,0,0,1,0,1,1,1,0,1,2,0,2,0,1,2,1,3,0,2,0,2,1,0,2,3,1,0,1,1,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,2,0,2,2,1,2,1,0,3,1,1,1,3,3,1,2,3,1,0,1,1,1,1,0,1,0,2,0,1,2,3,0,1,1,1,0,1,3,2,2,2,4,0,1,0,2,1,1,2,0,2,2,2,1,0,0,1,2,1,2,1,0,0,0,0,1,0,1,2,0,1,0,0,1,2,1,1,0,0,1,1,1,6,2,1,2,1,0,0,1,0,1,0,1,1,3,0,0,1,3,2,1,0,0,4,1,0,1,0,1,0,0,0,1,1,1,1,1,1,0,1,0,0,1,2,3,1,1,2,3,1,0,2,0,1,0,0,0,2,0,2,1,1,0,1,1,1,3,1,0,0,2,1,0,1,3,2,0,0,2,0,0,1,1,2,2,1,1,2,0,2,1,0,0,1,0,1,2,0,1,2,1,0,1,0,1,1,0,2,4,1,0,0,1,1,1,1,2,1,0,1,3,1,2,1,1,1,1,1,2,0,0,1,0,1,0,1,1,1,2,0,2,1,3,1,0,0,0,0,0,0,1,1,2,0,3,2,1,0,0,0,1,1,2,1,0,1,1,2,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,0,0,0,1,3,1,0,1,2,1,3,1,3,0,0,0,1,1,0,1,0,0,0,1,0,1,0,0,1,1,0,0,2,1,1,1,1,0,1,0,0,0,0,1,2,0,1,3,0,0,4,2,4,1,0,1,1,2,2,0,3,1,2,1,3,0,3,1,0,1,0,1,1,0,0,1,1,2,0,2,3,2,0,1,0,2,0,2,1,1,0,1,0,0,2,0,2,1,1,2,2,3,0,2,1,1,2,1,0,0,0,1,0,2,1,1,0,0,0,2,2,1,0,1,1,1,1,1,0,1,0,1,1,1,2,0,1,0,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,0,1,1,0,1,0,1,0,0,0,0,1,0,2,0,2,2,0,6,1,1,2,1,0,1,1,1,2,0,0,2,1,0,1,3,2,0,1,1,2,2,1,2,0,1,1,0,2,0,0,1,0,0,0,1,0,0,1,0,0,3,1,0,0,0,1,2,1,2,0,0,2,1,2,0,1,1,1,0,1,0,2,2,1,5,1,2,0,1,1,1,2,0,1,0,2,0,2,1,1,1,2,1,0,0,1,0,1,2,3,1,3,0,0,1,2,2,0,1,2,0,0,0,1,1,2,1,1,0,0,2,1,5,1,1,2,0,2,0,2,2,1,0,0,1,1,0,0,2,1,0,2,1,1,0,1,1,1,2,1,1,1,1,0,0,4,2,1,1,0,0,1,2,2,1,2,0,1,0,1,0,4,0,3,1,0,2,0,0,0,0,0,3,2,0,1,1,0,0,1,0,0,0,2,1,0,0,1,1,0,1,0,2,1,0,0,3,0,1,0,2]},{"counters":[2,1,1,0,0,2,1,1,1,0,0,1,1,1,2,2,2,1,1,1,1,0,1,0,1,0,0,3,0,1,3,1,0,2,0,0,0,2,5,1,1,0,2,1,0,1,4,2,0,1,1,0,1,1,1,0,0,1,1,1,2,1,0,0,1,1,1,1,0,0,0,0,1,2,0,0,1,1,2,1,0,0,0,2,3,3,1,0,2,2,0,0,1,1,1,0,0,1,0,2,2,1,2,2,1,0,3,2,0,1,1,0,1,2,0,1,1,0,2,1,0,1,2,1,1,0,1,0,3,2,1,0,1,0,0,0,0,0,0,1,1,1,2,0,2,1,0,1,2,0,2,1,1,1,1,1,1,2,1,2,3,1,2,1,1,1,0,1,1,0,0,3,0,1,0,2,1,1,1,0,1,1,1,1,1,2,0,3,1,0,1,1,4,0,0,0,1,3,1,0,0,1,0,3,0,2,1,2,0,2,2,0,3,4,1,1,1,2,1,0,0,0,2,1,0,2,0,1,2,0,2,0,0,1,1,2,0,0,1,2,1,2,0,1,2,1,1,1,2,1,0,2,1,2,0,1,2,2,3,3,1,1,0,0,0,1,0,0,2,2,0,1,1,1,0,2,0,1,2,2,0,2,0,2,1,2,2,0,6,3,0,0,3,2,0,0,1,2,1,0,0,0,1,1,0,2,1,1,1,1,2,1,0,0,1,0,0,0,1,1,1,2,1,3,2,2,0,3,0,0,2,0,1,2,2,1,3,0,2,2,1,2,0,0,0,1,0,1,1,1,2,2,2,0,1,0,0,3,2,0,0,1,1,0,2,0,2,1,1,2,2,2,2,3,1,1,1,1,0,0,2,1,4,0,2,3,1,1,3,0,2,0,2,1,1,3,1,2,0,1,1,1,0,1,0,0,2,1,2,1,1,4,1,0,1,2,1,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,2,0,2,1,0,3,0,1,0,0,2,0,0,2,1,0,2,1,1,0,0,0,1,3,2,0,0,4,0,0,0,0,2,0,0,1,0,0,0,1,0,2,2,0,0,2,0,1,0,3,0,0,1,1,0,1,2,1,0,4,0,1,4,1,1,0,0,0,2,0,1,0,0,0,1,2,1,2,1,0,1,2,2,1,0,1,0,0,2,0,3,2,0,1,0,1,1,1,0,0,0,1,0,1,1,1,1,3,0,1,0,1,0,0,2,1,0,3,0,2,1,1,1,1,0,2,1,0,2,1,0,0,0,0,1,0,1,0,1,2,2,1,4,1,3,0,2,2,0,1,3,2,2,0,0,1,1,3,1,1,1,0,1,1,2,2,2,0,0,1,0,0,0,1,0,4,1,1,0,1,3,2,1,0,2,3,0,3,0,2,1,0,1,0,0,3,1,0,1,1,1,2,1,0,0,2,1,1,0,2,0,0,0,1,1,3,2,2,1,1,0,1,1,2,0,2,0,0,1,1,1,1,1,0,1,1,2,0,0,3,1,2,1,0,1,1,2,0,0,2,0,0,2,1,3,2,0,0,1,0,0,2,0,1,1,1,0,1,1,0,2,5,0,0,0,1,1,0,0,1,2,3,2,1,4,0,2,0,0,1,0,0,2,2,1,4,0,2,0,2,2,3,1,0,1,1,0,1,0,1,1,0,0,0,0,2,1,2,2,3,1,4,1,1,2,0,1,1,0,0,0,0,2,1,2,0,0,2,0,1,2,4,3,0,3,0,3,1,0,2,2,1,0,1,3,1,2,0,3,0,0,1,2,0,4,2,0,1,1,1,1,0,0,1,2,1,1,2,0,1,1,2,1,2,0,1,1,1,1,1,1,0,1,2,0,2,2,0,1,0,1,1,1,1,2,1,1,1,0,0,4,1,0,0,0,1,0,0,0,1,1,1,0,1,2,0,0,0,2,1,1,0,1,2,0,1,0,1,0,1,3,1,2,2,0,3,1,1,2,1,1,1,0,1,1,2,1,1,0,2,0,3,0,1,0,1,1,2,2,0,1,1,0,0,1,1,0,2,0,1,1,0,2,0,1,1,0,0,2,1,0,1,2,0,1,2,1,0,1,1,0,0,1,1,1,1,1,0,0,0,0,2,3,0,1,0,0,0,0,1,1,1,1,1,2,1,2,0,3,2,0,1,1,0,1,0,1,2,0,0,2,1,3,0,2,0,1,1,1,1,2,1,0,1,5,1,1,1,2,3,3,2,3,2,0,1,0,0,0,2,0,2,2,0,0,2,0,1,1,2,3,1,1,1,1,0,1,1,1,1,0,1,0,1,0,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,1,1,1,0,0,2,1,1,1,1,1,2,2,0,2,1,2,1,0,1,2,1,0,0,4,1,1,0,0,0,2,0,1,0,0,0,0,0,1,1,2,2,1,1,1,1,0,1,0,0,1,0,1,2,3,0,0,2,1,2,1,2,0,0,1,2,2,1,0,2,0,0,2,1,0,0,1,0,1,1,2,1,2,1,1,1,0,0,3,0,1,0,0,2,1,0,2,0,1,3,0,1,0,2,1,2,2,1,2,0,2,1,0,1,0,0,0,0,0,1,1,4,1,0,0,1,1,0,3,0,1,0,1,1,1,1,2,1,1,0,0,1,1,1,2,0,0,0,1,2,1,1,1,0,1,0,0,0,0,0,0,1,0,1,1,0,1,0,3,1,2,0,1,3,0,0,0,0,0,0,1,1,0,1,1,0,3,0,0,0,2,1,0,1,0,1,0,1,1,2,1,1,0,0,0,1,1,1,1,1,3,0,2,1,1,2,2,4,1,1,1,1,0,0,0,0,2,2,0,0,0,0,2,1,1,1,0,1,1,1,0,1,2,1,3,2,1,2,2,2,0,0,0,0,1,1,0,1,2,1,0,1,1,1,1,2,2,0,2,2,1,1,1,0,0,0,1,0,0,2,1,4,2,0,1,0,1,3,2,0,2,0,3,1,0,0,2,0,2,1,3,2,0,2,1,1,3,0,1,0,0,0,0,1,2,1,0,0,0,0,2,2,1,3,0,0,0,1,1,1,0,0,0,1,0,1,1,0,1,1,0,1,0,0,0,2,0,2,0,0,1,1,2,0,1,1,0,2,0,1,0,0,0,1,3,0,1,1,2,0,0,0,1,1,0,1,1,2,0,0,1,2,3,2,0,1,1,2,2,4,1,0,0,0,2,1,1,2,0,1,0,1,1,3,1,1,0,0,2,1,1,1,1,1,1,2,1,2,0,2,0,3,1,0,0,0,3,0,4,1,1,0,2,1,0,1,1,0,1,2,0,0,1,1,2,1,1,2,1,0,1,0,0,0,1,1,2,1,4,1,3,0,1,1,1,1,0,0,3,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,2,1,3,1,0,2,2,0,1,0,0,0,1,0,1,0,0,0,0,2,1,1,0,1,1,0,1,0,2,0,1,1,1,2,1,1,1,0,1,0,1,1,0,1,3,2,0,2,2,1,3,2,0,0,1,1,0,1,2,0,1,0,2,1,1,0,1,1,1,2,2,2,1,1,0,2,0,1,1,1,0,2,0,4,1,1,1,1,0,2,1,0,0,2,2,1,1,2,2,1,0,0,0,1,3,1,0,2,1,0,1,1,0,1,2,3,0,1,2,0,2,1,0,0,0,0,1,1,1,0,2,0,2,0,1,2,2,0,0,0,4,1,1,2,0,1,1,2,0,4,3,3,0,2,1,1,0,2,2,0,1,1,1,0,0,1,3,1,0,1,0,2,1,0,0,0,3,1,0,0,0,1,0,2,0,2,0,0,1,0,0,2,1,0,0,3,1,1,2,2,2,0,0,0,0,1,0,3,2,1,1,0,1,2,1,0,0,2,0,0,0,0,0,0,1,1,1,1,4,1,2,2,0,0,0,0,0,1,0,0,1,2,2,1,2,0,0,1,0,1,0,2,1,1,0,0,2,0,1,0,2,0,1,2,1,0,0,0,1,1,1,3,0,1,0,0,1,1,2,2,1,2,1,1,0,1,0,2,3,1,1,0,1,1,1,0,2,0,0,0,4,1,0,1,0,1,0,0,3,2,2,3,1,2,0,0,0,1,4,0,3,1,1,2,1,0,0,1,0,2,1,2,0,0,1,1,1,1,0,0,0,0,1,1,1,0,1,2,0,2,1,1,0,2,0,4,0,3,1,1,2,0,1,0,1,1,0,0,0,0,1,1,1,1,0,1,0,0,1,0,1,2,1,1,0,0,3,1,1,1,0,2,2,0,1,1,0,0,0,0,1,0,1,1,3,2,2,1,0,1,0,1,0,1,1,1,0,0,2,0,2,3,2,0,0,1,2,1,0,1,0,2,1,3,1,0,0,1,1,3,1,1,0,3,2,1,2,1,2,0,1,1,1,1,1,1,0,2,0,1,2,3,0,0,0,3,2,2,0,1,1,1,2,0,1,0,2,0,3,2,4,1,1,0,1,0,2,0,1,1,0,1,1,0,0,3,2,3,0,0,2,0,1,0,0,0,1,2,0,2,3,1,0,0,0,1,1,0,1,0]},{"counters":[0,0,2,1,1,1,0,4,0,2,0,3,0,2,3,2,1,0,2,2,3,2,0,0,1,3,4,0,3,0,2,1,0,2,3,0,1,0,0,1,1,1,1,0,0,2,4,1,1,0,2,1,2,0,0,2,0,0,0,0,0,2,0,0,0,2,0,1,2,1,3,2,1,0,0,2,0,1,1,0,0,1,2,2,2,2,2,0,1,0,0,2,2,1,2,0,1,0,2,2,3,1,0,1,0,0,0,0,0,1,0,2,2,0,0,1,1,1,0,0,3,2,1,1,1,1,1,0,0,0,1,0,2,0,1,3,1,1,2,0,0,1,0,1,1,1,2,0,0,0,0,0,0,2,1,1,1,1,2,3,0,1,1,2,3,1,3,0,2,1,1,0,0,0,1,0,0,1,1,1,0,1,0,3,1,1,0,1,4,0,2,1,1,5,1,1,2,1,0,1,1,1,0,1,0,2,1,0,0,2,2,0,1,1,1,1,0,2,2,3,0,0,1,1,1,1,3,2,0,4,1,1,1,1,2,2,1,3,1,0,0,1,3,2,0,0,2,2,2,0,1,0,1,1,0,0,0,0,1,0,2,0,2,0,0,0,1,2,2,2,0,1,1,1,1,0,0,1,1,1,5,1,1,0,1,0,1,1,1,1,0,0,2,1,2,0,4,3,1,1,4,0,0,2,0,3,2,1,2,1,0,1,0,0,1,1,1,1,0,2,2,3,0,0,1,0,1,2,1,1,2,1,2,0,1,0,0,1,2,0,0,0,0,0,3,0,1,1,1,0,0,2,0,0,1,1,0,2,1,3,2,2,0,1,0,0,2,2,2,0,2,0,1,3,2,1,3,1,1,1,2,0,0,1,3,1,1,1,0,1,3,1,1,0,1,0,0,0,1,2,0,0,1,0,1,1,0,0,0,0,0,2,0,1,0,1,0,2,0,0,0,3,2,4,0,1,1,2,2,1,0,0,0,0,1,0,2,0,2,1,1,2,1,1,1,1,0,0,1,0,1,0,2,1,2,2,1,1,0,0,0,1,0,0,2,0,2,1,2,0,1,0,5,2,0,0,0,0,0,1,2,1,0,2,0,2,1,1,0,1,1,2,0,1,1,0,0,0,1,0,1,0,3,1,0,1,0,2,0,3,1,0,1,0,0,0,3,0,1,0,0,0,2,3,2,1,2,1,0,1,1,0,2,2,0,0,0,1,1,3,1,1,0,0,0,0,0,2,1,1,0,1,0,0,1,1,1,1,1,1,0,1,0,3,3,0,2,0,0,0,0,0,2,0,1,0,1,1,0,1,1,0,2,2,3,0,1,1,0,3,0,0,0,0,1,0,1,1,1,1,0,2,0,0,2,0,2,1,1,0,0,0,1,3,2,0,2,0,2,2,4,0,1,0,1,0,1,4,1,0,0,0,0,1,0,1,2,1,1,0,1,1,3,0,0,2,1,1,1,2,2,0,0,1,1,0,2,0,0,0,0,1,3,0,1,3,0,0,0,1,0,0,0,0,0,0,0,1,4,1,0,1,0,0,3,0,0,0,1,0,0,1,1,2,1,1,2,1,0,0,2,2,3,1,0,0,0,2,2,2,0,0,1,0,0,1,2,1,0,0,1,2,0,2,0,2,0,1,0,1,1,1,1,2,1,1,1,1,1,1,0,3,1,0,0,1,1,0,1,1,1,1,2,0,1,0,0,1,1,3,0,1,2,1,0,1,1,1,1,2,1,2,0,1,3,0,2,2,0,1,0,2,0,2,0,2,1,2,2,2,0,0,1,1,1,0,0,0,1,0,1,0,0,2,0,0,2,2,2,0,2,2,3,0,2,1,0,2,0,1,2,0,2,1,0,0,1,1,0,0,0,2,0,3,2,2,3,2,1,2,0,0,3,1,0,1,1,1,0,2,3,0,0,1,1,1,0,1,1,0,1,2,0,1,0,0,0,0,2,2,1,0,2,0,0,3,2,2,3,0,2,1,0,1,0,2,3,0,1,2,0,0,3,1,0,0,1,2,1,2,1,2,1,0,3,1,0,1,1,0,2,3,0,0,0,1,1,0,3,0,0,1,0,1,0,2,0,4,1,5,0,4,0,0,0,3,3,3,0,1,0,2,0,2,0,1,0,1,0,0,1,1,0,0,2,0,1,0,0,1,1,0,0,0,2,0,1,3,2,2,0,2,1,0,0,3,0,0,1,1,0,2,0,4,1,0,1,2,4,2,0,0,0,1,1,1,3,2,3,0,0,2,1,0,3,2,0,4,3,1,0,1,2,1,0,0,1,0,0,1,1,1,0,1,2,1,3,2,3,2,1,1,2,0,1,1,3,2,1,2,0,0,0,1,1,2,1,1,2,0,1,0,1,0,0,0,0,0,1,0,2,3,2,2,0,1,0,0,0,1,1,0,1,2,0,1,3,0,1,0,0,0,0,0,0,0,1,4,0,2,1,0,2,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,1,2,0,0,1,0,1,0,2,1,3,0,3,1,0,3,0,1,1,0,1,2,0,1,0,1,2,1,0,0,1,0,1,1,1,1,0,0,2,0,0,2,0,0,0,0,1,1,0,1,2,1,1,2,1,1,0,1,0,0,1,0,1,0,2,2,1,0,1,0,2,0,0,1,2,3,0,0,0,0,2,1,1,0,2,0,0,0,3,2,1,0,1,2,3,1,0,0,2,1,1,2,0,2,1,2,0,2,2,0,0,0,1,2,0,0,1,1,0,0,1,2,1,1,2,0,2,1,0,2,0,0,2,1,0,1,1,1,0,1,0,0,0,1,1,3,2,0,0,2,0,0,0,3,0,1,1,1,2,0,4,1,1,0,1,0,1,0,0,1,1,0,0,2,0,1,0,1,2,0,1,1,2,1,0,0,1,2,0,0,1,1,1,1,0,0,2,1,2,1,2,2,1,0,3,1,1,1,1,0,1,2,1,0,0,0,1,2,1,0,0,2,0,0,4,0,2,2,0,1,1,1,0,0,3,3,2,0,0,0,1,0,0,2,1,1,2,0,0,1,0,1,1,1,0,1,1,2,0,1,1,2,0,0,2,0,0,1,1,1,1,1,0,3,2,1,1,1,1,1,0,2,1,2,1,0,3,3,1,2,0,3,0,0,1,2,2,1,3,0,1,3,0,4,1,0,2,3,2,4,2,3,1,2,2,0,1,1,1,1,2,1,1,2,2,0,0,2,0,0,0,0,1,1,1,0,0,1,0,0,1,0,2,2,2,0,1,1,0,0,1,1,0,0,1,0,0,1,2,2,1,2,1,1,1,0,0,1,1,1,2,0,1,3,3,1,1,1,0,2,1,3,1,0,0,0,0,1,2,2,1,1,2,3,1,2,0,3,2,0,0,0,3,0,1,1,0,3,2,2,0,1,1,0,0,1,2,1,1,2,2,0,2,1,2,1,0,0,1,1,2,2,1,1,1,1,0,0,2,0,0,0,1,0,1,0,2,1,1,0,1,1,0,0,0,2,1,1,2,2,2,0,1,0,0,3,2,2,1,0,2,1,1,0,0,0,2,0,0,1,0,1,1,0,0,0,0,1,1,1,3,0,1,1,2,1,2,1,2,4,0,1,0,0,1,1,0,0,0,0,0,2,4,0,2,2,1,0,0,3,0,1,0,0,2,1,1,0,2,0,0,1,2,1,1,0,2,0,0,2,0,1,0,1,1,0,0,2,0,2,0,2,0,1,0,0,1,1,1,0,0,0,0,0,1,1,3,2,2,3,0,1,0,1,1,3,1,2,4,0,1,2,2,1,1,0,1,1,2,2,0,3,1,0,1,1,2,0,0,4,2,2,0,0,1,2,0,1,1,1,0,0,1,1,1,4,3,1,1,0,0,1,0,0,0,0,1,1,0,0,2,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,3,0,2,1,0,0,0,1,0,1,0,0,2,1,0,1,2,1,1,1,0,2,1,1,0,1,0,0,0,1,1,1,0,1,2,2,0,1,0,1,0,0,0,2,0,0,0,4,3,2,0,0,0,2,2,0,2,1,1,1,1,1,3,1,1,2,2,0,4,1,1,2,0,1,0,0,2,0,0,2,1,0,2,0,2,0,2,1,1,2,0,2,2,2,0,4,0,2,0,1,1,0,1,1,3,1,0,3,2,1,1,2,2,0,0,3,0,0,2,1,0,3,1,3,1,1,2,1,1,0,2,1,0,0,1,2,0,0,1,1,2,1,2,0,1,1,1,3,0,1,1,0,0,1,1,0,2,0,0,0,0,3,0,4,1,2,3,0,0,0,2,2,2,0,0,0,1,0,0,1,0,1,1,3,1,1,2,2,1,3,1,0,0,0,2,2,0,1,1,4,1,1,0,1,2,3,1,1,0,0,0,1,1,1,1,0,1,0,2,1,0,1,2,1,0,2,0,1,0,1,0,2,0,2,0,1,2,0,1,3,1,1,1,0,0,1,3,2,0,0,0,0,2,0,1,1,0,0,0,1,0,2,1,0,1,2,1,1,1,5,0,0,1,1,1,3,0,2,0,0,1,0,1,3,4,2,1,1,0,0,3,2,0,3]}]},"null_count":0,"last_update_version":397952041253339136},"bcc":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxMzk3OTYxNzc=","upper_bound":"LTIxMjg2OTg4Nzk=","repeats":1},{"count":16,"lower_bound":"LTIxMjgzNjUyNjg=","upper_bound":"LTIxMTYwOTU3NTM=","repeats":1},{"count":24,"lower_bound":"LTIxMTEwNDc3Nzg=","upper_bound":"LTIxMDY0OTkzMzI=","repeats":1},{"count":32,"lower_bound":"LTIxMDE2NzA2MTM=","upper_bound":"LTIwODk3MDExMDE=","repeats":1},{"count":40,"lower_bound":"LTIwODkzNjQyMzQ=","upper_bound":"LTIwNzk0MDY5MDg=","repeats":1},{"count":48,"lower_bound":"LTIwNzkyNjA3MzM=","upper_bound":"LTIwNjg0NTE4MDY=","repeats":1},{"count":56,"lower_bound":"LTIwNjEzMDAzOTk=","upper_bound":"LTIwNTcyOTEwODg=","repeats":1},{"count":64,"lower_bound":"LTIwNDg0NDE1MjI=","upper_bound":"LTIwNDExNzkxOTg=","repeats":1},{"count":72,"lower_bound":"LTIwMzg3MjU3NTg=","upper_bound":"LTIwMzE3MTYyMzA=","repeats":1},{"count":80,"lower_bound":"LTIwMzAxMjI3NTM=","upper_bound":"LTIwMTYzOTE3MDg=","repeats":1},{"count":88,"lower_bound":"LTIwMTQ5OTAxNTE=","upper_bound":"LTE5ODIwODkyODI=","repeats":1},{"count":96,"lower_bound":"LTE5ODA3NjIxMjk=","upper_bound":"LTE5NTg0MjAwMTM=","repeats":1},{"count":104,"lower_bound":"LTE5NTgyNjc1OTI=","upper_bound":"LTE5NDU2NDE1NTg=","repeats":1},{"count":112,"lower_bound":"LTE5Mzk3NDQ0ODM=","upper_bound":"LTE5Mjc2NDIyMDg=","repeats":1},{"count":120,"lower_bound":"LTE5MTc0MjE0NjM=","upper_bound":"LTE5MDc1ODE0Mjc=","repeats":1},{"count":128,"lower_bound":"LTE5MDcxMzg4MzA=","upper_bound":"LTE4OTU3NzI1NDg=","repeats":1},{"count":136,"lower_bound":"LTE4OTEzNzg1OTQ=","upper_bound":"LTE4ODY4NTY4MjE=","repeats":1},{"count":144,"lower_bound":"LTE4ODM0NTY3MjA=","upper_bound":"LTE4Nzc0NzM4NTQ=","repeats":1},{"count":152,"lower_bound":"LTE4NzU3NjQ5MjQ=","upper_bound":"LTE4NTk0NTE0Nzk=","repeats":1},{"count":160,"lower_bound":"LTE4NTY4NzUwNTY=","upper_bound":"LTE4NTQ5MjI4MjY=","repeats":1},{"count":168,"lower_bound":"LTE4NDcxMzAwMjc=","upper_bound":"LTE4NDYwOTUwMjg=","repeats":1},{"count":176,"lower_bound":"LTE4Mjg4MjYzMDI=","upper_bound":"LTE4MDUzODkzNTg=","repeats":1},{"count":184,"lower_bound":"LTE4MDM1ODg3OTY=","upper_bound":"LTE3OTY5MTc1MDc=","repeats":1},{"count":192,"lower_bound":"LTE3ODc0NjE4MDA=","upper_bound":"LTE3Nzk0Mzg5MzQ=","repeats":1},{"count":200,"lower_bound":"LTE3NzkyNjA1MzY=","upper_bound":"LTE3NjAxNjMyMzI=","repeats":1},{"count":208,"lower_bound":"LTE3NjAwNDg3NDU=","upper_bound":"LTE3NTEwMzcxMjE=","repeats":1},{"count":216,"lower_bound":"LTE3NDg5MTY1NjI=","upper_bound":"LTE3MjAzNTEwNjg=","repeats":1},{"count":224,"lower_bound":"LTE3MTQzMjE5ODk=","upper_bound":"LTE2ODkyMzY1NjI=","repeats":1},{"count":232,"lower_bound":"LTE2ODkyMTY0MDc=","upper_bound":"LTE2NzM3MTgyNzU=","repeats":1},{"count":240,"lower_bound":"LTE2NzIwNzM5MjI=","upper_bound":"LTE2NjIxODM3Njg=","repeats":1},{"count":248,"lower_bound":"LTE2NDYwMTAxMTY=","upper_bound":"LTE2MzQ1MzAyNzQ=","repeats":1},{"count":256,"lower_bound":"LTE2MjQ0OTk5OTY=","upper_bound":"LTE2MTY1MzMxMzQ=","repeats":1},{"count":264,"lower_bound":"LTE2MTE0MzYzOTY=","upper_bound":"LTE2MDI4MjgzNzA=","repeats":1},{"count":272,"lower_bound":"LTE2MDIwOTc3Nzg=","upper_bound":"LTE1NzQ3NDQzNjA=","repeats":1},{"count":280,"lower_bound":"LTE1NzA0NzI2ODE=","upper_bound":"LTE1NTA3NzU0MTQ=","repeats":1},{"count":288,"lower_bound":"LTE1NDY1NjcyNTU=","upper_bound":"LTE1Mzc4ODk4Njc=","repeats":1},{"count":296,"lower_bound":"LTE1MzU5NjkxNzU=","upper_bound":"LTE1MDQzODAwMjY=","repeats":1},{"count":304,"lower_bound":"LTE1MDMyODkwNTk=","upper_bound":"LTE0ODk2NDczNDA=","repeats":1},{"count":312,"lower_bound":"LTE0ODU2OTg5Mzk=","upper_bound":"LTE0NjExMDc5NjA=","repeats":1},{"count":320,"lower_bound":"LTE0NTE1MjEzNDg=","upper_bound":"LTE0NDk3NTMxMTM=","repeats":1},{"count":328,"lower_bound":"LTE0NDc0MDc1ODU=","upper_bound":"LTE0NDM0OTQ5ODA=","repeats":1},{"count":336,"lower_bound":"LTE0MjY2NzcwMDg=","upper_bound":"LTE0MDMzNTQ2NjQ=","repeats":1},{"count":344,"lower_bound":"LTE0MDAwOTYzNzI=","upper_bound":"LTEzODE4MjM3NDE=","repeats":1},{"count":352,"lower_bound":"LTEzNzkzNTI3NDk=","upper_bound":"LTEzNTUxNjk4MDE=","repeats":1},{"count":360,"lower_bound":"LTEzNTIyNDE3MTQ=","upper_bound":"LTEzNDcyMjc1Nzg=","repeats":1},{"count":368,"lower_bound":"LTEzNDcwMjQwOTY=","upper_bound":"LTEzMzQzMjgwNzI=","repeats":1},{"count":376,"lower_bound":"LTEzMzI4MTg0Mzc=","upper_bound":"LTEzMjIxMDUzMTI=","repeats":1},{"count":384,"lower_bound":"LTEzMjE0Njg5NjE=","upper_bound":"LTEyOTUyNDE5ODQ=","repeats":1},{"count":392,"lower_bound":"LTEyOTUwNTM0Nzk=","upper_bound":"LTEyODUzNDU0Mjc=","repeats":1},{"count":400,"lower_bound":"LTEyODA4MzY3NDM=","upper_bound":"LTEyNzE0NTEzOTE=","repeats":1},{"count":408,"lower_bound":"LTEyNzAyODgxNjc=","upper_bound":"LTEyNjYxOTIyMjU=","repeats":1},{"count":416,"lower_bound":"LTEyNjE2NDA2MDc=","upper_bound":"LTEyNTExMjk1NTg=","repeats":1},{"count":424,"lower_bound":"LTEyNTAwOTU1ODM=","upper_bound":"LTEyMzc4OTI2NzE=","repeats":1},{"count":432,"lower_bound":"LTEyMzM2MjI5Mjc=","upper_bound":"LTEyMTU0NDI5Nzg=","repeats":1},{"count":440,"lower_bound":"LTEyMTUwNjYxMjA=","upper_bound":"LTEyMDA3MzYyMzc=","repeats":1},{"count":448,"lower_bound":"LTExODU0MTY2OTE=","upper_bound":"LTExNzAwMDA3Nzc=","repeats":1},{"count":456,"lower_bound":"LTExNjk3NTYwNjA=","upper_bound":"LTExNDUyNTMwMzE=","repeats":1},{"count":464,"lower_bound":"LTExNDQ1OTY5ODI=","upper_bound":"LTExMjgwOTA1NzA=","repeats":1},{"count":472,"lower_bound":"LTExMjIxOTYxNTk=","upper_bound":"LTExMDc5NDY4NTE=","repeats":1},{"count":480,"lower_bound":"LTExMDI4MzAwNTQ=","upper_bound":"LTEwODMxMTc5NDY=","repeats":1},{"count":488,"lower_bound":"LTEwODI4MTk1MDc=","upper_bound":"LTEwNzM3MzY2MjA=","repeats":1},{"count":496,"lower_bound":"LTEwNzMwMDAxNTc=","upper_bound":"LTEwNjUzNzIzOTM=","repeats":1},{"count":504,"lower_bound":"LTEwNjI4Njk5NDc=","upper_bound":"LTEwNDg4NDUwMjQ=","repeats":1},{"count":512,"lower_bound":"LTEwNDU2ODA4MDc=","upper_bound":"LTEwMzQ0NjcxOTY=","repeats":1},{"count":520,"lower_bound":"LTEwMzA2NDY1Mzk=","upper_bound":"LTEwMjAyNDM5Mjg=","repeats":1},{"count":528,"lower_bound":"LTEwMTgxNDYyODI=","upper_bound":"LTEwMTYyOTUzNTk=","repeats":1},{"count":536,"lower_bound":"LTEwMTU4OTYwMzE=","upper_bound":"LTEwMDQ3MjQyMDc=","repeats":1},{"count":544,"lower_bound":"LTEwMDE3NjUzODI=","upper_bound":"LTk4NzkwOTA1Mg==","repeats":1},{"count":552,"lower_bound":"LTk4NTAxNTUwMg==","upper_bound":"LTk4MDk3MTAyOQ==","repeats":1},{"count":560,"lower_bound":"LTk3OTE1ODU5OQ==","upper_bound":"LTk3NjI0Njk4MA==","repeats":1},{"count":568,"lower_bound":"LTk3NTc5MTk1Nw==","upper_bound":"LTk2ODUwNjYwOQ==","repeats":1},{"count":576,"lower_bound":"LTk2MzU5Mjg2OA==","upper_bound":"LTk0OTA3NzcwMg==","repeats":1},{"count":584,"lower_bound":"LTk0ODExMTYxNQ==","upper_bound":"LTkzMDk5NzQ3OA==","repeats":1},{"count":592,"lower_bound":"LTkzMDEzMzE0MA==","upper_bound":"LTkwOTI3NzU2MQ==","repeats":1},{"count":600,"lower_bound":"LTg5Nzc2MzY3Nw==","upper_bound":"LTg4NTM3ODcwMQ==","repeats":1},{"count":608,"lower_bound":"LTg4MDY0Mzk4OQ==","upper_bound":"LTg2NDk2Mzg3MA==","repeats":1},{"count":616,"lower_bound":"LTg2NDc2OTI2Mg==","upper_bound":"LTg0MzgxMzMwMw==","repeats":1},{"count":624,"lower_bound":"LTg0MjExNjMxMQ==","upper_bound":"LTgzMTg4OTYwNA==","repeats":1},{"count":632,"lower_bound":"LTgzMTY5MDE4NA==","upper_bound":"LTgxOTkwODYwNw==","repeats":1},{"count":640,"lower_bound":"LTgxOTY5ODk1OQ==","upper_bound":"LTgwODIwODcyMg==","repeats":1},{"count":648,"lower_bound":"LTgwNzE4MDAyOA==","upper_bound":"LTc5NTgzMTU0NQ==","repeats":1},{"count":656,"lower_bound":"LTc5NDQxMjYwNQ==","upper_bound":"LTc4NzkzNTk4NA==","repeats":1},{"count":664,"lower_bound":"LTc3MzI2MjY4Mw==","upper_bound":"LTc2Nzg1OTUzMQ==","repeats":1},{"count":672,"lower_bound":"LTc2NDk0NjIyMA==","upper_bound":"LTc0ODk0NjI3MQ==","repeats":1},{"count":680,"lower_bound":"LTc0ODI5MTQyOA==","upper_bound":"LTczOTY0MTU3Nw==","repeats":1},{"count":688,"lower_bound":"LTcxNTg0MjI1Ng==","upper_bound":"LTY5NTc5MjQ0OA==","repeats":1},{"count":696,"lower_bound":"LTY5NDIwOTAzNA==","upper_bound":"LTY4ODQ5MTA1NQ==","repeats":1},{"count":704,"lower_bound":"LTY4NzUzMDU2OA==","upper_bound":"LTY4MjQ2MjcwOA==","repeats":1},{"count":712,"lower_bound":"LTY4MDE3MTAzNA==","upper_bound":"LTY1ODg3OTE2Mg==","repeats":1},{"count":720,"lower_bound":"LTY1ODI2MzMyNw==","upper_bound":"LTY1MjMzMzAyMA==","repeats":1},{"count":728,"lower_bound":"LTY0OTUxMTQxNA==","upper_bound":"LTY0NDYzOTU1Ng==","repeats":1},{"count":736,"lower_bound":"LTY0MzAwNjgwNA==","upper_bound":"LTYzNDc1ODY3Ng==","repeats":1},{"count":744,"lower_bound":"LTYyOTI2MjgyNw==","upper_bound":"LTYyNDM1MzY3Mg==","repeats":1},{"count":752,"lower_bound":"LTYxNjYyMTUxNg==","upper_bound":"LTYwMzE5NDkxNA==","repeats":1},{"count":760,"lower_bound":"LTU5MjMyNDY4NQ==","upper_bound":"LTU2NzYyODIzNQ==","repeats":1},{"count":768,"lower_bound":"LTU2Njg2NTkxMw==","upper_bound":"LTU0MDQ4NDI5Ng==","repeats":1},{"count":776,"lower_bound":"LTUzNTUwMzg4Mw==","upper_bound":"LTUyMzUzODc0Mw==","repeats":1},{"count":784,"lower_bound":"LTUxODc0MDQxNg==","upper_bound":"LTUwNzM4MzM5MQ==","repeats":1},{"count":792,"lower_bound":"LTQ5NzUxMDQyMQ==","upper_bound":"LTQ5MDA1MTQ2NA==","repeats":1},{"count":800,"lower_bound":"LTQ4ODc5NzcyOQ==","upper_bound":"LTQ4MjM1OTEyNw==","repeats":1},{"count":808,"lower_bound":"LTQ3Mjg2ODg5Mw==","upper_bound":"LTQ1NzM5NjkyMg==","repeats":1},{"count":816,"lower_bound":"LTQ0OTkzMDQ1Ng==","upper_bound":"LTQzOTg3NzM4OQ==","repeats":1},{"count":824,"lower_bound":"LTQyODk5ODQxNw==","upper_bound":"LTQyNDMxNTAwMQ==","repeats":1},{"count":832,"lower_bound":"LTQyMjUzMzg1Mw==","upper_bound":"LTQwOTM5NDk1NA==","repeats":1},{"count":840,"lower_bound":"LTQwMTY0MDAwNA==","upper_bound":"LTM4OTI5NDYyNg==","repeats":1},{"count":848,"lower_bound":"LTM4MDQ5MDQ4MQ==","upper_bound":"LTM2NzAyNjYyOA==","repeats":1},{"count":856,"lower_bound":"LTM2NTM2MTA1Ng==","upper_bound":"LTM2MjE1NjYwNw==","repeats":1},{"count":864,"lower_bound":"LTM0MTY3MjcyMA==","upper_bound":"LTMzMDgwNDkzNQ==","repeats":1},{"count":872,"lower_bound":"LTMyNzk2NTM3Ng==","upper_bound":"LTMyNDc0MDYzNQ==","repeats":1},{"count":880,"lower_bound":"LTMyMjQzNDY5MQ==","upper_bound":"LTI4NDM4NTQzNg==","repeats":1},{"count":888,"lower_bound":"LTI3ODI4MTQzOQ==","upper_bound":"LTI2MzM2NDYzMw==","repeats":1},{"count":896,"lower_bound":"LTI2MTczNjA3Ng==","upper_bound":"LTIzODYwMTcwMQ==","repeats":1},{"count":904,"lower_bound":"LTIyMTU4MjQ2Ng==","upper_bound":"LTIwNzEwMjM0Mw==","repeats":1},{"count":912,"lower_bound":"LTIwNDM1NDQ1MA==","upper_bound":"LTE5NTg3MDcwNA==","repeats":1},{"count":920,"lower_bound":"LTE5NDIxNDYxNw==","upper_bound":"LTE3Mjc3NjYyOA==","repeats":1},{"count":928,"lower_bound":"LTE3MTc3NjY1NA==","upper_bound":"LTE1OTMyNjczNw==","repeats":1},{"count":936,"lower_bound":"LTEzNDg2MzU1Mg==","upper_bound":"LTEwOTExNjIzNg==","repeats":1},{"count":944,"lower_bound":"LTEwNjYyMTA0MA==","upper_bound":"LTk0NTA5MjI0","repeats":1},{"count":952,"lower_bound":"LTg3ODAwODY2","upper_bound":"LTgzNDI5OTYz","repeats":1},{"count":960,"lower_bound":"LTc5MzU4MjMy","upper_bound":"LTQ0NjE4NTI1","repeats":1},{"count":968,"lower_bound":"LTQwODg2NDk1","upper_bound":"LTI1NzAyMDg3","repeats":1},{"count":976,"lower_bound":"LTE4MTI2OTA5","upper_bound":"LTEyNTU1NjQx","repeats":1},{"count":984,"lower_bound":"LTEyMzQxOTcz","upper_bound":"MTIxMzI0MDg=","repeats":1},{"count":992,"lower_bound":"MTcyNzk3NDc=","upper_bound":"MTkzNjgxODY=","repeats":1},{"count":1000,"lower_bound":"MjAyOTI4MzQ=","upper_bound":"MjQwNTEzNDQ=","repeats":1},{"count":1008,"lower_bound":"MjYyMDU4NzY=","upper_bound":"NTA3NjEyNzE=","repeats":1},{"count":1016,"lower_bound":"NTQ1Njc2Mjg=","upper_bound":"NzQwMTUyMDM=","repeats":1},{"count":1024,"lower_bound":"OTQ2OTkzNTQ=","upper_bound":"MTAyNTgzNDI0","repeats":1},{"count":1032,"lower_bound":"MTAzNzQ1MTUx","upper_bound":"MTExMTEyMzYw","repeats":1},{"count":1040,"lower_bound":"MTE5OTM1NjI3","upper_bound":"MTMxOTk5MjUw","repeats":1},{"count":1048,"lower_bound":"MTQwMzQ5NTQy","upper_bound":"MTU0MjYyNDQy","repeats":1},{"count":1056,"lower_bound":"MTU1NzA5MTgy","upper_bound":"MTc3MzQwNTEx","repeats":1},{"count":1064,"lower_bound":"MTgwMjA0NjQy","upper_bound":"MTg2NjU0Mjk2","repeats":1},{"count":1072,"lower_bound":"MTkwNDMyNDky","upper_bound":"MjAzNTY0OTM5","repeats":1},{"count":1080,"lower_bound":"MjI1NTk0OTM4","upper_bound":"MjMwOTQ5NjQ1","repeats":1},{"count":1088,"lower_bound":"MjM3MDY1ODY2","upper_bound":"MjM5NzU3NTk4","repeats":1},{"count":1096,"lower_bound":"MjQzMTI1NTU1","upper_bound":"MjQ4NTIwNDYx","repeats":1},{"count":1104,"lower_bound":"MjUwODg1MjM1","upper_bound":"MjcxODc4Njg5","repeats":1},{"count":1112,"lower_bound":"MjcyNzQ0MzI0","upper_bound":"Mjk2MDA1Mzc3","repeats":1},{"count":1120,"lower_bound":"Mjk2Mzk2Mzk0","upper_bound":"MzAxODYzMDcz","repeats":1},{"count":1128,"lower_bound":"MzAzNTc0Njkz","upper_bound":"MzA5MjQ4NDkw","repeats":1},{"count":1136,"lower_bound":"MzEwNDcwNDc4","upper_bound":"MzE4NjU0MTA5","repeats":1},{"count":1144,"lower_bound":"MzIzODM1ODM2","upper_bound":"MzMwNjE4MzY5","repeats":1},{"count":1152,"lower_bound":"MzM3MTkxNDQ1","upper_bound":"MzQzNTM2Mzgy","repeats":1},{"count":1160,"lower_bound":"MzQ2NTMwMzk3","upper_bound":"MzU5OTY2MjEz","repeats":1},{"count":1168,"lower_bound":"MzYwMjM4OTk0","upper_bound":"MzcyNTQzMzUz","repeats":1},{"count":1176,"lower_bound":"Mzc3NzU2OTcz","upper_bound":"Mzg3OTE2NTM1","repeats":1},{"count":1184,"lower_bound":"Mzg4NTg2MTQ5","upper_bound":"Mzk1NDA2Njc3","repeats":1},{"count":1192,"lower_bound":"Mzk2NzM3Mjg1","upper_bound":"NDA0NjIxMzE5","repeats":1},{"count":1200,"lower_bound":"NDA2NzkyMjg5","upper_bound":"NDIyODEzMTEy","repeats":1},{"count":1208,"lower_bound":"NDIzMTE0MTU2","upper_bound":"NDQwODEwMjE3","repeats":1},{"count":1216,"lower_bound":"NDQxNDgwNjEy","upper_bound":"NDUzMzIyNzk1","repeats":1},{"count":1224,"lower_bound":"NDYzMzc3MzMy","upper_bound":"NDY5MTExMzI4","repeats":1},{"count":1232,"lower_bound":"NDgyMjg1OTE4","upper_bound":"NDg3MjgyNTY2","repeats":1},{"count":1240,"lower_bound":"NDg3NTgxODM4","upper_bound":"NDk0OTkxODA0","repeats":1},{"count":1248,"lower_bound":"NDk1NTEzNjUy","upper_bound":"NTEzNDAxMTY3","repeats":1},{"count":1256,"lower_bound":"NTE3MTcyMzIy","upper_bound":"NTIwMDQzMjk5","repeats":1},{"count":1264,"lower_bound":"NTIyMjkzMTUz","upper_bound":"NTI5MjQ0Njgw","repeats":1},{"count":1272,"lower_bound":"NTMxNjE5MTEy","upper_bound":"NTQyMTczNzkz","repeats":1},{"count":1280,"lower_bound":"NTQ4ODA2MTE5","upper_bound":"NTYzNzg0NTQ0","repeats":1},{"count":1288,"lower_bound":"NTgwMzIzMDk5","upper_bound":"NTg5OTY4MTY5","repeats":1},{"count":1296,"lower_bound":"NjA4ODk3MDU3","upper_bound":"NjIxMTYxNzkx","repeats":1},{"count":1304,"lower_bound":"NjIzNDg1NTE0","upper_bound":"NjM0MTk0MjE1","repeats":1},{"count":1312,"lower_bound":"NjM1MzcyNTU1","upper_bound":"NjQ3Njc3NDEy","repeats":1},{"count":1320,"lower_bound":"NjYyMjkyNDYz","upper_bound":"NjY4NDM4NjY2","repeats":1},{"count":1328,"lower_bound":"NjczNDcxNDI3","upper_bound":"NjgxNjcyNTQ4","repeats":1},{"count":1336,"lower_bound":"Njg1ODMwMjQx","upper_bound":"NzAxMTQyNDM1","repeats":1},{"count":1344,"lower_bound":"NzAxMzQzMTUy","upper_bound":"NzE0NTExMjcz","repeats":1},{"count":1352,"lower_bound":"NzE0NTc3NTIy","upper_bound":"NzI1NDA2NDI4","repeats":1},{"count":1360,"lower_bound":"NzI2ODU3MTIx","upper_bound":"NzM2NTU5OTMy","repeats":1},{"count":1368,"lower_bound":"NzQyODY0MDcz","upper_bound":"NzU2NjkxMjAw","repeats":1},{"count":1376,"lower_bound":"NzYzNzU4ODk3","upper_bound":"NzgyMDE3NjYw","repeats":1},{"count":1384,"lower_bound":"Nzg4MDAxMjQy","upper_bound":"ODAzODAwNDU1","repeats":1},{"count":1392,"lower_bound":"ODA1MDYxNzQx","upper_bound":"ODI0NTM4OTc5","repeats":1},{"count":1400,"lower_bound":"ODUyNTg4ODcw","upper_bound":"ODYxNTUzMjA3","repeats":1},{"count":1408,"lower_bound":"ODYyNzEyMzI1","upper_bound":"ODc2OTg0NTYw","repeats":1},{"count":1416,"lower_bound":"ODg1OTQzNDU5","upper_bound":"ODkzMjQxOTky","repeats":1},{"count":1424,"lower_bound":"ODk0NDY3NjIz","upper_bound":"OTAxMzU2OTQ2","repeats":1},{"count":1432,"lower_bound":"OTE4NjQ2MDAx","upper_bound":"OTMwNzQ0MTA0","repeats":1},{"count":1440,"lower_bound":"OTM0NDA2NTcx","upper_bound":"OTY1MjEyNTA3","repeats":1},{"count":1448,"lower_bound":"OTY3NzUzODA1","upper_bound":"OTczMjExNjM3","repeats":1},{"count":1456,"lower_bound":"OTg2NDgxNDk3","upper_bound":"OTkxODgyMDQy","repeats":1},{"count":1464,"lower_bound":"OTk5ODMzNzE4","upper_bound":"MTAyOTc0MzcxMg==","repeats":1},{"count":1472,"lower_bound":"MTAzNTU1MDkwNQ==","upper_bound":"MTA0MzkwMTI0Ng==","repeats":1},{"count":1480,"lower_bound":"MTA0NTMxNjExMQ==","upper_bound":"MTA1MTQ2NzQ2OQ==","repeats":1},{"count":1488,"lower_bound":"MTA1NDUxNjI4Mg==","upper_bound":"MTA2OTU0MzE4Mg==","repeats":1},{"count":1496,"lower_bound":"MTA3MDU3Njc4OQ==","upper_bound":"MTA4MTcwNDk3Mg==","repeats":1},{"count":1504,"lower_bound":"MTA4Mjc1NjM3Mw==","upper_bound":"MTEwMDI0Nzg2MQ==","repeats":1},{"count":1512,"lower_bound":"MTEwMTI4MTU3OQ==","upper_bound":"MTEyMzIwNDM3NQ==","repeats":1},{"count":1520,"lower_bound":"MTEyMzIxNjE4Mw==","upper_bound":"MTEyOTM2MjAxNg==","repeats":1},{"count":1528,"lower_bound":"MTEzMzQ0MzIxMg==","upper_bound":"MTE0ODc0NTQ2Ng==","repeats":1},{"count":1536,"lower_bound":"MTE1NTUzMjE4NQ==","upper_bound":"MTE2MTM0Mjk1Mw==","repeats":1},{"count":1544,"lower_bound":"MTE2MzIzMzA4Ng==","upper_bound":"MTE2OTA2MDM1Ng==","repeats":1},{"count":1552,"lower_bound":"MTE3MDE3MTM2MA==","upper_bound":"MTE3OTU0OTkyNQ==","repeats":1},{"count":1560,"lower_bound":"MTE4MDk0MDAzOQ==","upper_bound":"MTE5NDQzNTkyOQ==","repeats":1},{"count":1568,"lower_bound":"MTE5NTA2MzQ2Ng==","upper_bound":"MTE5OTA2Nzg2Mw==","repeats":1},{"count":1576,"lower_bound":"MTIwODEzMDc5OQ==","upper_bound":"MTIxOTYxODA2Ng==","repeats":1},{"count":1584,"lower_bound":"MTIyMDk0Njg5Mg==","upper_bound":"MTIzNDEwNDI5OQ==","repeats":1},{"count":1592,"lower_bound":"MTIzNTE3MzM0MA==","upper_bound":"MTI1MjQzNDI1NA==","repeats":1},{"count":1600,"lower_bound":"MTI1Mjc0NzcyMQ==","upper_bound":"MTI2MjI0NTIxOA==","repeats":1},{"count":1608,"lower_bound":"MTI2NTExNzIzMA==","upper_bound":"MTI4NTE3MzIxNQ==","repeats":1},{"count":1616,"lower_bound":"MTI5NDU0MjE2NQ==","upper_bound":"MTMwNTExNjU3NA==","repeats":1},{"count":1624,"lower_bound":"MTMwNjYyNDc3OQ==","upper_bound":"MTMzMTMzODA1NQ==","repeats":1},{"count":1632,"lower_bound":"MTMzMTQ1MDM1MA==","upper_bound":"MTM0MDc4MDIxMA==","repeats":1},{"count":1640,"lower_bound":"MTM0NDcyNTYyOQ==","upper_bound":"MTM1Mjc5NTQ1Mg==","repeats":1},{"count":1648,"lower_bound":"MTM1Mzc4Njg5Ng==","upper_bound":"MTM2MDA0NjAxNw==","repeats":1},{"count":1656,"lower_bound":"MTM2MjY3MzM3Mw==","upper_bound":"MTM3MzA1NDY3OA==","repeats":1},{"count":1664,"lower_bound":"MTM3NDIzMjk2OQ==","upper_bound":"MTM4NDUzMTMzMA==","repeats":1},{"count":1672,"lower_bound":"MTM5OTgzNzM5MA==","upper_bound":"MTQxMjU3MDk0Mg==","repeats":1},{"count":1680,"lower_bound":"MTQxOTgxNzc1OQ==","upper_bound":"MTQ0Mjk4NTM1OA==","repeats":1},{"count":1688,"lower_bound":"MTQ1NjYwODAzNg==","upper_bound":"MTQ2NzAzOTU1MQ==","repeats":1},{"count":1696,"lower_bound":"MTQ3OTgzMDA2MQ==","upper_bound":"MTQ4NjcwMDUyOQ==","repeats":1},{"count":1704,"lower_bound":"MTQ4NzM2MTIwNw==","upper_bound":"MTUwMDE4Njk4Nw==","repeats":1},{"count":1712,"lower_bound":"MTUxMTY4NjI4OQ==","upper_bound":"MTUzMzEzMzEyMA==","repeats":1},{"count":1720,"lower_bound":"MTUzMzY4MTIwNA==","upper_bound":"MTU0MTYwNDExOQ==","repeats":1},{"count":1728,"lower_bound":"MTU0MjU4OTM0MQ==","upper_bound":"MTU2NDQyMjc2Nw==","repeats":1},{"count":1736,"lower_bound":"MTU2NjcyOTkwMg==","upper_bound":"MTU4Mzc3MzkzOQ==","repeats":1},{"count":1744,"lower_bound":"MTU4NDg3OTY5NA==","upper_bound":"MTYwMzU1OTM5OQ==","repeats":1},{"count":1752,"lower_bound":"MTYwMzk0Nzg3Mg==","upper_bound":"MTYyMDc0NTA3OA==","repeats":1},{"count":1760,"lower_bound":"MTYyMjM1NjAxNg==","upper_bound":"MTYyMzUyMTM2Nw==","repeats":1},{"count":1768,"lower_bound":"MTYyNTUxNDUwNg==","upper_bound":"MTYzNTcwNzc1Nw==","repeats":1},{"count":1776,"lower_bound":"MTYzODU4NjI5OQ==","upper_bound":"MTY0NDExMjUwMA==","repeats":1},{"count":1784,"lower_bound":"MTY0ODI5MDY0NQ==","upper_bound":"MTY2MTkwNjk4Nw==","repeats":1},{"count":1792,"lower_bound":"MTY2OTA3MDUzNg==","upper_bound":"MTY3NzgzODgwNg==","repeats":1},{"count":1800,"lower_bound":"MTY4MzEwNDE1OA==","upper_bound":"MTY5NTUxODk0MA==","repeats":1},{"count":1808,"lower_bound":"MTcxMTI1MTkzNg==","upper_bound":"MTczMjY3NDExNQ==","repeats":1},{"count":1816,"lower_bound":"MTczMzE1OTQ1OA==","upper_bound":"MTc0ODIwOTQxMg==","repeats":1},{"count":1824,"lower_bound":"MTc0OTI0OTgzNQ==","upper_bound":"MTc1OTUwOTgzMA==","repeats":1},{"count":1832,"lower_bound":"MTc1OTc2MjY5OA==","upper_bound":"MTc3ODgwNDI4OQ==","repeats":1},{"count":1840,"lower_bound":"MTc3OTIxOTAxMw==","upper_bound":"MTc5NTY2MDU1NA==","repeats":1},{"count":1848,"lower_bound":"MTc5NzUzMDU5Nw==","upper_bound":"MTgwMDQyMzU0NQ==","repeats":1},{"count":1856,"lower_bound":"MTgwMDc0NzA5Mg==","upper_bound":"MTgzMjM4MTIzMg==","repeats":1},{"count":1864,"lower_bound":"MTgzNjIzNTUzMg==","upper_bound":"MTg0MDY2MTM0MA==","repeats":1},{"count":1872,"lower_bound":"MTg0MzAyNDc5OQ==","upper_bound":"MTg1NDA5NzEzNg==","repeats":1},{"count":1880,"lower_bound":"MTg1NDY1MDA3OA==","upper_bound":"MTg3MDMxMTg0OA==","repeats":1},{"count":1888,"lower_bound":"MTg3ODA4MzgzNg==","upper_bound":"MTg4NzE5MDY5Ng==","repeats":1},{"count":1896,"lower_bound":"MTkwNzUzMjY5NQ==","upper_bound":"MTkxMTAwMjcwMA==","repeats":1},{"count":1904,"lower_bound":"MTkxNDkzMDYzNw==","upper_bound":"MTkyMTc3MTI5MQ==","repeats":1},{"count":1912,"lower_bound":"MTkyMjQ0MjQ0MA==","upper_bound":"MTkzNjk2MzQ1MA==","repeats":1},{"count":1920,"lower_bound":"MTkzNzM2ODE5Nw==","upper_bound":"MTk1OTAxNjc1NA==","repeats":1},{"count":1928,"lower_bound":"MTk2MTc5Mzg0NQ==","upper_bound":"MTk5MDk4NjM5Mw==","repeats":1},{"count":1936,"lower_bound":"MTk5MzMxNTM5Mw==","upper_bound":"MTk5NTg4MTkxNQ==","repeats":1},{"count":1944,"lower_bound":"MTk5NzMwNjM4OA==","upper_bound":"MjAwNjgyMDEwOQ==","repeats":1},{"count":1952,"lower_bound":"MjAxMjg3ODQ0Mg==","upper_bound":"MjAyNDIxNDA3OQ==","repeats":1},{"count":1960,"lower_bound":"MjAzMzk2MjExMg==","upper_bound":"MjA0MDYwNzIzMQ==","repeats":1},{"count":1968,"lower_bound":"MjA1MjI2Mzc3Mg==","upper_bound":"MjA2ODE5MzMxOA==","repeats":1},{"count":1976,"lower_bound":"MjA4MTA2ODc3Nw==","upper_bound":"MjEwNDAwNDIzNA==","repeats":1},{"count":1984,"lower_bound":"MjEwNDE4MDE1OQ==","upper_bound":"MjExMDAzMjY2MQ==","repeats":1},{"count":1992,"lower_bound":"MjExMjQyMTYwNQ==","upper_bound":"MjEzNzE5NjczMw==","repeats":1},{"count":2000,"lower_bound":"MjEzNzMwNjk1Mg==","upper_bound":"MjE0NzQ2MTM0Ng==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,0,0,0,2,3,2,1,0,0,0,1,1,0,0,3,1,0,3,0,1,0,0,3,1,1,5,1,2,2,2,1,0,0,1,3,0,1,1,1,1,0,2,1,0,0,3,1,1,1,0,1,0,1,0,0,2,0,1,1,0,0,0,0,0,4,2,0,0,0,1,3,2,1,1,0,3,1,1,0,0,0,0,1,0,0,0,1,0,1,0,1,0,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,0,0,0,2,0,0,0,0,1,0,0,1,2,2,3,3,1,0,1,0,2,1,1,0,2,4,1,0,0,2,0,0,1,1,1,0,0,2,2,1,0,0,0,1,2,0,2,2,0,0,1,0,2,1,0,1,0,0,2,2,1,3,1,1,0,2,3,1,0,1,0,0,0,0,2,0,1,2,0,2,1,0,0,4,1,0,1,2,3,1,1,1,0,2,2,1,2,3,1,0,1,0,1,1,2,1,1,4,0,0,2,2,1,3,1,3,0,1,1,1,0,2,1,1,1,0,0,1,2,0,1,1,2,0,3,4,1,3,0,2,3,2,0,0,0,1,0,1,1,1,1,2,0,0,0,0,1,0,1,0,2,0,1,0,1,0,0,1,0,1,3,0,1,1,0,0,0,2,0,2,2,0,2,0,1,3,0,2,1,0,0,0,1,0,1,1,0,0,0,1,1,2,1,1,1,1,0,2,1,0,2,2,1,1,1,0,0,1,1,0,1,2,1,2,1,2,0,1,0,1,1,0,2,1,0,1,1,1,1,2,1,1,1,0,2,0,3,0,0,1,2,1,0,1,0,1,1,0,0,1,3,2,2,1,0,1,1,0,1,2,2,0,1,1,3,2,0,1,1,0,0,0,1,0,0,1,0,0,0,1,1,0,2,0,1,2,0,0,0,0,2,1,3,1,2,0,1,0,1,1,0,0,0,1,0,0,2,1,1,1,0,3,1,1,1,0,1,1,1,1,0,2,1,0,2,1,0,1,1,0,1,2,1,2,1,1,1,0,1,3,2,0,1,0,1,1,4,0,0,4,2,0,1,0,1,1,1,0,2,2,0,1,1,1,2,0,2,0,1,1,0,0,1,0,2,1,1,0,0,1,1,3,0,0,1,0,1,1,1,1,0,0,1,2,0,2,3,1,2,1,0,0,3,3,3,2,2,0,2,0,0,0,1,0,1,1,2,1,0,1,2,0,0,1,0,0,2,0,2,1,0,0,1,2,1,0,1,0,1,0,0,1,0,2,3,0,2,1,2,2,0,1,1,2,3,1,2,1,2,1,0,2,1,1,0,0,1,3,1,2,2,4,0,0,0,1,1,1,0,2,1,0,2,1,1,0,1,0,1,2,0,2,4,1,2,0,1,1,0,2,1,1,1,0,2,1,0,1,1,0,3,2,1,2,0,0,2,0,1,2,1,0,1,1,3,2,2,1,1,1,0,0,0,2,0,0,1,3,0,1,0,1,0,0,1,0,1,2,0,0,1,1,2,1,1,0,1,2,0,1,0,0,1,1,0,0,3,0,1,1,3,2,1,0,2,1,1,0,0,0,3,1,1,2,3,1,1,1,0,1,1,0,3,0,1,0,0,0,1,1,1,2,4,0,2,0,0,0,3,3,1,3,2,3,2,1,3,2,1,0,1,0,2,1,0,1,2,0,1,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,1,2,1,0,1,1,1,1,0,0,1,1,0,0,1,0,1,0,2,3,2,1,2,2,3,1,1,0,0,0,0,1,1,0,0,1,0,2,1,4,0,1,1,1,2,3,0,1,0,1,0,2,3,0,0,1,0,0,0,0,2,1,1,2,0,0,1,0,0,1,2,1,1,0,0,0,1,0,1,2,2,1,3,1,1,2,2,0,1,0,3,1,0,0,3,0,2,0,0,0,1,0,1,2,1,1,1,1,2,1,0,2,0,1,1,0,0,0,0,1,1,0,3,1,0,1,0,0,1,0,0,1,0,1,1,1,0,1,2,2,0,2,2,1,0,2,1,3,2,1,0,4,0,0,0,1,0,0,1,1,3,1,1,0,3,2,1,1,1,0,0,1,1,0,0,3,1,0,1,2,1,0,0,1,0,0,1,0,1,1,0,0,0,0,1,1,1,2,0,2,0,1,1,0,2,1,0,0,1,3,2,0,1,1,3,0,0,0,2,0,2,0,0,2,1,0,0,0,0,1,3,2,2,3,2,1,1,1,3,0,2,1,2,1,0,1,0,0,3,0,0,0,2,0,0,1,0,1,1,1,1,0,3,1,0,0,2,2,1,1,0,0,1,1,1,0,0,0,2,2,2,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,2,1,1,2,0,0,1,2,0,2,3,1,2,1,4,2,0,1,1,2,0,1,0,0,1,1,1,2,4,0,2,0,0,0,0,0,1,1,1,0,2,1,1,2,5,1,2,1,0,2,0,1,1,4,0,0,2,1,1,0,2,0,3,0,0,3,1,0,2,0,1,0,2,0,1,1,0,1,1,0,0,0,1,1,2,0,1,1,2,1,2,0,2,1,1,0,0,0,0,3,1,0,1,1,2,0,0,1,1,2,0,2,3,2,0,1,0,1,2,2,0,3,5,0,2,2,2,1,1,0,2,1,1,2,0,0,2,0,0,1,1,2,2,1,0,1,3,1,1,1,3,0,1,1,1,2,1,0,0,2,1,2,0,0,1,2,1,0,0,1,2,0,1,3,3,0,1,2,1,0,0,0,0,1,2,3,2,0,1,0,0,1,2,0,1,2,2,0,1,1,0,1,1,2,1,1,0,0,0,0,0,1,0,3,1,1,2,0,0,2,1,1,1,1,2,1,2,2,1,0,1,2,0,0,0,1,2,0,2,2,0,2,1,1,2,2,1,3,0,0,0,1,1,1,3,0,1,1,1,1,1,1,1,2,0,1,2,1,1,0,2,3,0,1,0,3,2,1,1,1,0,0,0,1,2,0,2,0,1,0,0,0,1,2,1,2,0,2,0,0,0,1,2,0,0,1,0,0,1,2,0,0,1,0,1,1,1,0,2,1,0,1,2,0,2,1,0,0,2,2,1,1,2,0,1,1,0,1,2,1,1,1,3,1,1,3,1,0,0,2,1,2,2,0,0,0,0,2,2,1,3,1,1,1,0,1,1,0,1,0,1,0,0,1,0,2,0,2,0,1,0,0,0,1,1,1,1,1,2,1,0,1,1,1,1,2,0,1,1,1,2,0,0,0,1,1,1,0,0,2,0,0,0,2,1,0,2,1,1,1,0,0,1,0,0,0,1,0,1,1,0,0,0,1,2,1,1,0,1,1,0,3,1,1,0,0,1,1,0,0,0,1,0,1,1,1,0,2,0,1,4,2,0,0,1,0,0,0,3,2,0,3,1,0,1,1,2,1,0,0,0,1,0,1,1,2,1,0,3,3,0,0,1,1,1,1,0,0,0,1,1,1,1,1,1,1,2,1,1,1,1,0,0,1,0,1,2,1,1,0,3,1,1,0,1,2,2,1,1,1,1,0,0,1,1,0,3,0,2,3,1,3,1,0,0,2,0,0,0,2,1,1,2,0,0,2,3,1,1,0,1,1,0,1,0,0,2,1,1,0,0,4,1,1,0,0,0,1,0,1,0,0,2,1,3,1,1,1,4,0,2,2,1,0,1,0,0,1,1,1,2,1,0,2,0,0,0,2,0,1,1,0,1,1,1,1,1,1,1,2,1,1,0,0,0,3,1,0,2,0,1,0,0,2,0,0,1,1,2,0,1,0,0,3,0,2,2,1,0,0,2,2,0,1,0,3,0,0,1,0,0,2,2,0,0,0,1,2,1,2,2,2,0,1,1,1,0,1,3,1,0,1,1,1,2,0,2,2,1,1,0,0,0,2,1,0,2,2,2,1,0,0,4,0,1,1,3,0,0,0,0,0,1,0,1,0,0,2,1,1,0,0,0,4,2,1,0,1,1,2,1,0,2,0,0,0,1,1,1,0,3,1,2,0,3,2,0,1,3,1,1,3,2,0,0,2,2,2,0,1,0,2,1,0,2,0,0,1,0,0,2,1,2,0,0,2,0,2,3,0,0,1,0,1,2,1,1,3,1,0,0,1,1,1,1,1,1,2,2,2,0,1,1,1,1,0,3,2,4,0,1,0,2,2,0,0,1,0,0,1,1,0,3,0,1,2,1,0,2,1,1,2,1,2,4,2,0,3,0,2,3,1,1,1,1,0,1,1,2,1,3,3,1,2,0,2,1,1,2,5,3,2,1,1,2,0,0,3,0,3,0,2,2,1,0,0,0,0,0,1,1,0,4,2,0,1,0,2,0,1,1,1,1,1,0,1,1,0,2,1,1,1,1,0,0,0,0,0,1,0,1,0,3,2,4,0,1,0,1,1,3,3,1,0,3,0,2,2,1,1,3,0,2,0,1,1,0,2,2,0,2,1,1,0,2,0,1,2,1,2,0,1,2,1,2,1,1,4,2,0,2,1,0,0,0,4,2,2,1,0,2,0,2,0,0,0,1,2,0,0,1,1,2]},{"counters":[0,1,0,0,1,0,3,0,0,2,0,2,1,1,2,1,0,1,1,2,0,1,0,0,1,0,1,0,0,0,1,2,3,1,0,0,1,1,1,2,1,0,1,1,2,1,1,0,0,0,2,2,1,1,2,1,1,0,0,1,0,0,0,0,0,2,0,0,3,2,2,3,0,2,2,1,0,1,2,1,1,0,1,0,1,1,0,0,2,0,1,1,0,0,0,1,2,2,0,3,1,2,0,0,2,0,2,3,1,0,4,1,0,1,0,0,3,0,0,1,0,1,0,0,3,0,2,0,1,2,0,2,3,0,2,1,0,3,2,2,1,2,0,1,0,2,0,0,1,4,1,0,1,3,2,0,3,1,0,2,1,3,3,2,1,0,1,0,0,0,0,0,0,2,3,1,2,0,1,1,0,0,1,0,1,1,0,0,1,2,0,2,1,1,0,2,0,1,0,1,1,2,1,2,0,3,0,1,3,0,1,0,0,0,0,2,1,0,2,1,1,3,2,1,1,1,0,2,1,0,1,0,0,0,1,2,1,2,1,0,0,3,1,1,2,1,1,1,1,2,0,1,3,2,1,1,0,0,3,1,0,3,1,2,0,1,1,0,0,1,0,0,0,1,1,3,0,1,1,1,0,0,2,1,0,0,0,0,1,1,0,0,2,2,1,0,2,1,1,0,0,1,2,1,2,0,0,2,2,2,0,1,1,1,1,1,1,1,1,1,0,1,1,0,1,1,4,1,0,5,0,1,3,0,0,0,1,0,0,0,0,0,2,1,1,3,1,2,0,1,0,0,0,1,3,0,1,3,0,3,0,1,0,0,1,1,1,0,2,1,3,1,0,0,1,2,1,1,0,0,1,0,4,2,1,0,2,0,2,1,3,1,1,0,2,3,2,1,3,1,1,2,1,2,0,1,1,2,0,1,0,0,0,2,0,1,3,2,2,1,1,2,1,0,0,4,1,2,2,0,2,1,1,0,1,0,1,2,1,0,6,1,0,1,3,0,2,1,1,1,1,0,0,2,0,2,1,1,0,0,1,1,3,0,0,0,1,2,4,1,2,3,1,1,0,2,0,0,1,5,1,1,2,3,0,2,1,1,2,1,0,1,0,1,1,1,1,0,1,0,2,1,0,0,1,1,1,0,2,3,1,0,1,1,1,1,1,1,0,2,2,1,0,0,1,0,1,0,2,2,1,0,1,3,1,0,1,0,1,1,0,2,1,2,1,1,2,1,0,1,2,2,2,2,1,2,1,3,2,2,0,1,1,0,0,2,0,1,0,0,1,1,2,2,0,0,0,1,0,0,1,2,1,4,4,2,2,1,0,1,1,1,1,2,1,1,0,0,3,2,0,1,0,3,0,1,2,0,0,3,1,0,0,3,1,0,2,2,1,1,0,1,2,0,4,1,1,0,0,1,4,1,2,0,3,0,0,0,2,0,1,0,1,3,2,1,0,0,1,1,0,3,1,2,1,0,0,0,3,1,1,1,2,1,1,1,0,1,2,0,0,4,5,1,2,1,3,3,1,3,0,0,3,1,2,1,0,1,0,0,1,1,0,0,1,0,3,3,0,0,0,1,0,3,0,1,0,1,0,0,0,0,2,2,1,1,1,1,2,0,1,1,1,2,2,1,1,0,2,2,0,0,0,1,2,0,0,2,0,1,2,2,0,1,1,0,1,1,0,1,0,1,5,1,1,1,1,2,1,1,1,1,1,2,1,1,0,1,2,0,2,3,1,1,0,6,0,0,0,2,1,2,1,0,0,2,2,1,2,1,0,2,1,0,0,1,0,0,1,3,0,1,0,2,2,1,2,1,0,0,0,2,0,5,1,1,2,3,0,1,0,2,2,1,0,0,0,2,2,0,1,1,0,1,1,2,1,1,0,1,2,2,0,0,1,1,0,1,2,0,0,2,1,0,0,1,2,1,1,2,0,0,2,1,2,0,2,0,0,3,1,2,1,1,1,3,0,1,0,0,0,0,3,1,1,1,2,0,1,1,0,0,0,2,1,0,1,4,3,0,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1,2,2,1,0,1,3,1,2,0,1,0,0,2,3,0,2,2,1,0,0,0,0,1,0,3,0,0,0,0,1,1,4,1,1,1,1,0,0,0,1,0,1,1,1,0,2,0,0,2,0,2,2,2,0,1,1,0,2,1,1,2,0,1,0,1,0,2,3,0,0,2,0,0,0,0,1,0,2,2,0,2,1,1,1,0,1,1,1,1,0,3,0,0,2,0,2,1,2,1,0,1,0,2,4,3,1,0,0,0,1,1,0,3,2,1,0,1,0,0,0,0,2,0,0,1,1,1,1,0,2,1,0,1,3,1,0,2,1,0,2,0,2,0,4,0,0,1,0,1,0,1,0,1,1,1,2,1,1,0,0,1,0,1,0,0,0,0,0,0,3,0,1,0,1,0,1,1,0,1,2,1,0,3,0,0,0,0,0,1,2,0,0,1,2,1,0,1,0,2,0,1,2,1,0,1,1,1,1,3,3,0,0,0,0,1,1,0,0,0,1,0,0,2,0,0,0,0,2,1,2,1,1,2,0,0,2,1,1,3,0,0,0,1,1,1,1,1,1,0,1,0,2,1,0,0,1,1,1,0,1,2,0,0,0,1,0,2,2,3,1,1,1,1,1,1,1,0,1,2,0,1,0,2,1,2,0,2,0,0,1,1,0,2,0,1,0,1,0,0,1,1,3,1,0,1,0,2,0,0,1,1,1,3,0,1,0,0,0,3,2,0,0,1,3,1,3,0,2,0,1,0,0,1,1,1,1,1,1,0,0,1,0,2,2,0,0,2,2,1,2,3,1,1,1,2,0,0,0,0,1,1,2,0,2,1,2,0,2,1,1,1,2,1,0,0,1,2,3,2,1,0,1,0,1,0,1,0,4,0,0,1,1,0,0,0,1,1,2,2,4,0,3,2,2,2,0,1,1,2,1,1,2,1,0,1,2,1,2,2,1,0,0,3,0,2,0,2,0,1,1,0,2,1,0,0,1,0,1,2,0,3,0,0,2,1,1,1,1,1,0,0,0,3,3,1,1,0,2,1,1,1,1,1,2,1,1,0,2,1,0,0,0,0,1,1,0,0,1,0,0,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,1,0,1,1,2,0,1,2,0,0,0,0,2,1,1,0,1,1,0,2,2,1,2,1,0,0,0,1,1,1,1,2,2,1,2,3,0,0,1,0,1,1,0,1,2,0,1,1,1,2,1,1,2,2,1,0,1,0,0,1,1,1,2,1,1,0,0,1,0,5,0,1,2,0,0,0,2,1,0,0,2,1,2,2,0,1,0,3,2,0,3,0,2,1,1,0,1,0,1,2,2,1,0,1,0,0,1,0,1,0,1,1,2,1,1,1,0,1,3,2,2,2,1,0,1,0,1,1,3,0,2,1,0,0,1,2,1,1,0,2,1,0,2,2,1,0,1,1,0,0,0,2,1,0,1,0,1,0,4,1,1,1,1,2,0,1,0,0,0,2,1,1,3,1,1,1,2,1,0,2,0,0,1,2,0,0,1,1,2,1,1,1,0,0,2,1,0,1,1,1,0,1,1,0,0,0,1,0,0,3,0,1,0,1,0,0,1,1,0,2,0,0,1,0,2,2,1,2,1,0,3,0,1,1,1,0,3,0,1,2,2,1,0,1,0,1,0,0,1,0,2,3,2,0,1,1,1,0,1,0,3,0,0,3,3,0,0,4,4,0,0,0,0,0,0,0,1,0,1,1,1,1,0,1,1,0,0,0,0,2,1,1,1,3,1,2,0,1,0,1,1,3,1,1,1,1,0,1,2,1,3,2,2,1,1,2,1,3,1,3,1,0,0,1,0,0,4,0,1,0,1,3,1,0,3,0,0,3,0,0,0,0,0,0,1,1,1,2,0,1,1,3,1,2,0,1,1,2,2,0,1,2,0,1,1,2,1,2,1,0,1,0,0,1,0,0,1,0,2,1,1,0,0,0,0,2,0,0,1,1,1,1,3,2,1,2,3,0,1,0,0,0,0,1,1,2,0,1,1,1,0,1,1,0,0,1,4,3,1,0,0,0,0,2,2,3,0,2,5,0,3,0,0,1,0,0,1,1,0,1,2,0,2,0,2,0,0,1,0,0,1,0,0,2,0,0,2,5,1,0,0,1,1,1,1,2,0,2,1,0,1,1,0,3,2,2,0,1,1,1,1,0,2,0,1,3,0,0,0,1,1,3,0,1,1,1,0,1,2,2,3,0,0,1,2,1,1,1,1,0,1,2,0,0,0,1,1,1,2,1,1,1,0,0,2,2,1,1,2,0,0,0,1,1,2,2,1,1,2,0,1,1,1,0,1,0,2,0,1,0,1,0,2,0,1,1,1,1,1,2,0,1,0,0,1,2,2,0,0,0,0,0,0,2,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,2,0,1,1,2,0,2,1,0,1,3,1,0,2,0,1,2,0,1,0,1,0,1,2,0,2,0,1,0,0,0,1,0,1,1,1,1,3,1,3,1,0,2,1,1,2,0,1]},{"counters":[1,0,1,1,1,0,1,2,2,0,0,1,0,2,0,1,2,2,2,0,1,0,0,2,2,0,0,0,1,2,1,2,2,0,0,3,0,1,0,0,0,0,3,0,0,2,0,3,2,1,2,1,0,1,1,1,2,4,0,2,1,0,2,1,0,2,3,1,0,1,1,2,2,1,0,1,0,0,1,1,0,1,1,1,0,0,0,1,2,1,1,0,0,1,1,3,1,1,0,0,1,0,1,1,0,1,0,2,1,2,1,2,1,1,1,2,1,1,1,0,0,1,2,0,0,1,1,1,0,0,1,1,0,1,2,3,3,3,2,1,1,0,1,1,1,0,0,0,0,2,2,2,1,2,1,1,1,4,0,0,0,0,2,0,0,1,1,4,3,1,1,2,0,0,0,1,0,1,0,1,4,0,2,0,0,1,1,1,2,2,2,0,1,1,2,1,1,1,0,1,1,3,3,2,1,1,0,2,1,1,0,0,0,3,2,1,3,0,2,0,1,2,1,1,0,1,0,1,2,0,2,1,1,1,1,1,0,0,0,0,1,2,1,0,0,1,0,1,0,1,0,1,0,0,2,0,0,1,1,2,1,2,1,2,2,0,0,2,0,2,2,2,0,0,2,1,1,0,0,0,0,1,1,0,0,0,0,1,1,0,1,1,1,1,2,1,1,0,5,0,2,0,2,2,2,2,2,1,3,2,2,0,0,0,0,3,2,1,0,1,0,0,0,0,2,1,2,1,0,3,0,0,1,4,0,1,0,1,1,1,1,0,0,1,0,0,0,0,0,0,1,1,0,1,2,2,0,2,0,0,0,0,0,2,2,0,2,2,0,1,0,0,2,0,1,2,0,3,1,2,0,0,0,0,2,2,2,0,0,2,0,1,0,0,2,1,0,1,2,2,1,1,0,1,2,1,2,0,0,2,0,2,2,0,1,0,1,2,1,1,1,1,3,3,3,1,1,0,0,0,1,1,0,2,1,0,0,0,2,1,0,1,1,0,1,1,0,2,2,0,1,1,0,2,0,0,0,1,1,3,0,2,0,0,2,1,2,0,0,0,1,1,3,0,1,1,2,0,2,0,0,1,0,4,0,0,3,0,1,1,1,1,0,1,0,1,2,1,0,1,1,0,0,0,0,1,1,1,0,2,1,3,2,3,0,1,2,1,1,0,0,2,1,2,1,1,1,1,2,0,0,1,1,0,1,0,2,0,0,0,0,0,3,0,0,2,0,0,2,0,2,0,0,1,0,1,1,0,0,1,3,1,3,3,0,1,0,0,0,0,2,0,1,1,0,1,1,0,1,0,1,2,3,0,0,4,2,0,1,3,0,4,2,0,0,2,1,1,0,1,1,1,0,0,1,3,1,1,2,0,2,2,0,1,1,0,0,0,1,0,1,0,1,2,1,1,1,1,0,0,1,1,0,1,1,1,2,1,0,0,0,2,0,3,1,4,1,1,3,0,0,1,2,0,1,0,0,2,1,1,1,0,0,2,0,1,2,0,0,1,0,1,2,1,2,0,0,1,0,0,3,1,0,4,0,0,0,0,1,1,1,1,2,1,0,0,0,3,0,1,2,1,1,1,3,4,1,0,0,0,1,0,2,0,0,1,0,2,2,1,1,1,1,0,0,2,0,1,0,1,0,1,2,0,2,1,1,1,0,1,7,1,0,1,4,2,1,0,0,2,1,1,1,0,1,2,0,0,1,0,0,2,2,3,0,0,0,1,1,0,0,1,0,2,2,1,2,0,1,1,0,3,0,1,0,1,2,0,1,1,1,0,1,1,0,0,2,0,2,2,4,1,2,0,1,1,2,1,1,0,0,1,0,2,2,0,2,1,1,3,1,1,0,0,4,1,2,1,0,3,2,1,1,2,0,1,1,1,1,1,2,2,1,0,0,0,1,1,2,1,0,3,2,1,1,1,0,1,0,3,2,0,0,2,0,0,0,1,2,4,1,1,1,0,0,2,2,0,1,4,0,1,3,1,2,0,0,0,1,1,0,0,1,2,1,0,4,0,0,1,0,1,3,2,0,2,2,0,0,0,2,1,0,1,1,0,0,2,0,2,0,3,1,3,2,1,4,1,1,2,0,1,0,3,1,2,2,1,2,1,1,2,0,0,0,1,1,2,2,0,2,1,0,0,1,0,1,0,0,0,0,0,0,1,1,0,1,0,2,0,1,1,0,1,1,1,0,0,1,0,0,1,1,3,0,3,0,2,0,0,1,0,1,0,0,0,3,2,0,1,1,0,1,0,0,0,0,1,0,2,3,2,0,3,2,1,0,2,0,2,1,3,0,1,1,0,0,3,5,0,2,2,0,2,2,0,1,1,0,0,2,0,1,2,3,0,1,2,3,1,1,1,3,0,3,2,1,2,1,4,2,3,1,1,0,1,0,0,1,1,0,3,3,1,1,0,0,0,1,0,0,1,1,2,0,0,0,0,1,0,1,1,2,1,2,0,0,2,0,0,0,0,0,3,0,1,0,1,1,1,2,2,2,0,1,4,0,1,0,1,1,0,1,0,2,0,3,0,2,1,0,2,1,1,2,0,0,1,0,1,1,0,0,1,0,1,1,0,1,1,0,1,1,2,0,1,1,0,0,0,0,2,0,1,2,1,1,2,0,0,0,0,1,1,0,1,0,2,2,1,1,0,1,2,0,2,1,0,0,0,1,0,0,1,1,2,0,0,0,2,0,1,1,1,1,2,1,1,0,0,2,0,1,0,0,3,2,3,1,1,1,0,2,2,1,2,1,2,0,2,0,1,3,1,0,0,2,0,2,1,0,0,1,1,1,1,2,0,1,2,1,2,1,4,3,1,1,0,1,1,3,0,1,2,0,0,0,1,2,2,2,1,0,1,2,2,1,5,1,0,0,1,1,1,3,0,0,1,0,1,0,0,2,1,0,1,1,0,0,1,1,1,1,1,1,1,0,2,0,0,0,0,1,0,0,1,1,1,1,1,1,1,1,2,1,2,0,1,1,0,1,0,0,1,0,2,0,0,1,0,0,1,0,3,0,0,0,0,0,0,1,3,1,0,2,3,0,1,1,0,2,0,1,2,2,0,1,1,0,1,0,2,0,1,0,1,1,0,0,1,0,1,0,4,1,2,1,2,2,1,2,1,1,3,3,1,3,0,0,1,1,0,0,1,3,1,0,2,1,0,0,0,0,0,1,1,0,1,1,3,0,1,0,0,1,1,3,2,1,1,0,1,1,0,3,0,0,1,1,0,4,1,0,0,0,3,0,0,1,0,1,1,3,1,1,2,3,1,1,0,0,1,0,1,1,1,1,2,0,0,1,1,1,2,1,1,1,3,2,0,1,3,0,2,2,1,1,0,0,0,2,1,1,0,1,0,0,1,0,1,2,2,0,2,0,2,3,0,2,0,0,1,1,1,0,5,1,0,2,2,1,2,2,1,0,2,0,0,0,0,0,0,1,2,0,2,2,2,0,1,0,1,0,0,2,2,1,0,3,2,2,2,1,0,1,0,1,2,1,0,0,1,2,0,1,2,2,0,2,0,0,0,2,1,1,2,0,0,1,1,2,4,1,1,1,1,0,2,1,0,1,1,2,1,0,1,0,3,4,1,1,0,0,0,1,0,2,1,0,0,0,2,1,2,3,1,1,0,3,2,1,4,2,0,0,2,1,2,0,0,0,0,1,0,1,2,0,0,0,0,0,0,0,0,1,0,0,2,1,1,0,1,1,1,0,0,1,1,3,0,1,1,1,1,0,1,1,4,1,0,1,1,2,2,0,3,0,0,0,2,3,1,0,2,3,1,0,0,1,0,1,2,0,1,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,2,1,0,0,0,1,2,0,0,2,2,1,2,3,2,1,0,1,0,2,1,1,2,1,0,1,1,2,1,2,1,0,0,1,1,0,1,1,3,1,1,1,1,1,1,0,0,0,1,2,1,2,1,1,1,2,1,1,0,2,1,1,3,1,0,2,1,2,0,2,0,0,2,3,0,0,0,1,2,0,4,1,0,1,2,0,0,1,2,2,1,1,0,2,0,2,4,2,4,1,0,0,1,1,0,1,1,1,1,1,1,0,0,0,2,0,1,2,2,1,0,0,0,0,1,1,1,0,2,1,3,4,1,1,1,1,3,0,3,1,0,2,1,3,1,1,0,3,0,0,0,1,3,0,1,0,0,3,2,1,0,0,1,1,1,2,0,0,3,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,0,0,0,0,0,1,1,3,0,0,1,1,1,2,2,1,1,0,2,3,1,0,2,1,3,1,2,1,1,0,5,0,0,0,0,0,0,3,0,3,0,4,1,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,1,1,2,1,1,1,1,1,0,1,0,1,2,1,0,1,0,1,2,1,1,2,1,5,0,1,0,2,0,1,1,3,4,0,0,1,1,1,0,2,0,2,0,1,0,1,2,1,2,0,2,0,0,0,1,2,1,1,1,2,0,0,0,1,1,4,4,1,2,1,2,1,0,0,1,0,1,0,0,0,0,1,2,1,1,1,2,0,0,0,2,0,1,1,1,0]},{"counters":[0,1,0,2,1,1,2,2,1,2,0,1,1,1,1,1,3,1,3,2,2,0,0,0,0,0,1,1,0,0,3,1,1,1,1,2,1,0,0,1,0,0,2,0,0,2,0,2,2,2,1,0,2,1,0,1,2,0,2,1,0,2,2,1,0,0,0,2,1,1,0,1,1,2,2,1,5,2,1,2,1,1,2,2,0,1,1,1,0,0,2,2,1,0,0,1,1,3,4,0,1,0,1,1,1,3,2,1,0,0,2,2,2,1,4,3,1,3,0,1,2,0,0,1,2,0,1,3,0,0,3,0,1,0,3,1,1,1,0,0,1,0,1,0,2,1,2,2,1,2,0,1,0,1,0,1,1,2,1,1,1,1,2,2,0,1,0,1,0,0,2,2,1,2,2,1,0,2,0,0,1,1,1,1,0,0,1,2,1,1,3,1,0,1,1,3,0,0,0,0,0,2,0,1,2,1,0,0,1,0,1,1,1,1,1,0,1,1,0,2,1,1,0,3,1,3,1,0,1,0,1,0,0,0,0,0,1,1,2,2,0,1,2,2,2,3,1,1,1,1,2,1,0,0,1,0,2,2,2,2,1,0,0,0,0,0,1,0,0,2,1,1,1,0,1,3,1,0,1,0,0,0,0,0,0,0,0,1,1,2,0,0,0,0,1,0,0,1,3,1,1,1,2,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,1,1,0,0,2,0,0,1,2,1,3,0,2,0,1,1,1,0,0,0,0,2,2,0,2,1,1,1,3,1,3,0,1,1,2,1,3,2,0,4,0,0,0,0,0,1,0,0,0,1,3,3,3,1,2,0,0,0,1,1,2,1,1,1,2,3,0,0,1,1,0,0,2,3,0,0,1,2,0,2,2,1,0,0,0,1,1,1,0,2,1,1,0,0,0,3,1,2,0,2,0,0,0,2,1,0,0,0,0,0,0,1,1,2,0,0,1,2,0,0,2,2,1,1,1,3,0,0,1,2,0,0,0,0,3,0,2,0,3,1,1,0,1,0,1,1,0,2,1,1,1,0,0,1,0,2,2,0,2,0,0,0,1,3,2,1,0,3,2,0,2,1,1,0,1,0,1,0,2,0,1,1,1,0,1,0,0,0,2,0,1,1,2,1,0,0,0,1,1,1,2,0,1,2,2,2,0,1,1,0,0,3,0,1,2,1,0,2,1,1,0,1,3,1,1,1,1,1,0,0,1,2,1,3,1,1,0,0,2,1,2,0,2,2,1,0,1,2,0,0,0,0,2,2,2,1,1,1,3,2,3,0,2,0,0,3,2,2,2,0,0,1,0,1,2,1,2,1,4,0,0,0,0,1,0,1,1,0,0,0,1,1,0,5,0,1,1,0,0,0,2,0,0,0,1,1,0,0,0,0,0,2,0,0,1,0,0,0,0,1,0,0,1,1,2,0,1,2,0,1,0,1,2,0,1,2,1,1,2,1,1,0,0,2,1,0,2,0,2,0,0,1,1,2,0,1,2,0,1,2,2,1,1,0,1,2,1,0,1,1,2,3,1,0,1,1,1,0,0,0,1,1,0,0,1,0,2,1,1,1,0,1,3,1,1,1,2,2,3,1,0,2,1,1,2,3,0,0,2,1,2,2,0,1,0,0,3,1,1,1,1,1,1,2,2,2,2,0,1,1,1,1,1,2,0,1,2,1,4,0,0,1,1,2,1,2,1,1,1,0,1,2,1,0,1,3,1,1,0,1,1,0,0,1,2,0,1,1,1,1,0,1,2,1,1,0,0,0,1,1,1,2,0,2,2,2,1,0,0,1,2,0,0,0,0,1,0,1,0,0,1,1,0,2,2,0,1,0,1,0,1,0,0,1,1,2,1,1,0,1,3,0,1,1,1,1,1,1,0,1,1,0,1,2,1,2,0,2,3,0,0,0,2,2,0,1,0,1,0,0,1,1,0,2,4,0,2,0,0,0,2,2,0,3,0,1,0,4,1,1,2,2,1,2,3,1,1,1,1,2,1,2,2,0,3,1,1,1,1,0,0,0,2,1,2,1,0,0,1,2,0,1,0,1,2,1,0,0,2,1,0,0,0,1,1,2,1,1,0,1,0,3,3,0,0,1,0,2,0,2,1,2,0,0,2,0,0,1,1,1,0,1,2,1,0,0,0,1,1,1,0,4,1,2,2,3,0,0,0,0,0,2,0,1,1,0,1,2,1,1,0,1,0,0,2,0,0,1,2,2,0,0,1,2,2,1,2,0,3,1,2,1,0,0,0,1,0,0,0,0,2,1,2,1,3,1,0,0,0,1,0,0,1,0,1,1,0,0,0,1,3,1,1,0,1,0,0,0,0,0,2,1,0,3,2,3,3,0,1,0,4,0,0,1,0,0,0,0,1,3,0,3,3,0,0,1,0,0,1,1,0,2,1,2,2,0,1,2,0,0,0,2,2,3,1,2,1,0,0,2,1,1,1,1,1,1,2,0,0,1,0,1,1,2,2,1,1,0,0,2,2,2,1,0,1,0,1,1,2,3,0,1,2,1,1,1,1,1,1,0,1,2,1,0,1,1,0,1,0,2,0,0,1,1,0,2,0,1,0,0,2,2,0,0,0,2,1,0,1,0,2,1,2,2,1,0,0,0,0,2,4,1,0,1,0,0,1,2,1,2,0,1,2,1,2,0,0,1,2,2,1,2,1,2,1,0,1,1,1,0,2,1,2,0,2,1,2,0,1,0,1,0,0,2,1,1,0,0,1,3,0,1,0,1,0,1,0,3,2,0,1,0,1,0,1,1,0,0,1,0,4,1,3,6,0,1,1,1,2,1,0,0,0,1,0,0,2,2,2,2,3,2,2,0,0,1,1,1,3,2,1,1,0,1,1,1,1,1,2,1,3,0,2,2,2,1,0,1,2,0,1,0,0,0,2,2,2,1,1,1,2,1,1,0,2,1,0,1,1,0,1,1,1,0,5,0,2,2,1,0,0,2,0,0,1,0,1,2,0,0,1,2,0,0,2,0,0,0,0,0,1,0,1,0,1,2,2,1,0,0,0,1,0,0,1,3,1,2,1,3,0,1,2,1,2,2,2,2,1,2,0,2,0,2,1,0,2,3,0,3,1,1,4,0,2,1,1,0,0,2,0,0,1,1,3,1,1,1,0,0,2,1,1,0,0,1,1,0,2,1,0,0,0,3,0,4,0,2,1,1,0,0,3,1,2,2,2,2,0,2,1,0,0,1,0,1,1,0,2,1,0,1,1,0,2,2,1,3,0,0,1,1,1,2,0,1,0,0,2,2,0,0,3,0,0,0,2,2,1,2,1,1,0,1,2,3,0,0,0,3,0,0,2,1,1,0,4,1,0,2,1,3,1,3,1,2,1,2,1,0,1,1,0,0,0,1,0,1,0,2,2,0,0,0,1,0,0,0,0,0,0,2,1,1,1,0,1,0,0,0,3,1,3,0,0,2,0,0,3,2,2,0,2,0,1,3,1,1,0,2,2,3,2,2,0,0,2,1,1,1,1,1,0,1,1,1,1,0,0,1,2,1,0,0,0,1,4,2,0,2,3,0,1,1,1,0,3,0,0,2,1,0,0,1,0,1,1,0,0,1,1,0,0,1,0,5,0,0,2,1,0,0,0,0,1,0,2,0,0,1,5,1,0,0,1,1,0,1,0,0,0,2,2,0,1,2,0,0,1,2,1,1,1,3,1,2,1,1,0,1,2,1,1,0,1,1,1,3,0,0,0,0,1,0,2,2,1,0,0,1,1,1,1,0,1,3,0,0,0,2,0,1,1,2,1,2,4,0,0,1,1,0,0,3,2,1,0,0,4,0,1,1,2,1,1,1,1,0,0,2,0,1,1,2,1,0,1,0,0,0,1,1,1,0,0,1,1,0,2,1,2,1,0,1,0,0,1,1,1,0,0,1,2,0,2,1,1,0,2,0,3,1,2,5,4,1,0,2,2,1,0,3,0,1,1,2,0,1,0,0,1,0,1,1,1,1,0,0,1,0,1,1,0,1,1,0,1,0,0,2,0,1,1,2,0,2,0,3,1,1,1,1,0,0,1,3,2,0,0,2,1,1,0,0,1,1,0,2,1,4,0,0,1,3,1,2,2,2,2,1,1,0,1,1,1,1,0,1,1,0,2,2,0,2,2,4,1,1,1,4,0,1,0,0,1,1,1,0,0,1,2,1,1,3,0,0,1,1,1,1,2,4,1,3,0,2,1,2,0,0,2,0,0,1,3,2,2,1,2,0,0,2,1,1,0,0,3,1,0,0,0,0,3,4,1,0,0,0,4,1,1,0,0,2,1,1,0,1,0,1,2,0,3,3,2,0,1,2,0,0,2,1,0,0,1,1,2,0,0,3,1,0,1,3,1,2,0,1,1,1,1,2,1,1,0,0,1,2,0,3,0,1,1,1,0,0,0,0,0,1,2,1,2,0,0,1,0,2,1,1,1,1,1,1,0,2,2,0,2,2,1,1,2,4,0,1,1,0,1,0,0,1,2,0,0,1,0,0,0,1,1,2,1,0,0,0,2,1,2,1,0,1,1,0,1,0,1,2,0,2,1,2,0,1,0,1,2,1,1,0]},{"counters":[3,1,2,2,1,2,0,0,2,1,1,1,4,1,1,1,2,2,0,1,2,0,2,0,1,1,1,1,1,2,0,1,1,4,1,1,0,0,3,1,0,0,1,0,0,1,0,0,1,0,0,0,1,0,1,2,3,0,2,1,2,1,1,2,1,1,1,1,2,2,0,3,1,0,1,1,1,0,1,0,1,1,0,1,2,0,0,1,2,3,0,0,1,2,1,1,0,2,1,3,1,0,1,0,0,2,0,1,1,0,0,0,0,0,3,2,0,1,1,1,1,0,0,1,4,0,1,7,0,1,2,0,0,2,0,0,0,0,1,0,0,0,1,2,2,0,0,0,1,0,1,0,1,0,1,3,0,1,0,0,2,2,0,1,2,1,0,0,3,1,2,1,1,1,0,1,0,1,1,1,1,1,0,0,2,0,2,1,1,1,1,0,2,1,1,0,1,1,0,1,1,2,0,2,2,4,0,2,0,0,2,3,0,0,1,1,1,1,0,3,1,0,0,1,1,0,1,2,0,0,1,1,2,1,3,1,1,1,1,2,1,0,0,0,0,1,1,1,0,2,0,0,1,3,1,0,0,0,0,1,3,0,1,2,3,0,0,0,2,2,2,1,2,1,1,0,2,0,1,2,1,0,1,1,2,1,1,2,0,0,3,1,0,1,0,1,0,1,2,0,1,2,2,0,0,1,2,0,1,1,0,1,0,3,0,0,1,2,1,0,0,0,0,1,2,0,1,1,0,1,0,1,1,0,1,1,1,0,0,3,1,1,0,1,2,3,0,0,2,0,1,1,1,1,0,0,0,1,3,1,2,1,0,2,0,1,3,1,1,1,4,4,2,0,1,1,1,1,0,2,2,0,2,2,1,1,1,1,1,1,2,0,0,2,0,1,0,1,0,0,2,2,1,0,0,1,0,0,2,1,0,0,1,3,2,0,2,2,0,2,0,0,1,3,0,0,1,0,1,3,1,3,1,0,1,0,2,0,2,0,0,0,0,1,0,0,1,2,1,0,1,1,0,2,0,0,1,1,3,1,0,2,3,0,0,4,2,1,1,1,2,2,1,1,2,5,1,1,2,0,0,2,1,1,0,0,1,3,2,1,0,1,1,1,2,0,0,1,0,0,2,0,2,1,1,1,3,0,0,1,0,1,1,1,1,3,0,0,4,1,0,2,3,0,0,3,1,1,1,1,1,0,1,0,1,1,1,1,2,1,1,0,0,0,0,0,0,1,2,1,0,2,1,1,1,1,0,0,0,0,1,3,1,0,1,3,0,1,0,1,0,1,2,0,0,2,2,2,0,1,1,2,1,1,1,1,0,2,2,0,0,2,2,1,0,1,1,0,1,2,0,0,2,2,3,1,0,1,4,1,1,0,0,1,1,0,1,1,1,0,2,3,0,0,1,0,1,1,0,0,1,3,1,2,1,1,0,4,1,2,2,1,2,1,2,3,3,2,1,0,1,1,0,1,0,0,2,1,1,0,1,1,0,0,2,2,3,3,0,1,1,0,1,1,0,2,0,4,1,0,0,1,0,2,2,1,0,0,1,1,0,0,0,2,0,1,0,1,0,2,0,0,0,2,1,0,1,1,1,2,2,0,1,1,1,1,0,1,0,1,1,0,3,0,1,3,1,1,2,2,3,2,0,1,1,0,0,1,1,2,1,2,2,2,0,0,0,0,0,1,1,1,2,2,0,1,5,3,3,1,2,2,1,0,1,1,0,0,3,0,0,0,2,2,1,1,1,1,1,5,0,2,0,2,0,3,0,2,0,0,1,1,0,2,0,0,0,1,1,0,0,1,0,1,1,0,0,0,0,0,1,1,2,3,0,2,1,2,1,2,0,0,0,1,1,0,1,1,0,1,1,1,2,3,1,2,0,0,0,3,0,0,0,0,0,1,2,1,0,0,2,2,0,2,2,4,1,0,0,1,2,3,2,0,0,1,3,2,0,1,1,1,2,0,2,2,0,2,2,1,1,0,3,2,4,0,2,1,0,0,0,0,0,0,0,2,0,3,0,2,1,1,0,3,0,1,0,1,1,0,2,0,0,2,0,1,1,0,4,0,1,1,0,0,0,2,1,0,2,0,1,1,1,1,1,2,0,1,0,0,3,0,2,0,0,0,1,0,0,3,1,2,1,1,1,1,1,0,0,1,1,2,0,0,1,0,0,1,3,0,2,0,1,2,0,1,1,1,0,0,0,1,0,3,1,2,2,1,1,1,0,0,0,0,2,0,0,0,0,1,3,2,0,1,1,0,0,0,0,1,1,2,0,3,3,0,1,0,1,1,0,2,2,2,0,1,1,3,1,3,0,1,0,0,0,1,2,1,0,0,1,0,0,1,1,2,1,2,2,0,0,1,1,0,1,0,1,0,0,0,2,2,3,0,0,1,1,1,1,0,0,1,0,1,0,1,0,0,1,1,0,3,0,1,0,3,3,0,2,0,3,1,1,1,1,0,0,2,2,1,1,0,0,2,1,1,0,0,0,2,1,0,1,2,0,2,1,3,1,1,1,2,2,1,1,2,2,1,1,1,3,0,1,1,1,1,1,0,1,0,1,0,0,1,0,1,1,2,1,0,0,1,1,1,0,2,0,1,1,1,2,1,3,1,0,0,0,1,1,0,0,2,1,1,1,2,0,0,0,1,0,1,1,2,0,0,0,0,1,2,1,0,3,6,0,1,0,2,1,2,0,1,0,2,0,1,1,0,1,0,0,2,1,0,0,2,2,1,0,1,0,3,0,0,2,0,1,2,1,2,0,0,0,1,2,1,2,1,2,0,2,2,0,0,0,1,0,0,2,1,1,1,1,0,0,1,2,0,0,5,1,0,0,1,1,1,0,0,0,1,1,1,0,1,2,1,4,0,0,0,2,0,0,2,0,1,1,1,0,1,1,1,0,0,2,0,1,1,1,2,2,2,1,1,0,1,0,0,1,0,1,1,1,0,2,1,1,0,3,0,1,0,0,0,1,1,2,2,1,1,1,0,1,0,2,0,2,3,1,3,2,1,1,0,0,1,3,2,1,4,1,0,0,3,2,2,0,1,0,0,1,1,1,0,2,3,1,4,1,0,0,0,1,1,1,0,2,0,0,0,1,1,0,2,1,1,2,1,3,3,1,0,2,1,2,0,0,1,2,3,1,1,1,1,0,0,0,2,2,0,0,3,0,3,1,1,1,1,2,1,0,1,0,0,1,2,2,0,1,0,3,0,2,1,0,0,1,1,1,1,1,0,2,2,1,2,2,2,1,0,0,1,1,2,1,3,0,1,1,0,1,0,2,1,1,0,1,0,1,0,1,0,1,2,1,2,0,0,0,1,0,0,0,2,0,0,2,2,2,1,2,1,1,0,3,1,3,1,3,2,2,0,0,0,0,2,0,1,2,1,0,2,0,0,4,1,0,1,0,0,1,0,3,2,1,2,0,2,1,0,1,1,2,2,1,0,0,0,0,0,3,2,1,2,3,1,0,1,2,1,1,0,1,2,0,1,0,1,0,0,1,0,1,1,0,0,1,0,0,0,0,2,0,1,0,3,1,4,1,1,1,0,0,0,0,1,2,0,3,2,0,2,0,1,1,3,1,0,1,2,1,2,2,1,2,0,1,1,1,1,1,0,0,0,3,0,1,0,0,2,0,1,1,0,0,1,0,0,0,1,0,2,2,1,3,0,0,1,1,1,1,0,1,2,1,1,1,1,2,1,0,0,2,1,2,3,2,1,0,0,1,2,0,0,1,1,0,2,1,1,0,0,2,2,2,2,3,4,1,1,0,0,0,1,0,1,0,1,2,1,0,0,1,1,0,0,2,1,1,1,2,1,0,1,2,0,0,2,0,1,4,1,0,2,1,1,2,0,1,1,1,2,4,2,1,1,0,0,0,2,0,2,0,0,0,0,0,1,1,1,1,2,1,0,0,1,2,1,0,1,1,1,1,0,0,0,2,0,0,1,1,0,1,2,0,2,1,3,2,0,2,0,2,0,0,0,1,0,0,2,2,1,0,3,1,1,1,2,0,2,0,2,0,1,0,3,1,0,0,1,1,0,1,5,2,3,0,1,0,1,1,3,1,2,3,3,0,0,1,0,1,1,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,1,2,3,0,2,1,1,1,1,1,1,4,2,2,4,1,2,0,2,2,2,2,2,2,1,2,1,1,0,0,2,0,1,2,1,3,1,0,1,0,1,0,1,0,1,1,0,0,0,1,0,0,0,2,0,0,1,2,0,1,1,0,2,2,0,0,2,1,1,0,1,2,1,0,1,2,2,0,2,0,0,0,0,0,2,1,3,1,0,0,1,1,1,0,0,0,1,0,0,0,1,0,3,3,3,1,1,0,1,1,0,1,0,1,0,2,1,1,0,3,1,2,1,1,1,0,1,1,0,0,1,2,1,2,0,2,1,2,0,1,3,1,0,1,0,0,3,1,1,0,1,2,1,2,0,1,0,1,1,0,1,2,1,1,0,4,1,1,3,0,0,1,1,1,0,1,2,0,0,3,0,2,0,0,1,1,0,2,1,0,2,0,3,0,0,0,0,0,2,1,3,1,0,3,0,0,0,0,1]}]},"null_count":0,"last_update_version":397952041098149888},"cr":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"NzEzLjk0NDU=","upper_bound":"NjI0NS44NDY1","repeats":1},{"count":16,"lower_bound":"NjcxNC43MjEy","upper_bound":"Nzc5OC4zNTUz","repeats":1},{"count":24,"lower_bound":"OTIwNy45OTEz","upper_bound":"OTkzNy4yNTY1","repeats":1},{"count":32,"lower_bound":"MTA4ODAuNDk4Mw==","upper_bound":"MTMwNDQuMDI3OA==","repeats":1},{"count":40,"lower_bound":"MTYwNDEuMDM2MA==","upper_bound":"MTY1NTkuODc5Nw==","repeats":1},{"count":48,"lower_bound":"MTc3MTIuODIzMw==","upper_bound":"MjA4NzMuNjg2Nw==","repeats":1},{"count":56,"lower_bound":"MjExNTUuOTE2NA==","upper_bound":"MjM3NTkuMzMxNw==","repeats":1},{"count":64,"lower_bound":"MjM3OTUuOTYzOA==","upper_bound":"MjUzMzkuMzc0NA==","repeats":1},{"count":72,"lower_bound":"MjU4NjUuNzgwNA==","upper_bound":"MjY3NTUuMTg1Mg==","repeats":1},{"count":80,"lower_bound":"MjcxNTYuODAxMA==","upper_bound":"MzMzNzQuNzM3OA==","repeats":1},{"count":88,"lower_bound":"MzM0MzIuNjcxNg==","upper_bound":"MzcxNjAuMTg4OA==","repeats":1},{"count":96,"lower_bound":"Mzc1ODQuNDE3NA==","upper_bound":"Mzk5ODQuOTY2NA==","repeats":1},{"count":104,"lower_bound":"NDAzMjYuNjUyNw==","upper_bound":"NDYyODUuNDkxNg==","repeats":1},{"count":112,"lower_bound":"NDg0NDcuMTczNQ==","upper_bound":"NDkwODMuMTQ1MQ==","repeats":1},{"count":120,"lower_bound":"NDkyMTUuMTEwNg==","upper_bound":"NTA5MDIuNzc3MA==","repeats":1},{"count":128,"lower_bound":"NTE4ODEuMTI2MA==","upper_bound":"NTMxMTkuMjIxNw==","repeats":1},{"count":136,"lower_bound":"NTQyNTcuNDIzNg==","upper_bound":"NTU3MzUuNTg0NQ==","repeats":1},{"count":144,"lower_bound":"NTc3MTkuMDY4OQ==","upper_bound":"NjEwMTguMjU4OQ==","repeats":1},{"count":152,"lower_bound":"NjE3MzguMzQzOA==","upper_bound":"NjUwMzcuNTc0Mw==","repeats":1},{"count":160,"lower_bound":"NjY4MjYuNTA1NA==","upper_bound":"NzY5MjAuOTkxNA==","repeats":1},{"count":168,"lower_bound":"Nzc4NzAuMjMxNg==","upper_bound":"Nzk1NjAuODg4NQ==","repeats":1},{"count":176,"lower_bound":"ODEyMDAuOTIyOQ==","upper_bound":"ODIzODMuMzgwNA==","repeats":1},{"count":184,"lower_bound":"ODUwMTkuNDQyOQ==","upper_bound":"OTI4MDcuNDAyNA==","repeats":1},{"count":192,"lower_bound":"OTMzMzcuMDAwOA==","upper_bound":"OTUxNTguOTkzMg==","repeats":1},{"count":200,"lower_bound":"OTU3OTMuNzgwNA==","upper_bound":"OTY1ODguMTY0NA==","repeats":1},{"count":208,"lower_bound":"OTc1NDAuNTAyMQ==","upper_bound":"MTAzODY3LjYyNTE=","repeats":1},{"count":216,"lower_bound":"MTA2MTU2LjkzMTQ=","upper_bound":"MTA5MjQxLjc3OTI=","repeats":1},{"count":224,"lower_bound":"MTA5Njk5LjgxMDY=","upper_bound":"MTExNDY5LjU4NzQ=","repeats":1},{"count":232,"lower_bound":"MTEyODY4LjY1MDU=","upper_bound":"MTE2ODczLjQ4NzQ=","repeats":1},{"count":240,"lower_bound":"MTE3MDQ4LjQ1MDQ=","upper_bound":"MTE4MzMxLjQxNTQ=","repeats":1},{"count":248,"lower_bound":"MTE4NDIxLjAzODA=","upper_bound":"MTIwNzYzLjc4MzE=","repeats":1},{"count":256,"lower_bound":"MTMwNjgwLjU2MzU=","upper_bound":"MTMyNjg3LjkzMjY=","repeats":1},{"count":264,"lower_bound":"MTMzMzgyLjQzNjc=","upper_bound":"MTM2NTM4LjY5MTI=","repeats":1},{"count":272,"lower_bound":"MTM2ODE4LjYzMjM=","upper_bound":"MTM4NjE1LjgwODY=","repeats":1},{"count":280,"lower_bound":"MTM5MTc4LjA4NjI=","upper_bound":"MTQwMjg0LjQ4NDQ=","repeats":1},{"count":288,"lower_bound":"MTQwNTUwLjQyOTk=","upper_bound":"MTQ3NzI4Ljk2MTQ=","repeats":1},{"count":296,"lower_bound":"MTUxMjA2LjAwODY=","upper_bound":"MTUzOTMzLjY5NjU=","repeats":1},{"count":304,"lower_bound":"MTU0MzQ2LjEyMTI=","upper_bound":"MTU2OTAxLjU5MzY=","repeats":1},{"count":312,"lower_bound":"MTU3MzIzLjIxMDU=","upper_bound":"MTY0MTYyLjM1MzA=","repeats":1},{"count":320,"lower_bound":"MTY0NjM5LjI3ODA=","upper_bound":"MTY3NjY4LjA0MTg=","repeats":1},{"count":328,"lower_bound":"MTY3ODM5LjUwNDQ=","upper_bound":"MTcwMTMzLjIzNDc=","repeats":1},{"count":336,"lower_bound":"MTcxNDIzLjAxNDk=","upper_bound":"MTcyNzMyLjI4MjM=","repeats":1},{"count":344,"lower_bound":"MTc0MTYyLjI1NjQ=","upper_bound":"MTc0NzMxLjEwNDA=","repeats":1},{"count":352,"lower_bound":"MTc1MzU1LjY2MDk=","upper_bound":"MTc1ODE4Ljc5MzQ=","repeats":1},{"count":360,"lower_bound":"MTc2MTU2Ljc4MTQ=","upper_bound":"MTc3MjU0LjU5MjQ=","repeats":1},{"count":368,"lower_bound":"MTc4MTkxLjUwMTc=","upper_bound":"MTc5ODYxLjAyNTg=","repeats":1},{"count":376,"lower_bound":"MTgwMTQ3LjA0Mjk=","upper_bound":"MTgxNTIxLjQxNDM=","repeats":1},{"count":384,"lower_bound":"MTgxNzU0LjczOTE=","upper_bound":"MTg0NDkxLjcyODQ=","repeats":1},{"count":392,"lower_bound":"MTg1OTk1Ljg0Mzg=","upper_bound":"MTg3NjE2LjI4MjI=","repeats":1},{"count":400,"lower_bound":"MTg5NTQ0Ljc1MTM=","upper_bound":"MTkwMzg3LjEwMjU=","repeats":1},{"count":408,"lower_bound":"MTkxNTMxLjg3MjM=","upper_bound":"MTk0OTkyLjc0OTk=","repeats":1},{"count":416,"lower_bound":"MTk2ODg0LjM2NTA=","upper_bound":"MjAwNTUyLjI1Mjc=","repeats":1},{"count":424,"lower_bound":"MjAxMDE1LjE5Nzg=","upper_bound":"MjAzNTQ0LjQyNTI=","repeats":1},{"count":432,"lower_bound":"MjA1MDExLjUyMDk=","upper_bound":"MjA1MzE4Ljk3NjA=","repeats":1},{"count":440,"lower_bound":"MjA4MTMwLjkxOTQ=","upper_bound":"MjEwMzQ1LjUyNzM=","repeats":1},{"count":448,"lower_bound":"MjEwNDAzLjk0NTE=","upper_bound":"MjE0NjE5LjczNjM=","repeats":1},{"count":456,"lower_bound":"MjE2NzI5LjMxMDg=","upper_bound":"MjE3NzY0LjU4NDg=","repeats":1},{"count":464,"lower_bound":"MjE3OTU0LjMxNjI=","upper_bound":"MjIxNTgyLjUxMzY=","repeats":1},{"count":472,"lower_bound":"MjI4Nzc3LjA1NjQ=","upper_bound":"MjMxNTM0LjcxNzY=","repeats":1},{"count":480,"lower_bound":"MjMzNDcxLjA3MjA=","upper_bound":"MjM4OTc4LjkxMzE=","repeats":1},{"count":488,"lower_bound":"MjM5Nzk0LjkyODM=","upper_bound":"MjQ1NjIyLjU5NzM=","repeats":1},{"count":496,"lower_bound":"MjQ1OTQ4Ljc2OTY=","upper_bound":"MjQ4NzIwLjEzMjA=","repeats":1},{"count":504,"lower_bound":"MjQ4NzU3Ljg3NTI=","upper_bound":"MjUxMTU5LjY2Njk=","repeats":1},{"count":512,"lower_bound":"MjUxMjE3LjI3NjY=","upper_bound":"MjU1OTQ3Ljg4OTQ=","repeats":1},{"count":520,"lower_bound":"MjU3MDQ4LjQ0OTQ=","upper_bound":"MjU5Mzk1LjY4MDI=","repeats":1},{"count":528,"lower_bound":"MjU5NjYxLjA2MzI=","upper_bound":"MjYxMDU3Ljc5MzU=","repeats":1},{"count":536,"lower_bound":"MjYxMDg2LjQ5MDg=","upper_bound":"MjY1Njc5LjQxOTQ=","repeats":1},{"count":544,"lower_bound":"MjY3MDE4LjIzMzE=","upper_bound":"MjcyMTk3LjU4NjM=","repeats":1},{"count":552,"lower_bound":"MjczMzAyLjI3NjQ=","upper_bound":"Mjc4NDEwLjIzMzM=","repeats":1},{"count":560,"lower_bound":"Mjc5Mjc2Ljk3NTU=","upper_bound":"MjgxMDM4LjQ4NjA=","repeats":1},{"count":568,"lower_bound":"MjgzNjA3LjA4Mjg=","upper_bound":"Mjg3OTM2LjkyOTk=","repeats":1},{"count":576,"lower_bound":"Mjg4OTA4LjE1OTc=","upper_bound":"Mjk4MzI2LjM4NDg=","repeats":1},{"count":584,"lower_bound":"Mjk4OTYzLjMwNTU=","upper_bound":"MzA1Mzc4LjY1NjI=","repeats":1},{"count":592,"lower_bound":"MzA2NDkwLjMzNjg=","upper_bound":"MzEyNDQ0LjA1NTk=","repeats":1},{"count":600,"lower_bound":"MzEzOTcxLjU5NDg=","upper_bound":"MzE1NzM3Ljc1MDI=","repeats":1},{"count":608,"lower_bound":"MzE3OTE4LjI5MzM=","upper_bound":"MzIyNzMwLjk2Njk=","repeats":1},{"count":616,"lower_bound":"MzIyODE4LjAzMjA=","upper_bound":"MzI2NjYyLjgzNTM=","repeats":1},{"count":624,"lower_bound":"MzI3MTcxLjAxNTk=","upper_bound":"MzI5NjI1LjQxMTg=","repeats":1},{"count":632,"lower_bound":"MzMwNzM0LjYwOTk=","upper_bound":"MzM0MDUxLjIzNTU=","repeats":1},{"count":640,"lower_bound":"MzM0NTUxLjgxNjU=","upper_bound":"MzM3MDc5Ljg5NDk=","repeats":1},{"count":648,"lower_bound":"MzM3Mzk4LjQ0NTA=","upper_bound":"MzM4MjU5LjUwNDA=","repeats":1},{"count":656,"lower_bound":"MzQwNTE4Ljg0OTY=","upper_bound":"MzQyMjk4LjM0OTA=","repeats":1},{"count":664,"lower_bound":"MzQyNTI2LjI3ODg=","upper_bound":"MzQ0ODkxLjY3MDM=","repeats":1},{"count":672,"lower_bound":"MzQ1MzQ3Ljk4OTg=","upper_bound":"MzQ4MzA2LjEwMDg=","repeats":1},{"count":680,"lower_bound":"MzQ4NTgxLjI5ODc=","upper_bound":"MzUyNTA0Ljc4MzE=","repeats":1},{"count":688,"lower_bound":"MzUzNDI3LjQyODY=","upper_bound":"MzU4MTU2LjIyMTg=","repeats":1},{"count":696,"lower_bound":"MzYwMTA2LjUxMzE=","upper_bound":"MzYzMTY4LjA4NDc=","repeats":1},{"count":704,"lower_bound":"MzYzMzkyLjA0Njc=","upper_bound":"MzY1NjA2LjM2MTU=","repeats":1},{"count":712,"lower_bound":"MzY1ODkyLjg2OTI=","upper_bound":"MzY5NTYwLjgyMTY=","repeats":1},{"count":720,"lower_bound":"MzcxMjExLjk0Njk=","upper_bound":"MzczOTc4LjQzOTc=","repeats":1},{"count":728,"lower_bound":"Mzc1MzY3Ljk4NTM=","upper_bound":"Mzc3ODM5LjgzNzE=","repeats":1},{"count":736,"lower_bound":"Mzc5MzMxLjIwOTY=","upper_bound":"MzgxMDkwLjkzMjQ=","repeats":1},{"count":744,"lower_bound":"MzgxMjM0LjA2MjA=","upper_bound":"Mzg0ODY3LjI4MDk=","repeats":1},{"count":752,"lower_bound":"Mzg3ODIzLjcyODk=","upper_bound":"MzkwMTQ3LjAyNjU=","repeats":1},{"count":760,"lower_bound":"MzkwMjA0Ljk3MTY=","upper_bound":"MzkwNTgwLjQ3Mjk=","repeats":1},{"count":768,"lower_bound":"MzkwNzM0LjU0ODA=","upper_bound":"Mzk4NjczLjgxODA=","repeats":1},{"count":776,"lower_bound":"Mzk5NjYyLjIwMjc=","upper_bound":"NDAyNTk4LjQyNjY=","repeats":1},{"count":784,"lower_bound":"NDAzNzQ4Ljk1NjE=","upper_bound":"NDEwNzg3LjQwMDg=","repeats":1},{"count":792,"lower_bound":"NDExODYzLjM0OTE=","upper_bound":"NDE3MDc3LjQ2MzQ=","repeats":1},{"count":800,"lower_bound":"NDE3NDMxLjE2MDk=","upper_bound":"NDE5OTI4LjA0Mzk=","repeats":1},{"count":808,"lower_bound":"NDIxNDIzLjczMjk=","upper_bound":"NDIzMDE1LjQ4MTE=","repeats":1},{"count":816,"lower_bound":"NDIzMjIxLjMwNzc=","upper_bound":"NDI4MTQ3LjU2NDQ=","repeats":1},{"count":824,"lower_bound":"NDI4NDUzLjQxMTQ=","upper_bound":"NDI5NDAzLjMzMjE=","repeats":1},{"count":832,"lower_bound":"NDMwOTQwLjQzNjc=","upper_bound":"NDMyNjg5LjM0MzE=","repeats":1},{"count":840,"lower_bound":"NDMyNzAwLjgyNjQ=","upper_bound":"NDM2MDE2Ljk3ODE=","repeats":1},{"count":848,"lower_bound":"NDM2ODAxLjY3MDg=","upper_bound":"NDQwMzkzLjIxNzU=","repeats":1},{"count":856,"lower_bound":"NDQzMDUwLjkzMDc=","upper_bound":"NDQ1OTMwLjEwNjY=","repeats":1},{"count":864,"lower_bound":"NDQ5NjY0LjA0MjY=","upper_bound":"NDUxMjYyLjUwMzA=","repeats":1},{"count":872,"lower_bound":"NDUxNDE1LjE1NTA=","upper_bound":"NDU3NTc3Ljc3MTI=","repeats":1},{"count":880,"lower_bound":"NDYxODEzLjIwNTc=","upper_bound":"NDYyMjA0LjAyMjY=","repeats":1},{"count":888,"lower_bound":"NDY1NjM4Ljc5OTI=","upper_bound":"NDY3NzQ1LjQ1MDM=","repeats":1},{"count":896,"lower_bound":"NDY3ODYzLjE2NjQ=","upper_bound":"NDcwMTI4LjU0NzY=","repeats":1},{"count":904,"lower_bound":"NDcxMTM4LjY0MjI=","upper_bound":"NDcyMDA3LjYyMjE=","repeats":1},{"count":912,"lower_bound":"NDcyMzUxLjk2ODY=","upper_bound":"NDc0NDU1LjA4Njk=","repeats":1},{"count":920,"lower_bound":"NDc0NTE2LjM5NDk=","upper_bound":"NDc3MjI1LjMxNDY=","repeats":1},{"count":928,"lower_bound":"NDc4MTI2LjQwNDI=","upper_bound":"NDc5MjA1LjAyNTU=","repeats":1},{"count":936,"lower_bound":"NDgwMzA2LjgyNzI=","upper_bound":"NDgyNTYxLjk4MzQ=","repeats":1},{"count":944,"lower_bound":"NDgzOTcyLjM3MjE=","upper_bound":"NDg5NjY3LjM5MjM=","repeats":1},{"count":952,"lower_bound":"NDg5ODU4LjQ5NzQ=","upper_bound":"NDkxNTIwLjM4NzA=","repeats":1},{"count":960,"lower_bound":"NDkxODkwLjg4NDk=","upper_bound":"NDkzODUxLjgzOTE=","repeats":1},{"count":968,"lower_bound":"NDk0NzU0LjM4NzA=","upper_bound":"NDk3ODczLjIzMjU=","repeats":1},{"count":976,"lower_bound":"NTAwNTI2LjkwNDY=","upper_bound":"NTAxNTQ1LjcyNTc=","repeats":1},{"count":984,"lower_bound":"NTAzMjU3Ljk4MTM=","upper_bound":"NTA2ODAxLjY5NTY=","repeats":1},{"count":992,"lower_bound":"NTA3NzYxLjY3NjU=","upper_bound":"NTA5NDc2LjgxMDY=","repeats":1},{"count":1000,"lower_bound":"NTEwMTU0LjY1ODc=","upper_bound":"NTE2ODE3LjUxMTM=","repeats":1},{"count":1008,"lower_bound":"NTE2ODc2LjQzNzI=","upper_bound":"NTIyNDEzLjM0NTY=","repeats":1},{"count":1016,"lower_bound":"NTIyNDUzLjM3NDk=","upper_bound":"NTI0MDYwLjk0Nzg=","repeats":1},{"count":1024,"lower_bound":"NTI2MjI3LjM3MTE=","upper_bound":"NTI2NzkyLjQzNTM=","repeats":1},{"count":1032,"lower_bound":"NTI5MTE4Ljg0OTc=","upper_bound":"NTMwMjc3LjI3MTI=","repeats":1},{"count":1040,"lower_bound":"NTMyMDQyLjI0MDU=","upper_bound":"NTM5Mzc1LjYyMzU=","repeats":1},{"count":1048,"lower_bound":"NTQwMTk1LjYxNTM=","upper_bound":"NTQzNTU1LjUxNzY=","repeats":1},{"count":1056,"lower_bound":"NTQ0NTA3LjcyOTU=","upper_bound":"NTQ3ODE3LjE4NjQ=","repeats":1},{"count":1064,"lower_bound":"NTQ5MDQ0LjAzNzk=","upper_bound":"NTUyMTEyLjI5MTU=","repeats":1},{"count":1072,"lower_bound":"NTUyMzI5Ljc5MTI=","upper_bound":"NTU1NjkzLjE3NTI=","repeats":1},{"count":1080,"lower_bound":"NTU2NTMzLjYwMDg=","upper_bound":"NTYwNTI2LjU2MTc=","repeats":1},{"count":1088,"lower_bound":"NTYxMDA3LjQ2Mzg=","upper_bound":"NTY0ODQ0Ljk5MjI=","repeats":1},{"count":1096,"lower_bound":"NTY2MzgwLjIyNTc=","upper_bound":"NTcxMTY0Ljc1NDA=","repeats":1},{"count":1104,"lower_bound":"NTcxMzkyLjQ4MDQ=","upper_bound":"NTc1Nzc3LjQ1MDA=","repeats":1},{"count":1112,"lower_bound":"NTc2NzM5LjAxODY=","upper_bound":"NTc4NDM0LjMxNjc=","repeats":1},{"count":1120,"lower_bound":"NTc4OTcwLjY3NTY=","upper_bound":"NTgxNjgyLjE1ODE=","repeats":1},{"count":1128,"lower_bound":"NTgzMzM1LjMyMDQ=","upper_bound":"NTgzODM3LjI0MjI=","repeats":1},{"count":1136,"lower_bound":"NTg1NTU4LjU4MzQ=","upper_bound":"NTg3MTM1LjYyMTE=","repeats":1},{"count":1144,"lower_bound":"NTg5OTEwLjM0NjU=","upper_bound":"NTkxNTMyLjc5MTE=","repeats":1},{"count":1152,"lower_bound":"NTkyNjAyLjEwMzg=","upper_bound":"NTk0MDcyLjU1NTM=","repeats":1},{"count":1160,"lower_bound":"NTk1MDc4Ljg5MTE=","upper_bound":"NTk3Mjk0LjkyNzE=","repeats":1},{"count":1168,"lower_bound":"NTk5MDQ0LjAyMzc=","upper_bound":"NjAxNDU5LjU0ODM=","repeats":1},{"count":1176,"lower_bound":"NjAxNzY4LjYzMTA=","upper_bound":"NjA1MTQxLjMxNjM=","repeats":1},{"count":1184,"lower_bound":"NjA2Mjc0Ljk2OTk=","upper_bound":"NjA3MzI3LjMzMzk=","repeats":1},{"count":1192,"lower_bound":"NjA4NjQ5LjkyMTA=","upper_bound":"NjEwODMwLjI4OTQ=","repeats":1},{"count":1200,"lower_bound":"NjExOTEyLjY2ODg=","upper_bound":"NjE0NTE0LjczMjM=","repeats":1},{"count":1208,"lower_bound":"NjE0ODk1Ljc2OTU=","upper_bound":"NjE2NTczLjUwMTY=","repeats":1},{"count":1216,"lower_bound":"NjE3MjI0LjAwNzk=","upper_bound":"NjE4ODgwLjUyMTU=","repeats":1},{"count":1224,"lower_bound":"NjE5MDE1Ljc3OTI=","upper_bound":"NjIwNDQ1LjI5NDc=","repeats":1},{"count":1232,"lower_bound":"NjIxMzgxLjYzNjY=","upper_bound":"NjI3NDQ1LjcyNTQ=","repeats":1},{"count":1240,"lower_bound":"NjI4MDc3Ljg2NzI=","upper_bound":"NjI4OTQ1LjgzMzk=","repeats":1},{"count":1248,"lower_bound":"NjMwMTA5LjYyMDg=","upper_bound":"NjMyOTEwLjE1MDU=","repeats":1},{"count":1256,"lower_bound":"NjMzNDA3LjgwMjM=","upper_bound":"NjM3ODE3LjMwMjQ=","repeats":1},{"count":1264,"lower_bound":"NjQxMzg3LjM5MDA=","upper_bound":"NjQzOTQ3LjAyMDQ=","repeats":1},{"count":1272,"lower_bound":"NjQ0ODQzLjc4NjQ=","upper_bound":"NjQ3MTUyLjE4MDQ=","repeats":1},{"count":1280,"lower_bound":"NjQ3MTk3Ljg3NTU=","upper_bound":"NjQ4NzA5LjgxNjI=","repeats":1},{"count":1288,"lower_bound":"NjQ4OTA0LjcyNDk=","upper_bound":"NjUwMDAwLjE5MTY=","repeats":1},{"count":1296,"lower_bound":"NjUxMzA5Ljk3NjU=","upper_bound":"NjUzMjM1LjA1MTQ=","repeats":1},{"count":1304,"lower_bound":"NjU0NTAzLjk0NTU=","upper_bound":"NjU3MzcxLjQ4MTI=","repeats":1},{"count":1312,"lower_bound":"NjU3NTc1LjYxNTQ=","upper_bound":"NjU5NzYzLjIxMjQ=","repeats":1},{"count":1320,"lower_bound":"NjU5OTA4LjgzODU=","upper_bound":"NjY4NDE3LjU1OTU=","repeats":1},{"count":1328,"lower_bound":"NjY4NDE5LjgyMDE=","upper_bound":"NjcxNzUwLjIzNjM=","repeats":1},{"count":1336,"lower_bound":"NjcyMzYyLjIyMjQ=","upper_bound":"Njc0MTIzLjU0NzE=","repeats":1},{"count":1344,"lower_bound":"Njc0MTc0LjU2MjE=","upper_bound":"Njc2OTExLjU5Mzg=","repeats":1},{"count":1352,"lower_bound":"Njc3NjYzLjQ5ODY=","upper_bound":"NjgwMjgwLjYxNDU=","repeats":1},{"count":1360,"lower_bound":"NjgwOTkzLjQzNDk=","upper_bound":"Njg0NjY0LjI3NTg=","repeats":1},{"count":1368,"lower_bound":"Njg1ODM2LjY3OTE=","upper_bound":"Njg3NTc2Ljk2MTQ=","repeats":1},{"count":1376,"lower_bound":"Njg4Mjk4LjE3NTA=","upper_bound":"Njk0MjAyLjk4MzI=","repeats":1},{"count":1384,"lower_bound":"Njk0NDEzLjEyOTM=","upper_bound":"Njk5NzkyLjc0MzQ=","repeats":1},{"count":1392,"lower_bound":"NzAxNjY3LjcxNDA=","upper_bound":"NzA2NzYxLjY3ODQ=","repeats":1},{"count":1400,"lower_bound":"NzA3NDI0LjEyNDU=","upper_bound":"NzEwNTYyLjIzNTE=","repeats":1},{"count":1408,"lower_bound":"NzEyMzc3LjE4ODA=","upper_bound":"NzE0MjYyLjQwMDg=","repeats":1},{"count":1416,"lower_bound":"NzE1MTM2LjIzNjA=","upper_bound":"NzE2NjYzLjI5MjA=","repeats":1},{"count":1424,"lower_bound":"NzE3MDc5LjAyNDQ=","upper_bound":"NzE4MTI2LjkxOTI=","repeats":1},{"count":1432,"lower_bound":"NzE4NjMyLjY5NzM=","upper_bound":"NzIyNTE3LjI3NTA=","repeats":1},{"count":1440,"lower_bound":"NzIyNjI4LjA0ODE=","upper_bound":"NzI0NTAzLjE2NzY=","repeats":1},{"count":1448,"lower_bound":"NzI0OTQ0LjUzNjA=","upper_bound":"NzI2MTE0LjQ5Njg=","repeats":1},{"count":1456,"lower_bound":"NzI3MzI0LjI0ODk=","upper_bound":"NzI5MDAzLjE0MDg=","repeats":1},{"count":1464,"lower_bound":"NzI5ODA0LjExODk=","upper_bound":"NzMwNjI2LjM5MzA=","repeats":1},{"count":1472,"lower_bound":"NzMxMDA5LjI4Njc=","upper_bound":"NzMyOTIxLjgxODE=","repeats":1},{"count":1480,"lower_bound":"NzMzMDE1LjA2MjI=","upper_bound":"NzMzOTk3LjY5NTk=","repeats":1},{"count":1488,"lower_bound":"NzM0MzYwLjc1NTI=","upper_bound":"NzM2MTYxLjc0NTA=","repeats":1},{"count":1496,"lower_bound":"NzM2NzE1LjI4NjY=","upper_bound":"NzQxNjI2LjIyNTg=","repeats":1},{"count":1504,"lower_bound":"NzQzNTg5Ljk5MDM=","upper_bound":"NzQ3OTIyLjc2NTk=","repeats":1},{"count":1512,"lower_bound":"NzQ4NTIzLjg3NzI=","upper_bound":"NzUwMDc4LjY0MTc=","repeats":1},{"count":1520,"lower_bound":"NzUxNDE1LjEzOTI=","upper_bound":"NzU0Njc2LjkzNDk=","repeats":1},{"count":1528,"lower_bound":"NzU1MzkyLjI0MzQ=","upper_bound":"NzU5MDMxLjk0MTE=","repeats":1},{"count":1536,"lower_bound":"NzU5MTU4LjYxNTY=","upper_bound":"NzYyNTA0Ljc2Njk=","repeats":1},{"count":1544,"lower_bound":"NzYzMjI1LjMzMTU=","upper_bound":"NzY5ODQ3LjYzNzE=","repeats":1},{"count":1552,"lower_bound":"NzcwMzMxLjQzNDk=","upper_bound":"NzczNjQ3Ljg3ODg=","repeats":1},{"count":1560,"lower_bound":"Nzc0NzQ5Ljk3NzA=","upper_bound":"Nzc4NDI2Ljg3MTQ=","repeats":1},{"count":1568,"lower_bound":"NzgwMDkzLjQwNTU=","upper_bound":"NzgyMTg0LjE2ODI=","repeats":1},{"count":1576,"lower_bound":"NzgzMTQxLjc3OTY=","upper_bound":"Nzg0MTI4LjUxMzU=","repeats":1},{"count":1584,"lower_bound":"Nzg4OTUyLjk2ODg=","upper_bound":"NzkyMDA1LjQ5MjU=","repeats":1},{"count":1592,"lower_bound":"NzkyMTc2LjU2MjQ=","upper_bound":"NzkzOTk3LjgwNzU=","repeats":1},{"count":1600,"lower_bound":"Nzk1NDYwLjcxMDg=","upper_bound":"ODAxMTIwLjMzNjQ=","repeats":1},{"count":1608,"lower_bound":"ODA1ODc2LjQwNDU=","upper_bound":"ODA4MjE2LjI3OTA=","repeats":1},{"count":1616,"lower_bound":"ODA4NDQ3LjMxMDA=","upper_bound":"ODEwNDI3LjY2MDE=","repeats":1},{"count":1624,"lower_bound":"ODEwNTYxLjg2NTQ=","upper_bound":"ODEzNTEzLjA1NjM=","repeats":1},{"count":1632,"lower_bound":"ODEzNjA4LjU1MjQ=","upper_bound":"ODE1Njk1Ljk1NTQ=","repeats":1},{"count":1640,"lower_bound":"ODE1ODExLjk5MTg=","upper_bound":"ODE3MzgxLjk0MTM=","repeats":1},{"count":1648,"lower_bound":"ODE3NDY1LjA3ODE=","upper_bound":"ODIxNzE0LjE1NjY=","repeats":1},{"count":1656,"lower_bound":"ODIzMzMzLjUyMTE=","upper_bound":"ODI0MjU1LjEwNTU=","repeats":1},{"count":1664,"lower_bound":"ODI0NDcxLjkwMDU=","upper_bound":"ODI3NDQ5LjQ0NzY=","repeats":1},{"count":1672,"lower_bound":"ODI3NjQyLjA4OTI=","upper_bound":"ODMwNzE3LjQ2NTQ=","repeats":1},{"count":1680,"lower_bound":"ODMxMjI5Ljc5NDE=","upper_bound":"ODMzMDkyLjYwMzQ=","repeats":1},{"count":1688,"lower_bound":"ODMzMTA0LjExODk=","upper_bound":"ODM4NzAyLjk2Njk=","repeats":1},{"count":1696,"lower_bound":"ODM5OTA4LjYzNDk=","upper_bound":"ODQwNjU1LjI4MTI=","repeats":1},{"count":1704,"lower_bound":"ODQyMTAwLjQwMjM=","upper_bound":"ODQzNDUxLjU4NTQ=","repeats":1},{"count":1712,"lower_bound":"ODQzNDg4Ljk3NDc=","upper_bound":"ODQ2NzY2LjU1NjM=","repeats":1},{"count":1720,"lower_bound":"ODQ2OTgxLjM3NjA=","upper_bound":"ODUwNjc2LjMwMTU=","repeats":1},{"count":1728,"lower_bound":"ODUxNDg5LjQzODE=","upper_bound":"ODU2NTE1LjEyMjI=","repeats":1},{"count":1736,"lower_bound":"ODU4MzE2LjExNDI=","upper_bound":"ODYyMzM5LjY2MTU=","repeats":1},{"count":1744,"lower_bound":"ODYyMzczLjU1Mjc=","upper_bound":"ODY0NjcwLjE1ODg=","repeats":1},{"count":1752,"lower_bound":"ODY1ODQ4LjgzNDc=","upper_bound":"ODY4NDczLjg4Njk=","repeats":1},{"count":1760,"lower_bound":"ODY4ODMyLjk4ODk=","upper_bound":"ODcxMDc2LjAzNTY=","repeats":1},{"count":1768,"lower_bound":"ODc3ODA4Ljk5NDY=","upper_bound":"ODgyOTk4LjYyNzk=","repeats":1},{"count":1776,"lower_bound":"ODgzMDk4LjI0ODA=","upper_bound":"ODg0MzQwLjY1NDQ=","repeats":1},{"count":1784,"lower_bound":"ODg0NjI2Ljg5ODc=","upper_bound":"ODg3ODg0LjU0OTM=","repeats":1},{"count":1792,"lower_bound":"ODg4MzcyLjk3ODU=","upper_bound":"ODkwOTkxLjQyNTU=","repeats":1},{"count":1800,"lower_bound":"ODkzODQ5LjMzOTI=","upper_bound":"ODk0ODk1LjkyODg=","repeats":1},{"count":1808,"lower_bound":"ODk1MTE1LjE5NTc=","upper_bound":"ODk3NzEzLjUzMTA=","repeats":1},{"count":1816,"lower_bound":"ODk4MTU2LjI4NDE=","upper_bound":"ODk4NDAxLjY5NzA=","repeats":1},{"count":1824,"lower_bound":"OTAxNDQzLjUzNDA=","upper_bound":"OTA1OTU4Ljc5Mjc=","repeats":1},{"count":1832,"lower_bound":"OTA2NDgyLjI3NTE=","upper_bound":"OTA5Njc4LjI5NzQ=","repeats":1},{"count":1840,"lower_bound":"OTA5ODA2Ljk5NTI=","upper_bound":"OTEyOTQ1LjMzMjU=","repeats":1},{"count":1848,"lower_bound":"OTEzMTQ0LjMwMDQ=","upper_bound":"OTE5Njg4Ljg4NjM=","repeats":1},{"count":1856,"lower_bound":"OTIyOTY0LjczMDU=","upper_bound":"OTI5MTI4LjQ0MjQ=","repeats":1},{"count":1864,"lower_bound":"OTMxMzUwLjY1ODE=","upper_bound":"OTMyMjM4Ljk4NDA=","repeats":1},{"count":1872,"lower_bound":"OTM0Njc5LjA0Mjc=","upper_bound":"OTQwMjMwLjM1OTg=","repeats":1},{"count":1880,"lower_bound":"OTQxMTgyLjM4NTY=","upper_bound":"OTQ0NDgzLjI4NDI=","repeats":1},{"count":1888,"lower_bound":"OTQ0NjE4LjA5OTI=","upper_bound":"OTQ2NDY4Ljk1Njg=","repeats":1},{"count":1896,"lower_bound":"OTQ2NzEzLjk3NzI=","upper_bound":"OTQ4ODUxLjIxMjU=","repeats":1},{"count":1904,"lower_bound":"OTQ5MjgwLjQzMzg=","upper_bound":"OTUwNTg4LjgxNDk=","repeats":1},{"count":1912,"lower_bound":"OTUxOTY0LjU3Mzk=","upper_bound":"OTUyOTk0LjI1MjQ=","repeats":1},{"count":1920,"lower_bound":"OTU0NTQ2LjQyMzU=","upper_bound":"OTU2MTM4LjI3NzQ=","repeats":1},{"count":1928,"lower_bound":"OTU3ODkxLjU5OTQ=","upper_bound":"OTU5MTk3LjAyNzc=","repeats":1},{"count":1936,"lower_bound":"OTYwNTc3LjU4MDA=","upper_bound":"OTYyMDAwLjE0Mzk=","repeats":1},{"count":1944,"lower_bound":"OTYyMDQ4LjM0MjA=","upper_bound":"OTY2MTM3Ljc4NTQ=","repeats":1},{"count":1952,"lower_bound":"OTY3NjgzLjE0MzU=","upper_bound":"OTcxMjYzLjE2Nzg=","repeats":1},{"count":1960,"lower_bound":"OTcyMTM2Ljc5OTA=","upper_bound":"OTczMTE2LjI1MDM=","repeats":1},{"count":1968,"lower_bound":"OTc0NDc5LjI0MjI=","upper_bound":"OTgwMTM4Ljg0MjU=","repeats":1},{"count":1976,"lower_bound":"OTgwOTMzLjcyNjE=","upper_bound":"OTg1NjI2Ljc5NzM=","repeats":1},{"count":1984,"lower_bound":"OTg4MzA5LjEwNDQ=","upper_bound":"OTg5NDU0LjM0NjU=","repeats":1},{"count":1992,"lower_bound":"OTkwNzAwLjIyMjI=","upper_bound":"OTk0MDAwLjg0NDE=","repeats":1},{"count":2000,"lower_bound":"OTk1ODUxLjYwMDE=","upper_bound":"OTk5MTQyLjY3NDU=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,2,0,2,0,0,1,0,2,1,2,0,3,1,1,1,2,0,0,2,0,0,0,0,0,0,3,1,2,1,2,1,1,0,1,0,2,1,0,1,2,0,0,1,1,1,0,0,2,0,1,0,0,0,0,0,1,1,2,1,1,1,1,2,0,3,0,1,0,0,0,1,3,1,0,1,0,1,0,0,0,1,1,0,1,3,0,1,1,1,2,1,0,1,1,2,3,0,1,0,0,1,0,1,1,0,1,0,0,0,0,1,0,0,1,2,1,1,2,0,1,1,1,1,2,0,0,1,1,2,1,0,0,2,0,1,1,1,1,0,0,1,0,0,2,2,2,0,1,0,0,0,1,1,1,1,1,1,2,1,2,1,1,0,2,0,2,3,1,0,0,0,0,0,0,0,1,2,2,2,3,0,0,0,0,2,0,0,3,0,2,0,0,2,0,1,0,0,1,2,2,1,3,0,0,1,0,1,0,1,3,1,0,0,0,1,3,0,1,0,2,0,1,1,1,0,2,1,1,0,1,3,1,1,0,0,0,0,1,2,1,4,1,1,1,1,0,2,1,2,4,0,1,0,0,0,0,0,1,1,0,0,0,2,2,0,1,1,2,0,3,6,0,0,3,3,0,1,0,2,0,2,0,3,0,1,1,2,0,0,0,1,3,3,0,2,2,2,2,2,0,2,0,0,1,1,1,0,0,1,0,1,0,1,0,2,0,2,0,1,1,1,0,0,2,1,1,1,1,2,2,0,2,0,1,1,0,2,1,2,2,1,1,3,0,0,2,2,3,2,0,2,1,0,0,1,1,0,0,2,2,0,2,2,1,0,5,1,1,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,0,1,1,0,1,1,0,1,0,2,0,0,0,3,2,1,0,2,0,3,2,2,1,2,2,1,1,0,1,0,2,1,0,0,1,0,1,0,0,1,3,0,3,1,0,2,1,1,0,0,1,3,0,0,3,1,0,2,0,0,1,1,0,0,1,1,1,1,3,1,1,1,1,0,0,2,1,1,0,1,2,0,1,0,2,2,2,0,2,0,0,0,2,0,1,2,0,0,1,1,0,0,2,1,0,1,1,1,1,0,2,3,2,2,0,0,3,0,3,0,1,1,0,1,3,2,2,0,4,1,0,1,0,0,0,4,1,0,1,0,0,0,0,2,1,0,2,2,1,1,2,1,1,2,1,0,1,0,1,2,1,0,0,1,0,1,3,1,0,0,2,2,1,0,0,1,0,2,2,0,2,0,0,0,1,0,2,1,0,0,0,1,1,2,0,3,3,1,1,0,0,0,1,0,1,0,1,0,1,2,0,3,2,0,0,1,0,0,0,0,1,1,1,1,1,0,1,1,2,1,0,0,0,0,2,0,2,2,2,0,1,0,0,2,2,1,2,0,0,0,0,0,1,1,2,3,1,3,1,2,1,2,2,1,1,3,0,1,0,1,0,3,0,1,0,0,0,0,0,1,4,0,1,1,0,2,1,1,2,1,1,1,0,0,2,0,3,1,1,1,2,1,2,1,1,0,1,0,1,0,0,0,1,1,3,2,2,1,1,2,2,1,1,0,3,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,2,2,0,0,0,0,2,3,1,1,3,1,2,0,2,0,1,1,2,0,1,1,2,1,0,1,0,1,0,2,1,2,0,1,1,0,3,3,1,0,0,0,0,1,0,1,0,1,1,0,1,2,0,0,0,1,1,1,0,0,0,1,0,0,0,1,2,0,0,0,1,1,1,0,1,2,1,1,1,4,1,1,0,1,0,2,2,0,0,0,1,0,2,2,0,1,0,1,0,1,0,2,1,2,3,1,3,2,1,0,0,1,0,0,0,2,1,1,0,0,0,2,1,1,1,3,0,1,0,0,2,0,0,0,0,3,1,1,3,1,3,2,0,2,0,0,1,1,1,2,1,2,0,0,1,1,0,1,1,0,2,1,0,1,0,1,1,0,0,1,1,1,3,1,3,1,2,0,2,0,1,1,0,1,1,1,1,1,0,2,1,1,0,1,1,0,3,2,1,1,4,1,1,1,0,1,0,0,1,0,1,0,1,0,1,0,5,0,0,1,0,2,1,2,0,0,1,1,1,2,0,1,0,1,1,1,1,5,1,1,1,1,3,0,2,0,1,0,1,2,1,1,0,4,1,1,3,0,1,1,1,0,2,1,0,2,1,1,1,4,1,0,1,1,0,3,0,1,0,1,1,2,1,1,2,2,0,0,0,1,0,2,1,2,0,0,1,1,0,1,2,0,2,0,0,0,1,1,1,1,0,0,3,1,0,3,0,1,1,1,2,3,1,2,3,0,0,2,1,0,3,5,0,1,1,1,1,1,1,0,1,0,1,1,1,1,4,0,3,0,2,2,0,1,2,0,3,1,1,2,1,0,0,2,0,1,1,1,1,1,3,2,1,1,3,1,0,2,0,0,3,1,1,0,0,1,1,0,1,1,1,3,1,0,3,1,0,2,0,0,1,0,3,1,2,0,0,3,2,1,1,2,0,2,0,2,0,1,2,2,0,1,0,3,1,0,0,4,1,1,1,1,0,1,2,2,1,0,0,4,0,1,0,1,2,0,1,3,2,0,2,1,0,0,1,1,1,2,1,2,0,0,1,1,0,1,0,0,2,0,0,3,1,3,1,2,2,1,2,1,2,0,0,0,0,1,3,2,1,1,0,0,0,0,2,1,1,0,0,0,1,4,1,2,2,0,0,0,1,0,0,1,2,2,2,1,0,0,2,0,1,0,0,1,2,1,1,1,2,2,0,1,0,1,3,0,3,1,0,0,0,1,1,0,1,1,2,2,1,1,0,0,0,1,1,1,0,3,1,0,1,1,3,1,2,1,1,1,4,0,0,1,0,0,0,0,1,0,2,0,1,1,2,2,0,1,1,1,1,2,3,1,0,0,0,1,0,0,0,0,4,1,2,2,0,0,1,1,0,0,0,0,0,0,1,0,0,2,0,0,2,3,0,0,0,3,3,0,0,2,1,1,1,3,2,1,1,1,0,0,0,0,1,1,0,3,0,0,1,1,1,1,0,0,1,0,1,1,1,0,3,2,1,1,1,0,0,1,1,0,0,1,0,2,0,0,0,1,0,1,2,1,0,0,2,0,0,1,1,3,0,0,0,1,2,2,2,2,1,1,4,1,1,0,1,0,2,0,0,1,1,1,1,0,2,0,1,1,0,1,1,1,0,1,2,0,0,2,0,0,0,0,1,0,0,1,2,0,1,0,2,1,1,1,0,5,1,2,2,1,1,1,0,1,0,4,2,3,1,1,0,0,1,0,2,3,1,0,1,0,0,1,1,0,1,1,2,1,2,1,1,0,0,1,2,2,1,0,1,3,1,1,0,0,2,4,1,0,0,0,2,2,1,2,0,0,1,1,0,0,1,0,0,1,2,0,3,0,1,1,0,2,0,1,1,1,0,1,0,0,2,1,3,1,0,2,1,2,0,0,0,2,2,1,1,0,0,2,1,2,0,0,3,0,2,0,6,2,1,0,1,0,0,1,0,1,1,3,1,1,0,2,2,0,2,0,1,1,2,0,1,0,0,0,2,1,1,1,1,0,3,2,4,0,0,2,2,2,1,1,2,0,1,0,1,0,1,1,1,0,0,2,1,1,3,2,1,0,4,1,0,0,1,1,1,0,2,1,1,2,1,1,1,0,0,0,0,1,2,2,0,1,3,2,0,0,0,2,0,1,0,1,0,1,3,0,0,0,1,1,0,3,1,1,2,0,1,0,3,2,1,0,1,1,2,1,1,1,3,1,1,3,3,2,1,0,1,1,2,2,2,1,0,3,0,2,0,0,1,0,0,2,3,3,0,0,2,2,1,1,2,0,1,2,0,0,2,1,0,4,2,2,4,0,0,0,2,2,2,0,0,1,1,2,1,2,0,1,0,2,0,0,0,0,2,0,0,1,1,0,0,0,1,2,1,3,2,1,2,0,0,0,0,2,3,1,3,1,0,1,0,1,1,1,1,2,0,1,0,2,2,1,0,0,0,0,2,2,1,3,1,1,0,2,1,0,0,0,1,0,0,0,2,1,1,2,1,0,0,1,1,1,1,1,1,0,3,1,1,3,1,2,1,0,0,1,1,3,0,1,0,1,0,1,1,1,1,0,2,1,0,1,0,3,1,1,1,1,0,2,3,0,1,2,0,0,1,1,0,4,2,0,1,0,1,2,0,1,3,0,1,0,0,5,0,2,2,0,1,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,2,0,2,0,1,1,0,3,1,0,0,0,0,2,0,1,1,1,1,0,1,1,0,1,0,3,1,1,0,3,1,1,0,0,0,0,0,2,1,1,0,2,0,0,0,2,0,1,3,0,2,1,2,1,0,1,0,2,0,2,0,0,0,2,1,6,2,1,1,3,2,1,0,1,3,0,0,0,3,2,1,1,5,1,3,2,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,2,1,0,0,2,3,3,2,0,1,1,2,1,3,1,0,1,2,0,2,4,3,2,1,1]},{"counters":[0,2,2,2,1,1,2,1,0,1,1,1,2,2,2,2,1,1,1,1,2,0,0,2,0,1,1,0,3,1,0,0,1,0,0,2,0,1,0,2,0,1,1,1,3,3,0,1,0,1,4,1,1,1,1,1,1,1,1,1,1,0,0,1,1,2,0,0,0,1,0,2,0,1,0,0,2,1,1,1,2,1,0,2,1,0,0,0,2,1,2,0,0,2,1,0,1,0,0,3,1,2,0,2,2,0,3,2,0,0,0,0,1,0,1,1,2,0,5,0,1,0,3,2,1,0,1,2,3,1,0,1,0,1,0,0,0,1,0,0,0,0,1,0,1,2,1,0,0,0,1,2,2,1,2,0,0,1,1,1,0,1,1,3,0,2,1,0,1,0,0,0,0,0,0,0,1,0,0,0,2,1,0,0,3,2,0,0,3,2,0,0,5,0,0,0,2,1,1,0,0,1,0,1,2,1,1,0,1,0,0,1,0,1,3,1,1,1,0,2,1,1,1,2,1,3,1,1,1,0,2,0,0,1,1,1,2,2,0,3,1,2,0,0,1,2,1,2,0,3,0,1,1,0,0,0,2,3,1,0,0,1,2,1,1,0,2,3,0,4,2,2,0,2,0,6,3,2,1,1,0,1,1,2,3,1,1,2,1,0,0,1,0,2,1,2,0,2,2,1,1,0,0,1,0,1,2,0,1,2,1,1,1,0,3,0,3,3,0,1,0,1,0,1,1,3,0,3,2,0,0,2,0,2,1,2,1,1,1,0,0,1,0,0,3,3,0,0,0,2,0,0,1,1,1,1,1,1,0,2,0,0,1,1,1,2,3,1,0,2,0,0,1,0,2,0,1,1,3,0,0,0,2,0,2,1,0,2,1,0,0,1,1,0,1,0,1,0,1,1,0,2,2,1,2,1,0,0,0,1,1,0,0,0,1,0,0,2,0,2,0,2,3,2,1,1,2,1,1,0,1,1,1,1,1,3,2,2,1,2,0,0,0,0,1,1,0,1,0,0,0,3,3,1,1,2,1,0,0,2,1,4,3,1,2,1,0,1,1,1,0,1,0,0,2,2,0,1,0,1,2,2,0,1,1,0,2,0,1,1,1,1,2,1,0,2,2,0,2,0,1,2,0,1,2,0,1,1,1,0,2,1,0,0,1,2,1,1,0,1,0,1,1,1,1,2,1,0,2,2,0,0,0,0,1,1,0,1,0,2,1,0,3,2,1,2,0,1,1,1,3,1,2,1,1,0,0,0,2,1,3,1,0,1,1,1,2,1,1,0,0,2,0,1,1,0,1,0,1,1,2,2,2,2,0,1,0,1,1,1,0,1,0,0,1,1,0,0,0,2,1,0,1,1,1,2,1,0,2,2,0,2,1,1,0,0,1,2,1,2,0,0,1,1,0,0,1,0,0,2,1,1,0,2,0,1,0,1,2,1,0,2,0,3,1,1,0,1,1,1,1,2,1,0,1,0,1,0,3,0,0,1,2,1,1,1,2,2,0,1,1,0,2,1,1,2,1,0,2,2,0,1,1,0,1,0,2,4,1,2,1,2,2,0,0,1,2,1,3,1,2,1,0,0,0,1,1,0,1,1,1,2,2,1,3,0,1,1,0,0,1,0,0,1,1,1,0,1,1,1,0,1,0,1,2,1,0,0,0,0,0,1,0,1,1,1,1,3,1,1,1,0,1,0,3,2,2,0,0,2,0,0,0,0,0,1,0,6,0,2,0,0,3,2,1,2,1,2,0,1,3,1,2,3,0,1,3,1,2,2,2,1,2,3,3,0,0,1,0,1,0,1,0,1,0,0,0,0,3,1,0,2,0,2,0,2,0,1,0,0,2,1,2,0,1,1,2,2,0,1,2,1,2,0,0,0,0,1,2,0,1,0,1,1,1,2,2,0,3,0,1,2,1,2,1,1,2,0,0,0,0,2,2,1,1,1,2,0,1,1,1,2,1,0,1,1,2,0,1,0,1,0,2,0,0,1,1,0,1,1,0,0,0,2,1,2,0,1,1,2,1,2,1,1,1,0,1,2,0,0,2,0,2,4,1,0,0,0,0,2,2,2,1,1,2,0,1,0,1,1,2,2,0,3,1,1,1,2,1,0,0,0,2,2,1,0,0,0,2,0,1,0,3,0,0,2,1,0,0,0,0,0,1,0,0,1,1,0,2,1,1,1,0,2,2,0,2,1,5,0,4,0,0,3,1,1,2,1,2,0,0,0,0,0,1,0,0,1,1,2,1,1,1,0,2,0,3,0,1,1,3,3,0,1,3,0,0,1,1,1,1,0,1,1,2,0,0,1,0,0,2,1,0,0,0,0,2,1,0,1,2,1,1,1,1,0,4,1,2,1,1,1,1,1,1,0,0,2,0,2,1,0,0,2,0,1,2,4,0,2,0,2,0,1,0,0,3,1,1,0,0,2,2,3,0,1,1,0,1,1,1,3,1,2,1,0,0,2,2,0,1,1,2,1,1,1,2,3,0,2,3,1,0,1,3,1,0,1,2,1,0,0,1,0,0,0,2,1,1,2,1,3,1,0,0,2,2,1,0,0,0,2,1,0,0,1,0,2,3,1,0,1,0,1,0,0,1,0,1,2,3,1,1,2,1,2,1,2,3,0,0,2,0,0,1,0,0,0,5,1,0,1,1,0,1,1,1,1,0,0,0,1,3,1,0,1,1,1,1,2,1,0,0,1,1,2,3,1,2,1,1,0,1,1,1,1,1,0,0,0,1,2,1,0,0,1,1,0,1,1,3,0,3,1,5,1,1,2,1,0,2,0,1,0,2,1,0,3,1,1,1,5,1,2,0,2,1,1,2,0,2,1,2,0,1,2,0,1,0,0,2,0,1,1,0,0,1,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1,2,0,0,0,0,0,1,0,2,0,2,0,0,2,0,1,1,1,1,0,0,1,1,0,0,2,3,3,0,0,0,1,2,0,1,0,1,0,0,2,0,0,0,1,1,2,1,2,3,0,2,3,0,0,1,0,0,2,1,0,1,0,1,1,2,0,0,0,2,0,1,4,1,1,0,2,0,1,2,1,2,2,0,1,0,1,1,2,2,1,2,0,0,1,2,0,0,0,1,0,4,1,1,1,0,0,0,0,0,0,1,0,1,0,0,1,0,0,2,1,3,1,1,1,0,2,1,0,2,0,1,0,1,1,2,0,0,0,1,2,2,1,1,1,2,1,3,0,1,1,0,3,2,2,0,2,0,1,0,1,1,1,0,0,2,1,2,0,1,3,3,1,0,1,0,0,2,0,1,1,1,0,0,0,2,2,1,3,2,2,1,1,1,1,1,1,0,1,0,2,1,0,1,1,0,1,2,0,0,2,0,0,0,2,1,0,1,1,1,1,2,1,1,0,0,2,1,1,1,1,1,0,2,3,1,3,1,1,1,1,3,0,1,1,1,3,1,2,1,2,2,0,2,2,0,1,3,0,0,0,0,1,1,3,4,1,0,2,2,1,1,0,0,1,2,1,2,1,1,1,1,2,1,0,3,1,0,2,1,1,0,0,0,2,4,2,1,2,1,1,0,1,1,3,3,0,0,1,0,3,0,1,0,0,2,1,2,2,4,3,1,0,2,1,0,0,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,0,0,1,1,3,1,0,0,2,2,2,0,0,0,2,1,1,1,1,1,0,0,1,0,1,0,0,2,0,0,2,1,1,1,1,2,2,0,1,2,2,1,0,1,0,0,0,0,1,0,0,1,0,1,1,2,0,3,0,1,1,1,0,1,0,0,2,1,0,2,0,0,0,1,2,0,0,0,0,1,0,1,2,1,1,0,0,0,3,0,0,3,0,2,0,0,1,0,1,0,2,2,1,0,2,1,2,0,1,2,0,0,1,3,2,2,1,0,1,1,0,1,2,3,0,2,0,1,1,0,2,3,1,0,0,1,1,1,0,2,3,0,0,2,2,1,0,0,2,1,0,2,2,4,1,0,1,2,1,1,2,1,0,2,0,0,0,3,1,0,1,0,1,0,1,0,0,0,2,1,1,0,1,0,1,0,2,2,0,1,0,1,1,0,1,1,0,1,1,0,0,3,1,2,2,1,1,0,1,1,2,1,1,1,3,0,1,0,0,0,0,1,2,0,0,0,1,0,0,0,2,0,0,0,2,4,0,1,0,0,1,0,0,2,0,1,2,0,1,0,0,0,2,1,1,5,0,2,0,1,1,3,0,1,0,0,0,1,0,0,3,0,2,1,3,0,0,2,1,1,1,1,2,0,2,2,0,2,2,1,4,0,2,1,2,1,1,1,0,2,1,2,1,0,3,1,1,0,1,2,2,0,0,1,0,0,1,1,2,0,0,0,1,0,1,1,0,2,2,1,0,1,0,0,0,2,0,1,1,1,1,1,0,1,0,0,1,1,2,2,3,2,1,1,0,0,1,2,0,0,0,1,3,2,1,2,0,0,2,1,0,0,2,1,1,1,0,2,4,0,3,0,1,1,1,0,1,0,0,2,1,1,0,2,0,1,3,2,1,3,0,0,3,0,1,0,0,1,3,0,0,2,0,0,3]},{"counters":[0,2,3,1,1,0,0,2,1,1,1,2,3,1,1,0,0,2,0,1,1,1,1,0,0,0,1,2,1,3,1,0,1,0,0,1,0,2,1,2,0,1,2,0,0,1,0,4,2,0,1,1,0,1,1,0,1,2,1,1,1,1,1,1,1,0,1,2,3,0,0,0,0,0,2,1,2,0,1,1,0,1,0,1,1,3,2,3,0,1,1,1,0,4,0,0,3,1,0,2,0,0,2,2,0,2,0,2,1,2,0,1,1,0,1,1,3,3,1,0,2,3,2,0,0,1,4,3,0,1,0,0,1,0,3,2,0,0,1,3,1,1,0,1,0,0,2,1,1,1,2,0,2,0,2,1,1,1,2,1,4,0,1,1,0,1,2,1,1,1,1,2,2,0,1,0,0,0,0,0,3,0,0,0,1,0,3,2,0,2,2,0,2,2,3,2,1,0,1,2,0,0,0,1,0,0,0,0,1,1,2,1,0,1,1,0,0,1,0,1,0,2,0,0,0,0,0,1,3,0,0,3,0,3,1,0,1,2,1,0,0,1,0,0,2,1,0,2,1,2,0,0,0,0,1,1,1,1,0,0,2,0,1,0,1,1,0,1,0,0,0,1,0,0,1,0,1,2,1,0,0,0,1,0,3,1,1,0,0,1,1,2,3,1,1,2,1,2,3,5,0,0,0,1,0,3,0,0,1,1,0,0,1,0,1,2,2,2,0,4,0,0,2,0,1,0,0,4,0,0,2,0,1,1,1,0,0,0,0,1,3,0,1,2,0,0,2,0,1,0,1,0,2,1,0,1,1,1,1,1,0,0,2,0,2,1,2,1,1,0,0,0,1,1,1,4,1,0,0,1,1,3,3,1,0,1,2,2,1,2,0,1,0,1,1,1,1,0,1,1,1,3,0,0,1,1,2,1,0,2,2,2,0,1,0,3,4,0,3,1,2,1,1,1,1,0,0,0,0,1,2,2,2,2,1,0,0,1,1,0,3,0,0,0,0,1,2,0,1,0,0,0,1,0,1,3,0,0,1,0,2,3,1,1,1,1,1,0,2,1,0,0,1,3,2,1,2,0,2,1,0,1,1,3,0,1,0,0,1,1,0,2,2,2,0,0,1,1,3,0,2,2,1,1,0,2,2,4,1,2,0,0,0,0,1,1,0,2,3,0,1,1,2,0,2,0,0,1,1,1,0,1,3,2,0,1,0,0,0,0,0,0,0,0,1,1,1,2,2,1,0,1,3,2,0,0,2,3,0,3,2,0,0,0,2,0,1,4,0,3,1,0,3,0,1,0,0,2,2,0,0,1,0,0,1,0,0,0,3,2,3,0,2,0,1,1,0,2,0,0,0,1,1,1,0,0,0,0,2,0,1,0,2,1,0,2,2,1,0,2,0,1,1,1,1,0,1,0,1,2,1,0,0,0,0,3,2,1,1,1,2,1,0,0,2,0,1,0,0,2,0,3,0,2,0,0,0,3,4,0,0,2,0,0,1,2,1,3,3,0,2,2,1,2,1,1,2,0,1,0,0,2,0,0,2,1,1,1,1,0,0,3,1,0,0,3,2,0,1,0,0,0,0,1,1,0,1,3,0,0,1,0,0,0,1,2,0,0,0,2,2,0,1,1,1,1,1,0,1,2,1,3,0,1,0,1,0,0,0,1,2,1,1,2,4,0,3,2,1,0,2,0,0,1,0,1,3,1,0,1,1,0,1,0,2,0,0,1,1,0,2,0,0,1,1,1,0,0,1,2,2,1,0,3,1,1,1,1,0,1,1,3,4,0,2,1,0,1,0,1,0,1,1,1,1,3,0,1,1,0,1,3,0,1,2,2,0,3,1,0,1,0,1,2,0,2,0,2,0,1,2,0,1,0,3,2,2,2,0,2,0,1,2,1,2,0,0,4,2,2,0,0,2,1,0,1,0,0,0,0,1,1,1,1,1,1,0,2,1,1,2,1,0,1,1,1,0,0,1,1,0,1,2,2,0,3,0,0,0,3,2,2,3,0,0,1,0,0,0,0,0,1,0,2,2,2,0,0,1,2,0,0,0,2,1,0,1,1,0,3,1,2,3,2,0,2,2,1,1,0,1,1,2,0,1,1,0,1,1,1,0,0,1,0,0,0,2,1,3,1,1,2,0,2,0,0,3,2,1,2,0,0,0,3,2,0,1,2,2,1,1,1,1,2,0,1,0,1,1,2,1,0,5,1,1,0,0,2,3,1,2,1,3,2,1,3,0,1,1,0,2,0,3,2,4,0,0,0,1,2,2,0,0,1,0,1,3,2,2,2,0,0,3,2,0,1,0,0,0,2,0,1,0,0,2,0,2,1,2,4,0,0,2,2,2,2,1,0,1,1,1,0,1,1,1,3,0,1,0,1,1,0,0,1,1,1,2,0,1,1,1,1,2,0,1,1,0,0,2,2,3,1,0,0,1,0,1,0,1,1,0,1,1,2,0,0,0,1,1,0,3,0,1,0,1,2,1,1,2,1,0,0,2,2,2,0,0,1,2,4,1,1,0,2,1,0,3,1,0,0,1,0,2,0,1,1,1,2,0,1,1,2,0,1,1,1,1,2,1,1,0,3,0,1,0,1,2,1,1,0,1,1,1,0,0,2,1,2,1,1,1,0,0,0,0,0,1,1,1,1,3,0,2,0,1,0,0,1,0,0,1,1,0,2,1,1,0,3,1,4,2,4,1,0,0,0,2,2,3,1,1,0,2,2,1,0,0,1,1,2,1,0,1,0,1,3,1,0,2,1,0,1,1,1,1,0,1,0,0,2,0,0,1,0,1,0,0,2,1,0,1,2,1,2,1,0,2,0,0,0,2,2,1,1,1,0,1,0,0,4,0,1,2,0,0,0,0,1,1,2,3,0,1,1,3,0,2,1,1,0,1,1,1,0,0,1,2,0,0,1,1,3,2,0,1,1,1,3,1,0,2,0,1,2,0,1,1,1,0,0,1,0,0,2,1,0,1,1,0,1,0,1,1,1,1,1,2,1,0,0,0,4,1,1,1,0,1,3,1,2,2,4,0,1,0,0,1,0,1,1,0,1,2,2,3,3,1,1,1,2,0,0,0,1,2,0,1,2,0,1,0,1,1,1,1,3,1,1,2,0,0,1,0,0,3,2,1,3,1,0,1,1,0,0,2,2,1,1,0,2,2,1,1,2,0,4,1,2,1,0,0,1,1,5,0,0,0,3,3,2,1,1,3,1,1,1,1,2,2,1,2,0,2,1,1,1,1,0,1,2,0,1,0,3,1,0,2,1,1,2,0,0,1,0,1,2,0,0,1,0,1,0,0,0,1,2,1,1,1,0,0,0,0,0,2,1,2,0,2,1,2,1,2,1,1,1,0,0,0,3,0,1,0,0,0,0,1,1,0,0,2,0,1,0,0,1,1,2,0,1,0,2,0,0,0,1,0,0,0,0,1,2,0,0,2,1,3,1,0,0,0,0,1,0,1,2,1,0,0,2,0,2,1,1,2,0,1,1,0,3,0,0,1,2,0,3,3,1,1,2,1,0,1,1,1,1,2,1,4,1,1,0,1,0,1,0,0,2,3,1,1,0,1,0,0,1,0,0,1,0,1,2,0,1,0,1,2,1,1,2,2,1,0,0,0,0,0,1,1,0,1,2,1,0,1,1,3,1,0,2,1,0,3,1,1,0,0,0,1,0,1,0,1,2,0,1,1,0,0,0,3,0,1,1,4,0,1,3,1,1,0,0,2,0,0,2,2,2,2,2,1,0,0,2,1,1,1,4,0,2,1,1,0,2,0,2,1,0,0,2,2,0,2,1,0,2,2,0,1,0,1,2,0,1,2,2,1,2,3,2,1,1,1,2,1,1,1,2,1,0,0,0,2,0,1,0,0,0,0,2,3,1,0,2,1,0,1,1,0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,2,0,2,3,3,1,2,0,1,1,1,1,2,1,2,1,0,0,2,1,1,1,1,1,2,0,2,0,0,1,1,2,2,1,0,2,1,1,0,0,0,0,2,1,2,0,0,2,1,1,3,1,0,2,1,2,1,1,1,2,1,1,2,2,1,0,1,0,1,2,0,0,0,3,3,1,2,0,0,2,1,2,1,2,0,1,2,5,1,1,0,2,2,0,0,1,1,0,0,2,0,0,1,1,1,1,1,1,2,1,0,0,1,1,2,2,0,2,2,1,1,0,1,2,2,2,1,0,0,0,1,1,1,1,1,2,0,1,2,1,1,2,0,1,1,0,1,2,2,2,1,0,1,0,2,1,4,1,0,0,2,2,0,1,1,0,1,0,0,1,1,3,1,0,1,0,2,0,1,2,2,3,2,1,1,1,1,1,1,0,0,0,0,0,1,2,0,0,2,0,1,0,1,0,2,0,1,0,1,5,0,0,1,1,2,0,0,2,1,1,0,0,2,0,3,1,1,0,1,1,0,0,1,0,0,1,0,0,0,1,1,2,0,0,2,0,2,1,2,0,0,0,2,1,2,1,0,1,0,0,1,2,0,2,1,0,2,0,1,1,1,0,0,0,0,3,0,0,0,0,3,1,0,1,1,1,1,3,0,0,0,1,0,0,3]},{"counters":[0,2,0,1,0,1,1,0,0,4,1,1,0,0,1,2,1,1,2,0,2,2,0,1,0,2,0,1,1,2,1,2,0,2,1,2,0,2,2,2,1,1,0,1,1,1,1,1,0,4,0,0,1,0,1,1,1,2,1,1,1,0,1,1,0,1,1,1,1,1,3,1,3,1,3,0,1,1,0,1,0,0,0,3,1,0,2,0,0,0,1,0,1,1,3,3,2,1,1,1,1,2,2,1,1,2,3,1,3,1,4,0,2,0,1,1,1,1,1,0,2,0,0,1,0,1,2,1,1,1,2,0,0,0,3,1,0,1,0,3,0,0,1,0,1,0,0,1,1,1,5,1,1,1,0,0,2,1,0,1,0,2,2,1,0,1,1,1,2,2,0,0,1,0,5,1,1,0,2,1,2,0,0,0,1,1,0,4,0,1,1,0,0,0,0,1,0,2,0,1,1,1,0,0,2,1,3,2,0,1,2,0,0,2,1,1,1,1,1,1,2,0,3,0,0,1,0,1,0,1,2,1,0,0,0,1,0,0,1,0,0,2,0,2,0,2,0,0,1,1,0,0,2,2,2,0,0,0,0,1,0,0,0,0,1,0,3,4,1,0,0,1,0,0,6,4,1,0,0,1,0,0,0,2,1,1,1,1,1,2,0,2,1,0,0,0,1,0,1,0,0,1,0,2,2,1,0,0,0,0,1,1,0,0,1,0,0,1,0,1,0,3,1,1,0,2,1,1,1,1,1,0,1,1,2,2,0,1,1,1,1,0,2,0,3,2,1,1,0,1,0,1,0,2,1,4,0,2,3,0,0,0,3,2,1,1,0,1,0,1,1,0,1,0,0,1,0,1,3,0,3,2,0,1,1,2,0,2,2,0,4,0,1,0,2,0,1,2,0,2,3,0,1,0,0,0,1,2,2,1,1,3,1,1,0,1,0,0,1,2,1,2,1,0,0,1,0,0,2,0,1,0,1,0,1,0,0,0,2,1,1,2,0,2,0,0,1,0,0,2,0,1,3,1,0,0,1,0,0,1,1,2,0,2,0,1,0,0,0,2,1,4,0,0,0,3,3,0,0,1,2,1,0,2,1,0,0,0,1,0,1,0,2,0,1,2,1,2,1,2,0,0,1,1,0,2,2,0,0,1,1,0,0,1,2,0,2,0,1,1,2,1,2,1,0,0,2,1,2,2,0,0,2,2,1,0,1,0,1,1,2,1,0,1,2,1,1,2,1,1,2,0,4,2,0,1,0,0,2,1,2,1,1,1,1,0,0,0,0,3,0,1,0,2,2,0,2,0,1,0,2,0,1,1,0,0,0,1,2,5,2,0,0,1,0,3,2,2,0,0,0,0,0,1,1,0,2,0,0,3,0,1,1,0,0,0,1,2,2,2,1,4,0,0,1,0,0,2,0,0,2,0,1,0,1,3,0,1,1,2,1,0,1,1,3,0,0,2,2,2,2,3,1,0,1,0,0,1,0,0,0,3,2,0,2,1,1,4,1,3,0,2,1,3,0,0,2,0,1,1,0,3,0,0,0,0,2,0,0,0,3,1,0,0,0,1,0,1,1,0,2,1,0,2,2,1,2,1,1,2,1,1,2,3,0,0,2,0,2,1,1,2,0,0,0,1,1,0,0,2,1,0,1,1,2,0,0,1,2,0,1,1,1,2,1,0,0,1,1,2,1,0,4,0,1,1,0,0,2,0,1,1,1,0,1,1,1,0,1,0,2,1,3,3,1,1,1,1,1,0,2,0,0,1,2,2,1,0,1,1,1,1,1,1,1,2,1,1,3,2,1,1,1,1,1,2,1,1,1,0,1,0,0,2,0,0,3,2,0,2,0,2,2,1,2,4,1,2,2,2,1,2,1,1,3,0,0,1,3,0,1,1,0,0,1,2,0,1,0,0,0,0,0,0,2,0,2,1,2,1,0,0,1,1,0,2,1,1,0,0,0,0,0,0,1,3,1,1,1,0,1,0,0,0,3,1,0,1,0,2,0,0,2,1,1,2,0,0,2,2,0,0,0,0,1,0,0,1,2,0,1,1,0,0,2,1,2,0,0,0,2,1,0,1,1,2,1,0,1,1,2,0,1,1,0,1,2,3,1,1,1,1,1,1,2,0,0,1,1,0,2,2,1,3,1,2,1,0,1,2,1,1,1,3,1,0,2,1,1,0,3,2,2,1,0,0,1,1,0,1,0,0,0,2,0,0,1,1,1,0,0,0,2,1,0,1,0,1,2,2,0,1,1,2,1,1,1,0,1,1,0,1,1,2,1,0,0,2,1,0,0,1,1,1,2,1,1,1,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,2,1,0,0,1,0,2,1,0,0,2,2,0,1,0,2,0,1,0,3,1,2,1,0,1,1,1,1,1,2,2,1,1,0,2,4,0,1,1,0,2,2,1,0,0,1,1,1,1,2,0,3,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,0,0,0,0,2,0,1,0,0,2,1,0,1,0,3,2,2,2,0,1,0,3,2,0,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,1,1,2,1,1,1,0,0,0,1,1,0,0,0,1,2,2,1,0,0,0,0,2,3,0,0,0,2,1,2,1,2,1,2,1,1,0,0,3,2,4,0,2,1,3,1,4,0,0,2,1,1,1,1,1,0,1,0,3,1,0,0,1,2,0,1,2,1,0,1,1,0,0,1,1,0,0,3,2,0,1,1,0,1,1,1,1,0,2,2,0,0,1,1,1,1,1,1,0,0,0,1,0,1,0,1,2,1,1,0,1,0,0,0,3,0,0,0,0,0,2,0,1,0,1,0,1,0,0,0,0,0,0,1,2,0,1,1,0,0,3,2,0,0,2,1,1,0,0,2,3,2,5,0,1,0,0,0,0,1,0,1,1,1,0,1,0,1,1,1,0,3,1,0,1,1,1,0,1,1,0,1,1,0,1,0,2,1,3,2,3,0,2,1,2,3,0,0,0,1,4,1,0,0,1,2,0,2,2,2,2,0,0,0,0,1,0,1,2,2,2,1,2,2,2,3,2,1,2,0,0,3,3,0,1,1,0,2,2,2,0,0,0,1,2,1,3,0,2,3,3,1,0,1,1,1,0,3,0,0,2,3,2,0,5,1,1,2,1,0,1,1,1,0,2,0,3,2,1,0,1,1,2,1,2,1,1,2,0,0,3,0,0,0,0,0,3,0,1,1,0,1,1,0,1,1,0,3,1,2,0,1,1,1,2,1,1,0,1,1,0,0,1,0,1,1,1,0,0,0,0,1,2,2,0,0,0,0,0,1,0,1,2,0,0,1,0,0,4,1,1,2,3,1,3,3,1,2,1,1,1,1,0,2,2,1,3,3,0,0,2,2,1,0,0,1,0,1,0,1,1,2,0,3,2,1,2,3,3,1,3,1,1,0,1,0,1,1,1,0,3,1,2,0,3,2,0,0,2,1,0,0,1,1,2,2,1,1,0,2,1,1,0,3,2,3,0,1,1,1,0,0,3,3,0,3,2,0,1,1,1,0,0,2,1,0,3,0,2,0,0,0,1,1,0,1,1,1,1,2,0,4,0,0,1,0,0,3,1,0,1,0,1,1,0,1,2,0,0,2,3,1,2,0,1,2,2,0,1,2,1,0,1,2,1,1,1,1,3,2,2,1,0,0,0,1,0,0,0,4,1,1,1,2,1,0,2,1,0,2,2,1,1,0,1,1,0,0,2,0,2,0,0,2,2,1,0,3,0,0,1,0,0,0,0,1,2,1,3,0,2,1,1,0,1,1,0,2,0,0,1,1,0,0,2,1,4,1,1,0,1,0,0,0,1,1,1,1,2,1,0,0,0,0,0,3,0,0,1,1,2,3,1,3,0,1,0,1,1,1,0,2,1,2,2,0,1,1,3,0,1,2,0,2,0,0,1,1,1,3,0,0,1,0,0,4,0,1,1,2,1,3,2,1,1,2,0,1,1,0,1,3,0,2,1,0,0,1,1,0,0,0,0,0,0,0,0,3,1,1,1,0,1,1,0,0,2,1,2,2,3,2,1,1,1,0,2,2,1,1,2,2,0,0,1,2,2,0,2,2,1,2,1,3,2,1,0,2,0,1,2,0,3,0,1,3,2,0,0,3,1,0,1,0,1,1,0,1,2,1,0,3,2,1,2,2,0,1,0,1,1,0,1,2,0,0,0,4,1,0,1,0,0,0,1,1,1,0,0,1,0,1,2,0,1,1,2,2,0,1,1,1,1,2,2,1,0,3,1,1,1,0,0,3,1,0,3,1,1,0,3,1,0,1,0,0,1,0,1,2,1,1,0,2,0,1,1,0,0,0,0,1,0,1,1,0,3,1,1,0,0,1,2,2,0,0,0,0,1,0,0,0,2,0,2,0,0,0,0,3,2,2,0,1,1,2,1,1,0,0,0,2,0,1,0,2,1,1,0,2,1,1,0,2,0,5,2,0,1,0,1,1,0,1,1,3,1,1,0,1,2,0,1,2,2,3,0,1,1,2,2,5,0,2,0,0,0,1,2,1,1,1,2,3,1,0,2,0,3]},{"counters":[1,0,1,0,0,0,2,5,1,0,1,0,2,1,4,1,1,1,1,1,2,0,1,2,1,2,0,2,1,1,0,1,0,1,1,2,0,0,1,1,0,1,0,0,1,0,1,0,2,2,0,0,1,1,3,0,4,2,2,1,1,0,0,0,1,0,0,1,0,2,1,1,1,0,0,1,3,0,1,1,3,0,0,1,0,3,1,2,2,1,1,2,0,0,1,0,0,1,2,2,2,0,1,3,1,0,0,2,0,0,1,1,1,1,2,1,2,6,2,0,1,1,1,3,0,1,1,1,0,1,1,0,1,1,1,0,2,0,0,1,0,0,1,0,1,2,2,0,1,2,3,0,0,3,0,0,2,1,2,2,0,1,2,0,0,1,0,0,1,0,0,0,3,0,1,0,0,0,2,0,0,2,1,1,1,0,1,1,2,1,0,0,0,1,1,3,1,2,1,0,0,0,4,2,2,1,0,1,3,2,0,1,2,1,2,1,2,1,0,0,1,1,1,0,0,2,1,0,0,1,2,0,0,0,0,1,1,3,1,2,1,0,1,0,0,0,0,1,1,2,2,0,1,1,0,1,2,1,0,0,2,0,3,3,3,1,1,0,0,1,1,1,1,0,0,1,0,1,0,3,3,3,2,1,0,1,0,1,1,0,0,0,3,2,0,1,2,2,0,0,1,2,3,1,2,0,0,2,1,1,0,2,1,0,0,2,0,0,0,3,2,1,1,0,2,2,0,1,2,2,1,0,2,1,1,1,1,2,0,0,0,1,1,0,1,1,1,3,2,1,0,0,0,0,1,1,2,3,0,0,2,1,2,4,1,1,1,1,6,0,1,1,0,1,1,0,2,0,0,1,1,1,0,2,1,0,1,1,1,0,4,1,0,2,0,0,1,1,0,1,0,0,0,0,0,1,1,0,0,0,0,2,1,0,1,0,0,0,0,2,3,3,2,1,2,0,0,0,1,2,0,0,2,0,2,2,1,3,2,0,0,1,0,2,0,1,1,2,1,1,2,0,1,1,3,2,0,1,1,0,0,3,1,2,0,0,0,3,1,2,1,0,2,1,1,0,1,1,3,0,0,1,2,0,0,0,1,4,1,1,1,0,0,2,2,1,2,0,0,2,1,1,1,1,0,0,2,2,1,0,0,0,1,0,0,1,0,0,0,1,0,2,1,1,1,0,0,0,3,1,1,1,1,2,1,2,2,2,0,1,0,1,1,0,0,0,1,0,1,1,2,0,2,0,2,0,0,1,0,1,0,1,0,1,0,3,1,3,2,1,3,1,1,1,0,1,2,2,3,2,3,0,0,1,0,1,1,3,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,2,0,0,0,0,2,0,0,0,1,2,2,2,0,1,2,0,1,2,2,2,1,0,2,0,3,0,1,0,0,0,1,1,2,0,2,0,1,0,1,1,2,1,0,2,4,3,1,1,2,0,2,3,0,0,5,2,0,0,3,0,0,2,1,0,0,2,0,3,0,1,0,4,1,0,2,0,0,0,1,2,0,2,1,0,0,1,0,1,2,1,3,0,1,1,1,0,1,2,1,0,0,1,0,0,1,1,3,2,0,0,0,3,1,1,2,1,1,1,2,1,1,2,2,0,3,0,2,1,1,3,1,2,0,0,1,2,0,2,2,0,0,0,2,0,1,1,1,1,1,0,2,1,3,1,0,0,3,0,1,2,1,2,1,0,0,1,1,1,2,4,1,0,2,0,0,1,0,1,2,0,1,1,1,0,1,1,0,3,0,0,0,0,2,1,2,1,1,1,1,0,0,2,0,0,1,2,1,0,1,1,1,0,1,1,3,0,0,1,0,0,0,2,1,0,1,0,1,0,1,2,1,2,0,0,1,1,0,0,0,0,0,0,2,1,0,2,1,0,0,2,1,1,0,0,0,0,4,0,3,1,1,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,1,0,0,0,1,0,1,0,1,2,1,2,2,3,2,2,2,3,0,0,0,0,0,2,0,1,0,1,0,2,1,1,1,1,0,0,1,1,2,1,2,3,2,0,2,0,0,0,1,1,3,1,2,0,3,0,0,1,1,2,3,0,0,0,1,0,1,2,0,0,1,1,0,1,2,1,1,0,1,0,0,0,0,0,1,1,0,1,2,0,4,1,0,0,3,3,1,1,1,1,2,2,1,0,0,0,3,1,0,0,1,1,2,0,2,2,4,1,1,1,0,1,0,1,1,1,0,0,0,0,1,2,1,1,0,2,1,3,0,3,1,1,0,0,2,0,0,1,1,1,0,0,1,2,3,1,1,2,1,2,0,1,0,1,0,0,0,4,1,0,0,0,1,1,1,0,1,0,0,1,3,2,1,2,0,0,2,3,1,3,0,0,1,1,1,1,0,0,1,1,3,1,4,0,1,3,0,1,3,3,1,1,1,0,0,1,1,1,2,1,2,0,1,0,0,2,4,2,2,0,0,1,3,0,1,1,0,2,1,2,0,1,1,2,0,1,1,0,0,1,1,0,0,2,0,0,1,0,1,1,0,2,2,0,1,0,1,0,1,2,2,1,1,0,1,2,2,2,1,0,0,1,1,1,1,0,1,0,2,1,0,1,0,1,1,1,1,2,0,1,2,2,0,1,2,0,1,0,0,0,0,0,2,0,3,0,1,0,2,0,1,2,1,1,2,1,1,1,1,2,0,1,1,1,0,1,1,0,0,1,1,1,1,3,3,2,1,2,2,2,0,3,1,0,1,2,1,1,0,0,0,1,0,2,1,3,0,1,1,0,1,0,1,1,1,0,0,0,2,0,1,0,0,0,2,1,2,0,0,1,0,1,0,0,2,0,3,0,0,1,0,0,0,1,0,1,1,0,1,3,3,2,1,1,1,0,0,2,4,1,2,0,2,2,1,1,2,2,1,2,0,0,2,1,0,2,1,2,0,1,1,1,0,1,2,1,1,1,2,1,1,4,1,0,2,1,1,1,1,3,1,1,0,0,0,0,1,1,1,2,0,1,2,1,3,0,1,0,0,3,1,3,2,1,0,0,0,2,0,1,1,1,0,0,2,1,0,1,1,0,1,0,3,0,0,1,3,2,0,0,1,1,1,0,2,3,0,0,3,0,0,2,1,1,0,2,1,0,2,0,0,3,0,0,0,3,1,4,0,1,0,0,0,1,2,2,0,0,2,0,1,2,1,0,1,0,4,1,1,1,1,0,0,1,0,0,0,0,0,1,2,3,0,1,0,0,1,3,3,0,2,0,2,0,0,1,1,1,2,0,0,2,0,0,0,0,0,2,2,0,0,1,1,0,2,0,0,2,1,0,0,0,1,1,1,2,0,1,1,1,2,1,0,2,3,3,0,0,2,0,0,1,2,0,1,1,0,0,1,4,2,0,0,1,1,0,3,1,0,3,3,0,1,2,2,0,0,4,1,3,0,1,2,0,0,3,0,1,1,3,0,0,0,0,0,1,3,1,0,1,2,0,2,2,2,1,1,0,2,1,2,2,3,0,2,0,1,0,0,0,0,0,1,1,1,1,1,1,0,2,1,0,1,0,1,1,2,1,0,2,0,2,2,3,1,1,4,0,2,1,0,1,2,3,0,0,1,1,1,3,0,0,1,1,1,0,0,0,1,1,1,0,2,1,1,3,0,5,1,2,1,3,1,1,0,2,1,1,1,3,0,1,0,0,1,1,0,2,3,2,3,0,0,1,0,1,1,0,0,1,1,1,0,0,0,1,3,2,0,0,0,2,0,0,1,2,1,2,2,0,2,4,0,1,0,1,0,2,1,3,0,0,2,1,0,2,2,0,2,3,0,0,1,0,1,0,1,1,0,3,1,0,1,0,2,1,1,1,0,2,2,1,0,0,1,2,1,1,1,0,0,2,0,0,0,0,1,1,0,1,1,1,0,1,3,2,0,2,1,0,0,1,1,3,2,0,3,2,0,1,1,1,1,1,3,1,0,1,2,0,0,0,0,1,1,0,0,0,1,1,0,0,1,0,0,2,1,1,1,2,0,1,2,1,1,2,0,0,0,1,1,1,1,0,1,2,0,2,2,0,1,0,0,1,1,0,1,1,0,0,1,2,0,1,1,1,1,0,1,3,2,2,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,2,0,1,2,0,1,1,0,3,0,0,1,0,0,1,1,2,1,5,1,0,0,1,0,2,1,1,0,2,0,1,0,0,2,1,1,0,2,1,0,4,0,1,3,2,2,1,0,1,0,1,1,1,1,0,0,1,2,1,0,1,0,0,3,0,0,1,1,1,0,0,0,0,2,1,0,1,2,0,1,0,2,2,2,0,0,2,2,1,1,1,1,0,3,1,1,1,1,0,1,1,0,3,2,0,1,2,0,0,2,0,0,0,0,1,1,1,2,2,2,2,1,2,0,0,2,3,1,2,1,1,0,0,2,1,3,2,1,0,3,1,0,3,1,1,1,0,4,2,2,1,2,1,1,3,0,3,0,1,1,3,0,2,0,1,3,3,3,0,0,2,0,1,1,1,1,0,1,1,4,2,0,0,1,3,0,0]}]},"null_count":0,"last_update_version":397952040827092992},"bex":{"histogram":{"ndv":2,"buckets":[{"count":978,"lower_bound":"MA==","upper_bound":"MA==","repeats":978},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1022}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,993,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952040623407104},"bs":{"histogram":{"ndv":2,"buckets":[{"count":1006,"lower_bound":"MA==","upper_bound":"MA==","repeats":1006},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":994}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952040615542784},"bu":{"histogram":{"ndv":2,"buckets":[{"count":1024,"lower_bound":"MA==","upper_bound":"MA==","repeats":1024},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":976}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952040629960704},"am":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MjY3Mi4yMw==","upper_bound":"NDM2MjY0LjI1","repeats":1},{"count":16,"lower_bound":"NTM2MDUzLjM5","upper_bound":"ODU3MDgwLjYy","repeats":1},{"count":24,"lower_bound":"OTI4MzEzLjg2","upper_bound":"MTA1OTk4OC44MA==","repeats":1},{"count":32,"lower_bound":"MTEyMjAzNS4zNQ==","upper_bound":"MTM0NjkwOC4zNg==","repeats":1},{"count":40,"lower_bound":"MTUwMzg2MS4wMg==","upper_bound":"MTU0NTMwMi44Nw==","repeats":1},{"count":48,"lower_bound":"MTg1MjAyNi4zMA==","upper_bound":"MjAzNTE2NC4yNw==","repeats":1},{"count":56,"lower_bound":"MjE1ODE4Ny4zOQ==","upper_bound":"MjM2NDAzNy4xMQ==","repeats":1},{"count":64,"lower_bound":"MjUzNjkzMi44Mg==","upper_bound":"MjgyNDU4OS4wNw==","repeats":1},{"count":72,"lower_bound":"Mjk3MjE2NS4xMw==","upper_bound":"MzI0MTQ5MC43OA==","repeats":1},{"count":80,"lower_bound":"MzMyNzQ3MS45NA==","upper_bound":"MzY0OTQyNC45OA==","repeats":1},{"count":88,"lower_bound":"MzgyOTA0Ni41NQ==","upper_bound":"NDAxMDMyNS4zOA==","repeats":1},{"count":96,"lower_bound":"NDA1NjE2OS4wNA==","upper_bound":"NDI3Mjc2NS43OQ==","repeats":1},{"count":104,"lower_bound":"NDMzODE1Mi44NQ==","upper_bound":"NDQ4OTA4Ni4zMw==","repeats":1},{"count":112,"lower_bound":"NDUzNDE5Mi44Ng==","upper_bound":"NDk0Mjg5NC4wMA==","repeats":1},{"count":120,"lower_bound":"NDk0NTI2OC41Ng==","upper_bound":"NTAxMzkzNS4wOQ==","repeats":1},{"count":128,"lower_bound":"NTAyODAxMC44Nw==","upper_bound":"NTM5ODQ5NS44NQ==","repeats":1},{"count":136,"lower_bound":"NjAwNTA1MS4wNQ==","upper_bound":"NjI5MzU5My4yNw==","repeats":1},{"count":144,"lower_bound":"NjMzMDI1NS4xMw==","upper_bound":"NjU1NTIxMC40MA==","repeats":1},{"count":152,"lower_bound":"Njc4OTE1OS45Mg==","upper_bound":"NzA5MzA5Ny41Mw==","repeats":1},{"count":160,"lower_bound":"NzIzMzcyMC45MA==","upper_bound":"NzM0OTU4MS42OA==","repeats":1},{"count":168,"lower_bound":"NzM4NTA3Ny4wNw==","upper_bound":"NzQzNTc2Ny40OQ==","repeats":1},{"count":176,"lower_bound":"NzU0MzQ4NS4wNA==","upper_bound":"NzczNzY3OC45Mw==","repeats":1},{"count":184,"lower_bound":"Nzc2NzQ1Ny44MQ==","upper_bound":"ODE1MDg4MS4xMw==","repeats":1},{"count":192,"lower_bound":"ODE3NTIyMS4xMQ==","upper_bound":"ODQwNjEyMS4wMw==","repeats":1},{"count":200,"lower_bound":"ODQ4MTQ1NS45Mw==","upper_bound":"ODU1OTIxNy42MA==","repeats":1},{"count":208,"lower_bound":"ODU2MDQxNi44Mg==","upper_bound":"ODg3MzA5My4wMQ==","repeats":1},{"count":216,"lower_bound":"ODk3NDg4My45Ng==","upper_bound":"OTE4OTY4NC41MA==","repeats":1},{"count":224,"lower_bound":"OTY0OTg3Ni4zOA==","upper_bound":"MTA1MDE2MTQuNjk=","repeats":1},{"count":232,"lower_bound":"MTA1MTE1NTEuNTk=","upper_bound":"MTA4MjA4NDIuMjA=","repeats":1},{"count":240,"lower_bound":"MTEwMzM4ODMuNDU=","upper_bound":"MTEzMTQ1MzUuODI=","repeats":1},{"count":248,"lower_bound":"MTE0NTQ3NzguNjU=","upper_bound":"MTE2MDM1MTQuMTI=","repeats":1},{"count":256,"lower_bound":"MTE2MTY0MTEuMTM=","upper_bound":"MTE4MjI5ODkuOTc=","repeats":1},{"count":264,"lower_bound":"MTE4NDcxODIuNTQ=","upper_bound":"MTE5ODQ3MTguNzU=","repeats":1},{"count":272,"lower_bound":"MTIwNjIzODMuMzU=","upper_bound":"MTI2NjE5NTAuMzc=","repeats":1},{"count":280,"lower_bound":"MTI3Nzc0MzYuMDc=","upper_bound":"MTI5MzQzODAuNjk=","repeats":1},{"count":288,"lower_bound":"MTMwMzE3NTQuNDg=","upper_bound":"MTMyODEwMzcuNjA=","repeats":1},{"count":296,"lower_bound":"MTMzMDE2NzYuMTM=","upper_bound":"MTM0NTg3MDAuMzE=","repeats":1},{"count":304,"lower_bound":"MTM2MzkzMDMuNzE=","upper_bound":"MTM3OTUwNDkuODY=","repeats":1},{"count":312,"lower_bound":"MTM4NDg3NzMuODE=","upper_bound":"MTQzOTYyNzUuMjI=","repeats":1},{"count":320,"lower_bound":"MTQ1NzU4NDYuMjA=","upper_bound":"MTQ3Mzc3MjguMjg=","repeats":1},{"count":328,"lower_bound":"MTQ3NjIxMzkuODU=","upper_bound":"MTUxNzMzNTUuOTY=","repeats":1},{"count":336,"lower_bound":"MTUzNTg4ODkuNjA=","upper_bound":"MTYwMDY2NjYuNjc=","repeats":1},{"count":344,"lower_bound":"MTYwMzU0NDYuODU=","upper_bound":"MTY1NDE2OTkuNjk=","repeats":1},{"count":352,"lower_bound":"MTY1NDI5MjMuNjM=","upper_bound":"MTY5MzA0NDIuMTg=","repeats":1},{"count":360,"lower_bound":"MTY5MzM3NDguNDU=","upper_bound":"MTcyMDQxNDguMzE=","repeats":1},{"count":368,"lower_bound":"MTcyNDExNzguOTQ=","upper_bound":"MTczMDI4NjcuODM=","repeats":1},{"count":376,"lower_bound":"MTc0NjgxNDkuNTg=","upper_bound":"MTc4NjI4NjcuNDY=","repeats":1},{"count":384,"lower_bound":"MTc4ODg4MTEuNjg=","upper_bound":"MTg0NzAyMjkuMDA=","repeats":1},{"count":392,"lower_bound":"MTg1MDg2MDAuMTI=","upper_bound":"MTg2NTY1ODIuMDQ=","repeats":1},{"count":400,"lower_bound":"MTg2NjM5MzMuNjE=","upper_bound":"MTg4MjI4NjcuOTU=","repeats":1},{"count":408,"lower_bound":"MTg4MzAzMjkuMTI=","upper_bound":"MTkxOTk5NjYuMDY=","repeats":1},{"count":416,"lower_bound":"MTkyMjQ5MDkuNDY=","upper_bound":"MTk3MDc5NzYuNTY=","repeats":1},{"count":424,"lower_bound":"MTk3MjU0MDkuMTk=","upper_bound":"MTk4NDI5MzkuMzk=","repeats":1},{"count":432,"lower_bound":"MjAwMzAxOTIuMDM=","upper_bound":"MjA1MDIwOTcuNDc=","repeats":1},{"count":440,"lower_bound":"MjEwMTExNTcuMDg=","upper_bound":"MjEyMTA2ODcuNTM=","repeats":1},{"count":448,"lower_bound":"MjEyMTIxOTguODc=","upper_bound":"MjEzNzE0MDQuNTc=","repeats":1},{"count":456,"lower_bound":"MjEzODE5NTMuNDI=","upper_bound":"MjIwMTMwNjkuMjY=","repeats":1},{"count":464,"lower_bound":"MjIwMzIxNjUuMzE=","upper_bound":"MjIzNjgwMTEuNTI=","repeats":1},{"count":472,"lower_bound":"MjI0Mzk3NTYuNjY=","upper_bound":"MjMxNDUyNzkuOTc=","repeats":1},{"count":480,"lower_bound":"MjMxNDcyMDEuNTY=","upper_bound":"MjM0MDUzMTIuNzU=","repeats":1},{"count":488,"lower_bound":"MjM0MzYxMTAuNzg=","upper_bound":"MjM3ODk0NTcuOTI=","repeats":1},{"count":496,"lower_bound":"MjM4NTIyNzAuNDk=","upper_bound":"MjQwMTE1NDEuNzY=","repeats":1},{"count":504,"lower_bound":"MjQxMjg2NzkuMDk=","upper_bound":"MjQ0NDg3ODQuNDk=","repeats":1},{"count":512,"lower_bound":"MjQ0NzA5NjMuNTM=","upper_bound":"MjQ3NzQwNzMuMzA=","repeats":1},{"count":520,"lower_bound":"MjQ4ODIwNzkuNzg=","upper_bound":"MjQ5Mjc2NTEuMjQ=","repeats":1},{"count":528,"lower_bound":"MjUwMzY3MjQuODU=","upper_bound":"MjU0MzY4OTMuMzc=","repeats":1},{"count":536,"lower_bound":"MjU0NjAzMzAuNDI=","upper_bound":"MjU2MjY4OTIuNzg=","repeats":1},{"count":544,"lower_bound":"MjU3ODEyMzIuMTE=","upper_bound":"MjYyMjU2NDguMzE=","repeats":1},{"count":552,"lower_bound":"MjYyODcyODMuNDk=","upper_bound":"MjY2NDYwOTAuNzc=","repeats":1},{"count":560,"lower_bound":"MjY4MzUyOTIuODM=","upper_bound":"MjcxOTA1ODIuNTQ=","repeats":1},{"count":568,"lower_bound":"MjcyNTM3OTcuNzk=","upper_bound":"Mjc0Njk5OTMuNDQ=","repeats":1},{"count":576,"lower_bound":"Mjc1MDM4ODAuOTM=","upper_bound":"Mjc5NTc3MDMuMzM=","repeats":1},{"count":584,"lower_bound":"MjgwNTA0MTguODI=","upper_bound":"Mjg1MDA3NTguNTQ=","repeats":1},{"count":592,"lower_bound":"Mjg1NDY2NjEuNzU=","upper_bound":"MjkxMDkxMzIuNzg=","repeats":1},{"count":600,"lower_bound":"MjkxMTk0OTcuODA=","upper_bound":"MjkyODcwMDAuNDg=","repeats":1},{"count":608,"lower_bound":"MjkzNDQ0ODEuNzA=","upper_bound":"Mjk3OTk3NDkuNDA=","repeats":1},{"count":616,"lower_bound":"Mjk4MTY3NjkuODQ=","upper_bound":"Mjk5MDc2MTYuNDc=","repeats":1},{"count":624,"lower_bound":"Mjk5MjE0MzEuNTY=","upper_bound":"MzAzNDk4MjkuNzM=","repeats":1},{"count":632,"lower_bound":"MzAzNTQxNDkuNDk=","upper_bound":"MzA3MDE2NzAuNDA=","repeats":1},{"count":640,"lower_bound":"MzA4MDQxODguMzM=","upper_bound":"MzExNzE1NzguNjA=","repeats":1},{"count":648,"lower_bound":"MzExOTQzNzIuOTI=","upper_bound":"MzE1MzQ5NTguNjc=","repeats":1},{"count":656,"lower_bound":"MzE2MjU1OTYuMDE=","upper_bound":"MzE4MDk0NjQuMzI=","repeats":1},{"count":664,"lower_bound":"MzE4NzMyNTAuODI=","upper_bound":"MzI0MjU3NDAuMzQ=","repeats":1},{"count":672,"lower_bound":"MzI1ODkxMDMuNDg=","upper_bound":"MzI4Mzg2OTMuNTU=","repeats":1},{"count":680,"lower_bound":"MzI4NTQxNTIuMjQ=","upper_bound":"MzI5MzIxNjguOTI=","repeats":1},{"count":688,"lower_bound":"MzI5NDY2NDIuNDI=","upper_bound":"MzMwMTAwMzYuNzY=","repeats":1},{"count":696,"lower_bound":"MzMwNzk3MDUuNDE=","upper_bound":"MzM0NjgwNjkuNjQ=","repeats":1},{"count":704,"lower_bound":"MzM1MzYzODkuNDg=","upper_bound":"MzQxNDI2NTYuNTE=","repeats":1},{"count":712,"lower_bound":"MzQxODI5NjguNjQ=","upper_bound":"MzQ2NTMzNDcuOTA=","repeats":1},{"count":720,"lower_bound":"MzQ2Nzk2NDMuOTQ=","upper_bound":"MzQ5MzUwMjEuNDc=","repeats":1},{"count":728,"lower_bound":"MzUwODY0NjguMjU=","upper_bound":"MzUzMjc5MzEuMzk=","repeats":1},{"count":736,"lower_bound":"MzUzMzQwNzkuMzA=","upper_bound":"MzU1MzY3MDguNTE=","repeats":1},{"count":744,"lower_bound":"MzU1NjMzNDUuMDk=","upper_bound":"MzU2Njg3MDEuODA=","repeats":1},{"count":752,"lower_bound":"MzU4MTc2MDQuNjQ=","upper_bound":"MzU5NTU5ODkuNzc=","repeats":1},{"count":760,"lower_bound":"MzYxNzQxODUuNDQ=","upper_bound":"MzY0MjcwOTcuMDk=","repeats":1},{"count":768,"lower_bound":"MzY0ODI2MTkuNDI=","upper_bound":"MzY3MDYzNTcuMTA=","repeats":1},{"count":776,"lower_bound":"MzY4OTg3MjYuNTg=","upper_bound":"Mzc0MDU5MDIuNjU=","repeats":1},{"count":784,"lower_bound":"Mzc1MTY4OTMuOTA=","upper_bound":"Mzc5MzQ5NjAuNzY=","repeats":1},{"count":792,"lower_bound":"MzgxMjUwNjcuMTk=","upper_bound":"Mzg1MDE2NTYuMDg=","repeats":1},{"count":800,"lower_bound":"Mzg1ODUwMzUuNDE=","upper_bound":"Mzg4NTA2NDIuMzI=","repeats":1},{"count":808,"lower_bound":"MzkxOTAzNTYuNjc=","upper_bound":"Mzk1NzMzMDEuNTY=","repeats":1},{"count":816,"lower_bound":"Mzk1ODEwMTIuMDk=","upper_bound":"Mzk5MDU3NjcuNzM=","repeats":1},{"count":824,"lower_bound":"Mzk5OTQ3NTAuMjQ=","upper_bound":"NDAxNjc5NDEuMjc=","repeats":1},{"count":832,"lower_bound":"NDAyNDMzOTQuMjM=","upper_bound":"NDA3NDE3MTUuNTM=","repeats":1},{"count":840,"lower_bound":"NDA3OTQyMDkuMTk=","upper_bound":"NDEwOTUyNzQuMDY=","repeats":1},{"count":848,"lower_bound":"NDExMTgwODMuNzM=","upper_bound":"NDEzNTI2NDEuNjY=","repeats":1},{"count":856,"lower_bound":"NDEzNzI5NzEuMjI=","upper_bound":"NDE3MDM4OTAuMjI=","repeats":1},{"count":864,"lower_bound":"NDE4ODA3NTcuMTQ=","upper_bound":"NDE5NjMxNzAuNjY=","repeats":1},{"count":872,"lower_bound":"NDE5NjUyMDUuNTE=","upper_bound":"NDIxNTc0OTMuOTQ=","repeats":1},{"count":880,"lower_bound":"NDIzODM0NTQuMTc=","upper_bound":"NDI2MzI1MzAuNjM=","repeats":1},{"count":888,"lower_bound":"NDI3NDM1NjMuMTY=","upper_bound":"NDI5MjU4NTguNTY=","repeats":1},{"count":896,"lower_bound":"NDI5MjU5MzUuNzA=","upper_bound":"NDM3MjkyNTAuNTk=","repeats":1},{"count":904,"lower_bound":"NDM3Njg5MzIuMTc=","upper_bound":"NDQxNjcyMzAuNzU=","repeats":1},{"count":912,"lower_bound":"NDQzNDgwMjQuMDM=","upper_bound":"NDQ0NDcxNjEuODM=","repeats":1},{"count":920,"lower_bound":"NDQ1MzA1MjkuOTA=","upper_bound":"NDQ3OTY3MjcuNjU=","repeats":1},{"count":928,"lower_bound":"NDUxMzA1MDUuNDY=","upper_bound":"NDU1MjUxNjAuMjI=","repeats":1},{"count":936,"lower_bound":"NDU1NTA4NjEuOTE=","upper_bound":"NDU4OTA1NzQuMjk=","repeats":1},{"count":944,"lower_bound":"NDU5OTAwNjcuODc=","upper_bound":"NDY2MjM3MjYuODQ=","repeats":1},{"count":952,"lower_bound":"NDY2NDU5MTUuNTY=","upper_bound":"NDY3MTIxMDcuOTA=","repeats":1},{"count":960,"lower_bound":"NDY5NzA2OTEuNTM=","upper_bound":"NDc5MDMzMzMuNjQ=","repeats":1},{"count":968,"lower_bound":"NDc5MDU0NDMuNjU=","upper_bound":"NDgyODU4MjAuMjg=","repeats":1},{"count":976,"lower_bound":"NDg0MzY2MTcuMjM=","upper_bound":"NDg4MTMxNjMuNTA=","repeats":1},{"count":984,"lower_bound":"NDg5NjA2MTQuMTc=","upper_bound":"NDk1MDg5NzIuNjk=","repeats":1},{"count":992,"lower_bound":"NDk1OTY1NzEuMzg=","upper_bound":"NDk5ODA3NjEuMzk=","repeats":1},{"count":1000,"lower_bound":"NTAyNjcxNzUuODA=","upper_bound":"NTA2NzY2MzkuNDk=","repeats":1},{"count":1008,"lower_bound":"NTA3MDE1NzYuOTY=","upper_bound":"NTEwMTc1ODAuMjg=","repeats":1},{"count":1016,"lower_bound":"NTExMTYxNzIuMzU=","upper_bound":"NTEzMTMwNTUuOTE=","repeats":1},{"count":1024,"lower_bound":"NTE1OTU5NDUuMzI=","upper_bound":"NTE2MTkzNjguMDA=","repeats":1},{"count":1032,"lower_bound":"NTE3Nzk3NzEuNzY=","upper_bound":"NTE5MTQwNjQuNTE=","repeats":1},{"count":1040,"lower_bound":"NTE5NzI3NTIuMzc=","upper_bound":"NTI0NzEwNTIuMjA=","repeats":1},{"count":1048,"lower_bound":"NTI1MTAwMzYuNzI=","upper_bound":"NTI2MDIxMzcuMzA=","repeats":1},{"count":1056,"lower_bound":"NTI2MzEyMTQuMzU=","upper_bound":"NTI4NDE1NDUuMjE=","repeats":1},{"count":1064,"lower_bound":"NTI4ODE0NDguMjE=","upper_bound":"NTMwMTUxNTkuMzA=","repeats":1},{"count":1072,"lower_bound":"NTMxNjk1NDcuNTY=","upper_bound":"NTM0NzIxMjguNTk=","repeats":1},{"count":1080,"lower_bound":"NTM3NDkxMjQuMTk=","upper_bound":"NTM5MDI1NzUuMTg=","repeats":1},{"count":1088,"lower_bound":"NTQxNTA5MDEuMzQ=","upper_bound":"NTQ0ODM5NjIuOTE=","repeats":1},{"count":1096,"lower_bound":"NTQ1MzczMDUuNjg=","upper_bound":"NTQ4Mzc5OTEuOTc=","repeats":1},{"count":1104,"lower_bound":"NTQ5MTk4NjAuNjI=","upper_bound":"NTUwNjc3MzUuMjA=","repeats":1},{"count":1112,"lower_bound":"NTUxNDY5ODQuNjc=","upper_bound":"NTUzODE4MzYuMjk=","repeats":1},{"count":1120,"lower_bound":"NTU1MjE1MDAuNzk=","upper_bound":"NTYyODA5OTAuNjI=","repeats":1},{"count":1128,"lower_bound":"NTYzNjk4ODcuMTY=","upper_bound":"NTY3MDM3NTUuNzE=","repeats":1},{"count":1136,"lower_bound":"NTY3NDA4MzguODU=","upper_bound":"NTcwMzAxMjcuNzM=","repeats":1},{"count":1144,"lower_bound":"NTcxNTU0NzguNDM=","upper_bound":"NTczOTkxNjUuMjg=","repeats":1},{"count":1152,"lower_bound":"NTc0MDUxNzIuMTk=","upper_bound":"NTc4MjMzMDIuMzQ=","repeats":1},{"count":1160,"lower_bound":"NTgxOTM5MzIuNDA=","upper_bound":"NTg0NTIzNjQuNTU=","repeats":1},{"count":1168,"lower_bound":"NTg0OTU0NjIuMDk=","upper_bound":"NTg1NTc5NzkuNTY=","repeats":1},{"count":1176,"lower_bound":"NTg1NTk0OTEuODY=","upper_bound":"NTg5OTA3OTQuMDI=","repeats":1},{"count":1184,"lower_bound":"NTkwMzc2MzEuNzM=","upper_bound":"NTkxNzUzNzIuNzI=","repeats":1},{"count":1192,"lower_bound":"NTkyODU1NjcuNDA=","upper_bound":"NTk0OTkxMjguNTE=","repeats":1},{"count":1200,"lower_bound":"NTk2MDEwNTkuMjc=","upper_bound":"NTk4MDQxNjAuNDc=","repeats":1},{"count":1208,"lower_bound":"NjAyMTM5NTYuMzc=","upper_bound":"NjAzNzI5MzEuNjQ=","repeats":1},{"count":1216,"lower_bound":"NjAzOTM3NDEuMTQ=","upper_bound":"NjA0Nzk0MjUuMTA=","repeats":1},{"count":1224,"lower_bound":"NjA1Nzk1MDcuNDQ=","upper_bound":"NjEwMDI4MzcuNTk=","repeats":1},{"count":1232,"lower_bound":"NjEwOTk2OTYuNDQ=","upper_bound":"NjE1MzQ5NTcuMjQ=","repeats":1},{"count":1240,"lower_bound":"NjE2MTIyNzQuMjQ=","upper_bound":"NjMwNDg5MDIuMDY=","repeats":1},{"count":1248,"lower_bound":"NjMxNDUzNzQuMDI=","upper_bound":"NjM1Mzg1NzUuNjI=","repeats":1},{"count":1256,"lower_bound":"NjM2NjYzNjYuNTE=","upper_bound":"NjM5NDQ2NzAuOTU=","repeats":1},{"count":1264,"lower_bound":"NjM5ODM1NDQuMjM=","upper_bound":"NjQwODMyMDUuNjI=","repeats":1},{"count":1272,"lower_bound":"NjQxNjY3NDUuOTI=","upper_bound":"NjQzODcyNDIuODc=","repeats":1},{"count":1280,"lower_bound":"NjQ0ODUxODguMzE=","upper_bound":"NjQ5MjI2NjkuNjg=","repeats":1},{"count":1288,"lower_bound":"NjUwMTI4MzYuMzk=","upper_bound":"NjUwNjk1NTAuNTQ=","repeats":1},{"count":1296,"lower_bound":"NjUzMTI1OTguNjc=","upper_bound":"NjU0NTM3MDUuNjQ=","repeats":1},{"count":1304,"lower_bound":"NjU0NTcxNjAuNjE=","upper_bound":"NjU5NzEyOTguNzM=","repeats":1},{"count":1312,"lower_bound":"NjYxNTkwNjYuMzM=","upper_bound":"NjYzMDE0MTkuODI=","repeats":1},{"count":1320,"lower_bound":"NjY0MjI0MjYuODM=","upper_bound":"NjY1MDU2MzEuODg=","repeats":1},{"count":1328,"lower_bound":"NjY3NTYxODEuMjA=","upper_bound":"NjY4NjU3NzQuNzg=","repeats":1},{"count":1336,"lower_bound":"NjcyNTU1MDQuOTY=","upper_bound":"NjczODgwMTQuMTE=","repeats":1},{"count":1344,"lower_bound":"Njc0MDE4MDAuMDU=","upper_bound":"NjgyMTQ2NDIuMDk=","repeats":1},{"count":1352,"lower_bound":"NjgyMTgyMDcuMzA=","upper_bound":"Njg2NDExMTMuMTA=","repeats":1},{"count":1360,"lower_bound":"Njg3MDI4OTIuODM=","upper_bound":"Njg5MTg2OTIuMzg=","repeats":1},{"count":1368,"lower_bound":"Njg5NjAzNjguNjM=","upper_bound":"Njk0MDAwMTIuMjE=","repeats":1},{"count":1376,"lower_bound":"Njk1MTAxMDIuODE=","upper_bound":"Njk3MjM1MTAuMTk=","repeats":1},{"count":1384,"lower_bound":"Njk3Mjc3NTYuMDM=","upper_bound":"NzAxNzg3NDUuMDY=","repeats":1},{"count":1392,"lower_bound":"NzAyNTI4MTQuNjc=","upper_bound":"NzAzMzczMDMuNzE=","repeats":1},{"count":1400,"lower_bound":"NzAzNTcxMDEuMjQ=","upper_bound":"NzA2NDU2MjMuMDA=","repeats":1},{"count":1408,"lower_bound":"NzA3MTY3NjMuMjI=","upper_bound":"NzA5NTczMjkuMDI=","repeats":1},{"count":1416,"lower_bound":"NzEwMjgxMDAuNDg=","upper_bound":"NzE1OTM0MTIuMjU=","repeats":1},{"count":1424,"lower_bound":"NzIwNDY3MDYuMTI=","upper_bound":"NzI0ODQyMjMuNDM=","repeats":1},{"count":1432,"lower_bound":"NzI2MzkwNDcuMTk=","upper_bound":"NzI5OTQ2NzEuNDg=","repeats":1},{"count":1440,"lower_bound":"NzMwODI1OTcuMzg=","upper_bound":"NzMzNzA4MzMuOTU=","repeats":1},{"count":1448,"lower_bound":"NzM0NTYzMjEuODM=","upper_bound":"NzM4MTYzODMuODM=","repeats":1},{"count":1456,"lower_bound":"NzM4NTM0MzcuMzI=","upper_bound":"NzQxOTI3OTUuODg=","repeats":1},{"count":1464,"lower_bound":"NzQ0MDAxNzEuODU=","upper_bound":"NzQ2MjY1MTcuMzk=","repeats":1},{"count":1472,"lower_bound":"NzQ2NDIwNjcuMjI=","upper_bound":"NzUxNDUwNzQuODQ=","repeats":1},{"count":1480,"lower_bound":"NzUyMzcwODkuNTI=","upper_bound":"NzU2MzY2MjAuNTA=","repeats":1},{"count":1488,"lower_bound":"NzU4MTY5MDUuODU=","upper_bound":"NzYwNjg2MDMuNjM=","repeats":1},{"count":1496,"lower_bound":"NzYyMDExNTQuNzM=","upper_bound":"NzY2ODAzMDAuMDI=","repeats":1},{"count":1504,"lower_bound":"NzY3NDc2NjQuNDk=","upper_bound":"NzY4NjIwNjMuMTI=","repeats":1},{"count":1512,"lower_bound":"NzY4NzE0NDYuNzY=","upper_bound":"NzcyODQwNzQuMDY=","repeats":1},{"count":1520,"lower_bound":"NzcyOTkzNTEuMTI=","upper_bound":"Nzc2MTY5NzguNDg=","repeats":1},{"count":1528,"lower_bound":"Nzc2MjU3MDcuNTY=","upper_bound":"Nzc4ODI0MDkuMjA=","repeats":1},{"count":1536,"lower_bound":"Nzc5MTI5NjYuMTE=","upper_bound":"NzgwMjM5MzMuNDk=","repeats":1},{"count":1544,"lower_bound":"NzgwMjU2NTAuOTY=","upper_bound":"NzgzMTcxMDIuNDc=","repeats":1},{"count":1552,"lower_bound":"Nzg0NDU0NDIuNjM=","upper_bound":"Nzg1MTU1NjguNzk=","repeats":1},{"count":1560,"lower_bound":"Nzg1NjQ4NjguMDc=","upper_bound":"Nzg5MzE3OTQuMzA=","repeats":1},{"count":1568,"lower_bound":"NzkwMTgxNDIuMzk=","upper_bound":"Nzk0MDc4NjUuNDY=","repeats":1},{"count":1576,"lower_bound":"Nzk0OTY1MjAuMzc=","upper_bound":"Nzk3MDkzMzYuOTg=","repeats":1},{"count":1584,"lower_bound":"Nzk3Njk1MzEuMDc=","upper_bound":"ODAyODIwMDAuNzc=","repeats":1},{"count":1592,"lower_bound":"ODA0MzI5MTYuOTA=","upper_bound":"ODA3Mjc2MDkuNzg=","repeats":1},{"count":1600,"lower_bound":"ODA3ODg5ODguNjc=","upper_bound":"ODExMzQ3MDguMzc=","repeats":1},{"count":1608,"lower_bound":"ODExNzQyNDcuNDA=","upper_bound":"ODEyOTYyNjguMzE=","repeats":1},{"count":1616,"lower_bound":"ODEzMzM2ODkuNDE=","upper_bound":"ODE1ODg4MDguMTk=","repeats":1},{"count":1624,"lower_bound":"ODE2MzQ0NzkuMjc=","upper_bound":"ODE4NDg2ODguMjM=","repeats":1},{"count":1632,"lower_bound":"ODE4NjU2NzQuMTQ=","upper_bound":"ODIxMDA3OTQuOTQ=","repeats":1},{"count":1640,"lower_bound":"ODIxNDg1MDMuMzc=","upper_bound":"ODIyNTM2MjAuODY=","repeats":1},{"count":1648,"lower_bound":"ODIzNjIxMzEuNzQ=","upper_bound":"ODI2NDk1NjIuMTI=","repeats":1},{"count":1656,"lower_bound":"ODMwMTM5MDAuOTk=","upper_bound":"ODMyOTI0ODMuNjc=","repeats":1},{"count":1664,"lower_bound":"ODMzNzM4MjEuMDQ=","upper_bound":"ODM2OTg5NDguMTE=","repeats":1},{"count":1672,"lower_bound":"ODM3NzQ5NzEuNTY=","upper_bound":"ODQxOTIzNDYuOTc=","repeats":1},{"count":1680,"lower_bound":"ODQ0NDE0MDkuNTU=","upper_bound":"ODQ2MDkzMDcuMzk=","repeats":1},{"count":1688,"lower_bound":"ODQ2MTk3MjEuMDU=","upper_bound":"ODQ4MTcyOTguMzQ=","repeats":1},{"count":1696,"lower_bound":"ODUwMDczMTYuNDY=","upper_bound":"ODUzNjg0NDIuMzA=","repeats":1},{"count":1704,"lower_bound":"ODUzNzI1NzcuMDU=","upper_bound":"ODU2NjgyNDkuMTA=","repeats":1},{"count":1712,"lower_bound":"ODU2OTUxNDEuOTY=","upper_bound":"ODYxMTEwODYuMTU=","repeats":1},{"count":1720,"lower_bound":"ODYyNjcyOTguNTM=","upper_bound":"ODY0Nzk4ODYuNjY=","repeats":1},{"count":1728,"lower_bound":"ODY3OTEyMzguMTU=","upper_bound":"ODY4ODE4NzQuOTU=","repeats":1},{"count":1736,"lower_bound":"ODY5MzI5NDAuMTk=","upper_bound":"ODcxMDU5NjguMjA=","repeats":1},{"count":1744,"lower_bound":"ODcxMTExNDQuNTc=","upper_bound":"ODc1NDcyNDcuNDQ=","repeats":1},{"count":1752,"lower_bound":"ODc2MjIzNDUuNDQ=","upper_bound":"ODc4ODgwNjEuNjc=","repeats":1},{"count":1760,"lower_bound":"ODgxMTk5MzYuMTE=","upper_bound":"ODg4ODU4MzUuNjc=","repeats":1},{"count":1768,"lower_bound":"ODg5NDc5MjEuMjk=","upper_bound":"ODkzMzE0OTcuNTM=","repeats":1},{"count":1776,"lower_bound":"ODk0MTk3MzUuMzI=","upper_bound":"ODk2NzIyNjUuMjg=","repeats":1},{"count":1784,"lower_bound":"ODk3MDYzNDQuMDU=","upper_bound":"ODk5NDIyMDcuNzU=","repeats":1},{"count":1792,"lower_bound":"OTAwMzM4NjAuNjU=","upper_bound":"OTAzNTU5ODkuNTI=","repeats":1},{"count":1800,"lower_bound":"OTA0MjQ2NDcuMjA=","upper_bound":"OTA2ODczODIuMjE=","repeats":1},{"count":1808,"lower_bound":"OTA4MDAxNTUuMzg=","upper_bound":"OTExNDYzNzYuMTQ=","repeats":1},{"count":1816,"lower_bound":"OTE1MTgxODUuMDc=","upper_bound":"OTE4NDQ5MjMuMzg=","repeats":1},{"count":1824,"lower_bound":"OTIwMDIxNzUuNDE=","upper_bound":"OTIzMTkwNTEuNjQ=","repeats":1},{"count":1832,"lower_bound":"OTI1MTQwMjEuMTc=","upper_bound":"OTI3MjM3MzUuODQ=","repeats":1},{"count":1840,"lower_bound":"OTI4NzczMzAuODE=","upper_bound":"OTMyNTI0MzkuNTU=","repeats":1},{"count":1848,"lower_bound":"OTMzMTEzMzEuMjg=","upper_bound":"OTM5OTE2ODguOTk=","repeats":1},{"count":1856,"lower_bound":"OTQxMDM4MzcuOTM=","upper_bound":"OTQ0MTM3NzIuMjI=","repeats":1},{"count":1864,"lower_bound":"OTQ0MzI2MjEuMDU=","upper_bound":"OTQ2NTY5NzIuNjI=","repeats":1},{"count":1872,"lower_bound":"OTQ3MTYwODIuMjU=","upper_bound":"OTQ4OTgyNTguMDU=","repeats":1},{"count":1880,"lower_bound":"OTQ5NTQ0ODYuOTc=","upper_bound":"OTUwNDE0NzcuODY=","repeats":1},{"count":1888,"lower_bound":"OTUxMTc5MzcuOTA=","upper_bound":"OTU1MTgzODIuMzE=","repeats":1},{"count":1896,"lower_bound":"OTU2NjExMDQuMjQ=","upper_bound":"OTU3NjE5MzYuODQ=","repeats":1},{"count":1904,"lower_bound":"OTU3OTA0MTQuNzk=","upper_bound":"OTU5ODI4NDcuODU=","repeats":1},{"count":1912,"lower_bound":"OTYwNjQyMjkuNjE=","upper_bound":"OTYyMzk4NjYuNzQ=","repeats":1},{"count":1920,"lower_bound":"OTYzMTI2NDcuMDc=","upper_bound":"OTY4MDE2MjMuMTM=","repeats":1},{"count":1928,"lower_bound":"OTY4MzU3MDYuODA=","upper_bound":"OTcwNTc4MzAuMDA=","repeats":1},{"count":1936,"lower_bound":"OTcyMjgyNTYuMDY=","upper_bound":"OTczMzQ1NDMuNTc=","repeats":1},{"count":1944,"lower_bound":"OTc0MTU1MjkuNDE=","upper_bound":"OTc1Mzc5MjIuNTI=","repeats":1},{"count":1952,"lower_bound":"OTc2MDA3MDMuMzQ=","upper_bound":"OTc4MDExODIuODc=","repeats":1},{"count":1960,"lower_bound":"OTgxNjA4NzMuMzU=","upper_bound":"OTgyNDg4MjYuMTE=","repeats":1},{"count":1968,"lower_bound":"OTgzNDgyOTAuODk=","upper_bound":"OTg1NDAyMDIuMTg=","repeats":1},{"count":1976,"lower_bound":"OTg1NDUyMTguODI=","upper_bound":"OTg4MzU0NTAuODQ=","repeats":1},{"count":1984,"lower_bound":"OTg5Nzg3MzEuMDE=","upper_bound":"OTkyNTEzMDUuNDQ=","repeats":1},{"count":1992,"lower_bound":"OTk0OTA1MzUuMTg=","upper_bound":"OTk3Mjk0NzYuMTE=","repeats":1},{"count":2000,"lower_bound":"OTk3MzMyNjYuOTI=","upper_bound":"OTk5Njc1MzYuNDg=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,2,1,0,0,1,0,0,0,1,0,0,1,0,1,2,0,1,2,2,0,1,0,3,0,0,1,2,1,1,2,2,1,1,0,0,4,0,2,0,0,3,1,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,1,0,2,2,0,1,1,0,4,1,0,3,1,3,0,0,3,1,1,1,3,2,3,0,0,1,1,2,1,1,1,3,1,3,0,3,1,2,1,3,0,0,1,0,1,2,2,1,1,1,1,0,1,0,1,0,2,1,2,1,0,0,1,1,0,0,0,2,0,0,2,1,1,1,1,1,1,1,0,0,2,0,0,1,0,3,0,0,0,0,1,0,1,3,0,2,0,3,1,1,1,1,3,0,2,0,2,1,0,1,2,1,2,1,1,1,2,0,0,1,2,0,2,0,1,0,1,0,1,1,1,0,2,1,1,0,0,1,1,2,1,2,0,1,0,2,1,2,0,0,0,0,2,0,1,3,1,4,2,1,1,0,0,4,2,0,2,0,0,1,2,1,0,0,0,1,3,3,2,0,0,2,1,1,4,0,0,0,0,0,3,1,0,0,2,1,1,2,1,1,1,0,1,1,1,0,1,1,0,1,3,2,0,0,1,1,1,2,2,0,1,1,2,2,1,1,0,1,2,1,1,0,2,1,2,3,2,1,0,1,2,0,1,1,2,0,1,2,2,0,0,2,3,1,0,0,0,0,2,1,1,0,0,1,1,1,1,0,3,1,0,0,0,0,2,2,1,1,1,1,0,1,2,0,0,0,1,1,0,2,0,3,1,2,0,1,2,0,0,0,1,0,1,1,0,0,2,0,0,0,0,2,1,0,2,1,1,1,1,2,0,0,3,2,4,2,2,1,1,0,0,0,2,1,1,0,1,1,0,4,0,3,2,1,2,0,1,0,0,0,1,0,0,0,0,1,0,0,1,0,0,2,0,3,2,2,0,3,0,2,1,0,0,0,0,1,2,0,3,0,0,0,3,1,2,1,2,0,0,0,0,1,0,0,0,0,0,3,2,1,1,0,1,1,0,1,0,0,1,1,1,1,0,1,2,0,0,4,2,1,0,2,1,0,0,0,1,2,1,0,3,0,2,1,1,0,0,1,1,0,0,1,1,0,0,0,0,1,1,0,2,2,2,2,0,1,0,0,0,1,1,0,1,1,1,0,0,1,0,0,0,0,0,2,0,1,0,3,1,0,0,1,2,0,0,1,2,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,2,0,0,1,1,1,2,0,0,1,1,0,2,0,3,1,0,0,2,0,0,1,0,4,0,0,1,1,2,0,1,1,1,0,1,0,0,1,1,2,0,1,0,1,0,0,2,2,3,4,2,2,2,1,2,2,0,0,1,0,2,1,1,2,1,0,1,0,1,0,4,1,2,2,1,1,0,1,0,0,0,3,1,1,0,2,2,1,1,0,0,1,0,0,3,1,0,3,2,2,0,2,1,2,0,1,1,1,0,0,1,0,2,2,0,2,1,1,2,0,3,1,0,2,1,0,1,1,2,2,0,1,0,1,0,0,3,1,2,3,1,1,2,1,0,0,2,1,0,2,0,2,2,0,1,1,2,2,2,0,1,0,0,3,0,0,0,0,2,0,1,0,2,3,1,1,1,0,3,1,0,1,0,0,2,0,1,0,1,0,2,0,2,1,1,1,1,1,1,1,2,0,2,1,1,0,1,1,1,0,3,1,0,0,4,0,2,1,0,0,0,3,0,1,0,1,1,0,3,1,0,0,0,2,1,0,1,1,1,0,2,0,1,1,1,0,1,0,0,0,1,1,1,1,2,0,0,2,3,0,2,0,0,0,1,3,1,0,2,2,1,0,2,1,0,0,0,1,0,0,2,2,1,1,1,0,1,0,3,3,1,0,4,0,1,2,0,1,0,3,3,0,2,1,1,0,2,0,1,2,3,0,2,2,2,2,4,1,4,0,2,0,0,1,0,1,3,1,0,0,1,0,1,2,0,0,2,0,1,0,1,1,2,1,0,0,0,1,5,1,0,2,0,2,0,1,3,2,0,1,2,1,3,1,1,2,1,2,1,1,0,3,0,0,0,1,1,1,1,0,1,1,1,0,0,1,0,0,0,0,0,1,0,1,0,3,1,3,0,0,1,0,1,0,2,0,1,1,2,1,1,0,1,1,0,1,0,1,0,2,1,1,1,0,0,0,0,1,0,1,1,1,2,0,1,1,1,3,2,0,1,1,2,1,2,2,0,0,0,0,0,0,3,1,1,1,0,0,1,1,1,0,0,2,1,0,0,1,0,1,1,0,0,1,0,0,2,2,2,0,0,6,2,0,0,1,1,0,0,0,1,0,1,1,2,1,1,3,1,0,0,0,0,2,1,1,1,2,0,0,2,1,0,1,1,3,1,0,1,1,0,3,1,2,4,1,2,1,4,0,1,1,2,1,0,1,2,2,0,0,0,1,1,1,0,0,1,0,1,1,1,0,3,0,0,2,0,0,1,2,0,1,0,0,1,0,1,1,0,0,1,1,3,2,1,2,1,0,1,2,0,2,2,1,0,1,2,0,1,0,0,1,1,0,0,0,0,1,0,1,0,1,1,2,2,2,0,1,2,2,1,0,1,1,1,0,1,3,2,1,0,1,1,1,0,0,1,0,0,1,1,0,1,1,1,2,1,1,0,1,1,1,2,2,0,1,2,2,2,1,0,0,1,1,0,2,0,3,1,1,0,0,1,1,2,0,2,0,1,1,0,2,2,0,1,2,1,1,0,0,0,2,2,1,0,1,1,1,0,1,2,1,0,2,3,1,0,1,1,0,1,3,2,1,0,1,0,0,1,0,1,1,0,1,1,1,0,0,3,2,1,1,1,1,3,1,2,0,1,0,1,0,1,0,0,4,0,1,0,0,0,2,2,1,0,1,0,1,0,1,1,6,2,0,2,1,0,1,2,1,0,2,1,0,1,1,2,0,1,1,2,0,1,1,0,1,2,0,2,5,1,1,1,0,1,4,2,1,0,0,1,1,1,0,0,1,1,1,1,0,0,0,2,0,1,2,2,1,3,3,1,0,0,2,3,0,2,1,1,1,2,1,0,2,1,1,1,1,0,2,0,1,0,1,2,0,0,0,2,0,0,2,2,4,0,0,0,0,0,1,1,0,1,0,1,2,2,1,0,0,1,2,1,2,2,1,0,0,3,2,4,0,0,0,1,1,2,1,1,1,1,0,0,1,2,1,1,1,1,1,2,0,0,0,3,2,1,2,0,4,1,1,1,1,0,0,0,3,4,2,0,0,0,0,1,1,2,1,2,2,1,2,1,1,0,2,1,0,2,1,1,2,2,1,1,2,1,0,1,4,0,0,2,0,0,1,2,1,2,0,2,2,0,1,0,1,1,2,2,1,0,1,0,1,1,2,1,3,1,2,1,0,0,1,1,0,1,1,1,0,1,2,1,0,2,3,0,1,0,0,0,3,1,2,0,1,1,0,0,2,0,0,0,1,2,0,1,1,1,0,1,2,4,2,4,0,0,0,2,1,0,0,0,0,0,0,1,2,1,1,0,1,2,0,0,2,1,2,1,4,4,2,1,1,2,2,1,1,1,1,1,2,1,0,1,0,1,2,2,0,0,0,1,2,0,1,2,0,0,0,1,1,1,1,0,0,1,0,0,1,0,0,1,1,1,1,1,0,2,1,2,0,1,2,1,1,2,0,2,1,1,0,0,0,3,1,2,1,1,1,2,1,0,1,1,1,1,0,0,0,0,1,1,3,1,3,3,1,0,1,2,1,2,1,1,1,2,2,3,1,0,3,1,1,1,1,0,1,2,0,0,1,1,2,1,0,1,1,0,0,0,0,0,0,0,0,1,0,2,2,1,2,2,3,3,1,1,1,0,3,0,1,2,4,1,0,1,0,1,1,2,3,1,1,0,1,0,2,2,1,1,0,2,2,1,1,0,0,1,0,1,2,0,0,2,2,1,1,2,1,2,0,2,3,0,2,0,0,0,1,1,0,2,1,1,0,0,0,1,2,0,2,1,2,2,1,1,2,1,0,0,2,1,0,1,0,0,1,1,1,2,0,3,1,2,2,0,2,1,1,1,0,1,1,3,0,0,1,3,1,1,2,3,2,0,1,0,3,2,0,1,3,2,0,1,1,1,1,1,2,0,0,1,1,1,1,1,1,1,2,1,0,1,0,1,1,1,0,0,0,0,2,1,1,0,3,0,0,2,1,2,2,2,3,0,2,0,4,2,0,1,0,1,1,3,0,1,2,0,2,2,1,1,2,2,0,1,1,1,1,0,2,0,1,0,0,0,0,1,0,0,0,2,1,1,0,1,1,0,1,0,1,1,0,1,2,0,0,1,0,1,3,0,0,1,0,0,0,1,0,0,2,0,1,0,3,0,3,0,2,2,0,2,0,2,1,1,0,0,0,1,0,2,0,2,1,2,0,1,1,0,0,1,0,0,1,1,1,1,0,2,3,2,1,1,0,2,2,3,0,0,1,1,0,0,0,2,2,2,0,1,1,2,0,2,0,0,0,1,1,0,1,1,1,0,0,1,1,4,1,0,1,1,1,1,2,2,3]},{"counters":[3,0,0,2,3,2,1,0,0,0,0,1,1,1,0,0,1,1,2,0,2,0,2,3,0,0,3,2,1,0,0,1,3,1,2,1,0,2,5,0,2,3,2,1,2,0,1,1,0,0,2,1,0,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,0,2,0,1,0,3,0,0,1,0,0,0,0,1,4,0,1,5,0,0,1,1,0,1,0,2,0,1,0,2,0,1,0,2,2,1,1,1,2,1,0,0,0,0,0,0,0,1,1,2,1,0,1,1,0,0,0,2,1,1,0,0,4,0,0,2,1,4,0,1,1,0,1,2,0,1,1,0,2,2,0,0,0,0,0,1,1,2,0,2,3,2,1,2,2,1,0,0,0,0,3,0,0,1,1,1,0,0,1,3,1,1,0,2,0,2,0,1,1,1,1,0,1,0,1,0,2,0,2,2,0,0,0,3,1,3,2,0,0,1,1,0,0,2,0,3,0,2,0,0,1,0,1,0,0,1,1,2,0,1,2,1,0,1,1,1,1,2,2,1,0,1,1,1,1,4,2,0,2,0,0,0,0,0,1,2,0,2,0,0,3,1,2,1,3,1,1,1,0,4,0,1,3,0,0,0,1,2,1,0,1,2,0,0,1,1,0,1,2,0,2,5,2,1,0,1,1,4,1,0,0,1,2,2,1,0,0,0,1,0,0,2,2,0,0,0,1,0,0,0,2,1,1,3,2,1,1,0,1,0,0,1,2,2,2,1,1,1,1,2,0,0,1,1,1,2,0,1,0,2,3,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,1,3,1,1,1,0,1,1,1,1,1,0,2,1,2,2,0,0,2,1,3,0,1,1,2,0,0,0,2,2,1,3,0,0,2,2,1,3,0,0,0,2,4,1,1,1,0,1,0,0,2,2,2,0,0,1,1,0,0,0,1,0,2,1,2,1,1,2,1,1,0,2,1,0,0,0,0,1,0,0,0,0,1,2,0,1,0,1,0,1,3,0,1,0,2,0,0,4,2,0,0,1,1,1,2,3,3,2,0,1,0,2,0,1,1,0,2,1,2,1,0,1,1,1,3,1,2,2,2,0,1,1,1,2,0,0,1,2,1,0,2,0,1,0,1,0,2,2,1,2,2,1,0,1,0,1,0,1,1,1,1,2,2,0,1,1,1,1,0,4,1,1,1,0,1,1,1,2,2,1,0,0,0,1,2,0,0,1,2,2,5,0,2,2,3,0,2,0,1,3,1,0,0,4,1,0,3,2,2,0,0,1,1,0,0,1,3,2,1,0,4,1,0,3,1,0,2,2,0,1,4,1,1,0,0,1,1,0,0,0,0,1,0,1,2,1,4,1,0,1,3,0,1,2,1,0,1,1,1,2,3,1,2,3,0,0,0,1,0,1,2,0,1,0,2,1,1,0,2,1,2,1,1,2,0,2,0,0,0,2,1,2,0,0,0,5,0,0,0,2,0,1,1,2,1,1,0,2,1,1,1,0,0,2,0,1,1,1,1,1,0,3,1,5,1,1,0,0,0,2,2,0,0,1,0,2,2,0,1,0,0,0,0,0,0,1,0,1,1,3,0,3,4,0,1,0,0,1,0,0,0,1,1,1,2,5,0,2,1,0,3,1,0,1,0,0,1,1,3,2,0,0,0,0,1,1,1,1,0,1,1,0,1,2,1,1,2,2,1,4,1,0,1,0,1,1,2,2,1,3,0,0,1,1,0,1,0,2,0,1,0,0,2,3,0,2,1,1,2,3,0,1,2,0,0,0,2,1,1,1,1,0,1,0,0,4,1,1,0,1,1,0,2,2,1,1,1,0,0,0,0,1,2,3,1,0,1,0,2,0,0,1,1,0,0,1,0,2,1,2,2,0,0,1,2,2,1,1,1,1,1,1,0,1,1,1,3,0,1,2,1,1,1,3,0,3,3,1,0,2,2,1,1,3,0,1,0,2,1,0,0,0,1,0,1,2,1,0,1,0,0,1,1,3,0,1,0,1,2,0,1,4,1,2,1,1,0,0,0,1,1,0,0,1,2,1,0,0,1,2,0,3,1,2,1,1,1,2,2,1,3,2,3,1,2,1,2,0,1,0,0,2,1,3,1,0,3,0,3,0,1,0,0,0,1,0,2,0,0,2,1,1,0,1,0,2,1,0,0,2,1,1,0,1,1,0,1,1,1,3,0,1,1,0,0,0,1,0,4,2,3,2,1,2,2,1,2,0,2,0,0,0,2,2,2,1,3,0,1,0,0,0,1,1,2,0,1,2,0,2,1,2,0,1,0,1,0,1,2,1,2,0,0,0,0,1,1,1,1,2,0,3,1,1,1,1,0,0,1,1,0,1,0,0,0,3,0,1,0,0,1,0,0,0,1,0,0,1,1,2,0,1,1,2,0,0,2,0,0,1,1,1,1,1,2,0,3,0,0,1,0,1,0,1,0,2,1,1,2,2,3,2,1,1,3,3,2,0,0,1,0,2,1,1,1,0,3,0,0,0,0,1,0,1,1,2,1,0,3,0,2,0,1,2,1,1,1,2,1,1,0,0,0,0,0,1,1,1,2,1,1,0,0,0,0,0,1,0,2,1,1,1,1,2,0,2,0,0,0,2,2,1,1,1,0,0,0,1,2,0,0,2,1,0,1,2,1,1,0,2,0,1,0,1,0,1,0,3,4,1,2,2,0,0,0,0,3,1,1,3,1,2,2,2,0,0,1,0,1,1,1,2,0,1,0,0,2,1,0,1,0,0,3,1,0,2,1,1,0,1,2,1,0,6,0,1,0,0,1,1,2,0,0,1,0,0,2,2,1,1,2,2,1,0,1,0,1,1,1,0,1,1,0,1,2,1,1,1,1,1,1,0,1,0,2,0,1,2,1,0,0,0,1,2,1,0,0,2,2,2,0,4,2,1,1,1,1,1,1,1,0,1,2,0,2,1,2,1,1,1,1,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1,0,1,1,2,3,2,1,0,2,0,1,0,1,0,1,0,0,1,2,1,0,1,0,2,0,2,2,1,0,0,1,2,0,1,2,1,1,2,0,1,1,3,0,1,0,0,2,0,0,1,1,0,1,2,1,3,0,2,1,1,0,2,0,0,1,3,1,0,1,3,0,2,0,1,1,2,2,3,0,1,0,0,0,2,0,1,0,2,2,1,1,0,0,1,0,1,1,0,1,2,0,0,0,2,2,3,3,2,0,1,0,1,1,1,1,1,0,1,0,1,0,1,0,2,0,1,1,1,1,0,0,0,0,0,1,2,1,2,3,0,0,2,1,0,2,3,1,1,2,1,1,1,2,1,3,2,0,1,1,0,1,0,2,0,0,1,0,0,1,0,1,3,2,1,0,0,2,2,2,0,0,0,0,1,0,2,2,2,2,3,0,2,0,3,3,1,1,0,0,1,2,2,2,0,2,0,0,1,0,0,0,0,0,0,3,0,1,0,1,1,1,1,0,2,3,1,1,0,0,3,2,0,1,0,3,0,1,1,1,0,1,1,0,2,0,1,1,2,0,0,1,1,0,1,1,1,1,0,1,2,1,0,1,0,3,1,1,1,1,1,1,0,1,1,2,0,0,0,1,1,0,0,0,0,0,1,0,0,1,4,0,2,1,1,1,0,0,0,0,1,0,1,1,2,0,0,3,0,2,1,0,1,2,1,0,0,0,1,2,2,1,1,0,2,2,2,0,1,1,0,1,4,0,0,0,3,2,0,0,0,1,1,2,0,0,0,1,1,2,0,2,1,1,0,0,1,3,2,0,3,0,1,2,1,1,0,1,1,1,1,0,1,2,1,2,2,1,0,0,2,0,0,1,1,0,1,1,1,3,0,0,2,0,0,2,0,0,0,3,1,1,3,2,0,1,2,1,2,3,1,0,0,0,0,1,0,0,2,2,0,0,0,1,2,1,1,2,1,0,3,1,1,0,0,2,1,1,3,1,0,4,0,0,0,1,2,0,0,1,1,1,0,0,1,0,1,1,3,1,1,3,1,0,0,0,1,0,0,0,2,2,0,3,0,1,2,0,3,0,1,2,1,1,0,0,1,2,0,2,0,1,1,1,1,1,3,1,0,2,0,1,1,3,2,1,0,1,3,1,2,1,2,2,0,3,1,0,2,1,1,1,2,1,1,4,2,0,1,0,1,0,0,0,0,0,0,0,1,1,2,2,0,4,0,1,0,2,1,0,1,1,1,0,2,1,0,0,0,1,1,0,1,5,2,3,2,0,1,1,0,1,2,1,0,1,1,0,2,0,1,0,0,2,0,0,0,2,2,0,1,0,2,0,2,0,1,1,1,0,0,2,1,0,1,2,0,0,0,0,0,1,0,5,1,0,3,0,2,0,2,2,0,1,2,0,1,4,2,0,3,0,0,1,1,1,1,0,0,1,0,0,0,2,1,1,1,1,3,0,1,2,1,0,0,2,2,1,2,1,1,1,0,1,1,1,2,0,1,0,0,0,0,1,1,0,2,0,1,2,0,1,0,1,2,2,2,2,1,1,3,2,2,0,0,0,0,0,0,0,0,2,0,0,2,1,1,1,2]},{"counters":[5,0,1,1,0,1,1,2,3,1,0,0,1,1,0,0,1,0,1,2,3,0,1,1,0,0,1,1,0,1,2,0,1,0,0,0,1,2,4,1,0,0,2,1,1,1,0,0,0,0,1,1,2,1,1,1,1,0,1,0,0,1,0,0,2,1,1,0,0,0,1,1,2,1,1,0,1,1,2,1,0,2,0,1,3,1,2,3,2,1,2,1,1,1,0,1,1,0,1,0,2,1,0,1,2,2,1,1,2,0,0,0,0,0,2,1,0,0,1,2,2,1,1,1,2,2,1,2,0,1,4,1,0,0,0,0,0,0,1,1,0,0,0,1,0,1,1,1,1,1,0,2,1,1,1,0,1,2,1,1,2,0,1,0,1,0,1,2,1,3,1,2,0,2,1,0,0,4,3,0,2,1,1,3,1,1,1,2,3,2,0,1,0,0,0,1,2,1,0,0,0,1,1,1,0,2,0,0,1,1,0,1,0,0,2,0,0,0,0,0,0,5,1,1,2,1,1,3,1,2,0,1,3,0,1,0,1,1,1,1,0,1,1,3,1,1,2,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,1,2,2,0,0,2,1,0,0,1,0,1,1,3,2,1,0,1,1,1,1,5,2,2,2,1,2,1,0,1,1,0,1,1,3,2,1,3,2,0,1,1,1,0,0,1,1,0,1,1,0,1,0,3,1,1,1,2,0,0,1,4,1,1,3,1,0,0,0,1,0,2,2,1,1,1,0,2,2,3,2,1,1,2,0,2,1,3,0,1,2,0,2,0,1,0,1,1,1,1,2,1,2,1,0,1,1,0,0,1,0,0,3,1,0,1,4,0,0,0,0,1,1,1,1,3,1,0,2,0,0,0,1,0,0,3,1,1,2,2,1,0,3,1,3,2,0,3,1,1,1,1,0,0,1,2,2,2,1,0,0,1,2,2,1,2,1,1,1,2,1,1,0,2,1,1,0,1,1,0,0,0,1,3,0,1,0,1,1,1,0,0,3,1,1,0,1,0,2,1,2,0,2,0,1,2,0,0,0,3,0,1,1,0,0,0,0,1,2,2,2,1,2,1,3,1,2,1,2,2,0,1,3,1,0,2,1,0,0,1,2,1,2,0,1,1,1,1,0,0,1,1,1,0,1,1,1,1,2,0,2,1,0,1,1,2,1,2,1,0,1,0,1,2,0,1,0,1,0,3,1,0,1,0,0,2,1,2,1,0,2,1,1,0,1,0,2,1,0,1,2,0,0,0,0,1,3,1,1,0,1,0,2,0,1,1,0,1,1,1,1,1,0,3,1,1,0,0,1,2,1,2,0,0,4,3,1,0,0,2,3,1,0,0,0,0,1,0,2,2,3,0,3,1,1,0,0,2,0,3,3,0,1,2,2,1,2,1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,2,2,2,4,0,1,1,2,1,1,3,0,1,1,2,1,1,0,0,0,4,4,2,1,0,0,0,1,2,0,1,1,1,3,2,1,2,2,0,0,1,3,0,2,2,0,2,1,0,2,4,1,2,0,1,2,1,2,0,1,0,0,1,4,1,0,3,0,3,0,0,1,2,1,0,2,0,4,2,0,0,1,3,0,3,0,0,2,0,0,0,1,0,0,1,1,0,2,0,1,0,0,1,0,0,3,0,1,1,1,0,0,0,1,0,1,0,1,1,1,0,0,1,0,2,1,2,1,0,0,0,1,1,3,1,3,1,0,0,0,2,1,1,2,0,2,1,2,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,2,0,1,1,1,0,0,1,1,0,1,0,2,0,1,0,1,0,0,0,0,1,1,1,0,2,0,0,1,2,0,2,1,1,1,3,2,0,1,1,0,3,0,2,1,3,1,1,1,0,0,2,0,4,2,1,2,2,2,0,3,0,0,1,0,0,2,1,2,0,2,1,2,0,1,0,0,2,2,0,1,0,0,2,1,0,2,2,2,2,1,1,1,2,1,0,1,2,1,0,1,1,3,1,1,2,2,1,0,1,1,1,0,0,0,0,2,2,3,2,1,2,1,1,0,0,1,0,0,0,2,1,1,1,4,1,2,2,3,2,2,1,0,2,1,2,1,2,0,0,1,4,0,0,0,1,3,1,0,2,1,1,2,1,0,1,1,3,0,4,1,1,0,2,1,1,1,1,0,0,2,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,1,1,0,0,1,0,1,1,2,0,0,0,4,1,3,0,0,2,1,0,1,0,0,0,0,0,3,0,1,0,2,1,3,1,1,0,1,0,0,1,0,3,3,0,0,0,2,1,1,1,3,2,1,1,0,1,1,1,1,0,2,0,0,0,2,1,2,1,1,1,0,1,2,2,0,1,1,1,1,0,0,2,0,1,1,3,0,3,2,1,1,1,0,2,1,1,0,1,2,1,1,3,1,0,2,0,2,1,2,0,0,0,2,0,1,1,1,0,2,0,0,0,0,0,1,0,0,0,1,0,0,1,4,0,3,1,0,1,0,0,1,0,1,0,0,0,0,0,2,2,1,4,0,1,3,1,2,1,0,1,1,1,1,1,5,2,1,0,0,1,3,0,0,1,3,0,3,1,0,1,0,2,0,0,1,1,0,0,1,2,0,0,0,0,0,1,1,0,0,1,1,0,0,0,1,1,0,3,1,3,0,3,1,1,0,2,2,1,1,1,2,0,2,1,2,0,0,2,2,1,0,2,5,0,1,0,2,2,0,1,1,1,0,1,1,0,1,3,0,0,2,1,1,3,0,2,2,0,1,2,1,0,0,2,1,4,2,1,1,2,1,0,0,1,0,1,0,2,1,2,1,0,1,0,1,2,2,2,1,2,2,0,1,1,1,2,0,0,3,0,0,0,2,2,2,1,0,0,0,0,0,0,1,2,2,2,4,1,0,3,1,0,1,2,0,1,2,1,0,1,1,1,0,2,2,0,1,1,1,1,1,1,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,1,0,2,1,1,1,0,3,2,0,0,0,3,0,2,1,2,1,2,0,1,2,1,1,1,2,1,1,1,1,1,1,0,2,1,0,0,1,1,3,2,1,4,0,0,1,2,3,0,0,1,1,3,0,0,3,0,3,2,3,1,5,1,1,1,0,1,1,1,1,2,1,3,0,0,0,2,1,0,1,0,0,2,0,1,1,0,1,0,2,1,1,3,1,1,1,0,0,0,3,1,0,0,1,1,0,0,0,2,0,0,2,1,1,1,0,0,2,2,2,0,0,1,0,0,1,2,2,2,0,0,2,1,0,1,0,0,1,0,2,3,1,1,1,1,1,1,0,2,0,0,1,0,1,1,1,2,1,2,1,0,1,0,0,0,0,0,1,0,0,0,0,2,1,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,3,1,1,0,0,1,0,4,0,2,1,1,1,0,0,2,0,0,2,1,1,1,0,0,1,0,1,1,0,2,0,1,0,2,1,1,0,2,1,2,2,4,0,0,1,3,1,4,0,1,1,2,2,0,0,0,0,1,0,3,1,4,1,1,2,1,1,0,4,1,1,1,1,2,0,2,1,3,1,1,1,0,2,1,1,2,2,0,2,1,0,0,0,2,1,0,1,2,0,2,0,0,0,3,1,0,2,0,1,0,2,1,0,1,0,1,0,1,1,0,3,0,2,0,0,0,1,2,3,0,0,0,1,2,2,0,1,0,1,0,0,0,1,0,1,1,2,0,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,0,0,1,5,2,3,1,0,1,0,0,1,0,0,1,1,0,0,0,0,1,0,3,0,2,0,1,0,0,1,2,1,2,2,2,1,1,2,1,1,1,2,0,2,2,0,0,0,1,0,0,3,0,0,0,0,0,0,1,1,4,2,0,2,1,0,2,1,1,1,2,2,1,0,1,1,0,0,3,0,1,0,0,1,2,1,1,2,0,0,0,1,0,0,1,0,0,0,1,0,3,2,1,2,1,1,1,0,3,1,1,1,3,1,2,1,2,2,1,0,2,2,1,1,0,1,2,1,0,0,3,2,1,0,4,3,0,0,1,0,0,2,0,2,1,0,1,1,1,1,4,1,1,0,0,1,1,3,0,3,0,2,0,0,0,0,0,0,0,0,1,0,1,0,2,0,2,0,1,0,0,1,2,0,0,3,1,1,0,0,1,0,2,0,2,0,1,0,1,0,0,1,1,0,2,2,4,2,1,1,0,2,0,0,1,1,1,6,1,0,1,1,3,0,1,0,2,1,2,0,0,0,1,0,2,1,0,0,1,1,2,3,2,2,1,2,1,0,2,0,2,1,1,2,1,0,0,1,1,1,0,1,0,1,0,0,2,0,1,0,1,1,2,0,0,2,2,2,0,0,2,1,0,1,2,2,0,0,1,0,2,1,0,1,1,3,2,1,0,0,2,1,1,1,2,0,1,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,1,0,0,1,1,1,0,0,0,2,2,0,2,1,1,0,2,1,0,1,1,3,0,0,0,1,1,0,1,0,2,1,2,0,0,1,0,1,0,1,1,2,2,1,0,2,2,0,0,0,0,0,1,1,1,0,0,1,2,0,1,0,0,1,2,1,0,1,1,1,3,1,1,1,2,0,1,0,1,1,3,1,0,2,0,1,0,0,1,0,1,2,1,2,2,1,0,4,0,3,0,0,0,0,1,1,1,1,2,1,0,2,1,0,0,1,0,0,1,0,2,2,0,0,0,1,1,0,0,1,1,0,1,0,0,0,2,0,1,2,0,1,1,0,1,0,2,0,0,1,1,0,2,2,1,0,0,2,3,0,1,2,2,0,1,3,1,0,1,2,1,2,3,0,0,2,2,1,1,0,1,0,0,3,0,1,1,0,2,1,0,1,1,2,1,0,0,0,0,2,0,0,4,0,3,1,1,2,0,1,1,2,1,1,1,1,2,3,3,1,3,0,1,1,0,3,0,1,1,1,2,2,0,2,0,2,0,1,1,3,0,1,3,2,5,0,1,2,1,0,0,1,1,1,0,0,3,0,1,1,0,1,1,0,1,0,0,0,0,1,1,0,4,2,1,2,2,0,2,2,1,0,2,1,0,1,1,3,1,2,0,1,1,1,1,2,3,3,0,1,2,0,0,1,0,1,0,0,0,1,2,0,0,2,0,0,0,3,1,0,3,3,1,1,2,0,2,0,2,1,0,4,0,0,1,0,1,0,1,2,0,1,1,1,1,0,0,2,0,2,0,1,1,1,1,0,0,1,0,0,0,0,0,2,0,2,2,1,1,1,3,0,1,1,1,0,0,1,1,0,1,0,1,1,0,2,4,2,1,0,1,2,2,1,0,3,1,2,1,0,1,0,1,2,1,1,0,0,0,1,1,3,2,1,3,0,1,1,1,1,0,1,1,1,1,2,0,0,3,2,3,0,3,0,2,2,3,1,0,0,0,1,1,0,1,1,0,1,2,0,2,0,0,0,2,1,0,1,3,2,2,1,0,1,1,0,0,2,2,0,2,1,0,3,3,1,1,1,0,0,0,0,0,1,3,1,1,1,0,0,1,1,3,0,0,2,2,3,0,0,0,0,1,1,1,0,2,2,1,0,0,2,1,1,1,0,1,0,0,1,0,1,0,1,1,1,0,2,0,2,0,2,0,1,0,2,1,1,0,1,2,2,2,1,1,1,1,1,1,1,1,0,2,0,1,0,1,0,1,1,2,0,0,2,0,0,0,0,0,0,2,1,1,0,3,1,2,0,4,0,2,3,1,0,0,1,1,0,2,2,4,1,2,1,0,0,0,0,3,0,0,0,2,1,2,2,1,0,0,2,2,0,3,0,2,4,0,3,0,1,0,1,0,0,0,0,2,2,2,1,3,2,0,0,0,0,3,0,2,0,1,0,1,1,1,2,0,2,3,3,3,0,0,2,1,1,0,0,0,1,0,0,1,3,0,0,2,2,2,0,3,1,2,1,0,0,1,0,0,2,3,0,0,0,3,0,3,2,0,0,0,1,1,0,0,2,0,2,0,3,2,0,1,1,1,0,0,0,2,0,0,2,2,1,1,0,1,1,2,2,0,0,1,0,3,1,3,0,1,1,1,1,2,1,0,1,1,1,2,1,1,0,0,2,0,3,3,0,1,1,0,1,2,0,2,3,0,1,1,2,0,3,1,0,0,4,1,2,1,1,1,0,0,0,1,3,0,2,0,1,0,2,0,0,2,2,0,1,4,2,1,0,3,0,1,1,2,2,1,0,2,0,1,2,1,0,1,3,3,1,0,0,0,2,2,0,1,1,0,1,2,2,1,0,1,1,0,0,1,2,0,0,0,0,0,2,1,0,3,1,2,0,1,2,0,0,2,0,0,0,0,2,2,3,1,0,0,0,1,0,0,2,2,0,1,0,2,1,4,2,3,0,3,2,3,0,0,0,1,1,1,2,0,1,2,0,2,0,0,0,0,0,1,0,1,1,2,0,0,1,1,0,0,0,4,0,2,1,2,0,2,3,2,2,0,0,0,2,1,1,1,0,0,0,3,1,2,0,1,2,0,0,1,0,3,0,1,3,1,2,0,2,0,1,1,2,1,1,1,3,2,0,1,0,0,1,0,0,0,0,1,2,1,1,1,0,0,0,2,1,2,1,1,3,0,1,1,0,1,1,1,0,2,1,2,0,1,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,4,0,1,0,2,0,3,2,3,1,1,0,1,1,1,0,0,2,1,1,0,2,0,0,2,0,0,1,4,0,0,1,2,1,2,1,1,0,1,2,0,0,0,1,1,0,2,3,2,0,1,0,0,0,2,1,0,0,1,1,1,1,1,0,0,0,1,2,0,1,1,1,2,0,0,0,1,1,1,1,3,2,0,1,1,1,2,0,2,2,0,1,2,0,1,0,0,2,1,1,2,0,0,2,0,0,0,0,0,2,2,0,0,2,1,0,2,0,2,0,0,0,1,0,1,0,0,2,1,3,2,0,0,0,0,3,0,2,2,1,1,1,0,2,2,1,1,0,1,2,0,2,0,1,2,1,0,0,1,1,2,2,1,0,1,3,1,1,0,2,2,2,1,0,2,1,1,1,0,1,1,0,2,2,1,2,1,1,1,1,0,2,2,2,1,0,3,1,0,0,2,1,2,0,0,2,1,3,1,2,1,1,1,2,0,0,0,0,0,1,0,3,1,1,0,1,1,0,1,0,1,0,0,1,2,0,2,0,1,1,2,0,1,2,2,1,5,1,0,1,1,0,2,0,2,2,1,0,2,0,0,2,2,1,0,0,0,0,2,1,0,1,0,0,1,1,2,0,1,1,1,1,0,0,0,2,1,0,0,2,1,2,0,0,0,0,1,0,1,1,0,2,2,1,0,0,2,0,0,2,1,0,1,1,0,5,1,0,1,1,2,2,1,0,2,0,1,1,0,5,1,0,4,1,1,0,0,0,2,0,0,0,1,0,1,1,0,3,2,0,1,1,0,1,1,2,0,0,0,2,1,0,3,1,1,0,0,0,1,2,1,0,1,1,2,2,0,0,3,1,0,0,1,2,2,1,2,0,2,1,1,2,1,0,0,0,0,1,1,0,0,2,0,1,2,1,0,0,2,2,2,1,3,1,0,0,1,1,0,0,1,2,1,1,5,2,1,3,0,0,1,3,1,1,1,0,0,0,0,1,1,2,0,1,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,0,2,0,0,1,0,1,1,0,0,4,0,1,0,3,1,2,1,1,0,0,3,1,2,1,0,1,1,0,0,0,3,2,2,0,0,1,1,3,1,1,1,2,0,2,3,0,0,2,1,3,3,0,2,1,1,1,1,1,1,1,1,0,0,0,3,0,1,3,3,1,0,1,1,1,1,1,0,1,2,2,3,1,1,1,0,0,2,2,4,0,1,1,0,0,1,0,1,4,2,1,1,0,2,0,0,1,1,0,1,0,0,4,0,0,0,2,0,0,0,0,0,2,0,0,3,0,0,0,0,1,1,0,0,0,2,0,0,2,0,2,1,1,0,0,0,1,2,3,1,1,1,0,0,2,2,0,1,1,0,0,1,0,1,0,0,0,1,4,0,0,1,0,1,0,1,1,0,0,1,1,1,1,2,2,2,3,2,3,0,1,1,1,0,1,0,2,2,2,1,1,0,1,1,1,1,0,3,0,0,1,0,0,0,1,1,0,0,0,1,1,0,1,0,2,0,2,1,0,0,1,1,1,0,1,0,0,2,3,0,1,1,1,1,0,1,2,5,0,1,0,1,4,2,3,3,0,0,0,1,4,0,1,0,2,2,0,1,3,1,0,0,0,0,2,1,4,1,0,1,1,4,1,1,2,1,2,1,1,1,2,2,1,2,1,2,2,1,0,1,0,1,0,0,1,2,2,1,0,1,1,0,2,0,1,0,3,0,0,0,2,1,0,1,4,1,1,2,2,0,0,0,1,1,0,2,0,1,1,0,1,1,0,0,1,1,0,0,0,2,0,0,0,1,1,1,1,0,1,1,0,1,1,3,0,0,1,1,1,0,3,2,2,1,0,1,4,2,0,0,0,1,1,0,0,2,0,0,4,0,1,2,0,1,1,2,2,0,1,2,0,0,2,0,1,1,1,0,2,1,1,2,1,3,1,0,0,0,1,1,1,2,0,1,1,0,2,1,2,1,1,2,0,0,1,0,3,0,2,2,2,2,0,2,3,0,2,1,0,4,3,0,2,0,0,1,1,1,2,1,0,3,1,2,1,0,2,0,1,3,1,1,0,1,0,0,0,1,0,1,1,1,1,1,3,2,1,0,2,0,3,0,2,2,1,1,1,1,2,0,2,1,1,1,1,1,0,1,2,1,1,1,1,1,0,0,0,0,1,0,1,1,1,0,1,3,1,0,0,0,0,2,0,2,1,1,0,0,2,0,2,0,0,3,1,1,0,0,0,3,1,2,0,2,1,1,2,0,0,2,0,2,1,1,2,1,2,0,1,1,0,4,0,2,0,0,1,1,1,5]},{"counters":[3,2,1,2,0,2,1,2,2,0,0,1,2,1,0,1,0,1,2,0,4,1,0,4,1,1,1,0,0,1,4,0,0,1,1,3,1,1,2,4,0,2,0,1,1,0,0,0,0,2,2,0,0,0,1,0,0,0,2,1,1,1,0,0,2,1,2,1,2,1,2,1,0,0,1,1,2,1,1,1,3,0,0,1,2,1,1,2,2,2,0,0,0,3,2,1,1,2,0,0,0,1,2,1,0,2,1,0,2,0,1,2,2,0,1,0,3,1,1,1,2,1,0,1,1,2,2,0,1,1,1,1,1,0,2,1,1,0,1,2,0,1,1,0,1,0,3,0,0,0,2,1,0,1,1,2,3,0,0,1,1,1,1,1,2,1,0,2,0,1,0,0,1,2,0,0,0,0,1,0,1,1,0,0,0,3,1,0,1,2,2,0,1,1,0,3,2,1,0,0,0,1,0,0,2,0,0,1,0,1,0,0,2,0,0,1,1,1,2,0,1,0,1,3,0,2,2,2,1,4,1,0,0,2,0,2,2,2,1,1,0,0,1,0,0,0,1,0,0,1,3,0,0,0,0,0,0,1,0,2,0,1,1,3,1,1,0,2,0,0,1,1,2,3,1,1,2,2,0,1,1,1,2,1,1,1,1,1,1,0,0,3,1,1,0,2,0,0,2,0,4,0,0,1,0,2,0,0,0,2,2,1,1,1,2,2,0,0,2,2,0,1,1,0,1,1,1,0,0,1,0,1,4,0,0,1,0,1,1,1,2,0,1,1,0,1,1,2,0,0,0,5,2,1,0,0,0,0,1,1,1,2,1,1,1,2,0,0,0,1,1,0,2,1,2,1,1,0,2,2,0,0,0,2,1,1,0,0,0,2,0,0,0,1,1,1,0,1,1,2,1,0,1,0,2,0,1,0,0,0,2,0,2,0,1,0,2,0,3,1,1,0,0,5,3,1,0,1,1,2,2,1,1,2,3,0,1,2,1,2,2,2,1,1,0,2,2,2,2,1,1,0,1,1,1,0,0,0,1,0,1,1,0,0,0,0,2,0,0,1,1,1,0,0,0,2,1,1,0,1,0,1,2,0,0,0,1,1,0,1,1,0,0,2,3,0,0,3,0,1,1,1,1,1,0,0,3,0,2,2,0,2,0,0,0,1,0,2,0,1,2,0,0,1,2,0,0,0,2,2,0,1,2,1,0,3,1,0,1,0,0,0,0,1,0,0,2,2,1,1,0,0,2,1,3,3,2,2,0,0,0,1,1,2,1,3,1,1,1,0,0,0,1,0,1,2,0,0,2,0,0,0,0,0,1,3,2,2,1,0,1,0,2,4,2,0,0,0,0,2,1,0,1,2,1,2,3,0,0,1,2,3,2,2,0,2,0,1,3,0,2,3,4,1,1,3,1,0,1,2,0,0,1,0,1,1,1,1,0,3,2,2,0,0,0,0,1,1,1,2,1,2,0,2,2,0,1,1,1,0,4,1,1,0,0,1,1,0,2,1,1,0,2,1,0,0,2,1,0,1,0,0,2,1,1,0,0,1,2,0,1,0,1,0,1,1,1,1,1,1,3,2,0,0,2,3,2,0,1,2,1,1,0,1,0,2,0,0,0,3,6,0,1,0,0,2,0,2,1,2,1,0,0,0,1,0,1,0,0,1,1,0,0,2,1,2,0,0,3,1,1,1,2,1,1,0,0,0,0,0,0,1,1,1,0,1,1,0,0,0,3,0,2,2,3,1,0,1,1,2,1,1,1,1,2,0,2,1,2,0,0,2,1,0,0,2,0,0,3,1,1,0,1,2,2,2,2,0,2,1,1,2,0,3,1,0,3,4,4,0,0,2,5,0,1,0,1,0,1,1,1,0,0,1,1,0,2,0,2,0,1,1,2,2,3,1,1,1,1,2,1,0,1,1,2,1,1,0,0,0,3,0,1,1,2,0,0,1,0,0,0,0,0,1,3,0,2,1,1,0,1,1,1,2,1,0,1,2,2,1,2,1,1,0,0,0,0,1,1,1,0,2,1,0,1,0,1,2,1,1,0,0,0,1,2,0,2,2,0,0,1,1,0,1,1,1,1,1,1,3,2,2,0,1,2,2,1,0,2,0,1,0,0,1,0,1,1,0,2,0,0,1,0,3,1,0,1,1,3,3,3,1,1,3,1,0,0,1,3,0,0,1,0,0,1,1,1,1,1,0,0,0,0,1,2,0,2,1,0,2,1,1,1,0,1,2,0,2,0,0,0,0,1,0,0,1,2,1,1,0,1,1,0,1,1,0,2,2,1,0,2,0,1,1,1,3,2,0,0,0,2,0,1,0,2,0,2,3,0,0,0,2,0,1,0,1,0,1,1,1,0,1,2,1,3,1,1,3,0,0,1,1,1,1,2,0,1,0,0,0,0,0,4,1,0,4,0,2,2,2,1,1,3,1,0,1,0,1,0,1,1,0,0,1,0,3,1,1,1,2,0,1,1,0,0,1,1,0,0,0,0,3,0,4,1,1,3,1,0,0,0,2,1,0,0,3,0,1,1,3,1,3,0,0,1,2,0,0,0,1,2,2,0,0,1,1,2,1,0,2,2,0,0,1,0,2,0,0,1,1,1,0,2,2,0,0,1,0,0,0,2,2,0,1,1,1,0,3,0,1,1,2,2,3,0,0,2,0,0,1,0,2,1,2,0,1,0,1,1,0,2,2,1,2,0,1,1,1,0,0,1,0,1,0,0,1,0,3,0,2,1,2,0,1,1,1,2,3,2,1,1,1,0,4,1,1,2,1,0,0,5,0,0,0,0,1,2,0,0,0,1,3,2,1,1,1,2,2,1,2,1,1,0,3,2,1,0,1,0,0,1,1,0,1,2,0,1,3,0,3,0,0,2,0,1,3,0,1,1,0,0,2,0,0,2,2,2,1,0,0,1,0,1,2,1,1,0,2,1,1,1,0,1,3,2,0,1,0,0,0,1,3,1,0,1,3,1,2,1,0,1,0,0,0,1,3,2,1,3,1,1,1,1,1,1,0,0,2,0,1,0,1,0,2,2,1,1,1,0,0,1,1,0,2,0,2,1,0,2,0,1,0,0,0,1,2,0,0,0,2,2,0,0,0,0,0,1,0,1,0,1,1,1,0,1,2,1,2,2,1,0,1,0,0,1,2,1,0,2,0,2,3,3,0,1,1,0,1,2,0,0,2,2,2,0,1,1,0,0,1,2,0,0,1,2,0,1,1,3,1,0,1,1,1,0,0,1,2,2,3,3,0,0,0,0,1,1,1,1,1,1,2,1,3,3,2,1,4,0,0,0,2,2,1,0,0,2,0,0,1,0,2,1,0,0,1,3,2,1,0,1,1,1,1,0,1,1,0,1,0,2,0,0,0,0,1,2,1,1,2,0,1,0,1,1,0,1,0,0,0,1,1,1,3,0,0,1,1,1,0,2,1,1,0,2,0,0,2,1,0,0,2,2,2,0,0,0,1,1,2,1,0,1,2,3,0,0,1,2,0,2,0,2,2,2,1,0,2,0,3,2,2,2,1,1,1,2,1,3,0,0,0,1,0,0,0,1,1,1,0,1,0,3,0,3,2,0,1,0,0,1,0,0,0,2,0,1,0,2,0,2,0,1,0,1,0,0,4,4,0,2,2,2,2,0,0,2,0,2,2,0,5,0,0,0,1,2,0,1,3,0,0,0,0,1,1,4,0,2,1,1,1,0,1,2,0,1,0,2,2,2,0,1,0,0,0,0,1,4,0,2,2,0,0,1,0,1,1,0,0,1,0,1,2,0,3,3,1,1,1,1,1,3,0,0,3,0,5,3,0,0,0,0,1,1,1,0,2,1,0,2,1,4,1,0,0,4,1,0,0,1,1,1,1,1,1,0,0,2,1,2,1,2,0,1,0,0,2,3,0,1,2,2,0,1,1,0,1,0,1,1,2,2,0,1,1,1,0,3,1,2,0,0,1,0,2,2,0,2,0,2,1,2,0,1,3,4,1,2,0,0,2,1,1,1,3,1,1,0,0,1,1,2,0,2,2,2,0,1,1,2,1,0,2,1,1,0,1,1,2,0,1,0,0,0,1,1,0,1,0,1,3,2,1,1,0,1,0,1,1,0,0,1,0,1,2,3,1,2,2,0,2,1,0,2,0,2,0,2,0,1,0,0,0,1,0,2,3,2,0,0,2,0,1,1,1,0,0,1,0,1,0,0,1,2,0,1,1,1,0,0,0,0,0,1,1,0,2,1,0,2,1,1,1,1,3,0,3,2,2,2,0,2,0,0,2,1,0,1,0,3,0,2,2,0,1,0,2,0,1,0,0,2,1,1,0,0,2,0,1,0,0,2,0,1,3,3,0,0,1,3,3,0,1,1,2,1,1,0,0,2,1,0,2,0,0,1,5,0,1,4,0,1,1,0,1,2,1,2,0,1,4,3,0,3,0,0,3,2,1,3,0,1,1,0,0,1,0,1,1,2,1,2,1,1,1,0,0,0,1,0,1,1,0,2,2,2,2,1,3,1,1,0,0,0,1,2,1,1,2,1,0,2,1,2,0,1,0,1,2,0,1,1,0,0,0,0,1,1,1,3,0,2,2,1,0,2,1]}]},"null_count":0,"last_update_version":397952040062156800},"pc":{"histogram":{"ndv":1876,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MDFqaXJERg==","repeats":1},{"count":16,"lower_bound":"MDlReDdx","upper_bound":"MFBHWm0y","repeats":1},{"count":24,"lower_bound":"MFIzS0ZQbWo=","upper_bound":"MFppWDBhUEQ=","repeats":1},{"count":32,"lower_bound":"MGV6OVk=","upper_bound":"MHJJekE=","repeats":1},{"count":40,"lower_bound":"MHJtdWxOdUNn","upper_bound":"MQ==","repeats":1},{"count":48,"lower_bound":"MTA2b1J3NDE2dw==","upper_bound":"MUha","repeats":1},{"count":56,"lower_bound":"MUxaem4=","upper_bound":"MU8=","repeats":1},{"count":64,"lower_bound":"MVM=","upper_bound":"MVdQ","repeats":1},{"count":72,"lower_bound":"MVdTcw==","upper_bound":"MWdkdnA5Zw==","repeats":1},{"count":80,"lower_bound":"MWk=","upper_bound":"MW00aVMyR1pP","repeats":1},{"count":88,"lower_bound":"MW1BeE51OEdl","upper_bound":"MXljSlc=","repeats":1},{"count":96,"lower_bound":"Mg==","upper_bound":"MjY=","repeats":1},{"count":104,"lower_bound":"Mjdk","upper_bound":"MlI0cWx5dXo=","repeats":1},{"count":112,"lower_bound":"Mlc=","upper_bound":"MnQ=","repeats":1},{"count":120,"lower_bound":"Mnk=","upper_bound":"M0JyVFlBVw==","repeats":1},{"count":128,"lower_bound":"M0dBa0w=","upper_bound":"M1F3UE13cQ==","repeats":1},{"count":136,"lower_bound":"M1VCQlI3VjI=","upper_bound":"M2RN","repeats":1},{"count":144,"lower_bound":"M2RqMGdxaA==","upper_bound":"M25pejdsMWpDWQ==","repeats":1},{"count":152,"lower_bound":"M3hZRkNNTkNG","upper_bound":"NDZSeHZRTQ==","repeats":1},{"count":160,"lower_bound":"NE4=","upper_bound":"NGlSWlBT","repeats":1},{"count":168,"lower_bound":"NGlwY2w=","upper_bound":"NHZyY1EyUW4=","repeats":1},{"count":176,"lower_bound":"NHg1MkVBTmNLcg==","upper_bound":"NTUw","repeats":1},{"count":184,"lower_bound":"NTY=","upper_bound":"NUM=","repeats":1},{"count":192,"lower_bound":"NUM5QUZnZmRydA==","upper_bound":"NUxZVGVxd0MxTg==","repeats":1},{"count":200,"lower_bound":"NUx2","upper_bound":"NVJoWEQ=","repeats":1},{"count":208,"lower_bound":"NVY4Mll0Ng==","upper_bound":"NWo=","repeats":1},{"count":216,"lower_bound":"NWthbUdrdFM0","upper_bound":"NXI4V3puaEEwTA==","repeats":1},{"count":224,"lower_bound":"Ng==","upper_bound":"Njc=","repeats":1},{"count":232,"lower_bound":"NkE4","upper_bound":"Nk91MkZ1STk1","repeats":1},{"count":240,"lower_bound":"NlNQZGVT","upper_bound":"NmxJZUs=","repeats":1},{"count":248,"lower_bound":"Nm0z","upper_bound":"Nzd3ZA==","repeats":1},{"count":256,"lower_bound":"NzhrbQ==","upper_bound":"N1RZUkF6","repeats":1},{"count":264,"lower_bound":"N2RiNU41Smk=","upper_bound":"N29ieU9PNA==","repeats":1},{"count":272,"lower_bound":"OA==","upper_bound":"OEEzb1I5dW9P","repeats":1},{"count":280,"lower_bound":"OEF0dmQ=","upper_bound":"OEZKUHZrag==","repeats":1},{"count":288,"lower_bound":"OEdy","upper_bound":"OFdjZQ==","repeats":1},{"count":296,"lower_bound":"OFh6","upper_bound":"OGhVUw==","repeats":1},{"count":304,"lower_bound":"OGhkREFieHk=","upper_bound":"OHJSTDU=","repeats":1},{"count":314,"lower_bound":"OHJkMkM4YQ==","upper_bound":"OQ==","repeats":3},{"count":322,"lower_bound":"OUdYTWt2MnRj","upper_bound":"OWNrNWFvdGt6","repeats":1},{"count":330,"lower_bound":"OWRSZw==","upper_bound":"OWpqaWJGemVLbQ==","repeats":1},{"count":338,"lower_bound":"OWxw","upper_bound":"OXh3NGhQbEY=","repeats":1},{"count":346,"lower_bound":"OXk1Nng0dFFo","upper_bound":"QTlXUlZMNmZZSw==","repeats":1},{"count":354,"lower_bound":"QUI1","upper_bound":"QUdXY0lGaGRQ","repeats":1},{"count":362,"lower_bound":"QUw1b2Q=","upper_bound":"QVFNajBX","repeats":1},{"count":370,"lower_bound":"QVFy","upper_bound":"QVZqTTIxN2l1","repeats":1},{"count":378,"lower_bound":"QWFHSQ==","upper_bound":"QWNFYko5Vg==","repeats":1},{"count":386,"lower_bound":"QWNRU0FuMG95Vg==","upper_bound":"QWlEQ3BKWXJjSQ==","repeats":1},{"count":394,"lower_bound":"QW56NDJR","upper_bound":"QkY=","repeats":1},{"count":402,"lower_bound":"QkZweVRxYQ==","upper_bound":"QlBQ","repeats":1},{"count":410,"lower_bound":"QlREN0Yx","upper_bound":"Qm9BZEM=","repeats":1},{"count":420,"lower_bound":"QnFCMmNWb0lX","upper_bound":"Qw==","repeats":3},{"count":428,"lower_bound":"QzBVYW1HZ2NG","upper_bound":"Q040SjlPbnA=","repeats":1},{"count":436,"lower_bound":"Q05raU5qYzV2","upper_bound":"Q2R0eQ==","repeats":1},{"count":444,"lower_bound":"Q2lKeGZIQw==","upper_bound":"Q3RJdQ==","repeats":1},{"count":452,"lower_bound":"RA==","upper_bound":"REc0dA==","repeats":1},{"count":460,"lower_bound":"REh1RG1qV2VJUw==","upper_bound":"RGRxZg==","repeats":1},{"count":468,"lower_bound":"RGd4ZzVIdUk=","upper_bound":"RHRDRHJv","repeats":1},{"count":476,"lower_bound":"RTQ5TkJJTnNGdg==","upper_bound":"RUpqVFNKR1lFeA==","repeats":1},{"count":484,"lower_bound":"RU55T1JDZXk=","upper_bound":"RVc=","repeats":1},{"count":492,"lower_bound":"RWFXVg==","upper_bound":"RWhsTA==","repeats":1},{"count":500,"lower_bound":"RXBEREp3Uw==","upper_bound":"Rg==","repeats":1},{"count":508,"lower_bound":"RjV2","upper_bound":"RkIzYkY=","repeats":1},{"count":516,"lower_bound":"RkJo","upper_bound":"Rk16ckpiN0Y=","repeats":1},{"count":524,"lower_bound":"Rk9m","upper_bound":"RmdnM0kzSA==","repeats":1},{"count":532,"lower_bound":"RmhhVlZ3cQ==","upper_bound":"Rm9Ddg==","repeats":1},{"count":540,"lower_bound":"Rm9U","upper_bound":"RnRPVnBvanVSSA==","repeats":1},{"count":548,"lower_bound":"Rnk=","upper_bound":"RzE=","repeats":1},{"count":556,"lower_bound":"Rzl1Tw==","upper_bound":"R0ZLR0M=","repeats":1},{"count":564,"lower_bound":"R0h5OHZU","upper_bound":"R045akcyYkk=","repeats":1},{"count":572,"lower_bound":"R1Ju","upper_bound":"R2o=","repeats":1},{"count":580,"lower_bound":"R3JZc1o=","upper_bound":"R3l2MTRhV3Fy","repeats":1},{"count":588,"lower_bound":"R3l3VFZxY25Saw==","upper_bound":"SERiMm94","repeats":1},{"count":596,"lower_bound":"SFBZTVVXUEFnOQ==","upper_bound":"SHJmaQ==","repeats":1},{"count":604,"lower_bound":"SHRZTXR5OFJX","upper_bound":"STFPUGUyTw==","repeats":1},{"count":612,"lower_bound":"STh6Wg==","upper_bound":"SVI=","repeats":1},{"count":620,"lower_bound":"SW1kRlh1TVl0eA==","upper_bound":"SjRVS0lacEV2","repeats":1},{"count":628,"lower_bound":"SjU=","upper_bound":"SkV6N1VDdnA1ag==","repeats":1},{"count":636,"lower_bound":"SkZrVw==","upper_bound":"Sk1zdTM0UA==","repeats":1},{"count":644,"lower_bound":"SlA1N29a","upper_bound":"SmE5","repeats":1},{"count":652,"lower_bound":"SmJEMg==","upper_bound":"SnB2UnB3VmFr","repeats":1},{"count":660,"lower_bound":"SnJXdkx6dnoy","upper_bound":"SnlWZTMwWWRI","repeats":1},{"count":668,"lower_bound":"SzBoajc2cQ==","upper_bound":"S0MyTGVO","repeats":1},{"count":676,"lower_bound":"S0ZwQTMxdQ==","upper_bound":"S1lBY0M=","repeats":1},{"count":684,"lower_bound":"S2dLS0o2","upper_bound":"S3hsUHJo","repeats":1},{"count":692,"lower_bound":"TA==","upper_bound":"TDUzcU4=","repeats":1},{"count":700,"lower_bound":"TEF2R1B6cEU=","upper_bound":"TFRQbDUxdVJOSA==","repeats":1},{"count":716,"lower_bound":"TFRSamlwcDE=","upper_bound":"TQ==","repeats":9},{"count":724,"lower_bound":"TTBGS1p4RHQ=","upper_bound":"TTJVTg==","repeats":1},{"count":732,"lower_bound":"TTk=","upper_bound":"TVE=","repeats":1},{"count":740,"lower_bound":"TVdMZkFTNw==","upper_bound":"TWxZUmQ=","repeats":1},{"count":748,"lower_bound":"TXI=","upper_bound":"TXZRMDRVanpV","repeats":1},{"count":756,"lower_bound":"Tg==","upper_bound":"TkRKaFQx","repeats":1},{"count":764,"lower_bound":"TkU=","upper_bound":"Tk5wN1paRg==","repeats":1},{"count":772,"lower_bound":"TlU5VQ==","upper_bound":"TmlueWF1NHhr","repeats":1},{"count":780,"lower_bound":"Tm5WMHZhYmI=","upper_bound":"Tnd4","repeats":1},{"count":788,"lower_bound":"Tw==","upper_bound":"TzVs","repeats":1},{"count":796,"lower_bound":"T0Q=","upper_bound":"T1A4bU1U","repeats":1},{"count":804,"lower_bound":"T1VBUQ==","upper_bound":"T2VUSHZIVQ==","repeats":1},{"count":812,"lower_bound":"T2V3NEg=","upper_bound":"T3Mz","repeats":1},{"count":820,"lower_bound":"T3NmSHViSUN2","upper_bound":"UA==","repeats":1},{"count":828,"lower_bound":"UDJCZ2RjT1Na","upper_bound":"UDhN","repeats":1},{"count":836,"lower_bound":"UEE2SFpQ","upper_bound":"UEpiQQ==","repeats":1},{"count":844,"lower_bound":"UFF0Y0xpV1VJcw==","upper_bound":"UGJUT3k=","repeats":1},{"count":852,"lower_bound":"UGhrYU4xS3BGcw==","upper_bound":"UGo1MG00eDg=","repeats":1},{"count":860,"lower_bound":"UGpIVQ==","upper_bound":"UHJQZks=","repeats":1},{"count":868,"lower_bound":"UQ==","upper_bound":"UQ==","repeats":7},{"count":876,"lower_bound":"UTE4RUpvdUg=","upper_bound":"UTV6cnhzWg==","repeats":1},{"count":884,"lower_bound":"UUZrb3RkSE5vMQ==","upper_bound":"UU8z","repeats":1},{"count":892,"lower_bound":"UU9nWGlT","upper_bound":"UWE=","repeats":1},{"count":900,"lower_bound":"UW40UVpZZg==","upper_bound":"UXVJYXh5djE=","repeats":1},{"count":908,"lower_bound":"UXliMXNLa0dC","upper_bound":"UjI=","repeats":1},{"count":916,"lower_bound":"UjV2SjhzdnRK","upper_bound":"UkJMS2xG","repeats":1},{"count":924,"lower_bound":"UkRiUTF2UTVI","upper_bound":"UmRtaw==","repeats":1},{"count":932,"lower_bound":"UmxWcU5PWk1o","upper_bound":"UnlPdQ==","repeats":1},{"count":940,"lower_bound":"Uw==","upper_bound":"U0FM","repeats":1},{"count":948,"lower_bound":"U0I=","upper_bound":"U2I2Wg==","repeats":1},{"count":956,"lower_bound":"U2s=","upper_bound":"VA==","repeats":1},{"count":964,"lower_bound":"VDRMeXNu","upper_bound":"VFA3YmlwMkcxeg==","repeats":1},{"count":972,"lower_bound":"VFBSbEk=","upper_bound":"VGNySGM1","repeats":1},{"count":980,"lower_bound":"VGd0RUxQODVq","upper_bound":"VHU=","repeats":1},{"count":988,"lower_bound":"VQ==","upper_bound":"VTk=","repeats":1},{"count":996,"lower_bound":"VUFZMVd5M1p3dw==","upper_bound":"VWNMQVhHdw==","repeats":1},{"count":1004,"lower_bound":"VWVZZ09k","upper_bound":"VXI1cFVPUE9GUA==","repeats":1},{"count":1012,"lower_bound":"VXp2UA==","upper_bound":"VjVpQWg1elNo","repeats":1},{"count":1020,"lower_bound":"VkNrT2VaOXVTcQ==","upper_bound":"VllCVQ==","repeats":1},{"count":1028,"lower_bound":"VmJNbA==","upper_bound":"VmlhOEhFSkRnNA==","repeats":1},{"count":1036,"lower_bound":"VnJyb2d4dQ==","upper_bound":"Vnlmb0Zxbw==","repeats":1},{"count":1044,"lower_bound":"Vnpm","upper_bound":"V0NN","repeats":1},{"count":1052,"lower_bound":"V0RNZ0k=","upper_bound":"V0tiM01xQzY=","repeats":1},{"count":1060,"lower_bound":"V1dFQ0pzVQ==","upper_bound":"V2JGSQ==","repeats":1},{"count":1068,"lower_bound":"V2l2cU92Vg==","upper_bound":"V3lKSkhPbHA2","repeats":1},{"count":1076,"lower_bound":"V3lKWDBC","upper_bound":"WA==","repeats":5},{"count":1084,"lower_bound":"WDM=","upper_bound":"WEM=","repeats":1},{"count":1092,"lower_bound":"WERkakFuZw==","upper_bound":"WGhxbTNmNG5h","repeats":1},{"count":1100,"lower_bound":"WGpoaFJvWHRW","upper_bound":"WHo=","repeats":1},{"count":1108,"lower_bound":"WQ==","upper_bound":"WTdmanVSNjgy","repeats":1},{"count":1116,"lower_bound":"WThyQQ==","upper_bound":"WUha","repeats":1},{"count":1124,"lower_bound":"WUxrTk1PUA==","upper_bound":"WVY4S3Yz","repeats":1},{"count":1132,"lower_bound":"WVZpWlk5aVQ=","upper_bound":"WWQ=","repeats":1},{"count":1140,"lower_bound":"WW5rMw==","upper_bound":"Wjdhc0dM","repeats":1},{"count":1148,"lower_bound":"WkRmcWJ3UDEyTg==","upper_bound":"WlFx","repeats":1},{"count":1156,"lower_bound":"WlNLNQ==","upper_bound":"WmFYbXM=","repeats":1},{"count":1164,"lower_bound":"YQ==","upper_bound":"YUx0aDBsZ0U5","repeats":1},{"count":1172,"lower_bound":"YU1kb20zeg==","upper_bound":"YVRVeHFSa2dL","repeats":1},{"count":1180,"lower_bound":"YVVNZlVp","upper_bound":"YWdw","repeats":1},{"count":1188,"lower_bound":"YXBZ","upper_bound":"Yjk=","repeats":1},{"count":1196,"lower_bound":"YjlBemVL","upper_bound":"YlFEYVI0V2s=","repeats":1},{"count":1204,"lower_bound":"YldiRHcyeU9P","upper_bound":"YmFoRw==","repeats":1},{"count":1212,"lower_bound":"YmN4TDlVSQ==","upper_bound":"YnhVRmM1","repeats":1},{"count":1220,"lower_bound":"Yw==","upper_bound":"YzJyTg==","repeats":1},{"count":1228,"lower_bound":"YzY=","upper_bound":"Y0Rq","repeats":1},{"count":1236,"lower_bound":"Y0VVYmM=","upper_bound":"Y1BubGZSdg==","repeats":1},{"count":1244,"lower_bound":"Y1J1MlY=","upper_bound":"Y2VzbA==","repeats":1},{"count":1252,"lower_bound":"Y3A4Qg==","upper_bound":"Y3gxY0ZoOTM0cA==","repeats":1},{"count":1260,"lower_bound":"ZA==","upper_bound":"ZDYzaU9vbUpI","repeats":1},{"count":1268,"lower_bound":"ZDc=","upper_bound":"ZFVG","repeats":1},{"count":1276,"lower_bound":"ZFc=","upper_bound":"ZGczb3JC","repeats":1},{"count":1284,"lower_bound":"ZGszTQ==","upper_bound":"ZHU5MjFt","repeats":1},{"count":1292,"lower_bound":"ZHd2MzhBazk=","upper_bound":"ZHll","repeats":1},{"count":1300,"lower_bound":"ZQ==","upper_bound":"ZTJJSEtGSw==","repeats":1},{"count":1308,"lower_bound":"ZTVFMlRVNg==","upper_bound":"ZVp1SldaTzls","repeats":1},{"count":1316,"lower_bound":"ZWNXWG8=","upper_bound":"ZW1GNzI2SA==","repeats":1},{"count":1324,"lower_bound":"ZXNYVlF3","upper_bound":"Zjd6MVpUeTRjNA==","repeats":1},{"count":1332,"lower_bound":"ZkFQ","upper_bound":"ZkV5Sw==","repeats":1},{"count":1340,"lower_bound":"Zk43WQ==","upper_bound":"ZlM0NW0=","repeats":1},{"count":1348,"lower_bound":"ZlVVUFVSbHo=","upper_bound":"Zm1KRkkzM1ByUA==","repeats":1},{"count":1356,"lower_bound":"Zm1ablA0akxpbw==","upper_bound":"ZnpnRW8=","repeats":1},{"count":1364,"lower_bound":"Zw==","upper_bound":"ZzZqc2Vo","repeats":1},{"count":1372,"lower_bound":"Zzg0T1JD","upper_bound":"Z0lRTUl1Zw==","repeats":1},{"count":1380,"lower_bound":"Z1EybEFlbVE=","upper_bound":"Z3BNTTB3WTM=","repeats":1},{"count":1388,"lower_bound":"Z3Jx","upper_bound":"aA==","repeats":1},{"count":1396,"lower_bound":"aDhDZHg=","upper_bound":"aEl6aTFX","repeats":1},{"count":1404,"lower_bound":"aFBZ","upper_bound":"aGQ=","repeats":1},{"count":1412,"lower_bound":"aGc=","upper_bound":"aHVLeHp5cg==","repeats":1},{"count":1420,"lower_bound":"aHdTVks=","upper_bound":"aTA=","repeats":1},{"count":1428,"lower_bound":"aTBSVDBvM2Fm","upper_bound":"aUxqdW01ekVabw==","repeats":1},{"count":1436,"lower_bound":"aVJVd3I=","upper_bound":"aW1TanA=","repeats":1},{"count":1444,"lower_bound":"aW5DNA==","upper_bound":"ajA1","repeats":1},{"count":1452,"lower_bound":"ajJjWmU=","upper_bound":"aklMcjQy","repeats":1},{"count":1460,"lower_bound":"ako3VmpCbGI=","upper_bound":"amVEMXJaa3NNdA==","repeats":1},{"count":1468,"lower_bound":"amg=","upper_bound":"ang=","repeats":1},{"count":1476,"lower_bound":"aw==","upper_bound":"a0lE","repeats":1},{"count":1484,"lower_bound":"a0l0NE9Z","upper_bound":"a015","repeats":1},{"count":1492,"lower_bound":"a1BNSHRB","upper_bound":"a1ZJMm4=","repeats":1},{"count":1500,"lower_bound":"a1l4bE9ZZlM3","upper_bound":"a21Xb1JnTg==","repeats":1},{"count":1508,"lower_bound":"a25rRDc4cDJHcQ==","upper_bound":"bEg3NQ==","repeats":1},{"count":1516,"lower_bound":"bEhKMg==","upper_bound":"bGNMTTIxNTA=","repeats":1},{"count":1524,"lower_bound":"bGVpREZHaFh4Nw==","upper_bound":"bHU=","repeats":1},{"count":1532,"lower_bound":"bHpV","upper_bound":"bTRzcGM=","repeats":1},{"count":1540,"lower_bound":"bUw=","upper_bound":"bVBGd0R6YQ==","repeats":1},{"count":1548,"lower_bound":"bVM=","upper_bound":"bWk1ODA=","repeats":1},{"count":1556,"lower_bound":"bXQxOGVESWg2","upper_bound":"bjR3","repeats":1},{"count":1564,"lower_bound":"bjZLZEUzZXRH","upper_bound":"bkJERlozUg==","repeats":1},{"count":1572,"lower_bound":"bkNINkxp","upper_bound":"bks3cmk=","repeats":1},{"count":1580,"lower_bound":"bktyaGU5MlozZQ==","upper_bound":"bmF2TUs3V2FCeQ==","repeats":1},{"count":1588,"lower_bound":"bmhURUg=","upper_bound":"bm1odHhadVAxeA==","repeats":1},{"count":1596,"lower_bound":"bnNxREp2VWdN","upper_bound":"bzFl","repeats":1},{"count":1604,"lower_bound":"bzJQT00=","upper_bound":"bzl4YXB4eHdsVw==","repeats":1},{"count":1612,"lower_bound":"b0M=","upper_bound":"b0tP","repeats":1},{"count":1620,"lower_bound":"b0tj","upper_bound":"b2F2aFhqVg==","repeats":1},{"count":1628,"lower_bound":"b2M2NXI=","upper_bound":"b29xaDNlMTA=","repeats":1},{"count":1636,"lower_bound":"b3BkemdEaThV","upper_bound":"cA==","repeats":3},{"count":1644,"lower_bound":"cEM=","upper_bound":"cE8=","repeats":1},{"count":1652,"lower_bound":"cFB0dnJqZmJR","upper_bound":"cGhLZnc=","repeats":1},{"count":1660,"lower_bound":"cG1vcWJlNEts","upper_bound":"cHk3cDVYaDI=","repeats":1},{"count":1668,"lower_bound":"cHl3","upper_bound":"cTM2cFU=","repeats":1},{"count":1676,"lower_bound":"cTVqNQ==","upper_bound":"cVBGMEUyeENuRA==","repeats":1},{"count":1684,"lower_bound":"cVg=","upper_bound":"cWNVVzZIZ2Y=","repeats":1},{"count":1692,"lower_bound":"cWhlWA==","upper_bound":"cXVN","repeats":1},{"count":1700,"lower_bound":"cXZB","upper_bound":"ckpK","repeats":1},{"count":1708,"lower_bound":"clI=","upper_bound":"clYyTFV6QlN4aQ==","repeats":1},{"count":1716,"lower_bound":"clh5Qmo=","upper_bound":"cmdvVnR2VA==","repeats":1},{"count":1724,"lower_bound":"cmk=","upper_bound":"czJm","repeats":1},{"count":1732,"lower_bound":"czJ0bQ==","upper_bound":"c0tabm1jdQ==","repeats":1},{"count":1740,"lower_bound":"c0xZMUVib05J","upper_bound":"c1d3eEU=","repeats":1},{"count":1748,"lower_bound":"c1phSjN0czI=","upper_bound":"c2hM","repeats":1},{"count":1756,"lower_bound":"c29TSFo1cTA=","upper_bound":"dA==","repeats":1},{"count":1764,"lower_bound":"dDJqM2hoa3Y=","upper_bound":"dEJwVzVj","repeats":1},{"count":1772,"lower_bound":"dEdHRmJz","upper_bound":"dGc2cDY=","repeats":1},{"count":1780,"lower_bound":"dG5ESw==","upper_bound":"dHl0SnUzVXhaVQ==","repeats":1},{"count":1788,"lower_bound":"dQ==","upper_bound":"dTd2Zg==","repeats":1},{"count":1796,"lower_bound":"dTlNanNyeEc=","upper_bound":"dVFHWVZLaGg2aw==","repeats":1},{"count":1806,"lower_bound":"dVJo","upper_bound":"dVQ=","repeats":3},{"count":1814,"lower_bound":"dVRGMVQ=","upper_bound":"dVhHSThPRw==","repeats":1},{"count":1822,"lower_bound":"dWo5OW0=","upper_bound":"dWtKaVZN","repeats":1},{"count":1830,"lower_bound":"dW44Q3dUUlQ=","upper_bound":"dXhLTWpYMg==","repeats":1},{"count":1838,"lower_bound":"dg==","upper_bound":"djUyYXNMakU=","repeats":1},{"count":1846,"lower_bound":"djVyNkpWV0lt","upper_bound":"dklOUFhINDU=","repeats":1},{"count":1854,"lower_bound":"dk11S3BhWA==","upper_bound":"dlV6VQ==","repeats":1},{"count":1862,"lower_bound":"dlpSUXJj","upper_bound":"dnFw","repeats":1},{"count":1870,"lower_bound":"dnI=","upper_bound":"dzVPblFreQ==","repeats":1},{"count":1878,"lower_bound":"dzVxTHQ=","upper_bound":"d0dF","repeats":1},{"count":1886,"lower_bound":"d081NFFFNlY=","upper_bound":"d1FkV1VIS0l6","repeats":1},{"count":1894,"lower_bound":"d1RYdzZscVA=","upper_bound":"d2pDQktIVWhi","repeats":1},{"count":1902,"lower_bound":"d285am4wanM=","upper_bound":"eA==","repeats":1},{"count":1910,"lower_bound":"eDQ5ZHU2RDA=","upper_bound":"eEs=","repeats":1},{"count":1918,"lower_bound":"eEtG","upper_bound":"eFlxdQ==","repeats":1},{"count":1926,"lower_bound":"eFpzdw==","upper_bound":"eGo=","repeats":1},{"count":1938,"lower_bound":"eG50QjZHNXQ0","upper_bound":"eQ==","repeats":7},{"count":1946,"lower_bound":"eTFEcA==","upper_bound":"eUVMT0szbTQ4MQ==","repeats":1},{"count":1954,"lower_bound":"eUlXVTlZTEI=","upper_bound":"eU1WTHNv","repeats":1},{"count":1962,"lower_bound":"eVBKaTh5","upper_bound":"eVJrdXRuZWdm","repeats":1},{"count":1970,"lower_bound":"eWFWMw==","upper_bound":"eWZLaW10YQ==","repeats":1},{"count":1978,"lower_bound":"eWdYSA==","upper_bound":"eXhNWA==","repeats":1},{"count":1986,"lower_bound":"eg==","upper_bound":"ejZ2WWprMXk=","repeats":1},{"count":1994,"lower_bound":"ekJqOUFJeQ==","upper_bound":"ek04eEtQVTZsbQ==","repeats":1},{"count":2000,"lower_bound":"elFCZXY=","upper_bound":"enpNWUpMOQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,1,0,0,0,0,0,1,0,0,0,3,0,0,1,3,0,2,1,1,1,1,0,1,2,2,2,0,1,0,1,1,3,1,0,0,2,1,2,0,1,1,0,2,2,0,3,1,1,1,1,1,1,4,0,2,1,1,2,1,0,3,1,1,0,0,2,2,2,0,1,2,1,0,1,1,2,0,0,0,1,1,0,0,1,0,2,0,0,0,2,2,2,0,3,1,1,0,1,1,1,2,0,0,3,3,0,0,1,2,2,2,0,1,1,0,2,0,1,1,1,3,0,1,0,2,0,0,1,0,1,1,0,2,2,1,2,2,1,2,0,1,2,1,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,0,1,1,2,2,1,3,1,2,0,2,0,0,0,2,0,0,0,0,0,1,1,0,0,1,0,1,2,0,0,0,0,0,0,2,1,0,1,3,0,0,1,0,1,2,0,4,0,1,2,1,3,0,0,0,1,0,0,1,0,0,0,0,1,2,0,0,0,1,2,1,0,3,1,2,0,3,1,3,3,0,1,0,2,7,0,1,0,0,0,2,0,2,0,0,0,0,1,0,1,1,0,0,2,0,2,0,1,0,0,1,0,1,0,3,1,0,0,2,0,0,2,1,0,2,1,3,3,2,0,0,1,4,1,0,1,0,1,1,0,1,2,1,1,1,0,0,0,1,0,1,0,1,4,0,2,0,0,2,0,1,1,2,1,4,0,2,0,2,1,0,2,1,0,0,2,0,2,1,3,1,1,1,0,0,0,0,2,1,0,4,1,1,0,1,0,1,0,1,2,0,0,0,0,3,1,1,1,1,0,1,0,1,0,1,1,6,0,1,1,1,0,0,1,0,1,0,2,0,3,0,2,2,1,1,0,0,1,2,3,2,1,1,0,1,0,1,1,1,1,1,0,1,0,1,2,0,0,1,0,1,3,1,1,3,2,1,1,0,0,2,0,1,3,0,0,0,1,0,0,0,1,1,0,1,0,2,2,1,2,2,1,1,1,0,1,0,2,0,1,1,2,0,1,2,1,2,0,0,1,0,1,1,0,2,0,0,0,1,4,0,1,1,0,1,3,2,1,0,1,1,0,1,0,1,0,0,1,1,3,2,1,1,0,1,3,0,1,1,1,0,1,0,1,0,2,1,2,4,0,0,1,0,0,0,0,1,2,1,2,0,2,0,0,0,2,9,1,2,1,0,3,2,1,6,1,1,0,1,2,1,1,3,0,2,1,0,0,1,2,3,1,0,1,1,3,1,0,1,0,1,1,1,0,0,1,1,3,2,0,0,4,0,1,1,1,1,1,0,1,0,0,2,0,1,0,1,3,1,2,2,0,0,1,3,1,1,0,1,2,1,3,1,0,1,1,1,1,2,0,1,1,1,1,1,1,2,0,1,1,0,1,1,3,0,2,1,0,2,1,0,0,1,0,0,1,1,1,1,1,2,1,4,1,0,0,1,2,2,1,1,1,2,1,2,0,3,1,0,1,3,1,4,1,3,4,1,3,3,2,0,1,1,0,2,2,1,1,1,1,1,0,5,0,0,0,2,0,0,1,1,0,1,1,1,0,1,1,2,1,2,0,1,2,1,0,3,1,2,0,0,0,2,0,0,2,2,0,1,0,2,1,0,1,1,0,1,0,0,3,2,1,0,2,1,2,0,1,0,1,2,1,2,2,1,2,2,0,1,2,0,1,0,1,2,0,1,0,0,0,1,1,2,3,1,0,1,3,0,1,0,1,1,0,0,1,1,0,0,3,2,0,0,1,2,1,1,1,0,0,2,0,0,1,0,1,1,0,2,1,0,1,1,0,1,2,1,0,2,1,1,1,0,1,3,1,0,2,1,1,2,1,0,1,1,1,2,1,1,1,1,0,1,1,1,1,2,1,4,0,0,2,2,0,0,0,0,3,0,1,0,2,0,1,0,1,1,1,1,0,0,1,0,1,1,1,2,0,1,2,1,1,1,0,1,1,0,0,2,0,0,0,1,3,2,0,0,1,2,6,1,0,3,2,0,2,4,1,0,1,1,1,0,0,1,1,0,1,1,6,2,1,1,2,2,0,0,0,0,1,0,5,0,3,2,1,1,0,0,0,1,1,1,0,0,1,1,1,0,0,0,2,1,2,1,0,1,1,2,0,0,0,0,1,0,0,1,0,1,1,2,1,2,1,0,0,1,2,1,0,0,2,0,1,2,1,0,1,1,3,0,1,1,2,0,1,2,0,4,0,3,1,0,1,1,0,3,0,1,2,0,1,1,1,3,0,1,2,1,3,1,0,2,2,0,1,0,0,2,1,2,1,3,0,0,3,0,1,0,3,0,3,2,0,2,1,1,0,1,4,2,0,0,0,2,0,1,1,0,0,0,2,0,1,1,1,2,1,1,1,0,1,1,1,2,1,0,0,1,1,2,1,1,9,1,0,1,1,1,1,0,2,0,0,1,3,2,1,1,1,0,1,4,0,1,2,1,2,0,0,0,2,1,1,0,0,0,2,1,1,1,2,1,0,2,1,1,0,0,1,3,0,2,0,0,3,0,2,0,1,1,0,0,0,4,1,0,0,0,0,1,0,2,1,2,0,0,1,1,1,0,1,1,1,0,2,0,3,2,0,3,1,1,1,1,1,0,1,1,2,2,1,1,2,0,2,2,0,1,0,1,1,0,1,1,0,0,2,1,0,1,1,1,1,3,2,0,1,0,1,0,0,2,0,1,1,2,0,0,1,2,0,0,1,0,4,1,0,0,1,0,1,1,0,2,0,2,0,0,0,0,2,2,0,1,0,0,0,0,0,0,0,0,1,1,4,0,0,1,0,2,0,1,0,2,1,1,1,0,0,0,4,0,2,0,0,0,2,1,0,1,0,1,1,0,2,0,1,4,2,0,0,0,2,1,1,0,3,2,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,1,1,0,3,6,2,0,1,2,0,0,2,0,0,0,3,0,0,0,3,1,1,2,0,0,1,0,1,1,1,0,3,3,2,0,2,0,0,1,0,0,0,1,0,1,2,1,1,0,0,0,1,1,0,0,2,1,0,1,0,1,1,2,0,0,1,1,0,1,3,0,0,5,0,0,0,0,1,1,2,2,0,0,0,5,1,0,0,2,3,1,0,0,0,0,0,1,3,2,2,1,1,1,1,2,0,4,0,2,1,1,4,2,1,2,0,1,2,1,1,0,1,1,0,1,1,0,0,2,0,0,2,1,1,0,0,0,1,2,0,0,1,2,0,0,2,1,1,2,0,2,0,0,1,0,0,1,0,1,0,2,0,2,0,1,1,0,0,0,4,0,1,1,1,2,4,1,1,1,2,1,2,1,3,2,2,2,1,1,1,1,0,1,1,0,2,1,0,0,0,1,0,4,0,1,1,0,0,1,1,0,3,1,1,3,0,1,0,0,0,2,3,0,1,1,0,0,1,0,0,0,0,1,1,1,1,0,0,0,1,0,0,2,0,1,0,1,1,3,0,0,0,1,0,0,2,1,0,0,1,0,1,3,0,0,0,1,5,2,0,3,2,1,0,0,1,0,0,2,0,0,1,1,1,1,1,1,0,2,0,2,1,2,0,1,3,0,3,0,3,0,0,0,2,0,3,2,0,0,1,2,5,0,1,1,0,1,2,2,1,0,1,1,1,1,0,1,4,2,0,1,1,1,1,0,0,0,1,0,1,2,0,0,1,2,4,1,1,2,0,1,0,0,0,0,2,0,3,0,0,0,1,1,1,0,1,0,0,0,0,3,1,1,0,1,0,2,0,0,1,2,1,0,2,0,2,1,0,1,0,2,0,1,2,0,0,3,2,0,1,0,3,0,1,0,0,2,0,2,2,0,1,0,0,1,1,1,2,1,0,0,1,0,0,1,1,1,0,3,1,0,2,1,2,0,2,2,0,0,3,2,2,0,0,0,0,3,1,3,0,0,2,0,1,3,0,0,0,1,0,2,0,1,0,0,2,4,0,1,2,1,0,1,0,0,0,1,1,3,1,0,0,1,0,1,0,1,2,3,0,1,1,1,0,0,2,0,9,1,1,1,0,3,2,0,1,4,0,0,0,0,0,0,2,0,1,1,0,1,1,1,0,0,0,3,0,1,0,0,0,0,1,0,5,2,1,0,0,0,1,0,0,1,5,1,1,0,2,1,5,0,1,0,1,2,1,1,1,1,4,1,0,0,2,0,2,1,0,1,1,0,1,0,3,1,1,0,0,1,0,3,2,0,2,1,0,1,3,1,1,0,1,1,1,1,0,1,0,3,0,3,2,1,1,0,0,1,1,0,3,1,1,0,1,0,0,1,0,1,2,0,2,1,1,3,2,2,0,2,1,1,0,2,1,0,1,2,1,0,3,0,1,3,0,0,2,0,2,0,2,1,2,1,1,0,1,5,2,1,2,0,1,1,1,2,1,1,2,0,2,0,1,1,0,0,4,0,1,0,0,0,1,0,0,2,0,1,0,1,0,1,0,3,0,7,5,2,0,1,1,3,1,1,1,1,2,2,0,1,0,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,0,0,1,1,1,0,1,2]},{"counters":[1,0,1,0,0,2,1,0,1,2,5,1,0,0,0,0,1,1,1,3,0,0,0,1,2,0,0,0,1,0,0,2,1,0,1,2,0,2,1,0,3,0,0,0,1,2,1,1,1,0,0,0,2,3,0,2,2,2,2,0,1,0,3,0,1,1,2,2,1,3,0,0,1,3,3,1,2,1,0,0,1,0,0,0,1,0,1,0,2,1,1,0,2,0,0,2,0,0,0,1,1,1,0,4,1,2,3,2,0,0,0,0,0,1,1,0,1,1,1,1,1,3,2,1,0,2,0,1,1,2,0,0,1,0,0,2,1,0,0,0,0,1,0,1,0,0,1,3,0,0,0,0,1,1,3,2,1,1,1,1,0,0,1,1,0,0,1,1,1,2,1,1,0,3,0,0,0,0,0,2,0,4,0,1,1,0,2,0,6,1,1,0,3,2,3,0,1,2,1,0,3,2,0,0,1,0,1,1,3,0,1,1,1,4,0,1,1,1,0,1,0,2,1,0,1,1,0,1,1,0,1,2,1,4,2,0,0,0,3,0,1,1,0,1,0,1,0,2,1,0,1,0,0,2,1,0,1,2,3,2,3,1,1,2,2,1,1,1,0,2,2,1,1,0,0,0,3,1,0,0,1,2,1,0,0,1,2,2,2,2,1,0,1,1,0,1,1,1,1,0,1,1,0,2,1,1,1,0,2,2,1,0,0,0,1,3,0,0,2,1,1,1,1,0,1,0,2,1,0,2,1,0,1,2,0,3,1,0,0,1,1,0,0,1,2,0,2,1,2,2,1,0,2,2,0,0,2,1,1,1,1,2,1,3,2,1,1,1,0,1,0,1,0,0,2,0,1,1,1,1,2,0,2,1,0,1,1,0,0,1,1,1,5,2,1,1,0,0,0,2,1,1,1,0,0,1,1,1,5,0,1,2,1,0,2,1,2,0,1,2,0,0,2,1,1,2,2,1,2,0,0,5,0,3,1,1,2,1,1,0,3,3,0,1,0,2,0,0,4,1,0,2,1,0,0,0,1,0,0,0,0,1,0,0,1,2,3,1,0,1,0,0,1,0,0,1,0,0,3,1,1,1,0,3,3,0,0,2,2,0,2,2,1,2,0,0,0,2,0,0,2,0,0,1,0,0,1,0,2,0,0,0,1,2,4,1,0,0,1,0,0,2,0,1,1,1,1,2,0,0,1,1,0,2,3,1,0,0,0,0,1,0,1,5,0,1,1,2,0,1,0,2,0,0,1,1,3,0,1,0,2,1,1,2,2,5,0,0,1,2,2,0,0,1,2,1,0,0,2,1,0,1,3,0,1,2,1,0,0,0,1,0,0,1,2,2,2,2,1,2,0,0,3,0,0,1,2,1,0,5,0,0,0,2,0,0,0,2,1,1,1,3,0,6,0,2,1,2,0,1,0,0,2,0,2,1,1,1,2,0,0,1,0,2,2,0,2,0,1,2,1,1,2,0,1,1,3,1,0,2,1,1,1,0,1,3,0,3,1,3,1,2,0,0,0,1,4,2,1,0,1,0,0,0,1,0,1,6,0,0,1,1,1,0,0,1,2,1,0,2,1,0,3,1,0,2,1,0,2,1,0,1,4,1,3,2,1,2,2,0,0,0,2,1,0,1,2,0,3,0,5,1,0,0,7,1,1,1,0,0,0,4,2,1,0,0,9,0,0,0,1,3,1,1,1,0,1,2,0,1,1,0,0,2,5,0,2,0,0,1,1,1,0,1,1,2,1,0,0,0,0,3,1,0,0,0,1,1,0,1,1,0,4,1,0,0,1,0,1,0,2,2,0,1,2,0,0,2,0,2,1,1,4,0,1,0,0,1,2,1,0,1,0,0,2,1,0,1,1,1,0,0,3,0,1,1,1,0,1,0,2,0,3,0,1,0,1,3,2,3,0,0,1,1,2,1,1,0,1,0,0,2,4,0,0,0,1,2,2,2,0,1,3,0,0,2,0,1,1,1,0,1,1,0,0,1,0,1,1,1,1,0,0,0,0,2,1,1,0,1,3,0,1,0,1,1,2,0,0,2,0,1,1,0,1,1,1,1,2,0,0,1,0,4,2,1,2,2,0,1,1,0,1,2,1,1,1,0,0,3,0,2,0,1,2,2,0,1,0,1,1,2,0,2,1,0,2,0,3,0,1,0,0,1,0,1,1,0,2,1,1,1,0,0,3,1,0,1,0,1,0,2,3,1,2,0,0,0,0,2,0,1,0,1,2,3,8,1,2,3,0,0,1,0,3,0,1,0,2,0,4,1,0,0,1,0,1,0,1,0,0,1,1,0,3,1,0,0,1,0,1,0,0,3,0,1,0,3,0,2,0,1,0,1,1,0,2,0,0,1,4,0,2,0,0,0,0,0,1,2,0,0,1,0,2,0,1,1,1,0,0,0,0,3,0,1,1,1,1,2,1,0,1,0,0,0,0,1,0,1,0,1,3,0,0,1,1,0,3,5,0,1,1,1,0,2,1,1,2,2,3,0,0,2,0,0,0,1,1,1,0,1,1,0,0,1,0,1,0,1,2,0,1,2,0,2,1,0,1,1,1,0,0,1,2,1,3,0,1,1,1,1,1,2,1,2,1,1,0,0,0,0,3,0,2,0,0,0,0,1,2,0,1,2,1,0,3,0,0,4,0,3,1,0,1,1,1,1,0,1,0,0,0,1,3,3,0,1,0,0,3,1,3,0,2,0,2,2,2,1,0,1,0,0,3,0,2,0,1,1,0,2,1,1,1,1,2,1,2,1,0,0,1,0,2,3,1,1,1,0,0,1,1,0,0,1,0,0,0,1,1,0,3,0,1,0,0,2,0,2,0,0,0,1,0,0,0,2,0,0,0,1,0,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,1,2,1,0,2,1,0,1,0,0,5,1,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,0,1,1,1,3,0,1,0,1,0,2,5,0,5,1,2,1,2,0,2,1,2,0,0,0,1,1,2,0,0,1,0,1,0,0,0,2,0,1,0,2,1,2,0,0,1,0,3,2,0,2,1,1,3,1,1,1,1,3,3,2,1,0,0,0,2,2,1,3,0,2,0,0,1,2,2,0,2,0,1,2,0,1,0,2,0,0,1,0,0,0,0,0,1,1,0,2,0,1,5,2,1,1,2,2,1,0,3,0,1,0,1,0,0,0,0,1,2,0,0,0,1,0,0,2,1,3,1,1,0,1,0,0,0,4,1,1,1,1,0,1,1,0,4,1,0,1,2,1,0,0,1,3,1,2,3,0,0,2,1,1,1,2,0,6,1,2,1,1,0,0,0,1,0,1,1,1,1,1,1,2,1,3,1,1,1,2,2,0,0,0,0,1,1,2,2,2,1,1,0,0,2,0,1,0,7,2,3,2,1,0,1,1,0,2,1,2,2,4,0,2,1,2,1,0,1,0,0,2,0,0,1,2,3,1,0,0,0,1,0,2,0,0,0,2,0,1,0,0,0,1,2,2,1,1,2,1,3,1,1,0,0,2,0,0,0,1,0,2,1,1,0,1,0,0,1,1,1,1,2,1,0,1,0,0,1,1,2,1,2,1,1,4,0,1,1,0,0,2,1,0,0,1,0,0,1,0,1,2,1,0,0,0,0,0,1,2,0,2,2,1,0,0,1,1,3,1,2,0,0,6,0,0,0,1,1,2,1,0,2,0,3,1,1,0,0,0,1,1,1,1,1,1,1,3,0,3,1,3,1,0,0,2,2,1,0,1,0,0,2,2,3,1,0,1,1,0,1,0,0,2,1,0,2,0,1,5,0,0,0,0,0,1,0,0,4,1,1,1,2,0,1,0,0,2,0,0,0,0,0,2,0,2,1,1,1,1,1,1,2,0,0,0,3,0,0,3,0,1,2,1,2,1,1,2,2,1,3,1,0,0,1,1,1,0,0,1,2,2,0,1,1,0,0,1,0,1,2,1,1,0,1,2,1,0,0,0,2,1,0,1,1,1,0,0,1,0,0,1,0,1,1,3,0,0,0,1,1,0,0,2,1,0,2,1,0,0,1,3,1,1,0,0,2,0,2,0,2,0,2,0,0,0,2,1,2,2,0,1,1,2,2,1,1,0,4,0,1,2,3,1,1,1,0,0,1,2,0,4,1,0,0,2,1,1,1,2,0,1,0,1,3,0,0,0,1,2,1,1,2,0,1,2,5,0,2,1,0,3,2,3,1,0,0,0,1,1,2,0,0,0,0,1,1,1,0,1,0,0,1,0,1,1,2,3,0,2,1,1,2,1,1,1,0,0,1,0,1,1,0,1,1,1,3,3,0,2,0,0,0,2,0,0,0,0,0,3,1,0,1,0,1,0,1,0,0,2,1,0,0,2,0,1,0,1,1,0,0,0,1,0,2,0,0,1,0,0,6,4,0,2,0,0,1,2,1,4,0,1,1,1,1,1,0,3,1,4,0,1,1,2,1,0,0,0,1,2,0,0,0,1,0,0,2,2,3,1,2,2,1,0,3,0,1,1,4,3,1,3,0,1,0,1,4,0,1,1,1,0,1,0,1,1,1,2,1,0,0,2,1,1,2,0]},{"counters":[3,0,1,6,0,2,0,1,1,1,2,2,0,0,1,0,1,0,0,1,0,0,1,2,0,1,0,0,1,0,3,0,0,1,0,0,2,1,3,1,0,2,0,0,1,0,0,3,0,0,4,0,0,0,2,0,0,1,2,0,1,0,0,0,1,3,1,0,0,2,0,3,3,1,0,2,0,0,3,1,2,0,1,1,1,0,0,0,1,1,0,0,2,1,1,1,4,0,0,0,2,0,1,0,2,1,1,1,1,1,2,4,1,1,1,2,0,1,1,2,1,0,0,2,1,1,0,0,0,2,1,0,0,1,1,0,1,0,0,1,2,1,0,0,0,0,2,0,1,0,2,1,1,1,1,1,2,2,2,0,1,0,0,1,1,1,0,0,2,1,1,0,0,0,2,0,0,0,0,0,1,0,2,1,0,0,1,0,1,0,1,3,0,1,0,3,0,1,1,1,2,0,0,0,1,0,0,1,0,1,0,2,0,0,1,0,0,2,0,0,1,0,1,0,0,2,1,1,2,1,1,1,2,0,0,0,1,1,3,0,0,1,1,0,2,0,0,0,1,0,2,1,0,0,0,2,4,2,3,3,2,0,1,3,1,2,1,1,0,1,0,0,2,0,0,1,0,0,0,0,0,1,2,0,0,0,0,1,1,2,2,0,1,1,2,0,1,1,1,1,0,1,1,0,1,1,1,1,1,2,2,1,0,0,1,4,1,0,1,2,0,3,1,0,2,4,0,0,1,4,1,2,4,0,0,0,0,1,1,0,2,1,1,1,2,0,0,1,3,0,1,4,2,2,0,2,0,1,1,0,2,0,2,2,1,1,2,2,2,2,3,3,1,0,1,0,0,1,3,0,1,4,1,0,1,0,0,2,1,2,0,0,1,1,0,1,1,2,1,1,4,2,1,0,0,2,0,0,1,0,0,0,2,0,0,1,2,0,2,1,0,0,0,3,1,2,1,1,1,0,3,2,0,0,4,3,2,1,1,2,0,1,2,0,0,0,2,3,1,1,0,1,1,1,0,1,2,0,1,0,2,1,0,0,2,0,2,1,0,0,1,0,0,0,1,0,1,1,0,3,2,2,0,1,0,3,0,1,3,1,1,1,0,0,0,2,2,0,1,2,0,1,2,3,0,1,2,1,0,1,1,6,0,0,0,0,1,1,1,0,1,1,1,2,0,0,1,2,0,1,0,0,0,0,0,0,1,2,1,1,3,0,1,0,0,1,1,1,1,0,0,1,2,0,1,1,2,1,4,1,0,1,0,0,1,1,2,0,1,0,2,1,0,0,1,2,2,1,2,0,2,1,1,2,1,2,7,0,0,1,1,0,1,3,1,0,0,0,1,1,0,2,1,0,1,1,0,4,1,2,1,0,1,0,1,1,0,2,2,1,1,0,1,1,1,2,1,1,3,0,1,1,0,1,2,0,2,1,0,0,1,1,0,1,1,1,0,0,0,1,1,3,0,0,0,3,0,0,3,0,0,0,0,0,0,3,1,0,0,1,1,1,0,0,3,2,0,4,1,1,0,4,0,1,0,0,0,1,2,3,2,1,2,2,3,1,0,0,0,2,3,0,0,2,0,0,1,1,0,1,0,0,1,0,2,3,3,1,1,1,0,1,5,0,1,0,0,1,0,3,0,3,0,1,1,1,0,0,2,2,0,2,0,1,0,1,1,0,0,3,2,1,1,0,2,1,1,1,0,1,1,1,2,1,1,0,1,1,2,0,3,1,1,1,1,4,4,1,1,0,2,0,3,1,0,1,2,1,1,0,1,1,0,0,0,1,0,0,3,1,1,1,0,1,0,2,0,0,0,1,0,2,2,0,0,1,2,2,0,2,1,0,2,2,2,1,1,1,1,1,4,0,1,0,1,1,1,3,4,3,0,1,0,2,4,1,0,1,1,1,0,0,1,0,2,0,0,0,0,0,1,2,2,0,2,1,5,1,2,0,0,3,0,0,1,1,1,0,0,1,0,1,0,2,1,0,0,2,0,0,1,0,1,1,0,1,1,1,1,1,1,0,0,2,2,0,1,0,2,1,0,1,0,1,1,1,2,1,1,0,1,1,1,2,6,0,1,1,2,0,0,1,2,1,1,1,1,0,1,0,1,1,3,2,0,0,0,0,2,0,0,1,1,2,3,4,2,0,1,1,0,0,1,1,1,0,0,1,2,2,4,3,1,0,2,0,1,0,0,1,1,1,1,1,0,0,2,3,0,4,3,1,1,2,0,0,0,0,0,1,2,0,1,3,1,0,1,0,0,1,0,1,1,2,1,1,4,2,1,0,3,0,0,1,0,2,1,4,2,2,1,1,2,0,1,4,0,1,0,1,1,3,1,0,0,1,2,0,0,1,0,0,3,2,0,0,0,2,0,2,0,1,1,1,1,1,3,0,1,1,0,1,0,2,0,2,1,1,1,4,5,0,0,0,2,0,0,1,3,0,0,3,1,2,0,0,0,1,0,1,2,1,1,0,0,1,1,1,0,0,0,2,2,1,1,1,1,2,1,0,0,4,2,0,0,2,1,1,2,3,3,0,1,0,0,1,2,2,1,2,0,0,2,2,1,0,1,0,0,2,1,0,5,0,1,3,0,0,1,0,1,0,1,2,1,0,1,1,0,2,0,0,1,2,2,2,0,1,0,0,2,2,0,1,0,0,1,1,0,0,1,0,0,1,0,1,0,2,1,1,0,0,0,0,0,4,1,0,0,0,0,2,2,2,1,0,1,1,2,3,0,4,0,0,2,1,2,0,1,0,3,0,1,1,1,2,1,0,0,0,2,0,0,0,1,2,0,0,0,0,2,0,0,0,1,2,2,1,0,1,2,0,0,2,0,1,1,0,1,0,0,2,2,0,2,0,0,0,0,2,3,2,2,1,0,1,0,2,1,0,1,0,0,1,0,1,0,0,2,1,2,2,0,0,1,2,0,1,2,0,0,1,2,0,0,2,1,0,0,1,1,0,1,0,0,0,1,0,4,0,0,0,4,0,1,0,1,3,0,2,1,1,2,1,1,1,1,2,2,0,2,0,0,0,3,2,2,0,0,0,0,3,2,0,0,0,0,2,2,3,0,0,4,3,1,0,2,0,1,0,2,3,0,0,2,2,0,1,1,1,2,2,1,1,0,2,2,1,1,4,0,1,5,0,0,4,0,1,0,0,0,0,1,2,0,0,4,2,0,0,0,2,2,0,1,0,0,1,1,0,2,2,0,3,1,1,1,0,0,0,2,2,0,2,0,0,0,1,0,2,0,1,0,1,0,3,8,0,0,0,0,2,1,0,1,0,1,0,1,1,2,0,0,2,1,1,0,1,1,1,0,0,0,0,0,0,0,0,1,3,1,1,0,2,0,1,3,3,1,2,0,1,1,0,1,0,6,1,0,1,1,0,3,5,0,1,1,0,1,2,1,3,1,1,0,1,1,1,0,2,1,2,2,3,0,2,2,2,0,1,1,1,1,1,1,0,1,0,1,2,2,0,4,0,2,1,0,1,0,0,1,1,2,0,1,0,2,0,1,2,1,2,1,0,1,1,3,0,0,3,2,1,1,3,0,0,1,3,0,5,1,1,4,1,3,1,1,0,0,3,0,0,1,0,0,0,1,1,1,1,0,2,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,1,0,1,3,0,1,0,1,1,0,0,0,0,3,0,1,1,2,0,0,1,1,1,0,1,2,1,2,1,1,2,0,3,2,1,1,1,1,1,1,0,4,0,0,0,0,1,1,1,1,1,3,0,0,0,3,0,2,2,0,0,0,3,1,0,0,2,0,1,1,1,1,3,1,0,3,1,0,0,0,5,2,0,1,0,5,1,1,0,3,0,2,0,1,0,1,0,2,0,0,1,8,0,1,1,1,1,0,0,2,1,1,1,0,1,3,0,1,0,1,0,2,1,2,0,2,2,1,1,1,1,0,0,1,0,1,0,1,2,1,2,0,2,1,1,0,2,0,0,0,2,2,1,0,0,0,1,0,0,2,1,4,2,2,1,2,0,2,1,6,0,0,1,3,2,2,0,2,0,1,0,3,3,0,1,0,2,1,0,1,2,1,1,2,0,1,2,0,0,2,2,1,0,3,0,1,1,1,0,3,4,0,2,1,2,0,2,0,0,1,0,0,2,1,0,2,1,1,2,0,2,2,0,2,1,0,1,0,2,2,2,0,0,0,1,2,0,1,0,0,0,0,1,0,1,0,2,2,3,0,0,0,1,3,1,1,0,1,1,2,3,0,1,2,0,1,0,1,2,0,1,0,1,2,1,0,1,0,0,1,0,0,0,2,0,2,1,1,1,0,1,3,1,1,0,2,0,1,1,0,2,1,1,0,0,0,1,3,2,0,2,1,1,0,1,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,2,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,1,2,0,0,0,0,0,1,0,1,1,1,0,2,0,0,1,1,2,3,2,0,0,2,2,0,1,1,0,1,2,1,1,2,2,2,2,1,2,0,2,0,2,0,1,0,0,0,2,0,1,0,0,0,1,0,0,1,3,0,0,1,0,1,0]},{"counters":[0,1,0,2,0,1,0,4,1,1,0,3,0,0,2,0,2,1,0,0,0,0,1,1,0,2,2,0,0,0,0,2,1,0,2,0,0,1,1,0,0,1,1,1,0,1,1,1,0,2,3,1,1,0,2,1,0,1,1,2,2,1,1,1,3,1,1,0,0,1,0,3,0,1,0,0,0,0,0,1,0,2,1,1,1,0,2,5,1,1,1,1,0,4,0,1,2,0,0,3,0,2,0,1,2,0,0,1,0,1,0,0,3,1,1,0,1,1,1,6,1,1,2,0,0,0,2,0,0,0,0,2,0,1,0,0,1,1,1,0,0,0,0,1,0,2,2,0,1,0,1,0,1,0,1,1,1,0,1,1,1,2,0,2,0,0,1,2,0,0,0,1,0,0,0,1,0,9,0,1,2,2,1,1,3,0,1,1,0,4,0,0,1,5,0,0,0,0,0,2,1,0,1,0,0,0,0,1,1,1,1,0,0,2,0,1,0,0,0,3,1,3,0,1,1,0,1,1,0,0,0,0,0,1,0,1,2,2,1,1,3,0,0,0,0,1,1,0,1,1,0,0,1,0,1,1,1,1,0,2,2,1,1,1,0,1,0,2,1,0,0,1,2,0,1,1,0,1,1,0,0,1,1,3,2,1,0,0,1,0,1,0,0,0,0,0,5,0,1,1,0,0,0,1,0,1,1,1,3,0,3,3,2,0,0,0,0,0,0,2,0,0,0,1,0,0,3,2,0,0,0,0,1,2,1,0,1,1,1,2,0,2,1,0,0,0,1,0,0,0,0,3,0,0,0,0,4,0,2,0,2,0,0,3,0,0,0,0,0,2,3,0,0,2,0,1,3,0,1,3,2,1,1,1,1,1,1,2,1,1,0,2,2,2,0,0,1,1,2,1,4,0,0,4,2,0,0,0,0,2,1,1,1,1,2,0,2,1,2,1,2,2,0,0,2,1,0,1,0,1,2,1,0,0,1,0,2,0,0,1,1,0,3,0,0,2,0,1,1,1,0,0,0,2,0,2,0,0,1,0,0,1,1,3,0,2,1,0,0,0,0,1,3,0,1,0,1,1,2,1,1,1,2,4,0,1,2,0,0,0,0,1,1,2,0,0,0,1,1,0,1,3,1,0,1,1,0,2,1,1,0,0,2,1,0,1,0,1,1,3,1,0,1,1,1,0,0,0,1,0,0,2,0,0,1,1,0,0,1,2,0,1,0,2,1,4,1,0,2,2,3,0,1,1,0,0,1,0,4,0,1,1,0,0,2,1,0,0,2,0,1,2,1,2,2,0,1,0,1,2,1,2,1,0,2,2,6,1,1,1,2,2,0,1,1,0,2,1,0,0,0,0,1,1,1,2,0,0,1,2,1,0,6,2,0,0,0,0,1,0,2,0,2,1,1,1,0,0,4,1,0,0,1,0,1,1,2,1,0,0,2,1,0,2,1,0,0,1,0,1,2,1,0,0,0,1,1,0,2,2,3,1,9,0,3,0,0,1,2,0,0,0,2,0,0,3,0,1,0,0,0,1,0,3,3,0,1,0,0,1,1,2,0,0,1,1,1,0,1,3,3,0,1,1,1,0,3,0,1,0,1,1,1,5,1,1,1,2,1,0,2,1,5,0,1,3,0,1,1,1,0,1,0,1,2,0,4,0,2,1,2,2,1,1,1,3,1,1,2,2,1,1,1,0,0,0,2,0,2,3,0,1,0,4,0,2,1,0,1,0,1,0,1,1,1,0,0,2,0,2,1,2,2,0,1,2,0,2,0,0,1,0,1,2,1,1,1,1,0,0,1,1,0,1,1,1,0,0,0,0,1,2,2,0,2,0,3,2,2,1,1,0,1,0,1,2,2,0,1,3,1,0,1,0,1,2,0,2,1,1,1,0,1,1,1,0,0,3,1,0,1,3,1,0,0,0,1,4,0,2,2,0,0,3,0,0,2,1,2,0,0,1,0,1,1,2,0,1,2,0,0,0,2,0,2,2,0,1,1,2,4,1,2,0,0,0,3,2,2,0,0,1,0,1,3,1,0,3,1,3,0,0,0,0,2,0,4,1,2,1,0,0,0,0,3,0,0,1,1,0,1,2,1,3,0,0,1,0,0,1,0,0,0,0,1,1,1,2,0,0,0,0,1,1,1,1,0,1,1,0,0,0,0,2,0,1,0,1,4,0,0,0,0,0,1,2,0,1,3,0,0,1,1,0,0,3,1,1,1,2,1,1,0,0,1,1,3,0,3,0,0,0,2,1,0,2,0,0,1,0,0,0,5,1,1,0,2,0,0,0,0,2,0,1,2,1,0,2,2,2,3,1,2,2,1,2,1,1,2,1,2,1,2,1,0,0,0,0,0,1,3,0,2,1,1,0,1,1,0,0,0,3,0,3,0,0,2,1,0,0,0,1,1,1,0,0,1,3,4,2,1,2,1,0,0,2,0,2,3,0,2,1,0,0,2,1,0,1,1,2,0,2,1,2,0,1,0,2,2,3,0,1,1,1,7,1,4,2,1,2,0,1,0,1,1,3,1,0,1,1,1,1,0,0,0,1,1,0,1,1,1,1,1,1,2,1,2,0,1,2,5,0,2,1,0,1,1,1,2,5,0,1,0,0,0,1,2,0,2,1,2,4,2,0,0,0,0,1,1,1,0,1,2,0,1,0,3,1,0,1,2,3,2,0,1,1,0,1,1,2,0,0,2,1,2,6,2,1,1,1,1,2,1,0,1,1,0,3,1,3,1,0,1,0,1,2,1,0,1,0,1,3,0,1,1,0,0,0,1,1,2,2,0,0,1,1,2,0,0,0,0,2,2,1,0,1,0,2,0,1,0,1,2,0,1,3,0,0,1,0,2,1,2,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,3,1,0,1,1,1,0,2,1,1,0,1,1,1,0,3,0,2,2,1,1,3,0,2,0,2,1,2,1,0,1,0,2,0,3,1,2,0,1,1,0,0,1,2,1,0,0,1,2,0,0,0,2,1,1,2,1,0,3,0,0,2,0,1,0,0,0,1,2,0,2,1,2,2,1,1,1,1,0,3,2,0,3,1,2,0,0,0,2,4,1,4,1,5,0,4,0,0,2,1,0,1,4,1,0,1,0,1,0,0,0,0,0,0,1,2,1,0,1,1,0,2,1,1,0,1,0,0,1,2,1,1,1,2,2,1,3,1,1,0,1,2,0,2,2,0,0,2,1,1,1,0,1,0,0,3,0,0,1,1,1,0,2,0,0,2,0,1,3,0,0,1,1,2,3,0,1,1,2,0,1,1,0,2,0,1,1,1,0,2,0,0,2,3,2,0,2,0,2,2,0,0,1,3,1,1,1,2,2,0,3,0,0,1,2,0,2,2,1,1,2,0,0,5,3,0,1,1,1,1,0,1,0,2,0,1,0,1,1,1,3,1,1,0,1,0,0,0,0,1,0,1,2,1,1,1,0,1,2,0,0,1,0,2,1,1,0,1,1,1,1,0,0,0,1,2,3,1,0,0,1,0,2,0,0,0,1,2,0,0,0,0,0,2,2,0,3,0,2,2,2,2,2,0,1,0,0,0,2,1,1,0,2,3,1,1,1,2,1,1,3,1,0,2,0,0,3,1,0,0,1,2,1,4,0,0,5,2,4,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,0,0,2,1,0,3,1,1,0,1,0,2,0,1,0,2,0,0,0,1,1,1,2,0,2,2,1,1,1,2,0,3,0,0,3,2,3,0,0,1,3,0,1,0,1,2,0,0,0,0,2,1,2,1,1,2,2,1,2,0,1,1,2,0,1,0,1,0,1,0,0,0,1,0,0,2,0,1,2,1,0,1,1,3,2,0,1,1,1,0,0,1,3,0,2,2,0,3,4,1,0,2,1,2,0,0,2,1,0,1,1,0,0,0,0,1,1,0,0,1,1,1,0,0,2,1,3,1,0,1,0,1,1,2,0,1,1,0,1,0,0,1,0,1,1,0,0,1,0,2,2,1,2,0,2,0,2,1,1,1,0,2,0,0,0,0,0,0,2,0,0,1,0,2,3,2,0,1,0,1,2,1,0,1,0,1,1,1,1,0,1,0,2,4,0,0,1,2,1,0,0,1,2,2,3,3,0,3,2,0,1,1,1,1,0,0,1,1,1,0,1,1,0,0,0,0,0,1,1,1,1,0,0,0,0,2,1,0,1,1,3,0,1,1,1,5,2,2,3,5,1,2,2,1,0,1,1,1,1,1,0,0,1,2,0,1,0,1,0,0,4,1,1,8,0,1,1,1,0,0,2,6,1,1,1,0,1,1,0,2,2,0,0,0,1,1,0,0,1,2,2,1,1,0,1,0,1,1,2,3,2,1,0,0,0,0,1,1,0,2,0,0,1,0,0,0,1,3,1,0,1,3,1,0,1,2,0,1,1,0,3,0,1,0,3,1,3,1,1,3,0,0,1,2,1,2,0,4,3,2,0,0,0,0,4,0,1,2,1,1,2,1,0,3,1,0,2,0,1,2,1,0,2,0,1,0,1,3,1,0,2,3,0,1,1,2,1,1,0,0,1,3,1,1,1]},{"counters":[1,3,0,0,0,1,1,1,0,1,0,1,0,0,3,2,2,0,1,0,1,2,0,1,1,4,0,1,1,0,0,0,3,1,4,1,0,0,0,0,0,1,1,0,2,0,0,0,0,0,1,2,1,1,3,0,3,2,0,1,2,0,2,0,0,1,1,2,1,2,2,0,0,0,1,1,1,0,2,1,0,0,2,0,0,0,0,0,1,0,1,0,0,0,0,0,0,2,1,1,1,4,1,0,0,0,1,0,0,1,0,0,0,1,0,1,2,2,2,1,1,3,0,0,0,2,1,3,0,1,3,0,0,0,0,1,1,3,0,2,1,2,0,0,0,0,3,3,0,0,1,2,0,0,1,1,1,1,0,1,2,1,0,0,0,1,0,0,1,1,2,3,0,1,3,1,2,1,1,1,1,0,1,1,4,1,1,0,2,0,0,0,0,0,1,3,1,2,0,1,2,1,2,0,0,0,2,1,1,1,0,3,2,0,2,1,1,2,0,1,0,0,0,1,1,0,2,2,0,0,0,1,2,1,2,3,2,0,4,0,2,0,0,0,0,1,0,1,0,0,0,0,1,2,3,2,1,1,0,1,0,1,0,2,1,0,1,1,2,0,1,1,4,0,1,0,3,2,1,1,2,1,2,0,0,1,1,1,1,1,3,0,0,1,0,1,0,0,1,0,1,2,2,3,1,1,2,0,1,2,0,1,0,1,1,0,0,2,2,1,2,0,1,2,0,0,2,1,8,2,1,3,1,1,1,1,0,1,2,3,2,1,1,3,1,0,0,0,3,2,2,1,0,1,3,2,2,0,0,2,0,1,0,0,0,0,0,0,0,2,0,1,1,1,0,0,2,3,0,2,0,1,3,0,0,0,2,0,0,0,2,0,1,1,1,0,3,1,1,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,2,2,2,0,2,2,0,2,1,0,0,0,0,2,2,3,0,3,1,0,0,1,2,1,0,1,0,2,1,3,0,2,0,1,0,0,1,0,0,1,1,1,0,5,0,2,0,1,2,2,4,0,0,1,0,0,0,0,1,1,2,0,1,0,1,1,1,2,0,1,0,1,2,2,0,2,1,2,1,0,0,0,1,1,2,3,1,1,4,0,0,1,0,0,2,1,2,0,0,0,0,2,1,1,1,1,0,1,2,1,1,1,1,0,0,0,1,0,2,0,1,2,1,0,1,2,0,1,1,2,0,0,1,1,0,0,0,1,1,1,0,0,1,0,0,2,1,0,2,2,2,0,0,0,0,1,2,1,1,0,1,1,1,2,1,0,1,1,0,0,0,0,1,1,1,0,1,3,1,1,4,4,1,2,0,0,0,1,0,1,2,0,0,1,2,1,2,1,0,2,2,0,1,1,1,1,2,1,1,1,0,0,0,0,0,0,1,0,2,1,1,0,0,3,1,0,1,1,0,0,0,1,0,5,0,1,0,1,0,1,1,5,0,0,3,3,0,0,1,0,3,1,1,2,2,1,2,0,0,0,1,1,2,0,0,0,1,1,1,1,1,1,2,0,0,2,0,0,0,0,2,4,1,0,0,1,0,1,0,1,3,1,2,2,1,1,0,1,3,1,0,1,1,1,1,0,1,1,0,0,1,1,3,2,0,0,0,2,1,0,4,0,0,0,0,0,0,2,1,1,0,0,0,0,3,1,0,0,1,2,0,1,1,0,2,0,3,2,1,3,3,2,0,0,1,0,0,1,0,2,3,0,1,4,2,2,1,2,2,0,1,0,0,3,0,1,2,0,5,2,1,0,0,1,0,1,0,0,1,0,1,0,0,1,1,5,1,0,3,1,1,3,1,2,1,0,0,1,0,0,2,1,1,0,0,1,1,0,0,1,1,0,1,3,2,1,0,2,1,2,1,1,2,5,2,2,0,1,0,0,2,1,0,0,1,2,0,1,0,2,1,0,0,1,3,0,1,0,2,3,1,0,2,2,1,0,2,1,0,0,1,0,1,1,2,0,1,1,0,0,0,0,0,1,3,0,1,3,2,0,0,1,0,0,0,0,2,1,1,1,2,0,1,0,0,1,0,0,1,3,2,1,0,1,0,0,0,2,0,2,0,2,0,1,1,2,2,2,0,0,1,0,1,1,0,1,2,0,1,2,1,0,1,1,1,4,0,3,2,0,0,0,1,1,2,0,5,1,1,0,1,2,1,2,3,3,1,1,0,2,1,0,1,3,2,1,2,0,1,1,0,0,0,1,3,1,2,0,0,0,0,0,0,0,1,0,2,2,4,0,0,1,0,0,1,2,3,0,1,0,2,1,2,0,2,1,1,1,1,0,0,1,0,1,3,1,2,1,2,0,2,3,1,0,2,2,1,1,5,3,0,3,1,2,1,1,1,1,1,2,0,1,0,0,0,3,1,0,1,5,3,0,1,1,0,0,1,3,0,0,0,3,2,2,2,1,1,1,0,1,0,0,4,1,1,1,1,3,0,0,1,0,2,0,1,1,1,2,2,0,1,1,0,1,3,0,1,0,1,0,2,1,1,3,1,0,1,0,1,0,1,0,2,2,2,0,2,1,2,0,1,0,1,2,1,2,0,1,2,3,1,2,2,1,0,2,1,2,0,2,0,0,1,0,0,0,1,2,0,0,1,1,2,1,1,0,1,1,0,0,2,1,1,1,1,3,2,0,2,1,1,0,1,3,2,0,0,0,0,0,0,0,1,0,0,3,1,1,1,4,0,1,0,1,1,1,1,0,2,1,0,0,2,3,0,0,0,3,0,1,0,2,1,0,4,3,0,1,1,1,2,1,1,0,1,0,0,0,2,2,0,2,2,0,1,2,3,2,0,1,0,0,1,2,1,0,1,3,0,1,1,0,0,3,2,1,1,1,1,1,2,1,0,1,6,3,0,3,3,0,3,1,1,0,4,1,1,4,2,6,3,0,1,2,1,1,0,0,2,0,1,0,0,4,1,2,1,0,0,0,1,1,0,2,0,0,2,0,1,2,0,2,3,1,0,0,0,2,0,1,0,0,0,1,1,1,0,0,0,1,2,5,1,2,0,0,1,4,2,2,0,2,1,1,0,0,0,0,1,0,1,0,1,4,0,0,3,0,2,2,2,0,0,3,1,2,1,1,0,0,0,0,2,0,0,2,1,1,0,0,1,0,1,1,0,1,2,3,0,1,0,2,1,0,0,0,1,3,0,0,1,0,0,0,0,0,3,2,0,0,2,1,1,0,0,0,0,0,1,3,1,0,1,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,2,2,2,0,2,0,0,2,0,1,0,1,0,0,1,1,2,3,0,1,0,0,0,2,1,2,2,2,0,2,0,0,4,1,0,0,0,1,1,1,0,2,0,1,0,1,2,1,1,0,0,1,0,0,4,0,0,3,1,0,1,2,0,1,1,1,0,1,1,0,0,1,1,1,2,0,0,1,1,1,0,2,0,2,3,0,2,1,1,2,0,1,2,0,1,0,1,6,0,0,1,0,1,0,0,0,2,2,2,1,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,1,0,2,1,0,2,2,0,2,1,1,1,0,0,0,1,2,0,1,2,0,1,2,3,0,0,1,0,0,0,1,2,0,0,1,0,0,1,1,3,2,1,0,1,1,1,0,0,0,0,2,1,1,1,5,0,9,0,1,0,1,1,0,2,1,1,0,1,1,1,4,0,1,2,1,1,0,0,0,1,3,1,2,2,2,1,2,0,1,0,1,1,0,0,1,2,1,3,0,1,1,0,1,1,0,1,0,1,2,0,0,3,1,2,2,1,2,1,0,6,0,2,0,1,3,0,1,0,0,0,1,1,1,2,2,0,0,0,0,2,0,1,3,1,0,1,1,1,0,0,1,2,1,0,0,1,0,1,1,4,3,1,0,1,2,1,2,1,1,0,2,0,0,3,0,0,3,0,0,0,1,0,2,2,0,0,0,0,3,2,1,0,2,0,0,1,1,0,0,1,1,0,0,0,2,4,2,1,1,1,0,1,0,2,3,1,1,1,0,2,0,0,0,2,2,0,0,0,0,0,2,0,1,1,0,1,1,0,1,0,0,0,3,0,0,1,0,2,0,1,0,2,2,0,5,1,0,2,0,1,1,0,2,0,0,1,0,1,1,1,2,2,0,0,1,1,0,0,0,5,0,2,3,0,3,1,2,0,4,0,1,2,1,0,1,4,1,1,0,1,0,1,0,0,2,1,1,0,1,0,0,1,1,1,1,1,2,2,0,0,2,1,1,1,2,3,1,1,0,2,1,0,0,1,0,1,0,2,0,4,4,0,0,1,0,0,1,1,0,1,1,2,0,2,1,0,0,1,0,0,0,0,0,0,0,2,1,0,1,0,0,0,0,2,0,2,1,2,4,3,0,2,0,1,1,3,4,0,0,1,1,2,0,2,1,1,0,1,1,0,0,2,1,0,0,1,0,3,2,0,1,1,1,0,1,0,2,2,3,0,0,1,2,1,1,1,3,1,1,2,0,1,1,0,0,0,1,0,0,0,0,0,2,2,0,1,2,0,0,1,0,5,3,1,2,1,0,1,3,0]}]},"null_count":0,"last_update_version":397952040637038592},"cc":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTQ5OTc2OTc0Ljc1","upper_bound":"LTQ5MjgwMDAyLjYz","repeats":1},{"count":16,"lower_bound":"LTQ5MDg0NjQ2LjM4","upper_bound":"LTQ4OTY0MTAzLjI2","repeats":1},{"count":24,"lower_bound":"LTQ4ODk3NjM0LjE1","upper_bound":"LTQ4Nzk4MzI1Ljc2","repeats":1},{"count":32,"lower_bound":"LTQ4NzM3ODQ5Ljk3","upper_bound":"LTQ4MzY0NTI5LjUz","repeats":1},{"count":40,"lower_bound":"LTQ4MzA4Njk4LjE3","upper_bound":"LTQ4MDY5Nzc4LjM4","repeats":1},{"count":48,"lower_bound":"LTQ3OTk5MTU4Ljcy","upper_bound":"LTQ3ODkxNjMwLjk0","repeats":1},{"count":56,"lower_bound":"LTQ3ODY0NDcxLjA0","upper_bound":"LTQ3NDU5NjkzLjk3","repeats":1},{"count":64,"lower_bound":"LTQ3NDQ0MzI1Ljkw","upper_bound":"LTQ3MTk0MjkzLjYw","repeats":1},{"count":72,"lower_bound":"LTQ3MTIyNDk4LjIw","upper_bound":"LTQ2OTcxMjg3Ljk4","repeats":1},{"count":80,"lower_bound":"LTQ2NjQ1OTQ0LjI2","upper_bound":"LTQ2NDQ0MTk3LjM2","repeats":1},{"count":88,"lower_bound":"LTQ2MjQyMzU1LjUz","upper_bound":"LTQ2MDgzMTMzLjAw","repeats":1},{"count":96,"lower_bound":"LTQ2MDYyNDc1Ljg0","upper_bound":"LTQ1NTI2NDYwLjAy","repeats":1},{"count":104,"lower_bound":"LTQ1MTYzNzUxLjk4","upper_bound":"LTQ0ODMzMjIxLjUw","repeats":1},{"count":112,"lower_bound":"LTQ0ODI5NjAzLjcz","upper_bound":"LTQ0NzAyMjIzLjc0","repeats":1},{"count":120,"lower_bound":"LTQ0NjA2OTQ0LjU0","upper_bound":"LTQ0MzAxNDYyLjIx","repeats":1},{"count":128,"lower_bound":"LTQ0MzAxMTQxLjg5","upper_bound":"LTQzNzQ3OTk2LjY1","repeats":1},{"count":136,"lower_bound":"LTQzNjk4MzYyLjQ0","upper_bound":"LTQzNDE1NjkzLjcx","repeats":1},{"count":144,"lower_bound":"LTQzMzA0MjIzLjU2","upper_bound":"LTQyODY0NTY2LjQ2","repeats":1},{"count":152,"lower_bound":"LTQyODUzNDk2LjUy","upper_bound":"LTQyNTcxNjEyLjI3","repeats":1},{"count":160,"lower_bound":"LTQyNDY5NTg2LjQ2","upper_bound":"LTQyMzE3NzU2LjUw","repeats":1},{"count":168,"lower_bound":"LTQyMjI1Mjg5Ljc3","upper_bound":"LTQxOTg2NTA1Ljcz","repeats":1},{"count":176,"lower_bound":"LTQxOTQ2MDE3Ljgy","upper_bound":"LTQxNTgwMjY5LjEx","repeats":1},{"count":184,"lower_bound":"LTQxNTcyMjE4LjA0","upper_bound":"LTQxMzYyNTMzLjQ3","repeats":1},{"count":192,"lower_bound":"LTQxMzIzNTEzLjQz","upper_bound":"LTQxMDU1MDI4LjU4","repeats":1},{"count":200,"lower_bound":"LTQwOTEwMTIxLjQz","upper_bound":"LTQwNzE2Njg5Ljk0","repeats":1},{"count":208,"lower_bound":"LTQwNDE2MTIwLjc3","upper_bound":"LTQwMDEwNzY2LjQ3","repeats":1},{"count":216,"lower_bound":"LTQwMDAxODMwLjQ1","upper_bound":"LTM5NjU3NDIxLjUz","repeats":1},{"count":224,"lower_bound":"LTM5NjI5NjkwLjQ5","upper_bound":"LTM5MTk1NDIwLjQ2","repeats":1},{"count":232,"lower_bound":"LTM5MDYwMDQ3LjA5","upper_bound":"LTM4NjUxNjE1Ljk2","repeats":1},{"count":240,"lower_bound":"LTM4NDgyMDUyLjAx","upper_bound":"LTM4NDQxMTI0LjM4","repeats":1},{"count":248,"lower_bound":"LTM4NDM0NTk3Ljc4","upper_bound":"LTM4MzAwNTE1Ljk4","repeats":1},{"count":256,"lower_bound":"LTM4MjA3NTQyLjM0","upper_bound":"LTM4MDQyODczLjA3","repeats":1},{"count":264,"lower_bound":"LTM3OTUyNjY1LjM3","upper_bound":"LTM3MzY0NjUyLjk5","repeats":1},{"count":272,"lower_bound":"LTM3Mjk3NDg0LjQ3","upper_bound":"LTM3MTcxODIxLjc1","repeats":1},{"count":280,"lower_bound":"LTM3MTY4ODIzLjM3","upper_bound":"LTM2OTY0ODgwLjk5","repeats":1},{"count":288,"lower_bound":"LTM2ODIwMjUxLjY0","upper_bound":"LTM2NDYxMjU2LjI0","repeats":1},{"count":296,"lower_bound":"LTM2NDU4NjYyLjIz","upper_bound":"LTM2MDA2OTM0LjQ4","repeats":1},{"count":304,"lower_bound":"LTM1ODY5MTg3LjI0","upper_bound":"LTM1NTc3MDExLjUw","repeats":1},{"count":312,"lower_bound":"LTM1NDUyNTU2LjE1","upper_bound":"LTM0OTg0MTE2LjI1","repeats":1},{"count":320,"lower_bound":"LTM0OTcwMTU2LjIy","upper_bound":"LTM0NDcxODAyLjUx","repeats":1},{"count":328,"lower_bound":"LTM0MzgxOTYzLjE1","upper_bound":"LTM0MjM5MjgyLjgw","repeats":1},{"count":336,"lower_bound":"LTM0MTM2OTEzLjYw","upper_bound":"LTMzODI1OTQ4Ljgz","repeats":1},{"count":344,"lower_bound":"LTMzNzUzNzIzLjYz","upper_bound":"LTMzNjYzODY5LjYy","repeats":1},{"count":352,"lower_bound":"LTMzNTY3MDQ3LjIx","upper_bound":"LTMzMzA5ODM3LjY5","repeats":1},{"count":360,"lower_bound":"LTMzMzA0ODA5LjEy","upper_bound":"LTMzMjM3OTk4LjU0","repeats":1},{"count":368,"lower_bound":"LTMzMTYxNjQyLjQ1","upper_bound":"LTMyOTQwMDkyLjAx","repeats":1},{"count":376,"lower_bound":"LTMyOTM2NDM0LjQz","upper_bound":"LTMyNTQ1MDMwLjg1","repeats":1},{"count":384,"lower_bound":"LTMyNDczOTkzLjE2","upper_bound":"LTMyMDc4NTE2Ljg4","repeats":1},{"count":392,"lower_bound":"LTMyMDczNzIyLjk3","upper_bound":"LTMxODg1Nzk5LjA3","repeats":1},{"count":400,"lower_bound":"LTMxNjg0MTg4Ljcw","upper_bound":"LTMxNDQ2NTM4LjQ3","repeats":1},{"count":408,"lower_bound":"LTMxNDA0MTEwLjQz","upper_bound":"LTMxMjA5OTM3LjE3","repeats":1},{"count":416,"lower_bound":"LTMxMTk4NjExLjIy","upper_bound":"LTMxMTQwNTIzLjc3","repeats":1},{"count":424,"lower_bound":"LTMwOTg3NDE3LjU0","upper_bound":"LTI5Nzc1MDg3LjE4","repeats":1},{"count":432,"lower_bound":"LTI5Njk0NDQyLjQ3","upper_bound":"LTI5NjM0MDQ5Ljk4","repeats":1},{"count":440,"lower_bound":"LTI5NjIwNTYyLjEx","upper_bound":"LTI5MjQyNDc4LjAz","repeats":1},{"count":448,"lower_bound":"LTI5MTYwODkzLjM3","upper_bound":"LTI5MDM5ODQzLjY0","repeats":1},{"count":456,"lower_bound":"LTI4NzI5NTQ4LjA4","upper_bound":"LTI4NDIyNTgxLjE0","repeats":1},{"count":464,"lower_bound":"LTI4MTg0NTIzLjE2","upper_bound":"LTI3ODM0MjEwLjMx","repeats":1},{"count":472,"lower_bound":"LTI3Njk2MjI2Ljcy","upper_bound":"LTI3NTY0OTY4LjMy","repeats":1},{"count":480,"lower_bound":"LTI3NTUzNDQ1LjY1","upper_bound":"LTI3MjcwNjkyLjAz","repeats":1},{"count":488,"lower_bound":"LTI2OTUwMDUwLjAy","upper_bound":"LTI2NzUzMzIwLjQy","repeats":1},{"count":496,"lower_bound":"LTI2NzQ0NjU4Ljk5","upper_bound":"LTI2MjUxMDEyLjI0","repeats":1},{"count":504,"lower_bound":"LTI2MTM0NTcxLjU3","upper_bound":"LTI1NTk4NzQ4Ljc5","repeats":1},{"count":512,"lower_bound":"LTI1MzMwNjkzLjcz","upper_bound":"LTI0ODQ3OTE2LjA5","repeats":1},{"count":520,"lower_bound":"LTI0Njg3NjM4LjAx","upper_bound":"LTI0MzgzNTY0Ljk2","repeats":1},{"count":528,"lower_bound":"LTI0Mjg1NzYzLjIy","upper_bound":"LTI0MTAyNTI2LjY4","repeats":1},{"count":536,"lower_bound":"LTI0MDY4NzIxLjQ0","upper_bound":"LTIzODE4ODc4LjU0","repeats":1},{"count":544,"lower_bound":"LTIzMjI5MTA2LjM0","upper_bound":"LTIyOTkyMjY1LjYz","repeats":1},{"count":552,"lower_bound":"LTIyNzg2NzQ1LjI3","upper_bound":"LTIyMzgxMjY0LjQ2","repeats":1},{"count":560,"lower_bound":"LTIyMjk5NzIwLjU3","upper_bound":"LTIyMDk5ODcxLjA4","repeats":1},{"count":568,"lower_bound":"LTIyMDIyNDQ5LjY4","upper_bound":"LTIxNjY3Mjg0LjQz","repeats":1},{"count":576,"lower_bound":"LTIxNjQ0ODQ2LjEx","upper_bound":"LTIxMzg5NjQ5LjMw","repeats":1},{"count":584,"lower_bound":"LTIxMzA0NDI0Ljg5","upper_bound":"LTIxMTE1NzMyLjg3","repeats":1},{"count":592,"lower_bound":"LTIxMDI1NzA1Ljkz","upper_bound":"LTIwNTg4Mzg4LjUy","repeats":1},{"count":600,"lower_bound":"LTIwNTA0MTk3LjY0","upper_bound":"LTIwMjE3OTM1LjAz","repeats":1},{"count":608,"lower_bound":"LTIwMTk4NjEyLjQ4","upper_bound":"LTIwMDQwMzQ4LjA0","repeats":1},{"count":616,"lower_bound":"LTE5ODQ1NTMwLjgz","upper_bound":"LTE5NjY0NjkyLjU3","repeats":1},{"count":624,"lower_bound":"LTE5NjUyMDE2Ljc1","upper_bound":"LTE5NDY2NTc2LjE1","repeats":1},{"count":632,"lower_bound":"LTE5NDIxOTMyLjg3","upper_bound":"LTE4ODMwMzIxLjAw","repeats":1},{"count":640,"lower_bound":"LTE4NjI2MDc4LjAw","upper_bound":"LTE4MTYxNDE0LjU5","repeats":1},{"count":648,"lower_bound":"LTE3Nzc3NzQzLjAy","upper_bound":"LTE3NTY4NTY2LjA4","repeats":1},{"count":656,"lower_bound":"LTE3NTMyMTE5Ljg3","upper_bound":"LTE3MzQyOTQxLjI4","repeats":1},{"count":664,"lower_bound":"LTE3MzE4NzUxLjU0","upper_bound":"LTE2ODU4MjA5Ljk1","repeats":1},{"count":672,"lower_bound":"LTE2ODUwOTAzLjc2","upper_bound":"LTE2NTMwMjY5Ljk5","repeats":1},{"count":680,"lower_bound":"LTE2MzczNzM3LjQ2","upper_bound":"LTE1Njg4NDA5LjM4","repeats":1},{"count":688,"lower_bound":"LTE1NDYwNzYwLjcw","upper_bound":"LTE1MjM5NDI1LjM5","repeats":1},{"count":696,"lower_bound":"LTE1MTYwMTgxLjAw","upper_bound":"LTE0NzEzMzY1LjMx","repeats":1},{"count":704,"lower_bound":"LTE0Njc2ODc4LjY4","upper_bound":"LTE0MzU3NjI4LjIz","repeats":1},{"count":712,"lower_bound":"LTE0Mjk1OTc2LjQ4","upper_bound":"LTE0MTU5MzcxLjM3","repeats":1},{"count":720,"lower_bound":"LTE0MDA5MDYyLjc2","upper_bound":"LTEzNzM1OTY2Ljgx","repeats":1},{"count":728,"lower_bound":"LTEzNjUyNzk3LjQz","upper_bound":"LTEyOTc0MTk5LjUw","repeats":1},{"count":736,"lower_bound":"LTEyODk1NzgyLjAx","upper_bound":"LTEyNzYyNTQ0LjU1","repeats":1},{"count":744,"lower_bound":"LTEyNzI4ODMxLjQy","upper_bound":"LTEyMTExMzcwLjEz","repeats":1},{"count":752,"lower_bound":"LTEyMTA1NjY2LjA2","upper_bound":"LTExODQyNTg5LjEw","repeats":1},{"count":760,"lower_bound":"LTExODMzMjA4Ljc3","upper_bound":"LTExMzYwMDQwLjc1","repeats":1},{"count":768,"lower_bound":"LTExMTE1OTY0Ljgz","upper_bound":"LTEwOTMwMjMwLjU3","repeats":1},{"count":776,"lower_bound":"LTEwODcxODEwLjc1","upper_bound":"LTEwNTU5MDIwLjI2","repeats":1},{"count":784,"lower_bound":"LTEwNDEwNzkwLjA2","upper_bound":"LTEwMDI3NDYzLjU3","repeats":1},{"count":792,"lower_bound":"LTEwMDIxNTIyLjY0","upper_bound":"LTk2NzY4MTcuMDM=","repeats":1},{"count":800,"lower_bound":"LTk2NDY0MTUuOTY=","upper_bound":"LTkyODkyMTYuODg=","repeats":1},{"count":808,"lower_bound":"LTkyNDMyODQuNDk=","upper_bound":"LTg4NzY1MDcuMDE=","repeats":1},{"count":816,"lower_bound":"LTg2NTE2MzQuMjQ=","upper_bound":"LTg0MTc0NzUuNTQ=","repeats":1},{"count":824,"lower_bound":"LTgzMTk1MTIuMTQ=","upper_bound":"LTc5OTczNTguODM=","repeats":1},{"count":832,"lower_bound":"LTc5MzkwODcuNjA=","upper_bound":"LTc4NjMzNDguOTk=","repeats":1},{"count":840,"lower_bound":"LTc3OTQ1MjAuODc=","upper_bound":"LTc1NzY5MDMuNDA=","repeats":1},{"count":848,"lower_bound":"LTc0NDc1ODYuOTI=","upper_bound":"LTc0MDYyNjYuMDQ=","repeats":1},{"count":856,"lower_bound":"LTcyODkyMzEuMjA=","upper_bound":"LTY5MjAzNTMuNzY=","repeats":1},{"count":864,"lower_bound":"LTY4NjgyMDAuMTQ=","upper_bound":"LTY2MTE2OTkuMTI=","repeats":1},{"count":872,"lower_bound":"LTY1Njc2MDkuMTQ=","upper_bound":"LTYyNzI0ODAuMDY=","repeats":1},{"count":880,"lower_bound":"LTYxMDg4MzIuOTg=","upper_bound":"LTU3NTI2MzkuODg=","repeats":1},{"count":888,"lower_bound":"LTU3MjgxMzEuODU=","upper_bound":"LTU1OTU1OTcuNjM=","repeats":1},{"count":896,"lower_bound":"LTU1MTIyMjguNDI=","upper_bound":"LTUyMzkzODMuODk=","repeats":1},{"count":904,"lower_bound":"LTUwNzM3NTkuNzk=","upper_bound":"LTQ3OTMwMjEuNDU=","repeats":1},{"count":912,"lower_bound":"LTQ3NDUwNDMuMjY=","upper_bound":"LTQ1MzQwNTMuNDE=","repeats":1},{"count":920,"lower_bound":"LTQ0ODQ2MzguNDk=","upper_bound":"LTQxNjY3NjguNDc=","repeats":1},{"count":928,"lower_bound":"LTQwNzc5MTAuMzE=","upper_bound":"LTM3NjU2OTEuMDg=","repeats":1},{"count":936,"lower_bound":"LTM2NTY2NDkuNzk=","upper_bound":"LTMyNDAyMTMuNTc=","repeats":1},{"count":944,"lower_bound":"LTI3Nzg0OTEuODk=","upper_bound":"LTI0NDIxOTcuNDQ=","repeats":1},{"count":952,"lower_bound":"LTIzOTc4MzEuMjY=","upper_bound":"LTIxOTcyMzAuNzk=","repeats":1},{"count":960,"lower_bound":"LTIwNjIwMTcuNjU=","upper_bound":"LTE2NDY4NDYuOTI=","repeats":1},{"count":968,"lower_bound":"LTE1MzExNDguMTY=","upper_bound":"LTEzMjk3NzkuMDc=","repeats":1},{"count":976,"lower_bound":"LTEyMzkyMjUuMDM=","upper_bound":"LTY3MDY3NS40NA==","repeats":1},{"count":984,"lower_bound":"LTUxNDkyMy43OQ==","upper_bound":"LTQzNzIwNi43Nw==","repeats":1},{"count":992,"lower_bound":"LTMyMDczNy4yNg==","upper_bound":"Nzc3NjguOTA=","repeats":1},{"count":1000,"lower_bound":"OTQyMjYuMTA=","upper_bound":"NDI3NDI2LjY2","repeats":1},{"count":1008,"lower_bound":"NTUyNTMwLjc0","upper_bound":"OTI5MTgyLjMw","repeats":1},{"count":1016,"lower_bound":"OTYxNjE1LjY5","upper_bound":"MTE3ODgxNS4xMg==","repeats":1},{"count":1024,"lower_bound":"MTE5Nzc0NC4yMA==","upper_bound":"MTU1ODY5OC4yMg==","repeats":1},{"count":1032,"lower_bound":"MTYyMjM0MS45Ng==","upper_bound":"MTg0NDcxNS4wOQ==","repeats":1},{"count":1040,"lower_bound":"MTkyNDk4NS41MA==","upper_bound":"MjMzNTc4Ny45OQ==","repeats":1},{"count":1048,"lower_bound":"MjM0OTE3MC43MA==","upper_bound":"MjU3Mzk1NC42MQ==","repeats":1},{"count":1056,"lower_bound":"MjU5ODY3MC4zMA==","upper_bound":"MjkwMTE1NS4xOA==","repeats":1},{"count":1064,"lower_bound":"Mjk2MDU1NS4yNA==","upper_bound":"MzEyNDU2My44Ng==","repeats":1},{"count":1072,"lower_bound":"MzE2MDM1OS4xNA==","upper_bound":"Mzg4MjU3Ni42NA==","repeats":1},{"count":1080,"lower_bound":"Mzk2NzQ3NS4zMg==","upper_bound":"NDA3MjEwOC41NQ==","repeats":1},{"count":1088,"lower_bound":"NDExOTU3NS4yNw==","upper_bound":"NDQzODYyMi41OA==","repeats":1},{"count":1096,"lower_bound":"NDU4NjA4OC4wNw==","upper_bound":"NDgxMjYxNC41OA==","repeats":1},{"count":1104,"lower_bound":"NDg0ODcyMS4zOA==","upper_bound":"NTI0MjA3Ny4zNA==","repeats":1},{"count":1112,"lower_bound":"NTI5OTk5OC43Nw==","upper_bound":"NTU1MDA0NC40Ng==","repeats":1},{"count":1120,"lower_bound":"NTU2ODc5Mi42Mw==","upper_bound":"NTYwMTMzMy4zMQ==","repeats":1},{"count":1128,"lower_bound":"NTYyNzQ2My42MQ==","upper_bound":"NjE1NjE5MC4xNQ==","repeats":1},{"count":1136,"lower_bound":"NjMxMjE1OC4xNQ==","upper_bound":"NjQ0NzE2Ny4xNA==","repeats":1},{"count":1144,"lower_bound":"NjQ2NzM1MC43OA==","upper_bound":"NzAxMjI2NC40Nw==","repeats":1},{"count":1152,"lower_bound":"NzA1ODA4NC4zMQ==","upper_bound":"NzM5MjQwNi43Mg==","repeats":1},{"count":1160,"lower_bound":"NzQ0NDU1OC43Ng==","upper_bound":"NzUzOTA2OS4xMA==","repeats":1},{"count":1168,"lower_bound":"NzU2MzE2NC43MQ==","upper_bound":"ODE2MDM3Ni43NA==","repeats":1},{"count":1176,"lower_bound":"ODIxODA4NC42NA==","upper_bound":"ODQ5NTM1OS42OQ==","repeats":1},{"count":1184,"lower_bound":"ODY2NTEwOC4wNQ==","upper_bound":"ODc5NTQyNC4zMg==","repeats":1},{"count":1192,"lower_bound":"ODg1Njc0MC44MQ==","upper_bound":"OTQxMzM3MS4xMg==","repeats":1},{"count":1200,"lower_bound":"OTQ2NTA3NC41Mg==","upper_bound":"OTYyMTM2NC45NQ==","repeats":1},{"count":1208,"lower_bound":"OTYyNTk5NC43OQ==","upper_bound":"OTY4ODczNy42MA==","repeats":1},{"count":1216,"lower_bound":"MTAxMDk0NjAuNjA=","upper_bound":"MTAzNzI4MjkuNDk=","repeats":1},{"count":1224,"lower_bound":"MTA0NzU4NzguNDU=","upper_bound":"MTA3Mzg2MzMuMzI=","repeats":1},{"count":1232,"lower_bound":"MTA3NTEzNjQuNTE=","upper_bound":"MTEyMjI2OTMuODc=","repeats":1},{"count":1240,"lower_bound":"MTEyOTMxNzMuOTE=","upper_bound":"MTE5Mjk4ODIuMDE=","repeats":1},{"count":1248,"lower_bound":"MTIwNzYxMzUuNDA=","upper_bound":"MTIzODQ3MDcuNzc=","repeats":1},{"count":1256,"lower_bound":"MTI0NzA3MTguMjk=","upper_bound":"MTI3ODI3MjkuNDM=","repeats":1},{"count":1264,"lower_bound":"MTMxMDQwNjIuOTA=","upper_bound":"MTMyODU4MDEuODQ=","repeats":1},{"count":1272,"lower_bound":"MTM0NjU1ODMuNzc=","upper_bound":"MTQxNDA4NzkuMzM=","repeats":1},{"count":1280,"lower_bound":"MTQxNDQ1MTEuODA=","upper_bound":"MTQzMjQ1MjQuODQ=","repeats":1},{"count":1288,"lower_bound":"MTQzMzIzNjguMDc=","upper_bound":"MTQ1MDMyMTcuNTg=","repeats":1},{"count":1296,"lower_bound":"MTQ2ODc2MjMuMTE=","upper_bound":"MTQ5ODM4ODIuMDM=","repeats":1},{"count":1304,"lower_bound":"MTUwMjIxMzEuMDU=","upper_bound":"MTU1Nzc4ODguMTk=","repeats":1},{"count":1312,"lower_bound":"MTU4NjUyODYuMDc=","upper_bound":"MTU5NzMwMjEuODY=","repeats":1},{"count":1320,"lower_bound":"MTYyMjQzMjkuNDE=","upper_bound":"MTY2NzY5ODUuNDM=","repeats":1},{"count":1328,"lower_bound":"MTY3NTQ1NDIuMDk=","upper_bound":"MTY5ODU2NzIuNDU=","repeats":1},{"count":1336,"lower_bound":"MTY5OTE3MjIuNzg=","upper_bound":"MTc0Mjg2NjkuNDY=","repeats":1},{"count":1344,"lower_bound":"MTc2Nzg3MzcuMTU=","upper_bound":"MTgxNzYyNDQuNDU=","repeats":1},{"count":1352,"lower_bound":"MTgyMDI0OTMuNDk=","upper_bound":"MTg5NTMzNTUuOTc=","repeats":1},{"count":1360,"lower_bound":"MTkwMjAxMjcuOTc=","upper_bound":"MTkxNDMyNDUuMzc=","repeats":1},{"count":1368,"lower_bound":"MTkyOTUwMjMuNDg=","upper_bound":"MTk5NzA2NTIuNDU=","repeats":1},{"count":1376,"lower_bound":"MTk5OTg3MDMuNDg=","upper_bound":"MjAyMjQ5MTEuODE=","repeats":1},{"count":1384,"lower_bound":"MjAyMjkxMzEuMTA=","upper_bound":"MjA0MTA0MzUuMjU=","repeats":1},{"count":1392,"lower_bound":"MjA0MTYzMDEuMzY=","upper_bound":"MjA2MTM3ODcuNTI=","repeats":1},{"count":1400,"lower_bound":"MjA2NzI5NTkuODk=","upper_bound":"MjExMTA0ODUuNTU=","repeats":1},{"count":1408,"lower_bound":"MjExMzc3NTYuNzY=","upper_bound":"MjE1NjQ5MTQuNzk=","repeats":1},{"count":1416,"lower_bound":"MjE1OTIzNDUuMDc=","upper_bound":"MjE2NjA1MzEuNTQ=","repeats":1},{"count":1424,"lower_bound":"MjE4MjM0NjguMDk=","upper_bound":"MjIwMDY0OTMuMTA=","repeats":1},{"count":1432,"lower_bound":"MjIwMDY4MTMuNTk=","upper_bound":"MjIyMTIyMzMuOTY=","repeats":1},{"count":1440,"lower_bound":"MjIyNzE0OTEuNDk=","upper_bound":"MjI1NjkzMjIuODc=","repeats":1},{"count":1448,"lower_bound":"MjI2Nzk1ODEuNDM=","upper_bound":"MjI5MjA5NjEuNTU=","repeats":1},{"count":1456,"lower_bound":"MjI5OTUwMTMuNzE=","upper_bound":"MjMyMDA5MDMuMjE=","repeats":1},{"count":1464,"lower_bound":"MjMyNjYwNDMuMDI=","upper_bound":"MjMzNTIyMDMuMzM=","repeats":1},{"count":1472,"lower_bound":"MjM2NTA3OTMuNzQ=","upper_bound":"MjM4OTg4MjMuODA=","repeats":1},{"count":1480,"lower_bound":"MjQxMTI0NDMuMzY=","upper_bound":"MjQzNjY0MDUuNjg=","repeats":1},{"count":1488,"lower_bound":"MjQ1MDY5MDguNDQ=","upper_bound":"MjQ2NDMwNTcuMDU=","repeats":1},{"count":1496,"lower_bound":"MjQ5Njc3OTEuMzk=","upper_bound":"MjUyNDk2MjIuMDM=","repeats":1},{"count":1504,"lower_bound":"MjU0NTExNzcuMjI=","upper_bound":"MjU4NjY0MDYuODg=","repeats":1},{"count":1512,"lower_bound":"MjYwNzY0NTAuNzU=","upper_bound":"MjY1NTE0NjAuOTg=","repeats":1},{"count":1520,"lower_bound":"MjY1ODgxMjkuMjA=","upper_bound":"MjY4Mjg5NTcuMjU=","repeats":1},{"count":1528,"lower_bound":"MjcyNDI1NDguODQ=","upper_bound":"MjczMzE4MDQuMjI=","repeats":1},{"count":1536,"lower_bound":"MjczMzIyNjMuMDQ=","upper_bound":"Mjc1MjExNzEuOTk=","repeats":1},{"count":1544,"lower_bound":"Mjc1NjYxMDMuNTY=","upper_bound":"Mjc2MzA3MjUuNjU=","repeats":1},{"count":1552,"lower_bound":"Mjc3MjU4NzMuNDY=","upper_bound":"MjgyNjkxNjQuMTQ=","repeats":1},{"count":1560,"lower_bound":"MjgyNzY5MzMuODY=","upper_bound":"Mjg0Mjg2MzIuOTQ=","repeats":1},{"count":1568,"lower_bound":"Mjg0ODMyOTcuODc=","upper_bound":"Mjg2MTEwMDkuNDY=","repeats":1},{"count":1576,"lower_bound":"Mjg3MjcwODIuOTk=","upper_bound":"Mjg5MTg0MzYuMTA=","repeats":1},{"count":1584,"lower_bound":"MjkxNzQ3MjUuNzk=","upper_bound":"MjkzMDk5MjAuMjg=","repeats":1},{"count":1592,"lower_bound":"MjkzMTIwNTguNjY=","upper_bound":"MzAxMDk0NjQuNTg=","repeats":1},{"count":1600,"lower_bound":"MzAxNzU5MDEuNjM=","upper_bound":"MzAzOTkyMTUuNjE=","repeats":1},{"count":1608,"lower_bound":"MzA1NDE3MDEuNzA=","upper_bound":"MzA3MjkxODkuMTY=","repeats":1},{"count":1616,"lower_bound":"MzA3NDQzNDkuNzk=","upper_bound":"MzEyMzc3MDkuNjQ=","repeats":1},{"count":1624,"lower_bound":"MzEzMDg0OTMuMzg=","upper_bound":"MzE2MjA4MzUuNzA=","repeats":1},{"count":1632,"lower_bound":"MzE2MzU3OTAuNjk=","upper_bound":"MzE4NjMyMTYuMTI=","repeats":1},{"count":1640,"lower_bound":"MzIwNTczOTguODI=","upper_bound":"MzI1MjEzNDcuNjQ=","repeats":1},{"count":1648,"lower_bound":"MzI2NDA4NDMuNjg=","upper_bound":"MzI4NDA1NDguMDM=","repeats":1},{"count":1656,"lower_bound":"MzI5MTE3NzUuOTY=","upper_bound":"MzMyNjczMjEuNjI=","repeats":1},{"count":1664,"lower_bound":"MzM0NDc2ODQuMTM=","upper_bound":"MzM3NDYxMTYuMDM=","repeats":1},{"count":1672,"lower_bound":"MzM3NzU5NTQuMzk=","upper_bound":"MzQzODYzNDguMTU=","repeats":1},{"count":1680,"lower_bound":"MzQ0MTA2NjUuMjI=","upper_bound":"MzQ5MDg4MTguMjE=","repeats":1},{"count":1688,"lower_bound":"MzQ5NzUwODAuNjk=","upper_bound":"MzUzMzU3MjEuOTE=","repeats":1},{"count":1696,"lower_bound":"MzUzNzM3NjYuMDI=","upper_bound":"MzYxNDc0OTkuNDg=","repeats":1},{"count":1704,"lower_bound":"MzYyNDg3MDEuMjI=","upper_bound":"MzY1NjQzODQuMTQ=","repeats":1},{"count":1712,"lower_bound":"MzY2NjY2NzcuMzc=","upper_bound":"MzY3MjY3MDAuMTA=","repeats":1},{"count":1720,"lower_bound":"MzY4NzA0ODguMTI=","upper_bound":"MzY5OTAzOTkuNzY=","repeats":1},{"count":1728,"lower_bound":"MzcwMjQ4MTEuMTI=","upper_bound":"MzczMDUxNjMuMTE=","repeats":1},{"count":1736,"lower_bound":"MzczODQ2MzEuODI=","upper_bound":"Mzc3MDU1NTcuNzU=","repeats":1},{"count":1744,"lower_bound":"Mzc3NTYyNjIuMDQ=","upper_bound":"MzgyMTY4NzMuMTE=","repeats":1},{"count":1752,"lower_bound":"MzgzNTYxMDMuNzI=","upper_bound":"Mzg2NzMxMjcuNTE=","repeats":1},{"count":1760,"lower_bound":"Mzg2OTg3MzUuODg=","upper_bound":"Mzg4MTU3NTkuODY=","repeats":1},{"count":1768,"lower_bound":"Mzg4ODUwOTcuNjc=","upper_bound":"MzkyNjI3NTUuMjU=","repeats":1},{"count":1776,"lower_bound":"Mzk0Nzg0MzkuOTA=","upper_bound":"Mzk2NDk4MTguNjE=","repeats":1},{"count":1784,"lower_bound":"Mzk2NzI5MzMuODU=","upper_bound":"NDA2OTE1ODcuMzc=","repeats":1},{"count":1792,"lower_bound":"NDA3MzA3NzguNzc=","upper_bound":"NDA5NDk4MzUuMDQ=","repeats":1},{"count":1800,"lower_bound":"NDA5NTczMjMuOTI=","upper_bound":"NDExODEwODYuMzk=","repeats":1},{"count":1808,"lower_bound":"NDEyMDI4NjguNzY=","upper_bound":"NDEzMjQ4ODcuMTc=","repeats":1},{"count":1816,"lower_bound":"NDEzNDYwNjEuNDY=","upper_bound":"NDE2MTEyNzMuMDA=","repeats":1},{"count":1824,"lower_bound":"NDE2MjQ0NDEuMjM=","upper_bound":"NDE4MzU2OTIuOTQ=","repeats":1},{"count":1832,"lower_bound":"NDE5NTY5NTIuODA=","upper_bound":"NDIxNDY0OTYuOTU=","repeats":1},{"count":1840,"lower_bound":"NDIxNTIzNTQuMzA=","upper_bound":"NDIyNjM2MzEuOTI=","repeats":1},{"count":1848,"lower_bound":"NDI0MjMyMDIuOTg=","upper_bound":"NDI2ODUyMTAuOTQ=","repeats":1},{"count":1856,"lower_bound":"NDI3MTU1MDUuOTI=","upper_bound":"NDI4MjE2MzUuNDQ=","repeats":1},{"count":1864,"lower_bound":"NDMwNjMyODkuNDk=","upper_bound":"NDMyNzc0OTguODk=","repeats":1},{"count":1872,"lower_bound":"NDM0Njg4MTkuNTk=","upper_bound":"NDQxMzE5NzIuODE=","repeats":1},{"count":1880,"lower_bound":"NDQxMzM0MTcuMTc=","upper_bound":"NDQyOTg0NTQuNTY=","repeats":1},{"count":1888,"lower_bound":"NDQ0MzAzMzcuNzc=","upper_bound":"NDQ5NTEzNzMuMzQ=","repeats":1},{"count":1896,"lower_bound":"NDUwNzUyMjguMzI=","upper_bound":"NDU0NDY3MzMuMTE=","repeats":1},{"count":1904,"lower_bound":"NDU0Njk5NjkuMDg=","upper_bound":"NDU3MjA1MTIuOTQ=","repeats":1},{"count":1912,"lower_bound":"NDU3NDU0NDAuNjU=","upper_bound":"NDYwNzA3OTMuNjE=","repeats":1},{"count":1920,"lower_bound":"NDYxOTI2OTAuNTU=","upper_bound":"NDY1MzcwOTguOTQ=","repeats":1},{"count":1928,"lower_bound":"NDY1Mzc1NDguMDg=","upper_bound":"NDY4NjcxMzYuNTU=","repeats":1},{"count":1936,"lower_bound":"NDY5MjIxNTkuODc=","upper_bound":"NDc0MDk0MTIuMTI=","repeats":1},{"count":1944,"lower_bound":"NDc0ODUxMTMuMzU=","upper_bound":"NDc3Njg0MzYuMTk=","repeats":1},{"count":1952,"lower_bound":"NDc5MTEyNzQuMzI=","upper_bound":"NDgyODg3NTUuNzQ=","repeats":1},{"count":1960,"lower_bound":"NDgzODU4MjEuMzc=","upper_bound":"NDg3Nzg5OTEuNjk=","repeats":1},{"count":1968,"lower_bound":"NDg4Njg1MTkuMjY=","upper_bound":"NDkxOTE0MjAuMDk=","repeats":1},{"count":1976,"lower_bound":"NDkyMzQ3MDAuNzc=","upper_bound":"NDkzODkyOTUuODM=","repeats":1},{"count":1984,"lower_bound":"NDk0NTcxNTkuMzg=","upper_bound":"NDk2ODI2MTQuMDk=","repeats":1},{"count":1992,"lower_bound":"NDk3MjcwNzguMzA=","upper_bound":"NDk4MDI0MDcuNDQ=","repeats":1},{"count":2000,"lower_bound":"NDk4MjcwNzcuNTc=","upper_bound":"NDk5MDUxOTkuNDA=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,2,3,1,1,1,0,3,1,0,0,1,1,2,0,0,1,2,1,1,4,1,0,4,2,0,2,1,2,2,0,2,2,1,1,0,1,0,1,2,0,2,2,0,1,1,0,1,1,1,0,2,0,0,1,2,1,0,1,0,3,1,0,0,1,0,0,1,2,1,1,2,1,0,1,1,0,2,1,0,0,1,2,3,1,0,0,0,1,0,0,2,1,0,1,2,2,1,0,2,0,2,0,2,1,1,1,0,2,0,1,1,1,0,0,2,1,3,0,0,1,3,3,0,0,0,1,1,1,0,0,1,0,2,3,2,2,0,0,3,1,2,0,0,1,0,2,1,2,0,3,0,1,0,0,0,1,2,1,0,1,2,1,0,1,3,2,2,0,0,1,1,0,1,2,2,2,0,1,1,1,1,2,0,1,0,1,0,1,0,2,1,0,0,1,1,2,0,2,1,1,1,2,1,1,0,1,1,2,1,1,1,0,0,1,1,1,1,1,2,0,2,1,0,2,3,0,0,0,2,1,2,0,0,0,0,0,0,2,1,0,1,0,0,2,1,1,0,1,1,2,1,1,1,0,0,1,1,1,1,0,1,1,0,0,0,1,0,2,0,2,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,2,0,1,1,0,4,0,1,1,0,0,1,1,1,2,1,1,0,2,1,0,1,2,0,2,3,2,0,0,1,0,0,2,0,0,2,0,3,1,0,0,1,1,0,4,2,0,2,2,0,2,0,1,1,0,0,0,0,0,0,2,1,2,0,0,1,1,0,3,1,0,0,0,0,0,0,0,0,2,0,2,1,2,0,1,2,0,0,0,2,2,0,1,4,1,2,3,0,1,0,0,0,0,0,0,0,1,1,0,1,3,2,0,1,1,0,1,1,0,1,1,0,3,1,0,1,1,3,3,2,1,2,3,1,2,1,2,0,0,1,2,3,2,0,0,1,0,3,1,0,0,0,0,2,1,2,2,1,2,0,0,0,0,0,0,1,0,0,0,1,1,2,1,0,2,1,1,0,1,2,0,0,0,0,1,1,0,1,1,0,0,2,1,0,0,0,0,0,1,0,2,1,0,1,1,1,0,1,1,4,1,0,0,0,1,1,1,1,1,0,0,0,1,1,4,2,1,3,0,0,2,2,3,1,1,1,1,0,0,0,1,1,2,1,2,1,0,0,1,1,3,0,1,0,0,0,0,2,3,1,1,1,0,0,0,1,0,2,2,2,0,2,1,2,0,1,2,0,0,2,0,0,0,4,1,0,1,0,1,0,0,0,0,0,0,0,0,1,2,1,0,0,3,2,2,1,3,2,1,0,4,1,0,0,2,0,1,3,0,3,1,3,0,1,0,1,2,0,0,2,1,1,0,2,3,3,0,2,2,1,0,2,1,1,1,1,1,0,0,0,2,1,0,1,1,1,0,0,1,0,1,0,1,2,0,0,0,0,0,1,2,2,2,0,0,0,1,1,2,1,2,0,0,1,2,0,1,0,1,4,2,1,1,0,1,2,0,0,0,2,0,0,1,0,3,1,2,1,1,1,1,3,1,4,1,1,3,0,3,1,0,2,0,3,3,0,2,0,0,1,1,0,1,1,2,1,0,2,0,0,3,0,1,0,0,0,1,1,2,0,0,1,1,0,0,1,1,0,0,4,2,2,1,2,0,2,0,2,2,0,0,1,1,1,1,0,1,0,1,5,1,1,0,2,0,4,2,0,1,2,0,0,1,2,1,0,2,1,1,1,1,2,1,1,0,2,2,1,0,0,1,2,1,0,0,2,2,2,3,1,2,0,2,1,1,0,2,1,1,2,0,2,2,1,1,0,1,2,0,0,1,0,2,0,1,0,0,1,0,2,1,0,0,2,1,0,0,2,3,4,1,0,0,2,0,1,0,1,1,0,0,1,1,0,1,0,2,2,1,2,0,1,3,0,0,2,1,1,1,2,1,0,0,3,0,1,1,3,1,1,2,3,3,0,1,0,0,1,2,1,0,0,0,0,1,1,1,1,1,1,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,0,2,1,3,0,2,0,0,0,2,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,4,1,0,0,1,1,1,0,1,1,0,3,0,0,0,1,1,2,1,1,2,3,0,4,0,0,1,1,2,1,2,3,1,0,0,1,1,0,0,1,0,0,1,1,2,1,2,0,0,1,2,1,0,2,0,1,0,3,0,1,1,1,1,2,2,1,1,0,0,0,1,1,2,0,2,0,4,1,0,2,0,1,0,2,1,0,1,0,0,0,1,2,2,2,1,0,1,1,2,2,1,0,0,0,3,0,1,2,1,2,1,1,1,1,0,1,1,1,2,0,0,1,0,1,2,0,0,2,1,3,0,0,0,1,1,2,4,5,2,1,1,0,1,0,2,1,1,1,0,1,3,3,1,2,1,4,0,2,2,5,1,1,0,0,3,1,1,1,0,0,1,0,0,1,2,2,1,1,3,0,1,2,1,3,0,0,1,0,0,3,0,1,0,0,1,2,1,0,1,0,0,0,1,0,0,1,0,2,0,0,1,0,1,1,0,2,2,0,1,1,2,1,2,0,2,1,0,0,2,1,0,2,1,3,1,1,0,1,1,0,1,0,0,1,1,0,1,0,3,1,0,2,0,2,0,0,1,0,2,1,0,1,0,0,0,1,1,0,1,0,0,0,1,2,1,2,1,0,3,0,1,0,2,0,1,0,0,4,0,3,0,1,1,0,1,0,0,1,0,3,3,1,0,1,1,1,3,1,0,1,0,0,3,2,1,3,1,0,0,4,1,2,0,1,1,0,3,0,2,0,1,0,3,3,1,2,2,0,3,3,1,2,0,0,3,1,1,1,3,1,1,2,2,0,0,1,0,0,0,0,0,1,0,0,2,0,0,0,2,1,1,1,1,1,0,1,0,0,0,3,1,0,2,0,2,0,1,1,1,1,3,2,0,2,0,1,0,4,3,1,1,2,0,2,2,0,0,2,0,1,2,0,2,1,1,0,0,1,2,3,0,2,2,0,1,0,1,1,2,1,0,1,1,4,1,0,1,1,2,1,1,3,0,1,2,2,0,0,1,0,2,1,1,0,2,1,0,0,2,0,0,2,2,1,0,3,0,0,1,2,0,0,1,2,0,0,1,0,2,0,3,3,0,0,2,1,0,2,1,2,3,1,1,0,1,0,4,0,0,1,0,0,2,1,1,0,2,1,1,0,1,1,1,2,0,2,0,1,3,0,0,1,0,1,0,0,2,1,1,1,0,4,0,3,2,2,1,3,0,1,1,3,1,1,2,0,0,1,1,1,2,0,1,0,1,2,0,1,2,1,3,0,1,0,3,0,1,0,2,1,0,2,2,0,1,2,1,1,1,1,0,1,0,1,2,0,0,1,0,0,2,2,4,1,2,0,3,0,0,3,0,1,0,0,0,1,1,0,2,4,0,1,1,0,0,0,1,1,0,2,1,2,1,1,1,0,1,0,1,1,1,0,0,1,2,0,0,2,0,1,3,2,1,0,3,0,0,1,2,0,0,1,0,3,3,0,1,1,0,2,2,1,0,1,1,2,1,2,0,1,2,1,1,0,2,0,0,1,1,2,1,0,0,0,2,5,0,3,0,0,2,1,1,0,0,0,1,2,0,0,0,1,0,0,0,1,4,2,0,3,0,4,0,1,0,0,2,1,1,1,0,2,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,2,0,2,1,1,3,0,1,0,2,0,0,0,2,0,0,1,0,4,1,0,2,0,2,1,1,1,2,2,2,0,3,0,1,1,0,3,0,1,1,1,2,0,2,2,2,1,1,1,0,2,0,2,3,1,0,4,0,2,1,0,2,0,1,0,3,1,0,0,1,3,1,0,1,1,1,1,1,1,2,1,0,1,0,2,1,0,3,2,0,1,3,0,1,3,0,3,2,1,0,1,3,2,2,1,0,1,1,0,0,0,2,2,1,0,0,0,2,0,1,2,0,0,2,1,4,1,0,1,0,0,1,0,0,0,0,1,2,1,1,1,3,0,2,0,1,0,1,0,0,2,1,0,0,1,0,1,2,2,0,1,0,0,0,1,3,3,1,3,2,1,2,4,0,2,1,1,1,4,1,0,0,2,1,0,1,1,1,1,0,1,1,0,0,0,0,1,0,0,0,3,1,0,3,1,1,0,1,2,0,0,1,0,1,0,0,5,2,1,2,0,1,1,1,0,2,0,0,1,3,0,1,0,1,0,1,2,1,1,1,0,2,1,1,2,1,2,0,0,0,2,2,0,2,0,1,2,1,1,3,0,1,3,0,0,2,0,0,0,2,0,1,1,1,2,2,0,1,0,1,0,1,1,1,1,1,1,2,1,0,1,0,1,0,0,1,1,0,0,3,0,1,1,1,0,0,1,0,1,1,2,1,0,1,0,1,0,2,0,0,1,3,3,1,1,1,0,3,1,0,1,1,0,2,1,0,2,0,1,0,1,0,2,0,2,1,0,1,1,1,1]},{"counters":[1,4,0,1,1,5,2,0,1,1,0,2,0,1,1,1,1,0,0,0,1,1,3,1,0,0,1,0,0,2,0,3,0,2,2,0,0,2,4,1,3,0,0,1,3,1,1,0,1,1,2,0,3,0,0,4,2,3,0,1,0,1,1,1,1,0,1,1,1,2,0,2,2,0,0,0,1,0,0,1,0,1,1,0,0,0,1,2,1,2,0,3,2,2,0,2,1,0,3,1,0,0,1,0,2,2,1,0,0,2,0,4,0,0,1,1,0,2,2,0,2,0,1,4,1,2,1,0,1,2,2,3,1,1,0,1,1,0,2,2,1,4,0,1,1,4,1,2,2,0,1,1,1,0,2,2,1,1,0,1,2,2,0,1,1,2,1,0,0,0,2,0,0,3,1,0,0,4,1,0,1,1,3,4,0,3,0,0,0,0,0,1,2,1,1,0,1,1,1,0,1,1,0,0,0,0,3,3,0,0,0,1,0,2,1,1,1,2,2,1,2,0,0,0,0,0,1,1,1,0,1,1,2,0,1,1,0,1,0,0,1,2,1,1,1,0,1,0,0,0,2,2,3,2,0,0,2,2,0,2,1,2,3,1,2,1,1,0,0,2,0,1,0,1,0,0,0,3,1,1,1,0,0,0,1,0,0,0,1,2,0,0,0,0,1,2,1,1,1,2,0,3,0,1,0,3,0,0,0,0,1,0,2,0,2,0,0,1,1,0,0,1,2,1,1,2,0,1,2,2,0,0,2,1,1,1,1,3,0,1,0,1,0,2,2,1,0,0,1,1,0,0,2,0,1,2,1,0,1,1,1,0,0,1,0,1,2,1,0,0,3,1,2,2,1,3,3,0,0,1,0,1,1,2,3,2,1,3,0,2,0,0,1,1,0,2,2,0,1,1,0,3,0,1,2,2,1,0,1,1,1,1,0,0,1,1,0,1,0,0,0,0,3,0,1,0,0,2,1,1,0,1,2,1,1,1,1,0,1,0,1,1,2,0,3,2,0,0,1,2,0,0,1,0,2,0,1,0,1,1,0,0,2,1,1,0,1,3,1,2,0,1,0,0,0,0,0,1,3,2,2,0,0,1,2,1,1,0,0,2,2,3,2,2,0,1,1,1,4,0,4,2,1,2,0,0,0,1,1,1,1,0,1,0,0,1,0,0,0,2,1,1,0,1,0,2,2,2,2,1,1,0,0,0,1,0,0,2,0,2,2,1,1,1,0,2,1,2,0,1,1,0,0,0,0,0,1,1,1,0,2,2,0,2,0,1,1,0,1,0,0,1,1,2,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,2,0,0,0,1,1,0,1,0,2,0,1,1,0,0,1,0,4,3,0,2,0,3,1,1,2,0,1,1,0,2,1,2,0,1,0,3,0,1,1,2,0,0,1,2,0,1,1,3,2,0,4,2,1,5,4,2,0,0,1,2,0,1,0,1,0,1,1,1,1,0,0,1,1,0,0,1,2,0,1,0,1,2,1,2,2,2,0,0,1,1,0,2,2,2,1,0,2,5,3,3,0,1,0,0,0,0,1,2,0,1,0,1,1,0,2,0,0,2,0,2,0,2,1,1,0,0,0,1,1,1,1,1,0,3,1,2,1,1,1,1,1,1,0,0,2,1,0,1,0,3,1,0,3,1,1,3,0,1,1,1,2,2,1,1,2,2,2,0,2,1,0,1,2,0,0,2,2,0,0,1,0,1,1,0,1,0,0,0,1,3,0,2,0,0,0,2,2,1,0,2,0,0,1,0,1,1,0,1,2,0,0,0,3,1,2,1,2,1,1,0,1,2,0,0,1,0,1,1,0,0,1,2,0,0,3,2,1,1,3,0,1,1,2,0,0,0,3,2,1,0,1,1,0,0,0,0,0,2,0,0,3,1,2,1,0,1,2,0,0,2,1,1,1,2,0,0,1,0,2,0,0,1,2,1,0,0,0,1,1,0,0,0,1,1,3,1,1,1,1,1,1,2,3,1,0,1,1,0,1,1,2,1,1,1,0,1,0,1,3,2,2,2,2,1,0,0,1,1,3,2,1,0,1,1,1,2,2,2,1,0,0,1,1,0,1,0,1,0,2,1,0,0,1,2,2,0,1,1,2,2,0,2,1,1,1,0,2,0,1,3,2,1,0,3,1,0,2,1,0,0,1,0,1,2,0,1,1,0,5,1,1,0,0,0,1,0,2,1,2,3,2,2,1,1,2,2,0,2,2,0,0,0,1,1,0,1,2,1,1,3,3,1,2,1,1,2,2,2,3,2,0,1,0,2,1,0,2,0,0,1,0,1,1,1,1,1,2,0,0,2,0,2,0,3,2,0,4,2,5,2,0,1,1,1,0,0,0,1,0,1,0,0,0,0,2,0,1,2,0,0,1,0,1,0,2,3,1,1,0,0,0,1,0,1,0,0,1,1,0,1,0,1,0,0,0,3,2,2,1,1,0,1,0,1,3,0,0,0,0,2,1,0,0,0,0,1,1,0,0,0,1,0,0,0,3,0,1,1,2,0,3,0,0,0,1,1,1,0,2,1,0,1,1,0,1,2,1,1,1,0,0,2,0,2,2,0,1,1,1,0,2,0,0,2,0,0,0,1,1,0,2,2,2,1,0,1,2,4,1,1,1,1,2,0,1,1,2,1,2,0,0,1,0,0,1,3,2,0,1,1,2,1,1,0,0,0,1,1,2,3,2,0,2,0,1,0,1,0,0,0,1,1,2,0,2,0,0,0,1,0,0,1,2,2,0,0,0,1,1,1,2,1,0,0,1,0,2,0,2,0,1,0,1,0,0,1,1,0,0,2,1,2,0,1,3,3,2,2,2,1,1,1,0,0,0,1,1,1,0,1,1,0,1,0,2,1,0,2,1,1,0,1,1,1,2,2,0,3,2,2,1,0,1,0,1,0,1,2,1,0,2,1,1,0,4,0,1,2,1,0,1,2,5,2,0,0,2,1,0,3,1,0,0,1,1,1,1,3,1,0,0,0,1,1,1,0,1,2,2,1,0,2,1,0,2,2,0,0,0,1,2,1,1,1,1,0,1,1,1,2,2,1,0,1,3,0,0,2,3,1,0,1,3,0,1,1,0,1,2,1,0,2,0,2,1,1,0,1,0,1,1,0,1,0,0,0,2,0,1,1,0,1,3,0,1,2,1,0,1,1,1,0,4,0,1,1,1,0,2,1,0,1,1,0,2,1,0,3,2,1,1,1,4,1,0,1,1,1,1,1,2,1,1,2,0,1,0,1,0,1,0,0,2,0,0,0,0,1,0,0,1,0,1,2,0,1,2,3,1,0,2,1,0,1,2,0,1,3,4,0,0,0,0,1,1,2,1,1,0,0,0,1,2,2,1,0,0,1,2,0,3,1,1,4,1,0,1,2,2,1,4,1,2,1,0,1,2,0,1,1,2,0,1,0,0,2,2,1,2,0,0,0,3,0,2,5,1,0,2,0,0,1,2,0,0,0,0,2,0,0,1,0,2,0,2,2,1,1,1,1,2,0,1,1,1,1,0,4,0,0,0,1,0,2,1,0,1,0,1,0,4,1,3,0,1,0,0,1,1,1,1,2,0,1,0,0,0,0,2,0,1,2,0,1,1,1,1,0,2,0,1,1,2,2,1,1,1,2,1,1,0,0,0,1,2,1,2,0,3,1,0,0,1,1,0,1,0,2,3,0,2,1,2,2,0,1,1,1,1,0,1,0,1,2,3,0,2,2,2,1,0,0,3,1,1,1,0,0,0,2,3,1,0,3,1,1,0,0,1,2,0,0,1,0,1,1,1,1,2,2,2,0,2,3,0,0,1,1,1,4,0,0,3,1,1,0,2,0,1,0,2,2,0,0,2,1,0,2,0,3,1,1,1,1,0,0,1,1,1,1,0,1,0,1,2,0,0,0,1,1,0,4,2,0,0,0,0,2,1,2,1,1,0,1,1,1,1,1,2,1,1,2,2,0,0,0,0,1,0,1,2,2,0,0,1,2,2,2,1,1,1,1,2,0,1,0,0,2,1,0,1,3,0,3,1,3,1,0,2,0,3,0,1,1,0,2,1,1,0,1,1,2,2,2,1,1,1,0,3,1,0,1,3,2,1,0,0,0,2,1,0,0,0,4,0,0,1,0,2,1,1,0,1,0,0,0,0,2,0,0,3,2,0,1,0,0,0,0,2,1,0,2,0,1,1,0,2,2,0,1,1,0,1,0,1,0,0,1,0,0,1,1,1,2,1,3,1,0,0,0,0,0,2,5,1,1,2,0,1,1,0,2,1,3,3,1,0,1,2,0,1,1,3,0,0,2,2,1,2,1,0,0,1,2,2,2,0,2,2,0,0,0,0,2,0,0,2,2,3,1,2,2,0,0,2,2,1,1,0,1,3,0,0,0,0,4,1,3,1,0,0,1,4,1,1,2,0,1,2,1,0,1,0,2,2,1,1,1,2,2,1,1,3,1,1,0,1,0,0,2,0,1,1,0,2,1,0,0,3,0,0,0,1,0,0,0,2,2,0,1,0,0,0,0,1,0,0,0,1,2,1,3,1,1,1,0,1,2,0,1,1,2,1,1,0,0,1,0]},{"counters":[1,1,1,1,0,1,0,0,1,1,0,0,2,1,2,0,2,2,1,1,0,3,0,1,0,0,1,2,0,2,1,1,0,3,0,1,1,0,2,1,0,0,2,2,3,2,0,2,2,2,2,1,1,1,0,1,1,0,1,0,2,1,1,1,4,0,1,0,1,0,0,3,2,1,1,2,0,1,1,1,2,0,1,0,1,1,0,1,2,0,0,0,1,0,0,2,1,0,1,5,2,2,1,2,0,0,2,0,1,0,1,2,0,1,0,0,0,0,1,0,1,1,0,0,1,1,1,1,2,0,3,1,2,1,0,0,0,0,0,0,0,0,5,0,0,2,0,1,2,0,0,3,2,1,0,1,2,1,0,1,0,0,1,1,1,2,1,1,2,0,0,3,1,1,0,0,0,1,1,2,0,2,2,0,0,0,2,2,0,1,1,0,1,0,3,1,1,0,0,1,1,1,1,0,2,1,0,1,2,2,1,1,1,0,3,1,1,0,2,2,2,2,1,1,4,2,2,1,1,2,2,0,2,2,1,0,0,1,2,3,0,0,1,0,2,2,1,1,2,0,0,1,0,0,1,0,2,4,0,2,1,1,3,1,0,1,1,1,1,1,0,1,0,2,2,0,0,1,1,0,2,0,1,0,2,1,1,1,0,2,1,0,1,0,3,0,2,1,1,2,1,1,3,1,0,1,0,0,0,1,0,0,2,0,0,1,0,0,0,0,0,0,1,2,1,0,0,1,1,0,0,1,1,4,1,0,2,2,0,0,0,1,0,1,1,1,0,0,0,3,1,1,0,1,0,2,0,1,0,1,1,1,0,1,0,1,3,2,3,0,3,3,3,2,1,2,3,0,1,2,2,0,2,0,4,0,2,1,2,0,1,1,1,2,1,1,0,1,1,2,0,1,1,1,1,1,0,0,3,2,2,0,1,3,2,1,1,1,1,2,1,1,0,0,1,2,1,1,1,1,0,1,1,4,0,0,0,2,1,1,2,0,0,2,1,0,0,0,0,2,0,1,0,1,1,0,0,1,1,0,0,0,2,2,2,0,0,2,2,2,1,1,2,0,1,1,0,2,1,2,2,0,1,2,4,0,3,0,1,0,0,1,1,2,2,1,3,0,0,2,0,1,1,2,2,1,1,5,5,1,2,0,1,1,0,2,1,0,0,0,2,2,1,1,0,0,4,0,0,0,1,2,0,1,5,1,2,0,1,1,0,0,1,3,0,1,1,0,1,1,1,1,0,1,2,1,0,1,0,2,2,0,0,2,0,1,1,1,1,1,0,0,3,1,1,0,0,1,0,1,0,1,1,1,3,0,2,1,0,0,2,2,1,0,0,0,1,0,0,3,3,1,1,1,0,2,2,1,3,2,0,1,1,2,1,0,0,2,2,1,1,0,1,0,1,0,1,1,0,1,1,0,1,1,0,2,1,0,1,0,0,1,0,0,1,0,1,0,2,3,3,1,0,1,2,1,1,0,1,0,3,1,2,1,1,2,0,0,1,0,4,0,0,1,0,0,1,1,2,2,1,3,2,0,1,0,1,2,0,1,0,1,0,3,2,0,5,2,2,1,1,0,1,1,1,2,0,1,1,0,1,0,1,1,0,0,1,2,0,1,1,0,0,0,0,0,0,3,0,1,0,1,0,1,0,0,4,1,1,1,2,0,3,2,2,0,0,2,0,0,2,0,0,2,0,1,2,0,1,0,0,1,0,1,0,3,0,0,0,1,0,2,0,2,2,0,1,1,1,1,2,0,1,2,1,2,0,0,1,0,2,3,1,0,3,1,1,2,1,0,1,0,2,0,2,1,1,1,1,1,1,1,1,1,1,1,2,2,1,3,2,2,1,0,0,0,1,2,1,1,1,2,1,0,0,1,4,1,1,0,0,2,2,1,1,2,1,2,2,1,2,0,1,0,0,1,1,1,1,0,1,0,1,3,3,1,0,2,1,0,1,1,0,0,0,2,1,2,1,1,1,3,0,1,0,0,0,1,2,2,2,0,0,1,2,0,1,0,1,1,1,0,4,0,1,1,0,0,3,1,1,0,2,2,0,1,1,1,1,1,1,3,1,1,3,1,2,2,2,1,0,1,1,1,1,1,1,0,0,1,0,0,2,1,3,2,0,1,2,1,2,1,0,0,2,2,1,1,3,1,0,0,1,2,2,1,0,3,2,0,0,1,2,0,0,2,1,1,1,1,1,1,3,0,0,0,2,0,1,0,4,0,1,0,0,3,2,2,0,4,0,0,1,2,1,2,0,2,1,1,0,2,1,0,2,1,1,0,0,1,2,0,0,1,0,1,1,0,0,1,1,1,2,1,1,1,0,0,0,2,2,1,0,1,2,1,0,0,2,2,2,1,0,0,0,1,2,2,0,0,1,1,0,1,3,1,0,2,0,2,3,2,2,1,0,2,1,1,1,0,2,3,0,1,0,0,2,0,0,1,0,2,0,0,1,0,1,5,0,1,1,0,0,1,0,0,0,2,1,0,1,0,0,0,2,1,0,0,0,0,0,2,1,0,0,0,1,4,0,0,1,1,1,0,0,0,0,1,0,0,0,2,0,0,0,0,2,1,2,1,3,1,0,0,0,1,1,0,1,1,2,2,0,1,1,2,1,1,0,1,0,2,1,0,4,2,0,3,1,1,3,0,2,1,1,1,2,0,1,0,1,0,0,2,1,1,0,0,0,0,1,3,1,0,0,2,0,1,1,2,0,1,1,1,1,1,1,0,0,0,0,0,3,2,2,0,1,0,0,1,0,2,1,1,1,0,0,1,2,1,1,0,1,1,1,2,1,0,1,1,2,0,2,0,0,2,1,0,2,1,0,1,0,1,1,0,3,0,0,0,0,0,2,0,4,1,0,1,1,1,0,1,1,0,2,0,1,1,2,2,1,1,1,0,0,2,2,0,0,1,0,0,1,2,2,1,0,0,0,0,0,0,2,0,2,2,1,2,2,0,1,1,2,0,1,3,2,2,2,2,0,1,1,0,2,2,1,1,1,1,1,1,2,3,1,3,2,0,0,0,1,0,1,0,0,0,2,0,1,0,0,2,2,1,3,0,1,2,1,4,1,3,0,0,1,0,1,1,1,4,1,1,1,0,1,1,0,0,0,2,0,1,0,3,1,1,1,0,0,1,2,0,1,1,0,2,1,2,1,1,2,1,0,0,1,1,4,1,0,1,0,1,0,2,0,0,0,0,0,0,1,0,0,3,2,0,1,1,1,0,1,0,2,0,1,0,3,0,0,1,0,0,1,1,0,0,0,2,3,0,0,3,1,2,0,3,4,2,2,1,0,2,1,3,1,1,0,2,0,1,1,2,1,1,0,0,0,0,2,0,3,2,0,0,2,1,3,3,1,0,1,0,2,0,0,0,0,1,0,0,1,1,0,0,0,0,1,1,2,0,1,7,0,3,0,2,0,0,0,2,1,0,0,0,0,1,2,0,1,1,1,1,0,0,0,0,0,0,2,2,0,1,0,1,2,0,1,1,0,0,2,0,1,0,0,0,0,1,0,0,1,2,4,2,0,2,1,1,3,0,0,1,1,2,1,0,0,2,0,1,3,0,1,0,1,0,2,0,3,3,2,2,1,0,0,0,1,0,0,1,3,1,2,0,1,1,1,0,0,1,1,3,1,1,0,2,0,2,1,0,4,0,0,1,1,1,2,2,0,1,2,0,0,0,1,1,1,0,1,2,2,0,1,3,0,0,1,0,1,1,1,2,0,0,0,0,1,1,3,1,1,1,0,0,0,1,1,1,0,0,2,1,0,1,1,1,0,1,0,0,2,1,1,0,0,0,1,1,3,1,1,2,1,1,0,3,1,4,3,3,0,1,3,1,1,1,2,1,2,1,2,2,0,2,0,0,1,2,1,3,1,1,1,0,0,3,2,1,0,3,2,2,0,2,0,0,0,0,1,1,1,1,1,2,0,0,3,1,0,1,0,3,1,0,0,2,1,3,1,0,2,0,1,0,0,2,2,0,0,1,1,4,1,0,1,0,1,1,1,1,2,1,0,3,4,0,1,0,0,1,1,2,0,0,0,2,1,0,0,0,2,2,0,2,1,0,0,0,1,1,1,0,2,1,1,3,0,1,0,0,1,0,0,0,3,0,0,1,1,1,0,1,2,1,1,1,1,0,2,2,2,0,2,1,2,3,2,0,2,1,1,1,1,2,1,0,0,1,1,0,2,1,0,1,1,1,1,0,2,1,1,3,1,1,2,0,4,1,0,2,0,0,1,1,1,1,1,1,2,1,0,2,0,0,0,1,1,1,2,0,1,2,3,2,0,1,1,0,1,3,1,2,3,2,2,0,1,3,0,1,0,0,0,0,0,1,0,1,1,1,0,1,0,0,1,1,2,0,1,2,1,0,0,2,1,0,1,0,2,1,2,0,0,2,2,1,1,1,0,0,0,3,1,0,0,1,2,3,2,1,3,1,0,0,1,1,0,1,0,0,0,0,2,0,3,0,1,0,3,0,0,1,2,2,2,0,4,0,1,1,2,1,1,1,2,2,1,0,1,1,0,0,0,0,2,0,1,0,1,0,2,1,0,1,0,0,0,0,0,1,0,0,2,1,0,1,1,1]},{"counters":[2,1,1,0,0,3,1,0,0,1,0,0,0,2,1,2,2,0,1,1,0,2,0,0,0,0,1,1,0,1,0,0,0,0,1,0,1,1,1,0,1,1,2,1,1,0,0,1,0,1,1,2,0,1,1,1,1,2,4,4,3,2,2,1,2,1,2,0,3,1,1,1,2,2,0,2,2,0,3,2,1,0,1,0,2,3,1,2,0,0,1,0,5,1,1,0,0,2,3,0,0,1,0,1,3,0,0,1,1,1,1,2,0,1,2,0,1,0,1,1,0,0,0,3,2,1,1,0,2,0,2,1,1,2,0,1,1,3,1,0,0,1,2,2,0,1,0,0,0,2,2,0,2,0,1,1,1,1,0,1,0,1,0,0,1,0,1,1,0,2,1,0,1,0,1,1,2,0,0,2,1,0,1,1,0,2,1,2,2,1,0,1,1,0,2,0,0,0,0,1,2,1,0,0,2,0,0,1,1,0,2,1,2,3,1,0,3,2,2,1,4,1,3,1,0,0,1,1,0,1,0,0,0,0,2,0,0,1,2,0,1,0,1,0,0,1,3,1,0,0,1,1,0,0,1,1,2,1,1,1,1,3,0,0,1,1,4,1,0,1,0,1,0,1,0,1,1,0,1,0,0,2,1,1,1,2,0,3,1,0,1,3,2,1,0,1,1,1,1,0,2,1,1,0,1,0,0,2,3,0,2,1,0,2,2,0,1,0,0,0,1,1,0,3,0,0,2,1,0,1,1,0,2,0,2,0,2,2,0,0,2,2,3,0,0,1,0,0,1,2,0,1,0,0,1,1,0,1,2,1,2,0,1,1,1,0,1,1,1,1,0,1,1,3,4,1,0,0,2,2,1,0,0,0,1,0,0,1,1,0,3,2,0,1,1,2,1,1,1,0,1,0,1,1,0,2,0,0,3,0,0,1,0,0,2,1,1,2,1,1,0,1,1,0,0,1,0,1,1,0,1,2,2,3,1,3,1,1,0,0,1,1,0,0,2,1,2,0,2,0,3,1,0,3,1,0,1,1,1,0,2,0,0,0,3,1,1,0,2,0,1,1,1,3,1,0,1,2,4,0,2,0,0,0,1,1,2,2,2,1,2,0,1,3,1,3,1,0,0,2,1,1,0,0,0,1,1,1,1,0,0,2,0,1,1,2,2,1,2,0,0,0,1,2,2,1,2,0,1,3,2,1,2,0,1,1,2,0,1,2,0,1,1,0,1,1,1,0,3,1,0,1,2,1,2,1,1,0,0,0,1,1,0,3,0,2,1,2,1,0,3,0,1,1,4,1,1,0,1,2,0,0,1,1,1,3,0,1,1,1,1,3,0,0,1,2,0,1,1,2,2,0,0,4,2,0,1,1,3,1,5,0,1,0,2,0,0,0,1,1,0,0,0,0,0,1,0,0,0,2,1,2,0,1,1,1,0,1,0,1,0,0,0,2,1,0,0,0,2,0,1,0,2,1,1,4,1,2,1,1,0,0,2,3,1,1,0,0,2,2,2,3,1,0,1,3,1,1,0,1,0,0,1,0,2,1,1,0,0,0,1,0,0,3,3,0,1,1,2,3,2,0,4,1,3,1,0,0,1,0,0,2,1,1,0,1,1,1,0,3,1,2,3,1,0,0,3,3,0,3,2,0,1,0,2,1,1,1,1,0,0,1,1,0,0,1,2,2,2,0,1,0,0,1,1,0,1,0,2,2,1,1,2,3,2,2,1,0,2,0,1,0,1,1,3,1,1,1,2,0,2,1,0,3,3,2,0,0,0,1,0,2,3,1,2,2,1,0,1,2,0,0,2,1,1,2,0,1,1,1,3,1,0,1,1,0,0,1,0,1,1,0,0,1,1,1,4,1,0,0,2,0,2,1,1,1,3,2,0,1,2,4,0,1,2,1,3,1,0,0,0,1,0,1,0,0,0,0,1,3,2,1,2,1,1,1,1,0,0,1,0,1,0,2,2,0,2,3,2,0,2,3,0,3,1,2,1,1,1,2,1,3,0,1,1,0,1,0,2,1,0,0,1,1,1,2,0,1,0,1,0,0,1,0,1,1,0,0,0,1,0,2,0,4,1,4,0,2,0,0,0,2,0,0,1,0,1,0,2,0,1,1,1,1,1,0,1,0,0,1,1,0,0,0,2,2,0,3,2,0,1,1,0,2,0,0,2,3,2,0,2,0,0,0,0,1,0,1,0,2,1,1,4,1,4,0,0,0,1,0,0,0,2,0,1,1,1,1,0,2,0,3,0,4,0,1,2,2,2,1,1,2,1,0,1,1,0,1,1,0,2,2,1,1,2,1,0,0,0,0,1,3,0,0,1,0,2,0,3,2,1,1,2,0,0,2,1,0,0,1,1,2,2,2,3,1,3,1,2,0,0,1,1,0,0,1,2,3,0,2,1,0,1,0,2,1,1,1,1,1,3,0,1,2,2,2,0,1,0,1,0,1,1,0,1,2,2,1,1,0,0,0,0,1,2,0,0,0,2,1,1,1,1,1,1,0,2,0,1,1,0,2,2,2,1,1,0,1,1,0,2,0,3,0,0,0,1,1,0,0,0,1,3,2,1,1,1,2,2,0,1,0,0,1,0,0,1,1,2,0,1,1,2,2,1,1,2,1,1,2,3,1,0,0,2,1,0,0,3,1,2,1,1,0,1,4,1,1,0,3,1,1,0,0,2,0,1,0,1,1,0,0,0,0,5,2,1,0,0,0,0,1,0,1,0,0,3,0,0,1,1,3,1,1,2,2,1,1,1,2,0,2,1,1,3,1,0,2,0,2,1,0,1,2,1,3,0,0,0,1,1,0,1,1,1,1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,0,1,2,2,0,3,0,2,1,0,0,0,1,2,0,0,1,0,0,0,1,1,0,1,0,1,1,1,3,0,0,2,1,0,3,0,2,1,0,0,0,1,1,2,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,2,1,0,2,2,1,0,2,1,0,0,2,4,1,1,3,1,2,0,1,2,2,0,0,1,1,1,0,0,1,0,2,1,0,1,0,0,1,1,1,0,1,2,3,0,2,0,0,2,1,2,0,1,1,1,0,0,2,2,0,2,0,0,2,1,0,0,1,0,2,1,1,0,0,0,0,0,1,1,1,1,2,0,2,4,4,1,1,2,0,0,2,3,1,2,0,1,2,0,1,0,1,1,0,0,1,0,1,1,2,1,0,1,2,1,1,3,1,2,1,0,2,1,2,2,0,2,0,2,0,1,1,1,0,0,2,3,1,0,1,1,1,1,1,0,2,0,1,1,1,0,3,0,2,0,0,1,0,1,4,2,1,1,0,0,2,1,0,1,1,1,1,1,3,0,1,2,1,2,3,2,0,1,3,0,0,1,1,0,3,0,1,0,0,2,0,1,2,0,1,0,0,1,1,0,1,0,0,1,1,0,5,3,0,1,1,0,0,0,2,0,0,3,0,1,0,0,0,2,1,1,0,0,0,1,0,0,2,0,2,6,2,1,0,0,0,0,1,2,0,0,1,0,0,0,0,1,2,0,0,1,1,0,0,3,0,2,0,0,0,0,2,0,0,0,0,1,1,0,1,0,2,0,1,0,2,2,0,1,0,2,1,2,2,0,0,1,2,1,0,1,0,0,0,0,2,1,0,1,1,3,1,4,1,1,0,0,2,0,0,2,1,1,1,2,1,0,0,0,3,0,1,3,0,1,0,0,3,1,2,2,2,0,1,0,2,0,2,1,3,0,2,2,1,2,1,1,0,0,1,1,3,0,4,0,1,1,0,1,1,0,2,1,2,2,1,1,2,2,1,0,2,1,1,3,0,0,3,1,1,1,0,1,0,0,0,2,0,0,0,2,1,1,2,0,0,2,0,2,0,0,3,1,0,0,2,0,2,0,1,0,0,0,1,0,3,0,1,0,1,0,2,1,1,1,0,1,1,0,1,3,1,0,1,1,1,0,0,0,3,1,0,3,4,3,4,1,1,2,1,0,0,2,2,2,0,1,2,1,1,4,1,0,0,4,2,0,1,0,2,0,0,0,1,1,0,0,0,0,0,1,0,1,3,0,0,1,1,0,0,0,0,1,3,0,2,0,0,0,0,0,1,1,1,0,2,0,0,0,2,1,0,1,1,0,1,1,2,2,2,1,2,1,2,1,1,0,0,2,3,0,0,0,1,0,2,0,0,1,2,1,0,1,1,1,1,1,2,1,0,0,0,2,2,0,1,0,1,1,0,0,1,0,2,1,1,2,0,2,2,0,1,0,4,1,0,1,1,1,2,1,0,1,1,1,1,2,5,1,1,1,2,0,1,2,1,2,1,1,3,1,2,1,1,1,1,1,0,1,1,1,0,0,0,2,2,0,0,1,1,2,0,3,0,2,2,0,1,1,0,1,1,0,1,1,1,2,0,0,0,2,3,0,1,1,1,1,2,2,1,2,0,2,0,2,0,2,0,0,0,1,0,2,1,0,0,0,3,1,1,2,1,1,0,1,3,2,2,1,0,0,1,1,1,0,3,0,0,1,2,2,1,1,1,1,1,2,2,2,3,1,1,1,0,0,1]},{"counters":[1,1,1,1,2,1,0,0,0,2,0,0,2,1,0,0,2,0,0,0,2,0,1,0,3,1,1,2,1,2,0,2,0,0,1,0,0,2,2,1,0,1,1,0,0,1,0,2,1,1,1,1,2,4,1,0,1,2,2,0,0,0,1,0,1,3,0,1,1,0,1,0,4,0,0,1,0,0,3,1,2,1,0,1,2,1,1,1,1,0,1,0,4,1,2,0,1,0,2,0,2,1,2,1,0,0,1,0,0,1,0,1,0,1,2,1,0,0,0,0,1,0,3,2,2,2,0,1,2,0,0,3,0,1,1,1,1,1,1,0,0,0,1,2,0,2,2,1,0,0,0,0,2,2,1,1,1,0,0,2,1,0,1,1,1,0,1,1,1,1,1,0,2,1,1,1,0,1,2,0,2,0,1,1,1,0,0,0,2,2,0,1,2,1,1,0,0,2,1,0,2,1,0,1,1,0,0,2,0,1,0,3,1,0,2,1,1,3,0,0,2,0,0,1,0,2,0,2,1,0,2,0,0,3,0,0,0,2,1,1,1,0,2,0,2,1,1,1,0,1,3,1,1,0,2,2,0,1,0,2,1,1,1,0,1,1,1,1,1,0,1,0,2,0,1,0,1,0,0,1,1,0,0,2,1,0,0,0,0,0,1,1,2,3,0,0,0,1,2,0,1,0,1,2,0,0,1,1,0,0,0,0,1,2,0,0,1,0,0,1,2,0,2,2,1,0,0,3,1,0,3,0,2,1,1,2,0,0,1,0,1,0,2,0,1,1,1,3,1,1,0,1,0,2,2,1,1,0,0,1,1,2,1,1,1,2,2,2,1,0,3,0,1,2,0,2,0,0,0,0,0,2,2,0,0,1,1,3,1,2,0,1,1,1,3,1,2,2,5,1,1,0,4,1,0,0,0,3,0,1,1,0,1,0,0,2,2,1,3,0,0,1,0,1,2,2,0,0,1,1,0,0,0,1,0,1,0,1,3,1,2,0,4,1,1,1,1,0,0,2,1,1,3,0,1,0,2,1,1,0,0,0,0,2,1,2,0,2,0,1,1,1,3,1,0,1,2,3,1,0,1,1,0,0,0,1,2,0,0,1,2,2,2,0,2,3,1,1,1,0,2,1,1,0,0,1,1,1,2,0,1,1,0,0,0,0,3,1,0,1,2,0,2,2,1,0,2,1,0,0,0,0,0,1,0,2,2,0,0,0,0,1,0,0,2,0,1,3,0,0,0,1,1,1,1,2,0,2,1,0,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,2,0,1,0,1,2,2,1,0,1,2,0,0,2,1,1,3,0,0,0,0,0,0,0,3,0,1,4,0,1,0,3,2,0,1,1,0,0,0,0,1,1,1,3,2,1,2,2,1,0,1,2,0,1,2,2,1,0,2,1,1,2,1,0,2,1,1,1,0,1,1,0,1,2,1,1,2,1,0,2,1,0,1,2,2,0,0,2,0,0,0,0,2,0,0,1,1,1,0,4,0,2,1,2,0,0,1,4,1,0,1,2,3,1,0,2,1,1,3,0,1,3,1,2,3,0,2,1,2,1,1,0,4,2,0,2,0,1,0,1,1,3,0,2,1,2,2,1,1,1,0,1,1,3,2,1,1,1,1,1,2,0,2,3,3,1,0,0,0,0,0,0,0,0,0,2,0,0,0,4,2,3,0,0,1,0,0,0,2,0,0,0,0,0,2,1,4,0,0,1,2,3,2,0,2,2,1,2,1,1,0,1,1,0,3,2,0,0,0,2,0,0,0,1,1,6,0,0,1,1,1,0,2,0,0,0,2,1,1,0,1,0,0,3,1,0,3,1,0,0,0,3,1,1,1,1,1,1,1,0,0,0,0,2,0,0,1,0,0,0,0,2,2,0,1,3,1,2,2,1,1,2,0,1,1,0,0,2,1,2,2,0,3,0,0,0,2,0,0,0,0,1,1,3,0,1,1,3,0,1,2,2,2,2,1,0,0,2,2,0,1,0,0,0,1,1,1,2,1,1,0,0,4,2,0,0,0,0,0,0,0,2,4,2,1,3,4,0,1,2,2,2,0,0,2,2,2,1,1,2,3,3,0,0,1,2,1,1,0,5,1,0,0,1,2,0,0,1,0,1,2,1,2,1,0,0,0,0,1,0,0,3,2,1,0,0,0,1,0,1,0,1,1,1,0,1,3,0,0,1,1,0,2,2,1,1,0,1,0,2,1,1,2,1,1,0,1,1,1,1,0,2,1,1,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,2,0,0,2,0,2,0,0,0,0,1,0,2,0,1,1,0,1,2,2,0,1,0,1,0,0,1,0,0,0,2,3,0,0,1,1,1,1,1,0,0,1,3,2,0,1,2,0,2,1,1,1,2,1,4,0,0,1,1,0,0,0,0,0,0,2,0,0,1,0,0,0,1,0,1,1,0,3,2,2,2,1,0,0,0,0,1,1,1,1,0,1,1,2,1,0,1,1,0,1,3,3,3,0,1,1,2,1,2,0,1,0,3,0,1,0,4,0,2,0,4,0,0,1,1,3,1,1,2,4,0,3,1,1,1,1,0,1,1,1,2,4,2,0,1,3,0,2,1,1,2,1,2,0,2,0,1,2,2,0,1,0,1,1,2,1,0,1,1,2,0,1,0,3,0,1,1,0,1,0,4,0,2,0,2,2,0,2,2,0,1,0,0,0,1,1,2,1,1,0,2,0,1,0,1,1,0,2,1,0,2,1,0,0,1,1,3,0,2,1,3,1,1,0,1,2,1,1,1,2,0,1,0,2,1,0,1,0,0,0,0,1,3,2,2,1,3,0,2,2,0,1,0,3,1,2,1,0,1,2,4,1,1,0,1,2,0,2,2,2,2,1,1,2,2,0,1,2,1,0,1,0,2,0,0,3,2,1,0,1,1,0,1,1,0,2,0,1,2,1,0,0,0,0,0,0,1,0,0,2,0,1,2,0,2,2,0,0,1,4,4,2,0,1,1,1,0,0,0,2,0,0,0,2,0,1,0,1,1,1,0,0,3,0,1,0,1,1,1,0,1,1,2,2,3,0,0,3,0,0,2,0,1,0,0,1,0,2,1,0,0,0,0,2,1,0,2,1,1,2,0,0,0,0,2,1,1,1,3,3,1,2,1,0,0,2,0,0,1,0,2,0,1,2,1,2,0,1,0,0,0,1,0,1,1,1,1,0,3,3,0,2,1,0,0,2,1,1,3,4,2,1,0,0,1,2,0,0,2,1,0,2,0,2,1,0,1,0,0,0,1,1,0,1,1,1,1,4,0,0,0,1,1,1,1,0,4,4,4,1,3,0,2,2,1,1,1,0,0,1,1,2,1,3,0,1,0,1,0,2,1,1,1,1,3,3,2,1,0,1,0,1,0,0,1,0,1,4,3,1,2,1,2,0,2,0,0,0,1,0,1,2,0,2,2,0,1,2,0,0,1,1,2,0,0,0,2,1,1,3,0,1,1,1,0,0,2,1,0,0,0,2,0,0,1,3,0,1,0,2,0,0,2,0,0,1,1,0,2,2,0,3,2,1,0,0,0,3,0,3,0,2,0,0,4,1,0,1,0,0,0,0,2,1,1,0,0,1,0,0,0,1,2,0,0,3,1,0,0,0,1,2,2,1,1,1,0,3,1,0,1,2,2,2,2,0,2,3,2,1,1,1,2,1,0,0,0,2,3,0,6,0,0,0,2,0,1,0,0,1,1,2,1,1,0,4,2,1,1,1,1,1,0,1,0,1,0,0,2,1,3,0,0,0,0,2,2,1,0,0,1,0,1,0,1,3,3,1,0,2,1,1,1,3,0,1,0,0,0,0,1,1,1,1,2,1,2,2,1,0,2,1,2,1,0,0,1,2,2,2,1,1,1,0,1,1,3,0,0,0,0,1,2,2,0,0,3,1,1,0,0,0,2,0,4,0,2,1,0,0,1,3,3,0,0,0,0,0,1,2,0,0,2,2,0,0,3,1,0,1,1,2,0,1,2,0,0,0,1,0,1,1,0,1,0,0,2,0,1,1,1,1,1,0,1,1,0,0,2,0,1,0,1,1,1,0,1,1,2,1,1,0,2,1,1,2,0,0,0,1,1,1,1,2,0,0,1,3,1,2,1,0,0,1,0,1,0,1,1,3,1,1,1,0,1,2,2,1,2,3,1,2,0,2,3,1,0,3,1,3,1,0,1,3,0,0,3,0,0,1,1,2,1,3,1,2,0,1,2,2,2,3,3,0,3,1,1,2,2,2,0,0,0,1,2,0,0,0,1,1,1,0,0,2,2,0,3,2,1,1,2,0,1,0,0,0,0,1,0,2,0,1,0,0,1,0,0,1,1,2,0,2,2,1,0,2,0,3,2,1,2,3,0,2,0,1,0,1,1,2,3,1,0,0,1,1,0,0,2,0,0,3,2,0,1,2,0,1,2,0,1,0,0,0,1,0,0,1,2,1,0,2,2,1,4,1,0,0,0,1,1,3,1,2,2,2,0,2,0,3,0,1,1,2,0,2,0,2,4,2,0,3,2,1,1,2,0,3]}]},"null_count":0,"last_update_version":397952040183005184},"ppf":{"histogram":{"ndv":2,"buckets":[{"count":1022,"lower_bound":"YW5kcm9pZA==","upper_bound":"YW5kcm9pZA==","repeats":1022},{"count":2000,"lower_bound":"aW9z","upper_bound":"aW9z","repeats":978}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,997,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952040562851840},"pi":{"histogram":{"ndv":3,"buckets":[{"count":710,"lower_bound":"NTEwMDE3","upper_bound":"NTEwMDE3","repeats":710},{"count":1378,"lower_bound":"NTIwMDE3","upper_bound":"NTIwMDE3","repeats":668},{"count":2000,"lower_bound":"NTMwMDE3","upper_bound":"NTMwMDE3","repeats":622}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,691,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,631,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952040961048576},"si":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"Mjc2OTY3Mg==","upper_bound":"MjU1ODIxOTQ=","repeats":1},{"count":16,"lower_bound":"MjY4Njc1MTc=","upper_bound":"NDMxNTI0NjQ=","repeats":1},{"count":24,"lower_bound":"NDYxMTQ2OTk=","upper_bound":"NTg1ODg4OTM=","repeats":1},{"count":32,"lower_bound":"NjcxNzUyODE=","upper_bound":"OTk1MjUyNDY=","repeats":1},{"count":40,"lower_bound":"MTA4MzQyODE3","upper_bound":"MTIyMTA5MDE4","repeats":1},{"count":48,"lower_bound":"MTIzMTI5NzI1","upper_bound":"MTMxMjU2MjY1","repeats":1},{"count":56,"lower_bound":"MTMyMzMzMDg0","upper_bound":"MTQxNjY4MTI1","repeats":1},{"count":64,"lower_bound":"MTQ0NDk0Njc5","upper_bound":"MTc0OTcwNjI3","repeats":1},{"count":72,"lower_bound":"MTc1OTEwMzUy","upper_bound":"MTc3NTY3OTc5","repeats":1},{"count":80,"lower_bound":"MTgyMDY1MzEw","upper_bound":"MTk5MDQxNzQ2","repeats":1},{"count":88,"lower_bound":"MTk5MTM0NTE0","upper_bound":"MjEwMzA1MDM5","repeats":1},{"count":96,"lower_bound":"MjIyODQ0MzI0","upper_bound":"MjMwNDg5NDgw","repeats":1},{"count":104,"lower_bound":"MjM1OTE5MzQ4","upper_bound":"MjQ5Mzk5ODE0","repeats":1},{"count":112,"lower_bound":"MjU1NjU1MTQ2","upper_bound":"MjYxODIxNzE1","repeats":1},{"count":120,"lower_bound":"MjYyOTQ0OTAx","upper_bound":"MjgwOTU4OTY3","repeats":1},{"count":128,"lower_bound":"MjgxODczNzU4","upper_bound":"MzA0MzY0NjM4","repeats":1},{"count":136,"lower_bound":"MzE1NDI2ODA3","upper_bound":"MzMzMjg3MjY2","repeats":1},{"count":144,"lower_bound":"MzM4MTEyNjIz","upper_bound":"MzU3NjYxMzkz","repeats":1},{"count":152,"lower_bound":"MzYwODA4MDI5","upper_bound":"MzgxNzUxNDY4","repeats":1},{"count":160,"lower_bound":"MzgyMDY3OTAx","upper_bound":"Mzk2MzQ1NDQ2","repeats":1},{"count":168,"lower_bound":"NDAzMzg1NDI5","upper_bound":"NDE1MzcyMjE4","repeats":1},{"count":176,"lower_bound":"NDE5MzQ4OTc5","upper_bound":"NDI1MDU4Mzkx","repeats":1},{"count":184,"lower_bound":"NDI2NTQ2OTk2","upper_bound":"NDMzODMzNTIy","repeats":1},{"count":192,"lower_bound":"NDM2OTEyNzIz","upper_bound":"NDQ2OTYzMzE1","repeats":1},{"count":200,"lower_bound":"NDU0OTA0NTk3","upper_bound":"NDc3MDM2NTY2","repeats":1},{"count":208,"lower_bound":"NDc4MjY5MDE5","upper_bound":"NDg0Mjc3MDAy","repeats":1},{"count":216,"lower_bound":"NDg3ODA2NDc0","upper_bound":"NDk1ODUxMDAw","repeats":1},{"count":224,"lower_bound":"NDk3ODQ2NTc4","upper_bound":"NTE1MTM0NDY3","repeats":1},{"count":232,"lower_bound":"NTE1NjU2NTQ5","upper_bound":"NTIwODQxNDI4","repeats":1},{"count":240,"lower_bound":"NTI2NzgyODE1","upper_bound":"NTQ1MjM3NDgy","repeats":1},{"count":248,"lower_bound":"NTU5NTI1OTcz","upper_bound":"NTY4MTAzODgz","repeats":1},{"count":256,"lower_bound":"NTgxODI1MTc0","upper_bound":"NjAwMjUwOTgz","repeats":1},{"count":264,"lower_bound":"NjAzMzc0MzM0","upper_bound":"NjEyNjk4NDEw","repeats":1},{"count":272,"lower_bound":"NjEzMjc0ODA0","upper_bound":"NjI0MjE3NDAz","repeats":1},{"count":280,"lower_bound":"NjMxMTMzMDY4","upper_bound":"NjMzMzk0NTY5","repeats":1},{"count":288,"lower_bound":"NjM1MjMyODA2","upper_bound":"NjQzMzA4OTE3","repeats":1},{"count":296,"lower_bound":"NjQ0ODA3MjM0","upper_bound":"NjU2MTYzNjQ5","repeats":1},{"count":304,"lower_bound":"NjYwNzQ1ODIz","upper_bound":"NjY1MDQyMDc2","repeats":1},{"count":312,"lower_bound":"NjY1MjQ4Njg0","upper_bound":"NjgyOTk1OTcz","repeats":1},{"count":320,"lower_bound":"NjkxNjc5NTgx","upper_bound":"NzExNTUwMTY5","repeats":1},{"count":328,"lower_bound":"NzEzODkwNzQy","upper_bound":"NzI2OTk5MDcw","repeats":1},{"count":336,"lower_bound":"NzM3Nzk2Mzgx","upper_bound":"NzQzNjQxOTk3","repeats":1},{"count":344,"lower_bound":"NzQ3NjA1MjU1","upper_bound":"NzUyNzE1MTY4","repeats":1},{"count":352,"lower_bound":"NzUzMjY2MjI1","upper_bound":"Nzc0NTU0ODU1","repeats":1},{"count":360,"lower_bound":"Nzc1MTE3NzU0","upper_bound":"Nzg2MTUxOTc5","repeats":1},{"count":368,"lower_bound":"Nzk1NDE4NjI0","upper_bound":"ODA0OTAzMDAy","repeats":1},{"count":376,"lower_bound":"ODA4Mjg3MjQ0","upper_bound":"ODE0ODE3NDcw","repeats":1},{"count":384,"lower_bound":"ODE2NDY1NjUw","upper_bound":"ODI1MTIwMDQ3","repeats":1},{"count":392,"lower_bound":"ODI1NjY2NTk1","upper_bound":"ODY1MDAyNDAw","repeats":1},{"count":400,"lower_bound":"ODY3MjQ1MDQy","upper_bound":"ODY4Mjc5MTc2","repeats":1},{"count":408,"lower_bound":"ODcyNTY0Mzk4","upper_bound":"ODk5NDQxMzk0","repeats":1},{"count":416,"lower_bound":"OTAyNDcxODA0","upper_bound":"OTA2OTc4NzI0","repeats":1},{"count":424,"lower_bound":"OTA3NDYwMTg0","upper_bound":"OTQzMDc5NDcw","repeats":1},{"count":432,"lower_bound":"OTQ4ODcyNjc2","upper_bound":"OTU3OTg0MzMw","repeats":1},{"count":440,"lower_bound":"OTYwODM5NTM5","upper_bound":"OTY5MDQ1MDgw","repeats":1},{"count":448,"lower_bound":"OTY5MTg3MDAw","upper_bound":"OTc1NTI1MzU0","repeats":1},{"count":456,"lower_bound":"OTgxNjcyOTU5","upper_bound":"OTg4MzcxMjY2","repeats":1},{"count":464,"lower_bound":"OTk2NTM1NTUy","upper_bound":"MTAwOTYzOTEzMA==","repeats":1},{"count":472,"lower_bound":"MTAxNjc0NTU0OQ==","upper_bound":"MTAyNjc5NTQzNA==","repeats":1},{"count":480,"lower_bound":"MTAzNDQwMDE0OA==","upper_bound":"MTA1MzY5MTc3OQ==","repeats":1},{"count":488,"lower_bound":"MTA2MTUyMDY4NQ==","upper_bound":"MTEwNzE3MDE5Mw==","repeats":1},{"count":496,"lower_bound":"MTExNjg2OTI3MQ==","upper_bound":"MTEzMzk3ODM5OA==","repeats":1},{"count":504,"lower_bound":"MTE0NTAzMjg0NQ==","upper_bound":"MTE2MjQ5Mzc3MQ==","repeats":1},{"count":512,"lower_bound":"MTE3OTU4NjgwOQ==","upper_bound":"MTE5MDg5NTc4Ng==","repeats":1},{"count":520,"lower_bound":"MTE5NTUzOTUxNg==","upper_bound":"MTIwNjEwNDEyNw==","repeats":1},{"count":528,"lower_bound":"MTIxMDAzODIyMQ==","upper_bound":"MTIyNzEwNzk4NQ==","repeats":1},{"count":536,"lower_bound":"MTIyODYzMjE4Mw==","upper_bound":"MTI1NTQ1NzE2NA==","repeats":1},{"count":544,"lower_bound":"MTI3MjQ4MjIzMg==","upper_bound":"MTMxMDI5MzY2NQ==","repeats":1},{"count":552,"lower_bound":"MTMxNTM4NzE5NA==","upper_bound":"MTMyMDQ1Mjc4Mw==","repeats":1},{"count":560,"lower_bound":"MTMyMzI3MjE3NQ==","upper_bound":"MTMzNTUyMzczNg==","repeats":1},{"count":568,"lower_bound":"MTM0MzUwMTAyMA==","upper_bound":"MTM1NDczMjg1OA==","repeats":1},{"count":576,"lower_bound":"MTM2NTI5NTQ3MA==","upper_bound":"MTM2ODEzNDUxMg==","repeats":1},{"count":584,"lower_bound":"MTM4MzIwNDMzNQ==","upper_bound":"MTM5OTAwNzYyMA==","repeats":1},{"count":592,"lower_bound":"MTM5OTE4Njk2MQ==","upper_bound":"MTQyMDgwNDA5Mw==","repeats":1},{"count":600,"lower_bound":"MTQyMTg3MTkxMw==","upper_bound":"MTQzNTAxODYzNQ==","repeats":1},{"count":608,"lower_bound":"MTQzNjM0MTU5Mw==","upper_bound":"MTQ0ODQzNzU3OA==","repeats":1},{"count":616,"lower_bound":"MTQ2Mjg0NTQ1OA==","upper_bound":"MTQ3NzgxMjAxOQ==","repeats":1},{"count":624,"lower_bound":"MTQ4MjI0NTY5OQ==","upper_bound":"MTQ5NDg3Mzk4Ng==","repeats":1},{"count":632,"lower_bound":"MTQ5NjMyMjQ3OQ==","upper_bound":"MTUwMTUyNDA2Mg==","repeats":1},{"count":640,"lower_bound":"MTUxMTIwMTg5NQ==","upper_bound":"MTUxOTA2ODk5NQ==","repeats":1},{"count":648,"lower_bound":"MTUxOTc3MjUyNQ==","upper_bound":"MTUyNzY1OTE4OA==","repeats":1},{"count":656,"lower_bound":"MTUzMDg5NzIzMQ==","upper_bound":"MTU0NDc1MjgzMw==","repeats":1},{"count":664,"lower_bound":"MTU0ODU3NDQxNQ==","upper_bound":"MTU1ODczMjY0NA==","repeats":1},{"count":672,"lower_bound":"MTU2MTk5Mjc0NQ==","upper_bound":"MTU3NTM1MDQ5OA==","repeats":1},{"count":680,"lower_bound":"MTU3NjQ5NzM2OQ==","upper_bound":"MTU4MzMxOTIwNQ==","repeats":1},{"count":688,"lower_bound":"MTU4MzcyMTYxOQ==","upper_bound":"MTU5NzA0NzY2Nw==","repeats":1},{"count":696,"lower_bound":"MTU5ODMzMjUwMg==","upper_bound":"MTYxMTc5NDc1NQ==","repeats":1},{"count":704,"lower_bound":"MTYxNDExMjExMQ==","upper_bound":"MTYyNTg1NDQyNA==","repeats":1},{"count":712,"lower_bound":"MTYyOTI5MTc0MQ==","upper_bound":"MTY0OTgwNzkxMA==","repeats":1},{"count":720,"lower_bound":"MTY1Nzc5NDQxNA==","upper_bound":"MTY3NzU3MjIyOA==","repeats":1},{"count":728,"lower_bound":"MTY4ODEzMDY0Nw==","upper_bound":"MTcwNzM3MjE0NQ==","repeats":1},{"count":736,"lower_bound":"MTcyMDcyMjI3OA==","upper_bound":"MTczMTIyMDM1Mw==","repeats":1},{"count":744,"lower_bound":"MTczMjE4MTc1OA==","upper_bound":"MTczOTQ2MjQ4NA==","repeats":1},{"count":752,"lower_bound":"MTc0MTQwMzQ0MQ==","upper_bound":"MTc0NDM3OTQ4Mg==","repeats":1},{"count":760,"lower_bound":"MTc0NTI0MTE0MQ==","upper_bound":"MTc2ODI4NDkyOQ==","repeats":1},{"count":768,"lower_bound":"MTc3MDc1MjkyNw==","upper_bound":"MTc4MzYyODM4Ng==","repeats":1},{"count":776,"lower_bound":"MTc4NTUzMjgxNA==","upper_bound":"MTgwNjM4OTM1Mw==","repeats":1},{"count":784,"lower_bound":"MTgwNzY5NzUyMw==","upper_bound":"MTgxNzAzOTQwNA==","repeats":1},{"count":792,"lower_bound":"MTgyMDY1MTMwMw==","upper_bound":"MTgzMTc2MDAwNw==","repeats":1},{"count":800,"lower_bound":"MTgzNzkwNDAzNA==","upper_bound":"MTg0NjA2ODMyOA==","repeats":1},{"count":808,"lower_bound":"MTg1NDU1MjM4Mg==","upper_bound":"MTg2NDc3NDUyNw==","repeats":1},{"count":816,"lower_bound":"MTg2NzgxNjYxMA==","upper_bound":"MTg4MzY0Mjc5Mw==","repeats":1},{"count":824,"lower_bound":"MTg4NzQ4NjE0Mw==","upper_bound":"MTkwMjM1MzIzMg==","repeats":1},{"count":832,"lower_bound":"MTkwNDM4NTgyNw==","upper_bound":"MTkxMTkyMDU2OQ==","repeats":1},{"count":840,"lower_bound":"MTkxODY5MjE3Mg==","upper_bound":"MTkzMDQ3Mzk0MQ==","repeats":1},{"count":848,"lower_bound":"MTkzNDAxMTY2OQ==","upper_bound":"MTkzNzAzMzQyMA==","repeats":1},{"count":856,"lower_bound":"MTkzOTQ1MjY2Mg==","upper_bound":"MTk0OTI0MjE5Nw==","repeats":1},{"count":864,"lower_bound":"MTk0OTc2NjYxNQ==","upper_bound":"MTk1NjY3Mzk5Ng==","repeats":1},{"count":872,"lower_bound":"MTk1OTc5MDg4Nw==","upper_bound":"MTk3NDY0Njg1Mw==","repeats":1},{"count":880,"lower_bound":"MTk4MTk3NzA2MA==","upper_bound":"MjAwNDU3MTc3NQ==","repeats":1},{"count":888,"lower_bound":"MjAwNzQzMDk5NA==","upper_bound":"MjAxNjIzOTAwMw==","repeats":1},{"count":896,"lower_bound":"MjAyMjAzOTY0Nw==","upper_bound":"MjAyODUyMzEyOQ==","repeats":1},{"count":904,"lower_bound":"MjAyOTA3NDU5MQ==","upper_bound":"MjA2MzA3MzM4MA==","repeats":1},{"count":912,"lower_bound":"MjA2NzA2NjkyNQ==","upper_bound":"MjA3MzQ0MzM4Mg==","repeats":1},{"count":920,"lower_bound":"MjA4MDk0NDY1OA==","upper_bound":"MjA5MjM4NzI2OQ==","repeats":1},{"count":928,"lower_bound":"MjA5NTI2OTk3MQ==","upper_bound":"MjExNzYxOTA5Mg==","repeats":1},{"count":936,"lower_bound":"MjExOTcyNTUwMg==","upper_bound":"MjEyNTM5NjMzOA==","repeats":1},{"count":944,"lower_bound":"MjEyNjE0Nzg1OA==","upper_bound":"MjEzNDc3NTkxNQ==","repeats":1},{"count":952,"lower_bound":"MjE0NTMwMDY2MA==","upper_bound":"MjE1NzUwMzc0Ng==","repeats":1},{"count":960,"lower_bound":"MjE2MDU2NDI2MA==","upper_bound":"MjE2Nzk4NjQxNA==","repeats":1},{"count":968,"lower_bound":"MjE3MjE0NzE4Nw==","upper_bound":"MjE3OTc5NzUyNQ==","repeats":1},{"count":976,"lower_bound":"MjE4MTU1MzQyMg==","upper_bound":"MjE4NzQ4NzY3NQ==","repeats":1},{"count":984,"lower_bound":"MjE4OTMwOTc3Nw==","upper_bound":"MjE5NDY0NDM5Ng==","repeats":1},{"count":992,"lower_bound":"MjE5OTA5OTE0OQ==","upper_bound":"MjIwNjM4MzM1Ng==","repeats":1},{"count":1000,"lower_bound":"MjIxMjQ4NDk0OQ==","upper_bound":"MjIyMzE1NzY0Mw==","repeats":1},{"count":1008,"lower_bound":"MjIyNTU2MTQxNQ==","upper_bound":"MjIzMTQyOTc4OA==","repeats":1},{"count":1016,"lower_bound":"MjIzMjI1MDkwMw==","upper_bound":"MjIzNDQ0MjQ2NQ==","repeats":1},{"count":1024,"lower_bound":"MjIzOTg2NzE2Mw==","upper_bound":"MjI1MTY3MDQwOQ==","repeats":1},{"count":1032,"lower_bound":"MjI1NDEyODk2NA==","upper_bound":"MjI2ODQ5NTMwNQ==","repeats":1},{"count":1040,"lower_bound":"MjI3OTk0MjY3NQ==","upper_bound":"MjI5MDgzMTQ1MA==","repeats":1},{"count":1048,"lower_bound":"MjI5NDY5NjEzOQ==","upper_bound":"MjMwMDAwMjIyNQ==","repeats":1},{"count":1056,"lower_bound":"MjMwMjA5MDEzOQ==","upper_bound":"MjMyMzcxMTk3MA==","repeats":1},{"count":1064,"lower_bound":"MjMyNzkzNTc1NQ==","upper_bound":"MjMzNTc1NDk5Nw==","repeats":1},{"count":1072,"lower_bound":"MjM0MDU5MDU5NQ==","upper_bound":"MjM0OTE2Mjk5OQ==","repeats":1},{"count":1080,"lower_bound":"MjM0OTQ1NDkzMw==","upper_bound":"MjM1NzgwMjc4MQ==","repeats":1},{"count":1088,"lower_bound":"MjM1OTA0MTU4Mg==","upper_bound":"MjM2MTgwNjA4OA==","repeats":1},{"count":1096,"lower_bound":"MjM3NDU3MDM3Nw==","upper_bound":"MjQxNDA4MzY3OA==","repeats":1},{"count":1104,"lower_bound":"MjQxNTY2OTU1NQ==","upper_bound":"MjQzMDY2NDIyOQ==","repeats":1},{"count":1112,"lower_bound":"MjQzMjI5OTk0Mg==","upper_bound":"MjQzNjYwMTU4MA==","repeats":1},{"count":1120,"lower_bound":"MjQ0MTk3MDMzOQ==","upper_bound":"MjQ2NDkwMTU0OA==","repeats":1},{"count":1128,"lower_bound":"MjQ2NjAwNjk5OA==","upper_bound":"MjQ3MzQzNDUwNg==","repeats":1},{"count":1136,"lower_bound":"MjQ3NDA2OTM2NA==","upper_bound":"MjQ3NDU4OTQ4OQ==","repeats":1},{"count":1144,"lower_bound":"MjQ5MjE4MTk1Ng==","upper_bound":"MjUwNDU5MTkyNw==","repeats":1},{"count":1152,"lower_bound":"MjUwODg0Mjc3Mg==","upper_bound":"MjUyMTM4MjE4Ng==","repeats":1},{"count":1160,"lower_bound":"MjUyNDMxMTk5Mw==","upper_bound":"MjUzOTQzODM5NA==","repeats":1},{"count":1168,"lower_bound":"MjUzOTU1ODE5NA==","upper_bound":"MjU2OTI4OTgwOQ==","repeats":1},{"count":1176,"lower_bound":"MjU3MzYyODcyMQ==","upper_bound":"MjU4MjI1MDAyMg==","repeats":1},{"count":1184,"lower_bound":"MjU4MzM3MjMxNg==","upper_bound":"MjU5OTQ4MjU3OQ==","repeats":1},{"count":1192,"lower_bound":"MjU5OTY5MDY2NQ==","upper_bound":"MjYxMDg0MTAwMA==","repeats":1},{"count":1200,"lower_bound":"MjYxMTIwMDA4Nw==","upper_bound":"MjYxNjk3NDg2MA==","repeats":1},{"count":1208,"lower_bound":"MjYyNTIwMjIyMg==","upper_bound":"MjYzMTU3NzI3Ng==","repeats":1},{"count":1216,"lower_bound":"MjYzOTE5MjQ0OQ==","upper_bound":"MjY1NDc3MzI5Nw==","repeats":1},{"count":1224,"lower_bound":"MjY2NTAzODQ2Nw==","upper_bound":"MjY2OTUzMTc3Ng==","repeats":1},{"count":1232,"lower_bound":"MjY2OTkzMzc1NQ==","upper_bound":"MjY4ODA0MDI3MQ==","repeats":1},{"count":1240,"lower_bound":"MjY5Mjg0NTY1MA==","upper_bound":"MjY5Nzg1NTI5OQ==","repeats":1},{"count":1248,"lower_bound":"MjcxNDc5MzAzNg==","upper_bound":"MjcyNTQxNjE5Mw==","repeats":1},{"count":1256,"lower_bound":"MjczNDg4MDM3Mg==","upper_bound":"Mjc0NTg1NjIwMQ==","repeats":1},{"count":1264,"lower_bound":"Mjc1Mjg0OTk2Nw==","upper_bound":"Mjc1ODgwNTA1Nw==","repeats":1},{"count":1272,"lower_bound":"Mjc2NzgzNjU5MQ==","upper_bound":"Mjc3OTA5NTY4Nw==","repeats":1},{"count":1280,"lower_bound":"Mjc4MzExMjg1Mw==","upper_bound":"Mjc4ODU3NjM5NA==","repeats":1},{"count":1288,"lower_bound":"Mjc5Mjc1Mzg5MA==","upper_bound":"Mjc5NzMyOTE5MQ==","repeats":1},{"count":1296,"lower_bound":"Mjc5ODY1MjI1NA==","upper_bound":"MjgxMTQ1NjA0NA==","repeats":1},{"count":1304,"lower_bound":"MjgxMjE5NjExNw==","upper_bound":"MjgxNzE3MzgyNA==","repeats":1},{"count":1312,"lower_bound":"MjgxNzkzMDE5NA==","upper_bound":"MjgzMjI2MzM3Mw==","repeats":1},{"count":1320,"lower_bound":"MjgzNDAyNTA1Ng==","upper_bound":"Mjg0MjcxMDgxNg==","repeats":1},{"count":1328,"lower_bound":"Mjg0Nzc1Njg2OQ==","upper_bound":"Mjg1MjgxNjEzNw==","repeats":1},{"count":1336,"lower_bound":"Mjg1Nzc5NzE2OA==","upper_bound":"Mjg3NTk3MzM1Ng==","repeats":1},{"count":1344,"lower_bound":"Mjg4MjQzOTE3Ng==","upper_bound":"Mjg4OTQyNjM4MQ==","repeats":1},{"count":1352,"lower_bound":"Mjg5MDU3MDg1MA==","upper_bound":"Mjg5OTc3MTM0Mw==","repeats":1},{"count":1360,"lower_bound":"MjkwMDg0NDg4Nw==","upper_bound":"MjkyMTEzNDE0Mw==","repeats":1},{"count":1368,"lower_bound":"MjkyNzAwNDg1MA==","upper_bound":"MjkzNTI0NTc0OA==","repeats":1},{"count":1376,"lower_bound":"MjkzNTk2MDQxMA==","upper_bound":"Mjk0NTIwMDM0Mg==","repeats":1},{"count":1384,"lower_bound":"Mjk1MDA3ODUzMQ==","upper_bound":"Mjk2ODIwNDk2NA==","repeats":1},{"count":1392,"lower_bound":"Mjk3MjY0Njk1Mg==","upper_bound":"Mjk3OTgzNjUwNw==","repeats":1},{"count":1400,"lower_bound":"Mjk4MjYzNDk3Nw==","upper_bound":"MzAwMjAwNTczMA==","repeats":1},{"count":1408,"lower_bound":"MzAwNjY1NTEzOA==","upper_bound":"MzAyMDgyMzM5Nw==","repeats":1},{"count":1416,"lower_bound":"MzAyMzE3NzQzNg==","upper_bound":"MzAzMjQ3MTkzNA==","repeats":1},{"count":1424,"lower_bound":"MzA0MjY4MjMyMQ==","upper_bound":"MzA1MDUwODIxOQ==","repeats":1},{"count":1432,"lower_bound":"MzA1NzE5MDE3MA==","upper_bound":"MzA2NTY0MDUwMg==","repeats":1},{"count":1440,"lower_bound":"MzA2NjczOTIyMg==","upper_bound":"MzA4NTM3Njg3NA==","repeats":1},{"count":1448,"lower_bound":"MzA5MTA5MjY3Ng==","upper_bound":"MzA5NDE0NTE1Mw==","repeats":1},{"count":1456,"lower_bound":"MzA5ODE2NTE1NQ==","upper_bound":"MzExNzc0MjU5Mw==","repeats":1},{"count":1464,"lower_bound":"MzEyMjQzNzIyMg==","upper_bound":"MzEzMTA1MTMzMA==","repeats":1},{"count":1472,"lower_bound":"MzEzMjMxMDQwOQ==","upper_bound":"MzEzNzYxMjk4Mg==","repeats":1},{"count":1480,"lower_bound":"MzE0MTk5Njg5NQ==","upper_bound":"MzE1NjA0MDMyNg==","repeats":1},{"count":1488,"lower_bound":"MzE2MjYzMDA3Ng==","upper_bound":"MzE2NTIwMTI2OA==","repeats":1},{"count":1496,"lower_bound":"MzE2Nzc2NzY0Nw==","upper_bound":"MzE4MjY2NjYyOQ==","repeats":1},{"count":1504,"lower_bound":"MzE4MzEwODAyMw==","upper_bound":"MzE5NDE4OTk0Mw==","repeats":1},{"count":1512,"lower_bound":"MzE5NDQxMTQxOA==","upper_bound":"MzIwMDAzODM1Ng==","repeats":1},{"count":1520,"lower_bound":"MzIwMTkwMTg4Mw==","upper_bound":"MzIwNjA0MjUwMg==","repeats":1},{"count":1528,"lower_bound":"MzIxMTgwMDc1Nw==","upper_bound":"MzIxOTI1Nzc5OQ==","repeats":1},{"count":1536,"lower_bound":"MzIyMDk1MTI1OQ==","upper_bound":"MzIzNTY4MzU3Ng==","repeats":1},{"count":1544,"lower_bound":"MzI1ODI2NzU5MA==","upper_bound":"MzI2MjI4NTIyNA==","repeats":1},{"count":1552,"lower_bound":"MzI2NDA1NTkxMw==","upper_bound":"MzI5MDQyMjA3NA==","repeats":1},{"count":1560,"lower_bound":"MzI5MTIyNzU1OQ==","upper_bound":"MzMwMjMzNzUwMg==","repeats":1},{"count":1568,"lower_bound":"MzMwNzY5MDY1Nw==","upper_bound":"MzMxNzM0MTY4NQ==","repeats":1},{"count":1576,"lower_bound":"MzMxODQ3MTM0OQ==","upper_bound":"MzM0NjQ4NjAyOQ==","repeats":1},{"count":1584,"lower_bound":"MzM0NzA4NTgyOQ==","upper_bound":"MzM2NjM0MzgyOA==","repeats":1},{"count":1592,"lower_bound":"MzM2OTc0MjE3OA==","upper_bound":"MzQwMzA0MjA0Nw==","repeats":1},{"count":1600,"lower_bound":"MzQwNDUwNDQ4NQ==","upper_bound":"MzQyNjk0MzE1MQ==","repeats":1},{"count":1608,"lower_bound":"MzQyOTc0NjcwOQ==","upper_bound":"MzQ0NTU4MzUwOA==","repeats":1},{"count":1616,"lower_bound":"MzQ0NTg1MzY0NQ==","upper_bound":"MzQ2MTE4NDgxNw==","repeats":1},{"count":1624,"lower_bound":"MzQ2MTkxOTYwOA==","upper_bound":"MzQ3NDkyMzI2NQ==","repeats":1},{"count":1632,"lower_bound":"MzQ3Njg4MjU2MA==","upper_bound":"MzQ4NTg2OTE0OA==","repeats":1},{"count":1640,"lower_bound":"MzQ5NjMxNjM2MQ==","upper_bound":"MzUwMDE5MDYwOA==","repeats":1},{"count":1648,"lower_bound":"MzUwNjE3NzA2NQ==","upper_bound":"MzUxODQ0NzQ0MA==","repeats":1},{"count":1656,"lower_bound":"MzUyMDYxMjg3NQ==","upper_bound":"MzUyODA2OTEyOA==","repeats":1},{"count":1664,"lower_bound":"MzUzOTA1NzM0OQ==","upper_bound":"MzU0NTg5NjIyNQ==","repeats":1},{"count":1672,"lower_bound":"MzU1MTIwMDMxOQ==","upper_bound":"MzU3NzczNjc2Nw==","repeats":1},{"count":1680,"lower_bound":"MzU3OTI1Njg4Ng==","upper_bound":"MzU4Nzk2NjcyNg==","repeats":1},{"count":1688,"lower_bound":"MzU5MDAyODUxNQ==","upper_bound":"MzU5NzQ2NDEwMw==","repeats":1},{"count":1696,"lower_bound":"MzYwMjkwNDkzNg==","upper_bound":"MzYwOTk5Njc3OQ==","repeats":1},{"count":1704,"lower_bound":"MzYxMTcxMzczNw==","upper_bound":"MzYyMDk3NzE0NA==","repeats":1},{"count":1712,"lower_bound":"MzYyMzA3OTgyMw==","upper_bound":"MzYzMzQ3MTI5Mw==","repeats":1},{"count":1720,"lower_bound":"MzY0MDA3MTExMQ==","upper_bound":"MzY1MTQ4MzYxMQ==","repeats":1},{"count":1728,"lower_bound":"MzY1NzE5NTk1OA==","upper_bound":"MzY3MjUzMTgyMQ==","repeats":1},{"count":1736,"lower_bound":"MzY4MDY5NTg0OQ==","upper_bound":"MzY4MzE4MTgyMg==","repeats":1},{"count":1744,"lower_bound":"MzY4NjcyNjU1Ng==","upper_bound":"MzcwMDI5MTkwOQ==","repeats":1},{"count":1752,"lower_bound":"MzcwMjA5OTE0MA==","upper_bound":"MzcwNzkwNjQwMQ==","repeats":1},{"count":1760,"lower_bound":"MzcxMjQzNzc4OQ==","upper_bound":"MzcyMjc1NzM5MQ==","repeats":1},{"count":1768,"lower_bound":"MzcyNDQ5MjgyNA==","upper_bound":"MzczNDczMjU3Ng==","repeats":1},{"count":1776,"lower_bound":"MzczNjMzOTM0OQ==","upper_bound":"Mzc1NDA5ODcyMQ==","repeats":1},{"count":1784,"lower_bound":"Mzc2MDI1MDUzNA==","upper_bound":"Mzc3Mzg2MTg5MQ==","repeats":1},{"count":1792,"lower_bound":"Mzc4MDMxNTI5MQ==","upper_bound":"Mzc5MTk2NjU2Nw==","repeats":1},{"count":1800,"lower_bound":"Mzc5NjQ4MTUwNA==","upper_bound":"Mzc5OTU2ODQyNg==","repeats":1},{"count":1808,"lower_bound":"MzgwOTkzOTE3MA==","upper_bound":"MzgzNjUyNDk1Mw==","repeats":1},{"count":1816,"lower_bound":"MzgzODI0Mzg3OQ==","upper_bound":"Mzg1MjQ3OTM4OQ==","repeats":1},{"count":1824,"lower_bound":"Mzg1MjgxMDM2OA==","upper_bound":"Mzg1Njc3MzI0NA==","repeats":1},{"count":1832,"lower_bound":"Mzg1ODEzNTY4Mg==","upper_bound":"Mzg3MTI2Mzg0Mw==","repeats":1},{"count":1840,"lower_bound":"Mzg3NzI5ODQ4OA==","upper_bound":"Mzg5MjEyODUxOA==","repeats":1},{"count":1848,"lower_bound":"Mzg5MzEyOTEzOQ==","upper_bound":"MzkxMDg1OTE1Mw==","repeats":1},{"count":1856,"lower_bound":"MzkxOTYxMTA3MQ==","upper_bound":"MzkyMzY4MTI0MA==","repeats":1},{"count":1864,"lower_bound":"MzkyNTA5Mjk4NA==","upper_bound":"Mzk0NTg4NTQ1NA==","repeats":1},{"count":1872,"lower_bound":"Mzk0NjA3OTY0MA==","upper_bound":"Mzk1ODQ4Mjc5NA==","repeats":1},{"count":1880,"lower_bound":"Mzk2OTcyODQ3Nw==","upper_bound":"NDAxMTQwMTgwNQ==","repeats":1},{"count":1888,"lower_bound":"NDAyODk1MTU2Mw==","upper_bound":"NDA0NDc1NDg2Ng==","repeats":1},{"count":1896,"lower_bound":"NDA1MDI0MjExNg==","upper_bound":"NDA2Mzk0MzA5NA==","repeats":1},{"count":1904,"lower_bound":"NDA2NDYxNDQ1NQ==","upper_bound":"NDA4Njg0MDM2OQ==","repeats":1},{"count":1912,"lower_bound":"NDA5MDc0MTU1Mg==","upper_bound":"NDExOTQ2MjM0NA==","repeats":1},{"count":1920,"lower_bound":"NDExOTUyNDc3OQ==","upper_bound":"NDEzMTgwOTY2NA==","repeats":1},{"count":1928,"lower_bound":"NDEzMTg5NzMxMw==","upper_bound":"NDE0MTIyOTczMQ==","repeats":1},{"count":1936,"lower_bound":"NDE0NzcwNzk0MA==","upper_bound":"NDE1MjY5NjM1Mg==","repeats":1},{"count":1944,"lower_bound":"NDE1NTM2MzI0MA==","upper_bound":"NDE2MzY4NTAzMw==","repeats":1},{"count":1952,"lower_bound":"NDE2NDk5NzYyMg==","upper_bound":"NDE3MTUxMDcwNA==","repeats":1},{"count":1960,"lower_bound":"NDE3NDc2MDQ0Nw==","upper_bound":"NDE5MDUxNDQzOA==","repeats":1},{"count":1968,"lower_bound":"NDE5MTYzNjc2Mw==","upper_bound":"NDE5OTg4MDY3OQ==","repeats":1},{"count":1976,"lower_bound":"NDIwNjU3OTk4OA==","upper_bound":"NDIyNTk2ODg0Ng==","repeats":1},{"count":1984,"lower_bound":"NDIzMTI1MjM5NQ==","upper_bound":"NDI0NTA4Nzc4Mg==","repeats":1},{"count":1992,"lower_bound":"NDI1MjE2MDkwNw==","upper_bound":"NDI3MTIwMjE2Ng==","repeats":1},{"count":2000,"lower_bound":"NDI3NDA3NTQ0NA==","upper_bound":"NDI5MDI1MzU3Mg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3,2,1,1,0,2,0,0,1,2,0,1,0,1,2,2,0,2,2,0,0,1,1,0,0,2,0,0,3,0,0,1,2,1,1,2,0,2,1,3,1,1,1,0,3,1,1,1,0,0,1,0,2,1,1,0,0,0,0,0,2,1,1,1,0,1,0,2,2,1,1,2,2,0,0,2,1,0,0,0,0,1,1,0,1,1,0,2,1,1,3,1,0,0,2,1,0,1,1,2,1,1,5,0,3,0,1,0,1,2,0,2,1,1,2,0,2,1,1,2,1,1,0,0,1,0,1,0,2,1,1,1,1,3,0,1,1,1,0,2,4,1,0,1,0,1,3,0,2,1,2,0,0,2,1,0,1,2,2,1,3,2,2,2,2,1,0,0,2,2,0,0,0,0,1,0,1,1,2,0,1,3,1,1,2,1,3,0,2,1,0,0,0,0,1,0,0,0,1,0,0,1,1,3,1,0,0,1,1,1,0,1,2,2,0,1,4,0,0,2,1,1,2,0,1,1,0,0,1,1,0,0,0,2,1,1,1,0,0,1,1,2,1,1,0,2,0,1,4,1,1,0,0,1,0,1,1,1,2,1,1,2,0,1,2,1,0,1,1,2,1,2,0,0,0,0,2,1,1,1,0,3,0,0,2,1,0,3,0,3,3,4,2,2,1,3,0,2,0,2,4,0,0,1,0,0,1,0,3,0,2,0,1,1,1,1,1,2,3,1,1,0,1,1,1,0,3,1,2,3,4,2,1,2,0,0,2,0,0,1,0,1,0,0,1,1,1,0,1,0,0,2,0,3,2,0,1,2,2,0,0,0,1,1,0,1,1,1,0,1,0,2,1,0,1,2,0,0,1,0,1,1,0,0,3,1,0,3,2,3,1,0,2,0,2,1,0,2,3,1,1,0,2,0,1,0,1,0,2,0,1,0,1,3,2,0,1,0,0,0,2,0,1,2,0,0,0,2,2,1,3,1,1,3,1,0,0,1,0,2,0,0,0,3,0,3,1,1,1,0,1,2,1,4,1,0,1,0,1,1,0,2,2,1,2,2,1,3,1,0,0,1,0,0,1,2,3,2,1,1,2,0,0,2,1,1,0,1,1,0,3,0,1,3,0,2,0,0,1,1,0,0,2,1,2,0,0,0,2,2,1,0,1,2,3,1,2,1,3,0,0,2,2,0,2,0,3,0,1,1,0,1,2,0,2,0,0,0,1,1,1,0,1,2,3,1,2,1,0,2,0,3,4,1,0,0,3,0,1,0,1,1,3,0,2,1,0,2,2,2,3,0,1,3,2,3,1,1,1,0,2,1,1,2,2,2,0,0,0,1,0,0,2,0,2,0,1,1,2,7,0,4,0,2,4,0,0,1,1,1,2,1,0,1,2,0,2,1,1,3,0,1,2,0,3,1,0,1,0,3,4,0,0,1,1,2,0,1,2,1,2,0,2,2,0,0,1,1,1,1,1,0,1,0,1,0,3,0,1,1,1,0,1,0,0,2,0,1,2,2,1,0,1,3,1,1,2,1,1,1,0,2,3,1,1,0,0,0,1,4,0,3,2,0,1,1,0,1,0,0,1,0,0,1,0,0,1,0,2,0,1,1,0,0,0,1,2,3,0,0,0,1,1,0,1,0,1,2,0,0,0,0,1,0,0,0,4,2,2,1,1,1,2,0,1,0,0,0,3,2,1,1,0,0,2,0,2,1,1,2,1,1,1,1,0,0,0,0,1,1,0,2,2,0,1,2,0,0,0,0,1,1,1,1,1,0,1,2,0,3,0,1,0,2,0,3,3,2,0,0,0,0,1,0,3,1,1,1,2,0,0,1,1,1,0,0,1,0,2,0,1,1,0,0,2,1,1,0,1,1,0,2,0,2,1,1,3,1,2,0,0,1,3,1,1,1,0,1,0,1,1,2,2,0,2,0,1,2,2,1,1,2,2,1,1,0,1,1,0,0,0,0,0,2,2,0,0,1,0,0,2,0,0,3,1,0,3,3,0,1,0,1,2,2,2,0,1,0,1,1,0,2,1,2,0,1,0,1,0,3,2,0,0,0,0,2,3,2,2,1,1,0,0,1,1,0,1,0,2,0,0,1,0,1,3,0,1,0,2,1,1,1,2,1,2,5,1,1,1,0,0,1,3,1,1,0,1,0,1,0,1,1,0,0,1,1,0,1,1,2,2,1,2,0,0,1,2,1,1,4,1,0,0,0,2,2,0,3,0,1,0,1,0,2,1,3,1,0,0,1,0,1,2,1,0,0,1,1,1,0,0,1,0,1,1,1,0,0,3,1,1,2,2,1,0,1,1,1,0,1,1,2,0,2,1,0,1,1,2,1,0,4,1,2,2,0,0,0,1,0,0,0,2,3,1,1,0,0,1,2,1,0,1,1,1,2,3,0,1,1,0,0,0,1,0,1,0,0,1,0,1,1,3,1,2,1,1,0,1,3,0,4,2,0,1,0,0,0,2,0,1,0,0,1,0,1,1,0,0,1,0,0,0,2,1,0,1,0,1,2,2,0,0,1,1,1,1,0,1,0,2,0,1,1,0,1,1,3,1,1,0,1,0,2,3,0,1,2,3,1,1,1,1,2,0,1,2,1,0,1,2,2,0,0,2,0,0,2,2,0,0,2,0,1,0,0,2,1,0,1,0,0,1,1,2,0,1,1,1,1,1,0,0,1,0,0,1,0,2,1,1,1,1,2,0,2,0,0,0,2,1,0,2,0,1,1,2,2,1,1,0,0,0,1,1,0,1,1,1,1,0,0,1,0,0,1,3,2,1,0,1,2,0,1,0,1,0,3,1,0,1,1,1,0,0,1,1,0,1,1,0,0,0,1,3,3,0,2,1,0,2,1,0,2,0,1,0,2,2,1,1,1,1,1,1,0,0,5,2,0,3,0,0,0,1,1,2,1,0,2,1,2,0,2,0,1,3,1,2,0,0,1,1,1,1,0,2,1,1,0,0,0,0,1,2,0,0,1,2,1,0,1,0,0,1,1,1,2,0,3,1,0,0,1,1,1,0,2,2,0,0,3,1,0,2,0,2,2,0,1,3,2,1,0,0,0,1,2,0,3,0,0,1,2,0,1,0,1,0,1,0,1,1,0,0,2,2,0,2,1,1,0,4,0,5,0,0,1,0,1,0,1,1,0,1,1,0,2,2,0,1,0,2,2,0,0,1,0,2,1,1,0,2,0,1,2,0,0,0,1,4,1,1,4,0,4,0,1,1,0,0,1,1,0,4,3,1,2,0,4,0,0,0,1,0,2,2,0,0,0,2,1,2,1,0,0,2,3,0,1,2,2,0,2,3,0,0,2,2,0,0,1,1,1,1,0,1,2,1,0,2,1,0,2,2,3,3,1,1,0,3,2,0,1,1,3,1,1,0,0,0,0,0,1,0,1,1,1,2,1,0,2,0,1,2,2,1,0,1,0,1,2,4,1,2,0,2,1,0,2,1,1,1,0,1,1,0,0,1,1,2,4,1,2,0,0,1,2,1,1,0,2,0,0,1,0,0,2,2,0,0,0,1,1,3,0,1,0,1,0,1,1,1,1,0,1,2,2,1,3,0,1,3,0,0,3,1,0,0,3,2,0,1,1,2,1,0,1,2,0,0,0,2,0,0,0,0,0,0,2,0,3,1,0,0,1,0,0,1,2,1,0,1,2,0,0,2,0,1,0,0,0,0,1,0,2,1,1,3,2,3,1,1,3,0,0,1,0,0,1,0,0,2,0,0,3,1,2,0,0,1,0,0,1,1,2,3,0,1,0,0,0,2,1,0,2,2,1,2,0,0,0,0,0,0,1,1,1,3,1,0,4,0,4,3,0,2,0,1,1,2,2,2,1,2,2,0,1,0,3,1,1,1,1,0,3,2,1,1,0,1,1,1,0,1,1,0,1,1,2,1,2,0,0,1,3,0,2,1,0,0,2,0,1,1,2,1,1,0,1,0,2,2,1,0,0,0,1,1,3,0,0,3,1,1,0,0,0,0,1,2,0,3,1,1,0,0,0,0,1,1,4,1,0,0,0,5,2,1,1,2,0,1,0,1,1,0,1,1,1,1,0,0,2,1,0,0,2,0,2,0,3,0,1,0,1,1,1,0,2,2,1,1,0,0,1,0,2,1,2,3,0,1,0,0,1,0,0,0,1,0,1,3,1,1,4,0,2,1,0,0,2,0,0,1,0,0,0,0,1,1,0,3,1,0,1,1,2,1,0,1,1,1,0,0,0,0,0,1,0,2,0,0,0,1,0,1,0,0,1,2,1,0,2,0,0,0,0,0,0,1,3,0,1,2,0,1,0,1,2,0,0,2,1,1,0,3,2,1,2,2,3,3,1,0,0,1,2,2,0,3,3,0,2,0,1,1,1,1,3,2,1,0,2,1,0,1,0,1,0,1,0,0,0,1,0,2,0,0,0,1,0,1,1,0,0,0,2,1,1,0,1,1,2,1,0,0,0,0,0,0,1,1,1,1,4,2,0,1,3,2,1,0,1,1,2,1,1,0,2,0,0,2,2,0,2,1,0,0,1,2,0,0,0,0,1,1,1,2,1,3,0,1,0,1,0,3,1,2,2,0,1,0,1,2,0,0,0]},{"counters":[2,1,0,2,0,0,2,1,0,0,1,1,2,0,5,0,1,2,1,2,0,0,2,1,3,2,1,3,0,1,1,2,0,1,0,1,0,1,2,0,1,0,0,2,1,1,0,0,1,3,0,0,0,0,1,0,0,0,1,1,2,1,1,3,1,0,3,2,2,0,2,0,3,2,0,1,2,1,1,1,0,2,0,0,1,0,1,0,0,0,5,3,3,0,0,0,1,0,2,0,0,2,0,3,1,0,0,1,1,0,0,2,0,0,3,1,1,1,0,1,2,2,1,0,2,2,1,1,1,0,1,1,1,2,0,0,0,1,2,1,0,1,2,0,2,0,4,0,3,1,1,0,0,0,0,1,1,2,1,1,0,0,0,0,1,1,1,0,1,0,0,3,1,1,1,0,0,1,1,1,2,1,1,2,1,3,1,2,1,0,0,1,0,2,1,1,0,1,1,2,0,0,2,0,1,0,0,1,2,1,2,1,0,3,1,0,1,1,0,0,0,0,2,4,1,1,0,0,3,0,0,0,0,2,1,1,0,0,0,1,4,0,0,1,3,1,1,1,0,0,1,1,1,3,1,0,0,2,2,1,1,0,1,2,0,1,3,0,1,1,1,1,1,1,2,1,1,1,2,0,0,3,1,1,0,0,1,0,1,1,1,1,1,0,0,2,0,5,3,1,1,1,0,0,0,1,0,1,1,0,1,1,2,1,1,1,0,0,1,0,1,0,0,0,1,2,0,1,2,1,1,2,1,2,0,0,0,0,1,1,1,0,2,1,0,3,1,2,1,1,2,0,2,0,4,1,1,1,0,0,0,0,2,2,0,0,0,1,0,0,2,0,1,1,0,3,0,0,0,0,3,1,1,2,3,1,0,1,0,2,2,0,1,1,1,1,3,0,0,0,0,0,5,1,1,1,1,1,0,3,1,3,0,0,2,1,1,3,0,2,1,1,1,1,1,0,1,2,1,0,0,2,1,0,0,1,3,0,0,1,3,0,0,3,1,1,0,0,0,0,1,2,0,2,0,2,0,1,0,1,1,0,0,0,2,1,1,1,0,2,0,1,2,2,1,0,0,1,2,5,4,0,2,2,0,1,1,0,1,2,3,1,0,0,1,1,1,0,3,2,2,1,0,2,2,0,0,2,1,1,3,1,0,0,2,1,0,1,2,0,0,1,1,1,0,0,1,1,2,0,0,0,0,3,1,1,2,1,0,1,2,0,1,0,0,1,0,1,1,1,1,0,0,0,0,2,0,4,1,0,0,2,0,0,1,2,0,0,1,0,1,0,0,0,3,1,1,0,3,0,2,2,0,0,1,1,2,0,2,1,1,1,1,3,1,1,2,1,1,0,3,2,2,0,0,2,0,1,1,0,1,2,1,0,1,1,0,0,0,0,2,0,0,2,1,0,5,0,0,2,1,1,0,0,0,2,2,2,1,2,2,0,1,0,1,0,1,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,3,1,0,0,1,2,1,2,1,0,0,1,1,1,1,1,1,1,2,1,4,2,1,0,1,2,0,0,0,0,1,0,1,1,1,1,0,0,1,3,3,0,0,1,3,1,0,2,2,0,0,1,3,2,0,1,0,2,3,2,0,1,0,0,0,3,0,1,1,0,1,0,2,1,1,2,1,1,0,1,2,1,2,0,1,0,1,1,0,2,0,0,2,0,4,2,0,1,0,1,0,1,0,0,1,0,2,1,1,3,0,0,0,2,2,1,3,0,0,0,1,1,1,1,0,0,3,2,1,1,1,1,0,1,1,0,1,1,0,0,2,1,3,0,3,2,2,1,0,2,1,0,1,0,1,3,1,0,0,3,2,1,2,0,1,1,2,1,1,1,3,2,2,1,1,1,1,0,2,0,2,1,0,2,1,1,0,1,4,2,1,0,0,0,0,0,0,1,0,0,0,1,0,2,0,1,1,4,0,0,0,1,1,0,0,1,3,2,1,0,1,2,0,1,1,0,1,2,0,1,1,0,1,1,0,0,3,0,0,2,1,1,2,2,2,0,1,0,0,1,0,0,2,0,0,3,1,0,0,1,1,0,2,1,0,1,2,1,1,2,1,0,1,0,1,1,0,2,0,1,3,1,1,2,1,3,2,1,2,0,0,0,1,0,4,1,1,0,1,1,1,1,1,2,0,0,1,1,0,1,1,0,0,0,4,0,1,2,2,0,1,1,1,1,1,0,0,3,1,0,1,2,1,1,1,2,3,2,2,1,2,0,1,0,2,1,0,0,1,0,1,1,1,0,1,4,4,3,1,1,1,2,0,1,1,0,3,3,2,2,0,1,0,2,1,1,0,2,2,0,1,1,1,0,1,0,1,0,0,0,0,1,2,1,0,1,0,1,1,1,0,3,1,0,0,0,0,1,0,1,1,1,0,1,1,0,1,1,4,1,1,1,1,1,1,1,2,0,1,0,1,3,1,0,0,1,2,1,1,0,1,1,1,1,0,1,3,1,0,0,0,1,0,1,0,1,3,2,0,0,0,0,0,0,1,2,2,3,0,0,0,1,0,1,0,1,0,3,0,0,1,0,0,3,0,1,3,1,1,3,1,0,1,0,1,4,0,1,2,1,2,0,2,1,0,1,2,0,1,3,0,2,1,0,0,1,1,2,1,1,1,0,1,0,0,0,1,2,0,1,2,0,0,2,1,0,0,0,2,0,0,0,2,0,4,1,2,3,0,2,0,2,1,0,1,1,2,0,1,3,1,0,1,1,1,0,1,0,0,0,3,0,1,1,0,2,1,3,1,1,3,1,1,2,1,0,1,0,2,1,1,1,3,1,2,1,2,0,0,2,0,0,1,0,2,1,1,1,0,1,1,1,1,1,0,0,1,1,1,1,3,1,1,0,0,1,0,0,1,0,0,2,3,0,1,0,0,1,1,2,1,1,1,2,1,0,4,1,0,1,2,0,1,0,1,1,0,0,0,0,1,2,1,0,1,0,1,2,0,2,1,0,0,0,0,1,2,3,0,1,0,1,0,0,0,0,1,1,1,0,1,0,0,0,1,2,4,0,2,2,1,2,0,1,0,1,2,1,1,2,1,0,3,0,0,3,1,2,2,1,0,2,0,4,2,0,2,2,1,1,1,1,0,3,0,3,3,1,0,1,1,0,1,0,1,2,0,2,1,2,0,0,0,1,1,0,3,1,1,0,0,2,1,1,1,1,2,2,0,1,2,0,0,0,1,0,1,2,2,1,0,1,2,1,1,2,2,2,1,0,0,0,2,1,0,1,1,1,0,2,1,0,2,2,0,1,1,4,1,2,1,1,1,0,1,2,0,2,0,3,1,1,2,1,2,2,1,0,1,2,0,2,1,2,0,2,1,1,1,0,1,3,0,0,2,1,0,1,4,1,0,1,2,0,2,1,1,0,3,0,1,0,1,0,0,2,1,2,1,2,1,2,1,2,1,0,2,0,2,0,0,2,0,0,1,2,1,0,0,2,2,1,4,0,2,1,1,0,1,2,1,1,0,0,1,0,3,1,0,1,0,1,0,1,0,0,0,2,0,0,0,1,2,0,1,1,0,1,1,1,2,2,2,0,1,2,1,0,0,0,1,1,0,2,3,2,0,2,2,2,1,0,0,2,1,1,1,2,3,2,0,1,1,1,1,1,1,0,0,4,2,3,0,1,4,0,2,3,2,1,1,0,1,2,0,2,2,0,1,3,0,1,1,1,1,1,1,0,1,2,0,1,0,1,1,1,2,1,2,1,0,3,0,1,0,0,1,0,2,1,1,0,0,2,1,1,1,1,0,0,1,0,1,2,0,0,1,0,2,3,0,0,2,1,3,1,1,0,0,2,0,2,1,0,1,1,0,0,1,0,0,0,2,0,2,1,0,1,0,3,0,1,1,2,0,0,2,2,2,0,1,3,1,0,0,0,1,1,1,2,3,1,0,2,1,4,0,1,1,1,1,1,1,2,0,2,2,0,0,0,1,0,1,0,1,1,4,1,2,1,2,1,2,0,1,0,2,3,3,0,0,2,1,1,0,2,0,0,0,0,1,0,3,1,1,0,2,0,0,0,1,2,2,1,0,0,0,0,1,0,3,2,0,0,1,0,1,1,2,0,1,1,1,0,1,0,3,0,0,1,0,2,2,0,1,1,0,2,0,0,1,0,1,0,1,1,0,0,0,2,0,2,0,1,0,0,2,0,1,4,2,1,2,1,0,0,1,1,2,0,1,0,0,0,1,1,0,1,2,0,1,1,0,0,2,1,0,2,3,2,1,3,0,1,1,3,0,0,2,0,2,2,1,0,2,0,0,1,1,1,1,3,2,1,1,2,1,1,1,0,1,0,3,1,2,0,1,1,0,1,2,1,1,1,1,2,2,0,0,2,0,2,0,0,0,1,0,1,1,1,1,1,0,1,3,0,1,2,1,1,0,0,1,0,1,0,2,0,1,2,1,2,4,1,0,0,0,1,0,2,2,2,0,2,1,2,2,0,1,0,2,3,2,1,1,0,1,1,2,0,2,1,0,2,0,1,2,1,2,3,1,0,1,1,0,1,0,2,1,0,1,0,0,1,1,2,1,1,0,0]},{"counters":[0,0,1,0,1,3,0,0,0,0,1,0,0,1,0,0,0,0,1,2,1,0,2,1,3,1,1,2,1,1,2,0,1,1,0,2,2,1,3,1,1,0,0,2,2,2,0,1,1,2,2,2,1,1,2,1,0,1,1,1,1,2,1,0,0,1,3,2,4,3,2,2,1,1,0,1,1,1,1,0,2,1,0,0,1,0,0,1,0,1,0,0,0,2,0,1,0,1,0,0,0,1,2,3,0,2,0,1,2,2,0,0,3,1,1,3,0,1,3,0,2,1,0,4,1,1,0,1,1,0,1,0,1,0,0,2,2,0,0,3,2,0,6,2,1,1,2,1,0,1,1,1,0,0,1,4,0,0,0,0,0,0,2,0,0,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,1,1,2,1,1,1,0,1,0,0,1,1,0,1,1,0,1,0,0,0,1,2,4,1,2,0,1,2,1,1,0,0,2,3,2,1,0,2,1,3,0,0,0,1,1,1,4,2,1,1,2,0,2,0,0,2,0,0,1,2,1,1,2,1,1,1,0,2,1,1,0,0,0,1,1,0,0,0,0,0,3,1,1,0,0,2,0,2,1,0,1,0,2,4,1,0,4,1,2,1,0,1,2,0,0,3,1,2,1,3,0,1,1,1,1,0,1,1,1,1,0,0,1,1,1,1,2,1,2,1,1,1,2,1,5,1,1,2,0,2,0,1,2,1,0,0,0,1,1,2,0,0,1,1,1,1,1,1,1,1,0,1,1,2,0,1,2,0,3,0,0,2,1,0,0,0,0,0,1,1,1,2,1,0,1,2,0,2,0,0,2,1,0,1,1,0,1,3,0,0,1,2,0,0,1,1,0,1,0,2,2,0,0,0,3,0,0,2,0,1,0,0,1,1,0,0,0,1,3,2,2,0,2,0,0,1,1,3,1,1,0,0,2,1,0,3,0,1,1,0,1,1,2,2,1,1,1,0,3,1,1,0,1,0,0,2,3,3,2,1,2,1,1,0,1,0,1,1,1,0,0,1,2,1,1,0,0,2,2,0,0,0,2,4,1,0,0,0,0,0,1,2,1,1,2,1,2,0,0,1,0,0,0,0,1,2,2,1,0,1,1,1,4,0,0,5,1,1,2,2,3,0,1,4,0,0,2,1,0,3,2,3,0,1,0,0,0,2,1,0,1,2,0,0,0,0,1,3,0,2,0,0,2,2,1,0,1,2,3,1,2,2,1,1,1,1,0,1,1,1,2,0,0,1,3,0,1,1,1,1,2,1,1,0,1,2,1,0,1,3,1,0,1,0,0,4,1,1,0,1,0,3,1,0,2,0,2,1,2,2,1,0,2,1,1,0,2,1,0,1,0,1,2,2,0,3,0,0,2,3,0,0,0,2,0,2,0,2,0,0,2,0,0,2,1,0,2,0,2,0,0,1,0,1,0,4,2,1,2,1,1,3,0,2,0,1,0,1,1,1,0,1,2,4,2,1,1,1,1,1,1,4,0,0,0,1,0,0,0,1,1,3,2,0,4,1,2,1,0,1,1,1,2,0,0,0,1,0,1,2,0,0,2,2,0,0,3,1,2,1,1,1,3,0,0,2,1,1,1,1,0,0,3,0,0,0,1,1,0,2,0,1,1,0,0,1,0,2,1,2,1,0,0,3,2,1,3,1,0,1,1,0,2,1,3,1,0,2,0,0,0,1,1,1,0,0,1,1,0,1,1,0,1,0,0,1,2,0,2,0,0,2,1,1,0,2,0,3,1,0,0,0,0,1,0,1,0,1,0,1,1,1,0,1,0,1,1,0,1,4,0,1,0,1,2,1,0,1,1,2,1,0,1,2,0,2,2,1,1,1,0,0,3,0,2,2,0,1,0,1,2,0,3,1,1,0,1,0,1,1,2,4,1,1,1,0,3,3,1,1,1,0,0,0,1,1,0,2,1,1,2,1,0,1,2,0,0,2,0,0,1,0,0,1,1,2,0,0,2,1,0,0,2,1,0,1,0,3,0,1,1,1,1,0,0,0,1,0,1,1,0,1,2,0,1,0,4,2,1,2,1,1,2,0,1,2,0,2,1,1,0,0,2,0,0,1,1,0,3,0,3,0,1,0,0,1,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,2,0,1,0,1,1,0,0,1,4,2,1,1,1,1,2,0,0,1,2,1,0,3,0,1,0,1,0,0,1,0,0,1,0,0,1,0,1,1,0,1,2,0,1,0,2,1,1,1,1,1,0,0,1,1,0,0,2,1,0,1,0,0,0,0,0,3,3,2,0,0,0,1,2,2,2,0,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,2,4,0,1,2,2,5,1,0,0,3,0,0,1,2,1,2,1,2,0,1,0,1,0,0,1,2,1,0,1,2,0,0,1,1,1,3,0,1,1,2,2,1,0,1,1,1,0,0,1,1,1,1,0,0,1,0,2,0,0,1,0,1,1,0,2,1,1,1,0,1,3,2,1,1,1,4,2,2,1,1,0,1,0,1,0,1,0,0,0,1,1,0,0,5,1,1,0,1,1,1,2,1,0,0,0,0,2,0,2,1,1,2,2,3,1,1,2,0,3,1,1,1,0,2,1,1,1,2,2,2,0,3,1,0,3,0,1,2,2,0,1,2,0,0,0,2,1,0,0,1,1,1,1,0,0,1,0,0,1,2,0,1,1,4,1,3,1,2,0,2,0,1,1,2,3,0,0,0,2,0,0,1,2,0,0,0,0,0,1,0,0,0,3,1,0,0,1,0,0,3,3,2,0,0,1,1,0,2,0,0,2,0,1,1,1,1,0,2,1,4,1,0,1,0,2,0,0,0,1,1,2,1,3,1,1,0,1,1,0,1,3,1,0,0,0,1,1,0,2,1,1,0,0,2,0,1,3,1,0,1,2,0,1,2,1,1,2,0,1,1,2,5,2,0,1,0,1,0,1,0,1,0,2,1,3,2,0,0,0,0,0,1,1,0,1,0,3,1,2,0,0,0,2,2,0,1,3,1,0,1,0,1,1,0,0,1,0,0,2,1,1,0,2,1,3,2,2,2,1,2,5,1,2,1,1,2,0,0,2,2,0,1,2,0,0,1,0,2,0,2,1,2,1,1,0,0,1,0,0,0,4,1,2,0,0,1,2,2,0,2,3,0,2,1,0,1,0,0,0,0,0,1,0,0,0,1,0,0,2,3,1,2,0,1,1,1,1,0,2,1,0,2,1,1,0,1,1,4,1,0,0,0,1,1,0,0,0,1,2,0,1,1,0,0,0,1,2,0,1,0,1,0,2,1,1,1,3,3,0,0,2,2,0,2,0,0,1,1,1,1,2,3,2,0,1,2,1,1,2,1,3,3,1,0,2,0,2,2,0,0,2,2,1,1,1,0,0,2,0,3,2,1,1,2,0,0,4,1,2,0,3,1,0,1,1,2,1,1,0,0,0,0,1,2,2,2,1,0,0,0,1,1,0,1,0,1,1,2,2,0,1,1,2,2,1,0,2,0,0,0,1,1,1,0,0,3,0,2,1,0,1,3,0,1,0,0,0,2,1,1,1,1,1,2,0,0,1,1,0,1,0,1,1,0,1,2,0,3,3,1,0,0,0,2,1,1,0,1,1,3,1,1,1,2,0,1,1,2,0,1,0,3,1,1,1,0,0,1,0,0,1,1,0,2,3,1,0,0,1,1,0,1,1,0,0,0,0,0,0,3,2,1,0,3,2,3,0,0,2,1,0,1,1,3,0,1,0,0,0,1,1,3,1,0,0,0,3,1,1,2,1,7,1,0,1,0,0,1,2,1,1,2,2,1,0,3,0,1,0,1,0,0,3,2,0,1,2,0,0,1,1,1,0,1,0,0,0,0,1,1,3,1,2,2,0,1,1,2,1,0,2,0,1,2,1,1,1,1,2,0,0,0,0,0,1,1,0,1,1,1,2,0,3,1,0,1,2,1,1,3,2,1,3,3,0,0,0,1,2,0,1,0,0,0,1,1,0,2,0,2,0,2,0,1,0,1,0,1,2,1,0,0,0,0,0,3,1,0,2,2,1,0,4,1,2,0,2,0,1,1,1,3,0,0,0,0,1,2,2,0,2,2,2,1,0,2,0,1,1,1,3,1,3,1,2,1,0,0,0,0,1,0,0,4,4,0,2,1,2,1,1,0,1,1,0,4,2,0,2,0,2,1,1,1,1,0,0,3,1,1,0,0,1,3,1,2,0,4,0,1,1,1,0,0,3,1,3,0,1,0,1,4,2,1,1,1,0,0,0,1,1,0,1,0,0,2,0,2,1,1,1,0,0,2,0,4,0,2,2,0,0,0,1,1,0,1,0,1,1,2,0,0,3,1,1,1,1,2,2,1,3,0,1,0,1,0,0,1,0,1,2,0,1,2,2,0,3,0,1,2,1,0,1,0,1,0,3,1,0,0,0,0,2,2,2,2,0,1,2,1,0,1,1,2,0,1,0,0,0,1,0,2,1,0,3,1,0,0,0,1,0,0,0,1,0,1,3,1,0,0,3,0,1,1,1,1,0,0,5,1,0]},{"counters":[0,0,0,1,2,0,2,3,0,2,1,3,0,0,2,1,4,0,0,3,1,0,0,0,0,0,1,1,0,2,1,1,0,0,1,1,1,1,0,0,0,1,0,1,2,0,2,1,2,3,1,0,2,4,2,0,0,2,1,1,2,1,2,0,0,0,1,4,2,0,3,1,1,0,0,0,1,2,0,2,2,1,0,1,1,1,0,0,1,2,2,0,3,2,4,1,2,0,0,0,2,0,0,1,1,2,1,0,0,0,0,0,1,1,4,4,1,0,0,1,0,0,3,0,0,0,2,1,0,1,4,0,1,2,1,3,1,1,1,0,2,3,3,1,3,1,2,2,2,2,1,0,1,1,2,0,1,1,0,1,1,0,0,1,2,2,3,0,0,1,1,2,0,0,1,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,0,0,0,1,0,2,0,2,1,1,0,1,1,1,1,0,2,2,0,1,1,1,1,2,1,0,3,0,2,3,0,2,2,1,1,3,2,1,0,4,1,2,1,0,0,1,1,2,0,0,0,1,0,1,1,1,2,3,2,0,0,0,1,1,5,0,0,1,0,1,0,0,0,1,1,0,2,0,4,1,1,3,1,1,2,0,0,1,3,0,1,0,1,2,0,0,2,0,0,0,0,2,2,2,2,0,0,1,0,2,1,0,1,1,0,1,1,3,0,0,2,0,2,0,0,0,1,0,3,0,0,1,2,0,1,0,3,0,0,1,0,1,3,1,2,2,2,2,1,0,2,0,0,1,1,0,0,2,0,1,1,1,1,2,0,0,1,0,0,0,0,1,0,2,0,2,1,1,1,0,0,1,0,1,0,1,0,0,0,2,0,1,0,0,1,2,0,0,1,1,2,0,0,1,0,1,0,0,0,2,1,0,0,2,1,0,1,0,2,3,0,0,0,1,1,2,1,1,0,1,1,1,1,2,0,1,1,0,1,0,2,1,0,2,0,3,1,2,1,1,0,1,1,0,2,0,2,1,2,1,0,2,0,1,1,1,0,2,1,1,1,0,1,1,1,0,2,1,1,0,2,1,0,1,0,1,3,2,0,2,1,1,0,0,0,1,0,1,1,2,0,1,1,1,0,0,1,0,1,0,0,0,0,1,0,3,1,0,0,1,1,0,7,0,1,0,1,0,1,1,1,1,1,0,2,0,1,3,2,2,3,2,1,1,0,1,0,1,0,1,2,0,2,1,0,1,2,2,1,2,2,1,0,1,0,2,1,0,1,0,0,0,1,0,1,0,3,0,1,2,0,0,1,0,2,0,0,0,1,2,1,4,1,1,0,2,1,1,2,1,0,2,0,3,1,1,1,1,4,2,2,4,1,0,2,0,0,0,1,1,1,0,5,1,2,1,0,0,3,3,0,0,1,2,0,1,1,1,1,0,0,0,0,0,2,4,0,0,0,1,2,0,0,1,0,0,0,1,0,2,1,1,5,0,1,1,0,1,2,1,2,2,1,0,1,0,1,0,3,3,0,2,3,2,1,1,2,0,1,0,1,2,0,2,3,3,1,3,1,0,0,1,0,0,2,1,0,0,0,0,2,3,1,3,0,0,0,1,0,0,1,0,0,0,1,1,2,2,1,1,2,1,0,1,2,2,0,0,0,1,0,2,0,1,0,3,1,0,0,1,0,2,1,0,0,0,2,1,1,1,0,1,0,1,2,0,1,1,0,1,1,1,1,0,0,2,1,0,1,1,2,0,1,3,4,1,2,0,3,1,0,2,0,1,2,0,0,0,1,0,0,1,2,1,0,1,1,0,0,2,1,1,2,1,2,2,0,2,1,1,0,1,2,1,1,1,2,4,0,2,0,2,0,1,1,0,0,2,0,0,3,0,0,1,1,0,3,1,3,1,1,0,1,0,0,0,1,0,0,0,1,2,1,1,0,0,3,0,0,1,0,3,1,0,2,1,1,0,2,3,0,0,0,1,0,2,0,1,0,0,0,3,1,2,0,0,1,1,0,0,2,1,0,2,1,1,1,1,1,4,1,0,0,1,0,0,0,1,1,0,1,2,0,1,0,1,0,0,0,0,0,1,2,2,1,2,0,1,1,2,0,3,3,0,1,1,3,1,0,0,1,2,1,0,3,1,1,0,0,2,0,0,2,1,1,0,0,0,1,2,0,0,1,0,2,1,1,0,0,1,1,0,1,1,0,2,1,1,0,1,0,2,3,2,3,1,3,0,0,1,0,0,1,1,0,2,0,0,2,0,1,1,1,4,0,2,1,0,1,0,2,0,3,1,0,0,3,1,0,1,3,1,0,2,1,0,1,2,0,2,2,2,0,2,0,0,1,1,0,1,2,0,0,1,0,0,3,1,2,1,2,1,0,0,2,1,1,0,0,2,3,0,1,0,1,2,0,2,0,0,1,2,1,1,1,0,1,1,0,1,2,5,0,1,0,0,0,0,2,1,1,1,2,1,1,1,0,2,1,0,1,0,0,1,0,0,3,0,3,2,1,1,0,1,0,1,0,1,3,0,1,0,2,1,2,1,1,2,1,0,1,1,0,0,1,0,3,1,2,0,0,1,0,0,1,2,0,0,0,1,0,1,2,2,0,2,1,3,2,1,0,1,0,1,0,1,2,2,0,1,2,1,1,3,2,2,2,0,0,0,2,0,2,2,1,0,1,1,2,0,0,2,0,0,0,1,1,0,2,2,1,1,4,0,0,1,1,1,0,1,1,2,1,1,0,2,1,1,1,2,0,0,1,0,1,0,0,2,1,1,2,1,2,3,1,1,0,2,1,1,2,1,3,1,1,2,0,1,2,1,4,0,1,0,1,1,0,1,1,1,0,1,0,0,1,0,1,1,3,1,1,0,1,0,5,1,0,1,1,3,0,3,4,1,1,0,1,1,0,0,2,2,1,0,0,1,0,0,0,1,2,1,2,2,1,3,5,0,0,0,2,0,1,0,1,4,2,0,1,0,2,0,0,1,1,1,1,1,3,1,1,2,0,2,2,2,1,3,1,0,1,0,1,0,1,1,0,0,1,2,1,1,2,0,0,1,1,0,1,1,3,0,3,2,0,0,0,0,0,0,0,0,3,2,1,0,2,0,2,2,2,0,1,2,1,0,1,0,1,3,0,2,1,1,0,2,1,0,1,2,1,3,0,2,0,0,1,2,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,2,0,2,0,1,0,1,1,1,3,2,1,0,1,0,1,0,0,1,2,0,1,0,0,1,1,1,1,1,2,0,0,2,1,0,0,1,1,1,2,0,4,0,2,1,0,0,2,0,2,0,0,1,2,3,0,4,1,1,2,2,4,1,1,0,2,0,0,0,1,1,1,1,1,0,3,0,0,0,0,1,1,1,3,1,0,0,1,2,0,1,1,1,2,0,1,2,0,1,0,0,1,0,0,2,0,5,0,1,0,2,0,2,1,3,0,0,0,1,1,0,1,0,1,1,0,1,2,0,0,2,1,1,2,1,1,0,1,2,0,3,1,2,0,2,0,2,1,0,0,0,0,2,1,1,0,0,0,0,2,1,0,1,2,0,1,1,1,0,0,2,2,2,1,0,3,1,1,0,2,1,2,0,1,1,1,2,1,1,1,0,1,1,3,1,3,3,0,1,1,2,0,1,0,1,0,0,0,1,2,1,3,0,1,0,0,1,2,1,0,2,0,1,0,1,0,1,0,2,0,1,0,2,0,2,1,0,0,0,0,2,2,1,0,0,1,2,1,0,3,1,2,1,2,0,1,1,2,2,0,3,1,1,2,0,0,0,0,0,0,0,1,1,1,0,1,1,1,0,1,2,1,2,2,1,0,3,1,1,2,0,1,1,1,3,1,2,1,1,1,1,2,2,1,1,1,1,0,2,0,3,1,1,3,0,0,0,1,2,0,0,1,0,1,1,1,0,0,0,1,1,2,1,0,0,1,0,4,1,1,0,3,2,1,2,1,1,0,0,0,2,0,1,0,2,2,3,1,1,1,1,0,0,0,4,1,1,3,0,1,2,2,0,1,0,0,1,1,0,2,0,0,1,0,1,0,2,1,1,0,0,0,3,0,1,0,1,0,2,0,0,0,0,3,1,0,2,0,0,1,1,3,1,2,2,1,2,0,2,1,0,0,0,2,1,1,2,0,1,1,1,1,0,4,1,0,2,0,0,2,0,0,2,0,0,2,1,1,3,1,2,0,0,0,0,1,0,0,4,3,1,2,1,3,0,1,1,2,2,0,2,1,3,1,2,0,1,1,3,0,4,0,1,2,1,0,0,1,3,0,1,2,0,0,1,2,0,2,0,0,0,1,0,0,0,2,2,2,0,1,0,1,2,0,1,0,3,2,5,0,0,0,3,0,0,2,3,5,1,0,1,1,0,0,2,1,2,1,2,1,0,0,0,0,0,2,1,4,0,1,2,0,1,0,0,0,0,2,2,2,0,1,0,0,1,0,0,0,1,3,2,0,2,0,0,3,0,0,0,0,2,2,1,0,0,1,3,1,1,0,0,1,1,1,0,2,2,1,1,0,1,1,2,2,2,1,0,0,0,1,1,1,2,4,0,3,1,1,1,2,3,0,1,2]},{"counters":[0,1,2,1,2,1,1,0,2,0,2,0,0,1,0,1,1,0,0,0,1,1,0,1,2,4,1,1,1,2,0,1,1,3,0,1,2,1,0,2,3,1,0,1,1,0,1,0,2,2,1,3,0,0,2,1,0,0,0,1,2,0,1,0,1,1,1,2,1,1,0,0,0,2,1,0,1,3,2,0,1,0,1,1,0,0,3,0,2,0,1,1,1,1,0,1,0,1,1,0,0,1,0,1,2,0,1,1,2,1,0,3,3,2,1,3,0,3,0,1,0,0,1,1,1,0,0,0,2,1,1,0,1,1,2,0,1,1,0,0,1,0,0,2,1,2,1,0,0,1,0,0,1,0,0,0,2,1,3,1,0,2,3,2,1,0,0,0,0,0,1,0,1,1,1,0,1,2,1,1,0,3,1,0,3,0,0,1,0,3,0,0,1,1,1,1,1,0,1,0,1,0,1,2,1,0,2,0,0,0,2,1,2,3,2,0,0,1,2,1,0,1,0,2,1,1,0,0,2,1,0,1,2,0,3,1,0,1,2,2,2,1,2,2,3,2,1,0,3,1,1,2,1,0,0,1,0,0,3,1,0,2,2,1,1,0,1,1,1,3,3,1,1,0,1,0,2,0,2,3,1,1,1,1,2,1,0,0,1,0,0,1,0,1,4,3,1,0,0,0,2,1,2,0,0,0,2,0,1,1,0,0,0,1,0,1,0,1,1,0,2,1,1,1,0,0,1,4,1,1,0,0,0,1,0,0,0,0,0,0,1,2,0,0,0,1,2,0,0,0,2,1,1,1,0,0,1,1,0,1,3,1,1,3,1,1,0,0,0,0,1,3,2,1,0,1,2,2,0,0,1,0,2,2,0,2,2,3,2,1,1,2,1,0,1,2,1,0,1,0,3,1,1,1,5,2,1,0,0,2,0,1,1,3,0,0,0,5,1,5,1,0,1,1,1,1,0,1,0,1,2,1,1,1,0,1,0,2,0,2,3,0,1,1,0,1,3,0,3,1,0,1,2,0,0,2,3,1,0,0,1,1,0,0,1,0,1,2,1,0,0,1,1,0,0,0,2,1,1,1,1,0,0,1,1,2,0,1,1,2,2,1,1,1,0,0,0,0,2,1,2,1,1,0,1,2,0,0,1,1,0,0,2,1,0,0,1,1,1,1,2,0,0,0,1,1,2,0,1,0,1,1,0,1,2,0,2,1,0,0,1,0,0,1,1,0,0,1,0,1,1,1,2,4,1,1,2,2,2,0,0,1,0,1,0,0,3,0,1,1,1,0,0,1,1,1,0,1,1,0,1,1,2,1,1,0,1,1,0,1,2,1,0,2,1,0,1,3,3,2,1,4,0,1,1,0,0,4,1,0,1,3,0,0,1,1,1,0,1,0,0,1,1,1,1,1,2,2,1,3,3,1,1,2,0,1,1,0,3,0,1,0,0,0,0,1,1,1,0,1,1,0,1,0,0,1,1,1,2,1,2,1,0,0,0,1,3,1,1,1,1,0,2,0,0,1,1,1,0,0,0,1,0,1,0,1,1,2,1,2,0,3,4,1,1,0,0,1,0,2,0,0,2,1,1,0,1,2,1,0,2,0,0,0,0,0,1,0,3,0,0,1,1,1,0,1,3,0,0,0,0,1,2,0,2,0,1,1,2,1,0,2,2,1,1,0,1,0,1,0,0,2,3,0,0,1,3,1,2,0,0,0,1,1,2,1,1,2,0,1,0,3,3,4,0,0,2,0,1,0,0,2,0,1,1,2,1,1,2,1,0,2,1,1,1,2,1,3,0,0,2,0,4,1,2,0,1,1,0,1,0,1,0,0,0,0,0,2,1,1,1,0,1,1,1,2,2,0,0,0,0,0,1,2,1,0,0,0,2,2,2,0,0,0,2,1,2,0,3,2,0,0,0,2,2,1,1,1,1,0,1,2,0,1,2,0,0,0,1,0,0,2,3,1,0,2,2,0,0,1,1,1,0,0,0,3,1,0,4,0,0,1,0,0,1,1,1,1,0,4,1,1,2,1,0,2,2,0,4,1,3,0,0,1,1,1,1,2,1,0,2,0,0,0,1,2,2,1,0,0,1,1,1,0,1,2,1,0,0,1,1,2,1,2,0,1,1,1,1,2,2,0,2,3,3,1,1,2,0,0,1,1,1,2,1,2,3,2,0,0,0,1,0,2,1,1,0,2,0,3,1,1,0,2,1,0,2,0,2,0,0,1,2,1,0,2,0,1,0,2,3,1,2,3,0,2,0,1,0,1,0,2,2,3,0,2,2,1,0,1,1,2,0,1,1,0,2,4,1,2,0,1,1,2,0,2,0,1,0,1,1,0,1,0,1,1,2,0,2,0,0,0,1,1,1,1,0,3,1,1,0,0,1,2,1,1,1,3,1,1,1,1,0,1,0,0,1,1,1,1,2,2,0,1,1,2,0,0,5,3,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,2,0,2,0,0,1,0,1,1,1,0,0,1,1,0,0,0,0,1,2,0,0,1,2,0,0,1,0,3,0,0,1,0,0,0,1,2,1,1,1,0,0,1,1,1,1,0,5,3,1,4,0,0,1,1,0,0,0,1,0,3,0,1,1,1,1,1,0,2,2,1,2,2,0,1,2,0,1,0,1,1,0,1,1,0,2,2,0,0,3,0,1,1,0,0,2,1,2,0,1,1,1,2,2,0,1,0,0,0,0,1,2,2,0,2,1,2,1,2,0,3,4,2,2,0,1,2,3,1,0,0,0,0,0,2,1,0,0,0,4,1,2,1,0,1,1,2,2,0,0,0,1,1,1,1,1,1,1,0,0,2,0,1,1,2,0,0,0,0,1,0,0,1,1,0,1,2,2,2,3,2,1,1,1,1,0,0,0,0,0,2,1,0,2,2,0,1,1,0,2,2,1,0,2,3,1,1,2,4,1,1,3,0,0,0,1,1,0,0,2,3,1,3,2,2,1,1,0,3,2,0,0,1,0,1,3,0,1,0,2,0,0,0,2,1,2,1,1,1,1,0,1,2,0,3,2,1,1,0,1,0,0,1,0,1,1,2,2,0,0,0,1,0,1,0,0,1,1,1,0,0,2,1,1,3,1,0,1,0,0,0,1,2,1,1,1,0,0,0,3,0,3,0,1,1,1,1,1,1,0,0,1,1,1,3,0,1,0,2,0,1,0,1,1,0,0,2,2,1,0,1,1,2,1,1,1,1,0,1,0,2,0,1,2,2,0,1,0,0,2,1,2,0,1,1,2,0,2,0,1,1,3,1,2,1,0,0,0,2,1,1,1,3,0,1,0,0,1,0,3,1,0,0,3,0,3,1,0,2,0,0,0,0,1,0,2,1,1,0,1,1,3,4,1,0,0,1,2,0,0,0,4,3,2,0,1,0,1,1,1,0,1,0,2,1,2,0,0,1,2,2,1,0,0,1,2,2,2,3,1,1,1,0,0,0,0,0,1,0,2,0,1,2,3,1,1,0,0,0,1,1,0,0,1,1,1,0,2,0,1,0,0,2,0,2,2,2,0,0,0,3,1,2,0,0,1,1,2,0,1,1,2,1,3,1,0,0,2,0,2,2,3,0,1,0,2,0,2,0,1,0,1,2,2,0,3,1,0,2,1,1,0,4,1,1,0,1,0,1,1,2,1,0,1,1,0,0,5,3,2,0,2,3,0,3,2,0,0,2,0,1,1,5,1,1,0,1,1,1,2,0,0,1,2,1,2,0,3,0,2,0,1,1,1,3,2,2,1,0,1,1,2,3,4,0,0,0,2,0,2,1,0,1,0,1,0,0,2,0,1,3,1,0,2,1,0,2,0,0,0,0,1,2,3,2,1,2,2,2,4,4,0,1,2,1,1,0,1,2,0,4,1,1,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,2,0,1,0,2,2,0,0,0,0,0,1,2,1,3,0,1,4,0,0,2,0,1,1,0,2,1,1,2,1,0,0,0,1,1,1,1,1,1,5,0,1,3,3,3,1,4,0,0,2,1,2,0,0,0,0,2,1,1,0,0,0,2,0,0,2,2,0,3,2,0,1,1,0,2,1,2,2,1,0,2,0,1,2,0,0,0,2,0,0,0,0,1,0,1,0,1,2,1,0,0,1,0,1,0,2,1,0,2,1,0,0,4,0,0,1,2,2,1,3,0,0,1,1,2,0,1,1,1,1,0,1,1,2,2,0,2,2,1,1,1,2,2,1,3,2,1,0,1,1,1,1,0,0,0,0,0,0,0,3,1,3,1,1,1,1,0,1,0,2,0,1,1,0,0,1,1,1,2,1,1,0,1,0,2,0,1,2,0,1,2,1,0,1,1,1,0,1,3,2,1,1,1,0,1,0,0,2,0,0,2,2,1,0,0,0,0,0,2,1,0,1,1,1,2,0,0,0,0,0,1,1,2,1,2,0,1,0,0,1,1,0,4,0,1,1,2,1,0,1,4,1,1,2,1,1,2,2,0,2,1,1,4,0,0,0,0,1,2,0,0,0,1,2,1,0,0,2,1,1,0,0,4,0,1,1,2,2,1,0,2,0,2,2,2]}]},"null_count":0,"last_update_version":397952041005613056},"tid":{"histogram":{"ndv":1999,"buckets":[{"count":8,"lower_bound":"MEpkUVduYVRUVllDZ2RpZFVETGg4MHpSVmNaSEs3SVNLWWk2Nm5KN25ENXBCOEQ3emtFQ0Y0T2x6ZnBEODZ2OWpLaTh4bHpHd0dWa2hOTVE1a0JYOGVzT280TUVzSFlmV205MDRyc25VSlJYN1ZRWHRvd1VhU3lUSWFCV2drYklTVzVxQTJrMkRKajlYcGlENmRDdG1G","upper_bound":"ME9r","repeats":1},{"count":16,"lower_bound":"MFhuWmhLNTNCQkVRU2pSNk52RVhYclo4R0RRQTZGV1VEZWhkVGl0VmR3Rnc5dHFpNDBUWkRWWXNWMWRPMlU5VHZ5cGJLTk1jMEtIdG1JQ1ZlT0NxMUJFbndJd1JDN0hQQzBiMEludG1xbEFwdzBha3d5TE16T2FRU1N2a3FlbkQxS1BTMWdKeVl3ZkFYM0xDbmdZbEFTNDJDbVFEZmtza2pwSzVFTlJvNGNCcko=","upper_bound":"MGtweFhwb0tiM0Z2cmdUWWRzZkN1ZENBOXMwUm9CSTRFQjRHRGlwakdxenV4S2RpWHFXd3JLYko0RmpGOG1wNjlEZ2JDRGlGbHNNQXB2T0NpWWZtVXdlU3VjbVBoZzlRTzNQalVYMFNkSEFiZ0pxSXBuRHV3Qk5qNTV0UXhvYg==","repeats":1},{"count":24,"lower_bound":"MG5kZWhqbzlTckdmTXFmRGdrSkJPOW1NUUJ6NlkxOWQzWWFBeXJKN1FKU3pOY2FxVnUxdEJTc0llR1E4QjVubWFCSkJaQjZmOWJ6NVVDOU9RMlo5d3VoT3N5WHpYdWhPcmxjc3U5ZUc3UTVmNHRrTnhRY1Y1ZkJ0QmFkbFc3NlRXOXZOdmpKMEV1WTdNVndwSnRRZHIxQ0dyNzZOV2JnTmlRdQ==","upper_bound":"MHlPOWJ2QjhWdDA3TzJjNHFSaFgwSVQ3cHJ5aTNYd1A2WGhiQUdzYWVzVlA2bHJuQmpQNlg=","repeats":1},{"count":32,"lower_bound":"MTBVa2xBSzhZOENVRFA4bFRVYWZOeFA5UlFCbE9BQkxUME8wVE93SmFndndtU0Y5b1l0V0doVHVkbXo=","upper_bound":"MTdERE13Rko4WXBMQk9NWTVzMk9kRFU=","repeats":1},{"count":40,"lower_bound":"MTlOU0QwZktESw==","upper_bound":"MVJVVHJ6R0V5Q2lRYnNac21UbnR0RFBmUFdXallGR3BjaUJ1c1hZc1h1UnRKNlpwSUNNRTd1cHBtelI0dzhoaVlJNDJCQWNSVG1pMjlGRlNpekV1NllMTDZDTGpSM3p1YUp1c292Tmp2U056SFhUMm5BblJpQUhVQjhwd3VYWm1YZEhwYm9CUFlzOTA5U3o2cjE=","repeats":1},{"count":48,"lower_bound":"MWlzVlBVWk5FR3ZhWWNkSWkzNVFXY3FMbGcxa3YyR2JLWW9CeXBpaHJ3VUdmeGJ4Qm9WV2pQUG1LcXQzZ2dsUXJabVdLdVZNRHh4RGlqWGdJUnBPR1NYbDFiUEVVNUtPb0htU2pTMjlSSHN6eGdGUjJabmdFWDJkZFNxY2pBbnI=","upper_bound":"MW0=","repeats":1},{"count":56,"lower_bound":"MW0wUmJzY1oxeHJVUWxmYUVJeEpPS2NVNklEYmNMVXR3ckVDNzhVMmcyeEkzbUZwdGpRZVI5QjhmVkVOVldGYUs2RXcxd0NvUnBpUDRWN0R4V0dqdzVOeFRhc2tmUkxYaHFEN3lRMzVxZ1BtRGd1TVlZbEFhQUFlTDZrMFJMMU91VkI2SkdMN3cwbGtMeU5yR0E=","upper_bound":"MXBQR1BqbDlzb0ZwMllVc2RVSDM3MnVNakZCeVNHY0JHcHFEaVpQMDRnelZ1SGFFWjhPejkxbVhXNENrNm5VTXJuYzFjQUs4SHF2dU1Za3Z6UHpUYmZKcjc1VXFTemp3MmNWekl5OXByWGlOTHVQSkJUd1Myd0J2STR5OTVneDNYSTlkazFiZnhydXhJbDlJSkJXcmJuMzZ4WGJQ","repeats":1},{"count":64,"lower_bound":"MXI1Q3A5NjhlSk10MVo3Z1YyanU3a2V4WE15ZlJQN2RucXlHSkhr","upper_bound":"MjQwOHNTTHhuOFd1am1PU2puTU5PODR3cGFEOUkwQ0I5cUtxMXV2dHQza2xjaHJGQUd1YlF4ZmZRTjRLMGhBNVMzamNnV0xYZ2w5dFZncE1STzlSQWd5WGhJcFRCSEZPaElVU0M5ZEVMSlpKOVNxTWROd1VCQQ==","repeats":1},{"count":72,"lower_bound":"MjhNcDROdWJyVlNzNXlORkVJTmtzT1VENU1iNnMyaFo=","upper_bound":"MkpPM29aY1RGbDJ4MG1QOTBzcEk2SXJEakZpMXlzdVBTb24ydnhCSHJ2OFAzdjlpU0NwN1Zqc2g4aU1jbXhhN3J1ODk0ZFplVzhYUVVXZ204SHlxOXA4ZVZHYWVpTUNXN3dXdVNCRGVMTm5YNERSbmY2dHBzWGVIY3RKOFh6ZWFQdmdZQnI2eUlsTw==","repeats":1},{"count":80,"lower_bound":"MktWYnYyNHFkdG9LdjEzR1BqQjEzUkZvYnJSWHJyN2dKWU9Sbzk1MlZhV1pDT0JzSWRBaWNlUDFyalc4d0tZWXlpQUx3VFpTWFpyVWpsTEVXbTRlaEkxMWFBOXBhZFFwdzNHUnJ6cFRn","upper_bound":"MmhqT2F1OVVqc0JBUm90eldXRHpjT2VZZjNNU1NJbVN0WTFXdUhuZVJaa1paYlVnZVkxTWtxRUFycVJJa3FqSmcxMWZ1ekc5endZQnY1MmZFdk1Ra0I0","repeats":1},{"count":88,"lower_bound":"MndFUkowNTBzR2t0UlNBZ1Y4MUpHbWt0QnlORDRYeTVhTUhwakRTc1dmamxIOENaamh3TkFidHVKajVmc2JxMmRaWHpyUmN4a0FWOEpCcEZCNk5OcDZYMEpaNGJDcUg2MDEzWUp3WHFybDhjcTNVdDc1a3FXNWE0VzRHYzlydU0=","upper_bound":"MzlVeEVSc1ZvMllxdGIxR0FyOEpGUDhuT3FkOUxCcnNWZFVhV3U1czVySHBudkJpZEF5dFZuOWd1TEM=","repeats":1},{"count":96,"lower_bound":"M0RpSW5NbW1YUERTY2lYbk1sZ2ZQSTJQc2RDRXQ2cDZVWTEwQk1nOUlpTk1ocDlmVUpiNU9CRkNWN0ZlUQ==","upper_bound":"M05mbHRqQWFJZzZuUDhqakFpN25Edld6U202NUN6Z0hEcU9VR2ZFeTI2STZpeXh5Q2hXVm15dHNWVnBYVW5Gd1E0WjcyeDB6SmpjVVJJQUZB","repeats":1},{"count":104,"lower_bound":"M09HQWlpU01vc1pWWkdtYkxBcERRSWtrVU5HY25acDdjSzVLN3drYUFKWlZ6aE1EQzMzRkZtak03bmlSUHZsU3I3VUxmZGJhOUJIMWQ4RG9xdHlZYkIxT05ldElhUmgzdGNWZlF5cWxzS1lvSklwd1pET3hDT29uTURvYUtJQ210dDdRZzZlOG8xczJMS3R5RkpsZUxGb1Zqdms0MGRlMmlxU2E=","upper_bound":"M2VWdTBKWGVFTHM3bHFIUHcwRHpvWjRRZmQxd2t2OGVtTWNXRGp5VEh3RlZwQ05XNDNiR01TeWozVUQ0cmRQSVdTQzdKTW96OWJ1SmdyeHhrSnA3WUEwMUh1ZWdtS3ZTbnFBeVNORURVWHF5bVFucUVmRDQzS3pBejVJcnBoU0ZqM0hlWXcyNWxxQ2llM0VIcHY3SWZjM1dNNE1TMnE4UHBDRTdGWDY=","repeats":1},{"count":112,"lower_bound":"M2ZQU0tRaDZTbWVPdVBDc0Q=","upper_bound":"M2d3S0dOQ0czcVlOeHFGZXFUSWxIRW5JQ2lGOEw1bTR1TDI5RGVOSVpBS2xsRUQ1SFcxb2ZZaVRDRm1yVHROWFk2cmdFejhUbnhxeHB0MVFXRElKZDQ0cFRHNXRLa29kTGNFTERweDRydFFYY0pqT216SDZzRWlGSWw2SUZGcHptQmRzR3E5U05YZWxBcVVEUWoxS01MdjJOeWZKaG4=","repeats":1},{"count":120,"lower_bound":"NDVCY0NsV0l1dVBuR2JYa3pMeVNZbldoeDZrSTI1dGNIc01Za09IQVlCTEtqRFk4YjdOUTI=","upper_bound":"NEF3NE9YejRNWm03dktzOVhENGdPZEp5eDhBSWVPSTVUT2puV0lCdVdmcHFvRjZTbFFNMUlxQkN1WDZLOEJseXpnZFFLbVp1UFEyeW1CNXlnbEtWQ3J5TEtaYzN0cTdOQjNIVFdHRXU2aE5yamhqeFRscjNjQ1AwQnhBUnJqdzR0RXV1SnhYcTJDTjhaMFBkMzY1QjR4THpwTjZ4V01kd2ZTQVJlTEc=","repeats":1},{"count":128,"lower_bound":"NE5abXp0a0RtcW82bmdBUw==","upper_bound":"NGw1b2dPMlZOc21aNVRldVQ0alNaYnBXd0RrMTF2bDVuamE3ak01RnNxOWJQelRxR2hGVnBmVWZTNVJzRVZJdmMwZGk1Y0JIRkw2MDQ0RUhJb0phOTk4dFpwQU5lcTZqaXY=","repeats":1},{"count":136,"lower_bound":"NGxWanVIb0NnVXd4Sklmb0tHVXZQeEpqYjMzTDZleko0emY4VkxFM1ZmSFZiOFVCSm1aN3ZXa1JWVGY0SXg3YjZsQ3RQN2dWdVVGdmZWUEcxeEZrUERZOFdvRGxMbTlJSU92c2tzSXRjZ0ZrMm5vYkJXUENwc3hQOXBITFl3RDdLZ1prZU5rQlJ3S1dNdnI3aFU4NXZsMFV3NDVFQjRa","upper_bound":"NTdqV2hOVUY2ZEpIQ0hMQUJlVWViV3Jhdkt4V2JsSkFNbkt0WjZRUjNqR3NpSlk1VEJGMFhOdzRrV2J2emxvNEpsa0Uxb2t2R0hMSkNBVXNmQTdY","repeats":1},{"count":144,"lower_bound":"NThrM09HRjBoNFRTUHRoV2dMV21qTDNtVHB3Y3QxamJOczE3UkpJakZ5UG0yZkJMUWJ5anFxdmpUUjBpVXVOM3RoRlJrcXBkWVNCbWtzbW1yc2I2YXQwdG1wRk5hcWlBQk14VDdneEphZ3FTUWNOdW9DQUYwRUdDa0xKUHgxcVg5ZktsSGM3VDZNeXhweXFoOFBCM0E=","upper_bound":"NU52UXFSTUJlNzY4UFVSWnlDWGpZUXFGeDJkSXJiRlNtdUJLeFpyMGI3R01JcHJ2eWVY","repeats":1},{"count":152,"lower_bound":"NVZGclJzRlNLMXF0anc5UzNFWFhxaGhacVVRWWlabEUydGRmSWNobUdSMXR1U3RYUUZUVHRxMDN6eGdiTlozYTdGbGdab3VMVHY4UXdPOHJtalU=","upper_bound":"NWZXd0pZcDNIdDFoVmFpMThQSE5sejVpbVVCTEdCQ1lncTBBMm0zd2pMMHZscW82M1E3NG5DODFidXE2Y0liVHo4M2dpcDA1","repeats":1},{"count":160,"lower_bound":"NXA1bGNKRTN5bUNVeDdOTkhSWFNXbWdtME1uOXJ4d0NveTF5U3AwcUVGMTNMZDBYclEwV1hmZ3JRODJ1MlFnYWV6T0s2aXF4OHNiZkhtWnFCTjJUMnVNd0ozanFzUlRvbThHbkJNNXE=","upper_bound":"NXY4REU4MEN3YnMwWVhFRXhEMzlnNlJNbERhTVZpbWo5RXZ3OW45cTJzMTc3ZVBXY1NhY2lVUGh1T29NSHFKQzdmREZRVUhLTWFsUDRtbU5FUFZuRnplbExjVVhvMVIzZFVPY1R1Qkw4dlRvNUVLNFBBV2gzUmVxTjR2bVJGQ3czVHBnOHFkTnN3ak5wM0JJVg==","repeats":1},{"count":168,"lower_bound":"NXlkRFpKWXRhS3paUUtGclNtYWZva0lSaW9pS05NMDR6OGV6MVd0eEtpY1VoSzRvWDBHUDRYYTVWRVVITHFaaWNwUzJ1SnQ3NmdRd2FZcHdVOU5YMlBDTlNHYWpIbTc2alg3YkZ3dktNeEY3eE8ycEtmTlpJM2RNb29UY3JqZ2hjc3JPNnl2UWdZRGZwdHdLMmk5aEhLb0M3RmQ4VVlkWFIyUnZlTVpUb2lvYlEzeHZZQmlNc1cyY05tUk1ZNEZj","upper_bound":"NjJzdWw4d1RSelRZUE5UakZld1IwY0FScEdOaGd4Mk9CbjZzcHprN3dwcGVmcktWR2NZU3Z2d3ByWk1OZDdvakFra3VVWW1BM3RqT3N6NEtNRUR1MjNMQzR0REJvN3dyVFIxQ1FubU9NVnhSaFFKTGZzMWlsSlhlbDh3Mnp6blV3Mkg0QQ==","repeats":1},{"count":176,"lower_bound":"NkF5T2hzWkQ5ZFlHbmpzSUljTUl3bHJFS2hCQkNMcWN5cXlnMGxRcGM5a2dZczZiUkxwRVI4dEg0Rk5tNFNuaTVmbnhIdU9CR1dnRm13eERuY3pWeFZHYVJ1Y2FaZjRmYWhvS1pYSGR3akRVQW1LQ1k1bnNUU2tQSldidVFCeHc3SjZ1b3FkNm9WVzFPcG9EZWJoYzNwOExPMGlkODQ0MnpsM2M2SVd5QVBiQndUcA==","upper_bound":"NkplcDNBbzI0ajM1Z2o5bG55clkyak55WFN6MEhETWJBbFZmeWZ4Nm53THNzcUppMFgyZ05semhKTjN6bjJ4UkNmV0FiQnB1U3RrSGtYYW9SdWdpVlQ=","repeats":1},{"count":184,"lower_bound":"NkxEZkl4dFFQNUs0WWxZTzA0Q09rV2dVTlFTY3BGOFdkU0Q3T1M1YWJTa2ZHYkVOUzkwRXE4YlBHbWQxOWtJaWNqdGlxYkNYam16TUNZbnVVc0pUT092ckhjTHVYRnVmNVpZSjM0bGlGc2R1QlZRUmNkQjkyT3paeXk0Uk1zQnFSYlpkMG5tczNGU2hvNVlwenlVUkk0Q2lLTEpFcHdPVTZueVY=","upper_bound":"Nk50MU9JZVlPRWZtVm51WW53TG5za1FiMGpCVkZ4NDZYNTRRejFpRjRvcGMxTFRmNzRlSjFyYzJHcTdyNHFBb1h1UzJDQzA5VVR2YjlDMzQ1cmlWYjJLWkt4SnFWcmhDM29wZ0VVbGZCSFM2MEVPMzhJVXBlUVdvVHBCRGVRSXVxY2NkeUNrbHBqd29LOHlUN0tTenplN2Nzb294UnZuUW5YVlhPcVdkR1liZVRu","repeats":1},{"count":192,"lower_bound":"NlBFWURVOTdEOEZBemxyS3htdVNKWVM3OUFSZEdoeXpSdktO","upper_bound":"NmNXY3VBNVdOMEdkem5CbllSTVZHN2VkSm91bFBXN2hjWjV4QXViTUhXYk0xY0lKckV2dWlpRHY1WjF0MEtBWWJjbGFRTHRaTDAzR05LS0cyTmZEdzA1QUxsSEZ0TUo5TXNvazhvOTdBRkJlak1sSE94NTlLOGRZMFJBT0E0TUxtYTJBR0NBSWgwaXBRaGh2N3VVYUN3VGJPenpyd2FLeDAy","repeats":1},{"count":200,"lower_bound":"NnJwVzlhd2QycXdtYm5HSWJ5b2hNSDNCYmZIeWNDQUN2T2JXVVVSOG9LTENjNkozSDBjUlFrTjRzZnJnaWtJenU2T0RMcjZBR1V6bTJQNW9Na0hidTZVRkxEa0JIWkluM1dGazZVTnhuZExVTTNZ","upper_bound":"N0NCUFlpcUFjMUlFaVdoZFI2UVZpMHlSa3plcXhTRWtxdHpjcjN1VWhSTUxtcEFOWUU2dE40bjJvOU1laG9MZU83RlZUVXNZckxlSlc4eG5qNjlIVTJTbEFGWlBXcDQ5RlJmejRiNUFKVmVLeXA4TUZGRk9ERjZaeTJrSWx1TllneGNOTw==","repeats":1},{"count":208,"lower_bound":"N011MG5aMGZZc3QxejkzZ25VYlZES2h4bENBM3poalBFQkZxVUtMazlDWnByQUVEejdCYzBLWmNub2FnOFlh","upper_bound":"N2ZRQVZWT1hHOHMwek1CQXduVQ==","repeats":1},{"count":216,"lower_bound":"N3NNODRmd2p2dkVaOWVBN0g3U2xVV3ZxTU1YS21YZWRhUktWOWYyejZ0MVZuOTdnaFVmVzBaTFBHWFlFbUVjTmMwWnhReEZUT2xqQUJLODlNWHBUaXIwUXNyWG9mTnVMOEl6d1ZYeFR1ajVjdjRVYlA4UnlkTVo1d1RjNE5LVnJjcHRJTjhuMUg=","upper_bound":"N3pQVG5CVWJ2M0VxOU5ha251Q212RTRFQUNWT3JhT3ZJSHFvUUd6V2FXNFhoSHBNbndnNGlqbkNsb3VrTTZpT2puT3NZdUZiczVEajhBbW1wVQ==","repeats":1},{"count":224,"lower_bound":"ODFodXJJZ0w3dG1MTUVwQjg1UkVIRGQzSUwxYjFxRzVzOHhvNkU0elhEcU9nanczV2tUcFVPZk44ZzFSdE5xWjFta0FzdWlWenRDYXhJclpMQmgzM0t2bHBuS3pLajVpa0FxcHZhNXNQcVlxcnBoSHBQM0JkUnlRZExnWTdtb0M0aXlVd0NuZWdHZGdPbUdaQTYzYm92ZDRTNWM=","upper_bound":"OEI5ZkxyWXJiRU1rNUJzVm1UVHh1WE5CWnJRODBBcW1CUW5mdFlvWldJR05yamF4MHhrd0VzU2ttQW1mTmNaVGh5TmxYTWJra2Z5cnhHVVNVd3d6NWJTUloxV01kd1RLWEx6ZEI3cnJFSnlVOA==","repeats":1},{"count":232,"lower_bound":"OEJpbUtwNkdOWEtWeEljMUdEcWpaNHF5MjU4Q05yMHhwbDNVRW4yeWxmUGJienhjdExqTUladDFtQ0ZrbEVSaWdJbUs=","upper_bound":"OE1JMUJmU3I4b3h6OGIwNnJPMmJ3ODBzSHJmdzJVOW9XSE9JTmFrWkNrUw==","repeats":1},{"count":240,"lower_bound":"OE51aXVVcEhNZW1wMTBoNkh3MTBvNGl4NkUyM25URzE4djdUbnJWQWV5UjJ3a0JNeUtPSTE0RmloY3NmNFh5bmo1cmxWc2hodHgwdk1uY2J4d0s1ejA5NVg4TngzemVPc1ZnZUx2aGdCeHhDa3dydG4yMkJranhMQVFTM1ZhOWk2MFdSNmJSS0phMFFqRlVZRnZTVnZGR1Bq","upper_bound":"OGs1RjA4M2o5UDZIVkRGZmhHSkRRV01jZ09zOEFWSDNhOThwNzQ3MTNBeGZZY1JPbkE4UEhidw==","repeats":1},{"count":248,"lower_bound":"OGxZSG1aVEFPT3RlekkybWRndXM5cExKb2x4cjRsVXNMbThWZTBxSDdhS2RyakZldjBnVEpBMG1CTlVYVEh2dGhSbXQ3a3JiOXhpSUE5bXpQUUt0aDJEWExmZTl0MWVsUTM=","upper_bound":"OHM5ekNYODBBTXVjY0xyNk03ZVFBNnVNU2wxYWx6MEYzdVFtaW42MWlEcWZVWU5tdG9pUFB4SWxHeU14cHVMZElMQkZ1WkUz","repeats":1},{"count":256,"lower_bound":"OHNLYXVFZGJaZG9kV3hMSnVadmZQbTlrYUQ1QnNUcEZyYTBlaFloT0FQYnFJWGh6U0RZczZJWFdBN1FMQkQwbEFJZ0tSbWhXMzJqQU5xQVBrSUVmaXhYektXWmI2QXRUR09hUzZRQXo4V3VVakI0M2tuN1NPd1RYTXZTbVEzTnBzUVdjRHM1TGwwYXd2cXlBT3A5ZzNvZEtLam5CbnhHcjk2TXBZS2syQWdaUlROU0s2UU8zMW45TWs=","upper_bound":"OUNJRUtMa3IyRVowRg==","repeats":1},{"count":264,"lower_bound":"OUgxMDFlaXhQemhmdk05ZWZoc3djQmJ2REprd1Q5Y1d4TXpUSVYyS0RjSVdLYTdDYUJXSmNGU0sySEYzU2FKc1pQbXBoWlBMMW45QUtKV3lSVGpzVGxXQjZTdk8=","upper_bound":"OU9IMGkzZFl4NHh3QW9sWWtXbVMwYjVGYUszYnRkcjVRVURjcFg5UVJiR3BYclFGV005QmZlVmZQSXV2bXNuSlV5OUx0T2FHd0ZzbXdwN21WaHNSNEJYdVVlMHFxU1FSQ3JlZ3JVWmdQang4N0hZaGN2TkpWdk55a2JEUm1NMGdhcUlVTlZvSVNhMHpweERnaDN2SEtl","repeats":1},{"count":272,"lower_bound":"OVFBd1h4UTQ3dFhjek5iMHhTRUF6NTc4cldZOFlhcXdkUmZBbDkxdzllOVNScDVydDZjdWF2N1FQbENIcGt3bG1ldjVOem0zT1AydTVBT3lXcWQ5eWRGRVRzTjBzc01HdGhLNGtMaEJNcjVKb0JZazczdjN3TVNRQzdVZHF2dkFWejhONXExMHVlTmNWQVRqVU0=","upper_bound":"OWEydENDWnM0d1lkTWlSWlRZZ1I3Y25EbVh3YTdwYUV4bFQ5RlVjNm9mQ0VFVDlmNWZyOUFzNVVqQTRBZGIxSm0ydHZncmNFM1dNdmtQNHU4U091WGxRU2ltVmNzWQ==","repeats":1},{"count":280,"lower_bound":"OWRFTnNqN3Z5eEoxQThPazd4UWEyMjlna0RrSnJUazB6MVAxbXBZMFpnZA==","upper_bound":"OW5vaVRLR1NLMHpIdEI2cUltaU9tZ093aXdMTjJHY3AyMTY5a2RzNkZzdVhJem95eHdWZDJkN0NsbVVXSUxBREhhR0J4UDlac3M=","repeats":1},{"count":288,"lower_bound":"OW9mRlFuQmg1YzJqY2tOckJZNnhkMUpBZnJ3QmZGVG51cFI1eUZkR1lyRDZXM09ZcXNDVFRjRVZQZWg4ZHREczV4eXNkTVlOdmVuYzR5RDQxbDJHazlEcUZsYWkzVU9TZDJLM2t2Zkl5T2tEQmRabnpuUFppYXpMYk5IODY1RDI0N2ZmZG45NGU=","upper_bound":"QUExbTJYTXBYYm1heExrcm9Fb3dqMmQ2bmhtRGtOcGNoeVFFeGJwdlFQTlRlV2U1bEoydzZDQkFaY2p2VlUyN0dSdlJXck05WHFlZU5mc05VNVlWeEcyY1dtT1JLU0YwRlRHZ0lmbmtpczNrRjV3a2RGekc4dnowdmNxMFY5djIzYUNoQW1ZTzg0akc4a0FzdjFJbkV6S0FqTnVwMkxyejQwTXVZMWJIUVlGYUYx","repeats":1},{"count":296,"lower_bound":"QUJuTzhtcU1RMFlxMkVkcW94WnNvNTBUbGc0SnB5M3kzMjhnYm43UmZKR1d0OVpyV0YzNlJWak9v","upper_bound":"QURVVHU5MTVQeFloYlpKQms4aW1QbndlY1NYdmxkeG8xb0tUYnZRSDU5aXlCTmFzRUc0MWRSd3U3M1RBcnhpV2tSMzlJeGdYeXRzQTd4eXd6dGI2bUZYb01iTnJlWjNxVVAzNGJyYnZtY29mWkV5anE1TUZnaVpCZmZpOFZr","repeats":1},{"count":304,"lower_bound":"QU9tQ2RxZExmWTREd3BFdVlPMVpic1VoQ1c=","upper_bound":"QWk1THhnZThC","repeats":1},{"count":312,"lower_bound":"QXNMMnRHbVR2SUdYYW1xWUhIVjRJUWVSUThmZkFlQTRuM0pFRW5KVFlzeDVlODRwejduNk55dmlqY1plNXp4VnZXVmswUTA0Wm1pVnFDQU1vNGswVHNvTlFKUnF0bUkwQXZ2","upper_bound":"QjhiSW13M2ltTklhWjdhNg==","repeats":1},{"count":320,"lower_bound":"QkxIQnFVak9kOUZDa0xhdldQOEk1NEU2M0h3U09iMWl5WVVXR0RD","upper_bound":"QlZoQURwWjhiYXZReUpncEpBSXNha01RTmNoRG91MERHeUplQXZWbnAyWTgzOFBxVHlOb0pGdmVHYklPSUl6TVdXSndBV0RMZkoxN1Fy","repeats":1},{"count":328,"lower_bound":"QmZYeHhmSTR0dU9sTHJnNkUzbzZTdHZ3UnZwOURxbkVncUpXUVZJTWp2cE9qVlFlQmRuOHJFSXBGdHBlSEo4Sk8wSTVLTFlMYVRlR0xLNEt2MUJYQXRyd3dxZWk1Y2tFZEZNNEtweVZnVHdRNGFJcGtXdUI2S2tqbE1FM001dk92M0hRYzdicWNKVDBVeVRHTjVsSUNjbWlwWjVYWjg3","upper_bound":"QnBSVVJBM3pnWm1La2lWVTFFb0pLYmI2QW1GUGZ3NlBxRm9tZmIzb0c2aDlnSG5LNXNlUk5hWk5XUUtqZWVrc1JTS2JqbURNTDhrcUQ3OHFTcnVlWXA3aWJtbFdJRXcyaE84YWphM2UxOGJzaDhCbXVzRUVmd1ZUZU0zS3VzWmY5eGx1bUlub3Nv","repeats":1},{"count":336,"lower_bound":"QnJkQ1g0VzY0SEp2UWxVWGhyVFc4STdBY216c0F4Skx6b0YyOTJ4Q216RWptMHlKMmhOUVZNaTF5ZjBsbTY4Tjg1U3c=","upper_bound":"QzQxUFl2U2JRVFJ4QUw1VUhFdVpCNjR1VERmeENoQWkxSERRWkpTYnhITHNSRW12TERt","repeats":1},{"count":344,"lower_bound":"QzVSUVZwa1pqcU45b2U=","upper_bound":"Q0xHWDgzZFp3dXJQU2wwNnJaOGVlUDFwV3V0NnBxQW9zZ0JVZmdJbHVj","repeats":1},{"count":352,"lower_bound":"Q01hQkdPOE1idkRDNXFMZmVEeTdyajRDcVR5aTVLTlNvNnFobWtPUHl4SE00aHBDSHA2ZnlEa29icmR5S0VjYVFrQlVIc0REejlWNWV2QmtWS09rc2gxaHhkUUMxZ2ZsSQ==","upper_bound":"Q1JyNDZ6ZzFFbTNpd1F6b3o3cTlKQ2k1enZ2c2JEamFiYmgwd1I3SGRZbXRqcDRObXBQbkt6Y0UxTElyTk9wQ0hmZW1lUnhGRkVhOVFqRDc2WE0xcWNsTWRUSkhucGZjQjRQVnJIa1V1NFNvUDVtNkN0eGlp","repeats":1},{"count":360,"lower_bound":"Q2NzNEFMOWxmZWdBZUZhU1AzcDBaYTZqRWRsbG15QnlxV1FVNEpzNERoYkpIZ3kzanVpVnNiUzdpRzJhbFZwVEJqUDlaeWRQNmFOWXZQUlVDTXNBcTFYcUl2ZFVDTUZDOTQ2Y1VSNFhaUlVLM3hrdG5odDhQd3g4MWcy","upper_bound":"Q2U0MWNTeVpxOEljY2VuUHVDT2tWNEc2Y1FkNHhGYnA0eFNjZDBaQkx6amh1YlNmd21LUWJBRmRCYWhuSGFHOW1jdmxObzVpVTdIU1JnYkNQOWtVZ3FIODQzZUxad29UUzhKS1ZNcFdPZDBBOEdqVUNyWUFP","repeats":1},{"count":368,"lower_bound":"Q2hpblZSQ2hYaTdwWUc0bnhrdnpUNU9weUdFTWhsbzNSc0hlY2V2YTV5ZHJwR21TM0lWS01QM2Y1N2xZVHNJRlNOenF6NEkxYkVZNXlyWGFJdnEzcmxrc1p5R3ZlRmJ6SFZIWDBOenlqVWNJV25XQVh5RHdOSUh1V0VycUQ2V1c=","upper_bound":"Q29iVGFSQUFuOVVKSGdycE1uZHlrREZGQXIxVXFRU3ZnS1p5N3RsVHpsazBkcmFOZTNTVFhXWHZPUjZsc2F4RWFLMjhONTNhVFNBd0NucUZNa3lsR1lLbHJvWjEyaFFVclRJQllCM2Q2dnl5cUJVZ0xDMzZPQTZqMkJLVFlzYkpnbnVKTXVpTGw1YTdpRU9WOUQ0Z0dEdklNNnA0N1NrcDQ=","repeats":1},{"count":376,"lower_bound":"Q3JCbHRGSkdITVQ3dnJ0cGdMRkR0RExrVWtQRmZBM0Q=","upper_bound":"REFMeGcxWFJ2NFJzRk4yYzFicFFwQ0tnbE1sZkZyNVVuU0RNbHhRTTI4Qm5HNWZ6eGV5Qm1IQkpEMGQzR1ZCNmF6MHBUaHdOM0dTMVU3Y1ZnQ0U5UUFIVlZtNks3ZzZ5c3BKNm40QkhQZzhtQVMxUXEwTDE1bnRlSVhTN1hkS3N0T2RaWWdDell3aWFlNWxHSzZ0MnNWRGR4dW9kc2w=","repeats":1},{"count":384,"lower_bound":"REcxYTJTUHExelBLZjhpNzFwd3dmQmo4WlF3UDJBUThaaVJMUFE4UEJTRXQ5MkJnMGY0UzlSUjFXdUd3WldwQTRCSE1xVTFzbzBOYjdqaGRpVXNpMU1MR3RVY244aDFHb2F4RVhaTWRJOG52SENJcE9TZlNzMEc5b0FKUFg=","upper_bound":"RFdxc3pFamo5VkZiblZMczhETVVIb1lYRm1rVnpaRWFTMDFKejVGbTlObDFPYlZ1UDlWcUxKTWpuR2tkQzVweVBKeEd0QnlXR1BldTA1Tlh0MWQ4OHVuVFFhRU9pTlVzQ3V4ZWkwNFY4aWlBMHZDdTFoVDhIYmlzbHdMVw==","repeats":1},{"count":392,"lower_bound":"RFlhRXJUQVl1QUlieHEwa3FBUUZSSm5Xd2xBbHhIUE9pSFNSejZKNEQ=","upper_bound":"RGdFTTJpR1RpeHQwWmFpZ3BWVkdwTnY4alRtUFhaQkxBbmVjM2RnZUlCOG5DN0pDRklwR1ZFVnZPVW8yS3JaVUZJUTdnYmZUMWJPRGZCakswbEc1SEVRd0pMSklMeElHM1hEenZCYm8xUTZsVEVzUTR6MlZTdWdjY0NTTU5zTXBLWnVYTWRodDJvWVgxZVMwZUZqaVJWc05UM0dmY3pMM0RtVm9sZjFQSzF3ZTVZeUt4SHBIeEx5MHBIcDNjMzM=","repeats":1},{"count":400,"lower_bound":"RGdTSWlpeGlTQ2ZrSW1qVFFreFpQWnF3eVoyNVcxTFdiUG1ud3prTkx0aTRCVDhmd3dITFZLTHYxVG42SmNUOG9EZ1NkU2hBaGtuaW1HNWZpSk1IVjNRMFM4VU1ZWmczUnJGanVONGlxMzN5NEFwTlNBVEVxM1dFSlNiNkhlWWFYM29qbGtWUUlETHZvVQ==","upper_bound":"RUlDeldwRXNRZ3ZMbGR0em5DV2lwQnFoaTdxTlMwYXJPTnRqR0RuYUpXdjBSZlExYUpUb2sxSmJhUmdJRU9leGlOQUFOVDZ6Q3FuVWo5RFREeGlURUxlOUJvUmtUSTFKTnNBckZOQTF4dFo4SDNHdzNPYzZ3cWJnNjVHRGltUG9ONTFlTEtoa3hwS0FUNFViTzJtMFZlS2Q5YzFiRjA1anNVYlNGaWQ4MDFYaUNCSTlzTXY2UGZtWDlYWkp6WHFFY2lFM2JEczM=","repeats":1},{"count":408,"lower_bound":"RU1kenJtcEhFMHlONm9JaE1oU0ttSEJvbGpGYkk2elN6MkZmUks3d1JMTXRFQ2NYR2NTSm54cXRxQ09kZkZCUTRSckdPUWttcTJqSDRUZ1dCdXg0aXM2bUdpWHJnU3hjWE9ldzZLUmNuejFiYUNMZk94Mm9WTGU=","upper_bound":"RVhsM3BsYUZoaEZPQ3g1VTFBRnByemFEVG9wUnlrb3BEbEIwcHBwVEtEbg==","repeats":1},{"count":416,"lower_bound":"RWJEOXJCSjNVem1NZHIycWtnNzRnZlo5b3pWa1VNWlhuZDk1SXMyekZ5OGtsVVZnZW9DRzVkdDZxU1JSaUpFMDJ2c3U=","upper_bound":"RWlySHg3UG8wMVJ3WllJVjVrVGNKODJhSTRCM3pqQk9uVlFzeDBvZXY4bm9VeDZhSnJwZHZEazhOS2ZSSE9ONWU5SVFkY1g3Z2w2SWNyaFNRVzdqR0VYUFdReWN6SVlheDdTQ281NVVuTThzRHBTZ2EwMnZhMWpaZ3Z5VmV6WmJPTXhEVzF4UEo5OXZFeTB5SU9SRHlRNTU=","repeats":1},{"count":424,"lower_bound":"RWtJOTZqZmJSVnFyclg5azVJa1FWaUY4cXQwU3RDWnFQYXlRdTBWbnpKQmlwUFNpY2piSDJINXBNQVVtSGtrZHc3QmtBbk9raGJNbVFpQlpKN0dVSUMxc0tjWXNraE95N0dqNVU1Qk9JakhwUDJFd1pLR3NVUlRmb2FxbmZVMXFPNUZick1EQ0xwaHhnRXBRVkpwYU1CRVZwdG9qN1Bt","upper_bound":"RjJGa0dWR1FNTmsxRFJXcTFYb0VDcmxTZEwwWUdIcDNnRXJyTjVCRGJHWENISGROUVRNSXFJTWtqNzZjM1RaeTBGa0c0OUR0R3pHSE54bVZPWkliYVNSQg==","repeats":1},{"count":432,"lower_bound":"RjRYcko5SDRyZDZSTVZHQlBTdEpvOQ==","upper_bound":"RkJFanVEVWh6eTFUbUZJc2VqSEtVTk1TU2tpMTFEbFVJS0FoUlRwSzVwRDNTWmdlZkNiajQ0V1hOb0JtS0haQlRLOEpoWGg5WWxxUHZCV0tQU0RNVzdYc20yOXpUdmNxZGdvTVUxQXZWWnUwaGpHRk5qaU5wdk9wT1ZaYXBCdXp1Z2RrMjFFUlp0UTlDeFlDREprNXNINDhCNVZLdDdLU2V2YlNjYnNxYnFFSDBhanR0c09IWExjOWxMSzB0SEZscnlFYkI=","repeats":1},{"count":440,"lower_bound":"RkRYZFpqQ1VYazlZcjZXVFFiWFU5UGt5eThjV0EzQ0RKNm1jOFBMSDdNYm5GNTEydXdkWUlhTExndHNyeWdNNWdBSk1Bd1ZPTHVhR1dENGZtS29mTnA0QUZqbnNZOUMwbHpQTTJLT1AyMHVIaTRkckdPRkliQmNycEZLcEJRcko3ZzFDemxKUmFLSmJIN0lrQ1d4aTNKcHBRRWdHQ0RWaWlLN1BTd0pSajNGQzJ2VXlHc1dW","upper_bound":"Rk5VZ3FJYm9vQzZITGxMMTYyUDNHalJCbjRseVB4dzZENUJuRUZNV3NDZkJvT3FVaFl5SHI3aVJ2MWY5SmhCZHo0ajQxclN4eHF3SndwbWhqYW1PNmJZY2ttM3M5YVg0bzlidmhrTUd4RU1vYnVicGdrdVg=","repeats":1},{"count":448,"lower_bound":"Rk51UENqNlVEamVNZ3c4TW42bEh5bXRScnRqMlJkRW5CeXNDWWY0NkZhRTVHeFhNVzhKbWgxMXYyS3ZPN0ttQkN1aTlSWm9hZVNPaFNpWWFlSjA2aVR0MGVjRG44cFZhREpwYUFubk1xU2R5R0VJN1M3QUtJb2VKMXdVMGtobEdJOFA1UVNZeHZSUHZMUllHMGZBVE9zM214WG1vVk43VFk=","upper_bound":"RlV1SFZXUjB0MTNqR0ltMmpNUUQxMm41MDdINGpzRllZcm94YzBhRERGaWtSOWNGZndOMWZuUFV6ZHIyYzcxQnI0TEwzaGZTSkFuSVQxWlYxTW1sc2hWNFN5MW52elhVZnlQakhUZFdlc0VKUDRqUjR0dFVwNVF3M0NkR2NtRmZxQko2ek9RaEFNdVVKeDU2eldpN0FlaFJMMldvRm93VExqd0lhc0VNYzdidTl4RjQ2bUZ6V0JIR1V1Z3ZC","repeats":1},{"count":456,"lower_bound":"RmE0bnkxUG5qdXNvVGdoV09WSnZITldBeEpERXo5ODNDazVYWDFkMEY2QkF4bE1QRFJ1Zm1MMEVCVk5sV3NmR29MVUV6VmpPT3dJbFdWWVNsRWMzbEN5djBySnZISmdDcmF6Z1BsOG5tWXVIWG1zWjJFNzhzSXBFa2ZK","upper_bound":"RnZGeFZBeTJRaFJrRnJYRUxUeHllaFFPcnNwZHBDTUJIRUVKckUyYjM4c25FYU5SbVdBQld6amhCUTBmUFJ0OWY=","repeats":1},{"count":464,"lower_bound":"RnhSZWhwY1V2QnRHTVFyRXFRaHFjTG5DZktEd1dVSm5uR3BIUXV1bUUwdWFaNlRwQlppalRRalluVUMwWHBXcnBQSTExMjV3RDgzSkRneDRSMkNmbWFQ","upper_bound":"RzZIbktsaU5Sczl4SzNiV0JkMjV2c1JxdVNkUg==","repeats":1},{"count":472,"lower_bound":"R0F2ODBTaDJVb3RLNnA3Smxid1ZnU1BwTXN0Nzd6elNscE9NdjYxYkFwMm9LaGZ4YnB2YllhVXVHRjR0QWhVamJEMGptbklIMnlOdE90TW1aYVV6Skhib2FQbmJEODJ0bHVVVmdhZFZ0SGxWeHhIY2o2MUFBMVZiQ2libGdGdklVTGR5T0NtT09kWkJIQk5iQkpkRjFxMnVvRzk=","upper_bound":"R1dIWmtRT2dac1VyQzh4aVNtTUNQYjlPVjRMR1pwcWoxam1yUUtvQ0podEF4WXl2T3NIbHM1U2FJbmpTZnVpc3JPOA==","repeats":1},{"count":480,"lower_bound":"R1dLcmRHcU1OQ2FGVXdKamUwdEtoN0E2RXM5VTd2TGVGMXA1U3BGemk2YkFsRmpDQjBka0psWG1YNWQxM0RzcWo3UzExeU5UTTg3MmtsZmd0TW41eUFkOFZGOFhLRVZoR2lTdlNRbmRTcTR4cjNlcm40bHcyRVdoTUQ5OWlRbGtvRUp4NW9VaERycTkwOTVieEdKSmMzZmI4cXA3RnYxcks2R1pzRlJ6TGI3OHp0SnJDbUlhVUwxNkFkOWtCckxSWFdXTmV1bQ==","upper_bound":"R2ZXdWFqdzA3MzF6R0I3SElSNWZIa2IzbmpRcDBvYVZMNTJrN1NHR0NWQ0YxOGdNaFY1RFU3cEdVODI0UUJjYkNSSjVhZmpycm03NjNZOVpsYlVaNjhkRGlaOFllSXBZTFQ5aHhJbzUxbHJtWmV0VG1HVll6VW5sUU1NQWFHTEM5cm9ZV1pPcWR4STl3UklUMmcycVAxNjB1M21MaTJaRTRZUGdORW9QTw==","repeats":1},{"count":488,"lower_bound":"R2h4Nk9Hd0NoYTFTQmt0WnNQbDQwVG5mdGc0STBPVXZjY1JrbFIyM3FzQW5jYjZXOGYzb0cwSHNhb3EzMGpvc2lXb3NrSW90eHBFTGlEZThacXNnMUN5VENTcFNFYjczN3huZTN2OTJBSkhoMGgxMGYydnBzcEhXdXNZVWhyVmFlOVZ0am1nQjU5RQ==","upper_bound":"R214bDNEYWp1Vmp6cWdRczZmSW1CdERFYjVaeFc=","repeats":1},{"count":496,"lower_bound":"R3FRTU5PR1FDUk5kakw1aEZYWThOQzE0NHkwZXIzZVlGdDlKOGcyblFDM0tOTzNMS2lrSmNaTkZ5cTU1T3lOQUg1NklDMjVONnQ1ZmFNanhVbVZ2WWx1cmFMUG9ndGRja0FlSmp3cnhvSFl0aGZKdHlGdWZQbnJYNnJH","upper_bound":"SDBncm9URWlQeFJRb2s3bDNHSnd5WVdCb2M2TERNYUF4VlRNZTA1bUoyVlUwWnJWbU42ZXdibDVWa0JUcEpo","repeats":1},{"count":504,"lower_bound":"SDNVOFB1VjEwZENWODc0d1hSZGVDUlZIV3VmM1pzMVFMOGFEaEhUbGRLTEEwd3lrUHRieUp1YUhqYnloVnptcg==","upper_bound":"SERMT3dYclJmVG11TUFKWkhIZUpVUlY5Zm9ZUUQxNk14ZXl6UnlGclQ0Tng0ZEJabWNnUnZsb2VpM0thcUFXTmk4VEVUd3RKU2VlVFkxZHR6RG5rVmtEQmZrOU1tRXM5QTdPeHFWT0VDQW5YWHN5VTBKWWJIaw==","repeats":1},{"count":512,"lower_bound":"SEVqQ0tqSUdqZExFeTUxOGo5anVBTUk1dENBTGRCYzBIZEt2cGtBR1djd3Q2Y3BsRnRyU2RxWE91VHppc1E5NTdQOHFNTjJwV3l0U2RJOGl0THR3c01vWEhENVRPazZWT29EemJiYldBNHlEd21NYXRJNjh4b093TGZiaE50THNsU1I=","upper_bound":"SEg3NFNvQmR6MFZh","repeats":1},{"count":520,"lower_bound":"SEpTTndNNWYwOXc2cmNLS2hDbFN0dHlkVnRZdTYwUjdkZXJKRjhVckd1VzFFdEFVMkFOMVdPekk5cUVFNTVRWEl6Rld6ZzJIOXFFbzRqVko4NVNr","upper_bound":"SE9hektrUnkzczE=","repeats":1},{"count":528,"lower_bound":"SFB4SlFtSzdPT0VQa2JPazJIcXdYQksxQ3pubWJPaE5OTmdzdUQ3VkNoRXdHQWdEcDkyTkFYWVFhOU1TSzFEM1E4VGVmR2xQOXcwM1J6","upper_bound":"SFVPMUdYWTNiSmRVNm5aQjJMSjVUa3RrTkRYeWtlOGw0MmNQNDlOcXJXd2VHOGtraTc4b1pRTDZDQzh3ODA3aFhwaE8ybA==","repeats":1},{"count":536,"lower_bound":"SFhhdFh5UVJvVzFmblhtSnpvMUVTb0lRUHhrSlpYMXZBZDNpQjhuNVpsdEpuTWNGanFOczdEd3RxdUN2enBOUEpSOUhmOUNRRHF5UEFZUVVaUFBlSzdzWTFzQ1JQN1I2V0lsY2dma0xSTWt3bE9IamoydjEyU0RpWlM5c2dmM2xYUmxjbFdxOUV6T3JENlZvT1k3S1F3ak9tMXJqb2huRXFMdlVBU2JJYg==","upper_bound":"SGpZeDh3UE9IMUFmOE1CYWw3RE1xZkpPUVdOb0ozQlEzRnNyZlQycmJJNG11cFdUWEppMVY5ZmptTGZFTlFCTXl3bmdjOGVkVDlIaE1mVEVhaEFVZlpFeUsxaTljcEhGaGJidWhsa0ZuaFpmdDJLcTg1UlBWRm50cDA0WUt5VkV4MnQwZnFPM0Y=","repeats":1},{"count":544,"lower_bound":"SGpjUEhHTGFRbm9iTGtHYXc5eWF6bnNXVElpUGNYc0pXV2tCczZEYkc0aW5QYUs=","upper_bound":"SGxxM0dva3BSSFdWa0FQRUJodjNqVXk0WlpoTzlsVHRpdzA4d3VhbzhiNjNCaGtlWXl3Tmo1a2haZjZxdw==","repeats":1},{"count":552,"lower_bound":"SHIwS1doalBpOTRkS0xxM1RtbVY0cGl1TnpYaUNpS2NrcXJoVEpoT01YejlEdWhEMWFHMnM1cnc4ZHJ3WXR0Yzh2V2FtdnJ2QXNTalEzTWNhUUNFZ01TN2N5dGFvNER4NTVXWWJDTUZJTHR1NnFC","upper_bound":"SHl4ajlxYUZCMw==","repeats":1},{"count":560,"lower_bound":"STBYOVVYcmVqZTh3TzVsMlRKblhyOTg1Q1dwcWhOQlphSFhLNlpmMXk1T0RTV3JCc3V4ZU9iVDlBcndpOW8yVXdMN3E2OEJpVGd6UVROeTMwMzdqSTljUXZ3SlJXWGI2OA==","upper_bound":"STNzQjM=","repeats":1},{"count":568,"lower_bound":"STVOWXJha3VQMnhzdUJBR012ZnhBYmp2T29YTkFHYUtJNVhRSzI0ZWo1T0RWb29rSlh3aTI2V0ZaeDh1WVJLSUpRQXk1TXd4Q0syanZmYlEzdFQzeEVwb3ZxMzA2SFpFdEcxcGxOYzB0alRwN05xZ1NhZU1MaldORTRMb2dGdHo0RGhocjNTbHE5SEZob0VUZGplTndZSTE=","upper_bound":"SUVHT0VrUGhTZ0YySnJha2hIaHNnR0tKOXNSMGQwb3UyMXM1QkxmYmFoQjJITWVQR1REVWp6b050cDBCSkFQbXA1QVZZYjltZ1dKbjJjMXBnenVQUlVaUGJw","repeats":1},{"count":576,"lower_bound":"SUVRYjFMWEdyNElFSEVrMEs0NnpOMEZUY2RUc2ExcUVjbXBsWnd3VlR3NzRNNEZzVU1JbUlUMTJnOXk0Z2VSaVRBajduSTFVdjBwS2NBRGNLQWFFN1pyc1dZbzdMN3hBWTlIelFiOUdJQ3l0QTI0SjRlV2FnZlV5eXE1NkV1TUhvRlFWMGMzcEx0eE04NGx5eTV0bGg2ZElIc3QyWUk3dWZsaFRqVmZ0RFRaMA==","upper_bound":"SVdJaU95ZHplcXVTSzNQbzdqcG1EeGZhRXpJZklSdDJKbE9jbURWMms1bk9oVnNhYTlUWFZudnVjeEZvU3lMZmZQaW9rQXYzaDU0OVJlTldVaGRJSmk2SjlVdWZ2OXNtUllwdXpZeU5tTFVmbmY5cWNyTHh4UW5TU0tQOEtrekpUbjVXWnNOdnpUOURyeUR0VmlmR0t0N0xRV0RMRnJXTGNYU0dYVjZnRG9nc3A0UmE1OVNC","repeats":1},{"count":584,"lower_bound":"SVozTnVMVjhWUWFrRzVKRWIwZ0RYeWhpMUgxcUI2QjFQV0RnRUExQXdsRGJsYmR3M2VIMmJVbmlNNFpNdUFCRWcyMVlveDA=","upper_bound":"SW0zbDJmU1ZlU1lhTTBYN3BzZ1hmMHVPZzJiWll2eW55VGUzM2RENGpPQ21SejBHdld3ZFVLYzh2b3NKY3hvMEYwTFBQeWFKMDFxQWkzcEZpUWw=","repeats":1},{"count":592,"lower_bound":"SXE2RlJHekxOUmJ0MzdwdFNJQXE4eGd2R3NJQWo3bGEyQWNGejRhbXc2MlVIZnFROFZRMFkwdFVqZTJJTmhjangyMjBGV3ZGSTBTVUF6OXlKTlpJc3BFV3ByRXNTQTJCbTFqVGJPM3BXVkltdGhHdzZmRjdzbDBNVmd0Z2c3anJoaTYwZFZrbTltYVBnMllBSU5kdVIxc2tkQTRpaUF5OVlFdFk2U2syRnYzVXJTM3Y0bEZLME50RzQ4MFlxMUk5","upper_bound":"SXVyUzZhRlVoTDhwcnRrOXJyZTJWM25SaVNpNklsajBJYVNRajFKcjVsWUZYcDgxeDRjT3NPeHowZmxPUkFSaWdLWVBZZk4=","repeats":1},{"count":600,"lower_bound":"SXdSOFFqMmF0eEo0dVFmRGhZRFdJend2aFFOSDNpVU41MTU0cVZrNnRsdjZ3OUtGVUU4OFZSQTU3TTNab0VBeUJkQ1RMWm01Wm9sQjAxZ21NVWxZd0VLOXZUOXFuaWRkRzZhSE9yVzZ5OHg=","upper_bound":"SjNVRW1OYURwUzdnYzA3SzdIOTBiNjZaVHp6VFRpUTVyYlJ3c0RoZlVORXpHU2pFR3djcVJvOXk5dnRXZmtyQnlKWnNySkxKWEtob0g4cEZKQ3RNYXg4Q21sVmU=","repeats":1},{"count":608,"lower_bound":"SjNXRkRwejhRcTZtT1BtNmtxbVE2MDJQQWpTUmZsaTJHc0ZFMmZuM3h4WHdSTzFGeWJJdTR6ZDFxMTZMbUdQbXJkU2ZLcWJ3UUhMV1ZNMDFtNnVLejdpQ1hIZVJUTXJPOFFhQkx4aW9NMk0wS0NtbWxJT0s4MjVERXVCMnZmNDFEM2FMdDB4QW9oSUxqZlg2bHpUM2NqOE1mQWRaZHBnRUF3b2dyRGhrYkRRQzV6cjdsaA==","upper_bound":"SjhNVFdxc2IxelBDODIzcVFNMmZPSFV0MklucVYzMXNBbkhWRDdocFdtWmgyVXNBY29XbktVWDVhUThUVzlXQVhkYTV4MkM5SjJRT0QyNDlYRzVKUWhUcnd1ZG10VTYwUHJnMlpnMUlSOFZWTGZEbHNIcFRtM2lDVXR0UTk2Y2xYM2xKcWRxaWhCUkpiZTFLbkVJV0g0VGxISVFybmFBNkszbHFtWjA2bFlOOUszZEQ3QjlXWkdi","repeats":1},{"count":616,"lower_bound":"SkMzbm5MRXZUWGJscHF4M0tna3J4Y0Izbk5sZEJWYmloRTBBdWFhcUZyZHBrb1JMWjdjYmd6aTF6ZkxWeUF6dTZXVzRpa0g3YXpsU1pjM2dZcjZ3U3A4eGpkNFFQQXNzWWVVVG1WcDY4","upper_bound":"Sk9ZNUViNzc1bzZrSFZMT1l5dDlLdWlxazNVQ2llbGRwb0E2WEhpM09LY25LRHJkU044UE5UNEUzUjJKSkQzNlVOUjVOempndUt5RzJpUHd1cTZyMnhCaUZrd2JRRjljdkw4WHpncm9OUnVkbnZreHY3WXdlaGliT1VMOTJDR0JWanZxcGNhT1NxUGI4Y3pINjN0T2FSNTc1","repeats":1},{"count":624,"lower_bound":"SlF2bEh6c29vR253WkJObE4yTVF2b0ZmZUlHcmJxTjBvbTdTSWxtQllOOHJ1cFBZSmRwUW9jWldpZnZaQUp2bEpmQ21NOURXUUNpeTMxNmFEcFJkbmJibTdZOHZHQVNKUkF1R1VQM2JVZlFDZ2cwYjhpNzNMNGNCRFFFdVhtMUM3UXBONTVIa0k0elI1Zkp5cElmc2UzZWZtVXcwcWx5Vw==","upper_bound":"SllUZnpaN2o4M2VGa3JadFJZbEY5elFBUW13M2M4YUdqN3h6OUloVGNWdERqWXJkNWdxOXl1S0dmbWVGTWF4dU5qbEFJQQ==","repeats":1},{"count":632,"lower_bound":"SmI4cXFDM25ZZW1TSGE3YmE3UktZZFNGN1lPU01MbnFaY3JSYnlLWGtqNVlHa082eUJ5UGV1ZEJJWlJ0bnlmaWlwS3FwNkJiTHZubWpyTk1SMnA4WjFsWnQzV3BHb2R6NlRJUUhSZVpHZHhJZklLZW05OWdjaTYwbW12VUx5UldDd0FNY3VEVzFXWUxGME1Sam1VbzVzSFpnYTBZYW13eTZTYkMzamxhcERmU3ZSNWNreA==","upper_bound":"Sm0zR3hqMUN5VEFhRk1jUlhxVENyYW14Ykc5RmRQRUJRQkY2UHlCMFV3QnR2OWZaRVJGaW8zRG9OZlEyTXVkeXphdFJTdjQxdDR3eW5UNzZqOWlyMGdUZmcyb1I4S3FQZmh1T0U=","repeats":1},{"count":640,"lower_bound":"SnFUYlpPRXNtRjBNUlI2ZEliMEFibGtrUGtCVDF3ZDhQSGhGc1ZTVDFxZ2FTaTZsaWlZUmtBWHRMRWh1UGZKbmJVZ3U=","upper_bound":"SnhkUEtvYkE4b2hXbWVJQ3M4UVh4ajlUdjNPejI1NGo1WERNcDc=","repeats":1},{"count":648,"lower_bound":"SzJXZjY0UHZoMk5uOUJCaU5kaTFYakZxS0NuOFpkRTNMaUxXV25FbTdiYlFaSWpiZTVuWWtHVU1CWWxjY250WkF4M2NoejFsTU81bFRBQkFUeFVSQXJlVm9oNXFONkV6SGlyeUpuY1JoVVVxZGdNQzBCek04NXh3TTNBRGVDemNtS0FqSzZIdWZlcVgxVGhFMGRyZDlp","upper_bound":"S0dWMGI0WGNZM0RhZUJPWDQ1YVo3SWgzZEE2THkyYTRhd1FBMUl5dmpqVzJpSXRaazRJa3hYM25yRElWalhSb01BRXJNQkNROWNveXVuYk5EQlIzZUVEVDVzWVlCT0RiRHNvZ3I4Tml2STZlMURESVRuRlpmQ2hu","repeats":1},{"count":656,"lower_bound":"S0dlVHBmV2xLUXFXUTh1ZUduUmRPdW5SZkY1QTBFWUl5SDBLS0xMUGxEVTBQQkZGNjA2VU1LYnpmZ2xnVHgyc0hjdldjbDZzUHk5OXRBMm9aSXJTQ056bGhzWUlwWFBMcWF1VDhkTVE2bjVDODU4UHA3cVJtMjgyTk8xZThKRzRMZFN0dFlFbHczSkozM0VCRDVqZmNGemlpRWU2cllGYjBoRVBjUXdXRA==","upper_bound":"S05haHZ5aEk4c2drdFJkQjJJY2tkaE5xZlY3OU5DZkxwUHhLemVkSTk4M0hDbW5mTU5Pd01Sbg==","repeats":1},{"count":664,"lower_bound":"S1RMNU96OHFrVVN4ODNwcXBYWFNxZWs5YTFBR01JSFNjYms4UEgwTTE=","upper_bound":"S2tMV1BKUlRQQ0RzcDgzMThHQTVIa0NvV1Q3a0hwMFpkVkFzTHcxU1hiOWxWM2FSaFJEQ0RNYUh5QTNGMjZzM2hmdGhqMlo4ZVpvVjZES1ZhbmxZSQ==","repeats":1},{"count":672,"lower_bound":"S2trcklnaDZPMXloQzNjT25UdmoxZ0NZY05sY0dUaHZVckxkOUlNSExoeW55MzFpU0tkZWh4SFJaT1NRYmk3d0o5ZTZxVVllbXVRczVIQktQRlg2TlRmNnFQRHltVzdINEFEcEp5aDA=","upper_bound":"S3FwNFVnd3JvUTNscmloUXB6Q0dqRzdITGhQWENMRXpZaTdlUndUMUFhelpRMFI1Tk05TDJiTFNVMlZLRFdWMnpQSThDUTQ2ZFZiQWdpbmlhemprZVM5aHRURUlhODFa","repeats":1},{"count":680,"lower_bound":"S3NBdG9Zc1FRaGd2MA==","upper_bound":"TDZiYU1pSnVNNWpnV1hWUFBnMVhZR3hrVEFSWlpLTkhzTEZjZGFWdw==","repeats":1},{"count":688,"lower_bound":"TDcwRmljbVB3TnZPcWlrRnc2cUJnZG1wYkc2QUJiZjVydVRMaDY1SmViczk5WDhtMDI0T0gwMnhJdjVBSWxaVExuaTA1RTczajlZMmRRcDYxNTA1bTVEcEd2SFN2S3pvb3kwNDExdFRWUjJialNaWExnbmhKY29BSlRHTjdlTG5TZDNCdW1OSEhnR2pmZGxBQ0dRVUZsTVJ1TmlnWGlaeXJwSGNMaWtIMjlTZE0=","upper_bound":"TFFxeVFaaGI5aVFZeG05UUthek91ZUs4M0pwYkp2OFVGSGdkTWlaNDl2TlMxZEM0aURPUFllRGhUN0hJaEN5dUZuS3ozYjVZRVFncmFpZHlaUmJrSW43Y2hiMXlJbkZuSDVCOUNtbUNvaGtYd1RsVzlWUDNCZDRrTkFCUDlmOEtXQVZscDFPVWVCSFB4UGVKTFZiVGNxS2V5VGNwbnMz","repeats":1},{"count":696,"lower_bound":"TFF5YzBs","upper_bound":"TFZjQVd4ck1saXZEaTlOeXV3OVNFYTJ1YnFleUhEV1pWSVp4U25BbmRyZWdydDRhS2dzaExtc3ZqMlN5YWMxdTVud3NZRENtdVJwWXZZUjhOcFV0dGVJSTFPQnpaV1ZOdklQb0RnWUdndHNFaEtjMEZ3bW9BdW9L","repeats":1},{"count":704,"lower_bound":"TFh5STVOcGRwZURqRnp4NU1NaENwMHMyVFhIZ2o1Y0RsREJoWjBmTjhYMUo=","upper_bound":"TGdnejZncnVxYUlKdXJvVXliT3dzSk9hRWZMNjFTN0ptenVaSGVhOUdUdmE5elZvVm1mQjZSTEk5cHdiZ1J2cEg4QTdjdWx5Z1loNjVJdzdkd0IybXdhVmVzb1RBVGV1OXZkdDFBYVU2WA==","repeats":1},{"count":712,"lower_bound":"TGpISUpNd0dwVUFaZ1p0a2RucTZYMjFLYUNveE84M3NNVFU4WjEweTRNemZP","upper_bound":"THpaNnJDUUcwUzljOGlsWWlSMXJUa0JMTXBvN0Q2UTVJeFAyajhDWjE5UG1qSDkycU1wb1JiVlFzODNLTkV2V2hNZ0xJVllqMUF1OExrM2FWbEdRZk12dkdPSG1IOFJVVzYwUUh2aGJYU1VWN0diWmNHRlJ5YzdDWURodzl3NXAybzQ5eDBGOHF0TUFONEpxeGhlQ2s=","repeats":1},{"count":720,"lower_bound":"TTM5VUNFazBJQmhmZDRTSnc1bUhoeURacndERTk0eG82cWkzeG4=","upper_bound":"TVRyMldUZUNBZVhGeG9tV0tXeDFsdkVYNEs5T0xDaU03UndUblppekh6b2FEZ1k3c2VDbmtmMzdGWGFlenBSUWVITlJTZU1LVEJvYXE3cjRDUFpnVlA3UzhFMFFYTFZNWHNodGlDSlFleWlKZDFIRm9BaQ==","repeats":1},{"count":728,"lower_bound":"TVZPWk1iYTQwT1VKYnJVeFgweHNGSFEwQWFqeXBkdFhPNDFSbU9PUkhvUFF0YUhyUWNqaFFDWENmOXdFME5CRDF4c3VtcUJPVDZGVGRZR1VsSG9qRVllV1FZVno4VmFuUEs=","upper_bound":"TXJ3dHdDVjU4MERZVk00NXY0c1FCeThKdWZvV2h2a25Hc2hNdUw5YmcxU2cw","repeats":1},{"count":736,"lower_bound":"TXlaQk5MWmlRZ1hycHZYNlRIZ2xjUFF2TUZ1T3VEYVh2ZVl4Tm9wS0dxSDlEdVc4dTJqelZoMmJBYlRWb09oaWVmdEZHMnpmajFSUndUQ2ZUZ2tYRHhpWlBwNkZZQ3lKc0lHbXNrREY0Y2lQa2szTmtzUmwzRFM0WVk3SU44Vzg3ZGdsMkNMVmpJY0VMSmpzUUUwTzlGTEFKbg==","upper_bound":"TkNJUVVDSWwwYURlVU1ISUpx","repeats":1},{"count":744,"lower_bound":"TkNwbjVuaU1TTnBxUThFZThuU1FVSmt3bVg4bWVJcVJvQmo5TDFUdXV2QWVIbzZ0TmtzdDd2c2lMaXVGcWtwcUcxNEw0dlc5ell0TTIxT01ZNjZ6V1RIOW95ZzZYWHlId2JocDVHVTlNNjhDRlNUNkJ3NQ==","upper_bound":"TkZ1MHNpVkhzTEVoZXlaaU40VkFMUFlIM3EyeVI4cGxOTkM3WWZPalcxalRSNnhLZU1DNmFDZmVjS1ZzZFg4cFVEY3dXTVAwSkhlZ3ljRmJKcXlGYmx3NThHbHZUdHZHWXNLaDY3WFF0MVpv","repeats":1},{"count":752,"lower_bound":"TklWMEh3U1lrUHl5VUx4Nm9UQTZUOVc2ajFIRlJqVEEzMUZuUHAyQmN3TFRaTEtwZzM0dXdoWG5mY29VSFZOV1MzbXMweHVjUHlG","upper_bound":"Tkx0Y2tJc0NoZ05rV2pKNmRXT3RtbnBNVmRwNGNLcEl0RjFmQ3JCWTJzSkREQ0JyaUYxbzZlOGs2bnNRa0lsc1NtQUNCa01GSmNwdEZ2RE9RZmJVcXZVY0d1YUFHdEFna2FLWEM1RmtPemc2R0NvbkpQREVPR3JtNm1yZ2NkemxwcFlqSnU4cHVUejRwS0lJdkxmaERIb3VQSzV4aVp5MEJMVlg3ZW5Eb3ozb09Wdk5XZWI=","repeats":1},{"count":760,"lower_bound":"Tk1kbEZLNnIxbUJWajFyeGw2cFU3MEpwbHVGVEdPelhoYnV1MlNBTlZnRFNaNkU4azd0V1duckE2MkVjc28zaUlOaVVsaWNvd3BzOHpzRVEwemp2eXpUR3dFb2lna0dZSlo4MGV2N3I2elhyV1lLajNBaEZkbjBkUnpmUG1hYWxiWElKUWdGRzkwQ09Ga0ZR","upper_bound":"TlZMMzBTNG9hM3BXbUdLR0F6QXdpZ3NpcXBVWnhmdUd3U3JKRmx4MGVodDdseVdiTnlCTm94OGRrdzBFVmxsN2MzejVqVTU0UVNuYzY5RTRneEtIb0VQS3poWUhYUU9yREpDQ0NTZEtQYVNsRnpqS2pYSmxUZHBtS3hEWGtrWjhYUmM5elVuODVlTVRZVVBtR2tIekVuUmNHN0t5ZjdYaHdkNmIxY0loYXpGbWx3TTE2RA==","repeats":1},{"count":768,"lower_bound":"Tll0Q1JhOGhQc3cxZ2k4V2tabXAybTRjVVFkMWJvYjJVZ2k3dmxXTGhKbDVmVjB1M2JiZTBPOExQZjl3bTFNTzZsWW1uWXhzU1ZIdjhhR0pVVG9RMjNUVVJVbEZ3bXJ2bnA4dzRGQWhsemtYd1RwS21HNVdsdEtXR25idTVQSDlOeFlzc2ZlVm91bDl3aFF4aHpUdWRITWp2dzk0TVJpYg==","upper_bound":"TmlXY21zY242ckM3VHJJM2JUcDRFcFFXcDZRelBxUFN3cHpVRTlCRWxzM01kQ0Nrc1dHa3pmY3ZIMmdNWTF3T1NpY0FQM3FKWEtXRzFweGlXdDc3eVdoQjJxeUhVMDQ0ejM1NE4zTkdLS1VrVGpZQThUeHVVWVMzSjJjcGdBSmNLSExYT2Ewc0t1RGlIbWZ2T0NCMlpTQ2Y3NlFQc2FrTlVzRjVDdWpiSDNicTA0QVg=","repeats":1},{"count":776,"lower_bound":"TmlwNmVES2YyUnZBYlNlYjZzWGRqTk9BdnMxMHozWWNYTHd4dndocGpuZjVkM1JHcG83cFB3eXpaWVhsbHphV3FpUzY2ckpaTHZSc3l6VW1vcG90Rno2N24zZHYzd3UwcHA1cmpuRWxOSmRuVUhCbk5TQkgzMk16S1YyMENJQU41dGl0Z1BoMVp3QjRlOURVeEV1cEZrd2tEQkE=","upper_bound":"TnNJNWRSb1lXOUxFWHE=","repeats":1},{"count":784,"lower_bound":"TnRBVmpUcFVVMjJneVFRSERoN205YTFlS3N6WFpVN1I0QkxuQmJrbGM3Z1QyVkw4TTBqNHdMb3Z1WjZzUFBtUFQxckM5eUNwa0t1MEFVMTdVVHZJNFNnMG02VU1yMGdYNExxalE5YXE1cjRQRVFzQXptNERHOFlFeTV1ODBZb29rSUYzVURjcVVkTHc2UlRJYWxncHRMdU1ZWndHcEtxUjdOTlRh","upper_bound":"TnlNaEhKTTFhVnNLY2dyZmZ2ek5QVVp4N0RVMldGc2Q=","repeats":1},{"count":792,"lower_bound":"TzNoMVBtdVNyOU9wclEwT1lDdVE5ZGo1VWlOdmtOQ280bkhlcW5EVm1BdU94","upper_bound":"TzlGQ2RxTnFzZ05rb3JMZVdYbWJmSzI2dlFrTHVrMU1OSUFRbVAwUGhZa3o2RW11UjlnWmlBemd4UVNGWm1VM2FpMUhJVjhzQVJVeGJDRW1LTEcwQVc2amFIU3AxMzhNeVVmVzVleGxTdDJ0R2ZIanRTTFJ2Qzd5YUI=","repeats":1},{"count":800,"lower_bound":"T0FFdQ==","upper_bound":"T0c4M3diZVJvYmZuVkNZdEpSNE5FQWVFVExiMU5EUkYxVnpnbzl2VmdvQXBaT0hGenhOSENDaGc1dllNR2xVaVFpa3ZYOG9aekNXN0toNnhzcEs3Z3IzNmdLT0M0SDFPZlU1bThTTWVadjM=","repeats":1},{"count":808,"lower_bound":"T0pNRUFXRmpEQXg0UWxxRVA2a1BYc1M5U1pjUWdJeU1URlBVWWpyVHExcTNlREpWV2ZhUmtEbXp5a3JubmpWdXAzdEI3NHVqaVdBZVVHOUU5M1pweXpZZnJDaFVDWnB2ZWdNdW1tN1hCU3BWcFhKZVhVSkxhMlV6OW5SQVNnZW5LN0ZJb3pYMWNwVElFMllGTkRHOTBFM0Q=","upper_bound":"T1JMd3hjQ2tRa2RaZ3lDOE9LWnEzakdVNTVHNGFJQnM1dGZuQjlOWW9vOXBwZlJiMnEyaE41dm55TE1aSXdlSUp2aDZoRHBOZlBKNmg0c0Z0MzNJZFdDTjFidWhmcUZEejY0SE5qOTAwVkVjdmZYVlZpeHg5ZDRGVGlwYXV5aWFsWkpRN0JmVWdlcU9uaXBrZ3lD","repeats":1},{"count":816,"lower_bound":"T1hjSGtpTGdQNlVHTDdLVjJXaElKMFFab1JwVXc1UGF2MGdhQUhCT1pFd2dZdWpEeDByU3E3YjdzNzN2RHFydUFydzRTTldUQVlobFRKdWRnMG52TVd6aHc4b2V5Vlc3MDdlT3lhR2pQbGx6bTd4SUZBRFlNOWJkbGRNWGFI","upper_bound":"T293RFZadURUZ2l3M1lFMG9pZEROM3ZtSGRjbEtnYk1LNjgxM0ZkcmZMZEozWHJDU05oV1FYWXczTmNqS2NlbWhDbjFqcFlzSkxDMDA2eHhsWjNTejBxNWhIb2NSQ2JHeHBTR0VZY0JxREluTERGYjlqNmNBbW5haVZ2NFZPQUpETWJZbnRnQ1B4RlVVc0F0bTVaakY4VURncE1vV285NldoY05JME1LSmdVd0FQM3BzQ0lGZm5MMTJRc05KdllSZkRFWDVP","repeats":1},{"count":824,"lower_bound":"T3lQaG9BWTc1ZU10dGVTZTd1RUppanB2Mkw1eFNidjNIVnBYbWxuZHdac210M3BWbUtaZ2QzclBTOU9hR2NHNWZrU0lPU3hzdw==","upper_bound":"UEVleG9NcFAxRnRJR25hRUE3Um9lUDB1eVczN2VJNmJtQURoaWdJT3Q4OTZxaTUyT1dRZm1heW9Ta2VOZGNzQ0E2cmhPczJqc0ozQmpHeDF2Ulhma0VuUm4wb1REbkxTUjlSYVhWZ0gyeFFrcnM3NHJ5VDZEaHNjTmI2dWo0b2hMVzJqWGxCR2ZVN0V4d2lDenNmd2s0Tnc1VjJaVm1LeWZhNlNOQkFhNDJtdjd1eHZDSWZPVmFRT2taR0NWcFVKNGd4WA==","repeats":1},{"count":832,"lower_bound":"UElKUjVmMWVKODFUR1ZKOTRockdUaHFkUzhCSkhKU2Y0RDhQM2p0SXNwOHF6Vm41NWNHdWlMejNOSmpXaThtT2l0dzc3eDNhaUkzRlN3Nk95NDByb0xCaGdFcQ==","upper_bound":"UEtJZzE4","repeats":1},{"count":840,"lower_bound":"UExGa0pGRWl6RThqd1YwSTdzWGVxVUxsQmdrVjdJSkYzNERWcFdpaXN0Z0l3ejRSdmhmd1MzVE9tZFk=","upper_bound":"UGZNODF2SHJxU3NibUxvbUcxMXhrOHFXRDFST2l2VmRuRno=","repeats":1},{"count":848,"lower_bound":"UGZab2VHUEVBMEd6aWY5WVJRUDBpTlg0Smt6ak5MejlIbERhWTBWRVZHQjRJVU1yc21pS21aVko=","upper_bound":"UHBUcE9Fa3FyRnNlQ2RDV1JhVEZIMGhUaGxrOFE4eVFFTHZ6Z2RHQnVvQUdnYXlFT0ZZYWhVREE5djJzcHRBYVZwcW5wdE16ZXRVd1JHV2tmOGlVSzJKSkhWRnlrMDBod0EyWDZUYjdDeU0waWU=","repeats":1},{"count":856,"lower_bound":"UHZ0N0I5WUF4RXJYZHo3dUNqckFLTHZ3TFZTb2k=","upper_bound":"UTkyaXFIVjlGcHZRWmhBOE5qVjl2c05RaVZPVEVIUVlwSkYyREFiRmJWRDhmb1Y4dU9oczhrZ2RGaDRHdmFncjFQdlhZZTQ0YjB2Wkt5aVAyR3RzcXFEWVNIOEtYRXdtNVpjUUMzc0wwTzNPaW5LdnhJTnB6cjZGVQ==","repeats":1},{"count":864,"lower_bound":"UUR0YjdHQk9sc1R1VmNLaFhEWTQ4UGNIbVJ1M2R5dUlmRTdVVEJVeXRydlVSR1VPbnVZZUk2YzlVdlJEUFFBWTlYWWtLeGNsVTA3cDRoV2lmeWVITlBIdFdHRGdTQjdaTlJ5TGdtQWFYdGlHeU9nWnVnU3RSZTA4QmgwT2F1bWlEdDI5YmNVT0tWV2NSUDBNQWo1V2RmNjB6TzhHbUcyTXVDU05MMFI=","upper_bound":"UVE2N3lHNmFLT2h0TXlXdDJvSGwwY0tvYzE5Ym9WblVoVktiSGFCWWFLVnB1MFEzU3Z4T3JkYUJpNzh4RnFpSHUyTFdObk9LZ3Vaa1g5amlMdDhZVzB0ZURZMXVUSE9XWmsxY2d2YzZNMzVUU1hRbjBI","repeats":1},{"count":872,"lower_bound":"UVFuZG1QOXpBYkxpVUJVUGZCVFA0Z2V3cVF3azA0S28=","upper_bound":"UVZGWnNQd0c1V2NCUDhpbWxxMVBLa1NBYTVINEhsS2xZQWtFQTFsbzd4RkpQbUh2YWNjVUVjaHhCQzJnVzFiZ2NrTGZzeXJkS2NMdENKTzlTNWF1TmNKUk5EZHVNWEZpVmpJTWtlaDltaW9zR2hRRW5yMWNEaXNKSkpTZDh1bjZWY1NGeWhRdzE1Vkd0eko3RHF5MEtnSHZSQ2J2OWVmMFpQV09LQm1BYWZxYWlQWmRRaVVC","repeats":1},{"count":880,"lower_bound":"UVpxclJMRGtMV29mQk9oNmU3ZnhkUEt1QzRYZERyOG9XVDRRWnNkRkFxbGR5SHdUdVo4VzFVQUQ0TXpjbkJBOGxYYWVVbTVkdzNWU3hqak1hVGt6ZTNaTlU2ZnZZY2ZHT09LdlkzNkFRakNKZWZtclR0YXZHczhNTHdSMzJTN05LNFB3Qw==","upper_bound":"UWhsZGlvUGdXOFhoSVRlMUFhNzJCSnMwMDRoQ204R1BLUXdoYjFoZlE4NGpTYmJUZnlZRk04T2ZkZm5Wbzhlb3EwVnMwTEtDbVlQZGRlWWZBVlBQT1FhelA=","repeats":1},{"count":888,"lower_bound":"UWl2MWN4WmxCaURSSzRQbm5SR1dmRVFmcWpGc1JvTlJtZThqSjc2bmhiSThaZXR2MTZBMmd4WTVWQkN6Rnh0cVdUdGJaQXRwUjFQ","upper_bound":"UXpCM00xUUV5RDNid0RrTjlEVTM4TFhYOUJGeGY2R0pnakxkcDRpZ1RFdEkyZUhKaUhHRWMwRVpYdFVlbDF6dEc2ZGJRQ3pubzJiZ0RIRGo3OWhERGxLU3NmRWlOTTRDQWs2MjB6M0k5eUM3d1NXclpYakhKNU10bA==","repeats":1},{"count":896,"lower_bound":"UjN1RE5YNU9iamltUnN5clZXMmVXdWpYN2ZmMlIzaHMzRHQzczg3UUtndHNzVXYzREIxNkdPY0pJUnM5TkJySFRDSzl2aUsyS3kybEh6bmVYejFGbFA=","upper_bound":"UkJ0dmJ4cFJvTjFHQ0NTQmlNMTVYM2VFUlBMSnl5dzAzUnpNcjN6OVlNdWJwOXYza1B2eVYyeTZvRkZDMm1BODgzckhUMXRKM1laeFp1cFpGd0I=","repeats":1},{"count":904,"lower_bound":"UkdPZ25nZmlwbWlvaDRPYVpTckRhZzl2R2doZ0JybjdaSERGVUdhRkE1SUZ3NmR2ZEUxZmplakNEdWh5emRKVENOSXFWVmd2a1hJbGZnNDJISDdGemlRUXpodzJCRGVTTXl3YnpVYzE4U2xRU3R6UXVtTm9wYXdHZVk5a2Q=","upper_bound":"UksyWE5hTmR1cUx6WVhlT3NzU3Q2QjdJWWl6R3ZIS2t2TkVPQnhQdGtWbXU0UnVOVnVVSnBFU214SG1SN0Z0MFg1TU1IZzhTcEhDUjBmVkwwWE13ZGcwVTJaY29VcEpaQ0wyaU9CWXNkMXdQQkRsell3NG9DUkVtdnl6bVZxU0VpVHNXQjFmUlNOOG9iMA==","repeats":1},{"count":912,"lower_bound":"UkxwVjZUTjRvTVhmbWRLTEF6dzlsY2Nud1FTZjA1bWZZc1JZOEtWcTN0ODBZMEtPcm5NcWJXaFdPZHVEQnlJbnE1VFBKMkxiZnZxOXM5SE1kRFIySEZYMUZURlhHb01pa1NWV3QwU0pSV2lTWDdiRmpIY0xxOHdWYkpIMTkydDlmUEZjMEVzVVk0dDdTaEFCb0l5ZWJ4SmVVc3ZDc0ZxdnNtcGdieVhjUkM=","upper_bound":"UmNLVUdxdWhvUDhpT3MwZkdCSHAzZ3pEMDlvbWkzaXJ4VFFjQkVNN1lyVmtONW1NQ3RjMm8yVG9RalZkNGMx","repeats":1},{"count":920,"lower_bound":"UmdFU25saW9peWF6U3FwOXZsMDlxa2ZIMDF3cUZWMlBq","upper_bound":"Um5xSENSbm13WFhXVGxscGVoS3JWYzlaQWJCb0Vpa1h2WGpLNEg=","repeats":1},{"count":928,"lower_bound":"Um8zb05VU0FTZDBmUGJLSEk3NXhqNVlJdnFjMFdDZTdYNWdWcVoyN3pPOUVXN2xwSXU5elZJYTNnVUg1N2JtVHFYd2ducXBqMUd4akloenY2TDk2d2drTFZnTTBpbjBjbk56QkJTQWhhMVNHdFFyVzZ6WGZrRUpjSEFRdXZRcWNZRGVLNjdNRTdPYWJ2SnBETUM1cUpIQndOeXZtdA==","upper_bound":"UnZUV2d2blJJTnBKb2ZHOXd5MlB1ZGlkeXA3S0RzT1pHdGtlaGZiN0Q3MW52TFlUT3VpOTdLcE9UUEtvTDZKTmtLVWhERHJaV1JTcm5BdDlZZlFxd0Y5Y0VOOTU4U0Y0S2x6MDV0bHVRUk5KWVdkSE5mSjhUMXBmb3VrQWlYcmZUUnBXOUVOT29Yb2t4UW5xS2xKMm1BMDBDeUxRajQ4cFFuUTl0N1JXc0k1cXhE","repeats":1},{"count":936,"lower_bound":"UnZ4dnN0QlY0VFFucXM1U0VYS1hicHB1ZTVod204d29RWHEyVjRpaEUxeTA=","upper_bound":"UzV0MEZaZm5CR3Z1RUFJNGJ4Z1dBRUdIdDhnTk13Z204R2QyZjA3SXhkVFJRb0ZJYU5lVzZaNjZrTWRWb0o5MW80QXFaeENYVWkweUUzUVpGVVlvNEZRZUs=","repeats":1},{"count":944,"lower_bound":"U0VoRnF6eGQ1Vk1EWWlGbFJiS1NQUFJKTE5BbVRBZWJ3ZE5CZ3NRb1lmYVJEWjRrZ0NXZmRyMG91MmJHaVdxbUU3UUFiYTE5U3NBUnN4UWdtNEljeHNVOER5bFhadmlDdms4OXpwU2dqeG85ZkdOZ1YxdVhxWjBuYmRyZW5idU15UnhrOXZHNVlrZENY","upper_bound":"U1d0b3NIQUFJRDRsVGl6OW9aSHVFWXVtUm1hTmc3Sm11ZnhraVlrSXV5WUp2Q1pYcUlKNGtLMVl4U1U1UXJUYzRGemVtdXJTVERqMDN4dVBvbm1EbmdtS0pVdHhYaEQ0MnVMOXpvWG05WTFvdTRQSzdneDRUclZOa0hvN0N1NGZsTGRhckpKM3ZWTzFHclpkSEdDbzZveDlneFJ5YTV0MDdW","repeats":1},{"count":952,"lower_bound":"U2IwbVNmVVNIY3lnd05KeUxMUXZIV2dQNVBtdDRzSEdISWNHVXdFSU1pQTFsbTM3ejZCTHU3MjJlQVFKdEE0b1Z2Tk9SSVM5R2pPRWhGOHNneURXY0NpcktGQU8yWkN5a2x5VkE5ZzJiRFRqVzNwR2dFaWlTR0hOdlhjaFp4dGhqcTBPdE1iS2cyN05USmF2WjVYUEtvTk9K","upper_bound":"U25tYzNZazNqRU1RWFd3Q1ZQeWh5Mm53bGJVRmlGdldDQ29oS3NPYw==","repeats":1},{"count":960,"lower_bound":"U3FtVHhrZ3V1Y3lGbnJtODd5eDhCdXdqVFFoU3lWTg==","upper_bound":"U3dmRTh3VGZsODczSWNWZjJxMEdEZ2VqUEZEdlprSzFUTXFwU0c1a3BsS0p0YXZ3aXpXcTFPbGJXTk1BTHZlQ3BhWVhYZTUyVFdxZzUyelllQ0k1OE4yVjF5YkxqTWF1S1R1SE5aNnYzM1pVWmRmblBzRUE2dE1xWVJ1cUQ1RWRHQkNXNnFOTWJyZWZ5NGJSZGtpcWVLMWJ3MGxQQzNCbVg=","repeats":1},{"count":968,"lower_bound":"U3laazZPeTJaSUtEVmZNN1VnN2J6aVZNaG5yUUhwWUtJOTRXZEEwUEJoTEsyVGtCckxhV1oxcFdCb1NlbDdPcnNFcU5LS2NCazN6c1VFWlBYd0hseXQ4UnZLZERtUjAwQVVDYUlKY3dnaXBWNktzSzdOOE1QdlAwY2loTEhsajZYREh4VnFJUkdJTGZHTTV4N0dESms0cjkzbXhXUzM3NnNNeE9iNnlhSExYbVk2anVuRlFmcUlpa3Q=","upper_bound":"VDExWnNodVROMWxtZGwyU3FaRTZWWTB5c09LM2hXZGxSbEs2cThCTWt5bDE4NE1HSUZRNjdra0tFR0t0enhKTlFtNng5a2RveDRDRm8wQVY=","repeats":1},{"count":976,"lower_bound":"VDZj","upper_bound":"VERIUTE2dHppOHVDRWlBUGw0Wnd5NDFMbG15UEttbHZoYkU1Nm5RbHYzWWdvVVE3MEI1YUxHbHpG","repeats":1},{"count":984,"lower_bound":"VE5JRUZuM0R4REsxQks1ZWJhYVFCcWExVlJ6RnkxakNTUHU4WEY3R2dOSVFLZDNZQnNqRXpyM3ZiMmlRU3E0VjJlaHhibnZsVG1yN0hlZDhrR3Jkag==","upper_bound":"VGJ1Q1VZSzhvaUxoektBTjFSdTAwdjc4eUs5bzNxR1ZJZEFlV24wclc1V0p5NHhnNUlGd3ZhMXZRYlRBNEs5NW12YVBGc2dkUXhMZ2p4YnFsTktxNHhMdDhZNnl6d2diRjZxZmU5Q0lHdUtN","repeats":1},{"count":992,"lower_bound":"VGx6bExqeHRMVXFYYW1hWHBacU83aG5FSTZJOE45azBHMmxKTFNQZEFXMUNSeXJCQ3R1V0JSS0VMaUJOMGh1VEFjU3dQczBKd2xjek1UY0Zqb3pBTGlGUHB0WHhNT3NLNnFMaXFZWjJ1R0kzSTdxVkY4UUp0UVVoRlhRREhRSG54a0F6YVhUWndjVlJzMjA4MmVwRFJDbVQ1T2NJZGd6Y0RDZzV2a2RRWWlOTWk5QzRTWFRienJ2eG5MRDV5TUt2b0M=","upper_bound":"VHVkQXlZZnZBSUoyWVAzN3Uya2pBbHkxTWN5aU1jSEJxU0kxbTdaWjlqU0V2dTkxbjRMRXBuYklSclc1N2FXVURPdVpjYVplZUlMck43bGxsM3c2ZGlUd016QTdFdkp6Y211MmFwam1VNEptb1cxeUFCMzNRdmxZZGFHbnJhR29yR2J5VFhGTzZLejRCTHVTNHBj","repeats":1},{"count":1000,"lower_bound":"VHZtc2Rpb3lMV3hzbTB3Um13TmtYYUlDeEwxdXhNM2ZxcExpT3ByWGt2QjF2MVN1NHZRMTBqUUptMnpMaUpWWkV3Tk82VnNkbmh3QXR0NnpFVEJpU3dabVExNmZ5c2pmMm01M1ViZ1V1akV4WmQ2UUptQ0NtWDJ4cVZCbGRGZ2ZwaU5kUU9MNHRuRllIS045NnNmSURtcw==","upper_bound":"VQ==","repeats":1},{"count":1008,"lower_bound":"VUR4NFJBSWdLM1dndg==","upper_bound":"VU04MlBvanhaaGE2WWN2ZVptS01rSEZReFJrM1JUekM2UDNxZlZ4VHRPMFZLaUdFR3JtMFgwVnhJUHBQQXVFWElWMFJYVlNiREVvNUhTYmpUMm4zOFhxM0p3aHI5NXdUclU0U25BOEpiVllzSlp0WXdIQnpHNFpzblV6cDRJNTFNS2NwM1NrYWhDWlRjS25mdW5DUUpneEFzenowUTVYamJJU25iTTgwajVaREh5MTNPOW10U0R4","repeats":1},{"count":1016,"lower_bound":"VVAyRUlLNUg4a0dVTVdOMHVYaXR4b1g1dFB2SzVlOWxidEVBWA==","upper_bound":"VVpMUWJ4ZTZtMThFUDRveThjWDVEMzgzWXQ=","repeats":1},{"count":1024,"lower_bound":"VWRKVw==","upper_bound":"VXZKV00zUXV1TWZ6QUV0eTJqbDR0QVBlYzBTOXZkRngxSmlpS29VVGRITWEyVjRkMm0xTklwekJSZWlSakR5NDRpZFFOUHE1NG94UkJEWTdydTNXSDM2aDRyVEM0WFZqc1hhZ0Q=","repeats":1},{"count":1032,"lower_bound":"VXZvSTJKRXJDMXREOHV2S2h2NDNoMTJTdFJGOTR0bG1PN2YzQUZSOFdpaUdMOVVXTVd3b0l6U3RIclVxOTVzUHBheEFJMnExOXRrakp2ZDA2aQ==","upper_bound":"VjBkY2sxdm5Xc0VmOW8yRFRneERGQUhMMmQyRUxtU0xvdzU5d1c0TTVMT05TVEZNdGNjWmJPckt4WUlVUDdKdmk3ZmlyQlZTM1BPd2hFTFBZTzdvUzJpMVNIVmxRTXZWVlZDTHlqYXl0TEx4ZFROcmh6cDAwVXpId0ZYTzFqV0dCcDQ2OVg=","repeats":1},{"count":1040,"lower_bound":"VjRmTDBNOUExeWtjb3gwYmd1Slpkc3ZDUVZ6akU4WUFLOXRyOVlveGJ1WWsxUFBPNlp5NEZ5YXQyQjA5QzVMQzJMZHAzemc1WXdlNXJFRlo5Yk9xWUJRM0tZNlgyMndrYTJSZ1BCUE1YWGpjTEpQUndQbHI1MzRBdW9RVkp2TkhJVE5abWNRSw==","upper_bound":"VkJadDYzUjFyTXA4dzlMY0tRbUI0SVpkbHo2dXhZaWdNT2JPbW1WSUdVcVRBOUN6aFVtSWZtSmRsMG1VNWFxVERVRXhGUkNpQTRQWXBaV0oyMlpjemlqQkdNdEVmbWhGYldzSjB5bDZtQ21kUWNsN25TZURMamRpcGFQSXdWN2RHUDVDalBRU0hkTlNRM1JwekEwRERxMGdCTVo3SGF3ZGRIRk5PNk0zVEpYWmRib084bWRqV1BnR2xn","repeats":1},{"count":1048,"lower_bound":"VkZZV0J6R0t2Y3hweTlkVklVRFNEdjFtMHBocXk0ZHVzbnE4SXh6THBsWjdubGEwcFhnbFlLbjdSSFlaYmh1NWR4NzlHZHJJUFRZOFlvbzFZYVJnZG5vSjlFdmpEenZsY2RNeTkzYkRqdkdCZFc1OTVLRXE3S1A3U21VeTJDejhoekhyMUdBVW9WVUVVeUhkSHNDWnBGcEVkM1dXSkhBekMzN3h1SFZ4NjlXcUduRHgwbmtHVkJLZU1PMVFIeFBydUlG","upper_bound":"Vkt5OHZoc2Jt","repeats":1},{"count":1056,"lower_bound":"VlByekxkQ2JpSmRLUGdtQzNiTzFPTVludlNmb3htUUlyRUt4b01Qck9FSng0WUJ5U3l1T0xhTjBCSllVSUR5eTNJMDNEZ21rZlhXTGFsVXNwWVQxbm1PYVJSSVJsNVBxdGhsUHBFUDhxNWNRZ2VpNjRkQTV1YlZFSXZjZDA1NWlNekE1enZhZTFUdVZOSmZvSDZsaFg5UFhFWmNtc0hnZ3draEo5","upper_bound":"VmZCMzhBZFd1NlQ4dG1DWmRQYzFLc0l1elM0TUREN2JNaW56eGNraFNOZVNaaE9HWTJ1V2VpeVlUOU9WY1ZFZTBFdUZE","repeats":1},{"count":1064,"lower_bound":"VmxVTXN3ZE1vRVFyTTlNZmJ6bWoyU1lzc2hQUGNZVWVpdlZ1cHBZb2tCd09hWnM4Mm1pRVlrMW5kM3pWNXlYWldqNGxIbGNzU0lwU08xYUxqMlhkd0MwM25DMzA4d3hDZU1mbEVKVHJjRzlVMmdqS3pQWnJBYmhFOVVFbGJVSWhGaE1QV2hYZkN6dA==","upper_bound":"VnI1V3lsaw==","repeats":1},{"count":1072,"lower_bound":"VzdNbmprYlJwaDlWR2dtekxtbHZ0TTlSQXEzS05YdVFRQ3IzZmNZVWw2akhUNzdWbGVDcGkz","upper_bound":"V0RraWtUSlNTRW9tNFc3S0U1Mlpv","repeats":1},{"count":1080,"lower_bound":"V0tNbGttN1lrMm13OFhpSXlyOVpoQ25zOWJDd3JkVzlBRlZMOUFwSGx2","upper_bound":"V2ZNOHlKc2VVNXZzUkNYNWlVSUluaVpJSHRvcHFoSUt2cWhIZ0pPMlR6bDVXS0liQ0dha2ozNDFmeDcwaVkwS2hLajdlOGE1Q0xJT2J5aERBckxYMWRmb2hjOWVtdVdnVmxmN2xYSWgwczFVcmUwRzNkek5OU003UjJxcEpZOTdRSmc0TEljbnNyNmc=","repeats":1},{"count":1088,"lower_bound":"V2lGQWtnVk84a0FxUzZnd1dsQlJETlhXY096","upper_bound":"WDJSbHE5cFl0M1h2UFN6NlUyZFpodWFxWVBDeGQ5a25oU1dGcXVNNUl5NkF3blI2ZThWVEhJS0xJMEpoNnlMTWZpc3puamFxYWxUMU03NFNheHc2UHg=","repeats":1},{"count":1096,"lower_bound":"WDdDdnRYOTJmcW8xdGZHV1IxRW5qRTRrZmJNc3FxdjRGbVNJT2xsZTZ4eG9tRFRqNkpPM0JualJQeFFBSmJrNFY5MTRYVVM5RHhmbEJPdVhGWG9oc0xjbndEUjZTUjBYNnQ=","upper_bound":"WFNNNGJ1ckJ5Rm9BVGlFelV2VlFoZkpLYUd0Wk5yQVVNczdPN3FUUU9TTnp3","repeats":1},{"count":1104,"lower_bound":"WFNrbjFoYm1CcjdLV0VTajNHaGM=","upper_bound":"WG5UZVAzSVc5RlpuVldIOVlwd2E1RnVWM2pRcUQ2NW85amdWaHhzdmJXb2NtcTkzaUlkVDlwbWIwMHd6ZWdYeEo1MEF3b0J5NkNFY08yZXk=","repeats":1},{"count":1112,"lower_bound":"WHFmUlZCWklQM3FGMEdwRXZpWXlWN2k2eERrNWFQaDl5VzJEQ2V4eFI3","upper_bound":"WTU5c2JqRk41MlR3ZWM0cHU3TVpldUpVenE4VnJz","repeats":1},{"count":1120,"lower_bound":"WTdTN0hXcVhkU0ozWUdtcEN3c0dPTEFmY3pKTXRuOW5QSk5Ic3RW","upper_bound":"WUVZY2tkSFNibFNxNmRYWUJZSGxhc1REVmZkMGR1N3B5RTZTRjhicjB4M1Y4OExadmZ5TWpHTUZOWTZxSUZZQVY0QmlZMm93djRTT0pzQ0FNSTBoUmZiZW5GZXJPOXlNYUFZZkRGWDBnN0hUa3NkRWJENUttdmhUQlJZcElxVGFPU0pNUjF0eVFVbU5ncVd3MFE=","repeats":1},{"count":1128,"lower_bound":"WUVaTFp2c0k2RTFlOGFqR2RYUlphV2xaaU53Wm9LbmY=","upper_bound":"WU1DbVZOSExiWVlPZm1zSkVQc0U3QWRFMVRrTTc5RnA=","repeats":1},{"count":1136,"lower_bound":"WVJtQzlXVWxiMkxtQlFxZzZuTGRFM2tZOUhmRTQwSDg4ek1wdUc1cldUOFp3UUh6N1pwOGYyY1YzOVV5SWtMU2JyMFBQcjhERWc0UDluMllhenY5SktRS2dCbXZ4MmNPQjgxTTlzVldRZzFxSHppMzREaWs4UzNCQg==","upper_bound":"WVowZHVNUUhqajBEYWFPaGd5Ujl4TU1oUjRkaGNMWVBaVWJod3FFelJ1R283RVRkVjdmUXo=","repeats":1},{"count":1144,"lower_bound":"WXFnaGFqNFoyQnlIOW94SHNvWjBwaUVXT3RpQkROUFpCdndPSmFZWVUyYmw2S0ZnUjNPbXhPWlZDSk14azlRYkN5dU5KVlVrS0RrZmlYOVo5VGpLTFFpYlhWMnhSazRmVzBQUVB1bzUzS1NhOHlkalpWVXV4eHhDTWVuNEFzcVJiZ1ZPVDRSUWIyQXNlMnpMaG5Pb3VicHFFSGxjUHV5d2Q0b3c0Y2U4Uk1IOVViQnJGa1E5TEha","upper_bound":"WXdreEN3blpHZWVwUjlveUlTUFR2V2lZMm04TlFoVGRtMXNaaUR1MDlvWHlqeVBLdHlNd29QVGY1TWdCaExRTVlBSG5rNWZiRmRrdkg5Sk9wQkU4UmJnRGJ6VUxzQlZpd0lnc3RyNE9XeXR4bmVYa3BDaDVDc0JOT3pKd1MxNFd4MHlHNDgwVTltSjRHYWQzM3RuaGs0allldnRmR0Q5VEs3VlJDalEyV0NXZzc1TXdzdnQ=","repeats":1},{"count":1152,"lower_bound":"WjBrZ2hpOUNDZkFraldOcTNLTmpyTXVsVENMMEJrZ1lKWTJZZGV6cFJOR2g4eVY5QmVUQzRiOUF4S0ZLTjJRWVZHcGRuUFJRSE9TUzRoR1B6cEZDc2NUMENzbjdGOWxjMXdUSUp1aVoySEZKS2NINGU2VE51UHdBdWJqQjVac1NsOFY4Rnpna0FJYU5yZ2pyV3B4bW5PVFltNDlZWjdIa0xpTEpva2o=","upper_bound":"WjVnZ2pjcFFFSjJoNWlQSHhseVdwOFo=","repeats":1},{"count":1160,"lower_bound":"Wjc2djB3bjQ0dU9QUXRKNHZkT1RuaEZYVFRjVXdVM2FHSllhWnhxWg==","upper_bound":"Wk5KbVpMZmRpd1B6Z1M1bExKVkRTRDE3MW1PelFWUDBIZ2RIRkxvWFMwMnVzdk5OMGpidFk0Z004WW1YMHNxZ2xjWTFic3JwTkdGQkJrMGZTb0RubzVqY2VPQlpkOUNhTjdyT254T05CVm1ZTzB0T09qS2x0dTQ5","repeats":1},{"count":1168,"lower_bound":"Wk9yRHRGbnZYenZOMGFIM0VzemtJWHlKZWRnT3dJeThSa0ZhZmJHdldWTzVtR3ZnejVBVVR4QzRGcGlpV3gybTIzTjZkQUYwWHVObktBTjRjVlFuSVhlNUJRVElDaUZYdlFDazVBcThWcFlKbmI1aVRkbnVNcHlwNGNqV0hlWDA=","upper_bound":"WlhvS0N0cndPVEJrWjNYUUlkelhGQ2l0NTg2RktNZnBxbnV4UTR3THZyMGVRRHhyOFNIa0RWWTVjVktQRThSanhjOE9GTUpJQldoQWowUmVobFBNOHdjell6MGUwZ3o2M1IxRWdwbWJGSzZqQkhkc29xTzhCdFI3U1M5VXd5elJxOE9jVllUb2xTQW5wQ1ZYbnBMSVZsQmtheVVHTkZnemh2eXBtWnNoSlJJYzN1R3N3MHFFY1pNMnZwZHg4V3hkdw==","repeats":1},{"count":1176,"lower_bound":"WmVCSXBqdnJvdEh0QmJlRlFMV0ZhVTI1ZHJIcXU0cFlOOG5QcXpkemVIbFdmNWNpQVpqTWJ2UFFOalhMN3BjTHJ6d25ETkVobk9pR3A3dkxvZFd0UjJ2dEVXVWtLOU9lZzNDZU1hdmh6akU0YU8=","upper_bound":"WnpuT0xLdUN2clRPZzFQSHlVZ3c3dDJ1emRmT3dSaDVndVo1SGxqMkRRN2IzbGg3Tk5WOWc4RWwwUkJJRk9jWE9tSEowUGxPWUc0Ykh2d2l6WENZN1NwQkxqSGhKQjNxd01vOXZld253RVZ3d3lCVnJ4UTk4dW8xVXZabXNGV1Q5SlVVVWpOdDlibngyMjJzYkhaVlJQSDV6b1ZXVUlaU3ZWS0t0WER4OXpRb2pweEpEdTFO","repeats":1},{"count":1184,"lower_bound":"YQ==","upper_bound":"YThlMGdYVUJqb2RqUVNuUG1PUFdHOXV1bzF4QklKTzNYMk5LREVWV1FHR3Az","repeats":1},{"count":1192,"lower_bound":"YTh4U0JVSlpEbFlhdkRQTG1ldWN5aTFsSFJkNXpQc1U3NHJ4clo4cXA3Z05GdHVxbEZIemFCTGd1SHMzb1p6NFNCbTJZYUNPNDZ4VldMYXB3M2JEM2RSd0VxU01LdlR6TjU2eDhOYTczT3hJS2o0N29sZlJ3NGFEMUwwNkNkaVFsODU4YnZWOEY2NHVCQmoxRG9rT3dFNzhS","upper_bound":"YU1QRG5PZ25DWHpsTEpOdjQzUUU4MVMyMjJVSmlEVzFURUV3SFF4YWQzQ2h2dE5iVHJUMzVVWHc5T1pEbjA4U0lrUlluVjJ3SGRJalNueHF1bDR0Q2tPTkxtNDAzeUlNdUpsZDlpUThkTFRxamdOQ3hZd1FyV2NGaGdXS1BsRHR0NFUweEtJMkloUW1GUWZMckp4RU5TbW9IVXhzYmNnRU5NYXh3YUVmVmNBcG1EZVhYaGdvOWdlUjZq","repeats":1},{"count":1200,"lower_bound":"YU1pZGRZTVdBbWluQmNVbTU2Q2gyRnAzRGhVTjVpSkpBa0xUUDZGQTJNRnpwYkdVOVp0MWNYZGhkazJaQjh5V1FYWDlhSWlwSGpuanlNMVd0YXBRaTVXb1NnTzBpaFNUTzI0NmltbmNFU0dlOWt6","upper_bound":"YWY4Y3E1c1V6NjQ0bnlIR1J3N0JHT3lvZE5USWUwWGN2RnFPdzZ6SWZrUTRZWnN0SEVTa3JpV0lOc29xSmEwRVphMEdHMFZsZ3BqQ2tFaVFqS1dQQ1NnaTRvOQ==","repeats":1},{"count":1208,"lower_bound":"YWx0M204azZuSnhEZEJuV1VReE4xY3VwU3pNMkpVemk1ZFlzVUNvcUVYWGkwa3dMeU1aTk9iZll5aEljUDNBY21TU0QxRzVucmNHTWRpR0NtNzhLUWZ4d0RJNkVtTGhSS2dtUzNIektXdHVnRFM4dlZvWTBCUlRGOUVuSjBKa3ljRQ==","upper_bound":"YXZXTGliQlBnY2F4YjZmRGJMVlFwZDFDd3ZkbUp1RkwyZUxoMGkwSWpZZEU0MkFpS1BXZUFoQXNKZklKMmxsMERpcUxld1hNaW5uMWp2cVV4VVN5N2lyQ2pqdExYbktlb0p2U2Fkd1dyRXl2eWExank5QjFhemxkc05zaWR5","repeats":1},{"count":1216,"lower_bound":"YXZYcm12OGdLVGw3emM3bkFKNmRncnBaWWcyYlo0ZkgxWjdiSGZ6MVFxaUpWblZlSlZyS3YxU21xdGU2WlVpcnB1QWp1ejltcE43T2FlcllzZ280ZDFDYjJ5TDViWldKY011a2QyaWN6RlRRdmF0WA==","upper_bound":"YkVlTENucjhraEdWNkpaaGRCZ0NsYXdKVlNSWGUybUxERlFCRTJKY1UxN3RvOUxMZVFPeUsxUms1UTdwVzRNTmk4dWM2dllzUjU1dkVOVlJObXlRVkx5WUNmN2NKdmlTZmE2RlIxQ2d3OWx0UTRVWWpvR3hBeWVTWW90RmFjcEdhMG81SlZWZ3RrODN3RnVkUjEySVRVVmo0bjl4Ym04Z3Zq","repeats":1},{"count":1224,"lower_bound":"YkhUZlVjdEl5T2ZubmJoVkQxWm13TWc=","upper_bound":"Yk5kNEY2ZG9uY2FCWGk2VnhaV09jVHE4aXlrWkRla2VDNG1neEsweTBwajhaWnBESW01RVFOR1k2NWd0V0NoNG41dGw4WDBKSktUTDN0WURGSkNFQkRSR1YzQXJnb1kxRGdLS04yalBuTDh0TVZseE8xUkQ4b2NDM2pGSk9TYjZO","repeats":1},{"count":1232,"lower_bound":"Yk9rcHJnNnNXV1lBbUtadTlTdzVuWkZCRkJYaWw=","upper_bound":"YmVEUXlQTHN6OGtvR1BRbkhIYXZnQVhXdTlRYQ==","repeats":1},{"count":1240,"lower_bound":"Ym03bDdPTWk0YlBQdEJqWkJ2NVZwaUpGWFFBTFlraDRmdUJCT0V4VEVkZ3ZWOVBuMERWR2tzSWRxOU5LSHVYeGFsN3c2Rm1OdnR0ZkF4V2JvN0JyQlBLeWFGZFR5NHdtZHBjR0ZQQ0xXSXFjQTJBNHJyVlNMSUxaT0hXRDliUlRBYzJ0ZGFoWGVtNFM3S0NVTUE0NzBpWW9lcGtWM1h5MG56ZUJMczhuOGlETWxXNExOZWh0QXh0bnM1SDdmcHM=","upper_bound":"YnFsNWI0bzVzb1lZZmxGU24zMm5QajcyaFFzUGF2UjZyNEp4SGwyU3dVdGw3UGpySGI3T0lkbEY1clFoVHJkYTBkaVhaak9MVG1PRkJHdnk=","repeats":1},{"count":1248,"lower_bound":"YnJIbFNJSg==","upper_bound":"Y0VzNE41OExGc3dmS0RpWE9uZG5qTEdsNkFiYm1MV3I5RjJEMVpCcU00MmJPWks4MHdkNmlwZnZ4aFRkSk0wOXNOTXRCMENmY3ZTMFM5V2p0Q1ZtdzBwemd4TTFGR0p3RW1GdGhsaFRoRVVjTG9PT3ZMSDBkS25MVTU5ZVQ5TGZr","repeats":1},{"count":1256,"lower_bound":"Y0dJNFVBVlZxY0pJVU16c0d3OUlldDR6OXZuUkV3YmdSZGtzc09pM2ZNb3hCbFRKdks5MDlNMzN3bmhLTmF5N0tRRDl4dUJPSnFFdmZDc1JxNm9oUG1Cdko2cXRlcjE5dlZrbERsMFVaTEpUSWNUYk1nT29CV1pnOVBSd0ZkVWk2b3B3UVZHMGFIOWRwbnczNEEyVVI5OFp0UjBMaVRNZjhRczhJWlVwYlBQWHNWRDNVM2RKN2hGVjh6ekR5WEZJeG1NNWE=","upper_bound":"Y01Qemk4elBsaWdDZmNkYWVHN1g4Q3RiQk1CRW0wbm5VOWpqYTNsd3BjUHRYU21vWjJ5YWQ5RW1Dd0J0QW56MzB6ajU4VUZVYnlPQWJ3QXFMUGZHM0k0YUZwVU1H","repeats":1},{"count":1264,"lower_bound":"Y1A0bEFYcTVXdnhwRmxZeEZrZ1lySUtmR2ZLSUlLVG1ZR2RTQ2hUdU9Ka2pDRXBIeWQ2VQ==","upper_bound":"Y1dUUVFVY05pcHdOVTdjSzl3bk1FUFhiUVpoNzAxd1Y0RXE5bWJEaURYVmlLSVd6OG1hamgwRkIwVXJvUGxYVjlDZDBMUFZ2elRseFk1TDFvdW1BQlVvNzFkeW8xeWZxSUNrN1hQMmxtOVg5SVlMQXV4V0N3V0tWcEthR3U4UFZpd3FYeFpHTllLZGM=","repeats":1},{"count":1272,"lower_bound":"Y1lWMXNDUFgzODZnaWFqTk5yTHVRbzJTbGxobGJvdGh1UUpvRDVZaUFGd1BWd0xuWWhZVVFIR3RyZlU2aEU=","upper_bound":"Y3FnVVh5YjZlMDV4UmxxOVhSZ0FuNGoyRmxGOExYWTFROEN1NzUxMHFLOUFpS203djlObDAwbDVjMFZNdENJY2JjYWpGTWpCQUExS0swT3l6M3JPb2docnlTY3NlcUlqejhDa2plNTBiWTNCdHFVSFJSbzRLOTNsMkZpb3Zib0dsRnNGdnpKYWhZYlFmcVFiVUQ1RHVDaERtdGhHQnBINlRQRDBXYTZuZnJWcA==","repeats":1},{"count":1280,"lower_bound":"Y3NTRXhSMXdrY0wySFlVY01FQjBBVFZPN0ZzYkZ6dFZyalRnMU9mZ3RzWGt6QUFLdVAwaGhBbXVnbEVyT2VpamdCbEpiUDVnd2o1MDB4RVNGbFFHVG1TZzM5UFl5NVVMcW02SFpvancyb0puNmx3YVQybg==","upper_bound":"Y3ZWbFVjUGY0Y0pVZ2Z2Y25iV2NwNjU2dFpUMGZoeDFMdW1hMUh1ZVN1THUzZzFpVWRFd0NXUjBtQzlEYXN5ZFltSTBRQkNuWXRMMGk2OWJBOXFUMzBmNUN2WUVGT1BwajRGdjExTGhKT1lNNENxd2p0STRHY1hXSTlp","repeats":1},{"count":1288,"lower_bound":"ZDBVdGdWeWZTWmNzVGdwUVdXc2FLMW0xSFhxOExmR3lzajRPRk5EWEc4YTBVRHJCeUs5alM3cEF3aGRuNmNIOVF3Z2R6WlN5TDVnVHcyOHNzdGI0Vlg1Zk9aS3NzWjRWR01Yc3dkRGhYQ1B0bkQ3RGZSck5ERDRqdXpuMExxcGk4YlNDYmx5QzVzSlhrNFJjQ0I0ajJKM3NGWEpzcXdMU2l0Y2g=","upper_bound":"ZDVJY3hXQjZmODJOc2pucWY5Z3lwQ1AyV3BwSUtlTjA2eQ==","repeats":1},{"count":1296,"lower_bound":"ZDl4S1lPdkZXZ1VGRVFUVHJWbHlEbkZMTWpPUWt5bDNqbg==","upper_bound":"ZGZIV3hOM3E=","repeats":1},{"count":1304,"lower_bound":"ZGlkajVuTlZyQjhXZWF4YUpKaG5DUjNNRlpQdnpQbGQzcmVxTVdrOWg4VVNYbzhhU0VicngxWWRtc0o4OTRSaHJzVlZYNWhPMHoyaGZWbFFuZGF0TnhSY1M=","upper_bound":"ZG9yMmQyUVdlOThDbVNoQTNZZXZOMWk1T2ZOcnlRbjRXbXpmcDhCU1h5U1VBaHM0SWVVdEtoeUVmdWRrOVdkZjVaNmZWdTExcXBZUnduRHR5cjRCRGg4Z2h2ZHpoRmxDRFJ1dGo1S21LcU9KOEdUNWN6c0h5YXBZQmdVNFBqUUU2dGdtNGRjR2VUbU0xSUtvNE5ZZ202WWlMVElvRWJ1a0ZoT2JZZWVIUFFRcWZUNE9sd3JjVk41VHJBODhZ","repeats":1},{"count":1312,"lower_bound":"ZHQ3QnpDb1NNTlUzZkY=","upper_bound":"ZUdFQmNCZnkydFM3R2NCc2Z1bDhmTW5lNGdUR3pSYllLOGt0VFpONXllZjZ2U0FJTEtHcE05Z2dCNUxkNHMwck9GR0dMZDRQMlhtT0tyN2p4VklsMFN5R2pOb3VLNVpYNEFTR2dHS3diaFhNWEMxSkMwWW4zMDc0TlBJMGZHYVdXVDBaQTRzMDlGaWFlNDc2SFF6SHFZSGM3WEdrcVdIOUtHdkIwd3B0NUl4RzU0YkM1c1B2OGFCZlFtNmZIR25IM1U=","repeats":1},{"count":1320,"lower_bound":"ZVJMZnBPRFNNNFdMVXlqcW1Cc0xEZnk5ZkxNcXgzYUNCTmszVmhlUlVYckVkekw1ZGV6VGJhT1FKTDhvTVMxSUNKdFJoUU5yUjdOSQ==","upper_bound":"ZVkzbTg=","repeats":1},{"count":1328,"lower_bound":"ZVlEQkl0Ym00eTMzWlByMHFmOGdWQU9ITnprOWlVNVNlNGcwRFhWSHhxRTZMWnU2dHNwZW5CemJyUGFyWTJpODh0eXI3cnFGR0djYndPTm9udEZUeUdlR0NlaXFiTUVQbXFaYm5s","upper_bound":"ZVpaaTRHempoMkdtTVFIaEpFcnBLaGdDS2JFcw==","repeats":1},{"count":1336,"lower_bound":"ZVpkbzVrY1pzNG54RDQ0NXZQTHN0NHJVWUYwT0x5THdwVGtI","upper_bound":"ZWdlOE4ydGhaMUNEN01Q","repeats":1},{"count":1344,"lower_bound":"ZWxDVkRGVzJI","upper_bound":"ZXJaYXpXUDJ2aVdFbzVBbURwNmdwMFdFdjdVNU51OVRHTnViZmFwTmFISzJtTkdHYmJEWEkzeW9sZEZldmg1TzR3MllrMGgzNXI3bUdLVURaaFdLRkdISU5ISXJLUFRSVEZydW1mNldNeTJwTkJ1NERDajQ4YjNPSUF2Q05sNlRHZUltNGs1M3VXcmpVTVh5MkFPQ24=","repeats":1},{"count":1352,"lower_bound":"ZXNTenlWMTREUk1MM1lQRWpyNzdlZmFjaWtTdWNZa3ZZaHk5MmlvR0NURHlnZTJ5a0c3NWlOeldRUEhrVDJQM0NmZ2U5V3lERVJWVUhRd3U0bGFKMXlRc1AycUtxd0VkUGxTaGh2RXVST2xRUDU5Rld5djdqUG5QN3BUZ3U5Ymg5YWtkZFdvRWcxR3NuZE1UQTR2THRGeTNOTG8yS0pEbUFYaHptVW9rOTJTa01VcA==","upper_bound":"ZjNsRnh6M1I3aGRGZ3ozTUR1ek5STm1JWXc4VEdibmc3cUdyaTJWOHE2MmhXRGF0VjVzYkx2V1JYd1dTOUNWZGVNcXdCVDhBbThKNHhwRk04Szh1Q21BSzZrU0t5QnZxbFEyZWhya3BhNk9TN2tIQUdqRWkzWGc1V3hFMmhRWVc=","repeats":1},{"count":1360,"lower_bound":"ZjR0aTlzd3hvWHozNDVsYk8wNmp0bUlpUll1Q2hNSFZSYUIyRG91VkgzMVgwd1RQVjR2QlkxaEZabHYxZjN1N1F6Q1pjQVlKREt6aGlFOXVEdll2QlhxeHlEQm4wbXdmdlFoM1NmeEV1OHMydG9PejJuMnNpbHhjdmhXRjFXemRUaHpCWHByVFd1OVJDSEpycERCNG9hc1lWWEpCUHBnazl3elNkU3RaS2lxemlFZ1JpV2NMeUJWMA==","upper_bound":"ZkY1WTdRZ0t5NFM2eUN5cG9iZDA5SEJmazFCV3BGMmpwNmhoWnNOZkV3NmVlMjlhSkNVN2ZLcHZqbUkwMXE2ZVJhSkFLZXR1ZWs1Z2FKdmJGbzRZcDM3TVFiSE42QmlzeXhrNFFkemZyMXg3Q0FpRFlHWjM3bGF2RXBUbnhwb0VjMkNKbDJpcmdjcG9HMEdGUVJnVmNqMDJ5NVd4WlZkOG8wSUFkTXBibDY5YmllenBZOTNPMU1JZEdpU3Z5czR6eg==","repeats":1},{"count":1368,"lower_bound":"ZkdWR3AzQ1RLWVpzdHhBMkhCWjNtOFdqYlNXUmE2SGtHTW5UbGFORFhIOWlWa1drN294R0xCblhRaVMwblBLNEJVNVY0Wkh1NHAwcnNqZmdVaUZMbmY1UEZsQ0d0Q0ZUNmxVOVdLb0NkMFBqa25ybXA2dXVGd2sxZTVNTklIY1VkMmV6a1ZpNU9YTDg1OEMxMGNyRVB1T0pBbmxodE5jdjZoQnZvNW9WbU9ITGd2WjNWZnhHUnloMHVJcg==","upper_bound":"Zk5xNVk0RHBuZlpMcTdiOUVwWGZPUndvYVFkM0RVbWVySA==","repeats":1},{"count":1376,"lower_bound":"ZlBSZWI0cVhpNTFGU2d0b0pweWNjTjZmcDI5c0NEOER0aWt5YXdZTENMRUtDSFhOWjVhYmVnb1BxT0tRZFRtZEpRcmRsTzA1SmxFWGVCem1GZzVuaU0zU2lJYTdaMWhOdWV2S3BHODdkWGxjbjdnSnZtSnVxTksxSTlCQ2FsZ3JmVGkzOFBCbjhlZ3FuUjU0SHNoVnFLZk1BYjllb3J6a3RRS0lpbkk0UWtUTlk0VXZrY1F2M09UT3FqdDJUT0hjMnc=","upper_bound":"ZmFCV2lId214aEpSSldObG91REdWUW1JTlY0SEZY","repeats":1},{"count":1384,"lower_bound":"ZmhqV3dMamNORHBnbVkwQmNGNWZrcnlHNFF3OUtsUEhkMlRwSUxNSkdzeWE2UWxjcThHTTB6ZGs2RUwzS21iZ0ZPZFFpWUdNcjFUVVJjc3ZHUmVLcjFUU0o5OHZ1eUx6R01SZ0lHVDNZ","upper_bound":"ZnhMVVFxT0FLZGx2SHo1czFPRlFWUVlpWEF6dnRzME1saDVZSk9FS1I4UnJydDV3","repeats":1},{"count":1392,"lower_bound":"ZzFsU1BEOTQxUWNDNEZvODlYR1M0NTlQeGl5c1I4WjZOMlRCclFwT0ZnQnlsTGh1RFQyM3dPajFvY2ExMm9wakk0cEVQRFlwTVdwZVJ5WDFKUnVSMDYyUGUxbWpHUE5rOU1hdGNaV2ViTXlVWTdqcUlwYVYybVVHNVp5M0Z3VXBtTDdhbzYyb1FOeHVING94Yk4xWFloYURuWGhSTFZYTThFN2JvOXlPRXdPdU1rS0FxY2NTRjJ3eDdjNQ==","upper_bound":"ZzRwNFpxeDFQWXo5NGF3VHROa0lJMUNKcFdVcGVZWlFEUGw2Q2Q0eWtqVzlKZ0UxT1B3RklUdkUwVGNpemFZYjlwcTg5dlBhSDVTQ25a","repeats":1},{"count":1400,"lower_bound":"Z0IxUkthN2ViSVBYYkJtNVZZd0x0Z2tZVUJXY05RZGNsMTlJamd6WnN4eldZMkZsMHJLV2Y4dVd1WTBhVHpESkhjOVcxeG5KR1p2eXp6OWFXZDlmVFNFeWNhNGdYbzRpcFNkc3hJU0d3SzF1SjdyNDI5NEtnZkszRU9sSUxOaHlheDRrbHNUelR1N2ZRSGtRdlE=","upper_bound":"Z0xLU0owOWVNVWU4TTh0NVl4ZUl2ekxkZGRZTEs5UVplOXZlVTcwdElGbDBKRG5OVTlaS3EySmlJOW5qa0NVeHV3QTQ0QnNsaHlzbjhyelV6cHJ4V0w1QmJQWDJKQldtbVhtVFJSZTVsa2pBT0NreTl1SU1DTmdLcnN6THN3bEgzV0pIYkhsNVA2amFpcVpHa09QZw==","repeats":1},{"count":1408,"lower_bound":"Z1Rrak1BanpSY3RZMG4zQjBqNnRXSUJHTnYzYzVKQkFGV09xZUJTYU5pa1lJOWVSbGVJNnhXb3EwN3VCQ3lUbUVyc25OclhtVUhDdTNUTVRURmRTV010alhsN3huVlJmQUVmdFVES0VTNzlsd2VxUndaRUh3WlA4Rk0yeEUyNWhBMm56cGx5MHJqNWk0OVZEaGR2bXNQ","upper_bound":"Z2ZlcDhiODZuakVYUEFqSjM3dndvcVh1V0xOaUhTemtBRmZhWHViZXlpVEJyaHlBWmpweUx5TkphOHN1R0tuaFJ6OTBsQmRxeXdUdW4xUTJxY0xVM05IeDloTVdReFNKNmZyQU5MQlNGYVltSGZ1ZGo3OHB5QTFGOVgyVFg0SWIwZDZKOVdlYzZ5ZFlRQUhz","repeats":1},{"count":1416,"lower_bound":"Z3p2MzZwclVrTEN5V3JoVDFyTVVjd2JqVzFYWDZoc2JWZjNTN0pZNFI1MmNJYmFCanQzcFJEd05pYQ==","upper_bound":"aDJ4RnZuc1hCOWp1aGdIOWc4U29nOUVQQktRa21XSmdlc3ZRSzY5aWFx","repeats":1},{"count":1424,"lower_bound":"aDJ6WklQNGc4WVhKQjQ0RUM3aW5NU0g4Z0NUVlNXZDM0cTMzQ1QxU1JrTGZXUHo3OGI4Mk40bHF6b3ZLVldjaVZTOHpjVEpzMGdqaUpXTU96ZGhSM0RLTHEwazU=","upper_bound":"aDVhaU5XbFIzaXpXNkxGdms2c2owRnFtYkkxUHJuRkJ0NkJ3cTJ1UzRaZzB2bjA2RmhER2pXSnRoN0Y2M3JFbk1k","repeats":1},{"count":1432,"lower_bound":"aDV1VWpYS1VKUENBTlNtTXc4Y0luR2daSXdrN3V1ek54alIxOXp6anVQMnNQdERIclNJWVlkdW5Va0x4WnVsdW54cGVwd0hRWnFjeg==","upper_bound":"aEFOTTBzZFI0anhNVUd4dGtmdUdvbUR0SEY3bVZndnFSS1ZqM0VSejUxMDc5NVNkNlVuZnRKU2RiTGRubk1nbnMwdHhFWWJoSzdHcHlMTjc2U3UxM1hUZkJNekd2MldGQUhkY09SUERMZA==","repeats":1},{"count":1440,"lower_bound":"aEdsekZndXE3aE1RM25CY2lCUnVCMWhZcTgwZWo1endueUpreDE1ejBnVjBnRTVoYVZZVGhwMjFRbnhydVpzR2o1V0lIdURaRkpXdA==","upper_bound":"aGYwSWIyNWdxVzVmZGtrbXpjSGZ1d3lSeFE0aE44T0FxUnFEVTlNZWxDTm41anBkdlNsb1lN","repeats":1},{"count":1448,"lower_bound":"aGdkTVBKQWpPaURYR0VuNVVqRTVsTjZldlJadGFTVGhZS2xZZ2tyR3ppSGhTWGR4NjJYczNObg==","upper_bound":"aHB1OVdWY0NnSmtsSkc4UURKRG54SVNhMEJYQzFXRjlmREdRWmMyVTFJUUpNUXdBT2ZoeUY0N2tWdQ==","repeats":1},{"count":1456,"lower_bound":"aHRLM2hWNDhOQndLRWtHcGMyUkw0MzEyak9QVXlQbw==","upper_bound":"aTdYbUx6elRNcWo2dEVMUEtXWXRlbmRmQnJ6UmhMOThDdDlZMGI0cTFwenQ3RVpHQXZuMHJKeVcwVFQ4ZEpzNUxicUFwRXdIM3lmeTE4VUJZUTc0eUd5R3B1VHVaVmtGbU9GQ0FZeEZwWU5iWTlTWGFoeFpKMHhKb2JyTUZKUk90Tk45Q2dRNmg3aHVVNlJxaXZLTUVueFpiSFN6N3ZQR3YwVk82OHRkTmk3SkcySE05czNFUnM4WVZKUlBVT1RvQWh2NFU=","repeats":1},{"count":1464,"lower_bound":"aThyS1FtSzlOd2JDbXZKVkZkUVhabllUU3Z2TVRFM25ubzNDSWROTDZIRmcyTnJ0ZmpISENTVG5nNUxRREJMYkhBd0ZDb1RjM2htUmZOcDh4RnU5UzFiNlVIb3BwSmwzOVdHWklMWHhu","upper_bound":"aUtpTjRWSFVYOTFnOTF3b1pmVTlQNzNPUHk1N0o2UVpoaFp4NzZiYVA5azhISzJWaEpNUk5HUW9pRHZCaDZ4","repeats":1},{"count":1472,"lower_bound":"aU1Vb1RTbE12cGpxRFY4MDdXY3NwTUVLaWtsZFRCRUtBVg==","upper_bound":"aWhhSG9OVm84c2N0NWZpa2Ftb1J4aENaOHl1QQ==","repeats":1},{"count":1480,"lower_bound":"aWptMWlDcDNkd1MwOVZKYUJjY3VvWVhaYno0ZzBYV2w4SjA2c2xmSmo3SVFhSzB5QWcwVkFVeWxhZWQzTlZXSVkyU2xFTENERUJUbHlTanFmcng0RXg=","upper_bound":"aXFKakZlUW5ZMEh3eVJvZjVPY0Zia1hhWmVVd0pRUGtVNnZGSHJuYlBMc3JYNjZjc2pPUVNxQTRQcHR5dktCRm5vc1Vz","repeats":1},{"count":1488,"lower_bound":"ajM0QmsyQWtXM2R6ZFpBeG14Ym1BVUc=","upper_bound":"akhFdGJoN1VR","repeats":1},{"count":1496,"lower_bound":"aktzZkh2UTFrbDVROGhkVmk1WUZJVXA2aWdmRU1uMlJrYk44U1NvSkNGZDcwa2NiRXMydTdYZmVjSnY1SDk2dDU5","upper_bound":"alVCWW5MWGIwMDY1VUUyblhBNUhEYVh0VEdpTDlSRlVrT2FwRmw4YVVwUzRmR2NNOHJDeFQ1UWNnSTV2Nkxud1hhd1NUTlV2d3BtNVl2UENTS3VQSzQ0SllaSmE5TjRGRHhIYU16dmVIcUFaWlZRZVpsZlFRZmJ4eXFLbjB6b3I4UWdjVGh6OW1XbkN5UE5lQTd6N3lkSG9MbjlqejNDMG5Gb2s=","repeats":1},{"count":1504,"lower_bound":"amJjZE9rVTVpcTVHcUJLcDhGcnBpQ2dQbzFrbllLZ3ZjeG41N1dZdVdpUllyRUxHNENoamozUjRzYmVtU2dBYXdraGZYWjZ4UktKdlVuNzNCSDJpOG1raXBaNkk2c3d4VWlOZnE5T2I1NlZraUpWUHhxYkFOUlU2MGxJVmdlV2FlQnFBQU53UUhMVUw4SjZRRVBqTnplTjBWUEZibDRCNHR2ZVQxM1VGa1RyTFNQNmM0QnhMVUJyWEpJdko=","upper_bound":"amZxZURsQThScjdLYmRoeEV2WmhhMm9wQjFMaw==","repeats":1},{"count":1512,"lower_bound":"amxLY3paN0JmTkVLbWhVb3cyd01rMEZ2U2VGeE5GeFFwaEtQc0ZoazI1RVVzRkdHdHJKbkY=","upper_bound":"angzVE9oRGJtbWpaVDRxTllzQ0FOU2RCMXQxQ1g4YkZEc0hZWXNKMWZzVFptYkRXMkFYV2RJUE03NnBuUmFFbUJBdQ==","repeats":1},{"count":1520,"lower_bound":"anlWOEl6Z0VYaHl5Z0NJZENPSllodWZmY09BT094MmNNblFuS3R0TXpaQUNLYk9lcTM5MmdrSVhrZFRudndLN3hmekFvTHNnNVhrWGFRbHVDTEhINnIxZw==","upper_bound":"azA1N1laSHJHaTdmTDRkMThYN1drSWZqWDZOdWI1WmhCWGNiejZGMzlOTlV0UkVWckNDZTRBZHZUd1V2NkdSdzZpS0psVnpWaURTT0FhSEUzNXl6OEhGb0dGVXNvVEFmYUdURE5nZzk3MDVPdjg3dmF3b0lMZEFWeVNWQURmeGFYQ2hpMWoxSg==","repeats":1},{"count":1528,"lower_bound":"azRzTVFFd0pNTkppMTh3OUt2NjhuRk9DR0ZOWW1iak5leWxSeWU4b2tIZEV5WnFaMXRSOXBjNWM5SnFPSVo3QW5VRHVNRVZiY2lwSVRHbENtOTB0algwcGl3VFcycW5mbmtIS2ZaQlB5Qzg1ZTVjbHFsOHhQQkNtNU9aRFFHRzFGQzV4b3N0WjlvUVhzOERjRE9XWUVCdWRmajVDQ2RwMXpycGRwNFhkZXZzeVBCc3FXcGdxSVJIM0pXcGFi","upper_bound":"a0dINjVYbGcyQU5HNWhucUlFYVhwd2VsRmhPQjc0VjhoZktCNWE1TVRBN2ltU0tYb3N6Zm1pS053MzZtczY3ZDZycWdDeUpaWldpSXh5bnI0dnRhUE1Nd1FsUG8ydjduNlVUZUNBQ2ZzeTZscVoxZVJSUG5JNTBRMWJNMVpUbFM4Q3p0WXg5UTRuQWNjTWlCYkQyd3BnVENHRjRqQUZod2V3RG5qdGVwczRkMk84aFpRbGFQajVYVmZ1MDFpSUFyQnkzbGdR","repeats":1},{"count":1536,"lower_bound":"a0dhNDdFQmhaUjhLdUJoRG5XeHBkeVlIN3JEOG5iRmZTOEtKQjVwTHFQQ2pVdEl3NnY5d0VKc3RPSmRPMWZldmFWdVRHZHYzMkxpQm4wTXU2Q2h3bWVPN0xHcmhmN3N2c1ZrVnBHcG53anJtQmpsT0kzN3pxWjE3eTAzZWlkbkZHSlBKUzdEZmxTTkJGNUFMNER3WTRGY053Q0Q4aHN1MGtEaWxrUkE4ZDZCZVowejZENWdDbnRrNmNKUU5yUEhZU1lrSkVhZw==","upper_bound":"a1RVblRkWEt1ZU8wTTlQS2dKZlRhZVBlSGlhcExMNUhFQkd6MHpkRExSanRkSg==","repeats":1},{"count":1544,"lower_bound":"a1c4","upper_bound":"a2hnY2lDNGJEaWo4MkJvU3B6ZkFjNkYyZzBFY1k5OG9yejhFOWZ2Rkswazl6SHE2VUNlZw==","repeats":1},{"count":1552,"lower_bound":"a21pc09KQndPWXV5aU15d2N6akQ0ZndVZWtpaTJGZUFHWEFBSHFDWnFvVkRKMzRrWjh4b0RTZXdnZzVNY25hbXdNdTVsSVJ3bjhHZnh2STFmc0N0d1VRMjF0QWhyeE9rTmxMdWFwYUxhM0pWQ1hONWxTekZJQjJyVWRFOUFxSHhHY2R5ZENLWWxtVHVSUXROMEtINDlGQjJp","upper_bound":"bDNBUlIzNGIzT0ZHUlI5am9HdjRtZVk1UTZIblZOZmtaRnpHS1o1eGxuSGp3RTIwOUQyQnkwdm1laWlYUUtP","repeats":1},{"count":1560,"lower_bound":"bER6YlM4NE95Y3lXS1BZQ2JFYVNvcFZYNnhkaHp5TEJ6aXR5MU1JZGJQc3ZqOU4xQkJXeHdWRw==","upper_bound":"bE5COW1ZZXEyV2ZwY2Rsc2RHVjhCUnFWY05lSHc1MVhnS3BEelVYTE9UUGR6NlZDaVhGZzR2QlBVZ2NaV2dKT2Z6NEtrYlhsc0hOSGR4QXBJRnRnWERndUE0WjZMNG5jb1NRQWVT","repeats":1},{"count":1568,"lower_bound":"bE5Tb2gwTTNJazZ3b0JCbnBzRHFjRU8wMW5xTGk=","upper_bound":"bFpLYWVYN0g5S0ZaNm1tQ2x1VkppajVzUjA3UlBIT2dFeEFjYWxTSElxc05XVTRLSmw2MzF2TFVDVUFMdjFDU2JOTUM1N2xnMW9ESzhwZnBZRHZjWjJiZEtWWHNJS0dobjJhOGZGWk5DVnNJV1piSnY1VjlYdVRDR3BMZFVXbXhHNktLT1A5clNmNnE4TnY5MmFRcWZCUWJub25MejRjTU1Uc3BHaGpHVg==","repeats":1},{"count":1576,"lower_bound":"bGI0WTc4bkdTa3FSZ1BvcVdPWnlYWmE0WU5VUVk2d01zWWpESDBsTkZyak9WSDNzMmRublFtSDI1SkxxUDNndVg1YQ==","upper_bound":"bG5NSkVLZTVRVFJUckJ4","repeats":1},{"count":1584,"lower_bound":"bHJIVG03OFdjUm04dW9oZ29jOFJLWkJHc3N4dXN6anJZRmltM253UXNWNFpwc0JhR2w0a241c1RYT2Jlb0xkdjl5ZHo2Vk9DVUgxU0w4MmVXVFZnMTBWbWFRM0ptWUpiMG13V0lsZU56bUFEdUVRNnVrMWEyZ3RkbkhxOXpMZklhNVU0eDF1NA==","upper_bound":"bHhPNTFlOVpIUE11MlF0VGV2RWdrRWJ4dHpKbHZIdWt2b0RUem9xZW44Nkg0WFpSV2R1RTZhQ1BQaFlHeGRMSGRNNGhZTlpPVnlRQm1NMnJwcWJJMUxNeFVBelJGWjFBY2luZWVwMExUdmhOTkg4Nm9vVTZWTWN0SzdMQTAzOUs3amlmckxHTEQ5ajhvQUdwdnluOG4=","repeats":1},{"count":1592,"lower_bound":"bTdIODNJSnVz","upper_bound":"bUZzNm0yQ3Nvd2trUHNDVVZUbDB0S1d0","repeats":1},{"count":1600,"lower_bound":"bVEwR01IQ0JZMXpxdjdXZWEwY3VuU3VpaXl2QU5IVngyVldzSG0wZUFKWkFDNnFzeUt3all6YTQ3bHdEeDhmSUlCMDJWM0xxbXVQVmkzRENHVzZyNHF5SWRVS2t2SjdCNEhhbA==","upper_bound":"bWpraUFZWnhiMkw=","repeats":1},{"count":1608,"lower_bound":"bWtnbndqYWRPNVJmdDc3MGlsckxrczVqelhobFJRd2djMFl0OWhoa1dka2ZwNGNiMm1IVzA1VE9TWkYxRmpqUlBvTDNFemx0eW5SUGJWeUtVSDRpdzI5S3B3ek0xTnhKQTcxb3puZ1hPelFCUFlUb0s0R25KSjE2MWVuUmg3RGE4dVcwMWJFT0tUbFFqaloxaTBFbzljSVp6aGxEZUdHTEJWaTBLbkRDMWJXQzJMNjNYeXNST3Nn","upper_bound":"bXMyekl6RzBBc2ZNeEpDMmpCZ3owMDBvSW5Ib1AxZ2JzVjZPTUgzdVNROUxRUU5hQWduMEZJTlMwcmdiVGYzaUJ3dlpVN3VZYUZZb2UxbGFWdGhic2k5N05vR2ZmTGoyVkZxdU5mNDhoRlVpSGFvQlA2S201cmxpRUZlV25TYzlqZ1dt","repeats":1},{"count":1616,"lower_bound":"bjAxcFlmZGY1bWc5NWlRbEVZUFZBejFLYnpWZlFiVlZqU3VzWlRWcVRRemd2VUFkS0FrNkEzc3ZodlluRDEwN2Z1","upper_bound":"bkJQSkJLVXZFekRmclJkMnFhVWZUOXFNdFh0QmtmVlNFcHFqYlFqbTBTMWU0TThiRkpPcUYyTEpiUjlrbHF5Y1pnYjhEOHpRbWRlbHYwSFh4S24wM1pZbjdtZmE0aTBUTmJFM1dhc1lPOEZUSk5GcklGU1A5QmhYQnoxM3QwdVB5SmN3Tmw=","repeats":1},{"count":1624,"lower_bound":"bkRHTFdQYWVSS0JVdExLcURESWozNjIxYlR5QWhCNDJ4SWNUVDg0RkpDYUU2eE1SbEpsOEtvZW1waXMwb2ZqcGFCeTlPWEt4MjZCYVRudkNHcXlSUnlWQVdvRkQwaDNtcjFVbUdLNDNkV3dOS1E3MEtRTFZhOUlmamRpUjFTOGJ3dzNtdVRHUlRtemZxVEJjeWgyZ0RmY0hCaTB3MjNzampXSnJaV2QxVXFtWWxqOHBpVEc4VlZI","upper_bound":"bko1VXB3cGp5Qnk5R0JjSjdVV0tDM0l2NzlCaWVnMWFJdFdoTXNsTHZuY0k4SmFhdHdoV2VmaElRTDBIOEQya0IwM0lES3Nqa0NPYzM4dHMyRzhiYTBiTVRXWkVjclJlZFJF","repeats":1},{"count":1632,"lower_bound":"bktqQmo0dXVQNnBIQXp6WW5HYW5MbW5HOE5FYks3OXBLM3hTWDhvcmduc0ozSw==","upper_bound":"blNQdlNCSTJlOFkxUlYySXA4MFQ2Z3Q4NVM4eGc3anA5UDRTcnNoQ2wwQ1ZJVW45ZlM3bzg4T3pNOU41WXRtMERFTnRlVkhWUWNDSDVXRjJub2pvZXo3VzBja294a3k1cUdHbzQ1N0h6SVFydUFzWWJiQXYzd0hoR0g1dUVyYXdKQlR2Z0Njc3J3Sg==","repeats":1},{"count":1640,"lower_bound":"blZWdE1qQUxjVjV2aDNWbGJGbVFDZlBZQVNtQ280azNmMTN0enhWUnlNMlJocm8yM0ppMTUxYzluYW4wdW9rRkVkTkZuc0YxQU11QWFxNE9MUUloNWJIdnVMMFQwUThiaEpCeTJZbm1aamhOZXZuV0NBQ0gybVNJYW1VRHJvR0R3UzUzS1NLQ1NFYzdlYVVBUWREdXo5d2ZPelZCRFRzd0NpZlRrdEgyallvRWdkU2wzUktPMm5L","upper_bound":"bmUycFFCWXppQkszS0ozWno0MmU4MmVqbTFaMW90WEpmelBoYUdxbGZPWVBBdUJUbzRkSkdISk01cUlic3ZTSVVLU083M0R4WFpseW1SZ2FBcUdDOEtlVVR3RTJHaDNDN2JDMU9iSUJXb1BJVHY2cTdFUlZpZnJVMjlGWVFucnZqNllkNGNLR3NVTWhHa2hPWg==","repeats":1},{"count":1648,"lower_bound":"bmY2aVU4ZFFxRWFsTnNCZ0xTMzhvb3pGY0JwNGt4bGJzaHdkMDI3YlpxZEQ1RDNaT1BHeEtoWkl5OTM1RVNHS1VmMFR0WWljemxjTTVsVTd0aVhWOTJmblZzejZhRkdUdG9O","upper_bound":"bm9QeUI3ZW9JamxYSHh0bm5ncGkwQlZFZUthc3I2YmhtZ0hmM1d2S1R4dHBuUGI5ZGxIR0V4TlBLbEt1NW9kejVOaTV2YUw2VmpBQWFzQTlqRlpsMU45VG9oeDNPRWl0Vnl1Wm9NMVZ3NXdDaTI3SWVsT09wU1FBUzNsbXBkelg3WkRubHVaQlEwNlV6QUFGbUFUSEVmZWh2UTYwWkY2c2xHNFhiWVd2MmxWV2FZdTBScm5jVnZPV01hMXRBb3F4bjZHaFVjMQ==","repeats":1},{"count":1656,"lower_bound":"bnBUVjc1RVRJN1pwRWN3YVZ3U3FzcWR6OG9UdDlQZERuY0dIRldRcUxUOGRuUmI2MHFnMFgyUTdTNTN4VmN0QkNaMUNFUTBSVkdiNUUzakk4ZDhEcTlHelJwYmd5cmsyTzd1RFl3a2J2QUcwZklsd2dLOUhjeEZ0Uktnb2dOVmJseEtzRExWUzY4NWllU202WDhIRzNyd0dsMlkzdkVRcHN5V1psWGxBTHdFdW1L","upper_bound":"b0lJa2lRcldGZVdBbmF6dTc5cnREVlRSRWdpYjIwQld6dGNIM0RPTm90eUxiYXpubXo4UzJNcDZ0ZGUyYVFQMGp3ZGZlYVZOVVo0OVQ1d20zNE1PNkFiTHpQSEFkNkpIZVFRenhUSExOTXJkMDNoZERvUGppaHNMMkplRXU4WFM1WE1pY215TW9TaTByUGpMOHRPcjIwQk90emRm","repeats":1},{"count":1664,"lower_bound":"b0lOZ0Z3NXdZVmlPOFh5ZzNmY0pqUzF5ZE4wRVlhVDZMcmlRaXMwSTVnQVRVQ0wzSGllZEFzZzNyeUJrR3NZbGlmb2U1Y2lmVng4SnQ5WEtrUXBIY1VoYmQ=","upper_bound":"b1pJNDJ4REZsWmh1TU9xbFlnbGd2Y1lqUnhvanFDR2czY3FqSnBucDgzcXJLbXBnT2pmenpnQ0dCdlZrS0NFejg2SXI3VkVoTGNPQlVSVmRsaTFXSTdzb1BaRVV2RGlRd1hob2FHdk9heUg3ckV0emF3a1lmeW1CRVdsNTRzTFN5NEV6N0FwZTBBV2VRM3g1MG1KWng=","repeats":1},{"count":1672,"lower_bound":"b2FGbGdFdVpUamZRZlFWTHBhTXN5WndzMHpoZmx1aTZWZEd5dWdNeG9rbHlpbzV5NmRCMG9qN2VPbnhkUzdnT3ZQOTloQ1VoVWlXMnFMT05qenRvNE95ZXhQRDJJcFc2dkppUDFOOVZjYkpxdmpJTXY3YW5hZ29CdkhSYWloNVczWlZ4TmF4dWdCOXo=","upper_bound":"b21RemJiV2hTMW5TMTNLd1FpV3RWUFI1S2tReHFLWTg0Z09neGkwYWpYRnZUQkt2SEhZcTJjdjE1VVp1MHU5ZnhOOFFsVTlWV0ExNFZ6aE9kRmpSRHk4RDFEOHdtVlZCS090WXNERWRMQVZKaGQwc2FEd0JKaEFNdnBKb21sSVREWGQzVDRHdXBqS3JHR1NGNXd0TEJNMXJhN0FNZHAyZHBuc3Jtc3VpWVVuNFhkdkd3dUJwbGJ5VHpSOFROU0Y=","repeats":1},{"count":1680,"lower_bound":"b21TZHVwVk9KbnRBaWN1ZFdpTUpVcWpRdW02ZWl2SVpic3NIMkxaRQ==","upper_bound":"cEhiOWs1cVQ1RkhibWVlcXFvTlU0SHB4ellvTXFDVHI4TG5tY1o=","repeats":1},{"count":1688,"lower_bound":"cEpma0dITjZYMEJYN3hVMDhUNFhiYm5qVlJCd09RYUxGa3BXbjY1Q1pVSU9hdzlBVTZoWEY3MEE4eGxEbFkycXdQOVlhY1Nwb3ZpSFFVeVJ3eDJ4Q0RzZlg0UFFaZFlHckc4WHc0V2tRTFdhYzZLU0lzYnBVSmZSUnhYS2lEQTJWWkkxeVJwRXdyWEI3","upper_bound":"cFI=","repeats":1},{"count":1696,"lower_bound":"cFlSU0N5Y1A2b1dmU29xNTVWSUg4dkdOZEdxTjBOQ2h0NTd2VUw1QXRLdGE0WWNHT2k2MktVMDVoOUp2YVZnS2F5aVVxdXI5TEhZRFNkMkdZTXlj","upper_bound":"cHM3eEZEQmo2b1M3MDVMVFZ0WkZ1Z0F5bGJ3Z2VIRUZwd3dFTGNramMzV0JOWnhtdEd0Rkxkc1RBN1ZRd0xuMWNDcHZ2cFJZN2ExYTJWMGxHN296UWlHUVN4R0pBcGp0dUw2U3AzbEViM2VwMGxXVkR5eVRrZUlweU1WTmc2U0VNRUZ0RmY5ODZHQlV3bEdvWkFyZjNPdWp5WHA4R0Q2WXRSTHpRSTNrSjVpcQ==","repeats":1},{"count":1704,"lower_bound":"cHRMTmtFeVc1cVNxczVtOWlMSjllVUk2VjZMYjV6SjBHenhHSTFyR01YdjRta1p0RGNFYzdNNkcwdHJDMEliWHZyOGZMWjNKYjZ0bzBPNDlBS1JyTEhQRw==","upper_bound":"cUVvZ2NOaUE3NlFVa1pIQXdzanlEZ1lQbmpLMkNhM3VkWFJPQ25HajNKUUw0N1pyZnN2TW9teFlBWEViVjI2SHNQVGVwY0hoRkMzMlFDbA==","repeats":1},{"count":1712,"lower_bound":"cUxBbnlrVmZ6WVhFOW1WbzR3OURLMU5mN1hidFZZ","upper_bound":"cWJCc2lSeG5zVDBpMm1OTVhPT1cweVJJWHljMGlqd25oOEJXdExxS0VyNDRpalI5a3lsOVpqcFFDalFBWk9zb1RoZVFyekI0bTVNNDdQWkVQNzdzS1dXNlloWWRnaHdjM0NwWkVyT1pCYk5DUzJOUFdVQ2NyRnhVREhYSTAzZkVPY0Z6b1pvMmpHRg==","repeats":1},{"count":1720,"lower_bound":"cWcwQ01Qd1o1YkQxRjRESTJaMmlFYnNqS3hOMmRncFFvZGlHYWVHOGV5UnM0bFVLRmlYUzZxa1FSczBKZUplVkNSemNHam1TMTFZc2JFTHFsWk5yNDR5Y3p2UE1ETFE3NnkwT2NJVmtFUzRidDh3aVFJdW5lVDVpSmt3djhCMVRuaG9teXJoNEt2VGo0SWY2T2VtdEtUbWlQUnpnT2ZNT0F1WUg=","upper_bound":"cW9kVGVjeGc0aFR1QWxpSGc0QjEyeFpkdjFLWVBZR3BXYTNMY1dKd21ldWNHZEE3bHlQa2VlYmZHNTN4N3ZWMVV3U2ZUMEdNbDJmS21BNElhYktVRzFsU2VxNGpVTUxYaDhDRGlBZlJ2S2tpQTFuYWluZ29XZTBDNEN2ZWNRV09sRWE=","repeats":1},{"count":1728,"lower_bound":"cXk=","upper_bound":"ckt2dXcza0NMcUxQR2tHem5leUhpcTJ1a3FBMVRheUxmb1B4MVgxWmJjNzIwZ3V2RGpVckRRYTdYMjRXdUhhdDFsRzFqV3RuZ01Ra2pKeml1eHF3SGZXMWVSeFN0Q2ZZWDJwSHlJVk5kMFR1b0VZa1BnWDFRY2ZjanhQSDZaVnNObzR1VUhaVVRZSzhla2dGVWZVYUlIN2hEaXhoUmI2R2w4MmlycTVXMThDcDRGdXQ=","repeats":1},{"count":1736,"lower_bound":"clBlUlVuNEV4QVVSTHdyWGY2TEJxZDByZHpTNmZoUmJDaWNRN0c2clhwV09SYzJmTDdnYWZEYTZqU3drelBkUVRXSHhpYzJIS200MlFJSXE0S0daNzNzSg==","upper_bound":"cmdCZ0piVXVBZDNjYUltZzFvaDV2UVllM3NjMzdGcnNnd1gxVGFxREdOQ013WjhlNW52Wm8yNGJsMWhjc3IyMWQ=","repeats":1},{"count":1744,"lower_bound":"cmhPMWJnUG9rYldyQw==","upper_bound":"cnQ3MDRMRDg5ekNLUEE5S0RhTGlHd0hKRk11cFZtZ0VKeGZIekhYYkV2RkdvbGNEb1czZFltVFN3N2N1M09tTWlpVXdNS2czbDlB","repeats":1},{"count":1752,"lower_bound":"cnRZenJJTHhZRmxvYmlnV0N5","upper_bound":"czBCNmJTM2N0S0hsbFFoZFZoSkZxemg4a2ZTd3VZVDBYS1cyUjNGN2daemdDZ3p0azE1Zjk4d2R3bk93VVNVVDd3SFBHTDZlVg==","repeats":1},{"count":1760,"lower_bound":"c0MzOWpaWVFvc0ZZQlZibVRrQ2hkWVNFY2Vndld1Zk1USGlVcUVwT1JQZ2NPU29GaVhaRE44dnBveFJkeDE2Y0ZhZW1xc25mVmJvMVJDeWN5aTIzalplUjQ0b2prdHJ0SkZxQURRSW5qeEo4VnhRWG92NXZVbkVXVnZIOU11c0NuTXhqak1BNGltcTJMdDB0TlJzMmNKRjk=","upper_bound":"c1VzVVVlWkJoZ3ozOWpOS2E=","repeats":1},{"count":1768,"lower_bound":"c1Z6VktsWXdMQUhDRFBxOHlFOTJ6WUdxMXFi","upper_bound":"c2RoR1phZ29NODNDclVZUmRaVEJUMW9qazEwWlNDcXR6d2JEc2RWMG1USTBsRXhmR0duRkI4NVJkcWthU000VVhFT0VLa205VkljVEV0aVF5MmtIVTNQN1BsM0xiTEQ5Z3ViWnJEanE1dlowY3dTdVZPcmZQSFN5bkRPZQ==","repeats":1},{"count":1776,"lower_bound":"c2pDMXN1QjJwTjJxenlZemFzVWl1N09lMGtKTFhvR2YwTmZYUkg1d0xTZ281bmtJb1hZVnpNUk5ONmhjMWs2YVFHc0JsRk5KRFVNWTZoRFNDQ0I1cVNzdUhlNFFKSkVQdmg1S3hnaE9RYnpjR0ZLbTl0VkxSbnZWaTdEWUJDMTQ0anBPRDhBclRkT3ZjWndHcnRFOWZrUlJIcjNCUUFzdWE0WXg5TlA3QTNyWWdGakFzVDdlVnJkaUMzYTI=","upper_bound":"c29DMHQzZWhzTVhzRENsNlRHYjh3NHViVjFORTBBOWVzUlZDZkF6S1I2TFppQjRuWWpleGdXa21ZZ3NUSVlXcDJYSzR4cXFDZTdEa25DQW94TGptOVhCblBaZEhUM2M=","repeats":1},{"count":1784,"lower_bound":"c3AzRE5Xd0Z4M093cUVENzZ5VzRtVWFKZ09SWTI1YTJnNXV1ZE4yMnUxOXFZcFNpcEQ1R1VWMldVdVJEb1g2a1hqT3oyZGdp","upper_bound":"dA==","repeats":1},{"count":1792,"lower_bound":"dDBmWnNh","upper_bound":"dDc2YQ==","repeats":1},{"count":1800,"lower_bound":"dERuQWVuNzRFMFZ6cjNEaXc2OHpkMkdJM1R4b1lzZENjZ3FlblpDdmlBTHJ6aFpKcWV2RUNmNW9KcTh1c2JVd3BrakxvT053UGVhVzgwOG1kWUdSdjNYeHlzckZRQ1Q3R2NhMldrOW55Zm5VaHNQa05hUXRndDNmdjUxSms3NlJVdklrdk9BcWhGMGtaS0U=","upper_bound":"dFR4d2V5RTJKdzhIVnczN3N2N0k2WkxEZlJ3VmJBMEVweVVTa2lSSDB6RGc0TXpwNFlxMGxZUEpMajhEaldTdGY1NGxWQnhhM0lzV1cwWmttSnpXNnZjY1RrYnA2enpJb2dYNFllR1N5OUJPUW5jd1hESWVMem9EN0hVeGZ1dlVtMXVFc3g2UGJXZktWeA==","repeats":1},{"count":1808,"lower_bound":"dGdhRFFtZ2VDSjBENllzTGZqUFVZZ0lSZjRrSXZGWXpDRVB1aTE4SHlrY1dJV3I3cEI3Umd5RGdmQUpvVnBzVGV6cUZHcnNUNmVqRjN3OEN4T0hPeXVGZWtuTk5aV1hGSzgzZVZuUnl3ckZocWVzWkJRWG9Zb0g4R2dIblo5NktWRVphV2NkWnRZem5qOHhWTWxWanM2bzQ0TmxJSFNZaVFRSjRrb2ZhSjl5eEpJeEZTUXdhVHZETw==","upper_bound":"dHNCNzZHOFMwcHFnazlDVXFlUHNkZE1hR0JQQXBKQVVVdlhMWmJBVkw1YTdES0w3a1hsUDBCb21MRkNkVXdaVVNpeTBjNEZtVWpnQzZ3WUJENmdSVFZGRmVYMFpCS0pWWTIwWkk1WFM4RDB5THE4N2VnRHl2VWVIQ1V3VlBtN1Fyb241OU5GcXpx","repeats":1},{"count":1816,"lower_bound":"dHZZTE15RUdZbkdTZlBHQUxhcmFzUXBPQlA2YktiR2lOZ3EzM1J1MnZnSGpldkdqOE0=","upper_bound":"dTg5eTZwZ2ZMOTRQSmI5U1BCUGkyMjVYSHhiV29TREhYOTdoZlBtbmhIaUF4SFM2ZGJRa1NhUllXRlVSSlp3U3MwYThUcTk0V2Y4aVRUa2V2dmhQWU1DTzVKWEphczJtNzQzN2J2ek5wQlU=","repeats":1},{"count":1824,"lower_bound":"dThTZDl4cW9FV3BSbnp2UWRCTA==","upper_bound":"dU9xbGJSYjBGZzZyM2lLNkVndHdiU1hkZ1EwZE15N1c0bVMwZkxnT05od2toSnB3MHVyd3FHWnYyNVhJT0JOaUU1YlFhcmttdWRhSXpybHJBc1F6NWVMckdZU2pmd1VhMWtmd0RDN0Jnemg0OHRIRTNrN1g4ZUpGWEVzY09NcHk2OEZITkgzMElHVDFla2ZxOXpwcUYyWFdCcVpZUGM5VFFQemdSalhXQ081UG96QTRCa25YWA==","repeats":1},{"count":1832,"lower_bound":"dVNNZGp1ZU1vUHVuYks3OEFIU1hOODNCYmJxUktHRDJD","upper_bound":"dWNiUU1wdVpxMVBvTXViZGc3S2VwaERYc1BHOHRHcHZIclVORlVEV0hJQ3AxeTBpcUVscGtlMVVTa0o1emN4SnZmTWN1dGJ5SGpJYXl0Zm5zajhweVpOOVViRm9rR0NVekdjNDJCNVFac3lxREU4SVp5RUNkWkhYNGYxeklDeUlOOFRGTnJEaUtpYWp3Uk1nd1Eyc05YcW5VUjFnYjZ3Z3V5UHJUS3NRMXNsaGRi","repeats":1},{"count":1840,"lower_bound":"dWdLa1NSUVRldHZwUjNGd21CdjJGTWdGSmtiQzNMUXBHeUkzQnlLZHpVOHViZGhtMGtocW9UUFNHN0tsUk9HM0NKUmpONWVZbzV1YU5UZndYWDdnakhSSThac2FXRUQ=","upper_bound":"dW1mQVgzb3BTWG1wcE9NTlNjVGcyWnRLaGhaMGNwUEtvelpxeXI0cFRkUW1jR21paDBmZ2JSc0lxbUxNaXhVeWZEVGxpMUtjMXVVc29VQzJDbDVsZEx0blBPUkZjRVZ6andaRWIz","repeats":1},{"count":1848,"lower_bound":"dXRzc3NZdlJYWkxFNHVZb20zSFhOcndlb0R1U283M3h1dDByS0JyUGZScDQ=","upper_bound":"djg1YlRqdGdMaXFTRzNzNzVPbjZyMVVIUkFMZDlYUUx2ZEFBZ25zVVdtaVZYeTBhTDdKZWhDc2xFbXdNRHlBR2RmUlJROXBSMzY5dW9Ra2lyZFBPZjhKRXZlYWRkR0NBQURKMmtBNjJybFpidjFtdkZGNTA2THoxQjE4RTZ0eDdSNzRSSTNkRUh1dWNpcGU0dzRqWXBPZkFQejllZGZZYWdBMGE2cFBER1hGZ1owOWdsN0x4NmxqUDZOaDI3OG1GMFU=","repeats":1},{"count":1856,"lower_bound":"dkE2ZFMzamlBdzAwR1MwbnhLZERZd0VmTkZKYnlhRkxy","upper_bound":"dkNxdmZsWlNzc2pOaDBhUTgzU3o3ZTlrRG1PZjlXMERndllGVDRuWXdvMk5DQVJtSWRQTlpOTHlyV2JRT0wyQkRQdEVMWTdJYmk4YXRBYm9Gc3U=","repeats":1},{"count":1864,"lower_bound":"dkdEbTJSU05pRVNBRkU3c0RwRVNjN0k1RHh0ZWF3cXc4TTE2c0xudGpNcDQ=","upper_bound":"dk56SEY4TWxrRmZxZHZ5WVVNeDVQb1NNb2cyWk03ZU5P","repeats":1},{"count":1872,"lower_bound":"dmJEcW9mT21rMXZmaHVRU0Y1R1JjN3JESllMSnlTMFpKVDJOSEFNN1RoSzJmZENJa25JYjZMbG8xTHlldHFVVTJXR2hCbE9BTzV3SDgwc09kSmVhaWs0d3NZVEg4bVdHMmp2SGdhdVFrTmFkNWpJVQ==","upper_bound":"dnVlQlVGTGNUZTdQS203ek5qczBwTkt6TENOQw==","repeats":1},{"count":1880,"lower_bound":"dnZWRDJXaTE5QXIzOFpIQ2dBbjFLNkUxU09uMG9RRWFBYQ==","upper_bound":"dzFNR3c0R09zQ1FEWXZpeGRDQzIyenRkd3pkaXpaM1ZURXY5MHhlc3hOZ2l5SnVWZ2dzZTFSZ2lON1FGaTQ1akg0U0JPUURtUzVMYnhrdzcyZEplY3p2eVlYV0hYSFVsR2RGaHlGM2I=","repeats":1},{"count":1888,"lower_bound":"dzFRd21FaGl0VFh3TEpqbkhuRnB5dmxkTktJS21scUhaUElJclhkOFBGeDFFMFRjeXp1MjFlUTlCcUhtemJlSmkzUk1WYTY4V0F2NFJEUzUwMnROTkM3NTExcnM4cXl6akxOVU42QUNwQkFxcQ==","upper_bound":"d0RYZ245SjdDeVhaWExGMEdoRVRpanZFUzE0OVd1azFaOFNEbml2eVRlNkZaRTdVRjhPZU1tdDcySnRkcnBFalo3dUZMejh3dm5UVFlhcGFvTXN1ZndrT1doUm9EUGU5bkxqaFN0bHU3MUlVUXNySXJtSkdDUkI0N1NoZTU5aXhKcjlGZHE0OE43QzNy","repeats":1},{"count":1896,"lower_bound":"d083VlF0OXJLU2pkSkJQODdNQW4zSEZqYzl5YU8zcjlmVjJWREpma3VkOEhYWldSSklwRk9mWVk5WkV1alRRSmRna2I5bzdNdHpIbXEyS3dvWXZBTHIxN0lOaXhvaHpZZWl3S3pVUURSZUpnUko5alVXRnlFMHdYTmxNY1dwb09sZXVmNkN0ZkEySms2WFdkUG5sOWFWWmYxOXhBTjFlckdLdTAzTGd2QzVnbHljeXgzZkVQc3pKOG1sRDFwSWVZSk4=","upper_bound":"d2c1am1nanMyMWdCdzNkdk1HR3F6aG5wR2twaVFOdmJ5VFlKODFaWmtsV3hON2RQeWJhcEdKVlZnVTB3VkU2R2dJNmt6TjdHQnIxdm9oakxqcG84RWU5VVdiZUNuSjhaVDJlREFERllDTUdweEEzaW9xaTRVQnVXNURiRU9aaExzdVNQbklTWGlwTTBIekJna0syUEpmSkRxdlg=","repeats":1},{"count":1904,"lower_bound":"d2lxUkxYcGhqOW00aHAwbVFkNWdYYzFSWFBEenZjMVBwczFNcEg4Tlg5UGprbTJxOGI2bEQwVHlPTVFaU1ExNWVCVjJWZU04NW5sdXgxeFJkeG44amROOXFnMzN1d1ZrajY3QkFYd0x0RzdTeXE4S1dEQkVNM05hNVlqdkJOTEI0Y05tVEZDdFRONU5JV09MTzNSMjQ4Qlk0SUNDQ0dncldITnRDbWhMcUtZYVN5NHlxdTc1d3diYUpC","upper_bound":"d25WQmx4T3lwNUo2b0UybVpDRXNHTDZJRDFOWkhOTHJMZnRicFl0NEJKYWhmZ2tIcG05ejZFaVcyUGl0QlJxTHFERUNLaUZDMmI4ZGZHQnk0RlVobTFWdHNFWEI2SWlJY2hHMFRWMFl1VFludVZ6enpqN0h0MkxvbHhnN0dJT1ZQT2lYNTVpUURwR0J0Q2hnQw==","repeats":1},{"count":1912,"lower_bound":"d3VqVXgwbHJlbGcwTVRRTGdkZXlFdXduTURYT2N4QnNSb3lQNw==","upper_bound":"eERhaEpHaWJ6V2ZRVGphR0tuVmgzd2tFbWM3Q0JybTRrWW1PQWhOT2M5ZHFla3BwRTdqOEtxYktveW5VOFJJeVZMSnI1Vkt0M1Q3czFOdGcyRTR5a09KRnhNSHl3M2dqc09yeGp5OTZRTVU5VHRiTUg0Mnk5OXhSV2l0M0dRS1RLZHVNRENROHBXQVdPSG5CaDVUQ00yTkUydHNvR0U3YWhkVzNH","repeats":1},{"count":1920,"lower_bound":"eEp5QkFrU0NiaDFsR1h3eHkxREQ3SnZrdFlhWDM2SzFSaWhaSjhRbVdSOWNFUjJXeDI1eHpaQXV0d2MxMkVxYVFabHdzR3Zqd1dsQTJtd2dKcm9YM2tXbjhKblQ1YTYzWkd4T0w1UlVENWt5NmpyeHNUcGNpb09sY0ZvNExSYklPbEpUM054N05WQjFVVVU4UHFZNlczZ3VCeXB6REwzaUZFVWhmV2dqQjVYTkVGc1g=","upper_bound":"eFhQSnVjcHAwc2ZabnFnWVpuMXhKSTZ2NnBIQWhzVWhFMGJZNVc4clVEcE9SNFhaS0xQVnlVeXU4VFJiMElrUE9Va3hqdnEzbktEUm5GeHRGNDFha1dxdXphQm1wbTFicWxQZHJZZEFJcExROFFMQXRrdDA4SnpwRkg3aHZJUUZsZkd3bHVHRUl3VGx4cUU2YnhkRg==","repeats":1},{"count":1928,"lower_bound":"eFlPaVdaVnk0NXNzY1BIZDkxSGd3M3VvVmN0czVqVmxLMTFiZ0xMejUwbjUzeXJyQjFmUVdyR2dMblNrN1pPbDBNaks3QkNzNUJmVW5URWxaRXl5UjNNM1d1WkxlMA==","upper_bound":"eGxJVTVtbGphNGxkUERkYTBldVB4czh5RHVXWmU2Z3BSbXZHalVsWjc3b2xVbmdPOXZQYlBod2FBV3FNRFh2Y0ZNUmxldXc2NkszV1BRQWxtQjh1d1BqdnE0eFdDSWRjYlk=","repeats":1},{"count":1936,"lower_bound":"eG5OVjcyZGpMaFpaVE5RQWJ0cWhGVWZlZ3k5T3hMRHpmTnZGSGc1M1Rkc0V5V0F5ejN4OQ==","upper_bound":"eHpNd1Nmc1ptdmhaRU9B","repeats":1},{"count":1944,"lower_bound":"eTJhcmRteDNIaVRzbkpjOFFyZXlxWmFKZW8yMXc2bVZ3UjYxZ0NqRUlZTk9raUM=","upper_bound":"eUZYQ1F4NXdTd0FnVldTakxoMFRZSFhOMWF2bnY2VFdhZGNRdDhtZHo3anNOc0NRdFNENzVsNEJZQWxkU2pCajNFVzJpSVB5Z1ZydjRMblBXUGRWTWpPaW5KR1lyYUpwZ3FaOTFhakdFbG1SYmR4bGJtNHBKaHdzV0RoOTU=","repeats":1},{"count":1952,"lower_bound":"eUlwblRSRGJ2dm5PVFViTUNXNlg2a0FHTkl0R1NsSTdoTjg0SHhnRzJacUhWN1lTZXBoYVM4V3NiZVQ5RkZBTUFKU25JWmJyYlNEQU5HMVVPUXJBQkRqZGlFbTVnZ1hIQkgwYnRtbmxYUkwyNVdheUx5dW8=","upper_bound":"eVpqNzYwY2FXTmdic1FTNkZuSjAxNzNCZG00RWYySGlDeU5Bd1VsVjRabVl1TTI=","repeats":1},{"count":1960,"lower_bound":"eWRaTm9TSmlWU3ptdUE2T0pCZFoxMWlZQmEzYlJnZVVDZWRhNE9FRmdwSWI0MEMwNjVRVWJ3aW9sZkRjVzRhUk9YNWVUSjM2dlRNNnY4TGtUSHI1UFJyQXYyNzVxM2tpaEMwSEQ4WTlCWjBUUzBYM2R0NTFHOFNSU0N0WHhrd3oxNmxxdGljWGVHQjJnQ0lTNVdFRko3WEVhMUxUVnk4ZnUzNk16ckR5U2xaTG1VTWFLZUdKY3NKQmQzRlo2akNFYjRZUlBFZw==","upper_bound":"eWlubUNqdFJTNWhjSzJWMDlMRDFpZkNnTkdvSnVKc0JOZ1ZGcVVGUWtpTGJFQ2RsVTJOZGhaNVZ3eVZ5SXN1ckZrQ2VYV0lNak1HUDV4RWpQRjRNUG1iY1h2VmM5d2Z5ckJpZmNhYWR6QlB0TGtiVnk3NnFMdmhlTmdJdXpvN1JBejJKV2JoNFlhWHppTlcwOXlnZlV2ZVBqT2dCSHhGa242dzF5S0dFbTgxR1BvYU14SzEwVk5RYnhxZDU3RFJwTw==","repeats":1},{"count":1968,"lower_bound":"eWpCekRPeTRFUkJtZ2luUVc5ZFFDNnRIOE95WWs4WEthV3RkbnE4d0NmenpUN0hkMmIwTg==","upper_bound":"eXg0elBCbU9GVENCS3BJd1gxMFZIU1BxbW5IUURjWkxKcUdRNzVWcnRvbVlNMFRrM2pJZlhjVVFxbmpZVTNOOHFZM1ZZeUdGMEJPNldjb2FX","repeats":1},{"count":1976,"lower_bound":"ejFRRmlCeEZMNEdKUUhvaFZsMW9wdHQ0WWowRDdOMWZwdDBEaHpNMUJFRTIwS3BLNkx5WmM2R29JdUpsV204","upper_bound":"elBSc3dRU1ZGQ3lBM1ExemNBMjJTT25QMUp3Rnp3cGZCa2NCeG5kNUVGaHVCV3dSOHdoTGYzV25ESGdCd3R5dGFUYkNFdHZGRDVxb3JtNFJRTnI1dTRwZTZ3OWRUYWRRZElzS0pvSG1Nd2NqOUp5bE1Hdk1LRTdydzVOdEZOdjA0MGZFZmFJODlLVmwxRE50Wm1rT3pIVjVy","repeats":1},{"count":1984,"lower_bound":"elJPM1FsYnB1VU5RNTZRWHVKbkJOckJ2U3ho","upper_bound":"emNrTVplV1VLVHdRT2FKeXM=","repeats":1},{"count":1992,"lower_bound":"emRjZVlSU1Vzd2dHY3o3b3ZKckhpejJQZ0RWeTNsRnBWc1pWUVMwS240QmVXT0FSb3A3aEJOU3JNV2JIb2FESDU1aDU4OFQzUjVNS09kRTVtejJhNWRYcVpiZGpSVHdlR2JZaktibXF0ako4N1M0ZHBuZWJndjFQUTM4UGo4bjBoWkVJNkluZHhNc3pt","upper_bound":"emhCOTllVXV1eHVnOU9FM25UdExjWDNzcWE2UmxtSWtNeGpLMTVBRldDeHhvOHZURHJRTUExblRod29NT0dWVmJYa05acTRqS0EyTDh2UVFFdGtEVXhJSlpJTmZ2c1lYd2NkZmhYaVVZVUwyUU1kYlhkbzdCNzJDNW53anljM1FpVlNxdnV6MXVDRlJBRHhTWUt0Nw==","repeats":1},{"count":2000,"lower_bound":"em9jREpGRDI1S2lzbHVXVmhXaWd1MFAydDJJajllZVBNUURMY0NtcUJ1UUt3bnBWNzg=","upper_bound":"enhjdEtxdHFHbUg4MGttdkxwaUtUZkFwS2dEdlVMQmp2YVFqRE8=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,2,1,1,0,0,1,1,1,2,0,1,2,2,1,1,2,0,0,0,1,3,0,0,1,3,0,3,2,2,2,1,1,0,0,1,0,0,1,1,2,1,0,0,0,0,1,1,1,3,0,0,1,2,0,1,0,2,2,1,1,1,1,3,3,1,2,0,2,2,1,1,1,0,0,0,0,0,2,0,2,0,2,3,3,1,0,1,0,0,2,0,2,0,0,0,0,0,0,0,1,0,2,1,0,0,1,3,3,1,2,2,1,1,1,0,1,4,0,1,0,0,0,1,0,0,1,0,1,0,1,1,2,1,0,2,2,1,1,3,3,0,0,0,1,1,0,3,0,0,3,0,1,0,0,0,0,1,3,0,0,0,2,2,1,3,1,1,1,1,0,1,1,2,2,1,1,0,0,1,1,0,0,4,1,0,1,1,2,0,2,3,2,1,0,1,0,1,1,0,2,0,1,0,2,0,1,0,0,0,1,1,0,2,0,1,0,1,0,0,2,1,4,2,1,1,0,3,2,2,1,0,1,2,1,1,2,3,1,1,1,0,2,2,3,1,1,0,1,0,0,1,0,1,0,0,2,0,0,2,1,1,1,0,2,2,2,3,0,0,1,1,1,1,0,2,1,0,1,1,0,1,1,1,2,2,3,1,2,0,1,1,1,2,0,2,2,1,1,3,1,0,1,1,1,1,0,1,0,1,1,1,1,0,2,1,0,1,3,0,1,1,3,2,1,0,0,0,1,0,0,1,1,2,2,1,1,1,2,0,2,2,0,1,2,0,1,1,1,0,2,0,3,1,0,0,1,1,1,2,0,0,1,0,0,3,0,2,0,0,1,1,0,1,1,1,0,1,1,2,0,1,0,1,1,1,0,3,0,1,1,3,3,2,1,2,2,1,1,1,1,0,0,0,1,5,3,0,1,0,1,2,0,1,0,0,2,1,1,0,0,0,1,0,0,0,1,2,1,1,1,1,1,0,1,0,1,1,2,1,0,1,1,2,0,0,0,1,1,0,0,2,1,1,1,0,0,0,0,1,1,2,0,4,1,2,0,1,2,1,1,0,0,0,0,0,1,0,0,2,1,3,1,1,0,3,0,1,1,0,1,1,3,1,1,2,0,5,1,0,1,3,1,1,3,1,0,0,0,1,1,0,2,1,2,0,1,1,0,2,1,1,1,4,1,0,1,1,1,1,0,0,0,0,2,3,2,0,1,0,3,0,1,1,0,1,2,1,1,0,0,0,0,0,0,1,2,1,0,3,2,1,1,0,0,1,3,2,1,2,0,3,3,1,0,0,2,0,2,2,0,0,1,2,1,0,0,1,2,1,0,0,1,1,2,1,1,1,0,0,1,0,4,1,0,0,0,2,0,1,2,1,3,0,0,1,2,1,1,1,0,1,0,0,0,0,0,3,0,0,1,1,2,1,1,3,2,0,3,0,0,1,0,1,2,1,0,0,1,2,1,1,1,1,2,0,0,2,1,2,1,0,2,2,1,2,1,2,0,1,1,0,4,0,2,0,1,1,0,3,2,0,2,1,0,1,0,0,3,1,1,1,0,0,0,1,0,2,2,1,2,2,2,2,1,0,0,0,2,2,1,0,1,1,0,2,0,3,1,0,2,0,4,1,0,0,0,2,3,0,3,1,0,0,0,0,0,1,1,2,0,1,1,3,0,0,1,0,1,1,0,2,2,0,3,2,1,0,1,0,0,1,1,1,1,1,1,0,1,1,0,0,0,2,1,0,0,2,1,1,1,2,0,0,0,0,0,1,1,1,1,2,1,1,0,0,1,1,0,0,2,1,2,2,0,1,1,3,0,3,3,3,1,1,0,1,1,1,2,1,1,1,1,2,1,3,0,0,1,0,2,1,2,0,1,0,1,4,0,2,0,0,0,2,1,0,2,0,1,1,0,1,1,2,1,0,1,1,2,1,2,3,2,2,0,2,0,3,1,2,0,2,2,1,1,2,0,0,1,0,1,1,0,0,1,0,0,2,1,3,1,0,2,1,0,1,0,0,1,2,2,1,0,1,1,2,1,2,2,2,1,1,2,1,1,1,0,2,2,0,1,1,0,1,1,1,1,1,1,4,0,2,1,3,1,5,0,0,0,1,1,2,1,3,2,2,1,1,2,2,0,1,0,2,3,0,0,2,1,1,1,1,0,1,2,0,2,2,3,2,2,1,0,1,1,2,2,2,1,1,1,0,0,1,0,1,2,2,1,2,1,3,0,1,0,0,0,0,1,1,0,0,0,0,1,1,3,2,1,1,2,2,0,2,1,1,5,2,0,2,3,0,1,2,0,0,0,2,0,1,1,0,0,1,1,1,1,2,0,0,1,1,0,2,0,1,1,1,0,0,0,1,2,2,1,1,0,1,2,1,3,0,0,0,0,0,0,0,0,2,1,0,1,4,0,0,0,0,1,1,0,1,1,3,1,0,0,0,1,2,0,3,4,1,2,2,2,1,2,1,3,2,0,1,0,4,0,0,0,1,2,1,1,3,1,1,1,1,1,0,1,1,0,2,0,2,0,1,3,1,2,0,1,0,2,2,0,2,1,1,0,1,0,1,1,0,0,1,1,0,0,1,1,0,2,1,1,0,1,3,0,0,2,1,1,1,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,1,1,1,2,3,0,0,0,0,1,1,3,2,2,0,2,2,0,3,3,3,0,0,1,1,2,3,0,0,2,0,1,2,1,0,2,0,0,2,3,0,0,0,1,0,1,2,1,2,1,2,1,0,1,0,0,1,1,0,0,1,1,0,1,0,2,2,0,1,1,1,3,0,0,0,0,1,1,2,2,0,0,0,2,0,0,1,0,0,2,0,1,1,0,2,0,2,1,0,0,1,0,0,0,1,1,1,0,0,0,1,2,2,0,0,0,2,1,0,0,1,1,0,1,1,1,0,1,0,1,0,1,1,0,0,2,2,1,0,1,1,3,1,0,1,1,1,2,2,0,1,2,2,1,0,0,0,1,0,0,1,0,0,0,1,1,4,1,2,2,0,1,0,0,0,2,1,2,0,1,0,3,1,3,0,1,1,1,0,0,2,1,0,2,0,1,0,0,1,2,0,1,1,2,0,0,3,2,2,2,2,0,2,0,3,1,0,1,2,0,1,1,0,1,1,0,1,1,2,0,1,1,2,1,0,2,0,0,0,1,2,2,1,1,0,0,0,1,2,1,2,0,3,3,0,2,0,1,1,1,2,0,0,0,1,0,1,0,1,2,0,1,1,1,1,0,0,2,2,3,2,1,1,2,0,0,2,1,1,1,1,0,1,0,1,0,2,2,1,0,0,1,1,4,1,0,2,2,0,0,0,2,1,1,1,1,0,0,1,2,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,1,3,0,2,1,1,1,2,2,0,1,0,0,0,0,0,2,3,1,1,0,0,2,2,2,1,2,0,3,4,0,2,1,0,1,1,0,1,1,2,0,0,2,3,1,0,1,1,2,0,1,1,3,2,2,0,0,1,1,2,5,2,0,3,1,1,2,0,1,1,2,3,3,1,2,2,2,0,1,2,0,0,0,3,1,1,0,0,1,1,1,1,1,1,1,0,1,0,2,1,2,1,1,0,2,0,0,1,0,1,0,0,0,0,1,0,0,1,0,0,2,2,3,1,0,1,1,1,0,2,2,2,1,2,0,2,1,1,0,0,0,0,2,2,2,0,0,1,0,0,0,0,0,1,3,0,1,2,1,0,1,1,3,0,2,0,0,0,1,0,1,1,1,5,3,1,1,1,0,0,3,1,2,1,1,1,0,0,0,2,0,0,2,0,1,4,0,2,0,2,0,0,0,0,0,1,0,1,0,0,3,0,1,0,1,0,0,0,0,0,0,0,1,1,0,2,2,1,2,1,1,0,0,2,1,1,2,0,0,0,0,5,0,3,1,0,1,1,1,0,1,2,3,0,1,1,1,1,1,1,1,0,0,1,1,3,2,2,1,0,0,1,1,1,0,0,0,0,0,1,2,0,1,1,2,0,2,1,0,1,0,0,1,1,0,1,0,3,1,0,1,0,1,0,0,1,0,0,3,2,1,2,0,2,1,1,0,0,0,1,0,0,1,1,0,1,0,0,2,0,0,3,0,0,3,0,3,1,0,1,2,1,1,1,2,1,0,1,1,0,1,2,1,0,3,0,1,1,0,3,2,0,0,0,3,0,1,2,1,0,1,0,1,5,2,0,2,0,0,0,1,3,1,0,1,0,1,2,2,4,1,1,2,0,1,1,0,0,4,0,0,1,1,0,2,1,1,1,0,2,0,1,1,2,0,0,1,2,1,0,1,0,3,1,1,0,0,1,2,0,0,1,2,1,0,1,0,0,3,1,0,1,2,3,1,0,1,0,0,2,1,1,1,2,0,0,1,1,0,2,0,2,1,1,2,1,1,1,2,1,1,0,3,0,1,2,1,0,1,1,1,2,0,0,1,0,1,1,0,0,2,1,1,1,1,1,0,0,2,0,1,0,0,1,1,1,0,1,0,2,1,2,3,2,0,0,1,2,1,1,2,1,2,1,0,1,1,1,0,2,0]},{"counters":[2,2,0,2,1,1,0,0,0,1,1,1,1,2,1,1,0,0,0,1,0,1,1,0,2,2,2,2,1,0,1,1,1,1,2,0,0,1,1,0,1,0,0,2,0,0,2,2,1,1,0,0,0,2,1,1,1,3,2,0,1,0,0,1,2,1,0,1,1,0,2,2,3,2,0,1,2,1,1,0,0,0,3,1,0,1,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,2,1,0,1,3,0,3,0,0,1,0,0,1,0,1,1,0,0,1,2,0,1,1,1,1,0,1,2,1,2,1,0,0,0,0,0,0,1,2,1,1,1,1,1,0,0,0,0,1,1,0,1,4,1,3,2,1,2,1,1,0,0,2,2,0,1,1,2,2,0,2,1,1,1,0,0,0,0,1,1,1,2,0,2,2,1,0,1,1,2,2,0,0,0,0,0,2,1,1,1,0,0,2,0,3,1,0,1,1,1,1,2,2,1,0,1,2,0,0,0,0,1,1,0,1,1,2,2,0,2,0,2,2,0,2,2,0,1,0,0,1,1,1,0,0,0,1,1,2,2,1,1,3,1,2,2,0,1,1,2,0,0,2,0,0,3,0,2,0,2,1,0,1,2,0,1,0,0,1,0,2,1,0,0,0,2,0,3,1,2,1,0,0,1,0,0,3,2,1,0,1,0,3,3,1,0,0,1,1,2,1,0,0,1,0,1,0,0,5,1,0,1,0,3,1,0,0,3,1,0,0,0,1,2,1,2,1,2,0,1,0,1,1,4,0,1,0,1,3,1,0,0,0,0,2,0,1,1,0,0,1,0,2,2,0,0,1,1,0,1,0,0,0,0,2,1,0,1,0,1,0,0,0,1,3,2,0,0,0,1,0,0,1,3,1,4,1,3,1,3,1,0,4,0,0,1,0,2,0,2,1,2,0,2,1,1,1,0,1,1,1,2,1,0,2,3,1,0,2,1,1,0,0,0,1,1,2,0,1,1,0,0,1,2,1,1,1,0,4,1,0,1,1,1,0,1,2,1,0,0,1,2,0,2,1,1,1,0,2,0,1,1,0,1,0,1,3,0,0,0,0,0,0,1,1,0,2,0,0,1,1,0,1,0,2,2,0,0,2,1,1,3,1,0,2,1,1,0,0,2,1,1,0,0,4,2,1,0,1,1,2,1,1,2,1,4,2,1,0,0,2,1,0,1,2,0,1,2,0,0,1,0,0,0,1,0,0,1,1,3,0,3,1,1,3,0,0,1,1,2,0,2,3,1,0,2,3,2,0,0,0,0,0,2,1,1,1,2,0,2,2,1,0,1,0,1,1,2,2,0,2,2,0,0,1,0,0,2,0,1,0,1,0,0,2,0,3,0,1,1,2,2,1,1,0,3,1,3,1,2,0,0,1,2,1,1,0,1,2,0,4,0,1,1,1,2,0,1,1,0,0,0,1,4,1,0,1,1,0,0,1,1,1,1,2,1,1,1,2,1,0,1,1,0,1,0,0,1,2,1,1,3,0,0,1,2,2,1,2,0,0,0,1,1,0,1,0,0,1,0,1,2,0,0,2,1,0,1,1,2,2,1,0,1,1,1,1,0,1,1,3,0,1,0,1,2,0,2,1,0,1,1,1,1,0,2,2,3,1,2,4,1,0,0,0,1,0,1,3,2,2,1,2,1,1,1,0,0,0,1,1,2,0,0,2,0,2,1,1,0,1,6,1,0,0,0,1,1,1,0,0,2,1,0,3,0,1,1,0,3,3,0,4,1,1,0,3,2,1,1,4,1,1,2,1,3,1,0,0,1,2,0,0,1,3,2,0,2,3,3,0,1,2,1,2,2,4,1,1,0,1,0,0,0,1,1,2,1,2,1,3,1,2,0,2,2,3,2,1,0,1,1,0,1,1,0,0,2,1,2,0,2,1,2,2,0,1,0,0,1,0,5,2,0,0,1,0,1,1,2,0,2,0,0,0,1,1,0,0,1,1,2,0,0,0,0,2,0,0,1,1,1,0,2,0,1,1,0,2,2,2,1,0,0,0,1,0,0,0,2,2,3,1,0,2,0,2,1,0,0,1,2,2,0,0,0,4,0,1,0,1,0,0,3,1,1,0,0,1,0,1,1,2,0,1,0,3,0,0,0,1,0,1,1,1,1,1,1,3,0,2,0,0,1,0,2,1,2,1,0,1,1,0,0,2,1,2,0,0,2,2,1,1,1,2,0,0,2,2,1,0,1,0,2,0,1,3,1,2,0,1,0,1,1,2,1,1,3,0,1,0,0,2,0,1,0,0,0,2,0,0,0,2,0,1,1,2,1,1,0,0,1,1,3,1,5,0,0,5,1,0,1,3,2,1,3,0,1,0,1,3,0,0,2,0,1,0,1,1,1,0,0,0,1,3,1,1,1,4,3,0,1,2,1,1,2,0,1,0,1,0,1,1,2,2,3,1,1,1,0,0,0,0,3,1,1,2,1,1,0,1,3,1,2,1,2,2,1,0,3,2,0,1,1,1,1,1,1,0,0,0,2,1,0,1,0,1,0,0,1,1,0,0,2,1,0,0,0,1,0,3,0,1,1,1,1,0,0,1,2,2,0,3,1,0,1,0,1,1,0,1,0,1,0,2,3,1,0,0,3,4,0,0,2,1,1,2,4,1,2,0,0,5,0,2,0,1,1,0,0,0,2,0,1,0,3,2,1,0,2,0,1,1,0,0,1,0,2,0,0,1,2,1,1,5,1,2,1,0,2,0,1,3,1,1,1,0,0,0,2,0,1,1,2,0,0,1,1,2,1,3,0,2,1,2,0,0,2,0,3,1,2,1,2,0,0,0,1,1,0,0,2,0,0,0,0,2,1,0,0,0,1,1,0,2,2,0,2,0,2,1,0,3,1,1,1,1,2,1,0,0,1,2,0,1,1,0,1,1,1,0,0,1,1,0,2,0,0,1,1,2,1,0,1,1,2,1,0,0,0,0,3,0,3,2,1,2,0,0,2,1,1,1,1,2,0,2,2,2,1,2,1,0,1,1,1,0,1,0,0,2,0,0,2,3,2,1,1,4,1,1,1,0,0,3,3,0,2,1,1,2,2,1,0,1,0,0,1,2,0,0,0,0,1,1,1,2,1,0,2,2,0,5,1,4,1,1,1,1,2,1,2,0,3,1,0,1,1,0,1,2,0,2,1,1,2,0,1,1,1,1,0,2,0,0,1,1,0,2,0,0,2,1,2,0,0,2,1,0,1,1,4,0,1,0,1,0,0,2,1,1,1,2,2,1,1,1,1,1,0,2,1,1,1,0,0,1,1,0,0,2,0,0,1,0,0,1,2,1,1,0,1,2,0,2,1,6,1,1,2,2,1,2,3,1,0,2,1,1,1,1,1,5,1,4,1,1,1,3,0,0,0,0,1,2,2,0,1,0,3,0,1,0,0,0,1,0,1,0,2,0,0,2,2,1,1,1,1,3,0,3,0,0,0,0,0,1,1,3,2,0,0,0,3,2,0,0,0,1,2,0,1,0,1,0,0,2,0,0,3,0,0,2,2,0,0,2,2,2,3,1,1,0,2,2,0,0,1,1,0,0,1,1,0,0,1,0,1,1,2,0,0,0,0,1,0,0,0,2,1,0,0,0,2,1,0,0,1,0,3,1,2,0,0,0,1,1,1,1,0,0,1,1,2,3,2,2,1,0,2,1,2,1,1,1,1,0,0,4,1,2,0,1,0,1,0,0,1,2,1,1,1,1,0,0,0,2,1,1,1,2,2,0,0,1,2,0,0,2,2,2,0,1,1,1,0,0,3,0,2,0,0,0,2,1,2,2,2,0,1,1,2,1,0,1,1,0,3,1,3,2,1,2,0,0,1,1,0,1,0,1,1,2,1,0,0,2,1,1,3,1,1,0,2,2,1,3,0,0,1,1,0,1,1,1,0,2,1,0,2,0,2,2,1,1,0,0,2,0,0,2,0,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,0,0,2,1,0,0,3,0,1,3,0,0,3,1,0,1,0,0,0,2,0,2,1,2,1,2,0,0,0,2,0,4,2,2,2,1,0,2,0,0,1,2,1,0,1,1,3,2,1,2,1,0,1,2,0,0,1,2,1,1,3,0,0,0,0,1,0,1,0,1,0,0,1,0,3,0,0,1,2,3,1,0,1,0,2,0,0,0,2,2,0,1,0,0,3,0,0,1,1,2,1,1,2,2,0,1,1,3,2,1,0,0,0,2,1,2,1,1,2,1,0,3,0,3,0,0,0,0,0,2,0,0,1,1,0,1,1,1,0,0,0,3,0,2,2,2,0,0,0,0,1,1,0,0,1,1,1,1,0,1,5,3,2,1,3,0,0,0,1,0,2,1,0,1,2,2,1,0,2,1,0,1,0,2,0,2,1,1,0,2,1,0,1,1,1,1,1,0,2,0,0,0,0,4,0,2,0,1,0,2,1,2,1,3,1,2,1,2,1,0,1,0,0,1,1,0,2,2,1,2,0,3,0,0,0,1,0,0,0,0,0,1,1,1,2,1,0,2,0,1,1,1,3,2,1,1,1,1,2,0,2,2,2,1,0,0]},{"counters":[1,1,2,0,2,1,1,1,2,0,1,0,2,0,1,0,1,0,4,1,2,3,0,0,0,1,2,0,3,1,1,0,2,2,0,2,1,1,0,1,1,0,3,1,1,1,1,0,1,0,0,0,1,0,0,2,2,1,1,1,1,0,0,0,4,0,1,1,2,1,1,4,0,0,1,1,0,1,1,1,1,2,0,1,2,2,1,2,1,2,0,2,0,0,0,0,1,0,1,0,0,0,1,2,0,1,2,2,0,1,0,2,1,1,5,0,1,3,1,2,0,1,1,2,0,0,0,2,0,1,2,2,0,2,1,3,1,0,3,0,1,2,1,0,1,2,2,1,3,1,0,0,1,0,0,0,2,0,2,0,0,1,1,0,0,2,0,0,0,0,3,0,0,3,2,2,1,3,1,0,2,2,1,0,2,2,1,1,0,1,0,1,3,0,1,3,1,1,2,0,0,1,2,1,0,2,1,0,2,1,0,2,1,1,1,0,2,1,0,1,3,1,2,0,0,3,2,0,1,1,0,0,0,0,1,0,0,0,0,1,0,3,0,0,1,0,1,0,2,1,1,1,1,2,0,1,1,1,0,0,4,0,1,1,1,1,2,1,1,2,1,1,0,0,0,0,0,0,0,1,4,2,2,0,2,2,1,2,3,3,0,0,0,0,0,3,1,1,1,0,1,1,1,3,2,1,1,0,0,0,0,1,1,1,1,2,3,1,1,1,1,1,0,0,2,0,2,1,0,1,1,0,1,2,0,0,3,3,1,2,0,1,1,0,1,1,0,0,1,2,2,0,1,1,1,2,1,1,3,0,1,1,1,2,0,1,1,2,1,0,0,0,2,1,0,1,1,3,1,0,2,1,1,1,0,3,1,1,0,0,2,0,1,4,1,0,2,0,1,1,0,1,1,0,2,0,1,1,1,1,0,1,2,0,1,0,1,0,1,4,2,1,1,0,1,1,2,0,1,1,2,1,3,0,1,0,2,3,0,0,1,0,2,1,1,2,0,3,0,2,0,0,3,1,2,1,0,1,1,2,1,1,0,1,3,0,0,0,0,1,4,2,1,1,0,0,3,0,1,0,1,0,0,1,0,2,2,1,3,2,0,0,2,0,0,0,4,0,1,0,0,1,0,1,0,0,1,2,1,0,0,1,0,2,1,1,1,1,2,2,0,1,0,1,0,1,0,0,1,1,0,0,1,3,0,0,1,2,2,0,1,0,0,2,1,1,1,2,1,0,3,0,0,2,2,0,2,1,0,3,0,2,1,2,3,0,0,2,0,0,0,1,1,0,0,0,2,2,0,0,0,1,0,0,1,0,0,1,3,0,3,2,0,1,2,2,0,0,2,3,4,0,0,1,1,1,0,1,1,1,1,2,1,1,1,0,0,0,0,2,2,0,1,1,0,4,0,0,0,1,0,0,2,2,1,1,4,1,0,1,0,0,1,3,1,1,0,2,0,1,0,0,0,0,0,1,1,1,0,1,0,0,2,2,2,2,1,1,0,1,1,2,2,1,2,1,0,1,1,1,0,1,0,0,1,0,1,1,0,2,2,1,1,3,1,1,1,3,0,0,0,2,2,0,2,1,1,0,3,1,1,1,0,0,0,0,0,2,1,1,0,0,0,2,2,1,0,1,1,1,0,3,1,3,2,0,0,3,1,0,3,1,0,0,1,1,1,1,0,2,5,1,1,0,0,1,0,1,1,0,1,4,0,0,0,1,1,1,0,1,0,2,1,3,0,0,1,1,1,0,2,2,1,0,1,0,0,0,1,2,2,1,2,0,1,1,1,0,0,1,2,1,0,0,1,0,0,0,1,0,1,0,0,1,1,2,1,2,3,1,1,0,2,3,2,1,1,1,0,0,2,1,2,0,0,2,0,1,1,0,1,2,0,1,0,2,0,0,0,0,0,1,1,3,0,0,0,1,0,3,0,0,0,0,4,1,1,1,2,2,0,0,1,3,2,1,0,1,1,0,1,0,0,1,0,3,0,1,1,0,0,1,1,1,1,0,2,2,1,1,0,1,0,2,2,0,0,1,1,1,2,1,1,0,1,0,2,2,1,0,0,3,1,1,1,2,1,0,1,0,1,0,2,1,0,0,1,4,0,0,2,1,1,0,2,0,1,1,0,1,0,1,0,2,0,0,1,2,0,3,0,0,0,3,0,4,2,0,3,0,2,3,2,3,1,0,0,2,1,1,1,2,0,1,3,0,0,0,0,2,0,2,0,2,0,3,0,2,3,0,2,2,1,0,1,0,0,0,0,3,1,0,0,0,1,1,0,0,0,3,1,1,1,2,0,0,0,1,1,3,1,0,1,1,2,0,1,0,2,0,2,0,0,1,2,1,1,1,3,2,1,0,0,1,1,0,0,1,1,1,2,2,1,0,0,1,1,0,1,0,0,1,2,0,1,2,1,1,2,0,0,1,0,4,1,0,0,1,1,0,0,1,1,2,1,0,1,0,0,0,1,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,4,1,2,0,0,1,0,1,2,1,0,2,1,1,1,0,0,2,3,1,1,2,2,3,0,1,1,1,0,1,1,1,0,2,1,0,1,1,1,0,0,1,0,0,2,1,0,0,1,0,0,2,0,4,4,2,3,1,2,0,1,0,0,1,2,1,0,0,1,2,2,0,2,0,0,1,2,1,1,1,1,1,0,0,0,0,1,0,1,0,1,1,1,2,0,0,2,0,2,1,1,1,0,2,2,1,1,0,0,0,2,0,2,0,1,2,1,0,1,0,1,0,1,3,3,1,1,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,2,0,0,1,1,2,1,3,0,3,1,1,2,0,1,2,0,2,0,1,0,0,0,0,1,0,1,1,0,1,0,4,0,0,0,1,1,1,0,0,1,2,0,1,0,1,1,0,1,0,1,1,1,0,1,1,1,1,1,2,1,1,0,1,2,0,1,1,1,1,1,1,2,0,0,1,1,2,1,1,2,1,1,2,1,0,0,2,1,0,1,2,1,0,1,1,2,0,2,1,3,1,1,2,0,1,0,0,0,1,2,0,1,1,1,0,0,1,0,1,0,2,4,1,3,1,1,2,2,0,0,1,1,0,1,2,1,1,0,0,1,1,2,1,0,0,0,1,1,1,3,3,2,3,1,3,1,4,0,1,1,0,1,1,0,0,1,1,2,1,0,0,1,0,3,3,0,2,1,0,2,1,2,1,2,2,1,4,1,0,1,1,1,1,1,1,0,0,2,1,0,0,0,0,2,3,1,2,1,0,0,1,0,0,2,0,3,1,3,3,0,1,0,0,0,0,1,1,0,1,0,3,1,2,1,1,3,0,0,1,0,1,0,1,0,2,1,0,0,1,2,1,0,0,0,1,3,2,0,0,0,3,1,1,1,1,3,0,2,0,0,0,3,1,1,3,0,0,0,1,1,0,1,3,2,1,1,0,1,0,1,3,0,0,2,1,1,2,1,0,2,0,1,4,1,2,0,3,0,0,1,2,2,2,0,1,0,1,2,0,0,2,0,2,0,2,1,0,1,3,0,0,0,1,1,0,0,0,1,0,1,1,2,1,1,2,2,1,0,0,1,0,0,0,2,0,3,2,0,0,2,2,0,0,1,1,1,0,4,0,1,1,0,3,0,1,1,0,0,2,2,0,1,0,2,1,2,1,0,0,2,0,1,3,2,2,0,1,0,4,3,1,3,2,3,0,2,1,1,1,1,1,1,2,1,0,1,2,0,1,3,0,0,0,1,0,3,1,0,1,0,2,1,3,3,0,2,0,1,1,1,1,2,5,2,1,1,2,0,0,0,0,0,1,0,0,1,1,1,1,0,1,2,2,2,2,0,0,1,0,1,1,0,0,1,4,2,2,0,0,3,2,1,1,2,0,0,2,1,0,1,0,1,2,0,0,2,3,0,1,0,2,0,2,1,0,0,1,1,2,1,3,1,0,1,1,0,4,0,1,0,1,3,1,1,1,0,0,2,1,3,1,3,0,2,1,3,0,0,1,1,1,1,1,0,2,1,0,0,1,2,1,0,2,0,2,0,0,2,1,3,0,1,1,0,2,1,1,1,0,1,0,2,0,0,2,0,2,1,0,1,1,0,1,1,1,0,1,1,2,2,0,1,0,0,2,3,0,1,2,0,1,0,1,0,2,1,0,2,0,1,3,2,0,0,0,1,2,1,2,0,1,1,0,1,1,1,0,2,0,3,3,0,2,0,3,3,1,0,0,1,0,2,2,1,2,0,1,1,2,1,1,2,1,0,1,1,1,1,2,1,0,0,3,1,0,1,1,2,1,0,2,1,3,1,0,1,1,3,3,0,4,1,3,3,3,1,2,1,1,0,0,0,1,1,0,0,1,0,2,0,0,1,2,0,0,1,0,2,2,2,1,4,1,1,0,0,1,3,1,0,0,0,2,0,1,1,1,3,0,0,0,0,1,0,4,1,0,1,1,1,2,0,0,1,1,0,1,0,2,0,0,1,0,2,1,0,1,1,0,0,1,0,1,1,3,1,1,1,1,0,1,0,0,0,1,1,2,0,0,1,0,2,0,2,2,2,0,1]},{"counters":[0,1,0,2,0,0,1,0,0,1,1,1,0,3,2,2,1,0,2,1,3,4,1,1,1,1,1,2,2,3,0,2,1,0,1,0,1,0,0,2,0,3,0,0,0,0,0,2,1,2,3,1,1,2,2,4,2,1,0,1,2,0,0,2,0,2,1,0,0,1,0,0,1,1,0,0,1,1,0,1,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,1,0,0,4,2,0,1,2,0,1,0,2,0,3,1,0,0,2,3,0,0,1,1,1,5,1,1,1,3,0,1,1,0,1,2,2,0,1,0,0,3,0,2,2,1,1,1,2,2,0,1,0,2,2,0,0,1,1,1,1,2,0,1,1,1,3,0,1,3,1,2,1,1,0,3,3,1,0,3,0,2,0,1,0,1,2,0,0,0,4,0,1,4,0,0,1,0,1,2,3,1,1,1,1,1,1,2,1,1,0,0,0,0,2,0,0,3,0,1,1,0,3,1,3,2,0,2,1,2,1,1,1,2,0,1,1,2,2,1,1,1,1,0,0,2,1,1,1,0,1,3,0,0,1,1,1,0,0,0,1,1,1,2,4,2,0,0,0,0,3,0,0,2,0,1,2,1,3,5,1,1,2,2,1,0,1,2,1,1,0,0,0,2,2,0,0,1,2,1,0,0,1,2,1,1,0,4,0,1,3,1,2,0,0,0,0,0,0,0,3,1,0,0,3,0,1,2,0,0,2,0,1,0,0,0,2,2,0,0,1,1,0,2,0,1,1,2,0,1,2,1,2,0,0,0,1,2,1,1,1,0,1,0,1,0,1,0,0,2,1,1,0,0,2,2,2,1,2,0,1,1,2,1,0,0,0,0,1,2,0,1,1,1,2,0,0,0,1,1,0,0,0,0,2,1,0,2,0,0,1,1,0,0,0,1,1,0,0,1,1,3,0,0,0,0,1,3,1,0,0,0,0,1,0,1,1,0,1,3,0,2,3,1,0,0,1,0,2,1,0,0,2,2,2,0,0,2,6,0,1,4,1,3,1,2,2,2,1,0,0,0,3,1,0,0,0,2,1,0,0,2,2,0,1,0,1,1,0,1,1,1,3,0,0,0,0,1,2,1,2,0,2,0,2,3,0,1,1,1,0,2,1,1,3,0,0,1,0,1,1,1,1,2,2,1,0,1,0,5,2,1,1,1,0,1,0,1,2,1,0,0,2,0,0,2,2,0,0,2,0,0,0,0,2,0,0,1,2,1,0,2,1,0,1,0,0,0,0,1,2,0,1,0,2,0,1,1,1,1,2,0,1,0,1,1,1,1,1,1,1,0,1,1,1,0,0,0,3,2,2,1,1,0,1,0,1,0,0,0,0,2,3,0,3,1,1,2,0,1,0,0,2,1,1,3,1,2,0,0,1,0,1,2,3,1,2,0,2,2,0,1,1,2,1,3,1,1,1,0,0,2,2,2,0,0,0,2,0,2,1,1,1,1,0,2,0,1,0,1,2,1,1,0,1,0,1,0,1,1,4,1,0,1,1,2,1,0,2,2,1,1,2,0,2,0,2,1,1,1,0,0,0,0,0,0,0,1,2,3,0,1,0,2,0,4,1,0,3,0,1,2,0,0,2,3,0,0,1,0,1,1,1,1,1,1,3,1,2,0,0,0,0,0,1,0,2,1,2,2,0,2,0,1,0,0,4,1,4,0,0,3,3,1,0,2,2,2,0,2,1,1,1,0,1,0,2,0,1,1,2,2,0,3,1,4,0,2,0,0,0,2,1,0,1,0,0,2,0,0,1,1,1,0,1,0,0,1,2,3,2,0,0,0,1,0,0,1,0,1,0,2,1,0,2,0,1,0,2,2,1,0,2,0,3,0,1,2,0,0,2,0,4,1,1,1,0,1,0,1,1,1,0,1,2,0,0,3,0,2,0,1,0,1,2,1,0,1,0,1,2,1,2,0,0,0,0,3,3,2,2,4,0,0,1,0,0,1,1,1,0,2,2,3,1,0,1,1,0,0,3,1,1,0,1,1,0,1,2,1,2,2,1,3,0,1,0,0,0,1,0,4,0,3,0,2,3,1,2,0,1,0,0,0,0,3,1,1,1,3,0,1,0,2,1,0,0,0,0,2,1,0,2,2,0,0,1,1,1,1,1,1,1,0,1,2,2,2,1,1,2,0,3,2,0,1,0,1,0,4,1,1,1,3,0,3,0,2,1,3,1,1,0,0,0,1,0,2,0,2,1,2,1,1,1,0,3,0,0,0,1,1,2,0,1,1,0,2,0,0,1,1,3,1,0,3,0,3,0,1,1,0,1,3,0,0,2,0,1,0,0,0,0,1,0,1,0,2,0,1,1,3,1,1,1,0,2,2,1,2,2,1,2,2,0,1,2,2,1,0,3,1,2,0,1,1,1,1,1,0,2,0,2,1,1,0,0,2,1,2,0,0,1,2,0,3,0,1,1,1,2,0,1,0,1,0,2,1,0,0,0,0,3,1,1,1,0,2,0,1,0,0,0,2,5,1,1,1,2,1,1,1,2,1,1,0,1,1,1,0,2,0,2,0,1,0,2,4,0,0,4,0,1,0,1,2,2,1,2,0,1,1,2,0,1,0,1,1,0,0,2,0,1,1,0,1,0,1,4,1,1,1,1,2,0,2,1,2,1,2,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,1,2,3,1,1,0,1,3,2,1,2,1,0,1,0,1,1,3,1,0,1,1,1,1,1,0,0,0,1,0,3,0,2,0,0,0,3,1,1,0,2,0,2,1,0,1,1,1,1,0,2,1,1,1,0,0,2,1,0,1,1,3,3,2,1,0,1,1,0,2,0,0,1,1,0,0,1,1,0,0,0,0,1,1,2,0,0,1,0,0,3,0,2,1,0,1,1,2,1,1,0,0,0,1,1,2,2,2,0,1,2,1,2,1,3,0,0,2,1,0,0,1,0,2,1,1,3,0,1,2,0,1,1,1,1,1,0,0,4,1,0,1,0,0,1,1,1,1,2,0,2,1,0,2,4,0,0,1,1,0,0,1,0,0,3,3,1,0,0,0,0,1,2,0,0,0,2,2,3,2,0,0,1,0,1,2,0,1,1,2,1,3,3,0,1,0,0,0,0,0,2,2,2,2,3,2,1,1,1,2,4,0,3,2,1,1,0,1,1,3,1,3,1,1,0,1,0,0,1,1,0,1,0,1,3,1,0,1,2,1,1,4,1,0,0,4,1,0,0,0,1,0,1,0,2,1,2,2,0,1,1,0,0,1,1,0,1,2,0,0,1,1,0,0,0,1,3,0,1,1,2,1,3,3,3,1,1,0,0,1,1,0,1,0,2,1,1,0,0,0,0,2,1,0,1,2,0,0,1,2,1,1,2,0,1,0,0,0,1,0,0,1,0,0,0,1,2,1,1,2,1,0,2,0,1,1,2,1,2,0,1,3,2,1,0,2,3,1,0,1,1,3,2,2,1,1,0,1,2,1,1,2,1,1,1,1,1,0,1,1,1,0,1,0,2,1,3,2,0,0,0,0,0,1,1,0,1,3,0,1,0,0,2,2,1,0,1,3,2,0,0,1,1,1,1,1,3,1,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,1,1,1,2,1,1,3,1,3,1,1,1,2,1,0,1,0,2,2,1,0,0,0,0,1,0,3,1,3,0,0,4,1,1,0,1,2,0,2,1,1,2,1,1,0,1,4,0,0,1,0,0,1,3,3,1,3,0,0,3,3,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,1,0,1,2,5,2,2,1,0,1,2,1,0,2,1,1,0,2,0,2,2,2,0,0,1,0,1,0,2,0,0,1,1,0,0,1,0,0,1,3,0,1,2,1,1,1,0,0,0,1,0,0,1,1,0,1,0,3,1,1,0,0,2,1,2,1,2,1,1,0,1,0,0,0,3,0,1,1,1,1,1,1,1,0,2,0,1,0,1,0,2,1,1,2,1,0,0,1,1,3,2,1,5,1,0,2,1,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,1,2,0,2,2,0,1,1,0,2,2,1,0,1,3,1,3,0,0,1,0,1,1,1,0,2,0,1,0,1,0,1,2,2,1,1,0,0,0,2,1,0,3,0,0,2,1,1,1,0,0,4,1,1,0,2,3,0,1,1,2,1,1,2,1,0,3,0,2,1,1,2,1,1,2,1,0,1,2,1,1,2,0,2,1,3,0,2,0,0,0,3,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,2,0,2,0,2,0,0,0,0,0,0,3,1,0,1,2,1,0,1,0,0,0,1,4,1,2,0,0,1,2,0,2,0,1,3,2,0,0,1,0,2,1,1,0,1,1,0,1,1,1,0,1,0,0,1,0,2,0,0,3,3,2,0,2,2,1,1,1,0,1,0,1,0,1,0,1,0,2,2,2,0,0,0,0,0,0,1,2,0,1,2,0,0,1,1,0,1,1,2,0,1,1]},{"counters":[0,2,1,0,2,2,0,2,1,2,0,3,0,2,1,2,2,0,3,1,0,0,1,3,0,3,0,0,0,0,1,1,1,5,1,1,1,3,0,1,0,0,0,1,3,0,1,1,2,2,1,1,1,1,3,0,2,2,1,1,0,0,1,0,2,1,1,1,1,0,2,0,1,1,2,0,1,1,4,2,0,2,2,2,1,1,0,1,0,3,1,2,0,1,0,2,0,0,3,0,1,0,2,1,1,0,0,0,2,2,1,1,1,2,1,1,2,0,4,1,0,2,0,1,1,0,1,1,1,0,1,0,0,0,0,0,2,3,1,1,0,1,0,1,1,2,1,1,1,0,2,3,1,0,1,1,2,1,2,1,0,1,3,1,1,1,1,1,0,1,2,1,0,2,1,0,0,1,1,2,1,1,2,1,0,1,3,0,1,0,1,1,2,0,2,2,3,2,3,3,1,0,2,2,2,0,1,2,0,0,0,1,2,0,0,2,0,3,3,2,2,2,3,0,0,0,0,2,2,0,0,2,1,0,0,0,0,1,2,1,1,1,2,1,0,2,2,1,2,1,1,0,2,1,1,0,1,2,0,1,0,1,2,0,1,1,0,0,1,1,0,1,2,2,1,3,0,1,4,0,1,1,1,0,1,1,1,2,1,0,3,0,1,0,1,1,0,0,2,0,1,1,3,1,1,1,3,0,2,1,1,1,2,3,1,1,1,0,0,0,1,2,0,1,0,1,0,2,1,0,0,2,1,0,1,0,0,1,2,3,2,0,0,0,5,1,1,2,1,1,1,2,1,1,1,0,0,2,3,0,0,0,1,0,1,0,0,1,2,0,2,0,4,2,0,1,0,1,2,0,0,0,0,0,0,1,1,2,2,2,1,2,1,0,1,0,1,0,0,0,1,0,0,2,1,0,1,0,3,0,1,1,0,1,0,1,0,2,2,3,1,3,1,0,0,1,2,0,0,1,1,0,0,2,0,0,1,2,1,2,0,0,0,1,1,4,0,3,0,2,2,2,0,3,1,1,0,2,2,3,1,1,1,1,0,1,2,0,2,0,1,0,0,0,0,1,1,3,1,2,1,1,2,1,2,2,1,3,1,1,2,3,0,1,0,3,1,1,3,2,1,1,2,0,3,0,1,1,0,3,0,2,2,3,3,0,2,2,0,0,0,2,1,0,3,1,1,0,3,2,0,0,1,1,1,0,3,0,2,1,3,1,3,0,2,0,3,1,0,1,0,1,0,4,2,1,2,0,1,0,1,1,1,0,3,1,1,1,1,1,1,1,1,0,1,2,1,0,1,1,2,0,1,0,0,1,2,0,1,1,1,0,1,1,0,1,0,2,1,0,1,1,2,0,3,1,1,0,1,1,1,0,0,2,0,0,0,1,1,0,2,3,1,1,1,1,0,2,2,2,0,0,2,0,0,0,1,0,0,1,1,0,0,4,1,2,1,1,0,0,1,0,1,0,0,3,0,3,1,0,1,1,3,2,0,1,2,1,1,1,1,0,0,1,0,3,2,2,0,1,1,1,0,0,1,0,0,1,2,0,2,1,1,2,1,0,1,1,0,3,1,1,1,0,1,1,1,1,1,3,1,1,0,0,2,0,1,2,2,1,1,0,1,0,0,1,1,1,0,2,1,0,0,1,1,1,0,3,0,0,1,1,2,3,1,1,0,1,0,1,1,1,2,1,1,0,1,0,2,0,1,1,1,0,0,2,3,2,1,1,0,1,2,1,0,1,1,0,0,1,1,0,1,1,2,0,1,0,0,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,1,0,1,1,2,0,1,1,1,1,0,2,0,1,1,1,0,1,0,0,0,1,2,0,1,1,1,1,1,1,0,1,1,1,1,1,1,3,2,2,4,0,0,0,0,1,2,0,2,2,3,2,0,2,0,0,1,3,2,2,1,2,0,0,1,0,0,0,0,1,3,1,2,1,0,1,1,2,3,1,0,0,2,2,3,1,2,3,0,0,0,0,2,2,2,1,2,1,2,1,2,2,0,1,1,2,2,0,3,2,0,2,2,0,2,0,4,0,1,0,1,1,0,1,1,4,1,2,1,1,0,0,1,0,2,1,0,1,0,0,1,2,0,2,0,0,2,2,0,1,0,1,1,1,0,1,1,0,0,1,2,1,0,0,1,0,1,1,3,2,3,2,1,0,1,0,2,0,0,1,4,2,4,0,0,0,0,2,0,0,0,0,0,2,0,1,0,0,3,0,1,0,1,0,1,1,1,0,1,0,0,1,4,1,1,1,2,1,1,0,2,2,0,0,0,1,1,0,2,2,2,1,0,1,0,1,0,0,0,1,0,0,3,0,1,3,3,1,3,0,0,0,0,0,0,0,2,1,2,1,1,0,0,2,5,0,1,3,2,1,2,0,1,1,1,1,0,5,2,0,1,1,1,0,0,1,0,1,1,0,0,0,0,0,0,2,3,1,1,1,3,1,1,2,4,2,1,2,0,0,1,1,1,0,1,0,1,2,2,1,2,1,2,0,0,0,1,0,1,0,1,1,1,0,1,1,0,1,1,0,1,0,1,1,2,1,1,4,1,2,2,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,0,0,4,0,2,2,2,0,1,2,1,0,0,2,0,0,1,1,3,0,1,1,1,0,0,0,1,2,1,0,2,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,2,0,4,5,0,0,0,0,1,1,2,0,0,0,2,1,1,1,1,0,0,3,2,1,1,1,2,1,2,0,1,1,2,2,1,0,0,0,2,0,0,1,2,1,0,2,0,2,0,0,2,3,1,0,0,2,0,0,1,0,3,1,0,1,2,0,1,1,2,0,2,2,1,0,1,0,0,0,0,0,0,0,1,1,2,0,1,2,0,1,1,2,2,0,2,1,0,1,2,3,1,1,0,3,1,3,3,1,1,1,1,1,1,1,1,0,2,2,1,0,3,0,0,1,0,2,0,1,0,0,2,2,0,0,1,0,0,1,0,1,0,0,2,0,0,3,1,4,0,2,0,2,0,0,2,0,1,1,0,0,0,1,2,2,1,2,2,1,2,0,1,2,1,3,2,0,0,2,2,1,0,1,1,1,1,1,1,0,4,2,1,2,2,0,1,4,0,0,1,2,0,0,0,1,0,0,1,1,1,0,0,1,1,1,0,1,0,0,1,2,1,0,3,1,1,0,1,1,1,3,0,1,0,1,1,0,3,1,1,2,0,0,1,1,2,3,0,2,2,2,0,1,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,0,3,1,1,1,0,2,1,0,1,0,1,2,1,1,0,2,2,0,1,0,0,2,0,1,1,1,2,1,0,3,3,1,0,0,1,0,0,4,0,0,1,2,3,2,0,1,1,2,1,2,1,0,2,0,0,1,0,1,0,1,0,2,0,0,2,1,0,1,1,0,0,1,0,0,1,0,0,2,1,0,3,2,2,3,0,1,0,0,0,3,0,1,2,2,0,4,1,0,1,2,0,0,1,2,0,0,2,0,1,0,1,0,2,1,4,1,1,0,1,0,0,1,2,0,0,0,0,3,1,4,1,0,2,0,0,1,2,3,0,0,1,1,0,1,2,0,1,2,0,2,1,1,0,2,2,2,0,1,2,1,0,2,3,0,0,1,1,2,1,1,1,0,0,2,0,1,1,0,0,2,2,0,0,2,1,3,0,1,0,0,1,1,0,0,0,1,2,0,0,0,0,0,0,1,0,0,0,1,2,1,0,0,1,1,1,2,1,2,0,3,0,2,1,0,1,0,1,1,1,2,1,0,0,0,1,0,0,1,1,1,0,2,1,4,2,0,1,1,2,0,0,1,1,0,0,0,3,0,1,2,1,1,0,0,0,0,1,1,2,0,2,1,0,2,3,1,0,1,0,0,3,0,2,0,0,2,0,0,0,2,1,0,3,0,2,0,0,0,0,1,2,1,1,5,0,0,2,3,1,0,2,0,3,0,1,1,1,1,1,1,1,0,0,2,1,0,1,1,1,1,3,2,0,0,2,0,0,1,3,0,1,1,0,1,2,0,0,3,1,0,0,1,2,0,0,0,3,0,1,1,0,0,1,0,0,0,0,0,0,1,1,3,0,0,0,1,0,0,1,1,1,0,0,0,0,1,1,0,4,1,1,1,1,0,1,3,0,0,1,0,3,0,0,1,0,0,3,0,2,2,1,4,1,2,1,1,1,1,0,0,1,1,1,1,3,2,0,0,0,0,4,1,0,0,3,1,1,2,0,0,0,0,1,2,0,1,1,1,1,2,1,0,0,0,0,1,0,1,1,0,3,0,0,1,0,1,1,4,0,1,2,0,1,0,1,1,5,0,1,2,0,0,0,2,0,0,0,0,1,2,1,2,1,0,2,1,0,1,0,1,2,1,2,0,1,2,1,0,1,0,1,1,2,1,0,0,0,1,1,0,0,1,0,2,0,1,1,3,0,0,1,0,0,1,1,2,2,0,0,0,0,2,0,3,0,1,1,2,0,1,0,1,1,1,1,1,0,2]}]},"null_count":0,"last_update_version":397952040400322560},"ui":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDQzOTY0NzA=","upper_bound":"LTIxNDE2MDkyNDM=","repeats":1},{"count":16,"lower_bound":"LTIxNDAwMzI4NzU=","upper_bound":"LTIxMzUyMDAyMDY=","repeats":1},{"count":24,"lower_bound":"LTIxMzI5MDQ2OTY=","upper_bound":"LTIxMjk1NDk1NzA=","repeats":1},{"count":32,"lower_bound":"LTIxMjY2OTU1NzU=","upper_bound":"LTIxMTc2NDc3Mzg=","repeats":1},{"count":40,"lower_bound":"LTIxMTY1NTM1MTA=","upper_bound":"LTIxMDk4NDcwNzg=","repeats":1},{"count":48,"lower_bound":"LTIxMDM0MTI3ODA=","upper_bound":"LTIwNzUwNjkyMjY=","repeats":1},{"count":56,"lower_bound":"LTIwNzM1NjczNzg=","upper_bound":"LTIwNjk3Mjk5Nzk=","repeats":1},{"count":64,"lower_bound":"LTIwNjA1NzkyNjc=","upper_bound":"LTIwNTEwNjI2NzE=","repeats":1},{"count":72,"lower_bound":"LTIwNDI0MzIwMzE=","upper_bound":"LTIwMzQyNDIwMDg=","repeats":1},{"count":80,"lower_bound":"LTIwMzMyMjExNDQ=","upper_bound":"LTIwMjAwNTcyODk=","repeats":1},{"count":88,"lower_bound":"LTIwMTg0MDE2MjM=","upper_bound":"LTIwMDg3MjI3OTQ=","repeats":1},{"count":96,"lower_bound":"LTIwMDcxMzYwOTg=","upper_bound":"LTE5ODM3MzMzOTQ=","repeats":1},{"count":104,"lower_bound":"LTE5NjQwMDU1MTc=","upper_bound":"LTE5NTI2NTQ0ODg=","repeats":1},{"count":112,"lower_bound":"LTE5NDkzNDY1NDU=","upper_bound":"LTE5MzgwNzcwMjg=","repeats":1},{"count":120,"lower_bound":"LTE5MzY1NzUwODU=","upper_bound":"LTE5Mjk3NzU1MTU=","repeats":1},{"count":128,"lower_bound":"LTE5MjIxOTY4NDk=","upper_bound":"LTE5MTEzMDAwMDk=","repeats":1},{"count":136,"lower_bound":"LTE5MDU4MjA4OTg=","upper_bound":"LTE4ODE0ODU1Mzk=","repeats":1},{"count":144,"lower_bound":"LTE4ODA3MDE5NzQ=","upper_bound":"LTE4NzI0Nzc1NTU=","repeats":1},{"count":152,"lower_bound":"LTE4NTIxODk2NzE=","upper_bound":"LTE4NDMxNTE5MTU=","repeats":1},{"count":160,"lower_bound":"LTE4Mzc4NTE4MTg=","upper_bound":"LTE4MzE4MzEyMzY=","repeats":1},{"count":168,"lower_bound":"LTE4MjMwNDY0MzM=","upper_bound":"LTE4MTM4MTc3MzQ=","repeats":1},{"count":176,"lower_bound":"LTE4MDU4Mjk0NDc=","upper_bound":"LTE4MDA5NzY0MzY=","repeats":1},{"count":184,"lower_bound":"LTE3OTM5Njg4MDc=","upper_bound":"LTE3ODMzNzY0Nzc=","repeats":1},{"count":192,"lower_bound":"LTE3NzkzMDY3Nzk=","upper_bound":"LTE3NTM4MjU4Njk=","repeats":1},{"count":200,"lower_bound":"LTE3NDY3MTA1NjQ=","upper_bound":"LTE3Mzk2OTUxODM=","repeats":1},{"count":208,"lower_bound":"LTE3MzQwNzQ4NDU=","upper_bound":"LTE3MDc0Nzg0NjM=","repeats":1},{"count":216,"lower_bound":"LTE3MDI3MTcxNDY=","upper_bound":"LTE2OTE1OTQwMjE=","repeats":1},{"count":224,"lower_bound":"LTE2OTE1MjEzMzc=","upper_bound":"LTE2ODE4ODQ2MjE=","repeats":1},{"count":232,"lower_bound":"LTE2NzIxNTI2OTY=","upper_bound":"LTE2NjY0Mjc2MjU=","repeats":1},{"count":240,"lower_bound":"LTE2NTk3OTkyODQ=","upper_bound":"LTE2NTA5MDExMDM=","repeats":1},{"count":248,"lower_bound":"LTE2NDc4OTAyNDk=","upper_bound":"LTE2MjM1NzIyMzA=","repeats":1},{"count":256,"lower_bound":"LTE2MTM5MTA4ODQ=","upper_bound":"LTE1ODg4OTMwMzU=","repeats":1},{"count":264,"lower_bound":"LTE1ODU4OTcwMjM=","upper_bound":"LTE1Nzg2MDg0NjQ=","repeats":1},{"count":272,"lower_bound":"LTE1NzgwNjY4MDE=","upper_bound":"LTE1NTA1NTc3NzQ=","repeats":1},{"count":280,"lower_bound":"LTE1NDQ5OTEyOTA=","upper_bound":"LTE1MjIxNDg3OTQ=","repeats":1},{"count":288,"lower_bound":"LTE1MjEyOTIxNDM=","upper_bound":"LTE1MDUxMzMwNzA=","repeats":1},{"count":296,"lower_bound":"LTE1MDAyODA4NTA=","upper_bound":"LTE0ODk0NDIyNzA=","repeats":1},{"count":304,"lower_bound":"LTE0ODgwMDY5NTU=","upper_bound":"LTE0ODAzMzQzMTQ=","repeats":1},{"count":312,"lower_bound":"LTE0NzYxMTM0MzY=","upper_bound":"LTE0NzMzMTcwODc=","repeats":1},{"count":320,"lower_bound":"LTE0NzE3OTg0OTg=","upper_bound":"LTE0NTE1MjA4MjE=","repeats":1},{"count":328,"lower_bound":"LTE0NDcyNjAxMTk=","upper_bound":"LTE0MjQxOTEyMjk=","repeats":1},{"count":336,"lower_bound":"LTE0MjM4MTgzMTg=","upper_bound":"LTE0MTY0NTI0NTU=","repeats":1},{"count":344,"lower_bound":"LTE0MTQwNzQ2NTk=","upper_bound":"LTE0MTA2NjU0NTU=","repeats":1},{"count":352,"lower_bound":"LTE0MDM3ODc1MDU=","upper_bound":"LTE0MDExMjk4MjA=","repeats":1},{"count":360,"lower_bound":"LTEzOTAzMDAwNTA=","upper_bound":"LTEzODg4ODgzMjM=","repeats":1},{"count":368,"lower_bound":"LTEzODcyMDg0Mzk=","upper_bound":"LTEzMzY1MzI3Nzc=","repeats":1},{"count":376,"lower_bound":"LTEzMzI0NTE0NDE=","upper_bound":"LTEzMjEyMzY1MTg=","repeats":1},{"count":384,"lower_bound":"LTEzMjA0ODk3MzM=","upper_bound":"LTEzMTY3MTU0NjA=","repeats":1},{"count":392,"lower_bound":"LTEzMTI4OTIwMjk=","upper_bound":"LTEzMDI3Mjg4OTM=","repeats":1},{"count":400,"lower_bound":"LTEzMDE5MTY4MDE=","upper_bound":"LTEyODUxMjIzMDg=","repeats":1},{"count":408,"lower_bound":"LTEyODQ5MDYxMDI=","upper_bound":"LTEyNzg2MTQ4Mzc=","repeats":1},{"count":416,"lower_bound":"LTEyNjY0MDU3MDI=","upper_bound":"LTEyNTE4MTI3NDQ=","repeats":1},{"count":424,"lower_bound":"LTEyNTE1NDExNjM=","upper_bound":"LTEyMzAwNTU2MTY=","repeats":1},{"count":432,"lower_bound":"LTEyMjY1NTI3ODU=","upper_bound":"LTEyMDUxNDQ4NzM=","repeats":1},{"count":440,"lower_bound":"LTEyMDE5NTkxNTg=","upper_bound":"LTExOTgwOTY5NTQ=","repeats":1},{"count":448,"lower_bound":"LTExODI1MDg0Nzg=","upper_bound":"LTExNzUyNzc1NTU=","repeats":1},{"count":456,"lower_bound":"LTExNzE1MTI1Nzk=","upper_bound":"LTExNTY3ODA3NTM=","repeats":1},{"count":464,"lower_bound":"LTExNTM4NzMyODg=","upper_bound":"LTExNDM3ODMwNjE=","repeats":1},{"count":472,"lower_bound":"LTExMzY2OTk3MDU=","upper_bound":"LTExMjk5MzI3MDE=","repeats":1},{"count":480,"lower_bound":"LTExMjU0Mjg2NDg=","upper_bound":"LTExMjA3NDEzNTI=","repeats":1},{"count":488,"lower_bound":"LTExMTc0NzkwOTM=","upper_bound":"LTExMDg4MzY5NTc=","repeats":1},{"count":496,"lower_bound":"LTExMDgzMDE0MzQ=","upper_bound":"LTEwOTkwNDUwMzQ=","repeats":1},{"count":504,"lower_bound":"LTEwOTg3OTYzMzY=","upper_bound":"LTEwOTM0MjQ0NzU=","repeats":1},{"count":512,"lower_bound":"LTEwOTI0NjgyNTc=","upper_bound":"LTEwODMzNDU3MzY=","repeats":1},{"count":520,"lower_bound":"LTEwNzQ1NzgzMDk=","upper_bound":"LTEwNjI4ODA5ODA=","repeats":1},{"count":528,"lower_bound":"LTEwNjAxOTYyMTI=","upper_bound":"LTEwNDk5MDYwOTk=","repeats":1},{"count":536,"lower_bound":"LTEwNDQxMTA4ODA=","upper_bound":"LTEwMzE1MDA3MDE=","repeats":1},{"count":544,"lower_bound":"LTEwMTU1NTA5ODc=","upper_bound":"LTEwMDI2MDA3OTk=","repeats":1},{"count":552,"lower_bound":"LTk5NzExODY3NA==","upper_bound":"LTk3MjA5MDk3NA==","repeats":1},{"count":560,"lower_bound":"LTk3MTU4NDkzNg==","upper_bound":"LTk2NjY5ODA5OQ==","repeats":1},{"count":568,"lower_bound":"LTk2MzYyNTQ4OQ==","upper_bound":"LTk1ODAwNDk2Nw==","repeats":1},{"count":576,"lower_bound":"LTk1MzA0MTI0Mg==","upper_bound":"LTk0NTM1OTUzMA==","repeats":1},{"count":584,"lower_bound":"LTk0NDYzMTgzMw==","upper_bound":"LTkyMDM3NDAyMA==","repeats":1},{"count":592,"lower_bound":"LTkxODIwMTgzNA==","upper_bound":"LTg4NTkxMjE1NA==","repeats":1},{"count":600,"lower_bound":"LTg4MDA1NDU4NA==","upper_bound":"LTg3MTEyNTMwNw==","repeats":1},{"count":608,"lower_bound":"LTg2OTI0OTcyNA==","upper_bound":"LTg1ODU2OTg4OA==","repeats":1},{"count":616,"lower_bound":"LTg1NzIwOTI2OA==","upper_bound":"LTc5NzI1NDU5Nw==","repeats":1},{"count":624,"lower_bound":"LTc5MzQ1MjczMA==","upper_bound":"LTc3NzQyOTYzMg==","repeats":1},{"count":632,"lower_bound":"LTc3NTE1NzY4OQ==","upper_bound":"LTc2MzI0Mjg5Mg==","repeats":1},{"count":640,"lower_bound":"LTc1NDE3Njc4NA==","upper_bound":"LTczMjUwNjEzNw==","repeats":1},{"count":648,"lower_bound":"LTcyNjgxMDI5OQ==","upper_bound":"LTcwNDEzODE1NQ==","repeats":1},{"count":656,"lower_bound":"LTcwMzkzNTM5NQ==","upper_bound":"LTY5NTY0Njc0Nw==","repeats":1},{"count":664,"lower_bound":"LTY5MzQzNDgxMQ==","upper_bound":"LTY3MTQ5OTAwMA==","repeats":1},{"count":672,"lower_bound":"LTY2OTU2OTY1OA==","upper_bound":"LTY0ODQ3OTI1Mw==","repeats":1},{"count":680,"lower_bound":"LTY0NTQ3Mzg4MA==","upper_bound":"LTYzNDQ3MzU1OQ==","repeats":1},{"count":688,"lower_bound":"LTYzMjg0MTQ2Ng==","upper_bound":"LTYyMDcxMjIxMQ==","repeats":1},{"count":696,"lower_bound":"LTYwMjQ4MzM2Mw==","upper_bound":"LTU4MzA4NzY1OA==","repeats":1},{"count":704,"lower_bound":"LTU4MDYwMzY1Nw==","upper_bound":"LTU2MTUyNjI0NA==","repeats":1},{"count":712,"lower_bound":"LTU2MTEyNzA2NQ==","upper_bound":"LTU2MDAzMzc5OQ==","repeats":1},{"count":720,"lower_bound":"LTU1OTMyMDkyNg==","upper_bound":"LTU0ODU2MDA0MA==","repeats":1},{"count":728,"lower_bound":"LTU0NzkwMzY2NQ==","upper_bound":"LTUzNzU3ODU4NQ==","repeats":1},{"count":736,"lower_bound":"LTUzMDE1MDA4MA==","upper_bound":"LTUxNzk3NzQ0Ng==","repeats":1},{"count":744,"lower_bound":"LTUwNDg0NDY3Ng==","upper_bound":"LTQ4ODMzMzI3NA==","repeats":1},{"count":752,"lower_bound":"LTQ3ODgxNDg5Nw==","upper_bound":"LTQ1MjAyMTM0NA==","repeats":1},{"count":760,"lower_bound":"LTQ1MTUyOTUyNA==","upper_bound":"LTQzNzkzMjE3Mg==","repeats":1},{"count":768,"lower_bound":"LTQyMzkyMDMxMg==","upper_bound":"LTQxMzkzNDM3MQ==","repeats":1},{"count":776,"lower_bound":"LTQwMzQ2MjE5MQ==","upper_bound":"LTM5ODg1MjE4Nw==","repeats":1},{"count":784,"lower_bound":"LTM5NTg4NDM4Mw==","upper_bound":"LTM4NzQ2ODI0Mw==","repeats":1},{"count":792,"lower_bound":"LTM4NDU5NTg4OA==","upper_bound":"LTM2NjY2NjgxMw==","repeats":1},{"count":800,"lower_bound":"LTM2MzUxNDUwNA==","upper_bound":"LTM1NTAzNjkyMQ==","repeats":1},{"count":808,"lower_bound":"LTM1NDAyMjQ2Nw==","upper_bound":"LTMyODUwMTMwMg==","repeats":1},{"count":816,"lower_bound":"LTMyNDA5OTIwNA==","upper_bound":"LTMwOTQ3Mzc0OQ==","repeats":1},{"count":824,"lower_bound":"LTMwNzIzMjEwNg==","upper_bound":"LTMwMTQ3ODYyMw==","repeats":1},{"count":832,"lower_bound":"LTMwMTQ1OTIxMA==","upper_bound":"LTI4ODA4NTUxOA==","repeats":1},{"count":840,"lower_bound":"LTI4MzYwNDk5Mw==","upper_bound":"LTI3MzQxNTgxOQ==","repeats":1},{"count":848,"lower_bound":"LTI3MjI5NDcwOQ==","upper_bound":"LTI2NDg0NzY5Nw==","repeats":1},{"count":856,"lower_bound":"LTI2MTUxMjQ1MA==","upper_bound":"LTI1MDk1NTU0NQ==","repeats":1},{"count":864,"lower_bound":"LTIzODc1NTA1NQ==","upper_bound":"LTIyNzM4NzMwMg==","repeats":1},{"count":872,"lower_bound":"LTIyNjAzODM1MA==","upper_bound":"LTIxMDI3MzY3OA==","repeats":1},{"count":880,"lower_bound":"LTIwOTQwNDExNQ==","upper_bound":"LTE4MDUxMTQ5Ng==","repeats":1},{"count":888,"lower_bound":"LTE3NDU3OTk5Ng==","upper_bound":"LTE2ODMwMDI4Ng==","repeats":1},{"count":896,"lower_bound":"LTE1OTMxMTk2NA==","upper_bound":"LTE0MTU4Mzc2OQ==","repeats":1},{"count":904,"lower_bound":"LTEzODgyMDM1MA==","upper_bound":"LTEyOTQyMTM0MQ==","repeats":1},{"count":912,"lower_bound":"LTEyNzMxNjg3Mw==","upper_bound":"LTExMDg2ODY0MA==","repeats":1},{"count":920,"lower_bound":"LTEwNDg0NDM3Mg==","upper_bound":"LTEwMjc3Njc5OQ==","repeats":1},{"count":928,"lower_bound":"LTg4ODM0MTYx","upper_bound":"LTY1ODY0OTYy","repeats":1},{"count":936,"lower_bound":"LTYzMDA4MjEw","upper_bound":"LTUyNjAxMDkw","repeats":1},{"count":944,"lower_bound":"LTUxMDM2MTY4","upper_bound":"LTM2NzIyNzYz","repeats":1},{"count":952,"lower_bound":"LTI5ODc1ODEx","upper_bound":"LTE3OTY1NDU0","repeats":1},{"count":960,"lower_bound":"LTExNzY4MDU5","upper_bound":"MTIyMzQ4NjI=","repeats":1},{"count":968,"lower_bound":"MTU3MjQzODI=","upper_bound":"Mjg0ODUxMjk=","repeats":1},{"count":976,"lower_bound":"MzY4OTM1MTQ=","upper_bound":"NDEwMTQ4NzE=","repeats":1},{"count":984,"lower_bound":"NDEzMzU5MDA=","upper_bound":"NTMwMDA2MDQ=","repeats":1},{"count":992,"lower_bound":"NTQ3NzM0NDM=","upper_bound":"NzA2Mzk5OTg=","repeats":1},{"count":1000,"lower_bound":"NzQ1MDU1OTM=","upper_bound":"ODQxODg0NTU=","repeats":1},{"count":1008,"lower_bound":"ODcwNTExODI=","upper_bound":"OTI3NTQ5Mjc=","repeats":1},{"count":1016,"lower_bound":"OTY2NTMwNTE=","upper_bound":"MTAyOTg3ODM4","repeats":1},{"count":1024,"lower_bound":"MTAzOTY3MDIy","upper_bound":"MTEzNzQxMzMx","repeats":1},{"count":1032,"lower_bound":"MTE5NDU2MDQ2","upper_bound":"MTQ2NDk5MjM2","repeats":1},{"count":1040,"lower_bound":"MTU0NzUwMjg2","upper_bound":"MTYxMzg5MzE1","repeats":1},{"count":1048,"lower_bound":"MTYxNDcxNDEz","upper_bound":"MTkwMjYzMjMz","repeats":1},{"count":1056,"lower_bound":"MTkwNjAxMTQ1","upper_bound":"MTk5OTM5NzM4","repeats":1},{"count":1064,"lower_bound":"MjAyNTI1Mzg1","upper_bound":"MjA1MjA0NjU2","repeats":1},{"count":1072,"lower_bound":"MjA3NDA3Njc0","upper_bound":"MjE1NzE4OTky","repeats":1},{"count":1080,"lower_bound":"MjE3NjAxMDEw","upper_bound":"MjI0NDQ0OTAy","repeats":1},{"count":1088,"lower_bound":"MjI1NzY5NzI1","upper_bound":"MjQ2MDE3NjEw","repeats":1},{"count":1096,"lower_bound":"MjQ3NjQ4NTY3","upper_bound":"MjYzMTIwNzg4","repeats":1},{"count":1104,"lower_bound":"MjY4NTY3MzY4","upper_bound":"MjcyNTY0MzAx","repeats":1},{"count":1112,"lower_bound":"Mjc5NDIxMjU0","upper_bound":"MjkzOTcyNTMx","repeats":1},{"count":1120,"lower_bound":"Mjk3MDgzNDk4","upper_bound":"MzA4MDY1OTIx","repeats":1},{"count":1128,"lower_bound":"MzA5Njc5MTE5","upper_bound":"MzI2NDUxNjIx","repeats":1},{"count":1136,"lower_bound":"MzI4MDgzNjE1","upper_bound":"MzM1MzgzNDM4","repeats":1},{"count":1144,"lower_bound":"MzM1ODQ2NTI0","upper_bound":"MzQyOTIxMzkx","repeats":1},{"count":1152,"lower_bound":"MzUyNDQ1MTcx","upper_bound":"MzYwNjIyODIw","repeats":1},{"count":1160,"lower_bound":"Mzc1NzA5Njk4","upper_bound":"MzgyNzg1MTY5","repeats":1},{"count":1168,"lower_bound":"MzgyOTk0OTU5","upper_bound":"Mzk1MzE3NTY2","repeats":1},{"count":1176,"lower_bound":"Mzk4NzQ3MzU2","upper_bound":"NDA0MDU3MDgz","repeats":1},{"count":1184,"lower_bound":"NDEwNzU3MTIy","upper_bound":"NDM0ODIwODcy","repeats":1},{"count":1192,"lower_bound":"NDM1MzY0NjQw","upper_bound":"NDQyNjkwNzI3","repeats":1},{"count":1200,"lower_bound":"NDQ1NTM5NTMw","upper_bound":"NDU4MjEwNzA3","repeats":1},{"count":1208,"lower_bound":"NDU4OTk2MTYz","upper_bound":"NDY4MTExNTM5","repeats":1},{"count":1216,"lower_bound":"NDczNjMxNDE3","upper_bound":"NDkxMjg1NDM1","repeats":1},{"count":1224,"lower_bound":"NDkxNjc1NjQ5","upper_bound":"NTA4Mzg4NzU0","repeats":1},{"count":1232,"lower_bound":"NTA5MjU0MDUz","upper_bound":"NTE4Njg2ODA2","repeats":1},{"count":1240,"lower_bound":"NTE5MjE2OTQx","upper_bound":"NTQ5NTk4OTE0","repeats":1},{"count":1248,"lower_bound":"NTY5MjIyNjAx","upper_bound":"NTc3NjU2NTc2","repeats":1},{"count":1256,"lower_bound":"NTgxODc4OTcx","upper_bound":"NjAyODQzOTk4","repeats":1},{"count":1264,"lower_bound":"NjA1MzE0NTAw","upper_bound":"NjE3NTE5NjQ0","repeats":1},{"count":1272,"lower_bound":"NjE5MDU1OTE4","upper_bound":"NjI2ODcwMDYy","repeats":1},{"count":1280,"lower_bound":"NjM2NjQxMjQy","upper_bound":"NjQ4NzU5OTcw","repeats":1},{"count":1288,"lower_bound":"NjU1NTA4NzY4","upper_bound":"NjYxNDkzMTkx","repeats":1},{"count":1296,"lower_bound":"NjY0NjAyMjAy","upper_bound":"Njk5MzI3NTU3","repeats":1},{"count":1304,"lower_bound":"NzAzODkzNjg2","upper_bound":"NzEzNzE1Nzkw","repeats":1},{"count":1312,"lower_bound":"NzIwMzY0MTU2","upper_bound":"NzI2OTM3OTQ1","repeats":1},{"count":1320,"lower_bound":"NzI2OTUxMzI5","upper_bound":"NzM5MTU0ODMy","repeats":1},{"count":1328,"lower_bound":"NzQwMTA1Nzc2","upper_bound":"NzQ0NTkxOTUw","repeats":1},{"count":1336,"lower_bound":"NzQ3NTg3Mzkz","upper_bound":"NzY3MzUwMzcx","repeats":1},{"count":1344,"lower_bound":"NzY3NjgyMjcw","upper_bound":"Nzc1NzQ0MDcy","repeats":1},{"count":1352,"lower_bound":"Nzc2MTg1MzYz","upper_bound":"Nzg4MDM3MTE2","repeats":1},{"count":1360,"lower_bound":"NzkwMTgwODY0","upper_bound":"Nzk4NjQzOTUy","repeats":1},{"count":1368,"lower_bound":"ODAyNjg2NTIz","upper_bound":"ODE0OTgwNjE5","repeats":1},{"count":1376,"lower_bound":"ODE1NzA1MjY4","upper_bound":"ODQwMjE5MDg4","repeats":1},{"count":1384,"lower_bound":"ODQxOTU2NDYz","upper_bound":"ODUxODMwMjcw","repeats":1},{"count":1392,"lower_bound":"ODUzNzkzNTYw","upper_bound":"ODU1MjE1MTQ2","repeats":1},{"count":1400,"lower_bound":"ODU5MTE5Njk5","upper_bound":"OTA3NjQ3MjQ1","repeats":1},{"count":1408,"lower_bound":"OTA5NjY2MDQ4","upper_bound":"OTE4NTcwMTY2","repeats":1},{"count":1416,"lower_bound":"OTE5NzY0NDk1","upper_bound":"OTQ3NDQ1MzM5","repeats":1},{"count":1424,"lower_bound":"OTQ4NDU4NzYw","upper_bound":"OTUzNzkzMjQ3","repeats":1},{"count":1432,"lower_bound":"OTU5MTgxNTg2","upper_bound":"OTc0NTcxMDEz","repeats":1},{"count":1440,"lower_bound":"OTc2NzAzMjIz","upper_bound":"OTgxOTE2Nzg0","repeats":1},{"count":1448,"lower_bound":"OTgyNDM1MTc1","upper_bound":"OTk4NjIyNDY4","repeats":1},{"count":1456,"lower_bound":"MTAwMDc0NzY1Nw==","upper_bound":"MTAzMzAyMTc0MQ==","repeats":1},{"count":1464,"lower_bound":"MTAzNTU1NjA2NQ==","upper_bound":"MTA0Mzk4OTIyNg==","repeats":1},{"count":1472,"lower_bound":"MTA0OTc3NzgxNA==","upper_bound":"MTA2NDYxNTE0Mw==","repeats":1},{"count":1480,"lower_bound":"MTA3Mzc5NzkxNw==","upper_bound":"MTA3ODA4OTgzNQ==","repeats":1},{"count":1488,"lower_bound":"MTA3OTAxMzQ4NQ==","upper_bound":"MTA4MTA3NTMwNg==","repeats":1},{"count":1496,"lower_bound":"MTA4MjI1MzIzNQ==","upper_bound":"MTEwNjY4Mjk1MQ==","repeats":1},{"count":1504,"lower_bound":"MTExMjI0ODM4OA==","upper_bound":"MTEyMTAxMjg0OQ==","repeats":1},{"count":1512,"lower_bound":"MTEyMzk1MTg5MA==","upper_bound":"MTEzMjY4MzU0NA==","repeats":1},{"count":1520,"lower_bound":"MTEzNTE1ODQ5Mg==","upper_bound":"MTE0OTE3MjkzMg==","repeats":1},{"count":1528,"lower_bound":"MTE1MjE4MDIwOA==","upper_bound":"MTE3MDkxNzg5MA==","repeats":1},{"count":1536,"lower_bound":"MTE3NTc4MDU5MA==","upper_bound":"MTE5Mzk4NjM0Mg==","repeats":1},{"count":1544,"lower_bound":"MTE5NTg5NzM3OQ==","upper_bound":"MTIwODE5OTU2Mg==","repeats":1},{"count":1552,"lower_bound":"MTIwOTc5MjMyNw==","upper_bound":"MTIxOTQ0MzA0MA==","repeats":1},{"count":1560,"lower_bound":"MTIyMDEwNTkzNw==","upper_bound":"MTIzMTkzMzA0OA==","repeats":1},{"count":1568,"lower_bound":"MTIzMzc5ODYyOA==","upper_bound":"MTI0ODg5NDM3Nw==","repeats":1},{"count":1576,"lower_bound":"MTI1MjU1NDQ5Ng==","upper_bound":"MTI2NDU3NDQ1MA==","repeats":1},{"count":1584,"lower_bound":"MTI2NTMzNDc3Mg==","upper_bound":"MTI4OTYyMjMzOQ==","repeats":1},{"count":1592,"lower_bound":"MTI5MTAxNTEyNg==","upper_bound":"MTMwNDc4MTg3OQ==","repeats":1},{"count":1600,"lower_bound":"MTMwOTg5NTMxOQ==","upper_bound":"MTMzMjg1MzI2Mg==","repeats":1},{"count":1608,"lower_bound":"MTMzMzM4OTI0Nw==","upper_bound":"MTM0ODE2OTc1NQ==","repeats":1},{"count":1616,"lower_bound":"MTM1MjIyNTM0OQ==","upper_bound":"MTM3MTg2MjE4NA==","repeats":1},{"count":1624,"lower_bound":"MTM4MDYzNzQ2Mg==","upper_bound":"MTM4NzQwMTQ4Nw==","repeats":1},{"count":1632,"lower_bound":"MTM5MTE3NjUwMA==","upper_bound":"MTM5MjUyODYwNw==","repeats":1},{"count":1640,"lower_bound":"MTM5MzI1NTk0Mw==","upper_bound":"MTM5OTkzODc0NQ==","repeats":1},{"count":1648,"lower_bound":"MTQwMzg4NjA0NA==","upper_bound":"MTQxMzQ3MzY0NQ==","repeats":1},{"count":1656,"lower_bound":"MTQxNjUyMzkxNQ==","upper_bound":"MTQyMTM3MTk5OQ==","repeats":1},{"count":1664,"lower_bound":"MTQyMTcxMDc2OA==","upper_bound":"MTQyNzA5Njc5Ng==","repeats":1},{"count":1672,"lower_bound":"MTQyODY5Njg5NA==","upper_bound":"MTQ0NDU0NTUyNg==","repeats":1},{"count":1680,"lower_bound":"MTQ0NDY4NDUwMg==","upper_bound":"MTQ1MjMzMDEyOA==","repeats":1},{"count":1688,"lower_bound":"MTQ2MDUzMzgzNQ==","upper_bound":"MTQ2OTk0NDIyMg==","repeats":1},{"count":1696,"lower_bound":"MTQ3MzU4MjUwOA==","upper_bound":"MTQ4MjY0NzM2OQ==","repeats":1},{"count":1704,"lower_bound":"MTQ4MzA2MjQyOA==","upper_bound":"MTQ5NDA5OTg4MA==","repeats":1},{"count":1712,"lower_bound":"MTUwMzg0ODI2Mw==","upper_bound":"MTUyNDQ0NjUxNg==","repeats":1},{"count":1720,"lower_bound":"MTUyNTgyMTkyOQ==","upper_bound":"MTUyOTgwMDkyMA==","repeats":1},{"count":1728,"lower_bound":"MTUzMjMwNDI3NA==","upper_bound":"MTU0NDA0MDA5NQ==","repeats":1},{"count":1736,"lower_bound":"MTU1MDIzMTA1Mw==","upper_bound":"MTU2MTc3MzQyNg==","repeats":1},{"count":1744,"lower_bound":"MTU2Nzk2MTc0OQ==","upper_bound":"MTU5MjExMzE2Mw==","repeats":1},{"count":1752,"lower_bound":"MTU5OTczNDAzMA==","upper_bound":"MTYxNDc2NzcxMg==","repeats":1},{"count":1760,"lower_bound":"MTYyMjEzODc5Mw==","upper_bound":"MTYyNjY5ODkzMQ==","repeats":1},{"count":1768,"lower_bound":"MTYyOTY3NTYwNg==","upper_bound":"MTY1NDQ5OTU5Mw==","repeats":1},{"count":1776,"lower_bound":"MTY2MDc0OTgwNA==","upper_bound":"MTY2OTE3Mjk1NA==","repeats":1},{"count":1784,"lower_bound":"MTY2OTI3NzU1NA==","upper_bound":"MTY3NjI4ODIyMw==","repeats":1},{"count":1792,"lower_bound":"MTY3NjY5MTUzMw==","upper_bound":"MTY4NDM4MzUxNg==","repeats":1},{"count":1800,"lower_bound":"MTY4NTEwNzY1OA==","upper_bound":"MTY5NTIzMDkxMw==","repeats":1},{"count":1808,"lower_bound":"MTcwOTY5MjYxMQ==","upper_bound":"MTcxMzkyMTMxNA==","repeats":1},{"count":1816,"lower_bound":"MTcyMjU1NDQ2MQ==","upper_bound":"MTczMDM1MTgxMA==","repeats":1},{"count":1824,"lower_bound":"MTczMTg1NzgxNg==","upper_bound":"MTc1MzEzNDI1NQ==","repeats":1},{"count":1832,"lower_bound":"MTc1OTM2NDY2Mg==","upper_bound":"MTc4NDQ1MTgwMg==","repeats":1},{"count":1840,"lower_bound":"MTc5OTUyNjU0OQ==","upper_bound":"MTgyMzY5MTUyNQ==","repeats":1},{"count":1848,"lower_bound":"MTgyNjkyNTQxMw==","upper_bound":"MTgzMTAwMjE5OQ==","repeats":1},{"count":1856,"lower_bound":"MTgzMTg4NzM3NA==","upper_bound":"MTg0MzQzMTYyMA==","repeats":1},{"count":1864,"lower_bound":"MTg0MzkwNDAzNg==","upper_bound":"MTg1Njk4ODQwOA==","repeats":1},{"count":1872,"lower_bound":"MTg2NDM4MjQzNg==","upper_bound":"MTg2ODk3MjM5Mg==","repeats":1},{"count":1880,"lower_bound":"MTg2OTEyMTg4MA==","upper_bound":"MTg4OTE5NTQ5Mg==","repeats":1},{"count":1888,"lower_bound":"MTkwMzExNjY5Ng==","upper_bound":"MTkxNDc0NTI2NQ==","repeats":1},{"count":1896,"lower_bound":"MTkxNTAwNzA1OQ==","upper_bound":"MTkzMjgxNjcxNQ==","repeats":1},{"count":1904,"lower_bound":"MTk0MzgyNDg4MQ==","upper_bound":"MTk1NzU2ODk4Mg==","repeats":1},{"count":1912,"lower_bound":"MTk1NzU3MjU5NA==","upper_bound":"MTk2MzY4NTc1OA==","repeats":1},{"count":1920,"lower_bound":"MTk2NjYyOTg5Mw==","upper_bound":"MTk5MTA0NjE3Nw==","repeats":1},{"count":1928,"lower_bound":"MTk5MTA5MTkzMQ==","upper_bound":"MTk5NjAzMjcwMg==","repeats":1},{"count":1936,"lower_bound":"MjAxNzgwMjYzOQ==","upper_bound":"MjAyMzk2ODAyMg==","repeats":1},{"count":1944,"lower_bound":"MjAyNTQwOTAxMQ==","upper_bound":"MjAzMzI2MzczOA==","repeats":1},{"count":1952,"lower_bound":"MjA0MDgwNzYxMA==","upper_bound":"MjA1NTIzOTQxMg==","repeats":1},{"count":1960,"lower_bound":"MjA1OTA3MDA2Mw==","upper_bound":"MjA3ODg0NjA4NA==","repeats":1},{"count":1968,"lower_bound":"MjA4MTU2MjE4Ng==","upper_bound":"MjA4NTM5NDg5MQ==","repeats":1},{"count":1976,"lower_bound":"MjA4Nzc5OTA3MA==","upper_bound":"MjEwMDYwMzMyMA==","repeats":1},{"count":1984,"lower_bound":"MjExNDc1MTY2Nw==","upper_bound":"MjEyNzE0NjU3Nw==","repeats":1},{"count":1992,"lower_bound":"MjEyNzM1NDc1OA==","upper_bound":"MjEzOTY2ODYxMQ==","repeats":1},{"count":2000,"lower_bound":"MjE0MTI1MzQ4NQ==","upper_bound":"MjE0NzIyNjUzMQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,3,3,2,1,1,0,0,2,0,0,2,2,4,3,1,4,0,1,0,0,1,0,1,1,1,1,0,3,1,1,1,1,2,1,1,0,0,0,1,0,1,2,0,2,0,1,0,0,2,0,0,0,1,0,2,1,0,1,2,3,2,0,1,4,1,1,1,1,2,0,0,1,2,2,1,1,2,1,0,0,1,0,0,4,0,0,0,1,2,2,1,4,1,1,1,0,0,1,1,1,0,4,2,3,1,1,2,0,0,0,0,4,1,1,2,0,1,1,0,2,1,1,3,0,0,2,3,0,1,1,0,1,1,3,2,2,1,0,0,1,2,2,1,1,2,0,1,3,1,0,2,0,3,2,2,0,1,0,1,1,3,1,0,1,1,0,0,1,0,1,3,1,3,1,1,1,2,2,0,0,0,1,0,2,0,1,1,0,1,1,0,2,0,1,2,1,0,1,2,0,0,1,1,1,0,1,2,2,0,0,0,1,4,0,0,0,0,1,0,0,0,0,0,1,2,1,1,2,1,0,1,2,2,2,2,1,2,0,2,1,0,1,2,1,0,1,2,0,0,1,0,3,2,0,0,0,1,2,1,2,0,0,2,1,0,1,2,0,3,0,1,2,0,0,0,1,1,0,2,2,1,2,0,2,1,0,2,0,2,0,1,2,1,0,0,0,0,1,0,1,0,1,0,1,1,0,0,1,1,1,1,0,1,0,2,1,1,0,2,1,0,0,0,0,0,0,1,0,0,1,0,2,1,1,1,3,1,0,4,0,1,1,2,2,0,1,0,1,0,2,0,0,0,2,2,0,1,1,0,0,1,1,1,2,1,2,1,0,0,0,0,0,1,3,2,2,1,0,0,1,1,3,0,1,0,0,0,2,1,1,1,0,1,0,1,1,1,1,1,0,0,0,0,1,1,1,3,0,1,1,1,1,1,0,2,0,3,0,0,1,1,0,2,3,4,0,3,0,1,1,0,2,1,1,1,2,2,1,0,0,0,1,0,0,3,3,0,0,1,1,2,2,0,3,0,1,1,0,0,0,3,2,2,1,2,5,0,1,0,1,1,0,1,1,0,2,3,2,0,2,1,0,0,0,0,3,1,1,0,1,0,2,1,0,1,1,1,2,1,0,1,0,3,1,2,0,1,1,2,0,2,1,3,1,1,0,0,3,0,0,1,3,0,0,0,0,1,1,0,1,1,1,1,0,2,2,0,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,2,1,2,1,2,1,0,0,1,1,2,0,1,0,0,1,1,0,0,1,0,0,1,0,2,1,0,0,4,0,1,0,1,0,1,0,1,1,2,2,1,0,1,2,1,4,1,0,0,0,1,0,2,3,2,0,2,0,2,0,1,2,1,1,2,2,0,0,1,2,0,1,1,1,0,1,0,0,1,0,1,1,0,0,0,2,2,0,0,2,0,3,0,1,0,3,1,0,0,1,1,1,1,0,1,1,0,1,1,0,1,0,2,0,1,1,1,0,1,0,3,1,1,3,0,2,0,0,1,0,0,2,3,1,2,1,0,0,0,0,0,0,2,0,2,1,1,0,0,1,1,1,2,2,1,0,1,0,1,0,2,1,0,1,1,0,1,1,2,1,2,0,1,0,0,0,4,0,1,3,0,2,1,1,0,0,2,0,1,3,1,0,2,2,1,2,0,2,3,2,2,0,0,2,0,0,1,0,0,1,2,2,0,1,1,1,1,1,1,2,2,1,1,1,0,1,2,0,0,0,1,0,1,1,0,0,0,0,2,1,0,2,1,0,0,2,2,2,2,3,2,1,1,0,2,1,0,0,1,0,3,0,3,0,0,0,1,1,1,0,3,1,0,3,0,0,0,0,0,0,2,1,0,0,1,0,4,2,1,2,3,0,1,0,2,0,0,3,1,1,0,1,1,3,0,1,0,0,2,2,1,0,0,4,0,1,1,3,2,0,2,0,1,0,1,1,2,0,0,0,1,0,1,3,1,2,0,1,1,0,1,1,1,1,2,0,2,2,0,2,0,1,2,1,0,0,0,2,2,1,3,1,0,1,2,0,1,1,0,2,1,4,2,2,1,2,3,2,2,1,3,0,2,3,3,1,0,0,0,1,3,3,0,1,1,1,1,1,1,1,1,1,2,1,1,1,0,0,2,0,2,2,1,1,1,0,0,1,0,1,1,1,0,0,0,2,1,3,0,0,0,0,1,0,0,4,1,0,1,1,1,3,2,0,0,1,0,0,0,2,1,0,0,0,1,0,0,1,0,1,1,1,2,1,1,0,3,3,1,0,0,1,2,2,1,0,0,1,1,2,2,0,1,2,0,1,0,3,2,0,1,1,1,1,1,2,1,0,2,1,1,0,1,3,0,0,0,1,1,1,2,1,1,0,0,1,2,1,0,2,0,1,2,1,1,0,0,0,1,0,1,0,3,1,0,1,0,0,2,0,1,0,2,1,0,2,0,0,1,1,3,2,0,0,1,2,1,0,0,1,0,0,3,2,1,0,2,1,0,0,0,1,1,1,2,1,0,2,1,0,1,0,2,1,0,0,3,1,2,4,2,2,0,2,1,4,3,1,1,3,0,3,0,0,0,0,0,1,2,1,0,1,3,3,0,1,0,0,5,0,0,0,0,0,0,1,1,1,0,4,0,1,0,1,1,1,2,1,1,0,2,1,1,1,1,2,0,1,0,1,1,0,1,0,1,1,1,0,1,0,1,0,1,1,1,0,3,1,2,0,2,0,2,1,3,1,1,0,0,0,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,2,0,0,1,2,1,0,0,2,3,1,1,2,0,1,2,3,1,0,1,1,0,1,2,0,0,2,2,1,1,2,0,1,2,1,2,1,3,1,1,1,0,0,0,0,0,1,0,0,1,0,2,2,2,2,0,0,2,1,3,0,1,1,1,0,1,0,3,2,1,4,1,0,2,1,1,1,3,1,0,1,0,0,1,1,0,2,2,1,1,1,2,0,1,0,0,1,3,2,2,3,1,1,1,1,0,1,2,3,2,0,1,0,0,1,0,3,1,1,1,1,4,1,1,1,0,0,1,3,1,0,0,2,0,0,0,2,5,1,0,1,1,3,1,0,2,2,0,1,0,1,2,1,0,1,2,1,0,1,1,0,0,0,1,4,1,0,1,1,2,1,1,0,1,1,1,2,1,0,2,1,2,2,0,1,1,1,2,1,0,1,1,1,1,1,2,2,3,2,1,1,2,0,1,0,2,0,1,3,1,1,2,0,1,3,1,1,0,0,2,0,1,1,1,1,1,1,0,2,2,1,1,1,0,2,1,2,0,1,1,0,1,0,1,2,1,0,1,0,0,2,2,0,1,0,1,1,2,3,0,3,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,1,1,2,3,1,2,2,1,1,1,1,1,0,3,1,1,0,2,0,1,2,1,0,0,0,2,3,1,1,1,0,1,1,1,3,1,1,0,2,1,0,0,3,1,2,1,0,1,4,1,0,1,0,0,1,2,1,2,1,2,1,4,1,0,0,1,0,0,1,0,2,1,0,0,0,2,0,0,0,0,1,1,0,2,0,0,2,0,3,2,2,2,2,0,0,2,1,1,0,2,0,0,0,2,3,1,0,2,2,0,1,4,0,1,0,0,1,1,0,2,1,2,1,0,0,1,3,0,0,3,1,1,3,3,2,2,4,0,0,1,0,1,0,1,3,1,0,1,0,1,5,0,2,0,0,2,1,0,1,0,2,0,4,1,0,0,0,0,0,1,2,1,2,0,0,2,2,0,2,0,4,1,1,2,1,1,0,0,2,1,2,0,0,0,1,2,0,0,2,1,1,1,1,0,2,0,1,1,1,0,1,1,0,2,1,3,1,1,1,1,0,1,1,1,1,1,1,0,2,1,0,1,2,1,2,4,0,0,1,0,1,1,0,1,2,2,0,0,2,0,1,3,2,0,0,2,1,1,1,3,0,1,0,0,1,1,1,0,0,0,1,2,0,1,2,3,1,1,1,0,0,0,1,1,1,1,1,0,3,1,0,0,0,0,0,1,1,0,0,0,0,1,0,0,1,1,0,2,0,1,0,0,0,0,0,1,2,0,1,0,2,2,1,0,1,0,1,0,1,0,1,1,1,0,0,0,1,0,1,0,2,1,0,1,1,1,1,1,1,0,0,1,1,1,0,0,1,2,1,0,2,1,0,1,0,2,1,2,1,2,1,2,0,0,2,0,2,3,1,1,1,0,0,1,0,1,0,1,0,1,0,0,0,0,1,1,2,1,2,0,0,0,0,2,2,1,0,3,2,2,0,0,1,0,3,0,0,2,2,1,0,1,1,1,0,0,0,0,0,0,2,0,1,0,1,4,0,0,2,1,2,2,2,3,0,2,0,0,1,0,0,1,0,2,2,0,0,3,0,1,3,2,1,1,1,1,0,0,0,1,0,0,0,3,0,0,0,0,1,1,1,0,0,1,2,1,1,1,0,0,1,3,2,1,1,1,2,1,2,3,1,0,1,1,1,0,1,0,1,1,4,1,0,0,1,1,5,4,1]},{"counters":[1,0,1,3,1,0,2,1,1,0,2,1,1,2,0,2,0,1,3,0,0,0,0,0,0,1,2,2,0,2,2,1,2,1,0,3,0,1,1,1,1,0,1,0,0,1,2,1,2,0,2,1,2,2,0,1,1,0,0,4,1,1,1,0,3,0,0,2,3,1,0,2,2,0,0,1,0,1,1,0,3,0,1,2,0,3,0,1,0,0,0,1,1,3,2,0,3,2,1,1,0,2,2,0,3,1,4,1,1,0,0,3,0,1,1,0,0,1,3,1,1,2,2,3,1,1,0,4,0,1,1,1,1,3,0,0,0,1,0,2,0,1,0,0,0,0,0,2,1,1,2,4,1,0,1,0,1,0,3,0,2,0,1,1,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,2,0,2,2,0,0,0,1,3,0,0,0,1,1,2,1,3,1,0,2,1,1,1,1,1,1,3,0,0,0,1,1,1,1,0,1,1,1,0,1,1,0,3,3,1,1,1,0,0,0,0,1,1,1,0,1,0,2,1,1,2,1,0,0,1,3,3,0,2,1,1,2,1,0,1,1,2,2,1,3,0,1,1,0,1,0,0,3,1,0,0,3,0,0,1,1,1,1,0,1,0,0,0,3,0,1,1,0,0,1,2,1,1,1,3,1,1,0,0,0,0,2,0,1,1,2,1,0,0,1,0,2,0,1,2,1,1,0,2,2,1,1,1,3,0,0,2,0,1,1,1,1,0,1,1,1,1,0,0,0,0,0,0,3,1,0,0,1,1,3,2,1,0,1,0,0,0,4,2,1,1,0,1,1,0,0,0,2,1,1,1,1,1,2,1,1,1,1,2,0,1,1,1,0,0,1,1,1,0,0,1,1,0,1,1,2,1,1,0,0,0,3,0,2,2,0,0,0,0,0,1,2,2,1,0,2,1,0,1,1,0,0,2,1,1,0,2,2,1,0,1,1,1,0,0,1,0,1,2,3,0,1,1,1,1,1,2,2,1,0,2,2,1,2,1,0,2,2,3,1,1,2,1,0,1,3,2,0,2,0,1,1,2,2,0,1,2,0,0,0,2,0,0,0,2,1,0,0,0,0,2,2,0,2,1,1,2,1,0,1,2,0,0,2,3,0,0,1,2,1,1,0,2,2,0,4,1,0,1,1,1,1,2,1,2,1,1,2,0,1,0,0,0,0,3,2,1,0,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,1,1,1,1,2,0,0,0,0,2,1,0,1,0,4,0,1,0,1,1,1,1,0,0,2,1,1,1,0,0,0,1,2,0,1,2,0,1,1,2,1,1,4,0,1,0,2,0,0,1,2,0,2,0,2,3,0,1,0,0,2,0,3,0,0,2,0,0,1,0,0,1,0,1,0,0,2,0,1,1,1,2,0,1,1,0,2,1,2,3,0,1,0,0,0,0,1,0,1,1,4,0,1,0,2,2,3,1,1,1,2,0,0,0,0,1,0,0,1,1,3,0,0,0,0,0,1,1,3,0,0,1,0,1,1,1,1,1,0,2,0,1,1,1,1,2,0,1,1,0,0,1,2,0,0,0,1,1,0,0,2,4,3,1,0,0,3,3,0,1,0,1,0,1,1,0,1,0,0,0,2,0,0,0,2,1,1,0,1,0,1,1,0,0,0,2,0,0,1,2,0,2,1,0,0,0,1,0,1,1,2,0,2,0,0,3,2,0,0,2,1,1,2,0,1,1,0,0,2,1,0,0,3,0,2,0,4,1,2,4,1,0,0,0,1,0,4,1,1,1,1,1,0,0,0,1,0,0,0,2,1,0,3,1,2,0,2,3,0,0,0,0,1,0,2,1,0,0,1,2,2,1,0,1,1,1,1,1,1,3,0,3,1,0,2,0,0,2,2,1,1,0,2,2,1,2,2,1,1,2,4,0,2,0,0,1,2,0,0,1,2,2,2,0,1,0,1,3,0,0,0,1,1,2,2,2,0,0,3,1,2,1,0,2,1,1,1,0,0,0,0,4,0,1,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,1,2,0,1,1,0,2,2,2,1,0,1,2,3,0,1,2,2,0,2,1,1,2,1,0,0,0,2,1,0,0,1,3,0,2,1,0,2,1,1,1,1,0,0,0,0,2,0,1,1,2,1,1,0,0,1,0,0,0,1,1,0,1,0,0,2,2,0,1,1,1,3,1,2,3,2,2,2,2,2,0,1,0,2,1,1,1,0,0,2,0,1,1,0,0,0,2,1,1,2,2,2,2,0,2,0,0,1,1,0,1,2,1,1,0,2,1,0,1,1,0,1,0,1,0,1,0,0,0,1,1,3,2,1,1,0,0,1,0,0,2,1,0,0,0,0,2,1,1,2,0,0,2,0,2,1,4,1,0,1,0,2,1,0,1,2,2,0,0,0,3,3,0,1,1,2,1,0,0,0,2,0,1,1,0,2,2,4,0,0,4,2,0,0,2,0,2,2,1,1,0,1,0,2,2,0,2,1,0,2,1,1,0,1,1,2,2,0,0,2,0,3,2,1,1,0,1,2,1,1,2,1,0,1,1,0,3,0,2,0,0,0,2,2,1,2,0,0,0,1,2,1,0,1,1,2,0,1,0,1,0,0,1,1,0,1,2,1,1,3,2,1,0,0,3,1,1,0,3,1,0,0,3,0,1,1,1,1,0,2,1,1,2,0,1,2,0,0,1,1,3,3,2,1,1,2,0,0,0,0,1,0,1,0,0,3,1,0,0,1,2,1,2,2,0,2,4,0,1,1,2,0,2,2,3,1,1,1,1,0,4,2,3,0,1,1,2,2,5,0,1,2,2,2,0,1,0,3,0,0,0,0,0,1,1,2,1,0,1,1,2,0,1,1,0,1,1,0,0,1,0,1,2,1,0,1,0,2,2,0,1,2,1,0,0,1,0,0,2,0,0,0,0,3,1,1,3,0,0,0,2,1,0,1,1,2,1,1,1,0,1,4,1,0,1,2,3,2,3,1,1,0,2,1,2,0,1,1,1,1,0,2,0,3,1,2,1,0,1,1,2,0,1,0,2,0,0,2,2,1,1,1,2,1,0,1,2,2,1,0,2,1,1,1,2,1,2,2,0,1,1,0,3,3,0,2,2,0,1,2,1,1,0,0,1,3,0,1,0,1,1,0,0,1,0,2,2,0,0,0,1,1,1,1,0,1,2,1,1,0,1,1,1,2,1,0,1,1,0,1,2,1,0,1,0,1,0,1,3,0,0,3,2,3,1,0,1,1,1,0,3,3,0,0,1,2,2,1,0,0,0,2,1,0,2,0,2,1,0,1,0,1,1,2,0,1,2,2,1,2,2,0,0,1,3,2,1,0,1,2,1,0,2,2,1,0,1,1,1,0,0,1,0,0,2,1,2,0,0,4,1,0,1,1,2,0,2,1,1,0,1,2,1,0,0,1,1,0,0,2,1,2,0,1,2,0,0,1,0,1,0,0,1,1,0,1,0,2,0,1,1,0,2,1,2,1,2,0,1,1,2,1,1,1,2,0,3,0,1,0,2,1,2,0,3,0,0,1,0,1,0,0,2,0,0,2,0,1,3,3,0,1,3,1,1,1,0,1,0,1,1,2,2,2,2,0,0,2,2,0,1,0,4,1,1,1,1,1,4,2,3,2,1,0,1,2,1,2,2,2,1,1,1,1,0,3,2,1,1,1,1,1,1,1,0,1,1,0,2,0,2,0,1,3,0,2,1,1,1,1,1,0,1,2,0,0,1,1,1,1,1,3,1,2,2,0,1,0,2,2,0,0,0,2,1,1,1,2,1,2,1,0,2,1,1,1,0,2,1,0,0,0,1,2,1,0,1,3,3,0,3,2,1,2,2,2,2,1,0,0,2,3,0,0,0,2,3,0,0,0,1,0,1,2,1,0,2,0,2,1,0,2,2,1,0,0,0,1,1,0,1,2,2,1,1,1,0,2,0,0,1,1,1,1,2,1,1,1,2,1,3,1,0,2,1,3,1,0,2,2,3,0,0,1,2,2,3,1,1,3,1,0,1,0,1,1,0,1,0,1,1,2,0,3,0,0,0,0,1,2,0,3,0,1,0,1,0,0,0,2,1,0,0,3,1,0,0,0,0,3,0,0,1,0,1,0,1,1,0,0,1,0,2,1,1,1,0,1,2,1,0,0,2,1,0,1,0,1,0,2,0,0,0,0,3,0,0,0,1,2,1,1,0,0,2,1,1,1,0,1,1,2,0,2,0,0,3,3,0,0,0,1,0,0,1,0,0,1,1,0,0,0,0,1,1,1,0,0,1,0,3,0,1,1,0,0,2,1,2,1,4,0,0,3,1,0,1,1,2,2,0,0,3,0,0,1,0,1,1,1,0,1,4,0,2,2,1,3,1,1,4,0,0,1,0,3,1,0,0,0,1,1,0,0,1,0,0,0,0,2,0,2,1,3,0,1,0,1,2,1,0,1,0,0,1,0,0,0,0,1,0,1,2,1,1,1,0,4,1,2,2,1,3,1,0,1,4,1,0,1,0,1,2,0,0,1,2,2,1,1,0,0,1,1,1]},{"counters":[0,0,1,0,2,1,2,0,0,2,0,1,2,1,2,1,2,1,1,0,1,2,2,3,1,1,0,1,0,2,1,2,0,2,3,4,1,2,1,1,0,0,1,0,1,0,0,1,1,1,1,0,1,0,1,2,1,2,0,2,0,1,0,0,1,2,4,0,1,1,0,1,2,0,0,0,2,0,3,2,1,0,0,1,3,1,1,1,0,4,1,1,0,1,0,0,3,0,0,3,0,0,1,1,0,0,1,1,0,1,0,0,1,0,2,0,0,0,1,1,2,2,0,0,1,0,2,2,1,1,1,0,3,0,1,1,1,0,0,1,2,2,1,0,1,0,0,1,0,2,0,0,0,1,1,2,1,1,1,1,3,0,1,0,1,4,0,1,0,0,1,0,0,1,0,2,2,2,0,0,1,0,0,1,2,0,3,1,0,0,1,3,0,0,1,3,2,1,2,1,1,0,1,1,1,0,0,0,1,1,0,0,0,0,1,1,3,2,1,1,0,0,2,0,1,1,0,2,0,0,2,1,0,2,1,1,0,1,1,1,1,0,0,1,2,1,0,1,1,0,2,2,2,1,1,2,1,0,0,1,1,3,0,1,1,2,1,1,0,0,0,0,0,2,0,0,0,1,1,1,0,1,2,1,2,2,3,2,1,0,0,1,3,0,0,0,1,2,1,1,0,1,2,0,1,0,1,0,1,0,1,4,1,0,2,2,2,1,1,0,3,2,0,0,0,1,1,0,3,1,1,0,0,1,2,0,1,1,0,0,1,0,2,0,1,1,2,1,0,3,2,2,0,0,1,3,3,1,1,1,0,3,2,1,1,3,0,1,0,0,0,3,1,0,0,1,0,2,0,1,0,0,2,1,1,0,1,1,1,0,1,4,2,2,0,3,0,3,1,2,0,0,0,1,1,2,0,2,1,2,0,0,2,1,1,2,1,3,1,0,1,0,1,2,0,0,0,2,0,0,1,0,1,2,1,3,0,2,1,2,1,1,1,1,0,4,2,1,4,2,2,2,1,0,0,0,3,2,1,1,2,0,0,2,2,0,3,0,1,1,0,0,0,0,1,2,1,0,2,0,1,0,2,0,0,2,0,0,1,0,2,3,2,3,1,1,3,0,1,1,0,0,1,2,1,0,1,0,1,0,2,2,2,1,0,0,2,0,1,2,1,0,2,2,2,2,1,0,1,0,0,0,0,0,1,2,2,1,0,1,3,2,1,1,1,1,0,2,0,2,2,0,0,1,1,3,0,0,1,1,0,1,1,1,1,1,4,0,0,2,0,2,0,3,3,2,2,0,1,1,0,1,1,2,1,1,0,0,1,3,1,0,1,0,0,2,2,1,0,1,0,1,0,0,4,0,4,3,2,0,0,1,1,3,1,3,1,1,1,1,1,1,2,1,1,0,1,1,0,1,0,4,1,0,2,3,2,1,3,2,0,1,0,2,1,0,0,1,0,1,1,0,1,4,2,0,0,2,3,2,2,1,3,1,3,3,2,0,3,1,1,0,2,2,1,0,1,1,1,1,1,0,1,1,0,1,0,0,2,1,0,4,1,3,1,1,1,0,1,0,1,2,0,0,0,0,2,0,0,2,2,0,1,1,1,3,3,3,3,0,1,3,1,0,2,0,0,1,1,0,1,2,0,2,2,2,0,1,1,0,0,1,0,1,1,1,1,1,1,1,0,2,0,1,2,3,1,0,1,2,2,0,2,0,0,0,0,2,0,2,0,0,1,1,0,1,0,0,0,2,1,1,0,1,2,3,0,1,0,0,0,1,0,1,0,1,0,1,0,1,1,1,2,1,1,1,0,1,2,0,0,2,0,0,0,1,3,0,1,0,0,2,1,1,1,1,3,1,1,1,1,4,0,3,0,0,2,1,0,0,3,0,1,2,1,0,1,0,2,2,0,0,2,1,1,3,1,2,0,0,1,3,0,0,0,1,0,1,1,2,0,2,0,1,0,0,1,2,0,4,0,2,0,0,0,2,0,1,0,1,1,0,0,2,0,0,0,0,0,0,1,2,1,1,2,2,0,1,1,0,1,0,2,0,0,0,1,0,1,1,0,2,0,1,0,2,3,1,0,0,2,0,1,1,0,1,1,2,0,1,0,2,1,1,2,2,0,1,0,1,1,1,1,1,2,1,0,1,0,1,0,2,1,3,4,0,3,1,0,1,2,2,1,1,4,1,0,0,2,0,2,2,1,1,1,2,0,1,2,0,0,1,0,1,0,0,1,0,0,1,2,1,2,0,1,1,0,0,0,2,2,1,1,2,1,3,0,1,0,0,0,0,1,4,1,2,1,1,0,0,1,4,0,1,1,1,2,1,0,1,1,1,2,0,1,1,0,1,2,0,0,0,0,1,0,1,2,2,2,1,1,0,0,1,0,2,1,3,0,0,0,0,1,1,3,1,1,0,2,0,0,1,2,1,0,2,0,2,1,1,1,1,0,0,0,2,2,2,3,3,0,2,0,5,0,0,0,2,0,0,1,1,1,3,1,0,0,0,1,0,0,0,2,1,5,0,1,0,1,0,2,0,2,0,0,0,0,1,0,1,2,1,1,3,0,0,0,3,3,0,1,1,1,2,2,0,0,1,0,0,1,1,2,1,2,1,2,2,2,0,0,1,2,3,0,0,1,1,1,0,0,2,1,2,1,2,1,1,1,0,0,0,2,0,0,0,1,1,0,1,3,1,0,1,0,1,0,1,0,1,0,0,2,1,0,0,2,1,0,0,0,1,0,0,0,1,0,2,0,0,1,0,0,1,1,2,2,0,3,2,0,1,0,0,2,2,1,1,1,1,1,1,0,1,1,2,1,1,0,1,1,0,2,0,0,2,0,3,0,1,1,0,0,2,2,3,1,0,2,0,0,0,0,1,1,1,1,1,1,0,1,0,1,1,2,2,2,1,1,0,3,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,1,2,3,2,2,0,1,0,1,1,0,0,2,2,1,0,2,0,1,2,1,2,2,3,1,0,0,0,2,3,1,0,3,0,0,2,1,2,0,2,1,0,0,1,0,0,1,1,2,2,0,0,2,4,2,0,0,0,1,2,2,0,0,1,2,0,1,0,1,5,0,2,1,1,1,0,0,0,0,1,0,2,0,2,2,0,4,1,1,2,2,1,1,1,3,1,1,1,1,1,1,1,0,1,0,1,1,0,2,1,2,0,1,1,1,0,1,3,0,0,2,2,1,0,0,0,5,1,0,1,0,0,1,3,0,2,1,0,0,1,2,0,0,0,1,3,0,0,1,0,0,0,1,4,0,0,2,2,1,2,0,0,2,1,0,1,4,1,0,1,1,2,2,0,1,2,3,2,1,1,0,1,2,1,3,1,1,1,0,0,0,0,0,1,0,0,1,0,0,2,2,3,1,0,0,2,3,0,1,1,2,2,2,2,0,1,1,2,0,1,0,1,0,1,0,2,0,0,0,1,1,4,0,0,0,1,1,2,1,2,0,1,1,2,0,1,1,0,1,1,0,1,2,2,0,0,0,3,1,3,0,1,1,0,2,0,3,2,0,0,0,1,3,1,2,0,1,2,0,1,0,1,0,2,1,1,2,0,3,0,1,0,2,3,1,0,3,0,2,0,0,0,0,0,1,2,2,1,1,4,0,1,0,0,1,2,0,2,2,0,1,2,1,0,0,0,0,0,0,0,2,1,3,1,3,0,1,1,1,0,0,0,0,1,0,0,1,1,0,0,1,2,1,0,0,0,1,2,1,0,1,1,3,1,2,2,1,2,3,1,1,1,3,1,1,1,0,1,1,1,1,3,2,5,2,1,0,1,2,1,0,0,1,0,0,1,2,1,1,0,0,0,0,1,0,1,2,1,0,2,2,1,3,0,1,0,0,2,1,3,2,0,0,0,0,0,0,0,2,1,2,1,1,1,0,1,1,1,2,0,0,1,1,1,1,0,1,0,1,1,0,3,0,1,2,1,0,0,0,1,0,1,0,0,1,1,2,2,1,2,1,1,1,1,0,0,0,1,2,0,1,1,3,1,3,1,0,1,0,2,1,1,2,2,0,2,5,2,1,1,2,1,1,0,1,0,1,0,1,2,0,0,2,0,2,0,1,0,1,0,1,2,2,2,1,1,0,1,1,2,0,2,1,0,1,1,1,0,2,0,0,1,2,1,1,2,0,1,1,0,3,1,1,1,0,0,1,0,0,0,0,0,2,2,1,2,1,0,1,1,1,1,2,0,1,0,1,1,1,1,2,1,2,1,1,0,0,2,0,0,0,0,0,2,1,0,1,0,1,2,0,1,0,1,1,1,2,0,1,0,0,2,0,2,0,2,1,1,0,0,1,2,4,1,0,0,3,4,0,0,0,1,2,1,1,1,2,1,0,0,0,0,2,0,1,1,0,1,0,1,1,2,0,1,1,1,0,1,0,1,6,0,1,0,0,1,2,1,0,1,0,0,1,0,1,0,1,0,0,0,1,0,0,1,3,0,2,0,0,2,0,2,3,1,0,1,2,0,0,2,1,1,0,0,2,1,1,1,3,2,0,0,2,4,0,1,0,0,2,0,1,1,3,1,2,0,0,0,0,0,0,1]},{"counters":[1,0,0,1,1,2,1,1,0,2,0,0,2,0,1,0,1,1,0,0,0,1,2,0,0,1,3,1,3,1,1,0,0,0,2,1,1,0,1,2,3,1,3,0,1,2,2,1,1,2,0,2,2,1,2,0,0,2,1,0,1,5,1,2,0,1,2,1,0,2,0,1,1,0,2,0,0,0,0,1,1,1,1,2,0,2,0,2,0,1,1,2,0,0,2,2,1,1,1,1,0,0,2,1,0,0,1,0,2,0,0,1,2,2,1,2,3,2,2,1,1,0,1,3,0,5,3,1,0,0,2,1,1,1,0,1,2,1,0,1,0,1,0,1,2,0,0,0,4,1,0,0,1,1,0,1,1,0,0,1,0,3,0,1,1,1,2,2,1,0,1,0,1,1,1,1,2,0,0,0,0,3,1,1,0,1,0,2,0,1,1,0,3,1,1,1,2,0,1,0,1,0,3,0,0,1,0,2,1,3,1,1,0,2,2,0,3,2,3,0,0,1,0,2,1,0,1,0,1,0,1,0,1,0,1,3,0,0,1,4,0,0,1,2,1,1,1,1,0,1,3,1,1,0,1,2,1,0,2,3,0,1,0,2,2,3,2,0,0,1,1,0,1,0,1,1,2,0,1,0,2,1,0,1,1,0,0,0,1,0,0,0,0,2,1,0,0,0,2,3,1,1,2,1,1,0,2,1,0,1,0,1,0,0,0,2,1,1,2,1,2,1,1,0,1,0,1,0,1,0,1,3,0,0,3,1,3,1,0,1,0,0,0,2,1,2,1,0,2,2,0,0,2,0,1,0,0,0,1,1,1,0,2,2,1,0,1,2,1,0,2,3,1,2,1,0,1,1,1,3,0,1,0,1,0,1,3,2,2,1,0,1,0,1,0,0,1,3,1,1,2,0,0,1,0,1,0,0,2,2,1,1,0,1,0,1,2,1,2,0,0,1,0,2,1,3,2,0,2,0,2,0,1,0,0,1,1,0,1,1,2,3,0,2,0,0,1,0,2,0,0,2,2,0,1,0,1,1,0,1,1,3,0,1,1,2,2,0,1,2,1,0,0,1,0,1,0,1,2,1,0,1,0,0,0,0,1,3,1,0,2,5,3,0,1,2,2,1,1,2,1,1,5,0,1,0,2,0,0,0,0,2,2,1,1,0,2,0,3,0,0,1,1,0,0,1,2,0,1,1,1,1,0,0,0,2,0,0,2,0,0,4,1,2,0,1,2,2,1,0,2,3,1,0,2,1,1,1,0,0,2,2,0,1,1,0,3,0,1,0,2,1,1,0,0,1,2,1,1,1,0,1,2,0,4,0,0,1,0,1,2,1,1,1,1,0,0,0,0,1,1,0,2,0,0,2,1,2,1,0,3,0,0,1,0,0,0,0,0,1,2,3,2,0,0,1,0,1,2,2,3,1,1,2,3,1,1,0,0,0,1,2,1,1,0,1,0,0,1,0,1,1,1,0,5,0,1,1,1,0,0,1,1,0,2,0,0,1,3,0,5,1,0,0,1,0,0,0,0,0,0,0,0,1,2,1,2,1,0,1,1,0,1,0,0,1,1,1,1,0,1,2,0,2,0,2,1,0,0,0,0,1,0,1,2,2,1,1,1,0,1,1,0,1,1,2,0,1,2,4,3,1,0,1,0,1,1,0,2,2,1,0,2,1,1,0,2,1,0,2,0,1,2,0,1,2,1,3,0,0,0,1,0,0,0,3,0,1,2,0,0,0,1,2,1,0,1,4,1,0,1,1,0,1,1,1,2,1,0,2,3,1,1,2,0,0,2,1,1,0,0,1,3,1,2,3,0,0,3,2,0,0,2,0,2,2,0,1,0,1,2,1,2,2,1,2,0,2,3,0,3,0,1,0,1,0,2,1,2,0,1,2,0,0,0,1,2,1,1,1,0,1,0,2,2,0,0,1,4,0,3,0,1,2,0,2,1,4,3,0,1,1,0,2,2,2,0,1,1,0,1,0,0,1,1,0,1,2,0,0,0,1,2,2,0,1,1,0,2,1,3,2,1,1,0,1,2,0,0,5,1,0,0,2,0,0,0,0,4,1,1,3,1,2,3,1,4,1,0,2,0,0,0,0,0,2,0,1,1,0,2,2,0,1,0,0,2,2,0,0,2,2,1,0,1,1,1,0,2,2,1,3,0,0,3,2,3,0,0,1,0,0,2,0,0,2,0,2,0,0,1,4,1,0,0,1,0,2,1,1,1,1,0,3,1,0,0,0,3,1,0,1,1,0,0,1,2,0,0,0,2,3,0,2,0,2,0,1,0,2,1,0,4,2,0,2,0,1,0,1,1,2,0,1,0,0,0,1,0,1,2,1,1,0,1,1,2,0,1,0,0,1,3,2,0,1,0,0,2,1,0,0,0,1,0,0,1,0,1,1,2,1,2,2,1,1,2,0,2,1,0,1,0,0,1,0,0,0,2,1,3,0,0,0,1,2,0,1,1,1,1,1,1,1,0,1,2,0,0,0,2,2,1,1,1,1,1,1,2,1,1,0,3,3,0,1,1,0,3,1,2,2,1,1,1,1,0,2,0,1,0,0,0,2,0,1,1,0,0,1,1,4,2,0,0,0,1,1,0,1,0,1,3,1,1,3,2,1,0,0,2,0,2,1,0,0,0,1,1,0,1,2,0,2,1,1,1,2,1,1,0,1,0,0,0,1,0,1,1,1,1,0,0,2,5,0,1,2,1,0,1,0,0,0,2,0,2,3,0,1,1,1,1,1,0,1,0,1,1,1,0,0,0,0,2,2,1,0,0,0,1,0,0,4,0,2,1,0,1,0,1,0,0,0,2,0,1,1,2,1,0,1,0,2,0,0,1,0,2,2,2,0,3,0,1,1,0,2,1,1,2,0,1,2,1,1,1,0,2,1,2,1,0,0,1,2,0,0,2,1,0,1,1,3,1,3,1,0,1,1,0,0,3,1,0,0,2,4,0,1,3,1,1,0,0,0,1,0,0,0,0,0,0,0,0,1,2,0,0,0,2,0,0,1,4,1,0,2,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,2,1,0,0,2,2,2,5,0,1,1,2,1,1,0,0,1,0,1,0,1,1,1,2,0,0,2,0,0,2,0,1,2,0,1,0,1,2,2,2,1,0,0,2,1,1,3,0,1,0,0,0,0,0,1,3,1,2,1,0,0,0,2,0,1,0,2,1,1,3,0,1,2,1,5,0,1,1,0,0,0,2,0,0,2,0,1,3,0,0,3,1,1,0,1,1,1,0,1,1,2,0,1,0,1,1,0,2,4,1,0,1,4,1,4,3,1,0,4,1,1,1,1,1,1,1,0,0,1,1,0,1,0,2,0,0,0,0,2,3,0,0,0,1,2,0,1,1,2,1,0,0,2,2,1,1,2,2,0,1,2,3,7,1,2,2,1,1,2,1,0,1,0,0,0,2,0,1,2,1,1,0,0,1,2,1,1,2,4,1,0,0,0,1,1,0,0,2,1,2,1,1,0,1,0,2,1,0,0,0,1,1,0,1,0,2,1,3,2,0,0,1,1,0,0,0,2,1,1,1,1,0,1,1,1,1,1,0,0,1,4,1,2,1,2,0,0,4,1,0,2,0,1,2,2,0,1,2,0,1,1,0,0,1,4,0,1,2,1,0,2,2,1,0,3,1,1,0,0,0,1,1,1,2,0,0,0,1,1,1,2,1,0,1,2,2,2,1,1,0,2,1,0,0,0,1,0,2,0,0,1,2,1,1,2,0,1,3,1,1,1,1,0,0,1,2,1,0,1,0,2,2,2,1,0,2,1,1,0,0,2,1,0,1,1,1,0,1,2,0,1,0,1,5,0,0,1,0,2,0,0,0,0,0,2,1,2,0,1,0,0,0,1,1,1,0,2,1,1,3,2,2,1,1,2,1,1,3,1,2,0,1,2,1,6,1,2,2,1,2,1,2,0,0,2,2,1,1,3,0,1,2,1,0,0,0,1,1,0,0,1,0,1,1,2,1,1,1,1,3,2,0,0,2,1,0,0,1,3,1,0,2,2,0,0,1,1,1,0,2,0,0,1,1,2,2,1,1,2,0,0,3,1,0,0,0,1,1,1,0,3,0,1,3,1,3,1,2,1,0,0,0,1,0,0,0,0,3,2,0,1,3,0,2,2,0,3,1,1,1,0,0,0,1,1,2,1,0,0,0,0,3,2,0,1,2,1,1,1,2,0,1,0,0,1,2,0,2,1,1,1,1,1,2,0,0,1,2,1,0,0,0,0,1,4,1,1,0,1,1,3,0,0,0,1,1,1,1,1,3,0,1,1,2,0,1,1,1,0,1,1,2,1,2,0,3,2,0,1,0,3,1,1,0,2,1,0,1,0,2,1,0,1,1,0,1,1,0,0,1,1,0,0,1,0,1,0,2,1,2,0,1,0,0,3,1,1,2,0,1,2,0,3,2,1,3,0,0,0,0,1,1,1,0,1,3,1,3,0,1,0,1,0,1,1,2,1,2,1,3,0,4,0,2,2,0,1,0,0,0,0,1,1,1,1,4,0,0,0,2,1,1,1,4,0,1,1,0,0,0,2,1,0,1,1]},{"counters":[2,1,0,3,1,1,0,0,2,0,2,2,3,1,1,3,1,1,0,0,0,1,1,1,0,0,1,1,3,0,3,3,0,0,1,0,0,0,0,1,2,0,0,1,0,3,2,0,2,3,1,0,1,0,2,1,3,1,1,0,2,1,2,1,3,1,3,0,0,0,1,2,3,0,1,1,1,0,1,1,0,1,1,2,1,2,1,1,3,0,1,0,2,0,1,1,0,1,1,0,0,1,2,2,1,2,2,1,1,0,1,0,1,1,1,0,0,0,0,1,1,3,0,1,1,2,0,0,1,0,0,1,2,0,0,1,1,2,1,0,1,1,0,1,3,0,0,0,2,0,1,1,0,0,0,0,0,2,0,0,0,4,0,1,0,1,0,2,2,3,1,0,1,0,0,0,0,3,0,1,0,1,1,1,1,0,1,0,1,2,3,0,0,1,2,1,3,0,0,1,1,1,0,1,0,1,0,0,1,0,1,1,1,1,0,1,0,1,1,0,2,0,0,2,0,0,1,0,1,1,2,0,0,1,1,1,1,1,2,2,1,0,1,0,1,2,3,0,0,0,1,2,1,0,2,2,1,0,0,0,2,0,1,0,0,2,1,0,4,1,2,0,0,1,1,2,1,1,2,1,0,2,0,1,1,0,1,0,0,2,0,4,1,2,3,0,1,3,1,1,0,0,1,0,1,0,0,2,0,1,1,1,0,0,0,1,0,0,0,2,0,1,0,0,0,1,0,2,0,0,2,0,2,1,0,0,1,1,1,0,1,1,3,0,1,2,2,2,2,2,0,3,1,3,1,1,3,0,1,1,1,5,2,3,0,1,2,2,1,0,3,0,2,0,0,2,0,4,1,1,1,0,2,0,0,0,1,1,0,1,0,5,0,2,0,3,0,1,0,1,3,1,0,2,2,0,0,2,0,1,0,1,0,3,0,0,3,1,0,1,2,1,0,1,1,0,0,2,0,1,1,3,2,1,0,0,1,2,2,1,2,2,0,2,1,3,0,0,0,2,1,0,1,1,3,1,1,1,0,2,2,0,2,2,2,2,1,1,1,1,1,1,1,2,2,2,1,0,0,2,0,1,0,2,2,1,0,0,0,1,0,1,0,0,0,3,0,1,0,0,0,1,0,0,1,1,2,0,1,0,1,4,3,1,1,2,1,1,0,1,3,1,0,1,1,3,0,2,1,2,0,2,0,2,0,0,0,1,2,1,1,0,1,1,3,0,1,1,1,1,1,1,0,0,0,0,0,2,0,3,1,1,0,2,0,1,4,1,2,2,2,0,1,2,1,0,0,0,3,0,0,0,1,0,0,1,1,1,2,1,0,0,1,3,0,0,1,3,2,0,1,1,1,0,1,1,0,2,0,0,1,0,1,0,1,2,0,2,1,1,0,0,0,2,1,0,2,1,1,0,3,1,2,1,1,4,1,2,0,0,2,1,0,0,0,0,3,0,1,1,2,3,0,2,0,3,3,1,1,0,0,0,2,1,1,0,1,1,0,2,1,2,2,2,3,0,0,1,0,0,1,1,3,0,0,0,1,1,0,1,1,0,0,3,0,0,1,0,0,0,1,1,0,2,1,1,4,0,0,0,0,1,0,2,3,0,1,0,1,4,2,1,0,0,0,1,2,1,5,0,2,1,0,0,1,0,1,0,0,1,1,0,0,1,2,1,0,1,2,1,1,2,0,2,2,1,0,1,1,3,2,2,0,0,0,2,1,1,0,1,0,0,0,0,1,1,1,0,1,0,1,1,2,1,1,1,0,1,2,1,4,1,1,2,0,1,1,0,1,0,0,1,0,0,0,0,2,0,1,0,1,0,0,1,0,0,1,0,0,2,1,2,0,2,0,0,1,4,0,0,1,1,3,1,0,0,1,5,2,0,0,1,1,2,0,1,1,1,0,3,2,0,1,2,1,0,1,0,0,0,0,4,0,2,0,1,0,1,1,1,2,1,2,1,2,2,0,0,2,1,0,0,0,2,0,1,0,4,1,1,0,0,1,0,1,1,0,1,2,1,1,4,1,1,0,0,1,0,1,0,0,2,2,1,2,2,1,0,0,1,3,0,1,0,0,1,1,1,0,0,0,1,0,2,2,0,1,1,2,2,1,1,0,0,2,0,1,1,0,1,1,3,1,1,0,2,0,0,1,3,2,2,1,0,0,2,0,2,0,0,1,2,1,1,1,1,0,0,2,1,3,1,2,0,1,2,1,1,1,2,0,2,1,0,1,2,1,0,2,1,0,1,1,1,1,0,3,2,0,2,1,1,3,0,2,0,0,1,0,0,0,0,1,1,0,3,0,1,1,0,4,1,1,0,0,0,2,1,0,0,0,1,1,2,4,2,2,1,0,0,2,1,3,1,0,0,1,0,1,3,0,0,1,2,2,0,0,0,0,1,2,0,1,1,0,3,1,1,1,2,0,0,0,0,1,2,3,2,0,1,2,1,1,0,0,1,0,0,3,0,0,0,2,0,2,2,0,0,0,3,0,0,0,1,0,2,2,0,0,2,1,2,0,1,0,0,2,0,0,3,0,1,1,1,0,1,1,1,1,2,0,0,1,0,1,1,0,0,0,3,1,1,1,0,1,1,0,1,2,1,1,2,2,1,1,2,1,1,3,0,1,0,3,2,1,1,0,1,0,2,0,2,1,0,1,0,1,1,0,0,2,1,1,0,2,0,2,2,0,2,1,2,2,4,2,3,0,0,0,3,1,1,1,1,1,1,1,0,1,0,4,3,0,0,1,1,2,0,1,0,1,2,1,1,4,2,0,0,0,0,0,1,1,2,2,1,1,0,1,2,1,0,1,1,1,2,0,1,2,1,0,1,0,1,1,1,1,1,0,1,2,0,3,0,0,0,0,0,0,0,0,1,2,1,2,3,0,0,2,1,2,2,2,2,0,3,1,0,1,0,0,0,1,1,0,2,3,1,1,1,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,2,0,1,0,3,0,0,1,0,1,1,2,1,2,0,0,0,0,3,3,0,0,1,3,2,1,1,1,0,1,1,2,0,3,0,0,1,2,1,1,1,0,0,1,1,1,0,2,2,1,0,3,2,1,0,1,0,0,0,1,1,1,1,1,1,2,0,1,1,1,1,2,2,0,0,0,1,2,0,1,1,1,1,0,0,2,0,0,2,1,1,1,1,3,3,1,0,1,1,2,0,1,2,1,3,2,0,0,2,1,4,0,2,1,1,0,0,0,1,0,1,0,1,0,0,2,0,1,3,0,1,2,0,1,0,2,0,0,1,1,0,0,1,1,2,2,0,2,1,2,1,3,1,1,1,0,3,4,0,1,0,1,2,1,1,0,2,2,0,1,0,1,1,1,1,1,0,1,0,0,1,0,0,0,2,0,2,0,1,0,0,2,1,2,0,1,0,2,1,0,1,0,0,2,3,1,1,3,0,0,1,0,0,1,0,0,1,3,1,3,2,0,0,1,2,0,2,0,1,2,0,1,0,1,2,0,1,0,0,1,2,0,0,1,1,1,1,1,2,0,1,1,0,1,0,2,0,1,0,0,1,0,0,4,1,0,4,2,2,2,2,2,1,2,0,5,2,1,2,0,3,0,0,0,0,1,0,1,2,1,1,0,3,1,2,3,1,0,0,1,1,2,0,0,3,2,1,1,0,2,1,1,1,2,1,0,4,1,1,0,1,1,0,0,1,1,1,0,1,0,1,1,0,0,1,2,0,0,0,1,2,1,0,1,0,2,2,1,1,0,3,1,0,1,2,0,2,1,0,0,1,1,1,1,2,3,1,0,1,1,0,0,3,1,1,2,1,2,0,0,2,2,0,2,0,1,1,2,1,2,0,0,0,0,0,1,2,1,2,1,2,0,1,0,0,1,1,1,0,0,2,1,0,0,1,1,0,1,1,1,1,0,1,1,0,1,3,2,0,0,3,1,1,3,0,0,0,1,1,1,2,1,2,1,0,1,2,2,0,0,0,1,1,1,1,1,0,0,0,0,2,1,0,1,4,0,1,1,0,1,2,1,1,0,2,0,2,3,1,2,0,0,2,2,0,1,0,1,0,1,0,0,0,1,2,0,0,1,0,1,0,2,1,1,2,2,1,0,3,0,0,0,1,0,1,1,0,0,4,2,1,0,2,1,2,0,1,1,2,1,3,2,1,0,1,0,1,0,2,2,2,0,0,1,3,2,1,1,0,1,1,2,1,1,2,2,3,1,0,0,0,0,1,4,0,0,1,1,0,1,1,2,3,0,0,2,1,0,2,0,1,0,0,1,3,2,1,2,0,3,1,2,0,1,3,3,3,0,0,1,0,3,1,0,2,0,0,1,1,0,1,0,1,0,1,1,1,0,1,1,2,1,0,0,1,0,0,1,2,4,1,2,0,2,0,2,3,1,1,2,1,1,1,0,2,0,1,0,0,1,1,2,1,1,1,3,0,1,0,3,1,1,1,1,3,1,1,1,1,0,2,1,1,0,0,0,1,0,0,0,1,1,0,0,0,1,0,1,3,2,2,3,2,3,1,2,2,1,2,0,2,1,1,0,0,2,1,1,0,1,1,0,3,1,0,1,1,1,1,0,2,0,1]}]},"null_count":0,"last_update_version":397952040712273920}},"indices":{"cid":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"BAAAAAAAQBpv","upper_bound":"BAAAAAAAt0vL","repeats":1},{"count":16,"lower_bound":"BAAAAAAAuHpz","upper_bound":"BAAAAAAA6S/R","repeats":1},{"count":24,"lower_bound":"BAAAAAABB0CE","upper_bound":"BAAAAAACEqdB","repeats":1},{"count":32,"lower_bound":"BAAAAAACIDgJ","upper_bound":"BAAAAAADG+3w","repeats":1},{"count":40,"lower_bound":"BAAAAAADJ+wF","upper_bound":"BAAAAAADpwc1","repeats":1},{"count":48,"lower_bound":"BAAAAAAD0O3D","upper_bound":"BAAAAAAEavXG","repeats":1},{"count":56,"lower_bound":"BAAAAAAEkUn+","upper_bound":"BAAAAAAFblAc","repeats":1},{"count":64,"lower_bound":"BAAAAAAFhUIs","upper_bound":"BAAAAAAGA5IM","repeats":1},{"count":72,"lower_bound":"BAAAAAAGI5C6","upper_bound":"BAAAAAAG6VI9","repeats":1},{"count":80,"lower_bound":"BAAAAAAHIT0c","upper_bound":"BAAAAAAH98PW","repeats":1},{"count":88,"lower_bound":"BAAAAAAIEYYq","upper_bound":"BAAAAAAJDrNF","repeats":1},{"count":96,"lower_bound":"BAAAAAAJNEQV","upper_bound":"BAAAAAAKB0Ob","repeats":1},{"count":104,"lower_bound":"BAAAAAAKF7di","upper_bound":"BAAAAAAKy5AZ","repeats":1},{"count":112,"lower_bound":"BAAAAAAK4RM7","upper_bound":"BAAAAAALnvaR","repeats":1},{"count":120,"lower_bound":"BAAAAAALq/zA","upper_bound":"BAAAAAAMs/Jn","repeats":1},{"count":128,"lower_bound":"BAAAAAAMurSB","upper_bound":"BAAAAAAOOoAD","repeats":1},{"count":136,"lower_bound":"BAAAAAAOOuNJ","upper_bound":"BAAAAAAO9AV4","repeats":1},{"count":144,"lower_bound":"BAAAAAAPMh6H","upper_bound":"BAAAAAAQD2O1","repeats":1},{"count":152,"lower_bound":"BAAAAAAQdDbj","upper_bound":"BAAAAAAQ/82R","repeats":1},{"count":160,"lower_bound":"BAAAAAARPoL8","upper_bound":"BAAAAAAR6Byy","repeats":1},{"count":168,"lower_bound":"BAAAAAASEg7E","upper_bound":"BAAAAAATt/in","repeats":1},{"count":176,"lower_bound":"BAAAAAAUGg6A","upper_bound":"BAAAAAAUzhhE","repeats":1},{"count":184,"lower_bound":"BAAAAAAU6uS7","upper_bound":"BAAAAAAVjLRh","repeats":1},{"count":192,"lower_bound":"BAAAAAAVjy3y","upper_bound":"BAAAAAAWE27L","repeats":1},{"count":200,"lower_bound":"BAAAAAAWKAjK","upper_bound":"BAAAAAAXIPyc","repeats":1},{"count":208,"lower_bound":"BAAAAAAXJUut","upper_bound":"BAAAAAAXxoFI","repeats":1},{"count":216,"lower_bound":"BAAAAAAX4dZN","upper_bound":"BAAAAAAYSCfL","repeats":1},{"count":224,"lower_bound":"BAAAAAAYaqPP","upper_bound":"BAAAAAAYzcjb","repeats":1},{"count":232,"lower_bound":"BAAAAAAZMn/Y","upper_bound":"BAAAAAAaCbq/","repeats":1},{"count":240,"lower_bound":"BAAAAAAaDtUA","upper_bound":"BAAAAAAa8jX/","repeats":1},{"count":248,"lower_bound":"BAAAAAAbBTc/","upper_bound":"BAAAAAAbW7BV","repeats":1},{"count":256,"lower_bound":"BAAAAAAbayeh","upper_bound":"BAAAAAAcyhjD","repeats":1},{"count":264,"lower_bound":"BAAAAAAc1uKO","upper_bound":"BAAAAAAegdei","repeats":1},{"count":272,"lower_bound":"BAAAAAAejQI7","upper_bound":"BAAAAAAfBpzP","repeats":1},{"count":280,"lower_bound":"BAAAAAAfFJcZ","upper_bound":"BAAAAAAfj03d","repeats":1},{"count":288,"lower_bound":"BAAAAAAfvBM2","upper_bound":"BAAAAAAg4ed5","repeats":1},{"count":296,"lower_bound":"BAAAAAAg6Yzw","upper_bound":"BAAAAAAiSvG8","repeats":1},{"count":304,"lower_bound":"BAAAAAAieUzh","upper_bound":"BAAAAAAjLPF9","repeats":1},{"count":312,"lower_bound":"BAAAAAAjOY94","upper_bound":"BAAAAAAkRFos","repeats":1},{"count":320,"lower_bound":"BAAAAAAkSA2b","upper_bound":"BAAAAAAlOMnq","repeats":1},{"count":328,"lower_bound":"BAAAAAAljgHN","upper_bound":"BAAAAAAmRoz4","repeats":1},{"count":336,"lower_bound":"BAAAAAAmTBoA","upper_bound":"BAAAAAAnCYVK","repeats":1},{"count":344,"lower_bound":"BAAAAAAnNDmh","upper_bound":"BAAAAAAoSLFF","repeats":1},{"count":352,"lower_bound":"BAAAAAAoSTNO","upper_bound":"BAAAAAApCML2","repeats":1},{"count":360,"lower_bound":"BAAAAAApCXb5","upper_bound":"BAAAAAAqGD4U","repeats":1},{"count":368,"lower_bound":"BAAAAAAqMSQ/","upper_bound":"BAAAAAAqtrCq","repeats":1},{"count":376,"lower_bound":"BAAAAAAqw4sK","upper_bound":"BAAAAAAsKk9X","repeats":1},{"count":384,"lower_bound":"BAAAAAAsXo20","upper_bound":"BAAAAAAs85k/","repeats":1},{"count":392,"lower_bound":"BAAAAAAtGnte","upper_bound":"BAAAAAAt4mTF","repeats":1},{"count":400,"lower_bound":"BAAAAAAuPML/","upper_bound":"BAAAAAAuhdAQ","repeats":1},{"count":408,"lower_bound":"BAAAAAAumocr","upper_bound":"BAAAAAAvde0i","repeats":1},{"count":416,"lower_bound":"BAAAAAAvfsz1","upper_bound":"BAAAAAAw5YGn","repeats":1},{"count":424,"lower_bound":"BAAAAAAxLcO4","upper_bound":"BAAAAAAylFjN","repeats":1},{"count":432,"lower_bound":"BAAAAAAyohQy","upper_bound":"BAAAAAAzFrQ9","repeats":1},{"count":440,"lower_bound":"BAAAAAAzcRQ8","upper_bound":"BAAAAAA1F1R/","repeats":1},{"count":448,"lower_bound":"BAAAAAA1NRqP","upper_bound":"BAAAAAA1/BE6","repeats":1},{"count":456,"lower_bound":"BAAAAAA2AWvy","upper_bound":"BAAAAAA2sIe8","repeats":1},{"count":464,"lower_bound":"BAAAAAA2vHHm","upper_bound":"BAAAAAA38uAi","repeats":1},{"count":472,"lower_bound":"BAAAAAA3+cmW","upper_bound":"BAAAAAA4fdL6","repeats":1},{"count":480,"lower_bound":"BAAAAAA4qXai","upper_bound":"BAAAAAA5PZSC","repeats":1},{"count":488,"lower_bound":"BAAAAAA5TFRz","upper_bound":"BAAAAAA62sZW","repeats":1},{"count":496,"lower_bound":"BAAAAAA7JtcJ","upper_bound":"BAAAAAA8WHnu","repeats":1},{"count":504,"lower_bound":"BAAAAAA8Zp0F","upper_bound":"BAAAAAA9VIli","repeats":1},{"count":512,"lower_bound":"BAAAAAA9W+7q","upper_bound":"BAAAAAA+Ex1i","repeats":1},{"count":520,"lower_bound":"BAAAAAA+J7XR","upper_bound":"BAAAAAA/sdZ7","repeats":1},{"count":528,"lower_bound":"BAAAAAA/v+PV","upper_bound":"BAAAAABAdEbx","repeats":1},{"count":536,"lower_bound":"BAAAAABArJfB","upper_bound":"BAAAAABBi/5a","repeats":1},{"count":544,"lower_bound":"BAAAAABBwD3y","upper_bound":"BAAAAABDJVz3","repeats":1},{"count":552,"lower_bound":"BAAAAABD0lDN","upper_bound":"BAAAAABEaA54","repeats":1},{"count":560,"lower_bound":"BAAAAABEoUwB","upper_bound":"BAAAAABF7UOV","repeats":1},{"count":568,"lower_bound":"BAAAAABGE5as","upper_bound":"BAAAAABHnDHi","repeats":1},{"count":576,"lower_bound":"BAAAAABH2Umn","upper_bound":"BAAAAABI6XdE","repeats":1},{"count":584,"lower_bound":"BAAAAABJAIDs","upper_bound":"BAAAAABKOvy5","repeats":1},{"count":592,"lower_bound":"BAAAAABKbcGA","upper_bound":"BAAAAABK2HoE","repeats":1},{"count":600,"lower_bound":"BAAAAABK53Gv","upper_bound":"BAAAAABMcYXJ","repeats":1},{"count":608,"lower_bound":"BAAAAABMqL0X","upper_bound":"BAAAAABNMvl4","repeats":1},{"count":616,"lower_bound":"BAAAAABNNDqf","upper_bound":"BAAAAABOZtr1","repeats":1},{"count":624,"lower_bound":"BAAAAABOepUz","upper_bound":"BAAAAABPgGc1","repeats":1},{"count":632,"lower_bound":"BAAAAABPqPbY","upper_bound":"BAAAAABQOBOq","repeats":1},{"count":640,"lower_bound":"BAAAAABQddWc","upper_bound":"BAAAAABRSc2O","repeats":1},{"count":648,"lower_bound":"BAAAAABRWwHX","upper_bound":"BAAAAABSZEZ+","repeats":1},{"count":656,"lower_bound":"BAAAAABSiJzJ","upper_bound":"BAAAAABUHPOK","repeats":1},{"count":664,"lower_bound":"BAAAAABULP20","upper_bound":"BAAAAABUyCT5","repeats":1},{"count":672,"lower_bound":"BAAAAABU3F+a","upper_bound":"BAAAAABVfYxI","repeats":1},{"count":680,"lower_bound":"BAAAAABVmCav","upper_bound":"BAAAAABWczn+","repeats":1},{"count":688,"lower_bound":"BAAAAABWf+Aq","upper_bound":"BAAAAABXryWU","repeats":1},{"count":696,"lower_bound":"BAAAAABXsHNw","upper_bound":"BAAAAABZGhRK","repeats":1},{"count":704,"lower_bound":"BAAAAABZQ7Vx","upper_bound":"BAAAAABZyBXw","repeats":1},{"count":712,"lower_bound":"BAAAAABaA1cP","upper_bound":"BAAAAABbeYxN","repeats":1},{"count":720,"lower_bound":"BAAAAABbpVo3","upper_bound":"BAAAAABdEHi9","repeats":1},{"count":728,"lower_bound":"BAAAAABdZFGv","upper_bound":"BAAAAABecXiS","repeats":1},{"count":736,"lower_bound":"BAAAAABesOPw","upper_bound":"BAAAAABfTSts","repeats":1},{"count":744,"lower_bound":"BAAAAABfXMLF","upper_bound":"BAAAAABfur0C","repeats":1},{"count":752,"lower_bound":"BAAAAABfuxrz","upper_bound":"BAAAAABgWAh8","repeats":1},{"count":760,"lower_bound":"BAAAAABgbTpG","upper_bound":"BAAAAABhUeN2","repeats":1},{"count":768,"lower_bound":"BAAAAABhaXVx","upper_bound":"BAAAAABiZxRj","repeats":1},{"count":776,"lower_bound":"BAAAAABig1an","upper_bound":"BAAAAABjbHma","repeats":1},{"count":784,"lower_bound":"BAAAAABjeYgv","upper_bound":"BAAAAABkVnnd","repeats":1},{"count":792,"lower_bound":"BAAAAABkZk+e","upper_bound":"BAAAAABlnH6x","repeats":1},{"count":800,"lower_bound":"BAAAAABmAFLC","upper_bound":"BAAAAABmiA1g","repeats":1},{"count":808,"lower_bound":"BAAAAABmpK3i","upper_bound":"BAAAAABnuRdW","repeats":1},{"count":816,"lower_bound":"BAAAAABn9Cq5","upper_bound":"BAAAAABoq0/C","repeats":1},{"count":824,"lower_bound":"BAAAAABosUIk","upper_bound":"BAAAAABpBThU","repeats":1},{"count":832,"lower_bound":"BAAAAABpEsDC","upper_bound":"BAAAAABpat6N","repeats":1},{"count":840,"lower_bound":"BAAAAABpnG3K","upper_bound":"BAAAAABqnjUI","repeats":1},{"count":848,"lower_bound":"BAAAAABqsgHu","upper_bound":"BAAAAABsBUTG","repeats":1},{"count":856,"lower_bound":"BAAAAABsC3AU","upper_bound":"BAAAAABtC2F7","repeats":1},{"count":864,"lower_bound":"BAAAAABtDpqu","upper_bound":"BAAAAABtsSnn","repeats":1},{"count":872,"lower_bound":"BAAAAABtt5IT","upper_bound":"BAAAAABvQz5c","repeats":1},{"count":880,"lower_bound":"BAAAAABvTt8t","upper_bound":"BAAAAABwjYv9","repeats":1},{"count":888,"lower_bound":"BAAAAABxMgrl","upper_bound":"BAAAAAByLuY/","repeats":1},{"count":896,"lower_bound":"BAAAAAByL8B4","upper_bound":"BAAAAABz90FI","repeats":1},{"count":904,"lower_bound":"BAAAAAB0SJ3D","upper_bound":"BAAAAAB09rqs","repeats":1},{"count":912,"lower_bound":"BAAAAAB1NidI","upper_bound":"BAAAAAB1t3yB","repeats":1},{"count":920,"lower_bound":"BAAAAAB1wSgq","upper_bound":"BAAAAAB24VF/","repeats":1},{"count":928,"lower_bound":"BAAAAAB29Abm","upper_bound":"BAAAAAB31fGB","repeats":1},{"count":936,"lower_bound":"BAAAAAB325EN","upper_bound":"BAAAAAB5Bbfb","repeats":1},{"count":944,"lower_bound":"BAAAAAB5CSG4","upper_bound":"BAAAAAB6SCTv","repeats":1},{"count":952,"lower_bound":"BAAAAAB6ZovX","upper_bound":"BAAAAAB7G5lw","repeats":1},{"count":960,"lower_bound":"BAAAAAB7oyZ5","upper_bound":"BAAAAAB8ZhDw","repeats":1},{"count":968,"lower_bound":"BAAAAAB8isql","upper_bound":"BAAAAAB87Ksv","repeats":1},{"count":976,"lower_bound":"BAAAAAB9GXf4","upper_bound":"BAAAAAB9/4Kc","repeats":1},{"count":984,"lower_bound":"BAAAAAB+BIwY","upper_bound":"BAAAAAB/UyGs","repeats":1},{"count":992,"lower_bound":"BAAAAAB/U4Hr","upper_bound":"BAAAAAB/6WcG","repeats":1},{"count":1000,"lower_bound":"BAAAAAB/97sV","upper_bound":"BAAAAACA2QI1","repeats":1},{"count":1008,"lower_bound":"BAAAAACA+ylH","upper_bound":"BAAAAACB0RxK","repeats":1},{"count":1016,"lower_bound":"BAAAAACB5xj1","upper_bound":"BAAAAACCdSeR","repeats":1},{"count":1024,"lower_bound":"BAAAAACCiQtB","upper_bound":"BAAAAACDYaqp","repeats":1},{"count":1032,"lower_bound":"BAAAAACDc6xs","upper_bound":"BAAAAACEoL8A","repeats":1},{"count":1040,"lower_bound":"BAAAAACE3A/l","upper_bound":"BAAAAACFSdcC","repeats":1},{"count":1048,"lower_bound":"BAAAAACFsram","upper_bound":"BAAAAACGmk2V","repeats":1},{"count":1056,"lower_bound":"BAAAAACGry6N","upper_bound":"BAAAAACH1vsb","repeats":1},{"count":1064,"lower_bound":"BAAAAACH6yea","upper_bound":"BAAAAACI38E2","repeats":1},{"count":1072,"lower_bound":"BAAAAACI4MVp","upper_bound":"BAAAAACKA6mK","repeats":1},{"count":1080,"lower_bound":"BAAAAACKXO/1","upper_bound":"BAAAAACLWXoY","repeats":1},{"count":1088,"lower_bound":"BAAAAACLZ3gl","upper_bound":"BAAAAACMrN+F","repeats":1},{"count":1096,"lower_bound":"BAAAAACM53LF","upper_bound":"BAAAAACNv5us","repeats":1},{"count":1104,"lower_bound":"BAAAAACN5xxi","upper_bound":"BAAAAACOSQy3","repeats":1},{"count":1112,"lower_bound":"BAAAAACOSbOa","upper_bound":"BAAAAACO8H+F","repeats":1},{"count":1120,"lower_bound":"BAAAAACPI/PA","upper_bound":"BAAAAACQqTDk","repeats":1},{"count":1128,"lower_bound":"BAAAAACQsksa","upper_bound":"BAAAAACRjx4/","repeats":1},{"count":1136,"lower_bound":"BAAAAACRnMQS","upper_bound":"BAAAAACSxPrK","repeats":1},{"count":1144,"lower_bound":"BAAAAACS4hv2","upper_bound":"BAAAAACUCHVc","repeats":1},{"count":1152,"lower_bound":"BAAAAACUU4mQ","upper_bound":"BAAAAACVHDr+","repeats":1},{"count":1160,"lower_bound":"BAAAAACVQAV2","upper_bound":"BAAAAACWATYi","repeats":1},{"count":1168,"lower_bound":"BAAAAACWJtJ0","upper_bound":"BAAAAACXBQLe","repeats":1},{"count":1176,"lower_bound":"BAAAAACXJnXe","upper_bound":"BAAAAACXtR0w","repeats":1},{"count":1184,"lower_bound":"BAAAAACXvkPR","upper_bound":"BAAAAACY3SnH","repeats":1},{"count":1192,"lower_bound":"BAAAAACZAJmg","upper_bound":"BAAAAACaTB96","repeats":1},{"count":1200,"lower_bound":"BAAAAACaUZ+E","upper_bound":"BAAAAACaqdPc","repeats":1},{"count":1208,"lower_bound":"BAAAAACaujmu","upper_bound":"BAAAAACbHkdW","repeats":1},{"count":1216,"lower_bound":"BAAAAACbNYu6","upper_bound":"BAAAAACbzgRr","repeats":1},{"count":1224,"lower_bound":"BAAAAACb8L74","upper_bound":"BAAAAACcsEwK","repeats":1},{"count":1232,"lower_bound":"BAAAAACc+04Z","upper_bound":"BAAAAACdz9Pn","repeats":1},{"count":1240,"lower_bound":"BAAAAACd06Jt","upper_bound":"BAAAAACesP9J","repeats":1},{"count":1248,"lower_bound":"BAAAAACe38+F","upper_bound":"BAAAAACgKcIj","repeats":1},{"count":1256,"lower_bound":"BAAAAACgOXF2","upper_bound":"BAAAAAChD2rW","repeats":1},{"count":1264,"lower_bound":"BAAAAAChGbCW","upper_bound":"BAAAAAChlazb","repeats":1},{"count":1272,"lower_bound":"BAAAAAChmNXz","upper_bound":"BAAAAACiG6nV","repeats":1},{"count":1280,"lower_bound":"BAAAAACib9+Q","upper_bound":"BAAAAACjdvBo","repeats":1},{"count":1288,"lower_bound":"BAAAAACjthlN","upper_bound":"BAAAAACku+T4","repeats":1},{"count":1296,"lower_bound":"BAAAAACkwajv","upper_bound":"BAAAAAClYBOf","repeats":1},{"count":1304,"lower_bound":"BAAAAAClbO7z","upper_bound":"BAAAAAClxtvn","repeats":1},{"count":1312,"lower_bound":"BAAAAACl+5oF","upper_bound":"BAAAAACnwDXN","repeats":1},{"count":1320,"lower_bound":"BAAAAACnxiif","upper_bound":"BAAAAACpACSt","repeats":1},{"count":1328,"lower_bound":"BAAAAACpFrGd","upper_bound":"BAAAAACrN4ZL","repeats":1},{"count":1336,"lower_bound":"BAAAAACrfEQr","upper_bound":"BAAAAACsZctD","repeats":1},{"count":1344,"lower_bound":"BAAAAACsl+K0","upper_bound":"BAAAAACtYY21","repeats":1},{"count":1352,"lower_bound":"BAAAAACtYeD4","upper_bound":"BAAAAACuAjqh","repeats":1},{"count":1360,"lower_bound":"BAAAAACuFFU/","upper_bound":"BAAAAACu7F9K","repeats":1},{"count":1368,"lower_bound":"BAAAAACvEpj+","upper_bound":"BAAAAACveFh4","repeats":1},{"count":1376,"lower_bound":"BAAAAACvhqU6","upper_bound":"BAAAAACwvw+k","repeats":1},{"count":1384,"lower_bound":"BAAAAACwzdK8","upper_bound":"BAAAAACyAnuE","repeats":1},{"count":1392,"lower_bound":"BAAAAACyIQag","upper_bound":"BAAAAACywgwf","repeats":1},{"count":1400,"lower_bound":"BAAAAACy0THt","upper_bound":"BAAAAACzuPPC","repeats":1},{"count":1408,"lower_bound":"BAAAAAC0d5Yl","upper_bound":"BAAAAAC0y+AP","repeats":1},{"count":1416,"lower_bound":"BAAAAAC1JCc0","upper_bound":"BAAAAAC14xcx","repeats":1},{"count":1424,"lower_bound":"BAAAAAC1++Bs","upper_bound":"BAAAAAC2zqTt","repeats":1},{"count":1432,"lower_bound":"BAAAAAC26dNP","upper_bound":"BAAAAAC3/RaA","repeats":1},{"count":1440,"lower_bound":"BAAAAAC4A+ih","upper_bound":"BAAAAAC4s5e1","repeats":1},{"count":1448,"lower_bound":"BAAAAAC4vNMC","upper_bound":"BAAAAAC5f0kK","repeats":1},{"count":1456,"lower_bound":"BAAAAAC5u+nB","upper_bound":"BAAAAAC6fF8X","repeats":1},{"count":1464,"lower_bound":"BAAAAAC6pZqr","upper_bound":"BAAAAAC7OS5V","repeats":1},{"count":1472,"lower_bound":"BAAAAAC7Y/gf","upper_bound":"BAAAAAC8mEU0","repeats":1},{"count":1480,"lower_bound":"BAAAAAC8riBk","upper_bound":"BAAAAAC9pXt0","repeats":1},{"count":1488,"lower_bound":"BAAAAAC9tSQW","upper_bound":"BAAAAAC+U4MU","repeats":1},{"count":1496,"lower_bound":"BAAAAAC+iHk6","upper_bound":"BAAAAAC/jePB","repeats":1},{"count":1504,"lower_bound":"BAAAAAC/p+gC","upper_bound":"BAAAAADAflzQ","repeats":1},{"count":1512,"lower_bound":"BAAAAADAyCOk","upper_bound":"BAAAAADB7ZPn","repeats":1},{"count":1520,"lower_bound":"BAAAAADB7ku3","upper_bound":"BAAAAADCzqYu","repeats":1},{"count":1528,"lower_bound":"BAAAAADC4CzM","upper_bound":"BAAAAADDnNvt","repeats":1},{"count":1536,"lower_bound":"BAAAAADDpPl5","upper_bound":"BAAAAADEdPpj","repeats":1},{"count":1544,"lower_bound":"BAAAAADEdqRd","upper_bound":"BAAAAADFlfRP","repeats":1},{"count":1552,"lower_bound":"BAAAAADFvEOR","upper_bound":"BAAAAADGo7Os","repeats":1},{"count":1560,"lower_bound":"BAAAAADG1ZIj","upper_bound":"BAAAAADHizIE","repeats":1},{"count":1568,"lower_bound":"BAAAAADHttr8","upper_bound":"BAAAAADIH4YE","repeats":1},{"count":1576,"lower_bound":"BAAAAADIOktA","upper_bound":"BAAAAADIjwOY","repeats":1},{"count":1584,"lower_bound":"BAAAAADIr3XK","upper_bound":"BAAAAADJRMRs","repeats":1},{"count":1592,"lower_bound":"BAAAAADJVv7+","upper_bound":"BAAAAADJ0Vpa","repeats":1},{"count":1600,"lower_bound":"BAAAAADJ0tBe","upper_bound":"BAAAAADKmfmv","repeats":1},{"count":1608,"lower_bound":"BAAAAADKsa8T","upper_bound":"BAAAAADMCqEL","repeats":1},{"count":1616,"lower_bound":"BAAAAADML4+0","upper_bound":"BAAAAADNKYp/","repeats":1},{"count":1624,"lower_bound":"BAAAAADNQar/","upper_bound":"BAAAAADOf2Sd","repeats":1},{"count":1632,"lower_bound":"BAAAAADOii1f","upper_bound":"BAAAAADP56um","repeats":1},{"count":1640,"lower_bound":"BAAAAADQXsgA","upper_bound":"BAAAAADQhWyy","repeats":1},{"count":1648,"lower_bound":"BAAAAADQhb+Y","upper_bound":"BAAAAADRavEU","repeats":1},{"count":1656,"lower_bound":"BAAAAADR+n9p","upper_bound":"BAAAAADTA7Lk","repeats":1},{"count":1664,"lower_bound":"BAAAAADTHEL9","upper_bound":"BAAAAADTr7YX","repeats":1},{"count":1672,"lower_bound":"BAAAAADT/F8G","upper_bound":"BAAAAADUqvA+","repeats":1},{"count":1680,"lower_bound":"BAAAAADUvQtG","upper_bound":"BAAAAADWDEis","repeats":1},{"count":1688,"lower_bound":"BAAAAADWTXzB","upper_bound":"BAAAAADXekF4","repeats":1},{"count":1696,"lower_bound":"BAAAAADXhUbk","upper_bound":"BAAAAADYlare","repeats":1},{"count":1704,"lower_bound":"BAAAAADYqjAn","upper_bound":"BAAAAADZvKhQ","repeats":1},{"count":1712,"lower_bound":"BAAAAADZv8de","upper_bound":"BAAAAADaH8ys","repeats":1},{"count":1720,"lower_bound":"BAAAAADacuHs","upper_bound":"BAAAAADb1XNZ","repeats":1},{"count":1728,"lower_bound":"BAAAAADb9vPo","upper_bound":"BAAAAADdCU2n","repeats":1},{"count":1736,"lower_bound":"BAAAAADdDPcQ","upper_bound":"BAAAAADfDbvT","repeats":1},{"count":1744,"lower_bound":"BAAAAADfQllA","upper_bound":"BAAAAADfxr1Y","repeats":1},{"count":1752,"lower_bound":"BAAAAADf4CZ4","upper_bound":"BAAAAADgTjgG","repeats":1},{"count":1760,"lower_bound":"BAAAAADgWD21","upper_bound":"BAAAAADhfE9F","repeats":1},{"count":1768,"lower_bound":"BAAAAADhi2Gh","upper_bound":"BAAAAADiIjJk","repeats":1},{"count":1776,"lower_bound":"BAAAAADiJo3v","upper_bound":"BAAAAADi6+Gn","repeats":1},{"count":1784,"lower_bound":"BAAAAADjA2N1","upper_bound":"BAAAAADjgGvH","repeats":1},{"count":1792,"lower_bound":"BAAAAADjkP1I","upper_bound":"BAAAAADk/zuJ","repeats":1},{"count":1800,"lower_bound":"BAAAAADlCxFC","upper_bound":"BAAAAADl6TdR","repeats":1},{"count":1808,"lower_bound":"BAAAAADmI6zp","upper_bound":"BAAAAADn7rlY","repeats":1},{"count":1816,"lower_bound":"BAAAAADoGacH","upper_bound":"BAAAAADpK4mf","repeats":1},{"count":1824,"lower_bound":"BAAAAADpsaM6","upper_bound":"BAAAAADq1PKv","repeats":1},{"count":1832,"lower_bound":"BAAAAADq4gol","upper_bound":"BAAAAADsUyub","repeats":1},{"count":1840,"lower_bound":"BAAAAADspBmv","upper_bound":"BAAAAADtemWF","repeats":1},{"count":1848,"lower_bound":"BAAAAADtp74n","upper_bound":"BAAAAADuTXCp","repeats":1},{"count":1856,"lower_bound":"BAAAAADuVFwA","upper_bound":"BAAAAADuzkzf","repeats":1},{"count":1864,"lower_bound":"BAAAAADu5MN6","upper_bound":"BAAAAADvmqQk","repeats":1},{"count":1872,"lower_bound":"BAAAAADvobI+","upper_bound":"BAAAAADw94E9","repeats":1},{"count":1880,"lower_bound":"BAAAAADxAUNF","upper_bound":"BAAAAADyQiPi","repeats":1},{"count":1888,"lower_bound":"BAAAAADyeJCc","upper_bound":"BAAAAADy93GZ","repeats":1},{"count":1896,"lower_bound":"BAAAAADzADmT","upper_bound":"BAAAAADzWKUF","repeats":1},{"count":1904,"lower_bound":"BAAAAADzbYOr","upper_bound":"BAAAAAD0UoUg","repeats":1},{"count":1912,"lower_bound":"BAAAAAD0dqd+","upper_bound":"BAAAAAD1TcD7","repeats":1},{"count":1920,"lower_bound":"BAAAAAD1Um+J","upper_bound":"BAAAAAD2LrLA","repeats":1},{"count":1928,"lower_bound":"BAAAAAD2Mdhw","upper_bound":"BAAAAAD22Wdt","repeats":1},{"count":1936,"lower_bound":"BAAAAAD283M3","upper_bound":"BAAAAAD4NyB9","repeats":1},{"count":1944,"lower_bound":"BAAAAAD4gka6","upper_bound":"BAAAAAD6FNLf","repeats":1},{"count":1952,"lower_bound":"BAAAAAD6Ii8K","upper_bound":"BAAAAAD62JAo","repeats":1},{"count":1960,"lower_bound":"BAAAAAD695C9","upper_bound":"BAAAAAD7/8a8","repeats":1},{"count":1968,"lower_bound":"BAAAAAD8ESkt","upper_bound":"BAAAAAD86Y85","repeats":1},{"count":1976,"lower_bound":"BAAAAAD87UW0","upper_bound":"BAAAAAD9g7Xv","repeats":1},{"count":1984,"lower_bound":"BAAAAAD9kFI8","upper_bound":"BAAAAAD+LK6Z","repeats":1},{"count":1992,"lower_bound":"BAAAAAD+Rz7X","upper_bound":"BAAAAAD++oMs","repeats":1},{"count":2000,"lower_bound":"BAAAAAD/IsJf","upper_bound":"BAAAAAD//b7o","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,2,0,2,0,0,2,0,3,1,2,0,2,1,0,0,0,0,0,0,5,2,0,1,1,1,0,1,0,1,0,0,0,0,2,2,2,1,2,1,0,0,1,2,0,0,1,0,0,0,1,1,0,1,2,2,0,1,1,0,0,2,0,0,2,2,0,1,3,2,1,1,3,1,0,1,0,1,1,1,0,0,0,2,0,0,1,2,0,1,0,0,0,1,3,1,2,2,0,2,1,1,0,0,0,1,0,0,0,4,0,0,2,0,1,1,1,3,0,0,1,0,1,0,0,1,2,0,1,2,1,0,0,1,1,1,1,1,2,2,2,0,2,0,2,0,0,2,0,0,3,2,1,1,0,2,2,0,0,0,1,0,1,4,1,1,1,2,0,0,0,1,0,0,0,0,1,1,1,1,0,0,0,3,0,0,2,0,2,0,1,2,1,1,0,1,0,0,0,0,1,1,1,0,1,0,2,2,1,0,0,2,0,0,0,0,0,0,1,1,0,1,2,4,2,1,0,1,0,0,2,0,1,1,0,0,0,1,2,0,0,0,1,1,2,1,1,0,1,1,3,0,1,2,1,3,1,0,3,1,3,1,1,1,1,3,0,0,1,1,1,1,0,0,0,1,0,0,1,2,0,1,0,0,0,2,0,2,0,1,4,1,0,1,1,0,2,0,0,2,0,1,3,2,1,0,0,1,0,0,3,0,1,1,1,3,1,1,1,0,0,1,0,0,1,0,1,0,1,3,1,0,1,2,0,1,1,1,2,1,3,1,1,0,0,0,0,0,2,1,0,0,1,0,0,3,1,1,1,2,2,1,1,2,0,0,0,1,0,0,3,2,2,0,0,1,1,2,0,1,3,5,1,1,1,0,1,0,1,2,0,1,0,2,1,1,3,3,1,1,1,0,3,0,0,1,1,1,1,1,2,1,0,0,0,2,0,1,0,0,0,0,1,1,2,3,0,3,1,2,1,1,0,1,1,1,0,1,3,1,0,1,1,1,0,0,2,1,1,0,4,0,1,0,1,2,0,1,1,1,1,0,1,1,1,0,1,2,0,0,0,0,0,1,1,1,2,1,0,0,1,1,2,1,1,0,2,1,1,2,0,3,1,1,1,1,0,0,2,1,1,2,0,1,1,0,3,0,0,4,0,1,2,0,2,1,0,1,1,1,2,1,1,1,1,2,1,1,0,0,0,0,0,0,2,0,0,2,0,3,1,0,0,1,1,2,1,2,2,1,1,1,1,0,2,0,1,2,0,1,0,1,0,1,0,1,0,0,1,3,0,0,0,2,3,2,1,0,0,1,1,0,0,1,1,0,0,2,2,3,0,1,0,1,3,2,0,0,1,0,2,1,2,2,1,2,1,2,1,2,2,1,0,1,3,1,2,1,2,2,1,0,2,0,2,0,0,0,2,0,0,0,2,1,3,2,2,2,1,0,3,1,1,1,0,1,1,2,1,1,2,1,2,0,0,4,1,1,0,0,0,2,2,1,1,1,2,2,2,2,1,0,1,1,1,1,2,1,1,0,1,1,2,0,1,1,0,2,1,1,1,4,0,1,2,4,2,0,1,3,1,0,1,2,0,2,0,0,1,1,1,0,0,0,1,0,0,0,1,2,0,2,1,0,1,1,2,2,0,0,0,1,1,2,1,1,1,0,1,1,0,2,1,1,1,0,3,0,0,3,0,0,3,1,0,2,1,0,5,1,1,2,2,1,3,0,2,1,1,2,2,2,0,1,1,2,0,0,1,0,0,2,1,1,1,0,3,2,0,0,1,0,2,2,0,1,0,1,0,2,0,0,0,2,1,0,0,1,1,2,1,1,0,2,0,2,1,1,1,2,4,1,0,2,2,2,0,0,2,2,2,0,1,2,1,0,1,0,0,0,2,3,1,2,1,3,1,2,2,1,1,3,0,0,1,1,0,1,1,1,0,2,2,0,1,0,0,0,2,0,1,1,2,3,1,2,0,0,0,0,1,0,1,2,0,3,0,0,0,0,0,1,1,1,0,2,0,0,1,0,2,1,0,0,1,2,0,1,0,0,0,1,0,0,1,0,2,2,3,0,1,1,0,1,0,2,0,2,2,1,0,2,0,1,1,0,0,1,1,0,0,0,0,2,1,0,0,0,3,1,1,2,1,2,1,1,3,0,1,1,1,0,0,2,1,1,0,0,0,3,0,2,1,4,0,1,0,1,2,1,1,1,0,1,0,0,1,2,0,1,0,1,1,1,2,1,2,2,1,2,1,2,1,1,0,1,0,0,0,2,0,0,0,3,1,0,0,2,0,1,2,1,0,2,1,1,1,3,2,0,1,0,0,2,0,0,1,0,1,0,1,0,2,1,1,0,0,1,0,1,1,0,1,1,0,2,1,0,1,1,2,1,2,4,0,1,1,1,0,1,0,1,0,2,2,1,0,1,1,2,3,2,0,3,2,1,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,1,3,0,0,0,1,1,1,2,0,2,1,0,1,1,0,2,1,0,2,0,1,1,1,1,1,0,0,0,0,0,1,2,1,0,0,1,5,1,0,1,1,0,0,1,1,1,2,1,2,1,2,1,4,0,1,1,1,1,1,0,0,1,4,3,0,3,0,2,1,1,1,3,3,0,1,0,1,0,2,1,2,1,1,0,0,1,0,1,2,1,0,2,0,3,0,1,3,0,1,0,2,2,1,0,0,2,0,1,3,0,1,0,0,1,2,1,2,1,0,1,0,1,3,0,0,1,2,2,1,1,4,1,1,0,2,1,3,1,0,0,1,1,1,2,0,2,0,0,1,1,1,0,0,1,2,0,1,1,0,4,1,1,3,1,0,2,2,1,0,1,0,1,0,1,2,1,2,1,0,1,0,4,1,0,0,0,0,1,2,2,0,2,2,0,2,1,1,2,2,3,2,1,1,1,0,0,0,2,2,2,1,0,0,2,0,1,0,1,1,0,1,1,1,0,1,1,0,1,2,2,0,0,0,1,0,1,2,0,1,2,3,2,0,1,0,2,1,1,1,0,0,2,0,1,1,3,2,2,1,1,2,0,1,0,0,2,0,1,0,0,0,1,2,0,0,2,0,0,1,0,0,2,0,0,1,1,1,2,0,0,2,1,1,1,1,2,2,3,0,1,2,2,1,2,0,1,0,2,2,0,2,1,0,0,2,2,0,1,0,0,0,1,2,0,0,1,1,1,2,2,0,1,2,0,2,2,1,3,2,0,2,1,0,0,0,1,0,0,0,1,0,0,2,1,1,1,0,1,0,2,0,0,1,0,2,1,1,0,6,0,2,2,0,5,0,1,1,3,3,2,0,0,1,0,2,1,1,2,0,0,3,1,1,0,1,0,0,1,0,1,2,0,1,0,0,1,0,2,1,0,1,0,1,1,1,1,2,2,3,1,1,2,0,2,2,1,1,1,1,1,1,0,1,0,0,3,1,0,0,0,0,0,0,1,1,1,1,0,0,2,1,0,0,0,1,0,0,2,1,2,2,1,0,0,0,0,0,1,0,1,1,0,2,4,0,2,1,0,1,2,2,1,0,2,1,1,1,1,0,2,1,3,0,1,0,0,0,1,3,0,2,1,1,2,2,0,1,3,1,0,2,1,1,2,0,4,1,0,0,0,0,0,0,0,0,1,2,1,1,1,1,0,0,2,1,1,1,0,0,2,3,1,0,1,0,2,0,1,0,2,4,1,0,1,1,0,2,1,1,1,1,2,0,4,2,1,0,3,1,1,2,1,0,0,1,1,1,2,3,4,1,1,0,2,0,1,0,0,0,3,1,3,0,0,1,1,2,1,0,1,0,0,2,0,1,0,0,2,0,0,0,1,0,0,1,3,1,1,0,0,2,1,0,0,0,3,1,0,2,0,0,4,2,1,2,0,2,0,1,2,1,2,0,1,2,2,0,0,0,0,1,0,3,1,0,1,1,1,2,2,0,3,1,2,1,2,0,1,2,2,0,2,0,3,1,2,2,1,5,0,1,1,0,0,3,2,1,3,2,0,2,2,0,2,2,0,2,0,0,1,2,0,1,2,1,1,2,0,4,1,3,1,1,1,0,3,1,2,0,1,0,1,0,1,2,0,1,0,0,1,1,0,2,1,0,0,1,5,2,0,1,1,0,1,1,2,1,1,1,2,0,3,0,1,0,1,0,0,1,1,1,1,2,2,4,0,0,0,0,3,0,1,1,1,1,1,0,3,0,3,1,0,1,0,2,1,0,2,0,0,1,2,0,1,1,1,1,0,1,2,1,0,1,0,2,0,3,0,1,0,1,0,1,0,0,4,2,2,1,1,3,2,0,1,2,1,0,0,3,0,0,1,1,1,1,0,1,0,0,1,1,0,0,2,1,1,1,3,2,0,0,1,1,0,2,1,2,2,1,0,1,0,1,1,0,0,1,1,1,0,1,0,2,1,1,1,2,1,2,0,1,1,3,1,0,0,1,0,0,1,0,2,3,0,0,1,1,0,0,0,1,1,0,1,0,1,2,1,1,1,2,0,1,1,2,1,1,2,2,3,1,0,1,1,2,1,0,0,1,0,3,1,3,0,2,0,0,1,2]},{"counters":[3,2,0,4,1,0,1,1,1,0,2,0,1,1,2,4,0,1,0,1,0,2,1,3,2,0,0,0,4,0,1,1,2,2,0,3,2,1,0,0,2,2,1,3,1,1,1,0,1,1,0,0,0,1,0,1,3,1,0,1,0,1,1,1,1,1,1,2,2,0,3,1,0,0,0,1,2,1,2,0,1,2,2,2,1,0,0,1,0,1,2,2,1,1,0,1,1,4,2,1,1,1,0,1,0,1,1,0,2,1,1,0,1,0,0,0,3,3,1,1,1,0,3,3,0,1,0,4,2,1,0,1,1,1,1,1,1,2,0,2,1,1,1,1,0,1,1,0,2,1,0,0,1,0,0,2,1,0,1,3,1,4,3,3,0,1,0,2,1,2,0,0,3,0,2,0,0,1,0,1,3,3,2,1,3,1,2,0,0,0,3,0,2,1,2,0,2,1,1,0,1,0,1,1,2,0,0,0,1,0,1,1,0,1,1,3,0,1,0,1,0,1,0,0,1,0,2,2,1,0,1,0,1,2,0,3,1,1,0,0,1,1,2,1,0,0,1,1,0,2,0,0,0,2,1,1,0,0,0,0,2,0,2,0,1,2,0,1,2,1,3,0,0,2,2,0,0,2,6,0,3,1,3,0,4,2,1,1,0,1,0,0,0,0,0,1,3,1,5,1,1,1,0,0,0,0,0,0,0,0,1,1,0,2,0,4,0,0,1,0,0,0,0,1,0,1,3,2,0,0,2,3,3,0,0,1,1,1,0,0,3,1,1,6,0,1,0,0,2,0,1,3,0,0,1,2,0,2,0,0,2,1,0,2,3,4,1,1,3,1,1,1,1,2,0,1,0,1,3,4,0,1,0,1,0,0,1,0,2,2,3,1,0,3,2,2,2,1,5,0,0,1,0,2,0,0,0,0,0,0,1,1,1,4,0,2,1,0,1,1,0,3,2,0,0,0,0,3,0,2,0,0,2,0,1,1,1,1,0,0,0,1,2,0,3,0,1,0,1,0,1,1,2,1,1,1,0,2,0,2,2,1,1,0,1,1,1,1,1,3,0,2,2,0,0,0,0,0,2,0,0,2,0,0,2,0,3,1,0,0,3,0,2,0,0,1,2,3,0,1,1,1,0,0,0,1,0,0,1,1,0,0,2,0,1,0,2,2,0,1,1,3,1,1,2,1,0,2,0,0,2,1,0,0,0,0,1,1,2,2,0,0,1,0,1,1,2,1,1,0,3,1,2,1,3,0,1,1,1,1,1,2,0,4,1,3,1,1,1,1,1,2,0,0,0,0,1,1,0,1,1,0,1,3,1,1,1,3,0,1,3,1,1,1,0,2,5,0,0,0,0,1,0,0,1,0,1,0,0,1,1,2,1,0,1,1,1,1,1,1,1,0,0,7,1,3,0,0,0,2,1,2,3,1,0,0,0,1,3,3,1,0,1,1,1,2,0,1,2,0,0,0,0,2,3,2,4,1,0,1,0,0,2,1,2,3,2,1,0,3,2,2,2,0,1,3,0,0,1,1,0,1,1,0,1,1,3,0,1,2,1,2,0,1,0,0,1,2,0,1,0,1,0,2,2,1,1,0,0,1,1,0,0,1,1,3,0,0,0,1,0,0,1,1,0,0,0,2,1,4,1,0,2,0,1,0,1,1,0,1,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,3,3,1,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,1,2,1,3,0,2,0,2,1,0,1,0,0,0,0,2,1,4,2,1,2,2,0,1,0,1,2,1,0,2,0,1,0,0,0,1,0,0,0,0,1,0,2,2,1,0,1,2,1,0,4,1,0,0,1,0,0,4,2,3,0,1,2,3,0,0,1,0,3,1,2,0,3,0,0,1,1,0,0,0,2,1,1,2,1,0,2,2,1,1,0,1,0,0,1,3,0,1,4,1,0,1,1,1,1,3,1,4,0,1,2,0,0,1,2,1,2,2,0,3,0,1,1,1,0,0,1,2,3,2,0,1,0,4,4,0,0,2,1,1,0,1,1,1,1,2,2,0,0,1,0,0,1,1,0,1,1,3,2,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1,3,1,1,1,0,2,0,0,1,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,2,0,0,0,0,0,0,0,0,3,0,1,0,0,0,0,1,3,0,0,0,1,0,0,3,2,0,0,0,0,2,0,1,1,0,1,1,1,0,1,1,1,0,1,1,0,3,0,1,1,0,0,1,0,0,1,0,0,3,2,1,2,1,0,1,1,0,5,0,1,3,0,0,0,1,1,0,0,1,2,4,1,0,1,1,0,1,1,0,1,4,2,1,1,0,0,1,3,0,3,2,2,1,1,0,0,0,1,0,0,4,2,0,2,1,0,3,1,0,2,2,1,0,2,0,0,0,2,1,0,1,0,0,1,1,1,0,1,2,2,0,1,3,0,1,1,0,0,1,2,1,2,1,0,2,2,0,2,0,1,2,1,1,2,0,1,1,0,2,0,1,1,0,0,1,2,2,1,1,1,0,0,0,1,2,0,1,1,2,0,0,0,0,1,3,1,0,1,0,0,1,0,0,0,0,2,1,0,1,3,3,1,0,1,1,0,0,0,4,1,3,2,1,1,3,1,1,0,2,2,3,0,0,0,0,0,1,1,0,0,1,3,3,0,1,1,2,2,1,2,0,2,0,0,2,0,1,2,3,0,1,1,0,1,0,0,0,2,0,0,2,4,0,0,3,1,1,1,2,2,0,2,4,0,0,2,1,3,0,2,1,3,1,0,1,1,1,1,1,0,0,0,1,2,2,2,2,4,3,1,2,2,0,0,2,3,0,2,0,1,2,1,1,1,1,0,2,3,0,0,2,2,1,1,0,2,1,0,1,0,1,1,1,0,0,0,1,3,1,1,0,1,1,0,0,2,1,1,3,2,1,0,0,3,0,0,2,1,3,2,1,1,2,2,1,2,1,3,2,2,0,0,4,0,3,1,0,1,0,2,1,0,3,2,0,0,0,1,1,0,1,0,1,1,0,0,2,1,1,0,0,0,1,3,1,0,3,1,1,0,0,1,2,2,0,1,2,0,0,1,0,2,1,1,1,0,2,1,3,3,0,1,0,1,0,2,1,0,1,1,1,1,1,0,2,0,0,1,0,0,2,0,2,2,2,2,0,2,1,1,0,1,0,2,1,1,0,1,2,2,1,1,0,0,0,2,1,1,0,1,0,1,1,3,2,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1,1,2,1,0,0,1,1,1,0,2,1,0,1,0,2,1,1,0,2,0,3,0,2,3,0,0,0,0,1,0,1,1,0,2,0,0,1,0,3,0,0,1,2,0,2,3,1,1,1,1,2,0,2,0,0,1,0,1,0,1,0,2,3,2,0,1,1,1,0,0,0,0,0,0,0,0,0,1,2,0,0,1,0,1,1,0,0,0,1,2,0,0,1,1,3,3,3,1,1,1,0,0,0,0,0,0,2,1,2,0,1,0,1,2,2,1,1,0,0,1,0,1,3,1,3,1,4,0,0,2,1,0,1,3,3,1,0,3,3,0,0,0,2,3,1,1,0,1,1,0,1,2,1,2,1,3,2,0,1,2,0,2,0,0,1,1,0,1,0,1,0,0,0,1,1,1,2,1,1,2,1,1,0,1,1,0,1,0,2,0,0,2,0,1,4,0,3,3,1,1,1,1,1,1,0,3,2,2,0,1,0,0,0,0,1,2,1,0,0,0,3,0,3,2,2,2,3,0,2,0,1,0,1,1,0,0,2,1,0,0,0,0,1,0,0,1,2,2,0,3,0,2,0,4,0,0,0,1,1,0,2,0,0,1,0,0,2,1,1,1,1,1,1,0,1,0,1,0,0,0,3,0,1,0,2,1,0,2,0,1,1,1,0,0,0,1,1,0,1,0,0,1,0,0,1,3,0,1,2,1,1,0,2,0,0,0,0,0,1,2,0,1,2,3,0,2,0,0,2,1,1,2,5,0,1,2,1,0,3,1,2,0,2,1,0,1,2,1,0,0,1,0,1,3,4,0,1,1,2,1,0,1,0,0,2,3,1,2,0,1,0,1,1,1,1,1,1,1,0,2,0,1,0,1,1,1,1,1,3,1,1,1,0,2,0,2,3,2,3,4,0,0,1,0,1,3,1,1,1,1,0,0,2,0,0,1,0,2,0,0,0,1,0,0,1,1,1,0,1,2,1,0,0,0,0,0,1,1,0,1,0,1,1,0,1,0,0,1,2,0,0,0,0,0,0,0,4,0,0,0,0,1,1,1,1,2,1,0,1,2,1,0,2,2,0,2,0,0,1,0,3,2,0,1,0,1,0,2,2,0,2,1,0,0,1,1,1,1,0,0,2,2,1,0,1,0,1,3,1,0,0,2,2,0,0,0,1,0,0,0,2,3,0,1,2,0,1,4,0,1,1,2,3,1,0,1,1,2,1,1,0,1,0,2,4,0,1,0,2,1,0,2,1,2,2,0,0,1,0,0,0,0,2,0]},{"counters":[1,2,2,1,0,0,1,0,0,0,1,1,2,1,0,2,1,1,0,0,1,2,1,3,2,1,0,2,1,0,1,3,0,0,1,2,1,1,1,0,0,1,3,1,0,0,1,1,1,2,0,2,0,3,0,0,1,0,1,1,0,2,1,1,0,0,0,1,0,0,3,2,1,0,2,1,2,0,1,1,1,2,0,0,0,1,1,0,2,0,1,0,0,0,2,1,2,2,0,0,2,1,1,1,0,0,0,1,0,0,0,2,0,2,1,0,0,2,1,1,0,0,3,1,3,1,1,0,1,1,0,1,1,0,0,0,0,3,1,1,1,1,0,1,0,2,2,1,2,4,2,0,0,1,1,0,2,0,0,0,1,0,2,1,1,2,2,0,0,1,1,2,1,1,1,0,1,1,0,0,1,0,0,0,1,0,0,1,0,2,1,1,2,0,1,0,2,1,0,1,0,2,1,3,1,0,2,1,1,0,1,0,0,0,0,4,2,1,0,1,0,1,0,1,1,2,3,0,0,1,1,1,1,2,3,1,2,2,1,1,0,0,4,1,1,0,0,1,0,1,0,1,1,2,0,0,1,3,1,2,0,3,0,0,1,0,0,0,1,0,1,1,0,0,1,1,2,1,4,1,1,0,1,0,1,2,1,3,1,1,0,2,0,1,1,4,1,0,0,0,3,0,0,1,0,0,1,1,1,0,2,2,0,0,0,0,0,1,0,3,1,0,1,0,1,2,0,0,1,0,3,0,1,1,2,2,0,5,1,1,1,1,1,1,1,1,0,1,3,0,2,2,1,2,1,1,1,1,0,0,0,1,2,0,2,0,1,2,1,0,1,1,0,1,0,0,2,0,2,0,1,2,1,2,0,1,0,0,1,2,3,1,0,1,0,1,1,0,0,0,2,3,1,1,1,3,1,1,0,0,2,1,0,0,1,3,0,0,5,2,0,1,1,0,0,0,0,1,0,2,1,1,0,0,1,3,0,0,2,1,0,1,1,0,0,2,2,1,0,2,1,2,1,1,1,2,0,2,0,2,0,1,1,2,0,1,1,0,0,0,2,0,0,3,0,1,1,0,0,1,0,4,3,0,1,0,0,0,1,1,1,0,1,0,3,1,1,1,0,0,2,0,0,0,0,1,3,1,1,0,1,0,0,2,1,5,1,1,0,0,0,0,2,1,0,2,0,3,1,2,1,0,1,2,1,0,3,1,0,1,0,2,0,2,2,0,0,1,1,0,4,3,1,0,1,1,1,0,0,0,0,1,0,2,1,0,0,0,0,0,2,0,0,1,3,0,0,1,1,3,2,1,1,1,2,0,0,1,0,0,2,1,1,0,0,2,0,1,0,2,1,3,0,0,1,0,0,1,0,2,0,1,0,0,1,0,0,0,1,2,1,1,0,1,3,0,1,0,0,0,1,1,0,1,0,1,1,0,0,0,0,1,0,0,1,0,3,1,0,1,1,1,1,1,1,2,3,1,0,3,1,1,1,2,3,2,0,0,0,1,2,0,1,1,0,3,1,1,0,1,1,1,1,1,5,0,1,1,2,3,1,1,0,1,2,2,2,2,0,3,1,3,2,0,1,2,1,1,0,0,0,0,1,1,1,0,1,1,1,2,0,1,3,3,1,0,0,0,1,1,1,0,2,3,0,1,1,1,1,0,1,1,1,2,1,2,0,1,1,0,0,2,0,0,1,0,0,2,0,0,0,1,1,0,2,0,0,1,2,1,1,3,1,0,1,1,2,0,0,1,1,2,0,0,1,2,2,0,1,1,0,0,0,1,0,0,2,0,3,2,0,4,1,0,1,1,3,1,1,2,0,3,2,0,1,0,0,2,1,1,5,2,1,1,0,3,1,1,0,1,1,2,0,1,1,3,1,0,2,0,0,0,1,1,2,0,1,0,1,1,1,0,1,1,1,0,3,0,2,0,1,0,0,2,1,0,0,1,2,1,2,0,0,0,1,2,3,0,2,1,1,1,0,1,3,0,0,5,1,1,1,2,3,1,1,1,0,2,1,2,1,0,1,3,2,2,1,1,1,0,0,0,0,0,2,1,0,0,0,2,1,1,0,0,0,2,1,0,5,1,0,2,0,1,1,2,1,2,0,4,1,0,0,0,2,1,0,2,0,0,1,1,0,0,0,0,1,1,0,3,1,3,0,2,0,1,1,3,0,1,0,1,0,0,1,0,1,1,0,1,1,2,2,1,4,1,0,1,1,1,0,1,0,1,3,2,1,3,1,3,0,2,1,1,1,0,0,0,3,2,1,2,0,1,1,0,0,0,0,1,1,0,0,1,2,2,1,1,1,1,3,0,2,0,0,0,1,2,1,1,3,2,0,1,2,2,1,1,1,1,3,3,1,1,3,1,1,0,0,2,1,2,0,0,1,0,3,0,2,2,1,0,2,2,1,0,3,0,1,2,0,1,2,0,2,0,2,2,3,2,1,4,2,0,2,2,1,1,3,0,1,2,0,2,2,0,1,0,0,2,0,1,0,0,0,0,3,3,0,0,0,1,2,0,2,0,1,1,3,1,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,1,2,0,2,2,1,0,0,1,0,1,0,1,1,0,0,0,0,0,2,0,3,0,1,0,1,1,1,1,0,1,0,1,1,1,1,1,1,2,1,3,2,0,1,0,0,2,1,0,0,0,0,0,1,3,1,2,1,1,1,1,0,0,0,0,2,1,2,0,0,0,0,0,0,1,0,2,0,0,0,0,2,1,3,1,0,2,2,1,2,1,0,1,0,0,1,0,1,3,0,0,0,4,2,0,0,1,0,1,2,1,1,0,1,2,1,1,2,0,0,1,2,1,1,1,2,0,0,0,2,0,1,1,0,2,0,0,1,2,2,0,1,1,2,1,1,1,1,2,1,3,0,0,1,1,1,1,2,1,1,0,1,2,0,4,0,0,2,1,0,2,2,3,2,0,0,1,0,0,1,0,2,1,0,2,0,1,0,1,1,2,3,1,1,2,0,0,1,0,1,0,0,0,0,1,0,1,1,0,0,0,2,1,2,3,0,1,2,0,0,2,0,2,2,1,2,0,1,0,1,0,2,0,0,0,0,0,1,1,1,0,1,0,0,0,1,0,0,1,0,0,0,3,2,0,0,0,1,5,0,2,0,2,0,0,1,0,0,0,1,2,1,2,0,0,1,2,1,0,3,0,1,0,0,1,2,0,1,0,0,2,0,0,1,1,0,2,0,0,0,1,2,1,1,2,1,1,0,1,1,0,0,3,2,1,1,1,0,1,2,2,0,0,0,0,3,1,1,3,2,1,0,1,1,1,2,0,0,2,0,2,4,0,0,0,2,1,1,0,1,0,1,1,2,1,1,0,1,1,3,1,4,0,2,2,2,2,2,2,1,3,2,0,1,1,2,2,1,1,0,1,0,1,0,3,0,3,2,2,0,1,1,1,0,1,0,0,0,0,1,1,3,2,1,3,2,1,0,2,0,0,0,1,4,0,2,0,0,0,0,0,0,1,2,0,2,0,0,1,3,0,0,4,1,2,2,1,1,0,0,1,0,1,1,2,1,3,0,0,0,1,3,0,2,1,0,3,1,1,1,2,0,2,0,1,0,0,0,0,1,3,0,3,1,1,1,1,2,1,1,2,1,1,1,0,2,1,2,1,1,2,2,0,2,0,2,1,1,0,1,2,2,0,0,1,0,1,1,0,1,1,1,2,0,4,1,1,1,0,0,1,1,0,1,0,2,0,0,2,1,0,0,1,2,0,1,0,2,4,1,3,1,1,3,3,0,2,1,1,3,0,1,3,1,1,0,0,1,2,1,2,2,0,1,2,0,1,0,1,2,1,1,1,0,0,1,3,0,2,1,1,0,0,2,1,2,0,3,1,0,1,0,3,0,1,0,2,1,5,3,1,0,1,0,1,4,0,1,1,2,0,1,1,3,1,1,0,1,1,0,3,2,1,1,0,2,3,0,2,2,1,0,0,5,2,0,1,0,1,0,0,3,0,0,0,1,0,0,0,2,1,3,3,0,1,2,4,3,1,4,2,1,0,1,1,0,0,5,0,0,1,1,2,1,2,1,2,2,2,0,1,1,0,1,0,0,2,0,0,2,0,1,1,0,2,2,1,0,2,2,1,0,1,1,3,0,1,1,2,3,1,3,0,1,1,1,2,1,1,2,1,0,0,2,0,0,0,2,3,1,1,2,2,0,3,2,0,1,0,0,3,0,2,1,1,0,0,1,0,0,4,1,1,1,1,0,1,0,1,3,2,0,1,1,0,0,2,0,0,1,2,1,3,1,0,1,4,1,0,4,0,3,2,1,0,3,0,0,0,1,1,0,1,1,0,0,0,1,0,2,1,0,3,0,1,2,0,1,3,1,0,0,1,2,0,2,0,1,0,3,2,1,1,0,0,2,0,2,2,1,2,1,0,1,0,0,0,1,0,2,0,1,0,0,1,1,2,0,1,0,1,3,1,0,1,1,2,3,0,2,0,2,1,0,1,1,1,0,1,1,0,1,1,0,0,0,1,1,0,1,0,1,0,2,0,0,0,1,3,0,1,1,1,1,1,0,1,0,0,4,0,1]},{"counters":[2,2,2,2,1,0,2,1,0,0,0,1,0,1,0,1,2,1,2,0,0,3,0,0,1,2,2,1,1,4,2,1,0,0,2,1,3,2,1,1,1,1,0,0,0,0,1,1,0,1,1,3,0,2,2,1,0,2,1,5,1,1,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,1,1,0,2,1,2,2,1,0,0,0,1,0,1,0,2,1,0,2,0,1,0,0,0,0,1,2,1,1,0,0,2,1,0,1,2,0,0,1,2,0,2,1,1,0,0,0,0,4,0,2,3,0,0,2,1,2,1,1,1,0,2,0,0,0,1,1,0,0,1,1,2,0,2,0,2,1,0,0,2,1,1,1,2,1,0,1,2,0,0,0,0,3,0,0,1,1,0,1,0,0,2,1,1,2,0,0,1,0,0,1,0,0,1,3,0,1,2,0,1,0,1,1,2,1,2,0,0,4,0,0,1,2,0,2,0,0,0,2,2,0,2,1,2,2,2,1,0,3,0,0,1,0,2,0,1,1,0,2,0,1,1,1,1,0,1,1,0,1,1,0,0,1,1,1,2,0,0,0,0,3,2,0,2,0,1,1,2,0,0,3,0,0,1,1,0,2,0,0,1,1,1,2,1,2,1,0,1,1,0,1,0,1,0,0,1,0,2,0,1,2,1,1,2,0,3,1,2,4,0,1,2,1,0,0,2,0,3,0,0,0,0,3,1,0,0,2,1,1,0,2,1,1,0,3,1,1,1,1,0,1,1,0,1,0,0,0,0,1,1,0,0,0,1,2,3,1,1,2,0,1,1,2,0,0,0,0,3,2,0,0,0,1,0,1,2,2,1,1,3,1,1,1,0,0,0,0,2,2,3,2,1,1,0,1,2,1,0,5,3,2,0,0,0,1,1,3,2,1,1,1,0,3,0,1,0,2,0,1,0,0,0,2,1,3,0,0,1,0,0,4,1,4,2,0,1,1,2,2,0,0,1,2,1,1,0,1,3,1,0,2,0,1,0,1,2,1,1,2,0,1,3,0,0,1,2,4,2,1,1,0,1,2,0,2,1,0,2,0,0,0,2,1,2,3,1,0,2,1,2,0,0,0,0,3,1,2,1,1,0,1,1,1,0,0,1,1,2,0,1,0,2,2,1,1,0,2,0,2,1,1,2,1,1,1,1,0,2,0,0,2,0,2,1,0,3,0,2,0,2,3,1,0,2,1,1,0,0,2,0,2,3,1,1,1,3,2,0,0,0,2,0,1,0,0,0,0,0,3,1,2,1,0,0,0,2,0,0,1,1,1,0,1,0,1,1,0,4,0,0,1,1,0,1,0,0,1,1,2,1,0,1,1,0,1,1,0,0,0,0,2,3,2,1,0,1,0,2,0,0,0,1,1,3,0,0,1,2,0,1,2,2,0,1,1,2,2,1,3,3,1,2,1,0,0,1,0,0,0,1,1,0,1,2,0,0,1,0,0,2,2,1,2,1,1,0,0,1,1,0,0,0,0,1,0,1,1,1,0,1,2,2,1,2,2,2,5,2,0,1,3,2,3,0,0,0,0,3,1,0,1,2,1,0,2,1,0,1,0,2,1,2,0,2,0,0,1,2,0,1,2,0,2,3,2,1,0,1,1,1,1,1,2,1,0,1,0,1,1,0,0,3,0,1,2,0,1,0,0,2,2,0,2,0,0,1,0,0,0,0,0,0,1,1,1,1,0,1,3,1,1,0,1,1,0,2,0,1,3,2,2,1,1,1,1,0,0,0,1,1,0,0,1,1,2,3,0,0,0,1,3,0,0,2,2,0,1,1,1,1,1,1,2,2,1,1,2,2,2,0,1,0,2,1,0,3,2,4,0,3,1,0,1,2,1,0,0,1,0,1,1,0,2,3,1,0,0,0,1,0,2,1,0,3,1,0,0,0,0,3,0,1,0,0,2,1,1,0,1,0,1,4,2,0,1,1,0,0,2,1,1,0,0,1,0,0,1,0,1,1,0,1,0,2,1,1,1,1,0,1,2,0,1,0,0,1,2,2,2,1,1,1,3,1,3,0,1,0,1,0,0,1,1,3,3,2,1,2,4,0,2,1,1,0,0,2,1,2,1,2,0,1,1,0,1,1,0,0,2,0,0,1,2,0,2,2,1,0,2,1,1,0,1,2,3,2,1,0,3,1,2,0,0,1,0,1,1,1,0,1,2,0,2,0,2,0,0,2,1,2,1,0,0,0,3,0,1,1,1,0,1,2,1,1,0,1,1,0,0,0,0,0,2,1,2,1,1,2,0,1,0,0,0,3,1,1,1,0,1,1,1,0,0,1,0,0,1,2,2,1,1,0,4,1,0,2,2,1,1,0,0,0,2,1,1,4,0,0,1,2,0,4,1,1,1,1,2,0,0,0,0,2,1,0,0,1,3,0,0,0,2,3,2,0,0,1,0,1,1,0,1,2,0,1,0,2,5,2,0,1,0,0,3,3,1,2,1,1,2,1,0,1,1,2,1,0,0,1,1,1,1,0,2,3,0,1,1,3,0,1,0,1,3,0,3,0,2,1,2,2,1,0,1,1,1,2,1,0,2,1,2,0,1,0,0,0,1,0,0,2,0,3,1,0,0,1,1,1,1,1,1,2,1,1,0,3,2,2,2,1,3,0,0,2,0,1,0,1,1,3,0,0,2,1,0,0,5,0,0,1,0,0,0,1,0,3,0,0,0,1,0,1,2,2,1,1,0,0,0,2,0,1,2,0,0,1,0,1,3,0,0,0,0,2,2,1,2,1,1,2,2,0,0,1,0,1,0,0,1,1,1,1,2,1,0,3,1,0,0,5,0,3,2,1,1,1,2,0,0,0,1,2,0,2,1,1,2,1,0,1,0,0,1,0,0,2,1,1,1,2,1,1,1,1,1,0,0,1,1,1,2,1,1,1,1,1,0,2,1,0,0,0,1,0,1,1,2,1,0,0,0,0,0,2,2,0,1,0,3,0,2,0,5,2,1,0,0,1,0,1,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,2,0,1,1,1,2,2,2,3,2,0,1,0,1,0,1,1,2,1,0,4,1,0,0,0,0,1,1,0,1,1,2,1,2,0,1,2,0,1,0,2,1,1,0,0,0,1,3,1,0,1,2,0,0,0,2,2,3,1,2,2,2,1,1,2,2,0,1,0,0,2,0,0,0,1,0,0,0,1,0,1,0,0,2,1,1,1,2,2,1,1,1,2,0,3,0,2,0,0,2,1,1,1,1,0,0,1,0,3,2,3,0,1,0,0,0,1,0,1,1,2,2,0,3,2,2,2,0,1,0,0,1,2,0,2,0,2,1,0,1,1,0,0,1,2,2,0,0,0,2,1,0,0,2,1,1,1,0,2,2,6,3,2,0,0,4,1,3,4,1,0,1,0,2,2,0,1,1,2,0,0,1,1,2,0,2,0,0,2,0,0,2,1,2,0,2,0,2,1,1,1,0,1,1,0,1,1,0,0,1,1,1,0,0,2,2,2,2,0,1,0,0,0,1,1,1,0,1,1,2,0,1,1,4,1,1,2,1,1,3,0,0,0,0,1,0,2,2,0,2,1,0,0,3,1,0,0,0,1,0,1,0,2,0,0,2,0,3,1,0,4,3,2,2,2,0,0,0,1,2,4,0,0,1,0,2,1,0,0,0,2,0,0,0,1,0,1,0,0,1,3,1,0,0,1,1,0,0,1,2,0,3,2,1,3,2,1,3,0,0,2,1,2,1,1,0,1,2,1,3,4,2,1,1,4,0,1,5,1,1,0,2,0,2,2,0,0,4,1,1,0,1,0,1,1,3,1,3,3,0,1,1,0,0,0,2,0,1,1,0,2,1,0,2,1,0,1,0,2,0,0,3,0,1,0,1,1,1,3,1,2,1,0,2,0,1,2,0,2,0,0,2,1,1,0,1,0,1,1,0,0,0,0,0,1,2,1,2,2,2,2,1,0,1,1,1,0,1,4,1,1,0,0,1,1,0,5,0,0,2,1,1,0,4,1,2,0,1,1,1,0,0,3,0,3,2,1,0,1,3,1,1,1,0,0,2,0,3,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,2,2,0,1,0,1,1,0,0,1,2,0,2,0,0,1,0,0,0,1,1,2,2,0,0,0,1,1,1,2,2,2,2,0,0,0,1,2,0,1,3,0,0,2,1,1,2,2,0,1,0,1,1,1,2,0,1,1,5,0,3,1,1,0,1,1,0,2,1,0,2,3,1,1,2,1,2,2,0,0,4,1,0,1,0,0,3,1,1,0,2,0,2,4,1,0,1,1,0,1,2,2,0,0,2,1,0,1,0,0,2,1,1,0,0,1,0,1,0,0,0,0,0,0,1,0,0,2,0,1,1,3,0,0,1,2,0,2,1,1,2,3,1,2,1,0,1,0,1,1,1,2,1,1,0,0,4,1,0,2,1,1,0,0,0,1,0,1,2,0,0,0,1,0,0,0,0,2,0,0,2,1,0,2,0,1,0,1,3,0,3,2,0,2,1,2,1,0,0,0,0,1,0,1,1,2,2,2,1,1]},{"counters":[2,2,0,2,2,2,2,0,0,1,3,0,2,2,1,0,0,1,2,0,1,0,2,0,2,0,1,1,1,0,0,1,0,2,1,0,1,1,2,1,1,0,0,0,1,1,0,5,1,3,1,1,1,1,2,1,0,2,1,2,1,0,0,3,1,1,0,0,1,1,0,0,1,0,1,0,2,0,1,0,3,1,0,2,1,1,1,0,0,1,0,1,0,2,3,1,2,0,1,0,1,0,3,3,1,2,1,0,2,2,1,2,0,2,0,3,2,0,0,1,0,2,2,2,1,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,0,0,2,2,1,0,0,0,1,1,1,1,0,0,0,0,1,0,2,1,2,0,2,1,1,0,1,0,0,2,2,1,0,2,2,0,2,2,3,1,2,0,0,0,2,0,1,0,1,2,3,1,1,3,0,0,3,1,2,0,0,2,1,1,0,1,1,0,2,2,1,1,2,2,0,2,1,1,0,0,0,2,0,0,0,2,3,0,0,0,0,2,1,1,0,1,0,0,1,2,2,1,0,1,0,1,1,1,0,2,2,0,1,2,1,2,1,1,1,0,0,0,1,0,3,1,1,0,0,1,2,1,1,0,0,2,0,1,0,0,0,2,1,2,1,1,2,0,3,1,1,2,1,2,2,0,1,0,1,2,2,1,0,1,3,1,0,2,0,0,0,0,1,2,0,1,2,4,2,2,0,1,0,0,0,2,3,3,0,2,1,1,1,2,2,2,0,1,1,0,1,0,1,0,3,1,0,0,1,0,1,0,2,0,2,3,0,0,0,1,1,1,0,0,0,1,0,0,3,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,2,1,3,4,2,0,1,1,1,0,1,0,1,1,0,1,1,2,2,0,1,1,0,1,1,3,1,1,1,0,0,0,2,0,1,0,0,1,0,0,0,4,1,2,3,2,0,0,0,2,1,0,1,2,0,3,3,0,0,0,1,1,3,1,1,1,1,1,2,2,1,0,0,1,4,2,1,1,0,1,0,0,0,1,3,0,1,1,1,1,0,1,1,1,2,1,0,2,0,0,1,2,1,0,1,0,0,1,2,1,2,2,1,2,2,0,1,1,1,0,0,4,1,2,0,1,0,2,1,2,1,1,1,2,3,2,0,1,2,1,0,0,2,0,0,0,0,1,0,3,0,0,2,5,0,1,0,2,0,0,0,0,3,3,1,2,0,0,1,2,0,1,3,4,3,0,3,1,0,3,1,1,0,0,1,0,1,0,0,0,1,1,2,0,0,1,2,2,1,2,1,1,1,2,0,0,0,2,1,1,0,2,1,1,1,1,1,0,1,2,2,0,2,1,3,2,0,2,2,0,1,1,0,0,0,1,2,2,1,1,1,0,1,1,0,0,0,1,1,3,1,1,1,0,0,1,0,3,2,1,0,0,0,1,2,0,0,1,0,0,0,0,0,1,0,1,1,1,1,4,2,1,0,1,0,1,2,1,1,1,2,0,1,1,0,0,1,0,1,2,1,0,4,1,0,1,0,1,0,1,1,1,0,2,1,2,0,3,0,1,1,1,0,1,0,1,0,0,1,0,1,4,1,1,0,2,1,1,1,3,0,0,0,0,3,0,2,0,2,1,1,0,0,0,0,0,1,2,1,2,2,2,0,0,2,1,0,0,0,0,0,1,0,2,1,2,1,2,2,0,1,0,0,1,3,0,1,1,1,1,0,3,2,1,0,0,0,1,0,0,1,2,0,0,2,1,1,1,1,1,2,0,0,0,1,3,0,1,0,1,0,2,1,1,1,0,0,1,0,1,1,1,2,0,3,2,3,0,0,1,0,0,0,1,0,3,1,0,0,3,1,1,2,0,2,2,0,0,1,1,1,0,0,1,0,0,1,0,0,1,1,1,0,0,1,3,0,2,2,2,3,1,2,1,2,1,1,2,1,1,2,0,1,0,0,1,3,0,2,0,2,0,0,1,0,0,0,1,2,1,2,1,2,0,0,1,2,1,2,0,0,1,0,2,0,0,3,1,1,0,2,2,1,1,3,0,1,0,0,0,0,2,1,1,0,1,0,0,1,1,1,1,0,2,0,1,0,1,1,1,0,0,0,0,0,0,1,2,2,1,4,1,1,1,0,0,1,1,3,2,1,2,1,0,1,1,2,1,0,0,1,0,4,1,1,1,1,3,0,0,1,1,0,0,0,0,0,1,1,2,2,0,3,1,0,0,0,1,2,0,1,0,3,0,1,1,2,2,0,0,1,0,1,1,3,1,0,2,1,3,0,0,2,0,0,2,1,0,0,0,2,0,0,0,2,1,0,1,0,3,0,2,2,1,0,0,3,0,1,2,1,0,0,2,0,2,2,1,1,2,1,2,1,0,1,1,3,2,0,1,2,2,1,2,1,0,1,0,2,1,1,1,3,0,0,1,0,2,2,1,0,0,1,1,2,1,3,0,2,1,1,2,0,1,2,2,0,1,1,0,1,3,5,0,1,2,1,1,0,1,1,0,4,1,1,1,2,1,2,1,0,0,0,1,4,1,1,1,0,1,2,0,0,1,0,1,0,1,1,1,1,1,1,3,0,1,1,1,0,0,0,1,1,0,0,1,0,2,1,0,1,0,2,4,0,0,1,1,0,2,1,0,0,1,0,1,0,4,1,3,0,3,0,2,0,1,1,3,0,1,0,1,2,2,0,1,2,2,0,1,1,2,1,0,1,2,1,3,1,1,0,1,0,3,1,3,0,2,2,1,0,1,1,1,0,1,2,0,1,2,1,2,1,1,0,0,1,1,2,0,1,1,0,0,3,1,0,0,1,1,1,2,2,0,0,0,2,1,0,0,0,1,1,0,2,1,0,0,2,0,2,0,1,1,2,0,1,2,0,2,0,0,2,0,0,1,2,0,1,0,0,0,1,1,2,1,0,2,0,1,2,3,0,2,0,1,0,2,1,2,2,1,2,0,0,3,2,1,0,1,1,1,1,1,2,1,1,0,0,1,0,1,0,1,2,0,1,2,2,0,0,1,0,2,1,1,0,1,0,1,0,0,2,0,3,1,1,1,0,0,3,1,0,0,1,0,2,0,0,3,0,0,0,2,0,1,0,1,1,0,1,0,0,2,0,1,1,1,0,0,1,2,2,0,0,0,0,2,0,0,0,2,1,2,2,2,1,3,4,2,2,1,2,0,2,0,2,2,0,1,0,1,0,0,0,0,1,0,2,0,2,0,0,1,1,0,1,3,0,1,1,1,0,0,1,1,1,0,1,0,0,2,1,0,0,3,2,0,1,0,3,1,0,1,2,0,1,0,0,1,0,0,0,1,0,2,0,2,1,1,0,0,0,2,0,1,2,3,1,2,2,0,0,0,1,2,1,1,0,0,1,2,1,1,0,1,3,2,2,1,3,2,0,0,0,0,4,1,0,1,1,2,0,0,1,1,0,4,2,0,1,1,0,1,0,2,1,1,2,0,1,0,0,3,2,0,1,1,0,1,1,3,1,1,2,0,0,0,3,1,1,2,0,1,0,2,0,2,1,0,0,0,0,0,1,2,1,2,0,1,4,0,0,1,1,2,2,1,1,2,1,4,0,0,3,1,1,0,1,0,3,1,1,0,1,1,1,1,3,0,1,2,1,0,2,1,1,0,1,0,1,0,2,0,0,1,0,2,0,1,2,1,1,2,0,2,0,0,1,2,1,1,1,2,1,1,1,0,2,0,2,1,0,1,1,3,1,1,1,2,2,2,3,0,1,3,2,0,2,1,0,1,0,2,2,1,1,2,0,0,2,0,0,0,0,0,2,1,4,0,0,2,3,2,3,1,0,0,1,2,0,3,0,2,1,2,0,0,2,0,0,1,0,2,1,1,0,0,0,1,0,0,0,1,0,3,2,1,0,1,0,0,3,2,1,0,0,0,2,1,0,1,2,3,2,0,1,0,0,0,0,3,0,0,2,0,1,4,2,5,0,1,2,0,0,0,0,1,0,1,1,1,1,0,1,0,2,1,2,1,1,1,1,1,0,2,3,1,4,2,1,0,1,2,3,3,1,1,0,1,2,1,0,1,0,0,2,2,0,0,1,1,0,0,2,1,2,2,4,2,0,1,2,0,1,1,2,0,1,2,1,1,1,2,1,3,1,1,2,1,1,1,0,0,0,0,0,0,0,0,2,2,1,0,0,2,2,3,1,0,0,2,2,0,0,2,0,1,1,0,2,0,0,0,1,2,0,4,1,3,0,1,2,0,0,0,2,2,1,1,0,2,3,0,3,1,2,1,0,2,3,0,3,0,0,0,0,0,1,0,1,0,0,2,1,0,0,1,3,0,2,1,1,2,1,2,2,1,0,2,2,2,1,1,0,0,1,2,0,2,0,1,0,1,1,0,1,0,5,1,1,0,0,1,1,0,0,2,1,1,2,0,2,1,2,0,0,1,0,3,1,1,0,1,1,1,0,0,1,0,0,1,0,1,1,0,0,1,1,0,1,1,0,1,0,2,1,0,1,3,2,2,1,0,0,0,0,2,1,1,0,1,2,0,0,1,2,1,3,0,2,0,1,1,0,3,1,1,1,1,1,1,1,1]}]},"null_count":0,"last_update_version":397952041378643968},"oid":{"histogram":{"ndv":1948,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+A==","upper_bound":"ATBCVldpRXhL/0YAAAAAAAAA+A==","repeats":1},{"count":16,"lower_bound":"ATBFOVpvRXUA/g==","upper_bound":"ATBiMlJHQQAA/Q==","repeats":1},{"count":24,"lower_bound":"ATBjdEdJVAAA/Q==","upper_bound":"ATBuTkc4alpo/09kU0UAAAAA+w==","repeats":1},{"count":32,"lower_bound":"ATBvREhXelJG/3dyUzJ6U0YA/g==","upper_bound":"ATE0YnFLamh5/2pXVEh5VGto/0Z2AAAAAAAA+Q==","repeats":1},{"count":40,"lower_bound":"ATE1TwAAAAAA+g==","upper_bound":"ATFNV2lwegAA/Q==","repeats":1},{"count":48,"lower_bound":"ATFOQW00cEM3/3EAAAAAAAAA+A==","upper_bound":"ATFjAAAAAAAA+Q==","repeats":1},{"count":56,"lower_bound":"ATFjVGdSQzFy/3pETjkwTmZ5/wAAAAAAAAAA9w==","upper_bound":"ATFtdFFpNEpY/3RZRzAAAAAA+w==","repeats":1},{"count":64,"lower_bound":"ATFvNU1KTGQ2/zcAAAAAAAAA+A==","upper_bound":"ATF5RkZjWGJN/0tZRQAAAAAA+g==","repeats":1},{"count":73,"lower_bound":"ATIAAAAAAAAA+A==","upper_bound":"ATJRcnFWAAAA/A==","repeats":1},{"count":81,"lower_bound":"ATJTQ0dBZzYA/g==","upper_bound":"ATJoZTl1ekxE/1lubWtMd2pY/zk5YQAAAAAA+g==","repeats":1},{"count":89,"lower_bound":"ATJpSGI2REF5/wAAAAAAAAAA9w==","upper_bound":"ATJ3UVk5OTcw/0NBYnBNQVdJ/1h1SDYAAAAA+w==","repeats":1},{"count":99,"lower_bound":"ATJ3aEZjTnJB/wAAAAAAAAAA9w==","upper_bound":"ATM2bGVkaTFP/3Z1AAAAAAAA+Q==","repeats":1},{"count":107,"lower_bound":"ATM4QllRb1FE/wAAAAAAAAAA9w==","upper_bound":"ATNQdE5CRW56/1d2cm10AAAA/A==","repeats":1},{"count":115,"lower_bound":"ATNVd24wTDBM/3ZiNGR3dE15/wAAAAAAAAAA9w==","upper_bound":"ATNrcTJZRWsw/wAAAAAAAAAA9w==","repeats":1},{"count":123,"lower_bound":"ATNsZDA1Mzli/0x4AAAAAAAA+Q==","upper_bound":"ATN0TkRhQjI3/0dpdUMAAAAA+w==","repeats":1},{"count":131,"lower_bound":"ATN6TnZmOGEA/g==","upper_bound":"ATQ5Q3dGAAAA/A==","repeats":1},{"count":139,"lower_bound":"ATQ5TnNKWGE4/zlkbGVtV012/wAAAAAAAAAA9w==","upper_bound":"ATRMWmdMc2QA/g==","repeats":1},{"count":147,"lower_bound":"ATROVDhub3JU/0twN08AAAAA+w==","upper_bound":"ATRadTMwY3Vw/wAAAAAAAAAA9w==","repeats":1},{"count":155,"lower_bound":"ATRhT2U1UUFD/21CAAAAAAAA+Q==","upper_bound":"ATRuQ3o2AAAA/A==","repeats":1},{"count":163,"lower_bound":"ATRwTTJwa21D/zNOU1A4OWQA/g==","upper_bound":"ATR3AAAAAAAA+Q==","repeats":1},{"count":172,"lower_bound":"ATUAAAAAAAAA+A==","upper_bound":"ATVLRFpOVjVV/zZsWG5NZmtZ/wAAAAAAAAAA9w==","repeats":1},{"count":180,"lower_bound":"ATVNAAAAAAAA+Q==","upper_bound":"ATVVMVhvWEZR/3JDTHJ2UAAA/Q==","repeats":1},{"count":188,"lower_bound":"ATVZRHJIbnBQ/000AAAAAAAA+Q==","upper_bound":"ATVqAAAAAAAA+Q==","repeats":1},{"count":196,"lower_bound":"ATVrdllPV2kA/g==","upper_bound":"ATV1dmU3cm9n/wAAAAAAAAAA9w==","repeats":1},{"count":205,"lower_bound":"ATV5SXMAAAAA+w==","upper_bound":"ATY1NWNKUXZw/1kAAAAAAAAA+A==","repeats":1},{"count":213,"lower_bound":"ATY1ZDFxOTlk/1UAAAAAAAAA+A==","upper_bound":"ATZLNUFCWTkA/g==","repeats":1},{"count":221,"lower_bound":"ATZMcAAAAAAA+g==","upper_bound":"ATZWU2pCAAAA/A==","repeats":1},{"count":229,"lower_bound":"ATZXd3ZLMkoz/2taM0prZGFy/055ZjQAAAAA+w==","upper_bound":"ATZnZUdlWGtv/2tOTQAAAAAA+g==","repeats":1},{"count":237,"lower_bound":"ATZpSHA1SFkA/g==","upper_bound":"ATZvOUNJbUVx/2VwODRSWUNL/3oAAAAAAAAA+A==","repeats":1},{"count":245,"lower_bound":"ATZwZHM1b0Zj/0tIaGRVRjB4/wAAAAAAAAAA9w==","upper_bound":"ATc1AAAAAAAA+Q==","repeats":1},{"count":253,"lower_bound":"ATdDUkJ4Wmpi/1cydUxTRnpR/wAAAAAAAAAA9w==","upper_bound":"ATdSM3RjdnZp/3dNAAAAAAAA+Q==","repeats":1},{"count":261,"lower_bound":"ATdTSkl1ZDhX/1ZzRWlsagAA/Q==","upper_bound":"ATdrVnpibU5M/2FlVzJLQwAA/Q==","repeats":1},{"count":269,"lower_bound":"ATdtemRFWHpD/wAAAAAAAAAA9w==","upper_bound":"ATd5QWxYWExq/1ZZNUJmN3Vk/1UAAAAAAAAA+A==","repeats":1},{"count":279,"lower_bound":"ATgAAAAAAAAA+A==","upper_bound":"AThHNlE4AAAA/A==","repeats":1},{"count":287,"lower_bound":"AThJUmFjTTJw/2RURmNGVGIA/g==","upper_bound":"AThQMG54dk1J/09WeFdTdzRZ/09Pa3gAAAAA+w==","repeats":1},{"count":295,"lower_bound":"AThRZ3Y4UVdC/0EAAAAAAAAA+A==","upper_bound":"AThWUDZLT1VE/2lwWHRXZnI4/1pmAAAAAAAA+Q==","repeats":1},{"count":303,"lower_bound":"AThXZnAAAAAA+w==","upper_bound":"AThobloAAAAA+w==","repeats":1},{"count":311,"lower_bound":"ATh0YnVYQ01r/3BHTDMAAAAA+w==","upper_bound":"ATk4dldOQU50/05XYkJDVVVV/1RxeQAAAAAA+g==","repeats":1},{"count":319,"lower_bound":"ATlBdExnOVRQ/0VvWXN1Y25Q/0c5AAAAAAAA+Q==","upper_bound":"ATlKaU9PNQAA/Q==","repeats":1},{"count":327,"lower_bound":"ATlLeG9UNGhi/3E3MW4AAAAA+w==","upper_bound":"ATloSAAAAAAA+g==","repeats":1},{"count":335,"lower_bound":"ATlrM1pHeFlZ/3dNYnJvbks0/3JGVwAAAAAA+g==","upper_bound":"ATl2cGtNTFdp/1o5emRlMGNy/04wSwAAAAAA+g==","repeats":1},{"count":343,"lower_bound":"ATl4cElyMUFB/zhpMjltS3dR/3R5AAAAAAAA+Q==","upper_bound":"AUE3WFpzU2pa/2dOczZvbnhO/1MAAAAAAAAA+A==","repeats":1},{"count":351,"lower_bound":"AUE5UVN1NDc0/0lOVFNrNAAA/Q==","upper_bound":"AUFmYTlZaXl6/3VEWnQxeU1N/2c0TVgAAAAA+w==","repeats":1},{"count":359,"lower_bound":"AUFoAAAAAAAA+Q==","upper_bound":"AUF5S2kyNmEx/0R1WVo4R3Jy/0MAAAAAAAAA+A==","repeats":1},{"count":367,"lower_bound":"AUIwYzFoSAAA/Q==","upper_bound":"AUJJMjUAAAAA+w==","repeats":1},{"count":375,"lower_bound":"AUJKb3I0AAAA/A==","upper_bound":"AUJYAAAAAAAA+Q==","repeats":1},{"count":383,"lower_bound":"AUJYanlVdWF0/00yczlXS3k5/3dqAAAAAAAA+Q==","upper_bound":"AUJ0NE1NYkxQ/2lITENhAAAA/A==","repeats":1},{"count":392,"lower_bound":"AUJ3QTNXYTBI/wAAAAAAAAAA9w==","upper_bound":"AUM3UWMAAAAA+w==","repeats":1},{"count":400,"lower_bound":"AUNBAAAAAAAA+Q==","upper_bound":"AUNNazM2bXpp/3VRRgAAAAAA+g==","repeats":1},{"count":408,"lower_bound":"AUNVRllYOVdG/0xYbDhxbHZj/1luRGgAAAAA+w==","upper_bound":"AUNoTVdoSnAA/g==","repeats":1},{"count":416,"lower_bound":"AUNqeGtQAAAA/A==","upper_bound":"AUQAAAAAAAAA+A==","repeats":2},{"count":424,"lower_bound":"AUQ3NXRUc3pY/2xaaVBVREY3/zRuagAAAAAA+g==","upper_bound":"AURJdWNYbmoA/g==","repeats":1},{"count":432,"lower_bound":"AURLT0dGbU4A/g==","upper_bound":"AURhZDdyOGRM/2cAAAAAAAAA+A==","repeats":1},{"count":440,"lower_bound":"AURjWQAAAAAA+g==","upper_bound":"AURwSGdFYXVT/3duUkRyakt6/2hrAAAAAAAA+Q==","repeats":1},{"count":448,"lower_bound":"AURycm03RHI5/1RiVEFoAAAA/A==","upper_bound":"AUU1SkJDdUdp/0xtSQAAAAAA+g==","repeats":1},{"count":456,"lower_bound":"AUU2R0wAAAAA+w==","upper_bound":"AUVTMVZURFh4/zZmUVlFAAAA/A==","repeats":1},{"count":464,"lower_bound":"AUVXSEdVM3pH/0c0WDlmMm96/wAAAAAAAAAA9w==","upper_bound":"AUVxWnhrNmxF/0ZVcAAAAAAA+g==","repeats":1},{"count":474,"lower_bound":"AUVycmFxWmFK/1doAAAAAAAA+Q==","upper_bound":"AUY0VUZ6b1AA/g==","repeats":1},{"count":482,"lower_bound":"AUY2R2hUeUt4/3d1V1RNRgAA/Q==","upper_bound":"AUZPAAAAAAAA+Q==","repeats":1},{"count":490,"lower_bound":"AUZQUnZUd1M5/3JkMDJ4Vm02/01xcQAAAAAA+g==","upper_bound":"AUZhSnRHVlZY/1dWSXZieGxU/wAAAAAAAAAA9w==","repeats":1},{"count":498,"lower_bound":"AUZiQTczS1pH/2sxY1RRAAAA/A==","upper_bound":"AUZybFRGaHZj/2NKSWV1TTQA/g==","repeats":1},{"count":506,"lower_bound":"AUZ0MU42V09k/zJONkkAAAAA+w==","upper_bound":"AUc0SwAAAAAA+g==","repeats":1},{"count":514,"lower_bound":"AUc1d0Q1SDVW/3lTM0c4Z1dB/1JJenIAAAAA+w==","upper_bound":"AUdBcEkAAAAA+w==","repeats":1},{"count":523,"lower_bound":"AUdESHZPY0lP/2lkM0lVAAAA/A==","upper_bound":"AUdUU3UAAAAA+w==","repeats":1},{"count":531,"lower_bound":"AUdVZ21sVHh5/0gzTVpPZgAA/Q==","upper_bound":"AUdmRnVRUUZ1/3owVDJpSWIA/g==","repeats":1},{"count":539,"lower_bound":"AUdqdWt6d3cA/g==","upper_bound":"AUdvdFlrRGVq/zNOVk82AAAA/A==","repeats":1},{"count":547,"lower_bound":"AUd1R3Z6QQAA/Q==","upper_bound":"AUhBUm5rZ1Jv/zEAAAAAAAAA+A==","repeats":1},{"count":555,"lower_bound":"AUhCM0tyanRu/0d3VHJiVwAA/Q==","upper_bound":"AUhQVUlMWUQ0/3NkRjJyNXZ0/1p5MgAAAAAA+g==","repeats":1},{"count":563,"lower_bound":"AUhQanBYWFIA/g==","upper_bound":"AUhiaHV4R0F5/zh0MElXMzMA/g==","repeats":1},{"count":571,"lower_bound":"AUhmNWpCOXBp/zJneVhoZUlN/3hzAAAAAAAA+Q==","upper_bound":"AUh4THZROWZu/3hGb0JRQUgA/g==","repeats":1},{"count":579,"lower_bound":"AUh5cWYAAAAA+w==","upper_bound":"AUlBZDZlMlpR/1IAAAAAAAAA+A==","repeats":1},{"count":587,"lower_bound":"AUlCcEFKTTM4/1VWMnZKAAAA/A==","upper_bound":"AUlKckpMOXlM/1pjMmRkMVV3/wAAAAAAAAAA9w==","repeats":1},{"count":595,"lower_bound":"AUlMZW5Wc0ps/1hycW9QUHRE/3EwVgAAAAAA+g==","upper_bound":"AUlVWVVLN3Zl/2Q4SlkAAAAA+w==","repeats":1},{"count":603,"lower_bound":"AUlWAAAAAAAA+Q==","upper_bound":"AUlseGdxam5X/05YcWNwc25Y/zB4SWUAAAAA+w==","repeats":1},{"count":611,"lower_bound":"AUluUnEzQkwA/g==","upper_bound":"AUoyb0p1aVZT/zRCbHFQT1BI/wAAAAAAAAAA9w==","repeats":1},{"count":619,"lower_bound":"AUo1czZGVE4A/g==","upper_bound":"AUpRTHVZMkkA/g==","repeats":1},{"count":627,"lower_bound":"AUpSNlV4cwAA/Q==","upper_bound":"AUpoAAAAAAAA+Q==","repeats":1},{"count":635,"lower_bound":"AUppUQAAAAAA+g==","upper_bound":"AUp1RldudjRz/0l0T1V2aVZt/0tqcQAAAAAA+g==","repeats":1},{"count":643,"lower_bound":"AUp1ekxveDdM/3ZvAAAAAAAA+Q==","upper_bound":"AUsyaEE4OWc0/wAAAAAAAAAA9w==","repeats":1},{"count":651,"lower_bound":"AUsybjNkSzRP/wAAAAAAAAAA9w==","upper_bound":"AUtCAAAAAAAA+Q==","repeats":1},{"count":659,"lower_bound":"AUtFZzdGb3NH/zhsagAAAAAA+g==","upper_bound":"AUtjU0dqdTUA/g==","repeats":1},{"count":667,"lower_bound":"AUtlVzBxcFow/3UxOVlFc3cA/g==","upper_bound":"AUtuc1pKAAAA/A==","repeats":1},{"count":675,"lower_bound":"AUt1OUZOODR0/2JSd29HV1Nh/29BOXAAAAAA+w==","upper_bound":"AUwwQlc5WEFw/0U0WEhHSG4y/3RiMFoAAAAA+w==","repeats":1},{"count":683,"lower_bound":"AUwwT1ZoQ3hR/1BmMVBuQ2dY/2VRdwAAAAAA+g==","upper_bound":"AUxCWHVIdHlw/3JiNElvYwAA/Q==","repeats":1},{"count":691,"lower_bound":"AUxCeFcAAAAA+w==","upper_bound":"AUxPOTl6M0oy/0pPQTcAAAAA+w==","repeats":1},{"count":699,"lower_bound":"AUxQc3ljdGc1/zBrdXFiYmJj/1UAAAAAAAAA+A==","upper_bound":"AUxsS3BzWnV0/0NSN3pRQUhO/zJ6AAAAAAAA+Q==","repeats":1},{"count":707,"lower_bound":"AUxvN0IAAAAA+w==","upper_bound":"AUx6UTNYT0hW/2t0AAAAAAAA+Q==","repeats":1},{"count":715,"lower_bound":"AU0AAAAAAAAA+A==","upper_bound":"AU1FTk5RAAAA/A==","repeats":1},{"count":723,"lower_bound":"AU1GemJBU05S/zAxUm1xazcA/g==","upper_bound":"AU1QWUZrbU9X/1NQcnJmVUdw/2JHRwAAAAAA+g==","repeats":1},{"count":731,"lower_bound":"AU1SMk41Y1k1/0dwajNXTEU0/zlRNzEAAAAA+w==","upper_bound":"AU1xaUIxMnph/1NhclUxN1YA/g==","repeats":1},{"count":739,"lower_bound":"AU10RDJpcm1k/2MAAAAAAAAA+A==","upper_bound":"AU4AAAAAAAAA+A==","repeats":1},{"count":747,"lower_bound":"AU4wNWxMaFhs/wAAAAAAAAAA9w==","upper_bound":"AU5KAAAAAAAA+Q==","repeats":1},{"count":755,"lower_bound":"AU5LOGJ3MkFD/1JtOVcAAAAA+w==","upper_bound":"AU5WMG51NzR3/1dFNkJTcTNp/0kAAAAAAAAA+A==","repeats":1},{"count":763,"lower_bound":"AU5WTWdkbTgz/zEAAAAAAAAA+A==","upper_bound":"AU5rYTd0RnVt/2lmAAAAAAAA+Q==","repeats":1},{"count":771,"lower_bound":"AU5sam9xOWxk/2diSHNZVHcA/g==","upper_bound":"AU56a1IAAAAA+w==","repeats":1},{"count":779,"lower_bound":"AU8AAAAAAAAA+A==","upper_bound":"AU9FU0k2Z1hx/3IAAAAAAAAA+A==","repeats":1},{"count":787,"lower_bound":"AU9FeDE4Z1ZP/2tIZ29kcAAA/Q==","upper_bound":"AU9OTkpYejBF/2xUMkZoTQAA/Q==","repeats":1},{"count":795,"lower_bound":"AU9PZEx5R3AA/g==","upper_bound":"AU9sc0JLAAAA/A==","repeats":1},{"count":803,"lower_bound":"AU9uAAAAAAAA+Q==","upper_bound":"AVAAAAAAAAAA+A==","repeats":2},{"count":811,"lower_bound":"AVAwVmdxZXdw/2diblB0MVdV/wAAAAAAAAAA9w==","upper_bound":"AVBEWWVIWGkw/3FqSUN5S0Q3/0UAAAAAAAAA+A==","repeats":1},{"count":819,"lower_bound":"AVBJAAAAAAAA+Q==","upper_bound":"AVBPeVhJbW5q/2NSa1p3VgAA/Q==","repeats":1},{"count":827,"lower_bound":"AVBRRGU1YkNl/1pNaVhCRzJu/3JhVzAAAAAA+w==","upper_bound":"AVBnNGNKRVNt/wAAAAAAAAAA9w==","repeats":1},{"count":835,"lower_bound":"AVBteHd3N2Iy/3o0OHdJYVgA/g==","upper_bound":"AVB4ODVuNwAA/Q==","repeats":1},{"count":843,"lower_bound":"AVB5dmhpQjhE/wAAAAAAAAAA9w==","upper_bound":"AVFERjZpWVdk/25RTTBOcFZM/2xLAAAAAAAA+Q==","repeats":1},{"count":851,"lower_bound":"AVFETUJCc3Rp/1BpOGMAAAAA+w==","upper_bound":"AVFNTXN0Tk1t/0phbzBaOUwA/g==","repeats":1},{"count":859,"lower_bound":"AVFUcHlMcHhp/2g4cWh0bwAA/Q==","upper_bound":"AVFlYTBtcUoz/3hoODV1ODRS/wAAAAAAAAAA9w==","repeats":1},{"count":867,"lower_bound":"AVFlb1pCAAAA/A==","upper_bound":"AVFyWWJhdnBv/09EY0djYXh4/3YxNnUAAAAA+w==","repeats":1},{"count":876,"lower_bound":"AVF4Y0xJAAAA/A==","upper_bound":"AVJHAAAAAAAA+Q==","repeats":1},{"count":884,"lower_bound":"AVJKUkxuSnZx/2NzN0FrAAAA/A==","upper_bound":"AVJSbmV0cFZk/09ZeEg4N1Qx/25qNQAAAAAA+g==","repeats":1},{"count":892,"lower_bound":"AVJTMGl1AAAA/A==","upper_bound":"AVJnQ3FjM2xq/0IAAAAAAAAA+A==","repeats":1},{"count":900,"lower_bound":"AVJoTXJlMTF6/1hyAAAAAAAA+Q==","upper_bound":"AVJwWlcyWnQw/2ZkRVBldUtD/0lsb2YAAAAA+w==","repeats":1},{"count":909,"lower_bound":"AVJxQlUxbTlU/3lqZ3MAAAAA+w==","upper_bound":"AVM1T1BEcjBz/3BLT0RRTQAA/Q==","repeats":1},{"count":917,"lower_bound":"AVM1dHJFT25O/0cAAAAAAAAA+A==","upper_bound":"AVNNMGRQZG1M/2xMbkUzAAAA/A==","repeats":1},{"count":925,"lower_bound":"AVNSVXRVQldu/0ZjbXhqa0NF/1ZnAAAAAAAA+Q==","upper_bound":"AVNoVkdNdAAA/Q==","repeats":1},{"count":933,"lower_bound":"AVNsZGNsbDM0/2hSWQAAAAAA+g==","upper_bound":"AVN6Q3VaVGRM/zlwV3YAAAAA+w==","repeats":1},{"count":941,"lower_bound":"AVN6b0o1QVcy/zBKbVo0S2UA/g==","upper_bound":"AVRCMWN0cEI0/01VAAAAAAAA+Q==","repeats":1},{"count":949,"lower_bound":"AVREeDRGYU9G/zBjYlJKU2ta/3gAAAAAAAAA+A==","upper_bound":"AVRQAAAAAAAA+Q==","repeats":1},{"count":957,"lower_bound":"AVRTS1IAAAAA+w==","upper_bound":"AVRnTHRPVmJz/2NFSnhMYk1w/zMAAAAAAAAA+A==","repeats":1},{"count":965,"lower_bound":"AVRpYWUwWTQ2/25mSUZkZWMA/g==","upper_bound":"AVUAAAAAAAAA+A==","repeats":1},{"count":973,"lower_bound":"AVUxaTF2RUFC/zFiZFk5bAAA/Q==","upper_bound":"AVVHQ3RxWEZ2/24AAAAAAAAA+A==","repeats":1},{"count":981,"lower_bound":"AVVJU2hRdQAA/Q==","upper_bound":"AVVaUGFQaDQA/g==","repeats":1},{"count":989,"lower_bound":"AVVheW1SdkRK/3VhM1JyZjgA/g==","upper_bound":"AVVrAAAAAAAA+Q==","repeats":1},{"count":997,"lower_bound":"AVVrTzNGAAAA/A==","upper_bound":"AVV6a3R4ellO/zBaAAAAAAAA+Q==","repeats":1},{"count":1005,"lower_bound":"AVYAAAAAAAAA+A==","upper_bound":"AVZJaFkAAAAA+w==","repeats":1},{"count":1013,"lower_bound":"AVZMdVZXemht/wAAAAAAAAAA9w==","upper_bound":"AVZkQUdtZnNp/zdGTGRUAAAA/A==","repeats":1},{"count":1021,"lower_bound":"AVZoSHIAAAAA+w==","upper_bound":"AVZ3Z29iY2M1/0VDbQAAAAAA+g==","repeats":1},{"count":1029,"lower_bound":"AVZ5AAAAAAAA+Q==","upper_bound":"AVdGUjZFY2Uz/2lvAAAAAAAA+Q==","repeats":1},{"count":1037,"lower_bound":"AVdIYW5OaWk1/01jMFdNAAAA/A==","upper_bound":"AVdTbVFWNTBk/zZNa3pMNUZ6/3gAAAAAAAAA+A==","repeats":1},{"count":1045,"lower_bound":"AVdUUWlheGpq/3hHAAAAAAAA+Q==","upper_bound":"AVdiWGNlb2Rx/01IdzYAAAAA+w==","repeats":1},{"count":1053,"lower_bound":"AVdib1hqeDJt/2JFTlZmWHM5/3JNQgAAAAAA+g==","upper_bound":"AVdpNTFtam5U/wAAAAAAAAAA9w==","repeats":1},{"count":1061,"lower_bound":"AVdsAAAAAAAA+Q==","upper_bound":"AVgyVzBLbXZr/zhtcmkAAAAA+w==","repeats":1},{"count":1069,"lower_bound":"AVg0aW9hMGI2/zMAAAAAAAAA+A==","upper_bound":"AVhFSUV1QmV5/1QAAAAAAAAA+A==","repeats":1},{"count":1077,"lower_bound":"AVhMMFNuczVk/zdnaUYAAAAA+w==","upper_bound":"AVhWY2wwTUJT/wAAAAAAAAAA9w==","repeats":1},{"count":1085,"lower_bound":"AVhXRUR5RHcy/zRxWWcwdQAA/Q==","upper_bound":"AVhpbHhGZmtk/wAAAAAAAAAA9w==","repeats":1},{"count":1093,"lower_bound":"AVhubHV6VQAA/Q==","upper_bound":"AVkxdjRGVE1Z/2ZaQThYTndC/wAAAAAAAAAA9w==","repeats":1},{"count":1101,"lower_bound":"AVkyY0hLAAAA/A==","upper_bound":"AVlKbFZNMnlQ/3czTG5GNUJK/wAAAAAAAAAA9w==","repeats":1},{"count":1109,"lower_bound":"AVlLMjFTbFNM/1dlZ0cAAAAA+w==","upper_bound":"AVlPQWJkAAAA/A==","repeats":1},{"count":1117,"lower_bound":"AVlPUTU3VFhF/2FQM2VIdHNL/2pBaAAAAAAA+g==","upper_bound":"AVlqZ2hERDdE/0IAAAAAAAAA+A==","repeats":1},{"count":1125,"lower_bound":"AVlsWEdMa2la/21RTVNFSjR0/1FiAAAAAAAA+Q==","upper_bound":"AVl6d00xNmNq/0tGVVBPdW9p/21VM0gAAAAA+w==","repeats":1},{"count":1133,"lower_bound":"AVowelEAAAAA+w==","upper_bound":"AVpIekRWa3JT/0dYSW1xWmFI/1hEVkwAAAAA+w==","repeats":1},{"count":1141,"lower_bound":"AVpKMWpHAAAA/A==","upper_bound":"AVpXNmhOZDNs/0ZRVwAAAAAA+g==","repeats":1},{"count":1149,"lower_bound":"AVpaVWNmeGRo/3ZZAAAAAAAA+Q==","upper_bound":"AVpqV3Y2UGQx/2dhAAAAAAAA+Q==","repeats":1},{"count":1157,"lower_bound":"AVpqY3lsRVhr/0U4b0hna3l0/2EAAAAAAAAA+A==","upper_bound":"AVpydEVWVgAA/Q==","repeats":1},{"count":1165,"lower_bound":"AVpzODlHbWgA/g==","upper_bound":"AVp6Tnc1d1oA/g==","repeats":1},{"count":1173,"lower_bound":"AWEAAAAAAAAA+A==","upper_bound":"AWFBWnlNN1FN/1ZJcjY2eU9n/wAAAAAAAAAA9w==","repeats":1},{"count":1181,"lower_bound":"AWFCbjN3AAAA/A==","upper_bound":"AWFhAAAAAAAA+Q==","repeats":1},{"count":1189,"lower_bound":"AWFhelEAAAAA+w==","upper_bound":"AWFqVAAAAAAA+g==","repeats":1},{"count":1197,"lower_bound":"AWFrAAAAAAAA+Q==","upper_bound":"AWF1cHVEYW5N/3cAAAAAAAAA+A==","repeats":1},{"count":1205,"lower_bound":"AWF2Q1dNREFj/0IAAAAAAAAA+A==","upper_bound":"AWIySEZkMUtP/2hOa3dqM01K/0pDAAAAAAAA+Q==","repeats":1},{"count":1213,"lower_bound":"AWIydmp2VDk1/085aG1ldEJu/1oAAAAAAAAA+A==","upper_bound":"AWJKZFkwaUVB/29hdzBwUGQz/2g3QQAAAAAA+g==","repeats":1},{"count":1221,"lower_bound":"AWJMbDJsSmpB/wAAAAAAAAAA9w==","upper_bound":"AWJVem1xbW14/21keUFERQAA/Q==","repeats":1},{"count":1229,"lower_bound":"AWJWUVlndEFH/1hYAAAAAAAA+Q==","upper_bound":"AWJja3VqVFFh/0VFYzVyY0g0/1NoQQAAAAAA+g==","repeats":1},{"count":1237,"lower_bound":"AWJnQ0dRajIA/g==","upper_bound":"AWJ3VVpZUmdV/wAAAAAAAAAA9w==","repeats":1},{"count":1245,"lower_bound":"AWMAAAAAAAAA+A==","upper_bound":"AWM2TFJ4MlEy/0Z6dU5ncHgA/g==","repeats":1},{"count":1253,"lower_bound":"AWM4AAAAAAAA+Q==","upper_bound":"AWNOR21sNQAA/Q==","repeats":1},{"count":1261,"lower_bound":"AWNQalNTcHVZ/25JM05QZWFU/2xqSgAAAAAA+g==","upper_bound":"AWNpMXFBdzd4/2dOMHlaQ2pv/2o2VQAAAAAA+g==","repeats":1},{"count":1269,"lower_bound":"AWNpQwAAAAAA+g==","upper_bound":"AWQwMGI5ZGFl/3RpanNlQgAA/Q==","repeats":1},{"count":1277,"lower_bound":"AWQyN1JmbmEA/g==","upper_bound":"AWRGSXp1Y2kA/g==","repeats":1},{"count":1285,"lower_bound":"AWRGbnJuNGFa/25HdFhzam1x/wAAAAAAAAAA9w==","upper_bound":"AWRXeG50QzI0/3cAAAAAAAAA+A==","repeats":1},{"count":1293,"lower_bound":"AWRYV0h0cVYA/g==","upper_bound":"AWRrY0g0VDVo/25hdzRrallt/3VBAAAAAAAA+Q==","repeats":1},{"count":1301,"lower_bound":"AWRsSWQAAAAA+w==","upper_bound":"AWR1eWd6M1EA/g==","repeats":1},{"count":1309,"lower_bound":"AWR4WkhHN2p6/2VLNmgxb1Zi/zUAAAAAAAAA+A==","upper_bound":"AWU2AAAAAAAA+Q==","repeats":1},{"count":1317,"lower_bound":"AWU5aHpCb3NO/0h2d3cAAAAA+w==","upper_bound":"AWVNbUZNWkIz/3IybmhDdjZU/1JEWm0AAAAA+w==","repeats":1},{"count":1325,"lower_bound":"AWVRUXE2N3MA/g==","upper_bound":"AWVXZnE4Wnd4/24wNWoxSHda/21wRQAAAAAA+g==","repeats":1},{"count":1333,"lower_bound":"AWVXbzV1Zklj/0cAAAAAAAAA+A==","upper_bound":"AWVpb1ZmRXY5/2pzYwAAAAAA+g==","repeats":1},{"count":1341,"lower_bound":"AWVsTUx0TU5y/2xxY1M1Y0J5/wAAAAAAAAAA9w==","upper_bound":"AWY1UGxoalpU/3FiTAAAAAAA+g==","repeats":1},{"count":1349,"lower_bound":"AWY4T3NMZ1dw/0gAAAAAAAAA+A==","upper_bound":"AWZadTdYdnUA/g==","repeats":1},{"count":1357,"lower_bound":"AWZhMXh3QmR4/0d4Z1UxQUdy/21LAAAAAAAA+Q==","upper_bound":"AWZydnFVagAA/Q==","repeats":1},{"count":1365,"lower_bound":"AWZ0MnI2TThB/zFYZWwAAAAA+w==","upper_bound":"AWc1ZEUAAAAA+w==","repeats":1},{"count":1373,"lower_bound":"AWc2a0FmWXVw/2ZJRGxOTk5Y/wAAAAAAAAAA9w==","upper_bound":"AWdQeW9MeFh3/1JQYThEAAAA/A==","repeats":1},{"count":1381,"lower_bound":"AWdXMUQyblZN/zZIAAAAAAAA+Q==","upper_bound":"AWdiUTVrbEFx/zgAAAAAAAAA+A==","repeats":1},{"count":1389,"lower_bound":"AWdjZkEycwAA/Q==","upper_bound":"AWd4NGlhAAAA/A==","repeats":1},{"count":1397,"lower_bound":"AWgAAAAAAAAA+A==","upper_bound":"AWg4NE1ESQAA/Q==","repeats":1},{"count":1405,"lower_bound":"AWhDeTZEM3M4/0o0MElab0F1/1p6OQAAAAAA+g==","upper_bound":"AWhTVzlFNFNk/0hreGNtbHhP/wAAAAAAAAAA9w==","repeats":1},{"count":1413,"lower_bound":"AWhTbVlhNXdT/2xsAAAAAAAA+Q==","upper_bound":"AWhlYWZmMUUA/g==","repeats":1},{"count":1421,"lower_bound":"AWhmemRGbFRQ/zR2VTRnc3k0/00AAAAAAAAA+A==","upper_bound":"AWh2UlNWcXk4/2NMaWVCTAAA/Q==","repeats":1},{"count":1429,"lower_bound":"AWh2enhUY0Rr/2xNMEdIem0A/g==","upper_bound":"AWlBRk85AAAA/A==","repeats":1},{"count":1437,"lower_bound":"AWlGWXBqTlg5/2ZpaW0AAAAA+w==","upper_bound":"AWlRekdBd1JR/3VhZHdtAAAA/A==","repeats":1},{"count":1445,"lower_bound":"AWlSTEQxaERa/3NGAAAAAAAA+Q==","upper_bound":"AWliOEk1Mkxq/zlQRjZ4M0tl/1h4AAAAAAAA+Q==","repeats":1},{"count":1453,"lower_bound":"AWlkV0ZJREFa/2RobW1jY3UA/g==","upper_bound":"AWlua2MAAAAA+w==","repeats":1},{"count":1461,"lower_bound":"AWlvaG9PQlpj/3ZaAAAAAAAA+Q==","upper_bound":"AWozdUJwNGRQ/1JtNUt2bFJY/2JqAAAAAAAA+Q==","repeats":1},{"count":1469,"lower_bound":"AWo0NHNaUU1m/0tLOQAAAAAA+g==","upper_bound":"AWpITwAAAAAA+g==","repeats":1},{"count":1477,"lower_bound":"AWpIeGJIU04A/g==","upper_bound":"AWpPdzd4WVJU/1YAAAAAAAAA+A==","repeats":1},{"count":1485,"lower_bound":"AWpSUEdVNnkz/zZyYTZHAAAA/A==","upper_bound":"AWphNG0AAAAA+w==","repeats":1},{"count":1493,"lower_bound":"AWpiR1dhb2pH/zcAAAAAAAAA+A==","upper_bound":"AWsAAAAAAAAA+A==","repeats":1},{"count":1501,"lower_bound":"AWs0ZEdJWTJJ/3UAAAAAAAAA+A==","upper_bound":"AWtGRGg3dFdl/wAAAAAAAAAA9w==","repeats":1},{"count":1509,"lower_bound":"AWtGVExBQlNz/3VtazBQaDgA/g==","upper_bound":"AWtQbDR0dE1s/wAAAAAAAAAA9w==","repeats":1},{"count":1517,"lower_bound":"AWtSR3ZOb2Ro/wAAAAAAAAAA9w==","upper_bound":"AWtXVnQ3cFNa/2I5RHhHbTkA/g==","repeats":1},{"count":1525,"lower_bound":"AWtYRFFMQwAA/Q==","upper_bound":"AWtudHlGM2xZ/zJLRVlsAAAA/A==","repeats":1},{"count":1533,"lower_bound":"AWtvVmRmNHF1/2NLNlJsWWEA/g==","upper_bound":"AWt4RVBhYnpi/1QzVllDaXRP/wAAAAAAAAAA9w==","repeats":1},{"count":1541,"lower_bound":"AWwAAAAAAAAA+A==","upper_bound":"AWxDYXpib0FY/0kAAAAAAAAA+A==","repeats":1},{"count":1549,"lower_bound":"AWxEAAAAAAAA+Q==","upper_bound":"AWxaQ1ZNM0s4/wAAAAAAAAAA9w==","repeats":1},{"count":1557,"lower_bound":"AWxhT2oAAAAA+w==","upper_bound":"AWxsVgAAAAAA+g==","repeats":1},{"count":1565,"lower_bound":"AWxsdAAAAAAA+g==","upper_bound":"AWx5YkZCegAA/Q==","repeats":1},{"count":1573,"lower_bound":"AW0AAAAAAAAA+A==","upper_bound":"AW01eDAAAAAA+w==","repeats":1},{"count":1581,"lower_bound":"AW01emFzSEtC/3hDN3JsAAAA/A==","upper_bound":"AW1CSU93ekdG/zdvNHpqMQAA/Q==","repeats":1},{"count":1589,"lower_bound":"AW1EawAAAAAA+g==","upper_bound":"AW1PUVk2T05p/05aWEVuTgAA/Q==","repeats":1},{"count":1597,"lower_bound":"AW1VUGkwVm8w/3NlWk9vWGJM/2RYVAAAAAAA+g==","upper_bound":"AW1lTWlLAAAA/A==","repeats":1},{"count":1605,"lower_bound":"AW1maDh0elpr/0xiUEFMalNL/zdyNWIAAAAA+w==","upper_bound":"AW1wZgAAAAAA+g==","repeats":1},{"count":1613,"lower_bound":"AW1xMTlwczlZ/1doZXBFM1dH/wAAAAAAAAAA9w==","upper_bound":"AW13ZFV5WAAA/Q==","repeats":1},{"count":1621,"lower_bound":"AW4AAAAAAAAA+A==","upper_bound":"AW5IWmFaRnEx/0x0QzRpTmJv/1dPAAAAAAAA+Q==","repeats":1},{"count":1629,"lower_bound":"AW5IawAAAAAA+g==","upper_bound":"AW5YTW5DNGhO/1piRjQwTnlI/1lZAAAAAAAA+Q==","repeats":1},{"count":1637,"lower_bound":"AW5hUjJLQjZB/zJXS2IxSzZY/wAAAAAAAAAA9w==","upper_bound":"AW5rcm4AAAAA+w==","repeats":1},{"count":1645,"lower_bound":"AW5rdERzbnRO/zVZRTIAAAAA+w==","upper_bound":"AW8ycmdzRnVx/zZHZ2QwYUEx/2YyNgAAAAAA+g==","repeats":1},{"count":1653,"lower_bound":"AW85ZXRxVDhv/1NTZkRNTWhJ/3lqbgAAAAAA+g==","upper_bound":"AW9IMjB2NkNU/0FjeU5ySVcA/g==","repeats":1},{"count":1661,"lower_bound":"AW9IQ1Q3THNR/0tMTFhkAAAA/A==","upper_bound":"AW9VeThUeQAA/Q==","repeats":1},{"count":1669,"lower_bound":"AW9YSmVFS2xj/2xKNwAAAAAA+g==","upper_bound":"AW9mejNUMGt6/0J1ZWZiMjIw/wAAAAAAAAAA9w==","repeats":1},{"count":1679,"lower_bound":"AW9qcjlaRGxo/09RcWRMMFFz/wAAAAAAAAAA9w==","upper_bound":"AXAAAAAAAAAA+A==","repeats":3},{"count":1687,"lower_bound":"AXAxeFM2cFRx/2J6b0poZG45/zEwdAAAAAAA+g==","upper_bound":"AXBNSGpoU3lF/0czV1ptWDIA/g==","repeats":1},{"count":1695,"lower_bound":"AXBOeVZLAAAA/A==","upper_bound":"AXBYAAAAAAAA+Q==","repeats":1},{"count":1703,"lower_bound":"AXBac0FYVm4A/g==","upper_bound":"AXEAAAAAAAAA+A==","repeats":1},{"count":1711,"lower_bound":"AXE0TGE3REIA/g==","upper_bound":"AXFUM1J5bXBF/1ZJUFFlSgAA/Q==","repeats":1},{"count":1719,"lower_bound":"AXFVZUJPTzll/zN3cUdDZ2l1/1FvRAAAAAAA+g==","upper_bound":"AXFmbXZabVdm/1EzUUtYNFJ0/29NAAAAAAAA+Q==","repeats":1},{"count":1727,"lower_bound":"AXFtcEtjSnJD/zFXRmg3Ujc5/2dpAAAAAAAA+Q==","upper_bound":"AXF5VFVCQjJ2/2c2aQAAAAAA+g==","repeats":1},{"count":1735,"lower_bound":"AXIAAAAAAAAA+A==","upper_bound":"AXJLOAAAAAAA+g==","repeats":1},{"count":1743,"lower_bound":"AXJNWjMAAAAA+w==","upper_bound":"AXJhbHNCAAAA/A==","repeats":1},{"count":1751,"lower_bound":"AXJjMFQ1bVJo/1ptRlpkcFBD/wAAAAAAAAAA9w==","upper_bound":"AXJzNDFMb3Zo/wAAAAAAAAAA9w==","repeats":1},{"count":1759,"lower_bound":"AXJzcUpzN3o2/3lLQVV6WgAA/Q==","upper_bound":"AXJ4dWF3UkIx/zd4RWowanln/wAAAAAAAAAA9w==","repeats":1},{"count":1767,"lower_bound":"AXJ6RzAxcTY4/wAAAAAAAAAA9w==","upper_bound":"AXM1ejUxZFQw/1lmUHJRR1UA/g==","repeats":1},{"count":1775,"lower_bound":"AXNEQ2E0MFo2/zRPU0VEU1hq/3FISgAAAAAA+g==","upper_bound":"AXNQRENVTTVP/3JiV0RlUFE4/wAAAAAAAAAA9w==","repeats":1},{"count":1783,"lower_bound":"AXNRc09Scngy/05KbVZtYkU2/21IAAAAAAAA+Q==","upper_bound":"AXNiQldFYnEw/3ZSbDRTZXNw/zEAAAAAAAAA+A==","repeats":1},{"count":1791,"lower_bound":"AXNkRjhtR2JT/2NmAAAAAAAA+Q==","upper_bound":"AXN2dXRXdWxK/21sSFg1TUZn/3ltQjYAAAAA+w==","repeats":1},{"count":1799,"lower_bound":"AXN5YlNwOAAA/Q==","upper_bound":"AXQ0Wmp1ZERX/0k5cQAAAAAA+g==","repeats":1},{"count":1807,"lower_bound":"AXQ1SFNPT0h2/zl3T2s1VXFZ/zIySUUAAAAA+w==","upper_bound":"AXRlawAAAAAA+g==","repeats":1},{"count":1815,"lower_bound":"AXRoMQAAAAAA+g==","upper_bound":"AXRzdUVlZzMw/zRsQ0lyMm5K/3BMYwAAAAAA+g==","repeats":1},{"count":1823,"lower_bound":"AXR2SHl0Q2Fq/0VRNEYzeEJ0/0gAAAAAAAAA+A==","upper_bound":"AXU5AAAAAAAA+Q==","repeats":1},{"count":1831,"lower_bound":"AXU5TkZIbFZn/3ViAAAAAAAA+Q==","upper_bound":"AXVQbThoQ2dD/0dFRVNDNgAA/Q==","repeats":1},{"count":1839,"lower_bound":"AXVTY3RmeURI/0tiNDU3NVMA/g==","upper_bound":"AXVzUDFRQWw0/wAAAAAAAAAA9w==","repeats":1},{"count":1847,"lower_bound":"AXV0dm8AAAAA+w==","upper_bound":"AXYzdAAAAAAA+g==","repeats":1},{"count":1855,"lower_bound":"AXY4cTFhYnds/3ZwQW44aW5u/wAAAAAAAAAA9w==","upper_bound":"AXZPRWJVVVcx/1FZR2ppMgAA/Q==","repeats":1},{"count":1863,"lower_bound":"AXZPazVpdWo0/21aaWQyamxV/1Vya3gAAAAA+w==","upper_bound":"AXZiOGo0NWlZ/zh3cDl6cHJR/0VGUgAAAAAA+g==","repeats":1},{"count":1871,"lower_bound":"AXZiaml5M3dC/2Q2ZFpWZgAA/Q==","upper_bound":"AXZrdWM3bzJM/1h0VXFUME1z/3RZUXcAAAAA+w==","repeats":1},{"count":1879,"lower_bound":"AXZvTGVSaXF1/zFESVFFdjJZ/1hNbgAAAAAA+g==","upper_bound":"AXc1NW1NVUVV/3kAAAAAAAAA+A==","repeats":1},{"count":1887,"lower_bound":"AXc2dUxKSDB0/1RLMXEAAAAA+w==","upper_bound":"AXdHejk3QWti/3JsZkFnZWNi/0cAAAAAAAAA+A==","repeats":1},{"count":1895,"lower_bound":"AXdIWjY4NnQw/1dSWTlnOQAA/Q==","upper_bound":"AXdiaGRQNGZu/0VVM1hLVHVt/0FBVQAAAAAA+g==","repeats":1},{"count":1903,"lower_bound":"AXdmZ3A5ZEFG/3dEAAAAAAAA+Q==","upper_bound":"AXdzcHpvWnBF/0NUUnBPaGkA/g==","repeats":1},{"count":1911,"lower_bound":"AXd0RFJGOU1L/0tFclVvQ1Nt/wAAAAAAAAAA9w==","upper_bound":"AXg2QnZ4NDh2/3laSkt6UwAA/Q==","repeats":1},{"count":1919,"lower_bound":"AXhBVVN3Ym5j/0lZZjVWcEJj/3htTQAAAAAA+g==","upper_bound":"AXhNS0xWWWR5/0IAAAAAAAAA+A==","repeats":1},{"count":1927,"lower_bound":"AXhNUVVqNWhK/0Y2Rmh1TlZl/zYAAAAAAAAA+A==","upper_bound":"AXhZcUlSekk2/1BFWnBpNWlK/wAAAAAAAAAA9w==","repeats":1},{"count":1935,"lower_bound":"AXhhaDlGNENO/3hVSgAAAAAA+g==","upper_bound":"AXhvMU50aWVs/wAAAAAAAAAA9w==","repeats":1},{"count":1943,"lower_bound":"AXhvOE9aMDhS/2xKQks5ZAAA/Q==","upper_bound":"AXkwT2E4NU5v/0hnVlpCRWI3/zMAAAAAAAAA+A==","repeats":1},{"count":1951,"lower_bound":"AXk3NVZ2bVhv/2JLQ2sAAAAA+w==","upper_bound":"AXlKU3R6azIy/3FNAAAAAAAA+Q==","repeats":1},{"count":1959,"lower_bound":"AXlLYWZKVE9U/25kYzYAAAAA+w==","upper_bound":"AXlXcE01OVdh/1ZmYkMAAAAA+w==","repeats":1},{"count":1967,"lower_bound":"AXlhN3ZINmdv/3N1RTBoMWJw/1FxZQAAAAAA+g==","upper_bound":"AXl4MnZ6bEp5/2VVeGQAAAAA+w==","repeats":1},{"count":1975,"lower_bound":"AXoAAAAAAAAA+A==","upper_bound":"AXpIcHR2V0ZK/2wAAAAAAAAA+A==","repeats":1},{"count":1983,"lower_bound":"AXpJd01KcUJ2/2ZjTklWUQAA/Q==","upper_bound":"AXpVampqUnYw/011Rm5sYmwA/g==","repeats":1},{"count":1991,"lower_bound":"AXpWZHRDYktY/2RqTkRZNQAA/Q==","upper_bound":"AXplNDhQNGoA/g==","repeats":1},{"count":1999,"lower_bound":"AXpnUFhpMFZZ/wAAAAAAAAAA9w==","upper_bound":"AXp3amIxY1dr/0xqNUhPcmtV/2VTAAAAAAAA+Q==","repeats":1},{"count":2000,"lower_bound":"AXp4eW5CNzlt/zMAAAAAAAAA+A==","upper_bound":"AXp4eW5CNzlt/zMAAAAAAAAA+A==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,2,1,1,0,2,0,2,5,1,1,0,1,1,4,1,1,1,0,0,1,0,0,0,1,0,1,0,0,0,0,4,0,0,1,1,1,4,3,3,0,3,1,0,2,0,0,1,2,1,0,2,3,0,1,5,1,0,3,3,0,0,2,0,2,1,1,0,0,1,2,1,1,1,0,1,3,4,0,0,2,1,1,1,1,1,1,0,0,2,1,0,2,1,1,1,2,0,3,1,2,0,0,0,2,1,0,3,0,1,2,4,1,3,1,1,1,1,1,0,0,1,1,3,3,2,0,0,1,1,1,1,0,1,0,0,2,2,1,1,0,1,0,1,1,0,0,3,3,1,1,1,0,1,2,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,1,1,1,2,0,0,0,2,1,1,2,1,0,1,0,1,2,1,1,1,0,1,2,0,0,0,0,0,2,0,0,2,2,0,0,0,1,1,1,1,2,1,0,0,0,0,0,1,4,0,3,0,2,3,0,2,2,0,1,0,0,0,1,1,1,1,0,1,0,0,2,1,0,1,4,0,1,2,1,1,0,1,1,1,2,0,1,0,1,2,2,1,2,1,0,0,2,2,0,2,2,0,1,0,0,0,0,1,2,3,0,2,2,2,0,2,0,1,1,4,1,2,0,1,2,2,2,2,1,2,1,0,2,0,0,1,1,2,4,1,2,1,1,0,1,1,2,0,1,0,0,2,1,0,1,2,1,1,4,1,1,1,2,1,2,1,1,0,1,0,1,1,0,1,0,2,1,3,1,1,0,2,2,1,0,0,1,1,0,0,2,5,0,1,0,1,0,1,0,4,1,2,1,6,1,1,0,0,0,0,3,1,1,3,1,0,1,0,0,1,1,1,0,0,0,3,0,3,1,4,0,0,0,2,0,1,0,1,1,0,2,0,0,0,2,2,1,0,3,1,1,1,1,0,0,0,1,0,2,0,0,0,2,4,5,1,3,3,2,0,0,0,1,1,2,0,1,1,4,1,0,1,2,0,1,0,2,0,0,1,1,0,1,0,1,0,0,2,2,0,1,1,3,0,1,1,1,2,1,1,0,2,0,1,2,0,1,1,0,0,1,1,2,1,2,0,2,0,1,2,2,0,7,0,0,2,1,0,1,0,2,1,0,1,0,0,2,0,1,0,2,3,1,1,2,0,2,1,1,0,1,0,2,1,0,1,1,1,1,0,0,0,2,0,0,0,1,1,2,2,0,1,0,4,0,2,0,0,0,0,0,3,1,0,0,2,0,1,1,0,3,0,0,0,0,2,2,2,1,0,0,1,0,1,1,1,3,2,2,1,0,0,2,0,3,0,1,4,0,2,0,0,1,1,5,0,1,0,0,1,0,0,1,0,1,0,1,0,1,0,0,1,1,0,1,0,0,2,1,2,0,1,0,0,3,1,2,3,0,2,1,0,1,0,1,1,1,0,0,0,1,0,0,0,1,0,2,2,2,0,0,2,1,1,1,0,0,0,1,1,1,0,1,0,0,2,2,1,0,0,1,2,1,0,1,1,3,0,0,1,3,0,1,0,4,3,2,2,1,0,0,5,0,1,0,1,1,0,1,0,1,1,0,1,2,0,1,0,0,0,2,1,0,0,0,2,0,1,0,0,2,1,2,2,1,1,0,1,0,1,2,0,2,0,2,0,2,1,1,0,1,0,2,0,0,1,0,0,2,0,0,1,2,1,1,1,0,0,3,0,1,2,3,1,1,2,0,0,3,0,0,1,2,1,2,1,3,0,0,2,0,1,2,1,1,1,0,1,0,0,0,0,2,3,1,1,1,1,1,0,0,2,2,1,1,1,3,0,0,1,0,0,2,0,0,1,1,3,1,1,0,1,0,0,1,2,0,0,1,2,0,2,1,3,1,2,0,0,1,2,0,0,1,1,2,1,2,1,0,1,2,5,1,0,0,0,1,3,2,0,2,0,2,2,0,2,0,0,1,1,0,1,0,0,1,0,0,0,1,1,2,0,0,0,2,1,2,1,2,0,2,1,0,1,1,0,1,0,1,0,1,1,0,1,0,0,2,0,1,2,1,0,0,0,3,1,0,0,0,2,0,0,2,3,0,0,0,0,0,2,3,1,3,1,2,1,0,3,2,0,0,1,1,0,2,0,2,0,1,2,0,2,2,0,1,0,0,0,0,1,2,0,0,2,0,0,3,1,0,0,1,0,1,0,1,2,0,2,2,1,1,0,0,1,1,1,0,0,3,0,0,0,3,3,1,0,0,1,0,2,0,3,0,2,2,0,0,1,2,3,3,1,1,1,0,1,2,1,3,3,0,2,1,0,0,0,1,2,1,1,3,2,2,0,0,1,2,0,0,0,1,1,0,1,0,1,2,1,0,0,0,1,0,0,3,2,0,1,2,1,0,1,0,1,0,1,2,0,1,2,0,0,0,3,2,1,2,1,0,1,1,1,3,0,1,1,1,2,3,1,0,0,0,0,1,0,0,0,1,1,3,0,0,1,2,0,3,3,0,0,0,0,0,3,0,1,2,2,1,0,0,0,2,0,2,2,1,1,3,2,1,1,1,0,1,0,0,0,0,1,0,1,1,1,0,0,1,2,0,0,1,0,1,1,1,2,1,0,1,1,0,0,0,0,3,2,1,3,0,1,0,0,0,0,0,1,0,0,0,2,2,1,0,1,0,1,0,0,1,2,0,2,0,0,0,0,0,1,1,0,0,0,2,1,1,1,0,2,2,0,1,1,0,2,0,1,2,1,0,0,2,0,1,0,2,2,3,0,0,0,0,2,1,0,2,3,2,1,2,1,0,1,3,2,1,0,1,2,4,1,1,0,1,1,0,0,3,4,0,3,1,1,1,1,2,3,1,4,2,0,0,1,2,0,0,1,0,1,1,3,1,0,1,0,1,1,1,0,0,0,4,1,1,1,1,1,2,1,0,3,0,0,0,1,3,2,1,1,1,0,0,2,1,1,3,2,2,1,0,1,0,2,2,0,1,2,1,0,2,0,0,0,2,1,0,0,0,2,1,1,1,0,2,2,3,1,2,0,1,1,0,0,0,0,0,2,1,3,0,0,2,3,0,1,1,1,0,3,1,2,2,0,0,3,0,1,0,2,3,1,1,1,2,0,2,2,0,0,2,1,2,1,1,0,1,0,4,0,0,0,1,0,1,1,0,2,1,1,0,2,2,3,1,1,1,1,0,0,1,1,4,1,1,1,3,2,2,6,1,2,0,0,0,0,1,0,3,0,1,0,0,1,0,1,3,0,2,2,4,0,1,1,1,0,0,1,0,0,0,1,0,2,0,1,1,3,1,1,1,2,1,2,2,1,0,0,0,1,2,0,1,0,1,0,2,2,1,0,0,2,0,0,2,1,2,0,1,0,2,1,1,1,0,2,1,2,0,0,0,0,2,1,1,0,2,0,1,2,0,0,0,1,1,2,1,1,0,0,0,0,0,0,1,0,1,0,3,2,1,0,0,1,0,2,0,0,0,3,0,0,0,3,0,3,0,0,2,1,1,1,0,0,0,1,3,2,2,1,0,0,2,0,1,1,0,2,2,2,1,1,2,3,0,1,0,4,0,0,2,0,1,0,2,0,2,5,1,0,0,1,0,2,0,0,2,1,0,4,2,1,0,1,1,0,1,1,0,0,0,1,1,0,4,5,1,1,0,0,1,0,1,0,1,1,0,1,2,0,0,2,6,1,1,0,0,0,2,3,0,1,1,1,0,1,1,0,1,1,2,0,1,2,3,0,0,0,1,1,2,0,0,0,1,0,0,1,0,0,1,0,1,0,3,2,1,2,1,1,0,2,3,1,0,0,2,0,0,1,1,0,0,1,0,0,2,0,0,0,2,2,1,1,1,0,2,0,0,2,0,1,1,0,3,2,1,1,0,0,0,1,0,3,0,1,0,1,1,2,0,3,1,1,1,4,0,1,0,4,1,1,1,1,3,0,2,0,0,0,0,0,0,1,0,3,1,1,0,0,2,0,0,1,1,1,0,0,0,1,1,2,0,0,0,0,0,0,1,0,2,0,1,1,2,2,1,1,0,0,0,0,2,0,2,2,0,0,1,2,1,1,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0,2,0,1,0,0,0,3,3,1,1,1,1,3,1,3,2,1,2,1,0,1,0,4,0,2,1,0,1,2,1,0,0,4,1,1,1,2,0,2,2,0,1,2,1,3,0,0,1,0,2,0,0,0,0,1,3,3,1,0,2,1,0,0,1,1,0,1,0,1,2,1,0,1,0,2,1,2,1,1,0,3,0,1,0,0,1,0,0,4,2,1,0,1,4,0,1,1,1,1,1,0,3,4,2,1,1,2,0,2,2,2,1,1,0,1,2,0,0,1,0,2,1,1,0,0,1,2,1,2,1,0,1,1,0,0,1,1,1,1,0,1,1,0,1,1,2,0,1,1,1,1,0,0,1,3,2,1,2,0,0,1,1,2,4,2,0,0,1,0,0,1,1,1,2,0,0,1,1,0,1,0,1,0,0,2,1,1,1,0,2,1,2,2,2,1,2,0,2,0,2,0,0,1,2,0,1,0,0,2,2,0,0]},{"counters":[0,2,1,0,1,0,0,3,4,1,0,1,1,4,1,1,1,0,2,2,2,2,0,2,1,0,1,0,0,2,4,1,0,2,2,0,1,1,2,2,4,1,0,2,1,2,0,1,0,0,2,1,2,3,2,2,0,1,1,0,0,0,0,1,1,0,2,0,2,2,1,0,0,1,1,1,1,0,0,0,1,0,0,2,1,0,1,1,1,0,1,2,0,1,0,2,1,1,1,1,0,0,3,2,0,0,0,2,1,0,0,0,2,1,1,1,0,1,4,2,2,0,2,0,2,2,1,0,0,1,0,2,1,1,0,0,1,0,0,0,1,0,1,0,3,1,1,3,0,1,1,0,1,0,0,0,1,0,0,0,0,1,1,1,1,0,1,1,2,1,2,0,2,1,1,0,0,0,2,1,0,0,0,3,1,2,0,0,0,2,0,0,1,1,0,0,1,0,1,1,3,0,0,2,3,2,1,0,2,0,2,1,3,1,2,0,0,2,1,0,0,0,2,6,3,1,2,3,0,4,0,1,0,1,1,1,1,1,0,1,2,2,2,0,0,1,0,3,1,0,1,1,1,1,3,0,0,1,0,3,2,0,3,1,3,0,0,0,0,0,4,1,0,3,1,0,1,0,1,0,1,2,0,1,0,2,0,1,2,2,0,1,0,2,2,3,2,0,3,0,0,1,0,0,0,0,1,0,2,1,2,2,3,0,2,2,0,2,4,1,0,1,2,2,0,1,1,1,0,0,1,0,0,0,0,2,0,0,0,1,0,1,0,2,0,0,1,1,1,3,0,1,0,2,0,1,4,1,0,0,1,0,4,1,1,1,3,3,0,0,1,0,1,2,1,1,2,1,2,1,1,0,1,0,0,0,1,2,0,0,2,1,0,1,0,0,0,0,4,1,0,2,2,0,0,1,0,0,1,1,1,0,1,2,1,0,1,0,1,3,0,2,1,2,1,2,1,1,1,4,0,2,0,0,1,0,1,0,1,0,0,0,1,1,1,2,1,1,1,0,0,1,0,1,0,2,3,0,3,0,0,1,0,0,2,0,0,0,2,0,0,1,0,1,0,0,4,0,2,2,2,1,0,0,1,0,1,1,0,0,0,1,1,2,3,2,3,1,1,1,1,4,1,1,3,0,2,0,0,1,2,0,0,0,0,1,1,0,2,0,1,0,0,3,1,0,4,1,5,2,1,1,1,0,3,1,0,0,2,2,1,1,0,2,2,0,1,0,1,1,0,2,1,1,2,1,1,2,0,0,0,1,2,0,0,0,2,1,2,0,1,2,2,1,0,0,1,0,2,1,0,1,0,1,0,3,1,1,2,0,0,0,1,0,1,1,1,0,1,2,2,1,3,2,3,3,1,1,1,0,1,0,1,0,0,0,2,1,0,2,0,0,3,0,3,1,2,1,0,0,1,2,1,3,1,0,0,0,0,0,1,0,1,0,2,2,0,0,1,3,2,1,0,1,0,1,0,1,2,0,2,0,0,0,0,1,3,1,0,2,1,0,0,1,0,0,0,0,2,0,1,1,1,1,0,1,1,2,2,0,1,0,5,3,1,0,0,1,1,2,0,3,2,1,2,1,0,1,0,2,1,3,0,2,1,1,2,2,1,2,0,0,1,2,3,0,1,0,1,1,2,0,1,1,0,1,0,1,0,0,0,2,1,3,1,2,2,0,0,0,2,1,2,0,0,0,4,1,0,2,0,2,3,1,0,0,3,1,1,1,0,2,0,2,2,0,1,0,0,1,1,2,2,4,1,1,0,0,2,0,0,2,0,1,1,1,0,2,1,2,0,0,3,0,0,3,1,1,0,1,0,0,0,1,1,0,2,1,1,1,1,0,2,0,1,0,2,2,3,1,0,1,2,0,1,0,0,0,0,0,4,1,1,1,1,1,1,1,1,1,0,2,2,0,2,0,0,1,0,0,0,2,2,1,0,0,1,7,2,1,2,0,3,2,2,3,0,1,2,1,1,0,1,1,1,4,1,1,1,1,1,0,0,2,0,1,0,1,1,1,1,1,0,2,0,1,0,2,0,3,3,1,0,2,2,2,0,0,0,1,1,2,2,1,0,1,1,1,1,0,1,0,1,2,1,0,1,1,1,2,1,0,1,0,1,1,0,1,2,0,2,0,0,0,0,2,2,0,1,1,1,2,0,0,0,0,2,4,1,3,0,1,1,0,1,2,1,0,0,0,1,1,0,0,0,0,0,2,3,1,0,1,2,0,0,0,1,0,1,0,1,1,2,1,0,0,0,0,0,4,4,0,1,1,1,1,0,1,2,4,0,1,2,2,2,2,2,0,0,0,1,5,1,2,0,0,0,0,0,1,0,3,1,1,1,1,1,0,4,0,0,2,0,0,0,1,0,1,3,2,1,2,3,1,2,0,1,1,1,0,7,0,1,0,2,0,2,1,0,0,0,3,1,3,2,1,0,1,2,3,0,1,0,2,1,1,2,0,0,3,0,0,1,1,0,0,2,0,3,3,2,2,0,0,4,1,1,2,1,2,1,0,1,0,2,1,0,0,0,1,2,0,0,1,0,1,0,2,0,0,3,0,2,0,0,1,3,1,0,0,1,1,0,1,1,0,3,2,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,0,1,0,2,2,1,1,1,1,3,3,1,0,0,2,2,1,0,1,2,0,0,0,2,2,0,0,0,1,0,0,2,0,0,0,1,0,0,3,2,0,2,0,2,0,1,0,2,0,0,1,0,2,1,0,0,2,1,0,2,2,3,2,0,0,1,0,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,1,0,0,0,1,0,0,2,1,2,2,2,5,0,2,4,2,0,1,1,0,1,0,2,1,0,1,0,2,2,0,0,0,3,0,0,0,2,1,0,1,1,1,0,1,0,3,1,0,1,0,0,0,1,0,2,1,2,1,1,2,0,1,0,0,0,0,2,1,0,0,0,1,0,0,0,1,0,1,0,0,1,2,3,1,2,1,1,1,1,0,1,0,0,0,1,1,1,1,1,1,1,0,1,0,0,3,0,2,1,1,4,3,2,0,4,0,1,1,1,0,0,2,1,1,0,2,2,3,1,1,0,1,1,1,1,0,1,0,0,0,1,1,1,3,0,2,1,0,1,1,0,1,0,1,0,3,1,1,0,1,1,1,0,1,3,0,0,0,1,0,3,1,0,1,3,1,2,1,1,2,0,3,1,5,1,1,3,0,2,0,0,0,1,0,1,2,3,2,0,0,0,0,0,0,0,0,1,1,0,0,0,3,1,1,1,1,1,0,0,2,0,1,1,0,4,3,0,1,3,0,1,0,1,1,0,0,0,1,0,0,1,1,1,0,3,1,0,1,0,0,4,3,0,1,3,2,2,1,1,1,1,3,0,0,0,2,1,1,0,1,0,1,2,1,0,0,1,1,2,5,0,3,2,3,4,0,1,0,0,0,1,1,1,4,1,1,1,2,0,2,0,5,0,1,1,1,1,1,2,1,0,3,1,0,3,0,3,1,1,0,2,1,2,0,2,1,2,1,2,0,1,1,3,2,2,0,0,3,3,2,0,0,2,0,1,0,0,1,2,0,1,0,0,1,1,1,0,0,2,0,0,2,0,0,1,0,0,1,2,2,0,1,3,0,0,0,0,1,1,2,3,2,1,1,0,0,1,0,0,0,0,1,1,0,1,0,0,2,3,0,0,1,1,1,1,3,0,0,0,1,1,0,0,2,3,4,0,1,3,2,0,1,0,1,0,1,0,0,1,0,1,2,0,0,0,1,2,2,0,0,0,2,0,3,2,1,1,2,0,0,0,0,0,1,1,1,2,2,0,0,1,0,1,0,2,1,0,0,1,0,1,0,0,1,0,1,2,1,1,0,0,1,0,2,3,1,1,1,0,1,2,2,5,1,0,0,0,0,1,1,0,1,1,3,1,2,3,3,0,0,2,2,1,0,1,1,3,0,2,0,0,1,5,0,0,1,2,2,0,1,0,1,0,3,0,2,0,1,0,1,1,0,1,1,0,2,0,1,0,0,4,3,0,0,1,3,1,1,1,0,0,2,3,3,1,1,0,5,0,0,2,0,0,1,1,0,0,1,2,0,1,0,0,2,0,1,1,0,1,0,1,0,1,0,0,2,0,1,1,0,0,1,2,0,1,0,1,1,2,2,1,2,1,2,0,2,1,0,0,3,0,0,2,2,1,1,0,2,0,0,0,0,2,0,2,1,2,0,1,3,0,3,1,0,2,0,0,3,2,2,4,0,0,2,0,0,3,0,3,1,1,0,1,1,1,1,0,0,2,1,1,2,1,0,1,0,2,0,0,1,3,3,2,0,1,1,2,0,2,1,0,0,1,0,0,1,0,1,2,0,0,0,0,2,1,1,1,2,0,1,1,2,0,0,1,0,1,3,2,0,0,2,1,0,0,2,2,1,0,1,0,1,0,2,0,2,1,0,0,1,1,0,0,0,2,1,1,0,4,0,0,0,1,2,0,1,3,2,1,1,0,1,1,0,0,0,1,2,1,1,0,0,1,0,1,0,1,1,0,4,2,0,0,0,0,1,2,0,0,1]},{"counters":[0,0,1,0,1,0,1,0,1,0,2,1,1,1,0,2,1,1,1,0,1,2,3,1,1,1,0,4,2,1,0,2,0,2,1,1,0,1,3,1,0,2,0,3,1,1,2,2,0,0,0,0,1,0,0,2,0,1,0,0,0,2,2,1,0,2,2,3,1,0,0,1,2,0,2,2,1,0,2,0,1,1,1,0,1,1,0,1,0,1,1,3,1,1,1,1,1,2,1,0,2,2,1,0,2,1,0,1,2,0,1,1,3,0,3,0,1,1,0,2,2,0,4,1,1,1,0,3,1,1,2,1,1,2,0,1,1,2,2,0,1,2,2,3,2,1,0,0,2,2,1,1,1,0,1,2,1,0,0,1,0,2,0,1,2,0,1,0,1,1,3,0,0,0,0,3,0,2,1,0,2,0,0,0,1,2,1,1,0,0,1,0,2,0,1,1,0,0,0,1,0,1,1,2,2,3,0,0,0,1,2,0,0,1,0,1,1,1,1,0,0,1,2,3,0,1,1,0,3,0,0,0,0,0,0,0,2,0,0,3,0,2,1,0,0,2,0,2,2,1,2,1,3,3,0,0,1,0,0,1,0,1,0,0,2,1,2,3,0,0,2,0,0,1,1,2,1,0,1,1,0,1,1,2,0,3,2,0,0,0,0,1,1,1,0,2,1,0,2,0,3,0,0,2,0,1,1,2,0,0,0,0,0,0,0,2,2,0,3,2,0,0,3,0,0,3,4,0,2,2,0,3,0,0,1,1,0,2,0,0,1,0,2,2,1,0,0,1,2,0,2,0,1,1,1,1,1,0,1,0,3,4,2,1,0,1,0,2,1,1,1,1,0,0,1,3,0,0,1,0,2,1,3,0,1,0,2,0,0,3,1,0,0,3,0,1,1,0,1,0,2,4,1,2,1,0,2,0,1,1,2,1,0,0,0,0,0,0,4,0,0,1,2,0,0,0,2,2,0,1,0,0,2,1,3,2,1,2,0,1,0,1,1,1,2,0,0,0,1,3,1,1,1,1,2,4,1,1,1,1,0,1,0,0,1,1,0,0,1,0,2,1,1,0,0,3,1,1,0,0,0,2,0,4,2,1,1,1,1,0,0,0,0,0,0,2,1,0,1,2,0,3,1,1,1,3,1,3,0,2,0,0,0,3,0,5,0,1,1,2,3,2,0,1,1,1,0,0,0,3,0,3,3,0,1,3,1,1,0,0,3,1,0,3,3,1,0,0,2,1,0,1,1,0,0,2,1,0,2,2,3,1,2,0,1,1,0,1,1,1,1,3,0,2,0,1,1,2,0,0,2,1,1,0,2,0,0,1,0,0,0,3,2,0,0,1,1,0,0,1,0,0,0,1,1,0,2,1,2,0,1,1,0,1,2,1,1,2,1,0,0,0,2,1,1,1,2,1,0,1,0,0,1,0,1,2,1,0,0,2,4,0,1,3,1,1,2,0,0,1,0,0,0,3,0,0,0,0,2,2,1,1,0,1,2,0,1,3,1,3,0,1,0,1,1,1,2,2,2,1,2,2,8,0,1,0,0,2,0,0,1,1,0,3,1,0,3,2,0,0,1,2,0,2,3,1,3,2,2,3,1,1,3,1,0,2,1,1,1,1,6,1,2,2,0,1,1,0,0,1,0,0,1,1,0,1,3,1,1,0,2,1,2,0,0,5,1,1,1,1,2,1,0,1,4,0,2,1,1,2,0,2,1,1,1,1,0,2,1,2,0,0,1,2,0,1,0,1,1,0,1,3,0,1,0,3,0,1,3,1,0,0,1,2,0,5,1,1,5,0,1,1,2,2,0,2,0,0,2,0,0,0,3,2,0,3,1,0,0,1,0,1,0,2,1,1,0,0,0,0,1,0,1,1,0,0,1,2,0,0,1,3,2,0,1,0,0,1,2,2,1,0,1,2,2,0,1,0,1,0,2,1,2,2,1,0,1,2,1,1,0,0,1,0,1,0,0,1,1,2,3,0,1,0,3,1,1,0,2,0,1,0,1,1,0,0,2,2,1,0,2,1,2,1,0,1,3,1,0,1,1,1,2,0,2,0,0,2,1,0,1,2,1,1,3,0,1,2,0,2,1,0,0,4,0,0,0,0,3,1,1,1,5,1,0,1,0,1,1,0,1,1,1,1,4,0,0,2,2,2,1,5,1,2,2,0,2,0,0,0,2,0,1,1,0,0,1,0,1,0,1,1,2,1,1,0,2,1,0,0,2,1,1,0,0,3,0,0,2,1,1,1,0,1,3,2,0,1,1,2,2,1,1,1,2,0,1,0,0,2,0,1,1,1,1,3,0,2,0,3,0,1,1,4,1,1,0,1,0,2,1,0,1,1,2,2,1,3,0,2,1,2,0,1,3,1,0,2,1,2,0,0,0,0,0,0,1,3,0,0,1,2,0,1,2,1,1,0,2,2,1,1,1,0,0,1,0,1,2,1,2,0,3,1,1,0,0,0,0,1,1,0,0,0,1,0,0,1,1,0,0,0,1,0,2,1,2,1,1,4,0,3,0,0,2,0,1,2,4,0,0,0,0,0,0,0,1,0,0,0,1,1,2,1,0,1,2,1,0,1,0,1,0,1,2,2,3,0,1,0,0,1,1,1,1,2,3,2,0,3,0,2,1,2,0,0,0,1,0,1,0,1,0,2,0,2,1,0,2,0,1,0,1,1,1,1,1,0,1,1,2,1,0,1,1,2,0,2,2,1,0,1,1,1,1,0,0,1,1,1,1,2,0,2,1,0,0,1,0,2,1,2,4,0,2,4,1,0,1,1,0,3,2,1,1,3,1,1,1,0,0,0,0,1,0,0,0,0,2,2,0,1,1,1,2,2,1,0,3,1,0,1,0,0,3,3,0,2,5,2,0,1,0,2,0,1,0,0,1,0,1,2,0,2,1,0,0,0,0,0,1,2,2,0,2,2,0,1,0,0,1,0,1,2,0,1,2,1,0,1,2,0,3,3,0,1,2,1,1,0,0,0,2,0,0,0,0,0,0,1,2,1,1,4,2,0,0,0,0,1,1,1,0,0,0,1,0,0,1,2,2,2,0,1,1,1,0,3,0,0,1,1,1,1,0,1,1,1,1,1,0,2,2,2,2,1,0,0,1,1,0,0,1,4,3,1,2,0,0,1,1,1,2,0,2,1,2,1,2,2,0,0,0,0,0,0,1,1,2,0,1,1,0,0,0,1,3,2,1,0,0,1,0,1,1,0,1,0,0,3,0,0,1,0,1,1,1,0,2,1,0,0,0,3,0,2,2,0,2,2,0,1,2,1,0,1,0,6,0,3,2,1,2,2,0,0,1,1,3,2,0,2,2,1,4,1,0,1,3,0,0,1,1,1,0,1,0,1,1,3,1,1,2,1,1,0,1,3,1,1,0,1,2,0,2,1,2,1,0,1,1,2,0,0,1,3,1,2,0,1,2,1,1,1,1,1,1,4,1,0,1,1,1,1,2,1,0,3,1,0,0,0,0,0,0,0,3,1,0,3,1,1,0,1,0,0,0,2,1,0,0,1,2,1,1,0,0,1,1,0,0,0,2,1,2,1,4,1,1,1,2,0,3,0,0,1,3,0,0,1,1,0,1,0,2,0,0,1,0,1,2,0,0,1,1,0,3,2,0,0,1,3,2,1,0,4,1,0,2,0,1,2,0,2,1,0,0,2,1,0,1,0,1,0,1,0,0,1,1,0,1,1,0,1,0,0,1,0,0,0,0,0,5,0,2,1,1,1,0,2,1,1,0,4,3,0,1,0,0,2,0,2,1,0,2,0,1,1,0,0,0,1,0,3,1,0,0,0,1,1,0,2,4,1,0,1,0,0,1,2,0,1,0,1,2,2,0,0,0,1,2,0,0,0,2,0,1,0,1,0,0,2,0,2,1,0,2,2,0,0,2,1,1,0,0,0,3,0,3,1,3,0,2,1,1,1,0,1,2,1,0,5,1,1,1,0,2,1,0,0,0,1,3,0,2,2,1,0,0,0,0,0,1,0,4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,1,0,0,0,0,1,1,0,1,0,3,1,0,0,0,0,3,0,2,0,0,1,4,0,0,0,3,0,1,1,0,0,0,1,2,0,0,0,1,1,0,1,1,0,2,5,1,0,1,0,2,0,1,1,1,1,1,1,1,0,1,0,1,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,0,0,2,0,2,1,1,0,0,0,1,2,3,0,0,2,0,1,1,1,0,1,1,2,2,2,1,0,2,2,1,6,1,1,3,1,1,2,0,2,3,1,1,2,0,2,2,0,1,1,1,1,0,0,0,1,2,0,0,0,1,1,0,1,0,1,1,0,2,0,1,1,1,2,2,1,1,3,0,2,2,0,1,1,0,1,0,0,1,1,0,1,0,0,1,4,1,1,2,1,1,2,1,1,0,1,0,1,0,0,1,1,0,2,2,0,0,2,0,1,0,1,0,2,1,0,0,2,2,2,0,1,0,0,0,1,0,0,1,1,1,3,1,1,0,0,0,0,0,1,1,0,0,2,3,1,0,1,5,2,0,0,2,0,4,0,0,0,1,0,1]},{"counters":[1,0,1,0,0,1,1,1,0,3,1,1,0,1,4,1,1,2,3,1,1,0,0,1,3,0,0,2,0,2,1,1,1,1,1,1,1,2,2,1,0,1,0,1,1,0,2,1,2,0,0,0,1,1,1,1,0,0,0,0,0,1,2,1,2,1,1,2,1,2,0,4,1,2,0,2,1,0,1,2,3,0,0,2,1,3,0,0,1,0,0,0,0,0,0,1,1,0,3,2,0,0,2,1,0,1,0,0,1,2,0,1,3,2,1,1,1,1,0,0,0,2,1,0,1,0,1,2,0,1,1,1,0,3,0,1,0,0,0,0,1,2,0,0,2,2,0,1,1,0,2,0,0,0,0,0,0,3,1,1,0,1,1,0,1,0,2,1,2,1,2,2,0,1,1,3,1,0,3,1,1,3,0,0,0,2,1,1,0,0,0,2,1,0,0,0,0,2,1,1,1,1,0,1,1,2,0,1,1,0,0,0,2,0,0,2,1,1,0,0,3,0,1,2,0,0,2,0,1,0,0,2,2,2,2,0,1,1,0,0,0,0,6,1,0,2,0,1,2,0,1,1,0,1,1,1,0,0,2,0,1,1,2,0,1,1,2,1,0,2,1,1,3,1,1,0,2,0,0,1,2,2,1,2,0,1,2,1,1,0,2,1,0,0,2,2,2,0,1,3,0,2,0,3,1,2,0,0,0,2,0,1,0,0,2,2,0,1,2,1,3,1,0,0,2,0,2,1,1,2,1,0,2,0,1,2,2,1,1,2,1,1,0,1,1,2,0,1,0,0,1,2,0,1,1,1,0,1,1,1,1,0,2,1,0,1,4,1,0,0,2,1,3,0,0,1,0,1,0,1,0,0,0,5,1,2,0,1,0,0,1,1,0,1,2,0,1,1,1,1,0,0,0,2,2,1,1,1,1,2,2,1,0,1,1,0,1,4,1,1,1,1,1,1,3,0,0,0,1,1,2,0,0,1,2,0,2,1,0,1,0,1,3,1,1,2,1,2,2,2,1,3,3,1,1,0,1,1,1,0,0,1,1,0,3,1,3,2,0,0,3,0,0,0,0,0,1,1,0,0,1,3,1,0,3,3,1,0,1,1,1,0,1,2,2,1,1,3,1,0,1,1,0,0,1,0,1,2,0,1,1,1,2,0,0,0,3,0,0,1,1,1,0,1,2,0,1,2,1,4,1,0,1,1,1,0,1,2,0,0,0,1,1,3,1,1,5,1,0,3,0,1,0,0,1,1,1,1,0,1,0,0,1,1,1,2,0,0,3,2,1,0,0,0,0,0,0,1,0,1,2,1,2,0,2,1,0,1,3,4,0,1,0,1,2,2,0,1,3,0,0,0,0,1,1,1,3,2,1,0,0,1,2,2,4,0,2,3,2,0,0,0,1,1,2,2,0,3,1,1,1,4,0,0,1,0,1,0,1,0,0,0,1,0,1,1,1,0,4,3,2,1,0,3,1,1,2,0,1,0,2,4,1,0,3,3,1,1,1,0,0,0,1,1,1,1,0,0,2,3,1,2,3,2,1,1,3,2,0,0,1,2,2,0,0,1,0,0,0,1,1,0,0,0,1,1,1,0,0,2,1,0,1,0,1,3,0,0,1,0,0,1,2,1,0,2,0,2,1,0,0,1,1,0,1,0,0,2,0,1,2,0,0,1,0,0,1,3,1,1,1,2,2,5,1,3,0,1,2,1,2,1,1,1,1,0,1,1,5,0,1,1,1,4,3,0,1,2,1,0,0,0,1,3,0,0,1,1,0,1,0,1,0,1,0,0,3,0,2,0,1,0,0,0,3,0,2,1,0,5,1,2,0,0,1,0,0,0,1,1,0,1,1,2,0,1,0,0,0,4,1,1,0,0,0,0,5,0,0,1,1,0,1,0,1,2,1,2,1,1,0,2,0,3,0,0,0,0,3,0,2,1,4,0,1,2,0,1,2,1,0,1,1,3,0,0,1,0,2,2,0,1,1,0,0,0,4,4,0,0,1,0,1,1,0,0,0,3,1,0,2,1,1,2,1,2,0,0,0,2,1,0,1,1,0,0,0,1,2,1,0,0,2,1,2,0,2,1,0,0,0,0,0,0,0,0,1,1,5,0,0,1,0,1,0,2,2,3,0,0,1,0,0,0,0,0,1,0,1,1,0,1,0,0,1,2,1,3,0,1,0,2,1,1,1,1,1,0,0,1,0,2,0,1,1,0,1,0,1,0,1,0,4,0,1,1,0,0,1,3,2,1,0,2,3,1,0,1,1,1,0,0,0,0,2,1,4,1,0,0,0,0,0,1,0,3,0,1,1,1,2,2,1,0,2,0,2,0,0,1,2,1,0,0,0,1,0,3,0,0,3,3,1,1,1,0,1,1,0,0,1,1,1,0,2,2,1,0,3,1,0,1,1,0,0,1,1,1,2,1,0,1,0,1,1,2,1,3,0,0,3,2,0,3,0,1,1,0,1,0,0,1,1,0,1,2,3,1,0,0,0,2,0,0,0,2,0,1,1,0,0,1,0,2,0,1,0,2,1,0,2,1,1,1,0,0,0,1,1,3,0,1,1,2,1,0,2,1,4,0,0,0,1,1,0,1,2,0,2,1,0,0,0,1,0,2,2,0,3,0,1,1,3,4,1,0,3,2,0,0,1,1,0,1,1,0,1,1,1,0,0,1,0,0,0,1,2,2,0,1,0,0,0,2,1,3,0,0,0,1,1,0,2,0,1,0,0,1,2,0,1,1,1,0,3,0,1,1,2,0,1,2,0,0,2,1,1,0,1,0,0,3,0,0,0,0,0,1,0,1,0,0,1,1,0,0,1,2,3,3,3,0,1,0,1,0,0,0,0,0,0,1,3,0,0,1,1,0,1,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,0,0,2,0,1,0,0,0,2,0,1,1,2,0,0,0,4,1,2,0,2,2,1,1,5,0,1,1,0,5,0,2,0,0,0,1,0,1,2,1,0,2,2,0,2,3,0,2,2,1,0,1,2,2,1,0,3,1,2,2,2,1,3,2,3,0,0,1,2,6,3,1,0,1,2,1,0,2,1,0,1,0,0,2,4,1,2,3,0,0,0,1,1,1,0,2,0,0,0,1,0,1,0,1,1,0,1,1,1,0,0,3,2,0,1,1,0,0,1,2,1,1,1,1,0,3,0,3,4,1,1,0,2,3,0,1,0,0,0,1,0,1,1,2,2,0,2,2,1,1,1,0,1,1,2,0,0,2,0,0,2,1,1,0,0,0,1,1,1,1,3,2,0,0,0,1,2,1,1,1,6,1,0,1,2,1,2,0,2,1,0,0,0,0,0,1,2,1,0,0,0,1,2,0,1,2,1,1,0,1,1,1,1,2,1,2,2,0,0,1,0,0,1,2,0,0,2,0,0,1,2,1,0,4,1,0,1,0,0,1,1,0,1,1,0,1,2,0,1,1,1,4,1,0,0,1,0,0,0,0,0,1,2,2,1,0,4,2,1,0,1,2,1,2,1,0,4,1,1,2,2,1,0,1,2,2,0,0,1,1,0,1,1,0,2,1,2,2,1,0,0,0,3,0,2,1,1,0,1,0,1,1,1,1,2,1,0,1,1,1,2,2,2,1,1,0,0,0,2,0,2,2,2,1,1,2,0,1,1,0,0,0,2,2,0,1,1,1,0,1,0,0,1,0,1,2,2,2,1,0,2,1,1,2,0,1,6,1,1,0,3,1,2,1,2,0,2,1,0,1,0,1,2,0,0,1,0,3,0,0,1,0,3,1,1,2,1,0,0,1,1,1,2,1,3,1,2,1,2,1,0,1,0,0,0,3,3,0,1,2,0,1,2,0,1,1,3,1,1,2,0,0,0,1,7,3,1,2,1,0,1,1,1,2,1,1,1,0,1,2,1,1,1,1,0,1,0,0,3,1,0,0,0,1,0,0,0,1,0,2,0,1,0,1,1,2,2,4,0,0,1,1,2,1,1,1,0,2,2,0,1,2,3,0,1,0,2,0,1,1,2,0,2,2,1,0,1,1,1,2,1,0,1,0,0,1,3,1,4,2,1,1,3,2,0,2,3,1,0,2,0,3,1,2,1,1,1,1,2,0,3,3,0,0,1,1,1,2,1,0,1,0,1,0,0,1,1,2,1,0,1,0,2,0,1,3,1,5,2,3,2,2,1,0,1,1,3,2,2,2,0,0,3,0,2,1,1,0,0,2,1,0,0,1,0,2,2,0,2,1,4,0,0,3,0,0,0,0,1,2,0,2,1,2,0,1,0,0,3,0,1,1,0,1,1,2,1,0,1,2,1,1,1,0,1,1,0,1,2,1,2,1,2,0,2,1,1,1,3,1,0,0,0,0,1,1,2,2,0,1,2,2,1,0,0,0,1,1,1,0,0,3,0,2,1,1,2,1,1,1,1,4,0,0,3,1,2,0,3,3,1,0,1,0,1,1,0,0,0,0,0,0,0,0,1,0,1,2,1,1,1,0,1,0,2,2,0,1,1,0,0,0,1,0,0,3,0,2,0,0,0,1,1,2,2,2,0,1,1,0,0,2]},{"counters":[0,0,0,1,3,3,0,3,0,0,0,1,2,1,0,0,3,2,0,1,0,1,2,2,1,1,2,0,1,0,0,3,1,1,0,2,1,2,1,3,0,0,1,1,0,0,1,2,0,2,1,0,2,1,0,4,0,4,1,2,1,1,0,0,1,2,2,2,2,1,1,0,1,0,1,1,0,0,1,0,1,1,2,1,1,0,1,0,0,2,0,2,3,0,0,1,2,0,1,1,1,2,2,4,0,1,1,0,1,0,2,0,0,2,0,0,1,1,0,0,2,0,3,0,2,0,1,2,1,1,2,0,1,2,3,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,2,2,0,1,2,0,3,1,0,0,1,0,0,3,0,1,2,0,0,2,1,2,0,2,3,1,0,0,1,2,1,0,0,1,1,0,2,1,0,2,2,1,1,0,1,0,1,1,0,2,1,1,3,1,0,1,0,0,2,0,0,0,2,2,1,1,0,0,0,0,1,0,1,1,0,0,1,2,1,2,1,2,1,2,0,2,2,1,1,1,4,0,1,1,1,0,2,1,0,2,1,0,1,0,1,0,1,0,1,2,0,0,1,0,1,2,0,1,2,3,0,1,0,3,1,0,1,1,2,0,0,0,1,1,2,2,0,0,1,1,1,0,0,1,2,0,0,1,0,2,0,2,2,1,0,1,3,1,2,2,1,2,0,0,2,1,1,1,0,1,1,0,2,1,2,0,0,2,1,1,0,3,0,1,0,1,2,1,1,0,0,3,0,0,0,3,3,1,1,1,1,1,0,2,1,2,1,1,2,0,0,1,1,4,1,1,0,1,0,1,1,1,0,1,0,2,0,0,0,0,1,1,0,1,1,1,1,1,0,1,0,0,2,0,1,3,1,2,0,2,3,1,1,1,2,1,0,2,3,1,1,2,0,2,1,0,1,1,2,2,3,1,0,1,2,1,2,0,1,1,2,0,1,0,1,1,1,0,0,1,1,2,0,2,1,1,0,1,1,0,0,1,2,2,0,0,2,1,2,0,3,0,4,0,0,1,0,0,0,0,2,0,1,4,1,1,0,1,1,1,1,1,1,1,0,0,1,0,2,2,0,2,1,1,1,0,2,1,1,1,1,2,0,1,3,2,4,1,0,2,0,0,1,0,0,3,2,1,1,0,0,1,1,0,0,3,0,0,2,3,0,0,0,2,1,1,1,0,0,1,4,3,1,0,1,0,1,1,0,0,3,0,1,2,0,2,0,2,2,0,1,3,0,1,0,0,0,0,1,2,1,3,1,0,0,2,3,1,2,1,0,0,0,2,0,1,1,0,0,0,1,0,0,1,1,0,3,0,0,0,1,1,0,1,1,2,1,0,1,0,0,1,0,2,2,0,0,1,0,0,0,1,0,1,2,2,1,1,0,0,0,0,0,1,2,2,2,0,1,2,1,0,1,2,0,1,2,3,1,1,1,2,1,2,1,0,1,1,3,1,1,1,1,0,0,1,0,1,3,0,1,0,1,1,1,0,1,1,0,1,3,3,0,0,2,2,0,1,1,1,1,0,2,0,1,1,0,1,1,0,2,0,1,0,1,1,1,0,0,0,1,0,2,0,0,2,1,0,0,2,1,0,2,0,1,1,2,2,0,4,1,2,0,0,1,3,0,0,1,0,0,2,1,1,1,0,1,0,4,1,0,0,1,1,0,2,0,0,0,0,0,0,0,1,0,2,0,1,0,1,1,0,2,2,2,3,0,4,1,2,1,0,0,0,1,0,1,1,2,0,1,4,0,3,2,0,1,1,1,0,1,0,0,2,0,0,1,1,1,1,1,2,1,1,0,1,2,1,0,2,0,0,2,2,2,4,0,0,2,0,1,1,0,1,1,1,2,1,1,1,0,0,2,3,2,0,1,1,1,0,1,3,1,5,0,3,2,0,0,0,0,1,1,1,1,1,2,0,1,0,0,0,0,1,0,4,2,0,1,2,4,0,0,0,3,3,2,0,0,2,1,0,0,0,0,1,0,0,0,0,1,2,1,1,0,1,3,0,1,1,0,3,1,2,1,0,0,0,1,0,1,0,1,1,0,1,2,1,0,0,1,1,0,3,1,3,2,1,0,3,1,0,1,0,1,0,2,3,4,1,1,0,1,0,0,0,1,1,6,1,1,0,1,1,2,4,0,0,0,1,0,2,0,0,1,2,1,0,2,0,0,1,0,1,1,1,0,0,1,1,5,0,0,3,1,1,2,0,4,1,1,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,2,0,0,2,2,5,1,0,0,3,1,0,3,2,1,3,0,2,2,0,0,0,0,1,2,0,1,2,1,2,0,1,2,1,1,1,0,0,0,1,0,0,1,0,1,0,0,2,0,0,0,0,2,1,0,1,0,0,0,1,1,1,0,0,0,0,2,2,2,1,3,0,0,0,0,1,1,1,3,0,2,1,1,0,0,0,1,0,1,1,1,1,1,2,1,0,2,0,0,1,0,3,1,2,0,3,1,0,0,0,1,1,1,0,0,1,0,1,1,1,0,2,1,4,1,0,2,1,1,0,1,0,0,2,6,0,2,0,1,2,3,2,0,0,3,2,0,0,0,1,1,2,1,0,3,3,1,1,0,0,3,0,1,2,0,3,0,0,2,0,2,1,2,1,1,0,1,2,2,0,1,0,2,1,2,1,0,2,2,1,2,0,0,1,0,0,0,1,0,5,1,1,0,1,0,1,1,0,3,1,0,0,0,0,0,3,3,0,2,2,1,1,0,1,1,0,2,2,1,0,2,1,4,1,1,1,2,2,0,1,1,0,0,2,0,0,1,1,2,1,1,0,1,0,2,1,0,2,1,0,2,2,1,1,0,2,0,7,1,0,0,0,2,1,1,0,0,1,0,2,0,1,0,2,1,0,2,2,0,1,0,2,2,0,1,0,0,2,2,1,0,3,1,1,2,2,0,2,0,1,0,0,0,1,1,0,1,1,3,2,2,1,0,0,0,5,1,1,1,2,1,1,0,1,2,2,0,0,2,1,0,3,0,0,1,0,1,3,3,0,1,2,1,3,3,0,2,1,4,2,2,1,2,1,3,1,2,0,2,1,0,4,1,3,1,0,0,1,0,0,0,1,0,0,0,3,2,0,1,1,1,0,1,1,0,2,3,2,2,0,1,1,0,0,1,2,0,4,1,0,1,2,2,1,1,2,0,1,2,1,1,3,2,2,1,1,0,0,0,0,0,0,0,2,2,1,0,1,1,0,0,1,0,0,0,1,0,2,0,3,0,2,0,0,3,3,0,0,1,1,2,0,1,1,0,1,2,1,1,1,1,0,0,0,0,0,0,3,1,1,1,1,2,1,0,0,1,0,2,0,0,0,1,2,0,1,1,0,2,0,0,0,1,6,2,1,1,1,3,4,0,2,1,0,1,3,0,0,1,1,2,5,0,1,2,0,1,3,1,2,1,1,2,1,1,0,2,1,2,0,0,0,0,0,1,2,2,1,1,0,0,2,0,0,0,1,1,1,0,0,1,3,2,3,3,0,3,0,1,0,1,0,2,1,3,0,1,1,2,2,0,1,1,1,1,0,1,1,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,1,2,2,0,1,1,2,0,0,1,1,2,0,0,0,1,3,1,1,1,1,0,0,2,1,1,1,1,1,1,3,0,1,0,1,0,0,1,2,0,2,2,0,1,1,2,0,1,0,0,0,0,0,1,1,1,0,3,2,0,0,1,0,3,2,5,2,0,1,0,4,3,1,0,7,0,1,2,0,1,0,0,4,0,0,1,1,0,1,1,1,1,2,3,1,0,0,1,3,0,2,0,1,1,1,3,1,0,2,1,2,2,0,2,1,0,0,0,1,0,1,1,1,2,0,0,1,1,0,1,4,3,0,0,0,1,0,0,1,2,0,1,2,1,0,2,2,0,2,0,1,2,1,2,0,1,1,0,0,3,0,1,0,0,0,3,1,0,1,1,1,3,0,0,1,0,2,0,1,0,0,1,0,1,0,2,1,3,1,1,0,0,1,2,0,0,1,0,1,1,0,0,1,3,1,3,1,0,1,0,0,1,2,0,3,0,4,0,1,1,2,1,1,0,2,0,2,0,0,1,2,1,0,2,1,0,2,1,1,1,1,2,1,1,0,1,3,2,1,0,1,3,0,2,3,2,0,1,0,0,0,1,2,0,0,0,1,1,2,2,1,0,0,2,1,0,1,0,1,1,1,1,0,1,1,0,0,0,2,1,0,2,1,1,1,1,1,0,0,1,2,0,1,2,3,0,2,1,0,1,0,2,0,0,1,2,0,0,1,0,0,0,1,3,0,1,1,0,0,0,0,1,2,0,2,2,1,1,2,1,0,2,3,0,3,0,1,0,1,0,1,0,1,0,0,1,0,1,2,0,0,1,3,1,0,0,3,2,2,0,1,3,1,0,0,2,2,1,0,0,1,1,0,0,1,1,3,2,0,0,1,2,1,1,0,4,0,0,0,1,1,2,2,2,0,1,1,0,1,2,1,0,0,0,0,2,1,0,2,2,1,1,0,0,0,1,1,0]}]},"null_count":0,"last_update_version":397952039829635072},"pdt":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"A3////+AQek4","upper_bound":"A3////+A/bHR","repeats":1},{"count":16,"lower_bound":"A3////+BL7GJ","upper_bound":"A3////+B07kq","repeats":1},{"count":24,"lower_bound":"A3////+B1zk/","upper_bound":"A3////+DVjDT","repeats":1},{"count":32,"lower_bound":"A3////+DageB","upper_bound":"A3////+EAR7j","repeats":1},{"count":40,"lower_bound":"A3////+ED5oE","upper_bound":"A3////+FFI+x","repeats":1},{"count":48,"lower_bound":"A3////+FUxxi","upper_bound":"A3////+GT3Ba","repeats":1},{"count":56,"lower_bound":"A3////+GZfgR","upper_bound":"A3////+HK7V8","repeats":1},{"count":64,"lower_bound":"A3////+HLbeH","upper_bound":"A3////+HldIf","repeats":1},{"count":72,"lower_bound":"A3////+HoaZL","upper_bound":"A3////+IxBu9","repeats":1},{"count":80,"lower_bound":"A3////+I1Ecm","upper_bound":"A3////+Janvb","repeats":1},{"count":88,"lower_bound":"A3////+JfuBv","upper_bound":"A3////+KLtHs","repeats":1},{"count":96,"lower_bound":"A3////+KPGER","upper_bound":"A3////+LH2Km","repeats":1},{"count":104,"lower_bound":"A3////+LSs35","upper_bound":"A3////+L7DOK","repeats":1},{"count":112,"lower_bound":"A3////+L9Ky1","upper_bound":"A3////+Ni5DJ","repeats":1},{"count":120,"lower_bound":"A3////+NlXGN","upper_bound":"A3////+OPkPM","repeats":1},{"count":128,"lower_bound":"A3////+OQ/7o","upper_bound":"A3////+PGHyZ","repeats":1},{"count":136,"lower_bound":"A3////+PXQyk","upper_bound":"A3////+QOSye","repeats":1},{"count":144,"lower_bound":"A3////+QS/q2","upper_bound":"A3////+RBTmg","repeats":1},{"count":152,"lower_bound":"A3////+RT+Fv","upper_bound":"A3////+R4pet","repeats":1},{"count":160,"lower_bound":"A3////+R8lmy","upper_bound":"A3////+SyA8g","repeats":1},{"count":168,"lower_bound":"A3////+SzOb8","upper_bound":"A3////+T+AQC","repeats":1},{"count":176,"lower_bound":"A3////+UC8Gf","upper_bound":"A3////+UoBVh","repeats":1},{"count":184,"lower_bound":"A3////+UzuuE","upper_bound":"A3////+VKYaT","repeats":1},{"count":192,"lower_bound":"A3////+VL/bR","upper_bound":"A3////+WHc6h","repeats":1},{"count":200,"lower_bound":"A3////+WOz5A","upper_bound":"A3////+W/lGa","repeats":1},{"count":208,"lower_bound":"A3////+XCV0V","upper_bound":"A3////+X2edu","repeats":1},{"count":216,"lower_bound":"A3////+YF6g8","upper_bound":"A3////+Y+czN","repeats":1},{"count":224,"lower_bound":"A3////+ZDvTc","upper_bound":"A3////+Zuh0z","repeats":1},{"count":232,"lower_bound":"A3////+Z5g/w","upper_bound":"A3////+bV911","repeats":1},{"count":240,"lower_bound":"A3////+bWVqP","upper_bound":"A3////+cMLoJ","repeats":1},{"count":248,"lower_bound":"A3////+cQHxA","upper_bound":"A3////+dpqGd","repeats":1},{"count":256,"lower_bound":"A3////+dr8u8","upper_bound":"A3////+eShYw","repeats":1},{"count":264,"lower_bound":"A3////+eaX45","upper_bound":"A3////+fYG7K","repeats":1},{"count":272,"lower_bound":"A3////+fpQ30","upper_bound":"A3////+gzNnG","repeats":1},{"count":280,"lower_bound":"A3////+g4Jrl","upper_bound":"A3////+h3Ne1","repeats":1},{"count":288,"lower_bound":"A3////+h3rUH","upper_bound":"A3////+iwuAw","repeats":1},{"count":296,"lower_bound":"A3////+iyADL","upper_bound":"A3////+j5UPF","repeats":1},{"count":304,"lower_bound":"A3////+kF2wN","upper_bound":"A3////+lZmG5","repeats":1},{"count":312,"lower_bound":"A3////+lbQX+","upper_bound":"A3////+mL7dB","repeats":1},{"count":320,"lower_bound":"A3////+mL/PS","upper_bound":"A3////+m0GpN","repeats":1},{"count":328,"lower_bound":"A3////+m5Nbm","upper_bound":"A3////+oel8e","repeats":1},{"count":336,"lower_bound":"A3////+oiEaR","upper_bound":"A3////+pXuGf","repeats":1},{"count":344,"lower_bound":"A3////+phKeI","upper_bound":"A3////+qFHqI","repeats":1},{"count":352,"lower_bound":"A3////+qXan6","upper_bound":"A3////+rFZHL","repeats":1},{"count":360,"lower_bound":"A3////+rFmC8","upper_bound":"A3////+r7Qz3","repeats":1},{"count":368,"lower_bound":"A3////+r7kiu","upper_bound":"A3////+so7Yx","repeats":1},{"count":376,"lower_bound":"A3////+szIYD","upper_bound":"A3////+trT2U","repeats":1},{"count":384,"lower_bound":"A3////+ttcYq","upper_bound":"A3////+u5mNK","repeats":1},{"count":392,"lower_bound":"A3////+u6myd","upper_bound":"A3////+wqyAq","repeats":1},{"count":400,"lower_bound":"A3////+wrCWs","upper_bound":"A3////+xNOdA","repeats":1},{"count":408,"lower_bound":"A3////+xNaID","upper_bound":"A3////+yfaic","repeats":1},{"count":416,"lower_bound":"A3////+yhWAB","upper_bound":"A3////+zMgK/","repeats":1},{"count":424,"lower_bound":"A3////+zOSJN","upper_bound":"A3////+z8cUc","repeats":1},{"count":432,"lower_bound":"A3////+z91sA","upper_bound":"A3////+0a3eg","repeats":1},{"count":440,"lower_bound":"A3////+0dTyD","upper_bound":"A3////+1O+RA","repeats":1},{"count":448,"lower_bound":"A3////+1RxeC","upper_bound":"A3////+2XIBM","repeats":1},{"count":456,"lower_bound":"A3////+2aHZX","upper_bound":"A3////+3ZRRG","repeats":1},{"count":464,"lower_bound":"A3////+3dtAE","upper_bound":"A3////+4caXO","repeats":1},{"count":472,"lower_bound":"A3////+4dUZ3","upper_bound":"A3////+49dKp","repeats":1},{"count":480,"lower_bound":"A3////+5EZfA","upper_bound":"A3////+6rf7E","repeats":1},{"count":488,"lower_bound":"A3////+6w4yk","upper_bound":"A3////+7okro","repeats":1},{"count":496,"lower_bound":"A3////+7qr8o","upper_bound":"A3////+9WEUO","repeats":1},{"count":504,"lower_bound":"A3////+9YIby","upper_bound":"A3////++Z2DQ","repeats":1},{"count":512,"lower_bound":"A3////++bS2T","upper_bound":"A3////++9g2S","repeats":1},{"count":520,"lower_bound":"A3////++9piO","upper_bound":"A3////+/enrO","repeats":1},{"count":528,"lower_bound":"A3////+/x/Dd","upper_bound":"A3/////A0bf8","repeats":1},{"count":536,"lower_bound":"A3/////A5lGm","upper_bound":"A3/////BxXDa","repeats":1},{"count":544,"lower_bound":"A3/////ByX5k","upper_bound":"A3/////C//4G","repeats":1},{"count":552,"lower_bound":"A3/////DF66o","upper_bound":"A3/////DpYrx","repeats":1},{"count":560,"lower_bound":"A3/////DrdWR","upper_bound":"A3/////EO95+","repeats":1},{"count":568,"lower_bound":"A3/////EnNaV","upper_bound":"A3/////FHo0f","repeats":1},{"count":576,"lower_bound":"A3/////FQbks","upper_bound":"A3/////F12G6","repeats":1},{"count":584,"lower_bound":"A3/////F4diO","upper_bound":"A3/////G1kfy","repeats":1},{"count":592,"lower_bound":"A3/////G5y3G","upper_bound":"A3/////H7t25","repeats":1},{"count":600,"lower_bound":"A3/////IZ5oc","upper_bound":"A3/////JKkyW","repeats":1},{"count":608,"lower_bound":"A3/////JRtsL","upper_bound":"A3/////J0tVp","repeats":1},{"count":616,"lower_bound":"A3/////J07sU","upper_bound":"A3/////K295Z","repeats":1},{"count":624,"lower_bound":"A3/////K9CED","upper_bound":"A3/////L2MtU","repeats":1},{"count":632,"lower_bound":"A3/////MJF1X","upper_bound":"A3/////N1c0F","repeats":1},{"count":640,"lower_bound":"A3/////N6j1R","upper_bound":"A3/////OWsip","repeats":1},{"count":648,"lower_bound":"A3/////OhiUZ","upper_bound":"A3/////PhOoq","repeats":1},{"count":656,"lower_bound":"A3/////PuXSl","upper_bound":"A3/////Qun9S","repeats":1},{"count":664,"lower_bound":"A3/////Qyj/x","upper_bound":"A3/////Rm2mh","repeats":1},{"count":672,"lower_bound":"A3/////Rt8Vz","upper_bound":"A3/////Sa+ZV","repeats":1},{"count":680,"lower_bound":"A3/////SfIVD","upper_bound":"A3/////UAtaQ","repeats":1},{"count":688,"lower_bound":"A3/////URasT","upper_bound":"A3/////VU5bC","repeats":1},{"count":696,"lower_bound":"A3/////Vip7c","upper_bound":"A3/////WWr+g","repeats":1},{"count":704,"lower_bound":"A3/////WcjtP","upper_bound":"A3/////Xhf4C","repeats":1},{"count":712,"lower_bound":"A3/////XotYL","upper_bound":"A3/////YpzmC","repeats":1},{"count":720,"lower_bound":"A3/////Y5En4","upper_bound":"A3/////ZxL+i","repeats":1},{"count":728,"lower_bound":"A3/////Z4MXW","upper_bound":"A3/////azzaK","repeats":1},{"count":736,"lower_bound":"A3/////bT2iL","upper_bound":"A3/////bqNhg","repeats":1},{"count":744,"lower_bound":"A3/////bxiZ3","upper_bound":"A3/////cx6N0","repeats":1},{"count":752,"lower_bound":"A3/////c0Rlj","upper_bound":"A3/////dqqQW","repeats":1},{"count":760,"lower_bound":"A3/////dzeJK","upper_bound":"A3/////e3UZq","repeats":1},{"count":768,"lower_bound":"A3/////e+en5","upper_bound":"A3/////gRT+4","repeats":1},{"count":776,"lower_bound":"A3/////gYEAI","upper_bound":"A3/////g89zD","repeats":1},{"count":784,"lower_bound":"A3/////hEK7r","upper_bound":"A3/////h41eL","repeats":1},{"count":792,"lower_bound":"A3/////iDMHP","upper_bound":"A3/////iviiF","repeats":1},{"count":800,"lower_bound":"A3/////i0Rrb","upper_bound":"A3/////jPAR6","repeats":1},{"count":808,"lower_bound":"A3/////jS6KP","upper_bound":"A3/////knEMY","repeats":1},{"count":816,"lower_bound":"A3/////kq7t5","upper_bound":"A3/////lL9iV","repeats":1},{"count":824,"lower_bound":"A3/////lS/OE","upper_bound":"A3/////l+RoY","repeats":1},{"count":832,"lower_bound":"A3/////mIj0X","upper_bound":"A3/////m+R0o","repeats":1},{"count":840,"lower_bound":"A3/////m+uz1","upper_bound":"A3/////n7hUa","repeats":1},{"count":848,"lower_bound":"A3/////oGsa1","upper_bound":"A3/////ogLaK","repeats":1},{"count":856,"lower_bound":"A3/////oi30q","upper_bound":"A3/////pS+Uw","repeats":1},{"count":864,"lower_bound":"A3/////pUb2N","upper_bound":"A3/////qEWQ2","repeats":1},{"count":872,"lower_bound":"A3/////qU5gx","upper_bound":"A3/////q8hB7","repeats":1},{"count":880,"lower_bound":"A3/////rHaRL","upper_bound":"A3/////sBfWO","repeats":1},{"count":888,"lower_bound":"A3/////sViMr","upper_bound":"A3/////tSGWg","repeats":1},{"count":896,"lower_bound":"A3/////teNV6","upper_bound":"A3/////ufloc","repeats":1},{"count":904,"lower_bound":"A3/////ugvc3","upper_bound":"A3/////v4Fhj","repeats":1},{"count":912,"lower_bound":"A3/////v/+GJ","upper_bound":"A3/////xNIXj","repeats":1},{"count":920,"lower_bound":"A3/////xNbuQ","upper_bound":"A3/////yJ1vI","repeats":1},{"count":928,"lower_bound":"A3/////yK16w","upper_bound":"A3/////zxJry","repeats":1},{"count":936,"lower_bound":"A3/////zzFKf","upper_bound":"A3/////1aGZA","repeats":1},{"count":944,"lower_bound":"A3/////1idC+","upper_bound":"A3/////17baX","repeats":1},{"count":952,"lower_bound":"A3/////2ZFkA","upper_bound":"A3/////3bHyW","repeats":1},{"count":960,"lower_bound":"A3/////3dWiK","upper_bound":"A3/////38c3O","repeats":1},{"count":968,"lower_bound":"A3/////3+QhD","upper_bound":"A3/////432c5","repeats":1},{"count":976,"lower_bound":"A3/////463Yr","upper_bound":"A3/////6TZtR","repeats":1},{"count":984,"lower_bound":"A3/////6esKJ","upper_bound":"A3/////627CE","repeats":1},{"count":992,"lower_bound":"A3/////69dS1","upper_bound":"A3/////8NceT","repeats":1},{"count":1000,"lower_bound":"A3/////8Yg/v","upper_bound":"A3/////9AIma","repeats":1},{"count":1008,"lower_bound":"A3/////9B1Rj","upper_bound":"A3/////+3M5E","repeats":1},{"count":1016,"lower_bound":"A3/////+86lM","upper_bound":"A3//////ac0D","repeats":1},{"count":1024,"lower_bound":"A3//////b70w","upper_bound":"A4AAAAAAEoWn","repeats":1},{"count":1032,"lower_bound":"A4AAAAAAE/Mu","upper_bound":"A4AAAAAAnHnQ","repeats":1},{"count":1040,"lower_bound":"A4AAAAAAxPHk","upper_bound":"A4AAAAABe5F7","repeats":1},{"count":1048,"lower_bound":"A4AAAAABsWad","upper_bound":"A4AAAAACfS/O","repeats":1},{"count":1056,"lower_bound":"A4AAAAACgE+t","upper_bound":"A4AAAAADZydB","repeats":1},{"count":1064,"lower_bound":"A4AAAAADnJB+","upper_bound":"A4AAAAAEb0B4","repeats":1},{"count":1072,"lower_bound":"A4AAAAAEoiTb","upper_bound":"A4AAAAAFNycP","repeats":1},{"count":1080,"lower_bound":"A4AAAAAFXMn0","upper_bound":"A4AAAAAGY6uu","repeats":1},{"count":1088,"lower_bound":"A4AAAAAGpcOv","upper_bound":"A4AAAAAHmL7F","repeats":1},{"count":1096,"lower_bound":"A4AAAAAHtIRW","upper_bound":"A4AAAAAISA+q","repeats":1},{"count":1104,"lower_bound":"A4AAAAAIWOCn","upper_bound":"A4AAAAAJOksN","repeats":1},{"count":1112,"lower_bound":"A4AAAAAJQIC1","upper_bound":"A4AAAAALDlti","repeats":1},{"count":1120,"lower_bound":"A4AAAAALETYR","upper_bound":"A4AAAAAMgUJC","repeats":1},{"count":1128,"lower_bound":"A4AAAAAMjbfd","upper_bound":"A4AAAAAOAkni","repeats":1},{"count":1136,"lower_bound":"A4AAAAAOIUCO","upper_bound":"A4AAAAAPPpUl","repeats":1},{"count":1144,"lower_bound":"A4AAAAAPnVCZ","upper_bound":"A4AAAAAQ3r11","repeats":1},{"count":1152,"lower_bound":"A4AAAAAQ5nIa","upper_bound":"A4AAAAARnkYp","repeats":1},{"count":1160,"lower_bound":"A4AAAAAR81Ky","upper_bound":"A4AAAAAS52zF","repeats":1},{"count":1168,"lower_bound":"A4AAAAATCe4a","upper_bound":"A4AAAAAURB2e","repeats":1},{"count":1176,"lower_bound":"A4AAAAAUT3kp","upper_bound":"A4AAAAAVJrOR","repeats":1},{"count":1184,"lower_bound":"A4AAAAAVNU41","upper_bound":"A4AAAAAVz2VT","repeats":1},{"count":1192,"lower_bound":"A4AAAAAV0aME","upper_bound":"A4AAAAAWgK1T","repeats":1},{"count":1200,"lower_bound":"A4AAAAAWsZpD","upper_bound":"A4AAAAAXD3qH","repeats":1},{"count":1208,"lower_bound":"A4AAAAAXK8lY","upper_bound":"A4AAAAAYAGcT","repeats":1},{"count":1216,"lower_bound":"A4AAAAAYFEuV","upper_bound":"A4AAAAAYmgv1","repeats":1},{"count":1224,"lower_bound":"A4AAAAAYvEpB","upper_bound":"A4AAAAAZ0yDm","repeats":1},{"count":1232,"lower_bound":"A4AAAAAaNzLf","upper_bound":"A4AAAAAanp6d","repeats":1},{"count":1240,"lower_bound":"A4AAAAAan5Vs","upper_bound":"A4AAAAAbw2FE","repeats":1},{"count":1248,"lower_bound":"A4AAAAAb3aSg","upper_bound":"A4AAAAAckgNH","repeats":1},{"count":1256,"lower_bound":"A4AAAAAcpPwz","upper_bound":"A4AAAAAc/WTq","repeats":1},{"count":1264,"lower_bound":"A4AAAAAdBD+P","upper_bound":"A4AAAAAegHHq","repeats":1},{"count":1272,"lower_bound":"A4AAAAAenPqZ","upper_bound":"A4AAAAAfAnFh","repeats":1},{"count":1280,"lower_bound":"A4AAAAAfBe4t","upper_bound":"A4AAAAAgYUic","repeats":1},{"count":1288,"lower_bound":"A4AAAAAgv/c4","upper_bound":"A4AAAAAidhjT","repeats":1},{"count":1296,"lower_bound":"A4AAAAAigW+z","upper_bound":"A4AAAAAjRbv8","repeats":1},{"count":1304,"lower_bound":"A4AAAAAjW+k/","upper_bound":"A4AAAAAkVfu4","repeats":1},{"count":1312,"lower_bound":"A4AAAAAkVoVD","upper_bound":"A4AAAAAlE+nu","repeats":1},{"count":1320,"lower_bound":"A4AAAAAlQEWu","upper_bound":"A4AAAAAm2jdO","repeats":1},{"count":1328,"lower_bound":"A4AAAAAm4HUI","upper_bound":"A4AAAAAneTNR","repeats":1},{"count":1336,"lower_bound":"A4AAAAAnnojb","upper_bound":"A4AAAAApE6pT","repeats":1},{"count":1344,"lower_bound":"A4AAAAApVqUo","upper_bound":"A4AAAAArX6tN","repeats":1},{"count":1352,"lower_bound":"A4AAAAArlEYi","upper_bound":"A4AAAAAsnpHv","repeats":1},{"count":1360,"lower_bound":"A4AAAAAsuCE3","upper_bound":"A4AAAAAtOs+Q","repeats":1},{"count":1368,"lower_bound":"A4AAAAAtmp3v","upper_bound":"A4AAAAAutXrU","repeats":1},{"count":1376,"lower_bound":"A4AAAAAu70H7","upper_bound":"A4AAAAAv+OCv","repeats":1},{"count":1384,"lower_bound":"A4AAAAAwCSQ7","upper_bound":"A4AAAAAwNXKE","repeats":1},{"count":1392,"lower_bound":"A4AAAAAwRuUF","upper_bound":"A4AAAAAw+tej","repeats":1},{"count":1400,"lower_bound":"A4AAAAAxAx2U","upper_bound":"A4AAAAAxwu2g","repeats":1},{"count":1408,"lower_bound":"A4AAAAAxyU0f","upper_bound":"A4AAAAAyt8RP","repeats":1},{"count":1416,"lower_bound":"A4AAAAAyvYIw","upper_bound":"A4AAAAAzZbiz","repeats":1},{"count":1424,"lower_bound":"A4AAAAAzaIPl","upper_bound":"A4AAAAA0zS4t","repeats":1},{"count":1432,"lower_bound":"A4AAAAA03Iic","upper_bound":"A4AAAAA2LQK6","repeats":1},{"count":1440,"lower_bound":"A4AAAAA2ObZw","upper_bound":"A4AAAAA3IQk6","repeats":1},{"count":1448,"lower_bound":"A4AAAAA3UBV8","upper_bound":"A4AAAAA4EfK5","repeats":1},{"count":1456,"lower_bound":"A4AAAAA4eyoe","upper_bound":"A4AAAAA5labw","repeats":1},{"count":1464,"lower_bound":"A4AAAAA5xGsa","upper_bound":"A4AAAAA6itIx","repeats":1},{"count":1472,"lower_bound":"A4AAAAA6yuMs","upper_bound":"A4AAAAA8vZrE","repeats":1},{"count":1480,"lower_bound":"A4AAAAA8whV3","upper_bound":"A4AAAAA9JD3G","repeats":1},{"count":1488,"lower_bound":"A4AAAAA9eA6y","upper_bound":"A4AAAAA+iN2o","repeats":1},{"count":1496,"lower_bound":"A4AAAAA+jqo9","upper_bound":"A4AAAAA/OAdn","repeats":1},{"count":1504,"lower_bound":"A4AAAAA/VvyN","upper_bound":"A4AAAAA/sgMc","repeats":1},{"count":1512,"lower_bound":"A4AAAAA/u923","upper_bound":"A4AAAABAuyGs","repeats":1},{"count":1520,"lower_bound":"A4AAAABAvldF","upper_bound":"A4AAAABCOW+t","repeats":1},{"count":1528,"lower_bound":"A4AAAABCcBx5","upper_bound":"A4AAAABDDBuy","repeats":1},{"count":1536,"lower_bound":"A4AAAABDH75t","upper_bound":"A4AAAABDkL/G","repeats":1},{"count":1544,"lower_bound":"A4AAAABDyXKY","upper_bound":"A4AAAABE9oux","repeats":1},{"count":1552,"lower_bound":"A4AAAABE+Mv0","upper_bound":"A4AAAABFW1Y4","repeats":1},{"count":1560,"lower_bound":"A4AAAABFib4b","upper_bound":"A4AAAABGjjmd","repeats":1},{"count":1568,"lower_bound":"A4AAAABGk02d","upper_bound":"A4AAAABIRF1k","repeats":1},{"count":1576,"lower_bound":"A4AAAABIbKrc","upper_bound":"A4AAAABJ09bb","repeats":1},{"count":1584,"lower_bound":"A4AAAABKHCjo","upper_bound":"A4AAAABLUF31","repeats":1},{"count":1592,"lower_bound":"A4AAAABLUqmC","upper_bound":"A4AAAABL9A4q","repeats":1},{"count":1600,"lower_bound":"A4AAAABMVIfT","upper_bound":"A4AAAABNpL9w","repeats":1},{"count":1608,"lower_bound":"A4AAAABN1UVQ","upper_bound":"A4AAAABOic8v","repeats":1},{"count":1616,"lower_bound":"A4AAAABOkQcv","upper_bound":"A4AAAABPDQCI","repeats":1},{"count":1624,"lower_bound":"A4AAAABPEj2J","upper_bound":"A4AAAABP3B2i","repeats":1},{"count":1632,"lower_bound":"A4AAAABP3PrX","upper_bound":"A4AAAABQrL+W","repeats":1},{"count":1640,"lower_bound":"A4AAAABQthvn","upper_bound":"A4AAAABRJDo9","repeats":1},{"count":1648,"lower_bound":"A4AAAABRUDUw","upper_bound":"A4AAAABR6cyV","repeats":1},{"count":1656,"lower_bound":"A4AAAABR7UhV","upper_bound":"A4AAAABTHxOW","repeats":1},{"count":1664,"lower_bound":"A4AAAABTJkm7","upper_bound":"A4AAAABUSlH8","repeats":1},{"count":1672,"lower_bound":"A4AAAABUV7cs","upper_bound":"A4AAAABVJF8Q","repeats":1},{"count":1680,"lower_bound":"A4AAAABVo3O8","upper_bound":"A4AAAABWIueB","repeats":1},{"count":1688,"lower_bound":"A4AAAABWXTJA","upper_bound":"A4AAAABXSudy","repeats":1},{"count":1696,"lower_bound":"A4AAAABXTefd","upper_bound":"A4AAAABYT9Uw","repeats":1},{"count":1704,"lower_bound":"A4AAAABYhyaD","upper_bound":"A4AAAABZ6d4v","repeats":1},{"count":1712,"lower_bound":"A4AAAABaAtEv","upper_bound":"A4AAAABacLBW","repeats":1},{"count":1720,"lower_bound":"A4AAAABalNLJ","upper_bound":"A4AAAABbhC0d","repeats":1},{"count":1728,"lower_bound":"A4AAAABbhiqN","upper_bound":"A4AAAABb8DPU","repeats":1},{"count":1736,"lower_bound":"A4AAAABceQSl","upper_bound":"A4AAAABdfhGf","repeats":1},{"count":1744,"lower_bound":"A4AAAABdgZt6","upper_bound":"A4AAAABedHcY","repeats":1},{"count":1752,"lower_bound":"A4AAAABeev8x","upper_bound":"A4AAAABfDySQ","repeats":1},{"count":1760,"lower_bound":"A4AAAABfSPTw","upper_bound":"A4AAAABf0/wW","repeats":1},{"count":1768,"lower_bound":"A4AAAABf1QdL","upper_bound":"A4AAAABhK6DU","repeats":1},{"count":1776,"lower_bound":"A4AAAABhUCYM","upper_bound":"A4AAAABjYY36","repeats":1},{"count":1784,"lower_bound":"A4AAAABjY2jG","upper_bound":"A4AAAABkTg3g","repeats":1},{"count":1792,"lower_bound":"A4AAAABkUKTo","upper_bound":"A4AAAABk24U4","repeats":1},{"count":1800,"lower_bound":"A4AAAABlDcNg","upper_bound":"A4AAAABl1aFY","repeats":1},{"count":1808,"lower_bound":"A4AAAABl6It1","upper_bound":"A4AAAABm0WjK","repeats":1},{"count":1816,"lower_bound":"A4AAAABm00yd","upper_bound":"A4AAAABoDEYU","repeats":1},{"count":1824,"lower_bound":"A4AAAABoDuJt","upper_bound":"A4AAAABowRbw","repeats":1},{"count":1832,"lower_bound":"A4AAAABpUuEH","upper_bound":"A4AAAABqLRoo","repeats":1},{"count":1840,"lower_bound":"A4AAAABqSf0y","upper_bound":"A4AAAABrLE3a","repeats":1},{"count":1848,"lower_bound":"A4AAAABrP/+v","upper_bound":"A4AAAABrsDGJ","repeats":1},{"count":1856,"lower_bound":"A4AAAABr4dFx","upper_bound":"A4AAAABtA/Lf","repeats":1},{"count":1864,"lower_bound":"A4AAAABtFIUt","upper_bound":"A4AAAABuhxUq","repeats":1},{"count":1872,"lower_bound":"A4AAAABu0NMO","upper_bound":"A4AAAABvjtob","repeats":1},{"count":1880,"lower_bound":"A4AAAABvky9o","upper_bound":"A4AAAABwlAXn","repeats":1},{"count":1888,"lower_bound":"A4AAAABwrIq7","upper_bound":"A4AAAABxJ9LQ","repeats":1},{"count":1896,"lower_bound":"A4AAAABxKjAw","upper_bound":"A4AAAAByrAZt","repeats":1},{"count":1904,"lower_bound":"A4AAAABy/88Q","upper_bound":"A4AAAABzoui6","repeats":1},{"count":1912,"lower_bound":"A4AAAABzqe8/","upper_bound":"A4AAAAB0xJkx","repeats":1},{"count":1920,"lower_bound":"A4AAAAB0ylif","upper_bound":"A4AAAAB1xz0a","repeats":1},{"count":1928,"lower_bound":"A4AAAAB10TWS","upper_bound":"A4AAAAB3G63C","repeats":1},{"count":1936,"lower_bound":"A4AAAAB3KpXR","upper_bound":"A4AAAAB4I7bp","repeats":1},{"count":1944,"lower_bound":"A4AAAAB4Y2EP","upper_bound":"A4AAAAB5JO8n","repeats":1},{"count":1952,"lower_bound":"A4AAAAB5NcLu","upper_bound":"A4AAAAB54yMh","repeats":1},{"count":1960,"lower_bound":"A4AAAAB56oN6","upper_bound":"A4AAAAB6y1Tx","repeats":1},{"count":1968,"lower_bound":"A4AAAAB61BKZ","upper_bound":"A4AAAAB7VU3a","repeats":1},{"count":1976,"lower_bound":"A4AAAAB7e1+b","upper_bound":"A4AAAAB8Gc9Z","repeats":1},{"count":1984,"lower_bound":"A4AAAAB8R+/g","upper_bound":"A4AAAAB9bsf8","repeats":1},{"count":1992,"lower_bound":"A4AAAAB9ga1Z","upper_bound":"A4AAAAB+qN5g","repeats":1},{"count":2000,"lower_bound":"A4AAAAB+tvHf","upper_bound":"A4AAAAB/1Uaj","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,0,2,4,0,1,3,2,1,0,0,1,1,1,3,0,2,0,1,0,0,0,0,0,1,0,0,1,2,0,1,0,1,0,2,1,1,1,3,2,2,0,2,0,0,0,3,0,0,3,1,2,0,2,0,0,2,2,1,0,0,1,2,1,0,2,0,1,0,1,1,2,1,0,0,0,1,0,0,1,0,1,0,1,2,2,0,1,1,0,0,2,2,0,0,1,1,2,0,3,2,1,1,1,0,1,0,2,1,1,2,0,1,3,0,1,3,1,1,1,2,2,0,1,0,2,1,2,2,2,0,1,2,1,0,0,2,2,2,1,1,0,3,0,1,1,0,1,3,0,1,2,3,1,1,0,0,1,0,1,0,0,0,2,2,1,1,2,1,1,1,2,0,2,1,1,0,1,4,0,1,2,0,1,2,3,0,1,1,1,0,2,2,2,1,2,1,1,0,0,0,1,1,0,1,3,2,1,0,1,1,1,2,3,1,0,1,1,3,0,1,1,1,0,1,2,3,0,0,2,1,1,1,1,2,1,0,0,2,1,0,1,0,0,1,1,0,1,3,1,1,1,1,0,3,0,0,0,1,3,0,3,1,3,1,0,1,3,2,1,3,2,1,0,0,1,1,1,2,1,3,0,0,0,0,1,1,0,2,1,0,3,0,0,0,1,2,1,1,2,1,0,1,1,0,0,0,1,1,2,1,1,2,1,1,2,0,0,1,2,1,0,0,1,1,0,3,1,0,0,0,0,4,4,1,0,1,1,0,1,5,1,0,0,2,0,1,0,0,0,2,0,0,1,2,1,2,2,1,1,2,2,1,1,2,0,1,1,0,0,4,3,0,2,0,1,0,0,0,2,1,1,0,1,2,2,0,1,0,1,0,1,0,1,0,0,0,2,2,1,1,0,0,2,1,2,0,2,2,0,0,1,1,0,0,2,1,0,4,0,0,2,0,1,0,2,0,5,0,3,1,1,2,0,0,2,0,2,2,1,2,0,0,1,1,1,1,0,1,1,0,1,1,0,1,1,0,0,1,3,0,1,1,1,4,3,0,2,1,1,1,1,1,0,1,1,0,1,1,0,2,0,2,1,1,0,2,1,0,3,2,0,0,0,0,0,0,2,1,0,1,2,3,1,1,2,4,1,0,1,1,0,0,1,0,2,0,1,4,1,2,1,1,1,0,0,0,3,1,0,1,4,1,1,1,1,1,3,1,1,1,0,0,2,1,1,1,0,0,2,1,0,1,0,1,2,2,0,0,2,1,3,1,1,4,1,1,0,1,0,2,0,2,4,1,2,1,2,0,1,3,0,1,0,1,1,1,0,0,2,0,0,1,1,1,0,0,1,2,0,0,1,0,0,2,0,0,1,0,1,2,0,0,2,1,4,1,1,0,0,0,1,0,1,1,1,4,1,1,0,0,3,1,1,1,0,1,0,0,1,0,1,3,1,1,1,0,0,1,0,4,0,0,0,2,0,0,0,0,0,2,1,0,1,2,0,1,1,2,0,1,3,0,2,2,1,0,1,0,2,0,2,2,1,0,0,1,1,1,0,2,1,2,1,1,3,1,0,1,0,0,2,0,0,0,1,1,0,0,1,0,1,0,2,1,1,0,0,1,1,0,1,0,0,0,1,1,0,3,0,1,0,1,1,2,1,2,2,0,1,0,1,1,2,3,0,1,2,1,0,1,0,0,2,1,1,0,0,2,0,2,0,3,1,0,2,0,0,0,2,0,1,1,0,0,1,0,0,2,1,2,0,2,0,0,1,2,3,1,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,3,2,1,0,2,1,1,1,1,2,1,1,1,2,3,2,1,1,1,0,0,0,0,0,0,1,2,0,0,1,0,2,0,1,1,1,0,2,2,1,3,4,1,1,0,1,1,1,1,1,1,2,0,2,2,2,3,1,1,2,2,0,0,3,1,1,0,0,1,0,0,2,1,1,1,1,2,2,2,0,0,0,2,2,0,0,1,0,0,1,0,1,1,0,0,0,3,2,2,0,2,2,3,0,1,0,0,1,1,0,0,2,0,0,1,1,0,0,1,0,1,0,1,1,0,0,1,0,3,2,0,1,1,1,1,1,1,0,0,0,1,0,1,0,0,3,1,1,0,1,0,0,1,1,0,2,1,2,0,2,0,0,0,1,1,1,1,2,0,0,1,0,0,0,0,0,1,4,0,0,1,0,0,2,1,0,1,6,1,1,1,0,1,0,0,3,3,0,0,0,2,2,1,0,0,0,1,1,3,1,1,0,1,1,2,0,0,1,0,0,2,2,0,2,2,0,0,2,0,1,2,1,1,2,0,0,1,0,0,0,1,1,0,2,0,2,0,2,0,1,2,1,3,2,0,1,1,0,2,3,1,0,0,1,1,1,1,3,3,1,2,1,1,0,1,0,2,1,0,0,1,0,1,1,0,0,1,0,2,0,1,0,2,2,2,1,0,1,0,0,2,0,2,0,2,0,1,1,0,1,0,1,3,4,2,1,1,0,0,1,1,0,0,0,3,0,1,1,0,1,1,2,0,2,0,1,1,1,1,2,2,1,1,1,1,2,0,0,0,0,4,1,1,1,0,0,1,0,3,3,2,1,2,0,1,0,1,2,1,2,1,0,1,2,2,0,1,0,2,0,2,2,0,0,1,1,1,2,1,2,1,0,3,2,2,0,1,3,2,2,0,2,1,0,1,1,2,0,3,1,0,1,1,0,2,0,2,0,2,1,1,2,3,0,0,3,0,0,0,1,3,0,0,2,2,1,3,0,1,4,1,1,1,0,0,0,1,1,0,0,2,0,3,1,1,0,2,1,0,2,1,3,0,4,1,1,3,1,0,1,0,1,1,0,0,2,1,1,1,0,0,2,1,0,1,0,0,1,0,2,1,1,0,1,1,3,1,1,1,2,1,1,1,0,0,3,4,0,2,1,0,0,1,2,0,0,1,2,0,3,0,0,2,1,1,0,0,0,2,1,0,0,0,2,0,0,1,2,1,1,0,1,1,1,0,1,1,1,0,2,0,1,2,0,1,1,1,1,1,1,0,1,0,2,2,1,0,0,2,0,0,1,0,0,1,1,0,3,2,0,0,5,1,1,2,0,0,0,0,0,2,0,2,2,1,0,2,2,0,1,1,1,1,0,0,0,0,1,2,0,3,0,0,1,1,3,1,1,1,0,1,0,0,1,2,0,1,1,0,0,0,4,0,0,1,2,0,5,1,0,0,1,0,2,1,0,1,0,2,1,1,0,1,1,0,0,2,0,0,2,3,0,0,0,0,1,1,1,0,2,1,0,0,3,1,0,1,0,0,1,1,0,0,0,0,2,2,1,1,1,0,0,0,3,0,1,0,2,1,3,0,4,0,0,2,0,1,2,1,1,0,1,1,3,0,2,0,3,1,1,1,2,2,0,0,0,2,1,1,0,2,0,2,2,0,2,0,0,1,1,2,1,2,2,0,1,3,0,0,1,0,0,3,1,1,1,1,2,0,0,1,1,1,2,3,2,1,0,0,1,1,1,1,2,1,2,1,0,2,1,1,0,1,1,0,0,1,2,3,1,4,2,2,4,7,1,0,2,1,1,0,3,2,0,1,1,3,0,0,2,0,1,0,1,2,0,1,3,1,5,0,0,2,0,0,1,2,0,2,0,0,1,1,1,1,1,0,2,2,2,1,1,0,0,0,2,2,1,1,0,0,4,2,0,2,0,1,0,0,0,0,0,1,0,2,0,0,1,2,2,2,0,0,0,0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,2,1,1,1,1,1,1,2,1,0,0,1,1,2,0,0,0,1,1,3,2,1,1,1,0,0,1,1,1,0,1,0,2,1,1,2,0,2,3,0,1,2,0,2,0,1,2,5,0,2,2,0,1,1,0,0,2,0,0,3,2,2,0,1,0,0,0,1,2,0,0,1,1,0,2,1,2,0,1,0,0,2,1,2,1,1,3,0,0,1,0,0,1,1,0,3,1,3,2,1,0,2,0,2,1,0,0,2,0,0,3,1,1,0,1,1,1,1,2,0,1,0,0,0,1,0,1,1,1,1,0,0,0,0,1,2,1,1,0,2,0,0,2,1,0,1,0,0,0,1,0,0,0,2,0,2,1,0,0,1,1,1,2,2,0,1,0,2,0,0,0,0,0,0,2,0,0,0,2,2,0,1,0,0,1,0,0,2,3,1,0,3,2,0,0,1,0,2,2,3,1,2,2,1,2,1,0,0,3,2,1,3,2,1,0,2,3,0,1,0,0,1,0,2,0,1,1,2,0,0,1,0,0,1,0,0,0,3,4,1,0,1,1,0,0,2,3,1,2,2,0,1,0,2,0,1,2,1,2,3,1,0,0,3,2,1,1,0,0,1,2,0,2,1,0,0,2,2,1,0,0,0,0,1,1,0,1,2,1,0,2,0,3,0,2,1,0,3,0,0,1,1,2,1,0,1,1,0,0,2,1,0,0,0,0,4,3,0,0,0,1,1,1,0,2,3,1,2,1,0,1,1,2,0,1,0,4,2,0,2,3,0,1,1,1,3,0,1,2,0,1,0,1]},{"counters":[1,0,1,1,0,1,0,1,0,0,0,1,1,3,0,2,0,0,1,1,1,2,0,0,3,1,1,1,0,1,2,1,1,1,3,0,0,0,1,2,0,0,1,1,0,1,1,0,1,1,1,0,0,1,1,0,0,0,1,1,1,1,1,3,3,0,0,1,2,2,0,0,0,0,3,1,1,3,2,0,2,3,0,0,0,0,1,1,1,0,0,1,1,1,2,0,2,0,0,1,0,1,1,0,1,0,1,0,2,0,4,2,1,1,1,2,1,1,0,0,0,0,0,1,1,0,0,2,0,2,2,1,3,0,1,1,0,0,1,2,1,1,1,1,0,0,3,1,2,0,0,2,1,1,1,1,1,1,0,3,0,2,2,0,1,1,2,2,1,3,2,0,1,1,1,1,0,3,2,3,1,1,1,1,2,2,0,1,0,1,1,1,1,1,1,1,1,0,3,3,1,2,1,0,0,0,0,0,1,0,1,1,2,1,1,0,0,0,0,1,0,1,3,0,3,2,2,0,1,0,2,2,0,0,0,0,0,2,0,1,1,0,0,0,3,0,1,3,3,2,0,2,2,0,0,0,1,0,1,2,2,1,1,3,2,0,1,1,0,1,0,1,1,0,2,1,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,0,0,1,1,2,0,2,2,1,1,3,0,0,0,0,1,1,1,1,1,1,1,0,2,1,1,0,0,1,0,1,1,2,0,1,1,0,0,1,3,3,1,0,0,1,0,1,0,2,0,1,2,1,0,0,0,0,4,1,2,0,2,1,2,5,1,2,0,4,0,1,2,1,1,0,0,1,0,2,1,2,1,0,2,2,0,0,0,1,0,1,0,0,0,1,1,3,1,2,1,0,2,2,0,0,1,1,3,3,1,0,0,0,0,3,1,0,0,0,1,0,2,2,0,1,2,0,2,1,0,3,2,0,0,0,1,0,0,0,1,0,0,1,0,1,1,1,0,2,0,1,0,0,1,1,1,3,0,1,0,0,2,0,0,0,1,2,1,2,2,0,0,0,2,3,0,0,2,1,1,1,0,3,0,2,0,0,2,3,4,1,0,0,0,2,1,0,0,1,2,4,1,2,0,1,0,1,0,0,0,0,3,0,0,2,1,1,0,2,0,0,1,2,2,3,1,1,1,2,0,2,0,0,0,1,1,2,2,2,1,1,4,1,1,1,0,1,3,0,2,1,1,3,0,2,2,1,1,0,0,0,1,4,3,2,1,2,1,2,0,0,0,1,2,1,1,1,0,1,0,0,1,0,0,3,1,1,2,1,0,0,0,1,1,2,0,2,1,0,1,1,2,0,1,2,1,0,0,3,1,0,0,2,1,3,3,1,0,1,1,3,2,1,1,0,0,1,3,1,1,0,0,1,2,2,2,1,2,1,0,3,0,2,0,1,0,0,0,1,0,1,1,0,1,1,1,0,0,1,1,1,0,1,1,0,0,3,0,1,0,0,3,1,1,2,0,0,0,1,0,1,0,2,0,2,1,3,1,0,2,0,1,1,1,0,0,1,0,3,2,0,0,0,2,2,1,2,3,1,0,2,0,1,1,1,1,0,1,0,0,2,3,1,1,0,1,0,0,0,0,0,0,1,2,0,1,2,1,3,3,0,0,1,1,0,1,2,0,1,0,3,1,0,1,0,0,2,1,1,4,2,1,0,3,0,1,1,1,1,3,2,1,0,1,2,2,1,3,2,1,0,0,0,1,3,2,0,1,0,1,1,0,2,1,0,0,1,2,2,1,2,1,3,2,0,2,0,3,1,0,4,1,0,2,0,2,0,0,0,1,0,1,0,2,4,0,1,0,0,0,3,0,0,0,0,2,1,2,2,1,0,1,3,0,2,0,3,0,0,1,0,2,0,2,1,2,0,2,2,0,0,0,2,2,1,0,0,1,0,2,2,0,0,0,1,2,0,0,0,0,1,0,1,1,2,2,1,1,1,1,2,1,5,1,0,1,2,2,1,1,0,1,2,2,1,0,1,1,1,1,1,0,2,3,1,4,1,0,1,0,3,1,1,0,0,3,3,2,3,3,3,1,0,2,0,2,2,2,2,0,2,0,1,1,0,2,1,1,0,0,0,0,0,0,2,2,2,1,4,0,0,0,3,1,2,0,1,0,1,2,2,0,1,3,1,1,1,0,3,2,2,0,1,1,0,3,0,1,2,0,0,2,0,1,0,0,0,1,1,1,2,1,2,1,1,1,1,0,0,0,1,1,0,1,0,0,1,1,0,0,1,2,0,0,0,1,1,2,1,4,1,1,0,0,1,0,0,0,0,3,1,0,1,2,0,1,2,2,1,1,1,0,1,3,1,0,2,0,1,0,6,0,1,0,1,0,2,0,0,1,2,1,1,1,2,1,0,0,2,0,0,1,0,3,1,1,1,3,0,1,1,2,1,0,2,0,1,2,0,3,0,0,1,1,0,3,1,0,0,0,1,1,0,0,0,0,1,1,1,2,1,2,1,2,1,1,1,1,1,0,0,0,0,3,3,1,1,3,1,0,0,0,0,1,1,0,1,1,1,0,0,1,0,0,0,2,0,0,1,0,2,3,2,0,3,3,0,2,0,2,2,1,2,1,1,0,0,0,1,1,0,1,1,0,2,1,2,0,1,0,0,0,1,0,1,1,2,1,0,0,2,2,1,0,0,1,2,1,1,3,0,0,0,1,2,0,0,1,0,4,0,1,0,0,0,2,3,0,1,1,2,0,0,1,1,2,2,2,0,3,1,0,1,0,1,0,0,2,1,1,1,1,2,0,1,0,0,0,0,0,1,0,0,2,2,1,2,2,0,1,0,1,3,0,2,0,3,0,0,0,1,0,0,0,2,0,1,3,1,0,1,2,2,0,1,2,1,2,1,0,1,1,0,0,2,4,0,1,2,1,0,0,3,1,4,3,1,2,0,0,1,1,1,0,1,1,2,0,0,0,1,0,0,2,0,1,0,0,0,1,0,1,3,3,1,1,0,2,3,2,3,3,0,2,3,1,2,1,0,0,1,1,2,2,1,0,1,3,1,1,3,2,0,0,2,0,0,2,3,1,2,1,0,2,1,0,2,1,1,2,0,1,2,1,2,1,0,0,4,1,1,2,0,0,0,2,2,1,0,0,1,0,2,2,1,1,0,0,0,0,0,2,1,1,0,1,2,1,1,0,0,1,2,1,2,3,2,1,1,1,0,1,1,1,1,0,1,1,0,0,1,0,0,2,0,3,2,1,1,1,2,2,0,0,0,0,1,1,0,1,0,1,1,0,2,2,1,3,2,3,0,3,1,2,1,2,2,0,0,1,1,0,0,0,1,3,0,0,3,3,0,1,2,1,1,0,0,0,0,0,3,2,2,0,0,0,3,1,5,1,1,1,0,3,1,1,0,4,2,2,0,1,1,2,2,0,1,1,1,0,2,1,0,2,1,0,0,1,0,0,0,1,1,0,1,1,0,2,1,0,2,0,0,1,0,0,1,2,2,2,1,2,1,0,0,1,1,1,1,1,1,0,1,1,1,4,0,1,0,3,2,1,0,1,2,0,0,4,0,0,2,0,2,0,2,1,1,1,2,1,1,1,0,1,0,1,0,1,1,0,1,2,2,0,0,0,1,2,1,1,1,0,3,0,1,1,0,1,2,3,3,1,0,2,0,0,2,1,0,2,3,1,1,1,0,0,0,0,0,3,0,3,1,1,1,2,2,0,0,1,0,1,1,1,2,0,3,1,1,4,0,0,1,0,0,2,0,1,1,0,0,0,0,0,0,1,1,0,1,1,2,3,3,1,0,0,0,4,1,2,0,0,1,2,0,1,0,0,0,0,1,1,2,1,0,2,2,0,2,2,1,0,0,0,0,1,2,2,1,0,0,0,1,1,2,0,1,0,1,2,2,0,0,1,2,0,1,1,0,0,1,1,0,2,1,1,2,0,1,0,0,1,0,2,4,0,1,0,1,1,1,1,0,3,1,1,2,1,0,0,0,4,0,1,2,1,2,0,3,0,0,1,2,0,0,1,0,0,2,1,0,3,3,2,1,0,2,0,1,1,1,1,2,1,1,2,0,1,0,1,0,2,1,0,1,0,1,1,0,1,0,2,0,0,2,0,2,0,3,0,2,0,1,0,0,1,1,0,0,1,0,2,1,1,0,2,0,3,0,0,0,1,0,0,2,0,2,0,1,1,0,2,0,0,0,1,0,1,2,1,2,2,2,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,0,1,1,0,0,1,1,3,0,0,2,1,2,0,2,3,3,1,1,0,2,2,0,0,0,2,0,4,0,1,1,1,0,1,1,0,2,0,0,2,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,0,1,3,2,0,2,1,1,2,2,0,1,0,1,1,1,0,0,0,1,3,0,1,0,2,2,1,2,1,0,1,1,1,0,2,0,1,2,1,0,1,1,0,2,1,0,1,0,1,0,0,0,1,0,2,2,0,3,1,1,0,1,1,2,1,2,0,1,0,2,0,0,1,0,0,0,0,1,0,0,0,2,2,1,2,2,3,0,0,1,1,0,1]},{"counters":[0,1,1,0,0,0,2,1,1,0,0,0,1,0,0,1,0,2,2,2,1,0,3,0,1,1,2,3,0,0,2,0,2,1,3,0,2,2,0,1,2,1,1,0,0,0,1,2,0,1,0,0,0,0,0,1,3,3,1,0,0,0,1,0,0,2,0,1,0,1,2,1,2,1,0,3,2,2,2,1,1,1,0,1,0,0,2,2,1,0,1,2,0,0,0,1,2,0,2,1,1,2,0,0,2,2,0,1,2,0,0,0,0,0,2,2,1,1,0,1,1,0,1,1,1,3,0,0,0,2,1,2,1,1,1,1,1,2,1,1,0,0,1,1,1,1,1,1,0,3,0,0,0,0,1,2,1,1,0,1,1,1,0,1,1,1,1,0,0,1,2,0,1,0,0,3,1,0,1,0,1,0,0,1,0,0,0,0,1,2,2,1,1,0,0,0,1,1,2,1,1,3,0,3,4,1,1,0,3,2,0,1,1,0,0,1,1,1,3,1,1,0,3,3,0,1,2,2,0,0,0,1,0,2,1,2,1,1,0,0,5,1,0,0,1,2,0,2,1,0,1,1,0,0,2,0,0,0,0,6,1,1,1,0,1,3,1,3,1,1,0,1,2,1,1,1,0,3,0,2,1,1,1,1,1,1,1,2,0,0,1,0,1,3,0,1,0,2,2,0,1,0,2,1,1,1,2,0,0,0,2,0,0,3,0,0,2,1,1,2,0,0,3,0,2,1,2,1,0,1,1,0,1,0,2,1,0,1,1,2,2,2,0,0,0,1,1,1,1,0,0,0,0,1,0,1,0,0,1,2,2,0,0,0,2,2,1,0,0,0,2,1,0,0,1,1,1,0,1,0,2,1,1,4,3,2,0,0,1,0,0,1,3,0,0,2,1,0,0,0,2,1,1,1,0,1,0,1,2,1,1,1,2,1,1,2,0,2,0,1,1,1,0,0,1,1,2,1,0,0,0,1,0,1,1,4,0,2,0,0,2,4,1,0,2,1,2,0,0,0,1,1,1,2,3,0,1,0,1,1,1,0,0,2,0,1,1,2,1,0,0,1,1,0,1,1,0,0,1,0,1,1,1,1,0,2,0,2,2,1,1,0,1,2,5,1,0,2,0,0,2,0,0,0,2,1,2,2,1,2,2,1,0,0,1,1,0,0,3,1,2,1,2,0,1,1,1,0,2,0,1,0,2,2,0,0,1,1,1,1,1,0,2,0,0,0,3,0,1,1,1,0,2,2,1,0,0,0,1,2,0,2,1,1,1,0,0,1,0,1,2,0,2,1,0,0,4,1,2,0,0,1,2,0,1,2,1,1,1,5,0,1,1,0,0,4,0,0,1,4,2,1,0,0,0,2,1,2,1,0,0,3,1,1,1,1,0,1,0,2,2,2,3,1,0,0,2,0,1,0,1,1,0,1,0,1,0,2,2,0,2,2,2,1,1,3,2,0,0,3,0,0,1,1,4,2,1,0,0,1,1,0,1,0,0,1,0,1,1,2,1,0,1,0,0,1,0,1,0,2,2,1,0,2,0,3,0,3,1,1,1,1,0,0,1,1,0,1,1,0,1,0,1,1,0,0,1,2,1,1,3,2,0,0,0,0,0,2,1,0,0,1,2,1,0,0,3,1,0,1,2,0,2,1,1,3,0,1,0,0,0,0,0,1,1,0,1,1,1,2,2,2,0,0,0,1,0,1,0,1,2,1,1,1,3,0,1,2,1,0,1,1,1,2,1,2,1,0,1,0,0,0,1,1,1,3,1,0,2,4,0,0,1,1,1,2,1,1,1,0,1,1,3,1,0,0,0,1,0,0,1,0,1,0,1,1,0,0,0,2,1,1,2,1,1,2,0,1,1,1,0,0,0,0,0,0,3,1,1,0,0,1,0,3,0,0,0,3,0,1,0,3,1,0,0,2,2,0,1,1,4,2,2,0,0,2,1,0,0,1,3,0,1,0,0,3,3,0,0,1,0,2,2,0,1,1,0,0,1,0,0,0,2,2,1,2,2,0,0,0,1,0,2,1,1,0,1,1,0,0,2,1,2,0,2,1,0,1,1,0,1,0,0,1,0,1,0,1,0,0,3,0,0,2,1,0,2,0,2,0,0,0,0,3,0,1,1,1,2,2,1,1,1,0,3,1,1,2,1,0,2,0,0,0,2,3,0,1,1,0,0,1,0,1,1,1,1,1,2,1,0,0,1,2,0,2,3,1,0,2,1,1,3,1,1,1,1,2,0,0,0,3,2,2,2,2,1,3,2,1,1,1,1,0,0,0,2,0,0,2,0,1,1,1,1,0,3,0,1,0,3,2,1,0,1,0,3,2,0,1,0,0,1,1,0,1,0,0,4,2,2,0,3,1,1,1,1,1,0,0,3,3,0,2,1,2,0,1,0,2,0,1,1,1,1,1,1,1,0,1,0,1,2,1,1,2,1,2,2,0,2,1,2,3,1,1,1,0,2,0,3,1,1,0,0,3,0,3,0,1,0,1,2,1,1,0,1,0,1,2,2,0,0,0,1,1,2,2,1,2,0,2,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,2,1,1,1,6,0,1,0,1,0,2,2,1,1,1,1,1,1,1,2,1,1,1,0,2,1,1,1,2,1,0,0,1,2,2,0,0,2,0,2,1,0,1,0,1,0,0,0,0,2,2,2,0,1,0,1,3,1,0,1,0,0,2,1,3,1,1,1,0,0,3,2,0,1,0,1,0,0,0,3,1,1,2,1,1,0,1,1,1,0,0,0,3,1,2,1,1,1,1,2,0,2,0,1,0,1,1,1,1,1,2,1,0,1,1,0,1,2,1,1,3,1,1,2,0,3,1,2,1,1,1,1,0,0,2,0,1,1,1,1,0,1,1,0,0,0,4,0,1,1,3,1,3,2,1,0,0,0,1,0,2,1,1,3,2,0,1,1,0,0,1,2,0,2,1,1,2,1,0,2,2,0,3,2,0,0,2,3,1,1,0,2,0,4,0,0,1,3,0,0,0,2,0,2,0,0,2,0,0,1,1,1,1,2,1,1,2,1,1,1,1,2,2,1,0,2,1,1,1,1,0,0,2,0,0,0,0,0,4,0,0,1,0,5,2,2,0,3,0,2,1,3,1,0,4,0,1,3,1,0,1,1,0,3,2,1,0,1,2,1,1,0,1,2,1,0,0,2,0,1,1,1,2,0,1,2,1,0,3,1,1,4,2,0,1,1,2,1,0,0,3,2,1,0,0,1,0,4,1,1,0,2,2,0,0,1,0,0,1,1,0,1,0,0,1,1,0,0,0,1,4,2,3,2,1,0,2,0,2,1,3,0,1,4,3,0,0,0,1,0,1,1,0,2,1,1,1,1,1,0,2,3,1,0,0,1,1,3,0,2,2,0,0,2,2,1,0,1,2,1,1,0,1,1,1,1,0,0,0,2,4,1,1,1,2,0,1,1,0,1,1,2,1,4,1,0,1,1,1,1,0,0,0,1,1,3,0,1,1,2,2,2,1,0,4,1,0,1,2,0,1,0,0,2,0,2,2,2,1,0,0,1,3,3,2,0,0,2,1,3,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,0,2,2,0,3,0,1,0,1,0,2,2,3,1,2,0,2,0,0,0,1,0,0,0,6,0,0,2,3,3,2,2,0,0,0,0,1,1,1,0,2,0,3,0,1,0,3,0,0,1,1,2,1,0,1,1,2,1,1,0,0,3,1,1,0,1,0,0,1,0,1,4,1,0,1,1,0,2,0,0,2,1,1,0,4,0,1,0,3,2,1,2,1,1,1,0,1,1,2,0,1,2,0,0,0,1,0,1,0,1,0,0,0,1,1,3,0,2,0,1,0,1,4,1,1,1,1,1,3,0,0,3,1,1,0,1,0,0,0,1,1,0,1,3,2,3,2,2,1,0,1,2,0,2,1,2,0,0,1,1,2,2,1,1,0,0,2,1,0,1,0,1,1,1,1,3,1,1,0,1,3,1,0,0,0,0,1,1,0,0,0,1,0,1,0,2,1,2,0,2,1,1,2,1,0,2,0,0,0,1,1,1,4,1,0,1,2,0,0,1,0,1,0,1,1,0,2,1,2,2,0,2,1,0,1,2,0,1,1,0,0,2,1,1,0,0,0,0,1,1,1,1,1,0,0,2,3,0,2,0,0,1,1,0,0,2,2,1,0,0,0,2,3,1,1,1,0,0,3,2,0,0,2,0,1,2,2,3,0,2,2,0,2,1,3,2,2,1,0,0,2,2,0,1,0,1,0,1,0,1,0,0,1,0,3,1,0,1,1,0,1,2,1,1,1,0,0,0,0,2,0,1,1,3,2,0,0,1,0,0,0,1,0,3,0,2,1,0,0,3,0,0,0,2,0,0,1,0,1,1,0,2,0,0,1,1,1,2,2,0,1,0,1,0,0,0,0,1,1,1,1,2,0,1,1,2,0,2,4,3,1,0,2,0,0,0,2,1,1,0,0,0,0,2,0,3,1,1,2,1,1,0,1,3,0,1,0,2,0,4,1,0,2,1,1,3,0,3,1,2,0,2,0,1,0]},{"counters":[1,1,0,0,0,3,1,1,0,0,0,1,0,1,1,1,1,0,0,2,3,1,1,1,0,3,0,0,0,0,0,4,1,3,1,1,2,0,0,1,0,0,1,1,3,0,1,0,1,1,1,2,1,1,1,1,0,0,0,0,0,0,1,1,2,3,1,1,1,0,1,2,2,1,1,2,1,0,0,0,0,1,1,2,0,0,1,0,0,1,1,0,1,1,0,2,1,0,0,1,1,0,2,3,1,0,1,1,2,0,0,1,2,3,0,2,0,1,1,1,1,2,1,1,1,0,1,0,0,1,1,1,2,0,1,0,1,2,2,0,1,0,0,3,1,1,1,2,1,2,0,1,0,1,1,0,1,1,1,2,1,0,1,1,1,1,1,1,0,3,0,1,0,1,1,1,2,0,2,0,1,1,1,4,2,1,0,1,0,0,0,1,3,0,1,2,1,0,2,0,0,2,0,0,1,2,2,2,0,0,2,0,2,0,1,1,2,1,2,1,2,0,0,1,3,0,2,2,0,0,4,2,1,0,0,0,0,3,0,0,0,0,1,1,1,0,1,2,1,0,2,3,2,0,0,2,1,1,2,0,1,0,1,2,2,2,1,1,0,1,1,0,3,1,2,2,2,2,0,1,0,2,2,1,0,0,2,0,1,1,1,3,1,2,3,3,0,0,0,0,2,0,0,2,2,1,1,2,0,1,4,0,2,1,1,1,0,2,0,1,2,0,0,2,0,2,0,2,0,1,0,2,4,2,0,1,1,0,0,0,3,0,1,1,0,0,1,1,1,0,2,3,2,1,1,0,0,1,2,1,0,1,1,0,2,1,1,1,1,0,1,0,3,1,1,2,0,1,0,1,1,0,2,0,1,1,0,1,3,2,1,0,1,1,1,0,0,0,2,1,0,1,0,1,1,1,4,1,1,0,2,2,0,1,1,3,0,1,1,0,0,0,0,1,1,2,0,1,1,3,1,2,0,1,1,4,1,0,2,0,2,1,0,3,2,1,1,4,1,3,1,2,2,1,1,1,3,0,2,2,1,2,0,0,0,1,2,0,0,0,3,3,0,0,0,0,1,1,1,0,2,1,2,1,0,0,2,0,1,0,2,0,2,1,1,1,1,0,1,0,0,0,1,0,1,0,1,1,1,1,0,1,3,1,1,1,0,0,1,0,2,1,2,1,3,1,1,2,0,3,0,0,0,1,1,1,0,2,2,0,3,0,1,1,3,2,0,0,3,1,0,1,0,1,1,2,0,0,1,2,3,1,0,1,1,1,1,0,0,1,1,1,0,0,2,2,2,0,1,2,0,0,2,1,0,0,0,1,3,0,3,0,2,2,0,1,1,0,0,0,2,1,0,3,1,0,1,1,2,0,1,1,0,0,0,0,2,1,2,1,2,2,0,0,3,1,1,1,0,2,4,0,1,2,1,1,1,2,0,1,2,2,1,1,1,2,2,0,0,0,0,2,1,0,0,0,1,1,0,0,4,1,2,1,1,1,0,0,1,1,1,0,2,1,0,0,2,1,1,1,1,0,2,3,1,0,1,0,2,0,2,1,2,1,1,1,0,2,2,1,3,3,0,0,1,1,0,0,1,1,1,1,0,0,0,1,0,3,0,1,1,1,0,1,3,0,0,0,4,1,1,3,2,0,0,2,1,3,1,0,0,1,0,1,1,0,2,0,0,0,1,0,2,0,1,2,0,0,1,0,0,0,0,3,1,1,0,1,0,1,0,0,1,0,0,0,2,0,0,2,0,1,1,1,1,0,1,0,1,1,1,0,0,3,1,0,1,3,4,2,1,0,1,0,1,1,1,0,0,1,0,0,0,2,0,2,0,3,1,1,0,2,1,1,1,0,0,2,0,1,1,2,2,1,1,0,0,1,0,0,6,0,2,1,1,0,1,1,1,2,2,0,0,1,0,2,2,2,2,1,1,0,0,2,3,0,1,0,4,1,0,3,0,1,2,0,0,3,2,1,2,0,1,0,0,0,0,0,0,4,0,2,1,0,1,1,2,1,0,0,0,1,1,0,1,0,1,1,1,1,1,0,0,1,0,1,0,2,0,0,0,1,0,1,2,0,1,2,0,0,0,0,0,1,1,1,0,3,0,0,0,0,0,1,0,2,0,0,2,0,0,1,2,0,0,0,1,1,1,3,3,0,1,1,1,1,1,2,3,3,1,0,0,1,2,1,0,1,2,0,0,2,0,1,0,1,3,1,0,2,1,1,2,0,1,0,0,2,0,2,1,1,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0,2,1,0,1,1,1,0,0,2,2,2,0,0,1,2,1,1,0,2,0,0,1,1,1,1,1,1,3,2,1,1,0,0,1,1,0,3,2,1,1,3,0,0,2,1,1,2,0,0,0,4,1,2,1,2,0,1,0,0,1,1,0,1,0,3,2,0,1,1,1,0,0,1,2,2,0,2,1,1,0,0,1,0,0,1,2,1,4,1,0,3,3,0,1,3,0,2,1,1,0,1,1,0,1,1,0,2,0,1,0,0,1,0,3,1,0,0,1,1,2,0,0,5,2,1,1,0,1,0,2,0,2,0,0,0,1,1,2,0,2,2,0,1,0,1,2,1,1,0,1,3,1,2,0,1,2,0,2,0,1,1,1,0,0,1,2,2,0,1,1,0,2,1,1,2,0,0,2,1,2,2,0,1,0,1,1,3,0,0,2,1,2,3,1,2,0,1,2,0,2,0,1,0,1,1,0,3,2,0,1,1,1,0,1,1,1,3,2,1,2,0,3,0,1,0,1,0,0,0,1,1,0,1,0,1,0,1,1,1,3,3,1,2,0,1,0,0,0,1,1,1,0,0,2,2,0,0,3,0,1,1,0,1,2,3,2,1,0,0,1,1,1,1,2,1,2,1,2,1,1,1,1,2,0,1,1,0,0,2,1,1,1,2,1,2,1,0,2,2,2,0,1,1,0,3,2,0,1,1,2,1,0,1,0,0,1,1,1,1,0,2,2,4,0,2,3,1,0,0,2,1,0,4,2,1,2,0,2,1,0,1,1,0,2,1,1,0,2,1,0,0,0,4,3,1,0,0,1,1,2,1,1,1,2,1,3,0,2,0,0,0,0,3,0,1,1,1,1,2,1,1,1,0,1,2,1,1,0,0,1,3,0,1,0,2,1,1,1,3,2,0,0,3,1,1,0,2,1,3,0,3,0,1,1,3,0,0,0,3,0,2,2,1,2,1,0,0,2,1,0,3,2,2,0,1,0,0,3,0,0,1,0,0,2,0,0,1,0,0,3,0,0,1,1,0,0,0,1,0,0,1,0,3,1,1,3,1,1,0,1,1,0,1,0,2,0,1,0,1,1,2,0,1,1,1,1,2,0,0,1,1,0,0,4,1,0,0,2,1,2,1,0,1,0,0,0,1,0,1,0,2,0,0,0,1,2,0,1,0,2,0,0,1,0,1,1,2,1,1,1,2,2,1,2,0,1,0,3,1,0,1,0,0,1,1,1,3,1,0,0,0,2,2,2,2,1,1,1,4,0,1,3,3,2,1,0,1,0,2,1,1,1,1,0,1,0,0,1,1,1,0,1,2,1,1,1,2,1,0,2,2,0,1,1,1,1,1,2,0,1,1,1,1,0,2,3,0,0,1,1,1,1,6,0,0,1,2,2,4,1,1,0,0,2,0,1,1,1,0,0,1,0,0,1,1,1,3,2,1,1,2,1,0,2,2,1,0,2,0,1,3,1,1,2,1,1,2,1,1,2,0,2,2,1,0,1,0,1,2,0,0,2,0,0,1,0,0,1,0,2,0,0,1,0,0,0,1,0,2,0,1,1,2,1,0,0,1,0,0,0,1,1,1,2,0,1,0,1,1,0,0,0,0,3,2,0,1,1,0,0,0,1,1,0,0,1,1,0,1,1,1,1,2,2,2,1,0,2,2,1,1,0,0,0,0,1,1,0,2,3,2,1,0,2,3,1,1,0,2,0,2,1,1,1,1,4,0,1,0,1,2,2,0,0,1,2,1,2,2,4,0,0,4,0,0,0,0,1,0,1,2,3,1,2,2,1,1,2,1,3,3,2,0,0,1,2,4,1,1,1,0,2,2,1,1,1,0,0,0,3,1,1,5,1,0,0,1,1,3,1,1,1,1,0,0,0,0,0,3,1,1,2,2,0,2,1,3,1,2,2,0,1,2,0,2,1,2,1,1,1,1,1,0,0,0,1,2,1,1,1,0,0,2,1,0,1,0,0,1,2,2,2,1,1,1,1,2,0,0,2,2,0,1,0,0,1,1,2,2,1,0,2,3,0,0,0,3,0,0,1,1,1,2,0,0,0,0,1,0,1,0,1,1,1,1,1,1,2,2,1,0,0,2,0,0,0,0,1,0,0,1,2,0,0,0,0,0,0,0,1,0,0,0,2,2,0,0,1,1,0,2,3,1,1,1,2,1,0,0,0,2,0,1,0,0,1,0,0,1,1,2,0,1,2,1,1,1,2,3,0,2,0,2,2,2,1,0,2,0,0,1,0,1,1,0,0,1,0,1,0,1,2,0,1,1,2,1,1,0,0,0,0,0,1,3,1,3,3,0,0,0]},{"counters":[0,3,2,0,2,1,0,0,1,1,0,1,1,2,1,1,0,0,1,0,2,0,0,1,0,0,0,0,1,1,0,0,1,2,2,0,1,1,3,0,2,1,0,1,0,1,2,1,1,1,0,3,2,0,0,1,0,0,0,0,1,1,3,1,3,2,1,3,1,2,1,1,2,1,1,1,0,0,1,0,2,2,0,1,2,1,0,0,3,0,3,3,1,0,0,2,2,4,0,1,1,0,3,1,1,0,1,2,3,2,1,0,0,1,2,2,0,0,2,5,0,0,2,2,2,0,0,2,1,0,3,2,1,2,1,0,0,0,0,0,1,1,0,1,0,0,4,0,2,1,1,0,2,1,3,5,2,2,1,0,0,0,2,2,0,2,1,1,1,1,1,0,2,1,0,1,0,0,1,2,3,1,0,0,1,0,1,0,1,0,3,2,2,4,1,1,0,0,1,2,1,2,2,2,0,0,0,0,0,1,1,2,4,1,2,2,2,2,0,0,2,0,0,2,0,0,1,1,0,0,0,1,0,1,1,1,0,1,1,1,2,0,1,1,5,1,0,1,0,1,0,2,1,2,1,1,2,1,3,2,0,1,1,2,1,1,1,1,3,0,0,0,0,0,0,1,1,4,1,1,2,0,0,2,1,0,0,0,0,0,0,1,0,2,1,2,0,0,1,0,0,0,1,1,1,1,0,0,3,0,0,0,1,2,2,0,0,2,1,0,1,0,2,1,0,1,0,2,3,1,0,1,3,1,2,1,0,0,1,0,1,0,0,2,2,2,2,0,0,2,1,1,2,1,3,0,0,0,0,1,2,0,0,0,1,2,0,3,1,0,0,1,1,3,2,0,1,3,2,0,0,1,2,0,1,1,0,1,2,4,0,4,2,1,1,1,0,1,1,2,1,1,3,1,2,2,0,0,3,0,1,1,0,2,1,1,0,1,1,0,0,1,0,2,1,0,0,0,1,3,1,0,0,0,1,1,2,0,0,2,1,0,1,1,1,0,0,3,1,0,2,2,2,2,2,1,1,1,5,0,0,1,1,1,0,0,0,1,0,0,1,0,1,1,2,1,1,0,2,0,1,0,1,0,0,1,2,0,0,0,1,0,1,0,0,1,2,0,1,0,2,1,0,0,0,3,0,2,1,0,1,0,3,2,1,1,2,0,4,0,0,2,1,2,0,0,0,2,0,1,1,0,1,1,0,0,0,0,1,1,1,3,2,1,1,1,0,1,3,2,2,2,0,1,2,0,1,0,3,1,0,0,1,1,1,4,1,1,2,1,2,0,2,2,0,3,0,1,0,3,3,2,0,2,1,1,2,2,3,0,0,1,3,0,0,1,0,1,0,0,0,0,0,2,0,1,1,0,2,1,2,0,1,3,2,0,0,1,1,1,0,0,3,1,0,2,2,1,1,1,2,1,0,1,1,0,3,2,3,1,3,0,1,2,0,0,2,0,2,0,1,1,0,5,2,0,0,1,2,2,0,1,0,0,0,2,0,0,1,1,1,1,1,1,1,3,0,1,2,0,2,0,1,1,0,1,1,0,1,2,0,1,0,1,2,0,0,1,0,0,1,1,1,0,1,0,2,0,1,1,0,0,0,0,2,1,2,2,1,0,0,2,3,0,1,0,4,0,2,1,2,1,2,1,2,2,1,0,0,2,1,6,1,1,0,1,0,1,0,0,1,1,0,2,0,1,1,0,0,0,0,1,2,2,1,0,1,1,1,1,0,0,2,1,1,2,0,0,0,1,1,2,1,2,0,0,0,2,2,2,0,1,0,1,2,0,2,2,0,1,0,0,1,1,1,1,0,2,1,3,1,1,0,0,1,0,5,0,0,1,3,0,0,0,2,0,1,0,1,0,0,1,0,0,1,0,2,1,1,3,1,0,2,0,0,1,2,1,0,0,0,2,0,0,0,0,1,2,0,1,0,0,2,3,0,0,1,4,0,4,1,0,2,2,0,4,0,1,0,0,0,0,1,1,1,0,4,0,0,1,0,1,1,1,2,2,1,2,1,1,4,1,0,2,0,2,1,2,0,1,1,3,0,2,1,0,0,3,1,1,0,2,0,1,3,3,1,2,3,1,0,0,2,0,2,0,0,2,0,0,1,2,1,2,1,0,1,1,1,2,0,2,2,0,1,0,2,0,0,0,2,1,1,1,0,1,1,3,0,0,0,1,2,0,1,0,1,2,2,4,1,1,2,0,2,1,1,1,1,0,4,0,1,1,1,1,2,2,0,2,0,2,3,1,0,0,0,1,0,1,0,1,1,0,2,1,0,1,0,0,0,1,0,0,1,1,2,1,1,1,1,0,2,1,2,1,2,0,1,1,0,1,0,0,1,0,0,0,1,3,0,3,1,1,1,0,1,0,0,1,1,1,1,2,0,0,1,2,0,2,2,0,1,0,0,2,0,0,0,0,0,1,0,0,0,1,1,1,1,1,0,0,1,0,0,0,5,0,0,1,0,2,1,2,1,1,2,1,1,3,1,2,0,0,1,0,0,0,1,1,4,2,0,3,2,0,0,0,0,1,2,1,0,2,0,2,0,0,0,0,3,0,2,2,1,0,1,1,0,1,2,2,1,0,3,0,0,1,1,0,2,0,2,1,0,4,3,0,1,2,0,1,1,0,2,2,2,0,0,1,3,0,1,1,2,1,2,3,1,1,2,1,4,0,1,1,0,0,1,1,0,1,2,1,1,1,1,0,0,1,2,1,2,0,2,0,0,1,1,0,1,1,1,2,1,2,0,1,2,1,0,0,0,0,2,2,1,0,2,2,2,0,0,3,0,0,3,2,1,2,1,3,2,1,1,0,0,0,1,2,3,3,0,2,0,1,1,0,0,3,1,1,0,0,1,0,0,0,5,1,0,1,0,0,1,0,3,0,2,0,0,0,0,1,3,0,1,1,0,2,2,0,1,1,2,2,1,0,1,0,0,1,1,0,1,0,1,1,0,2,1,1,0,3,0,1,1,2,0,1,1,1,2,1,1,2,1,1,1,0,1,1,1,1,2,0,1,1,1,1,1,0,2,1,1,2,1,0,0,0,0,1,2,0,1,0,2,2,2,0,2,1,0,0,1,2,1,0,1,2,0,2,0,0,0,1,0,0,0,1,0,0,2,1,2,1,0,1,2,1,1,1,3,1,2,0,1,0,2,1,2,1,0,0,0,0,0,0,2,1,1,2,0,0,0,1,1,1,0,0,1,4,0,1,2,2,1,1,1,1,3,0,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,0,1,0,0,3,0,2,1,1,1,2,3,0,1,1,1,1,1,1,2,2,0,1,1,0,1,2,0,2,1,2,0,1,0,0,0,1,2,2,1,0,1,0,0,1,1,2,1,3,1,0,1,1,0,2,1,1,0,1,0,0,0,2,0,3,1,2,0,3,0,0,1,0,0,1,1,3,1,0,2,0,2,2,1,1,0,0,0,1,0,3,0,1,1,1,1,1,0,0,0,1,2,0,1,0,3,2,0,2,2,0,1,3,0,1,3,0,1,2,0,2,3,0,2,1,0,0,0,0,1,1,2,4,0,1,2,2,0,1,0,0,3,0,1,0,1,0,0,0,0,1,1,1,1,0,0,2,0,1,2,1,1,1,1,0,0,0,1,0,1,0,0,0,1,0,1,1,3,0,2,2,0,4,0,1,2,1,1,1,1,1,4,1,0,1,1,1,0,0,0,0,0,1,4,2,0,0,0,0,2,3,0,1,0,2,0,1,1,0,1,3,0,1,0,1,2,1,1,0,0,1,1,2,2,0,1,0,0,1,0,3,1,1,0,0,1,1,2,1,0,2,0,0,1,0,1,1,2,0,3,1,1,1,1,1,1,0,2,1,0,2,1,1,1,2,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,2,1,0,2,1,1,0,0,1,2,3,2,4,0,4,0,0,0,1,3,1,0,2,1,0,1,0,2,0,1,0,2,1,2,1,2,2,1,2,1,2,0,1,1,1,2,0,3,0,0,1,1,1,1,2,1,1,1,1,0,2,1,1,1,0,2,2,1,0,1,1,1,2,1,0,2,0,3,1,0,0,0,0,1,0,0,2,2,1,0,0,2,0,1,2,1,1,0,0,1,1,3,2,2,1,4,0,1,1,0,0,0,1,3,1,1,3,0,1,1,1,0,1,1,1,4,2,2,1,2,1,0,2,1,1,0,0,0,2,3,0,0,1,1,1,0,1,1,1,0,1,0,1,2,0,1,0,2,1,0,0,3,2,1,1,2,2,0,2,2,1,3,1,1,0,1,4,0,0,1,1,0,0,0,1,0,0,0,1,2,0,2,0,3,2,0,1,0,0,2,0,1,0,3,1,2,1,2,2,2,1,2,1,0,2,1,2,0,0,0,1,1,1,1,2,0,0,1,2,0,4,3,1,1,3,0,1,1,0,1,2,1,2,0,1,0,0,2,1,0,0,2,1,3,0,3,0,1,2,1,1,0,2,0,0,0,0,0,0,1,2,2,0,0,2,1,0,1,1,2,2,0,0,1,0,0,1,0,1,1,1,1,0,1,1,1]}]},"null_count":0,"last_update_version":397952041530949632},"ps":{"histogram":{"ndv":3,"buckets":[{"count":657,"lower_bound":"A4AAAAAAAAAA","upper_bound":"A4AAAAAAAAAA","repeats":657},{"count":1373,"lower_bound":"A4AAAAAAAAAB","upper_bound":"A4AAAAAAAAAB","repeats":716},{"count":2000,"lower_bound":"A4AAAAAAAAAC","upper_bound":"A4AAAAAAAAAC","repeats":627}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,716,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,627,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952041728606208},"ppt":{"histogram":{"ndv":1966,"buckets":[{"count":8,"lower_bound":"A4AAAABYG17C","upper_bound":"A4AAAABYG2EE","repeats":1},{"count":16,"lower_bound":"A4AAAABYG2EU","upper_bound":"A4AAAABYG2LW","repeats":1},{"count":24,"lower_bound":"A4AAAABYG2L/","upper_bound":"A4AAAABYG2Ux","repeats":1},{"count":32,"lower_bound":"A4AAAABYG2U4","upper_bound":"A4AAAABYG2Zw","repeats":1},{"count":40,"lower_bound":"A4AAAABYG2aY","upper_bound":"A4AAAABYG2dl","repeats":1},{"count":49,"lower_bound":"A4AAAABYG2en","upper_bound":"A4AAAABYG2lE","repeats":1},{"count":57,"lower_bound":"A4AAAABYG2oM","upper_bound":"A4AAAABYG2sF","repeats":1},{"count":65,"lower_bound":"A4AAAABYG2sJ","upper_bound":"A4AAAABYG20A","repeats":1},{"count":73,"lower_bound":"A4AAAABYG20b","upper_bound":"A4AAAABYG26c","repeats":1},{"count":81,"lower_bound":"A4AAAABYG27I","upper_bound":"A4AAAABYG3A/","repeats":1},{"count":90,"lower_bound":"A4AAAABYG3Bc","upper_bound":"A4AAAABYG3GO","repeats":1},{"count":98,"lower_bound":"A4AAAABYG3G4","upper_bound":"A4AAAABYG3Ly","repeats":1},{"count":106,"lower_bound":"A4AAAABYG3M4","upper_bound":"A4AAAABYG3So","repeats":1},{"count":114,"lower_bound":"A4AAAABYG3WC","upper_bound":"A4AAAABYG3ZB","repeats":1},{"count":122,"lower_bound":"A4AAAABYG3Zc","upper_bound":"A4AAAABYG3cH","repeats":1},{"count":130,"lower_bound":"A4AAAABYG3cI","upper_bound":"A4AAAABYG3hc","repeats":1},{"count":138,"lower_bound":"A4AAAABYG3ib","upper_bound":"A4AAAABYG3l9","repeats":1},{"count":146,"lower_bound":"A4AAAABYG3l/","upper_bound":"A4AAAABYG3py","repeats":1},{"count":154,"lower_bound":"A4AAAABYG3qT","upper_bound":"A4AAAABYG3uy","repeats":1},{"count":163,"lower_bound":"A4AAAABYG3u4","upper_bound":"A4AAAABYG3zC","repeats":1},{"count":171,"lower_bound":"A4AAAABYG30V","upper_bound":"A4AAAABYG36l","repeats":1},{"count":179,"lower_bound":"A4AAAABYG38D","upper_bound":"A4AAAABYG3+Z","repeats":1},{"count":187,"lower_bound":"A4AAAABYG3+s","upper_bound":"A4AAAABYG4Be","repeats":1},{"count":195,"lower_bound":"A4AAAABYG4B8","upper_bound":"A4AAAABYG4Fu","repeats":1},{"count":203,"lower_bound":"A4AAAABYG4Hk","upper_bound":"A4AAAABYG4Kz","repeats":1},{"count":211,"lower_bound":"A4AAAABYG4Lq","upper_bound":"A4AAAABYG4RB","repeats":1},{"count":220,"lower_bound":"A4AAAABYG4R5","upper_bound":"A4AAAABYG4YF","repeats":1},{"count":228,"lower_bound":"A4AAAABYG4YY","upper_bound":"A4AAAABYG4au","repeats":1},{"count":236,"lower_bound":"A4AAAABYG4az","upper_bound":"A4AAAABYG4e2","repeats":1},{"count":245,"lower_bound":"A4AAAABYG4fs","upper_bound":"A4AAAABYG4lY","repeats":1},{"count":253,"lower_bound":"A4AAAABYG4mh","upper_bound":"A4AAAABYG4pL","repeats":1},{"count":261,"lower_bound":"A4AAAABYG4p+","upper_bound":"A4AAAABYG4sY","repeats":1},{"count":270,"lower_bound":"A4AAAABYG4tj","upper_bound":"A4AAAABYG4xo","repeats":2},{"count":278,"lower_bound":"A4AAAABYG4x+","upper_bound":"A4AAAABYG41w","repeats":1},{"count":286,"lower_bound":"A4AAAABYG42Y","upper_bound":"A4AAAABYG47h","repeats":1},{"count":294,"lower_bound":"A4AAAABYG470","upper_bound":"A4AAAABYG4/0","repeats":1},{"count":302,"lower_bound":"A4AAAABYG4/1","upper_bound":"A4AAAABYG5GD","repeats":1},{"count":310,"lower_bound":"A4AAAABYG5GJ","upper_bound":"A4AAAABYG5LN","repeats":1},{"count":318,"lower_bound":"A4AAAABYG5LP","upper_bound":"A4AAAABYG5RI","repeats":1},{"count":326,"lower_bound":"A4AAAABYG5Rp","upper_bound":"A4AAAABYG5Vj","repeats":1},{"count":334,"lower_bound":"A4AAAABYG5Vu","upper_bound":"A4AAAABYG5Y0","repeats":1},{"count":342,"lower_bound":"A4AAAABYG5ZH","upper_bound":"A4AAAABYG5fm","repeats":1},{"count":350,"lower_bound":"A4AAAABYG5ft","upper_bound":"A4AAAABYG5i6","repeats":1},{"count":358,"lower_bound":"A4AAAABYG5jD","upper_bound":"A4AAAABYG5oq","repeats":1},{"count":366,"lower_bound":"A4AAAABYG5pN","upper_bound":"A4AAAABYG5t2","repeats":1},{"count":374,"lower_bound":"A4AAAABYG5t6","upper_bound":"A4AAAABYG5yh","repeats":1},{"count":382,"lower_bound":"A4AAAABYG5y7","upper_bound":"A4AAAABYG51+","repeats":1},{"count":390,"lower_bound":"A4AAAABYG52C","upper_bound":"A4AAAABYG55P","repeats":1},{"count":398,"lower_bound":"A4AAAABYG56S","upper_bound":"A4AAAABYG59R","repeats":1},{"count":406,"lower_bound":"A4AAAABYG5+E","upper_bound":"A4AAAABYG6BN","repeats":1},{"count":414,"lower_bound":"A4AAAABYG6Cb","upper_bound":"A4AAAABYG6JZ","repeats":1},{"count":422,"lower_bound":"A4AAAABYG6Jx","upper_bound":"A4AAAABYG6Po","repeats":1},{"count":430,"lower_bound":"A4AAAABYG6Qa","upper_bound":"A4AAAABYG6T9","repeats":1},{"count":438,"lower_bound":"A4AAAABYG6UC","upper_bound":"A4AAAABYG6Ym","repeats":1},{"count":447,"lower_bound":"A4AAAABYG6ZM","upper_bound":"A4AAAABYG6cl","repeats":1},{"count":455,"lower_bound":"A4AAAABYG6de","upper_bound":"A4AAAABYG6f+","repeats":1},{"count":463,"lower_bound":"A4AAAABYG6ha","upper_bound":"A4AAAABYG6lp","repeats":1},{"count":471,"lower_bound":"A4AAAABYG6mA","upper_bound":"A4AAAABYG6rm","repeats":1},{"count":479,"lower_bound":"A4AAAABYG6sE","upper_bound":"A4AAAABYG6wj","repeats":1},{"count":488,"lower_bound":"A4AAAABYG6xE","upper_bound":"A4AAAABYG604","repeats":2},{"count":496,"lower_bound":"A4AAAABYG61M","upper_bound":"A4AAAABYG65l","repeats":1},{"count":504,"lower_bound":"A4AAAABYG67u","upper_bound":"A4AAAABYG7C8","repeats":1},{"count":512,"lower_bound":"A4AAAABYG7DI","upper_bound":"A4AAAABYG7F4","repeats":1},{"count":520,"lower_bound":"A4AAAABYG7GE","upper_bound":"A4AAAABYG7Mb","repeats":1},{"count":529,"lower_bound":"A4AAAABYG7NT","upper_bound":"A4AAAABYG7PF","repeats":1},{"count":537,"lower_bound":"A4AAAABYG7Ps","upper_bound":"A4AAAABYG7Ur","repeats":1},{"count":545,"lower_bound":"A4AAAABYG7Uz","upper_bound":"A4AAAABYG7bH","repeats":1},{"count":553,"lower_bound":"A4AAAABYG7dK","upper_bound":"A4AAAABYG7jF","repeats":1},{"count":561,"lower_bound":"A4AAAABYG7kc","upper_bound":"A4AAAABYG7mt","repeats":1},{"count":569,"lower_bound":"A4AAAABYG7ni","upper_bound":"A4AAAABYG7rz","repeats":1},{"count":577,"lower_bound":"A4AAAABYG7sE","upper_bound":"A4AAAABYG7vS","repeats":1},{"count":585,"lower_bound":"A4AAAABYG7xX","upper_bound":"A4AAAABYG73r","repeats":1},{"count":593,"lower_bound":"A4AAAABYG74J","upper_bound":"A4AAAABYG767","repeats":1},{"count":601,"lower_bound":"A4AAAABYG77Q","upper_bound":"A4AAAABYG8AG","repeats":1},{"count":609,"lower_bound":"A4AAAABYG8BD","upper_bound":"A4AAAABYG8F/","repeats":1},{"count":617,"lower_bound":"A4AAAABYG8Gc","upper_bound":"A4AAAABYG8KR","repeats":1},{"count":625,"lower_bound":"A4AAAABYG8Ko","upper_bound":"A4AAAABYG8Rp","repeats":1},{"count":633,"lower_bound":"A4AAAABYG8Rx","upper_bound":"A4AAAABYG8WT","repeats":1},{"count":641,"lower_bound":"A4AAAABYG8Wg","upper_bound":"A4AAAABYG8Yy","repeats":1},{"count":649,"lower_bound":"A4AAAABYG8aZ","upper_bound":"A4AAAABYG8ds","repeats":1},{"count":657,"lower_bound":"A4AAAABYG8ee","upper_bound":"A4AAAABYG8jX","repeats":1},{"count":665,"lower_bound":"A4AAAABYG8ju","upper_bound":"A4AAAABYG8pM","repeats":1},{"count":673,"lower_bound":"A4AAAABYG8pv","upper_bound":"A4AAAABYG8u4","repeats":1},{"count":681,"lower_bound":"A4AAAABYG8vl","upper_bound":"A4AAAABYG80X","repeats":1},{"count":689,"lower_bound":"A4AAAABYG80a","upper_bound":"A4AAAABYG83D","repeats":1},{"count":697,"lower_bound":"A4AAAABYG84q","upper_bound":"A4AAAABYG870","repeats":1},{"count":705,"lower_bound":"A4AAAABYG89A","upper_bound":"A4AAAABYG9BS","repeats":1},{"count":713,"lower_bound":"A4AAAABYG9DQ","upper_bound":"A4AAAABYG9Iu","repeats":1},{"count":721,"lower_bound":"A4AAAABYG9J0","upper_bound":"A4AAAABYG9Pi","repeats":1},{"count":729,"lower_bound":"A4AAAABYG9QN","upper_bound":"A4AAAABYG9TM","repeats":1},{"count":737,"lower_bound":"A4AAAABYG9TV","upper_bound":"A4AAAABYG9Zp","repeats":1},{"count":745,"lower_bound":"A4AAAABYG9aK","upper_bound":"A4AAAABYG9d6","repeats":1},{"count":753,"lower_bound":"A4AAAABYG9em","upper_bound":"A4AAAABYG9jO","repeats":1},{"count":761,"lower_bound":"A4AAAABYG9ju","upper_bound":"A4AAAABYG9og","repeats":1},{"count":769,"lower_bound":"A4AAAABYG9pr","upper_bound":"A4AAAABYG9tK","repeats":1},{"count":777,"lower_bound":"A4AAAABYG9tT","upper_bound":"A4AAAABYG9yx","repeats":1},{"count":785,"lower_bound":"A4AAAABYG90R","upper_bound":"A4AAAABYG96s","repeats":1},{"count":793,"lower_bound":"A4AAAABYG97D","upper_bound":"A4AAAABYG+Av","repeats":1},{"count":801,"lower_bound":"A4AAAABYG+Bz","upper_bound":"A4AAAABYG+E+","repeats":1},{"count":809,"lower_bound":"A4AAAABYG+Fz","upper_bound":"A4AAAABYG+Jl","repeats":1},{"count":817,"lower_bound":"A4AAAABYG+Ld","upper_bound":"A4AAAABYG+SK","repeats":1},{"count":825,"lower_bound":"A4AAAABYG+TT","upper_bound":"A4AAAABYG+Z5","repeats":1},{"count":833,"lower_bound":"A4AAAABYG+Z/","upper_bound":"A4AAAABYG+en","repeats":1},{"count":841,"lower_bound":"A4AAAABYG+ep","upper_bound":"A4AAAABYG+kG","repeats":1},{"count":849,"lower_bound":"A4AAAABYG+kO","upper_bound":"A4AAAABYG+oC","repeats":1},{"count":857,"lower_bound":"A4AAAABYG+oG","upper_bound":"A4AAAABYG+vF","repeats":1},{"count":865,"lower_bound":"A4AAAABYG+vp","upper_bound":"A4AAAABYG+yN","repeats":1},{"count":873,"lower_bound":"A4AAAABYG+z4","upper_bound":"A4AAAABYG+4T","repeats":1},{"count":881,"lower_bound":"A4AAAABYG+6H","upper_bound":"A4AAAABYG+9M","repeats":1},{"count":889,"lower_bound":"A4AAAABYG+9P","upper_bound":"A4AAAABYG/Dp","repeats":1},{"count":897,"lower_bound":"A4AAAABYG/EC","upper_bound":"A4AAAABYG/HU","repeats":1},{"count":905,"lower_bound":"A4AAAABYG/Hf","upper_bound":"A4AAAABYG/Lg","repeats":1},{"count":913,"lower_bound":"A4AAAABYG/MM","upper_bound":"A4AAAABYG/RA","repeats":1},{"count":921,"lower_bound":"A4AAAABYG/RL","upper_bound":"A4AAAABYG/Ue","repeats":1},{"count":929,"lower_bound":"A4AAAABYG/U9","upper_bound":"A4AAAABYG/cS","repeats":1},{"count":937,"lower_bound":"A4AAAABYG/ct","upper_bound":"A4AAAABYG/iA","repeats":1},{"count":945,"lower_bound":"A4AAAABYG/jp","upper_bound":"A4AAAABYG/pH","repeats":1},{"count":953,"lower_bound":"A4AAAABYG/pg","upper_bound":"A4AAAABYG/uM","repeats":1},{"count":961,"lower_bound":"A4AAAABYG/ug","upper_bound":"A4AAAABYG/y3","repeats":1},{"count":969,"lower_bound":"A4AAAABYG/0T","upper_bound":"A4AAAABYG/4/","repeats":1},{"count":977,"lower_bound":"A4AAAABYG/6B","upper_bound":"A4AAAABYG/98","repeats":1},{"count":985,"lower_bound":"A4AAAABYG/+I","upper_bound":"A4AAAABYHABM","repeats":1},{"count":993,"lower_bound":"A4AAAABYHABP","upper_bound":"A4AAAABYHAEc","repeats":1},{"count":1001,"lower_bound":"A4AAAABYHAEu","upper_bound":"A4AAAABYHAIk","repeats":1},{"count":1009,"lower_bound":"A4AAAABYHAJP","upper_bound":"A4AAAABYHANC","repeats":1},{"count":1017,"lower_bound":"A4AAAABYHANd","upper_bound":"A4AAAABYHAVH","repeats":1},{"count":1025,"lower_bound":"A4AAAABYHAVv","upper_bound":"A4AAAABYHAdX","repeats":2},{"count":1033,"lower_bound":"A4AAAABYHAeM","upper_bound":"A4AAAABYHAm7","repeats":1},{"count":1041,"lower_bound":"A4AAAABYHApV","upper_bound":"A4AAAABYHAtH","repeats":1},{"count":1049,"lower_bound":"A4AAAABYHAvq","upper_bound":"A4AAAABYHA2o","repeats":1},{"count":1057,"lower_bound":"A4AAAABYHA3K","upper_bound":"A4AAAABYHA5A","repeats":1},{"count":1065,"lower_bound":"A4AAAABYHA5B","upper_bound":"A4AAAABYHA+l","repeats":1},{"count":1073,"lower_bound":"A4AAAABYHA/R","upper_bound":"A4AAAABYHBBl","repeats":1},{"count":1081,"lower_bound":"A4AAAABYHBDZ","upper_bound":"A4AAAABYHBJC","repeats":1},{"count":1089,"lower_bound":"A4AAAABYHBKI","upper_bound":"A4AAAABYHBMd","repeats":1},{"count":1097,"lower_bound":"A4AAAABYHBNj","upper_bound":"A4AAAABYHBTw","repeats":1},{"count":1105,"lower_bound":"A4AAAABYHBUY","upper_bound":"A4AAAABYHBZ0","repeats":1},{"count":1113,"lower_bound":"A4AAAABYHBZ2","upper_bound":"A4AAAABYHBdS","repeats":1},{"count":1121,"lower_bound":"A4AAAABYHBdV","upper_bound":"A4AAAABYHBmt","repeats":1},{"count":1129,"lower_bound":"A4AAAABYHBnB","upper_bound":"A4AAAABYHBtF","repeats":1},{"count":1137,"lower_bound":"A4AAAABYHBuC","upper_bound":"A4AAAABYHB0/","repeats":1},{"count":1145,"lower_bound":"A4AAAABYHB2M","upper_bound":"A4AAAABYHB6A","repeats":1},{"count":1153,"lower_bound":"A4AAAABYHB6y","upper_bound":"A4AAAABYHB+L","repeats":1},{"count":1161,"lower_bound":"A4AAAABYHB/W","upper_bound":"A4AAAABYHCHz","repeats":1},{"count":1169,"lower_bound":"A4AAAABYHCH1","upper_bound":"A4AAAABYHCKM","repeats":1},{"count":1177,"lower_bound":"A4AAAABYHCLw","upper_bound":"A4AAAABYHCTp","repeats":1},{"count":1185,"lower_bound":"A4AAAABYHCVz","upper_bound":"A4AAAABYHCaf","repeats":1},{"count":1193,"lower_bound":"A4AAAABYHCav","upper_bound":"A4AAAABYHChp","repeats":1},{"count":1201,"lower_bound":"A4AAAABYHChs","upper_bound":"A4AAAABYHClV","repeats":1},{"count":1209,"lower_bound":"A4AAAABYHClo","upper_bound":"A4AAAABYHCok","repeats":1},{"count":1217,"lower_bound":"A4AAAABYHCpD","upper_bound":"A4AAAABYHCu8","repeats":1},{"count":1225,"lower_bound":"A4AAAABYHCwB","upper_bound":"A4AAAABYHCyL","repeats":1},{"count":1233,"lower_bound":"A4AAAABYHCyX","upper_bound":"A4AAAABYHC30","repeats":1},{"count":1241,"lower_bound":"A4AAAABYHC4A","upper_bound":"A4AAAABYHC+U","repeats":1},{"count":1249,"lower_bound":"A4AAAABYHC/9","upper_bound":"A4AAAABYHDCn","repeats":1},{"count":1257,"lower_bound":"A4AAAABYHDDX","upper_bound":"A4AAAABYHDIA","repeats":1},{"count":1265,"lower_bound":"A4AAAABYHDIB","upper_bound":"A4AAAABYHDMv","repeats":1},{"count":1273,"lower_bound":"A4AAAABYHDN6","upper_bound":"A4AAAABYHDSX","repeats":1},{"count":1281,"lower_bound":"A4AAAABYHDWs","upper_bound":"A4AAAABYHDZa","repeats":1},{"count":1289,"lower_bound":"A4AAAABYHDaC","upper_bound":"A4AAAABYHDgt","repeats":1},{"count":1297,"lower_bound":"A4AAAABYHDiJ","upper_bound":"A4AAAABYHDkr","repeats":1},{"count":1305,"lower_bound":"A4AAAABYHDkt","upper_bound":"A4AAAABYHDpz","repeats":1},{"count":1313,"lower_bound":"A4AAAABYHDqS","upper_bound":"A4AAAABYHDxC","repeats":1},{"count":1321,"lower_bound":"A4AAAABYHDxk","upper_bound":"A4AAAABYHD5N","repeats":1},{"count":1329,"lower_bound":"A4AAAABYHD8e","upper_bound":"A4AAAABYHEAS","repeats":1},{"count":1337,"lower_bound":"A4AAAABYHEAZ","upper_bound":"A4AAAABYHEFG","repeats":1},{"count":1345,"lower_bound":"A4AAAABYHEFH","upper_bound":"A4AAAABYHEK4","repeats":1},{"count":1353,"lower_bound":"A4AAAABYHELN","upper_bound":"A4AAAABYHEQL","repeats":1},{"count":1361,"lower_bound":"A4AAAABYHEQc","upper_bound":"A4AAAABYHESi","repeats":1},{"count":1369,"lower_bound":"A4AAAABYHESx","upper_bound":"A4AAAABYHEVW","repeats":1},{"count":1377,"lower_bound":"A4AAAABYHEWV","upper_bound":"A4AAAABYHEZd","repeats":1},{"count":1385,"lower_bound":"A4AAAABYHEZ3","upper_bound":"A4AAAABYHEhf","repeats":1},{"count":1393,"lower_bound":"A4AAAABYHEiW","upper_bound":"A4AAAABYHEnd","repeats":1},{"count":1401,"lower_bound":"A4AAAABYHEoF","upper_bound":"A4AAAABYHEsZ","repeats":1},{"count":1409,"lower_bound":"A4AAAABYHEuK","upper_bound":"A4AAAABYHExB","repeats":1},{"count":1417,"lower_bound":"A4AAAABYHExC","upper_bound":"A4AAAABYHEyL","repeats":1},{"count":1425,"lower_bound":"A4AAAABYHEyq","upper_bound":"A4AAAABYHE5/","repeats":1},{"count":1434,"lower_bound":"A4AAAABYHE6G","upper_bound":"A4AAAABYHE8y","repeats":2},{"count":1442,"lower_bound":"A4AAAABYHE9K","upper_bound":"A4AAAABYHFHv","repeats":1},{"count":1450,"lower_bound":"A4AAAABYHFIM","upper_bound":"A4AAAABYHFMZ","repeats":1},{"count":1458,"lower_bound":"A4AAAABYHFMx","upper_bound":"A4AAAABYHFR4","repeats":1},{"count":1466,"lower_bound":"A4AAAABYHFR/","upper_bound":"A4AAAABYHFWk","repeats":1},{"count":1474,"lower_bound":"A4AAAABYHFXA","upper_bound":"A4AAAABYHFb+","repeats":1},{"count":1482,"lower_bound":"A4AAAABYHFeR","upper_bound":"A4AAAABYHFmI","repeats":1},{"count":1490,"lower_bound":"A4AAAABYHFmN","upper_bound":"A4AAAABYHFsB","repeats":1},{"count":1499,"lower_bound":"A4AAAABYHFsJ","upper_bound":"A4AAAABYHFzu","repeats":2},{"count":1507,"lower_bound":"A4AAAABYHFz0","upper_bound":"A4AAAABYHF3Z","repeats":1},{"count":1515,"lower_bound":"A4AAAABYHF5Q","upper_bound":"A4AAAABYHF8g","repeats":1},{"count":1523,"lower_bound":"A4AAAABYHF87","upper_bound":"A4AAAABYHGGv","repeats":1},{"count":1531,"lower_bound":"A4AAAABYHGG5","upper_bound":"A4AAAABYHGKd","repeats":1},{"count":1539,"lower_bound":"A4AAAABYHGL2","upper_bound":"A4AAAABYHGQZ","repeats":1},{"count":1547,"lower_bound":"A4AAAABYHGQe","upper_bound":"A4AAAABYHGVv","repeats":1},{"count":1555,"lower_bound":"A4AAAABYHGWZ","upper_bound":"A4AAAABYHGb4","repeats":1},{"count":1563,"lower_bound":"A4AAAABYHGb5","upper_bound":"A4AAAABYHGe8","repeats":1},{"count":1571,"lower_bound":"A4AAAABYHGgV","upper_bound":"A4AAAABYHGjw","repeats":1},{"count":1579,"lower_bound":"A4AAAABYHGkG","upper_bound":"A4AAAABYHGs4","repeats":1},{"count":1587,"lower_bound":"A4AAAABYHGtb","upper_bound":"A4AAAABYHGwE","repeats":1},{"count":1595,"lower_bound":"A4AAAABYHGxF","upper_bound":"A4AAAABYHGzR","repeats":1},{"count":1603,"lower_bound":"A4AAAABYHG0n","upper_bound":"A4AAAABYHG4z","repeats":1},{"count":1611,"lower_bound":"A4AAAABYHG42","upper_bound":"A4AAAABYHG7D","repeats":1},{"count":1619,"lower_bound":"A4AAAABYHG7a","upper_bound":"A4AAAABYHHDV","repeats":1},{"count":1627,"lower_bound":"A4AAAABYHHEW","upper_bound":"A4AAAABYHHLj","repeats":1},{"count":1635,"lower_bound":"A4AAAABYHHMu","upper_bound":"A4AAAABYHHPf","repeats":1},{"count":1643,"lower_bound":"A4AAAABYHHQU","upper_bound":"A4AAAABYHHUZ","repeats":1},{"count":1651,"lower_bound":"A4AAAABYHHUp","upper_bound":"A4AAAABYHHdE","repeats":1},{"count":1659,"lower_bound":"A4AAAABYHHdT","upper_bound":"A4AAAABYHHfo","repeats":1},{"count":1668,"lower_bound":"A4AAAABYHHgl","upper_bound":"A4AAAABYHHjG","repeats":2},{"count":1676,"lower_bound":"A4AAAABYHHjH","upper_bound":"A4AAAABYHHmW","repeats":1},{"count":1684,"lower_bound":"A4AAAABYHHm1","upper_bound":"A4AAAABYHHvj","repeats":1},{"count":1692,"lower_bound":"A4AAAABYHHwJ","upper_bound":"A4AAAABYHH0Y","repeats":1},{"count":1700,"lower_bound":"A4AAAABYHH0h","upper_bound":"A4AAAABYHH51","repeats":1},{"count":1708,"lower_bound":"A4AAAABYHH6C","upper_bound":"A4AAAABYHH9L","repeats":1},{"count":1716,"lower_bound":"A4AAAABYHH9R","upper_bound":"A4AAAABYHIBy","repeats":1},{"count":1724,"lower_bound":"A4AAAABYHIB6","upper_bound":"A4AAAABYHIGa","repeats":1},{"count":1732,"lower_bound":"A4AAAABYHIGz","upper_bound":"A4AAAABYHIKn","repeats":1},{"count":1740,"lower_bound":"A4AAAABYHILH","upper_bound":"A4AAAABYHIPy","repeats":1},{"count":1748,"lower_bound":"A4AAAABYHISM","upper_bound":"A4AAAABYHIXF","repeats":1},{"count":1756,"lower_bound":"A4AAAABYHIX1","upper_bound":"A4AAAABYHIb3","repeats":1},{"count":1764,"lower_bound":"A4AAAABYHIct","upper_bound":"A4AAAABYHIlQ","repeats":1},{"count":1772,"lower_bound":"A4AAAABYHImD","upper_bound":"A4AAAABYHIrW","repeats":1},{"count":1780,"lower_bound":"A4AAAABYHIrX","upper_bound":"A4AAAABYHIux","repeats":1},{"count":1788,"lower_bound":"A4AAAABYHIvZ","upper_bound":"A4AAAABYHI0P","repeats":1},{"count":1796,"lower_bound":"A4AAAABYHI1D","upper_bound":"A4AAAABYHI4c","repeats":1},{"count":1804,"lower_bound":"A4AAAABYHI4l","upper_bound":"A4AAAABYHI8L","repeats":1},{"count":1812,"lower_bound":"A4AAAABYHI87","upper_bound":"A4AAAABYHJBM","repeats":1},{"count":1820,"lower_bound":"A4AAAABYHJBO","upper_bound":"A4AAAABYHJFT","repeats":1},{"count":1828,"lower_bound":"A4AAAABYHJFp","upper_bound":"A4AAAABYHJKb","repeats":1},{"count":1836,"lower_bound":"A4AAAABYHJMZ","upper_bound":"A4AAAABYHJP3","repeats":1},{"count":1844,"lower_bound":"A4AAAABYHJRm","upper_bound":"A4AAAABYHJVZ","repeats":1},{"count":1852,"lower_bound":"A4AAAABYHJVu","upper_bound":"A4AAAABYHJYt","repeats":1},{"count":1860,"lower_bound":"A4AAAABYHJY2","upper_bound":"A4AAAABYHJcV","repeats":1},{"count":1868,"lower_bound":"A4AAAABYHJep","upper_bound":"A4AAAABYHJgw","repeats":1},{"count":1876,"lower_bound":"A4AAAABYHJhW","upper_bound":"A4AAAABYHJnY","repeats":1},{"count":1884,"lower_bound":"A4AAAABYHJqa","upper_bound":"A4AAAABYHJuJ","repeats":1},{"count":1892,"lower_bound":"A4AAAABYHJu6","upper_bound":"A4AAAABYHJ2R","repeats":1},{"count":1900,"lower_bound":"A4AAAABYHJ2Y","upper_bound":"A4AAAABYHJ7w","repeats":1},{"count":1908,"lower_bound":"A4AAAABYHJ9E","upper_bound":"A4AAAABYHKAH","repeats":1},{"count":1916,"lower_bound":"A4AAAABYHKAg","upper_bound":"A4AAAABYHKD/","repeats":1},{"count":1924,"lower_bound":"A4AAAABYHKFP","upper_bound":"A4AAAABYHKNR","repeats":1},{"count":1932,"lower_bound":"A4AAAABYHKNb","upper_bound":"A4AAAABYHKSx","repeats":1},{"count":1940,"lower_bound":"A4AAAABYHKUA","upper_bound":"A4AAAABYHKZw","repeats":1},{"count":1948,"lower_bound":"A4AAAABYHKaJ","upper_bound":"A4AAAABYHKhe","repeats":1},{"count":1956,"lower_bound":"A4AAAABYHKkj","upper_bound":"A4AAAABYHKpF","repeats":1},{"count":1964,"lower_bound":"A4AAAABYHKpY","upper_bound":"A4AAAABYHKt6","repeats":1},{"count":1972,"lower_bound":"A4AAAABYHKu6","upper_bound":"A4AAAABYHK19","repeats":1},{"count":1980,"lower_bound":"A4AAAABYHK27","upper_bound":"A4AAAABYHK8V","repeats":1},{"count":1988,"lower_bound":"A4AAAABYHK82","upper_bound":"A4AAAABYHLCI","repeats":1},{"count":1989,"lower_bound":"A4AAAABYHLCk","upper_bound":"A4AAAABYHLCk","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,1,1,1,3,1,1,3,4,2,3,0,3,1,0,0,4,2,1,1,0,0,1,0,3,2,2,0,1,2,1,0,0,2,2,3,1,1,3,1,1,1,0,1,0,1,3,3,0,3,2,0,1,0,2,1,2,0,2,1,0,0,2,1,2,0,1,2,0,3,2,0,2,0,0,3,2,0,0,0,3,1,2,1,1,0,0,0,0,1,1,2,1,0,4,2,0,2,0,0,1,0,2,0,0,2,1,0,1,1,3,0,0,0,1,0,2,0,1,0,1,1,1,1,0,1,1,0,1,0,1,2,2,0,0,6,2,0,2,2,3,2,0,1,2,0,3,0,0,1,0,0,0,0,2,1,0,1,3,1,2,3,2,3,1,2,1,1,0,0,4,1,2,1,0,3,1,0,2,1,3,1,2,0,0,0,0,1,1,0,3,1,0,2,2,2,0,0,0,0,1,0,0,1,2,0,1,1,2,1,0,1,1,0,1,1,2,1,0,0,3,0,1,3,2,2,1,1,2,0,3,0,0,1,0,1,1,1,1,0,0,1,1,0,2,0,0,4,2,0,0,1,1,1,3,1,0,0,1,0,1,1,0,0,2,2,0,3,0,1,3,2,1,0,1,0,1,2,1,0,1,2,3,0,1,0,0,1,0,1,0,1,0,2,0,4,1,1,2,0,0,0,0,1,1,1,0,1,1,2,2,1,2,2,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,2,3,0,1,2,0,0,0,0,1,0,0,0,2,1,0,0,1,0,0,0,0,1,2,1,1,0,1,0,0,1,0,0,1,1,1,0,0,0,0,0,1,0,1,0,0,0,3,1,4,1,1,1,0,0,2,2,1,3,1,0,1,0,0,1,0,1,0,1,2,2,1,0,2,0,1,1,1,0,0,0,1,0,0,4,1,3,1,0,3,1,2,1,1,3,0,2,2,2,0,0,0,1,1,0,2,2,1,2,0,2,2,3,0,1,0,1,1,1,1,3,0,2,0,0,0,1,0,0,0,1,1,1,0,0,2,1,1,3,2,1,1,0,1,2,2,0,0,0,0,1,1,1,0,0,1,1,2,1,0,1,3,0,3,1,3,3,1,0,0,2,0,2,2,0,0,0,0,3,2,3,1,1,1,4,1,2,0,0,1,0,0,2,0,2,0,0,1,1,3,3,0,0,1,2,2,0,0,2,1,1,0,2,2,4,1,2,1,1,0,1,1,0,0,0,3,0,1,1,2,1,1,2,0,1,1,0,1,1,1,1,0,3,2,2,4,1,0,2,0,0,1,0,1,1,2,0,2,2,1,0,0,0,0,0,0,0,3,1,1,1,0,2,0,0,0,2,0,0,0,1,0,1,0,1,1,0,0,0,1,2,2,0,2,2,1,2,1,2,4,1,2,0,3,2,1,1,0,4,0,1,3,4,0,0,2,1,2,0,1,2,1,0,0,0,0,0,0,0,0,2,1,2,3,0,1,0,4,0,0,2,0,2,0,0,1,2,2,0,2,1,0,0,0,1,1,0,1,1,1,0,2,2,0,0,1,0,1,0,0,3,1,0,2,0,1,1,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,1,1,1,0,0,2,2,1,3,1,2,1,0,0,1,2,1,0,0,0,0,0,0,0,2,1,2,1,0,1,2,4,1,0,0,3,1,1,1,0,0,2,1,0,1,1,2,2,2,1,4,1,1,2,2,2,1,3,1,1,1,0,0,2,0,0,0,1,1,0,0,2,0,1,0,1,0,0,1,1,0,1,0,0,1,0,0,0,0,4,0,0,2,0,2,2,0,2,2,1,1,4,0,1,0,2,0,2,2,1,2,0,1,2,3,1,1,3,0,2,0,1,1,2,0,1,1,1,0,3,1,1,1,0,1,0,1,0,1,3,3,2,0,2,0,2,1,0,0,0,1,1,2,1,3,0,0,1,0,1,2,0,0,1,0,2,0,0,0,0,1,2,1,0,2,0,0,2,1,3,0,1,1,0,0,2,3,2,2,2,1,0,2,0,1,0,1,1,0,1,1,1,1,3,0,0,0,1,1,0,3,1,0,1,0,0,1,0,1,1,0,2,0,1,0,1,3,0,0,0,1,0,1,0,2,0,1,1,2,2,1,5,0,1,0,0,2,0,3,3,0,2,0,0,0,1,1,1,5,1,0,1,2,0,3,0,1,2,0,0,0,1,0,0,1,0,1,2,0,1,3,0,2,1,0,1,1,3,1,0,0,1,2,0,0,2,0,2,2,2,1,2,1,2,0,1,0,1,0,1,1,2,1,1,1,0,1,0,1,0,1,0,0,0,1,0,1,1,0,0,1,0,2,0,0,2,2,0,1,0,1,1,0,0,0,1,1,1,1,1,2,0,1,1,4,0,0,2,1,2,0,0,0,0,0,1,0,0,1,1,1,1,1,1,3,1,3,2,1,0,0,0,0,0,2,3,0,2,1,0,1,1,0,2,0,1,0,2,3,3,0,1,0,1,1,2,3,2,1,0,1,3,0,1,0,0,0,0,0,0,2,1,1,0,4,2,0,2,2,0,0,0,1,0,1,1,2,2,0,1,0,1,1,1,2,1,1,2,0,1,0,0,2,1,2,1,0,1,3,0,1,1,1,0,1,0,0,3,0,1,0,1,1,1,0,1,1,0,3,0,1,1,3,1,0,1,3,1,0,0,0,0,1,0,1,2,1,2,0,4,0,3,1,2,2,0,0,0,2,2,0,0,0,0,1,1,0,0,0,1,0,3,0,2,2,0,1,1,0,1,1,4,1,4,1,1,0,0,0,0,0,2,2,3,1,4,0,3,1,0,1,1,0,0,1,0,3,1,0,0,1,1,1,4,1,1,1,1,0,0,1,0,2,3,1,0,1,0,0,1,0,0,1,1,1,2,1,1,3,1,0,2,0,0,1,2,2,3,0,0,2,2,1,1,0,1,0,0,2,2,3,4,2,0,3,1,1,0,1,1,0,2,0,0,2,0,1,2,2,2,0,0,4,0,2,2,3,0,1,1,0,2,1,0,1,3,1,2,1,0,1,0,1,0,1,2,0,0,2,0,3,0,1,3,2,2,0,4,1,1,1,1,1,3,2,4,0,1,1,0,2,2,0,1,2,0,0,0,4,0,3,0,1,1,1,1,0,0,0,0,0,0,2,1,1,1,1,2,1,0,2,0,1,1,2,0,0,0,0,0,3,2,0,0,1,2,1,0,0,1,1,1,5,0,0,0,1,1,0,1,2,0,2,0,0,1,0,2,0,1,0,1,0,0,0,0,1,0,0,1,1,1,0,0,1,0,0,2,2,0,1,0,1,1,2,1,2,1,0,2,1,3,0,2,0,0,0,0,4,2,0,0,1,1,0,0,1,0,3,1,2,2,0,1,0,3,0,2,2,1,2,0,2,1,1,2,2,0,2,0,1,1,1,0,2,0,2,0,0,2,0,2,1,0,0,3,0,0,1,0,1,1,0,1,0,1,1,0,0,3,1,2,1,0,0,1,1,1,1,1,0,0,1,3,2,0,0,1,0,3,0,2,0,3,0,2,1,2,0,2,1,1,0,1,2,0,0,1,0,1,1,1,1,0,0,0,0,0,0,0,2,1,1,0,0,0,1,0,0,2,1,2,0,0,1,1,1,0,3,2,1,2,1,1,1,0,1,2,2,4,1,1,3,2,3,0,0,0,0,1,1,0,0,2,0,0,0,1,0,0,1,0,1,3,0,3,2,1,0,1,0,1,1,1,0,0,5,1,0,3,2,3,1,2,3,2,0,0,0,0,0,0,2,5,0,0,2,2,1,1,0,0,0,2,0,0,2,1,2,0,1,1,1,0,1,0,4,1,0,1,1,0,0,0,0,1,0,2,0,1,0,2,2,0,1,1,1,1,0,0,1,1,2,1,2,2,4,1,0,1,2,3,0,3,1,2,0,0,0,3,1,1,1,1,0,1,1,1,0,1,2,2,2,1,1,3,0,0,0,0,2,2,0,0,1,1,0,1,1,0,0,1,1,2,1,0,2,1,0,1,0,1,3,1,2,2,1,3,1,2,2,0,0,0,1,0,1,1,0,0,2,0,1,1,0,1,0,0,1,1,2,0,1,1,1,3,1,1,1,1,0,0,2,0,1,1,0,4,0,2,1,0,0,2,1,3,0,0,0,1,1,1,1,3,1,1,1,1,1,0,1,0,1,0,2,0,0,1,2,0,1,0,1,0,2,1,2,1,0,1,0,3,1,0,0,0,3,0,1,1,0,1,1,1,3,1,1,2,1,0,2,0,1,0,1,0,0,2,1,1,0,1,0,1,3,1,2,0,4,1,0,1,0,1,0,0,0,1,2,0,0,2,3,1,1,2,1,0,1,1,1,3,1,0,0,1,1,3,0,1,0,2,0,1,2,2,0,0,1,1,0,2,0,0,1,0,0,1,1,0,1,1,1,0,0,1,0,0,0,0,1,0,2,0,1,1,1,1,0,0,1,1,1,2,0,0,0,0,0,0,2,1,1,0,0,2,1,0,0,0,2,0,2,0,0,0,1,0,0,0,1,2,1,0,0]},{"counters":[1,0,1,1,0,0,0,0,1,1,0,0,1,2,0,3,3,1,0,1,2,1,3,1,2,1,1,3,2,0,2,0,0,3,1,1,0,0,1,2,0,3,0,1,0,0,1,0,0,1,0,1,1,1,3,0,0,0,1,3,1,0,1,4,0,1,2,1,1,4,0,1,1,1,2,0,2,2,0,0,1,0,3,1,2,1,2,2,1,0,2,0,1,0,0,2,2,0,1,1,0,2,0,2,1,0,1,1,3,2,1,1,0,0,1,2,0,0,1,2,3,1,3,0,3,2,1,0,1,0,1,0,1,0,1,1,2,0,1,1,0,1,0,0,0,2,3,1,2,1,2,1,1,2,1,1,0,0,1,0,0,0,2,0,1,2,1,0,0,0,1,1,0,0,1,2,1,1,1,0,2,1,2,0,0,0,1,0,0,0,0,2,0,3,0,0,2,0,0,0,0,1,1,2,0,0,0,0,0,2,2,0,1,1,1,0,0,0,1,0,0,1,0,0,2,1,0,3,1,1,0,1,1,0,1,1,2,1,2,0,2,2,1,1,1,0,2,2,0,2,1,0,0,1,0,0,0,2,0,1,0,3,4,0,2,1,1,0,0,1,0,2,0,2,1,1,1,2,0,1,0,3,2,0,0,1,1,1,1,1,1,1,1,3,0,1,0,0,3,1,0,0,1,0,0,2,1,3,2,1,0,2,0,0,0,0,0,0,0,5,0,2,0,3,2,1,4,0,1,4,0,0,1,0,1,3,0,0,2,0,2,2,0,2,2,1,0,0,2,2,0,0,0,0,1,2,0,2,0,2,0,4,0,0,3,1,0,0,2,0,1,1,0,1,4,2,3,0,1,0,2,1,2,0,0,1,1,0,1,2,0,1,2,0,1,2,1,1,0,1,1,1,0,1,1,0,3,0,0,1,2,1,3,0,2,2,0,2,0,2,1,2,2,1,0,0,0,1,0,0,0,0,0,0,2,2,0,0,1,0,1,0,3,2,0,2,3,2,4,0,0,2,1,0,1,1,2,3,1,0,3,0,4,1,1,2,3,1,1,1,2,1,0,1,1,0,3,1,1,2,1,1,0,0,2,1,0,0,2,0,0,0,0,1,1,2,1,0,1,1,1,0,1,1,1,1,3,0,1,1,0,0,4,1,0,1,1,1,0,0,1,1,0,1,1,0,1,1,2,1,0,0,4,0,0,0,1,2,0,1,2,1,0,0,2,1,2,3,1,1,2,0,0,1,1,0,1,0,3,3,2,2,0,1,0,0,1,1,1,1,1,1,1,0,0,3,1,0,0,0,2,0,0,2,1,0,0,1,0,1,2,0,0,2,0,1,1,2,2,1,1,0,0,1,1,1,1,0,0,1,1,1,2,1,0,1,1,0,2,1,2,0,0,0,0,1,0,0,1,1,0,0,0,2,0,0,0,1,1,1,1,1,1,4,1,0,2,2,1,1,1,1,2,0,0,0,2,2,0,2,3,1,2,1,1,0,1,1,0,3,1,0,1,0,0,2,0,0,1,1,1,5,0,1,1,1,0,0,1,1,2,0,0,1,1,0,1,2,3,2,0,0,2,0,4,1,2,2,1,0,0,1,1,1,3,2,1,1,0,2,1,3,2,0,2,2,0,1,0,2,3,1,2,1,2,0,0,0,0,1,2,1,2,1,1,1,0,2,1,2,0,1,2,2,0,0,1,1,1,2,1,0,0,0,0,2,1,1,0,4,1,1,0,0,1,1,0,2,2,0,1,3,0,0,2,1,3,1,0,1,2,2,1,2,0,3,1,0,2,0,0,1,1,2,0,1,0,2,0,0,1,1,2,0,0,1,4,2,1,3,0,2,2,3,3,0,3,1,1,0,1,1,3,1,0,2,3,1,2,0,4,1,1,2,0,0,4,0,1,4,0,0,0,1,0,1,0,0,1,0,1,0,2,1,3,0,0,0,2,0,0,0,0,2,0,1,2,1,1,4,1,2,1,3,0,3,3,2,0,2,1,0,3,1,0,3,0,1,0,1,1,1,1,2,1,0,2,1,0,1,2,1,0,2,1,4,2,0,2,0,2,2,1,0,0,1,0,1,1,0,1,0,1,0,1,0,0,2,2,1,1,2,2,0,0,1,1,0,0,0,0,1,0,0,1,1,0,3,1,0,4,1,0,3,1,1,2,0,1,1,1,1,1,1,2,0,1,2,1,1,2,0,3,2,1,1,1,1,2,2,0,1,0,0,0,1,2,1,1,0,0,0,0,1,1,1,0,0,0,0,1,1,0,2,3,0,3,0,4,0,1,1,1,2,0,0,0,1,1,0,0,0,2,2,1,0,1,1,1,1,1,1,0,0,0,0,2,2,2,0,1,0,0,0,2,1,1,1,1,0,3,0,0,1,1,3,1,0,1,1,2,1,2,0,0,1,0,2,0,1,1,0,1,0,1,0,0,0,0,1,2,1,1,1,3,1,2,1,0,3,0,1,2,1,0,2,2,1,1,0,0,0,1,2,0,0,1,0,1,0,1,0,1,0,0,2,1,1,1,2,0,0,1,2,5,2,1,2,2,0,1,0,1,1,2,1,2,1,2,1,2,0,1,0,0,2,1,1,0,0,1,1,5,0,0,2,0,2,2,1,1,1,1,0,1,1,3,0,0,0,1,1,1,3,2,0,1,0,1,1,3,0,1,4,2,1,0,0,1,1,3,0,1,0,0,2,0,2,2,2,0,0,2,0,0,1,1,0,1,0,2,3,0,0,2,0,0,2,3,5,0,0,0,3,1,0,0,2,2,0,2,1,0,2,0,0,1,3,3,0,0,1,0,1,1,0,0,2,2,2,2,0,1,0,1,1,0,3,1,1,0,1,3,0,1,1,0,2,0,0,0,2,3,2,2,1,1,0,0,2,4,2,1,1,1,0,0,1,1,0,2,0,0,1,0,2,1,0,2,0,1,2,0,1,1,0,2,1,0,0,0,0,1,1,2,1,0,2,1,2,1,0,1,0,0,1,0,1,1,3,0,1,3,0,1,2,2,2,3,0,0,1,1,1,0,3,1,0,1,2,0,3,2,5,0,1,0,1,0,2,2,0,2,0,0,0,2,2,0,0,0,1,0,0,2,0,0,1,1,0,1,4,0,1,0,0,0,1,1,1,1,1,1,2,0,0,0,0,1,0,1,1,0,1,2,1,2,4,1,2,0,0,0,2,0,1,0,2,2,2,1,0,1,1,3,1,0,3,3,1,0,3,0,0,2,0,1,2,1,1,2,0,1,1,2,1,0,1,1,1,1,0,1,1,0,0,1,1,1,0,0,0,0,0,2,1,0,0,0,1,2,0,0,0,2,0,0,1,1,2,2,2,1,1,0,0,0,0,2,2,1,0,1,1,3,1,2,0,1,0,0,1,0,1,2,1,1,1,1,1,2,0,1,0,2,1,2,2,0,2,1,1,1,1,1,3,1,0,0,1,1,3,3,1,0,1,0,0,1,1,3,2,0,0,1,0,0,1,1,0,1,1,2,1,1,0,0,1,1,0,1,1,0,1,0,1,2,0,3,2,2,0,0,0,0,1,3,0,2,1,2,0,1,0,0,1,0,0,1,0,0,0,0,1,1,1,1,0,1,2,0,0,0,0,0,1,1,0,1,0,0,0,2,2,0,0,2,2,1,0,2,1,0,1,1,4,1,0,1,1,3,1,0,1,0,3,1,0,1,1,0,4,1,2,1,2,1,0,0,0,3,1,1,2,0,2,2,0,2,0,1,3,1,0,1,0,1,1,0,2,2,1,2,1,1,1,2,2,1,1,0,1,0,1,1,1,0,2,1,0,1,0,2,0,2,1,0,1,1,0,0,0,0,2,1,1,0,2,2,1,2,0,0,1,1,1,6,2,1,2,0,2,1,0,0,0,1,1,0,0,1,1,0,1,0,4,0,2,1,0,0,0,0,1,1,3,0,0,0,2,0,0,0,0,1,0,1,1,0,0,1,1,2,0,0,3,0,0,1,2,2,0,2,4,1,0,1,1,1,0,1,1,3,1,1,1,1,1,1,2,0,0,2,1,2,1,1,2,0,0,1,2,0,2,1,2,1,0,1,1,1,0,2,0,0,0,0,1,2,2,1,3,1,2,2,1,0,1,1,0,4,0,0,0,0,0,0,0,2,1,1,0,1,1,0,0,0,0,0,2,2,1,1,0,1,3,0,2,1,0,1,0,2,2,1,1,1,0,2,2,0,1,2,1,0,1,0,0,1,1,4,3,0,2,2,1,0,1,3,0,1,1,0,2,0,1,1,1,4,0,0,0,2,0,0,0,0,1,0,1,2,0,0,1,1,2,0,0,0,0,0,1,1,0,1,0,2,1,1,0,1,1,3,0,0,0,1,2,0,0,2,2,1,0,1,0,1,0,0,0,0,0,0,0,1,4,1,1,0,2,0,0,2,1,1,0,2,1,2,2,3,3,3,0,1,0,1,2,1,1,1,2,0,0,0,1,2,1,1,0,2,2,1,2,1,1,0,1,0,0,0,2,1,0,0,0,2,0,0,0,1,0,2,0,1,0,1,1,2,1,2,2,0,0,1,0,0,1,0,2,1,1,0,0,0,0,0,0]},{"counters":[0,1,1,1,0,2,3,2,0,1,1,0,1,0,1,0,0,1,0,0,3,3,1,1,1,1,2,0,0,2,2,1,1,1,0,2,1,3,1,0,1,2,2,0,1,1,1,1,1,0,0,0,1,2,0,2,0,1,1,0,1,1,1,1,1,2,2,0,0,0,0,0,3,2,2,1,1,1,2,0,1,1,1,0,1,0,2,0,1,0,1,0,2,1,0,1,1,4,2,0,1,2,2,1,3,0,0,1,0,0,1,2,0,2,1,0,0,0,2,1,1,0,1,1,1,1,0,0,0,1,0,0,1,3,3,1,2,2,0,0,2,0,1,3,0,1,0,0,3,1,3,0,2,0,2,0,1,0,1,0,2,0,0,1,2,1,2,3,2,1,3,2,1,1,0,2,0,0,0,3,1,2,1,1,2,1,3,2,2,1,2,1,4,2,1,3,0,2,2,2,0,1,2,0,0,0,1,2,1,2,1,0,0,1,2,0,1,3,1,1,1,1,1,0,0,0,2,2,0,1,0,1,0,0,2,1,1,1,2,0,1,2,1,2,1,1,0,2,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,4,1,1,2,2,4,1,2,2,2,1,1,1,1,0,0,2,1,2,2,4,0,1,1,0,1,1,0,1,0,2,0,1,1,1,1,2,1,0,1,0,1,2,1,1,0,2,1,2,1,1,0,1,2,2,2,1,1,0,5,1,0,0,1,1,2,0,1,1,0,1,1,1,2,2,3,2,1,1,0,0,0,2,1,1,1,0,1,2,1,3,0,0,2,0,0,1,2,0,1,0,0,0,0,1,1,0,1,2,2,2,1,2,1,1,0,1,1,1,1,0,1,2,2,0,1,0,1,1,1,2,0,0,1,0,0,2,0,0,0,0,0,2,0,0,0,1,2,1,1,2,1,3,1,4,3,2,0,1,1,2,0,0,0,0,1,1,1,1,0,0,3,0,2,1,2,0,0,0,2,0,1,0,0,0,0,0,0,0,1,1,2,0,1,0,1,0,1,0,2,1,0,1,0,0,1,2,2,0,1,3,1,0,0,1,0,5,2,2,1,1,0,0,0,1,0,1,0,1,0,2,1,1,0,3,1,0,0,1,2,0,0,1,1,4,0,0,1,0,0,0,1,2,2,0,2,3,2,0,1,2,1,2,0,1,0,0,0,0,0,2,2,0,1,0,1,0,0,0,2,0,0,1,1,0,1,2,0,0,0,0,0,1,0,1,1,1,0,0,0,2,0,0,1,1,1,1,0,3,0,1,1,1,1,2,1,0,0,1,2,1,0,1,0,1,0,1,0,0,1,2,2,0,0,1,0,0,1,2,1,1,0,0,2,1,1,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,2,1,1,3,1,1,1,0,1,0,2,0,2,0,1,1,1,0,0,0,0,0,0,0,1,0,1,3,0,3,1,2,0,1,1,1,1,1,0,1,1,2,1,4,3,1,2,0,1,1,0,3,0,2,1,1,0,0,2,0,0,0,1,1,2,3,3,0,0,3,3,0,0,0,0,0,1,1,2,1,1,0,2,0,0,1,3,1,1,0,0,1,1,2,1,1,0,0,0,2,0,0,1,1,4,0,1,1,1,0,1,0,0,2,2,0,0,1,0,2,0,1,1,0,2,0,0,0,0,1,4,1,1,1,0,0,0,1,2,3,0,0,0,1,0,2,0,2,1,1,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,3,0,2,0,1,2,2,2,1,1,1,1,0,1,0,1,3,1,0,3,1,0,0,1,1,2,0,0,1,0,1,1,3,1,1,1,1,1,0,0,0,2,1,0,1,2,1,2,0,1,0,0,0,1,0,1,1,0,1,3,1,1,1,2,0,1,1,0,0,1,0,2,1,3,0,1,1,1,1,0,2,1,2,2,0,1,1,1,1,2,0,0,1,0,2,1,1,1,1,1,0,1,2,1,1,1,0,1,3,2,2,1,0,0,3,0,1,1,1,2,1,1,0,2,0,0,2,1,2,3,2,2,1,0,0,1,0,1,0,0,2,1,1,0,1,1,2,1,1,1,0,0,1,1,0,1,1,2,1,0,1,0,0,0,1,4,1,1,0,1,1,2,1,0,1,1,3,0,0,1,1,2,1,1,0,1,1,1,2,1,1,1,0,0,1,4,0,2,2,2,1,1,0,1,3,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,2,1,5,1,1,0,2,2,1,0,1,0,1,0,2,0,0,1,2,0,0,0,0,0,0,1,1,2,1,1,2,2,2,0,1,2,0,2,1,1,0,1,0,1,1,0,3,0,0,2,0,0,1,1,2,1,2,2,1,2,1,0,1,1,0,3,0,1,2,1,2,3,0,0,1,0,0,1,2,3,2,2,1,2,1,1,1,1,1,2,3,3,2,4,1,2,1,0,0,1,1,1,1,0,2,2,0,1,1,0,0,2,2,0,1,2,0,1,0,0,0,0,1,0,2,1,1,0,1,1,1,2,0,0,0,1,2,3,1,0,1,0,0,0,1,1,1,1,2,0,1,0,0,0,0,0,0,0,1,1,1,0,0,4,1,0,0,1,0,1,0,2,0,2,1,0,1,1,1,0,0,0,5,0,0,1,2,1,0,0,0,2,1,1,1,0,1,3,1,1,1,0,1,0,0,0,0,0,0,1,2,4,1,1,0,1,1,2,1,0,2,0,2,1,0,0,0,0,0,0,0,0,0,1,2,0,2,0,0,2,0,0,1,2,1,0,1,2,0,2,0,0,1,2,2,1,1,1,2,0,1,2,0,1,1,1,0,0,1,0,3,3,0,2,3,2,1,2,0,1,2,2,1,1,1,1,0,1,1,1,3,2,2,1,2,0,1,0,1,1,0,2,3,1,1,0,0,2,2,0,1,0,0,1,0,0,0,1,5,0,1,2,1,1,2,2,1,4,1,2,3,3,0,2,1,2,1,0,1,0,3,1,1,2,0,0,0,1,2,1,0,2,1,0,0,0,1,0,2,1,3,1,1,2,5,0,1,0,1,0,1,0,2,1,0,0,0,1,1,0,1,2,0,2,0,1,1,0,1,1,0,1,1,0,0,2,1,2,2,1,0,2,0,0,2,4,1,1,2,1,0,0,0,1,0,0,5,1,2,0,0,0,0,0,0,1,0,1,0,2,1,1,4,0,1,2,1,0,0,0,0,1,1,1,0,0,0,1,1,1,2,1,2,2,1,0,1,1,1,0,2,0,0,1,0,0,1,3,0,0,1,0,0,2,0,1,0,1,3,1,2,2,1,0,1,1,1,1,3,0,1,2,3,1,1,2,1,0,0,1,2,1,2,1,1,0,0,0,2,0,1,3,1,0,0,0,1,2,5,2,0,2,0,1,1,1,2,2,2,0,2,1,1,2,0,0,1,0,0,2,0,1,3,1,0,3,1,0,3,0,3,0,1,2,0,2,0,0,0,1,1,1,0,4,1,2,0,0,0,1,0,0,2,3,3,1,1,0,0,1,0,0,1,0,2,0,1,0,0,1,2,1,0,2,2,1,2,0,2,2,0,1,0,0,1,2,3,0,0,3,2,0,4,1,1,3,2,2,1,1,2,3,0,1,1,2,1,2,0,2,1,0,1,0,2,2,0,2,1,1,2,0,2,0,3,2,2,0,2,0,1,3,0,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,2,1,1,1,1,0,0,0,1,0,0,0,0,2,1,1,1,3,0,2,1,0,2,0,1,1,1,3,2,0,1,1,0,3,1,0,0,0,1,1,0,2,0,0,2,1,1,2,1,0,0,0,1,0,0,1,0,1,2,2,1,0,0,2,0,1,2,0,0,3,0,1,0,1,3,1,0,2,2,0,1,2,1,2,0,2,2,1,1,1,0,4,0,0,0,0,1,0,0,1,0,1,0,1,1,2,1,0,3,1,1,2,1,1,1,2,0,0,1,2,0,2,0,1,1,1,1,0,1,1,1,0,1,3,2,0,1,0,2,0,1,0,0,0,0,0,1,2,0,1,1,1,1,0,0,2,3,1,0,1,2,0,1,0,0,0,2,2,0,1,0,1,1,0,1,0,1,2,2,2,1,1,2,1,1,3,1,1,0,0,1,0,1,1,3,4,0,1,1,1,0,0,3,2,1,2,2,3,2,1,2,2,1,1,1,0,0,0,2,2,1,1,2,1,1,0,1,1,0,1,2,0,1,1,0,0,1,0,2,1,0,0,0,0,2,1,1,0,2,1,2,1,0,2,0,0,0,2,1,0,1,1,2,1,2,0,1,2,1,1,0,0,1,2,1,3,1,2,1,1,2,0,1,0,1,1,0,3,1,3,0,0,2,0,0,0,0,0,1,1,4,2,1,2,3,1,1,0,1,2,0,4,2,1,0,1,1,0,2,0,2,1,1,2,1,0,0,1,0,1,0,5,0,0,0,0,1,3,2,1,0,0,1,1,2,0,0,1,2,4,2,2,1,0,1,2,1,1,2,2,1,3,0,1,0,0]},{"counters":[1,1,1,0,0,0,0,0,0,1,1,2,0,1,0,0,0,3,1,0,3,0,1,0,0,0,1,1,0,0,0,0,0,1,0,1,1,0,2,3,2,3,1,0,1,0,2,1,1,0,1,1,1,3,1,2,0,0,0,3,1,2,1,0,1,2,0,2,0,0,1,0,1,0,2,3,2,2,1,1,0,2,3,0,0,2,0,2,1,1,4,0,1,1,1,1,1,1,2,2,0,0,2,0,1,0,0,1,3,2,0,2,2,2,0,0,2,0,1,1,2,1,1,0,0,0,0,0,1,0,2,0,1,0,0,0,1,0,1,2,1,3,3,1,1,2,2,0,0,1,1,0,0,2,1,1,0,0,1,0,0,0,0,0,0,1,0,1,0,2,1,2,0,0,1,3,1,3,0,1,1,1,1,0,2,0,2,0,1,0,1,2,2,2,2,2,2,1,1,0,0,0,1,1,2,1,0,5,0,0,0,1,2,0,1,2,0,0,1,2,1,1,1,0,1,0,2,2,0,3,2,0,0,0,1,0,2,2,2,0,1,1,1,1,1,0,1,0,1,1,1,3,1,0,1,1,0,0,3,2,1,1,1,0,0,0,0,1,0,1,1,0,1,0,0,0,2,0,2,0,2,1,1,1,2,0,0,1,0,3,1,1,1,2,0,1,0,0,3,2,0,0,1,1,0,1,0,2,1,0,1,0,0,1,1,1,1,0,2,0,0,2,1,3,0,0,1,2,2,0,3,1,3,1,0,0,0,1,2,1,0,2,3,0,1,0,0,0,2,1,1,1,2,2,0,0,1,2,2,2,2,0,0,1,3,1,0,0,1,1,0,1,0,0,1,1,1,0,2,2,2,1,0,0,1,0,2,3,0,1,0,1,1,0,0,1,0,0,0,2,0,1,1,1,3,0,2,0,1,1,2,0,0,0,0,0,0,0,0,0,2,0,0,0,1,1,0,1,1,1,3,1,0,0,0,0,1,1,1,1,1,0,3,0,0,0,1,0,1,1,2,0,1,0,1,6,1,1,3,0,2,2,2,1,1,0,1,1,2,1,2,2,0,1,1,0,0,0,0,2,0,1,2,0,0,0,0,0,3,2,0,1,1,1,1,0,1,1,0,1,0,0,0,2,2,1,0,2,1,1,2,1,2,1,2,0,0,2,2,3,0,0,1,0,2,1,1,3,0,1,2,0,4,0,1,2,2,1,0,0,3,1,2,1,1,1,2,1,1,1,1,2,1,0,2,1,2,1,0,1,0,0,0,0,0,1,0,0,2,2,1,2,1,0,0,2,0,1,1,0,1,1,0,0,0,2,1,0,1,0,2,0,1,1,0,1,0,1,1,0,2,1,0,1,0,1,1,1,3,2,3,0,0,1,1,0,1,2,1,2,1,1,4,0,1,3,0,2,1,0,1,0,2,2,0,0,0,1,0,1,1,1,0,0,3,1,0,0,2,2,4,0,0,0,0,0,1,0,1,0,3,0,1,1,2,1,2,0,0,2,1,1,2,0,0,0,4,1,1,1,1,0,1,1,0,0,1,1,1,1,3,1,1,2,1,0,0,0,0,0,0,2,3,2,1,1,1,1,1,2,1,2,2,1,1,1,1,1,5,1,4,0,3,0,0,1,2,1,0,1,0,4,1,2,2,0,1,0,2,2,1,3,0,0,2,0,1,0,2,1,2,1,0,0,0,3,0,1,3,0,1,0,0,5,0,0,3,1,2,2,0,3,1,1,1,1,0,1,1,0,1,0,1,4,0,0,1,1,2,0,0,1,3,1,1,1,1,0,0,2,2,0,2,0,2,1,1,0,1,0,0,1,1,3,2,1,0,1,1,1,0,3,0,2,1,1,0,0,1,3,0,2,0,0,2,0,0,1,2,0,0,1,1,1,1,1,1,0,0,0,1,3,0,0,3,2,1,1,1,2,1,2,1,1,2,1,1,2,2,1,0,1,1,1,1,1,0,0,0,5,0,0,0,2,0,0,0,3,2,4,1,2,2,0,1,0,2,0,1,0,2,0,0,2,2,1,0,1,0,0,0,1,0,0,0,0,2,1,0,1,0,1,1,0,0,0,0,1,0,2,1,1,2,0,1,1,1,2,1,2,1,0,0,0,2,0,0,0,1,0,1,2,2,1,1,2,1,0,1,1,0,0,2,2,1,2,1,1,1,1,1,1,1,0,0,1,1,1,2,0,1,0,0,3,2,2,2,1,0,0,0,0,0,2,2,1,1,0,0,2,0,0,1,0,1,0,2,1,1,1,0,0,1,1,1,1,2,0,0,2,2,3,1,0,4,0,0,1,3,1,1,1,1,1,0,3,0,0,0,3,1,0,0,2,1,0,1,1,0,1,2,0,1,1,1,2,2,0,0,1,1,1,2,0,1,1,0,1,0,1,4,0,0,1,1,1,0,0,2,0,1,2,1,1,1,2,4,1,1,0,2,1,0,1,0,0,0,0,1,0,1,1,1,3,2,1,0,1,1,1,2,0,1,1,0,1,1,0,3,1,1,1,1,1,2,0,2,0,2,5,1,2,0,0,2,0,2,0,0,1,0,2,2,1,1,2,2,1,3,1,0,0,2,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,2,2,1,1,2,3,2,1,3,3,2,1,0,1,3,3,1,1,1,1,0,0,0,0,1,2,0,0,1,2,1,1,2,1,0,3,0,0,1,1,0,1,0,1,0,1,2,0,0,2,1,3,1,0,2,0,0,0,1,0,0,0,0,1,0,0,1,4,0,1,1,0,1,0,2,2,2,0,0,3,1,0,0,0,0,1,1,2,0,0,0,0,1,0,0,0,1,1,3,2,0,1,0,1,1,0,0,1,2,3,0,1,3,0,0,0,1,1,0,1,0,1,1,3,0,1,2,0,0,2,0,0,1,0,1,1,2,0,0,2,0,0,1,0,0,1,0,1,1,1,0,1,0,4,0,1,3,0,1,0,2,0,2,1,1,0,0,1,3,1,1,1,0,3,0,2,1,1,1,4,1,1,2,1,2,1,0,1,2,2,0,0,1,0,1,0,1,0,0,0,1,0,1,3,0,0,0,0,0,1,1,0,2,2,0,1,0,0,0,0,1,0,1,0,2,1,2,1,0,0,0,2,1,1,1,2,0,0,0,1,0,0,1,0,2,1,1,0,0,1,0,1,0,0,1,1,2,1,1,0,2,0,0,2,1,2,3,0,0,0,2,3,4,0,3,0,1,0,1,1,2,0,0,0,1,2,1,0,0,4,2,1,0,0,1,0,0,1,0,0,1,3,2,0,1,2,1,0,1,2,2,1,3,1,1,1,0,2,0,0,0,1,1,2,0,1,2,0,1,1,3,3,0,0,2,1,3,3,1,0,1,0,1,3,2,1,0,0,2,1,1,3,1,1,2,2,0,1,0,2,0,0,1,2,2,0,0,1,2,1,1,0,1,3,0,0,1,3,0,1,1,3,1,2,1,0,0,1,1,1,2,0,1,1,1,0,0,1,1,0,4,1,0,0,0,1,3,1,1,1,0,2,1,1,0,1,2,2,1,1,4,1,0,1,1,0,1,3,0,1,1,0,1,1,2,2,0,1,1,0,0,2,1,0,1,3,0,0,0,2,1,2,1,2,0,1,1,0,1,2,1,1,2,0,0,0,2,0,3,1,1,3,2,1,0,0,1,3,3,1,1,2,0,1,0,0,1,0,2,0,3,0,0,1,1,2,1,1,0,1,0,2,0,0,0,0,1,1,1,0,2,1,1,0,1,1,0,1,1,2,0,0,1,0,0,2,1,0,2,0,1,0,2,1,1,0,3,2,0,4,2,0,1,1,2,1,0,0,2,0,0,1,0,2,1,0,1,0,2,0,2,1,0,1,2,2,0,0,1,2,2,0,0,2,0,1,1,0,2,1,2,0,2,1,2,2,2,0,0,1,2,1,1,0,1,1,1,1,1,2,1,1,0,2,3,0,0,1,0,0,3,0,0,0,0,3,4,1,1,1,1,3,0,1,1,0,2,0,2,1,0,2,3,2,2,4,0,1,1,2,1,2,2,1,2,1,3,1,1,0,1,0,1,0,3,2,0,3,1,1,2,1,0,1,3,0,2,0,0,0,0,2,1,0,2,2,1,1,0,2,1,1,0,1,0,1,2,0,1,0,0,4,1,3,0,1,0,4,1,0,1,2,2,1,1,0,2,3,2,0,0,2,0,0,2,1,2,0,0,2,1,0,1,1,0,0,0,2,1,1,2,0,2,1,2,0,1,0,0,0,1,3,1,1,2,1,3,3,1,2,0,2,0,2,0,0,1,2,0,3,0,1,1,1,2,0,1,0,0,0,1,3,0,0,1,1,1,1,1,0,0,1,0,0,0,2,3,1,1,0,0,0,0,4,0,2,1,4,2,1,0,2,4,0,3,2,0,1,1,2,2,0,2,2,1,1,1,0,1,1,0,0,1,0,2,2,0,2,1,3,0,1,1,0,1,0,1,4,1,0,0,0,0,0,2,1,2,2,0,1,0,2,0,3,3,0,0,1,2,1,0,0,1,1,0,1,0,0,1,0,2,0,1,1,0,2,0,0,3,0]},{"counters":[1,1,0,1,2,3,0,0,2,0,1,1,0,2,3,0,0,0,1,1,0,2,2,2,2,1,1,1,0,2,1,2,0,0,1,0,0,1,0,4,0,1,2,0,0,1,1,0,1,0,2,1,1,1,1,0,1,2,3,0,1,2,1,1,0,0,0,1,1,0,2,1,0,1,1,1,0,4,0,2,0,2,1,0,1,3,1,2,1,0,0,0,0,3,0,0,1,1,2,0,1,0,2,0,1,3,1,2,3,0,0,0,1,3,1,0,2,1,1,1,1,0,1,0,1,1,3,1,1,2,0,1,1,2,0,0,0,0,0,0,1,0,2,1,0,1,0,1,0,1,0,0,1,0,2,1,1,1,3,0,2,0,1,2,2,0,0,1,0,1,3,1,0,2,1,1,0,0,0,0,0,2,0,0,2,2,1,3,1,1,1,1,1,0,0,0,1,0,0,0,1,0,2,3,0,0,1,1,1,1,3,0,1,0,0,0,1,1,0,0,1,0,0,0,0,2,2,2,3,0,2,2,0,0,2,0,5,4,1,0,1,2,0,1,2,1,0,1,0,1,1,1,2,0,1,0,0,0,0,2,1,0,1,0,1,1,0,0,1,1,0,1,0,0,1,2,0,2,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,2,1,1,2,2,0,3,1,1,1,0,3,1,2,1,1,1,1,1,1,0,1,1,0,1,1,2,1,3,0,2,0,1,1,0,1,1,0,0,1,1,2,1,3,1,0,0,1,1,0,2,0,0,0,4,2,1,1,0,3,1,1,2,1,1,1,2,3,0,1,0,0,0,1,1,0,1,0,1,1,1,4,1,2,1,1,0,1,0,2,1,1,2,0,1,1,1,2,2,2,2,3,3,0,1,1,3,1,0,0,0,1,0,0,1,0,2,3,0,1,0,0,1,1,0,1,3,1,0,0,1,1,4,0,0,0,1,0,0,1,1,2,3,0,1,0,2,1,1,0,0,1,2,0,0,1,2,1,0,0,0,2,1,1,1,0,1,1,0,0,1,3,2,2,2,0,0,1,2,2,0,3,1,0,1,0,0,0,0,2,2,0,1,3,2,1,0,1,0,0,0,1,0,1,0,0,2,0,0,0,2,1,1,1,1,1,0,0,1,0,1,2,0,1,1,1,0,1,1,0,2,0,0,0,2,2,0,2,2,3,0,2,1,1,1,0,0,0,0,0,1,0,1,0,1,1,0,1,3,0,1,1,0,0,0,1,2,0,0,2,2,0,2,1,0,1,2,2,2,4,0,2,2,0,4,0,0,2,3,0,2,1,1,1,2,1,1,1,0,0,0,1,1,1,1,1,1,3,0,0,1,0,0,1,0,1,0,0,3,0,0,0,2,2,0,2,1,0,0,1,2,0,3,0,0,1,1,1,2,2,0,0,1,0,2,1,0,1,3,0,0,3,0,0,1,2,2,0,2,1,1,1,0,1,0,0,1,0,1,3,0,2,1,0,2,2,0,2,1,0,1,0,0,0,0,0,1,0,0,2,2,1,0,2,1,0,1,1,1,1,3,0,0,1,0,1,0,1,0,0,1,2,0,0,1,0,1,2,1,1,3,1,5,0,0,2,2,0,0,0,0,1,2,3,1,0,1,2,0,1,1,1,0,2,0,3,0,0,1,0,2,2,0,3,0,2,1,0,0,1,0,0,3,0,2,1,0,0,1,2,0,1,1,1,1,0,0,1,0,1,1,1,3,0,2,0,1,1,0,0,0,2,1,0,0,2,0,0,2,1,2,1,1,1,3,0,1,1,3,0,0,0,0,1,2,0,1,3,0,0,1,0,1,1,1,1,3,0,1,1,0,0,0,1,3,0,0,0,0,2,1,2,0,0,5,0,1,5,0,4,0,3,0,1,1,1,0,2,0,0,1,1,0,1,2,1,1,3,1,1,1,3,0,1,0,1,3,1,1,1,1,0,2,1,1,2,0,1,1,0,4,0,2,3,0,0,1,1,0,1,1,1,1,2,0,1,0,1,2,0,1,0,1,0,1,4,0,1,3,1,2,0,1,1,2,1,1,0,1,1,1,2,0,1,0,1,0,2,1,2,0,1,2,0,1,2,0,1,1,1,0,1,0,0,1,3,1,0,0,0,0,4,0,1,1,0,0,4,2,1,1,1,1,0,1,2,0,1,0,0,0,0,0,3,1,0,1,1,1,1,1,1,1,0,2,1,0,2,4,2,2,1,0,1,0,2,1,0,0,1,0,1,1,3,1,0,2,0,0,2,3,1,1,2,1,3,3,1,3,1,3,0,0,0,0,0,1,0,1,0,0,1,0,2,0,0,2,1,0,0,1,0,3,1,0,2,0,1,0,3,0,3,1,1,1,1,0,0,0,0,1,2,0,0,2,1,0,1,1,1,3,0,1,3,1,0,1,0,1,2,2,1,0,0,0,1,1,1,3,1,0,4,3,1,1,1,0,0,2,0,0,2,1,2,1,1,0,0,0,0,0,2,0,1,2,3,0,0,1,1,0,1,1,0,2,1,1,2,1,5,1,4,0,0,0,2,0,0,1,2,0,1,1,1,0,1,0,4,0,1,1,0,1,1,0,0,0,0,2,0,0,0,0,1,2,2,2,1,1,6,1,1,2,2,0,1,2,2,1,2,2,4,1,1,0,2,1,1,0,1,0,0,1,1,0,1,1,0,2,1,2,1,0,3,1,0,0,0,2,1,1,0,1,1,0,0,0,0,1,0,0,0,0,0,1,0,2,1,3,1,0,0,2,0,2,0,1,0,2,1,0,2,4,3,2,1,0,0,2,2,2,1,0,2,2,1,3,1,1,1,2,0,0,1,0,1,1,2,1,2,0,0,3,0,1,0,3,3,1,3,1,2,0,1,3,1,0,0,0,0,1,2,0,0,1,0,0,1,0,1,0,0,1,1,0,3,1,1,2,0,0,1,3,0,0,0,0,5,1,0,0,1,1,0,2,1,0,0,3,0,0,1,7,0,0,0,2,2,0,1,0,2,2,2,0,2,1,2,1,0,1,0,1,1,0,2,2,2,1,0,3,1,0,1,1,1,3,0,1,2,0,1,1,0,2,0,0,2,1,2,1,0,0,2,0,2,1,1,0,2,1,2,1,0,3,3,0,1,2,0,2,0,1,2,0,1,1,2,0,1,5,0,2,1,1,1,2,2,1,0,0,0,3,1,1,0,1,2,1,1,0,0,2,2,1,3,0,0,1,2,1,0,0,0,1,0,2,0,2,1,1,1,5,1,2,0,0,0,3,1,0,1,1,1,2,1,2,1,1,3,0,3,0,2,3,1,1,1,1,1,1,1,1,1,1,3,0,0,0,2,0,2,1,1,1,2,3,1,0,2,0,0,0,2,0,2,1,0,1,1,1,3,1,1,2,0,0,2,1,0,0,0,0,3,2,1,1,3,3,1,1,2,0,0,1,0,0,2,3,2,0,1,0,2,1,2,0,0,1,0,1,1,0,2,0,1,1,1,0,2,2,1,0,1,1,1,4,1,0,0,1,0,0,0,1,1,1,1,1,0,0,1,1,0,1,0,1,2,1,1,2,0,2,1,0,1,0,0,1,0,1,2,0,2,0,3,1,1,2,1,0,0,1,0,1,0,0,0,1,0,5,4,2,2,0,1,1,0,1,0,0,1,0,0,2,0,1,0,1,0,0,1,1,0,0,1,1,1,0,0,2,1,1,2,1,1,1,1,1,0,2,1,1,0,0,0,2,1,1,0,0,1,1,1,0,1,3,1,2,1,0,0,2,1,0,1,2,0,0,1,0,0,1,2,0,1,1,1,1,1,3,3,1,0,0,0,1,0,0,2,0,0,0,0,0,1,0,1,0,1,0,0,1,1,1,0,2,2,0,0,0,1,1,0,0,1,0,0,1,0,1,1,0,1,1,0,3,0,0,1,3,0,2,1,2,0,1,1,1,1,2,0,0,1,0,1,1,2,0,2,4,1,2,2,0,1,0,2,2,2,0,1,1,3,0,3,0,4,1,2,1,1,1,2,0,1,3,1,2,0,0,0,2,2,1,0,2,0,4,0,3,0,1,0,0,2,2,0,1,0,0,1,1,0,1,3,3,1,1,2,2,0,1,0,0,3,1,1,1,2,1,1,2,1,0,2,1,1,1,2,1,4,3,1,1,0,0,0,1,0,0,1,1,1,2,0,0,2,0,1,1,1,2,0,0,0,1,1,2,0,2,2,1,0,1,4,3,2,3,1,2,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,1,0,0,0,2,0,1,4,0,4,2,3,0,1,2,0,2,1,1,1,2,0,0,0,1,0,0,0,0,0,1,0,1,1,0,1,1,1,1,0,3,1,1,0,0,0,0,0,0,0,2,1,2,1,1,1,1,0,0,0,0,0,2,3,1,0,2,1,1,2,0,0,1,0,0,2,0,0,0,0,1,0,1,1,1,1,1,1,0,0,2,3,2,2,1,1,2,3,2,0,0,3,0,1,1,2,2,1,2,1,0,2,0,1,1,1,1,2,2,0,0,0,1,0,0,0,0,3,0,0,2,1,1,0,3,0,0,3,2]}]},"null_count":0,"last_update_version":397952039942881280},"sp":{"histogram":{"ndv":12,"buckets":[{"count":178,"lower_bound":"BAAAAAABFAbtBAAAAAAAB8hB","upper_bound":"BAAAAAABFAbtBAAAAAAAB8hB","repeats":178},{"count":345,"lower_bound":"BAAAAAABFAbtBAAAAAAAB+9R","upper_bound":"BAAAAAABFAbtBAAAAAAAB+9R","repeats":167},{"count":486,"lower_bound":"BAAAAAABFAbtBAAAAAAACBZh","upper_bound":"BAAAAAABFAbtBAAAAAAACBZh","repeats":141},{"count":653,"lower_bound":"BAAAAAABFAbuBAAAAAAAB8hB","upper_bound":"BAAAAAABFAbuBAAAAAAAB8hB","repeats":167},{"count":845,"lower_bound":"BAAAAAABFAbuBAAAAAAAB+9R","upper_bound":"BAAAAAABFAbuBAAAAAAAB+9R","repeats":192},{"count":1014,"lower_bound":"BAAAAAABFAbuBAAAAAAACBZh","upper_bound":"BAAAAAABFAbuBAAAAAAACBZh","repeats":169},{"count":1178,"lower_bound":"BAAAAAABFAscBAAAAAAAB8hB","upper_bound":"BAAAAAABFAscBAAAAAAAB8hB","repeats":164},{"count":1333,"lower_bound":"BAAAAAABFAscBAAAAAAAB+9R","upper_bound":"BAAAAAABFAscBAAAAAAAB+9R","repeats":155},{"count":1500,"lower_bound":"BAAAAAABFAscBAAAAAAACBZh","upper_bound":"BAAAAAABFAscBAAAAAAACBZh","repeats":167},{"count":1669,"lower_bound":"BAAAAAABFAsdBAAAAAAAB8hB","upper_bound":"BAAAAAABFAsdBAAAAAAAB8hB","repeats":169},{"count":1846,"lower_bound":"BAAAAAABFAsdBAAAAAAAB+9R","upper_bound":"BAAAAAABFAsdBAAAAAAAB+9R","repeats":177},{"count":2000,"lower_bound":"BAAAAAABFAsdBAAAAAAACBZh","upper_bound":"BAAAAAABFAsdBAAAAAAACBZh","repeats":154}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,177,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952041764519936},"uid":{"histogram":{"ndv":4,"buckets":[{"count":486,"lower_bound":"BAAAAAABFAbt","upper_bound":"BAAAAAABFAbt","repeats":486},{"count":1014,"lower_bound":"BAAAAAABFAbu","upper_bound":"BAAAAAABFAbu","repeats":528},{"count":1500,"lower_bound":"BAAAAAABFAsc","upper_bound":"BAAAAAABFAsc","repeats":486},{"count":2000,"lower_bound":"BAAAAAABFAsd","upper_bound":"BAAAAAABFAsd","repeats":500}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,486,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,528,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952039820460032}},"count":2000,"modify_count":0,"version":0} diff --git a/cmd/explaintest/s/explain_complex_stats_rr.json b/cmd/explaintest/s/explain_complex_stats_rr.json deleted file mode 100644 index 0d2a997e5311f..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_rr.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"rr","columns":{"acd":{"histogram":{"ndv":1974,"buckets":[{"count":8,"lower_bound":"MEg=","upper_bound":"MFBNWWtDc1V1R3l1","repeats":1},{"count":16,"lower_bound":"MFpMQTVjYkN0dWdEN1Vv","upper_bound":"MGJa","repeats":1},{"count":24,"lower_bound":"MGZWbDBqeG5GOVhHcQ==","upper_bound":"MHhIZ1JQUE5iaDNkVjI4Q3BOWnJuUjVId2M=","repeats":1},{"count":32,"lower_bound":"MTF1RnpjRmJIZFJYSUsxdENIV1g5T0o2","upper_bound":"MUNNTmJHRzdzRVlldlVmNnhUQ3dWUUhxdQ==","repeats":1},{"count":40,"lower_bound":"MUNnYW5GQnlzbDZBRWpGVlcweXMwY05BQVB5","upper_bound":"MVNEVzkwSXUy","repeats":1},{"count":48,"lower_bound":"MVRndg==","upper_bound":"MVhrWnVxTHNZYXJlUFNYNnVh","repeats":1},{"count":56,"lower_bound":"MWFKSnBTemZ4S0d6","upper_bound":"MWZLMlI=","repeats":1},{"count":64,"lower_bound":"MWhYcnZISm5vZ3NobFhiNWdRNUl4UXptalNrUw==","upper_bound":"MWxMc0ZNaGRu","repeats":1},{"count":72,"lower_bound":"MW45VTVuQzdjWjd4a25LTDJ4MkpTYVFpdUw=","upper_bound":"MXhaY3dzdXE1SXZEbWNpemJ2ZU9IMFllRkdpN2FXZA==","repeats":1},{"count":80,"lower_bound":"Mg==","upper_bound":"MkdEQTJ3Ug==","repeats":1},{"count":88,"lower_bound":"MklHQU9zbFQ=","upper_bound":"MkpjQXUzNWlqeTZYemNYemRubElhM0ttZ01pMjh5UEw=","repeats":1},{"count":96,"lower_bound":"MlJ4VXRCMXlwNno1bEpjSWVMVUE=","upper_bound":"Mld3RFI2TVhEb3dLc3E0dWVETzcz","repeats":1},{"count":104,"lower_bound":"Mmh0eGw=","upper_bound":"MnE=","repeats":1},{"count":112,"lower_bound":"Mnd0OEh1MzlqNnZBeGhsbWRBejZ1dQ==","upper_bound":"Mw==","repeats":1},{"count":120,"lower_bound":"M0VGSThwd1Vh","upper_bound":"M050WEl4cUd0SFFST1Z2RVBIV0psSw==","repeats":1},{"count":128,"lower_bound":"M08=","upper_bound":"M1ROclhackFS","repeats":1},{"count":136,"lower_bound":"M1RxUjVoc3FObzZjVlpSeDJUUVF3Rjg3WWVvT0lv","upper_bound":"M2VDaENtWlM=","repeats":1},{"count":144,"lower_bound":"M2pyRTBJUGp2SU5TSmJkSDRVRmdL","upper_bound":"NDM4cmZlVFlUY3ZoZk9IMDN2","repeats":1},{"count":152,"lower_bound":"NDU=","upper_bound":"NEdWQXB6QXE5YnVyVmlnQWhITVFSVzk2SnQwcnZIMmg=","repeats":1},{"count":160,"lower_bound":"NEo=","upper_bound":"NFozM0tuZDJ3cVp5","repeats":1},{"count":168,"lower_bound":"NGVxWmVJMUoyTFcwYnlSaVJPbG1ZcFQ=","upper_bound":"NHMzVUJkNUFGTU9sdlVk","repeats":1},{"count":176,"lower_bound":"NHYyTGNkeWkzbVJraExycGVp","upper_bound":"NTJlQjJJTkNUbDVYd2hCMGJPcjBBTGNueU8zTVVFUQ==","repeats":1},{"count":184,"lower_bound":"NTYxanZVS0VjT1BWMENJc1dkMFJzUGVNaGt4bWo=","upper_bound":"NUk3VjlsWndxdE1Kc1Y=","repeats":1},{"count":192,"lower_bound":"NUtqd1NwMXRKbGJWOTkwSno=","upper_bound":"NVp3bTg4eEt2V1BtTEtzencyV3c3eEZq","repeats":1},{"count":200,"lower_bound":"NWV5Q3c0cTM0cDNMTHlPcGFleEJhcnUyZUw3ck9Zdw==","upper_bound":"NWxFS1BQYkVNQ3RnUkFTVUZkWmVVdGtMakZscXpTaGw=","repeats":1},{"count":208,"lower_bound":"NWxn","upper_bound":"NjBHbm9VaXo0QVpCbmM=","repeats":1},{"count":216,"lower_bound":"NjJzZWpzMUE4SWcxdUlyQnZDUmZLU28xZUlQcTNpeTc=","upper_bound":"NjhUb0hvZWlYUlJyeUtw","repeats":1},{"count":224,"lower_bound":"NkZnbzhLNzRuckdwSXk=","upper_bound":"Nk1DWkdB","repeats":1},{"count":232,"lower_bound":"Nk9zQzQxSVFodFc=","upper_bound":"NnNmb3kxaEw=","repeats":1},{"count":240,"lower_bound":"NnhxdUhrTA==","upper_bound":"NzE5MGY4dWNVNmhsalAzbjlvaEVReHVaSmtZYlk3R1o=","repeats":1},{"count":248,"lower_bound":"NzFyQWt3aw==","upper_bound":"N1JSQk1FVzlPSExNN2tVaFp0b0I=","repeats":1},{"count":256,"lower_bound":"N1pMUkE0dFRGNnMyag==","upper_bound":"N3lySFY0Z2N0RUM0b1hpOWM2aW5TeTBaU2hFZ3JMTw==","repeats":1},{"count":264,"lower_bound":"OA==","upper_bound":"ODZnMHFWRDU=","repeats":1},{"count":272,"lower_bound":"OEJlQjM2Q0xoMzNVN0ZGVjFu","upper_bound":"OFRVMm5qdDZuWGNsbmJjajlMeG9M","repeats":1},{"count":280,"lower_bound":"OFVkTjZJcVA=","upper_bound":"OGoxNDdpU1NUc1VkYkdJOTdkajE5ZHFzbXBuMA==","repeats":1},{"count":288,"lower_bound":"OGxuQkozU0FvS253MUNYQzdxQU5LSUlsZm0=","upper_bound":"OHlISlI2S2lJN2pTVUQ=","repeats":1},{"count":296,"lower_bound":"OQ==","upper_bound":"OUFwS3NyVFE=","repeats":1},{"count":304,"lower_bound":"OUZrVWlvamFQSnBMamVUWXlHRkxJemdLSHVWMw==","upper_bound":"OUxQa1pZeW5YNXZmdzRqSzRkNnFH","repeats":1},{"count":312,"lower_bound":"OVFNTQ==","upper_bound":"OWZNTkJ6d1pvZE9hZ2YybTV4SUpqUHVJYW8=","repeats":1},{"count":320,"lower_bound":"OWhFRTQ=","upper_bound":"QQ==","repeats":1},{"count":328,"lower_bound":"QTJrYTdRbUtMRmZMSFVxTmgwUzA=","upper_bound":"QUZVc0xNYVg4MFZVNm9xb2dzSEtqZg==","repeats":1},{"count":336,"lower_bound":"QUdvQ015WldxQ1hJdUo3dGhpSjdyTUJ5","upper_bound":"QVB0QzlWWEtpYmVvUkh0TU8xNE9JMVlrWQ==","repeats":1},{"count":344,"lower_bound":"QVExTDljeDM5YVVIVkhMTlFJ","upper_bound":"QWtMRlpESjhSODdUd1p3bzhRUTMyZzNtMnBRUA==","repeats":1},{"count":352,"lower_bound":"QXNZT0lvZks1NlJpbmw1S1dMcmk5","upper_bound":"QjZwMXE=","repeats":1},{"count":360,"lower_bound":"QjdoejFybVpWN1BWcG51U05wWVJaVDBPNXEzOWhzWkY=","upper_bound":"QkVMdW96ZnpNeTNHc1VaMzgxbXdsZERTalVkZQ==","repeats":1},{"count":368,"lower_bound":"QkhpWmtSWENVcGtWSnQyOGdHVlFkM3A=","upper_bound":"QlZBWG95emYyVTBSNlpUY1MwS0RTZw==","repeats":1},{"count":376,"lower_bound":"QlhGQjFhcG5Jb2dDbkxZZHFmbnZ2N3ZCTDdUdzZQclk=","upper_bound":"QmYwd29TbzhsTA==","repeats":1},{"count":384,"lower_bound":"Qm1MUU9XT3ZKcVpZWA==","upper_bound":"Qnc0SWFOd0FqVjJEZVRkNlhFSjZs","repeats":1},{"count":392,"lower_bound":"Qw==","upper_bound":"Q0RLNVBEbVlvbkRGTVNyNA==","repeats":1},{"count":400,"lower_bound":"Q043b3Y1dWU3aQ==","upper_bound":"Q2dwbmdrZHVtZg==","repeats":1},{"count":408,"lower_bound":"Q2tBR01nYlpuck5sTXg5bUZsRTk4VXRDRDI5","upper_bound":"RA==","repeats":1},{"count":416,"lower_bound":"RDRsYWVHQWh0bzVP","upper_bound":"RENSVzh1dEVhT1NaYmxLbA==","repeats":1},{"count":424,"lower_bound":"REUwbzI5cmw=","upper_bound":"RFFjUzJQQnBkSnV6ZzJxbk5Qd0M=","repeats":1},{"count":432,"lower_bound":"RFJUOW45UllHMjkxRHJRTmMxNDM=","upper_bound":"RFdOUDYyd1NKNkY0bHB6MDdOalFPUENrTHd5Ulo=","repeats":1},{"count":440,"lower_bound":"RHFrRFlPV256RU5nUFBreA==","upper_bound":"RHc2MXAwc3A0a0pmRVRi","repeats":1},{"count":448,"lower_bound":"RHl3ckE5MXhBUDdYZU5IZXda","upper_bound":"RTdNRklOSTNMTHFCazFlQTdTRFY1QzE1T3FMd2ZZ","repeats":1},{"count":456,"lower_bound":"RURoSlhtS3NZM1NUenUwdmRWS1A=","upper_bound":"RW5tVzNNenI=","repeats":1},{"count":464,"lower_bound":"RW9RaDNGa3RSOWVESVk1d0ljUzc0NmdO","upper_bound":"RXZubHE5a2drdFUz","repeats":1},{"count":472,"lower_bound":"RXpBdjVkcVBNWVF4OUhIV3VqOGFHWHIzYUw=","upper_bound":"RkxNcHFXdjh5NFp2RUg1YzNEZQ==","repeats":1},{"count":480,"lower_bound":"Rk5SZGNEYUx1bkZubXVzQmUwN0lVVg==","upper_bound":"RlpTcEhMWXpQVlpqbWoxazJSaFpQYXVZdVZNVkM=","repeats":1},{"count":488,"lower_bound":"RlppckE0YWVkaUNrZG5nRUg=","upper_bound":"RnAzU25Hd1c3Y1MxUExJR2RZUERV","repeats":1},{"count":496,"lower_bound":"RnJJU1NoVnNsSmhpYkFxeXU=","upper_bound":"RzBxVmk=","repeats":1},{"count":504,"lower_bound":"RzFaT1M2T240SmVNUEVZZnlnNGd2d0NkcTU0OUFIQg==","upper_bound":"RzU1Zw==","repeats":1},{"count":512,"lower_bound":"R0RZUjZpbmxkcGlXbWFNUXd4NVRhVHo1dWhWYng=","upper_bound":"R0hlRHRqT1l6WWNWcA==","repeats":1},{"count":520,"lower_bound":"R1VtVzNTOXFNbjl4dkJoSHp3Vg==","upper_bound":"R1dkRWdoczFLcA==","repeats":1},{"count":528,"lower_bound":"R1hBYVZJMHI=","upper_bound":"R2lyQldsWQ==","repeats":1},{"count":536,"lower_bound":"R29IVTZQMjVJT0I=","upper_bound":"R3FqQjBxc25Db2FjUjc4N1lHMm1hR2N1UWVabFd5MHo=","repeats":1},{"count":544,"lower_bound":"R3VURlhISXZXbjNZbmxPUXI4OEtxS1diMUt3ckl4b1k=","upper_bound":"R3haczhWRjY5M0s=","repeats":1},{"count":552,"lower_bound":"SA==","upper_bound":"SDBnTGRWcFFsMFJMTjRtVDJ4enFJU25KUmtmRWlDRHA=","repeats":1},{"count":560,"lower_bound":"SDExMlR2Qk9FQjNRbkJxNVNOZEpNZTFjTUhpNjZM","upper_bound":"SEF3SkhYdnhBUGlnem9JUDVBNGNTbUc=","repeats":1},{"count":568,"lower_bound":"SEJW","upper_bound":"SExaRjFQT1dsRWdXRQ==","repeats":1},{"count":576,"lower_bound":"SFRZ","upper_bound":"SGFpb3dHeWdKWGdiNjNwMmFURWNXMVli","repeats":1},{"count":584,"lower_bound":"SGVrMDkxNjBIa2xJUTZObnc1SQ==","upper_bound":"SGxyUHpZZDNXeEVKcGcz","repeats":1},{"count":592,"lower_bound":"SHBEM1pKa3pQOTJIZzkxUXltbGVyVmxKQmRiRmVpOQ==","upper_bound":"STdPSGxEYzY5aExtc3JUMGpxRlBSV0Rt","repeats":1},{"count":600,"lower_bound":"SUNNZUlPb2Jzd3Y4WnRvQTJRRXZ4N0t5d3c=","upper_bound":"SUQ=","repeats":1},{"count":608,"lower_bound":"SUZHaUM=","upper_bound":"SVVpTDU0eXBCMXhJZA==","repeats":1},{"count":616,"lower_bound":"SVYyQ0VEYnZmTzYzNkQ=","upper_bound":"SWFKcHhUSFhWNUta","repeats":1},{"count":624,"lower_bound":"SWFqamVYNXVEQU5DOE94ZG5rRVJyNkZxaVVtOXMzNg==","upper_bound":"SWdKSzVOQ211WnNEamUyOEgxUHpTOHJTYg==","repeats":1},{"count":632,"lower_bound":"SWozTU5nNXhTdmFqNFkyck9qelk3TEQ3bEk=","upper_bound":"SWxIZ1lIZFVxTkxPVm92a2x3WHowd2FX","repeats":1},{"count":640,"lower_bound":"SXI1dDFCQmI4dVhZd2s=","upper_bound":"SXU5THNVS01xNDhaZVUyZGIz","repeats":1},{"count":648,"lower_bound":"SXZsT0lZRldqeDBo","upper_bound":"SjdBNUd6d2RM","repeats":1},{"count":656,"lower_bound":"SkZaWEJHanE=","upper_bound":"Sks2","repeats":1},{"count":664,"lower_bound":"Sk1LNnA0Vk4xSlJyMjJtblJPRTQ0UA==","upper_bound":"SmR2dWtia1BVdk4xdG5CdVZpcTRZeA==","repeats":1},{"count":672,"lower_bound":"SmUxN1dqS1JaZDY=","upper_bound":"SmprMFFzR1UxR3lhOWJ5SjdZNFNIaXllWTByRHBITA==","repeats":1},{"count":680,"lower_bound":"SmtXbFZjQ1kzSEI=","upper_bound":"SnFUYzVBSGZKdHVtalFPSWFOYUxkT1ZYbHE2WHU=","repeats":1},{"count":688,"lower_bound":"SnVrU3hVa2F4cUU=","upper_bound":"S0poT1QxUzNrMDBXVW1BSHdJZ0tUUTQ=","repeats":1},{"count":696,"lower_bound":"S1ZZTjdHNW4zSDRH","upper_bound":"S1l0Sk1zeDFYTWVIb0xmcA==","repeats":1},{"count":704,"lower_bound":"S2RCc3JCa0tQVDlkYVJrWGJSWkd5TmJpeFZ1dnA=","upper_bound":"S3VUSzBLcHJhcGJXYWxyNmt4Q1c0","repeats":1},{"count":712,"lower_bound":"S3oxcHdqMEZoSmdldEY=","upper_bound":"TDBUTjVZN090RldJR2dMVm8=","repeats":1},{"count":720,"lower_bound":"TDI=","upper_bound":"TEUzVGJIazg=","repeats":1},{"count":728,"lower_bound":"TEVFQTA3Qkl3NkRCOXFoZGV6MHlpZEpmNm4=","upper_bound":"TEpPSEROa05ZMzU4R1g1","repeats":1},{"count":736,"lower_bound":"TE9kSmV3VzllUEluejlzZHN5RDRwWjFXaEZk","upper_bound":"TG5YWQ==","repeats":1},{"count":744,"lower_bound":"TG9JbW0wUVF0clp0b0RrUkVheEZBMQ==","upper_bound":"TTVpVWFIWTdqTEliQmV6cw==","repeats":1},{"count":752,"lower_bound":"TTlpYXloa2c=","upper_bound":"TVhlcVZpN2dmcWZPZWVRcQ==","repeats":1},{"count":760,"lower_bound":"TVhzekl6eUYxcTVPZw==","upper_bound":"TW5VY0NuamxGVm9FdW5qQ2NTQmI4SzBHa2ZaM21z","repeats":1},{"count":768,"lower_bound":"TjRzQ2pSQVQwd05OYXByRFFsS2dOcEZxdWliSm9McjQ=","upper_bound":"TkY0RTR0V3NiQUlkdjk0c0o5MEw4QlB6dmswTkVPUg==","repeats":1},{"count":776,"lower_bound":"TklOdFJoMU5NTUhHdjU5ekJoYjZicA==","upper_bound":"TlBqT3lFRHhORnM1ZVl0Y2I3UENqaUdxaXM4MzNVZQ==","repeats":1},{"count":784,"lower_bound":"TlZjTkdvNDFBam9u","upper_bound":"TmpPTWs=","repeats":1},{"count":792,"lower_bound":"Tm14VVVWV0VQRA==","upper_bound":"TzNPOFo=","repeats":1},{"count":800,"lower_bound":"TzRnUHFkekkwNE1haU5xTjlXbFY=","upper_bound":"Tzh3ZzQ=","repeats":1},{"count":808,"lower_bound":"TzlucndyUzE5V1ZrcHBoZVlUVm90bUxN","upper_bound":"T1BMZmtDS3FpZ05EM0xOZXVLZms2","repeats":1},{"count":816,"lower_bound":"T1Ez","upper_bound":"T2s3MkVWeGNJbHBN","repeats":1},{"count":824,"lower_bound":"T3BlWGtLUA==","upper_bound":"T3lHY0Y4VE44eWw=","repeats":1},{"count":832,"lower_bound":"T3lU","upper_bound":"UDE0djh2eFA=","repeats":1},{"count":840,"lower_bound":"UDJDOFZQSktzNVIwWkI=","upper_bound":"UEpBeFNzSVlC","repeats":1},{"count":848,"lower_bound":"UExDNnFKRDZ4UkxXYldxcm9WeVJzNzE5OFdoaTFRNw==","upper_bound":"UFduZEZST3o0bHExSm8=","repeats":1},{"count":856,"lower_bound":"UFk1blpq","upper_bound":"UGtEREhOejM2eg==","repeats":1},{"count":866,"lower_bound":"UG51MFBo","upper_bound":"UQ==","repeats":3},{"count":874,"lower_bound":"UTI3THJTMWZtR2REUQ==","upper_bound":"UUFYSHBZZmNZNTdMaUFYQlo=","repeats":1},{"count":882,"lower_bound":"UUJla3JpNk5tSklhN1NLaEdrUg==","upper_bound":"UUpBQUtmTGdTS3RPeWM=","repeats":1},{"count":890,"lower_bound":"UUtRVVRpYW9haklmUGtPeEU2NjQ=","upper_bound":"UVhMUEkycm50T2hEMlpWOW1haThLdXp0S0h1SXV6TDc=","repeats":1},{"count":898,"lower_bound":"UVpUdm5M","upper_bound":"UWxXQ3ZNbGEyN3NpeXFobDRJZzJCTmZw","repeats":1},{"count":906,"lower_bound":"UXVWMkNkcnJWTEdkUEtDN3Rk","upper_bound":"Ug==","repeats":1},{"count":914,"lower_bound":"UjF6eDZRRTl5MnVaa0VBWEs2VzlNTkhneDVhRTEya3g=","upper_bound":"UkJ2aml3WmxvMUFpMTRhRWVsQXJtRWtnWg==","repeats":1},{"count":922,"lower_bound":"Ukt1Rk1vZjlMUFFrUzYyeExNTHJr","upper_bound":"UmFvYzBxMWl1N0NJaWtvR1hIUll3b3pReWtBbXg=","repeats":1},{"count":934,"lower_bound":"UmU5NkpBdFlXaHpLT2FZT1JkOEc=","upper_bound":"Uw==","repeats":5},{"count":942,"lower_bound":"UzFTd2UxV0xFYUdV","upper_bound":"Uzk0Vk5qUFU1cUZnd3hNZmVPd1lzZA==","repeats":1},{"count":950,"lower_bound":"U0M3QkNiTUM0Zjhj","upper_bound":"U1B5NkJXWUZiTmJMU3VzeWlLSVlYdUpSeUZXdXM=","repeats":1},{"count":958,"lower_bound":"U1MzODBoWjVBbWM4UW1IS3Uw","upper_bound":"U2NYcE1EdzlwUzJZ","repeats":1},{"count":966,"lower_bound":"U2RIMQ==","upper_bound":"U25LSw==","repeats":1},{"count":976,"lower_bound":"U3JTY3dwVVk=","upper_bound":"VA==","repeats":3},{"count":984,"lower_bound":"VEZxdUVVYUhmWkhxWHN3N2txNg==","upper_bound":"VFJwc09ySQ==","repeats":1},{"count":992,"lower_bound":"VGN3TklxSnVEVU1JWUpaZXR1cA==","upper_bound":"VHFZdllwTWlWOHhtTkhqc3E=","repeats":1},{"count":1002,"lower_bound":"VHRyRk1hV0ZUNndkbm44bEdUWlZyY0I=","upper_bound":"VQ==","repeats":5},{"count":1010,"lower_bound":"VTlNVTlxMTNjSEV4TlpSaFVXSw==","upper_bound":"VUV2V0JWUnZaTFpqUFZZRHNDNg==","repeats":1},{"count":1018,"lower_bound":"VUlLbWVpeG9HOXREYTNpN2RNRmQ=","upper_bound":"VWhBR0NHM2ZD","repeats":1},{"count":1026,"lower_bound":"VWloY2xrZA==","upper_bound":"VXZTTFdUSElOUlM3WlN0ODJHbUJ6NzluQUlKWnV4MHE=","repeats":1},{"count":1034,"lower_bound":"VXlGMEZST0s4Wlo=","upper_bound":"VkNOTDRPVGZOVnVUUVlpNkt1Sg==","repeats":1},{"count":1042,"lower_bound":"VkZnYTRGUVdhaXQ4Z0xhUkVmeEdab0lWOGVr","upper_bound":"VmtNOVo5NktRTlhyQThZc1pvNkw=","repeats":1},{"count":1050,"lower_bound":"Vm1Udg==","upper_bound":"Vnc1VGJpa2pYYkJJZEZlaXFQN0VITElvVXdWa2Znemo=","repeats":1},{"count":1058,"lower_bound":"VzFKVlJZWXV5Nk01Tkp4TWplbA==","upper_bound":"V0VnbFVORzdDUVd2SXFoUWxUZFlST3Bt","repeats":1},{"count":1066,"lower_bound":"V0hWNDMxQmFMcHRuTU8wT0ZTWHZGcWNxY1FVcHMzSQ==","upper_bound":"V013ag==","repeats":1},{"count":1074,"lower_bound":"V1VzUXRSOEtqc24=","upper_bound":"V2xKanFycU9vWk9pRFg4UQ==","repeats":1},{"count":1082,"lower_bound":"V3A=","upper_bound":"V3Y2dld6Skt0dGk1YzlV","repeats":1},{"count":1090,"lower_bound":"V3laVERLeGxrcDZxUXdkMTBzUDh0a2dtbFFJR0VXUg==","upper_bound":"WEI4eTJ1VGdXVXI=","repeats":1},{"count":1098,"lower_bound":"WElleG9wSVVIYUdhVmcwUzRaekdteWxlaA==","upper_bound":"WE40Sld3RGtjUFdIelI=","repeats":1},{"count":1106,"lower_bound":"WFVWbndBd0VvU3Y3YVh1Vg==","upper_bound":"WGxsdU1FVXFzbXhaenVReHZ3UEFueTd1bjlGSg==","repeats":1},{"count":1114,"lower_bound":"WHI5ODJlMnZ0UkFnZ0JNQ3ZLM0pJQUV6SXlMbFBZ","upper_bound":"WHpwM25FM2NiSlRWQ3FKVE5KNFZUUHFV","repeats":1},{"count":1122,"lower_bound":"WTlzVUlqNkxkRUZaWU9jdklXQU0wU3o=","upper_bound":"WUtnYWoyag==","repeats":1},{"count":1130,"lower_bound":"WUw4a090M09oaFpYRlk=","upper_bound":"WVFtbDlFajZFNTc=","repeats":1},{"count":1138,"lower_bound":"WVRMckVsZg==","upper_bound":"WWhVeA==","repeats":1},{"count":1146,"lower_bound":"WXBwVU9JT0FaTXhiSkNzVXNxcENJalRI","upper_bound":"WXZyRzRGWm9q","repeats":1},{"count":1154,"lower_bound":"WjJxMlRyRVlKV2hUMkJ2R05iVnpuOGMyYW9qMw==","upper_bound":"WkVWbzlvOHVaRjVCMnY=","repeats":1},{"count":1162,"lower_bound":"WkZRbUw5eHhhSGNacWVn","upper_bound":"Wk5oSU1GMmtZcDR6RVRocktOTGtK","repeats":1},{"count":1170,"lower_bound":"WldCRnlmU1pX","upper_bound":"WmViT3JpOUdESGQ5d2VjRzY3Nw==","repeats":1},{"count":1178,"lower_bound":"Wmk1U0xBRzl0QVlGdVI2M1B0UTB5NVE=","upper_bound":"WnI4eg==","repeats":1},{"count":1186,"lower_bound":"WnJ5Yg==","upper_bound":"YUQySWdRUVg3MGp2dHhidjJNd0Zzb05jTDFBcXQ=","repeats":1},{"count":1194,"lower_bound":"YURyNFFxODNVNktpWHBwYW5m","upper_bound":"YVdoUXBJc3RKZjJQaVcxaEd5","repeats":1},{"count":1202,"lower_bound":"YWJJYkJFUlgxQmNySEhpSQ==","upper_bound":"YWlzY3dvOFB6b3FpaQ==","repeats":1},{"count":1210,"lower_bound":"YWtaV2dmcGYzVkhlVEtrcw==","upper_bound":"YXRmWTdmVg==","repeats":1},{"count":1218,"lower_bound":"Yg==","upper_bound":"YkV3cw==","repeats":1},{"count":1226,"lower_bound":"Ykk=","upper_bound":"YlN4Y1dQNzlURzQ=","repeats":1},{"count":1234,"lower_bound":"YmNyU0VsY2s=","upper_bound":"YmlhZkNpYXRwNEdEa05hUGQ=","repeats":1},{"count":1242,"lower_bound":"YmtBNjhvdkp2RjNH","upper_bound":"YnY1a0FhdQ==","repeats":1},{"count":1250,"lower_bound":"Y0EzRTlKUldHcHVTUHdoQ1FOQUFUVjlPM1dpU2s=","upper_bound":"Y09QZ0daaHRVOHg=","repeats":1},{"count":1258,"lower_bound":"Y2lUSDFtazlyWmFIdg==","upper_bound":"Y3VjaVdzUA==","repeats":1},{"count":1266,"lower_bound":"Y3pvSDBPVnd3Q1NmbURKM05uV3dpYWlMZUt1","upper_bound":"ZEN6alM=","repeats":1},{"count":1274,"lower_bound":"ZEdoSw==","upper_bound":"ZFVNazJqcDRBSTRPVDIx","repeats":1},{"count":1282,"lower_bound":"ZFZicG5pOWpqU1puRGpLOQ==","upper_bound":"ZHVzbEt1YlFQODd1TmtvUko=","repeats":1},{"count":1290,"lower_bound":"ZHZTRWJvUjU=","upper_bound":"ZTM4N1U5UmtGWXBONEhPSlVLVVFnanJiNQ==","repeats":1},{"count":1298,"lower_bound":"ZTVqazZGUUpNN0psdHVFYklDZnY4eHlPb09nSkd0TQ==","upper_bound":"ZTlHa1VmU0hmUTBPZVBoZ0ZpRUU=","repeats":1},{"count":1306,"lower_bound":"ZUJ5RzMySHB1RlE4SUJZSnVtVlZnQ3JPYzE=","upper_bound":"ZVdvcg==","repeats":1},{"count":1314,"lower_bound":"ZW1OdVVoN2dxR1V2ZkVFcGFDYjB0Zk5mS1Nn","upper_bound":"ZjNaOU1zQw==","repeats":1},{"count":1322,"lower_bound":"ZkVxckhSQU9FR09Vbg==","upper_bound":"ZkltVFZvMWVRYmJw","repeats":1},{"count":1330,"lower_bound":"Zkt6OVUzaEJldXJuZHMzM0tKNWxJU3VWM21tRA==","upper_bound":"Zld0eHBPTDR3ZGR4QWR4Y1piako2OHVrdDI=","repeats":1},{"count":1338,"lower_bound":"ZmVOZGIzaHdja3o=","upper_bound":"ZnBDeFphc2RQTDI1TXY=","repeats":1},{"count":1346,"lower_bound":"ZnQxbTkwcjFkbUpraDZ2Rmczdkc4UU50TzlaeTMzSlk=","upper_bound":"ZzR5YnBpckQ=","repeats":1},{"count":1354,"lower_bound":"ZzVaZkpFag==","upper_bound":"Z1Y=","repeats":1},{"count":1362,"lower_bound":"Z1ZscjByWQ==","upper_bound":"Z2RaVXF0T0kxQ3NoaE1Rb3RMQ2h3eDRETlUza0U=","repeats":1},{"count":1370,"lower_bound":"Z2tTZ3JIeGFKWlVRT0o=","upper_bound":"Z285TXJVMGJaYnJ5eUx4MlFHM1A=","repeats":1},{"count":1378,"lower_bound":"Z29jOFJqQXZXVVZoREc=","upper_bound":"Z3R0WDU=","repeats":1},{"count":1386,"lower_bound":"Z3gzZlR5V1N6eW9ER2MxYWtNaUVBUUFt","upper_bound":"aDRTM2tzWU52MW5OV29tVTUwNWFOSkxDUWJUMA==","repeats":1},{"count":1394,"lower_bound":"aDZnYzlvSnVKaHAxZjkxZEoyWUd2ck9aSHZvWWk=","upper_bound":"aDk0TU5aVjRIRjBaNjFldWlHcW5nTkZBZFAxN2Z3","repeats":1},{"count":1402,"lower_bound":"aDlZNmdhN0M4YmtLbkg4bjBuS0FDc2htQlZW","upper_bound":"aFRL","repeats":1},{"count":1410,"lower_bound":"aFVNMg==","upper_bound":"aGRxMXFMRWtDcHQ0","repeats":1},{"count":1418,"lower_bound":"aG4zT3ZKejI=","upper_bound":"aHVoUkhzT05nWlRpbXU0a1dOMmhac1Qyb2hyMWk=","repeats":1},{"count":1426,"lower_bound":"aHV6azlQVnNuM3V4OXBXejZtN0ZOM3E=","upper_bound":"aHpRcVVjUGQ4REFPajE=","repeats":1},{"count":1434,"lower_bound":"aTJ6WVNsaEdkRXRDODRWSnFhTEw=","upper_bound":"aThMOGJEWlhKNg==","repeats":1},{"count":1442,"lower_bound":"aTlqY0ROR3ZzYWdCWjNwRGZINFhUMzlrVDVBdXpqSk8=","upper_bound":"aUg3aHFSNkE4","repeats":1},{"count":1450,"lower_bound":"aVNNeFNxNGVSQng3WmwySk1rZUJtaUs0YjJCVWJHTg==","upper_bound":"aVY0cDJXeHVwcFJPbDNw","repeats":1},{"count":1458,"lower_bound":"aVdLOW81VWNXeXI4Skh5YlA5ZUw=","upper_bound":"aWFPMjdZdmg2MWdveXZ0ag==","repeats":1},{"count":1466,"lower_bound":"aWluRWxXZkJURGtSaEd2UFdjR2wzNm1qMmFQNEs=","upper_bound":"aXZISUw4UU1aN0p3VVVnblBT","repeats":1},{"count":1474,"lower_bound":"aXkxY2VKV2FiN3F4V2tEcGk2MnVXMjdl","upper_bound":"ajQxa01WMjZ6ZEprTUJ3VW8=","repeats":1},{"count":1482,"lower_bound":"akQ=","upper_bound":"alNGMW1JVmZxUDAyM3BZalo=","repeats":1},{"count":1490,"lower_bound":"alRjUTJvYUVHYnF5bE5oYXdSeWlDSUU=","upper_bound":"ampPT3h2OUloSEJ0ME12","repeats":1},{"count":1498,"lower_bound":"anJFdkNiWmZ3QVlJTEhEZlVLVGdrdE5ySzhoU3Y=","upper_bound":"a0EwaUJ0Y1p0QjZ2dFNTNHZwYnNi","repeats":1},{"count":1506,"lower_bound":"a0QzbVdXYU9ZOVQ0S1hrT3oz","upper_bound":"a2NQSUFXRmRvcU53VjVTM24yaE8=","repeats":1},{"count":1514,"lower_bound":"a2NRYU8zc25SQlV3SW5XeDRy","upper_bound":"a2xJQzJnb3padVg1UGZpdjA=","repeats":1},{"count":1522,"lower_bound":"a24=","upper_bound":"a3duajZx","repeats":1},{"count":1530,"lower_bound":"a3k2TldkbktocGxMaWw2TFRkQkdIUA==","upper_bound":"bDZ0dkpicHBnNWNKeWptUUVJZEN2aQ==","repeats":1},{"count":1538,"lower_bound":"bDczM3cxQ0pvMGVWTUJSTkdjaXhCNg==","upper_bound":"bEpDc2RpY3hYdVFFZmpBNWhkS3U2Tg==","repeats":1},{"count":1546,"lower_bound":"bE4xTVIyb082OFN6MXM=","upper_bound":"bGJvNFlU","repeats":1},{"count":1556,"lower_bound":"bGVkUlNiQ1ZFUlp3QlpDNXZpcmpHY1pTbjNOWkp4","upper_bound":"bQ==","repeats":3},{"count":1564,"lower_bound":"bTlOVGtSODRQQVRSdlZN","upper_bound":"bU4xWDlKOUpnSw==","repeats":1},{"count":1572,"lower_bound":"bVVJNXhwOG42MQ==","upper_bound":"bWV2Wml1blllYnF4aFFRZXQzU3V2cg==","repeats":1},{"count":1580,"lower_bound":"bWYwbXFmSVRmOWxGZg==","upper_bound":"bg==","repeats":1},{"count":1588,"lower_bound":"bjNKbE1FeTc0Tk1PaFJJQ21PWGZ0Wg==","upper_bound":"bkpEZlExN2xSTjRN","repeats":1},{"count":1596,"lower_bound":"bkx6aTlOdVZGVlhFend2NXhQN2lTaFRicw==","upper_bound":"blgzQVR0S0t5VQ==","repeats":1},{"count":1604,"lower_bound":"blg2","upper_bound":"bmVC","repeats":1},{"count":1612,"lower_bound":"bmVrT2NF","upper_bound":"bzZjZGlWV0ZIOWIzUEg1Wlp4SENRQlM=","repeats":1},{"count":1620,"lower_bound":"bzlmMWhJT2JqcW8zaXRPTksyUHdqU0VVdw==","upper_bound":"b0pJck5CWUZxN0IzbEplWVJscGdEMGNOd0Mxdm0=","repeats":1},{"count":1628,"lower_bound":"b09F","upper_bound":"b1FTWnNENml6enV5c2xU","repeats":1},{"count":1636,"lower_bound":"b1I=","upper_bound":"b2J6ZDdseA==","repeats":1},{"count":1644,"lower_bound":"b2NORGpTVUx1MlR5","upper_bound":"b3JLMExraTc=","repeats":1},{"count":1652,"lower_bound":"b3R0TTc=","upper_bound":"cEE=","repeats":1},{"count":1660,"lower_bound":"cEZVbQ==","upper_bound":"cEp2d1ZGMzdqNFk1cnpEenNJWg==","repeats":1},{"count":1668,"lower_bound":"cFBjUll0aXlyQ3JqSVF5dDk0cGI=","upper_bound":"cFdWQ3BMdXZ1aUFXeHZGeVIxaTcwRA==","repeats":1},{"count":1676,"lower_bound":"cFhCOHJYekVxUm1yMHlSRlk=","upper_bound":"cHY1UENYZVBhVzgzM0U=","repeats":1},{"count":1684,"lower_bound":"cHpCYzc=","upper_bound":"cUVsN1hPREJ5","repeats":1},{"count":1692,"lower_bound":"cUdncDdLaVdEbzQ=","upper_bound":"cVB0Q05UQ3NzeU1DYnQxSE9ESDBaUWM=","repeats":1},{"count":1700,"lower_bound":"cVZhSVU5Q2VpMmdoaXBHaFpUZU1hUnV3QzA2Mw==","upper_bound":"cWZZSlNic1ljc1kwc25XUzNQSGI1UEhEZ3QxNkQ2","repeats":1},{"count":1708,"lower_bound":"cWc2WnBobVk=","upper_bound":"cW9vaVIyVjI4RmJtNnk=","repeats":1},{"count":1716,"lower_bound":"cXdCTXJYeVhoU2c1Tg==","upper_bound":"cjRhbHZaY0NPcUVKdlpPMGo=","repeats":1},{"count":1724,"lower_bound":"ckZaeklOWGZj","upper_bound":"clFDbmZJa3cwTGdnTnJ1TnFFUldxMzZac2Y=","repeats":1},{"count":1732,"lower_bound":"clFEb3h0T0NzZHhVNU8xNjQwT3JDeGYzTVFxQTh1","upper_bound":"cm13U0VUUTNrV05nUVZZR2hwZVViQlJQMDVQYlM=","repeats":1},{"count":1740,"lower_bound":"cnJFc01aYnBSdFdMY0ZvRDhqdmJxZEc=","upper_bound":"cnl2dQ==","repeats":1},{"count":1748,"lower_bound":"czdMYkNSdXdRRDBiRWtTd0hnWnlNR3Vn","upper_bound":"c01ZZ3k3WWJJVjd4N1lJTjF0azNvbVRLOUptTA==","repeats":1},{"count":1756,"lower_bound":"c09MZQ==","upper_bound":"c2YzSk9LZXI=","repeats":1},{"count":1764,"lower_bound":"c203","upper_bound":"dDVFd1RuSHhWbzk2UW5IUGJJR3h4","repeats":1},{"count":1772,"lower_bound":"dDhZNzA=","upper_bound":"dEVNMmR1TUk2UklURHk=","repeats":1},{"count":1780,"lower_bound":"dEcxeXl5Z055WEJUZWV1T0VKZ3dhNG9tbGJKYTdlOG8=","upper_bound":"dEoxMEU5WGRhcmh6dmg0ckdWRjlnZXRT","repeats":1},{"count":1788,"lower_bound":"dEt0QkVtMzNGVDd4b2xB","upper_bound":"dFcxZ3p5SHpNakV4ZG1mSXRVeWdzaTlTVFNT","repeats":1},{"count":1796,"lower_bound":"dFd6QU95b0Y=","upper_bound":"dG0wUkZtcms3azQ=","repeats":1},{"count":1804,"lower_bound":"dG1O","upper_bound":"dHhpRmRMekVOSURCNUFkenk5","repeats":1},{"count":1812,"lower_bound":"dHhvQkZVZnBY","upper_bound":"dThzYWRiM21RN0dacjRnN3VQY1BYeTdzenU=","repeats":1},{"count":1820,"lower_bound":"dUQ=","upper_bound":"dUp3SkNHN1hmUmRsYWVpTEo=","repeats":1},{"count":1828,"lower_bound":"dU4zTlNIS2xXSzh2N0pmVDlzODU5","upper_bound":"dVlLSXZT","repeats":1},{"count":1836,"lower_bound":"dVlUYnlXYQ==","upper_bound":"dW1rbE1M","repeats":1},{"count":1844,"lower_bound":"dXBWRUZwQThWRlYzWWloMHJFbTk4M0FuQ0ZI","upper_bound":"dXdmRlRaWFQ0dEdhTTRnUGR5SlFwdklNVVp3YVc=","repeats":1},{"count":1852,"lower_bound":"dXk2RDhOb1BpRHNkcw==","upper_bound":"djY5djY=","repeats":1},{"count":1860,"lower_bound":"djZiSUMyR0JhdHY=","upper_bound":"dk9yQ3NWWWVnaEhlNg==","repeats":1},{"count":1868,"lower_bound":"dlJTRUNVaWlLRXYyWno5dnhMWVVnYXk=","upper_bound":"dmNZYWxsSVQzc0F2NkhPbG1tSjQ=","repeats":1},{"count":1876,"lower_bound":"dmRPNEVoeWxlTHZHZ1pvWlFncWQ=","upper_bound":"dm44cE1SYm5zbFF6dnpsR3Y0MTROdw==","repeats":1},{"count":1884,"lower_bound":"dnF2Yk9VZ0pEdmlvRGFNVFVhWUd4R2hENA==","upper_bound":"dzUzZDAzaWs=","repeats":1},{"count":1892,"lower_bound":"dzdHZ1FmaURyQTJ6VQ==","upper_bound":"d0RZU0FsOA==","repeats":1},{"count":1900,"lower_bound":"d0VaV3d3WjRRbA==","upper_bound":"d0dtUXFYYUFCQnZ1b0dEeUFMbTE=","repeats":1},{"count":1908,"lower_bound":"d0lWNHdXNA==","upper_bound":"d1VHd21JV2prUHU1Y0xWb0tSTlR4c0V5","repeats":1},{"count":1916,"lower_bound":"d1lqeHliVjB4ZXp1THo3MWJp","upper_bound":"d2VJUXdLY21SZ213TkFndmI0MjJjd1E=","repeats":1},{"count":1924,"lower_bound":"d29rWWJNNTV6OUdGS0w=","upper_bound":"eDJ6bGo0TEhibzhRTmp3Vjc1dVFUZ2pEeG90dUQ=","repeats":1},{"count":1932,"lower_bound":"eDRTaXJaamJ2WlBpbFpnaGVqM1cxd2ZUOHVkMG4=","upper_bound":"eEZ3Uzd0","repeats":1},{"count":1940,"lower_bound":"eEp0bTY0WWZNRWtWN3pBaTI=","upper_bound":"eFFRZXVhTjl5Z0d3NVJWTEhzdGtKNVA=","repeats":1},{"count":1948,"lower_bound":"eFhOS2lQaQ==","upper_bound":"eGVmeVBOd3g5RXRWbg==","repeats":1},{"count":1956,"lower_bound":"eGVqVVlUeU1HT3Ez","upper_bound":"eHNF","repeats":1},{"count":1964,"lower_bound":"eTBubXU=","upper_bound":"eVB3bFYzWHMxWUVXOXpzMVd4alptRndUUlNEODM=","repeats":1},{"count":1972,"lower_bound":"eVNJNHViVXZGa3ROdnBBaw==","upper_bound":"eWFPM29PQU9hUEppMQ==","repeats":1},{"count":1980,"lower_bound":"eWJIbFFRc1p3MVB0","upper_bound":"ejE=","repeats":1},{"count":1988,"lower_bound":"ejY1ZTJhTkhMVmpQVmxtNHdnWnJhbVg5ZDVlMW4=","upper_bound":"elFVR2ROaDJtcG5hUTJuN0xnZnRsclYz","repeats":1},{"count":1996,"lower_bound":"elM2dUUxTHpU","upper_bound":"enBUQnhwRURCZ2h3T05XSw==","repeats":1},{"count":2000,"lower_bound":"enc4a1VpSHJJU1Q1NmpJZQ==","upper_bound":"enl1czFl","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,2,2,3,2,3,0,2,1,1,2,0,0,1,0,3,1,2,0,2,1,1,1,2,0,2,0,2,1,1,0,2,1,1,3,1,0,1,0,0,0,0,2,2,0,1,3,1,2,1,2,0,2,2,1,0,0,0,1,0,0,1,3,0,0,1,0,2,2,1,1,3,0,1,0,2,0,0,1,1,2,3,0,0,2,0,0,0,1,1,2,0,2,5,0,1,1,1,0,1,1,0,3,2,0,0,0,0,0,3,0,1,1,3,3,1,0,0,1,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,3,1,0,2,0,1,2,0,3,0,0,0,2,3,1,0,0,0,3,1,0,0,2,4,2,1,1,1,0,2,1,2,0,1,1,0,0,2,0,1,1,1,1,0,0,0,1,0,0,1,1,1,1,2,0,1,0,2,0,1,0,0,1,0,0,1,0,0,0,2,0,2,0,1,0,0,1,1,3,1,0,0,1,0,2,0,1,0,0,1,0,1,0,1,0,2,2,1,1,2,1,0,0,0,1,0,0,3,1,1,0,0,1,0,2,0,3,0,2,0,2,3,0,1,1,0,1,0,1,2,0,1,1,1,0,0,0,1,3,0,0,1,2,2,0,2,3,2,5,0,1,3,1,2,0,1,1,0,0,0,1,0,1,2,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,1,0,1,1,1,1,1,3,2,2,0,0,0,2,1,0,2,2,1,0,2,1,1,2,0,1,0,1,1,1,1,2,2,1,2,2,0,1,2,3,1,2,0,2,0,1,0,0,0,0,1,2,1,1,1,2,0,1,0,1,0,3,2,1,0,1,0,0,0,1,1,0,0,3,2,3,2,0,1,1,2,2,0,3,0,0,0,1,0,1,0,2,1,3,1,2,0,0,0,0,0,0,2,0,0,1,1,1,1,1,1,0,1,0,1,1,1,2,0,2,2,2,1,0,3,1,1,0,1,1,1,2,1,1,0,0,1,1,1,3,1,2,2,1,2,0,1,2,1,1,1,0,0,5,1,2,1,2,0,0,0,0,0,2,0,1,0,0,2,0,0,3,1,0,4,0,1,1,0,0,0,0,1,1,0,1,2,1,1,1,1,1,0,2,0,0,3,0,1,1,0,1,2,1,0,1,2,1,1,0,0,0,2,0,0,1,1,0,0,1,4,0,1,1,1,5,0,0,2,1,3,1,0,2,0,1,1,2,1,0,1,3,1,0,3,2,0,0,0,1,1,0,0,1,1,0,3,1,1,0,2,0,1,1,0,0,0,0,2,0,1,2,0,0,1,2,1,1,1,1,1,1,0,0,3,0,0,1,0,3,1,0,0,1,0,1,0,1,1,1,0,1,2,1,1,0,2,0,0,0,3,1,0,0,1,1,1,1,1,1,0,0,1,1,1,0,1,1,0,4,0,2,2,1,0,1,2,0,1,1,1,3,0,1,0,1,2,1,1,1,1,3,0,0,0,0,0,1,1,1,0,0,4,2,1,1,0,0,1,0,0,3,2,2,1,1,1,1,2,0,0,1,2,1,1,0,1,0,0,1,0,2,1,2,0,1,2,0,4,3,1,2,2,1,0,1,2,2,0,2,2,0,1,1,0,0,2,1,0,1,1,2,3,1,0,0,1,2,5,1,2,1,0,1,0,0,1,1,2,0,4,2,1,0,1,1,3,1,1,2,0,1,2,0,1,1,1,0,0,2,3,2,3,0,2,1,2,0,0,2,0,2,1,1,3,1,0,1,4,0,1,0,1,0,2,1,1,0,0,1,1,1,0,2,1,1,1,1,0,2,2,0,1,1,3,0,3,0,1,2,1,1,0,0,0,1,1,3,2,1,2,1,2,2,0,2,3,3,1,2,0,3,3,0,1,1,0,2,1,4,0,3,0,2,0,0,1,2,0,3,1,2,2,1,2,1,2,2,0,1,1,0,0,1,0,3,2,0,1,1,1,1,1,1,3,3,2,1,4,2,2,2,0,0,1,1,2,1,2,2,0,0,0,0,1,2,1,1,1,0,0,1,2,1,0,1,1,0,1,1,0,3,0,2,1,2,2,1,1,0,1,1,0,1,0,1,0,0,0,0,1,4,0,1,0,0,1,2,1,0,1,1,1,1,1,1,1,1,1,0,1,0,0,1,2,2,0,1,1,0,1,2,2,1,1,1,0,0,0,2,0,1,0,0,2,1,0,0,1,1,2,1,0,2,0,0,1,0,2,0,0,1,2,0,1,2,1,1,2,1,1,1,0,2,1,2,0,2,0,0,0,0,0,1,0,1,0,0,2,1,0,3,0,1,0,3,0,1,1,0,2,1,0,0,0,0,3,0,1,1,0,2,0,0,2,2,1,3,1,1,1,2,0,2,3,0,1,2,0,0,0,0,1,1,0,2,1,0,2,0,1,4,1,1,0,1,2,0,0,0,0,1,1,0,1,2,2,1,3,1,2,2,2,0,0,2,0,0,0,1,1,0,2,2,1,2,2,0,1,2,1,4,2,1,5,0,4,0,0,1,1,1,0,1,0,1,1,2,1,1,0,3,2,0,4,0,1,1,1,2,0,0,1,3,1,1,0,0,3,1,0,0,1,2,0,2,1,0,0,0,0,0,0,1,0,0,2,0,1,1,0,2,1,3,0,0,0,1,1,2,2,1,2,2,0,0,1,0,1,0,0,2,1,0,1,0,4,0,3,3,0,0,0,0,3,2,2,1,1,1,0,0,1,1,0,0,1,1,1,0,3,0,2,3,1,2,0,0,0,1,1,2,0,0,0,0,1,0,2,0,2,1,0,2,3,0,0,0,1,0,2,0,3,2,1,1,0,2,0,2,0,2,2,1,1,1,0,1,0,0,0,3,4,2,1,1,0,2,2,1,0,3,0,1,0,0,1,1,0,0,1,2,0,1,0,0,0,1,2,0,0,1,1,2,1,0,1,0,0,0,1,0,0,1,0,2,1,0,2,1,1,2,1,1,1,1,2,0,0,0,1,2,0,0,1,2,1,5,0,1,3,2,1,1,2,0,0,0,2,1,3,0,2,2,4,1,1,1,1,0,1,0,2,0,2,1,0,0,0,0,1,1,1,0,0,1,1,2,1,3,1,1,0,4,0,0,1,2,0,3,1,1,2,2,0,0,1,0,0,3,1,1,0,0,1,0,1,0,2,1,2,1,3,3,0,1,1,2,1,2,1,0,3,1,0,2,0,1,1,0,1,2,1,1,1,3,1,0,1,0,1,0,0,1,3,1,2,3,1,1,1,0,0,1,2,1,0,0,0,1,0,3,3,2,0,0,1,1,3,0,1,0,1,1,2,1,0,0,1,1,1,1,2,0,1,1,1,0,0,2,1,0,1,1,0,2,0,0,0,1,2,0,0,1,1,1,0,0,3,0,1,0,1,1,0,2,0,0,1,1,1,0,1,2,2,0,0,2,2,0,0,2,0,0,3,1,0,2,2,0,0,1,0,1,1,3,0,1,2,3,0,2,1,3,1,1,1,1,1,1,2,1,0,0,0,1,6,1,2,2,2,2,0,2,1,2,1,1,0,1,0,2,1,1,0,0,1,2,0,2,0,1,0,0,2,2,1,0,1,2,3,1,0,0,1,1,1,1,2,1,3,1,1,1,0,1,1,0,0,1,2,0,0,2,0,1,1,1,1,3,0,1,2,0,2,1,1,0,1,1,2,0,1,0,1,0,2,3,0,1,2,1,0,2,2,0,3,0,0,2,0,1,1,2,1,3,3,0,2,1,1,0,0,1,2,0,0,0,0,0,1,2,0,3,3,1,1,0,0,0,1,0,1,0,2,1,0,1,0,0,2,0,2,1,0,0,1,1,0,2,1,0,0,1,1,2,0,2,1,0,2,0,0,1,0,2,1,0,1,0,2,1,0,1,0,0,0,2,1,1,1,1,1,0,0,1,0,0,1,0,2,1,0,0,0,0,3,0,2,0,0,2,0,0,0,1,1,1,0,1,2,1,0,0,0,3,0,0,1,1,0,1,0,2,0,1,0,1,0,0,0,1,2,1,1,1,2,1,0,1,1,2,0,2,1,0,0,0,1,0,2,1,0,1,0,0,0,0,1,0,0,0,1,0,0,0,1,1,1,1,1,0,3,3,1,1,2,1,1,1,1,1,1,0,0,0,2,0,2,0,2,0,1,2,0,0,0,0,2,2,0,0,0,0,1,2,0,0,0,0,0,0,1,0,0,0,4,0,0,2,1,3,0,1,1,2,1,1,4,1,1,0,2,2,1,3,1,0,1,1,3,1,3,0,1,1,1,1,2,2,1,1,2,1,2,1,1,1,1,0,1,1,1,2,2,1,1,1,1,0,4,0,1,2,0,1,2,2,2,0,1,1,3,1,1,2,0,2,2,0,0,1,0,0,0,3,0,2,2,0,1,1,0,0,1,1,1,0,3,1,1,1,1,0,1,0,1,0,1,2,1,5,0,0,1,1,2,1,1,0,0,2,2,1,1,2,3,1,0,2,0,1,0,1,2,1,1,1,0,3,0,2,1,1,1,1,0,0,1,0,2,1,0,0,0,1,0,1,1,0,1,2]},{"counters":[1,2,2,1,0,1,1,0,1,4,1,2,3,1,0,1,1,1,1,0,2,0,3,1,0,1,0,3,0,2,0,0,1,0,0,0,1,2,2,0,2,0,1,0,1,1,0,0,5,0,1,1,3,1,3,1,1,2,0,0,2,0,2,0,1,1,0,1,1,0,0,2,1,0,0,2,5,0,0,1,1,1,0,2,0,0,3,0,0,1,0,0,3,1,0,0,1,0,0,0,0,1,0,5,0,0,0,0,0,0,2,1,0,0,0,3,1,3,2,1,1,0,2,2,1,2,0,4,0,2,0,1,1,1,1,1,1,0,1,0,0,1,1,3,0,0,0,0,3,2,0,1,2,1,1,2,1,0,0,0,1,0,0,1,3,0,2,2,2,1,2,0,0,2,0,0,1,2,2,0,1,0,1,1,2,0,0,0,1,0,0,0,1,1,1,1,0,2,1,2,0,2,0,1,2,0,1,0,2,0,1,0,0,4,1,0,0,1,2,2,1,0,1,0,0,0,1,1,3,0,1,1,0,0,1,1,1,1,1,3,0,1,1,1,0,2,4,0,1,0,0,0,0,0,2,2,4,2,2,1,1,0,1,3,1,1,1,1,1,0,0,1,2,0,0,0,0,1,1,0,0,1,0,0,0,3,0,1,1,2,0,1,3,3,0,1,0,0,0,0,0,0,0,0,2,2,3,1,0,0,0,1,0,2,0,0,1,2,1,2,1,2,0,0,1,1,1,1,4,1,0,1,2,1,0,1,1,1,1,0,1,0,1,1,3,0,0,0,0,2,0,1,1,3,0,1,0,2,0,0,2,0,2,2,0,0,4,3,0,1,0,1,1,1,3,0,3,0,3,1,0,4,0,2,1,2,0,1,2,2,1,1,1,4,0,2,1,1,1,1,0,0,0,2,1,1,1,0,4,2,0,3,0,0,0,0,2,0,1,0,0,1,1,0,2,2,1,1,0,0,0,3,0,1,0,2,0,0,1,1,0,0,0,0,0,1,0,1,6,1,0,1,1,0,0,2,2,1,2,1,1,2,3,1,2,4,0,3,2,2,2,1,0,1,2,0,3,2,0,1,0,1,1,1,2,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,1,1,0,1,1,3,1,2,0,1,2,3,2,2,1,0,0,1,1,2,1,0,1,2,3,1,3,2,1,1,0,2,0,2,1,1,1,0,0,0,0,1,2,1,1,2,0,0,1,0,0,0,3,0,0,1,2,1,3,3,2,2,0,3,1,1,3,2,1,1,1,3,2,1,1,2,1,0,0,0,1,0,1,1,0,1,1,1,1,2,2,0,0,1,1,1,2,1,1,1,1,2,1,2,1,1,0,2,0,6,0,0,0,0,0,0,1,1,0,1,0,2,3,2,3,3,2,2,1,1,2,0,1,1,0,3,1,2,2,0,0,0,3,1,0,1,1,0,1,0,0,1,1,2,0,0,1,0,1,0,1,0,1,2,1,0,1,3,3,2,0,0,1,2,1,0,2,0,1,0,0,1,0,2,1,0,0,2,1,0,0,1,0,0,1,0,2,2,1,0,3,1,1,2,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,2,2,1,0,1,1,0,2,1,0,1,0,0,0,1,1,1,1,1,0,5,2,2,4,1,1,2,1,1,0,1,3,0,1,1,0,4,0,2,0,0,1,2,2,0,1,0,1,1,0,1,0,0,1,1,0,1,0,1,2,0,1,1,2,1,0,1,1,2,2,4,0,4,3,4,1,0,1,2,1,0,1,1,1,1,1,1,1,1,0,1,0,2,1,0,3,0,0,3,0,0,1,0,3,2,0,1,2,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,1,0,4,0,2,2,0,1,0,0,1,1,0,2,3,4,0,3,1,1,2,2,0,0,1,0,0,0,1,2,1,4,0,0,0,3,3,1,1,2,0,1,3,0,0,0,2,1,2,1,1,1,1,0,0,1,0,1,1,0,3,1,1,0,1,2,1,1,0,2,0,1,2,1,2,0,5,3,2,3,1,1,2,1,1,2,0,1,0,2,0,0,2,2,1,0,1,2,0,1,1,0,1,1,0,1,1,0,0,1,1,2,2,1,0,2,3,1,1,3,0,2,0,0,3,3,1,1,0,2,0,1,1,1,3,1,0,0,1,1,1,0,0,0,0,2,0,0,0,3,1,3,2,1,0,1,0,0,0,1,2,1,0,1,0,1,0,0,0,1,4,0,0,0,2,0,1,1,1,1,0,0,2,2,0,1,1,0,1,0,1,1,2,1,5,0,2,3,0,1,1,3,1,2,1,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,0,0,0,1,0,2,0,0,1,0,0,0,0,1,1,2,0,0,0,1,1,0,1,2,2,0,1,2,0,2,1,2,1,0,1,1,0,1,0,2,2,1,0,3,0,0,1,0,2,0,1,1,0,1,1,1,2,2,0,0,2,1,0,3,2,0,1,1,0,0,0,2,0,0,1,1,1,1,0,3,0,1,0,2,0,1,1,1,0,0,1,0,1,1,1,1,0,1,3,1,3,1,2,0,0,1,0,1,1,0,1,2,2,0,1,1,1,1,0,0,0,0,2,4,0,0,0,0,1,1,0,1,0,0,2,2,1,1,0,1,0,4,1,1,0,0,1,1,1,1,0,0,2,0,2,2,3,0,0,1,0,2,1,0,1,1,1,1,0,0,0,2,0,1,3,0,1,1,1,0,0,3,2,1,0,0,0,0,0,0,2,3,1,3,1,0,1,0,2,1,1,1,1,0,0,1,1,0,0,1,1,1,0,1,2,1,1,0,1,3,0,2,0,0,1,0,2,1,1,0,0,0,0,1,0,0,1,0,0,2,2,0,1,1,0,1,1,1,0,2,0,2,1,3,1,2,0,2,0,2,1,2,2,1,2,3,1,1,0,3,1,0,0,1,0,0,2,1,1,1,1,0,1,1,1,1,0,2,1,0,0,1,0,0,0,1,1,2,0,1,2,4,2,1,1,0,4,1,3,0,0,0,4,0,0,1,0,0,4,1,0,1,1,1,2,0,2,0,1,0,1,0,2,1,1,0,0,1,1,0,3,3,0,0,0,0,1,1,1,0,0,1,1,2,0,1,0,0,1,0,2,0,1,3,0,3,0,0,1,1,1,0,1,1,2,1,0,0,1,2,2,2,1,0,0,0,6,1,1,1,2,2,2,1,1,1,3,0,1,4,1,0,1,2,1,1,5,0,2,1,1,0,2,1,1,1,1,1,0,0,1,0,0,2,3,1,1,0,1,3,1,2,1,1,0,1,0,0,0,1,2,0,0,0,0,0,1,0,0,0,1,3,0,2,0,3,3,0,2,2,1,1,3,0,0,1,0,2,1,0,0,0,1,2,2,3,0,1,1,2,1,1,0,2,2,1,2,0,1,4,1,0,1,1,2,0,1,3,0,2,1,2,3,1,0,1,3,1,0,0,1,0,2,0,0,1,2,0,0,2,1,0,1,2,0,1,0,0,0,1,0,1,0,1,2,0,0,1,0,2,2,2,2,1,1,1,0,2,1,2,0,2,1,2,2,0,0,0,1,1,2,1,0,0,0,4,0,1,1,2,3,0,0,3,0,1,1,1,2,0,1,0,0,1,1,0,1,1,0,1,1,0,1,0,0,0,2,0,1,1,2,0,2,0,2,3,2,1,1,1,1,3,0,1,2,0,0,0,2,0,0,2,0,0,2,1,0,4,2,1,1,0,0,1,0,0,3,1,1,0,0,3,0,2,1,1,1,1,2,1,2,1,0,0,1,1,0,1,2,1,0,2,1,1,0,0,0,2,1,1,0,1,0,0,0,3,0,1,3,0,1,0,0,1,0,0,0,2,3,2,3,1,1,1,1,2,1,0,0,1,2,0,2,0,1,0,0,3,0,2,0,0,2,1,1,2,1,0,1,1,1,1,1,0,0,1,0,2,1,2,0,0,0,0,0,0,2,2,1,0,0,0,2,1,0,0,1,0,1,0,1,1,0,0,0,2,0,2,2,1,1,1,3,3,0,0,1,3,1,2,3,0,0,1,1,3,0,1,1,0,0,1,0,1,0,0,1,1,1,3,1,0,1,0,0,1,2,0,3,2,3,0,1,2,0,1,0,1,1,4,0,0,1,0,0,1,0,1,1,1,3,0,0,0,1,0,1,2,0,0,2,1,1,0,0,0,0,2,0,1,1,1,3,0,0,0,1,2,1,1,2,2,1,0,2,0,1,1,0,0,2,0,3,1,0,1,0,1,0,0,1,1,0,3,3,3,0,1,0,1,1,2,0,1,0,1,1,3,0,1,1,1,0,0,2,0,1,2,2,0,0,1,1,2,0,2,0,0,1,1,0,3,0,1,0,3,1,0,0,1,0,2,0,1,0,2,1,2,1,2,3,2,3,1,2,2,1,1,0,2,2,0,4,2,0,1,2,2,1,1,1,1,0,0,3,0,0,2,1,1,2,0,0,2,0,1,2,1,2,1,1,0,1,1,0,1,0,1,0,2,2]},{"counters":[0,1,3,0,2,0,0,3,1,3,1,0,2,0,3,1,1,2,0,2,1,0,0,1,1,2,1,1,0,1,2,1,3,0,2,1,1,1,1,1,2,0,1,0,2,0,0,2,1,2,0,0,2,0,1,0,2,2,0,2,0,0,3,0,0,2,2,2,1,2,1,1,1,2,3,1,2,3,1,2,1,0,1,0,1,2,0,1,3,1,2,0,1,3,1,1,1,0,1,2,0,1,0,0,1,1,0,1,1,2,3,4,1,0,0,0,0,1,2,3,1,1,1,1,0,0,0,1,1,2,1,1,1,0,0,0,2,1,1,1,1,0,0,1,1,3,0,3,1,0,0,1,1,0,1,1,0,2,2,1,1,0,0,0,1,0,2,1,1,0,1,2,1,0,1,1,0,0,1,0,1,0,1,3,1,2,2,1,0,1,0,0,0,5,0,1,1,1,2,0,1,0,2,2,3,1,1,1,1,0,0,0,2,1,0,0,2,3,0,2,1,1,1,0,1,0,1,0,0,2,0,1,2,1,1,1,0,0,1,2,1,1,0,2,1,0,1,0,0,0,2,0,0,3,0,0,1,0,0,2,0,2,0,0,0,1,1,1,3,1,0,1,0,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,1,2,1,2,0,1,1,0,1,2,2,1,1,0,2,0,2,0,1,1,1,2,0,2,1,0,3,2,0,1,1,0,1,0,0,0,0,5,1,0,2,0,0,2,3,1,0,1,1,2,1,0,3,1,0,1,3,2,1,1,1,2,1,1,0,2,0,1,1,0,1,0,1,1,0,1,1,1,1,4,0,1,1,3,0,3,0,1,0,2,2,1,1,3,2,1,1,1,2,1,1,3,1,1,0,1,2,0,1,4,1,0,2,2,2,2,0,0,1,1,1,1,0,0,2,1,2,1,3,1,1,4,1,1,1,3,2,1,1,0,1,0,0,0,0,0,1,2,2,1,0,2,1,0,0,0,0,0,2,2,2,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,3,0,0,1,1,1,1,1,1,1,1,1,2,0,1,0,1,2,0,1,4,2,1,1,1,0,0,1,2,2,0,2,1,2,1,1,1,0,0,1,0,2,1,1,1,3,1,0,1,1,0,1,0,2,2,1,2,1,1,1,1,0,0,0,0,1,1,0,1,1,1,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,2,0,2,1,2,2,2,2,5,1,0,2,2,3,0,1,4,2,0,1,2,1,0,0,0,0,0,1,0,0,2,0,0,2,1,2,1,0,0,1,2,0,3,1,1,0,1,0,1,1,0,0,0,1,2,2,2,0,0,4,1,0,1,3,0,2,0,0,1,0,4,0,1,1,2,0,1,3,1,1,1,0,0,2,1,1,1,1,0,2,1,0,0,1,0,0,2,3,2,3,0,0,2,1,0,1,1,1,0,1,1,0,1,2,2,2,0,1,1,3,1,0,0,0,1,0,0,4,1,2,0,0,2,0,0,1,0,1,0,0,0,2,1,0,0,1,1,3,1,2,2,0,1,1,1,1,1,1,0,1,2,0,0,0,0,0,3,2,1,1,2,0,1,0,1,0,0,2,1,0,3,1,2,1,1,0,1,3,0,1,1,2,0,0,3,0,0,1,1,0,0,0,1,0,2,0,0,0,0,0,0,2,1,2,0,1,0,1,2,2,1,4,1,1,0,4,3,0,0,1,1,3,0,1,2,2,1,3,3,0,0,2,0,2,1,0,2,0,1,2,3,3,1,1,0,0,1,2,1,2,0,0,0,1,0,0,2,0,0,3,0,0,1,2,1,1,0,1,1,1,0,1,0,1,0,0,0,1,1,0,0,2,0,0,0,3,2,1,6,1,1,0,0,0,0,1,0,3,2,0,1,1,2,1,1,1,0,0,2,0,1,0,3,1,2,0,1,1,0,4,0,1,0,3,1,3,2,1,1,0,2,0,3,1,2,0,0,1,2,2,1,0,1,2,2,1,1,1,0,0,0,2,0,0,0,1,0,1,0,0,2,2,1,1,1,1,2,0,1,2,2,0,0,2,2,0,2,0,1,0,1,0,0,1,2,0,1,0,1,0,2,0,3,1,1,0,1,2,1,1,3,1,0,0,0,1,0,1,0,1,3,2,0,1,0,0,1,0,0,2,0,1,2,1,1,2,1,1,2,1,1,0,3,2,2,2,3,0,3,0,2,0,1,0,2,0,1,0,1,2,1,1,2,2,0,2,3,0,0,0,2,3,1,1,1,1,3,2,2,1,0,2,0,0,2,1,0,2,2,0,1,1,0,0,2,1,1,1,2,0,0,1,1,2,2,0,1,2,3,0,2,1,0,0,1,0,1,2,0,0,0,1,1,1,2,0,1,2,1,1,1,2,0,1,1,2,0,0,0,0,0,0,1,1,1,2,1,0,0,1,0,2,2,1,2,1,1,2,1,3,1,0,0,0,2,1,0,1,1,1,0,1,1,1,1,1,2,0,0,2,1,1,0,1,1,1,1,1,2,1,1,0,1,1,0,2,0,1,0,2,1,0,0,0,0,1,0,1,1,0,0,0,0,1,1,1,1,0,9,1,1,2,1,2,1,1,0,1,1,1,0,1,0,1,1,0,1,2,1,0,1,0,0,1,0,1,1,2,1,0,0,1,2,3,3,0,0,1,0,0,2,1,1,2,0,2,2,0,1,2,0,2,2,1,2,2,1,2,0,0,0,1,2,0,2,0,0,2,0,1,1,1,3,3,2,1,1,1,0,1,0,1,0,0,1,2,1,1,5,2,0,1,0,1,2,1,2,0,1,0,1,0,1,0,2,2,0,3,0,0,2,1,1,1,0,0,0,2,2,1,1,2,1,0,0,1,2,1,2,0,0,4,2,2,1,1,0,0,2,1,0,0,1,1,1,1,0,2,1,2,0,0,2,1,1,2,1,1,3,1,0,1,0,0,1,1,3,1,0,1,0,2,2,0,0,1,1,2,1,2,1,2,2,1,0,0,1,3,1,0,4,0,0,1,0,0,1,2,1,0,1,0,3,1,0,1,0,2,3,0,0,1,1,3,0,1,2,2,1,0,0,0,1,2,0,0,0,0,1,0,2,1,3,0,1,1,1,0,0,0,1,2,1,3,0,0,0,0,1,0,1,0,2,0,1,3,0,4,0,1,1,1,1,2,1,1,2,0,0,0,2,0,1,2,1,1,2,1,1,0,3,0,1,1,1,1,3,1,3,2,0,1,1,1,1,2,0,0,0,2,2,0,0,1,2,1,1,1,0,0,1,1,3,3,1,1,0,0,2,1,2,0,0,2,1,1,3,0,0,0,0,0,1,0,0,0,2,2,1,0,1,1,1,0,0,0,0,3,1,0,0,1,1,2,0,0,1,2,1,0,0,0,0,0,2,1,1,0,0,4,0,3,1,2,0,0,1,3,3,0,2,0,0,0,0,0,2,2,0,2,0,1,0,0,0,0,0,0,1,0,1,0,1,1,1,1,3,1,0,3,1,1,2,1,0,1,1,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,1,0,0,3,1,1,1,1,0,1,2,2,4,1,0,0,2,2,0,1,0,2,0,1,0,3,0,4,0,1,0,0,1,1,0,1,0,0,2,0,0,1,3,0,2,0,1,2,0,0,0,2,1,1,1,1,0,1,2,3,2,2,2,4,4,1,2,2,1,0,1,1,0,1,4,1,1,1,0,2,1,0,1,0,0,1,0,1,2,2,2,2,2,0,0,0,1,1,0,5,2,2,0,0,1,3,0,1,3,0,1,2,0,2,1,1,1,0,1,0,0,0,0,1,2,0,2,2,0,1,0,2,3,2,1,0,1,0,0,1,1,0,1,1,0,1,2,0,3,0,1,2,1,1,1,2,1,1,2,0,0,0,0,1,0,0,0,2,0,0,1,1,0,3,0,1,0,2,0,2,0,1,1,0,1,1,1,0,1,0,3,1,0,1,2,2,1,0,1,0,2,2,1,1,1,3,1,0,0,0,1,2,1,0,2,1,0,1,3,0,0,2,1,1,0,1,1,0,1,1,1,0,1,0,0,0,1,2,1,1,0,1,0,2,2,0,0,1,1,0,0,0,0,0,0,2,2,0,0,1,0,0,0,1,0,0,0,1,2,1,1,0,1,2,0,0,2,0,0,0,0,0,0,1,1,0,2,2,1,1,0,2,2,1,3,1,1,0,3,2,0,2,0,1,1,2,2,3,1,2,0,1,1,0,0,1,0,2,2,0,1,0,2,2,1,1,1,1,0,4,5,2,2,1,1,1,0,1,0,1,2,2,0,0,1,0,0,0,2,1,0,1,1,0,1,2,0,1,1,2,2,1,1,0,1,0,1,1,0,1,1,2,2,4,1,1,1,0,0,0,0,1,0,0,1,1,0,0,0,1,1,0,3,0,0,0,2,1,0,1,0,1,1,2,1,2,0,0,0,1,2,0,0,3,0,0,1,2,0,2,1,1,0,5,1,0,3,0,0,1,1,0,1,1,0,1,0,1,0,0,0,6,2,1,1,0]},{"counters":[1,1,3,2,3,0,1,2,0,3,1,1,2,0,1,2,0,0,1,2,2,1,0,1,2,2,3,0,1,0,1,0,1,1,2,1,1,2,1,1,0,1,1,1,0,1,0,1,0,2,0,3,1,0,4,0,3,1,2,3,2,1,0,1,1,2,0,1,0,0,0,2,0,1,0,0,0,0,2,2,1,1,1,0,2,2,0,0,1,3,0,1,1,1,0,0,0,0,0,0,0,1,0,1,1,0,0,1,1,1,1,0,0,1,1,0,2,3,0,6,0,1,0,1,1,1,1,0,1,2,1,1,1,0,3,2,0,0,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,2,0,1,0,2,1,1,0,0,0,1,0,3,1,1,1,0,1,1,0,0,0,1,1,5,0,0,2,1,3,0,2,0,0,1,0,0,1,0,1,5,3,4,0,3,0,2,4,0,3,0,0,0,0,0,0,0,1,2,0,3,1,1,2,0,0,3,2,1,0,1,1,0,0,1,1,1,1,1,1,1,2,1,1,1,1,1,1,0,1,1,0,1,1,0,0,1,1,2,1,2,1,1,3,2,4,3,1,1,2,1,0,2,2,3,0,0,1,0,1,0,1,1,2,0,1,3,1,0,2,0,0,4,3,2,0,1,2,0,0,0,3,0,1,2,1,2,2,0,0,0,2,2,0,1,1,1,2,1,2,1,0,1,0,3,0,1,1,2,2,1,0,1,0,1,0,0,3,1,1,3,2,0,2,1,0,0,0,2,1,0,1,0,1,1,1,3,1,0,0,0,0,1,1,0,0,0,0,2,1,2,1,1,0,0,0,0,0,4,3,1,2,1,2,1,1,3,2,0,2,1,1,1,0,1,0,0,0,2,0,0,1,6,2,1,0,0,3,2,3,0,1,0,1,0,0,1,0,0,0,1,2,2,0,3,2,3,0,1,1,0,0,2,1,1,3,3,2,2,1,1,3,2,0,1,0,1,0,0,1,0,0,0,2,2,0,1,1,0,0,0,1,0,1,2,1,0,2,0,1,0,0,2,1,2,0,0,0,0,1,1,0,1,1,1,2,1,2,1,1,3,1,1,2,0,1,1,0,1,2,0,0,0,0,0,0,0,1,0,0,0,2,0,1,0,2,1,0,1,0,0,2,0,2,1,0,2,0,0,1,0,0,5,1,1,0,0,3,0,2,1,0,2,1,0,2,0,2,0,3,1,1,1,1,0,1,2,1,0,2,1,0,0,1,0,3,1,0,2,2,2,0,2,0,1,2,0,2,0,0,3,1,0,1,0,0,0,1,1,1,1,0,2,1,1,0,0,1,2,0,0,1,0,0,1,2,0,0,1,0,0,1,1,1,0,1,1,0,0,2,1,0,0,0,1,1,0,0,1,2,0,1,1,0,0,2,0,0,1,1,1,3,2,1,1,0,1,0,0,1,0,2,1,2,1,2,1,1,2,2,0,0,1,2,1,2,2,0,3,0,1,2,1,2,1,1,2,2,0,1,1,1,1,1,0,0,1,2,0,0,0,2,3,0,1,1,1,0,3,0,2,0,0,0,1,0,1,0,0,1,3,0,1,1,3,1,0,0,0,1,0,0,1,1,1,0,1,1,1,4,0,0,2,0,3,1,0,4,0,1,1,1,2,1,4,0,2,0,1,2,0,1,5,0,0,0,1,4,0,1,0,0,0,3,0,0,1,1,0,2,0,0,1,0,1,2,3,1,0,0,0,4,0,1,0,2,0,0,2,1,1,1,1,1,0,2,1,2,0,0,0,0,4,2,1,1,0,0,0,3,2,1,0,0,1,0,1,1,2,0,2,0,1,0,1,0,2,3,0,1,2,0,0,2,1,0,0,0,0,0,2,0,0,1,1,1,1,1,1,0,1,1,0,1,1,1,2,0,0,1,1,1,2,1,1,1,2,1,3,2,2,1,2,1,1,1,1,2,1,1,0,1,0,0,0,3,0,1,1,0,2,1,0,0,0,1,2,3,2,1,0,1,1,1,0,0,0,1,0,0,1,1,3,1,0,1,2,1,1,1,1,2,2,0,1,3,1,0,1,1,0,0,0,1,3,1,1,1,2,0,2,0,0,0,0,2,0,1,0,2,2,1,0,1,1,0,1,4,1,1,0,0,1,0,1,2,1,0,0,0,0,1,2,2,0,0,1,1,0,2,1,0,0,0,1,2,1,0,1,1,2,1,1,0,0,1,1,1,2,0,0,0,0,1,1,0,1,0,0,0,2,0,1,2,2,0,1,1,2,0,2,0,1,1,0,3,0,2,0,2,4,3,0,3,2,2,1,0,0,2,2,0,3,1,0,1,0,2,0,0,1,1,0,2,0,1,0,0,2,0,1,1,3,3,0,2,1,0,1,1,1,1,1,1,1,0,1,3,2,1,0,2,0,1,1,0,2,0,0,4,0,1,2,1,1,1,0,0,1,1,1,0,4,0,0,0,2,1,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,2,0,2,0,2,0,1,1,1,1,2,1,0,0,0,1,3,2,2,1,2,0,0,0,1,2,0,1,1,1,1,3,0,0,0,3,0,1,0,1,1,3,1,3,0,1,0,0,1,3,1,1,2,0,0,0,1,0,0,0,3,0,0,0,1,1,0,1,1,1,2,0,0,1,0,4,2,1,1,2,4,2,1,2,3,0,2,2,1,0,1,0,0,1,1,0,2,0,1,1,0,1,0,2,0,1,1,2,2,4,1,1,0,2,1,0,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,3,0,0,1,1,0,1,0,2,1,2,1,2,2,0,1,3,0,0,0,2,1,1,1,0,2,1,1,1,1,0,2,0,0,1,1,0,0,2,0,0,0,1,2,0,3,1,2,0,0,1,1,0,0,2,1,1,2,2,0,0,0,1,1,1,2,0,0,0,0,1,0,0,1,0,1,1,0,2,3,0,2,1,1,0,3,1,1,0,4,2,2,0,1,3,1,2,0,0,2,2,0,1,0,1,0,0,4,1,3,1,0,2,3,2,0,1,0,4,2,1,1,1,0,2,0,0,2,0,0,1,1,1,0,1,0,2,1,1,0,1,3,1,0,1,2,4,1,0,1,2,1,2,4,1,0,1,0,3,0,2,1,1,1,3,1,5,1,1,0,1,1,1,1,1,0,0,1,2,2,0,1,0,0,1,2,1,1,0,0,0,0,2,1,1,3,3,0,0,3,1,1,1,1,1,2,0,2,0,1,1,2,0,1,2,2,0,3,0,2,0,2,1,0,1,0,1,0,1,2,2,1,0,0,2,0,1,0,2,1,2,0,1,1,0,0,0,2,2,2,0,0,0,0,0,2,0,3,0,2,2,0,1,3,0,1,2,2,2,1,1,3,0,0,0,2,2,1,2,2,1,0,0,1,0,1,0,1,0,2,0,0,1,0,0,0,0,0,0,0,0,2,1,1,3,1,0,0,1,1,2,0,1,2,1,1,1,0,1,2,4,1,2,1,1,0,0,2,0,0,2,2,0,2,0,0,3,1,0,0,1,3,1,1,0,2,1,2,0,0,0,0,2,1,1,2,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,2,2,2,1,3,1,1,1,0,0,0,1,1,2,4,0,1,1,3,0,2,1,0,0,0,1,2,1,0,2,0,3,2,0,1,1,1,1,1,0,1,3,2,1,0,0,2,1,0,3,0,0,1,0,0,0,2,2,1,0,1,3,0,1,2,2,1,0,2,2,2,1,1,1,1,0,2,1,1,2,2,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,1,1,0,2,1,0,3,0,0,0,1,0,2,0,1,1,2,0,0,1,0,0,0,0,1,1,1,0,1,1,1,2,1,0,3,0,1,1,0,1,1,0,0,0,2,0,1,0,4,2,3,0,1,1,2,0,2,2,0,1,2,0,1,0,0,1,1,0,0,0,0,1,1,2,0,0,1,0,1,2,0,2,0,0,0,2,0,0,1,0,0,2,1,2,1,1,1,1,0,1,0,0,0,0,0,1,3,2,0,1,0,5,2,1,1,4,0,0,0,1,2,1,0,2,0,1,2,0,3,1,0,0,4,2,2,1,3,0,2,1,2,3,2,0,0,0,1,4,1,0,1,2,1,2,0,3,1,1,1,2,0,1,1,1,1,1,0,0,1,3,0,0,1,2,0,0,1,0,2,0,0,2,0,1,0,1,0,0,0,0,1,0,3,1,3,0,1,1,1,1,3,1,1,3,1,0,3,2,0,0,0,1,3,1,2,0,4,1,1,1,2,0,0,2,2,1,3,0,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,0,0,2,0,2,1,0,2,0,2,0,2,2,2,0,2,1,0,0,2,0,1,1,2,1,0,4,2,2,2,1,1,1,2,1,1,2,0,0,1,1,3,2,2,1,0,0,1,0,0,2,1,0,1,0,2,1,0,1,1,0,1,0,0,1,1,0,1,1,0,1,1,0,1,0,2,1,1,0,0,2,3,0,0,1,3,0,3,0]},{"counters":[1,1,3,2,1,0,2,1,0,1,1,2,1,2,1,1,3,2,0,1,1,1,1,2,0,1,2,0,0,0,0,1,2,0,1,1,1,0,0,2,1,1,3,2,2,0,0,1,0,1,2,0,2,1,1,0,1,1,0,0,1,2,0,1,1,2,3,1,2,0,2,1,1,1,3,1,0,2,0,1,2,0,0,1,1,0,1,2,0,0,0,0,0,0,1,0,2,3,0,0,1,3,1,2,0,3,2,1,0,2,1,2,3,1,1,0,3,2,1,2,0,1,0,1,0,0,1,4,1,0,2,0,1,0,1,1,0,0,0,3,0,0,0,2,3,3,1,2,2,0,0,1,0,0,1,2,2,0,3,0,2,0,1,1,2,1,3,0,0,0,0,0,0,1,0,1,1,0,1,0,2,2,1,0,3,1,1,1,0,0,3,1,0,2,1,1,2,0,0,0,3,1,1,1,0,1,1,0,2,1,0,1,1,0,0,0,3,2,1,2,2,1,0,0,0,2,1,0,2,1,0,0,2,0,0,0,0,1,1,1,2,0,0,1,3,1,1,1,1,2,2,2,0,1,1,0,0,1,1,2,2,1,3,0,1,2,1,0,1,1,1,0,3,1,1,0,2,0,1,2,1,2,1,1,0,0,0,0,0,0,1,0,1,1,0,2,0,0,1,1,1,0,0,0,0,2,1,1,1,0,1,0,4,2,0,0,1,2,2,0,1,1,1,0,1,2,0,6,3,0,1,0,3,1,0,1,3,3,1,0,1,2,0,1,0,1,0,0,0,0,1,2,0,0,0,1,2,0,0,0,1,1,3,1,0,1,0,0,0,2,2,1,1,4,1,1,1,1,1,1,0,1,1,0,0,1,2,1,0,1,1,3,0,0,1,1,1,0,0,1,1,1,3,1,0,2,0,0,0,2,0,0,4,2,1,0,2,1,0,2,1,0,2,2,1,0,2,1,1,0,1,2,4,5,2,2,1,0,1,0,1,0,1,2,0,1,0,0,0,1,5,0,0,1,1,0,2,1,1,2,2,0,0,3,0,0,1,1,1,1,0,0,0,3,1,2,1,0,0,1,0,0,2,2,0,0,2,1,0,2,1,3,0,4,1,0,0,0,0,1,1,1,0,1,1,1,1,0,2,0,1,1,1,2,0,1,1,3,2,2,2,0,0,1,1,1,0,0,1,1,0,0,0,0,2,1,1,0,0,3,0,2,0,0,0,2,4,1,0,0,1,1,0,1,0,0,2,3,2,1,2,1,1,2,1,1,2,1,1,0,0,2,0,2,2,1,1,2,2,1,0,0,1,0,3,0,2,2,1,0,1,1,1,0,1,1,2,2,0,0,1,1,1,2,1,0,1,0,1,0,0,2,2,1,0,0,0,1,2,1,0,0,0,1,0,1,1,0,1,3,0,0,0,3,1,0,0,1,0,0,1,3,2,0,0,1,1,2,2,1,0,0,1,0,1,0,2,0,0,0,3,2,0,1,0,1,2,2,1,0,2,0,1,2,1,1,1,0,0,1,0,0,1,0,1,0,2,0,1,2,0,0,1,1,0,0,0,0,0,2,2,1,1,1,2,0,2,2,0,3,0,0,1,2,1,1,1,2,0,0,0,1,0,1,4,0,0,0,0,0,0,2,1,5,1,2,0,0,0,1,0,1,0,1,2,2,0,0,1,0,1,1,3,1,2,3,1,2,0,2,0,0,0,1,3,1,2,1,0,0,1,0,0,2,3,1,1,0,2,1,3,3,1,2,2,2,2,1,0,1,1,0,1,0,2,0,3,1,1,0,0,0,1,0,0,0,0,4,1,1,3,1,1,4,0,3,0,0,2,1,1,0,2,2,0,1,2,0,1,1,0,1,0,0,1,2,0,0,1,0,1,1,3,1,0,1,1,0,2,1,2,1,0,0,0,0,0,3,0,1,1,0,1,0,0,1,0,2,1,3,1,3,2,1,0,0,0,2,2,1,3,1,0,0,0,0,0,2,0,0,1,1,0,1,1,0,1,1,0,4,0,1,1,1,1,1,1,0,1,1,1,0,0,2,0,2,1,0,2,0,0,2,0,0,2,1,1,3,0,0,1,1,1,1,1,0,1,1,0,0,1,2,2,2,1,2,0,2,0,0,2,1,2,0,2,3,0,1,2,0,0,1,0,0,0,0,1,1,0,1,0,1,3,0,1,0,2,1,1,0,1,1,0,1,2,0,1,0,1,1,0,0,0,0,2,0,1,1,1,1,1,4,2,1,0,0,2,1,0,2,0,2,1,1,1,0,1,0,0,0,2,1,1,0,0,0,1,1,0,3,3,1,2,0,0,1,2,1,3,0,0,0,0,1,1,0,0,2,0,0,0,3,3,3,2,1,0,1,2,1,1,0,2,1,0,1,1,2,0,0,1,3,1,0,1,0,1,2,1,1,3,0,0,0,0,0,1,1,0,2,1,0,1,1,0,2,0,0,2,0,1,0,0,1,2,1,1,3,1,2,0,1,1,1,0,3,1,1,3,0,0,1,1,4,0,0,0,0,0,0,2,1,1,2,1,1,0,0,0,1,1,6,1,0,0,0,2,2,0,0,1,0,2,1,4,1,2,0,0,1,0,0,1,1,3,1,0,1,0,0,0,0,1,0,2,2,0,0,0,2,0,0,1,2,0,2,0,3,1,1,1,1,2,0,2,1,0,2,2,0,1,0,2,1,2,1,2,1,0,1,0,2,0,0,1,1,1,2,0,2,1,2,0,1,1,0,1,1,0,2,0,1,0,1,0,0,3,0,0,1,1,2,0,1,0,2,0,0,2,2,2,3,0,1,0,0,0,0,1,0,0,1,2,0,0,3,2,0,1,1,1,0,2,0,1,0,0,1,1,1,0,0,1,1,2,0,3,0,2,1,2,0,3,1,4,0,1,0,0,4,2,2,4,2,1,3,1,3,0,2,1,0,2,1,1,1,0,1,1,0,1,1,0,3,1,1,2,0,1,0,2,1,0,2,0,0,1,1,1,0,0,2,0,0,1,0,2,0,0,2,0,1,0,0,1,0,1,1,1,0,0,1,2,0,1,1,2,0,0,1,0,0,0,1,0,2,0,2,2,1,1,3,0,0,2,2,0,2,0,1,1,1,3,2,1,0,0,1,2,0,1,3,0,2,0,0,2,0,1,2,1,1,1,0,0,0,2,0,1,2,1,0,1,0,2,0,0,2,3,0,3,1,1,3,1,1,2,1,3,0,0,1,0,0,2,1,2,3,2,0,2,1,1,0,1,1,1,2,0,2,1,1,0,1,4,0,0,2,1,1,1,0,0,0,0,1,1,3,1,1,1,0,0,3,1,1,1,0,2,1,2,1,2,0,1,2,0,0,2,0,1,0,2,0,0,0,0,2,1,0,1,1,1,0,0,2,0,2,1,0,2,0,0,3,0,1,0,0,1,1,0,0,1,2,0,0,1,1,0,2,1,0,1,0,0,0,1,1,1,1,0,3,0,4,0,3,1,0,1,0,1,1,2,2,1,1,1,1,2,2,0,1,0,2,1,0,2,1,1,1,3,0,0,1,2,1,2,0,1,0,0,1,0,2,0,0,1,1,2,2,2,1,0,0,2,1,1,1,4,0,0,1,0,1,1,4,0,0,0,0,0,0,1,0,1,0,3,4,0,0,1,0,3,0,0,3,0,2,2,2,0,2,2,3,0,0,1,1,0,1,1,2,1,1,0,0,2,0,1,2,3,2,1,0,1,1,2,0,0,0,1,1,0,0,1,2,3,4,1,2,1,1,2,0,0,2,1,0,0,0,1,2,3,1,0,5,0,2,1,0,2,0,3,3,0,0,1,2,1,1,0,1,1,1,1,2,0,2,0,2,1,2,1,2,2,0,1,1,0,2,1,3,0,2,2,1,0,0,0,2,1,0,0,0,1,0,2,2,0,1,2,1,1,2,2,0,1,1,2,0,2,1,0,2,1,0,1,3,1,0,0,0,2,2,1,1,1,1,1,1,4,2,0,0,1,3,1,3,1,1,1,3,0,0,1,1,0,1,0,1,0,1,0,3,0,0,0,0,1,4,1,2,1,1,0,1,1,1,2,2,0,2,1,1,0,2,1,0,1,0,2,2,2,4,1,1,2,3,0,2,3,1,1,1,0,0,1,2,0,1,1,0,0,1,0,0,0,1,0,0,1,0,1,2,0,1,2,1,2,0,1,1,1,1,0,1,4,4,0,1,2,1,1,0,3,1,3,0,3,1,1,0,0,0,0,0,3,0,1,4,0,0,1,0,2,0,0,0,1,3,0,1,0,1,0,2,0,0,1,3,2,0,0,1,1,2,0,0,0,1,1,4,0,1,0,0,2,1,2,1,0,0,1,0,0,3,0,1,0,0,3,3,0,1,1,0,0,0,2,1,1,1,0,1,0,2,2,0,2,2,0,2,0,1,0,2,2,2,0,2,0,2,1,2,0,0,2,1,3,2,1,1,1,3,2,0,6,1,2,0,3,2,3,0,0,1,1,0,1,0,2,1,0,1,0,3,3,0,0,1,0,3,1,0,1,0,0,1,0,0,2,1,1,2,0,0,0,1,1,1,0,0,1,1,0,0,1,0]}]},"null_count":0,"last_update_version":397952043759173632},"aid":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MTM=","repeats":1},{"count":16,"lower_bound":"MTQ=","upper_bound":"MUE=","repeats":1},{"count":24,"lower_bound":"MUI=","upper_bound":"MUc=","repeats":1},{"count":32,"lower_bound":"MUg=","upper_bound":"MU0=","repeats":1},{"count":40,"lower_bound":"MU8=","upper_bound":"MVk=","repeats":1},{"count":48,"lower_bound":"MWI=","upper_bound":"MWY=","repeats":1},{"count":56,"lower_bound":"MWg=","upper_bound":"MWw=","repeats":1},{"count":64,"lower_bound":"MW4=","upper_bound":"MXc=","repeats":1},{"count":72,"lower_bound":"MXo=","upper_bound":"MjI=","repeats":1},{"count":80,"lower_bound":"MjM=","upper_bound":"Mjk=","repeats":1},{"count":88,"lower_bound":"MkI=","upper_bound":"MkY=","repeats":1},{"count":96,"lower_bound":"Mkg=","upper_bound":"Mkw=","repeats":1},{"count":104,"lower_bound":"Mk4=","upper_bound":"MlQ=","repeats":1},{"count":112,"lower_bound":"MlU=","upper_bound":"MmE=","repeats":1},{"count":120,"lower_bound":"MmI=","upper_bound":"Mmo=","repeats":1},{"count":128,"lower_bound":"Mms=","upper_bound":"MnA=","repeats":1},{"count":136,"lower_bound":"MnE=","upper_bound":"MnY=","repeats":1},{"count":144,"lower_bound":"Mnc=","upper_bound":"Mno=","repeats":1},{"count":152,"lower_bound":"MzI=","upper_bound":"MzY=","repeats":1},{"count":160,"lower_bound":"Mzc=","upper_bound":"M0E=","repeats":1},{"count":168,"lower_bound":"M0I=","upper_bound":"M0g=","repeats":1},{"count":176,"lower_bound":"M0k=","upper_bound":"M00=","repeats":1},{"count":184,"lower_bound":"M08=","upper_bound":"M1c=","repeats":1},{"count":192,"lower_bound":"M2I=","upper_bound":"M2o=","repeats":1},{"count":200,"lower_bound":"M2w=","upper_bound":"M3M=","repeats":1},{"count":208,"lower_bound":"M3Q=","upper_bound":"NDA=","repeats":1},{"count":216,"lower_bound":"NDY=","upper_bound":"NDk=","repeats":1},{"count":224,"lower_bound":"NEI=","upper_bound":"NEg=","repeats":1},{"count":232,"lower_bound":"NEw=","upper_bound":"NFA=","repeats":1},{"count":240,"lower_bound":"NFU=","upper_bound":"NGE=","repeats":1},{"count":248,"lower_bound":"NGI=","upper_bound":"NGU=","repeats":1},{"count":256,"lower_bound":"NGY=","upper_bound":"NGw=","repeats":1},{"count":264,"lower_bound":"NG0=","upper_bound":"NHU=","repeats":1},{"count":272,"lower_bound":"NTE=","upper_bound":"NTY=","repeats":1},{"count":280,"lower_bound":"NTg=","upper_bound":"NUU=","repeats":1},{"count":288,"lower_bound":"NUs=","upper_bound":"NVQ=","repeats":1},{"count":296,"lower_bound":"NVU=","upper_bound":"NVg=","repeats":1},{"count":304,"lower_bound":"NVo=","upper_bound":"NWU=","repeats":1},{"count":312,"lower_bound":"NWY=","upper_bound":"NW4=","repeats":1},{"count":320,"lower_bound":"NW8=","upper_bound":"NXQ=","repeats":1},{"count":328,"lower_bound":"NjI=","upper_bound":"NjY=","repeats":1},{"count":336,"lower_bound":"Njc=","upper_bound":"NkI=","repeats":1},{"count":344,"lower_bound":"NkQ=","upper_bound":"Nkk=","repeats":1},{"count":352,"lower_bound":"Nko=","upper_bound":"Nk4=","repeats":1},{"count":360,"lower_bound":"Nk8=","upper_bound":"NlU=","repeats":1},{"count":368,"lower_bound":"NlY=","upper_bound":"NmE=","repeats":1},{"count":376,"lower_bound":"NmI=","upper_bound":"Nmc=","repeats":1},{"count":384,"lower_bound":"Nmg=","upper_bound":"Nms=","repeats":1},{"count":392,"lower_bound":"Nmw=","upper_bound":"NnI=","repeats":1},{"count":400,"lower_bound":"NnU=","upper_bound":"Nnk=","repeats":1},{"count":408,"lower_bound":"NzE=","upper_bound":"N0E=","repeats":1},{"count":416,"lower_bound":"N0M=","upper_bound":"N0w=","repeats":1},{"count":424,"lower_bound":"N00=","upper_bound":"N1Y=","repeats":1},{"count":432,"lower_bound":"N1g=","upper_bound":"N2Y=","repeats":1},{"count":440,"lower_bound":"N2s=","upper_bound":"N3A=","repeats":1},{"count":448,"lower_bound":"N3M=","upper_bound":"N3g=","repeats":1},{"count":456,"lower_bound":"N3k=","upper_bound":"ODI=","repeats":1},{"count":464,"lower_bound":"ODY=","upper_bound":"OEQ=","repeats":1},{"count":472,"lower_bound":"OEg=","upper_bound":"OE0=","repeats":1},{"count":480,"lower_bound":"OE8=","upper_bound":"OFQ=","repeats":1},{"count":488,"lower_bound":"OFg=","upper_bound":"OGI=","repeats":1},{"count":496,"lower_bound":"OGQ=","upper_bound":"OGg=","repeats":1},{"count":504,"lower_bound":"OGk=","upper_bound":"OG4=","repeats":1},{"count":512,"lower_bound":"OHA=","upper_bound":"OHU=","repeats":1},{"count":520,"lower_bound":"OHY=","upper_bound":"OTE=","repeats":1},{"count":528,"lower_bound":"OTI=","upper_bound":"OTg=","repeats":1},{"count":536,"lower_bound":"OTk=","upper_bound":"OUQ=","repeats":1},{"count":544,"lower_bound":"OUY=","upper_bound":"OU8=","repeats":1},{"count":552,"lower_bound":"OVA=","upper_bound":"OVg=","repeats":1},{"count":560,"lower_bound":"OVk=","upper_bound":"OWI=","repeats":1},{"count":568,"lower_bound":"OWM=","upper_bound":"OWk=","repeats":1},{"count":576,"lower_bound":"OWs=","upper_bound":"OXU=","repeats":1},{"count":584,"lower_bound":"OXY=","upper_bound":"QTA=","repeats":1},{"count":592,"lower_bound":"QTI=","upper_bound":"QTU=","repeats":1},{"count":600,"lower_bound":"QTY=","upper_bound":"QUc=","repeats":1},{"count":608,"lower_bound":"QVA=","upper_bound":"QVU=","repeats":1},{"count":616,"lower_bound":"QWE=","upper_bound":"QWY=","repeats":1},{"count":624,"lower_bound":"QWg=","upper_bound":"QXI=","repeats":1},{"count":632,"lower_bound":"QXM=","upper_bound":"QXg=","repeats":1},{"count":640,"lower_bound":"Qg==","upper_bound":"QjQ=","repeats":1},{"count":648,"lower_bound":"QjU=","upper_bound":"QkI=","repeats":1},{"count":656,"lower_bound":"QkM=","upper_bound":"Qko=","repeats":1},{"count":664,"lower_bound":"Qks=","upper_bound":"Qk8=","repeats":1},{"count":672,"lower_bound":"QlA=","upper_bound":"QlQ=","repeats":1},{"count":680,"lower_bound":"QlY=","upper_bound":"QmE=","repeats":1},{"count":688,"lower_bound":"QmI=","upper_bound":"Qmg=","repeats":1},{"count":696,"lower_bound":"QnE=","upper_bound":"Qnk=","repeats":1},{"count":704,"lower_bound":"Qno=","upper_bound":"Q0E=","repeats":1},{"count":712,"lower_bound":"Q0I=","upper_bound":"Q0c=","repeats":1},{"count":720,"lower_bound":"Q0w=","upper_bound":"Q1E=","repeats":1},{"count":728,"lower_bound":"Q1I=","upper_bound":"Q1o=","repeats":1},{"count":736,"lower_bound":"Q2I=","upper_bound":"Q2c=","repeats":1},{"count":744,"lower_bound":"Q2k=","upper_bound":"Q24=","repeats":1},{"count":752,"lower_bound":"Q3E=","upper_bound":"Q3c=","repeats":1},{"count":760,"lower_bound":"Q3g=","upper_bound":"RDA=","repeats":1},{"count":768,"lower_bound":"RDE=","upper_bound":"RDc=","repeats":1},{"count":776,"lower_bound":"REI=","upper_bound":"REY=","repeats":1},{"count":784,"lower_bound":"REc=","upper_bound":"RE0=","repeats":1},{"count":792,"lower_bound":"RE8=","upper_bound":"RGg=","repeats":1},{"count":800,"lower_bound":"RGo=","upper_bound":"RG0=","repeats":1},{"count":808,"lower_bound":"RHQ=","upper_bound":"RHg=","repeats":1},{"count":816,"lower_bound":"RHk=","upper_bound":"RTE=","repeats":1},{"count":824,"lower_bound":"RTQ=","upper_bound":"RTg=","repeats":1},{"count":832,"lower_bound":"RTk=","upper_bound":"RUM=","repeats":1},{"count":840,"lower_bound":"RUY=","upper_bound":"RUo=","repeats":1},{"count":848,"lower_bound":"RU8=","upper_bound":"RVY=","repeats":1},{"count":856,"lower_bound":"RVc=","upper_bound":"RWE=","repeats":1},{"count":864,"lower_bound":"RWY=","upper_bound":"RWo=","repeats":1},{"count":872,"lower_bound":"RWs=","upper_bound":"RW4=","repeats":1},{"count":880,"lower_bound":"RXE=","upper_bound":"RXc=","repeats":1},{"count":888,"lower_bound":"RXg=","upper_bound":"RjA=","repeats":1},{"count":896,"lower_bound":"RjI=","upper_bound":"RjU=","repeats":1},{"count":904,"lower_bound":"RkI=","upper_bound":"Rkc=","repeats":1},{"count":912,"lower_bound":"Rkg=","upper_bound":"RlA=","repeats":1},{"count":920,"lower_bound":"RlI=","upper_bound":"Rlc=","repeats":1},{"count":928,"lower_bound":"Rlk=","upper_bound":"Rmg=","repeats":1},{"count":936,"lower_bound":"Rmo=","upper_bound":"RnI=","repeats":1},{"count":944,"lower_bound":"RnQ=","upper_bound":"Rng=","repeats":1},{"count":952,"lower_bound":"Rnk=","upper_bound":"Rzc=","repeats":1},{"count":960,"lower_bound":"Rzg=","upper_bound":"R0I=","repeats":1},{"count":968,"lower_bound":"R0U=","upper_bound":"R0s=","repeats":1},{"count":976,"lower_bound":"R1A=","upper_bound":"R1U=","repeats":1},{"count":984,"lower_bound":"R1g=","upper_bound":"R2E=","repeats":1},{"count":992,"lower_bound":"R2M=","upper_bound":"R2c=","repeats":1},{"count":1000,"lower_bound":"R3A=","upper_bound":"R3U=","repeats":1},{"count":1008,"lower_bound":"R3Y=","upper_bound":"SDQ=","repeats":1},{"count":1016,"lower_bound":"SDU=","upper_bound":"SEI=","repeats":1},{"count":1024,"lower_bound":"SEM=","upper_bound":"SEo=","repeats":1},{"count":1032,"lower_bound":"SE8=","upper_bound":"SFY=","repeats":1},{"count":1040,"lower_bound":"SFk=","upper_bound":"SGQ=","repeats":1},{"count":1048,"lower_bound":"SGU=","upper_bound":"SGk=","repeats":1},{"count":1056,"lower_bound":"SGo=","upper_bound":"SHE=","repeats":1},{"count":1064,"lower_bound":"SHI=","upper_bound":"SQ==","repeats":1},{"count":1072,"lower_bound":"STA=","upper_bound":"STc=","repeats":1},{"count":1080,"lower_bound":"STg=","upper_bound":"SUM=","repeats":1},{"count":1088,"lower_bound":"SUU=","upper_bound":"SUk=","repeats":1},{"count":1096,"lower_bound":"SUs=","upper_bound":"SVA=","repeats":1},{"count":1104,"lower_bound":"SVI=","upper_bound":"SVk=","repeats":1},{"count":1112,"lower_bound":"SWE=","upper_bound":"SWY=","repeats":1},{"count":1120,"lower_bound":"SWc=","upper_bound":"SWs=","repeats":1},{"count":1128,"lower_bound":"SW4=","upper_bound":"SXI=","repeats":1},{"count":1136,"lower_bound":"SXM=","upper_bound":"SXg=","repeats":1},{"count":1144,"lower_bound":"SXo=","upper_bound":"Sjk=","repeats":1},{"count":1152,"lower_bound":"SkE=","upper_bound":"SkY=","repeats":1},{"count":1160,"lower_bound":"Skg=","upper_bound":"Sk4=","repeats":1},{"count":1168,"lower_bound":"Sk8=","upper_bound":"SlY=","repeats":1},{"count":1176,"lower_bound":"SmM=","upper_bound":"Smg=","repeats":1},{"count":1184,"lower_bound":"Smk=","upper_bound":"SnE=","repeats":1},{"count":1192,"lower_bound":"SnQ=","upper_bound":"Sng=","repeats":1},{"count":1200,"lower_bound":"Sno=","upper_bound":"SzI=","repeats":1},{"count":1208,"lower_bound":"SzQ=","upper_bound":"Szk=","repeats":1},{"count":1216,"lower_bound":"S0E=","upper_bound":"S0k=","repeats":1},{"count":1224,"lower_bound":"S0s=","upper_bound":"S1A=","repeats":1},{"count":1232,"lower_bound":"S1I=","upper_bound":"S1Y=","repeats":1},{"count":1240,"lower_bound":"S1c=","upper_bound":"S2Q=","repeats":1},{"count":1248,"lower_bound":"S2U=","upper_bound":"S2w=","repeats":1},{"count":1256,"lower_bound":"S24=","upper_bound":"S3c=","repeats":1},{"count":1264,"lower_bound":"S3k=","upper_bound":"TDI=","repeats":1},{"count":1272,"lower_bound":"TDQ=","upper_bound":"TDg=","repeats":1},{"count":1280,"lower_bound":"TEE=","upper_bound":"TEU=","repeats":1},{"count":1288,"lower_bound":"TEc=","upper_bound":"TEw=","repeats":1},{"count":1296,"lower_bound":"TE0=","upper_bound":"TFU=","repeats":1},{"count":1304,"lower_bound":"TFY=","upper_bound":"TGE=","repeats":1},{"count":1312,"lower_bound":"TGM=","upper_bound":"TGk=","repeats":1},{"count":1320,"lower_bound":"TGo=","upper_bound":"TG4=","repeats":1},{"count":1328,"lower_bound":"THA=","upper_bound":"THQ=","repeats":1},{"count":1336,"lower_bound":"THY=","upper_bound":"TQ==","repeats":1},{"count":1344,"lower_bound":"TTE=","upper_bound":"TTY=","repeats":1},{"count":1352,"lower_bound":"TTc=","upper_bound":"TUU=","repeats":1},{"count":1360,"lower_bound":"TUg=","upper_bound":"TU0=","repeats":1},{"count":1368,"lower_bound":"TU8=","upper_bound":"TWE=","repeats":1},{"count":1376,"lower_bound":"TWI=","upper_bound":"TW0=","repeats":1},{"count":1384,"lower_bound":"TW4=","upper_bound":"TXQ=","repeats":1},{"count":1392,"lower_bound":"TXU=","upper_bound":"TXk=","repeats":1},{"count":1400,"lower_bound":"TXo=","upper_bound":"TjM=","repeats":1},{"count":1408,"lower_bound":"TjQ=","upper_bound":"TkY=","repeats":1},{"count":1416,"lower_bound":"Tko=","upper_bound":"TlA=","repeats":1},{"count":1424,"lower_bound":"TlE=","upper_bound":"Tlc=","repeats":1},{"count":1432,"lower_bound":"Tlo=","upper_bound":"TmQ=","repeats":1},{"count":1440,"lower_bound":"Tmc=","upper_bound":"Tmo=","repeats":1},{"count":1448,"lower_bound":"Tmw=","upper_bound":"TnI=","repeats":1},{"count":1456,"lower_bound":"TnQ=","upper_bound":"Tnk=","repeats":1},{"count":1464,"lower_bound":"Tno=","upper_bound":"TzE=","repeats":1},{"count":1472,"lower_bound":"TzM=","upper_bound":"Tzc=","repeats":1},{"count":1480,"lower_bound":"Tzk=","upper_bound":"T0U=","repeats":1},{"count":1488,"lower_bound":"T0g=","upper_bound":"T0s=","repeats":1},{"count":1496,"lower_bound":"T00=","upper_bound":"T1U=","repeats":1},{"count":1504,"lower_bound":"T1Y=","upper_bound":"T2U=","repeats":1},{"count":1512,"lower_bound":"T2Y=","upper_bound":"T2s=","repeats":1},{"count":1520,"lower_bound":"T2w=","upper_bound":"T3U=","repeats":1},{"count":1528,"lower_bound":"T3c=","upper_bound":"UA==","repeats":1},{"count":1536,"lower_bound":"UDM=","upper_bound":"UDg=","repeats":1},{"count":1544,"lower_bound":"UDk=","upper_bound":"UEs=","repeats":1},{"count":1552,"lower_bound":"UEw=","upper_bound":"UFQ=","repeats":1},{"count":1560,"lower_bound":"UFc=","upper_bound":"UGM=","repeats":1},{"count":1568,"lower_bound":"UGc=","upper_bound":"UG0=","repeats":1},{"count":1576,"lower_bound":"UG4=","upper_bound":"UHY=","repeats":1},{"count":1584,"lower_bound":"UHc=","upper_bound":"UTE=","repeats":1},{"count":1592,"lower_bound":"UTI=","upper_bound":"UTY=","repeats":1},{"count":1600,"lower_bound":"UTc=","upper_bound":"UUY=","repeats":1},{"count":1608,"lower_bound":"UUc=","upper_bound":"UUs=","repeats":1},{"count":1616,"lower_bound":"UUw=","upper_bound":"UVE=","repeats":1},{"count":1624,"lower_bound":"UVI=","upper_bound":"UVk=","repeats":1},{"count":1632,"lower_bound":"UVo=","upper_bound":"UWM=","repeats":1},{"count":1640,"lower_bound":"UWU=","upper_bound":"UWk=","repeats":1},{"count":1648,"lower_bound":"UWo=","upper_bound":"UXE=","repeats":1},{"count":1656,"lower_bound":"UXM=","upper_bound":"UXo=","repeats":1},{"count":1664,"lower_bound":"UjA=","upper_bound":"Ujg=","repeats":1},{"count":1672,"lower_bound":"Ujk=","upper_bound":"UkU=","repeats":1},{"count":1680,"lower_bound":"Ukk=","upper_bound":"UlA=","repeats":1},{"count":1688,"lower_bound":"UlM=","upper_bound":"Ulg=","repeats":1},{"count":1696,"lower_bound":"UmE=","upper_bound":"UmY=","repeats":1},{"count":1704,"lower_bound":"Umc=","upper_bound":"Umo=","repeats":1},{"count":1712,"lower_bound":"Umw=","upper_bound":"UnE=","repeats":1},{"count":1720,"lower_bound":"UnI=","upper_bound":"Uno=","repeats":1},{"count":1728,"lower_bound":"Uw==","upper_bound":"UzY=","repeats":1},{"count":1736,"lower_bound":"Uzc=","upper_bound":"U0U=","repeats":1},{"count":1744,"lower_bound":"U0c=","upper_bound":"U1A=","repeats":1},{"count":1752,"lower_bound":"U1E=","upper_bound":"U1c=","repeats":1},{"count":1760,"lower_bound":"U2M=","upper_bound":"U2o=","repeats":1},{"count":1768,"lower_bound":"U2s=","upper_bound":"U3E=","repeats":1},{"count":1776,"lower_bound":"U3U=","upper_bound":"VDA=","repeats":1},{"count":1784,"lower_bound":"VDI=","upper_bound":"VDU=","repeats":1},{"count":1792,"lower_bound":"VDY=","upper_bound":"VEE=","repeats":1},{"count":1800,"lower_bound":"VEI=","upper_bound":"VEc=","repeats":1},{"count":1808,"lower_bound":"VEg=","upper_bound":"VE4=","repeats":1},{"count":1816,"lower_bound":"VE8=","upper_bound":"VFk=","repeats":1},{"count":1824,"lower_bound":"VGI=","upper_bound":"VGc=","repeats":1},{"count":1832,"lower_bound":"VGg=","upper_bound":"VHY=","repeats":1},{"count":1840,"lower_bound":"VHc=","upper_bound":"VHo=","repeats":1},{"count":1848,"lower_bound":"VTE=","upper_bound":"VTg=","repeats":1},{"count":1856,"lower_bound":"VUI=","upper_bound":"VUY=","repeats":1},{"count":1864,"lower_bound":"VUc=","upper_bound":"VUs=","repeats":1},{"count":1872,"lower_bound":"VVA=","upper_bound":"VVQ=","repeats":1},{"count":1880,"lower_bound":"VVU=","upper_bound":"VVg=","repeats":1},{"count":1888,"lower_bound":"VWI=","upper_bound":"VWY=","repeats":1},{"count":1896,"lower_bound":"VWc=","upper_bound":"VXo=","repeats":1},{"count":1904,"lower_bound":"Vg==","upper_bound":"VkU=","repeats":1},{"count":1912,"lower_bound":"Vkk=","upper_bound":"Vk0=","repeats":1},{"count":1920,"lower_bound":"Vk4=","upper_bound":"Vlg=","repeats":1},{"count":1928,"lower_bound":"VmE=","upper_bound":"Vmc=","repeats":1},{"count":1936,"lower_bound":"Vmg=","upper_bound":"Vm0=","repeats":1},{"count":1944,"lower_bound":"Vm4=","upper_bound":"Vnc=","repeats":1},{"count":1952,"lower_bound":"Vnk=","upper_bound":"VzI=","repeats":1},{"count":1960,"lower_bound":"Vzk=","upper_bound":"V0M=","repeats":1},{"count":1968,"lower_bound":"V0U=","upper_bound":"YQ==","repeats":1},{"count":1976,"lower_bound":"ZQ==","upper_bound":"ag==","repeats":1},{"count":1984,"lower_bound":"aw==","upper_bound":"bg==","repeats":1},{"count":1992,"lower_bound":"cA==","upper_bound":"cw==","repeats":1},{"count":2000,"lower_bound":"dA==","upper_bound":"eg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,2,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,1,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,2,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,2,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,1,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,1,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,2,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,1,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,3,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,2,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,2,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,3,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,4,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,2,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,2,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,2,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,1,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,3,2,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,3,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,1,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,3,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,2,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,2,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,4,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,3,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,3,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,2,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,1,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,2,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,1,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,2,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,1,1,0,2,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952043486281728},"dic":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MQ==","upper_bound":"MTM=","repeats":1},{"count":16,"lower_bound":"MTQ=","upper_bound":"MUM=","repeats":1},{"count":24,"lower_bound":"MUQ=","upper_bound":"MUg=","repeats":1},{"count":32,"lower_bound":"MUk=","upper_bound":"MU0=","repeats":1},{"count":40,"lower_bound":"MU8=","upper_bound":"MVI=","repeats":1},{"count":48,"lower_bound":"MVM=","upper_bound":"MVY=","repeats":1},{"count":56,"lower_bound":"MWY=","upper_bound":"MW8=","repeats":1},{"count":64,"lower_bound":"MXA=","upper_bound":"MXk=","repeats":1},{"count":72,"lower_bound":"MXo=","upper_bound":"MjQ=","repeats":1},{"count":80,"lower_bound":"Mjg=","upper_bound":"MkI=","repeats":1},{"count":88,"lower_bound":"MkQ=","upper_bound":"Mkk=","repeats":1},{"count":96,"lower_bound":"Mks=","upper_bound":"MlY=","repeats":1},{"count":104,"lower_bound":"Mlc=","upper_bound":"MmM=","repeats":1},{"count":112,"lower_bound":"MmY=","upper_bound":"Mmw=","repeats":1},{"count":120,"lower_bound":"Mm8=","upper_bound":"Mnc=","repeats":1},{"count":128,"lower_bound":"Mno=","upper_bound":"M0M=","repeats":1},{"count":136,"lower_bound":"M0Q=","upper_bound":"M0w=","repeats":1},{"count":144,"lower_bound":"M1A=","upper_bound":"M1Y=","repeats":1},{"count":152,"lower_bound":"M1o=","upper_bound":"M2k=","repeats":1},{"count":160,"lower_bound":"M2w=","upper_bound":"M28=","repeats":1},{"count":168,"lower_bound":"M3A=","upper_bound":"M3Y=","repeats":1},{"count":176,"lower_bound":"M3o=","upper_bound":"NDY=","repeats":1},{"count":184,"lower_bound":"NDg=","upper_bound":"NEY=","repeats":1},{"count":192,"lower_bound":"NEc=","upper_bound":"NEo=","repeats":1},{"count":200,"lower_bound":"NEs=","upper_bound":"NFI=","repeats":1},{"count":208,"lower_bound":"NFM=","upper_bound":"NFk=","repeats":1},{"count":216,"lower_bound":"NGE=","upper_bound":"NGc=","repeats":1},{"count":224,"lower_bound":"NGs=","upper_bound":"NHM=","repeats":1},{"count":232,"lower_bound":"NHQ=","upper_bound":"NQ==","repeats":1},{"count":240,"lower_bound":"NTM=","upper_bound":"NTc=","repeats":1},{"count":248,"lower_bound":"NTk=","upper_bound":"NUs=","repeats":1},{"count":256,"lower_bound":"NU0=","upper_bound":"NVA=","repeats":1},{"count":264,"lower_bound":"NVU=","upper_bound":"NVo=","repeats":1},{"count":272,"lower_bound":"NWE=","upper_bound":"NWY=","repeats":1},{"count":280,"lower_bound":"NWc=","upper_bound":"NWw=","repeats":1},{"count":288,"lower_bound":"NW8=","upper_bound":"NXU=","repeats":1},{"count":296,"lower_bound":"NXY=","upper_bound":"NXo=","repeats":1},{"count":304,"lower_bound":"Ng==","upper_bound":"NjI=","repeats":1},{"count":312,"lower_bound":"Njc=","upper_bound":"NkU=","repeats":1},{"count":320,"lower_bound":"NkY=","upper_bound":"Nk0=","repeats":1},{"count":328,"lower_bound":"Nk8=","upper_bound":"Nlg=","repeats":1},{"count":336,"lower_bound":"Nlo=","upper_bound":"NmQ=","repeats":1},{"count":344,"lower_bound":"Nmg=","upper_bound":"NnE=","repeats":1},{"count":352,"lower_bound":"NnI=","upper_bound":"NzQ=","repeats":1},{"count":360,"lower_bound":"NzU=","upper_bound":"N0k=","repeats":1},{"count":368,"lower_bound":"N0o=","upper_bound":"N04=","repeats":1},{"count":376,"lower_bound":"N1A=","upper_bound":"N1Q=","repeats":1},{"count":384,"lower_bound":"N1Y=","upper_bound":"N2Q=","repeats":1},{"count":392,"lower_bound":"N2g=","upper_bound":"N24=","repeats":1},{"count":400,"lower_bound":"N28=","upper_bound":"N3M=","repeats":1},{"count":408,"lower_bound":"N3Q=","upper_bound":"N3k=","repeats":1},{"count":416,"lower_bound":"N3o=","upper_bound":"ODE=","repeats":1},{"count":424,"lower_bound":"ODM=","upper_bound":"ODY=","repeats":1},{"count":432,"lower_bound":"ODg=","upper_bound":"OEQ=","repeats":1},{"count":440,"lower_bound":"OEU=","upper_bound":"OE0=","repeats":1},{"count":448,"lower_bound":"OFA=","upper_bound":"OFU=","repeats":1},{"count":456,"lower_bound":"OFc=","upper_bound":"OGI=","repeats":1},{"count":464,"lower_bound":"OGM=","upper_bound":"OG4=","repeats":1},{"count":472,"lower_bound":"OHA=","upper_bound":"OHk=","repeats":1},{"count":480,"lower_bound":"OHo=","upper_bound":"OTI=","repeats":1},{"count":488,"lower_bound":"OTM=","upper_bound":"OUE=","repeats":1},{"count":496,"lower_bound":"OUQ=","upper_bound":"OUc=","repeats":1},{"count":504,"lower_bound":"OUs=","upper_bound":"OU8=","repeats":1},{"count":512,"lower_bound":"OVA=","upper_bound":"OVg=","repeats":1},{"count":520,"lower_bound":"OVk=","upper_bound":"OWM=","repeats":1},{"count":528,"lower_bound":"OWY=","upper_bound":"OXA=","repeats":1},{"count":536,"lower_bound":"OXI=","upper_bound":"OXY=","repeats":1},{"count":544,"lower_bound":"OXc=","upper_bound":"QQ==","repeats":1},{"count":552,"lower_bound":"QTA=","upper_bound":"QUI=","repeats":1},{"count":560,"lower_bound":"QUM=","upper_bound":"QU8=","repeats":1},{"count":568,"lower_bound":"QVM=","upper_bound":"QVc=","repeats":1},{"count":576,"lower_bound":"QVk=","upper_bound":"QWM=","repeats":1},{"count":584,"lower_bound":"QWQ=","upper_bound":"QWs=","repeats":1},{"count":592,"lower_bound":"QW4=","upper_bound":"QXQ=","repeats":1},{"count":600,"lower_bound":"QXU=","upper_bound":"QXo=","repeats":1},{"count":608,"lower_bound":"Qg==","upper_bound":"QjU=","repeats":1},{"count":616,"lower_bound":"Qjc=","upper_bound":"QkM=","repeats":1},{"count":624,"lower_bound":"QkQ=","upper_bound":"Qks=","repeats":1},{"count":632,"lower_bound":"Qkw=","upper_bound":"QmI=","repeats":1},{"count":640,"lower_bound":"Qmc=","upper_bound":"Qm8=","repeats":1},{"count":648,"lower_bound":"QnA=","upper_bound":"Qng=","repeats":1},{"count":656,"lower_bound":"Qnk=","upper_bound":"Qzc=","repeats":1},{"count":664,"lower_bound":"Qzg=","upper_bound":"Q0U=","repeats":1},{"count":672,"lower_bound":"Q0k=","upper_bound":"Q00=","repeats":1},{"count":680,"lower_bound":"Q04=","upper_bound":"Q1I=","repeats":1},{"count":688,"lower_bound":"Q1M=","upper_bound":"Q1o=","repeats":1},{"count":696,"lower_bound":"Q2E=","upper_bound":"Q2Y=","repeats":1},{"count":704,"lower_bound":"Q2w=","upper_bound":"Q3E=","repeats":1},{"count":712,"lower_bound":"Q3I=","upper_bound":"Q3U=","repeats":1},{"count":720,"lower_bound":"Q3k=","upper_bound":"RDg=","repeats":1},{"count":728,"lower_bound":"RDk=","upper_bound":"REo=","repeats":1},{"count":736,"lower_bound":"REs=","upper_bound":"RFA=","repeats":1},{"count":744,"lower_bound":"RFE=","upper_bound":"RFg=","repeats":1},{"count":752,"lower_bound":"RFo=","upper_bound":"RGc=","repeats":1},{"count":760,"lower_bound":"RGk=","upper_bound":"RG0=","repeats":1},{"count":768,"lower_bound":"RHA=","upper_bound":"RHM=","repeats":1},{"count":776,"lower_bound":"RHQ=","upper_bound":"RHo=","repeats":1},{"count":784,"lower_bound":"RQ==","upper_bound":"RTM=","repeats":1},{"count":792,"lower_bound":"RTQ=","upper_bound":"RUE=","repeats":1},{"count":800,"lower_bound":"RUI=","upper_bound":"RUY=","repeats":1},{"count":808,"lower_bound":"RUc=","upper_bound":"RUo=","repeats":1},{"count":816,"lower_bound":"RUs=","upper_bound":"RU4=","repeats":1},{"count":824,"lower_bound":"RU8=","upper_bound":"RVQ=","repeats":1},{"count":832,"lower_bound":"RVg=","upper_bound":"RWI=","repeats":1},{"count":840,"lower_bound":"RWM=","upper_bound":"RWk=","repeats":1},{"count":848,"lower_bound":"RWs=","upper_bound":"RXQ=","repeats":1},{"count":856,"lower_bound":"RXY=","upper_bound":"RjA=","repeats":1},{"count":864,"lower_bound":"RjQ=","upper_bound":"RkE=","repeats":1},{"count":872,"lower_bound":"RkI=","upper_bound":"Rkc=","repeats":1},{"count":880,"lower_bound":"Rkg=","upper_bound":"Rks=","repeats":1},{"count":888,"lower_bound":"Rkw=","upper_bound":"RlQ=","repeats":1},{"count":896,"lower_bound":"RlY=","upper_bound":"RmU=","repeats":1},{"count":904,"lower_bound":"Rmo=","upper_bound":"Rm4=","repeats":1},{"count":912,"lower_bound":"Rm8=","upper_bound":"RnU=","repeats":1},{"count":920,"lower_bound":"RnY=","upper_bound":"RzE=","repeats":1},{"count":928,"lower_bound":"RzM=","upper_bound":"Rzk=","repeats":1},{"count":936,"lower_bound":"R0E=","upper_bound":"R0k=","repeats":1},{"count":944,"lower_bound":"R0s=","upper_bound":"R04=","repeats":1},{"count":952,"lower_bound":"R08=","upper_bound":"R1U=","repeats":1},{"count":960,"lower_bound":"R1g=","upper_bound":"R2Q=","repeats":1},{"count":968,"lower_bound":"R2U=","upper_bound":"R24=","repeats":1},{"count":976,"lower_bound":"R28=","upper_bound":"R3Q=","repeats":1},{"count":984,"lower_bound":"R3k=","upper_bound":"SDM=","repeats":1},{"count":992,"lower_bound":"SDU=","upper_bound":"SDg=","repeats":1},{"count":1000,"lower_bound":"SEM=","upper_bound":"SEg=","repeats":1},{"count":1008,"lower_bound":"SEk=","upper_bound":"SE8=","repeats":1},{"count":1016,"lower_bound":"SFE=","upper_bound":"SGE=","repeats":1},{"count":1024,"lower_bound":"SGI=","upper_bound":"SGU=","repeats":1},{"count":1032,"lower_bound":"SGc=","upper_bound":"SG4=","repeats":1},{"count":1040,"lower_bound":"SG8=","upper_bound":"SHQ=","repeats":1},{"count":1048,"lower_bound":"SHU=","upper_bound":"STI=","repeats":1},{"count":1056,"lower_bound":"STM=","upper_bound":"SUQ=","repeats":1},{"count":1064,"lower_bound":"SUc=","upper_bound":"SU0=","repeats":1},{"count":1072,"lower_bound":"SVA=","upper_bound":"SVQ=","repeats":1},{"count":1080,"lower_bound":"SVg=","upper_bound":"SWQ=","repeats":1},{"count":1088,"lower_bound":"SWU=","upper_bound":"SWg=","repeats":1},{"count":1096,"lower_bound":"SWk=","upper_bound":"SXE=","repeats":1},{"count":1104,"lower_bound":"SXI=","upper_bound":"SjA=","repeats":1},{"count":1112,"lower_bound":"SjI=","upper_bound":"SjU=","repeats":1},{"count":1120,"lower_bound":"SjY=","upper_bound":"SkE=","repeats":1},{"count":1128,"lower_bound":"SkI=","upper_bound":"SkY=","repeats":1},{"count":1136,"lower_bound":"Sk8=","upper_bound":"SlM=","repeats":1},{"count":1144,"lower_bound":"SlY=","upper_bound":"SmE=","repeats":1},{"count":1152,"lower_bound":"Smo=","upper_bound":"Sm0=","repeats":1},{"count":1160,"lower_bound":"Sm8=","upper_bound":"SnQ=","repeats":1},{"count":1168,"lower_bound":"SnY=","upper_bound":"Snk=","repeats":1},{"count":1176,"lower_bound":"Sno=","upper_bound":"SzM=","repeats":1},{"count":1184,"lower_bound":"SzY=","upper_bound":"S0Y=","repeats":1},{"count":1192,"lower_bound":"S0g=","upper_bound":"S08=","repeats":1},{"count":1200,"lower_bound":"S1A=","upper_bound":"S1g=","repeats":1},{"count":1208,"lower_bound":"S1k=","upper_bound":"S2Y=","repeats":1},{"count":1216,"lower_bound":"S2c=","upper_bound":"S2s=","repeats":1},{"count":1224,"lower_bound":"S2w=","upper_bound":"S3U=","repeats":1},{"count":1232,"lower_bound":"S3Y=","upper_bound":"TDA=","repeats":1},{"count":1240,"lower_bound":"TDI=","upper_bound":"TEE=","repeats":1},{"count":1248,"lower_bound":"TEQ=","upper_bound":"TEk=","repeats":1},{"count":1256,"lower_bound":"TEo=","upper_bound":"TE0=","repeats":1},{"count":1264,"lower_bound":"TE4=","upper_bound":"TFY=","repeats":1},{"count":1272,"lower_bound":"TFg=","upper_bound":"TGM=","repeats":1},{"count":1280,"lower_bound":"TGQ=","upper_bound":"TGg=","repeats":1},{"count":1288,"lower_bound":"TGk=","upper_bound":"THA=","repeats":1},{"count":1296,"lower_bound":"THI=","upper_bound":"THc=","repeats":1},{"count":1304,"lower_bound":"THg=","upper_bound":"TQ==","repeats":1},{"count":1312,"lower_bound":"TTQ=","upper_bound":"TTk=","repeats":1},{"count":1320,"lower_bound":"TUE=","upper_bound":"TUc=","repeats":1},{"count":1328,"lower_bound":"TUk=","upper_bound":"TVI=","repeats":1},{"count":1336,"lower_bound":"TVM=","upper_bound":"TWE=","repeats":1},{"count":1344,"lower_bound":"TWI=","upper_bound":"TWg=","repeats":1},{"count":1352,"lower_bound":"TWk=","upper_bound":"TW8=","repeats":1},{"count":1360,"lower_bound":"TXI=","upper_bound":"TXY=","repeats":1},{"count":1368,"lower_bound":"TXg=","upper_bound":"TjU=","repeats":1},{"count":1376,"lower_bound":"TjY=","upper_bound":"TkU=","repeats":1},{"count":1384,"lower_bound":"TkY=","upper_bound":"Tk0=","repeats":1},{"count":1392,"lower_bound":"Tk8=","upper_bound":"TlI=","repeats":1},{"count":1400,"lower_bound":"TlM=","upper_bound":"TmE=","repeats":1},{"count":1408,"lower_bound":"TmM=","upper_bound":"Tmo=","repeats":1},{"count":1416,"lower_bound":"Tm4=","upper_bound":"TnM=","repeats":1},{"count":1424,"lower_bound":"TnQ=","upper_bound":"Tnc=","repeats":1},{"count":1432,"lower_bound":"Tng=","upper_bound":"TzY=","repeats":1},{"count":1440,"lower_bound":"Tzc=","upper_bound":"T0M=","repeats":1},{"count":1448,"lower_bound":"T0Y=","upper_bound":"T08=","repeats":1},{"count":1456,"lower_bound":"T1M=","upper_bound":"T1g=","repeats":1},{"count":1464,"lower_bound":"T1k=","upper_bound":"T2Y=","repeats":1},{"count":1472,"lower_bound":"T2g=","upper_bound":"T28=","repeats":1},{"count":1480,"lower_bound":"T3A=","upper_bound":"T3U=","repeats":1},{"count":1488,"lower_bound":"T3Y=","upper_bound":"UDA=","repeats":1},{"count":1496,"lower_bound":"UDM=","upper_bound":"UEM=","repeats":1},{"count":1504,"lower_bound":"UEU=","upper_bound":"UFA=","repeats":1},{"count":1512,"lower_bound":"UFI=","upper_bound":"UGI=","repeats":1},{"count":1520,"lower_bound":"UGM=","upper_bound":"UG0=","repeats":1},{"count":1528,"lower_bound":"UG4=","upper_bound":"UHQ=","repeats":1},{"count":1536,"lower_bound":"UHU=","upper_bound":"UTE=","repeats":1},{"count":1544,"lower_bound":"UTQ=","upper_bound":"UTg=","repeats":1},{"count":1552,"lower_bound":"UTk=","upper_bound":"UUk=","repeats":1},{"count":1560,"lower_bound":"UUs=","upper_bound":"UVM=","repeats":1},{"count":1568,"lower_bound":"UVU=","upper_bound":"UVo=","repeats":1},{"count":1576,"lower_bound":"UWI=","upper_bound":"UWY=","repeats":1},{"count":1584,"lower_bound":"UWo=","upper_bound":"UW0=","repeats":1},{"count":1592,"lower_bound":"UW4=","upper_bound":"UXQ=","repeats":1},{"count":1600,"lower_bound":"UXU=","upper_bound":"UXk=","repeats":1},{"count":1608,"lower_bound":"UXo=","upper_bound":"Ujg=","repeats":1},{"count":1616,"lower_bound":"Ujk=","upper_bound":"Ukk=","repeats":1},{"count":1624,"lower_bound":"Uko=","upper_bound":"Uk8=","repeats":1},{"count":1632,"lower_bound":"UlA=","upper_bound":"Ulk=","repeats":1},{"count":1640,"lower_bound":"Ulo=","upper_bound":"UmM=","repeats":1},{"count":1648,"lower_bound":"UmY=","upper_bound":"Um4=","repeats":1},{"count":1656,"lower_bound":"UnE=","upper_bound":"UnQ=","repeats":1},{"count":1664,"lower_bound":"UnU=","upper_bound":"Unk=","repeats":1},{"count":1672,"lower_bound":"Uno=","upper_bound":"UzU=","repeats":1},{"count":1680,"lower_bound":"Uzc=","upper_bound":"U0E=","repeats":1},{"count":1688,"lower_bound":"U0I=","upper_bound":"U0Y=","repeats":1},{"count":1696,"lower_bound":"U0c=","upper_bound":"U00=","repeats":1},{"count":1704,"lower_bound":"U04=","upper_bound":"U1I=","repeats":1},{"count":1712,"lower_bound":"U1c=","upper_bound":"U2I=","repeats":1},{"count":1720,"lower_bound":"U2Q=","upper_bound":"U2k=","repeats":1},{"count":1728,"lower_bound":"U2o=","upper_bound":"U24=","repeats":1},{"count":1736,"lower_bound":"U28=","upper_bound":"U3Q=","repeats":1},{"count":1744,"lower_bound":"U3U=","upper_bound":"VDE=","repeats":1},{"count":1752,"lower_bound":"VDU=","upper_bound":"VDg=","repeats":1},{"count":1760,"lower_bound":"VDk=","upper_bound":"VEM=","repeats":1},{"count":1768,"lower_bound":"VEU=","upper_bound":"VEo=","repeats":1},{"count":1776,"lower_bound":"VE0=","upper_bound":"VFA=","repeats":1},{"count":1784,"lower_bound":"VFE=","upper_bound":"VFg=","repeats":1},{"count":1792,"lower_bound":"VGE=","upper_bound":"VGc=","repeats":1},{"count":1800,"lower_bound":"VGo=","upper_bound":"VHQ=","repeats":1},{"count":1808,"lower_bound":"VHU=","upper_bound":"VHg=","repeats":1},{"count":1816,"lower_bound":"VTE=","upper_bound":"VUE=","repeats":1},{"count":1824,"lower_bound":"VUU=","upper_bound":"VUo=","repeats":1},{"count":1832,"lower_bound":"VUs=","upper_bound":"VU4=","repeats":1},{"count":1840,"lower_bound":"VVE=","upper_bound":"VVY=","repeats":1},{"count":1848,"lower_bound":"VVc=","upper_bound":"VVo=","repeats":1},{"count":1856,"lower_bound":"VWI=","upper_bound":"VWk=","repeats":1},{"count":1864,"lower_bound":"VWo=","upper_bound":"VW0=","repeats":1},{"count":1872,"lower_bound":"VW4=","upper_bound":"VXI=","repeats":1},{"count":1880,"lower_bound":"VXM=","upper_bound":"VXg=","repeats":1},{"count":1888,"lower_bound":"VXk=","upper_bound":"VjQ=","repeats":1},{"count":1896,"lower_bound":"VjY=","upper_bound":"Vjk=","repeats":1},{"count":1904,"lower_bound":"VkM=","upper_bound":"Vkc=","repeats":1},{"count":1912,"lower_bound":"Vk0=","upper_bound":"VlI=","repeats":1},{"count":1920,"lower_bound":"VlQ=","upper_bound":"VmM=","repeats":1},{"count":1928,"lower_bound":"VmQ=","upper_bound":"Vmk=","repeats":1},{"count":1936,"lower_bound":"Vms=","upper_bound":"Vm8=","repeats":1},{"count":1944,"lower_bound":"VnI=","upper_bound":"Vno=","repeats":1},{"count":1952,"lower_bound":"Vw==","upper_bound":"VzQ=","repeats":1},{"count":1960,"lower_bound":"VzU=","upper_bound":"Vzg=","repeats":1},{"count":1968,"lower_bound":"Vzk=","upper_bound":"V0U=","repeats":1},{"count":1976,"lower_bound":"V0Y=","upper_bound":"ZA==","repeats":1},{"count":1984,"lower_bound":"ZQ==","upper_bound":"aQ==","repeats":1},{"count":1992,"lower_bound":"bA==","upper_bound":"cQ==","repeats":1},{"count":2000,"lower_bound":"cw==","upper_bound":"dw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,1,1,0,0,1,1,0,0,0,3,1,2,0,4,3,2,1,3,1,3,0,0,0,0,2,0,0,1,0,1,5,0,0,1,0,2,0,2,1,1,2,0,1,0,0,1,1,0,0,2,1,2,1,1,2,2,0,0,3,1,0,1,1,0,0,1,2,0,3,0,0,0,2,1,4,2,1,1,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,1,1,0,1,2,2,2,0,2,1,1,0,2,0,2,2,0,0,0,1,1,1,0,1,2,0,2,0,0,1,1,2,2,0,0,2,0,2,0,0,2,2,2,0,0,1,1,1,3,0,2,3,2,1,1,0,0,1,0,0,1,0,0,1,0,0,2,2,1,0,0,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,2,1,1,2,1,3,1,2,1,1,0,2,2,1,0,0,2,1,0,1,2,0,0,0,2,3,0,0,0,3,1,1,2,2,0,2,1,3,0,0,0,2,3,0,2,1,0,0,1,2,0,1,2,0,3,2,0,1,1,1,0,0,2,1,0,1,1,0,0,0,2,1,1,1,2,2,0,1,0,0,1,1,2,2,1,2,1,1,0,3,1,2,2,2,0,1,3,0,0,1,1,4,2,1,2,0,2,0,1,0,1,0,1,1,0,1,2,1,1,0,0,0,1,1,2,2,2,0,2,0,3,2,1,1,0,2,2,1,0,2,3,1,1,1,0,2,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,2,0,0,1,1,1,2,1,0,0,1,0,1,1,2,2,0,0,1,1,1,0,0,0,0,1,3,2,4,0,0,1,1,1,0,0,1,0,0,1,2,2,0,1,0,2,1,1,1,3,1,1,1,2,3,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,2,1,1,1,1,1,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,1,0,1,4,0,0,1,0,1,0,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,0,0,0,2,0,2,0,1,1,2,3,1,1,0,1,0,1,2,0,0,0,1,1,0,2,2,1,0,1,2,2,1,0,0,2,1,1,2,3,0,2,1,1,0,1,3,0,2,1,1,1,1,1,0,2,0,1,1,1,0,2,1,1,2,0,3,1,2,0,0,0,0,2,3,1,4,0,1,3,1,1,2,1,1,0,2,0,3,1,1,0,1,0,1,2,0,1,1,1,1,1,1,0,1,1,0,2,0,2,1,0,0,0,0,3,3,2,3,0,0,2,0,1,0,0,1,0,1,3,1,3,0,2,0,4,0,0,1,0,1,4,1,1,0,2,2,0,0,1,0,1,1,1,0,3,1,1,1,1,0,0,0,0,0,0,1,2,0,0,0,2,2,0,3,0,0,2,0,1,0,1,1,0,1,1,3,0,0,1,3,1,0,0,0,2,1,1,4,1,1,1,0,2,0,1,1,1,0,1,2,1,0,0,3,1,3,2,1,0,1,1,0,2,0,0,1,0,4,1,1,1,0,2,1,1,0,2,1,0,0,2,0,1,1,0,1,2,2,2,1,1,1,1,0,0,0,0,0,5,0,1,0,2,2,2,0,1,3,1,1,2,1,2,1,1,0,0,3,0,2,0,0,1,0,1,2,1,2,2,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,0,3,0,2,2,0,2,2,5,2,3,0,1,4,2,0,0,1,2,2,0,0,2,1,0,0,0,3,1,0,1,1,0,0,1,2,1,4,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,1,3,1,0,3,1,3,0,2,1,1,0,2,2,1,0,0,2,2,0,2,0,1,3,2,1,2,1,0,1,0,0,1,2,1,1,1,1,1,0,2,1,0,1,0,0,2,0,1,2,3,1,1,1,1,2,1,0,1,3,1,0,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,0,2,0,0,1,0,0,0,1,1,3,1,0,1,0,1,2,2,1,1,0,2,1,2,1,0,0,2,0,1,1,1,1,2,0,1,4,3,1,1,2,3,0,3,1,0,0,1,1,1,0,3,0,1,1,0,1,3,2,1,2,2,0,1,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,2,1,1,1,0,2,1,3,0,0,0,1,1,1,1,0,0,0,1,2,1,3,0,0,3,0,0,1,1,2,0,1,1,1,5,0,2,3,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,2,1,1,3,1,0,0,1,2,0,1,1,2,2,0,1,1,2,0,1,1,0,0,1,1,2,0,1,1,0,2,1,2,1,1,1,0,2,2,1,4,0,1,2,1,1,0,2,0,1,1,3,0,1,2,3,0,1,1,0,0,1,1,2,0,1,0,2,2,2,0,0,0,0,1,1,4,3,3,2,4,1,1,1,1,2,0,1,0,1,0,0,2,1,0,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,4,1,1,2,1,0,0,1,0,1,1,1,0,1,1,1,0,0,2,0,1,0,1,0,2,1,1,2,1,1,3,1,1,0,1,1,3,2,0,0,0,0,1,0,1,1,1,2,1,2,0,1,0,1,1,2,3,1,0,1,1,0,0,2,1,1,0,0,0,1,0,0,0,1,1,2,3,0,0,2,1,3,1,0,0,1,0,2,1,2,1,0,2,0,0,1,1,1,1,0,0,1,0,0,2,0,1,3,1,2,0,3,0,1,1,2,2,0,0,0,1,0,0,0,0,1,1,0,2,1,2,2,0,1,0,1,3,0,0,2,0,2,3,2,1,1,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,1,3,1,1,0,1,1,0,0,1,0,1,1,1,0,2,4,2,1,0,1,1,2,1,2,2,1,1,0,1,0,1,0,1,0,2,1,0,0,2,1,1,0,0,1,0,0,1,1,1,1,1,0,0,4,0,0,0,2,1,1,1,0,2,1,0,3,2,2,0,0,1,0,2,2,1,4,0,2,2,4,0,0,1,4,0,2,0,0,2,1,1,0,0,5,0,0,0,2,1,1,1,1,1,2,0,1,4,6,2,1,1,0,0,1,1,1,0,0,2,1,0,1,1,1,1,3,0,0,2,0,0,0,1,1,1,0,0,1,1,1,2,0,0,1,0,3,0,1,2,0,0,1,0,0,1,2,2,0,0,1,2,1,2,1,2,0,0,1,1,1,3,0,0,0,0,0,2,1,1,0,1,0,0,0,0,2,1,0,0,0,1,4,2,0,2,2,0,2,0,0,4,0,1,2,2,1,1,0,0,1,3,2,2,2,0,2,2,3,0,2,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,3,1,3,0,3,0,0,0,1,2,0,4,2,1,1,1,1,0,1,0,1,1,1,1,1,2,1,0,3,0,1,1,0,1,0,2,0,1,4,0,0,0,2,0,1,0,0,1,2,1,0,0,0,0,3,2,1,1,3,2,0,1,3,0,0,0,1,0,2,1,2,1,2,0,1,2,1,1,0,2,2,0,0,1,1,0,3,0,2,1,1,1,0,1,0,0,1,1,1,0,2,1,1,1,1,3,1,1,0,0,0,1,0,1,0,1,0,1,0,1,2,2,0,0,3,0,0,0,0,0,3,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,3,1,0,4,0,2,2,1,2,1,1,2,2,1,0,2,0,1,0,0,2,1,1,0,0,0,0,0,3,2,4,2,0,1,2,0,0,0,0,2,1,2,1,0,1,2,4,0,0,0,0,0,1,1,1,0,1,0,2,1,0,0,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,0,1,2,3,0,4,2,0,2,1,1,1,0,3,0,0,0,1,0,0,0,2,0,1,3,0,2,0,1,0,4,2,3,2,0,0,2,3,3,2,2,0,0,0,2,3,2,2,0,0,1,0,0,0,0,0,2,1,1,2,0,1,0,0,0,0,3,2,3,3,0,3,1,0,2,1,0,0,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,2,2,1,2,1,0,2,2,2,0,1,1,1,0,0,1,1,1,0,1,2,1,3,0,0,5,1,1,0,0,1,0,2,0,0,1,0,0,1,1,2,2,2,1,2,0,1,1,2,1,0,2,1,0,3,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,0,1,0,1,2,1,2,1,1,1,1,0,0,1,0,0,0,0,1,1,1,0,1,0,0,2,1,2,2,0,1,0,2,1,4,2,0,1,2,0,1,1,0,0,0,2,0,0,1,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,3,1,2,4,1,0,1,0,0,1,0,1,1,2,2,3,0,1,2,0,1,1,2,1,0,0,2,0,2,0,1,0,0,2,2,1,0,0,2]},{"counters":[1,0,1,1,0,0,0,0,1,2,1,0,0,1,1,1,2,1,3,2,1,0,2,1,1,0,0,2,0,2,1,0,2,0,1,2,0,1,0,1,1,1,2,0,2,1,1,0,1,2,1,2,1,3,0,2,0,2,0,2,3,0,1,3,0,1,3,0,1,1,1,0,1,2,3,0,2,0,1,0,0,1,2,1,1,1,2,0,1,2,2,0,1,1,0,2,2,1,1,1,1,0,0,2,2,1,2,1,1,0,3,0,0,1,0,1,1,0,3,2,0,1,1,1,1,1,3,2,0,0,2,1,0,0,1,1,2,0,1,1,0,0,0,1,0,1,0,2,2,4,1,1,1,0,0,2,1,1,2,0,1,0,1,0,1,2,2,2,2,1,0,1,2,0,0,0,1,1,1,0,3,0,1,0,1,1,1,0,1,0,1,2,2,0,0,1,0,3,0,1,1,2,0,0,1,0,0,1,0,3,0,2,0,2,0,2,1,1,2,1,1,1,0,0,0,0,2,3,0,1,1,1,0,4,1,0,3,0,3,2,0,2,1,0,1,1,1,0,1,0,2,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,3,1,3,1,0,2,2,1,0,1,3,1,2,0,0,4,2,0,1,2,2,1,1,2,0,1,1,1,0,3,0,3,0,1,0,1,1,2,3,2,1,1,2,1,1,0,0,0,3,1,1,2,0,1,2,0,1,0,0,0,2,0,0,0,2,1,3,2,0,2,0,0,1,2,0,0,1,0,1,1,1,0,0,1,1,0,0,2,0,0,3,1,3,2,0,1,5,0,0,2,1,1,1,0,1,1,0,2,2,3,0,3,1,1,2,1,3,0,1,1,2,1,0,2,0,2,1,0,2,0,1,0,0,2,1,3,0,0,0,2,3,0,2,1,1,1,3,2,1,1,0,1,2,0,1,1,0,1,1,1,1,1,1,1,1,3,1,0,0,2,0,1,0,0,1,0,0,2,0,2,1,1,3,1,1,0,1,0,0,3,0,0,0,1,1,1,0,1,1,2,2,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,2,2,1,1,0,1,1,0,1,1,2,1,2,1,1,0,1,1,1,0,0,1,2,0,0,0,0,0,1,2,0,0,0,0,0,0,1,1,1,1,1,1,3,1,1,0,0,0,0,1,0,2,2,2,1,0,0,0,2,0,1,2,0,0,1,1,0,2,1,1,1,1,1,1,3,1,1,2,0,1,1,1,1,2,1,1,0,3,0,0,0,0,2,0,0,2,1,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,0,1,2,0,0,0,0,2,2,0,0,1,2,0,3,3,1,1,0,0,1,0,0,1,1,0,0,2,1,3,0,2,1,1,0,0,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,2,0,0,2,2,2,1,2,1,2,0,1,2,0,1,2,5,1,2,1,1,0,3,1,3,2,0,1,0,1,2,3,0,1,0,1,1,1,0,1,0,2,3,1,1,3,1,1,0,0,0,0,1,0,2,1,0,0,1,0,0,1,2,1,0,2,0,1,1,4,1,1,0,0,0,0,0,0,2,0,0,1,1,2,1,2,3,0,1,2,1,1,2,2,0,1,4,0,2,1,0,2,1,2,0,1,2,1,0,1,0,0,0,2,0,0,1,2,1,2,0,3,1,0,1,0,1,2,3,1,0,0,1,2,0,2,2,1,1,1,1,1,2,0,3,1,5,2,2,2,2,2,2,0,0,2,1,2,1,1,2,0,1,2,0,1,0,4,0,1,0,0,2,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,1,1,1,1,0,1,0,0,2,3,1,2,2,1,0,0,2,0,0,2,0,1,0,1,1,1,2,2,1,2,2,2,0,3,2,1,1,1,0,1,2,3,1,1,0,0,2,1,2,1,2,3,1,0,1,2,0,0,1,0,1,0,3,2,4,1,2,2,2,1,1,2,0,0,1,1,2,0,1,1,2,2,1,0,0,1,1,1,0,2,1,2,4,0,1,0,0,1,2,0,0,1,0,0,2,1,1,0,1,1,1,1,0,1,1,2,3,3,1,1,1,0,1,1,0,0,1,2,1,1,4,2,2,0,1,1,0,4,1,0,1,1,1,0,0,1,1,0,0,3,2,2,0,1,0,0,2,2,0,0,0,1,0,2,1,1,1,1,3,0,1,1,1,0,3,2,0,2,0,0,1,2,4,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,0,0,2,2,1,1,1,0,0,1,0,0,0,1,0,0,1,1,1,3,0,1,1,1,0,1,0,1,0,1,1,1,0,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,1,3,1,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,0,2,1,1,1,1,0,1,1,0,4,2,1,1,0,4,2,2,0,0,0,3,1,1,2,0,3,0,0,1,1,0,0,1,1,0,1,0,1,0,0,0,1,1,1,3,1,1,1,1,1,2,0,1,1,1,0,2,0,1,0,0,2,1,2,1,0,2,0,1,0,0,1,1,0,0,0,0,0,2,0,1,2,1,0,1,0,0,0,0,2,0,0,1,0,2,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,1,1,3,1,0,0,3,1,1,1,3,1,1,0,0,1,0,2,1,1,0,2,0,0,2,0,2,0,4,0,0,0,2,1,0,0,3,2,1,3,0,0,1,0,1,3,1,1,0,1,0,1,0,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,1,0,0,1,1,0,1,2,1,1,2,3,0,0,0,0,1,1,1,0,1,3,0,1,4,0,1,2,1,0,1,0,0,0,0,2,1,1,0,0,1,1,0,1,1,0,1,3,0,1,1,3,0,0,1,0,1,1,1,1,0,1,0,0,1,1,0,3,0,1,1,0,0,1,1,0,0,0,0,0,1,1,2,0,1,2,1,2,0,0,2,1,0,0,2,0,4,1,4,2,0,0,0,1,1,0,1,1,0,0,1,0,0,4,2,1,0,1,1,1,2,2,0,2,2,1,0,3,1,2,1,2,0,2,0,1,1,5,2,0,3,0,0,1,0,0,1,0,1,0,0,0,3,2,0,3,1,1,5,1,1,3,2,2,2,0,1,0,0,0,2,1,1,3,2,0,2,1,0,1,1,2,1,0,1,2,1,2,0,2,2,1,1,1,2,1,0,0,2,1,1,0,3,0,1,0,5,0,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,1,2,0,1,3,2,1,0,1,1,2,1,0,0,0,1,0,0,0,1,1,2,0,1,1,0,5,4,0,1,1,1,2,0,0,0,2,2,1,0,2,0,2,0,1,1,0,0,0,1,2,0,0,2,1,0,0,1,0,0,1,2,2,0,2,4,2,1,0,2,1,0,0,3,0,0,2,1,0,0,1,1,2,0,1,3,1,1,1,0,0,0,2,0,0,0,1,0,0,3,3,0,1,2,1,3,1,1,1,0,1,0,1,1,0,1,0,0,0,1,0,1,1,0,2,0,0,0,2,0,1,0,3,0,0,1,1,3,0,1,1,0,1,1,2,0,1,1,3,1,2,1,2,1,1,0,1,2,1,0,0,1,3,1,2,4,1,1,1,1,1,1,0,0,0,3,2,1,0,1,1,0,3,1,0,0,0,2,0,0,1,0,1,1,1,2,1,2,0,0,3,1,2,0,0,0,2,2,0,1,0,0,0,1,1,1,3,0,0,1,2,1,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,0,0,2,3,2,2,0,0,1,1,2,1,0,2,2,3,0,0,1,0,0,0,1,0,0,1,1,3,1,2,3,2,0,2,1,0,0,0,2,4,1,0,0,3,0,2,1,2,1,0,1,0,1,1,0,0,1,3,2,0,1,0,3,2,0,1,0,0,1,1,0,0,2,1,0,2,1,0,1,3,3,4,1,1,0,3,2,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,2,0,3,0,1,0,1,0,1,0,0,2,1,1,0,1,1,2,0,0,0,1,1,3,1,2,1,1,4,2,0,1,2,0,3,1,2,0,0,0,1,1,1,0,1,1,0,0,0,1,3,0,2,1,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,1,0,0,2,3,1,0,1,0,1,0,0,2,2,0,3,2,1,4,1,0,1,0,1,2,1,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,0,1,2,0,1,2,1,0,0,0,0,1,2,1,0,1,0,1,3,2,1,0,0,0,1,1,1,2,0,1,0,1,0,1,1,2,2,0,1,2,0,1,3,2,0,1,4,1,0,1,5,0,0,1,2,1,4,0,1,1,3,1,1,3,0,1,3,2,0,1,0,1,0,1,2,0,1,0,1,2,1,0,2,2,1,0,0,0]},{"counters":[2,0,1,2,0,1,0,2,1,0,1,0,1,0,1,0,1,0,2,1,1,2,0,3,0,2,0,1,0,0,1,1,0,1,1,2,2,0,1,2,0,1,1,0,0,0,0,1,1,3,1,0,0,0,0,1,2,1,1,1,0,1,2,0,1,0,2,1,1,1,0,2,0,1,1,0,0,1,0,1,1,4,0,3,2,1,0,4,0,1,1,0,3,1,1,1,1,1,0,1,2,0,2,1,1,2,0,1,0,0,0,4,1,0,0,2,2,1,1,1,0,0,2,1,2,2,2,0,1,0,0,3,1,3,3,0,0,1,2,0,2,0,1,1,2,1,3,0,0,0,4,3,1,2,1,1,1,1,1,3,1,1,1,0,0,1,1,1,2,1,0,0,0,0,2,0,1,1,3,0,1,0,1,2,0,2,0,1,1,1,0,3,0,2,0,2,1,0,2,1,1,0,2,0,3,0,1,2,0,3,0,0,0,1,1,0,0,1,2,0,0,1,0,0,1,2,0,2,1,0,1,1,0,1,0,1,2,4,1,0,0,1,2,1,2,0,1,0,1,1,2,1,0,1,3,0,1,3,1,2,0,1,3,1,3,0,1,0,0,0,1,0,3,1,0,0,3,2,0,0,1,0,2,0,1,0,0,0,1,1,3,2,1,1,0,1,3,2,1,3,1,1,3,1,1,0,1,1,2,1,4,1,1,1,2,3,2,2,0,0,0,0,1,1,2,1,0,3,0,0,2,0,2,1,0,0,1,0,2,1,3,2,1,0,2,2,0,2,2,0,1,2,0,3,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,0,2,2,0,0,1,2,0,2,2,0,2,1,0,3,1,1,0,3,0,2,0,1,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,0,3,0,1,1,0,0,4,0,2,0,1,1,3,1,3,0,3,2,1,0,1,3,1,0,2,1,1,0,0,3,0,0,0,3,1,1,2,1,1,1,1,1,2,2,0,0,1,1,2,1,1,3,0,2,3,0,4,0,0,1,2,0,1,2,2,0,1,1,0,1,0,2,1,0,0,2,2,1,0,1,2,0,0,0,0,0,2,3,1,0,1,0,0,1,1,0,1,1,1,1,2,1,1,1,1,1,3,2,0,0,2,0,1,2,1,0,1,0,0,1,1,1,1,2,2,1,1,1,2,1,0,3,0,0,0,1,0,3,1,2,0,1,1,1,1,0,1,0,0,3,2,1,1,0,0,2,1,0,1,1,0,1,3,1,3,1,0,1,1,1,0,1,0,1,1,2,1,1,0,1,1,3,2,2,1,2,1,0,1,0,0,1,0,3,1,0,1,0,0,1,1,0,0,2,2,0,0,1,0,2,0,0,0,3,1,2,1,1,1,0,1,0,0,2,0,0,1,1,1,0,0,1,0,1,1,1,2,0,0,1,2,1,1,2,0,2,1,0,0,0,1,0,1,2,0,0,2,0,2,1,0,1,1,0,1,2,3,0,3,1,1,0,5,2,0,0,0,0,0,0,0,2,3,1,0,0,0,2,0,0,2,1,1,1,2,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,1,0,1,2,2,1,1,0,3,0,1,0,2,1,0,1,0,2,0,1,1,2,2,1,2,2,1,2,0,0,3,0,0,0,0,1,0,1,2,2,0,4,1,1,1,0,3,0,1,2,3,2,1,1,0,0,1,2,0,2,1,1,0,2,1,0,3,2,1,0,0,1,0,0,1,2,0,0,3,0,2,0,1,2,1,1,0,2,1,2,1,1,0,1,1,1,0,1,1,0,4,1,0,2,0,1,0,0,0,1,1,1,2,0,1,3,1,1,3,0,0,3,0,2,1,0,1,1,0,1,1,0,1,1,1,0,2,2,1,2,2,1,2,0,1,1,1,0,0,1,1,1,2,0,0,1,2,2,1,1,2,0,1,1,1,1,0,0,0,0,1,1,2,0,0,1,0,3,1,2,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,1,1,0,1,2,0,1,0,3,1,1,0,0,1,0,0,2,1,0,1,0,1,1,3,1,2,0,0,1,2,2,2,1,1,0,0,0,1,1,1,1,1,2,1,1,1,2,0,2,0,1,1,1,1,3,3,0,2,1,2,3,3,2,0,1,0,1,0,2,2,0,3,1,0,0,1,0,1,2,1,3,0,4,0,1,0,0,0,1,0,1,1,3,0,1,1,3,1,0,1,0,0,0,1,0,0,0,1,1,2,0,1,0,0,0,1,0,3,1,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,0,3,2,1,2,0,1,1,1,2,1,1,0,1,0,2,4,1,0,0,0,3,2,1,0,0,2,0,0,2,1,0,2,0,0,0,1,0,2,0,0,0,1,1,0,3,1,3,2,3,1,0,1,0,0,2,0,0,0,0,0,1,0,2,0,0,1,1,0,1,1,1,2,1,0,0,0,2,1,1,1,0,2,2,1,0,2,1,1,0,0,1,2,0,2,0,2,0,2,2,2,3,1,0,0,1,0,5,1,0,1,0,1,0,1,2,2,2,0,2,1,0,1,0,0,0,0,1,0,4,0,2,1,1,1,1,1,0,1,2,1,1,1,2,2,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,3,0,0,0,1,1,2,0,1,1,3,0,2,1,2,0,3,2,2,2,2,2,0,1,0,1,1,3,3,3,1,0,1,0,1,2,1,0,1,1,0,2,3,5,0,1,1,3,1,1,2,1,0,2,2,1,1,1,1,2,2,0,1,2,3,0,1,0,0,1,1,1,3,0,1,0,0,1,0,0,2,2,0,3,0,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,1,1,1,1,0,0,3,1,1,0,2,3,0,0,3,1,1,0,0,0,3,0,1,0,0,1,1,1,2,1,0,2,1,0,0,1,0,1,0,3,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,0,2,1,1,0,1,2,3,1,1,0,0,0,5,2,2,2,0,2,2,2,1,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,1,1,1,0,1,0,1,1,2,0,1,1,2,1,2,4,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,0,1,1,1,0,0,2,1,0,1,2,0,2,0,0,0,0,3,0,0,2,0,1,1,3,1,0,2,0,2,0,2,1,0,1,1,4,0,0,1,0,0,1,1,1,1,2,1,0,0,3,1,1,3,1,2,0,2,0,0,1,0,1,1,1,1,1,1,1,0,2,1,0,2,2,3,0,1,2,0,3,0,1,0,1,0,2,2,0,0,0,1,0,1,1,2,1,0,1,0,1,0,0,1,1,1,0,1,1,0,3,0,1,1,1,4,0,1,1,1,1,2,0,0,3,0,3,1,0,0,2,1,3,1,1,2,2,4,0,1,4,0,1,3,0,2,0,3,0,1,0,3,0,2,3,1,2,1,4,1,0,1,1,1,1,2,0,1,2,0,2,0,0,1,0,0,4,2,1,1,2,1,2,1,1,2,1,1,1,0,2,1,1,1,1,2,2,0,2,1,1,2,2,2,0,1,2,1,1,1,0,1,2,2,3,2,1,0,1,1,0,1,1,1,1,1,0,0,1,0,0,3,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,1,5,0,0,1,1,3,1,0,0,1,0,2,4,0,2,0,3,0,0,0,2,0,0,1,2,0,0,1,1,1,2,2,3,0,2,0,1,0,2,2,1,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,3,0,0,3,1,1,1,1,1,0,2,3,1,1,1,2,0,1,2,1,1,0,3,1,1,1,0,0,0,6,1,1,0,1,1,1,0,1,1,1,1,1,2,0,0,1,2,1,0,0,0,1,2,0,1,1,1,1,2,0,3,0,1,2,1,3,2,1,0,0,2,0,1,0,1,0,0,0,1,1,1,2,2,0,1,2,0,1,1,1,1,0,0,0,2,2,3,1,1,1,1,0,0,2,2,0,2,1,1,1,3,1,2,1,0,3,1,0,2,0,0,0,1,1,1,3,1,0,2,2,0,1,1,2,0,1,0,1,1,1,2,0,0,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,0,1,0,3,0,0,2,1,1,0,0,1,2,0,1,3,0,2,0,1,0,2,0,0,0,0,2,2,1,0,1,3,2,1,0,0,1,0,0,0,1,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,1,0,0,0,3,1,0,1,1,1,1,0,0,2,1,2,0,1,0,0,1,1,2,2,2,1,1,0,2,1,0,3,0,0,1,0,1,1,0,0,1,0,1,0,2,0,0,1,0,0,3,0,1,0,2,3,1,0,2,0,1,1,1,1,0,1,2]},{"counters":[0,1,0,0,0,2,2,3,2,1,1,0,0,0,1,2,1,0,1,0,0,2,1,2,1,1,3,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,2,0,1,1,1,1,1,1,1,0,3,0,0,0,0,2,0,0,1,0,4,1,1,2,1,0,1,1,1,1,1,1,0,0,0,1,2,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,1,1,0,1,0,3,1,0,1,1,1,1,0,1,1,2,1,0,2,1,1,0,2,2,0,0,1,1,1,1,1,2,0,1,0,0,2,2,0,0,1,0,2,0,2,1,3,2,1,1,3,1,1,0,2,0,0,0,1,1,1,0,1,2,3,0,1,0,1,1,3,0,2,2,0,1,2,1,1,0,0,3,1,0,0,1,1,0,2,0,1,1,2,0,2,0,1,1,3,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,0,2,1,2,1,0,0,1,1,2,1,1,1,1,3,0,0,0,0,3,1,0,1,1,1,1,0,1,2,0,0,0,3,1,1,2,2,0,1,3,0,1,1,1,0,1,0,2,0,1,2,0,2,2,1,1,1,1,0,2,1,1,2,3,0,1,0,2,0,0,1,0,1,0,1,0,2,2,1,0,0,2,2,2,1,0,0,1,1,0,1,1,1,1,0,3,1,1,1,0,2,0,2,0,0,1,0,2,0,1,2,0,0,0,3,1,2,0,1,1,1,1,0,4,1,3,2,1,0,2,1,1,0,1,1,1,1,0,4,3,2,1,0,1,2,2,2,2,1,1,1,1,2,5,0,0,0,0,0,3,2,2,0,1,2,1,3,2,2,1,2,1,2,1,0,1,0,2,2,0,0,1,2,0,1,1,2,0,1,1,1,2,2,4,2,0,0,1,0,3,1,1,2,1,1,1,0,0,0,1,0,2,2,1,0,1,1,2,0,0,2,3,2,1,0,1,0,1,1,1,0,0,0,1,0,2,2,2,0,1,1,1,0,2,1,1,0,2,3,1,5,2,3,4,0,1,2,1,1,1,0,1,1,1,1,0,0,0,1,2,0,2,0,5,0,2,1,3,1,1,3,0,1,3,1,0,1,1,0,0,0,1,1,1,0,1,1,0,2,4,1,0,1,1,0,2,0,1,1,1,1,0,1,2,1,0,2,3,0,2,4,1,2,0,1,2,2,0,1,1,2,0,1,1,1,0,1,0,0,1,0,1,5,0,0,0,1,0,0,0,0,1,2,1,3,2,2,1,1,1,0,1,0,1,2,0,0,2,1,1,3,1,0,0,1,1,1,2,1,0,1,3,1,1,1,0,0,1,1,0,0,1,1,1,2,2,2,0,2,0,0,2,2,2,0,0,1,0,3,0,0,1,0,2,1,0,0,1,1,0,1,1,0,0,0,1,2,3,0,3,2,1,2,1,0,0,1,2,1,0,1,0,0,1,1,1,0,1,2,1,0,0,2,1,1,0,3,1,3,1,1,0,1,1,1,3,0,2,1,0,1,4,2,1,2,0,0,0,2,3,0,2,2,0,0,1,0,2,0,1,1,0,1,2,0,2,0,0,1,0,3,0,1,2,3,1,1,1,0,0,1,2,4,0,0,1,0,3,0,1,0,2,1,0,0,0,2,3,3,3,3,0,0,2,0,2,2,1,0,1,0,0,2,1,0,0,1,1,2,0,0,0,0,4,1,1,1,0,1,3,1,0,0,0,2,0,1,1,0,2,0,1,0,0,2,1,1,0,0,0,1,2,1,2,0,2,3,2,0,2,0,2,0,0,0,0,0,0,1,0,0,0,1,1,2,0,3,0,0,1,1,0,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,1,4,2,1,1,0,3,1,0,2,0,1,0,1,2,1,0,0,2,0,3,2,0,1,1,0,0,3,0,1,0,1,1,1,1,0,3,0,0,0,1,2,3,0,1,0,1,3,2,1,0,1,1,0,1,0,0,0,0,1,1,0,2,0,3,2,2,2,0,1,3,1,0,1,1,2,2,2,2,1,1,3,1,0,1,0,1,4,1,0,1,1,1,1,0,0,3,3,0,1,2,1,0,1,2,2,1,0,0,2,3,3,1,0,1,1,0,1,1,2,1,0,0,0,1,1,2,0,1,1,2,2,2,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,2,1,0,1,2,3,0,1,0,0,0,1,0,2,3,0,1,0,1,1,0,1,0,0,2,1,1,3,0,0,1,2,1,1,2,1,1,0,1,3,2,1,0,0,2,2,0,0,0,1,2,1,0,0,1,0,0,1,0,0,1,2,0,2,2,0,0,0,1,0,0,2,1,1,2,2,0,1,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,3,0,2,1,2,0,0,0,0,1,1,1,1,0,0,0,4,0,1,1,0,0,2,0,0,0,1,0,2,2,1,2,0,1,0,2,1,1,0,1,0,1,2,2,0,2,2,1,1,2,0,1,0,1,1,1,3,0,0,0,4,2,0,0,1,0,1,1,1,2,1,2,2,0,2,1,1,1,0,3,0,1,0,0,1,1,2,1,3,1,2,0,1,1,2,2,1,1,0,2,1,1,1,1,0,2,1,1,1,3,1,1,0,1,0,2,0,1,0,1,7,0,2,1,1,0,1,2,0,1,0,1,0,0,0,0,2,0,2,1,0,0,1,0,0,1,0,0,1,1,0,1,2,1,1,1,2,2,1,1,1,1,3,0,1,0,1,2,0,0,1,1,1,0,1,0,2,0,0,0,0,0,1,0,1,2,0,1,1,1,1,1,0,3,0,2,0,1,0,0,1,0,1,1,1,1,1,1,3,0,0,0,0,0,1,1,1,2,0,2,0,4,1,2,0,2,0,0,2,2,1,1,2,2,1,0,0,1,0,2,3,1,1,1,2,2,1,0,0,3,0,2,1,0,1,0,0,0,0,3,0,1,1,1,2,2,0,2,1,2,0,1,0,0,1,0,1,0,0,0,1,4,0,1,1,0,1,0,1,1,0,1,1,1,0,2,2,0,3,1,1,1,3,0,1,2,2,0,1,1,1,0,2,0,2,0,5,2,3,1,1,1,0,1,1,1,0,0,1,3,1,0,1,0,1,1,0,1,3,0,0,1,1,0,0,2,0,2,1,3,0,2,1,0,1,0,2,2,1,1,0,1,1,2,1,1,3,2,1,0,1,4,1,3,1,1,0,1,0,0,0,0,1,1,1,0,2,1,2,2,0,1,1,1,1,1,1,1,0,1,0,0,0,2,0,3,0,0,1,1,0,2,0,1,2,0,0,0,1,2,2,0,0,0,1,0,2,1,2,0,1,1,1,1,0,0,1,2,2,0,0,1,1,2,0,1,1,0,1,3,0,0,0,1,2,0,1,1,0,1,1,1,2,0,1,1,1,0,1,1,3,2,2,2,0,1,0,1,0,2,1,0,1,2,2,2,0,2,1,1,2,0,0,0,1,1,2,0,1,2,1,1,0,1,2,1,1,4,0,0,2,0,0,3,0,2,1,0,1,0,1,0,0,1,1,0,0,0,1,0,1,0,1,0,1,0,1,1,0,3,1,0,0,1,0,1,1,2,3,2,2,0,0,3,2,0,0,1,0,1,1,0,2,2,1,0,1,0,1,0,2,3,2,1,0,1,1,0,2,1,1,1,1,3,0,1,0,1,1,1,2,0,2,2,3,1,2,2,0,0,1,0,1,1,0,0,2,5,1,0,2,1,3,1,0,0,0,3,1,0,0,2,0,1,0,1,1,0,0,0,2,2,1,2,0,1,2,0,0,2,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,5,3,0,1,0,1,2,1,0,0,1,1,1,1,2,2,0,0,1,1,3,2,1,0,2,0,2,1,0,0,0,2,0,0,1,4,1,1,1,1,1,0,2,1,2,0,0,0,1,0,0,2,2,1,1,1,1,1,1,1,1,1,1,2,1,0,0,0,0,1,0,3,0,1,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,2,3,1,2,2,2,1,1,2,1,0,1,0,0,0,2,1,0,0,3,0,2,1,0,3,1,0,0,1,0,1,1,0,1,3,1,1,0,0,2,1,4,0,1,1,0,1,0,0,1,1,1,1,0,1,1,0,4,1,0,1,2,3,1,2,3,1,2,1,2,0,0,0,0,4,1,1,0,0,0,2,2,1,1,3,1,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,2,1,2,0,0,0,1,3,0,4,0,0,2,0,0,2,0,1,1,2,1,2,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,1,3,2,1,1,0,0,2,0,2,3,0,3,3,2,1,1,2,0,0,1,0,0,1,2,4,2,1,2,2,1,0,0,0,0,0,1,1,1,0,1,0,2,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,3,0,0,0,1,2,2,0,2]},{"counters":[2,0,1,1,1,1,0,2,0,0,1,0,0,2,1,1,1,2,2,0,0,0,1,0,1,0,0,0,1,6,0,1,1,1,0,1,1,1,0,1,0,1,1,0,0,1,2,1,0,1,2,0,2,2,1,0,1,0,2,0,1,2,2,1,0,0,3,2,0,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,1,3,0,0,0,0,3,2,3,0,2,1,0,1,0,1,0,1,0,2,0,0,1,1,1,1,0,2,1,0,0,3,2,2,2,2,1,0,0,1,3,0,2,3,0,2,3,0,0,1,2,0,1,3,0,0,1,0,1,1,1,0,0,0,0,0,1,2,0,1,0,0,1,0,0,0,1,1,0,0,0,2,0,0,1,2,1,0,2,0,1,0,1,1,1,1,1,2,2,1,1,2,0,1,0,1,2,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,1,2,1,1,0,0,0,1,0,1,2,4,0,1,0,1,1,0,0,1,1,2,2,1,2,0,0,2,1,0,2,0,1,1,1,2,0,1,1,0,0,2,1,0,1,2,2,0,1,1,2,1,0,3,1,0,1,0,1,1,1,2,1,2,3,0,2,0,1,1,2,3,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,2,1,1,0,1,0,0,0,0,1,0,0,0,1,0,1,1,1,0,1,0,3,4,1,2,1,1,2,1,1,0,2,0,1,0,0,1,3,0,0,2,0,1,1,1,4,0,0,1,1,1,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,3,0,2,0,0,2,0,1,0,1,1,1,1,2,1,2,0,1,0,0,2,0,1,3,0,0,1,1,2,1,2,2,2,2,1,0,1,2,1,0,2,1,1,1,1,0,1,2,1,0,2,1,0,1,1,1,0,2,1,1,1,4,0,0,2,1,1,1,0,0,1,0,0,0,1,1,2,0,2,0,0,1,0,0,0,2,2,1,2,2,0,0,0,0,0,1,1,1,0,0,0,0,0,1,2,0,3,2,0,1,2,1,1,1,0,1,1,0,3,1,0,2,0,0,0,2,1,1,1,3,1,2,1,0,1,0,1,0,0,1,0,0,1,1,1,1,0,0,1,0,2,0,2,2,1,0,0,0,2,3,1,3,1,0,0,0,4,1,2,0,1,1,0,1,1,2,1,0,0,0,2,1,1,3,1,3,0,1,0,0,0,0,3,0,1,1,1,2,0,0,0,1,1,0,3,2,0,0,2,0,0,1,0,0,1,2,3,0,2,2,3,1,1,0,2,2,1,1,1,0,0,0,2,1,1,2,0,1,1,1,0,2,2,3,3,1,1,3,2,0,1,0,1,1,0,1,0,1,0,0,0,3,0,0,2,0,0,1,1,2,1,0,2,1,1,1,0,4,0,0,1,0,1,1,0,0,1,0,0,2,1,1,1,0,1,1,1,4,3,1,3,2,1,0,1,0,2,0,0,0,2,0,0,2,1,0,2,2,2,2,1,2,2,1,1,2,0,0,2,1,0,0,1,0,1,1,0,3,2,3,0,0,0,2,2,1,2,0,0,1,1,1,0,1,0,0,0,1,2,0,4,1,1,3,0,1,1,0,1,1,0,2,2,0,0,0,1,1,1,1,3,0,0,0,0,1,1,0,0,0,2,2,0,2,1,1,0,1,3,0,0,0,0,1,2,1,2,3,1,1,3,1,0,1,2,0,2,4,1,0,2,0,1,0,1,0,1,1,1,1,0,0,1,3,1,0,1,0,0,1,3,0,0,2,1,1,2,1,1,1,2,3,0,1,2,0,2,0,0,1,0,1,1,0,3,2,0,0,0,0,1,1,1,1,1,0,1,1,1,2,1,1,2,0,0,2,0,0,0,2,1,0,1,0,0,3,1,3,0,1,2,0,0,0,0,2,1,0,0,1,0,1,0,1,1,3,0,1,1,1,1,1,3,1,1,1,0,1,1,1,2,2,0,0,2,0,1,0,0,2,2,1,0,3,0,2,3,1,1,0,2,3,2,2,3,0,2,2,1,0,0,1,3,0,2,0,1,0,1,1,1,1,0,1,2,0,0,2,2,0,2,2,0,2,0,2,0,1,1,2,1,3,2,1,0,0,0,2,2,0,1,2,0,0,2,2,0,0,0,3,2,0,1,0,7,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,0,0,1,1,1,1,3,2,2,3,1,1,2,1,0,0,1,2,1,1,4,0,1,2,0,0,0,0,2,0,4,2,0,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,0,0,3,1,0,4,2,1,2,0,1,0,0,1,2,2,0,0,2,1,2,1,4,0,1,1,2,0,0,1,0,0,0,3,1,0,1,1,3,1,2,0,1,0,2,1,2,2,3,1,0,1,1,1,1,0,0,1,1,0,4,2,0,2,0,2,0,2,0,0,2,0,0,1,0,0,0,2,0,0,1,2,2,0,0,2,1,0,1,1,3,2,0,1,0,1,1,0,2,0,1,0,4,1,1,1,2,0,2,2,0,2,1,1,2,1,0,3,0,2,0,1,3,0,1,0,1,1,1,1,2,0,0,1,0,1,0,0,3,0,0,2,2,1,1,2,1,0,0,0,1,2,3,2,2,1,2,1,1,0,0,0,0,0,1,1,3,2,0,0,1,2,0,1,1,0,0,2,0,1,0,1,2,0,1,2,3,0,2,1,0,2,3,3,0,0,1,1,2,0,2,2,1,1,0,4,0,3,1,2,1,2,1,5,1,0,1,1,2,1,2,1,0,2,0,0,1,0,2,3,1,2,0,1,3,1,0,3,1,3,2,3,1,1,2,2,1,2,1,1,2,2,0,3,2,0,1,3,2,1,0,1,1,0,0,0,0,2,0,1,1,1,2,2,2,0,0,1,2,2,0,2,2,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,3,0,1,1,0,1,1,2,2,1,1,1,1,0,1,2,1,1,1,7,3,0,1,1,1,2,3,0,0,1,1,1,1,2,1,1,0,1,0,2,1,0,4,1,3,0,0,1,0,1,1,0,1,1,0,1,4,0,1,0,0,1,0,2,0,1,0,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,3,0,0,3,1,1,1,2,0,2,2,0,1,1,1,1,3,1,0,1,1,1,0,1,0,0,1,2,0,3,1,0,2,0,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,1,2,1,1,1,2,3,1,2,1,5,2,0,1,1,1,1,2,1,0,0,0,2,0,0,0,1,0,2,2,0,1,1,2,1,2,3,1,0,2,2,1,3,2,3,1,1,1,1,1,0,0,0,0,1,0,1,1,1,2,0,0,1,1,1,1,3,0,1,0,2,1,1,1,1,2,2,0,0,0,0,0,0,1,0,0,1,0,0,3,2,2,1,0,0,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,0,2,2,1,2,1,1,1,2,2,1,2,3,0,3,0,2,0,1,0,2,1,1,1,1,2,0,0,0,0,0,3,1,0,0,2,2,2,2,3,1,2,1,1,1,1,1,0,2,0,0,1,0,1,0,1,3,0,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,2,1,2,0,0,2,1,1,2,0,1,1,0,2,0,0,1,1,1,0,1,0,0,0,1,0,0,1,1,2,2,2,0,0,2,3,0,1,0,0,0,1,0,1,1,1,1,1,0,0,2,2,0,4,1,1,2,1,3,0,0,0,0,1,2,1,1,1,2,1,1,2,2,1,1,1,0,0,4,1,0,0,1,0,1,0,1,1,0,0,1,0,1,0,1,3,0,2,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,0,1,3,0,2,2,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,1,0,0,0,2,2,2,1,1,0,2,2,2,2,3,2,1,0,1,2,0,1,0,0,1,1,0,1,1,3,0,1,2,0,0,0,0,2,0,2,0,2,0,1,1,0,0,1,4,3,0,2,1,1,0,1,0,2,1,1,0,1,1,1,0,0,1,1,2,3,1,1,2,0,0,0,0,0,0,0,1,0,1,2,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,1,0,1,0,5,1,2,2,1,1,0,0,3,3,0,1,1,3,4,0,1,1,1,0,1,3,3,2,1,1,0,1,0,0,2,0,2,0,1,1,0,0,1,2,0,1,1,0,4,1,1,1,2,1,1,0,1,2,0,1,2,3,0,1,3,2,2,1,1,2,0,0,3,0,0,1,0,2,6,2,1,0,1,0,2,1,3,1,0,0,2,2,0,1,0,1,3,0,2,0,1,1,0,1,3,1,2,3,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952043604508672},"gid":{"histogram":{"ndv":1978,"buckets":[{"count":8,"lower_bound":"MA==","upper_bound":"MDdaZlZ5RjFFcUFkcUx2ODJJM0ppYlI4bnhkN3lBeTFiVlVpVVd5b3M=","repeats":1},{"count":16,"lower_bound":"MEdjTTNZYlFlOE1oWTNpN1pXZW9WSERJ","upper_bound":"MGJYemZ5","repeats":1},{"count":24,"lower_bound":"MGRhcG9iSmt1dzdMWENCMk51emVCb1RXc1lWcHFRcGhsZ0plRlQ=","upper_bound":"MG13UDhxWjRKMTZuN1h0ZkU5SVE=","repeats":1},{"count":32,"lower_bound":"MHhQ","upper_bound":"MTZjcm5yOUp5ZzA1Uk55bWVuRUZOM241SHJ2V3ZxMndU","repeats":1},{"count":40,"lower_bound":"MThjMjJ6bFo=","upper_bound":"MUJQbGUydmZweQ==","repeats":1},{"count":48,"lower_bound":"MURlMXo5dVE5MGNZ","upper_bound":"MUwwVElqMEw=","repeats":1},{"count":56,"lower_bound":"MU84YUNDWWE2Rkg2RDI3N0drMmZRSTM1","upper_bound":"MVd0YkdpRXV2Vg==","repeats":1},{"count":64,"lower_bound":"MVhBOHlFYmZvVGpjOUZxTVRmM2pFWm8=","upper_bound":"MWFsdGVoYThBVGNCbXdHajJvbDFjSFFJekp0SkdSZ1dsMTV1S3Z4aWd2","repeats":1},{"count":72,"lower_bound":"MWJjTVRBTHZ3b3NWNmJKRXZSR3R3empFT1BHZQ==","upper_bound":"MWgzT0RlZ0czME5yclBaZ3Zzc25WbXZHaFFsaEk=","repeats":1},{"count":80,"lower_bound":"MW0wdDZNUHE=","upper_bound":"MjJvT2toRk9LWmN4SnRIZjN2","repeats":1},{"count":88,"lower_bound":"Mjc=","upper_bound":"MkNpVHY0Yk0xcnZBSnp4ZFVrNW00OGVIb0lCRXRoUw==","repeats":1},{"count":96,"lower_bound":"MkRFNzNYdkt2OWhyQld1WHEyWDk0aTRTaA==","upper_bound":"MkpQNnpQNVlkQ2pmM3FDcWRYU280YlQ2T1pkd0lBVGM=","repeats":1},{"count":104,"lower_bound":"Mk1YREJ2aUlX","upper_bound":"MlVGTEoyQTEwVTJhRjVyN3JDdXBBQg==","repeats":1},{"count":112,"lower_bound":"MlljcmU1ZDNHTzQ1MGdBTzA=","upper_bound":"Mmp3aERLc3BpZlJpRDRKeTRnRXhLZ09VR29SVHdGU1g=","repeats":1},{"count":120,"lower_bound":"MnBKVG9zdUx1NnE2dks0b25PeXhZQkZYcWFi","upper_bound":"MnVkdmQ=","repeats":1},{"count":128,"lower_bound":"MnlIWDBZMlZzMWZqRkxYME1QY21mNW9hNFBnNGJTUnExTzQ=","upper_bound":"MzBZVk00azdjTHk=","repeats":1},{"count":136,"lower_bound":"MzJDa25QcXZWOFBxaXVESWJ2UndRTGc=","upper_bound":"MzRqQWgyRlJIVUNlRnF5N3A4ZDVBdHpMc2F5Nkx3QUM3RmVVQkVL","repeats":1},{"count":144,"lower_bound":"MzZlNjZLY0dwZDJNNXZPWm9hZFFTYk54VmtPbVM=","upper_bound":"M0pXWjNXbEUzc0FQY2hjeTVmYXp4bThoTDFmbFFaRkJSZmE1Yw==","repeats":1},{"count":152,"lower_bound":"M1RNUDBybzZGRVdXNXJOcGFZMlNzMDVR","upper_bound":"M25OeVhHMmI1QzlFdHZZMXFGQ0MycDFSUDNaWUlRRVM=","repeats":1},{"count":160,"lower_bound":"M3M2R0liV2JjU1dwYlgwOHdkUnpPZWxJdlo=","upper_bound":"NDNrSzJjNWl4S3BLUjY1VHpFTk1YblM5","repeats":1},{"count":168,"lower_bound":"NDRaTmdRdkNEbzhURk92aFVGRFh1UHVncElQV1Y=","upper_bound":"NEVvWnloQlpuSmUwenNHSEFNRDVzeHMzVGtmN1pJWA==","repeats":1},{"count":176,"lower_bound":"NEdZZUczSHBMMk5ReTBUcjdtNg==","upper_bound":"NFlSQjY2WkNhUDlwakU5eQ==","repeats":1},{"count":184,"lower_bound":"NGVlZXljY3I=","upper_bound":"NHJubW9EVmd6UW5FQ1hXVzVZMTB1WktBcQ==","repeats":1},{"count":192,"lower_bound":"NHpqUGlHODdUaEZsdGozWGlQU2NiZWtrSmgxdWlvNlpWbHFRekUy","upper_bound":"NTBXQ3M4U1B2MzZFc3FvYw==","repeats":1},{"count":200,"lower_bound":"NTdMcklPSVRXYUgwOXNpcEhWZVFvZjBJcnVvZ0RxdFJzOUZBMg==","upper_bound":"NU51YmtBVWU3dFBKU210akVCRmpmR0pKeVYySkhIdlJRbnZzcUta","repeats":1},{"count":208,"lower_bound":"NVQ0Tk5JVlNsR216ZkdkZlls","upper_bound":"NVVHbU01eTZJSjZmNTVZQXVkQkp4N3Y2Q3RuQlFwb2VE","repeats":1},{"count":216,"lower_bound":"NVVZRA==","upper_bound":"NWQyQmFvUWtJcE9G","repeats":1},{"count":224,"lower_bound":"NXFCNzFBVTZDTEdVcTdsYXoyanh1aWZlMDNSYmlSbmpTV2twT1hlQVk=","upper_bound":"NXpJMHB1aEN6eGNI","repeats":1},{"count":232,"lower_bound":"NjJGdzQ3TkVVRFM2RmtSQVMySmV5TFZxZUo4M0ZRRlJqdkJjYjV0YUFs","upper_bound":"NjRIVmM4Vm14UFAz","repeats":1},{"count":240,"lower_bound":"NkM4N2Vjbk9hTG5rSmVuWDZ2eVBIR05QM0tmbg==","upper_bound":"Nk1zMzVQaFZHSmtO","repeats":1},{"count":248,"lower_bound":"Nk5XRjhvdUgxOFY2SUJMN2FramVTT05nOVBxWVpnemk0WQ==","upper_bound":"NmdxV2FVWnZoUW1MNjk4a2duWFBjdzhJZUJnVllEdWE0UUZ3Vm1mRWo=","repeats":1},{"count":256,"lower_bound":"NmpIcWk4ektXRURSblVzUA==","upper_bound":"NzU4aERKSWtscXNDNDhXd3FLbGtoR0xsMmFCU2Eybg==","repeats":1},{"count":264,"lower_bound":"NzdKd00=","upper_bound":"N0VNSDIwVVRmcmlPcUhxeVRENjNSN0o4Nzk=","repeats":1},{"count":272,"lower_bound":"N0hmbFcwVWtwVVhaNmxDajIzMVFIbU9GYUlTUjQ4NQ==","upper_bound":"N1NHeDBOZQ==","repeats":1},{"count":280,"lower_bound":"N1N1YjY4UXBJeFN1OHh2UHM=","upper_bound":"N2VYeFd0Z1gydjhFeHZ3VWR4RlpQS1k4cDZ5cHpRdFBodFNSMjZq","repeats":1},{"count":288,"lower_bound":"N2c2UTM=","upper_bound":"N28zdzRFWUo3eWoyVm9vNkFxQ1VXeE1nZXE2cExGRlN3","repeats":1},{"count":296,"lower_bound":"N29lRjF6SVJDZUczNGoyZTVPVnhtR3M4YWgzbGlxdnBKNDVLZTFs","upper_bound":"OEQ=","repeats":1},{"count":304,"lower_bound":"OEhXVml3dnpOcDl6eGRUYXZVR2JONW94b2g=","upper_bound":"OFZ4RGh1b1BWZ21peHVHeWRDWks1eW54bVZHVDJUQ0lWOWFFc3o=","repeats":1},{"count":312,"lower_bound":"OFlrTHN0ZA==","upper_bound":"OGNZ","repeats":1},{"count":320,"lower_bound":"OGkwRUhOamR6cHh3ZTJySmRGQlRWMWxnZjR4emVoZXh4Vzg4MQ==","upper_bound":"OHlKRFNkYVpBaHZPOHNZeE9J","repeats":1},{"count":328,"lower_bound":"OTJNVXo1VGxMdm9sM2ZWYkRVWXU3RmpmamhZTw==","upper_bound":"OUVHSXp6Q0l2c0lFem9mWHlIamUwRnZod1lLMg==","repeats":1},{"count":336,"lower_bound":"OUZFalE=","upper_bound":"OU0zeWZsbHR1UkM=","repeats":1},{"count":344,"lower_bound":"OVB3a1JwZFowYmdmenAyaDlCcG0ydE1Ud2N5VE5scFVzanl5T3pYdw==","upper_bound":"OVltME4xcVltR3pXdWN1YW52R1JpTA==","repeats":1},{"count":352,"lower_bound":"OWR6d0RkU3Zpc0ZkRnZzdkpj","upper_bound":"OXc0OGprZUpZaElCVmxiY3RleGE1ZA==","repeats":1},{"count":360,"lower_bound":"OXlYclZGYk5VR3hHdWdsT2JPZTdWVmxuYkY=","upper_bound":"QTE2YU9VcQ==","repeats":1},{"count":368,"lower_bound":"QUVKZjV1TmZSRjN5b2htSFRadFQ=","upper_bound":"QWJhbGVjQTVpSFJxYlRIRXZJMDBPNGExeXplQ01SR1pLTHZ4","repeats":1},{"count":376,"lower_bound":"QWJnRlVtZlM1dnd4dlNqU0pSQk8zZHl3SXJqTHk5SkY0aDBLcnlDRmI=","upper_bound":"QXAwVUpRVDlJ","repeats":1},{"count":384,"lower_bound":"QXBvdE13TzNt","upper_bound":"QjVhbUNtYUNPemk=","repeats":1},{"count":392,"lower_bound":"QjZjRUF1UklJNUdoVVBsN3pn","upper_bound":"QkpFT1dIWENuWjkzZkpvREg=","repeats":1},{"count":400,"lower_bound":"QkpUeVd2N09B","upper_bound":"QldodFV1UUs=","repeats":1},{"count":408,"lower_bound":"QmRwNGp6Skszcmg=","upper_bound":"QndSWm5JamxVbkZmalVxeW83aEdxclBDQjFLaXJ6UQ==","repeats":1},{"count":416,"lower_bound":"Qnk1QU5HU01tWDV1ck1YS1RxNGdIMw==","upper_bound":"QzU1TFVpWVdLY3BVSzY=","repeats":1},{"count":424,"lower_bound":"QzVRZ2tXQ3M=","upper_bound":"Q0d4WkZSNVVzM3dOb2NlUkxxbzgzOWxicUhmbzlqa1lNZA==","repeats":1},{"count":432,"lower_bound":"Q0hCcUNjUDY=","upper_bound":"Q0o1dzJxOFk=","repeats":1},{"count":440,"lower_bound":"Q0xFcEFlWDBTWlpwUnNzYlUzMzhhTFBiZEZFOHpUZkpHNU1j","upper_bound":"Q2dFM0Q1UWxHWFNCamFvQ1UzbEluSldITkJmVTFlT04=","repeats":1},{"count":448,"lower_bound":"Q2pjMmRMVzdvNGdqY2locg==","upper_bound":"Q3NwNw==","repeats":1},{"count":456,"lower_bound":"Q3VJQ2dkSW1CcGxHT3JBQlFXZHF2VFZPZXlNOFM0UFhMS0w=","upper_bound":"Q3kzV0kxcFl2eHdRUE9YQWM3b1AzaXZ5WnJCTnIzMTM3d3pmdWRsUg==","repeats":1},{"count":464,"lower_bound":"Q3k5VzNPS0xJNHE2eHFCTVRn","upper_bound":"REFGbXhoeHo0dkN3bA==","repeats":1},{"count":472,"lower_bound":"REJSVjZVZg==","upper_bound":"RFN2TU9JY0VlU0pNbWRhUUZNcEs=","repeats":1},{"count":480,"lower_bound":"RGNWRGtFMGl5dHhWa0xEaUVaMmh0","upper_bound":"RGhZSml6NWE1ZDVuaG5hcVk1Mm1XQmx4SjRMUFBQVVRtY0IzUHM=","repeats":1},{"count":488,"lower_bound":"RGp2Y2dJNUptUWFybHNzU1JFajVj","upper_bound":"RHVzVUZSV1gyeFpHVVQ0ajNvbDQ2amE=","repeats":1},{"count":496,"lower_bound":"RTJNMERyOVJ4YWl5RjJzbVMzT3RMSndrQ2ZkakFvZTA=","upper_bound":"RUlld3U5ajVtaUU5UEswS25E","repeats":1},{"count":504,"lower_bound":"RUxHd0x6MnVWZlJwcVY3ZlFSbzNmbFR3eXlvSDlobzdhRHNIRG0=","upper_bound":"RVVqYmpxREU5VXFKbXQ=","repeats":1},{"count":512,"lower_bound":"RWFESHpIVmt4YUhMQTl1aFdDa1NnTVBITzJlWWRSeWs3dzFXNU9STUo=","upper_bound":"RWRnNkprVThuU29zUm1hRG9qd0cxVmF2U08=","repeats":1},{"count":520,"lower_bound":"RWw=","upper_bound":"RXYzUHZBTzh4TW10VWxEUkJaM3d5OXJpVlduUFhxVWg0eXBwcjdpc3Y=","repeats":1},{"count":528,"lower_bound":"RXhKcUJWaGdnQUZwd2xrb1N5QmxLdmc2M3pqSnFFZ1dWaA==","upper_bound":"RjV4ZW9hWTV2dlA3TEc2Mks5V1U0TExSRHVx","repeats":1},{"count":536,"lower_bound":"RkNicEtOZVZ4S1FNMUQyVWVwREZm","upper_bound":"RlRtODhKa3V0YlFQdFZwaU44a2ZoTEJqMFJyMzFxVEE=","repeats":1},{"count":544,"lower_bound":"RlZxRXZZWld3V1d0","upper_bound":"Rmx2OWlKR25TR3ZnaFZp","repeats":1},{"count":552,"lower_bound":"Rm1aeDNhVG9NRmNjdHhZa21sZEJmREtlbnVNSjBmc041QkFldTJl","upper_bound":"RnZDd0lNOUdzVWZLWTFTN1Ri","repeats":1},{"count":560,"lower_bound":"RnZuRlJkUjY4V2xQc0E5cFdVUUlxTVFJdA==","upper_bound":"Rw==","repeats":1},{"count":568,"lower_bound":"RzZCT1MzQ0sxd1I2SQ==","upper_bound":"R052UHhJc3dXOUoyV3pwMXRrOElx","repeats":1},{"count":576,"lower_bound":"R1FEMlM4Rms4WTVuTmtuSzFZaFJQalBsSFZtN0MzeEo5V2J2Qg==","upper_bound":"R216VXNQNkwySFBQeTgzWGJSeXVrbg==","repeats":1},{"count":584,"lower_bound":"R3NMVmdvNGVJMDBpNXNGNTJUMkxhSVRLMVI4UUtISzdKTA==","upper_bound":"SEFIRVZzQU9jTkx1OEdLTXpUV0RxWlpLb0lhaWRCaWRQQ0VFMQ==","repeats":1},{"count":592,"lower_bound":"SEJ3U2gzUkJUbmpkamJ0THBu","upper_bound":"SGNnWVdZQmVPTDhBZ2k1RXd1U3ZsTE03Rg==","repeats":1},{"count":600,"lower_bound":"SGRpYzVTRTRGRDdwWVY0UQ==","upper_bound":"SG05aFVSS0FMa1p5dXhQRkhZNWFwZ01TcGFn","repeats":1},{"count":608,"lower_bound":"SG5RVlVk","upper_bound":"SHQzdVc2ZUVodHZRbzNHcFRJUVlJUjdQUGs4ZU5qalZGVg==","repeats":1},{"count":616,"lower_bound":"SHRaaw==","upper_bound":"STNwbUg2R3NvaGNkbGZXblR6TFpIeDBVQXgzYzc=","repeats":1},{"count":624,"lower_bound":"STRLMFlOTjkzcnpZdW5IdkZVMFFzelRqdQ==","upper_bound":"SUZFamRPZ05y","repeats":1},{"count":632,"lower_bound":"SUlYWjFnUldLRjlnQW1vQU9CME9q","upper_bound":"SVg=","repeats":1},{"count":640,"lower_bound":"SVlQTjhRODNmZDdPTmJRbWo=","upper_bound":"SWVOZ0lnYkh5dHE2TDVkV2oyY3loeDdOM1VpbGc2R2pJZ21sZA==","repeats":1},{"count":648,"lower_bound":"SWhlRFRkRXE3d0FWanpBQVNneE9MY3IyNk95NW5IalVIZ2Y4cmhqN3M=","upper_bound":"SWwyQkRxSDdzRk5P","repeats":1},{"count":656,"lower_bound":"SW5QM29WSQ==","upper_bound":"SXp1REl6U3QyNGRlM3ZLdWNU","repeats":1},{"count":664,"lower_bound":"SkVCbWhiSE95TGtmVFNXTEtEZVJ6VDlEUmR4ZQ==","upper_bound":"Sk9MWWtmclJY","repeats":1},{"count":672,"lower_bound":"SlN0NQ==","upper_bound":"SmVUZ2lib3ZDY3l0clZKNkExWGs=","repeats":1},{"count":680,"lower_bound":"SmVYNU41bVR0NjJ4VVhxNnRZU3U=","upper_bound":"SzJaelNVVU5JSGhyeU5yTnUweDNKd2pMUFhIVlpVWnowZGVJaHZyekE=","repeats":1},{"count":688,"lower_bound":"S0RlT2NRVm84aVkwSlJQZlZqYk45MDVpd0tBb3RWUEJLMXJkcVVF","upper_bound":"S0V6cEtnT2MzRWFGVnBlSFNV","repeats":1},{"count":696,"lower_bound":"S09ad1ZlSFE1VXlENjF0dWxMSEw4Smx5OA==","upper_bound":"S1hTZG5YM05WUXBxdzRoVA==","repeats":1},{"count":704,"lower_bound":"S2E1dWRjdTd2ZDlaMU1GZGRRNGtzZk9GeU9rZG9IenpDZVcz","upper_bound":"S29mRWxJVVNZSFR4ckVGR2lIQ2RQOW9PbFdiOQ==","repeats":1},{"count":712,"lower_bound":"S3E4aWpzRUE=","upper_bound":"TDAzSEhkODhiTWlaTFhyM1dqTlVQUWtTZlFMNzl1VUE=","repeats":1},{"count":720,"lower_bound":"TDJHZjd5djM4TQ==","upper_bound":"TEFwN3BrdjJnVDVUc1Vm","repeats":1},{"count":728,"lower_bound":"TEJubGF0TGIwU1ZuZzZnRVpxYTNtOEc4YTZlTVVt","upper_bound":"TFVEY3NySg==","repeats":1},{"count":736,"lower_bound":"TFdiSEJtNlFseU1wVHBvME9oVFJGRUpYT0hidUpQWXFnZWE4Z0c=","upper_bound":"TGtIWEl0eDNraXFVdExGUUp4RHdZazVMZW41WThEU05FQQ==","repeats":1},{"count":744,"lower_bound":"TGtUMTE3blVHWjZxQ2trNW9TdHRnZFk=","upper_bound":"THhITlkzeHpvdWg2","repeats":1},{"count":752,"lower_bound":"TQ==","upper_bound":"TUhMMXptWmpPdEw3OEJvd2ZERExRNHNtMHBzUDY=","repeats":1},{"count":760,"lower_bound":"TUpwbllFaXNxUG53ZUpyb3pJcWtxTDM2MWJP","upper_bound":"TVdjaHFYZFdldzJDUDlqZFlyc054U1RKTlNGYw==","repeats":1},{"count":768,"lower_bound":"TWk=","upper_bound":"TW5ONE0zZ2ozMnpXWHhxMmxiVA==","repeats":1},{"count":776,"lower_bound":"TW9MOVNGQ3UwQzdxSTROVU8=","upper_bound":"TXRwWjVKWkNNc1R5WEJTN285SThvdGRlazU0blFPZ2V0ODV3","repeats":1},{"count":784,"lower_bound":"Tg==","upper_bound":"TkMwMXhGVFUzdWRReUR3UUNHRnMz","repeats":1},{"count":792,"lower_bound":"TkkxRUpWUFU=","upper_bound":"Tk96amlQZ1Vz","repeats":1},{"count":800,"lower_bound":"TlJadHhuaXpRSHNIUVBUS0VVYTNBc1BBNVVsZW1ydWY=","upper_bound":"TmJE","repeats":1},{"count":808,"lower_bound":"TmRWUWlvbDF1aDZ3","upper_bound":"Tm1ZeDl6TU9qNVQ=","repeats":1},{"count":816,"lower_bound":"TnY2NUw1M3FWUnIza3VGU09HWW5TQ0NqcERKR1M0R1Bi","upper_bound":"T0JuNlh5NVBiZjU=","repeats":1},{"count":824,"lower_bound":"T0lMVzljekp1ZkFpVFZaRU1CNEJWMWl3OHdwWXI=","upper_bound":"T001THdTR01ESjB2aXR6bWFEcVRpU1RwZDgzMw==","repeats":1},{"count":832,"lower_bound":"T1FMYzJhVzVBUjZDenB5YUk=","upper_bound":"T2IwTGd2SDNQMFBkbzJQNjA=","repeats":1},{"count":840,"lower_bound":"T2pyZDNlTnJMM2p3MmdmdnZNWA==","upper_bound":"T3liWEZzZmZ4UTRjQTZ3V1JaR3RSM1h4NFVlRHptMEp3","repeats":1},{"count":848,"lower_bound":"UEVpVlZDVFBST3J1ZERpNWhjeE9zbw==","upper_bound":"UE5IQ0Jx","repeats":1},{"count":856,"lower_bound":"UFZxQUdQa3JOOTJ0","upper_bound":"UFlkRks3cEJtUVFYZE9URW5CbGQ0ZWEybQ==","repeats":1},{"count":864,"lower_bound":"UFp3YkVjVUh1bUZEYmxzdEJiWnNRMjBPZTNNWkcya1ZReDZMZ3pBbQ==","upper_bound":"UGxPTnZ3bFBkZ1BiSUVMVFZYRGI=","repeats":1},{"count":872,"lower_bound":"UG9scVRsZEduNTNBbnBOODl2YzE=","upper_bound":"UTJKZUI4b0RHRmdDaDNidjkwdlA=","repeats":1},{"count":880,"lower_bound":"UTNmRXBWcGpaRExGYlFlaW9iTjcxNWNBQlA=","upper_bound":"UUNsTzZQQTZYdkthaGNkOVNQcWNIS240UTFOQg==","repeats":1},{"count":888,"lower_bound":"UURCZ09KUG1uTG15M2x3YmlKMTJDdzMzUGIzWktMZEcwTENkWldv","upper_bound":"UU4zU1R5bTg2VXA0NTZtbERkSw==","repeats":1},{"count":896,"lower_bound":"UVBhMkIzMzYyUFFIQzdyMHZWWVhQc1hpRmJ3YkxybHA3R3BQRXBHZmk=","upper_bound":"UWROc1hUa2dtZzNTazVqM1djempZemFuTGM0V0NOQWk=","repeats":1},{"count":904,"lower_bound":"UWRXWkxFTmF0YTVpekdmczFOZ1g5OVJRY0JrTFRrR01lMnoxYmMzMTY=","upper_bound":"UXBIR3ZvU29WT3lKMWNqRkdPUU1NT3ZyNWRLRlBUOVJzVXNn","repeats":1},{"count":912,"lower_bound":"UXFpdG5oQ3VCQTRFYVpw","upper_bound":"UXZPQ1lsY0EwQzNGelJKdDNXUG13OFh2bFlJdWYwYW1WVVlFY2o0dg==","repeats":1},{"count":920,"lower_bound":"UXdIa0E5WEZQV1d5Sk9yandESFpicmw1TGdHQ2JVM05SdUc1ZWY1b0w=","upper_bound":"Ujh4ejVVZkxMMDU2NHVmUE8=","repeats":1},{"count":928,"lower_bound":"UkMwRmw2NnFYZ3o=","upper_bound":"UkhLemc1d3R1NQ==","repeats":1},{"count":936,"lower_bound":"Ukh1","upper_bound":"UlBKTE05eXpD","repeats":1},{"count":944,"lower_bound":"UlVOTVhhUVRzVEpTT1R2Q1dqdEVsTFBidkZCYnRuNkVOeldtSTBP","upper_bound":"UmM2R2ozVEE5QXFFemkzTFF4VHZuQQ==","repeats":1},{"count":952,"lower_bound":"UmR1TDd2d1VDYUxLNllJYQ==","upper_bound":"Um15Qk9WQTJGVEhuQnpFc0EyNXA0M2ZLUnpHekRYalE1ZQ==","repeats":1},{"count":960,"lower_bound":"UnMzeUZI","upper_bound":"UzFMcHlzMGx3elBncVRYSkZT","repeats":1},{"count":968,"lower_bound":"UzRCSThuTUc=","upper_bound":"U1pXaG1W","repeats":1},{"count":976,"lower_bound":"U2plVEN2Skgzd2JvWmxwTVRNY0tyRjQ=","upper_bound":"VDVnU0lvZGF2c3pmZTFiUzR5MTRMZ0Y=","repeats":1},{"count":984,"lower_bound":"VDhzQWxRWWc5enBLOWt1","upper_bound":"VGg=","repeats":1},{"count":992,"lower_bound":"VGlwZWJrNmZGTHMxU3laVW5IMlNxOEExUnFRcWVBeQ==","upper_bound":"VHl0V051eGM1RHczaWlhcUtqWVl1UHc4NFRVYVJ3eFhpblVH","repeats":1},{"count":1000,"lower_bound":"VHo=","upper_bound":"VUpNZnJuM2k0eEw5ODMzSDk0ZVE=","repeats":1},{"count":1008,"lower_bound":"VUpkV2RTOFcybnpZWTFTUlo1U1RzVWdjWnNySA==","upper_bound":"VUwwWGJnNWkzUGFFZFdPV1NaMEY=","repeats":1},{"count":1016,"lower_bound":"VUwxanVzNGlUWFNRRUpSMlR4aWg5NFc4S3Vw","upper_bound":"VVFjbGNKSWVHOEVYT2Q4N2d4NUFQWjZU","repeats":1},{"count":1024,"lower_bound":"VVR3WmRkbHN6NW9yZGhsZjJRemNHOFFLdGVk","upper_bound":"VWkxYzNrRXF6Q0p0RDNnQUxyRU5KTmJXank=","repeats":1},{"count":1032,"lower_bound":"VWpLMGRoaFZhcHlja1dScjlFWU9KVzJXNXpKVk1PdDNGZjFndQ==","upper_bound":"VkNqWDA=","repeats":1},{"count":1040,"lower_bound":"VkVRdDB2UE1xREdFYlptZW1Dc2pIUVJucw==","upper_bound":"VkpG","repeats":1},{"count":1048,"lower_bound":"VlFvYjA2MGpDalZkWldyaEdx","upper_bound":"VllDbWd0b2puNFdLVjBhT3JCaVZneWZn","repeats":1},{"count":1056,"lower_bound":"VmNzSGhKREhhVlFEWkJITUJYaENobDQyNXBMM2ZOZmV3Q1VQaHRMQVk=","upper_bound":"Vmt4OXhUeWNPZw==","repeats":1},{"count":1064,"lower_bound":"Vm5ZNDQ1ZVgzYnVubW9hQmtmZUpLMGhyTXVkZQ==","upper_bound":"VngzSA==","repeats":1},{"count":1072,"lower_bound":"V0hNYWFXSXBZNmNPdmg1QnY1UFlpYllCV0ZTR09JOEsw","upper_bound":"V09DekpsZDQ3WVlEWVlqU2xnTg==","repeats":1},{"count":1080,"lower_bound":"V096UTdaY1lxMVlL","upper_bound":"V2plaGI=","repeats":1},{"count":1088,"lower_bound":"V25ubjlpUmc4dVRnM1k3Q3REcjA=","upper_bound":"V3NDbXA3eWd0RFYySFU5eHBNS1U=","repeats":1},{"count":1096,"lower_bound":"V3h5SjZZYjBVcXJIR1E2TjVZNzBSMm96amM=","upper_bound":"WDVRSW5qc3JkaHdVaDZhdWFxYjFSSlJZQ0JIaQ==","repeats":1},{"count":1104,"lower_bound":"WDhmbzNnVWF2bjZkeTZsV2pPQVkyWEI4NTB0alVGWHFkNlFwbXRCUGlp","upper_bound":"WFJHT1lnUWlsdmsyQXM3VEdoNE96YXNrSw==","repeats":1},{"count":1112,"lower_bound":"WFVRYTRnUnBlc1RKWk1mbEtJMUhSUjUyU1BINQ==","upper_bound":"WGhVTHBU","repeats":1},{"count":1120,"lower_bound":"WGpXVVhPaElrQUxETXlKdExsTEtRcjVtZ0JMdDRi","upper_bound":"WHJ4RWRRYWZKY1ozUEVWN2Voc0szY01wYkI=","repeats":1},{"count":1128,"lower_bound":"WHQxMjRFamlveFZrd0o4Y0RmNzVNMlc=","upper_bound":"WTFTQzNBc0lIdkN4bzE2U2tuZ1BETkFybmF1Q2o3Mw==","repeats":1},{"count":1136,"lower_bound":"WTJpdTRyUVdtdkpqQTk=","upper_bound":"WUVJ","repeats":1},{"count":1144,"lower_bound":"WU5FTTlEeTRYQlJCV3FhbHJQMmJuaHpSTmNVNjZGb1BXYnJZR1ViZQ==","upper_bound":"WVQwSXRvQXE2WkZjQ2VWNg==","repeats":1},{"count":1152,"lower_bound":"WWFT","upper_bound":"WWhOTGg5UDBPWA==","repeats":1},{"count":1160,"lower_bound":"WWtMS2Q3c3V3ZkRNWTFLMjJ4dWlCdnA=","upper_bound":"WXYyYmRPQVdBa0RMUEp3aGNIMUVDRldLOGoyc0pxRA==","repeats":1},{"count":1168,"lower_bound":"WXhsTE9uUWp3WHlOQg==","upper_bound":"Wg==","repeats":1},{"count":1176,"lower_bound":"WjE2SmptQXVWS0FK","upper_bound":"WjR1bE1TdUdka0JYMU1iR2JxNlRlR1BDUHdXV2MwZlF2M3dRcVc=","repeats":1},{"count":1184,"lower_bound":"WkZQZE1rT00wYUdSVG5RSW5xc0RzZzhlczU=","upper_bound":"WnZXYzBE","repeats":1},{"count":1192,"lower_bound":"WnlXOUdhWmtOaWVpVFZ6aGRqczBxVFo=","upper_bound":"YUNY","repeats":1},{"count":1200,"lower_bound":"YUk2Wk5ybHQ2MA==","upper_bound":"YWFQTzdFNA==","repeats":1},{"count":1208,"lower_bound":"YWNaV3dQSUJDM2wwQ1VXSmxlalFGS1hWTjVKcjVmZ2tYOEdUVQ==","upper_bound":"YWwwZzFVcng5c29u","repeats":1},{"count":1216,"lower_bound":"YXBPbnZlWFZH","upper_bound":"YjFDOENQZFZaWDVIUkxUVExxNjZSNnlOR1pjdTFXMkM=","repeats":1},{"count":1224,"lower_bound":"YjRJdWVJY3k=","upper_bound":"YmFOcg==","repeats":1},{"count":1232,"lower_bound":"Ym9Eak1pdVVJWlI1Z3UyWVY2ZlB0Wm8=","upper_bound":"YzJ0OWowTUNsYUoxS2l6ZkNp","repeats":1},{"count":1240,"lower_bound":"Y0VVM0dzazJ2enprV09XWXQx","upper_bound":"Y05nNkc=","repeats":1},{"count":1248,"lower_bound":"Y09Lb2FsNXdHREpJZFFJeUMySDJwZTQ4cms2U3FqOE1nd1dqNnduQw==","upper_bound":"Y2tJak41TFlacmNyMw==","repeats":1},{"count":1256,"lower_bound":"Y3JpSkdWNDJLaVJJREhDMFZydnltbnh3Sw==","upper_bound":"Y3NZbHZxN1g3bkxa","repeats":1},{"count":1264,"lower_bound":"Y3gyR1htQW9tSHE=","upper_bound":"ZEI5MjNscXZvcWNJNEVka3E0OUl6bTI2alpvZzVTQlpFbHhyTw==","repeats":1},{"count":1272,"lower_bound":"ZExDUEVEbDlGWUVXQjFmWmpBNkM3WmtuQjQxcA==","upper_bound":"ZGw=","repeats":1},{"count":1280,"lower_bound":"ZHVOT1JFQ3R6MmM2Ug==","upper_bound":"ZQ==","repeats":3},{"count":1288,"lower_bound":"ZTNaSGt6NlFkMVVDSDJINGNLaEV5","upper_bound":"ZUdqTXkweFBo","repeats":1},{"count":1296,"lower_bound":"ZUhEYW9pSUg=","upper_bound":"ZU9GZzA=","repeats":1},{"count":1304,"lower_bound":"ZWM5Nm9DN1JIYlRLNHpC","upper_bound":"ZXRCNWVRWHpucFFSa25jR2ZFNXhQNg==","repeats":1},{"count":1312,"lower_bound":"ZXRlTVRxUXF6Z2NCN0dnc2tYR3VkcDVDek5zWGRtSURlSEo2NjVWNkNv","upper_bound":"ZXpKMmxwQXR3R2Nxb1BPQ1hqdQ==","repeats":1},{"count":1320,"lower_bound":"ZjB6V29jQXJvd1gySUFBM3FOYWxJV0NvcTRudg==","upper_bound":"Zkc1WWJJcmwxWjVhTVYyb1RhVzZwUzQyNm9OWFY=","repeats":1},{"count":1328,"lower_bound":"ZkdGUTF2eVlReDZjRVB0Um1iTG1TaVJPV2Y3cQ==","upper_bound":"ZlFqMlpyYTdZR2swaHN2a3VuY0RVZE1sUG9v","repeats":1},{"count":1336,"lower_bound":"Zlg1MXRGNQ==","upper_bound":"ZmpaSlNYbmdHT3ZsQU0=","repeats":1},{"count":1344,"lower_bound":"ZmtxTjJScw==","upper_bound":"ZzRj","repeats":1},{"count":1352,"lower_bound":"ZzdCb3dkYndtTTE4cDJKSWxKVnBsaE5ncmt5eUI3YUo=","upper_bound":"Z1M4bjV5NnBOUnhCdGVHUTRvdDBvcXg2cFNrcGx3a2NJaTQ4bzE4bWZN","repeats":1},{"count":1360,"lower_bound":"Z1NGZHJvVA==","upper_bound":"Z1lDdHFMeERqU0tGUjdwRlg0TDVC","repeats":1},{"count":1368,"lower_bound":"Z1pXeUIzeTF5dG9QT0N1Y1h2V3drNzQ3N3NSM1VwNw==","upper_bound":"Z3M1SG5sdW1KQXFocGpueWRMTWk=","repeats":1},{"count":1376,"lower_bound":"aA==","upper_bound":"aDVXQ1dld3NJalgyRUlOcnhBNFhCWUg=","repeats":1},{"count":1384,"lower_bound":"aDhUYVY1d201Q05FTmdDcVpGV096Sjg1NEVXTG9SaWhaWA==","upper_bound":"aGFKeGk=","repeats":1},{"count":1392,"lower_bound":"aGNPOG5Scg==","upper_bound":"aGw3S0taU1dkeURH","repeats":1},{"count":1400,"lower_bound":"aHNhdXJSVk9YQmwyNUhl","upper_bound":"aTFpTkpiUDdZZA==","repeats":1},{"count":1408,"lower_bound":"aTczMGdZSDU=","upper_bound":"aU5wdVpBOWRRV3BRWWJv","repeats":1},{"count":1416,"lower_bound":"aU55YkVZREJxUGhWdUpTV085VXprZzQ=","upper_bound":"aWp5VlFmMkRqbllXa2tORmZCalR3ZjJVNA==","repeats":1},{"count":1424,"lower_bound":"aWw2TGlmdEZmdzltOUtJN2hrOHlWVFM5a0hoS09wbzE=","upper_bound":"aXZ1VUZ2MkZnUGNQU2RoN1lpemRoSnM4cktRY0VLSDV6NA==","repeats":1},{"count":1432,"lower_bound":"ajA5b0JR","upper_bound":"akYzOVBUTFROZlpqWEYwUjBOc3ptU1hnbUMzemQ3NEdzbg==","repeats":1},{"count":1440,"lower_bound":"akZrTTFNV1hiT2VMbThWSXY=","upper_bound":"alNaY1BDdQ==","repeats":1},{"count":1448,"lower_bound":"allQYXQyZFFDT2M3S2oySGlWR25GRWJ2Qw==","upper_bound":"amVXUDE4b3N6S2htd1lyaUp4bjVzRzc1TmpCbncyV3hzUzM=","repeats":1},{"count":1456,"lower_bound":"amhlbHBjWkV0ZjJ6MXNuUHg4MFQ=","upper_bound":"amtpQg==","repeats":1},{"count":1464,"lower_bound":"amw5WHQyZGQ4SEhlWW5EaUppZDlkUQ==","upper_bound":"anQ1Vm9zSDJKNlNLYnFpUmFLWmxhWXFuckhRNGRCTQ==","repeats":1},{"count":1472,"lower_bound":"azFpalJmUQ==","upper_bound":"azVjRGF4eW0zV2FXR1djR0NkOERsZWM1OFBhZFJtZHhXVUdnbUo3WkQ=","repeats":1},{"count":1480,"lower_bound":"a0V2ZUwwbUU5T0R0Z3I2RGJWTUNtN1A=","upper_bound":"a1JhSlFEWExLSm16WTluSGE=","repeats":1},{"count":1488,"lower_bound":"a2IyckhQb1pKd25TWHJXaG9MWm9SZVNHQg==","upper_bound":"a2ZKdzFaR0lhZ3BsT01iVGd5Q3JQTHEzVlBPOHFQZVVBMXlOc1owT1lE","repeats":1},{"count":1496,"lower_bound":"a2s=","upper_bound":"a29OdEFyWnZNN1U0VmVxa3hJamxmYmdJWDk=","repeats":1},{"count":1504,"lower_bound":"a29ub2FhVkhMWW1pa1FyMTA1Mm50UVhVZlR5Q2hVTVlVYw==","upper_bound":"a3VrNkpmbHE3Mk1SRVZlN3Y3OFQwag==","repeats":1},{"count":1512,"lower_bound":"a3p4WDNPMkZPdWlGYjZIcVY=","upper_bound":"bERtWWNGSHBOMTJ6","repeats":1},{"count":1520,"lower_bound":"bEVQOU9McjQwclI4bkVzRTQ1UktkcjRnUFRDTXVJU29oVmRUWk4=","upper_bound":"bExP","repeats":1},{"count":1528,"lower_bound":"bFNyVnpGYWRhZnNzcTZTOHRE","upper_bound":"bFo5bVBoVUZabThibXZJVTh3aG91UjU1Y1VkNk42cjNDa1E=","repeats":1},{"count":1536,"lower_bound":"bGRxRFp6OFJUVTlSaTZKcGR6TmRpRFRQRWNtS0ZUdFlCdFg=","upper_bound":"bG1GWEREaGhrNGNTdXM5b2N5ZA==","repeats":1},{"count":1544,"lower_bound":"bHRDRm1ZQmZNTU4=","upper_bound":"bTR4Z2FOYkJTWGRGWFliWjV0aDRRbWxCdWJNVVNKYWFzdTRlNGl1","repeats":1},{"count":1552,"lower_bound":"bTZjQUNxSlBwVmRxbkJtTnY=","upper_bound":"bU5LS00yRkxyVzJiZkdpbzdRcHlRaXZ5dW9Fd0M=","repeats":1},{"count":1560,"lower_bound":"bVk0N004","upper_bound":"bWtFYk9ESkdvZmxuTXVnd205aWI=","repeats":1},{"count":1568,"lower_bound":"bWxvbkh6ZFppZg==","upper_bound":"bg==","repeats":1},{"count":1576,"lower_bound":"bjJQZUZsNUpCNGhETVY=","upper_bound":"bkIwUW5uSnp3Y3dTam91Qw==","repeats":1},{"count":1584,"lower_bound":"bkVzbA==","upper_bound":"bktoaDA0UkgzR1ljR3ZG","repeats":1},{"count":1592,"lower_bound":"bkw2cVI2QjFkRzIwQW1kMlBFQWRBTUxJU1V6ZHFucnplNlRvNg==","upper_bound":"blI2UFgzVkZ2VVVMbzk4MVppNGVzZlYyWVI2NUY=","repeats":1},{"count":1600,"lower_bound":"blhqQVE=","upper_bound":"bmllYW5ERDlrY3p3ZWlUQWNzaTlpZg==","repeats":1},{"count":1608,"lower_bound":"bm04SHJKRG9JVHI=","upper_bound":"bnE5ZVlsaDlsYg==","repeats":1},{"count":1616,"lower_bound":"bng4RnFlTnFPc1VFRDJMNWNPdm0yZk5VM1ZhU2ZwVW1BdE9oOVkw","upper_bound":"bzd1NDNMTEJhMHJVMXBuMFk=","repeats":1},{"count":1624,"lower_bound":"bzhEemdsZXZsN3NaZmYwZDM0TDEw","upper_bound":"b0Vt","repeats":1},{"count":1632,"lower_bound":"b0pabDBrMEV2NEtq","upper_bound":"b2FHV3JScTdYR0pXa0VBemZKa296Y29k","repeats":1},{"count":1640,"lower_bound":"b2FrU0Q4YnFoemU5TndsZURjR21KQg==","upper_bound":"b2pDd2ZsckR2","repeats":1},{"count":1648,"lower_bound":"b2ppY1JTVFFjTEJrWA==","upper_bound":"cDNWNlZj","repeats":1},{"count":1656,"lower_bound":"cDczRHJn","upper_bound":"cEJZS0NRdGdZMUtHWkhkZA==","repeats":1},{"count":1664,"lower_bound":"cEQwWU5nMGxFWk1Rc0F0S3haYWZMTEdKVlBYNVJWRA==","upper_bound":"cE5WN2lVQldveG9uanlsdHlRMUJz","repeats":1},{"count":1672,"lower_bound":"cFFvRFE0cG9rN0s3cDdVNk9NUTd1","upper_bound":"cGJSODVnY1E5VnJJQVU1VXJuajR1","repeats":1},{"count":1680,"lower_bound":"cGNjWHZ5RHc0NGZZQmU5TDVXaGZkSlFKbHdoeWRwWGZ1","upper_bound":"cGsyRGd2aA==","repeats":1},{"count":1688,"lower_bound":"cGtpWktN","upper_bound":"cUlP","repeats":1},{"count":1696,"lower_bound":"cUxTb2hxWDI4VjgybksydjJtc3phRE9nRHlxNHpzM2I=","upper_bound":"cWFKVEVPYVh2SVd0UWtMNG05N0lUWVVvag==","repeats":1},{"count":1704,"lower_bound":"cWJJU0ttWnZYRFltZ0J0UDJLZ2JhbzlORmJHMm91dHd5MVF5RUtiN01V","upper_bound":"cWhDYmhUS09GNWh0NGZjM051UW04Zmc=","repeats":1},{"count":1712,"lower_bound":"cW43dGhrb3Z3UDFhNEg5UG9JWG44RFFSOVV1MUdxZXczSzQ4ODVS","upper_bound":"cjNQ","repeats":1},{"count":1720,"lower_bound":"ckFnTUQ=","upper_bound":"ckY4Y041R2lCSw==","repeats":1},{"count":1728,"lower_bound":"cktBUVpmOHU0V0M=","upper_bound":"clJKTGQ1TlJKTUIxNng4WnRCV2tnQlBkT1RwbkFwdWxqa2k=","repeats":1},{"count":1736,"lower_bound":"clVabko=","upper_bound":"cmJGQTlSd2lzeHNtUGJRNWlaVTFEWjFYMVQyeWhFY2FqN1Qy","repeats":1},{"count":1744,"lower_bound":"cmR3SVd1M2dzN3hKZGc1VTVudkpPamplVw==","upper_bound":"cm40aWVTNzE1S1QzZzU=","repeats":1},{"count":1752,"lower_bound":"cnZYQUx5WHBUaXVrYUk3QWVvYmN0V3dLOUhJVHc0WjhC","upper_bound":"c0c2RUd4WkM4SjhJUg==","repeats":1},{"count":1760,"lower_bound":"c0h5YTh5M0dESWpxenp1cUQ=","upper_bound":"c2EwY3VEOEVwQ1hFUGlPNFQyTg==","repeats":1},{"count":1768,"lower_bound":"c2p3","upper_bound":"dA==","repeats":1},{"count":1776,"lower_bound":"dDFValNudVRBOTJUTGdWRTZUTDEwYkVZQ3IwMkZ4VVhRUG42RHgwRFA=","upper_bound":"dEVmTWdRNFVUYw==","repeats":1},{"count":1784,"lower_bound":"dEdCZzR4bWZlYXh4RmhoUnY=","upper_bound":"dGFabXJJdDhqZXB4SklwMDI2dXd5RmU4QThoMUZwOGtKTURvRg==","repeats":1},{"count":1792,"lower_bound":"dGFqeDlrbG40VENmTlJOWVI=","upper_bound":"dGVVc1R5aFhoYUV5SUc3V09rSm1G","repeats":1},{"count":1800,"lower_bound":"dGVpcFNvdkJFT1YxcDZiM3NTZVQ2RWVCUjNXbFlKc2czbWJr","upper_bound":"dGhDbHBOaE9EOVFrbHVwZkJCWVU4Zw==","repeats":1},{"count":1808,"lower_bound":"dGwyajdqVTducUxUOXFpUlpzSGw1OG9WUA==","upper_bound":"dQ==","repeats":1},{"count":1816,"lower_bound":"dTNtbTVMeDFpQXFTdWp5VWl1Z2U0U3dYdHVQbXBEWHpuNlRDbXM=","upper_bound":"dUc3ZW4wdGNlRXU0MkRaZHNDUWhDWTR4M0dqWUE4MGk1dklrS1Rn","repeats":1},{"count":1824,"lower_bound":"dUpqbUh3VGJHWVJRaG1Vazg1QlQ=","upper_bound":"dU40S3hMOHpxaE9NbVNuUGVLc3Jkc2NzVg==","repeats":1},{"count":1832,"lower_bound":"dU9WNWl2bkpPQWRCWnZEOTVPcU15N0NCeTdjUTY=","upper_bound":"dVlGSXFoYko4","repeats":1},{"count":1840,"lower_bound":"dWIyR2pQdWpzaWRXcFA=","upper_bound":"dWRlQ0NxczVtSnJNRHJrcTJqZVFRazFRWFNhbmJjRE5aUzdQSXhO","repeats":1},{"count":1848,"lower_bound":"dWZadnQ4SGRQYjFlUHVETDZrTGtnSncyd2RDT0o5T3p6REZO","upper_bound":"dXdRR21mc3RUWnM=","repeats":1},{"count":1856,"lower_bound":"dg==","upper_bound":"dkd4TTlWRWVMM1YzYmdiRWNYbEs3eFh6S2lEbTJsY2ZvSFpk","repeats":1},{"count":1864,"lower_bound":"dkhoNVMxRG15OEplOUY=","upper_bound":"dktaRmliZmNkMVpNMU4wUQ==","repeats":1},{"count":1872,"lower_bound":"dlFWUDJqRUlPaUU2Q1ViQWZYWjhIWU9o","upper_bound":"dmtQ","repeats":1},{"count":1880,"lower_bound":"dm00MVRXUXoyNlpzM256VjdjY09UNWNyTVZGRHI=","upper_bound":"dnNvazFvT1BOdlhIUmk4ZkFNV1JXZ0No","repeats":1},{"count":1888,"lower_bound":"dzdISkVsazRZV3dZM3Jl","upper_bound":"d0pMaVB0emZGbXFFZmdxWHU=","repeats":1},{"count":1896,"lower_bound":"d1BMb2pYeDFJdEx6Qm1TR0U1NEwyRTVKc2FxOFFFZmdETHF2cm5wTWJ2","upper_bound":"d1hlbkZC","repeats":1},{"count":1904,"lower_bound":"d1hmUmw1b1F3Q2l5N1lPSEtsUDlFbHlQVms=","upper_bound":"d3dQNGlQSVd1R3l4dkQ4M2c2NDF5a1dscjJkdncwZkFRZXJKV2JNcA==","repeats":1},{"count":1912,"lower_bound":"d3plMzlCYThpZ3hzVnRm","upper_bound":"eDVYU0Zh","repeats":1},{"count":1920,"lower_bound":"eEhy","upper_bound":"eGVJMzZUWg==","repeats":1},{"count":1928,"lower_bound":"eHBTNHNWZDdJNlN0RWVt","upper_bound":"eHZOSzlkZTBjU3pnUHJkalNjRw==","repeats":1},{"count":1936,"lower_bound":"eTBPbXZ0U1Q=","upper_bound":"eURENGFqTFRXNElLbnJ5MHJ6Y2hPRUNyc1JKMXdv","repeats":1},{"count":1944,"lower_bound":"eUVzRWNacWFhSkU=","upper_bound":"eUlac0M0bm95VmVaWlVBakJralFnMmlWYg==","repeats":1},{"count":1952,"lower_bound":"eUpiNzdM","upper_bound":"eVZDNTF5U25xRFZm","repeats":1},{"count":1960,"lower_bound":"eWdYS0ROQUcxdEZuc1dYbUlpYzN2Mm5YQzh4bjZT","upper_bound":"eWlDS0pwejRuUlg2ZTBxclZyc2lyNWhYeUR4ajZLNW9SS20=","repeats":1},{"count":1968,"lower_bound":"eW1tOUdNNlJWR3IwczF4SmZlUTRSdmlWag==","upper_bound":"ejBBSEltU1pVRXhKbXRNZUpNWlR0RE8=","repeats":1},{"count":1976,"lower_bound":"ejJFN3EyQXY5dUNhb2Q0TlducGM0ZVRTUXd5","upper_bound":"ejdhUXlVWmpiU2VYOEJwRGlzU3liUjNQcnY=","repeats":1},{"count":1984,"lower_bound":"ekE=","upper_bound":"ekhyYk52dUtsUg==","repeats":1},{"count":1992,"lower_bound":"eklBWFk4aWNNWU83TjZ0WGgy","upper_bound":"elc=","repeats":1},{"count":2000,"lower_bound":"emRMV0tEazlXUVBuTFRvaHE4OXRVYkFJeUIyNU9aT285OThsQjhN","upper_bound":"emxvbG5JMGNEYmhuR1gxNXdnZjhMcDcwQnBqWUZHaUhySk93OHNPN2Rw","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,0,0,0,0,1,0,1,2,0,1,2,2,2,0,0,0,0,0,2,1,1,2,1,1,0,1,1,0,2,2,1,1,1,0,0,1,0,1,0,0,1,2,0,1,0,0,1,1,0,1,2,0,2,2,1,2,0,0,1,0,0,1,2,0,1,1,0,1,1,0,0,0,0,0,1,3,1,1,2,1,0,1,0,2,0,3,3,0,1,1,3,3,3,2,2,1,1,1,1,1,2,0,0,2,0,0,2,0,2,0,0,0,0,0,0,2,0,1,1,0,1,1,1,1,1,2,0,0,2,3,1,0,1,2,2,1,2,1,3,0,1,0,0,1,1,1,1,0,2,3,1,2,1,4,0,1,1,1,1,0,1,1,0,1,0,1,0,1,2,1,0,1,0,1,0,1,2,3,1,0,2,1,0,1,0,0,0,1,1,2,0,1,1,1,1,1,1,0,3,1,2,1,1,1,1,0,2,0,0,4,1,1,1,1,1,1,0,1,1,0,4,2,2,2,1,0,1,2,3,1,1,1,0,3,3,2,0,1,1,0,2,0,3,1,0,2,2,1,0,0,1,2,2,3,0,1,1,1,0,0,2,0,1,4,0,2,1,1,2,3,0,1,0,0,0,0,1,0,1,1,0,0,2,1,1,0,0,1,2,0,1,0,0,0,0,0,1,0,1,0,1,2,1,3,0,1,0,1,0,2,0,2,0,0,1,2,0,2,2,0,1,3,1,1,0,0,2,1,2,0,3,4,2,1,0,1,0,1,0,0,1,0,0,2,1,1,0,2,0,1,1,1,0,2,1,2,0,0,1,2,0,2,2,0,0,1,1,1,2,0,0,0,0,1,2,1,1,0,1,0,1,2,0,0,0,1,2,1,1,0,2,0,1,0,2,0,0,0,0,3,1,0,1,0,0,2,1,0,0,0,2,1,2,1,0,0,0,1,0,1,1,1,2,0,2,0,0,1,4,0,1,1,1,0,0,1,1,2,1,1,1,1,0,2,0,2,1,1,0,0,1,2,1,1,3,0,1,0,0,1,1,1,1,0,2,0,7,0,0,1,1,0,0,1,0,3,0,1,1,0,0,0,0,2,0,1,1,0,0,1,0,0,1,1,0,0,3,1,1,1,2,3,1,1,0,1,2,0,0,1,1,0,2,0,0,0,1,2,0,0,0,1,0,2,1,6,0,1,2,0,1,0,1,0,5,0,1,2,0,1,1,3,1,0,1,2,1,1,3,2,0,2,0,0,2,1,0,2,0,0,0,3,0,1,2,0,0,0,0,0,2,0,2,0,2,1,1,0,3,1,1,2,2,2,3,1,0,1,3,1,1,2,1,1,1,2,0,2,2,1,1,2,1,2,0,2,2,1,0,0,0,0,0,0,0,0,1,1,2,1,0,3,0,2,1,1,0,0,0,1,2,0,1,2,3,0,1,2,2,0,0,2,1,1,1,2,0,0,1,1,0,2,0,2,1,1,0,0,1,3,1,1,3,2,0,1,0,0,1,1,2,2,0,0,2,3,1,3,2,0,0,0,2,1,0,1,0,0,0,1,3,4,0,1,1,2,1,1,0,1,0,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,1,1,2,0,1,0,1,1,1,1,1,2,1,2,2,1,2,0,1,1,1,3,0,1,0,1,1,0,1,0,2,0,2,1,0,0,1,0,1,0,2,2,0,1,0,2,0,1,3,2,1,1,2,3,1,1,1,1,0,0,0,3,0,2,1,2,1,1,0,1,0,0,2,1,0,1,1,0,2,0,2,2,1,0,1,1,1,2,0,0,2,1,1,1,1,1,2,0,0,0,1,0,0,0,1,2,1,0,1,0,0,1,0,1,0,2,2,3,2,1,0,3,0,0,2,1,2,0,0,2,2,0,1,0,1,0,1,2,4,0,0,1,1,1,1,1,1,0,1,0,2,1,0,4,2,2,1,1,1,0,1,0,3,1,1,1,1,0,2,1,2,1,2,2,1,1,1,2,1,1,1,1,0,2,1,0,2,1,1,1,0,1,2,1,0,1,0,0,1,0,2,0,1,0,3,1,0,2,0,1,0,0,1,1,2,1,0,0,3,0,1,3,0,2,2,3,0,2,0,2,0,1,1,0,1,1,1,1,0,2,1,0,0,1,0,1,0,2,2,1,0,0,1,4,0,1,1,1,3,0,0,1,0,1,1,0,0,2,3,1,2,2,2,0,1,2,0,2,1,2,1,1,3,0,0,1,0,1,0,1,0,3,3,1,1,1,1,4,0,1,1,1,0,3,0,1,0,0,1,2,0,0,2,2,0,1,1,1,0,0,4,2,2,0,1,0,0,0,1,1,0,0,0,1,1,0,1,2,0,0,0,0,0,3,2,0,0,1,0,1,0,2,1,2,1,2,1,1,0,0,1,2,1,1,0,0,1,1,1,3,0,0,5,0,0,2,3,1,0,1,0,2,2,2,0,0,1,0,1,1,2,1,1,1,1,1,1,1,2,3,4,1,1,2,2,1,0,0,0,2,0,1,1,2,0,2,0,0,0,2,0,1,0,2,0,0,1,4,1,1,3,1,0,1,2,0,1,4,0,4,0,2,0,1,1,0,1,0,3,0,1,1,4,0,1,1,1,0,2,0,1,0,1,0,1,2,0,1,0,0,1,0,0,2,0,3,0,0,1,1,0,2,1,0,1,0,1,0,2,1,2,1,0,0,0,1,0,2,0,2,1,0,0,1,1,2,1,1,0,0,3,0,2,0,0,3,0,0,0,1,0,1,1,3,0,0,0,1,3,1,2,0,3,1,0,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,1,1,1,2,0,0,1,1,0,2,1,0,1,2,2,0,1,0,0,1,2,0,1,3,1,0,2,0,1,2,1,3,3,0,2,0,0,1,2,0,3,1,1,0,2,2,1,2,0,0,4,2,0,0,2,0,1,1,2,0,1,0,0,0,1,2,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,2,0,1,0,1,3,2,1,3,3,2,1,1,2,1,0,4,2,0,3,1,0,1,0,3,1,1,0,2,0,0,0,1,2,2,0,1,0,0,0,1,2,1,0,1,0,2,2,1,3,0,1,2,2,2,0,2,2,1,2,1,0,1,2,2,0,2,0,3,1,1,1,0,0,2,1,3,1,3,3,0,1,0,0,0,0,4,1,4,1,2,3,0,2,3,1,1,0,2,0,1,0,2,1,1,1,2,0,0,0,1,2,1,0,0,1,0,1,2,1,0,2,1,1,0,0,1,1,0,1,0,1,1,1,1,2,0,3,0,1,0,1,1,1,1,1,0,0,0,0,0,1,0,1,0,1,1,2,1,1,0,0,0,0,1,1,1,0,2,0,1,2,0,2,1,1,0,0,2,0,0,2,1,0,1,1,0,1,0,1,1,2,1,0,0,1,0,2,0,1,1,2,0,0,1,3,0,3,1,1,2,1,1,0,1,1,1,0,1,1,0,2,0,0,1,3,2,1,2,0,0,1,1,3,1,1,1,0,2,1,2,0,0,1,0,2,0,0,4,0,2,2,2,2,2,2,1,0,1,2,1,1,1,0,0,1,3,1,0,2,3,1,0,1,2,0,3,0,1,1,0,3,1,0,0,3,1,0,1,1,3,1,1,0,1,0,0,0,0,0,1,2,1,1,2,1,5,0,1,1,2,4,2,0,1,1,3,1,2,0,2,1,0,1,2,0,2,1,0,0,1,0,1,2,0,1,3,1,0,3,2,0,2,5,2,2,0,1,1,0,0,4,2,0,1,1,0,1,0,2,0,0,1,0,0,0,0,2,1,0,1,0,1,2,2,2,0,2,0,1,1,0,0,1,3,2,0,0,2,2,0,1,0,1,0,0,0,0,1,1,0,1,1,3,1,2,1,1,3,1,1,0,0,0,0,1,2,0,0,0,1,1,1,2,1,0,0,2,0,1,0,1,0,2,0,1,0,2,2,0,1,1,2,1,2,0,1,0,2,1,0,1,2,2,0,2,0,0,0,1,3,0,1,1,0,0,2,2,0,2,0,2,0,1,1,1,1,1,1,1,1,0,1,2,2,0,1,0,1,0,0,4,1,3,0,0,0,2,2,2,1,2,1,0,2,1,0,1,0,1,0,2,3,3,1,1,4,1,1,1,1,1,1,0,0,1,0,1,0,1,1,0,0,0,1,1,4,3,1,2,1,1,3,1,0,2,3,0,2,0,1,2,0,0,1,3,2,2,1,2,0,2,0,0,0,1,1,0,0,3,0,0,2,0,0,2,1,2,0,0,2,0,1,0,1,0,1,0,3,1,1,3,0,1,2,1,2,1,0,0,2,1,2,1,0,3,2,1,1,0,0,1,2,3,0,1,2,0,0,0,1,0,1,1,1,0,1,3,0,3,0,0,1,1,0,0,1,1,1,0,2,2,1,1,1,1,1,1,2,1,1,0,1,1,0,1,2,0,2,2,0,1,0,1,0,1,1,0,1,0,2,0,2,0,0,1,1,3,0,0,0,1,0,2,1,1,0,1,2,0,1,0,0,1,1,2]},{"counters":[0,0,1,0,2,1,0,0,0,1,2,1,1,1,0,0,1,1,1,1,2,0,1,0,0,0,0,2,0,1,1,1,0,2,2,2,0,4,2,1,3,0,0,1,2,2,1,0,1,2,2,3,2,2,0,4,1,0,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,2,1,1,1,1,1,1,1,1,0,0,3,1,0,2,1,0,0,1,0,2,6,1,0,0,0,1,1,0,1,2,1,1,0,0,1,0,2,0,1,0,0,0,3,2,2,0,0,0,3,0,1,1,0,1,1,2,0,2,2,1,3,1,2,0,0,0,0,0,2,1,1,2,1,1,0,1,0,1,0,1,0,1,2,4,0,0,2,1,2,2,5,2,1,1,0,1,2,1,0,1,0,0,0,1,0,2,2,1,1,1,1,2,1,1,2,1,1,0,0,2,2,2,0,1,1,0,2,1,1,0,0,0,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,0,0,1,1,2,1,0,0,1,0,2,1,1,0,0,0,0,1,0,0,3,2,1,0,2,2,0,2,3,1,3,3,0,1,1,0,1,2,2,0,1,2,0,1,2,0,1,2,0,0,0,3,0,0,2,2,1,1,2,1,2,1,0,1,0,1,4,0,0,2,0,2,0,2,1,2,0,0,0,1,0,0,0,0,0,1,6,0,1,1,0,2,2,0,2,0,0,1,4,0,0,4,4,1,2,0,1,1,1,1,3,0,1,1,0,0,0,2,1,3,1,0,4,0,1,0,1,1,1,1,0,1,1,0,3,3,0,0,1,0,2,1,2,6,1,2,0,0,2,2,0,2,1,0,1,1,0,1,0,1,0,0,1,1,0,0,1,3,1,0,2,2,0,0,1,3,1,1,3,1,0,0,1,2,0,1,0,1,1,0,0,1,2,1,1,0,0,1,0,2,2,1,5,2,1,0,0,0,4,0,1,0,3,2,1,0,1,0,3,1,0,0,3,2,0,1,2,2,0,1,0,0,0,0,2,2,0,1,0,0,0,0,1,3,4,0,1,1,1,1,2,0,3,1,0,0,0,1,0,1,2,1,1,1,2,1,2,1,0,1,0,2,0,1,0,0,1,0,0,1,2,2,1,0,2,1,0,0,0,4,1,0,0,0,0,0,0,0,0,2,1,2,2,1,1,3,0,0,2,2,1,2,1,0,1,0,1,0,0,2,2,1,1,0,0,0,2,1,1,1,1,1,1,3,3,0,3,0,1,0,0,1,1,1,0,0,0,0,1,0,0,0,1,0,0,1,1,0,2,1,1,0,0,1,1,2,1,1,0,1,0,0,1,0,1,1,1,1,1,0,0,0,0,0,0,0,3,2,1,0,1,0,0,1,3,0,0,1,3,1,1,1,2,1,0,2,1,3,1,1,1,0,1,0,0,0,2,1,0,3,0,0,0,0,1,0,2,4,4,0,0,1,0,1,0,1,2,0,1,1,0,0,0,1,1,1,0,2,1,1,1,1,4,0,0,0,1,0,0,2,0,0,1,1,2,2,1,0,1,0,3,0,2,1,0,2,0,0,1,1,0,2,0,0,1,0,0,0,1,2,0,0,0,0,1,1,0,0,1,1,0,0,1,1,1,2,1,1,2,1,3,1,0,0,2,0,0,1,2,2,3,0,0,0,4,1,0,2,2,2,1,2,0,2,0,0,2,1,1,2,2,1,2,1,0,0,2,2,1,1,1,2,3,1,1,3,1,1,1,0,2,0,1,0,0,2,0,0,1,1,2,0,0,2,1,1,0,0,1,1,2,2,3,0,1,0,1,2,1,2,2,2,2,1,1,2,0,2,0,1,1,1,1,2,0,1,4,1,4,3,0,2,0,2,2,1,0,1,1,0,1,2,0,0,0,1,0,1,2,1,1,2,0,1,0,0,0,1,0,2,1,3,2,0,1,2,1,1,1,1,0,0,1,3,1,0,2,1,0,1,0,0,2,2,1,0,0,1,2,0,1,1,3,0,1,0,1,4,1,2,0,1,2,2,1,0,1,0,1,1,0,1,2,1,1,1,0,1,1,0,2,1,0,1,0,1,0,1,1,1,1,0,0,1,4,1,1,0,3,1,0,2,1,1,1,1,1,3,0,3,0,2,1,0,2,0,0,1,2,1,1,1,1,1,2,0,1,1,0,1,1,0,1,0,0,3,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,1,1,1,3,0,0,3,0,1,0,0,1,2,0,1,1,4,3,2,0,0,2,4,0,0,0,0,0,1,2,1,1,0,0,0,0,1,0,3,1,1,3,0,1,0,0,1,1,1,0,0,1,0,2,2,1,0,3,1,0,1,2,1,1,0,3,0,1,0,2,0,1,1,0,0,2,2,1,1,2,1,2,0,0,0,1,1,0,0,3,3,1,0,0,2,1,1,2,1,0,0,2,1,1,0,2,2,1,0,1,0,2,0,2,1,1,1,0,1,0,3,1,1,1,1,0,1,0,1,4,0,1,0,0,3,0,1,2,2,3,0,1,0,0,0,1,0,3,0,0,1,0,3,2,1,3,2,1,0,2,1,2,0,1,0,0,1,4,0,1,0,1,1,2,0,0,2,1,2,0,0,0,3,1,0,3,2,0,0,4,1,5,1,2,1,2,2,2,0,1,0,1,0,0,2,0,0,1,4,2,4,2,2,0,1,0,0,2,1,1,4,0,2,0,0,1,2,2,1,2,4,0,1,1,2,0,1,0,1,1,0,0,0,1,1,1,0,2,0,0,1,0,1,0,0,2,0,0,0,2,1,2,1,4,0,2,0,0,0,0,0,0,0,0,0,0,2,2,1,1,0,1,0,1,0,0,3,0,0,3,0,1,2,2,1,0,1,2,4,0,2,0,0,0,1,1,1,3,2,0,0,2,0,2,3,0,2,0,0,0,0,1,1,1,2,0,1,0,0,0,1,0,0,1,0,3,0,3,0,3,2,1,0,2,2,3,1,2,0,1,0,1,2,3,2,1,0,2,1,1,1,1,1,1,0,0,3,1,0,0,0,0,1,1,0,2,2,3,0,1,0,0,2,2,2,1,1,0,2,1,0,2,2,0,1,1,1,2,0,1,1,1,0,2,1,0,1,0,0,0,1,0,0,3,0,2,1,2,1,0,0,3,1,0,1,0,2,2,1,3,3,1,2,2,1,1,0,0,1,2,1,0,1,2,1,0,0,0,3,0,1,2,1,0,1,0,3,0,0,1,0,2,2,0,3,1,1,0,1,1,0,0,0,0,1,2,0,3,2,2,2,1,0,4,0,0,2,2,0,3,0,2,0,2,0,1,0,1,0,0,0,0,3,0,0,1,1,1,2,0,1,2,1,0,2,4,2,0,2,2,0,0,0,1,2,2,0,2,1,0,2,1,3,1,0,0,0,2,1,0,1,1,1,1,1,0,1,2,1,2,0,1,0,1,1,0,1,0,1,2,2,0,1,1,0,2,0,1,2,1,1,1,0,0,0,0,1,2,3,2,3,0,1,0,1,0,0,2,4,0,2,0,4,0,1,1,0,2,0,0,0,1,1,0,1,1,2,1,1,0,0,3,1,1,1,2,0,1,1,0,1,0,0,0,0,1,1,1,1,0,1,0,1,2,1,0,2,2,0,1,1,0,3,0,0,0,1,0,1,0,1,0,3,0,2,1,1,0,1,0,1,1,1,1,1,0,1,0,2,2,2,0,1,0,0,3,0,2,1,1,1,2,1,0,1,0,3,1,1,2,0,1,1,0,0,1,1,0,1,0,0,3,0,2,0,2,0,1,2,1,1,0,1,2,1,1,1,2,1,2,0,0,1,2,1,1,1,2,1,1,1,0,1,2,1,1,2,1,0,1,0,2,0,1,0,2,1,0,0,1,0,2,2,0,1,0,1,3,1,3,2,0,1,1,1,0,0,2,1,5,2,1,0,0,0,1,2,2,1,0,1,0,1,0,1,0,2,4,4,1,2,0,0,1,1,1,1,1,1,0,0,1,0,0,1,2,2,0,2,2,0,0,2,0,1,2,0,2,0,1,0,2,0,2,2,1,2,0,3,1,0,1,1,1,2,0,1,1,1,0,0,1,0,1,2,0,2,1,2,2,0,1,4,0,0,1,1,1,0,1,1,0,0,0,0,0,2,2,2,2,0,0,1,0,0,1,0,1,2,0,0,1,2,0,1,2,2,0,0,2,1,1,2,1,0,1,0,1,2,1,0,1,0,0,1,0,1,2,2,1,0,1,1,0,4,1,1,2,1,1,2,0,2,2,0,0,2,1,1,2,1,0,1,3,0,0,1,2,0,1,0,2,0,0,3,0,0,0,0,1,1,1,0,2,2,0,1,1,0,2,0,1,1,0,2,1,0,2,1,3,0,1,1,0,0,1,1,1,0,2,2,1,0,0,1,2,1,0,2,0,0,1,1,1,0,1,2,1,2,0,1,1,0,0,1,1,0,1,2,1,2,0,0,1,2,2,1,2,2,3,0,2,0,4,3,1,1,1,2,1,0,1,0,1,3,2,0,0,1,2,0,1,0,0,1,0,1,1,1,0,1,0,1,2,1]},{"counters":[2,1,1,0,0,0,2,0,0,0,1,1,2,1,1,2,1,1,1,0,0,0,4,0,3,1,0,0,0,2,2,2,0,1,0,0,0,1,1,2,3,3,2,0,1,1,0,0,1,2,2,0,1,1,1,2,0,1,1,1,1,1,0,1,1,0,1,0,1,2,0,1,1,0,0,2,1,2,1,2,0,1,2,1,0,0,0,3,0,2,1,1,0,2,1,1,1,1,0,0,0,1,2,1,2,1,1,0,1,1,1,2,2,0,1,3,2,1,1,2,1,0,1,1,1,0,1,1,1,1,0,1,0,0,2,2,0,0,1,0,2,0,2,2,1,0,0,1,0,1,2,1,1,3,0,2,1,1,0,1,3,0,0,1,2,1,3,1,1,1,1,2,0,1,0,1,0,4,1,2,0,1,1,2,1,1,0,1,2,1,0,3,0,1,3,0,2,1,0,1,1,0,2,0,2,0,0,0,1,0,0,0,1,1,4,1,1,0,0,2,0,2,1,2,1,0,4,0,2,0,1,1,0,2,1,0,1,3,2,0,0,2,2,0,1,1,0,1,2,1,0,1,0,0,1,0,0,0,1,2,0,2,0,0,1,3,0,2,1,1,1,1,0,1,1,0,1,0,3,1,1,2,0,0,0,0,1,2,2,2,1,0,2,1,3,0,1,3,0,0,1,1,1,0,1,1,2,0,0,0,1,1,1,0,0,2,1,0,0,1,2,0,3,2,1,1,0,0,0,0,4,1,4,2,0,0,1,3,1,1,0,0,0,0,2,0,1,0,3,0,1,0,2,0,1,0,1,2,1,2,1,1,0,2,0,1,0,1,1,1,0,0,0,1,0,2,2,1,2,0,0,2,2,1,4,2,2,2,0,1,0,0,0,2,0,0,1,2,0,0,0,0,1,1,2,1,3,1,2,0,0,0,1,1,2,1,0,2,1,2,0,1,1,0,0,0,0,1,1,2,0,1,0,1,0,3,1,1,1,2,1,0,2,2,3,0,1,1,0,2,4,1,4,1,3,0,0,1,0,3,1,1,0,0,0,1,0,1,2,1,1,1,2,0,1,2,2,1,2,0,0,0,3,1,0,1,2,2,0,2,0,0,1,1,1,0,0,2,0,0,0,1,1,1,0,0,0,1,0,0,1,1,3,1,1,0,0,1,0,0,0,1,0,1,1,3,1,2,2,1,1,0,1,0,1,3,0,0,1,2,0,2,0,1,2,0,1,3,1,0,1,0,4,2,1,1,1,0,1,0,1,0,2,1,2,0,0,1,3,2,0,2,1,0,1,4,0,4,1,3,2,3,0,0,0,2,2,0,1,1,2,2,1,0,0,2,2,2,1,2,0,0,2,2,1,2,0,2,1,0,0,2,0,1,0,1,0,1,1,1,2,0,0,0,1,1,3,2,0,2,0,0,0,1,1,3,2,1,1,0,1,2,1,1,1,0,0,0,4,1,0,0,0,2,0,1,0,2,1,1,1,2,0,1,0,0,1,1,0,1,1,4,3,1,0,0,2,1,3,1,2,2,1,1,1,0,0,0,2,1,0,1,1,1,1,0,0,0,2,0,1,0,0,3,1,0,2,1,1,3,0,2,0,1,2,0,2,0,1,0,1,0,2,4,0,0,2,0,0,0,2,0,3,0,1,1,0,5,1,1,1,1,0,0,1,1,1,2,1,0,0,0,2,0,6,0,0,4,0,0,1,1,0,1,0,3,0,1,3,0,2,1,0,1,0,2,0,0,1,2,0,0,1,1,0,0,1,1,2,1,0,2,1,1,1,2,1,2,1,2,1,0,0,1,2,1,1,1,2,2,1,1,1,2,1,1,2,1,1,0,0,3,0,1,0,0,1,1,0,0,1,1,1,0,1,1,1,0,1,2,1,1,1,0,1,2,0,1,2,0,1,2,0,0,2,2,0,0,1,0,3,2,0,0,2,1,2,0,0,1,3,1,1,0,2,1,0,0,1,0,0,3,1,1,1,0,0,0,0,1,1,2,1,3,0,1,0,1,1,0,1,3,1,2,0,2,1,0,0,0,0,0,1,0,0,0,1,1,0,2,0,0,1,0,0,0,1,1,0,0,2,1,2,2,0,0,1,1,2,2,0,1,1,0,1,0,2,1,1,0,1,3,1,0,0,1,0,2,0,0,0,1,1,3,0,1,1,1,0,3,2,1,0,1,0,0,1,0,3,2,0,1,0,3,0,2,2,1,0,1,1,0,0,0,1,0,1,1,2,2,1,1,0,2,0,0,1,1,0,1,1,2,1,1,1,0,0,1,1,1,1,0,1,0,0,1,0,3,3,0,0,2,2,2,1,0,1,0,0,1,1,0,1,1,1,1,0,0,0,0,1,0,1,4,1,1,0,0,3,2,0,3,0,0,1,0,0,1,3,2,1,0,3,1,0,2,1,1,0,2,2,1,0,0,0,0,1,0,1,2,2,4,0,2,0,1,2,2,0,0,2,1,2,3,0,0,0,2,0,0,0,0,0,2,0,2,1,1,0,0,1,0,2,0,0,2,0,2,0,0,0,0,1,0,0,1,1,1,0,0,2,1,1,1,1,0,0,1,0,1,3,0,0,0,1,0,1,2,1,0,1,1,0,1,0,0,1,0,2,1,1,0,1,1,1,0,1,2,1,2,0,2,1,1,1,0,2,1,3,0,0,0,0,2,3,1,1,1,1,1,1,1,2,1,2,0,2,1,1,0,0,0,1,1,1,1,0,0,1,2,2,1,0,2,0,1,1,0,0,0,0,2,0,1,1,1,1,1,1,2,2,1,1,0,1,1,0,0,0,2,0,0,0,2,0,0,1,2,2,1,0,0,1,0,1,0,2,3,1,2,2,0,0,1,0,3,0,2,2,1,2,1,1,0,1,1,0,1,0,1,0,1,1,1,1,1,0,1,1,0,0,0,0,0,3,2,1,0,1,1,0,0,2,2,0,0,0,0,1,0,1,0,0,4,0,0,0,1,2,0,1,0,2,1,0,1,4,1,2,3,4,3,0,2,1,0,2,3,2,2,3,0,0,1,1,2,1,1,0,1,2,1,0,1,0,1,3,0,1,1,0,0,1,1,1,2,2,4,1,0,0,0,0,0,1,2,0,2,4,1,0,1,1,0,3,1,0,0,1,0,0,1,4,1,0,0,0,0,0,0,0,2,2,1,0,0,0,1,0,1,0,2,0,2,1,0,2,0,1,0,0,0,1,0,0,0,0,1,1,1,3,1,2,2,0,0,4,1,0,0,0,2,1,4,3,1,4,0,1,1,2,0,1,0,0,2,0,0,0,3,2,1,4,0,0,3,3,2,2,0,1,1,0,0,1,0,2,1,3,2,2,0,2,3,2,4,3,2,2,0,0,2,1,1,0,0,3,0,2,3,1,3,0,3,0,2,0,0,0,0,1,0,4,1,0,2,1,1,1,2,2,1,1,0,0,0,1,2,1,0,1,2,1,0,0,0,0,3,1,1,4,1,3,0,0,0,1,0,1,0,0,0,1,1,1,0,0,0,0,3,1,2,0,2,2,1,3,0,2,0,1,1,0,2,1,0,0,1,1,3,0,0,1,1,0,1,1,0,1,1,1,1,3,1,1,0,2,0,0,0,0,0,1,0,0,1,1,2,1,0,0,2,1,0,0,1,2,3,0,0,2,3,4,1,1,0,3,0,1,0,1,2,0,2,3,4,1,0,1,0,1,0,1,3,0,0,0,2,2,3,2,4,3,1,0,0,4,0,2,1,1,0,1,2,0,1,1,0,2,1,1,1,0,2,0,0,1,2,1,0,1,0,2,2,0,1,1,1,2,0,1,1,4,1,1,0,2,2,2,1,2,0,2,2,1,1,1,0,0,2,0,0,0,2,0,0,2,1,4,0,0,1,0,1,3,0,0,1,2,1,1,1,1,2,4,1,2,0,1,0,0,1,0,0,0,0,0,0,2,1,1,0,2,1,2,1,2,1,0,1,3,3,2,1,1,0,0,1,0,1,1,3,1,1,2,0,0,0,0,0,0,2,2,1,2,1,1,1,1,2,0,0,1,0,0,1,0,1,1,1,0,2,1,2,0,1,1,1,0,1,1,0,0,2,5,2,0,1,1,1,0,0,0,1,1,2,0,3,0,0,1,1,3,0,1,1,1,1,0,1,1,0,1,0,1,1,0,0,1,0,4,2,1,1,2,1,1,0,0,1,1,1,1,0,0,0,1,0,1,4,3,2,2,0,1,0,0,1,0,2,0,1,2,0,0,0,1,3,2,0,2,3,0,1,0,0,1,2,1,1,1,1,1,0,1,3,2,1,2,1,2,2,0,1,0,0,0,3,1,0,3,3,2,2,1,0,0,1,1,0,1,1,1,0,0,3,2,0,0,3,1,1,1,1,1,3,1,1,0,1,1,0,0,0,1,0,3,1,0,0,2,0,0,1,2,1,3,1,1,1,1,0,1,4,1,2,0,2,0,1,2,1,0,1,1,1,5,0,0,1,0,0,0,0,0,4,2,0,1,1,1,0,0,1,2,1,0,1,3,1,0,3,1,0,0,2,0,2,1,1,3,1,0,1,2,0,0,1,2,2,2,1,0,2,0,0,0,1]},{"counters":[1,1,0,1,2,1,0,2,1,2,0,0,1,0,1,2,0,2,0,1,0,2,1,0,1,3,3,4,0,0,1,0,1,1,2,0,2,1,2,0,0,2,3,2,2,2,2,3,1,1,1,0,0,1,3,0,0,0,1,4,2,1,1,1,1,1,0,2,2,0,1,0,1,1,1,3,2,1,0,0,0,1,1,0,0,2,1,4,0,2,0,2,2,3,1,1,1,0,2,0,1,0,0,0,1,3,2,1,1,0,0,3,0,1,1,1,0,0,0,1,1,1,1,0,1,1,3,2,2,3,0,3,0,1,2,0,0,0,4,0,2,1,3,1,1,0,1,1,0,1,0,0,1,0,2,1,0,1,1,2,2,0,1,1,2,0,1,1,4,1,1,2,1,0,2,1,1,0,2,0,2,1,0,1,0,0,1,0,2,1,3,0,2,1,1,0,1,0,1,0,2,2,2,1,0,3,1,0,0,0,0,3,0,1,1,0,1,0,1,0,0,1,0,0,2,0,0,0,2,1,1,1,1,5,0,0,0,0,0,2,0,1,1,0,0,1,1,1,0,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,1,1,1,0,2,0,1,0,0,1,1,0,0,0,3,0,2,1,1,3,4,3,0,4,0,1,1,0,2,0,0,1,2,2,2,2,0,0,0,1,0,0,0,0,1,1,0,0,1,2,0,2,0,3,0,1,0,1,1,1,1,0,1,1,0,0,1,0,0,1,3,2,2,0,0,2,2,1,0,0,0,1,2,3,0,1,0,2,1,0,3,2,2,0,0,0,0,0,2,1,1,0,0,5,1,1,1,1,0,2,3,1,0,0,0,2,1,0,2,0,2,0,0,1,0,2,0,4,3,1,1,1,1,3,2,3,1,1,1,0,3,1,1,1,1,2,2,1,0,1,1,1,2,0,0,0,0,4,1,0,1,0,0,1,3,2,2,0,1,3,0,2,3,1,1,1,0,1,1,0,1,0,2,1,1,1,0,3,1,1,1,2,0,0,0,1,0,3,1,2,1,0,1,0,1,1,2,3,0,1,2,0,0,1,1,0,0,1,0,1,0,3,1,0,3,1,0,2,1,1,1,0,1,1,1,4,1,3,2,0,1,3,2,2,1,1,3,1,2,0,0,2,1,1,3,1,0,1,1,1,0,0,0,1,0,0,1,0,2,2,0,1,0,2,3,0,0,3,1,1,2,2,1,1,1,3,3,1,1,0,1,1,2,0,0,1,1,2,3,1,1,0,2,0,0,1,3,0,1,1,2,1,2,3,3,0,2,2,2,0,3,1,0,2,0,1,1,0,3,2,0,1,4,2,1,1,0,0,0,3,1,0,2,2,1,1,1,0,1,1,0,1,1,1,1,2,2,1,1,2,0,0,0,0,0,1,0,2,2,0,1,0,1,1,2,2,0,2,2,1,0,2,1,2,1,0,1,1,1,4,0,0,2,0,1,1,1,1,0,1,1,2,0,2,0,0,1,1,1,1,2,0,0,0,0,3,0,0,3,0,1,0,2,0,1,0,0,2,0,2,1,0,0,0,3,1,0,1,0,1,0,1,2,0,3,0,1,4,1,5,0,2,1,1,0,0,1,1,1,0,0,2,1,3,1,0,0,0,0,3,0,2,1,1,1,0,1,1,0,0,1,2,0,2,0,1,0,1,0,0,3,1,0,2,0,0,2,1,0,1,1,1,0,2,1,1,0,1,1,2,0,1,0,0,1,0,1,0,0,1,2,1,1,1,0,2,1,1,0,4,0,1,0,1,1,0,0,0,1,1,1,0,1,2,0,1,2,3,0,1,1,2,2,2,1,1,0,0,2,0,2,0,1,0,0,1,0,2,1,1,0,1,1,0,2,0,1,0,1,0,1,1,0,2,2,1,1,3,0,0,2,0,3,0,0,3,1,1,1,0,0,0,0,1,0,1,1,0,0,1,0,1,2,1,1,0,4,5,0,1,0,1,1,2,1,2,3,0,0,1,0,0,0,1,0,0,1,2,1,1,0,0,1,0,1,3,1,0,3,1,0,2,2,0,1,0,0,2,0,2,1,2,3,0,1,1,1,0,2,0,2,0,2,1,3,0,1,0,1,0,0,1,1,2,2,1,0,0,1,1,0,1,2,1,1,1,2,0,3,2,1,1,0,0,0,2,0,1,1,0,1,1,1,1,0,0,2,0,0,1,0,1,0,2,1,0,2,1,1,3,0,1,0,3,0,0,1,3,1,0,2,1,0,0,2,0,1,0,0,1,1,2,2,1,1,2,0,1,0,1,2,0,1,1,0,2,0,0,1,2,1,0,1,3,2,1,3,1,2,1,0,2,1,2,2,1,0,1,0,3,0,1,4,3,1,0,0,0,0,1,0,0,0,1,2,1,1,2,1,1,1,0,1,1,2,1,1,1,1,0,0,0,2,0,0,1,1,0,1,0,2,0,0,1,2,2,0,1,0,2,0,0,2,2,1,2,1,1,0,0,0,0,0,0,0,0,1,1,1,0,3,3,1,0,0,0,0,1,0,0,0,0,0,3,3,4,1,0,0,0,0,3,1,1,3,0,3,0,2,1,0,0,0,1,1,1,2,0,1,2,1,0,0,2,2,4,1,1,0,0,2,1,1,2,0,1,0,3,0,0,2,1,0,0,0,1,0,0,0,3,1,0,1,2,2,0,1,3,1,0,1,4,0,1,0,1,1,1,2,0,3,0,0,0,1,0,0,0,0,2,1,3,2,3,3,0,1,1,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,1,2,1,2,1,2,0,2,2,1,2,1,0,3,1,1,4,0,1,0,1,0,0,0,1,2,0,3,1,2,2,0,1,1,0,1,2,3,1,1,0,0,1,0,2,1,3,1,0,3,0,1,1,1,3,2,1,1,0,0,0,2,0,1,2,0,1,0,1,0,0,0,0,1,0,0,1,0,1,0,0,1,0,0,2,3,1,2,0,1,1,3,2,3,0,1,0,1,1,2,0,0,1,0,0,1,0,0,0,0,0,2,0,0,0,2,3,1,0,1,1,1,2,1,3,0,1,2,1,0,1,1,3,3,1,2,1,1,2,1,1,2,0,1,2,0,2,0,0,0,0,3,0,0,3,2,0,2,0,0,0,0,1,2,5,0,0,2,1,2,1,2,2,1,0,1,0,3,0,3,0,0,0,2,1,1,0,1,0,0,1,2,0,0,1,0,2,1,1,1,0,0,1,0,3,1,2,0,3,1,0,1,1,2,0,1,2,1,3,0,0,2,1,0,3,0,0,2,0,0,1,1,1,1,0,2,0,0,1,1,0,0,1,0,1,2,1,0,0,1,1,2,2,1,0,2,1,2,0,0,0,0,2,1,1,0,1,0,1,0,0,1,1,2,0,0,1,1,2,1,2,2,0,0,1,1,1,1,0,1,2,1,0,0,0,0,0,3,1,1,0,0,1,1,0,2,0,3,0,2,2,0,0,0,2,0,0,3,2,1,0,0,0,0,2,0,0,3,1,1,0,0,1,1,0,0,1,0,2,1,3,1,0,1,0,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,2,3,1,0,1,2,0,0,0,3,0,0,1,0,1,2,1,1,1,0,0,1,0,0,0,0,1,0,0,1,2,0,0,1,2,3,3,3,0,1,2,1,3,1,1,2,0,0,0,3,1,0,0,1,1,0,4,0,1,0,0,0,2,1,1,2,2,1,1,0,0,2,2,0,1,2,0,0,0,2,1,2,1,0,1,0,0,2,0,1,4,1,1,2,1,1,1,1,2,1,1,3,2,1,0,0,2,0,0,1,0,2,1,1,2,2,2,1,2,2,2,0,2,0,0,1,1,1,1,2,2,3,0,1,0,0,0,1,0,3,1,0,0,0,1,1,3,0,1,0,2,1,2,1,5,0,1,1,2,1,0,2,2,0,0,1,0,1,1,0,0,3,0,1,1,1,3,1,0,0,1,3,2,1,0,1,2,1,1,2,2,0,1,0,1,2,0,0,1,2,2,4,1,0,0,1,0,2,1,1,0,1,0,3,1,1,1,0,0,0,2,3,3,0,3,3,0,2,4,1,0,1,1,0,0,0,0,0,0,1,1,2,1,3,2,1,1,2,0,1,0,2,1,2,0,0,1,2,1,1,1,0,0,0,2,2,0,1,0,2,1,1,0,0,3,2,1,2,0,0,0,1,0,0,0,2,1,2,0,0,0,6,0,1,6,3,1,1,0,0,2,1,1,1,1,0,3,1,1,0,1,2,1,1,0,0,0,2,1,3,1,1,1,0,1,0,2,0,1,3,2,0,0,3,0,0,1,0,0,1,2,0,0,0,1,1,1,0,0,3,0,1,1,1,1,1,1,0,0,1,1,2,3,0,0,0,0,0,2,0,2,1,0,4,0,1,1,0,1,2,3,0,2,1,1,0,0,1,1,0,1,1,1,2,0,0,2,1,2,1,1,0,1,2,0,2,1,1,0,0,1,2,0,1,1,0,1,1,1,0,0,1,4,1,1,1]},{"counters":[1,0,3,1,0,4,1,2,0,0,2,0,1,1,1,1,1,0,1,1,2,2,1,2,1,2,1,2,1,0,0,1,2,0,1,1,0,2,2,1,0,0,1,0,3,2,3,0,0,2,1,2,0,2,1,3,1,0,1,1,0,0,2,3,1,1,1,1,2,0,2,1,4,2,1,1,0,0,3,0,0,1,2,3,2,1,0,1,1,0,0,0,1,1,0,2,1,2,0,2,1,1,2,0,0,0,2,0,1,0,1,0,1,0,0,0,1,0,1,2,1,1,0,2,1,1,0,5,0,0,1,1,1,1,0,1,0,1,1,1,1,2,1,2,2,0,0,1,1,1,0,1,0,1,0,1,0,1,1,0,4,0,0,1,3,1,1,2,4,1,1,1,2,1,1,1,0,1,1,0,0,1,2,3,1,0,1,2,1,3,2,1,0,1,0,1,1,0,0,2,0,1,1,0,0,0,0,0,0,1,1,2,0,1,0,0,0,0,0,2,0,2,0,1,1,1,1,1,1,0,1,0,0,1,1,0,3,0,3,2,2,0,1,1,0,1,1,1,2,1,0,2,5,1,3,2,1,1,0,1,3,1,0,1,0,2,2,2,0,0,0,0,2,1,0,1,3,0,1,0,1,2,1,1,0,2,0,1,0,0,1,0,0,2,1,1,0,2,1,1,1,0,0,0,3,0,2,1,0,1,1,2,0,1,0,1,1,0,0,0,0,0,1,2,0,1,1,1,4,1,0,0,0,0,0,0,1,0,1,2,1,1,2,0,1,1,2,0,0,3,0,3,1,1,1,1,2,1,5,2,0,0,0,1,0,1,1,2,2,0,2,2,2,1,0,0,0,1,0,2,0,3,0,2,1,0,0,0,1,2,3,2,0,0,1,2,0,1,0,0,0,0,0,1,2,2,0,1,1,0,1,0,2,1,1,1,2,1,1,3,6,2,0,2,0,1,0,1,2,1,0,1,1,1,1,2,0,1,0,1,2,3,1,1,1,0,0,0,0,1,1,0,1,0,1,1,0,0,0,2,1,0,0,1,2,1,1,0,0,1,2,0,1,0,0,0,0,0,0,0,1,2,1,1,2,1,0,1,1,1,0,2,0,3,0,5,0,1,3,1,2,1,2,0,0,2,0,0,0,0,1,0,4,1,1,0,0,1,0,2,0,3,1,0,1,0,0,1,0,0,1,3,0,0,2,1,1,3,0,1,1,1,0,0,1,1,2,0,1,1,0,1,0,2,1,0,0,0,1,2,0,0,0,1,2,2,0,0,1,0,0,0,1,0,3,0,0,0,0,1,1,0,0,0,2,1,0,2,1,1,0,0,2,0,1,0,1,3,0,1,0,1,3,0,2,1,2,6,0,1,1,1,0,1,1,1,1,0,1,0,2,1,1,1,0,1,0,1,0,0,2,5,2,0,2,2,0,0,0,0,1,4,0,0,1,0,1,0,1,0,2,1,1,1,2,1,0,1,0,0,0,0,2,3,1,3,0,1,0,1,1,4,1,0,0,1,1,1,0,1,1,0,1,0,0,1,1,0,2,0,4,0,1,1,1,2,1,2,0,0,2,1,1,1,2,2,0,1,1,0,1,2,2,4,4,1,1,0,0,1,3,2,1,3,2,1,0,0,0,0,2,1,2,1,1,2,1,0,0,1,0,1,1,0,0,1,1,1,2,0,1,0,4,2,1,1,0,2,1,0,1,3,0,1,0,0,2,3,0,0,0,1,1,0,2,1,0,1,0,1,0,2,0,0,1,1,0,2,0,2,0,2,1,2,1,2,0,1,1,0,2,1,1,1,2,1,0,0,2,1,3,1,1,3,0,1,2,0,1,1,2,1,0,0,1,1,0,1,0,0,1,0,5,1,2,0,0,0,0,0,0,1,0,0,1,1,1,1,1,2,2,1,3,1,0,0,1,0,1,0,3,0,1,0,1,2,0,1,1,2,1,1,1,2,0,2,0,0,0,2,1,1,1,1,1,2,2,1,0,2,1,0,1,1,2,0,1,3,0,0,2,0,0,1,0,1,2,0,0,2,1,2,1,2,2,0,0,0,1,0,1,1,1,1,2,2,2,2,1,2,0,0,0,0,0,0,1,1,1,0,0,1,0,1,2,0,0,2,3,1,0,6,2,0,1,2,1,0,1,1,1,2,1,2,1,0,0,1,0,0,1,3,0,1,1,0,1,0,1,1,1,1,0,2,4,0,0,0,1,0,1,0,1,2,1,2,3,0,2,3,2,0,1,2,0,0,3,2,0,2,1,0,1,2,0,0,0,0,1,2,2,1,0,2,3,2,0,0,3,1,2,1,0,0,0,1,0,0,0,1,4,0,1,0,0,2,3,3,0,0,0,2,0,3,0,1,0,3,2,1,2,1,1,0,0,0,3,1,1,1,0,1,3,1,1,0,0,0,2,1,2,5,1,2,0,0,2,3,1,0,0,1,1,3,4,0,1,1,0,1,0,3,0,0,0,1,1,2,0,1,1,0,1,0,1,2,1,2,0,0,1,0,0,1,4,1,0,1,1,2,0,1,0,2,0,0,0,0,0,2,1,2,0,4,1,1,0,1,6,1,0,0,1,2,3,3,1,2,0,0,0,1,7,2,2,1,1,0,0,0,0,0,3,1,0,0,0,0,2,0,1,0,0,2,0,0,0,2,0,2,1,0,0,0,0,2,3,2,4,1,2,0,0,3,0,2,2,1,3,0,2,0,0,1,1,2,0,1,1,0,0,1,1,0,2,4,1,0,1,1,0,2,0,0,0,1,3,3,1,1,1,1,2,1,1,2,2,1,0,0,0,1,0,3,2,1,2,0,0,0,3,1,0,1,1,1,0,0,0,1,0,0,2,1,0,2,2,0,3,1,1,1,0,0,0,0,0,1,0,2,1,1,0,1,1,0,2,1,2,2,0,0,0,0,0,2,2,4,1,0,0,1,1,1,2,1,1,0,3,0,2,0,0,2,1,0,0,2,3,0,0,1,0,2,1,2,1,0,0,1,0,1,2,0,1,2,1,2,1,1,1,1,0,1,2,2,4,1,3,2,2,0,1,1,0,0,0,0,0,1,1,0,0,1,1,0,1,2,2,0,1,0,2,1,0,0,2,0,0,1,0,0,1,0,1,0,2,3,0,0,1,1,2,0,1,0,2,0,2,0,2,1,2,1,1,1,2,2,2,1,2,0,2,2,5,3,0,0,1,0,0,1,1,2,1,2,2,1,0,1,1,1,2,2,3,1,1,3,1,1,0,0,1,2,1,2,1,2,0,1,2,1,0,0,0,3,0,1,0,0,1,1,1,1,0,2,2,0,1,2,1,0,0,1,2,1,0,0,0,1,0,0,3,0,2,1,2,2,1,0,0,2,2,0,2,0,0,1,1,2,0,3,0,1,3,1,0,1,1,0,1,0,0,0,1,2,3,1,1,0,1,1,1,0,1,1,4,2,2,0,1,3,1,0,1,0,2,0,0,0,2,0,1,0,2,1,1,0,0,0,1,0,1,2,1,0,0,0,1,0,0,0,0,1,0,2,1,2,2,1,1,0,1,2,0,0,1,0,2,1,1,2,1,0,1,0,0,1,0,0,3,0,1,0,1,3,3,2,2,2,2,2,3,0,0,1,0,3,0,0,1,3,1,1,0,1,1,0,2,0,2,0,2,2,0,2,0,0,0,1,0,1,0,1,3,1,1,0,1,0,1,1,1,0,0,1,0,2,1,1,1,0,1,0,0,1,1,1,0,1,1,0,1,3,1,4,1,4,1,3,2,1,0,4,1,2,2,4,1,0,1,1,1,0,0,1,1,1,0,3,0,1,1,1,1,1,1,2,0,5,0,1,2,0,1,0,1,0,2,0,1,2,2,1,0,2,0,1,0,1,1,0,1,1,2,2,0,0,1,1,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,2,1,0,0,0,0,0,3,0,1,0,1,1,2,1,1,1,0,1,2,1,1,0,0,1,2,2,1,0,0,1,0,3,3,1,0,0,0,1,1,2,1,0,0,2,1,1,1,0,0,0,0,1,0,1,0,0,2,2,0,0,2,0,1,0,1,0,0,2,0,1,0,1,1,1,0,1,2,0,1,1,0,1,5,1,1,1,1,5,0,1,0,0,0,1,1,1,2,2,2,1,1,1,1,0,3,2,1,1,1,1,2,3,1,0,1,1,1,1,1,1,0,0,1,0,1,0,2,0,4,0,1,1,1,0,1,1,1,2,0,0,1,0,1,1,1,1,1,2,1,1,0,0,2,1,0,0,0,0,0,1,1,3,3,0,0,0,0,2,4,1,1,1,3,1,2,2,2,0,0,0,0,0,2,1,2,1,0,2,0,0,1,0,0,0,4,1,0,0,1,0,1,0,0,0,1,1,0,0,2,1,0,1,3,0,1,0,3,1,2,2,0,0,0,4,1,1,1,3,1,0,1,0,1,2,0,0,2,0,1,1,2,1,0,0,3,0,0,1,1,2,1,0,0,2,0,2,2,2,0,1,1,0,0,3,0,1,1,1,1,0,1,1,1,1,1,5,2,0,1,1,2,2,2,1,1,1,1,1,0,0,1,1]}]},"null_count":0,"last_update_version":397952043669782528},"bm":{"histogram":{"ndv":3,"buckets":[{"count":1032,"lower_bound":"MA==","upper_bound":"MA==","repeats":1032},{"count":2000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":968}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1020,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952043961024512},"pt":{"histogram":{"ndv":2,"buckets":[{"count":1026,"lower_bound":"YW5kcm9pZA==","upper_bound":"YW5kcm9pZA==","repeats":1026},{"count":2000,"lower_bound":"aW9z","upper_bound":"aW9z","repeats":974}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,970,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1030,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952043575672832},"t":{"histogram":{"ndv":1999,"buckets":[{"count":8,"lower_bound":"MTQ3ODE4NTk5MQ==","upper_bound":"MTQ3ODE5MDc4Mg==","repeats":1},{"count":16,"lower_bound":"MTQ3ODE5MDg4MA==","upper_bound":"MTQ3ODE5NDgxMw==","repeats":1},{"count":24,"lower_bound":"MTQ3ODE5NzE2Mg==","upper_bound":"MTQ3ODIwNDk0NA==","repeats":1},{"count":32,"lower_bound":"MTQ3ODIwNTcyNQ==","upper_bound":"MTQ3ODIwOTA0OQ==","repeats":1},{"count":40,"lower_bound":"MTQ3ODIxMDE4Nw==","upper_bound":"MTQ3ODIxNTkxNw==","repeats":1},{"count":48,"lower_bound":"MTQ3ODIxNzU0OQ==","upper_bound":"MTQ3ODIyMTgxNQ==","repeats":1},{"count":56,"lower_bound":"MTQ3ODIyMjIwNg==","upper_bound":"MTQ3ODIyNDY3Ng==","repeats":1},{"count":64,"lower_bound":"MTQ3ODIyNjU5MA==","upper_bound":"MTQ3ODIyODk2OQ==","repeats":1},{"count":72,"lower_bound":"MTQ3ODIzMDEzOQ==","upper_bound":"MTQ3ODIzNTUwOA==","repeats":1},{"count":80,"lower_bound":"MTQ3ODIzNjMzMw==","upper_bound":"MTQ3ODI0NDg4MQ==","repeats":1},{"count":88,"lower_bound":"MTQ3ODI0ODMxMg==","upper_bound":"MTQ3ODI1NzI5Ng==","repeats":1},{"count":96,"lower_bound":"MTQ3ODI2MDgzNQ==","upper_bound":"MTQ3ODI2MzU0NQ==","repeats":1},{"count":104,"lower_bound":"MTQ3ODI2NjY4NA==","upper_bound":"MTQ3ODI4MDU5MQ==","repeats":1},{"count":112,"lower_bound":"MTQ3ODI4MDcwMg==","upper_bound":"MTQ3ODI4NjYxOQ==","repeats":1},{"count":120,"lower_bound":"MTQ3ODI5MDcxNQ==","upper_bound":"MTQ3ODI5NTc4Mw==","repeats":1},{"count":128,"lower_bound":"MTQ3ODI5Njc2MQ==","upper_bound":"MTQ3ODMwNDA4OQ==","repeats":1},{"count":136,"lower_bound":"MTQ3ODMwNDMxNg==","upper_bound":"MTQ3ODMxMTg4Mg==","repeats":1},{"count":144,"lower_bound":"MTQ3ODMxNDQyNA==","upper_bound":"MTQ3ODMxNzEwNA==","repeats":1},{"count":152,"lower_bound":"MTQ3ODMxODIyNQ==","upper_bound":"MTQ3ODMyMzU1Mg==","repeats":1},{"count":160,"lower_bound":"MTQ3ODMyMzgyNQ==","upper_bound":"MTQ3ODMyNzY2OA==","repeats":1},{"count":168,"lower_bound":"MTQ3ODMyODY1OA==","upper_bound":"MTQ3ODMzMTEzNg==","repeats":1},{"count":176,"lower_bound":"MTQ3ODMzMTY5NQ==","upper_bound":"MTQ3ODM0MDkyOA==","repeats":1},{"count":184,"lower_bound":"MTQ3ODM1MTc2MA==","upper_bound":"MTQ3ODM1ODAwNQ==","repeats":1},{"count":192,"lower_bound":"MTQ3ODM1ODg1MA==","upper_bound":"MTQ3ODM2NzM3OA==","repeats":1},{"count":200,"lower_bound":"MTQ3ODM2ODM3NA==","upper_bound":"MTQ3ODM3MDAxNQ==","repeats":1},{"count":208,"lower_bound":"MTQ3ODM3NDczNg==","upper_bound":"MTQ3ODM4MzIxMg==","repeats":1},{"count":216,"lower_bound":"MTQ3ODM4NDk4OQ==","upper_bound":"MTQ3ODM5MzI4NQ==","repeats":1},{"count":224,"lower_bound":"MTQ3ODM5NjE2Ng==","upper_bound":"MTQ3ODQwMzI4Mg==","repeats":1},{"count":232,"lower_bound":"MTQ3ODQwNDQ4Mg==","upper_bound":"MTQ3ODQwNzMwOQ==","repeats":1},{"count":240,"lower_bound":"MTQ3ODQwNzU4Ng==","upper_bound":"MTQ3ODQxNDYyNQ==","repeats":1},{"count":248,"lower_bound":"MTQ3ODQxNTAwNQ==","upper_bound":"MTQ3ODQyMTY3NA==","repeats":1},{"count":256,"lower_bound":"MTQ3ODQyMzMyMw==","upper_bound":"MTQ3ODQyNjAwMg==","repeats":1},{"count":264,"lower_bound":"MTQ3ODQyNjI5Ng==","upper_bound":"MTQ3ODQzODM2MQ==","repeats":1},{"count":272,"lower_bound":"MTQ3ODQ0MDI4OA==","upper_bound":"MTQ3ODQ0Mzg5Mg==","repeats":1},{"count":280,"lower_bound":"MTQ3ODQ0NDg4Mw==","upper_bound":"MTQ3ODQ1MDM4MA==","repeats":1},{"count":288,"lower_bound":"MTQ3ODQ1MDc5Nw==","upper_bound":"MTQ3ODQ1ODE5Nw==","repeats":1},{"count":296,"lower_bound":"MTQ3ODQ2Mjg5Nw==","upper_bound":"MTQ3ODQ2NzI0Nw==","repeats":1},{"count":304,"lower_bound":"MTQ3ODQ3MDQ1OA==","upper_bound":"MTQ3ODQ3MzA0MQ==","repeats":1},{"count":312,"lower_bound":"MTQ3ODQ3NTg4MQ==","upper_bound":"MTQ3ODQ4MTYyNg==","repeats":1},{"count":320,"lower_bound":"MTQ3ODQ4Mzg3NA==","upper_bound":"MTQ3ODQ5MTUxNQ==","repeats":1},{"count":328,"lower_bound":"MTQ3ODQ5MTU0OA==","upper_bound":"MTQ3ODQ5NjA1Nw==","repeats":1},{"count":336,"lower_bound":"MTQ3ODQ5NjYzMA==","upper_bound":"MTQ3ODUwNzQ1Ng==","repeats":1},{"count":344,"lower_bound":"MTQ3ODUwNzQ2NA==","upper_bound":"MTQ3ODUxMzY1Mg==","repeats":1},{"count":352,"lower_bound":"MTQ3ODUxNzU5MQ==","upper_bound":"MTQ3ODUzMDAwOA==","repeats":1},{"count":360,"lower_bound":"MTQ3ODUzMDgzMw==","upper_bound":"MTQ3ODUzMjExMQ==","repeats":1},{"count":368,"lower_bound":"MTQ3ODUzMzU5Ng==","upper_bound":"MTQ3ODU0MTc1NA==","repeats":1},{"count":376,"lower_bound":"MTQ3ODU0NzYzNg==","upper_bound":"MTQ3ODU1MzY5Nw==","repeats":1},{"count":384,"lower_bound":"MTQ3ODU1NDQ4OQ==","upper_bound":"MTQ3ODU1NjU2MA==","repeats":1},{"count":392,"lower_bound":"MTQ3ODU2MjQ3Mg==","upper_bound":"MTQ3ODU2NTYwNQ==","repeats":1},{"count":400,"lower_bound":"MTQ3ODU2NzAzMQ==","upper_bound":"MTQ3ODU3MjMwNw==","repeats":1},{"count":408,"lower_bound":"MTQ3ODU3MjcyMg==","upper_bound":"MTQ3ODU3NDYyMQ==","repeats":1},{"count":416,"lower_bound":"MTQ3ODU3ODczOA==","upper_bound":"MTQ3ODU4MTAxNA==","repeats":1},{"count":424,"lower_bound":"MTQ3ODU4MjQ4MA==","upper_bound":"MTQ3ODU5MDg4Nw==","repeats":1},{"count":432,"lower_bound":"MTQ3ODU5MTUyOQ==","upper_bound":"MTQ3ODU5MjQ5Mw==","repeats":1},{"count":440,"lower_bound":"MTQ3ODU5MzcyNA==","upper_bound":"MTQ3ODYwMDQ5Mg==","repeats":1},{"count":448,"lower_bound":"MTQ3ODYwMjcxNQ==","upper_bound":"MTQ3ODYwNDcyNQ==","repeats":1},{"count":456,"lower_bound":"MTQ3ODYwNTQ3NQ==","upper_bound":"MTQ3ODYxMjcxMQ==","repeats":1},{"count":464,"lower_bound":"MTQ3ODYxMzg1Mg==","upper_bound":"MTQ3ODYzMDAyNQ==","repeats":1},{"count":472,"lower_bound":"MTQ3ODYzMDU1OA==","upper_bound":"MTQ3ODYzOTc1Ng==","repeats":1},{"count":480,"lower_bound":"MTQ3ODYzOTg2NQ==","upper_bound":"MTQ3ODY0NDkzNQ==","repeats":1},{"count":488,"lower_bound":"MTQ3ODY1MDY0MA==","upper_bound":"MTQ3ODY1NDEwMQ==","repeats":1},{"count":496,"lower_bound":"MTQ3ODY1NTI4MQ==","upper_bound":"MTQ3ODY1OTQyNg==","repeats":1},{"count":504,"lower_bound":"MTQ3ODY2MDc4NQ==","upper_bound":"MTQ3ODY3ODI2Ng==","repeats":1},{"count":512,"lower_bound":"MTQ3ODY3OTI2OQ==","upper_bound":"MTQ3ODY4NTk0Mw==","repeats":1},{"count":520,"lower_bound":"MTQ3ODY4ODY1Mw==","upper_bound":"MTQ3ODY5NjA4MQ==","repeats":1},{"count":528,"lower_bound":"MTQ3ODcwMDA4NA==","upper_bound":"MTQ3ODcwNDc1OQ==","repeats":1},{"count":536,"lower_bound":"MTQ3ODcwNzA0Mw==","upper_bound":"MTQ3ODcyODQ3Mg==","repeats":1},{"count":544,"lower_bound":"MTQ3ODcyODU2Nw==","upper_bound":"MTQ3ODczNjcwOQ==","repeats":1},{"count":552,"lower_bound":"MTQ3ODczNjc1NA==","upper_bound":"MTQ3ODc0MDk1NA==","repeats":1},{"count":560,"lower_bound":"MTQ3ODc0Mzg1Mw==","upper_bound":"MTQ3ODc0OTgxOA==","repeats":1},{"count":568,"lower_bound":"MTQ3ODc0OTkxMQ==","upper_bound":"MTQ3ODc1NTgxMA==","repeats":1},{"count":576,"lower_bound":"MTQ3ODc1ODc1Nw==","upper_bound":"MTQ3ODc2MDAzNQ==","repeats":1},{"count":584,"lower_bound":"MTQ3ODc2MTY0Mg==","upper_bound":"MTQ3ODc2NDY1Ng==","repeats":1},{"count":592,"lower_bound":"MTQ3ODc2NjI2MQ==","upper_bound":"MTQ3ODc3NDUwMA==","repeats":1},{"count":600,"lower_bound":"MTQ3ODc3NTkzNQ==","upper_bound":"MTQ3ODc4MjUyMQ==","repeats":1},{"count":608,"lower_bound":"MTQ3ODc4NzI5NA==","upper_bound":"MTQ3ODc5Mjk3Mg==","repeats":1},{"count":616,"lower_bound":"MTQ3ODc5MzM4OA==","upper_bound":"MTQ3ODgwMjY1Ng==","repeats":1},{"count":624,"lower_bound":"MTQ3ODgwMzg2Mw==","upper_bound":"MTQ3ODgxMDY3Mw==","repeats":1},{"count":632,"lower_bound":"MTQ3ODgxMTYxOQ==","upper_bound":"MTQ3ODgxMzMyNQ==","repeats":1},{"count":640,"lower_bound":"MTQ3ODgxODE4MA==","upper_bound":"MTQ3ODgyNDM5MQ==","repeats":1},{"count":648,"lower_bound":"MTQ3ODgyNDQ2Nw==","upper_bound":"MTQ3ODgyNzkxOA==","repeats":1},{"count":656,"lower_bound":"MTQ3ODgyOTMzMw==","upper_bound":"MTQ3ODgzNjA4NA==","repeats":1},{"count":664,"lower_bound":"MTQ3ODgzNzM2Mw==","upper_bound":"MTQ3ODg0NDk2NA==","repeats":1},{"count":672,"lower_bound":"MTQ3ODg0NTYxMw==","upper_bound":"MTQ3ODg1Mjc3OQ==","repeats":1},{"count":680,"lower_bound":"MTQ3ODg1NzczNg==","upper_bound":"MTQ3ODg2MTg2Nw==","repeats":1},{"count":688,"lower_bound":"MTQ3ODg2MjE5Nw==","upper_bound":"MTQ3ODg2ODM0NA==","repeats":1},{"count":696,"lower_bound":"MTQ3ODg3MDg0MQ==","upper_bound":"MTQ3ODg3NDY1NA==","repeats":1},{"count":704,"lower_bound":"MTQ3ODg3Njc1MQ==","upper_bound":"MTQ3ODg4MjYwMw==","repeats":1},{"count":712,"lower_bound":"MTQ3ODg4Mjc4OQ==","upper_bound":"MTQ3ODg4NzQ2OA==","repeats":1},{"count":720,"lower_bound":"MTQ3ODg4OTY4MQ==","upper_bound":"MTQ3ODg5NTk5MQ==","repeats":1},{"count":728,"lower_bound":"MTQ3ODg5ODcwNQ==","upper_bound":"MTQ3ODkxMzA1Ng==","repeats":1},{"count":736,"lower_bound":"MTQ3ODkxNjkzOQ==","upper_bound":"MTQ3ODkyOTc0Nw==","repeats":1},{"count":744,"lower_bound":"MTQ3ODkzMzcwNA==","upper_bound":"MTQ3ODk0MTg3OQ==","repeats":1},{"count":752,"lower_bound":"MTQ3ODk0MjkyOA==","upper_bound":"MTQ3ODk0NTMxNQ==","repeats":1},{"count":760,"lower_bound":"MTQ3ODk0NjcwMw==","upper_bound":"MTQ3ODk1MjkwMQ==","repeats":1},{"count":768,"lower_bound":"MTQ3ODk1MzQ1MQ==","upper_bound":"MTQ3ODk1NjY2Mw==","repeats":1},{"count":776,"lower_bound":"MTQ3ODk1Njk4OQ==","upper_bound":"MTQ3ODk2MzU2Mg==","repeats":1},{"count":784,"lower_bound":"MTQ3ODk2NDU4NA==","upper_bound":"MTQ3ODk2ODIxMA==","repeats":1},{"count":792,"lower_bound":"MTQ3ODk2OTUzOA==","upper_bound":"MTQ3ODk3NjIyNQ==","repeats":1},{"count":800,"lower_bound":"MTQ3ODk4MjQ3Nw==","upper_bound":"MTQ3ODk5MDU2NA==","repeats":1},{"count":808,"lower_bound":"MTQ3ODk5MDk0MQ==","upper_bound":"MTQ3ODk5NjU2OA==","repeats":1},{"count":816,"lower_bound":"MTQ3OTAwMTQwNQ==","upper_bound":"MTQ3OTAwODMwNg==","repeats":1},{"count":824,"lower_bound":"MTQ3OTAwODY0Nw==","upper_bound":"MTQ3OTAyMDUwNA==","repeats":1},{"count":832,"lower_bound":"MTQ3OTAyMzg3Ng==","upper_bound":"MTQ3OTAyNjQ1Nw==","repeats":1},{"count":840,"lower_bound":"MTQ3OTAyNzE0NQ==","upper_bound":"MTQ3OTA0ODcyMA==","repeats":1},{"count":848,"lower_bound":"MTQ3OTA0ODg3NQ==","upper_bound":"MTQ3OTA1MjcxNA==","repeats":1},{"count":856,"lower_bound":"MTQ3OTA1NzM4Ng==","upper_bound":"MTQ3OTA2MDU3NQ==","repeats":1},{"count":864,"lower_bound":"MTQ3OTA2MzAxMg==","upper_bound":"MTQ3OTA3MzA0Mg==","repeats":1},{"count":872,"lower_bound":"MTQ3OTA3NDgyNg==","upper_bound":"MTQ3OTA3OTcwMw==","repeats":1},{"count":880,"lower_bound":"MTQ3OTA3OTc3OQ==","upper_bound":"MTQ3OTA4OTMwOA==","repeats":1},{"count":888,"lower_bound":"MTQ3OTA5MzcwNg==","upper_bound":"MTQ3OTEwNjQzMw==","repeats":1},{"count":896,"lower_bound":"MTQ3OTEwOTE1OQ==","upper_bound":"MTQ3OTExMTYyNQ==","repeats":1},{"count":904,"lower_bound":"MTQ3OTExMjc2Nw==","upper_bound":"MTQ3OTExNTM5OA==","repeats":1},{"count":912,"lower_bound":"MTQ3OTExNTU2MQ==","upper_bound":"MTQ3OTEyMDcyMw==","repeats":1},{"count":920,"lower_bound":"MTQ3OTEyMDk5Nw==","upper_bound":"MTQ3OTEyNjc0Mw==","repeats":1},{"count":928,"lower_bound":"MTQ3OTEyODAxNQ==","upper_bound":"MTQ3OTEzNjM5Nw==","repeats":1},{"count":936,"lower_bound":"MTQ3OTEzNzcxMg==","upper_bound":"MTQ3OTE0NjcwMQ==","repeats":1},{"count":944,"lower_bound":"MTQ3OTE0NzM1MQ==","upper_bound":"MTQ3OTE1MTY1Mg==","repeats":1},{"count":952,"lower_bound":"MTQ3OTE1ODk1Mw==","upper_bound":"MTQ3OTE2MDI5NA==","repeats":1},{"count":960,"lower_bound":"MTQ3OTE2MTQxNQ==","upper_bound":"MTQ3OTE3MDY5OA==","repeats":1},{"count":968,"lower_bound":"MTQ3OTE3MTY1MQ==","upper_bound":"MTQ3OTE3NDk2Mw==","repeats":1},{"count":976,"lower_bound":"MTQ3OTE3OTE5Nw==","upper_bound":"MTQ3OTE5MjE4OA==","repeats":1},{"count":984,"lower_bound":"MTQ3OTE5MzU4Nw==","upper_bound":"MTQ3OTE5OTIzMg==","repeats":1},{"count":992,"lower_bound":"MTQ3OTIwMDQxNg==","upper_bound":"MTQ3OTIwMzE3Ng==","repeats":1},{"count":1000,"lower_bound":"MTQ3OTIwNTE2Ng==","upper_bound":"MTQ3OTIyMTkwMA==","repeats":1},{"count":1008,"lower_bound":"MTQ3OTIyODE4Mg==","upper_bound":"MTQ3OTIzMjcyMQ==","repeats":1},{"count":1016,"lower_bound":"MTQ3OTIzNDQzOQ==","upper_bound":"MTQ3OTI0NDExOA==","repeats":1},{"count":1024,"lower_bound":"MTQ3OTI0NDU5OQ==","upper_bound":"MTQ3OTI1NTI5NQ==","repeats":1},{"count":1032,"lower_bound":"MTQ3OTI1NjMyNQ==","upper_bound":"MTQ3OTI1OTQ0Mw==","repeats":1},{"count":1040,"lower_bound":"MTQ3OTI2MzczOQ==","upper_bound":"MTQ3OTI2OTEwNQ==","repeats":1},{"count":1048,"lower_bound":"MTQ3OTI3MTg4Ng==","upper_bound":"MTQ3OTI3NTE5MQ==","repeats":1},{"count":1056,"lower_bound":"MTQ3OTI3NTM0Ng==","upper_bound":"MTQ3OTI3OTA5Mg==","repeats":1},{"count":1064,"lower_bound":"MTQ3OTI3OTYxNw==","upper_bound":"MTQ3OTI4NjE4OQ==","repeats":1},{"count":1072,"lower_bound":"MTQ3OTI5MTI4Mg==","upper_bound":"MTQ3OTI5NzQ1NA==","repeats":1},{"count":1080,"lower_bound":"MTQ3OTMwMzEyNA==","upper_bound":"MTQ3OTMwOTQ2OA==","repeats":1},{"count":1088,"lower_bound":"MTQ3OTMxOTE2MA==","upper_bound":"MTQ3OTMyNzI3NQ==","repeats":1},{"count":1096,"lower_bound":"MTQ3OTMzNTEyMA==","upper_bound":"MTQ3OTM0MjY4Ng==","repeats":1},{"count":1104,"lower_bound":"MTQ3OTM0MzMzNA==","upper_bound":"MTQ3OTM0NjUxNg==","repeats":1},{"count":1112,"lower_bound":"MTQ3OTM0Njk1Mg==","upper_bound":"MTQ3OTM1NjAwNA==","repeats":1},{"count":1120,"lower_bound":"MTQ3OTM1ODcxMQ==","upper_bound":"MTQ3OTM2NjA1Mw==","repeats":1},{"count":1128,"lower_bound":"MTQ3OTM3MTA1Ng==","upper_bound":"MTQ3OTM3NzU5MQ==","repeats":1},{"count":1136,"lower_bound":"MTQ3OTM3OTY0Mg==","upper_bound":"MTQ3OTM4OTQzNg==","repeats":1},{"count":1144,"lower_bound":"MTQ3OTM5NDIzNw==","upper_bound":"MTQ3OTM5NzQxNg==","repeats":1},{"count":1152,"lower_bound":"MTQ3OTM5OTg0MA==","upper_bound":"MTQ3OTQwNzAwOA==","repeats":1},{"count":1160,"lower_bound":"MTQ3OTQwOTExNw==","upper_bound":"MTQ3OTQxNDAyNw==","repeats":1},{"count":1168,"lower_bound":"MTQ3OTQxNzE4MA==","upper_bound":"MTQ3OTQyNjg4OA==","repeats":1},{"count":1176,"lower_bound":"MTQ3OTQyNzE2NA==","upper_bound":"MTQ3OTQzMzYwOQ==","repeats":1},{"count":1184,"lower_bound":"MTQ3OTQzNzY0NQ==","upper_bound":"MTQ3OTQ0NDg4Ng==","repeats":1},{"count":1192,"lower_bound":"MTQ3OTQ0NTc2OA==","upper_bound":"MTQ3OTQ1NDg4OA==","repeats":1},{"count":1200,"lower_bound":"MTQ3OTQ1ODIxMQ==","upper_bound":"MTQ3OTQ2Mzk0Ng==","repeats":1},{"count":1208,"lower_bound":"MTQ3OTQ2NzEwNQ==","upper_bound":"MTQ3OTQ3NDUyNA==","repeats":1},{"count":1216,"lower_bound":"MTQ3OTQ3NTE2MQ==","upper_bound":"MTQ3OTQ3NjQ4NQ==","repeats":1},{"count":1224,"lower_bound":"MTQ3OTQ3OTA5Mg==","upper_bound":"MTQ3OTQ4MjUwMQ==","repeats":1},{"count":1232,"lower_bound":"MTQ3OTQ4MzY4Nw==","upper_bound":"MTQ3OTQ4OTIwNw==","repeats":1},{"count":1240,"lower_bound":"MTQ3OTQ5MTIwMQ==","upper_bound":"MTQ3OTQ5NzA5NQ==","repeats":1},{"count":1248,"lower_bound":"MTQ3OTQ5NzI5MA==","upper_bound":"MTQ3OTUwNDEzNQ==","repeats":1},{"count":1256,"lower_bound":"MTQ3OTUwOTYwNg==","upper_bound":"MTQ3OTUxMDQyNg==","repeats":1},{"count":1264,"lower_bound":"MTQ3OTUxMzE3Ng==","upper_bound":"MTQ3OTUyMzc5OQ==","repeats":1},{"count":1272,"lower_bound":"MTQ3OTUyNDE3NA==","upper_bound":"MTQ3OTUzNzgxMg==","repeats":1},{"count":1280,"lower_bound":"MTQ3OTUzODEyNA==","upper_bound":"MTQ3OTU0NzExMg==","repeats":1},{"count":1288,"lower_bound":"MTQ3OTU1MTA1MQ==","upper_bound":"MTQ3OTU1NDM5Ng==","repeats":1},{"count":1296,"lower_bound":"MTQ3OTU1NzQyMQ==","upper_bound":"MTQ3OTU2MjA3OA==","repeats":1},{"count":1304,"lower_bound":"MTQ3OTU2MzA2MQ==","upper_bound":"MTQ3OTU3MTM2OA==","repeats":1},{"count":1312,"lower_bound":"MTQ3OTU3MjI4MQ==","upper_bound":"MTQ3OTU3NTkzMw==","repeats":1},{"count":1320,"lower_bound":"MTQ3OTU3NzQ0Nw==","upper_bound":"MTQ3OTU5MDU0OA==","repeats":1},{"count":1328,"lower_bound":"MTQ3OTU5MjA5NA==","upper_bound":"MTQ3OTU5NzkwOA==","repeats":1},{"count":1336,"lower_bound":"MTQ3OTYwMjI0MA==","upper_bound":"MTQ3OTYwODY4Mw==","repeats":1},{"count":1344,"lower_bound":"MTQ3OTYxMTAyNw==","upper_bound":"MTQ3OTYxMjQwMQ==","repeats":1},{"count":1352,"lower_bound":"MTQ3OTYxMjY0MQ==","upper_bound":"MTQ3OTYzMTIzMg==","repeats":1},{"count":1360,"lower_bound":"MTQ3OTYzMjU0NA==","upper_bound":"MTQ3OTY0ODIzMQ==","repeats":1},{"count":1368,"lower_bound":"MTQ3OTY1MDQzNA==","upper_bound":"MTQ3OTY1MzU5NA==","repeats":1},{"count":1376,"lower_bound":"MTQ3OTY1NzkwMg==","upper_bound":"MTQ3OTY2MjY1Mw==","repeats":1},{"count":1384,"lower_bound":"MTQ3OTY2MzQ2NA==","upper_bound":"MTQ3OTY2ODMyNA==","repeats":1},{"count":1392,"lower_bound":"MTQ3OTY2ODM3NA==","upper_bound":"MTQ3OTY3MjcyMw==","repeats":1},{"count":1400,"lower_bound":"MTQ3OTY3NDI5Mw==","upper_bound":"MTQ3OTY3OTY5NA==","repeats":1},{"count":1408,"lower_bound":"MTQ3OTY4MzM3Mw==","upper_bound":"MTQ3OTY4OTM3Nw==","repeats":1},{"count":1416,"lower_bound":"MTQ3OTY5MDc0OA==","upper_bound":"MTQ3OTY5NjE0MA==","repeats":1},{"count":1424,"lower_bound":"MTQ3OTY5NzMxNg==","upper_bound":"MTQ3OTcwMTQwNA==","repeats":1},{"count":1432,"lower_bound":"MTQ3OTcwMjUyMg==","upper_bound":"MTQ3OTcwNzc0MQ==","repeats":1},{"count":1440,"lower_bound":"MTQ3OTcwODk5MA==","upper_bound":"MTQ3OTcwOTk5NQ==","repeats":1},{"count":1448,"lower_bound":"MTQ3OTcxMjYyMg==","upper_bound":"MTQ3OTcxNzA1OQ==","repeats":1},{"count":1456,"lower_bound":"MTQ3OTcxNzEzMQ==","upper_bound":"MTQ3OTcyNjYyMg==","repeats":1},{"count":1464,"lower_bound":"MTQ3OTcyNzMzOQ==","upper_bound":"MTQ3OTczMTEyMA==","repeats":1},{"count":1472,"lower_bound":"MTQ3OTczNTUyNQ==","upper_bound":"MTQ3OTczOTczMw==","repeats":1},{"count":1480,"lower_bound":"MTQ3OTc0MDIxMg==","upper_bound":"MTQ3OTc0ODU2NA==","repeats":1},{"count":1488,"lower_bound":"MTQ3OTc1MDcwOQ==","upper_bound":"MTQ3OTc2MDMyOA==","repeats":1},{"count":1496,"lower_bound":"MTQ3OTc2MTE2Mw==","upper_bound":"MTQ3OTc2NDk0MA==","repeats":1},{"count":1504,"lower_bound":"MTQ3OTc2NTIxNw==","upper_bound":"MTQ3OTc3MDg2MA==","repeats":1},{"count":1512,"lower_bound":"MTQ3OTc3MjE3MQ==","upper_bound":"MTQ3OTc3OTM4Ng==","repeats":1},{"count":1520,"lower_bound":"MTQ3OTc3OTQ1Mg==","upper_bound":"MTQ3OTc4MzM1MA==","repeats":1},{"count":1528,"lower_bound":"MTQ3OTc4NDgzMg==","upper_bound":"MTQ3OTc5NjUwMw==","repeats":1},{"count":1536,"lower_bound":"MTQ3OTgwNDg4NQ==","upper_bound":"MTQ3OTgxNTE5Mw==","repeats":1},{"count":1544,"lower_bound":"MTQ3OTgxNjMxOQ==","upper_bound":"MTQ3OTgyMjU0Mg==","repeats":1},{"count":1552,"lower_bound":"MTQ3OTgyNTA1OQ==","upper_bound":"MTQ3OTgyOTM2NA==","repeats":1},{"count":1560,"lower_bound":"MTQ3OTgzMzQ0Mg==","upper_bound":"MTQ3OTg0Mjc0Mg==","repeats":1},{"count":1568,"lower_bound":"MTQ3OTg0NTI1MQ==","upper_bound":"MTQ3OTg0Nzc0NQ==","repeats":1},{"count":1576,"lower_bound":"MTQ3OTg0ODgyNA==","upper_bound":"MTQ3OTg1NjgwMw==","repeats":1},{"count":1584,"lower_bound":"MTQ3OTg1OTQyMw==","upper_bound":"MTQ3OTg2MzUyNA==","repeats":1},{"count":1592,"lower_bound":"MTQ3OTg2NDk1MA==","upper_bound":"MTQ3OTg2NzMwMg==","repeats":1},{"count":1600,"lower_bound":"MTQ3OTg2NzMwOQ==","upper_bound":"MTQ3OTg3MzQ2OA==","repeats":1},{"count":1608,"lower_bound":"MTQ3OTg3NzA5Mw==","upper_bound":"MTQ3OTg4MjU5Mw==","repeats":1},{"count":1616,"lower_bound":"MTQ3OTg4Mjc5MA==","upper_bound":"MTQ3OTg4NTYyNg==","repeats":1},{"count":1624,"lower_bound":"MTQ3OTg4NTkwMQ==","upper_bound":"MTQ3OTg4ODg1Mw==","repeats":1},{"count":1632,"lower_bound":"MTQ3OTg4ODg2NA==","upper_bound":"MTQ3OTg5NTEzMQ==","repeats":1},{"count":1640,"lower_bound":"MTQ3OTg5NTMzMw==","upper_bound":"MTQ3OTg5NzU4OA==","repeats":1},{"count":1648,"lower_bound":"MTQ3OTkwMDA0Mg==","upper_bound":"MTQ3OTkwOTgzMQ==","repeats":1},{"count":1656,"lower_bound":"MTQ3OTkxMDIxNA==","upper_bound":"MTQ3OTkxMzE5Mw==","repeats":1},{"count":1664,"lower_bound":"MTQ3OTkxNjM4NA==","upper_bound":"MTQ3OTkyMTk4OA==","repeats":1},{"count":1672,"lower_bound":"MTQ3OTkyNDYzNA==","upper_bound":"MTQ3OTkyODQ5Ng==","repeats":1},{"count":1680,"lower_bound":"MTQ3OTkzMjA5OQ==","upper_bound":"MTQ3OTk0MjcyNg==","repeats":1},{"count":1688,"lower_bound":"MTQ3OTk0NDU1NQ==","upper_bound":"MTQ3OTk0ODA2Mw==","repeats":1},{"count":1696,"lower_bound":"MTQ3OTk0ODgxMg==","upper_bound":"MTQ3OTk1NTM0NA==","repeats":1},{"count":1704,"lower_bound":"MTQ3OTk1NjgwNQ==","upper_bound":"MTQ3OTk2MTI4MA==","repeats":1},{"count":1712,"lower_bound":"MTQ3OTk2Nzg0MQ==","upper_bound":"MTQ3OTk3NzA5NA==","repeats":1},{"count":1720,"lower_bound":"MTQ3OTk3ODc4Nw==","upper_bound":"MTQ3OTk4Mzg5NQ==","repeats":1},{"count":1728,"lower_bound":"MTQ3OTk4NTM5OA==","upper_bound":"MTQ3OTk4ODQyNQ==","repeats":1},{"count":1736,"lower_bound":"MTQ3OTk4OTMzOQ==","upper_bound":"MTQ3OTk5MzY4MA==","repeats":1},{"count":1744,"lower_bound":"MTQ3OTk5NDQ2OQ==","upper_bound":"MTQ3OTk5OTA3Mg==","repeats":1},{"count":1752,"lower_bound":"MTQ4MDAwMzQzMw==","upper_bound":"MTQ4MDAxMTY5Mg==","repeats":1},{"count":1760,"lower_bound":"MTQ4MDAxMzk4NA==","upper_bound":"MTQ4MDAyMjYzMA==","repeats":1},{"count":1768,"lower_bound":"MTQ4MDAyMjg0Ng==","upper_bound":"MTQ4MDA0NjkwMw==","repeats":1},{"count":1776,"lower_bound":"MTQ4MDA0NzU3OQ==","upper_bound":"MTQ4MDA1MzE1Ng==","repeats":1},{"count":1784,"lower_bound":"MTQ4MDA1NDM5OQ==","upper_bound":"MTQ4MDA2MTE4OQ==","repeats":1},{"count":1792,"lower_bound":"MTQ4MDA2MTY4NA==","upper_bound":"MTQ4MDA2OTA5MQ==","repeats":1},{"count":1800,"lower_bound":"MTQ4MDA3MDA4NA==","upper_bound":"MTQ4MDA3NTI5MA==","repeats":1},{"count":1808,"lower_bound":"MTQ4MDA3Nzk2OA==","upper_bound":"MTQ4MDA4MzcyNw==","repeats":1},{"count":1816,"lower_bound":"MTQ4MDA4NTIyMg==","upper_bound":"MTQ4MDA4Njc5MQ==","repeats":1},{"count":1824,"lower_bound":"MTQ4MDA4NzE2MA==","upper_bound":"MTQ4MDA5NzAxNQ==","repeats":1},{"count":1832,"lower_bound":"MTQ4MDA5Nzk0OA==","upper_bound":"MTQ4MDEwMzMxNA==","repeats":1},{"count":1840,"lower_bound":"MTQ4MDEwNTgzNQ==","upper_bound":"MTQ4MDExMTU1MQ==","repeats":1},{"count":1848,"lower_bound":"MTQ4MDExMTc5Mg==","upper_bound":"MTQ4MDExMzY1Ng==","repeats":1},{"count":1856,"lower_bound":"MTQ4MDEyMjMyMg==","upper_bound":"MTQ4MDEyNTQyOQ==","repeats":1},{"count":1864,"lower_bound":"MTQ4MDEzMzYwMQ==","upper_bound":"MTQ4MDEzNjE4MQ==","repeats":1},{"count":1872,"lower_bound":"MTQ4MDEzOTMxNg==","upper_bound":"MTQ4MDE0Mjg3MQ==","repeats":1},{"count":1880,"lower_bound":"MTQ4MDE0NTc3Nw==","upper_bound":"MTQ4MDE0OTkzMw==","repeats":1},{"count":1888,"lower_bound":"MTQ4MDE1MDEwMA==","upper_bound":"MTQ4MDE1NDAwMw==","repeats":1},{"count":1896,"lower_bound":"MTQ4MDE1ODYwOQ==","upper_bound":"MTQ4MDE2NzUyOA==","repeats":1},{"count":1904,"lower_bound":"MTQ4MDE2OTM4OA==","upper_bound":"MTQ4MDE4MjExNg==","repeats":1},{"count":1912,"lower_bound":"MTQ4MDE4MzQxMw==","upper_bound":"MTQ4MDE5NjIzMA==","repeats":1},{"count":1920,"lower_bound":"MTQ4MDE5Nzk4MA==","upper_bound":"MTQ4MDE5OTkyMA==","repeats":1},{"count":1928,"lower_bound":"MTQ4MDIwMDI0OQ==","upper_bound":"MTQ4MDIwMzI2Mg==","repeats":1},{"count":1936,"lower_bound":"MTQ4MDIwODAxNQ==","upper_bound":"MTQ4MDIxMDE1MA==","repeats":1},{"count":1944,"lower_bound":"MTQ4MDIxMDM1OQ==","upper_bound":"MTQ4MDIxNjY5Ng==","repeats":1},{"count":1952,"lower_bound":"MTQ4MDIxNzUzNQ==","upper_bound":"MTQ4MDIzMjIyOQ==","repeats":1},{"count":1960,"lower_bound":"MTQ4MDIzMjc2OA==","upper_bound":"MTQ4MDIzODUyMQ==","repeats":1},{"count":1968,"lower_bound":"MTQ4MDI0MTA0NA==","upper_bound":"MTQ4MDI0Mjc0NQ==","repeats":1},{"count":1976,"lower_bound":"MTQ4MDI0MzY2Nw==","upper_bound":"MTQ4MDI1MTkyNg==","repeats":1},{"count":1984,"lower_bound":"MTQ4MDI1MjMyMQ==","upper_bound":"MTQ4MDI2NDA5OA==","repeats":1},{"count":1992,"lower_bound":"MTQ4MDI2NTQ3Mw==","upper_bound":"MTQ4MDI2OTQzMg==","repeats":1},{"count":2000,"lower_bound":"MTQ4MDI3MTEyOQ==","upper_bound":"MTQ4MDI3NDA3NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,2,1,2,0,0,0,3,2,0,0,0,0,0,0,1,2,3,1,2,2,0,0,0,0,0,0,1,1,0,1,0,1,0,1,3,0,1,0,2,0,3,1,0,0,2,1,1,2,2,0,1,0,0,1,2,1,0,2,3,0,1,1,0,0,0,1,0,1,0,1,2,0,0,2,1,0,4,1,1,2,0,1,0,1,1,0,0,3,0,2,1,0,1,2,1,0,1,3,2,2,0,3,0,1,2,1,0,0,1,0,1,0,0,1,0,2,0,1,1,1,2,2,0,0,0,3,2,1,2,4,1,1,1,0,0,1,2,3,1,1,0,1,2,0,2,3,0,2,1,0,0,0,0,0,0,0,2,3,0,0,0,1,2,0,1,1,1,1,0,0,1,0,3,0,1,0,2,1,0,2,3,0,2,2,1,0,0,1,0,1,1,2,0,2,0,1,1,2,1,1,0,1,1,0,0,0,0,0,0,0,2,0,1,0,0,1,1,2,3,2,0,1,0,0,3,1,1,0,3,1,0,1,0,2,0,0,0,2,0,0,0,0,1,0,1,1,1,3,2,2,1,0,0,3,0,1,2,2,1,3,1,2,0,0,1,1,1,1,2,2,2,1,1,1,2,1,2,0,0,1,2,1,1,1,0,0,1,0,1,2,0,1,0,0,0,1,2,1,0,0,1,0,0,1,1,0,0,0,1,1,0,2,1,2,1,0,1,3,0,3,1,1,1,1,3,1,2,1,1,0,3,0,0,3,2,1,1,0,2,3,2,1,0,0,0,0,2,1,1,3,0,0,2,1,2,3,2,1,0,1,1,1,1,1,1,1,0,0,1,1,0,2,1,0,2,1,1,4,1,2,1,2,0,1,3,1,2,1,1,1,1,1,1,1,1,1,0,1,0,2,0,1,0,2,1,0,1,0,0,0,0,1,1,0,2,1,3,1,0,0,2,1,2,3,1,0,3,1,1,2,1,2,0,0,0,1,3,1,1,1,3,1,2,1,1,0,0,4,0,2,0,2,1,0,2,2,1,0,1,0,0,1,0,1,0,0,1,0,1,0,0,0,1,1,2,0,1,2,2,2,1,1,1,0,2,1,1,0,1,1,1,0,2,0,1,0,1,0,0,0,0,0,1,4,1,0,0,2,1,2,2,0,0,1,1,0,0,0,1,0,0,1,1,2,1,3,1,0,0,0,0,0,1,1,1,1,2,2,0,1,0,1,0,2,1,1,0,2,0,1,1,4,0,0,1,0,1,0,1,0,1,2,0,0,0,0,0,0,1,0,0,1,0,0,2,1,1,3,0,2,1,0,1,0,1,0,0,0,1,3,1,1,3,0,0,0,2,1,0,1,3,1,0,2,1,0,1,1,0,2,1,1,2,2,1,0,0,0,1,1,1,0,1,1,4,0,2,1,2,1,2,2,2,0,0,2,0,0,1,1,1,2,1,1,2,0,4,0,0,1,0,2,0,1,0,0,2,1,0,1,0,0,0,0,3,0,2,1,0,1,2,1,2,0,1,2,0,0,0,0,0,2,1,2,1,0,1,1,1,2,0,1,1,2,0,3,0,2,1,0,1,0,0,1,0,1,0,1,0,3,4,0,1,1,2,0,1,1,1,3,0,2,1,0,1,1,1,0,0,2,0,2,0,0,1,1,1,2,0,2,2,0,3,0,0,1,0,0,1,1,1,1,1,1,0,1,0,0,1,1,1,0,1,1,4,1,0,0,0,0,2,0,0,1,3,1,0,2,1,1,3,4,0,0,0,1,1,2,3,0,3,0,0,0,1,1,0,2,1,1,0,0,1,0,0,0,0,2,0,0,2,0,1,2,1,0,3,0,0,0,1,0,1,1,1,1,5,0,3,1,2,0,1,1,1,0,2,4,1,1,3,1,0,0,3,4,2,1,1,1,0,3,1,0,1,0,1,1,1,0,1,1,0,4,1,4,0,1,1,2,2,1,0,0,0,3,1,1,3,0,1,3,0,0,1,1,0,2,3,0,0,0,0,2,0,0,2,0,0,3,0,1,1,2,0,0,1,1,2,1,2,1,0,0,0,1,1,0,1,2,0,2,1,1,0,0,2,0,0,2,0,1,0,1,0,4,0,1,0,4,0,2,1,0,0,3,0,3,1,1,1,2,1,2,4,0,4,0,0,0,2,0,1,0,1,2,0,1,1,1,0,1,0,0,2,1,1,0,0,3,0,0,0,1,2,1,0,0,0,1,0,0,2,0,1,3,1,0,1,2,1,1,2,1,0,1,0,1,0,0,2,2,1,1,1,1,0,1,0,1,0,0,0,1,0,0,0,2,1,0,1,1,1,2,0,2,0,1,1,0,0,1,1,1,0,1,2,0,0,2,1,2,0,3,1,1,1,0,0,1,1,2,0,1,1,0,1,2,1,1,1,0,2,1,0,1,0,1,1,1,1,0,1,1,0,1,1,1,0,1,1,0,0,3,0,2,1,1,3,1,1,2,1,2,1,1,1,1,0,0,0,0,1,1,0,3,1,0,1,2,5,0,0,5,2,0,1,3,0,2,2,1,2,0,0,0,1,0,1,0,0,1,1,0,0,0,1,1,1,0,0,1,1,1,1,2,2,1,2,0,2,1,3,2,2,0,0,3,5,1,2,0,2,2,0,1,0,1,2,1,1,1,2,3,1,1,2,1,2,3,3,2,1,0,1,0,3,1,0,4,0,2,0,1,2,2,0,0,0,1,2,2,0,0,2,1,0,2,2,5,2,0,0,0,0,0,3,1,1,0,1,1,1,1,1,4,0,0,2,0,0,1,4,1,2,0,2,0,1,0,1,0,1,0,1,1,0,1,2,0,2,1,0,0,2,4,1,1,3,1,2,1,1,0,1,1,1,0,1,0,1,0,0,5,1,0,2,0,0,0,1,0,0,2,1,0,1,1,0,1,0,1,2,1,2,2,0,1,0,2,2,2,3,1,2,1,2,0,6,0,2,0,0,0,0,0,1,1,3,1,0,0,2,2,0,1,1,0,1,1,0,1,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,1,2,0,1,5,1,2,1,0,0,0,1,0,1,3,2,0,1,2,0,1,2,1,0,1,0,3,0,0,2,2,1,6,0,0,1,2,1,0,1,2,2,0,2,1,2,0,2,1,0,0,1,0,1,0,1,0,2,3,1,1,1,1,2,2,3,2,2,2,1,1,0,0,1,2,1,0,0,1,1,1,2,0,1,0,0,0,0,0,4,0,0,1,0,1,4,3,1,0,1,1,3,0,1,2,2,2,3,3,2,3,0,0,0,0,0,0,1,2,2,0,0,0,0,0,1,0,0,1,0,1,1,1,0,0,1,1,1,2,0,1,0,1,0,1,2,1,1,0,2,0,2,0,2,0,1,0,3,1,1,2,1,1,1,1,1,0,1,1,1,0,2,0,0,0,0,3,2,2,0,0,0,1,0,1,0,1,1,0,2,1,1,0,1,2,0,0,0,1,1,0,0,1,1,0,0,1,1,1,2,2,1,2,1,1,0,2,0,1,1,1,0,1,1,2,1,1,3,1,2,1,2,1,0,1,0,0,1,0,1,2,2,0,0,0,0,0,2,0,0,1,1,1,1,5,1,2,4,1,1,0,3,2,0,1,0,0,0,1,1,1,1,0,0,2,2,1,2,2,0,0,0,0,0,1,4,0,0,3,1,0,1,0,2,0,1,2,0,1,0,1,2,2,0,0,1,2,1,2,2,3,1,0,0,1,0,2,0,1,0,0,2,0,2,0,2,0,1,1,1,0,0,0,3,3,2,0,2,1,2,1,1,0,5,1,2,1,0,3,1,0,2,4,0,1,3,1,1,4,2,2,2,0,1,0,2,1,0,0,0,0,0,0,1,1,2,2,0,0,2,0,0,1,1,0,0,1,1,0,1,0,1,0,0,1,1,1,0,2,2,0,1,1,1,1,1,2,1,0,1,0,0,2,0,3,0,1,2,1,1,3,1,0,1,0,0,1,2,0,1,2,1,2,0,0,1,1,0,2,1,2,1,1,2,1,1,1,1,1,2,0,0,0,2,0,0,0,2,1,0,0,1,2,0,1,1,0,2,1,1,2,1,1,2,0,1,4,0,1,1,2,1,1,3,0,0,4,2,0,1,1,0,2,2,1,1,0,1,1,0,2,0,1,1,1,0,0,0,1,0,2,0,1,0,2,1,1,1,0,2,1,0,0,2,3,0,0,0,0,1,0,0,1,3,2,0,1,3,0,0,0,0,2,1,0,0,1,3,2,1,0,1,1,1,3,1,2,0,2,1,4,1,1,0,4,2,0,0,1,2,1,1,1,1,3,1,1,4,1,0,1,2,0,1,1,0,1,0,1,1,0,0,0,0,1,3,0,0,1,0,2,4,3,0,0,2,1,1,1,0,1,1,2,0,0,2,0,1,0,1,2,1,2,1,0,1,1,0,0,1,0,0,2,1,0,0,2,2,1,1,1,0,0,1,1,0,0,2,0,0,2,6,1,0,0,0,0,1,0,3,1,0,1,1,0,0,0,0,2,0,3,1,0,1,1,0,1,0,0,2,3,2,0,1,2,2,2,2,1,1]},{"counters":[0,1,4,1,1,1,1,1,0,0,1,0,1,0,1,0,1,0,3,0,0,1,1,0,2,0,1,0,0,2,2,1,0,1,2,1,1,1,2,1,2,3,1,0,0,1,4,0,0,0,0,1,0,0,2,2,3,2,2,2,2,0,1,1,0,1,0,1,2,1,2,1,1,0,1,1,1,1,0,2,2,0,2,0,0,0,1,0,0,0,1,0,1,0,1,0,5,0,0,1,1,1,0,2,4,1,2,1,0,0,2,1,2,0,1,0,0,0,1,1,1,1,0,4,0,2,1,0,2,0,0,0,1,1,0,0,2,0,0,2,1,2,0,2,0,2,2,2,1,1,1,0,0,1,0,2,3,1,4,1,2,1,1,0,3,0,1,0,0,0,1,0,0,1,1,0,0,1,2,1,1,3,2,1,0,0,1,4,1,0,1,0,0,1,0,0,1,0,0,0,1,1,1,1,1,1,2,1,0,1,2,4,2,0,0,2,0,2,1,1,0,1,0,1,3,1,3,1,1,0,0,0,1,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,2,2,1,1,0,1,0,0,0,2,2,2,0,1,2,1,0,0,1,1,0,2,2,2,2,1,1,1,0,0,0,0,0,1,1,1,0,1,1,0,0,0,1,1,0,0,0,3,0,0,1,4,0,1,1,1,2,0,1,1,1,0,0,1,1,0,2,1,0,4,0,1,0,1,0,2,2,2,2,2,1,0,0,0,0,0,2,0,0,1,1,2,1,0,2,1,0,2,0,0,1,1,0,2,1,1,1,1,1,1,1,1,0,2,0,1,2,0,1,1,1,2,0,1,1,1,0,1,3,2,2,0,4,0,1,1,4,1,0,0,0,2,1,2,0,2,0,1,0,1,3,0,3,2,0,1,1,0,1,1,1,0,2,0,0,1,1,1,3,1,1,3,3,0,2,2,2,0,3,1,3,0,0,3,1,1,1,0,2,1,2,0,1,0,0,1,1,0,0,2,0,0,1,1,1,3,1,0,2,0,0,1,0,2,0,0,0,0,0,0,0,2,1,2,3,2,0,3,2,2,0,2,1,3,2,2,1,1,1,0,0,0,0,0,0,1,1,0,0,2,0,1,1,1,0,1,1,1,1,1,2,0,1,0,1,1,0,0,0,3,0,0,2,1,2,0,1,0,1,2,1,0,1,0,1,1,1,0,0,2,2,1,1,1,1,0,1,1,0,1,1,2,0,0,2,2,0,0,1,1,4,0,2,0,1,0,2,2,0,1,1,0,1,0,0,3,2,0,1,1,2,1,2,1,0,1,1,0,2,3,0,3,3,2,3,1,1,2,3,1,1,1,0,1,0,2,0,0,2,0,0,1,1,1,1,1,1,3,1,0,0,1,3,0,1,0,1,0,0,0,0,0,0,3,1,0,0,1,2,0,0,1,1,1,0,0,1,0,2,0,0,0,0,1,3,3,0,2,2,0,1,1,1,1,1,1,4,1,0,1,0,1,2,0,0,0,1,1,0,0,0,2,0,1,0,1,2,3,0,2,0,3,1,0,1,0,2,2,2,0,1,0,0,0,2,1,0,0,0,1,1,0,1,0,1,1,1,0,2,0,1,3,3,2,0,2,0,2,1,4,0,1,1,0,0,2,0,0,2,0,0,2,2,2,0,0,0,0,1,3,1,2,1,1,1,0,1,3,1,3,1,0,0,0,2,0,1,1,0,0,1,1,0,0,3,0,2,2,0,0,0,2,0,2,0,1,0,2,0,0,1,0,0,1,0,0,1,1,0,0,2,2,3,0,2,0,1,1,0,0,0,0,0,3,1,2,1,1,3,1,1,0,1,1,1,0,2,2,1,1,0,1,0,2,0,1,1,3,0,1,1,1,0,2,3,1,1,2,1,1,0,1,0,2,0,0,4,1,1,1,1,0,0,2,0,1,1,0,0,2,0,2,0,1,1,0,1,0,1,2,0,2,0,0,2,0,1,1,0,2,2,2,0,2,0,2,1,0,0,0,0,0,0,1,0,2,1,1,1,0,3,0,0,1,0,1,0,1,1,3,1,1,0,0,0,1,1,2,3,1,0,0,1,1,0,0,0,1,0,0,1,0,2,1,0,2,0,2,1,1,2,0,1,1,2,1,1,0,0,2,0,0,1,1,2,1,0,0,0,3,2,2,3,1,1,0,0,3,1,0,1,1,1,1,0,0,3,0,0,2,1,0,1,0,1,0,0,0,2,3,0,1,1,0,1,1,0,0,3,0,3,1,0,3,1,0,1,0,2,0,0,0,1,2,2,2,0,0,0,1,3,0,0,2,2,0,1,0,0,3,0,0,2,0,1,1,1,0,0,1,1,1,1,1,0,1,3,0,3,2,1,0,2,2,2,1,2,2,1,2,0,0,1,0,1,1,0,2,0,0,1,2,0,2,2,0,2,0,2,0,1,0,0,0,1,2,0,2,0,2,1,0,2,0,1,4,0,0,0,0,1,0,2,0,2,1,0,1,1,2,0,3,0,2,2,1,1,1,1,0,1,0,0,2,1,1,0,0,2,1,0,0,2,1,1,2,3,1,1,0,1,0,1,1,0,2,1,0,1,0,1,1,1,0,0,1,0,0,0,1,0,1,1,0,2,0,0,2,0,0,0,0,0,0,1,1,0,0,0,1,3,0,0,1,0,3,3,0,2,1,1,1,0,1,0,0,0,1,1,0,2,0,1,2,0,0,1,1,4,1,0,0,3,1,3,0,1,0,1,0,1,1,2,2,2,2,0,0,3,0,3,2,2,0,1,0,1,1,0,0,2,3,1,3,0,1,2,0,1,0,4,2,3,2,1,1,0,1,0,4,0,0,0,0,1,0,2,3,3,2,1,0,1,2,0,3,1,4,1,0,2,0,1,3,0,0,0,1,1,2,1,0,2,1,0,1,0,1,1,1,1,1,1,2,2,2,1,0,0,0,1,2,1,2,0,0,0,1,1,0,5,0,1,0,0,1,1,0,1,1,2,1,1,0,0,1,3,3,0,1,0,0,0,1,0,5,2,2,1,3,1,1,0,0,0,2,0,1,0,0,0,1,0,0,0,2,2,0,0,1,2,0,3,1,2,4,1,2,2,0,0,1,2,1,3,2,1,0,3,0,1,2,0,3,1,1,2,0,4,1,2,1,1,0,2,1,0,4,1,2,0,0,1,2,0,1,0,1,0,0,1,2,1,0,4,1,2,1,1,1,0,0,0,2,0,1,3,1,0,1,0,3,1,2,1,0,1,1,0,0,3,0,1,0,2,1,1,0,2,2,2,3,1,0,2,0,0,4,2,2,0,0,1,1,0,0,0,0,1,2,3,0,0,3,0,1,2,0,0,1,0,1,1,5,0,0,0,1,2,3,1,2,1,2,2,0,1,2,3,2,0,1,2,2,4,1,0,1,0,0,1,0,1,1,1,0,1,0,0,0,1,2,0,0,4,2,1,0,1,1,1,2,0,0,1,2,0,1,2,3,1,1,2,1,1,1,2,3,0,0,3,2,0,1,0,0,1,0,0,1,1,1,1,4,2,2,4,1,1,2,2,0,1,0,1,1,2,1,1,0,1,1,2,0,0,0,3,2,1,1,1,1,2,4,0,1,0,2,1,0,3,4,3,1,1,2,0,2,2,1,0,1,0,0,0,0,3,1,1,2,1,0,1,0,0,3,1,1,0,1,0,1,0,1,0,3,1,1,1,2,1,3,2,2,0,2,2,3,3,1,1,1,3,0,0,1,0,1,1,1,2,0,0,0,0,0,1,0,1,4,0,0,0,0,1,1,1,1,2,3,1,1,0,1,1,1,1,0,0,0,0,1,2,0,1,1,2,0,2,1,1,0,0,1,0,1,0,0,0,2,0,3,0,2,1,0,2,2,2,0,0,1,0,2,1,1,1,2,0,0,2,0,4,0,1,1,1,2,1,0,1,1,0,4,4,1,1,1,2,0,2,0,1,2,0,2,0,2,1,0,1,2,1,0,0,5,1,2,0,2,0,0,0,1,0,0,1,2,0,0,3,1,0,2,2,2,1,3,1,2,0,2,1,0,0,2,1,1,1,0,0,1,1,1,3,2,2,0,0,0,0,2,0,2,0,0,2,1,3,1,0,0,0,1,0,1,0,0,0,1,1,1,0,2,2,1,1,1,0,0,0,0,1,0,1,0,1,2,0,0,0,0,1,1,1,2,1,1,1,2,2,1,2,0,0,1,2,3,2,1,3,0,1,1,1,0,2,0,0,0,1,0,2,2,2,3,3,2,2,1,1,3,0,1,0,3,1,0,1,0,0,1,1,0,2,1,1,0,2,0,0,2,0,0,1,1,0,0,0,0,3,2,0,1,1,1,1,1,0,2,0,0,1,2,1,1,1,2,0,1,0,1,0,2,1,2,2,1,2,0,0,0,3,1,2,2,1,1,1,0,1,0,0,1,0,0,0,0,0,0,0,3,0,2,0,0,0,2,1,0,1,0,1,1,2,0,0,0,0,1,4,0,2,0,1,4,2,1,1,1,0,2,1,1,1,2,2,0,1,0,0,1,3,3,1,1,0,0,2,2,0,0,1,0,3,2,0,1,0,0]},{"counters":[4,0,0,0,0,2,1,0,0,1,0,0,0,2,1,3,1,1,2,2,1,1,0,1,2,3,0,1,1,2,0,1,0,1,0,0,0,0,1,2,1,0,1,1,0,1,2,1,2,0,1,3,2,1,2,1,0,0,1,1,2,1,1,0,3,1,1,3,1,0,1,1,2,2,2,1,2,1,0,1,0,0,1,0,1,2,1,1,1,2,1,0,0,0,2,0,0,2,3,0,0,1,4,1,1,0,3,0,2,1,2,2,2,0,1,2,0,3,0,0,1,0,0,2,0,0,1,1,0,1,0,1,1,0,1,1,0,0,0,1,0,2,1,0,0,0,0,4,1,3,0,0,1,1,1,0,2,2,1,2,1,0,0,1,0,0,3,0,1,1,2,0,0,0,1,3,2,1,1,1,0,2,1,2,2,1,0,1,0,0,0,0,0,2,1,1,0,1,2,1,2,0,1,0,0,1,0,1,1,1,0,2,1,0,0,0,0,1,0,1,0,2,1,2,4,1,2,0,3,4,0,0,0,0,2,2,0,0,3,1,1,2,2,0,0,1,0,2,0,0,1,3,0,3,2,2,1,1,1,0,2,4,0,0,2,0,2,0,3,2,1,2,0,0,1,0,1,1,1,1,1,1,0,3,0,1,1,1,1,2,2,1,1,0,1,1,2,2,3,1,0,2,0,1,1,2,1,3,2,0,1,1,1,3,1,1,0,1,0,2,1,1,0,3,2,2,1,1,1,0,0,0,0,3,1,0,1,2,0,2,0,0,3,1,0,1,0,1,1,2,1,0,5,0,0,2,0,1,1,0,0,2,1,0,0,0,0,2,0,2,0,1,1,1,0,1,0,1,1,1,2,0,1,1,0,0,1,2,1,1,0,1,2,1,0,1,2,2,1,0,0,0,0,2,0,1,1,1,1,1,0,2,1,1,0,0,0,2,0,1,0,0,2,1,0,1,0,2,1,1,2,3,0,0,0,0,0,0,1,2,1,0,2,0,1,2,0,1,2,3,0,2,2,0,1,1,1,1,0,4,1,0,1,0,0,0,0,1,2,2,1,2,0,3,1,3,2,1,2,0,1,1,0,0,1,0,2,1,0,0,3,0,2,1,1,0,3,0,1,0,3,0,0,1,1,1,0,4,1,0,2,3,0,1,0,1,0,1,1,0,1,0,1,0,1,1,1,0,3,2,0,0,3,2,1,1,1,2,1,0,1,2,1,4,1,1,1,2,2,1,0,0,0,1,1,0,1,1,3,1,0,0,2,0,0,0,2,0,2,2,0,3,2,1,0,0,0,1,0,0,1,0,1,0,2,1,2,2,1,2,1,0,1,0,0,0,1,1,1,1,0,1,2,2,1,1,1,3,1,0,2,0,1,2,2,1,2,2,2,2,1,1,4,0,0,3,2,1,0,0,1,0,0,1,1,2,2,2,1,1,0,0,3,2,1,1,1,0,0,1,0,0,1,1,1,1,0,0,0,2,1,1,0,0,2,1,0,0,0,1,1,1,1,1,0,1,1,1,0,1,0,1,3,3,1,0,0,1,3,0,0,2,2,1,1,5,0,0,1,5,1,1,0,0,0,0,0,2,0,1,1,0,2,0,1,1,1,1,0,2,2,1,1,1,2,0,1,1,1,1,1,1,0,0,0,3,1,2,1,1,0,0,2,3,3,0,1,0,0,1,2,1,0,0,0,2,1,1,3,0,2,0,1,0,3,0,2,0,4,1,0,1,1,2,1,1,0,1,1,2,0,1,1,0,2,0,1,1,2,4,2,0,1,1,4,0,1,1,1,0,2,2,1,0,1,1,3,0,0,0,2,2,0,2,0,0,0,3,1,0,0,1,2,1,2,2,1,1,3,1,1,2,0,2,0,1,0,1,1,0,0,2,1,0,1,0,0,0,1,2,0,0,2,0,1,1,3,1,0,1,2,0,3,0,0,1,1,0,0,0,0,1,0,0,1,0,3,0,2,0,0,0,0,0,0,2,1,1,0,1,1,2,2,1,0,2,0,1,0,0,3,1,2,1,2,2,1,4,1,0,2,2,2,0,1,0,0,2,2,1,0,0,1,2,0,2,1,2,3,0,0,0,1,0,1,0,1,0,0,3,0,1,1,0,0,0,0,0,0,0,2,1,4,1,0,1,0,1,1,1,1,0,1,1,3,0,1,0,2,1,2,2,0,1,0,2,0,1,0,1,0,1,0,1,1,1,2,1,0,1,2,3,2,0,2,1,2,0,2,2,0,0,2,0,0,0,0,0,2,1,0,0,0,0,1,0,0,0,1,0,0,1,2,0,0,1,1,0,1,0,0,2,3,6,0,0,2,1,0,0,5,2,1,1,0,0,1,1,1,2,1,0,0,1,1,2,0,0,2,0,0,1,2,0,2,1,0,1,3,2,2,0,2,1,1,1,0,0,0,1,2,0,4,0,1,0,2,0,1,1,0,1,1,1,0,0,1,0,3,1,1,0,0,1,2,2,1,2,1,0,0,1,0,1,1,0,2,1,1,0,0,0,1,0,0,0,0,0,2,3,0,1,3,1,1,2,1,2,0,3,1,0,0,1,2,3,0,2,0,1,1,2,1,0,3,0,1,1,0,0,1,0,3,1,1,1,1,2,1,2,0,0,0,1,3,1,1,1,0,1,2,2,1,1,2,0,2,0,1,0,1,3,1,0,0,1,1,0,2,0,0,0,0,1,0,1,3,1,1,0,3,2,1,1,0,1,1,2,0,1,3,1,0,0,1,0,2,0,0,2,0,2,0,2,1,1,0,2,1,1,0,2,2,0,2,1,0,0,0,3,0,0,0,0,2,1,1,1,0,0,0,1,2,2,0,0,1,2,2,1,3,1,1,0,0,1,2,0,1,1,1,2,1,2,1,1,0,0,1,0,3,0,1,0,1,1,0,0,0,2,0,0,0,0,0,1,0,0,0,1,0,0,2,1,1,0,2,0,1,1,0,1,1,1,4,0,3,0,3,1,0,3,0,0,1,1,1,0,2,1,1,1,0,1,1,2,1,1,0,2,0,0,1,1,0,0,0,1,0,3,1,1,4,2,2,1,1,2,0,0,1,1,2,2,0,2,1,2,1,1,1,1,1,0,1,0,1,1,0,1,0,3,0,3,1,0,0,1,0,0,0,0,0,0,1,1,1,0,4,1,2,1,4,1,0,2,1,1,0,1,2,1,0,0,4,2,0,1,1,1,0,0,2,0,1,0,4,1,1,0,0,2,1,1,4,0,1,2,0,1,2,0,1,1,3,1,1,1,1,0,0,0,1,0,1,0,2,1,1,1,1,0,0,0,1,2,0,3,0,1,2,0,0,1,0,0,3,0,0,2,0,2,0,0,2,1,0,0,0,2,3,0,0,2,3,3,2,0,0,1,0,1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,2,1,0,0,2,4,1,0,1,3,1,2,1,2,1,0,1,1,0,1,1,0,1,1,0,3,0,1,1,1,1,0,2,1,0,0,0,0,1,2,1,0,1,2,0,1,0,0,0,1,2,0,0,1,0,0,0,1,0,2,2,0,0,1,1,1,4,4,1,1,2,0,4,0,0,2,1,3,0,1,0,0,0,1,1,2,0,1,0,0,2,0,0,2,1,3,0,1,2,0,0,2,0,2,1,0,1,0,0,0,1,0,1,1,1,0,1,0,0,0,0,0,2,0,2,2,2,1,0,2,5,1,1,0,2,1,1,2,2,1,1,2,0,2,3,0,0,1,1,2,1,3,0,1,1,2,0,0,1,0,0,1,1,1,1,1,2,0,0,3,0,0,0,1,0,1,0,1,1,1,0,1,1,2,1,0,0,1,3,3,0,2,2,1,1,0,0,0,0,0,2,1,1,1,0,0,2,0,0,0,1,2,3,1,1,0,0,0,1,1,2,1,2,1,1,0,1,1,2,0,2,2,2,1,2,0,3,0,0,1,2,1,0,2,1,1,0,1,1,1,0,0,2,1,2,4,1,0,0,2,0,2,0,1,2,2,1,0,0,0,0,0,1,2,1,0,1,0,1,2,2,1,1,4,0,2,1,1,4,0,1,2,0,1,1,2,2,2,0,1,0,1,2,0,1,1,2,1,1,2,1,0,0,2,0,0,0,1,1,0,4,0,0,1,4,1,0,1,0,1,0,2,0,2,0,1,1,0,2,1,1,3,2,1,1,1,0,0,1,0,0,0,0,1,2,1,0,2,1,1,0,4,1,0,0,2,2,0,1,0,0,3,0,0,0,1,3,2,0,1,1,2,1,0,0,1,2,3,2,1,1,1,1,0,1,1,1,2,0,1,2,0,0,0,1,0,2,0,2,1,0,1,0,0,2,3,3,0,2,2,0,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,4,2,1,0,1,4,2,2,0,1,2,0,1,2,3,3,0,1,0,0,4,0,0,2,2,1,1,1,0,0,1,0,0,3,1,0,0,4,3,0,0,2,1,1,0,2,0,4,0,1,0,1,0,1,2,0,1,1,1,3,3,4,2,0,3,2,2,2,1,0,0,1,2,2,0,2,2,0,1,1,0,0,1,3,1]},{"counters":[1,1,2,3,2,0,0,1,1,0,1,0,2,2,1,0,0,2,1,0,0,0,2,0,0,0,1,0,3,2,2,0,1,0,1,3,0,0,0,4,0,0,1,3,2,0,0,1,1,3,3,0,0,1,0,0,0,0,0,0,2,1,0,0,1,1,1,1,2,1,0,1,2,2,0,2,0,0,2,1,1,1,0,1,0,2,0,1,1,0,1,2,3,1,1,1,0,4,1,1,0,2,3,1,2,0,0,0,0,0,0,3,2,1,0,0,1,1,1,1,2,1,1,0,2,0,1,1,0,2,0,0,0,0,1,1,2,1,2,1,1,2,2,0,2,0,1,0,1,2,2,1,1,1,0,1,1,0,3,2,2,3,1,0,0,0,2,0,1,0,3,2,1,0,0,1,1,2,1,0,1,1,0,1,1,1,0,1,1,0,1,2,0,0,1,0,0,3,2,1,0,2,0,3,1,1,0,1,2,1,0,1,1,2,0,0,0,1,1,0,0,1,0,0,0,1,2,0,0,1,0,1,0,0,0,3,0,0,3,1,2,2,2,0,0,1,1,1,0,0,2,1,0,1,1,0,2,1,0,0,0,0,3,1,1,1,1,0,1,1,0,2,0,0,1,1,1,0,0,2,2,1,2,0,0,0,1,2,2,2,1,1,1,1,0,1,1,0,3,2,1,1,0,0,1,1,1,0,0,2,1,1,2,0,0,1,1,1,1,2,2,1,1,1,0,3,2,1,1,0,1,1,2,2,1,0,2,1,1,1,0,1,1,2,1,0,0,1,0,0,2,0,2,1,2,2,0,1,0,2,2,1,1,0,0,0,1,0,1,1,0,0,2,1,0,1,2,0,0,2,1,1,0,2,1,0,0,0,1,1,2,2,1,0,2,0,1,0,0,1,3,0,0,0,0,2,0,0,1,2,0,0,1,2,1,0,2,3,2,3,0,0,0,3,0,1,2,4,1,1,0,1,1,2,1,0,1,3,2,2,0,1,0,0,1,0,4,0,1,1,2,0,1,2,0,3,0,1,0,0,0,2,2,0,3,0,0,1,1,4,1,0,2,1,0,0,2,1,0,0,0,0,0,0,3,1,0,2,2,1,1,0,1,1,0,1,1,0,1,0,3,1,2,0,1,0,2,2,0,0,0,0,2,3,1,1,1,1,1,2,1,1,1,1,0,0,1,1,1,0,1,1,1,1,1,0,0,4,1,0,0,2,2,0,0,0,1,1,1,0,1,1,0,1,0,1,0,1,0,3,1,2,1,0,1,0,0,1,0,3,1,0,0,0,1,0,0,1,2,2,1,0,2,1,1,3,1,1,0,2,0,3,1,2,3,0,2,2,1,3,2,1,1,1,2,2,2,0,0,2,0,1,0,1,1,0,2,2,1,1,0,2,2,0,2,3,1,1,1,1,3,2,1,1,1,0,0,2,1,1,0,2,3,0,1,2,0,1,1,1,1,2,0,0,0,2,1,0,0,2,0,0,1,0,0,2,2,1,0,1,1,0,1,1,1,1,1,0,2,2,1,3,2,2,0,1,0,0,0,1,0,2,2,0,0,0,1,1,2,1,1,1,0,0,3,0,1,1,3,1,1,0,1,0,2,2,1,1,2,3,0,2,0,0,0,1,0,1,1,0,1,0,2,1,0,4,0,0,1,1,0,1,0,0,0,0,1,2,0,1,1,0,2,1,0,1,2,2,2,2,0,1,0,0,0,2,1,1,0,3,4,0,1,0,1,0,1,2,1,0,1,3,3,1,0,1,0,1,2,2,1,1,1,2,2,0,1,0,1,0,0,1,1,0,2,0,0,1,1,2,0,1,1,2,1,3,1,2,3,2,1,4,0,2,0,2,2,0,0,2,0,1,4,0,0,1,0,1,1,0,1,0,1,0,0,1,1,0,4,0,0,1,3,1,0,0,0,2,0,1,0,3,2,0,3,1,2,2,0,5,1,1,1,0,1,1,1,1,0,0,1,0,1,0,0,1,0,4,0,1,1,1,2,0,0,0,0,1,1,2,1,0,1,4,0,0,0,1,2,1,0,1,0,1,1,1,1,1,1,0,2,3,0,1,2,1,2,2,1,1,2,1,2,2,2,2,2,1,1,1,0,2,0,1,1,1,2,0,2,1,0,1,0,0,0,1,1,1,0,1,0,1,0,1,1,0,1,1,1,4,2,1,1,0,2,0,0,1,0,0,0,0,1,1,0,1,0,3,1,0,1,2,0,0,0,1,1,0,2,0,1,2,2,1,2,1,2,1,0,0,1,0,1,2,0,2,0,1,1,2,2,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,3,1,3,0,2,1,1,0,2,2,2,3,1,0,1,1,0,3,0,1,0,0,1,1,1,2,0,1,0,0,2,2,2,0,1,1,4,1,0,3,1,4,3,1,3,0,2,1,0,0,1,1,1,1,0,1,1,2,1,2,0,1,0,1,0,1,0,1,0,0,1,0,2,0,1,1,1,1,2,0,0,0,0,3,0,1,2,0,1,0,1,1,0,2,1,0,0,2,0,1,2,0,2,2,1,2,0,0,1,0,1,1,2,2,1,2,0,2,1,2,4,0,1,2,0,2,0,0,1,1,0,2,0,2,1,3,0,0,1,0,1,0,1,0,1,1,1,0,1,0,0,1,1,3,1,1,1,2,0,0,0,0,0,0,0,0,1,0,0,1,1,2,0,1,3,0,1,3,1,3,0,2,2,1,2,0,2,0,1,2,1,2,0,3,2,1,0,0,3,0,1,1,1,1,2,0,0,2,0,1,1,1,0,0,1,1,0,1,1,0,0,1,0,2,0,0,0,0,1,1,2,1,1,2,0,1,2,1,1,1,0,1,0,0,0,2,0,2,3,0,0,1,1,1,0,0,2,1,2,1,0,1,1,1,1,0,0,1,2,2,0,0,2,1,3,2,0,1,1,1,0,5,2,0,1,0,0,0,1,0,1,2,1,1,0,1,1,0,0,0,0,1,1,0,3,2,2,0,0,0,1,2,1,2,1,2,1,2,1,2,1,1,2,3,1,0,1,1,2,3,3,0,0,0,1,0,0,2,0,1,0,1,0,2,0,3,0,0,1,1,1,2,0,0,1,1,1,1,0,2,1,0,1,1,0,0,2,0,0,0,2,1,2,1,1,1,1,1,0,3,2,0,0,1,1,1,2,0,0,0,0,2,1,0,1,0,0,0,1,1,0,1,0,1,2,0,2,0,1,1,0,0,0,0,1,2,0,1,0,2,2,1,1,0,0,0,1,2,2,0,4,1,0,0,1,0,6,1,0,2,1,1,0,1,0,1,3,1,1,2,3,1,2,1,1,0,2,1,0,0,0,1,0,1,1,0,0,0,0,2,0,0,0,1,0,1,0,0,1,3,1,4,1,1,1,1,0,2,3,1,1,6,0,1,1,0,1,2,1,0,0,0,1,1,1,1,0,3,3,2,1,0,1,2,2,1,1,1,0,2,2,0,1,0,1,0,1,0,0,1,1,0,0,1,1,0,0,0,1,0,1,1,2,0,0,0,2,1,0,2,2,1,1,1,1,0,4,4,1,1,0,0,2,3,1,0,2,1,1,2,0,1,0,0,0,1,2,1,0,0,1,2,0,1,0,2,0,0,2,1,4,0,0,0,0,1,1,3,1,2,0,4,0,0,3,1,1,1,0,2,4,0,2,1,1,0,0,1,4,0,1,1,0,1,0,1,3,3,2,1,0,1,1,1,2,1,1,1,2,2,0,1,4,0,1,0,1,0,0,1,0,0,1,0,0,2,1,2,3,3,3,2,0,1,1,2,6,1,1,1,1,1,2,2,2,0,1,0,2,1,1,2,0,0,1,0,1,0,0,1,1,2,0,2,2,0,3,2,0,1,0,1,2,0,0,0,2,1,1,0,2,1,1,2,3,3,0,0,1,0,1,1,1,1,3,1,0,1,1,1,2,3,0,2,1,2,1,0,0,1,2,0,3,0,0,0,1,0,1,0,0,0,3,0,0,1,0,0,1,0,0,1,2,2,1,3,3,0,1,1,1,2,3,2,1,2,1,1,1,2,0,2,1,1,0,2,2,0,1,2,2,0,2,2,4,1,0,1,0,0,1,3,2,1,2,0,2,1,1,1,1,0,0,0,0,0,2,1,1,2,2,1,2,0,0,2,1,2,3,0,0,0,1,0,3,1,0,1,2,4,1,2,2,0,0,0,0,0,1,2,1,0,1,2,0,0,0,0,1,1,1,0,2,1,2,1,0,0,1,0,3,3,3,1,1,1,0,1,1,1,0,0,6,0,1,2,0,0,2,2,2,0,1,1,0,0,2,0,1,0,2,0,0,1,0,1,0,0,1,1,1,1,0,1,1,0,2,1,0,1,1,1,1,1,1,0,0,1,0,2,2,0,3,0,0,0,0,2,1,4,1,0,0,1,2,1,1,0,0,0,1,0,0,0,1,0,0,2,1,2,2,0,0,1,1,0,3,3,1,1,0,1,3,3,2,0,0,1,1,0,1,1,1,2,0,1,0,0,1,1,2,0,0,1,0,1,1,0,2,2,1,0,1,1,0,1,0,1,1,0,1,0]},{"counters":[4,3,1,1,1,0,1,0,2,2,0,2,2,2,1,0,1,0,1,0,2,0,1,2,0,2,0,0,2,1,0,1,1,0,0,4,0,2,0,2,1,2,0,0,2,2,0,1,1,1,0,3,0,2,2,0,1,2,3,1,1,0,1,0,1,1,0,1,1,3,1,2,1,1,1,1,2,0,0,1,1,0,2,1,1,1,3,1,0,0,1,0,5,2,1,1,2,0,2,0,0,1,1,0,1,0,0,0,3,0,2,0,0,0,0,1,0,0,1,1,0,4,2,0,0,1,3,0,0,2,1,1,2,3,0,2,3,2,0,0,2,1,1,0,1,1,0,1,1,2,0,0,0,0,2,1,3,0,1,0,2,1,2,1,1,2,1,1,4,0,2,1,0,1,1,1,2,2,2,0,1,1,1,1,1,1,0,3,1,0,2,2,1,1,3,1,1,2,1,1,0,2,1,0,0,2,3,2,2,1,2,1,2,3,3,3,0,2,2,0,1,1,1,1,1,0,0,1,2,0,0,0,1,1,1,2,0,3,2,1,1,0,0,1,0,0,4,1,0,3,1,1,2,0,1,6,1,2,2,2,0,0,0,2,0,2,0,0,2,0,2,2,4,0,0,0,1,0,0,1,3,0,1,0,3,2,1,2,0,0,0,1,0,0,0,2,0,1,1,0,0,1,2,3,1,3,0,1,2,1,2,0,0,1,1,0,1,1,1,0,1,2,0,1,3,1,2,0,3,1,1,0,1,0,0,1,1,0,3,0,1,0,2,0,0,2,1,3,2,3,0,1,1,0,0,1,1,1,1,2,0,1,2,1,1,3,2,4,0,0,1,0,0,1,0,1,1,0,0,4,1,3,0,1,0,0,3,1,0,0,0,0,2,2,2,3,0,1,0,0,0,1,2,2,0,3,2,1,1,1,3,1,0,0,0,0,1,2,1,1,1,1,2,1,0,2,0,1,0,0,0,0,1,3,0,0,2,1,0,2,2,0,1,1,1,1,2,1,1,1,1,1,0,1,1,0,1,2,1,2,1,2,1,2,1,0,1,1,0,1,0,1,1,1,1,0,2,0,0,2,1,1,0,4,1,0,1,1,2,1,0,0,2,0,1,0,2,0,1,2,0,1,0,1,0,1,2,2,0,0,0,2,0,1,1,1,1,0,1,1,1,2,2,0,1,0,1,1,4,0,0,0,0,2,3,0,1,1,1,1,0,0,2,1,3,0,0,1,0,0,5,0,0,2,3,0,2,0,0,0,0,1,0,2,0,2,1,2,2,0,1,1,0,0,0,5,0,4,2,1,0,2,0,1,1,0,1,1,0,0,0,0,1,1,0,1,1,0,4,0,2,1,2,1,1,1,3,0,1,0,1,2,0,2,2,2,3,1,0,2,1,1,1,0,0,0,0,0,0,1,3,0,0,0,1,0,1,0,1,0,1,0,1,1,0,1,0,1,1,2,0,0,0,1,0,2,4,0,0,0,2,2,0,2,1,2,1,1,0,1,1,0,2,1,0,3,3,0,1,0,0,0,0,0,0,0,2,1,0,0,2,2,1,0,1,2,0,1,1,0,2,1,0,4,0,1,1,2,0,2,0,4,1,4,0,0,1,0,1,2,0,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,1,0,1,2,0,0,0,2,1,1,1,1,2,1,0,2,1,0,0,1,0,2,2,0,1,2,0,2,0,2,1,1,0,0,0,0,1,0,2,0,1,1,0,1,2,2,4,1,0,1,0,2,0,1,0,0,6,0,1,1,1,0,0,0,0,2,0,1,0,1,1,2,0,0,0,1,0,2,1,1,0,0,2,1,0,0,2,1,0,0,0,3,0,1,1,1,1,1,1,0,3,0,1,0,0,1,1,1,0,2,1,2,0,2,2,1,0,0,0,1,2,1,1,2,2,0,1,1,1,1,0,2,1,0,0,2,0,0,1,2,1,1,0,1,0,1,1,2,0,2,3,1,0,1,3,1,1,0,0,2,3,0,1,0,1,2,2,1,1,2,1,0,0,0,1,1,0,1,1,1,1,0,0,1,0,1,0,0,0,2,0,0,1,1,1,0,0,0,2,2,1,1,2,0,2,1,1,0,1,1,2,2,2,0,1,1,0,0,0,1,3,1,3,0,2,0,3,0,1,0,0,0,2,3,0,2,1,1,0,1,0,1,0,0,1,0,1,1,1,2,1,0,1,0,0,1,1,0,1,2,0,0,2,2,2,2,0,1,0,0,1,0,1,1,0,1,1,0,0,0,4,1,0,0,2,1,2,2,1,0,0,1,1,2,2,2,1,0,3,1,0,0,1,0,3,3,1,0,1,2,2,1,1,2,1,0,1,0,0,0,2,2,1,0,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,0,2,0,2,1,1,1,1,0,1,1,0,0,1,2,4,0,0,1,1,0,2,0,1,0,0,0,0,1,1,0,1,0,0,3,2,0,2,1,1,0,0,0,1,1,4,1,0,1,3,1,1,1,2,2,1,1,0,0,1,0,0,2,1,0,0,2,0,0,0,1,0,0,0,0,1,0,1,0,0,0,3,0,1,0,0,3,0,1,0,1,1,1,1,1,1,2,3,1,1,0,0,0,0,2,2,0,0,1,0,0,1,4,2,1,1,2,3,1,0,0,0,1,0,0,0,2,2,2,1,1,2,2,2,0,3,1,0,3,2,2,2,1,1,2,0,0,0,1,3,1,4,0,1,0,0,0,0,2,0,0,1,0,0,2,2,0,0,0,0,0,0,1,2,1,1,2,1,0,0,1,0,3,0,1,0,1,4,1,2,0,0,0,1,1,0,1,2,0,0,3,1,1,1,0,4,5,0,1,1,0,1,2,1,1,2,0,1,1,2,0,0,1,0,1,0,0,1,0,1,1,3,1,1,0,1,1,3,1,2,0,1,0,1,2,0,1,0,0,2,1,0,2,0,0,1,1,2,2,0,0,0,1,2,1,1,0,1,1,0,1,0,2,2,0,1,0,1,2,2,2,0,1,0,1,1,1,0,1,0,0,0,0,1,0,0,0,1,0,2,2,1,1,1,2,0,0,2,2,1,1,1,2,1,1,1,0,0,1,2,1,1,3,1,0,0,2,0,4,0,2,0,2,0,1,2,1,0,2,0,0,1,0,0,1,0,1,2,1,1,0,1,0,1,1,3,1,2,0,2,1,0,1,1,3,2,1,2,3,1,1,0,0,1,0,2,1,0,2,0,1,0,2,0,1,1,0,0,2,1,0,1,0,2,3,0,0,1,1,0,1,1,2,1,0,4,2,0,0,1,2,2,1,2,0,0,4,1,2,1,2,0,0,0,1,2,1,1,0,2,0,1,1,1,0,0,0,0,1,1,2,0,1,0,2,1,0,3,2,0,1,1,0,0,0,0,2,2,1,1,0,1,1,0,1,6,3,0,2,0,0,1,3,1,1,2,2,0,1,0,0,2,1,1,3,2,3,3,1,2,0,0,0,2,1,0,1,2,0,1,0,1,0,2,1,1,2,2,0,1,1,0,0,0,2,1,2,3,0,3,0,1,0,1,0,3,0,1,0,0,6,0,4,4,0,1,2,1,1,2,2,1,2,1,3,0,2,1,1,1,2,0,1,1,2,2,0,0,0,0,0,1,1,1,1,3,0,2,2,0,0,0,1,3,0,1,1,3,0,0,0,0,3,0,1,0,3,0,2,1,2,0,3,1,1,2,1,1,1,0,0,1,0,0,1,0,4,2,0,1,0,2,0,1,3,0,3,0,0,1,0,1,1,0,0,1,0,2,1,3,0,1,1,1,1,0,1,0,0,0,3,0,0,0,4,0,0,2,1,0,0,0,0,1,2,2,1,3,1,0,2,0,0,0,1,1,1,0,1,1,0,1,0,0,4,0,0,1,3,2,1,0,0,1,1,1,0,1,0,1,0,0,1,0,0,2,0,1,1,1,5,0,0,0,0,0,3,0,0,0,0,1,0,2,3,1,0,1,0,0,0,1,0,2,2,0,1,1,0,1,3,1,1,0,1,1,1,1,1,1,0,1,1,0,1,1,2,4,1,1,0,0,1,0,1,0,1,0,2,0,1,2,1,1,0,0,0,1,2,3,0,2,1,3,3,1,0,0,1,0,1,1,0,1,1,0,1,0,1,1,0,1,1,0,4,1,1,2,0,3,1,1,2,0,2,0,2,0,4,0,0,1,2,0,2,1,0,0,3,3,1,1,1,0,6,1,2,1,1,1,0,1,1,0,1,1,1,3,0,2,2,0,0,2,1,1,0,0,0,2,0,1,0,0,1,0,1,0,2,2,0,0,2,0,0,2,1,1,1,0,1,4,3,2,3,2,0,1,2,2,2,2,1,1,0,3,1,1,2,0,1,1,2,0,1,2,0,0,3,0,1,0,1,0,0,0,1,1,0,1,1,3,0,2,2,1,0,2,3,0,1,2,0,0,1,0,2,0,1,1,1,2,2,1,0,0,1,2,0,0,1,1,0,3,1,1,1,0,2,0,3,0,3,1,0,1,0,0,0,2]}]},"null_count":0,"last_update_version":397952043843584000}},"indices":{"primary":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"ATAAAAAAAAAA+AEyAAAAAAAAAPg=","upper_bound":"ATE1AAAAAAAA+QExNQAAAAAAAPk=","repeats":1},{"count":16,"lower_bound":"ATE2AAAAAAAA+QExNgAAAAAAAPk=","upper_bound":"ATFEAAAAAAAA+QExRAAAAAAAAPk=","repeats":1},{"count":24,"lower_bound":"ATFFAAAAAAAA+QExRQAAAAAAAPk=","upper_bound":"ATFMAAAAAAAA+QExTAAAAAAAAPk=","repeats":1},{"count":32,"lower_bound":"ATFNAAAAAAAA+QExTQAAAAAAAPk=","upper_bound":"ATFUAAAAAAAA+QExVAAAAAAAAPk=","repeats":1},{"count":40,"lower_bound":"ATFVAAAAAAAA+QExVQAAAAAAAPk=","upper_bound":"ATFiAAAAAAAA+QExYgAAAAAAAPk=","repeats":1},{"count":48,"lower_bound":"ATFjAAAAAAAA+QExYwAAAAAAAPk=","upper_bound":"ATFqAAAAAAAA+QExagAAAAAAAPk=","repeats":1},{"count":56,"lower_bound":"ATFrAAAAAAAA+QExbAAAAAAAAPk=","upper_bound":"ATFyAAAAAAAA+QExcgAAAAAAAPk=","repeats":1},{"count":64,"lower_bound":"ATFzAAAAAAAA+QExcwAAAAAAAPk=","upper_bound":"ATF6AAAAAAAA+QExegAAAAAAAPk=","repeats":1},{"count":72,"lower_bound":"ATIAAAAAAAAA+AExAAAAAAAAAPg=","upper_bound":"ATI2AAAAAAAA+QEyNgAAAAAAAPk=","repeats":1},{"count":80,"lower_bound":"ATI3AAAAAAAA+QEyNwAAAAAAAPk=","upper_bound":"ATJFAAAAAAAA+QEyRgAAAAAAAPk=","repeats":1},{"count":88,"lower_bound":"ATJGAAAAAAAA+QEyRQAAAAAAAPk=","upper_bound":"ATJNAAAAAAAA+QEyTAAAAAAAAPk=","repeats":1},{"count":96,"lower_bound":"ATJOAAAAAAAA+QEyTgAAAAAAAPk=","upper_bound":"ATJVAAAAAAAA+QEyVQAAAAAAAPk=","repeats":1},{"count":104,"lower_bound":"ATJWAAAAAAAA+QEyVgAAAAAAAPk=","upper_bound":"ATJjAAAAAAAA+QEyYwAAAAAAAPk=","repeats":1},{"count":112,"lower_bound":"ATJkAAAAAAAA+QEyZAAAAAAAAPk=","upper_bound":"ATJrAAAAAAAA+QEyagAAAAAAAPk=","repeats":1},{"count":120,"lower_bound":"ATJsAAAAAAAA+QEyawAAAAAAAPk=","upper_bound":"ATJzAAAAAAAA+QEycgAAAAAAAPk=","repeats":1},{"count":128,"lower_bound":"ATJ0AAAAAAAA+QEycwAAAAAAAPk=","upper_bound":"ATMAAAAAAAAA+AEwAAAAAAAAAPg=","repeats":1},{"count":136,"lower_bound":"ATMwAAAAAAAA+QEzMAAAAAAAAPk=","upper_bound":"ATM3AAAAAAAA+QEzNwAAAAAAAPk=","repeats":1},{"count":144,"lower_bound":"ATM4AAAAAAAA+QEzOAAAAAAAAPk=","upper_bound":"ATNGAAAAAAAA+QEzRgAAAAAAAPk=","repeats":1},{"count":152,"lower_bound":"ATNHAAAAAAAA+QEzSAAAAAAAAPk=","upper_bound":"ATNOAAAAAAAA+QEzTgAAAAAAAPk=","repeats":1},{"count":160,"lower_bound":"ATNPAAAAAAAA+QEzTwAAAAAAAPk=","upper_bound":"ATNWAAAAAAAA+QEzVgAAAAAAAPk=","repeats":1},{"count":168,"lower_bound":"ATNXAAAAAAAA+QEzVwAAAAAAAPk=","upper_bound":"ATNkAAAAAAAA+QEzYwAAAAAAAPk=","repeats":1},{"count":176,"lower_bound":"ATNlAAAAAAAA+QEzZQAAAAAAAPk=","upper_bound":"ATNsAAAAAAAA+QEzbAAAAAAAAPk=","repeats":1},{"count":184,"lower_bound":"ATNtAAAAAAAA+QEzbQAAAAAAAPk=","upper_bound":"ATN0AAAAAAAA+QEzdAAAAAAAAPk=","repeats":1},{"count":192,"lower_bound":"ATN1AAAAAAAA+QEzdQAAAAAAAPk=","upper_bound":"ATQwAAAAAAAA+QE0MAAAAAAAAPk=","repeats":1},{"count":200,"lower_bound":"ATQxAAAAAAAA+QE0MQAAAAAAAPk=","upper_bound":"ATQ4AAAAAAAA+QE0OAAAAAAAAPk=","repeats":1},{"count":208,"lower_bound":"ATQ5AAAAAAAA+QE0OQAAAAAAAPk=","upper_bound":"ATRHAAAAAAAA+QFDcAAAAAAAAPk=","repeats":1},{"count":216,"lower_bound":"ATRIAAAAAAAA+QE0RwAAAAAAAPk=","upper_bound":"ATRPAAAAAAAA+QE0TgAAAAAAAPk=","repeats":1},{"count":224,"lower_bound":"ATRQAAAAAAAA+QE0TwAAAAAAAPk=","upper_bound":"ATRXAAAAAAAA+QE0VgAAAAAAAPk=","repeats":1},{"count":232,"lower_bound":"ATRYAAAAAAAA+QE0VwAAAAAAAPk=","upper_bound":"ATRlAAAAAAAA+QE0ZAAAAAAAAPk=","repeats":1},{"count":240,"lower_bound":"ATRmAAAAAAAA+QE0ZQAAAAAAAPk=","upper_bound":"ATRtAAAAAAAA+QE0bAAAAAAAAPk=","repeats":1},{"count":248,"lower_bound":"ATRuAAAAAAAA+QE0bQAAAAAAAPk=","upper_bound":"ATR1AAAAAAAA+QE0dAAAAAAAAPk=","repeats":1},{"count":256,"lower_bound":"ATR2AAAAAAAA+QE0dQAAAAAAAPk=","upper_bound":"ATUxAAAAAAAA+QE1MAAAAAAAAPk=","repeats":1},{"count":264,"lower_bound":"ATUyAAAAAAAA+QE1MQAAAAAAAPk=","upper_bound":"ATU5AAAAAAAA+QE1OAAAAAAAAPk=","repeats":1},{"count":272,"lower_bound":"ATVBAAAAAAAA+QE1OQAAAAAAAPk=","upper_bound":"ATVIAAAAAAAA+QE1RwAAAAAAAPk=","repeats":1},{"count":280,"lower_bound":"ATVJAAAAAAAA+QE1SAAAAAAAAPk=","upper_bound":"ATVQAAAAAAAA+QE1TwAAAAAAAPk=","repeats":1},{"count":288,"lower_bound":"ATVRAAAAAAAA+QE1UAAAAAAAAPk=","upper_bound":"ATVYAAAAAAAA+QE1VwAAAAAAAPk=","repeats":1},{"count":296,"lower_bound":"ATVZAAAAAAAA+QE1WAAAAAAAAPk=","upper_bound":"ATVmAAAAAAAA+QE1ZQAAAAAAAPk=","repeats":1},{"count":304,"lower_bound":"ATVnAAAAAAAA+QE1ZgAAAAAAAPk=","upper_bound":"ATVuAAAAAAAA+QE1bQAAAAAAAPk=","repeats":1},{"count":312,"lower_bound":"ATVvAAAAAAAA+QE1bgAAAAAAAPk=","upper_bound":"ATV2AAAAAAAA+QE1dQAAAAAAAPk=","repeats":1},{"count":320,"lower_bound":"ATV3AAAAAAAA+QE1dgAAAAAAAPk=","upper_bound":"ATYyAAAAAAAA+QE2MQAAAAAAAPk=","repeats":1},{"count":328,"lower_bound":"ATYzAAAAAAAA+QE2MgAAAAAAAPk=","upper_bound":"ATZBAAAAAAAA+QE2OQAAAAAAAPk=","repeats":1},{"count":336,"lower_bound":"ATZCAAAAAAAA+QE2QQAAAAAAAPk=","upper_bound":"ATZJAAAAAAAA+QE2SAAAAAAAAPk=","repeats":1},{"count":344,"lower_bound":"ATZKAAAAAAAA+QE2SQAAAAAAAPk=","upper_bound":"ATZRAAAAAAAA+QE2UAAAAAAAAPk=","repeats":1},{"count":352,"lower_bound":"ATZSAAAAAAAA+QE2UQAAAAAAAPk=","upper_bound":"ATZZAAAAAAAA+QE2WAAAAAAAAPk=","repeats":1},{"count":360,"lower_bound":"ATZaAAAAAAAA+QE2WQAAAAAAAPk=","upper_bound":"ATZnAAAAAAAA+QE2ZgAAAAAAAPk=","repeats":1},{"count":368,"lower_bound":"ATZoAAAAAAAA+QE2ZwAAAAAAAPk=","upper_bound":"ATZvAAAAAAAA+QE2bgAAAAAAAPk=","repeats":1},{"count":376,"lower_bound":"ATZwAAAAAAAA+QE2bwAAAAAAAPk=","upper_bound":"ATZ3AAAAAAAA+QE2dgAAAAAAAPk=","repeats":1},{"count":384,"lower_bound":"ATZ4AAAAAAAA+QE2dwAAAAAAAPk=","upper_bound":"ATczAAAAAAAA+QE3MgAAAAAAAPk=","repeats":1},{"count":392,"lower_bound":"ATc0AAAAAAAA+QE3MwAAAAAAAPk=","upper_bound":"ATdCAAAAAAAA+QE3QQAAAAAAAPk=","repeats":1},{"count":400,"lower_bound":"ATdDAAAAAAAA+QE3QgAAAAAAAPk=","upper_bound":"ATdKAAAAAAAA+QE3SQAAAAAAAPk=","repeats":1},{"count":408,"lower_bound":"ATdLAAAAAAAA+QE3SgAAAAAAAPk=","upper_bound":"ATdSAAAAAAAA+QE3UQAAAAAAAPk=","repeats":1},{"count":416,"lower_bound":"ATdTAAAAAAAA+QE3UgAAAAAAAPk=","upper_bound":"ATdaAAAAAAAA+QE3WQAAAAAAAPk=","repeats":1},{"count":424,"lower_bound":"ATdhAAAAAAAA+QE3WgAAAAAAAPk=","upper_bound":"ATdoAAAAAAAA+QE3ZwAAAAAAAPk=","repeats":1},{"count":432,"lower_bound":"ATdpAAAAAAAA+QE3aAAAAAAAAPk=","upper_bound":"ATdwAAAAAAAA+QE3bwAAAAAAAPk=","repeats":1},{"count":440,"lower_bound":"ATdxAAAAAAAA+QE3cAAAAAAAAPk=","upper_bound":"ATd4AAAAAAAA+QE3dwAAAAAAAPk=","repeats":1},{"count":448,"lower_bound":"ATd5AAAAAAAA+QE3eAAAAAAAAPk=","upper_bound":"ATg0AAAAAAAA+QE4MwAAAAAAAPk=","repeats":1},{"count":456,"lower_bound":"ATg1AAAAAAAA+QE4NAAAAAAAAPk=","upper_bound":"AThDAAAAAAAA+QE4QgAAAAAAAPk=","repeats":1},{"count":464,"lower_bound":"AThEAAAAAAAA+QE4QwAAAAAAAPk=","upper_bound":"AThLAAAAAAAA+QE4SgAAAAAAAPk=","repeats":1},{"count":472,"lower_bound":"AThMAAAAAAAA+QE4SwAAAAAAAPk=","upper_bound":"AThTAAAAAAAA+QE4UgAAAAAAAPk=","repeats":1},{"count":480,"lower_bound":"AThUAAAAAAAA+QE4UwAAAAAAAPk=","upper_bound":"AThhAAAAAAAA+QE4WgAAAAAAAPk=","repeats":1},{"count":488,"lower_bound":"AThiAAAAAAAA+QE4YQAAAAAAAPk=","upper_bound":"AThpAAAAAAAA+QE4aAAAAAAAAPk=","repeats":1},{"count":496,"lower_bound":"AThqAAAAAAAA+QE4aQAAAAAAAPk=","upper_bound":"AThxAAAAAAAA+QE4cAAAAAAAAPk=","repeats":1},{"count":504,"lower_bound":"AThyAAAAAAAA+QE4cQAAAAAAAPk=","upper_bound":"ATh5AAAAAAAA+QE4eAAAAAAAAPk=","repeats":1},{"count":512,"lower_bound":"ATh6AAAAAAAA+QE4eQAAAAAAAPk=","upper_bound":"ATk1AAAAAAAA+QE5NAAAAAAAAPk=","repeats":1},{"count":520,"lower_bound":"ATk2AAAAAAAA+QE5NQAAAAAAAPk=","upper_bound":"ATlEAAAAAAAA+QE5QwAAAAAAAPk=","repeats":1},{"count":528,"lower_bound":"ATlFAAAAAAAA+QE5RAAAAAAAAPk=","upper_bound":"ATlMAAAAAAAA+QE5SwAAAAAAAPk=","repeats":1},{"count":536,"lower_bound":"ATlNAAAAAAAA+QE5TAAAAAAAAPk=","upper_bound":"ATlUAAAAAAAA+QE5UwAAAAAAAPk=","repeats":1},{"count":544,"lower_bound":"ATlVAAAAAAAA+QE5VAAAAAAAAPk=","upper_bound":"ATliAAAAAAAA+QE5YQAAAAAAAPk=","repeats":1},{"count":552,"lower_bound":"ATljAAAAAAAA+QE5YgAAAAAAAPk=","upper_bound":"ATlqAAAAAAAA+QE5aQAAAAAAAPk=","repeats":1},{"count":560,"lower_bound":"ATlrAAAAAAAA+QE5agAAAAAAAPk=","upper_bound":"ATlyAAAAAAAA+QE5cQAAAAAAAPk=","repeats":1},{"count":568,"lower_bound":"ATlzAAAAAAAA+QE5cgAAAAAAAPk=","upper_bound":"ATl6AAAAAAAA+QE5eQAAAAAAAPk=","repeats":1},{"count":576,"lower_bound":"AUEAAAAAAAAA+AFBAAAAAAAAAPg=","upper_bound":"AUE2AAAAAAAA+QFBNQAAAAAAAPk=","repeats":1},{"count":584,"lower_bound":"AUE3AAAAAAAA+QFBNgAAAAAAAPk=","upper_bound":"AUFFAAAAAAAA+QFBRAAAAAAAAPk=","repeats":1},{"count":592,"lower_bound":"AUFGAAAAAAAA+QFBRQAAAAAAAPk=","upper_bound":"AUFNAAAAAAAA+QFBTAAAAAAAAPk=","repeats":1},{"count":600,"lower_bound":"AUFOAAAAAAAA+QFBTQAAAAAAAPk=","upper_bound":"AUFVAAAAAAAA+QFBVAAAAAAAAPk=","repeats":1},{"count":608,"lower_bound":"AUFWAAAAAAAA+QFBVQAAAAAAAPk=","upper_bound":"AUFjAAAAAAAA+QFBYgAAAAAAAPk=","repeats":1},{"count":616,"lower_bound":"AUFkAAAAAAAA+QFBYwAAAAAAAPk=","upper_bound":"AUFrAAAAAAAA+QFBagAAAAAAAPk=","repeats":1},{"count":624,"lower_bound":"AUFsAAAAAAAA+QFBawAAAAAAAPk=","upper_bound":"AUFzAAAAAAAA+QFBcgAAAAAAAPk=","repeats":1},{"count":632,"lower_bound":"AUF0AAAAAAAA+QFBcwAAAAAAAPk=","upper_bound":"AUIAAAAAAAAA+AFCAAAAAAAAAPg=","repeats":1},{"count":640,"lower_bound":"AUIwAAAAAAAA+QFBegAAAAAAAPk=","upper_bound":"AUI3AAAAAAAA+QFCNgAAAAAAAPk=","repeats":1},{"count":648,"lower_bound":"AUI4AAAAAAAA+QFCNwAAAAAAAPk=","upper_bound":"AUJGAAAAAAAA+QFCRAAAAAAAAPk=","repeats":1},{"count":656,"lower_bound":"AUJHAAAAAAAA+QFCRgAAAAAAAPk=","upper_bound":"AUJOAAAAAAAA+QFCTQAAAAAAAPk=","repeats":1},{"count":664,"lower_bound":"AUJPAAAAAAAA+QFCTgAAAAAAAPk=","upper_bound":"AUJWAAAAAAAA+QFCVQAAAAAAAPk=","repeats":1},{"count":672,"lower_bound":"AUJXAAAAAAAA+QFCVgAAAAAAAPk=","upper_bound":"AUJkAAAAAAAA+QFCYwAAAAAAAPk=","repeats":1},{"count":680,"lower_bound":"AUJlAAAAAAAA+QFCZAAAAAAAAPk=","upper_bound":"AUJsAAAAAAAA+QFCawAAAAAAAPk=","repeats":1},{"count":688,"lower_bound":"AUJtAAAAAAAA+QFCbAAAAAAAAPk=","upper_bound":"AUJ0AAAAAAAA+QFCcwAAAAAAAPk=","repeats":1},{"count":696,"lower_bound":"AUJ1AAAAAAAA+QFCdAAAAAAAAPk=","upper_bound":"AUMwAAAAAAAA+QFCegAAAAAAAPk=","repeats":1},{"count":704,"lower_bound":"AUMxAAAAAAAA+QFDMAAAAAAAAPk=","upper_bound":"AUM4AAAAAAAA+QFPSQAAAAAAAPk=","repeats":1},{"count":712,"lower_bound":"AUM5AAAAAAAA+QFDNwAAAAAAAPk=","upper_bound":"AUNHAAAAAAAA+QFDRQAAAAAAAPk=","repeats":1},{"count":720,"lower_bound":"AUNIAAAAAAAA+QFDRgAAAAAAAPk=","upper_bound":"AUNPAAAAAAAA+QFDTQAAAAAAAPk=","repeats":1},{"count":728,"lower_bound":"AUNQAAAAAAAA+QFDTgAAAAAAAPk=","upper_bound":"AUNXAAAAAAAA+QFDVQAAAAAAAPk=","repeats":1},{"count":736,"lower_bound":"AUNYAAAAAAAA+QFDVgAAAAAAAPk=","upper_bound":"AUNlAAAAAAAA+QFDYwAAAAAAAPk=","repeats":1},{"count":744,"lower_bound":"AUNmAAAAAAAA+QFDZAAAAAAAAPk=","upper_bound":"AUNtAAAAAAAA+QFDawAAAAAAAPk=","repeats":1},{"count":752,"lower_bound":"AUNuAAAAAAAA+QFDbAAAAAAAAPk=","upper_bound":"AUN1AAAAAAAA+QFDdAAAAAAAAPk=","repeats":1},{"count":760,"lower_bound":"AUN2AAAAAAAA+QFDdQAAAAAAAPk=","upper_bound":"AUQxAAAAAAAA+QFEMAAAAAAAAPk=","repeats":1},{"count":768,"lower_bound":"AUQyAAAAAAAA+QFEMQAAAAAAAPk=","upper_bound":"AUQ5AAAAAAAA+QFEOAAAAAAAAPk=","repeats":1},{"count":776,"lower_bound":"AURBAAAAAAAA+QFEOQAAAAAAAPk=","upper_bound":"AURIAAAAAAAA+QFERwAAAAAAAPk=","repeats":1},{"count":784,"lower_bound":"AURJAAAAAAAA+QFESAAAAAAAAPk=","upper_bound":"AURQAAAAAAAA+QFETwAAAAAAAPk=","repeats":1},{"count":792,"lower_bound":"AURRAAAAAAAA+QFEUAAAAAAAAPk=","upper_bound":"AURYAAAAAAAA+QFEVwAAAAAAAPk=","repeats":1},{"count":800,"lower_bound":"AURZAAAAAAAA+QFEWAAAAAAAAPk=","upper_bound":"AURmAAAAAAAA+QFEZQAAAAAAAPk=","repeats":1},{"count":808,"lower_bound":"AURnAAAAAAAA+QFEZgAAAAAAAPk=","upper_bound":"AURuAAAAAAAA+QFEbQAAAAAAAPk=","repeats":1},{"count":816,"lower_bound":"AURvAAAAAAAA+QFEbgAAAAAAAPk=","upper_bound":"AUR2AAAAAAAA+QFEdQAAAAAAAPk=","repeats":1},{"count":824,"lower_bound":"AUR3AAAAAAAA+QFEdgAAAAAAAPk=","upper_bound":"AUUyAAAAAAAA+QFFMQAAAAAAAPk=","repeats":1},{"count":832,"lower_bound":"AUUzAAAAAAAA+QFFMgAAAAAAAPk=","upper_bound":"AUVBAAAAAAAA+QFFOQAAAAAAAPk=","repeats":1},{"count":840,"lower_bound":"AUVCAAAAAAAA+QFFQQAAAAAAAPk=","upper_bound":"AUVJAAAAAAAA+QFFSAAAAAAAAPk=","repeats":1},{"count":848,"lower_bound":"AUVKAAAAAAAA+QFFSQAAAAAAAPk=","upper_bound":"AUVRAAAAAAAA+QFFUAAAAAAAAPk=","repeats":1},{"count":856,"lower_bound":"AUVSAAAAAAAA+QFFUQAAAAAAAPk=","upper_bound":"AUVZAAAAAAAA+QFFWAAAAAAAAPk=","repeats":1},{"count":864,"lower_bound":"AUVaAAAAAAAA+QFFWQAAAAAAAPk=","upper_bound":"AUVnAAAAAAAA+QFFZgAAAAAAAPk=","repeats":1},{"count":872,"lower_bound":"AUVoAAAAAAAA+QFFZwAAAAAAAPk=","upper_bound":"AUVvAAAAAAAA+QFFbgAAAAAAAPk=","repeats":1},{"count":880,"lower_bound":"AUVwAAAAAAAA+QFFbwAAAAAAAPk=","upper_bound":"AUV3AAAAAAAA+QFFdgAAAAAAAPk=","repeats":1},{"count":888,"lower_bound":"AUV4AAAAAAAA+QFFdwAAAAAAAPk=","upper_bound":"AUYzAAAAAAAA+QFGMgAAAAAAAPk=","repeats":1},{"count":896,"lower_bound":"AUY0AAAAAAAA+QFGMwAAAAAAAPk=","upper_bound":"AUZCAAAAAAAA+QFGQQAAAAAAAPk=","repeats":1},{"count":904,"lower_bound":"AUZDAAAAAAAA+QFGQgAAAAAAAPk=","upper_bound":"AUZKAAAAAAAA+QFGSQAAAAAAAPk=","repeats":1},{"count":912,"lower_bound":"AUZLAAAAAAAA+QFGSgAAAAAAAPk=","upper_bound":"AUZSAAAAAAAA+QFGUQAAAAAAAPk=","repeats":1},{"count":920,"lower_bound":"AUZTAAAAAAAA+QFGUgAAAAAAAPk=","upper_bound":"AUZaAAAAAAAA+QFGWQAAAAAAAPk=","repeats":1},{"count":928,"lower_bound":"AUZhAAAAAAAA+QFGWgAAAAAAAPk=","upper_bound":"AUZoAAAAAAAA+QFGZwAAAAAAAPk=","repeats":1},{"count":936,"lower_bound":"AUZpAAAAAAAA+QFGaAAAAAAAAPk=","upper_bound":"AUZwAAAAAAAA+QFGbwAAAAAAAPk=","repeats":1},{"count":944,"lower_bound":"AUZxAAAAAAAA+QFGcAAAAAAAAPk=","upper_bound":"AUZ4AAAAAAAA+QFGdwAAAAAAAPk=","repeats":1},{"count":952,"lower_bound":"AUZ5AAAAAAAA+QFGeAAAAAAAAPk=","upper_bound":"AUc0AAAAAAAA+QFHMwAAAAAAAPk=","repeats":1},{"count":960,"lower_bound":"AUc1AAAAAAAA+QFHNAAAAAAAAPk=","upper_bound":"AUdDAAAAAAAA+QFHQgAAAAAAAPk=","repeats":1},{"count":968,"lower_bound":"AUdEAAAAAAAA+QFHQwAAAAAAAPk=","upper_bound":"AUdLAAAAAAAA+QFHSgAAAAAAAPk=","repeats":1},{"count":976,"lower_bound":"AUdMAAAAAAAA+QFHSwAAAAAAAPk=","upper_bound":"AUdTAAAAAAAA+QFHUgAAAAAAAPk=","repeats":1},{"count":984,"lower_bound":"AUdUAAAAAAAA+QFHUwAAAAAAAPk=","upper_bound":"AUdhAAAAAAAA+QFHWgAAAAAAAPk=","repeats":1},{"count":992,"lower_bound":"AUdiAAAAAAAA+QFHYQAAAAAAAPk=","upper_bound":"AUdpAAAAAAAA+QFHaAAAAAAAAPk=","repeats":1},{"count":1000,"lower_bound":"AUdqAAAAAAAA+QFHaQAAAAAAAPk=","upper_bound":"AUdxAAAAAAAA+QFHcAAAAAAAAPk=","repeats":1},{"count":1008,"lower_bound":"AUdyAAAAAAAA+QFHcQAAAAAAAPk=","upper_bound":"AUd5AAAAAAAA+QFHeAAAAAAAAPk=","repeats":1},{"count":1016,"lower_bound":"AUd6AAAAAAAA+QFHeQAAAAAAAPk=","upper_bound":"AUg1AAAAAAAA+QFINAAAAAAAAPk=","repeats":1},{"count":1024,"lower_bound":"AUg2AAAAAAAA+QFINQAAAAAAAPk=","upper_bound":"AUhEAAAAAAAA+QFIQwAAAAAAAPk=","repeats":1},{"count":1032,"lower_bound":"AUhFAAAAAAAA+QFIRAAAAAAAAPk=","upper_bound":"AUhMAAAAAAAA+QFISwAAAAAAAPk=","repeats":1},{"count":1040,"lower_bound":"AUhNAAAAAAAA+QFITAAAAAAAAPk=","upper_bound":"AUhUAAAAAAAA+QFIUwAAAAAAAPk=","repeats":1},{"count":1048,"lower_bound":"AUhVAAAAAAAA+QFIVAAAAAAAAPk=","upper_bound":"AUhiAAAAAAAA+QFIYQAAAAAAAPk=","repeats":1},{"count":1056,"lower_bound":"AUhjAAAAAAAA+QFIYgAAAAAAAPk=","upper_bound":"AUhqAAAAAAAA+QFIaQAAAAAAAPk=","repeats":1},{"count":1064,"lower_bound":"AUhrAAAAAAAA+QFIagAAAAAAAPk=","upper_bound":"AUhyAAAAAAAA+QFIcQAAAAAAAPk=","repeats":1},{"count":1072,"lower_bound":"AUhzAAAAAAAA+QFIcgAAAAAAAPk=","upper_bound":"AUh6AAAAAAAA+QFIeQAAAAAAAPk=","repeats":1},{"count":1080,"lower_bound":"AUkAAAAAAAAA+AFJAAAAAAAAAPg=","upper_bound":"AUk2AAAAAAAA+QFJNQAAAAAAAPk=","repeats":1},{"count":1088,"lower_bound":"AUk3AAAAAAAA+QFJNgAAAAAAAPk=","upper_bound":"AUlFAAAAAAAA+QFJRAAAAAAAAPk=","repeats":1},{"count":1096,"lower_bound":"AUlGAAAAAAAA+QFJRQAAAAAAAPk=","upper_bound":"AUlNAAAAAAAA+QFJTAAAAAAAAPk=","repeats":1},{"count":1104,"lower_bound":"AUlOAAAAAAAA+QFJTQAAAAAAAPk=","upper_bound":"AUlVAAAAAAAA+QFJVAAAAAAAAPk=","repeats":1},{"count":1112,"lower_bound":"AUlWAAAAAAAA+QFJVQAAAAAAAPk=","upper_bound":"AUljAAAAAAAA+QFJYgAAAAAAAPk=","repeats":1},{"count":1120,"lower_bound":"AUlkAAAAAAAA+QFJYwAAAAAAAPk=","upper_bound":"AUlrAAAAAAAA+QFJagAAAAAAAPk=","repeats":1},{"count":1128,"lower_bound":"AUlsAAAAAAAA+QFJawAAAAAAAPk=","upper_bound":"AUlzAAAAAAAA+QFJcgAAAAAAAPk=","repeats":1},{"count":1136,"lower_bound":"AUl0AAAAAAAA+QFJcwAAAAAAAPk=","upper_bound":"AUoAAAAAAAAA+AFKAAAAAAAAAPg=","repeats":1},{"count":1144,"lower_bound":"AUowAAAAAAAA+QFJegAAAAAAAPk=","upper_bound":"AUo3AAAAAAAA+QFKNgAAAAAAAPk=","repeats":1},{"count":1152,"lower_bound":"AUo4AAAAAAAA+QFKNwAAAAAAAPk=","upper_bound":"AUpGAAAAAAAA+QFKRQAAAAAAAPk=","repeats":1},{"count":1160,"lower_bound":"AUpHAAAAAAAA+QFKRgAAAAAAAPk=","upper_bound":"AUpOAAAAAAAA+QFKTQAAAAAAAPk=","repeats":1},{"count":1168,"lower_bound":"AUpPAAAAAAAA+QFKTgAAAAAAAPk=","upper_bound":"AUpWAAAAAAAA+QFKVQAAAAAAAPk=","repeats":1},{"count":1176,"lower_bound":"AUpXAAAAAAAA+QFKVgAAAAAAAPk=","upper_bound":"AUpkAAAAAAAA+QFKYwAAAAAAAPk=","repeats":1},{"count":1184,"lower_bound":"AUplAAAAAAAA+QFKZAAAAAAAAPk=","upper_bound":"AUpsAAAAAAAA+QFKawAAAAAAAPk=","repeats":1},{"count":1192,"lower_bound":"AUptAAAAAAAA+QFKbAAAAAAAAPk=","upper_bound":"AUp0AAAAAAAA+QFKcwAAAAAAAPk=","repeats":1},{"count":1200,"lower_bound":"AUp1AAAAAAAA+QFKdAAAAAAAAPk=","upper_bound":"AUswAAAAAAAA+QFKegAAAAAAAPk=","repeats":1},{"count":1208,"lower_bound":"AUsxAAAAAAAA+QFLMAAAAAAAAPk=","upper_bound":"AUs4AAAAAAAA+QFLNwAAAAAAAPk=","repeats":1},{"count":1216,"lower_bound":"AUs5AAAAAAAA+QFLOAAAAAAAAPk=","upper_bound":"AUtHAAAAAAAA+QFLRgAAAAAAAPk=","repeats":1},{"count":1224,"lower_bound":"AUtIAAAAAAAA+QFLRwAAAAAAAPk=","upper_bound":"AUtPAAAAAAAA+QFLTgAAAAAAAPk=","repeats":1},{"count":1232,"lower_bound":"AUtQAAAAAAAA+QFLTwAAAAAAAPk=","upper_bound":"AUtXAAAAAAAA+QFLVgAAAAAAAPk=","repeats":1},{"count":1240,"lower_bound":"AUtYAAAAAAAA+QFLVwAAAAAAAPk=","upper_bound":"AUtlAAAAAAAA+QFLZAAAAAAAAPk=","repeats":1},{"count":1248,"lower_bound":"AUtmAAAAAAAA+QFLZQAAAAAAAPk=","upper_bound":"AUttAAAAAAAA+QFLbAAAAAAAAPk=","repeats":1},{"count":1256,"lower_bound":"AUtuAAAAAAAA+QFLbQAAAAAAAPk=","upper_bound":"AUt1AAAAAAAA+QFLdAAAAAAAAPk=","repeats":1},{"count":1264,"lower_bound":"AUt2AAAAAAAA+QFLdQAAAAAAAPk=","upper_bound":"AUwxAAAAAAAA+QFMMAAAAAAAAPk=","repeats":1},{"count":1272,"lower_bound":"AUwyAAAAAAAA+QFMMQAAAAAAAPk=","upper_bound":"AUw5AAAAAAAA+QFMOAAAAAAAAPk=","repeats":1},{"count":1280,"lower_bound":"AUxBAAAAAAAA+QFMOQAAAAAAAPk=","upper_bound":"AUxIAAAAAAAA+QFMRwAAAAAAAPk=","repeats":1},{"count":1288,"lower_bound":"AUxJAAAAAAAA+QFMSAAAAAAAAPk=","upper_bound":"AUxQAAAAAAAA+QFMTwAAAAAAAPk=","repeats":1},{"count":1296,"lower_bound":"AUxRAAAAAAAA+QFMUAAAAAAAAPk=","upper_bound":"AUxYAAAAAAAA+QFMVwAAAAAAAPk=","repeats":1},{"count":1304,"lower_bound":"AUxZAAAAAAAA+QFMWAAAAAAAAPk=","upper_bound":"AUxmAAAAAAAA+QFMZAAAAAAAAPk=","repeats":1},{"count":1312,"lower_bound":"AUxnAAAAAAAA+QFMZQAAAAAAAPk=","upper_bound":"AUxuAAAAAAAA+QFMbAAAAAAAAPk=","repeats":1},{"count":1320,"lower_bound":"AUxvAAAAAAAA+QFMbQAAAAAAAPk=","upper_bound":"AUx2AAAAAAAA+QFMdAAAAAAAAPk=","repeats":1},{"count":1328,"lower_bound":"AUx3AAAAAAAA+QFMdQAAAAAAAPk=","upper_bound":"AU0yAAAAAAAA+QFNMAAAAAAAAPk=","repeats":1},{"count":1336,"lower_bound":"AU0zAAAAAAAA+QFNMQAAAAAAAPk=","upper_bound":"AU1BAAAAAAAA+QFNOAAAAAAAAPk=","repeats":1},{"count":1344,"lower_bound":"AU1CAAAAAAAA+QFNOQAAAAAAAPk=","upper_bound":"AU1JAAAAAAAA+QFNRwAAAAAAAPk=","repeats":1},{"count":1352,"lower_bound":"AU1KAAAAAAAA+QFNSAAAAAAAAPk=","upper_bound":"AU1RAAAAAAAA+QFNTwAAAAAAAPk=","repeats":1},{"count":1360,"lower_bound":"AU1SAAAAAAAA+QFNUAAAAAAAAPk=","upper_bound":"AU1ZAAAAAAAA+QFNVwAAAAAAAPk=","repeats":1},{"count":1368,"lower_bound":"AU1aAAAAAAAA+QFNWAAAAAAAAPk=","upper_bound":"AU1nAAAAAAAA+QFNZQAAAAAAAPk=","repeats":1},{"count":1376,"lower_bound":"AU1oAAAAAAAA+QFNZgAAAAAAAPk=","upper_bound":"AU1vAAAAAAAA+QFNbQAAAAAAAPk=","repeats":1},{"count":1384,"lower_bound":"AU1wAAAAAAAA+QFNbgAAAAAAAPk=","upper_bound":"AU13AAAAAAAA+QFNdQAAAAAAAPk=","repeats":1},{"count":1392,"lower_bound":"AU14AAAAAAAA+QFNdgAAAAAAAPk=","upper_bound":"AU4zAAAAAAAA+QFOMQAAAAAAAPk=","repeats":1},{"count":1400,"lower_bound":"AU40AAAAAAAA+QFOMgAAAAAAAPk=","upper_bound":"AU5CAAAAAAAA+QFOOAAAAAAAAPk=","repeats":1},{"count":1408,"lower_bound":"AU5DAAAAAAAA+QFOOQAAAAAAAPk=","upper_bound":"AU5KAAAAAAAA+QFORwAAAAAAAPk=","repeats":1},{"count":1416,"lower_bound":"AU5LAAAAAAAA+QFOSAAAAAAAAPk=","upper_bound":"AU5SAAAAAAAA+QFOTwAAAAAAAPk=","repeats":1},{"count":1424,"lower_bound":"AU5TAAAAAAAA+QFOUAAAAAAAAPk=","upper_bound":"AU5aAAAAAAAA+QFOVwAAAAAAAPk=","repeats":1},{"count":1432,"lower_bound":"AU5hAAAAAAAA+QFOWAAAAAAAAPk=","upper_bound":"AU5oAAAAAAAA+QFOZQAAAAAAAPk=","repeats":1},{"count":1440,"lower_bound":"AU5pAAAAAAAA+QFOZgAAAAAAAPk=","upper_bound":"AU5wAAAAAAAA+QFObQAAAAAAAPk=","repeats":1},{"count":1448,"lower_bound":"AU5xAAAAAAAA+QFObgAAAAAAAPk=","upper_bound":"AU54AAAAAAAA+QFOdQAAAAAAAPk=","repeats":1},{"count":1456,"lower_bound":"AU55AAAAAAAA+QFOdgAAAAAAAPk=","upper_bound":"AU80AAAAAAAA+QFPMQAAAAAAAPk=","repeats":1},{"count":1464,"lower_bound":"AU81AAAAAAAA+QFPMgAAAAAAAPk=","upper_bound":"AU9DAAAAAAAA+QFPOQAAAAAAAPk=","repeats":1},{"count":1472,"lower_bound":"AU9EAAAAAAAA+QFPQQAAAAAAAPk=","upper_bound":"AU9LAAAAAAAA+QFPSAAAAAAAAPk=","repeats":1},{"count":1480,"lower_bound":"AU9MAAAAAAAA+QFPSgAAAAAAAPk=","upper_bound":"AU9TAAAAAAAA+QFPUQAAAAAAAPk=","repeats":1},{"count":1488,"lower_bound":"AU9UAAAAAAAA+QFPUgAAAAAAAPk=","upper_bound":"AU9hAAAAAAAA+QFPWgAAAAAAAPk=","repeats":1},{"count":1496,"lower_bound":"AU9iAAAAAAAA+QFPYQAAAAAAAPk=","upper_bound":"AU9pAAAAAAAA+QFPaAAAAAAAAPk=","repeats":1},{"count":1504,"lower_bound":"AU9qAAAAAAAA+QFPaQAAAAAAAPk=","upper_bound":"AU9xAAAAAAAA+QFPcAAAAAAAAPk=","repeats":1},{"count":1512,"lower_bound":"AU9yAAAAAAAA+QFPcgAAAAAAAPk=","upper_bound":"AU95AAAAAAAA+QFPeQAAAAAAAPk=","repeats":1},{"count":1520,"lower_bound":"AU96AAAAAAAA+QFPegAAAAAAAPk=","upper_bound":"AVA1AAAAAAAA+QFQNQAAAAAAAPk=","repeats":1},{"count":1528,"lower_bound":"AVA2AAAAAAAA+QFQNgAAAAAAAPk=","upper_bound":"AVBEAAAAAAAA+QFQRAAAAAAAAPk=","repeats":1},{"count":1536,"lower_bound":"AVBFAAAAAAAA+QFQRQAAAAAAAPk=","upper_bound":"AVBMAAAAAAAA+QFQTAAAAAAAAPk=","repeats":1},{"count":1544,"lower_bound":"AVBNAAAAAAAA+QFQTQAAAAAAAPk=","upper_bound":"AVBUAAAAAAAA+QFQVAAAAAAAAPk=","repeats":1},{"count":1552,"lower_bound":"AVBVAAAAAAAA+QFQVQAAAAAAAPk=","upper_bound":"AVBiAAAAAAAA+QFQYgAAAAAAAPk=","repeats":1},{"count":1560,"lower_bound":"AVBjAAAAAAAA+QFQYwAAAAAAAPk=","upper_bound":"AVBqAAAAAAAA+QFQagAAAAAAAPk=","repeats":1},{"count":1568,"lower_bound":"AVBrAAAAAAAA+QFQawAAAAAAAPk=","upper_bound":"AVByAAAAAAAA+QFQcgAAAAAAAPk=","repeats":1},{"count":1576,"lower_bound":"AVBzAAAAAAAA+QFQcwAAAAAAAPk=","upper_bound":"AVB6AAAAAAAA+QFQegAAAAAAAPk=","repeats":1},{"count":1584,"lower_bound":"AVEAAAAAAAAA+AFRAAAAAAAAAPg=","upper_bound":"AVE2AAAAAAAA+QFRNgAAAAAAAPk=","repeats":1},{"count":1592,"lower_bound":"AVE3AAAAAAAA+QFRNwAAAAAAAPk=","upper_bound":"AVFFAAAAAAAA+QFRRQAAAAAAAPk=","repeats":1},{"count":1600,"lower_bound":"AVFGAAAAAAAA+QFRRgAAAAAAAPk=","upper_bound":"AVFNAAAAAAAA+QFRTQAAAAAAAPk=","repeats":1},{"count":1608,"lower_bound":"AVFOAAAAAAAA+QFRTgAAAAAAAPk=","upper_bound":"AVFVAAAAAAAA+QFRVQAAAAAAAPk=","repeats":1},{"count":1616,"lower_bound":"AVFWAAAAAAAA+QFRVgAAAAAAAPk=","upper_bound":"AVFjAAAAAAAA+QFRYwAAAAAAAPk=","repeats":1},{"count":1624,"lower_bound":"AVFkAAAAAAAA+QFRZAAAAAAAAPk=","upper_bound":"AVFrAAAAAAAA+QFRawAAAAAAAPk=","repeats":1},{"count":1632,"lower_bound":"AVFsAAAAAAAA+QFRbAAAAAAAAPk=","upper_bound":"AVFzAAAAAAAA+QFRcwAAAAAAAPk=","repeats":1},{"count":1640,"lower_bound":"AVF0AAAAAAAA+QFRdAAAAAAAAPk=","upper_bound":"AVIAAAAAAAAA+AFSAAAAAAAAAPg=","repeats":1},{"count":1648,"lower_bound":"AVIwAAAAAAAA+QFSMAAAAAAAAPk=","upper_bound":"AVI3AAAAAAAA+QFSNwAAAAAAAPk=","repeats":1},{"count":1656,"lower_bound":"AVI4AAAAAAAA+QFSOAAAAAAAAPk=","upper_bound":"AVJGAAAAAAAA+QFSRgAAAAAAAPk=","repeats":1},{"count":1664,"lower_bound":"AVJHAAAAAAAA+QFSRwAAAAAAAPk=","upper_bound":"AVJOAAAAAAAA+QFSTgAAAAAAAPk=","repeats":1},{"count":1672,"lower_bound":"AVJPAAAAAAAA+QFSTwAAAAAAAPk=","upper_bound":"AVJWAAAAAAAA+QFSVgAAAAAAAPk=","repeats":1},{"count":1680,"lower_bound":"AVJXAAAAAAAA+QFSVwAAAAAAAPk=","upper_bound":"AVJkAAAAAAAA+QFSZAAAAAAAAPk=","repeats":1},{"count":1688,"lower_bound":"AVJlAAAAAAAA+QFSZQAAAAAAAPk=","upper_bound":"AVJsAAAAAAAA+QFSbAAAAAAAAPk=","repeats":1},{"count":1696,"lower_bound":"AVJtAAAAAAAA+QFSbQAAAAAAAPk=","upper_bound":"AVJ0AAAAAAAA+QFSdAAAAAAAAPk=","repeats":1},{"count":1704,"lower_bound":"AVJ1AAAAAAAA+QFSdQAAAAAAAPk=","upper_bound":"AVMwAAAAAAAA+QFTMAAAAAAAAPk=","repeats":1},{"count":1712,"lower_bound":"AVMxAAAAAAAA+QFTMQAAAAAAAPk=","upper_bound":"AVM4AAAAAAAA+QFTOAAAAAAAAPk=","repeats":1},{"count":1720,"lower_bound":"AVM5AAAAAAAA+QFTOQAAAAAAAPk=","upper_bound":"AVNHAAAAAAAA+QFTRwAAAAAAAPk=","repeats":1},{"count":1728,"lower_bound":"AVNIAAAAAAAA+QFTSAAAAAAAAPk=","upper_bound":"AVNPAAAAAAAA+QFTTwAAAAAAAPk=","repeats":1},{"count":1736,"lower_bound":"AVNQAAAAAAAA+QFTUAAAAAAAAPk=","upper_bound":"AVNXAAAAAAAA+QFTVwAAAAAAAPk=","repeats":1},{"count":1744,"lower_bound":"AVNYAAAAAAAA+QFTWAAAAAAAAPk=","upper_bound":"AVNlAAAAAAAA+QFTZQAAAAAAAPk=","repeats":1},{"count":1752,"lower_bound":"AVNmAAAAAAAA+QFTZgAAAAAAAPk=","upper_bound":"AVNtAAAAAAAA+QFTbQAAAAAAAPk=","repeats":1},{"count":1760,"lower_bound":"AVNuAAAAAAAA+QFTbgAAAAAAAPk=","upper_bound":"AVN1AAAAAAAA+QFTdQAAAAAAAPk=","repeats":1},{"count":1768,"lower_bound":"AVN2AAAAAAAA+QFTdgAAAAAAAPk=","upper_bound":"AVQxAAAAAAAA+QFUMQAAAAAAAPk=","repeats":1},{"count":1776,"lower_bound":"AVQyAAAAAAAA+QFUMgAAAAAAAPk=","upper_bound":"AVQ5AAAAAAAA+QFUOQAAAAAAAPk=","repeats":1},{"count":1784,"lower_bound":"AVRBAAAAAAAA+QFUQQAAAAAAAPk=","upper_bound":"AVRIAAAAAAAA+QFUSAAAAAAAAPk=","repeats":1},{"count":1792,"lower_bound":"AVRJAAAAAAAA+QFUSQAAAAAAAPk=","upper_bound":"AVRQAAAAAAAA+QFUUAAAAAAAAPk=","repeats":1},{"count":1800,"lower_bound":"AVRRAAAAAAAA+QFUUQAAAAAAAPk=","upper_bound":"AVRYAAAAAAAA+QFUWAAAAAAAAPk=","repeats":1},{"count":1808,"lower_bound":"AVRZAAAAAAAA+QFUWQAAAAAAAPk=","upper_bound":"AVRmAAAAAAAA+QFUZgAAAAAAAPk=","repeats":1},{"count":1816,"lower_bound":"AVRnAAAAAAAA+QFUZwAAAAAAAPk=","upper_bound":"AVRuAAAAAAAA+QFUbgAAAAAAAPk=","repeats":1},{"count":1824,"lower_bound":"AVRvAAAAAAAA+QFUbwAAAAAAAPk=","upper_bound":"AVR2AAAAAAAA+QFUdgAAAAAAAPk=","repeats":1},{"count":1832,"lower_bound":"AVR3AAAAAAAA+QFUdwAAAAAAAPk=","upper_bound":"AVUyAAAAAAAA+QFVMgAAAAAAAPk=","repeats":1},{"count":1840,"lower_bound":"AVUzAAAAAAAA+QFVMwAAAAAAAPk=","upper_bound":"AVVBAAAAAAAA+QFVQQAAAAAAAPk=","repeats":1},{"count":1848,"lower_bound":"AVVCAAAAAAAA+QFVQgAAAAAAAPk=","upper_bound":"AVVJAAAAAAAA+QFVSQAAAAAAAPk=","repeats":1},{"count":1856,"lower_bound":"AVVKAAAAAAAA+QFVSgAAAAAAAPk=","upper_bound":"AVVRAAAAAAAA+QFVUQAAAAAAAPk=","repeats":1},{"count":1864,"lower_bound":"AVVSAAAAAAAA+QFVUgAAAAAAAPk=","upper_bound":"AVVZAAAAAAAA+QFVWQAAAAAAAPk=","repeats":1},{"count":1872,"lower_bound":"AVVaAAAAAAAA+QFVWgAAAAAAAPk=","upper_bound":"AVVnAAAAAAAA+QFVZwAAAAAAAPk=","repeats":1},{"count":1880,"lower_bound":"AVVoAAAAAAAA+QFVaAAAAAAAAPk=","upper_bound":"AVVvAAAAAAAA+QFVbwAAAAAAAPk=","repeats":1},{"count":1888,"lower_bound":"AVVwAAAAAAAA+QFVcAAAAAAAAPk=","upper_bound":"AVV3AAAAAAAA+QFVdwAAAAAAAPk=","repeats":1},{"count":1896,"lower_bound":"AVV4AAAAAAAA+QFVeAAAAAAAAPk=","upper_bound":"AVYzAAAAAAAA+QFWMwAAAAAAAPk=","repeats":1},{"count":1904,"lower_bound":"AVY0AAAAAAAA+QFWNAAAAAAAAPk=","upper_bound":"AVZCAAAAAAAA+QFWQgAAAAAAAPk=","repeats":1},{"count":1912,"lower_bound":"AVZDAAAAAAAA+QFWQwAAAAAAAPk=","upper_bound":"AVZKAAAAAAAA+QFWSgAAAAAAAPk=","repeats":1},{"count":1920,"lower_bound":"AVZLAAAAAAAA+QFWSwAAAAAAAPk=","upper_bound":"AVZSAAAAAAAA+QFWUgAAAAAAAPk=","repeats":1},{"count":1928,"lower_bound":"AVZTAAAAAAAA+QFWUwAAAAAAAPk=","upper_bound":"AVZaAAAAAAAA+QFWWgAAAAAAAPk=","repeats":1},{"count":1936,"lower_bound":"AVZhAAAAAAAA+QFWYQAAAAAAAPk=","upper_bound":"AVZoAAAAAAAA+QFWaAAAAAAAAPk=","repeats":1},{"count":1944,"lower_bound":"AVZpAAAAAAAA+QFWaQAAAAAAAPk=","upper_bound":"AVZwAAAAAAAA+QFWcAAAAAAAAPk=","repeats":1},{"count":1952,"lower_bound":"AVZxAAAAAAAA+QFWcQAAAAAAAPk=","upper_bound":"AVZ4AAAAAAAA+QFWeAAAAAAAAPk=","repeats":1},{"count":1960,"lower_bound":"AVZ5AAAAAAAA+QFWeQAAAAAAAPk=","upper_bound":"AVc0AAAAAAAA+QFXNAAAAAAAAPk=","repeats":1},{"count":1968,"lower_bound":"AVc1AAAAAAAA+QFXNQAAAAAAAPk=","upper_bound":"AVdDAAAAAAAA+QFXQwAAAAAAAPk=","repeats":1},{"count":1976,"lower_bound":"AVdEAAAAAAAA+QFXRAAAAAAAAPk=","upper_bound":"AWIAAAAAAAAA+AFiAAAAAAAAAPg=","repeats":1},{"count":1984,"lower_bound":"AWMAAAAAAAAA+AFjAAAAAAAAAPg=","upper_bound":"AWoAAAAAAAAA+AFqAAAAAAAAAPg=","repeats":1},{"count":1992,"lower_bound":"AWsAAAAAAAAA+AFrAAAAAAAAAPg=","upper_bound":"AXIAAAAAAAAA+AFyAAAAAAAAAPg=","repeats":1},{"count":2000,"lower_bound":"AXMAAAAAAAAA+AFzAAAAAAAAAPg=","upper_bound":"AXoAAAAAAAAA+AF6AAAAAAAAAPg=","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952043425464320}},"count":2000,"modify_count":0,"version":0} diff --git a/cmd/explaintest/s/explain_complex_stats_st.json b/cmd/explaintest/s/explain_complex_stats_st.json deleted file mode 100644 index e7a2d4d84827f..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_st.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"st","columns":{"aid":{"histogram":{"ndv":2,"buckets":[{"count":1031,"lower_bound":"Y24uc2JrY3E=","upper_bound":"Y24uc2JrY3E=","repeats":516},{"count":1999,"lower_bound":"dXMuc2JrY3E=","upper_bound":"dXMuc2JrY3E=","repeats":484}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952032435863552},"cm":{"histogram":{"ndv":1600,"buckets":[{"count":7,"lower_bound":"MTAwMg==","upper_bound":"MTAwNw==","repeats":1},{"count":13,"lower_bound":"MTAwOA==","upper_bound":"MTAxOQ==","repeats":1},{"count":19,"lower_bound":"MTAyMA==","upper_bound":"MTA0MA==","repeats":1},{"count":25,"lower_bound":"MTA0Ng==","upper_bound":"MTA0OA==","repeats":2},{"count":31,"lower_bound":"MTA2NQ==","upper_bound":"MTA4OA==","repeats":1},{"count":37,"lower_bound":"MTEwMQ==","upper_bound":"MTEwMw==","repeats":1},{"count":43,"lower_bound":"MTEwNQ==","upper_bound":"MTEwOQ==","repeats":1},{"count":49,"lower_bound":"MTExOQ==","upper_bound":"MTEyOA==","repeats":1},{"count":55,"lower_bound":"MTEzMQ==","upper_bound":"MTEzNw==","repeats":1},{"count":61,"lower_bound":"MTE0NQ==","upper_bound":"MTE1OA==","repeats":1},{"count":67,"lower_bound":"MTE2Ng==","upper_bound":"MTE3MA==","repeats":1},{"count":73,"lower_bound":"MTE3Nw==","upper_bound":"MTE3OQ==","repeats":1},{"count":79,"lower_bound":"MTE4NA==","upper_bound":"MTE4Nw==","repeats":1},{"count":85,"lower_bound":"MTE4OQ==","upper_bound":"MTE5MQ==","repeats":1},{"count":91,"lower_bound":"MTE5NA==","upper_bound":"MTIwNg==","repeats":1},{"count":97,"lower_bound":"MTIxOQ==","upper_bound":"MTIyNA==","repeats":1},{"count":107,"lower_bound":"MTIzMQ==","upper_bound":"MTI0OA==","repeats":3},{"count":113,"lower_bound":"MTI2Mw==","upper_bound":"MTI3MQ==","repeats":1},{"count":119,"lower_bound":"MTI3NQ==","upper_bound":"MTI4MA==","repeats":1},{"count":125,"lower_bound":"MTI4Mg==","upper_bound":"MTI4OQ==","repeats":1},{"count":131,"lower_bound":"MTI5Mw==","upper_bound":"MTMwNQ==","repeats":1},{"count":137,"lower_bound":"MTMwOQ==","upper_bound":"MTMxNA==","repeats":1},{"count":143,"lower_bound":"MTMyNA==","upper_bound":"MTMyOA==","repeats":1},{"count":149,"lower_bound":"MTMzMg==","upper_bound":"MTMzOA==","repeats":1},{"count":155,"lower_bound":"MTMzOQ==","upper_bound":"MTM0OQ==","repeats":1},{"count":161,"lower_bound":"MTM1Mg==","upper_bound":"MTM1Mw==","repeats":2},{"count":167,"lower_bound":"MTM2NA==","upper_bound":"MTM2Nw==","repeats":1},{"count":173,"lower_bound":"MTM3Mg==","upper_bound":"MTM3OA==","repeats":1},{"count":179,"lower_bound":"MTM4MQ==","upper_bound":"MTM4OQ==","repeats":2},{"count":185,"lower_bound":"MTM5Ng==","upper_bound":"MTM5OA==","repeats":1},{"count":193,"lower_bound":"MTQwMg==","upper_bound":"MTQxMw==","repeats":2},{"count":199,"lower_bound":"MTQxNQ==","upper_bound":"MTQzOA==","repeats":1},{"count":205,"lower_bound":"MTQ0MA==","upper_bound":"MTQ1OA==","repeats":1},{"count":211,"lower_bound":"MTQ1OQ==","upper_bound":"MTQ3MQ==","repeats":1},{"count":217,"lower_bound":"MTQ3Ng==","upper_bound":"MTQ4MQ==","repeats":1},{"count":223,"lower_bound":"MTQ4NA==","upper_bound":"MTQ4OA==","repeats":1},{"count":229,"lower_bound":"MTQ5Mg==","upper_bound":"MTUwMw==","repeats":1},{"count":235,"lower_bound":"MTUwNg==","upper_bound":"MTUwNw==","repeats":1},{"count":241,"lower_bound":"MTUxMA==","upper_bound":"MTUxNg==","repeats":1},{"count":247,"lower_bound":"MTUyNA==","upper_bound":"MTUzMA==","repeats":1},{"count":253,"lower_bound":"MTUzMw==","upper_bound":"MTUzNQ==","repeats":1},{"count":259,"lower_bound":"MTU1NQ==","upper_bound":"MTU1OQ==","repeats":2},{"count":265,"lower_bound":"MTU3NQ==","upper_bound":"MTU3OQ==","repeats":1},{"count":271,"lower_bound":"MTU4OA==","upper_bound":"MTYwNw==","repeats":1},{"count":277,"lower_bound":"MTYxOQ==","upper_bound":"MTYyMg==","repeats":1},{"count":285,"lower_bound":"MTYyMw==","upper_bound":"MTYzMw==","repeats":2},{"count":291,"lower_bound":"MTYzNw==","upper_bound":"MTY1Mg==","repeats":1},{"count":297,"lower_bound":"MTY2Nw==","upper_bound":"MTY3MA==","repeats":1},{"count":303,"lower_bound":"MTY3NQ==","upper_bound":"MTY3Ng==","repeats":1},{"count":309,"lower_bound":"MTY3Nw==","upper_bound":"MTY3OQ==","repeats":1},{"count":315,"lower_bound":"MTY4Mg==","upper_bound":"MTY4NA==","repeats":1},{"count":321,"lower_bound":"MTY4OA==","upper_bound":"MTY5NA==","repeats":1},{"count":327,"lower_bound":"MTcwMg==","upper_bound":"MTcwNA==","repeats":2},{"count":333,"lower_bound":"MTcxMQ==","upper_bound":"MTcyMA==","repeats":1},{"count":339,"lower_bound":"MTcyNA==","upper_bound":"MTczMg==","repeats":1},{"count":345,"lower_bound":"MTczNQ==","upper_bound":"MTc0MA==","repeats":1},{"count":351,"lower_bound":"MTc0NQ==","upper_bound":"MTc1MA==","repeats":1},{"count":357,"lower_bound":"MTc1NQ==","upper_bound":"MTc1OA==","repeats":1},{"count":363,"lower_bound":"MTc2MA==","upper_bound":"MTc2NA==","repeats":1},{"count":369,"lower_bound":"MTc2NQ==","upper_bound":"MTc4Mg==","repeats":1},{"count":375,"lower_bound":"MTgwMA==","upper_bound":"MTgwOQ==","repeats":1},{"count":383,"lower_bound":"MTgxMQ==","upper_bound":"MTgyMA==","repeats":1},{"count":391,"lower_bound":"MTgyMw==","upper_bound":"MTgzNw==","repeats":1},{"count":399,"lower_bound":"MTg0Mw==","upper_bound":"MTg1OA==","repeats":1},{"count":407,"lower_bound":"MTg2Mw==","upper_bound":"MTg3Mw==","repeats":1},{"count":415,"lower_bound":"MTg3NA==","upper_bound":"MTg4NA==","repeats":1},{"count":423,"lower_bound":"MTg5MQ==","upper_bound":"MTkwMA==","repeats":1},{"count":431,"lower_bound":"MTkwNw==","upper_bound":"MTkxNQ==","repeats":1},{"count":439,"lower_bound":"MTkxNg==","upper_bound":"MTkxOQ==","repeats":2},{"count":447,"lower_bound":"MTkyMQ==","upper_bound":"MTkzNw==","repeats":1},{"count":455,"lower_bound":"MTk0MA==","upper_bound":"MTk1NQ==","repeats":1},{"count":463,"lower_bound":"MTk2NQ==","upper_bound":"MTk4MA==","repeats":1},{"count":473,"lower_bound":"MTk4Mg==","upper_bound":"MjAwNA==","repeats":2},{"count":481,"lower_bound":"MjAxNQ==","upper_bound":"MjAyNg==","repeats":1},{"count":489,"lower_bound":"MjAyNw==","upper_bound":"MjAzOQ==","repeats":1},{"count":497,"lower_bound":"MjA0MQ==","upper_bound":"MjA1Mw==","repeats":1},{"count":505,"lower_bound":"MjA2Mw==","upper_bound":"MjA3Mw==","repeats":1},{"count":517,"lower_bound":"MjA3NQ==","upper_bound":"MjA5Ng==","repeats":3},{"count":525,"lower_bound":"MjEwMA==","upper_bound":"MjEwOQ==","repeats":1},{"count":533,"lower_bound":"MjExMQ==","upper_bound":"MjEzNQ==","repeats":1},{"count":541,"lower_bound":"MjE0Mg==","upper_bound":"MjE0Nw==","repeats":2},{"count":551,"lower_bound":"MjE1MA==","upper_bound":"MjE2MA==","repeats":2},{"count":559,"lower_bound":"MjE2Mg==","upper_bound":"MjE3Mg==","repeats":1},{"count":567,"lower_bound":"MjE3Mw==","upper_bound":"MjE4NQ==","repeats":1},{"count":575,"lower_bound":"MjE5NA==","upper_bound":"MjIwOQ==","repeats":1},{"count":583,"lower_bound":"MjIxOA==","upper_bound":"MjIzMQ==","repeats":1},{"count":591,"lower_bound":"MjIzNA==","upper_bound":"MjI0Ng==","repeats":1},{"count":601,"lower_bound":"MjI1Mg==","upper_bound":"MjI1Ng==","repeats":2},{"count":609,"lower_bound":"MjI3MQ==","upper_bound":"MjI3Nw==","repeats":1},{"count":617,"lower_bound":"MjI4Mw==","upper_bound":"MjMwNw==","repeats":1},{"count":625,"lower_bound":"MjMxMg==","upper_bound":"MjMzOA==","repeats":1},{"count":633,"lower_bound":"MjM0Mg==","upper_bound":"MjM0OA==","repeats":2},{"count":641,"lower_bound":"MjM0OQ==","upper_bound":"MjM3MA==","repeats":1},{"count":649,"lower_bound":"MjM3MQ==","upper_bound":"MjM4Mw==","repeats":1},{"count":657,"lower_bound":"MjM4NA==","upper_bound":"MjM5Mg==","repeats":1},{"count":665,"lower_bound":"MjM5NA==","upper_bound":"MjM5OQ==","repeats":1},{"count":675,"lower_bound":"MjQwMg==","upper_bound":"MjQwNw==","repeats":2},{"count":683,"lower_bound":"MjQxMg==","upper_bound":"MjQyNg==","repeats":1},{"count":691,"lower_bound":"MjQyOQ==","upper_bound":"MjQ0MQ==","repeats":1},{"count":699,"lower_bound":"MjQ0NA==","upper_bound":"MjQ0Nw==","repeats":2},{"count":709,"lower_bound":"MjQ0OQ==","upper_bound":"MjQ1Ng==","repeats":2},{"count":717,"lower_bound":"MjQ1OQ==","upper_bound":"MjQ3Ng==","repeats":1},{"count":725,"lower_bound":"MjQ4Ng==","upper_bound":"MjUwNg==","repeats":1},{"count":733,"lower_bound":"MjUwOA==","upper_bound":"MjUxOQ==","repeats":1},{"count":741,"lower_bound":"MjUyMw==","upper_bound":"MjUyNw==","repeats":1},{"count":749,"lower_bound":"MjUyOA==","upper_bound":"MjU0Mg==","repeats":1},{"count":757,"lower_bound":"MjU1MQ==","upper_bound":"MjU1OQ==","repeats":1},{"count":765,"lower_bound":"MjU2MQ==","upper_bound":"MjU3MA==","repeats":1},{"count":773,"lower_bound":"MjU3NQ==","upper_bound":"MjU5NQ==","repeats":1},{"count":781,"lower_bound":"MjYxNA==","upper_bound":"MjYxOA==","repeats":2},{"count":789,"lower_bound":"MjYzMg==","upper_bound":"MjYzOA==","repeats":1},{"count":797,"lower_bound":"MjY0MA==","upper_bound":"MjY1MQ==","repeats":1},{"count":805,"lower_bound":"MjY1Mg==","upper_bound":"MjY1Ng==","repeats":1},{"count":813,"lower_bound":"MjY2NQ==","upper_bound":"MjY3OA==","repeats":1},{"count":821,"lower_bound":"MjY4Ng==","upper_bound":"MjY5NA==","repeats":1},{"count":829,"lower_bound":"MjcwNw==","upper_bound":"MjcyMg==","repeats":1},{"count":837,"lower_bound":"MjcyNQ==","upper_bound":"MjczMw==","repeats":2},{"count":845,"lower_bound":"MjczOA==","upper_bound":"Mjc0OQ==","repeats":1},{"count":853,"lower_bound":"Mjc2MQ==","upper_bound":"Mjc3Ng==","repeats":1},{"count":861,"lower_bound":"Mjc3OQ==","upper_bound":"Mjc4Nw==","repeats":2},{"count":869,"lower_bound":"Mjc5Mg==","upper_bound":"MjgwNQ==","repeats":1},{"count":877,"lower_bound":"MjgwOQ==","upper_bound":"MjgxOQ==","repeats":1},{"count":885,"lower_bound":"MjgyMA==","upper_bound":"Mjg0Mg==","repeats":1},{"count":893,"lower_bound":"Mjg0NA==","upper_bound":"Mjg1OA==","repeats":1},{"count":901,"lower_bound":"Mjg2Nw==","upper_bound":"Mjg3Mw==","repeats":1},{"count":909,"lower_bound":"Mjg3Ng==","upper_bound":"Mjg4Mw==","repeats":1},{"count":917,"lower_bound":"Mjg4NA==","upper_bound":"Mjg5Mg==","repeats":1},{"count":925,"lower_bound":"Mjg5NQ==","upper_bound":"MjkxMg==","repeats":1},{"count":933,"lower_bound":"MjkxMw==","upper_bound":"MjkyMg==","repeats":1},{"count":943,"lower_bound":"MjkyNA==","upper_bound":"MjkzOA==","repeats":2},{"count":951,"lower_bound":"MjkzOQ==","upper_bound":"Mjk2Mw==","repeats":1},{"count":961,"lower_bound":"Mjk2OQ==","upper_bound":"Mjk3OQ==","repeats":3},{"count":969,"lower_bound":"Mjk4Nw==","upper_bound":"Mjk5NQ==","repeats":1},{"count":977,"lower_bound":"Mjk5OQ==","upper_bound":"MzAxNQ==","repeats":1},{"count":985,"lower_bound":"MzAyMQ==","upper_bound":"MzAzMA==","repeats":1},{"count":993,"lower_bound":"MzAzMg==","upper_bound":"MzA0NQ==","repeats":1},{"count":1001,"lower_bound":"MzA1MA==","upper_bound":"MzA2NQ==","repeats":1},{"count":1011,"lower_bound":"MzA2OA==","upper_bound":"MzA4NA==","repeats":2},{"count":1019,"lower_bound":"MzA4OA==","upper_bound":"MzExNg==","repeats":1},{"count":1027,"lower_bound":"MzEyNA==","upper_bound":"MzE0MA==","repeats":1},{"count":1035,"lower_bound":"MzE1Nw==","upper_bound":"MzE3NA==","repeats":1},{"count":1043,"lower_bound":"MzE3OA==","upper_bound":"MzE5OA==","repeats":1},{"count":1051,"lower_bound":"MzE5OQ==","upper_bound":"MzIxMw==","repeats":1},{"count":1059,"lower_bound":"MzIxNA==","upper_bound":"MzI0MQ==","repeats":1},{"count":1067,"lower_bound":"MzI0NA==","upper_bound":"MzI1Mg==","repeats":1},{"count":1075,"lower_bound":"MzI1Ng==","upper_bound":"MzI2MQ==","repeats":1},{"count":1083,"lower_bound":"MzI3Mg==","upper_bound":"MzI3Ng==","repeats":1},{"count":1093,"lower_bound":"MzI3OA==","upper_bound":"MzI4OQ==","repeats":2},{"count":1101,"lower_bound":"MzI5MA==","upper_bound":"MzMwMw==","repeats":1},{"count":1109,"lower_bound":"MzMwNQ==","upper_bound":"MzMyMA==","repeats":1},{"count":1117,"lower_bound":"MzMyMQ==","upper_bound":"MzMzNw==","repeats":1},{"count":1125,"lower_bound":"MzM0MQ==","upper_bound":"MzM1MA==","repeats":1},{"count":1133,"lower_bound":"MzM1MQ==","upper_bound":"MzM3NA==","repeats":1},{"count":1141,"lower_bound":"MzM4Mg==","upper_bound":"MzQwMw==","repeats":1},{"count":1149,"lower_bound":"MzQwOA==","upper_bound":"MzQxNw==","repeats":1},{"count":1157,"lower_bound":"MzQyNg==","upper_bound":"MzQ0MQ==","repeats":1},{"count":1165,"lower_bound":"MzQ0NA==","upper_bound":"MzQ1Ng==","repeats":1},{"count":1173,"lower_bound":"MzQ1OA==","upper_bound":"MzQ2Mg==","repeats":1},{"count":1181,"lower_bound":"MzQ2NA==","upper_bound":"MzQ2OQ==","repeats":1},{"count":1189,"lower_bound":"MzQ3MQ==","upper_bound":"MzQ5OA==","repeats":1},{"count":1197,"lower_bound":"MzUwMQ==","upper_bound":"MzUxMg==","repeats":2},{"count":1205,"lower_bound":"MzUxMw==","upper_bound":"MzUzNQ==","repeats":1},{"count":1213,"lower_bound":"MzU0Ng==","upper_bound":"MzU1NA==","repeats":1},{"count":1221,"lower_bound":"MzU1NQ==","upper_bound":"MzU2OQ==","repeats":1},{"count":1229,"lower_bound":"MzU3Mg==","upper_bound":"MzU4Ng==","repeats":1},{"count":1237,"lower_bound":"MzU5MA==","upper_bound":"MzYwMg==","repeats":1},{"count":1245,"lower_bound":"MzYwMw==","upper_bound":"MzYyNw==","repeats":1},{"count":1255,"lower_bound":"MzYzMA==","upper_bound":"MzY0MQ==","repeats":3},{"count":1263,"lower_bound":"MzY0Mg==","upper_bound":"MzY0Nw==","repeats":1},{"count":1273,"lower_bound":"MzY2MA==","upper_bound":"MzY2NA==","repeats":3},{"count":1281,"lower_bound":"MzY3NQ==","upper_bound":"MzY4Mw==","repeats":1},{"count":1289,"lower_bound":"MzY4NA==","upper_bound":"MzcwNQ==","repeats":1},{"count":1297,"lower_bound":"MzcwOA==","upper_bound":"MzcyNQ==","repeats":1},{"count":1305,"lower_bound":"MzczNA==","upper_bound":"Mzc3Mg==","repeats":1},{"count":1313,"lower_bound":"Mzc4Nw==","upper_bound":"MzgxNA==","repeats":1},{"count":1321,"lower_bound":"MzgxOA==","upper_bound":"MzgyNw==","repeats":1},{"count":1329,"lower_bound":"MzgzMw==","upper_bound":"Mzg0OQ==","repeats":1},{"count":1337,"lower_bound":"Mzg1Ng==","upper_bound":"Mzg3NA==","repeats":1},{"count":1345,"lower_bound":"Mzg3Nw==","upper_bound":"Mzg5MA==","repeats":1},{"count":1355,"lower_bound":"Mzg5OA==","upper_bound":"MzkxNA==","repeats":2},{"count":1363,"lower_bound":"MzkxNg==","upper_bound":"MzkyNg==","repeats":1},{"count":1373,"lower_bound":"MzkyOA==","upper_bound":"MzkzMw==","repeats":2},{"count":1381,"lower_bound":"MzkzNA==","upper_bound":"Mzk0Mw==","repeats":1},{"count":1389,"lower_bound":"Mzk0Nw==","upper_bound":"Mzk1Mw==","repeats":1},{"count":1397,"lower_bound":"Mzk1NA==","upper_bound":"Mzk2MQ==","repeats":2},{"count":1405,"lower_bound":"Mzk2OA==","upper_bound":"Mzk3Ng==","repeats":1},{"count":1413,"lower_bound":"Mzk4Mg==","upper_bound":"NDAwMg==","repeats":1},{"count":1425,"lower_bound":"NDAwNQ==","upper_bound":"NDAxMw==","repeats":3},{"count":1435,"lower_bound":"NDAxNg==","upper_bound":"NDAyOQ==","repeats":2},{"count":1447,"lower_bound":"NDA0MA==","upper_bound":"NDA0Mg==","repeats":3},{"count":1455,"lower_bound":"NDA0Mw==","upper_bound":"NDA1MQ==","repeats":1},{"count":1463,"lower_bound":"NDA2MQ==","upper_bound":"NDA3MQ==","repeats":1},{"count":1471,"lower_bound":"NDA3NA==","upper_bound":"NDA3Nw==","repeats":1},{"count":1479,"lower_bound":"NDA4MA==","upper_bound":"NDA4Ng==","repeats":1},{"count":1489,"lower_bound":"NDA5MA==","upper_bound":"NDA5Mg==","repeats":2},{"count":1497,"lower_bound":"NDA5Ng==","upper_bound":"NDEwNg==","repeats":1},{"count":1505,"lower_bound":"NDEwNw==","upper_bound":"NDEyMA==","repeats":1},{"count":1513,"lower_bound":"NDEyNQ==","upper_bound":"NDE0NQ==","repeats":1},{"count":1521,"lower_bound":"NDE1Mw==","upper_bound":"NDE1OA==","repeats":1},{"count":1529,"lower_bound":"NDE2Mg==","upper_bound":"NDE2OA==","repeats":1},{"count":1537,"lower_bound":"NDE3Mg==","upper_bound":"NDE3Ng==","repeats":1},{"count":1545,"lower_bound":"NDE3OA==","upper_bound":"NDE5NQ==","repeats":1},{"count":1555,"lower_bound":"NDIwMw==","upper_bound":"NDIwOA==","repeats":2},{"count":1563,"lower_bound":"NDIxMQ==","upper_bound":"NDIzNA==","repeats":1},{"count":1571,"lower_bound":"NDIzNg==","upper_bound":"NDIzOA==","repeats":2},{"count":1579,"lower_bound":"NDI0Mg==","upper_bound":"NDI1Mw==","repeats":1},{"count":1587,"lower_bound":"NDI1Ng==","upper_bound":"NDI3Mg==","repeats":1},{"count":1595,"lower_bound":"NDI3Ng==","upper_bound":"NDI4Nw==","repeats":2},{"count":1605,"lower_bound":"NDI4OQ==","upper_bound":"NDI5MQ==","repeats":3},{"count":1613,"lower_bound":"NDI5Ng==","upper_bound":"NDMwOA==","repeats":1},{"count":1621,"lower_bound":"NDMxMQ==","upper_bound":"NDMyNQ==","repeats":1},{"count":1629,"lower_bound":"NDMyOA==","upper_bound":"NDMzNA==","repeats":1},{"count":1637,"lower_bound":"NDMzNQ==","upper_bound":"NDM0Nw==","repeats":1},{"count":1647,"lower_bound":"NDM1NQ==","upper_bound":"NDM2Ng==","repeats":2},{"count":1655,"lower_bound":"NDM4MA==","upper_bound":"NDM4NA==","repeats":1},{"count":1663,"lower_bound":"NDM5Mw==","upper_bound":"NDQwOA==","repeats":1},{"count":1673,"lower_bound":"NDQxMg==","upper_bound":"NDQyMg==","repeats":2},{"count":1681,"lower_bound":"NDQzMQ==","upper_bound":"NDQzNw==","repeats":1},{"count":1689,"lower_bound":"NDQzOQ==","upper_bound":"NDQ0NA==","repeats":1},{"count":1697,"lower_bound":"NDQ1MQ==","upper_bound":"NDQ1OQ==","repeats":1},{"count":1709,"lower_bound":"NDQ2Mw==","upper_bound":"NDQ4NA==","repeats":3},{"count":1717,"lower_bound":"NDQ4Nw==","upper_bound":"NDQ5OA==","repeats":2},{"count":1725,"lower_bound":"NDUwMA==","upper_bound":"NDUwNA==","repeats":1},{"count":1733,"lower_bound":"NDUwOQ==","upper_bound":"NDUxNA==","repeats":1},{"count":1741,"lower_bound":"NDUyMA==","upper_bound":"NDUzNg==","repeats":1},{"count":1749,"lower_bound":"NDUzOA==","upper_bound":"NDU0NA==","repeats":1},{"count":1757,"lower_bound":"NDU0OQ==","upper_bound":"NDU1OQ==","repeats":1},{"count":1765,"lower_bound":"NDU2MQ==","upper_bound":"NDU3MQ==","repeats":2},{"count":1775,"lower_bound":"NDU4Mw==","upper_bound":"NDU5OQ==","repeats":2},{"count":1783,"lower_bound":"NDYwMg==","upper_bound":"NDYxOQ==","repeats":1},{"count":1793,"lower_bound":"NDYyMA==","upper_bound":"NDYyNQ==","repeats":2},{"count":1801,"lower_bound":"NDYzMQ==","upper_bound":"NDY1MQ==","repeats":1},{"count":1809,"lower_bound":"NDY1Mg==","upper_bound":"NDY2NQ==","repeats":1},{"count":1817,"lower_bound":"NDY2Nw==","upper_bound":"NDY3OQ==","repeats":1},{"count":1825,"lower_bound":"NDY4Mg==","upper_bound":"NDY5Nw==","repeats":1},{"count":1833,"lower_bound":"NDcwNg==","upper_bound":"NDcxNQ==","repeats":1},{"count":1841,"lower_bound":"NDcxOA==","upper_bound":"NDcyNQ==","repeats":1},{"count":1849,"lower_bound":"NDczMg==","upper_bound":"NDc0NQ==","repeats":2},{"count":1857,"lower_bound":"NDc1Mg==","upper_bound":"NDc2Mw==","repeats":1},{"count":1865,"lower_bound":"NDc3OQ==","upper_bound":"NDc5Mg==","repeats":1},{"count":1875,"lower_bound":"NDc5NQ==","upper_bound":"NDgxMA==","repeats":2},{"count":1883,"lower_bound":"NDgxNA==","upper_bound":"NDgzMA==","repeats":1},{"count":1891,"lower_bound":"NDgzMQ==","upper_bound":"NDgzMw==","repeats":1},{"count":1899,"lower_bound":"NDgzNA==","upper_bound":"NDg2NA==","repeats":1},{"count":1907,"lower_bound":"NDg2NQ==","upper_bound":"NDg3Mg==","repeats":2},{"count":1915,"lower_bound":"NDg3NQ==","upper_bound":"NDg4NQ==","repeats":1},{"count":1923,"lower_bound":"NDg5Nw==","upper_bound":"NDkxNQ==","repeats":1},{"count":1931,"lower_bound":"NDkxOQ==","upper_bound":"NDkyNg==","repeats":1},{"count":1939,"lower_bound":"NDkyNw==","upper_bound":"NDkzNQ==","repeats":1},{"count":1947,"lower_bound":"NDkzOA==","upper_bound":"NDk0Ng==","repeats":1},{"count":1959,"lower_bound":"NDk1MA==","upper_bound":"NDk1OQ==","repeats":3},{"count":1967,"lower_bound":"NDk2MA==","upper_bound":"NDk2NA==","repeats":1},{"count":1975,"lower_bound":"NDk2NQ==","upper_bound":"NDk3NQ==","repeats":1},{"count":1983,"lower_bound":"NDk3Ng==","upper_bound":"NDk3OA==","repeats":2},{"count":1991,"lower_bound":"NDk3OQ==","upper_bound":"NDk4OA==","repeats":1},{"count":1999,"lower_bound":"NDk5MA==","upper_bound":"NTAwMA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,0,1,1,0,0,1,0,2,3,0,0,3,1,1,1,0,1,0,1,1,0,0,0,0,2,2,0,3,1,2,0,0,1,1,2,0,1,1,1,3,1,2,0,0,5,3,0,2,0,0,0,0,2,1,4,6,0,2,0,2,1,2,2,2,2,0,4,2,2,1,0,2,4,1,0,1,0,0,3,0,1,2,0,2,0,1,0,0,2,0,3,0,1,0,1,2,0,2,1,0,1,4,2,1,3,0,0,0,1,2,0,1,0,0,0,0,0,0,2,2,0,0,1,0,4,0,3,3,1,0,2,1,0,0,1,0,0,1,1,1,0,0,0,0,1,2,0,2,1,1,0,3,0,3,2,1,2,0,3,1,0,0,2,0,3,1,0,4,1,1,0,0,3,3,0,4,0,7,0,0,0,1,1,1,1,4,0,2,1,0,1,0,1,1,1,0,2,0,0,1,2,0,0,0,0,0,2,1,1,1,0,0,1,2,1,0,0,2,1,1,0,4,1,0,0,4,1,0,1,2,1,0,0,7,1,1,0,0,0,2,1,0,1,2,0,0,2,0,1,0,1,0,2,0,2,2,0,0,2,1,2,0,2,2,0,0,0,1,0,1,1,1,1,0,0,1,1,0,0,1,0,1,0,3,0,0,3,1,0,1,2,0,0,0,1,0,0,4,1,4,2,0,1,1,0,0,0,0,1,3,2,1,0,1,3,3,1,0,2,0,1,0,4,1,0,3,0,0,0,1,1,4,2,1,0,1,1,0,3,2,8,0,0,0,1,1,0,1,2,2,0,0,3,0,0,2,0,1,0,0,0,1,0,1,1,0,0,1,0,2,0,0,1,3,0,0,3,0,0,0,0,3,0,0,0,1,0,0,0,1,5,0,2,0,3,1,0,0,0,2,0,1,0,0,2,0,0,1,0,1,0,0,0,1,2,1,1,6,2,0,2,0,0,1,1,0,0,0,1,0,1,0,4,0,0,0,2,2,1,0,0,2,0,0,0,3,0,0,0,0,0,1,0,1,1,2,2,1,0,3,1,3,0,2,0,0,1,0,0,7,1,1,0,2,1,1,0,0,0,0,0,1,1,1,2,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,4,0,0,0,0,0,0,1,1,0,2,1,1,1,4,1,2,1,2,0,2,0,0,2,1,1,2,0,3,0,0,2,0,1,0,0,1,2,1,0,3,0,0,3,0,0,0,1,0,2,0,1,0,2,0,0,0,0,1,0,0,2,2,7,3,0,1,2,2,1,1,0,0,0,0,2,2,0,0,1,3,0,0,0,2,0,1,4,0,0,0,2,0,0,4,0,0,2,0,0,3,0,1,2,1,0,0,0,0,2,0,2,1,1,1,1,0,1,0,1,1,2,1,0,1,1,1,0,2,1,2,2,0,2,0,0,2,1,2,0,1,0,1,2,1,1,0,0,0,1,2,1,1,1,1,0,2,0,1,0,0,1,0,2,0,2,0,0,0,1,0,2,3,1,1,0,0,0,1,0,2,0,1,2,0,1,1,0,0,0,0,2,1,0,0,0,2,1,0,3,0,1,2,4,0,2,1,1,0,0,1,1,0,0,1,0,1,1,0,0,0,1,1,2,1,0,1,1,1,0,1,4,0,0,1,1,0,1,1,1,0,1,0,0,1,0,1,0,0,0,0,0,2,0,2,1,3,1,0,1,0,1,1,0,0,3,2,3,0,0,1,1,3,0,0,0,0,0,2,2,2,0,2,3,0,0,0,0,2,1,1,2,0,1,0,2,0,2,1,3,0,0,0,0,0,2,1,2,3,0,1,1,2,2,0,0,5,0,0,2,1,1,1,3,0,0,1,3,1,0,2,0,1,4,0,0,4,0,1,0,0,1,0,0,0,1,1,3,1,0,1,0,1,1,1,0,2,1,0,4,0,3,0,0,1,2,0,1,0,0,1,2,0,0,3,1,1,2,0,0,0,4,0,1,0,4,2,0,0,0,1,1,0,2,0,2,1,0,2,1,1,0,0,1,0,0,0,2,0,1,4,2,2,0,0,1,0,0,3,0,0,0,1,2,3,0,1,1,2,1,1,0,0,2,0,3,0,0,1,4,0,2,0,3,7,1,0,3,3,1,0,0,1,4,1,0,1,0,1,0,1,0,2,1,0,0,0,1,2,0,1,0,0,0,1,0,0,1,0,0,1,0,1,1,0,0,1,0,2,4,0,2,0,5,2,0,0,2,2,6,3,3,0,3,1,3,0,0,0,0,2,6,0,1,0,0,2,0,0,1,1,1,2,3,3,0,0,0,0,3,1,0,0,1,1,1,0,0,0,3,0,0,1,2,1,1,3,0,0,0,0,0,1,2,0,0,2,0,0,4,0,1,2,0,1,0,3,1,2,0,0,0,0,0,0,0,1,0,1,0,4,0,1,1,1,2,1,1,0,0,0,0,0,0,1,3,0,0,3,1,0,1,1,3,3,1,1,0,0,1,2,0,0,3,3,2,4,1,1,0,0,0,1,1,3,0,0,0,0,0,1,0,1,0,0,1,0,1,2,0,0,2,1,1,3,0,0,2,2,0,1,2,2,2,0,2,2,0,0,0,0,2,1,2,0,0,1,1,7,4,0,2,0,0,0,0,1,1,0,1,0,1,0,1,2,3,0,0,0,0,0,0,0,3,2,1,0,0,0,1,0,0,3,3,1,2,0,1,2,1,0,1,0,0,2,0,0,0,3,0,1,3,1,1,0,0,1,1,0,0,0,1,0,1,1,0,2,1,3,3,0,1,3,1,0,0,1,1,0,0,1,2,0,0,0,1,2,2,0,0,2,0,2,0,2,0,3,1,0,0,4,0,2,0,2,1,1,0,1,1,1,4,1,5,1,0,0,0,2,0,2,0,1,1,1,1,0,2,2,2,0,1,2,1,3,0,0,0,0,0,1,1,0,0,2,2,2,1,2,0,5,6,0,1,2,0,1,3,0,0,1,1,1,3,0,0,3,0,0,1,1,2,0,0,0,0,4,2,1,0,2,0,0,0,0,1,0,3,1,1,0,4,1,1,0,1,2,0,0,1,1,0,0,0,1,0,3,1,1,1,1,0,4,4,7,2,0,0,0,3,2,0,0,0,5,0,0,0,0,0,3,0,1,3,5,2,0,1,0,2,1,1,1,0,0,0,0,0,0,2,3,1,2,3,1,0,0,1,0,1,1,0,0,3,0,1,2,0,0,0,2,3,0,1,2,0,0,1,1,1,0,2,1,1,2,1,0,0,0,1,0,1,2,1,1,0,1,0,1,0,2,0,1,0,1,0,0,2,1,2,0,0,0,1,3,2,0,0,1,1,3,3,0,1,3,2,0,1,0,0,2,3,0,0,0,2,3,0,1,1,1,1,1,1,0,0,0,0,1,3,2,1,0,1,0,0,3,0,0,1,1,5,0,0,1,2,0,0,0,2,0,1,0,0,0,0,0,2,1,3,0,1,3,1,0,1,0,0,0,2,0,1,1,0,2,0,0,2,1,0,1,6,2,0,1,1,3,1,0,0,1,1,2,1,4,1,1,2,2,2,0,0,0,0,2,1,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,0,0,0,1,1,3,0,0,0,0,2,1,2,4,2,3,2,0,0,0,0,0,0,2,2,0,1,1,0,0,1,1,2,0,1,0,0,1,0,0,2,2,5,1,4,1,0,0,1,1,2,0,0,1,0,2,2,1,1,2,0,0,2,1,0,0,0,1,1,1,5,0,2,2,1,4,0,1,2,1,1,1,0,0,2,1,1,0,0,0,1,1,2,1,1,1,1,0,1,0,0,0,1,0,1,1,1,0,0,3,2,3,2,1,0,1,2,1,4,1,4,1,1,1,0,0,0,1,0,5,0,0,0,1,2,3,1,3,0,0,0,0,2,2,1,4,0,1,0,2,0,1,1,2,3,0,0,3,2,0,1,0,0,0,0,1,1,2,4,0,0,1,2,0,0,2,1,2,2,2,3,1,1,3,0,1,0,0,1,0,0,0,1,0,1,0,1,0,1,1,3,0,2,0,1,1,5,0,0,2,2,2,3,2,0,1,6,0,1,2,1,0,5,0,0,2,2,1,0,0,2,0,0,3,1,0,0,1,1,0,2,0,1,0,1,1,3,1,0,1,2,0,0,1,1,0,0,1,0,1,0,2,0,0,3,0,1,1,2,0,0,3,0,1,1,1,0,0,0,1,2,1,3,3,0,2,2,0,4,1,0,0,4,0,1,1,4,1,0,1,0,0,0,2,0,0,0,0,1,3,0,2,1,1,1,1,4,2,2,2,0,0,0,0,0,1,0,1,1,2,0,1,1,0,3,0,0,0,0,0,0,2,0,0,1,2,1,1,1,0,0,0,1,1,0,0,1,0,2,0,1,3,1,2,0,1,1,0,0,1,1,0,2,2,2,0,0,1,3,0,1,1,1,0,2,0,0,1,6,2,1,3,1,0,2,1,2,1,0,5,0,0,2,0,0,5,1,1,1,0,2,0]},{"counters":[2,1,0,5,0,2,0,0,0,1,1,2,0,1,1,2,3,0,3,0,0,1,2,1,3,3,0,2,0,3,0,1,2,0,1,0,4,0,0,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,3,2,1,3,5,0,0,2,2,1,3,2,0,3,0,0,0,0,0,0,1,0,1,2,0,0,1,2,1,1,3,2,1,0,0,0,1,3,0,0,0,1,2,1,2,2,1,1,0,1,0,2,0,1,0,0,4,0,0,0,0,0,6,3,1,0,3,0,2,1,3,1,1,1,2,0,0,0,0,0,0,1,1,0,2,0,0,1,3,0,2,0,0,1,1,3,1,0,1,3,0,1,1,1,0,0,1,0,0,3,1,1,0,0,0,3,3,1,2,0,1,2,0,0,0,2,2,0,3,0,2,0,0,1,0,1,0,1,0,0,1,0,1,1,0,0,2,0,2,1,4,2,0,1,2,0,0,1,0,1,1,0,0,0,2,2,3,1,1,0,1,0,0,0,0,0,0,1,0,0,0,3,0,2,1,1,0,1,1,0,4,0,0,1,0,0,0,0,0,0,1,0,3,3,1,0,2,2,4,1,0,0,0,0,1,3,1,0,1,3,0,1,0,1,0,1,0,2,0,2,3,1,0,1,0,0,1,3,0,0,3,2,0,0,0,4,1,1,0,1,3,4,0,0,0,0,1,4,1,0,0,0,0,0,3,3,0,1,2,2,3,6,0,2,1,0,3,2,0,1,2,3,0,1,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,1,5,0,0,0,0,0,1,1,0,0,0,1,0,0,2,1,0,3,1,1,0,1,0,2,0,1,1,1,2,0,1,2,2,4,0,2,0,0,1,1,0,2,0,1,0,1,2,0,4,0,1,0,1,1,4,1,0,0,0,0,3,1,0,0,0,1,1,0,0,4,1,1,2,2,3,0,0,0,3,1,0,0,1,3,0,1,0,0,2,2,1,1,3,1,0,0,6,1,0,0,2,3,0,0,0,0,0,0,2,0,0,4,0,0,1,0,2,0,1,0,0,2,3,0,0,2,0,0,2,1,2,0,2,1,0,1,1,0,1,1,1,4,1,0,0,0,1,2,2,0,2,2,1,1,0,0,0,0,0,1,0,0,1,1,2,0,2,0,2,2,0,0,0,0,0,1,1,0,3,0,0,0,0,0,1,0,1,1,2,0,1,0,0,0,0,0,2,0,2,0,5,1,1,0,0,1,0,1,0,1,0,4,1,2,1,1,1,0,0,3,2,0,0,0,1,1,5,4,1,2,1,3,0,0,0,0,0,1,0,0,1,0,0,1,0,0,2,0,0,0,1,1,1,0,2,0,1,0,0,2,0,1,0,0,1,4,1,3,2,0,0,2,0,0,3,0,3,0,1,0,0,1,2,1,1,0,0,0,1,4,0,0,0,1,0,0,1,2,1,3,1,0,2,1,1,2,0,0,0,2,2,1,2,0,0,2,1,2,0,0,0,0,1,1,1,4,1,1,0,2,0,1,0,2,1,3,0,0,4,1,2,1,1,0,0,0,0,0,1,0,1,1,2,1,3,0,0,0,3,0,0,1,1,1,1,1,0,2,1,0,0,0,0,2,4,0,2,4,0,1,1,0,1,5,1,1,0,2,1,1,2,0,1,0,5,1,1,0,2,0,2,0,1,0,0,3,0,1,0,0,0,0,4,3,0,0,3,1,1,2,0,0,0,4,0,3,0,2,0,2,0,0,2,2,2,1,1,1,0,1,1,0,0,1,2,0,1,0,1,0,0,1,2,0,1,1,0,2,2,0,0,1,0,0,0,0,0,5,2,1,2,0,0,0,0,1,2,0,0,3,5,1,2,1,0,3,0,0,1,2,0,5,0,2,0,1,0,0,6,0,1,0,0,0,0,0,1,0,0,1,1,0,0,0,1,3,1,2,0,2,1,0,0,2,1,2,4,0,2,4,1,0,2,1,0,0,1,1,1,1,0,1,1,1,0,0,1,4,0,1,4,1,1,0,1,3,2,2,0,0,2,1,5,1,2,0,1,1,3,0,0,0,0,0,3,1,0,1,1,1,0,2,2,2,0,0,0,1,0,0,0,2,0,0,0,1,1,1,0,0,2,2,1,2,1,0,1,0,1,2,0,3,1,2,0,0,0,0,3,2,1,0,0,1,2,1,2,0,2,2,0,1,0,1,1,0,0,1,4,4,1,4,0,1,2,0,1,0,2,3,0,0,0,3,1,0,3,0,0,0,2,0,1,1,0,0,0,2,0,2,0,2,0,2,6,0,2,1,2,1,1,0,0,0,2,2,2,0,0,0,0,1,0,4,0,2,1,0,2,0,4,0,1,0,1,4,0,0,4,1,0,1,1,0,0,0,1,0,1,0,4,1,0,0,0,0,1,1,1,1,0,0,0,1,2,0,1,1,1,2,3,0,0,0,0,0,0,3,1,0,0,2,0,4,0,2,0,0,2,0,0,5,1,2,2,1,1,2,0,0,2,0,0,1,0,2,1,0,0,0,2,2,0,0,3,0,0,1,0,1,1,0,0,2,0,1,0,3,0,1,1,1,0,1,3,2,0,0,2,2,1,3,1,0,1,0,1,0,4,1,2,2,3,1,0,1,0,0,0,1,4,3,0,1,0,0,2,0,1,0,0,0,2,0,1,1,0,2,1,0,0,1,1,0,2,0,1,2,0,1,2,0,0,0,2,2,0,1,2,0,5,1,3,2,1,5,3,0,1,1,0,0,0,0,2,2,1,0,1,0,0,3,0,0,2,0,4,0,2,4,3,1,1,2,1,3,1,0,0,1,5,1,1,1,0,0,1,5,1,2,0,0,1,1,0,0,1,0,0,0,2,0,0,2,1,0,1,2,0,0,0,0,2,2,0,1,2,0,0,1,2,0,0,1,0,0,0,0,2,1,0,1,1,0,0,2,0,1,2,0,4,1,0,0,1,0,2,2,1,3,0,7,0,0,0,4,1,1,0,1,1,0,0,1,0,0,1,3,1,1,0,1,0,0,1,1,0,0,1,0,0,1,4,2,0,0,2,0,0,0,0,0,0,0,1,0,0,1,0,0,2,0,0,1,0,0,1,0,4,0,2,1,6,1,1,0,4,0,1,0,2,4,1,1,0,0,1,0,4,0,0,1,1,3,1,2,0,0,1,4,2,1,0,4,0,0,4,0,0,4,0,0,0,2,1,0,1,0,2,2,1,2,1,1,0,0,0,2,1,1,1,0,0,1,1,0,2,2,1,0,0,0,1,6,0,1,1,0,0,0,2,1,0,1,0,0,2,0,1,0,3,0,0,1,3,1,0,0,1,1,1,2,0,2,1,0,0,0,0,1,0,1,0,0,0,1,0,0,1,0,0,1,2,0,1,2,0,3,3,3,3,0,0,0,1,0,4,0,0,0,0,3,1,0,0,4,0,1,0,0,0,2,0,2,0,4,2,5,0,1,0,2,2,2,0,1,5,0,1,0,0,0,0,1,6,0,0,2,0,0,0,1,0,0,0,1,1,1,2,1,2,0,0,5,0,0,1,2,0,4,0,2,0,1,1,1,2,0,0,2,0,0,0,3,1,0,2,0,0,0,2,0,1,3,1,0,1,0,5,6,2,0,3,2,1,0,2,0,0,0,2,1,1,0,1,2,1,4,1,1,0,5,1,1,1,0,0,0,1,0,2,1,3,0,0,0,0,0,1,0,0,0,1,2,0,0,0,1,0,1,0,0,0,0,1,3,1,1,1,0,1,0,0,3,1,0,3,0,2,0,1,0,2,0,1,0,0,2,2,0,2,0,1,0,0,1,0,0,1,1,0,1,0,4,0,1,0,0,1,2,1,1,1,2,1,0,0,0,3,2,0,0,0,1,0,0,3,2,2,1,0,0,0,0,0,2,0,3,6,1,2,0,0,0,0,0,1,2,0,1,0,0,0,0,0,0,1,0,2,3,1,4,2,1,0,1,0,0,2,1,2,1,1,0,4,1,0,2,1,2,0,0,4,0,0,3,0,2,0,0,1,1,0,1,3,0,0,1,0,1,0,0,2,0,2,1,0,2,1,3,2,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,3,0,1,0,1,0,2,1,1,0,1,2,0,0,0,3,0,1,0,0,1,0,3,1,0,4,0,0,0,4,1,2,1,3,1,3,0,1,1,2,3,2,1,3,0,0,3,2,0,0,1,4,0,1,1,0,1,0,0,1,0,1,0,1,0,2,3,0,1,2,1,1,0,1,0,0,1,0,1,1,0,0,0,0,2,2,2,0,0,1,2,3,0,1,1,2,4,3,0,0,1,0,1,0,1,5,2,3,3,0,0,2,0,1,1,0,2,2,4,0,1,1,0,0,2,0,3,0,3,0,1,0,0,0,2,0,2,1,0,3,1,0,3,0,0,1,0,0,0,1,1,2,4,0,1,1,0,3,4,1,0,1,0,1,0,0,0,1,2,1,0,4,1,0,1,0,1,0,0,0,4,1,1,1,0,2,0,0,3,1,2,0,2,2,0,0,0]},{"counters":[0,0,0,0,2,0,1,1,2,1,4,0,4,1,2,1,1,1,0,0,2,0,1,0,0,0,4,1,0,1,5,1,0,5,3,0,0,0,1,0,0,0,0,0,3,0,0,5,0,1,1,1,3,2,0,0,0,0,3,0,0,1,0,4,0,1,0,0,0,3,1,1,2,2,1,4,0,1,0,0,1,2,3,0,0,0,1,0,0,1,1,1,3,2,0,0,5,0,2,0,1,0,2,0,0,0,1,3,0,1,1,0,1,2,1,0,4,1,0,3,3,1,2,2,0,4,0,1,1,0,1,1,1,0,0,0,0,0,0,0,0,1,4,1,0,3,0,0,1,0,0,0,0,0,2,1,2,2,1,3,0,0,0,0,6,0,0,1,0,2,2,0,1,1,0,0,4,1,0,3,0,1,1,0,2,2,1,4,1,2,1,0,1,3,1,1,0,0,1,0,4,3,0,0,0,1,0,0,0,1,0,0,0,2,4,2,2,0,1,0,0,0,1,3,0,2,1,0,0,2,2,3,1,2,1,3,0,0,1,3,0,1,0,0,0,1,0,1,1,0,0,0,3,3,5,2,3,2,0,3,3,0,1,1,2,1,0,1,0,2,0,2,0,0,0,0,1,0,3,0,0,2,0,3,1,1,1,0,1,1,1,0,1,0,3,1,1,0,1,1,0,0,0,0,2,1,0,2,1,0,0,1,0,2,0,0,2,0,1,0,0,0,5,1,1,1,0,0,1,1,0,0,1,6,1,2,0,1,0,2,2,1,1,2,2,2,0,0,1,0,1,0,0,1,2,0,0,0,0,3,0,0,1,3,0,0,1,1,1,1,1,1,1,1,2,0,0,1,5,4,2,2,0,2,0,2,1,2,1,0,1,0,2,0,0,0,0,0,0,0,4,0,0,0,0,1,1,0,0,2,1,0,2,1,3,1,3,1,2,2,2,0,0,1,3,0,0,1,2,1,0,1,1,0,0,0,0,0,2,1,5,0,3,3,0,0,2,1,1,0,0,2,2,0,2,1,5,1,1,0,7,2,3,0,3,0,0,2,0,0,1,0,0,4,1,2,0,1,0,0,0,1,0,1,0,1,0,0,1,2,1,0,1,1,1,0,0,0,1,0,1,0,0,0,1,1,2,1,3,0,1,1,0,1,0,1,2,0,3,0,0,0,0,0,0,2,2,1,0,2,1,1,1,0,0,0,0,1,0,0,0,0,0,2,1,2,0,0,3,1,0,3,1,2,0,1,1,3,0,0,2,5,1,1,0,0,0,0,0,2,0,2,0,0,0,0,0,0,0,0,1,0,3,1,0,1,0,1,1,3,2,0,0,1,1,0,0,1,0,0,1,1,3,1,0,0,1,0,1,0,1,2,0,1,0,0,4,0,0,0,1,2,0,2,0,1,0,0,0,0,2,0,0,0,0,0,6,0,1,2,1,0,0,0,4,1,1,0,1,0,1,0,2,0,0,0,1,2,0,1,1,0,3,1,1,0,0,1,2,0,2,1,0,0,2,0,5,0,2,0,0,0,0,1,1,1,0,2,0,3,0,0,1,0,3,3,0,1,1,0,1,1,2,0,0,2,1,0,0,4,0,4,1,1,0,0,0,0,1,2,0,3,0,0,2,0,2,0,0,0,1,0,1,0,1,0,2,1,0,3,0,1,0,0,3,1,1,1,3,0,0,2,3,2,0,0,1,0,1,3,2,0,0,0,2,1,0,1,2,1,0,1,0,1,2,2,2,0,3,0,0,0,0,1,0,2,5,1,0,0,5,1,1,1,5,1,2,2,0,1,2,1,1,0,2,2,1,2,2,0,0,0,1,0,0,0,0,1,0,1,1,0,1,2,6,1,1,0,0,0,1,2,1,1,1,2,2,0,3,0,0,1,0,4,0,0,3,0,3,0,0,0,1,1,0,0,0,1,1,0,1,1,1,2,1,2,0,1,0,0,3,1,0,3,0,1,3,6,1,0,2,0,3,1,0,2,0,2,0,0,4,2,0,0,0,1,0,0,1,0,1,0,1,0,1,2,0,1,0,2,1,0,1,2,1,4,2,0,0,0,0,0,1,0,1,0,0,0,0,2,3,2,0,2,1,2,0,0,3,0,0,1,1,2,1,3,2,2,3,0,1,1,2,2,0,1,1,1,2,0,0,2,0,1,2,3,1,2,0,2,2,1,3,3,1,1,0,0,1,1,0,1,3,0,0,0,0,0,2,0,2,0,0,0,0,0,0,1,0,2,2,0,0,1,1,1,2,1,0,1,0,3,0,1,0,1,3,3,0,2,0,1,1,2,1,1,1,1,0,1,2,0,1,2,3,0,0,1,3,0,0,0,0,2,0,1,1,0,1,1,0,1,0,1,0,0,2,2,2,0,0,0,2,0,0,0,0,1,0,1,0,1,3,3,1,0,2,1,1,4,2,5,0,0,0,2,0,3,0,1,1,2,0,1,0,1,1,1,2,0,0,1,1,0,0,0,0,2,1,0,0,0,6,0,0,1,0,2,1,1,0,1,1,2,0,0,0,1,0,0,0,0,1,2,1,5,0,1,1,1,1,0,1,0,0,0,0,0,0,5,0,0,2,1,1,3,1,1,0,1,2,2,0,0,2,1,1,0,0,2,0,0,2,0,0,0,2,1,2,0,1,0,0,0,1,0,0,1,1,1,0,0,0,1,1,0,2,0,1,2,2,0,2,1,2,2,2,1,0,0,1,1,0,5,3,1,1,0,0,1,3,0,3,1,0,1,3,0,2,2,1,0,0,3,2,1,1,0,3,1,0,0,1,2,1,0,0,2,3,0,3,1,1,0,1,1,0,0,0,0,1,1,2,0,3,0,0,0,1,0,1,0,0,0,5,1,1,0,0,0,2,2,0,1,3,0,0,4,0,1,0,1,1,0,0,0,1,0,4,0,1,0,1,2,2,2,0,3,0,0,2,1,1,2,2,2,0,0,0,2,3,3,0,2,1,0,0,0,0,1,1,0,0,0,2,0,0,3,2,4,0,1,1,1,2,0,1,1,0,5,0,2,0,0,1,0,1,1,2,2,5,0,0,1,0,1,0,1,0,2,0,2,0,0,0,0,0,2,1,0,0,0,3,6,3,3,0,0,0,2,0,0,0,1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,0,0,1,2,0,0,1,2,1,0,0,1,1,0,3,0,1,0,0,0,1,0,0,1,0,0,0,5,1,0,2,2,0,0,1,0,1,5,2,0,0,0,1,0,1,2,3,0,1,0,5,0,0,0,0,1,0,1,1,0,1,3,0,1,1,2,3,1,0,0,0,0,0,4,0,1,0,0,4,1,2,0,2,1,0,0,0,0,0,0,0,2,0,0,1,1,0,0,0,1,2,0,0,0,3,1,0,0,0,3,1,0,0,0,1,0,0,0,2,3,1,0,3,0,0,2,0,2,1,2,0,2,0,1,0,1,0,1,1,2,2,1,0,0,0,0,0,0,0,5,0,1,1,1,1,2,0,1,4,0,0,0,1,3,2,0,4,4,0,4,0,0,0,1,0,3,0,0,0,1,2,1,1,1,0,0,4,0,0,0,0,1,0,0,0,2,0,0,1,0,0,2,3,0,0,0,1,0,2,1,1,2,0,0,0,2,1,2,2,2,0,0,3,3,1,1,1,3,4,0,2,0,0,0,0,1,0,0,0,1,3,1,4,0,0,0,2,1,4,0,0,1,0,2,0,3,1,2,1,2,0,4,4,0,0,1,2,2,1,0,0,0,3,0,0,1,2,0,1,3,0,1,0,1,2,0,0,1,0,0,1,0,0,2,1,0,1,7,0,0,0,3,2,0,2,4,0,1,0,0,3,1,2,3,0,4,2,6,1,1,2,0,2,0,0,0,0,2,5,3,2,0,1,1,2,0,2,0,0,2,1,0,2,0,1,0,0,0,1,2,3,0,0,1,4,0,0,3,0,0,0,0,3,1,0,2,2,2,0,0,2,1,1,2,0,2,1,1,1,0,3,3,2,0,1,0,0,3,0,0,5,2,1,0,0,4,2,0,1,2,1,2,0,0,0,1,2,0,2,1,0,0,1,0,0,2,0,2,0,0,0,2,0,0,2,0,0,0,1,1,4,0,0,2,1,4,0,1,0,0,1,1,1,0,3,2,0,2,0,0,3,0,2,2,1,1,0,0,0,1,1,0,1,0,1,1,0,0,0,1,1,1,2,0,3,4,2,2,0,1,0,0,0,0,0,0,1,3,2,3,0,0,0,0,1,3,8,1,1,1,1,2,1,1,0,0,0,0,1,0,2,2,1,0,1,1,1,1,0,1,0,0,0,0,1,3,0,0,1,0,1,2,2,0,1,1,1,0,0,1,0,2,0,0,0,0,1,0,0,2,0,1,1,1,5,0,1,0,0,0,1,0,0,1,1,2,1,1,0,0,0,0,0,1,1,1,1,2,0,0,0,2,0,1,0,0,1,2,0,0,0,2,1,1,0,1,1,3,0,0,0,2,0,0,0,2,0,0,1,1,0,1,0,4,0,2,0,1,3,1,4,2,4,1,1,2,0,1,0,1,2,4,2,2,1,0,8,1,0,1]},{"counters":[0,2,1,1,1,0,1,1,1,0,1,1,0,0,2,4,0,1,0,1,1,1,3,0,0,0,0,2,4,0,1,1,0,1,0,0,0,0,0,1,0,0,4,1,1,0,2,3,0,2,0,0,0,0,1,2,0,1,2,0,4,3,0,1,1,0,0,0,0,0,1,1,3,1,0,0,1,0,0,0,1,1,0,1,0,0,0,4,1,0,0,0,0,0,0,1,0,1,0,0,0,1,2,1,0,2,1,6,0,1,0,0,3,0,1,1,2,5,0,2,0,0,1,0,0,2,1,3,0,1,0,3,0,1,2,1,1,0,0,1,1,0,0,1,3,2,1,1,2,1,1,1,0,3,5,3,3,2,2,3,2,1,1,1,0,1,0,0,0,3,0,0,4,1,2,2,2,1,0,0,1,1,0,2,0,0,0,2,1,1,0,0,2,2,1,2,3,1,0,0,1,3,1,4,0,3,1,0,1,0,2,1,2,0,0,0,0,2,1,0,2,1,1,3,1,0,0,0,0,5,1,0,1,1,0,2,1,2,2,0,2,1,2,0,2,0,3,0,0,0,0,8,5,0,1,1,0,1,2,0,1,1,0,0,1,0,1,1,0,0,1,1,1,0,6,2,2,1,0,1,1,1,2,0,1,2,1,0,0,1,0,0,0,0,1,0,1,2,3,0,1,2,0,2,0,0,1,0,2,1,6,1,2,4,0,0,0,1,0,1,1,0,1,1,0,0,1,2,0,3,0,1,1,0,3,1,3,0,0,2,3,0,2,0,1,0,1,2,0,1,0,0,1,2,3,2,0,3,0,2,4,0,0,1,0,0,1,1,1,0,4,1,0,1,0,0,2,2,0,2,2,1,0,1,0,0,0,0,0,3,1,0,0,0,1,0,2,2,1,4,2,4,0,1,1,0,3,2,0,0,2,1,3,1,0,2,0,6,0,1,0,2,0,0,1,0,0,0,0,1,1,1,3,0,3,4,1,1,0,0,1,1,0,0,0,2,0,0,2,0,1,0,0,1,1,3,5,1,0,0,0,0,0,1,0,0,2,0,0,2,0,1,2,1,0,2,0,0,0,0,2,0,0,1,1,1,0,1,1,2,0,0,0,0,1,0,0,2,2,1,1,3,0,0,0,2,0,1,2,0,0,0,2,0,0,0,0,2,0,2,0,0,3,0,0,3,0,0,0,0,0,1,0,0,1,2,1,3,3,0,0,0,4,2,0,0,1,1,3,1,5,2,0,1,0,2,1,0,1,5,1,0,0,2,0,0,0,1,3,1,0,0,1,3,0,2,1,0,0,0,0,0,3,2,0,0,0,4,1,0,0,1,7,0,0,0,0,1,2,0,1,3,1,1,4,0,1,1,0,0,0,5,0,5,0,1,3,4,2,2,0,1,1,1,1,1,1,4,0,1,0,4,0,1,0,0,0,0,2,2,2,0,2,0,1,1,2,1,0,2,0,0,0,2,2,0,0,0,1,0,1,2,0,1,0,1,1,3,0,0,1,1,0,0,0,1,0,0,2,0,1,0,2,2,0,0,0,0,0,0,0,1,0,0,2,0,0,0,1,1,0,2,2,0,3,0,0,1,0,1,0,1,1,0,2,0,3,0,3,0,0,3,0,3,1,0,1,3,1,2,0,0,1,1,1,3,1,1,0,2,0,3,0,3,0,0,2,1,1,0,0,2,0,0,0,2,1,1,3,0,1,1,0,0,2,1,4,1,0,1,2,0,0,0,0,1,3,1,0,0,1,2,1,1,3,1,0,2,0,0,0,2,8,1,1,0,1,0,0,3,2,0,1,1,2,0,1,2,0,0,1,2,0,0,1,0,1,1,4,2,1,2,1,2,2,0,0,1,1,2,0,1,0,2,3,2,0,0,2,3,2,0,1,4,3,0,0,3,2,2,0,4,2,1,0,1,0,0,0,1,0,1,0,0,1,0,2,2,0,1,0,2,1,4,1,4,1,1,1,1,0,1,0,0,0,0,0,2,0,2,1,2,2,3,2,1,0,0,1,0,0,0,2,2,0,0,0,3,0,1,1,2,0,0,2,0,0,0,0,3,0,1,1,1,2,0,2,0,0,0,1,0,0,0,0,2,0,0,1,3,3,0,3,1,0,0,0,1,1,3,1,2,0,2,1,2,2,2,0,2,1,2,0,0,3,2,3,4,1,4,0,1,1,4,2,0,1,2,2,1,1,1,0,1,0,2,1,2,0,0,2,0,2,0,0,0,2,3,0,1,0,0,1,0,3,0,2,0,0,1,0,0,0,1,0,0,1,0,0,3,1,1,0,1,2,4,2,0,1,2,3,0,2,0,1,0,0,1,2,0,0,2,1,0,0,0,1,0,0,3,0,3,0,0,2,1,0,0,1,0,0,0,1,0,3,1,2,2,0,2,1,0,1,0,0,1,2,1,1,1,5,1,0,1,2,1,2,2,2,0,2,0,0,0,0,2,3,0,0,0,3,1,0,0,0,1,3,0,1,1,1,0,1,2,0,0,0,2,2,1,0,2,0,0,4,0,0,0,0,0,0,0,3,0,0,1,5,2,0,0,0,0,4,3,0,2,3,0,1,2,1,1,0,1,2,1,1,1,0,0,1,1,0,0,1,3,2,1,0,1,1,0,0,1,1,1,2,1,6,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,0,1,0,2,0,1,0,0,0,2,0,3,0,0,3,3,0,2,0,0,2,1,0,2,1,1,3,1,4,1,0,0,0,0,4,1,0,1,2,0,3,1,1,0,0,1,0,2,1,0,1,0,1,0,2,0,3,1,2,1,0,0,0,0,2,0,3,0,0,2,0,0,0,0,1,0,1,0,0,1,1,1,1,2,2,0,0,1,1,0,1,0,2,0,2,2,2,1,1,0,1,0,0,0,0,1,0,0,0,1,1,0,3,0,0,1,1,0,1,0,0,1,0,0,2,4,0,2,1,0,1,1,2,3,0,1,0,1,1,2,1,3,0,1,0,1,0,0,2,2,0,0,2,0,1,3,1,4,0,0,2,1,0,0,1,0,0,0,0,0,2,2,0,1,5,1,1,0,2,0,0,0,0,1,0,4,0,2,0,0,0,1,0,1,0,0,4,4,0,0,0,0,1,0,0,3,2,0,2,0,0,1,0,2,1,0,0,0,2,2,3,2,0,0,1,0,3,1,0,0,3,1,0,0,0,0,1,0,0,2,0,2,4,0,2,0,0,0,0,0,0,1,0,2,3,2,2,1,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,2,0,2,0,1,3,1,1,2,0,0,0,1,0,0,0,0,3,3,1,3,1,1,0,3,0,1,1,0,1,3,0,2,3,0,0,3,1,0,1,2,0,1,3,0,3,2,1,3,1,1,2,5,2,2,0,0,2,0,1,2,0,0,1,0,2,0,0,0,3,0,0,0,1,0,2,3,0,0,0,0,0,0,0,0,0,1,0,2,1,0,0,4,1,0,2,1,3,1,5,0,0,0,0,0,0,1,2,1,0,2,0,0,1,0,1,1,0,0,1,0,0,5,2,0,1,0,0,0,1,1,1,1,1,1,2,3,0,0,1,0,0,0,1,5,0,0,0,0,2,2,2,3,2,0,1,0,2,2,0,0,2,3,2,0,2,0,0,1,1,0,0,2,3,1,0,0,0,0,1,2,0,1,1,0,0,1,0,0,1,0,0,0,1,0,0,0,2,1,0,0,0,1,1,1,2,1,1,0,3,0,1,5,0,0,2,0,0,2,0,0,2,1,0,1,1,0,3,1,3,1,1,1,2,1,2,3,0,0,0,6,0,1,1,0,0,1,0,1,0,1,0,2,0,1,0,0,1,1,3,1,1,1,0,1,1,0,0,1,3,0,2,0,4,1,1,2,0,0,3,2,4,3,0,3,1,3,0,1,0,2,0,0,2,0,2,0,0,0,1,1,2,1,0,1,4,1,1,1,2,0,0,0,0,1,0,1,0,1,1,3,3,0,0,2,0,1,1,4,3,0,2,1,0,0,0,1,0,3,2,3,1,0,1,2,0,0,1,2,1,1,0,1,2,0,1,2,0,0,0,0,0,0,2,0,3,2,0,3,0,0,0,0,0,0,0,1,7,0,0,0,1,0,1,1,0,0,0,1,1,0,2,0,0,1,1,1,0,0,1,2,0,2,1,0,0,1,2,0,2,0,2,1,0,0,1,2,0,0,2,1,0,0,8,0,2,0,2,0,0,2,2,1,0,3,2,0,1,2,2,0,3,0,0,1,0,2,0,0,3,0,1,0,0,0,1,0,3,0,1,1,1,1,0,2,1,0,0,0,1,0,0,1,1,2,1,0,1,0,1,0,0,2,0,3,0,0,1,1,0,1,1,0,0,0,2,1,0,1,0,0,3,1,0,2,1,0,4,1,0,0,3,1,0,0,0,1,4,3,1,3,0,1,0,0,3,2,0,2,1,0,1,2,2,0,1,0,2,1,2,0,5,0,0,2,0,1,0,0,3,2,2,1,0,0,0,0,1,0,0,0,1,3,2,0,0,1,0,2,1,3,2,1,0,1,2,2]},{"counters":[0,1,0,4,0,1,0,1,0,0,1,7,0,0,1,0,0,0,2,1,3,0,1,0,0,0,0,1,3,1,0,0,1,1,0,0,1,0,1,0,0,2,1,0,0,0,0,1,0,2,2,1,1,1,0,0,0,0,0,1,0,2,0,1,2,1,0,0,1,0,2,0,0,2,1,0,0,0,1,4,0,0,1,1,1,2,2,1,3,4,2,1,0,1,0,2,0,1,0,0,0,1,1,0,1,0,0,0,0,2,0,1,3,1,0,0,4,1,0,1,3,3,1,0,0,1,0,1,0,3,0,0,2,4,1,1,0,2,0,1,1,0,1,2,2,2,2,2,5,0,2,0,1,3,1,2,1,0,2,1,2,0,1,0,1,1,1,1,6,0,5,4,0,0,4,0,0,4,0,0,1,3,0,1,1,1,4,0,1,0,0,1,5,0,1,0,2,1,0,0,0,1,1,0,0,0,1,1,1,0,1,0,0,0,0,0,3,0,4,1,1,3,1,0,0,0,1,0,4,2,0,0,1,1,0,1,1,1,2,0,0,1,1,0,0,0,1,0,0,2,0,0,0,2,3,0,1,2,0,1,0,2,0,0,2,1,2,1,0,0,1,2,1,0,0,2,3,4,0,1,0,2,1,0,3,0,0,0,2,0,0,0,2,2,1,0,0,2,0,0,0,0,3,1,0,1,0,0,1,4,0,0,2,1,0,0,1,1,0,2,2,0,0,0,4,0,0,1,1,2,0,4,1,1,0,1,1,0,0,1,1,1,0,1,0,3,0,3,0,0,2,1,0,0,0,3,1,0,0,4,1,1,2,1,0,1,0,0,1,2,0,2,4,0,1,0,1,0,1,2,2,0,2,2,1,0,1,0,0,0,1,0,1,3,3,1,0,3,2,0,3,0,1,0,1,1,2,1,1,0,0,0,1,1,1,1,2,1,1,0,0,0,4,2,0,0,0,2,1,2,1,0,2,1,0,0,1,3,5,1,2,0,0,1,1,1,2,1,1,2,0,0,0,1,0,0,5,3,2,1,0,0,0,0,0,0,2,0,0,2,0,0,0,0,0,0,2,1,6,1,0,3,1,1,0,1,1,0,2,3,3,0,1,0,2,1,0,0,0,3,3,0,2,1,2,2,3,0,0,0,0,1,0,3,0,0,0,3,0,0,1,0,0,3,3,1,1,1,0,1,1,2,0,3,1,2,0,0,0,1,0,1,0,0,0,0,2,2,3,4,0,1,4,2,3,0,1,0,1,1,1,1,0,1,1,0,2,1,0,0,1,1,1,2,0,2,0,1,1,0,0,1,1,2,1,1,1,1,0,0,1,1,2,0,0,2,2,5,1,1,0,1,1,0,1,2,0,2,0,0,1,1,0,2,0,0,1,0,1,1,1,1,2,2,3,0,1,1,3,1,3,0,2,2,0,0,5,1,1,1,1,1,1,1,0,0,0,1,2,1,1,1,1,0,0,0,1,0,2,0,0,3,1,2,1,1,1,3,1,1,1,0,1,1,0,3,1,0,0,4,2,4,0,0,0,0,0,0,0,3,0,1,0,3,1,0,0,0,1,1,0,0,1,0,2,2,2,1,3,0,5,1,2,0,0,0,1,0,0,1,2,0,1,0,1,4,0,2,2,1,2,2,0,5,0,0,3,0,3,1,1,1,3,1,0,1,1,1,1,0,0,3,0,1,5,3,0,1,1,0,0,1,0,0,2,0,2,0,1,2,0,0,1,1,0,3,1,2,0,1,1,1,1,3,0,1,0,1,0,1,0,3,4,1,0,2,1,2,2,0,3,1,1,1,0,1,2,1,0,1,1,2,1,0,0,0,1,0,0,3,1,0,0,1,5,0,0,1,0,4,0,0,0,1,2,0,1,2,2,4,0,1,1,5,0,1,0,1,2,0,1,1,1,0,0,0,0,1,0,1,0,0,2,0,3,0,0,2,0,0,3,2,0,2,0,2,0,2,0,1,0,0,4,0,1,0,0,1,1,0,2,1,0,0,0,0,0,3,2,2,0,2,0,0,0,0,3,1,0,1,0,0,0,2,1,0,1,1,1,1,0,1,0,1,2,0,3,1,0,0,0,2,0,2,0,1,0,2,1,1,1,0,0,0,2,1,0,1,2,0,0,0,4,0,0,2,1,0,2,1,1,0,0,0,0,6,0,0,2,1,0,0,0,0,0,1,0,1,0,0,0,3,0,2,0,1,4,0,4,2,2,0,0,0,0,3,1,2,1,2,2,0,2,0,3,0,1,0,2,2,2,1,1,1,0,0,0,0,1,1,0,1,1,1,0,0,1,1,0,1,1,0,0,4,1,2,3,0,1,1,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,2,0,0,2,4,0,0,2,0,0,1,2,2,0,2,0,0,0,1,1,2,0,0,0,1,1,0,2,0,1,4,0,1,0,0,1,0,2,3,1,0,0,0,2,1,2,0,1,0,0,1,1,0,2,5,3,0,0,0,3,5,0,2,3,1,0,2,0,0,0,4,0,0,0,4,2,0,0,0,1,0,1,4,0,1,2,1,0,0,0,0,2,0,6,0,2,1,1,0,2,2,1,1,1,0,0,0,0,0,1,0,1,0,3,0,0,2,0,0,0,0,1,1,0,1,0,0,0,1,2,0,0,0,1,3,0,1,1,0,0,0,0,0,1,2,2,0,2,1,3,1,0,4,0,1,0,2,3,1,2,1,2,3,2,2,2,1,0,0,0,2,1,0,0,1,0,1,0,0,0,2,2,2,1,0,0,6,0,2,0,0,0,0,0,1,0,0,0,2,0,0,0,0,3,2,0,0,1,1,0,0,2,0,1,4,0,0,0,1,0,2,0,0,1,0,1,2,0,0,0,1,1,0,3,0,0,2,1,1,3,3,0,1,1,1,2,0,2,1,2,1,2,0,0,1,1,2,0,2,1,0,1,2,3,0,0,1,3,0,0,0,2,2,0,1,2,3,1,0,1,1,1,0,0,1,0,0,0,0,4,0,0,1,0,3,4,0,3,1,0,3,1,0,3,0,2,2,0,1,0,1,2,2,0,0,5,0,1,0,0,4,0,0,0,2,3,1,1,0,1,4,2,0,1,2,0,0,0,1,0,4,2,1,0,0,0,1,0,0,4,1,0,0,0,1,1,1,2,3,0,0,1,1,0,0,1,0,1,1,0,1,2,2,1,5,0,0,0,0,0,1,1,1,4,1,0,0,0,2,2,0,3,1,2,0,2,1,0,0,2,3,2,0,1,3,1,4,1,0,0,2,0,0,2,0,0,0,3,0,1,0,2,0,3,0,0,0,0,0,1,0,6,2,0,2,1,0,4,0,1,1,1,1,0,4,2,0,1,1,2,0,0,0,0,2,2,0,0,1,0,1,2,2,1,0,1,0,2,1,0,5,4,0,1,2,0,1,0,0,2,6,0,1,1,1,3,1,0,0,0,1,1,0,1,1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,3,0,0,4,2,1,2,0,0,1,1,1,1,2,1,0,0,0,1,0,2,0,4,1,0,0,1,3,1,2,2,1,0,2,1,0,1,1,1,0,0,0,2,0,0,1,1,0,0,2,2,3,1,2,1,0,0,1,2,3,1,2,1,0,0,4,3,2,0,0,1,0,0,0,0,1,0,1,1,2,0,1,1,1,3,0,0,0,3,0,1,0,0,1,0,0,2,0,0,0,1,0,1,0,1,2,2,0,0,1,0,0,2,0,2,2,1,1,2,1,0,2,1,2,0,0,1,0,0,1,3,1,2,0,1,0,6,4,0,5,2,0,0,2,3,0,0,0,2,1,4,0,0,0,2,0,1,0,0,0,4,0,2,0,0,0,1,1,0,1,1,0,0,3,1,0,0,1,1,2,0,0,2,1,1,0,1,1,0,1,2,1,0,5,0,0,0,0,2,3,1,0,1,2,0,1,0,0,0,0,1,0,2,0,0,0,1,5,0,2,2,0,2,0,1,1,0,1,0,0,3,0,1,0,4,0,0,3,0,0,2,0,2,0,0,0,2,0,0,3,1,6,0,1,1,1,0,0,0,0,1,0,0,1,2,0,0,1,0,1,2,3,4,1,0,2,0,1,0,1,0,0,1,2,0,0,0,3,3,0,1,3,3,0,4,0,0,0,6,2,1,0,1,3,1,1,0,0,1,0,2,2,3,0,5,0,2,0,0,0,0,0,0,0,1,1,0,4,0,0,1,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,0,0,0,1,3,0,0,1,1,1,4,0,4,0,2,1,1,1,2,4,0,0,0,0,0,1,1,0,2,0,2,0,0,0,1,3,1,5,1,0,2,0,2,2,0,0,2,1,0,1,3,0,0,0,2,1,0,2,0,2,1,4,1,3,1,0,0,0,0,0,0,1,0,5,0,1,0,1,4,0,0,0,0,2,0,0,0,1,0,2,1,0,1,0,0,0,1,2,1,1,0,0,0,0,0,0,0,4,0,2,2,0,0,0,3,0,0,1,2,0,2,0,0,2,4,2,1,1,0,1,0,0,1,3,2]}]},"null_count":0,"last_update_version":397952032445300736},"dic":{"histogram":{"ndv":1993,"buckets":[{"count":7,"lower_bound":"MEFXaG9KSGJ3a3E5VzlFaUxSeFpNQzVLVzNFOXh1dkNIV0JITXU4WFhJWQ==","upper_bound":"MEcwaGZyMA==","repeats":1},{"count":13,"lower_bound":"MEhJS0s2cEJxUTRscW43c25lZjg3VU9SWkxpRml5YkhnWDFMVkptUzdnRDRrU3FmMXdOM3NCejBEb0M=","upper_bound":"ME44Rkk2NUYzY2IyMVdHNnRwQVJ2dDlVR3Z5SXZUbnBieEhLcWRoUWM4T2RBWmpjRDFvMXdaRmtFT09X","repeats":1},{"count":19,"lower_bound":"ME90YlVlYWxLRHF6YVZrWlJYRVZWV2NoVEsxYnpIWHlQMU9Sc2EyOUN1YkxLNmpLUkdNaXFBTzRBb2dUZkNDdA==","upper_bound":"MFVCZWJDNTNId0tnMlpIZTdxMlpKZFdSdTYwaFM1SmxtaGpNS0o4VXRaZ0ptTXl2elhz","repeats":1},{"count":25,"lower_bound":"MFl2","upper_bound":"MGFyZGU2eDFVNFg4SHpHdWFCcnA2S1h3NDJqM0N5T0JHd3M0ZGFjbDR6MHVvWTNEOWg=","repeats":1},{"count":31,"lower_bound":"MGlNQVk5MTBPRHJGeDdXTUs1YVZhSHA3c3lZSTNnWVk3NkNpTThvREE=","upper_bound":"MG52aWZSS2lZdk5jdElBQ2JvQg==","repeats":1},{"count":37,"lower_bound":"MHBNWWNRbm9F","upper_bound":"MHo0RXlRNXc5bFA0TllMUGt0YUtWWGlaVENKNE5yMA==","repeats":1},{"count":43,"lower_bound":"MTRXdUhIMzc1c0k=","upper_bound":"MU56RWtzMTI=","repeats":1},{"count":49,"lower_bound":"MVNtUUlDV3lvYzczT29GSGlidXJQZlQ4RDZhWXlmcA==","upper_bound":"MVhpSXdSdEJvY1FVNVY=","repeats":1},{"count":55,"lower_bound":"MWJhODE1TW1yWXRxcGRaR1pTelJuTVVyWk1LOG5pNGRtb3d0NzJTVkNjc3hNVA==","upper_bound":"MWpScmVJRkxPWkgxdDVta2VGS0F5blBJWWx5b2FsdW1Pd0FMT09FbmlEVEh2bA==","repeats":1},{"count":61,"lower_bound":"MXNGakEycWwwbG5Hd0g=","upper_bound":"MktwaDZGb2VORWdvZnM2RVZIQXo=","repeats":1},{"count":67,"lower_bound":"Mk1yYVNWdHVXSjM4TVZYd2xvVzdT","upper_bound":"MlRiNDhiYmlmY2E2dURaQVN1QlpjZVV3Uk1CbDE=","repeats":1},{"count":73,"lower_bound":"MlVseEh6S1NhdHBlWVllTURjYVhnWWdXdDRCRVdIdlpHS2tBZ2hsTA==","upper_bound":"MmRNVmxtcW9DdUUxU2w4NU1IakZXb2VtWERHbGk1RFFWaGt6aFFqOE5pT3dVWmRl","repeats":1},{"count":79,"lower_bound":"MmhCRVlRdXE4bHBXMnlVWmduWXRSU1R1NHA3eDF0TGE0MUI3THRZSE0wNG9uSnNSQ3ZES2syNVM=","upper_bound":"MmxGbXIwaTE1aWFL","repeats":1},{"count":85,"lower_bound":"MnNvNUVucG15eGlKSk9XSkZkeEFwNmh0TzR0akV0Q1lvWDZsZ3MxbmdvbGVrTzJLam5nNllvcUpUcnNrRg==","upper_bound":"MnhtRG1BOA==","repeats":1},{"count":91,"lower_bound":"MzRL","upper_bound":"M01VSEhaSVM2dGhsWHBoanJKdnVBZDhzakRNR1Y3cWhaRnVoMEtjMUR5SHZoNXEwZ1RybmkxUVcxeDFlMA==","repeats":1},{"count":97,"lower_bound":"M1IyMVNmMU9sMg==","upper_bound":"M1pudGF3TXFoMzFhR090MTlrbk1TS3J2Y3FZdWFZYk1RaUtkeGhNak4=","repeats":1},{"count":103,"lower_bound":"M2JOVG9SNThYS2d4cG9KVE5GQW85SnFhRUdmM1RNNGp0","upper_bound":"M2Qxd0dTYXRiYkFRVkQ3SWRuM1QwY05XR1lBWm9Caw==","repeats":1},{"count":109,"lower_bound":"M2VNaWZHdXpZcVNNOEREZ3FaSTFsdG9SdWpBUXVpWTlsT0FhZVZpTmlaWlZIWkxlWGh0UjZzV2FVQlRNRERWQw==","upper_bound":"M2dYVG1WenZOdlRXYWZvT3lOMURMVGgwb0xDVUU=","repeats":1},{"count":115,"lower_bound":"M2pLSXdRZ3VwWFIxaGZlU1I0RjdLajBwSGRDTkE=","upper_bound":"M2tuY2FmeGpxeXk=","repeats":1},{"count":121,"lower_bound":"M21VMHBKYXRSMWdZN3g5d0xTZUtuVDhUdm1LWU5qTFpNckxqckNzNVQ=","upper_bound":"M3UwVXRyaUdtVlBxaUREVGI4bFc4ZG9kc2I3SHM5UWt1R3VUeFh3bVVrYllXaA==","repeats":1},{"count":127,"lower_bound":"M3ZUdGpnRms0SnNlV25NMzFWaU1GZW5oVVc3aldRems2elFGbGFV","upper_bound":"M3pyY0pWMG9pMDRqRTlJREpNQjdIUUNNS1FLUjhHUG8=","repeats":1},{"count":133,"lower_bound":"NA==","upper_bound":"NDZYWm1PYmdKem5BblhvcTFUcFByQXllN1J1cFJVdGxjck5RcXM2dnJZejdLTTcwblc3akZadnFrRFpH","repeats":1},{"count":139,"lower_bound":"NDh1OGJlcm9Td0I0","upper_bound":"NEVFZU5qT0l0aXhWaE5STWRlSHhtR0lWYkxnenlaczhnUjhhelpJd0g5NEJ5dE5tS3FK","repeats":1},{"count":145,"lower_bound":"NEZGY1Y0Z29RODE4dDNZNUExNXVYWHBTWVNrQklsMw==","upper_bound":"NEp3YUJLZERxQ2lNcVduVg==","repeats":1},{"count":151,"lower_bound":"NFQ=","upper_bound":"NFh1V2o4Tk9lbzM2SHZOQmpCb0xDRFlGMll2QzVJM21yVW1wNEJpMGlqSHRXUEE=","repeats":1},{"count":157,"lower_bound":"NFl0UmtJdXB2aTM2TDBGenk=","upper_bound":"NGJvSkw5ZXRrTDhPRE8=","repeats":1},{"count":163,"lower_bound":"NGVZOWpsdldEbVFoRzVJbFFMdWlmSE9jM1J3NTZOWk04YXhHMjBQa1lNQkI0VnNDUkxSUFBpWVVYSQ==","upper_bound":"NHNZa1FIWGw2bDhsNlM0VHFiYlZTbkJCVmxzeXJ3VWxGTEZjRXM3RTAwUHdtVW01SGY3Wnpa","repeats":1},{"count":169,"lower_bound":"NHVJa010UnJIeEp4dnl5N1AzcXpxeEd1VmtNUWtFSA==","upper_bound":"NTcxNm1tVWVENGlCQ2FjNEZRVzJ1RXpkOW9URDBNN2gzVHh2cVF0UXhyaHRQNVFYVTlKRU9SbzRTUUcwOWdF","repeats":1},{"count":175,"lower_bound":"NUIwMzJlTFlpcGVCU2x1MlBMVnBydEVhUWZKZE5RRldSR0ZaRmtLY1RqYXd4UGpJZWJnVDZadzMxcEVE","upper_bound":"NVFHOTlSWjZlTkd2Ng==","repeats":1},{"count":181,"lower_bound":"NVVHYk1UbUI5cm1mQTFzbkcyQQ==","upper_bound":"NVo3R1dKS3dOUEFCc0hhZU5wM0dudzA4VkpYZHVvR09DRjgy","repeats":1},{"count":187,"lower_bound":"NWM=","upper_bound":"NW9WaXhkejZPZkdrbWJvYmR1VzVIZWc=","repeats":1},{"count":193,"lower_bound":"NXAyb3hCWTFoU2RzbndBQ1BUUkNTQWtvRE9hU3Z0SHdoRXNEc1I=","upper_bound":"NXRMa0M1U3l1V2dOa3lYQkd6VDdx","repeats":1},{"count":199,"lower_bound":"NXowT3h0SUd3Q3hXR2twWGJaU1VlMQ==","upper_bound":"NjJ3bXl3M2RRd3JKNUROemtEd2VNdncwSzRLQlF3Z2VkOGh4NG5M","repeats":1},{"count":205,"lower_bound":"NjJ5OVBHNlZaOGVNWjVrcXBPeHVFZW9aRURTd0RYY0pMQ2xUN1hV","upper_bound":"NkdoS3hWcUJYS0xHY0ZVYk9Mc0NBTElQdksyTDd5RXVnRDJ0NnVIM1l0cjVmU0t5UUJXVXVlaUpaVGVy","repeats":1},{"count":211,"lower_bound":"Nklpd0ZKM3BvSjBxYXlvOXdoM1BWS3Bibw==","upper_bound":"Nk5xUGpvR250Tk1Vb013RkRpWVFqMVBJ","repeats":1},{"count":217,"lower_bound":"NlBKTTM0YzROVExlaHNqVEtCVVBvemFDVXAwV3hxOGtNNDRoQW5DTHdjTUFaa0Q=","upper_bound":"NlU2dEZMMFJJdXdDM2ZoRm9hOHFEbWJiRFN4bXY0amlBR1RrYlk1S3FRR0NHUWdBNEszeA==","repeats":1},{"count":223,"lower_bound":"Nlg5VXBBRzJmcFNCYWZJMVVudFF0SUc3Q0NxN1JOcDA0VTZKdlpXMEtLZWg5RzN3akY2cW0=","upper_bound":"NmdOaE1YTDVLY0EyZnp1U3I=","repeats":1},{"count":229,"lower_bound":"NmpCRDBxRXJ4YVh2VkNFZ2hrYnVaOFNvd0xwNmRPNEFsSHo1RHRiTmtWZFRTaERtSU9vbXJOOA==","upper_bound":"Nm9UNG1TVVdKVHhXclN4ZkZuendwV0h1TXk4Rkx6cVRydFRBV25vclJCZ0lkSE1XcA==","repeats":1},{"count":235,"lower_bound":"Nm9hUVhROHk3bDRQYWY0cXVoZ2VJN0FTSGdLUHg5elNGWUNwVlhPMA==","upper_bound":"NnJ2bmtXZTd2OHVEMWkzcmQ5TXpDbVc=","repeats":1},{"count":241,"lower_bound":"NnMyRHBjTklydGZIenZRWWdCN0F1SDljNll3SmxEcnlaekZJN0swdjdp","upper_bound":"NnhGU1U2eUtRcHpQb1hOUQ==","repeats":1},{"count":247,"lower_bound":"NzFKbFRD","upper_bound":"NzZOZmp3VWZpVHpp","repeats":1},{"count":253,"lower_bound":"N0ZPUUNuWXA0NTN4MXVzUk8zZXJORk41U3Q2c2M5SjlHYWtLNUxoUFVubnp2Vm43WW1B","upper_bound":"N0hMTmtDSng2bHFPSVp3Q1dEVjNPVzJVcDdGNlkyUUVSeERPQmdxejN0ZTNL","repeats":1},{"count":259,"lower_bound":"N0tCU1NmaGxHZHhUUllKZWRObWdBdDFLRW1naEg3ZU1WbkoxcU9vcDFlS2VHZVVoOWdU","upper_bound":"N05GZlFIWVdQQ2g4eWNCbDdrd2tNdFJ3bVBqck1nTVlva1ZG","repeats":1},{"count":265,"lower_bound":"N093N21lSHczZ2xvUjdXUk9mT01OU0JpWTM1TFZ5U2hzcnZtM0Y2NDRDRnlrdVdJNXVqMFY5TlhjdkR2YXlFbg==","upper_bound":"N1YxcHMya3doclpUSWhQRmtnTnk0WGRDamxzUG5FcGxDbzd1","repeats":1},{"count":271,"lower_bound":"N1libk1tQm9vTEJ6UDZnVnRCRFhaOFlDQWtyVVdiaER6Z2kxWg==","upper_bound":"N2N4Wm9oYkVHakZxY0xmNVAyRFVnTDJ6MVcxSVh5WnpDVWNXSms3SjVQ","repeats":1},{"count":277,"lower_bound":"N2V3S3AzTEdpS0pUcGhQYjM2YmxzbThFMVF6VnFSZkRLUGZiTTU2NHdXT2JqRkV1eUdvWTI3REJTZkk0TUxOcA==","upper_bound":"N2o3NnoybG9zTW8za0kzMzJwaVdrZ3IwTDQzU1diSlQ4","repeats":1},{"count":283,"lower_bound":"N2xKQWtsUG1MT2N1d205SFBiZmNXRmhHYnRDeVdxYUJkbWJxdlFrSlNNa29tOA==","upper_bound":"N3RNcVNZYU00Sm56Q0EycWRjeTM=","repeats":1},{"count":289,"lower_bound":"N3Radm9RTEhIN3lnQzMzRjQ=","upper_bound":"ODNVTWppdWw5ZVlYWkRWcG5uYmpQTmkzVUtPZFd5WXAzRWpnZnAwakZrYlly","repeats":1},{"count":295,"lower_bound":"ODR5M1RyTXh2aVk0UFFoUg==","upper_bound":"ODk3UnBpYUVUQnRKTVp3REw2eUwwdDc=","repeats":1},{"count":301,"lower_bound":"OElhVXpWYjIw","upper_bound":"OEw=","repeats":1},{"count":307,"lower_bound":"OExuUXVEN0U0UmdHekNZUnVUak5iajNiaGlUNnBnUnNpOHRZeE5aa0M3TndGQkc3Q3l4RnVWWVVm","upper_bound":"OFlhazU3eTdvS2ZCcVhqVUd4b0VaYWlMTUM0NTNVQmJwUmZMNEF3Nw==","repeats":1},{"count":313,"lower_bound":"OGE1RVlnQ0ZMZmZiYmtJTWIwdVlyY3FoY0M2M3Byamc2SWNUTXlQa3kw","upper_bound":"OGNqdlJ0eTE2OUVLZnlQbXg=","repeats":1},{"count":319,"lower_bound":"OGlFa3ROa0plaFNKT1RuVXV2Tw==","upper_bound":"OGpWeGJSajc5UWw0RG5LZThhQ3ByWnZsRmIzb2FiUk9iZHduTnQ2dEdBZVRwakVZS01CZg==","repeats":1},{"count":325,"lower_bound":"OHcxMVBiU2pwYkd0STZnUDYyQm9Yc05rQ3RDamZpRVNDS251UEpV","upper_bound":"OThpREpYNDA2bnFr","repeats":1},{"count":331,"lower_bound":"OUJ1WUxsRjN6bE54SGpMdjFWN0RyTDcxVlJzMHRNRzM4VGQzZ2J1eE5KcVZ6UzBa","upper_bound":"OUliN1pKbkZnb2p3YUpRc0lwNnJWOFFJSzZsNVJlckExVmZjOW85UVNEajFMM2Y2UA==","repeats":1},{"count":337,"lower_bound":"OUt6alNQd2w=","upper_bound":"OVY5ZENxeGNseWNFUDNnOVlDemR5","repeats":1},{"count":343,"lower_bound":"OWI4bWJpcg==","upper_bound":"OWlxY0lSTVBkM2tSbkJzeDkxWHdLV0x4SkVOcQ==","repeats":1},{"count":349,"lower_bound":"OW9jd0JqN0Y=","upper_bound":"OXl4QWpDWg==","repeats":1},{"count":355,"lower_bound":"OXpvMjF0dHF2ZmFmdXdUTHE5MmpGdVl4NXRTbjF0","upper_bound":"QTIzcURSNFJzVTBBTzhka2RMOVJjb1BBdU5lNDRyeFVv","repeats":1},{"count":361,"lower_bound":"QURTWkttQ21XOThMN2IxZWZqRFh5YkFES3p1VWhOekExVlJoYWhHV3libjNFbXd0U0l0","upper_bound":"QUdlUXh6MWlwdHdqc21rM2NiQTIxbVlXOU5nbk1GdnRjV21pVUhOckZ4WmNBaGRNWkpnOEJaeXlKZk1Gaw==","repeats":1},{"count":367,"lower_bound":"QUhoVTBKWHQzZm5jWnZhWW1yWG9ab28xRFVZNEZNS2tyRktlTFJVT0xw","upper_bound":"QU5GR3RVSXBqOXc0VXNOWVVydDgySQ==","repeats":1},{"count":373,"lower_bound":"QWRUZDVhUg==","upper_bound":"QXNrY0R2VllxMmhkVFVXSmw3R3c3eFZFd29XQk9RRUFKejhNZWV1Qk1QNldPWGdvZjJiWlgyRkZOTQ==","repeats":1},{"count":379,"lower_bound":"QXN4MFI5SmdyY29XOWVkeENqbzgzUld0aEpoUDA0","upper_bound":"QjF5NmxhalMzNUpycnBiYTZndnRTNzlnRzA4d1RxRg==","repeats":1},{"count":387,"lower_bound":"QjNHQkZXY1dBZHVnR0p2czU1M09abW5NZGpTUEJJcEprNA==","upper_bound":"QmE=","repeats":1},{"count":395,"lower_bound":"Qmk2bGxkRjJTYlBCSEZ4WGd4RlpuYWg=","upper_bound":"QnB3bmVBM0d5ejN6TnZDYWNzU2hx","repeats":1},{"count":403,"lower_bound":"QnQyNTY0d0ZMbUZFbXdYc0M1bW1ucXBleEFHWTVjenZLWUQ5VG00aDlqYjg3TDQ=","upper_bound":"QzJWUEg0ZG1ZYXZLYXFZdWNlZHJNZmJUQ0RvajVzUWdqWVZuRVowNw==","repeats":1},{"count":411,"lower_bound":"Q0FVbldqRURleHZVR2lP","upper_bound":"Q0N0RnZreW1tU3RuWFppZzBCRDdyR0h5bEFWM3J3NnY0QUZ0a1RvWG9wZWRENDk2SGpuUXdWdzVTYm0wcA==","repeats":1},{"count":419,"lower_bound":"Q0toNjhjVlg3OHR4bTZMSmhpTjNsSVlNeHpoTFpRektNODNFNEQ4SWFMam5sVlE1","upper_bound":"Q1VXeXVtZWt5NGY2WjUxQ2tDWTBNeFFHeXBla3RMczE=","repeats":1},{"count":427,"lower_bound":"Q2FSZEdFSUdlQjRiU3hCQWt6UWJyWW1XZlg=","upper_bound":"Q2lORXZMVXZBUjRacXdhcGg1NEVKQ2xYZ3NnaDRMTDVZM01tbEZhQmdkZVFGVjFHYWVCUndRWWkzZlBBMms=","repeats":1},{"count":435,"lower_bound":"Q2tLbmZKMGhJTQ==","upper_bound":"Q2xSdW04YzdMc3d4YmY2Uw==","repeats":1},{"count":443,"lower_bound":"Q29RRkZQ","upper_bound":"RDJxa0hUZmExYTNyOEgxemZGNGJsYUo3c3c5Wk5DZFg=","repeats":1},{"count":451,"lower_bound":"RDU2T0NhbU1TQlczbVdzZjJ4dkUxSDI0","upper_bound":"RDhsTXl6eDdqYlVDUVhUbTJtYkpLUmxHdThpM3VE","repeats":1},{"count":459,"lower_bound":"RDlCTTY=","upper_bound":"REhsWEtr","repeats":1},{"count":467,"lower_bound":"REh6T2FIbExCZmh1OHhiemJjcmRBT3RPalRkQUg3MFNvTlY3aUp0aWF5MzY5TXk4dmNobnZ4Vk0=","upper_bound":"RFVXVlBPZUNhSmFhRFo=","repeats":1},{"count":475,"lower_bound":"RFl3b1RLRTJwNGJMVER4Y3FnOVBmNA==","upper_bound":"RGg3WlF3VUs1Y1hRaHEweVFL","repeats":1},{"count":483,"lower_bound":"RG9SMWpiUFhZRkxXcGtMMkRObw==","upper_bound":"RHU1ZFVjM05ybk5rY3lXM0U=","repeats":1},{"count":491,"lower_bound":"RHdSN25PVXNsSGp3NEVVOVVNZUtiTnpHTlVFNEw0bGE1ZHBlQlNlSHBpRXhxOUJU","upper_bound":"RTZqd0RXR0FyWGtuMWJrcDA=","repeats":1},{"count":499,"lower_bound":"RUNX","upper_bound":"RUU1Vm5ySXBiTHRJaGFDNTFYd1gxTVI0WkVvZE1Peg==","repeats":1},{"count":507,"lower_bound":"RUxNQTNC","upper_bound":"RVNsR2s3T3FmbXltN1BhbExvbllhbEFRaQ==","repeats":1},{"count":515,"lower_bound":"RVVNV1JmVW9vU21YZmo4YmFyTGNmazc0V3prdHZYZlc=","upper_bound":"RWdYS3E5MXV2MmNqcXRhWEZFcFVjc1Jwa1VRTXJ0VHNSQVRhME4wdjNOck9RT3dkS1loTDQ=","repeats":1},{"count":523,"lower_bound":"RWhEeTJIYU50ZTk1NkgxUFpUQjdJYm9QVEc3ZU1nVk1lRjdhZnBuYWY0QmRyUThZNmVFWng5SGtJUGtUYkM=","upper_bound":"RXFRRlVzdQ==","repeats":1},{"count":531,"lower_bound":"RXJQVDJMQzVFdWhOWmZnblY4d0dCdlkxMkVHWVQ=","upper_bound":"RkJrN09TdzdITWVkanE4TjdzdGY2clp1Vm43c2lKajlIalJ1dk1wV1Q2TTZWV0ZHeQ==","repeats":1},{"count":539,"lower_bound":"RkU0WmM3SWwzakxFQ3RoZEFiRnhmb1JSaEUzT2trT01KN1V0ZnZl","upper_bound":"RmczRHk3SG8yN2VnWjczUE5IZ0FQa0FwYndHcEdzNw==","repeats":1},{"count":547,"lower_bound":"RmkzbXU=","upper_bound":"RnJHNEdyeWp5NjlKVWFiNmU4SW9VWkN1eDdvNEQ1OGYxd3ZOUnBRSHJwb0Z3Rm9aallWV1Zieg==","repeats":1},{"count":555,"lower_bound":"RnRaaXhhNFBSczNydklEbUgxZXV1OHkxcQ==","upper_bound":"RnlKYzhWYUNCQ29qamluVVBnMXFVTHA3eDNpamFQT3g1N2Z1QWcydlFhVGE3b05tWFJnWXUzNHdmeA==","repeats":1},{"count":563,"lower_bound":"RzcyZGJIVHpUWmhscGhIbFZEbGEwRU5WSmdjUWNyYkRUTVlTS1RldEJBZW45eXBaeXpXWkxURnRhN01FSjhM","upper_bound":"R0Jrb3FXNkQ2cTF1","repeats":1},{"count":571,"lower_bound":"R0RJTEdJc2hXajJNc2cwZXZlSVlaYQ==","upper_bound":"R1lod1AzZE1VRmpyRDlaWmFYaEZQNXV6WklXbnVmRXA=","repeats":1},{"count":579,"lower_bound":"R1o2TmM3b2hV","upper_bound":"R2RMaHNZb1NkRzd6NkFnUXI0YjBNYm9uV0VFU0FwTnV6NHBzR0wxN0w=","repeats":1},{"count":587,"lower_bound":"R2xXN3V1M09rSk5YYmFMYlpXdU92cnQ5MWRneTVESkRWV1hxS2N2Tkd5eWNITDRKVVpLN255SkQ4TmlW","upper_bound":"SEs3bk5BMnVoOUVXbjM4S3hodVRsekVSNkZXMU1nMklZWTF2QmNPdU5ZUk92T1U0SFFDNUJQMFB4","repeats":1},{"count":595,"lower_bound":"SExtUlluZzJ1cVo=","upper_bound":"SFZna0NWSXFkSGxFT3E1a00wdERpWVBabTJxUUU=","repeats":1},{"count":603,"lower_bound":"SGF6QlA=","upper_bound":"SHQ1eQ==","repeats":1},{"count":611,"lower_bound":"SHlWVm1hdzBJM3ZVcmtsQ3RVZFRJU0VtWkxmQ2RManYx","upper_bound":"STNieFRXaGxxaEtJWGVzbUNLTWJGR3EwaHlobExCV0lydThxdVJuNnpKQ2w5ZlFRa25IRVRjZWZ4UDM=","repeats":1},{"count":619,"lower_bound":"STk1U3F2SXRFOUZPU2pGQXVJM3gyaEpCb0trbjk1NDM2b3lMZUVVN0RITDkwVk00ZWlaTmpkRUE0Vkx2ZldscQ==","upper_bound":"SUNNaE5wM1h6VUltS2ZBb0N5ZEEzUmdlbEZUZnhPc0pKbg==","repeats":1},{"count":627,"lower_bound":"SUNsQVg1OUR4VjJHNFlxdno3MmZENkN2bkJncGNDMmhKSkZ2dE42","upper_bound":"SUVKVm5DS3lEYzhYTnQxc2tZV3ZVS3J6M2lSbGdhWVVZNEdMVHpjWjJk","repeats":1},{"count":635,"lower_bound":"SUc4RXFVMXNqbm1WdnY4UDFhVDR4WVhORGpTaTVXcHF2NDlua3JJaFJkOWg5cmRxeG9INDZ5TTI5TjlTdERXUg==","upper_bound":"SVVWZ1k3d3gyc2FiOXhQeWtqbGVVOFpXNkUxaXpoZVBzanpiV3Jsck4wUGJNU2F6NGwzeDRiZzNpTGpJ","repeats":1},{"count":643,"lower_bound":"SVphNG0=","upper_bound":"SW1KTlNDdWZvQ2Q2SGFMOEpHVWZGYTlwRkxJZ1poNDJuOHR1NGFtVEJBM2o3ekRmODBKRFg3WU0=","repeats":1},{"count":651,"lower_bound":"SW5VbjFjWGZEYzkxZUNQNHpuTFBWU1FiWVVydnFNR0xyQm1vTHZlZWo=","upper_bound":"SXJPdzd4dEFjb3hYV0JQT01JdkpsY0U2ajE1b2l2OVVEYVAzOFVoOXkyRXllbQ==","repeats":1},{"count":659,"lower_bound":"SjVRNTlXaDZrTQ==","upper_bound":"SkNSU1k1Q1lXTGh0WXJsZUY=","repeats":1},{"count":667,"lower_bound":"Sk8zVmZOVVd4T1BrQTFKMGVvRVBmbm4=","upper_bound":"SmpZMGpzUFpUSVlWempHWkR6MEd5WEwySmNWRVpodVhsUWZ6RVhlZ2lMQW1ETHRNekNvN3hkZGd0MGd6eg==","repeats":1},{"count":675,"lower_bound":"SmtLa0RrdDc2aW9uNWo=","upper_bound":"SnF5Q1A4RG93ZXo=","repeats":1},{"count":683,"lower_bound":"SnU4Q00wbFpVTFNTbXgxb3ZvTGF2OFkwNjNqMXVPQXR3WVlhcA==","upper_bound":"Sw==","repeats":1},{"count":691,"lower_bound":"SzFOZ1lUUFZtSHZqdFh2dDVxMkx0aENoWmtXdDZuSGhjaEN6UTRvbWJ4ckp2SDMyMXpMZG9yUjVFUXM4bXB3","upper_bound":"SzRvcDNtUQ==","repeats":1},{"count":699,"lower_bound":"S0VoQWNvTkNPdU81M3BUTEd6cGtLaGdTNlJta0RjUkVFTzQxN2piMThObw==","upper_bound":"S2tJRks4b2I2ZVVwVThXaENBVVlCR0hsYU1VckhJc2p1MFlsVg==","repeats":1},{"count":707,"lower_bound":"S25MUmQxWWZ4Q1VaaTlNSHZvZ0dBTlVNZW16UUtEMklqTWdySFNJZUJQYTRPQ09oRmhCVGlO","upper_bound":"TDlIdQ==","repeats":1},{"count":715,"lower_bound":"TEoyQ0ZSVFM=","upper_bound":"TFZMejB3bjZudGZMQlNjdjNSeEhBTWRvaXIzRGhuRkpXU0Zob3hyMkR3M2dVcFp0WlZIUXVPNg==","repeats":1},{"count":723,"lower_bound":"TFhFNDd2eU8zU1ljeE5oS29NRGQ=","upper_bound":"TGhsdXNlOTlORVVXdHlkb2NPQWh5OWRSQjk2RXA5R0ZWNDFYYllJWjhYVWxrN21wV1d5ZE93V0ZXYjN2cVlnRA==","repeats":1},{"count":731,"lower_bound":"TGlWRTlwc0oyUlhObXA2MnV4MlBQS0s3U0lTd0VxT1NGSnJwdExjVHFOZjEyWQ==","upper_bound":"THNpcU4wMUw3OVQ1ekZDSFhHRmFRVGtBREJFdkFaTTFqNHJSNDdQdkg0R2l5czB0VQ==","repeats":1},{"count":739,"lower_bound":"TTFqRFBWbnpxSXVoZEhCQTBZemF5bkwwN3F3R01GWUpUc3VFOWJac3M0SGc1YVlvcFVXbmps","upper_bound":"TTRzblJ2UnBvN3VMZnhzMWN1aGlSNXlXNjF1WWFjQVR6WnM2TlVXUE1oSXllNFlad0lOT3F2YTBVelN1N1I=","repeats":1},{"count":747,"lower_bound":"TTlKenhqSnJzSDkxS2pNSlVhbklHckEydDNTOVNmcUl1NEFVd2hlbDQ=","upper_bound":"TUtzVFJnU0E3Mkx0d0IxcGc4","repeats":1},{"count":755,"lower_bound":"TU1pNVBLcw==","upper_bound":"TWFSaWlCNFVxME53MURqZEhVM2x1VVAwN0RSVU5NMW9JdnFXQnV0MFNpNQ==","repeats":1},{"count":763,"lower_bound":"TWU0d0FKREpGRjFoOWNSbVNWalBhVlNxUVI=","upper_bound":"TXA2SGt4bEJvT3N0UzJwZzVMMFdkbkY=","repeats":1},{"count":771,"lower_bound":"TXdKNDFOYzNMZVpSVUVNamxnaElmRXFtMDFUdTlyYjdObUNhcHh2bU4=","upper_bound":"TkRVbGdyemRmekNFT2NxT3YxNmloUnVmaGd0T0ZudzJCWlpYVVU2Vkd2ZndDeG1wSHBCY0U4VVlHcmgz","repeats":1},{"count":779,"lower_bound":"TkhjR256TUJhRWhvdEpSTlY5TE01OXZWQnlqQUVHcm9nRQ==","upper_bound":"TlJhVDNaOG5FYWdrWEZaNklCcjBOSUdOTWVtSWd5NUVHSjMyR3R6WFRpdlQ=","repeats":1},{"count":787,"lower_bound":"TlV2NzlSbUZ4MktmTW0ybWxWZVBiaGdiUjlLMkpkaTA1cFc0VkE5cm5uN250WmYz","upper_bound":"TmRMSVN5ZWZUZWFNcTBBZ2ZNbE5t","repeats":1},{"count":795,"lower_bound":"TmhRbHJaOFZpNTdRb0QzTDhRU2lkaTR1eUdKdnBZMUVhdDJjMFN1QWxrbmJ6VzNldVFLcjkzdWc5ZHo1MA==","upper_bound":"Tm9wSURTVGJtdjREdEg4T2lOSjZKTE5wQ0xpMWZMYVdrR2xyaERnYzg=","repeats":1},{"count":803,"lower_bound":"TnJGSHpVS1Q5d2VPVHB6UjhlUWhORmtjT29FbGowekNEYlQ=","upper_bound":"TnowSU5xVGU5VDQ4YWtETXNNcFU4Sw==","repeats":1},{"count":811,"lower_bound":"TzFHNWpsOWtHY0RmUnRuMVFVNExwT1k0OXl0NkFCakk5SWFOSnhHYVIySTI2VmhDclhWdGhaOHRxMzI=","upper_bound":"T1NvWXY5bWplZnlZSGpxS1VSNkthRg==","repeats":1},{"count":819,"lower_bound":"T1Q=","upper_bound":"T2FKeU8yNUd4WERHZ1dEUVh5dkhnSllBUXBRTEhCcTVubXJ5SzFLblZ1NW5mZmdFSmp6","repeats":1},{"count":827,"lower_bound":"T2JNdzZiTHJJdXZHdnoxT2I4RzJWc1dqTWxuVzNTamI3b2t6WGFYb0l1WEJZcm92TnJqQmk1NjFaSDI=","upper_bound":"T2JxZDJ5bnpabDVraGFyc0NOcldmZFBJVU5qRHNDY05zbVpsdHBFQjhxY3Bn","repeats":1},{"count":835,"lower_bound":"T25vQ1RLa2dIZzN5cnd1SlFiSFcwNXFqN1BIdHhRQlppRkZQc2UwVkIzdlI=","upper_bound":"T3pWY044bnY4encxcGVPcFkyRWg=","repeats":1},{"count":843,"lower_bound":"UEJ6cjNHVkk4aUdzSnl4ME9mOXdXdTNMdVNCcWpDbzNicUdyY2hZR0wzYUc2NHYyUmF6OUU1ZnlDOG5xMlZC","upper_bound":"UE5OSTk5eFc4ZzBoZ2ZGbFpjMm82MmRXTQ==","repeats":1},{"count":851,"lower_bound":"UE5Ta0Ezb0NRNnhycVBqd2JaaFdlSmVCeGpMYVNoSVZrOVQ0dmI=","upper_bound":"UFFKMG5VSUJPNVZkeDNMbmRuYjNvdEZIdjZrZGR6bg==","repeats":1},{"count":859,"lower_bound":"UFFLUkxIZURURFljanNER1AwM21sVEo4R0Z3NGlHcUR4SUlFSW5uRTMyMDI1b0s1MVR4SFRBcw==","upper_bound":"UFYwdmFOY29STE1tbE5iVGlQOTJJdlF3bTA0OURuR1NFb0J1ZTd0ODkzRnZidVUzdGxFRg==","repeats":1},{"count":867,"lower_bound":"UFZZdHFwSENkd2dUbkZMYkxNUk9nTE4wMmN2bw==","upper_bound":"UGt1","repeats":1},{"count":875,"lower_bound":"UGx5R1hTZkxCSW83cVFoanNYZEhGaw==","upper_bound":"UTdMTmNOVUNJU3UycDRoRzloc01lVkNI","repeats":1},{"count":883,"lower_bound":"UUJMMFR4NlR0dG9EQTRWRGI4NkxoRzRPQjJwb3JLYXg0bWx6QWFsZ2tCdmlFT0QxT0hoRHVEdzZZbg==","upper_bound":"UVNmYmM2RDNYTE5WM2VYTzRUVlozNGRSYVpyWVdnZDZycGFTMmhObEZSTA==","repeats":1},{"count":891,"lower_bound":"UVg0ZnZTUzM2Sjdxd0RlNDNNUjhSMFFDWEEydjVhd2RLR2c=","upper_bound":"UW5ZZHlQV2FyejgxVXBxcW5uRA==","repeats":1},{"count":901,"lower_bound":"UXR4b1BEbEthcTRwQ3Q5R0swNzlnZGZpSzlvc3gyT1ZyUVpObmVJM3hjdw==","upper_bound":"Ug==","repeats":2},{"count":909,"lower_bound":"UjAwRDRqelJzRmtqMUhs","upper_bound":"UkRUdVdEQUpaa2ZmNzBDQzl6SEZzSW50RDB4dkt5Y04=","repeats":1},{"count":917,"lower_bound":"UkRwQjFodGYwcU4xVA==","upper_bound":"Ulk3VGtDanFrbnhmMjZybmVzN3JIeHZsZHdMdkxVY0huWmYwbzZENjV5","repeats":1},{"count":925,"lower_bound":"UnAzWEw=","upper_bound":"UnU0bkV3V09MOEFic29BdWJMb1NQRU15cFFKSkp6T29jOUFC","repeats":1},{"count":933,"lower_bound":"UzR5TndsOXlFZnl3a0daSXdxS3pkTWY4Y2RkOHZNUVZHc3g1TkV6clNOdEVJNU9YUVMyTWVIZ0p6UE9XUUI=","upper_bound":"U0JqcUo5QUplVUxaRVJUUjJFOGpLaHRPYkp4WUN1dHRVaWJiaTNXU0dhUW94UkQwYkpTRg==","repeats":1},{"count":941,"lower_bound":"U0ZuSUJ0M3ZlSktlMFB3eEJldFlpd2NvZUpOdklQMVVjV0VHVGltQlBENngxZU05MQ==","upper_bound":"U2NtWk9qWmhWSmE0Wnc0UTY3RVVH","repeats":1},{"count":949,"lower_bound":"U2NwY3NpbGJTOHZuWHhXUExEM1ZSR0RwYTFRUUlhczhZWkNwY3pzS05CdFY=","upper_bound":"U3hsZzlXeWI4aUx0M21ObWxXc2R5M01lNzcy","repeats":1},{"count":957,"lower_bound":"VA==","upper_bound":"VGNhM2VNd0NTRHI0V2JSWDVUUWNsdGd2Ums5cXNQNzVLbjlYbUFTRDFsRERIMQ==","repeats":1},{"count":965,"lower_bound":"VGxKYWYxOUp5aDJuSm1BZHpqZktyQXJRTGFFTkpmUlQ=","upper_bound":"VTB0d2tjRVJ5QTFzYmZnakJhQ2d4","repeats":1},{"count":973,"lower_bound":"VTd1MVV0M2pxMWdaUXlaRlhSbnFqMg==","upper_bound":"VUpCRk1waEVkSXQ=","repeats":1},{"count":981,"lower_bound":"VUtheTgzcXhPcFJ6ZmZTTDJVVVFSakRLZVRGQzZWT0I2SUJQaW0xdHhz","upper_bound":"VVVGQ0d6cnRBT20zYzF5ZFJkSlRuazRRdUN2ZHk0TUZOYmw2U2tuRHplOW9VSm9IN09yZ0xHb3FNZXlKTmM=","repeats":1},{"count":989,"lower_bound":"VVc=","upper_bound":"VWp5dkUxQQ==","repeats":1},{"count":997,"lower_bound":"VW5USWFiOU12SE9NQzJFcDl4dWprV2JtSnRwT1FkM29YUmhqOQ==","upper_bound":"VXg5R3FjSXl1UjVQNXc=","repeats":1},{"count":1005,"lower_bound":"VXk3SE5rRGxXMVcz","upper_bound":"VjZxRnpkM2RyZkxrYlJrOTJhaDNjS1dNaHN4ZFFySXBEWk5vcmlMZEtmUnRoRDlOZW5ZSFVzSEtS","repeats":1},{"count":1013,"lower_bound":"VkFwaEdo","upper_bound":"VkdzUlNFTzZET2ZiMlVydWxIY0NMQlB3ZzJ1OTNFTUJaR1BPZW0xaXRPRENmazVzVTI2bHV1NW0=","repeats":1},{"count":1021,"lower_bound":"VkkxT2R6clJxZXJlN3ZSSHNuRGd4UW9WSElkVnpQYm9nSUlOb1hDeWhBUjhGZzM0ZFBEQWhuYWU=","upper_bound":"Vk5aeWNTOW9xVjNTSEtWVlQzQ3dRa3VZSFhiQkRVMkE=","repeats":1},{"count":1029,"lower_bound":"VlB6OTdkb0VxRmljWktTanVzZ0xjejJtbVhad3RtczFv","upper_bound":"VlkxaFdRRHlkM3lpUG04cVNleU02NzZabmtyOEV3WWVValFS","repeats":1},{"count":1037,"lower_bound":"VmMzUEtWNjFPRTJlTFNTRGt3","upper_bound":"Vmg1d1ZhYThQOFJ3eWdHVA==","repeats":1},{"count":1045,"lower_bound":"Vmk5UXppbE5xOTl0SDhBYWN5OTRpRXZUSkE4ZmhjNHNOZFV3MmpKZFVzMVA3NA==","upper_bound":"Vms0b0hrTnNldU9kYXBBVjNHOEV2cFZEajdVWnZZU0IyUFlXSHZNNlZXTFkydUtubkZqbg==","repeats":1},{"count":1053,"lower_bound":"VnBHRlNwUFhKT0xIZXEwcmFJWU9UOUYwRU5meTZqbg==","upper_bound":"Vzc5Vmh1VGM=","repeats":1},{"count":1061,"lower_bound":"V0NxcFhReDNLZ0tQcWdRNnE=","upper_bound":"V05rN3h6cTFqODhqYTFrUHJSSnk=","repeats":1},{"count":1069,"lower_bound":"V1N4MmFhT2pBMnJDSGowZXcyeDN1RUFFdmtPNDltM1ZJa1N2ZzN0dmpoMg==","upper_bound":"V2ZLTzFqZmRVOGh1YXVseDFPN2J2RFZVMUs1cHRFaUtLeUhjdW13THM=","repeats":1},{"count":1077,"lower_bound":"V2ZPTDBqWW9GcXJGU00=","upper_bound":"V25ndGRZQ0NvYkRmZFZuYzY3N0NyZElNc1RyWFdRVHNNM0Q2U3Y5bWIwNVVKekZWQ2hIVGxQeldqdEZzdTU1","repeats":1},{"count":1085,"lower_bound":"V3lmVTlpWjlBcmJqZ2JiUzNYQU5qTmR5YmpzdWlpVHNFMmVhVDVGTQ==","upper_bound":"WDE=","repeats":1},{"count":1093,"lower_bound":"WDFvZm0ycXI4aVRDNGttcEJJTWtSaldRcHBJVm9GQg==","upper_bound":"WFM1R2NLcjI5","repeats":1},{"count":1101,"lower_bound":"WFVUQTFkNkZtTHIweGZTb2x2MzBDdFB1MA==","upper_bound":"WFhNaTZHdGd0RA==","repeats":1},{"count":1109,"lower_bound":"WFppak5yZFY4aHZmMGc2dFFLWmJQTzVLWmhPeGZ4RGlqa1pTSTZYN0d5Zlk4","upper_bound":"WHN0aVY0VkEzdkpXMzE2MGZqOUo3RHFsaGlFNA==","repeats":1},{"count":1117,"lower_bound":"WHh6Z3cwR2dYVQ==","upper_bound":"WTd0OTVDaDZpWnF2ZEdYSm81U1g3SHI5b2NSM05YOVBYN0xBTVdOMw==","repeats":1},{"count":1125,"lower_bound":"WTk3ZGV5OGE0TlpCSFZ6MThwZ29vaEVEdFlIWlVsYlk3","upper_bound":"WUp3Z2libUQ0eW1iVU1WRVk1UEJ3TWQ5aVlWekJOOTkxSUZvY3lXUg==","repeats":1},{"count":1133,"lower_bound":"WU1sQkF2eTkxTFl0VXdtMmZ3ZHI0Zkx6dXRiRUc5QWx0YW1iN1NRU0VyTHBOMEVqem5XRG5saA==","upper_bound":"WWlweWtNSmhxNE9IT1pQR0tZV1RiWE5QQ01LZk1mTnlJZkFpVQ==","repeats":1},{"count":1141,"lower_bound":"WW1FeFdUcjI1b3U3b096bTRJVUI5","upper_bound":"WjdUWTRWNzV4U2FHSTRuYm9qTkFxSTF0d1l5VE1VSjVTdkhmT1Q1TE5xWnJ0SlJoWnQwaQ==","repeats":1},{"count":1149,"lower_bound":"WkdFcTI5dE5Z","upper_bound":"WkxQV0F2aFJMQ3hFWElDWEg0MGZ1SU1ZUVYySFNaeDFHVVFUR0oyYWYzSHdq","repeats":1},{"count":1157,"lower_bound":"WlBhejYwNTdBQU5IU1BwMGJnMzBjWXY3dHZnN05QQjlnN0p4SFM=","upper_bound":"WmFBTTNtOENSRjJVRW1IUHVhNHNwaUYzSzNCYg==","repeats":1},{"count":1165,"lower_bound":"WmFIMHhiZHJWUUcxQ3JtUXJqMFo0b1JITU4wSXJFODcwME1zUjRrcHJXb0RLSkc=","upper_bound":"WmloUlo1QWF3M1dIVTFZdG9ubUVZclVMTUxwYUV5SVA0TVA0dGJBUlVmczVXdEo=","repeats":1},{"count":1173,"lower_bound":"WmtxYkd3","upper_bound":"WnFxcjQ3cmJnRk5ZTTBGR1NQUHJZZDI4Nw==","repeats":1},{"count":1181,"lower_bound":"WnU4N1VOeEZHZ1p6OWVMcEJCVEJ3R1BlM0pQa28=","upper_bound":"WnpJTmNGZnpjV3JGR3VTTUNKQ2pGekc5MDBxR3AyNGtyMUl3T3F3","repeats":1},{"count":1189,"lower_bound":"YTh2SmU2Tm5TSGJ3MlRFVzBXYkR6YnhLcWI=","upper_bound":"YU5wcXZx","repeats":1},{"count":1197,"lower_bound":"YVJvOFBONG9jOG1Db0ZwdWhQN094TDFnNUM5cHRyMXFnMUl6Z0hIV2ZnTjJaakpBaERrYg==","upper_bound":"YVpEdE5jWjNhTTBXU3pJYkpYYTBJRE9yMnhyQkhXUmhZcDZaV3NVQkJLUTBseEM2bkxrV3ZraEw4aUpScmJFeA==","repeats":1},{"count":1205,"lower_bound":"YWJWTUI0emNSdW1TNm5nd0F1NTBSNlZuWFVSOHc3ODVhb3lv","upper_bound":"YW1uUXBXank3aHZHc1BRMHhWeEg=","repeats":1},{"count":1213,"lower_bound":"YXFza2pXU3IyUTB6TWExMGJZck02SjJOMW8ySlZySlNpZ2ZlWlpDTFA2VWNSVnFmaHN0bXVNWDd5OWJoVGp1","upper_bound":"YjZ0bVlzd1lsdUgxbA==","repeats":1},{"count":1221,"lower_bound":"Yjk2MEh3OGx2ZkM2dFNVb2JBVXNxNDdsVmFPWk5Eb1prUXNibnc5YkYwU3o=","upper_bound":"Ykx3Y2VkSHFwSG9UOVFMUDBES3RSUHNZUEQ4WERqcmkzZ3NSWE8yYUVnVUJucG1wek9uN0FyYzNpY2w=","repeats":1},{"count":1229,"lower_bound":"YlBDMVVSTU04clc1aXo0bU1aZkczYThzWk9IVWJadm02SXFsbFlMeTZ1N2U=","upper_bound":"Ymg=","repeats":1},{"count":1237,"lower_bound":"YnJtZHNvM1VsSldkVFFIMzBkSA==","upper_bound":"YnpJS0lKOE95aTRFMW51TEtSTWhhSWc=","repeats":1},{"count":1245,"lower_bound":"Yw==","upper_bound":"YzJUWDJNNHlqWkNCRkxaeEVMd2c2aEo2THhwTVIyb214MGU=","repeats":1},{"count":1253,"lower_bound":"YzVJbHpDaGRU","upper_bound":"Y0hNaE05YjBuS1FUWA==","repeats":1},{"count":1261,"lower_bound":"Y0lMdkZDRzViM1JyVnVGdXBEc0lBMklCNWJmd2hMUTQ4Tg==","upper_bound":"Y1B2aGh6STJjTHRHMVpRWE9ncmp4SnpwWnB4V25GbWZYZ3diN0p3a0l3OFNXSW1SdXhwWm1jRFFzaEhQdVo=","repeats":1},{"count":1269,"lower_bound":"Y1U3MUdPWGNobHhsV1RnYWoycVFpbFF4cUpRczdVQWlKRU5kMGl6UDBqUlJYSmJl","upper_bound":"Y1hGQ2JQNDNDQld5QXJqTzRTUUNEMk41MXN5R0U5UVpZazFUWmdzbHJoMVA=","repeats":1},{"count":1277,"lower_bound":"Y2U2MndRVEd6d1FCZ0VWY293c3RIZg==","upper_bound":"Y3Btalc5SkhHOXd3SzdxYm1ObDMzcVJpanBDcXlDUDlWelBubkhYT0kxRGtmajVydFFJamZWcnRLUkk=","repeats":1},{"count":1285,"lower_bound":"Y3Q4ODZGZW5EbEZUOXdUaXlRYXdZcU9uOUw=","upper_bound":"ZDRKWU8=","repeats":1},{"count":1293,"lower_bound":"ZDhTWmp6cnJJNW1Udmc5d2U4YWlaVA==","upper_bound":"ZEZIQWVIVFBVcWZrZEdGMnFEcFJudWlpTTNXU2dhSHZndGd5S3BwdGFpUWVjODV4","repeats":1},{"count":1301,"lower_bound":"ZEtYQzFpZHVmdFhUNE9EUVNacnFMQ2hVakhDODgxbmk3MjNhZUI=","upper_bound":"ZGExdDhQR2JoZjRPelRLYnhaS2tQZndjajNaQXQ=","repeats":1},{"count":1309,"lower_bound":"ZGt5dWFEbkZXYlk1UUh0bEhsWnhaSlFLVXIwZjBYME9qc0RhMQ==","upper_bound":"ZHVQcGVTTw==","repeats":1},{"count":1317,"lower_bound":"ZHkzME5JZWhIUTN6WWVibGhJVjlKUVE1bkttNWJqRXh2WkZXSTlBalNwQUlJZDk1bVJQdw==","upper_bound":"ZTRUU2ZQNDFJemh2WUlJZWdzNnk3c2FmUjg2S242UTIxVTBMYUF5cW1JVnB5MXFXS1hhZA==","repeats":1},{"count":1325,"lower_bound":"ZTVINlpoaU8zTWdzWE14STQ4REU2amxBYUNRSTlLZ2xyZjhRdHRncHI2VTE=","upper_bound":"ZVZaaTNHZ2ZOUThjRG1YOFVnY05HNnFzOVpHUExWdHVqNXdnQWdqbTFMb1Uyb1NYd1RLSzhY","repeats":1},{"count":1333,"lower_bound":"ZVpKSkZyU2ttc29mTUY=","upper_bound":"ZW9IWk1wRnZvV3VMUmhsYkVXZDludjhrbUVtZzAycUQyN0dSWVY=","repeats":1},{"count":1341,"lower_bound":"ZXNNZW5qS2tqbzRDVEJzYnVCVjBQT0hwbTg3OWY1c0dSemhxQWhkbGRIVVR4TGFTWEE0d2x4","upper_bound":"ZjlzNmlSaDgx","repeats":1},{"count":1349,"lower_bound":"ZkNZcmpreVc3ZHhTVVU5N09Ka0ZMZGdUOFZZQzk4am9xSnNRUEZ1STNOaXJUU0dXNG5ZdUQ3QkxwMG53aA==","upper_bound":"ZkVyYjRUM1NsNXE5cmM3RVlzRnRVTEkyUjEwYk43SW1JWThiOTVEUjh4WDFlTWw0djZ3bDBRdmRnak10R3o=","repeats":1},{"count":1357,"lower_bound":"ZkhMZFVVNXh1MTJnclVPSjZsNHN0ME44S0hvUmpxU21MOFdoYWdDcGdPUHdkY1VlVFgwSFpGbHpO","upper_bound":"ZlpK","repeats":1},{"count":1365,"lower_bound":"Zlp4RE9VVWVjWnpxSUpkbENIVThPajRuSUhEOHlEZjdidWVRa0dCWUxJSUlFZ0NzMnVTSTZk","upper_bound":"ZmRqRG0=","repeats":1},{"count":1373,"lower_bound":"ZmVOQk5OdkdiNE1yZFY=","upper_bound":"ZnBJemRJUmNu","repeats":1},{"count":1381,"lower_bound":"ZnBNNEJEQ1p5bG9kOXM1NmJRQTU4TkMxWHd1b21wcWIwUmQ3SU1J","upper_bound":"ZzViU0FqeWtFeFNRUmtndkJYb0RNYXhJVVl3","repeats":1},{"count":1389,"lower_bound":"ZzhqdlVnWjl2RUx0OVlrc2t1V3FpN2ZGb0RHbGQ2QUdwNVN1dWdOZ3haU1NBT1lJdTVTa00ydVBZeg==","upper_bound":"Z0U2QkRnR3lNbjhTbTFaTUVDeEQyWTc=","repeats":1},{"count":1397,"lower_bound":"Z0dtVWZoNEJRR0sxb0pjZ3doQzd5UEtiUVlod05KeVRzM3d6dUdKNFpZNlRMNFI1czNPSmhVVUJWazk=","upper_bound":"Z1RKQzBjeG93ekxKSlRGamRYNndUeWtwWWxtNjVjbzNQcW9RVXFOaHluNTNsM3plYw==","repeats":1},{"count":1405,"lower_bound":"Z1dkeUo3RmxFZEtVMkR0aUNwZkoxdVU4MTd4Zmprb05XR3E=","upper_bound":"Z2g=","repeats":1},{"count":1413,"lower_bound":"Z2w=","upper_bound":"Z3Zlaw==","repeats":1},{"count":1421,"lower_bound":"aDE1VkQzYUpIU2tmN2k2UHE=","upper_bound":"aDV6d1pPRHh6Ymxvakp0a05FMkhPVVV4R0l6ZDliWEZUeg==","repeats":1},{"count":1429,"lower_bound":"aEJMZ1JyaENv","upper_bound":"aE8waXpBRjFORGNNVGEwanVNRTg4MVEyZ0RBbVBkeG1NZjEyeGZFeU0xeVpQU1hqU0huUXNuc1o=","repeats":1},{"count":1437,"lower_bound":"aFBhZUxDOVIxWklrMzlY","upper_bound":"aFhKN1NLMTI0ZFpPb3k5N2I5c25ZOVo5Qm1oWTNkOUZOMFV1bGhUeEQ=","repeats":1},{"count":1445,"lower_bound":"aGJYTnVGMFZKdklPd2ZjeVo4Y1dzUzh5V2lPRnNTYkVYMXo1dHVydEpFZ2plcDU1bWNvb3o0aDFESG1L","upper_bound":"aG5OYUZTMXA3WjJIbUhpdElib1FhUzUyOFZQaEk2ckh3","repeats":1},{"count":1453,"lower_bound":"aHBTRGZYRFk4bWp6b2ZhalFqN2pVMm9WSFpXODR5RElmcU9SNQ==","upper_bound":"aHVUbmxVZkdoUlF5UUlXbXNRb21ZNGxBVlJjS0lCZU12c21kbjh2YksxZUtlVlla","repeats":1},{"count":1461,"lower_bound":"aHZSVXRqczFPb2tnWnZsenBqN1hHRmNyRlc5QkNFSHFJSVlOV0JCeWk5bFQ1QlNwSUQ=","upper_bound":"aTI1d0htVGpua3AzTWs3UE51blduQUpra2x1cmpBSlNnaE9JRlJTRWdIVkFmREE=","repeats":1},{"count":1469,"lower_bound":"aTNQWkRId09D","upper_bound":"aUZJTVFIQmZlUGFQUTlPRWlhQ2cwQ2VtSkhqbG9DRTZvQlJpRTdLdmxZQTljTg==","repeats":1},{"count":1477,"lower_bound":"aUZ6aVYzUlVxYmVma0tyWkl3eGVaMW5YM3kzSUI=","upper_bound":"aVUxeWxoUkVuMGxUOEFaN2EyMGxmN1UwU3MyMw==","repeats":1},{"count":1485,"lower_bound":"aVVVTXRBQW9yNXJkd2FmYTdqVlhkSnNtN0pYUnRyY0lrVGhtVU1YeWlpNVhuSg==","upper_bound":"aWxCa1lra1hBVVRicHNHVFlZYXpQMm8wN3dKanlvTlJMZw==","repeats":1},{"count":1493,"lower_bound":"aW0=","upper_bound":"aXgwT3pjSUZQcWNxT1RkWGRxZ2pCemU1dkdTWlBYZGhQNDlYeXdGVkZGWjY2eFEyeFF1","repeats":1},{"count":1501,"lower_bound":"aXk0ZFg4TThPZndmcXV6akRpdkt5TVJHUHhPYW1rUEZtMUZnNjFYNGtnSlF4d1A4MFlJSlcy","upper_bound":"akFmdkpOZVRIaTh5MXd5Vjc3aks3SW5iOGpsU1kzN0R0dDdBbWhjbg==","repeats":1},{"count":1509,"lower_bound":"akN5OUZSdm1FRE1kV0V6dXZXbUxGU2F1T0MyTWZRRXI0ZU1mRHpvaktPMG5XbmFQdHpEQ2dNbXN3Yg==","upper_bound":"akl5bkNoa0pZN1dBS2ZhT3Z6QUtkVzJET0RQa2MweXhjZkNYelp0eVJQaUVrZGxrdVc=","repeats":1},{"count":1517,"lower_bound":"amV1MWRORlk4cUtXQ3d0NWFBS1hORw==","upper_bound":"am95TkhkN1hJbGd4WnRWc3JZMTQ0dDhCR0NWd1A=","repeats":1},{"count":1525,"lower_bound":"anJ2VEM4MENmUWp6OXFrTmI1","upper_bound":"a0JiM0dOUjhUMEExNFdGeUk5aHpUSEMwM2lrNUxvS1AwSHNCcE9BOGgxWGpw","repeats":1},{"count":1533,"lower_bound":"a0NR","upper_bound":"a1l4Z3R1NFpVOGZwZkpEdWlUeWg0N2pUOVF4b0M=","repeats":1},{"count":1541,"lower_bound":"a1pTSEJIQnQ5SWRndGwybEY4dmJjb2pVZk96RmYwY3I1SzJwdVNxS2d4SXMyU1JiaWQzNWozZA==","upper_bound":"a21jaExPUTFTeXZDOGZ1N1pNdHFXbDV3bG5Kd3VkczdWQ0hRY09TaVJVekhtc1hyUkNEb3Z5ODF1UWY=","repeats":1},{"count":1549,"lower_bound":"a3R6SUd3ZVFCekh1NVh4UEFxWngyRUlTZldTbGhSeFllbjg0T2tUS29LS083NlNj","upper_bound":"a3p4THQy","repeats":1},{"count":1557,"lower_bound":"bDE0N3lLOW53","upper_bound":"bEgzbw==","repeats":1},{"count":1565,"lower_bound":"bElKWm9EbFR3MnJZb0xHcXdVdWlEUHVPc0x3eTRtTEtqUmtPRmNQZw==","upper_bound":"bFdqekVDb1VXUHprNTJLSWZPRHBmSVQ0WlZWc3RNMzNSMXhkUGxLcktMTW1rREE=","repeats":1},{"count":1573,"lower_bound":"bFhKSHJWUzkzSDRFVUpxRWh2YXFYaUNSeExWaHJJRTE5QWdudFhSVEtnWjFYUjJL","upper_bound":"bGpFRktLTGtLbFF4WUFmT3NJVFhGRHlyc0k3MUhBZA==","repeats":1},{"count":1581,"lower_bound":"bHZVaUhNeUNhM1pQbThvZTFNblM2R1dQZmlNVFdPNzdteEh4ZmVRcVkwN2pOaQ==","upper_bound":"bTZ0MU9GSnZ5aUdZWVpNUDh2V21wVTdoUjN1TmxjQXYzRFhlcld2NXBGVXpzcXQzeQ==","repeats":1},{"count":1589,"lower_bound":"bTdVNkd6UzRoTHJad28zZ3dPYWJ3dU90cXVyOUo3NjZ5NU1jQWp6V0VYVGlxMDBmRnBJY290RzA=","upper_bound":"bUszWDBLYUVPOFRQQkNkUkRjaTdsU3V3WHkxVDZoTWdPMXpXM0JTekl3MDJpRFk=","repeats":1},{"count":1597,"lower_bound":"bU0yWVhPTHhjM0FUY2Z5UE50Nks3V3pobnNrdXJud3RFSkNxbnFzWWtMelRpR2FqNnkzNWFONFlJaDBhRlM=","upper_bound":"bVRmUURJb2FZRE9kbGZUSnMxalI1TWE3Mnh3OFBGbFExUWxMSVV1Z2NqM0Fl","repeats":1},{"count":1605,"lower_bound":"bWdOSldRSnR6Mlh0SzlHekkxNkVwVm5sWnB3Vml3YmVrbDJtV29G","upper_bound":"bXNPMUkyejhSVlhzTmlzekFXdmhldmVoQzZUb2RwSklVbA==","repeats":1},{"count":1613,"lower_bound":"bjV1OA==","upper_bound":"bk52Z2huMWNXVVV1TVhzQlVwRDN4c3ZSRVpnU01jdXc=","repeats":1},{"count":1621,"lower_bound":"blVLbg==","upper_bound":"bmZIaGVOSk5tRjZDSDVuMmk5emtqWFo3Rmg=","repeats":1},{"count":1629,"lower_bound":"bmZmZFYzMTVqUEFDWnplM1M5ZXR2ZjlWRnlqWGZG","upper_bound":"bnh6czdxWlBiZXhiWkNEQ29McDVFTk00TUxyQmZNNnpGSUNZSXF3Qw==","repeats":1},{"count":1637,"lower_bound":"bnl1Rg==","upper_bound":"b0hGQkNlZjhuTlR2SFZWY015dlNFUFYxcWxKYnJPVA==","repeats":1},{"count":1645,"lower_bound":"b1BTd1paSWxWUjJyZExFdVhlazdiTXFJaFcxUjVNR3FPemUwdVBGejVnUkFPMUNsYkRCcWd3bkRV","upper_bound":"b1Y1S0hRYVoySWlpMXFySG8zelptdVRjdG1M","repeats":1},{"count":1653,"lower_bound":"b1l5cE9sUzdIRFpDMmtLSVQ3TmJ4QkRTaDF6eWVPWWZmek8wMmhhamtTRXFZME55VlZxaVRESnQ0NXpYMVBjTw==","upper_bound":"b24xaGRwSTVZdUIyTDlleFByMXB6M1J2YVB0RmFNbkhJaVhCRmVYeEZCUkFRa0t6d2hNY3pyNmJRbEQ5TzhD","repeats":1},{"count":1661,"lower_bound":"b3hEWjg2OXhKdDk3akhl","upper_bound":"cDVodDRXVlFuYmdTTTVNblU2dWF4ZTdORnFIeXJFRkg0YmZ2QkE0T0tiRDFOQzJUM2NZRkpFRVdua05pVko4","repeats":1},{"count":1669,"lower_bound":"cDlBNWs3d2ZBc3BGellDcWtvUG12cW9GY05kTHhKWG9tOEhPWVNsQTJYMzllenlkR2xO","upper_bound":"cEpkZHpFUnpWbGhaZ3EzazA0VGoxdWQxQ0g4SWVvQnBLU3htVU5kVmJMd25Qa05rVGM2TUdPSFhvOQ==","repeats":1},{"count":1677,"lower_bound":"cEptWlVRdlVqaDZPd1ZubWZoek5zUWdhUUtrSnpldFVDY0FKNVE5NkU4N1JG","upper_bound":"cGUzRWF6SnltcFIySA==","repeats":1},{"count":1685,"lower_bound":"cGZGUmZlUW5HaG9sWHBaSFRrZng5dU5KblJTWnh5U0tQTzBNSjd0bzFtY0xHQWdUTktuelNMUjJ4aDNQRUZiMQ==","upper_bound":"cHJYanZnczFZc3A5REpr","repeats":1},{"count":1693,"lower_bound":"cHZJd0RscTNQcw==","upper_bound":"cTY2S1dtNWpVN3ByczYwdU5IbGo4aGNDRGRYSTZUZTZWNG9nZWNsQ0pGMU9jOEE0aG9LZXpFUTR1YjM=","repeats":1},{"count":1701,"lower_bound":"cUJvTXQ5eVlNV1h0T1JUYVZxQmk=","upper_bound":"cVBLd0x6Z2U2","repeats":1},{"count":1709,"lower_bound":"cVY5NTFKN0xuOE9mc2ZieUdGNEt6V0p4OWhDaEZUanVGdU5LMUVFY2tOM2hS","upper_bound":"cWJSZ2Y4ME5N","repeats":1},{"count":1717,"lower_bound":"cWgxWTlHTXJvNDR2ZXNtc3lnaVg5S1QwTGlS","upper_bound":"cWh5MlBhaFl2MTVIVVRIUGc3RHRjanBNZ2dReGVZQWFrbjBnTTNvMVZqS25kbXFFbTNWMA==","repeats":1},{"count":1725,"lower_bound":"cWlmMlQ0UA==","upper_bound":"cWxLT1N4b2VhdFl4VDE4b3lHSHlPazdLVGNkZW54","repeats":1},{"count":1733,"lower_bound":"cW5WMzZJazJHQndzemRZbQ==","upper_bound":"cjZl","repeats":1},{"count":1741,"lower_bound":"cjdicA==","upper_bound":"ck5IYXR5UlI5clhSSnZNRA==","repeats":1},{"count":1749,"lower_bound":"clBaaTVaenFRb29TOFhZNktSdXowYjJQeWxBSlVNSldaZGJXWA==","upper_bound":"clpxamFVUTJuYnVkZGtUUW5wZ0RTVEJxT0p1WG5lckMzUE16YUtjMFNDbWxLNVhYWHczekds","repeats":1},{"count":1757,"lower_bound":"cmRBMGl1a2h6NzRLdWQySw==","upper_bound":"cmxvbndzd0JteEtsY0x5NXdlOGtTbWIwYmg0M05NTmVzZmZLNWhNSHZOaGxqRHhZeVZlZEpiZUNNeElI","repeats":1},{"count":1767,"lower_bound":"cnBDMmpQMG9iUXhsZExUWGFOZ0FLYnFRV1BtbkU3OHlEV0xUb09GR2tVeWFvRTRFbDFXUEZMTVVWYXg=","upper_bound":"cw==","repeats":2},{"count":1775,"lower_bound":"czVvMlpjTHZBc3VVdENDd0ZNWGN6SWo1aFRac0tKenI3","upper_bound":"c0tjYm50d3RqS3da","repeats":1},{"count":1783,"lower_bound":"c01nSk1Y","upper_bound":"c24zVnZBZUtCMm1LdkRIMnlYZDc3a0xKbjlDdThiTzNRQUhiUVUyNXI4am5nNFI2YTFKWkFBNUw=","repeats":1},{"count":1791,"lower_bound":"c3NabVFrczZjMDRHNXhYSUgzRVFoMUs5eWVqZXRVVHZBZG9uWjNtQUFLZXFWZTZqa1VjMGZpOFY2SXIySQ==","upper_bound":"dDhlWnIxakN5RGpDUGNjSWo0T0JwQVNEYXBmS1Az","repeats":1},{"count":1799,"lower_bound":"dEtENE5ia3JTUHo1SlRxZFZTS2V4ZzlWQU9LMmZ0Z3JERUE=","upper_bound":"dFRBcVdBTHhNSlM=","repeats":1},{"count":1807,"lower_bound":"dFlmTzVxZnByQXNJcm5ZN2RuNg==","upper_bound":"dTE1ZkNqWllIaXRWZDRi","repeats":1},{"count":1815,"lower_bound":"dTFSb1ZkdHhZRHJKRld6cGlxSERyaGFLdlpBcjQ4SVZ6TUpoZmNHUzVoem1ySUplbTNKbUJhbEs=","upper_bound":"dTlNYzJ6NlQ2WHd6MEk4ajgwc1ZMYzRhMlNVN0JxTjhsQWc4djNiMGNtS2pqU0dWSWhNck1MR2ZxZ0pVYg==","repeats":1},{"count":1823,"lower_bound":"dUlMM0tkRnlhSG9JQVB1V3NKOXVZQVptRGx2U2FuNXg2N3FLcGQ2ZlphWHNwSkZLakVYczFs","upper_bound":"dWhJclB5Z3BJUTRHR1RhcERtU29IcEdLMkQ3ZGROcDU5dWQxZHdXekNlOXB6ZFk2ZDRB","repeats":1},{"count":1831,"lower_bound":"dW5INjFJQWxzSGJqd1JCT0tYbUJ4emN1Y2hDdWE2SlpCY3NiYnN6MXY=","upper_bound":"dXRTYVlhdXo4Ym9EYldNNFdtYWRLbWdRTWpleFFaak92MUVwUjNO","repeats":1},{"count":1839,"lower_bound":"dXY1andhcThoY2NSYw==","upper_bound":"dkMwZ3JsbWNPd2lnb2VtdUoyd25pZ3dwQ3MwRUVKVVpNN2R1T00ydzU2QVIzSkdaemJIcU04","repeats":1},{"count":1847,"lower_bound":"dkdmYUFocVVheFJEUFpqS0ZO","upper_bound":"dk1FdGFlaHBVRkltcGttUFlwQkxnbjdtUkg0b0tUWklNbUNWRHlOc1E=","repeats":1},{"count":1855,"lower_bound":"dlAyYllDUUhrYjNVTDBmcTQzVjFsZlFwdWJvZDBvTEZXRDFmeDd1Z1ZEa0tpVGYyQkRYZW55T2hW","upper_bound":"dmFaTVZTYTRocDFxa0t2ZldXallmelgwNm9FcjlITU85SVpi","repeats":1},{"count":1863,"lower_bound":"dmd2Q3duSWdlYVJDY2RYbUE4eXVVR21qaVNWWFlhY1Y5eFNIUkdJN3JxVnhhcA==","upper_bound":"dm01UTVkaWdXR2hOeVl5NlpjczNEMGNubUl3eHJpaU5WZTBCQmR1eDNCb0pmZG9EV2lVOGV6bVMyandoR3g=","repeats":1},{"count":1871,"lower_bound":"dnBPcTdTMTQwOGJZbHJDVnpwb25hNnhJdW45ZE5ycWp6OUJHN2RV","upper_bound":"dzNkaFo1emV6SUhkd2RRUQ==","repeats":1},{"count":1879,"lower_bound":"dzZVR1U2RXJMM1hPTGFURGp3Zzdr","upper_bound":"d0VIbkNJbEZFOWIxQ0VBUk5HWkNuWmdGQThxTmlseTNBc3Y2Y2F3eEw=","repeats":1},{"count":1887,"lower_bound":"d0ZzNE4yRGF1QlFMYm4wTVRlQUlsbU16NFVsWXVLcWpLZlV2ek1DbFBGT1RITzA=","upper_bound":"d05rY0RmY245SDdOaktQZmZ2Qm9LSGRSZlJwdjVuT3hZQWlJOUpkZTBMejRxbHVPNmdGZDhaNFlt","repeats":1},{"count":1895,"lower_bound":"d1BZMkxqUHk5d1JMSDNGdEJqWmpTN2Jpc2pW","upper_bound":"d1MwWE91RjVWVWVZUlNXRmhRMEs3VkFOT2FyalJ3RXNQYkZQMXpuQ0xlcFg4bkczdlQwbjQ=","repeats":1},{"count":1903,"lower_bound":"d1VraWhUbTBobmJIRFAyY0Q4TjdyU3B1TlVuaGN6U0lxSjNoZEhka09mekF6bmU1YTZtZnFHTjY=","upper_bound":"d1Z1WUxTUkhnb2dlOW84UUQ=","repeats":1},{"count":1911,"lower_bound":"d1dnUXQ=","upper_bound":"d2g3VTBHM2ZKcXp3Y08=","repeats":1},{"count":1919,"lower_bound":"d2k3RGJYTzdiQmpmaExHUzc1bjZUTjk=","upper_bound":"d3cxV0VQcVA4aGpnellYODNGa09WSXVuSDRKZFpZa3pi","repeats":1},{"count":1927,"lower_bound":"d3dtQnNtbkxuNFhjb1hZSFliZlBoeXNpb2Q1akFaYUZoTzhUZWtrMmhoSWtkNFBrMXo=","upper_bound":"eDVzazBDQUllVE8=","repeats":1},{"count":1935,"lower_bound":"eDdlcnBZTmFZaEJmOU5ZSTRZN2FGU2JUVWNHdWhiMVhIbzc=","upper_bound":"eENTV01zZk1tYUxmZWR3MzZPcTA0NUl1WkxLMENSV2NOMlg3Tw==","repeats":1},{"count":1943,"lower_bound":"eEYyS1l4Q2lWRHZNUzhmTlk3Mk1LZXZVTzlWb3Js","upper_bound":"eE04Z1BUUDk3dVJ6MURXZ1RkTmp0aUk2bm1PUXRRS2E1bHNjMEttNTIxOTNaeGFFMXNJSUtR","repeats":1},{"count":1951,"lower_bound":"eE9aSDVNbzdnSm5pNUJ1S3V0bFNNNERXZFY=","upper_bound":"eG1GT01kbmdBMkVXT2hZYzBuRnFx","repeats":1},{"count":1959,"lower_bound":"eG8wbktvYzJ3eFRRTlI1blczZEQ0YnhTYjhuSHRveHM=","upper_bound":"eThlSm5GNGhhdFV5R2Y0cFFlbUQ2cWFEdHdoY1hTd1pTM29zYnZuY3pzVDF4b2FYNWljNGFkZ2dONDMy","repeats":1},{"count":1967,"lower_bound":"eTlPT2lNa0ZyQ0U1UVRLMHExRm5iV3p5U0RIdnFwQk1Vd0MydHB4eGo2OFBjbmM=","upper_bound":"eWJ6OTNLU0xkZVJ2RzFvT2NMN2kyZlVVQWtVRGQwMXZlNDVjWFUzZVdFOWdEZUxjcFo=","repeats":1},{"count":1975,"lower_bound":"eWZNUjhGSWJWMlRnNnp2","upper_bound":"eXFOajJ5OUVY","repeats":1},{"count":1983,"lower_bound":"eXVyS29MOVU4UjdZenRkdGlLaGpxeHRHZllOcHBFVENxMXZETzU=","upper_bound":"ejhuOGhnZW5FSk1JaGtabG9SMkZQM2FkdGt1YnhFaFNmQnpnSHhFZm9yVm1iNXYycDAzQW5oSEFOU0k0Um8=","repeats":1},{"count":1991,"lower_bound":"ekRCNHdYVVM0Q1VMM0tTNkFDMlBjNGdnUGFGcnVlSkVwdU03dG96TTQwanE=","upper_bound":"elBQSnE1VEtoYWI=","repeats":1},{"count":1999,"lower_bound":"elUxTzlhMm1uUjZLQ25VVWVweEM2eU1ZbDl5dEdrZQ==","upper_bound":"endW","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,2,2,0,0,1,0,2,1,1,1,1,0,1,0,1,2,0,0,1,1,1,1,2,0,0,1,0,0,0,0,1,0,3,0,2,0,1,1,2,1,0,0,1,0,1,2,1,2,2,2,1,0,1,2,1,2,2,1,0,1,0,1,1,0,2,2,0,0,1,0,1,2,3,0,2,0,1,0,0,0,1,1,1,1,1,1,1,1,3,0,1,0,1,0,1,0,1,0,0,1,0,2,2,0,1,0,1,0,2,1,1,1,0,2,0,1,2,1,2,1,0,1,1,0,0,3,0,2,0,0,1,1,1,0,1,1,0,0,4,0,1,1,0,0,1,1,1,0,0,0,1,0,1,0,2,2,1,1,0,1,0,2,1,0,2,2,0,0,1,1,1,1,1,1,2,1,2,4,1,1,1,1,0,1,1,0,0,0,1,0,2,3,1,0,0,2,0,5,0,1,0,1,0,0,0,2,1,1,0,0,0,0,1,0,1,4,1,1,2,2,0,1,2,1,0,1,0,2,1,0,1,0,1,1,1,3,1,0,0,0,2,0,2,1,0,1,1,1,1,5,2,3,2,1,3,0,0,0,1,0,2,1,1,1,1,0,0,1,1,1,1,1,0,1,0,1,0,0,1,1,1,1,1,0,3,1,2,1,4,1,0,3,3,1,2,0,2,2,0,2,1,0,0,1,0,2,4,2,1,1,1,0,1,0,0,4,0,1,3,1,0,0,1,4,0,0,2,1,0,2,0,1,2,1,0,1,0,0,1,1,1,0,2,1,1,1,1,0,0,0,0,1,2,4,2,3,0,0,1,2,1,0,1,1,0,0,2,1,2,1,2,0,1,3,1,2,1,3,1,2,1,1,0,0,0,3,1,3,1,0,1,1,0,1,2,0,3,3,1,1,0,0,0,2,1,3,2,2,0,0,2,1,2,2,0,1,0,1,2,0,0,1,0,0,2,3,2,2,0,0,0,0,0,3,1,2,2,2,0,1,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,0,0,1,1,0,5,0,0,4,1,0,2,1,1,1,1,0,0,1,0,1,0,1,1,1,0,1,0,0,0,0,1,2,1,0,1,3,0,1,1,1,0,1,0,0,0,4,1,1,0,2,4,0,4,0,0,1,1,0,0,3,2,1,1,1,1,1,4,0,0,2,0,1,2,0,0,3,2,1,1,5,1,2,1,0,0,1,0,0,0,1,2,0,2,2,0,3,2,1,2,1,0,0,1,1,1,2,0,2,0,1,1,0,2,1,0,1,1,2,2,1,0,0,1,0,1,2,1,2,1,1,1,0,1,3,1,1,0,1,2,1,1,0,2,2,0,1,1,2,3,0,2,0,2,0,2,2,1,1,1,1,1,1,1,0,0,1,1,0,2,0,1,1,2,1,2,0,0,1,2,1,2,0,0,0,2,1,2,1,0,0,0,1,0,0,0,0,1,0,6,2,0,3,4,3,1,3,1,1,1,1,1,1,0,0,1,0,2,2,1,2,2,0,1,1,2,0,0,0,2,0,1,0,0,1,0,1,0,0,2,3,0,0,0,2,1,1,2,0,1,3,0,0,0,2,1,2,2,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,2,0,1,0,0,1,1,0,1,2,1,3,0,1,2,0,2,2,0,1,0,0,1,0,1,0,0,1,0,0,1,2,2,1,1,3,0,1,1,0,2,0,2,1,3,0,1,0,0,0,0,1,0,1,0,1,1,2,1,2,1,1,1,1,3,0,1,0,0,1,0,1,2,1,1,0,0,0,0,3,1,0,1,0,2,2,1,1,0,3,1,1,0,1,2,0,2,0,0,2,1,3,1,0,0,0,4,0,3,1,0,3,0,3,1,1,0,1,3,0,0,1,1,0,5,1,3,1,1,0,1,1,0,1,0,1,0,1,2,0,1,0,0,1,3,1,0,1,0,0,1,2,2,1,1,2,0,2,3,2,1,0,1,1,0,0,0,0,0,1,0,1,1,1,0,1,2,2,2,1,3,0,0,2,4,2,0,2,0,0,1,1,0,1,0,1,1,0,3,1,1,2,2,0,0,3,0,2,0,2,0,0,0,0,1,1,2,0,0,1,1,1,0,2,1,1,1,0,1,0,0,0,1,1,0,0,2,1,0,0,1,0,2,2,2,1,3,0,2,1,0,0,2,0,2,1,1,2,0,1,1,0,3,0,1,0,1,0,0,0,2,0,2,1,0,1,1,0,1,1,0,0,0,1,0,2,3,1,1,5,1,0,0,0,2,0,1,1,1,1,1,1,0,0,2,0,1,0,2,0,1,2,0,1,3,0,0,1,0,2,1,0,1,3,0,0,2,0,2,2,1,1,2,0,1,1,0,0,3,2,0,1,0,0,1,1,2,0,1,0,1,1,0,1,3,0,0,0,0,0,2,0,2,1,2,0,0,3,0,1,1,0,3,0,4,0,2,1,2,0,1,0,0,2,1,1,2,2,1,0,1,3,2,2,0,1,2,1,0,1,0,2,0,1,2,2,2,0,0,0,4,2,0,3,0,0,2,2,0,0,3,1,3,0,2,0,1,0,0,2,1,0,1,0,1,3,1,2,0,1,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,2,2,2,1,0,0,2,1,0,1,1,1,0,2,3,0,0,0,1,2,1,1,3,1,2,0,1,1,2,2,1,0,2,1,2,2,0,1,2,1,0,0,1,1,1,0,0,0,0,1,0,2,0,2,0,2,0,0,0,0,1,0,0,1,3,1,0,1,0,2,0,2,3,1,1,2,0,3,2,2,1,0,1,2,1,2,1,3,2,1,0,0,1,1,0,0,4,0,0,0,1,0,2,1,1,2,1,2,0,1,1,3,2,0,0,0,1,1,2,1,1,3,0,1,2,2,0,0,1,1,0,0,0,0,0,1,1,2,0,3,1,0,2,1,2,0,0,0,2,1,2,4,2,2,2,2,0,0,1,0,2,0,0,1,4,3,0,0,1,1,0,1,0,1,0,0,0,1,4,0,1,1,1,1,2,0,0,1,0,1,1,2,0,2,0,2,0,3,2,1,0,2,2,0,1,1,0,1,1,3,0,0,1,4,1,5,0,0,0,0,2,1,0,0,1,1,0,1,1,1,1,1,1,0,2,1,1,1,0,0,1,1,1,0,1,2,0,1,0,0,2,1,0,0,2,1,1,2,1,3,2,1,2,1,0,2,0,1,1,0,2,1,1,2,0,0,1,0,2,2,1,1,2,0,2,1,0,1,2,1,0,1,2,0,2,1,0,2,0,1,2,0,0,2,1,3,0,0,1,1,2,1,3,0,0,0,0,0,0,0,1,1,2,1,0,1,0,2,0,0,2,1,0,2,0,1,0,0,0,2,1,1,2,2,0,0,1,1,0,0,2,1,1,0,2,0,1,1,1,2,1,0,0,0,1,0,2,0,0,0,0,0,1,2,1,1,1,1,1,1,1,2,1,0,2,1,0,0,1,1,1,0,0,1,1,0,2,0,1,0,1,2,0,1,0,1,0,1,1,3,1,1,1,1,2,1,0,1,3,1,1,0,0,1,4,6,1,2,0,2,2,1,1,0,1,1,1,0,1,0,0,0,2,2,0,3,0,1,2,0,0,2,2,2,2,3,0,0,3,2,1,0,1,1,0,3,0,0,1,2,1,2,1,0,1,1,1,1,1,1,4,1,0,1,2,1,1,0,1,0,0,0,3,1,2,1,3,1,2,2,0,0,1,1,1,2,0,0,0,1,2,1,1,2,0,0,0,2,2,1,2,2,1,0,2,1,0,0,2,0,0,1,1,1,0,1,3,1,0,2,0,0,3,2,2,1,0,2,0,0,2,1,4,0,0,0,1,2,2,2,0,1,0,1,1,1,1,0,1,0,2,2,0,1,0,1,0,2,1,0,1,1,0,2,0,0,1,3,0,1,1,0,0,0,0,2,1,0,3,1,0,1,0,1,0,2,0,0,1,1,2,3,3,1,0,1,0,2,0,2,0,0,0,0,0,2,0,0,3,1,0,1,2,0,1,3,1,0,1,1,2,1,1,1,2,1,0,0,1,1,0,2,2,5,1,0,0,1,0,0,2,1,0,0,1,0,1,2,1,0,2,0,1,1,1,1,0,1,1,1,0,1,0,0,2,0,2,1,0,2,3,1,0,1,1,0,1,2,2,0,3,0,2,2,1,0,1,0,0,3,1,0,0,2,0,3,0,0,1,2,0,2,1,0,2,1,1,1,0,0,1,1,5,0,1,1,0,1,1,1,1,1,1,1,3,1,1,2,0,1,0,3,0,0,0,3,1,1,1,4,0,1,4,1,1,1,0,4,0,2,2,1,0,1,2,1,1,1,1,0,2,1,0,0,3,0,3,0,1,1,0,1,0,0,0,1,0,1,1,1,2,2,1,2,0,1,1,1,0,0,1,1,1,0,3,3,2,1,4,1,0,1,1,1,0,3,0,0,0,1,1,0,1,2,1,0,2,1,1,1,3,0,1,1,0,1,1,0,0,0,1,0,1,1,0,1,1,0]},{"counters":[0,1,2,1,2,0,1,1,0,0,0,0,0,2,0,0,0,2,2,0,1,0,0,0,0,1,1,0,0,1,1,1,2,1,2,0,1,0,0,0,1,0,1,4,2,1,0,2,1,2,2,0,3,0,3,4,1,0,1,1,1,2,0,0,1,1,0,0,1,3,2,0,2,0,1,2,4,2,0,1,2,0,1,1,0,2,1,1,1,0,2,3,0,0,0,1,0,1,0,0,0,0,0,0,0,3,0,0,2,3,1,0,1,0,2,1,0,1,0,0,0,3,0,0,0,1,2,1,1,1,0,0,0,1,0,3,1,0,3,2,3,0,1,1,1,0,1,0,3,3,1,1,1,1,0,2,0,1,1,1,0,0,2,2,0,1,0,0,0,0,0,1,0,1,2,0,1,1,1,2,0,0,1,2,1,0,1,0,1,2,1,1,1,1,1,0,0,0,0,0,1,1,1,0,0,0,0,1,2,1,0,3,0,4,1,0,3,0,0,1,0,2,2,1,2,0,2,1,0,2,1,1,1,0,1,1,1,0,2,2,2,1,0,3,4,1,1,0,0,1,1,0,2,2,1,4,2,3,0,0,1,1,0,1,0,2,2,1,1,1,2,0,2,3,2,0,1,1,1,0,3,3,1,0,1,1,1,3,1,2,0,2,0,2,0,2,1,0,1,1,1,0,1,2,0,0,0,1,0,0,2,0,1,0,0,1,0,3,0,1,0,0,0,2,3,1,4,1,1,2,0,0,1,1,1,3,0,1,1,1,0,0,1,0,1,0,2,1,1,2,1,1,2,0,0,1,2,0,0,0,0,1,2,2,3,0,2,0,0,2,0,0,3,1,0,1,2,0,0,0,0,0,0,2,1,1,0,1,1,1,1,1,4,2,0,1,0,2,0,0,4,1,1,0,0,0,2,0,1,3,3,0,0,1,0,0,1,2,0,0,2,1,0,3,0,0,0,0,3,2,0,0,2,2,1,3,1,0,3,3,0,0,1,4,1,1,0,1,2,1,2,0,0,1,0,0,0,2,3,1,2,1,0,1,0,3,3,1,1,0,2,2,3,1,0,1,0,1,2,1,3,0,3,0,1,2,1,2,0,0,0,2,3,0,1,0,0,4,1,0,0,1,0,3,2,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,2,1,0,0,0,1,1,0,2,2,0,4,3,2,0,1,2,1,1,0,3,0,0,3,2,2,0,3,0,1,0,1,1,0,0,0,2,1,3,1,3,1,2,2,0,0,0,2,1,0,1,1,1,2,1,2,0,1,2,0,0,1,4,0,2,0,1,0,1,0,3,1,4,1,1,1,0,1,2,2,1,1,1,1,1,3,0,2,2,0,1,0,1,1,1,2,1,2,2,0,1,2,1,3,0,1,3,0,1,1,1,0,3,1,0,0,1,0,1,0,2,1,2,0,0,1,0,2,1,0,0,1,0,0,2,1,1,0,0,1,2,1,0,1,2,2,1,1,2,1,0,0,0,0,0,1,0,0,0,2,0,2,0,2,0,1,0,2,0,3,3,1,1,0,0,2,1,0,1,5,2,0,0,1,1,1,0,1,1,1,1,1,2,2,1,0,1,0,1,4,2,0,1,0,0,0,1,0,2,0,2,3,1,0,0,2,1,0,1,0,0,1,0,0,1,1,1,1,2,0,3,1,0,0,0,1,0,0,0,1,2,2,1,1,1,1,1,0,0,1,4,1,0,1,2,0,1,1,0,3,3,0,1,0,1,0,0,2,2,1,0,0,2,0,1,2,0,1,0,0,0,0,2,1,1,2,1,2,1,1,1,0,1,2,0,3,4,1,0,0,1,2,2,1,0,0,0,1,0,1,0,1,1,0,2,1,1,1,1,2,2,1,2,0,2,1,0,0,0,2,0,0,3,0,0,2,1,2,0,2,0,2,2,1,2,0,1,2,0,0,0,1,0,0,1,0,0,0,2,1,2,1,1,3,1,0,4,1,2,0,2,3,0,1,2,0,1,0,1,1,1,1,2,2,1,1,1,3,1,1,1,2,0,1,0,3,2,3,1,2,0,1,2,0,0,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,1,3,1,1,0,1,1,0,1,1,1,1,1,0,1,2,1,1,1,0,1,0,2,1,0,1,3,0,0,2,0,2,2,2,0,1,0,2,0,1,1,3,1,1,0,2,0,2,2,1,1,1,1,3,1,3,0,0,1,0,1,3,0,0,2,1,0,0,1,1,1,4,3,3,2,1,0,1,0,0,1,0,1,0,1,2,1,0,1,1,1,1,1,1,0,0,0,0,2,0,2,2,1,1,0,2,0,1,1,1,2,1,0,2,0,3,0,0,3,0,0,0,0,1,1,1,0,2,1,3,0,2,0,1,0,1,2,0,0,1,0,3,0,0,0,2,0,2,2,1,0,0,0,1,2,2,3,0,2,0,1,1,0,3,0,1,1,0,1,1,1,0,0,0,2,1,1,0,2,0,0,2,2,0,1,4,1,1,1,0,2,0,0,0,2,1,1,0,0,0,2,4,0,1,0,2,2,1,2,2,0,0,1,1,1,1,3,0,2,2,4,0,1,0,0,0,1,0,4,1,1,0,1,3,0,2,0,0,3,0,0,2,3,0,0,1,4,2,1,2,1,1,1,3,1,2,1,3,0,0,2,1,0,1,1,0,1,2,3,0,0,1,3,2,2,3,0,1,2,1,1,0,2,1,0,1,1,0,1,1,3,0,1,1,2,1,0,1,1,2,0,1,1,0,1,0,0,0,1,0,2,1,0,0,1,2,3,1,1,3,0,2,1,0,1,1,3,0,0,1,0,4,1,1,1,1,0,0,1,0,1,1,1,1,1,2,0,2,1,3,2,0,1,1,3,2,0,1,4,1,0,0,1,0,0,0,0,1,0,0,2,1,2,1,3,0,1,2,1,0,0,1,1,2,2,0,0,2,0,3,1,1,1,1,1,0,2,2,1,2,0,0,3,0,1,1,0,1,1,0,1,2,0,1,3,0,2,0,0,3,2,2,2,1,1,1,1,1,0,1,2,1,0,0,1,2,0,0,3,0,1,1,0,2,1,1,2,1,1,0,0,1,0,3,0,2,3,0,0,2,2,1,1,1,0,2,1,0,2,2,0,0,2,0,3,0,1,0,0,2,0,3,2,1,1,1,1,1,1,3,1,1,1,0,3,0,3,0,0,0,3,3,0,0,1,1,1,0,0,0,2,0,1,0,0,0,0,1,1,1,1,1,1,0,1,3,1,2,2,0,2,1,2,1,2,1,0,0,1,0,0,2,0,1,3,1,0,2,1,1,4,0,0,2,2,1,0,3,2,1,1,2,0,0,0,2,0,1,1,1,1,0,0,0,0,0,2,0,0,0,0,3,0,2,2,0,1,1,0,1,0,1,1,2,1,0,2,1,0,1,1,1,1,4,1,0,0,1,0,0,1,1,0,3,2,1,3,0,1,1,1,1,1,2,1,2,1,1,2,1,2,2,2,1,0,2,1,1,2,1,0,0,2,0,0,0,0,0,1,1,1,2,0,2,0,0,1,0,0,0,2,1,0,3,0,2,2,1,2,0,0,2,2,1,2,2,1,0,0,1,0,1,0,0,2,0,1,0,1,2,1,0,0,1,1,0,2,0,0,1,1,0,0,1,0,0,0,4,0,0,2,0,1,0,1,2,1,1,2,0,1,1,0,1,1,2,2,1,1,1,4,0,1,1,0,1,1,2,0,3,1,0,0,2,0,0,0,2,2,0,0,2,1,0,0,1,1,1,0,1,0,1,1,1,0,3,0,0,0,0,1,1,1,0,0,3,0,1,0,1,2,1,0,1,1,0,0,2,1,1,2,1,1,3,3,0,2,1,0,1,1,0,1,0,1,0,1,2,1,1,0,1,0,0,0,2,1,1,0,0,2,0,0,1,1,0,1,0,1,0,1,3,1,0,1,0,0,0,1,1,0,1,2,3,0,1,0,0,1,2,0,1,3,1,1,0,1,3,1,0,1,0,0,2,1,0,2,0,1,0,0,2,0,0,1,1,2,1,2,0,0,1,1,1,0,3,1,1,0,2,2,2,2,1,1,0,1,0,1,1,0,1,0,0,3,2,0,3,1,0,1,2,0,0,0,2,2,1,2,1,0,1,1,1,0,1,0,2,1,1,2,2,0,1,0,0,2,3,0,1,5,2,0,0,1,1,0,1,1,0,2,0,2,0,0,0,0,1,1,0,2,1,0,2,1,0,0,1,0,2,1,0,2,1,0,1,1,2,1,2,1,1,2,2,2,1,4,0,1,0,0,0,3,0,0,1,0,0,1,0,0,0,0,0,0,2,0,0,1,4,1,1,1,2,0,0,2,1,0,0,1,1,2,0,1,0,1,2,0,0,0,1,0,3,2,1,1,0,1,1,1,1,1,0,2,1,1,2,1,2,0,0,1,0,1,0,0,0,0,2,0,1,0,1,0,3,1,0,2,1,0,1,2,0,0,0,0,1,1,0,1,1,3,1,0,0,0,1,4,0,1,1,1,1,2,4,1]},{"counters":[1,0,0,2,0,1,0,0,1,0,0,2,1,1,1,1,1,0,2,1,0,2,0,0,0,1,2,0,0,2,2,1,0,1,0,0,1,2,0,2,0,1,0,0,1,1,1,3,1,1,2,0,1,0,2,0,0,1,1,2,1,1,1,1,0,2,0,1,0,1,0,1,0,2,0,1,1,2,0,1,0,0,1,3,1,0,0,3,1,1,1,2,1,4,1,0,1,0,0,1,2,1,1,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,2,0,0,2,0,0,0,1,2,1,0,2,3,1,1,3,2,0,2,0,0,1,1,0,2,1,0,2,1,0,2,0,0,0,2,1,2,1,1,1,1,1,1,4,1,1,0,0,0,1,2,0,0,2,0,0,0,0,1,0,0,0,1,2,1,3,3,1,4,1,1,1,1,0,1,1,3,0,1,1,0,0,2,0,0,0,0,1,2,0,1,2,0,1,1,0,0,0,0,1,3,0,0,0,0,0,2,2,3,1,0,0,0,1,1,0,2,1,2,1,1,0,0,1,1,1,0,3,0,1,0,2,0,1,2,1,1,1,1,2,3,1,0,1,0,0,0,3,5,1,0,0,2,0,0,0,2,1,3,0,2,0,1,1,1,1,0,1,1,3,2,1,0,1,1,0,0,0,0,0,2,1,1,1,3,0,1,2,0,0,0,0,1,1,1,1,0,2,1,0,1,0,1,0,2,1,0,1,1,1,1,1,0,0,0,2,1,1,1,2,2,1,0,0,1,2,1,2,1,1,2,0,1,2,3,1,2,1,2,0,1,1,3,2,2,0,1,2,1,0,1,2,1,3,1,0,2,0,1,0,2,3,0,0,3,0,2,0,0,2,1,0,1,0,3,0,1,1,0,1,0,0,0,1,0,0,0,0,3,0,0,0,0,0,0,1,1,0,2,2,1,2,0,1,1,0,1,1,2,3,1,2,1,0,2,1,0,2,2,0,1,0,1,1,1,0,1,0,0,0,0,1,2,0,1,1,1,1,2,0,0,0,1,1,1,1,1,0,0,1,0,0,1,1,1,3,3,1,2,0,0,1,2,3,1,1,5,2,2,0,0,0,2,0,0,1,0,0,0,1,1,2,1,2,1,1,3,0,1,0,1,4,1,2,0,3,1,1,0,0,3,1,0,0,0,2,1,2,1,3,2,2,2,0,0,1,1,0,0,1,0,2,1,2,2,0,1,0,0,1,1,1,1,0,0,1,1,0,1,0,0,0,3,1,1,1,0,2,0,0,1,1,1,3,0,3,0,1,2,2,1,1,0,0,0,1,1,1,1,1,0,1,0,2,0,3,3,1,3,1,0,0,3,0,3,0,1,2,1,1,1,0,0,0,0,1,0,0,1,0,0,1,3,1,2,2,1,0,0,1,1,3,0,2,1,1,0,5,1,2,2,2,1,2,4,1,1,2,2,0,0,1,2,1,4,2,1,1,1,1,0,1,2,4,2,1,2,2,0,0,2,2,3,0,1,1,0,0,1,2,0,2,0,2,0,1,0,1,1,0,0,2,1,0,0,3,0,3,1,0,1,1,2,2,1,1,1,0,0,0,0,2,0,0,2,3,1,1,1,0,2,2,0,2,2,1,0,1,0,1,0,1,2,0,0,0,0,0,4,0,1,1,1,1,3,1,0,1,1,0,1,0,2,0,1,1,1,1,0,1,0,1,3,1,1,0,1,1,0,0,2,1,2,2,1,0,3,0,2,1,1,0,1,0,0,0,0,3,2,2,0,0,2,1,1,0,1,1,0,0,0,0,0,1,0,1,0,3,1,2,1,2,2,0,0,4,1,1,1,1,1,1,0,0,2,0,0,0,3,3,1,0,1,0,0,3,0,0,1,0,2,1,2,2,0,3,3,1,2,2,0,1,1,3,0,1,1,0,0,3,0,0,2,1,2,0,0,1,0,1,1,0,0,2,0,2,0,1,0,1,0,1,0,0,0,0,1,0,1,0,3,0,0,1,2,1,1,0,1,0,0,1,1,2,1,1,0,1,1,4,0,2,0,0,4,0,1,1,0,0,0,1,2,0,1,2,2,3,2,1,0,0,0,1,0,0,3,3,0,1,2,4,1,2,1,1,0,0,1,1,0,3,0,0,0,0,0,1,1,2,1,2,0,1,2,2,1,0,1,0,1,0,2,1,1,2,4,0,0,0,0,1,3,1,2,0,1,0,1,0,2,1,0,0,2,1,0,0,1,0,1,0,1,0,2,1,0,0,0,0,1,0,1,2,2,3,0,2,0,3,1,0,3,1,5,0,2,0,2,3,2,1,1,0,0,0,0,2,1,1,0,0,1,2,0,2,0,1,0,1,0,1,0,1,0,1,2,2,1,2,0,1,1,2,1,1,2,1,2,1,0,1,3,1,2,1,3,1,2,2,0,1,2,1,0,0,0,1,1,0,2,0,1,1,1,1,0,0,1,1,0,1,0,0,1,2,0,1,1,0,1,2,1,1,0,0,3,2,1,0,1,2,0,2,1,1,2,1,3,0,1,1,0,1,1,0,1,1,0,5,2,1,0,2,2,0,1,0,2,2,0,1,1,2,2,0,3,1,2,1,2,1,2,2,3,0,2,0,0,0,0,2,2,2,1,0,1,0,1,0,0,0,0,0,2,0,0,1,1,3,0,1,1,5,0,0,1,0,2,1,1,2,1,1,0,0,1,0,0,3,0,1,1,4,1,1,0,1,0,4,1,1,1,2,0,3,3,1,3,2,0,2,1,0,1,1,3,0,0,0,0,5,2,1,1,1,1,2,1,1,0,0,1,3,0,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,0,0,0,3,0,2,0,0,4,0,1,1,1,0,2,1,1,1,0,0,1,0,0,1,1,1,2,2,0,1,1,0,0,0,0,3,2,0,0,1,2,0,7,3,2,2,3,1,0,0,1,1,1,2,1,1,1,0,1,1,1,2,1,0,0,0,2,1,1,0,0,0,1,1,2,1,3,1,1,0,2,0,2,0,1,1,0,1,1,2,1,0,1,2,1,3,2,4,0,1,2,0,0,0,0,0,1,1,0,1,2,1,2,1,3,0,0,0,0,0,0,0,1,0,0,0,3,0,0,2,2,2,0,1,1,0,1,3,1,2,0,2,1,1,0,1,0,3,0,0,2,1,1,1,4,1,0,0,3,1,1,2,1,2,1,2,0,0,0,1,2,1,0,0,0,1,1,0,4,1,1,1,0,0,1,0,0,1,1,0,1,0,2,0,2,2,0,1,0,0,1,1,2,0,3,2,2,1,2,3,2,1,2,2,1,2,0,0,4,1,0,2,3,0,2,1,2,0,0,0,0,1,2,0,2,0,1,0,4,2,1,1,0,0,0,0,0,0,0,4,1,1,1,0,2,1,0,1,2,2,3,2,0,1,1,1,1,1,1,0,0,0,2,2,2,1,0,4,0,2,0,0,2,1,1,2,0,1,1,1,2,2,0,0,0,0,1,2,0,0,3,1,1,0,0,1,3,1,0,0,1,2,1,0,4,3,1,1,2,0,2,1,0,1,0,0,2,1,1,1,1,0,2,0,0,2,0,1,3,1,1,3,1,0,1,0,3,0,0,0,3,1,0,3,1,0,1,1,2,0,0,3,2,0,1,0,0,1,0,0,1,2,1,1,0,4,0,1,0,4,1,1,1,0,1,0,4,1,3,1,1,1,1,2,2,1,0,1,0,2,0,1,0,2,0,2,1,0,0,2,0,0,0,0,1,1,2,1,4,0,0,2,2,2,4,3,1,3,2,0,1,0,0,1,0,1,1,1,0,2,4,1,0,3,1,2,1,1,1,1,1,0,3,1,0,3,0,1,0,0,2,1,1,1,1,2,1,0,1,1,1,0,0,0,0,2,0,2,2,2,0,2,0,1,1,1,5,1,3,0,1,0,0,1,0,0,1,1,0,0,0,2,2,0,0,0,2,2,0,0,1,2,1,0,0,1,0,1,0,1,0,2,1,1,2,0,1,0,1,1,1,0,3,3,1,1,0,0,2,1,0,0,2,0,1,0,2,1,2,2,1,0,0,1,2,0,0,2,1,0,2,5,2,1,0,1,0,0,0,1,2,0,0,2,2,1,0,0,1,1,2,1,1,3,0,3,1,0,1,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,2,0,0,1,1,1,1,0,0,0,2,2,1,0,2,0,1,1,0,1,1,1,0,1,0,1,1,4,0,2,0,3,2,1,1,2,0,0,2,0,0,1,0,1,2,1,1,1,0,2,1,0,1,3,0,0,2,1,0,0,0,0,0,1,1,1,1,1,2,1,0,0,3,1,1,2,0,0,1,0,0,1,0,0,2,0,0,0,2,0,0,1,0,0,0,0,1,0,0,1,1,0,1,2,4,2,1,0,0,2,0,0,0,2,1,1,1,0,0,1,0,0,1,2,0,3,1,2,2,0,1,2,2,0,2,0,1,0,0,0,0,1,0,0,3,2,0,2,2,1,0,0,2,2,1,0,0,0,1,0,0,1,0,3,1,1,0,1,1]},{"counters":[0,0,0,0,1,2,2,0,2,0,0,1,2,2,0,1,2,0,1,0,3,0,0,0,1,0,0,3,1,2,1,1,2,2,0,1,0,0,0,1,3,3,1,0,1,2,1,1,2,2,0,0,1,1,3,1,2,0,0,3,1,1,0,3,0,3,1,0,0,0,1,1,0,0,2,2,1,1,1,0,0,2,2,3,1,0,1,1,0,0,0,1,0,0,0,0,3,0,0,1,1,1,1,0,0,1,2,1,3,0,1,1,2,1,2,2,2,1,0,1,1,1,0,0,1,1,1,0,5,1,0,0,0,3,0,0,1,2,0,0,0,0,1,0,2,1,1,1,2,0,2,0,0,0,1,1,1,1,1,2,1,2,5,3,1,1,1,1,0,2,1,0,1,0,0,0,3,2,4,0,2,1,0,2,3,0,0,0,1,0,1,1,2,2,0,0,3,0,2,0,3,2,0,1,0,0,1,1,1,3,2,1,1,0,1,0,0,0,2,1,0,2,2,0,4,1,0,1,1,0,1,3,0,0,1,1,1,1,0,0,0,1,1,2,2,1,0,0,0,0,2,1,1,1,1,2,0,0,3,1,0,1,0,0,1,0,1,1,0,0,1,2,1,0,0,2,1,2,1,0,2,0,1,1,2,1,0,1,1,1,2,2,0,0,4,0,0,1,1,0,3,1,1,0,1,2,0,1,2,0,0,2,0,1,0,2,0,1,0,0,2,2,0,1,0,0,1,1,1,0,1,2,0,1,0,1,0,0,1,0,0,2,1,2,1,1,1,1,2,1,1,1,0,1,0,2,0,0,2,1,1,1,1,2,0,1,2,2,0,0,2,0,0,1,0,1,0,1,0,2,0,1,0,0,2,1,0,0,1,1,1,2,1,1,0,1,3,2,1,0,3,1,0,0,2,1,1,1,0,1,0,2,1,1,0,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,3,0,0,0,2,1,0,1,2,2,1,1,0,0,1,0,2,0,1,2,0,0,0,1,1,0,1,1,0,1,1,0,1,0,0,1,0,0,0,0,1,2,1,0,1,1,0,3,0,0,0,1,2,0,0,2,1,0,2,0,0,2,1,2,3,0,0,1,0,2,1,0,1,1,1,0,0,2,1,0,0,0,1,1,2,2,1,2,1,1,2,2,2,1,0,0,2,0,1,2,2,3,0,0,3,1,3,0,1,1,0,1,0,1,3,2,1,1,2,3,3,2,3,1,1,3,1,0,2,2,0,1,0,0,2,0,1,0,1,1,0,3,1,1,2,1,1,0,0,1,2,0,1,1,0,2,1,3,0,0,1,3,1,1,1,0,0,0,2,1,2,0,1,0,0,0,1,0,1,1,1,2,1,2,0,0,0,3,1,0,0,2,0,1,3,1,0,2,0,0,0,1,2,1,2,3,0,1,0,4,1,0,2,3,0,0,0,1,2,0,0,2,2,1,2,2,0,0,1,1,1,2,2,1,1,1,2,1,2,0,1,0,1,0,1,0,0,1,3,1,0,1,2,0,0,1,1,0,0,1,0,2,2,0,1,1,0,2,1,1,1,0,0,0,0,1,2,1,3,0,1,0,1,0,0,1,1,1,1,1,1,0,1,1,2,0,2,2,2,0,0,0,3,0,1,1,1,3,2,0,0,2,1,1,1,2,2,0,1,0,2,0,3,0,1,4,0,0,0,1,1,1,1,1,0,1,2,1,2,1,0,1,1,1,0,0,2,1,3,0,0,0,2,1,2,1,1,2,0,0,0,0,0,0,0,2,0,2,1,0,2,2,3,0,3,1,0,1,1,4,3,1,1,0,2,1,0,1,1,1,1,0,1,1,1,1,1,3,0,1,1,2,0,1,1,1,0,1,3,1,1,1,1,2,1,0,0,0,1,0,2,1,0,0,0,1,2,0,2,3,1,1,0,1,0,1,0,0,0,2,0,1,2,1,4,1,1,5,1,0,0,2,0,3,0,1,2,0,3,4,0,1,0,2,2,2,0,1,0,2,1,1,0,0,1,3,3,3,1,1,3,2,1,1,2,2,0,1,1,0,0,2,3,0,3,1,0,0,1,3,1,1,0,1,1,0,1,0,1,3,0,1,0,0,2,0,1,2,2,2,2,0,2,1,0,2,1,0,2,2,1,1,3,2,1,0,1,1,1,0,1,0,1,0,0,0,1,0,3,0,0,0,2,1,0,1,0,2,1,1,2,3,1,0,2,2,0,1,2,1,2,0,0,1,0,1,0,1,1,0,1,0,0,1,1,1,2,2,2,0,1,1,2,1,1,1,1,0,1,2,1,1,2,0,0,0,0,1,2,2,0,0,1,2,0,2,2,1,2,2,4,0,1,1,1,0,0,0,2,0,2,1,0,0,3,2,1,0,1,1,1,3,0,0,1,1,1,2,1,1,2,0,2,2,2,2,1,0,1,1,3,1,2,1,0,1,2,1,1,1,2,1,3,1,1,1,2,0,0,1,0,1,0,1,0,2,2,2,0,0,0,0,1,0,0,2,1,0,0,0,2,1,2,3,0,0,2,1,0,4,0,2,0,0,0,2,0,0,0,4,0,0,1,0,0,2,1,1,1,1,3,0,0,2,0,0,2,0,1,0,1,1,0,1,0,0,1,1,3,0,2,0,1,1,0,0,0,1,1,1,0,3,1,1,0,2,0,1,1,2,0,1,0,0,1,0,0,2,1,1,2,1,1,3,0,0,1,0,1,2,0,2,1,2,0,1,0,1,0,0,1,2,2,2,2,0,0,1,1,0,2,1,0,2,0,1,1,4,1,1,0,1,2,1,0,1,0,3,0,0,1,1,2,1,2,1,2,0,1,0,1,1,2,0,2,1,1,3,1,1,0,0,2,0,0,0,1,3,3,1,2,1,0,1,2,1,1,0,0,1,0,2,2,3,2,0,0,0,0,0,1,0,0,2,0,0,2,0,0,2,3,1,2,0,3,1,0,1,0,0,0,0,1,0,0,1,0,0,3,1,0,0,1,0,0,0,0,2,3,1,1,0,0,0,0,3,0,0,1,0,0,0,1,1,0,0,1,1,0,3,3,0,2,2,0,1,1,1,0,3,4,1,2,0,0,1,1,2,1,0,2,2,0,0,3,0,0,1,1,1,0,1,2,0,0,2,1,1,1,0,1,0,0,2,0,2,1,1,2,1,0,1,5,1,2,1,1,2,1,0,0,3,1,3,1,0,1,2,0,2,0,2,0,0,1,0,2,0,2,3,0,1,1,0,1,2,0,0,1,0,0,4,3,2,3,0,0,2,2,0,1,0,2,1,0,2,0,0,2,0,1,3,0,0,0,2,0,1,0,0,1,0,2,1,1,2,0,0,1,0,0,3,2,1,2,1,0,2,2,1,3,0,1,1,1,0,0,1,0,1,0,0,2,0,0,0,1,2,1,0,0,1,1,0,0,2,2,4,0,0,2,2,2,1,0,1,0,0,1,0,0,1,0,2,0,0,2,1,1,0,1,2,1,1,0,0,3,0,1,2,2,1,2,2,1,2,1,1,2,0,4,1,0,1,0,0,0,0,2,0,1,2,0,1,2,2,0,1,0,1,0,1,1,1,0,0,1,2,0,1,1,2,1,1,3,4,0,0,0,2,0,1,1,1,1,0,1,1,0,3,1,0,0,1,1,2,3,0,1,1,1,0,1,0,0,3,1,0,1,0,2,1,1,2,0,3,1,1,2,0,1,0,1,2,1,0,1,0,2,0,1,1,3,5,1,1,2,2,2,2,0,1,1,1,1,0,1,2,1,0,1,2,2,0,1,1,2,2,0,1,0,0,0,0,1,0,2,0,0,0,1,1,1,0,0,0,1,2,1,2,2,2,1,0,1,1,2,3,3,0,2,1,0,1,4,1,6,2,0,1,2,0,0,0,3,2,1,2,0,0,1,2,2,2,1,1,4,0,1,1,0,0,0,0,0,2,0,2,0,0,1,2,1,0,1,2,1,0,0,1,1,0,0,2,0,0,2,2,0,1,1,0,0,4,1,0,1,2,3,3,1,1,3,1,0,1,2,1,2,0,0,0,1,1,1,1,1,2,1,2,1,2,3,1,1,1,4,3,0,1,1,1,2,1,1,3,3,0,1,3,1,1,0,0,0,1,0,1,0,4,0,0,1,0,0,0,0,1,0,1,1,0,1,0,1,3,0,0,1,2,4,0,1,3,1,0,0,0,1,0,1,0,2,1,0,2,0,0,2,2,1,2,3,0,1,2,3,1,0,3,1,0,0,0,2,0,0,2,0,2,0,2,1,1,0,3,0,1,2,0,3,0,0,0,3,1,1,3,0,0,2,2,2,0,2,0,1,0,0,2,0,1,0,1,0,1,2,1,0,1,0,1,1,1,2,0,2,1,0,2,0,1,0,0,1,1,2,1,1,0,0,1,1,0,0,1,0,1,0,2,1,1,0,0,0,1,0,0,1,1,2,1,1,2,0,3,3,0,0,0,0,0,1,1,0,0,1,0,0,3,1,1,2,0,1,1,0,0,1,2,0,2,1,2,0,3,0,1,0,0,0,0,0,0,0,2,3,0,1,0,0,0,0,0,2,2,1]},{"counters":[0,1,1,1,2,1,1,2,0,1,1,1,0,0,1,0,1,2,1,2,2,2,0,0,0,2,1,1,1,3,0,0,0,0,0,2,3,1,0,3,1,2,1,1,0,1,1,2,0,0,0,2,1,1,0,0,2,1,2,4,3,1,3,1,1,0,1,1,1,0,1,1,0,1,1,2,0,1,3,1,3,1,0,0,2,3,1,1,1,2,0,1,1,1,1,0,1,0,1,0,0,1,0,0,1,1,0,1,1,2,1,1,1,1,1,1,2,1,2,1,1,0,3,0,0,1,1,1,0,3,0,0,1,2,0,1,0,1,0,1,0,0,4,1,2,2,2,0,1,2,1,1,0,0,1,1,1,1,2,2,0,1,1,0,1,1,0,0,0,1,0,0,2,0,0,1,2,2,0,1,1,1,0,0,0,2,0,1,0,1,1,1,1,0,0,1,2,0,2,0,3,1,0,0,0,0,0,2,4,1,2,1,0,3,1,0,2,0,1,0,1,3,0,1,3,1,1,3,3,2,3,0,1,0,1,0,1,1,3,1,1,0,1,0,3,0,0,1,3,0,2,1,1,1,2,1,2,1,1,1,1,1,1,1,2,4,1,1,3,0,2,0,3,1,1,1,1,0,1,1,1,4,2,1,1,1,1,1,2,0,1,0,1,2,1,1,0,0,1,1,0,0,2,2,0,0,1,2,1,0,2,1,0,0,1,1,0,3,0,2,2,3,0,2,0,3,0,3,4,0,1,1,2,1,1,1,1,0,1,1,0,2,1,2,0,0,3,0,3,2,3,1,0,2,0,1,0,2,0,2,0,1,1,0,0,0,1,0,0,1,0,1,1,4,2,0,0,1,2,0,1,1,1,0,0,0,0,2,0,1,2,1,1,0,1,2,0,0,0,2,2,1,1,0,1,2,2,4,2,0,0,0,2,1,0,2,1,1,0,0,0,0,0,2,1,0,0,1,1,0,1,2,0,2,0,2,2,2,4,2,0,2,1,2,1,1,1,0,1,0,1,1,0,1,1,0,2,0,2,1,1,0,0,3,2,0,0,1,0,1,0,1,1,0,1,0,0,2,1,0,0,0,0,0,1,2,0,0,1,4,0,2,0,3,1,3,2,1,2,1,0,1,1,2,0,1,0,1,2,0,0,0,0,1,1,1,0,2,1,3,0,1,2,0,1,2,3,1,0,1,0,2,0,1,1,0,1,1,0,3,0,1,1,2,0,0,1,4,0,0,1,2,0,0,0,1,0,4,1,0,0,1,0,0,2,2,0,1,2,2,1,0,1,1,1,0,1,3,1,2,1,1,3,1,1,0,2,1,0,1,0,1,0,3,1,0,0,0,1,1,1,0,1,1,3,0,1,0,2,1,1,2,1,2,0,1,1,1,2,1,2,2,1,1,1,0,1,1,1,0,0,0,2,4,0,3,2,4,1,1,2,1,1,0,0,1,1,1,1,0,1,0,1,0,1,0,1,2,0,0,0,0,0,2,0,2,1,3,1,0,2,0,1,1,1,1,0,1,0,1,0,1,0,1,0,3,0,1,1,0,1,3,0,1,1,0,1,1,3,2,0,1,1,0,0,0,1,0,1,0,1,2,3,0,1,1,2,2,0,0,2,0,0,3,1,3,1,1,2,2,1,0,0,1,0,1,3,1,1,1,1,3,1,2,0,2,1,0,0,0,2,0,2,0,0,0,1,0,2,0,0,3,1,1,1,2,1,1,1,1,0,1,1,0,1,0,1,0,2,4,2,0,1,0,1,1,1,0,0,0,0,2,0,0,1,1,0,0,1,2,2,1,0,1,0,2,1,0,1,0,1,1,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,0,1,0,1,0,0,1,2,1,0,1,0,2,2,3,0,1,1,1,2,3,0,1,1,5,0,0,1,0,2,0,1,2,2,1,0,0,1,1,0,2,0,1,1,0,2,1,1,1,1,4,2,0,2,0,2,1,0,0,1,0,1,1,1,1,0,0,1,1,2,1,0,1,0,1,1,2,1,4,2,2,1,1,2,1,2,2,0,0,2,1,2,1,1,1,4,1,2,0,0,2,0,1,1,2,0,0,1,1,1,0,1,1,0,1,0,0,1,0,0,2,0,1,0,1,0,3,0,0,0,1,0,0,1,0,3,2,0,0,1,2,0,1,0,1,1,1,1,2,2,1,0,1,2,1,0,2,0,1,0,1,2,1,0,1,0,1,0,0,2,1,2,1,0,0,1,1,1,0,0,1,0,1,0,0,2,2,1,0,0,2,2,2,2,2,0,0,3,0,1,0,2,2,2,0,2,0,0,1,0,0,0,1,0,1,0,0,0,2,1,1,1,0,1,1,2,0,1,0,1,0,2,0,1,1,1,0,2,0,1,1,1,0,0,0,1,3,1,1,3,2,1,0,0,1,0,3,2,0,0,3,1,2,1,2,2,0,1,1,1,0,1,2,1,0,0,1,0,1,2,1,1,1,2,1,2,2,0,1,0,1,1,1,1,0,0,2,1,1,0,1,1,1,1,1,3,0,0,0,1,1,1,0,2,0,0,2,1,0,2,0,0,0,0,0,0,1,1,1,1,0,1,3,1,4,1,0,0,3,1,1,2,0,0,0,1,0,0,0,0,0,2,1,0,1,0,0,2,1,0,1,3,2,1,2,1,1,3,1,0,2,1,0,1,1,2,0,1,0,1,0,0,1,1,0,2,1,0,0,1,1,1,0,1,1,2,0,0,1,2,2,2,0,1,3,1,1,1,0,0,2,1,3,0,0,0,0,1,0,1,0,2,1,0,1,1,1,1,1,2,1,0,1,2,2,1,0,1,0,1,0,1,0,2,0,0,0,0,0,1,1,2,1,1,0,2,0,0,1,1,1,1,0,1,2,0,2,2,2,1,3,2,1,6,0,1,2,2,1,0,0,2,2,0,2,1,2,0,1,2,0,1,1,0,1,1,1,1,1,0,1,0,0,0,1,0,0,1,0,1,3,4,0,2,1,0,1,0,2,1,2,2,1,1,0,1,2,1,1,0,0,2,1,0,2,0,0,1,3,1,2,0,2,1,3,2,0,1,0,1,1,1,4,4,1,4,2,0,0,0,0,1,1,1,1,1,0,1,0,0,2,1,2,1,2,1,1,1,0,0,0,1,2,2,1,1,0,0,2,2,1,0,4,1,0,1,1,0,2,1,1,1,1,1,0,0,1,1,0,1,0,2,1,0,2,0,0,1,0,1,1,0,2,0,1,0,4,1,2,0,1,1,1,0,0,1,0,0,1,2,0,1,3,2,1,3,1,0,0,0,2,1,1,1,2,2,2,1,1,2,2,1,1,2,0,1,0,0,0,0,4,0,3,2,0,0,0,0,1,1,0,2,0,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,0,0,0,1,3,3,0,2,3,1,0,1,0,0,0,2,4,0,1,2,3,3,3,2,1,2,3,0,1,2,0,2,1,1,0,2,0,2,5,0,4,0,0,2,0,0,0,1,1,2,2,0,1,1,2,0,1,2,2,0,1,1,0,0,2,2,0,1,1,0,1,0,2,0,1,2,1,2,0,1,1,0,0,0,2,1,0,1,0,2,1,1,0,0,3,2,2,0,2,0,1,2,4,0,2,0,1,2,0,0,3,2,2,1,0,0,0,2,0,0,2,2,0,0,0,0,2,3,2,1,0,2,0,1,0,2,1,0,1,0,0,1,1,1,1,1,2,0,2,2,1,1,0,2,1,0,0,1,0,3,0,0,1,2,1,0,1,3,2,0,2,1,2,1,2,0,1,2,0,0,2,2,0,2,2,0,0,0,4,0,1,0,2,1,0,2,1,2,1,0,0,1,1,0,0,2,2,3,0,3,1,0,0,0,0,1,0,1,2,2,2,1,0,2,2,1,1,0,1,1,2,0,1,0,2,2,3,2,3,2,0,0,4,0,0,2,2,0,2,1,0,0,1,1,0,1,2,1,2,0,0,0,1,1,1,0,1,1,3,0,2,0,2,2,3,0,2,1,0,0,0,1,0,1,0,0,2,1,0,0,0,0,1,0,0,0,1,1,1,0,1,2,1,1,1,0,0,2,2,2,0,3,0,0,4,0,2,1,2,0,1,0,2,4,1,2,1,0,1,0,0,2,0,0,1,0,2,2,0,1,1,0,0,2,3,1,1,2,0,0,2,1,0,1,2,2,1,0,0,1,1,2,2,3,0,1,1,0,1,1,1,1,1,1,0,0,2,6,1,4,0,0,0,0,3,0,1,0,1,0,2,0,1,0,0,0,0,1,1,0,1,2,1,0,0,0,0,0,0,2,3,1,0,0,1,0,1,2,0,1,1,0,1,1,2,0,0,1,1,1,1,0,1,0,0,1,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,3,0,2,0,2,1,0,0,2,0,1,0,0,0,2,1,0,0,0,0,1,2,1,0,0,1,0,1,1,0,1,1,1,1,2,2,1,0,4,0,2,1,3,0,0,0,0,0,1,1,4,2,0,0,1,0,3,1,0,0,2,0,0,0,3,2]}]},"null_count":0,"last_update_version":397952032607830016},"dit":{"histogram":{"ndv":3,"buckets":[{"count":669,"lower_bound":"bGludXg=","upper_bound":"bGludXg=","repeats":335},{"count":1325,"lower_bound":"bWFj","upper_bound":"bWFj","repeats":328},{"count":1999,"lower_bound":"d2lu","upper_bound":"d2lu","repeats":337}]},"cm_sketch":{"rows":[{"counters":[668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,668,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952032700366848},"ds":{"histogram":{"ndv":335,"buckets":[{"count":7,"lower_bound":"MjAxOC0wMS0wMQ==","upper_bound":"MjAxOC0wMS0wMg==","repeats":1},{"count":19,"lower_bound":"MjAxOC0wMS0wMw==","upper_bound":"MjAxOC0wMS0wNA==","repeats":4},{"count":25,"lower_bound":"MjAxOC0wMS0wNQ==","upper_bound":"MjAxOC0wMS0wNQ==","repeats":3},{"count":35,"lower_bound":"MjAxOC0wMS0wNg==","upper_bound":"MjAxOC0wMS0wNg==","repeats":5},{"count":45,"lower_bound":"MjAxOC0wMS0wNw==","upper_bound":"MjAxOC0wMS0wNw==","repeats":5},{"count":51,"lower_bound":"MjAxOC0wMS0wOA==","upper_bound":"MjAxOC0wMS0wOA==","repeats":3},{"count":61,"lower_bound":"MjAxOC0wMS0wOQ==","upper_bound":"MjAxOC0wMS0wOQ==","repeats":5},{"count":75,"lower_bound":"MjAxOC0wMS0xMQ==","upper_bound":"MjAxOC0wMS0xMg==","repeats":5},{"count":81,"lower_bound":"MjAxOC0wMS0xMw==","upper_bound":"MjAxOC0wMS0xMw==","repeats":3},{"count":87,"lower_bound":"MjAxOC0wMS0xNA==","upper_bound":"MjAxOC0wMS0xNA==","repeats":3},{"count":95,"lower_bound":"MjAxOC0wMS0xNQ==","upper_bound":"MjAxOC0wMS0xNg==","repeats":2},{"count":109,"lower_bound":"MjAxOC0wMS0xNw==","upper_bound":"MjAxOC0wMS0xOQ==","repeats":5},{"count":115,"lower_bound":"MjAxOC0wMS0yMA==","upper_bound":"MjAxOC0wMS0yMQ==","repeats":1},{"count":123,"lower_bound":"MjAxOC0wMS0yMw==","upper_bound":"MjAxOC0wMS0yMw==","repeats":4},{"count":135,"lower_bound":"MjAxOC0wMS0yNA==","upper_bound":"MjAxOC0wMS0yNQ==","repeats":4},{"count":143,"lower_bound":"MjAxOC0wMS0yNg==","upper_bound":"MjAxOC0wMS0yNg==","repeats":4},{"count":149,"lower_bound":"MjAxOC0wMS0yNw==","upper_bound":"MjAxOC0wMS0yNw==","repeats":3},{"count":161,"lower_bound":"MjAxOC0wMS0yOA==","upper_bound":"MjAxOC0wMS0yOA==","repeats":6},{"count":169,"lower_bound":"MjAxOC0wMi0wMQ==","upper_bound":"MjAxOC0wMi0wMQ==","repeats":4},{"count":177,"lower_bound":"MjAxOC0wMi0wMg==","upper_bound":"MjAxOC0wMi0wMg==","repeats":4},{"count":187,"lower_bound":"MjAxOC0wMi0wMw==","upper_bound":"MjAxOC0wMi0wMw==","repeats":5},{"count":197,"lower_bound":"MjAxOC0wMi0wNA==","upper_bound":"MjAxOC0wMi0wNA==","repeats":5},{"count":203,"lower_bound":"MjAxOC0wMi0wNQ==","upper_bound":"MjAxOC0wMi0wNQ==","repeats":3},{"count":217,"lower_bound":"MjAxOC0wMi0wNg==","upper_bound":"MjAxOC0wMi0wNg==","repeats":7},{"count":229,"lower_bound":"MjAxOC0wMi0wNw==","upper_bound":"MjAxOC0wMi0wOA==","repeats":4},{"count":235,"lower_bound":"MjAxOC0wMi0wOQ==","upper_bound":"MjAxOC0wMi0wOQ==","repeats":3},{"count":245,"lower_bound":"MjAxOC0wMi0xMA==","upper_bound":"MjAxOC0wMi0xMQ==","repeats":3},{"count":251,"lower_bound":"MjAxOC0wMi0xMg==","upper_bound":"MjAxOC0wMi0xMw==","repeats":2},{"count":257,"lower_bound":"MjAxOC0wMi0xNA==","upper_bound":"MjAxOC0wMi0xNA==","repeats":3},{"count":277,"lower_bound":"MjAxOC0wMi0xNQ==","upper_bound":"MjAxOC0wMi0xNg==","repeats":8},{"count":283,"lower_bound":"MjAxOC0wMi0xNw==","upper_bound":"MjAxOC0wMi0xOA==","repeats":1},{"count":297,"lower_bound":"MjAxOC0wMi0xOQ==","upper_bound":"MjAxOC0wMi0yMA==","repeats":5},{"count":303,"lower_bound":"MjAxOC0wMi0yMQ==","upper_bound":"MjAxOC0wMi0yMQ==","repeats":3},{"count":309,"lower_bound":"MjAxOC0wMi0yMg==","upper_bound":"MjAxOC0wMi0yMg==","repeats":3},{"count":321,"lower_bound":"MjAxOC0wMi0yMw==","upper_bound":"MjAxOC0wMi0yNA==","repeats":4},{"count":331,"lower_bound":"MjAxOC0wMi0yNg==","upper_bound":"MjAxOC0wMi0yNw==","repeats":3},{"count":339,"lower_bound":"MjAxOC0wMi0yOA==","upper_bound":"MjAxOC0wMy0wMQ==","repeats":2},{"count":353,"lower_bound":"MjAxOC0wMy0wMg==","upper_bound":"MjAxOC0wMy0wMg==","repeats":7},{"count":359,"lower_bound":"MjAxOC0wMy0wMw==","upper_bound":"MjAxOC0wMy0wMw==","repeats":3},{"count":369,"lower_bound":"MjAxOC0wMy0wNA==","upper_bound":"MjAxOC0wMy0wNA==","repeats":5},{"count":377,"lower_bound":"MjAxOC0wMy0wNQ==","upper_bound":"MjAxOC0wMy0wNQ==","repeats":4},{"count":387,"lower_bound":"MjAxOC0wMy0wNg==","upper_bound":"MjAxOC0wMy0wNw==","repeats":3},{"count":395,"lower_bound":"MjAxOC0wMy0wOA==","upper_bound":"MjAxOC0wMy0wOA==","repeats":4},{"count":403,"lower_bound":"MjAxOC0wMy0xMA==","upper_bound":"MjAxOC0wMy0xMQ==","repeats":3},{"count":419,"lower_bound":"MjAxOC0wMy0xMg==","upper_bound":"MjAxOC0wMy0xMw==","repeats":5},{"count":427,"lower_bound":"MjAxOC0wMy0xNA==","upper_bound":"MjAxOC0wMy0xNQ==","repeats":2},{"count":437,"lower_bound":"MjAxOC0wMy0xNg==","upper_bound":"MjAxOC0wMy0xNw==","repeats":4},{"count":445,"lower_bound":"MjAxOC0wMy0xOA==","upper_bound":"MjAxOC0wMy0xOQ==","repeats":1},{"count":455,"lower_bound":"MjAxOC0wMy0yMA==","upper_bound":"MjAxOC0wMy0yMQ==","repeats":4},{"count":463,"lower_bound":"MjAxOC0wMy0yMg==","upper_bound":"MjAxOC0wMy0yMg==","repeats":4},{"count":471,"lower_bound":"MjAxOC0wMy0yMw==","upper_bound":"MjAxOC0wMy0yNA==","repeats":3},{"count":485,"lower_bound":"MjAxOC0wMy0yNQ==","upper_bound":"MjAxOC0wMy0yNg==","repeats":4},{"count":493,"lower_bound":"MjAxOC0wMy0yNw==","upper_bound":"MjAxOC0wMy0yNw==","repeats":4},{"count":505,"lower_bound":"MjAxOC0wMy0yOA==","upper_bound":"MjAxOC0wMy0yOA==","repeats":6},{"count":521,"lower_bound":"MjAxOC0wNC0wMQ==","upper_bound":"MjAxOC0wNC0wMg==","repeats":5},{"count":533,"lower_bound":"MjAxOC0wNC0wMw==","upper_bound":"MjAxOC0wNC0wMw==","repeats":6},{"count":545,"lower_bound":"MjAxOC0wNC0wNg==","upper_bound":"MjAxOC0wNC0wNw==","repeats":4},{"count":557,"lower_bound":"MjAxOC0wNC0wOA==","upper_bound":"MjAxOC0wNC0wOQ==","repeats":3},{"count":569,"lower_bound":"MjAxOC0wNC0xMA==","upper_bound":"MjAxOC0wNC0xMQ==","repeats":3},{"count":581,"lower_bound":"MjAxOC0wNC0xMw==","upper_bound":"MjAxOC0wNC0xMw==","repeats":6},{"count":595,"lower_bound":"MjAxOC0wNC0xNA==","upper_bound":"MjAxOC0wNC0xNQ==","repeats":6},{"count":603,"lower_bound":"MjAxOC0wNC0xNg==","upper_bound":"MjAxOC0wNC0xOQ==","repeats":1},{"count":619,"lower_bound":"MjAxOC0wNC0yMA==","upper_bound":"MjAxOC0wNC0yMQ==","repeats":5},{"count":629,"lower_bound":"MjAxOC0wNC0yMg==","upper_bound":"MjAxOC0wNC0yMw==","repeats":4},{"count":639,"lower_bound":"MjAxOC0wNC0yNA==","upper_bound":"MjAxOC0wNC0yNQ==","repeats":3},{"count":647,"lower_bound":"MjAxOC0wNC0yNg==","upper_bound":"MjAxOC0wNC0yNg==","repeats":4},{"count":671,"lower_bound":"MjAxOC0wNC0yNw==","upper_bound":"MjAxOC0wNC0yOA==","repeats":9},{"count":683,"lower_bound":"MjAxOC0wNS0wMQ==","upper_bound":"MjAxOC0wNS0wMQ==","repeats":6},{"count":691,"lower_bound":"MjAxOC0wNS0wMg==","upper_bound":"MjAxOC0wNS0wMw==","repeats":1},{"count":699,"lower_bound":"MjAxOC0wNS0wNA==","upper_bound":"MjAxOC0wNS0wNQ==","repeats":1},{"count":709,"lower_bound":"MjAxOC0wNS0wNg==","upper_bound":"MjAxOC0wNS0wOA==","repeats":3},{"count":719,"lower_bound":"MjAxOC0wNS0wOQ==","upper_bound":"MjAxOC0wNS0xMA==","repeats":3},{"count":729,"lower_bound":"MjAxOC0wNS0xMQ==","upper_bound":"MjAxOC0wNS0xMg==","repeats":3},{"count":737,"lower_bound":"MjAxOC0wNS0xMw==","upper_bound":"MjAxOC0wNS0xNA==","repeats":2},{"count":753,"lower_bound":"MjAxOC0wNS0xNQ==","upper_bound":"MjAxOC0wNS0xNg==","repeats":5},{"count":771,"lower_bound":"MjAxOC0wNS0xNw==","upper_bound":"MjAxOC0wNS0xOA==","repeats":8},{"count":785,"lower_bound":"MjAxOC0wNS0xOQ==","upper_bound":"MjAxOC0wNS0yMA==","repeats":4},{"count":793,"lower_bound":"MjAxOC0wNS0yMQ==","upper_bound":"MjAxOC0wNS0yMg==","repeats":2},{"count":805,"lower_bound":"MjAxOC0wNS0yMw==","upper_bound":"MjAxOC0wNS0yNA==","repeats":4},{"count":815,"lower_bound":"MjAxOC0wNS0yNQ==","upper_bound":"MjAxOC0wNS0yNg==","repeats":4},{"count":823,"lower_bound":"MjAxOC0wNS0yNw==","upper_bound":"MjAxOC0wNS0yOA==","repeats":1},{"count":835,"lower_bound":"MjAxOC0wNi0wMQ==","upper_bound":"MjAxOC0wNi0wMQ==","repeats":6},{"count":847,"lower_bound":"MjAxOC0wNi0wMg==","upper_bound":"MjAxOC0wNi0wMw==","repeats":4},{"count":855,"lower_bound":"MjAxOC0wNi0wNA==","upper_bound":"MjAxOC0wNi0wNQ==","repeats":2},{"count":863,"lower_bound":"MjAxOC0wNi0wNg==","upper_bound":"MjAxOC0wNi0wNw==","repeats":1},{"count":873,"lower_bound":"MjAxOC0wNi0wOQ==","upper_bound":"MjAxOC0wNi0xMA==","repeats":4},{"count":887,"lower_bound":"MjAxOC0wNi0xMQ==","upper_bound":"MjAxOC0wNi0xMg==","repeats":4},{"count":907,"lower_bound":"MjAxOC0wNi0xMw==","upper_bound":"MjAxOC0wNi0xNA==","repeats":9},{"count":917,"lower_bound":"MjAxOC0wNi0xNQ==","upper_bound":"MjAxOC0wNi0xNg==","repeats":4},{"count":931,"lower_bound":"MjAxOC0wNi0xNw==","upper_bound":"MjAxOC0wNi0xOA==","repeats":4},{"count":947,"lower_bound":"MjAxOC0wNi0xOQ==","upper_bound":"MjAxOC0wNi0yMA==","repeats":5},{"count":965,"lower_bound":"MjAxOC0wNi0yMQ==","upper_bound":"MjAxOC0wNi0yMg==","repeats":6},{"count":973,"lower_bound":"MjAxOC0wNi0yNA==","upper_bound":"MjAxOC0wNi0yNQ==","repeats":1},{"count":981,"lower_bound":"MjAxOC0wNi0yNg==","upper_bound":"MjAxOC0wNi0yNg==","repeats":4},{"count":999,"lower_bound":"MjAxOC0wNi0yNw==","upper_bound":"MjAxOC0wNi0yOA==","repeats":6},{"count":1011,"lower_bound":"MjAxOC0wNy0wMQ==","upper_bound":"MjAxOC0wNy0wMg==","repeats":4},{"count":1023,"lower_bound":"MjAxOC0wNy0wMw==","upper_bound":"MjAxOC0wNy0wNA==","repeats":3},{"count":1035,"lower_bound":"MjAxOC0wNy0wNQ==","upper_bound":"MjAxOC0wNy0wNw==","repeats":3},{"count":1049,"lower_bound":"MjAxOC0wNy0wOA==","upper_bound":"MjAxOC0wNy0wOQ==","repeats":5},{"count":1057,"lower_bound":"MjAxOC0wNy0xMA==","upper_bound":"MjAxOC0wNy0xMQ==","repeats":1},{"count":1069,"lower_bound":"MjAxOC0wNy0xMg==","upper_bound":"MjAxOC0wNy0xMw==","repeats":4},{"count":1077,"lower_bound":"MjAxOC0wNy0xNA==","upper_bound":"MjAxOC0wNy0xNA==","repeats":4},{"count":1091,"lower_bound":"MjAxOC0wNy0xNQ==","upper_bound":"MjAxOC0wNy0xNg==","repeats":4},{"count":1105,"lower_bound":"MjAxOC0wNy0xNw==","upper_bound":"MjAxOC0wNy0xNw==","repeats":7},{"count":1113,"lower_bound":"MjAxOC0wNy0xOA==","upper_bound":"MjAxOC0wNy0xOQ==","repeats":2},{"count":1123,"lower_bound":"MjAxOC0wNy0yMA==","upper_bound":"MjAxOC0wNy0yMA==","repeats":5},{"count":1133,"lower_bound":"MjAxOC0wNy0yMQ==","upper_bound":"MjAxOC0wNy0yMg==","repeats":2},{"count":1143,"lower_bound":"MjAxOC0wNy0yMw==","upper_bound":"MjAxOC0wNy0yNA==","repeats":2},{"count":1155,"lower_bound":"MjAxOC0wNy0yNQ==","upper_bound":"MjAxOC0wNy0yNg==","repeats":3},{"count":1165,"lower_bound":"MjAxOC0wNy0yNw==","upper_bound":"MjAxOC0wNy0yNw==","repeats":5},{"count":1179,"lower_bound":"MjAxOC0wNy0yOA==","upper_bound":"MjAxOC0wOC0wMQ==","repeats":5},{"count":1189,"lower_bound":"MjAxOC0wOC0wMg==","upper_bound":"MjAxOC0wOC0wMw==","repeats":4},{"count":1199,"lower_bound":"MjAxOC0wOC0wNA==","upper_bound":"MjAxOC0wOC0wNg==","repeats":2},{"count":1207,"lower_bound":"MjAxOC0wOC0wNw==","upper_bound":"MjAxOC0wOC0wNw==","repeats":4},{"count":1217,"lower_bound":"MjAxOC0wOC0wOA==","upper_bound":"MjAxOC0wOC0wOA==","repeats":5},{"count":1227,"lower_bound":"MjAxOC0wOC0wOQ==","upper_bound":"MjAxOC0wOC0xMA==","repeats":3},{"count":1237,"lower_bound":"MjAxOC0wOC0xMQ==","upper_bound":"MjAxOC0wOC0xMg==","repeats":4},{"count":1249,"lower_bound":"MjAxOC0wOC0xMw==","upper_bound":"MjAxOC0wOC0xNA==","repeats":3},{"count":1261,"lower_bound":"MjAxOC0wOC0xNQ==","upper_bound":"MjAxOC0wOC0xNw==","repeats":3},{"count":1271,"lower_bound":"MjAxOC0wOC0xOA==","upper_bound":"MjAxOC0wOC0xOA==","repeats":5},{"count":1283,"lower_bound":"MjAxOC0wOC0xOQ==","upper_bound":"MjAxOC0wOC0yMQ==","repeats":3},{"count":1301,"lower_bound":"MjAxOC0wOC0yMg==","upper_bound":"MjAxOC0wOC0yMw==","repeats":7},{"count":1309,"lower_bound":"MjAxOC0wOC0yNA==","upper_bound":"MjAxOC0wOC0yNQ==","repeats":2},{"count":1321,"lower_bound":"MjAxOC0wOC0yNw==","upper_bound":"MjAxOC0wOC0yOA==","repeats":3},{"count":1329,"lower_bound":"MjAxOC0wOS0wMQ==","upper_bound":"MjAxOC0wOS0wMQ==","repeats":4},{"count":1341,"lower_bound":"MjAxOC0wOS0wMg==","upper_bound":"MjAxOC0wOS0wMg==","repeats":6},{"count":1355,"lower_bound":"MjAxOC0wOS0wMw==","upper_bound":"MjAxOC0wOS0wNQ==","repeats":4},{"count":1363,"lower_bound":"MjAxOC0wOS0wNg==","upper_bound":"MjAxOC0wOS0wNg==","repeats":4},{"count":1375,"lower_bound":"MjAxOC0wOS0wNw==","upper_bound":"MjAxOC0wOS0wOA==","repeats":4},{"count":1387,"lower_bound":"MjAxOC0wOS0wOQ==","upper_bound":"MjAxOC0wOS0xMQ==","repeats":5},{"count":1397,"lower_bound":"MjAxOC0wOS0xMg==","upper_bound":"MjAxOC0wOS0xMw==","repeats":3},{"count":1405,"lower_bound":"MjAxOC0wOS0xNA==","upper_bound":"MjAxOC0wOS0xNQ==","repeats":2},{"count":1415,"lower_bound":"MjAxOC0wOS0xNg==","upper_bound":"MjAxOC0wOS0xNg==","repeats":5},{"count":1427,"lower_bound":"MjAxOC0wOS0xNw==","upper_bound":"MjAxOC0wOS0xOA==","repeats":4},{"count":1435,"lower_bound":"MjAxOC0wOS0xOQ==","upper_bound":"MjAxOC0wOS0xOQ==","repeats":4},{"count":1447,"lower_bound":"MjAxOC0wOS0yMA==","upper_bound":"MjAxOC0wOS0yMA==","repeats":6},{"count":1471,"lower_bound":"MjAxOC0wOS0yMQ==","upper_bound":"MjAxOC0wOS0yMw==","repeats":9},{"count":1483,"lower_bound":"MjAxOC0wOS0yNA==","upper_bound":"MjAxOC0wOS0yNQ==","repeats":3},{"count":1493,"lower_bound":"MjAxOC0wOS0yNg==","upper_bound":"MjAxOC0wOS0yOA==","repeats":2},{"count":1509,"lower_bound":"MjAxOC0xMC0wMQ==","upper_bound":"MjAxOC0xMC0wMg==","repeats":5},{"count":1517,"lower_bound":"MjAxOC0xMC0wMw==","upper_bound":"MjAxOC0xMC0wNA==","repeats":3},{"count":1527,"lower_bound":"MjAxOC0xMC0wNQ==","upper_bound":"MjAxOC0xMC0wNg==","repeats":4},{"count":1539,"lower_bound":"MjAxOC0xMC0wNw==","upper_bound":"MjAxOC0xMC0wOQ==","repeats":3},{"count":1551,"lower_bound":"MjAxOC0xMC0xMA==","upper_bound":"MjAxOC0xMC0xMQ==","repeats":3},{"count":1563,"lower_bound":"MjAxOC0xMC0xMg==","upper_bound":"MjAxOC0xMC0xMw==","repeats":4},{"count":1571,"lower_bound":"MjAxOC0xMC0xNA==","upper_bound":"MjAxOC0xMC0xNA==","repeats":4},{"count":1579,"lower_bound":"MjAxOC0xMC0xNQ==","upper_bound":"MjAxOC0xMC0xNQ==","repeats":4},{"count":1591,"lower_bound":"MjAxOC0xMC0xNg==","upper_bound":"MjAxOC0xMC0xNw==","repeats":3},{"count":1611,"lower_bound":"MjAxOC0xMC0xOA==","upper_bound":"MjAxOC0xMC0xOQ==","repeats":7},{"count":1627,"lower_bound":"MjAxOC0xMC0yMA==","upper_bound":"MjAxOC0xMC0yMQ==","repeats":6},{"count":1641,"lower_bound":"MjAxOC0xMC0yMg==","upper_bound":"MjAxOC0xMC0yMw==","repeats":6},{"count":1653,"lower_bound":"MjAxOC0xMC0yNA==","upper_bound":"MjAxOC0xMC0yNg==","repeats":3},{"count":1661,"lower_bound":"MjAxOC0xMC0yNw==","upper_bound":"MjAxOC0xMC0yNw==","repeats":4},{"count":1673,"lower_bound":"MjAxOC0xMC0yOA==","upper_bound":"MjAxOC0xMS0wMQ==","repeats":4},{"count":1681,"lower_bound":"MjAxOC0xMS0wMg==","upper_bound":"MjAxOC0xMS0wNA==","repeats":1},{"count":1693,"lower_bound":"MjAxOC0xMS0wNQ==","upper_bound":"MjAxOC0xMS0wNw==","repeats":3},{"count":1707,"lower_bound":"MjAxOC0xMS0wOA==","upper_bound":"MjAxOC0xMS0wOQ==","repeats":5},{"count":1715,"lower_bound":"MjAxOC0xMS0xMA==","upper_bound":"MjAxOC0xMS0xMg==","repeats":1},{"count":1723,"lower_bound":"MjAxOC0xMS0xMw==","upper_bound":"MjAxOC0xMS0xMw==","repeats":4},{"count":1731,"lower_bound":"MjAxOC0xMS0xNA==","upper_bound":"MjAxOC0xMS0xNQ==","repeats":1},{"count":1743,"lower_bound":"MjAxOC0xMS0xNg==","upper_bound":"MjAxOC0xMS0xOA==","repeats":3},{"count":1753,"lower_bound":"MjAxOC0xMS0xOQ==","upper_bound":"MjAxOC0xMS0yMQ==","repeats":3},{"count":1769,"lower_bound":"MjAxOC0xMS0yMg==","upper_bound":"MjAxOC0xMS0yMg==","repeats":8},{"count":1777,"lower_bound":"MjAxOC0xMS0yMw==","upper_bound":"MjAxOC0xMS0yMw==","repeats":4},{"count":1795,"lower_bound":"MjAxOC0xMS0yNA==","upper_bound":"MjAxOC0xMS0yNg==","repeats":6},{"count":1805,"lower_bound":"MjAxOC0xMS0yNw==","upper_bound":"MjAxOC0xMS0yOA==","repeats":2},{"count":1819,"lower_bound":"MjAxOC0xMi0wMQ==","upper_bound":"MjAxOC0xMi0wMg==","repeats":4},{"count":1827,"lower_bound":"MjAxOC0xMi0wMw==","upper_bound":"MjAxOC0xMi0wNA==","repeats":3},{"count":1843,"lower_bound":"MjAxOC0xMi0wNQ==","upper_bound":"MjAxOC0xMi0wNw==","repeats":5},{"count":1851,"lower_bound":"MjAxOC0xMi0wOA==","upper_bound":"MjAxOC0xMi0wOA==","repeats":4},{"count":1865,"lower_bound":"MjAxOC0xMi0wOQ==","upper_bound":"MjAxOC0xMi0wOQ==","repeats":7},{"count":1875,"lower_bound":"MjAxOC0xMi0xMA==","upper_bound":"MjAxOC0xMi0xMA==","repeats":5},{"count":1889,"lower_bound":"MjAxOC0xMi0xMQ==","upper_bound":"MjAxOC0xMi0xMg==","repeats":4},{"count":1897,"lower_bound":"MjAxOC0xMi0xMw==","upper_bound":"MjAxOC0xMi0xMw==","repeats":4},{"count":1909,"lower_bound":"MjAxOC0xMi0xNA==","upper_bound":"MjAxOC0xMi0xNQ==","repeats":4},{"count":1917,"lower_bound":"MjAxOC0xMi0xNg==","upper_bound":"MjAxOC0xMi0xNw==","repeats":3},{"count":1925,"lower_bound":"MjAxOC0xMi0xOA==","upper_bound":"MjAxOC0xMi0xOA==","repeats":4},{"count":1933,"lower_bound":"MjAxOC0xMi0xOQ==","upper_bound":"MjAxOC0xMi0xOQ==","repeats":4},{"count":1941,"lower_bound":"MjAxOC0xMi0yMA==","upper_bound":"MjAxOC0xMi0yMA==","repeats":4},{"count":1949,"lower_bound":"MjAxOC0xMi0yMQ==","upper_bound":"MjAxOC0xMi0yMQ==","repeats":4},{"count":1957,"lower_bound":"MjAxOC0xMi0yMg==","upper_bound":"MjAxOC0xMi0yMw==","repeats":1},{"count":1965,"lower_bound":"MjAxOC0xMi0yNA==","upper_bound":"MjAxOC0xMi0yNA==","repeats":4},{"count":1975,"lower_bound":"MjAxOC0xMi0yNQ==","upper_bound":"MjAxOC0xMi0yNQ==","repeats":5},{"count":1983,"lower_bound":"MjAxOC0xMi0yNg==","upper_bound":"MjAxOC0xMi0yNg==","repeats":4},{"count":1999,"lower_bound":"MjAxOC0xMi0yNw==","upper_bound":"MjAxOC0xMi0yOA==","repeats":5}]},"cm_sketch":{"rows":[{"counters":[0,0,3,0,0,0,0,4,0,0,0,16,0,0,0,12,0,0,6,0,0,0,0,5,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,5,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,9,4,0,3,0,0,0,0,6,0,0,0,0,0,0,0,0,0,8,13,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,4,0,0,0,0,6,0,0,0,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,0,0,0,0,0,0,4,8,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,10,0,0,2,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,8,1,0,0,0,0,2,0,0,4,0,0,0,0,0,0,0,0,0,3,4,0,0,0,0,0,0,0,0,0,0,10,0,10,0,0,0,0,0,16,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,12,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,12,0,0,0,7,0,0,0,6,4,9,0,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,10,0,0,0,0,0,0,2,0,0,4,0,0,0,0,0,0,4,4,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,7,0,0,0,6,0,0,0,0,0,0,0,0,0,5,2,0,0,8,0,0,10,0,3,0,0,0,0,0,0,0,0,0,3,0,6,0,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,7,0,0,0,0,5,0,0,0,0,7,0,0,0,5,0,0,0,0,6,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,12,0,15,0,0,0,0,0,0,5,0,0,3,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,7,0,0,0,11,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,6,0,0,0,0,4,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,7,0,6,0,0,6,0,0,0,0,0,0,0,0,0,3,9,0,0,0,8,0,0,0,3,12,0,0,0,0,0,3,0,0,0,0,0,9,0,0,0,0,0,5,0,0,0,0,3,0,0,0,20,0,0,0,0,0,0,6,0,0,0,0,0,4,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,6,0,0,2,0,0,6,0,0,0,0,7,0,0,0,8,0,5,0,9,0,0,0,0,0,0,0,0,0,0,12,0,2,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,6,0,0,0,0,0,0,5,0,7,0,0,0,0,0,0,0,0,10,0,0,0,0,0,6,0,0,0,6,0,10,0,0,0,0,2,0,0,0,0,0,0,0,0,0,6,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,11,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,8,0,0,0,0,0,9,0,5,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,7,0,0,0,7,0,0,7,0,0,0,0,0,0,8,0,0,0,0,0,0,0,2,0,0,7,5,0,0,4,6,0,0,5,5,0,0,0,9,7,0,0,0,0,0,0,6,0,0,3,6,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,9,4,6,0,0,0,0,8,0,0,0,0,0,0,0,8,0,0,0,0,6,0,2,5,0,0,0,0,0,0,0,0,0,10,0,0,0,0,2,4,6,0,0,0,0,7,0,0,0,0,5,0,0,0,6,8,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,9,8,0,0,0,0,0,3,4,0,0,0,0,0,0,4,0,0,0,0,0,0,7,0,0,0,4,8,0,5,0,0,0,0,0,0,0,12,0,0,0,0,0,7,3,7,0,0,0,0,0,0,0,0,8,0,10,4,0,0,0,3,0,0,0,4,0,0,1,0,0,0,0,2,0,6,0,0,0,0,9,0,0,5,0,0,0,9,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,6,0,4,0,0,0,0,0,0,0,16,0,7,0,0,0,0,0,0,0,0,5,0,0,7,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,5,0,0,0,0,0,4,0,0,4,0,5,0,7,0,0,5,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,10,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,6,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,0,0,0,26,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,0,0,2,0,0,0,5,5,0,8,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,6,0,8,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,9,3,0,0,7,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,8,0,0,5,0,0,0,0,7,3,3,0,0,3,0,3,0,2,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,8,0,6,0,0,0,0,0,0,0,0,0,0,5,0,0,6,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,4,0,9,0,0,0,0,0,0,0,0,7,0,0,0,1,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,5,7,0,0,0,0,6,7,0,0,0,0,5,0,0,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,10,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,8,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,5,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,7,0,0,6,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,3,0,0,0,0,5,0,0,0,0,0,0,5,0,3,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,7,0,4,0,22,0,5,0,0,0,0,0,0,0,0,0,0,0,6,0,8,0,0,0,0,4,0,0,0,8,0,0,0,7,0,0,0,0,7,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,7,0,0,6,6,0,0,0,0,0,11,7,0,0,0,11,0,0,0,0,0,0,0,0,0,0,10,0,5,0,0,0,0,0,0,0,0,15,4,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,6,0,0,5,0,0,0,0,3,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,7,0,4,0,0,0,0,6,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,3,4,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,8,0,0,0,0,3,0,0,17,0,0,0,0,2,0,0,0,0,0,0,0,0,0,7,0,0,0,0,13,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,7,0,7,0,0,0,5,0,0,0,0,0,0,7,0,4,0,7,5,0,0,0,0,0,0,0,0,4,6,0,0,0,0,0,0,5,4,0,0,0,0,10,8,0,0,10,0,0,5,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,0,0,0,17,0,0,7,4,0,0,0,0,0,0,0,0,0,8,0,0,7,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,6,0,0,0,0,0,0,0,0,8,0,0,0,0,4,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,8,0,0,0,0,0,0,0,6,10,0,3,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,5,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,7,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,9,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,7,0,5,0,5,0,0,0,14,4,8,3,0,6,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,6,0,0,0,7,0,0,0,0,0,0,0,6,3,0,0,0,0,0,0,0,14,8,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,9,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,15,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0,0,5,0,0,0,3,0,0,0,0,0,0,0,0,4,8,4,0,0,9,0,0,0,0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,7,0,0,0,8,0,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,8,0,0,0,0,0,0,5,0,0,6,12,4,0,0,0,0,8,0,0,0,16,0,0,0,2,0,0,3,0,0,0,0,9,0,8,0,6,0,0,0,0,0,6,0,0,6,0,0,0,5,6,0,0,0,0,10,0,0,0,5,0,6,0,0,0,0,0,0,0,9,0,0,11,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,8,0,0,11,0,0,0,0,0,0,0,0,0,0,4,0,4,0,7,0,0,0,0,0,0,0,5,0,0,6,0,0,0,0,0,0,0,0,0,0,0,3,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,2,0,0,0,0,0,0,10,0,0,8,0,0,0,0,0,0,3,0,0,0,0,7,0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,4,7,0,0,0,0,0,0,0,0,0,6,5,8,0,0,11,0,0,0,0,0,0,0,5,0,0,0,0,0,9,0,4,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,9,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,6,8,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,6,0,0,0,0,0,0,2,0,0,0,0,0,12,6,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,2,0,6,0,0,0,0,0,0,0,0,7,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,5,0,7,11,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,6,0,9,0,0,0,0,0,0,0,0,11,0,0,0,0,2,0,0,6,0,0,0,8,0,0,0,0,0,0,0,0,13,0,0,0,5,0,0,0,4,7,6,0,0,5,0,0,0,0,0,0,0,0,0,0,4,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,3,0,0,7,0,0,0,0,0,0,0,8,0,0,0,0,6,0,2,0,0,0,0,0,0,0,0,0,0,0,8,0,12,0,0,0,0,0,4,0,0,0,0,0,7,0,0,9,0,0,0,0,0,6,0,7,5,0,0,0,0,0,0,9,0,6,0,0,0,0,0,4,0,0,0,1,0,0,5,0,7,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,1,0,0,3,3,0,2,0,2,7,0,0,0,0,0,0,13,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,4,11,0,0,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,8,0,5,0,2,7,6,5,0,0,0,0,0,0,0,0,9,10,0,0,0,0,0,0,6]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,8,0,7,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,8,0,0,6,0,0,0,0,6,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,4,0,0,0,2,0,0,0,4,6,0,0,0,0,0,0,0,0,8,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,6,0,0,0,9,0,0,0,0,1,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,4,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0,0,0,0,0,3,0,0,0,8,0,8,0,5,7,11,0,0,0,0,0,0,9,0,5,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,3,0,0,17,0,0,0,0,0,0,0,0,0,11,7,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,9,0,0,0,0,0,0,3,0,9,0,0,0,0,0,0,6,0,0,0,9,0,17,0,0,2,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,0,0,7,9,0,0,0,0,0,0,0,0,0,0,0,6,0,0,5,0,3,0,4,0,5,0,0,7,4,0,4,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,12,0,0,0,1,4,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,5,0,0,8,0,0,0,0,0,0,0,0,7,0,5,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,8,0,3,0,7,0,5,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,5,0,8,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,0,0,7,3,7,6,0,0,9,0,6,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,3,9,0,0,4,14,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,11,0,8,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,4,0,0,0,0,0,0,2,0,9,0,0,8,0,0,6,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,7,0,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,6,7,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,0,0,0,11,0,0,10,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,4,0,0,0,0,8,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,5,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,8,0,11,0,0,0,0,0,5,0,0,2,0,0,0,0,0,0,0,0,0,0,0,4,0,0,14,0,0,5,5,0,0,0,0,9,0,6,0,0,0,0,8,0,4,0,0,0,0,10,6,3,0,0,0,0,0,0,0,0,6,0,16,0,6,5,9,0,0,4,0,3,0,6,0,0,0,6,0,0,0,0,0,0,10,0,0,0,0,0,0,0,6,9,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,2,5,0,4,0,10,5,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,5,0,0,6,0,0,0,10,0,0,0,0,3,0,0,0,5,0,0,0,0,0,0,0,0,2,0,7,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,4,0,0,0,0,3,0,0,0,0,0,0,0,7,4,0,0,0,5,7,0,0,0,0,0,0,0,8,4,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,6,7,4,0,9,0,8,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,8,0,0,0,12,0,5,0,0,0,6,0,0,0,0,0,0,0,4,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,8,0,0,0,0,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,4,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,6,0,0,8,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,4,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,0,0,0,2,0,0,0,0,6,0,9,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,1,0,0,0,0,0,0,4,0,0,0,0,0,0,6,7,0,0,0,7,6,0,0,0,0,0,0,11,0,0,0,0,0,4,0,11,0,0,0,0,6,0,11,0,7,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,9,0,0,0,0,0,3,0,0,6,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,6,7,0,11,0,0,0,1,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,15,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,9,6,6,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,3,0,0,6,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,7,0,5,0,0,4,2,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,5,0,0,0,0,0,10,0,0,5,11,0,0,0,0,7,0,0,0,4,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,4,0,2,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,4,0,0,5,0,0,4,0,5,0,0,0,0,0,0,6,0,0,4,0,0,5,0,0,0,9,0,0,4,0,0,0,0,0,0,0,6,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,5,0,0,4,0,0,0,0,0,0,0,3,0,0,4,0,0,0,0,0,0,0,12,7,0,0,0,0,0,0,0,8,0,0,0,0,0,5,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,11,5,0,0,0,0,0,0,0,0,0,0,0,3,3,0,0,0,0,14,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,8,0,0,6,0,0,0,0,0,8,6,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,5,0,0,15,3,0,9,0,0,0,0,0,0,13,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,7,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,3,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,9,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,12,0,0,0,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,7,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,7,0,4,0,0,0,0,0,0,6,0,0,0,14,0,0,0,0,0,0,0,0,5,10,0,0,0,0,0,0,0,0,0,0,8,16,5,0,0,0,0,0,0,0,3,0,0,0,10,17,0,0,0,7,0,11,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,3,0,0,0,0,8,8,0,0,0,0,0,5,0,0,0,0,2,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,9,8,3,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,7,0,0,0,0,0,8,1,0,6,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,10,0,0,0,8,0,0,5,0,0,0,0,0,6,0,0,0,8,0,0,5,0,0,7,9,0,0,0,0,0,0,0,0,3,0,11,0,0,0,0,7,0,0,0,0,0,0,0,7,0,0,0,7,3,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,9,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,8,0,0,0,9,0,0,0,0,0,0,0,0,9,0,0,7,0,0,0,0,0,0,0,3,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,6,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,4,0,4,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,8,0,6,0,0,0,2,0,0,0,0,4,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,6,0,0,14,0,0,0,0,0,0,10,0,0,8,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,5,19,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,4,0,4,0,3,0,0,7,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,9,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,6,0,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,4,0,0,6,0,10,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,5,0,0,0,4,11,0,0,0,0,0,0,0,0,0,6,0,10,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,4,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,6,0,6,0,0,0,6,0,0,0,0,9,0,0,8,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,5,0,0,0,0,0,0,0,6,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,6,4,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,7,0,0,0,0,4,0,0,0,0,0,0,0,0,7,0,0,0,7,0,0,0,9,0,0,0,0,9,0,0,0,2,0,0,0,0,0,0,0,0,0,4,5,0,9,6,0,0,0,0,0,0,0,0,6,0,0,0,0,8,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,5,0,8,0,5,0,0,0,0,0,10,0,0,7,0,0,0,0,0,0,0,0,0,0,7,0,0,0,2,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,6,0,11,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,6,6,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,0,0,0,4,5,0,0,0,0,0,0,7,0,0,0,4,0,0,0,2,0,0,0,0,0,0,0,0,12,8,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,7,11,0,1,0,0,8,0,0,0,0,0,7,0,0,0,0,0,3,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,7,9,0,0,6,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,7,0,0,0,0,0,0,0,0,0,5,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,6,0,0,0,0,0,0,1,4,0,2,0,0,0,0,0,7,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,12,5,0,3,0,0,0,0,4,0,0,0,0,0,3,0,0,2,4,0,0,0,0,0,4,0,0,0,0,0,2,0,0,0,0,6,6,0,0,5,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,8,0,11,0,0,0,0,0,0,0,13,0,0,0,0,0,6,0,0,0,3,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,7,0,0,6,5,0,0,0,0,0,0,0,0,0,5,0,3,4,0,7,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,8,6,0,0,0,2,0,0,1,0,0,0,0,0,0]},{"counters":[0,0,0,0,7,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,3,0,0,2,0,0,0,0,0,0,4,0,0,0,0,6,0,9,0,9,0,0,9,0,0,0,6,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,0,0,0,0,0,0,7,0,0,0,0,9,0,0,0,0,0,8,0,0,5,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,7,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,5,3,0,0,0,0,0,0,0,0,0,0,3,8,0,0,7,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,5,0,0,0,0,0,9,7,0,0,0,0,0,0,5,0,3,0,0,0,7,0,0,0,0,12,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,7,0,0,0,0,0,0,6,0,5,0,0,0,0,6,0,0,0,0,6,0,0,0,0,7,0,0,9,0,0,0,0,0,0,0,6,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,12,0,0,0,0,17,0,0,0,0,0,0,0,0,0,0,0,5,16,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,6,10,0,0,0,0,0,8,0,0,0,0,0,0,0,8,3,0,0,0,7,0,0,0,4,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,6,0,0,0,1,0,8,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,7,7,4,0,0,6,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,9,0,0,0,5,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,9,10,0,0,10,0,0,8,3,6,0,0,0,0,0,7,11,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,13,0,0,6,0,2,0,0,0,0,0,6,0,0,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,7,3,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,6,7,0,0,0,0,7,0,0,0,3,0,0,4,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,18,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,8,0,0,0,0,0,12,0,0,0,0,0,5,5,7,4,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,11,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,8,4,7,0,0,0,0,0,0,0,12,9,5,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,6,8,11,0,0,0,0,0,8,0,0,0,0,0,0,2,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,5,0,12,0,0,0,0,0,8,0,0,0,7,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,5,0,5,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,4,0,3,0,0,0,0,0,0,0,0,0,0,8,2,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,4,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,4,7,9,0,8,0,0,0,3,0,0,0,0,0,12,0,0,0,6,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,7,12,0,0,0,3,0,0,8,0,0,0,0,0,0,0,3,0,8,0,0,0,0,0,7,2,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,3,5,9,0,0,0,0,0,0,8,0,0,0,0,0,0,0,5,0,0,0,0,0,6,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,7,0,4,5,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,6,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,6,0,9,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,5,7,6,0,0,0,0,0,0,6,6,0,0,0,0,0,6,0,6,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,11,9,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,2,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,6,0,0,0,0,0,7,3,0,0,0,7,0,0,0,10,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,7,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,12,0,10,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,11,0,7,5,6,0,0,0,0,0,0,10,0,0,9,0,0,0,0,0,0,10,0,0,0,6,0,0,2,0,0,7,8,0,0,0,0,0,0,0,0,0,8,16,0,3,5,0,0,6,0,6,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,7,0,0,6,0,7,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,5,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,9,9,0,0,0,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,3,12,0,5,0,2,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,7,7,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,3,0,0,0,0,7,8,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,18,0,0,0,4,0,0,0,5,7,0,0,6,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,7,0,7,0,6,0,0,0,0,0,4,0,8,3,0,0,5,0,0,0,0,0,4,0,4,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952033557315584},"ds2":{"histogram":{"ndv":1914,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MDZ6VDA=","repeats":1},{"count":13,"lower_bound":"MEJyY2k=","upper_bound":"MEZocGpOR1RjOHU=","repeats":1},{"count":19,"lower_bound":"MEhqa0IyQ05X","upper_bound":"MEp1Ng==","repeats":1},{"count":25,"lower_bound":"MFhzemxSUDhtNVZn","upper_bound":"MGVMaQ==","repeats":1},{"count":31,"lower_bound":"MGZIZ2xndUZ4V0pw","upper_bound":"MG1zNA==","repeats":1},{"count":37,"lower_bound":"MHAwMHc=","upper_bound":"MHpsYlZ2MjJnZg==","repeats":1},{"count":43,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":3},{"count":49,"lower_bound":"MTJ0aWt5ZmtFSw==","upper_bound":"MTVn","repeats":1},{"count":55,"lower_bound":"MUFROXdEdmY4Qjdz","upper_bound":"MU9ZZHlmWg==","repeats":1},{"count":61,"lower_bound":"MVE=","upper_bound":"MVhaYVExaFdmZEZTcQ==","repeats":1},{"count":67,"lower_bound":"MVpoVlpIMQ==","upper_bound":"MWVtZVN2SA==","repeats":1},{"count":73,"lower_bound":"MXBRZ2pocGU=","upper_bound":"MXpCd20=","repeats":1},{"count":79,"lower_bound":"MjNxajJXSXVyNEg=","upper_bound":"MkJVbGdNekhj","repeats":1},{"count":85,"lower_bound":"MkRIVElQckZrUW5BOQ==","upper_bound":"MlNkc3FjTmtwc3NyVg==","repeats":1},{"count":91,"lower_bound":"MldaeEZzaA==","upper_bound":"MmF0U1ZKMHNmQURQMw==","repeats":1},{"count":97,"lower_bound":"MmJaWnpvY3Bra3ZxSQ==","upper_bound":"Mm54cWFSR1A=","repeats":1},{"count":103,"lower_bound":"MnRTMWZsQ0U=","upper_bound":"Mnl4","repeats":1},{"count":109,"lower_bound":"Mw==","upper_bound":"MzFDV0ZqTGU=","repeats":1},{"count":115,"lower_bound":"M0dRYW9LMzREM2lG","upper_bound":"M004ZHk4YkhsQllzag==","repeats":1},{"count":121,"lower_bound":"M054WTg=","upper_bound":"M1ZhS2xvYXp3dW0=","repeats":1},{"count":127,"lower_bound":"M1ZtRlppV3JYaA==","upper_bound":"M1dzYlY5enA=","repeats":1},{"count":133,"lower_bound":"M20=","upper_bound":"M3Y=","repeats":1},{"count":139,"lower_bound":"M3dUWndBWTQ3TnA=","upper_bound":"M3g0bFlycVczMA==","repeats":1},{"count":145,"lower_bound":"M3hIT0VJ","upper_bound":"NDdpaQ==","repeats":1},{"count":151,"lower_bound":"NDhoQ0s0MDJvMFc=","upper_bound":"NEk=","repeats":1},{"count":157,"lower_bound":"NFBacA==","upper_bound":"NG9tbGRKUFE=","repeats":1},{"count":163,"lower_bound":"NHJnNW9zclFrSTk4UA==","upper_bound":"NHlKRkc0dA==","repeats":1},{"count":169,"lower_bound":"NUNkN3RYeQ==","upper_bound":"NUs=","repeats":1},{"count":175,"lower_bound":"NVM5YzBpcnRK","upper_bound":"NVh0","repeats":1},{"count":181,"lower_bound":"NVlDc1N2Z2RtWDdiZQ==","upper_bound":"NW1WSFFC","repeats":1},{"count":187,"lower_bound":"NXQza0hZdEVZbHVM","upper_bound":"NXdOVUFJ","repeats":1},{"count":195,"lower_bound":"NXhl","upper_bound":"Ng==","repeats":2},{"count":201,"lower_bound":"NjIzQjdjVGhJUGpHbA==","upper_bound":"NjJTV0k2Q0pQYQ==","repeats":1},{"count":207,"lower_bound":"NjMzcHBC","upper_bound":"NjU=","repeats":1},{"count":213,"lower_bound":"NkZDTU9kRms=","upper_bound":"NklldG5GNThVbWdGTA==","repeats":1},{"count":219,"lower_bound":"NksydUt4UGY=","upper_bound":"NlM2dkx5d2M5cQ==","repeats":1},{"count":225,"lower_bound":"NlZSSzQ=","upper_bound":"NmI=","repeats":1},{"count":231,"lower_bound":"Nmh4Sw==","upper_bound":"NnR0NW42Zng=","repeats":1},{"count":239,"lower_bound":"NnpZREJTRg==","upper_bound":"Nw==","repeats":2},{"count":245,"lower_bound":"NzR3T3Nyb0l1VU8zeg==","upper_bound":"NzlCT1RKd3FzR3NzMw==","repeats":1},{"count":251,"lower_bound":"NzlZYWM0NWta","upper_bound":"N0o0NEdqTA==","repeats":1},{"count":257,"lower_bound":"N0phQXFYQQ==","upper_bound":"N1VyeEU5Mm84VG0=","repeats":1},{"count":263,"lower_bound":"N2NpUlQ=","upper_bound":"N3FUYXhBcmd6","repeats":1},{"count":269,"lower_bound":"N3VJTDdEMk0yNk0=","upper_bound":"OA==","repeats":1},{"count":275,"lower_bound":"ODBudTBjZmg=","upper_bound":"OEVjT3VONDlsUA==","repeats":1},{"count":281,"lower_bound":"OEhIMDNn","upper_bound":"OFBONUc1SDhLUTQ5bQ==","repeats":1},{"count":287,"lower_bound":"OFRyTzh3","upper_bound":"OGw1cUNQdlFCN0h6","repeats":1},{"count":293,"lower_bound":"OGxEd0E=","upper_bound":"OHlOd1gwNk9UNg==","repeats":1},{"count":301,"lower_bound":"OHl4UUZD","upper_bound":"OQ==","repeats":3},{"count":307,"lower_bound":"OTNZbGhLR0hvZg==","upper_bound":"OTVDOThsdmZVZlRUeA==","repeats":1},{"count":313,"lower_bound":"OTdUQTEx","upper_bound":"OTl0aUlpSElx","repeats":1},{"count":319,"lower_bound":"OUhTMVhqTVVuUEVB","upper_bound":"OVJKZQ==","repeats":1},{"count":325,"lower_bound":"OVRr","upper_bound":"OVlIeDhOQzQ=","repeats":1},{"count":331,"lower_bound":"OVlUVkRDaWk=","upper_bound":"OWV6T2FONjRvdg==","repeats":1},{"count":337,"lower_bound":"OWpM","upper_bound":"OW9Oa1Fk","repeats":1},{"count":343,"lower_bound":"OXBWTmU=","upper_bound":"OXZKUFhuag==","repeats":1},{"count":349,"lower_bound":"OXdCS3F1","upper_bound":"OXlz","repeats":1},{"count":357,"lower_bound":"OXo0Yw==","upper_bound":"QQ==","repeats":3},{"count":363,"lower_bound":"QUVBbDlycWw0U0k=","upper_bound":"QVJ5elQyTlB2QnZQTQ==","repeats":1},{"count":369,"lower_bound":"QVk5Nw==","upper_bound":"QWNiUDhjZTdPdA==","repeats":1},{"count":375,"lower_bound":"QWdOZFJyYlZoSWM=","upper_bound":"QW84V3c0ZVg3","repeats":1},{"count":383,"lower_bound":"QXRUUm9hc2E=","upper_bound":"QkU0dnFkSDY=","repeats":1},{"count":391,"lower_bound":"QkpxczlN","upper_bound":"QlNMaA==","repeats":1},{"count":399,"lower_bound":"QlowdUY=","upper_bound":"QnVUak45TQ==","repeats":1},{"count":407,"lower_bound":"QndSeVU4a2NUUA==","upper_bound":"Qzc=","repeats":1},{"count":415,"lower_bound":"Q0JJ","upper_bound":"Q0lSaFhVaQ==","repeats":1},{"count":423,"lower_bound":"Q0pLRXphWA==","upper_bound":"Q1gwSlZpdg==","repeats":1},{"count":431,"lower_bound":"Q1lCNg==","upper_bound":"Q285UDQ=","repeats":1},{"count":439,"lower_bound":"Q29JSFZtQ2t6U2Z4Nw==","upper_bound":"Q3hIUEI=","repeats":1},{"count":447,"lower_bound":"RA==","upper_bound":"REE0d2dKM1ZmbzFK","repeats":1},{"count":455,"lower_bound":"REJGSjM=","upper_bound":"RE13Zm4=","repeats":1},{"count":463,"lower_bound":"RE9D","upper_bound":"RFJOYnZ0TThwRg==","repeats":1},{"count":471,"lower_bound":"RFkxdG9SNnlrN1U2bg==","upper_bound":"RGFZVDNKcE84MlZX","repeats":1},{"count":479,"lower_bound":"RGV1T0M1QWNkZ0RRRA==","upper_bound":"RHZpeW1VR3RhMXZRSg==","repeats":1},{"count":487,"lower_bound":"RTJYaXJOUkRxbGhTNA==","upper_bound":"RVBhZlJDU0JGTlpXRg==","repeats":1},{"count":495,"lower_bound":"RVd5OQ==","upper_bound":"RWhxa2Q=","repeats":1},{"count":503,"lower_bound":"RWliMk1EV1I1WlR2VA==","upper_bound":"RXY=","repeats":1},{"count":511,"lower_bound":"RXdLV05LUFlJWA==","upper_bound":"Rg==","repeats":3},{"count":519,"lower_bound":"RjBldVFnOA==","upper_bound":"RktzRGFkMDV0dWl2","repeats":1},{"count":527,"lower_bound":"RmFYc08=","upper_bound":"RmVXRW80eHk=","repeats":1},{"count":535,"lower_bound":"RnNm","upper_bound":"Rnpiam85Qk9CSFp5","repeats":1},{"count":543,"lower_bound":"Rw==","upper_bound":"RzZURkFQ","repeats":1},{"count":551,"lower_bound":"R0JreElYaGZCUg==","upper_bound":"R0gybFQyRHpq","repeats":1},{"count":559,"lower_bound":"R0hESjA=","upper_bound":"R2Y4TzFUUHhJdA==","repeats":1},{"count":567,"lower_bound":"R2pRUGNJRg==","upper_bound":"R3d6VkQ0eQ==","repeats":1},{"count":575,"lower_bound":"R3g=","upper_bound":"SDNRSjc5R3RJWHQ=","repeats":1},{"count":583,"lower_bound":"SDhG","upper_bound":"SEh0SVhYWQ==","repeats":1},{"count":591,"lower_bound":"SElEcGJ2RlpiaQ==","upper_bound":"SFM=","repeats":1},{"count":599,"lower_bound":"SFU5NnBX","upper_bound":"SGE5YWpOb0c=","repeats":1},{"count":607,"lower_bound":"SGNCNVd1Z2lIR2o=","upper_bound":"SG92Nmd6YXk=","repeats":1},{"count":615,"lower_bound":"SHFBa2txRUQ=","upper_bound":"SHdoMQ==","repeats":1},{"count":623,"lower_bound":"SHlWV25aQWQz","upper_bound":"SUNLRGc2cVNR","repeats":1},{"count":631,"lower_bound":"SUVMemFSdzVi","upper_bound":"SVc=","repeats":1},{"count":639,"lower_bound":"SVpKY0M=","upper_bound":"Sg==","repeats":1},{"count":647,"lower_bound":"SjN2Wg==","upper_bound":"SlBlVA==","repeats":1},{"count":655,"lower_bound":"SlI4V3lWS1E=","upper_bound":"SlhoR0lCc2JGNG4=","repeats":1},{"count":663,"lower_bound":"SllMOUY=","upper_bound":"SnBYcHlPMGtraE5E","repeats":1},{"count":671,"lower_bound":"SnFHeWJWWDNaaQ==","upper_bound":"SnNzbw==","repeats":1},{"count":679,"lower_bound":"SnRvYkpBQXprZ20z","upper_bound":"Sw==","repeats":2},{"count":687,"lower_bound":"SzFKbVhPeFBF","upper_bound":"S0VGWnMyOFk=","repeats":1},{"count":695,"lower_bound":"S0VhMkN3OUY5V3o4","upper_bound":"S1NnQjl2aUFT","repeats":1},{"count":703,"lower_bound":"S1Y=","upper_bound":"S1pZeg==","repeats":1},{"count":711,"lower_bound":"S2RMaldGNEs=","upper_bound":"S2xPRkVI","repeats":1},{"count":719,"lower_bound":"S3JOTlVoOEtQam5r","upper_bound":"TEhPVHM5","repeats":1},{"count":727,"lower_bound":"TEhQdkEzWk4=","upper_bound":"TE1US1JkeXBzMjI=","repeats":1},{"count":735,"lower_bound":"TFJDdFBncGU=","upper_bound":"TFp3","repeats":1},{"count":743,"lower_bound":"TGRKSEpTSTgzQQ==","upper_bound":"THV2Tmlz","repeats":1},{"count":751,"lower_bound":"THZlbVNVTHR2SWFYQw==","upper_bound":"TQ==","repeats":2},{"count":759,"lower_bound":"TTgyeHpwWnI=","upper_bound":"TU1oYWpjMVg=","repeats":1},{"count":767,"lower_bound":"TU4=","upper_bound":"TVRwckt3SQ==","repeats":1},{"count":775,"lower_bound":"TWpIdGM5","upper_bound":"TXBTZU1hOGZi","repeats":1},{"count":783,"lower_bound":"TXE0Q04=","upper_bound":"TXhITjR5dTJMeWpW","repeats":1},{"count":791,"lower_bound":"TjI=","upper_bound":"TjhwN3NNUFA4RThZ","repeats":1},{"count":799,"lower_bound":"TkE=","upper_bound":"TmFSUTBvUTE=","repeats":1},{"count":807,"lower_bound":"TmU4VGgwYXJSaW5z","upper_bound":"TzNEVXMyWQ==","repeats":1},{"count":815,"lower_bound":"Tzk2M1M4","upper_bound":"T1hBUnp6NU15","repeats":1},{"count":823,"lower_bound":"T1hFQlp2SUd3UGU=","upper_bound":"T2dBQ0taMnZPQVpO","repeats":1},{"count":831,"lower_bound":"T2k=","upper_bound":"T3A4ZUdn","repeats":1},{"count":839,"lower_bound":"T3JV","upper_bound":"T3pO","repeats":1},{"count":847,"lower_bound":"UDN3cVFMQVkwNXRz","upper_bound":"UEFJ","repeats":1},{"count":855,"lower_bound":"UEdZbHJOMFBhMw==","upper_bound":"UFJscU84Vnk=","repeats":1},{"count":863,"lower_bound":"UFd1","upper_bound":"UG4=","repeats":1},{"count":871,"lower_bound":"UHhT","upper_bound":"UTFp","repeats":1},{"count":879,"lower_bound":"UTJGZldJMjRQTXhNZg==","upper_bound":"UUx6ZjFCZlQ5NjFS","repeats":1},{"count":887,"lower_bound":"UVBKeFRVRTU=","upper_bound":"UVVaUVhubQ==","repeats":1},{"count":895,"lower_bound":"UWRMRnpPVFRncjZBRQ==","upper_bound":"UW9XZXVLRGM=","repeats":1},{"count":903,"lower_bound":"UXlE","upper_bound":"UkZ4ajJrVg==","repeats":1},{"count":911,"lower_bound":"Uko3WXM4Rg==","upper_bound":"UlB4WnYwTTk=","repeats":1},{"count":919,"lower_bound":"UlFyMVNycGtRcA==","upper_bound":"Umk=","repeats":1},{"count":927,"lower_bound":"Ums=","upper_bound":"Um9QSHJOTGpHcHFT","repeats":1},{"count":935,"lower_bound":"Um9tbkVF","upper_bound":"Unc=","repeats":1},{"count":943,"lower_bound":"Unh2SjR6bklpSnI=","upper_bound":"UzRTMlQ4","repeats":1},{"count":951,"lower_bound":"UzhFZWFB","upper_bound":"U0VzN2E1UjQ=","repeats":1},{"count":959,"lower_bound":"U0gxWDR2VmFDOE0yeg==","upper_bound":"U2NN","repeats":1},{"count":967,"lower_bound":"U2s=","upper_bound":"U3g=","repeats":1},{"count":975,"lower_bound":"U3pQTk5oMnd5","upper_bound":"VDRla1E=","repeats":1},{"count":983,"lower_bound":"VDhGeTA=","upper_bound":"VEtMdDd2Mw==","repeats":1},{"count":991,"lower_bound":"VFRpVzhHRw==","upper_bound":"VFhKMQ==","repeats":1},{"count":999,"lower_bound":"VGIzVUNRZTA=","upper_bound":"VHNwblpIajM=","repeats":1},{"count":1007,"lower_bound":"VHg2YnY2SXB6NHFjTg==","upper_bound":"VQ==","repeats":2},{"count":1015,"lower_bound":"VTI4SA==","upper_bound":"VUxzUEllUEE=","repeats":1},{"count":1023,"lower_bound":"VVF3RWtxdQ==","upper_bound":"VVl4QzVVaUhmakQ=","repeats":1},{"count":1031,"lower_bound":"VWU1dFJUZQ==","upper_bound":"VW8yU21pSUJC","repeats":1},{"count":1039,"lower_bound":"VXFO","upper_bound":"VXc5TFFaNGxONTdD","repeats":1},{"count":1047,"lower_bound":"Vg==","upper_bound":"VkM3T3V0R2I=","repeats":1},{"count":1055,"lower_bound":"VkR4bg==","upper_bound":"Vk9QemlB","repeats":1},{"count":1063,"lower_bound":"VlBE","upper_bound":"VlVRSDlBbw==","repeats":1},{"count":1071,"lower_bound":"VlVzdGk2","upper_bound":"Vmc2Ug==","repeats":1},{"count":1079,"lower_bound":"Vmp1","upper_bound":"VzI=","repeats":1},{"count":1087,"lower_bound":"VzVDbUVMQUtoZw==","upper_bound":"V0hLU0hxVEE=","repeats":1},{"count":1095,"lower_bound":"V0lCTTRF","upper_bound":"V1FGWmVINVU2TQ==","repeats":1},{"count":1103,"lower_bound":"V2p0VFdGRnozS3h4","upper_bound":"V3JsaEJQYg==","repeats":1},{"count":1111,"lower_bound":"V3Rh","upper_bound":"WDU4OVk4eTVaY2FrVg==","repeats":1},{"count":1119,"lower_bound":"WEVMQw==","upper_bound":"WEtjdENo","repeats":1},{"count":1127,"lower_bound":"WE4=","upper_bound":"WFVvVQ==","repeats":1},{"count":1135,"lower_bound":"WFZLRGg2bjJE","upper_bound":"WGVHWlQ=","repeats":1},{"count":1143,"lower_bound":"WHFoZDE=","upper_bound":"WTVXSWc1Rw==","repeats":1},{"count":1151,"lower_bound":"WTZhUXNu","upper_bound":"WUhadA==","repeats":1},{"count":1159,"lower_bound":"WUhiUA==","upper_bound":"WVRqNWs=","repeats":1},{"count":1167,"lower_bound":"WWRGdQ==","upper_bound":"WXdCeA==","repeats":1},{"count":1175,"lower_bound":"WXhFdnZwUmV3YmVF","upper_bound":"WjN6VXljT0k=","repeats":1},{"count":1183,"lower_bound":"WjR1cmR3NHk4TGg=","upper_bound":"WjhjS0ZIOWJkR3g=","repeats":1},{"count":1191,"lower_bound":"WkNJRW5YVlZFRVd6Sw==","upper_bound":"WkVV","repeats":1},{"count":1199,"lower_bound":"Wkd5UHJx","upper_bound":"WlE3UXpBTnlybw==","repeats":1},{"count":1207,"lower_bound":"WmZw","upper_bound":"WmxnWHEz","repeats":1},{"count":1215,"lower_bound":"Wm9pVkVKdldr","upper_bound":"YQ==","repeats":1},{"count":1223,"lower_bound":"YTZP","upper_bound":"YUF4Szlydjk3cDNibQ==","repeats":1},{"count":1231,"lower_bound":"YUdZb2JqcklQOA==","upper_bound":"YVRUVA==","repeats":1},{"count":1239,"lower_bound":"YVpOVUNjUmtpc1VxaQ==","upper_bound":"YXZsZmRFakYwSzgxaA==","repeats":1},{"count":1247,"lower_bound":"YjRldA==","upper_bound":"Yk91MVBJRng=","repeats":1},{"count":1255,"lower_bound":"YlFlcFg=","upper_bound":"YlhDejJPQVc=","repeats":1},{"count":1263,"lower_bound":"YmtwREFYSmk=","upper_bound":"Ym16RzNpcVE=","repeats":1},{"count":1271,"lower_bound":"Ym9tQw==","upper_bound":"Ynpr","repeats":1},{"count":1279,"lower_bound":"Yw==","upper_bound":"YzV1NTE=","repeats":1},{"count":1287,"lower_bound":"Y01yYmJQTg==","upper_bound":"Y1ROM29QeQ==","repeats":1},{"count":1295,"lower_bound":"Y1R1WTNQdnNXM3dO","upper_bound":"Y2l5ZmJLNkJYUA==","repeats":1},{"count":1303,"lower_bound":"Y2o=","upper_bound":"Y3lJMzVuZA==","repeats":1},{"count":1311,"lower_bound":"ZA==","upper_bound":"ZFFUVWUyNg==","repeats":1},{"count":1319,"lower_bound":"ZFU=","upper_bound":"ZGhvbENGYQ==","repeats":1},{"count":1327,"lower_bound":"ZGk=","upper_bound":"ZG5pOGViNGJvSk5aOQ==","repeats":1},{"count":1335,"lower_bound":"ZHJ3QQ==","upper_bound":"ZUJ6eXhPd2J0ckVq","repeats":1},{"count":1343,"lower_bound":"ZUhyc09TcWlobQ==","upper_bound":"ZVVZWWM=","repeats":1},{"count":1351,"lower_bound":"ZVpJYmhQeXlDZHZNNQ==","upper_bound":"ZXBHeE13VlFrbg==","repeats":1},{"count":1359,"lower_bound":"ZXNMeA==","upper_bound":"ZjQ5VG5MeQ==","repeats":1},{"count":1367,"lower_bound":"Zkg=","upper_bound":"Zk9FN0JLU2pMYUdH","repeats":1},{"count":1375,"lower_bound":"Zk9R","upper_bound":"ZlpD","repeats":1},{"count":1383,"lower_bound":"Zml1enByOWJU","upper_bound":"Zm1tMjJWVkNQQW0=","repeats":1},{"count":1393,"lower_bound":"ZnQwWA==","upper_bound":"Zw==","repeats":2},{"count":1401,"lower_bound":"ZzFlNQ==","upper_bound":"Z0Jaa3dwV3dVODc1","repeats":1},{"count":1409,"lower_bound":"Z1BPajJNZWdH","upper_bound":"Z2ZrVw==","repeats":1},{"count":1417,"lower_bound":"Z2x3dDBxcWhRcw==","upper_bound":"Z3V6","repeats":1},{"count":1425,"lower_bound":"Z3hXNDFmOWFwSDl5","upper_bound":"aDQ2MHJHQ2Q=","repeats":1},{"count":1433,"lower_bound":"aDdzWjROMFBpcGtz","upper_bound":"aEx2V3NoMGk=","repeats":1},{"count":1441,"lower_bound":"aFRIdWFtU25pc0pN","upper_bound":"aGVDamV1aGc=","repeats":1},{"count":1449,"lower_bound":"aGVR","upper_bound":"aHhwTXBv","repeats":1},{"count":1457,"lower_bound":"aQ==","upper_bound":"aUJEdG5Ceg==","repeats":1},{"count":1465,"lower_bound":"aUJ3","upper_bound":"aVh5TjFQUXdGSE9Z","repeats":1},{"count":1473,"lower_bound":"aVk2WA==","upper_bound":"aW9OTXBDRlM=","repeats":1},{"count":1481,"lower_bound":"aXJERA==","upper_bound":"ajN5YjA2czJDNmR1dg==","repeats":1},{"count":1489,"lower_bound":"ajg0V0dhSzVvSVhqcg==","upper_bound":"akxDNFppRXRPRmQ2","repeats":1},{"count":1497,"lower_bound":"alowUzVDd3o=","upper_bound":"ang=","repeats":1},{"count":1505,"lower_bound":"ano=","upper_bound":"azBIY0pYNzNl","repeats":1},{"count":1513,"lower_bound":"azdQY25NNQ==","upper_bound":"a0Zy","repeats":1},{"count":1521,"lower_bound":"a0d5bzZCWUxoYTE=","upper_bound":"a1JIcDcxWmlSODFX","repeats":1},{"count":1529,"lower_bound":"a2ZBQXBH","upper_bound":"bDlodmNsc3N4ZGhyNw==","repeats":1},{"count":1537,"lower_bound":"bENBMTI2U0tpd0xJVw==","upper_bound":"bEsyc1E4TktSbm5LVw==","repeats":1},{"count":1545,"lower_bound":"bExIbUljd3NaMGxwSA==","upper_bound":"bFky","repeats":1},{"count":1553,"lower_bound":"bGNacjdMQU1ibUIzMw==","upper_bound":"bGo=","repeats":1},{"count":1563,"lower_bound":"bG1DNVlTZ0Y3YVpQ","upper_bound":"bQ==","repeats":2},{"count":1571,"lower_bound":"bTNnRjRVNzVkWA==","upper_bound":"bTU2Uw==","repeats":1},{"count":1579,"lower_bound":"bTcxOE5zWFh5bQ==","upper_bound":"bUVIQXVlNnUzSUprUg==","repeats":1},{"count":1587,"lower_bound":"bUlLczBLcFZv","upper_bound":"bVFxOWE=","repeats":1},{"count":1595,"lower_bound":"bVM1b1ZaT25ZV0VT","upper_bound":"bWQ4","repeats":1},{"count":1603,"lower_bound":"bWZFWXhUVFpU","upper_bound":"bXA=","repeats":1},{"count":1611,"lower_bound":"bXFH","upper_bound":"bXlsVVVySzI=","repeats":1},{"count":1619,"lower_bound":"bk40MXVEeU5kMmQ=","upper_bound":"bmQzakg5QkNSaVJN","repeats":1},{"count":1627,"lower_bound":"bmhxMjRJUGwwTGh0","upper_bound":"bm9PS1Z5b2JkTGJ0Qw==","repeats":1},{"count":1635,"lower_bound":"bnFyZklENg==","upper_bound":"bzE2ekM=","repeats":1},{"count":1643,"lower_bound":"bzNsemI4","upper_bound":"b0Q=","repeats":1},{"count":1651,"lower_bound":"b0VEYm4=","upper_bound":"b0w=","repeats":1},{"count":1659,"lower_bound":"b04=","upper_bound":"b1NIREZSSQ==","repeats":1},{"count":1667,"lower_bound":"b1Vl","upper_bound":"b2htVURyN1A=","repeats":1},{"count":1675,"lower_bound":"b2trVDk=","upper_bound":"b3NoS2FUWg==","repeats":1},{"count":1683,"lower_bound":"b3Nt","upper_bound":"cDJ5V01WejVRRw==","repeats":1},{"count":1691,"lower_bound":"cDRjNk9vWFVjVmQ=","upper_bound":"cFZ5dA==","repeats":1},{"count":1699,"lower_bound":"cHVLbg==","upper_bound":"cQ==","repeats":2},{"count":1707,"lower_bound":"cTJNQlNTWWo0cw==","upper_bound":"cURjandwZ2ZOcEk=","repeats":1},{"count":1715,"lower_bound":"cUVUYWx3RUtidklB","upper_bound":"cVVKVnlyMW53","repeats":1},{"count":1723,"lower_bound":"cVZQNUtBNmN6bw==","upper_bound":"cWF0NXQwS0lMVQ==","repeats":1},{"count":1735,"lower_bound":"cWI=","upper_bound":"cg==","repeats":3},{"count":1743,"lower_bound":"cjVZSmZUV3M=","upper_bound":"ckVQUWI=","repeats":1},{"count":1751,"lower_bound":"cktjTzlIdTR1","upper_bound":"cmlCR3daRw==","repeats":1},{"count":1761,"lower_bound":"cnA5YnROZUU=","upper_bound":"cw==","repeats":2},{"count":1769,"lower_bound":"czNIbVNJTEd4ZkxMeA==","upper_bound":"c1FSNG5hZks=","repeats":1},{"count":1777,"lower_bound":"c1ZtUFdYOVBTNVZ1NA==","upper_bound":"c25KYnRaTU1xc04=","repeats":1},{"count":1785,"lower_bound":"c25WTWQ=","upper_bound":"c3p1OFlidUZDaQ==","repeats":1},{"count":1793,"lower_bound":"dA==","upper_bound":"dDNNdjNTT0U3dW5vQg==","repeats":1},{"count":1801,"lower_bound":"dDZMaWRH","upper_bound":"dEpSMXhaTVM=","repeats":1},{"count":1809,"lower_bound":"dE5Gck55bkJmWnU=","upper_bound":"dGJDR3BsTDdqeQ==","repeats":1},{"count":1817,"lower_bound":"dGQ=","upper_bound":"dGpxUFBZSUZIT0RsSA==","repeats":1},{"count":1827,"lower_bound":"dHczSXVKRXZEWWVZUw==","upper_bound":"dQ==","repeats":3},{"count":1835,"lower_bound":"dTJmMWVU","upper_bound":"dTltZlg4WWE=","repeats":1},{"count":1843,"lower_bound":"dUM=","upper_bound":"dUlWWTA=","repeats":1},{"count":1851,"lower_bound":"dU5t","upper_bound":"dVphUXBZTDk=","repeats":1},{"count":1859,"lower_bound":"dWFVbklt","upper_bound":"dWQ0UGk2S1ppanY1QQ==","repeats":1},{"count":1867,"lower_bound":"dWg=","upper_bound":"dXYybkREaTdR","repeats":1},{"count":1875,"lower_bound":"djl3OGM2WGk=","upper_bound":"dk1zamg=","repeats":1},{"count":1883,"lower_bound":"dlhBcnhhbkhuT283OA==","upper_bound":"dw==","repeats":2},{"count":1891,"lower_bound":"dzFN","upper_bound":"dzU5OA==","repeats":1},{"count":1899,"lower_bound":"dzdxWVU=","upper_bound":"d0JkYnRwVTE4UmVa","repeats":1},{"count":1907,"lower_bound":"d0VWaHlMMGM=","upper_bound":"d1NNTUtMM3U3OQ==","repeats":1},{"count":1915,"lower_bound":"d1hTQkI3aGtNaVdC","upper_bound":"d2VSTTc=","repeats":1},{"count":1923,"lower_bound":"d2lLYQ==","upper_bound":"d3NjT1BUSnpEdU0=","repeats":1},{"count":1931,"lower_bound":"d3R2STFRb0s5SQ==","upper_bound":"eDlwcVFJY2FM","repeats":1},{"count":1939,"lower_bound":"eEJ3eURiVU5KWGgwaw==","upper_bound":"eFNiSFZGRw==","repeats":1},{"count":1947,"lower_bound":"eFdLazBhTkoxR00=","upper_bound":"eGRVMFk=","repeats":1},{"count":1955,"lower_bound":"eGRVQ1kyWHQ=","upper_bound":"eHJYY1o0YTFHRlZVdw==","repeats":1},{"count":1965,"lower_bound":"eHNXVnVqekJDQw==","upper_bound":"eQ==","repeats":2},{"count":1973,"lower_bound":"eTFj","upper_bound":"eTk3TQ==","repeats":1},{"count":1981,"lower_bound":"eU5lN0xIZnBpVFk=","upper_bound":"eVpqZ0NvOTRSTXFnMQ==","repeats":1},{"count":1989,"lower_bound":"eWEwR0gxa056V2FXRQ==","upper_bound":"ejVM","repeats":1},{"count":1997,"lower_bound":"ekNOQVVndUU3b3Bm","upper_bound":"enkxZ2xmclc5d1VS","repeats":1},{"count":1999,"lower_bound":"enp3MGlBNEpNUlhi","upper_bound":"enp3MGlBNEpNUlhi","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,1,3,0,0,0,0,0,1,0,1,1,1,0,1,1,1,0,1,1,1,2,1,0,0,0,1,2,1,1,1,1,0,5,0,0,1,1,3,2,2,1,0,0,2,0,4,4,1,1,0,1,3,5,0,0,1,0,1,1,0,1,1,0,0,0,1,1,0,0,0,2,0,2,1,0,3,0,2,2,1,1,0,0,0,0,0,1,2,1,0,1,1,1,2,3,1,0,1,0,2,0,1,0,1,0,1,0,1,2,2,1,2,0,0,0,0,0,1,0,2,0,0,1,0,0,1,2,2,0,2,0,1,2,1,1,2,0,2,2,3,3,2,1,3,2,1,0,0,0,1,0,1,2,1,0,0,0,3,0,1,1,2,1,0,0,0,1,1,1,2,1,0,1,1,0,3,3,0,1,3,1,1,1,1,1,1,0,0,1,0,1,2,2,1,0,0,1,1,0,1,0,1,1,1,1,2,0,2,1,0,1,1,2,0,1,0,0,1,2,2,0,0,2,0,2,2,0,0,1,0,1,0,1,0,5,0,0,0,0,1,2,1,5,1,2,0,0,1,1,1,2,2,0,2,1,0,0,0,0,0,2,1,0,2,2,0,2,0,1,2,3,1,2,0,0,0,1,0,0,2,1,3,1,2,0,0,0,1,0,1,3,1,1,0,3,1,0,1,0,0,0,0,1,0,0,1,0,1,1,1,1,8,1,1,0,0,0,1,1,0,0,3,2,2,1,0,1,1,1,1,0,0,0,0,0,0,2,0,2,1,0,1,1,1,1,0,0,0,2,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,0,2,0,0,1,1,2,0,2,4,2,0,0,1,0,0,1,0,0,0,4,1,1,2,2,1,1,0,2,2,1,0,0,1,3,0,2,1,1,0,2,1,0,0,0,0,0,2,1,1,3,1,3,0,1,1,0,3,0,2,1,0,2,1,2,0,1,0,2,1,0,1,0,2,0,1,0,0,2,1,0,2,0,1,0,1,0,0,1,2,0,1,1,1,1,0,2,0,1,0,1,0,2,1,0,2,2,1,1,2,2,2,2,0,2,1,0,1,1,0,0,1,0,0,1,1,1,0,0,1,0,3,1,1,1,0,0,0,0,1,0,2,0,0,0,0,1,1,4,6,0,1,0,0,0,1,1,1,0,1,1,1,1,1,2,1,3,1,0,2,2,0,2,0,1,2,2,1,0,0,1,2,2,4,1,1,0,1,2,2,0,0,0,1,1,1,1,0,1,1,0,4,0,1,0,0,1,1,3,1,1,2,2,0,0,0,1,0,2,1,0,2,1,1,0,0,2,3,0,1,0,0,0,3,1,2,2,0,1,1,5,0,1,0,0,0,0,0,0,0,2,0,0,1,0,0,3,2,0,2,2,0,1,0,2,0,6,0,0,0,3,1,2,0,0,2,2,0,1,4,2,1,1,1,1,1,1,2,0,2,2,0,0,1,1,3,0,0,0,0,1,2,2,2,1,2,2,0,0,4,1,1,2,1,3,1,3,1,0,1,0,1,2,5,0,0,0,1,0,2,1,0,0,2,0,1,2,1,2,2,3,1,2,0,0,1,0,1,2,0,1,1,0,1,1,1,0,0,2,0,1,1,0,3,0,1,0,0,2,0,0,0,0,3,1,0,0,0,0,0,1,0,0,0,0,0,3,0,5,0,0,0,2,1,0,0,0,2,3,0,0,1,1,1,1,0,1,2,0,3,0,1,2,0,1,0,1,1,0,1,0,0,0,0,0,0,1,2,1,1,2,0,1,0,1,4,1,0,2,1,0,0,1,1,0,1,0,0,0,1,1,1,0,3,1,1,4,1,1,0,0,0,1,1,0,0,1,3,0,2,0,1,0,1,0,1,1,1,1,1,1,2,0,2,1,0,1,2,0,1,1,1,2,0,0,1,1,2,2,0,2,1,0,2,2,0,1,2,3,1,0,0,4,1,2,0,0,2,0,4,0,0,0,0,2,0,0,1,1,1,0,1,1,0,0,2,0,0,1,1,1,0,0,2,0,2,0,2,2,2,4,1,0,1,0,0,1,2,0,1,1,1,2,1,1,0,0,2,0,1,0,1,0,1,1,0,1,1,2,1,1,3,0,4,6,0,3,0,0,3,1,2,0,0,0,1,0,1,3,3,1,1,0,2,1,1,0,0,2,0,1,0,1,1,0,0,0,1,2,1,0,3,0,1,1,1,3,1,0,1,2,0,1,0,1,2,0,5,1,0,1,0,0,0,1,0,2,2,0,1,1,0,2,0,0,0,2,0,2,1,2,0,1,3,0,0,1,0,2,0,0,1,3,1,4,3,2,0,1,0,2,2,3,2,3,1,0,0,0,1,1,1,0,0,1,1,1,1,3,1,0,0,1,1,0,1,2,2,2,1,2,1,0,3,2,1,1,0,1,0,1,2,2,4,1,1,0,0,1,0,2,0,0,3,1,0,0,1,3,1,0,0,1,0,1,3,4,1,1,0,0,0,1,0,1,2,1,1,1,1,0,3,0,3,0,2,0,2,1,3,0,2,1,0,2,6,1,2,2,1,0,0,2,0,1,2,0,1,1,0,0,2,2,0,1,0,0,1,0,0,0,0,1,1,0,0,3,0,1,1,1,1,0,0,2,2,2,2,0,2,0,2,0,0,2,1,2,0,0,0,2,2,2,1,1,1,2,0,1,1,2,1,0,0,1,1,0,0,0,1,0,2,1,1,1,1,1,2,0,2,0,0,1,0,2,0,1,2,0,0,1,0,1,0,0,2,0,1,0,2,2,1,2,0,1,1,0,1,3,0,1,2,3,2,1,0,2,2,0,1,0,0,0,4,0,0,1,2,0,4,0,1,1,1,1,2,1,1,0,0,3,0,2,2,1,0,1,1,5,1,0,1,0,0,1,0,2,2,1,2,2,1,1,0,0,0,1,0,0,2,7,1,0,0,3,0,2,2,0,2,1,0,1,2,0,1,1,0,0,2,1,1,0,0,1,1,1,0,0,0,4,3,3,3,0,4,0,1,3,1,2,0,0,1,1,1,1,3,0,1,1,1,0,0,1,0,1,0,1,1,2,0,1,0,1,1,1,1,2,1,0,0,0,0,1,2,1,0,0,0,4,0,1,1,2,1,1,3,0,0,1,0,1,1,1,2,1,1,2,1,0,1,2,2,2,1,0,2,3,1,4,0,2,1,1,2,1,1,2,1,5,1,1,0,1,0,3,0,2,1,1,0,0,1,1,0,1,2,0,0,0,4,1,1,0,2,1,1,0,1,0,0,2,3,2,1,0,1,0,0,2,2,1,1,0,3,2,0,1,1,1,0,0,2,1,0,0,0,0,3,2,1,1,0,1,1,1,1,2,2,2,2,2,1,4,0,1,1,1,1,1,2,0,0,2,0,2,3,1,0,1,1,3,2,1,1,3,3,0,0,2,0,0,1,2,0,1,1,1,2,0,0,1,2,0,3,1,0,0,3,0,1,2,0,3,1,1,1,0,0,1,1,0,2,1,2,2,2,0,0,1,0,0,3,1,0,0,1,3,0,1,1,0,0,3,1,0,4,0,1,0,4,1,1,3,0,0,1,0,0,2,2,1,1,0,4,0,2,0,2,4,2,0,2,1,0,0,6,1,1,1,0,0,1,0,0,2,2,0,0,0,2,2,1,1,1,1,1,0,1,3,1,1,1,0,1,2,1,0,6,0,0,0,1,2,1,0,1,0,1,1,1,3,0,0,1,1,1,2,1,0,1,1,2,0,0,1,0,1,0,0,0,0,0,0,2,0,0,2,1,1,4,1,0,5,1,0,0,1,3,1,2,0,0,0,0,0,2,1,1,3,0,1,1,1,1,0,2,1,1,0,2,0,1,1,0,0,1,0,0,1,1,2,1,1,0,0,1,1,0,2,0,0,0,1,2,0,1,1,1,1,1,0,1,0,0,1,0,1,0,1,0,0,0,2,1,0,0,0,1,0,1,4,1,0,0,2,0,1,2,1,1,3,2,0,1,2,3,1,2,0,0,0,0,0,1,0,1,0,3,0,0,3,5,0,0,1,1,1,3,0,0,1,0,0,1,1,1,1,2,0,0,1,1,2,0,1,1,0,0,2,2,0,0,1,0,3,0,0,5,1,0,0,0,2,0,0,0,2,0,1,1,1,0,0,0,1,0,0,0,1,0,3,3,2,3,0,2,0,2,1,1,2,0,1,1,0,1,0,3,0,2,0,1,2,0,3,1,1,1,0,3,0,1,0,0,0,3,1,0,2,0,1,1,1,0,2,1,1,1,1,0,2,0,1,2,1,1,1,2,0,0,1,1,0,0,1,0,2,2,1,0,4,1,2,2,1,1,2,0,0,0,1,2,0,2,1,1,0,1,1,0,0,0,0,0,0,0,2,1,1,2,2,1,0,0,0,0,0,3,1,0,0,1,0,0,0,0,0,1,3,0,2,0,2,1,0,0,2,0,0,1,1,0,2,0,0,0,3,1,0,0,1,3,2,1,0,1,1,0,1,2,2,2,0,1,2,0,1,2,2,1,1,1,0,0,2,0,0,2,0,1,0,3,2,1,0,2,0]},{"counters":[0,3,1,3,0,0,2,1,1,2,2,2,1,2,2,2,2,0,0,5,2,3,1,0,1,3,1,1,0,3,0,3,2,0,3,2,2,2,0,1,1,2,0,0,1,0,4,3,0,0,2,2,1,0,1,1,2,3,0,1,1,0,0,1,0,1,1,2,2,0,1,0,1,1,5,0,2,0,1,2,2,0,0,0,2,2,2,1,1,0,0,1,0,1,1,4,5,0,3,1,1,0,1,2,0,0,0,1,1,1,0,0,1,0,2,1,3,2,0,1,0,0,0,0,0,0,0,0,0,1,1,1,1,2,1,0,1,1,1,2,0,1,1,0,0,0,1,0,2,1,1,1,0,2,1,0,0,0,1,1,1,0,0,0,3,2,3,1,0,0,0,0,0,0,1,0,1,1,1,1,0,0,2,1,3,1,0,1,3,1,4,1,0,0,2,0,1,2,0,3,0,1,1,1,0,1,1,0,0,1,0,0,3,3,0,1,1,1,1,2,0,2,2,1,0,0,0,2,0,0,3,1,1,0,1,0,1,1,3,1,0,1,4,1,0,0,3,1,1,0,3,0,0,1,1,1,0,2,0,0,1,2,1,2,0,1,0,0,3,1,0,2,2,2,0,2,2,1,1,0,0,4,2,1,1,1,0,0,3,0,0,0,0,1,2,1,0,1,1,0,0,0,0,2,0,2,0,2,1,0,3,1,0,1,0,3,2,0,1,4,0,2,0,0,1,1,0,1,1,1,1,1,0,1,1,0,0,1,0,0,1,0,1,0,2,3,1,1,1,0,0,1,1,0,1,0,0,0,0,2,0,1,2,1,1,0,3,1,3,1,0,1,0,2,0,0,0,1,0,0,0,1,2,1,0,0,0,0,1,1,0,1,5,1,1,1,1,0,1,0,1,0,1,1,1,0,0,2,5,4,1,1,1,1,2,4,0,1,0,0,3,3,1,0,0,0,0,0,0,1,0,3,0,2,2,1,1,4,2,0,1,0,0,0,0,1,1,2,5,3,2,2,4,0,0,0,0,2,3,2,1,0,2,2,3,1,2,2,2,1,0,0,0,2,0,1,0,0,0,1,1,0,0,1,3,0,0,0,1,1,0,0,1,6,2,0,0,1,2,0,2,0,1,1,2,1,1,0,2,0,0,4,1,0,0,1,0,2,0,1,0,0,0,1,1,2,1,0,2,2,0,1,0,0,1,0,2,0,2,1,1,1,1,2,1,1,1,0,1,1,4,1,1,1,0,3,2,1,0,0,2,2,0,0,0,0,2,2,2,0,0,4,0,2,1,3,1,3,2,4,0,0,0,0,1,2,1,1,1,1,0,2,2,2,0,0,1,2,2,5,0,0,2,0,0,0,1,0,0,6,1,0,2,0,1,2,1,0,0,1,0,1,1,2,0,0,1,1,0,0,1,0,0,2,0,1,1,2,0,0,0,1,0,0,0,0,1,2,0,0,1,1,0,0,4,0,1,0,1,0,1,1,1,1,1,2,0,1,0,3,1,1,1,2,0,0,2,1,1,1,1,1,1,1,4,2,1,6,2,0,0,0,1,3,1,1,0,1,0,0,0,2,0,2,2,0,4,1,0,0,0,0,1,0,1,1,1,1,0,2,0,2,1,0,1,1,0,5,3,0,1,2,1,0,3,2,0,2,0,1,1,3,0,2,2,0,6,1,2,2,1,1,0,0,1,0,2,2,0,0,1,0,2,2,1,2,2,0,3,4,0,0,0,1,1,3,1,1,2,1,1,0,2,0,1,0,1,1,1,1,1,0,4,4,3,1,0,0,0,1,1,2,0,0,0,3,1,1,1,0,0,0,0,0,1,2,3,1,0,4,1,2,1,1,0,0,2,2,0,1,1,0,3,0,0,1,0,0,1,1,1,3,1,0,0,0,1,3,0,3,1,2,0,0,1,1,0,1,0,0,0,1,4,0,2,1,1,8,0,0,1,0,2,0,0,2,0,1,1,0,2,3,3,0,2,2,1,0,1,0,3,3,0,0,0,1,0,3,2,1,2,0,1,1,0,1,0,0,0,0,1,0,1,0,0,1,1,0,1,3,0,0,2,1,0,0,0,3,1,0,1,0,1,0,1,0,2,2,0,0,0,1,0,0,0,0,1,2,1,2,2,2,0,1,1,0,1,2,0,2,2,0,3,0,0,2,1,0,0,1,1,3,0,0,0,1,1,0,0,0,0,0,1,0,0,1,1,0,1,1,3,0,1,1,0,0,3,1,4,3,0,4,2,0,3,1,1,2,1,1,5,1,1,0,1,0,1,1,0,0,1,0,0,0,3,1,0,0,2,0,3,0,2,1,3,0,0,4,0,0,1,0,2,1,2,0,1,1,1,0,3,1,0,1,1,0,2,1,1,0,1,1,1,0,2,0,1,1,1,2,0,2,0,0,0,1,0,1,1,2,3,1,0,1,1,0,2,0,0,0,1,1,1,1,1,3,1,1,0,3,1,2,1,1,0,1,0,0,2,0,1,2,1,0,1,1,1,2,0,0,1,0,0,1,1,3,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,2,2,0,1,1,5,0,2,2,1,0,3,0,1,1,0,0,2,0,0,0,3,1,3,3,2,1,0,0,0,2,0,0,1,0,0,1,0,4,0,2,1,1,2,0,0,0,0,1,2,1,2,2,0,0,1,1,0,2,1,2,1,2,3,1,1,2,1,2,1,1,0,0,3,0,3,2,3,1,1,3,2,3,2,2,1,0,1,2,4,1,1,0,0,1,2,1,1,1,1,0,0,0,0,2,1,0,1,0,0,2,0,2,0,1,1,1,2,0,0,0,2,0,1,1,1,1,2,1,0,1,1,1,1,1,1,1,2,1,0,0,1,0,2,1,0,1,2,0,0,3,0,2,1,0,2,0,3,0,2,2,0,0,0,1,1,1,1,2,1,1,0,1,2,0,1,0,0,1,0,3,2,0,1,0,2,0,2,1,0,0,1,0,1,1,1,1,2,0,0,1,0,0,1,1,0,2,0,0,1,1,1,0,2,0,2,0,0,1,2,1,1,3,2,1,0,0,0,2,2,2,1,4,1,0,1,0,1,0,0,0,0,0,1,0,0,3,0,2,0,1,0,0,0,1,0,0,1,0,1,0,0,1,0,1,1,0,1,0,1,2,0,0,0,2,0,1,3,0,0,1,2,0,2,0,1,1,2,2,0,0,4,1,0,2,2,0,0,0,1,0,1,1,2,1,1,1,1,0,2,1,3,1,0,2,0,2,1,0,0,1,1,0,3,2,0,0,0,1,3,0,0,2,0,1,0,1,1,4,0,1,1,1,0,1,0,0,1,0,0,2,0,0,0,0,0,0,1,0,1,2,0,0,2,2,0,0,1,0,1,1,4,2,0,0,1,0,0,1,2,0,2,0,3,0,0,2,1,0,0,2,0,1,1,0,1,0,2,1,1,2,0,0,0,0,0,1,1,1,0,1,1,0,0,0,1,0,2,1,0,0,1,0,1,1,1,2,0,1,1,2,0,0,0,1,0,1,1,1,1,2,1,1,1,0,3,1,1,1,3,0,0,1,0,3,0,1,0,0,2,1,0,0,2,3,0,0,2,2,3,1,0,0,0,0,1,1,1,0,1,1,2,0,1,3,3,0,0,1,0,1,2,1,2,0,1,1,1,0,0,2,1,1,1,0,0,1,1,3,3,2,2,1,1,1,1,1,3,0,1,0,1,2,0,1,0,1,0,0,3,1,1,0,1,0,2,2,0,1,0,3,4,2,3,0,0,0,2,1,1,1,0,0,1,2,0,1,0,1,0,1,1,1,2,1,1,0,2,1,1,0,1,1,2,0,2,1,0,1,0,0,2,0,1,0,1,0,0,1,1,0,1,1,1,1,1,0,1,0,0,0,0,2,0,0,1,0,0,1,2,0,2,2,2,2,1,2,0,1,0,0,4,2,0,1,3,1,2,1,1,1,1,3,0,0,2,2,2,1,0,0,1,1,1,0,0,0,2,0,3,1,3,2,0,1,0,2,2,1,2,1,1,2,1,0,1,1,2,2,1,0,2,1,0,1,1,0,0,1,1,2,2,0,1,0,1,0,1,2,1,1,0,2,1,1,1,1,0,1,0,0,1,1,0,0,1,0,1,1,1,4,3,1,2,2,2,0,1,0,1,0,0,1,0,1,1,1,1,0,2,0,4,1,1,0,0,0,0,1,1,0,1,1,1,0,1,1,0,1,3,0,1,1,1,0,0,2,1,1,1,1,1,0,0,0,0,1,2,1,1,0,2,2,0,3,1,1,2,0,1,3,0,0,0,1,1,0,2,0,1,1,1,2,1,1,0,1,1,2,0,1,1,0,0,0,0,0,1,2,0,1,1,2,0,0,0,1,1,1,0,0,3,0,3,1,0,1,0,2,3,3,2,1,0,0,2,0,1,0,0,1,0,1,1,1,0,1,0,0,0,2,2,1,1,0,1,2,0,0,1,1,1,0,1,0,2,1,1,1,6,0,1,0,2,1,3,2,1,2,2,0,2,1,4,0,3,3,1,2,2,0,0,0,1,0,0,1,2,0,2,0,0,2,0,1,1,2]},{"counters":[1,1,1,3,0,0,0,2,0,2,0,2,1,2,0,1,1,2,3,0,0,2,0,2,2,0,2,1,1,0,1,1,3,4,0,1,1,0,1,0,0,2,1,1,0,0,0,4,1,2,0,1,2,1,0,1,0,0,1,0,0,0,3,1,1,1,3,0,1,1,0,0,1,3,1,0,1,1,1,1,1,0,1,0,1,0,1,2,0,1,1,0,1,3,2,1,1,0,0,0,0,0,2,1,2,0,0,0,0,1,1,4,3,0,0,1,3,0,1,1,0,1,1,0,4,2,1,0,3,0,0,0,0,2,1,0,1,0,2,0,6,0,2,0,1,0,1,0,0,2,0,0,1,0,1,0,0,2,1,1,0,1,1,3,0,1,0,0,0,2,2,2,1,1,0,2,1,2,3,2,1,0,0,1,1,0,0,1,0,2,0,3,2,5,0,1,0,0,1,0,0,1,0,0,1,0,2,0,0,0,0,1,2,1,0,2,1,2,1,3,0,0,0,1,0,1,0,1,0,0,0,0,0,0,1,0,0,1,1,0,1,1,1,2,0,1,0,0,0,0,1,2,1,1,1,0,4,0,1,0,1,2,0,1,1,3,1,0,0,0,0,3,0,1,3,0,0,2,1,3,1,1,3,0,1,1,1,1,0,0,2,1,0,2,1,0,2,0,1,1,3,0,1,0,0,1,2,4,0,4,2,1,0,0,0,3,1,3,1,0,3,3,1,1,0,4,1,1,2,1,0,0,4,1,1,2,1,3,2,0,1,1,1,2,1,3,2,0,4,0,0,3,1,2,2,1,2,0,2,2,0,0,0,1,0,2,2,0,0,1,0,2,2,2,1,1,0,1,3,0,1,1,3,2,1,2,1,0,1,1,0,0,2,0,1,0,1,0,3,1,2,0,0,1,2,1,1,1,2,2,0,2,1,0,1,0,0,0,2,2,2,0,0,1,2,0,3,0,1,0,2,2,0,1,5,1,2,1,0,0,0,0,1,1,2,2,1,0,0,2,4,0,1,1,1,2,1,1,2,0,0,0,0,0,1,3,1,0,1,2,0,1,1,1,0,1,0,0,1,0,1,3,0,1,1,2,0,0,1,0,1,1,1,0,0,1,0,0,1,2,3,0,0,0,0,0,0,2,1,1,1,5,0,0,1,1,1,1,1,0,0,0,1,0,2,0,0,0,0,1,0,1,1,3,0,0,0,1,1,0,2,0,2,1,2,2,1,0,2,1,1,4,1,1,2,3,0,1,2,1,1,1,0,1,3,0,0,0,1,2,0,1,1,1,1,1,0,0,1,0,3,0,1,4,1,0,2,2,0,1,0,3,1,0,0,1,2,1,1,0,1,1,1,0,4,3,1,3,4,1,1,0,2,0,0,1,0,0,0,1,0,3,1,2,1,1,0,1,1,2,0,1,1,1,1,0,1,1,2,0,1,1,2,1,1,3,1,1,1,1,0,3,0,1,1,1,1,3,1,2,0,3,1,0,0,0,0,0,0,1,0,0,2,1,1,1,1,5,2,1,0,4,3,0,1,0,1,2,1,1,1,0,0,1,0,1,1,3,0,2,0,1,2,1,2,1,0,1,1,1,1,0,1,0,2,1,3,1,1,1,0,3,2,1,1,2,0,1,1,0,0,0,1,2,2,0,0,0,1,1,1,1,2,0,1,3,0,2,1,1,1,0,3,2,2,1,0,2,2,1,1,3,0,0,1,1,1,1,0,0,0,1,0,1,1,3,0,2,0,1,1,3,2,0,0,1,3,1,2,0,0,2,0,0,1,0,0,0,0,1,0,1,2,1,0,2,2,0,1,0,0,1,0,1,1,0,2,1,0,0,0,1,0,2,0,0,0,0,3,1,1,1,0,0,0,1,2,0,0,0,3,0,1,2,2,0,2,1,2,0,1,2,1,0,0,0,0,0,1,0,2,0,1,2,0,2,0,0,0,1,1,1,1,1,1,2,2,1,2,2,1,1,0,1,1,2,0,1,2,0,0,0,0,0,4,2,2,1,0,0,1,1,0,3,1,3,0,1,1,1,3,1,0,2,2,1,0,0,3,1,1,0,0,2,3,2,1,0,1,1,0,1,0,0,1,0,1,1,2,0,1,0,0,0,3,0,0,0,1,1,2,2,0,0,0,0,2,0,2,1,1,2,2,0,1,2,0,1,0,3,4,0,1,0,2,0,0,2,0,0,2,0,0,1,0,0,1,1,0,1,0,1,0,2,0,1,0,0,0,1,0,1,2,0,2,3,1,0,0,1,0,0,1,0,1,2,6,1,0,0,3,2,1,2,2,2,1,1,0,0,0,0,3,4,1,0,1,0,0,1,1,0,0,0,0,0,2,2,0,0,0,0,8,1,2,0,0,0,0,1,3,2,1,3,1,0,2,1,3,1,2,3,2,1,2,0,0,2,1,2,4,0,0,3,2,0,1,2,2,1,3,3,2,2,2,3,1,0,1,0,1,3,1,1,1,0,2,1,0,1,0,0,0,0,1,2,2,2,2,0,0,5,1,0,1,5,0,2,3,0,0,1,2,0,1,0,0,1,0,0,2,2,2,0,0,1,1,0,1,1,3,3,4,1,1,1,0,1,2,1,1,1,0,1,1,0,1,1,0,2,1,1,1,0,0,1,0,1,1,2,1,0,1,1,2,0,6,0,2,2,0,2,0,2,0,1,1,1,0,1,2,1,0,1,3,0,2,0,1,1,1,1,1,0,1,1,1,1,1,2,1,1,1,0,2,0,4,2,2,0,2,1,1,1,0,1,0,1,0,0,1,0,0,0,0,1,1,1,0,3,1,2,1,0,1,1,2,0,1,0,1,1,0,2,2,2,0,2,0,0,1,1,2,0,1,2,0,3,1,3,2,0,1,2,0,1,0,0,1,0,0,2,0,0,0,0,1,0,0,2,0,1,0,0,0,1,1,0,1,1,1,1,0,0,1,0,0,1,1,1,0,0,2,0,2,0,1,1,2,2,0,2,1,1,0,2,2,4,0,0,1,0,1,0,1,0,1,2,1,1,1,1,2,0,3,0,0,0,0,1,1,4,1,0,1,2,1,2,0,0,0,1,2,1,0,0,1,2,0,0,0,0,3,1,3,1,1,1,3,0,0,0,0,2,3,0,1,0,2,1,0,0,1,3,1,2,1,1,0,0,0,1,3,0,0,0,2,2,1,2,2,3,1,1,0,1,1,0,0,0,1,0,0,3,4,2,0,0,0,0,0,1,1,0,1,0,0,0,0,2,1,2,0,0,2,1,1,0,0,2,1,2,0,1,1,0,0,1,0,1,0,0,1,2,1,0,4,0,2,4,2,1,1,1,1,0,0,0,0,0,1,0,1,3,0,0,3,0,0,2,1,1,1,0,0,0,2,3,1,0,0,0,0,6,1,0,3,2,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,0,0,1,2,0,1,0,0,0,0,1,1,0,1,1,0,0,1,0,0,4,0,1,1,3,1,2,0,4,1,2,5,1,0,1,2,1,3,1,2,1,0,3,2,1,0,0,3,0,0,1,1,0,1,2,1,2,2,0,0,0,3,0,0,0,0,0,0,0,1,0,1,2,1,0,0,1,1,2,0,1,3,2,0,2,2,1,1,1,2,1,1,0,0,1,0,1,1,1,1,0,0,0,1,0,1,3,2,1,0,1,0,3,1,2,0,0,0,0,0,0,0,0,1,0,2,3,4,5,0,2,1,2,0,2,0,1,3,1,0,2,2,1,1,0,4,1,0,2,3,0,0,0,1,1,1,0,0,2,1,1,4,2,1,0,0,0,1,2,3,2,0,2,1,6,0,1,2,3,2,0,1,0,1,1,0,0,4,2,1,0,0,0,1,3,6,1,0,2,0,1,1,0,0,2,2,0,5,0,2,1,2,1,0,2,1,0,0,0,1,1,1,1,0,3,1,0,0,1,2,0,1,3,2,0,0,0,0,1,1,2,0,3,0,1,2,0,1,0,1,0,0,0,0,2,1,0,0,2,1,1,0,0,5,2,0,0,1,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,1,1,0,1,1,0,2,1,0,0,0,0,1,1,0,1,0,1,0,2,1,1,0,1,1,0,1,2,0,0,0,2,0,2,1,1,2,1,1,1,1,0,4,1,1,2,0,1,1,2,0,0,0,1,4,0,0,0,1,2,0,0,0,0,1,1,0,1,3,0,1,1,2,1,0,1,2,2,0,1,0,0,0,0,0,1,2,0,1,0,1,0,2,0,2,0,1,0,0,1,1,0,0,1,0,2,0,1,1,1,3,3,2,1,0,1,3,2,0,2,0,1,0,0,1,2,1,1,0,0,1,1,0,1,0,0,0,1,2,1,2,2,0,1,1,0,1,1,1,1,0,1,1,1,0,1,2,2,0,0,1,2,0,2,2,0,2,0,1,2,2,0,1,1,2,1,1,0,1,0,3,0,0,0,0,2,0,0,0,1,0,0,1,1,1,0,2,3,1,3,0,1,0,1,1,1,0,1,1,0,0,3,0,2,1,0,1,3,0,1,3,0,2,1,0,0,1,2,1,2,0,0]},{"counters":[1,1,4,0,3,0,0,3,1,1,2,4,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,2,1,0,0,1,2,0,2,1,3,0,2,0,1,1,1,0,2,3,0,1,0,2,0,1,2,1,0,1,2,0,1,0,1,1,0,4,0,1,1,1,3,0,1,0,2,0,0,0,0,2,0,1,0,2,1,2,0,0,0,0,0,2,2,1,4,3,0,1,3,2,3,0,0,2,0,1,2,0,2,3,1,2,0,2,0,1,0,1,0,0,2,0,1,1,0,0,0,0,3,0,3,1,0,2,1,1,0,3,2,0,0,0,1,0,1,2,1,0,0,1,2,1,1,2,0,1,1,0,1,0,1,1,1,2,0,2,1,1,0,2,0,1,0,1,1,1,0,0,5,0,0,0,1,2,0,0,2,0,1,2,0,1,0,2,1,0,0,0,0,0,1,0,1,1,1,0,2,0,0,1,3,2,0,1,1,1,0,0,1,0,0,1,4,0,4,1,1,1,0,1,1,0,1,1,1,1,1,0,2,1,0,0,1,0,0,1,4,1,0,1,1,1,0,0,0,1,1,1,1,0,0,1,2,0,0,1,0,2,1,0,2,0,0,0,4,1,0,1,1,0,0,1,0,0,1,1,1,0,2,1,1,2,0,0,2,2,2,0,0,0,2,0,1,0,0,0,4,0,0,3,1,2,0,2,0,0,1,2,0,0,1,1,0,0,2,1,1,0,2,1,0,3,0,1,1,1,2,0,0,0,3,2,1,1,0,1,1,2,0,0,1,0,0,1,0,2,1,6,2,1,0,3,1,0,3,1,1,0,2,1,1,1,1,2,2,1,1,3,1,2,2,7,0,1,0,1,0,0,1,1,1,0,0,1,1,1,2,1,1,2,1,2,1,0,3,1,1,1,1,1,3,2,1,1,0,2,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,2,0,0,3,0,0,1,0,1,1,2,0,1,2,1,1,0,2,0,0,1,3,2,2,1,1,2,1,2,2,2,2,0,1,0,0,0,0,2,3,0,0,2,3,0,0,0,0,4,2,4,1,0,5,0,0,0,1,1,0,1,0,1,2,2,0,0,0,0,0,1,2,0,1,1,0,0,0,0,2,1,1,2,0,0,0,0,3,0,1,0,2,2,1,1,0,2,0,0,0,0,2,2,2,0,0,1,1,0,2,0,0,0,1,1,0,1,0,0,2,3,1,1,3,1,1,2,0,0,0,1,0,2,2,0,1,0,3,4,0,0,0,0,2,1,1,3,0,0,1,1,0,0,0,0,0,5,0,2,0,1,0,1,0,0,1,0,0,1,1,1,1,1,0,0,1,1,2,2,0,2,0,3,0,1,1,4,1,2,2,3,3,0,1,1,1,0,3,0,3,0,0,3,0,1,0,0,2,0,4,1,1,0,2,1,1,1,0,0,2,0,1,4,2,0,1,1,0,0,0,1,0,6,2,4,0,0,0,0,0,1,3,1,0,3,1,1,0,1,0,3,2,0,2,1,1,1,1,0,1,1,2,0,0,2,0,2,1,2,2,1,1,0,1,1,1,2,0,0,1,1,1,0,0,0,0,1,3,1,1,0,2,5,1,0,2,1,2,0,0,2,0,1,0,1,1,2,0,1,2,3,0,0,0,0,3,0,1,0,3,0,1,0,0,1,0,0,1,2,1,2,0,1,1,1,3,2,0,2,1,1,0,0,2,0,2,0,0,2,2,1,2,0,0,3,1,1,0,1,1,1,0,1,1,1,1,2,1,1,0,1,1,0,3,0,0,1,0,1,0,2,1,0,3,2,2,3,2,0,1,2,0,3,1,0,2,1,3,1,3,2,0,1,1,0,0,1,0,0,1,1,1,0,1,2,0,1,0,0,2,2,1,1,1,0,2,1,6,0,2,1,0,3,2,1,0,1,1,2,2,0,4,1,1,1,1,0,0,1,0,0,1,1,0,0,3,1,1,2,2,5,0,0,4,0,2,1,3,0,0,1,0,0,0,1,2,0,0,3,1,0,2,3,1,2,0,0,3,0,2,0,0,2,1,2,1,1,0,1,0,1,0,0,0,1,2,0,1,0,0,0,0,1,1,2,0,1,1,1,1,1,1,3,1,0,1,1,1,2,0,0,1,3,1,0,0,1,3,3,1,2,0,2,0,0,2,1,0,0,0,2,1,1,1,2,4,3,1,1,1,1,0,1,2,1,0,1,0,0,1,2,0,1,2,0,1,1,0,0,3,2,1,1,1,0,2,1,1,0,1,2,2,1,0,3,0,0,1,0,1,1,2,0,1,0,0,1,1,1,0,2,0,0,0,1,1,2,1,0,1,0,2,0,2,1,1,1,3,0,0,3,1,0,0,0,1,0,0,0,1,1,0,0,1,2,3,1,0,0,1,1,0,1,1,1,2,2,1,0,3,2,1,1,0,1,0,1,0,2,1,0,3,0,2,0,1,0,4,1,1,0,0,2,2,3,0,1,2,2,0,2,1,1,2,0,0,2,0,0,0,1,0,0,1,0,0,0,1,3,1,0,1,2,1,1,0,1,0,1,2,1,2,0,1,1,0,0,3,0,4,0,3,0,1,0,1,0,0,1,0,0,2,3,2,0,0,1,2,2,1,2,2,1,0,1,1,0,0,1,2,0,4,3,0,0,0,1,2,1,0,0,1,0,1,2,5,0,2,1,0,0,0,1,1,0,1,0,0,1,1,0,1,0,2,1,2,0,1,0,0,1,1,0,2,1,1,1,2,1,1,1,0,1,0,1,2,1,1,5,0,1,2,0,2,1,0,1,0,1,2,1,3,0,1,0,2,3,0,1,0,1,0,2,0,0,0,3,0,1,2,0,1,1,0,1,1,0,2,0,1,0,1,1,0,1,0,1,0,1,2,3,2,2,0,0,0,3,0,1,0,2,1,4,1,0,0,1,1,0,1,0,1,0,1,0,0,0,1,1,2,1,0,2,0,1,0,0,0,0,0,3,0,0,1,1,0,2,1,2,2,2,1,1,3,0,1,3,1,1,0,2,0,1,1,0,1,1,5,0,1,0,0,0,1,1,0,3,0,0,0,0,5,1,5,1,1,1,0,0,3,0,2,0,0,1,1,0,2,1,0,0,1,2,0,1,0,0,1,1,0,2,1,2,0,1,0,2,0,1,0,1,0,0,0,0,0,0,2,1,1,3,0,2,1,1,0,0,2,2,0,0,4,1,1,1,0,1,2,3,0,1,1,0,1,0,1,2,0,0,2,0,0,2,1,1,0,2,1,1,0,0,2,0,1,3,0,0,1,0,0,1,0,0,0,1,1,1,2,1,1,1,0,0,0,1,2,2,2,0,1,2,1,0,1,1,0,2,1,3,0,2,2,0,2,3,0,3,0,0,0,2,0,2,0,2,0,1,1,1,1,1,3,1,1,2,0,1,1,1,0,1,0,0,0,2,1,1,0,0,0,1,1,2,3,1,1,2,1,0,0,2,0,2,1,1,4,0,1,0,0,0,2,0,1,2,1,0,1,0,1,0,1,1,0,0,1,2,2,1,0,0,1,2,2,2,0,1,1,0,0,3,1,0,0,1,0,0,2,0,2,0,1,1,0,0,0,2,0,0,1,0,0,1,0,7,1,0,2,1,0,2,3,0,1,0,3,0,0,2,1,3,2,1,1,3,1,1,2,4,2,1,1,1,0,1,2,0,2,1,1,1,2,1,1,2,1,0,4,1,0,1,1,0,0,1,0,0,0,0,0,1,3,0,1,1,1,2,1,0,0,0,1,0,1,0,1,0,0,1,0,2,0,0,0,0,0,1,0,0,0,0,4,3,0,1,0,1,1,0,2,0,1,0,1,1,1,1,1,0,4,0,0,4,2,1,1,1,0,1,2,1,4,1,2,0,1,4,0,1,0,0,0,2,1,0,0,1,1,2,2,0,0,2,1,3,1,2,0,3,1,1,1,1,1,0,1,3,0,0,0,1,0,1,1,1,0,0,0,2,2,1,1,2,3,0,4,0,0,0,0,0,2,2,0,0,0,1,1,1,1,3,1,0,3,0,1,1,0,1,1,2,0,3,0,2,0,2,0,0,0,0,0,0,1,1,0,4,0,0,1,2,0,2,1,0,0,4,1,2,1,1,1,0,0,0,1,1,1,2,0,3,2,1,0,0,1,2,2,3,1,1,0,1,0,0,0,1,0,2,1,1,0,1,0,0,2,0,0,0,1,1,0,6,1,1,0,0,0,0,1,2,1,2,0,1,0,3,1,1,1,1,0,2,3,4,0,3,1,1,1,2,1,0,0,5,0,2,0,1,0,0,2,0,3,1,0,1,0,0,0,4,0,0,0,1,1,0,2,0,0,0,2,1,2,1,0,1,4,1,0,0,1,1,2,1,1,1,0,1,1,3,1,2,1,0,3,2,0,2,0,0,0,3,0,2,0,0,2,0,4,1,1,2,1,1,0,1,2,0,2,0,1,1,0,0,1,2,0,2,0,2,1,3,0,0,1,0,0,1,0,1,2,1,1,2,1,1,2,0,0,5,1,1,1,2,2,0,0,0,0,1,2,1,2,0,2,0,0]},{"counters":[2,0,2,0,0,0,1,0,1,1,0,1,1,2,2,1,1,1,1,0,2,0,2,0,1,2,1,0,2,0,0,1,2,3,1,0,0,2,1,2,2,0,2,1,3,0,1,1,1,0,1,2,0,0,1,0,0,1,0,1,0,1,1,0,0,2,2,2,0,1,0,1,3,0,0,2,1,0,4,2,1,0,1,0,0,0,2,2,0,1,3,0,2,3,0,1,1,2,0,0,1,3,1,0,1,1,2,2,1,2,0,1,0,0,3,0,5,1,2,0,1,0,0,0,0,0,0,3,2,2,1,0,0,0,0,1,1,2,0,0,5,3,1,0,0,3,2,0,0,1,0,1,1,3,1,1,0,0,0,0,1,2,0,2,1,1,0,3,1,1,1,2,2,0,1,2,1,1,2,0,0,3,0,0,7,1,0,1,1,1,1,1,1,0,0,0,0,2,1,0,0,1,0,2,1,2,1,1,1,0,0,1,1,2,0,1,1,1,1,0,2,0,0,0,1,2,0,4,0,2,1,4,0,1,1,3,2,1,4,5,3,1,0,2,1,2,0,0,0,0,1,1,0,0,0,2,2,1,0,0,0,1,1,2,0,2,2,0,0,1,2,1,3,1,1,1,2,0,0,0,0,2,2,1,1,0,1,1,0,2,2,0,1,1,0,0,1,1,2,0,2,0,0,0,1,1,1,6,2,0,1,2,0,2,1,1,0,0,0,1,0,2,2,0,0,0,2,3,1,1,1,3,1,1,0,2,0,1,1,2,1,3,1,2,0,1,0,1,2,2,2,3,0,0,0,1,0,4,0,2,0,0,0,0,0,2,0,1,0,0,1,1,0,1,2,4,0,1,0,1,0,0,2,1,1,0,1,2,0,0,0,1,1,0,0,2,1,2,0,1,1,2,1,1,0,1,2,0,1,0,0,2,1,2,1,0,0,2,0,0,5,0,0,1,0,1,0,2,1,0,0,4,1,0,1,0,0,0,0,1,5,2,1,1,0,1,4,1,1,0,1,0,1,2,1,1,1,1,5,2,1,0,3,0,1,3,1,1,0,1,0,1,1,1,0,1,0,2,0,2,1,0,0,2,1,0,1,1,0,0,1,0,0,0,3,5,1,0,2,0,0,2,2,0,0,0,2,1,0,1,2,2,1,1,1,5,0,0,0,0,5,2,1,1,1,0,2,0,2,1,0,1,0,0,1,0,1,0,1,1,1,1,0,1,1,0,0,1,0,0,1,3,1,1,0,0,1,0,0,1,1,0,2,3,4,2,0,1,0,0,2,0,0,1,0,1,1,0,0,0,1,1,2,0,1,1,0,1,1,1,0,1,2,2,0,1,1,3,0,0,1,0,2,1,1,0,0,0,0,2,2,1,2,0,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,2,2,0,0,1,0,0,2,0,1,1,2,0,0,1,2,3,0,1,1,1,0,3,2,0,0,1,1,1,0,1,1,2,2,1,1,3,4,3,1,2,2,2,2,5,0,3,1,0,1,1,0,1,1,0,0,4,0,0,2,0,1,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,1,2,1,3,0,0,6,1,0,0,0,2,1,0,4,1,2,1,0,1,0,1,2,0,0,1,2,2,1,1,2,1,0,0,1,0,1,2,0,0,1,1,0,0,0,4,2,0,1,3,0,0,0,2,1,0,2,0,1,1,0,0,0,1,2,3,0,0,2,1,1,3,0,2,0,1,2,0,0,2,2,0,2,2,1,3,0,0,1,0,2,0,2,0,1,1,2,1,0,0,1,0,4,4,1,0,2,1,2,3,1,0,0,3,1,0,2,0,1,0,1,2,0,0,0,1,2,2,0,2,0,0,0,1,0,0,3,0,1,3,1,3,0,0,1,1,1,0,2,1,0,1,1,1,1,1,0,2,0,2,4,1,0,0,0,1,2,1,0,1,3,1,0,0,1,0,2,0,2,0,0,0,1,1,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,1,2,0,2,1,1,2,1,1,1,2,1,1,1,0,1,1,4,0,3,1,2,1,0,1,1,0,0,0,3,1,1,0,1,2,0,1,3,3,0,0,0,0,0,2,1,0,1,2,1,1,0,1,5,1,0,1,0,0,3,3,1,2,1,4,5,1,1,1,0,2,0,0,0,1,1,1,1,1,0,0,2,0,0,3,0,0,1,2,4,0,1,2,1,1,3,1,1,0,0,2,1,2,1,1,1,2,3,1,3,0,2,1,1,1,1,1,1,2,0,2,0,0,1,4,0,0,1,0,0,1,1,1,0,0,0,1,1,2,0,0,0,0,0,0,0,5,1,1,1,1,0,0,0,3,0,1,2,1,0,1,2,0,1,0,0,1,3,2,1,0,3,2,0,1,0,1,0,2,4,0,1,2,1,0,1,1,0,3,0,1,1,1,1,2,1,1,1,1,0,0,0,5,0,1,2,0,0,1,2,1,0,3,1,0,0,1,0,2,0,0,0,2,5,0,0,1,0,4,1,1,2,0,2,0,2,0,1,0,3,0,0,1,2,1,0,3,7,1,0,0,0,2,1,1,2,0,2,0,1,1,0,1,3,1,1,3,3,0,0,0,1,0,1,1,2,0,2,0,1,1,0,0,1,0,1,1,0,1,0,2,3,1,0,0,2,0,1,0,1,0,1,0,1,0,1,0,2,2,2,0,1,1,1,1,1,1,0,0,1,1,0,0,0,1,2,0,3,1,1,4,1,2,2,1,1,1,1,0,1,2,0,0,1,0,1,2,0,2,0,0,3,1,2,1,0,0,0,0,1,1,1,1,2,0,1,0,1,0,1,1,0,2,1,1,0,0,0,1,3,3,2,8,0,2,0,3,0,0,2,2,0,5,6,1,3,0,1,1,1,0,1,0,0,1,2,1,2,2,2,2,1,0,0,2,0,0,2,0,0,0,1,1,0,0,0,2,2,2,3,0,0,0,1,4,1,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,0,1,0,0,5,4,1,2,0,0,0,1,2,1,1,1,0,1,2,0,0,0,2,1,0,1,0,3,2,1,0,2,0,0,0,0,0,0,2,2,0,1,0,0,0,0,0,0,0,1,0,0,1,1,0,1,1,0,0,2,0,2,1,0,0,1,1,1,1,0,2,0,0,2,1,0,1,0,0,0,0,0,2,2,1,0,2,0,3,3,1,0,1,1,0,2,0,0,1,0,0,0,2,1,1,0,1,1,1,2,0,0,1,0,2,0,3,1,1,1,2,0,2,1,0,0,0,1,1,0,0,2,1,1,2,2,1,2,0,0,0,1,0,2,1,1,0,1,1,2,1,0,3,0,2,3,2,0,0,0,0,1,1,2,2,0,0,0,0,1,0,3,1,0,1,0,0,2,2,0,3,1,0,1,1,1,2,2,0,3,2,0,1,1,1,0,2,3,2,0,1,1,0,0,1,0,1,0,1,1,0,0,0,2,1,0,1,0,0,0,1,1,1,2,0,1,1,1,2,0,2,0,3,1,0,0,0,2,0,1,1,0,0,1,1,1,0,3,2,1,0,1,1,2,1,0,0,3,0,0,2,2,1,0,0,1,1,1,0,2,3,0,0,1,0,2,0,3,0,0,1,0,1,4,3,0,5,0,1,0,1,0,2,0,2,0,0,1,1,0,2,2,1,0,1,0,0,0,1,1,0,2,0,0,0,0,2,0,1,1,1,1,1,2,1,1,1,0,0,0,2,1,0,0,1,1,0,0,1,0,0,3,2,3,1,0,1,1,1,6,0,0,2,0,3,3,0,0,2,0,0,0,0,2,0,0,2,1,0,1,2,1,0,0,0,1,3,3,1,2,2,0,3,3,2,1,1,0,0,2,0,0,0,0,3,1,1,1,0,1,0,0,2,0,0,2,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1,1,1,0,0,2,3,1,0,2,0,1,0,0,1,4,2,0,0,0,3,1,1,0,0,1,2,1,0,1,4,0,5,2,1,2,0,1,1,0,1,1,0,2,0,1,1,1,0,2,3,2,0,0,0,3,0,0,0,0,1,2,0,2,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,1,3,1,2,0,1,1,2,0,1,0,1,0,1,0,0,2,1,2,1,3,0,1,0,2,1,1,0,0,2,0,0,1,1,0,0,2,1,3,0,0,1,0,0,1,0,2,1,2,1,1,1,3,0,1,0,1,1,0,2,1,0,2,0,2,0,0,3,1,1,1,1,0,0,2,0,0,0,0,3,1,3,1,0,1,0,0,2,2,3,0,2,2,0,1,0,0,3,1,1,1,2,1,1,0,3,6,2,1,1,2,1,2,0,1,1,2,2,0,1,0,1,5,0,1,3,2,3,0,0,0,1,0,1,0,1,6,1,4,0,1,1,1,1,0,1,1,2,1,3,1,0,2,3,1,1,1,1,0,1,1,1,0,0,0,0,1,0,0,0,1,0,4,2,0,0,1,1,1,4,1,0,1,1,1,0,0,0]}]},"null_count":0,"last_update_version":397952033613152256},"ext":{"histogram":{"ndv":1998,"buckets":[{"count":7,"lower_bound":"MDBaOGs4UFU1U09zSnpxcFNuaUowUUhyeGF2RXZ2ZmJVZmxIa1Y3ZzZxRXVLdlVNUGJPWjZxaHRIWUVmS0NqQU55d3BibmM2Y2ZYY1Y1Y3YxWGJTU3hwY3ZFUEJOSXZsNFNFY0dQU3htbm9meWtITnk2MlQ5dE1GTlNsNUxETFc0cFcyTncxaTA5VFhHM1BKcVJJdkdkZkJuRnQyWGU5N0cyd1FMcGVXUmp6OHJkWVpXajd1NTBQb1ZpcmY4Z1VNOHZyR3gzVktaM0lUZFJaeFF2SnZiVWc3Zkl2eEFoVXgxNTRYcEQ1eVE2RURDR2ZTNW9xWFd1a0dxMVlEMndxT0M1OUFJR3pERnpzS2tyNzlOQ0cxUnhyUVFaM0JlYkJGRjlHS29IRHh5Rk95cjg1d1ZzSHNKa3VlYlRMejBORXJya1FNUDdCUXhIakxvZmI1ckRKbFlIYg==","upper_bound":"MElMSGVOcG9jY1B3WUpTOTI5QnNCVXpSUExmT0UyU2kzZ1k0bWppbWE0V0lubEZ5Sk9Id2p2Y0RNOWdkZFJ0a0dMbFVDYnlZVVRuZjBnaE5QdUx0VWlaaW5MZUFDZkcyTnZvRkt2NG1FR0xxbEM1bFJuc21Xc2F4VW9EVTdxNVJ0RFlaSlpXZUhyckNRRzA5bDBDTml4cnFBeTNWUDkzYTFOd0lnMXQyUkUzZzlqREpVcVlhVVVNSXh6TG1mRUFlU0R4dEdqcHVqcmYzYnJSWjFQbDlSRVlJV0xUeHk4Sjl1WURtand5N0c2QTR4UXZoV2F4WFE3WGR1cUVkS0hEV2RsRXpvUVhaUVF3SjU5RU5TMzhBbzIzMnpuT1hDSXBKdG5UNGpKaG1MOFBDdVdSYnBBWXFaNVczNXJPTXpkMWtBa2pGTFdHVTBuNWJlYnR0cUR0Umkxc0pHRENUZjR3WGgxZzRhbmxPd0dWcHRYNG1KdmI0NEZrVEwwZ3Z6VTNHQWdnMTZkYUVCSHRaMElVV1kzS2h4U1ZhZzRwaXFXMDlrcVFYRFhHN3huWnFybFF6TkNuamRhYmNMeVptalVMVGg4Q3JZU1czTW0zbQ==","repeats":1},{"count":13,"lower_bound":"ME1wdHdiSHRzWktWQzhSWVFOT1RhdGF3M1RXN09PcWhrSXlCd2k2N0U0WEt3UVAxd3V5WjZsNlNPcGxVNTBrTW9NbWo3YVpSdlVJN2ZyWnhWbmpOMzlJQ0JYU0hqM3pGbEp1YnJZdkhPZ1pvUkZnNGdtMmZpS2NNRlIySk8zQVkwZlZjOGpMZ1BobXdFQno3TElXSGlGMkcyMExvYXN4dm9ZVkJmdVBtY0NoQWpo","upper_bound":"MFd5UkdJc0x5ZU1SYVNtMmpUNktHTWlXdkM5a003Z2lBZ1l6UEVZQ2pidXlzdWw=","repeats":1},{"count":19,"lower_bound":"MGVLQ0xEVGtCQnNCM0tVT2dwRkJLNHZmV25lc0d1c1BYUmthOHJZRHpjdWtDZEFoTFZzSzliOGZvOVJ3Y2xPQlVqTUVvZlF3d2tOeHJ1UTU4YkpSQm5RVm1WYUlOclVVenJMa1E=","upper_bound":"MG1MNU92Z29aU3h2ZUIwYjZ1Tndvd01IbkdqVFRucmRCWTRWUnV0dUhSWkN4enMzMVJuaWJXdzZpUzNFS0dZQ2pLUUxTRGkwMElLMVpSdm9ldTBuc01kVmw5SXZvYUphbkdTZ2RaTklreFgxelVQVXozWGp0Vk4wRXpWR3VMc1F1WHRVR0JwcFE3dzZzVGVMaGw4ekFJcXZHaFdWV0thU2RPekdqVVp5UXBXdmQyUlBkQXh1ZnF6MGpSTDRieGRPNGNxOEhYZXlsQ29yVE5kelFqR2Jnb0VOb2FySzBobHNTZlluQlBvQ3FCaE1UbzBPZk5uMmxYbGFHM3N0dnJGSjhHbTBPYVRtcTJoZkVmOElhSmRKWkdJWTR6bFlDUFg1YU83dEZiQ1UzRDBUcVVUSHBIbVpMV0JxZUhxOVhqWGhDQTlUSXI1azAzMm0zbmFRdk02ZXNVOVBFbUd0Yk52UmRHSFVtZklH","repeats":1},{"count":25,"lower_bound":"MG5hWW41OHp4anVVZzNlRVBKNGt6bU9xOFZHQko4UlFXcUc0OUFnZHpSS1N3dHFaaWx5V1JpYXBpMTRtMll5NjdJRkZvN09VUzRERzBRV3NUdGllSWJsYTJKaXNDYW9KTjVQaTlDWXloRnNuZnhxWGc5YXgzb1Q1T3JhRnNMN3ZWRUFZWnV4SlpnakRicFVyOWdjem9CTkE2YTBFSDhNTE45aEN1Y2NzN2JuZUszVkNUTUN6dnZ4UThiTGwyTzF6TlZzTWtLdDM2SU1YOEM1WDlvbTlYTDltQTNubTZwcVRlZ3kxRjZUN3VFb0UwWm5YU0xHTlgzYzJqVFBDbllhZHFpak16Y0F2WXpyWThIWWg2Q3o0TkpMZVV3dXJvdDBpWGI4Mm9RTXJJRnI1ZkliRnJXODYwV2cxc0o5R2VzRGU5QQ==","upper_bound":"MHVvVGgydENDb1g3SXZqc2dwbzVnVVdzYlpYeUgwRFpiQVNIbHR6QkFPZTNXeGl4SXpFM0lrUzlvRkVvWEFwdnRjNW15MUh1VnQxZ2dLODdaalo5dkszNU9YUkNsRXlIMUJrRkd6V1AzS2xHRmFhNVhTWEVxTHZuQ01tWFliV3cwZ1dSSGhsUVhnUkhNYmJqZ0VzTk1yMmRvUEFJVGZTc1FUZ0hEdDZjdEszV3EyV1didFdBZ21JUHpSRk50TUVxOWM1YUJvNHVPZ25wNTdpOXQ4U09CNHFCOENxVGxsNVRreklsTXV3dHFPMUgyc05XM09hYnlLTFpTa1FTVHllY0dqZVdvaldhSWNBeGY2MGVxTVFSNVNPOTRTcDQ3a2luR1BWM2RwbldmWjlMamp5dXNYSHdQNHhydVhpaVNoWWNYcmN3YUh1VGFSVkJtcWM3czBsN0NUQTk3djE1UFBGRDYzSzR4MzdyVXFzcFUyNzU4VUJ3aWNFdHVYQU5TN1lLcW1LNUF4bkoxSFp5MmoxNVllaEY=","repeats":1},{"count":31,"lower_bound":"MTIxMndLakNYSHI1TXFKZUN5WkFBYW50VnhaT21CQ2F3Z24wam9XNkJzWWF3azRXVm9zdlpvV0xBeWg1eVdhTm9zejE5VlJVNmNrY1c3NjczeTZJZkgzSVhSMjNoOTd6N0xhTGNySg==","upper_bound":"MTlZdGVMQUZhRUk3TXI5UWVjSXZWTXFmWU5mdE9VU2tZemhwUmVScGh6N3gwMTJrRWxsMXkzVTBBTHJNMk1udU1lT2dtVHdvMUxMemdLRWYySnEzQmFuc1RseEZBRFZsZGZ0SFJIY1lZaXN4ODBGNmh6Q0ZZekczc3dYelpKWU83VXZYNWFOMm10U3M2dXF5Q202d2FBaWRydUl1dHlWYjR2QlJ5aUgwaWxDUm45VWNKNDhqREVtaDRFbHd4bTVKb05LRmhleGVmTEh0TUxIQkp2Z0k4NGIyS3FORXBPWVVjU3NsQ3N4NlBaY1VlWkphRWg1OGxLZkdsdkEwYkg0N2dRMzZCSXN4QVQyWno2RG1UVjR4YjNaeUY5YkVuQ2JmWlgyZmcxZVJncFAwOTYzQU5KMjdDaVIwZHE4eHhCZFE3dVdRVGIzaWF0ZUtJTVA3UEJMc1RVMEN6Umk3UUZOQjZPVjZvRDZkdEVLaEpDMWs4U3MyTTAwckNTQVQ=","repeats":1},{"count":37,"lower_bound":"MUJiU1Zt","upper_bound":"MUhUbXFoVnVMU0p2WnltSnNWRXhTMFE5N1lSOEd6Q0t0N25iRU5ReXpBVG9VTWc0eXFLMjNUV1ZsZWhCOWlNdkhUbDlVS0xuOHA1NjhORjMxa3hRczA2OU4wZGJ0aVgydnNPdFhmcG9pQk1FU1BMVmdMd2RvYU9BRUs0dGdPVm9zNGl6MkhvYzI4eWpXZmFtM015UE5lelZBSnJqanp2aXhRbnAzVTZ5aVEzRTB4VndWT1p0SE5sNVN5Z0FVaml6NkNOOGF1dnI1YndEVkc2SE5uUjgyNXdXTnJMbXdPeGFybEVPa3NxR0hPMmh0ckIwRjdCVXdLb3lHYVV5djlUY0d1RzF4VE9LMXA5cTU2UTU2MWg0RTNtcEdvUTVUYXA5c01veThFSHQ0R0xJMkVSTjY2QjA4cWY3WGhnTU1HRk5xUmpiOFFBRDIwZUhHcE1mTEFhVFBDajU3bjI2MGRFSU9PWG9QRGNaajBwSDVUd1F6SnI5VFliM0dpY09SUHRYYWI1VzBMWGFSUzNyaDV4UUVQN2Z2SmVoMFJQUGk1NDlVUFdRODhTZU5ka1l5VXA5VFZSZTlpaGNHTUg2VENaWW5pVGw0dnZMRUF0","repeats":1},{"count":43,"lower_bound":"MUltTnNNVm9PUFkxRUdIQzFreU9BSmk4UEJpSTRZRW9waVBVZUlBSVVjWjNUbTRmT3NJeVgxbktRRGtuaEtNdFQ2S3VjVFpWcERJTElIVDFwaVI0U0RCalJwZENHa1ZCMk1GSEF0YjN1Q0RFb0lON1RMTnkxMmhuWFdKajczcE9OckF4RmhFa2pYZ0hBV09xcA==","upper_bound":"MVBXa0pZcjBtTEprWm5IUjUxN2VvNHMxQ3JWVXpiYXJSb0Vnd0NPbFNhY1VidUVCY0hRUGdYbndJS0hkbGJSTWU2cHUzcFE0bHZFek9EeTdPb1ZtcFhYOEJnYjlUVHJMZW93aGtSdDNhOVQ1aVhYbjlaSDZFZFRZR2dualA4SXhiZDlFbmJtZGR4RjRqOWRJQWNpYXZ5Smo3RU5DQ1doZE82VHh5ZlcwZmJGTnRUTWlDZFdONUx1QWI5UGhzazBDMHVvR3ZaQ3FURWNXOVd4VWswOTdoa3lGb0Y5NHJCU2cwemhhNDg=","repeats":1},{"count":49,"lower_bound":"MVMxNWhzTUJ1Ukk2QjhBVjRVQzVnUFJYMjl1Q1JjRDNESVhUU2pOMEVwQkFRbldiYThjUkRlOVVkU1FDWnFuQlpWM01oNDhjSlZzTWlFY2FJc3BNbHRZTUxEdDJqWW1yaExSclhvVVI3c29odU9Kd0FXbkpkUmN3UTJmT1JrS2lCMWZ5cVlTSFE2UGNBOVRmR3hNRE5wUzNEYTEzTEh1RUV6VGRQYXZPMXZGSEhrQ3JnU09aMWVGOGNiSFBEUjRrQXZEQWR5TVNzdkNMN2JCTlpocEhTeFc5T2IzVnU5STVJNHdCYjBhemxDQ2Fhb3pyODZ3MkswekNDQW12OFhnZmlHa0xPaE01R1ZWcjRRSk43R202ekpkaTR4ckh0dkNLREJVZWh1RHl0MGVpSk9ETk5obDRpa1ZMRFJkYzhKUWtJb3Z3andDRGZZMUt6QXE=","upper_bound":"MVYwQWh0anZHdW1odm1Nc1NJclRJckh4a2kwOFhlT1EwdEJNYnNYMmtIOXNFb2d6TUFBY0lRbFc3N2o=","repeats":1},{"count":55,"lower_bound":"MVdIa0UwSjU4Z0xxbUpVSWY1RmRXMVZ2Y2ZuTG1uZk9UNHNCZ085QW1tcFVwN2dNbXZ5b2lFSmpoYWx2Zlc5YWtWT3h4endhM2hBS2tsZDhPRTVEeXJWNTZrOUE4TGRuYlpyZFJ1TTRQTmF3OHJKOEVGU3JNWWZHY0RXazA5OFNCRk9OQ0lkMlZubjNmaU5tZDlNbnNTWmNtNGdGNHBzVkpEa1BxMGV1ZFc2eEdmTjk5eXJmNkhBM1JEbWRhZXpjU1hHVGFob2tTMmxzN0F6MWJsSFVSZVh3N3FpN0pWZDdJelJvQ1F3d0ZUeUFOMjZpT01uajIzUDdzc1RSTERJSDBNcXk2N0NveGZoYUFRYm84dU55dQ==","upper_bound":"MWVXcllBekZmMTVoYjlkUXMzSTV2TjFFUjFnUVdHQlRKSEVIVEJYeFZZeFBUd1lpZFlXNkNDWVJDZkRqN0ZvT1ZBaFVadmR4V2h6aFBGR21QYmdJUFdRd0hzVG81M0UwODczRU0zYXNvVFhpNm53REU5cUNxNEdMN2RWT1pUWk83WXZxZDJzb2cwQXBKWmg1cWZtRmNGdmlsbVJoRm5XUHljNGFhbVdDUWlrMlNJeHVZMWYyRDM0TGM5aWljU1JFcVBwbExRQVlaU0NmSkxwZWIyQmY2RG5UVmFVZjNvZWlyQTIwNzZSRk5wWW9lUFoyZURJMkZWVjNpcGxMS0lCZ29PTGJLdzJBYjI1RFhtaUkybEtMZ25kYnhYYkJZejB2YjJ5NEdVcnpaSVpaNWljT0Y1dDhIdjRhWmxjU0VHdklWczh6SnhzbFJRclowOXdRVW5LWDllNW5SOGNmeFdWaXUxckRxeU9xMUhhTVZCYmo1OGI3elI4UUpNdVlreGM1RzM3TzZ5T0o3TXVuc1Bjb005b1RmbUwyOW5vbWZpQVpjb3dDaUlFWXJmSkYzTlpySWN3emlmcHBOdnpnNnBOZ25IRmpWRXNNeG1nZzloUUI1aExhM2FXVWt6Q0p6N0YxMU1mRldOSw==","repeats":1},{"count":61,"lower_bound":"MWpkb3d2dGN1WUVHWmljN2hJTWVvV05yUnpUa2lwc01BbUt1","upper_bound":"MXBaWFQ5d2hzMFZHaFdubkJxN2MxaEdRTWswRU9GOXBlbGVyc0k3b0FuZGQ=","repeats":1},{"count":67,"lower_bound":"MXRlbzZiY3VnOFJWd2d2Q1A1ME5BRUkwOG5SVXZoWE0wOEdEbFc=","upper_bound":"MjI=","repeats":1},{"count":73,"lower_bound":"MjY4QnQ0QXRwWEZudUllelBjS1FRbEZwTklMUGl5bFdtcmZiMEZLR3FOS1l1dDdNWXdVTTZyV1ZyRGYwejAyTmR6M2J6Q01UTDVxMnVVQTFhQUtBODZQamJmZG01OEQxOFZnRU82SHgxN2g2Y3RnbXFMRjdmYlJWYkJBWG9XZjJocFF5YUMxaDFUUHBGV25Da1hkNGd2S05RVzIzcTBSeXoyV2tLMThxdWRRcnNXYTFMdzlRalA3WVBBS0ltYmQ0aVQ0dnFUWXY1Nm1ZTU50a1BYOGdrekNuNTMxWXV6NkZmdGtqdmRNaldWWnk4Y0RSVkh5Mk00Tk1nRTZWZmQ0NzhGd0JDTkFNbXdTNk1uZnA4NVFpVmdMbWdEOXVtemFKMHZIRlJ0aUV1SUR3WW1QeWxKcGZ6bG9MZWFlN0prc2pNVFhtY2JFM3c0","upper_bound":"MkczWU1Ld1lDNTZ4eDN0Vms1YVZXVnkzSjk2SzNDUXR1cVNZQVlzWWk4U0VFVnAxNUk3S1oxR0tLYjE5NzZsTzBYdnlSYk56aU5ZNnV4eThrUXBiZVhLT3JkUENEcjhyeUZqSkV5dWlwTFNySTdPRGNvVjVHaFcwYmRNV2dYeGpGZnJHQ0ZCTnYwbm9pMXZmTUFiUHZZTVFqMldzVDZtNVhtTEFGWGt2d0FmWWowTjlnZUl5SkhUYWhPaHpLRDBuS1RpckJ5NGVXd01RTFdPV1piSlIzZHBEU2JMVGFDNmR1SGZFemo4MDMxakt3NFAzSkpXWFVlUGhkU1lLVUE0bXhmSGZkR3FJTmRUbkIwTTc4ZHZKWlBPV1d0TFNHZjhWN1lwYkduT1VBOW9xb2FvcmpMRW1keTVNUkFrNVd3Y3VIRlFHUElscGdCdzNOeGViYkd3VU1ES0FnNnpyY0pabVNsbEUySmM5RlF2dElKMHY4R1NqRzlIVlNYTFFVNUFIMDhHa0lZVjI0R3BGemVoMGlaUGxyV1ZxQWhFQkd2QkJlaldvSzdiTmhzWW0zV0ZZZ2Q2bmxNOG5rMmdrRERtRjhBUUViTEl5bFlhSmNjSjZ3a3hRaDJNd0RUa2VYc3V0Z0VUdw==","repeats":1},{"count":79,"lower_bound":"Mk1CUkd5c0dZVnpBakpkdWFGa2hGZUFvN2todmtmN1l6NzdLZ09hRDNUQUFHekFPNjBjckIzVEhSazZwR0pmWUN3cDVHTnBSS3UwZzRzNklmdXd3WlJ2eDlzWWFIZjNmUGZGb3ZtakU1Q2VOU2dZeUJOQjNFck1wZWYwOVRLTVg3Mmo=","upper_bound":"MlIxandYR2FVZURSZ3BJSDZxNXloc0lMak1iMG9RamxTNjh4WWFtamEyS3JQeFF4U09YOFhITWlkMzBqcEJGc2VqNldsYlYx","repeats":1},{"count":85,"lower_bound":"MldOeGNBSHBETTA3SXgwNUlBYzZqdGhWRGF6bTZ3cUpGdWFJZU95VXo2TjQ0aVVHMzIwVlYwYUR0U1RFUWQ1ZUNlOXlLVnIwQXk0UGNEaThvd2habzFQMzdXZFNPSGFnc3NVSktqcm5VMEhuVzVrVzM0ckFQR09MZjd3RUJIREpYUE5xSDl5cEtQckY=","upper_bound":"Mm1kNm1wREhRcWNIanlWN1RWRnRpUHB3WHBaYjJpcDhVY09HTXk5VkhNblp1dThUTDd5Mmx3emFqWHdaY2Fyc2dKcXJhWXhKb0VLNTlqa0ZoRldpT2pSYkI5WmZacll1ajVKbEcxbExEZ2ZENjNqWUZNNk9SR2tFS0ttTWVXTjZWWVZyYXh1cGxhZVI5YWZLdzdOeWNjQllETVNZOXhqVzNHbjdZNWRBN3BrSTFzTjB2OXRhVnhRTnJsZ2FKSWhUeGR5dWxPS0xxblJ3RTBTcVhwd0x5UXZZTzJKaTRGWGRpZ3Z3eG9KNndvdGgzb3l3YVYxaHAzRUZoN2Vid3F4dlNvUTQyaUMwZlF6VDhuelR5UFpnWGFVbXN4RDNOTVRXQ3hySmFkVGd4WTlteWJtNkh5Y3ZIemQ2Z09FOElHOTNUU3BwcEJhRDFYUHRhOA==","repeats":1},{"count":91,"lower_bound":"MnRyM1dFRExoVzUwNDlxN1h1d2pVemhhQ1BBVVdoQnl6Y0F2UENoVktmVUNQcVR5NEJIUXRUdjVhRjkycmdrNzZxUHhXbEh2dE9mbm8zQVdsTWdnamtzaXlOSU9uaDFKZEcyTWtGejV5TVEzcktHUHhXcTI0OTRFaDRuVDc4UW9pVVN3NnFpdWdDT1g3SENSbnBoZHRxc0d6RElnWGxHWWpPSDhDTldyV2tKWUxGRTlqTTlaVmdwbEM=","upper_bound":"MzFxR2tKeXZUY3NNVkZDRmpiVFFDaThjZFhBenVpOU9reVlTdjBVejd1NjQ2SHJvbUQ5cTNodFZJVG5PdEFlV3Y4R25VcERvVjYxdDE0SFpmQVZWTFdyZ3FkSW1wMENFWjhCem5uZUNnSmJVNTNkMzFocDVnVHRCcHc3RTk5T0NmSVdJaGRpcEgyMFVIUzBla3BWVm0yTmtvUVVxcFZ1OUZ5VVNSdElOcngydzdJa21ORENWc0pIb2pLU0lxenpLMVFFNU44NDRrVHFMSmltUHpyS2ZLbDZ3QUMxVXhiNmVUckRaZ2RoMmM3MGROWERqV0U1RUYxY3pKZUp6aWdRb2lhaWRPeHpUSUExWlBwelB5N1hnN3BDWE8xMW5TNWVTUWtqalZHN01WMXh5cWlCSUNlUE45SzVFTjVNSjlVZmRyM2FWTzhNSGhJeU1KdU16QkFIRXFKQW05UDJGOVdIM3ZSZDhxQzV1TXR0bkdpMWVPdGh5VmZRU0tLMzRieGs4djhTcTVyc0c0Z3RuSHpPSXdsS2lqTXBEMGc2SGQ3S053RXRJeGpQNzRjclRjSnRiTDJOb3d1R3NZbURnMllJZ3MzUTRpM2hhQmZka0lxSERPUnptOVJGODhhOFZGa3pqRU9icFc2bWVEUzF1Qk5kb2hBdkFodkFZMg==","repeats":1},{"count":97,"lower_bound":"MzRoNGpaSFNCa3JwZTFrRTdwTlRCb0RoTFFmZFB4QU9UMmdNVThmWjZQM0VOY0FBeHVJY1F1Tlg4QmpoOGEwa0dTRk5QbTBwczlWS04wTTBoTnFydk1yOXo5SWZOOThyZTNHbVJnTjNORmI5M3NtUjhJRlIwd0hTQk15SU1iSGNqdTFqUml6RnVpV0t1OHd3QWpqUENBdTRsd1ZKQ1k0aDYwTEZTNlZxZmJGTUZySkQxQ0hETHc0Y05WY1V3NVNYRnFSenV5SHl5T2kzd1lzSnlGY1lsUGtWSWxoZVNsVG1YYkpXM2xqMmRVU1ZZZmtJeko4MTdnM1o2ZlRKTkhTTWM5ZEV3eVFIYUp5OURDcmtnR1hna2VkWWEzRXhpUEJDcUZ0WWk0WnZiTlFRVVM4YU9KTW5aeE50WmpNMkhBY21SODdhTEJReWlFNWJ0M0d1TlczdlBsOE10Z0hnMWZWOVVrRjc2NmVnbk9LSVd6OTJuZWN5MFpIU2JRaTFCemJJM2Z1TG14QjAzS2lhV1JBMEtQY25WSm9KVHF2ZE1heFhSVHdFWlpDV3Y2bko2blBtV0o3bHRsUWs0UE5rV1ExTTFFNno1NUNwOWhqaU9WM0VFNXdQUWRVS0VLMnpyNHBRQU5ud3dSUTRXZA==","upper_bound":"M0V2bXRmcXE1a1pCVGl4NzdzNHVvQjdxbENkMXBsMzZ3U1RiSEFNNHJFQVd3Qm9EZDhzd1Q1dlBCMUkzRWRoOFF1eXVXUnRCS1dKVlFpc2ExT2xBcjQ3cXJtSENvaXF1MWxGMDFLMHRGSHNPVEUxbTFKSkc4cGRyQjVMWGZMV2lGN3RFeDZhcnl6cEo1Qm41YmY2Z2FmQzhFNEkxMmQ1TmFxaWd5YmJLam1TSnJ6SDRsZm9pWE9VaDdqbzRITTJMZDhtSElNU1BWZUxrUkJ0d0htNnFnUXd5bzFpOUo5cmtRWGJBNDJnQ3ZXSTQyMm9aNjI3cVV3WVpvYnB1ODd6S1VHVkZCeDF2eFZodVRsVEdzWXRnaWdwMTJrcU1TSHBlRnNZSkY0d0F1bEdxNm9CSG1lNFR4Vm55OGVNaG5qOFBxNk9OZmpnTnl0bmFtSmluWXcxVjdLY3Nza0VleTBVbjZESG1LY05qU3RjWnlrTFhPZU8yOEJhajhiVGFKNUk5ZWtid0JMbGdVTlpvOHBpMGNyNw==","repeats":1},{"count":103,"lower_bound":"M0dnaEg0V21OUENtMWpFM3p1YWg0UVA1MVFpaDZHWW5wVmtjY1RmazhZUHF2TUtXeGdoZVUwaTNjSmVTWlhhUE80U3pNYjRYZWptOE9OMGVXY0ZrR0tmeEV2QkdwaG5uc1lRY3RkWFZ3dVM0OGRyOXdaNEZDWkVLM1kwTndZWXdqS21LTzk4SWFKRG5CVk1jcmdEcEpERmZTZFJuVVU2akRJc3VSQXpzcHJkWFd3aGdDV1owSXZodVNiY1VVa1FSdDRKc3VyR3B5VTJkb0luS2J4Ykk5OHZValVUWldKZmdoYjl6a2N1UE92Tjh2VGVPZFgwTDZsUm9pWlJ5WkxEbElpSnNRTXZYUTg2d1JpMWNSaFRldGlIT3huV3lhcW1kem9ldHU5eDRQNVVlclNLQ0lEZldIYjNUbXF5UDYzdVB5Y0lUUXo3T1NnWVdDOWltZkRRTElOdUVPNFEwcmRrbk5WZURZSzFZR3JtWFNFdmM0ZDBlRndrVWF2aVdYa0xYZkdlZWduaHg5WjQ4RWxKdllhMkx1bzNsTTF1UVVFbjBRMURaWU9sM3VsSHM0cTZ5aHRrOTZVWHVYZXdabHNuUURpSUlnZ2t4WUJUNG5hVnM2SFplQmtscEc1SU4xS2VLT1NvR1ZVMUwxZWphNmVBNmJja1FYd2Z0MA==","upper_bound":"M0lrUDVoSVl0WUlyeXNKVHBUZnlwZHo4UkE3MlFNcW5rdVNtbEhQZE1xbldWNHBBSVFwNDdWRXVQTXk5T0pibHFVWEhORlU3NkF4eXJlQUlRRklGRmQwMG01NGptWFJQaW9WbEJVVjFkOHRoMHJvaFM3WUU1OElGZjdNYmVBbk41MEFnRnI3N3ZTT0xFd1JaVVZXVnpJNTFtRnZLd3gxOGxFN0NNRFBiSXVLbW5vZVR1WFoxUE0wYVFJY3pVY3ZHc1d0UmJ5bVhucnRYWlZFVTljWkpkU2ZlOVZ2aWN0REVCT3lja2FwVk1CdjNFaXhPZkVET2NwVDhYZnVRR0FZcFoxNEtUUExTNDVtcE1qRUpLdlFlT0llZTBrWXpUd3lBbHYxT3lFaTV6a1ZGdll1SGJJcjc4Tmp2d01LMlZwczdQbFF4V1VtazduZ3VIVUZqU3F6V0lYZHNXU3V4MDBROWg=","repeats":1},{"count":109,"lower_bound":"M0p6T2pBVk41RVJjSEJBcDhWMU45bVFDU1N3d1Rxb1hiUkNHbkU3VmNEdzhObGVsdUF4aGZ2NXFHRWVyam1Ic0x1c1NjSzU0OHRVQ2NyRTZ1Z25jQnllRjFib1QxT05LT1FvVjlQTU5NdmNmYQ==","upper_bound":"M1pXbEx6cnlRR2dZRVNUd1NNYU1rQjRVdk82eFhGeGdBZmFFb3Q1MWxNU0MxNEJLTHhaWW1Za0VkNGN0NnZUTFB0aWk4NTd3WDlJUjZhUkNtcFBtTEp6NWdBbERhMEowYTdjSEVxUUJSVlV1RGVnNmhqNTlIZUQ3SVRVVW52QXl6SWNNemtkNWR2d0VLNkpWYWJnU0ZkS0ZmUFc=","repeats":1},{"count":115,"lower_bound":"M2Fwc1puZEtLUG9GVEo2WlNsOEtmM3NlUFlIMFhhd2dRVURWaXY0MThTU0xqdlNpc0RmQjAwUmFPM1RTeE1ISzlJZ1FXbzdCN09yaXRpMFBPYklaRUt6WnZlYVRLcURrU3lKdkF4NkdaMGVMdXBXS3lmaUpWaXpqVTdXTzF3N0pkU1RsQWM1c2tzekNUbVFoZ2R0aERVUzgzU0FhUzRranRqWnBYenZhWk9CT3pET0s0cTdiNWMxQzZpMDBIVk1VbnQxRFZUUXc5SFI1M1YzSm1xdHJ3bXV6c3RvMGpSY01HSjlQb3FIU1NRNXNjZXFScHFQdlFtT0lBYVNqZ0xnNFprS3hoT1J5SkZOWFJpa3JXbmFjTXR2U1pkQkNvQ2x1TUFaN2wwUnR3WEh0U1dQMnhQN2VPbDVtUG5tVE05SGxQZXJhc2hSeDMxbnlQVjRIY0N4QmVPbU1BMDlGa3djNHJFN0tWcWZVMkYxaWNObno4MUFlNDNxc0JUNHJKZm1SV0ZHWmlsV3lWUXNubjVXSTdNSlo0N1VXaHVEZjNoTzJLTDRXQ2ZoY1ZRUjIwNTIwRjJEckV3RmpQNkxTeWhMY2dqcjIwMVl4VlJpUHRKOHF0bzZ4dnRydDRiU3hvOWFwcGxpeHRwSVJ5","upper_bound":"M2NpWU45RTV5dkhSQzdLTzhNOG1SYkVRZWFRTkFYM3BZSEVoZkFUdk1ZTzJDUFJtS0hXR1VOS1RibUVJSXZhVWNCMFE2SGdTRnphQUlES3g0OWFrNjNPYXNadVF6Y0JNUkFXQ3FiVFNJOEVTT0p0RDBQS1RCNno0SnMxaWYydFN3Y2ZuQlBPdVhSRjVhUTJBeG9QMExucTZrSktQRGQxb2ZhN1k4THNSVVVEYXVxd0hNNHRoa2xsUVA2emtoY2dJZWtzQ2V4TjJaYW9RWlZtbDJLcGxxeDBJVTNOd1JSWWlZcUFLaTZ5U2V6YXlhR1ZpaTc0MVdtNkU2QlhuV3FOVjVieElodkNydjRwTWhhWU41TzhlNDExVW9vbHBkT2tLcHVBQlJaWnNpbXBVU0MxcFBnRDM1T1JISW9Hd1FSNVJ1WWNnNE9jSHJleGNncEdqZ2xONQ==","repeats":1},{"count":121,"lower_bound":"M2p3U0NJdjg1ZGhldGVqeGM2YTNuQ3Fkb2dSdFVFR2VCYjZIbE42T1R1REdkU013cjk5R3Y0ekh6Q1VKQkgzZGhuTzU5Rk03enlQd1NDdWlUNnZydlM5ZWlSZzhUWDMxNTlrTE1VSHZUOUl2ckROeEU2ZFVqblZYREc0MzFuYWdHWkRUYnBYZEJnczE4RUVUVkRzQTVlOHJIb25wWENLTUUxVlluQzVoamlMcEhJdDBJOGtPZHd2NHUyZUtDeWtHTFlDcnlrbzZiZ3dpalAzd0c5bGNHbWJGRXdMbDRrUk5XMjJ3TGZnc3VCbUtXOU94dVZiSUFXUk9HOVJWeUNueEgzMFhxdHRoYWY4UnBGdHZBWHppSTJWVll5V1FkOHZYTEg=","upper_bound":"M29WM2dRRDA5cXdFS3l0cUhkT1k0UGpSajNiWWplbG1jY05MSVRuMGVaVlpwTGhXbG9rd1Q1WU5pWTFCOXpwQVA5MjdDcEdFRWFQSng1bEVuRmR0d3dXWkpqMlhuQ3Z0Q3JoVXJkRFpUbTVRS0xkOE1yVmNhZktEMHdhMEVMcmd0TFFiU01XU0tQbEQ1aTJJdnB6Mk5sdzdwWDlXVVZtVUI3MGlRVktpTWg4NHJUVFdOZFRJUE4zSWNMU3BnM3VjRzVKOGR3VzZwUVgwRzJ4STFMUEgyUFpYdDQwZGllMkc1Y0FVeGM2QTBKQlJ1cUxjQ2xZdzFXSTlKVUw2cUtwNlQ4Z3l0VnBra2ZnanBRTER3czlHRHlVWkt3d3NWWEx5cXc5SlE1VnNGVEFGbDg5cUdUbGY3aW5tWjdMa1VhU0hyVHVMYzlPTjRYS0haZnU2eFBsUHlSZHZ3N3d1RzNGMkNQOVp1MnN0U29MaXJsSmVIRE01R1RDWGp5YXFsZGtTNlIyYWtGVGYwTDZMNENyWDRBWkdVTHJQMnlnS1l4SEhRTnZGRno4NzZpUENxeUNORlRXejdxM3NtckliZUQxSWxBTEw2TlJZaFREYTRuSzBiUDJzQWVBM0lCQmp2UFQxVE9FNzlobkdMOHFES2ZweDNYVjF5Q2lDN0J3bQ==","repeats":1},{"count":127,"lower_bound":"M3BGWHJiUlhlSFo2emladmhoZUNveDNLZUppc25mTFBQODQ3VGpiV3JPdWR5SXpDU3lrNEJteVFYRWtyQlZaWTRFb0t2RHpKVkhScUJyOE5rQndXcDJST0hrTkIwWk0zTUVhMUVnTjBJbmRyVXlpTkF1c1JpUTlzT05XUkRJaUJRTmRkRlR6clM0WjZJRDJYNTgyY1Rnclh3dko5WE1WWXRZY1l4WG5xckk1VU9XRWZYOVFLQWVJb2pFS2FZNUFieGVJR0RXVzlERERGTFJwMlJMZmNjemowVXBQUTJOUkxPdEtZaUx4QjNoY1RyV2pzaVNHSHdEM1pKdkNtSE5DWnpxOUFXYURXZFZ4Y1RHMWZlTk5xRHhiNFRsbWpvNW1kSlFvbFB1bHdwRXhnWmZVaE5LUERXWlIyNkhMakZGNm10YzkzNHByRzJMbDQ0eTNMVDJrVmxMT0ZBWkhzNkR6RDgydDk4WXdGNkVrbXpUOERBcTYxQ0hiRUVNOEVaTXJpZjNzRXJ3UW5iNHNmQkEwQmtsUmwxd1hrZ1NRMk1WVGx6MUFBdXBNZmhLYm9EOUk=","upper_bound":"M3dudFB4UXBpRUZ2RDNDM3RFdDlTczZTcG1meXdlSHdXQnFnVFBKTVYwMm9jWnVYanFyaHREMzNqYUl5RUtOakx4MEIyMjBkZkNQdlVRN01qVU9RNXI4bktqam9MTjMwaFRPMXFsVGJNdXp0VUQ4aVV1N1pjY3FxdjZSTUU0TFZVV2IxR0pHZ1pzTEJ5RjVUcFJjMVBiaUpRMGQwVzBXaFBYZUZudFVZUHFhSTNxTk9INHB6MExyWjlXSmFsWm5DZTUzZVpuaEdPbFBianNvMUg5eXZqVFdyUHpIbzQwYXFQbU1FU3RrN0NuT09hQk45QW8xTVNrYkpnUlZ2anEwNVVpdVFJMFp6cERNcGNCRnNFQXBOQUVTcEI2MXN6blplbHpoM3ozUjZIdGgwazM0RFNJbTgwTE8yUWpidzY3bFdJajFlZzFOWTBjV2h3eHE5RFk3SVpzN01jUGU2RDNGSEUydGZRU29WTmF0Qm5NemFjRzdQQ1E3VHJCR0pCVXk0UjR0ZnpTaXR1Q1cyQ0dWVU10VWNWZzYybjhDU1R2VUQyd1RMclFrOHNiUUpJaTJha3NkTw==","repeats":1},{"count":133,"lower_bound":"M3hEOWE0c2QzU0dpTXp4NjJtOHlUdHVWNmFiRHh0ekxiSlhCMVhScW05eUk0SW5TdFZqTlhqUENnODc1VmI3WndaOG9IcDNqQXdHcURHZ2lCaVRLTFdLbEVKcVZEQkpWWHB4VXFRdmljeGVHakNNVklENkFzMFlPSFVyNzRiVmplS0dVMDkzdEV3bGdLRVZXZ3FGR3NCR3FPeGd6U0p4TEhLeW1iWnZDOGxiUEhwb25aU0g1VkEzTkpDWU8z","upper_bound":"NEFCSGVBWE5EVkRQa21PZ1k3Tzd4YmdGbUhtQUJGS0F1eW14N2VvMWFJNk8wUEFWNElDSGpmVjR4d2NseE9vSWhqVWRIc2VqOWJwV0pXNzBuc2tFdg==","repeats":1},{"count":139,"lower_bound":"NEFvdXphd04zSFBObFg5UktmNUNVenZtWlp3T2FQZFBtdmpsZmJRdDBZcnNqdkphRmpBWjVTVzY5cmZIUXlVYWVaSnp6cklHQjdjd2pxUGl0U2lRbG84UlY0UlU1MVBMU2NrZFNndEhDWDVvZ2E3YlR3Q0FLeXZwRGg1bg==","upper_bound":"NENLM2dWamZkcGhlMW9UcXpCRXpNRkZRYUFCeVR0SEw1SDh2Wks0TGlDODhtUFJiVWtKSGlEUG9vUzZ4MjUyRjBXYnJtR1NKcDZYZDJGS01NVll2SnFMcG45Z2JTOG5Xa2U0bnVTajVtNzcwM0hSMUprN3RmY1VVNzgyUnI0MXVMdFo2Rm1pV2lORVRpdVBCSkxacEFjSEp4cEhXOG1JSWFFQkwzUlZBcWtNWlVLcmtxbnRqS2ZtSFEyZllIZVZJbWdNakVOVk1IVWtwck9HcDUydlhVd0lpM0JKSU93VWtKdWtXdE9FWHl1blZhNEJ2Znc3Mmk4STB6MjRtZTUzUWxoaFVRbERIRw==","repeats":1},{"count":145,"lower_bound":"NEh3VXR4UVVlODBNQ2l2aVVYYkZrQm5IdUJyZDA1TktMQkp4aUl4R20zcmhESm9JVVk2aXFTaUtWRFRjRXNWZzd5d2dHb3JQTUQ0Nzk5aGVQd2YxQ2RmYUdrUjVJbjhrR0htYVNkdnJtbVBLbVRyMXdHTFl6UXdZSGdBUXR3ZFlFbHFsTHJvVFN3bVZ6U2JWemZySXlxRlJFTVNDZ1h4cW9VWkphQ3JLWWZnUllueWpIQTkzS2xIRWd1NGlUVEFGZU1wUDBYR1NxeDZUQkk2NUlPNjhrdE5KM2JENzRYZkhiVm1CRjF0eE9taW1yejdkaHNablFDbUUzaURnQW1PUlc5YTZmSXRzMQ==","upper_bound":"NE5WbmhMYjU5Wnkwb0Z6dmt2SmYyOTZsaFlwSVRzOE5NNXZJeTJvTWxtUUxDNk5uNG9mTjMzeGFwVTlTVjZvbHF2ZHJGbEV3ZXZhN2RXNzNpdGpOS2l0UnBaZmZIanoxRTAwc1BMdThnYXVCVFZFM2pVV1Q2M1E3MDBzNXE2V2UxNEFBWjhQdzA3Y1BvcVpvTFRPaXJqMVpSZEVlbG50MkgwaUJHa1h6OHNCYjBBM1RRTXBNMUJ3RnFMekNCNjlOREQ1ZG94Q0FHc2xGTHZCTzI0MTMwdnVPQWxIN2RIeVZJb2xJTTNacUpnTUJ6Nmh0dnh2OFJrOFhGQm13eVVmeWRSUzdlWFM3M2drS29qcG82NnB3Mmx0dlFMTkRUYmw1UkxxMDVuSnNqcGx2WnVvQ0FIMVJCSGJxQjJoc1RuN1d6NEJObEREWW1RSXpHcnRuVkljVlV5ZG5WaE1vYnF2b29mYU1jc0ZKN2lSYXphV2hjSnZFMGdqY3hBWVhJbGc4RDJBZjhGdzZmMXhGSA==","repeats":1},{"count":151,"lower_bound":"NE81SkI=","upper_bound":"NFpZaFl2c0tpWkZzekhCdVZtQjZpZmpDaXFHZ2NBTVZTNTNaVE45bnNnVkJHRUxaaE4ycm1kTU5LR2U4TmdXVVRaYzF1QmEyS1U3eVg2c0MycFdxcE1kZXZ6T2piYVBnbWNRbTREbVFRUG4zbWtEekg4TFpYbzhwaENLUW5XZmJZS21xbXJZRmR2WTJEY0RramRvQVBrdm5TZEFhblhFdGx4aUZ6WTFRWWRLeFRDUjlZOXN2M0QyZEhWTDRmakNoNHk1Tm55am9mOGVKSlJnMUZQdEJNbkF1OWNuR1Q0ZEtMdW1pZENOR3BpeUM5NUJjdEM4dlY=","repeats":1},{"count":157,"lower_bound":"NGFHYmRBdDFxZzZBZW1kT25UMDB6c2t2MlprR3RZTG9jckZxNU5ncUdaNGhQTU03T3FTQWozQlF6cGtCeU1DRlZ0Yk9qRDZzR1RMUzZSeEt1aHlpOW1sRHFDR1dGMU1hTVBFbHlOR2RMQzVYanZGR1V5aHFodlI2d3JmaWJuNGhka3Zva1FPc0o2aDA4dzhCN3d2YWVYUGNpTUxia1NnOVRvc2RmeFpoaGZiNWYxUHc3cXZwUDBmcE1qam93RndMS1psSDQzNzlHcFJrdDF2cnhkQ012cjFJTmNVRjFtelJyMnNEcllyaFVlYk5TaVA3dlJKTVYwUE1YWXl5c0tZeTUyajRtUERWeWdYSFBKS1N2cTJ1aTdBUmdZVFNjaDREVHJ1UWxKQ3RQZzJDVFBKZDM3T2pycGhqMzVMSkZmbHo=","upper_bound":"NGRKbll1dm5xVWdYYkI5d0FrWGk0QjE1NGpZQVRVZ3RETUdqTnk0QWwxUUFGbGxkaFpLbllDQjViRUdMV253Z2N2YUFBYXF0S2Robno0TnVuZm1LVm9ROVZNT0kyZ2tHdmNUMFQwTGFRb016YVE0Qzc4UW1Pa3Z0VG9jb2hyYWJCWTBzTEJPS2NnS0JjRXI2ZGdtTWxVQUZUTDZ4anpwMER4emRvSFp6WXJRa1FSbGd4UnVmMTMwbU9RRkpGRWpVcVd5UTNzS04zbkRtNTU1Yk90VDFxRmt6cU5QY1Mzb1V3eWJYd25IemdXbXU0R0Iwck9rTmxGUHJtY0VPUnR2UnBBY1R6N1k2QnhEaXpPM3RnSnZrTWg4eFZxNjIzSklxdHNTWEFqTFptYUZJUGl3ZlpMdjZqUkhESTdxWFdETkIzWUQ5QjV4OExNME90NXNxRHFoV3BTbmxvTzVaczJCWTZDVW91R1hWWWhCQnE2bUpZZ2JVR2xNbW1ZTEFka293Z2NqZUcyWWVlN2lSbkcybHkxUDBCaw==","repeats":1},{"count":163,"lower_bound":"NG1xUGFKNkVYZ1lOTW8zUjVxY0xsNFNTY2dsc3VMZktjd05md0dPSGR3T0NQSFF3ckJEZ1JFc1ZSVzduTEQwNEJySmx2ZkU5Z3RoSGpsZ1VhV2t2NktNN0NkVm42NHhOYTlhUU8weUtHTkM5dnduR3F2NW5nUUo3dW5YZFJ1bE5RNE5QeHNoV2FidllLWkd4UHI1dDV1WnlONHFVd1lKQTgyMU1uazYwMmt0UVlTc3ZCWXV1bE05czRBTXRuZmdhSmY4cmlhV0x5YWNYdU9jS0xOVnVIWGFTWUttdlhINk40RVFlbjYwQTViN1I0a2RlNlN6aXl0TW0wQlZCdGp5TllsWHVNcTRMS2wxb0xkd21pQmRBTkRMOGgyYlN0eTAxNDBIUEJMdUJ1a0pja2RVR3JiTkxIVWJhZHE1eHNwSnJDRVAyWHowVFhKSnMyZ1l5ZERQZFJVcEJQUENCbG9VU2tVVkdBNUUxTjdiN0VVS3oxNnhLcmFqcDhIRndkdGdpNURyd0VyNjF2REJaVVZNQk5HZHd3N3lPeGJ3VzVidUI=","upper_bound":"NHRCd0I3UFhsaHMyVlBNQnJ5UTBnempISg==","repeats":1},{"count":169,"lower_bound":"NHRtYTRGWmtUNEhWQ2gwcEh0aElPMm9rNjJON05DT1FmN3FzR3BSaHphakN4SVpmeHdQUUNiUjVlN1htT00xVDJDR2hOMGVaSXF1dUlocnA2bUdsMDJsdWpJVjlJYnB5bDVRZVh5NHVvVDRRYjNpMUI3RVF5TkFPUHcyaldabmQzVGRKV2pESGZuSWpvTlJGaGRSU09hVkdTbWVQd3BmN21vSWJtNllLT1U2eE1ocGNBa01wVVY3S24xSTh3OW9UTVBrUmFlTXVzTDJVZHRvSzV6V3gxM3FnVFVKc1dPOTl2RXI5ak5pa3ExMzRRNmxwZ2VqUkRHQ0tobFBoM3BKTjNWUGRwZml6MjJCWWpNbDJCY3ZhcU9Pa1lONjc0T0ZiTkpoQXZFeEZwSFd4UFNLMEdUQm5YS0lLODA3WURJMGg3UkpXcnZUSHdMUGVJaHcyOWZVcWJuSlNzQWV4Uk9BT2RlYkJ5UHh4d0x4WnJHanRKM3NhMVpn","upper_bound":"NHhNc01idlZod3RMcklHOFhybnVhOEJYT2N1VDdpNTVrbmEzZzVwQmlRNXhralNrZTFTT2IzbkVHcVFzdEFLSWk1UWhlU3o5TFIxMHFXUHJ3WGllbENhRkNRelJmdk5TWWZMZmRtRzl5bFlIWGlVRzF0UVRzSUhY","repeats":1},{"count":175,"lower_bound":"NHhlOWNUUzJpTmlPNXN4aGlIWGVRNDh5dUZ4ajdjbEZGNE1wUmpOZHhWdm4xbjY0N0xzSll2blF3dm9EYWdnbnlhdzcyd2ZyQVNVRHZFYzF4WEhMdzJkZXRkMTludzJFQXdUWmRYRzVTZDJ2b2lGQlMxdTB1ZmhNT2ZWTkZWaFZ6ZUdvVDh2UzNoM2R4UXFNQU9aVzBGOHFtQlpUTlhhZnQwbG5TSDg0OFNyQlhYVFl3Uk9PMnpXdDJyeWh4aDlZY1h0VU4xdldsWmQzajkwWG5kZlJ3WHRRbkNaUFZjbHIwN0w5YlJQWGNOTWx6cWJkSk16cXI5RHl1T2Y0cTc5aTg5YzFubnRrQmN1a1g3eVRRYno2SjBDMjF5NGxwWXJNTTBUU2E5c0k4UUl4RktvVnFoVGxVdW5VV2h5U1hkeXJsVzE=","upper_bound":"NTlaUmgyWGs0eWRlNHdvbVFoVXpDcjV6Uk4xQmI0Nk9LdDhSZnplQjJobFRaeFdLVmNEWWNHOHU0amIwZ1Q5WjBCQTh1SGVGTG5mbWo=","repeats":1},{"count":181,"lower_bound":"NUN3S0VwQWtIUHhvT1c2ek50WXVSQ0JYWXVUS3NHR3NVTTJiYkJjQjRXTktsS1VLWndXTTB4VW55Yk9TMnFPWlFyN21rOWNka3cwOTYxYzIxSFpxdEloVUh4Mklna2tWbEFTY2RJRUtPU0NKQnpxeHdNWVY2RWpudVlkTVdyRGpoeldpc2RJUnp3bDJScHNSb0dJeE1HbmZiV2thV2lXckNuZnpjdTFTWGlHeUVkOFRPOUpGWk9wTm5zdFIwSW1KQmxaaUpmNktYcG9XNWZtMkpJZlRuaTRBYWNJT0pHYjBYVFZDOFVKd1FldDFN","upper_bound":"NU5tRjltZVlrbHJoN04zSmUxUktDZXR6SEpuNUJrTFdkNWFvMXhhS2NNdVZEMTVRSzBKc1NsMHBKQjlRZElaRVIwQWZWWUFmdHNjMjZSd1lQcXlackFFRWVOc3VOd1FmMzVKeTU0MGRxSEpSclNycHpiMkxrdldkc2hBRUw3MUpUTXFlNTZTbUxaZ3lzR2FyZGhLWlhNSGJBOUZkWThoVjd3RFBKc3lnZVlmbm00MkVMRFROaUhMMm5OTzdIUnRmejVGTDFrOVNoaQ==","repeats":1},{"count":187,"lower_bound":"NVFsVXhRZFpoYjlnYjZuNWlHblBoUlFRZHJaZ1c0WlZ4MUZKc09ydTBpYm1CenNMa3N3TUJQU24ybnd4dVhUVHczMjI5RUJiaTExcEI2SlhDb2JNWk9NSUFCaXV3NWMyOW41MFJhM1BnYkdSNlBtdDRqaXUza2JsVTlpbHV0NFhZSjVTcnNUZ0xTWkFUeDJVc1dMMTM5OFk4OG9FNXB3S3ZHZFlUNG1GRFhYM1RrZU9xMlM3NlN3dXFLTlFYT3BJYVU3YkI4WkZManFwM0o4Q2JBWXZONE12QktNUXo1ODBaRjJRODhUNVZYN09pbFNYd2hzRmkwNXFKR0o2c25xajFGdUdwdkZ3aDd0c2hDc2pBRHNUbWhobVAxeG9WTmtUcDk0TG42dGU2WU1aZG5jOGcwV0VtNmlWdWllZkY1aHFGcmZ6MGEzR0tQSkVLY3BsNmpFTUhDNW0wOHIwQjFjelZvQ2NLN201NkdVZGMwV2FnWHVIbzlUWExrSWdJUjZGV0w1RGphUU1obkZTVXZKbWhSclJtYnRCT1Nnc1cwZGt5eWZPNnh2alh5Z0ZDcUE2a1pMZDRhTDNmMFNIb20xYW5xRjExdUlOWFFybTUycjFwMW5weEJiZ0ZBTDNxa0MzQWxpd2MzMkJ5bG8zZmozMHBpdjBMMDZQUU5DdEJDcW5oSHVTaVJGemUxNlJTQXFWR05JUnEzNA==","upper_bound":"NVRqcXA2M05udmNram5DNlMwRVdxelQyRjRGakNLa3ZNRko1dkRtYzZoWjFvNVN6TGRmbGthSEFaRjhZc0JzM3oyNjB3TzByZ2FOcVJKeHpwZVNGYkFvZ0xNaEpiTG82M29YdlJzYUtkTjd4QzZBTWRCUFZQTXA=","repeats":1},{"count":193,"lower_bound":"NVdteDRKWnYyZXBIRTFRbkhOeENqUnFMSWp0MHRWQWxnbGF5QnJ5UXJHRjZuRUptNWhnU2NqRnZabDJWY253VHJRSXo4ajZiSEhIZlF6dkJSS3dZeFhJWjVCQnhRZDh1c0d6cVF3THpiaEhJR09wZlRLdWNpOUYwQUtUSmlTYzV4b2RnNXV0UkxGMldVUkFKU09rVWROYkNBZzNyYWUwVDJBNjg3TXRDWElBVEQ3U0lNRDc5aXlaRmpkTzZEMkpaV2VCaWM3MUswWE9xeUhPTkZER0p4c0JDMHFKSGI4ZllBaXVoNk91S2dxRGlRTWRDYTJTdFczV2dxbkRUSlpNamoxbllNbnFaU3A=","upper_bound":"NWRSWmpWYk02bnlZbEZWYTB4TWJWSm13eFlEcHgyNzJrZnpWWVVhN2hVSk5Qb2hEVFcyUlFCTHY=","repeats":1},{"count":199,"lower_bound":"NWVVeXZlRG5zUThLNmxFdTl0Y1J0TE1qdVNFdVJlRkZVbkpFVnhuVnBzcFg5YkhKdDVsWWRBVjJJWFlKR2hSdE5Lcjd3VG9JbWdqYW0yOFl5TWdmQjZ3MVBrNGRFZQ==","upper_bound":"NW1zTWhnZ25IV3VWOGtCbnNmR1FPejN6eHFTUDJ1dXFTSjloMkRYSW1XTGZKU0ZzMnlQUnF5WGZuY3Bta012aW82c0RibHk5bXlFUjVrVTlzSFAwVzNkMktHQzRqbG44R1EwcjhWdjNPc3MxRmtOU3E2M2RVd2IzaUJwM1JXTVdOd0pFZGEwYjhrcWxpb0RZZVNEd1RHN25uY0dWZ2Y3MG9pV1NXZmwzY2hqZm40T0lwT3NKVmZmM2x2RzVFbUJnYVVoN0dScUppelF6eG1GeVdWU1o2U01ROHBMVFd3SjNPcDNmd3FWaEtwbUJZUFNOSGYyY0hURHFaeGoyVUxYelhqeFpWZHNiQWhBM3NRVEJ1UVVnaTRhM1BYbVNUVUZVNVBHVkNiTXFCS3VNWUx4STQwZ0p0QVlzOWpMcUhjNnJSQkRRM1k5OWwzcHZZODlnTzFhbE4=","repeats":1},{"count":205,"lower_bound":"NXJFR1p3WmlpVmh6VDJWRGVvN0dwMjVhSmF3UExwRkxxMjk4SUs2OXp0RmNMb3Zoano4bkFlcU1FRzFTUjRRc3VxblBOem1ISFdOZURIT3A4UmhYVzdWNkpKdElWQlExbWZwemMwWG82Uk5kbXVJdmF5MURiTmM0NXpLaHlNYURXdlR0UkQ1RjZKREoyTWFjclBSbHF0TFFCc0FUQUpuOFEyamZuckRnT0pm","upper_bound":"NXNFR245dzFhbDExS0xZdkpoVjVDT2VyZDJPT0F6czY2SEZmTUFRQ0VtaElOVHhjUnhOVlh0YklxUW1odmlXWmFnVWJURjNDSG4xdmlKUEUxZjJLNjhqbTY1ZUVaNEwzZVUyWTRpWXdBVUY4YWtJUnNqNVJWTjFzSzgyN1hJUW82VDA2Q3BaejhMQ1QyVGYzM0RiS2lqbVV4ZHRQMldZcHQyVjBUWm9ocmFiZjRzSEVsb3E1eHNmdHZBejRwNVp5Z0tYaGV0czdlZUdDUVVNbUIxUGdSRkZOT0gzMFVnbzRVNzFsVGU0UmRlbnpyZGNNb0tCd0VhbW1zc01Tbkx5aW93N3Ntenp0MU83SVNxRnIzczJXZXl2MUxzam5iTUtMR2F1dDhBR01JMXFiTlpqZ1FuUjllTFJ6RUVWaEZRZmFoS3IzRw==","repeats":1},{"count":211,"lower_bound":"NXltT3ZDU3duM2FIcFZpaFdlTFFIajlzYU5OS3Z3Q3lCc2FRSEk0SmJodWpOT1l0dzcxR3E5aFBkNloyT0RZdmNxQUdJMllnVnNOd2IxQ3BtcDcxWmtYUzlTS3Y1U2VPNm5PTmI0YXJYRWI2eEFYSlFLRTZhVjZjZnhiejZlWUQ3N2xrWld5MHZpREpWZjVIbjkzZFA1TVZ4VnZXVXNhYjJGdGxPU2tSQ29EMlg0NmJMWmZzUmpVVVplQTNzVEZEdFZFMURNcjRKd1BLcXZ1cjUwdWpiMkpDU2N0M21Ya2dvV29yR1lmRkpZanFUNHhhZFFkS2dhQkVKeHlTSEVKbHdweXBFMzQ2YThKTjdIbXl3emtkUFNkaXB4MXVhWkVtTm45eHpwWnJRbTlycXcxUlJlVE1aejVLSU5pZ2dPU2FnOUhWV0hTTTdMWnVldUZnUUppcnJLUXRmNFd2MWRIbXJadFEwTndmNTR1b2lMa013YzJ4M0NLcWFvTjZGTEF2RE5CbUF2SzFTdjNRaTRuSnRpTXZsVlJtTjZyN2lpYk92UzY1a3lnUkM0VUx4U3ZScVdTeEczVlhkdXpnNmRJcmhJUA==","upper_bound":"NjNFemRFYnNZTzV3VmVsTDVJVUpvQnZnOWt2a1dQdEZka3ZPRjdRQkUySTFKcExRQTdiUFU3RnJQbk1UZ2JaUnZJUEtLZktpN1pNZW5IVk5wRjhpUE0xNWc1T2xKR200MTJBTmwzT3dmclc0aGhXbjlBZ0sxaFdnanVnRk9LT1h2R3JQblhWTEROQjl3Yk15Wjk4N3EyZWtjOHdLNjFUcE9KY1VhTHVKU1NPcjZ4dTAxeGpEeWo0Z1g3WEtBeVZVM2ZtVG1BOWtr","repeats":1},{"count":217,"lower_bound":"NjNPVmp5UXVNdnpscGhrSGJhdERFOXZLRkVFdll6UXFYUEs2SXozUzN3d2RyMHVaSEpMRzZuZVo2ZFhrVk5BWUxqUXpUQllBd0lFR0ZFQ2RkZ3ZNWGpFMlg0SkRjR0Z2YkozNkNEY3l3dHExR0tpRTJJQUllYllTUTB3TURwMTNZR01tcVRtclZxNXk2TXU4THpsUnBDNWpMQnpBeTdBNmFzODZNVHNZeUlUb1BBcWxiU3VrcHpQUTVaNHRqeWNIMGF2WQ==","upper_bound":"NkRncDY0RXpSRHRpRGNVaHJ2SjY1b1o0eTFmbDQ0d05zcHNyMWZqQWpGdlR6UUtMbXJaUmRsd3ptakx0VnlIMmdhRGpVTDYyNWRTdW9TWnh5eWF5OEdFaGlnbWphY0hlS3VyRmlPWHlCczNhSVlLSVdEdFJwRGNK","repeats":1},{"count":223,"lower_bound":"NkdzcXYwc2ZHa0VwcUpReE9RQnlJeHcySkNsRWFSWXRIU1Fmb2I4ZGRCRHNUa2xTZWVvYkdYSlM0eTVXa3E1WTg1Y1NKMU96ZTBwejl6Q1dwUW00R0NBTkxPdVFvTWl5Umk0VUVBcHZHOUhZZ05ITWkybE1mR0JnbTR1YmF1eXhtcW1ONDIyTlV0RmRITVY4c1ZVQ2Z1WUtSQzJBM0xXZXVHNEZjazRkZHF5UDBhNDN0Znp1NXNMRE8xTnV4OWNkRXBkdkNTM1U3SHR3ckJNZlZteHlGc24zajBQVkw4Y2tpQjExQkFESQ==","upper_bound":"NkttaU5ITlRnYmRwaUZGdWRIdzAxbzlJMDVuRGF1YngyS2lVdnVQSmZvRTdRYUNDanhuRWxIV2hWb2JmZ3ZpWUwwc0VMU3NSTno0WEwxS0Ewb1ZYSWNIaDBBT0p3RkNCRDhrOGE0dGtualpjUzlDWGp4V1VwNmdiT0t3QWRHUllDWUdsNTlleHd6Z081NUxCVmhORGNDRFZRcGp1OUhjMGdCM05WUkVhbzVaZzZjc1cxU016V0w3MTJTNEE3N0wyWXRMVWFvcmk4bmJOZU5STzFxSUU1RWtpN3lvTWRZbnVOdm1sZDZBRUtYSXYzUDB6SlpveTE3NlpmTnJjMnhJS005bU5uekEySFlNWXl3S25XYldFWkQwdkhhQ0pZUDZDbjFQV3ZHbWFkRXVsenN1b2o3SXB5Q3JPZ3JsOVk3QUhvc21jcUNjTkpzY3pDVHZlSkp3cUZPaXpJN05zYm1UMTNpY0FZcjA2VDROQmVJck9NTzl3M2lnN3Rpa1ZJMzVtVA==","repeats":1},{"count":229,"lower_bound":"NlRiMXRTSHhDd3Z0QTd2RlM2cEYxenBBWmZYUUV3UG5wREtUak1VRW1paklqbEpDaDdtUlN2aVoxemR0NkRlcWtHVUZzMkN4aGVwenFUNzcxMzlrenZGRU1mMlRNT0lqRVlLdFM5bVIxdTc5TXFQbWNNUUtZb0NkZlVlc01Xem9UUWhaQQ==","upper_bound":"NlVzVzZXNnUxZTdGWTdUQnp6ZkZlTnBvUDVKd3RETUVNek85Tk5EQVl6WEgyRGtUVFNvdmNzZTFUZHlWUXZWUWI0aVQ5NWtDZUNZYWw2dGt0NEtuRkozOTdUU2VMemdlb05OTVdlb1M4SUpyTG1tZmZMVGxHQXpVdmdmVEt0SGhzOWFqVnJNenN2VnRlUXk4U2hleWJQc041cFJ2eEsxRGpLcjZ6a0xEYWY3TngwZUpJSVdqelA1b2taRFlZSjYxeGpKTVlwa1VKeG9oTW95SUVlNWVPc0lxWVBFZlppMlhwVUlpeXpSVzNqU1JsWW1rZFJVRlIyc3VhZno0QXJyaXNzRVU5U1FyWUZ6SkZxVXlpQXZydUQ3dDkyTUZWT0M1VUR1Yk11dG82T01YMDRGdlExZWYyekdDVU11dHNWa0JwaFZRMFJ6Q2tTUTFGbW1ZOVRmMGJobGJPOVkyVmVXcjBjaldFTEd1dXhzRXRyTWtLc0NoMVc2MnN1QlJLMmVJTTVyWmlQNGRzM0Y4TjV1eXNkRldzUDNKRHl5OUlTczNKVDE=","repeats":1},{"count":235,"lower_bound":"NlkwbHVMV3BxUXlYZzB2MHNMelo4bTNjOWc0b3RsMUNUSmJTaTlQY3BGZ3VuR2JpTW5uQk5rN1R0cXRHanFHd252Q0w2N1l0amJLVlBXTjNDMHRsWXdSZ0NjaEVIM0hSRTBQOU5jMzhaVUFzVGNSZGVXWlRkd1V6SjBpRXVVR25sY1dhTERFdnI1ZlFvc1BVdWZXNUFSYWxyd082TG1TRFNUWk1ESWplMDhmbW5HSTNUVUdMcU1ZdWlkekI4d1hkTld1dTAwZTAxdk5WZTh6M1dOZ3cyWndRMGJMQ0dHVngzQXFSQ2xWd0YzT3Fvc0NpQkFFZGNZbDlic3ZGQ3JjbUtnaHlkS01OUHpOZFB2TjBaQ2hjSXhqNnE4OHVFQ3ZKc0R6dE9QcFprazl1ejV6VzFxdm9hMld1RzJ4UzFsMlhkaE5ZWW5ad1BBOTJZdElpVzRIb3NWc2ZDbXZQSEloZlM1OHJ0cjFlZVZiRHFlNHBERzl6b2JpRWVreUoxamxxSjVocXpiMXB3UTNGN0NsT3NTQ1ZhVHFQS21EMzNBdWtBSk5IdHVPSnFxdzJJMXZmSGxTd0dGV3p2cFlkMFlwTmx3YzJWM2g4NldPb21KWFRTRU5iMHcxVExhOEhGRm5CUWRTbUozT3NaZkI0eUQ=","upper_bound":"NmV1d2kxSExzMVhHdDBaWTZhOWRZWXk1UW1VZXJwV2hnb0FxNU8yZkkxdzdDSGFFN2ZCT1Y5Zk5weFczNm40b0VSSnR3VkhmVzZLd08yR3I0MWg=","repeats":1},{"count":241,"lower_bound":"NmpFa1N4UUdIVk8yc3NSWGJvdG5Nb3NYcm5tMHpRN3dXZEE2U3VRWWNVNXF5SmNlVFFuRkFjME1aNUZ0UnZmaWlBSVQ1dzVqanpMSDBReVk2dEhwV1lwQjg1U0xIY2lOV0FuR1hXeVdacEpXdGx6c2dMT2tTbmV1MDdSNXg2ZFBJUzlXVGFFelA0dWhPTmtueHNOVUFrV0hyOE52QjdxOWRhSHBjQVp3V1Y5MllmQWhTWjA3SzRacjVLaDFTMDRqNWRZdzk4cXdualJISUxVdnJIaEhPVmhIRW9ZWVJiVmJOamcwajlqU21FVWQxY0FSeFZVcjNrd2hmUXpYUDNEVGc0bw==","upper_bound":"Nno0Wk9tbUlLN29oWk5FZjdRSUR1VHJ3TzJWSTg1b1ZpQWRab0EwcFc0b2p2aXdNdEwxMFh5dURCcXJkc0ZHYTRSanl5YlBGR1lPS09udE11RmgyaEF0UWxMS0dWY2R6aFFldVVpdjJWUHpPeDFDOTVEdkNvTUxWc1A1YjVjbENUUUVW","repeats":1},{"count":247,"lower_bound":"NnpvZGV0OXJjRzlVTmx5ck1NYllqRFF6M2ZiZ2IydUNLODBTUXJxS2hHNmJRclM1Skt2MTBmSVBiRlc2anFtNGhuSnlpT0RXdDZCdHRjajBySnVXem9tQ1gySklZaXlYYnR3cHYwNzFUQnZsZmJUemNDajZQeFRtY3NTekhmbXF2ekQ5VEVYWWR2YWp2RzJna25wN2l5ZDNsYndieU9ITkdOdWJNZVoyaGpnSlVHeU9xMVFDMkpnMmdIS1JuOHB6N213TEFEMlMydENJR29VcEZZVkRjMldLQzg1UTJBVFNMMXg2dmQ1c0pXZU10NEliaVpsSlJtVjZSQ2xkcEwyM3ZZNkJZZFk2c0dsajhhczlS","upper_bound":"NzlPcmNxTnhDaWJuNENEMGtwVUxweG5EN1luSkZ1d1ZlQ1ZZQU1NcGEwdVZtbEk3SEh6eDh4Um5ZUWVTQU9uNVF0algydmtBMzdPYnZuVU41V2hBc211cWNJWWxQRzFzVlFmWE50dWNpc0RTN1hsZmszbkRZQWE2a2dNcjN6V205RTBsd0JmRGRBUWxMUmc4YUJQaWkydnA3S1AyQmhRejc5UHJWbDRmd00wYkRRTkFVZkZkUEppdlZMS3RQOHFJMFQzVUZBYkcxMnhnTEhJOGc3ejRqRUtSeGpjU254YWVRRzREUnpFemJISG5MczdFb25PbW85Z0RSaHY1VWZiNnlLWjY3eXlsNVhtYzZrNHlHSlJMcWxGdWZPU0Y3MjNkWVJYdGtzcmFhZnN0eXY1Y0FXUnU1Qmo3aHJ3YXpFVDRRSks=","repeats":1},{"count":253,"lower_bound":"Nzl5RXc0cUZMTlFRWmY1SDUxMGxZVVF4dzBxQ1JPMVZIOGNoeExSQ29TWjVZTg==","upper_bound":"N0NObUZWaEMwa1VnZzZQTUlvQm04V2htSnI5NWlSSnVjOGZPeEJ0U1lNWURmUm9EeW1UMXh0cTZyZkxzWExRSGhMV2NRNURVWTJ4Y2o1Z1cwYnVseDkzY01JcEoySGpxS0dZQ3M1ZTVoeUdBYndyVHpYVXlxcmlXV1RWUTZlSEhBVzZNWkI0a0dmRUhQR3BlMWpZZVdESzlxbW5TYzE5QWtoSUxkU3FjWTNkZ1AwRjU1blFFakFUZEU4cUt6OXQ0T3hPNERVUkN2bGVBQUxqZVNGaVNXbG5UazR2RmJQajBQaUZVTFBMRHN0RHRrR3hob0REeEZ0c0EwTE5QOHJwelJ3Q1NRcGVBbmxEbFlnYklFbGxLbEtKSHg1RUFGdHh6N2lXN1ZMT0YxdktxU2VSZ2Vqem9DZkdmNDN6aFgzdGdqdW9GeXlzSjBWMWxoQkRodjJJdzZXV3plZE1Fcm82cXo4c0QxQjIwWlpuYzV0Y0dOM21TUFU2d2U3TU05S2hITXFhOWRrTXRCMlh2OHUzdk1DNlRyNXVKaVlkdk1tTG5aNlk0NGNTZzdtQXBLajVEa1FFUzdlN2xZZjJWWFlDYXI3UkJhUmRKeERxMUEzeXJDaldJbkZVdFlkSk5DQUQ1NkY0dmxJV1phc3RUWQ==","repeats":1},{"count":259,"lower_bound":"N0hRbmF1UVlXdGRLdmFNZDhlTjNTekd6S25PS05vVHZHNUFhdmFyM3drWDM1c0ZwN2R5MmxXcllTSWw0aHE2Z0FiSnhTRUlSZDFycHlDaFFMOVdRaEg0RkdETjNTYWJBUGVIUGJDM29XUExGSk1jVlYwVWNld0lkQmZkdTgyY2tXUXNCQ3hXRExrM3J1c2ZxZVVGV1VVdHVjTVRZOGRURVhiZFRXVmJ3emhENmxTVXRPQ2tTS0JVckdUTVptNUhmTkRFYU13ZGdkUDJ6aUYzTHhDTmlkRHp4VE5oNmVua1ZFWEY2bTBqdFFsYTJ5MEdkWWpLNkJ6bFlrcnBudnBNTWFBTWYwYUlFNm5NRzVmcW9ReHRvY21ueFdmZWZrZ2Z3VlJvdWlHNU5mMGNaQkN6VERkTHpNMmxxMnEwTU9BQXV0TmwxMTlOU240S3VMVG5vZ2RQaE9vaVBYNFF1Vm8xN0FyVm5qWkRHelU1MDN3Wk1uenoyemVTVFpGa0Z6dk1sam85ZEhkV1NqSVFiSHJQaWt6VGJNUlZzd0VhMnpyM0dsbVNGbDlmaXZDbm56WFB4bzFwcE9IMGFNc3Q5VGM5RFdPRXhTbWpEYkVSb2JRRDVkOWdmdGtNV2trblVwdmJodGJaZnA3dVdzMHRldXpDQVFabElBNUNBYkIxS3VxNVR5SnFiNHJaZXRFcmd1N3lmb3VLWjE3enZVNTk=","upper_bound":"N1NlbkRXcGlvUDFnV2pjdmlxSDYzSndlcnVZTGc0WTNVajlYYXpDdjVMVHJScThPeGZGZElhVnlUZ0xPUjM1NHdTU05pOEx3dnNTenpjMHVBNVNMb3hJUG9qMDVFM05yZEFlSXRNY1NtcDNTS2pmTXZidmwxNGZJclRLblRqeHJYMG9BTFRiOFpReW51ZkZzYzVDOWtkbTVhM2RhVVExU2VCeFI5QmNnaEtIYjJlYzI4dDl5ZWxlZFoxVXphaVNRNjltTjZtY3VjeVNPVkNXNW5LR1ROaVo4OUdaamtGWWZGU3RsQ2RDN09IYVpqUDBQaHpPazRLbDBUaUd3ZWptQU9rYVZVdDg1NTBBRmNHOWd0MXhqTVhVQVoyeG8xbVgzSGJEVXlyNG9PV3RMWWphZmxTNEZMeTRxWWFHdTdsUWcwczJXUHBpQkhYMExjVEJacXEzYlZ6S3h0R2kzWEZhWEF1U3lJS2d1MFVFbjJxV1M1VXNEU0VteEJxSk5Id1gzMWxZVXJoUE03Y1V0cHo4d2VRM3E2U1h1ZXk3QzhGT1pyYkliMmxPckNFVA==","repeats":1},{"count":265,"lower_bound":"N2M0NFdYRzR4cTl1WkVycFk0VUo3WHBUemFFeVQxcmdtYmRUTjA4ZlF2Vkg1ZzV6T2xXUlZ6cmN0SFA4clB1UUlvRXd3VzlqR3lVNGlCejZYVkFybDRzemlIV294Q1lQbHVxczVqN3oyOHEzbTRzQVZ5SFF2eUJpUnF5azlPTnpxUWw2T1JvTmdHVjZ1aHpXMFhDTkx0bFNoNWM1WFJyd3dNY1oxTUxVakp3NmptQU9QMGhmNngyUlhINWdIQjk3bnha","upper_bound":"N2czZkNGMTh1ZEJXNDlzUFRka24yVDFUQWRubmxDb1NVdDlhNjJwUzdJekxWekMwOFVxdlJPTjNEY1lWTkFrbzhQRUR4S0Y3aWdyZkF6SnRKckg5Y1RVZ0w2VjZoM2V4czNtVnRENDZybFJaeEJ6OWNRRUN6UGdsOVh6dTFTdVhBZGUwNHZFdlVucVRUWG1XOUZoQzA4bU9tSTAweVA3S1NlMHRGMjVxc0U2VTVqTmRSVUpxU3ZQbENHRHUyMDl2OURMMUxRQmpYWkZaejMyOHRrb1ExblRzczdkdlZxN1BMeXlKM2dDanRPNTRUUFZXRWFKcG1BdjFiSm5oSUJpYk83S2FScU8yQTdoNUZjQkV4M3JScDgyNnZqTUo1akRiNUtRSlhwOEM3WXFxZHNnQkdMU05nclRqNmdZVzMxdlRUUVhyRWZ5cW10QjgyUXluWlJES3dwNFN2WmgzSFdqc0Z0a3VEMWZHc3laODh2bDJi","repeats":1},{"count":271,"lower_bound":"N25aQXZxMzNsT1gyMm9zTVZaTHdINU1sN0ZCT1BNdklTbEl1ZmwxYzNwWEx2VXFQc0ZyeU1nMFpPVEVBcllpZkxPalFxQVNIdDQwVVNPd0hOSmtrcDlNYVhqdVhMakxxbFR6dkxxRzN0aWFJTFF4UGhBaUpsaW92UUNYbDFQZVY4VmVzaFpIZG1zUXpqdzFuTHZ6bnBCbFdXTkVMb0lYMW1jZVRVVXJwNUtDOHhGcWhldHNEQ2tWSTlXaW1JTEFJdlBUNGlqbDB6b3k4T2F3QkVkWTlLREIyWjF5ZmJtaDlEd0o2ZVY3b2s2MlpBWXp2M0dXeWY3QjlIOEJWRVNDYzZ0NTJMUzRsVFpMTklDM05XSGhvdEllNmdoVVRvREJ0R3JMbHFKcnNPdkFXVUVHMjZQOHQyUm5BWDNBRVNzanMwQXh5cU5YMWEzSElDdFBmSWNUYm1TcFE5cHV3Q0w3SE94SnlQY0dlU21NUnJ4ajA5VHE4RmkyTU1ON2Q0N1czZXBmWm1rd1ZUNDZud2x2WTg5ZjFxampVUjZ1NXVhYmRaNUZjSGkwTEVBR0s0VXhTMEJHam9Ndlo3NXY3VHFZeEpDVVNO","upper_bound":"N3BuNkFCWmNib0RCNnBjeDZKaGNNd2RSUERLdmpiYTQ5WHV6ZXZkMWlwbzI0N01tU29JWnQwTVhIckh6eDVYRnJlYkllMVdHdnFSeFk4bWh6ZXpuRlcyT3VQalRyY0dzQnBVWkxacTN3c2VGUko3U0NVaTVZVUpDZDU2dThvVXNibXg3dVF2VnpGSUN6Q0lveWJ6NEtocTRXcWVGck1nc0Zic1JpUUdEY2dRVTJoMjlrMXdHZ0tsbG9ybmRCZmVVbElmTTFWZGVvS0tPVVRDbnBMN3VBTDVCaTBlYWRTQThMM0Fmb3ZZdHpBUXRpUzF5bDNtZFJuZ2I3MEMwTXIzSGpVVGZpUG9udVBEZ0NtNDRMVjlncnlvYnU=","repeats":1},{"count":277,"lower_bound":"N3N3dTBtbDZtVHZMZ3VWT01ub1B6d2EzWnB4TXB3OFhqM2YzNkp4TE1UeUc1ZGdGdTU1MVlMM3RWNG5TQkVuSkt2STlidUllaUtWdFpPSnVIdjdlYXRwNHc0RkR5RmZ5SzRUemowZ0JROFplQmZmeGxIZUEwUzdrVEU1Zjd1NE9LbUMzeGZCaWdhamk4eW8wdHY3ak15MXBmVDZCZlZLWXRWNmZ2TkJnb0ZVWW8xemhPdlZGeDJOdkZQTE5WU0dVUVoyRzNhZzl5MmVDdGZienl3WjhyNzRTa0pDYUlRTjNEQkZpblNiWk95eW1vVzYwMnUza3ZZQ1oxa3UyYVM0aU9kak8=","upper_bound":"ODNGVU9WSTNqcFhENEo2NGh3NkdOSTMxT0FkSk9iTk56aFhhUVdIaEdwb1M2UlZHOHlyTGkwc3o5a05adkFYRXVoVHdnUkVJd1JmNkFFQTd4Z3F1S0Q1NWNraTJpa2FydnRkWmNyeXpEVzhkQzhXWFV2SE42M1dLeDlhOEpIbGNRY3B3QVUxcm5wdG9nYmdTR1pMOUM0cEJLWUU2WVF2M0xKS29Ncw==","repeats":1},{"count":283,"lower_bound":"ODZMNG4wVHZEaFhvd0RzVEJhTlJMWmRJdXRuSUU1NGFaRWo2YTQ5bVpORjZNVHNTeDUzVHJRTWpTQkVnMUlxVUZheWNUY09iWXpjY3JYcFJ6NklaVzJQTWJOT3VGNmdaUXJlNTdxQllwNTV3cERDWmdTVWx5cWpraXJ4NXlTTlVkQnpLUWhsRWgxQWwyNXpQUmwwenJ5cHpzUmtTNDNZSzhhakswV3lXalVRRWhtMzBCU1BWWTBNelQwZUFoNXprS21Zb0lFSUtrWU1Lam9PbFltNmYwcG1JRFcxUUZoUXYxd2ptUnBXM3F0ZnNnM2FlbFFoT25RbjNEUndmYTlzOFpyVmZlcXB4eUhRaGJBSVBLQ256WWdMOHlCTXZMb3RQbTdoSFozVHJYNmZXZ1RuR29JcTYwVUhqcEs1YjZFNzV4bUNNSW5QZVppUlpucUQzRTJ2Z0J4ZU52TkNtb3VnaGJ5eWowNzV4QklXMXNkRmRTNXZlMjZ4aEZWS0dvSmpCTGRDb0JKbWZ0cGFXMWNyTVBjMUJ5c01M","upper_bound":"OEpJYmNCa2tua1N6YUMyM0ZOdm82VEd6aWpVS1lCdmdhS21la1B1aXVFQnpvNHVXMjJkTUY4MG02U2J2ZlhjVjZlVDhYc29UbWF1V0J2OFgxdnVIYnlKVWlrNG5UckVRUndWcTdpTGRReDZyVU5TNUJGeHpyOG9XY01wRVVBdWJLUmpVUzV1ZDBpMFkzaFZuY1Y3TVlyWHQ5Q1NYUjlVbk0xU2kwZlZsdG1oTWVFbnFLd0lBVUh0UG41a0lFNnZEemYyeTJYdXM3ZzFOUDR3cjlzUWxIaWFOczNVSmRPajVIT3lMOEQzVFhSbXl2ZmtBd3VK","repeats":1},{"count":289,"lower_bound":"OE5jUTRXVXE4Vmh5bEwzM3FIQ2JBTlY3WHkzY010NlA3T1NtVnI4ZTA3YWJIclNhVVBNaXc5MXZicGN3cTY3Y2JuaUJ6MkRxQmlmTUg0ZjJlUTU5clM4ektKZ1lSekgxd0NFQ2dOS0FPemVVZHNKU3ZMc25ZcWRyb1c3Nm1EYQ==","upper_bound":"OGNpbEx6Yzl4RzZrVFhhcFNxc0pmSVFTbTRFN0tXdmNycjBoQjJ2YUhqSlFrTVF6c0JVcXdVZHFJSHpPaDgwWkdhYnV0TWVTdVVQRlpkbGtWQ1pGc2VwVk81YXFqV2Z4MFA2OTJibzlrMWZqNjA2RGg2U3hNeDZWeUNQQWdISzJEOFpUZW1XWWFmMVJPcE9QTnZxWEtUZTRERlVURkdGNHNUOFN0T2VYSWZzRGVxVTEzQUJPRVZwSUt3TEgzcTFLWFJWZU4zN0JQWHhmUE9PcW56UVpscVFGazNSc0hXSVQwZ2E5aVdtaUh0WFU3VGdjOXladnNDc05QMmJzZEFTZ2JaNmZNVUk4ZnZpZ1MyQldmd0xrWDJibFVUck9EU3dRR3F6VFMzQVhQcEZ4Rm9VMkE2ODVlY3JRRkRRSGJlSUs2bHF5VXZ1RUF0U09YMVc0anIzS0xRVHhLWVJFeXBleFgwZmUzNVVlYzBZdWk1dXFHalhlMVg0","repeats":1},{"count":295,"lower_bound":"OGRZRHIzN0lZZzh4WlZMWGpGYlFVckVuajJPZkdITjUwOHU4UGZBZk5tTE5paUh6ZWlIUEN5clZNTGpaMWhremdHODFzRnlYSGZNZlVDWEdCUGo3a1FtMDEwdFE0MDFXdHJQdnhseUNpa05SM0t2SWdHbXROcE1ETHhZN1p3UWw4TmxhdHJUQ1dPOXBRZUZNYUpRNWFaT1VEVlNFVU1LMGFGQ2Fkck9Jc25wWVR0WVVUUTBNeUhKS0dVTjZUU3NwYlJ6OGVCOHNLQXNYb2Zrd09NVWNOYU1xb0NCUWxZN3loRUtZeFQxdEhHYnlPdmw2TGpsbXJVckpzWFRNQTd3VnJVeE1BM244cnRGZWFPWllldDNldEZkb2lPZmNEQjlnVWhxUTBIUkNtY0pid0NDSExYYkxjTUJBUUFGcU80M01iSVNvNTlOWGRpaDBVVHQ0Z1J0VnlpdXFtOWREMDZtRGpRTlVHTDlRUjRuZ3JITkpvRUNwaTR0TWMwdFdkejJLeWx0N0hZTGZlelNjdGx6cEVJM2FRRXcxV0U2WTZZT2hRa2thYzZxckc2V0l0SUl5ZFlYblRvbU9jZTQ0c3VnRFY3VExDdEVpSFZwd256SUtzMURaOVlTSWt0VVcxMDU0ZEoxQVlBbGM3RXBKc2xHYnMwREVmR1Z1TFFFQzRQcWp4R2tx","upper_bound":"OG1SM2FVU1Z4clVtMlVkZlJuazNuNHM1YUZHdEFVU2lTaDZ2RXFMelJrdGlWVE1BdDFMNjdaSHpwc3hhQjFBcVFrMm1UeWpzWTFBMzlLdUVLaG0yTmk4c2VhZ2s0bEh1NkRmWkpPY2x6OGZ1cHVpY0ROaVVmdHIzT3RCSzU5T0kybW1PT2p0R21ITmc5TDFWQmxOVXdCYTRsY1owMGF0T05jVTNkSDlldUhiMGRiaHAyQ0FPT1JTWkxSZHFBNEh6YW9MNm8wUEJkRjhTZm5EUzFsQk9iMjJNRTAzMkNZRGZOb1FOZDBPdnFVNA==","repeats":1},{"count":301,"lower_bound":"OHA3MXQwaHVIeG9IbHdRalp4ekRyRnJUdlptYWRaSzB5bHBHcnliZGhmUmZMeGgwMkhPWklKN0JSaEg5WHdNMEVxYVR3c3dUUG5zSWdtUXhXTmtwQjllN3N1bnNiYmNzblIxTmxabXZmZ2M2cTB0MHRsZjVRQUlIZnlXZDFoVzNuUDRoQ3dTOTBEOWdNcjZXODdZR2d6WHdVUDdXbkhrZTkwN3Bqa214amprUHdJTW5Bck1FUmxpRGZaSWxGRkh3UzQ4VVJHb01ZZFAxREJRWm1ONGZVZ2ptZGFPZFZ6M0VIWWJSV2F3cUFwbHYyY3A0aW9mSlFGOWdXNmY4V2VOb293ZTJveE5namlheTQ3bXdheFRpdlRFRGNnQnoxR2NqanJ6YmNZeHVQRG15bTdlU05MMmZQandNUGVRdWlsVnVPeTMzeEpZYklRV0RaUHpvNkpMbG1nalA0dmNNS1A5V0pJd29LZTg2bXpQWWk0cmlUdENSMQ==","upper_bound":"OTliVVpiRTR5NE1vUmlSWUZ3NVh0cWRtdzdyazc5VEd2ZFgxUVlrcVVzOXAyOGN4bHBuYXJZTUlGT0hPZkJySEdiemgzMHhoS1drZEZxS1NGVmtxVE9yT1piMk1adVpVeUZxaE8zU2JlUXozSkZSUDc4eVVtbkFxWElJSzBwVkMyV2VMWkN5OHBWWklSYVlKcW5JNGMwWGQxWXZqd2NpV0JhUGZ5b2JtQ2xwQ2xLYjVCMEtpR2JKQXJvSWJ3bGh0bGRS","repeats":1},{"count":307,"lower_bound":"OURuQVZBNHcyVDBJOVJCcUJta2h4akpUUU9BcnJ4NFhFVTEwZklEVTZxVjQ2azRDckVlUA==","upper_bound":"OU1lY3lVdjFlUm1nQ0ZDSW9ybHZpSnVVQ0lwZ0k3QWFjTDMwMmg2ODBwRU91b3NtQkduVkY0SzBJdUNrbUJna3ZSVkFVV2pNM0ZiQTNRVkRkeTNEYTFFMlBLTjYxWlV5c2hieTZQd1VtNVhDMzV0QVY0Y21JSUF1OHRSVWZPNHEzSXhVa1FwdzFSS1loVkVwRE9TblJKUHFwMUduUGRRRTJ6RkJSemZSRUEycjROZUlaZHpNSDNJNEJzVlpwSXVxaXRRaThpR2dTMmFmZ3BTWVo2UlZoS1p5TG5qMWh3RFlHNE9DMVlkWTBobHJHNTlkTmJIQVV0OUt1Q0FBNE1mSm1KWml4eFo5VW5tWVpzdmFqTjRWSFA1R3RSaU85am9kUzhaUGNKcmJqRktuWkxic2xHZHhhT1QwWHFGYW5nSFY2bmxZRmNYRG9aU2RuRkdSdjVWRFh5dkxqVW5Da2oya2VRWk85Snp5VHozT3oyQWV3aVY2MHhUbDZmUTBGZmd5ckZybTA=","repeats":1},{"count":313,"lower_bound":"OVhlN0NmZXROU2Zpa01zQ2ZHNlRqWmt6dXJOckdCb21KM2hkYU16VnhPdkt0STR1TW4wNGFSYlk2cnRjNjQwdkMyczZmamIxUEtnU2pYaUxxMnRMbW5UZFdPbFZYcUtnUVJuRUVlTFZTc1Vxd0szRktaTTJjMXFadU81RlkzUTNkQTdTMVgwYVpTVEU5YVpoTHFIWEl6aTVrb29BZDNSeDVsUTY0Wm9ycGpXaTJPTVh0WWQ5ckFnNXhXOHFTVzlUMk9sWDJVNEdDN2lIZXh3RFBMazJ0anNqM0FKalNGdXMxNXJCUDcxTHNYNm1NQzdSM2xmcU9QMDFWRXpHYk91dnc2a3dveEtTbG8wbmdtSUVEMDBIczBaRkFBUUhyVFkxZEdORGt5a2lnbG5sWjhsc01uM0RZNDdXWWZIYzJ6dU44c0lvVU1NOWZIQnRsTzRTclZ6b3VUaVBzMk9MdktUcEk4a2c4WFl2RnRHU1VrMG9MNUpYUlIyNEYxR2RSNGpTbFMzc29vN3J1NTR3OHROQ3VuV3JNaDN0V215R2NvNUlB","upper_bound":"OWN2aVRRbkVZYVVYcThVeHhBMUVLWmI4T05UTE1tbTdNZjZFMVRqN0ZtOExzSFpCRFRCekMzVnN5NGMzWUhramdnRVVnemo1NlprNUJUOGxXakdLR3V3cHJRb3dVOG9WUUpjZ2t0Q0p6QlM0dTFFbmJkZmQxN1Q5SUhSYWtGZGNYQXVvcUxtSnI3eU1ua3JtM1NDd3REdnliRkduNW53RUpmNXV5TDBVcHhuMnQ0WmxBVTExSWY4c0x1TUdGRmdscHJCT0J0QXlzTzlnSlh4T0xjdVRCemdNZXdldVg4aE1IeUNnNkl1UWxRaGFqM1NKQ0ZHdlhBWUl5WDdOMVJ0SDU3cDdaUDk2dlRxVzdNUm5uZEpEQ1I2eDVwM1ZkcXZ0NW9nN1p4bU9RcWVnSWszdFZFRTg4UkVIQU1NZGFZQm9Sakdmb1NZNUpvNndwVWFJYjAzNWM4ZUpGallJQzdDSTVPVHpvRXhmT29icTJzRU56TmE2WEl0QkRoRnBTQ09oempjaERreTJnNjY4ZzNFT3lSb2pQZ2V2NlFFTjFtUnFvN21IdktVbjBqRjA5THJ0WWl5STVUVHA5azFNTnRLeUxkS3JzMHhrNENtZ2pCaVJhMnpjWGQ0ZGY2akxMV1NBWFV2bHYyMFQ0OGx1OGJJ","repeats":1},{"count":319,"lower_bound":"OXFhUWl5MVJLZ2lXbE9SRVJyNHoySXpBa0Y2eEY4N0RtQW1WUFQ2RlFSR0ZZSjBvZjIxUlB0WEhvTlJLOENvdnZnSzBXTnMzaTNFbzBaWWNSVzlqQU9uZXBESTRsbHlEaXc3d1JkSHVlVlhZdjczUmhYamNEN2lHU2pIRmljYXBrMUtyTUN2TnZnNmdiYUtyb2NjaUVUSVpUeWozYk1EM2QwZHFMM3NPY2cxZVRwRTYySFYwa3NyVkRURDAyNHpJUnlwb3pxOXNrRTNhMVNzMU9ZS1ZvNnVhRGI4SkxnUENwNmF4aUx4ZlJaYlhuVDZ5","upper_bound":"OXNTVzRnOXhxdWJvdnQxUkN1WEtJd3lBdTJpZzRXQmFZUldxaVNXczIyaHM4MHpTZHVxYWd2aUZscmdlelNpZURXSlJIVWFZNkhvOXRVZWl2ZEZ1blQxQkNKNVdvNTlsMDBCanJCN05RTFplWnBHdEplU2c5WU92cHRBM3hNeEpHNjVmcW5wNUJGWFFoelV4MHNCT1lsQ1lGZDc0UFlielo2QnNib1N0STJiMGNkZURsRGN4OEhRU2U5eW9BZWFVb0lsdWwyOFdrTGkxQTlqaXY4VDhpRFpmaTRBVE5MVElFcmtnWWQxdzRscUdVWmN2YklZalpvcDE2bk4yZlp2MHo5b0VZUndrSFlsSm5zUE8wYkcyMmQ5U1FGQmlUV3VjUkJpb29FTHd4NFBjR2RndE0zRHU2TXhyWEpIOGpScld4anVMUlVTS3VzRW9CeDE5b01MemNxQWZBRWZka2psQ3hFTnFmTERtWVlGb21kOFpKQnlIcW1WazlsZ1ZmR2Q1R3NTTkNyVWZicFN5RmNETmN0Z0hPcnJ1RlBYMUZBcFpTNDMyaTA4eGRzalNiZHlINFcwTnZSNTVVWng=","repeats":1},{"count":325,"lower_bound":"OXZMd2J3d0haVnYxUXNyOWdwejlxNkp0a2pTVHhyd0MxeEZWMFJ1UjB4TFZnVGV5OHdodGoxYWNtSkVxSGt4OFJiNWxnMDYzMXdtU1YwcnI4NWIxSkgybTc4djdpeGNRTFI3ZU56WjdjcEIyQldsYXZrdVRUM0dmZHlmdElzaGRpQ2Ywb3lFcW8yTmtCMXpxNGQxQ0pibGlrNHdFeWlOczBBWllqaHp4OEdoZ2djQVM4T3VKc2ZOamw3MFJ2cEhMNlRpVUZQdUdIUHVPdmVvam9GbFVVTVZTNWpiQkFUN3hudHFSSXUyT1B6Q0cxWFlnWkdrYm1ZTkdNWTJvYXMxb3F3TFNHMVN5ODNLZDV4UldPY3hPRzlmRVhmQnRpYWhyQWUwaGFmS2kxSmp2R21PejI0MGFjQUxzMnYxSlNLc1ZUTU80SmE2THd0M0lQZzBrWWY5dG9pQWVhTEFmbDVITXF1SjJIWElPRHF4a0ZjUTlCUDdPZDg5ZDBJSGNleGw3ZDg1QTNEYjI1MjV1a2h5THl0UHNVclVyeXQya2JQ","upper_bound":"QTJmS1hMbHhCYTRwdkwyQ2NjZVNURVpYVVF3ZG5Cc3ljZnRmWUVjWnhQTVFURzJsZFBvbFh5ajVlTGhiSXlncDU1ZkFSRGt6OEZpbklaMmVFRXZ6eWpRVFVyb2NobU1rWU1EOGFpWWlOZHRJOE14QTh2dWJXTktOVWRCR1RGQk51OTQ4THU3dmJMbU9mVDFhWUNuRmJFY20yY2tZcDdTZ1VISHRvZ3dka2lQSlJrS1JnWmtaa09EcmVWbkZ0alF0TTR5UUltTVVZNExTTDljZ3JW","repeats":1},{"count":331,"lower_bound":"QTVMR0xLOHhXd0Y2ODY3Y21rdVUwRjdZVUNkeFRGcjRUZnRBTVdNcHBxcFZzTkdadlVrZWFWaGZwYnRGMUFtTk5UYktQOW5UaG4xSmVjWlBidVdiSlZDbmhqU09RVXFRdHpZTElBUGt2TFI1R05ndUFZZ1NRaVd0Q3k2UE5uQ2xLbmUxVU9VcFc5SkZoaDhhSFNLWHhRRXRzZHhUU2VBYTdmZ0haMldVdGN6SnNCQkF5SXB3T2hNQnlSMG1tUllvREFJNUdWZlVGRlI=","upper_bound":"QUV4enpHZWZSV0ZuelVPU04yNkk3b3VWYXJ5emxKaW1EN3lzZ2M=","repeats":1},{"count":337,"lower_bound":"QU04Vlc1T0UxNHA4WUVvYVBicURZekhjUWx3bFJUSzNtTEgzbzBiM1VXVTZ2c2NYNjNTV1NDa0NES3RrZG1pU2RJUHV6dDVsRnhNRGNKMVlyaGF0b3ZuMDdYU3lvVHRGM1BJSXZOdzhX","upper_bound":"QVFET2lRN1c0ZEIybHFlMVM0R1Azd1NHME1jNE1QTmJ2VFpTMkhNOFBja0hxNWpkcERjNFpYNmNrZWxSRHNWdHNQQ0ZnOFdUVEd0WGdtZTV3aVFxRVB1eUZDdW1HcjhXTWdZcVJFcFQzTzRBVFFac1E3Y3hyZFpKakhGOWpBNkF0VVBvZzlRT2RpWXFSZkdaWEJxSTliWllDaUFEUnhNTWNnbnQyQ0o1MU9EeWdUazMxbkV5bjVNazdzdFhvU2tCVHZXenVNTXB1SUNWbG01bG96TGMwbkd2TnFoZGtnQ0JYbTdQdWZNajQwMFI2SU9vMDAwSXc0RjVmNDcxTE5xemkwMDFwaXNjMTBSQkdwNFd4VHRzdVc0dWR2bHJjSDJLOUhFOHNzU3dKVXpPT3BPMlhnd3VaYVBHRHJuNEJ2QVZQVndYOUdHWmJzWFgzamJJNmJ5S01FNUpCb21vc3F2Y3NMTTg0T1dFc2RjTVB4ZDBGQzRHQjdTZWU5SWhuTDJpcHRQTkg5NzN1amRxVUVIY0lKNmhWejN4R2dOS210Y09rUTYxVlptVTVsSUczbmR4eXFWWDl5dw==","repeats":1},{"count":343,"lower_bound":"QVNlRmdOQmprSmJoQXNpRzh0VXU4bHVxVURsMXQwNENqak1YeGZDSFR5VklXVno5cThRWXd1ZktsNVpMdlY4QThqUTh5ODVnM1lQS2lhZ2ZOMmxENEN1VHk2ZzBPekNZdTRMRjNXcnFtY1JEVzZsVm81Ng==","upper_bound":"QWI3eW1zQ1B2M0NMQ2J6U0t4SlpaTkp4NGV1REtnaEVXV01WbmRQRVBJQnJpOURMSGpoSlpUM28yUWdNaUY5QlA1dFV6cHdzdHpMSENLUUhDNVl3V1pTUjN6RXA4eVZJ","repeats":1},{"count":349,"lower_bound":"QWVUWWNnS2duWFRkZU9nWUxHRkduY2J0MGZa","upper_bound":"QWhsZlJtaFNBOUlrbnRjbUVtbWgxUGVLWWVLRGRuQkE4eVU3cjc3dThvek5tT2F2c2tKQnZJSzdhMDV3aDV1TjhlUktGZEphNFpoVVh4OUwwTDRGVXI4M08yZjdkM2RTTXdaQzNlWEE0WUVFdk1MRnNpc0RoZVlmMG1ScU9iZ3dydnBvY0M2M0V4aTQ4MkhDamhvdlg2aHpkYzNSWUdwaXQ0S0J6NVdrU09ESW9xWVBCY2V0YTh3REkwR3lZN29EbDRIelpuN2NNUlRBbGZlSjhaSzlJNWZmaGF1U2xiWGwwMkFCQ29CTWxuQUl1NkdjSjFYcFRLU0RGT3FnRTc0RDg4U2JReE5RcFE5ZW1KZnM=","repeats":1},{"count":355,"lower_bound":"QWlyajJhNWYxMzM1TTlIRHVKbEdOM1RGaWFrY3dNbndoMVd0RzVtNENQT21rd3dmcUtLbkk5RVRuaTVPVkJySHlROHZ4WW5EMzNTZnl3RWxrcU9FSGhOR3lucFB1VUt4WXNJSnUzYTU=","upper_bound":"QXExVkhUOWJiWUFJUWpucE43Tm85b1huNVFMOGQ0R0ZYSHNxMEVxMWdxdDUyT0lKT3laNldlbHZVT2piNnlBaG5xejJkQXN3bWlpV1h6SnEyeWFVcnpOZml5ZUZzNVpmR3g4bzdJRHg=","repeats":1},{"count":361,"lower_bound":"QXEzeGR6cHJtMVBLemhuT045N2FhYlZNVWQ1MVp0S3dZckdKSHlndFdrNGRkRkVodmRzWUdrbkxBRGc3aVltY3VWOVRJYU9MNW8yZlpyT3NUTm9DMzBtMFdhR0FVWlVHdE9HWlo3RVl5MTNmQUVXN1RRcFlHQ2QzbDhUbWZNOUJFT05yR2xiaTNERUZFWkt2em0wZkU3aWNPbVZMb3BSZWQyNzZoRjB5OXdPMEpLWHBZT2hpY0g3MDIwTU9IV1Q0RHRObFplTVpzSFRlZWxaRHJuSEUxYnJiYXFrTVNJNkpRVTJUSXlFbFRQRm9DbkFEbzF6NDBEODdWYUFBZ1dZNFRhVmFVcXdZQ3hIUk5FUFNIeGJnVDVPbmd4MHp4SmRNNU5OdHlCTGR6SUUyY0hwZm8xVTB3OFlXdWRtdVZSWTdJMVcwMGxGVHRNaTF2TDBCQVUzZzFZUnZrZlRDT2JEYWQ5aHRGOFAzaWVlRUVSZDZSS0ZTM1NNZGJkTUJu","upper_bound":"QXVKNDNIbXE3emVpUXJxMzR4MkRKSk92NmNIU25UTUl0S0VpSnhGUlZQa0dzNHRkaUZSeXljb1FFQm1QbllQMlVOMUR6V0MyanVrMWpVNXR6YllWRjNaR202NlZKVHdQc0N5eTI2NHczRmQwcWVIbFVJbG9ZT0lPNDVCZHdNQ3VZR25PN1pDbTNaOUVTWlF1azk=","repeats":1},{"count":367,"lower_bound":"QXlJNENLU29YOU0wZ1NKSUR4Q3Qyc29QUGVabHVOM2NNRW5SREJvTGxkRWUyd2dEdzBRSWhQb1Q3OG9vcVZWUWpqSW1yMXkyZUtTYXN1S2ludW9kS0VCUkVTUzMyVVJXbmU1M0dic2xmV1FJQkN3M1ZXVzVTMlVsZU45NmxQRElhMGdWaHJGemZQS1JjaTlkVVc0RVFxRG9nRElqVlZGOVM2cWRTeFg=","upper_bound":"QjB0S2NudDZkcmpld0U1NkxLRmo1TXFVRzA1TENKZFZZU0JleHZiUUk4Y1FURExyR0V4QmtwM1VQRk40ZnBIaGRJN21XajNldTBHYUhyaEl1Tmx2QXRQdlVQNjJWdXFJM1VqWXZCUXMxbFV0aTk5OXdZNkpsT3RNalBqa1RnaVB3RDZha09xSngyRFU3WHVFRktSU0U4Y2VQOUt6SnB5aTYz","repeats":1},{"count":373,"lower_bound":"QjJUNENHdEZPYnJkNjhoREoySWpmcVBrOVA1VnZTckZhbmVWM3FXY2FSUmZMUnFIVDh3RGZTQ1lHSjFRclVZdWVaZjJDQTBTdEFvTXg2Yjd0N2p0MEZYbmFVMHJLQXEwbUVhdjBqeHNyZnZ4OFFuNjVudXRsc3ZDZklyalgxNHBsV1hxS2MwcHBobkd4U2JrSmN4THczUFRGeUZjNnMwM2xCTDhEYUtIQzZKZHdMQ1VRZ0EyY1dLeEV5R3lmSEk0dXBPSjc1QmRaU3pGR2pHY3ljZkxoYkF2cng=","upper_bound":"QjVzTDdacmdnOVQ5cVFkUWwyZm9va2NSMlVVQU1VT21RMTJsRUtFaTdJYVgzMVp0Z0VESVROY1FWZHpnTmFQOG5BWW5BclRoMUI4VXFNTE4zTGFOemdrRUVFaDZhUVV3NUU1RExCVGQ=","repeats":1},{"count":379,"lower_bound":"QjhoQUxVQ0s5UDJ5Z2lWSEF2WFhkY1E5OFJ4YlR2YXpYb3FCQ3ZRVW1Hc3JUdHhPakZvU1VCWGM5Y29WcE5icnNxSnlDT2lIVU9La3REMGVraU1oUmllVkUxRERzckh5blNXc1BKdldrMDdGcUNIeHZlT0c4TlNpTnBLT0d1Wnp4ZjhqRU9mMkloTkZrdjdBd0duZ0JJVklTMEFnNQ==","upper_bound":"QkY4M01ER2E0V3VQbjh6Y2hZa0lVT1hsUnJLNm1vRDljaW9mcmRQcG5uWmtSZEpYbDJaQU9IcVhOb0M5RmV3R0x0RXZPam5xQkZhdEVna25QVU9WeHRBVWNzUjRSOUY4WVZMTHNnVm1QR29QaVcyYnNtcDM5NzY=","repeats":1},{"count":387,"lower_bound":"QktRag==","upper_bound":"QlI1ejR6R1pZeGF2SkFmWTM3Z0YzeWZKc3lEaU9Hc004ZzdHUTVOYXlBcUM5cm9Jam9uMXc2Ykg4eVpGNkl5U1JsTWpZSE42V0Z2NGtsMDZZeWJDM3p5SVlWb1ZuQndFbDRqbnkzNjY5S29FazJZbWtkQmJiTmZON05DYlQxQnltVjVhYkliUkpuRGs1Qk84Z0VvZHRERzhqd013YlFvRjFKY0Iyc2FqQW1Kd2pGaGVvNGpNNThrNW8zcXpkUzd4Z093SGlpOWdwS05SOXVaajJ5Ync0QkxSRkNzbFRCbHhDQlJVS0EzNEoxQWsyQURJdm1xb2kyb0tCejdybGZTZEJYWThDMFA1SVJNckxBdGRHUzVTcXI5NDQ2QkszSkpKWnF0Qjh0YjcyenlXVGlpMnhMNkJnNmRRU01FQXI1cVR2N205all0bmtlYnFVZkh1aURURDlLV0RlV0t2Qkt5Rk1BOFZpRDhTTGQ4aWEzS1lCYTBEUmZzMndGUFA2ZDluV0g=","repeats":1},{"count":395,"lower_bound":"QmVsNUE2Rnk5TGhIVkdoR3d0UDZzWGdXenVHQkRXMU1PVUhNTkRFb1ByaE1SSXV4ck4yUmpIa1RJVmllOU1xeHk4dlBGbXFwMm1ORHYyZkRjdW9mMUNOT0JNYlpyajhXb3JxVmVSdjltYXVCeFl2bEhVUGFTekN3Z0haMERlbE9oSTdlSWxpZndJWDRQY003ZExQNXZwaUJ5b0RRSmtXVU5HNWU2a1JuRGJqZWtmeVdqcXFHNmVnYzlZd3hPSW5FRXB2N244NnRDQndUSVMybVl2ODNTMGRYNEhyVXFnVVYwTUdnTjVwcXVhRTZadFM0amZwUHJURTFYOFFRMW9Tbk15TnZNeTVOYVdSN09HUTRFNzRydDFLNGprZnZMMTlw","upper_bound":"Qms3a2pYSGs1ZFN5Rm9HRVpEaUVHcjJzQ20wd3VKaVhsVm5pbnJkWExjVVdmcFRISUVpeEQ3MUh6RXJRbw==","repeats":1},{"count":403,"lower_bound":"QmtHbGRwSWZ2c3JZaTM4M1BsMDBUcVlLS21QbVhzeEswZ01sdDc0U2VkSW9ldzl2UkhvbHprR2s5ZE04dWRMd2RMeUxhQ1FwdUlIcWU5aU1lN0l3TFN6bEtsZ2c2VHBueDlMOGY4U2ttNlB4WkxwQkdiMVhaRXRuSXJOQUhnUmtEcDhTbE0zU203bUVsOTExekRYSU55MHRtbjJSMUZyR2QwUHBDQXlZcFJMMXRYWmlSSDN3WVQ1QzRVMUZqMDRvdjlIOXJKaVh3UTJRYm9sMG9vZ2ZhYWFXQzIza3l5WWhiYVBxM2d0aVpaOXFuNWlQUjA0VVpBR0tpVEt0cnZqVmNiaVozUlBoQlZxRnhHNFpvVlhCOHZPMjlVSlZtMTdmQWF3eFJsWXNhMzh1R1lmOENFUlNad0k3TTZPSnplcUhQd1M4RjFqaklZYzlnVEcyYk91UGFFNFFZVEExa3p4b3F5MUhhSlNSeVNZRzN0N0JxNmdBeHJ2SkQ=","upper_bound":"Qm9oakNaZVpEbkl4UnRoZUE3UGRvd1FDTHY0R0FhWUtmdGJMOE1odUZLejlUU2t1V3h1T2k5NDN6TnE0RnhXUDhhcUlMUGQ0a2dJZnRRM050T1F4a2VmaHBjcU5tRlZ2ZkhKcHpYNU85SHNLTFhESm1objJJZmdXVzA4Mm1GRHdsRnY2NnA4Q1p2Yzk4RVByTGpIYTk=","repeats":1},{"count":411,"lower_bound":"QnZRWUVCWVp4Z0h0dEtxTlI2ZXZBN1kzdzFJT0xnSm1WQjc5NjNrdGNHVnB0NGJoZzN6eDVxRkM0ZTh1bDEwcWRvV0Z3ZkdkMnB4Smc1bTRVa2ZvaXRCZkszMlM4V0tWTnFDaWFPRHdKeWd4eEVSR1MzN1l0QXlqdms2TWNjYTVUUDFBWUk1TTA5UmxDeERzWW1LMW5lS1FaM24zd01VQk0wSFhXQWdOSmEyT2NuZW4xeGlQdGF1VjRaREdjdmRkM1I1Y0RZSlhsMGxlWUhJUEJaaXZvYzVSR21ERFFlUzBKRXp3TXlUSjFqbXVROGpEOFZjWXJWWUNoZzVBdERXZVRXQWkzWWFXRk5Ca2pneFZmN3BVMEdHa2pPakR0M1dOd05DZXFqOTdreFhNZQ==","upper_bound":"Q0gzaXRnNkw0ZnMxakVlZk9yeWVYTkN0UlBtTVZBczBqSVpjcTBXdkloZUF5TUtEQ3VBRVpwTkhtR1pxZFd6cFJGUjkzTllVVmVvazV6U0V5cEk0Tm9pOHVTbUF5cEZrUTZ6SjNkdVJiaGlRdUVZWmFRYURzcDlqSjhjb3ZZeVBBS3lIRFZVUXNJQ2VVaWFMcHAzanNEU2NrV3NKZ25IYzVNZkI4SzAwTXppeXNNamVibWJKZnBoSEFLY2V1TFFMcHlpUGsxUXlwTnFqRGl5OWNxVzRMeU1EOFEzazFHd0JQcnRJNng0dG1lM1ZOcVZEbnF3ZmxkZ0lGam9ENXAxRmZPbnNyblZia1RXWjVnWFF3VEowNFZvN2JCQ3V2Q2tZU1lxTGdVVzNxbU1vZENKWGZ2REtsSzB1SnRJbE80TXhwTzVjMFRZNWNlczhWU0pIeVhZdEZicG5WeG4xS2o2Z25FVWFQaWJzblhKRUZUeXZ2aHRpNkZDektjODRibGpmWHNhU3llQ2JBcDlH","repeats":1},{"count":419,"lower_bound":"Q1JjNzVGTXNETVNVNWNqU1lSbEFlVzVSVzhBY2ZDOVNSZWN5bE96SDZjZjhFQ3pNZUNpdGJDSWYzZWtyR0FRNmxiVDJIZ2pUVDluQXQwMmdMdzNqdWVtN0JMRVpxRVZGSTJWSThmWWx0aTRSUnJsUURNa2lWTk01VWZMWnR0bGhOdVZtV3pQNkN4M0dGZjVTOEUxNFJjVlljdkhoOGRtaUxRRzJPTFFiQnczQ2xxSWo3d095R3dBRlBM","upper_bound":"Q1lzcFZUYnUyd3daMHdmaktCcDVPZjRucWtUamtaaHlGSXBCOGliUk9ZSUpTRHNNQmxpYmZhM1JYdUpRQWdNaDkyTjZoYnlrYUNXUjVVbTdCWXpLYkpKa0pwdUszYUFHVHB4MWM0b2xYN0htUHhWaVAzWlMzQTg1Szh0NW9RVW9VdXZZdTNmMTVoNzlSR2lUbzVQNlA5ZGVkOHFWUWRzTUpnWGFCemt4VWFvQ2E3d3Jyb09WeUdzWHFIUFNBQVFnTkJJbUhYWVJoQ09OZndGWkswb28wNXAyWEpwWXI0WFRGTTU3R1FkemM4WXExbk5jQjZjRnZWd0Q5VjY4VUpJSTh4ZVFSZExldWhPYlo5SnZMQmhHWjVLdGJoNFFSRU56ck1FR09XeEVaTXlURTRJbmFlOXNXTlFDWHVYYmRtVGlUZ3k5VnVIQTVUYUVBYlAxMnljRTNJblFxRk1MdFJiZmZjYXlLa1hYOHFXOUE3a296bGdRREFWYkdtSGoyT1dtdkJRenpPNzYzYmRsZXVJbDR6ZnhLUHBLdjRvcTA3NmVrSXFSc0syUDdUMjZsUFN5ZUlvUFFmU3M0R1NuYjBzNXc3eHplMzM1MEQ2QnVKRHBPMGhZTG1hVlJ1SlNlMTBQRExxTVh1ZjVBOFRCSXF5QTlaV0l1Tnc2UllxYTB3TktxNHBDMGlGRVR2YTRpbTk3STI1d0VXWG83OXh4RUQ=","repeats":1},{"count":427,"lower_bound":"Q1pybDE0VUdnelhzYjlYVnRiQ2prNHRnblBsdEpnVzFVeThHQXJGQVhNRUp5NHhMdnExMkRWMHB6cTR3U1ppZGo3elR0ZUc0cTd0T3VpUmNnN0EyQk4xMlF5THppYUljUEpIQVh5WkNtM3dXV0RKcHkxY1JhYlA1OG9pQVpLNlNUa0RDN21iN0lqRWV0UTZMRkd5RU0wak9KMWFtVmtmV0ptaTV0bVVKNWJNbUN5TFh0bG9aRklRWXJ0MlZYQklMOFFWNnpudWZ0UW0yVjlDNFRhdFpDWjhhOUkxRTBJR3RMS1lnTVVZSjBBTXd2ZHZjSmpTNkY4Y2xTdWNIRndGUVV2NlJhMTdjQ3o0SWFyaWdRY0d2ckloWWlCNzRMVG9HelJQQ1pZRlF3bTJZVnZKeHVheEZ4MVU2VlhpRFJqTGVaeDdYVUM5ZnU3MjljMnNYNkxYMjN4Z1Z6VTN0UlM2RFQwdk01WDh0blFkU3FoWmxISEF0aDIxQjQ0OFN5MUZCd0RTMWNQc2hVSnJaYWdFdXdhajJ1TEhRdmVqcTRpZWI=","upper_bound":"Q2JveHhxOXk1eFZ4cnVIWlpOemRPRXd1VG5EVkpqdmhpZ3M2eHpmYjVYWjlwZlBkcXNnRklHVVpHZmlnUHpEUkNkWWxyZjBHT3lQekp1M1RoSW1ySFRzSWY3OHJyaktIakpsUEhOdXNIczFVQnhRYUpNc0VnTmpDTjVPZVpsOTFRYTR3dVFCUG9MN3NVSjFQWWJwUTdFQ2ZRU0ZkN2NpVXJTa3dpZWh3MXFVV0tIQXQ2U3JjQng1YVdlZll2UER6eTlQWDhLb3Mxc2VMQkFoS3JRMVhMQTU4bVBRSmZTdkNHZlhXVGpxYlhvZWZ5Q0ZuTFo2UmtpemQ1U1Vxd3ZtbXJZV3NLdmJuYXRESGhvUUM0YWlveFJuRWxGNm5MWjlMdHlFemNUSXhpUXVROTJxSFpjZ1F3Rkk3MVZHeHFEMUtCUFhKSEVHNmhNREZUWDdjMzBjWDZ4Q08yRXRySWhOcEg2Z29KRlVYdU05bVVPZzlZcUlBNUxDVFJ6cGo5a1VPZUQyVEI5WjB1UE1QVjZ2SG53eVJPTklVeG04MTltZzdsYnE3djY5TXhtb0JBUTMxSno3TlNocXV4UmhKZjh1cFduWkN6SnJuT0g5MW1hYnpvRURwMmk2ZE0yczJ6","repeats":1},{"count":435,"lower_bound":"Q2ZSMDVzQ3FvR0VVbExKWVAzOVpFN1dHdnB5ZTVPM0NqMzREcklab3JyUUdUalF2S2NTZ3ZHeVZzMkhOdmYyNkU5OEhUUzNmdUhhdXNuZzlOdUV0TWN2SlFPc3lUUktybnk5elgyNHFUdXB0bUc4ZkJ2MGtDT3BTcmVybG0xVUo2bnZDbGEySk1ET3FGNWhqRWpZQ21WeHhyNElBd2lCMXFvck1iUzJKaHJDcWw2REFOSW9hZEIzd2REVWlaQVZMMnZHOTI3aGVFbG52ZmdtYTV5djdVUEZlMzI0OTRsbGptaFlhTGdieVZvRllvMlFvRFY5cjc2VEgwQ3pOUmxETk9keVJPa0pnRHFWVmVVTlNvS0llVHBYQnV2OA==","upper_bound":"Q3Rkczl2d3dvUnNEbE1KN0VoMTRJcm5vYXNNaUtaZE4yZDk3ZlZNSGxZb0t3ZlVYVTh6eVNkMkF4T0Q3YUxCU3hQVmMyYTYyMld2R0hjYVhvbkpOYkhhS21FRTR4RlhXMWFaWFVCaGtDTWlWZzI0SkJyeVQySFowTlRHeEs0a2J6ZDI3cmZHd3lRbGRLNUFQWnVpOUFQTlZDWFJVNVdPZml2aFhvZ3ZvbWViams3WFdEMFV2c2RjTnluakZpcHg1RWlxVk5oT3I1MVZ2T1o4RXRlU1B6TFY3MUJ2WlpMZ2hxd0FJTlROaHlmRzAxc05YbWVSa1BRYmdwa084ekQ4WERhQnd5angybWVkSzZVUWpSUmxmSjN3MjI1WVNPeUVQQ2VPNVRWeWF2YkVzZ3V5dUFjMHBzUWRzbEk5VlJ4TzhkZDN4bWFHMk1yRFNyRXkwU1B2bVFuMFc4eEJWSEk2SklpZkRGeXBoa0F3ZXhnVXZiUTNYdGtPZWw1Yzl3dlpvdzk5UUZQUXlneWthZHFyTjVRZkVTV2hPc3VBUGxnMXhwRnV4MXRGRklWTFByaXprc0paQmRidk1oRUx5ZzZwU1RBeThjQjl2T1NvRU1NMVhVZWpxblhyMVRqMjdGUVduQWdyalVzSzlRWG5ndg==","repeats":1},{"count":443,"lower_bound":"Q3RndGFSTzE5TlF3Q210M3dCbjl3eXUzRm93V3pxT0tzMXp4M3BkZ1pDaXVGaVpCMG5VdTNyQVdTcVRDZlc5V2JzR0hqNnRmNVFKVkRiN1ByTFlNeE9wVm1YV3ZBNVdxblhtdjFMVzNVd3B4dHg4c2IwQk1ZZWVIQ1BWV3lhaGN3dFV6MnNyTzhYSTBoN0FFNDhCSjd3bWw5RWU5SElwdGZ0R3pWMnZ6RkQzdmFIVFQyeWlXUWliRmYyZG1HTGhkcUpyb1BSeGlrSlF6eQ==","upper_bound":"RDBCd2kwUUl3aHo3a1JGVkJDOUhZOXpodno5bE40RGc5cXFwakVIekpuMHpXVHRCeG9TV1lWMURuUlI4VmxtM09ReG9ZRm81NmtiYU44MllucTJoenBITlhlRmVtWEpRbk1kUkFkYW41ak1NaUVZMklNN0hsSklSWDFWdmdUakNUUThSeTZSRFBhb1RFNFd2eHpVdGZuTGQ0OWluZGhINDVERHRWbkZkeEFWdTU2eHRzTnozZ2FtTWU2d2xNOUZ5c05hT09yOU93MUp6aWZOMTB3NkMyTGtITFhTUFVCQXR5UWcyam9PZ1VGZmFIUWxUSjVuc3FGRWNHbUpxTXRudmNienpjVFN0YUt5aE9TRWw5clpNUkIyeGRiN0NSUEZTd2dRRVAzUHNwbGdQbU5ZWHhVSlE5TG5DYzQ4T3gwSXd5anQ3WWRYVUdyWXozcFN3bHZMaHJvdnB3UXJVRGRkZ0p0d3hlMFI1cA==","repeats":1},{"count":451,"lower_bound":"RDY1V2FraXhENjcxRFlyQ3FqZVROb0RBckJZSXo3UVI5RmdDTGRHdHZuclg0Y1JUVUJwU1FTZEgyeFA1ODVKUVJHZ0lidVFRYW56N01xRVMwd1h5cW1aZ1NJTU1OTFRoNnkzRXlaR1BVc3ZSZkI0Y2FQYkFsTDNMY3dZVzEzVDRLMXJkTTRwY2NDeHpUSHVMY1lXUTlqa1JrYW10R3p0eUtwYllTSnRuMUFaUlEyeFd5ZzNWcWx1ZkdhZXNXb0hJZWM3c25kZllrUldsMFhhbURMcEJwUk9xM1hCMnM4ZzZKWHRJcHM5Z2ZweUxBbEJ3cjJncmxwVkM1VGd0THFaWkhxcDNkbnlFajdlV1ZHemMzMDhxYWJZSDBDejhVQmNNQmc3WVhjakE3OGtsRHBGWXRpYno4bDBHQVRDU0hXWUxEWmswZkwwbEZJMWtkaXdpWnp1anIwVUI4TWFtbk9wcFZoSm5L","upper_bound":"RENrd2ZRRHNDVXR4Mk82Tmg1c1VUbnVTcFJXVlQ3UExVdE8wVHlxV3pvek04alhuUWVUaGp3VjVwczJmYU5nRHJtUGlQWGJTQmY3WUVXcDlUTG10N1ZHSFhzZG44Z1FVZ3dRdVlsZWJrRTZIUVdNbnBQbGZ3Z0VEQWRwbnY0eEl0VG9Sc1lrblJUdjljWHlDUDJoaThnT0l5QmFKa1BpYTNnVnBuY0ZwUFZ1bnJaczdncHowZlJDU2g1U09iMGlGc1ExNHpXeU9LSEdOR21Iajk3TGNmcEJkM1UxM3piaGdDOVRRYlFyblVJbFdFUkFJNDg4cENsdThINEluYVlWM1AxZnNMN05kY2Uza1J2UGFyRnZFM0tOb285cjhLQXZNRHV4RlZmejFkcHpO","repeats":1},{"count":459,"lower_bound":"REN1dXcwajlaUGFuTVdNZUozNldsOGFtYTdqSkFwYVFhcXpsSThXQU5jSE9uODh2ZDVESndlaFY2Q3RTNE1FU3dBdGg0bktnWWU4N3JZU0xmSjBCbWx1bHo5UTBlZ2x2aHJuR0JXUUJMTW5pemMyRVo0TXhDQVBIUHl6bjc1dFFRSENleEh3NmVZZ2FzQUtETVZ4azZQTlZ2aDRlT2c0b1dvRFdtV29PMFd0MWtWUGlpVGlBNnRPMEVqekV0M0pIbDROcno0blNlb0NuU3loajdPVVdYVGRCR3pmM0VQYkQwYXBvTTRYTThrY3d6bzMzNTREUjRTYzR0MWw0STNMVlRhUmt3azdjc1k1enVwSFdGYkRobDZTWm9wMXpsU2FITHR3NnduN0NvaU1wYWJXWEZkRDBidFFKVDFGOTJQS1JQZEFZb2c1MVo4REJZb2oxZGpYSURrUDZnSFRXZkd5cXJYaVhHN1dkTDVWQXVOdUVLOFpPd1ZzQWd0QTZzUDFXa2VqTktSWTJzOEc4a1VZTHJoSnc2VmV6TzA0UG04ZU8yZ2dkV2xtd0Z1UHR3Tm9telNTaTNKb0Yyb1JwWWJBdDNSWjJ3amw5NEw5SzNnZVVKUDFJ","upper_bound":"REtNUHQ1dlA0TzY=","repeats":1},{"count":467,"lower_bound":"REtnREdDTTVLSDRGVFFmZVNBNWRZN2VLMUROQ1ZFdzFnY2JzZHFyaVI1T3lkZG9FS2FiVURXSHZvT2xIYkFWZ2p0d0lGbkJhMVVGSm9RWUFwT2ZlMkwxMXA3d01SeTBmMFJRT2FyUlpnTG5ZSmpkdGZOaWVFWVFEQ2tqQlVBOE41R1RjWDU4QlNjVndyTXI4Q3ViS08yaHZSZTBnTHBrR296Q00yY1NVNWNrYmFNWXN1YVFSbGxDcElKU0lpVndNSVp4cmhXelNUTGVRRWk0QkhsR3d5dHAyZlpSanZYdDV3dEFRVnpFQ3RBN0NCR3F6MlhHRG1QSjIwV2VVdU9KRGMwcW4zZjg4bWlXUFRTcHNwenlGUmhhalU4NQ==","upper_bound":"RFJkb2RyUEY5OWRPRDlwT1ptUFJpMHNtdDJTdUZ4UUl4SkJzdXZoN043Zm5KWUR2YTQzVVBSblM1Q0pqVTRoeUM5bFg5bzVwczdmMUo1Tnc3NDdhV1JSc1FQd1drb2NzR2tFR3c0YlVmbnplMDBrbDJDMUdDTExzVk5qRkZNOThVWFFpNWVsMXhIQnFOdEdRVTBXeEgxYzFHejYzUThHMm1XU2d1a1JrdWZCZ3Q1UEs4dktjSGlRYVhCbjB0ZlJib0FXS2RXNzVlT0tMaDYxZTBSbXp6Y00wOTM0ZmFKUHZFSkxqSA==","repeats":1},{"count":475,"lower_bound":"RFRXRzg4RjN0U2JaUDNVSFg5WER5TnNDYkVTUjF2MUZtWjNrVGdCRXZNOExqUXdSRWZhMWJLd0hveWs1akdrMEFvbjBtNHF1WTFkTHF6b1BDMVdtVXc4cUdlVWFIU3A5WENmaWVZS2JlMGg5M3NTSEluSGJJODR6WVRZaTBzOXM5Vm1nT2pzMnE2c1JLS25WZDVGWjJFNUFUeGVDVlNYOGRHdm1LVExXWGVRdHpOOUpKZkRhV2dMd3pMQnY1cHhFbnU5cUVyWmhJekdLdGJSUnpBUjcxR1dIbEsyNjJqNGl6QkN0Z1d6dHNWdzZ0eFdMVjB4cDU3RTVlSkJoVjZFczVGd2tLMGRHeHVhZnZkZW8=","upper_bound":"RGJsdVZsWVc0UFk1dUl2eGJxSE9oY3ZGMVd1dnQxODZvdEwydHVBUzQzdnVCYm1XQ3RFZXhOTVhMZjQ2V0tPTTFNUG0zQ3c4dmtiNFJwNGdTaXl6OElEMUJIQ1JyaUt0ak9MYUNmR3BiR203UVlnMHo2dWxoSmd0ckt5QTlHOVYwS1JERFZJcHI1Nld4SXE3NVpGYU9uY1gwT3FmZ0xMVXpTemFzVVF4d2xSSWF0amtqZHNlY21FOFg=","repeats":1},{"count":483,"lower_bound":"RGN1ZExWN1BVRTFMRUJnTnRPcGlpSFdHc1IxSmMyUFNDajh4SkdlRmoxckp1V0h0bklJNmxYeHc2SEo1N0taRTM2MUZKYzRuSGJ5NHRackw1V2tzaEx6OUh2aGVCODhBYUxlcVF5RkF2U0FidE9HZG44YWh1UHk1U3pLTENaREh3QWlCMWh1c1BxaHhxNThVcUF4cGtzc1R2dGtvTjRVNVZsNDhYWjNBZWRZOUw0Y1RadU4wbVYxYmxQV08xRnNXYnpTQTB3RDlPSE5ScGVvb0RGSThTaTdLS1Y3NHR2V2t3VFJBc25XS2FKUExMTUswSzdsQnNPOEsxM00yZUxPY2twQm5SSXd2a29XZTZIcUlmVk5PNGZJa0ZaU09yZzFuc1NYc3QzWnA4dktjT3ZHWGZOcUN1UnU2TGJGeW91dlIwbjFrcDZjbkhUQzNFTWdiREJ1UTZTRjVOQ21aZ3Zla3pyWjBZblF0SkJKemtVT0pTdVkzOU94U0R2QVUweThRampYS2JEVkY5NVZwb0szUGpTdlpObGNmcnhTaG1Kc2xMNjFKcDNxRFpRSFhXbHdndTMyM0RuM3NhZzFSMmw0TlZJZnVwRnBnUmdtR2lOOE1kNlI0NjUxcmxUNUxMdXEzVUZJbDFXV3VsUTAzdWU2ZEZVSjJ2M2hsVkgwSFN3dlpnWkdwQldnOVQ1TlNIaGJMeTNCdnptSjVNd3NSWXpXZWVt","upper_bound":"RTI3NkJKRlJxbjFXS01IdG9pdHF1NVhWSFFnZnZzT1RUblBDUTBQcExUMERwakdkWGN6U3N5NWVZcE5Ua3dTUXA4RWdnb0hGYzF5d016dEJ0dmhmMDFTbkpmNkJ5emtGV0p1WDd0Umt3UlhvMnllRkJucDNPWndIOWpOWWVBd2xRWGRaamJ5aTFnNlF1TVVMTW9Wanh5OHl5bGFpd1E1WG9HWnpWQ3gzMmN0SGpHS3oxbVVRS2tBVDJ2RFhyUUl5eEZPVmZZRWRxaHE3NjhCNmdVQXJjT3ZvM29jbVZZVEZQU0pFSndYTDZkQ01sNzQyWE8xeVVyckxWZkZZT0YyeHhvdHFlUjFVQ2dGYXpJUU9IeVZaalVLSkZHWFVTM1hObmhHTk1oYWhSVmJSZXdjUm54M295UnFjbGE4cGF0OTJiNDBIN1RYNGFVVG9OSXEwVTM1c3pCaXlteDV4R0VoelpkQVk0UjBaR1BEcU9iMkJDT2dTSk8ybVZ6emdsc0diSkloVEVnTGpveW1BdFJWV0p6d2g0Mm50ZnA3Uks0RkFmUzZvREZPRUJvVVFQR0RyUlFYbkR2M1d3Z2U3N2xldjhkYlJ2NEM=","repeats":1},{"count":491,"lower_bound":"RThVZHRGNVRQY0NXSlROMTgzZU5Cc21tc0VYV2VzSXVBcngxclZnUk5WSldOWWU1dmtPRURiWTJuMzYzUUZFSmVUUlEyaWFOcTJBSDVwVno1WkNyYlNMRmNWT3JKTWxTR3lwUW5xWUg3ODNZdEk=","upper_bound":"RU5tdGZGTkVIYk43RlUyemNDbVFuclIyb0U3dHFvZnJFV0hRMjFXb0FjeVR6dktWWUhXbVJIcUdZaTIwTmZNektzc2pEdVVBV01md1BiN2FGSDdaa0xpeWJ6SHA4cEEzc3VNUXFpWDAwbEFTVnlnM3Zxc3FUNHZleENQNmtHOElhM3lrUHpCc3JTQlJ5QjhVQkJ3MzNUcm9OSTVRZjlVNlB2WFFHMjZEdmRkeHIxd2NoZHU1V1k5SVAyV0hiVFoxdFVpSTlhN3dpMWttMVhSTWxNcVg3Y29lUjJZNjFNYlh2MWNhSDFUYWppUFVtZjNWOFBmT3BIeDZKVUdoSmE3VGdlOUJnU25KdA==","repeats":1},{"count":499,"lower_bound":"RVNERjhvZHBVNlQ2N3ZtSjdMYTR0WjYxSWdITEhkbk1JV2VyQlVIS1pUNjhQV0JrNWpuZks4QTVEaERsbW12ZU9kV1RkVnB2RVBhbUZybGF3YVBmejNqU2hZQzNyR2phRWhlT1ZEcGtlWXQ0WHduWm1FUHFrMTQ4NUVJRjUzTzNSVmNJbWxTc3RuZ2V0SHM2ZDZ2Smx6c2N3TVZubkcwakFEd1hnaU5UcWtISEVTMWkzdm1vU3VLOQ==","upper_bound":"RWh6Vk1vVmZCQk85RDJaQ0JxekVwTExMMWFXaHQ3","repeats":1},{"count":507,"lower_bound":"RW12YldTMm1taHJTNUZqVk1tenNNY0pjTGpKR2dsOXl4bnR1ckpBOTFCR0dSRzZDR0FlYzd1UjdRblhsU0hzaEs2Y1UyWjZ4R1hiMWMxTDhZeU9BOTU4SVA2SjBuVlZiMERndVI2ejA2Q0g0YzBqMHF6SkRqb2hVcnJkanZGcGduM29jd3JoSzA1WGg4aWJwUW1LQVpxOFNiMUFIQXNPbDhHZktJRTY2czVERmxNSzM4Q09SdnNVT2xRZTQ4aEJpRFZHUXY2QlkxdWFsOEQyVVp4T2RCMXlOTTlPZ0R4QXdvdXpiaVAxalY0YXNJeW1CRXM0NXB0M0MxQ2JsbnQ1dEJvUnBWanZjQlc5aWlvb1Q1bUI0N3ljeHE2dDl0Q1ltcmFiRlZiQ0V6U3c5RE9JVmhNbWVvUTNUMG9lQ1dLejM1M1NraURibVBTTHpvWUFmUEpUYTZ6YkVpTDN1ODl1UW1sQk9CVmcxUTRwYVhNaDRmWWd2NXVhaXFMM3pGR29HYmcwbnBPc25BcFBNVlM0VnhUemlsZUZHUjNPZWkxMjE0QVZmNkp3UDI0Q1ZhTkZRVEI2","upper_bound":"RXhLQkNhRlF5ZnEyTmZtM0xGVURtUHhJS20yZjNXNHdacUE2dXpwWFZJdzNXM25tQ0VDdW83R2dBOThWYmRiZ0tEZWZjRU54M2xyeW43S21VVG9laE9FUHdNWGZVTEdFcE1FWDE3cTg1eG1ndng1OEd4TFFUWkZ2WFZPVlJYZmZlazRnektYcWV1VFIxSlZWWmF1cU1YZm5Ia09DQ2lyalNpR3doYkVDOEJWbkVlcXBxTXJrZENKWUlyQ3VWaHh0QkNYOENleFVIZjZpZ2JLSm5hQjFNa2ZwZTdiS2ZSUXhaaUhuZ1FYemViUjNEN1IydjVrZzQybkJWVXJUS1BpZDBHZHlsSTV5Wjh1STR3OEhUQWgzRldJS3d2RHV3SlRUZVdPeGRoTlFpeTdRZUxxY1AyN2tTejhka0EzTERiU1Q4WFJMT1ZYVGFUb3oxSHZiVUVZNk9CVkZmRk1SUVgzZzFOREsyZ3FMTjRwVFBGaFAzdEJ0dUNBNmNUT2NuemVvUEJWalA3Z1pETExIY1AxQVBPZzEzUXA3TU9SZURyb053ZWZQanNCbnJsNWZaa1ZDeEJvSVRodTlWTURRMVV6a3BuSERkb09BS0JSWUlKV0ozem5zVEJ1amtKRm9ka0ZibmF0YjBFYjRhOEZWempuN09IT2NYZGNkdGxDSFpWdk5KSlZsVGZFVTRNVUlxekRQOE1lTzJTdFdGSlQ=","repeats":1},{"count":515,"lower_bound":"RjBVaVNmSDljUzJoY2x4Nlc0Y3F4MGhRQnQ4NFdoYlBGQnpvNXZzYUJINnRoZldlM2NLQncyUmZybDFmZWJHUmtWazRzZGFyb1FqWm9sMVFVWlVuVmJTRVRHcHA0dmNQRFdNWHZ2TGRxV0o3bnZZZ0oxaFc0VElRY2NvSVRkNU5YQUh3VUZ5angyaWQ0bm1sZ0xkQ2plYzNPVHRGcm5uMW5hVmlTQTU4Q0VjaUYxSVh1NkZ4UUpqV2JQOUpISlN2MGFIMWhiamRtN1k4TTlYU2VmaHpaT1VTdnVEcW5nVmJ6ZzNRcnFQUHN6V1BlREhHc0NtOWpkV1hqdm02YUU4ZmlKampXY0NRRUdjd1h5c1NRZkg2QjVQYUtwZzU0OWRjMGlwWmd1YjU4TjNrb1A5eE9xcm9HbDFxcVNYSHJsejdhNXUyclY4WFpxZ21pWTJqdGw2N3h6ejFJbkU3V21yTEluZ3lXMngxN0dmMjd2eno3OEtacHB1cno1Ym03cDZWVW92SnF0ZkpidWs1Z2RkeTJ0SGN4eFB4ZWtSOVk4ZUphVXBpVVBPRFY2MWM4S2ZzRm9lNEZvV2NGYXA=","upper_bound":"RkJocU9zM3BPMUtrd3lHZUk1WGRKb0gyOFF5dW1MY1k3a3FGVnVhcUJ0R0lVcDdDWHRseDM5YUxsNWIyelpSRVR0V1lXYlhkOFdkZ3FGYWV4R0VSbW83NmJZd1ZNYkxaa1A2NEl3ckRSMWdUTUNDa1ZLbDc5cWxWc0NlTWVMbkNlT010c01lVFo3VXVzcFN2c2kyVm9DenJ5UVU2RHZNdG1BalkxOEV6RHVqaGs3dWdnWGo5RkxUQTRVM1lVT0RvcGd1bUJobGJpaXU=","repeats":1},{"count":523,"lower_bound":"Rk1IUzFrMFNNbUtZTDVvNDhYSjhqRnVnUVVLaUxWcWpPTGw1TUZPUm84Sm5wSFdWTkhyNDQxdU5LcXlTNDlSREpZQmhJa0pSR2hzdEdlUnhmU2lWTlRMVVc4NmJhdXM0OGdqNWh5NUo=","upper_bound":"RlN0U3VPNk5tRkFRaVF1THFtcUgydXVJaWt0MkphWHB5djFOTmlTdXRURVJaNklHS2daOUFWS1ljTGNRYzIxd2YzVHNteW9mZUl2ck9CcGNQV1oxd2ZyZHM4UmJFSzlvc0hlYUVTSmNPYm5QaUI4NWF1S1dHSVl1WXZaWkdyTlFJNERRT2VCR053ZDdxSDlyRTNQUjl3QVN5dDlXMVRxblBiVFkzZHgybVpCUnhVUmFsS1MyUlkyOXlwSEJnSWt0ZHVxMXNjcGQ0eXNu","repeats":1},{"count":531,"lower_bound":"RlYxNFl6QmUzMjNOMG9zUklDOUZpMExrMnF3Mm9aMXhEUDRjYm9YQkNBRmtFQ2pPb00yVHpFRTNPbkJKREdSSGtveEgwcEN5anBjdFo0TzVLclJmdVc2RFNjVEVyakpFcXBZVHZpQjE1ZzV0MEZZd0pWNmYzQmdXcEF5ZXBPQW81aUxGUmxoV0kyS0dHM0tjUHQ2SUlRYkZrbnFOb2NMVUNhUW5ibUd2dXRPMElxQ2RtNWFSSW1aSk5uc2FVR3AyZDRKQVlEMUdWWUNmTWVIVERXZTRacHJpS05yRlJNM0NFeERsRUNObkd3ZEp3d0g=","upper_bound":"RmFtR1BGTk9EdjJreEUxa212bTZIcHM0cWl6MTRCVnlqYUM4bkVpOFJIS2hYVjlRZFdGZ2xKMVMwU0dPOFlMZXRWZ2MwYUl0OHNqcE9SQ1hiYTZwUVR4emx3OU44UmRNRU1iTHdLODNLclhDUlNtWDFKZDRNQ3M5SlZMM1phM0xpTGJtMjhPTHQyNXQyUFVWcjNtT2dNamRtRmQzenNWTHZYajUwT3ZRYXdMbGRxakxaZzZxeWlzbE5iaTRjd0xJTndtSzM3a1c0V2k5eDBqZjljcG5iQ3E1cmZRMXF5ajlQ","repeats":1},{"count":539,"lower_bound":"RmJGMFFtRlJTMEN0Y2JmamlOVFhFYVZmZFFCOXo4QkpJeFBjU2xieWUweXV2U3hra1ZjckNxVGFKWElOZE4wQlIxaDhMQVhnaWNJMHVJcWdTU1NZcHJMRkl3aXZ2am9VaVdaMkptcVVXdkNBUVVVaGVrTVJqVEdTejZLZFo2Y0ZrajZIRE53dlF3VUdpaDQwTzZMaHlEeTRpc0JHVmM2TzFBZENGNnpyRERZ","upper_bound":"RmxzaWJkcGg1WHZvMEs2QWdHNWxPcDVXYWpmZzVEY1FCY3lqclo4UHgzQzRHdGZOOVZORVByNkl1TGdyQTlUTGJZdEpjN0VWMWR6VG1ENWg4UjhSeW90bmFnbTVQb2pZQmF3UThGbjlaZUM0THR2S2lTTUlhdFE5UmgzYzZzdThoVVpYRHJZQUZIbE9qSVE3dWp4YmN5em9DUDFmS3MxUmhMd09NVnB6UFl4S3oxV3kzVEtEQ3pmUWxuTTdsVEpWbHJaNDBXRmw1ZGxJdmx5N2R6UHNDT2lTWmJTNG45bFRudGZTdUJ4NGJxWEtlT3VnZFhhS0VQZTVMcTI3amk2U25qNnh4SzRHWW5IbVBOU3VuTlE1VHpCcmZWQlNlZEhxSUdTOWpkbHk0ZE96U1lnc213U1JnR1c3Zm1pbmlLTVFuTkVkSEJxSzZBUzZuRnJBMXVOSGYzRm4yM3dVQWRqVjVPdEZRRnJjdUE2MTJvM21zYzZlTjZweUpCRlBZVFFBQlFrblRKT1dHalNJRktiaGY0NTBsS0xNWXIzcTFMY251RHlVVkUzQWVYUXpEdDNuNTA4THdUN2FrbWpwUjVxUzJOblpDS25uRW9oemFtZTVpVjd3NHQ1dzdObXBzc1VhUmpGSnNWa1pFdTlISThJWUQ2ellSZWU3Q2VOOEw3TEpJdzJuMnoxM1pZdFdIVFg=","repeats":1},{"count":547,"lower_bound":"RzJrU09sZmZCbnZUVlJaQXBTNnYwNXNGY0hPQUVWTE9ZQUxKdjhaRVMzU1pr","upper_bound":"R1BGQlNNQ2dzNVNQNmZHcW0xMGVWZTMwdlFibHZvY2pJRVBTNUk0NEVtWGtTOXhJVGI0ZDU0WDZFdVNqS0NPWlpsVHZmd0JJRWZ5ZDFuYmlTZ0RTQklCYjBrVDhPTkdoc3QyTVB6OVpoVHZtR0taTnlVWVpGNWZOWnhVblZKQXY1bGxhdWo3Z0FNZFNEQmFtVGFYNjNweHE4SFg4MDF4MjVtSU9CS2pGYTE2UlpSaDFxSDBYN2FsVlJQenJXQ3NjdDBwcjdoUWM5OHlwQlFTTXJHeHFHU3Y=","repeats":1},{"count":555,"lower_bound":"R1VpS2hnUjFwdDBkRU05OWxQblQyeXk2VkZ1d1pjanFnQ2lqek0wZk1vcWxvVUdNYWRGazF6YVRHNUpGcXByeXg1M2NBRnNZQ1dHNFRtVTh5ajNOVUhBNHpDZWtBOEVJTWwxb1FMTm9zMVlsWnlEUDExUG9aWlVMbFZCV3BGYXlPeHZrNEhWdFNkUlNXYWNXMEdSNTJBVW1PcXQ1Um1UZjVUUU44TkxFVkh1N0hxaVZvVTZZZXMwQTAxalVNN29VcXZGd2pXWTNwcVJqclJzNGtzNlVJVk1LTkRvbUhUd0pSalhGWG5uaHVPeWRwcGFNQk1pR2JIanFPVlVzYUQzeTFnM29lSDZQcHAzeEhwYmFrblk5ZA==","upper_bound":"R29wRFRMdm9PZHI0d24ycTFwZ3hHdXR6VmNzRFV2QjQ1MVZ3TUcwVE54aUFhSGFMQ3lISHpPRDdzaVh4Tmxad05tUElVV29WN0gzZDBRem5ha1hlbHlLSHVYNldhbFA1dEJuRmlsZjk0UEJkeXRwNTRQNlE4SXA3dnpnWUFBQnk5eHNoVFd5WXFEVzBLQWVIMGV6dHhHZDZpemREbUV3TEFsczJlTW93aU9nTEl3ejV0RGJ2d0VrcU9xWVI2WDl6cFR4dWFvY3lGWTBtQXdjUnRUVGp3UUpVZk82TDJRZERDTDY3U094RWV4dk1NMmRTa3Q1WnA5aTE2Zk10enMzQm05ak1QRUo1eG9HeTZrZWdxeEZXWW9kbVA5SWRHdGlPZUpNbVA=","repeats":1},{"count":563,"lower_bound":"R3FTazU2YWtsQjJwTmRMUkp4VWNQc2NHY2h5MHc2WEZ5NmlOc1RrNFBBWWlDRDlxaTRja0JvVkhxRWc5QXZ5cktmcm9FOXc2ZWE4OFZzTDdNdEhaY0IyckNEM1ZPa0VwUEZNaGtvNTdj","upper_bound":"R3k1MGJwcDBYY1FKYk1ObnhrWldoTlBteXZmMUQyWEZ4c2dTb1lsck9wNnRBaFI5ZnJUZ3ZkOEt6bjF5MzUyYzdmVm4=","repeats":1},{"count":571,"lower_bound":"SDBRTEVUMGM2blljM1QxQm9USWdYYXI2T2gxc1N5RDRoNzNYTWZWcUNaQUI2NDFxRTYxUHY5VGU0eloyVDlw","upper_bound":"SEtZYnFNT1BKOUxEREg1eDJkWUVlQXJ1aFlUODJ6WFU3MFphODUzZjdjUExkSUg1dmNuamM=","repeats":1},{"count":579,"lower_bound":"SFJ2cVgwQjRURmZnZkVTZGRNTm1sTlJsbDZIVXFFc0h3ZkhlR29ITXI1dVR5TktYUWVqV0ZpRWFSZzZXTW51QzRyU1NQeFBza2FTVFlCc2hWWWVQQ0tvOGxaTUhUa1hHdHZsQ2NWQ0hVMWVKR3ozMXRzaDZJdkw3MXRSejNjMDVNTGFZRHBTZmdacEY1Sk5CV0MxV3drYnpHc0d2M3VSM2h5QkJHWlU4R2l4WlN0T3RmeDBwMENhR05HTXF1emRNS3lSaE95cWtvVG5rbFZ3Q1JNbVdZVG9Cc21QSklzSkxBNHR3VVhIQjBvWk1CdENWRHBSc0dOdDBmeTM2cE91NUtHdk9TQkJNaWhmS3A0SWlUSUtKNExhTVBaS3A5","upper_bound":"SG5KdWtFVU9TMzI5OFdadENlb1Q3Y0J3dDk0WTVqWkE3dGxxQWxkOVllVXJmZnJQZkVBR04zN09DS0RZcDZSTWdiU3JacFFtM2ZrQjE0dmlHdDBOblROaHdseUljaDNjbFdzcWs4eWlzOE9DV3AyUFV6dmtlcUI4WXVJRzhISDA2ZUt1bHlRSkFhSHBpNXQxVGhZRWxOcEEwUlN6SGNjU1FtODNHdTBOelBwbkVFMXpRMzZpN3hBMHAwVlZ2SHlUOW9CNXIyN2lnYjlZUjk5VmlFY0FTUDVhcDJZQU14NzQxNFRBMVcza0ljaWw2VXNUaWNhWWdVdEU4SEVrM1BGYUl4T3IzQW9ycGlQOFF6aWJtTmw2ZXRSOExGb2xjNUtvQU8wU1V6VW0wMVA2Rk43TTY1UmZCZEM2bk9lNTBET0pnVDV3TjdYVEJEVlRQWEFUWVZtOVVKa3Izd043TmtVRW9SbUhoSGFuOTFIa0hxSTZmaElOM09haEJrcm03YXpBek1xVk1uV05QYmNtak5kcFhaNGZoaVdob2REMFUzUzdRZ3FTajVFZlo2YWoySWI0Y2NMTTJsS0cwSktrQk96Wmc4NmhnanJvYnUycDRjbXNHQlBhODdjRXdBYlg1OHU4UnNtYVd3Njk3NnBPTzZ6a2g2M2MzcnFndVFycEtyRTJFZnFJSDN1d2V0YTM=","repeats":1},{"count":587,"lower_bound":"SHEzSlhwSDFGd0Z4UDJXd2luNVltaWFBU2gySWZrWGxYZnZ6Q21lY0J2dm5SRjRmbmYxTE5IeUNiaW5rTXNuZE5Jam84MzNhSzdIMXp5NTFlVzNqcW4zNFpLbkEwSVFJVmI1dUllWHoxSXh4bHZxMmRjaXlWYktKV3lHQlg4bFlaQTJSdTFPakVEcEc4a2RZVVpGYjlqZHBZOGxGWEJ4QmVGalNMSTRTcEN5dEZCeHI4UjlBZUdRQ3VBY1JGTXVFRHc1SXNwdDAxdmFOaVc3ZUlGYTNEd3U4emd6Y2ZIT1J4TnRPVUtIRU1jNlBpZlp4RkcyMmNwRVlWeHdZUkxiakR3YmZGdDNxeDBiTkF5SzRRMDEyd0hNTWVRNG1hZk9sZ1JlR01McEpGOFZLeXBwQ2xRamtJdTVjMFN2YTBpRGQ5MVpRc3E0NEtKR0ZaQlVCZ1ZhNGIwSWJkcmZEZFRrUThadkdFRERSdWFyM1lRRTBpTXVFenFYRGw4aHhUZFRHRWJVeDRVRDRaUEE3WmdPVA==","upper_bound":"STJwU1JBckNYOFNvQUczVURzWVVSR05hUWZoZjJuOW9SMUtIV1dlYzlYSDJmQ256eVVNUWdma3M3OWdSZXVhWXhTM2Nub3NqempoNnBaMng5MFh5","repeats":1},{"count":595,"lower_bound":"SUZrTGk4bFU3TXpNcllNSXBGVVY2eExKMVdYUWc4dzJtc0sxV1Vvd25kcWlOV3RFVFZoRWpaZTI0b2Jmb0cyZUx0WmhPSkZxVUpBN3BTUExLbGlRWmI5SXpTRVJaSnFxMVczNGw1bG9rZ0w3amE3ZnM4V2lqMDI3UWR2NmVaSklrdXlRdHNHdHM1Z0xZSVVOTmk5bDA4OEs4Y2tpc3piZ3Z3dXUzVlZZZUZkdE1wWTRoTlhHcTdvRGFMSDJoOU9ycGpGVFgwZTlRS0JrYU1hWGNlTXp0WEFRSE5xdUl2TkloVEdyVVdBblFMaU5HU1FuTmpmWXMzZ1UxcUtweDA4UUZwSm1hTkR5MDFXd093elhwNDhYN0ZpRFJHNVgxV3R5UXJKa0c0NGF3ajhhRE1udld6TzlxM3hwUzRXUHN0ZG40dW5lMElaVXlMMDIzU0RMOVIyWlZyYVZvZWxMSXdmNkxocVJjOGYwWDJPdDY1WTZkV0JvWFpFU29kS0ZjaWV4cmZqalE1Vk55aWlVOW1NUmo1cmQ1Qk4xdENzekNISzNpak96YlVuMUJuNno5SmRYcnVQVWVvOFNETGNQZDB2WGNrZGk=","upper_bound":"SVJlTTU0OW9CbHg4NU1EZU5HNEo3UVpoZXFCdGcwb0wzZWVVY2tTTGhNYjdhaDZoRnNLcENjblpCZ2IwOHdQdnI0QXNWdWxaQjM5TGpHcmVxVUtjYmdVTTdqTHRCeldOa1FxMndYOUxiYlByZUlOOU9EbXFDZk1Nb2c5elU3QVJLV1c0N2hMQTRCUGh6VEtEUVlFSExPb2YwRFlKUDZBMXdWeUZQSGRqdUlLajFpRFBZclJhTVRHVjE2SjdKZXRuTEow","repeats":1},{"count":603,"lower_bound":"SWJra0c3c1FtQ3hjMGFwTkQ2S0dJbmlETVk2TDVHTlpESmIyZ0hwMUVCbk1QS0JFeWRidDRYeXFqNG1mM3VUVHk4cmlKUzJTYjdDQjFqQWxUajJndkpIa1JscjE3NzN6ZVdsVHRiT3BsNWFxN21ubmhDdmNVNk5qdlQzbnY1NmFRRVV1Nmc4d3oycFFlWmZWVzJPcDBxZzloak1DVFJhUkZXa0toTWNsU2VEbFNyYmJGVnF2S0RHblBqMzF4WHVVTlk3U2ozVjFTa2N2b2pFVzZKZ0JEWHdGRlFZejFtUnNoYnhDR1pRbG1TMnFiU0xoRTBva25OOXlXUE13TVhnZjBLQ3F3ZnNPTmtNRkx6VG94cUM1QkVQcGVEQllDNDMwdUE0cEREM3Y4","upper_bound":"SW1aaUEwRzhJZEJJSU8zSGRUNnZKbnVXdlllVFh5WGRTa3hmQzU1b0JVbkhBaVdGZ2g4YnJ4TFZVTEZVN245NklSSXExSm9BWTBDZ2Z2SFlxeXZpNXRHT0Y4VTkxdEsyVFdSMDM4UDRIWW9pWElNQkpQM2U1Q3pEcUYwZDNHdVdiV0FyM0lRTElYaExpOU1hS1pId1A4bnZaRzdsbDMyUzFrSVUzcFZScjhXU09ZSDZMUjZGeWN3YUJYTzFiaTlMZHNmcjhEZVNSam9pYnpiaDhucmxnaGpkeFN0VEtkOWtOc083Z29ad2FBNzZDTEU4UnRSbm0yQTg1UDZZeEdsekdyNUxCV1ZuU21nNkJHZXo5bHBmUGwwTnFvRnhxbkZXb1lKeVM4Y2ZpRGtrMw==","repeats":1},{"count":611,"lower_bound":"SW8xTnJFUVkyZzFyUXdOZ3RwdGNsckZqUHppVGJ2MDZrUlFqZnJKbk8zZ2hnN1BmaWt1eG9aRU9TSlB6MkxJM1ZrWkhjOXR0RDJPV09BcUZIU2F4VjBLTVlqTERkaUtxdzN4NjNSV1lRNmxyZ241QWE2bHo1dFVXZEs3c3g4Q1RIbXlBTlZHVGVRUnVubnhVRlVISEpEcVpXbXc4Z1B6MVAwWnNORHVROXBuUU9SN21IMk5OU2NzM2xaZHR6bUFHY3Rxc1g1WFMxRFNuYU9heDQxNnA3RjlNRksyb2RKTTdjdDhmYnp6azhmYTNLSk9nSVhHR3NSazdVQVlxZWdHZ25RV0ZOUG1zZnV5RnRzZ2hWRUZwNm8yUm9oalZUOXNReGVZUEVDMURWRVl6NHlLOXJQMGE5RnQyRzRHMVdOSWo3Qm1VWnM0OE5MRUk2TG5ieThFMm1vWnNxbFVoV2tlcjZaWGNlSHA3dEtuVGVzSEE4elhKRXNsamplbHBvclFoUVJtdmoybmhnR1Q1T0w5b2VsOGgzVVJv","upper_bound":"SXUzNkduYlYxYk1sUjU4QWFycXRIREFaanF5eWxKeHM2d2RWNVVXQW4yakpxWFR2OUphRTV3SjQ1dmdFZjBma2YzdVNoUld4MnJGWDNEcTJ2eUQzS0FaS1BYUHpSc1ZKQXRxY2pnRUNrRDVZOW9qRkxIdw==","repeats":1},{"count":619,"lower_bound":"SXZRdWU2SmhLazF1dFhvaU13eEJLaXhFY3FPOXM3YkhaSzhWcnFkTHpPTlRKb20yNllrdkhzMmVDb29nZ1hWNVlrWUJldjBIeWV3RGM0d282MGM1ejlOajkwYXBVZ1lEUVhzTXhCS0o2TTJIc0R4UVJMV3pNSXNQUlVBdG5ETTNqQkRvSXdUYldLZER1bzlZdjU5ZmRUTWlDUjFVMEJVb2VqRlM2RmdqNFhDSDU4WGJRR2JZdU1CMWh4OEVLTEk0NTdHZElTd3I2MldmYjNKN3pmWGpDRWZIODNMWmhIbXVOWEt2VWc3dDBIeklxWEd5TDhlZXdFWERlaWJPRDhFazhFZ3FOT3BPUVluM3VPc3ZzTUJKd0hLZzJlNHlXR04wdUJySFZiRGZNMU9WMlB6SDRqNFo4NjZxYVRGeHU3OHQxVkxCa1FaMHc0NW13Qm9vQjdieUxUWno5MnVzclI1alRrOFRZTGJLOVMwaU5kbDZhYlJTR1BRUzI2N1c3WklSWVZIY3p4dVc5REIxUkV1blZ0blZEUTdYQ1hGOFQzOEp0ZXM0aURwRGZrbHpxWVFvZFY5bDdmS3dldEhWVldMVWxBZ0NCVDZPamxxb251VkdudHY=","upper_bound":"SjhvT3VuZ3JLbEVtVktITnFTM3NSSlN0RUpiTzlPaUMxUXcyWGxxb3BCN25LTUQzVlNsWVpkSnQ1N3g2SnR1bXRwdkl1bHlXb1pyaU0zMDJjMTZUMUtiRWNtR3J5bmtjWG1mbFpmRjlyc1p4dnJQYndFTlJnR3IzbDdod0xkUjFnZmh6YVczMVNtUGZTTEx5bFpsV0JFNlluWUJGSEdUOHFKc3VFaXkyYkZmaHo=","repeats":1},{"count":627,"lower_bound":"SkRsU2VNdldKUGhDaDZSM2NmTXRodVRqdlQ0TFlLUFNrUDIwWlFrNzhoaExpOUxhSkVWckVaRnRiV3BuUTRhbDVEbGFHVm5EYXF2MUhReFNBenI3SU1BOE54OXkxcnFUUmduaW5XY2s4N3JVbGFYcWQ0YzhkQWJET2Rsc25pOTMwRm5TcXRCT1FKZU1yV0ZxQjk2eWFQekdwRmFhcHZxMHBTZmVyODgyeThaVmlRRTVyRkdRYjVrc3pzUzVIemQ2RkJUOHpRcnlaMWltQmFHTFU1Y3hkaE81eFJiV2NlUGkza2Nka3hJenc4NHFZQW9FcU1IclJHM2dIRXUxQjZRZVFTcTNPbWxGYzNRR0FJRkd5OHFwQlBvWGJFbENkRzZpSGlzUUIzN09NbTFlSE9NNlVvalY5ejdVSVQyR1BTbXJRbnE3akhTUXRBMHJBTE5UaEtJVHhHVlV5REJHOHExbWVjUm1vRmlNTEIyUHpNWEZwUkpkNkd1VjhzNjZjTWUxRGlxUlZZV01WQVltRTlTUnZ5dGxvUWVwaE9qZGhQWW11SjE2STVwRE9SM3BoTUdhVDM5WGdLdEZXRFROVnJwTFpaVWpRMDF6VjRhcmlMWEM3NzRUbDVRVjNiSVhzZTE2WTNFeTFneHpMTjV0RzRXcDZybktOOEJkZjF4ZVFqTXZTb0k0d1VkTWZycm9LcGVld3RoaVB6T3ppSHNsbw==","upper_bound":"Sk9KOUpFU2ZyNkVoUk1vOUM1bUhEbmdJNmtiaE5rVW05bUhBeUVOdHM2WjVQbVFBWUU1QnNaclFmdnBWbXUxcTdsQkp5WGwxMWtwbG1nZ1YyNFU4dkRlbnIwMU5BMGt1QmdxUHY1N2QxNVlTM1ZWbWtPTTB4S3A5ZloyV0JyNUxKcFNMSGpHNnVTd2FF","repeats":1},{"count":635,"lower_bound":"Sk9adk1WUFp0U1hPdzhNZHNha1ZuR0hLMVFUMFpVcHl6ZW1UMUJrN3B1OWs2Rm1aVVRQTUk4bWZ0VFUzUFNqWmUycEFsRDdOOGZkbXB5dGRLQXpCTFZmYVk4YjJad0ZTdTN0bDlCNThuYjNxOHI0Wlhmb0xkMVdoMWZsSFhmT1gxUVFURmNtVW1QVTFwbzZ3aDFBOWpqOHVHSVVUVU1OSExzY2pyZVpCd1RwcEpGSURSZmVnZ1VMRThXZnFjWUN6NDYwSWE1VmFzQVFpaFNJOElzNzMwNDlGZDVnVjE5bXBWZnNCVnQ3SHp0OHNuQURnWTVBTWxkNTBFM0g1S1JzblEyakFtbHpic1VLSkZjOUI2MnVQaURjR2lDQUlLTkVYWXpxQ2pqd2NoWE1USUtyQ3lNcHJqUERQZ1VKTnY4MENwZlpzZ1B0QlVsRjdVUTRIZlZzYmxGR2tsZUZRVGRCemk4OXpCUUgwczlZbUpucWJwb0pCZVhvNWJaa2VSc25VN0Y2bDhuSkxScU5SNml5M2txMW8=","upper_bound":"SlZJdDIzVkNubEJ5aFlJcTJGVmxFejd6RWpYd0tLdnE0QjlZS0tZdmJDc3p4TzlrMXA2bGNuMUJPdnNHejN1QWxXNVdJZms5UmZ0UEFhSHhaSHFyTHluVHNUeVV4S0x2RGoxZGU0YTIwV2ptNGVIV1BRRlVkcW5sdlZkSEV5blV5TGtkVFRLRkdnQnd3TG5mVjA2SlRYQWd5eFlCem0wUEJwZ3p5bkpyR1Zaa3Z6bnZCWUFvd2pZdUk0N1dKbTJUR3I4U1VnRGZPcVhGaDZKcFlHRGhLS2RMUllBR1gxQ2o4YVRndDI5VjhUOWM4SmxPdmxUakNmdnl4SWhzVXJ3amU=","repeats":1},{"count":643,"lower_bound":"SlZSOHlEeU16V2hXWHFNdzZUcXc5RGg2bEh1WFNYYW5NbVc3QVRwbENhWWJ2bUY5aTBDVmNDdzZCemNodkJpMlZHd05mTXhkNzRrWE1qbzdrSXpJSGhmTHdKR0dVcURHSWRERkJ2R1pqRmg4dHZ2NjZldThzZjJjdnVtWjF4WWtDM2VyYXpYVGQ1cTRKbUY1ZUJYSkg3djVxbU5pbkJTU3RBOFh6bnYxdXJHWWc2bjQxWWhQbWVIWktYNlQ3cVBXdmhGeXNIRTBDZmVVeUhudTlONlRya0NqT2dNOHNlNnRvQXVGVVBtN1FDMzJOQkl0Y0hJR1NPRGpVYnl6cE5hUHo1aG9FS1FOODdJUm5EU2F3T1BkT3ByNU90R3hkSzNqTmoxTTV0SThtZEZ5bmM4eEU0ekRhVHhTcklmZjJGM05UOXNUcEtKOFNTS1Zua0NJYXRLdUdsaUt4T0ZnRWlJMGdZZnU0dERHWU1YOVJRU3ZoUWM=","upper_bound":"SmQ5ckZ2cDl5OG9VMlRkZmNOT0NHQ1FYU01CT0dJN00xc0lBZVFuaUk1Q1RxcQ==","repeats":1},{"count":651,"lower_bound":"Sm5vY2pnRE9yRW1USFU2WGVacFRub3JWQ1N3YW94S0JRUWJuVkhuMzE3ZkE0UDhRUGl3UTIzTTE4T014UjBpcVlBOVFBb1E2ckZQMmtu","upper_bound":"Sng2QWhKWDFzaFBiWnU5d2JOMEdrSlo3SWlUZlNDU1pTd25BNTY0bHR1QUJDbW4yWGZQamxkZmEzb3NFTkRlNjFsSmJTQ2pZeWQzVERKTlN6YzJjVDdHeEhjWW1Xa2w4bksxMnNrNW1QYm0xZU5IQ2dVYzVPYjREU3VaVVo5SndsNDNjOVdTbWhFZEVVb2FTeE5CZTFDdTJwVnl6dDZ4c3lXdmtXUkJtRlRlcjhVMWpmbTlFMmU0aHh4U2ZTTzFBTE91WHBPa21hVmJTZ0ZhV2RHN1ZmZ3RZbFdzNTBZNmswenE1cVBINUtPTmVRSnN2bG1aTkh1emswaUpUbks2Mzc5NkExcjFyZ3d1eUFhZFNScEEwalNjY3VuSVdMZ1Q1Umk1SW9raHBDbg==","repeats":1},{"count":659,"lower_bound":"SnhxSms2S295bUc0RldrSWtkSU9CM0ZHempaTXZ6bDRoWG1JSTNTMWZnendpRHFOVjM3UHJ1dVF5TElsQ1M4T1M1WEowVEtTeXJneXZJOGZHQk9GYzZhOTJDREJsaTNaQVdQY2dCZUhFd1RTbHBSbnI4UWw3clNhUWZ0","upper_bound":"SzZvdGVMbzA0R3ZsNmpCWDBVdTNraDV4dXNWR3A2djV4ZkVPdEJDNGc0OHBQRnluUzFRUU50ejVaVUxXT01nR0dJc0E4ZklhdVkzQjBMM2JydHV5UFplSUJaSHF3OFlaUWt1","repeats":1},{"count":667,"lower_bound":"SzZzZWRWVG5DRnBDU2Mzc0h2cVJ0SnEzbkEyZWMwb3V3SmlRQWVGZWxWTEYyRkVqbnd1VzZTM3NZc3pqc056WHpBaEp6M1h3UkE0OFROV1BlRFNPRTZWUHhQZTl3bmZJV3p6alYyM2NFZlJLb0dDZDZmUUtqQk1wcEdOTlZ2YjVKTU40TmlmejRqTWRPMjVwZnBJdHVGN2dWUHNlbTM3alAwaVJsamRXTXBVWWptRGh1V0tBTW1mUzc2UW1KODlZN0ZDcDZncXZrV0lCRWFtbUtCM0U5T0ZVV2l6dFhUclVzNW1PaDZ6ZlpPMzY1aHpnYVI4YWVHVHNOSEVRcDZkMkVnbXF3SzJIQ01DcllLSGVmSVRiQW1ac1gzY0xvMU01YmJSUDhPTmc0Y3NzNmkwOUtyZnVLUE11dUNyZVR1TnZERGh5ZlNiSzRWQjNyUWdQcFpHTkhNMmpic05WbDNiRmgyZUVWVGdFQUJZc2JQU0hPZHo4V3ZWQ0RmNThBdzBNandValVSYk4xS05xVVpOOThISWhhS2xRZVppbVluajlWR1dkU1BBc0Y0cjRQc3pHVFRBWVl1aEdnZkFwYTR3Snl2a05SZmJneDJ6UmZudHlDWDZOeUdVV1ZrbTcxc3QycTJEOQ==","upper_bound":"S0JRVmt5QlM0VWp2enlFVFVhNENIWURrMEEzOTFZOEJNc0tOZXRlR0VXYWp2N3lRck1UaDB0dmNzbzkxWVU1Szh6YjBYR3k3SGRvQk5GdEc3MFh6aWFMSFhFYkRCNEJBck5RZGlvSlpiSlpjVVBqZmFia0J5N1RZdENwcXM0bUt3Tm5WdlRpTDdTMUcyZVllYm83a3AxOGN5NVF0SjRaM3ZnaHpyMXNtUkNyR1hXRlV2a3paMHJnMnRQTm1sR3RvWjNiSHBCSW42R2M3Y1U3Z1ZwWHpFRUVSYkpHekpoWXFRbHRLalU4U003YW1WQTBRdnBpV0N3eDlMUnRxd3p6ejNqRThubXh6U3NxV1M0SmMxZTJQTHlQQ1pnY3luN3B0ZVRQdG9yYUVpZ3lKSGs5UFJRekZkSVJTUHZLRURjb3p5V1hTQld4WHZZU3E=","repeats":1},{"count":675,"lower_bound":"S0dSTElqbw==","upper_bound":"S1oySUUxM0NGT0xCazl6TVR4Q0czNzFpSHhOVWNjSEhFcHdidWZzQ1RRODZEN3lqNVhjREtPV0gyZ3lRRmtTQTVRMFdWRHNiZWJkTTV3bWRZUVU4cmFuNE1qTTlNSDFtZmpuZnFMNkk0TUV2Q3E0Z3hxVnNjdmVmamI1M1Jvc1ZjaUtQT1VZbW1rUVBjTHprQmh3RXlOck5rNjI3TnM1Z3lUV2M2ZTJ6TThjaU1wRGpkRVY0dEp5Nzd3dGpXbWdLNGVnbjhFVm50c3lNMEt4cW0xUU1WajFETVdIN1pmaFM4d1drOGhoVGN3Z2cwYm52cEtBeTRucENUWWtYTEt0U0NVblZNbGxaVGw1bGdhaDh1eGhSczNxVUN5WGNTU201cDNyTzdLQVNFanJIcWN1MGJCbDVOcHBPS1Z1c2oxZFRsZUhDNEdsZUw5T3hYQUhGQWZnSTNlNWs3SUgwMWNsSWJMZ3haRWNiTnBsTjZzT3YzV1RXV3l5OVVWdlR1ck90dU9EWnlrdnBwZmMzNkl6MjVrdmo4MUdJMjJCa3dyYWNMcUJETkFVRVRkRGUxc1I3bUhXU3I0QXZuTjlZOUJpblRBWDVMQkU4eG1PZFhydTJ4b2U5Q1ZaNUtybVo2RUFVcmVCOXJGd01OSHpEblY1ZmQzUTUwMDVieTFSV2xrRzNRZ3VoVXFEUU5aV2pzaVlQcjl4","repeats":1},{"count":683,"lower_bound":"S2hTdzVERVhrdnpDalBucXE0RDRreThwZXJLd2RRUzNPbk81TXVDVzZXUHFNa3pkTEprTnNlU2ljU3VzSHE3RkZ5UmlUNm9CQkoyZk1zNjV0TG9lNmgwWkdpeEtnaUFXWVlKTm1kS21sVlJPbDV5Y2VGSlNWd3pCUjVjYzhBUWlXS01xUXY4S1BRbzJRZFJWM1U4Qk5qWlF5ZjBXMw==","upper_bound":"S25zaHhKS25ETGxMbVF6a0NqczhYSE43UHVTRFdEczhEUk5TdXNMUFc5U1A4RUxWdUxlUGNtS1hxV1Q5RDRLMWl0Q3NQWm1oakVCMXRWNHNFRGRDZHk4N3BQMUsyZjJvcFdIUDVIYzl0QnJyczMzRmVGaW9xQmhjOGs2RjFKR1JoNUdHaXpOWk1EYmMyYVJxeTFTdnN3eEFkQkFTeW9rSzNvVkRTQ0E3WEJoMTl6UUhQczdtRXU4eXg2eWpRRjZIMXNtV2VLQVBrOW1lQ043akVXb0FJS0Z4dndBR21HT1B5dVRVazJYaW0wZDBkVk04ekkyNTVCcDFVb0lQRGIweUhiUkJtckpzUjJobEtmY2tSekZWUHFuZnVYTjBGVFZxYk5udFlCRVFRMjBMNFRJSlBsc2RQaUlWRXdaeFdNc0hoeG5RTEpPemRXTkpobEhyNW4xOTl6dFFoYzd1R01pZUJCaDRUS085RW9uNGhtekxxTGU4WWRvQ1l5QjdPTFZxQVdTWktoTg==","repeats":1},{"count":691,"lower_bound":"S285MVJzNGVXQzFPRjQ4ZjAwcDdMY3VwTjBKU1VIVHZoRGVZSFI3V1JLV0hqVjBla05Ycm92NVVQREFtTzgxaVN1ZWRwSFprOGoxd2k3ZDZTbm92UTBUa2ZsQU45V2pCSUp1MzEwRVh4RUFnY1BvMTBaNzBoancwYnJudllnVVdkQ2VmSU1vVUsyMk1ubTByT2NZUnlDMUl4cTNmTVBsN3ZCanVtREsxU2lNQzFNaW91WktkeEJvNXJ1Tk5MQTE5c0dqcGl0MldSd09FQlZnTTN2TFltRDh1aXV0amhqWGJRV05H","upper_bound":"S3c2VTJQN3ZGZHp0V29hN05jUktaN01PZGtscTNhQzZGYjRCTWlzOE1SNlRJYUFTOGZaOWl6cWRmN0xkbUZyMklndWZrcmRRSlRlN0N4VUhrWmdia1V4a2phU3ZJQjIxbU90QUs5eQ==","repeats":1},{"count":699,"lower_bound":"S3hQSEtya3Y0YnY0dUlrSTYzUGhaS09FbE04NHo4a0ZTMmtGMw==","upper_bound":"TDhsUnBEM0hUVEZFZEhSUGhtam5URUdWMHF5NXhrU0dLa1dqT0NhbGFOV05jWG56aFltOEJLRnJhTDJIelZKbDVSQjBtWUJXR2xSREEwR3dBbzhFTG1ZTjdsZ1VzdVp1Z1JKUFFGbnRXTWdMV1hDZjdldFFqYUgzRHoxRXJURHlnZUthUE4wZ0NXZVNvWg==","repeats":1},{"count":707,"lower_bound":"TEhNczBNZlFTZUxnNDdUMVpGSW03WDJTQ0FzTG91dHlzem1zZEdldlRZYkp5cTc0clg2MXp2Y1lKZFpPTkJvanVHNjlDanJjWmZWWU9uc0FTSnNEUDQ3bTlaanR2ZGRuN1dKMkFqYWxyWnVETmF3WjNNSXZmTjRJM1RiRG12TE1PMG4yUDJjd3VrTHNiMml6RHo4WWdjamV5anlMNmpROWJxM0thdVRtZGh6STJvSWp0UHRVVDJoNGFlWm5PQ1NFOGljRWtLTmRxZUtFUDZWUjVZa3J6aTNlZnA4YnBZU2NDenFMdFV4R21nT2Q1aElNbkxmNklFT0R6RDhFZEJsYmNDamk0QUNZM2s5Z052OHlkYmNtYlM5MDYwbVE5SWV5dldvU0VYQTN1bHBacDk1bFB0MjIwTXpUalYwTEJIVXJTMTdKZktqRjBVVUlibUU4ZWRwV3VFUFJnNHg3bkRxVUNaVUROZkRKY0czcDYwVlFQZmtRdDBKS2gwWFVBVzZGMzZrcU15dGV6d2pzQU1jVVpqdEVueTlnMHNZZmNnbGdMS2FueW5hQWdxUjZJR3FuTzQ1SExnVG10ZVN4eGFLYlFydThJa3lmUkMwblNrTlVYSURORE1rMVJnRHI5UXdRSlAwMXFFRmY5ZmZMUXpTOURsbndZazRQbnd6MEtJZzdKNVBqUjlHS2JEY3Q5SGZCWnpJYTRXZA==","upper_bound":"TFAyQk41VFhCMDBBYWNhOGw5b3dnVkJTZUlFT3pHQ1l0VllUbzFTRGNuMGZ3N3JyblJucUxNc002cUhZUzZlUkJXSnozQ09rUmMwMksxZW9DVENDQ2wyYmVZVnlITFN6cndkcTlCMmw3ejdvVjlpVDRwRmV2SHN1T01MaTVrNGRnd2Ewd2JVbThiNUJKTTdJSW9uSWJGVGNVdG0wMzJ4S0FhSnhKRA==","repeats":1},{"count":715,"lower_bound":"TFBDR1BCVXFpUWFHMTNScmY2a2ZOTnVoUVg2S05iUWFIcFZaZUJPbnl1aG5hRWNrNHcxSUFZQUhrbkhYTnNVZzhKR2RRSE9SRU1UT0xFVDJSNTJ5VGZQaHhJWkgycm41M1MxNXpzaVpUVU01RGM3dURuMmdLS2U3NHJVcUczU2VCQ3Jma0ppRU9pSm5yblZmR2NJWjdFczBGU3UwT2F4YkphUHVPbXBzZk5aZTMzZjNyM216ODJKdzJjcXlFNW5BSnlReUY0TGRxTGZZNWhEdXhrSjlMVldobW1wV285Uk1CaDFoc09iWllXTXRMOXliUlM5OTlFd0ZWekVoSm5rY2RYdEhtTlFIZXl0UkVnYXloVWtQVG5INUg0cEt2V3htb0hiTVQ2Tm9OeEo0dFl2eW9jaWI4cEdVbmtnWkRMMXNpanRaS1c5cWUybmc3dms4dzUySzBWcW9zQzlMeG01dXQzMENEQWFkUDJsbkkwTmFhcUJpTlFXclNYUDRZbVdSMU5uYlFIa1JzR0pxdW1hY2JWWkpXT3hscGNwb2xIMQ==","upper_bound":"TGUzR1Z1akxlUERvT296N25CMDAyalNid2lPN0F5enZHSk1KOVpLZm9WaUQx","repeats":1},{"count":723,"lower_bound":"TGc2RWlPUm05cDhwUWZ2bGtOenk4bVhnVEtsdFhBMllSVVZyV2k2Umg2dEFn","upper_bound":"THRVc0FIWjZGWDhWamg1TDVYTHBQYVpsR3RtZHh1SzNhVzc5cGtPQ3EzUVJEaTFoUjhpR0FxalZOSkZmTmhZZlNEeEg=","repeats":1},{"count":731,"lower_bound":"THdQdUhqc09JWEh5bWlPeTJleVdoSEJPb3lNRU5KQXFpU2F5OE1xQ2drQW5FYmsybmZldEc1MDhvM3l3NVNyR3RFbzh0NDJyOUp2a3Fwa3V6c3RIdGVYN1pxYW1DV1h3UFRoekxvYmI3VzNRTHc3RUIzeEV1dmdxaGxNZWNna09Sdk5mdTUyNlFtc3RCa1d0cnJDeFh5aWF1RTBydUE0WVE5UkZtNTZIZFJaTER0T01RZ2RNQWZRY1ZvQzVoMjhKQkNEV3c4TXFIazFjdGxpTVZZUTI1Y2NxQ3l3OU1qbWdjdXh3NUJyZVF0eFNNcWVwUkg1ZGZzM204bjl1Mm9tZUZ5WlBpcWQ1M0JoWGNIMHlBYWpNRzFEa05wZXFVamdxeVJFVFNST0pNWDdGdGdVSXRoZk85WEZ5Yk5QZlI0M3lLMElFeXhMQUJhSjVqQkRrRXMyNHE0Z21vZ0Y0ZHFHN3R4aG5Tb3JGY1ZJYnYyMjFJbTFFcU1TQjR3QzBOSWVtSmVsTURadkZZRHpjRW1BWTNLbXZySlQ0UVJGRw==","upper_bound":"TTF3V1N6SFNGdlJyNmpOeEJHRm1EeWNvaVl4WmRQUW9SS0I0cENPZ0Z1T1FlNFdWRVNidUtCTzFJaTZYMjJhN3dEaDZibjV3Sm9tcnhuMDBqZkpCOG1kbHQ1d2MwejNadzR5amFzTm1IYUh6RUpJOENPVFA=","repeats":1},{"count":739,"lower_bound":"TUVSSnkxN2w4VmNhMDlMQmN6ZXpJSGJmRkFjVDV5YlpFZ0FHQ0kyTVFjeEhSbFpTUTdXQVNmNFpvd3hYZmdrTEZ0ME5QYWtjOUtwVks2dEF5S0JMdFpEZW9vRTdRbnZiMzRMajBFTExBZ1dPRndQV0cxQWxSOXVtWUdqdGRNSGtJUWNqZlpxR21Sa0FFOVJhQ3NtRmpVSlpRakJEZllrNGRzRWdqRzdVOEM3VmtuZWZYeUxaNUdaQWxTbG1iTUs5eHByalRKbFREaDFXTlRrdFRUOFNCbEZIeFBUVTBTNU9PZ3lsYXlZRWtzWm03aDBHbWpISDIxMXZHU2NPNlZaSmsyUmFvY3pWQTJTR1JSdUx4cUkyRVBGeXpTWjFidDRVQ3J6dml5N1MzZHFlWVpWQnoyTVJzMWhKYnUzSGVOMndQMUNCcVJkem1aZW9HRVJNRmlHQWlOcXllZThRWlRqZlg3bXdReGlBMEo4TFhrWWM2T1JIUUIwWVJCZFY=","upper_bound":"TVdtdm1wamdCbFczYXVUQ3o4cFFJM01GV2RleHd6ZDloTTlvNDNrSUtpSmhOcm1Od0toSkNqNFdhWFJDektzaHNQZmtqNTVpZk5vUDQ1WlhWQXdSbDdVcDc0eENVY0pJTVdKeEtRSEhrUHRBeTRqdld4dzZ5ZFBoRzh4M01LMnZNTXZtV0R6Uw==","repeats":1},{"count":747,"lower_bound":"TWZIR1R4NHZ0aXhwVU5yVWVNZ3pBakRCZExzWmFOZU0wbUxQMGY5Rk0xOVNpSzA5M0dNemxRR2VBUnhMSWxGN0FVY0tTVVpGZGlubTJlb0huSUw1Zm16R1B1akIxOHpWRlNKM0N1VmI5eVRKbXhhM3oxMU42NHR5RzVUNzJvOUNOTE1WVzdsS3Vac2xEMm4zZklDVDIwVGQ0MVV5OXFTOXY0UUpFbFBQTHFzZldiT0xRTzlkMVpVVU5sOUgyTlEza1JBSHB3aHZ5bTFva0xZ","upper_bound":"TXRMNXRRYTNwRUlzV2F5SGV2NzNYb21CY1l3TXdYV090TmtZYU5GSkVlcDE4SHdKVVNVU1FqR2VjaHNVQ1I5bDBPN0c4RlR4T0xHMmJVa1F4bDliczNtNXp3a2RlbE9oY0RnRHpiaUVDV2FLOGRhaWc1a3ZvbjVEbzNlMktyNG5ZQmJ3","repeats":1},{"count":755,"lower_bound":"TXZXanAySWRUZ3V0cGdITUlNcm16UFVCZXBjazFnRW83TGI1cDJXclVndWhGV3lmckZUMkpnRWF4TGlpOERLa01UM1RvekpFR2ZtZGhWR3V3RmtBTEFHM1o4elozZWxkSkdaOEIwcQ==","upper_bound":"TjAzNjM0aEVWVGl3UE9lZTNFTWtVbTVMTzJJejBlcWNOaDNyOVdIR2xLcUlrV3Z0NHpHb3J3Rm1kNk1aYmFCQXRRMUFkekxRdkNQVnRzckNXR2hUYURXdjE5YjVmNmVSZ1lZb3FvS1lDc3NJWE1SOUhqdw==","repeats":1},{"count":763,"lower_bound":"TjBRWGI5TlZHR1l4VTEwRGF3Z1JhSXpTVENGVGNNMUZaSWx5anA0aThkcXhXWGF1WHk5c2ZMMFNoTDhmUTRkUVIwVlMzN3EwNW9qTzQyd25mTmxsa0hEZ0pjRVRBUjlzelZ2UmQ4eDMwZkNrVUw4M0ZwWTBVMU1odkl4NXVISHI0alIxT2RsTnlNajVCdklzRVdWSGJITmhKNkFTRnA3NW91cjl5MkF0bTJlYmM4QXAzTnJPaEpYUktlS2hudzY5OFV2dXFOQjVHZDdSTDhWcGI3UXhkMUNLOTdjQzlyWWhVSjQySHIxUDhGTGxnZ1hRU1d1RDVIVkhIeEhWNlpqQmNRN3FyNVV3OEJzamhzY0h0djJHc0NYelVWR003dXdoejg0VHpEQ2NTMGxHV2Z2Y1djdmRwVHdneEtlUm9aOXpwY3VPMmZwdHFl","upper_bound":"TkdRSm5sdEg4ckxkZUdSSkFVYUNHWGNvcHNHaWpmYllJc2lWTzlSb0tsWklVR1lMcm9iOVJwVWRtRFNkeW0ybG8xT0JG","repeats":1},{"count":771,"lower_bound":"TkhMN0EyeGx4WGlyWVhLWFJHYTBWM0Q1VkJOWHplQ2tCSnJXYWNpMUo5aFRSVVc2M203eWZVNzAxeG40dU5YdmRWVGFzSWVLU05odUpFV3BHTGEyYmxlTEFRU3V6eW91ZVJNd0pIR2toS1hCWnBZcVpJZjZNRTlKY05aN0RacDl0MFRjaFFwQ2NoU3p0U1FtUkx5RVRMVFNZaHNLdDJwYUFqVGduUW50R0YzT2lpTHhsd1RmdWt3anVXbmNWUlFaN2J5a096NHlR","upper_bound":"TlZ4ZFRna1daNlJMRlVoSkVmNExKazlRdmhqM3ZaVnBuVGpYQTVCdVJKZEpySFpSVnFqekF1V21OSEtrZHNIYUZwUm9QRXZQRk81YTdXYXowR2I=","repeats":1},{"count":779,"lower_bound":"Tlk4ZGxvU3BObzJRTU45WjVGdzk5QjFZOXlWSUVTWnludlQ2SWtHV1A2WDFSSTcxeWM1SjJWbVowRDhxWXU2MEhISjg4S2NjZUJITk9iSGVsWkV3VGxYNmlHRVphWXZtazhnd2UxR0k4S3FSZEJFYzZCUFhBekpYUFd2bkh4eWQ3Q21WUDJ1VVd3RWdRcW1EODZnc01FY2haT0taM2txVk9wQnhsS3k1ek5JWVB2OEo3WXQ2cW4wak5UaUo3YlFTZGF4Rk1nYTE0WmZLajFEQWR6Uml0b1diZlFoRnNDaVplM29GQ2MwSG5KSkdMRnh2QlR5SWR2U3F5SW1CeGVSV1hPRFZwdEdSbGVDczFka2pNaDAwUTluTmprSldpQmVpNlZjVE9SWmVycjFCSXlXNjg1aHMxTURmUFBDZkFuWk15T0gzcFI5eFkxY0o3VVd3UnkwVnlSM3lpS1F5MDVSUVFldVNrekt5NEFCZVRJV3JPUXZEY1p2YXBYYjNQWGtONTdnZ0hxRVFzamFoVlprSzJUT0xqUXZSVG04ZWUwanR0SmJIa0x1Z0QzRk1yb013NHlHN2NveW1EYTFVQVFKa3M2cTM3ZE5GOVhEVVlJZktoaUhaTlU=","upper_bound":"Tm1LaVFnQ29FeTRzdnZqZktKMmYybWlpeUs3S2FMOERZczZVYVZIVEZOYjVraTJuS3hqdFdRc3hGV3o5bTJJYlcza2RqbDgzeGVrQnZtZlNFNUoxU2szbkdzMjdZc3hwREI1M25iNTh0cHE4RkE3TGJ5d0ZsOXZVY0licVF2MnViRm1lQWM1OWZhRWxxZHJ2clhPRWhITGtkR2Y2RzRpTWh6Z05YRFRnVm5jU3NnOGxINzhwYUFTa0J1dG5qdW9RQkFoTG03eGpreVRNbDMyd0I0ZGxFYmJOYVh6VDBieWdaeTNoZkZ4d0ZkazFScmpQYmpLYTZVbFZ4M1MySnQzaEV6NEtGWnltWGxPSEI1bkdvRENzekJwZXFYRVMxSDRHb05sRjkzc2dESm1mbzZTRFZVR2RaT0xaMUVSWmFYMkxTaVdwU1V4UW45cGJxNlpOcElxeFRlRmdSWjZ2WmhTaU9md3YwOURhcERTYjJSRktBN1JJU003VTF5azRVbVNUcGE3a2lDSXJHWFpMNHVDOTIxb0Q1Mk4waUtGVnE2ZEJ6ZWZ0MU54ZTRreGpabGs1Tw==","repeats":1},{"count":787,"lower_bound":"TnV5dFpFVG1tdlYxdVl4UEN4VDRZVzBvSmJtUmNkZWd1Z2xzODhkRnN4VHlnZzBPRTNhZFRNVFlBQmpJQVNBakYzaEdGTTdqRFo5b3ltUDBnWkNVQW1VazVFWDIxUXhTejA4Nw==","upper_bound":"TzMyNmN2ZnV4UmdRaDd0UVF1emFvTmlWT1p1VVRwbTNGZEpKUk5pWWlLQWl5N0ZzS2tpN09GRXFPOXFmUDhIOFJpS1BydVpXdzI3TXhic0luTHVRSHZzTWNXM1hJNGlmWFBWaG1yS1ZkVzVBZ3ZLeExBbUxnUnRXaVo5bXRoWklUbnk1RWFuZkRPVlI5UnRrUG1US09RVlA1MDlwdGlMYUdZQUROaTk0Tm0wOXF4UzNFTDdtb0pQQjhqRHNOcVl4c3dUMGQxUzBCd0FYelFkd2ZsRXp3SG9vdDN2UjdxVWdJS2NzeklJYQ==","repeats":1},{"count":795,"lower_bound":"TzRUaUE0b2M4Zk16bndqZG4xa0dDWlN0emhreGpwRW1rNHBBTkZOUTlnTW9INnZRYkxwTmpJNFhoYTdLOGZGQXNzbW5kRlJkNjdkdTRsQ1NkbVUyREowQ2g2YkRVSjJQWHN2azJKcW5kR2c0dFZpOUxOSGROcGxSRWhyMFJHczk2RHRBS3dtVzBvS0lTRUFIQzY3eThOTG5jMDFzMm9kcjc0MnIxUFV0UXdnNzNZM2R3cEwxNjkyUklmSFdNT1J4MGZZb2pmSDlSRjlEY2pVd0VUZFBTczNJdTA0OXFCTHgyS0VXY2RWcUlrUWg3ZTY1NlJ4N2c0OWxEVGxRQUhuRFdDeEVMMFRpcGp4MXZHaUdqbmVMaUF6VWxhU2ZKazA3VkRPZXRhMHdxRDZTeXllS3ZVTVpvT1hVWXdveXo1NHJOenRMbkRvQktVdnlZbndNa1pBSkp0WkpNdDZyWVhhYmVZUjZCYUNYdnREUFVvR3BURllOV294VzVXMFFRenlqVWZuOWp4QmRrVGpYNnd5MnBSWk1yTWJrUXl0OHJRMzVGYmRudkt6dU5WZUpIbk91UXM2VklYbjZ1TXlQa3M1Tk1jMXBsR1VKblNweTFIRGc4dmoyN3doUWZkVjE=","upper_bound":"TzlBa2o2N0VZSVdRTE1XRWNxM0Vtb2ZZWHB1NkZQcGNSSUMybk4zdTY3eFoycTlZb01xV3B1ZVVxTG5WZmg1aDN4aTFlR0dpRU9iNTdCb2VCT0JUdnBISGZsSEJTU2pXQzB1TGhjVlFmME5udTFtTDE1SlR3cU82VlRBd0R3MkNaMWFPeTRWd1d3TVZNQWZpQVViYmlSM3dRbHI3TXJQdXlIcUhRMEJhWVJCTGdqQmRWR1ZvVEZKN1k3NG5TVnkyVjIzZmFRTG1IZHQ0SFNqSmVMaTZQTG1ORFFSbjF4NHNFQmJwV0x6a2N0SjFITXlNcUkyQkdxOGpMWFVWQzFYZDNWa1FUSUViZGhoTXhuS0pRWWp0SEZUbjVJQ3dKaWJGQmIyUURnb2hvUFFHa2xXRUVKb1RxVEpjbkE5RTV4UWU3VVF0WE5CSE1PeGhuVlZhME9KQzlCSXBkeHIxN05QZmV0UktxN1FHODh4czl3RlZIU01XSUJvQ3hONUhQenNlZVB6d0Ezb2xEMjlUS2k5Z0ZoaDE1cXc0d1pEN0JwUDlzN0Z4UlM1WWk4akt2Skl3Yk04S05qTEQ3Q3pTOXdsTUtWR1VqdmJzS3pkMkp4QW54bGlpYjVNT2F4dHQ3NE91VGgxVG50ZmZlVFJnb3dMUWN5V21ZRWhQc2VUc2hQblR4UHdmdE80UDRlNGJWZFJDTEt5Wmc=","repeats":1},{"count":803,"lower_bound":"T0NuUURjSDJ5Rm1nMkdLeW5xc1lRTjJKU2pWQWgyZWZFWXpBM3FFZ1ZrY2ZZZzQ3MXRoaUV5aHlkejBCZnIxbW1QOXY2RzZmUkVVeEcyUFJNd0JyMk82ck1mR3NQOW1pcjFYVmFwQmE3SXZ5MzhyT3ZjUlZySXNxTmtITmFmaUZ3ZGNoREZNOHhaeVlGUEFNVDRYWFhKWlVTdTF6ZnNJc0NLcWVXZGEyWGVhekJ6U0szZ3V5bWpGRFFYa1NrT1pJVTNLbElYd2dwbHdCOU52YlV2cXlNbWhoZnVoSVZ4TjR2RzBvQTR5RGNhZ1I3aTVCRkpDd0diNTk4N2FQU2RGOG9oR1pEZFJUSmUxQnlaeGE1UVg2cVBuMDd5VXRIUTBGR3V0azJTMUxZVWNaclZmMG5yTDQ1ZEVOQXYyWXI4M09FZnRzc2IyekVtQjkwVXlrVnNqZ01zQ3BkMHROM1Z2VFk3dzFsQzhUNlVuNlFES2M0ZW1BWUtqbVdhQ2hQYlBEZlRNY2dZa2ZudUhBSm5aSnpJa1Q0b1Y4Y2p1ckM0UTFOR0RobGxiRHpwZUZhUUNVVkUxMG5LZnNrQ1pXa2FuMVMzV1dhbk51bUJKRjBQb0ZZVDg5dHpHWW5QcXJTRUdqZ2lrcGNFY3NmeE1qWHhJcG8zc0JtMklIQW80OGtmV0xCYXA5YkdUYWczYXo=","upper_bound":"T05CRXhpYjZvN2tIdkdHcFdzdDdnYWx2SFJ4cGRLeFFpMEJBT1FVekQ3VzlEZDhOTVJJU3dkYXN6SHZNZE9ua1N1WjRMcm5YcE9US2NpcnhPUmNuWm1jQnhEZUVWajFsZGpqUVNJN2NHamd5RlhiYkdTNVZTeWNnc2t5VGYxQ1F4MFB4bWpLY1dIU3Bmb0RtNmNUd012amg0N0pLWVVYY3F5OFBvMURmb3FqdzJVRmxseTlLWjN3bUhYUWY1OTdUZld3SEVIeFBTUmVJSFlqMGx6VXpLQU1nT0FINEJCMHlsMmIwZlFmUUFuNE9RYm5CcUJma2lFcEdPSENDdndVNlprbHQ0ZVBPOTF2ZFlnM0lsWHdOMHB1a0FiVmd5cVNyZUpKMEZmNjZqMmhUazN4dWtUWGRDTGxkYUJJWWw5cmhNNWF2MEFLZHdWOEMzRjh3a2s1ODF1czFlWFgzTDI2bFF4R3dlMVY=","repeats":1},{"count":811,"lower_bound":"T2Q3elNTZmgxUzY2U1VjYmoyamhpNExxS3p1STU1YkpEUlRnSnA5ZlljeUhEWFFpeTNzcU0zdUtMNnNSeG8wSkE4c2xHTlBXU2lUZ1J3NmFlNFRZbVJLRzNnaUwzbWtDelE3Qm40MkdsTmpXaTBiRkJmbWQ3Sm9WWDdtU0ZTVDRQekU0ejUyeDVSeU9NT3JJajVpQkZZaHZSMnpvS2RqZE5ZNFpFRmZ6bFAxZjlSQ2x2d2J4bTVnTHRTcnVVVVBhanAzRmxHNVJYTWx1YmpobFQyNXpTbElseXNYeDdXT2pIQ0hIMnVTdUxqVlc4RkhEb3MzZENqRWxpZnZqSlF3Sm9PSENEenFGQWk4UDg5a010Ym14dDYwaW1BU0Q4VmpOdWh1SzAxeFZyU3NTVG5kMGVoWm00YVBTanBFdE9XQXZwTnRtWHlBYTN4c0ZZYjdRZFpmQW5YbE44SndLcE8ycWxQTWhDeG5qSndhVmJvRmJBZ2JielNYU2plbjBiMXZHRmVCTWZQUnpzVG5aR1VUZVJxbDRQZnlaU2lMWDhLc2dsU0FENlFRR2lCVGRKcDdqa2kyQXk0aGVLVFg0eEhiUzl4RnFOa3pFV2JHcldrVnJaeHQ=","upper_bound":"T2paendFSHRSQUo4cGc4aFo0OENQbGFSTWd2NU1WeXBidkZhSnpkd3A2bnhRajFKZ0M5Y2djQ0Y4VXEyaUI5ZGtUZ0ZNZUwyQ2Q=","repeats":1},{"count":819,"lower_bound":"T2xoRHlWQnAyZmR1WFZ5WkUyTnZZMXlTTzk0NklramY4UjR3ZFExQXU1Z2hxZlp3aHo0dm11N3IyT05Sd3VSY2ZWVzdreXJIOGhWbFJmQkc3SURFOEcxNHBqTlNkZGpZUGg0RHpEQjIwMUtGNm1Ba3JpMmU4M25rZ2ZzRTc0T2hWS2FYM0NzTnpaUUJpNXBUQ1ZMaUFYYnRDTUkyM2kxZDJpYkZQUWd1Z2lsbWhKVDhGclFIOTk2bGtLMXFMOVlNTHhsbXhIVGZHbWE5ZzVicWY5NTFjRUZT","upper_bound":"UDNobXduU1c2akNPRUZiVWpqb1BBSzlXRExlY1p3SFVtUERJTHExd0NOUWZzWW9SUXNCVFNqUE9iZzJBcXd6UEJkWjFTbzNSTTVNUVp5MFdENkIxRGNyMTVrdEJRTUdKdk5xRFJvZFNJdVFmRlpwSURCWHZ0QUM3MGRaUGY1VmpqVWFMQWZHRHRSRXU5bXFIendURU9HUklTSlJGZlg2R3I4Y3FVY3dkdW5ZOXNLdkdWbGwxTTg0VTc1TXNrbjZYT0lORnpSeTZl","repeats":1},{"count":827,"lower_bound":"UDNwWE9VOVgzRWVGanBCSEc0RW1NSkMyNU82N05vUEVHWVZPeGU3","upper_bound":"UEZnQzBkV0ZoaG1LMGFFeFZzajBnMUNqT0Q4Q29Pa0Y2QTQ4NUtsbE0zb05tam5VOFE3dU01R1NBeHBNZ2xCOUV2Z3FmVmk3aUdJSUpmM1dCdGRpdW9GRlpabFV0aFlHbnBlNUtFUXFPakRpclNGcTZ0azVpNlFSSmlqVjE2ZWZjZ1RncUxZdDJ2VVRhTTJ2NVJYYlFaeWY3STlQS0RwenJPZkMxcTdUeVYyUFlxTzN0amNMM1poWTF0bzZWS2JKMWVNQWpYWldBUVNzYVJPZWJBdEpxSTV1RFllOVZPeGhUWFFhRTFwcDZRaktzV2dMS0FUS1d4ckRUeTZiVzdGWjhDUVVEUWtIZUNIeTFlUzhrbDVIR3JsdTI1NWtaOGNPNlc2OExYdHVYNGViNEZOdTk4RnNPYk8wc1VwN2VqY2Y1am9KSEl6STE5R1FwR3h0UDdOMmlGS1E1WGQ0a0NWZXAzR2VubUtGV0MxZU5PUHNaOElCam5UamU=","repeats":1},{"count":835,"lower_bound":"UEZ4YVhkSzRHUmpFNUhlb3VIVWRNcFVHbm04Y3VuamxpS1VHY1lWdzc5QjNraVdKWTF5Wkt2MHRqNkVZVWIxTGRaOG9oaVAxTWVzTE1JaHV6dlE=","upper_bound":"UEpjdmV3ZERpcUxXQ01Sa1d6Qm1aalJBMUh5c2J6SFJTZkMxSjBBeEpBV1o3b2ZSNzlQSERLZlZyN2RVUkdVRGFMc1BpYldOamN6TVV4c05ac21xYUtPeVloQnhSRXpiZlZGckhOblNQcTJuaExLSEF0c1BQaW83VGh6ZjBHdUlLSTRocW52VlZ2dm90aFczY0QyR3hBeWQzVVJYZ1ZDc2tDWHRRUlhmTlpTdGIzQVY5TUNuU3Q0aA==","repeats":1},{"count":843,"lower_bound":"UFNlNFJ5cVlBN2o1RnlZbUZIN3RKNk9maU9vNExmSHFIcEpCWFlmSWx3VlJkQTZLQ0RpYWpvUE5JeEZja2MxVUZyUzVlWFBMc3hOV2VTdmJ6aUswa3c3WTdCajZuVmh3ZTJFaktJZnJjMFg0Nm1uS3BJY1pMdzB0MFZwMzVVYmp6","upper_bound":"UGQ1dXc0eDRCTDg2cA==","repeats":1},{"count":851,"lower_bound":"UGRjWjllZzhlSHQ2aU1ZUXZXSlJDa0NJVVhRbjNzbWRrdFpXQzRXMHJDQ1lGQnhXTUZYWmd0cHVYQnI1OVVZd3VpaVJ1U0lhU1VvVmZTcDBmUVY4UDlxU1RraHpuZGdNS05kVmNUTVY4TEZWWWU2ZENzQ2xxTEdhc2NFRjYzT295bnloUmxjaHM2NGlzcTlkVjU3RGNObElJVEkxOXdtdTExRWZiczJsYXcwUExaWnRvYnZvazgxTWF5cUVpY0J4S1o1YlFZWEZ6Wm1mTjFJN3ZMMXZ2aFB2aXZSOWhuN1NTcUIwRnBTREFuYlEwYXNiSURxWVZnRkVLRW9jTkJtTTBaSUZnN01WODE0S1ltMFd3VElqOWYwYmVFZHJRY3VDcTNVbGEzNXh1OGN4d1d0ajJaVGNKOEhVVmNWQ1Z4dlUxTE5LRUFBRFBPZDNsM3MxMHI4NWlhbFVXd3dlOURpTndSOFY4U1JNZg==","upper_bound":"UGljaHNVenVDeExob2FoOWRzVXRIMEhRdlJORUdZOEc5VlZFQ2YyWDZ2RVdjWmswNWMydkZXNTdyZHhaeWVKSWVxWWtVNWtOcFdEZGEyYTE4eVNHWktwTlloTnZ1SlNkbDBPOFp5ZklSUzdpckxlNThiRGZFM2Vubm5vNTVCOVdZZFZFejViU1QzOGpLZFJhS3NDOXFQc2h6cnJWazdMVk5oSDlFYWVnUDdqNWxUaE5hSmN0YXpzRVVSNm5Fc3BsNUh4T21oc3ROd2U4a1VyMU80UWxkd01UUXBWMDJmQVN3MHJBdmVsaGlncjBySVFZR3ZtTnJ4OGg4cHB2TFM3aVc0R0ZwRnRMQTJlV1ZvQ3VtUmNralZwdVdDOTY5REhtdU1tZ3JRc0lhUkcxQzViejRqcEEyaWdheXVUU0czWm92N0hRdGZjalJyVmR1RVF6Z1o0MlMxcWoyNnRqclo3N3BhYmNaMktOSTNmWnF3U25FYTlKbHo5T1JoUUhDT0hsZFBJTEJyVWNaVXl5VE9RNHViZUxRUFRLdGN5aUVGMFp3aVVHc3pvUjRxeVk2c3Y0RW1LczVUTU15c0RWQzBrV3NJc1p1anZVR042clBWbHZrUg==","repeats":1},{"count":859,"lower_bound":"UG5xdTQ5cmNEYk1Md0dETE9UalE0QlpHSjFxZVZ5ZnRQbnJoYUlmb043ZHRsNWVPUWl1WVlzRXZpZTBYT1BJcVppbTJPQU5xT0xEZE9teUtZZXM3ZkhWVFdNR0FlOFBmNzB4RHZTbFJ0VnBxdGNlVmY1UVVFSlZVWjJ4MVpkMUx3S0kxblg1SnJGNXFaeU5nVEJyNlZkTVlZazlSZmpBVlRYV0xDNWxlQ0IxbDgzV3VZanlCdkVjR1JMbHExWlBiN2hQbDhQaTM1bGZsT3BzM0xhZGoybkJUWHY2THJNdmpwbWFyUEtudHkxT1d0b1RycVhWUTM1TVhYRXpYT0tHT3NKYTNpZ0J5M2RkTHJCRWt6bWNuVVZ3a2ZGQWVoR2g0Q05hRkRhdjhrZkxoeFUzQkVFd0N1YWRVeWR4Z1hibzJQU0t0OUVWMUFhME9mODVEaUNJM1JZSTZpazZESlZsQktoWHJ3eFlsY0VMa3pndVVpTVh0bEljaXRnTzUxMGVUR1RFUVBpNWlhaA==","upper_bound":"UQ==","repeats":1},{"count":867,"lower_bound":"UUdUbDNBV0F0WkhJQVRvUTBSeEVkTlVaMlZVbHhCVHFuMXZuTUJ1a0NYMjlKSW9YZkFMdWZZNmt2N3FubDd3OUJOVk56a1FtNXlqakpibjV3NkZHSk5OMU93ZDNYa2hiUmwwRUk1d200MzRsY21SbXJidkVvWWxVSjc3RDVXcjBZdTV5RGhibEt5M0JtVm1zeGJrNHRWRGROSHpJRGRkQ1hWQU56c0ZSN3JTRWxndlpscldObEV0R0c4QUNGd1pNWWs5V25QTzhBWlZTUFY4YmF2RUhTeUsxTHdBSWpBQmhNcTg2MVc0S014RG81UnJheFlFWkx4dmxEMjVQZ001OXBLUUgyYkFZUWpVS2h0OGZhd0k3cWRDMXlsVGYyNVpLdEFBS2dmcFNWVWt4YkJDYjd1bm9iUFlKRHJEa1RwV0V5dG90Rkg0SGFodzkyRkgxcmhXWFp3MWUwT3V5Ung5TExKQlZwWDJDYVRXSXBZVjBnb1VNTng0SU52MVltUjcwNVBtN21kQ0ZmOERrb0RaVGJ0ZjdmZ0ZkcWt4dVh2ZjB3VWR1TjlKRVdXTFJWeURiVnd4S1l0eEFHNzNsSUIzZUZXZFV6M1RxQlFndTlDaTNxMmhZeHVWU2RuTmNVSDcyanZWMGJpRWVzOEZxdXRY","upper_bound":"UUtiQlhTTXF1NkNDUVhJR0NqOHg0czdKa0xoOHd5UlpZN2E5UTI0ZlBqQjBCRzlEVEZFT3VPenBkUm9YY1k3aW5sbmlhN1BmU0lEVXZVWnl4VW9lbGtITjh1SFdDSk5DdVM2ZDJqdTV4WGJHRVJsMnA3dUM4dVNlejVrR0lNMDhmZzhnRlpWZ1pEMmE3ZEM0cFc0SExQSDNxMWVJNUp5UmY1R1laMk5PMFRWQmd0MmdPT0FobGdhMkxSUTFnVmprelhiVnRtZ0xKYWhQcW5nMWE3YWU5bGtFUkJXdlhwMDd6MXFER1gzMFdRd0ZKd1V5VTkzNklGN0hSZXNMUjhIdUxvdG1UdW9iQzZQajNRWnloSkxXbUFUeld5T0FUYmdWNzk5ZkZlU0FDcEZxRGpORjlRNUlpNzhuZkYwYzg0UlNIbGxhUFo5UDM0d0h1Rlp5eUc3RmVySHNLUnljZ3B1MHh6MnhsbGJrTTRQSnNRVzFBRXVOd1hKdXN4aWdGNEZBZld4dTlCeks2MlI0cHFVRGUxZ3dpUHJDdG5XcUU4MTBnVmVCcGNqTHBFTEFoY1VYcDU5eHhlZVFnNDNMZnJWYUJtU0hqcGdBbk1NRnpJak02WWgzMnBBamcxRUZSVzY0UDhaejNlRmdaeGdNMUNPYW01UTlxc09lUWtEbkZT","repeats":1},{"count":875,"lower_bound":"UUtnajlzVkJsS3VJYjEyRU1Qd1A2Z2M1UXhFQ2x4UUdMc3o0U2JKTE1zOWxINDhHbnl5bFFYSHVSblFaM2JRY2lrbWcyVFpsM2U5NWJxSHk2SlZqRUNmemxtMGZjYmkzSUNjOW0xbzc5a1VPMXhtVklVbTVkTGxoQ2RHVlhYMWRoNzJ0aG1rVG1CaUVNS0tWNWF5eVhHV1k3N01la3hJd29lR1AyUUZnZllJUWttdE42TkhyMWNId1dJb3I0MklJZ3oyaUZkb2tTdDRtWVU=","upper_bound":"UU56RjZsS1ZqY0R6bzlFVVUycVQ1azFPMDNjZ3NWNjhqR1ZodWN6MTBDeXVQSE1xazhRMDZxS2JVT25idTNMWXNFUDJjOTZEWW16V3NnVlBQWWhFQ3pXZkVCek5rVEJiT2Y0QkZ3U1lxYmY0c2ZGY1dySGszZTlXZ0dzcmJRM0lIRTEyT0lVOXpIMmdoWmtzR0pYNUpPUmdLdHpFcU9RdzZMdUpvNEp4azdMY3ZlYkt6","repeats":1},{"count":883,"lower_bound":"UVdCTEtIRTJ0dzhmekZIQXAyajhJa2xORXV3OGZCd0ZGdEkzbG5TblFWM09uNTFwSVdQenpFNHdPNVFiUUxTOEZPVUJ3a2FYcmVacW1mWXQyTjVORW1wcEh6MTg0dDJlbjMwTkhaWHZMQ3QycnpUYlFYeHVza1VrRm1VRmNSWVpBSGg2dk05WjBFalg3akk5dFo1VUZRVnJCSVo3QmM1UEtKNEhaY0d4cnh5MDlkeldrY0VRRk5sZ1lHbWJ1UWgxOG5lSlVaVmJ3MTIzT3htaFJ6VE53b3Nsa25rZkFTY0lYdkRKSjhtU21tVnhTN0hJbEpibWVaQVdpODE4WExoamMwU0pmdlhJa2RIeVVwVUkzVExkVklPVXBBMlQwSnluMVFLZkNyV1oyZEJORHNIVXRSbFRvRThEa0ZpMlFlUGNoR1A3RHFKYk9BODZZVEllMG1CZ29mVExNWmVFeWVGQ0pQWmF4bktTMTJZYjMydXVjaFpXZ0dIUzlRWHdPMTFlVGVoZUdMaDJkVzNBcVRZQkFuRzdHeE0yaW5wa2I2SEs0QXRib0gyZVdYZW9pUDBLQ1Ru","upper_bound":"UWNvQTQzRlZkVlRvNXdYb0RUM240djRIbTdRQjVobTZBeWlZOXBRbUpHaTRVcUI3blluakR2THBTV2pqV0FwbFV4RnlOdVlscG94TXlBbGMzdmRvV1RzNVNxQXVtTk1FWjZud1ZERlpEbDhRNFhoMU9JbVZUTVdVcTJRcWNuOVBqRGNVSVU0eG5tQTBLMktxZkVSeDF5N2VOSFJ4RWpwRXhhMkNKVlNMT3QzVEtRenkxZlNubklXUkw1TU1LTGw1cEc0TU9Hd3V5NFFUU0VmSTRtcWc1TkxRZk5ic0oxY0F0ZDBScQ==","repeats":1},{"count":891,"lower_bound":"UWszc1MyQ1M3T2tueDZYM2JqQ3VxWlVSZ1l4WUUyc1RJUUJyZ0dyQ2F3dktLRkRIakdwbThOUzZadkxkOVdpZElOV1ppak05RVhhYjZwUnJ3Mjl1VXhtSVpMS0FlN0lmV1FhdG5hOWNjOUw0YVJlNnE3cnF2V0REdEx3VkJNMlVZakdiMlZBdTNIQWhmamtsYndQYnpTdlFUYjZKY1c4RWh4UjZyblJ1WFBFSWhaejJBTFNhUHNNQ0piaEpQaXExUkhmRkRwaHRKZ0laUktkenlsTENBT2FaSnQwMUZvWHE0N0JGTThmdHVoV0FvNHlFU0JiOU1LRFo2WWppTWJTY295OVhXR1FHN2g3QXZycWJhYm13MDhYTnk4WEh0SlN4UEdpWEhnbHBNeEZPUHZGZFVWOEdVeUs=","upper_bound":"UXZ0dVRxWFd0cTl4TGhUZ1lpam5iQ0ZlcnRIaVFQMDNqOUxYS084bUpEaHZ1UUVPNFlkZ29QR29RNVY4bFVPbXJiS2txVUNpWFl2TEl2TWxvTmdPbEdsbHRSMjQ=","repeats":1},{"count":899,"lower_bound":"UjE3bXFudXBRQW1uaWkyenZEcElRMlNiNVlnNFl4RGdETGowVzRHOEp5Wjh2QkNMUGJSbTVYdlBid0xOa0o0ZVBUaU5CUU9tUVU4M0pxdXRkdHNQTzhRbnc0cVZlY0x1bHhNaW1peHhCM0JXd2FwazNXakd4YUg3b0xWSTlYMHllQkNDaUdXU21aU2dPVUJwaXRtQWlkRndtVFBoN3E0S3hxbGxEQ3U0cURudmpBSWtORXdnVXMxSFhQQnEyTG9xbDkySnZPVzFyeTN2V0w0ajdoM1h0amlpa2ZEd1F0V2lGT3UzUWx1aXlGclJYSXBycGxKOVZuSjdSRHRkUGJhNU1EV1pzWDYweVd6R0FDU0NyNGlqRmRxY0g3clAzUjk4TEJBbmlWZllXdjViNmlYVXNJRnpONGlOekpQSHFIUVJkUnAzTXV3NUw0Y3VIRXM5WURoZXQ5R3BkdmN1VDFUajF6QjMwSWRHSGNjdEgyNXRUMGZKM0hWQlFoRTJMcExKZXl1U0FwMUtnZXBDN0ZwYXNMM3YwcjdlU1RXODR2bHZkT2FwaFUycU8wNWtrdHZjaXJNdXNZQzJ2UHVORkVJYTViZlN3NnNpalpkQXpVRGRjeXc1d3dwUzRyRXBtbW9sMmRhRmVlZUJnWkI1eWhyU1NrQWs5M2xPbjN0S3BMakVUdlZmalk=","upper_bound":"UkVLc0p2a0FTYkhNQ1l3ck45UGxRVWh2UTZKV3hvaDhoWDI5eWpGRkZpRHBVWTVROGg0OERuRnZrc3BXdDFhd3FiMUhVZEtaczU1b0ZhdEVZbVhlakVibjN4UkxyQmtQcUFlVFE3Y1VRdlZtbWgyWGxRSnV2VDd6U2lJaU81VTdhVHAyWEVyQkRiZEJ2TDZNQ2dnd1phOHFEd2RLZURENzM4azF1SXpxdFdOWUIweTJKNzZBcXM2ZEpLa3NpT0xjMmZ6UXA4MjV0YjA2VUNzSFdXc29uYTZXWEVUdzJnaVo1TDNuMThucE03RDNnTGxwVUlhWnJkdElxMVBiNXRCZXlOWmVBakZRUHFVUFlRTGN5bVY4c1JrcU93R3ZIWm80Z1JkVENMS01WeVZ1ZlRJa056cHJyZVE1SVpaNno3STNiRlNXYTdhaWlDWW5OeERSOFJmRFd5dzhpeDdjN3dtekpNc0NQVHg0RXR2Y3p2M1VhOFdBZENrUzRaSFNWRmw5","repeats":1},{"count":907,"lower_bound":"UkZXa1o3b0tZcmhqWDhya3MzMkdFVmVkaW1rOWlZVzJKU3NZeVNkZ2N0NEhQQTVRTnRHWGg4V1hLeg==","upper_bound":"Uk9VZERMR1hCOEhEQkdNa0szYmFSeGJkdFhubFVqTjdXZTRUbFJRVkg1c1FhVHFDQlhLanFwckV2V0RDTEhyTnlnczlqaDR6TEJoUkhpdlZQOGo5bTVYNVZkWTNQMW5SdUJic290SHNlQWJnVHBrenZDZEljcTBNS2llcjVuVExEMlRWVkU0VlJnT2YwQ3V1WXR1VnNSZlM0eElHQlFLRTRTd2xrYTlVVWNlMTl6cEwxdTdtU20xWmJOdnZ0MU1nOXNsMGt0bmR3cGtiU0tiSzVVWEVqczZIM0hiZlFkOVU2dWNEV1ZDeklMbmNBRHFGY1dYdHdRV0tZbDNGWTltQWhFdXpyVXJMbXFOb05vZnR2YVk1bWsxNExUVkM3VHNhOXBqcmUwTDVYd2EyNzFIYjNFMWFjdXlRdk5iMFRzTDFWTnpTQmpmVmRlbEw0NUNGbElhNlZ2MXVDVlJhcUJ0MlZUcVFQdU9jTVc3aHJEQ09pbXZXaVBpeXk3RHo4bkd4ZEpKTEZKeHdjektvSE5COWZqb0Q4TDY4TUY1OTh3U09ydml2Q1RyOGlCcFhCRzZVOXN3cUlnaDJ4bkI0Wmd6SjVlQ3daaEdubHIybmxWNElMWmdCeGlIVDhLNjFha0M0eEJ3NGxyY0s4OE5Fa0xuTHg0emR0M292ZnhqSWVJQ0Q3cDBlRzhNazg=","repeats":1},{"count":915,"lower_bound":"UlA3YVV3VVExS0xndU81SHZvWU9BQXNMTEpKOWwwaXl0WGYzMDQyZWxMSHpsRHdUY1NWT2d4MEV5Zm1tb3JBd1NibW54NE8zUzJSZw==","upper_bound":"UmVsSklpQmFPQm84N1VoeXFVbFl4b0syTUlQOUYzWWFlVTZHUUZMNUZoSFRHU3NWSVpncUdGdFJYdm1qeHlhZ2x0clFlSnNGYjFFWTdrOWlIR2RkNWV3bjFackQwUlZmeUxsdjFXaFc1Qk94Y25MOFhacmRnVUxkSlNNWExZWXVaYVduOWRmcEx5SGg3azRvdExodGt1OXR4NE9kc0pVQ2FqTUJ2VjN6SDlGVA==","repeats":1},{"count":923,"lower_bound":"UmdQSUFPczRqVWFpRXVjSFVNNklSY1ZmQmxuYnBKMDRNcld5SW5BcGJLTlloYUVpbWdrM2l3N25GdU9rdkg2dmsxbGVCcjNiT3RSSFlabkVZd2ZUTW1NN1NETG5lZHgyYU5vRGp6YlFNVkt1ZW5xRUhqenJBaEJ3ZUZwS3JYV0pob2V6ZWIxbXVOdXJuZnI4M09Ia1BzdXc5anVKWDJrdA==","upper_bound":"Um1GSENkS1p1Z3FNV3pwU0lPdU1RUHlzNWI3NEc5SWFVMzNETGxpMTRsUjVRYnVrejZqRkxRV25DcmgxOUpKcXRTOFp3S08wZEF1dWxZazhuM1MyS0JYMk40VXBPWFNVSHVkTFN5Yw==","repeats":1},{"count":931,"lower_bound":"Um5leUE0TTExRzVwQ0s4SVNldFFZR1BNQWlWcmM4U2hKRkx5ZWhOZXppQnR2REFzSnZOVGNSNVhSdmtXYVpMVXpRNDBQMzFOdkRpd2dsamJmWFdZdTZRaXliWU9KUlRlRnJSQTNldEh2QVA4QVhRSXptOHd0QW1nR2t2eVJwTlZ0eE9jVVBTVm1YVEJzU1RHeTZXYWhRenVTellKR0F6WTEwQ1NOMW1aaDZSV3VRVW9oQjlVZEhxeUg0V1RKbVZzTzVDU1J0ejFJaTFBd0ZBc0lEUUgzbW5Xa2FjWEFqUWV0MGFnNXBQaEdBV0JLd3BLTnMwdg==","upper_bound":"Unp5ckh6Y0VmMU9MZDVaRWFVWlVsazR2bm16eDdDMWZOdG8xZjMzQ3U0dGpzNGtjMXc0WU05YWU4NUV2UkV0QlZxVkx4R2R2ak1vM0dOTHJQQjIxVkZsYWtGdGNmbkVzNHFMNzJyNlFlV0llaXRJRXJCOWdtcEdRcnp1SXJodFJ2VHBwVnBtQkk3SzdYaW9CTmNlQjNXSzl4ejFoZEdTUUJDNnByWVN3NnNiODRxVVdJRW1GNEM0eTd1TnRPODA3TTNaNXVwRE9WN29yQmJkWURZaXFURXdvelpxWUpsY1E4UWtMTFc1R2NpWnI1NzFqTQ==","repeats":1},{"count":939,"lower_bound":"UzQybVlBdXQ3T3AwNWZUUFFnU043U2YzNVBsS1E5Mk1uSXN2cWtZRkV1SEJKQUxiODFrZ2VTZTJ6SnEyR1hJTHc1M0ZJUkhUUmxjQVhrb0ZwM1V3MDVROFdwd0I2RVUzTzlCZ21HcFFMeWs3SGswaFVFS3FWeFZXVW5iazNwTHd5dHY1VTBGQkpWeWdmV2Z0UXZQTGNzMmROVnVJbkt1MEtIWmR6UEdkaGs4c0psQ0RrMGlER0txWlNxVndhVGhwWnNiWVVSNm02MWxnOHIxU0sxTlI2RVBvMzBRWW5TVjlsOU0xRnNrRFk1VzhNNHJsN1ZMbmRaRFg0eHpldW9Mcm9ZeUlzeXBSNGNxZHpOYnBtVkkyWXNrZkJHazBoT0RKMk5xWlNwU0oyRkpYNElsVGNFWlVIUA==","upper_bound":"U0E0QzNOMEd1NGdyQndFRFo4NFFiaUNLcWZPV1YwbDZVZlBNSnBuVDFYNkNhTVhCVGdFSHkzd3dUVWZ4Vm55SEJEWnVodW5xVmxScGJLSjNSQVY2WnlYZUdDQkNSR2M3c3VTUnpWQXdSOWZ2NTg1c0NyUFdNNU55YlJyN1FoaG5uQlJEa1MweUlqTEtCaGNTSDkzTms3NE9jRXhQUWJWalNOTFRLTVp3VDR2WThrdmk3QlBuZm5WYUpwcWxZUlVDYXZ6ZWhMcjhpNU9xRFQxRTV5a3lVWlE0TFUwR1FFRUZuYzU4WFF4c0cyMVVscFhpNGVucGpKeEpOZWdKeUdkTmdKR25oZ0xSSjFhc0g3Y25Mc2oxcDBNNDV4eWpXZWNTeWhiNERIa1NCRXowRmpZelBHeHBJNEJVNm9PVjBLd2plWGd5Z2J2R0tnR3dld2RYSmFJZkRvS0RwS0ZqbkNMTWE4UnNmREFISkkwUFFpU1pnOVg4dzB0ZGtZQVB4ajB1ZHVOdFRMQ0R0bnZCYm9LdzRZNXNMNFFXVEp0Q2ZBQW9BOWhlWGdLcUxrUXZlNUVWZzMyR29xN2ZrR05KTU9xWXpNcnRjaU5JaXRKcEtUWHVWbFE1dUgyN1FVSmVwNDlxUEhPTXRrSnJHcGpoUDBjU0NZcUk=","repeats":1},{"count":947,"lower_bound":"U0NDeHR0ZWtraFl5NG80UTc3d3B3cTl0R1F2aGx3eWVnblpxMDA1R2p5bGtsRUV5cDlZNU1MclBXeHpvSUIxUHc2ZnpDdjJFN29qeEppMFJpbUQzMnR4TDVwNTZuOUNwWWV1ek80NnJPdlB2eVd3NnY4YnU0cHVuQXZGdHo5OEwzdnZQSnI3ck9sN3hXWWVoM1ptbUN1cEl6dWpXMzRYejlsOVMyUE12VHQ1cUFHcVd0NUQ0ZjdLaXh3Q0c3c2FjSmV1TzMyUDhGYmhCWUZIc2pCaU1qeExabUpxSG9KUDRCakxkU3laYmRvTElDYmNRS2R5alZpcEYx","upper_bound":"U1ZBaFNtYm5uY1pTbnhUQ0hvQ3k5cGRnNzFCcE0zVzJkQVVJQTZRdE9XNk9LN1NpdXhuYVQwdk1NVEhHdzNVZGpHbWlpVXRtTHZIdFJQRWdmVXpyTm4wdEdXN1luTzZ0UUU1VjVTeXNZNEllZGtySVRqM255T2xTd1hxbmg2eUlFS3ZwR0phUGxJVnQzQkFYQTBWd0hUMm9oSXlKTHJ4MGxiVWJnaFdRaVUzWWRxcURscEFwQk9Bbk5oUjFLUHRpcFplUUZWQ2RnSTRNcEQyS3JsZzdoSTFNT2MzZ1dKSHR2OGo4Y2wxSk1UYVF1ZHJQTnBUeWNsV3JlV3FDUjZIRG1HeWpKTThBVUExdVp6MDBITTJlTm9zWDNhY1dLSjBjcGNaZEtLeWkySmtUV3AybzBLaDBGakhPU0J1bEdSV01pM3pab3ZiNm9vYnJ5UjQ3bG9lVVNtaWpaUEZXS3l2dnczR3gzVUpsSklMejRxN3Rub1A3Y1I3akxSck1hcHdIMmRaZEJvclY2VG10NlNHcTRRdGN5YnlONFhyeFc1VDFodGJtaGNYdklpaU5iRENUVHNUZTNHTTU5TlpPazlXWThEWFh4RVBmUTRHVnA4alhab2dSNzIxOE03Zjlla1lsNHN0Tmc5VlZlNmxNU0pPMEk1OUVLNjNiMW1scHdhNUx2bFFUVHN0RlhTZkdOUVA2QlRZTmY=","repeats":1},{"count":955,"lower_bound":"U1ZLSXlTVW1hQTdaSEtvWTFFRmxtNFZRRjJEODNVeXFnWEtnck5PdllpbG56WDZQbVhHdGF1TzhDM1JrcWhPdU1h","upper_bound":"U3QwVHltOUNTMDI0Z01kU1picEEyMUdTVDh3TnVFWjRoMmZ0WWI0NzhrQXhtamY3MVhtY0NwNEx0TkJ0OXJpeVFUOXpLZExUeFhoNjVXeWg3S0V5aXE4dXpEVW96VkcwY0RMQ0lmNFQ1aXZNNWg1V0QzYjE4VFYzMU9aZVJsVmU3SlNadG5WdENpajFUeG9FbDhWbEJDclFnOGZYZnY5dnZmV0Eyb2FVSlNKd2FGdWtzSkNGcmFTMmZKeG44WUM1bnpFb1JtRDJmcmJVcnl4MVhuZHg0ZURwdDh5SVVtRVM0eGxEWVJqN2RvYWJwVllVMFJISXVCblZMWUN1RU0=","repeats":1},{"count":963,"lower_bound":"U3ZWakNhc3RqMjliRlZMZUdnRWFpTzVva0VvS2YyazlMcjh1WW9SeU92REZyUzFONENOd09rOWtZdW5zRWFvQWx4UXJPN3BhamcwN2hUbFBqTWNTNlVhZGdrdlZnMUU2SDY3QlJUMFNNOWpkNVpNaHdwU2txQnJGVDc4MUU3c2pPcEVDd0lHNDlDZWVQS1l0SWRHdW9RYXNRRG0xSmhzazFoYXZ1bWdIbExwaFluTHpDOXRFTWR6M0hqWWRNRnQwNHhzc1hzZWV1NW40YzY2N0Z4ZHlpT0g5SHZhU2hzM1VDekhRR1R5U1BiOHVwS2xWenFSbk1IakRLSXZaYlA4cHhDbVh6bnRjcHk2eUVZMWM4T2hwMmZ4aFhVQzJJckZZZzNUT2RBQkhGc25MQ2NJZjh1UG55Z21meHhuNlp6WWc1WHNzaWljZWdSbEVtejNpeTN5amFpaFJyR2xXQ0xVRlpLR2x3UVgxenJ3ZmxIdXkzUzV0N096VUNIZmo3dmZSUmQ5","upper_bound":"VEhRcXBtN0l0WnJtbUtQajdIMk5jT0VGNEJpUFRsalpLa1Y1UHBuVHgyd0o5VmFDREt1bmlwQ1MzNzFlN09NUUZndGFWRXZVY3YycmwySHhKdzJEdjJ0Umg1WWpZb3hQNDg0akNZOW1US3hJWkFnSzg2a3NsdHN0U0RGYzE1MVZubno2SEoycEhXZ01mWjFUM3JtRWlYT1cyaHY5OG9vUUNmRzFwUDF3Q21nRXNiRTJMZGE4MUdJaG5GczB1VjM0VkhJQzAzVEdadHIyQ3dINFJQUlRFbjViQWhlSFFLMTRHQm1Qazd3WGZXUldyWmlyUVdiTjh3TVBBcFNVUGFvTlJTV3o1ZVZGc3lkRHM1dDU3Q0JjUjZsYWNOQXFWTDloS2VsNkl3a0Q0TElMY2NST0Z5RG1uM2ZNYlgyNmZEOWhNYXBlY2JjcDJTSHAycEZiZnZHbGpPZFpEWlVTc3ZBWmtYUUkzeXZjaE5lTzZPWG9GZFoyTDF4YkswZFFHVldDVFNtemJoZVB5UUZrRE9CRllZdFZ3cDNveFFONkVadUdHWjFnR1lEWFhXVGVURnZZME1WQnZUTDhsV2VWTDAwN05qNFRwY0d0ZFRkNmNrOGtLcVVySXEweFEzVzdz","repeats":1},{"count":971,"lower_bound":"VEh2UEJJakQ5MWZ2N25FNXhYdE5jNHdRbEdHYm5FbUpDbVdieHZGRW1VTDFiRHo2bExVeG1MSE9QMjNzQ2lISjJFSmFtZ3ZBS2YxSnFDdWZXaDZGdW9NVGdlR2xBbkVtRzVNM1lkblRoZWtLbHpOaklBTFBvU21IOHRZTHY2VjVhVHVPcVdpbU1kZjNWTDRmRzgyQUVncW1vVDdUVFhUckJYNFEwcWczT1hTZGh2NkJ3bzdQZ2RpM050WDMzdzVwZ0xSNkhRWmJpd1BCdW5kMzN6MUR1cjZHTUNJeGtwNDFydFc4SEkxNHZoSzF5VzZ0MkF2MTc5d1hRYURXY3JyeHpiNm1pT0pwM0p5bUFyenZkelZQcw==","upper_bound":"VFBtMzR5SEJLQ0dmM2ZYdnE5QzhTYlR4TzM0WEpFWGZ2OUVUa3NtTmR3QmNIVUc5YkhYNU1qenhCek9pTWtUeXd0bTFTNlVFVWtnZE9mT0NDRTVYMFJWRUd1dGo3Z1hSN0xrY3BEaWVPY0NzdjNQRGk0ZEl3VTVmRmt6d2E0Q1RMUmdidWdWTmd2MGh0NlN4a3VJaVVuMjN6UnBOd2Y3RDFpVDI0R1YyOXpPY2hjNEQ4M0hreGdXS04yZllkS3hFak5aT2hHOTVMQTFIWUJLZXVtMExCQUpoMUZNUndraE5hZnZMVHpJdURsSEJTWDJnVGxQbUhNSjh2cHZub0J6TU94NUphSklPODRSUHpzRHQwN0ZtbW9kckljS2VZRzZpUExyekhCcW5jY1JlaDBBT1ZaWkM2Q0dodndhNDl4amVjWXVSdkF4eGRrMzZQSkNMdld6WWpSckV5RDlvVzA3OFhxVE05bWd0","repeats":1},{"count":979,"lower_bound":"VFQyc1lTTkxKbDVkT0oxemxQZHByYXhYa2p2MU9qVTFHNWY4eVFxcjZUS3JUYzJpcXBwa3lFQkdLWFo1VElpUDhYamdlYVdDT215WlF2RGQ3Y0psQzFGQ1JFZWIxR3VHQ1RUUmEweHZkTWpxZHRkWnNwWEN5NDM5VDJZbG9jUjI4YkVOTHprWks0RlJJd3JlNTFoVjNTV0RaOHJINFNWNEUya3FiSnJCNVVBMHNraG9wcFdTbHBOUXhRdEJ3OUJua2lzMVNEbXkwb3NJb2VrdHJBdWNuMkhLVU5ZUEM=","upper_bound":"VFgwWnZxUENCN0ZkTXRmUlJ0MUN3cUdFc2x1T1Z4QmJOcmlRNzlIVEJqZDVScENLQUhla09ITndzT09xeVNCZ0tqWUU5c2pYMDJIT1pXV2VCZWE1ZlREWnI1WWFIWFpyVExPUkNUYnVDUWJxSk9oaU8zUzIzb0xKSmtmcWdOSFE2VndFbllOZ25wNjNtSVU0czZMRU04YVFTeGNHcW01U1hFanJoUmI3OFVX","repeats":1},{"count":987,"lower_bound":"VFhqQg==","upper_bound":"VGFvR3dqaWx2MTgwSDcwTXcxaEU4eU0xcGM3d0w1bG9MVWZjTXpUOEZhTnc4VU5DTDhSdnB0T0ZwRTdmTFp6UkZsajI0NktOMXc2MHVFT1ZJazdjb0tNdW9QdTV1dGlhS09sM3RnNTk4SmJkUkhGNG95a0FrMWlVT2owcmN4NGx5TWgwMU92Nms0VFRWUG1Nb0UzTGZIY1pmOHhmWnk2b2k4UXBHSDkwSmZEMUNXU1dhaDdTcEpsMlE4eWlQeUhJSmlzSk9Pcll4SDBrSGl1UFN1b2l1RDRrek4xd2JTdGpCSG9GR2tuMThvUmxjOVN1MlUzSUdJSWNibTd4UnVZZDlGZkdwNlZwZ21ic3RmQmU3cVZKdnNaVlpNSUwwVVdQWlZHcGo1Uk5tMXZINTdyTndBMUpiY0NwQm1EZ3FybDdMVWpIWVE1ZHc3czdkR2VjeXhsTnhsTlVFSHA2eXMxaXdXRnk4ODBIdmlOM1l6bmdkU2dBamE1VUlBd0lBVGJKN0Ey","repeats":1},{"count":995,"lower_bound":"VGNIVWVDZ3lOa1BkYmZTcHlsYkFuSk1vb2syMnNMeDNxR3ZKWjh0QjJVNGZlNURqbmRyaXQ2eGl1S2dLaVoySUJNOU5QSQ==","upper_bound":"VHhFVWQ0UUh1bjNkRGR4cGNaRmh1cXFqWFlTSm9KSXRBUmpYR0JvdHNqQ1lTcUx5OTQ4UFRPWlA5U1lkamtpWkhPNEk4S0ZwS3Biemt0NHZUdm4zTFJnd0lsb1dOWnhCWVpJd1A2WHZ3TmN2UzQwR2JKZ05rMmtQSzRQN1lFYjAzM2FtSG12TjdvV09jaUJ5Q3JpTjRjUEgyQlc1MnlyRzZQbEZlY2Z0Mjk4bzhqT1puSTN5RlNOeUw2MmRveU5nWTZsOU5BWndPdVZFUjRqNEVoN2ZROEJJbjAxRVpzQlBlNXU0Y3NwVkxlVEFxMVZOZThKUHZsTEhYYzJ2Q2dEZVJWNkQ2WXdOc3p3a3oxS2lKcE5XNnlCaXlCSkc2","repeats":1},{"count":1003,"lower_bound":"VHpFM2pFUjVQUFBJTVBNVUV3WG8yNXhrcDlKdnMxU3o5eGR1cWxEUXRkcXYwMWxja2VwNVpIR1FMSk50YnQ3cVRBMGhxSlBSTW1CQnQwSGx6T2VYMTBSYmN3d2YyczcxSjBDSmtPZ2l3bjBLNFJKU1diZVpOQXlpWk1lVDdOR3RCRklUczVIWmNRVmR2MjNka1h1THA1ZzVjcURydVpqZGQ5MGlKNDZnZHJNaUlDRjNtaGxYcm5YUk1TVVZaZDJ6amxsTXhvbk9acXNYSVpuZ3dmR3JhT0ZwSEtQbVFsU1hLVmlYclE3bGNJMHNvWWR2dVYyc3lacldOWFhVNGxxajFBZlhhV01ZSG5TUG1xMXFCQTdmc3JramNoN2ZCNVJLSllKaU5xcjVrMlM3UDZHVmRSSzdrVjZtRm5LRlZPUTlhdnJ0OEpXM3lBTE9wbjdLaWFrTTBrNE9KbFBNZW1sV1pEdEpSYXpUbkk3VG03V1VhZUg4eEszVkVkY3oyWjVvemRmdWJnd0JPSWRQbmxsZ2t3ZGZCdWZ2dUR3V3o0a3Y=","upper_bound":"VTdkWjloeU1EVkRwV0QyV3hpMU1KenExSWtkV3VoNFJsODI4Vk1CMDRQeWRxNmtFTFFOcDRGMlcxQnUyVEU5TXVZQzZkd3U3MUh5Z3FUbmlzUE42TDB2QU9ENmVIOW8yM3JaSGY1TzRNQmtLajF0eDQ3bXZXZHU4eHRSaFlpNjJvWVl6aVJnSmNkckFKeVdNUFBnRlFrVlU5Y1VWMUtwSXV5bTlHM2JhSHp1SjNIZTQ2dDdhdXhNNjhScVJncXZIcEJISnM5Q1lIbkZBMENQM1V4Q3VwQ3pjQXh1TFQ2T0VTRDJDR2txWTY4dDZuZzVHTzdrVEM1TVFHTHRHSnBjSTZnd1luWXhrMEZWdVZobU5McjhaZlJuR3Rhc1ZTdFRXUHJDbk5wdDRtOHRwaVpzWmR3WXVPdVlNa1J2TGVBTlZ6U0YzM08ydmF4UDlIT2JRTDhJdU1xZmxmYTlNbElUNnk2Njg1WXJSYTFSeHNmUU5Jc1ZBN0NDMDU2OEVWQnRrMEI5ZU4xM2xrUk9SVkl3bjY1aFhyYzNSUWY4REVwMmZnMGw0TW9oQlNFNDA0OVF1UXpnbVNzSGNrUGN0aXZVWFg2NGxOQ25sYU1USFc0dnFBTHBPTWlTY0FTYkdDYnpmczJGbnU0VzNabVBaWjVjVU0xdloyRXl2RnFtSXJuUWU1VlBCSlAydk9v","repeats":1},{"count":1011,"lower_bound":"VTg1NTA3bWc5WUgxQ0tZYmdSaUF3V2dpVTFtRUtuNVhGUkVlVTVNQ0pFZ3hJTmE5TWxuRkY5YUREVTM2MGVseDZjM254MGljRzZHNUZaZTM3MGxGb0lRU0MwQVRKQkttNXhtbGpUYTc5TEtOaGRyaFhsYnpRWUV2RUJ5U1dMSm40aDh4dlJlRHJiWUdjNEU2SVNjUzduUm1hQWFaaWJxdlNVM2d5WlhGVlpuZmg3VUZPU0ZjUnpzZ1lYdFRzOU81NWtZdjZYS3YwUnZlWDNvc1lZamZMd1ZtOGRqVWtRWUkxRU15MldZU1NpRVUxZVpKaHZ5bWNZTURodW0wZA==","upper_bound":"VUsycTU0bmw1WmVxdkIxVXZORzNvVVpBOXpNZ2JzRGFUZWlsWmU5UFowM2Q3TmVDTkxiYloyOE1zcWhKZ0Z2bTVINlhORzJ3N3NyMGJVWkdnR0dJT0RObHl5U2tLU1FXbkU5d1JnWEE4ODdKRkx6NGRtaXM2MmR0dDNubThPTUZtUjcyVWlvZEVlcUljelAxclJBYWtHaFdQWk5Zd29FbU40U2Q2bmxKTWpmOTRlZVJvVXFLa2RzclhwamI0ZHd5U2xlS0JQcDhGblNUUG93Y0N0QmUyUW1CZVlTQU1GRnhO","repeats":1},{"count":1019,"lower_bound":"VUxXd240M0lSNWtqbHZSakpTcnZ4SEt3V0dlZnFRa1FMNVRpR0wya3cxS09UOVZqRTlYbUR3M0FRWEFsMmVXeFc3Zmc1WGlTck4wWUhiS1FabVp2N0xpaFhnNjBhQlJCZGt6VEFHNHZINGFiOXptdnB4dGJlVTdlQTNuQ3lJa2R5Z1RKNHhYdkxqZ3FIS2pERG1ZeFR5OGxaMVpXcG9zbnZTb3lXSHFTb0xxM1dOSGRySnA0UU5CbTZXV3BzbnZISzgyUE9STjJodFBvVkpaVUV3bg==","upper_bound":"VVFXNExwRnRi","repeats":1},{"count":1027,"lower_bound":"VVphQVdxekk4VmloekxuNUx5Uk9XQVp0eQ==","upper_bound":"VWlRNktlOXZINDNLTTc3dUVkd1lvdjlsSDNNcDRmZUN3OExLUEk4bDBGcmg5djhuTGFqM0xrTlh6cHVKc0RUMG1RQ0w2REk5QUlwa01uQm9JbzdrVUI0VUpKSE5uajlYOEtnVnR4MnVpakVYYmRtazNQY0NSWDhZUWZGc05lbVZnSnVuVTRnSWlPSTZjQjExWjdXYkNoTmZWVUFrUHl4YWhGQWV4djJyaWxISVI5RzJvZUlVaFFXQmZkU0NldXRFRGJoT2dHM3EwMmxsVnlaRVV2MmZsRjVhWlY4SDhPd3c1dXRYNlNBbDdDYkp2M29CR0ROdXRMV0s3ZE1IQjIwNGZIOFBzZUFkclZiMVZ4SGNtMXhzNmdBQ2F0Wk1KRUJzM1JqZFZlcEZjYlRlcGhlblY0d1pwd2hTaVhmU09DeWFadVQ2UzV3NkpNQ3FCazAyNzNQazZGWjlMdjg5WlM5bEVYcHdleU0zYWtN","repeats":1},{"count":1035,"lower_bound":"VW5FRlR1VDJjYXVaYlFQSjBTYmU5VVdQODBYblVReGF4V3ZPN3NQZ0ZUdnlpRWpsWmRNaU5Vb3FxWDhGSnNtZnowMjg1RXVuNUE5N0dwbFlqZHZseGFNV2FSR3ZZdW9EcER4WGdrb0QyR0dsbHVWRG5BYmt4WDlIYk55eDVWZ1BvamdvVG44a3N6bmpqR29zdER5Z3JXbzhwZFdvTlpMYnd4T2VsdW9DY0l4cENXelh4N1RQWWRLZ3c2ME5BUlV5Qm1sTVRsTHBCRjg3cUIwcEdrV0NZSmJ6OEVGNlNPNU1SdWRBTEJPYmhLenlzbXpNZ1RKblF0U0dZNHUwS3MxbEswZXl2aVg5VXdMd0NnZjZoRmRMbnVuVVBMZEI=","upper_bound":"VXIwemY5SGFZbmg3dXhlTnI3aEQ3UDZzRHdYU21taTViUmpDUndHblM3RVhSVGxiVlp5aUtFb1hUbVZMQkdKdkN6aEJJQUFTbXU0Zk1aRXgyeWk5MDZBbEY0QkQ4WjFHQm9vNTRBUHdQRlpRNTF0WWpRNTlrZHRzQVJ2UlN4YnJ6aGRJQ3gxVGVyNlhPS003Z3gzSmhndGh6U0lGZFBnbGhlR3RmU1I1MVlwa0JGamtvUEl0WjBkeUM2ZGZEUHYxUmF4NXR2OXZyT2JQWENKdjZNcWdWRFdjb1JGbHpYdTA1dDVwSVJIRmFENkhBcWk3MUI1WVcwQktRUXNKdDc3Z2FmT2JUcmFDQmc3U1FlYlBKektaeU9XWmhqeHRVQ3EySTZ5WEo5emhjVzFxQ2YyOENDTjl2WHRWVWpMcWNqdUNISWNVU3lMdlJ4Qml0S2R6WmRBVkZMcHpMbTNiZGlpTEFzanlsNTNNdEliWUVKOU93M1VnYkZOQzRPWmVpSFdlSVUwVGZYazRhbzdQTjZoSEJwdjR1Mmt2TUtYNHVjR0JNQTBzMzN3OEZ1S1B3TWFxeG5aUDlCdUlJNmFBU0hJcmRzaGlUZHdiVTJuSlhOM2V1STNyNEd4bkVNZmFFQVZtRW10bEN4WjBDbElPdkRmd1BXMTNua044d054UHFaQTF1MG9STFhqNWhHenREWHhMMkdYODRhdWYxcWJITkFRRmc0TnJU","repeats":1},{"count":1043,"lower_bound":"VjRZVzd3MmwwMzZxZElvMG9pV0lqVExRTFJFWmM0QjlROVJNeEZLQm5qVXFkdHB4YkhaVTZJWmQxT01wbUNNMHZzeWhiNU1DT2ZXMmpldVY4TWlTcGxoYlZDNTNuekVIR1FKY0xXVVdFSXBVYmdoWkN2ME8xd3JjWnk1d044Vk1pMU9JcGdOd09GcnlldkpZclcyYzdWaWs2MEVPWlRNMXp1Wmp2S1U2UFpzYmpyNXp0UUNNWlZiZEhvWkJoUE14ZzBPaWF1Tlh3RG9LVGlpeVBqT2N6dVYzb1luTTJKc3JYbGMyV3haaG9WT1VsM0RUODJFS2k0T1B4M0dCUnY5cUQ1bDR0YlZUYVZqSnAzMVc0UXVzaTdhRTFvR0swSUg1T0N0MkUxZjd2SUFLb3BaVHltTGkwaVY2ckhJd215SGxzWXNWZjNCUGk1OE1ienB2dkNQb1IzN3lncU1GNGlOTFF2Q09aZURoN3FvbEV1S24xVnNyOXA1TWVZQ3h5YWNFaWZqb2piMnRrVHdQNUNuODN6d3dIV3JPQzVJU3ptbUxZWFg1NXhZdlI=","upper_bound":"VkZNbldPdlBmdWJtQVpOY0hzU1BxRnVTamhpOWJjZ3NYN1E4NmRoUEVybzdYVGtyazJpeVBRcnF6QjFvdE5abWxBMUZtanBhQ3o5MkcwSHo3czgwM1ZPdlU1YkJ4YnlnTVpkdUlzcGVoRnAyTE45b0hJTklMYmU5MlZZVU1Cak9RTmFib0VNUTJobEE1QW54cUhpeE9SU0RSYk5OUFJLT05QclRqMHdiYmFHQnBDeE1lQXVuNTY4dFQ4SzRXNWN3endHWWx5VUp3U1V1bGlSOGlaV3VwaGd6cmhBMkh5SFlORElPVmVKQWxzSm0zOVlPRHl6d1pRVDZpQXdRbnA3a2V6SmRJOWg4UG12Ym44dXA4bG0xVGVxZ1FnTlB0RUtkYnFQN1gzSGNOWVBaNTJaaHlZdU1WOTNFOUFPdXZHWllvcA==","repeats":1},{"count":1051,"lower_bound":"VkZsMEZGbXE2ODdSbkV6QTRwOVJsZFhIYXNZWE9lNEN3UTRMTHl3ZnRydXVVRnRPdmU5anZFcUxDelZvRlg3dmpFSTBseVd5Zk1hSVZET0RFTEtKSnp1UThKZElLSVp1ekdlNlYxbXpQTGxGZzh5cUdyc1dGT1lvQzM1SHlFSEpYNkJDNWt2YWxPUElKcjRqY0Zmd0ZvcVRMMEo1azlmaHRSV3IyRUFHcnM=","upper_bound":"VlM0SkNxTkEydVdVVzVqVTlpbEsxZWFpbngwNW0yN0hsUQ==","repeats":1},{"count":1059,"lower_bound":"VlNLcko3OW80T21jdEN1WXMyRFoyQUNZR214dkVDYVAwOUY4eHpLUUxmOW1hNlFpcUxnZmJ3UmpCajd4Qzh6WGxNbjM5dU5uTjI3R2VkREpyZDRtaE5qY1ZWbUFpS2tZSWszRTI3RnpjcEJFRU1CWGhuODdLcWhjaTB3Z0U0NVRjdFF4bTM4TDdsMER6THpkcGc3aE1vU3k5WXBXbWl2V2pPSlczczV0N09taGxhTHRIaUZMazRPY2tIb0RzaVQ3Z1lLakhWUDFheEhmWmlJdWRJVHZlQm1KMEQyQ2xoN0NuZWw3UlJPUko4cHk4dG1hMWViNGxMa1JLOTRNVmNWclBsbmhIcllmTEdNTzhoeDBpNzZuVmt0QlBDU1pHSWFHb2tZRkJmNGY3M0lPVDZqaGhZNjNDcG5KZ0I2NTV0ZEJqR3V4aFRidEp5ZWFaSmI0a0dNM1M3TXhOSFNOdXB2ZEtOWVQxbkR5blN3ZU9JWUQ1TjZ2bFE0ejFlZWh2UUFsMmlPT2IxYWk2SlhPRTlPNkZ3N3FBSU9hSUlBbjNDOHpKSlRSTzBIN1lPOFRvclNabnRSc3ZtZkhSRnNsSmkzUjdGaVZXR3Fnd1NSVg==","upper_bound":"VmRnWmNuVm5aSEdmQ0NIWHFaOWh5eXdUSGJIVnFjeTVmdmNNSmJPaGF3UGJYdXhlRjJld1VRaWY4SUlkUzloeG1hTm1aT3BYUnpNczE3VXZScklkM0xjV1pPMmxiZmtoRG5BRVJabHRVMWN5M1BiR0o=","repeats":1},{"count":1067,"lower_bound":"Vm5LbmxUdWRiR1c5YW9uWTdheDFvd01iYW1OcnNDVzdjTHltOVFqd29xbWJqWUE4","upper_bound":"VnQ3OTZlOFlMZXJSTlJ0M0ZTZVRiWlVDbU5CaVhaVzBadjRWVnBwb0V2UGRXVmxnSTBydEpBUU5ZSnRoV1ZSVU5ydWtXNEhGNndzWHJSMGJqVEJTM1l3dXhSemszdTA1ODdPQ0pOMDQxTVY5ZUMyVmlKTUo3WncxcUVJaUN3WE9leDZTa1JNRkU2TXpVNW44aVBxMzNldkxaOE5yRXBhRE8zUFcydGlMVkoxTVV3RGNGQ05GbXdTR0lWQ25xZU1vYmxweUhaakF2bXdGRXVDVmFSNklSa0VBQ3pmTDBEdzAxR2ttNXk1T2wyZ29DNUcyemcxUXo5eTRGM1JPM09ad2U2UWZTM25VNUlLNkZBek1TUERSVVA1VWZremo0OXN6SVZiUXRYRWtjaDE5TTJoTlZwNzFsSkNNNW4yYmF5YXVtR1p5SW94VUdNM2FiMU91M2FqcmpyUFI1MDRVWno4OFZLZFVQVDh3YzNDSDBOb1lvQkhtQWduRDNnVk9lVGZ4aGRxRGl2Wll3RmhlYkNEaGd5ZVFGUHN4Y25jZkVlZmd1N0VBalBkUVdIb3RYV1VvYWd5NUpWNkNTeXJaSDZpaUlENERQY2F4TFp4Z01nVzhscmhwaDZYSw==","repeats":1},{"count":1075,"lower_bound":"VnV6cFdTbzJyV2FQUTdVSWkxb2h4ZmVPMFJVeU05Zk52Rmh4ZEJ5aEgyZlRCVERWQUJEQ3RkSGZib1B1Mk9zWVNRZWRmcGpSUUV0OHdpc0l1eDZ6UHJsY1Z0aHNqOTFBdmV0TWh5aHVGeHhrVWVZSUg5Z0JaMVNjMDEyVUhpUmg3NnVOUmVrb1ZMRUZ1SFlnUUxacFBHMmMzalVxTXdIYUtpQVRXZnloVHc1Mmdpc2RNdUNDenVnUHJLNTNsbEFFbWJIbGJZTVZEMzJUejJsZHRtd1BCMm5kTVU4SGZaSmY2TWgzVnhPdUE3WVBVTGFsVHdlTlB2Uk5xV1hpbWpUZzR1ZnlTYmNacDB6bVd0eVB3eA==","upper_bound":"V1BHeUEzT2RVZ0l5UFZUVjlpMDRZN1JBclNReG9FdWc4RDh4Qlc0YWpmSWhYeVVHYmt2SWRuelNHT0lXekJGVUJVdmg5Q3hWUHh6dzIwYWxnOWdaSklaOFRTSVpIUEFkT2hxdUNsZWNzcW14NUxjWGYzRWJDTVVtZWxWb1dkcm8wTlNGYlpCNE5wc2tFMElLOWdpMzVoRGg5N2wySUd6MU5DVXFqQXFjRmVPaXc5eXhZdnB6SjJoTlV4UmJWaFFNcW04UnlBYUVoS2lyTkkwczRZOFBibEtDaWE2dFVtR3k3U3ZPclJrWVAzMVp3MjF0eHUxRXdIQ0RQcTlnS0pEQ3dZYnBsOU1UV0VjV1VFeksxMU9LaU9FUDhnUjJucUR4VzRCdW9BdWg4WTNRTzJxVzFkMENkWFgzWEdXSnFlRXpqSGdHWXFETzA2MlZwc1M1emR4NFV3M3Myd0RaMXQyalNBWUp0VkdycnJmNVZsMVNHTEhuMnNPdEJKNXJUN1ZaQkh1TE9CM0RuQk96RkIyMUJZanFPd3FLM0JuYnBZQ2NSRVdzRUpMd0hmbzNBWGhDZ1JRZEJMcE9kZHA1NHpmckMxd0dKYnRxTk1PRHJHVzM2aE9hRjhZald1MTl1dktzeUZaWQ==","repeats":1},{"count":1083,"lower_bound":"V1BmaWNFMXpnaDRIcVlCOGRrSldPZUhRVVJaZ0d2YVNlblA2am1ydm1HTkMxWUhjU21RUlF0Yg==","upper_bound":"V2VpZ2xRc0lJZEVyMmhMMlF6MXVEMVhMTnY0RGlXR29XNVUyclZ0QWhSakFnb1BCZHlmYlN5SGZPc1E0aXBqZzRNQkpYSnh3RkxnYmJsZVJ4ck95dlVPckNjSFM3UGtLbmJmT284azRmamVSbVVnSm81","repeats":1},{"count":1091,"lower_bound":"V2hRN3hPemE3R1FQa1FsS202TEtIZ2s1OW5US2NzUXhyNk1WemdhY1BFdENKUXVYakFocWxEbDZEdFRLVlNYWFNCWEI2Y09LS1hhTmhMR2k3QUJUc245aG9IRHZCY0x0VDhYdjNkT0IzQzUyVjdtdjJ2V2hHZm1yc0VZNHpGc1h5dzVKNlpxcXcwaFVZWkIwTmhFQnpnWmdaQW55bmlxejhWUTdNVmd1ZTJsM1Z0UnIzOExmZWdQWHpoeW1rc25DTW1ja2M1ZXEzc3F4RGZQYTdydUxUY3YxVWh0MW9ZWUFSZzlXUEZrVERTYUtQUEQzRE10UXF3cnNOV0VLTTVXejY0RzZmYnJjSjFXTlFuTjd4aVZFa0FPelVaZktJRnpNRVpRS0xYdnRZcTJlZzI3NUVOMVp5NVZDRzRDamhCcnhFcXkyckpDY3lJTUNTSHZMOFBUZkc5NHp2bUJiSHc5T2RWWlFlMTUzQmNtSU1ORnRBNktPbHZpQnI5NDN3N0Fhc1N1eDdWRnRURkRQczlRS2x1Q1EwcVd5UXlhM3dUTTRqczF1cFNoQnBOc0JvTTAwZ1luRk9NVUM=","upper_bound":"V2tBeXpWTUJJRktveWZiVlBkbWdlR3JxeDd1alVmeGpodXFuV3ZHSE5ZUGllUzU3U2VlUzJFTzBDdjNXb1k5NkRGbVNnTU9YY1k2dDc4QmoxTk9qUDlUOG9QSkt6ZXFPdUNCanhMM1pEbmE3Rllrb1A4ZkIxdW9NZ0FBbVh2akZReHpIOUNVS1NSUmRUdVVwM1I2ZEhzTW8xdUd5QUxRalc1NkxIRTZkbFIzcEEyQ09JRjVwUmdEeHdoS3RzYVdjNTVmSmZnbTN5S3g1dm1zdGx3VzBWUlB3OWVqSXh1SzFnakp0UEJqdFN2dGRwamdNa3RSc2Nqbjd1U3hJMng0cG5WbXd4c1RlYm1CendpSlVISmRoRzJxSzk1RFg1UVk5UXRzdEtrMHVwNXdsM0pJTlppSnFwb0pyR2ViNzc1VTZKSDQwdTRqTTJPVjZlc3FjQ29uNko4R2lTTXIxeG9VSlBESUMyRWFxQVpVTms0NzViMjUwN1RmU1ZPRHJTdG1DOVZVMUtjTUU5Qk84Wm04Uzd2ZnFBNEk1RGNFaW8xb2Zkc0Jyb1ZkVE1pbXc2elJLazVjbWptbkNFakxZOEt3ZEVrTmdrM1VlNmNsOUZsd1dlMmNZRHBNMXJhcklEQjFFZmlYeWNZZzlKNk9DZEE3WEMzWjJlVkVjWWdMNXJudW1YSmNUT2o=","repeats":1},{"count":1099,"lower_bound":"V2xrdmxQbVhWYjduV3hHN2hoMjlGb1BUOERGVFBUQ3FPYVZKNEc0NjVxcjNWMFNhZVNOdUw2Z2ZzSVgyOWthbDNXUWFFclJwVnNESEdoZU5ndU8wTnpERDNjQWRTMFpYVWtlQkdIcG9WVEJ1UEs1dkhVYUY5UFVNT1ZmOFNVMXoyN1I0NHFrR0lxZUNoWEM4TTlLSnV4eFVLcE5jem9UQ3pXMmJCbUVuTWJPYk5JY2xDUjhMUlNMaXRkTXFoSWhMdlZJNjhxVGk3NERCWHhqQm1vQk05U1hHbXVIc0U3bHAzUEw2Q3g5TnhuSEtvSkoyMnhwQjkwWDJiRkU=","upper_bound":"V3ZsenRZWWNmZG1DY0VnT1Zoa0lrNTFuVmc5eGpQR1YzRnZQcTU1S3oxMng5OGhQQVZ4cVFuSUdGM1JSSTUyRUk1Z1hSMmt0bmVNc2U4bkhtbWZNbUlBWDZORXRnNGxGSHhPNGVsNzBld3oyU1VTYVJsZ3NORFN0NXhGRzluYXloNGxSY1NLdGI0V3R4TFVJWEloSnN3SjNUS1pFbGRnZ2trZHZReGs4emJRenZpNWkycFRaNDM2Z3pNbnA0Sm1mbllxUVJqdXlBR1lDcTBzMmQya21BendtQ2pEdEU1eUFzSlpKQklHeW5mdE9ZaW9wa2xHZkhxODFOTHhEaXYxVWk1YlJzNTFrM0J3U1FzR2cybFk1NW1TU3pYUG9BbUtWREhvSU5rMjBsZGxEd0Yw","repeats":1},{"count":1107,"lower_bound":"V3oxeWY5WU1EbGtzbFE5eXpFSjRHQzdSc3hlVm8yS0VEREk3ZzU0VkNaUU9BZjVFQ1B2ZGk5VzNldHNQU2hzQzNvRDNFOVU1WGYyYUdhemRNeEhzUVpta3RWNWg1TXgxZVRUSjZoc3VUQlN3UWNoRFdxc2xHSERlTnZCOE5oU0NIN1JwTnBpSXBkMDJNdlJiS29NOWg5STdQUWQ5RlhCNldIVUY4UGVKTVU3em5mOEFIOFZiTGtsN041SklkWThnejRocTljWHRkSmhFSzVCRGI4Y2k1Rk5SUkw4c0tVbE5RQXBSTTNrT1BLWTFsY21LVXc2STlBczFrdWd3SXdVMW9DTDFMVm00R3dMcGs1M3dqdnNOdWllMktoQ21UWGZLeUltN2FuOU9kaWxL","upper_bound":"WFdwYWJhMmJIb3h4UTlsaHc2MFg0aFVHUExpRkZzZTh6TUxBbk51UlZiR2tGWWxKQlB2QzFJTkhkYTZtWVc0dVJxY1ZmNlZtQWNIM2JhV3NDN09HUTd3UFBDZ2pIZjRBUzEyc0VxQm1BTFZBSXVZc2NydTIwdQ==","repeats":1},{"count":1115,"lower_bound":"WFhReWFIc3AzeU5OSlBVQ2V4RE9FQndXRmwyOElOWmtrVG1HdHFhMDlUMFd5T2FTWThnQTZQNk5qQmNDNzlnVk4wSjRLeTVMRkJsaDYwUXlHZldtQmFSdzMwZXM4UkRSVU16UE1Lb0RMN3MwU0pMSExIUGszSTVnQkNxM0RjTVdxY1BtUDA0VUFwbFJTMW04cXI0Y3FTV05jTlRQR2p3ZjN6VFhLVnRTNWhoeFhiTWp4NmdPVXpjeDdnSUIzeEd5OHFZcWVJaEkzbWJoM240UEVyT2wwcExsSVVFWks4OWJtQkU3WFdDY1pOc3QxNEgwUmJ5TWpqd2tJaFhDT05NcnRacWdtTjAzdU1rQ0pSZEU1eVY3M2ZlbGRRYVV2RHB3aUJKZUw4NWxUbUtVT3V2QlF4S1kwNEdWaXIwVEZpMGZLbzhMcnpBMm5lNWhPSnF1TWNtOTV2U1RqR3kzWEhYbzZPMGhiQzFYUkVVdzFIN2lxdlNJTkhUaHc0ek9CeWVuME9wMHFSdGdjNG5kRTN0OHZ6RDlBS1RpcXpIMlBBM2VzbGp3QUdtQ043V2NSTmhYckRaWEE1Y0VXM2pxNlFx","upper_bound":"WG5NUUQ1MlRLbW5zNGw3QzNkdzkwdVJrOVBPWnBid25kM0dVaVlRWDMwMEVzY2ZOVWVSbDBtb2NvUmN5dTJWNDlLMTh3eDhmMk9nemQwa2d0UFN4RlZBbHNvYVZSU2NwN21tZ1ZkR2p0YU5Ud1ZVNTFoemh0Zk0zQmduVllpSVM2b0ppWXNHY2FodVVOdG80VW82T0pqUnVvTlE0bHZMRlJtUjlVZmozUElsYzQ5bjIwVkJLck9uTWpmdGtBdXNjSVdZNTB1eGs5NzNJaXNtWlg0UHJDRzVTV1FId1h0STJaOFJSeHhOWGV4aFpVSXNyb0phNHZTNWNnaUJ0VnBoQ0xLNm9YNHNwZkxVVUcyTGdpQ3M3TkJLWFF5NlJCVlVheDM5bzhOVGpRR0ZIN1pnOGF2akxOaE1Cd3BOTko3Y3hIRFpvWXFoQkpuNDQ=","repeats":1},{"count":1123,"lower_bound":"WHF2dXlRc2NTM201YlRWNHFNWE43RVFrNjh2TTRlaXM1RlhtRjBjM3l0TUpqV1Jyd21HM25yZDV1OUMydEw4ZnJWZTlEbkVEbVIwbnNveGRrRXZKU0JEb3RqYjFSdGdXZlpZOGpENU1ET1duQWxqUGpGSjdmaGJuT1lvVGJZTFlhSGNhalBscVBsbjFkS09hZHc5MnlrM2E0bUFMeHpxM3Eyc0RKVGJHUTBsd3JYYllXdXAyR2pkM0g4WWdTc0hWb1Z3ajBJNWRHVkVzMXFwalhEeWJFeWZtcHpZblNwVHhkbGVvSmMzZ3F3MUxueWdQZUowMXlhUGJqbWdYSkV1V0Z3UHFDRnJwQVhSZGcwN0tvSzZ6aXdHV0g5TW1zcUI5UEF1enE3Wk8zNlFwMFRQb0kyZFBlcFBBYjJZdTFUeUxCVVJDSlF6blhFNHlZOUFsbGNTcWZSRmxGTlFkbjNtdTZONnZUQkhQMGtoMXh1V2FXYXhFQ1IxeHM2cFI5amNMMkl1RW9FMUpYbXhOMjJsaE9pRFNlZVZkaUVaQXcwSkVndw==","upper_bound":"WQ==","repeats":1},{"count":1131,"lower_bound":"WTJXQVRvd1FGczRWbTVnSnVzbnJCSEF2em00cWhwbzdraWJOaFFSazhuRkU2eUJnTjA2YjJKNFlSYUxsOTZ2UTJrZkVScncyZXhZQllZamdSMGlvOXB6YjVGM3l3cXZTSVh1UlFtVzBsUWZVYWkyd1RybHFYQ2R1Z3JJSktqNmRscUdwWjA4V09HU0xQZ0dNdHJMdnNBeEZrNTRORFRlSUVsczloeWR3b0pCcWRITnpSZjBWT3lpeGMyYmMxTHRTZXI4MDNaa1hnYmpldVRGbjExTmtxZldHQXRUdDJ3Qm5pS2Zwd1NBWnpIUFI5MkpMV09WV2dFV3FHMmNhSkRzMXE0N09tOWNOTW11MmRSVTcxVjVIMmJnbmNKSEFPT3I0cVZIRGs4Z3BRRGJKSXJTVFJCaHJxeDNObmhoQnI1RXJFS0FxZGViWEkyYkpSTHBYQWY4djNLbXhlYjRQQVprN2g=","upper_bound":"WUpxNUlFcjZMRHlmd1lmNElqYzNqZ2RIbGhhRWtqSnl0QTh6ZmhLSXB2aVc1T2NOdzV1N28wd1ZlS2VoeXlUeWRvV1hGWVpmbUtwTHFkNk1hZURVekJLTElqZXBXbWlieXVHZVgwbjNVTVhVY3NGN01IOEptZDc4T2pmQnkyUjdIcnIx","repeats":1},{"count":1139,"lower_bound":"WU9PMjNjT0pSZVNRb1dOUW5wV0xHUWlLTXBESVJkc3hFQWNYcmFQMU5teDlwMzVpSVB6amdlUU5zYUQ2M1ZhZjN0NEFINlIzbTRPM0pvVnNtQ2cyUlhYdld4ZXp1Wkx0TzQ4cVBmT2lBcEpkVHJzeFVjM0drN0tPM29zZzlUZWhIc3ppRA==","upper_bound":"WWVodGdNZUxxZ3lTbWtzSmxDTDJsdE1jeExsMEc1TGJhOGdvR0VaQmhWdUFTUlFVNWwwam9KcGt5VEdrMGVrVll2QWo0SVp4bU02alNSZ0djbmlwc3RURmZkZ29QT1ZKaTJRSGNZb1JCZHdYSnhPM1JlREJqejhFUlpoYXo2MjFxZWpkSzF0MjVUUEJyZWVudU1ONjJxWEI5RUFuSlNiSEhKNklaREptNDhaWHBtOEd1ODU0WmdOV2NTeW1jeGtnRVZDN1hBR3FDSkxVSVpISXR2QzBPOXFvNkFpbkU2RnB5QWU4THB0bHdDajFPS2Z5Z2RPT1pMOVNGc2wzNHRxbEFXSjJGcDNkaEU4bkdseERoRVdMMEdxWW5lcnNHUHVGdWtpNk5QUEhjT1hINEdud0drU1RHNm4xa2pZRXRmaGxBT2hta2txU3ZKR0EwVzlXYVdJdENaNTV5Y1AwM0o4VHpmVUNaSEVqWkhSMHJRZkwyZ2RRcUQ=","repeats":1},{"count":1147,"lower_bound":"WWhGYVNTZmtIZVVZR01m","upper_bound":"WXFmV0dKQ25yTW9QdEJDZDlSNzVoQ1hNU3ZQakVsOENiSUNVR0dLWG16OWFyOFFpREw2SjhVQzh5UmRDNTBnRzBEQ21zczdUdFFkNGZnQzBHdmc2UFFUQzJZVE5xRlhoRnVoRjVCZnNZZlVja3UzcG5laFI3c2UxcTZ5WmE5a3NkejVVdFFJa0djckhweHJUYUw5UDhxMktRdmpVbzJLRXUxZ2doUnl0RmFyY2pCTWI4UjZqZ2ZESGVtaFdScGlGWk9ubW00eDlDakdRdm5CMHI0Y0Y2eWdWTzM4YnpjZjVhbTV5MVowbE4xNndvb1puQzl4VU5DTmhVQjFEOTZBb21uaFd3TjJ6MkVEM1EzcDE3UnhMR0c2ek1jUUxzSWU4UEdmZmlKNlgyQXBYdUJiZDUwRGZmT240WURGTzNxanpPdHlNc3FOazd4UHM5Q3ZxejdPZ3hmT21EY0UxOG5pMHViUUd5UW5JbjU3T2trelFrQ0dkZ3ZOc3NTd1ZtNTVNNE5DSE41TW1QQkQyQ0RTczR2MWtXQTVVcmxZZ3JQNkpWR2pkdFpua2ZWUzh6cWQ4Z3Bhd2tnV283MDJkckVzd1lxWkc0NFl6QTdhQVFLSkRQZ1pza0JHbUMzRGNvUUZ2NmZDaG5BWVh1SzVxWFJ6bGxkb3kz","repeats":1},{"count":1155,"lower_bound":"WXRDV3RoS1pjODQ4YjhLUDloNjRQUVMyQmttNjhwN2tIQXRTbGQycmNSQUdpSHc2ZDFTNDNZZGRlYW03NEdoSnJIREhJcG1TWDZqZkpPVVRmdGU1d2c4OXlxWWx2OUJEcTJhRkRqZkoxblFzREhyckxoYWtoaElSTnRJcVZRdUY2R2dKd2EwdUdOcVFVN09CRm9RYkhRS3hZaDZGWEZPcE1EbllaYTgwMU9TRml3RmRXUExMRlBZeWFqSFZpenpUbW1hVkd5TVB3dzdncUpkV3VGZ3lIbUs4a1RvNjIwWWRva2p5UU5RZUtZdEhIMWVKYnFaeHd3amhsYjVaMlpjNjRhQWRJOG9rd0RTTmdCVnBuWTF1cVp0QWlOdUhjVWhWWUNiQ1c1S1ZsdnR5Ynd0b0lLUjNndjlCTXNaMmtnZXdSanFBMDk3Tzc0MW9JSE1kZjgxZFVFTnNkUzNyODk4d2o=","upper_bound":"WjA0bTVoWHFsRHpGUEFDWjZNbHFybE5GZXREb01nMkt3WmUyMXlEV0dSSHZQYUJLOUMybzdwbno0WGNWVW50OHF0eVZWS2pPUDBvMkZIV0JRQTFQM1NZRGg4MFR4SkwxMWdwVmZxb3FBcFNEWGE0aTBWUDA4SWx3VHZYMFBNckpocTdBVXpZN0t1ZTZTck5ybDNScmZtY0UxWXhrYTgxZVdyOFhGT3FVdlRxM21lSVRha1dWMm1acEtScFlJUzFVVUdBQjd5MzQ4R3lMNEx0VUx5b1A4Z3U5eU1pSkx1OFlteEltNVhuSkZ3NmlYVWliWkpOeU5uTG0ySkl1U3VSeVZVY2Mzc2FQYVcyMVhzUDQ3VlFqVHp3Y3ZoSEFHSmdZdGQxUVBPU0xmRXhzNVJ0bldKRVg2YWtKd1ZEYmZpaDg3ZXlTUGw4OG5jaVE=","repeats":1},{"count":1163,"lower_bound":"WjFHYTlIckp5WGM1RDlBelZHakhTVmQ2dG5TbUo3eVcwSXJPWFYxTDNIeXpoZ0FqWGwySDhQTTh1SXJpOG5uVlFSdnpxemc1M1J2d0g1eVJhUjNnTDBFNEkwQWNyaHp4NmZSbzM0aHlvb29EbUZEc0N0TE04WG0wekV6eGdKYThsZUdSM1djR3F2MGhKVTQwaWNSUFh0VkdkQVBjNkhpb1hUWGNGVThaNDJRU2lCczFrRmVoUEozelpZd0NuWVVPdUFBc0c3RnBJcVg5dXFtOTRMZndKVTY0dThQYWNpMEFEMWZPMEQ5dVU3ZlFoN3FzeHNTYjBLQVV1TFZza0NRS1ROUEtUUWlwTEFzV3NTaXluQzZ5U1F3QmxDOVNpd2JIRE5PTFJvN2NBUEViTW1B","upper_bound":"Wjl4WXl4U0JBY1I3eUdNTVZLemJIY25uT0gwMG1OSlJ3bkxHS3Y0eFhJSEFzcmRJS2lBeVF2Ulgwc3pINkVWQmhxNQ==","repeats":1},{"count":1171,"lower_bound":"WkZvZnF6Nm5aSUVBVDVDNGg0cE9NNG1icjFZdXBrS2J4bnlIT2phN3BKd292cTRGUFlXVXJ6NDhNMXZkMlhWbHVnaGhGTDlrMDVOWGxDVEI5WXdkcXY3M0twWFpTMThjcnBpeW54ZnRuNDJTeThQUGl2Y1c5TU5pcHowTTQ3WWxiMk5pUXVnYXBaUkQ4bmtwakFnTHB2RTIxZGFCWTIwZ3pDdHJBNjVkNDUyeXVQRzd4Y3BJ","upper_bound":"WlNjUUdzMmRzNWZFdUJzWWJiVTlCNzJocThxUWtGTUk2R1hmbUtwUEd4TkdEdUJOU3dXZ0hCTXBWc3g4bHZwQlRKVU5oUHFBbk1semE0WUY1OWUwaTk4SXpXTzZqa2hzY3Jxa1ZRaGxtWndnZDUyMzJ3cDJpNzZ5U2xMT0poV1BNT1RiVDd6dTZ0SEFSTUhvcnFPb0RqeVZYMU15S2pBQUFIakVMb1FSVDUwYjBsVkxINXFKTU5uSmtSUU1KQkdhZ3F6cWVCWVR1TnQyeTV5a2ZEb1hjcFpLSmhpbjFYeXFpbjZ6UFNNVTA2ODRDUjNyem85a0RpRk4yUWw1b2pSY3c5UVpEVDBj","repeats":1},{"count":1179,"lower_bound":"WlRocFVQaDFtWWR6UjJQR0xXSFFlWVBWSTFUd0pVaVpqSDN4cVY0MTcwTTJDRGhUQkUzYm1yWFVXcXRIMEFDSVNMSlVLb3hXYmc5Q0lxUWZ0T1l1NWx4aXJmQ2hGdXg0Nnk3bQ==","upper_bound":"WmdvYnQzWWhKNmRlMjNmSmkyb2RnSkp6MGxBd2lrNHM3cFNvd2l1NE9NWWFlc1ZiMDB3RWZmQlN2Nm5VVFByU3hNbTNpdUdwMGYxcHVDMW9zS3JVSDdoVXpCWTFSYjFmcjNaRUtxZUNSb1lSUUFoSzg4Z1lwMA==","repeats":1},{"count":1187,"lower_bound":"WmpKSnI2ZVpSOGZpc1ZpWFV5VWlmRmZSbTdaeXBPRzJyRTFwWm9ERGhYMEhsdWpBejZCZGNHNzBXME9tR3AyWlE5M0xEU0tQRGxsUW4wVDdKWmlBZTRLR0Via0FJZmFsMWF0TWRjSlVWaXkyM3BLRXN6QXA1UmZSb0s4OVhIREs5azFXTDA3MFJSQTllUjAwSHUzN3ByT1M2bXhUQWt3cjhrejRnR3hXRlJSZWRUZG10YnBEN1RMdVFJaTlPb2ZCeW5KUHVJTFB1dHZXUjJuN3NiS2tlS0pzTEdNYTYzSGFtRTRaMUhTSDVlRmh2a3VHWHdJbnk4ZXEwUEZMeFE3RUE=","upper_bound":"WnMzUklVbzZNQXd2WFRzOHFGbWxjMWUydVVYVEhQMzNrbUNlQ0d2Y1FzMjJXOHd2dWFEVkRhT3c4WlQzZVRBV0RtUDB4bFExcmlZbWhNN0t5UG1EMjd2YVpocVdrb1JwSUNmM0NZeHlyNWY1czVmcUZsckJSS0d4QnNwTDJzN1pScTlKeFVOZGZpYWZXUWJaSmw2ZDVSV1ZzUDFjUWh3bUZhU2YxSmNJWHlJc0hsS3JBZ2tncmpCc2pVUXhsR3RJamNFNXhnTE5YdkhuS0U2N1FtU0ZxazJhc0pBOGx0U003UFJzSE1seElacXV4VHd4NGdIdkZpc0dzS1JoQTBVTWpkV1VSTUQxZ0paT0VITTJJY0xlMGV4R2dzSllRZm1KRHFQWElpakFuV3ZHeW1Na1NjMEpuZ1BHeE5tdW41Tkh5TVcyZlBxZjZhallaVzV3dXQ1NUplOHgwYnVlcWtGWm5YSTdlMjNoUm9HWnJxUjF2TDU4WHNUbm5XbG9wa0pWdUNzZTdFMGg=","repeats":1},{"count":1195,"lower_bound":"YTBUTlNJb0JvMUVmbXJmd0Q1SjExeUs3N0pCUFFXTXZXYTNpSGRZYXNWRzZCVTVSWUZXT0ViZ0lhUnJiRHc1alFiejFzMmFMT3VWOG9MWm1GRDZHeDdVVkZFcnlnRWlsdG8zclBzSFJUUUZOcEpVWFNlZFpxZExId0hxb0J5aHMwajFVWWxIMFo3SUROd1FHN2RZTExyb3oyOEgybTZFS2gyZFpTanR0MFMyU3kwRFhaY3kwVkh3WVhWR1hyeXlUT1lnOTJXQXBlYXJsRXpaSE5DaWRKUXRwbE1zYVNaM1FvR05peEp3SXhVUVdXWDhWNnpOWVJveHZlQ083ajhW","upper_bound":"YUhpWWVhblZ6aWhNY1RNaVRzdkk4VG5Dc2ptY2J4TG1UclV1S3k4eDRWblExejVUczZkc1ZUaWV6b05EQ3BqbGtoSUpWbkloWEk0bg==","repeats":1},{"count":1203,"lower_bound":"YVBmTTdmaGlKamMzQldyVmZpckFZZHBxczVCd256aERMajAyQ1hrcjRpT0hXRjUxalBHYjFjSTZVUWdSYmJrOG5pSnVqdkRBSVRCaVYxb245cFYxeUYzenhEdGFpcWc=","upper_bound":"YWRWOWJIQks4OVAyUDdqcjJmQ1FBVmFzSFNzaWhhZXZ6ZGhOUHRZQkYyRGJIV2FtM2F2VWw0cFFKdG9qS2tDR25Xdm5aSFZWNEdNemd0OFEzSm1ING9lamk3SWh2NUt4WndtRWs0TTlHZzBnQ3dhTHJSVUNQWDFGVHpIVlUwTGFKUXNoWVJSeGtFamR1MGI1dFlOYUR0YnpjQm8xQ1NDNXV5bG9uNzV5TE5IeU93emZRd2U5UXNCREhhVGZieFBtTjFQbmEya2pTbGNkOEwwQ1RiVXh2Yk9uREt2eWQ5UUV3aHJ3bWdKb29FWTZidDFYM3RaVm9QUzdxWWlWU3JXOEltWkc1NVk3eGtINGhMOGllSWpZcndBM3NtWXlzaGhSVnpzbGs0c1ZGVjFKYkxzbVpFTXVNTnRDOU1m","repeats":1},{"count":1211,"lower_bound":"YWtmc3N3dkxteTRrTDVmakZqVWtadnNXMXRXZDFkbDJQS1BacEhlR3lsdEZBeFBadkZHYmVVUk5kZ3NiemVaM1dKSG5nQWpsSUhJWEVtdmZ2N2Z6SUZGa1FJR1pVclRSZmlzVDRnZXNPR1JBODU5eFdFZEE1SktaaU0xRzJYSkt5V2trc0lJNWRNekdVdVBUTmFkMjVlV1N5bHVqWHF2anVKMUFmZmI4YllyRXFmS29FMFNkZnVzbzNQdjBhRlJXbTFOMzJMdnhJaEhkVVhPWlZEbnc0b3R5dkRJaUZ4QVh4b2MwOTkyYlpCTUJRZFNLV011R1BuclRBUkFtZ0tmOFFmWHRzS1JZaGdDZ0lYc1BzdWhOQWtSbFZPdDVvQWQ2TWlmdXZGWWl2M2k1R1k1OThjRTZ0SEQwN0lzVzFpbFRuY2tKTE8xbmxJOUlibElQR3E3UEs5SVl0S1kwWVV0enFXNmNPRWMwMVZGcHJwdjF0N2VCWmtKVVdGY09QYnJiVTdKWkJFZWN4eXd5Zjl0ZG9hckpmU20wbjFWdUdKU1pnNkxVR05WQk1oaGh6NTVEVkEwWHg=","upper_bound":"YXptWFl6cFM2UVBldmc2U3ZNZ2VmSFlBWlJPVkRrd3dIVXJXM3pLOTVMSmt1VVdZeE5KZko5WmVlNjQ4OHJoSFRXNmpoTWlIVDE1QzVXR0oxUlloRnM4RjNkSVZ1VjI=","repeats":1},{"count":1219,"lower_bound":"YjNOanZmcjByVEI3dWFOcFVOWndxRkFrWGg2b1BZdmhwWk02RVJCOVNZeU5HN3VyT3E0amFMcWVJOGE5WktWUkVjbEk3MWEzeVdFNFhyREJ1dHQwY0dmbnViSEU3ajhpYTRMRWoxYWNWZUhOTGdGcWtSRHRIQW5mMEo4MlZXVXFkS0RmVDd5SXQ1TDFoWW8wZHh4eWt3Nzk0eFc4TkVQU1F4anlPVEw2aTFXNWJUV3czeVRyaEVteGw2eUVta2dLQkVmeTR4SGo2c0pzdG9lU2h3Q3pNbHRHd3hBcm5zcHdQdGpKdmp2VjJob2xBcml6Slo3emd5TWo1UFRSTkNLRnJlZ0VOeVlBdWxyQ2tIMWp1T2EyT3JDdzBSWnFOUm9OeGN5dEFzeldTTXRr","upper_bound":"YkVHeTd2R3FGemJPcXI1dFV2eVF0bXM2Y3pwUEVPaWJIOGh6dTdWb1VZVjF6dzA1Mkg3MU42QW84OTk1aVRuM1FiQ3JnVzRjRDR5TDVuRVJZMjZtSzF3b2U5UzhkOG1WTHp1ZDlINm1WZTdTY0tLck00WURGRzZoRmVzVDFyd2c2eTNXOEw1eW85dGdTZ0NFUWNFRUZxMVA3UTdTN21aMXBSVVJwRWJ1a0JucFl6OURHUzJoOUxtaTVOZG1Qb0t3N2dJTllJWFlKdGt5ckdxRDI3RFZmbnhpNkFoT0RQcGlnQ3NOcmlrRnAwZzlEZzhpYWUzd3FKQ2l5TGpzcTg1RFBJeVk5bnVhbWxuOXpvWVowT0JuZlQ0","repeats":1},{"count":1227,"lower_bound":"YlpUZE5UYUFIUEVWb055aXdiWENtQXN1SHFtSzVaR3lxRlhlYU16anNtb0d3cEthd055T25zYUVBM0U3OEhaQ1hvaWZHckJBV1FaSkxWQjRyejVmNHBHZllURnVaYVpEdUxHd0c3dG55TjNSVzBDSjQ1OFBOakxEb08wNTVJYUJPWG5KUVE5ZGlhNWUyUllyR3V1YldOenlpRnZZaHNEeXUxTng2QzNMRzQ0eTFLMlN5V2VoWUt4OUZCcmhhM1JWcjJMYmN3aG10SHE2S2ZaNnhVNW1WZ1BKZjgzUlJXSzlZYlFjVlRmVFZwdWV0YkFoRWNJSVlqQmVFODluMklhd2ZqR3JkYTZLWWRRSllpTmFlUkN2UmRYeFkwSDFFYnpvNXRyaUhjTFZIRmQ=","upper_bound":"YmxRVHNaVng5bzJYMmI1MTlFS2VBdjIwV0dGSzR0SnRlWDdQRXFjbmRJRUQ0QjBmR3ZEYjhPV05nc3NaWWpEaDRxUXRDd3g1cndEY0VKYTZVZjg1TDdWRUJZUjVWUzIyYnlaenhlY1NEc0Jjb0k5U3FkeDNNc09ETXdjdkU1cGpFT2taRXdiVWUzelRDVERzNnFXTFUwcUZsNmZURUFWd1o5elhaWTFlQVhScGRBcFdVTFBUTQ==","repeats":1},{"count":1235,"lower_bound":"Ym0wSUt3blB2Tm9uTFhPNlMyQjZPOFNLd0VkT0FYMjhOVndZd0ZWU2ZVNEtOVFN0a0RmUmNiY0VGWjJheWptZHB0MDAxNlR2Wm14OXdTQmJ3OHRMOXFsRzFmTEl5VWFzZ2ZtUk5Id3VLcGw0OUEzelhKTHBjcmVCbmx2anV2SUJyMUloVFZyUFBvUTc0a2dnRjFqd25odUdBc2RBMHhNMWlTcDRnVTExcHZnMjR1bEx2bHFMamRyRmZXNFhJYXZXS1h5MG1rMG41ZUx4V2Y2T3VLc3hKcktxQjBoYWpaeDdGZnJjUjdHQ1RMV2JxOUFkZngydTltc1dNdXF6TDJsZDI3YmVValdBVm5TU2J2NHNlbmVIbVB0Q2xCMVhWc2NNUjlPc3BiSU5UbmdaZkpmeDVMN1ZVOHlwSER2d0tuYk51V2dEUGwxM1JsdTE3SUszVGpqcWR0VWNjdWd2OGI0NHIwTFZ2T2g4WWRpWlBBSVM1WkhOME81RDNjcWUxb0wxek1wcVRqcGt3d2JsdENJTzhrZmx3OXFrYzk4Y2ZpZVVYNEQ3UGVJamxhSVkyV25ScGp5MXBSVFZxMEI4Q0Y5MmEzYXVYSUVHdnFtNGQwVXlhbWZxTlp5REJqamJWdGtrUDlqeThiZmx0ZG1zdmhHREpVREt2ZERoVWVDeVpZaw==","upper_bound":"YnV3eDVXUWg4aWNBUUl1ZExuUEpMY3NzaFZ0RTFNYUE2bG1EbjJyelRmUjFrYUV3TTVuNmtETUp5WjNlVmtCcjhJR0pCQmNXTXE0NHBpVVVDN0tVYk1LeHl3MEZLajBsRUpvYW9kSFh1TG1Tam1LSlp1S3JjWjcySVM5cHpkMDRRWTA1Q0Jpdlg2b1hnWHBpTHJ0NVVLRUNaOWVNNnNoeEhhc3FNZFhOSDJ6dFRwelVCbTlhNW9iMUc1RFpuTU5JV2RicVV4NnlMTWwxMENhOEFiTDVQT3NnRnlIMldTOVE0VzNZN1NqMkpsTVVsS0Z0UDV3dm9MQzlERnJnTlFVRXBsaTM0NEFlVlhHM2xUcDVQUXRyVGd0THlpVGZKN0JKUWczUU9qZEswWkkyY3ZaY0s2S0d4cUZsaU1kNmFLWDZ6SHVmV1lyakd5QlZlTGpoNHo5NUNXV1Zia0xWYWZPS3ptWW54TWVuQ0cwc1BVb0VCNUtmcTViVVdqaDUwbnF4N0lNYWd3TWFXcHpwUU5BanZwbXVYVnJoRGhJbWZEOTRlbVBuTHFVQzJqaG1ad0hrM1NiQ3E4NWxtaWZSUFJxdnN1M2VRTXM1WGlOcHo2bU5DNWY5U3dlekN3YkVza3kxeDRmdGdPWWNGS3ZlajZuTnFiU1RYTmptdGZMajRxemRsak5GaHZIVXptTGpmSTU0RWo2S1diaXpCZA==","repeats":1},{"count":1243,"lower_bound":"YnZacnV3YjhPUWRSWUlpTWFHcUk2M1RjOGNFejFTMDlMNHhhbjNQV1VGZTdOS01KSk1LTnN5UHR2b3pMSExFUm9EZmw2bkVxSXJRdVR6REgxNmtUcXBZS1dqRVdlNjFRdVcwUXpDNzNJTWltb2VzMkk1SjdjUW45SDQ5cU9IQU5XYVozREpCYXowYVFQcWI3MlBVd2l4cjk1a0JvaFppVmlzMkFQM1NNZmxacGtLZzR2Ym1neG5SQzIzdUI0c1l5NGsyNzN4SmVkcURpTWIzNTdOM3Nsa0dpQzNmUDlKMlFLcVl5YjhsREV5akNrUXdVWTlFZ2NNcEgwT1lDRnVsenhVcWdScEl5aVRBVlRPbm11MVRGR2hoalhjeEtNeUdESUtpZktZczAxNmZlTWIzcVI4TXRHZkRaVW9GTG40cE16elF4R01nT2JmTXNtcEJqc3p5TU5UNjJYMDVpYlBvRQ==","upper_bound":"YzRiRm9IbGJNNUJZMFhFM0l5YVpvaTlVdldhbHBZd3kxa0IwbnVTdG1HN3hwd3hqeVpLWkI1S1dFa3A3WHZQZWxrakxxRjVqaVFNN1dhOE4xTWxFR0ZHdkFHWmppWmdsdFYweHBsRkU5VGQ4ZXIyRXdSbGNvczRrY3VMdzhET3lyVEh4ZVE0c2NxUzZVQmkyWkt0YldZZm50bDU4TkR0amh0WXRpZ3FGUVBObWk2V3djYUVSTEZ2TFQ1ZXprelZ2OW9vZXNYcDBsaDVxcGxXajhjYU5QMEkxUjJXMEY5bXRaWlZRVTU1MVdKME50MXBDQkNzOHRpeTZ4RWZBN09NMW82anRHOXN0SWRTZ3NJUTFGSVpYUmpwTFVIMTZEaG1TTGdQRUpwWWRJUlU5YUNxbFZZT3J6c1o=","repeats":1},{"count":1251,"lower_bound":"YzZ6RUtMMVlwTm8zbkVFZkM5a3I5MVh0WWJXUDQ2MElUY2VaTktjYlpjNEtkMndKNE1hUFVCRnp5MjBMVWNVZ3RweEJ2bmlJeEo5a0xvd0xnMEVFRVZYaDdVa1A2dkV0WVBwTHFMZ3hpWll5ZWh4Wk5oOEFpN1Y0dVBXNW5neFF4UFlGcTFGT29ZVzR5ZGJOcFJ3ZTRMM2dpTXNKTXd3VGR0SmE5TmtJRERFN1cyZ2VzbGtyb3lhQm52MjVOM1A3dHhyM3JkNTdJbnQzc1F5MXdqY0EyWnJPaHhaM1hGN3I4NTJtZ2dYZXNHVHNjUmtnRnZTOVhpWmNrVU5KZVdmcjc4WENYTUpUU2daNlNWUXpvTEVvNmp4Zmo1TWpOck1jQzZWZWhjcjRiN2xkelBqdHJkaHdrSGNJelVYbnFZNGtScmdURGZ4WktKZjRsSVJzNVdFNjJ4eEl6akg0bkhiUnhNREllQnZ0SVZHcnREamcxY20xbTRpVlVZZjlSVzc3d0cyazIyV2h6RUxTR2FxSHNzYnN2UXYxMVdOM2tzbmdKRU9XRGNRa1NFQVdtSg==","upper_bound":"Y0g3UWVWV3NXNEdNQmluZjRTMzhTM0FxeTR0ZmNMUFB5TVZzVmpMRWtSUTdGbHNoT2s0RFl0ME1ONzFpS3psS2ZLRXJaZ3BKbTkwbkZydDJoRHJqOFVicE9LQllIUGJpWmpoc2tZWnZpYmZQSlZWUG1WZEhvUUFwWlF5WjJrdVFKYTJGNUt2azZmbHk2V0N0ZEJFMW9hM3VPSzJKWkcwdjd1cFpYMU5oaDdpbmRTTVdaekFWbTE5UjB3aWVYa1l1bm40MTlHZlhIYk1XR3JnUnV0ajNEdmJZTFF5U3NZNkgwd2I5RmZybzdobTBYMDA4c29BV3p4ZFV3amE2WU8zSUROemxtdlMyOVJESnJDYkRZN0ZRNHp2MVJaaERxem84QmRENWNjR0NXT3NTdzFMVW9XWXBWdnV2WG16S21BVU9QajVnR3Z3cHBjeXVmT3VtZUV4cGhGR3F1S09Yd0FDVjN3Uk9FVmZWVm8wbFBlbVRRemxlZGNNQnlwNXFhREJKcXZhSjU0YThsOTdGQmZ5RXc5YnZHdkMwcHV4RUsyWklXNzVwS2pzY1dzYU9rRU8xVk1sdkg4SkFoczliOUszSzlId0ZlUlR2OWtuSXNUSVk3Z2xBVlE5Rm1ZbnMxNW9JeHpLQlI4QkRWV3RWWUE5Yml1TVZ3QUd4Y1pVM0ZkYnlSTTE4NGJOOFRuM0dwWjE3TXpCTnFvSzBw","repeats":1},{"count":1259,"lower_bound":"Y0htSzJPd1BCdHNMUXcyWkczYTJJMklEUnJqMktpUE1IYVRhaGdmRnF2dkt2aEhvTFprQkp4NVpuWEdqVHVDM2l3TXZmaTFvR2pWc3pMQ2paS3l6WWdwWnkxbWtTd3JtUWZpNEtLR2Fib3B4dU9ra2g4VDkzQXhic2JHRFNET2dEYzk0a1dmM1VRQXJoeDFzUWt4WTBCRzRqbEV3cFBQRUlWMm9wUE5sY0xQQWRUVDVlWXZ1ZkVTT2RJdWxvOXhpTGVwS1JXQUU4bFB0dXVkUnUwcmtSYlJORm5UcGFYSHlE","upper_bound":"Y1FsMk1vNDJRaHlaVkZoMU9kVFh1TXVpdDE1eFdCTkNwMHZySTRFSTRrcUxFU2hvWWhGcE1CMnBrM0ZacXFROGFxWVN2cmpoendOaUFBUG9FbllnQUVVRURWUmgybDNPOUhOVG5Ycm5xY2J3eHFCRUtPZEh5SFBNRUQxeE5jRllUVEJxbEN1anQzOUo0dzFPQUF0ZjkzNUxiMUdGSXV3bmRQUlJZbnhsYTJGWkRKUEt6bzFTUE5kUExPVjZ2T3g3QTFiQjNQZ2ZUaGZEaGJZQ29wVDYwaTF3OWdibnBYd2FLSFNQd3VuOHRRbEJtRHM3N05oSVJvYWRmbTk4b3VlNWFwdE1WU1dLQzd5SVFVdmR0aWQwN2VwcktoYVVoVmt5SXR6cWJPTDhBZEUxajdDb0ptNWhvbjJZUUZyQUppSnlSYWJTb3paZHc1Wk80SW10TEw5c0d4NWoxVXJydHRsekRmcUozb0VGczVzNGtpSFMwRnNWMEhtNnhIRElBQXZKcmtSUzRmc0VWUXJ4Z0o4dUZ4UUY1eFdpQWJPb2ZMWDFzNzRYaGhQRlFDeUxRTjFPb0N4V1FVbjVYUGd2ZGtGV1EyeFJMVzQzZ0xRV0FLRVczb0VHWk1majBWNHlPVnkxUDdwUDV2dzBaeTB4VmdOSjE3dw==","repeats":1},{"count":1267,"lower_bound":"Y1dNWENrRnV4NTZKcjM1VlBZRTE5V0NDbVpXV2o2RFRuZEVkVDhtTW1BWmZ6Mk5MaExXZVZMTElQNXBEN2gwUE96RUlZSWZ1OFZOQmh4c2ZBa3IzMTZXcEZIbm54Nk5xZW91anFuS3pDUzNqVHdCa3owVjNtVWlzbDlmMFhnbmRXd0h3ZmpDbFRoamE0YmZTMnFPd3lVc242SXFGWjVtajh3RDZxRHFlMHFsWDBkNGJZYXlHb0k2V0tWOXUyVW5GR256V3lGWjR3U21vWlY2MDhEeWtXdHdJQjhwVFlyVWFpUTVqcDFvQWhkR1lZOUgxMldmUHhydlVRQTlZSjNyNDl3M2dlejYwd1Qxb3d0blpaak9CMUVhU3JTSFZ4bDZla2EzZ2JHd2pZSnRQQ1V2ejlqa0RwV3lWaHJBdm4wbWtvSHp5OGJ4MUJWNkhDb3FTbTFUdklDSVFmT0FkeXhDNUI2MGtsV29nc0ZodW9nb09FV0o1dkpYaUtZUG1hT3ZMSG5IREFQMGJ3WkpYUDd6RjJKeTNLRndIa2czb2prVENObXRuaGhjWmlqbWlIcnFXaE83R29EN0M=","upper_bound":"Y2h5T3BhNUlvYWcwcUcwQjRJMUJBOHo0NzFDNjkwS2xhZFJkbktpOE1SMGNlTlZyOUdjbTlKQ3lCM2JxOHR0NGFIMTJmNnZzTFpoektKekxZcVFHcm4zOW5maVQ0VmttUzZGTm5FQmxEZEVnOWRYbFdRYTZLeGk3aWd6dlhEM2o4cjhQT0Y4SW1ReEpHOTc=","repeats":1},{"count":1275,"lower_bound":"Y2lMME9veFNZSnFCTlp4TEtqMVRmd2FSaVV1OWxJZFA=","upper_bound":"Y28wVUhrRHBlYTZNQ0JybzdveEN0aVI4U0s2NnI5REVEYWE2S0FQUERha2JSajBLT20yUWNhTGxWOG1VczNXaW45Y0oxYmtXUzhhQldrbURyVzVpZ2YyYU9nR0tWZzdPZXBHR2UzQTRMTWxqbDFDczlLbUtJQWxDVzRkand3V0VycXRGSndpaWh1bDk5enIzTmJsMFN3MzgzVVhoM0VPU3o5dHpVN05QaDFpcEtzQWUybWxnWXZFTEZpMFFxQ1V0TFJpV29ZeDlYb2dMV0hmR3hmcDJpV1JKckhWUGUxaEJSTFlKNlU3R3hEQWtFYk1aOGtPWklHR2dzQ1hsWGZqc0E4cVAxa3RaOUNIZnI3eUxkOE8yUjhqMkxwaDBSeVBVQnVKWkRhTTdmSHR3eGtMUmk3eUZ2TlNyNHY5MmFNcURmQk9qQjIwRnFWV1d6NkRRTEVjb3JJN2JsR3dORGRVclR1Rnl6WXY0Z0pVcHhhRnl2WVZyTkFPelkyZVJ3cWFieFFCZ291Z3ptVmpzdEVNdWRrRW1HZ0docExTVURTSlFIeVlBdHFiRGoydTJaQ0RjNDB0aEZ3a0ZHTDFnS0FpZmVtNE9oZE9xd01pVGNQRTU0SVdmdU56aGdqelVYTGRqNzQyRXBDWUdTRHJzbUlFMG5iT1JiNmtGNXNZYWYxdHhBcjlzV1EyOUlSaVhVSTdGb0xyVUpabndwVVVrNVFtVE8=","repeats":1},{"count":1283,"lower_bound":"Y3JBUW5RVGU1NGkyWDVqOVZPS1lqTGRMOENuN0ZpcWFSQ1Fob3hKWXBreTZoZDhvS3NMVW1oRWtnajVFbEw0R2dTZlIxdUEyUjRMUHJMU3A4R0F5bzRWT2ZQbXJIZHBHVXgwdHh0RkVmdzdCY1pya3lyWjRFUk11N0x0QnBkOHJ3cUVQTnNVcDBoR0VrMFdHN0w1NjRJclhUOUVpZ2lzTVNMdkM2cE42aWFSOEFIUk1xYzlvdEwzTWlWckFiZHJPTUZsbjUyWEhtQnY3SW5tckYyR2R4MkZxWA==","upper_bound":"ZEFuQzBWUWhvYUxETGpJbEs4UG9WbUlDck1DQUN3YnVlUG5iRzRITHFKRXJwczFHaE9xSTBnRzZ5SkpINmgwUXpLM1NkbU82SVlRRmt2S3J2c0Q5OW1JOFFjMkg1ODdjQkZwRXhnMXYxS0pqa3ZCSWpCU3pwcXN1dzRtdUEzRjQ3Q3ZIZGN1YlNqcW80N0ExNmFyUU1MSzBMZlhIZVZhVjkyQWJOVmlWMGJuSHVXN3FObTMyQldnYUNiOVlad0ZTTTZ1QkNYcjQ5RnZkTzJKNXhrTmpIa1Z3VjdodG9ibFJkUzRMNzZjbEVQSVZWT0hCVmVlbXJwczNtbExyZVF4S2dDVGlVRjRoNlZnSnBYV0ZJVm45OEl1NXpwSjRYdTRYQUVHYWZsTTRxZ3poRDJ6Um5ROGRONjZhTlpRN3RFTVNYQjJo","repeats":1},{"count":1291,"lower_bound":"ZEZrak1tT0xIeWdBaU1hYU1MQWlYS3BoS0hIRUtFdUdleXJISWJ0ZmZMcVdqZXNIZE82UEtPUkhLTFZGVnZnaTlJUjVHSW1GYWw1WnBlSUJkc3M0bkRsQW1ReVV3TzZWZkpYNEp5QW9FU2VLc1hiOTRCaXlnSUt2OFVremJLcGtSS25ZQm9LUzNUdGdibTU1NkZEZ0dsc2lKZ2VFVzg2TlpiNVV5QVZkdkQyZU1vcDI0YTRjN1dBWTFYSmhJa0RJa1NsZkNpc1FUREN1bmVVM1E2Vjl3Wjh6dHZqcmF2VGdFTGNGV0dzVUdWOG40RVhpRGJVM0VkWmlTbU5QY0N3TjFaQzJDUGE=","upper_bound":"ZFZKYmg1Vm9vcFM0eFBGWUN6M2lKd2g5VkdOV0JjaWJRSTk4Zk5Ram5DWWs4VVBva29SQUY0M0lsRW1UaHJwRDF0S1U2RjFETEtoRWhKWFdEeUQ5U1hPOVZOVTM2VkNGWkZJb0dudjZXY1hvc2p4TzBmRnVyNzlJZ1drSDg4UzRFcFFXVWRhc2lCWU1PVHV0MzcwY3FQSzFOc2g2dUdiTmZSeHFHUW1qN3NaNEFaQVBQTG5EVXZ6cFdBcG1KSVdpQVlkWmZEdVc2bDFTV1hyQWQyRnJhRnlPSTJCYnN0MEg5clBxQUpxa2pqQmRqbmpYRnhUZklzZzFVNGprc1ljelVRSUJaZDFaNHJoU2VmOTRBZW9nTU10SkxnaVEwQkxjQkFWekFsZHBKdzh1cUdNbldzWmhaYzFhbG1ramZvT0NMSlZUWVNZSWg=","repeats":1},{"count":1299,"lower_bound":"ZFo4ZTE1ckZ4NnNObURyVUU3TlZZTGRFWW9iT2dRcGJGU0hGV0tOTXhSdGpDTTNzMTlZODB5VFc4N3VxeTN0bG5VZUZ5c2dmOEZYcEM1b3VkeWVvRHFlMWoyeGlJdDlkN3dKTTZZZGNoTkNHN3lKRWVzdjk0MTYybnpWOVh1SDMySTB4UjNZZGhqeXdiVHlwSU53aFBYNUZmY0hCTDV1VmFRMXVkYlFBZFg3SFhvU2JFVG04cXE2UElZSXNJN2FIaVRoREY3WUVWdzFwS3p2QTVVc2pTdHpFczJmM0pXYnFqcEpZSzhYajcwalNBeml5WmJUNVdFQlBUV090dVNl","upper_bound":"ZHA1WXVHaWR0MFBRd0JpeHB4OWZCWkV5WlZXemp4RkFsOUlXdWl3VlN6VjQyZzVJUGxlazlhOFlLWUdoQXhrYno2WU52UVR0VW5XYnA3VWd2WlBlSmZOOTVFRkgwNVByeHJ0ZGlNaEIySDM1ZDlFU2hkRnRWOFFQc0dGbXBHUTU2UFZVb0RFd01HTXJtdWdKSFdIWTlwek55MWNJaFJDSHJSQnl4N29rMHU0MXhmMVFhODNuMWJkTlhzZ2U4QkVvQzhDSDNuTUczQTdodTRvZzdiWmZUazdhVm1oOTE4d3JzTmhrSVhzdUNQQkxFU3hoeXpLU1hCMVo5cndQS3FZOERyYnp3RnFkclNndHVGV25HSG9HTkhVMnBKQVYyN3VMUVRERk8xMERIR3B2R3N2U3hlNkVxclVCekJadDVOMVVmR2JCVndjbHYxckdsb2N5ZEh3R3A4VGpXWU9zREdsSmlOcmp5SjJwOFhmWXR2cDFaZFR2WW5GNWRqYWs4WkozQlZSNE9JcllSbDBZUjlwckd6ejRZSTZrQ0RWVk9obUNBa242Y1dtMGpwcDlZbXlrNWpFWmlSdVNmT3BzczA2UlY2aA==","repeats":1},{"count":1307,"lower_bound":"ZHo0WVl6Z0pxOVZ4ODFnU2plNDk4dXVIMWV5SjJxVWdxbEt5MTZ2cjVPU1NhUVUwczBEOHZlbmRZcWRUWUZlZDBscTd1eE5reWtOMVVZS2FTU3pKZ0hGSjkxc1poMWdleVN6eVlBZUhKQVFRUVZPUXJvMkt4ZjdZdnlSRXdKQWZCVDhQVnhsRzhpRkxBbGRib0JCeE40ZXVGY21NWTBtRmhVdWZZQXNzVVZXbmhQWlNXZkJxRXRGckRXd3JwWTFzN2dKNEFuVktGNlE1RTA5bnBoeEFkVUtXMHdzWURsN25ObVFUQlQ5RVA1c3pYc3kyTmtJdjVUOGhjV3ZQVWRFRUdHVENsWUpnTVdGTjIyTHpobk0zbjNBYnNybk42aVJ0ekpUWG9UQ0YxdmE5UGlSaUo1THlnZnFmVzBreW1HcXJ5SUZ6aHBhSFJlRU1reUd5TWs4eDNJanJOSjdRYkF4ek9iMnpPRTZ0RlphZE1u","upper_bound":"ZTBTcDhRRkFDSDBVOGlDaTZHNVM5dnU1bHhWNDM5SUFYR0FZMFZOUXF3YllKUVRiT01kUGR5bFBWYjZFMUkxdlBsdDJRV2NxQUZTd3g3ZFJPbGwwOWU4UkRjREY0VHY4T1FhR01Ub2ZZVU10QmxOMjl6UVFMaWh0MDdITWEwY1pGNG9FREtUSmd5N0pFUTNBZm1UcTJ3ODZtYXl4d1A4NEhFMEVXaTNlSGdkMzBnaE42WGdSYkpHaE5iMmpqSGlMOE5DaVM5SVJaSjFLaw==","repeats":1},{"count":1315,"lower_bound":"ZTBybmdqRVc4U2V5Z0NOempIRW1PbHYxcEZoVFQwSkNUcEtzNDBuZnNoMzV2VEJmTXBTenFtNDEyQnY3UmZDcDAxQU9JUDRGMWoxUmtEeGxremd3N29zWGRzMXVoSVF5MVA1aHU0OVh4M2VpUFoyVUxkN0E1NXJvN1hBaWRlcTR6MENFdTBrTUdYaGtWdTFaT1pMYjdzRlB0ZndZOTljOEdFclZ3SU0wWkdJQjQxWXFwY04xWUdYZXczbFczaTZGZkVxZHBJMEd4YjBBN1l5","upper_bound":"ZURUendwM1ZlMlhMWVJXdWdLSGFrbGI4MzMxZk9sQVhRbDFlQXNLQkRxbnJ4bkhYRWpGV3hSNFZJYnc1U1VVS3FTRk05ZldhQmsySEo4aW5hUFJtZ0p1MWdIMEo4Q05TY20zVWhNb2lkd2RGeWdhU3dLbm81bzFCRnNVc0tYam1UaVAwMFV1YWJtQWg5cG93ZkYwb3FLWDNjNmRjT2dWeEdOMzBUOUtsYzVQMTRJ","repeats":1},{"count":1323,"lower_bound":"ZUo1dlIzbUprT2VzUzRhMmt3Szc5UDd6djROYTJaNWthek1SRmZOOFBDTzh1WGRobW51emFNMkxKdkNUT2pwWTZMYTM3R2lDVG1xUnJvRVVMNFhaNTMyTWZtbFNLdTRjVnhtbUdMczNKV2lUZUpaVnp3a0t4Z1RKbmdGTmpFNVdVMXZQbVhLWkNPY1ZqU0ZSZlppOXJpbVo5RHVzRUtCanE4eW5wMk5pNENhWUdoUE1vekVoR09vbVdCcVZkNERWYkZqTDlwVXlHN1oxd2xzR3JJQUFlMkJRZklU","upper_bound":"ZU5wcUVwaXZkSUR5SDQ2bHRhNHhnSnZZQlNGcG5lOXRqN0tGWlcwUGRhR0dBbDJzUHlyZmRoTU9UQ1ZnQzAwdGxEYkJxUVlWRXJaSHFjb0t1OVpKTG9hOVVIa3pEOEdiejVIWGJHMFMwYkJMd3FMWGNzZnVnSkZmd2RkN3RpNUh3V1M1ZktJWjBVZndsTmM5SXFsS0lldjZzdENrTExrVXBVcFJsSFkzSnM1WUduT0VnanpOajh2Vzk0N01uZUVteGJhQUtiZEVtQTdLR3hCdlZtb3hFQTQ1OVJENEFjeHpYZWpscnV1dU9Fb2Q0ZUZiUGE2dW96cjJ6bzRLd2VSd2ExN21UaW8wazdvcGcwYjBjZUhiTjdSNW9ZM1N1NTd1Y2VSd0JNZk1TNzJ6Wm9kY0JPNFhUaDdudE43NWZRZTNyQkp3ZThhZmpjdWJhRHo3SlpSTWg2VW1iMGExY2ZsMnNOY0VKQlFvdGpIVHJlUndHd0diaktuaElFMlBFeWVtNTJEZXdSV0ptOXlFblpqQjNVa0NlN2l2MGpUbGRhSTV0bWJQRTkwWTNSWFFwaW45TWV5ZEVLWGUwNHRsR3JPUTFudENoR1NKZmY=","repeats":1},{"count":1331,"lower_bound":"ZWpJU2dZVHpaSGRFUDF6TklRM2s5Vk1NT1NLdWN2a0h2RENDZktLSU8zNmFDWmJDTG1PZDlvYXZzd0k3WGZDNHlEeG95OWVWM0NCcTlNeUgyVENISTJCYWdEdFpLeGp2NzV1UVdsT2NhN3Q2OERCdDhTZjM1ajNuWjlmdDVERW1vS2J3WHdUeXhTbTN4YWEyYnF1U3A0N1BUcU02ZDJpQkJ4V21kdw==","upper_bound":"ZjB4cnFmU29XUEVlNFI4ZWFCc09FcmduTmtldWxYMFFlZU03ZVRXdEZsV2k1TTZpT3EyUERkbWZqTEZjd01iV1ZvZ0xpUm95QnRLalFVZzlSdHIyZUV1dk1RbVZSSUZkaFNXQ2RCNm0yd0ZZMGk5M2diMURIODA1Y1o2d1hZZk9hNGdMc1JoMzhWYjJhWjJ5NTh3SkdJR3hLTUs5dGlvdjhnYkgyNEJ5S0w3VGpseWFmR2FBM3hNU0pEcWRCMjFGNjNvNkpXM0F6YTA3NUlVVnRjOGdrZWpmaFVKM05KUHZqS1AwQVFPa0dLZVUzTDkyQlpCcFZpcmFHMVIwR2lyelZGYlJvWFBjTDN3WVc0MjBPQU10RUpoZm1RRjNFeWNWaFNmbGhyRjN3YWpGWTNNemIxZ3VKNDhBS0lKSXVNZTdYd3Mxa2F2N3I5YURR","repeats":1},{"count":1339,"lower_bound":"ZjFINmMzVGxMWVNYSlNickFBWWE4cVY1N1drcGdZWDBPbjdqc0JoSEFkeEswM1BSVjJsa25qZFRreXd0cE91bnhKR0I4NkxIU1JJbEdEWVZzZ1FYQ3FKczVnWXJ6NTNQeUVPUUdPTWhQbW14QTVrWkQwendDS0xlUGVCV3ExSmljV29YTTdWVlpCS2R6YWZXOFEzcHJQYXBmRkc4R2RMVktNQUl3ek5vZGplSWphY0ZzcWZqSzVtYVJES00zSkNFUW1sVTRpOHR5ODkxT1ZrbFQ1QVJCbDg3c0Y2QVpucjJoZFpEbE44cjV0SW40R2xsM2RiZmpHejIyZ1hWSFMwS3ZaTzl2aDJtNDdTWkpkY083cEN6R3VJa2tMRVl3SlF1Zm80YnRKSFpBN0d6dFVxNHU3dldNS21MOUZ3M1hXWERMbUVxdmRNckg3RFZZaU4=","upper_bound":"ZkdEa3l6eHQxQmlkQ2FpU0VPaWs5dm5RSW5jdjhNS3BBYXBmQXp2bkJVRTl4UlBTcUtpTVBvVjlWOTQ5VlVneklBcnh3eVo1N3d6M2MwdXhLbHFnbGdFSTJuV2JZM0I4Uldya2cwNDhNSkJ0Sk8zSXVaTGxyRXhUTktSMmxrdEdVYmNINGxaUzZhU0haSFN4OURaaGJTMDg5UE1taGtISjFDVUlIc1dwa2NwU0VqV2ZlVjBaUVlza01KclN6NDhnNmttRjl1anlvVGNWRkwwblB1WjZQVTVCUDVmQUhVdFFKeElZVkxSUEVGZEd6V29GMnRIMlNwUmRiaXNURmxMdHFMVE9UNDZ6dzNnUWU0cDJoQWp2eVJCekFSOWI5R3BnOGdjUmdmZ2NqTTFsNnNMTmdKeGxuTG9PM0d1amFYQU5IcVlyRDMza0ZmdzQ2UFlwTWtaWFRQU25JYnhIY1J5MGhoVkVzSzVTUWJhelRydmdn","repeats":1},{"count":1347,"lower_bound":"ZklobTNFdk1KZG1JaVpVeHg0THYyRERKY3U4a3pYWjdKb3doNEs1cUtOelhQdVhxcW90UGN3akpha0lPak5YTDlYdGVUR1Y5d1lscVNzdE5YZGlvalhuU1Q5Z3JmTm0wc2RtRklscTJRNGk1cEhPejlrUFZTRFFPY2hmcDlGa25jVXEwZVB1aU9LS2ZlNk5pR3NFUHFmMXRXa2NYYUswa1Z6V3phZ3pKNng0NHVaT0pI","upper_bound":"Zk9qNVdBSkVZU3RtOWxsYU52Y3RhUHBxZVAyTGNpaDViY0hKcnpjQW9oYW01M1VPSjIzcVFLOU55OXV1NHdZQnVLYW5nN0ZGQVMwakd3dTdQT2tuWUJjcU0ySUtKWUtFNmdLQmprWEJZbWphQXFENXRyUUUwWWZRMUZyS0VZVUV6dnBZeFZzN2tpaEJOT09PRThjeEkwZEtMaTlwWkFHWHNvSGJpNDB5cE54a01rVk5Udkt1ekJIQWxKWkxKNG9GajY2QU9zMktEaVV5eGdSRWhoTkdOdnZKeG5SR21XbVBwdkJ0QzJjZVpiSWt4ZjB6WThNZTd0R3UwMW00dURVQU5FQU5RN3dTSkNZVXFyT1A1b243Qg==","repeats":1},{"count":1355,"lower_bound":"ZlBSZE1rVXc5UjFxVVJPZUpYaUJnTFptNm92TGIyTUdiOTlkUXJBekZOWGNrdDUzWEVRYmpzZ0xFQXA=","upper_bound":"ZlZheU5aSlNSS1hRb25FSHRSS0RVWWZHTmxpclBIa1NkSDU5cVg2SzVSOEF0alk1VDdaYlFRM1BwcHZWOWVXVU1wc0M0aXFxaktxb1FvVlhPMVFjYVFnV2hZY0JJZ1I5aU5qNFZyYzhCdUR2MGlsNXNEZ3ZCU082WmVSSkdZV0t0eEFOSjRLYXdQMzlNRWN0ZUpaMGd4VlR6TFBnRXlnWVFVbW81RVRUVGkxOTlZd3B6dXBmSW9uZEJRZkVIUkdsV1gzSFFRQkNsNUZ6RTZSdlZibHcyUlUxeUFObHZBVXBLYlRhV2RVd3ZkV0J4TXpUZnlEZXVWdDlIVFNYOXBOOGVDMzhMV0MwSVE0aEJvWnFuS2N5WkZPT2tCblR6QmRJRm42Wll0SmZEVzdPcGlxamZIVDA5cXV1YlJEekxHVVRPcENSMUlCcGh6WWxtSll2NVkxQ0RNQ3JhZnptTW5Ia2l4cGRpb1diYm5GanRwaFoxTnhCVDVjNWU4aWFNaHZlY2M5d1lrbVd1TElDTlBGY2NHVldTanpXb2RDY3p2Qk1tMWw2djVCRw==","repeats":1},{"count":1363,"lower_bound":"ZmNEZmlkeHNXUENJMEZxYVNxUk5RVDZJNUdid000bzRHMWcyQ1ZZd2FGRU54MUxSdXFvWGE2REowMklBOFA0TzdDdDQ2cElDSWJKZ0EzVzNoem83STF0Q3NmYUNDM1hqYzZtQ2o1WUtDUTNiRmg3SnBqemNyWmU5ZXRzOWl0RmNheUtnZFlVOE85dG5YWWo1a092RUJVNkwzYUpZZFRFN0lVNDFWNnNUV2dCcjFOa0h4b05tcUFsYUFvRk5HaFl2eUE4U00zMjVXbExzNzVUb2NCb2J4enBEcXB3bnZjRTB6UldGWEQ3amhOeGNlTUVNUlluUUZmWnc4cnFIVjlRY0NiQXFwME9SNndZQjZPMmRkNEtJd01UTkpnZTNIZWQ1ck4ycGdvaGtHSWNQbUxNTVNudFpIV0xQZXRzWkRUTThreW9wUFZVYXdiV1pzNE41aFk2M0dWdHk0cXNoYTdsekJy","upper_bound":"ZmtBcWlNaml6aFBuZm9GR04yUDV4NG5HSDhKVzd6eFF3WWI3bXhHUElUdER1ckFCcmxVMXVhQXJqbW13NzFsejVtU1dpQ251UXN1a2MyU1AzYjdaOFpQNmd2RXdYZUZ0eGwwenpKRnExTk82RmI2a3ljQ2x6bjZaV1d3ZVp1TENOcTBoNWcyNzd0Sk1UeVZYQVBRaVlzVTBmeUExczJENlpmVlo4SHNWNktEbTJzS29TM2tnVzNYS0pyMW5jNUVLTVdvakpxNTFaZVU4WnZXa3F6RGlUeUViS3RXNlk3dEwxNG5Cc0ZwSmdJcXllaUd4eTBoVGFYaGJyT1hOck1WNXZGNUhIcnhoZzE5UVg4MEpVN1FCTnIyNGRlOWVwMndqR3B1N2Q1RmpYUWZ2STd1bDhhSnp4ZkJRRUtSc0N4WXhLMjdUNHdoemN5SW9adHFjaTRCaGUyZzE2MFFTbHd2R0FLUFZCSGtiN2xlUW94OTdQVjhpbHd4RXU3UXlLM2RZeHUyMGNFUFUyVVZ6bjg0RFg0U3k3QUg2dDVKWllYWExnMlRvZ3lXY1ljdzNR","repeats":1},{"count":1371,"lower_bound":"Zm9nWGFsbW1SSk5RZm9tQTdTSWg3ZFlHaXVvZ1daUmxaM3h4ZG5RTGlKdUVIcHZzc0Jwczl1d1RiVDA5ZTlYNnN0VW1NYXphMTBTMXl2UEpiTEpLS2ZqV3lmWW5OVFlTeklHY3o1T3lMeVVZSHNCVEdJTEhMRzg5Wk5xUXFsaUpYUVJkd2Vvbmp3a01vOVJ0ZU04Tlc1Unl2VUtaeGxPbG1ZeldwS1EyNzVHRkxKZWJISmN0RjV6UkVjUXRoak1YZDRDNGVBdnhWQ3ZIUVdwazJUcWphNTJOWkZaNlJndU9SZklvN05zRlNlRU14ejhuQUZxVEdyQzRRUFlaTElTWDg3Vmw0eUU2ZlBGSDBmcUlZT2lOZ2J0UDU5bTEyQWZlNTVka29LZ3d0UVVTZlA3Y0N1N25teFRuZW0=","upper_bound":"ZzAzVUFkQWtveW9PamRTQ3g=","repeats":1},{"count":1379,"lower_bound":"ZzIwUlZUZkZiT2JGTzlDUGJkVXExQUhvTldqcFhqVUhwVEhHVUk3WjZBQkh6enhuWWJteTh6WHlrTFU=","upper_bound":"Zzl3YkIwV2pvdkY3Z2xiOHpEbGtSak9DSUo0aHlEajF1c2N0clA5NnNTTnp0aGt5eWxCdHBLaW1OQW5jNFJpU0ZBemhSVDA2TXFpOHBxbE5wNE9kUE1FeXNyY3lHWDI4eU95ckl5TEhUYjY2TzdGaGRZNUJRRDJsaWRFQ1JwZWtBOEZRMllkTDgwUWpGcmNZRmd5d1ZqeDBqdFBmb3ZwTksyRmVieGt6OEZXU0dSNUNkdG5GMGNVUDRzMk5mSDNzcVRXM0FsanpUZmJFM0ZyZ1RLZFNYMDZ0QlphaDVvWlFZYWswY0hVRjl0dTI0b2dwdFZSS3dDTGo=","repeats":1},{"count":1387,"lower_bound":"Z0RGUFhFdmZPUXo5WmllRFZESFhtQXFFNFRiWU9WUFZjdTNnVFNGbk1ibTY2MGN5YU5HUHFsak81eTk2MVhTTkJtSVRVYkN1UFprQnZmQTlVZGJENzExeE52RGlrbGlTYmdMRGJZYjhmT2p4bFFZcnlRNEZzTUdCQ0FwRDJPMXVaUzE2UFZKeGtGVFA5cVZVTzlwU3doMXF0cnZtRExDT1g4Z3NlMkVKamoxbktPQ0xCTEpBYjZDNHVpMlIxNWVMZkZtcWFiazViclljSm94TmVhNnVpSkVvbVFqMEFk","upper_bound":"Z05LWlRvRGtiaFlqdG1tQXBPeEVCNXdLcFVtcjJvU2h1MlFBNHhmamhLWWxhOXNybE41a1lZUUNKVHg4cHlLbGRYd2FHSENi","repeats":1},{"count":1395,"lower_bound":"Z056Q2JTdUVrY0xtaXRMSUFxQzVUeklDbjBHdkVsT3BQcjdydlV2VENzcXVZVFhiamROQXhjbmU3ejhISDZSMzVCYjRwVU9abTJEWlhnckpiU2c3dXhqc2tKRndtREJ2SmZ5b0xQSkF6YWtaamx3aTRQVk83VWpGQWJrWEVrc0tYaHlNQ0x1bGFNZkh0V3hiS05yY0ZLQ2VRcmt3dkw3VExXUWpLUE9WbktBaGtReGlmVlRoVWRJRkFodkh2U0pKM21oUXZOdWlTUGg2NDRUTUNHV0xhVWtvRGVoaVM1a3JKR1hPQW9FTDFWNEprazRBcU1MaEdwY0MyZ0J5NERVTjBHYmVtNzBJT0dGMEVvQjRqbm1HdlNlcjBvN0s3WUN4YmZZUk1KRjVITWZDMk5DZmlSRlVMQUcwQ1MxY3ZjNU01YjZEMkZMRDNtTno3YjBTdkE3VVp0MnFQN0hNNWhYNVJEM2JXTnh5Z29MSkRab0dpS3hnOUl5ZHBNYmJlbDNxbWs3Z1F4akEyQlRNYnRNdGlaUmZCV0FqUG9vVWNmblAzc2NpYTBVanFpcHlEaUV6RGtQN29ldXRPWVNyN3VNWWtWTVdRbFN6c3BKdUtNcmZqamVLNXNQTVRBVldVM3Vsc0pjeUl0aTU0eDBIRmpjWUhBcFRxNHcxdGd0Wkp3UkxnanZGY0JrTw==","upper_bound":"Z1c1VmtFSUZ5Ym1CYjFXdkExSUJKRXl2SWxBSG51SGJFVkJPRjYxOVV4ZW81eUt6ckpuMGk3OWR6T0hTcUt6clBUWjRHTTNBUjAzMktnbk93YTA0Q2FlSEhBazhsRllDVnBEaU1VU1Y3VXBTRGU4eERVQ29rMEdERWZ5eHhqMUlXaXdpQVJacmRBakw4OGJmUWoxWHhsNExQRGJia3ZmT0ZUenY5N2d1Q1I2UnhPTmlDdFl5UFA0V3FoUll5bkxlSUF0M3praUNneEtwRENBWGVOQnlnTGJGRVpFWkZSSDlMOHlVQ1VmZnQxdTdhSDhBVUx4bW5HWmp4bWhY","repeats":1},{"count":1403,"lower_bound":"Z1dkVDVOaDJsQUNxNjVrZEZBY1hyb2F6SGVVSVZQSDdrZFRVMzV0VHRVeXZuUnRaUDlMRGVlcTNFNHNZWkZ1ZjZnV2xrRTZ6VTRObnVQSzVUeTBETXpha3lmNzU3SEdveTN5cU1XTTg4cDdJNmRVWkhJQkFBY0YwTlZVTDduZmVVc2VvOTZ3OEhTQ0JHVWRKRXpyblhTSDdSSnVOcjVxZElKUWJCZHhTaGFMeFNJZTJwMXlzSERBb2FBbEt6WGF3NnBicmczbnNsaURqN3dyeTVsdW53ZHhrNDJEcUpLVEM2VW1VSU81a3VEOXptbkw2V1d2OWw0aXlMN1N4dHJRZzNldUNjRzJFZG1zS3lwMXhQQWdTUzBxc3FsWExwb2NzU1VQaFVrelZGU1FnU2d2bXdGbTd0dTlYQVIxU0ZGdDZaMVNya3poQXVWMFFTdG9ZdFh0ODBlVEM1UnJqY0VmODE2bFRCcnRTVVFnejNhUUIzVzAxV2JJZ05KTUZucXE5MzJZQTJBSDhDcVpJYUdhTUNhZDFBUzJHd3UzVWtEQVR0Nmtsdk9HR0xoaGRpWjY0NWdjZkJkS3JUTzFnNHU=","upper_bound":"Z2RXWnE5QUZBZDZ6Tmc4VjFMV1FXQ3o2eDRhSW1CUWZ3QURsZjZ1UlNpelNWaXpodENSejhFT0hEN2NrS3FYWnNNOXVGbzlub0dxREM5ZnRQZjZ2Vm9HMEVGcFFMNW5JWEc1blVDQTBTQ29kVkhyM3VkNHNzY2gzQnJCMDZHYzZYaVpFOWU5c0xzeDBVdEJzWVlWOXdEZ0F1V0ZURmx4TDVxeUV3N0x5V3U1UTF0NHVlRzAzV2Z4eEQ0YkR0OXBpTDVRclFITFlkU3VJdTlDWk9sbTNjM2M0U0gxZ0RaOWpNMXZWOGhhV0hsTkxGYzA0end0N1NPaUdBVHhnME5Gc3pWU1g2SHlyMjVmTE9xRXVNanowREhDS1FmUW13cldISnF5dno5UkNMQWhUTEhoZUF0V21wbjFSUmZPREdMZmtyZTZNWWlhY1JWUjA0RklySHQ1clB3YTJlRG5wVjdMN1BGUkxOU1l6MHNOZ3JseEd2VU81MGViOUFGZUh0UFMyNGJONEVTMVh0SlRZSVQ4VnE=","repeats":1},{"count":1411,"lower_bound":"Z2Z2UjlLSjQ4ODhsVzh2d1pVbk00NERiaFBrcEpjWVZtdW1lcGMwc1B3dkFRcXFNdEpQNzFtb3JheGh5R25ZM2tZU3BNZ3NVcXpyOEdwNURIZjc5RmpLNU5aUGNudnFReHJGbUwzclRQcDlSYmpieTRlc000MUtEY3ppN29LNDRDUGZSNXF3NHRrNnhxSFVkRVpsNjl4UkdlSG1FcU9pRmw0RXVKTmhEZjNCMXpva0FsTk1oTGR5ajRWUXBsbDNHZkhWbDdKVzF6M1ZXcGlrblFqTGFDaHk3ZkJDWklTeU11U0pRRUxlN0R6b2FMcDI4ZmJXQlZpNg==","upper_bound":"Z2xMc0lPR0Z2eUg2SUZkVlRsdGNHRThmMms3QkFGOE1FUlNVdFFhS1pBd3FIZU1RQ3FpRFlSTHZXbm1naVF1MG84Mk1RNnhhWmxtbkhLZFpNalJ2RWJlaGZ3akh2ZlV4MTVwN2lJbzkydWxaV21CT1JXOUpnc1JoMU5vWExMckhQUXMwbHdGM2taMnRCOU9YUzB0bFpaNExYcVR1QWRhR3hxRFBQdHdUa3g3SEFwa3IyTXdGRDg5azVpS1NuS0dsTVFHeEtXa0lyQWpmOW5tQzFMZGppMFVsNDZucndxQlVxMkNtRm9NU2Y2UXltb1ZubnczQVVhSUFVQUtPVTJHY3lWWTRTbDBOWEM1NlRLVEVBbUVxeloyRGNwcVJSbmpUOGVUdjR5bllGQzhnS25ZMGJGcldrZFNIbHZWdW53clFWdmtlNm9MMHE=","repeats":1},{"count":1419,"lower_bound":"Z3NvemVOOEJQSVRBeHJXcW42WW9QcXV4QlFPbzc1NDBqaVBaVkxsWFZFS0tjaE80aTVjQkhtakJjZHh4YnpxZFhjQkdvcTRLQ2xRZFNuV2RrUXA2S3FVdmx1NTB0Q1VXV0paVklOMDJVbWhvWFp3UWxaTjNIUTRZRnpXMXhNUHRFMU1EWnZpMmFEYUJIUzN2YTc1MGFLNWxnaEgzcFUwbExxNEJ4R2RxQmdodUY0UkRxelFE","upper_bound":"Z3lzaHJ2RHFxeDJzNWVDT05uNUFMeEtnZUYwS0dE","repeats":1},{"count":1427,"lower_bound":"aDI0NWJ6TUxmNVMwVGJVZ1E0SFhKc2hDRFNZcGRGTlZFQmJnak5DcEwyQ1RzWG9OYlhBMk0wTFNkTDZndVZZVFJXQ0tOVjlad0ZOdXBVOWhBREJ1UFozODZRbndqYmtDVERtOW40SHhGWkc3blZDY1hJa1ZlbUExUjRqeFVQOUFMV2JXeTFVeDdkb2RvblRiMVhockxjMGtGWGFLOHdIUTJtaTZHNmJQQU96RWplUnRtWEZsV21hbWFuVFNhZUNjekUxRDllS2VYSENteGFUNVpSM0k1S2RIRENH","upper_bound":"aDgzeHhJZ21hdFZYMVlsVmZvbnpQanRxc3BGWFB2dDJFcGZHQmVWd3BLSVF5OHhteENEOXpCa3JRSHBwN0hibWNZWTFVWTJDeWhZMnpkNGREdHBsTEFWblpDOWFUZHp0VkpsSTlhYnFEZmVpSXliM2s0SnNhV0JNUVF2WDJ5dzNWbGZmSTl5U2J3eEdSbExPall5VmVMVzVNZmZCbHplM2g5TFF6QnVLNGpLZ0FzcW1nMlZHT2dNZlF0QlIyU2RXaTBHYkExMWFZMHFlT1EzQUhHajN1Q1NrdE5QTDdpMmdScTJNcEE4TFJlN1B3S09PYnpMTTg0OHd4SzRJNldpMTU4T1hwc0hUNXZWcnA3azVqQ25sVG1vaFF2MlZTSWQ5a3BLendXZU9OQmxNbDVpWHdZTW5QVzJxeGM3S1hmS1lBN1dWZXNPTDRxdFFWZGRacElaV2Z1bUJiaVJRa0NuT09IQ0R4Wnk0UGtRUTREbVJva2ZSZDVDTUFVdUFZejAxeHc5QnV5c2M0UVhmRTlGcXF0MjVFd1JNUzdmU3dLUVdHTnltQ2N0TWlveVRLUUU2Z29lT2dzbEl1NThrVGl6ZG5tazJMMUYwNVF1em0wTVVpT1BkV29i","repeats":1},{"count":1435,"lower_bound":"aEE2b0JSUmlPSU1Qemd1ZGVBWjNBbndXZUZLSXZLOXVSMks2Vkc4ZUhhSnA3YTUzNnpjb004V0lBNkNybmtvTVBPR2tmQ0E2U2RUR01TWlBHUU9Dbm1rYkJBamxobDQ0RGpGdjlBdmFNWGl4c2ZRZ3pMVUdwdFlPcjB6OUtSNkplUDBQeGxkU1BvcmlnRU1HVDVrbUs5NFJndFlEREJXRU5uVkp3aFRRakJkamVQY3c1VThOdHVTM0VxQWRoUm1icjdkNzFrWkg3VXdjUndWbTVhY0xvWEVNdjRBZFltMDBteDFlaGNQSzdPbVlzZGs5SlNLMldUb05IRkJ4b3Rubg==","upper_bound":"aFBaSkhXMUdybDRvaWFsRk53eVU2TnFaS09BT2tkRU9sQzNwSkxKNjQyYVY0SVVFdHFEdk02WDdtSXBPMGdoSExPNjJaU3d6RlRFV1czWGRhekJYd1hIODVxN3VyV2p5SlVmRU02cTBGaXNLRHAwOTl3aGNoaVpnNktNQmV4QzZKbXh3bm9BSll2UDVjYnlBOVRxNmZqSzAzcjdoejVJWjRJdEE3U0ljVjdFZ2l4WFdMSWlyaGdkZzVkdDZocjJpdFlNOFFHMVFJSld2T3hSZm4zYzlDYnBOakhJVGhhRURrRWNzMGNveXJXR0VqdA==","repeats":1},{"count":1443,"lower_bound":"aFJyZm5Yam1sV05ES3k4aTZ0eGtYOWFiODFnNXh2aHowck14OW8zaE5HNFkyejNBY09ESFZ0M0tEa0lLZ2lNNTlJWktOc0RiMXdzd1ljV2thN3pZNDZzaG9HZXdBZVhjb0UwYzR0cUFmYVM=","upper_bound":"aGR6a1Q0QjczY2hsQnJwMnlyTWgzTjl2dDdKV3g3Ym9lZ3NFa2d6TDFOSGtSdVlLWTdnRjhZeW1keU1WU29lV1FkcnNOVFBJMnJMcGxHU0V2eG9oa00yeERVS1c0YUdQOUhLc0h5NjZOb01JaWNRT0lZUHNWRzFncGR3YVR2WlA2UkpDVkdycXZYU3JKNUtpVWR3SUNPR0plTUJLc0NGMDZlNGlnek5Ic01aYlQ3MmJLVXphSXppYWZVN1ZKc09oOGhIQXhvSjkzZmhONGdjckxvdFlaWDA5R3puVUR6R0UySGQ0UlhwanRmcnRFMzhRRFhmYkZYdHRudmJUb0RrbTF1U1hNcUQyRTlDblQ3QldMUlpoRW5tSGRQUEdHWVRnd3hFSW83SUFCVmxRVGFNelhsenVkY0h4RE9YSU1Rc3pmVlAzOTBCb05KRVhKQkd2N1AwZGVLSnkxTjBvcEt2Yzh0RHk5Rm80MG1PS3hTemtINWFCclpZOWhrTDlkeVVsRjJ3aFd3VGpuSEM2ZXJoUm9ySUNDM3g1cjNPUzdyaTdIcQ==","repeats":1},{"count":1451,"lower_bound":"aGtDM3MwdTBramgzeEg3NEJLM1l0bzNzOUxIZkd4ZDNXWTJPcDY2UDVnck1mOGh0UWRRQ0E1cmg5bEd5UzcxZ25mZGdsR1JnakRaVEpoVmlMdjFNUjBFczI2THk2bGxNazN1N0J2eWhUZGtTZlNGNjdsM09CUGw4U1ZrazJ3MmtRNWpJM1BsZEhGZkFmcUNTNkxKWjgxNjBremVUNmd6V3lYMm9ydWk4Rk5TZDVKTTVOUkZIaWdhUXN6cGdaZ1kwOXVJckNjVHVtNWNxUjhQakhUVE1QbmpYZEFja014dHRwRmFqcHFld1JvQlBxQWdVQ25mUG05M0ZPbU5IZkJwbkNpMTk5T05UaWFVeXNsTnBPb09QOGxENzdqVUlYQU94a1VRams4bzN0OUxnbEFOajI=","upper_bound":"aG5BRWE1SUlQZ1p1aWJjN0RNSFJQYVNFbE5xMGk2NGxnSUdDb25QdHJObHhrUDFlcTFveEpncE9TNVRBRzVwcmprVkN2UkRVMWhtaDJnV0VSY3ZONDkzQTNTaENsOURPdzZGQk45WXpTajltY01xUHYyMnQwNTJGNjhqdVA4NDBNNUFUbGVhczE=","repeats":1},{"count":1459,"lower_bound":"aHRjRGpUS0EweTloa1RQMXNZVFhCNHlNMllta24waDN1VDY5YjJkQmNVeGNjRXpDeDlXOU1haXMzRFVtUlY5OGg4MjJleHRxaWtCWkVHUDZPTXhuTHEybHhxcTdNdDNrQ3pKb081OUpLTFF4NWhwdWpycGlwU3F2SjJQVFJBU0xESW9OMk9ueFZLcTFLSzI1YjJ5dGtTd3NBbEM2eWt0U0R2MExSdmJvc01pcHZGSVhjNGIzOTlXaUtwMTExY3l2R2tjTkNKUzZmc0lmQkVPWVJJTDhXcU8wdnRIVElhb0x0andUZ1d6aUR5M28yWnRHaUE5M0g4dGZMMlhTRGpBaDdRVzlwN2hFOVZQWUk4eHZtQ0VxejA0alJSOGFSNFhUbm83ekJrc2ZvUWxwbWQ1aGVSUDlTUWJta1RockV1Mlg1N0FMMjFBcWh3TEdrVXVPdm1rYkdqUFpueVB6ZTJST3RyM1pobGFnVHkxeldreWZZWHpwVWcxRHJjcWlJYldldTE3RWVuVEIyWkxTclI1UEt0ZTBDZHpsNzlCaHVMc2ZKTjd1cVdBaUxYQ1BOeWhXeXBrNnJhQUVhZGhRQ2JZRk02RzlIUjlxTmRFaWFu","upper_bound":"aThxb1NHVnZvODlWSHVJdlFZNWdHS0JsSEU0a1FXNkdkVHhxQzBydDdJYzF4cmFtcHE=","repeats":1},{"count":1467,"lower_bound":"aUJyelF1d0prMlhQaGkzejhXSE1EUlRIa0hzUjZKOElLbXFUWTNNeDJuMjN0VFdwTDZ4SzZMUVozeFNicTBXeFFPVDhjbmFIN2d4VjhyTnJxZUFGdmdKMGxTTXJQa01mblN5b3lSNFJ5aGNmNklRN1c0cU94WHlDVWRUdTNWbjBRbk9MVUZBMGxyVEUwWWNsYldiSnlwaWZYNDBIZHp1ZGkwZnZOV1cxNlhtelp6NWk0eVhqWGZ5WWpnZVczZk51NDQwZVE3RjhPdHROVTI2S1hrQlR5NVBrb2d3WU1jN1dIVTZXYVhGakdCa1pFY1JPSkJ1aXRXYTZhcXk1bERzMWpQVG1lOHFNU3FHMlBZaEpDSE1MZXR4S1BRMHUyMUZHb3d4V0M5QzJ1N1htSFlzVzVMaE43b1VicWlSbUJXbFdVc0VlZFV5MlhONWlYVVlWRzVycnNSSlk2NHFKeGRzQVFzeG1vc3NhRUF1WTJ1ZzRSdnptNjdSZnVUZFNIUTRnQTFiVlJWMFFCN1U1aFQ5VkF5OFRobW1FQXdqMkUxckpHaEFORHBESGNrUmxGcENwakl2WmZZV2JpQVZURnRqakpnbHZnR2VzWnhYOUlrMnZrQXNWdjRXSVFDaXpmNnBTWjVCVUZpeUVCWnJFOFp1eVM4MFJC","upper_bound":"aUVIMU5mM281ZGxCbmxRdEhkMDRMNVNSUk5YcUhwMHBZRlY4NjNPdzJ2RkRNRTN6U0pDZzhacW5tVkptTWU2bzJCNFQwWUdQdFBrc3ZDOXh6OEE2cVAzUUtsY2xBcGhJMzdhRUtwQ3Z1MEVCNHZyOEZDWDRDbUN0VFNhMW5ZelZzUmZHWHg4Ykp4WjNJMVhIQjFzbXdobDMyYWdMOGNEeGZWOWZURFVNMVFDVUlsa2JxYkJHQ0dscHRRWXV3U002YlhoQkIyV1NTdGoxVlRzTmljMno4OUJuUTg2R0JFTTk3Y1lacWMyVHJSTnNmUms2UmhuRjlKVmRWSWFERXZIdW15ZnlrSXhBYll3WHlaRHdFVjVycTE3Q3hyYkQ3U0g3QVZFWGd6WnVYRFo5UTZPUkd4OGVLaEZiZ3FzR3NpbnhxOXdOZjR3aUdBMmN4R2VOZ211bk9Sd2FMcTVsemNUNGp0Z0lmTU5OM3lob0Iy","repeats":1},{"count":1475,"lower_bound":"aU5YNGJpTE0xQ3lJU0NzeGVjN1JBdmcxYlRQc1Q0MnNZcjdyN3FSMlJsN01yTTFYWjlUTlRnWnB2aE9SYTIybU9IY1lScnJXRUh6Q0NZM3FGeW1XRDZIdmdwQjBiN2lUTjZENmlycDJPQ0FBcWhrcHU2ckZPblVqRTRBN2tqNHJHdklTUnNsZkh2NzQ0UGwwWXlTMTZHQUpaM1p1elU4SVZMVXZWWVN4QW9UaDkwTmo5QzRGTVVKenhSd2lGZ2dVNWNzU3MxbXdFODZQY09DTFh0S2pCd0tzbThtOXEyYllaVGtheEs1MHNzZnZNaWNHWjNkOWdRWHRzV1FlSElCQW5zRlNEQUduVkpxeEpjODA3dzNNcU1ZN2pVUEplczB1Y3h3Qm5yY3Y2Q2dFOXdYdnoxZEFEUmdhN2pGSEpYM3lScDBrWUJ4SEFMbjZ0ZGZiR1N5dU4yWTNZTXpyRXlSb3NhOThPRVBXN29EZkxsYUc4WjJPb1VvRWh0RVVqQlViZThDZEl6ZVJJRDd1dXp4WGF1MWI2QmY=","upper_bound":"aWlqeXdPN3lVWFl5STlmdndtT1VUNXNUN0hONEZQNnlYTEE3aHdJcDRQTVNtNkJPRU9MbzNKTFZOZTlOSENxcjA5cVU2aVRCRU1nTlA2MHlQQ0M5a24yNWZTa2oxMWdqYW9CV3NpRnN3NDdNNmVoOThzeHFib2M3VlE3ZzZzSVRpbUdIbzlrdmlwNzFjTHdpVkFGTmFBaG1YSEZPY0ZYeFh2TGhqcGlSVlNmV2hhUktkU3YwQzdlNmFyWUxENTZkQlpQSERsTHRpZ0ZMeDZjU256MzJyeXVuTlNQVUh2UElSTFBvaUQxSkYyTGhsdDNFSQ==","repeats":1},{"count":1483,"lower_bound":"aXQ5STNpMEkyMHpCcGI2NDlXNTR6RmJNOGpuUk8xdVZ5aFVhYXZZMTFPN245enM5cVZkalF3c09ld3NnekZuZm9FOVlmTVZKaHFmSTV5MXJrVjNPVDNFR1djbGhHMUNOUllSUnZsaGY1VEpzd3NGejNCd0Q2MzV0ZU83VHREbDhsaDhjaUlsa0RNZHk3T2tyUTJFamx6cGY1TmVObWRwa01hZE5XT3NwemF6TXU5UVBMV3pRSXhOSVpGT2ljWDZSQjhseExLRFVSMGNGRnBuRw==","upper_bound":"aXc4S1pIZk1FUW5ydU1jdjFLTUVxYVFuWWNZbWI1SjVWdUZwejMwazZvQVkzcU16czdyUEVMVWEzUlpRb3Zsb2tOeEx1WUxTQW51U2NNb2MyYUxFM0tIQVZFNjJuRmZuTmRKNXF0OHNQY2o0bExPYWdqYkZLNkdPQ285OUpWSmtNMDYxTDZyZXJXcWpjNTV6OWtVcTllOVExbzJrVEZxbnRMZE55b0pCMnRIRlFmdHl5c3cyczZoTTd1YlhTZFdDOUFDTnhIN1R4NFdDQWRjWTBYMEFoZjNqMlJoUjBlcG1oenBBaFJkT2JtN1pKQ2FaQzYyS29tckpXSkM0U0xOcjZpTVFoNEdTNTd5Nm1WYzF2UU9BWUNNUmpwRWFFVlJ5SDZFUVozZk5ldVIwdk1VdG82bnVXdmcxUFNUYlpXWmNYb2JaVDVUazZZREp4elZqNlU5UVIzdHBIUldiUFl2UlF5V2FHeURNRzdDRUx1T3lxcVdKaHA5TUp2MnBtbHZ4Q2NiSGppRkhUcVByNmJ5VlY=","repeats":1},{"count":1491,"lower_bound":"ajNYR1pnN0x2QmE0YktPRWhscHFqbk1XVGl0Wm9GNmhFTEJWQzF6SHVwdWRoeWgxVURYa3pHdWdweGhzckFjOWRva3FndFljckF3TWJIa0liMHoxbkFOc3d6aGs=","upper_bound":"ajlWYUhTNWhmaW1yUXEzeXFUaEx1RkMxdGRqb0tQOGZ6MHRLVFhyRFRSNzhwdWgwdHV1YnVaVlpqOXVGMDRpcVR3STRNZ3JiTWt1RFNTVmN5eXNKajlMTGF2bGwyQnBybUYyUFVWWWZ3TURnYnp5djBzcHRIVDltMVVrM0VrR29UeUpSNXM1bA==","repeats":1},{"count":1499,"lower_bound":"akFHOUFhQUU4ZGZ0RWpOMHdWS0lab2Y1dUh5c3laaTMwTzhMUEVoNXZ2elVPVjBYRno2MldSSTZjelU5cFBnNmNDSmVPdGhGQlB0a1ZmeE9HUEM4MFpSa0F1bndwbUlmdHlJeHh5UGdEOFpxOGM4MENmNUFWTURIajZkUmNVQWFEYTRhVFFpSklVRWNERlBRaU13WTh6M294ZEhjaUEwTFlvZVVNRTJWMk1BQnpnbXl2MXg3M3VPSmh6dUdZVUFsbGJoVE1BODJIc1NIdlZBRlBOYkRTcDNEd1REVFVZbHRQMjJNTGlUek5JTUIzaEliSDZWdkxZSUFXWW03MGVaM3VncHJHajgzTjFNc3dacjVYRUVNeElJaUVObUxINTgxcDBZcmhCaHluRXpudUF3V1BGV1VBV084dHBtREdTVmdjazNMWTVoSjZRSURxbDJiSDJhckF6WnhIWkY1YWR0N0hPTmZGQ2J0MzdWR2h4ZUNmdnZaYjlQdEQxYzVvRmtsdlI5UjFmbWVqNWhvMjVEOEpvbTR5SlZPaUFRajFSWlQycGxHTFVrazQxV2NxQ0tsa3l6N1pjTUZvRGd0VVRSOXk4Z0pwUFhuRlhyd1Ixc3ZMUnZGcTdVbldrSnBwa1RES2ZFbzZkWVNFU3l4cmJPQmJaMmdsZ2pJcWllNlhBTjlRSExvZko=","upper_bound":"ak1pYm9seklwOVZkUzV5bmp1T2Z1T0pZTHNVY1p4T3JQU2lPeU4yNnk2cmlwS1M0YmFnODR2VFVLaHE2YThneUQxRGU2S2FxbjRqUUF2aXJSeHlnbTd5dnBBWHpWNGd1MTJMbHZiRGNrZW1jaER2elN3UGhRM2ZvS3dvQzJhaDc0cnJDRFp6SjY4aWtuNzVBZm1CSVZwN0xKZUpYQVJjNWJJeXpOTU1QM2NRUkZGcG80eWhWQ1JaSEp3eUNNanpndmtNSDF1RG1JSVRtcVhSOE5Sa01SbXljMGVsZWg5b1VoODUzbGlqMjhVcHhlNER0dFhGS0YycDFnYXF0Mk1RTnZvalVCcExKc3N3Y3FHSVlTUE1QYkxyYUQxVzd4WWRUYkZPb0hrR0NyNU10Tkp6UThrVWhPeWhobHZvTTdzRFFMWG1GSElwNEdWczVRU3Jub2J6Ylg3RWREdW9mdTR3d2dEWUVRT2dENjdSVUVFbG9vN2FVTU5VZzFJV0dzVzJlZm12MVlZaHJXRW5SZlhrR21WRDFIdTFITndEUm9ETXhPZ0RvV0hpMHB2YkVON0N6MVUzUUtRQnBPQjFtTVdiSWxOeXhzNmxJcmhhdEROelJWRER0bmM5NXdnREN1M2FoSjZkR3ZkY240WHAzNWZsQUM4MA==","repeats":1},{"count":1507,"lower_bound":"ak9RUWZxZXFLaHlLSDJQTloybmVoa1lzaTFxV2RydVNXNXRmWFg1Slh6NnUzaW5jaXJJamtTMlBDUmdPamlIb1NFNm8zZmtlbnR5Q0IzSlFJakhVYnNJOGlBWWFzWlRrVGNHcldjcFcyMzdDRGliVk01clNrRDNISVE0NXdybUQ2RDRpeGtHajU3RmQxYnl5enRhcjEzZTh5Qm50T1dQWUpJcVI5bFZRZXdBYk5DYVpVN3Jzb3BzN0ZoRTdMUGpwTTlWdE1vd3FKejhOSHRHVHI=","upper_bound":"amIyeE5tV3ZadUlndG1qeEZH","repeats":1},{"count":1515,"lower_bound":"am5SQ1V6ekxSOEk4eEdKWXJEODhkZ1o3bUxtSThUQ0tOblg4WjNrdE5KNzhsUUVjQw==","upper_bound":"anYwVDViSUFObmJ4bkR2ZnM4eFZrU05LeFVtZzNpTjBGcGpiZDRGaExGVXNnMnBpMUI5SzJMeXRBdU1JNW00MzBxNzBlYXlweURmZTdFQTBMYzJHS2RBRHZGbFFEVndpN0ZGcXgxSWNsZTlaOFlIMEd0THJNSVZLWG80dW50cEV5cEd6TXpoVGtpRGdneG43UmI4Uk5lSkN6U0Y1NzhmWTJJZGI3YTNhSUYwVkxRZ0M2SXRmZ0ZKdm41V0dTZU93ajMyR3VIR2JiUmlyOTNOVThtQWVEU1BjY0JFQlhYNlk=","repeats":1},{"count":1523,"lower_bound":"anlNeWxTSU83MmpZOTVlaHFMSWZ2UzRqdjNXNGpMa2hBMzQ4dUN5SGlONUNrYWVraTZVSjZpZWZ0QlpoUXRKaENCVVFFY1k1bDJGWnU4c2U0QTR3b1I2MWVHUGtWWnpxQVdad29jNVZFbWswdkZpaUg5SXk5aEZ1VkVkRlhZOXl4TWsyamRyY0R1TFNZc2FTVnRmdkhYa2pZWFdNaHB2WnVPdE0wOEhkbmJoalFHZml0dG55MUM1Q2pCUHhuZjQ2Y1UycUJtV1ZzOFVSZWx5V2ttTWRsVHJWMXJYaDZQMlZFeWFJVFVYRmRCaUNZdVBNYWdkeVI3WEg3ZzJOMTN2MWZjOUFvM3hxaWpMWHVXMXNlQXJrenNpelZJNTlMZjBRTXhyVE1NOFE2WmNrempFcUczakRaY1M3RGlWMUUxWlNWMjJYcERLaWJ0TGhvRksxU1doQWE4ZzhPWFZiWVlMcHNMMmJsQnBGY0ZidVg0ZXBEaEVxVjEwRlpLdWxLY0FFTmxXdm9hbENQSFVlRkJNWE1aU1dycWJuVHZYNHpBQTg2b2RmU0d2UkpFSWhjYVVFYW1Cd1l2QVBCSmprS05LMGxoaWlveERoRGpS","upper_bound":"a0FpdXYxRTVFRGdiRDdBZ25NcGFVU3VsQjhBVHhaQVU5bVU4REg4amFkUDlyNTZYTDhjb25idEhiTHNicUpRMk14VFVEUjJaQ0FqNk02NFBwVndTTjh1RllaeDNPSVo4bTdPeHp5bFhjakVKRmZ2cXFWS0QxVVZEa1VlTHBuMWJ4aHRsNnBFS0s2VkFFWW9OYUhsWmtIbFB2U0w1NGlXa2toVGZmZFRzZw==","repeats":1},{"count":1531,"lower_bound":"a0VSVWQ2a2N6SnhpZGozMmh1RmJIWHlkM2VHNmNTV3F5VmFNM01wUmw=","upper_bound":"a05pcWdjaHhETUo0SEdaMkxLbmNGTWN1a1B1d3lmejQ0dlFjRUdZOVh0T1RGS2pNUG4wT3JaVDRBUUU4Z2dsclRLSTdRbVhHazlLTjFCRXFuaEhiMlhiZUtYck55TmJESkx1U2p3QVd6dGtuanJxRDhuVWVoVzhJOE51cktJdUhrV3dpS3dXdW51V3Jlc0hGQXRKd1IzaUdyajgxNFZHSmR2VHB5VEZUWEt6RThOSFpMdDdYb0E2MUlLbWQyU0QzN0hBTHI4c0F2aDZCTmtSYnptNld5MzgxWmVjeHZ6QlVLWnZaRnUwM0s5WUI1b3JXQ0trR1BGdXdXTERXdTFuWkVIRlMyVTRnY21ycFVqQ1JDNHVXNE00TlFiUDBMT0lHU2tWck8xb2swYWlQN3JVQndjbXMza0ZrcjRNckN2eElwZ0xDazBXTTNDb1N2ME85U0c1SWVPNWxTaEVVWnZPS1NEVHEzSHNITUFRQkd3bEd5NjBxVkVzTkhMb3RRYjM0TGtGcm8zaDZzVWYwY0N5NERKWUtsSVBnTEtOcmVVVUtqWkZacEF1SHFGY0ppRGxKMWhEeEowZ0VJVkFmYThzNGRrUFhNNnZPSkhDOW9Cak53bTAyT3hXRQ==","repeats":1},{"count":1539,"lower_bound":"a1VFd2NnaGpaeDRFdjdwdmk2NDduMlRhdGlqY2N1Y0Q3T3FZaWs4bThpdXR3NUdMYmRibGpPZWR5ZWc3c2wxeXpqYlQ4TE1CME42MlRPcW9hRDNVaHNFRkhaUGFqalZyTk9VdkduekYwbTFVY1ViRXZGRWpoUjF1bjJidWVZTTV2MmhqTnpUclVWYzg1Mm41a2hvNXI0b2NwWWp6RDFRSUNycWlDN3ZDUGI3MjV6VlFqVnNGbk9zM0xCNXIxc1VZN2p0V2gzdlluZFJqSFlNbHBZaTFtb2dRaDFwalFuN2N1MmNuYjBBa0szbEViMzdzc3lEeElrOTJjYVkwZUY2cXEyZHNIQU5UWm1GSjEzZUV4UmNhRWJYd05KR01UT2dUbXRuMXZiSFlkZ25oVGhBZDlTRml2M25adFdwY0tvaFVSdk1Kblc4SWJMUDBaQlVTUUlCNklqS1MzR2tkS0JDWXZnazhPTUFqYWNlTzBHYVZnalJjWm1BbjNBck9VRXpGZU82c3F5aHFWVWJGQmpaVFB1Y2lXbG0wc09JRnhmY0xEU2R3MnJBYmZIVg==","upper_bound":"a2NUUXBrRmRwbE9XQlpOWUt4c3Axb1BSMk5iUnFnQmRkT3RoSE05Q09kQ09Va29ObW9EdXNTVGpJemZuVUR5YVpNMUVKNVFrQUNuaUp3SlEwdjdtSlpueTh5Qm90TXRUVXBwSmZEUmRxUUhtbkFXQlJKcVNIc2lZOHNIQk56VDJieXUwMmp0UjhPc3ZuQ2t0czZTckU5WWdMczNDQ3JiYkttM1JPcmYxRW5SV2hIN1ZKdlNldzhMMGc2ZVVlTHZrdktxZ3M1UzZycWZCVUlKQXU3cDlxN3dtWm1tVFBON1F4a2dpUmY1TUhZeUk5OEw4V0hMRmNlYzVaVnNRMVFpVklCODdWMzNpSVd1dmR0TDNHZDFMQ3pKeFRxaFdJSWNpTm1BMHdNeGdydWpuTVIxMjlYOGdOUUhtRDhWRmhsRmhUUDVEWTN5bFM1c2xXdzUzZFFWWDZtQzF3S0Z1bnFYWWVSNzRoRnVvb3htS3NWMGl5QjhrZ2xZbE9pTXhTdjJzQjhJYjJweTVoMGFyVFRFM2t5VFRlN1JrVEJ0dDBMS1Y=","repeats":1},{"count":1547,"lower_bound":"a2RReFlGc0ZMMEZDNE1LREcxZmEwam81eDRTM2Izc2c3Sm9pOVRueVJjZlhxeENwSXhEWjRxTFNmbHRSS2FURG12VHpEdFU4UG0xSEt2VDU1cHV3bjZFRHF0eUcwUGFFNEtZWkV6TkNYdXRCa0g2b0JUaml0OXFQd0J4Zng2SEgxaHVvN3I0cHVYbEtXanFFRDIxb25pN3pvMHRMTkpqSEIxRFczNkMweVJ4OWg3WGVVY1ZVRFZPaThDVGgweTJGem9WV3JnRU83VXFscjk4aGV0eTBkUFJlUUFFOHpaWW4=","upper_bound":"a2lzQzl4WDZGckpOMGpVZGMwMHoxelU1bU9zTDhQN0M4QzJDOGJGZVh4dFFYRlFqSmFpa2VUeVRERGc0QWNsUTAycFBUWm0xc0tISVZDYUphazlYcVZJRVNqU2lDaURvSjhsMDlGd2tVbGZKaFliNjdkeWJTOUM1QVJHak00VkV4MzQzem5IZEc5SDJCUU5CR1cwMXdrSDRCSEd1YzBPQ3R2bWRENFV2M0hiOGRQc21MUWc4QjBIR3BXY2MwYkh1MGdHdGJyVFhDZ1dBclJWYm9mRzYwRWphbm15dVk0V1FkUWVxQW40VWpVU01ha0YwcVdaNmltUTVHZkpWQlp5QXc1aTFhaVVuZGk2Yk52ZnliVVZsWU9KT0FpRjVraHFjY2xsV3NMdXhQZXBEbGMwQkdNaQ==","repeats":1},{"count":1555,"lower_bound":"a25CbkVIY2o2NWl6Z2ZKQkJIRWdmakRFUFhpWVI1dWtUcEtSWHd1cVZWOGh3WmhFajNlZm9lSjc0WDh4bUxMWHlGVEpEclVnQ0JuaHRraTV6WHRCUWJJdjlXaU1kTFhJSUd4T1lkV2J1Y0t4T3hWTUxzd3BuS00yVWc4Y0JhWnpRVnZkaTdqMGlOcXdhbTZjNGhwTTJBSDkzNHJVQUJnTVUzbXY1d1V0Zkh4eVB1NkFrclY1aUFCMlo0QTc4UWlZUmdOREVuT0J6YWlGWlVLU29NTEM1b0h6WmxIMnVHa0xBTjBNM3pjZ2lSNFFORVc0cFBXMVVQcDlVZTdlM0NVMFJDNjUyRHhRanVjSm11ZHZscEhDaEY5dmJYYXJ0ZGl5bEhNcE4yNlR5NFlGM2N3b1RpamhTaTNBTUdlak5JSVU4cHV1TW11cGV2bmROOG01cUszU0F3NTh1bVdDZGxvQ0s3WlJ0UU5qbnRDM1k4N0pyNlNKZXN2SmJPN1dpbndzdjh4S0NiN2Z2dlJOaWJ1a2trSUtBVDdsWTc5QVAxS3o2Y2FZc1YzY2R2N2lZVGliTXdaTzZDY3VtM1BRWW1Sbk1lZWJFSzhrQlJmd2NKZURmQ3dibVBINzZobUYyS1NKd2E4VG5Pa0J6cFFKRXpWdEh4Y3RsY3JWcEM3TjR5","upper_bound":"bDA1VnY2V1Q5ejc3SHVlbm1raEV4YUxpTFVFZUdyVVZkSGsxYkpJSEM5VUNhM0JSVDBmaEpoNDVDRUw5UUdaeTB2Wks1c3FrWThVTG56NFlQczZpNXJCVXNoRGVoWU95NHlpUHc5S2VvZENRNkVDak80RkNHSUYxQVVJQlF6Tm01Rkl2N2dBUUxuWjdoS3NNZTg1YzRpZ0t3ZlkwM2ZDSVpBR1NORFFGU0FPUHMwenlSOWsyRkNvVFV0UFRKSmpwZzYyeVM5cTlUdFVvRlJQTDY0T2RWcEZlSFFlWGI4N2xtN0loTmlvTjhGajdNQ2Jqdk9IZHhIZDNRdHFMbWFUbWFXRlEzYUJKQUI2eXpEVFdYZFhIRDFPcGlOYktIdzRub1FYOEZmMW8xajl0a2JDY2tXajRUQlB0alZVMUdrdzVFWFNSM3lVc3U5MnRWaWJaZzRtMFhFdzIxdzVTTmJVdkJ3UWl5YWs3MHNaV05SU1hOeWc=","repeats":1},{"count":1563,"lower_bound":"bDJGY21PeWdxYzc3T2U0dzFrUkZLN3J3QWxZcURJZU5DYXRsWjJGVFo0MFlqZlJwZjFWY2I3QU1CN2x4alVwR29vTm1BdlRaOG94b0ZibDJRTUthY1BtWEN2YVJ1SVpvOXBQZHlYa0N3dHdDTTlaQW1YTEJQaUVic1ZDbFA1WFBMUDNyNzRqVGd0V1Qza0o5b1ZtRU4ybTdyeENGR1JSS0N0ZElaYUNZVUNObjduWGVyU0JaZm5RY2ZlczY4aVFqWVNzNEh1blJIWjJmaEFKMFRvN2VPYnlGc1RMVnZkTGVIS2QzR2ZoZVVOMDRUSUpNVXNjdm42aDdwUUxITzB2TnBPeGs1VFpibWNISkVaYWZWR2xwdXNTVGJXMEVQa0NvYTdMaHZTeFNpWXZvNVRDY0Y3cVhGS09XVklIOVlZV29KTnpOWTdJRlNyaTNkZGJsYXc2bVRFUlczZ3FsNGJ4QzlKbkJqcklxODRxUGJ0S3RubTZkeU5zOEZjSVpoZ2ZHVUZSQzlzaXZWUVNDNWtZa1FoUHlOVE1BcUF0d2lab3U2RDE1RDVHS1pFa2VNZU1V","upper_bound":"bERiU0gyOEVCMURmeHkwaXlld2FIaVFnbDFLVDZ5MUJYU1ZGenJyQTduaWh6ZDBhU1dPZW5sUDhmdFkwYUl5YmZrTGJERVVKZVVTSTV0SldKRTFWd1YxRGYxYW40eGNsYlRtY0hsSEVIcjlXMzU0OUFTbDl1YjZGVnhNWQ==","repeats":1},{"count":1571,"lower_bound":"bE1sa1ppS1lvY010cWVIY09DeWlDTkc4cG1qREh4SEVOd0JranBGUGlBWk15N3ZQeGl6QkNnWlZlN3paOUV2VWFjWDdDQmtyYWRKMDZ6MTZiNjZCQWdxbVZPOExodW1FYldiOXJlbklSNExBUmVFRnlrVjVtNlZLRWdwdzJtOFU1OVMyTjNUVHVVOXpNdlM4RE5pUE9uTXBydWswT2F4WW1KZUk2WHFxTjdGd0pNdHBBR3ZkRHNsSUgyc0tTQXdRMEN2VTRncmJnS3ptWHBHbE11OFpYZnpyek1CT3hoVTVUdDMwRnhBc05oQWhrVnd0NUVMRVh1U2JCbkl4eUZ3QUI3dmY5MGVtZktJWE1QRWlJWlVHN3JycWhUb0RTalJvdmZaMHZyQ0ZZRHhwMlMxYXZFdWJiOTc=","upper_bound":"bFJvRUpuaHZsN0FGOGFaMTJsaUFSbHlvbG1aZThyQ3lmTXRQdnhycE9vNGQ2ZGZGT3RQYzRjMlhxOWU2NXNGdEVneGhZc0tZUFJXa0p2dWlFd2JqTnBVdG80WlNNVWxSUTlPcngxSWJObEpvTE56TUtPT0t0VVRPanA4QTVrR0sxNGQ0NVJjYzNPbFBqbUJUZkNVOWdUUXlXanB0U1NB","repeats":1},{"count":1579,"lower_bound":"bFV4U1BPSXQ5QW53VTJ2djNkVWZXV3pTNXh0SFNramVIeU1JelJrSkJsa3J4b2hpZ2Q0TWN5M2pWeTNFdXZrdERRVGRvSzhzVDdOSFJpUlNDTXlyVUphTGxaaHA1QkhrREFMSkNFS0JqQlRxendyNkpIZUtWbzRPOUNEaVY2Z01oZ1YzOXNCOWlKSmsySTBUZXBPQUdvR2JDaTlzSg==","upper_bound":"bHFwV3JpNDFHV3k3MjdkMWZLUmhQV3ZnVmxQYTRjT1MyUVg3bTlsRDRkZ2xhRFNzSGczWGQ2MkxwMWtLVFdIWFZvc2s0c29jeFlERkFHbWlidjdhMVVXdkwwTzY0U0lESWNFSHBqRURTWmxoNTRJZ1liV0syR1V3cFROUDV4TldQOVpOZ0lkdlNxR2xoM2NzSEpSdFFGSk45QzlNNW02RHRiZmptYXdMalFTMEI2Y1YxR01BZzF0SlpSNFBiNzY5SG5aSUdySHJ0eExmUUxROWdMbGZGMkNPaE5iVjQ1dHpjZFJMaTBpOGh2VGpkNXdIWHpvRGE3VmpxWlZWOUNNT1RrbTFONElXVndtRUZIY0xHS2YweDhiVEJXV2kwOG9nOUdIQmlTd2Z5T3lxZkZHTUZGWXJDUnpmVFNzMTA4Y3lqSzlj","repeats":1},{"count":1587,"lower_bound":"bHNFOXZsbmFIc2NRN1I5U2NaS2N2eUo3a2h2eFVaYlRaeWFNWFBTdVFRYnhXRWZVdE9tZ1k1TjMzazYyTnBCN3BtNjdmTGdUbHh6d0kxQ0lWSnpYbFdrcGQ4WmlEc0tEdWFvckJrM2ZPOG9ZRURkN0Z2ZUdjWnlhaVlGNDVZRkNuc3UwRUZnNVRLeldXR2Z1NWxjUEJVTkpzM0FuRERlZUIzNjZlenhjMXNHM1I1eWY4M0ZsSnI4UVhMZmVGenpUbjAydWFwYUF2UGxLSVFiQ0MyaDBnRXpvdkdPUU5xTGlKazlvY24zME0wWUtOSkptSE9KR2xEN2RYajFGbjZqNnh4ZVhHWW52RnkwSVlwYm1NRVQ1U3NJcWxTRXpYMDZmek5wSlkyRWVsUjZTRVBOcWV6dWJucVlZaEdxME5oNGZIUWZ6NlRQa3JaemNwWlVWTkFWZ09nQzI0OTBzbkR3akNWTEI0WndEclJvZUlrUlc2TmZ4Q1g2RmZSdjBBdXc2Y0kyRU9naXJKUWJyQnJzdklaOVAwWmt2WEtES25DSWdFdlYzZ3I0TUVQdnZYemxqWVBDb1llRDJOTjYxZzVuMmE4YjdnYTFzMk9iYzZnQjRFcHp0QnppbmxuQVpiMjNOZWNJeGg=","upper_bound":"bHljbm1Za29NREhOeTFmbDJXeUtQZkd1WkV1MmJHWWNNVEhNNndFTTJBV2JkckpDcE1xcnhhSU5LcTkwRGc1bTUyZjZia3VaQ3drc3lVQ3ZCaEVkZVFGUWY0SWJUQlBJdGRKczRPUlJmRmphMWdSTXFLRllibjBEcTd0NmtQZjhiZ0NXM2xrTkI5U1FyWm5oM3BUUXRORDBNam9tSnFyZTZEbjJvc29ZRUpzV1o1S0pTQkEwcGxlbHhEajZ5","repeats":1},{"count":1595,"lower_bound":"bTJ1VFZmQ0c5VmwyOTd2cjRjZDZ2UzFWUldpTkxaUmdUWDBxVlNpa0xvc0xOYmk1UXAydFJJQTZVSkMzTFc=","upper_bound":"bUs4d2dxaGdiRXR2dnZmc0s2ZlZGa3RjT1ZFVDFzbTZOd2VkRlNGZ3lHTloyUktadlFwa0lmQTNQUmM3TWtTcUMzTVRIRUZpZVpCTTNaQWxuY0pETWRySVNGbGdqTmF5WjM2RlBZZkRycmZIMk5zMDlrYjVYc3pweEE3MXlISGw1VXA5UTdwZlVodllNM21uSW1ON3h3cHh6UHc3R3FtU3BtckRTVFFLTEpmWUNGbTBrc0JqOUI2M0xSeVpIUzM4NGoza0xtN3BmVWRCVDlvQTBMOXRYVnhLQ1hHb2NOcG01MFc2RTFmSVc1YXlGWDVIV3NLWTl5RU5Iam92d0U2U0h3RlAwUm45NGpYdDh6NHJtRHcwT2dJdkNWSzdZNg==","repeats":1},{"count":1603,"lower_bound":"bVBnWmwxcVljZmw1VW5JRXkxdVA3ZGxrZWlLVXJJZjZNcDN6VVN2NUdDRURIRnd6Zm5JT2tIelllWjRETFFhOWdhb1c3Njh3NEdPU3d0a0RZTmhEWVMzZmdCbWdMeWVyazJsalRKMzhtVWdoQlNEb3BBNUdmakRTZWZHTWlGdEZQTERVZHRmZUlQV1cxUDl6UkpkOUgzbzQ4dUV6MEFuQW4zQkZNMjNTRE9wVzNPcGFoTmJ5bmNvNDJxa2pDTVJCQWs0cjlCSWtlUzdDTFc3N3JNdjl2b3ZpbGpIczN6bVlpVFZxMkpobEVLYVRSMWhFbUlaM2NOTnlSMXI4aGZReksyVmpPUk5XNE9xRkZUdjI3M2lLNTZVOGd5ZkFrdTZKbTFWWlF5b2hUT2I5dlkzYzlMR1J5Z0dsMnpiaTdHS0d2RktDTg==","upper_bound":"bXJLWGZXRktTdVpxbnJyWVhJelJuaExITFlCcmI2Z3ZMTzQ1R29QMHpuQlhvQlh1ZHZkaldmVmJzbUp6Y0ZBSDlpeDZNZUZJY3pWQkY2V0NIQjg3alNKSUkxQ0t0dnVZT29FV2kweWs0Y1JEYnFiWnFYeDBEbExKcHhOQ2NwVGJaSktwcXZVVE16Nko4TU9hUE8xWXI=","repeats":1},{"count":1611,"lower_bound":"bXROc0twbm5DMTROYUUxZ1NNb1pCdUZjUw==","upper_bound":"bXlnZExZQWN0anhWazVMVm0xTVpPTW9wdGZDMENaYWQ3UVRMTFg0RFBCU2pIUXV6WEtGSDZpOFlvdnB2bWZ0NW1BWGxtejFjY1l6QnlqRnlzeWhIS1ROVk5DRjFxdEtLaWFHdzVNbVZpek1aaEM3TTlEcTNXaFVMYWFrQjBYYzdLMzZxaWpVaWoyMVYwQ2daQ3RMOGt5aGZHQ2F3eWhIRFd3aXhrcm5QTTc1WHFLMnU0NjZmcmtQSlU1bzJrakxYMXZOenVSRmh1enZZSU9GeVVzVzV2ZEY5b2Q5cm8ydHp2bEU2NldFOFB6cTFTYmlMN1JMTXc3T3dpc1hUVWZtN1R3ZGd2NGx0a1VONGhZZFYxek5KMlJSbWFHMjd1U3JreW5Tc2xQVDBadk5EaDNwN3cyd2hWYktlSkIy","repeats":1},{"count":1619,"lower_bound":"bjIzejFyYlVRNkZiNWlnbFFtZzZrRk5oWjdCODl0cUxBNGdKWTQ3cVJISFZDNXFGcEpXaXZOOFN2M1BaUlplNldBcWV4akxoNWtXak1zSHpXeEhoYTduWWRlSEI2TFFzUDZ1Z3NFSVhyRlVEWkI0UGh3QWh6eTlyaWlwbHA0S0hUTWZMa3BSNWxqbERxT1lGc1dwQXV2ck9OT0M5c3VURUFaR1M5T0J5RTJUd3RlRVVCNXgxWXNDZ20wRWo4ams0c1JCamhLVTNkcjd4dnc4N2ZBbGxNdnloZzBmSWlNcWNUeW1RWUtDMnFEWDlhR0ZCY3BsV0tQa3hnTUZjUTlSZkRZTEFVWGp4TGIwR2pCM0ZMTDJrV1pNZzBMV1Iwbk1OcWJoM0dWWGdUUFRqNEpXamtKOFNtTTNoZWJ3dnlSM3hKb0JCYjNTMjZPb3RYNHZkN0QzR01oUE5MU0NLRjNuT3ZQYUd4","upper_bound":"bjVUMmVWbGs=","repeats":1},{"count":1627,"lower_bound":"bjlsNw==","upper_bound":"bkdKUERMWEhxUnllTVJlZjBjbHNkYUpzWEFwaUxJQnpUTkI0Wmk2M3JzcEJrRW9nOTVkTXNNdUhhcVlBT3lsSzdxS0hKN3N0djNxSjNvMjZkTHQ0dXNUbktBUHdTUWNTb1VRVzk3UWlIVk9KYThZeGVONUFIRk8xWjhBWU9PU2MwTmhQYUNWczdPMWlNeXp3a0xXRkl2QzNDRnZyRVlCU1VwM2hNa1p3Y25VdThEYkg2MnpGVDFzeWVyWFpOMGRPSGNJTm9VeDFlck5OcGZZUnRQQjY4NzRpN3kyZ1NaMGRYR055cTlua053dnY3dlpFeXczODRIQzRrdUFWbHY0UUpvTTEwQmUxNGIybk5iUVZ2dGd4NDFBTWxwNjV6RWNjekpzUA==","repeats":1},{"count":1635,"lower_bound":"bktFQkppWklIcEhacGE1bE4zcE5ZWTZ0ZXJWUVU2aGxQQ3NBd2lsa0FqVVdjcUlWMnUwU2txMTJ3SmpkUnBZcTlNQ3FjRzBxWXZPVnNUUTJieUh3YTQ1dDYyV1V0eVJ6Z3dpVmtZOWx3NjZGeldrUW5sOW1wM2gxUUE4SGxIa1JUdVBVNER3SmlJTzlhaHVNM1FXZlpXVllhT2M4RVYwQk9KckxiQ1ZhVUhuN1dRazJaUXpMRWJrMDBWVlR5dUM1Q0JPdjBHTXl4ZG1vTDB5T1lrMm83TVlQcHZOZGVMZk1selFQaGNuQUh0cVFsTVB3YW1teEV0OXNMdkFGeHlQQTg0MDBFbFloRFVYQWNoNmdTbTVBNDMza2o3NTI5clZPcHpGQ2VONUFhbTY1dEo0OFFzbDY0Q25MUlFOMFFPN0hjS1F3WjRKeWdJYlQ1bExzb3FpeEo3eWkyVWJ3VU41Q2hpZTRMeGZtUHI0SkFTVHZCWUZKMW5zUTlJU0lDNnlFZ1lWeFdhbFQ5TnNrTlI4bllaemlubEI=","upper_bound":"bmNhT2x3aDI3Z1I0VDVzZTZ3aDhMTk5wN1FabkZ2YkFFdHpNTzBzbkZBa0cwaHM4aUNsQ2d2MzVLWVdrVnBCR0FzZEtBUHFlWUpmZlY3SDE3Zlcyd2Q5RXJTMXJabUJVQVYwUEFwSTFRbHRxalBnaGRKWWc4bDN4R1ltMHROdm9YaEkyWFhIdW1zZDhmeVVtSVpCZGwwOExzMndydUVqUzhNU0RKdHd1Y3NiTVRrS1FpcVd0Vk15QmxTRmM5QzJGMVpzWm1aRTUzdkFMMWhTR3N5ZHhhbWZqcWQ2dTdHR2hjcWhSSTJvcGJoZnN5Q0ROd2dpSUdtM0c5clZFUzU1QU1ZWHdvSVpWSWNVdjU5WklRQ2JaOUU2TUlJTHVRWg==","repeats":1},{"count":1643,"lower_bound":"bmZqaDBKeTdNczE1MllBY1c2MzFFU1JKNDQ1NHQxRWxWR3JWVThIMG9IV0FUcTFLaEVnbnlua05PRjZvbTJSSjhwMzlhRlNYN1pnN3A2RjYzcGNFcGxvUDYwUWRKbmY3TkpwcXJwbHNnSzk5Njc0VkVuQnBFemh5T1IyOXlnc2RORGFwRFpVM2xNYXJEbjRuTHhzY012WmtGSnJGblBQYXdzdEd0VHV3bkJrUFRPRVNjZ0w3UmZhOUFhamxBYkVGWk9WUGI5R0hNd0U2N0xJUnNGbUw2VUlRa2M0bVhHRU9vWkUweVg3NGRxMGlxYWlEd000NTRuWHc=","upper_bound":"bnhBYlhGSVpyNUZBakxKeFpPdFBaamo4aURGM1pqMkdJU2VmYXdLMFdMSVNwaFpwSWRFaEpUSE1OV0JDMURRQw==","repeats":1},{"count":1651,"lower_bound":"bzFaMDk0cW1zRWpyZUxQNzFwaTlOVXlqTXhpTlZvZmwwcG9QMUFJNzFTcUoxclJFN2V6VkJUNGxGYXM5b3JwVW12cDdZSlFaaU1DaEpXMUNMa3lpS1BYYlZnbVVHcTB2cFlxZVRZVHpHUmpFcmI2REdzYjNidjhQUjhkZ0lpcktweTR1S0k2a0dhMndhY3BBbTcwQ3JlQ0V2OGRYeERaOE1YOU5uOEo5UERjMGM4bEpld1kycGhja2szTmJ5dnJjbUhad3VSMkNTQU5jeDRTRnl4Y0lDenRIZVlXQnY3bkVVeFg0RzQ4VldWNmZXM1RieENjMXJXU3NIbFR3akthWEpNRjZzVEVqelpubnJOeXFEMU1RN3dIakx0TnYySFd6OHBWZ1hUVGNhUkRkMVpNTGJCRWVKRmFnY2c4WWhKV2phZlByM1h0aWtDTW13NlJFTW5jeDZLZTdGcWhXa0prQkJSZFdjYlhIaEJmcGE4dHFDdnJheXNUVWRzbUV0eXo3dW4=","upper_bound":"b0k3OVpRcEsxVm0zNkRJejNNQW5TTEVkTkxXNHlNQnZJTFBnN2Fvb0ZOb3pISWpLY0hNbUN3Wms1d1NoWUVKSHU5TEZvZ3lqUkFDcDRJa0hEMHpUY2FBQVYybU96M25wQVFsSGdxcU9nWnBtMTRDZDM2bTlCTm1NYWhRSzBoZVdydWtKNnNFSUd4cXFzbW1RVGdCSm1ZdDFTQjBRY1kzWHN6bVZ1bEtTZ3Q4RlJiT3NIOWhYYWZRZjFnMDFYU05KY016NkhkMGs5UXFabXMxZ2tZUHp3WlNXeWtRc2RBV3hVUTVnYmpTb3NtY3hETG52MUJDREoyS0dhazlpSG9ZMG5WU0U5eFM=","repeats":1},{"count":1659,"lower_bound":"b0pLQzVzT3ZSZFRsQ080VlJjQ1hvM2V3S3pSOW05cGZFbnFOekNVSGl0WEdZbDJSYjJtdWthTFFINnhVVGlMT2c1QmRUMmszZlkwcHl1eVpHR2p3Y0pzRUl5Z0ptcERtaVRwbE9ldFFQbklQQnFjM0lvM0pBR1lp","upper_bound":"b1ZQZ3FYb2JyNVN0WGZRZDA1OUFjTW1LeFVZU1RlamV5dDBaaGlTbUthVkNTeW9IbHA0SkdmVlhtUTBBdjV2THdWV1o3ZEpGOG8yaVB2Y2VjS1NUeE1WUUtYM1h2SDBQb2ZMaFBmTXFZUlBoYmNtaXVtZVpjMmpxVnNFbGg1VTFEdnVqeGZzdm1wc1Z6Njl4Q3VhNDVsUlZwbTJhc0h4WncxdXRheEljU3pyT2RPcHdKNnJ5Z2xxYjdheURTUGIyc0psTld3dUMxcFhtRHk2emptbmxMOFJxdHJvc1RHTThlQ0NLMktjWktmdUFsM3pnVkY0VmxqRlBuME1RdnluR2d5TGNJcDViQzdSUjc5SXBQa1o2dGttWGQ4Mml4TllLbkwzTW9ENnhWd3A1ZWVNYWNuNnBsZXdicWFreWZUZ3o0YWxlaTFiMGhIcG4xVGVkVVV3ZnBKSVB2OEJSbjNFUTZCSDNiRkRXTHdxMDFHRjhGTUpiWnRHajVtcm13U2VKNlZCcXpwVVgwU3BlQjM0RDJ5eFhzUU9jRWhrYmhWS2FKaVpCcTV0Vkl0MWF0ZDZEanBYaUg0U0hZNlJLSG1GTTFCR0gxS3NRSHdiZnBxcWFvQ2s3M01XcEl6NFl2WFZQaTRseGxobzBMMkJBRTVKMjhYdGpPWFVFUjZTQ3hsNnNMemYwQk5MUHFJckwwdDBKNXg=","repeats":1},{"count":1667,"lower_bound":"b1dLRU8yd2kxM2VlYmhGbGZqZ2lWbnNES3YyY2hlSndvWXJCNnBGNk1UNHUxSzM5dDdjUVBjSlBPdVA2ejJlV3RGakxCTkdQN1pOWWI0QTNBODhCRGFYTXkzd2Q1QWdia0pqTXFVRUpCTEExQVA3YzJsYXU2b1ZhZXRsTHJzY3JTa2diMjd6VmxWanF6blBqQ3JMeDRYNFVnT2o=","upper_bound":"b2VRTEJsUTBMSlM4b1NSblg=","repeats":1},{"count":1675,"lower_bound":"b2t1ZDRxNXNnSWpIRXVvT09kQ2E5dmpUUXFzYlZrdWpmVEpQWms1TUdOZnpJdnV4Q0tUZ2V3dDN2Wk5wTWVteTQzUXJ3eWFuZGs1YWxoTTZqZUcyekJFd3pHSGJoclFiUzNZMUNSUndTVlZxNDNkbGN0Z1ZTaXNUOTdTemRyczRNdWhWSVpMRm5uaGx6SG1MWUZGS2t0WEpEdEM3aGZ6NzdKTVJQQWs4UlduaXpFSXVraWxNQVk5YklZNUVreA==","upper_bound":"cDJaMzNGTlRnQkkyU1pWaEJ4YjBsTWpwTUdUNU9oMnlsb2R6OURtS3ZSZnpTSHVtcnlYUHZJQTFHTzlhT09DVndibTI2M2lubDM5TERUZ3JLY3FHazlabUFWV0E1eERnR2lZeXF3TDI4cFNic0VtaEJBdDFSVXJ1YXhtM0ZGNkQ3WTRqVGM2ZDRzT1l1SXdPWEFtRExEeFFJeXlneFRlWTQwY2RRaTBSeDBuZnZ2VTJGMnhwdXVpMGFsclNUeHhtcDNwdURLV1FleGI1Q3hMRlZRcndsYXpRUHBQZ1NhNmpHcXNyR0ZIcWVXdk00STRBN2swV2RON3Nmcks4bjNIOXBSY0ZaSU9oVnBKVjJRaERXaDk3clcxRkQzZmtMcWtVMlJFdENjT3dQaGtCbXhNMTBqZlNYODFUV0NuWlZUTEtBRExuSzVHdDlwcGtvRnJ0Nk10UjBaZFRXQ3lUbnZCeUY0MkpWUkc1a2N5YkNGN3BZYW5xdVZpVUszdE1KOWpiWFhGZXNmd2prS0FhYm44UnhCWWFjUnV1MzFTVndDeHVnRTdlcjd0eXNmS1o5YUZ1cHpWQnByNndjR01xdnM4dEJKZVZSTVJNblVtdERDVWtaYXlUR1JjQ2k3MEVXTHhlcDNPZnI1WFJpMzFOeWpiU1JCWm1DcEtEVmN3bU92M3Q5bG42T1A4WmY0b0k4UmZsSmUzZ2U4OFk3MXNPcHRScUhmUFM=","repeats":1},{"count":1683,"lower_bound":"cEhBTjU1RGdZTXByZWV0RjdPTGNvOVQyMTI0aG1tRVhva0wzSWdma0tVQWJITjgzSGp3QVZhTlZFa0JVSm8walowUGM3dUVrMU40QWlnVjhTTmsxd0dHbUN1TFZEeTA2ZFAwVU5ZeWdMOUIzVG1pOWVUdVNvejlHYmRzQm93Qng1dUdWVzAyV3lRY1FqdVZienVtcklHeVFWaW9qU2tManIydm8zS25OWkx0em1EQlBDTWVtdzZ2R01vQlpPS2JrQnhwRGhEeXZYalF0REhZSGpxUEFaYlU4WGxFMlNjOEV3WDgwNG9BU0tWems1VmNja3Y0MDFGSFRsRzdEUmhrZG5ZTmE3RjhwWEFGUXVid1A3OUVSN3FqdmtuSm1mZGdRUmxUbDc1eGVSMVpjVnJyaEc5MHBlcWJYblNIc1VCWjNTOEtMZE9HU3V6VjFob0p1Q1F1N29xY2ZuOWFsQ3loY0dobDVWZ1hSY2VDR0dDNjEzVkt6TlUzOUhXT2tSUWxTVWg0eUtpNWxoT1UyQnNlT0JmMVQxb1VqTlVGUWs0anhzblZOSVdmQm9hcWxQNlhUS1UwTm52elFVZVpSdkR1V0FOV3VFT2JZcWkzek5zOXAxaXRsc2Z6dmxQWVZITTFGclhZdHM5T015aUJmVERmNWRvdUdTSEhvUkNaYzJNS0NtenBzSjRMdXRZdEpvdENHdg==","upper_bound":"cFVSR1A4bWZZRHp2N3l2NURyd1VzWHlTb3d6eFIzT3VwcU45ZUE3WWRZdUJoYlJCTUl3bXhQQTNYSEdxQmZ2ZWp5YjBtb3JoNUR2ZnBhQUtMdUdhdTJqYXBuY0U5YmdnSnRpMFZKR01lNHFkWU9seDUzZ1FsVnJNemo4RWtPaFJGVTJnZjFVVjZYSUtoRklkbDJjc2hGd1pOYTU3","repeats":1},{"count":1691,"lower_bound":"cFpzN3VET1dGZkVpQVFYQVNoSEFjRUxIckRSV0VUbW5qc0sxeWk=","upper_bound":"cGdkQ2poRUhOZ0M1QWkxYlZLbGZMTExHcGZybHNIc0RiajRYU3BXS2tDcGJ4empONE1sTWhpV3k3MmdlZjV2Zm5INVhna2k3VnI4MUhXWkZkODlUQzBVMjRxbmVEbUdCcnVjYkJzcVUwOUIzTVlZWXE4MWljY2pPR2xWZHRhaFpNSmFJRWdJRHpEZVJWOTBTWTlPS3Z3N3F0NVVFOVFLYkhmVE9aWjY0SGtDeTN1U1pLUTVZclh3Tm1IdnAzVWJnWng0c3V4M2k0SUFrdmVPYTZnNHl3WTUzbFEwN1dnTm40dERiYlgyclRQM1ZCMU9ra2VNaDk4ZGZXc1l5WXNmMHU3amdyb3pyT2lydjk3bkNBTEtqUGRDRkNyRk5oa04zSGdCVG02WEl1dWw5R2IzY0hHeWpBSDdYU2FNRlhNekViSDlIT1NRdW9BRXdreUxNTkxSYjhSaGFSWHJzNmxFamJCdHJ0cVp3UFpBTFhrdGs2ZTRWNHBDUUw3SFB3YXZPYlVOMlh3NnlHenNKT3YybGwyTEVCMzNjZTVlWFZFQ05HcDh1aDUyMmJLTE9Cb0Y2Qg==","repeats":1},{"count":1699,"lower_bound":"cG0xUGVYWGtCaTJqWmJW","upper_bound":"cHFzMnd5dmQ=","repeats":1},{"count":1707,"lower_bound":"cHdwNkRzZjJTY0ZERGhOSXB4RG9mdVNPQVZldFZRVkNqMERyN0F3cHN2dDEzMFlkRWE5ZFlqdExQVEMzYXhUS0E4WTc4OHVXQXJPV05BVzF4WXZnZ1UwaUVEZW5ydG9PV29yRmw0V1pDZkE1eUNUZmV5YXo1TDlLeTNibUdGcWRjQ2dKTlphbFFlWHlaUHBvUm4=","upper_bound":"cTFrR21WNzFFd2ZmUzFtcEhRTjVoUDE1S2xWdE5OeXBPTmRrY21KTVpPeTZJNm42d0xmZUQ2MjhtT1EycWhMMVlLdnU2aE42amxSNmVpN3Q2T01FajVwODU1ME1lUUFWNFF0ZHpGbXlVdXMzUDAycFpRYW1qbzJGbm9kQ2tVdU1CektqQjFNencxUTV6SWQ=","repeats":1},{"count":1715,"lower_bound":"cUI4aDZmVWVRRkZ0dUpLeXJ5TThkZDBrZ1U5WHBxaFBVMTNrb1lGSVJyTHgyOFhXN0dzY0VXek5YdUF0TWtwVmNXTnZkUldPZkNZVEt2UVhtY0lORDZNME9nZ05pUkpsQTVFcmtaRHE3NUdUU0VNNDU1eXdFNDBFeklScUQwajVPcjg3cWFIeXg0Q1d2VG44ZWFsSDIwNmJPS2VwYVU2ZTNmYlNXR1VHdjcyVktsVHRQT1poR2N1WHpJTGlENXR6eTg2amlWSEZqNXNYRFQyWHNybmx1TlhhbmhsVmU3Nmtzc3JYUVFXUktCQlBkYlRXN0YxVGtMQWJWSXZ0Y0VYdU5WSG83TWhCM2ttT21Md3lrSVoySzg5ckpTSlJWWVI1dXcyWlB6M3pvdE00VGZSeFF4MEluVE8ydVc1aVV1blh4RFpJ","upper_bound":"cUZjTnpza25qTkhWRlhDcndBN3NCb1hDOUhGV3QwUnZLaTNjM0lPMzJLM0ZaYTc0Mm5OaFdpZTllajh6NXJzckRDcjBad2hqZWh5cWhXNEFQRkx0T2FLNUtZR3ZOM2RoU0h3OE4xWlRMY0kwbmNHYnltMEY4V3h0dGxLODVKbVVoRXFHNk5jSjZDUkJxelNMdmVzWU9XTzY4VFVUeEZqUGR1UFVETjZlOEdkMFpPYUNncWwzalZWcGM5QWRGUGVzbUdKTDlLVHoyTzh4VDlSeDdlSldvdWo0b0ZU","repeats":1},{"count":1723,"lower_bound":"cUxUU2ZHZlIzVURaa0xlNjQ1OExJN3RWZDZmQXpSUDlHcE82NHRkZVU5V1RQRWM3SjJ0d1l4MVFvOGhmRXZNN3BwV0JnNGM0ZW1RS2MzaW5VcUo4ckQ1VDNFTFE3MVI2UTNXUXNTdGM0djcwVXlRaXRXeXo3bG5XTUdUemJVNXZacTluY0dBUzhuQnhMWFFiendhN0k4bG52Wm1OUTZLMW9jQmdLSXFEM0tiSDFjYzRFbTFRMGFJZ0theDFKVGJQZXM1YTBrbmFxN1RoNk5TSERtTDFoZnk3SWdtVEw0ZndRMDVPNVdwQTJiQ3k1Nld2ODRaSFJyRnZrZEJNTDhUR3Y4VGJ5TjlOQTV6NFlOMVRVRkhCMDNRZzNodDRpamVMaFdGSnhaYVk1UDg4ZDE3SEw2Y0FxYlJjd2xpNGl6ZXZ1bVMzb0dvZEN2bU5FNE11SDFrREZsc3FGZ3pYUkIyWVI3MTlwWnN0NWRrTEJrVmJ4bnNVSEF0VlNJaWhGMXF6cUw0azl6QXJoTm1Mc2ViT1pJTU9aWmZUUElkV2FO","upper_bound":"cVNuOEMxWnJNejEzZHZzY010MnVPNzVINkdJYVV4MkdjaWhRNURwR0xPSkN1enhybWxwWGNnekRjN0xLME9JMTJhUk5lZjFLb1RCUEM1UDNKaDZZWTJJYkRSa2dDR0lzRFRFMnF4TTkzWEtwTmd3QUQ5UHFNbVNPMUNKTXBwWncxNUdhaDc4REJ4bThHYW1ha0lSYlkzdlNOdDhuVlR0VnlVOUhBVTUzRTNidUM5a3N4TkIzTXZ0NGQ3Yk5QVG1pN1RQN0NsYVJyc3BFQmtiWjZBMzZ1dFBVbFNMTkZnNXFnZFJqckt4Z1o3V3h2cDZJb2d6N2lmQjdqQUdUaUFuQm5yR3AzeXRMdUtPUGRCVUtENjhxSDc4WWVFaWVVcw==","repeats":1},{"count":1731,"lower_bound":"cVVJbWV3dVFWUnpZaHBlcTZkMmQ4S3QzTHRvTlN6S2pMZFdCMjBxTUVRYWxFcFBpNVVjN1JDbnZEeXNLbGhWTU52NnNKZllZb0xidk51dGJJTTlBZ1FOV2lVeVN2aVdzYkVPelYyUDZaSG5INmJocThham5kNzR1VHZ2UlFvZURlT2JEUnVFbm5kNlVKWnM=","upper_bound":"cWdQb1NLQ003TDNmekJiZlVHOThsMUZjTXNWcWtzMFdYYUJvU0NHUHYwUG1nSm5WVHk0OXVaM0pidWRtcUIzZGNtdzRpamFzQ1BzUU1kMEg5VUVUd3lWNUZJU0k1U0FobWxmMUdRUXg2T0pjUDl5WUJOcg==","repeats":1},{"count":1739,"lower_bound":"cWtQS1JTNnRyNWdSQlYwQ3dNbWY5WWVxbHoySXhtVWcwTE9NTlc4bHI4ZDd6emFuUVFDamhsa1BTOE0wZ2tIbVBnUm9oUXlyM3J5bHpwNFpZZFMyaDVFQXFEbUFtQzlsOUdNM3BqUkFJSUxxakluWUV3Znc3REowWnpteGYxR0wwSFRLZzRXQXJXV2U1OEpmVnZkRVJBRTI2YkczQVBqZzlpa3Y4V0k1SWNDY0FsSUY5eWlsaGJQdg==","upper_bound":"cW42UXcyWHRUV2hWOGxudXZ5SFROMXVCNlhHZ0FjNERDWnVuaTFQb0VKS3M5S25ETUxWVnBJVnY1akdiNEdkbnZzeWxIV01pcjBoY0Q3aUs4YWNYd3hncVRraUlOVm50RzFMY0twQjZ3anNI","repeats":1},{"count":1747,"lower_bound":"cXExbDFxWE4zRFNGeGRpblJvOUZTN011b3hHWjBxWkN0ZW5hU3JZUVI=","upper_bound":"ckUydkFJTDQ3Wkd4QTVjbDV1N3hRbUpSY1RGRWZDS2xGalpqT29SdUFwRVZyVEFQOFMyeHE1NEVtUFU1UFpGcXpsd2c4bk9VaUR0dHFnVG13WlhpdExTN3p5MklyalJvSG5aV1Q3UloxUHVRcHpoMkdGMWZrVVkxOEtxN2QwSlJNTzJCWXdHS2U3Y2ROd24wSlZLcEl0ODBhMTlMalFMRlVoaklFUkJnZnVwajlDMGpXNk5udDZ2dXRCUHVSdUtrc000Y212QVFKQktHY2U2Nm1ZSzdDSVpQZnFMcWg=","repeats":1},{"count":1755,"lower_bound":"ckVQWUV1Q1ZGTmNqanRaUkVZTFB0Z0kxT2c2MU81U1JvVTRuc1NBVzA0TjdJVzY1RXYySXczeg==","upper_bound":"ck5CaVJSbHk4cVZudnI5THcwbnhmM3Axdm5UOUVySmRzNWtQYzVUdEJ0cVlMSGxRSXRKcllVeUlrVUQydWxwOFpLSjQ1WWdnbEhuT1lOcHV6QVdpREFDUHl5dWQ5bm1aZW1zMnpla3dMTGJRMHhLRk1ObUpNakl6cFo3bXdnN01NSmtZOVFDOE94VGNqREtVR25RRDB4RFhKUXlmTlB5VFByUVExNjAxeXhWdU03QklGWFowSjdOSVg1RDJuZWF1WFFQWk5jc2F6b0E2aEh6ZTA3YlBXd3NBMTRxbUhsRXk3cHhkcnI1SThTSm9uSTRUSlllVDRhbTYxZEt6WlJqUEVkUTFhbXZNTGpJVnNVYUlodGZOVVhrZlNGOXBReXNaWW13bllZa0NVOWxWdUZZRlh6bDIwcXVsSjZzTU1ibFdwWmlJcmhPdjZlWWl0aGNRR0hvS3hpYjl5VjF4MGloZ1o3Z2gxNGNiRQ==","repeats":1},{"count":1763,"lower_bound":"clMyZlVtU0ZnTU5udGpvTXRtNkxaRkduU1pBWjY4ZFhNaWxZaU9UQkRMbTdtNmt4V1dURG9QRXVZbmxJeHlyZDZPOEw2Zk8wOVpEOFFqc2tyb25xRkxoemRhYkdDcDAxVnBFSTlWQWtsRURFVEFpbVpsbTdMM3EyZHdOcFF2Qll2eE42T1dLWW5ZYVBuQ0pqZmhpaUtVZzhTcDdPSzdORERSaW5LdVB6U2FEclVYWjg0Qk9sVHQxSXp2RlFCY2ZyZlhtNmlMbWRlN2c2TE4zUWdFY0FQS09FakJBM3BOM1lobFlzQ1BVdE94TXl1bnFFanFrSE5iamoyamhuTEdzQjFFZ0lhdjlKU25TQndFMlZ5","upper_bound":"cmJHRWJTYjlDQTFFSHhHeVRBV3A3aERPd2l6ZklSTnFsUlp2QmoyTDVsbGVCUkFSSGNmWGV3cEk1dThpQTNXSGcxczZ2bXdkY3I4V2tORHlEdVdKQzNTUW9KbFFRNnU4SFpUYnI4QlVKVUg4NVRCVjlkWWhpMmpIdTZ0Nm9KcWxIUmJEZ3poT2RXR3V6N3ZNdXA3Nm5vZU9BM1NGU1ZkNncwYU5VNkVxaFNRc3RTVFZsS05nMnU2Tnd2REZlZEo0RThKRkZlRlpjS091emFRUUpXMTg3dDdxSFVXVlZQelN4dzRNVHBaTTF5N040NTM5TGhOdEtiSDIzRDJwaDB5czJQRTNiWVE3dGhPeEg5c2dTakV0a2hvY2pxTDlxNmJyeHZZWWkxMmJTRWhPRWFpaVU0OVdSR3IxNGI4blkyeTlselo3QVBkQ2hkcEZMNnBiaVVFT2pjWkkwRDRWeVZLa1hLRHhjNjZCcld1RzdISWpLVEFJOVYwTzVrR3hZOFl6MlB5OXV3aUdiZHM4U1lxSEVmZmhxcWFqV1FDaWR3bGxQRnNrWE5aQ2JrYk41TjA4NkZKV0xCeHhOVHVGSFZJbjMwYUxqZlZUc2F4bndYNnRMaVg0YXc1QmlkaVBrNktm","repeats":1},{"count":1771,"lower_bound":"cmNHTlhreElBcjlsUEEyTUpKa1I0NWVGSFcwbWF1MFBwYXhIQnZBWjMwSFREbENaeTAxcUh4Sjdaeg==","upper_bound":"cmZORzQyN3ZKTTBSSGpPa2QzdXF3NUVMR2FVMmFCYTZzbHczSllqQlVWdFNVNHFzdDJtR2wxVEtNWFMyNGJPNjdvUVNtUjZLZlhKcnRBeTRWaHFqNnYxRzlPZGZ6dTVBa0hPNFNlUWVDRG1JUDBHMXlGdkRQYUFJbUV1TWNtc3NCWQ==","repeats":1},{"count":1779,"lower_bound":"cmdrYXBtdTlIcFhUeTNxenRVeGw1ajNHdUpENWo4T0ttTE5sbU5KcXBhN0RsdWRIdzhaOXhPZ1BzOThTVEhrTXZCWE1Ma2lLd0lPRUdZRDllMUNPdjJoam41bjZGUTVITGdIeUZZNXV2bFJWUkREUFZYRnNQQXBjeTJkRnQySkpnSmJncjdLV2E5cFphcHdrdXNSRm0xQlBkVG9LWlVIbXRtTUx4V2xCUDlzdGxMbVVJek1WSW5mbVNNUGpoUThCbjRPaW9jZExxa29lYk9ZcVFXZm80eHNtb2J6","upper_bound":"cmtxaG1hUXM1c2h4aGtWa05nMGpyeUk5MHdLTW1xZWFXSU56ZkZGRTByc3c3V3lxNDhFbW5yaEpBOGFUQnd2anJyY2s4VXhLeWx6VUp4YXJHN2xqdTJSR0tzR3doVnFoSm0=","repeats":1},{"count":1787,"lower_bound":"cmxiWHI0b3ZtVTBmRm1ZRlJnUTNib2pHWUNSekRNaTRaUWRWaXZJcVNyR1RPbHk2cFhlcmRNY3l1b2lMZkkzVFc0ZzNSSnNORk01SWNRcmxCa0s3OWVydENSak9EY3JKajkzYVl5T2VFVDZNbklXSUF3MFFlVFZsM25SZ3RWZFBOZ0JSYnVSa0NjT1pldXpHQTE5WFloaG1NZ3M1QjZSYVpwaUxYb2tjRVR6SGdZRm83QjRsNlZtSnZtZWFMZUdYbTBVTGp6aEo4SjhqM2N3bkhuajRURnJ4emp4QWR1YjJZNFppcVRBeGlmVkhjb0Q1R0lVNk5WSW11SDZ0RkQ0MklydDVyN1h3bHNEUDRSTkl1NEhwM3ZOOWQ4TFZqSHNNd2hDSlBnbm5qYXd0UlltMEJXdTFteXlPN1owbnpHcjBkU1hndEJoR0NXVjhoY2tFYmZzRVZveWlXbTBHczY3MnlUU2RIaXFkQXNWVGxlYlQ2VUd0TDB1aHAxem12N1FLem9nakluNHEyaUJBMUl3VEdyRkdJTWdpOTVoYnk1S2RiU1VHY2VEMFpRcm5CdlpGYWpuVkVlNHJkNWJmN1hxeThVV0hRWXBXcDdaNHp2cEhOWUhkdFVmblZTeUFYTEVaSlBCV3NQcnd5SGRmZFl4cE5uOHNDQ1d0NnkwUjdTcHBOc3I3YmdUS1JpaFA=","upper_bound":"cnJqNUhPNzZ1MjZZcGRYZktZcVB3cG1UMXowUExtRW5hd29RQjhsSGNmNlFPUVdvMFFlUFFhYkpZZnRXOG9vNnNSamtZdVFjYmxlSFNRQ3Y5NUtpc2FSc3RJVU42NndxSGQ=","repeats":1},{"count":1795,"lower_bound":"c0o5UERYaXVRMWVIbjJmRTUydzhoNk1URUlHM2lyblJNWlhQdldnUEFISURYd0c1Y01UMDY2b1ppdEZZTE9iQ3Z3WHFBaHJSS0JLMUt4eEp4OWFqYjF4cG92S2F1TFE5MlNZUXBNZlBsemNTTzZuUEhWNU9SQVFlRE1tZEhMcnZmVm80UUFaSVQ0a2VKUTlkMzVhTkF0NWJuNDlKQThYWnhQMVNHRW1tT3RQSXQ2VHVzR1FXenA3WFFjV29OZGtSRTh4bm9JdVFrUTVUa3hxa3RoNTkwZ0Y5MU1wY3ZBV3RlY0tPRmFtNnhPakNUU3Q2V2ZoWFljZ2xJSHhiNTVvWWZ0TmNCSmQ3eHI3MUJlRms4VElqaG91Sk9yaENDQXVqdkFEd09YSA==","upper_bound":"c2FjdE5WblFpQTFZQXNINVo=","repeats":1},{"count":1803,"lower_bound":"c2FlOXc4UnNxSXNwREpOTVJjQ0hwak1zS2FnbWNoOW5aNk52ZTY4MHBGZDVqbGl4dFB3RE1IbWVTaEJzWmZSdG9YRjlnUE5yb1dCUDE3Y0lvN1Rsa0ZodUVnVkZyYVpZY3lCSUZJd05YajlnVnlpYzZyd1lNaDc4bUNYcDJlU0NqUFI=","upper_bound":"c2V2SUhVa3RKa1RqQXFvNEJ6enJUQlk2MURueTVRbEZEaXBuQlc0VDVLS1ZpSzVNbEQ4cjhHYnJBbjN6QW9IVjV3cXNudEZMek1oaDZOeG9HREptdVhXOE5kYlREblRZeGo4czdYYThzVnd5b0dRZU9zY3c2cXZ0cDROZ3gwU3lxTHR2dDhjVHVlUDhoUGZ0c0VURHZHSDBHZDZxSlVKaWdXaGdWaUVFSjBialpmWlJ0Y1RSUnd0cHBuc1h6bmtWYURHelBSSVA5Nm1IS1Zyck1ZczczRzlKVUlNQ2V2SzZ3RGNEMjFXV3lzSVRTelB1MDViN2ttZWRHZDVxU2FZQkdWMEp5MUdHVzhXTjNIbDFZcmx1aG9vT3NDNkZyUXFhSUZPaGI0OWpDU3pTV2NTelZSelM0Y21QcVRWVmFhcUR1ak1NamFvTHpHeXpFbGwzd2UycWl0WW5HQkdDVTBmUTRWdDkxMg==","repeats":1},{"count":1811,"lower_bound":"c2ZJS2lodEpQYktybjgzMVd3TWF0cFFhaVJOaFlhM2dQelV5Q1VQd1MyZTlSVjNPUEY2d09oM0pSYk5VelJMaVdES2RUZ3VLeXYyTnJ2Y1I4WjFGeXI=","upper_bound":"c3FBYktjV2tTWmtFeUVrVDB3VTVqb2lVQnJUSkttanIyaDZubjdER0Q2SVRTdGttQlF1NnFFMDAxNkpxVWQxSEFZWXNjODVDTEE3WDlVZVd0bWFiNFU4eFNjaU85STBwSkk2cWNlT3JJMXRLRDZ1VGZQd1RMMnVEc1RqSnV0V09X","repeats":1},{"count":1819,"lower_bound":"c3dYUFEzMFVnbGdDUkdpNEZyeFdiRmZkZDZRcFhmV2tCeDl4cXUyTnY3QXVJNFQzTFFiaVZ6amY3QWVFU3NaTmFJVHpVdzRVcVpuNnptN2NnbmFuUGdFcXk2TmxPUUpjbGM0RzZJVXQ5QlRhZTViRlBhQjljRXh3aWJlalA1cHBIWVQ2SE5CYmNMbEN4MFJSTUxWMWtZNVFVY2k2VW1ybkZvQnNCUmQ2dVRwS0pGY2t0M0ljTmhxZDRDSjdX","upper_bound":"dEMwMU41eDNLWG82MnZuVDN4Sm55YUdmemhOVENQTmZtZENBd2VvanZPZHMzcDRVakdVWG81OGIweFdPbG5ndG45aU9mV0RIYzIyZ2FmdGlJU0I3TTYwT3c0ZHgycHNibWtSSk44b05LZ3NHeGZ5c3BjbVlCbDVNelRKTXZwMEl3dmhtN0swTHlDaVRRWWozN2RCd0kyVVJlU05KcG9admhKSE9sR2FtVjFEZ2g5VGZyNzNySXdoUURuSTZTVjM=","repeats":1},{"count":1827,"lower_bound":"dEVqeFpFcmtEdTNaU1RkVzZ4VFVyQmllQ2kwZHdZc0J6eU9oeWRvSWUwTDRCMGkwejF4MFNtZGVrdUU1VnVFaXBjemMwNFhtMjd5U0dJOFFaNmUxVGZtM1N1UW1UZTZyejJseGJvQmpuRU5HOUxOdkZDOWVydUdNcndsQmZ5c0hXRTZUaEZTWmE3VktEQTNhRklsdXk1ckV1S3pvUWFsNENld0NLU2FCRlBSU3Y5WUFweHN4cm5ZTmJGd01wV1lmMHRJeDN4ejljR2pTUUpMMmtJWUUzbWh1emh3UmRGd3FXWGM3clFJUHBCRXg2RDNWTEJjNFdPS3Y5","upper_bound":"dG01RzMyc3E4Q1VXVDVQN2czYk1JSkdRdmpBamtQR0EwRDM3dGNxb1FkcWNLQWdXU2JDaDVMOXpPc3Nzc2JLNmRPZnpFVGhOQ3VtQ3ZzcXRBSFFjbVJncVd2YmIxdnRaOUpOMVlXdnhrZUR0czUxbWY4OEJKNFFwZzJMQWRhUElaZmFadVllWEFITXpV","repeats":1},{"count":1835,"lower_bound":"dG1Da3NIQlg5UEt1dmN2ZmxpQlhHMGZ0VlZ6eU1UT29Ibm1TanlvS0RyMVhmRHVZREo5bGNjb3dRQmdxOTdQNUZNSXFjd2t1VllEamxlaTNIR1haMWZ2ZHpudFo4Y3A1ZXpmOTZ6enV1U2cwTVM3","upper_bound":"dTZRT0hzenJobXVpbmR4VGd3R0pza2ZtQkY2ZE9aendacUViMHc1QW5tcTVqSTNQa3FkRWVudDFFeWlJMTlyaEJ0OGpZYnVTNmZNejdXMWg4UDY1SFdHbXJTdkNjdUFvVVk4Qjk2ZktCSFF3MmhCMW50eHFoREc0cXhpZTZIMmJjVlQ3ek1vVmFXZjRqT0s0b3A5SkVKZ1NHelp2SlE4THQ5Vk52SHhRd1ZZME0zeXFRMVF2d0FLbWpZUzBQRGkzZHZHMWg0c3J0YXdRUjF6V2hYM01nN2JIOERtcGI3YXdBN0RqUDNrbGtkODJRNTlQeXdEdkNVM09MNmRkTnh2VjdVV2NVVEg1d2JoS0lIamRxSzVteFNkc0tXcGdoellwcndRZjY0clJrbVFvdUhzbUlTbEFWMFRNMEJFdzBndTloVE15aTFFWDVkMXBnNzJzWGdZSmRBejd4Q1Ric2lvR0U=","repeats":1},{"count":1843,"lower_bound":"dUd1YlN4MTQ3cENuRmNVU3cyNzl1UUlWb3Vhdko0UzBRUlQzZkVGemU4N2piTTZkY3ZDSUNQOURjMXVNVDQ2Y0tFZlhxaHBQYThxRjVzSzJ2bjh4VklXbERLNjVlUlZHaldwWVNnQzVOMmZNYVhJazd2SVVqQVNyT3VHNVdodDRRcE9hUFJrRkQ4OXJxOUlqaE5Fdjkxc2Z6dlp4dmJRM3QzSGd6Tmxyc0RzWU1QMTV4STZzUmpQVWhja2dtUFhqZW1EU0Fwa3hFRWl0ZHBEUWx0YjBpa0F5","upper_bound":"dVFTQWFzcGtnNDA2eFNVQUZ4bmhNcXJiQWRrRkhFNmdWVndJc0lHbmdSNERHZTdZSkJvM2d4UG1Nc1dvZ0wzdER4c3BjV2kxc2VFaDZpYTNkaWdrYWt4Q3Y4VGY5dFJwZFhBRzNIeURnVGNWU21CbUpkN1NaZm5jdkZ3M3J6ck1Xa3k0OUtEeDZ5Z21HZzFTcW5CRXVFMUtuVVZHSnNvMFFzMkdhVlV4RFZzRGtYbTAzb1pldTlXRDd2S0pYaUNQbmFMVE5pSFBMNUo3OWlrRkpaVjZpZDNTaVMxMVVIbUR4UHo2RHBFcnQ0ZTZuZkJRNUVFOFc2ZDUwaHlJRG1jYlFHeGVoY25aS3kyaEpCQWx6YnBiRjA4cThyMk9zbjRqSDY2UmRQRXFMUkZTTUNyT3Zha2NWZDdITkt1UHRrRm96dkxpUTI4WThaWmltTGlkN3FGZkRsdTlHeVJhMFNBYmFmTDFMcXl1SHFqZ0JoZHlZZGhxcVNzWnozRzQ0WUdZbUYxY0JmSDhLSVVHV3pTMmhJcWpoSw==","repeats":1},{"count":1851,"lower_bound":"dVdZd1BTRWx4VDdrclh5a2RaNEkycllwaUY5SGdjbkkxTUNTa01jendyNnVBanBmUmp2YXU0RW1JRlVLUWVLdFpRWEdLOTN1ZzR3VUV4cTJQZ0p4ZFJNVksxcnhkNEFFSGFOSENtcmdmUk1qck82TWR3M0RMMnZaTGdKb2hVSW41V3hvWmlPR2czeXpOYzRsQjU0WDJkRnZnRnY5WVBsRThkWnRia2NyQ1FjV2hVOUkxYnVCUkhDUEpaTnZQek53azVmNXE5THUxVEp4Rkt4bk1EUTNjZkNUMFNNbHJHMEFXekpuV2tIenpmZGtuQnVXdEU0bTh2TTdmcVpOUHFmNWt1aWwzS1E5WlNJRmNhZkxWTERtazU1OWJJRFJsUWVna2ZpY2JMcVFFM2ljTzV0eXkxSGxpRTMyQURxd2kzcG9CRUxSSXI1WE5yc2RKa25xUEFTUWZwVmtiVTZpblhjdmR1MmtBbktYYVBMNVFJbA==","upper_bound":"dWM4bDNuMnV1ZWhtTkFFZEl5UGY4QnExTU1ONWJieXZEQXAwUWdhM21WaGFSUklZRm5TNlpyZ0N4RE9BaDlZRENFdjZJMm90OE1yZUVXNEVlMUhtOWxTVHJDcndqYkkxeDVBclJBZHBmWmkwbGVRM3FKQ0VicFcyeVdoQjVMQUx3OUpNVDcyYkhEdXhNaU5SWA==","repeats":1},{"count":1859,"lower_bound":"dWN4OWoxQ2Vub1ZQejNTUW5TSE0yb2xKclhOZm1UcjRJbm1jbWJmZFFjREFYU1hnMkdXczBVMUpacnY0bkVUWlVOelR4dXphV1JLa1BoWGZRdjhnV2I5cjE2WjUycVhHVTRCaVhqeDlHQUdjOEtwcFpnRnNOMHpQZUNTQThWREsxS1FGVmdNMkhBTExLRnlubXZEWFdqNkJxNUZvN0NHWjMyN29Jb0dKbm1GdVpEQm1raVBPU0liMEx1WGxVWmloa0dCMUREOE9rZXFLSUozR0xiam56SUpZcnpmZWNCWFU1UGpja2NnN2lOWE1iaEFZZEo1Y1NoV094S1BSdDZTdGZLMEd2anlSZzZhUW9TMXpheHN3cXBhMFVuS3lUelQ4TXFRaFZnbHhaQlRXc2FnQ0lGUmppSEh4ZENIQ3owQ25mS0VqcHY5Q3JpcFhENHp2Y0F3VzVZUElOV1BGclFkODZvRmJPTjN2c2ViRmdTWW92QnZWbHpPbWxDbDllOUdaNkNXUm84U21mcU5zVHNjbnZXWm9lM1R6a2VCQW51VmFIdUhxV2xpZnhzMWtnVVM0S2I4ZVpJS0lSeURZU2tMQmVZdU0xUGtBOHVSVVN0SXhNMTU1ZEtBYTNQdVJlaEo4bFVzNHA5OUY1YkVqWjR1OVE1NDVCRmNGYlA2QXQzOGVHTEVrRUJraEhDbGhoM1FzUXRwMGxBeG15SXhud01HV3BteVFRdw==","upper_bound":"dXBGUkV0ZktrRDZxb0M4ZTlzMU9TZ1FBUXNKZDgxSk1FUUdQb2xFblJDWVVYMEZpaWIwcWNXM0xNTzFuT3hnNHZ5a1IwM2VTNTYzb3owa3lSeWJNMXVhVERlM3k2cFYwaERINDNkVHRjbjBna1ZwSjcxVjkyMUlVbjVNYTlQYlhKWml6OVVkMEdKWDFWQWxlSUJJOE9pM3pURGtDSmd5M0h3d3pYZmVNOG9IWW8xVlZQZ1Z5WEw2V0V1WHYwNDJvTXYyRkFXQVFrcXY5Y1JsbTFBbW9EWDhCWkVYNktnTDdZMmd3WmZ5Y2I4cXc0VFlCeWllSVFTcG5vWG05RnZOaWNEWFp2YlpsTlpSWUgycXRPcGFBUnVrQnJuZEFwaExQMVhqSGowRmlBdnBzVlRLTWdVT2g4RUtRcVFydXFxeUloYkxzNGQzREV3UGNRaUNwYVRQVHdtcHMzNVQ2anN4WFhDQTFjTWRVbkhiS1BidHJRUzdIYnFjVkZHYnpYUXJHaFlvT25iU0w2","repeats":1},{"count":1867,"lower_bound":"djNnWHlIaFRQTllVMVNjbHJibXh4elBNS3BIRVA1VGFtQlhHZ0NQSVBWam5HeEhBUGFZR2tuS3VGemdsM3o0bG9QMWoyTUNyUWt1QjNPZkU0Rmd3UDRUZHk5Zk03d1FaR2dIQ3QyTEZLT0k5U2ZnWTRtT2tNZTBKWW90RWx3bTFWTXJCQll4UUpDeXYyODVzcHYyTUFWcHlYaUVMc2t4SkRtQ0RGd0lJNG5Fc2lSZnhCakFPYlk1YTNxNnVxY0ZpVnVPWWxFQ1NWU2oyakZoM2FLbVFYZTljQjRxaXY0UnU3RHZkU0ZIT21iQ1ZObmNtQ05vUkVJeFltZEh5WGwzR0tNUGVPa2JEc1E0empRZjJFTGFh","upper_bound":"dkR5YzU3MkpQTlNNTnpiVms3VldZbWI5blZsSjFDQ3dGRGlPNUNXeUNaa0tRTVJ5Z2xyY1lSd1d3WDZwRUpwY0NkbnVoQnRwRHhiM3dMdkhoNmRrNnpGdWd4TVY5UEdseDZQZHl4QTE2eUxZRlptU05yUWF4Q1ZDcmhHSzdUVzZmM003dkVvalpVejVOOGNhQk9EMTVWSEF6T29KemhZZmNBOFhBeWVLS0xRSzh1dm91bkRCZDAxZW1LVkVJaVEyQUJTY0lhY1ZtUEFrUXVTUmpWZlhYNXZ0V2luU1BMZmJpaHIzNjhzUVhCZEtCUGE1TVlLaW9sQ2Q2bm5nSDd2Y0FBVkltZldndFZ1bjFYVEhkNkhpRUZSRWV2M0JCekhmbHprcUZIN2tr","repeats":1},{"count":1875,"lower_bound":"dkhHV3lyaFBWcE10U3NXamtLckVtYzlLeWFJaGVjY051empQUFpkb2VkWUJNS0FvOW9OUGZUU25va2U2Q21COUlyeWZkQzV4NXBFT3lva29lYUNwNTBQcW82dllZM2ZWdWFRV2NpWko4dFhQSHQzeWhKRWl3Y0hhbHMzWTN6NTVXaFlSNURIWE84VGxIeHNlVnh1d2M0VmVPemZCMVVoNXhCdjBPQXc1UlRhZmFCV0xvekNORmg5SFYwTFpUWGtKWkxhNVU0QzJTd3FrUGpVS1llNEpKSUh6MDF3a2J4NUtJS1kwVWthc0M3NkF6U0tzakplV3MxeVVjU1dVNnZMaUR6cGdLaFlVaVRjYjJtMjNqTmxDY1RUNFFDSlVVdEtHa3h1eHNSVFdtcnJ0RDVVU3UwSExNN1pPcnVITzVxWlpsclhqcDhrMEwzRm5WajN3SnpSeTB1bVdIMURDR3IzS3pyQXBRNThVaEtPc0hnQk9Lb0t2dE0zeHpRdVZmNzNNRlVydXpYQUJrMmhONXpjSk9DQmxENFhVaUFpR3RNc2gxZEFIaUJyUmJ4OHBvZ0o3WkJibg==","upper_bound":"dlN3ZG9PQ29uWkJPTVh3bnlBR2xxaUhiMFdyWEJWUEdJQ0tOT0xLU2U3MGdrbmRIYldtUnc4RTFvVWlwTTZIb25ZbFdKZWRu","repeats":1},{"count":1883,"lower_bound":"dlV6VFBVZmptZDl0NGhnZEdmNkhCd2l5TjRadjVqdVpsMEFWQmpWQzl3Q3lmcGNWZ2thT2RlZ2VXYklGSjRJTFdPVkQ5UVF3WG5lb25tcjhZWXRSTEZOcmNnckZrenQxME15aENId3czZTlmM2VzUEtlY2I4dFhaQjZ5bXNMWG9zVW11ZzZLckl6RGRqRWpjM1NBN2RPdXRPNjhzYmtlYjJ0RDJDbGNLNXpmV2Y5ZTFBNGlxNlhsUDNoRXFSUFZPRWdCZHYyd3ZTTGFUSVZEVFB0REpzMW9Yc1hzU0xlTUl5TEdZM3I3UmdMTFZZSDNYZlBBSG1oeWNqQkZROHNYRFFiM2dueVNTT0JoZ0RrUHB0Tk1sUTVINzI3WFVvWTVPMGZhcGFoWkJzUVNRNTQ1M29ka0xMc21SUHBoZEp5Nko4MVNxM3I2NGJwTUlPSThzMGpFa1lJb1RvZjEyUHJHMTd5SGZJcWR0NGFBQVVnQ2Z0c004SDBPTkRqOXVGcW5nQkhZZVVONjRxUG14WkM1RmRGdnVtNVZqaTEyQnN2d2ZSbkhzNWxKMDZTa1FNWURWRnJHa0pYWWtrdnNuMFB4dDBBaWptYWdSWXlpRDRoMERjV2xsUGZaZ0RYa3Nldkd6U2xVUnFZSDN1RHB1d1BYbXp5MTR4Sk9FYWZFbg==","upper_bound":"dmR6Tjg4ek1JZVpLWXpWeENFS3UwWVJQb1FnNDVXM2RvdFE4WkJ2Y3dweXExWkl2MThxVWU5VnBaQThpeEVpbGluZ05idWtxNjVEcGJ1ODB6WlBzb0tRS0NvaE1KNnRpTEM0SjZRQ3ZJQUh0QTAxYTRVME83cGFHWVZlQjhmc3dVV05ybWwwRTl5VHkzY0RWS3dhRWhnRFBlVnFhdU1RaG9ZeklVcnRZak53MWRxSUFvd3p0cGlETTlXSUhQRzQxRlUxMWZJYlJYY3d0NGFGcEx3QjdhRmJRcjFTOE1lVnJjbEd3Um5Yc1FOZ1UySlFGaXI=","repeats":1},{"count":1891,"lower_bound":"dmY0eXFTMFlZc1pQdXFqRDFPVGRkUnFNVUlRU2dQQzBXSjJON1o5SGRkYldHVkgyWHZwNHpvQkFDTjdFbFZwNGJibURrRG5IVlNaaHFDREdCMVJ0MHlmRFVIOGgxRjl6NEl3azI5YkxqWXdxeXZ5Y1A3THd6VGtudFZSTVV5TUxmT092Ukt2OURucnpsVHBmZXp1NFEwWDdxNnVkbTNvV0VVMXRwenBQaDRaeHBzd2t2blJaMkdvaG54M3puSXhQb3JPZEc1ZDAyc3I4RUloc3BTcVBMWGRhQnFBQjlxNkxMNHRMSWRoOGpSc3V3VUFPc1FORzFHaGtxeUVrdjQwOEtRYVMxSmszU0ZLYzNwNWFaSDlMOHRkUFJJb1lSck8xSGVXY29teTd1TUVBQldTb2xLWldVbm9HbUVnM1RMZFVTbmxMVXhvRVlMTUNpckFKSEllMEhROHk0azczZHI0NU1uQlpaUWxzbVJJVGY=","upper_bound":"d0JFTlUwTUhsZW52M1AwTHBHQkVWUm11QzRCQnJsZEI0dGhPZlV3dDQ3V0FTN2RnZVU2U2pzZVdDSUhMa1Rla3RqNnR2N2JDV3c5WFlaRUEwWHc1eXJtSnZ1MWJDYnd3eUFGMFpFWWE3NXFMSXFVTWdpRnpVelFxb1l2MFczM1BLU0lWdmhiUGY3MjFzdDJIbERUNVZTR1l5M2NZR2tzb0F5VUdUOWNkb0Y3U2hJUlJZOXVqZW9PZ1d2RlZ3dFdsSmR1OW5NVkZRVEpiNXV2OVFVNUNVdXpPcXlyY3lQenZiZVhveDBlR1U1cU9zeHlKQWYwUmJBaEZubHA2TjFoT0Q5YkxSZ3JzSzM4UUFRMUZpZFkyMnd0SWlrTDg3aTVKUDBjZWFaajI2Y0pNS0Rpa3pSclloeE51MU5kQ29rZkhQakh4SXNicnNkRkdScDkwOEZ5ZUxGQ1Q1Y05JaDRkYkJaTEhnQkhlQ21McDNlb2tXcGRDbUdlbDh1TWVUY3FQMkxNeHZ6ZGdXR1NKdktJMUIyd09HcnZ1OEVQeE1TSmQ4V1VacEZTMGl1Z3NzYTJOTk1OTTBqcmJIYWppVDZib1NNUzV2NTJaUEtDMkdKQ0ZOdm9ua1hFYXNtbmxseFZjRWxIMg==","repeats":1},{"count":1899,"lower_bound":"d1g5bzE1bzFtZHBsZUdLTUM5ZXoyamx4TDRqenVSZmZ0STNPcEU4ZHUzSWVySEpuOWNGQ2I5a3M1NWo3ZlN4SnN3Uk02dHdjWG56R0F2b1IzZHRhSG9hem5DNGhoTXFud2hhMFNHcnN4c1RYU3hCZVVvZGMzdUdueFZ2MHNjN3BOd1ZhOGNmS2Z1RUJOaXRIa3pHMnJwYzNZdkVnelZWOUdEOVVKWEphY0I=","upper_bound":"d2pvWk02Q2d2akZ1MGJzVEdYdGZQWThtVmR6cUZUd29SQmJjQlFYZkU1bzVCQ2JzZjZvRFRWZ3V5ZzZhZGkzcjJ2bDRHWlVBOGFxV3BjRXR5d3BDVDVZZTlDNzRvdzRYT3VrZHNMcGU1V3huOHhtZ0QwNEtvQzduY2lWUjViRmlzTTM4OXBFdjJhM2M3THlmV1BXUTVpMVhyWlRjcmFQRnU5aG9DUXZjcDgzTllhU0JSSWo1dllTRUVpU3lidlRhM2sweHJ4bTBYZTM1MTQyTGI2elBKOWRHdFZYSTVjMnVxcUdyMHNyZm11UHBhNU5pdGxCRVp0WWQwbnNyMmZ5UVY1SzlBc3JRRzU3MWtHR3dvaG83Y1huUmFFYWFNR0NMV2NQeldSZEkxV2xpQXY1RWtKT1M1VTZPOVUzYlRDU1dIN1RJY3dXV1UybjBxNFJQd3JGTmR2OFFLUnVFOFFvQ2xDUFhuMFpCOEg0aGhrOGk1M0Vod3FOMGpDTFlSODk2MENrM0NmTkRhZGkxbFN1Q3RUYjA0Zmg3WGJWcmNFTVMxQ0tVZkU0VG5PeDVTNnB6QVZDTGg3ekpFU25jTm5icVpmak54TTZabkdINE5YbjZiamF6SUxnYmU0U2lycFVWTlpMVzZQVkVkZWZheHI4T1Z2UmZYbEExb05weU9EeFY2YUpFbVcwcGxOb0QxY2hZb1FMemd4bEJD","repeats":1},{"count":1907,"lower_bound":"d2xQV1hSaWNhRDd1NmRoVDNZaGs5Wm5RQlA3MjFJeTduTVk3WmR1RXQ3UmJXaVY0OTVNOEttdXFSa0RCUUVLR2dBMXFZdWY2WmhhSkhaZlRMdVpPSDZPdWhycEpIaUZHRmRiVnA3SkZDUEkxS0psY09tam1peUFwUk1NWWJnZFE3VnRmTE5wM0JlU2doVTVEZDZRVDNKUFVjUmxWbTNsQVZ0TzVMWTZoaVgzZDFjWDZKWjJ5SkczU0I3dTNZZG9iMFFod0hBMXdvY001cTJubTFKUkJmMUd4VGhTVDhOZFZHSjNxUQ==","upper_bound":"d3dJWUx0Z1F0T2xRSmtaT3RtYk56NVR4MmtYNnVwcDFiSzRNQThUbmM3VnIydXd6a3EwaTdSWXlLaUpmSmN0NWNIenB6azgxRVhLMUVwTkU3ODc4emY2Wkl3Tk1NN1dDUG80RHlhVjhWV29pMnpVaUlrVURzbnBUMVBuMU9mSDhGT3hCOGVBdTRpSncwOGtXWDZwYWJpSUM2c29FVUloQlVGSmxSSlFFbFRxQ3dKbXZNNmxoM0xFcHZRd1A2Vmp4cGxoM3Y0M1BpMnZ5TWxxV3ZaYzdyMnl6SzBjNGlqMkI0RnNhVTRnQzExR2x6UXZtdXdBT1lRY01pWHR2RWp1UXJHUWtxT2drUE9LUTBnRjBMQVZHU0hZdmg=","repeats":1},{"count":1915,"lower_bound":"d3dvczdCbVpwblpZMWJXdzVPcVhqS1l0Y0FhT01BRGNjYUpJeTRkcWtFb0VnU3JjazV1dGFyckxhQlpMek5nY2R1dXgzdkRUOEZmNGxlYld1RWFwajVXZFBuaTAxc1BDZzI5NUJucnFWTTN1dGNYb3FVQnpiWTVabXR0Zk9zMExoUW10T1RJb2Y2UEc5bGRCN1VTblFiRVB3SHNUU293NnFCTm1YaHJFWmZnYkZzUHA=","upper_bound":"eEJxUExuaXpKR2tPVjM0VTg0RDlnN0lZVE9ycA==","repeats":1},{"count":1923,"lower_bound":"eENRRGNLdXhjeHNSSkh0dWNwSlg2UzNuV0Rua0dqMURUemZzd2tJV2pvcGprMHBxd3pDdnBiNVd4bjRZbTFicnY=","upper_bound":"eEY=","repeats":1},{"count":1931,"lower_bound":"eEZBcHFreUNWVHEzcGFCMmhwdDJHWVNLdHJ1WGpTWjNwTlZHQU1GNEh2RUxZM2o2anQ0SnRBY3BaOFg1Smp4MjYwa3dsNXFwU1dKUXhWV1ZyREJueUVMd2ZuQ3N4U0xyS0tFenVSbUlyZ2RCaGhSMElqd256YWZhaWd6Y0oxQ1lMQjJ2UXAzTGdRelNtVW40TW9MQU5sU0dvbFdMS1paRnpUR0dCcklVYkRTSFVJaFphcTBKSjB0NmRoUkY4c0N2U0k3ZXh2VnEwQlJmNkhCYnRzNXNDSDVoQzBSRFgyMFVPMzA1ZVJoc3ZNanN5SGlNUUh6Tk40WU1VYTBpeTcxOEQ1cUpqa1c0SXJnRzN3UWJnSkM1QWRFc0gwVHdvNVVyMDdzTVhUMjhVVzhoSnRzN3pRMVhBYml0VURqd21vRTZSTGVpWGs5V3FWNE1Wa0pkR1Y1dXJ5MmpHMlprRzBUbHM2TU14eWxQeDdWRm1ZUWtWRnhiQ0tReXk3OFZINTR1QWFsZWNtRU9WRVFPWkVBU3NQWFM4OHN6MWFCRjZxYjlsbExsSXVNd2I2b2lndndnM0trR3F6Y3JPd1llaDFmV2lQeE9SNjVsMA==","upper_bound":"eHFIR1AwNmhPMHl1bXUxdVB1bGl5cTV3YjJRUVZBZW1ob0JCS05TQ2w2cVFTaGw3bmtwS0pMaVVoSmJtYWZGTE1naU1SOHgzZjVXaHc0TEd6NFhjOGdOZzgyYVNSaW5ZVzlZM3h3UEJSY0pVeVlPS0Q1NzBaYXZNQ2FrbHJkQjhmeXoyV0tTQVpsV0hHY3V4T1VHbHZEekpBTGRJb1ozbFZnYnZrZmRSdHRYVGdnWHNSdlZvNTl3Y0l4WE1sTHhsWW5hYUFrV2EzVVNRZ01sUzJ1MjhIa1FweTl0ME82TWtMTFkzNjhRSGR3bXVkOEVzdUt2ZU52WFJWOFVVYTRhVnlLOE5Tc2Q=","repeats":1},{"count":1939,"lower_bound":"eHZub3RuUU5IQTR5QWR2WjQ5NVNhMlhQOFRzcTNuY3hac3E2eUpuOVdMMkdTUGJGa1dsMTZnQUlzSXM0YlY5OUF3Ynk5eWZGeTl1Z2h3djgwUzQzcEtIZEhzMDN4R1p1M3BiaDE2a2NyYjdTY2ZSZ2QzM3RCYU5wdjNtUzF2cmM1T1UwMVV3ZzBtTmZ0Q3Bjd1pmUmpCMlRyQnUwWmt1R1hoM3NkRU1ZcmxyVzYzWEczSjhha2VYS1lKZHJWNlBjRWtlT0xSZjhwQjdKaDl3MUtFZHRQOFBnUmFtWFJSUVc3eWVBdHoxN1pzU3BOWXZobGE0UFZ0d3IzeDBkTW9QV2c3Z0x6U0s4UFhQZ0lXVHMwalZ3NVZuY3lNa1lvRGxNNEVickR6ek1UNVdOTk9VbkdCS0RXYjF0cHFJZ1pEdERlMDNkWGZsaWMzeUdlUTMxVDZlQmhDRWtXV1Q4dzlUREtqcldRWUptWTM3TnZQaU1CbVE5bFdONUJNaElQRXdmS3R0bmNoZUVOdnRocm5SeWxRazBCVG5YSHMxQ0pmWVRycEJ0eTY2OG9nbmV1S2dWeFdRb3JJZ1RIT0tsV29WZERQTktTVnNIOWVRdTI1b0FCekdPZ2VIQW1jS0dSN2lUbWg1MDBMbTl0VXVyMm1BWVpWTjZMT0htT3lIaFc=","upper_bound":"eTk2OW9TcmR1NGtPYWtvejU5V3pPWGNlS3BUUHJJWDR3cXhTSU1rZlJwUG9FQklKSG5XbW5FcVQ0UElSNDZnOXhmbnQ4dkdONVIyb0hTTHIzVEVRaHpQRlRySTRQMGMyR216a1hUWU50NGRoU3RLTlhZZUFZYUdJTnRBWGNpNjI0VlI1Z1RuVXR3bkVkTW0zTTlSS2p6YW05ekhHdHRCb0t4YUl1TXNSdW1zaDFUMnl1RXlCSXB3MjE0TGt5Mm1UUE0zblZ3ZTd3bEJGODlpbFViVUx5RUZjNlFjbWZFdkRhQmtOeVVVRzhjQk0=","repeats":1},{"count":1947,"lower_bound":"eTlBd2ZLc0ZGYng4cE1lbjg1YVdORnZ3MVNuS1hDSFdMblZ3bmRmME5RVGZUMXhXNjUwN2hnVHpHZnYxVzBpaGhaV2dqa2d4ejk1TlBLOEtGUnNIc2tWaGRyaUZ6WVZaMmZjRWFWVktDcFFhVzI5VU0zcmMwejVMQWJKUGdWRjNHZW5uZ2swTGhFamdBRVRYenM1ZHNQaGlxalhOdWp5SlA3cFh6c3R5S3BzaHBlMmdkM1NBRng0Y0RZbGswajY0MkVqb01aaGppOFJnTVN2eThmMDJ4SFJTYXpNM1gzZFpPZ2xnRXR4WmFOZ1A1WEJuS2pkaVByNWpnWkk2Z3ZiTzR3c3pKWDBNQUZFdHZOQlg5QTFuY3NGZXVxS3RjU3B2MFZJYmE4VkwweThUaFY0dGxIRWdsMkJNOHB4T3BQUFNxcUJCOWI3eFFUT3pMN3pSVnhNWnNHR2JFRzZGdDM4UHBqSzk2VVBUb1E3S3hXZkx2Q0N1T0RuUjhSYkxrZGhFMHFXbDh3eDhtY1FMRFVsOUdNOA==","upper_bound":"eVBkNDEyNmlwR0IzNktNYW5zcXMybFM2UEEyalN1cElXazNXcFhNdUg4b25Rak9pTG56Q3U0VTRjdGh0U1kwRUNGYkI5dm5hYm5sSFNucThtSE9HSnliVDBTeDRFb0p5UjVDUmNaMG8=","repeats":1},{"count":1955,"lower_bound":"eVFGQzdTQ2xWeTY4VWNqT3BiUE9GcUFIbXNvZFhPREY2aTU4OWd5OEt1dVpob0RVNEZsWXNxSlRtbjh4ekdPYVV2QXZIZnZ5bHVHRTU4eUFPVHZ0aHRNck50Q0M2Y1htVTFkdEpBSnFMWGpRMWlMUFFBNWdscTIyM3lhNHZZWnM3V2M5Ym80SkhwYjN0OFN3NWp2dENvVDdvUEJQSUdaeXA1WFBidDhNUnlLRjB6ZDRK","upper_bound":"eVZPY3pUR2R0Nk1HT21IeU4xR2xrWkFYWG02YloyRTJueUUzRFc4TmhJVEFsOWtZNkdYTzlQbVV3MmcwcXBqZjdVRjNGQ3FPc3lUdEpod3QxTG9XT21wRmk2YWtYNGdiRjZZU0YzUURQajh1blFnZzEwbEZRb1F1ZUx6NEtZOHp1WHYwcGcyVnlqMEh2STlNUHNmdnp4Z0dIa2lhT0RLYjF5djdibEtzS2d4alYzelJGbENmd3psaDBiT1pMNHBxS2NDa2xOQWFJajRhUFRhSHdJT0VlVEFBQXJ4cDMwaVA2cm1IazhtWlFZV2ZHU2phVm9oVWV1MmtZcUN5NGNpdEE5YzBQUWxGT0JsdngyQ0ozSXVrbTQ0OHF3ZG1hZ0g5ZWpPbjVxWmw4WGxmN1FNb3psMjVGVEYzcWVqUWlGSHJBcndtUWdMN1JXczVnN2RpUGVYWmdtN2JPMWl0dFVRVFVLOEp0MFd0b1NwcnpJenRoTWxNUks4RlV3VTJNM0xwcVdGN2RPWnNNOWJtUGZXNUs4OWQ5OXVvcWtvdzZyTnFLUXhta05QSUgwalRDSkhuZE96b1lESG5NNGJxZ295Y2lkV3JmZzNsek1ONm41ZHFuSElEaWUzUnlWVm9iRHBzQnRXOUlSdjlLazllRExMam1vWG8xcTFCYzMyOWN5bEFBbm5YenZOOG12TGV1cVZyS2Z3blNpS3JteDVyWURZcklZd2U=","repeats":1},{"count":1963,"lower_bound":"eVhJbUlNczZlcG5QN09YTg==","upper_bound":"eWhIQmc5Z2pyOEZJbktBN0FhTFpUbmd2bXd5M1h0dEVNemplQmRIaWlTcGZJU1VYelNwNlVYUVZkdHRyd0s3YXBPYkFoTzVYZ1hzeU5WcnJWV2NhRW5ST210bUtVMFgwYkV1Wnc0RWNURkdVTTk3Uk1lSmJRQUNKSHZrOVZFejlEUE5UbFltTFFwN0plM3NOQWRxN1FtVFQ3d3p4ak1TZW5PU2NzdEFXQ2NVRnMzczBldEVUd0oxNURkb0JqSmhTT3R5aU9QOWd0emN6djVKcHhtb0V0QXkyQlFLOGM2VVZldGRPUGJCZml0TmlXRFViUThTTVphcDlkS1pENm9FZ3pQVU0zWXhtc1NMbGRJb2tDbTdHWQ==","repeats":1},{"count":1971,"lower_bound":"eW1Hcm5jeXRiZloyakpJRGFIdDFKYlNDY1lLUHBkbEh1OU1zOE1EYlNHSEpzYnRCTkZHNkxUT1F5czhBckkxbGhaUXJDUFJEYXJCdVBxQk5zODNleFBuNldNTTBmRjVqZ28xclNhYWM4R2lzQ25GVk1kRmNNczBXVFlKMWxXSTd3TUdGV1JManYyQWpOMmt3SjFEVmZoQVZmV1I2cUFZNUtkWlZrVnpwRU9IVThTcHVGWDFsdWdkMW1HaFR3WnZiVndmQXFiRWJjYU9hYnROWFlVMVp3VW1TSVBzdWthUWdDMGhjSWtqaDdjbnhvZE10T3lXME82Y3k3MlNpQzI1NmNEQU9QWEJ3cEptUVVWUGFYbXBtRDZ4YzVvTGJ2bEl6YjhjQnZnRkI0NmhPOWpuaGp4WEFwbVZja2Fic0tqZks0NHJ0QlBHUjRmUVkzdHNiR1lvcEJSam1GRDRiYkNsOFJQem1hdEZodFZtWlFDOUZuNFdsajlsYnRlMWhWSjZodGhwYXZCY0s2M2l3OG9KWEZyMFB0ckFJOE00WHV0akJoSzZCa2ZJREQ=","upper_bound":"ejZjSEk3WVdJS25JY0lNc2NOT2Y5dFd4elRDTERoWVFnUnJhRVkza0I2NE1BdWdlNXRhalp6eERqSEw0dkw4WEJEVnFTT0FkNkI1ZDBBNzl6Y2pBaEJkZTdDZXBrR2dxZnFyaUk2UjZVbk8yVzduRWNsQzVmVXdVR25kOWZxbjQ2WFZDM1p4MThFRUZMa0UwWkZVNE9WZmx1blplOEVQYlV0NUpLbg==","repeats":1},{"count":1979,"lower_bound":"ejhYbG52V3c4eUw2TG1tZUVrWmpvd1o5cVZ5ZkpUZGdERGhJWUthQ1cwSUROQ1hKOGVudXU3VUMwanRaaGc3UWVZM045WGV1eUlVZ2l2ZE9CV1lBMHFoaTJ0WWF6NEhTcjRySWtxN3JENjVzTzQ2NHBtWGpTcm5lZVhnamZ2YlVpWW9xQkM5T1FkdW9rcnJleVQ0bWoxaXBJYld5Rmo4cjE1VkE2","upper_bound":"ek5MRks5WVh6enpXemJueTlucVgyRVVGZnFzZE1qWWRGR3JqNnFqVWI3QUllY20xbkM3aFJIMzQ0aVhNYXplOEtMcGt2VjdWZFBCajFocXlPU3lmTktUM1hlWmdKRUxvbUhSdmhDNTNTR2lwMGY3WHVp","repeats":1},{"count":1987,"lower_bound":"elFGZmdqbmxPeUxCcklzczc4R2ZlUWxCbmtMY0hOVk4wenF0emZhaVF2OVQ0RGt6OHA4eW5xdGx0RUtiT3ZUSE5IeHJ2Qng2OUZPck9GMzdLZ0xFYVZ4aHFlZVpLWXp4TE9xd1M3Q0JYcENJbzByeFRqdGZQOUhjTHE0U3hBNEtjY0hJWUVxOTlYbFpiQ2hkV0RXaHBORXoxUEE5aGRyd1ZidUhKblZPcHFXTnFwYnNiTnNZUzZyQjlWY3oyMUJ6dVg2YTg1b2gyV0tVSE9HbXdqakIzTm9NZ3dVSXBsSlpCRkt3OGVESlRvY3paUQ==","upper_bound":"elpmWXdsOVdjS1hIeE85OWxWb0tXZTVJUVh1R1RyM3VCQjR2Y0gza1pwaWRsdTlJdkFkSmg5a2lGMnJTbGF3ZkFiVkRGS1VFcGczMzhtUjlsZ09oY3prUUZZckVYcmluUURZcHlsNXBVM09DWm9udDZLMTc4ZkRMUVlEeHlWSkt0YkkxSnZQWTY2OHFoN2RTZmlnb0dpYzhGU0E2ZkJwMUFzUTRLZnlEOTBGbkF5NWFReWk2MVpnT0JETVZ5b2JtdDRXbWE4TG1VdDE4S2t2MkxCUzJ4UTBrWm1MZmp6N2NWN0NSZlJIamY5N25wWGRjaW5YSkVmbldhSFNVOFhCRXBWZ0gwdFdxUkdzVWxTRGF3MUo1RVhZTlRMOVNCUmxqVEkwUWUxaFFnTVd5MUhZMWwzNGtXR3VQN0pwbGV6UkZXMzg5anRKWDBWUlJqd1hHN0ozN25vY2NiaE9nd3FoeEJVbXBWWFQ0NzkxYTdBT2daaVlPMlJnRmxkczNFQW9sYUJlZXJoa1ZZTHJrRkpxVGZRYUpsV1VlY1dRN2N1UE1BNE5oR1hQOE9JTm41ZGc1","repeats":1},{"count":1995,"lower_bound":"empWcnJPTE9TcGFYRWdoa3E3UHdSZlZuRHpTaWJQR3JidlNNSm0weThsY0EzYThYR2QzeGZrcFF3V1VOcktpT1FYTjJ0S3FBY0JDM2hWcUt0bFpNZXlWZzBiUVhhZWNUbjRjblBwbXdnelZGczNJbWJoMGRGN2NkWHdBWGRvT1VYSUdTVW8yOVFJSFd6WW0=","upper_bound":"enZWcld6enljblF3bXNHcEwydmZSVUhzZjBDdm9PRkt2SDB3cFBWY2QxNG9ZTEt1cXhLQWtHcUxtMzROS0E5VGRJNDlPSk40S2o0dUwzQWRrS3puUWQzQmFJRkN0VFdvdDdjdk1UWUVURlFBR3pob1BlbGZUejlaTnhvUXltbkZRSlJ4MkJFQzFWRXFNMGRPSnpmSFRM","repeats":1},{"count":1999,"lower_bound":"enhIc2FPRkFVWFN6eVNJRW5kRHUzbzBvUkw2T2NaNFlyTnp4Q0RDbEU3TWE1Y09vdFR1UkwxT3Bp","upper_bound":"enlQVjVsYzdrYkdLa0toRFlXVkxNdkpkZ0x2dWNuYkJOOUhYRWRTWWtiNnhhbndWejh6Rmg1ekhmWWhKbkVtNXFPd0Zja2tDRzlWM3oxYkVHSXFXN3hOOEFmMWFXeG45aHh3cmZFWWc4M2o1Y0RCaEpIYUJ4TnFZakxyN2hFb1JlMFZ5Q2pu","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,1,0,3,1,0,0,0,2,0,0,0,0,1,1,0,2,1,0,1,1,0,1,0,1,3,3,0,0,1,1,2,2,1,1,2,0,0,0,1,0,2,2,1,1,1,2,1,1,0,0,0,0,1,2,0,2,0,0,0,0,2,2,0,1,1,1,0,2,0,0,0,0,0,1,0,3,1,0,0,1,0,0,2,2,0,0,0,1,1,0,0,2,1,1,0,1,0,0,1,0,0,4,2,0,1,0,1,1,2,0,1,1,0,1,2,0,0,1,2,0,1,1,0,1,1,0,0,1,0,1,1,0,1,1,2,0,1,1,0,1,1,0,0,3,0,2,0,0,3,2,0,1,4,3,3,1,2,1,1,1,2,0,1,2,2,3,0,1,1,0,5,1,1,0,0,1,0,2,1,3,1,1,1,1,2,0,0,1,2,1,1,3,0,1,1,1,2,0,0,2,0,2,0,1,6,2,0,2,1,2,0,1,1,2,3,1,2,1,1,1,2,0,2,0,1,2,0,2,1,1,1,0,0,1,4,0,1,1,0,1,2,1,0,1,3,1,0,2,2,1,0,1,1,2,0,1,5,2,2,0,1,1,2,0,1,0,1,2,0,5,1,0,1,1,0,0,0,0,0,1,1,0,1,1,1,0,2,0,0,1,1,1,2,1,2,0,1,1,1,1,1,0,2,1,0,0,0,2,2,0,2,0,0,0,3,0,2,1,1,1,2,3,0,1,2,0,1,0,2,2,1,1,1,0,1,2,1,1,1,0,1,1,1,0,0,0,1,1,0,1,1,0,2,2,1,1,2,0,1,3,0,1,0,1,0,2,1,1,0,1,1,1,1,2,3,2,3,1,0,1,3,0,1,1,0,2,1,0,1,2,3,2,0,2,1,0,1,0,1,3,1,3,0,1,1,2,1,1,3,2,1,2,0,1,1,0,3,2,1,2,2,1,0,2,3,2,1,1,2,1,0,3,2,1,1,1,3,0,2,1,0,2,0,2,1,0,0,1,1,2,1,1,1,3,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,2,0,1,0,2,0,2,1,1,0,1,0,0,2,1,4,0,1,0,1,0,0,0,1,2,1,0,1,1,0,2,0,1,5,0,4,1,0,1,2,1,1,1,0,0,5,1,2,3,1,1,2,2,0,0,1,3,0,1,0,0,1,2,0,1,1,4,3,1,1,2,1,0,1,1,0,0,1,2,3,1,2,0,3,2,2,3,0,2,1,1,2,1,0,2,1,2,3,1,2,0,0,0,0,1,0,1,0,0,1,1,1,1,4,1,2,1,0,0,3,0,0,0,1,1,1,1,1,1,0,0,2,1,0,1,2,0,2,2,0,1,1,1,2,0,0,2,2,1,1,3,3,1,0,0,0,1,1,0,0,1,1,1,0,1,0,0,1,2,0,1,1,2,1,0,0,0,1,1,0,0,0,1,0,2,2,1,1,1,1,1,3,1,2,1,0,0,0,2,0,4,1,1,2,1,2,1,1,1,0,0,0,1,1,1,2,1,2,0,1,0,0,0,0,1,0,1,1,0,1,1,1,0,2,1,0,0,1,0,1,2,0,1,1,0,2,2,0,1,3,2,3,1,1,0,0,1,2,2,0,1,1,1,0,2,1,0,0,1,1,0,1,0,0,0,2,2,3,1,2,1,1,1,0,1,0,1,0,2,0,0,1,2,1,1,0,0,1,0,0,3,0,1,0,0,1,0,0,1,1,0,1,1,0,2,1,1,1,0,1,0,3,4,0,0,3,0,0,1,0,0,1,3,1,0,0,2,0,2,1,1,1,0,3,2,1,2,2,0,0,0,1,1,0,1,1,2,0,0,2,0,0,0,0,1,2,2,0,0,1,1,2,1,1,3,0,2,3,1,0,0,0,1,1,0,0,1,4,2,1,2,1,1,2,0,0,0,1,0,0,1,3,0,0,1,2,2,0,0,1,3,0,1,2,1,2,0,2,1,1,0,0,2,3,0,3,1,1,0,1,2,2,2,0,0,0,1,2,1,1,0,0,1,0,0,1,1,1,0,2,2,3,0,3,1,0,1,0,1,0,0,2,0,2,0,1,0,0,1,3,1,1,2,0,3,2,0,0,3,1,1,0,1,3,0,1,1,1,0,0,1,0,0,2,1,1,1,2,0,0,0,1,2,2,0,0,0,0,1,2,0,0,2,1,0,0,1,0,0,2,1,2,1,0,0,1,1,1,2,1,0,1,0,1,1,1,1,1,1,1,0,1,2,0,1,1,1,2,4,0,1,0,2,1,1,0,1,1,0,4,3,1,0,0,0,1,1,0,2,1,2,1,2,1,0,3,1,1,2,1,2,1,0,0,1,0,1,1,0,3,2,0,0,0,3,1,0,0,0,1,2,0,2,2,1,1,0,1,0,0,0,0,2,4,1,1,0,1,1,1,2,2,1,0,1,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,2,2,0,0,0,1,1,2,0,1,1,1,2,0,1,0,0,0,0,4,2,1,0,0,0,1,0,0,1,1,0,1,0,0,0,0,1,3,1,3,1,0,1,0,0,1,0,2,1,0,1,0,1,0,0,0,0,1,2,1,0,1,0,1,0,4,0,1,0,0,2,0,0,1,1,0,0,2,0,1,3,1,1,2,0,0,3,3,1,1,0,0,0,0,1,3,1,0,0,0,2,1,1,3,2,2,1,1,3,0,0,3,0,0,1,2,0,2,0,0,0,1,3,0,2,1,1,2,1,1,0,1,4,0,1,0,1,1,1,1,3,1,2,0,0,0,0,3,1,2,3,1,3,2,2,1,2,2,1,2,1,0,1,1,0,1,0,0,1,2,0,1,2,1,2,0,0,1,4,0,1,1,2,1,0,1,2,0,0,0,3,0,1,2,0,2,1,0,2,2,0,0,1,0,1,1,1,1,1,1,0,1,1,1,1,2,0,1,1,1,0,1,0,0,0,0,1,0,0,1,1,1,0,1,1,1,1,1,3,2,0,1,0,0,0,0,1,2,1,1,0,1,2,0,1,0,1,1,1,1,0,1,0,0,0,2,0,0,1,0,0,0,0,1,0,0,1,0,0,1,3,2,2,0,0,2,0,0,2,0,1,0,0,1,2,2,2,1,0,0,1,0,0,0,0,1,0,0,2,0,1,0,0,3,1,2,1,0,1,1,2,5,0,0,0,1,0,0,0,1,3,1,1,2,1,0,1,1,1,1,1,1,1,1,3,1,3,1,3,1,0,1,1,0,1,0,3,0,0,1,1,1,2,0,3,1,1,0,1,2,0,0,2,1,0,0,6,0,0,1,1,1,1,1,0,1,4,2,2,0,2,2,1,1,0,1,0,1,0,0,1,1,0,1,3,1,2,0,3,1,2,2,4,3,0,1,2,1,0,0,2,0,1,1,0,0,0,1,0,1,1,2,0,0,2,2,1,3,0,0,0,0,1,1,1,2,1,4,1,1,1,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,0,0,0,1,2,0,0,0,1,1,0,2,1,1,0,1,1,2,3,3,3,2,0,1,3,0,0,0,2,0,1,1,3,0,0,1,0,0,2,1,1,0,0,0,0,0,0,0,2,1,1,1,2,1,1,1,2,0,0,0,1,2,4,0,0,0,0,0,1,1,2,1,2,3,1,2,0,2,2,0,0,0,1,1,0,1,1,1,3,0,0,1,0,2,0,1,1,4,1,0,1,2,0,0,1,3,0,0,1,1,2,0,2,0,0,2,2,0,1,1,0,2,3,0,3,0,2,0,1,0,1,1,0,1,1,1,0,2,2,2,2,0,0,2,1,0,3,2,1,1,1,0,2,0,0,1,0,0,2,1,1,1,1,0,1,1,0,1,0,0,1,1,1,0,2,3,2,2,0,2,2,0,1,1,1,1,1,1,0,1,2,2,0,0,0,0,0,0,1,0,0,0,0,2,2,1,0,0,1,3,2,1,0,0,1,1,1,0,0,1,1,0,2,3,0,2,1,0,1,2,1,0,1,0,1,1,0,1,1,0,2,2,1,1,2,0,1,1,0,1,0,3,1,2,1,2,2,3,2,0,0,1,2,1,1,1,2,0,1,0,0,0,1,3,3,0,1,0,1,2,0,1,2,0,1,1,2,0,2,1,1,0,0,2,2,1,1,2,0,2,1,2,1,1,0,1,0,1,1,1,0,2,0,0,2,2,2,1,1,0,0,0,1,1,2,1,1,3,3,2,0,3,0,2,1,0,0,1,0,0,3,3,0,0,0,1,1,1,4,0,0,0,2,1,1,2,1,0,0,3,0,3,2,2,1,1,2,0,0,1,0,1,2,0,2,1,0,2,0,1,2,1,1,0,2,0,3,0,3,0,2,1,1,1,1,0,1,1,2,1,0,0,1,0,0,2,1,0,2,2,0,0,0,0,2,3,2,0,1,1,0,2,0,3,0,1,2,3,0,1,2,0,0,2,0,0,1,1,1,2,0,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,3,1,4]},{"counters":[0,1,2,2,0,1,1,0,1,0,2,0,0,0,2,2,0,0,1,1,1,6,1,0,1,0,0,0,2,0,0,1,2,1,0,2,1,1,3,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,1,2,0,0,1,0,2,2,0,1,1,2,1,2,1,0,2,3,1,3,0,2,1,0,0,1,1,2,0,3,1,1,1,2,1,1,4,0,2,0,1,0,2,2,1,0,0,0,0,1,2,0,0,1,0,2,3,0,0,0,1,0,1,0,2,1,0,2,0,3,1,1,0,1,3,1,0,1,0,0,0,0,1,3,0,0,1,0,2,0,0,1,3,2,2,0,2,1,1,0,0,0,1,0,1,1,1,0,0,2,1,0,3,0,1,2,3,2,1,3,0,1,1,0,1,2,0,3,3,1,0,0,1,3,0,1,0,1,1,2,0,2,0,0,1,2,2,2,1,0,3,3,1,2,2,0,0,0,0,2,1,0,0,1,1,1,0,1,0,2,1,1,3,1,4,2,0,2,1,2,3,0,2,1,2,0,1,1,2,1,0,0,1,0,2,2,1,2,1,0,0,0,2,0,2,0,1,2,0,0,3,0,1,1,2,0,0,2,0,1,1,3,3,0,2,0,1,2,0,0,3,2,3,2,0,1,0,1,4,0,4,2,0,0,2,2,0,1,1,0,1,0,0,1,1,1,4,0,1,0,2,1,0,0,0,0,1,1,1,0,1,1,3,0,0,0,2,0,2,0,2,0,2,1,2,0,0,3,1,0,0,1,0,1,0,0,1,2,0,1,2,1,1,0,0,0,1,2,3,2,3,0,0,2,1,1,3,0,1,2,1,0,0,0,2,0,1,1,2,0,4,0,1,1,2,0,1,0,2,1,2,0,0,1,2,3,0,0,0,1,1,3,0,0,1,1,0,0,0,2,0,1,2,1,1,1,2,1,0,4,1,0,0,2,2,1,2,1,1,2,0,2,0,2,3,1,1,2,2,0,2,0,0,4,0,0,1,0,1,0,0,4,2,1,0,1,2,0,1,0,2,2,1,2,1,1,1,4,1,1,2,1,2,0,0,1,0,1,2,0,0,0,1,0,0,2,0,4,0,2,0,1,0,2,2,1,1,2,1,2,2,1,0,0,1,1,2,0,1,0,0,0,0,1,1,2,1,1,0,0,2,0,1,1,1,1,0,0,1,0,1,0,1,1,0,1,2,1,3,1,0,1,1,0,1,2,0,0,1,1,0,0,0,1,1,1,2,2,2,0,1,1,0,2,1,0,0,2,2,2,0,3,1,0,0,0,0,3,3,1,4,3,1,0,2,1,0,3,1,0,3,2,0,0,0,1,2,3,1,3,0,0,1,1,2,2,0,0,2,1,1,2,0,0,1,2,2,0,1,3,1,0,1,1,0,2,1,0,2,2,0,0,1,1,2,0,1,1,0,1,2,1,2,1,0,0,0,1,2,0,0,2,0,4,1,1,2,1,1,1,1,1,2,1,1,0,0,2,2,0,2,1,3,0,1,2,0,0,0,2,1,0,1,0,1,0,0,4,0,0,0,1,0,1,2,1,1,1,2,0,1,1,0,2,0,2,0,2,0,2,2,0,1,2,0,2,0,0,3,0,1,2,0,1,2,1,2,1,1,0,0,1,1,2,2,0,1,0,0,2,1,0,1,0,0,0,1,4,0,1,1,2,2,0,0,0,0,1,0,2,1,0,0,0,0,2,2,3,2,0,1,2,2,1,2,0,1,0,0,0,4,1,1,1,3,1,2,2,1,0,0,0,1,0,0,0,0,4,0,2,3,0,1,1,1,0,0,1,0,1,0,2,1,1,0,1,0,1,0,2,0,0,2,0,1,0,0,1,2,1,3,0,1,2,0,0,2,2,0,1,0,0,0,1,0,2,0,2,2,1,0,1,0,0,0,1,0,0,1,0,2,0,2,1,2,2,1,3,0,1,0,1,2,1,1,0,0,1,0,0,0,2,0,2,2,0,0,1,1,1,4,3,0,0,1,2,2,1,1,1,1,2,0,0,0,0,0,1,1,3,2,0,1,2,1,1,0,2,2,0,1,3,2,0,2,1,1,1,1,1,0,2,2,1,0,3,0,1,1,0,2,0,2,2,0,0,1,2,1,0,2,1,1,1,1,1,1,1,0,0,0,2,1,1,0,0,0,1,1,1,0,1,1,1,0,3,1,2,3,0,2,1,0,2,1,1,0,1,1,1,2,0,1,1,1,1,0,0,0,2,1,0,0,1,1,3,1,0,2,0,0,1,0,0,0,0,1,2,0,0,2,1,0,0,0,0,1,4,1,1,2,0,0,0,1,2,1,2,0,2,1,0,0,1,4,1,1,1,2,1,1,1,2,0,1,0,1,0,0,1,2,2,1,1,0,0,4,1,1,0,2,0,0,1,2,4,1,1,1,1,1,5,2,1,2,2,1,0,1,0,3,2,2,1,1,2,2,0,0,0,4,0,2,0,2,1,0,1,0,1,1,2,1,0,0,1,1,0,1,0,1,0,1,0,2,1,0,2,1,0,0,1,1,1,0,2,1,0,0,0,2,0,1,0,1,1,0,1,0,2,1,1,0,1,0,0,0,1,1,0,4,1,2,1,3,6,1,1,0,1,5,0,1,0,1,0,0,2,1,1,1,0,0,0,1,0,0,0,0,2,1,2,1,1,2,0,1,1,0,4,2,1,2,0,0,0,5,1,3,2,0,0,0,1,3,1,4,3,1,2,1,3,3,0,1,1,1,0,1,1,0,2,1,0,3,2,2,2,1,2,1,0,3,1,0,2,0,0,1,1,1,0,1,2,2,1,1,0,3,0,0,3,2,0,0,1,1,1,1,2,0,1,0,3,0,1,0,2,2,2,1,1,2,0,1,2,2,1,1,0,1,3,2,4,1,0,2,1,0,1,4,0,0,2,3,1,1,0,2,2,1,0,0,1,0,0,1,2,0,0,0,1,1,0,0,0,1,2,2,1,1,0,1,0,0,1,2,1,0,0,0,1,2,0,0,0,1,0,0,0,0,1,1,2,0,0,0,1,1,1,0,1,0,1,0,0,0,1,0,2,2,0,0,1,1,0,1,0,1,2,1,1,1,1,0,0,1,0,0,0,0,1,2,0,1,0,2,3,2,0,0,0,1,0,0,0,0,2,1,3,0,2,1,0,1,0,0,3,1,1,0,0,1,2,1,1,3,0,1,1,2,0,1,1,0,0,2,2,1,1,0,0,2,0,0,2,0,1,0,0,1,1,0,1,0,0,1,1,0,1,1,3,1,0,0,2,2,1,1,2,0,0,1,0,2,0,2,0,0,3,1,1,1,2,3,1,2,2,1,1,0,3,0,0,3,2,0,2,1,1,0,1,3,1,0,0,0,0,0,1,3,0,1,0,0,1,1,1,1,1,1,0,0,1,0,2,2,0,1,2,0,1,1,3,1,3,1,2,0,2,2,0,1,1,2,2,1,1,1,2,1,0,0,1,0,1,0,0,2,1,0,2,0,2,0,1,1,1,1,1,0,1,1,0,2,0,1,1,0,1,1,1,1,2,1,3,0,0,0,1,1,1,0,1,1,0,0,1,0,1,2,0,0,2,2,1,1,2,0,1,1,1,0,0,3,1,1,2,1,2,1,2,1,3,1,0,0,0,3,3,1,3,1,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,4,3,2,1,0,0,0,0,2,0,1,1,0,0,1,1,2,0,1,2,2,2,1,2,1,1,2,0,1,1,1,0,1,1,0,1,4,0,0,0,0,1,1,2,0,3,1,0,1,0,3,1,2,2,0,1,0,1,1,0,2,1,0,1,1,1,0,1,1,1,1,2,0,1,1,0,1,1,0,0,0,0,0,0,0,2,0,1,0,0,1,0,0,1,1,0,1,0,2,0,1,0,0,1,2,0,1,1,1,0,1,2,0,0,4,3,0,0,1,0,0,1,1,0,0,3,1,3,1,0,3,1,1,0,1,1,0,2,0,2,1,0,0,1,0,1,0,1,1,2,0,0,0,0,1,2,0,2,2,1,0,1,1,0,0,0,0,1,1,2,0,0,1,2,1,3,0,3,0,0,2,1,2,2,0,0,3,1,1,0,3,0,4,2,2,3,1,0,1,0,0,1,1,1,1,1,1,1,2,2,0,0,3,2,2,1,0,0,1,0,2,1,2,2,2,1,1,1,2,0,0,1,0,1,1,1,1,3,2,0,1,0,1,1,1,0,1,1,1,0,0,0,2,1,0,0,1,0,0,2,1,0,1,0,2,0,1,1,0,2,0,1,1,1,1,2,1,0,3,1,0,1,1,3,1,0,1,1,0,2,1,3,1,1,0,1,0,0,3,2,0,0,1,1,2,1,1,0,2,0,2,1,2,0,0,1,3,1,1,2,1,1,0,1,0,1,2,0,1,1,1,0,1,1,1,1,0,0,0,1,0,0,1,2,2,1,0,0,2,0,0,0,4,0,1,3,1,2,0,1,1,2,1,1,0,1,1,1,1,1,2,0,1,0,3,1,5,1,1,0,1,0,1,0,0,0,1,0,1,1,0,0,0]},{"counters":[0,1,1,1,1,2,1,2,0,1,1,1,2,1,2,1,0,1,1,1,2,0,1,1,1,1,1,2,1,0,0,0,2,1,0,1,2,0,3,1,2,2,0,2,0,1,1,1,0,1,1,1,1,3,3,3,1,0,0,1,0,0,2,0,1,1,0,1,1,3,0,0,2,1,2,1,3,2,0,0,1,2,0,3,1,0,2,1,1,0,0,0,1,2,1,1,1,0,3,2,3,0,0,3,2,0,2,0,2,1,1,1,1,2,2,0,1,2,2,0,3,0,0,0,0,0,0,1,4,1,0,2,0,1,3,1,1,0,1,1,1,2,0,0,0,1,0,0,1,0,1,0,2,1,0,1,2,0,0,1,0,1,0,1,0,4,1,0,0,0,1,0,1,1,2,3,0,1,1,1,0,0,0,1,1,4,0,0,0,2,3,1,2,0,1,7,2,1,0,0,0,3,0,1,2,1,1,2,0,2,0,0,1,1,0,0,2,0,1,1,1,0,2,0,0,1,0,2,0,1,2,2,0,4,0,2,1,0,2,2,0,3,0,0,4,2,2,1,1,3,1,0,3,1,1,1,1,2,0,1,2,2,0,1,1,1,0,2,1,0,0,1,0,2,1,0,3,2,1,0,1,1,2,0,1,0,1,0,1,2,1,1,1,1,0,1,1,2,0,0,0,2,1,0,0,1,1,2,0,1,1,1,1,1,1,2,1,1,0,0,0,3,1,0,2,0,0,0,1,2,0,0,1,3,0,0,1,3,0,0,1,0,2,1,1,3,2,0,3,2,2,0,1,0,3,2,4,0,1,1,0,1,1,0,0,1,0,2,0,1,0,1,0,1,3,5,1,1,1,2,1,0,1,3,0,0,1,1,1,1,2,1,2,1,0,0,1,1,0,2,1,0,2,0,0,1,0,0,1,0,2,1,0,2,0,1,0,1,1,0,0,1,3,1,0,0,1,2,2,0,0,0,0,1,0,1,0,0,1,2,0,1,1,2,1,1,1,0,0,1,2,1,1,0,2,0,1,1,3,1,1,0,1,2,0,1,1,2,2,0,1,0,3,0,0,1,0,0,1,1,0,0,1,2,1,2,0,0,2,1,0,1,2,0,1,0,3,3,4,1,0,2,0,2,1,0,2,1,2,2,0,0,1,1,2,2,0,0,0,2,1,1,1,2,1,0,1,1,2,0,3,1,0,3,1,0,0,1,1,2,0,1,1,0,3,0,3,1,0,0,1,0,1,0,1,3,2,2,1,0,1,1,1,1,0,1,2,0,1,0,1,0,2,1,4,0,0,2,0,2,0,0,0,0,0,1,0,1,2,2,0,0,2,1,2,3,0,2,1,1,1,0,1,2,1,0,1,1,0,2,2,0,1,2,0,0,1,4,1,0,1,0,4,1,0,0,1,2,1,0,1,1,1,0,0,1,1,2,1,0,1,2,1,0,0,1,1,1,1,1,1,1,1,1,1,1,0,2,1,0,1,0,1,2,0,1,2,3,1,0,1,1,2,0,1,0,0,2,0,0,0,2,0,4,4,1,1,1,0,0,0,1,1,0,1,0,0,0,2,0,0,3,1,0,2,0,0,0,2,0,2,1,1,2,3,0,1,0,0,0,2,1,0,0,2,1,0,1,0,2,3,1,0,0,3,1,0,2,1,1,1,2,0,2,1,0,2,1,0,1,1,2,1,0,0,2,2,0,1,1,1,1,0,1,2,2,1,2,2,1,0,2,1,1,1,1,0,1,1,0,0,1,0,0,2,0,1,0,0,0,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0,3,2,1,1,3,1,1,2,4,1,0,2,0,1,2,1,1,0,1,0,0,1,1,1,2,1,1,1,1,0,1,1,0,1,2,1,2,1,1,1,1,1,1,3,0,0,0,0,2,1,4,0,2,2,2,2,1,2,0,0,1,0,2,3,0,4,2,3,0,1,0,1,1,2,1,1,0,0,1,1,0,0,1,2,1,1,0,2,0,1,1,3,0,0,2,0,0,1,2,1,1,0,1,0,1,1,3,3,1,3,2,2,2,0,3,0,1,0,1,0,1,0,0,0,4,2,2,1,1,0,0,0,1,0,0,1,1,3,0,2,0,0,4,1,0,0,0,1,0,1,0,1,1,1,4,1,0,0,0,1,2,3,1,2,1,0,2,1,0,0,0,3,0,0,1,1,0,1,1,0,2,0,0,1,1,1,0,3,0,0,1,0,0,0,0,1,2,1,1,1,0,0,0,0,2,0,2,0,0,0,2,1,0,2,1,0,1,1,1,0,0,5,0,1,1,1,1,0,0,2,1,2,3,0,0,0,0,0,3,1,1,1,0,3,1,0,0,1,1,2,2,1,1,1,3,1,1,2,1,1,1,1,1,1,1,2,0,1,1,2,1,1,2,1,1,0,1,1,1,2,1,1,1,4,1,3,3,0,1,0,1,1,1,0,0,0,0,0,0,1,2,0,0,2,1,0,1,1,1,1,2,0,1,1,0,0,2,2,1,0,2,2,2,1,2,0,3,2,0,0,1,1,0,1,0,1,0,0,0,0,1,0,1,2,0,2,1,1,3,3,0,1,0,1,0,3,0,1,2,1,0,1,1,1,1,0,2,2,1,1,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,0,1,1,0,1,1,1,0,2,0,0,1,1,1,2,1,0,1,0,2,1,1,0,1,2,1,3,0,1,0,2,0,1,0,0,0,0,0,2,0,1,3,0,0,0,2,1,0,1,1,1,1,2,2,1,2,0,0,2,2,2,1,2,1,1,3,0,1,3,0,0,0,0,0,0,0,1,1,1,1,2,2,0,1,0,1,1,2,0,2,2,2,2,2,3,2,0,1,1,2,1,0,1,0,2,2,3,0,0,0,1,1,2,0,0,1,0,0,0,0,2,0,0,1,2,5,0,0,2,0,0,2,1,0,3,0,3,0,0,0,1,1,1,1,3,0,3,2,3,0,0,1,0,1,2,1,2,1,1,2,1,1,1,2,0,0,0,1,0,0,1,0,4,1,1,0,0,4,1,1,2,3,3,1,2,1,1,1,1,1,0,1,0,1,0,1,1,2,1,2,0,0,2,1,0,1,0,1,3,3,0,1,0,0,0,3,0,0,2,1,2,2,1,1,2,4,1,1,2,0,2,0,1,2,2,1,0,1,1,0,0,1,0,4,1,2,0,1,0,0,0,0,1,2,0,1,0,2,0,1,2,1,1,1,0,0,0,1,0,0,4,2,0,2,1,1,0,1,2,2,2,2,2,0,0,0,0,3,1,2,0,1,2,0,0,3,1,0,2,2,0,2,0,0,0,3,4,0,0,1,1,0,0,1,0,3,1,1,0,0,1,0,1,0,0,1,0,1,3,1,1,0,1,3,0,1,1,2,3,0,1,0,2,0,0,2,1,1,0,2,1,1,0,0,1,1,0,0,0,1,1,0,1,0,2,0,1,0,1,4,0,3,0,0,5,0,0,0,0,3,0,1,0,1,0,2,2,2,0,2,2,1,0,1,0,1,0,0,1,1,0,3,0,3,1,0,1,0,4,3,0,0,2,0,1,2,0,0,0,0,1,1,0,1,2,0,1,1,1,3,0,0,0,2,2,1,1,3,1,0,1,0,1,0,1,0,1,1,1,2,1,1,1,2,3,1,1,0,0,1,0,4,1,1,2,1,2,1,3,0,2,0,0,1,2,0,1,3,2,2,0,0,1,0,0,1,1,0,0,2,4,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,3,0,2,2,0,0,0,0,0,0,1,0,2,0,2,2,1,0,0,2,0,2,0,0,1,1,0,0,0,0,3,0,1,0,0,1,0,1,2,2,0,1,1,0,1,0,1,1,1,1,4,1,0,0,1,3,1,1,1,3,1,2,2,0,0,1,0,0,1,1,1,0,0,4,1,0,1,2,1,3,1,2,3,2,2,2,0,3,0,3,1,1,2,1,0,0,0,1,0,1,2,1,0,1,2,1,2,0,1,0,0,0,0,2,0,0,0,0,2,0,1,0,1,1,0,0,1,1,0,2,1,0,1,1,1,2,2,2,0,0,2,2,0,0,0,4,2,1,5,3,0,4,2,0,2,0,2,1,1,1,2,1,1,1,1,1,0,1,0,1,2,0,0,2,1,2,0,2,1,0,1,0,2,1,0,0,2,1,1,1,1,3,1,0,0,1,2,1,1,0,0,2,0,0,1,1,2,1,1,1,1,0,1,2,1,1,1,0,3,0,1,0,1,0,0,1,0,1,1,2,2,1,0,0,0,0,0,0,3,1,1,2,1,1,1,1,1,1,0,2,1,2,3,0,0,2,3,0,0,0,0,1,3,0,1,1,0,1,1,1,2,1,0,3,0,0,3,0,0,0,0,1,0,1,2,1,1,2,0,1,1,0,0,2,0,1,0,3,0,1,1,1,2,1,2,1,0,1,1,0,0,2,0,0,0,1,2,0,2,1,1,0,0,1,0,2,1,0,0,3,2,1,0,0,0,1,1,0,1,1,1,1,0,0,0,0,0,0,2,1,0]},{"counters":[2,0,0,1,0,0,0,1,2,0,1,1,0,1,0,1,3,1,2,4,0,3,1,0,0,4,1,1,1,1,1,0,0,0,0,0,2,1,0,2,1,0,0,0,1,1,0,0,1,0,1,1,1,0,2,0,3,0,1,1,2,2,1,0,2,0,0,0,1,1,1,0,1,1,1,1,0,1,0,1,3,0,1,0,2,1,1,2,2,2,4,1,0,0,0,1,1,2,0,1,1,1,0,1,1,1,2,1,1,0,0,0,0,1,1,2,1,2,1,0,0,1,0,0,1,1,3,1,0,0,0,0,3,2,0,0,2,2,1,1,2,1,1,1,0,0,0,1,1,1,2,1,1,1,1,1,0,0,1,2,1,2,2,0,3,0,1,1,0,0,1,0,0,1,0,1,1,1,0,1,2,2,0,3,1,0,1,2,2,3,1,0,0,1,1,0,1,1,0,1,1,2,0,0,0,1,0,2,1,2,2,1,1,0,1,0,0,2,1,3,2,0,3,0,0,0,2,3,0,1,1,0,1,1,1,3,2,1,0,3,0,0,2,2,0,2,1,1,1,0,1,2,0,0,1,0,1,1,1,1,1,1,0,1,2,1,1,0,3,0,1,3,0,1,2,2,1,0,0,1,0,1,3,2,2,0,1,2,1,2,0,0,1,1,0,2,3,1,2,1,2,2,1,0,0,0,0,2,0,2,1,3,0,0,0,0,3,1,2,0,0,0,1,1,0,4,0,1,1,2,0,0,2,0,1,1,0,1,2,1,0,1,2,2,1,3,0,0,1,2,5,0,1,1,3,0,0,2,1,1,2,0,0,1,1,0,0,0,0,3,1,0,1,1,0,1,1,2,0,0,0,0,0,0,0,2,0,1,2,1,0,0,0,0,2,0,1,0,0,1,2,2,0,0,2,1,3,4,1,2,1,1,2,1,1,4,0,0,1,0,1,0,1,3,2,0,0,0,0,0,0,2,1,1,2,0,1,1,1,0,0,0,1,0,0,0,3,1,2,1,1,2,0,2,1,1,2,0,1,1,0,2,0,1,0,0,1,2,0,0,0,0,2,0,1,0,2,0,2,2,2,1,1,0,0,0,0,0,0,2,3,1,0,1,2,1,4,2,1,1,0,1,0,1,1,2,0,2,0,0,1,1,3,0,0,1,0,2,1,2,0,0,0,1,1,1,1,1,1,1,0,1,1,2,2,1,0,1,0,1,2,0,0,0,3,4,0,0,1,1,0,0,1,1,2,0,0,1,3,0,2,0,1,1,0,0,0,0,0,0,4,1,0,2,1,1,0,0,2,1,1,1,1,0,1,3,1,2,0,0,1,1,0,2,3,0,2,0,0,5,1,1,2,0,1,0,0,1,2,1,1,2,1,1,0,0,2,0,0,1,0,0,1,2,0,1,0,0,0,1,0,2,1,1,0,2,2,0,3,1,0,1,0,0,1,3,0,4,1,1,1,2,2,1,2,1,0,0,0,4,0,1,0,2,1,0,3,1,2,0,0,1,1,1,0,0,1,1,1,0,1,2,0,1,0,0,1,0,0,0,0,1,1,0,0,2,1,1,0,0,0,0,2,1,1,1,0,0,1,0,1,1,0,3,2,1,1,1,0,1,2,3,0,2,3,2,0,0,1,3,0,0,3,3,1,0,0,1,2,0,0,2,0,2,1,0,0,1,0,1,0,0,1,0,0,2,1,0,0,0,3,1,3,0,0,0,2,0,0,0,0,2,5,0,1,1,0,2,1,2,0,1,3,1,0,0,1,0,2,2,2,0,1,1,1,0,1,0,1,2,1,0,2,1,2,3,0,0,0,0,4,1,0,0,1,2,0,2,2,0,1,4,2,3,2,0,1,1,0,0,1,1,1,1,0,0,1,0,1,3,1,1,2,1,0,1,1,0,0,0,1,3,0,1,2,2,2,4,0,0,0,1,1,0,0,0,1,1,1,0,2,2,2,0,0,2,1,1,1,2,1,0,1,0,3,1,1,3,0,0,3,0,3,1,2,0,1,0,1,0,1,2,3,2,1,2,3,0,1,2,0,1,0,0,2,0,1,0,0,1,1,0,2,0,1,0,0,1,1,0,3,3,1,1,0,2,0,1,0,0,2,2,0,0,2,2,3,1,0,1,0,2,4,0,2,2,0,1,0,2,1,2,0,2,0,1,0,0,3,1,0,2,1,1,1,2,5,0,0,2,0,2,0,0,0,0,3,1,1,0,1,1,1,1,0,2,1,2,2,1,0,0,1,0,4,1,0,2,2,1,2,2,0,1,3,0,0,0,1,2,2,1,1,0,0,3,2,1,3,0,0,1,1,1,1,0,2,1,0,0,1,1,0,2,0,0,1,1,0,2,1,1,0,1,3,3,0,2,1,0,0,1,0,0,1,1,0,0,0,1,1,0,0,1,3,0,1,1,1,1,2,3,0,1,1,1,2,2,1,1,1,1,0,1,0,1,2,1,1,1,1,0,0,2,1,2,0,0,0,0,0,3,2,1,0,1,1,0,1,0,2,0,0,0,0,0,1,1,1,0,2,0,1,1,0,0,1,0,0,0,2,2,3,2,2,1,1,2,1,0,2,1,0,1,1,0,1,1,3,2,1,0,2,0,0,1,0,0,1,2,3,0,1,2,2,0,0,0,0,0,0,0,2,1,0,1,0,0,0,2,0,1,1,0,2,0,0,0,3,0,1,0,3,2,1,3,3,1,1,2,0,0,0,2,0,1,2,0,0,3,0,1,2,1,1,0,2,1,1,1,1,2,0,2,0,1,0,0,0,0,1,0,0,0,0,2,1,2,1,1,1,2,1,0,1,0,2,0,0,3,1,1,0,0,1,1,0,1,1,1,0,3,0,1,0,1,0,0,1,2,0,3,0,0,3,2,1,2,1,1,1,1,2,1,1,1,1,0,0,0,3,2,1,2,0,0,1,0,2,1,0,0,0,3,2,0,0,1,1,0,1,0,0,1,3,2,6,0,2,2,0,1,2,1,3,0,1,1,2,4,1,3,1,0,2,1,1,0,2,1,0,3,2,2,2,1,1,1,0,0,2,3,1,0,3,0,0,1,1,0,0,4,0,4,0,0,0,0,2,1,2,3,1,0,0,0,0,0,1,2,0,3,3,1,0,0,1,2,0,2,0,3,1,1,0,0,0,2,1,0,3,0,4,1,1,0,2,0,0,0,1,0,0,2,1,0,2,1,1,1,1,1,1,2,1,1,2,2,3,3,0,2,0,1,0,0,0,0,1,2,0,0,1,2,1,1,1,2,0,1,3,2,0,3,2,4,0,2,0,1,3,0,6,0,0,0,4,1,2,1,1,1,0,1,1,0,0,0,1,1,1,2,1,1,0,0,2,1,1,1,0,0,4,0,0,1,1,2,2,1,0,1,0,0,0,0,0,3,1,2,1,1,2,1,1,2,1,2,1,1,4,0,1,0,3,0,1,1,0,1,0,2,0,1,0,0,0,1,1,0,0,0,2,2,1,2,1,1,0,1,0,1,2,2,0,0,1,1,1,2,1,0,2,2,1,0,1,0,0,0,3,0,0,2,1,0,0,0,2,1,0,1,0,1,2,1,0,1,1,0,1,1,0,0,0,1,0,1,0,0,1,2,2,1,0,1,0,0,0,0,1,2,1,0,2,2,0,2,0,2,1,0,0,1,1,0,1,0,0,1,0,1,2,1,0,1,1,1,1,1,0,1,0,0,2,1,0,0,3,1,1,0,0,1,0,1,1,0,0,1,2,0,1,1,0,3,2,0,3,2,2,1,1,0,0,0,1,2,1,0,0,2,2,1,1,1,2,1,0,0,2,3,1,2,1,0,1,0,1,2,2,2,1,0,0,1,1,2,1,0,3,2,1,3,0,2,0,0,2,0,2,0,1,2,3,0,0,2,0,0,0,1,0,2,2,1,0,1,0,4,0,1,2,0,2,1,1,0,0,1,0,1,1,2,0,2,0,0,2,2,1,0,1,0,0,1,2,0,2,2,1,1,0,1,2,0,0,0,3,2,0,0,1,2,2,1,0,1,1,2,1,0,3,3,0,1,1,2,0,1,3,0,1,1,1,1,0,0,0,1,2,1,0,3,0,0,3,0,0,1,3,1,2,1,1,3,1,1,0,2,2,2,1,1,0,1,2,0,0,1,0,0,1,1,0,1,1,1,4,1,0,1,0,0,2,0,0,0,2,1,1,1,0,2,0,0,1,1,2,1,3,0,0,1,1,0,2,1,0,0,4,1,2,6,3,2,1,3,2,0,1,1,0,1,3,0,0,2,1,1,0,0,0,1,0,2,1,2,3,0,0,0,0,1,0,4,0,0,1,0,0,1,0,2,0,0,1,1,0,0,0,0,1,0,1,3,0,1,3,1,0,1,3,1,2,2,1,1,0,1,0,4,0,2,0,2,0,1,0,2,0,0,1,1,1,1,2,4,0,1,0,0,0,0,2,1,1,1,3,1,1,2,0,1,2,3,2,0,1,1,1,2,2,2,0,2,1,0,2,0,0,0,1,1,0,2,1,1,0,2,1,1,2,2,0,1,0,1,3,1,3,0,1,0,1,2,0,0,3,4,0,0,1,1,1,0,0,0]},{"counters":[1,1,0,0,0,2,3,0,1,0,0,2,1,1,0,1,1,0,1,2,2,0,2,1,1,0,2,1,0,1,2,1,4,1,1,1,2,0,0,2,3,1,2,0,0,1,1,0,0,1,0,1,1,1,0,1,1,0,0,2,2,1,0,1,0,3,1,3,1,0,2,2,1,0,1,1,1,0,1,1,2,0,2,4,0,2,0,0,0,0,2,1,2,2,0,2,1,2,0,1,0,2,1,1,1,1,0,0,1,1,1,2,1,0,0,0,1,1,2,0,2,2,2,1,0,1,0,0,3,0,1,1,0,1,1,2,0,1,2,3,0,2,0,0,1,3,1,1,3,0,5,1,0,0,1,1,1,0,0,0,1,0,2,2,3,1,2,0,0,1,0,2,0,1,1,1,2,2,2,1,3,2,1,4,1,0,0,0,1,1,1,0,2,1,0,1,0,1,1,3,0,0,1,1,1,0,1,2,1,1,3,3,0,2,1,0,0,0,1,1,1,1,3,0,1,1,0,0,0,0,1,0,0,3,1,1,0,0,1,1,2,2,2,1,0,1,1,0,1,0,0,0,2,0,2,0,0,1,1,1,0,1,1,0,2,0,1,2,1,1,1,1,1,0,0,0,1,1,0,1,1,0,0,1,0,2,1,1,0,2,0,1,0,1,0,2,1,2,1,0,2,4,1,0,2,0,1,1,0,2,1,1,1,1,1,2,1,0,0,1,2,3,1,1,2,0,0,1,1,1,1,0,1,2,1,1,0,0,0,1,0,1,0,0,1,0,1,0,0,0,0,1,1,2,2,2,2,0,1,0,1,1,1,2,0,0,2,1,2,1,0,0,2,2,2,0,0,0,0,2,1,2,0,1,0,4,1,0,0,1,2,1,2,0,0,1,1,1,1,2,0,1,0,0,0,1,3,1,0,4,0,0,1,2,0,0,0,0,1,0,0,0,1,2,0,0,2,2,2,1,1,2,2,1,1,0,2,1,0,3,1,1,0,0,1,2,0,1,1,0,2,1,0,1,2,2,1,2,0,0,0,2,2,0,0,0,0,1,1,1,1,0,1,3,1,0,0,1,0,1,4,0,2,1,2,1,2,0,1,2,0,2,2,0,4,1,0,1,0,0,2,1,0,0,0,1,0,0,1,1,1,2,1,1,1,0,1,0,3,3,3,2,2,1,0,1,2,0,0,1,1,0,2,0,1,2,2,2,0,1,0,2,1,2,2,0,1,0,0,2,2,0,0,1,0,1,1,0,2,1,0,2,2,1,0,2,2,0,1,0,1,0,2,1,1,1,2,0,1,0,1,2,2,0,2,0,1,1,4,1,0,2,1,1,2,1,2,3,2,2,1,1,0,0,1,0,1,0,1,1,1,2,2,1,0,1,0,1,1,1,2,0,1,1,0,0,1,1,0,0,1,1,0,0,0,0,3,0,0,4,3,0,0,1,0,0,3,0,1,1,2,0,1,2,1,1,0,2,1,0,1,0,2,3,0,1,1,2,3,1,1,1,2,1,2,0,1,1,0,2,0,0,1,1,0,2,1,0,0,2,2,0,0,0,4,1,1,0,0,3,0,0,2,0,1,0,1,1,0,1,0,1,3,0,0,1,1,1,1,0,0,2,1,3,1,3,0,2,0,1,0,1,0,0,1,0,1,1,1,2,0,0,2,0,0,4,0,1,3,1,2,3,1,0,0,0,2,1,1,1,0,0,0,0,1,0,2,1,3,0,1,0,2,1,0,0,0,0,1,0,1,0,1,1,0,1,2,1,3,2,0,1,1,0,0,1,1,1,0,0,0,2,2,2,1,1,0,1,1,0,3,0,1,1,3,2,2,1,0,0,0,1,1,0,1,1,2,0,0,2,1,2,1,2,2,0,3,1,2,0,0,0,1,1,0,0,0,0,0,2,1,0,1,0,1,0,1,1,0,1,1,2,0,0,1,1,0,0,2,1,0,1,0,2,0,0,0,1,0,3,1,2,1,2,0,2,1,0,2,0,1,1,1,0,0,0,3,2,1,1,1,0,0,1,0,0,0,0,0,0,0,1,3,1,0,2,4,1,1,0,1,2,1,0,1,0,1,0,1,1,0,1,1,0,2,0,1,1,1,1,0,0,0,0,0,0,0,0,1,1,1,2,0,0,1,0,3,0,1,1,0,1,1,1,2,3,1,1,3,1,0,1,2,1,1,0,0,0,2,0,1,2,0,0,2,1,0,0,1,1,2,0,1,0,0,0,1,0,0,2,3,3,0,2,0,3,2,0,1,1,0,1,0,0,2,0,2,1,0,0,2,0,1,0,2,0,1,3,2,1,0,1,1,1,0,2,0,2,3,1,2,1,1,2,0,2,2,1,1,0,1,0,0,3,0,2,1,0,0,1,1,1,1,0,0,0,1,1,0,1,1,0,3,0,0,1,1,0,1,1,1,1,0,0,1,0,1,1,1,1,0,1,1,1,0,1,2,2,3,1,1,1,2,1,2,0,1,2,0,0,0,2,0,0,1,1,1,1,2,0,2,0,2,0,1,1,1,0,1,0,1,0,2,1,1,1,1,0,1,0,0,1,0,2,1,0,1,2,0,0,1,2,2,0,0,0,0,0,2,0,1,0,1,0,0,1,3,3,2,0,0,2,0,1,0,2,0,0,2,1,0,0,0,4,2,2,1,1,0,1,0,1,0,1,1,2,0,1,2,2,1,3,2,3,2,1,1,1,0,2,0,0,0,0,1,1,0,1,0,1,0,0,1,0,1,1,0,2,0,2,1,1,1,0,3,2,1,0,3,1,0,2,3,1,0,2,1,1,0,4,0,1,0,2,1,0,1,2,1,1,0,0,2,3,0,0,1,1,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,3,1,0,0,1,0,1,0,1,1,2,0,2,0,1,0,0,4,1,0,1,1,1,2,3,0,1,0,1,1,0,3,0,1,1,1,3,0,1,1,2,1,1,1,2,1,2,0,1,1,0,3,2,1,2,1,1,0,1,0,1,2,1,1,2,4,0,3,3,1,1,1,3,2,1,1,3,0,3,3,3,0,1,2,0,0,2,1,0,3,1,0,1,1,0,1,0,1,0,1,0,5,0,1,0,1,2,2,1,1,1,1,0,1,3,1,1,1,1,1,3,0,1,4,0,1,1,1,1,0,1,0,2,0,2,0,1,0,1,2,0,1,2,1,2,0,0,1,0,1,2,0,2,0,0,2,0,1,1,1,2,1,0,1,0,0,3,1,1,1,1,2,2,1,1,0,1,1,0,0,0,1,1,1,3,2,0,0,2,1,1,1,0,1,1,2,1,1,0,1,1,0,1,5,0,0,1,0,1,1,0,5,1,2,0,2,1,0,0,5,2,2,0,1,2,1,0,1,0,0,2,0,4,0,1,0,1,2,0,1,0,1,0,0,1,1,1,0,1,2,0,2,1,1,0,1,0,2,3,1,0,1,1,1,3,2,2,1,4,0,2,4,2,1,0,2,1,0,1,1,0,1,1,1,2,3,0,1,0,2,0,1,0,0,1,2,1,2,0,1,1,1,0,0,1,1,2,2,1,0,1,0,0,1,0,2,2,1,2,4,1,2,0,1,0,0,1,3,1,1,0,0,2,3,0,1,2,1,0,1,1,3,0,0,1,0,1,1,0,1,1,2,1,1,2,0,1,2,4,2,3,0,4,1,3,0,0,1,1,1,2,1,2,1,0,2,1,0,1,0,3,1,4,0,0,3,2,1,3,1,1,1,0,1,3,2,3,0,1,1,0,0,3,1,0,0,1,1,2,2,1,0,2,1,0,2,0,0,0,0,3,0,2,2,1,1,3,2,0,1,0,1,0,0,2,3,0,0,1,1,1,2,1,0,0,0,3,1,1,0,1,2,2,0,0,2,1,2,0,2,1,3,1,1,3,0,1,2,1,2,0,1,2,3,0,0,1,2,0,0,1,0,1,2,0,1,0,0,0,1,0,0,1,1,2,2,0,4,0,0,0,0,1,2,0,2,4,0,0,3,0,1,1,2,2,0,3,2,0,0,2,0,2,1,2,0,2,1,1,1,2,1,1,0,3,1,2,3,0,1,0,1,1,1,4,0,1,0,1,2,2,1,2,0,0,1,1,0,2,1,0,1,0,0,0,1,0,0,2,0,2,1,0,0,1,0,1,1,2,2,0,0,1,0,0,1,0,1,1,1,0,2,1,1,0,1,1,2,1,1,1,2,0,2,0,1,0,0,0,3,0,0,2,0,0,3,0,0,1,2,1,0,2,3,1,2,2,0,3,1,1,2,0,2,0,1,0,0,1,0,0,3,1,0,1,0,0,1,1,2,2,2,1,0,0,0,1,1,1,0,1,0,1,1,0,4,1,0,0,0,0,0,0,1,1,0,0,1,1,1,0,1,2,1,0,1,2,0,1,5,0,1,0,1,0,0,0,3,1,0,0,0,1,2,2,2,0,1,0,0,1,2,2,2,0,1,1,1,1,2,2,1,0,1,0,2,0,0,0,1,3,1,0,0,2,1,2,0,1,1,0,0,1,1,0,0,1,2,0,1,1,0,3,0,2,1,3,2,0,1,2,1,0,2]}]},"null_count":0,"last_update_version":397952033396621312},"id":{"histogram":{"ndv":1999,"buckets":[{"count":8,"lower_bound":"MQ==","upper_bound":"OA==","repeats":1},{"count":16,"lower_bound":"OQ==","upper_bound":"MTY=","repeats":1},{"count":24,"lower_bound":"MTc=","upper_bound":"MjQ=","repeats":1},{"count":32,"lower_bound":"MjU=","upper_bound":"MzI=","repeats":1},{"count":40,"lower_bound":"MzM=","upper_bound":"NDA=","repeats":1},{"count":48,"lower_bound":"NDE=","upper_bound":"NDg=","repeats":1},{"count":56,"lower_bound":"NDk=","upper_bound":"NTY=","repeats":1},{"count":64,"lower_bound":"NTc=","upper_bound":"NjQ=","repeats":1},{"count":72,"lower_bound":"NjU=","upper_bound":"NzI=","repeats":1},{"count":80,"lower_bound":"NzM=","upper_bound":"ODA=","repeats":1},{"count":88,"lower_bound":"ODE=","upper_bound":"ODg=","repeats":1},{"count":96,"lower_bound":"ODk=","upper_bound":"OTY=","repeats":1},{"count":104,"lower_bound":"OTc=","upper_bound":"MTA0","repeats":1},{"count":112,"lower_bound":"MTA1","upper_bound":"MTEy","repeats":1},{"count":120,"lower_bound":"MTEz","upper_bound":"MTIw","repeats":1},{"count":128,"lower_bound":"MTIx","upper_bound":"MTI4","repeats":1},{"count":136,"lower_bound":"MTI5","upper_bound":"MTM2","repeats":1},{"count":144,"lower_bound":"MTM3","upper_bound":"MTQ0","repeats":1},{"count":152,"lower_bound":"MTQ1","upper_bound":"MTUy","repeats":1},{"count":160,"lower_bound":"MTUz","upper_bound":"MTYw","repeats":1},{"count":168,"lower_bound":"MTYx","upper_bound":"MTY4","repeats":1},{"count":176,"lower_bound":"MTY5","upper_bound":"MTc2","repeats":1},{"count":184,"lower_bound":"MTc3","upper_bound":"MTg0","repeats":1},{"count":192,"lower_bound":"MTg1","upper_bound":"MTky","repeats":1},{"count":200,"lower_bound":"MTkz","upper_bound":"MjAw","repeats":1},{"count":208,"lower_bound":"MjAx","upper_bound":"MjA4","repeats":1},{"count":216,"lower_bound":"MjA5","upper_bound":"MjE2","repeats":1},{"count":224,"lower_bound":"MjE3","upper_bound":"MjI0","repeats":1},{"count":232,"lower_bound":"MjI1","upper_bound":"MjMy","repeats":1},{"count":240,"lower_bound":"MjMz","upper_bound":"MjQw","repeats":1},{"count":248,"lower_bound":"MjQx","upper_bound":"MjQ4","repeats":1},{"count":256,"lower_bound":"MjQ5","upper_bound":"MjU2","repeats":1},{"count":264,"lower_bound":"MjU3","upper_bound":"MjY0","repeats":1},{"count":272,"lower_bound":"MjY1","upper_bound":"Mjcy","repeats":1},{"count":280,"lower_bound":"Mjcz","upper_bound":"Mjgw","repeats":1},{"count":288,"lower_bound":"Mjgx","upper_bound":"Mjg4","repeats":1},{"count":296,"lower_bound":"Mjg5","upper_bound":"Mjk2","repeats":1},{"count":304,"lower_bound":"Mjk3","upper_bound":"MzA0","repeats":1},{"count":312,"lower_bound":"MzA1","upper_bound":"MzEy","repeats":1},{"count":320,"lower_bound":"MzEz","upper_bound":"MzIw","repeats":1},{"count":328,"lower_bound":"MzIx","upper_bound":"MzI4","repeats":1},{"count":336,"lower_bound":"MzI5","upper_bound":"MzM2","repeats":1},{"count":344,"lower_bound":"MzM3","upper_bound":"MzQ0","repeats":1},{"count":352,"lower_bound":"MzQ1","upper_bound":"MzUy","repeats":1},{"count":360,"lower_bound":"MzUz","upper_bound":"MzYw","repeats":1},{"count":368,"lower_bound":"MzYx","upper_bound":"MzY4","repeats":1},{"count":376,"lower_bound":"MzY5","upper_bound":"Mzc2","repeats":1},{"count":384,"lower_bound":"Mzc3","upper_bound":"Mzg0","repeats":1},{"count":392,"lower_bound":"Mzg1","upper_bound":"Mzky","repeats":1},{"count":400,"lower_bound":"Mzkz","upper_bound":"NDAw","repeats":1},{"count":408,"lower_bound":"NDAx","upper_bound":"NDA4","repeats":1},{"count":416,"lower_bound":"NDA5","upper_bound":"NDE2","repeats":1},{"count":424,"lower_bound":"NDE3","upper_bound":"NDI0","repeats":1},{"count":432,"lower_bound":"NDI1","upper_bound":"NDMy","repeats":1},{"count":440,"lower_bound":"NDMz","upper_bound":"NDQw","repeats":1},{"count":448,"lower_bound":"NDQx","upper_bound":"NDQ4","repeats":1},{"count":456,"lower_bound":"NDQ5","upper_bound":"NDU2","repeats":1},{"count":464,"lower_bound":"NDU3","upper_bound":"NDY0","repeats":1},{"count":472,"lower_bound":"NDY1","upper_bound":"NDcy","repeats":1},{"count":480,"lower_bound":"NDcz","upper_bound":"NDgw","repeats":1},{"count":488,"lower_bound":"NDgx","upper_bound":"NDg4","repeats":1},{"count":496,"lower_bound":"NDg5","upper_bound":"NDk2","repeats":1},{"count":504,"lower_bound":"NDk3","upper_bound":"NTA0","repeats":1},{"count":512,"lower_bound":"NTA1","upper_bound":"NTEy","repeats":1},{"count":520,"lower_bound":"NTEz","upper_bound":"NTIw","repeats":1},{"count":528,"lower_bound":"NTIx","upper_bound":"NTI4","repeats":1},{"count":536,"lower_bound":"NTI5","upper_bound":"NTM2","repeats":1},{"count":544,"lower_bound":"NTM3","upper_bound":"NTQ0","repeats":1},{"count":552,"lower_bound":"NTQ1","upper_bound":"NTUy","repeats":1},{"count":560,"lower_bound":"NTUz","upper_bound":"NTYw","repeats":1},{"count":568,"lower_bound":"NTYx","upper_bound":"NTY4","repeats":1},{"count":576,"lower_bound":"NTY5","upper_bound":"NTc2","repeats":1},{"count":584,"lower_bound":"NTc3","upper_bound":"NTg0","repeats":1},{"count":592,"lower_bound":"NTg1","upper_bound":"NTky","repeats":1},{"count":600,"lower_bound":"NTkz","upper_bound":"NjAw","repeats":1},{"count":608,"lower_bound":"NjAx","upper_bound":"NjA4","repeats":1},{"count":616,"lower_bound":"NjA5","upper_bound":"NjE2","repeats":1},{"count":624,"lower_bound":"NjE3","upper_bound":"NjI0","repeats":1},{"count":632,"lower_bound":"NjI1","upper_bound":"NjMy","repeats":1},{"count":640,"lower_bound":"NjMz","upper_bound":"NjQw","repeats":1},{"count":648,"lower_bound":"NjQx","upper_bound":"NjQ4","repeats":1},{"count":656,"lower_bound":"NjQ5","upper_bound":"NjU2","repeats":1},{"count":664,"lower_bound":"NjU3","upper_bound":"NjY0","repeats":1},{"count":672,"lower_bound":"NjY1","upper_bound":"Njcy","repeats":1},{"count":680,"lower_bound":"Njcz","upper_bound":"Njgw","repeats":1},{"count":688,"lower_bound":"Njgx","upper_bound":"Njg4","repeats":1},{"count":696,"lower_bound":"Njg5","upper_bound":"Njk2","repeats":1},{"count":704,"lower_bound":"Njk3","upper_bound":"NzA0","repeats":1},{"count":712,"lower_bound":"NzA1","upper_bound":"NzEy","repeats":1},{"count":720,"lower_bound":"NzEz","upper_bound":"NzIw","repeats":1},{"count":728,"lower_bound":"NzIx","upper_bound":"NzI4","repeats":1},{"count":736,"lower_bound":"NzI5","upper_bound":"NzM2","repeats":1},{"count":744,"lower_bound":"NzM3","upper_bound":"NzQ0","repeats":1},{"count":752,"lower_bound":"NzQ1","upper_bound":"NzUy","repeats":1},{"count":760,"lower_bound":"NzUz","upper_bound":"NzYw","repeats":1},{"count":768,"lower_bound":"NzYx","upper_bound":"NzY4","repeats":1},{"count":776,"lower_bound":"NzY5","upper_bound":"Nzc2","repeats":1},{"count":784,"lower_bound":"Nzc3","upper_bound":"Nzg0","repeats":1},{"count":792,"lower_bound":"Nzg1","upper_bound":"Nzky","repeats":1},{"count":800,"lower_bound":"Nzkz","upper_bound":"ODAw","repeats":1},{"count":808,"lower_bound":"ODAx","upper_bound":"ODA4","repeats":1},{"count":816,"lower_bound":"ODA5","upper_bound":"ODE2","repeats":1},{"count":824,"lower_bound":"ODE3","upper_bound":"ODI0","repeats":1},{"count":832,"lower_bound":"ODI1","upper_bound":"ODMy","repeats":1},{"count":840,"lower_bound":"ODMz","upper_bound":"ODQw","repeats":1},{"count":848,"lower_bound":"ODQx","upper_bound":"ODQ4","repeats":1},{"count":856,"lower_bound":"ODQ5","upper_bound":"ODU2","repeats":1},{"count":864,"lower_bound":"ODU3","upper_bound":"ODY0","repeats":1},{"count":872,"lower_bound":"ODY1","upper_bound":"ODcy","repeats":1},{"count":880,"lower_bound":"ODcz","upper_bound":"ODgw","repeats":1},{"count":888,"lower_bound":"ODgx","upper_bound":"ODg4","repeats":1},{"count":896,"lower_bound":"ODg5","upper_bound":"ODk2","repeats":1},{"count":904,"lower_bound":"ODk3","upper_bound":"OTA0","repeats":1},{"count":912,"lower_bound":"OTA1","upper_bound":"OTEy","repeats":1},{"count":920,"lower_bound":"OTEz","upper_bound":"OTIw","repeats":1},{"count":928,"lower_bound":"OTIx","upper_bound":"OTI4","repeats":1},{"count":936,"lower_bound":"OTI5","upper_bound":"OTM2","repeats":1},{"count":944,"lower_bound":"OTM3","upper_bound":"OTQ0","repeats":1},{"count":952,"lower_bound":"OTQ1","upper_bound":"OTUy","repeats":1},{"count":960,"lower_bound":"OTUz","upper_bound":"OTYw","repeats":1},{"count":968,"lower_bound":"OTYx","upper_bound":"OTY4","repeats":1},{"count":976,"lower_bound":"OTY5","upper_bound":"OTc2","repeats":1},{"count":984,"lower_bound":"OTc3","upper_bound":"OTg0","repeats":1},{"count":992,"lower_bound":"OTg1","upper_bound":"OTky","repeats":1},{"count":1000,"lower_bound":"OTkz","upper_bound":"MTAwMA==","repeats":1},{"count":1008,"lower_bound":"MTAwMQ==","upper_bound":"MTAwOA==","repeats":1},{"count":1016,"lower_bound":"MTAwOQ==","upper_bound":"MTAxNg==","repeats":1},{"count":1024,"lower_bound":"MTAxNw==","upper_bound":"MTAyNA==","repeats":1},{"count":1032,"lower_bound":"MTAyNQ==","upper_bound":"MTAzMg==","repeats":1},{"count":1040,"lower_bound":"MTAzMw==","upper_bound":"MTA0MA==","repeats":1},{"count":1048,"lower_bound":"MTA0MQ==","upper_bound":"MTA0OA==","repeats":1},{"count":1056,"lower_bound":"MTA0OQ==","upper_bound":"MTA1Ng==","repeats":1},{"count":1064,"lower_bound":"MTA1Nw==","upper_bound":"MTA2NA==","repeats":1},{"count":1072,"lower_bound":"MTA2NQ==","upper_bound":"MTA3Mg==","repeats":1},{"count":1080,"lower_bound":"MTA3Mw==","upper_bound":"MTA4MA==","repeats":1},{"count":1088,"lower_bound":"MTA4MQ==","upper_bound":"MTA4OA==","repeats":1},{"count":1096,"lower_bound":"MTA4OQ==","upper_bound":"MTA5Ng==","repeats":1},{"count":1104,"lower_bound":"MTA5Nw==","upper_bound":"MTEwNA==","repeats":1},{"count":1112,"lower_bound":"MTEwNQ==","upper_bound":"MTExMg==","repeats":1},{"count":1120,"lower_bound":"MTExMw==","upper_bound":"MTEyMA==","repeats":1},{"count":1128,"lower_bound":"MTEyMQ==","upper_bound":"MTEyOA==","repeats":1},{"count":1136,"lower_bound":"MTEyOQ==","upper_bound":"MTEzNg==","repeats":1},{"count":1144,"lower_bound":"MTEzNw==","upper_bound":"MTE0NA==","repeats":1},{"count":1152,"lower_bound":"MTE0NQ==","upper_bound":"MTE1Mg==","repeats":1},{"count":1160,"lower_bound":"MTE1Mw==","upper_bound":"MTE2MA==","repeats":1},{"count":1168,"lower_bound":"MTE2MQ==","upper_bound":"MTE2OA==","repeats":1},{"count":1176,"lower_bound":"MTE2OQ==","upper_bound":"MTE3Ng==","repeats":1},{"count":1184,"lower_bound":"MTE3Nw==","upper_bound":"MTE4NA==","repeats":1},{"count":1192,"lower_bound":"MTE4NQ==","upper_bound":"MTE5Mg==","repeats":1},{"count":1200,"lower_bound":"MTE5Mw==","upper_bound":"MTIwMA==","repeats":1},{"count":1208,"lower_bound":"MTIwMQ==","upper_bound":"MTIwOA==","repeats":1},{"count":1216,"lower_bound":"MTIwOQ==","upper_bound":"MTIxNg==","repeats":1},{"count":1224,"lower_bound":"MTIxNw==","upper_bound":"MTIyNA==","repeats":1},{"count":1232,"lower_bound":"MTIyNQ==","upper_bound":"MTIzMg==","repeats":1},{"count":1240,"lower_bound":"MTIzMw==","upper_bound":"MTI0MA==","repeats":1},{"count":1248,"lower_bound":"MTI0MQ==","upper_bound":"MTI0OA==","repeats":1},{"count":1256,"lower_bound":"MTI0OQ==","upper_bound":"MTI1Ng==","repeats":1},{"count":1264,"lower_bound":"MTI1Nw==","upper_bound":"MTI2NA==","repeats":1},{"count":1272,"lower_bound":"MTI2NQ==","upper_bound":"MTI3Mg==","repeats":1},{"count":1280,"lower_bound":"MTI3Mw==","upper_bound":"MTI4MA==","repeats":1},{"count":1288,"lower_bound":"MTI4MQ==","upper_bound":"MTI4OA==","repeats":1},{"count":1296,"lower_bound":"MTI4OQ==","upper_bound":"MTI5Ng==","repeats":1},{"count":1304,"lower_bound":"MTI5Nw==","upper_bound":"MTMwNA==","repeats":1},{"count":1312,"lower_bound":"MTMwNQ==","upper_bound":"MTMxMg==","repeats":1},{"count":1320,"lower_bound":"MTMxMw==","upper_bound":"MTMyMA==","repeats":1},{"count":1328,"lower_bound":"MTMyMQ==","upper_bound":"MTMyOA==","repeats":1},{"count":1336,"lower_bound":"MTMyOQ==","upper_bound":"MTMzNg==","repeats":1},{"count":1344,"lower_bound":"MTMzNw==","upper_bound":"MTM0NA==","repeats":1},{"count":1352,"lower_bound":"MTM0NQ==","upper_bound":"MTM1Mg==","repeats":1},{"count":1360,"lower_bound":"MTM1Mw==","upper_bound":"MTM2MA==","repeats":1},{"count":1368,"lower_bound":"MTM2MQ==","upper_bound":"MTM2OA==","repeats":1},{"count":1376,"lower_bound":"MTM2OQ==","upper_bound":"MTM3Ng==","repeats":1},{"count":1384,"lower_bound":"MTM3Nw==","upper_bound":"MTM4NA==","repeats":1},{"count":1392,"lower_bound":"MTM4NQ==","upper_bound":"MTM5Mg==","repeats":1},{"count":1400,"lower_bound":"MTM5Mw==","upper_bound":"MTQwMA==","repeats":1},{"count":1408,"lower_bound":"MTQwMQ==","upper_bound":"MTQwOA==","repeats":1},{"count":1416,"lower_bound":"MTQwOQ==","upper_bound":"MTQxNg==","repeats":1},{"count":1424,"lower_bound":"MTQxNw==","upper_bound":"MTQyNA==","repeats":1},{"count":1432,"lower_bound":"MTQyNQ==","upper_bound":"MTQzMg==","repeats":1},{"count":1440,"lower_bound":"MTQzMw==","upper_bound":"MTQ0MA==","repeats":1},{"count":1448,"lower_bound":"MTQ0MQ==","upper_bound":"MTQ0OA==","repeats":1},{"count":1456,"lower_bound":"MTQ0OQ==","upper_bound":"MTQ1Ng==","repeats":1},{"count":1464,"lower_bound":"MTQ1Nw==","upper_bound":"MTQ2NA==","repeats":1},{"count":1472,"lower_bound":"MTQ2NQ==","upper_bound":"MTQ3Mg==","repeats":1},{"count":1480,"lower_bound":"MTQ3Mw==","upper_bound":"MTQ4MA==","repeats":1},{"count":1488,"lower_bound":"MTQ4MQ==","upper_bound":"MTQ4OA==","repeats":1},{"count":1496,"lower_bound":"MTQ4OQ==","upper_bound":"MTQ5Ng==","repeats":1},{"count":1504,"lower_bound":"MTQ5Nw==","upper_bound":"MTUwNA==","repeats":1},{"count":1512,"lower_bound":"MTUwNQ==","upper_bound":"MTUxMg==","repeats":1},{"count":1520,"lower_bound":"MTUxMw==","upper_bound":"MTUyMA==","repeats":1},{"count":1528,"lower_bound":"MTUyMQ==","upper_bound":"MTUyOA==","repeats":1},{"count":1536,"lower_bound":"MTUyOQ==","upper_bound":"MTUzNg==","repeats":1},{"count":1544,"lower_bound":"MTUzNw==","upper_bound":"MTU0NA==","repeats":1},{"count":1552,"lower_bound":"MTU0NQ==","upper_bound":"MTU1Mg==","repeats":1},{"count":1560,"lower_bound":"MTU1Mw==","upper_bound":"MTU2MA==","repeats":1},{"count":1568,"lower_bound":"MTU2MQ==","upper_bound":"MTU2OA==","repeats":1},{"count":1576,"lower_bound":"MTU2OQ==","upper_bound":"MTU3Ng==","repeats":1},{"count":1584,"lower_bound":"MTU3Nw==","upper_bound":"MTU4NA==","repeats":1},{"count":1592,"lower_bound":"MTU4NQ==","upper_bound":"MTU5Mg==","repeats":1},{"count":1600,"lower_bound":"MTU5Mw==","upper_bound":"MTYwMA==","repeats":1},{"count":1608,"lower_bound":"MTYwMQ==","upper_bound":"MTYwOA==","repeats":1},{"count":1616,"lower_bound":"MTYwOQ==","upper_bound":"MTYxNg==","repeats":1},{"count":1624,"lower_bound":"MTYxNw==","upper_bound":"MTYyNA==","repeats":1},{"count":1632,"lower_bound":"MTYyNQ==","upper_bound":"MTYzMg==","repeats":1},{"count":1640,"lower_bound":"MTYzMw==","upper_bound":"MTY0MA==","repeats":1},{"count":1648,"lower_bound":"MTY0MQ==","upper_bound":"MTY0OA==","repeats":1},{"count":1656,"lower_bound":"MTY0OQ==","upper_bound":"MTY1Ng==","repeats":1},{"count":1664,"lower_bound":"MTY1Nw==","upper_bound":"MTY2NA==","repeats":1},{"count":1672,"lower_bound":"MTY2NQ==","upper_bound":"MTY3Mg==","repeats":1},{"count":1680,"lower_bound":"MTY3Mw==","upper_bound":"MTY4MA==","repeats":1},{"count":1688,"lower_bound":"MTY4MQ==","upper_bound":"MTY4OA==","repeats":1},{"count":1696,"lower_bound":"MTY4OQ==","upper_bound":"MTY5Ng==","repeats":1},{"count":1704,"lower_bound":"MTY5Nw==","upper_bound":"MTcwNA==","repeats":1},{"count":1712,"lower_bound":"MTcwNQ==","upper_bound":"MTcxMg==","repeats":1},{"count":1720,"lower_bound":"MTcxMw==","upper_bound":"MTcyMA==","repeats":1},{"count":1728,"lower_bound":"MTcyMQ==","upper_bound":"MTcyOA==","repeats":1},{"count":1736,"lower_bound":"MTcyOQ==","upper_bound":"MTczNg==","repeats":1},{"count":1744,"lower_bound":"MTczNw==","upper_bound":"MTc0NA==","repeats":1},{"count":1752,"lower_bound":"MTc0NQ==","upper_bound":"MTc1Mg==","repeats":1},{"count":1760,"lower_bound":"MTc1Mw==","upper_bound":"MTc2MA==","repeats":1},{"count":1768,"lower_bound":"MTc2MQ==","upper_bound":"MTc2OA==","repeats":1},{"count":1776,"lower_bound":"MTc2OQ==","upper_bound":"MTc3Ng==","repeats":1},{"count":1784,"lower_bound":"MTc3Nw==","upper_bound":"MTc4NA==","repeats":1},{"count":1792,"lower_bound":"MTc4NQ==","upper_bound":"MTc5Mg==","repeats":1},{"count":1800,"lower_bound":"MTc5Mw==","upper_bound":"MTgwMA==","repeats":1},{"count":1808,"lower_bound":"MTgwMQ==","upper_bound":"MTgwOA==","repeats":1},{"count":1816,"lower_bound":"MTgwOQ==","upper_bound":"MTgxNg==","repeats":1},{"count":1824,"lower_bound":"MTgxNw==","upper_bound":"MTgyNA==","repeats":1},{"count":1832,"lower_bound":"MTgyNQ==","upper_bound":"MTgzMg==","repeats":1},{"count":1840,"lower_bound":"MTgzMw==","upper_bound":"MTg0MA==","repeats":1},{"count":1848,"lower_bound":"MTg0MQ==","upper_bound":"MTg0OA==","repeats":1},{"count":1856,"lower_bound":"MTg0OQ==","upper_bound":"MTg1Ng==","repeats":1},{"count":1864,"lower_bound":"MTg1Nw==","upper_bound":"MTg2NA==","repeats":1},{"count":1872,"lower_bound":"MTg2NQ==","upper_bound":"MTg3Mg==","repeats":1},{"count":1880,"lower_bound":"MTg3Mw==","upper_bound":"MTg4MA==","repeats":1},{"count":1888,"lower_bound":"MTg4MQ==","upper_bound":"MTg4OA==","repeats":1},{"count":1896,"lower_bound":"MTg4OQ==","upper_bound":"MTg5Ng==","repeats":1},{"count":1904,"lower_bound":"MTg5Nw==","upper_bound":"MTkwNA==","repeats":1},{"count":1912,"lower_bound":"MTkwNQ==","upper_bound":"MTkxMg==","repeats":1},{"count":1920,"lower_bound":"MTkxMw==","upper_bound":"MTkyMA==","repeats":1},{"count":1928,"lower_bound":"MTkyMQ==","upper_bound":"MTkyOA==","repeats":1},{"count":1936,"lower_bound":"MTkyOQ==","upper_bound":"MTkzNg==","repeats":1},{"count":1944,"lower_bound":"MTkzNw==","upper_bound":"MTk0NA==","repeats":1},{"count":1952,"lower_bound":"MTk0NQ==","upper_bound":"MTk1Mg==","repeats":1},{"count":1960,"lower_bound":"MTk1Mw==","upper_bound":"MTk2MA==","repeats":1},{"count":1968,"lower_bound":"MTk2MQ==","upper_bound":"MTk2OA==","repeats":1},{"count":1976,"lower_bound":"MTk2OQ==","upper_bound":"MTk3Ng==","repeats":1},{"count":1984,"lower_bound":"MTk3Nw==","upper_bound":"MTk4NA==","repeats":1},{"count":1992,"lower_bound":"MTk4NQ==","upper_bound":"MTk5Mg==","repeats":1},{"count":1999,"lower_bound":"MTk5Mw==","upper_bound":"MTk5OQ==","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952032287752192},"ip":{"histogram":{"ndv":1912,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MDgyY3pyYUFIcQ==","repeats":1},{"count":13,"lower_bound":"MDg1YzE=","upper_bound":"MEg0","repeats":1},{"count":19,"lower_bound":"MElEd3RzaHp2YQ==","upper_bound":"MFFoOXo2TmJi","repeats":1},{"count":25,"lower_bound":"MFcyRTZCRVk4Zm96","upper_bound":"MFkzVklURGx1","repeats":1},{"count":31,"lower_bound":"MFpJbWZYN0pTalE4","upper_bound":"MGJaUmRsNWx0","repeats":1},{"count":37,"lower_bound":"MGY=","upper_bound":"MHBTcEdBbHNSMUph","repeats":1},{"count":43,"lower_bound":"MHQ=","upper_bound":"MHh0dnRJVA==","repeats":1},{"count":49,"lower_bound":"MQ==","upper_bound":"MTk3Z0Vq","repeats":1},{"count":55,"lower_bound":"MURuUExnQlA0cmpvUA==","upper_bound":"MU1HS0lKcXZvS2xSM2Q=","repeats":1},{"count":61,"lower_bound":"MVZB","upper_bound":"MVlneWI=","repeats":1},{"count":67,"lower_bound":"MVl1SQ==","upper_bound":"MWdJSnlJV243bQ==","repeats":1},{"count":73,"lower_bound":"MWdQ","upper_bound":"MW1nTUk2Tkk=","repeats":1},{"count":79,"lower_bound":"MXRMZ3c=","upper_bound":"MjJySzJkQXpT","repeats":1},{"count":85,"lower_bound":"Mjc3SUlVZXBHajls","upper_bound":"MkJq","repeats":1},{"count":91,"lower_bound":"MkNrU2tKTnBj","upper_bound":"MlFCOVFkOVg3RG0=","repeats":1},{"count":97,"lower_bound":"MlI=","upper_bound":"MlhIQ2hibnE=","repeats":1},{"count":103,"lower_bound":"MlhjV0cyaDBS","upper_bound":"MmJvSklWOXVoeEZ6","repeats":1},{"count":109,"lower_bound":"MmZTZWt5Rg==","upper_bound":"Mmt3bGZzYnk=","repeats":1},{"count":115,"lower_bound":"Mm90REU4eEg2Qmc=","upper_bound":"MnJJNWZ2","repeats":1},{"count":121,"lower_bound":"MnhU","upper_bound":"MzR5Yg==","repeats":1},{"count":127,"lower_bound":"M0pES2R0ekFyYw==","upper_bound":"M1I1aHpqOHRZYw==","repeats":1},{"count":133,"lower_bound":"M1JF","upper_bound":"M25CMnc=","repeats":1},{"count":139,"lower_bound":"M284ZzRobEtibw==","upper_bound":"M3VBY0U1dXdIS0Q=","repeats":1},{"count":145,"lower_bound":"M3ZSa1BVMWo4Vg==","upper_bound":"NA==","repeats":1},{"count":151,"lower_bound":"NDEz","upper_bound":"NEM=","repeats":1},{"count":157,"lower_bound":"NEVJU2dtaDdOdQ==","upper_bound":"NFJvVQ==","repeats":1},{"count":163,"lower_bound":"NFZFUE5z","upper_bound":"NGpvVQ==","repeats":1},{"count":169,"lower_bound":"NGxNV0E=","upper_bound":"NG9IblE=","repeats":1},{"count":175,"lower_bound":"NHNBQmU=","upper_bound":"NTdlUA==","repeats":1},{"count":181,"lower_bound":"NVI4VVRha3VJd2M=","upper_bound":"NVVoU1M3TVlFUWpC","repeats":1},{"count":187,"lower_bound":"NWFQbk9BU1c=","upper_bound":"NXlMM3RNakNtcHNZ","repeats":1},{"count":193,"lower_bound":"Ng==","upper_bound":"NjJydXRUeXRD","repeats":1},{"count":199,"lower_bound":"NjNTOWJZZnFm","upper_bound":"NkJxbXk=","repeats":1},{"count":205,"lower_bound":"NkJ3ekg2Z3lN","upper_bound":"NnUzWWRTZVd6","repeats":1},{"count":211,"lower_bound":"NnhacTVW","upper_bound":"NzRtZ08=","repeats":1},{"count":217,"lower_bound":"N0FQM2tsMEpY","upper_bound":"N054","repeats":1},{"count":223,"lower_bound":"N1B1UzFOOEJyQg==","upper_bound":"N2U=","repeats":1},{"count":229,"lower_bound":"N2Vlb3NuM01FVFp3MEtO","upper_bound":"N2ttNUdsc3lr","repeats":1},{"count":235,"lower_bound":"N20wNlpjNzgxQ3l2V3Nk","upper_bound":"N3ZNajUzcERQbDhyOA==","repeats":1},{"count":241,"lower_bound":"N3k=","upper_bound":"OA==","repeats":1},{"count":247,"lower_bound":"ODFORzc4","upper_bound":"OEMyR2FFTWJ2VGpa","repeats":1},{"count":253,"lower_bound":"OENrVVh4ZFNpRWQ5","upper_bound":"OEcxSXdNeA==","repeats":1},{"count":259,"lower_bound":"OEd1VnpvcGRV","upper_bound":"OFRWNFNFRQ==","repeats":1},{"count":265,"lower_bound":"OFU1dUZYT2ZFR3g=","upper_bound":"OFpQblZUeE5EQUps","repeats":1},{"count":271,"lower_bound":"OGRYNDNDd1JjdmRt","upper_bound":"OGtmOXhH","repeats":1},{"count":277,"lower_bound":"OGt2Mk9NYUl2Wm4=","upper_bound":"OHI=","repeats":1},{"count":285,"lower_bound":"OHMxREhXS2E=","upper_bound":"OQ==","repeats":2},{"count":291,"lower_bound":"OUJtQw==","upper_bound":"OWZkdnVGY0c=","repeats":1},{"count":297,"lower_bound":"OWpZVHhLQVJmcw==","upper_bound":"OWxuY2FNdUFRSGdES0w=","repeats":1},{"count":303,"lower_bound":"OW5YNDA=","upper_bound":"OXFs","repeats":1},{"count":309,"lower_bound":"OXJEMUVs","upper_bound":"OXRUNkVybnpUdQ==","repeats":1},{"count":315,"lower_bound":"OXVDT1U=","upper_bound":"QQ==","repeats":1},{"count":321,"lower_bound":"QTJKNFZvT2ZpRg==","upper_bound":"QTRZSlA2","repeats":1},{"count":327,"lower_bound":"QUpzd1lUVGx3YkM=","upper_bound":"QVY1","repeats":1},{"count":333,"lower_bound":"QVZvZ1ZLMU1WQ2NT","upper_bound":"QVlUZXo4V0hYTHpr","repeats":1},{"count":339,"lower_bound":"QWJZUzRLMjY3UDVlZg==","upper_bound":"QWYwbnZFdk9HdHdJM2M=","repeats":1},{"count":345,"lower_bound":"QW9Hcw==","upper_bound":"QXZNWGZyWmU3","repeats":1},{"count":351,"lower_bound":"QXdESTFoZDhK","upper_bound":"QjhqMXo3anBnbzFNY2VH","repeats":1},{"count":357,"lower_bound":"Qjl5N0hINGJVcg==","upper_bound":"QlFSbVc=","repeats":1},{"count":363,"lower_bound":"Qll3U3ljRmk=","upper_bound":"QmoxNzZYS3Nk","repeats":1},{"count":369,"lower_bound":"Qm5oMXlUdzU=","upper_bound":"QnM0N085alc=","repeats":1},{"count":375,"lower_bound":"Qw==","upper_bound":"Qzk1Mw==","repeats":1},{"count":383,"lower_bound":"Q0RqSVRMTUN2UTdN","upper_bound":"Q080SDJSblQ=","repeats":1},{"count":391,"lower_bound":"Q1NWTEdCbGxMb21wbg==","upper_bound":"Q2hS","repeats":1},{"count":401,"lower_bound":"Q2xqRlBPelA=","upper_bound":"RA==","repeats":2},{"count":409,"lower_bound":"RDRmRUdvREFG","upper_bound":"REIyOVAzTGtLSk5PUm8=","repeats":1},{"count":417,"lower_bound":"REQ2MGpZeg==","upper_bound":"RFZydjA=","repeats":1},{"count":425,"lower_bound":"RGNQdzNn","upper_bound":"RGw5","repeats":1},{"count":433,"lower_bound":"RHJWWU1oemtEc1U3","upper_bound":"RHo2","repeats":1},{"count":441,"lower_bound":"RHpLV2c=","upper_bound":"RUNtZW8=","repeats":1},{"count":449,"lower_bound":"RUVxNlRicVdpeW9i","upper_bound":"RU8weGpLR2o5cm51YXI=","repeats":1},{"count":457,"lower_bound":"RVRCMXRlRnU=","upper_bound":"RWk=","repeats":1},{"count":465,"lower_bound":"RXgxMTJmZER4","upper_bound":"RjI=","repeats":1},{"count":473,"lower_bound":"RjRoUUdUUk5Kcnpr","upper_bound":"RkZRWVVMYzVvU1dzSg==","repeats":1},{"count":481,"lower_bound":"Rk1LOTExRWZGV2Fk","upper_bound":"RmNqZVM3elFDaDM1","repeats":1},{"count":489,"lower_bound":"RmNrRnJG","upper_bound":"RnE0Q3FSdTlQTQ==","repeats":1},{"count":501,"lower_bound":"RndTalRGUw==","upper_bound":"Rw==","repeats":4},{"count":509,"lower_bound":"RzZwbEVIaVZZSmltMUp3","upper_bound":"R0h5R0NETlY=","repeats":1},{"count":517,"lower_bound":"R1BvZUw5cFlmWjRBeQ==","upper_bound":"R2JBT2tG","repeats":1},{"count":525,"lower_bound":"R2NUako2cFVKeHM=","upper_bound":"R3NN","repeats":1},{"count":533,"lower_bound":"R3Nr","upper_bound":"SDM=","repeats":1},{"count":541,"lower_bound":"SEdKb1U5Mg==","upper_bound":"SFc4bE5C","repeats":1},{"count":549,"lower_bound":"SGE=","upper_bound":"SGIzTlVjZW4=","repeats":1},{"count":557,"lower_bound":"SGdvclRqUTB4QXlzcw==","upper_bound":"SGg=","repeats":1},{"count":565,"lower_bound":"SGlxTkxGdg==","upper_bound":"SG9yNXQ=","repeats":1},{"count":575,"lower_bound":"SHIwd3NjMzB3Z2JGdFhD","upper_bound":"SQ==","repeats":2},{"count":583,"lower_bound":"STM3ckQ=","upper_bound":"SUg=","repeats":1},{"count":591,"lower_bound":"SU9iNEE=","upper_bound":"SVdN","repeats":1},{"count":599,"lower_bound":"SVk=","upper_bound":"SWxHb3U=","repeats":1},{"count":607,"lower_bound":"SXAycDVKNkNF","upper_bound":"Sg==","repeats":1},{"count":615,"lower_bound":"SjE=","upper_bound":"SkhmcXFJNg==","repeats":1},{"count":623,"lower_bound":"Sk1TdDZHQmc=","upper_bound":"SmtCVW8wU2E=","repeats":1},{"count":631,"lower_bound":"Smtra2w=","upper_bound":"S0FyZTVZRnI=","repeats":1},{"count":639,"lower_bound":"S0JKbmEwMlI=","upper_bound":"S01VMXBNRW1CZUQxWWxs","repeats":1},{"count":647,"lower_bound":"S1I=","upper_bound":"S2h5dUZpa2M=","repeats":1},{"count":655,"lower_bound":"S2o4Tm9WMHJFWHpQTUpV","upper_bound":"TA==","repeats":1},{"count":663,"lower_bound":"TDNuR0dybg==","upper_bound":"TDVy","repeats":1},{"count":671,"lower_bound":"TEN5eWk=","upper_bound":"TExhZmpDYw==","repeats":1},{"count":679,"lower_bound":"TFBFdjhVWDFmVQ==","upper_bound":"TFkwU3h6UzE5YTg=","repeats":1},{"count":687,"lower_bound":"TGZHZ3M=","upper_bound":"THY=","repeats":1},{"count":695,"lower_bound":"THdWWTlybnpDV09aVGdZ","upper_bound":"TUJlOGFSeWl0Rg==","repeats":1},{"count":703,"lower_bound":"TUVUT3NZdQ==","upper_bound":"TU1LaUhUdjFpdlcwcg==","repeats":1},{"count":711,"lower_bound":"TVBaag==","upper_bound":"TWFGNkxhTTJNMg==","repeats":1},{"count":719,"lower_bound":"TWg5SnA5cW9tekk=","upper_bound":"TW9HRU8=","repeats":1},{"count":727,"lower_bound":"TXNrN2NWc3ZNeQ==","upper_bound":"TjFIaUFDN1h4V2E=","repeats":1},{"count":735,"lower_bound":"TjJI","upper_bound":"TkNWYWJBbDNJRmpy","repeats":1},{"count":743,"lower_bound":"TkQ=","upper_bound":"Tk5KZg==","repeats":1},{"count":751,"lower_bound":"Tmh0TA==","upper_bound":"TnM=","repeats":1},{"count":763,"lower_bound":"TnlxTg==","upper_bound":"Tw==","repeats":5},{"count":771,"lower_bound":"TzdOZA==","upper_bound":"T1BKREd5dA==","repeats":1},{"count":779,"lower_bound":"T1ZIdWR5Smho","upper_bound":"T21CbkRsaVRqRHM=","repeats":1},{"count":787,"lower_bound":"T3Z4MFlKbUlyelM=","upper_bound":"UDA=","repeats":1},{"count":795,"lower_bound":"UDJ0QWEz","upper_bound":"UEoxQXNNQkZuWlVu","repeats":1},{"count":803,"lower_bound":"UE93OHBOOGg=","upper_bound":"UGJDcmYwNmMxdjBnVg==","repeats":1},{"count":811,"lower_bound":"UGZONTZI","upper_bound":"UG14UQ==","repeats":1},{"count":819,"lower_bound":"UHBkSXhRQ0RCU3VLQVds","upper_bound":"UHNU","repeats":1},{"count":827,"lower_bound":"UHZsQnAya2hk","upper_bound":"UUZ0WWdNcDc=","repeats":1},{"count":835,"lower_bound":"UU90N0NCS3pURHVFYU8=","upper_bound":"UWU5VmtwNFZ5Y2k=","repeats":1},{"count":843,"lower_bound":"UWdZSlZl","upper_bound":"UjRjU21ESW4=","repeats":1},{"count":851,"lower_bound":"Ujk=","upper_bound":"UkdBbnpVMg==","repeats":1},{"count":859,"lower_bound":"Uk4yNXFKQnhR","upper_bound":"UlRVNUR2QQ==","repeats":1},{"count":867,"lower_bound":"UllEbWpSNm1B","upper_bound":"UnJwd2tLQmRnWg==","repeats":1},{"count":875,"lower_bound":"UnRCT25IaHhs","upper_bound":"UndJ","repeats":1},{"count":883,"lower_bound":"UnhYbW5FU050bTVQ","upper_bound":"UzU1","repeats":1},{"count":891,"lower_bound":"Uzdma1huSUVDbw==","upper_bound":"U0xENmNMRDcwVw==","repeats":1},{"count":899,"lower_bound":"U0xxakhwNTZTVER3","upper_bound":"U1JlYU5GazA=","repeats":1},{"count":907,"lower_bound":"U1NqZm5jcm1SSnc2","upper_bound":"U2R5SUM=","repeats":1},{"count":915,"lower_bound":"U2ZB","upper_bound":"U3FGZnRweWlxdFdGYWY=","repeats":1},{"count":923,"lower_bound":"U3NMbW0yWUkwTw==","upper_bound":"VDdJcmFGMg==","repeats":1},{"count":931,"lower_bound":"VEVQeEE=","upper_bound":"VFN3bjNSQmU4VXdm","repeats":1},{"count":939,"lower_bound":"VFRQRUpVV3VseE8=","upper_bound":"VGRoNFdPYjI=","repeats":1},{"count":947,"lower_bound":"VGk5RXRoSGFncFho","upper_bound":"VGxiZWdGbHY=","repeats":1},{"count":955,"lower_bound":"VHBsWFdIRHZlVTVU","upper_bound":"VHZjZXVF","repeats":1},{"count":963,"lower_bound":"VHkwc2owRURRTkxqY1c3","upper_bound":"VUFZMXZQODRCdVpa","repeats":1},{"count":971,"lower_bound":"VUxOekp4b2M4VnhnSFZu","upper_bound":"VVVGQU1kTQ==","repeats":1},{"count":979,"lower_bound":"VVVLZkFvZGE=","upper_bound":"VVl6RlU=","repeats":1},{"count":987,"lower_bound":"VWJBU1daaQ==","upper_bound":"VWd3WktUMkxH","repeats":1},{"count":995,"lower_bound":"VXdoeQ==","upper_bound":"VjRGVA==","repeats":1},{"count":1003,"lower_bound":"VjVEWlY=","upper_bound":"VklMMUc5Zg==","repeats":1},{"count":1011,"lower_bound":"VkpoeVV6cDF5dQ==","upper_bound":"VmRwUHpIdWl1SFg=","repeats":1},{"count":1019,"lower_bound":"VmdKZjVvbXEwVjBvNVJT","upper_bound":"Vw==","repeats":1},{"count":1027,"lower_bound":"VzVMUkpSRXJZ","upper_bound":"Vzh1NnlCbHFiTDlyaks=","repeats":1},{"count":1035,"lower_bound":"V0N0MUxRSnFVdEM=","upper_bound":"V2Q=","repeats":1},{"count":1043,"lower_bound":"V2xv","upper_bound":"V3pscTYw","repeats":1},{"count":1051,"lower_bound":"WDg5","upper_bound":"WEtxSHdLdQ==","repeats":1},{"count":1059,"lower_bound":"WFFxZGM0aURpV3VKeg==","upper_bound":"WGd4SmlIRFR1OFlv","repeats":1},{"count":1067,"lower_bound":"WHV1RERFdHRH","upper_bound":"WUM=","repeats":1},{"count":1075,"lower_bound":"WVZHcXJmRlVrRUhXZw==","upper_bound":"WXFCWVo5SXE=","repeats":1},{"count":1083,"lower_bound":"Wg==","upper_bound":"WjFCTGN3bGZh","repeats":1},{"count":1091,"lower_bound":"WjNaVm1QNTRpeFl1Vw==","upper_bound":"Wk1IeA==","repeats":1},{"count":1099,"lower_bound":"Wk1XWFRVeA==","upper_bound":"WlZib05L","repeats":1},{"count":1107,"lower_bound":"Wlc=","upper_bound":"YQ==","repeats":1},{"count":1115,"lower_bound":"YTNWRXVJYXNDRUc=","upper_bound":"YUdzV2JZTWdyRkRY","repeats":1},{"count":1123,"lower_bound":"YUpkWHo=","upper_bound":"YVNvRTBpQUdkbQ==","repeats":1},{"count":1131,"lower_bound":"YVVDendOOHhRcUdURDRo","upper_bound":"YWRSOG1ycENt","repeats":1},{"count":1139,"lower_bound":"YWZCWFFMTjlPcEFo","upper_bound":"YW45dEhERGNybXY=","repeats":1},{"count":1147,"lower_bound":"YXFORTFzaEM=","upper_bound":"YkRPYkY5aVZtY3dFUGQ=","repeats":1},{"count":1155,"lower_bound":"Yk5RYm5aRHpxZGlhTg==","upper_bound":"YlVHeExNWDEycHBu","repeats":1},{"count":1163,"lower_bound":"YlY=","upper_bound":"Ym9uVVl5cUdx","repeats":1},{"count":1171,"lower_bound":"YnA3Q1NZaGtqaGpZUmg=","upper_bound":"YzRnSzkzd2xvOHU=","repeats":1},{"count":1179,"lower_bound":"Y0Y5NHV5Z0w=","upper_bound":"Y0tWdG52QVVYQ04=","repeats":1},{"count":1187,"lower_bound":"Y05TV0w=","upper_bound":"Y1Y=","repeats":1},{"count":1195,"lower_bound":"Y1YwVmdtbUVINQ==","upper_bound":"Y2JPM3Exag==","repeats":1},{"count":1203,"lower_bound":"Y2Ra","upper_bound":"Y3ViclRqQ0tuZDA=","repeats":1},{"count":1211,"lower_bound":"Y3hSeEZ1Qk9meGI2WWJY","upper_bound":"ZDhz","repeats":1},{"count":1219,"lower_bound":"ZDlBeA==","upper_bound":"ZEdYakdadUVydjA=","repeats":1},{"count":1227,"lower_bound":"ZE5zdXN6MktsckpsU0U=","upper_bound":"ZHVyZ21BQw==","repeats":1},{"count":1235,"lower_bound":"ZHdVanB3aQ==","upper_bound":"ZQ==","repeats":1},{"count":1243,"lower_bound":"ZTdyZjA=","upper_bound":"ZWF3Q0dGQXlXaDM5UQ==","repeats":1},{"count":1251,"lower_bound":"ZWI=","upper_bound":"ZWRZRFhBOW5Vb3c=","repeats":1},{"count":1259,"lower_bound":"ZWZoNDdzaXFONw==","upper_bound":"ZjBBalIyaFo=","repeats":1},{"count":1267,"lower_bound":"ZjI=","upper_bound":"ZkpxU2I1eGU=","repeats":1},{"count":1275,"lower_bound":"ZlVMTjc0Nm5NbTJpdE8=","upper_bound":"ZmM=","repeats":1},{"count":1283,"lower_bound":"ZmM4YkJiaHlG","upper_bound":"ZmkwTXR6a3Jrd2Nz","repeats":1},{"count":1291,"lower_bound":"ZmpYdA==","upper_bound":"Zw==","repeats":1},{"count":1299,"lower_bound":"ZzBEU0J2Z1o=","upper_bound":"ZzZNbFE0","repeats":1},{"count":1307,"lower_bound":"Zzg1c2JlVW56","upper_bound":"Z0s0M3RXSGhqWg==","repeats":1},{"count":1315,"lower_bound":"Z0tMelVOSXpIeA==","upper_bound":"Z1F4Y3ZieQ==","repeats":1},{"count":1323,"lower_bound":"Z1NVYkU=","upper_bound":"Z2d4TA==","repeats":1},{"count":1331,"lower_bound":"Z20=","upper_bound":"Z3RidFlUblhyeA==","repeats":1},{"count":1339,"lower_bound":"Z3gyQjJ4","upper_bound":"aDY=","repeats":1},{"count":1347,"lower_bound":"aDZScg==","upper_bound":"aDlOUXJSbllFYg==","repeats":1},{"count":1355,"lower_bound":"aEEzVG43SjQ=","upper_bound":"aEs=","repeats":1},{"count":1363,"lower_bound":"aExNREEx","upper_bound":"aFRiN0M=","repeats":1},{"count":1371,"lower_bound":"aFZxcUl6S28=","upper_bound":"aFlXSDExWU4x","repeats":1},{"count":1379,"lower_bound":"aGtjNHRmUnpwYXRJ","upper_bound":"aHQ4WVczUHpPZw==","repeats":1},{"count":1387,"lower_bound":"aHUzYmVVNkFGWlpKRQ==","upper_bound":"aUFCQw==","repeats":1},{"count":1395,"lower_bound":"aUJpU2VxdXc5Sw==","upper_bound":"aU1nMWFmVGNCQXg2","repeats":1},{"count":1403,"lower_bound":"aVF6OA==","upper_bound":"aWJBYWk0eVc0","repeats":1},{"count":1411,"lower_bound":"aWhONXowV0U4TlZYWDN1","upper_bound":"aXd3U2wxcnV1aU0xSVc=","repeats":1},{"count":1419,"lower_bound":"akFWajhFTktpODZVUg==","upper_bound":"akxPY3FZblRZa2FQWUg=","repeats":1},{"count":1427,"lower_bound":"ak1v","upper_bound":"alM4WGd2TUdD","repeats":1},{"count":1435,"lower_bound":"alZrUlFVUkFMOUZG","upper_bound":"amJCUkg=","repeats":1},{"count":1443,"lower_bound":"amcya1BVT3NZ","upper_bound":"am9LeFJjdjFhZnFqbUpG","repeats":1},{"count":1451,"lower_bound":"andUbDZ3Y2dT","upper_bound":"azF2ZnVJWlE=","repeats":1},{"count":1459,"lower_bound":"azJNVFNPSXJLZ3JGdA==","upper_bound":"a01CTlQ5Q1Y=","repeats":1},{"count":1467,"lower_bound":"a1F5UmI3YQ==","upper_bound":"a1g3ck5iVWhoWmJ1","repeats":1},{"count":1475,"lower_bound":"a2FWNUhqWWtSMm5PSkc=","upper_bound":"a3E5UEt6R3Rqc1dkbA==","repeats":1},{"count":1483,"lower_bound":"a3FSdEY=","upper_bound":"bA==","repeats":2},{"count":1491,"lower_bound":"bDBMNUJj","upper_bound":"bDlwUE0=","repeats":1},{"count":1499,"lower_bound":"bEJNSjc=","upper_bound":"bFF3cUEzNnBROEQ=","repeats":1},{"count":1507,"lower_bound":"bFJEbVM1SkozWQ==","upper_bound":"bFRHTng=","repeats":1},{"count":1515,"lower_bound":"bFZJTVpGag==","upper_bound":"bGJNUFBtZFp0","repeats":1},{"count":1523,"lower_bound":"bGVTS21ZT09RUg==","upper_bound":"bGl3Ynd6TkJZ","repeats":1},{"count":1531,"lower_bound":"bGt4UU0=","upper_bound":"bHNsWg==","repeats":1},{"count":1539,"lower_bound":"bHdjYzhRNnF4","upper_bound":"bUNJdTd1dQ==","repeats":1},{"count":1547,"lower_bound":"bUliYTk=","upper_bound":"bVE=","repeats":1},{"count":1555,"lower_bound":"bVU2VQ==","upper_bound":"bWlkbDJRN3ZWMjc=","repeats":1},{"count":1563,"lower_bound":"bW5Pcg==","upper_bound":"bjJ2aDdobXdoTHQ=","repeats":1},{"count":1571,"lower_bound":"bjU4Mw==","upper_bound":"bkNJNjY=","repeats":1},{"count":1579,"lower_bound":"bk41emxtNjlEOVRKTg==","upper_bound":"blRXWHVBejk=","repeats":1},{"count":1587,"lower_bound":"bllRbWhpdlZ4TkdGejlh","upper_bound":"bm5CNUMwQ1M1czdjeUw=","repeats":1},{"count":1595,"lower_bound":"bm56M0dp","upper_bound":"bnlndWJQaQ==","repeats":1},{"count":1603,"lower_bound":"bnoyTkZvUGZt","upper_bound":"bw==","repeats":2},{"count":1611,"lower_bound":"bzFFcWZi","upper_bound":"bzk5WGs=","repeats":1},{"count":1619,"lower_bound":"b0ZOeVBGeUJROE01","upper_bound":"b1RsYw==","repeats":1},{"count":1627,"lower_bound":"b1hRWnAybw==","upper_bound":"b2NJZ2RtZ20xenBpUWw=","repeats":1},{"count":1635,"lower_bound":"b2NlU2k=","upper_bound":"b2pvS2U=","repeats":1},{"count":1643,"lower_bound":"b2s2QjE5","upper_bound":"b3oyclg=","repeats":1},{"count":1651,"lower_bound":"cDF3NTdGSG8=","upper_bound":"cEc1Tjg5Vmt3ag==","repeats":1},{"count":1659,"lower_bound":"cEpQYVZ1b3VQ","upper_bound":"cEw5N0tjOUVLNQ==","repeats":1},{"count":1667,"lower_bound":"cE5KYm03c210V1d6eXU=","upper_bound":"cGQ3TjQ=","repeats":1},{"count":1675,"lower_bound":"cG56aU1jUGszdzdLeA==","upper_bound":"cHNoYjVwUA==","repeats":1},{"count":1683,"lower_bound":"cQ==","upper_bound":"cURnb3dw","repeats":1},{"count":1691,"lower_bound":"cUZX","upper_bound":"cUt3eFVscFQ1UlJLZzk=","repeats":1},{"count":1699,"lower_bound":"cUxtTkU=","upper_bound":"cVU=","repeats":1},{"count":1707,"lower_bound":"cVUzN3o1MWRJbXJjdHBo","upper_bound":"cWpHb09MOWVVd0NCeQ==","repeats":1},{"count":1715,"lower_bound":"cWtYT2FIZU5Fblg3R3M=","upper_bound":"cXlUQw==","repeats":1},{"count":1723,"lower_bound":"cg==","upper_bound":"ckVRdzF0VA==","repeats":1},{"count":1731,"lower_bound":"ck11","upper_bound":"clhheFNyS0k2UE81QTNJ","repeats":1},{"count":1739,"lower_bound":"cmMwVkYx","upper_bound":"cm9jbXc3OHlX","repeats":1},{"count":1749,"lower_bound":"cnBJdFZ1OVUzQQ==","upper_bound":"cw==","repeats":2},{"count":1757,"lower_bound":"czV1WlI=","upper_bound":"c1BJeg==","repeats":1},{"count":1765,"lower_bound":"c2FVRg==","upper_bound":"c3FrTFIzajk=","repeats":1},{"count":1773,"lower_bound":"c3MybVZNM3JMelF0VUx1","upper_bound":"c3lIMUpsbA==","repeats":1},{"count":1781,"lower_bound":"dA==","upper_bound":"dDRzVTVEaEdBbWZadQ==","repeats":1},{"count":1789,"lower_bound":"dEZBcUxTb1kxb1k5bHQ=","upper_bound":"dE5y","repeats":1},{"count":1797,"lower_bound":"dFUyWVdpWVN0cA==","upper_bound":"dGJ5aFoxeldaNGp2QQ==","repeats":1},{"count":1805,"lower_bound":"dGZNOUVSSXUwM3VVNXpG","upper_bound":"dHRpZw==","repeats":1},{"count":1815,"lower_bound":"dHRrZzc=","upper_bound":"dQ==","repeats":3},{"count":1823,"lower_bound":"dThrZw==","upper_bound":"dVJSY3E=","repeats":1},{"count":1831,"lower_bound":"dVNNZU10STdL","upper_bound":"dWFselVTSkE1ejZh","repeats":1},{"count":1839,"lower_bound":"dWxGZndPcFNWWTQ=","upper_bound":"dg==","repeats":2},{"count":1847,"lower_bound":"djFnV3ZUaw==","upper_bound":"dkQzb09Q","repeats":1},{"count":1855,"lower_bound":"dkhoN285OWJY","upper_bound":"dlNzaHdNUXpOTA==","repeats":1},{"count":1863,"lower_bound":"dlZiT1M=","upper_bound":"dm4yZQ==","repeats":1},{"count":1871,"lower_bound":"dnBrWUVMOXA=","upper_bound":"d0I4SUxsRUIxejVSVg==","repeats":1},{"count":1879,"lower_bound":"d0hMYk5BZVkweW1rMmY=","upper_bound":"d014SlNCYnd1bXph","repeats":1},{"count":1887,"lower_bound":"d1BOYWU0WHdEaGc0U05p","upper_bound":"d1F3WmdFY2NCRnozNw==","repeats":1},{"count":1895,"lower_bound":"d1VoZTR6aWo=","upper_bound":"d2xQ","repeats":1},{"count":1903,"lower_bound":"d3BrM0FSYlRZ","upper_bound":"eDRWY2E1Vg==","repeats":1},{"count":1911,"lower_bound":"eDdFUmVr","upper_bound":"eEswTXBNeUZaUFI1eQ==","repeats":1},{"count":1919,"lower_bound":"eFdtZTZWajRURjA=","upper_bound":"eGcySU0=","repeats":1},{"count":1927,"lower_bound":"eGlBWUh6aEx1MTRYT0w4","upper_bound":"eHE=","repeats":1},{"count":1941,"lower_bound":"eHN2cmJEWEFj","upper_bound":"eQ==","repeats":5},{"count":1949,"lower_bound":"eTA=","upper_bound":"eTVseTJaZQ==","repeats":1},{"count":1957,"lower_bound":"eTlzS0lXdThScnY5","upper_bound":"eUVEdw==","repeats":1},{"count":1965,"lower_bound":"eUg=","upper_bound":"eVcwTDZjUHdzYQ==","repeats":1},{"count":1973,"lower_bound":"eWNrblF0RldTY1JDR3Rs","upper_bound":"eWVGZVpQR1hndg==","repeats":1},{"count":1981,"lower_bound":"eWhjbEFHSk1FdEhlQg==","upper_bound":"eXBhUjdhaUQ=","repeats":1},{"count":1989,"lower_bound":"eXl2N05XVk9neQ==","upper_bound":"elJURkk=","repeats":1},{"count":1997,"lower_bound":"emFnejg4","upper_bound":"em9RazV1WjFKSA==","repeats":1},{"count":1999,"lower_bound":"enRWUk9TeDM5MTY=","upper_bound":"enRWUk9TeDM5MTY=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,1,0,0,1,1,1,2,2,2,2,1,2,0,0,1,1,2,0,2,1,1,3,0,0,0,3,0,2,0,2,0,1,1,1,1,1,0,1,1,0,2,0,2,1,1,1,1,0,1,2,0,2,0,0,2,0,2,0,0,2,0,4,3,1,2,1,0,0,1,0,0,2,0,1,0,2,2,1,2,1,1,1,1,1,0,0,0,0,1,0,2,1,7,1,1,1,3,1,0,0,1,2,0,3,0,2,0,3,1,1,3,2,1,0,2,1,1,1,1,3,0,2,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,1,1,1,2,2,1,1,0,0,1,1,0,0,0,1,1,0,0,2,0,1,0,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,3,1,1,1,1,0,1,1,1,2,0,0,3,0,1,3,0,2,1,1,2,1,3,0,1,2,2,0,2,1,0,0,1,0,1,1,2,1,0,1,2,0,1,1,1,0,1,2,1,3,2,1,0,2,0,0,1,0,1,0,2,4,1,2,0,2,1,0,0,0,2,1,2,2,1,0,0,0,1,1,2,0,3,4,1,1,1,0,0,2,2,1,1,0,1,1,0,2,0,1,0,0,0,0,1,1,1,1,0,0,0,2,0,1,1,1,1,0,2,0,1,1,0,0,1,0,0,0,0,1,2,2,1,0,0,0,2,1,0,1,5,3,0,2,4,1,1,2,2,0,3,1,1,0,2,1,0,2,2,0,1,3,1,0,1,1,1,0,3,1,1,1,0,0,2,1,1,5,1,3,1,1,1,0,1,2,1,0,0,0,1,0,0,8,0,1,0,2,1,0,1,0,1,2,0,1,1,1,2,0,2,2,1,1,1,0,0,1,2,1,0,1,1,0,4,0,2,1,0,0,1,2,1,0,1,1,1,1,2,0,2,2,0,1,1,2,2,0,1,0,2,2,0,4,0,2,0,0,1,1,0,0,1,0,1,0,3,0,1,0,0,1,3,0,0,0,0,3,0,2,0,0,0,1,1,3,0,1,1,0,1,1,0,1,1,3,2,1,2,3,1,2,1,0,2,1,3,0,0,2,0,1,3,0,0,0,1,1,1,3,0,1,0,2,3,0,2,1,0,1,0,0,1,1,1,4,0,2,1,0,1,0,1,0,1,1,0,1,1,3,1,0,0,4,0,0,0,1,1,2,1,3,1,2,0,1,4,2,2,1,1,0,1,3,2,1,0,1,0,3,1,0,1,1,0,1,1,2,1,0,0,0,0,1,0,1,0,1,0,1,0,0,1,0,0,2,0,0,2,0,1,1,0,1,0,0,0,0,0,3,0,3,1,1,0,1,3,0,0,1,1,1,1,1,3,1,1,1,0,1,2,1,0,2,0,0,0,0,1,0,1,0,2,0,1,1,0,2,2,0,1,0,0,1,0,1,0,1,0,1,2,1,0,0,1,0,1,2,1,6,0,0,0,1,2,2,1,1,1,0,2,0,2,2,2,3,0,0,0,1,1,1,3,4,0,0,0,3,1,3,1,2,0,0,2,0,3,0,1,1,0,0,0,0,2,1,0,2,1,2,2,0,0,1,0,1,2,0,0,1,4,1,1,0,0,0,1,2,2,3,0,0,2,1,1,0,0,0,1,0,0,3,0,1,1,2,1,1,0,0,1,1,4,1,1,0,0,1,0,1,1,1,0,1,1,1,2,1,1,0,1,0,0,0,2,1,0,1,1,1,0,1,1,1,4,1,1,1,0,0,1,2,2,0,1,0,2,1,3,1,1,1,0,0,2,2,1,0,2,0,0,0,1,0,2,0,0,1,0,0,0,0,1,2,1,1,2,1,1,3,0,0,1,3,0,2,2,1,1,2,0,0,1,1,1,3,1,0,0,0,2,1,1,2,0,0,1,0,1,2,0,0,1,2,0,2,1,2,1,0,0,0,2,0,0,2,1,0,0,0,0,0,0,0,2,0,1,0,0,1,0,3,1,1,0,0,1,1,0,0,2,1,1,0,0,1,1,0,1,1,2,0,0,1,1,0,5,0,1,1,0,2,1,2,2,0,0,1,1,1,1,2,0,2,2,0,1,2,2,0,2,0,1,0,2,0,0,1,0,0,4,1,1,0,1,2,0,1,0,0,0,1,1,1,1,4,3,1,0,2,1,2,1,1,0,0,1,0,0,1,1,1,0,0,2,1,0,0,1,0,2,2,1,2,0,3,0,2,1,2,0,0,0,6,0,1,2,1,0,3,0,3,1,1,1,0,0,1,2,1,1,1,0,1,2,2,0,0,0,0,2,1,1,0,0,0,0,0,4,0,0,0,1,1,1,1,0,2,0,2,3,0,2,0,0,0,2,2,3,1,0,0,0,2,0,1,1,0,1,0,0,0,1,1,0,2,0,0,0,0,2,0,2,3,3,1,1,1,1,0,0,1,0,2,1,1,0,1,0,1,0,0,3,0,0,1,1,1,1,2,0,0,1,1,1,1,0,4,0,0,2,0,0,0,1,0,0,2,0,2,2,0,2,2,0,0,1,1,2,3,1,3,0,2,2,1,0,0,0,1,1,0,2,1,0,3,0,3,1,0,1,0,1,2,2,0,1,0,1,0,2,2,1,0,1,1,1,1,1,0,1,0,1,1,0,1,1,3,0,1,1,1,1,1,1,2,0,1,0,0,2,1,0,2,2,1,1,1,1,0,1,0,1,1,1,3,2,1,4,1,0,0,1,0,0,0,3,3,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,2,0,0,1,1,2,1,1,1,1,1,1,0,2,0,3,0,1,0,3,0,2,0,4,2,1,5,0,0,1,1,1,0,0,2,3,3,0,2,0,2,0,1,0,1,2,1,0,0,2,0,0,1,0,0,0,2,2,1,1,0,2,1,1,2,2,0,3,0,0,0,0,1,2,0,0,1,1,1,0,0,0,3,0,0,0,0,2,2,0,3,1,0,0,2,0,0,1,1,2,0,2,1,1,2,1,1,2,1,2,2,0,0,1,2,0,0,2,1,1,1,0,0,1,0,3,1,2,1,0,1,0,0,1,1,2,1,0,1,2,0,1,0,3,1,1,1,6,1,0,1,2,1,3,0,0,3,1,1,2,1,0,1,0,2,0,0,0,2,3,0,2,1,0,1,3,1,0,3,0,0,2,1,2,0,3,1,2,2,0,2,1,1,2,1,0,1,0,0,2,0,2,1,1,0,1,0,0,1,1,1,3,1,1,2,0,0,3,0,1,0,1,0,0,2,2,0,2,0,3,2,2,3,1,0,0,3,0,2,1,0,0,2,0,0,0,0,0,1,2,0,0,1,2,0,1,1,0,0,2,1,0,3,1,2,0,1,0,1,0,1,0,2,2,0,1,3,1,2,2,1,2,0,2,0,1,0,0,1,0,0,1,2,1,2,0,2,0,1,1,0,1,1,2,2,1,0,0,2,3,2,2,1,0,1,2,1,1,2,0,1,2,1,1,0,0,0,1,3,0,9,1,2,1,2,4,3,2,4,0,0,2,3,0,1,1,0,1,4,0,0,4,2,0,0,0,1,0,0,1,0,0,3,0,0,0,2,1,2,0,0,0,2,1,6,0,3,1,2,2,0,0,1,1,0,0,2,0,1,1,0,0,0,0,0,0,0,1,2,2,1,0,0,3,1,1,4,0,1,2,2,2,0,2,0,2,1,0,1,2,0,0,0,2,0,2,0,0,0,2,1,0,2,1,0,2,3,1,0,0,1,0,1,1,1,0,0,1,2,1,1,0,2,3,3,1,0,1,1,3,0,1,1,1,1,0,0,0,3,0,1,1,1,1,1,0,1,0,1,1,0,0,0,1,0,1,1,0,1,1,1,2,1,1,0,0,2,1,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,1,1,1,0,1,0,0,1,1,1,0,0,1,0,0,0,5,1,1,0,0,0,1,1,2,3,0,0,1,1,1,2,1,3,2,1,2,0,2,2,1,2,0,0,1,0,0,4,2,1,0,0,1,1,1,1,3,3,4,0,0,2,0,0,1,0,2,1,2,0,0,2,3,2,1,0,1,0,0,2,0,1,1,2,2,0,0,0,0,0,1,1,1,1,1,0,2,1,2,4,3,1,2,1,2,0,1,1,0,3,1,2,0,2,2,2,0,1,0,0,0,1,1,2,0,0,0,0,2,0,2,0,1,2,1,0,1,1,1,2,1,1,0,2,1,0,1,0,1,0,9,0,1,0,0,0,0,1,1,2,1,0,0,2,0,0,1,1,1,1,0,0,2,0,1,0,0,5,0,1,2,2,1,0,5,2,0,0,0,2,1,1,0,0,2,1,0,1,0,1,0,1,0,0,2,1,3,2,2,1,1,1,0,0,1,0,1,3,0,1,1,1,1,4,1,0,0,0,2,0,2,1,3,0,1,1,1,1,1,1,1,2,1,2,0,0,1,1,1,1,1,0,2,0,1,1,3,3,1,0,0,0,1,1,1,0,1,0,0,1,2,1,0,0,2,1,0,0,3,0,2,1,0]},{"counters":[2,0,1,1,1,2,0,1,0,0,4,1,2,1,2,2,0,2,2,4,0,2,1,2,3,0,2,0,0,0,0,1,2,0,0,0,2,1,0,1,5,1,0,0,0,1,6,0,0,1,0,1,0,1,1,7,1,2,2,1,0,3,0,0,4,1,0,1,0,2,0,0,0,1,3,1,2,0,2,2,1,0,1,1,0,2,1,1,0,1,3,0,0,1,1,1,0,0,1,0,1,0,1,3,0,0,2,2,0,1,2,1,1,0,1,2,1,2,3,0,1,1,0,1,1,0,0,0,0,2,1,0,0,0,2,0,0,0,1,2,1,0,1,1,1,3,1,1,1,1,2,0,0,1,1,0,1,0,0,0,2,2,1,0,1,0,1,0,1,1,2,1,1,0,1,1,0,0,2,1,0,0,1,4,2,1,2,2,2,1,2,0,0,0,1,1,2,1,1,0,2,0,0,1,2,1,1,0,0,2,1,0,0,2,0,1,0,1,2,2,1,1,1,0,1,1,0,2,1,0,0,0,0,0,0,0,0,1,0,0,1,2,1,2,2,2,1,1,0,3,3,2,4,0,3,1,1,1,0,1,0,0,2,3,3,1,1,1,1,0,1,0,2,0,1,2,0,1,2,1,2,0,1,0,0,1,0,1,6,4,0,0,2,0,3,2,1,1,1,0,2,0,0,1,0,1,0,0,1,0,1,1,2,0,1,1,0,1,0,0,2,1,0,1,3,1,0,0,2,0,2,1,0,0,1,3,2,0,2,0,0,1,1,0,0,1,3,2,1,0,1,2,0,1,1,0,0,0,0,1,1,0,1,1,2,1,0,0,2,0,1,1,0,2,2,0,2,1,1,0,2,0,0,0,0,0,2,0,1,2,3,0,3,1,0,1,2,1,0,1,0,0,0,0,1,2,1,3,5,1,1,2,1,1,3,2,2,1,2,2,1,1,1,0,1,1,0,0,2,1,3,6,0,1,0,3,1,2,0,1,0,1,0,0,0,0,0,0,3,1,3,0,0,0,1,0,1,2,0,1,1,1,2,2,1,1,7,0,1,1,1,1,1,0,0,0,1,2,1,1,1,1,0,1,3,0,0,1,1,2,0,0,0,1,0,1,0,0,1,1,0,2,0,1,0,1,0,0,0,1,2,3,0,1,1,2,0,0,0,0,3,1,0,2,0,0,0,0,1,1,1,1,0,0,0,0,1,0,0,1,0,0,3,3,0,0,0,1,2,2,1,1,0,0,2,0,1,0,4,3,1,2,0,1,0,1,1,1,1,0,0,0,2,1,1,0,1,0,1,0,0,0,0,0,1,0,2,1,1,0,0,0,1,1,0,0,1,0,0,3,0,1,2,0,0,1,0,1,0,2,0,2,2,1,3,0,0,3,1,2,2,2,1,2,0,0,0,0,2,2,2,0,1,0,0,1,1,1,0,1,1,0,0,0,0,1,0,0,1,0,1,2,0,2,4,2,1,1,0,1,0,2,7,1,0,4,1,0,1,0,0,1,0,1,1,2,0,0,1,4,0,0,0,0,0,2,0,4,0,2,0,0,0,1,1,2,2,1,1,0,0,0,0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,2,1,0,2,2,1,2,1,0,1,0,1,0,2,1,1,2,1,1,1,1,0,0,0,5,1,2,0,0,3,1,1,0,2,0,0,0,0,0,0,1,2,1,0,3,2,1,4,0,2,1,1,4,0,0,4,2,1,1,0,1,1,2,2,1,2,0,0,0,2,1,2,0,0,0,4,0,0,0,3,1,1,2,0,0,0,0,1,1,1,0,2,1,0,1,1,0,0,1,0,2,1,0,2,3,1,2,1,0,0,1,2,0,1,1,3,2,1,2,0,0,1,2,2,2,0,1,0,0,0,3,1,3,1,0,0,1,3,2,0,0,0,1,0,0,6,2,1,1,2,2,0,2,0,0,1,1,0,2,2,0,0,4,0,0,0,1,3,1,0,0,1,1,0,1,1,0,0,0,2,2,0,0,3,1,2,0,2,0,2,0,3,3,1,0,4,2,2,1,1,2,3,2,0,0,3,2,0,1,0,2,0,0,0,1,2,0,0,0,0,1,0,2,0,1,1,0,0,1,1,2,1,1,1,0,1,0,2,0,0,0,2,0,2,0,1,0,0,1,2,3,1,2,0,1,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,1,2,0,1,0,2,0,0,0,4,0,2,3,1,2,0,1,1,0,1,0,2,1,2,2,3,1,1,2,2,1,2,2,0,1,1,1,1,2,0,1,2,2,2,1,0,2,2,1,0,5,0,0,0,0,1,2,2,1,0,0,1,2,2,0,0,0,0,1,1,1,2,0,0,2,1,1,0,1,2,1,1,1,1,0,0,1,1,1,0,1,0,2,0,0,1,1,1,0,3,2,2,0,0,1,1,1,1,0,0,3,1,2,0,3,0,2,1,1,1,3,0,0,1,0,3,1,2,3,2,1,0,0,1,0,0,1,2,3,1,0,1,1,3,1,1,0,1,1,1,0,1,0,0,2,1,0,0,0,5,1,0,0,1,0,1,0,1,0,0,2,0,3,0,2,2,0,2,0,0,1,1,0,0,1,0,0,1,2,0,1,2,3,2,3,0,2,0,1,0,0,0,1,1,3,1,2,0,1,3,1,0,0,1,0,1,1,1,1,0,2,2,0,2,0,0,0,0,1,2,2,1,2,1,0,1,2,0,3,3,0,1,1,1,0,1,0,0,0,0,1,0,0,0,2,2,1,1,0,1,0,0,0,2,0,0,0,0,0,2,1,1,0,0,1,0,1,1,0,0,0,1,0,1,1,1,0,4,0,0,0,0,1,2,0,2,2,2,0,0,2,0,0,1,0,0,2,2,2,0,1,7,1,1,2,1,1,4,1,2,0,0,1,0,2,2,0,0,1,0,0,0,0,0,0,4,3,0,1,4,1,2,0,0,0,0,0,1,2,1,2,1,2,0,1,0,0,1,0,0,1,2,2,0,1,3,0,0,0,3,1,0,2,0,0,0,1,1,2,1,1,1,2,0,2,0,3,1,0,0,2,4,0,1,2,2,2,1,2,2,2,0,1,3,1,0,0,1,1,1,1,3,1,1,0,1,0,1,1,2,0,0,0,1,1,2,1,3,0,0,0,0,0,0,1,2,0,0,0,0,1,0,2,0,0,1,5,1,0,1,0,1,1,0,3,0,1,2,0,2,0,0,0,1,0,3,3,0,1,1,0,1,1,1,0,1,0,0,0,2,2,0,2,0,1,2,0,0,0,1,1,0,2,0,1,1,1,2,1,0,2,1,1,0,0,1,0,0,0,1,1,0,2,0,1,0,1,0,2,4,0,3,3,0,1,3,2,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,1,1,1,0,1,1,1,1,3,1,2,1,2,2,1,2,1,0,0,1,1,0,0,1,0,1,1,0,0,0,0,1,1,2,1,0,2,0,1,1,0,1,0,2,0,0,1,1,1,1,2,1,3,0,0,1,1,2,2,2,1,0,2,0,1,1,1,0,0,1,2,1,0,1,0,2,0,2,2,1,0,1,1,0,1,0,1,0,2,1,1,2,2,2,0,0,0,1,2,2,1,1,0,3,1,0,0,2,3,1,1,0,1,2,0,0,6,1,0,3,3,0,0,2,1,2,2,2,1,1,1,2,1,1,0,0,0,1,0,1,0,1,1,0,1,1,1,0,1,0,1,0,2,0,1,4,0,2,0,1,0,2,3,1,1,1,4,1,0,0,0,1,1,1,2,3,2,0,1,4,1,1,1,2,1,0,2,3,1,1,0,0,0,1,3,1,0,1,0,0,1,0,0,0,1,3,0,0,0,0,1,1,0,0,1,0,2,1,0,0,0,0,0,1,1,0,0,3,1,0,1,2,0,2,1,2,0,0,1,1,2,0,1,0,0,0,2,0,3,1,0,2,0,3,0,3,0,3,0,0,1,0,0,1,1,1,2,1,1,0,0,0,1,0,0,1,2,0,0,1,1,2,0,0,1,2,0,0,0,4,0,1,1,4,0,2,2,0,1,3,1,0,1,2,1,0,1,0,1,1,1,0,1,0,1,0,1,1,2,1,4,1,1,1,2,1,2,1,2,0,1,2,1,1,2,2,1,3,0,3,0,2,1,0,1,0,0,1,0,1,1,0,3,3,0,0,2,1,1,1,2,2,2,1,0,0,2,1,0,0,1,2,1,2,1,1,2,1,0,0,0,0,0,0,2,0,0,0,1,2,0,2,1,1,2,1,0,1,1,0,1,2,1,0,1,0,1,2,1,0,1,0,1,2,1,0,0,0,0,1,1,2,3,1,0,1,0,1,1,0,1,2,1,1,1,0,0,2,0,2,1,0,0,7,4,4,2,1,0,1,2,1,2,1,0,2,3,1,1,0,0,2,0,0,1,1,1,0,1,1,4,0,2,0,1,2,2,0,0,1,1,5,0,0,2,1,0,6,0,1,0,1,2,1,0,2,1,0,4,0,0,0,2,2,1,1,1,2,2,2,2,0,1,3,1,1,0,0,0]},{"counters":[3,1,3,2,1,0,1,2,1,0,1,0,0,2,2,0,0,1,3,1,2,0,0,1,0,0,0,2,1,0,2,1,1,0,3,1,1,2,0,0,1,1,0,1,2,0,1,0,2,2,0,0,1,1,0,2,2,3,1,3,1,1,0,2,3,1,0,0,2,4,1,1,0,2,1,1,1,1,0,0,1,1,0,1,0,2,2,0,2,0,1,2,0,3,0,1,2,2,0,1,0,0,0,3,1,1,0,0,0,0,2,5,0,1,0,0,0,2,0,1,0,0,0,0,0,0,1,0,1,1,0,1,0,1,0,0,0,5,0,0,3,1,1,0,2,1,2,0,1,2,1,1,0,2,1,2,0,0,0,2,0,0,1,0,0,2,1,0,3,1,1,0,0,1,0,0,1,0,1,0,0,1,3,2,0,1,0,1,2,0,1,1,0,4,1,2,0,1,2,0,0,1,0,0,1,0,1,0,0,3,1,1,2,0,1,2,1,0,0,0,3,0,1,0,0,4,1,1,0,1,0,0,3,0,0,1,1,1,4,3,1,0,0,1,1,0,2,1,1,1,0,1,1,2,0,2,5,2,2,1,0,0,2,0,0,3,0,0,1,3,0,0,1,0,1,1,0,1,2,1,1,0,1,0,1,1,1,1,1,1,2,2,0,1,1,0,1,0,0,1,0,0,1,3,1,2,3,2,0,0,2,1,1,0,1,2,0,0,0,0,0,0,1,1,1,5,2,1,0,1,0,2,4,1,0,1,1,1,0,1,2,1,1,0,3,0,1,0,4,1,2,1,2,2,0,1,0,1,1,0,0,1,1,1,0,0,0,1,1,0,0,0,1,0,1,1,0,1,4,0,2,3,1,0,0,2,1,1,1,0,1,2,0,0,1,1,0,3,1,0,3,1,1,2,0,1,0,1,0,0,0,0,0,2,0,1,3,0,2,1,2,4,1,0,2,1,0,1,2,3,1,1,1,1,2,0,0,1,1,1,0,0,1,1,0,2,1,2,2,1,0,1,1,0,3,0,1,0,2,1,1,1,1,5,1,0,0,1,3,0,0,2,2,0,0,1,4,1,0,3,0,0,1,0,3,0,4,1,0,2,0,2,1,0,0,1,3,1,1,1,2,0,1,1,3,0,0,2,1,1,0,6,0,1,0,1,1,1,0,2,0,1,0,0,2,0,0,1,2,1,2,1,0,0,2,2,2,1,1,0,1,0,0,1,0,1,0,1,0,0,1,1,1,1,1,2,0,1,2,0,0,1,0,2,1,4,0,0,1,2,1,0,1,2,2,2,0,0,1,0,1,2,0,3,2,1,3,0,4,0,1,0,3,1,4,1,0,0,2,1,1,2,3,1,1,0,1,0,1,0,2,0,0,1,0,0,2,0,1,1,1,0,2,0,1,3,0,0,0,1,1,1,1,2,0,2,1,2,0,1,1,1,0,2,2,0,1,2,2,0,1,0,0,1,1,2,1,0,1,1,0,1,0,0,0,2,1,1,0,1,0,4,0,0,0,0,0,1,0,3,2,9,2,0,0,1,0,1,1,0,2,1,1,1,1,1,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,3,2,0,0,0,2,0,2,0,2,0,0,1,2,0,2,0,2,0,0,0,2,1,1,0,1,1,0,0,0,0,1,1,2,2,2,0,4,0,0,1,1,0,1,2,2,0,0,2,0,5,1,2,1,2,0,1,0,2,1,0,1,1,1,3,1,1,0,1,1,1,0,0,1,0,0,0,0,1,0,0,1,1,0,1,2,1,1,2,1,1,2,1,0,1,0,2,1,0,2,0,1,0,1,1,3,0,1,1,1,0,0,1,1,1,1,1,3,1,1,0,0,0,1,0,1,1,1,1,1,0,1,1,4,2,1,0,0,1,6,2,0,3,0,0,1,1,0,0,2,2,0,0,0,1,6,0,0,0,1,0,0,1,0,1,0,0,2,1,1,0,1,2,1,1,1,0,1,1,0,0,0,1,0,0,0,0,1,0,1,1,1,0,3,1,3,0,0,1,2,2,2,0,0,0,1,0,0,0,1,1,0,1,2,1,0,0,0,1,0,0,0,3,1,1,0,1,2,3,0,2,2,0,2,0,1,0,0,0,2,1,0,2,2,1,1,2,2,2,1,2,4,0,0,1,0,0,1,1,1,0,0,1,0,0,0,3,0,1,1,0,1,1,0,2,2,1,0,1,1,1,0,4,1,0,0,0,0,2,0,2,0,0,3,1,1,1,0,3,2,1,0,1,2,2,2,1,0,0,5,0,1,1,1,1,1,3,0,3,2,0,1,1,0,1,1,0,0,0,3,1,1,1,3,1,0,1,0,0,1,0,2,1,0,1,1,0,4,1,3,0,2,3,1,0,1,4,1,0,2,1,3,0,0,0,0,0,2,5,4,0,0,1,0,0,1,0,0,1,0,1,1,0,0,2,0,1,1,0,0,2,0,1,0,1,1,2,0,1,3,1,1,1,1,0,2,1,0,0,1,6,1,0,1,4,0,0,1,0,0,0,0,3,1,2,1,1,0,1,0,0,1,2,2,1,2,1,0,0,0,1,0,1,0,1,1,1,1,1,0,0,1,1,1,1,3,0,0,1,2,0,1,0,0,0,3,0,1,0,3,1,0,1,1,1,3,3,2,0,2,3,2,0,2,2,2,1,0,0,0,1,1,0,5,0,1,0,1,1,0,0,0,1,1,1,0,3,2,1,0,0,1,2,0,0,0,1,2,2,1,2,0,1,0,1,1,1,0,0,3,2,0,0,1,1,1,2,1,1,1,1,1,0,3,1,2,4,1,0,0,2,1,0,1,2,2,0,1,1,0,0,0,1,1,0,0,0,1,1,3,0,1,0,0,2,1,5,0,1,1,0,1,2,2,1,1,1,0,1,2,0,1,0,3,1,0,2,0,2,0,1,0,1,0,0,1,2,0,0,0,3,1,0,1,2,0,0,6,2,0,0,2,2,0,1,1,3,1,1,0,0,1,2,1,1,1,4,0,3,3,1,2,1,0,0,2,2,0,1,1,1,0,1,1,1,1,0,4,1,0,2,1,3,0,1,1,0,0,2,1,1,1,2,0,0,0,0,0,1,2,1,1,0,0,1,1,1,1,1,0,5,1,1,0,1,1,2,0,0,1,0,1,1,3,4,1,1,1,1,2,1,0,0,1,0,0,1,2,0,0,2,0,1,2,2,0,0,1,0,1,1,1,2,0,0,1,1,2,1,2,0,2,3,0,1,5,1,0,1,4,2,0,0,2,1,1,0,1,1,3,1,0,1,0,1,0,0,1,0,2,2,3,0,0,0,1,1,1,1,0,2,0,1,1,3,7,2,0,1,0,1,1,2,0,2,2,0,3,1,0,0,1,2,1,0,0,2,0,1,1,0,0,1,1,1,1,1,3,0,0,1,1,0,0,0,1,1,0,0,0,1,1,0,2,3,3,1,2,0,0,1,2,0,2,0,1,1,1,0,0,1,2,0,0,2,0,0,1,3,1,0,1,0,1,1,4,0,1,0,0,1,0,1,1,0,1,0,1,3,3,1,0,1,1,0,1,1,2,0,1,0,2,0,2,1,5,1,1,0,0,0,2,1,0,4,1,0,1,1,1,2,0,2,1,0,0,1,1,0,0,1,1,2,2,0,1,1,2,0,1,0,1,2,3,2,0,2,2,1,0,1,1,0,1,1,0,1,0,2,2,6,1,0,0,0,0,1,1,1,0,0,0,0,2,1,1,0,0,0,0,0,1,0,2,2,2,1,0,3,1,0,1,2,2,1,2,1,1,0,3,2,8,1,2,2,0,3,0,0,0,1,4,1,0,0,2,1,0,1,0,3,1,1,0,1,1,1,4,1,3,0,4,1,1,0,3,1,1,2,1,0,0,2,1,1,0,0,1,2,0,0,0,0,0,0,0,1,0,1,0,1,1,1,2,5,4,0,0,0,2,3,1,1,1,0,1,0,1,0,0,2,0,0,2,3,0,1,1,2,0,0,2,1,0,1,4,2,0,1,1,0,0,0,0,1,0,1,1,3,2,0,2,1,2,0,0,1,0,0,0,0,1,1,0,0,2,1,0,0,0,0,1,1,2,0,2,0,0,0,1,0,1,1,0,1,1,1,1,0,2,2,1,2,0,1,0,1,4,0,1,1,2,1,0,2,1,1,2,0,2,1,1,0,1,2,0,1,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,5,3,0,0,0,2,0,0,2,1,4,0,3,0,1,1,0,1,0,0,1,0,0,2,1,2,3,0,0,0,0,0,1,1,2,0,0,1,1,2,0,1,0,1,2,1,0,2,0,0,1,0,3,1,1,1,1,1,1,2,1,3,2,3,0,1,2,3,1,1,1,0,0,3,1,2,1,2,1,1,3,0,3,0,1,0,1,1,0,0,0,0,1,0,0,1,2,1,1,0,2,1,1,3,1,0,1,0,0,1,0,1,1,0,2,0,2,0,0,1,0,0,2,3,1,1,0,0,0,2,2,0,0,0,2,0,2,0,1,0,1,2,1,0,0,2,1,1,2,1,0,3,0,0,2]},{"counters":[1,3,1,1,0,1,0,3,1,0,0,1,1,1,1,1,1,0,1,1,1,0,2,2,2,1,0,2,0,1,0,1,2,0,0,1,0,0,0,1,1,2,1,1,1,0,0,2,1,2,2,1,1,1,2,2,3,1,1,2,2,0,1,0,7,1,0,2,1,1,1,1,1,0,0,1,0,0,1,0,0,1,0,2,1,0,0,6,2,2,2,0,0,4,1,1,1,1,3,1,0,2,0,0,3,2,0,2,1,2,0,1,1,0,3,2,0,1,1,3,1,0,0,1,1,0,2,0,0,1,2,1,2,1,0,1,1,3,1,0,2,0,0,2,2,1,0,0,1,0,1,2,0,1,0,1,2,1,0,1,0,0,2,2,0,2,0,0,1,1,0,1,1,1,3,0,1,7,0,0,1,2,0,0,0,3,3,1,1,0,0,0,0,2,1,0,0,1,1,2,0,2,0,2,2,2,1,0,1,1,1,0,2,1,0,1,0,0,0,2,1,2,0,0,0,0,1,1,0,0,3,1,0,1,1,1,1,1,2,0,1,0,0,0,1,0,0,1,1,1,0,0,1,1,2,2,3,1,2,2,1,1,2,0,0,0,1,0,1,0,1,0,0,0,3,0,2,1,0,1,2,4,1,3,0,2,0,1,3,0,0,0,1,1,1,1,3,1,2,1,0,1,1,5,1,2,0,0,5,1,2,0,2,1,1,1,2,0,1,0,0,1,0,0,0,1,1,1,1,0,1,2,1,0,0,1,2,1,4,1,1,1,0,0,0,4,0,1,2,3,1,4,0,0,2,0,2,2,2,0,3,0,0,2,1,0,0,1,0,2,0,0,1,0,1,0,4,0,1,1,1,1,2,1,0,0,2,0,1,1,1,0,0,1,0,3,0,0,1,0,2,1,2,0,1,0,1,0,0,0,1,1,4,2,0,0,2,1,1,1,1,3,0,1,1,1,0,0,0,2,1,1,1,3,0,1,1,2,0,2,0,1,0,1,2,0,1,2,0,0,2,0,3,3,0,2,0,0,3,1,0,0,2,2,2,0,1,0,2,2,1,0,3,1,1,0,1,0,1,0,1,2,1,3,1,0,4,1,0,1,2,0,1,2,0,0,2,1,1,0,0,1,2,0,0,1,2,0,1,2,1,4,1,0,1,2,2,4,0,1,1,0,2,2,1,0,1,2,1,0,0,0,3,2,3,1,0,1,1,0,0,0,1,0,0,1,1,0,0,0,0,0,1,3,2,2,2,1,1,0,0,0,0,1,1,1,1,1,2,1,2,1,0,2,1,1,1,1,0,0,3,2,0,0,1,0,2,0,3,0,0,1,0,0,0,0,1,2,2,1,2,1,0,1,0,1,0,1,2,0,4,1,6,0,0,1,0,0,1,0,0,2,1,0,0,1,0,1,0,1,1,1,3,1,2,0,0,2,0,0,4,0,0,1,0,1,1,0,1,3,0,0,1,1,1,0,0,2,0,1,0,0,4,1,1,1,1,1,3,0,1,1,1,0,0,0,0,2,1,0,1,1,1,0,0,1,0,2,0,0,1,0,3,1,0,0,2,1,1,3,1,2,1,1,1,1,0,2,1,1,1,2,0,0,3,1,2,5,2,1,0,0,8,2,0,0,1,1,1,1,1,0,1,0,0,2,1,1,0,1,0,4,2,1,1,1,2,0,0,3,0,0,2,0,1,1,1,1,2,1,0,0,0,2,1,1,3,1,2,1,1,0,1,1,1,1,1,0,1,3,1,0,0,1,1,0,1,2,0,0,3,0,1,0,3,0,1,2,0,5,1,1,1,1,1,2,1,1,2,0,1,0,1,1,3,1,3,0,0,0,0,1,3,0,0,1,1,3,1,1,0,1,1,3,1,0,0,1,1,2,0,1,0,1,0,1,0,0,0,2,0,1,0,3,1,1,0,5,1,0,1,1,0,1,1,1,0,0,0,1,2,0,1,0,1,0,0,1,0,0,2,1,0,0,0,2,2,0,2,8,6,1,0,1,0,0,1,2,3,2,0,2,4,0,2,0,0,0,0,1,0,0,2,0,0,1,1,0,0,1,0,0,2,1,0,0,1,1,1,0,3,2,0,1,1,1,2,1,0,1,0,0,2,0,0,2,1,1,0,0,1,1,0,0,1,0,1,0,1,0,0,1,0,1,1,2,2,1,0,2,0,1,1,0,0,0,1,1,2,0,0,0,1,0,0,0,0,3,0,1,3,1,2,2,1,1,1,4,1,0,0,1,1,0,1,0,2,2,0,0,0,0,0,0,0,0,2,0,0,2,1,1,0,0,3,2,2,2,0,0,1,0,2,2,0,1,1,1,2,2,0,0,1,2,0,1,1,1,0,0,0,1,3,0,3,1,2,2,0,0,0,1,0,0,3,0,0,1,0,0,2,0,0,2,0,1,1,1,0,0,2,0,1,0,0,2,1,2,4,1,2,1,1,2,1,0,1,1,0,2,3,0,0,2,1,1,1,1,1,2,1,1,1,1,2,1,1,0,1,2,1,0,1,0,0,0,2,1,1,2,0,1,1,0,0,0,2,2,0,0,2,1,0,3,0,1,0,3,0,0,0,0,0,2,2,0,2,0,0,4,3,2,1,0,1,0,0,2,0,2,1,0,1,0,1,1,0,0,2,0,1,1,3,0,2,0,1,0,1,0,0,3,2,1,2,2,0,1,1,1,1,2,1,1,1,6,2,2,0,2,0,1,1,1,2,3,0,1,4,0,1,0,1,1,0,1,1,1,0,0,0,1,0,1,0,0,0,1,2,2,1,1,0,0,0,1,1,4,0,3,0,2,0,2,0,2,2,0,3,0,2,0,0,0,0,0,2,1,0,1,0,0,1,0,1,0,1,1,1,2,1,1,0,0,1,1,1,0,1,1,1,0,1,1,0,2,0,1,0,0,0,0,1,0,0,1,6,2,1,0,3,0,0,0,1,0,2,1,0,2,1,1,1,0,1,0,0,0,1,0,0,2,1,0,0,3,0,3,3,0,2,1,1,0,1,0,0,0,1,1,0,1,3,0,1,0,2,1,0,2,2,2,0,0,2,1,0,0,0,2,0,1,2,1,0,0,0,0,1,2,2,2,1,2,1,1,0,1,0,1,1,0,0,1,1,0,1,1,0,0,1,1,1,1,1,1,0,4,2,0,2,0,1,2,4,0,0,2,3,0,1,3,0,0,1,1,1,1,1,0,2,0,1,0,1,1,1,1,1,2,0,2,0,1,2,1,1,0,2,1,4,0,0,0,0,0,1,1,0,1,1,0,0,1,2,2,2,1,2,0,1,1,3,0,0,0,1,1,1,0,1,0,1,1,0,1,0,0,1,1,0,0,0,1,1,1,1,1,1,2,0,1,0,2,1,3,4,0,0,0,1,2,2,3,0,0,2,0,1,0,3,0,0,2,3,1,2,0,2,0,1,2,2,0,0,1,0,0,0,0,2,0,0,1,0,0,1,1,0,2,0,0,0,1,2,0,2,2,2,1,1,2,0,0,4,1,3,0,1,3,0,0,2,0,0,0,1,1,0,2,1,1,0,0,3,1,1,1,1,2,2,2,1,1,0,1,1,2,1,1,0,0,1,1,1,0,1,1,1,0,1,0,2,0,1,0,5,2,2,1,1,1,1,1,3,1,2,0,0,0,2,0,1,0,0,0,2,1,0,1,0,1,1,0,0,1,2,1,1,0,1,2,0,2,0,1,2,1,2,0,1,1,0,1,2,0,1,0,0,1,2,0,1,3,2,0,1,1,0,0,2,0,0,4,1,0,1,0,1,0,1,0,3,2,1,1,1,1,0,0,0,0,1,0,2,0,3,1,2,0,1,1,1,1,0,0,0,5,1,0,2,0,0,3,1,1,2,1,0,1,2,0,0,0,0,0,0,2,3,0,0,3,1,0,1,0,3,3,1,1,1,1,2,2,1,0,0,0,1,0,2,1,1,1,1,0,2,1,0,4,1,1,2,3,1,0,2,0,0,2,3,1,0,0,2,2,2,1,1,0,0,1,3,1,1,0,1,2,1,1,0,1,0,1,1,1,0,2,1,2,1,1,2,1,0,2,1,1,0,0,2,1,0,1,0,1,2,1,1,0,0,2,3,2,3,1,4,1,0,1,0,0,0,0,3,0,3,0,1,2,4,0,2,0,2,1,1,3,1,0,2,1,0,0,1,1,0,1,2,0,1,3,0,0,2,0,2,2,1,2,2,1,1,0,1,1,1,0,0,1,3,1,1,0,0,0,0,4,1,1,2,0,1,0,1,3,0,2,2,0,0,3,1,4,0,2,5,0,2,0,0,2,0,0,6,1,0,1,1,1,1,3,0,1,1,2,0,0,0,0,0,0,0,0,3,0,1,1,0,3,1,0,1,2,2,0,1,1,0,0,0,0,1,2,0,1,2,1,0,0,1,2,2,0,2,0,0,1,1,2,0,1,0,3,0,1,1,0,2,0,0,4,2,2,0,1,0,1,0,2,2,1,0,1,1,2,1,1,0,0,1,3,1,0,1,0,0,0,0,0,0,0,2,1,2,0,0,1,2,0,4,1,2,1,0,2,1,0,0,1,0,1,0,3,3,0,0,1]},{"counters":[0,3,2,1,0,1,2,0,2,0,1,1,0,0,1,0,2,0,1,3,1,3,1,0,0,1,0,0,1,4,2,2,2,0,1,1,2,1,0,1,0,1,0,1,1,0,0,0,2,0,2,0,0,1,0,2,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,2,5,0,0,2,1,1,0,2,0,1,2,0,1,3,0,0,0,1,1,6,1,2,1,1,1,2,2,0,1,0,0,0,0,1,1,1,0,4,3,0,1,1,1,0,1,0,0,2,1,3,1,2,1,1,0,0,2,1,0,2,2,1,3,0,2,1,1,1,2,0,0,1,1,1,0,0,0,1,0,1,0,0,1,1,1,0,1,1,2,0,3,0,2,0,1,1,1,2,2,0,0,1,1,0,0,1,2,1,0,1,1,1,1,2,3,0,0,1,0,2,2,0,0,0,1,1,1,4,1,1,0,1,0,2,0,1,1,0,1,0,2,0,0,0,0,2,0,1,0,2,2,0,2,0,0,1,0,0,0,2,5,2,2,0,1,2,1,2,3,2,3,1,0,2,4,1,0,1,2,2,3,1,1,1,1,1,0,1,1,3,1,2,1,1,2,1,1,1,3,0,0,0,0,1,7,1,1,1,0,3,0,0,0,2,1,1,0,0,0,1,2,1,1,3,1,1,0,1,3,2,3,1,2,2,0,1,0,1,2,1,1,1,0,3,2,0,0,1,1,0,6,1,0,1,0,1,1,1,1,1,2,1,3,1,1,0,2,0,2,1,0,2,0,1,0,1,1,1,2,1,0,1,0,3,1,0,0,0,0,0,3,1,1,0,0,0,0,0,1,2,1,1,3,2,0,1,0,1,0,1,1,0,2,0,0,2,1,0,0,1,1,2,0,0,1,1,1,0,0,1,2,0,2,0,0,0,3,1,0,0,2,0,4,0,4,0,0,1,1,3,3,1,3,2,1,1,4,1,1,2,1,2,0,1,1,0,1,3,2,0,0,0,3,0,0,2,2,0,0,1,3,0,1,2,1,0,1,1,0,1,1,1,0,2,1,2,0,2,3,0,1,1,1,0,1,1,2,1,1,1,0,1,1,1,1,2,2,1,0,1,0,1,0,2,0,0,1,1,0,2,0,0,0,1,1,2,1,1,3,1,2,1,1,2,2,1,2,0,0,0,2,0,0,1,1,0,1,1,0,0,1,1,1,1,0,0,4,1,0,4,2,2,0,0,0,2,0,2,2,2,0,1,0,0,3,2,0,4,2,0,1,2,0,0,3,2,1,1,1,0,0,2,2,3,1,0,1,0,1,1,0,0,0,0,1,0,3,3,2,1,0,0,2,0,0,0,1,1,0,1,2,0,1,2,1,1,2,0,0,0,2,0,0,1,0,2,2,2,0,3,0,0,0,0,2,1,0,1,0,1,2,1,0,0,0,0,1,2,0,3,2,1,0,0,0,3,2,1,1,0,1,1,1,0,3,0,0,2,1,1,1,1,1,1,0,3,3,0,0,1,3,0,1,2,1,0,3,1,3,2,1,5,1,1,1,1,1,1,1,2,1,2,0,2,0,0,1,0,0,0,0,2,1,0,4,1,0,0,0,2,1,0,1,1,1,1,1,0,1,2,0,0,0,1,0,4,0,4,1,0,0,0,0,0,1,0,1,1,1,1,0,1,0,2,1,0,0,0,0,0,2,2,0,0,1,1,0,2,1,4,1,2,0,0,1,1,0,0,0,2,1,2,1,1,0,0,0,0,1,1,2,1,2,1,3,1,0,0,0,0,0,2,0,1,1,0,1,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,1,3,1,1,0,2,1,0,1,0,1,0,0,0,1,0,0,0,0,0,1,1,0,1,0,1,0,2,1,1,1,0,2,1,2,1,1,1,1,0,0,2,1,0,0,0,1,1,3,1,1,1,0,2,2,1,1,0,1,2,1,2,1,0,0,0,2,1,0,1,1,1,1,1,3,3,1,0,1,4,2,2,2,1,4,0,1,1,2,0,1,1,2,1,2,3,4,2,1,0,1,1,2,3,0,0,0,0,0,2,1,0,0,0,1,0,1,3,0,2,0,3,1,3,1,2,0,4,2,2,5,1,2,0,4,0,1,0,1,2,4,0,2,1,1,1,0,2,0,0,1,0,2,4,2,2,1,1,1,1,0,0,2,1,1,3,1,2,2,2,0,2,0,0,3,1,0,0,1,0,1,0,1,1,1,0,0,0,0,1,1,0,3,0,2,3,1,1,0,1,0,0,1,1,2,0,1,2,1,0,3,2,3,2,1,0,0,0,1,0,1,2,0,2,0,2,0,0,0,1,1,0,2,1,0,0,0,0,1,1,3,0,1,0,0,3,1,0,1,1,1,2,1,7,0,0,0,2,3,0,3,0,0,0,1,3,0,0,2,1,1,1,2,1,0,0,1,0,0,1,1,3,1,1,0,1,1,2,2,1,0,1,2,0,3,2,0,0,0,0,2,0,1,0,0,0,2,0,2,0,1,0,0,2,0,0,1,1,0,0,1,1,0,1,1,0,2,0,0,1,0,2,1,6,2,2,1,0,2,1,0,0,1,1,0,0,0,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,1,0,2,0,0,1,0,0,0,0,0,1,0,3,1,0,3,1,1,1,0,0,2,0,2,1,1,2,2,0,1,1,1,2,1,0,0,2,4,2,1,1,0,0,1,1,0,0,0,0,1,3,0,0,5,2,1,1,2,0,2,1,1,0,1,1,2,2,0,0,2,0,2,1,0,1,0,2,0,2,2,0,0,0,1,3,0,0,2,2,1,0,1,3,0,1,1,1,0,0,0,0,0,1,8,1,0,0,3,0,1,1,0,0,4,1,0,3,1,1,0,2,0,1,0,1,2,2,0,0,0,0,1,0,0,0,2,0,1,1,1,0,1,1,2,0,0,1,0,2,2,1,1,0,3,0,3,1,1,0,2,4,0,1,2,3,0,1,1,1,4,7,0,1,1,0,1,2,2,1,1,0,3,1,1,0,0,0,1,1,1,0,1,2,0,1,0,2,2,0,0,1,0,0,1,1,0,2,0,3,1,1,0,1,2,0,0,2,0,1,1,1,1,0,1,0,1,1,0,1,0,2,2,1,0,1,0,1,0,1,3,1,0,2,2,1,0,0,1,1,1,0,1,1,0,2,1,0,1,4,1,2,0,3,0,5,2,0,1,0,0,2,1,1,1,0,2,2,0,2,0,1,0,2,0,1,1,0,1,2,0,1,1,2,2,1,1,1,2,2,0,1,0,1,0,3,1,3,0,0,8,0,1,0,1,0,1,1,0,2,3,0,0,0,2,1,0,1,1,1,3,2,0,3,3,3,2,2,0,2,1,1,0,0,1,1,1,1,0,0,0,0,0,0,1,2,0,2,2,0,0,1,2,0,1,1,0,1,1,2,2,0,0,1,2,4,1,0,1,1,1,0,1,2,0,0,2,0,1,0,3,1,0,1,1,0,1,1,0,2,0,2,1,1,1,1,0,1,0,1,2,1,3,1,0,1,1,2,0,3,2,0,0,1,1,2,0,1,3,0,0,1,1,0,0,0,1,0,0,1,3,1,2,3,0,2,2,1,1,1,1,1,0,1,3,0,2,2,3,4,1,1,0,2,1,1,1,2,0,2,0,2,0,1,0,1,2,0,0,3,0,0,2,2,0,0,2,0,1,0,0,1,1,0,2,0,1,1,1,3,0,0,1,0,3,0,1,1,1,2,2,0,1,1,0,1,1,1,2,0,1,1,2,3,3,0,0,4,1,0,0,2,0,0,0,2,2,2,0,0,3,0,0,1,2,0,3,1,0,4,0,0,0,2,0,1,1,2,1,1,1,2,2,1,0,1,1,3,0,2,1,1,0,0,0,0,0,3,1,1,0,0,1,0,0,1,0,0,2,1,0,1,0,1,0,1,0,0,1,1,0,0,2,4,0,0,1,1,2,2,0,1,0,0,0,1,0,0,2,0,0,1,0,0,1,0,0,1,0,2,2,1,1,1,0,1,1,1,1,1,0,0,2,0,1,2,1,0,1,0,3,0,0,0,2,3,0,6,0,2,1,0,1,2,0,1,0,1,0,2,2,0,2,1,1,0,1,3,0,0,3,1,1,1,1,0,2,1,0,1,1,1,0,0,1,0,1,0,0,0,1,0,1,3,2,1,0,0,2,0,0,0,0,3,1,1,1,0,2,0,0,1,0,0,2,2,1,0,0,0,1,1,0,0,1,1,0,0,1,1,2,0,3,3,0,0,0,3,1,2,2,1,0,2,2,5,1,0,1,0,0,0,1,1,0,1,2,0,2,2,2,1,1,2,2,0,1,1,2,0,1,3,1,1,0,2,0,0,0,2,0,0,0,1,0,0,0,0,0,0,2,0,0,1,1,0,0,1,0,1,1,3,0,0,0,1,0,0,2,1,1,1,2,0,2,0,3,1,2,1,1,0,1,0,1,3,1,0,1,0,0,1,1,1,1,1,0,0,1,1,1,0,0,0,3,1,0,0,1,0,2,1,0]}]},"null_count":0,"last_update_version":397952032508477440},"bm":{"histogram":{"ndv":2,"buckets":[{"count":977,"lower_bound":"MA==","upper_bound":"MA==","repeats":489},{"count":1999,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":511}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952033522188288},"p1":{"histogram":{"ndv":1989,"buckets":[{"count":7,"lower_bound":"MDRmWFB3UFliQlBBUkROT2dUVjlkWDNHR2Myc0wxeDNTaUFhZ2IyRDJmNHNudWNiaGU0QnplVQ==","upper_bound":"MEJNb3dFOTdTdHVja2tkWnJvcU43allSVHpyaVZkMXJWaWYxZktqOWU1a29rWA==","repeats":1},{"count":13,"lower_bound":"MEZHSUtTc2ZDM0JZUWJ1c1NCTzBLTExNaVVSQkxqY2pyNGhxUkh5c3FhUG00T0tEREtr","upper_bound":"MEk0ZG4=","repeats":1},{"count":19,"lower_bound":"MExYdTdkQ2xrMDBCNzNiNnIxM3Y4MUNyQ2dZaHg3TFJrd0R2ZEtCdQ==","upper_bound":"MFg5YWtpSlZGdFFXRHBDUUI4aTZ4aFRqV3JTZVBpMEVHd0lkTkJVRXNvdFpkVWNFUQ==","repeats":1},{"count":25,"lower_bound":"MGJpenpGcmph","upper_bound":"MHVLNWJTOTJrVXVWSjVlQzVRZWJ6OXF5RU83enNlOFJwMUZmSE1RRGFrWDJEOGk4cw==","repeats":1},{"count":31,"lower_bound":"MHc2V1FKTmRBNERURk82NmRTQlBURUlFRlFGYWUwYlMwQkFQWmVJQTZIM0d4Tg==","upper_bound":"MTVjOWZ4TmE0MEFTc04wTmU=","repeats":1},{"count":37,"lower_bound":"MTdZaExud0VWWDVmczN1RHd1OG16TWQxT0tk","upper_bound":"MUd3d25kT1FVeDk1eDF4YjJhekxnVFM4Ulg0ZA==","repeats":1},{"count":43,"lower_bound":"MUlPcTRwMVVqdHRUOHBhTEd6RFhybEJsQVkwVkJJYzZGVXdyREpwdHRVM0JnNWlrb2V1a0lBbWg1SVo4VWY=","upper_bound":"MU90Z2gyMjFCQ2Q4UA==","repeats":1},{"count":49,"lower_bound":"MVJKN0JYZTBsWUttdmUwd1J1SkVCblMwQk1sZDhXa2FhQjdDWDRXNnlNTGhudHBtczJzaDljbnhoYXF5NGtGbg==","upper_bound":"MVZhQlI0cmR6cWJlS0w4SFFtR0ZjTTJ0Wk5XeHVQS3VaTlpsbVYzZU9LRkxab1IxaUxTS0czamI=","repeats":1},{"count":55,"lower_bound":"MVpkY0pVSVp3V0RKY3ZQd2U2ZVdraEZEa1E=","upper_bound":"MXR4YWJHZXBIckY4UlltazRCSVQ1dnB6c0tmSEtCR3pqelVx","repeats":1},{"count":61,"lower_bound":"MXZhU1R6cTFMZ05qZWlIc0pTVU85aUpGV3RzUm0=","upper_bound":"Mg==","repeats":2},{"count":67,"lower_bound":"MjJHMlFIbFBDMG52T0NPTzNCQ01Ud2kwNnpiZWk0aVpvdHhaWEgyemtFd2prSkVUOHRxZDhYaDN5TA==","upper_bound":"MjhHTQ==","repeats":1},{"count":73,"lower_bound":"MkFWeFdjT3pmdERyMmpUZWRHd3hIckJnMDFIdGMza2YzaUN2OUs4bGJvUDUzNERoT1c=","upper_bound":"Mk5qNFBCbEQ4NTRpQ1Q3VG52MFNUYnl6WWRzT1o2NUhLYlVGNGRIOWFjNg==","repeats":1},{"count":79,"lower_bound":"MlVpb2NZa2Jya2VGUDc1VVB0Yk1tWlNqVUYx","upper_bound":"MllCdFlieGdpUXdyZlRXaTZtcWlyaU5SM2hGeTJId0FzTnJrc2g3SXJmczc=","repeats":1},{"count":85,"lower_bound":"MmN2RUV2QTRDeWZ1U3lNMHFJMjQ0Wmk5YXVSTFhNYU9hYkdmNjRvUnJScmZOcGwweEQ=","upper_bound":"Mmh6ektjakxOTG9iUDFrRGxUT1JhamNCYnR4RE9Nd2JHS3kzdW1r","repeats":1},{"count":91,"lower_bound":"Mmlnc2ZoMjJRbmFMcTQ1UllmYnphQ05LQjBpZ2dScFVw","upper_bound":"MzVrZ2c3UjZWTmdFNEw1TFlyQUdaZ2FSZnhaVUxCbTk=","repeats":1},{"count":97,"lower_bound":"MzdVUDlLcEZYcWNzM0YyeWFFYUxaeWV4MA==","upper_bound":"M0l5a3Mydjk5YUs4a0pIOUNoZzFISDZQQjlkdHpMd2xxV2ZXZWM=","repeats":1},{"count":103,"lower_bound":"M0tETUhocVNoMnlBWnlJRTVsb1dkZG9wWkJCem4yS1NndlhRSG1ySQ==","upper_bound":"M1ZuZndUUlFLRFBaWDBRR0RLNmo0R0pTS2ZIcEVhbkJ3MExlRGlCTGpYRHVtSlc5YTBLV3J4bzBGTw==","repeats":1},{"count":109,"lower_bound":"M1dtYm1pZU95eGo=","upper_bound":"M2hQemNrR1RmamIwdk11REFQQ3R0YlViUncxRHlXRDdCWTZKSGl3c0ZQZkxjQzUwSnpyRA==","repeats":1},{"count":115,"lower_bound":"M295cEp1Z1JtVVpsek9FN29kdGVGY1F3Y25MZ1pCSngxNUZmN1F1Qg==","upper_bound":"NDE0dFM5UkE5QzVDaFVubXBFN0Y3OHNCdEx0Z1lWNzVzMTNrVVBhOU1MSENRdXM=","repeats":1},{"count":121,"lower_bound":"NDYxcnE2TVhxSTR2YnM4cVlPWmJheFdpNnphekY=","upper_bound":"NEJZZE9LVDN0dGZNTw==","repeats":1},{"count":127,"lower_bound":"NERTUjUwcnBuWFdVazRzUHFwRTdRNmx4YldvMHhTdjhrTmZyS05mV20wVkNTTFlCUWw5Mw==","upper_bound":"NEpXT2RjNUJ2ZDh6cFd1WVI3UW50UUg2NU5NUkI=","repeats":1},{"count":133,"lower_bound":"NE5XMzhwQldqOXdXWWU0YzJV","upper_bound":"NFZzTlNsaWlVNUlLaXh6MVNZUzhjT2RNc2k=","repeats":1},{"count":139,"lower_bound":"NGtzVkY5dzliNDZjSVpTTXpKMU9nak9wM240WGdKM2wxMnpmVjBiaW9NVm9rTDZXUVJqUGtndWlqM2s=","upper_bound":"NHNJWTZlOEJsWUtXQ0kzVnJOQ0d2UU5XT2s5N0pWVHVKMHJQUFI5cnMzTTVDOXJuTVo4S051dk1nVXhQSXA=","repeats":1},{"count":145,"lower_bound":"NHkwYnhxSzJQemVOcHdlU0hna0tUZUpNZkJGNVF2ekNQODl1a0dKNVhJMWdid1c=","upper_bound":"NTM=","repeats":1},{"count":151,"lower_bound":"NTVtYlpOb3JqSW50aFp5WA==","upper_bound":"NVJBblZWTFVwNHFFMVc=","repeats":1},{"count":157,"lower_bound":"NVNkMlpwVXY2R2NUYUNkQ1c2TmtVOFlVaGRuSWFLSEh1TUJJaFZJVjN2eWpaRWRZcWRIcFhj","upper_bound":"NWJiZHc2","repeats":1},{"count":163,"lower_bound":"NWQ=","upper_bound":"NWk5Q1IxM1VycnF5TVZwRGdXb0lJTDFzblVZcXF5YWs0MUMxNlNuMGVpV3FESmZ5QVdrNElUUklzZXY=","repeats":1},{"count":169,"lower_bound":"NWw1TUpHeVNzMlVBQTlibjEzQ3FFdjNwQTlQdFFrVk9X","upper_bound":"NXF2Z1I3VU1FVmx4VlJ0OFFnVVBhT2NNcGVaaW5vUkJQc3lFTm00dFVKRlZQWUIyQUpacE85SWlJ","repeats":1},{"count":175,"lower_bound":"NXNUUldSZjh5MW85VDBJZ0VVU3VGbnB5YXBz","upper_bound":"NjM5RW02ajRnV1FzSW1ab2tTREc=","repeats":1},{"count":181,"lower_bound":"NjhLOXR3V20yVWJnSm9HUkFiMVVGTkRodEJxT2ZkRGoybkZJeHJyRw==","upper_bound":"NkNUcTJWSFQ0Mmo4enQ0aTNDSld6Z3c0aFhWZnBBNnhYbWxnRmY=","repeats":1},{"count":187,"lower_bound":"NktIVG1uSjY0MURXR0NxQ0hBNHlGdTRZMThzUw==","upper_bound":"NlBjV0RhNnprU2NqZWdpbW44NkxkQU5kcllHQTU=","repeats":1},{"count":193,"lower_bound":"NlZTS2VtcW5iUmtJNmY=","upper_bound":"NlljQzNQck5CUTg5VzluSXFIOVdBejQxaVI5QjNVMGJyUXFaV0ZDdE1TSjdSWnRvUE9MdUcxaw==","repeats":1},{"count":199,"lower_bound":"NmZURVQ3VUt1S3o5SXJBb3pjaXY1S1ptdzZKZ013U003WnVhaktGTDIxUnlrakpNUlMybnh2Q2xBM3hY","upper_bound":"NnA0TGd2cnpLeFY1SWhsYWowenVtZzNabw==","repeats":1},{"count":205,"lower_bound":"NnNVWkQ3ZGJHUmc5V1Rw","upper_bound":"NzRFQXJzUUV6OE1UOWEyclNuZGVvRGtaU3ZzSFlSNEpkWU90NDBrY1hVcFBn","repeats":1},{"count":211,"lower_bound":"N0J4WVRUd0FOeVl6dmxaamVtQ0U=","upper_bound":"N01CMU13Z0d5RmVtSUgzM2FRYTRRUmo5aGhNeGVtR2dCZFhIYTdSQnhYVnBkWmZ0WUxDVzltMkI=","repeats":1},{"count":217,"lower_bound":"N043ZUh5NVVOSERWUHJRTnVYVGtTYnBvZm9qQk9DZ24wWTR3VFVz","upper_bound":"N2ppMjE5ZzZwcDRhMHlMa3BqT3dNQjVYSnloOGlzUlpSUHhGb3lVZGlQeGY5ZDdBSkhkaXpQbWdZSjl0SA==","repeats":1},{"count":223,"lower_bound":"N25VZHZoZjJhdHE1WE9VM3M5dlBQUnM3UVBmTU54dzM1ME1oV3hpUldzWXQ1aEZsOGJwZnlvcA==","upper_bound":"N3FIMUFHWjRCVlM5SnVWQjJWNjkwR2Z2bjdzNmdIak1ka1FPR1lDSWJ3ZlZ5ejNHNnBROWVCSnpnQg==","repeats":1},{"count":229,"lower_bound":"N3FLU2tyS0tIUk54d1ZVU0lV","upper_bound":"N3Z2ZHRCNmVFUzNaOWlFdG1uQVo=","repeats":1},{"count":235,"lower_bound":"N3lLOU5vVDFTclJsTnNvZTFYaG52QUNnVTdUSFhoWDNQYXM0Y1N2TWRaQw==","upper_bound":"ODZUMnIyMmp0VjR6N0RmU2RXWjFTc1lUWVViOFRFWUFwMzhHV3V4NnFXd0d0QnV4WWJYeU1lbWU=","repeats":1},{"count":241,"lower_bound":"OEM=","upper_bound":"OE0xaA==","repeats":1},{"count":247,"lower_bound":"OFRvTTVlZGZKYWlHbWZHVVFLRE9OeGRQWmI0UFNtQWwwWXliR0lnR2pVeVNCUFI2SW5zQ3NodUV1MmZRVVQ=","upper_bound":"OFloSVgwVHkzMmJlUmV5MzdKY0N6bm1VRENtYU1DUzY=","repeats":1},{"count":253,"lower_bound":"OGFqR1cxWHBKYXhJVmxMNFQ=","upper_bound":"OGZiSThNc3MzTXdIRmxoTzZKT1VaMFBBQVZEdGJPTFdkTFJYTzZUY2p5VGlxc2EwSzNlNGFudUpmcE4=","repeats":1},{"count":259,"lower_bound":"OGcxbUpVeVhuQXpMNW42Z2V3REZtaXN4ZmtVVXFETGZ6QXZ1dHAxQkJhUmpR","upper_bound":"OGhkZWk=","repeats":1},{"count":265,"lower_bound":"OGlmMDFsU0JKODRqRWo5UFFSd291cDhXN3pUSjRyRGNr","upper_bound":"OHB2Y1dhZzE2RFVTQ0tPRkhFcm41blIxQk1aTnpnd2w4QWFTQTJHb3pON01EU2ZYNFMzeDg=","repeats":1},{"count":271,"lower_bound":"OHJrd09hTnhoQmZ0aGtCbVl1NmJjQklkQXZmY3ltMUhTUWU4Wll2eENsYUNiWHRZYw==","upper_bound":"OHhRMlBSd2NIaHFQM0NRQUNvMllQRW1pWUw4S2NybjZycmpuV08zMXltQ2loNw==","repeats":1},{"count":277,"lower_bound":"OHhVOUpGUnF6UnBmcHZHZG5IdDU4MEEwVHlaQXhmam5vNEZoUEhXUnozb1Nv","upper_bound":"OQ==","repeats":1},{"count":283,"lower_bound":"OTJONEp3ZHFpc1RmZGJxQ2tSa3RVcGN6S1NDU09ybDdqT2RjVjdib3hZcllCcEYzTFM5SQ==","upper_bound":"OTY2UzFCeFQxcjNza1o0ME1p","repeats":1},{"count":289,"lower_bound":"OUFwYkxuRkFzSDJSUnp6ajdLcmZRY1U=","upper_bound":"OUYzc0dGSUhDU0Y=","repeats":1},{"count":295,"lower_bound":"OUtaaUtmano4","upper_bound":"OVAxeHNHSzNYYW1vNnlVR2IzUHY1SXdMM1hheGc1VG9hU2tFTFBqMzRGdQ==","repeats":1},{"count":301,"lower_bound":"OVNISDFWOHA0VDdjUjkwbHJRbXdVNENzOWlXWW13MHhYN1BLMjZJVUJoNml4QTg=","upper_bound":"OVdtZUJGZUJmVjB0TTNiRU9QU3lndVY=","repeats":1},{"count":307,"lower_bound":"OVdvUm9WeVREdTBNNTR4dXBpMmgyWFlqdkF6dA==","upper_bound":"OVlnVksyN0VkZ2hoZ2FCYkZyQ0VXYlhrQ2xzS3pnYUd1ZmtGQmZSVkFWWmZqeDVWZjlucWY5RVNJaXhjbQ==","repeats":1},{"count":313,"lower_bound":"OWsxOUJHOHZmczBaT2pvb3FNbQ==","upper_bound":"OWx1YTlGTFhpVkRYc0l5UW4yMHlUMUFucGY3MnZ0NTdER2IzYQ==","repeats":1},{"count":319,"lower_bound":"QQ==","upper_bound":"QUREeGMyREVXc0Zoc1VFT3FPa2J1OUpJVm0zaXphbDVqTXF0UEs1THpDQlQ2","repeats":1},{"count":325,"lower_bound":"QUZYb2pTZ1pGZDJVSzdoZjcyRFE2bHozRnhOZEZXMjhWcUJVT255Uw==","upper_bound":"QUk2M0hQM21PdEpsM0F3MUJROVh5R0hDSjVpM2RReEVVZGZkMkZJc3hCa3A=","repeats":1},{"count":331,"lower_bound":"QVpBWkNSdQ==","upper_bound":"QWQ3aHVPeDNUNkZ5NUtxU3lqc1VZdVRrdEFIZTVEZmJF","repeats":1},{"count":337,"lower_bound":"QWk1aTB0Wkt3elNyd1Q=","upper_bound":"QWpLVlZpdERZSWZwZGR5SkMyVE4wTHVFTE82QmIzOGcwMWk0b3IzSjBwanRkalEw","repeats":1},{"count":343,"lower_bound":"QW04Q3puNFN6djRpZms4QzAxeUV1TDNpZ3ZXUktrMWxCMlVRdnRTbDE5Z0xkRmpVVEE3V2VqVjMyeg==","upper_bound":"QXM1QjhweFB0WmxNOVcwcXBoMVFTYXFKU2hCUlFIWGgyYXc4VlhocHFvZFl4Y2ZHVHRk","repeats":1},{"count":349,"lower_bound":"QXUxNm1hOQ==","upper_bound":"QXl3R0s0dDlT","repeats":1},{"count":355,"lower_bound":"Qg==","upper_bound":"QjhKNnJLTTZtdnVJaVNEeElkZmJ5YUEwVFh3ZHpCTkhPMnhINmFINENuUA==","repeats":1},{"count":361,"lower_bound":"QkpnOXpSR0ZYc2Q4dWZJZjNJOTdKZlI2VjhFZ1NkNQ==","upper_bound":"QlNMa1NocmdBNFZkM2hUYVF3WmJLMnduQQ==","repeats":1},{"count":367,"lower_bound":"QlVyd2JJUGR6bzRJWG9RUTZhY0ZJU1ZteWFnMDNPZzNhR2xTMw==","upper_bound":"QmJFVFNadXBZZlRPM0FxdFE3N2VUNWhyS2daMHRaYVk3OHpvMU9FcGc1RA==","repeats":1},{"count":373,"lower_bound":"QmtkemdU","upper_bound":"QnI5Nk1SWmw3Q1ZVRGJwNEZnbm14WXN6bXhaZXY2U1Y0S2JwS0FJTw==","repeats":1},{"count":379,"lower_bound":"QndCYzJGNmZXb0VxUFBkaUsxbkpjQk82aXVoNw==","upper_bound":"QzBVS3hxSlNyVjVXNg==","repeats":1},{"count":387,"lower_bound":"QzJ0WE81NTRmeFlkU3JHalk0OXpwQ0NKcWlkT1drbk1lMXlaRkpQd0VTT1k3MmRnSTl3aGNiZ3YzdmVvcg==","upper_bound":"Q0JpTUtLT1B2U3NWMWwyelZ2ZFNiU1dYOVk=","repeats":1},{"count":395,"lower_bound":"Q0M3dA==","upper_bound":"Q056c25hU09TRmhtUEFrVUhkVmxhazE1","repeats":1},{"count":403,"lower_bound":"Q1FHWmJFRVppeE96ZlEwbkI2RkN2bE1KMWhRUWV2cnhGSw==","upper_bound":"Q1d0bGF2cU5PT1hvdlEyMHVLSnc2U2hyU2pJU3lKdVh3bWU2ekFSY0xjV2ttUlVlSA==","repeats":1},{"count":411,"lower_bound":"Q2FpVHpVSTZ2V21Kc0NhMlB2MURsQWx4STRpSzlrSU11ZnpGV2dCMHFMZ1lNN0dnM2J4azlKbW9zT3FHSw==","upper_bound":"Q2w3Q1I1cUZiWGt1MW0zNjd4VjRDd1VUbGpVU0U3NHE=","repeats":1},{"count":419,"lower_bound":"Q21JazQ2ZjJaZUZFQXprR2g3VG9zN1hQWGNMRkRSZTY5WUtGM2htbmJlQnRoU21QVmhi","upper_bound":"RDFUc3h6Ym1NUmUzMnN4N2thb0l5bw==","repeats":1},{"count":427,"lower_bound":"RDI0YUtDeGk=","upper_bound":"RDc=","repeats":1},{"count":435,"lower_bound":"RDdjQUFnbmhRVmRjNDJ4Y1JwSFF6eXV1eg==","upper_bound":"RE9lQ2x2S2dyQ2xIcFJHZHdHM0IzSGFwag==","repeats":1},{"count":443,"lower_bound":"RFB6Y0pyR0tLclVjb0d6cUZsM2QyTlhvUTFDNFBFZWxFRWk0UHVBUHh3cmZHek5CdFAyNWhqWXBhTkw5","upper_bound":"RFpTN3hJV0dHMg==","repeats":1},{"count":451,"lower_bound":"RGExU1JLWVZCa3l5QnV6aGVyenZHWWs4VTdGUWtJVlVVSTZyRGhyNzV6VXZOUkRXam82QmhvR1A=","upper_bound":"RHM4aVo4OTloTnZCTEIxSkhmdjE5STZUaDhnOFk2ZkxVeUcxM0FObk9aZGYxR0JiME1RcmMzd0FKalpQ","repeats":1},{"count":459,"lower_bound":"RHpK","upper_bound":"RThjcFlqQ1N1cHZsZHdyOFh4Uw==","repeats":1},{"count":467,"lower_bound":"RUJJaDR1aE1GVHR5THp0RE9yQzh0TVRmYWZKb2w0bjVMajVpN3R5c3dYdzNtSU1oRGhmWmF0NEY2Ng==","upper_bound":"RUxBdFFsZzZrTjhZMDBGVGllRGdkM0JxdUVjdGlvYk95OXVWc1UzQTNoOQ==","repeats":1},{"count":475,"lower_bound":"RVAwbk1wWUVBQnZUWXpsREpMYTNoc1lrMUxER0ZIVkdCU2ZBM3BzMWF1QXhCWWJBaXU=","upper_bound":"RVRQRjFrcFNkcmhsVTBoazRSUDlU","repeats":1},{"count":483,"lower_bound":"RVdtdmdROUdJQzgxeHl5","upper_bound":"RW5Pd0Y1cHdXcVlaa1V3aG9IMkU1OTNmSW5ONldt","repeats":1},{"count":491,"lower_bound":"RW9rY0JOU2JJYUlmNHhZSlJiQVA0YzZuTlZyQU5GOGUySW4=","upper_bound":"RXZmVEJ5WDBVczBDRHVScWtUWlhiMWo=","repeats":1},{"count":499,"lower_bound":"RXhFYmN3VE93","upper_bound":"RjZRV1QzT3JyM1d1Mm1WSnN1UUdueGE5bWZpYk5XYw==","repeats":1},{"count":507,"lower_bound":"RjhPTDlpNg==","upper_bound":"Rk5YdTk5dnU=","repeats":1},{"count":515,"lower_bound":"RlNET2lRSzJ5aDhQVkFGcVh3ZXhadWdIU0JkVzVzZ0w=","upper_bound":"RmdCZHVaRTJNclRXU2hjcTV4YWtZU2VZcEZJN0lncWprVTYzUlRpcmRObWtnU1cxTVR6TnBrNURIcHp0bw==","repeats":1},{"count":523,"lower_bound":"RmhiT2VjS1dkd3h3Rld2TWJWRENSeWlISnAwNnp0NTFrQXlGOERG","upper_bound":"RnA5UVM=","repeats":1},{"count":531,"lower_bound":"RnFKYWlMeXBYVmJXRWxEdU5L","upper_bound":"RnNYTEMwY1MzdW5N","repeats":1},{"count":539,"lower_bound":"RnZCTzNab3VLWjRPenRCWThhbEprQ2J1TWlXV3FSNEpGYzI1aWx3RHBXMXg0YTIzUEU=","upper_bound":"Rw==","repeats":1},{"count":547,"lower_bound":"RzBqRVY2Qmt0","upper_bound":"RzY3UVk4MjVxY2pvZmlRd3VjU1NlT2tpSHpSNzJYU1hmZ2Z0OGp3ZXJxak0=","repeats":1},{"count":555,"lower_bound":"RzhGNW15ZnY5eUVaWXJEVlJOdE8=","upper_bound":"R0t6N09EbkRTVGZQSktpcm9rSmpMUVQxUUpsRWZaRjY=","repeats":1},{"count":563,"lower_bound":"R1A=","upper_bound":"R1o5TW4=","repeats":1},{"count":571,"lower_bound":"R2I3UFo0cEFFVGUybGE2akVLNkY5SGJJOW9TQlVOcW50VGhTazgxWnZOeW9FTW9FVGU=","upper_bound":"R2U0VjJpSGFicER6UzI0RVRN","repeats":1},{"count":579,"lower_bound":"R2VXR0xMcGUyVTdtcG5SRGJ3MFNpeFlVTFc2clV4MnBLZkVqWVpzQzVzQVFZSmFHSzA2","upper_bound":"R25iM25DR2VyeVRKVXp1VW5wWU96UGJycFJ4YTlYYVFKMHdLSGdEWXpYT0NHZw==","repeats":1},{"count":587,"lower_bound":"R3FFZmhTeEtHV2hYZWpHMTZCeG1idFJHNnVKQ0s=","upper_bound":"SDBkSFdxVDlIR1NVbUJhdHQ=","repeats":1},{"count":595,"lower_bound":"SDJod1Q3NVFsR1hieg==","upper_bound":"SENXNEF6eGwySGtxU0Zwc0dFVnNOQ0QydGJzY1V4UTZlN1V1emliaWQxSUpzdHY2T0NqOHJLMWZvcE9LZg==","repeats":1},{"count":603,"lower_bound":"SEVURmxxN0dLMjVNRXFOZVZ0Wjg0MmVYZ2d3YWpmUGd3eGk0ZW1ZanJEUVZVcG9OQ2RVdEJCWHQ=","upper_bound":"SEpxSWRoQnZWdFdham50cXA2Q3dkVzlzdTVSc080VmVpcksxUFRSdmNOYUM1MA==","repeats":1},{"count":611,"lower_bound":"SFB3QkFpblJGbDRsSXJkZzRIdndhYkg4N3NxWnlWY0pQM2ZLQkxxMkI2c0pEaQ==","upper_bound":"SFZMQ0hGTHoxUTA5UEZlWGY3UUIyMmNZazdvSUpZUmlhNmptb0pKalU=","repeats":1},{"count":619,"lower_bound":"SGFtNzZwdkFOWWloZ3FxY2hXbmhzWXNrRUlQZGROV0tCdnpOU1MyV1QwZjBIYVpsam5BeUM=","upper_bound":"STBJODIwc2tKQUR6OW1PVWtUWU1X","repeats":1},{"count":627,"lower_bound":"STNTeDhvUXlMVGJpVFRxb0tyYlpOU3VsVlZvenBzd3VjWTVNMWgwbmF2c1EwdkRHbU5xYkJjc3lRVVk4Sw==","upper_bound":"SUU5aFBITzNjdDhtNVdVZDV5M05OMEtkaFJ5SnlEcnBnT25WbWwyWUx0cnZTSzVlSVM2Uw==","repeats":1},{"count":635,"lower_bound":"SUc1Q3Q0UjZkNHlSWGVWWm9TTjN5R0J6dXlYSlBzOWZHcW9zZU9RYURiODFreUpsRlJN","upper_bound":"SU9XTkVHNmNTcWIxOG1KRENXUmM=","repeats":1},{"count":643,"lower_bound":"SVdUa1VyMkdSclo0M2VLSHpIaUJIak56YVVwOWtSRE5DcGRUTDcxVEpTTw==","upper_bound":"SWd2bEM0RWo5NkNnVDB0QWxaRmM4TmdIdUE5Nlg0Y0w0cEdTTk4=","repeats":1},{"count":651,"lower_bound":"SWltMw==","upper_bound":"Sg==","repeats":1},{"count":659,"lower_bound":"SjAyN1ZFQ3l1dXo4bFlQWmdDYUJDaEpKTEU4VXd6Z0Nn","upper_bound":"SjNLTTZlZkkxVzg3TEpRcERNdUpTZGJpTlFQZTVuTWtZdkFMemtFazhaZXFpR3ZMZWdDOXh3eGQ0aUtr","repeats":1},{"count":667,"lower_bound":"SjROQ2VCelB2","upper_bound":"SkF6Y1pJT1JDRmFaNTZLb24yb1o2bWJTN0J1d25GM3Q0R2lmbmRsY29zOA==","repeats":1},{"count":675,"lower_bound":"SkhVdEdqenpMSFpzbTlMbVg5VjhTUWpvd2tvVzU=","upper_bound":"Sk1NUjlFdDdHOUtvY0VIaklBQlI2ak11TG5XTnJ2R043ZjZGYXNjSQ==","repeats":1},{"count":683,"lower_bound":"Sk9uaVQ3RlVOcGJ6eVBlUFJIN2ZkWEhBelFkbU54NVVtdm9BbzlWYmRH","upper_bound":"SmVoQw==","repeats":1},{"count":691,"lower_bound":"SmZqZDFMaUdkeWhCMlA2VUVDOWFPZmczTVd2dXBmdDFUOHlGMm4yYzI0SkJLZTJvOEVHVFI=","upper_bound":"SnRjSXhaWA==","repeats":1},{"count":699,"lower_bound":"SzdkdFJRa1c1SnVkaXZxVEFsa2l6","upper_bound":"S00zU0dNNldHRGZqNXVyZVNnWXlUdVhoQ255aUZabnVjS3FBUA==","repeats":1},{"count":707,"lower_bound":"S1FHMXc4eGhLNUNyMjBTc3NaMTNhUkJXdkw=","upper_bound":"S1VjOUs5aFpVQ0NqOGx3Z0RYZmczcjNxN3pERVRVOXZxeU1qSnEyQVc1T2o1ZXM=","repeats":1},{"count":715,"lower_bound":"S2MxYlpodzNVcGVrR1J1RWU1ckxYRHNQM3NQTWg=","upper_bound":"S3VnTkRUZXpWNHdSY3pVQmVHUkpXeW0xbWlJZ0txVXRER0Z5UFE=","repeats":1},{"count":723,"lower_bound":"S3h0ZXI=","upper_bound":"TDF1VGFhaGdlalV3OWxCYUxJWHlFU3RWZEwzZVY0bkI3cXIzMDR4VXYzbnFlY20ycU0zYjFCZVN2bTY0R3Q=","repeats":1},{"count":731,"lower_bound":"TDRT","upper_bound":"TFBIZFh6RDJBRXdBQnZKWQ==","repeats":1},{"count":739,"lower_bound":"TGJrbXUzdko=","upper_bound":"TG9qYnNJY213VkJxMjRSU0RmWVN6OW1CSU9GdHowY3FFcnA5Tm5ITWJqZkxQS01mQ2xLbVN2dThMWg==","repeats":1},{"count":747,"lower_bound":"THB5SVhiZkpWUGJreUhmN0NrUGtHaXRrVENaODNldTdkQkhnRVVCOTVKTXQ3bFpnSmVXa1ZXb01LVWo=","upper_bound":"TThqOUgzU3N4ZjA=","repeats":1},{"count":755,"lower_bound":"TUJWdW1yb2I2eHdqWVZFQnVPaG9NM296aHBuY0NJNjlqV1RHdw==","upper_bound":"TUxGZlIyOFAxcjdSQ29WR3VGNGhMalBoZGJRc3Rz","repeats":1},{"count":763,"lower_bound":"TU1SVTA5VnZCWEdMTEFlTDk0NjlINFNWcUxud1IyM3drOUZRMkxBT2VaUmtOMkx3cEtJUVByR2M=","upper_bound":"TVh6VFNJNXA=","repeats":1},{"count":771,"lower_bound":"TWdJbXBma2VO","upper_bound":"Tjk=","repeats":1},{"count":779,"lower_bound":"TkFod0NoaHc2R0djOGNLTTYyYmR2dA==","upper_bound":"TklDMFhVb0xzWDVtcUlxbVluajBreXIxdVNzak0wQWlUNHJhM21PZ0V4eEdDaUNEdmNvTlRvS25ERXZ2akc=","repeats":1},{"count":787,"lower_bound":"TldaOFdPU3hNVmpFZEt3YWdHd1RzSkJ2VjBqd0ZNVDJ6RzVvVEwwRGxsRURQRzdXbkhZVg==","upper_bound":"Tm1wbHprSXZBWU9wcW9jbjVQMktuUjZhQTZoQmtDUjRZM3lHdTNXcg==","repeats":1},{"count":795,"lower_bound":"TnI1VThHTTRNZnoyRkFTNG1rZFFEa29aZw==","upper_bound":"TnlrSGtVdkU0b24zbnhmQ2lpbHg=","repeats":1},{"count":803,"lower_bound":"TnluSGo1djFjbmVG","upper_bound":"T0JHdVJlZg==","repeats":1},{"count":811,"lower_bound":"T0QwSEREWWFueE9UaVJBMmtYNHMzbzR5cjF2WWZGVmF0WGF1dThidGZ4NU1lR09oNWNUVHV0MjllNTA=","upper_bound":"T09oTUtFMTloOHhsRzF0OWNIemtqRjc1eVhkZlNobGV0SVRxcTRnc3BRRXc3M1F3MlpLakpMOGJ1dXZhc1lZYQ==","repeats":1},{"count":819,"lower_bound":"T1I=","upper_bound":"T2NhZnZFUjhTdHlrT0hDQlRXOHZuZGNsaDNFVXZV","repeats":1},{"count":827,"lower_bound":"T2pMUUU1c1hLbEhkQWtXckZpVkhEM3JVTDE0NWo4dDlxbEJmR0k=","upper_bound":"T3g5ZGFCWmdBVTNTSHY=","repeats":1},{"count":835,"lower_bound":"T3kwRDFvVmN5SnBHUUlvbXhD","upper_bound":"UDg0SGlQdmkwVU5RdFY2b2U5ak0zcFNFUw==","repeats":1},{"count":843,"lower_bound":"UEhjdzRoelpwWXBPUkhHTDYza25DR1lpelMwVlRJdHZ1OU4=","upper_bound":"UE9rZ2JWMUpuUWVoeWdJT0tWVkhYUHA2ak1tZjR2NWtVa1YxUzlrYUg=","repeats":1},{"count":851,"lower_bound":"UFNsV0kyb0hrcA==","upper_bound":"UFhpOTZRcFpQajVHR1M1eHZaSm9yZ2JEb0piUWZ0SmFKVjRkVTRKZw==","repeats":1},{"count":859,"lower_bound":"UFk5emJNajUyRDdlN05aR3pHZGJHQmdjWkVQMHU4THN2d2lHWWxPOGRab1RxZm9zeTBqYTV5","upper_bound":"UGNNUlVoR1hOR2haR2FRaTZ1OEZDRUFWc1BEbQ==","repeats":1},{"count":867,"lower_bound":"UG5YVDM2Z3F4cjlpeFZxRGJWM2wwRldQNjZzMFFYNWxV","upper_bound":"UHRxUDdCU1NPTlF0T0dsYXFqVVpTS1pCcDc=","repeats":1},{"count":875,"lower_bound":"UHlHYXIweGFZSQ==","upper_bound":"UTFORERRaFFZcXdTQ0U4d0dTUkJ1VDJ0dzloVFA3QWRFZlRleA==","repeats":1},{"count":883,"lower_bound":"UTdYSXJ6czBsdEZCVWpEeWdvdzFOZjFrcmlRcG93QXFCN2FYYXlNNXhMcGlYRjMyWm5Fa0k=","upper_bound":"UUZCbUFiQTZ1U2JmVnlSMXBUblgyNTNENE1U","repeats":1},{"count":891,"lower_bound":"UUZ4NWR2cDI=","upper_bound":"UVNsVkN6ZHpBcUM2VTl4SzdIVGl2NUJYWEdHRkdhdDYydG5jY3I2UWI2RUV2aTZmWFM=","repeats":1},{"count":899,"lower_bound":"UWFhTVN2OHJIUTBYSHBoTVdpa2lHYmliSUU0N2xicHhLTm9OeEs2TENwQ1c5VEtxOQ==","upper_bound":"UW0xTDZ0aWVZY0ZNUUU5cUh2bmRVYkdNeDgxSDExUnU2YU1VbWNrbDJacFhNQkI0c1ZtY2Y0OXMwaUF4QQ==","repeats":1},{"count":907,"lower_bound":"UXByZU5raVNyNGk0U3JOcXpjaTFyd1ozWDhyakY0eFF3dmxqSA==","upper_bound":"UXo5YnR5WUNNRFBNRUFiMUZnVjlveg==","repeats":1},{"count":915,"lower_bound":"UjNiaFNibDRCUHB3ek9K","upper_bound":"UkNX","repeats":1},{"count":923,"lower_bound":"UkVjMk1zeEVYY3dBSVNMTkRPbzIycTM5aWV2dmtFb3R1U1RGOVdGUE96NFU1SzJjUDFBOUp3WEl2VHo3M0hxRA==","upper_bound":"UlFTVVdnS2R3SnFWVkN2aURqbXpRMk9CV2YyNHJWOTczM0F2Sg==","repeats":1},{"count":931,"lower_bound":"UlVHV2pvOVR2SWtDVGtTTzY1NmtGRzlIWjI=","upper_bound":"UmFuSmZQSDdaVkdpOXE3UDV2cHNXRWtWa1g1","repeats":1},{"count":939,"lower_bound":"UmFySVVoV2ltM2gwZk14MmxaUk85VFl1cVFMbVk2SU5lTA==","upper_bound":"UmlsOFNBOXRGUHBmVVJOTTZsNDZUbTMzanBBbzVTT2hCM2YzMnM0dm11UmJZNTlkd1RuVjlYTg==","repeats":1},{"count":947,"lower_bound":"Um14bw==","upper_bound":"UzBBTXNYbWxTa0NrYVZBMlJkVWlpOG40azdxMFdJR3IycDJ1","repeats":1},{"count":955,"lower_bound":"U0E3dlhZ","upper_bound":"U05qTXdESXFTclBMbXJscGpFOUwwcXh5akhRZzBDdWZNQmVYcjZ3aDdoYkFGZUxkMUZTVjBydksyV3I=","repeats":1},{"count":963,"lower_bound":"U1Rremg0dlhMekhhMlZiWnZxMGtweXFpZ2RxRkpRWU01OVVCanlXTg==","upper_bound":"U2F6dnRVN09YOG8wdUYxRFNQZ2Zwb29tdEFOV1ZtWloxTUtqZmgza3lXUExDWlFLbVpCOTJIbjM=","repeats":1},{"count":971,"lower_bound":"U2lnZUp2ekpF","upper_bound":"VDhuRXBqd3N3dg==","repeats":1},{"count":979,"lower_bound":"VDhzOVBJdE4xZEtNZW9Dcw==","upper_bound":"VEh4WUZhRDE3cnhVSg==","repeats":1},{"count":987,"lower_bound":"VE5VSFlZc3Y4VFNnQlpPQkd2WWw4b3IyN0R4cHdhMmpSM05KRmdMS215U0oycnBwNEpmVG9kMGo=","upper_bound":"VFlEN0twWkR4ODlOS0V2U2xYZHA1QXdqcjluWFNRTkVkZzJobVhGYW94TEJl","repeats":1},{"count":995,"lower_bound":"VFpUVmVOVA==","upper_bound":"VGdxMlZ2RjFWSnd4elRwd3UzZ09mYWZRUHpsb1VCZTdE","repeats":1},{"count":1003,"lower_bound":"VGp4VEhUUmZiczZSWGtq","upper_bound":"VHBzVnhFdGFtZUdEdlYxelV2VE9vaktnbUtnYXZ3aFZqZ2xZN0o1UQ==","repeats":1},{"count":1011,"lower_bound":"VHB4UEJKQThBMw==","upper_bound":"VQ==","repeats":1},{"count":1019,"lower_bound":"VTBaRE96NDByQ1hOYzV6SEYyR0lUTWpVNWlWQ0trSEpYRA==","upper_bound":"VThNeGtVQzdyS0swbERUQQ==","repeats":1},{"count":1027,"lower_bound":"VTkwbllrbjdaTnI3NHV2U0xnMElZc0JjMENvM3pyem01YjBlTXFIVnRjU3FuYUx5SXY4TkVYd2g=","upper_bound":"VURJUEY0S1lrdFFxNk1KYWNSZ2pUa1hVZ0JzU1c2dEh4SUVWTWJjV0ZDSjZxaDh2VG1nYzlRQXZkOGV1Vg==","repeats":1},{"count":1035,"lower_bound":"VURvZk5VR05xVXFQanROWWFMZGxIQmF1SWk=","upper_bound":"VU1DdFBVZ0VZUTVlbkxFMVFBNG5DWjVLdHZBVzdGano1dUtuREp3VmpQa0t3MFBIU0pVaER3RDRoZHE=","repeats":1},{"count":1043,"lower_bound":"VVBVZ2UyVU9iQ0JrSWNpYTI1cUZ2eXBZcFRlWEU=","upper_bound":"VWJ2azBkQkVqM0Rrd090YkJRdjBwTFFZSVUwUTQ1aXA4MW9P","repeats":1},{"count":1051,"lower_bound":"VWZUN0VzcUw4b0hwZ0JnZjU0aDlhd0wyTHE1NEtvVDdpeXFP","upper_bound":"VWx6aHR3eldVMnh1c2p5Qg==","repeats":1},{"count":1059,"lower_bound":"VXNyNWFVNUNBYlZYeGZqRHloVjlLd1VKY1UwQUxXZHNka0FtNUoybTQzZFkzaFViZDBkWnpqbWl2Z1Bi","upper_bound":"VjBESTVLVDF2bnJyRzNqRkxBMFVVYjZPdA==","repeats":1},{"count":1067,"lower_bound":"VjBGQXo4em1DRE5jdkE2R0k0TjdidlVkaTBtWDdBWWxDVnVVdEZK","upper_bound":"VklPU3diaFRlMGQxaThQUzhqSVlmbVF5WERGSThtTFdSb094cURIdWg=","repeats":1},{"count":1075,"lower_bound":"VkxScjU2Y2tqUFZNaXgy","upper_bound":"VmhIazNRUDVPUXB4b2JVaFVPMVpianRCaFJsanZEYnQzNTRqalFtOVQ2WEVDMg==","repeats":1},{"count":1083,"lower_bound":"Vmh6cUJTTW5Jbmtnc3NGVndueUVGTm1LVFVncmRsNWJKTDI0aUV3V0dyd2U=","upper_bound":"VmtMOFJjWmFqdjhQbmYyNHZMQ3JZT2dpdkk2c1FhQ1ZVTVlNTVZ0cUt0Njg1Nkd0aA==","repeats":1},{"count":1091,"lower_bound":"Vm1MaHM4SzBjNWswQW0zaUpBdEJSYWthR3g0b3Y=","upper_bound":"VnNoaWxyS3BybFAybjFtMjZkbFRJb3hJemptd3pOMGli","repeats":1},{"count":1099,"lower_bound":"VzBpclY4NUhrT0hkSFgzRkdDNUx1WXpiZkdKQktTSk1GQUM3Sjd1eFdpVWFIdkJQcFQxUnVHM1daU3dadms1bg==","upper_bound":"VzZ1amNnTDRXbHhoN0ZPTGdVOWx1QVNBc2pZWWg=","repeats":1},{"count":1107,"lower_bound":"Vzd3cGFIZWpFNkVYd3lHcmZPajk0d1VEWEs0N056djBodmRU","upper_bound":"V005a3FmRVBCalluR0JnbVNkUzlzcW1VSlhxNkl2VUJMTXp1b1VDNTczaWM0Z3pMYw==","repeats":1},{"count":1115,"lower_bound":"V1Z1OVh4VkdSb1JIWjBaT0FUYkc1Y0RqejE1QkNGdjNIVEo3YXZPWXV1Z25idWZMVTN4eFhKZU9WUmlteWdHbA==","upper_bound":"V2tmMjd1emRoNml0aTJkZHJqa3NpTFFwU21OYVhrYVl0aGhtRnBPdFhIcmRSRFF2azAwanJWR21U","repeats":1},{"count":1123,"lower_bound":"V3RXWEQ5YnJ6YklNR01iVXhHRTRIV0hDNU55WUJmSU9Qa1hScw==","upper_bound":"WDlkVUhTWXQ1bGJZWDdEQ0U0eDBsM29XanE3OHlPSUZqZHB1Rg==","repeats":1},{"count":1131,"lower_bound":"WEU4cEpyQ2hTcmZraG9wbA==","upper_bound":"WFYw","repeats":1},{"count":1139,"lower_bound":"WFloNGNUS0VLV0xRNFZBazZOMDFvM1VPUkJ3ZXZyN3ppVg==","upper_bound":"WG9KbmFGOVk2SFZienhKYlAzWUNNV3BHbg==","repeats":1},{"count":1147,"lower_bound":"WHJhNHhpN1lneG4yV0lGeGNvNGdhY0tjUk9yZHF1RHB5dnRraDdwTGs3cUozc3A=","upper_bound":"WHpKYzNzd082ZUE2eTRrRjk5WjRDMHBFU1o5WDI5S2hQ","repeats":1},{"count":1155,"lower_bound":"WTNVUlN5bW0zOGxXOW9SaUlFdXdrUVQ=","upper_bound":"WU9FYmo1U292","repeats":1},{"count":1163,"lower_bound":"WVFUSnp3RThxMlFPMWoxaTRsOGhL","upper_bound":"WVlHT3drTnlSNFRpbG95R2dydEM2dEtidEJnTTFtZXpEb2FETm9hUg==","repeats":1},{"count":1171,"lower_bound":"WVlQY3oyT1k3SWhsZ2NZVUF4MUhDd0ZXS2k2NHJMNTJiYWpWenVLVERZWTRO","upper_bound":"WXVxbmJXMGJIWjc4VEl4WVVzZmltSkFnMVQz","repeats":1},{"count":1179,"lower_bound":"WXh1ZkVYVngzMFZORmVoeUNsS01KMg==","upper_bound":"WkNxbm1CWQ==","repeats":1},{"count":1187,"lower_bound":"WkhlZ2E=","upper_bound":"WlVMNHRCd0QzUnhVS2VNaGJIMTM0NU5pQkgwNUJyaTdRcElnbGxvU1J6aXhhemVIbFp6RlYwWkQ=","repeats":1},{"count":1195,"lower_bound":"WllidWdQV2pLV1FVclVqcGZhdUdrSnRLcXo=","upper_bound":"WnJsR2Z1c3ZS","repeats":1},{"count":1203,"lower_bound":"WnVwTEtxQllIVExkSzNhdGtIM3lTOVRDdVJiNE5xejAwQnFMTUxYbzZkRUtNYUxtZ1A0WnFJOXI=","upper_bound":"YTZlbTRxdA==","repeats":1},{"count":1211,"lower_bound":"YUFacDV2cXRtZGdvU1p6QXFzVE1aOGJQTDZMSmFyc0E0Sk9oT2RwSFYweEgxaEdHNGRPMmFiSQ==","upper_bound":"YUpYVWI1aEV2bHVPWXEwb0tLMjRqMzdwZzR4MGRrWXNhWmp6","repeats":1},{"count":1219,"lower_bound":"YUp2NWlUWEVJbnpuOWFrMQ==","upper_bound":"YVVPTVgzcnRTZlg2Z1NXTEIyUEd4SEhyaUZOdGVMVE40Vmdjbzd6NQ==","repeats":1},{"count":1227,"lower_bound":"YVdjM3U0eUZlR1dLaGs=","upper_bound":"YWxCb0NSR01YWWNtcDkzd0RUT0xLdjlIQlZKemtvNnVFazA4REpOZE8zMFpNVGlydW9KUEs=","repeats":1},{"count":1235,"lower_bound":"YXN0cmQ0VFNRalp2VWhKaVA4bkR1OA==","upper_bound":"YjZwbDJYTWQ1azFOYmpQdzVPMklTSVpWTjhhTmpQNWg4MktwVU5nbE5oMnZF","repeats":1},{"count":1243,"lower_bound":"YjdvU1Q0TE1rbkxCWmE3d2FvZGV3Z0wyOQ==","upper_bound":"YkljenVFSHlN","repeats":1},{"count":1251,"lower_bound":"Yll3djRxOGVaempzV2lnMUZiOGNSU3Q2RldK","upper_bound":"YndwSW9SdGw=","repeats":1},{"count":1259,"lower_bound":"YzRGYzU2dg==","upper_bound":"YzVmWXZ2ZjVQVkJRdUh2RTJHMUdwY3dZSkl0VnZqUU9VSWNqam9yZGdMM1VBYWdWUUIyVkZZQVljWDk=","repeats":1},{"count":1267,"lower_bound":"Y0EzVEJwOW1aNUJFYjZpQ2FTZDMySGRMVDFEazFRbWxhb3BNdmtrM0E1elNNZ0dCWkNsUEVzOWVm","upper_bound":"Y1JNdmFBcUVzY3ptc00wYURWcjZiZnB3ZDBi","repeats":1},{"count":1275,"lower_bound":"Y2hQUkZhcmhiZjNDNEdSUkxJMnBvb1hiSnZYdVhaNmgyZUhRMDJ1cmVIUlVPOHBpODdE","upper_bound":"ZDdDRWh4OVc5V1RDdjA2MUZra3ZCWDA4Um03NDRqRGJndEZoT3dOd3ByMU9W","repeats":1},{"count":1283,"lower_bound":"ZDdieA==","upper_bound":"ZGR5TnFPR09CRFoxR2cwemh1MWw5Z2djSXNPYw==","repeats":1},{"count":1291,"lower_bound":"ZGU2OUZmUWROZkhGSUpxSWRjREpmS3hpQ01SaGk1Vzk5T1J1bUNOZ3hpSng0Y2VOVnhSU1ZqamVPNGdGNWQ=","upper_bound":"ZHQ0SGd5WURkWnVQTTRpV25iTld4ODZaM1pnYW1BTzlTS1RHQ0VsVk5iVlUxOFlC","repeats":1},{"count":1299,"lower_bound":"ZHZzdGhrNk1CSTA0Y2I=","upper_bound":"ZTNjaUJUVXhvc29BejM3SWpVRmNHREJjbjJXcDF6Mm9LRmhzU1pyZXRCZXBtY1dJMHhNZ1NsTElSTA==","repeats":1},{"count":1307,"lower_bound":"ZTY2OEFHd3F0dFVuVFRIa1NMQ0kyWHhsbHU2YTdMRWlsY0ZMUFg=","upper_bound":"ZUQ2NGVSSUw2bmNmUWtsTGx0Z0Z1S0NuVUR2RnFoS20waUhJNXV3NGdacmw4NmlYU1pzWWJNalRmaEQ2MzZuRw==","repeats":1},{"count":1315,"lower_bound":"ZUhQVVIxa3duMXVVZnN6","upper_bound":"ZU1xbFhSVVN1OWEzVmZ3MmRiT1BnVkpkQ2NGelMybG9lbmQ3TEpYRndQaE5l","repeats":1},{"count":1323,"lower_bound":"ZU53V1pxR05MRjQ2SmhiU0FxN2hiZmNOeG1EMDBxMEhIbVA=","upper_bound":"ZVVNR2t5UHI2VWpoN0k0dWxkb2lBV1Nzd3RkWTVOWjdMOVJNZ3BiM1RLSkZSVnBZUGg=","repeats":1},{"count":1331,"lower_bound":"ZVdKOVozRHkxR3M0QXZOa0MwUkpQYzVmMW9tdWowUlU4azdqeHB5ZTdRejdnY0xMNA==","upper_bound":"ZWRhaWtJUGxZMFFMRHNZNGFUTQ==","repeats":1},{"count":1339,"lower_bound":"ZW8=","upper_bound":"ZXp0","repeats":1},{"count":1347,"lower_bound":"ZjdQVmZaSmxl","upper_bound":"ZkoxQWliYVZmRTk0bHB0ODNiNGtBRE9jQU8ya0pxaUdVWWRkVjRm","repeats":1},{"count":1355,"lower_bound":"Zkx0b2ZLRzVtWmhTSWxXbHFRYTFOdlBHcnBaUTJGazJ3ck10OU55M2MySE5RM3JaeG9IQ0tzVTVNOTIzY0ZyVw==","upper_bound":"ZlBVM3NOWWZUMjR4aUJtQldnM2hUUlFXZ2ZCQUdHUmJiSWU=","repeats":1},{"count":1363,"lower_bound":"ZlZPOVRuUUZwQ1JKbDlwRmJNUGdJUlpPUmU4ekw0aWd3MVZXeXZUcDhtdFp1MmRjZ09BNVRyc3J6Nw==","upper_bound":"ZnM0SG1nUENOdmpRUnNVT05LOHRmZ2trWVVlRnVoc3pWblFTMllZZ0hOcDJENmpOUEQ=","repeats":1},{"count":1371,"lower_bound":"ZnM5bWZScHE1bGptajZXTG12dk9kb2lFcDVJYUZjSG5DQ2JpOHpScXRtNW1WaHZaaVR5NzQ=","upper_bound":"Z0h1V0x4TVp5MG5MZDVkc3hmMXRta1dhUWhXN3J1UWNU","repeats":1},{"count":1379,"lower_bound":"Z0lh","upper_bound":"Z050","repeats":1},{"count":1387,"lower_bound":"Z09zSGpWOFlVMnlzbjJPWE5DY0h3V2xFaFc1eGZET1RPSWc5S1RXckNMQVJnVThhWnpWVUNXcU40RA==","upper_bound":"Z1ZDbDdhY2I5QkNoTWJxdlViR0RORDA4enFnQkRZNnNWMEVkT1FsenlXOUFPbVQxUUN6SQ==","repeats":1},{"count":1395,"lower_bound":"Z2NNbmY3cHZKOE90WFdJY2pacjVHSkl5MTNMWlIx","upper_bound":"Z2c1R2pFblphM1RISWZuTGl3ZlFLamh0Z0x2TWU1bXR5TlVTQnNUa0hRU3p3aFNtRGVPTG9OS0VoSWJnNGJE","repeats":1},{"count":1403,"lower_bound":"Z2dBeEZ5RzBWdDhwYkhvdml3akR1ZThwdHpDV2pwU0FJbklTbllEVUluZk9UbllTNDI1ZEhxQWFRbHEyQzZk","upper_bound":"Z29MV1NRTnQ0Z0gz","repeats":1},{"count":1411,"lower_bound":"Z3FQYTJ3MWRjR29kVFJkb3pseUZWbTFkWVd1OUNzV3E=","upper_bound":"Z3c0cmR5VWx5NGlBVGUxTnp4SUkzRWRIN21PRVpmMll3aGM1Z0Y1S2R6djhDUTR4clBY","repeats":1},{"count":1419,"lower_bound":"Z3lpTm1nSWJxQVM2TkdsM2IweEdQcmFJV1JuTHdxT1Y3aUw2b3lteDhxTw==","upper_bound":"aDJXNEtVcGZhdUNMSXhFaUl3cFhsRHpzSlgzQXVoeFlQb0ppalU=","repeats":1},{"count":1427,"lower_bound":"aDRzUEZ5aWdiSnRnV0VrU21KSTNzQ2ZQYlpEUEZvejhU","upper_bound":"aEE=","repeats":1},{"count":1435,"lower_bound":"aExFOU1jaGFuTzVxdmdhZUZuNVVS","upper_bound":"aFdrRHM5M3BDejM4VmhRUHAwVnlOTGVudGs3dzM5VVFOa25MMmZBWnN0anB6ajcwenE3aWVqUGlsdGVHQW0=","repeats":1},{"count":1443,"lower_bound":"aFph","upper_bound":"aGV1NVVSa0VsdVplUk13OURvUWtJUHN0SGZlMUxGNFNRc0hnZEtQRlVTWENObA==","repeats":1},{"count":1451,"lower_bound":"aGxDTXR1NFJ2clZlb21nelE3MkVkalVVa2R1cFR2d1RRV3JndEY=","upper_bound":"aQ==","repeats":2},{"count":1459,"lower_bound":"aTI5cjN5Y0JIUGJlV1FlYldXUE5yOVph","upper_bound":"aThpeUNTbUFFTE1XSWZwM3hnS2c=","repeats":1},{"count":1467,"lower_bound":"aTlkUGZ2Nzk=","upper_bound":"aVphZHZiNHNhYklMNWo=","repeats":1},{"count":1475,"lower_bound":"aVpqRloxTkhEc1h6d2pEa2FIMUkzWjZ6ZjZyYk9tTURydjBWS2F2SjZiRw==","upper_bound":"aWZGU3NkbjZwb3BiWlZnOGZmTVJVOUF5aVNhOE8yZDdlMmhoTGtwSWU=","repeats":1},{"count":1483,"lower_bound":"aWZKTEZBalZFM2tWYVZTWXdy","upper_bound":"aWpabDlncXN4cUUwUWlrSkg1bWE=","repeats":1},{"count":1491,"lower_bound":"aWp2Rk5lYWlpUG4=","upper_bound":"ag==","repeats":1},{"count":1499,"lower_bound":"ajlDbkRmS1prQlRTQ0NvdENZWkI=","upper_bound":"akYzZHJGYzlzWlBCZkhXRzdhNGRpU0IxOUt6VEE3Ykh6R2xCZGdJQ3dNckVUMmE0","repeats":1},{"count":1507,"lower_bound":"akc2WGVmOWJ1cGVnWFZzSWl2TzR6Nms0TmI=","upper_bound":"akw0ZlREOVU1MTIyV0FKY1liRTB3Nld4ZGxPYTRPS3B1Zzc3UDJvRmJUYld4YQ==","repeats":1},{"count":1515,"lower_bound":"allpRnJjNEVjZnN2S090QjRpM3JxaEtVVzVaaW1JSUFJejJCVXdi","upper_bound":"amQ1QnFKT1dEVnluRXJtRnNwOG16T1EyUHJrR1lmTlhHTUtxOFdJZmsyUktWVElwdmZsak9YenNseWJnZ08=","repeats":1},{"count":1523,"lower_bound":"amRWTElYRA==","upper_bound":"am40aEtoanJheEdkMWdWZ0xLUWswSXg0T2hLam1DeXNmc2xheVpJaGR5QmJTMEw=","repeats":1},{"count":1531,"lower_bound":"ang5S09rNjBOOGdz","upper_bound":"a0FIN002","repeats":1},{"count":1539,"lower_bound":"a0R6T0podTBzcmg1cHZRU0VTZTBOcEtYbHBlbnhDa1VYenlrejc=","upper_bound":"a1ZwVWZTU1haN211d0RpaWpSNjN3U25kZFNtV1lDSlV6c0VYcFY2RW1FWGtPTEJwUWEzenlnTTdlaG9w","repeats":1},{"count":1547,"lower_bound":"a1Z6ZlhPeUd5MWdDMjIwQmtzVQ==","upper_bound":"a1pNTEluUnFrazFtV0xGWmJCMUNFSnlrcGNoTklQaXZCYm1EM3IxdkNQQlVpOVdQNDlBNWY=","repeats":1},{"count":1555,"lower_bound":"a1pXMVRjdk1vREFN","upper_bound":"a2NBbEdKU3Rjb2NCZGlGbWRIRUJDbDAxTnJ2emJRVnYzNzg1VTVqdWRiaGRpOFJtUmptSg==","repeats":1},{"count":1563,"lower_bound":"a2ZuZUFCREFIRzlPamF6YWN2NGx4aDVjRnJucGVUd3BudTNqajYzeVFZRTZzRXlXTUhYMDM3bkFlZmI=","upper_bound":"a2liVG53VXgzWHdHV0prVjluTU5EdWdEWEl6eE1RY2tKT3pSWW5qbVBCcEw0SFM=","repeats":1},{"count":1571,"lower_bound":"a212RnNISEtVRFQ=","upper_bound":"bDBySlBKdEVyT1ZPRQ==","repeats":1},{"count":1579,"lower_bound":"bEVWaWt0eWR2WkVQQmdFdjJMNkVJTlNIZlU5cTVDcWVKOTRjZWNjMjllR1I4WA==","upper_bound":"bE0xaUowa2IzaW1ZMmdKYnJiZm5WZlB5cmM3T2ltQUFxRGRMTGs1WkZBVDZUY2VVNVY1TFRmVzV3a1JzSg==","repeats":1},{"count":1587,"lower_bound":"bFBnOWMzaldwZjJHMENzd25NMElBWnpaVkM0VVdHcEd0dlprTQ==","upper_bound":"bGFtWlI=","repeats":1},{"count":1595,"lower_bound":"bGQzM0hOSUxIVkZNcE9WV1hGZzRzU3plcw==","upper_bound":"bHI4dTdGbnNHRW1mSUx0OFc=","repeats":1},{"count":1603,"lower_bound":"bTNNSEdISDhVS2xPR0JGOXBvd2tLR2ZocUF2RHJjZVUxM0t0ZDNkU0o3UA==","upper_bound":"bUhjVmtiUGZMU2JsU0NET1pEeVR1d2l6RWJT","repeats":1},{"count":1611,"lower_bound":"bU9rY25IZm5HQ2o1WGVoM0t3eWFQRU9pVjJOMm9NcEJuaVFKN1FYZzY=","upper_bound":"bWROWWZEdQ==","repeats":1},{"count":1619,"lower_bound":"bjE3Zk93dUp4WFpiaVJ6ZEJmbWgwaGF0QlNiNml1aWpmWllmNndBQ3FaaHA3MzNCVGk5","upper_bound":"bjhuYVc1YmZmUTdxU3lhSmJXNzlodmRhRg==","repeats":1},{"count":1627,"lower_bound":"bk9HcGo2WnJrY3FFck9aU0JNR2dOank3R09XSmlO","upper_bound":"bmJVWVNwU2dSS0pZNG9lRmRKZU9EUE1ySTcyeDNFR3NqeTF3bmlXTHZqTG1IbzY=","repeats":1},{"count":1635,"lower_bound":"bmZjd1l2eWJ3WlJUcDJ2OXFaNVdBOVZaS2NYc1V2MGxPaGRNdzJQZ0JPZk8xWA==","upper_bound":"bm5GRkVTMll3ME03MW9TeEpEVFhiOG92Wk9DOHJkNU5YOVlCeFhIald4Wm51RWpiSkY1YQ==","repeats":1},{"count":1643,"lower_bound":"bw==","upper_bound":"b0JHTWF5MXRkWDVDZW84b2pvVzlKaVc=","repeats":1},{"count":1651,"lower_bound":"b0RZNnhTZHB5TWs5d0p6dmlZVkxYTTlQekFueGhNWTA=","upper_bound":"b1FRdA==","repeats":1},{"count":1659,"lower_bound":"b1Vxb1hMRjdEaFV1aU50OUtWdmtIWGhPZjFQTmd2MUo=","upper_bound":"b2lGR3VJRnU1eW5rYnQ=","repeats":1},{"count":1667,"lower_bound":"b3JtNngzTWEzN2tDN0hoZ1Q5R0xXRmFmT0RZRHVmcGxCQmcyTU1BTXlH","upper_bound":"cEdQTFVORlNTa2U0R3oxazgyaGE0U2FtaUFRYjJTV1RySVVQUHg2VDF3bkltS2tjTG45VEpqbWI=","repeats":1},{"count":1675,"lower_bound":"cE1QajdVQ09NYjV2OGNGZTBUSEt6VzFDWlMzbVNjb3lYZjJTQ2VZ","upper_bound":"cFBlTHQxdURmZnRQQlAzbm1NVGhIVQ==","repeats":1},{"count":1683,"lower_bound":"cGE2V3dzYzV6dEtEekdhNGVLa2NGaDlJVVVHTFZ5UVFRYmRTOXB1cWJOMGlIcDdpNVZRekVXdkxGTkd5WA==","upper_bound":"cGpUT3pDS3h3ZmVWcU5QUjJTT3k5cDJZa292UXJIUldEMUhUR05xRTJWMEttQWE=","repeats":1},{"count":1691,"lower_bound":"cHBoYnBCNlUzb0hxOTBoVW1UTXNrZ0E3emEyUmFUbW5qWEpu","upper_bound":"cTZjMndYc0lGc29yWEg=","repeats":1},{"count":1699,"lower_bound":"cUFteTIwQVd3azc1RjM4STdybUhCVWxFZFp5ZG9DWFQzSExEZ3BMMFZSN0dVY0VVQnNpWWdlTHlCdA==","upper_bound":"cU9kaEJFdGJibzNDTUFXdWZqcHUxdng5NFgwbQ==","repeats":1},{"count":1707,"lower_bound":"cVdJNGN2bDIzTDFSQjM1dkRzaDJXQkd6WDkwTjBkMnZUOFRRRXE3RkMwRkhwMWRWZzdBeWxG","upper_bound":"cXkyS3R6bmNQcnhsQWhJWA==","repeats":1},{"count":1715,"lower_bound":"cjFNUEdmZlpwcGd3WExpUHJWdGdSSXQ3YUl6SzI4OW5Bc2FyWGV5REVmRmhyaXZ1a1RmbGtNRzkwT25q","upper_bound":"ckdBMDN4U1JLM1dGSkR6MkR2V1BZa3ZOMXhyclU4aGRycXdXQjVncGV5MDhxZ1lhbG1lSkRvZTNSclJWNW5V","repeats":1},{"count":1723,"lower_bound":"ckloQmF3VURRSTFnQVBLczM4R0lISXBvRm91THBSU241ajlO","upper_bound":"ck9GMjJYOEpWdkFWNlhwbkR1N1pncUdXVE45WnY5UnhXbU9Ud2U4UnFPbA==","repeats":1},{"count":1731,"lower_bound":"clFaNWxpYlp4emlSTnI2aGJ3ZUJOaEU4RnR1cWdMVXo0cGtLQ21FcmZ3","upper_bound":"cm8yS3Y=","repeats":1},{"count":1739,"lower_bound":"cnBIUElvc252Q3NncXBmMXdWRkVEUEhLaW42Umg4aTI4STRwelYzSTJ4TUg=","upper_bound":"cnRhNTF6Y2loRExQZ2d0YlJONW82MXFQdU4wTnhuVw==","repeats":1},{"count":1747,"lower_bound":"czF2OXQ1cXV5QmlBN0hld09Cd2VOOTFT","upper_bound":"c0hJTHhHOFB0UlhRTVJDREZjVWRqZFJMNnVVeUl4VGRNWFJHVQ==","repeats":1},{"count":1755,"lower_bound":"c1BNSXNVeWN4TlFSNExRd3pQVDZQaFFPWWxDbG5OVjZ6MzNB","upper_bound":"c2xlRFlnMw==","repeats":1},{"count":1763,"lower_bound":"c2xvd0hiM2dKVkpERmxtRURpYVpkaEdSeE4xWjhT","upper_bound":"c3ZJNU81YW1rdDJNM25SVFBHOENyWnk3SU42aU1TQmh5VGtiTk9UaGQ=","repeats":1},{"count":1771,"lower_bound":"c3dFeERSc2QxTjg2dzBLWnd3aFBxcThGTld2RjRFdm96WHRubHJ0ZGNtQTBaRXd5TGh6","upper_bound":"c3pVM3lHMw==","repeats":1},{"count":1779,"lower_bound":"c3puZ29PNzU0UFhiQUh2YkRiMUxFZTZTMkZUZWFXaXc0ZHZPYjdlVQ==","upper_bound":"dERNalJHQ0MyZ3Z2aE5ZNXl2d0xuWkdKMnpC","repeats":1},{"count":1787,"lower_bound":"dEZKT25USmpSQjIzano0TUtOUUQ0b1dLdTREcEJxbmlqcFlQNnY4RQ==","upper_bound":"dFZVRWphbGdRbU92YlBrcDNndWhaNnQ=","repeats":1},{"count":1795,"lower_bound":"dFd6OWRIMm5DSzVGRHNmbVRKYWluazNYU0ViMm9u","upper_bound":"dGxtcEM4UkhSWGZ5UjlqT0pvR1YxNm15SlZNWXNGVG9yM3ZuUFBTQzdTSnVFdHRJUQ==","repeats":1},{"count":1803,"lower_bound":"dHFhc2ZQSmdnMW5FSHJ5U3lYRm9MelA1M3MzTmlUSHpOaWNTMUo=","upper_bound":"dHhIYjNBZjRvN0xi","repeats":1},{"count":1811,"lower_bound":"dHpEanRMUHNvcVo4SVpoWkh2OG8yelFEV2xwV1BacXFqQ3NLa0Z6TFRvNU4=","upper_bound":"dThna3VBQ1dTUkRzdElFNzZVQlY1VFhUZ1Jod2FSdzZORm5C","repeats":1},{"count":1819,"lower_bound":"dUVoQ09xdDlIR25RWlVPaA==","upper_bound":"dU92MkZsZlJpdmlERGw1WlEyd1BweGtWa3o=","repeats":1},{"count":1827,"lower_bound":"dVB3dDRwZ1YyTzZxRVU0TFJB","upper_bound":"dWlNaUpybTg=","repeats":1},{"count":1835,"lower_bound":"dWsza0R0Nm15OXBJZWR0MkpnOW5uOEpzekJ3dnh1a0RlbEJRSXpBNlUxaEdO","upper_bound":"dXNpZzVrV3ZZSjQwdUY0cFBaWXZxT2tBaU5a","repeats":1},{"count":1843,"lower_bound":"dXY=","upper_bound":"dkNjUHRVTFRNU1JzQjM1N2h5UDdzcWxST2g1SUk3VXdZblZmTGp3Yk9kZlhxSDl3QjNMaGhLdjJs","repeats":1},{"count":1851,"lower_bound":"dkNkNldLQVpUQjNtMWQ4YnpndWU1OXVnem9aMzN4aGhLYQ==","upper_bound":"dkdrTXMzWnFrVkxXYWl5WmJMQmhlWG1GRld5a25KVjE5aFBRa0prV0xCb0xpaQ==","repeats":1},{"count":1859,"lower_bound":"dkhwY1ZOWVByVEJQUXNibw==","upper_bound":"dktzMEp3djlwbFNWMFo4","repeats":1},{"count":1867,"lower_bound":"dk0wcTVEeHZ2akZnVnB5azR3dGpWM0dnaTNCQkQ4Y3ZjOFlxeXUxc2thTkRnT2ZhMA==","upper_bound":"dlc3d0xlZVVqZkxBZXFMeER6ZlV6WGFNbnlqdjlCWWxIdkZIemV5cW5hOW15cVdF","repeats":1},{"count":1875,"lower_bound":"dlpQNg==","upper_bound":"dw==","repeats":1},{"count":1883,"lower_bound":"dzZiR0VITmNrVkFKclpkT0JpZjhOSnd1MjhZbDU=","upper_bound":"d1hpa0F5OTMxaVFKU0FMZ2R6VldmcXQyYmljSVM3cU9EN3lKUWtJQjAzbmRqaWgzMGJnTkNuNg==","repeats":1},{"count":1891,"lower_bound":"d2FUR1FPck5vUm9GclpxWFRZeDNHTFBreA==","upper_bound":"d2hwdkllUTNOcTdvR2ZURUxWajk1VmRJTW1JQUVTY2NNd3NZbzJOMnEyeU9KdjdT","repeats":1},{"count":1899,"lower_bound":"d3BKcUxXUGxXWUNk","upper_bound":"eDRHRDRVWnJFZ01QaFZpeQ==","repeats":1},{"count":1907,"lower_bound":"eDlhMk9rUk5aUXJCTFhM","upper_bound":"eE8wRE9ucFRHWDM3cDVPSHN3R3M4eGw5VFhzUU9xcG5Lam5uZjVLZ2FxTW5KUW1MSDFwbQ==","repeats":1},{"count":1915,"lower_bound":"eFM=","upper_bound":"eFZ5Z3UxU1hqZm9YZ2tXbFdYTld6cEJw","repeats":1},{"count":1923,"lower_bound":"eFdFekd0bzJ6WDEwbDJIcWVsR05JSloycmo4djJEVERyTlFo","upper_bound":"eGhkdG9ib1cxTE5yVlZseU5QNw==","repeats":1},{"count":1931,"lower_bound":"eGhoMWY2UEdCZlZETEJlQVBNUkZrMTlwaGJHNlU2dQ==","upper_bound":"eTdYak9keG5yOXAwbnRZSjRPZjgyWXRZOHQ0RWxFcXE0bDExdEEyWlBtSXl4bWk0NDJER3lpNUVINUd4ZE1R","repeats":1},{"count":1939,"lower_bound":"eUY1em1WVmY5bGNEdVl3Tmx2enpsRVZLbU9jZ0RIeFc=","upper_bound":"eUpoSG1lclQ2YkxGcGFWb3ROd000dDhEUkowQ2ZLQ2hCN09rOFVUWldvRFVzOEx3QVNxbA==","repeats":1},{"count":1947,"lower_bound":"eUpvQTk5Mk4=","upper_bound":"eVJGVFcwZnptM29COVplS3MzMExLOGFHRW5UREM3WTliMWdrSGZmMVNzZ0NH","repeats":1},{"count":1955,"lower_bound":"eVJmYVZ5blcySkdJVGViUGt0dzhVWGtHMmthQms=","upper_bound":"eVliRWJHUjF1SkIxazlvb0txczN4NTdxTXAyRWxMb29NQXFnVGhEcGJDQ0N0Q2daQk5pekVxTUZkWUg1","repeats":1},{"count":1963,"lower_bound":"eVpaVjJJcm4yOHU5OGhwNDZvZFlqN085OVpNelk2VEVtTHhyWVpvdXNWdE5QSFRZeFVwdVI4NVMyZ0I=","upper_bound":"eXBwNUJsTlI3bnhOaW5wTnNSZkxiOHV5WklCMUpVUm10b2R5UA==","repeats":1},{"count":1971,"lower_bound":"eXNVMmZhNTBwa2pVazhUQzlTUWE0eXN2QmpFTFcyOU5zbjVYZDBXUE1QYnNKcUF2UTM=","upper_bound":"ekh6","repeats":1},{"count":1979,"lower_bound":"ektWekpX","upper_bound":"elVESlI2ZGxDVWZrRWxsN0tMWk9HeUo1Q3lyOUhyN0o4REdFQ2VZZlBITVFSaVN4WUlqWjVlZWNNalY=","repeats":1},{"count":1987,"lower_bound":"eldTZ0VlMWx4NnZ1TzN6RTVVemFseDJrRkhGb1lMWWEwOWJNVTBMUmNpbERQYjhiVw==","upper_bound":"enBpVnptQVN2VW5NUmVnQjJ4SUVIUmJVTHZDTEpRQkVpM1hoazVKSnM=","repeats":1},{"count":1995,"lower_bound":"enIzZjBoNWlSa3JhM3lSeWlMZHg0dGMwNm9uclJMZmlMa2N1MExYQmZuZVcwdkhQNA==","upper_bound":"enZ5UzVLMXVhdnBINTVaTU9HU1FpTjBjbFJ2d05YZ1puY2lsbVI=","repeats":1},{"count":1999,"lower_bound":"enhkUUlpb0FX","upper_bound":"enoxd3VjUWlrd005MTgzcFJ5Y1V2b1hyREJzZEZJZWIxWE80QWdZNWZXUFd5aGpa","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,0,1,1,2,2,2,0,2,0,0,0,2,0,1,0,3,4,1,0,0,1,0,3,1,0,0,1,1,1,2,2,1,1,1,1,1,1,0,1,2,4,1,1,1,2,1,0,0,4,0,0,1,0,0,1,0,2,1,3,1,1,2,0,1,0,0,1,2,0,0,0,2,1,1,1,1,0,0,0,0,1,1,1,0,0,2,0,3,0,3,1,2,1,0,2,0,1,1,1,2,0,0,2,1,0,0,1,0,0,0,1,0,3,3,2,1,1,1,1,2,0,3,0,1,0,1,1,0,0,2,1,0,1,0,0,2,1,1,1,2,0,2,0,2,0,0,3,0,1,1,2,2,1,1,0,0,2,2,1,0,2,1,0,1,1,2,0,1,1,1,5,1,2,0,0,2,1,2,0,0,1,2,1,1,2,1,0,0,0,2,3,1,2,2,0,3,1,0,0,0,1,0,0,1,2,2,0,2,0,0,1,1,0,1,1,1,0,2,0,1,0,1,1,2,0,0,2,0,0,1,1,0,1,0,0,0,3,1,2,0,2,0,1,0,0,0,1,1,2,0,1,0,2,1,0,0,0,0,2,1,1,1,1,0,0,1,0,3,1,3,1,0,1,1,1,1,3,2,1,1,0,2,0,2,2,0,2,2,2,1,0,0,0,0,0,0,2,1,0,0,1,1,1,1,1,0,4,0,1,1,1,4,0,3,3,0,1,4,0,0,0,5,1,6,0,2,1,2,0,1,1,1,1,1,1,0,0,2,3,2,0,2,1,0,2,0,0,1,2,0,0,0,2,1,1,2,4,3,1,0,0,0,1,1,1,0,0,2,1,2,0,1,0,2,1,1,1,1,1,1,2,0,1,1,2,0,1,1,1,1,0,0,0,1,1,2,1,0,0,1,2,0,0,1,0,1,0,4,1,3,0,0,4,1,0,1,2,3,2,2,2,1,0,0,0,1,1,0,0,1,5,0,3,2,2,0,2,1,0,1,2,0,1,1,1,1,0,1,0,2,2,0,1,2,2,1,0,0,0,1,1,1,2,0,1,1,1,0,0,3,1,2,0,1,1,1,1,1,0,1,3,1,0,1,2,1,5,0,0,1,1,0,1,1,1,1,1,2,1,1,1,1,6,0,0,0,0,0,0,1,2,0,1,2,0,1,1,1,2,0,1,2,0,1,2,0,2,3,1,1,2,1,2,0,2,0,1,3,0,2,2,1,0,1,1,1,2,2,1,0,0,0,1,1,1,1,0,0,1,1,1,0,1,1,0,0,1,0,1,1,0,0,2,2,2,0,1,1,1,0,2,0,0,2,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,1,3,1,1,1,1,1,0,1,0,1,1,3,1,1,4,2,0,0,0,2,0,1,2,1,0,0,0,1,2,0,1,1,0,1,1,3,1,0,0,2,0,1,0,1,1,1,1,0,0,0,2,2,2,1,1,0,1,0,2,0,0,2,1,3,2,2,0,1,2,0,1,0,1,1,2,0,0,1,2,4,1,2,2,2,0,1,0,1,2,0,2,0,0,1,1,0,1,1,0,1,0,0,1,0,0,2,3,1,2,3,0,4,0,0,1,0,2,2,0,1,1,0,1,1,1,0,0,2,3,0,0,0,1,0,0,4,0,0,3,1,1,0,1,3,2,0,1,0,1,0,0,0,2,1,0,0,1,3,1,2,2,1,1,1,0,1,0,0,2,2,1,1,1,3,1,0,2,1,2,2,0,0,1,1,2,2,0,0,1,0,1,1,0,0,1,0,1,2,1,2,2,0,2,2,2,1,0,1,1,1,0,0,1,0,2,3,1,2,1,0,0,1,2,0,0,1,2,1,1,0,1,1,2,2,4,0,0,2,2,0,0,4,3,0,1,1,0,0,0,0,0,0,3,3,1,2,0,1,2,0,1,0,0,0,1,2,0,1,2,0,0,3,1,2,0,0,2,0,0,3,1,0,1,0,1,1,1,2,1,0,1,1,0,0,0,2,1,1,0,3,5,1,3,1,1,0,2,1,0,2,1,1,1,1,1,1,1,1,3,1,2,0,1,1,1,2,3,0,0,1,0,1,0,1,0,2,1,1,1,1,2,1,1,4,1,0,0,1,0,2,1,1,1,1,1,0,0,0,0,3,0,2,3,1,0,1,1,0,2,0,2,1,0,2,3,0,1,0,1,3,2,3,1,1,1,3,3,2,0,3,0,0,2,1,2,2,1,0,1,1,0,0,0,0,2,6,3,1,2,0,0,1,1,0,1,0,0,1,0,0,0,1,1,1,2,2,0,0,2,0,1,1,1,2,1,1,0,0,0,0,2,1,0,1,1,1,1,1,1,0,0,0,1,1,0,2,1,0,0,1,1,1,0,0,2,1,1,2,3,0,1,3,2,1,0,1,2,2,0,0,1,0,0,0,1,0,1,1,2,0,0,0,2,1,1,0,0,0,0,0,2,2,2,0,2,1,2,6,1,3,0,2,0,3,0,1,3,1,1,0,1,0,1,0,0,0,0,0,2,0,1,3,1,0,2,0,0,0,2,2,1,3,3,1,1,1,1,1,1,1,1,0,1,0,1,2,0,1,1,1,0,0,0,1,2,2,1,2,1,3,0,0,0,2,3,0,1,0,2,0,0,1,0,0,0,0,0,0,1,1,0,1,4,2,1,0,1,0,0,2,0,0,1,1,3,0,1,2,0,3,0,0,1,1,1,0,0,1,0,1,2,0,0,0,0,1,4,1,0,2,1,0,2,1,2,3,1,1,1,0,0,1,1,4,1,1,1,1,2,2,2,0,1,3,0,0,0,0,0,1,0,1,1,0,1,0,3,1,1,1,1,2,1,0,0,2,1,1,0,1,2,0,1,3,1,2,0,1,1,1,1,0,1,0,3,2,0,3,1,1,0,1,1,0,3,2,2,1,0,1,0,1,2,1,1,2,0,1,1,1,2,0,2,0,2,2,2,1,1,2,0,1,0,1,2,1,0,1,2,0,0,1,3,0,3,2,0,0,1,0,0,1,1,1,1,0,0,0,2,3,0,0,2,2,3,0,0,0,0,2,1,1,2,0,2,1,1,0,1,0,0,1,2,1,0,0,0,1,0,0,1,1,1,0,0,3,1,2,1,2,1,1,2,0,1,2,0,2,0,1,0,0,1,0,0,1,0,1,2,1,1,1,0,1,3,1,2,2,1,0,1,1,1,0,1,2,1,0,0,0,0,3,1,0,2,2,0,2,1,1,1,1,1,2,1,0,2,1,0,2,0,1,4,3,0,1,0,2,3,2,0,1,2,2,1,3,0,1,2,1,1,0,4,0,2,1,2,1,1,1,0,1,0,1,0,0,0,3,0,0,1,1,0,2,0,0,3,1,1,2,1,1,4,0,1,0,1,2,1,0,2,0,0,1,1,4,0,1,2,0,3,2,0,0,0,3,1,1,0,0,0,0,2,1,3,2,0,0,0,0,1,2,1,0,1,1,0,3,0,3,0,0,0,0,3,1,0,0,4,1,0,0,2,0,1,2,0,0,0,0,3,1,0,0,1,0,0,2,1,1,2,0,2,0,0,0,0,1,2,0,0,1,1,1,3,0,2,0,0,0,3,2,2,1,2,0,0,2,2,1,1,0,0,1,1,2,2,1,0,1,0,3,2,3,0,1,2,1,0,0,2,0,1,1,1,1,0,1,0,1,0,2,0,0,1,1,3,0,1,1,2,1,1,0,0,2,1,1,0,2,0,0,0,1,0,0,0,1,2,2,0,1,2,1,0,1,3,0,2,2,2,0,0,2,1,1,0,0,1,1,1,3,2,3,2,1,0,0,0,1,0,5,3,2,0,0,1,1,0,1,0,0,2,0,1,1,0,2,2,1,2,1,2,1,0,0,2,0,0,2,0,1,1,1,1,5,0,0,0,0,0,3,0,0,1,0,3,2,1,1,2,0,0,1,0,1,2,0,1,0,0,2,2,1,0,0,1,2,2,1,0,1,1,0,0,2,0,0,1,0,2,1,2,1,0,0,3,3,0,2,0,1,1,0,0,3,2,2,0,1,2,0,0,3,1,0,3,1,0,0,2,0,0,2,2,1,1,2,1,3,2,0,0,0,1,1,1,0,0,0,0,0,0,2,0,2,1,2,3,1,0,0,2,0,0,0,1,1,0,0,0,1,1,2,1,1,1,0,0,1,1,1,3,0,0,1,0,0,0,0,1,0,2,1,0,0,1,2,1,1,1,0,1,0,1,0,0,4,0,0,0,1,1,0,0,1,2,4,0,2,1,2,0,2,0,2,0,0,1,1,0,2,0,1,1,0,0,2,3,0,5,1,2,1,2,0,2,0,1,1,1,0,1,0,0,3,1,2,0,0,0,2,2,2,2,4,1,0,2,1,0,2,1,0,1,0,2,0,0,0,0,1,1,1,0,0,0,0,1,1,0,1,0,0,0,3,0,1,3,0,1,0,1,1,0,0,1,0,0,0,0,2,1,0,0,0,0,0,1,1,1,1,1,1,0,2,1,0,3,0,0,0,0,2,0,0,1,2,1,0,0,1,0,1,1,1,0,2,0,0,0,0,2,0,1,1]},{"counters":[1,1,0,0,1,0,2,0,0,2,0,4,1,1,1,0,2,0,1,4,0,1,0,1,0,0,0,1,2,0,1,1,2,0,0,0,2,2,1,1,3,1,3,0,0,2,2,1,1,1,1,0,0,0,1,1,1,2,1,0,3,0,0,0,2,1,0,1,1,0,1,3,0,0,3,2,4,0,1,2,1,0,1,2,0,0,1,2,0,0,1,1,0,1,2,2,1,0,2,0,3,0,1,1,0,2,0,0,1,1,1,1,1,2,1,0,1,0,1,0,0,0,0,1,1,0,0,1,0,2,0,1,1,0,1,0,0,2,2,2,1,0,0,0,3,0,2,4,0,0,1,1,0,2,0,0,0,3,2,1,2,0,0,1,1,1,1,0,4,3,1,2,0,1,0,1,5,2,2,0,2,2,2,0,1,1,1,0,1,2,1,0,3,2,1,1,2,0,1,1,1,0,2,1,2,2,2,2,0,1,3,1,2,1,2,2,0,2,1,1,2,0,0,3,2,0,2,1,2,2,2,2,3,0,1,0,0,1,1,3,1,1,0,1,5,0,0,2,2,1,0,2,1,0,2,1,2,1,0,0,1,1,1,1,0,0,0,5,2,1,2,2,3,1,3,1,1,1,3,0,0,1,2,0,2,0,1,0,1,0,0,0,0,0,0,2,1,1,1,0,0,0,1,0,0,0,0,1,0,1,2,0,1,1,0,2,1,0,1,1,2,1,0,1,0,3,2,0,3,0,1,1,1,0,0,0,1,1,0,2,2,1,1,0,1,0,0,2,3,2,2,2,0,0,1,1,0,0,3,0,1,1,2,1,0,0,1,2,3,5,1,0,0,2,0,0,0,2,0,1,4,0,0,1,0,0,2,1,1,1,1,3,2,1,1,0,1,1,0,0,1,0,2,0,2,0,0,1,3,2,0,0,1,1,1,1,1,0,0,1,3,1,0,4,1,0,1,1,3,1,0,1,0,0,2,0,0,1,0,0,1,0,1,0,3,3,1,0,1,0,4,1,0,2,1,1,0,1,1,0,1,0,0,0,2,2,1,1,0,1,2,2,3,1,0,0,1,3,0,0,1,0,3,1,2,3,0,1,0,1,0,1,1,1,1,2,0,1,2,0,0,1,1,0,0,1,0,1,1,1,1,1,3,2,3,2,0,1,2,2,2,0,2,1,1,0,2,2,0,0,0,0,0,1,0,1,0,1,2,1,1,1,0,0,0,0,1,1,0,1,1,1,2,0,1,1,1,0,2,0,4,1,1,1,0,0,0,1,1,1,0,1,1,2,2,1,1,3,0,6,0,0,1,0,0,1,0,0,1,0,1,0,0,0,2,1,0,2,0,0,0,1,0,0,2,1,0,1,0,2,0,1,0,0,1,0,2,1,0,1,1,1,1,2,0,0,1,0,0,1,1,1,1,1,0,1,2,2,0,2,1,3,2,0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,1,0,0,2,1,0,0,0,0,1,0,1,1,1,2,0,1,0,1,3,0,0,0,2,0,1,0,2,0,3,0,1,0,3,0,2,1,0,1,0,2,2,1,2,0,0,3,0,0,2,1,0,0,1,0,2,1,1,0,0,3,3,1,1,0,2,0,0,3,1,1,4,1,3,2,1,0,0,1,1,1,1,0,1,0,3,1,2,0,1,2,1,0,0,3,1,1,1,1,0,0,0,1,0,1,1,1,0,0,1,1,1,0,1,1,0,1,1,1,2,2,0,0,2,3,1,1,0,3,1,2,0,2,0,0,0,1,0,1,3,1,0,0,0,3,0,1,0,1,5,1,1,2,1,1,0,0,2,2,1,1,1,0,1,2,0,1,0,1,0,1,0,2,2,1,1,0,0,1,2,0,1,1,2,0,1,1,3,1,0,2,1,3,1,2,0,0,0,0,1,0,2,5,3,1,4,1,0,1,1,2,4,1,1,1,1,0,2,1,1,0,0,0,0,0,0,0,1,3,0,1,1,1,0,1,2,1,1,1,2,1,2,1,0,0,1,0,0,3,0,3,0,0,2,0,2,0,1,2,1,2,1,0,2,1,2,1,1,2,0,0,0,0,0,2,1,0,2,1,1,0,1,1,0,0,1,0,2,1,0,0,0,0,1,2,0,1,0,1,1,3,1,2,1,0,0,0,1,1,0,2,1,0,1,1,1,1,0,2,0,2,3,2,0,0,0,0,1,3,4,0,0,0,0,0,3,1,1,2,0,0,0,1,1,1,2,2,2,0,0,2,1,2,2,0,1,0,2,1,0,1,1,0,2,1,2,0,3,0,1,1,1,2,1,2,1,1,0,1,0,2,2,1,1,0,1,0,3,0,0,1,1,0,1,1,1,2,1,2,0,0,0,1,1,1,0,2,1,1,0,0,2,1,0,0,0,3,0,1,0,1,1,1,1,1,2,1,2,0,0,0,2,1,1,3,0,1,1,0,2,0,1,3,0,0,1,2,2,2,3,2,0,2,1,0,0,2,1,0,1,1,0,0,1,1,0,1,1,0,1,2,1,3,0,0,0,3,1,1,0,2,1,2,2,1,0,0,2,0,1,0,0,3,1,1,1,0,0,1,1,1,1,1,0,0,0,0,1,0,2,1,1,1,0,0,1,3,0,0,1,0,1,2,1,1,0,2,2,2,0,1,1,0,1,2,0,0,2,1,1,1,1,1,1,2,2,2,0,0,0,1,1,2,1,0,0,1,1,2,2,3,2,0,0,1,1,1,2,0,0,1,1,1,3,2,0,0,0,1,0,1,1,0,1,0,1,0,0,1,1,1,2,3,2,1,3,0,2,4,2,2,1,2,0,2,0,1,1,3,1,2,0,1,0,1,0,1,0,2,4,0,0,2,1,0,1,0,3,0,0,0,1,0,2,1,0,2,0,1,1,0,1,1,1,0,2,1,1,3,0,1,1,1,1,1,2,2,2,1,1,2,1,1,0,0,0,1,2,1,2,1,0,2,1,2,1,0,0,1,1,0,1,0,2,5,2,1,0,1,1,1,0,0,0,2,1,1,3,0,2,2,1,1,3,4,2,0,3,0,0,1,0,0,2,1,3,1,2,0,0,0,1,0,3,1,0,1,3,0,2,0,2,0,1,1,3,3,0,2,1,1,0,1,1,1,0,0,1,0,6,0,0,1,1,0,0,0,0,1,2,1,1,1,1,0,1,1,0,1,0,0,1,1,0,0,1,1,1,1,1,1,0,3,0,0,1,0,3,1,0,0,1,1,2,0,1,1,0,3,0,1,1,3,1,1,0,0,0,1,1,0,0,1,1,3,3,2,2,1,3,0,3,1,1,4,2,3,0,0,0,1,0,0,3,1,1,0,1,1,0,1,0,3,4,0,0,0,2,3,0,2,2,3,1,1,1,0,1,2,1,2,1,1,1,1,0,2,1,1,1,1,2,1,1,1,1,4,0,3,0,3,0,0,1,1,0,0,1,1,1,0,0,1,1,2,0,1,1,2,2,1,1,0,0,1,1,1,1,1,0,1,0,0,1,1,0,1,0,0,1,0,2,2,1,0,1,3,1,0,0,1,1,2,3,1,1,1,2,1,0,0,2,1,0,1,0,1,2,2,0,0,0,0,0,2,0,2,1,0,1,2,1,0,0,1,0,0,2,1,1,1,2,0,0,1,2,1,0,0,1,0,0,2,1,1,2,2,1,2,0,1,0,0,1,0,0,2,2,3,3,0,1,1,1,0,1,1,0,0,0,3,1,1,1,0,0,0,3,2,2,1,0,0,1,1,1,3,0,0,1,3,0,1,0,0,1,0,1,2,1,1,0,1,2,1,1,1,0,1,1,3,0,0,2,0,0,1,0,1,0,2,0,0,1,1,0,1,0,2,1,3,2,0,0,1,3,2,3,0,1,0,0,1,1,0,3,0,1,0,5,0,0,1,0,1,1,3,3,1,3,0,1,2,2,0,0,1,1,1,0,1,1,0,0,1,0,0,0,0,1,1,0,0,0,2,1,1,2,1,1,0,1,1,0,0,1,2,1,3,0,2,2,0,2,0,1,2,0,2,2,3,1,1,0,0,2,1,2,1,1,0,0,3,2,0,1,1,0,0,0,2,2,1,2,1,1,1,1,1,0,1,1,1,1,0,0,0,0,4,2,0,2,1,3,0,0,1,1,0,1,2,1,0,0,1,1,2,3,1,1,0,1,1,0,4,3,1,2,2,2,0,2,0,2,1,0,2,3,1,1,0,1,0,2,1,0,1,2,1,0,1,0,2,0,0,1,2,0,0,1,0,1,0,0,1,3,0,0,0,1,3,0,1,0,0,1,0,1,3,1,1,2,0,0,1,4,1,1,0,2,1,0,0,0,0,0,0,0,0,1,2,2,1,1,1,1,1,0,1,0,0,0,0,1,1,2,0,0,0,0,1,1,4,0,0,0,3,1,1,2,1,0,0,0,0,1,0,0,1,1,3,0,1,0,1,2,1,0,0,1,0,2,0,3,0,0,0,0,1,1,1,0,2,1,3,3,2,1,1,1,0,0,0,2,1,0,2,3,0,0,1,1,0,1,0,2,1,2,2,2,2,2,0,0,0,1,1,0]},{"counters":[2,1,1,1,2,3,0,1,3,0,2,1,0,1,1,0,1,0,1,0,0,0,1,1,1,2,0,3,1,0,3,2,3,2,2,1,1,1,2,1,1,2,0,1,0,2,0,2,1,0,2,1,1,1,2,1,4,1,1,1,0,1,0,3,2,1,0,0,2,0,1,2,0,1,1,1,0,2,0,3,2,2,1,0,1,0,0,0,0,0,1,0,1,1,2,3,1,0,1,2,2,3,1,0,2,0,1,1,2,0,2,1,3,1,0,0,0,0,3,2,1,0,1,0,1,0,0,0,1,0,0,0,3,2,0,3,0,1,2,1,1,0,0,2,0,0,1,0,1,0,0,0,1,2,3,0,4,0,2,1,2,3,0,2,0,2,2,1,0,1,1,1,2,1,0,2,3,0,0,2,1,1,1,2,1,2,1,4,1,1,3,0,1,3,0,1,1,0,0,1,0,0,2,0,0,0,0,2,2,1,3,0,0,3,1,0,1,1,0,0,1,2,0,0,1,0,0,0,1,0,1,1,0,3,2,1,0,1,1,0,4,1,3,0,2,2,1,0,1,0,1,0,0,0,4,1,0,1,0,1,0,1,1,1,0,2,1,1,1,0,0,1,1,1,2,1,1,0,1,0,2,3,1,2,1,0,1,0,1,0,3,1,0,4,1,0,1,4,1,1,3,0,0,0,0,1,0,1,1,0,0,1,0,1,2,0,1,1,2,0,2,2,3,1,0,4,1,2,1,2,0,1,1,1,0,2,1,0,0,0,0,0,1,1,0,1,0,2,5,1,1,0,1,2,0,2,1,2,0,1,1,0,0,0,1,0,0,0,2,0,1,1,2,1,1,1,0,0,1,1,0,2,1,1,2,0,0,1,0,0,2,0,0,1,0,0,0,3,1,0,1,2,0,1,1,1,1,0,1,1,1,1,2,0,0,2,1,1,0,0,1,0,1,2,2,1,0,1,0,0,1,0,0,2,2,1,1,1,0,1,1,1,1,0,1,2,2,1,1,1,1,0,2,0,1,1,0,0,0,0,1,1,2,0,0,0,0,1,3,1,1,0,0,1,3,1,0,2,3,3,1,1,1,1,2,0,1,1,0,0,1,1,1,0,0,0,1,2,0,1,0,1,2,1,1,0,0,0,0,1,1,0,0,2,0,4,1,0,2,1,3,1,0,0,1,1,0,1,1,3,1,1,0,2,1,0,5,1,0,3,1,1,1,0,1,2,3,1,0,0,0,1,1,2,0,2,0,1,0,1,1,0,0,1,2,0,0,1,2,2,3,0,0,1,0,0,0,2,1,1,0,0,0,1,2,1,1,1,1,2,1,1,1,2,0,0,0,1,1,3,0,1,0,3,0,3,2,1,1,1,0,0,1,2,1,1,1,2,2,1,1,0,1,1,2,2,0,1,1,0,1,1,0,0,2,1,1,1,2,1,0,1,1,0,2,1,1,0,2,2,1,1,1,2,1,2,2,0,1,1,1,1,0,1,1,0,0,0,0,0,1,1,0,1,0,0,2,3,1,0,0,1,0,0,0,0,0,3,1,1,0,0,1,2,0,1,0,0,1,2,1,0,3,0,0,1,1,2,1,0,0,0,1,0,2,0,6,1,1,1,0,0,2,0,0,1,0,0,2,1,2,1,3,0,1,0,0,1,0,0,0,2,4,2,0,1,1,1,1,3,1,1,2,2,0,3,0,2,0,2,1,2,0,2,1,0,1,0,2,2,0,1,1,1,2,1,0,0,2,0,1,2,0,3,1,3,2,0,0,0,0,1,2,2,0,1,1,0,0,0,0,0,1,2,0,1,0,1,3,4,4,0,3,3,0,3,1,1,0,0,0,0,0,0,0,0,0,1,3,0,3,2,0,1,0,1,3,2,2,0,0,1,1,3,2,1,1,0,0,0,1,1,1,0,1,0,0,1,0,2,1,0,1,0,0,2,3,1,3,1,3,1,0,1,0,0,0,1,1,3,0,0,0,1,1,0,0,0,0,2,1,1,0,0,0,1,0,1,0,4,2,1,1,1,0,4,2,1,1,0,1,2,1,3,1,0,1,1,0,1,0,0,0,2,0,1,1,1,0,1,0,0,0,1,1,1,0,1,2,3,0,1,1,1,3,1,1,2,2,2,1,0,2,3,3,0,3,1,2,0,1,0,2,0,0,1,0,1,0,1,1,0,1,2,1,0,1,0,0,0,0,1,2,0,0,0,2,2,0,1,2,0,1,0,0,0,0,1,2,0,0,1,0,1,2,1,2,0,0,1,0,0,2,2,0,1,1,0,0,3,0,1,0,0,1,1,1,0,0,0,1,0,1,1,2,0,0,0,0,2,1,0,0,0,0,1,2,1,1,0,5,1,4,2,1,1,0,1,1,1,1,2,0,3,4,0,0,0,1,1,2,1,2,1,0,2,3,1,0,1,3,1,1,0,1,1,1,1,0,1,0,0,1,0,1,0,2,0,0,1,2,1,3,1,0,1,1,1,1,2,0,1,1,0,2,1,0,1,1,1,0,1,0,1,0,0,1,0,2,0,0,0,1,0,1,0,1,1,3,2,1,2,1,0,1,2,0,2,2,2,0,1,0,2,1,0,0,1,1,0,2,0,3,0,2,0,2,4,0,3,0,0,0,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,3,1,1,0,1,1,5,1,0,0,1,0,1,1,2,1,0,4,0,0,1,0,0,0,0,1,2,2,0,0,0,2,1,4,2,0,1,0,1,2,1,2,2,0,1,2,0,0,0,1,0,1,1,0,2,1,1,0,2,1,1,2,1,1,2,2,0,0,1,0,0,0,1,1,2,1,1,4,0,2,1,1,2,1,1,2,1,0,1,1,0,1,3,2,0,2,2,1,0,1,0,0,3,2,2,0,1,2,2,2,1,0,3,2,3,1,1,5,1,1,1,1,2,3,1,0,1,2,1,0,1,1,1,1,1,0,1,2,0,0,1,1,2,1,0,4,1,0,0,1,0,1,1,2,0,0,2,2,1,0,0,0,0,0,3,1,3,1,2,2,1,0,0,0,1,1,3,0,0,1,2,1,1,0,1,0,0,0,1,0,1,0,2,0,0,0,1,0,1,2,1,0,0,0,0,1,2,2,2,4,1,1,0,0,1,1,2,0,0,3,1,1,0,2,2,0,0,1,1,1,0,0,1,1,0,2,2,2,0,0,0,0,1,0,1,1,0,1,1,0,2,0,0,0,1,0,1,1,2,2,0,2,1,1,0,1,1,0,0,0,0,0,2,2,4,2,1,0,1,1,0,2,1,2,2,0,0,1,1,2,0,2,0,1,0,1,1,0,3,2,4,0,1,3,2,0,0,0,0,0,2,1,0,3,1,2,0,1,1,0,0,1,1,1,0,4,3,1,1,0,2,2,0,1,0,2,2,2,1,1,2,3,0,1,0,0,1,2,3,1,0,0,3,0,0,3,2,1,3,0,3,0,1,0,0,3,1,0,2,2,0,2,1,0,1,0,1,2,0,0,1,0,1,2,2,3,1,0,2,2,0,1,0,1,0,0,3,1,0,0,3,0,1,0,0,0,0,0,1,1,1,0,1,1,2,1,0,1,0,0,0,0,3,1,0,0,1,0,0,1,1,0,0,2,3,3,0,1,1,0,1,3,3,1,2,0,1,2,0,1,1,2,2,3,0,1,0,2,0,2,1,1,1,1,1,4,2,0,0,3,4,0,1,0,0,0,2,1,2,2,1,1,3,1,0,2,0,2,4,0,1,1,1,1,1,3,0,0,1,0,2,1,1,1,1,2,2,0,2,0,2,0,3,0,1,0,5,2,1,1,0,1,1,0,0,0,0,0,0,2,0,0,1,0,0,0,2,1,2,1,1,1,1,3,1,1,1,0,3,3,1,0,0,1,0,3,0,2,1,1,0,2,0,0,1,1,0,0,2,2,0,0,2,0,1,1,2,1,1,1,2,0,0,3,1,0,2,0,1,1,3,1,1,1,0,1,0,2,0,0,0,2,3,2,0,2,4,0,1,0,3,2,1,1,0,1,1,0,1,0,2,0,1,1,0,0,1,1,3,1,1,1,0,0,0,0,0,2,2,1,0,0,1,0,2,0,0,1,0,1,0,0,0,1,1,1,0,0,1,1,0,1,0,1,0,0,0,1,2,0,1,1,0,1,0,0,0,0,1,1,4,1,0,0,1,0,1,0,1,1,0,2,1,2,0,2,1,2,0,0,0,0,2,0,0,0,1,1,1,0,2,0,0,2,3,1,0,0,1,3,1,2,1,0,1,0,0,0,0,0,3,2,0,1,1,1,1,2,1,0,0,3,0,1,3,0,1,1,0,4,2,1,1,0,0,1,0,1,0,3,0,1,1,0,0,0,2,4,1,1,1,3,2,1,1,2,0,1,1,2,1,1,1,2,2,2,0,0,0,0,1,0,2,0,0,1,0,2,0,2,1,2,3,2,4,1,1,0,2,1,0,3,0,2,1,0,1,2,0,1,1,1,1,0,1,1,4,0,5,0,0,1,1,1,1,0,2,2,2,1,0,0,1,2,2,2,0,1,3,2,0,0,1,0,1,0,2]},{"counters":[0,1,1,0,0,0,0,0,2,0,0,2,0,0,0,2,0,1,1,1,1,1,0,1,0,0,2,1,0,2,1,0,0,1,0,2,0,0,2,0,1,0,0,1,0,2,1,0,3,0,1,1,3,0,0,0,0,1,0,1,1,0,3,2,0,1,1,4,0,1,1,3,3,2,0,2,0,1,0,0,2,1,2,0,0,1,0,3,1,1,0,1,1,3,4,2,4,1,0,3,4,0,0,2,0,1,0,0,1,1,1,0,1,2,0,3,1,1,0,0,3,3,3,1,0,3,0,0,2,0,1,2,0,0,1,0,2,0,0,3,0,0,0,1,0,1,1,2,0,2,0,0,2,2,0,3,1,1,1,1,0,0,1,3,2,1,1,1,1,0,0,1,0,0,1,1,1,1,1,0,0,1,0,1,0,0,1,3,2,0,0,1,0,2,1,0,2,0,0,3,1,1,2,1,0,0,0,2,1,0,0,3,1,0,0,1,1,1,0,0,2,1,0,0,0,0,2,1,1,1,1,0,0,1,1,2,2,1,1,0,3,3,2,0,0,1,4,0,0,0,1,1,0,1,1,0,2,1,0,0,0,0,1,0,0,1,2,2,0,0,1,3,1,1,2,2,0,3,0,0,2,0,2,2,1,2,1,1,0,1,1,1,1,3,1,0,1,0,1,2,0,2,2,0,2,2,1,3,4,1,1,1,3,0,1,0,1,0,1,0,2,1,1,1,2,2,3,1,1,2,2,0,2,3,0,1,0,0,1,0,1,1,0,2,1,2,0,4,0,0,2,0,2,3,1,2,2,0,0,2,1,0,0,2,2,1,2,0,0,0,2,1,1,1,2,0,0,1,0,2,1,1,3,0,1,0,2,0,2,1,1,2,0,1,0,2,0,1,1,0,1,1,3,4,0,1,0,0,1,0,0,2,1,1,1,1,0,1,1,0,0,1,0,1,1,1,2,0,0,1,0,1,2,0,0,1,0,1,0,1,2,0,0,0,1,0,1,2,0,2,2,1,2,0,0,3,1,1,0,0,1,0,1,0,1,0,1,0,1,0,2,0,2,1,1,3,1,3,2,3,1,0,0,2,2,0,1,0,0,3,2,1,0,1,2,2,1,1,2,0,3,1,1,0,0,0,0,0,3,1,0,1,0,1,1,0,1,0,1,1,1,2,0,0,0,1,0,3,2,0,1,1,1,2,1,1,0,0,1,2,2,0,0,1,1,1,1,1,0,2,1,2,0,4,0,3,0,1,2,1,2,1,0,1,3,3,1,0,0,0,1,1,1,1,4,3,2,0,0,0,3,2,1,2,1,0,0,1,0,0,0,1,0,1,0,0,1,0,1,3,1,0,4,1,1,1,1,2,1,2,1,0,2,1,0,0,0,1,0,0,2,1,2,2,2,0,1,0,0,1,1,2,2,1,2,1,0,1,1,0,1,0,2,2,0,5,2,0,3,0,1,0,1,2,1,0,1,2,1,5,0,2,2,1,0,0,1,2,2,0,1,2,1,2,2,2,2,0,0,0,0,1,2,0,2,1,2,0,2,1,3,2,0,0,0,0,2,0,0,0,1,2,1,1,1,0,1,0,1,1,2,1,2,1,1,1,1,2,0,0,1,1,1,1,2,1,2,0,0,0,0,1,0,1,1,0,0,0,1,1,0,1,1,1,1,3,0,0,3,1,0,1,0,1,0,1,4,1,1,0,0,1,0,0,1,0,2,1,1,0,0,2,2,0,0,1,0,2,1,3,0,0,0,1,1,1,0,0,3,0,0,0,0,0,2,2,0,1,2,0,2,1,0,3,0,3,0,0,1,4,3,1,1,0,1,0,2,2,2,1,0,1,0,2,1,1,0,1,2,3,1,0,2,0,1,3,1,1,0,0,0,1,1,2,1,3,2,1,1,1,4,0,2,2,2,1,1,1,0,1,0,2,0,1,1,2,0,1,2,0,1,2,1,0,1,1,1,0,0,0,2,1,2,2,1,0,0,0,1,0,3,1,2,0,2,1,2,0,1,2,0,2,3,1,0,3,2,1,1,2,1,0,0,1,1,2,2,1,0,3,1,0,0,1,2,1,2,0,0,1,0,0,0,3,0,4,1,0,3,0,1,2,0,3,1,1,0,2,1,2,0,2,1,1,1,0,2,0,1,0,1,2,0,1,3,0,0,1,2,0,0,1,1,1,1,1,1,1,0,0,1,0,0,0,1,2,1,0,1,1,1,0,2,1,0,1,0,1,0,0,0,0,1,1,0,4,1,0,0,2,1,1,0,0,1,1,0,1,2,0,3,0,1,2,2,0,0,2,2,3,0,0,0,0,1,2,0,3,1,2,2,0,3,0,1,2,1,1,0,1,0,2,0,0,1,0,2,2,0,0,2,0,0,2,0,1,0,3,1,1,1,2,0,3,2,1,1,0,0,3,1,0,1,1,1,0,0,1,0,1,2,2,0,1,0,1,3,1,1,1,1,3,0,0,0,0,1,0,3,2,0,2,3,1,3,0,1,1,0,3,0,0,0,2,1,3,2,1,1,0,1,1,0,0,1,0,0,0,2,0,2,1,1,1,2,1,1,0,0,0,0,0,2,1,2,0,3,0,0,1,0,2,0,1,1,0,0,0,2,0,1,1,1,2,1,0,1,1,2,1,0,1,1,1,1,0,0,0,2,1,0,0,1,1,0,1,0,0,1,2,1,1,0,1,0,1,2,1,0,1,2,3,2,1,1,2,1,0,0,0,0,2,0,0,0,0,1,1,1,0,0,0,1,1,1,1,2,2,3,0,2,1,1,1,0,1,0,1,1,0,2,1,1,1,2,0,1,2,1,0,1,1,0,1,0,1,0,1,1,2,1,0,2,1,2,1,1,1,1,0,1,0,0,1,1,3,2,0,1,2,3,2,2,1,0,2,2,0,0,0,2,1,0,1,1,0,3,0,2,1,2,2,3,1,1,1,3,1,1,2,1,2,1,2,1,0,1,1,0,0,0,1,0,1,1,0,0,0,4,1,0,0,1,0,0,0,1,1,2,0,0,0,1,1,2,0,3,2,0,1,1,0,1,1,2,0,1,1,0,0,0,1,0,1,1,1,2,1,3,0,2,1,0,0,1,1,5,4,0,0,0,0,0,1,1,2,3,3,1,2,0,0,1,1,0,0,0,3,1,4,0,5,1,1,1,1,1,1,0,1,0,0,0,0,0,3,1,0,0,0,2,0,2,0,0,1,1,0,1,2,0,3,0,0,2,1,1,2,0,1,1,0,0,0,1,0,3,0,1,0,1,1,2,2,2,3,0,0,0,1,0,1,0,0,0,1,0,2,1,3,4,2,2,1,4,0,1,0,2,2,0,3,1,1,0,5,1,2,1,1,3,1,0,1,2,1,0,0,0,1,2,1,0,1,0,0,0,0,0,1,4,2,3,2,2,0,2,0,2,1,1,2,1,2,1,0,0,1,0,0,2,0,0,1,1,0,0,2,0,1,2,1,2,1,0,0,2,1,1,2,2,2,0,2,1,0,0,1,1,0,1,0,0,0,1,2,1,0,1,2,1,1,0,2,3,3,2,1,0,0,1,1,1,0,0,2,0,0,0,1,1,3,1,0,2,1,1,3,0,0,0,0,0,1,2,2,0,0,1,0,1,1,1,1,2,0,3,0,2,1,2,0,0,0,0,2,1,0,2,2,0,1,0,1,0,0,0,1,1,0,1,3,1,0,2,3,2,2,0,1,1,0,2,3,1,1,3,0,1,0,5,2,0,1,1,2,1,0,3,1,2,1,1,3,1,0,3,0,0,0,2,1,1,0,0,0,1,4,0,0,0,0,2,0,0,2,0,1,1,0,3,0,0,3,1,1,0,1,0,0,0,0,0,3,0,2,4,0,1,1,1,1,1,0,2,0,5,0,1,0,3,1,2,2,0,1,1,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,2,0,0,0,1,0,2,2,0,0,0,0,1,1,0,3,1,1,2,1,4,1,1,0,0,1,1,0,0,2,4,1,1,1,2,3,0,1,2,1,2,0,1,0,2,0,1,1,5,2,2,0,0,1,1,0,3,0,1,1,0,1,1,1,0,0,0,1,2,1,2,0,0,2,0,1,3,0,0,2,0,0,1,0,1,1,1,0,0,0,1,1,3,0,1,2,1,1,6,5,0,3,0,3,1,3,0,0,4,1,0,0,1,0,0,2,2,0,0,0,4,2,1,0,0,1,2,0,0,1,0,1,1,0,1,0,0,2,2,0,4,1,0,1,0,2,0,1,2,0,1,2,1,0,1,0,0,1,0,0,1,2,0,0,2,3,1,1,0,1,2,1,2,0,1,0,0,0,1,1,0,2,1,2,1,0,0,0,0,1,0,0,2,0,2,0,1,0,2,5,0,0,0,1,0,1,1,0,0,1,0,1,2,2,1,1,2,0,1,0,1,0,0,1,1,0,2,1,2,1,2,1,0,0,1,0,2,1,0,0,0,1,0,4,0,2,3,0,0,2,2,0,1,1,1,0,0,0,0,0,3,0,3,1,2,0,0,0,0,0,2,0,1,1,0,1,1,0,4,0]},{"counters":[2,0,1,2,2,1,1,0,1,2,2,2,2,1,0,1,1,2,2,2,3,3,4,0,2,0,0,1,0,2,4,1,0,0,2,4,1,0,1,0,0,1,0,0,1,1,0,0,1,1,1,1,0,1,0,2,1,1,0,1,2,0,0,1,0,2,2,0,0,1,0,1,2,0,1,3,1,2,1,1,0,1,1,1,1,0,1,1,1,1,2,0,0,0,1,1,0,1,0,2,1,1,0,0,3,1,0,2,1,1,1,4,1,2,2,2,2,1,2,1,1,0,1,0,0,3,1,2,2,2,2,0,0,1,3,1,1,2,1,1,1,0,0,1,3,2,2,1,0,1,0,1,1,1,1,0,0,1,3,0,0,1,1,1,1,0,0,1,0,0,2,1,2,1,0,0,1,0,1,1,1,0,1,1,4,0,0,0,0,0,0,0,1,1,0,1,0,2,1,3,0,0,0,1,3,0,0,0,0,0,2,0,1,0,0,0,0,0,1,3,1,1,2,2,2,2,0,0,1,1,0,1,1,3,1,0,1,3,4,0,1,2,2,2,0,0,1,1,0,3,0,3,4,3,1,1,1,0,0,0,2,2,1,0,0,3,1,0,0,1,1,0,3,1,1,3,3,2,1,2,0,0,3,0,1,1,2,0,1,1,4,2,0,2,1,3,2,0,2,2,1,0,1,1,1,2,1,0,3,0,0,2,1,1,0,1,1,1,2,0,0,0,1,3,1,1,1,1,0,1,0,1,2,0,1,1,2,0,0,2,2,0,3,1,1,1,1,0,2,2,2,1,2,3,1,1,1,1,1,1,2,1,0,0,2,0,1,1,0,1,1,0,0,0,3,0,1,1,0,1,3,3,4,1,1,1,0,2,1,0,0,2,0,2,0,3,0,2,1,1,0,1,0,0,2,1,0,2,0,1,2,1,1,0,0,1,1,1,2,0,0,1,0,0,0,0,1,5,2,0,0,2,0,1,1,1,0,1,2,0,0,2,0,0,0,1,1,1,0,0,0,1,0,2,0,0,1,0,0,1,0,3,0,2,1,0,0,3,1,1,0,1,1,1,0,1,0,2,0,2,1,3,0,2,2,1,2,2,2,1,1,1,0,2,1,1,0,2,0,0,0,0,1,1,0,2,1,0,0,1,0,0,0,2,1,0,0,0,1,1,1,3,3,0,0,1,0,0,0,0,0,0,2,1,1,1,3,1,1,2,0,1,2,1,2,0,0,0,2,1,0,2,1,1,0,1,2,0,0,0,1,1,2,1,1,0,1,0,1,1,1,0,1,1,0,0,0,2,1,0,1,2,0,3,0,0,3,2,0,0,0,2,0,0,0,2,0,0,1,1,0,1,1,0,0,2,1,1,1,1,1,1,1,0,1,1,0,0,0,1,1,0,1,0,2,1,0,0,2,2,2,0,0,0,1,0,0,1,3,2,1,2,0,0,0,1,2,0,1,0,3,0,1,0,3,0,0,1,1,1,0,0,0,0,0,1,2,0,3,0,1,1,2,0,1,2,1,0,1,2,1,1,0,0,1,0,2,2,0,2,1,0,0,0,0,0,0,0,2,0,1,1,2,0,0,0,1,0,0,1,0,1,0,2,1,0,0,0,1,2,3,0,1,2,1,0,2,1,0,0,0,0,0,2,1,0,1,1,2,0,1,0,0,0,1,2,0,0,0,1,3,1,2,1,1,1,1,2,0,0,0,0,3,0,3,0,1,2,2,2,0,1,1,0,3,0,2,0,1,0,1,0,1,0,4,1,1,0,0,2,1,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,1,0,1,0,2,0,1,3,0,1,2,0,0,0,0,1,0,2,2,0,2,0,0,0,0,0,2,2,4,1,1,2,1,2,0,1,0,2,1,0,1,3,2,0,2,0,0,1,0,0,1,1,1,1,0,2,0,0,1,1,0,1,2,0,0,1,3,3,1,0,0,0,0,2,1,1,0,1,0,1,1,1,1,2,1,0,0,1,1,2,0,0,1,3,3,1,1,0,1,0,2,1,0,0,2,0,0,0,1,1,1,0,1,3,1,0,2,1,2,1,0,1,2,0,2,0,2,0,1,0,1,0,1,1,0,1,0,0,1,1,3,2,1,1,1,3,2,1,1,0,0,4,2,1,2,1,1,2,0,2,0,1,1,2,0,0,0,1,2,1,0,0,2,3,4,0,0,5,1,0,2,2,2,2,1,0,0,2,3,1,0,1,0,1,1,1,3,1,0,0,2,5,0,1,0,0,1,1,3,1,0,0,1,0,0,1,0,0,3,3,2,0,0,2,3,3,0,0,0,0,0,1,2,0,1,0,1,0,0,1,2,0,1,1,0,1,0,3,1,3,3,1,1,0,1,1,0,1,0,2,0,0,0,0,0,0,4,1,1,2,2,2,3,1,3,1,1,1,2,1,4,0,0,1,1,1,2,0,0,0,0,6,0,1,2,0,0,0,2,1,2,1,1,1,2,2,1,1,1,1,1,4,1,0,1,0,2,0,3,0,3,2,0,2,1,0,2,2,1,0,0,0,2,0,2,2,1,1,1,0,3,0,2,1,1,0,1,0,2,4,0,4,0,1,1,1,3,4,1,1,0,3,1,0,2,2,0,1,1,1,1,0,0,0,1,2,0,1,2,2,2,0,0,1,2,0,1,0,1,1,2,1,2,2,0,1,1,0,1,1,1,1,2,1,0,0,0,2,0,1,1,0,3,0,1,1,0,3,0,0,0,1,0,1,2,1,0,0,2,0,1,2,3,3,1,1,0,0,0,0,2,2,0,0,1,0,1,0,2,3,2,1,0,3,2,2,0,3,1,1,2,4,2,2,1,0,2,0,0,4,2,1,6,1,2,0,0,0,1,3,0,1,1,0,5,2,2,2,1,0,0,0,0,2,1,0,0,0,2,1,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,0,1,2,0,2,0,3,1,0,2,1,0,2,0,2,0,0,0,0,0,0,1,1,1,1,2,1,1,0,3,1,1,0,0,0,3,1,0,4,1,0,0,2,1,2,0,0,1,0,0,0,1,2,0,1,2,4,3,0,2,1,2,2,1,1,0,1,1,2,3,0,1,1,0,1,1,3,3,0,1,0,0,1,0,0,0,0,2,0,0,1,0,1,0,1,2,0,2,1,1,1,1,0,0,2,0,0,1,1,0,0,0,3,0,1,1,3,0,3,1,3,1,1,1,2,1,3,1,1,0,0,0,1,1,2,1,0,0,1,1,1,2,0,1,3,1,2,1,2,0,0,0,1,2,1,0,0,1,1,0,1,0,0,1,1,1,3,1,0,2,1,1,1,1,0,0,1,1,1,0,0,2,0,1,1,2,2,0,3,0,2,1,3,0,0,1,0,2,0,1,0,0,1,4,2,1,1,0,3,0,0,1,3,0,1,2,1,0,0,1,0,1,0,1,1,2,2,2,2,4,0,1,1,0,2,1,0,0,1,0,2,0,0,1,1,0,1,0,1,2,1,1,0,0,1,2,1,0,3,0,2,0,1,0,0,0,0,1,1,2,1,1,1,1,2,1,1,1,1,0,2,1,4,0,1,1,1,0,0,1,2,0,0,3,2,1,2,0,1,0,1,1,1,1,2,1,1,2,1,0,0,2,1,1,1,1,0,0,3,0,1,2,1,2,1,0,1,0,0,0,3,1,4,2,1,1,1,0,1,1,1,0,1,1,0,0,1,1,2,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,1,0,2,0,2,2,2,2,1,2,2,1,0,0,1,3,0,1,1,0,1,1,0,0,0,1,0,1,2,0,4,0,1,1,2,1,2,2,2,2,0,2,0,1,0,0,0,1,0,0,1,1,2,0,1,1,0,2,1,1,0,1,1,0,0,1,2,1,1,3,1,2,0,2,2,1,2,0,2,1,0,1,3,0,0,0,2,0,0,0,1,0,1,1,1,1,0,1,0,0,2,0,1,0,0,2,0,0,1,1,0,0,1,1,1,3,1,1,2,2,2,2,1,2,1,0,1,1,1,1,1,1,0,1,0,2,0,1,2,2,2,0,2,0,1,1,1,0,1,1,2,2,3,2,2,1,1,4,2,0,1,0,1,1,3,1,0,1,2,0,1,1,2,2,0,2,0,3,0,0,0,0,2,1,2,0,1,2,1,2,0,1,0,1,0,1,2,3,0,1,0,0,0,2,3,0,1,1,1,1,1,1,1,2,0,0,0,1,0,1,2,0,0,1,2,0,0,1,0,2,1,1,0,0,4,2,1,0,0,0,2,2,2,2,0,2,0,0,1,1,1,2,2,1,1,1,1,0,1,0,1,1,1,0,1,1,2,0,2,0,1,0,0,3,3,1,0,2,0,0,3,1,2,2,0,0,1,2,0,0,0,2,0,0,0,1,0,0,1,1,0,0,0,0,1,2,0,0,0,0,0,6,0,1,2,4,2,1,2,1,0,0,0,1,2,2,2,1,1,0,2,0,1,2,1,1,0,2,0,2,0,0,1,0,1,1,0,0,1,1,1,1,2,2,0,2,0,0,1,3,1,1,0]}]},"null_count":0,"last_update_version":397952032731561984},"p2":{"histogram":{"ndv":1990,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MDlxQkNGcGF5YlhrcDRoWkhmN1I2ZHVJVWprajRBRTVs","repeats":1},{"count":13,"lower_bound":"MERoZjRteTB5Q2duRDdEbUJrSG1EWHVLTk56OTQzS212d3px","upper_bound":"MEdudkt0RU5rd1o=","repeats":1},{"count":19,"lower_bound":"MEhGZnNiZ1NCZFNlOHQ5SjBZeE96eXJweUZwSUtWU1M4ZkdWVjh2NmRnMXlqeHhucUlrb2s3T3FhYkpMeg==","upper_bound":"ME13cllVemZGazVjdW5sNFc1UU45ZGhxZXdlQ0tUakNTN0tscnRZV0hJWDBSR2t3cTVGU0l2M0JQV2VWR3k=","repeats":1},{"count":25,"lower_bound":"MFNRaFV1dWlxdTgxbXVHQlAydXZrUVY4cXVPMGh5bldDM3ZWZEQ0","upper_bound":"MGdaVEhibkcwQTR6TXNZcXN3RnFBQkt0SUs3Y3dEdk9NbUNIeHdrNHJuSmpMYWc0OXlvSXQ3eW8=","repeats":1},{"count":31,"lower_bound":"MGpnbFNVSWE3MUpJMw==","upper_bound":"MHI1TXN6Zk5RRDV0cGkwM2VIdmYxQ2g3ZFdiSUtGSXJqRDdOWlBaVXNaTVEzNERqWUIwbzA4eWpsVzlmUUs2","repeats":1},{"count":37,"lower_bound":"MHJYUHBp","upper_bound":"MHRPbXpuUndDVE1RSzczMm10UjlFVElvcw==","repeats":1},{"count":43,"lower_bound":"MHY3b2YyUjlsSlVZRWg1SXNFUE50WTFXc0xjUzNzN3hKbkRlN0o5b0hTcEdkdjNMTU9MSlZP","upper_bound":"MHhUcDVmejE3cDhrZGFlZndGTHZMUFBBbG5IZTlEQWZRRWx5Nms2SWV5clJORjBLQ2lLOFlQelZRUER5VEJzSw==","repeats":1},{"count":49,"lower_bound":"MTVmNFZjeWg2WWRrSVJpamE5QlEydEd1TzY=","upper_bound":"MTd0TEQ1","repeats":1},{"count":55,"lower_bound":"MUJTTjVRb3FVckEzYm9CandBcndNY051VVYzWDF5UGRoaThlcmtCSlZ6VVV5YmplVzRPSnp0dEk2S1U=","upper_bound":"MUlGbWZqeGlWM2s2VzdrSHJxTTV1c2JzRzhWTzUyNXR4Q1I2MDlKSHdaWG9l","repeats":1},{"count":61,"lower_bound":"MUpBOE5tWUJ4SXV2S2k2TA==","upper_bound":"MU9vZmZlZkxVWVVqWkltbm1rbUR6ZWRLbjhm","repeats":1},{"count":67,"lower_bound":"MVlkblZqakkzbURCM09LandzaVVjSHA0MDBpUTM0QQ==","upper_bound":"MWd4NGpNM3NqeTU4dDVocWlPdUpSUFJIMVBwMjNGSnA0aDBMUkY=","repeats":1},{"count":73,"lower_bound":"MWkyYTFReG1mbUNESDBSeTAwMmNhSFRVb0YxZkM1Uk44TEtZMGR5ZHpBblEyTkFJZHhsZDRnakpJ","upper_bound":"MXQxSmIxUVBvRXp0clJXcXI3UjBHVVVzYU14aUp4bjlpNTFQOW1FUXhSR2dybURLaXBUNDZuaG1mRjc=","repeats":1},{"count":79,"lower_bound":"MjFRUThoaEVFM0JyOHZNc1NLRUNDRWN2RjZwUGI4ejFMV0lMQmlJUzU1Rko5anBlVmI5ZE1qQW5yTlZxRTE=","upper_bound":"Mkh1b3d0b011QTBBZ2tjQk1udTk=","repeats":1},{"count":85,"lower_bound":"MlFOMGszaWhiVU40TjFYU0t0eWFvS3ZIZkdxM25uMXEzQUcxNWdUWjFDUk81QzZYbURxdDU=","upper_bound":"MldLbXdhclFQNTlYQ0c0dXZXRWFCaEU4UEszN2ZtRzZWYm1TYWpKNnI1MjQ3U2szVGFjUWR4RU1paA==","repeats":1},{"count":91,"lower_bound":"MmJSN1g0SQ==","upper_bound":"MmxYQTVWTHZSdE5venFLN2dNZWtSZm9rdEZaYlVob0ZLTzB1U3ZnSVBOVFlTSkVYWmEzNHJVdw==","repeats":1},{"count":97,"lower_bound":"MnJSRWIzSmpuNk5jekZpRTVJZm1Pcm5qR01pNGRjMXhpVGV6dW9MVFI=","upper_bound":"MzI1Q21Xd0xlV3poVkZvRE5FQzZYUEM5","repeats":1},{"count":103,"lower_bound":"MzJtOXNO","upper_bound":"MzQyQ29VRmdqWTJYQmhYYVFUVU04VGZVaEFMZWlOOFlzQjBTMWhCNFpFRUpnS2Q=","repeats":1},{"count":109,"lower_bound":"M0RjR05DdUp5VGRsNFFQSUo=","upper_bound":"M0tSTDVLRlJxYVVFVHc4NXQ=","repeats":1},{"count":115,"lower_bound":"M1VDMHhSdk55NHU2RmFSRzVraGVIZmtVV25LQzF6bWd3dndnSWJkQ0FmNVdNaFNsVQ==","upper_bound":"M2RDZGJjdzJSVTl3S1JXa2ZlbnlVVk4xcnZjd2JiRlE4bEY1U0FpTEFTOG4zcFFKN3pqb0dBbTBJWWFU","repeats":1},{"count":121,"lower_bound":"M2hpWlRLV0J0cnNlTTgzbWpCOFZlRkkwN3prNGJJWFR2NG5RUE9WTWNabVlEYg==","upper_bound":"M3FWQWJQMG5aN2toV1BhUEUyQ0Yz","repeats":1},{"count":127,"lower_bound":"M3JINGtBcGo2Snk4dWNBNzFNMWZiUlY=","upper_bound":"NDAxVUJpc1dEeDBnUm9TT0N2SDJVaHVCcHB2cGx1NEtzZjRrNHJUaGVUamo1Z1Y1U2xjRTdsWkhKZA==","repeats":1},{"count":133,"lower_bound":"NDBkYlhxSkw4UnVzM1VxaWZ3aUlB","upper_bound":"NDhxbnNpWGdQTnRn","repeats":1},{"count":139,"lower_bound":"NDliYmdUWjhvaTBJWFJYQndNbGNadXpoOUpWS0N2RWxXWlR5d2FWTFI2VUhBVlpiNXJ5","upper_bound":"NEpWeFNlQm5sckVpeDJDSmpuWTdBOUFIMTN2NkFzaHg0ZkhLZ0V4QTZuUlBZV3JWS2hYa3Q=","repeats":1},{"count":145,"lower_bound":"NFBWaFc5SEdLWEpZRDJ3YnhXd3IxOE5YVmNVZ0ZoT3I=","upper_bound":"NFc3bXlRTmxHRWg=","repeats":1},{"count":151,"lower_bound":"NFprWUpzcUZRWDYyYXRQSm90dVhFWmZzRjVX","upper_bound":"NGRNVjhXSmR4ZE1PRmhveEpCY2JQeWJYN3NDZmc3QVA3TlB1","repeats":1},{"count":157,"lower_bound":"NGVVbEYwVzllQlBRQ3FFclJh","upper_bound":"NG1KMVAyWGpLYlJLcGF0dnN3cVduWmUweEZkeGlMRw==","repeats":1},{"count":163,"lower_bound":"NG5pMFZObXFVUWg4Zm9EeDRXeDFNN0Z4MFdvcWRmcmpya0RqODZjUHpCT0U0b2FaUGVIMm41QVdN","upper_bound":"NHdDNzZnbjRCcVRyVTdxdDBJb3FUcTBybEhuaFZidzFaaEFw","repeats":1},{"count":169,"lower_bound":"NHlVb2J1T0pvUEx5MWNSUVJ0T0RMWXJvc0JxNENaUm1nQ2hFaXd5d0J0dlNyTDF0Z0F2RmJMbnNz","upper_bound":"NTI1QXg5ODN2OUxjNlNFT3lzMmxKTUpza0x1ekFpajBTZHFBdWl5V3I1OGNVWjIwMDNNZHdmajczcEI2cmdJ","repeats":1},{"count":175,"lower_bound":"NTNyYnRScDlzaUZwR0txTDdpTmhiQk1FVEZDSFA5eHJhRnh0Vm1veUREZ21VRlRQU2ZDSzBpOA==","upper_bound":"NTg2UXVOMHRqbVRKSVVQSThpNUFzcU1EMG5EUnRkYzgxSlR0a3RlUjdIVzlHZUF1UlhFZFZOV2o=","repeats":1},{"count":181,"lower_bound":"NThmN09neDNRUDduUlFjb01oNVpHbDhOR2RFUnZBcVF6ekF6Q1I1aGJGN2tGYllxTXhoMVR2c3RXSGc=","upper_bound":"NUVWME9IeTlXYm1WVU5SaUZwcGVIZEkzZU1jUmIySGdLaTVqRGhPNTVoOUFieVlGU1ZsbTNz","repeats":1},{"count":187,"lower_bound":"NVAxWEF3THNOOUdVNFIwckFKSVdLalNwam81TUxXWFpFUXZDYWVJNw==","upper_bound":"NVJ4NVVQTTVMTGhMVXZ6emZSRDV6bEZWNWNPNXdleE1DcjlZN3BsUzBuV3hp","repeats":1},{"count":193,"lower_bound":"NVh2QzRFVGhTNU9TZQ==","upper_bound":"NWtsQXhlNkxtVnFGVU9DRjBzN1pmRmJzTGY2UWR4ak9NQlduRmJpa3ZoNkg1cGFkeg==","repeats":1},{"count":199,"lower_bound":"NWxweWZGakFmRXVSOEY3dkppZzZsU1VRdzU3MVVVbFBnT1VjeVVO","upper_bound":"NXFCVjlXaDRuWDZEUGEwSmNCSE5kUlIwOWsxMnFLUXFPcWFKWGpqM1d0alpOd2cyMEgzeTkwR25xRWxjNnFS","repeats":1},{"count":205,"lower_bound":"NXFrTUc=","upper_bound":"Ng==","repeats":1},{"count":211,"lower_bound":"NjRQTTQyYk1PRmpWV1RadlJZbg==","upper_bound":"NkhSOGMzU0Z1Q2NkSk56Q1R3elkxcVFIUjVsYk1uWXdMUFRxWE91YmhTaTZJMnhDRW93cnh4OTY=","repeats":1},{"count":217,"lower_bound":"Nk9UaXFsMXFUWkw=","upper_bound":"NldndVVVbHh3Yk11QU5BazNjTVoweXJGclVv","repeats":1},{"count":223,"lower_bound":"NmFrdmh3WmJOWjhteE96Zg==","upper_bound":"NnI1enR4STZDcHg3S0FUS1c5TnlBT2s2cUJqN0pYa2dKU1Y3cVZkdnVvclFRbjZVaXFvNEVGbjdGTWdXNUZmSA==","repeats":1},{"count":229,"lower_bound":"NnN2ckZGU3JRMWU2UzZrM3hqWDdEZ0R0NFJQcklBQkI5ZUc1ZGxG","upper_bound":"NnpmcENIcmZRSU5ZSzVuOGJtTGc=","repeats":1},{"count":235,"lower_bound":"Nw==","upper_bound":"NzZUdG13amJSRUtxaTYzMGYxSkhsV1VJUEZ2TjVueW5UOVlZSWY0aGF6V0hsMzdZSDZ2N0FJNzBDTQ==","repeats":1},{"count":241,"lower_bound":"N0JsWm9xaUR0cTV6QW5RN0Q=","upper_bound":"N0s1dGZPV2VKYjVL","repeats":1},{"count":247,"lower_bound":"N01BaUtyY2VMSjJmM2loU1BwN0ZCWXhESVMycDRuZlZqcHFrbTBhOWhDYWtzUDhBUQ==","upper_bound":"N1JFTHowNXo=","repeats":1},{"count":253,"lower_bound":"N2RoZzRPY1YxM2xnSTQxMnI5OEswdnZSck81cXJDOWI1eVQ=","upper_bound":"N3FwV09Jb3YwTEdkTzMyT0NlZkJEekxJZ1NaSjlvc1U3amFIUXZsZVUx","repeats":1},{"count":259,"lower_bound":"N3R5SUhiR3A3bDc0T25lMnlmNkRBUk9jSHRLa0tmZldlNzVIZzVXczl1anQzZXpaRTh2RmpKcg==","upper_bound":"N3hZWFJpMUZ0VTR1enh1aVFMa0Y0Rjd4dWRjM2ZkNw==","repeats":1},{"count":265,"lower_bound":"N3pUa1NXUEpPNUtSTDNSdm56","upper_bound":"ODh2RndIQldMNUhMMHN6YldTRno0V2hmS2FoSEVBTQ==","repeats":1},{"count":271,"lower_bound":"OEZqM1pWU25Mc21iYVRrZ2dhSlBiRjdsSW1tWmxEa2J6a00=","upper_bound":"OE16NUxaRVJTb01hbms4TWFwck01ckxwbm1X","repeats":1},{"count":277,"lower_bound":"OFB5NE1iZ0VLMmlPeHhnRE1LWWw1dld6S3U2dTZmTDNZcFNUNnhhVGxReQ==","upper_bound":"OFVzblZwQmQ4cDRRN0REVzZiOTg2SjhpNTVJdnhwRHQyUURQZFJlTXF0ajdVQjBCY0lWc1pxeHU5","repeats":1},{"count":283,"lower_bound":"OFZteU5ORm5sOWR5Z05WOUs2NlJPUFRFNG5yM3JSU1dmZlVRTGpNS3U1N2JjNGFiVXVmZWxm","upper_bound":"OGVwcUlKWTNZcnV1Vk9FcThQOTFwZWpwM0tqMENmdVlTRHpzQQ==","repeats":1},{"count":289,"lower_bound":"OGZnYWk0NzFyOXBSWEFFRFhVb2w=","upper_bound":"OG9IQkVYRTBpN1ZhMGNRdTdlSm5GM3RhNVFGRXVDaUI3bXJO","repeats":1},{"count":295,"lower_bound":"OHQ0b2tDNThVWUxXVWVJbE1keHdwY1pWQ1MzRENBdGU5OWVoSFM1bGRwdzF0NVd6TXBlRVBSc05aZlM=","upper_bound":"OHlIbzNrSmYwaHJrbnBVb0NES2YyNUlYNlRZbFNXRw==","repeats":1},{"count":301,"lower_bound":"OTNPSW9UdUl6ckU1UWJWQmt2YkQzZlN5MUlNZzlrQ05RazlZd2h0eDc=","upper_bound":"OTVZUnZVdHNadkR0V0drdHFQWkEzVw==","repeats":1},{"count":307,"lower_bound":"OTZST1MybktKZEk4Y0NpUnRm","upper_bound":"OTdaR0d1SXRQcXVEN0R2SWpmQlM1WjFtWEpMblBUdDZVOFJmN2l5b0wzOEpHc0hhSENiQ0U3ZEdkbG9ZTXdNSQ==","repeats":1},{"count":313,"lower_bound":"OUJIOEpwR1pmVktQUldYTjAwVjBBcjdDR3o=","upper_bound":"OUQ4Q1BRQ1ZHb1EwS012Rm5tT0dJbFE3","repeats":1},{"count":319,"lower_bound":"OUhzczBJ","upper_bound":"OU9xVW9RMDBwSndiS0N5dnlNTWdYa1FjT3JDVG9jMUd1b3lqU09rbm14UFZrM3VqcWZHSDBmMG1IaGo3Rm40","repeats":1},{"count":325,"lower_bound":"OVBJR2I3Z0hXcEhzSVF4RDRQalJhdjF2T3ht","upper_bound":"OVNldWpFaTVXVUJaS0tCWVF5RFo0RnRydU1vTGE2THN4dzNGT1JHSU9KMnNneFpJVHZGbFdMMVRZS0h5","repeats":1},{"count":331,"lower_bound":"OVZhdjQ5MTBIdjRTWGQzVW5COTZtem52VQ==","upper_bound":"OXRxblpzaWdGb3lGV3FqSUhvaWNGOExYek5LRFFhWGxUc1JKNnVvVDU=","repeats":1},{"count":337,"lower_bound":"OXpaVmtudzEyb2tyT2dCM2JYTFM1ZENOYUNRZ01OSzdwUDczSmVTZTdFWHlYV203UFc=","upper_bound":"QUVuOA==","repeats":1},{"count":343,"lower_bound":"QUZOYUFwS1ltaG1kSURrSUhhUms4VXJBYm9yaXJma1NOWTVBVmRBRmJ4VzNPdU9CRE5pSA==","upper_bound":"QVBxU3hXV3Rha0RTanpJVWM=","repeats":1},{"count":349,"lower_bound":"QVRkVUdSZEtjV1pEQUpxMGticA==","upper_bound":"QVd6NlhudlJWWmNzbkVSQkN0N1NIVXZIWDE=","repeats":1},{"count":355,"lower_bound":"QWRnWlhsNGJPdnBOWDhhdEdKUE51MHVhRmxWbm5VZkJNMjBwQXFzWDVrM3FBRnNQQ2plZA==","upper_bound":"QW81bzV2SW1RdXdnQ29SVkFFNGtpUEdXSDhhbzNhR2wzSk9Va01JOE1uTA==","repeats":1},{"count":361,"lower_bound":"QXRGRW84b3hsRFJOTVo2c0Fsc0FWbWZyVVkwNGhxYnpwWXJOazdpZlZYd1Vv","upper_bound":"QkpOY2hPTko4dlUwQnpjS3JOUlBySG9vZ1pBTjgxMXlBOW1HaUs1Z2M3UzAyN05nTnVJNmV2TEUw","repeats":1},{"count":367,"lower_bound":"QkpTdFlXaUVnWFhEU2VQMUZVSDhMc2xadHI3REx4eWQwZGNU","upper_bound":"QktyWmFXRWNhUERqR2ZXMnl6YXV0VElUZkk0aDJVTGZLdThnbG5lTjV5RDBkSGx4SU8ydWY=","repeats":1},{"count":373,"lower_bound":"QlBPelFaZnM1dEZIMzU0QWkxUmJXdm5oR2tjRnB2OXBSSDY5NXhPbDROUDBXRXQweEN6bVEwRmVIa1Zp","upper_bound":"QmROaHFjTTVFNjd0S1BzblVvSzJQY1prNWt5cDlKQXF5U2ZYN0QxZlJJNDdyNmlrRmtFRUVNOVVkdWFlVw==","repeats":1},{"count":379,"lower_bound":"QmZMN3o4Q3RJbmpFcGVQOEhQZ2tMR1pYdU1kVWhJUGw4ZTQ5cllVR1BLN21Ndk0=","upper_bound":"QngwM2NhUVlPdFoyUzdRR3pGRnJtYTlzYXFOMVZSZVBqSg==","repeats":1},{"count":387,"lower_bound":"QzBWaUk=","upper_bound":"Q0hOUEFBVQ==","repeats":1},{"count":395,"lower_bound":"Q0pmNWpPempxV1I4SFg0ejdUU1EzOXdwOFdEeER2ZTJnclBMdkwyMWtkalNGT285OWE4dmRVc1F4VTJidmpn","upper_bound":"Q2M2SjJuODE3cGpzUDF3TWFBa1RYRVdZV25WUjJTV21rcEh0SHhOUWY=","repeats":1},{"count":403,"lower_bound":"Q2ZCUGU=","upper_bound":"Q21LamZaUXJ4ZEN0bjZzV3A3V2pCdmFaTWxocXc1Z0NRR2ljMXpvRndKUEhwZ1dwUHZDV2ZyYQ==","repeats":1},{"count":411,"lower_bound":"Q242bnEwdHlNRW50djBUb0VFanZ6Wg==","upper_bound":"Q3lPTXh3QmdzZmM5MWx0TGhlYmROZUNObzlacGxpT0RxdUNsRUttWjA=","repeats":1},{"count":419,"lower_bound":"RDM1bTZSeW9ZckNoN0xmZW14NWFTcUNOdWEyb1lRdEdWbmRMSFI=","upper_bound":"REN3QjJiZFl6VTE4NQ==","repeats":1},{"count":427,"lower_bound":"REVFOWY1Z1BWTXVUSk1IaUNJa2lIQmxDaWFtaG5VaFdkUlYybk8zN2RMTDByQmdET3FxQms3ckpxSGNydg==","upper_bound":"RFhveVg=","repeats":1},{"count":435,"lower_bound":"RFo3UlVNN3hmWDl3aUtFcHFZd1JRNXRwdDRVblNQcVBJVHB0","upper_bound":"RG5WOEpKUEQ0T0pvcjhRRjZ4aGNaeXpoaVNzWmJhOA==","repeats":1},{"count":443,"lower_bound":"RG90OHlPWHRWUEhtaFI0N2cxZFR0YnpuS3BCTU5Pc1JONFNnMnc=","upper_bound":"RHozSUNVdEFBOE54bGsyck5FMkNHYmt0d2ZSZUxNWTZJU2I=","repeats":1},{"count":451,"lower_bound":"RQ==","upper_bound":"RUVzNmdnc1NIVHI3R1FsRjdxVU5NbDVvWkFvbU9oTHVpVHVKZExjeDdpQ1NxYjd3NThLOTQ=","repeats":1},{"count":459,"lower_bound":"RUhCRGVobkpjZmNsRkdNR29zdTVhVk5LY2M0M24zS1g5OExhTWIzNTgzTlN1MTQwdGI=","upper_bound":"RWE2T2FuWmc1ckVY","repeats":1},{"count":467,"lower_bound":"RWJSa1U2d0Q4b2c4SnMwaUR1TjNpTXFXUjV3","upper_bound":"RXBoOUlnZ2lmY01BZEE1MEY0","repeats":1},{"count":475,"lower_bound":"RXVidG04ZnRvTFNhUlJ3aWc=","upper_bound":"RkJNTjZT","repeats":1},{"count":483,"lower_bound":"RkZvQWJMODZKMHRDWk9ZQTVtVUUyREhZdzZCVlpCa25NSkFNN1ZNaFF3eGpScVFsMTdxUmlLNw==","upper_bound":"RlB0RkNMQnFwTk1sTlJnMmN5TFNRSkh0MnI5MnpwRXVodTFkVzRsaw==","repeats":1},{"count":491,"lower_bound":"RlNVTks4dGxXZjlOM3hlUHhuV0VHdFhROTlmNDE0bFUwem4yOVJlMU01ZzM=","upper_bound":"RnFETWpMRnF6SQ==","repeats":1},{"count":499,"lower_bound":"RnVDdFg5T3hHeFVBMmFDUEZZQW55S2JCWVRheTRvNUszbFM=","upper_bound":"RzVDMVczWHB4TkV2bEVHeXhzZndqMDR1aW9ySUQ=","repeats":1},{"count":507,"lower_bound":"RzZ2MTFwQUlWRw==","upper_bound":"R2FScEU=","repeats":1},{"count":515,"lower_bound":"R2NCRWZzd05semRwQVZpYVV0dmZMekp4QUs3Y0RmeWoyZE1GTjFjRlA1cmJnUzY=","upper_bound":"R3h5QjMyOVdrdzYzdFlHZWE2eg==","repeats":1},{"count":523,"lower_bound":"SA==","upper_bound":"SDdnZG9UaURldlpEd1dEQWg1dXZMVmtvTw==","repeats":1},{"count":531,"lower_bound":"SDg1ZmFYSFQ5d3RucWQ4N25nVVBiWTN1TzVQWmxyOEM=","upper_bound":"SFBoYlAyR0pS","repeats":1},{"count":539,"lower_bound":"SFJkZUl0WE5uRjE1TUVkRE9lQWFYSERZeFZjVVNTRWJ1bFI=","upper_bound":"SFd6UlhWTmFhTTc4NUpwNWVyd0VsUw==","repeats":1},{"count":547,"lower_bound":"SFpHbTBIZlRxejRZUkZwMDc3eVNoMFFIN1M2aGJmY3NhZzVHMWRBRlRiV1BTajdEWg==","upper_bound":"SGZqRWdJaGQwamROeldFU0R6S2ZmRzFuSERScEd3cWt4VmszaTNs","repeats":1},{"count":555,"lower_bound":"SGdlbGxTb2huQTRPU210bVYzVmJHSGI1N2NqaUNMVzMzQjJ2N0xYMlNSN3JVYm96YTRGQ01uandXWTdXdU5EbA==","upper_bound":"SGw2VVdrWWVGSFd4bW51SjZkTWY=","repeats":1},{"count":563,"lower_bound":"SHFvUWZyS1o4MVNZV0VvNUNQblFhZjhQcVNj","upper_bound":"STN1V0tZYThKZlZsUjBMM2pTODExbEJVanFlT3pYWUlxd1MxVHJhZVZOampCWGRDNlg=","repeats":1},{"count":571,"lower_bound":"STZaaG85MWYxRGt1Q0RnSDhGa1BhdGZMY3Q3VDhWa3V3NFE3dW0xRkZCZmxwWlBNWA==","upper_bound":"SUJhdDk3UWtYZTE=","repeats":1},{"count":579,"lower_bound":"SUM0ag==","upper_bound":"SWdKVVY4S2Q3VnQ1ejNjaVZrZ0NlVmYwUURaZ2xSUXJVZm1KazZo","repeats":1},{"count":587,"lower_bound":"SWdpaWNLOUpRaGt4VjEzemdYM3hueXhCSVkyVXdHSmU3","upper_bound":"SXBaWU5CQnNCNjdsdXY2YnVi","repeats":1},{"count":595,"lower_bound":"SXFoN1hhandPaGJEQ3NqSjlubDdWRGlZM0kwOW03RVdBanBrWXg2","upper_bound":"SXZqdlpGZw==","repeats":1},{"count":603,"lower_bound":"SXc0TDlDckppdjA2aVEybXo4QXpIZ2RIWXo=","upper_bound":"SjhYU0FCQlRkVDd2WG92a1hEeGo=","repeats":1},{"count":611,"lower_bound":"Sjhtb2lwTmZHNmhLSVRjVzJLME1EVEtBODNjamphTjBXUGVSaVRNaVVJYklKaEE3VjV5dGNRNmtlQ1g=","upper_bound":"SkpMMGlmcWtFbXlUWkpTSVdORk5KdWFQZHBCZDJ0NktQYkFSNjlLZXhsZk91alpQTVA=","repeats":1},{"count":619,"lower_bound":"SlRtbVVjSzZvaXozeWpTT2tYTThtemdET2V6Q0hTQmdUWVBVcHZ5Y29UNjZkalNXczV4Rm4xcjJE","upper_bound":"SmJWMURldDVLZlpOVWhCYzZIV3dPZnVEYlRUWjN6MHB6MDRLWDlYT1F1TVdMRWl6Q2k0clhtaDdXanczdjVCdw==","repeats":1},{"count":627,"lower_bound":"SmRRdUJ6UkFEVkhYc1NFa3NIcVZzNGo=","upper_bound":"Smw5b09jTWtTeGYwbjRjRXRSTDlEcHRnSExMeHZWYXJtN1NPVFR0TA==","repeats":1},{"count":635,"lower_bound":"SmxURjM5THBCTHhTMk9Yd3c0RjJ1bXlCSzNKa0QwTktNdkxpbVF3RUZRWEF2VGtzbjhkckFy","upper_bound":"SmxncmoyQ1BFZ1M3ZGxwME9xOEVEMTNMVmY1NFgwa1hXZ21U","repeats":1},{"count":643,"lower_bound":"Snk0c1djNTZYbjJxNE16NFIyeUhTSHRsamdPUW5HT0I=","upper_bound":"Szg0RmZSOTJsZUMxM3FjTURKT3JTTzFiQjVMZWl2YnRva1NZS3BOT05NeGtpeXJZNThzaXdFemxX","repeats":1},{"count":651,"lower_bound":"S0JZTW5oTnlVZkxnSlpQcnVOQjF4dWNEYlBJamJPTnJkeXh5eE9VRVRHeGlXNjRZT0hodWE4ZQ==","upper_bound":"S04xaVNFY1hyOGpRbGtPbmJSYVdOYWtiYU5CRGlPSm41dGh0bmo2YnN4OGpFaw==","repeats":1},{"count":659,"lower_bound":"S1JQdHlza1A1V2NCanNydg==","upper_bound":"S2dWWTRMbHo2QkZkeVl2T3NRUndvag==","repeats":1},{"count":667,"lower_bound":"S2lUYXl4bkdyY01FcGpQOURSbW5EZkwzNzJkdHZKQTlmV3BmUGVyejY4eQ==","upper_bound":"S3FUTzBWb3pXZE9RaG0xdHVaaGJXTm4yWXNDNUNQUlpYTUdFbUNISjVaajBGenlmUzk5aQ==","repeats":1},{"count":675,"lower_bound":"S3JnU3d1SlNNY1I5Y05kcTdqMk1JYnI5M1lvRDdt","upper_bound":"S3Q1N25uNXIyaklPRGg3OFoy","repeats":1},{"count":683,"lower_bound":"S3VjcVgwQUFtejRIZlRBcktsTHI4U01CQThwSA==","upper_bound":"TDF4TVlEcDVrOHh6UHMzd3JQQXc=","repeats":1},{"count":691,"lower_bound":"TDVlOVhNc2dscGFyODhScUZTQmpWZE5jekNTWFVPeDFR","upper_bound":"TDlhdTBtbDZtNzRxNjNRNW5ucENPTXdKQ09lWDNI","repeats":1},{"count":699,"lower_bound":"TDlwQ2d5djdzSzBOeHhpbzFKc0hWZGZldVZaOXIySTZqODdkc0NWdmdCUW5LRHNuTVp6eXRqY2Jx","upper_bound":"TE1xNVpmN29rRGsyZUJ1aGRDYVJhRFJJQ3ZPQjJnODQ5MDl3eDA4WTR3R1VlWjlCOUNKRDdmVUM=","repeats":1},{"count":707,"lower_bound":"TFNER1JqWU1FV1AxeTFUdnRyMEJjYnpQb0FLYzk3UXJOVldRc0w3cndETHlZVHJYRTFFcW1iRnRDMw==","upper_bound":"TGtmSlVTbXVRZzdaQmNjdkJ3ZmQ0YXhFYVRtR0xzRlFBVUVNTzhhZGY5VUhGY2pjSEs3V3lhNw==","repeats":1},{"count":715,"lower_bound":"TG5Mbm42YXFOcHRCU3VBRk05WGlPZFpqT3NLWXlPRXpVejdmaTFxT0pXeA==","upper_bound":"TQ==","repeats":1},{"count":723,"lower_bound":"TTFGMXVjTllLeWNrelNKVlZUQlp5MQ==","upper_bound":"TUR0QUM4TEJ6a1lpMHgzTHhCb0RhTGh4c2liWkYzZE1j","repeats":1},{"count":731,"lower_bound":"TUhVMWdnRXhHSHhKQnJtWUUzbw==","upper_bound":"TU0=","repeats":1},{"count":739,"lower_bound":"TVZIdUkyNVdKTXpnVEQ5WURlN3F3UWg=","upper_bound":"TWlaMFRiYkdrQmlKTjBmdkh5ZjRuZlVqREpER3Yyek5KWW5ESHdoSGZRRFpEcUpQeg==","repeats":1},{"count":747,"lower_bound":"TW14eXVQYUJmbHRtZlFkNGxrUEFGRTRTSnR1","upper_bound":"TXljMVZsSGZRdTJLMzVjQXkxbXlCdHBaMWY=","repeats":1},{"count":755,"lower_bound":"Tjh5SkR4TEM2OWZuWHNkUXREZ2xhQUpVenA5RmRLZVVCS2RnUHd6SllXcnBtSmdFVENuaWtRODJFeG9WT3A5","upper_bound":"TkdLbXZUQ0lRMHR0RndacjNzalNFTnpWUEF0TE9ZSGtBVEgzWmRod25kWFlmd21UdVZuZFRJS1Uyc0U=","repeats":1},{"count":763,"lower_bound":"TkdnaXI4bjI0ekwzYWQzZXYwMnRrTEx2NTRBRFQySzVyeW0zQksybjd0VDE2TTdVOUxVUE5zQ2ROYjRONQ==","upper_bound":"Tk85WUNodE5xaUdPMG5GWm9DV2RDWjJLdUlYdE56MEJVY2pST3pWaThnTDZ0Y3NkNA==","repeats":1},{"count":771,"lower_bound":"TldPQUhaclp4Y2NybXdNY01HSnlIM3pscEhLUjZ6RW5WRjJRVlliYg==","upper_bound":"TmJGQ0F4VDE0T1JQa3p2d0tKQ2U1dTZEU0ZBc2hKRWZkVDAyQXc1WG8yUUlrSU52bE0=","repeats":1},{"count":779,"lower_bound":"TnNBc2J5Mzc0Ym1MQ2VhOEJCZmRHVA==","upper_bound":"TzlNeXRndkQ2aHdtOEFlV3NOOEh6bk1sSmoxemtLUQ==","repeats":1},{"count":787,"lower_bound":"T0NRaU4zdUxHcTVtOEdTUGdzUnJkd3dlM0ZQR2Z4","upper_bound":"T09kMHBIT3pYUHY1cmdHWURMN01laWhiTHpPV1czc21YYXROVEE5dldPcU1sRnFhUXB3c3Y=","repeats":1},{"count":795,"lower_bound":"T1B2U2R5STVSUk1ZTDZDNjZRVG1qWFFLTGFnTkhlTXdLS1laYkcxQnhiOTQ0a2V3akNEcmRrTXoyMw==","upper_bound":"T2trRFJnWXVWaGp5YU9qTVc2RktnTlRXS3NuNlhUank=","repeats":1},{"count":803,"lower_bound":"T2tybWpMNkVKT1RvMU1kS0pjdmxXQmgyYVhiZVk=","upper_bound":"T3dkY0RGZ08=","repeats":1},{"count":811,"lower_bound":"UA==","upper_bound":"UEpNZExmNWV2ZWtSVVRwYzVEMTBiRllQUVJYY2M=","repeats":1},{"count":819,"lower_bound":"UEppSVVuVTVlN1k1ZUxIdXQ5M01IeUhzZEV1elE=","upper_bound":"UFdablRLYjQyYTNPUw==","repeats":1},{"count":827,"lower_bound":"UGE5UDZJQjJGcWJwSnNrN1BZUU5vWWQzUGo2MktkTmJScGNSN2RHdVFQeHRkZ0YxQzRwTlRLSUtBMkNCUQ==","upper_bound":"UGh2MWtnMVI4","repeats":1},{"count":835,"lower_bound":"UHljQXp5SDlNcmQ4aG45MzRhdThwdko=","upper_bound":"UTM3VU9pREZReGljSTdxeVZscmltQlhqM0QyQjR1T0FnUWFKUjZHWjVnVzA=","repeats":1},{"count":843,"lower_bound":"UThCbVhOWFBNZEI0SjE2NXVidkFrTDk1cVAzc2hpaHZQTW9ONlg5NnF4YTBU","upper_bound":"UUNlc2lzNEZ2cU9ZN1RkN2V2QUNZQlRtYjh2UnZDT09FcW13YjM5RW4=","repeats":1},{"count":851,"lower_bound":"UU9UVVNNNlE1VmhMOVlwT0pEV2JWYkd5TloyWjJkelNjbU1SdUkzUVVPQjRDUVo1WTlsTXA2bTVnbjJ6OWpB","upper_bound":"UWdXVnBPNHV4","repeats":1},{"count":859,"lower_bound":"UWp2MXk4ZlNqbzZtb2M0OUliMlBvYmVHdlRxNzY2dGdaNw==","upper_bound":"UXZxblR4bHZxS3d1a0psRXBoZzl2dllqbzJCZmJu","repeats":1},{"count":867,"lower_bound":"UXc5Q09GVG5TT0t1R2dDbw==","upper_bound":"UXpsb2thRW4zSFRiMg==","repeats":1},{"count":875,"lower_bound":"UjBjd3hGY0QwN2RrSWdtN0ZYWkdSYzFlbDg=","upper_bound":"UjdOUmdZQ2xjRDNEMEczUVNIa0tnTk5YeWh3c0JHNzNyckZI","repeats":1},{"count":883,"lower_bound":"UjhuZE5wY0U0a1ZaRm10VFliUEdLeW1SZUZwUlZMN3NaUTI2MnZjT25xSWd3MjRsRHVWTmJjMjBnM21WSg==","upper_bound":"UlFTMG5zWk9JS0ZUUTNleHVIM0pvbFVyaHpjTU1VZnlG","repeats":1},{"count":891,"lower_bound":"UldxTW0yZmRxYXFLQ21RaTNUcnNBZW8zMkRlZmpHa3ZVdHFGOTd0bmVBOGox","upper_bound":"UmFFdjdnZDlkNXlhY3JwU3BoeXJmUmpxZGhiUXdCRXlHQWhKaklyMzhvd3B4YVU3VnRjS0phelJ6RmF1eW01","repeats":1},{"count":899,"lower_bound":"Umc2bks0cDVaaENxdjJO","upper_bound":"UnRCbk53QTVzOWlDc2x3S3haSENJZWUyOThpZGF6OWRx","repeats":1},{"count":907,"lower_bound":"UndISFlFZ2luM0RWYmZYMmZHZktDbHliM3pvemV2Z2NHQzdKR3BOZ0k0bHBwaHBpM3NPSHg=","upper_bound":"UzRYZHI=","repeats":1},{"count":915,"lower_bound":"U0Rpc3N3WTJUeXAzZkhyQ3ZNaVppVGZOT1JxZ044d25T","upper_bound":"U1JPclE3TlQ5OFlJMlFZUw==","repeats":1},{"count":923,"lower_bound":"U1ZrOHdBdmdUNlhmQ0tBM0JJRXNIamhiVWhiUU1MeEdhd0pjUFB0ZzBxag==","upper_bound":"U2JiNU1FOGpUdDVZZWdzV3pUVk4wR3dCTkdZMU9IeTB5aE9sNXFwTVo5T2tHdFgxT1VwbHhZR3NsOHNYdGoz","repeats":1},{"count":931,"lower_bound":"U2ZySnoxQk0wd0RCdXlBUmlWd2NScVRTZnRhTjVKenpVaHZScTZ1a0p5TzJ5dFBTMGFDNG94MmRXSkdkcg==","upper_bound":"U20wYUhOMktzYVd6SjJjRGsyYXg0bHM=","repeats":1},{"count":939,"lower_bound":"U21R","upper_bound":"VDM5UzNjMXli","repeats":1},{"count":947,"lower_bound":"VDRZUWZON2VXeVpqODNyaQ==","upper_bound":"VEZudm5JaFE=","repeats":1},{"count":955,"lower_bound":"VEtVZmgz","upper_bound":"VE9RalFaVg==","repeats":1},{"count":963,"lower_bound":"VFdvUkVxTk9wY1NMaWd4aWgwekpKMkY4djJYUFp4b29YR1RQcXZVYlBEMVl4enhFVkFUdkRHNHI=","upper_bound":"VGVWU2RTbHFNODR4eVNaVlhoYzdua2FpdnlzVnFxTDA=","repeats":1},{"count":971,"lower_bound":"VGd6VEJQMW84cWtXaGI4dk5HV2tDNzNDZVlyRjFXbXlPSHVkb1RjM3NGZFQyOVFNQWRQc0oxOVhU","upper_bound":"VHBaVE1UUlM4cHJLWUFXeW1oWlVKUEo4RVE1WE4xQTVXcm5SZERwbW9WS0lW","repeats":1},{"count":979,"lower_bound":"VHVDUHRiZGVlUzJCaEdlaWJQQWViREo1M1J0SFBwdVBzbjc2dzI0NFBVZFcwMDdLbnVvdVJCTTV2ekpi","upper_bound":"VTc1aDN3Y1pFam93MHZoUmpsVVRicU9qclFRVXZkQjdIWEZQeUJhZVNNZWNxOUJ5WnVTaTBuS1Qy","repeats":1},{"count":987,"lower_bound":"VTkwcmZ3SGdaSVdINXFkMjMzNTlZOXV0cHJldHNDQkU3WHRrZ1NkZnNiNnRpOG9mVVlYR09KT0Zz","upper_bound":"VURtc2ZpQmUyTXhxN3JGN2xJVTJWdzdZN1J2cFVadGJnOGE3Qk52bUUw","repeats":1},{"count":995,"lower_bound":"VUZiaTFkSjBHdG1YQ0dVMEZlcUNUY2dGV0FKODRHcEh0Y0dqbk11MGdneg==","upper_bound":"VVc=","repeats":1},{"count":1003,"lower_bound":"VVlud1ZiQndyellvNFFCSTBYbWdzSkNSaUd4cQ==","upper_bound":"VXFRZmt0aTJuUUJNbjlETW9UYUlZUHdHYnlhbGt3RFIxbzI1Sm1TcXBONUU=","repeats":1},{"count":1011,"lower_bound":"VXhWa01sWUZURVY3eVVwdDI2WjdFOFR0Nnc5a0pneUc5ZlNRY0JUUHFQdzJieWpP","upper_bound":"VjFLd01TVUc1NVFwRWxuMFd3UmxYc05PcFdzdEhwVnVEbVlyblI4SDdEMWxYdw==","repeats":1},{"count":1019,"lower_bound":"VjNXSDJ2ZGF6cE9la2VLRUwzR2o2","upper_bound":"VkhKSQ==","repeats":1},{"count":1027,"lower_bound":"Vk9BUjNLaTN0dUwwNDdMUA==","upper_bound":"VlhmNzhLRHJQRDl6eEhybnNsek8wOWh2T2k5M0Zx","repeats":1},{"count":1035,"lower_bound":"VmNQ","upper_bound":"VmpPSzVyQW1jOWg=","repeats":1},{"count":1043,"lower_bound":"VmxJbElPbWhlVWc3N0NlNG96WmdRWlFEZEFVazR3bWhtM2FLa1AzTlZYbTNCN3ZkSW5VOHI=","upper_bound":"VzcxWFR6NnlwVG5oeElUVEFJcnNlS1N0enVDMWg=","repeats":1},{"count":1051,"lower_bound":"VzdNbVYzQ3ltb0VMRUJiZ3lIQk1HajN3eDNhRg==","upper_bound":"V0NnWFo5dG56dDFzRTVxQ3p3eHQ0bWpwUU1JS05POTIzQld6T2hBRXVqSjYxYU81ZEtSZlp2OEFOUTQ5aA==","repeats":1},{"count":1059,"lower_bound":"V0ZENFFyd2o0Q01oaXhFQm1SMk1YSkhiZjc5bHM=","upper_bound":"V1I=","repeats":1},{"count":1067,"lower_bound":"V1Jnell6YzhsVlBhZGJmcGxQcHNUS1FWeXJxNUxQTW03Z2dtNU9iQmozbnJvaFc=","upper_bound":"V2lJdks4SVU1RVZ0UFBJRHRBNEdoUzFzYkdHUDB1UHRVS2Njd0VvVjNSRnpja0FKQjhsNm80emVweHRRZkRCVw==","repeats":1},{"count":1075,"lower_bound":"V2tFbk93V1RkNzAzd1d2SE15NHZJZXlLOHJuaUg=","upper_bound":"WA==","repeats":1},{"count":1083,"lower_bound":"WDJQZzNZTkdvZEpWVXpDOG14WnI2a2ZCeTVsY0FYeXhsdGNNQkhGMTU=","upper_bound":"WEVKeW0wTmNOUURHUjEyWVF4Qk1LQkZHSTRjWlVVNUk2","repeats":1},{"count":1091,"lower_bound":"WEZnQTdHTGI1WXM1b215blZucndtMWR1aHU1","upper_bound":"WE9M","repeats":1},{"count":1099,"lower_bound":"WFcxQ1FVa0dKcTdaTDlZRXcxbkxlVXFadGlrRDFmaVZTV3BXcmd1OXc2bXA0YnU=","upper_bound":"WGRIWmpPZnZYUml2bmo1V3VYN1FwQQ==","repeats":1},{"count":1107,"lower_bound":"WHBYd2JucnZ6dFhOSmJEbUxrN3k3WTIzSmg3bzRERWFGd3JwNlg4cmxkaUNuZDI=","upper_bound":"WHRCVThzaWNVZWhlZHNXdmVETDRNZTVkMnVWbU5VbndOV1BNajNVbmEwRWhNcnpjVA==","repeats":1},{"count":1115,"lower_bound":"WHhnMUNTcnluSA==","upper_bound":"WTRzREVucDRTMTdJdUpBUnQ0RXJXbzFHZWw3VkpnUWdhZjFXdEVNdHBiSVZBZDdMRDVNZmJBNFVYOWhCelo=","repeats":1},{"count":1123,"lower_bound":"WTVQeGFMRk9MOHc0NFZDS292Rk0wYmJVUDhGaGs=","upper_bound":"WU1TQ1pWYzZVTmk=","repeats":1},{"count":1131,"lower_bound":"WU1pNXYxekRHVllYWGlwVlEzSEVsYU1QdHRoazA2QUZucFNROElqeUxUZUJMYQ==","upper_bound":"WVJ6bjF6SmEwdFdFaVNtNklETEw0QTN0ZVVpc3FEVzB5SWM=","repeats":1},{"count":1139,"lower_bound":"WVVkaUxPM1J6Nkc0N0d4Wm41VndZN3BPaFRH","upper_bound":"WWFnckdBMjBhMWkyUmJnYWpNR3dSQjNSS1N0","repeats":1},{"count":1147,"lower_bound":"WWJz","upper_bound":"WWpwb0NPN1dQTWpra3JCYk5UT0ZNM25kYzAycFQ5R0l1bERORXljR3pSZFZJSlQ=","repeats":1},{"count":1155,"lower_bound":"WWwxeUZvbjNXa0E2SlBYaA==","upper_bound":"WjJKVnRGTUNTR1Y2UHl2UjlLNmxH","repeats":1},{"count":1163,"lower_bound":"WjJqckt6","upper_bound":"WjVGckdVTFhaRGVmUzBXak80cHlGc3JGNXlUWlM=","repeats":1},{"count":1171,"lower_bound":"WkI=","upper_bound":"Wk10ZWUwemFZUjRrcTh4OWZUMmViTkJyYlQ2MnlPY0NWUzhUMUxPdmJEWTFIcEt4c1ZBS2s2YVFBZ2NkNVQx","repeats":1},{"count":1179,"lower_bound":"Wk43VHdSV01kbTRwWmZrcGViaURRYWlaNmlJMFJM","upper_bound":"Wmw4SWhYeEN6NHZkelYwSlhIdnFNbXRLQnJERTJJRUgyZGJqV1JWSEhpanNzbncwdnJwUms=","repeats":1},{"count":1187,"lower_bound":"WnFhWE9aQnczTDdJY0Jj","upper_bound":"YUJMOTFTVjR5a0tNZXM4TFBTU096Zk82ZjJDcm40YUFkcmlpbVRGUHhIQ3BCQXBHd2d0RHRLRjIw","repeats":1},{"count":1195,"lower_bound":"YUd1QUNEcDk=","upper_bound":"YVBKajgwUENtS2x0QkNsQ1Qya3VBaEtLQjBlSkxaNGVlQURCQ1hsTXNkNVhycW0=","repeats":1},{"count":1203,"lower_bound":"YVdTSkd5RHVHTkZwV244NkREcUVCZXBCaEhjQ2pBcFhvMFV4WWFla1hiazI3Zjc0","upper_bound":"YVpYbnBJN3RGenM0MTZnZDRkQjdic0EwU2NHWnJVeTBLV25ZNlFWTnlmckd4MHNuRTM5UQ==","repeats":1},{"count":1211,"lower_bound":"YWNnRWJ2YkpOWlBXQWFTcmpvM0tSQUdsUlNnZk80eXpXNQ==","upper_bound":"YXRFYnFsWVVldXpCTkVlcjFGVUlVSWcyTHJqbHBx","repeats":1},{"count":1219,"lower_bound":"YjFwbDZMNFFPVFFaZ3loWjZidmlNc1FJYjdIU1I4RnQ=","upper_bound":"YlBDcW85ZXBzQU44bUp3YU03WFc4Y2t1V3JYMFRMcVV6NnFlYUhEN2xBR2hEeGtlOGxLcXF2RA==","repeats":1},{"count":1227,"lower_bound":"YlNvUWRiRTI4dHJJTll6Qk14MFR5anNWRXFObTlyZ2JZVkFldTdIaFl1aERSWllI","upper_bound":"YmNqRW8yNlowbkZuaE9EVjk4MTVibVZWTlVPdFZ6Mnh6MEpqQ3o5eXoxZm5EbjN4VzZiOUo3TjVEOA==","repeats":1},{"count":1235,"lower_bound":"YmRCd04wejl1VkVUTjI0VGg0UmdXbUxtTm5MNEI3OE9ZTlhNQkViMEJyTzZmVTNZ","upper_bound":"YnhTZlYyVlNLc0JaU082ZkJXMjBMS2NydQ==","repeats":1},{"count":1243,"lower_bound":"Y0o2eTVWd1BSRHhpb3ZSdHQ=","upper_bound":"Y09tbFl0azNYeVlpVjZ3OXBKZkVKZzlQYlp4cVQxRkwwSGtDdjZLZnYyNW9IY1FN","repeats":1},{"count":1251,"lower_bound":"Y2dadXF6ZVk3d2xxVzlhNVlwVTB5R3RGQkFyTlRoTnhXT25vQXg=","upper_bound":"Y2wzazZkbTdCaGRTVXZ4Z201dEE5WEJFSmQwSmJGWWFpMDVSeE5UTTVwazV5VG1sQkwzMTdiOTc5","repeats":1},{"count":1259,"lower_bound":"Y21SYg==","upper_bound":"ZDVOdUZlbUtxbVE5aDZmbEFmZWdBZ2tuemYzcVRBSWt3cFNzdEtmaUNHVDQ3eFF2Q1o=","repeats":1},{"count":1267,"lower_bound":"ZElETk5RYXRxQUI0QUZVako5TXBJU2hyNW9WQU14THJSMWlPRHM5d29ta0pWOFJ5Q0JVWQ==","upper_bound":"ZE80d3ZnMjVtbVZuU2VFN0pnVzFabHNibXV6QVo0S09ON2VZbFFndkdaNzRwM2ZhdVlrWUZ3","repeats":1},{"count":1275,"lower_bound":"ZGtKclZabzhwRkdRWG5ZSDVuUzF6QUp5QjVYcHJlSGhUY2tZZkV3eHIwMjNFSHJXODc4NHA=","upper_bound":"ZHRBQjh3djJnVVVRWkNsZTE5bkdPZk9RNHljdEdQUmw=","repeats":1},{"count":1283,"lower_bound":"ZHd3c1lPMHhLYTZiQllUY2Rq","upper_bound":"ZVFqTlN1Vmw=","repeats":1},{"count":1291,"lower_bound":"ZWEyTTQzYWtpNDJvdlVLdW9PczI0TzR2RXIxMDdHNGROTzBCWnhFU0Nubjh4Qzk=","upper_bound":"ZXNkckRqc2ZOaTJ4VEp5elY2MTlDZFpFVXozaXVRNnE0WFczS2lqVXVTR0ZxZk80QTY=","repeats":1},{"count":1299,"lower_bound":"ZXlhcjNtcW1Ga2dNRDd6SUJnSUJGNmtJcExyOUY3Nkd6NTQxb3hDcFZBTTVXN1h0dlliWnlFVg==","upper_bound":"ZjM1dlhFWHV6Znh3MTNFcTREYzN2YWozdFN4eFc5dlNKbzFJTDkwVXp4dUlpMA==","repeats":1},{"count":1307,"lower_bound":"ZjNyNHNRT0VZSjdIdWNkSkMxWXYwTVdqZDlpYXUwVFVoM1JvZW9LZHphNk5iQUw=","upper_bound":"ZkVwbk5jVzNNVjFSblFSSW5WSUJUWnhoMVdCbGZodkN6cTVMWFNS","repeats":1},{"count":1315,"lower_bound":"ZlJETmZFTmFCZ0UzaEFpS0FKZjlkZ2czWQ==","upper_bound":"ZlliU2JQ","repeats":1},{"count":1323,"lower_bound":"ZllpSVAzVklpeHJqdTVMWGpSYUx2dHRReTFrdTRXdTJERVdlTQ==","upper_bound":"ZmxKRklSWXM3TFZmM21ROGFDV1paazNoR2QzRWRD","repeats":1},{"count":1331,"lower_bound":"Zm1YRDlRM3NJdUxPanpOZg==","upper_bound":"ZnNsVm8xZkpVSGtsQzhmS3NuMzg5UjFLSVNkUUxodDN0WjhyNDBrdEJ0M0ZIeFlEZlZGRDVt","repeats":1},{"count":1339,"lower_bound":"ZzB2NFlJaFVKN2pucEV4WG5ob05GQzhUT3VUMjc0alpYc0RaUnJrY3hPajEz","upper_bound":"ZzhFNUhkY3Z6RmNpdlVEWVRDcktjYzdSRkJKM0w=","repeats":1},{"count":1347,"lower_bound":"Z0FjY3RZUDJNcUZSRUV3d0RqT05aelhpNWNDbHlTNW5D","upper_bound":"Z0NNa0IzSHVUbTJTTXkycmNXNmtRYW1lcmI4a1J4OUZwNmQwOUxaQVZGb1E0RXhaczBPR3NoR0ozcA==","repeats":1},{"count":1355,"lower_bound":"Z0hlemFnbXk3dHc4VnFXSUVVczhlSlNjVFNVaUlQRWRaeXg=","upper_bound":"Z2VLUWJYSWZvVjI=","repeats":1},{"count":1363,"lower_bound":"Z2VWZFZRSTREbG1SMjBQeGh5bVM1aXMzUlpJNXB0OTBSUFlNUE5TY3Q1bg==","upper_bound":"Z29ydGRTTVZMTGt4VkVRdTEyUGpIZk9YNzQ5clBSdHRMMlo=","repeats":1},{"count":1371,"lower_bound":"Z3Q4Ng==","upper_bound":"aDRYZWxSZXo0Y2xPbWM0WjQyVWJrd3lNTVhkcm12ZHFUM1BkTmp3a1gwazRMQ0paTFdnUU5GczdEUmJWR3J2","repeats":1},{"count":1379,"lower_bound":"aDR5NEp1U3FVWTlma1lZMlBSTmJkNkxMZFdsS2Z6U3BLSUNXbVdVMGJ6cUhEUg==","upper_bound":"aERsV1hmdW93cExh","repeats":1},{"count":1387,"lower_bound":"aExhcUo=","upper_bound":"aGVaV2NLc0MwUHlmeGtJekJSbkIyUUlMUElRZUFxbUVZUnZTMnNwRW84","repeats":1},{"count":1395,"lower_bound":"aGVnc1Rkcmg0UXFFNA==","upper_bound":"aGx5NFdMTnNIY3V1UHByb1BKY1RGV1RFZndOVU1hOWw1THBDVw==","repeats":1},{"count":1403,"lower_bound":"aHBsenZ3Y0MzU3B6THliQ2dDU256Z0loVzBrUXVkRw==","upper_bound":"aHRxWThORlFKZ1RURjhoTEs0ZzIyWlQyeFFacEtLQnFuQjJPUkthbk83Tkc0emlSTFQ1T1o=","repeats":1},{"count":1411,"lower_bound":"aHRyNVdYRW81amxjTzRSOTJ2a3QwMVhWV2VJUVBpZU5Bc3pLa2VPOUVXdUNP","upper_bound":"aQ==","repeats":2},{"count":1419,"lower_bound":"aTA5UEs5cXNtR3d1TnVpYnhMVXhYUkdzZkhWbDgwZ2xNT05meGlYMTZsZkt2cFBVeVdm","upper_bound":"aUJDcXZFMDVWYVVOTjVrdjhnYzk2RURNNTdm","repeats":1},{"count":1427,"lower_bound":"aUREVg==","upper_bound":"aUdWS2w1WVZjd29jMGVqM2hHamViMkZOMDUwWUdYNW40VWZwMzRJbDdReFlyV2IzcWFPNElrV2o=","repeats":1},{"count":1435,"lower_bound":"aUp4NkttdGNieGlpQw==","upper_bound":"aWF5YVRXcnI5d3B1","repeats":1},{"count":1443,"lower_bound":"aWJ5c0o2VlZWQ0JSaEN6WVhwT2JlYVVHdml1ZEVKUzBGRQ==","upper_bound":"aWxWZkk0TW9OTzUxRG9mZzhpVGY=","repeats":1},{"count":1451,"lower_bound":"aXJ6ZEt5WWJOSXIzeUt4bGNQcE9i","upper_bound":"aXZ4OHVWR3B3eEF6d2ptaGNaR2Fh","repeats":1},{"count":1459,"lower_bound":"ajVpYTJpdXZYME80U0F3VFAyRUF2aTA3ZTR1SVhOTXlIemRwbEJnTTR1ZllmaURWR2Rmcm9IM1BmdEpK","upper_bound":"akRR","repeats":1},{"count":1467,"lower_bound":"akhDRGZHWERleXhNbk9nVTAyVFM1ZGRvV21LMw==","upper_bound":"amZHRVFXVUpvdmlSNExQVm95dWxyWXZYMVdiNms=","repeats":1},{"count":1475,"lower_bound":"amZyQ2l6enRPb0hTaUg3blk3V0UwNw==","upper_bound":"anpkdm1pd1IwQlVXUjFGbnkzQkNaWHVpZ1Jnd2VRazI5Yld3YkZWbERUNEJOZ0xz","repeats":1},{"count":1483,"lower_bound":"anpuenV0YU1kSDBaMnJlR3Y=","upper_bound":"a0pKTGZuNlE4YnJWNHYxNXRkYQ==","repeats":1},{"count":1491,"lower_bound":"a0pzWnFLRTNsZXhkMU1tdEt4bzV4VURtU3M4dzdQVEpyeWlTcw==","upper_bound":"a1B1NnVvd1lJOXEwYkdzTktOYlFlcDBRSllWeTdocEptUlhFTmE=","repeats":1},{"count":1499,"lower_bound":"a2ROTVlDejVmVkw3aXlwbmE=","upper_bound":"bA==","repeats":2},{"count":1507,"lower_bound":"bDByUmdpZHFZRHRDa2JhZm9nVmI=","upper_bound":"bExZbmlLdlRhSE1wd01mSW5xOXowT3lUV21nbTV2V0dSRzc1V2RTM3VwQ1JDcDMyTVpBTHJaNHFDblBDaTBT","repeats":1},{"count":1515,"lower_bound":"bE40cFlzWWRTVzFSOWlqRk0=","upper_bound":"bFhKaHhCTUJEdmw0NENuN0V4RWR1bVhnUklHV3ZrNE5n","repeats":1},{"count":1523,"lower_bound":"bGRSUHpwVHpvRTNlTURzMFRDQndRMXJJdFAxUzBTTkUxZVVoNlRnR05rZnNqTw==","upper_bound":"bGhZdjFBTDczWnN4TDZHT3Jsbw==","repeats":1},{"count":1531,"lower_bound":"bGhjQUhQNWN6","upper_bound":"bHRuUw==","repeats":1},{"count":1539,"lower_bound":"bHl5OWVnR09lMUxlekp6Vjd5bkVmSlM5OThZOA==","upper_bound":"bUNhWlhNYTE2WkRsakdtdjRhVmpLVmRPR3B3cTU5","repeats":1},{"count":1547,"lower_bound":"bUdtdEc5Yk51a2huczBKdU9Lcmxh","upper_bound":"bVpWeEl3ZnJD","repeats":1},{"count":1555,"lower_bound":"bVpseEdMcUI=","upper_bound":"bWhRRFdjVExJQU5nUmVhaDZDWEprQk8zNlM=","repeats":1},{"count":1563,"lower_bound":"bWlOTUZ4Q3F0OGNFazA2ajNqYURsTA==","upper_bound":"bjBudURBNjJzeHlsRUZZUQ==","repeats":1},{"count":1571,"lower_bound":"bjFuSHZObWtITGFpSEE1NlJoMnJsbFFodDB4eTBsSg==","upper_bound":"bjN0ZzdDQQ==","repeats":1},{"count":1579,"lower_bound":"bjVCVlpKNWtOY3VMS3NuM1d4MU9XdmJUU3pN","upper_bound":"bklnRFFLR2tlMjBPR1ZH","repeats":1},{"count":1587,"lower_bound":"bklzbTFob2g4RDhhY09abjFuNnRSMGxKbk4wT2Q2akVrY0U5NkpvUHN1TE9uUlk=","upper_bound":"blJScGpacFF1TDZ0VERpSVlmczI3S2c5Mm1hVkR0alY=","repeats":1},{"count":1595,"lower_bound":"bmFIQ0RTaGxNQmlmSTQyRElPNGpJeW5OREhmcU5Nc0Y1NERvY0ZpUDNYNGVRVE83cHE1NVRCcQ==","upper_bound":"bnVMdQ==","repeats":1},{"count":1603,"lower_bound":"bnZ2SnpmY1dSWE1MbnZwcEhDMlhMajh6RWtQWHBLSThNSnJvNW1p","upper_bound":"bzlGT05HdDF0c1hLbDlVMHBBNVY2YjNYMkxPdFQxRUptSGFzTlgwUmlR","repeats":1},{"count":1611,"lower_bound":"b0FtUW43WHBwSExkNml4VEhNWEt6QW5kVENnN2pDaQ==","upper_bound":"b05vNVo1SXJPU1B5akhoeTRRbWlYZ3hCc1Y5c2w2Wm5rZE50cEN0eGMzY2E=","repeats":1},{"count":1619,"lower_bound":"b09aVHY0VXpZb2VQN2lEajZXTm1MVkpGa2VNRnl6bE12","upper_bound":"b1RwZ0R3V0JPd2txRVlyMnc5MmYxRlpPNWVFYkJla08wZTU3MGlZdHQ=","repeats":1},{"count":1627,"lower_bound":"b1gxem9USmpJY3NDZzU3QmZRWXpSalZ4NTBzRk9Wd29wVTR5TjBT","upper_bound":"b2VLOVM3bzRFTlZVSDRqTHY3aw==","repeats":1},{"count":1635,"lower_bound":"b2VRZFl0WTdhTkdyekIwdGZwaWdTV3k2RG05VnlOa2Uwb2ZFbWF4M05RSE9zcjJ2ZkRXbWc0","upper_bound":"b2tZU1ppTktjb2pCeHlyV1BySFp2Zjl5cjJLWDNqdUdYd0UzSGNRWHB6bQ==","repeats":1},{"count":1643,"lower_bound":"cDJaMVgxSWFMZEVUb3hFUWFSYkpxeVljekN1NW9mdXpDTXRraVdPZWtheENERTNqOWJUbg==","upper_bound":"cFBicmp5bXA4VG9OMHpmOU1XZXdBb2ZKMk1zU3h0YWM2Q1h0QVRIRW4=","repeats":1},{"count":1651,"lower_bound":"cFFTMU5UUDZvZ2tCYkdRWTFVeWpvdk1DQ0pNa3RLaWY5anQyeFFUMko2OXFKUzE1eUNGUmZ5TQ==","upper_bound":"cGJO","repeats":1},{"count":1659,"lower_bound":"cGphaG90T3V1RWxFQmxhREFuQUpoSTRSUw==","upper_bound":"cG9DelBHZFkwNTA3d0l0OVg2eE5ESUx3VW5WVzVyUTByYm5YOHZkOTlBZnJGT0p6WjJRd3owNzNkcEJMRXdv","repeats":1},{"count":1667,"lower_bound":"cHBqcVBpQ3JNUEtPWWxzcHI=","upper_bound":"cHlScHJuampzZldoclZGcGtHSHozUk01UjdGcmVWQmtHSkV0dXgyZmwyU25mdnpTT2M5Z3R1Zg==","repeats":1},{"count":1675,"lower_bound":"cTFHUWk2ZnFuTWNFeW9NT3E4enN3M055Tk1vS1RwODY3SDlWQk4xbUlMc2pka2ht","upper_bound":"cTdNVllRNW1SWWJmYQ==","repeats":1},{"count":1683,"lower_bound":"cTk=","upper_bound":"cUk3N0M1UzFRY1BrNFpaWER4TGxlQUVDdElTUmQ2VFVjSGhNOU10TFJyQ2IyQjRMUmp3","repeats":1},{"count":1691,"lower_bound":"cU1DT0J0SFU5eExIT1loQkNraHpxWW1BWnJYcmhSUg==","upper_bound":"cWVFdlNsaGEyQmdJaEwwbVMwSm83SFVER2V1ZHdsVElKVGxIQmZxUWt3Y280bGZkRXpoWHBzM3hpcjJEVg==","repeats":1},{"count":1699,"lower_bound":"cWYxWmpqc2pSbUJuRmFsajU4aDJhY2tPdjBKRXhTOVlabUpzQUJZOWFveA==","upper_bound":"cXhOU2ZxYWE0T29nRXY2aG01ZXk2aDR3SEM5bFFIU0J3TmNNT1ZYczlqZ3pKS3pHenlRQjlDNkNqNE1ybg==","repeats":1},{"count":1707,"lower_bound":"cjAwdUtiOXZWUnpJc3pPN0p0QW5XbVNNY3p2RHNzUklzWkdENTJIR1JrYUlHelFTWkV0MHdrcWVaT1I=","upper_bound":"cjZ4VFo=","repeats":1},{"count":1715,"lower_bound":"cjc5QzRKNWZhZ3c5V2JUbGlUNURLNkdk","upper_bound":"cktMeThKUGdQcWJ2VkR6bVlKZWt1Ng==","repeats":1},{"count":1723,"lower_bound":"ck1CQVpHSlBPelpyaUp6clB5YVJodGQ5TktOaGQ5b2ZRVGZCSnY=","upper_bound":"clZC","repeats":1},{"count":1731,"lower_bound":"clh2Uw==","upper_bound":"cmtGZE5rcURhR1VFSQ==","repeats":1},{"count":1739,"lower_bound":"cnZtY2tYTG01dEpRdVY5c0JiRkp4","upper_bound":"czRSY001VmI5VDVNdVhOVWZCblhXQnkxbmRjNXR6YW92SWwzeUNuV21FOUE=","repeats":1},{"count":1747,"lower_bound":"czYzMVpqU2pkQ0E2V29PcUJIaWNhWGhmVjI4Y2JvRWxxVEZLS2VLWGNIcEc2SmtKeGI4SFdpZjkx","upper_bound":"c0U4eUc3MmhxWGFST09qc0lWTGZRdDRFblBkaUFtb3BjekZoalVzVlZteDQyNVNCb0kzSlhSYVlxcVpm","repeats":1},{"count":1755,"lower_bound":"c0hrbDZVd2RoWWMzejJaVGk4Y1ViMUNDSGtLdkJTZW4=","upper_bound":"c1VoTE9QVzU2S0lRTkVGeHJ5eG9udXluOWc5WERQYmxpTVZNZ1IzSQ==","repeats":1},{"count":1763,"lower_bound":"c2syRkg0TE5sU2ZVeGdXdTRtZG0xcDhqM0RoSw==","upper_bound":"c29TWg==","repeats":1},{"count":1771,"lower_bound":"c3BMVWtlalVuMW5lQXJhbzVSdnFEV2lYZ09UZm9ONGFzYzZwWk5lRlRa","upper_bound":"dDRSR3dtOGxDU2RTaUN4ck9oSXZNdndJM3U5NU55SWJOd0dZUnpxbmR1clNaQlk2WDQ5b3ZlMVZTUFpp","repeats":1},{"count":1779,"lower_bound":"dDlFVndrTlc3MHQwTk5zRGFL","upper_bound":"dEVoY1NhYXhvQ1NaU1JJekVuZGNZVWFPWDhVczRteFN1QmZjeGhYejJkb0ZoS2FUa3h2clNRbw==","repeats":1},{"count":1787,"lower_bound":"dEYyekVHcFJQVDJ5ZVpaTHN4WWpPNXN5WWE4M3FNZVVpcUNIYVNrWnAwRFpObjF5czVuTnNRbUY0UHFsU2dscQ==","upper_bound":"dGNPaGE1ODNsRW1FT052bHFUUjBHcWJDMWM4aGV6TlpNZGc5T0VvekJIMlBPNXk5ekNtQzVjQzg=","repeats":1},{"count":1795,"lower_bound":"dGRtUVpxOHN4cE1adlBaajFQeWVpelVCNDVpWg==","upper_bound":"dHlIcGU1d0J6TXpHZ1FMc3lsbEtibUJxbnJSRnk0dEQ0ZEJUcFVsRXJ4Tm9tYw==","repeats":1},{"count":1803,"lower_bound":"dTJlZm5lU1RU","upper_bound":"dUFRbjdySDlZM25tT2xQcEk=","repeats":1},{"count":1811,"lower_bound":"dUF0bXRZSkhHR2xxQ2hGY0FDU2FGRm95Y0s0REhIblg3bGZQOA==","upper_bound":"dVpDcU9aU1FYZlBHU05nckpzNTJCTXNXbVBkaVVDTVNjbE8yTEsxNVZjNDdDVGFQM2dDMjU=","repeats":1},{"count":1819,"lower_bound":"dWROaWQ1SzRPTmZhSnMyRzN4R2lzUWdLcVc0cExRczhGQlZTd1VLWmtJWExDdDdWNUV3","upper_bound":"dWg=","repeats":1},{"count":1827,"lower_bound":"dWhpcldxWVBiNlhSNmlldDg2RDREYk5teHVkdDZrcnpHMVJVanU=","upper_bound":"dXRUTW41UlNQeFVvSngwWjRXVVJXcUdxYlNpYlR3TlVKTGFGMTdsRTVFbmpPY2JiY0VpUVRucGU0MWQ=","repeats":1},{"count":1835,"lower_bound":"dXZ3R21SRGZyeVlZY2I2WTNSYW1QWFVKREtYbEtUZzhpejI3MjJoUXk=","upper_bound":"djN4RXlLSUdERnFITFZuQVBjSklwTHhrNXpk","repeats":1},{"count":1843,"lower_bound":"dkF4UFV5M1NXRXFhYndnSXhzaHdMTmVPcEdIcHk3bFJXZA==","upper_bound":"dktua2dqemlhT01jMkV5cmR5UEQ5eVQ=","repeats":1},{"count":1851,"lower_bound":"dkwzQ1BOamNXREZHYVNOUHZL","upper_bound":"dk5NdlBiaUxORnBuNTQ0SVhTbmN4a1NBajQ=","repeats":1},{"count":1859,"lower_bound":"dlI3ZFg=","upper_bound":"dlR0eHYwQ3ZodGlzZ1BVZ3BPQmhFOHNoU2JoMzhGMExmaXdSS2RTSHRKcQ==","repeats":1},{"count":1867,"lower_bound":"dlYwZHdLbnMyem44R1VOcmJ2dkFmeDlsNHJKWlQ0VW9nMTNhMTlOSg==","upper_bound":"dm5uUEpsa0lpSDd1cmdrdVdVMDdKNlZFWDQzUFd6MmJuTGpZbWR4bzAxOExDMTVJSW5nQ3dabkFPZ3d2ampXaQ==","repeats":1},{"count":1875,"lower_bound":"dnc4ckZjSENuWmdwbkpGc0hhWldVNVZ3Ykl2Zm16VW5UMw==","upper_bound":"dzJ3UDlyMlROWXlLVlFrMUU2V0dTRllvQlJiMg==","repeats":1},{"count":1883,"lower_bound":"dzhBcHRkbzVMUjZJSmxXS3pwWnFINzN5","upper_bound":"d0RiS1l6ZnlodjRtcUk4c1pOZ1JKdWNHSGZuSEoxbEJhZWNPT3NucmkxWFdSQWwycVBaTjk=","repeats":1},{"count":1891,"lower_bound":"d0loNFhHdDhqMjB0ZGtEd3pqbTVlUlR4eVBTbFZ1MzhhbFA3","upper_bound":"d2R1blRqSFJscVJvY1F2RkVBRDJwMkxIa0VxUjBKMzYyeFBaaEFZMGdySldPS05FOXpPNVdiazhPYzJFUzU=","repeats":1},{"count":1899,"lower_bound":"d2dIQjNmakRqWW9RcUsxYWhaOWtZRTlpWmtBN1RqdDZoVFlONEk=","upper_bound":"eDNQREZrbmVtcVdWWW5MNklLWDYycnlicWZTSExWaVBYNEVHZ0tQRTB4Q3dCakJNYXpsaA==","repeats":1},{"count":1907,"lower_bound":"eDVTb3lCQTFydU16bDlaakpyVHVIVTRFVFF5RlhkVlBWeg==","upper_bound":"eE5Oc1hzejlSTjZyOVA0WHhwTw==","repeats":1},{"count":1915,"lower_bound":"eFVmM3JDdnFIWjFpWDh4SA==","upper_bound":"eGg4UGU3ZmhSM3plNkRJTEhBWkdiYlE2c2txZVQwTUlSWHBTOW02R2lZd2hhYXl1RTJ3c24xdGU=","repeats":1},{"count":1923,"lower_bound":"eG04S2MwTlJ4TTZCdkd3eGFQMFB0U2w3ZnZnaFc=","upper_bound":"eHpCbGhnYnV4S21aTzhPdmtCM2V6S0o0THI4WThWNlhJNjlJTktrR1BmN1hHQWxQQjlGNmx4UktY","repeats":1},{"count":1931,"lower_bound":"eHpKNllJWTVKb294S0tjQVFtdW9TMlZjdlFKTExsMXBScG82R3hVZUNR","upper_bound":"eUtHMTVoVlZIOW8zUkFUVHJMVTVBUW5RNWJjOGxlbXlnaUc4Wg==","repeats":1},{"count":1939,"lower_bound":"eVBYOElicVhuM2FLWXMyejhhSzJxem1pbEg=","upper_bound":"eVdxbDN5cmtCN09nZTFQ","repeats":1},{"count":1947,"lower_bound":"eWVtbEc0TGhGVVBuTg==","upper_bound":"eWliS24wYmZLdDRDd0p2a0JlaUxRaG1lOXY0TnlLbHh1SlBuaTBwdjNoVVRSNnJtZGJjeVRzaXZjdm5HYw==","repeats":1},{"count":1955,"lower_bound":"eWtPUnc2Tzc2bHZibmRIZExTUnh1UGk4OUlWa09ycHBvMFpNb3JH","upper_bound":"eXRJSTJxcWw5RWVERzhUNTJIN2dxN0J4ZlYzeDROSmtrVVUzSjBYZlpCdzZoYVM3S3FMdg==","repeats":1},{"count":1963,"lower_bound":"eXVteEZ3NnJZU0J3cWZmN0w1THhFVUNBcEJvUkE2UVFURldtOExJSlhvdEFTR21JekdTU0NuZg==","upper_bound":"eg==","repeats":1},{"count":1971,"lower_bound":"ejJNVlNiaG5FUWU5Mm16dktrTFh6dHYwampoQW1VRlJyeURGT2wy","upper_bound":"ek9iaWJwM0F5VTBzdGpSZXpkdkxuSXp4eGNCa0w1VkM=","repeats":1},{"count":1979,"lower_bound":"elNIQUdNVDBNNHFUbVhLdFpTU1d5UkFwYjhNaUhPR054RnBJR0NibGFlWFF6UEtFNQ==","upper_bound":"emVQR2ljREFFSkhKNmp4b0VmRll1OWRvdk0zeFZJZGVEY1h6R0RpUXNxbVg=","repeats":1},{"count":1987,"lower_bound":"emZKd2JTN3loczJ5b0lHNGdLV3l2clQ=","upper_bound":"emoxNFRBUDVXQm9BOWg5cUNjczFiMjFzaWw0UmpxTzZ3bWZBdEJTS2hHTnFKeFVNbk5YTA==","repeats":1},{"count":1995,"lower_bound":"em9lVDJYVTlYVEJXa2JQTVY1RU9SMmMzTnljVlNSTWN6TFB4clE5THRsOHVKZWFVRlFZYVp6","upper_bound":"enJtRENyYQ==","repeats":1},{"count":1999,"lower_bound":"enhFY3I=","upper_bound":"enpXTXBYVkpXUVd3dThhd3lTQ1lreXRSOERJMnFNMjM3","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3,0,2,1,2,1,1,2,1,0,0,0,0,0,1,3,0,3,0,1,0,2,2,3,3,1,2,2,0,0,0,1,2,1,1,0,1,1,0,1,1,0,2,0,2,1,0,1,0,2,0,0,0,2,3,1,0,0,0,0,0,0,0,2,2,0,2,1,0,0,1,0,3,0,0,1,2,1,0,0,2,1,3,0,0,0,0,0,1,1,0,0,1,0,0,1,2,1,0,1,1,1,1,1,0,0,0,1,1,1,1,2,0,0,0,0,3,3,1,0,1,3,0,1,0,0,0,1,2,1,1,0,0,3,1,1,0,0,0,0,0,0,0,0,1,1,1,0,2,1,1,0,1,3,1,3,0,1,2,0,2,1,0,2,1,3,0,1,1,0,2,1,1,0,0,0,0,2,3,2,1,1,0,0,3,0,2,0,2,1,0,2,1,1,2,0,3,1,2,0,2,1,1,1,1,1,0,1,3,0,0,0,2,0,2,0,1,2,0,3,0,0,0,0,0,0,0,1,4,0,1,2,1,2,0,0,1,2,1,2,1,0,1,0,3,0,2,0,2,0,2,0,0,0,0,1,0,0,2,1,0,1,1,1,0,2,0,1,0,3,2,2,1,0,1,2,1,0,0,0,1,0,0,2,1,0,1,3,2,0,2,1,1,0,1,0,0,0,2,1,0,1,2,1,1,0,2,0,3,2,1,2,2,2,0,2,5,0,0,1,0,1,0,1,3,2,1,0,3,1,0,0,2,0,0,0,0,2,0,1,2,1,2,0,2,1,1,1,1,0,1,0,1,0,2,2,1,0,1,2,1,0,0,0,0,0,1,2,0,1,1,0,1,0,0,1,0,0,1,2,1,1,1,0,3,0,1,2,1,0,1,0,0,2,0,1,2,1,0,0,0,1,3,0,2,0,2,0,0,0,2,3,0,0,1,1,0,0,2,1,1,0,0,2,1,0,1,0,1,0,1,0,1,0,0,1,1,1,0,0,1,0,0,1,0,0,2,1,1,0,0,1,1,0,0,0,0,1,0,1,0,0,1,0,2,4,2,2,0,0,0,0,0,2,0,1,3,1,3,2,1,2,2,0,1,1,1,1,2,0,3,2,1,0,0,1,0,1,0,1,1,1,1,1,1,0,2,1,0,1,0,3,0,4,4,2,0,2,2,1,3,0,0,0,1,0,0,1,1,1,3,0,1,0,0,2,2,2,0,2,1,1,2,0,0,2,0,1,0,1,1,3,1,0,0,3,1,0,3,2,1,0,2,0,3,0,2,1,1,0,1,0,0,2,2,0,0,1,0,2,2,0,2,2,1,0,1,0,0,0,3,0,0,0,1,1,1,1,0,1,3,0,4,2,3,0,1,2,3,2,3,3,1,1,2,1,1,0,1,0,0,2,3,1,2,1,2,3,2,1,2,0,0,2,0,0,3,0,1,1,2,0,0,1,0,0,0,3,1,1,1,1,0,1,1,0,2,0,0,1,0,0,3,1,2,2,0,0,3,1,1,1,1,2,2,1,2,2,1,2,0,0,1,1,0,1,0,1,0,0,1,0,0,5,1,1,0,2,1,0,0,2,1,1,0,0,1,3,2,0,1,0,0,0,3,1,1,0,0,2,0,2,2,0,2,1,1,2,1,1,2,2,2,1,1,4,1,0,3,2,0,1,3,2,0,0,0,0,1,0,0,1,2,1,0,3,2,1,1,1,1,0,3,1,2,0,1,2,1,1,0,0,1,1,1,1,0,2,0,2,3,2,1,1,1,2,1,1,2,1,2,0,3,0,1,3,1,0,0,1,4,0,1,1,0,1,0,1,0,1,4,1,0,2,1,0,0,0,0,3,2,1,0,1,0,0,0,0,1,1,2,0,0,1,0,0,2,2,1,2,1,0,0,0,0,0,3,1,3,3,0,1,1,1,1,1,0,0,0,1,0,2,0,0,1,0,1,1,3,1,1,0,1,0,2,1,1,0,0,1,0,0,3,2,2,0,0,0,0,1,0,0,0,2,2,2,1,1,2,1,1,2,3,1,2,0,1,1,3,0,0,0,3,0,0,2,0,0,1,3,0,1,0,0,0,2,0,0,1,0,0,1,0,0,0,0,0,2,1,2,2,0,0,0,0,1,1,1,0,1,0,2,2,2,0,3,0,2,1,0,1,1,0,2,0,0,2,1,1,0,2,0,2,1,0,1,2,0,3,2,1,3,0,1,3,0,1,1,0,0,2,2,0,1,1,1,2,0,1,1,0,1,0,2,1,0,1,0,0,0,2,1,4,0,1,1,3,0,0,0,0,0,2,1,0,1,3,1,1,3,2,1,2,2,1,1,0,3,2,1,1,1,0,2,2,1,0,0,1,0,1,2,2,1,1,0,1,1,0,0,1,0,0,0,0,0,3,0,2,0,1,2,1,1,2,0,1,0,0,1,0,1,0,1,1,0,0,1,0,1,1,3,1,1,0,0,2,1,1,0,1,1,0,0,0,1,4,1,1,1,1,1,1,1,0,1,0,2,0,1,4,1,1,1,1,1,2,0,0,1,2,1,2,1,2,2,1,1,1,2,3,2,0,0,3,0,0,0,1,1,2,1,0,2,0,1,0,1,0,0,1,1,1,0,2,1,0,0,1,2,1,2,1,1,1,0,1,1,2,0,1,0,0,0,2,2,1,0,1,0,2,0,2,2,1,2,0,0,0,1,0,1,0,3,1,0,1,0,1,3,2,1,1,1,2,1,0,2,0,1,2,2,1,1,1,0,0,0,0,1,0,2,1,0,2,2,2,1,1,3,0,2,1,1,1,0,0,3,1,0,0,0,0,0,0,0,0,2,2,2,0,1,2,0,3,1,1,2,2,1,3,0,1,0,0,0,0,2,3,1,0,0,0,1,2,0,0,0,1,0,0,2,1,1,1,1,4,2,1,1,1,0,1,0,1,1,0,1,1,1,0,4,1,0,0,0,1,0,0,1,1,1,0,1,0,2,0,0,2,0,0,2,0,0,1,0,0,0,0,1,0,1,1,1,0,0,0,1,1,2,1,1,0,1,2,0,1,2,1,2,1,1,1,2,0,2,2,2,2,1,0,0,1,1,0,1,1,3,1,1,0,1,1,0,2,1,0,1,0,1,2,1,1,1,1,1,0,1,1,1,1,0,2,2,0,0,2,2,1,0,1,3,0,1,0,5,0,1,2,0,0,0,3,1,2,1,0,1,2,5,0,3,0,2,1,2,0,2,1,0,0,0,2,0,0,1,1,1,0,1,2,1,1,1,1,0,2,0,0,1,0,0,1,3,2,0,2,0,0,1,1,2,1,0,1,2,3,5,1,1,0,1,1,1,1,1,1,0,0,2,1,1,2,0,0,1,0,1,1,0,1,0,2,0,2,0,0,1,2,0,2,1,2,0,5,3,1,0,3,3,1,0,1,0,2,0,2,0,0,1,0,0,0,1,0,2,1,2,1,1,1,0,0,2,1,0,0,0,1,0,1,2,1,0,1,1,0,2,3,2,0,3,1,2,3,1,1,1,0,0,1,0,1,1,0,0,1,1,2,0,1,0,0,3,2,1,3,0,1,2,1,0,1,3,0,2,0,1,1,1,6,1,3,4,0,1,2,2,1,1,0,4,1,1,2,1,4,1,1,0,2,0,1,1,0,1,0,0,1,3,1,1,0,2,0,0,2,0,3,2,2,1,0,0,2,0,2,3,0,1,1,1,1,1,0,2,0,0,2,0,4,2,0,0,0,0,0,0,0,0,2,0,0,1,0,0,1,1,1,1,2,0,0,2,0,1,0,1,2,1,2,1,0,2,1,0,1,0,1,0,3,1,0,1,3,0,1,0,0,1,2,2,0,1,2,1,1,0,0,1,0,1,0,0,2,1,0,0,2,0,1,0,0,1,0,1,0,1,0,0,2,2,1,2,0,0,1,0,1,0,0,1,1,3,2,0,1,1,1,4,2,0,1,0,0,0,3,5,0,0,2,1,2,1,1,3,0,3,3,1,0,1,0,1,1,1,2,2,2,0,0,1,0,2,1,1,0,0,1,0,0,1,1,1,1,2,1,0,0,0,1,1,2,3,2,0,1,0,2,1,0,0,1,1,1,1,3,2,1,0,0,2,1,1,2,1,1,0,1,2,0,3,0,1,2,2,1,0,1,0,0,2,2,1,1,1,3,0,2,1,0,1,2,0,0,0,0,0,0,1,1,0,2,3,0,1,0,0,2,0,0,1,0,1,2,2,2,2,1,1,0,2,0,2,0,2,2,0,1,1,0,3,2,0,1,1,1,2,1,1,2,1,2,0,4,0,2,1,1,0,1,1,2,1,2,1,0,0,0,1,1,1,1,2,1,1,1,0,2,1,1,0,3,3,2,1,0,2,0,1,0,4,1,0,2,1,0,0,2,1,3,2,0,3,1,4,0,2,3,2,3,2,0,2,0,1,3,1,2,2,0,1,0,0,2,0,1,2,0,0,0,2,0,0,0,1,0,0,0,2,0,1,2,1,3,1,0,0,1,0,1,1,0,3,2,1,0,0,1,0,1,1,0,2,0,2,2,1,0,0,0,4,1,4,0,0,1,0,1,0,1,1,0,1,1,0,0,3]},{"counters":[2,4,0,0,2,1,1,1,1,0,1,1,3,0,2,0,0,2,1,2,0,0,0,1,1,3,1,0,0,1,1,1,0,4,0,2,2,2,0,1,2,1,1,0,3,2,2,0,1,2,2,2,1,0,1,3,0,0,0,0,1,3,0,3,0,0,0,0,1,0,0,0,1,0,3,0,1,0,0,1,1,0,2,1,1,1,1,0,0,0,0,1,4,0,0,1,2,1,1,3,0,0,0,0,1,0,0,0,1,2,1,1,0,1,1,1,1,1,0,4,1,1,2,1,0,0,2,0,1,1,0,0,0,0,1,2,1,1,2,0,3,1,0,1,3,0,3,1,1,0,2,1,0,0,0,1,0,0,0,0,2,1,0,1,0,1,2,0,1,0,1,2,2,0,3,2,0,2,1,1,1,0,0,3,2,2,0,0,1,1,1,0,3,1,1,0,4,1,1,2,0,0,0,1,1,0,1,1,2,1,1,1,2,0,1,1,1,1,0,2,3,1,0,0,1,1,1,1,1,2,2,0,1,1,0,0,1,1,1,1,0,0,0,3,0,1,0,3,0,1,2,3,1,3,3,0,1,1,0,2,0,0,0,1,0,2,3,3,0,1,1,1,2,4,3,0,1,3,0,0,1,1,0,1,1,1,1,1,3,0,1,0,0,1,1,0,0,0,2,2,3,1,2,0,0,0,2,2,1,1,2,0,2,1,3,2,0,0,2,1,0,0,2,1,2,2,0,0,4,2,1,0,0,2,1,1,0,0,0,0,0,0,0,2,1,0,3,1,0,2,0,1,1,0,0,1,1,2,0,3,2,3,0,2,0,1,0,3,0,1,1,1,0,2,0,3,1,1,0,2,1,0,2,1,0,0,3,0,0,1,2,0,2,2,0,0,0,0,0,1,1,0,1,1,3,0,2,0,0,0,2,0,2,3,1,2,1,2,0,0,4,1,3,0,1,5,0,1,0,2,1,1,0,2,2,0,1,1,1,2,2,1,0,1,2,0,1,1,2,0,0,1,0,3,0,2,3,0,1,1,3,0,0,1,0,1,2,2,1,0,1,1,1,0,1,3,1,1,0,1,0,4,1,0,0,2,1,1,1,0,1,0,0,1,0,1,2,2,1,2,0,1,0,0,0,0,1,1,2,0,2,1,0,1,2,2,1,1,1,1,2,0,2,0,2,0,1,0,0,0,1,0,1,0,1,1,0,1,1,0,2,0,1,4,2,1,0,1,3,0,0,1,1,2,1,1,3,1,0,0,0,0,2,0,0,0,1,1,0,1,0,1,1,0,1,1,0,0,0,3,1,1,1,1,0,1,3,1,0,2,0,2,0,1,0,0,0,2,0,2,1,1,2,3,0,1,2,0,1,2,1,4,1,2,0,0,0,1,0,1,1,2,4,1,3,1,3,0,0,2,0,3,0,0,1,0,0,2,3,0,1,3,1,0,2,3,0,2,0,2,1,2,2,1,0,0,0,0,1,2,2,0,0,0,2,1,3,0,3,2,1,0,2,3,0,2,0,1,1,0,1,2,1,2,2,1,1,1,0,2,2,2,0,3,0,1,0,3,0,0,1,2,3,3,3,0,0,1,3,1,0,0,1,1,1,1,1,0,1,1,4,2,0,0,0,0,0,0,5,1,0,0,2,2,1,3,0,2,0,2,0,3,1,2,2,0,1,2,0,1,0,4,0,2,0,0,0,1,1,2,0,0,0,0,0,1,0,0,2,2,1,1,0,2,0,0,0,2,1,0,3,3,0,1,2,1,1,0,2,0,2,2,1,2,1,0,1,1,1,3,2,3,0,2,0,2,2,0,0,0,4,2,1,2,2,0,0,0,0,0,1,0,1,1,2,2,0,0,1,0,2,0,0,0,0,2,0,0,0,2,0,2,0,0,0,2,0,1,0,1,0,2,1,1,1,1,0,0,1,1,1,1,0,0,0,2,2,2,0,1,0,0,0,2,1,0,0,1,1,1,1,2,3,1,2,0,0,0,0,0,1,0,1,1,0,0,1,1,0,1,1,0,1,1,1,0,0,0,1,1,0,1,1,0,2,1,1,1,0,0,2,3,0,1,1,2,2,0,0,1,0,1,1,1,0,2,2,1,0,0,2,0,0,2,1,0,0,2,0,3,1,2,2,1,3,0,2,1,1,1,2,2,2,0,0,0,1,0,3,1,1,1,1,0,1,1,0,0,4,1,5,0,1,0,3,0,0,1,0,1,0,2,0,2,0,1,2,2,1,2,0,3,1,0,2,0,1,2,1,0,1,1,0,1,1,0,1,0,3,0,2,1,1,0,4,0,0,2,1,0,0,2,1,1,1,0,2,2,2,2,0,2,2,1,0,0,0,0,1,2,2,1,0,1,1,3,0,1,0,0,2,0,1,0,2,0,1,2,0,0,1,0,2,2,0,0,2,1,0,1,2,2,0,0,1,1,2,2,1,1,1,0,1,3,1,2,2,1,1,0,2,1,0,0,0,0,1,0,1,0,0,1,2,0,2,2,0,1,1,0,0,4,0,0,0,1,1,1,2,1,2,1,1,1,0,0,1,1,3,1,0,2,0,0,0,1,2,3,2,0,0,0,0,2,0,2,1,1,2,1,0,1,2,3,0,1,1,1,2,4,0,1,0,1,0,2,2,0,2,3,1,0,1,1,0,0,1,0,0,1,0,1,4,2,1,1,0,1,1,2,0,1,1,1,0,0,1,1,1,1,1,2,0,0,0,2,1,2,1,1,1,3,2,2,2,0,2,1,0,0,0,4,0,2,0,1,1,0,1,1,1,1,1,0,3,2,0,1,2,1,0,0,2,1,0,2,0,1,0,2,1,0,0,0,0,0,3,2,2,0,0,1,0,0,0,1,0,0,0,2,1,1,0,1,0,1,1,0,2,0,0,1,1,1,3,1,1,0,2,1,0,0,1,0,5,2,2,1,1,0,0,0,0,1,4,0,0,1,2,1,1,0,2,3,0,1,1,1,0,2,1,1,3,2,1,0,1,1,2,2,1,0,1,1,0,1,0,0,0,1,2,1,3,0,1,2,0,1,1,1,2,1,0,2,2,2,0,1,1,0,1,0,1,2,2,2,0,0,0,1,0,1,1,0,2,2,0,2,0,0,1,1,0,2,1,0,1,0,0,2,4,1,2,1,1,1,2,1,1,1,1,0,0,1,2,0,2,0,0,1,0,0,2,0,1,0,0,1,2,0,2,1,1,0,1,2,1,1,2,1,1,0,0,0,3,0,2,1,1,3,0,2,0,2,1,4,1,1,2,0,3,2,1,0,2,1,0,2,2,1,0,0,1,3,2,2,1,1,0,0,1,2,1,2,2,1,1,0,1,1,1,1,0,1,1,1,0,2,1,0,1,0,0,1,1,0,1,0,1,1,2,0,1,2,1,1,0,1,1,1,1,1,0,1,2,2,0,2,2,1,2,0,2,1,1,2,1,0,1,0,0,4,1,1,1,0,0,0,0,2,0,0,2,1,0,1,0,1,0,1,1,0,0,0,0,1,0,1,0,0,1,1,1,0,2,0,0,0,2,1,2,0,0,1,0,0,1,0,4,1,1,0,0,0,0,1,1,0,3,1,2,1,3,0,0,3,0,1,0,0,1,1,0,0,2,1,2,2,0,0,1,1,1,0,0,1,0,2,0,1,2,2,0,2,1,0,2,1,0,0,0,1,0,0,1,0,1,1,2,2,2,1,0,1,2,1,0,0,0,1,1,1,3,0,0,0,0,1,0,1,0,0,1,2,0,1,0,0,1,0,2,0,2,2,0,2,1,2,1,0,0,1,2,0,1,2,1,0,1,0,0,1,0,1,1,0,2,1,0,1,2,1,0,4,0,1,2,0,1,1,1,0,2,2,1,1,2,0,0,0,2,0,0,2,1,2,3,1,1,1,0,0,0,0,2,0,1,0,1,1,0,0,1,0,1,0,0,1,3,0,1,3,2,1,1,3,1,0,0,0,0,0,0,1,0,3,0,1,0,0,0,0,0,0,1,1,1,1,1,2,0,0,1,0,2,0,0,1,0,0,3,2,3,0,1,1,0,0,0,1,3,0,0,1,2,1,0,0,1,1,1,1,1,2,0,1,0,1,1,4,4,1,0,0,0,3,1,1,0,2,1,1,0,3,1,0,2,1,0,1,4,1,1,2,0,2,1,1,1,2,1,1,2,1,1,0,1,1,1,0,0,2,1,0,1,0,1,2,2,4,1,0,2,0,0,0,0,2,0,0,1,1,0,2,0,3,1,0,1,0,0,0,1,1,2,3,2,3,0,1,0,0,2,0,1,0,1,0,0,2,2,2,1,2,0,2,1,1,1,2,2,2,0,1,0,1,2,0,1,0,1,1,0,2,3,2,1,0,1,1,0,1,0,2,0,1,3,3,1,0,1,2,0,1,3,0,2,0,0,0,2,1,0,2,3,2,0,0,1,0,3,1,0,0,0,1,2,1,0,0,1,2,3,1,1,2,1,0,1,0,1,2,0,0,2,0,1,0,1,1,1,0,1,1,2,1,0,3,0,1,2,2,0,0,0,1,1,1,2,1,1,0,3,2,1,3,1,0,2,1,1,0,1,2,2,2,0,1]},{"counters":[1,0,1,2,0,0,3,2,1,3,2,0,1,2,0,1,1,1,1,0,0,0,0,0,0,1,0,0,1,0,1,1,0,1,1,1,1,0,0,0,0,2,1,1,1,0,3,1,1,0,1,0,1,3,1,2,0,1,0,0,2,2,1,0,0,0,0,1,0,0,1,1,0,0,1,2,0,2,1,0,0,1,1,1,3,0,0,0,1,0,0,0,1,0,2,2,2,1,1,0,1,2,0,1,1,0,0,1,0,0,2,1,1,0,1,3,0,0,0,3,1,1,1,2,1,0,2,3,1,0,1,2,0,2,2,2,0,1,1,1,0,1,0,2,2,0,2,1,1,2,0,1,0,1,0,1,2,0,2,1,0,3,1,1,2,0,1,2,0,1,2,2,3,1,3,1,0,3,0,1,0,1,1,1,0,3,0,1,1,1,3,1,1,0,1,1,1,1,1,3,0,0,3,0,1,1,1,0,2,1,0,1,3,1,0,3,1,2,0,2,1,1,2,0,0,1,1,0,1,0,0,1,0,3,0,2,0,0,0,1,2,1,2,3,0,2,1,0,2,2,1,2,0,0,4,2,1,1,0,0,1,0,0,0,2,0,1,1,1,1,0,1,1,1,4,0,0,0,3,0,1,2,0,1,2,0,1,2,1,1,3,3,2,0,2,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,2,1,2,1,0,1,1,0,1,0,0,0,0,2,2,1,1,2,0,0,1,2,2,2,1,1,0,2,1,2,1,3,0,2,0,1,2,1,0,0,1,1,3,0,0,1,1,0,1,3,1,0,2,1,0,0,0,2,0,2,1,2,1,1,0,0,1,0,2,0,1,3,1,2,0,0,0,2,2,0,1,0,1,4,1,3,0,5,2,1,1,0,0,0,0,2,0,2,0,0,0,1,0,0,2,2,0,1,4,0,5,1,4,0,0,1,0,1,0,3,1,0,3,0,0,0,2,2,1,1,2,0,1,1,0,0,1,1,0,0,0,3,3,2,1,1,1,0,1,2,0,1,1,2,1,0,0,3,1,3,3,0,0,1,0,1,1,0,1,2,1,1,1,2,1,2,0,1,2,0,0,0,0,2,2,2,0,1,1,2,0,0,2,1,1,1,2,1,2,1,1,1,2,1,4,1,2,0,2,0,1,3,2,1,2,2,0,0,2,3,0,0,0,2,1,3,2,3,1,0,0,3,1,1,1,3,1,1,0,0,2,2,2,2,0,1,1,1,1,0,1,0,1,1,0,3,0,1,1,2,0,1,0,0,2,0,0,0,2,1,1,2,1,2,0,2,1,1,1,1,0,4,1,0,1,0,0,0,1,1,2,0,1,1,1,1,1,0,0,1,1,0,0,1,0,1,0,1,2,0,2,1,0,1,2,0,0,0,1,1,0,0,1,2,0,0,0,1,3,0,2,1,1,0,0,1,1,1,2,1,1,1,0,1,1,0,0,1,2,1,1,2,1,1,0,2,2,1,2,1,1,0,2,1,2,1,0,2,1,1,1,1,1,0,2,2,2,1,0,4,0,1,1,0,3,0,1,3,2,1,1,0,0,1,0,1,3,1,0,0,1,0,3,1,0,0,0,1,0,0,2,1,0,0,0,1,0,1,0,3,0,0,0,1,4,0,0,1,0,0,4,1,0,0,1,0,0,0,3,1,1,1,0,4,1,0,1,1,1,1,0,0,1,0,1,0,1,0,3,1,0,2,0,0,4,3,0,0,2,0,3,1,0,1,0,0,1,2,1,0,0,2,1,2,0,2,1,0,1,2,0,3,1,1,0,1,0,1,2,3,1,3,2,1,2,2,1,5,1,0,1,1,1,0,1,2,1,0,0,2,2,1,3,1,0,1,2,1,0,1,0,0,1,0,0,0,0,0,0,1,0,2,1,0,2,0,1,2,1,0,0,0,1,0,2,0,3,1,0,0,0,0,1,1,0,0,1,1,2,2,2,0,1,1,0,1,3,0,1,0,0,1,0,0,2,2,2,0,1,3,4,2,0,1,2,1,0,1,1,0,1,0,1,2,0,5,1,0,0,1,1,2,1,0,0,2,0,1,1,1,0,0,0,1,0,0,1,0,1,1,3,0,1,0,2,1,1,1,1,1,0,1,0,1,1,2,1,0,2,1,1,4,2,0,1,4,3,1,0,0,2,1,0,1,0,0,1,2,0,1,1,0,1,0,1,1,0,0,0,0,0,0,1,0,0,1,1,2,2,0,0,0,1,3,0,3,1,0,2,2,3,0,4,0,1,1,0,1,1,3,0,1,6,0,3,1,1,2,1,4,1,0,2,0,1,0,1,0,0,1,1,1,1,1,3,1,0,3,1,2,1,0,0,1,2,2,0,0,0,0,2,2,1,1,1,0,2,2,0,1,0,2,1,2,2,1,1,0,2,0,0,0,2,4,0,2,2,1,0,1,1,2,1,0,2,1,0,1,1,0,1,1,0,2,0,1,1,3,1,0,0,0,2,1,1,2,2,1,0,1,2,0,1,4,0,1,0,3,0,0,1,1,0,1,1,0,0,1,0,1,3,1,2,0,1,0,1,3,0,0,2,0,1,0,1,2,1,2,1,1,0,2,0,1,1,1,1,0,1,1,1,1,5,1,1,1,0,0,1,0,0,0,0,2,0,0,1,1,2,1,2,1,0,2,2,2,2,1,1,1,0,0,0,0,1,0,1,1,1,0,2,0,2,0,1,1,1,3,2,0,0,0,1,2,0,1,2,1,1,0,0,1,0,1,0,1,1,1,4,1,1,0,1,1,2,0,2,0,2,2,3,1,2,2,0,2,0,2,1,1,1,1,1,1,2,0,0,1,1,0,1,1,1,0,1,2,0,0,0,0,1,1,1,1,1,1,2,1,0,0,0,1,0,3,0,1,1,0,1,1,1,2,0,1,1,2,3,2,2,0,1,0,0,0,1,0,1,1,0,3,0,0,1,2,0,0,1,1,0,0,1,0,0,0,0,1,0,3,1,0,2,1,2,0,1,1,1,1,0,1,1,1,1,3,1,0,0,3,1,1,2,1,1,2,0,1,2,2,2,1,0,1,2,2,0,1,0,1,0,4,1,0,0,1,1,0,2,1,0,2,0,0,1,1,0,3,1,0,1,1,1,0,0,0,0,1,0,3,0,1,3,0,0,1,2,0,0,0,2,0,0,0,0,2,1,2,1,0,0,0,1,1,0,1,1,3,0,1,0,3,0,2,0,2,4,2,2,1,0,1,0,2,1,0,0,2,0,1,0,0,2,0,2,1,0,1,1,1,0,4,1,3,1,3,0,1,3,2,0,0,1,1,1,1,0,0,0,1,0,2,2,2,2,3,0,0,2,2,0,0,0,1,0,0,0,2,0,1,0,0,1,1,3,0,0,3,1,1,4,1,0,0,1,2,0,0,0,1,0,1,0,0,1,2,1,1,1,0,0,2,0,2,1,1,0,2,2,0,1,3,1,2,1,0,1,1,1,1,2,0,0,0,1,0,1,1,0,0,2,0,0,2,0,0,2,0,1,1,0,0,1,0,1,0,3,2,0,1,1,0,0,1,1,1,1,1,0,3,0,2,1,0,0,2,1,1,1,1,1,1,0,1,1,3,0,2,1,3,1,3,0,3,0,2,1,0,1,1,1,0,3,0,2,0,0,2,1,2,1,1,1,0,0,3,0,0,1,0,2,2,0,1,0,0,0,2,0,1,0,0,1,2,2,0,0,2,1,2,0,0,2,1,2,0,0,1,0,0,1,0,0,1,0,1,1,1,2,2,0,1,0,1,1,1,1,2,1,1,1,0,1,2,2,1,1,1,1,2,1,0,1,0,1,1,2,2,1,2,2,1,0,0,1,2,0,0,0,1,0,1,1,0,0,2,1,2,1,1,1,2,0,0,1,1,0,1,1,0,1,0,2,3,0,1,0,0,3,2,0,1,4,2,1,0,1,1,0,0,0,3,2,0,0,2,1,2,0,0,0,0,1,0,1,2,2,3,0,1,2,1,3,2,1,0,1,0,1,1,2,1,0,0,2,5,1,0,1,0,0,1,2,1,0,1,1,1,0,1,0,0,1,2,0,1,0,2,1,2,0,1,2,0,2,0,1,0,1,1,2,2,2,2,4,2,0,0,1,2,1,1,0,1,2,1,0,2,1,1,1,0,1,0,4,0,0,1,2,2,2,0,1,1,1,0,2,2,0,0,2,1,2,2,2,0,2,1,1,1,0,1,0,0,1,1,0,2,0,3,1,0,2,1,0,1,1,1,2,1,3,0,0,2,1,1,2,0,1,1,0,2,1,0,1,2,0,0,1,3,3,1,2,0,3,0,0,2,0,3,1,1,1,0,1,1,1,0,3,1,1,2,1,1,3,3,0,2,0,1,0,0,1,1,1,0,2,0,0,2,3,1,1,0,0,2,1,0,4,1,0,0,2,0,0,1,0,1,2,0,2,1,1,1,1,1,1,2,1,2,1,0,0,1,0,2,1,1,1,0,1,2,1,2,1,1,0,0,0,0,3,1,0,1,2,3,1,1,1,2,1,0,0,0,1,0,1,2,1,0,0,0,2,1,0]},{"counters":[0,0,2,1,1,0,0,3,1,0,2,0,0,0,2,1,1,4,2,2,2,2,1,0,1,0,1,1,0,0,1,3,0,0,0,0,3,2,1,0,0,2,2,1,4,0,1,1,3,2,0,1,0,2,2,0,1,2,0,0,0,1,1,1,2,0,0,1,2,0,1,0,0,3,2,0,0,1,1,1,1,2,2,0,3,0,2,0,0,1,2,0,3,4,2,0,2,0,0,0,0,2,1,2,1,1,0,0,2,1,0,2,2,3,0,1,1,0,2,0,1,1,0,1,0,1,0,3,2,0,1,0,0,2,0,2,2,1,2,0,0,1,1,3,0,2,0,0,0,2,0,2,0,0,2,0,3,0,0,2,0,2,2,0,3,1,2,2,1,2,1,1,1,1,1,0,2,0,1,1,1,0,0,1,0,2,2,0,2,2,0,2,0,1,1,0,2,2,0,1,1,0,0,1,0,0,2,4,0,2,2,2,1,1,3,1,0,4,0,2,0,0,1,0,2,1,1,2,0,1,2,1,0,0,1,1,1,1,1,0,2,0,0,0,1,0,3,2,2,1,1,1,0,1,0,2,0,0,0,0,0,0,3,0,3,0,1,0,0,0,1,1,1,1,2,4,0,1,1,0,2,2,1,2,1,1,2,0,2,2,1,0,0,0,1,1,1,1,2,0,1,2,3,1,2,1,2,1,2,1,1,0,2,0,2,2,1,1,0,3,3,2,3,0,0,0,1,2,1,0,3,2,1,0,0,1,2,1,1,1,2,2,0,1,0,2,0,2,0,0,0,0,0,0,0,0,3,0,0,0,0,0,2,1,1,1,0,1,1,0,0,0,0,1,2,0,2,0,0,2,2,0,0,3,0,0,0,0,0,1,0,0,1,0,4,2,0,4,0,1,1,2,1,0,1,5,0,2,1,0,0,0,0,2,1,2,0,2,0,0,1,2,0,2,2,0,1,2,1,0,0,0,1,1,0,2,1,3,2,1,0,2,0,4,2,1,1,1,0,1,0,1,1,1,1,1,2,1,0,0,2,0,2,1,2,1,0,1,2,0,1,3,4,0,0,0,1,0,1,3,0,0,2,2,3,0,1,1,0,0,2,2,0,0,2,4,1,0,0,1,2,2,2,0,2,0,0,1,0,0,1,1,1,1,0,1,0,2,1,1,0,0,0,1,0,1,0,0,0,1,1,0,2,2,2,3,3,0,0,1,2,0,1,0,4,0,1,0,1,1,0,1,5,0,0,1,1,3,1,2,0,1,1,1,2,0,1,0,2,0,0,3,1,2,2,1,2,1,0,3,1,2,1,2,3,1,0,0,0,1,2,2,1,0,0,0,1,3,1,0,0,3,1,0,0,2,1,1,0,4,0,1,1,2,1,1,1,1,2,0,0,1,1,1,0,2,1,0,0,0,0,3,0,1,0,2,2,1,0,0,2,2,1,1,4,0,0,2,1,2,1,0,1,1,1,1,0,0,0,2,0,3,1,0,2,3,1,1,1,0,0,0,1,1,0,1,0,1,0,2,0,1,1,4,1,0,0,0,1,1,1,0,0,1,0,0,1,1,0,3,1,1,0,0,1,0,0,1,2,0,0,1,0,1,1,2,1,1,2,0,0,1,3,1,0,3,1,3,0,3,0,0,0,0,0,0,2,0,2,2,1,1,0,1,0,2,1,3,0,1,0,1,3,2,0,1,1,1,0,1,2,1,1,1,0,3,3,1,1,1,0,1,0,1,1,1,0,1,0,0,0,1,1,2,2,0,1,2,1,1,0,0,2,2,2,1,1,2,2,0,1,2,2,2,2,0,0,1,0,1,0,0,0,0,1,1,2,0,2,0,1,1,1,1,1,1,1,0,1,1,3,0,2,0,1,2,1,1,1,0,0,2,0,1,2,1,1,1,0,2,0,0,1,2,3,1,2,1,2,0,1,1,1,2,2,0,0,0,1,0,1,1,0,2,1,1,0,1,0,4,1,0,1,0,0,3,1,0,3,2,3,1,0,1,1,1,0,0,0,2,0,0,0,0,1,1,3,1,2,3,1,0,1,1,0,0,0,4,0,0,0,2,1,2,1,4,1,0,1,1,1,2,0,0,0,0,1,0,0,0,2,0,1,1,0,1,3,0,1,0,2,2,0,1,0,0,0,0,1,0,0,1,0,1,0,1,0,0,0,3,1,1,0,3,0,2,1,1,3,0,1,1,2,0,0,1,2,1,0,1,1,1,2,1,0,1,0,1,0,1,0,0,1,0,0,0,1,0,1,2,1,0,2,0,1,2,2,0,1,2,1,0,1,0,3,1,0,0,2,2,1,1,1,2,1,1,2,2,1,1,0,0,1,3,2,2,1,1,2,0,0,2,1,0,2,0,1,0,0,2,0,0,0,0,0,1,1,0,0,1,1,1,1,3,3,2,2,0,0,0,1,1,1,1,1,0,1,0,1,0,1,0,0,3,0,1,1,1,0,0,0,0,0,0,0,2,2,0,1,0,0,0,1,0,1,0,1,0,3,1,0,1,3,1,1,0,1,0,0,1,1,0,0,1,1,1,1,0,2,0,1,0,0,3,1,1,0,0,1,0,0,3,1,0,1,1,1,4,1,3,4,0,2,2,0,0,0,2,0,2,1,2,0,0,1,0,1,1,0,0,0,0,0,1,0,2,2,1,0,0,0,1,1,2,0,1,2,1,0,0,2,0,2,2,2,1,0,2,2,0,0,1,1,0,2,1,1,0,1,2,2,2,2,2,3,0,0,0,2,0,0,0,0,0,4,0,1,1,0,2,0,1,3,0,2,0,1,0,1,1,2,3,3,1,0,0,4,0,1,0,0,2,1,1,2,1,0,2,1,4,0,0,1,1,1,4,1,0,1,1,0,3,3,0,1,0,2,0,0,1,1,0,0,2,1,2,2,1,0,0,0,1,1,0,1,1,3,1,2,2,1,0,1,0,1,0,1,2,1,1,0,0,0,0,0,3,0,3,1,5,0,2,2,0,1,0,2,0,1,1,1,1,3,1,0,1,3,4,1,2,1,0,1,3,0,2,0,2,1,2,1,1,3,1,0,0,2,1,3,1,1,1,1,2,4,2,1,1,0,2,0,1,0,1,2,0,0,0,0,1,1,0,2,0,0,1,2,0,1,1,0,2,0,0,0,0,0,0,1,3,1,0,0,2,0,0,1,3,0,2,1,0,0,0,2,4,2,0,2,2,2,1,1,0,0,0,2,1,2,2,1,0,0,1,2,1,1,3,2,0,0,1,0,0,1,0,0,0,0,0,0,1,2,0,1,0,1,0,1,3,2,0,1,3,0,0,1,0,1,1,1,1,1,1,0,0,2,0,0,0,0,0,0,2,2,0,1,1,0,0,1,0,0,0,0,0,0,1,1,1,1,2,2,1,1,0,1,0,1,2,0,1,0,0,1,1,1,1,5,1,2,1,0,0,0,1,0,1,3,1,1,0,2,0,0,0,0,2,0,1,0,1,2,1,0,0,0,1,1,3,2,2,0,1,1,2,1,1,0,0,0,2,1,0,2,2,0,0,2,1,1,0,2,1,2,0,0,1,0,3,0,0,1,1,1,0,4,0,1,3,1,2,0,0,0,1,0,2,3,1,0,3,3,0,0,2,0,2,2,1,2,0,1,1,0,0,0,1,1,0,0,0,0,1,0,2,0,1,0,1,0,4,3,0,3,1,1,2,1,3,0,2,1,1,1,0,0,5,0,1,0,1,1,1,2,1,1,0,0,1,1,0,1,1,1,1,1,0,0,0,2,1,2,1,1,2,2,1,0,1,1,1,0,2,2,1,1,0,1,4,1,1,1,1,1,0,1,0,0,1,3,1,0,1,0,1,3,1,1,1,2,0,2,0,1,1,0,3,0,1,1,3,1,1,0,1,2,2,1,0,3,1,0,0,1,1,3,0,2,2,2,2,1,1,0,2,1,1,0,1,2,0,0,0,1,2,0,3,0,1,0,0,2,0,1,1,1,1,0,1,1,3,0,0,0,0,0,1,1,0,1,1,0,0,0,2,1,0,2,1,2,1,0,0,2,1,2,3,0,1,0,2,0,0,0,3,1,0,1,0,1,0,1,1,1,0,3,0,0,1,1,1,3,1,1,2,2,0,1,2,1,2,1,1,0,1,0,1,1,0,1,2,0,1,1,0,2,0,0,2,1,0,1,0,0,0,1,0,0,2,2,0,0,1,2,2,1,2,2,2,2,2,5,0,1,3,0,0,0,1,0,0,4,0,2,1,1,1,2,1,4,2,1,1,1,1,0,2,0,0,0,0,1,2,0,1,2,1,1,1,0,0,1,1,2,1,0,0,3,1,2,0,0,1,2,0,1,1,2,4,1,1,2,1,1,1,2,1,2,1,0,1,1,0,3,2,1,0,0,0,3,0,0,1,1,0,1,1,0,1,0,2,1,0,2,0,1,0,2,0,2,1,1,1,1,1,0,1,0,3,0,0,2,2,0,3,1,0,1,1,0,2,1,1,0,1,0,0,1,2,3,0,0,2,0,2,1,0,2,2,2,2,1,1,2,1,1,0,1,3,2,0,1,1,0,1,2,2,0,1,0,0,1,0,3,0,0,1]},{"counters":[0,0,1,1,1,2,1,0,2,0,0,2,2,1,0,3,2,1,0,0,0,1,0,0,1,0,0,2,1,0,3,2,2,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,0,1,1,3,0,1,2,1,0,1,1,1,0,1,0,0,0,0,0,1,1,2,2,0,1,0,1,0,1,1,2,2,1,0,0,0,0,0,0,0,1,1,2,2,1,0,1,2,1,2,0,1,1,2,1,2,2,0,0,2,1,1,0,1,0,0,1,0,3,1,2,0,1,0,1,0,2,1,1,2,2,4,1,2,0,3,2,1,0,0,0,1,1,3,2,0,1,1,0,0,1,1,1,0,1,0,2,2,1,1,0,1,1,0,0,1,2,1,1,1,1,0,1,1,2,2,3,3,0,1,2,0,2,2,0,0,5,0,2,1,0,0,1,0,0,1,0,1,2,4,1,3,0,2,3,2,0,0,0,2,1,2,2,0,1,1,0,0,0,0,1,1,1,4,3,0,2,0,0,1,0,4,2,1,1,0,3,0,0,1,2,1,0,1,0,0,4,0,4,0,0,2,1,0,1,2,1,2,1,1,1,0,0,1,1,0,0,0,2,1,0,0,2,0,1,0,0,0,2,1,1,0,0,2,1,0,0,0,2,0,1,2,0,0,0,1,0,1,4,2,1,0,0,0,1,0,2,1,1,2,0,0,0,2,2,2,0,2,1,0,0,0,2,1,1,3,1,0,0,1,1,1,1,1,1,1,0,0,1,2,0,0,0,1,0,1,1,0,0,0,3,1,1,0,1,0,0,0,1,0,0,2,1,0,3,3,2,2,2,3,2,2,0,0,2,2,0,2,1,3,1,1,2,3,0,3,2,2,2,2,0,1,1,2,0,0,0,0,0,1,2,3,1,2,0,0,0,1,4,0,0,3,4,2,0,1,0,0,1,1,3,0,4,0,1,1,1,3,2,4,1,2,1,3,0,1,0,2,0,1,0,2,0,1,0,2,0,0,1,0,1,1,1,1,2,1,0,2,0,2,3,2,0,0,2,0,0,0,0,0,1,1,0,2,3,0,1,2,1,2,2,2,1,1,2,0,1,0,2,0,0,0,2,2,1,2,1,3,1,1,0,0,0,0,2,0,0,1,0,0,0,1,0,2,1,0,2,1,0,3,0,1,1,1,2,0,0,2,1,1,0,1,3,5,0,0,1,1,0,2,2,0,2,1,2,2,5,0,0,0,2,1,3,1,2,0,2,1,1,0,0,1,0,0,1,1,2,0,0,0,0,0,1,2,0,0,0,0,3,1,2,0,2,0,1,0,0,2,4,0,0,1,2,0,1,0,1,2,0,0,2,2,1,2,2,3,1,0,2,2,1,0,0,0,0,3,0,0,0,0,2,0,1,0,0,1,1,0,0,2,1,1,0,2,0,0,0,3,2,0,2,0,3,1,0,0,0,0,1,1,1,0,1,0,0,2,1,1,1,0,1,2,0,2,2,1,0,0,0,0,0,0,0,1,1,1,0,1,0,0,2,1,0,0,1,1,2,0,1,2,1,0,1,0,0,0,0,1,1,0,2,0,0,1,1,2,2,1,1,1,3,1,1,2,2,1,0,1,3,0,3,1,0,0,0,1,0,0,0,1,1,3,0,2,0,0,1,2,0,1,1,1,1,0,1,3,1,2,2,1,0,1,0,2,1,3,1,1,0,0,1,0,2,1,1,1,0,0,1,1,0,0,3,3,2,2,1,1,1,0,2,0,1,0,1,3,0,3,1,0,1,0,2,2,1,0,0,0,1,1,0,2,1,2,0,1,1,0,1,0,0,0,2,0,3,2,2,0,1,0,1,0,1,1,0,0,1,2,2,2,3,3,3,1,0,3,0,1,1,0,2,1,2,0,1,0,2,0,1,0,1,3,1,0,2,1,0,0,0,0,2,3,0,1,3,0,1,2,1,2,1,0,0,1,1,0,3,1,2,0,0,1,0,1,0,1,0,0,1,1,0,1,1,0,2,1,1,1,3,0,2,1,1,3,2,2,1,2,1,0,0,0,2,0,4,1,2,2,3,1,1,1,2,0,1,1,3,2,1,0,0,0,0,1,1,0,0,0,0,1,0,2,0,0,1,3,0,0,2,2,1,0,1,2,0,2,0,2,1,0,0,0,2,0,1,0,2,2,0,0,1,2,4,1,1,0,1,1,0,0,1,0,3,1,1,2,1,1,0,0,1,1,2,0,3,1,1,0,2,0,0,0,1,0,1,0,1,0,0,0,3,2,1,1,0,1,1,2,1,1,2,2,3,0,1,0,2,2,1,0,0,2,1,1,1,2,0,1,1,3,1,0,0,1,1,1,0,2,1,2,1,0,0,0,1,1,1,0,3,2,1,1,1,0,2,1,0,1,2,2,1,2,0,2,1,2,2,0,0,2,0,1,0,0,2,2,1,0,2,1,2,0,1,1,1,0,1,2,0,1,0,0,0,1,1,1,4,0,1,1,1,3,2,1,0,0,0,2,0,4,0,3,1,0,1,1,1,1,1,1,0,1,0,1,4,1,0,2,1,0,0,0,2,0,1,3,0,0,0,1,3,0,2,2,1,2,3,1,1,0,3,1,0,1,1,0,0,3,2,2,0,1,0,2,0,0,1,3,0,1,0,0,0,0,2,0,1,2,0,1,1,0,0,0,0,2,0,2,2,0,1,0,1,2,1,1,0,1,1,1,2,3,3,1,1,0,1,2,0,3,0,1,0,0,0,1,0,0,1,2,2,1,0,1,1,0,3,1,1,0,2,2,3,1,3,1,0,0,0,0,0,0,1,1,2,0,0,0,1,0,1,1,0,3,0,2,3,2,1,1,2,0,1,0,2,0,1,1,0,0,1,3,1,1,1,1,1,1,0,0,1,3,2,2,2,0,3,3,1,1,3,0,2,0,2,3,2,0,3,0,0,0,1,0,2,0,2,2,0,1,2,1,3,1,1,3,4,0,1,2,3,2,1,0,0,1,1,0,2,1,4,0,0,0,0,2,3,2,2,2,0,0,0,0,0,0,2,1,3,2,1,0,2,1,0,1,2,0,2,0,0,0,1,0,0,1,1,2,1,0,0,1,2,0,1,2,0,1,2,0,3,0,0,0,0,2,2,2,1,0,0,0,1,0,0,4,2,3,0,2,1,2,0,3,2,0,1,1,1,1,0,0,3,1,1,0,0,1,0,0,3,0,0,3,0,0,1,1,0,2,0,1,1,0,2,1,1,1,0,0,0,0,4,1,0,1,1,0,0,0,0,6,0,2,1,0,0,2,1,0,0,0,1,2,0,0,0,2,1,0,0,0,1,0,0,4,1,0,0,1,1,3,1,1,2,2,0,2,1,0,0,0,1,1,0,1,3,0,0,3,0,2,1,0,2,0,1,1,1,0,0,1,1,0,2,1,3,2,0,0,0,1,0,2,0,1,0,4,3,1,0,0,1,0,1,0,1,1,1,3,1,1,0,2,1,0,1,0,2,2,0,2,1,0,0,0,2,2,0,1,0,1,0,1,1,1,1,2,2,1,3,0,0,0,0,1,1,2,1,0,1,0,1,0,6,1,0,0,2,0,0,1,1,1,0,2,0,0,1,1,4,0,0,4,3,0,1,4,1,2,0,0,0,0,2,1,1,0,0,1,1,2,0,0,3,2,1,1,0,0,0,0,1,3,0,0,1,0,1,2,1,0,0,0,0,2,3,2,1,0,1,0,1,2,1,1,0,0,3,0,0,1,1,0,1,1,0,1,1,1,0,0,0,0,0,1,0,0,1,0,1,2,2,2,0,1,0,2,1,1,0,2,3,0,1,1,0,2,3,1,0,0,1,1,4,1,3,3,3,0,1,2,1,1,1,1,1,1,1,2,1,2,1,0,3,0,3,2,1,1,0,1,1,0,4,2,0,0,1,1,0,1,4,4,2,0,2,0,0,0,0,4,0,1,1,2,3,0,0,0,1,0,1,0,1,1,3,0,0,0,0,1,1,0,1,1,1,1,0,0,2,1,2,0,0,2,0,0,0,1,1,0,0,2,3,3,0,0,1,1,1,0,0,1,0,1,1,0,1,1,0,0,0,1,0,1,0,1,0,0,1,0,1,0,0,2,0,2,1,0,0,0,1,1,0,1,0,2,0,0,0,1,2,0,1,1,0,1,1,0,1,0,2,1,3,0,2,0,0,1,2,0,1,0,2,1,1,2,2,0,0,0,1,1,1,2,0,1,3,2,1,0,1,0,1,1,3,0,1,2,2,1,1,1,0,2,2,0,0,1,2,1,2,1,0,2,0,3,1,0,3,0,1,3,0,2,0,0,0,0,5,3,0,0,1,2,1,1,2,0,1,2,0,1,0,1,0,0,2,0,1,1,1,1,0,2,0,2,2,1,0,0,3,1,2,0,0,0,0,0,2,1,0,0,2,0,3,1,2,0,0,1,3,0,2,2,0,1,1,0,1,1,0,0,1,1,0,0,2,1,2,2,1,2,3,1,0,1,0,1,2,0,0,1,0,1,1,4,1,1,2,1,2,0,1,2,0,1,0,2,0,0,1,0,0,1,0,1,0,1,1,1,0,0,1,1,1,2,1,0]}]},"null_count":0,"last_update_version":397952032809680896},"p3":{"histogram":{"ndv":1993,"buckets":[{"count":7,"lower_bound":"MA==","upper_bound":"MER1RA==","repeats":1},{"count":13,"lower_bound":"MEV0T3MwWFVOWVl6M0dVbGdyOFFGUUdZRUs3VWVObEtXR1hlQTdYTXdoMjYwTjVTMVJCUjJSc016TWpiTlo1Sw==","upper_bound":"MEpBcmV3YjQxamJkWTZzcGZMRXh5amdRaFJwUjBrbXBsRVFkSXc=","repeats":1},{"count":19,"lower_bound":"MEs0U0FvQ0VNM1VRcUVDYkZ1ZjJ3cTR3OVZVM1JkSA==","upper_bound":"MFlmcDQxakwxc1RNZUxMcWFKVGRncg==","repeats":1},{"count":25,"lower_bound":"MGFjZEVUd1o1","upper_bound":"MGRVVlBQb2hnc1U4dkpOQ2tqR3dvMmIwb0JwMlFHNG10cUR3R3U=","repeats":1},{"count":31,"lower_bound":"MGVVTTh2SThib2NJSEVpUkhIdmhDdHR6MkxwYWxsckJzOUxQd2FNa1l0Ukd5T3JFWkM=","upper_bound":"MGpYOVE0WjQ1VFFmUkFCcllBOXY3c21Ka1hZNWZZZFk0QnRnQmhrOHUyZHMxbW40a0p0SjFvMEJ4T0Jl","repeats":1},{"count":37,"lower_bound":"MGw2all2eWVM","upper_bound":"MHZUNWdMbzRnQjlvMEZBcXcwcTYzSXkyQkJybGdaY24xQXY=","repeats":1},{"count":43,"lower_bound":"MHlMUUFCMDltRDNqaFY3Vzc5QWpSOQ==","upper_bound":"MTQ2eW9hN1lyZWh6aWxoRnZtNVYydg==","repeats":1},{"count":49,"lower_bound":"MTZsZlJyOFRJMDVNTEdGNnNjYThObFp5UVBiUThUbGpldXVzU1E1amtaU0RqNWVLeWZqMmRYc2t0SGt3Ug==","upper_bound":"MUtSTVQ=","repeats":1},{"count":55,"lower_bound":"MU5GenJlQjI2dWtBa1Y5Qlc2ODBBbTByMkxx","upper_bound":"MWlsYlZpSzlzWmZhM2NCb0xwV1pPQVJBdER2RnFCd25wSm9HYmFXY1hmdGllUzM=","repeats":1},{"count":61,"lower_bound":"MW5LZWhycWhsUEhVMVFUdWtrRnhnWllYMUF1c2ZNYUN6ZE5WY1ZrRHlRZkFXcGNUTEdvb2dhYQ==","upper_bound":"MXgzZFZSTjZx","repeats":1},{"count":67,"lower_bound":"MjRmd05xb3BleGJmdXJxQ21zaVpkNm44ZXd0RWlmRWZYcXpFWnJm","upper_bound":"MklpSVZZSmdNMUJOWG5KMThQ","repeats":1},{"count":73,"lower_bound":"Mk4yS2Q4","upper_bound":"MlFLQTRNSXFtTkY0UWwweUg=","repeats":1},{"count":79,"lower_bound":"MlRsU0pISkpzMUkzZ2J6RUhqSnRk","upper_bound":"MmJZTDVJSlpCeTkzc3o2RjRHUElJNm15THZZNHpUcEN0Vzczc1BIUjZ2djY=","repeats":1},{"count":85,"lower_bound":"MmJZTTMyRVpsTXZYUFdTemd2Mg==","upper_bound":"MmV4SVlUaXJqYml0eXRoeHNOQ2x4N3BjbkQ1S2hKekFvWUdrQ3VXblRWZmJGazYxSkQ=","repeats":1},{"count":91,"lower_bound":"MmhPaHA4ak5zQm02bDBleVJjNnNubmpxUXEzUDdiYUs=","upper_bound":"MmtCemFTYW4zZkV2TGk4aGlXc3Y0S1daWUg4QnZHWVB6OFBMRmxIU1lVRzhnZUtza1FCV2w0V1k=","repeats":1},{"count":97,"lower_bound":"MnBTQU4ySW8yd2psSWtTVFZLN1JaM2xxaUc0cDBCaE1MMzA=","upper_bound":"MzBadWpBZjhZYmVobWh2dUJtR3JONUxBdTdHRVpqdHg0ejZTMzkxZHJ1UmtiTG8=","repeats":1},{"count":103,"lower_bound":"MzdSODFnTGVKV0Fpd01pVkNOZTNiSHBQb0pDTHAyeXl4VlVYU0JvWmJJWHZGa3lDY1ZLMUM4RE41TXE=","upper_bound":"M0xNalBPZ3p3dWxIem8yYnBvbkRVUEFLdXhQcGNWWkc0aWZBcDNJc3cwUnVCTjY2aW9XeFVuYXQ=","repeats":1},{"count":109,"lower_bound":"M01VSHNnUm5ZVXM=","upper_bound":"M2MyMHYwWW5NWWJXTFpyUlVh","repeats":1},{"count":115,"lower_bound":"M2ZaNTJNbHFHcVpQb1dYemtGdHBkdQ==","upper_bound":"NDMxZ0RN","repeats":1},{"count":121,"lower_bound":"NDU5ZUhxNU51MnVvQkxaZ3VKRHM3OU1pcGdTNXhSYjRsYk1idFNoVE9Dc2NvUjF4UW1kd3ExdTdiMnlo","upper_bound":"NENEck95YkliMzJsUFk4eVQ3aTc5dWJRY0g=","repeats":1},{"count":127,"lower_bound":"NEd6","upper_bound":"NEl4VGNkclVMcA==","repeats":1},{"count":133,"lower_bound":"NEs2RmpwTG96WXQ4QlRjRHZmdTZYVklN","upper_bound":"NFJiTUJpbDNBaDRCS0xRbmhUZzNJS1UwYk5yRDRGYmk=","repeats":1},{"count":139,"lower_bound":"NFdmbHV4bHY1SkxRb3RYSGRzMEtRUlZjTkpFYWk4Nllvemk4T2tDTjhiT0I2ZUtKMVRWMA==","upper_bound":"NG9NYTFER3FMUDh3NXowdjhhd3BtSG5EOGVmbXAzOGN0ZnNm","repeats":1},{"count":145,"lower_bound":"NG9aRzBrd0pucg==","upper_bound":"NHJwN1ZMNmM=","repeats":1},{"count":151,"lower_bound":"NHRJRmpDTzJUNllpT2hWbkxUTFc=","upper_bound":"NHhqMjRkRU94eTJCa2ViMlZMOWx3VA==","repeats":1},{"count":157,"lower_bound":"NQ==","upper_bound":"NTNIOVZ4","repeats":1},{"count":163,"lower_bound":"NUJUU0tBa0VmY0J6a25JNHdrZHFXZ0w2c0lESUpuUWgxWlJpQ1VnOTdHREQ0YVNKSGxr","upper_bound":"NUtVNWZneHB1dUpUZEJBeHVSVzBseGI2QzY=","repeats":1},{"count":169,"lower_bound":"NU5TZXRLSEk3Z0doc3NqNUF0Y0lpVzlLSlV6QVFk","upper_bound":"NWJqUzFOaFROMGpuS0xvSWV5YXQ0a1NVUUhnbzRmVkFPdg==","repeats":1},{"count":175,"lower_bound":"NWZSb3k3ZDZSNHh6SUI5ZDJSWjFDdmx1enR1c25wcXhVdlBQU05Q","upper_bound":"NXZWbDNmc0FvcnlIV2dyNFlyeko3RXE3MlZJb3FSVG1YU1JBWTZBVGRlQWtEb3VsdE5yWGdaVDB2bmk=","repeats":1},{"count":181,"lower_bound":"Ng==","upper_bound":"NjhVS3cxMmhpdVFQcDBoajZiZmFieTdSY3k0WVUyZ1BaRUp3QWZoa2VKbzNNcjN6Tjdl","repeats":1},{"count":187,"lower_bound":"NjhvTFNiWVhVR2VndmtnZ0dwWURDd1hic2Rjb1BM","upper_bound":"NkNwbU52TExuYjQ3bFpwV3U5VHVxbGc3UDNWQVNUcWNCRXJCRkFKWlQ5ZFI=","repeats":1},{"count":193,"lower_bound":"NkdUWUQ0eXY0bFNuaHlseW5xcjBLcnpMaWZKQVZTWTNIZUxDTzNRbEt6eVBrRzdONlh4NmdhQUozVGk2RmNq","upper_bound":"NlZPNTREeHZaMmVndThtWDFRTjExWnI0OQ==","repeats":1},{"count":199,"lower_bound":"NlhV","upper_bound":"NmVpRzRnUGI3WHpVY0dyZU9MT2xENWlZVUU2S3kySGhhRGM=","repeats":1},{"count":205,"lower_bound":"Nmd5UFlXWXd3cXNHNEdMSkpxa0lCUGlubEU1SHJHOXV5ekU0b0c0","upper_bound":"Nm1KUDd1MkhoRlRMM0xWMVVtZFFrT2c1bUwwS1BMd0pzYkM4MA==","repeats":1},{"count":211,"lower_bound":"NnFNSUVRZ09NQXlvS0ZwRXFn","upper_bound":"N0Fva1VMcUhXU1ZHeGdRNFFEVHFWUUZpWWE4QzRiVDd3Rm1yWllZYTVZZFNYTEhXeHIxR3dsSlJMZnp1","repeats":1},{"count":217,"lower_bound":"N0ZUMWJZTDRkTDg5TEhsT0NlcWdwZlVKVXFwWjc0VHQ0RTZsaE5BUkRKUDhrTlUxY0V4S2I3SEVadENCZ3lL","upper_bound":"N0t3OWxMYktZcDV3MEFqbkk=","repeats":1},{"count":223,"lower_bound":"N05VYXB2cHli","upper_bound":"N2FETHJGVlI1Y3k0ekVIN3kwSWxoNm0wcElPVFp2cm5yeXZHcnFXZ1c2YjJZRzhsbFBIbGx6R1hFRDI2VDdk","repeats":1},{"count":229,"lower_bound":"N2NNTFFPZklRUjhQUTVPTnY5aHlldjVzdklVNlBuWjJ0bVhPZDNHQ25rbjdPYnNv","upper_bound":"N21ZVTA1WG96Y2txMWEwVHljRU9PS29l","repeats":1},{"count":235,"lower_bound":"N3JGQzhqQjlBSEdydmJpSXBZQUVXTE9rVHV5YlVZN1RoREQzT2V5VFloQ25IMzFRZUUzWFY=","upper_bound":"N3dwVjZwTlRLZHA0WUpxNUJvNktJcDFCSGZ3VA==","repeats":1},{"count":241,"lower_bound":"OA==","upper_bound":"ODdRR1ZkR2I3c0Q4M2h2NlN1M285cnlib3pUOVJ5NVVVYnJmeUV3YVlmMHpiSjRzZlFWRElqbm8zeVI=","repeats":1},{"count":247,"lower_bound":"OEQybzZ6SURIWWVtaw==","upper_bound":"OE9HUThuZXhYQ2I5eDNQZ2lrVFBT","repeats":1},{"count":253,"lower_bound":"OFU4ZlBGaEE2SFpFa2ZGVmdobG5DeFhyaQ==","upper_bound":"OFdZY0kyc2o5TVdNRU91ZTA=","repeats":1},{"count":259,"lower_bound":"OFlaSEhwYk1n","upper_bound":"OGUzYk9E","repeats":1},{"count":265,"lower_bound":"OGV2UUIxbmNJZG45M1ZMYU9nVzdiQjBtamlHWXo5a0VMcTNnUTJ6TEl1V3d0","upper_bound":"OGZQTlZtNkJRTDNvTVJXQWFWcUlnckh2eg==","repeats":1},{"count":271,"lower_bound":"OGhOZ016","upper_bound":"OG96M00xdjA1eEtEdHY0TDlmWk9PcDc=","repeats":1},{"count":277,"lower_bound":"OHBUcDJ5dGZib0xzMVNSQUZJejRWaURLRU5DYTM3bHJiU1ZSSXdWRllCVG1zUGUzNk8w","upper_bound":"OHhUbEdEbzhQOG5HM2R4ZWxlNmx2ZGNmQk56T0lBdmNHdEo3OHJGWm5P","repeats":1},{"count":283,"lower_bound":"OTFIUXQyWlNkdmxvNndJeEo1djRDUg==","upper_bound":"OTlpS0RLR3RLVE5SVTd2YmJ3cWw2UDZjT1ZQ","repeats":1},{"count":289,"lower_bound":"OUowMm1zQjBDbjdVVkk4UEhk","upper_bound":"OU94NDk1VlFsa2VjNGJUVllZZWxKemJ0ek00VUNLaHJWVHNmUldRMUVRMGNpOUM=","repeats":1},{"count":295,"lower_bound":"OVNUMFBWZjRpVUJEWnFKV2NYSWNzc1ZPYWxOS2ZWUXVsQWFXbkZPQw==","upper_bound":"OVhEU0FnTUdJUTFWSWV2RHJobWRtTkZhNEQ=","repeats":1},{"count":301,"lower_bound":"OWdoMkwxMGh5VzZJeVYyeHA3Nk9WVnJVSFVVWkxWb3d4RG5mTW9DUVUwQW1xc0RNVVJKVVU=","upper_bound":"OWhyM1J1SjJqSjgxS2FNWDNOajFYQ3pHT2lpVHFwTGRvcm1Jam9SOGk=","repeats":1},{"count":307,"lower_bound":"OWh2R1pEdUpHa0tMMWZVSTlUVEt3YmhBUjBvamwyT3hSV0w0ZDZtVDNDTVBXYVpWanBS","upper_bound":"OW1wWTI1QmI5Z1c5OXdJNHltWHJObmpHbDRCeHR5aTk5U01HRmplT3VOeWluQ2cwaE9jQg==","repeats":1},{"count":313,"lower_bound":"OXh1VldRcjFqS3VReThzU1NjY0NUcUF6NmdrMDRsbXhDeXNCUXlNdDR1VW5ObHV2d20xbUZrcUc4Qm1vNg==","upper_bound":"QUFMUHl2ZW5OTmVYQnNIZzB1YVNpQ3VZa3A5QzdXSlBuVERMenVBZlhCczNv","repeats":1},{"count":319,"lower_bound":"QURreFVNT0pt","upper_bound":"QVVFcklyWG5sV2RzUERCYUJTcXVYYXI5UjNBSXFRaA==","repeats":1},{"count":325,"lower_bound":"QVZwaVJSb2xaQ1dmNU9JTDRqYUhBTUtKWnVDWllqZUp5MFhjcFVKZWEyVlJ3cXpJaHIz","upper_bound":"QWd6bHN0WXN6TE1WT1VzWktkTGtyb1FOQTZXcjVvN0l0WVZHbGF4cEdHSjdNeG1hdDUxQWdM","repeats":1},{"count":331,"lower_bound":"QWlZaGNhVFhMSHY0U1RHcFRJTnAycldXZGVZb2dUVDZIQ2REZzE3YVJsT0Njb3BOOGZrd0hKZkRVWEw5","upper_bound":"QXJFTFJEd0NpRFZLSHhzSGNFT2k=","repeats":1},{"count":337,"lower_bound":"QXJrdFNjMEtsQWx6djUycHM5TDFUaFpud3NUOTJ6eWJGMDdSRQ==","upper_bound":"Qjh5OEZId1NZbVg2ZFVROUpLeVZEdVE=","repeats":1},{"count":343,"lower_bound":"QkhtRFp5NEdtTDBaM0xMdGxKWjBlbEdtOXU1amJHZnp1aFNTNzBFZzJsVkhxazhnWnU5TkI=","upper_bound":"QlZGNXFkQmRrMEdJbUF1Z09uQUJyekVWdXRBbFlGbWhIVzQwTEtXcEZrWg==","repeats":1},{"count":349,"lower_bound":"QlhDNXJLWXEyM2tmbXhsR09IQ21Wb0JDREl4cTFOQTJISDdzMGg1MVF2ekl6dlVxM1BiVTFqZVlZWm9HSVdHUw==","upper_bound":"QmZ6Nks5MlhuTUtvN1pFYmQx","repeats":1},{"count":355,"lower_bound":"QmhDU3ZlamVVbUxDcjlGZHVweWFxY09lSE81aVozUE92REJsZA==","upper_bound":"Qmk3RVN0cjdFUktvNUZmMjVsRkMzTUtLS2pwM3dvNWpGOGFZTEpMRlUxa2cwVW4yQjQ=","repeats":1},{"count":361,"lower_bound":"QnNYVzJReEdhd2VnbUU4bGJGTmN2ckUyc1FIYjJ5RWV5OU9QUGJhNUZpTnFRcE13T3dtSEdWYw==","upper_bound":"QnpyUm5yOXU3d0NJdER0WlQ3b2I0TXRCaExUaGpPV3BNVndoSDQzMHFJM0tV","repeats":1},{"count":367,"lower_bound":"QzdtMTBuaEdMZU9RUUg3bTI4cTE4WnpDb2NaSGtRTVRqUmdtbzc=","upper_bound":"QzhNdXdLUXVabXE5SG9GeDNremFvZ3ZFT0VCdDdQQ3VQa1d6UA==","repeats":1},{"count":373,"lower_bound":"QzkwRXFCMFJldDVIZTY0dnVaN2pDaWlZa2ZnbVlncmNsZw==","upper_bound":"Q0VGNkNCN3NNdEJpYldXeFRlVGxuQ2FIQlltdTRHalFUZm9wU3hBd2l6MW5EMG1mNHFjNzcwOWRPZUc=","repeats":1},{"count":379,"lower_bound":"Q01VYWQ3V1lCYnh2Ym9hYmhzMzk=","upper_bound":"Q2NveWNVMkRTczFNeUtWYUxyZDl0RXM=","repeats":1},{"count":387,"lower_bound":"Q2dZV2N5dVVRSXR6cFlqVGZQbG9QTElmZ2dIT01JbWRCOFo5ZXk3c01sN1hyWE8xcHVj","upper_bound":"Q3UzQThLbGJPWk84d0FSOFJzTE9GSUQ1VXhjSVNnREF2dXRnWA==","repeats":1},{"count":395,"lower_bound":"Q3V3b1ROTXpVSlZxdTBCWWVQcE5MVXI1aGpIT2h4N2U5UmNxUk5YV0dJOWFkNjlnUWRPd0lZUFZjQjVqZkc5","upper_bound":"RDFqdUExY2dXdXVmTzZnMGFUMnFDMVFmREtROEdyc0w=","repeats":1},{"count":403,"lower_bound":"REJuY3pmNVVOSGk2TjFFVGQwN0tIbTBKZWRxMFpEdGI4bFU0d0h2UA==","upper_bound":"REpnQUI1b1dWVnVNNWNSZ09zVnFEcEJUdlk2ZG9JYjZRdVZxcVBCbENlNTdEVEVGd3haV3lzb0hZUw==","repeats":1},{"count":411,"lower_bound":"REtkdVh4SmJwYVpKOFhmSDAxSnVLcUtWUW51MTFVRFA=","upper_bound":"RFJHOWF3N1JjbUpNRlRud204RE4yeDRLZmZPMzMzcVE2a1dpc0FYUmNWMUlIRlB6R0l2WXF1ZndhSm90bmVOcw==","repeats":1},{"count":419,"lower_bound":"RFVU","upper_bound":"RGlEV3lBRA==","repeats":1},{"count":427,"lower_bound":"RGpBdTFNdTF1eEhpVkxVU1kyd3dQcDYxRXRQWnpNc1hjcTQ3emhvYkxKVm5UZ2szanJIY3VaVA==","upper_bound":"RHhPUDlaNEgzbVlTVTdsUHJQVDRIS0FLckpDQWJYeDliUg==","repeats":1},{"count":435,"lower_bound":"RHlNNHhtM2QwVWJGSHV5R0dZdnFE","upper_bound":"RUs=","repeats":1},{"count":443,"lower_bound":"RUxPQ0dHcEluVm9YSmxmQ2NFOEhRNzF0VFFkQWpQTDVnempGdjdENUZN","upper_bound":"RVlSR0d2dzlyQjA4dU9nUjc3","repeats":1},{"count":451,"lower_bound":"RVluTlFrZWlpNGhZTVN4aHpnbUFUY0k5bEpFZ29vbXJGVnlZOHBMbTJDWlZIek1ibDNQb290","upper_bound":"RWRad0R5TUd1Y09PbnQxUFNQMlc4MkhSRjNpSXJjTW5XeQ==","repeats":1},{"count":459,"lower_bound":"RW9GNkFjUmM2YldLRnBWVVl3TUhNeHU0UEg0QVVNdmlaV0wzMXE=","upper_bound":"RkYwTzBjZ3ZtYUtON3M4SU0wOTNHVFFndnVrWElBTUlj","repeats":1},{"count":467,"lower_bound":"Rkk5QmZveUJBbktnWTlmVjlLZg==","upper_bound":"RlBtT1BlUUk2SExMTUJtY1ZPN0h0RlJJZkg3ZGQ1","repeats":1},{"count":475,"lower_bound":"RlFmME44TEVpV2VtYTlaNHNKUGVzZ0VKQlVZTUJlNHo3eg==","upper_bound":"RmdlNDR2U3E4eFRBZjh0UEY5NGdQUlRsWHBDZGw0Zkw5MHk3cEgzQjBqQzVXU1V1djcyQmFk","repeats":1},{"count":483,"lower_bound":"RmtJcW5zVEQ0QWdmeDVKNEprdXpyYmtiTHBLaGVXdkRm","upper_bound":"RnEwUzdadnppUnY0TFRBSkFGWnRPWTM4WFZzUTJTdlEwMTBUNVlETEg=","repeats":1},{"count":491,"lower_bound":"RnQ1cktzcExBZmJzblFnWHZXcWlaVDk1TTZjZFdJVElmdUhnVw==","upper_bound":"R0VZT2NHdko5am5zNHhHVnBiWFlpNzM0QjA1RTI4TG1lTjdKV1V0ZWFqV2JMdDZMbDQ=","repeats":1},{"count":499,"lower_bound":"R0ZNemV3c1JTdjczNWJkRTRZWThNV2poSnNFZ3V3SFZZanNJS1hDblhvRUdH","upper_bound":"R1NVT3A0cTBwMGRTRzdFWWpvdzVWOG9DemVoVzRqRVJneFd5b2E=","repeats":1},{"count":507,"lower_bound":"R1VQ","upper_bound":"R2FPb0Rjb3gwODY1U3NETkNWWThzcTZHd3RsRXROa1Q2","repeats":1},{"count":515,"lower_bound":"R2V5am5CbGFrcm5ydDlwMnpVdW9oSndmSDNSM2tsUg==","upper_bound":"R3J1ZGxCWEJESXRBTlBWNWxJQWZBazNxWnJSTzlSdUNZOGVw","repeats":1},{"count":523,"lower_bound":"R3N4WllhWnNrUFpSSDUzUw==","upper_bound":"SDJYdE5GSEJ5T0N3WQ==","repeats":1},{"count":531,"lower_bound":"SDRka3VSTzR4THluRUtqNFlqUFRJOE80bDhZZXc1MnlsQ2lPYg==","upper_bound":"SExWSzBMNWx6S1g3bjNwRTFKR1BTN3J5","repeats":1},{"count":539,"lower_bound":"SE1KaDJaaUNtU3lBSEM4TmlIV0NCeXA5d2J5dlBHMzNwYzE1OFo=","upper_bound":"SFpMRlFqS3ROaEFCQkpGYnAxRHNLbFcwVVRxemQ1SVZNYWpxbUxiNw==","repeats":1},{"count":547,"lower_bound":"SGFzTUFoZEpYcGpjcFFDc3U3SW5FSTladDlrZEt1cWcwV2ZLeVBPVWlGWE9TVXNpd241ZQ==","upper_bound":"SGZ6TnR5dUl5VWZ5Tm10aWF6b21IVXpBUm9jNzZMNkdlQjZHN3U=","repeats":1},{"count":555,"lower_bound":"SGtlQWdDcnFHM3c0UXBFQmlneGE0RFZEdQ==","upper_bound":"SG5CSUYzYURibGFhSGU0cWFNSHFDTndtNE9hdmtkRzl0TllOcWNkbmZFeUw5dWs=","repeats":1},{"count":563,"lower_bound":"SG51Nmg1M3duV1FwTHlqYWxnZ0JuMDljOEU4eHZhVVowS1dhV0lwbWxYeG9Va1NaTDZ4d0Q3MHpZWlNkYUNmbw==","upper_bound":"SHp4N2prZ1I4c2tVaDRLWG1idDBmOG5SMlY3MERzY1BvdzA=","repeats":1},{"count":571,"lower_bound":"STdPcER6dG9OYmlP","upper_bound":"SUo=","repeats":1},{"count":579,"lower_bound":"SUtpTlhnMTJucjYyMTRaWWdvT2ZJYTdORERkYmtrY1pzRFFyNGhCczVzcmJHdTIzeQ==","upper_bound":"SVJldTZneDNTbnFMVTJQS0ZocGdkTnNtNWlZdkgz","repeats":1},{"count":587,"lower_bound":"SVRKNm1XNUZGYTVqY3IxM0xJSmRoNE1nZkh3RUR5RUZVcUFnUjA0OTh0UjRxUmdtYmlsZlo3","upper_bound":"SWROdnNFMEFINk8=","repeats":1},{"count":595,"lower_bound":"SWZvODkyNnZYeFhOVU12SA==","upper_bound":"SjNhQVFD","repeats":1},{"count":603,"lower_bound":"SjNkeVEzY2lucHlMWWdzbER2MmR3SjZXb2VFN3I0YkpMTFozelRWRE5RRW9LRQ==","upper_bound":"SjhweEpmS1JEOEI0TmRX","repeats":1},{"count":611,"lower_bound":"SjlWVm1MSG9EWlNoWGNUdWg1enY4Q1RFaHh6Q0QzelpVamQ=","upper_bound":"Skw4QkNlcHFBeWU4b1VOdkxtUjg0dE5qQkdVOUtSQzdwYTZLUktTRG9XdTBkeGZ0Yw==","repeats":1},{"count":619,"lower_bound":"SlBBSUFWV054UEFLdWdWTzhZdzF5Q0JPYzU=","upper_bound":"SlhLOUc2MjVMeUVlWmxwaWs1Vjk3RXJ5SWk2TTJZOU9vd01FR3lvQw==","repeats":1},{"count":627,"lower_bound":"Slh6dzBCbExld2s=","upper_bound":"Sm1mYTNPcTUyemJtV0xyMEpXcGQ4NUhiUWt3ZGtHeW9IaDZVUElCOFJVcEtscFp6Z2JzazlQYzExMnl1T3FwQw==","repeats":1},{"count":635,"lower_bound":"SzEwMFR2WjRWdWdNd2hxNG10aTE5bFl4cm5VREtsWWtMOVM=","upper_bound":"SzIwSkNXUzdQajluWjRlSVlXb1M=","repeats":1},{"count":643,"lower_bound":"Szk1aE8=","upper_bound":"S1hkbmdBVnUweFZHMw==","repeats":1},{"count":651,"lower_bound":"S2QwdDdWSjlmWmEyRzRKV1ZCZlc2am9iUjh1ZThObEZVeWdXMGdONkpwNVIxRzJleEJ1QjVYTlpsRzRSRkE=","upper_bound":"S3BSNUpr","repeats":1},{"count":659,"lower_bound":"S3NOQUVoeDcxY2Z0UTV4ckY0R1o5","upper_bound":"TDAyV0tKYnoy","repeats":1},{"count":667,"lower_bound":"TDBkdGJFcFFTY0ZuTnFBZ2xTR1NxMUJmbm9ETzFZMEtsWU95bm9qRDc0a1RnbGswZVNwUw==","upper_bound":"TDlYUnRrOUdpQWgxM0Nv","repeats":1},{"count":675,"lower_bound":"TEI=","upper_bound":"TElIN2M=","repeats":1},{"count":683,"lower_bound":"TFVzSnlCTUMxUXZaUHJQc3dpam5vTkNpZUIzM2tKcnU1eUFYQ0E=","upper_bound":"TGdQMnI4d3BqZGo=","repeats":1},{"count":691,"lower_bound":"TGpqaFd6TEcweUtaUGltd3JITTg=","upper_bound":"THQ5NEpjR1RvWk1lT0VGeklzSTZPVGZp","repeats":1},{"count":699,"lower_bound":"THhUQmlTUnJRQUFoQzJoU2FqQzI=","upper_bound":"TTEyaW0=","repeats":1},{"count":707,"lower_bound":"TTFTVw==","upper_bound":"TTdONFF5aXhxMlJYQ2VqQk5TUmI4d3lLQjFBangyRg==","repeats":1},{"count":715,"lower_bound":"TURhZXdOU21tb3lCN2gxWjhzc2w=","upper_bound":"TU41MTRLaVk5Sk82Vkl2SDJOaEg4VGVYOE1vbjRhQmN0ZkRINHhjYTdoc3lJVE5uTGtEUHhNeTN6a3kxb08=","repeats":1},{"count":723,"lower_bound":"TVBpUVdOUkY=","upper_bound":"TWVMbUJzdjRhQTFyWA==","repeats":1},{"count":731,"lower_bound":"TWVuWDc1dGdFbzY=","upper_bound":"TWtIRkw3bG12VHRSWTVy","repeats":1},{"count":739,"lower_bound":"TWtOV1o1YUd5YmtQZnVvZmVXR0huaFQyMTlXdWQyUVJUd0VNN05YclNXdHZLTnMwZ0o=","upper_bound":"TW9wNm0xUmp6dnZRcTNZMEs2QVZHWlVlTGd2NmE5YzM2SFFrREJhaGVqOEt5bk5tYTh1NVZzREpJenhRYmc=","repeats":1},{"count":747,"lower_bound":"TXFjYVdPMXdPUjZhMGhSajA2QnBFQmpuN2JzelE1T3hGUU1CQg==","upper_bound":"TjZoa2hEbmdoVnJldEU4bGJvbnQyWUNRZQ==","repeats":1},{"count":755,"lower_bound":"TjZudTNq","upper_bound":"TkpSNVJYVUxCT3hVUmZ6VnhxQzFBT0NVYlo5UVdtcW9UeEE2ZVE3dkxEMGJkSkw4TzZ4","repeats":1},{"count":763,"lower_bound":"Tk5NR2d5cnZpT2padlFJblBCSWJySmpOSjZJWFdYRXQ=","upper_bound":"TlljR1hYbnFQY0l2NDUxa2cyMjY2a1VHN0RWeFAxWg==","repeats":1},{"count":771,"lower_bound":"TmNlRFMzSGtXdVB1V042eg==","upper_bound":"TmVhUXVTQmlOa0lzbThDclgzOHdoQUxyTzBQVk9vOE5XSDVlbUZDWWUw","repeats":1},{"count":779,"lower_bound":"Tm5UWWh6YU5VVDg4bmRIY2dHSm9BYzFpOEU0dEdOb3JUengxVUZtNDQyaFZMdld6b3BBajE=","upper_bound":"TzZrMEtIdFhtVDZNVnBJYkt5bkdOVHJoV3VIbjhNczdlSDJwRDlXMTh6R0hWRTFWa1ZVdDh0RTYxZ1VCS3BqNg==","repeats":1},{"count":787,"lower_bound":"TzZ1ZEQyZTNYODVtU2hYSVRUN0xxSEVrNENnOUZJMjhyNmNLSw==","upper_bound":"T0ZReDY3ajdubVIwOUdXbTdtOFphRlc3VmVjQzdVSXc3NQ==","repeats":1},{"count":795,"lower_bound":"T0o0TVBlMXZYamZDOU9HTGlQVHRjSWxRbXA0aGk4ZUdpanhzN0FtWWRTazB6ejZr","upper_bound":"T1VUQnpkdVBzRXlXa0xyQ3pBUW9qcUcxQTVpSDlsQk8x","repeats":1},{"count":803,"lower_bound":"T2MzN2NUMWw4c3JpMm5Rc1VYcnp6Q1ZsWFpEc3FBN1ZFb0M4OVF4YnhSa0NPRA==","upper_bound":"T3ltekx4WGNJWjV0Tmc=","repeats":1},{"count":811,"lower_bound":"UA==","upper_bound":"UE10Q0tIaHZQaFVJYUljenhEOHJJQlRPVA==","repeats":1},{"count":819,"lower_bound":"UE5EZmVzOXJEVG5sajlLVk1BSg==","upper_bound":"UFhUR3VQdjUyWTd0Q0FUR1lYc2FqZVE0dE9uTkRVYjQwaENFbVVX","repeats":1},{"count":827,"lower_bound":"UFlVYWdOSG1uelBPTzkyemZNU2ZIOFVSUU1wU2M2MzE5ZmhydmY0NFk=","upper_bound":"UGVmSkZ4TUU1RVBKWjJUaE5rUmVsVEU0UnBselcyTURuQVh3eHdJMm9OdVl3QjV5VzloaDdZVXUxZldWeHhL","repeats":1},{"count":835,"lower_bound":"UGYwZVNHZGdNanlQeEZNMll5QlJhTEdC","upper_bound":"UGtSSEhIVWNFVUNGb2daelJmQ0NWdlQzenZjcXN5eWZQV2VHQXcxamhoSlAzRkVzQ2Q=","repeats":1},{"count":843,"lower_bound":"UGtSZUJQQW9kdDd5Yw==","upper_bound":"UHZXbzdqYUgwb3ZpTXJKY3MyRk5zTDV4cDNIdWo2bWxuWjlWU3d1blRWcnBlUVJaQm5oMFZDZHg=","repeats":1},{"count":851,"lower_bound":"UHZXdnN6ZjZpVkgwM0tyVkpNQ0VnMnRJaEJSQjIybUxYWFFpc2c1NmRGSmxLUDEweDh0ek9GTEJ5MnQ=","upper_bound":"UHdJU0pMdXB3S1VkWmRva0prRzVQSzlaNEVHcnRydzdoUTZ1RzM5MFJ5SjUxR0k=","repeats":1},{"count":859,"lower_bound":"UHo4QXZyYVdYdDhOeHNzR2Z4Q3dJQWtkVUQ5a3U1eTFIUHlsdGhaTkNmUDVoVjE=","upper_bound":"UUY4M2FyZXJUMVphc1o3eERNRUFWcA==","repeats":1},{"count":867,"lower_bound":"UUZPN2djRnpCb2FLVXozZlVsRGc4WVo5Um93TkdXb0plZjZQaXh2WGlxZ2FjRzdJR0xFSmI=","upper_bound":"UVVYSkhyTUd1OEU5Y0FOdnJucGhqbXhNdDlTUnFubmExWGxMdXRSUEY2eVFjbFNIY0pGTTE=","repeats":1},{"count":875,"lower_bound":"UVl6N1E5UVM3THU0Tms0bFJrZXVoNmRMVGxrNmdWT3VyTlI5M0o5SHRWWlMxeDFUWEFw","upper_bound":"UWg2MllZ","repeats":1},{"count":883,"lower_bound":"UWplOFowUFcwRGpqQjVsMHREejlyZWVQV0ZsQk96VkJY","upper_bound":"UXB4dFFWeElpWmc3ZzU0ZWpXMklyYnpzWXFrMWRZSHZHRThzZjIyQ013c0s1WnZ0M25VckVGY3BJMlNydkVDVw==","repeats":1},{"count":891,"lower_bound":"UXVKRDFEdmhhdmFMTDBERUw=","upper_bound":"Ug==","repeats":1},{"count":899,"lower_bound":"UjJmZjBpUnQwVE4=","upper_bound":"UjZYems2RmIyVUVMcktKZ0Vua2dhMHJpYUVIdVlsdnJ4SDRm","repeats":1},{"count":907,"lower_bound":"UjdsQmZEeWFSTzBDMWw3Mms3WHpQWQ==","upper_bound":"UkpucU9TM3BmNW92bGxmaVZOMTVtd1RLQXBFSUVKTHUxRHoyVQ==","repeats":1},{"count":915,"lower_bound":"UkxvNkw2bHhINmlId0dGRVJxQVVOYVdpTlVpZHBjcjN5MkVhbVV3aFBCeVhHUUFNNlhSQ2NDc0EzZ1hxdEdwQw==","upper_bound":"Ulh0N0dBNFA3bnNyWFZBalVwOVVITGVqczZEREExQnQ0UU02YWtlMjRKYTV6SWpQ","repeats":1},{"count":923,"lower_bound":"UmFBNTNVTnlDN09LaWU4SVZHZzhaUFpZU0FrZmxYV2F3dUZkS1E2SE5tOXdJdktMbURyWWdmVUI5UA==","upper_bound":"UnRkSU9MU0dTd1FsdUFXQzY=","repeats":1},{"count":931,"lower_bound":"UngweGtQZm1LNjYxd1lWUmlheWsxUVBOOUxZY1h6bEFYYjJrOUllUVdGNDVMRFZ6VGF1YzZaZkNDdUc1MlVv","upper_bound":"U0tycVo3cHNpQ3FGdGc0THoyTFZydGo5Q1RVUFRj","repeats":1},{"count":939,"lower_bound":"U01lQlZIbHFDOGoybg==","upper_bound":"U1U2dlZFeU5oZk9MNGl1Y2pmZE9ROGFUVTJDMWVlelVlUWlnaU1COXVyV1VzZlBUTFdM","repeats":1},{"count":947,"lower_bound":"U1lHVEM=","upper_bound":"U2p1S0RHWFBaNFVoU09tYWw=","repeats":1},{"count":955,"lower_bound":"U3Q4T1B2blVlNVlMUHpxNzB4c1pBa241bEV6a2dwNUVHeXFoZFZ5OENGZ3g3N2NmWjJBVUd6VXo=","upper_bound":"VDNTbDhQY3pVU0ZaQklEcU1PS21hV1U1bUFpVDhrRDFYSER3cHhnVXFjNUJhTjVrUXU=","repeats":1},{"count":963,"lower_bound":"VEVzRHZLbTZkbVk3N3NJdlpialRnRA==","upper_bound":"VElmUzd2MXpXQw==","repeats":1},{"count":971,"lower_bound":"VEpKMGl4SlNYeHpsNEFybDdTN1JPdnE4YnUzSW00Yjk4N04yVTdPeW5ydWhmMw==","upper_bound":"VFpTbTZKRFRub0w2R3N4QXV2MVFhQUJZRkZ2ZTFZVm8zNTJZT0VVQktxVTlJTGhNc3pUZWNja01lWjExRXM=","repeats":1},{"count":979,"lower_bound":"VGFoWEJveFM=","upper_bound":"VHhDblhVUlRPQVpNUWtpbENua1paUkdLa3JwRVpySll4MHVUeEZtVQ==","repeats":1},{"count":987,"lower_bound":"VHhKb3ZsZHRDM1BUb2tNRllpbVRkdGd2","upper_bound":"VTB0RzNadTYwQWE3RkJiR1g2aktENmNlWWdJUXVnM0cwSFZqWQ==","repeats":1},{"count":995,"lower_bound":"VTFsOGhFTExjM0tDVjZhU093aXZzbDNKVWdYcnh2SndLMzJIVU82blZOaG1PUDNsNVZPeXFnYzhoMA==","upper_bound":"VURwSlVxWlhmYmp2ZG01R0I0a2xIUA==","repeats":1},{"count":1003,"lower_bound":"VVRuUzQwWDZGYVNiRndVVmlPa0FvemNVTUpyN01tRWt4dWR1aWRpdFV2MzljdjNJT0xRYXlyVTVQSA==","upper_bound":"VXA3TVBNdlBIdHU4ZERYcFRuUEFyWFh6OU44YVM=","repeats":1},{"count":1011,"lower_bound":"VXJ3WmNjZXM2TVdieGMwbk5oRnZqWjV1","upper_bound":"Vg==","repeats":1},{"count":1019,"lower_bound":"VjBGckszekFMejBGVG12MzRjVlJ0b0VETnFQVVYwRXA=","upper_bound":"VjY2YWRCeW5nRGw=","repeats":1},{"count":1027,"lower_bound":"Vkpab2RubUtNNGhRa21GNzZoMA==","upper_bound":"VlU1Z3RiT3RKMkNGaGhEaVhmTXowV3JqRExhc3JnVnN3U28=","repeats":1},{"count":1035,"lower_bound":"VlkxazRncXNqU1dKMkRRQnpKOVM0bnRYRHB4c3RnYnhL","upper_bound":"Vm9qeklGaUwzZVZkNw==","repeats":1},{"count":1043,"lower_bound":"Vm96T0FOYU1JQXV2aFU=","upper_bound":"VzJjU01Uc21mVkVwUjNSR1JNSDQ5TzlM","repeats":1},{"count":1051,"lower_bound":"VzNYVFRyVlpWb2NGZG5kZEo=","upper_bound":"V0JneTRFcnc5VFFTMHRHV0syNVdEckxzMXdyU3RWNFY=","repeats":1},{"count":1059,"lower_bound":"V0RyZTRoUHI1S3N5aw==","upper_bound":"V05lODg2ZHhwZ0VWdVY0VkhTVnVwN2ZMblBpeXFHMVVkdmUyRVRJSHJPWFBIMm9HOUk3VFQ3ZER1SWRRMmhY","repeats":1},{"count":1067,"lower_bound":"V05mMWt5eDhlTENaY1ptVmNySWxMeDExZ2g=","upper_bound":"V2Vod1hFUWZEdUlCUWVUZXREVWdkdFhva3oyeElGVFRpWElFNG5zZFNkNjVQSzVCZFowMkRNa3J2Rw==","repeats":1},{"count":1075,"lower_bound":"V2o5dGprcVlHejdGTERkVjZwVHZ6ZzZWektJc3oxUkJvWmYyVHh3","upper_bound":"V3FOQkZ4N0syMTAxbUkwdzc=","repeats":1},{"count":1083,"lower_bound":"V3JpVlNTQ0FWT3RqVVc=","upper_bound":"WDFsUGlkM2FjZ3pRNXdiM09zdDRROUoySDF3cmZFdnA=","repeats":1},{"count":1091,"lower_bound":"WDhVRjFXYUY=","upper_bound":"WE1PbU5jdVNnUmtuY2NmU1RTQXNjTTlsWklXNw==","repeats":1},{"count":1099,"lower_bound":"WFIwQzJ2TmhwcndDQjAzSWxPMWlrYmhIMHUybGpTb256NFZyZHFxekJHcEswYlhxY2lRQVZ3SFU=","upper_bound":"WFZhTHFFY2dVeFozRktVSWlVYUljaVVLUDlnWGdNdDZ1ejhucXJVUlFRdTZsM3lQ","repeats":1},{"count":1107,"lower_bound":"WFg4QkRrUHRTNW1nd2liOXlsZ3NGTENQVUZBYWdVaVZXTGIyNW5ObDk3TGRDalppdldmeQ==","upper_bound":"WGdZZm93Rldpd1plNkFuclZYUGZHY1NtdG53TlE0UjZZMkxoMg==","repeats":1},{"count":1115,"lower_bound":"WHNnYXd5RmkyMlFpVXdQM0IxN3dtZ1lqQjFBMno0SjBxVldENlpiYTlQWXBMU0R2WkJNMlQ=","upper_bound":"WHdIWlFHM3pZNTZuSkJNdWczZ2RiYzRZcVNYblM3eURHUzZaQ1UzaEhqVkY1T01ZeEZRcG51OXRkZnI0cjc=","repeats":1},{"count":1123,"lower_bound":"WHhwUTZQV0FQdw==","upper_bound":"WUJTZWhXWERHazgy","repeats":1},{"count":1131,"lower_bound":"WUx0azg0YTU0Q1NVdXY3Q3BSaTh1Nmo1OTRCUVVwd1M0dk1sUG51bnBWQw==","upper_bound":"WWM3Y1dKSm5leWU4MVZDME1PTGR1eDlKNEdTcUtwQUxLUlo5RHcyR2Q1Nno=","repeats":1},{"count":1139,"lower_bound":"WWR6NHRlQk1ic2w=","upper_bound":"WWp2SVY1NlJMWEZZdTdVNVIzU0pHVVl0aU5jeFVib2c3ZTJySUtoWjFMY2o5MHFKVEliUExlaXFmV3Z3Y0tGOQ==","repeats":1},{"count":1147,"lower_bound":"WWxvdVpxYQ==","upper_bound":"WjFhNkU5WFJ6WkRKbE5QNUFOWklVU0xhc1RaeA==","repeats":1},{"count":1155,"lower_bound":"WjVReW5PN0N1aG1DMzY=","upper_bound":"WkRNaXk5b0R0VXVKWnBVV1hLOWJaMUo0Vg==","repeats":1},{"count":1163,"lower_bound":"WkZRSGJ1V3pFQkZrVnppRGJ6","upper_bound":"WlVyWGhmd20wWUxicE9p","repeats":1},{"count":1171,"lower_bound":"WlZRd3Z2VkI0N3BWMEU1SnVFQXYw","upper_bound":"WmZseVF0ZUkwalllU1lUcndacGlUMUV5RHE1b2p0UFgxZUM5RGdJSERaaHhB","repeats":1},{"count":1179,"lower_bound":"Wm1pUURaVkc1SXFmOUFiZ0F2NzhaeE4wbTZ4U0ZG","upper_bound":"WndmRWhxWUlrNWJ5cGxiRA==","repeats":1},{"count":1187,"lower_bound":"YTB0SXAzM3FEUWZ3UnJsMU83ZlVzeWluUEgxZGZaUktQNG56TXpnZ3BXcGRjZ29mYTN4Vw==","upper_bound":"YUJxSTJDQzJKeDI=","repeats":1},{"count":1195,"lower_bound":"YUtqN2c2Nzh6NEl4S3ZK","upper_bound":"YWMwaE16VzVnNEJ4bkh6alVxUTQ=","repeats":1},{"count":1203,"lower_bound":"YWMxN3E3YkY1R3Z6MGcwNkJpUmdOZFBIdHo0cUt1cThrdWxaMmU=","upper_bound":"YjBjT2k1YkM5blNYR0NwWXQ3MzVHWkRCOTF0WW1EbjRpQ3Q1Q0RtNUowcmhybmdkSmloM0tKamdLWDc4Q1dw","repeats":1},{"count":1211,"lower_bound":"YjM5OUJ2UUlOelVIYzJORUJjYm0wU0R6S0RZODY3TlZQWVU=","upper_bound":"YjdNaGRPdklTTHVXRzdMdU9uakhCRlZuZHhIOU5kUnE=","repeats":1},{"count":1219,"lower_bound":"YkNMTXRlaDM=","upper_bound":"YlBoWjVkekxJRzNWWGlGdU9Va0hDM3lhM0FnUQ==","repeats":1},{"count":1227,"lower_bound":"YlRPVkJUS3ljeFVOTFVhalY0dzFFUENjaWtnTnpqdmpWUlZuNGpYTXpoaDlmd2lkd3JhZ1dhVVBUTGFJUENW","upper_bound":"Yll6OWN3SWhENDU0dEE=","repeats":1},{"count":1235,"lower_bound":"YlpwRFVFTlhxczJBNkZwTmlJODhWWll0ZTBabzlEQUR0ckU3NVpHMnRpeU5YVk5MYkZm","upper_bound":"YmZHZXVTZnprdnVjYnVwcDluQURlV0pLMENMQmFPU3ZPS3VJU242UDNh","repeats":1},{"count":1243,"lower_bound":"Ymg4ZFRv","upper_bound":"Yw==","repeats":1},{"count":1251,"lower_bound":"YzA0WE5HblNBNUNUMVJSVm1QSGk2ZFZUZnBxMEdVTW1ualc=","upper_bound":"YzlLcWpiUlk2dWpJamVTandlMTN0UHBuNHFlVUo5MkNqWkQ5S2ZMVTNEMDd3ZDdkbVM3ZmlVZ3FxZG1RNk5hVA==","repeats":1},{"count":1259,"lower_bound":"YzlnYmdzYkhTNGVTY1p0OA==","upper_bound":"Y09MU1puVmFadHhrVVlzRlZpdFo=","repeats":1},{"count":1267,"lower_bound":"Y09QV0JKWlBURmQ1c1U5eTBBdU1Pd1loSzNkcWV5WWRpVmQ3OQ==","upper_bound":"Y2NXTXB2OVRLUGQza1JNTFE2MlpIaVY=","repeats":1},{"count":1275,"lower_bound":"Y2hxU3RFdTcxa09kMm9nRUhSaA==","upper_bound":"Y29WOVprUDlSWW5uVG1rZEFEcGJi","repeats":1},{"count":1283,"lower_bound":"Y3k5VWpHU1JDMHRiQUw5dGZlRkNWMGdkV1RUaWFycmJNZEo=","upper_bound":"ZDYxaU5ReUxvWWV5MHp3SFpjNkQ5eTBGeVhZME1LTW83Q3JKbGxrRFNqTUJzTEo=","repeats":1},{"count":1291,"lower_bound":"ZDd4UlVFem13","upper_bound":"ZE93Q2NZck9oaEFFRUxrV1JrSmZUNmo2VUczRldCa0RlM0FLOWpIYnF3Rmt0SUtHVQ==","repeats":1},{"count":1299,"lower_bound":"ZFhMRXlZRUVEMXk2d3g2SjhiZmpSTGU4N2JRTXVhWW9lZU85WkZ0RnJkWDl1T0Rlb2t2UHlKcjYwd25pZXpBeg==","upper_bound":"ZFpMTU5TbnVON2E2bGMycFZ4R1l4M0NVQlhtTFU3VGJ4cVB5QWlF","repeats":1},{"count":1307,"lower_bound":"ZGxCdFZTWTVKQnE4bGlCMzAwcVBycUNSODM=","upper_bound":"ZHhFTU5ZOHFBRUNCMmFSU3ZNYmNjZUd6anMxT0lGOQ==","repeats":1},{"count":1315,"lower_bound":"ZHlhTFFYOVBudHh6R2tkVjNDbQ==","upper_bound":"ZUJIejBibnh3elpMZmFpdnU5TkFOZFh2ekVoa0FCQnV2eTA1S0FzUTFFN0xFYzJiM3pFdFBkaTFMWElCRg==","repeats":1},{"count":1323,"lower_bound":"ZUJ5VXdtQVlySlRJOFVON2lERlpBcDVFMk0zd21RT0Z0MWZyTUxqcVNzRno2ZzBvMldJNWh4cENad0c=","upper_bound":"ZVJiZzVxbkdDa0xwd0Rzdkx6dXJMeFVqVkRNQTg=","repeats":1},{"count":1331,"lower_bound":"ZVd3ZXRvcU9lOHVpamUwVGZ0eXRWYnliSFhpWGdkZQ==","upper_bound":"ZVpTTGFkWlBhN05CVHhxc1FVcDJ1b0M3ZUtsVEVBQVNDUWZEcVdOOFJNRHVOSHRmYktpQ1hDVA==","repeats":1},{"count":1339,"lower_bound":"ZWk1MGNKeUROTWJtaWx4M2t0REVSZHRnU0tWVHpBMkZU","upper_bound":"ZXNYQ1JMb0xya0JWOWJsUllBcWU3U0VLWkkwSkd0YU5CRjVFQWp0bzlmVXhhQWt3M0thZnljdkM=","repeats":1},{"count":1347,"lower_bound":"ZXRqUEpBNG56M2lZdTUzNGxjRTVXdTg3","upper_bound":"ZXk4Z2oyMkt0QU5BRDBWdU5Da3RaMmp0UEh0dlA1WmlPVk9jbzhFYVBUcExoWXd2dUJLako=","repeats":1},{"count":1355,"lower_bound":"Zg==","upper_bound":"ZkJrOWtxSUlGR3F0d2U1TUUyc3pJdzFDUUZkaw==","repeats":1},{"count":1363,"lower_bound":"ZkRxZmFWT1lpT2NEbElYTFNkTzFib3RhR1lMcHp6b0xTdkRDSFdUMjBJWko2TWc4dmNv","upper_bound":"ZlJwOGJLODFiQ1JhNkZNOVpzTXNnS2NTZUdETmF2bFM=","repeats":1},{"count":1371,"lower_bound":"ZlVDc1ZmYndpREV0eXRpQVh0SFYzR05VNzZMYnJFVlNNbEFIMmM4cGI=","upper_bound":"ZmplZG82MQ==","repeats":1},{"count":1379,"lower_bound":"ZnQwZHJYaUljZ0lUU09NaFVsTGliTFI2Z3o2QzI2RXgzSXJiazhUN056WDV0YzRPcnRaR0xqeA==","upper_bound":"ZzFDUTFVeFE=","repeats":1},{"count":1387,"lower_bound":"ZzRyR1p5R2h2QmJLN1F0STVqZzU=","upper_bound":"Z0hTOEcydUVrdjVHRVFR","repeats":1},{"count":1395,"lower_bound":"Z05xYjdNZUVSODdxeUdLMkQ5UWVCa3VkZHM1dnc1d3hrY0ZsR2U3Q0JQdg==","upper_bound":"Z1g4N1JVMkVxM1Y5TFlvdXFKb2RRRHJoMFpyd05rdQ==","repeats":1},{"count":1403,"lower_bound":"Z1piYnFOeGhwUDhJNk50ckkzUzNVbUVsYlNWOXRFWVZJ","upper_bound":"Z2xaZUhQYVhWWEIybnNwdXNOMFBiNXY=","repeats":1},{"count":1411,"lower_bound":"Z205S1ZuY0wySm5uUw==","upper_bound":"Z3A4MUt5VGkydkZZaDg1NHBTWWVCQzQ5ME5WTnkxb2JYdkduTGUw","repeats":1},{"count":1419,"lower_bound":"Z3IxZTNadU1DcnRjdElIQg==","upper_bound":"aDhKSHhicWd3OFBFMm1ZMEYzdTlEeTh0N0w=","repeats":1},{"count":1427,"lower_bound":"aDh5MEdVcXVzRE9EMXN4N09Wd1I=","upper_bound":"aE9vOUZTdFB0bmNuOHlmS0puTmJMUzZEQW1iaUhYaW8=","repeats":1},{"count":1435,"lower_bound":"aFEya2hBemdadG83U0llQXJndnBsdjc1V0EwMTMxRHRpdg==","upper_bound":"aGRDbnlX","repeats":1},{"count":1443,"lower_bound":"aGRLVk9vbGhIaHBPcFVmNXNnSWQ5WTM2NWxNWXd6N1VDUUxJM2lVT1g2ZHV3","upper_bound":"aGR6d2pxSzA=","repeats":1},{"count":1451,"lower_bound":"aHN1T1FocXU2akI0ZW5MMlJNSkJ1UEZ3Y0pHUWdCUnpxVDBjMktPTFhLZ3pHY1ZtZGJkYVdwSw==","upper_bound":"aTJyNVE4dnFqcVE4U1hxTmxzTWpOeURFV1VwSTFMWEs0RFRNWTNCQkxHanNnbURNcnlGaDI0V1dZQ1JwN2M=","repeats":1},{"count":1459,"lower_bound":"aUJWY2ZFZkJpeUhCUEw1MXhxSmNJTzBVc2kzbktGQXBQbUl3N3dESzd1eDBkZ1dDUFk3eg==","upper_bound":"aVBwSHVyRFZjdFVteXhmOTU=","repeats":1},{"count":1467,"lower_bound":"aVpvNEhrTm96cEVRRkRYTm9N","upper_bound":"aWZHaElQM2lwYzJBb1VKc1V5eA==","repeats":1},{"count":1475,"lower_bound":"aWlEY2dWaEkyeE9TYjQ5dWZrYVRyYU1Z","upper_bound":"aXVlVzlFaE9NUGcxd205SVBCMTRFb3EzNE9HMWs3cw==","repeats":1},{"count":1483,"lower_bound":"ajJObDY0bWlPeGNxSk01Q3RQSEl1YU51ZHZndTZ3M3VFaWRHb2VtYjNJbEFtelZy","upper_bound":"akliVjRyeFZ2S1lJcUxudUY2amtnZGZ6MUlvUXU5NQ==","repeats":1},{"count":1491,"lower_bound":"ak9XdUw3SGJpZk1FWXZCTENhc0hTajVvclcyQ09YMlRDd1pR","upper_bound":"alNkbWZXT0FENjdQWkdBVmJVbm1mNVpoZzQ4R2MyYmFGang2TWNFa1JIQmhSVHZwc2I5bFk5bGlEbQ==","repeats":1},{"count":1499,"lower_bound":"andsSEZRajhPZWhGeEZPM1RKQ09zaGNObW94ZTBMSzlkRkRSdm9iS1lMWFBuRG1tM1lCdlJPdXNySUxlMFlLUg==","upper_bound":"azJmMEF5ckpydHpMYjVWVjhPcW5ZU2hPSDNKUnpuMElwT21ReXFLbkJDbUJGb3g5NQ==","repeats":1},{"count":1507,"lower_bound":"a0JHdUtvb0JRZm93STl4a3dPSkplQUo=","upper_bound":"a0dBYkQ1SzMzSWRXb3NtVTJXcDNHNzQwajZiSnE5VkdzaTREZW8=","repeats":1},{"count":1515,"lower_bound":"a09PcjlWTWtkdzUweWJRNzN2bnNjT1BzY2I5MDVqWVFTMnlMU0hQNnlOdnZoMUE2alc=","upper_bound":"a1REUlBBM25JZ1JMOHdiTmhaeHQ=","repeats":1},{"count":1523,"lower_bound":"a1hPcExzRmU0YkdYQ3R5OHNsZGxWa2o=","upper_bound":"a2RObExnaVRuRUtuaFJ3Q2ZVNGpUa1h5WlJ0dnBORXdnUHNUdnFESU5tR1RCM005Tw==","repeats":1},{"count":1531,"lower_bound":"a2lMdFRNbTNuakluekhKYVlJQkdicHAyNEw=","upper_bound":"bDFCOGl6ck5jMFBJc2tDbVJva094R2RPNDJBTGhNUw==","repeats":1},{"count":1539,"lower_bound":"bDQ1dGVPUEQ4Y3lWTjlzNUphM3BCTEtC","upper_bound":"bDlZWml6ME0zalMwVFFmeVlMSFZIZ3RvVVNVNk02ZFpoNkVjQXVnSDduNkFDZEFObTY2OTVkb3JBcmI3eg==","repeats":1},{"count":1547,"lower_bound":"bEFmcWtwOGN2cGJCaGVsS0ZPckt0a2FaUDV0RExwb3RJSDQ5a0djQnFzR1lxcWFVcHpQeE1LVmlUbHNMNjA1Uw==","upper_bound":"bEpjMU9zVXM4djc3YThNNWhl","repeats":1},{"count":1555,"lower_bound":"bE1tMHltNElObTgzdGhlMmVObA==","upper_bound":"bFVCM01BSVJwbU1BaHVLOVhFT3FZWkZLTUMzV1QyaUpxdHdMZnZocEtHeFFtSGNXMldacGJy","repeats":1},{"count":1563,"lower_bound":"bFlvQUlObmJqT245NTJERFlpTmNxQWxKZDgxZ21JT1VhNjh0QmdCdGJzS3M0WXhaT0t1SGN5enQ=","upper_bound":"bG1xTFJYbXhnajBteVVkaWpRZzhndmFoamsxdlc3VlJhT3h3djN2MUlKeA==","repeats":1},{"count":1571,"lower_bound":"bHN2bTl1ejVmejcwem95ZHo0d1liYUhjOXZJSmVuYTFCdWVvT0Vnb3p1UGlyb0Fz","upper_bound":"bThhVHlMbFRHeXlN","repeats":1},{"count":1579,"lower_bound":"bUJ0RmFmTUxkOXIxbkFzZzhENEIyNU1JZHZjZlFUdXhMQzVsRGdycXc2aVYyTWFGU0U=","upper_bound":"bUlJWGFUZWlrbUpZcXpGdzdBTjB5bHJraTJKTnYzUFNxODVkdnM=","repeats":1},{"count":1587,"lower_bound":"bUoxWEVkSDZ3bXRXa29sMUpIWUs1OExQd2ExZHpoMUdLQjlrNml1MklnclRFbUZJ","upper_bound":"bVZwQQ==","repeats":1},{"count":1595,"lower_bound":"bVp3bndFQ3FCcDVTaVdKSHlTWmNrWlhHaWNkN0phVlVxWHFxQXQ0SkpZeWo=","upper_bound":"bWlBM1c0ZnpBOGxUcjFSZTVmeXJrT1pj","repeats":1},{"count":1603,"lower_bound":"bXV4RUZqcXdBVFpqQnNPa2Fld2JqaGVKZGVLUUs1MHlvdURtVm8w","upper_bound":"bjM5RFVKbkNOOWJNRnU1YVlVcTJycmZr","repeats":1},{"count":1611,"lower_bound":"bjR3WXV2eGRFdkVrQnlIT0VpbTI=","upper_bound":"bkYzVGladGU4WmpPZFVxd1VoUXM3bTFrSXdIclFWTHdETGRhMWZyUzR4MWIwRHhRSzlw","repeats":1},{"count":1619,"lower_bound":"blBVc2UwMXFoUlRxaVNPeHU4SXI=","upper_bound":"blp6NmdTbTNaQXlUVTBYTnJTZXVPcml6RTNjd0tHOEZQVjlodDNqOTFsOFdGWlNva01ZdXhK","repeats":1},{"count":1627,"lower_bound":"bmFWZGViY0VoTEl5YVRoYnYwSVMyMnJnZmU0THI2MG9yb0FyRkpCNGt3aA==","upper_bound":"bmRacXNkcVVsVXo4WmR0dTh2WElGT2E0VG1jaVkzalkwamF0eUt6dWNwMDhKTXAxcDhHVg==","repeats":1},{"count":1635,"lower_bound":"bmZKY1p4S2pXcGhGYTZ1SU9aeG96dGtqVVZIbTZmVU9GeXVsMGxrMHUxYzhKYU42Z3dPOThUb0hicm5abA==","upper_bound":"bmtEMmZvZHFweWNCUjNRaTA3dm8ycWZ4aTdtd3A4c21ZcEI=","repeats":1},{"count":1643,"lower_bound":"bm1CSHdobHdlVndoOGlrRkNidjhtSHl6MEpIODZiNXBQUXZoTVYyNkoxZGY=","upper_bound":"bnVGTmxIbk14RzZQc2ExR2J2bHpZVXc0TXo2QVdDbG82d3pmcGx0MGg=","repeats":1},{"count":1651,"lower_bound":"bnVIVFZ6b2JtSDFDVEhTUm1RUTk0bXU5aQ==","upper_bound":"bzJmd0V0bm9iYkltU0ppcFMyZ0s1U21TN1J5b0tFYkpVcTFEM0RKRk1PMUtaUHlYVHlEdnpHSlYyUlFFN20=","repeats":1},{"count":1659,"lower_bound":"b0VUS3NVdFpsMVlIR3RXV0h1MzlQT0Z2RHZRZjVCcXk5cHk0dXMxcG9OZEJtU0RaYlE0SjVSMWg0alFt","upper_bound":"b1lHQnhEQ3pibkJZdm1ER2JKVDBNNlda","repeats":1},{"count":1667,"lower_bound":"b2FCelBuOUNiTmhkNThKa0c=","upper_bound":"b3NId2RTbEZLS29SV0tyY3NRMXpKTVBYaVFnU3lKOUZjaWMzc0I0Y3k5VUc=","repeats":1},{"count":1675,"lower_bound":"b3NVVUZXeXdPVFprZjFRanlhZ3VXV0VJS3FXS25UY2k=","upper_bound":"cDJGTjBPQ3FWQkhyd2UydUdoVXhwSmVtSkQ4b0wxWk1tRTVySGc=","repeats":1},{"count":1683,"lower_bound":"cDMxQ2VTUTF1aERVYk53UFl5alQwVW9NMTdw","upper_bound":"cElHUXNPRDJYQUVUVXQwN2xyVlVRN0J3NXBzSXgzQm9Ga205N3BKeGZGQm1jRW10aGxUTw==","repeats":1},{"count":1691,"lower_bound":"cFI1SFV2","upper_bound":"cFV2Z20yUkk3TVhzb2hldA==","repeats":1},{"count":1699,"lower_bound":"cFpRZUdUaklkQTYwamlzY0tiVVlSUTJqeDlhaFBJd3VF","upper_bound":"cHE5aWFkRjRSVUtkVXRYRmhxZVBsQUVXakQ1amRyQUNtNVBB","repeats":1},{"count":1707,"lower_bound":"cTU1d3VRVlBVVVo3THhXdTgzT2N2RkRE","upper_bound":"cU8xRzFEMWkxQTRXYTg5a1BKQkNBc0kzeQ==","repeats":1},{"count":1715,"lower_bound":"cVJPUg==","upper_bound":"cVVpVm8xOA==","repeats":1},{"count":1723,"lower_bound":"cVdjOFhnTGlqRjQ4a01kb1h5ZHU3VGttRGhXSmJYM28yMVUweGs5U2pMbjVqTFNjUDRsdTllaEd4cElvVEdE","upper_bound":"cWtxWElYcndHNFpOMjlJVFZzN0lqSVkzY2NaZw==","repeats":1},{"count":1731,"lower_bound":"cXFkMHY0UFduYXhwT3NSZ2t4WGNHZ1JyVEVEd2RGd1U2SDRpeXJ2Q3ZBSWlOVw==","upper_bound":"cg==","repeats":1},{"count":1739,"lower_bound":"cjFYTFBHREc4SVJOUThNZFBLMTJxdHdsS1M3WFdFWG1MSTd6YUdyU2prUWtqR3l6aE5oaw==","upper_bound":"cjVwcENEWmpXcXRQSU1palBaMmpBVnczM1VybVdhd1dMMnlBM2d4enl5bHV4eDJx","repeats":1},{"count":1747,"lower_bound":"ckJBUEU1UXhTM2Js","upper_bound":"ckdSNEx6MVFJaGZYQTB1ZUlWT0l5U2VBZ0dwMUFwWTZ2NllYSGhwMU9lQ2lyQVdPYVY=","repeats":1},{"count":1755,"lower_bound":"ckwy","upper_bound":"ck5BWW4yTWtoRTFKZA==","repeats":1},{"count":1763,"lower_bound":"clFDOHBlTFVRMw==","upper_bound":"cnY5NGQ2RkF6a3VoZDYzcERZWE5mUk5ydHpZZTNjbVR6d0U2TGpTRFh4QVRZT0pYR0pWYWl4VDBWYTE2RFM=","repeats":1},{"count":1771,"lower_bound":"czdCZzFLYlBkTzJSTEJzSkcwSzU5azJsSnAzUUVqSWxwNzd2UWdjTHFYc3VjdzIzOVBvYmlGdkNxdm0yckpB","upper_bound":"c0ppTU9zcmVXcjVtako3cmNZNWJEbnhlVUY=","repeats":1},{"count":1779,"lower_bound":"c0t3UjBjMll6ajljdDQ0MXFkY21wbWExTGV4azRtMENheFA3","upper_bound":"c2FtZTIwNVhPemN0ZUlkRms=","repeats":1},{"count":1787,"lower_bound":"c2U1ZE80Wnd6ampwemtjcmU=","upper_bound":"c2g5VkoxNDNHMkVtclFRS09qSQ==","repeats":1},{"count":1795,"lower_bound":"c2pxMTdBNFQ2QzB0Tk9Na0w=","upper_bound":"c3c3N2RZT05COUpaSWVIb01QakpDQXVYY1J4a0RwU3Jq","repeats":1},{"count":1803,"lower_bound":"dA==","upper_bound":"dFM0T01zdDM0dnN3eE5FVG96akdZME9mVw==","repeats":1},{"count":1811,"lower_bound":"dGFhejFW","upper_bound":"dHV1YkF5S0Z3TkJQbWlSM3l4bXRvOEVYYThRRVBhU3o=","repeats":1},{"count":1819,"lower_bound":"dHZKaVk1ZXdPTEt0cm9YZnRSNlh5YUQxRzE5M29MTng3Qlph","upper_bound":"dUZKdDJGb3RoSnd3ekF5NVUzUA==","repeats":1},{"count":1827,"lower_bound":"dUxpN3Y3ZGliUDVycG5BdXYzb3dvd1F5cnRYSnlXUFZDTklMNGZiWkdJUnlCNEh6aUw4R3NtOXQ4SGtUTUc=","upper_bound":"dVh0OVNoekxLWGllazFGZTdzbXFxRzdJRw==","repeats":1},{"count":1835,"lower_bound":"dWl6OUVPMnJ3VlE0eU1HTFltWFVN","upper_bound":"dXgzMVM3cA==","repeats":1},{"count":1843,"lower_bound":"dXhxU0d3UThqdDlFVDE2Mnc=","upper_bound":"djNXSUhJdUc0R2cweVY0Nk9MYzRLZnJab1ZjZnFOUU9GS0k=","repeats":1},{"count":1851,"lower_bound":"dkFteldTSWxxdGd6ZXM2TEdzS2JK","upper_bound":"dkhl","repeats":1},{"count":1859,"lower_bound":"dklqOHB6YnliQTB1OTJNTlFISWVtN3MxZ1lETUhWcHEzUmFrM01TUkFoOEFoYw==","upper_bound":"dlNnM0RlOU1RamFqdUJVT1AweHpKWWt1Q1Nz","repeats":1},{"count":1867,"lower_bound":"dlVLa1FLY0pXWllobWZmZFFERldCakhCOGJLZTRVQ3JFTmROTWR6cEZoVg==","upper_bound":"dmRueHdVTldkWFJ1cnN0VGdKWm5ZZWZCNjJsb0JjVUlnazZPaVNDekhmTWNwYVhjSGkzcVZqZw==","repeats":1},{"count":1875,"lower_bound":"dmdBUWs5eG9kOGVsWUdoYko5aFk2emZ5NG5tZGtoR2RIeEtkRnB4dlFwWmxHdVN4dkxkaEp2cjFsYkRwanU=","upper_bound":"dmowbm8xRnRwd3dEaWFydlJMN1FjWk0zQnN5bmJXM2tiRlJjd29wTkZ4OU9OV1o4MXVNbHpx","repeats":1},{"count":1883,"lower_bound":"dm1tOWh4U1M3TlA0MmpGem9vQ1g3MWlOaFBGOHpjMUlMSmZtNWxTT1hiNUFnNG1QcnBI","upper_bound":"d0JUMzBwVUFjd0tHNW8wc2FUd2JO","repeats":1},{"count":1891,"lower_bound":"d0NySDZFbk82ZkUwbGdpaFRvejJRdDBjRnlMeVFwV3NZVDVpOEZiUGZhQUpRY01DQXBCbzU=","upper_bound":"d2FzMXJHcllpb0hWa3dmemNhbUhLeUR6b2hDMVVJTnE3ZnFLYk45d1I5a29SbElHZw==","repeats":1},{"count":1899,"lower_bound":"d2Mxd0w5aEpiUDhhMjVLM3dtYUhJVm0=","upper_bound":"d2hwVnNhMmpSaUhiakxvemNtZmlrNmNvRXVaNnBqdnQyUDN1eEVVYlNWUzBiRA==","repeats":1},{"count":1907,"lower_bound":"d25WRURSREhPV01TM0c=","upper_bound":"d3h4VlV3cUk5eUpRZHBSbXJMTHpScDNkeEE0U2lFUTcyNjRsWg==","repeats":1},{"count":1915,"lower_bound":"d3kyZFpsT2NUWjFTMk1tRWt4dQ==","upper_bound":"eDhraHV0ejhCV3JQeQ==","repeats":1},{"count":1923,"lower_bound":"eEZiWEw5aVNHNG5INjN0UzRkZjNaT3g5c2MzdHY3RXJDQ01keDFKeG0wWGFMTg==","upper_bound":"eFJtTWpOV1Z3QjBEMFFy","repeats":1},{"count":1931,"lower_bound":"eFN0Y2VUa0VRRnpWbkd6Uks1UGg4RFQxaXUxVzZtSjN4Rmhodmtqc0RI","upper_bound":"eGJsag==","repeats":1},{"count":1939,"lower_bound":"eGh3","upper_bound":"eG9yV3pTNDZrWUZlbjc3REtWNnNXWmJjVm5EV1U0UTM0bGc4","repeats":1},{"count":1947,"lower_bound":"eHNDTkpXdG93TDdHZlJMSGlQeDlLZGtFdzFEejBYVzR1UWhkdQ==","upper_bound":"eHpWZjlDZ3hP","repeats":1},{"count":1955,"lower_bound":"eQ==","upper_bound":"eThQSmdaQTR4TkpyTTRwakJvbTFGR21PeWhLN0JwQnB1c0lZeDZ4R1AzU01jQ1o2eVI=","repeats":1},{"count":1963,"lower_bound":"eU9TUVg4MUlKeVZVWWg2WXlsRnNRYndENmFhYU9GUnlGUElrcVNkSDVJdmpvM0xXYWhDdkRMTWREcQ==","upper_bound":"eWNFTzU5S0Zhcmg=","repeats":1},{"count":1971,"lower_bound":"eWtZb2RLSVNYVzZiUmJPTGlWamdrV1Y4MVdKTQ==","upper_bound":"ejFUMElYNEVSVkRo","repeats":1},{"count":1979,"lower_bound":"ejNQMTVkUU41TE01d3BBT2U1Mzg3TUhUU3M1VnVZcUFqVDk=","upper_bound":"ekRGakpqTkV1QU54VnBvcFdkWE1yYXE2UzNTZVNkdHh4MHlNekNqUzEzaGdPYUdkckdvWTN5YU90","repeats":1},{"count":1987,"lower_bound":"ekYyQUQ5OWNJUHhTNmpDSWV3Y0pi","upper_bound":"emVQVlFyTVRsUTZsWA==","repeats":1},{"count":1995,"lower_bound":"emh0R0xFTTZUYk15b3hoV1hXZjJFVm45azltaWNaZWs2RkM1SnlDYmtuZVZ0enBsYUdURUl4ZFhDUzY5","upper_bound":"enNWRDc0emJ5N0lrb0xV","repeats":1},{"count":1999,"lower_bound":"enVma2RpYml2VU9rYk91SXBBVlQ2aHhxU1M0cTZYUDAxdjRvZ0s=","upper_bound":"enpITUdORw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[4,0,1,1,2,1,1,1,0,1,0,4,1,1,2,4,0,0,1,1,0,1,1,0,0,1,5,0,1,3,3,0,0,3,1,1,0,2,0,0,1,1,1,1,1,0,0,0,2,1,1,0,3,0,0,1,0,0,1,0,4,0,2,0,0,1,4,0,0,1,1,3,0,0,1,2,0,1,2,0,0,3,1,0,3,1,0,0,2,2,0,0,1,0,5,1,0,3,0,2,3,0,1,2,1,1,2,3,0,0,1,1,1,1,1,2,0,3,0,1,0,1,0,2,2,2,2,1,0,1,0,0,0,1,0,0,2,0,2,0,2,0,2,0,2,0,1,1,2,1,0,1,0,1,1,4,2,0,1,3,3,1,1,0,0,1,0,1,0,2,0,1,2,0,1,1,1,0,0,0,1,2,1,4,2,0,0,2,0,0,0,2,1,0,2,0,2,3,1,1,1,1,0,1,1,1,1,2,1,0,0,3,1,1,0,0,2,0,0,1,0,0,2,1,1,0,4,1,1,1,2,2,1,1,2,1,0,3,2,0,1,2,2,1,0,0,1,0,1,2,0,2,0,2,2,1,2,0,0,1,0,0,2,0,2,0,0,2,1,0,2,0,0,1,1,1,2,1,1,3,1,1,2,1,2,0,1,2,1,0,0,0,2,0,0,0,1,1,0,2,0,2,1,0,0,0,0,2,1,1,0,2,1,2,2,1,0,1,1,0,0,0,4,4,1,1,0,0,0,2,1,4,0,1,2,0,1,1,1,0,1,0,1,1,0,0,0,3,2,1,0,0,0,0,2,0,1,0,1,2,0,1,1,3,1,1,0,0,1,0,0,0,0,0,0,1,3,0,0,1,0,1,0,4,0,1,1,2,0,0,2,0,0,1,0,0,0,2,1,0,1,1,0,0,2,1,0,1,3,3,1,3,4,0,1,1,2,1,0,1,0,0,4,0,1,0,1,1,1,0,1,0,0,1,1,1,0,1,0,1,0,1,3,2,0,2,2,1,0,2,1,0,0,1,0,0,0,2,1,1,1,0,1,0,0,1,4,1,2,1,1,0,1,0,1,3,0,2,2,1,1,1,2,1,2,1,0,0,1,1,1,1,0,1,2,0,0,0,0,3,0,0,1,0,2,0,1,1,1,0,0,0,1,0,1,0,1,1,0,0,2,2,0,1,1,0,0,1,2,0,2,1,1,0,0,1,1,0,0,2,2,3,3,0,2,1,1,0,2,4,2,0,2,1,1,0,2,0,0,0,2,1,0,1,2,1,1,0,1,1,1,1,0,0,1,0,0,1,1,0,0,1,2,1,2,0,0,1,1,0,0,1,1,2,1,3,2,0,3,1,0,1,2,2,0,2,3,0,1,3,2,2,1,1,2,0,0,1,1,2,1,1,2,2,1,1,3,1,2,0,1,1,0,0,2,2,2,1,1,1,1,0,0,2,0,3,0,0,0,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,1,0,0,2,2,1,2,0,2,3,1,2,0,0,0,1,2,3,0,0,1,0,0,2,1,2,1,1,2,1,1,0,0,1,2,0,0,0,1,0,0,0,0,1,1,3,3,1,0,1,1,2,0,1,0,1,1,3,2,1,0,3,0,1,1,3,0,0,0,1,2,2,0,0,1,2,3,0,1,1,2,1,0,0,1,0,1,3,0,0,0,3,2,2,1,1,1,2,1,1,1,2,1,2,3,1,0,2,1,0,0,1,1,0,1,0,1,0,0,0,1,1,2,2,1,1,3,1,3,1,0,0,0,1,2,0,1,0,1,0,2,0,2,1,3,0,0,1,0,2,1,2,0,3,2,0,1,0,0,0,0,2,2,1,1,1,1,2,0,3,0,1,1,0,0,2,1,0,0,0,2,2,0,1,1,0,1,0,0,2,0,0,0,0,1,2,0,2,1,1,1,0,1,0,3,1,1,0,0,1,1,0,1,0,2,0,3,0,0,0,0,1,0,3,0,1,3,2,1,1,1,0,1,0,0,2,1,1,1,0,0,0,1,2,0,0,1,2,3,3,2,1,0,1,3,0,0,2,1,1,0,3,1,4,1,0,0,0,1,1,1,1,3,0,0,0,2,0,2,0,0,2,0,0,1,4,0,0,1,1,1,3,0,0,2,1,1,2,2,1,0,1,1,0,2,0,2,1,0,2,1,1,0,1,1,3,1,1,1,0,2,0,1,3,3,4,1,0,3,0,0,0,0,1,1,3,1,2,2,1,1,0,1,2,2,1,2,1,1,0,0,2,1,0,1,0,1,1,1,0,0,0,0,1,1,2,2,3,1,1,0,0,3,1,1,0,3,3,2,1,1,0,1,1,2,0,0,1,1,1,3,1,0,1,1,0,1,2,0,1,1,2,3,0,0,2,0,3,0,1,1,1,0,1,0,2,2,0,1,1,2,0,1,0,0,0,0,1,0,2,1,0,0,1,0,1,1,2,2,0,0,0,1,1,0,2,3,0,3,2,2,1,2,1,4,1,0,1,0,0,1,0,0,4,0,1,0,1,0,1,0,1,0,0,1,0,2,3,2,0,1,3,0,1,3,0,0,1,1,1,2,0,1,0,1,2,1,0,2,1,2,3,2,2,0,0,0,0,1,0,0,1,1,0,0,0,1,1,2,2,1,1,1,3,1,0,2,1,1,0,0,2,1,1,2,1,1,1,1,0,1,0,1,0,0,0,1,1,1,0,1,0,1,3,3,2,0,1,1,0,0,1,1,1,0,2,3,1,2,0,3,2,1,0,0,0,2,1,0,0,1,2,2,1,1,1,0,0,1,0,1,1,1,1,0,0,0,0,2,0,0,1,0,1,3,1,0,0,0,0,0,1,1,1,0,2,1,0,0,1,1,2,1,0,1,4,0,1,2,1,2,0,1,2,3,0,1,2,1,2,0,0,0,1,1,2,1,0,0,1,2,0,4,1,1,0,0,0,2,1,1,1,2,2,0,0,0,0,1,0,0,2,0,0,1,2,1,2,1,0,1,2,1,2,2,0,1,0,1,1,1,0,0,0,3,0,3,3,1,1,2,2,0,1,1,1,3,0,0,0,0,1,0,2,1,0,2,1,2,0,1,0,1,2,1,0,2,1,0,0,1,3,2,1,2,0,1,1,3,2,1,1,1,3,0,0,0,0,1,3,0,0,1,0,1,0,0,0,1,3,1,1,1,2,1,2,0,0,3,0,0,1,1,3,1,1,0,0,0,1,0,1,1,1,1,1,3,0,0,1,1,2,2,2,0,3,0,1,0,1,1,1,2,1,1,1,3,0,0,2,2,1,0,1,1,0,0,1,0,2,1,2,0,2,3,0,1,1,2,2,1,0,1,1,2,1,1,0,2,2,0,1,0,1,0,0,1,1,1,2,1,4,0,0,1,1,4,1,1,3,1,1,2,0,0,1,0,1,0,2,2,2,1,1,1,1,0,0,1,0,0,0,1,0,1,2,0,1,1,1,3,1,0,2,2,1,0,0,1,1,0,1,0,2,1,0,2,2,2,2,3,1,2,0,0,1,3,0,2,2,0,1,0,2,1,1,1,2,1,0,2,0,0,1,0,2,1,0,0,0,0,0,3,0,0,2,0,1,0,1,1,0,1,0,3,1,0,0,1,0,3,0,0,1,1,0,0,3,0,1,1,2,1,0,2,0,0,0,3,0,0,1,2,0,0,1,1,0,0,1,0,2,0,0,0,0,1,0,2,1,0,1,1,0,3,1,2,1,1,0,1,1,0,0,1,0,1,2,2,1,2,1,1,0,1,2,1,0,1,0,2,1,1,4,1,1,0,3,1,1,0,0,1,0,2,0,1,3,0,2,0,0,0,0,1,1,1,1,0,3,1,1,0,1,2,1,0,0,2,1,2,3,0,3,1,2,0,0,2,1,0,0,2,0,0,0,1,4,0,1,2,1,0,1,0,3,1,2,2,1,0,0,1,0,2,2,2,0,2,1,1,1,0,1,0,2,2,1,0,1,1,1,2,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,4,0,0,1,2,1,1,2,0,1,0,0,0,3,2,0,0,0,0,0,1,2,0,1,3,2,1,2,3,1,0,0,0,0,1,1,2,1,2,1,1,0,1,2,0,3,0,0,2,1,1,0,0,1,1,3,0,0,1,2,2,2,0,2,2,0,2,0,1,0,2,1,1,0,2,0,1,0,1,0,0,3,2,2,1,0,2,0,0,1,0,2,1,1,2,2,0,0,3,2,2,1,0,1,1,0,1,1,1,0,2,2,2,0,1,0,1,1,0,3,0,3,0,1,1,0,3,0,1,0,2,2,0,2,4,1,1,0,3,0,0,0,0,1,2,0,1,0,0,0,1,1,0,0,1,0,0,0,1,1,1,1,1,0,1,1,5,3,0,0,1,0,1,1,3,1,1,1,2,1,1,2,3,2,3,0,0,2,1,0,1,0,1,1,2,0,3,0,2,0,1,3,1,1,1,2,3,1,0,1,0,0,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,4,1,0,2,1,1,2,2,1,1,1,0,4,0,2]},{"counters":[2,1,1,4,2,1,2,1,0,1,2,0,0,1,1,1,2,0,0,1,2,0,1,0,4,1,0,1,0,1,1,0,1,1,1,0,2,3,0,2,2,0,0,0,0,0,1,1,3,1,0,0,1,1,0,2,0,0,0,0,1,0,1,1,0,0,1,3,3,0,0,1,0,3,1,0,2,1,3,4,1,3,2,0,1,0,1,0,0,2,0,2,1,0,1,1,0,0,1,3,0,2,2,2,1,0,2,3,2,1,0,2,0,1,0,1,3,2,0,1,0,0,2,0,1,0,3,1,0,1,1,1,2,0,1,0,1,1,0,1,1,1,1,1,1,0,1,1,1,1,1,0,1,1,1,2,0,1,0,0,1,2,0,0,1,1,1,1,1,0,0,1,1,3,1,0,2,1,0,0,0,2,1,0,3,1,0,0,1,2,0,0,2,1,2,2,0,2,1,0,4,0,0,1,1,1,1,1,1,1,3,1,1,2,0,0,2,1,0,2,1,1,0,1,3,1,1,2,1,1,0,0,2,1,0,3,1,0,2,1,2,1,1,2,1,0,0,0,2,1,0,2,3,0,2,4,1,1,1,0,0,0,0,2,2,1,0,1,0,0,1,0,0,1,2,1,1,2,1,1,1,2,1,0,4,1,0,0,2,0,2,1,1,0,1,0,1,2,2,0,1,0,1,2,3,2,1,1,2,0,0,0,0,1,0,2,0,0,1,0,1,2,1,0,1,1,0,2,1,0,1,2,1,2,4,2,1,1,1,2,1,2,0,0,0,2,0,1,2,2,0,0,1,0,1,1,0,0,2,4,2,0,2,0,1,1,3,1,2,2,0,3,1,1,1,1,0,1,0,2,0,1,2,1,0,0,3,0,1,1,1,0,2,0,0,0,0,1,1,1,1,0,3,1,3,1,0,1,2,1,0,0,0,2,1,1,0,0,0,1,3,1,0,0,2,2,3,0,0,2,2,1,0,0,0,1,2,1,1,1,1,1,2,1,0,2,1,0,0,0,0,3,0,0,0,2,4,1,1,0,1,5,2,1,0,0,2,0,2,1,1,3,0,0,1,1,2,1,2,1,0,2,1,0,0,0,0,1,0,2,0,0,2,0,0,0,2,0,1,0,1,0,2,0,1,1,0,0,1,0,0,0,1,0,0,2,0,0,0,0,1,2,2,2,1,0,0,2,0,2,1,1,0,0,2,1,0,1,0,1,0,0,1,3,2,2,1,1,3,0,0,1,1,0,1,1,1,0,0,1,0,0,0,2,1,2,0,0,0,0,2,1,2,0,0,0,0,2,1,0,1,0,1,1,0,0,2,2,2,0,0,0,0,0,2,0,1,0,0,1,0,1,0,2,1,0,1,3,2,4,0,2,2,1,0,0,4,0,0,2,1,1,1,1,3,1,0,1,3,1,1,1,2,0,1,0,1,0,1,1,1,1,0,0,1,2,0,2,1,2,3,1,3,2,0,3,0,1,1,2,4,1,0,1,2,2,0,0,1,0,1,2,0,1,0,0,1,1,0,1,1,0,1,2,0,1,0,0,1,1,1,0,0,0,2,0,0,0,1,0,0,0,0,0,2,2,2,1,1,2,2,1,5,2,0,1,1,0,0,0,2,1,0,1,1,0,0,2,0,0,0,2,0,1,2,2,0,2,2,1,2,0,1,0,1,0,1,2,0,0,1,1,1,0,1,1,0,2,1,0,3,1,1,1,2,1,1,0,1,2,1,2,0,0,3,0,0,3,1,2,2,5,1,0,0,0,1,0,1,1,0,1,1,1,1,1,1,1,0,0,2,0,0,1,1,1,1,0,1,2,0,3,1,1,0,1,1,2,2,1,2,0,1,1,0,0,1,0,2,2,0,2,2,1,0,0,0,1,1,1,2,1,1,1,0,3,1,4,1,1,1,2,1,3,0,1,2,1,0,1,0,0,1,0,0,3,0,1,1,3,2,1,1,3,0,0,3,1,2,1,0,0,0,0,0,1,3,0,1,0,1,0,1,0,2,1,1,0,1,2,2,0,0,1,2,1,0,2,1,0,1,1,0,1,0,1,1,3,0,0,0,0,1,0,0,2,0,0,2,1,0,0,0,2,1,1,0,2,0,1,2,0,2,2,1,1,0,2,1,1,0,1,0,1,1,1,0,1,1,2,0,2,0,1,1,0,1,1,0,1,1,0,2,0,0,1,0,2,1,0,3,1,0,0,1,1,0,2,0,0,1,0,1,1,3,1,1,0,3,1,2,2,0,0,0,1,2,1,1,0,2,1,0,0,1,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,0,1,1,1,0,0,2,2,0,0,0,1,4,2,0,1,2,0,1,1,3,0,0,1,1,2,1,0,2,0,1,0,2,2,0,0,0,1,0,2,2,1,0,0,1,1,2,0,2,0,3,0,1,0,0,1,1,1,1,1,1,1,0,2,0,2,0,0,1,2,2,1,0,0,0,1,0,1,0,0,1,0,0,2,0,2,1,2,1,3,0,0,0,0,1,1,1,4,1,3,1,1,2,0,1,0,3,1,1,1,0,2,0,2,5,0,0,1,2,1,0,0,1,1,1,3,1,3,1,3,1,3,1,0,0,0,0,2,1,2,0,0,0,0,1,1,0,1,2,0,0,0,3,0,1,0,0,0,1,0,0,1,0,0,4,2,1,2,3,0,1,0,0,0,1,2,0,1,2,0,0,0,0,1,1,2,3,2,0,0,0,1,1,0,1,1,1,2,3,2,0,1,0,2,0,0,0,2,0,0,1,0,2,0,0,0,0,0,1,0,1,2,4,0,1,1,2,2,2,1,3,2,1,1,4,0,1,2,0,1,1,1,0,2,2,2,2,1,2,1,0,0,2,2,1,0,1,3,1,0,1,1,0,1,2,3,1,1,1,1,1,0,0,1,1,1,0,2,1,1,1,1,3,0,1,1,0,1,2,2,0,0,1,1,3,1,1,0,0,0,1,2,0,2,1,0,1,2,0,1,0,1,0,0,0,0,3,3,3,1,0,3,0,2,1,1,0,0,0,3,1,2,0,0,1,1,0,1,1,0,2,0,2,2,0,1,1,0,1,2,1,0,0,2,1,1,1,2,2,1,1,1,0,1,0,1,3,0,0,4,0,2,0,1,0,1,1,2,1,1,1,1,1,1,1,2,1,1,1,2,2,2,0,0,0,1,0,2,0,1,0,0,0,3,1,1,1,1,1,0,2,0,1,1,2,1,2,0,1,1,0,2,2,1,3,2,0,2,1,1,1,0,2,0,1,0,0,0,0,0,0,0,1,2,0,5,0,0,2,1,1,1,1,0,0,1,4,1,3,2,1,0,1,0,1,2,0,0,1,1,1,0,1,0,1,0,0,2,0,2,0,0,2,2,1,2,1,1,0,1,0,0,3,0,1,1,0,0,0,2,2,0,0,2,2,2,1,1,2,0,3,1,2,1,0,0,1,1,1,0,1,0,2,1,1,1,1,1,0,3,3,1,0,1,1,3,2,1,1,2,2,1,2,1,0,3,0,2,0,1,0,0,0,1,0,1,0,1,4,0,1,0,2,1,1,3,2,3,1,3,1,0,1,1,0,3,1,1,0,0,2,0,0,2,2,0,1,0,2,1,0,2,1,2,0,1,0,0,0,2,0,3,0,1,0,0,0,3,1,1,4,0,2,0,3,2,1,0,0,0,1,2,0,0,2,1,1,1,1,1,0,3,0,1,1,1,0,0,1,1,0,0,1,0,1,1,0,0,1,2,2,0,2,3,1,0,2,0,0,0,1,0,0,1,3,1,0,1,1,1,1,4,0,0,2,1,1,2,1,1,0,2,1,2,0,1,2,1,1,0,1,2,2,0,1,3,0,3,3,1,1,0,0,3,4,1,1,0,2,1,1,0,1,1,1,1,0,5,1,1,0,2,1,0,1,0,1,0,2,0,0,1,2,1,1,1,0,2,2,1,3,2,1,0,0,1,1,1,1,1,1,1,2,1,1,1,3,1,0,2,1,1,2,1,0,0,1,0,1,0,2,3,0,0,0,0,0,1,1,0,2,2,0,0,2,0,1,2,1,0,3,1,3,0,1,2,0,0,2,2,0,2,1,0,2,0,0,1,0,1,0,0,0,1,0,2,1,1,1,0,2,0,3,2,0,2,2,0,1,1,2,0,1,3,1,2,2,1,2,0,1,0,0,0,2,1,1,1,3,1,0,2,0,2,2,1,1,1,1,0,0,2,0,1,0,0,2,2,1,1,0,0,0,1,1,0,0,0,1,1,2,0,1,0,2,0,0,2,0,0,0,0,1,0,3,1,1,0,3,1,3,1,1,1,2,1,0,2,4,4,0,1,1,1,0,0,0,1,2,4,0,0,1,0,0,1,3,6,1,0,1,1,1,0,2,2,2,0,0,1,0,2,1,0,2,0,1,2,1,1,0,3,0,0,1,3,4,0,0,1,1,1,3,1,1,3,1,1,0,0,0,1,0,0,1,0,1,2,1,1,1,1,0,0,0,1,5,0,2,1,1,1,2,1,1,1,1,0,1,1,1,0,0,0,1,2,3,1,2,0,1,1,1,1,3,1,0,0]},{"counters":[1,2,1,2,0,0,1,0,0,0,0,2,2,0,0,1,2,1,0,0,0,2,0,1,1,1,0,1,0,0,1,1,1,0,0,1,1,2,1,2,0,0,1,0,1,1,1,1,0,3,0,1,2,1,2,0,1,4,3,0,0,0,1,0,1,2,0,0,2,1,0,1,1,1,0,1,1,1,0,1,3,0,0,2,0,0,4,1,0,2,2,2,0,1,1,0,1,0,1,0,0,1,2,1,3,0,2,0,3,2,0,2,2,0,1,0,2,0,1,1,0,1,0,2,0,0,0,1,0,0,0,1,4,1,3,1,1,0,1,1,1,2,0,2,0,3,0,1,1,0,2,1,0,1,1,1,2,1,0,1,1,0,2,0,2,2,0,0,0,3,1,0,1,0,0,2,1,1,0,0,1,0,0,2,1,2,0,1,1,0,1,0,1,1,1,1,0,3,2,1,1,0,3,1,1,1,2,2,0,1,3,0,0,2,1,1,1,1,0,1,0,1,0,0,2,0,2,1,3,3,1,2,0,1,0,0,1,4,0,0,2,0,1,2,2,1,2,0,1,0,1,1,1,0,1,0,0,0,3,0,3,0,0,2,1,1,1,2,1,2,1,0,0,0,1,0,1,2,0,1,0,1,2,1,2,1,2,1,1,0,1,4,0,3,1,2,0,1,0,1,2,2,1,2,0,0,1,3,0,0,0,0,2,1,0,1,0,0,2,3,1,0,1,0,1,1,4,2,0,2,1,3,0,0,0,0,2,3,0,1,0,0,0,1,0,1,0,1,1,0,1,2,0,1,0,0,1,1,0,1,0,1,1,2,0,0,0,1,1,1,1,1,0,0,3,1,1,0,1,2,1,2,1,2,1,2,0,2,1,1,2,1,1,0,0,0,0,0,6,1,4,2,2,2,0,0,2,0,0,1,1,0,0,1,1,1,0,0,1,0,1,2,1,1,2,1,0,1,2,1,0,2,1,3,1,0,1,2,2,0,3,0,2,0,1,0,1,1,0,2,1,0,0,0,0,2,3,1,1,3,0,4,0,0,1,0,0,0,1,0,0,1,0,1,1,1,1,0,0,0,2,1,1,1,1,0,0,0,0,2,0,0,0,0,2,1,0,1,0,1,2,4,0,0,3,1,0,0,2,1,0,0,0,0,0,0,0,1,2,0,1,3,0,0,1,4,1,3,1,0,0,2,0,1,1,0,1,2,1,0,1,1,1,1,0,0,1,1,0,0,3,1,2,0,1,1,0,3,1,3,0,0,2,4,1,1,2,1,1,1,0,2,0,1,3,1,1,0,1,0,0,3,0,0,2,1,0,2,1,0,0,2,1,1,0,1,2,0,0,0,1,2,0,1,1,1,2,1,1,0,0,0,2,1,0,2,0,1,0,2,1,0,0,1,0,1,0,1,1,1,2,2,1,0,0,3,1,2,1,0,2,0,0,2,0,0,0,1,1,0,2,3,2,0,2,1,0,1,1,2,0,0,1,1,2,0,2,1,1,0,1,1,3,2,1,1,1,3,0,0,1,3,1,1,2,1,0,1,1,1,0,1,1,0,0,1,0,0,2,1,2,0,0,0,0,1,2,1,1,1,1,2,0,2,1,0,0,1,2,2,0,1,1,3,0,0,1,1,0,1,1,3,2,1,0,1,2,1,1,1,3,0,1,0,2,2,0,2,1,0,2,1,0,0,1,2,1,2,0,2,1,1,0,0,0,2,1,1,1,0,0,1,1,0,0,2,2,1,3,1,1,0,0,0,1,1,0,1,0,3,1,1,2,2,2,1,0,1,2,0,2,0,1,2,1,1,0,0,2,1,2,1,1,1,3,0,1,0,0,1,1,0,1,0,1,1,0,0,1,0,0,0,3,0,0,1,0,1,0,1,1,1,2,0,2,0,0,0,0,0,1,2,0,0,0,3,2,0,1,0,0,1,0,2,5,3,3,0,1,0,0,0,1,0,1,1,0,0,1,4,1,2,2,3,3,0,0,0,1,1,2,1,1,3,1,1,1,1,0,1,0,4,2,2,0,1,2,3,1,4,5,2,3,1,0,0,0,0,1,2,0,0,0,0,1,0,0,0,3,0,1,1,1,1,1,1,3,0,1,1,3,1,1,0,1,1,0,0,3,0,1,0,2,1,1,1,0,1,0,0,2,0,2,0,0,1,1,1,1,1,2,1,1,0,2,0,1,3,1,2,0,0,1,0,0,2,1,0,0,2,1,2,1,1,2,0,1,1,0,0,0,2,1,0,0,0,2,0,0,4,1,1,1,1,1,2,0,1,0,1,1,1,0,0,0,2,0,1,0,2,0,0,1,2,1,1,3,1,0,0,0,0,2,1,1,1,0,1,2,2,0,0,5,1,0,3,1,0,3,0,0,1,2,2,2,1,1,1,2,2,0,1,0,0,1,0,2,0,1,0,2,0,1,2,1,1,0,1,1,1,1,1,2,1,5,2,1,0,0,1,0,0,2,1,2,1,1,0,1,2,0,2,1,2,2,0,2,1,0,2,1,1,1,1,3,3,2,0,2,3,1,2,1,1,2,2,1,1,0,1,1,0,0,0,2,0,1,1,0,1,0,0,3,1,1,1,1,0,2,0,1,0,0,1,2,2,1,2,0,2,3,0,1,1,0,1,0,0,0,0,1,1,2,2,1,1,0,2,0,3,1,2,1,0,0,1,1,1,0,0,3,1,1,0,0,1,0,1,0,0,0,0,0,0,2,1,1,1,3,0,0,1,1,1,1,0,1,4,1,2,0,2,1,3,1,3,0,0,1,0,1,1,2,0,0,5,0,0,3,0,0,1,1,2,1,1,0,2,0,1,2,2,1,1,1,1,1,0,0,1,0,3,3,3,0,1,1,0,0,1,2,1,0,2,1,0,0,2,3,1,1,0,0,0,2,1,2,1,1,2,0,0,1,1,2,1,3,1,1,1,2,3,0,0,0,0,1,1,1,0,1,1,0,2,2,0,0,3,3,0,2,0,3,3,0,2,1,1,1,0,1,1,1,0,1,2,0,1,1,2,1,2,0,2,0,4,0,2,0,1,0,2,2,0,3,0,0,2,0,1,1,0,1,1,1,0,1,4,3,1,1,1,1,2,1,1,1,1,3,0,0,1,1,0,1,0,2,0,1,2,0,0,3,0,2,1,1,0,2,0,0,0,0,1,0,0,1,1,2,3,1,1,1,1,2,0,1,0,0,1,1,1,3,2,1,1,0,1,2,2,1,0,0,2,1,3,0,1,1,3,1,1,0,1,2,0,3,0,2,0,0,1,0,0,1,1,1,0,1,1,1,2,1,0,0,3,1,0,2,0,1,1,2,1,1,1,4,1,0,2,1,2,1,1,1,0,1,3,0,0,1,4,2,0,0,2,3,3,0,1,0,1,0,1,1,0,1,1,0,0,1,1,1,2,2,0,1,1,1,2,1,0,0,0,2,0,1,0,2,0,0,0,2,1,0,1,1,1,0,0,0,1,1,1,0,1,3,2,1,2,2,1,0,2,1,1,1,2,0,0,1,3,0,3,2,0,0,1,1,1,1,1,0,5,0,1,1,0,1,2,3,2,2,0,1,1,4,3,0,0,1,2,2,1,0,2,1,1,1,0,0,1,0,0,2,2,1,0,0,0,0,1,0,3,1,2,0,1,2,1,1,2,1,0,0,1,1,1,2,0,4,1,0,1,1,0,1,0,1,1,1,1,1,1,2,1,3,0,0,1,3,2,1,2,4,1,1,1,2,0,1,2,0,1,0,0,1,0,1,2,1,2,1,0,0,2,1,3,1,1,1,0,1,0,1,0,3,0,2,0,2,1,0,0,0,2,0,1,0,0,1,0,2,1,1,1,0,0,0,2,2,1,1,0,0,0,0,1,2,0,0,1,1,1,0,0,1,0,1,1,2,0,1,1,2,3,0,3,1,5,0,3,0,1,2,1,0,0,0,1,0,0,1,0,0,2,0,3,1,0,0,6,0,0,2,0,2,1,1,1,0,4,1,0,2,1,0,1,0,1,2,0,1,0,1,1,2,1,2,1,0,0,1,0,0,1,1,2,1,0,2,3,0,1,1,2,0,2,1,0,1,0,3,3,0,1,0,1,0,2,2,0,1,1,2,0,2,2,0,0,6,0,0,0,1,0,3,1,2,3,0,2,1,2,1,2,1,0,1,3,2,0,0,0,1,2,1,1,1,0,1,0,0,0,2,2,1,1,0,0,0,0,0,2,3,0,0,0,1,1,1,0,2,2,0,2,1,1,0,0,0,0,0,1,0,0,1,0,2,0,3,1,0,0,1,3,0,0,1,1,0,0,0,3,1,3,0,0,0,1,1,1,2,0,0,0,3,2,0,1,2,0,0,4,1,0,1,2,3,1,3,1,0,1,2,1,1,0,0,1,0,1,0,2,1,0,0,1,0,1,5,0,0,0,1,1,1,0,1,2,1,0,1,1,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,1,1,0,2,1,0,1,2,1,0,0,0,1,0,0,0,0,2,0,0,1,2,0,0,3,1,1,0,2,1,1,1,1,3,0,1,0,0,0,2,0,3,2,2,1,2,3,0,1]},{"counters":[0,1,3,2,2,0,1,1,0,2,2,1,0,2,1,2,1,3,2,1,4,0,0,0,0,3,1,1,1,1,1,1,1,0,2,2,2,1,2,3,1,0,0,0,0,0,1,1,1,2,3,2,0,1,1,0,0,1,2,0,1,1,1,1,1,0,1,1,0,1,2,1,1,0,0,1,1,2,1,2,1,1,2,0,1,1,1,3,2,1,1,0,0,1,2,3,0,1,4,0,1,0,1,1,1,2,0,1,1,2,1,1,1,4,2,1,0,0,0,3,0,0,0,3,2,3,2,0,4,1,1,1,0,0,4,1,1,0,1,0,1,1,0,1,0,0,1,0,1,1,1,1,0,1,0,0,1,0,0,2,0,1,2,1,0,2,0,1,0,2,1,0,1,1,2,1,1,3,1,2,0,1,0,2,0,1,0,0,1,0,2,0,0,2,1,1,3,0,0,1,0,1,0,0,1,3,1,0,0,2,0,1,4,0,0,3,0,1,0,2,0,1,1,0,2,2,0,2,1,2,2,1,1,1,2,3,5,0,1,2,0,2,1,1,0,2,1,0,0,1,0,2,1,1,1,0,0,0,0,0,1,2,1,0,1,1,1,0,0,2,2,0,0,1,2,0,0,3,2,0,1,0,2,1,3,1,1,3,0,0,1,3,0,0,0,1,0,0,1,0,1,2,0,3,0,1,0,1,0,0,1,0,0,0,1,3,1,1,1,2,1,1,1,2,0,2,3,1,1,0,2,0,0,1,3,1,1,2,0,1,1,2,1,2,1,2,0,2,3,3,0,0,0,0,1,2,1,1,3,1,0,1,2,0,0,0,2,1,2,1,2,1,4,1,0,1,2,0,1,0,0,5,2,0,0,1,1,2,2,0,2,2,1,0,1,0,1,1,0,2,0,1,1,1,1,0,2,2,0,0,4,0,1,0,0,1,1,0,2,0,1,0,2,0,1,0,1,1,1,2,3,2,0,1,2,0,0,1,2,0,2,1,2,1,0,0,1,2,0,1,0,1,1,3,3,1,0,1,0,3,4,1,4,2,1,0,4,2,3,2,2,0,3,0,1,0,1,2,0,2,1,2,1,2,0,1,3,3,0,0,0,1,2,0,1,0,1,1,1,0,0,0,0,0,0,0,2,1,2,2,1,0,0,1,0,1,0,0,1,2,2,1,0,0,3,1,1,1,0,2,2,1,1,1,1,1,1,0,0,1,0,0,1,0,2,1,0,1,0,0,1,0,2,0,0,0,0,0,1,2,1,0,0,0,1,0,3,0,1,0,3,1,2,0,0,0,0,2,2,0,2,1,0,0,2,0,1,0,1,1,1,1,0,0,0,3,1,1,1,1,1,2,2,1,0,3,1,1,3,0,0,0,1,0,2,1,0,0,0,1,1,0,1,0,0,2,1,0,0,3,0,0,2,2,1,1,2,2,2,0,1,0,2,0,0,1,0,0,0,0,0,2,2,1,0,1,1,1,2,0,2,1,2,2,1,0,0,1,2,2,1,2,0,3,0,1,1,1,0,1,0,0,2,1,2,0,0,2,0,2,0,2,2,2,0,0,0,1,0,1,0,2,0,2,0,1,2,3,1,1,0,0,2,1,1,0,1,1,3,1,2,2,0,0,1,1,0,1,1,4,1,0,0,2,0,0,1,0,0,1,1,3,0,0,1,3,2,1,2,1,0,0,2,3,0,0,2,2,1,4,4,0,4,3,1,1,1,1,1,1,1,0,1,1,0,3,0,0,0,0,0,1,0,0,0,2,0,2,2,1,1,0,1,0,1,0,1,1,1,0,2,1,2,0,1,0,2,3,0,2,1,0,0,0,1,0,3,0,2,0,0,1,0,0,1,2,1,0,0,3,5,2,0,0,0,0,2,0,0,1,2,2,1,0,1,1,1,0,0,0,2,3,1,1,0,2,2,1,0,2,1,3,1,3,0,2,1,3,0,1,0,0,1,0,2,1,1,0,1,2,0,1,1,0,1,2,1,0,0,2,1,0,0,2,0,3,0,2,0,0,1,1,2,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,1,1,0,1,2,1,1,1,0,2,1,1,4,2,2,1,1,0,0,2,1,1,2,1,1,1,0,0,1,0,1,1,0,1,2,1,0,0,1,1,2,2,0,0,0,1,3,0,1,0,1,2,2,2,0,1,0,1,3,2,1,0,1,2,0,1,1,1,1,0,2,1,2,0,2,0,1,2,0,0,0,4,0,2,0,1,1,0,0,5,0,2,4,1,2,0,0,0,4,1,4,1,1,3,1,0,2,1,3,0,0,0,2,2,0,2,0,1,3,0,0,2,2,0,1,0,1,2,0,1,2,1,0,1,0,0,1,2,2,2,0,0,2,0,0,1,0,1,2,1,1,0,0,1,0,0,1,0,2,3,1,3,2,0,1,1,1,1,0,0,0,1,2,2,0,1,1,0,0,0,1,2,0,1,2,0,1,1,1,0,0,0,2,1,2,0,1,1,2,0,0,3,0,0,1,0,2,0,0,1,0,1,1,1,1,2,1,0,0,0,2,1,1,2,3,0,1,0,0,3,1,0,0,0,0,0,2,0,1,0,5,2,1,0,2,1,0,0,1,2,1,2,1,2,2,0,1,1,0,1,0,2,1,2,1,1,1,0,1,0,1,0,1,0,3,0,1,1,0,0,0,2,0,0,2,0,0,1,2,0,3,0,2,1,0,2,0,0,2,1,2,2,2,1,0,0,0,0,0,4,1,1,2,1,3,1,0,4,2,1,2,0,0,0,1,0,3,1,1,2,2,0,1,2,0,1,0,0,0,1,5,3,0,1,1,1,1,0,0,0,2,0,1,0,0,5,2,3,1,0,2,1,0,0,0,0,1,0,2,1,0,1,1,0,1,1,2,0,0,2,0,0,2,2,0,1,0,1,2,0,0,1,1,2,4,0,2,0,1,0,1,0,0,1,0,0,0,1,2,2,2,0,0,0,2,1,0,3,1,0,0,0,1,1,1,3,1,0,1,2,0,1,2,3,1,0,0,0,1,2,0,3,0,0,1,1,0,0,1,2,4,0,0,1,0,1,1,0,0,0,0,0,1,1,1,2,1,0,0,1,1,2,4,0,0,0,0,0,5,2,2,0,1,2,0,2,0,0,1,1,1,2,1,0,2,0,0,0,1,1,0,5,0,1,0,1,0,4,3,1,1,0,0,0,1,1,0,1,0,0,1,2,1,2,1,5,1,2,1,0,1,1,1,2,2,1,1,0,1,0,0,0,1,2,1,0,2,0,0,1,0,0,3,0,3,0,0,1,1,2,1,1,0,1,1,1,1,0,1,1,2,0,3,1,0,1,2,0,3,1,2,0,0,1,0,2,1,1,1,2,0,0,2,4,2,1,0,3,3,1,1,2,2,0,1,3,0,0,0,0,0,0,0,0,2,2,0,0,0,1,0,0,1,0,2,1,0,0,1,0,0,0,3,1,2,1,0,1,1,0,0,2,0,0,0,0,1,2,1,0,1,1,1,0,0,0,0,0,1,1,1,0,2,0,1,1,0,0,1,2,0,3,1,2,0,1,0,1,2,2,3,0,3,3,0,0,1,0,2,1,1,0,0,0,2,0,0,0,1,2,2,1,2,1,0,1,0,3,4,1,1,1,1,3,0,0,1,0,0,0,3,2,2,1,0,1,0,1,0,0,4,2,0,0,1,1,2,4,1,2,3,0,1,2,0,1,0,2,0,0,2,0,1,2,3,0,2,0,3,0,2,0,1,1,1,0,0,1,0,1,1,3,2,0,2,0,1,0,2,0,0,0,2,2,2,0,0,1,1,1,0,1,0,2,1,0,0,0,1,1,1,1,0,0,1,1,1,1,0,2,1,1,0,2,2,0,0,0,2,1,2,2,0,1,0,1,2,0,2,1,3,0,1,0,4,0,1,2,1,3,0,4,1,3,1,3,0,0,0,4,2,0,1,0,0,2,1,1,1,2,0,0,0,0,2,1,1,2,2,0,1,1,0,0,2,0,0,0,0,1,0,2,2,1,0,3,2,2,1,0,0,1,0,1,1,0,1,2,0,0,2,1,0,2,0,1,1,0,1,0,0,3,1,0,1,1,0,2,2,1,1,1,1,3,0,0,1,1,2,0,0,2,0,1,3,2,0,2,2,0,2,1,0,0,0,1,1,0,0,0,2,0,2,1,0,0,0,0,2,2,0,2,0,1,0,0,0,0,2,1,0,2,0,0,1,0,0,0,1,0,2,1,0,1,0,1,1,1,1,0,1,1,2,0,1,2,0,3,1,1,3,1,0,2,0,1,0,1,0,2,0,2,0,0,1,0,0,4,0,0,2,1,0,1,2,0,0,0,0,5,0,0,0,3,1,2,0,0,0,0,0,1,0,1,4,0,5,3,0,2,1,0,1,0,0,0,2,0,1,1,2,2,1,0,0,1,0,3,0,0,1,3,3,1,0,0,2,1,0,1,1,0,2,0,0,0,4,0,0,2,2,1,0,0,1,0,1,2,0,0,1,2,2,1,0,0,0,1,0,0,1,1,0,1,2,1,1,1,0,1,0,3,1,0,0,1,2,1,1,1]},{"counters":[0,1,1,1,1,0,1,1,0,1,1,2,0,1,1,1,1,0,1,3,0,1,3,0,1,3,3,3,1,0,0,2,2,2,0,0,1,2,3,0,0,0,1,0,0,2,0,1,0,1,0,1,1,1,1,0,0,2,1,0,1,0,2,0,1,1,0,0,1,0,0,1,1,2,2,1,0,0,0,0,0,0,1,0,0,1,0,3,2,3,0,1,0,2,0,2,2,0,2,2,1,1,3,0,1,0,0,0,0,1,2,1,0,0,1,1,3,1,0,1,0,0,1,0,1,0,1,2,1,0,3,0,1,1,0,0,0,1,1,1,2,1,1,1,2,0,0,0,1,3,2,0,1,0,0,1,2,0,1,1,0,2,0,1,0,0,1,3,1,2,4,4,0,0,0,2,1,0,5,1,2,0,2,0,3,3,1,3,0,2,2,0,0,1,0,0,0,0,1,1,0,1,1,1,0,2,1,2,1,1,2,1,1,1,1,2,0,0,0,0,3,1,1,0,2,0,2,0,0,1,2,1,0,1,2,0,0,0,5,0,0,1,0,1,1,1,1,1,1,2,2,3,3,0,0,3,1,1,1,1,1,2,1,0,1,0,1,2,1,0,2,2,3,1,1,1,1,2,1,1,1,0,3,2,2,1,1,3,1,2,1,0,0,2,1,0,2,1,0,0,2,0,4,2,0,1,0,3,2,2,2,1,2,1,0,3,2,1,0,2,2,0,2,2,0,0,1,1,1,2,2,3,0,1,1,2,0,1,0,1,0,1,2,1,1,1,1,1,0,3,0,1,0,0,3,1,0,0,2,1,1,5,0,1,2,0,0,0,0,1,0,1,1,1,0,0,1,4,1,1,2,0,0,0,2,0,0,1,0,1,3,1,0,2,1,4,1,1,1,2,2,0,2,2,0,0,2,1,1,1,0,1,1,0,2,0,0,1,0,3,1,0,0,0,1,3,0,4,0,1,0,0,0,0,0,0,3,1,2,2,4,0,1,1,1,1,2,1,0,1,0,1,2,1,1,0,1,2,1,1,0,1,1,1,1,3,1,2,1,2,0,1,3,3,1,0,0,0,1,0,1,0,0,0,1,0,1,0,1,0,0,0,4,2,0,1,1,1,1,1,0,0,3,0,1,0,1,2,1,1,0,0,3,0,1,1,1,0,1,1,1,2,1,1,1,0,0,0,1,1,0,1,1,1,0,2,1,2,0,2,0,2,0,1,1,2,0,1,2,2,2,1,0,1,3,4,0,2,0,1,1,0,0,1,1,2,3,0,1,3,1,1,0,0,3,1,0,1,1,0,2,0,1,2,2,1,2,2,0,3,0,1,2,1,2,1,1,1,1,0,1,0,0,2,2,0,2,0,0,0,1,1,0,0,0,1,0,2,1,3,1,1,2,0,1,1,0,0,0,0,0,1,0,0,1,0,0,1,2,1,1,0,0,0,0,0,0,2,1,1,5,1,0,0,2,2,0,2,0,0,0,2,0,1,0,0,2,0,1,1,1,0,1,1,2,2,0,0,1,3,2,0,1,1,2,0,0,0,1,0,2,0,1,0,1,1,1,1,1,0,1,2,0,1,1,0,0,0,1,0,0,2,0,1,1,0,3,1,4,0,1,0,2,2,4,1,1,1,1,0,2,1,1,0,1,3,2,0,2,0,2,0,0,3,0,0,1,0,0,0,1,0,1,2,1,1,1,3,3,2,0,3,1,3,0,1,2,2,0,2,1,2,2,0,0,0,0,1,2,1,0,1,1,0,0,1,2,1,2,0,2,1,0,0,0,1,0,1,0,0,2,1,2,1,0,1,2,1,1,1,2,1,0,2,0,1,0,1,0,0,2,1,0,1,1,1,0,3,1,1,1,0,1,0,0,1,4,0,0,1,1,1,0,1,0,0,0,1,0,0,0,1,0,2,1,0,1,1,0,0,2,0,0,2,1,0,0,1,1,3,0,1,1,0,0,0,2,0,0,3,0,2,2,0,0,1,1,0,3,5,5,1,0,1,1,0,0,1,0,0,0,1,1,1,1,3,3,0,0,0,3,1,0,2,1,0,1,1,0,0,2,0,3,0,0,1,2,2,1,0,0,0,1,0,0,4,0,0,0,2,0,1,1,2,2,1,0,0,0,0,3,2,0,0,1,1,1,0,0,2,1,0,1,1,0,1,1,3,0,1,1,2,2,3,1,0,1,1,1,2,1,1,1,3,1,1,1,1,1,0,0,2,0,1,1,0,1,0,3,0,3,2,1,0,1,0,3,0,1,0,0,0,0,1,0,2,1,1,3,0,2,0,2,1,0,1,1,2,2,0,3,2,2,2,2,1,1,0,0,2,3,0,1,1,0,1,1,2,1,1,2,2,1,1,0,1,0,1,1,2,0,0,1,1,2,1,0,0,0,0,2,1,3,1,2,0,2,0,2,1,0,0,0,0,0,1,2,0,0,3,0,1,3,1,0,1,0,3,1,3,2,1,0,1,0,1,0,1,3,4,0,1,1,2,0,0,1,2,1,1,1,1,1,0,0,3,3,2,3,1,2,1,3,4,0,3,0,3,0,2,2,2,1,1,2,3,2,0,0,0,0,3,1,0,1,1,1,2,1,2,2,0,0,1,0,1,1,1,0,1,2,1,1,0,1,1,2,0,1,1,0,0,2,0,0,0,2,0,1,1,4,1,2,2,0,1,0,3,1,0,1,2,2,0,1,2,0,1,2,2,0,2,2,4,0,1,1,0,1,1,2,0,0,0,1,3,0,0,0,0,0,2,0,1,0,2,0,0,0,0,0,0,1,2,1,1,2,1,1,1,3,0,1,1,0,1,0,0,2,1,1,0,0,1,2,1,2,0,0,1,1,1,0,2,1,1,0,2,2,0,1,0,2,0,1,0,1,1,3,0,1,1,0,1,2,0,0,1,1,4,1,1,1,1,0,5,0,0,1,0,0,0,2,2,0,0,3,1,0,0,1,2,3,1,0,1,0,1,0,0,2,1,0,2,1,1,0,1,1,0,0,0,1,0,1,0,0,1,0,2,1,1,0,0,0,0,4,0,0,1,0,2,1,2,1,2,1,2,1,3,2,0,2,3,3,1,0,0,2,1,0,0,0,0,0,1,0,4,2,0,0,1,2,2,1,1,2,1,0,2,2,1,0,1,0,0,0,1,0,1,2,1,3,0,1,0,1,1,2,2,0,3,3,1,0,1,0,0,1,0,0,0,3,1,1,2,1,0,0,0,0,0,1,3,0,1,2,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,2,0,0,1,1,1,2,4,1,3,0,1,0,1,2,2,0,0,0,2,2,0,1,0,2,0,2,1,1,0,0,2,1,1,1,0,0,1,1,1,0,2,1,0,0,0,0,1,1,1,1,1,1,2,1,0,3,1,0,1,0,1,0,1,1,1,0,3,1,2,0,1,1,3,0,1,0,1,0,0,0,1,1,0,2,0,2,0,1,0,0,2,1,0,1,0,1,2,2,1,4,0,3,0,0,0,0,1,4,3,1,0,2,0,0,0,4,1,1,1,1,1,0,2,0,1,2,1,1,0,1,1,1,1,1,2,0,1,1,1,1,1,1,0,2,1,1,2,1,0,2,0,0,1,0,0,2,1,0,0,1,1,1,3,1,1,0,1,0,0,0,0,1,0,0,2,1,1,2,0,3,0,0,0,0,0,1,1,0,1,0,0,1,2,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,3,0,0,1,1,1,0,1,2,0,2,1,2,0,0,1,1,2,0,0,1,1,1,0,0,1,1,1,2,0,1,0,0,2,2,3,0,0,0,4,0,0,2,1,2,2,0,4,2,0,1,1,1,1,1,0,1,5,1,2,1,2,0,1,1,0,1,3,0,1,2,1,3,0,5,3,3,0,1,1,2,1,0,2,2,1,0,0,0,0,1,0,1,0,0,2,0,3,0,1,0,3,0,1,1,0,2,3,4,0,1,2,0,1,0,0,2,1,0,1,0,2,1,1,1,0,0,0,0,0,1,1,2,0,1,3,1,0,1,3,1,1,1,2,0,1,1,1,0,2,1,1,1,0,1,1,1,0,0,1,2,1,2,1,1,1,1,1,0,1,0,2,2,2,1,0,1,0,0,1,2,1,0,0,1,3,0,1,3,1,2,0,0,0,0,0,1,0,1,1,0,0,1,2,1,1,0,3,2,0,1,0,2,1,3,0,1,2,1,0,3,2,2,1,1,0,1,1,0,0,2,1,0,2,0,1,0,1,1,0,0,1,1,0,1,2,0,0,2,0,0,0,5,1,2,3,0,2,2,0,2,0,0,1,1,1,2,1,1,2,0,0,0,1,0,2,2,1,0,0,1,0,1,1,1,0,1,0,2,0,2,0,1,1,0,0,1,0,0,2,1,1,4,1,0,1,3,1,1,0,1,1,0,0,0,1,2,0,0,0,2,1,1,1,2,2,3,0,4,0,2,0,0,0,1,0,3,1,0,1,0,1,1,1,2,2,0,3,0,4,0,1,0,0,2,1,1,2,1,2,0,0,1,0,2,1,1,2,0,2,0,1,1,3,2]}]},"null_count":0,"last_update_version":397952032903790592},"p4":{"histogram":{"ndv":1992,"buckets":[{"count":7,"lower_bound":"MEFKS1JXMHQ3NFlVMW8wdzI4aEJEOVlIeXY1U1UxVFRYTzM=","upper_bound":"MEwzeUlYdHdaMjJQOFZnNDhEZ2UzVVBqOUxzVnQxSGlQRlRrMGxmT1ZndlFp","repeats":1},{"count":13,"lower_bound":"MGV0VzdYcXpXN1hDSFJJaTgwOHdNTXdBMA==","upper_bound":"MGlPNUZzU1NrUWlNUzBoQzRN","repeats":1},{"count":19,"lower_bound":"MGw0ODJrZHhMb1VVdEVKUjBnaWJUa3lyc09iQ2k2SGdzcHA3N28yemlkczQyRnU=","upper_bound":"MTA1VDVIRmZVOUZKU1RO","repeats":1},{"count":25,"lower_bound":"MTRNNGJWVXRZdWdtWg==","upper_bound":"MUlYa21CdFdKSjI5Um55Z0JYVnN0Z2YxcDRkT29GZ1ZLZzdscjMxOA==","repeats":1},{"count":31,"lower_bound":"MUo5ZW5tUGdLc1c0T1F4YW5ubm1rMUJRYXlmc1NsZmdKclc4dG4wa3Jhb2RGUlZKNUhTSHA0N1RKeWo1UA==","upper_bound":"MVgzN3p4eXd0V3pHOFQ5SWkzdWxVUmtjRQ==","repeats":1},{"count":37,"lower_bound":"MWR2NUs1MGJGenFybTRmWUF3QzdlNm9aUTZySUxPN0NCV1hpM1ZxUTNPdzdHRXZlOQ==","upper_bound":"MWlJeHc=","repeats":1},{"count":43,"lower_bound":"MWsweURDUHlWZHZPSVdvQURZMWtDUkoyVmdxMW0=","upper_bound":"MXFTYVBsaXVKWnFxRkM4NXFkWlVlRWlnZUtUd1h1czBm","repeats":1},{"count":49,"lower_bound":"MXVBZ0RlaTZONVc4bXY5bDdHMWZjOFVMWUk2cUt5Mg==","upper_bound":"MXZDTGxDT3B6aW00WmJtamRkSENRb1doUWh2MEl1aE9tczFrbHpRRDV2VlhQbE9hRXFENVFwUHkwV2pGcVAx","repeats":1},{"count":55,"lower_bound":"MXZYTjgyWWVrMGN4WEJIRmI2NWpVaDFrbmtMajZs","upper_bound":"MjNrU1k=","repeats":1},{"count":61,"lower_bound":"Mjc2V2N0cW9RcWJBbTd5bmpZOXcyYXdhVVlzQk1qeWZ0ZGhSeGVZYnVzSFVvWFNQSXZDeDlmYm16OEZ1QWRB","upper_bound":"MkFjbWVjMHJsaVR5","repeats":1},{"count":67,"lower_bound":"MlBaTGN4NTNrOGZrMHVsUlZ5ZExNdVhVUXJNNGZRaTZhOHZxSTdV","upper_bound":"MlZY","repeats":1},{"count":73,"lower_bound":"MmlaR2FjdGFISWh0bERPWXZaNUZOak95WlliU0dLREh3ZXRUc0QyNUFaTkFpT3Q1bk5nd1NzQko=","upper_bound":"MnZQYk51bWE=","repeats":1},{"count":79,"lower_bound":"MnlrN05uZ0s4VDFybEltN1BuNnBCR2hiT3Q=","upper_bound":"MzZEZDlVRFVhOXJPQUp0Sk9iNTd2WW5CWG1qMEFXeWR6UzVJOEFMdmNLdEdzY1Nka0E5UnVCcFY=","repeats":1},{"count":85,"lower_bound":"M0hvU0xkRHBES1JoREI0dGNpcEdlUDM3OXQxMkdKZUI4UzF4bXJ4cVdrVGg1ZGludk53ckhzeHg3TQ==","upper_bound":"M0pxM1NsbzdoZG9yWFB0Tm4yejFrUklHamFOc2NlYk9VZA==","repeats":1},{"count":91,"lower_bound":"M04yRjd0NndCS0NvUFhXNFk1Zkd4Sm5hcWkxZmJWNWRBM2wweXJRdGZBMVlw","upper_bound":"M1F1TTlqQ0swekU2b1JiVjY5NjRXVWFNS3VSTzNXMg==","repeats":1},{"count":97,"lower_bound":"M1RLcGJhYjAyYjFOU2ZhU1duTnY5dGZncjY1eDFYaEdwN3JCaXdIS0Y5QUp6MnF1Rk5NMGZOdjRnSkl6eg==","upper_bound":"M1plbGZMTHNmNw==","repeats":1},{"count":103,"lower_bound":"M2U4RmhwYXFIaEdiTVN5aUR3V1JxVDZ1WHpDd3U=","upper_bound":"M2wwQzd5SGZtVGZRSHhXb0Q4T2s2OGF0d0ZrNERlcHVsTVdmN21wRVZRTHZhUFlkSXc=","repeats":1},{"count":109,"lower_bound":"M2xneXdJaWdPbXlCc0doRGZB","upper_bound":"M28wZkx4THdiNFhkcnFh","repeats":1},{"count":115,"lower_bound":"M3V4QllabHlhM014bXdVbUlwZzBudjhENQ==","upper_bound":"NEFCR2dJdWZ4T2V6cnUzTVRXcmxMREhraVZkVUlBajZ4aw==","repeats":1},{"count":121,"lower_bound":"NEFuTm5vb045SGZ5Z2xJZmNqaHc2NkNiNG1qalp6eDJaN256Q3FXaUwzRTJ2Vkpia1pEU1RpT2dZa3kz","upper_bound":"NFZyaVoyaUhsUkll","repeats":1},{"count":127,"lower_bound":"NFdsTURZamdQRjNVZkVMM1dIcXhrZjJyeW5vTjFWbU83QjVqdGNGTHQ0aEJvR3VDUmZnR3RlbVRWQg==","upper_bound":"NGJBMjZHMmZwTUFiZVhFN1lxWnl4cTdqWVlrRw==","repeats":1},{"count":133,"lower_bound":"NGo2S2FnQ0RKTlZZZVhoTFoyRFVocktoT0c0UFFTUmpySUp6aA==","upper_bound":"NG5UdFlNSk03VXNv","repeats":1},{"count":139,"lower_bound":"NG5hZVp4ZG41ZDhRQ2VrMXlWYTd0VThJQVdRNkFLSlZaZVViTWJoOVhQVlVGMTd2OQ==","upper_bound":"NHdoWWg=","repeats":1},{"count":145,"lower_bound":"NHgyRUNFMkdR","upper_bound":"NTEyNg==","repeats":1},{"count":151,"lower_bound":"NTlCajZLY0lkWEM5NXByS0ZkdThkcDhIWnhXTDV4VmE=","upper_bound":"NUQwYU9JUTVNeXRNdE5wTkk3RTdLNWJoMUhSZ25PeUNTeEdh","repeats":1},{"count":157,"lower_bound":"NURXWGxoUnRLdW1LcjFOQWMxenRkZEhGRFROSWgwclNFOTZXU213VENVNGloS3I=","upper_bound":"NUw4M2MwVUg5eWRrWnUxRTZXOHFlV3pCWWJ2NzhodkxzaDNqRjNFVk0=","repeats":1},{"count":163,"lower_bound":"NU5mbUVkYWlzM3pjZG9TcWxraXRhS2VaY2o2N3ZYcnpHWERQSlYz","upper_bound":"NVFSdXVjU0p6TE0=","repeats":1},{"count":169,"lower_bound":"NVFxUUtBRmlBb2lmUzB1UW1RREJ0WERtQXJF","upper_bound":"NVZiZ0t1ZVBOYXhnY1o2eVlyNTlkdTBMOEtIbnlpWTh1dnJXRU05WEF0ZHpjV3l2WXV0","repeats":1},{"count":175,"lower_bound":"NVdLMEN0VUVXdQ==","upper_bound":"NWhlbExUWUVSUGEwcXdQT1FZMlduV0pQWE4xenpMY2J1TWVxdw==","repeats":1},{"count":181,"lower_bound":"NW5LdTk1MXJQZlNIZVI2S2F3bg==","upper_bound":"NXNOSFZpUUl1NUpRRVVOaU1EMjNDbnU4V0JZOVFxaW5tUTFLSGNka1NaZg==","repeats":1},{"count":187,"lower_bound":"NXRHTWtUVnd5aHdsYW42dDVPUnc5QVNuY2VZZkd3Y012VlI=","upper_bound":"Njc3SURGZFZHTmtpb2tRcnZuQndvTXJGV01tYkdwUGVRbWZsM0NjNXBsd1l5SjlYZFVsZQ==","repeats":1},{"count":193,"lower_bound":"NkJCMUlLZjdjRzU4azRtT2Z4RGRiWVZJeFF3OEk3eFZQa2RIWXVzejZsUFl5cWdJeXBVWnB5Ymo=","upper_bound":"NkVXTGxUSEthQmRIa2k3T0FCd1d3QWQ5SG02MkppaVAxcWx6TEpiUjRmRjl4Y2Joc0x6TWNiajF6cXk=","repeats":1},{"count":199,"lower_bound":"NlU1ZEFGcDBjWVdRSEJ4WmZjaWtQNlZnbzJh","upper_bound":"NldKR0JEaGhXYzlYQ3BqZk1MOUpYRWV6MWRFVg==","repeats":1},{"count":205,"lower_bound":"Nlo3aHBCaUVrZHlNNzVYSDFVSjNVMXkzME5KWkFSWFhwRVYyQQ==","upper_bound":"NmhuR2g1ZjhNQWJ5Qk5LcW9lMjdMNlVhSUY1VFF6Z2NvVjBzVVdRREY3Rw==","repeats":1},{"count":211,"lower_bound":"NmlISElLOFJPd0w2VFBnUjZ2","upper_bound":"Nm9OWWltdkpUUVBPbkhGVzRsWG9h","repeats":1},{"count":217,"lower_bound":"NnIyaWc3aTdPNG1CUm1SYmlPYmtxWDBlM29WclBibWVJc1d0M2NSblk5ZERjQXdKd1JtTnNiTkdNOGVHSzA=","upper_bound":"NncyT0M1OGZ6eGFURUpSdTlGZFBiemFKeTZIOVdDaHNFSlpwRVk1V21mOHJ1cGZ3c2p3Z0JpNnU3ZWd6R3I3","repeats":1},{"count":223,"lower_bound":"NnlhZTlKdDYyVWx3dEw5dnhR","upper_bound":"N0ZSVW1WMm9YTGVwV2FsT3czN2hHTEZrTTR4OG9XMWl4VklpbXYyd3BkUGxmc3Y1NEJq","repeats":1},{"count":229,"lower_bound":"N0hNb011b3VyYlFZamZYU3JIQnJPaWh1bnlMazVrdXhTWjdYNXVJM2d3c054cHlh","upper_bound":"N0wxVUsxTFJTTnpob0haUU9wVjN3OUpJQ0p3SkpFTVJMWDNSYkxmTlduREQzUkNSTUlBTEVKcw==","repeats":1},{"count":235,"lower_bound":"N1BaUm01bm9CYmN2SE9kNFZ2TFJORVp5VHlybUhqdGt4ODNpZ3NXajY1cTJDOEcwN1VYMHQ2emVQOUNyRg==","upper_bound":"N1JUMjdJUVFk","repeats":1},{"count":241,"lower_bound":"N1Y1QzduNTNGNDBKWGZ6ZG5DVlRkRA==","upper_bound":"N1doVjIxRFMwUk91d0Q3Tzd1eXA0R0MzNGxqZ0V2TExMSjFBd0FhbEJYMzNRUnVYUjlKWnMwTkJRZw==","repeats":1},{"count":247,"lower_bound":"N1hpNEhKZGhSbmsxSGw=","upper_bound":"N3RQYVBzajh4R2NzN1p6Skp4VXdDMWpsTGc1VmNKZTl6SGl6","repeats":1},{"count":253,"lower_bound":"N3hDcTU4SENKQjk1cnBOaXJuSkpsSHNDSG5mSFhZNWUxQTJLbTlF","upper_bound":"ODFpRmNxbjdsTmM5R1BBeENocE5OZ240ZGlycm5LbHdzdFNIMXhPSHgycXFzS2EwZjhKVnduYg==","repeats":1},{"count":259,"lower_bound":"OEFSYU1aZnNHS2YzOEJDdzdrSnI4R1JBdVRieDZjYTY3RE1hVUVRZXhmTUl0dldR","upper_bound":"OEN2a0kxZzdzVGtCS05XeTltRXBrUm5VMnZxVGRoeXM=","repeats":1},{"count":265,"lower_bound":"OEZseXhXUFpSSko4QU5FczQwTUlmejR3UEZyMm5ZR1h2cnJpRDdGeWdjNm0=","upper_bound":"OFJYTGJoR3FLQ3BFdHhaa0NuYmRYZXVtdlFXbExCbg==","repeats":1},{"count":271,"lower_bound":"OFRUVjd4cFlzamp3ZVFCRlA1Q1g3NDVTREllSUN4V2toeURnTGFHb2hrM0xEamY5NDAxUFN1YlBYcVlh","upper_bound":"OGFNVTgyckFZOWZsc09jRFZwOWhzemtXU0pRZGxlbExqNU1KbE1YT0ZYRFpX","repeats":1},{"count":277,"lower_bound":"OGJDeHB2SWlGc3dDdkx4TmhnbnNSVWhFdGsxT2JlQmpFOVVoU0tXTzNHdQ==","upper_bound":"OGdNNnNidmxZbWlDOHFCak9lbG5XOGJnMmUyd1NLTlpISnNydDJoQ3N5Ymt3cklWT2w=","repeats":1},{"count":283,"lower_bound":"OHN3b05rU2NISUQ4eg==","upper_bound":"OHpDdWZ2ZU5TZDU4a2daTHp6ZVEzM00xVA==","repeats":1},{"count":289,"lower_bound":"OTJTS21PSXh3M1E1N2xBOWNkWGhQSEZ0NGxYUjdpZzVldW81bnl3OFlxNHhVRW9i","upper_bound":"OTJ6OVBid3pIck1UYlFzd09kRU42UnBjTFUxVkdzWjUxNDFSTEhDMmk5dVhSVmxvZQ==","repeats":1},{"count":295,"lower_bound":"OTUwcFY5bGwzN0RkNnduVUV3anlTSzd0ckJhS0s=","upper_bound":"OUdIaGFPNTNqdGFFUmlOb05zVlJpNjhDOVE=","repeats":1},{"count":301,"lower_bound":"OUhYN3pQTWZVaGZxU3BtY3BBc2ZkSkRSSHdqbkJ3RDVVTEQ1bFNlUzg0OHR6WnVxV0NYMXB0Z0ozbnhKZ3hCRQ==","upper_bound":"OUtJT3FRbjlhTHJxbWZEWkdhTEZZMk9GWVczeWFDRUJh","repeats":1},{"count":307,"lower_bound":"OU11OVpCT2lySEtPeWE3c0FhWVZTZW9vd0JpQlRTNUR5cVZzV21wV3I4Nlg=","upper_bound":"OVdlTEVDZUxyY1dJa3hwcUcxSThvRk5yT1dkbkJUTXk1Wmww","repeats":1},{"count":313,"lower_bound":"OWY0WlZ2b3poSnZURnVWRVV0OE5VYjIxZWhiT21ERW9QVzhyYjFxM1RWQVlZbFFkSXVWRFRvcml0Wnhr","upper_bound":"OXB0ZzFURmFrbkg1YnAxbFVMaWRsN2hCQjBRTEFhM0NKcWpuTkM3Q0pJTURkZk5tajEycU9yTVNSbmtoUlo=","repeats":1},{"count":319,"lower_bound":"OXE1SHk4WG0xVmRvVGpFenRCeDE3bVl1QVE4dVMwV0h5","upper_bound":"OXoyZHZTRnZBTXpBc0N2ZVZEMW93ZU1FOHhnQWhjWmcwYXE=","repeats":1},{"count":325,"lower_bound":"QTRE","upper_bound":"QTljVFFPaFVUWGg5WGJ1OUl0eEhyUlg3b2hObHc=","repeats":1},{"count":331,"lower_bound":"QTludkRzOWNBZEl4Q3FCQkRzRUhyOXBmcGV5QVp3eUFOblNIVE9xdlRKT3c0UThQ","upper_bound":"QVVubEpEcVFhOUJxU1hIckRxT2JEWGFOU2U0eHV2SWpKTEEwS0twNlRSNA==","repeats":1},{"count":337,"lower_bound":"QVh4Tm5NYW1HN0xrb21hMg==","upper_bound":"QWNQM2ZZQ3ZBdWx4OVl2VTJMRnF3MTdWZQ==","repeats":1},{"count":343,"lower_bound":"QWc3ME4zMlZ3NmphQ0FpT05QQ0tkN004czBtbExzR2tvNXZteDVoSzFE","upper_bound":"QWlaYg==","repeats":1},{"count":349,"lower_bound":"QWxlQjN3OWlzOEl6SzV2M3JJdWtpZFNTNVhreEQ2TA==","upper_bound":"QXV5Zjc0VjNvallEWm5EdzFQbVhmc1c2aUd5SGZ1MEJVQVF4RmZFN3lIS011MFkyUXE4QkluellLWEo0R1pz","repeats":1},{"count":355,"lower_bound":"QXp4dmFFRldBU0dhS3NVWGVBbUpB","upper_bound":"QkV4NTdiY0ZZZHJBRE9DNTlSZk83UlZaZjFGMkVjSEY2YXllVVpFSFNlcFh4TlVub2RmUXY=","repeats":1},{"count":361,"lower_bound":"Qk55cDByb0Y4QVdVazlyc3VBM2xvSjNsMWEwcHk=","upper_bound":"QlRhS2lOQnR2M25qUE9TQ0MyeTZIOTh0QXZmazNBaklxQU5vT0NVNVNueUo4","repeats":1},{"count":367,"lower_bound":"QlduUzFmSUJVYjBONFZPN3luUTlKSWhCbnZJd2NpQ1RsS0RWaDJv","upper_bound":"QmxSZnhybk90azNqcjY4eXFGdUk2RHg1M1RrZnFsaks5VjE3UEFtODhpbElTanhk","repeats":1},{"count":373,"lower_bound":"Qm1VYlE2VU1MalZud0x2OXRKN01UQUxZelpHakZuUmlaSzJtUmJQbURScWRMbk9tZVZTT2VtZmJPcnY1","upper_bound":"QnE5YWg5a2pmeGVvQ2FqaVJrc1kwZGdkNkpx","repeats":1},{"count":379,"lower_bound":"QndJdzFXSlcxUHdFUWs=","upper_bound":"QzNGY2dRVkNxVnRXMjlzOHM2YURYWmMyb3ZHQk5SZ29VczA5NENxekh6ekFSUw==","repeats":1},{"count":387,"lower_bound":"Qzd3a1hWbFlIUEt3Wm1SZGl4d0N2T3NVNTF2bzBqMUdGVzk5VDdxUzI2bmJKSnhZMG4=","upper_bound":"Q1FBV21hcjVPR2llMFpydkdFaXFyUnI1NElqWWd5NVQwZzNlRzJOQlJVZkdU","repeats":1},{"count":395,"lower_bound":"Q1RFZmE4R2dFYVFubjdjdzdXcFNGWEVPaW9xOA==","upper_bound":"Q1p1VDEwNWN5OFJzYUxYWWxpVWRRWHkxM1Q5cmtudkxJWHBVZEx4NEt3YUJ2SQ==","repeats":1},{"count":403,"lower_bound":"Q2JGeFRDRThYSG5YNloxSU1oTkp3bUZjMzNJMEMzZmxtRFdEM3JsalNEWGNM","upper_bound":"Q24yR0s3RQ==","repeats":1},{"count":411,"lower_bound":"Q3BnVA==","upper_bound":"Q3ljNU1HeDIwTlVFeWoxZDQ=","repeats":1},{"count":419,"lower_bound":"RA==","upper_bound":"RDVyN0ZmZThMczFGUXIy","repeats":1},{"count":427,"lower_bound":"RDhUeFdEek53a3JESDBRekQycnU3bA==","upper_bound":"RENoM2I=","repeats":1},{"count":435,"lower_bound":"REVjcUp2YUI2Z0FZRTZTc01BUUg=","upper_bound":"REdjOVl6S084cVIx","repeats":1},{"count":443,"lower_bound":"REhPTjhZeml0ZTMzWWRwZ0kwRHRVRDlGQzZqWU8=","upper_bound":"RFZRQkxpWG5xN0dsTFRSM0djamM3c0tmbm1NYndCZ1ZQb0sxeWNuVGVZ","repeats":1},{"count":451,"lower_bound":"RFg3bWJFcVZpR1NHZEVBMHhPdkxyZTF4MENYNVFiY0h2ZkF1T0FEU0dzcW1ITVlMdEVaeG0=","upper_bound":"RGg1WlJMUlJsQWNYVFJFMHR3bThaMEtTWDc3V05GOUhCbDdUSmlCWUc4ZW03VkJGREc=","repeats":1},{"count":459,"lower_bound":"RGlTeUp0eDQ4YXFQbm9IODdvRnZZbmdyTnJZU1NJOEFYeFdUWEpTMlphSGg2WVY4SEU1","upper_bound":"RG1Pc1lxaUdWMmc4YVBLcFhUbmxweVVjVFp5dkcyMG5iMUY0NlRreQ==","repeats":1},{"count":467,"lower_bound":"RHFrQzFwcjRKdFhSOVU2NzB0aUZzR1F5d2lqbWFTY2VZV1Q2eVgxbjFTWk9wY2RJNm95R3FrVHhVUHV5","upper_bound":"RHdnSEwyWTdMaFU1bDBYckpHalZqenhBbHk4UHF6RlVOYnJUcXNLQkU1TUdQbndL","repeats":1},{"count":475,"lower_bound":"RHlmUkc4YUJLU0x6YU1vME8=","upper_bound":"RTFOTjQ3NGJxeDhMY2pXaFpjM3FzY0pPR0R2c3BDd3N5WWpSbkpneWM=","repeats":1},{"count":483,"lower_bound":"RThSMno2MFJQUk1Nb09oa2ttTHNjY01RaEdQZVNLTmIzR0lUQkFBRlVyZzFJaGJVZkZLa3lFWTZ3cg==","upper_bound":"RVBBWUNRVmtNUDl4V1hQOWw3QXE1eUpBN1pUSExFNlZ5MkVyQnc3dXRHN1Fxb0lxc0dIU0FTR3V6TkZ3NA==","repeats":1},{"count":491,"lower_bound":"RVFzTFpveVZIb2plMjk0Ynh0TEJOaGI1RENCNjQ=","upper_bound":"RjFaNVQ0OTJjMkdwTGtYcVFuSVdaTU51bnE2cGU=","repeats":1},{"count":499,"lower_bound":"RjNkUUprcDk5a3BXRXR6c0F4MHdZOTVqY0NPMXU=","upper_bound":"RkJYR25j","repeats":1},{"count":507,"lower_bound":"RkNtMFpha1Z2QlhxUUlrSHg=","upper_bound":"Rk5rVWNqcUM2VlFYUjQzNU1EZXZRVmlNWm9OemRTQ00xMHBmbnZTNEEySmRscXpxSWtmN0Y5bHRkUURw","repeats":1},{"count":515,"lower_bound":"RlJ2UVZwMTVMNDZFNEJXYktzMmxNbWhQb2llNXd5RWRCaHBwT3c=","upper_bound":"Rm1kTGQzUDBjWG5oc3dweDNJQ1BraQ==","repeats":1},{"count":523,"lower_bound":"Rm5nOFNOaVQz","upper_bound":"RnVwQUJVN1BxblZKTDJIcERZNHVKSzd6dElUZWZQNkdleDZZQXNkRVRXbDBXY3kwaUhTb3BOWEV4","repeats":1},{"count":531,"lower_bound":"RnZ3bkh3Z3F2eGoyT00=","upper_bound":"RzQ4T3RzRjVXaW5XeWd4U0Q=","repeats":1},{"count":539,"lower_bound":"RzhIMGVxR3BsanM3MWlwRlcxaFA2dG9MeVRVRXR1SkU0Nk5wZ20xQnpYQkV2OA==","upper_bound":"R01BaUZDYjRqUUpRcEc5VkVLVTFubVpRZHpjdkZicEZ6UzREazNTUHoxa0daekZsUGdaanFTclJjMG5oT2Y=","repeats":1},{"count":547,"lower_bound":"R1M3TjdTZ1ptbVo=","upper_bound":"R1lE","repeats":1},{"count":555,"lower_bound":"R1lGTWZKdTViU0U4UlFMa2phYWUxcERGVFVtaW96Uk5mbUo2Yk9udmJETlRKd1M0TGZ5akRNUXZQRTVkSFhCWA==","upper_bound":"R2EzeXRtSlkwTXpCOU81YzU4RXEwcHFKWUx2alNodmZXeVh1Q21VR3VBWVM=","repeats":1},{"count":563,"lower_bound":"R2JCc0h0dlRLZjdPQmo1aWNTSk5zNUxRTnVKWlN0MkxvbG9sMmRLWmlN","upper_bound":"R3RBd3Y3dGpxNjYxWnFZVVRrRDZnd3BheUc3","repeats":1},{"count":571,"lower_bound":"R3hlam55ZWN4SkVIdTd4Ync0dUdybzZkQTVmNzY=","upper_bound":"SDk4Z2tFbzdMQnlKZFAyUEN4N1VRMnlCSmRxN0VmOTdiME5TQg==","repeats":1},{"count":579,"lower_bound":"SEc1V2pETHhzMXNKZ2lPRzVQTFdWRklRZDU4MU5Ka21zSDJCRXZpb1ZPYVo4c0w5TTQ1NE5laWwwS1V3","upper_bound":"SFhTMkRmNkJraURTN0d3SklvQ3lvZXB6ZW15Z0ZqRw==","repeats":1},{"count":587,"lower_bound":"SGVndFl4QzVUOWdhaUdZMUV3bzZ0T1lzYVpvMGh6MA==","upper_bound":"SHJlTzNmd1JVbXpMTDkwTlpYdmVuM0NTbTRqZm9OUkpQYnlIY3dTckpwcGZ3ZjcxeFVCbTdY","repeats":1},{"count":595,"lower_bound":"SHZIS095RkhGYQ==","upper_bound":"STBCaHk1UGw5THloMFhwMGV6UjdpbQ==","repeats":1},{"count":603,"lower_bound":"STFDT3JWbVhSYVFTZUUxWTc0azljV1FUcVd3QkVnYXRyUk4yMUtTY2dpRnRocg==","upper_bound":"STUwang0SGV6Um1HUURzZzc1QnpMR1VQQlJJa2lIUElYbW1FbTd6V1JJWFpxb3NkOFEyQw==","repeats":1},{"count":611,"lower_bound":"STVLajlwbHBuSDI3eVRwQlNNRmNJWnVqMkp0enZONmV4SWJ2WDZVemgzY3AyRWVQWmZUVGpuaQ==","upper_bound":"SUJlNTdNVndQb0tXbDVx","repeats":1},{"count":619,"lower_bound":"SUNEQkZJTkRnSElSRGUxckNnNDJGNGJ2dXJEZ09tRQ==","upper_bound":"SUV1cjJkbHpKOE9GSjBCVUR6RlNrY041aklzMTVmekUwaThoTWt6RXhraHBQRjUwTG84MHRiM3lnSw==","repeats":1},{"count":627,"lower_bound":"SU5aM0RQMG02ZnBXNkhhRjlKQnhrN0NjWDZhS0FKYXdLanhtbm12Y212Q084N1UzSXRBYVFLTw==","upper_bound":"SVhITWlldEpSNm5EUGNqRExFTWtQR1ZralI2N3FvSFZkcTVlbWRBZU5CY3F3RGJ3dExaV014YnNBSUNwU3M=","repeats":1},{"count":635,"lower_bound":"SWg3dzNJME9YN1lyQ3lTUXZORFM1MEx4N1FzTXRIZE96","upper_bound":"Sg==","repeats":1},{"count":643,"lower_bound":"SjBVOE1GM09hb3ROWWJkSWRBMk5MZ3RMTjdSaWNpOTllSlYwVFV6b2RXTHRPNEhSWkhqZldMaXVCMVE=","upper_bound":"Skp2N0J6VURSS0x3ZzJoTGRINWkxWEVZdTVDbUw=","repeats":1},{"count":651,"lower_bound":"Skt0WUdaNnc3d2FkQXk0czRIdmtEcW9JMVc=","upper_bound":"Slo3VFI3RmxCYlVEQ2FxRlJxU1M5OQ==","repeats":1},{"count":659,"lower_bound":"SmZnYUxISkx4RzlEdGtQV2FjcGxPc1hCcG93dlpab0lwOA==","upper_bound":"SnI3VjhWUTY5S1oxYVZpS2pKdFBWeFh4Uw==","repeats":1},{"count":667,"lower_bound":"SndyeURJWVVJ","upper_bound":"S0FWY2Vlc3h2QXhjaHJRQWc=","repeats":1},{"count":675,"lower_bound":"S0JhOGhmbmxzZG8wQ2NyVWNoRzFsa05ueWZ1NXN1anU5ZERmekl4eA==","upper_bound":"S0lHZ2U1Rmx1aTUzeWx0NXUwbHFZSld0RHdBd3FyUE81TGQxUnBzMWlYV0JEUHZ5M3RzYUFjQw==","repeats":1},{"count":683,"lower_bound":"S0luN0JwSmg=","upper_bound":"S1VRbENWa3dLbDZUemdCTWJxNUo0dTY2Ukh2WGtNZjNyQkFBTVRSMDZyTWZmTm95Ug==","repeats":1},{"count":691,"lower_bound":"S1h5Q012bkdIVlZIejQ3allqV1g=","upper_bound":"S3FtMlpNSUQwY3NHWGpTTmR2akNTRlp3TjAxZ1BPcFpXeFptVHJnZFhkY1VqVjZDUmc=","repeats":1},{"count":699,"lower_bound":"S3pGd1Z1M2J6bWlJQm5aY3BINWFjR1NKdHdVdG9UdVNPUUJmM1oxb29NSWMzekZoOVpRTTlIS24zVnJyMks=","upper_bound":"TDdiWWIyTnBJeXJo","repeats":1},{"count":707,"lower_bound":"TEJ5WW1SM2c3OVgwZzM2c29WMEx4ejFsaEFjWg==","upper_bound":"TEo3bUs2YzBDREhONENUNVZtVmh0eHJSaEpsUk5KcHlkaUhQNmxiMWpxZQ==","repeats":1},{"count":715,"lower_bound":"TE1HY25PaERJbzIwOXNyV25XQ1lKSDM=","upper_bound":"TFVQeEkxUms3a0JpaW9adzlnUEM5bmp3cmNiNkxUVDZ4SjZvTDNOSnAxZ0lJQQ==","repeats":1},{"count":723,"lower_bound":"TFZjOXdsT2YzWHl1UTMzMngxdEp4U1JDZmlq","upper_bound":"TFltbXdzRGhPc2c5bXdwRjJwSVJMUHFFOVdROA==","repeats":1},{"count":731,"lower_bound":"TGRVRTNZODA0eDFvTG43UHNNS2JBVUliYnhoN2N5","upper_bound":"TG5DUUdkaGhPeHBsTldCbnN6eTk1WFRWRzVKSjZMWnc2ZTZHTlFld0Q2N1llMg==","repeats":1},{"count":739,"lower_bound":"TTBzbXRjUlhLVVJ3VGRkc1VpeWxHbjcycVFXdHdNZThDTw==","upper_bound":"TUJQd1Iw","repeats":1},{"count":747,"lower_bound":"TURqeFlyTXRxeEM2aEZFbE1QR3RReG4xVXZjWm1INnltYmVFS3ROekdrOWVZ","upper_bound":"TU0=","repeats":1},{"count":755,"lower_bound":"TU5WcFhsMkkyV3VZQnRaeGd1QmZ3azc=","upper_bound":"TWNkM2ZreEhLQk1HWFo3YVF3ZTlPY0pHUVhLZUgzYUo2WnpHZVlxVENIUTliaw==","repeats":1},{"count":763,"lower_bound":"TWNvQjIyeFZQN3BIZXR3V0ZOcVBhaEtOZVJMUjVPZk9sbWhwNVlLZWRhRlRHQzVzYmxqN1RON2tz","upper_bound":"TWlSRFI0b0J2SHNTZGNRRDBzazk4RGtQQXdzUGs2WGVmdzQ3eEZTdDZTNFN6cU16ZzZmcQ==","repeats":1},{"count":771,"lower_bound":"TWs=","upper_bound":"TXBobUlocUFwSGx6TVBQbXplUDM3b2xNWU1weHNUa09WandHdkhq","repeats":1},{"count":779,"lower_bound":"TXE2cldNUDZKOVN2aXBjNXhjV09yQ3FzZ213bmIwNlFIV2xkd1FydQ==","upper_bound":"TXN3SXNZSXV1ZENrZnlWZ0p6WjRZaWs2ZFJ5TDRwVmt2eXIyZzhWQ2VmdVFDYTROOTI0WlZpeW9WVldzMHU=","repeats":1},{"count":787,"lower_bound":"TXZJWE94UDJmVVRrMGg2eTNrWA==","upper_bound":"TjBETlhuaEdzZk56YUtWZnByR01ZMEJZanNRMmlsQnY2eVdOdE5NYXk0dUcxWWMxMG5NQU8=","repeats":1},{"count":795,"lower_bound":"TjBMcHAxa0REU1FwaTQ=","upper_bound":"TkVjTQ==","repeats":1},{"count":803,"lower_bound":"TlBUcE1hV3kyenNyNFlaSkk2a0NFSDduekE4ZktmVUlP","upper_bound":"TmQwSmRNZ2NRZ0dSRXEzYjZrUU9STGNUbHlpWmdZSm93NDRVeQ==","repeats":1},{"count":811,"lower_bound":"Tm1LVXhzMjRFazhGcDkzM2RUSHFkdHh3OGlkWEVFWVlyWjJR","upper_bound":"TnJxVW1qSEY5cUZQTFB2Tm92ZUxWSHJQUk1XajNSUGd6cnFqR0J2OHNickNwOWgzOGdzYmJSRzFkenRFYkRRUg==","repeats":1},{"count":819,"lower_bound":"TnU0TEM5bzZOdjNDeFUxQnkyR2VCRXdhM1R0YQ==","upper_bound":"TnppS0ZwclR3NDhDY2hSMDJqakMzanRuc2JiTFVTd1FsWg==","repeats":1},{"count":827,"lower_bound":"TzJPNnJxV21hVXNMTTZw","upper_bound":"TzlTZUVERVp4aHdpSHNINUU5ZmR4YTA4UDJ0UnpOMWdBWE4=","repeats":1},{"count":835,"lower_bound":"T1JYZkJ1dURNQmZzVkhQTFc2QXJZOHhEajFFazJDUWM0SG5XNFBheXF2aThucFRiSUhjS2ZXaVh5eA==","upper_bound":"T1hFN0x2UU01VkNaWThpWGZSQ0EyOWxZMllnVUdIR2FrbGlZR0lQaWZ5UXA0cw==","repeats":1},{"count":843,"lower_bound":"T1pYQ3dhdUY4d3VCS2RiSGJNUkgxdWJya3ZUdGtyVUtZeWNjV1czV20wZlRzRDhyR3BNdEhmM3B3aFA1","upper_bound":"T3F0VVlOclI0OWlsSXZZaWdmcDFaWXBQeTBJckdWUVp5ZWhxZ3puMFgxTmZsSTBySWxFUGxTa3FXRkk=","repeats":1},{"count":851,"lower_bound":"T3hDOEk=","upper_bound":"UDk4SlVaendadEk4S0NlQzEzekZZc1U0Wk5PWmI1SQ==","repeats":1},{"count":859,"lower_bound":"UEIyMUtRRE1uQk92ZWlCazRaTw==","upper_bound":"UEpDaWZWdkFTR3lOVGEzMkw0NlUyUmgzckc1OEJNemRXVGFHeWNKZg==","repeats":1},{"count":867,"lower_bound":"UFYzWnVkZ2xQT2E=","upper_bound":"UGZKZWdqTHRlbGh0UzJZeVRQTWZtcHVB","repeats":1},{"count":875,"lower_bound":"UG5RU2pIQ2laUEQyVDNIa091azI1N2pUbDh6Z2dadk9aM05RU1ZJY0M=","upper_bound":"UHNmcEpTVE1xbUQ=","repeats":1},{"count":883,"lower_bound":"UTNpV3lIcHdIeDhsQU1kdDV6VjNMZXBhb01kRFJsd1B1S1hadUFsU2RB","upper_bound":"UUd0NGhDMXh4RFFQMks2NjBLdVBZSUpRcjhkU1RsYkFYR2t4","repeats":1},{"count":891,"lower_bound":"UUkwVERhOFRnbXM3MDQzN205VEtLQmtpWVM4OEJicUs4U2xJMmRlZlhJUnFU","upper_bound":"UU9nanlaeVJESE5kOGRmcGtPcEdq","repeats":1},{"count":899,"lower_bound":"UVZtaFdHWk45UktEbHRGTnhWaXZhR3ZQaFVweVVI","upper_bound":"UWo4aURyTHk1WTdCQWVPUnd3bFFERHBhMlFxejNqWGNnRVh2WWp6WnN6SzdsdURUMHJLbHho","repeats":1},{"count":907,"lower_bound":"UW1oT2s3Q0xwT1hUaHM5UzJ4UnhOdnJIMERrdjRCejBoNEpyS2V5VVYxdlNJ","upper_bound":"UjJBUnI3RDNlY1VEUzdxTnZzVzY=","repeats":1},{"count":915,"lower_bound":"UjV6MzQzbkI4ag==","upper_bound":"UkhYbjBtcmlYbEFPZnNWSUNSY3o1ZzY0","repeats":1},{"count":923,"lower_bound":"Uk16M0s=","upper_bound":"UlJ3MVdYNFlGVWNkQXQzRjlFa1lQV0VSMTA=","repeats":1},{"count":931,"lower_bound":"UlpMZWpNMzZDRWdtYnJPV3BRdGJtZmdSdTRwYXFMODRpandXWnZRdFRBUnNyM2VJ","upper_bound":"UndiVkxpUU9UVkhKbFY4RGtBc015c0dBUQ==","repeats":1},{"count":939,"lower_bound":"UnozTWVYdjZWajZUVHJsRGdVVFhQaEx5SFFLaA==","upper_bound":"UzdHNVdiQ3VuWA==","repeats":1},{"count":947,"lower_bound":"U0FVNmcxRXIzSzVCQTZSM1htWVFpSlM4d2VEcHpNUjdoc2p6WDN6M0QyZkJIN0YyZlF3OFY3","upper_bound":"U0h2WVBYaTRqY3hRakRZYXVF","repeats":1},{"count":955,"lower_bound":"U0p1TjY=","upper_bound":"U09BMWZLUm1ydW1Icm5QdUNTWlhtN3NoWGhudG02ZEpGOVc3OHc2TEl3NFdBMkhaa1V4","repeats":1},{"count":963,"lower_bound":"U1BsZDdFUkI5SGpyaEZlYVdFZFA5SXF5RFdXQTNpT1Z0RmVTSw==","upper_bound":"U2kyTE9wSGQ3dHE5T25EWUhXQ3FQc1kzZEtDVThyS1JveE5qcVc4U3JYM0lpa24=","repeats":1},{"count":971,"lower_bound":"U28xZ1FlWHdHWllRVGpZbG5NckNuUkNO","upper_bound":"U3JIY1RsbjJYRFZtRnNGSGl3Y0hLWDZLS1ZWRVJnaVBxRXo=","repeats":1},{"count":979,"lower_bound":"U3VURWF6cDN3enVVYWIzSWZ2WkhJYTFNUnJqTFRxMng=","upper_bound":"VDA2VXRpTmxXZk5PUU5lbkRqNVVQbno3QVg4Tmtuc3NOWTd2MERDdzN3SUhRNDh3OXdKbHU=","repeats":1},{"count":987,"lower_bound":"VDBUVklIQlQ5SWJnbHhoZnUzSmVMOXJhTmI2VVNSM3p0cVh2d3R4VEE=","upper_bound":"VERlZmhQcVhvQ0pvMnZ5SWprME5uaFR2andXd1V1SXh1RE5EUUNWUEYxVlFoQjl0N05KaHNXMmloOTBKY1o=","repeats":1},{"count":995,"lower_bound":"VEdzV2czUFBFNDJBdFNOZ3lT","upper_bound":"VE1hSGlzRzZXOFVBY2k1OThhQW56djZPUGc0WFk4ZXJNaUpwVzcxRDdLb3A5WWNoak81c0k=","repeats":1},{"count":1003,"lower_bound":"VE90VA==","upper_bound":"VFluampJeEtONjdIWUVJZk1PUkpEb3BmenpiMDc2ODF1UTd1Q0ZPcXdRQXFFbmk=","repeats":1},{"count":1011,"lower_bound":"VGJvbWFvNDlMMXlWemZVaHVBck50Q09mMExHM0c1MGdEeG93","upper_bound":"VHNSZko3TE1aUGF3R1lqZW1nZ0o0OFRiWmFmZW1PUkRmd01MbmRJR1hqeEV1NEh3QUR1bEZxVk9ESQ==","repeats":1},{"count":1019,"lower_bound":"VHNTWEx2amJUc3dmUjlQdVlIZVJZdTM2SVVPYUFmZDI=","upper_bound":"VTJnWkRlYW1pTHhlSFBDdmJwMVMwTHhud1U=","repeats":1},{"count":1027,"lower_bound":"VTVYUVFodlhROU5oY25LTjlVMmtmTVFhOUw1WHRKTlpPQTRDazY1d21wVGVDdWtsbzBWVXNxZm0zNzU2YQ==","upper_bound":"VUIzZXF1VUlhMmllbVdHbWxPcXhrZ2ljbEtVeg==","repeats":1},{"count":1035,"lower_bound":"VUNmSXpRMEVzdGhyR0RZNVE4UzN2eUl0TE5MZG5VTU5DWmpmQXl3WEw2","upper_bound":"VUZj","repeats":1},{"count":1043,"lower_bound":"VUhpdGxlck8yNnBwOE15MUo0R3lBUVA1Skx5eEZhY1YxS0JicjVFZnU0dDZKT0xiUkFCZQ==","upper_bound":"VVZJTzF2Y2hi","repeats":1},{"count":1051,"lower_bound":"VVpzV01QRFVIOTFzYU9CYjI4dE5NaUtoME1XemZjdkltbkxZTUpr","upper_bound":"VWhrV0ZqZHYwMEJiUlNBU1Jpdk5mZ201WDU0Uzh6UFNqMnpjWGhwZnJSckdETWZyV3d1TG9NaGcxRDlL","repeats":1},{"count":1059,"lower_bound":"VWpabEJ4NGwzYkVraUNaR01RdThad1k5","upper_bound":"VXRkemdDYnRJR2tQVzREejZLc3VKUlA=","repeats":1},{"count":1067,"lower_bound":"VjVIbmhSZmVDdDg1VElzSW1DTTh6Z3pQTXlNdjlRclo1VDR6M2k1RHZFS2Z4bzdNTTNUMjVCazYy","upper_bound":"VkRjWGw2aQ==","repeats":1},{"count":1075,"lower_bound":"Vko4T1Y1TndQNlAxcGdMZjJYcTNqQXgzVndMSXViZDJYUUdDag==","upper_bound":"VlVmMmQyWW81MTlyUlhvcHpOU2VXdnloUEFpMjlWMzBZOVQ=","repeats":1},{"count":1083,"lower_bound":"VlY5VnVvMzkwazhoaEhTWHE0T2pQaWdsakNYRzJOTXBJUXJTaWdEYTdaQzdQNGFqVkhwTDY=","upper_bound":"VmE=","repeats":1},{"count":1091,"lower_bound":"VmVTVTdHZw==","upper_bound":"VnVyRGNkRWpPeFE1SHVMRFhxQk1NdmN5RjlKSzhHSQ==","repeats":1},{"count":1099,"lower_bound":"VndYWXpVOE5YenNsSE9hdDRRaXlVdnJHbkN4RlhWZWpNZTliWHhtMmtTWDlPbjZaRlBwSw==","upper_bound":"VzRvZ0FidG96U2ZQVFlxSnVHU1J2b2hnSGlmbHFzUHA0NXBXam8wQkdxdk16d0I1Y2NoemdFb1BNa2VjRQ==","repeats":1},{"count":1107,"lower_bound":"Vzh1Q01wMmlXd2lnNGwwbDJxd3U5V09GZFpITlBWVkdTUWdDRkhIT0lnd2g4QQ==","upper_bound":"V01ZMmp2SFViazdXVw==","repeats":1},{"count":1115,"lower_bound":"V1NoTlc5Y21yd0d4NWRFOFl6bVJySEtNVGdQT3dBTUl6WFkxaHNtaFNsOEtZVmFGZURQRw==","upper_bound":"V29FN2VReDNQaVdTMW1EdjBETDNTVDBJZVRmZjR4bjRGZlJmUFpyaHpXV21J","repeats":1},{"count":1123,"lower_bound":"V3BNaGVvRE90bkhpRFJKZFpUbk54SEl1cHF2Y1FTcXRITQ==","upper_bound":"WEdDRkJ4ME5hTUNBeDBIN1g1WWw0UVB0NWlqZ0VtVHd5","repeats":1},{"count":1131,"lower_bound":"WEdPSjhlUWk4Q0xaRU9SMGNCZGVEMURQRWxyS3M1YWVaTHNTbDVpcTdZOA==","upper_bound":"WEwwVUY4VDV3cDF6TEVVbFJHSVVjN2JTYXlpaEVlQUk2b0ZKMA==","repeats":1},{"count":1139,"lower_bound":"WFRpZ2FZMnExejBJQVBoZnVyenVTdGoyQkdLMjNRS1FTRlhROVRqWk5sNmU=","upper_bound":"WGpvMWtOdWFVZEF2bTF2OWdpU2d1Mw==","repeats":1},{"count":1147,"lower_bound":"WHE1alU0SG1NaG1xMUpOVERhc2xnbW9xSlFSZjd5N29QNEpsTUJXdQ==","upper_bound":"WUdHYkFnT2JDNkE4dHJac0dBSFhxMmEwb0tWV1ZyOHdCV0xCbWV4Yw==","repeats":1},{"count":1155,"lower_bound":"WUd0SHJjcHM3RUxtd25DNWRVanBlWG41OG8yQVk1VA==","upper_bound":"WVEyaw==","repeats":1},{"count":1163,"lower_bound":"WVQ5c1NyNk5ValVSa2FaR1VJN1I1cVo0dWtWbHhHRmNjd3N0T3dIWDF1OEF3TlRBbmdGRQ==","upper_bound":"WWVRSXRBbmtVNkE1bWlDZTBSTnF6Q2tjTVJEVkJLeU95RlkwWmFTUjZrakZLODRmVG4=","repeats":1},{"count":1171,"lower_bound":"WWZhVzc2eTV3T1hUSXMzQUc=","upper_bound":"WXJJUUl6QllYYlRsMnI4QkRpOXdjM3phbkNweFFvbXlLYzZNSE1NSXFtR3A0TWtKRTNZYVVt","repeats":1},{"count":1179,"lower_bound":"WXNkRmh6TWw=","upper_bound":"WjBiOFZnc2dTczk5c1VhUlIxN3pxMHB2cXZsTmk3M2pnSk0=","repeats":1},{"count":1187,"lower_bound":"WjE2ODhIVEFvVkRoWGM1b2p2","upper_bound":"WkNLQTRic0d3Rk85b2ZpR2NWbXFLeThTZm1EdzRrYnRGRmYzSzcyR0g2OEtOeHBCb0w=","repeats":1},{"count":1195,"lower_bound":"WkdmMlRuT3RVOVhtMWNsTnZ3enFuazZDbWNXVzZ1UGF0M2s4cjljcWVCbEhM","upper_bound":"Wkp3cmtPM0IwalIxTzVKZGhPaTEyQ0k4RjQ2NE1tWDZKTE1lcXlBTlR5V2V4SWg=","repeats":1},{"count":1203,"lower_bound":"Wk9nOGV2UDVHZHJ1YlIyZnpOMmVUUGI1d3RCQzM1V2dvekEwaXNsWE9YcE5yWjE4UXEwNDNDaTA=","upper_bound":"WllqWVNjR0V1RkFoUDdtTm91cFg0SDRjUWRGalgzNGxL","repeats":1},{"count":1211,"lower_bound":"WmFtdUtzb3lCN3lDOXZFakxacWU5aA==","upper_bound":"Wm9uYVhx","repeats":1},{"count":1219,"lower_bound":"WnFNbTBhMno4djZsd1RjQVRmMHRwWkp1VktIbFBEOTVoaTVSMXc3ajVhYnVEVk1iSDVkQWNnZTg1Y0xhV0NZ","upper_bound":"YTBQaGE0ek94VQ==","repeats":1},{"count":1227,"lower_bound":"YTViZ3ROcVBMZVZDc2tJNjVWVUtKbTFNbWVQZFVvOUhmNGRmaXQ=","upper_bound":"YVVFd21EcGtS","repeats":1},{"count":1235,"lower_bound":"YVl0MnZjTzRXN2RMelN2ZlZRdUFHSUpyNWpkYW0=","upper_bound":"YXA=","repeats":1},{"count":1243,"lower_bound":"YXRzdUFWUWJzcktkaEJWdTl1MXZHT1pBbEx3SUdORXY5ZXhvOVZhMlJGbUxvZHc=","upper_bound":"YjVMU2xua0w0Zw==","repeats":1},{"count":1251,"lower_bound":"YjVxRktyaXRBdkVxMWN3eHh6UFBzdHQwU01RcndDT2FGR0U2a0NPMGRVTmZSOGdBMm9SbQ==","upper_bound":"Ykk0NkI=","repeats":1},{"count":1259,"lower_bound":"YkwxWUx2S20ybFdtbnNzVVdvQXBtZQ==","upper_bound":"YlRIckJGU1hBMmRjbjRWNERhdVpHQnZpS08xRGhWUU81eWtBR21pQzhMWjlnUFY3ZDBqRA==","repeats":1},{"count":1267,"lower_bound":"Ym8zWFcwQ0l3cXFGZ3hkajdvYTJGdUlLMmZ4QW1CMGxaajJrWWxiUW5GWDI2aHdXQnpSdkx5V1M2TXdXdQ==","upper_bound":"Yw==","repeats":1},{"count":1275,"lower_bound":"Y0I1T2tYWnYwYzZQallrcUR1NmJkcnZmYjY0cjBM","upper_bound":"Y2dXcENjY0FObFhvUkNnOXlNNXRWV294aXljTE1UZk04c2dJeVNuZUNVck5iNXZYc3BPZkc=","repeats":1},{"count":1283,"lower_bound":"Y2hLTGUwZk5sTHdLdXVrNndSMnZyUjk3bk9SSlVKS3V6RkxJcmI5YUU5dUllVlowR3M0VEJtbXh4ZzZZQ0R2","upper_bound":"Y2x5ZklLZGtm","repeats":1},{"count":1291,"lower_bound":"ZDFZaGRDUHJIV0F2THJhV2NLeWFMTlRySXBmeVZ2YXBSY29zMTkyYW94UEdSZkxmWA==","upper_bound":"ZEZKREFOcWo2UkM=","repeats":1},{"count":1299,"lower_bound":"ZFB0TGI5QUlDQUIyeGhPNWhIMFV4WWVsa1hkSE1ad3o=","upper_bound":"ZGRQNzVPdllVeTFRa2NzMzYzbGNxN05CRlpwRFdBTXdIRmgyblI3RExqRQ==","repeats":1},{"count":1307,"lower_bound":"ZGdJUm8yRGRLQVlwOHF1UDBkbElPdzl0ZVR6Z3VUMDM0UU1ZSklDeVJucEw2VktUZWd4NTF1Tw==","upper_bound":"ZTFXQlVkbDJkaA==","repeats":1},{"count":1315,"lower_bound":"ZTU0d2NQcTg5bHFvNWVRTGUwcjNsR09YOW1kQ2o=","upper_bound":"ZVNRSHRJMjhF","repeats":1},{"count":1323,"lower_bound":"ZVlHTVg=","upper_bound":"ZWxySUZHdFVtSlNGZUxTYzBadHI4QzIxSjhKekpMRzM3RXpmNDBLYXhMYXBIRG8=","repeats":1},{"count":1331,"lower_bound":"ZXNLMlhQR3BKeTRBUzJtYUFDN2JTc0o4VUljNWFNczQ1QkRLUHZrMEpmczNhR2tOUHE5Yk1OaU5qOGNXZWJk","upper_bound":"Zg==","repeats":1},{"count":1339,"lower_bound":"ZjFNaXBWTkhzYXc4ckRwUWRBZ1lXSlByM252U2xPRXM2MzNBaVN2T0Q4T21xSDlTYzcwclcyZXhydWlDQkg3VQ==","upper_bound":"ZjM=","repeats":1},{"count":1347,"lower_bound":"ZjhWV3RDZ3lGT0Y1dEtnaDNQc3hjQTlraHRQcVJmNUNuRnBPYk82bDdpSzZ5cld2SUtQbk9KNllU","upper_bound":"ZkhOQkNhWEszWUZMMk9ncEdCSUN1TElzU1FoT1A1VUJFZGJ2NFM0RQ==","repeats":1},{"count":1355,"lower_bound":"ZkxLMVRBVWYxNlVvMHAydUNFSzkzb3B3V0w3S3IwQ0xKMXZVbkpHUG41N2VPSUlDRVpYWnJKZFpudVdNb2ViNg==","upper_bound":"Zms2emk5QjJ2Uzg5MmZKZWpOVnVRZlJoQXRuSFBQSXZaUmI=","repeats":1},{"count":1363,"lower_bound":"ZmtKZHZWcDFCZWFWNEc4WVRqM3J4TQ==","upper_bound":"ZnN3dENyYUc4czNaZktUYnJWSldla1pENGlLZ1lFeXBhU21S","repeats":1},{"count":1371,"lower_bound":"ZnZvU1Q=","upper_bound":"ZzJhQmdpaE1p","repeats":1},{"count":1379,"lower_bound":"Z0I1UXRDNWQ0RmVIckp2aWQxejJJTGN6SWZOQnZmU2pCOGR6VnNuSVdDbTI5RWZhQk5qMThEWGg3ZzNzTWU=","upper_bound":"Z0VkZFhVc3F4ZkVNT0NwRVpobjVpUVdScjgwMVJDQm5wQjI0VUtObGRNbVFqbU9Zb2o4bXphcWNKc0ZCbkk=","repeats":1},{"count":1387,"lower_bound":"Z0ZveA==","upper_bound":"Z1FMODhHQnJUT0dieVUwYWVVWDZkNm1Mb2Y2aW9SWmE3WHAyQTJkbWJlM2l2MjNtbEZk","repeats":1},{"count":1395,"lower_bound":"Z1JiQmxJMWwyajN3cENZUmp6","upper_bound":"Z2I=","repeats":1},{"count":1403,"lower_bound":"Z2JDSzFJTkthUzNGS1dJU3AwNTZnUHlXZ1lqcXQ=","upper_bound":"Z2ltZDR0ag==","repeats":1},{"count":1411,"lower_bound":"Z2tPMHR0WTlQTEVOdTJhMzY2MTFUN1lhUGZLUA==","upper_bound":"aDNCS0d3TGZ2MXlFZUFvVkdBeTA3RlJ4cA==","repeats":1},{"count":1419,"lower_bound":"aDNFN2hOVzNmM0JZbEdCdWQ2c3NlWE1IbmRaeHBGTQ==","upper_bound":"aEpHckI1R2c3V0w5ek5FNENsRg==","repeats":1},{"count":1427,"lower_bound":"aFFIaHJFM05pcTJIMmtrT0NHMnQ=","upper_bound":"aFk=","repeats":1},{"count":1435,"lower_bound":"aFlnaEd1QXIzRHZkbE8zME5ad1hJTTNrT2VKU2VISEFDaU5OVkxKUnV6dmc4czZpVw==","upper_bound":"aGx6Z0VINXFmV3BYSXYzdTZ0YjBROFNhOVJvdjJ6emRRY3JNR2dhZjJtNXBBNzVlM3ZQMExX","repeats":1},{"count":1443,"lower_bound":"aHI3aXFSZm9tandJNE5iRDU5ME83ajU5UHlrcElWQm1yaTEy","upper_bound":"aTB6dVVPbjFyMnMxMnVHZm9VQ0hGelBNVE5oVUl2YlliSFJ6N21oMjNsUzZZOUVDVUdVa2hDS3BYOXZ1STU1Rg==","repeats":1},{"count":1451,"lower_bound":"aUNJMUhOZnJLbWhMRlNBU1pSb1JqOFdta0FBdlQ1WFNrVFVQM0VrSklHTXhPaUNrREZa","upper_bound":"aUp6cDI4eTJDY1JIOTFMcTFicXJ6WWt4U0tnRjQ4QkNNclRQRW1rQQ==","repeats":1},{"count":1459,"lower_bound":"aUw4VHVuVWZuQ1JBNnlmSjJtU1JqZ2NXYWJGZA==","upper_bound":"aVRHc0lvakI0QUJPWnhscWE3UVZZOQ==","repeats":1},{"count":1467,"lower_bound":"aWFPM1pSeFZNWFg4OXlGU3RlaEQza0tRb29rZkQzVHhRendna0NiVFNBRFRKNFI3Nlhkd3dUdHg=","upper_bound":"aWZCYg==","repeats":1},{"count":1475,"lower_bound":"aW0wQ1hQQmxNaHlBeE9lcTA5Tk9NVlJpcG1qMnNnM3Y1cDZNcTM0SFZtSVU=","upper_bound":"aXlkQVczRU0=","repeats":1},{"count":1483,"lower_bound":"aXoyODRXdVFuMGNVSlduMA==","upper_bound":"akZMdTZPb01hMDFUbDVoNzVyS251bk5QUDdlNmNlV1hkcVdkczRscE9J","repeats":1},{"count":1491,"lower_bound":"alB2YjdKVXgzekh5dkMwU1NyTWJmMnk=","upper_bound":"amhUQXc=","repeats":1},{"count":1499,"lower_bound":"ams4WjREZEwwYXBnb2RSRmRRZ1hBcmRJcjdDSUw3clFJ","upper_bound":"a0NUMDY2WW1SV1VlNDdmZjFkWWUxZ3hUWnBUWDFDdUczeWNMSFhZYUhtRUVJdGtmbmREbTNpQUIxRQ==","repeats":1},{"count":1507,"lower_bound":"a0hQZjM5akRkem1CZFJLclRneGVFaU1jY3J6Nm9mdk5KMA==","upper_bound":"a01wQ2hybWJTbzVYRmZ6ZTVBdUVicHVpU2FhNFg3U05mVE94b0lYRlI0ZzN1T1h3djNTMndvbUp2SUdacXJu","repeats":1},{"count":1515,"lower_bound":"a05iQTM2ZDVCSHh2R1dLMVdmY1ZsYjc4U2lnQmhXODFSa0h4MnpoWUVwV1pVSmRDMlp5anJvRDJsWFIyVg==","upper_bound":"a1RsNkdWaGlFVW00emNqYW1oOHpBSVZCblQ5bGd0dmM1Zm1KM2wzbllneg==","repeats":1},{"count":1523,"lower_bound":"a1ZyVTFLdE05YkgybFNRUGx0V2RJbXVGR2hoRTJHWlcwZkJPMmlFVGdhb09ZemhoMlRqaU1KV1RXT2FSMW9Ldw==","upper_bound":"a2owajJUdWliUXZBSHNxRkpoUUhhZkh2SDN3SXZGT2R4amx2Z2pSSTJic3RDTm4=","repeats":1},{"count":1531,"lower_bound":"a215UFBHT2M0ZA==","upper_bound":"a3pMbFk3bUJuZ1kwUmY=","repeats":1},{"count":1539,"lower_bound":"bDBG","upper_bound":"bDJtTTE3V0NMckRwb3I1WWRKQjYwUUUxb0JJSkI2RWZCUWk=","repeats":1},{"count":1547,"lower_bound":"bDk3V2REM2pUa1JUaXJYeExCT2RJdDlUWUtXNndrRXVHdUFIVVk0Tg==","upper_bound":"bEJoNw==","repeats":1},{"count":1555,"lower_bound":"bEQ1T2l2OTA3TE9IZEdPQUxpTg==","upper_bound":"bEdqM0FxaWw5emxCVnlTdjVuVjdaOUkwTjJGaTFlUXJXNw==","repeats":1},{"count":1563,"lower_bound":"bEpwMU5TZXpU","upper_bound":"bFk5VVY2cTdMMGptcnloWXlkWGtaME1WOHRUT0dIQnFFT1RYaTNn","repeats":1},{"count":1571,"lower_bound":"bGFHeEV6VTJickR2ZHlGUndKVEZ5SWpKU1JNQjVDd3ZsaVE=","upper_bound":"bGNKQXM2akQzbkVMZ2dWTGNiOFRIY2VGVEQwR2NwY28wcFFHWjJ6SWlDUmEyMndYQ2VXUDhDMmJMZ24=","repeats":1},{"count":1579,"lower_bound":"bGY=","upper_bound":"bTFZa2xPZmRPbHBlb0FRYnprUkNJUkQ1ZmpK","repeats":1},{"count":1587,"lower_bound":"bTFmQTRCb0dFUTduVUNLaHV0TVQzZm9W","upper_bound":"bUNCRnNiSWFHZHNKbzR4OUEyZDlhSUl0TmJ2RWxnRXBEcGJlaUZHbktoOA==","repeats":1},{"count":1595,"lower_bound":"bURkdHNN","upper_bound":"bUxSamNVanpxVW50cENZRUxJSVJPQ2ExdWhhOXlMYkluemtQVXFHNzlWSg==","repeats":1},{"count":1603,"lower_bound":"bU1SSWdTY1RodjRhakRlTGg4aGhWSjBZcVFja2d4Mndlc0dOUXRpRzU5bzA=","upper_bound":"bWRSZkpXVmk4TWYwUHZ2SEhXOUJGSERKYXAyNUtwYWIwNXJTZUNaMnh5M042WG51dmw0YzdKNk52MA==","repeats":1},{"count":1611,"lower_bound":"bWRSczd5RHBWTTBvdGxJUTdv","upper_bound":"bXJ0QVljNWhvQzA0MHNTQ1dlNnZtdWxwRDA2Q0ViTDVwZzEzdjNKN2tGQzk=","repeats":1},{"count":1619,"lower_bound":"bXNkc25HbkxjenFVUUxocXZ2Vlk5UkxObjBiWFNSd0ZGc2I3RnhYaURtd1FXRE5peTBvWg==","upper_bound":"bklCQk5jZGczSTRFdFE5Zw==","repeats":1},{"count":1627,"lower_bound":"bkliMUpaaE1rYzdwb3EwVkRQWGozZFNwdVNQVXR3WDdUZUwzZHg1dTJVblJRWlZoaTk0cnZrTjhqWlg=","upper_bound":"bldXUEZBUE9HbXdHYVRtQjhI","repeats":1},{"count":1635,"lower_bound":"bmFzVlhzOWljaDd1VXk4VVpDQWExblFQTQ==","upper_bound":"bnhXaXE5YnpCTVYzTWZNYTJsNnBnT0tCMk1GMQ==","repeats":1},{"count":1643,"lower_bound":"bzVmMHkwRmFLSlRmYjA4TUc3ZUpCTDYybmNLTg==","upper_bound":"bzd1WUNXRjE1VHhDdUlZV05EbU9wUHFVTzlRQVdsRTFwZ3hTMUdja1NLSk01TFJPMTdUVTFBWkM=","repeats":1},{"count":1651,"lower_bound":"bzhEdkJHVHVOSThoV0xUNHg0dEF4V3BncFhmVlp2OXZsYURFWXo1dw==","upper_bound":"b2Q0aXI0N21xR1AzNDRUQnRNNWdvVzdvUW44V2tOZXc0MWRaeGdN","repeats":1},{"count":1659,"lower_bound":"b2dzTE8xeXo1MFFlSjRQbQ==","upper_bound":"b3FON2pSamdSb3NqSVA4RVJWSnR4SU1rV3Ezd2twYnFsZHk=","repeats":1},{"count":1667,"lower_bound":"b3Q2ZXNRU2x2Z2hESXg2VWE3WTh3UHM2bHJuOFJhRGQ=","upper_bound":"cDdOd3lnMlBuREtscFppS3VpMWlCTGhrVjM0Vko3YXhndmQwdmc5c1o=","repeats":1},{"count":1675,"lower_bound":"cDhLNkRramVPak5H","upper_bound":"cEcybUxzYlNYRDNzRXMxTmhOMnBGemFGTG54UUd5Q05teUZO","repeats":1},{"count":1683,"lower_bound":"cEkzSWd3V0NHNldWVGFOT0p4SzVBUktJUnNTMEpxSHhvdkNBWVZiSTVGYmZNME9Md21aTg==","upper_bound":"cEl6eDRYQmROOVV0a1RmQjBtT3BKSTE1Qk1ZbERnVERCM0ZNWGc5alAwU1lEdExNY3dpdE8ydFhDaFlV","repeats":1},{"count":1691,"lower_bound":"cEtVTDc=","upper_bound":"cFdsQkRhSVBvd1lnZGI1WVZHSzlpRmowOGNDV2t3dmRQQ1F1azU5","repeats":1},{"count":1699,"lower_bound":"cFdtekVSN1JBYmhVZVBLTzJrSzkzNXM3cXI0bEFkdlZBNjRGN1l6QkxTVGlCag==","upper_bound":"cGZVUWJjSw==","repeats":1},{"count":1707,"lower_bound":"cGZsckZ1WXhleVlIVmg0NWpPOUIz","upper_bound":"cTRHbW0xbDdGVTU4VTRndFEwUmhIc0JEUnowQlk=","repeats":1},{"count":1715,"lower_bound":"cTdLcmp1ZWtGWkV3Vjl5WnBkaWhqZDZXMzVJMA==","upper_bound":"cUR5eXZvWENpTVQ0SndWY0tnVA==","repeats":1},{"count":1723,"lower_bound":"cUs1T3BuSlc3dWlEbzIxeTNITFBWN2l2QVJ2Z1E0Q1F2NjVOckI=","upper_bound":"cVFUanZvZXFXUkZDNEs=","repeats":1},{"count":1731,"lower_bound":"cVNCMTNqQ3NrV1JRZkpWeWRiS2hNZThCZ3RHRG5FMXdpWkRqSEtidw==","upper_bound":"cWM5THVJZ1EzQjRPbWE3VnRwY0lONEUxTTVncGhCNmdhMHF3cTlBakc=","repeats":1},{"count":1739,"lower_bound":"cWNsdUs=","upper_bound":"cWZrNWZCeWVZOEEybXZwVkJZMmxkN1VXNlZSUlZTNVdidjFzT0JHMTJ2VGpmUnppU1J2ZXM=","repeats":1},{"count":1747,"lower_bound":"cWoyU0hRODFWemJQc0F1dW5mUTN3dFVOSzBvWmJtY3JZc3RaSmUxMGVMZ09BekZIUEJZbXZOSzA=","upper_bound":"cXEwbGY=","repeats":1},{"count":1755,"lower_bound":"cXRrQTlQZkJ2YUVB","upper_bound":"cg==","repeats":1},{"count":1763,"lower_bound":"cjF2cUw4MFhiWnROS2ZrMzVoY1R6b2ZITTBxM0x5VmRXV294aE5yOWVFbjd4Tk9PVnVUNWZqTmlr","upper_bound":"ck16cHFNOGFBZENWZ3ZmU1ZxRkVzZFlBUTRIT0FEVEdORHBFWG4xNA==","repeats":1},{"count":1771,"lower_bound":"ck9JS05Fc2Iwc1NIcFV1dVBFbkpCVnhmd1RWMlY0ZjFYQUJwMEpIUXE1MFdKaFVI","upper_bound":"cmZjWUV0aXZXeGZyVWk=","repeats":1},{"count":1779,"lower_bound":"cmpjVFE4YThHNHFONFVvbHAzUWh6RE84TnlCWHkyQg==","upper_bound":"cm1xVW5LdEF3VzlHS0Rjb3VRdjNWT2hWTTBoNA==","repeats":1},{"count":1787,"lower_bound":"cm5sNU9XTDdaYjBaMGE1NEFGUmpBN3BTVTc1S3RuNVNBcw==","upper_bound":"cnpjTEV5bmplZlVBOEJwQ2FrZFJ4NURwSTF4dnlEekY1MldUblJDNE5j","repeats":1},{"count":1795,"lower_bound":"c0VkUFpZdWdpVk5GTkVmekZzdjBjNFF1VGl6Zk1TM01ZQ3NERXFQ","upper_bound":"c1B4NnR4d1RaS3R0NDBid0VUaFc5REhTRzBJVmtaeQ==","repeats":1},{"count":1803,"lower_bound":"c1lYMWZxcWFqSXFCZk42WnNJeUxxQzRSWlVrRkkwUXAyU295ajU4ODVEMVh0a1UwSWJYUG1k","upper_bound":"c3NQQkJpWGxIUktDZnJiNGdmeTZUSkdhU3ZaWDltSmQyYlBhNDFRZ05XZQ==","repeats":1},{"count":1811,"lower_bound":"c3V6YjZZc0t1UmcwcjdrZ2Z2TzlYN3M=","upper_bound":"dDNGYkVYOFRtNnpMZm96QnQ=","repeats":1},{"count":1819,"lower_bound":"dDROMFBQb0NPdmxXR2ZSMUcwRUhkcERUTFV4SzhDd1BaZVZtb0RRYmJzNkVlUTQ=","upper_bound":"dGFiYWthZzdjUG1hb1UzMHFYVllyOFFVTXo0QXV0dXBQZURkRjdsU00=","repeats":1},{"count":1827,"lower_bound":"dGJhV2ZFSHpjdzBJbHNGMkVvdlUxdE1Z","upper_bound":"dG5iSWRLb1dIcHVzU3Viam5vVE5PaDc5U2dOSnRvOXdwems=","repeats":1},{"count":1835,"lower_bound":"dHBQNDJyc0kxZFlDQWJ1VEdvRU4zcVlxbnFidUtGTEx3","upper_bound":"dHR6cmp0QU44Z2tRSUNPajJVZ2xnRElNNVZUMzBrWlh6SmxmZGQ=","repeats":1},{"count":1843,"lower_bound":"dTh5VHRUS2M0Y05IaHRVSlJyeE9KT0c1MlFCVTZ6bHd0aFp3ck05ckN3OFFFRnFwU0NlR1VXWG9y","upper_bound":"dVlIanNGb2VQVHEzV0IxQTF6REZ5MURESGI3eldncEx2cjhGaHRBeUVueXZL","repeats":1},{"count":1851,"lower_bound":"dWVJNnlBNEh4aVhuR1Y5ajB1VEc3ZnluVXI5aU1YZ2F4cGRyVlpsTjhQSWw2bDQwM0x1QXB1VFgw","upper_bound":"dXdia25nakxDeGs4U0M1WGxIOEdxa3JFeGFLUWM1VHBaZmRt","repeats":1},{"count":1859,"lower_bound":"dg==","upper_bound":"dkRHbTFMM3NJc05Yd08xWkNNUkdwb08yYWlaN0x3NHdVNEFYWjNvR3c=","repeats":1},{"count":1867,"lower_bound":"dklJakJDT1V3YUtTMEZFMWJYSGtFcjRNQzU5OGZ3cDdYRlJ1empuNlVoZDk=","upper_bound":"dks4bnZVQWUxZEFyT2NPNHlaTDJFMElJcjBOejB3cmFoeDJ4MVpwMTNPcUJkcWt0OVI1OVNpTQ==","repeats":1},{"count":1875,"lower_bound":"dk4yZUpQUW1aNXNSNGFyb09RT0xDUDZxOHNBV2t0VE5xdkpiaU05RDNLcWo=","upper_bound":"dmJDV3NyV0xoVTY=","repeats":1},{"count":1883,"lower_bound":"dmMySTdtRTRNNjQ0czhDTFdQVFp6TEpOZWdsT0JSdmxoOVd5bEVJZEhSNDJpbks=","upper_bound":"dnNXYnQyZnM2bkxWSnQy","repeats":1},{"count":1891,"lower_bound":"dnRtbXN2bWE2MmNTZkZkUU9pQjZVNTh4REhHQ2xKT05Kc0ZHTXcydHBaN3VxWUxaVzZ1N3FQ","upper_bound":"dw==","repeats":2},{"count":1899,"lower_bound":"dzNZVDFNRGV2c3dWbDE4OTVvSkpVZXd5MDhvN2Y2eWtyRnhtR2FVdUFpcjhpNUpva1d5bkhS","upper_bound":"dzc4eA==","repeats":1},{"count":1907,"lower_bound":"d0NhT01QU29hRGhoZDdMbGFReWw1eEs0WEFRZ1ZCQ3Q0MnpWVnpuWHhTTHk0OG96YkxVbmpaZHdLem1m","upper_bound":"d1Rsa2h2TTk2SQ==","repeats":1},{"count":1915,"lower_bound":"d1ZoRkM2U2pUNTZCMFI5eFBSaXVOU1Jna2hKZ0cyWXVneU1wajZ3MkxiQWt3NlNRWA==","upper_bound":"d2ZmWlJKZzJBSzlNM3FGN0dGdTl2OTF6ZnpiM0FK","repeats":1},{"count":1923,"lower_bound":"d2swdkd6WWZ4d21YMTdLcnQxR3lHTGEzVHRj","upper_bound":"eDNtQ1p1bkozQnBhVk1aQ2hNVmlrN1ZEMTFTT3pYVWV4c0Z6V1RIOGNYYXBSaXYzbm9ndVU=","repeats":1},{"count":1931,"lower_bound":"eERZd1JpYkV5b1FkaGw=","upper_bound":"eFV0","repeats":1},{"count":1939,"lower_bound":"eGFxblhiUw==","upper_bound":"eHFCVlhNcWJoYnFmNmprbXpqdzY1bXpkblE2TVE=","repeats":1},{"count":1947,"lower_bound":"eHM2ZlVxWjFlVEw2cGN3RGZxRk1PSDlGZzdYNGE4Qno3Ykg=","upper_bound":"eThHV0tCV1dmUG5Mdk1zRnRUdXlLZGc1TXlmSXZTZmFSS1M=","repeats":1},{"count":1955,"lower_bound":"eUM3ZnNVZVZLaWRIeTI=","upper_bound":"eU84cXpzZkJ4Tk00RG91N2xSb3B5ZlJiRXhrY3pBR2JjNWc1a3lwRFc5a3M=","repeats":1},{"count":1963,"lower_bound":"eVBLYjdIZjhpOVRLcDZlMw==","upper_bound":"eXdzcw==","repeats":1},{"count":1971,"lower_bound":"ejM5VVZvTmZWVVQ2am02UVZ3b1RlZ3Brc2U5bW9WSXFSVFdkUUdrZjRNdFFsOWJIa25xUUk=","upper_bound":"ekZmZ3NTenFtcUFPWmFlSDFmQUM=","repeats":1},{"count":1979,"lower_bound":"ek1NWTVRQzBlV05qbWRjWkRSck93UXV2NGNlTHRMSWUzblh1ZU9FNGpRSExKZ3FOUTI5WA==","upper_bound":"elNmMGlrdWZ3ZERsYlBPb29KYXFCVGJUVkx5NzVUblFiajl4UzZXTHZhZU9BQzNWVnI1RXVnRE5qRWFOOXhs","repeats":1},{"count":1987,"lower_bound":"elVw","upper_bound":"emRCVzlJMnZRSjdlNjMxUmNNN2ZCNWZtWDBRRjNFZUQxWEVUTkNycHNvaW8y","repeats":1},{"count":1995,"lower_bound":"emdtWVF3VzFHUTJaQ0NO","upper_bound":"enRJcXFjM1pJNQ==","repeats":1},{"count":1999,"lower_bound":"enRPREx2bW1VWXVTSjJveEtUd1pBY1RiQVNKM0RqMWhyR2lI","upper_bound":"enVldEwzaXZQVGhTdndwNXJjcVJrTkRvdmF5dEwwRWl3R1d5Sm8zb3paem9CbDU=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,2,1,2,0,2,0,1,2,0,0,1,1,1,3,1,0,0,0,1,2,2,1,2,3,0,2,1,2,0,2,0,3,1,0,1,2,4,1,0,1,1,1,0,0,0,1,1,1,0,1,0,2,2,2,0,1,0,2,0,1,2,1,2,0,0,1,1,1,3,3,1,1,0,1,1,1,1,1,0,1,0,2,2,2,1,2,0,0,0,0,1,3,2,1,0,2,0,0,2,1,1,1,2,0,1,0,0,1,1,0,2,2,1,0,0,1,2,2,1,0,1,1,0,0,1,0,3,0,2,1,0,1,0,1,0,0,3,3,2,0,0,2,0,0,0,1,1,0,0,1,1,0,1,0,0,2,0,0,1,1,2,1,2,0,1,1,1,1,0,0,3,0,0,0,2,1,1,0,2,0,0,2,1,1,2,1,0,2,0,0,1,0,1,1,3,1,1,2,1,2,0,0,2,1,3,1,1,2,0,2,0,1,0,1,0,1,1,1,0,0,2,1,1,0,0,1,0,1,2,3,3,1,0,2,3,5,0,0,1,0,0,1,2,0,0,0,2,2,3,1,2,2,1,0,0,1,4,2,2,1,1,1,1,4,0,0,0,2,0,1,0,0,2,2,0,0,2,0,1,1,0,0,3,0,0,0,0,2,1,1,0,3,0,0,2,0,0,0,0,0,1,1,0,0,0,0,2,1,1,2,0,0,3,1,0,0,1,0,3,0,2,2,1,0,0,2,1,1,2,2,1,0,3,2,1,3,2,3,1,0,0,3,0,0,0,0,0,0,2,1,0,0,2,0,2,1,3,0,2,2,1,0,0,2,0,2,2,1,1,0,0,2,1,1,0,2,1,0,0,1,1,2,2,2,1,2,1,3,1,1,0,2,3,3,0,3,1,0,1,0,3,2,0,1,1,0,4,0,2,1,2,0,0,0,1,1,2,0,0,2,0,0,1,0,2,2,1,0,0,2,0,1,1,0,1,2,2,0,2,2,1,1,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,3,0,2,1,1,0,2,0,2,0,1,0,1,0,1,1,0,2,0,1,2,2,1,0,1,1,1,1,2,0,1,0,2,2,0,2,1,2,4,0,2,0,0,1,0,0,0,1,1,1,1,0,0,1,0,2,0,1,3,1,2,0,1,1,0,2,0,1,0,0,1,0,0,0,1,1,2,1,1,1,3,1,1,2,3,1,1,0,0,1,0,1,1,2,0,2,2,0,2,2,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,1,0,1,0,0,1,2,0,1,1,1,1,1,1,2,0,1,2,1,2,1,1,0,1,1,1,1,1,1,0,2,1,1,2,2,1,1,1,0,1,2,0,2,1,0,2,0,2,1,1,0,1,2,0,1,1,2,0,1,1,0,1,2,0,1,2,2,0,0,2,1,1,2,0,1,1,3,0,0,1,1,0,0,2,2,1,0,1,1,0,2,4,1,0,1,0,1,2,1,2,4,2,1,0,0,4,1,2,1,0,0,1,1,0,1,1,0,1,1,3,1,0,2,1,0,0,0,1,0,2,1,0,0,2,1,3,1,0,0,1,1,1,1,0,0,0,1,2,1,2,3,2,2,0,1,1,1,0,1,1,0,0,2,1,1,0,1,1,1,1,2,1,0,1,0,1,1,1,2,2,1,2,0,0,1,2,2,3,1,1,0,1,2,2,2,1,1,1,1,1,2,0,1,0,1,1,2,1,0,3,1,0,0,1,2,4,0,2,2,2,2,1,0,2,1,2,0,2,1,0,0,1,1,0,1,0,2,1,0,2,1,0,1,1,1,2,0,3,1,1,2,0,1,0,1,2,1,0,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,1,0,1,1,0,2,0,2,3,1,0,4,1,2,2,2,1,0,0,1,1,1,0,0,0,1,0,0,0,2,2,1,2,2,1,3,1,2,1,0,1,1,1,0,0,1,0,0,1,1,1,3,0,1,1,1,0,3,1,2,3,0,3,2,1,0,0,0,1,1,1,0,0,6,2,1,2,0,3,0,0,0,0,3,1,0,2,0,1,1,0,0,0,0,0,3,0,0,1,0,1,3,0,3,2,1,1,2,3,0,2,1,0,0,0,1,0,0,6,2,2,0,4,1,0,0,2,1,1,0,1,1,1,0,1,0,1,0,0,1,2,1,0,1,0,2,0,2,5,1,2,1,2,0,0,0,0,1,1,1,1,1,0,0,0,3,1,1,0,0,0,1,0,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,0,0,0,1,1,4,1,0,2,0,2,1,0,2,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,1,1,0,1,1,2,1,4,1,0,1,2,0,0,0,2,0,0,3,0,1,0,0,0,0,0,1,1,0,1,2,1,1,2,0,0,0,0,2,1,0,0,0,0,0,0,1,0,0,0,0,1,2,2,1,2,2,1,0,1,3,1,3,0,1,4,0,1,0,1,1,1,3,2,1,1,1,1,2,1,0,1,0,1,2,2,1,0,0,1,0,3,2,0,1,1,1,3,2,1,3,1,1,0,1,2,0,2,2,0,1,1,1,1,1,1,2,0,0,1,1,1,2,0,4,0,0,0,1,1,1,1,0,1,1,1,1,0,1,1,1,2,1,1,0,3,0,0,0,1,1,1,3,0,0,0,1,1,3,1,1,2,1,2,1,1,1,0,1,2,1,1,1,3,0,2,0,0,1,3,0,0,1,0,0,0,1,0,0,1,1,1,2,0,1,1,4,1,1,1,0,1,2,1,0,3,2,1,2,1,2,0,2,1,1,0,0,1,1,2,1,0,1,1,1,0,0,0,0,2,1,0,0,1,2,1,1,1,2,0,0,0,1,2,1,4,0,2,1,4,0,2,1,0,2,0,2,0,0,3,1,2,1,2,0,2,0,0,2,1,1,0,2,0,0,3,1,1,0,1,0,3,1,1,0,0,3,0,0,3,1,0,0,0,1,2,3,0,0,0,1,2,2,0,1,1,1,1,1,1,2,1,1,1,0,0,0,0,1,2,1,1,1,2,2,1,0,0,0,0,2,0,0,2,4,1,3,0,1,0,2,0,0,2,1,2,3,2,2,0,1,0,1,4,0,2,3,2,0,1,0,2,0,0,2,0,3,1,1,1,0,1,1,0,0,1,2,1,0,0,2,4,2,1,0,0,1,0,1,2,1,0,0,0,2,2,1,2,2,2,1,0,1,2,0,0,0,1,0,1,0,2,1,1,2,3,2,1,3,1,0,0,2,3,0,3,2,2,2,5,1,2,0,0,2,1,0,0,0,0,2,0,1,0,2,1,2,0,0,0,1,0,0,1,1,0,1,1,3,0,0,1,0,0,1,1,1,0,2,0,0,1,0,1,1,0,0,0,2,0,0,1,0,1,0,1,0,0,0,0,1,4,1,1,1,1,1,0,2,2,1,1,2,0,0,2,1,2,1,2,0,2,0,2,2,0,0,3,1,2,2,0,1,2,1,3,0,1,1,0,2,0,0,2,0,1,3,0,2,0,0,2,1,2,2,1,3,2,2,2,1,0,1,0,3,2,2,0,1,4,2,3,2,1,1,1,1,2,0,0,2,1,0,1,0,2,3,0,1,1,0,1,3,0,1,0,1,0,1,0,1,2,3,0,0,1,0,0,1,2,0,2,0,2,1,0,1,0,1,1,0,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,1,2,0,1,1,1,0,0,0,1,2,3,0,3,2,1,1,0,2,1,0,4,0,0,1,1,1,2,1,0,0,0,1,1,0,3,3,1,0,3,0,0,0,0,1,0,0,0,1,2,2,1,2,0,0,0,0,1,1,1,2,1,0,1,1,0,3,1,2,1,0,0,0,1,0,0,1,2,2,1,0,3,0,0,0,2,1,0,1,2,0,1,1,0,0,2,1,2,0,0,1,0,0,0,1,2,1,1,0,3,1,2,3,0,4,3,0,1,0,1,2,0,1,1,2,1,1,0,1,0,0,0,0,0,3,0,1,0,1,0,0,2,1,1,1,3,0,0,0,2,1,1,2,2,0,1,0,1,0,1,2,2,1,0,2,0,0,1,0,0,1,1,0,1,0,0,2,0,0,2,1,1,1,2,1,2,1,0,2,3,2,1,0,1,1,2,0,2,0,0,1,2,0,1,3,2,2,1,1,3,1,1,0,2,2,2,1,0,1,1,2,0,2,1,3,1,1,2,1,0,1,0,1,0,0,0,0,0,0,0,2,0,1,1,2,2,0,1,0,1,0,2,0,0,3,0,1,1,4,0,1,0,1,0,2,0,2,3,1,1,3,1,1,2,1,0,1,1,0,0,0,2,0,2,1,2,0,1,4,0,0,2,0,0,0,0,0,2,1,1,2,2,0,2,1,1,1,0,2,2,2,2,0,0,1,1,2,0,0,0,1,0,0,0,0,2,0,2,2,0,0,1,0,0,2,0,0,2,1,1,2,2,1,1,2,1,1,0]},{"counters":[3,0,1,0,0,1,0,1,0,4,0,1,2,1,0,1,0,2,2,1,0,0,0,0,1,0,1,3,0,0,1,1,3,0,2,3,2,1,2,1,1,2,3,1,1,1,2,1,1,0,1,1,1,1,1,3,0,1,1,2,1,2,0,1,2,0,1,2,1,1,2,1,2,0,1,1,0,1,1,4,0,1,0,2,0,0,0,2,1,0,0,1,1,2,1,0,0,0,0,2,1,2,2,0,0,2,0,2,3,1,1,0,2,1,0,1,2,2,2,3,0,2,1,1,3,1,1,0,2,2,0,0,2,3,2,1,0,2,0,1,3,1,2,0,1,3,1,1,0,1,1,2,1,2,1,0,0,3,1,0,0,1,2,0,1,0,1,1,1,1,1,0,0,0,3,0,1,1,1,2,1,0,0,0,1,0,3,1,0,2,1,0,1,0,2,1,1,3,0,1,0,2,0,1,0,1,0,0,0,1,0,2,0,3,0,1,1,0,0,0,1,1,1,1,1,0,0,1,2,1,1,1,1,0,2,0,1,0,1,0,0,0,1,0,2,0,1,0,0,4,0,1,1,0,0,1,0,1,2,1,1,0,2,1,2,3,1,1,1,3,2,0,0,1,1,1,0,1,2,0,0,1,2,2,2,2,2,2,1,1,3,1,5,0,1,1,1,2,2,0,1,1,0,2,3,2,1,1,2,0,2,1,1,1,1,3,0,1,2,1,0,0,0,1,2,2,0,0,2,1,1,3,0,1,1,1,0,0,1,0,0,1,1,0,0,2,1,0,1,1,2,1,0,0,1,2,0,1,1,3,1,3,0,3,0,1,0,0,1,2,1,0,0,1,1,0,1,1,1,1,0,1,2,1,1,0,1,0,1,0,1,2,3,1,1,2,1,1,0,1,2,1,1,0,1,1,0,1,0,0,0,1,2,3,1,2,1,0,1,1,0,0,2,0,1,0,1,0,3,2,1,3,0,1,2,1,0,0,0,0,0,1,1,1,1,3,1,0,4,1,2,1,2,1,1,1,4,0,0,0,2,3,2,0,0,1,0,0,0,0,0,0,0,1,2,1,2,0,0,0,1,1,4,0,0,0,1,0,1,1,1,2,1,1,2,0,0,0,3,2,0,0,1,1,1,1,0,2,2,1,0,0,0,0,2,1,4,2,0,0,0,2,1,2,1,1,1,2,1,2,0,1,3,1,0,0,2,0,2,0,1,3,2,5,1,1,2,1,0,1,1,1,1,0,1,1,3,2,0,0,2,0,0,1,2,0,1,2,1,0,0,2,0,1,2,2,0,2,1,1,2,1,0,2,1,1,1,2,2,0,1,2,2,1,0,0,1,1,0,0,0,1,1,2,0,3,2,4,1,2,1,0,1,2,0,0,2,2,1,0,2,0,2,0,2,1,1,0,1,3,1,1,0,3,0,0,0,1,3,0,2,0,1,1,2,0,1,1,0,2,0,0,1,1,1,2,1,0,1,0,1,0,0,0,1,1,1,3,1,1,2,2,1,1,0,0,0,0,2,2,1,0,0,0,1,0,0,1,3,0,0,0,0,0,0,2,2,1,2,0,1,2,0,1,0,1,1,0,2,1,0,1,2,3,2,0,2,2,1,0,1,2,0,0,3,1,2,0,1,1,0,0,0,0,1,3,0,1,0,0,0,3,0,0,1,0,0,0,0,0,0,1,1,1,2,0,0,1,1,0,1,4,2,2,1,1,2,0,0,1,3,1,2,2,1,2,2,0,0,1,1,1,1,2,1,2,1,4,0,2,2,2,2,1,1,0,0,1,0,0,1,1,0,0,2,1,0,3,0,2,1,0,1,1,2,1,2,0,2,0,0,4,1,1,1,2,1,1,5,0,0,0,1,0,0,0,2,2,0,0,2,2,2,1,4,1,2,1,0,0,2,1,0,3,2,1,0,1,0,3,1,1,2,1,0,0,0,0,2,1,2,1,1,1,1,1,1,1,0,1,0,0,1,0,1,0,0,0,1,0,2,1,1,1,1,0,0,2,0,2,1,1,0,2,2,2,0,1,2,2,2,0,2,0,0,2,0,0,0,1,0,1,0,2,0,1,0,2,1,0,1,1,1,0,0,1,1,0,2,0,3,2,1,2,0,0,0,1,0,0,1,3,1,0,2,2,1,0,0,0,0,2,2,1,1,1,0,0,2,0,1,0,1,2,1,2,0,1,1,0,0,2,0,2,3,0,1,1,0,0,1,2,0,1,0,0,0,0,1,0,0,1,2,0,0,2,4,1,0,1,1,2,1,1,0,0,1,1,1,1,2,2,1,2,1,0,1,0,0,0,1,1,2,1,1,1,0,1,0,2,0,3,1,0,1,1,0,1,1,1,0,1,0,1,0,1,1,0,0,0,0,2,1,0,3,0,0,1,1,0,0,1,0,1,0,3,0,1,1,0,1,2,3,0,1,1,2,2,0,0,1,1,0,0,1,0,1,2,0,2,3,0,0,0,0,0,3,0,0,1,0,1,1,0,2,0,0,3,0,1,0,0,1,2,0,3,0,1,0,0,2,2,0,3,1,1,1,0,1,0,2,2,2,2,1,2,0,0,3,1,2,0,1,0,2,3,0,3,2,2,1,0,2,1,1,1,2,3,0,2,0,0,2,3,0,0,1,1,0,0,1,2,0,1,1,0,5,2,0,2,3,2,0,0,2,0,2,1,0,1,0,0,1,2,1,3,2,2,0,0,1,2,3,1,2,1,2,1,0,0,1,1,1,1,1,2,1,2,1,0,1,1,0,3,0,0,2,0,2,0,2,1,0,2,1,1,1,1,1,1,3,2,0,2,1,0,1,1,2,0,3,0,2,0,1,0,1,0,2,1,0,2,2,0,0,0,1,0,0,0,2,1,1,1,4,1,0,0,1,0,1,2,2,1,0,1,3,2,2,2,0,1,2,0,0,0,0,0,3,1,0,0,1,2,3,3,0,1,0,3,1,0,0,1,3,1,1,0,3,0,1,0,1,1,2,3,1,1,0,0,0,3,2,0,1,0,2,2,0,1,1,1,0,0,1,0,2,2,2,3,0,1,2,1,2,0,2,0,1,0,2,1,2,1,2,1,1,2,2,1,0,0,1,1,1,3,0,0,3,0,2,0,1,2,2,0,2,2,1,0,1,1,1,1,1,1,2,1,1,1,0,0,1,2,1,0,1,0,1,0,1,1,1,3,0,0,0,3,1,0,0,3,1,1,0,0,1,0,2,0,2,0,3,1,0,1,1,2,3,0,2,0,2,1,1,0,0,1,2,1,0,0,2,0,3,1,2,4,0,2,0,2,2,0,0,1,0,1,4,0,2,1,4,0,2,1,3,2,0,0,1,1,0,3,0,0,2,0,0,1,1,1,1,2,2,3,1,0,0,0,0,2,0,2,2,2,2,0,2,0,0,2,1,0,2,0,1,1,1,2,3,0,1,0,0,0,2,0,0,1,2,0,1,0,0,1,0,0,0,3,1,1,2,1,0,0,0,1,0,0,0,4,0,2,0,0,0,1,3,2,0,0,0,2,0,1,1,2,0,1,0,3,2,0,2,0,4,0,0,2,0,1,1,2,0,0,1,1,1,0,0,0,1,1,0,1,0,1,1,0,1,1,0,0,1,1,1,0,0,0,0,1,0,1,0,1,1,0,0,0,0,1,1,2,0,0,1,2,0,0,1,3,1,2,1,4,3,3,2,0,2,1,1,0,1,0,1,2,0,3,0,0,1,0,0,0,0,1,0,0,0,1,0,0,2,0,1,1,0,0,1,2,0,0,4,1,0,1,1,1,0,1,0,2,2,1,0,4,0,1,0,1,2,0,1,1,1,0,3,0,2,2,0,1,1,0,2,0,0,2,1,0,4,0,1,1,1,2,0,1,0,1,0,0,1,0,0,2,2,1,0,1,3,0,1,0,3,0,1,1,1,0,1,2,1,2,0,0,1,1,1,0,3,0,1,2,1,1,2,1,1,0,1,0,0,2,0,0,1,2,0,1,1,0,2,0,4,0,1,0,2,3,1,1,2,3,0,1,1,0,3,2,0,1,0,2,3,1,3,2,0,4,0,0,1,1,0,2,2,0,2,1,1,0,1,0,2,0,3,3,1,0,1,2,0,1,0,2,1,0,1,2,0,1,1,1,1,3,0,1,0,1,1,0,1,1,0,0,0,3,1,0,0,1,2,1,1,2,1,1,1,1,1,1,0,2,0,0,3,1,0,1,0,5,0,3,2,0,1,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,2,2,2,2,1,1,0,0,0,2,0,0,0,1,2,0,0,0,0,0,1,0,2,2,0,2,2,1,0,0,1,0,2,1,0,0,2,1,0,0,0,0,0,0,0,2,0,2,2,0,0,1,2,1,0,0,0,1,0,3,2,0,1,0,2,0,0,1,1,0,1,1,1,0,2,0,0,1,1,1,0,2,0,1,1,0,0,0,1,1,2,0,4,0,0,0,1,0,1,0,2,4,1,1,1,1,1,3,1,1,2,2,0,1,1,1,1,0,0,2,0,0,0,2,2,0,0,0,2,0,0,0,0,0,1,0,2,1,0,0,2,3]},{"counters":[1,0,1,2,1,1,3,1,2,4,1,3,1,0,0,2,0,1,0,1,0,1,0,1,0,0,1,1,0,0,2,1,1,0,0,3,2,2,1,1,5,1,3,1,0,0,3,2,0,1,1,2,0,0,0,0,3,1,1,0,1,0,0,1,1,1,3,0,2,1,1,1,0,1,1,1,1,0,1,0,0,0,0,1,0,0,1,2,1,1,0,1,1,0,0,0,0,1,2,0,1,1,2,2,0,1,1,1,0,1,1,0,2,0,0,0,0,1,0,0,2,1,0,0,1,3,1,1,2,1,1,0,2,0,0,1,1,2,0,4,1,2,0,3,1,1,1,1,2,0,1,0,1,2,0,0,0,2,2,1,0,1,0,1,0,1,1,0,2,0,0,1,2,3,1,2,4,3,0,0,1,2,0,0,2,1,0,0,3,2,1,2,1,0,0,0,1,1,2,1,1,1,0,0,1,1,0,2,0,1,2,0,3,0,3,3,2,0,0,0,2,0,2,0,0,1,0,0,2,1,2,0,0,4,3,0,1,2,1,2,1,1,0,0,3,1,0,2,2,1,1,1,0,1,2,0,0,2,0,0,2,1,2,1,2,1,0,2,1,1,1,3,0,1,0,3,0,0,5,1,1,1,1,2,2,2,1,0,1,2,1,1,0,0,2,0,1,2,1,2,2,2,0,3,1,2,3,0,1,1,0,0,0,2,2,0,0,4,1,0,1,0,4,1,0,2,0,1,0,1,0,0,1,2,1,1,0,1,3,2,0,0,2,0,1,0,4,0,0,0,0,0,1,2,0,1,1,1,0,1,4,1,2,0,3,2,2,0,1,2,0,4,3,0,0,1,1,0,1,3,1,0,2,1,1,0,0,1,0,1,2,1,2,1,1,0,3,0,1,1,1,1,0,0,3,0,3,0,2,1,0,1,0,2,1,3,0,2,1,4,0,0,0,0,3,0,1,0,1,1,0,1,1,2,1,2,2,1,2,0,0,0,1,0,2,1,1,0,0,0,2,0,0,0,0,3,1,1,2,3,0,1,0,0,1,0,3,0,1,1,1,1,0,0,1,1,1,0,0,3,1,0,0,0,0,0,0,2,2,1,2,1,2,1,2,1,2,4,1,1,1,2,0,0,1,1,0,0,0,3,0,2,1,1,2,4,2,0,0,2,1,2,3,0,0,0,1,0,1,0,0,0,1,1,0,3,3,1,0,0,1,2,1,2,1,1,0,1,1,1,1,0,1,0,0,3,2,0,0,0,2,1,1,1,1,1,0,2,2,1,1,4,0,1,0,1,1,3,0,1,1,1,2,1,3,1,1,1,1,1,0,0,2,0,0,2,1,0,0,2,1,0,2,0,3,1,3,0,1,1,1,1,2,2,0,1,2,1,1,0,0,3,2,1,1,0,1,0,1,0,2,0,2,0,3,1,1,0,1,0,3,3,1,3,0,0,2,0,0,1,2,1,1,1,0,2,2,1,1,0,2,0,1,1,0,1,1,2,5,1,1,4,1,0,1,0,0,2,0,1,0,3,0,2,1,1,1,1,1,0,0,0,0,0,1,2,0,0,2,1,2,1,1,1,0,0,0,1,0,1,1,0,1,0,3,1,1,3,0,0,1,0,1,0,0,0,1,1,1,2,0,0,0,0,1,1,0,0,1,3,1,0,2,0,0,0,0,4,1,1,2,2,0,1,2,0,1,2,2,1,0,1,1,2,1,2,1,0,1,1,0,0,1,0,2,1,0,1,0,1,1,0,1,3,1,0,0,1,0,1,0,1,0,2,1,2,1,0,3,0,1,1,2,1,2,2,2,1,3,1,0,1,0,1,0,0,1,1,3,0,0,0,1,3,3,1,2,1,1,1,1,0,1,1,0,0,0,0,2,4,2,1,0,1,0,2,1,0,2,0,2,0,0,1,2,1,3,2,0,0,1,1,3,0,1,0,1,1,0,1,1,0,1,2,0,1,1,0,3,3,4,0,0,0,0,1,0,1,0,0,3,0,0,1,0,0,1,2,2,4,1,0,1,0,1,0,0,0,0,0,2,2,0,0,0,0,3,3,0,3,3,0,1,1,2,3,2,1,1,1,2,0,2,1,0,4,0,0,0,0,1,0,2,1,1,1,2,0,1,1,1,1,2,1,2,1,2,0,2,3,2,0,0,1,0,0,1,0,2,2,1,3,3,1,3,2,0,0,2,0,0,0,0,0,0,1,0,1,0,1,1,1,2,3,0,2,0,0,0,0,1,2,4,1,0,1,0,0,2,2,0,1,0,1,0,1,1,2,1,1,1,0,1,1,1,1,2,0,1,0,1,0,1,1,0,1,0,1,0,1,3,2,2,0,0,1,1,0,1,1,0,1,4,0,0,1,3,1,0,1,0,1,1,1,0,1,0,1,0,0,2,0,1,1,1,0,1,0,0,0,0,0,2,0,1,0,0,1,1,0,1,1,0,0,0,0,3,3,1,0,1,3,1,0,1,1,2,1,1,1,1,0,0,0,2,2,1,2,0,1,2,2,0,0,3,1,0,3,0,1,0,0,0,2,3,0,0,1,0,1,1,2,1,2,2,0,0,1,0,0,1,0,1,1,0,0,0,0,1,1,1,2,1,0,0,1,1,0,1,4,1,3,1,1,0,1,1,2,2,0,1,0,0,3,0,0,1,1,0,2,2,0,0,1,3,0,0,0,1,0,4,0,3,0,0,0,1,0,2,1,0,1,0,2,0,1,1,0,1,2,0,0,4,0,1,2,0,0,0,0,1,0,2,1,0,1,0,0,2,0,2,1,0,2,0,0,2,3,0,1,2,0,3,0,2,0,0,0,1,1,2,1,1,2,0,0,0,2,2,2,2,0,0,3,1,1,0,1,2,1,0,1,2,1,1,1,0,0,2,0,0,1,1,0,1,3,0,0,3,0,1,0,1,0,3,1,2,1,1,1,0,3,1,1,1,2,0,1,0,0,0,0,1,0,0,1,0,3,3,0,2,0,1,0,1,0,1,2,6,2,1,3,1,1,2,0,0,1,1,2,1,2,0,0,0,0,0,1,0,3,3,1,2,0,1,3,2,0,1,2,3,0,1,2,0,1,0,3,0,3,2,1,0,4,1,4,1,0,1,1,0,0,0,2,0,0,2,1,0,1,1,1,2,0,1,1,0,0,0,0,0,0,0,0,4,1,0,2,1,1,3,1,0,3,0,1,0,0,1,0,1,2,0,0,0,1,0,1,1,2,1,2,0,3,0,1,0,2,1,3,2,1,0,2,0,2,2,1,3,1,2,4,1,1,0,1,0,0,1,2,1,2,2,0,0,2,2,1,3,0,0,0,1,2,0,0,0,0,0,3,1,0,0,0,0,1,0,3,0,1,1,0,0,0,0,0,3,1,0,0,0,1,0,3,2,1,2,0,0,1,0,0,0,0,0,0,2,2,1,1,1,2,0,1,2,1,0,2,0,1,1,2,2,2,1,1,3,1,0,3,1,1,0,0,1,0,0,0,1,0,1,1,0,1,0,1,0,0,0,1,0,1,1,0,3,3,3,3,0,2,1,1,1,1,2,2,2,1,2,1,0,0,0,2,1,3,0,1,0,2,0,2,3,0,1,4,1,0,0,0,1,1,3,3,2,3,2,0,1,1,2,1,2,2,1,0,1,2,0,1,0,1,1,2,1,1,1,1,2,0,2,1,1,2,0,2,0,0,0,0,1,0,2,1,0,1,2,1,2,1,4,1,1,0,1,0,0,0,2,1,2,0,2,1,2,1,1,1,1,0,2,0,1,2,0,0,2,1,0,3,0,2,2,1,0,0,1,1,1,0,1,1,1,2,1,1,1,3,3,0,3,1,2,0,2,0,0,2,2,1,0,1,0,0,0,1,1,2,0,2,2,0,1,1,0,0,0,2,1,0,2,0,0,1,0,1,0,0,0,1,1,0,0,0,1,0,0,2,0,1,1,0,0,2,1,2,0,0,1,2,1,0,2,1,1,1,0,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1,0,1,1,0,1,0,1,0,0,1,1,1,0,1,2,1,2,1,1,2,1,0,0,0,0,0,1,1,1,0,1,0,3,2,2,1,1,2,0,2,0,0,3,1,0,0,0,0,2,0,1,1,0,0,0,2,1,1,1,1,1,2,0,1,1,1,0,0,1,0,2,2,0,0,3,2,1,2,1,2,2,0,1,3,0,0,2,1,3,1,1,0,0,0,1,0,1,0,1,1,1,2,1,0,2,0,0,1,0,0,1,1,0,0,0,2,1,1,0,2,0,1,3,2,2,0,1,2,0,0,0,2,0,3,0,0,0,0,0,2,0,2,1,0,1,0,0,0,3,0,1,1,2,4,3,2,1,0,1,3,3,1,0,0,1,1,0,1,1,1,1,3,0,1,1,1,1,0,1,1,0,1,2,1,1,0,0,0,1,3,1,1,0,0,0,0,2,1,1,2,1,1,0,2,1,0,1,0,0,0,0,0,1,1,1,3,1,1,2,0,2,2,0,0,3,2,2,1,1,0,3,2,1,0,2,1,1,2,1,0,3,1,0,1,0,0,0,1,2,0,2,1,0,1,1]},{"counters":[1,2,1,1,1,0,0,1,0,0,0,1,2,2,0,0,3,1,0,0,0,4,1,4,1,0,2,0,1,0,0,1,1,0,1,1,0,0,1,0,1,2,0,1,0,0,2,1,1,0,1,0,2,2,3,2,0,0,2,2,0,2,0,0,1,0,2,2,1,0,2,1,0,1,2,3,3,1,1,0,4,3,2,5,1,0,1,4,0,1,0,2,1,0,4,1,2,1,0,0,1,0,1,2,0,1,2,1,1,1,0,0,0,0,1,2,2,0,0,0,1,2,1,1,2,1,1,0,1,2,0,0,0,1,1,1,0,2,0,0,1,1,1,1,0,0,1,1,1,0,0,3,1,0,3,0,0,1,2,0,2,2,1,1,0,0,0,0,1,3,1,1,4,0,0,2,1,3,1,2,0,0,2,0,0,3,0,0,0,1,2,2,1,1,1,1,3,2,2,1,1,0,1,0,2,0,0,1,1,1,1,2,0,2,3,0,2,0,0,1,0,2,1,0,1,0,1,1,1,1,2,1,1,1,0,2,0,4,0,2,0,1,2,1,1,1,0,0,2,1,0,1,1,0,0,2,0,1,0,2,1,2,2,2,0,1,0,1,1,3,2,1,2,0,2,0,3,4,2,2,0,0,1,0,1,2,0,2,0,1,4,2,0,1,0,2,2,0,1,1,3,0,0,3,0,2,0,1,2,0,1,1,2,1,0,4,1,2,2,0,1,1,1,0,2,0,2,1,0,0,0,0,0,0,0,2,3,0,0,1,2,0,1,1,0,0,2,0,1,2,1,1,1,1,3,2,2,1,0,2,0,4,2,2,2,0,1,1,0,1,1,0,1,1,0,0,1,0,2,1,6,0,1,1,3,1,2,1,0,2,1,0,3,1,1,0,0,0,0,1,0,0,2,1,1,1,0,1,3,0,1,0,1,0,0,1,4,0,2,0,3,1,1,1,0,1,0,0,2,0,3,1,1,1,1,0,1,2,0,0,2,2,1,2,0,5,1,0,0,0,0,0,3,1,0,1,0,0,0,0,0,0,1,0,1,0,2,1,2,3,0,0,0,1,0,2,0,1,0,1,1,0,0,0,4,0,0,2,1,0,1,0,0,2,2,1,1,0,0,0,3,1,3,1,0,0,0,1,0,1,1,2,0,0,1,1,0,1,0,2,0,0,1,0,2,0,1,1,2,1,3,0,1,0,0,0,1,1,0,2,3,2,0,1,1,0,0,0,2,0,0,1,1,0,2,0,1,1,2,1,0,3,0,1,2,0,0,2,0,2,0,0,1,1,0,1,2,0,0,2,1,0,2,0,0,4,4,1,1,3,0,0,2,1,1,0,1,4,2,1,2,3,2,0,1,3,2,1,0,1,2,0,2,0,0,0,1,2,2,1,1,3,0,1,2,1,2,1,0,2,0,1,1,3,0,1,1,3,1,2,1,2,1,0,2,2,0,2,3,2,2,2,1,1,0,3,1,0,1,3,2,1,0,1,2,0,0,2,1,0,0,0,1,1,2,1,0,1,0,1,1,2,2,0,0,1,1,0,1,0,0,1,1,1,2,1,0,1,2,1,3,1,1,1,2,0,2,1,2,2,1,0,0,2,0,2,1,1,2,1,1,2,0,1,0,1,0,1,0,2,0,1,0,0,1,1,1,1,2,1,1,1,2,1,0,1,2,2,2,0,0,0,2,1,1,3,2,1,1,1,0,3,1,5,4,1,4,1,0,2,1,4,2,0,1,1,1,1,1,3,1,1,2,1,1,1,0,0,0,0,1,0,0,0,1,0,1,2,1,0,2,3,0,0,1,1,1,1,1,1,0,0,1,0,1,0,4,0,0,2,0,3,1,0,0,2,1,0,1,1,2,1,3,1,2,1,0,1,2,1,1,1,0,1,0,1,0,1,4,1,1,2,1,0,0,0,1,3,1,1,1,3,1,1,0,2,1,2,0,6,2,0,0,1,0,1,0,0,1,1,0,1,2,1,0,0,0,1,1,0,1,2,2,2,2,1,0,0,0,2,2,1,1,2,0,2,1,1,2,1,2,1,0,0,2,0,0,2,1,1,1,1,2,2,3,1,2,1,0,0,2,4,2,3,0,2,2,0,0,1,1,1,2,1,2,0,1,1,1,1,1,1,5,0,0,0,4,0,1,1,2,1,1,2,1,0,1,1,0,0,0,1,2,0,1,0,0,0,1,1,0,1,0,0,3,1,0,0,0,1,2,1,2,3,2,1,0,0,2,0,0,2,2,2,1,0,1,0,2,3,1,1,0,0,1,0,1,1,0,1,1,2,0,0,3,1,0,1,0,2,1,1,0,2,1,1,2,0,2,2,0,1,0,0,0,3,0,0,1,2,0,0,0,0,1,0,0,1,0,2,2,0,3,0,0,1,1,2,2,1,2,0,0,1,0,1,0,0,1,1,2,1,1,1,1,0,0,0,2,4,2,1,1,0,2,0,1,2,2,2,0,1,1,0,1,1,1,1,1,0,0,0,1,2,1,1,0,1,2,1,0,0,0,3,0,0,2,0,0,1,1,1,1,0,2,0,0,0,2,1,1,1,0,1,0,1,1,2,0,4,1,1,0,2,0,1,0,3,1,1,0,0,1,0,1,1,0,1,2,1,1,0,0,0,0,2,0,3,0,0,1,0,0,1,0,0,0,1,0,0,2,0,2,1,3,0,1,2,1,0,1,0,2,1,5,2,0,0,1,1,1,0,1,0,0,1,0,0,0,2,1,2,1,0,1,1,1,2,0,2,2,2,0,1,2,2,3,1,0,0,1,3,2,1,1,1,5,1,1,0,1,3,1,2,2,0,0,2,0,1,1,2,0,2,1,1,0,0,1,1,0,1,3,0,0,0,0,2,3,1,0,1,1,1,0,2,1,0,1,1,2,0,0,2,2,3,1,0,1,0,1,0,2,2,1,1,3,3,1,1,3,0,1,1,2,2,1,1,0,0,0,2,3,1,0,0,0,3,0,0,0,2,1,4,3,0,3,0,0,1,1,3,1,1,0,0,2,0,1,3,0,3,0,0,0,1,2,1,0,0,1,2,1,0,0,0,1,1,1,1,1,1,1,0,0,1,2,0,0,0,0,0,0,2,0,1,3,0,0,1,1,1,0,0,0,2,0,1,0,0,1,1,2,2,2,4,1,2,1,2,1,1,0,1,2,1,1,1,0,0,4,0,0,1,1,0,0,1,0,1,0,0,0,2,1,0,3,1,1,0,2,0,1,0,2,1,2,1,1,0,0,1,0,0,2,0,0,1,0,1,2,0,0,2,1,3,2,2,2,2,0,0,3,0,0,1,0,0,3,1,2,0,1,1,2,2,1,1,0,0,0,0,0,1,0,3,0,0,1,0,0,2,1,0,1,0,0,1,0,1,0,4,0,1,1,0,1,1,1,0,0,1,1,0,0,1,2,2,1,1,2,0,0,0,2,0,0,0,0,0,0,2,0,0,4,2,3,0,0,0,1,2,0,1,0,2,1,2,1,2,0,1,0,0,1,1,1,1,1,0,0,1,2,0,1,0,2,2,3,1,0,1,0,1,1,3,3,0,2,1,1,1,1,0,5,1,0,1,1,0,1,0,1,2,0,0,0,0,1,0,2,0,0,1,2,1,0,0,1,1,0,0,0,0,4,0,1,1,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,1,1,2,0,0,5,0,1,1,1,2,0,1,2,0,0,0,1,2,0,4,1,3,2,0,1,0,2,1,2,0,1,1,0,3,1,2,2,0,1,1,0,0,3,1,0,1,1,2,0,2,1,0,1,0,1,0,1,0,0,0,0,0,1,4,1,1,1,2,0,2,1,0,1,1,2,2,1,1,0,1,0,0,1,0,3,1,2,1,0,1,1,0,1,1,2,0,0,1,0,0,2,1,1,0,0,1,0,0,1,0,1,1,0,0,0,0,0,1,0,0,0,2,4,3,0,0,1,1,0,1,1,0,1,1,1,2,2,1,0,1,1,2,1,0,0,0,1,2,0,4,0,2,1,0,1,1,2,1,0,0,0,0,0,2,0,1,1,0,0,0,1,0,1,2,2,1,1,1,1,1,0,1,1,1,2,1,2,1,1,1,2,2,5,0,0,0,1,1,1,1,0,1,4,0,1,1,0,1,1,1,1,4,0,3,2,0,2,1,1,0,1,0,2,0,2,3,1,3,1,1,2,3,1,0,1,1,0,0,0,0,0,0,0,0,1,2,0,3,1,1,0,2,2,1,0,0,0,0,0,2,2,2,1,0,0,1,1,0,3,3,1,4,0,1,3,2,0,0,0,0,0,0,3,1,1,0,0,0,2,2,0,0,0,0,1,0,1,2,1,1,1,1,0,0,2,1,0,2,0,0,0,0,0,0,0,1,2,0,0,0,0,3,0,1,1,0,3,0,0,0,1,0,1,0,3,0,3,2,2,1,0,1,0,1,1,0,0,0,3,2,1,0,1,0,2,1,1,3,0,0,0,1,0,0,1,1,0,1,1,1,1,0,0,1,4,1,2,0,2,1,2,0,0,1,1,0,1,1,0,0,3,0,0,0,1,0,0,2,1,1,0,1,0,0]},{"counters":[0,2,1,0,0,0,1,3,1,0,0,0,1,1,1,0,2,0,0,1,0,0,1,1,4,0,0,0,2,0,0,3,3,1,1,0,1,2,3,2,0,0,2,0,3,2,0,1,5,0,2,1,0,0,2,0,2,1,2,1,1,0,0,1,1,2,1,0,2,0,1,0,0,1,1,0,1,1,0,1,1,0,0,0,1,1,3,2,2,0,1,0,1,2,1,0,1,0,1,2,0,2,0,0,1,1,0,0,3,3,3,0,1,2,1,1,1,0,0,2,2,0,0,2,1,0,1,1,1,0,1,0,2,1,1,3,1,1,0,1,2,2,2,0,2,2,3,0,1,2,0,2,0,1,0,1,0,1,2,1,1,0,2,0,3,1,0,1,1,2,0,1,0,0,0,1,1,0,1,0,0,0,2,0,0,1,1,3,1,0,0,0,0,3,3,0,2,0,0,0,1,0,3,0,3,0,0,0,0,2,0,0,1,3,1,1,1,0,1,1,0,2,1,4,0,0,3,0,0,2,0,1,1,0,0,0,1,3,2,0,2,1,0,0,0,1,0,0,2,3,1,2,0,0,2,1,1,1,0,0,1,0,0,0,3,0,1,0,0,2,0,1,1,0,2,2,6,2,1,1,2,4,0,2,0,0,0,0,1,2,0,1,0,0,0,2,3,0,2,2,0,1,1,1,2,1,0,4,2,2,0,4,0,2,0,2,3,1,2,0,0,1,0,0,0,1,3,1,1,2,1,1,0,2,2,3,1,0,2,0,1,1,0,2,0,1,3,1,0,1,2,2,2,0,0,0,1,0,0,1,2,0,1,1,3,3,1,1,2,2,1,1,1,1,2,0,0,2,0,3,2,1,0,1,1,1,0,0,3,3,1,1,1,0,0,1,2,0,0,1,0,0,0,0,1,3,0,0,0,2,1,0,2,0,1,0,1,0,2,0,0,0,2,1,0,2,1,4,2,0,1,2,2,0,1,0,1,0,0,0,1,2,1,1,0,1,4,1,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,1,1,3,1,0,1,2,0,1,1,1,3,2,2,1,0,0,4,1,1,0,2,1,0,3,0,0,0,0,0,1,2,1,1,0,1,0,2,1,1,2,0,0,0,0,0,0,2,0,0,0,1,2,0,0,0,1,0,2,2,2,1,0,0,0,0,0,0,2,0,2,0,1,1,1,3,0,2,0,0,1,0,2,0,2,0,0,0,0,2,3,1,0,2,0,2,0,3,2,1,0,3,2,2,0,0,1,1,0,0,2,0,0,2,2,0,0,1,1,1,1,0,1,0,4,0,1,0,1,1,0,0,1,1,0,0,0,1,1,1,1,1,2,2,1,2,2,1,2,0,0,1,0,0,1,1,0,1,1,2,1,0,0,1,1,2,1,1,0,2,1,2,1,2,0,2,1,0,0,0,1,2,2,1,0,0,0,1,1,1,0,0,0,0,2,2,0,1,1,0,2,4,0,0,3,1,0,1,1,0,0,0,0,2,2,0,0,1,0,1,2,0,1,0,0,0,0,0,0,1,1,2,1,0,1,0,0,1,0,1,1,1,0,1,0,0,1,0,2,3,1,0,1,0,1,0,2,1,3,1,2,6,2,0,1,4,0,1,0,0,2,2,0,1,1,1,1,0,1,2,0,1,3,1,0,1,1,2,2,3,2,3,1,0,2,1,0,0,2,2,0,2,2,1,0,0,0,3,1,2,2,1,0,0,0,2,1,0,0,0,0,0,0,1,0,0,1,1,1,0,0,1,0,1,1,1,0,3,4,2,0,0,2,0,4,1,2,2,0,2,2,0,1,1,1,0,1,0,0,2,0,1,0,0,1,2,2,0,0,0,0,2,0,0,2,0,2,1,3,2,1,1,0,1,1,2,1,1,0,1,0,1,2,0,1,0,0,1,2,0,0,1,0,2,1,3,1,1,0,2,1,0,1,1,2,1,0,2,1,0,0,1,1,0,1,1,1,1,0,4,2,0,1,1,0,1,1,1,1,0,1,2,1,4,1,1,0,2,0,1,2,0,0,2,1,2,4,1,1,0,2,0,1,0,1,1,0,0,0,1,0,0,2,0,1,0,3,3,3,1,1,0,0,1,1,1,1,4,2,1,1,2,1,1,1,0,3,0,1,0,1,1,1,1,3,1,1,1,1,1,1,0,0,1,2,0,3,3,1,2,1,1,0,1,1,0,0,2,0,1,1,0,1,1,3,1,1,1,0,0,1,3,3,2,1,0,0,0,0,1,1,0,1,1,1,0,0,1,0,1,0,3,0,2,1,0,2,2,3,0,4,1,1,2,1,1,0,2,0,1,0,2,1,1,1,0,1,2,1,2,1,0,1,0,3,1,2,4,0,0,1,0,1,0,2,1,0,1,1,0,2,0,0,1,2,1,1,0,0,1,0,1,0,3,1,1,0,2,0,0,0,1,0,0,2,0,1,0,1,1,2,2,1,3,0,3,2,0,0,1,2,0,3,4,4,1,0,0,2,1,0,0,2,1,0,1,0,2,3,0,0,2,0,3,0,0,1,0,0,0,1,1,2,1,0,1,2,2,0,0,1,0,0,1,1,1,3,1,2,1,1,0,2,3,0,1,1,1,1,1,2,1,1,1,0,1,3,1,1,1,0,1,1,0,1,0,1,0,2,2,1,0,0,0,5,1,1,1,2,0,2,0,0,3,3,0,0,1,2,1,2,3,0,1,1,1,1,2,2,0,0,0,0,1,0,2,1,2,0,0,1,1,0,2,0,1,1,0,1,0,4,2,1,3,2,2,2,0,1,1,0,0,1,1,1,6,1,0,1,1,0,0,2,4,1,0,2,1,3,1,0,0,0,0,0,1,1,2,1,1,2,2,1,1,0,1,0,1,2,3,0,1,2,2,1,2,2,0,1,0,2,1,0,0,0,2,3,1,0,1,0,1,2,2,0,2,1,0,2,1,0,0,0,0,2,3,0,2,3,2,1,1,0,2,1,0,1,1,1,3,1,5,1,0,3,0,2,2,0,1,2,0,3,2,0,0,0,1,1,0,0,1,2,2,3,0,1,0,0,1,0,1,0,2,1,0,1,2,1,2,0,0,2,0,2,2,1,1,0,1,1,2,0,0,1,3,1,1,0,1,1,0,1,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,1,2,5,1,0,3,0,0,2,2,0,1,1,2,0,3,0,0,2,0,0,1,1,2,3,1,1,0,1,0,3,2,1,2,1,1,1,1,3,2,1,0,0,1,1,1,1,0,1,0,0,1,0,0,1,0,0,4,1,2,1,0,0,0,1,1,1,0,2,1,1,0,2,1,0,1,0,0,1,1,0,2,0,1,1,0,2,2,2,0,2,1,2,1,0,0,2,1,1,1,4,1,1,0,0,2,1,2,0,0,2,0,0,1,0,0,3,2,0,2,2,2,0,1,4,1,0,0,1,1,2,0,1,2,1,0,1,1,1,1,1,0,0,0,2,0,2,0,0,2,2,2,0,1,3,0,1,0,0,1,2,1,0,0,1,2,0,2,2,1,3,0,0,1,2,0,1,1,1,0,1,2,0,0,1,1,2,2,1,1,1,1,2,0,2,1,1,1,0,1,1,1,2,2,2,2,2,0,0,1,3,2,1,0,1,0,1,3,1,3,4,1,2,1,0,1,0,1,0,2,0,1,0,1,0,0,0,2,3,1,1,0,0,1,3,1,3,1,0,1,0,0,1,1,0,0,0,1,0,0,1,1,0,1,2,2,2,2,1,0,1,0,0,1,1,0,2,1,1,1,0,1,0,1,1,2,0,0,1,2,1,2,1,0,0,0,1,0,0,0,1,0,1,0,1,1,0,0,1,1,0,0,1,1,3,2,1,1,1,1,3,1,5,0,2,1,1,2,1,0,1,1,1,0,1,0,0,2,0,2,2,1,0,3,0,1,0,1,1,0,0,0,0,1,2,5,0,1,0,2,2,0,1,2,0,0,0,3,4,0,2,0,1,1,2,3,1,1,1,0,1,1,0,0,0,1,1,1,1,0,1,1,4,0,0,0,1,0,0,0,0,2,1,0,1,1,0,0,1,1,2,1,1,1,0,2,0,1,1,1,1,4,0,0,0,2,3,2,0,0,0,1,0,0,0,2,1,1,1,1,0,1,0,1,4,1,1,3,0,2,1,3,1,2,0,0,0,1,1,1,1,1,0,1,0,0,1,1,0,0,2,0,0,2,0,0,0,1,0,0,0,2,0,1,1,0,1,1,0,0,0,0,2,1,2,1,0,1,0,0,0,2,2,0,0,2,1,0,1,2,0,1,1,1,2,0,0,1,3,0,0,0,1,0,2,1,3,1,0,0,0,0,1,2,0,1,1,0,1,2,0,2,1,1,3,0,1,0,0,0,4,1,1,3,0,2,0,2,0,1,2,0,2,0,0,1,1,1,0,1,1,0,1,1,2,1,1,3,3,1,0,0,0,1,2,1,2,1,1,0,0,2,0,1,1,2,1,2,1,1,1,1,1,2,0,2,3,1,0,1,0,2,1,0,0,2,0,0,0,0,0,2,0,0,0,2]}]},"null_count":0,"last_update_version":397952032999997440},"p5":{"histogram":{"ndv":1994,"buckets":[{"count":7,"lower_bound":"MDM5V2YzTHA=","upper_bound":"MEZIeVMzeWI1bUVPZmVsM1RRUUNVYk5M","repeats":1},{"count":13,"lower_bound":"MEt5dFVVUlJScDhCaE5LVkd5NmpodXIwMHdESjBpNU4yYmR4WHNXUA==","upper_bound":"ME5aYmJCWmk4TDdmZE9CUnJ6dUhLdHAyZzdNOFhXZWtxaTc2NVNlNWM4dlAzckZjVWF3N0w4SQ==","repeats":1},{"count":19,"lower_bound":"MFBpdWk1MEJTSjRpanBBVDRnc0RlYzFhQ2JkeGVpdVJzOHZERW15S1lQdHFVOEpIWmdqeA==","upper_bound":"MFY4QQ==","repeats":1},{"count":25,"lower_bound":"MFZ2WjByV29zV0p5bjlFejJqVTJTWmM0bkFIY3pSUUdiT1ll","upper_bound":"MFpMbFNuYVROSjBmcnlQOGtobVlO","repeats":1},{"count":31,"lower_bound":"MGRKQ3VlTXlnY3o4SHFjeDVidWd6bE5GYjhtWHladDc=","upper_bound":"MGpldFd0eUtOUWIzeEZFZTloWUY4Z2RmRW5sYTdXcnhqbWti","repeats":1},{"count":37,"lower_bound":"MG9GaVd4QWVrbjlJcHRxcXFMS2k=","upper_bound":"MHMwbEJTckFiRVQ=","repeats":1},{"count":43,"lower_bound":"MHZCVWVQY1FmZ3Faa29pVW1UOWlNQ2dROUpIZnI2NEd3WFc0ZE1wUHEyTzRWdzdOaG96a2FicWI=","upper_bound":"MTNGWTFmQmlhSENQRDdiZVp6WmdrREFkR2lWb3JoUTBk","repeats":1},{"count":49,"lower_bound":"MTRPOXVTWVk3Zlo2c0hlS3BTUkpScDJBNmV5","upper_bound":"MUU0ejlSaGFEMGlraDlQVVRVRnZNMDJweFp3ZDU3MmFYSUZrUEZDcHg=","repeats":1},{"count":55,"lower_bound":"MUVGcTRjZkhVcFRVYU5xQktHYjF1WlF1bzd1bG0wNGFVeXVRUHB3Nk1XZnY4UUNkdFdTZUhodlRySjJ2aTQ=","upper_bound":"MUpGMXhWOGlZRUxqcVZoMTg4cVhkREcxdk5xWGk4dFRVeHpWSEtJZjI1MUNLWDJka0Jxa0NpTnMwOUtJUW9S","repeats":1},{"count":61,"lower_bound":"MU9sajZlN2VrR2h4SVVoSGFZSFpkVEJMWEVpWXZNTTd5WkM=","upper_bound":"MVc5b1ZONlg5NzJLVTNJaGdKT3A5eEV1dUl5cTNLMGNiVk5Ma1hLMzJyZWZibmEzaGU=","repeats":1},{"count":67,"lower_bound":"MWtYQUNEa2JReTRoeDc0M1FrRDFpVGxjM0Z6ZjQ=","upper_bound":"MWxxZnhkaVROU05yQ1gwUg==","repeats":1},{"count":73,"lower_bound":"MXRFcE13dUJhUjNuQnc5S250OFdFbDlzenlESlNsWUk1","upper_bound":"MjJVSmRGMVpsMEdSWGlHeXAwRld5T21IOG9INTlrUDJxc3Jyb3BtOXczOURnMldDRDRTWGx3Sw==","repeats":1},{"count":79,"lower_bound":"MjN6elNaQmxCNlpNVjVyY3JMZkExMkxCSU9p","upper_bound":"MjdSRnpXemxIaHFnOFIxZEZWVVdLcUNLZkQ1dVgyeU05UWprbGxBdGpOMQ==","repeats":1},{"count":85,"lower_bound":"MkV1N3NhcGtobkRock9ZQ0g1Wk9ZWTJoUmtEVDk2SkU3WFZodGtXTE14d2oyVnk1Rg==","upper_bound":"Mkl6RDRuSTJDZEZDRXl6NDE0N1lQR2Q3N2ZhbldzT2tVZmlvZVJpTDE4a2ZFOXNUU2ZiMGp0SQ==","repeats":1},{"count":91,"lower_bound":"MlBCMVMya05CUWFNN0htc2wyM0R6QjRpag==","upper_bound":"MlU1aExoRFYzT0MzaVhwSVBNQUpFUGpHOGE4M3o3cnNrZjhCRA==","repeats":1},{"count":97,"lower_bound":"MlduMFF5cm9wd0NFWUNRNHZaaXhhR0k2M0tyalRR","upper_bound":"Mmc0YUd1ZGpIeWxLclJFRFNuZnF1c3J6ZEQyQ1dTWG5la09jYzV1MTk4Mmt1VlpzYjFRQWRvNmhCUUE2","repeats":1},{"count":103,"lower_bound":"MmdSRkxwVWFZT1JhcFR2Nm9CVmMxVEZONWFiNzVnd0lKQkR0ZFc=","upper_bound":"MnVjaW5saFk=","repeats":1},{"count":109,"lower_bound":"MnpVTmhvTWN5Y2pJZzFxVE5mNTBqd2JBZFVO","upper_bound":"MzNaSUJodEdGS0t0NVd4dDRjUzB5Uw==","repeats":1},{"count":115,"lower_bound":"MzNlZjIxRWxWcU9ra1hNZVlzSHBx","upper_bound":"MzdjUzZ2ekxPdXlUNVVGNjVhck1DaXhtWQ==","repeats":1},{"count":121,"lower_bound":"MzlicnlmUkJXY2xOM1JOS3BEWUI5b0l2Mkt2b0lMT3QyMHJjTXJid3AwNVAzOTZQSkoxc0VUZjEzVE8=","upper_bound":"M0ptYkRtU1dDNHp2aE9ObVJwRW1tbXJUWHEwOW5vNkwzMzJiUVJKSm9LMnlMdk9LUmNhbEpqVmFrNA==","repeats":1},{"count":127,"lower_bound":"M0t3SU5TN2hUTXFRWE1Ec0JZcFNub2J3djJRaWM5OWJmRXNhcVZ1Q3JFeDZ1a0xjSkxzRg==","upper_bound":"M1g2STRCSnFSMXc5TjN5b25UN3dYM0ZrZg==","repeats":1},{"count":133,"lower_bound":"M1k3VzdTSVcyQUVnRFR4SVBqTzUxdXE1VUhQUmFuNnFPRFNhZk1zRzhFYm44Y2ZzcExLU1VrSjhtOWc=","upper_bound":"M1l2bXpYdEhnTmh2OEgxajVlcUE0WHlaY3RFUzRFdQ==","repeats":1},{"count":139,"lower_bound":"M1ptTWtMd1hBWFE=","upper_bound":"M2hZTlVsRnNYMVJpV3BTdTJtbXd0MEFGMkhlb2V6M3lx","repeats":1},{"count":145,"lower_bound":"M2h2dWdLbmJ3amRkREdqaGhFVDVDT1Z6TTdjSTlROG05TFFOaU84elBDMGRERW1RSGY2MEN2am5B","upper_bound":"M3I3WHRQdUNy","repeats":1},{"count":151,"lower_bound":"M3NWZ2xpbVhNYzVVNXFZaHJncGdxVndv","upper_bound":"M3VDczE4SDl4ZHBOdFJFU3FMZnFpMmVqUlFj","repeats":1},{"count":157,"lower_bound":"M3oyekdoRE5BOGV0","upper_bound":"NA==","repeats":2},{"count":163,"lower_bound":"NDhOM0lxY1FERjVLN3lsM1A2clQxb0NwM0xlRVdndGs5ckJ5aXNrZjlBZTc=","upper_bound":"NER4eVpYeGxGZDUxTGVDNDd0azk1Z2Nuc1RTMVVJMEgzUFlvNUhiVEFGRU5icUgwQkkyQkkw","repeats":1},{"count":169,"lower_bound":"NEVacW42ZHE4MlBjZjh1MWltOGdvUDNxam9abVlSOGhTS1pGOXU=","upper_bound":"NE5ITVNMdUNudnkwQnQ5TDlIMkV0Zg==","repeats":1},{"count":175,"lower_bound":"NE9ManVFcFdPT0xJNWtiMEV4NkRPUGJVUk5wcE5vUnRYZ2pQNFhsYkRoN0duN2VrRHlLOUpHcXQwaDRV","upper_bound":"NFNEY2xac3pRZThXeWRjc0RvU3di","repeats":1},{"count":181,"lower_bound":"NFNMRjFUZnU1RE8=","upper_bound":"NGMyV245VlJpVjJDcTZFbHNzTWxNbzNmdjFyaTQwa3dTdnFoUDg0Y242NEZ6OVNJRg==","repeats":1},{"count":187,"lower_bound":"NGNYaFBncFhFMVByUHRaRHNIdDZwdjNnRm01R2lTTnQydmJSenNiNw==","upper_bound":"NGlPVUlrU3Z6MHN5ZUZIUHVSa29CUHVUTw==","repeats":1},{"count":193,"lower_bound":"NGxFRUJIV29jVkNEc3ZvRDRR","upper_bound":"NTN3QXhEc05HU3VOYUJtbGRpS1NZTm9oQ09UMjhVZ1hvdTk=","repeats":1},{"count":199,"lower_bound":"NTdMZHltUWU5a0dUWmxPVm1JRWVpSE9oaVFFWDVHRnlzWG1NeHU3NUs2ejZKalI=","upper_bound":"NUV1d2tJckdVN0U0QVJy","repeats":1},{"count":205,"lower_bound":"NUxEMmpSbndkZmJzeldsMHU1R25BcGVaN3FpZkY3V2xrZGt2RXZ0VGc0bnJINGhiN09pUjl2YlZFQzdQRUg=","upper_bound":"NU1tYUNJeEZMcFU1b3k1NDBtWXl1Z0hiNERsSENxTW1UOFRjc3cydlBKWUthVTk=","repeats":1},{"count":211,"lower_bound":"NVBNZ1NrQ3E4UGw=","upper_bound":"NWYwZUFxVVk5TjhXdVU0T3FFOHMwdnpXMDRCYUJIQVNTcXJQSXdoOUFPNmlYSGhIQkw1eTVN","repeats":1},{"count":217,"lower_bound":"NWtNRmtXWWVqWVR6U05aYWl1aWdNUkliQzZNdGlON3h6","upper_bound":"NW83a3FVanVyRmsyOUNsM0hzdmJ3WHZS","repeats":1},{"count":223,"lower_bound":"NXREVEg1NzRDZUlEc1p0TUNnM0Q=","upper_bound":"NkE3OW9XcXJTSll5SmlkRFBSM1VGTGlrUGNHWHpyVDVRRTdLWg==","repeats":1},{"count":229,"lower_bound":"NkpUQVFlc21veTYwZHM4eQ==","upper_bound":"NlAwcDcySGRzcnds","repeats":1},{"count":235,"lower_bound":"NlBYZ0xnb2Q3aVE4RXZNVExTVzViR0tsczJ2Y1lxUjVjRnVpc1dlejZ6Wndwd1VMbUQ2MExwdzc=","upper_bound":"NlM5OHU1ZFZWQ2UxRHE3MUFrR2JHaTBqZkVD","repeats":1},{"count":241,"lower_bound":"Nlc0NHM1TVNRQnRYRmFOVjNzTmloZlkxcUdVQnFFNGx3eg==","upper_bound":"NmdMbXdPVnhWVUpPWkF2RkxEdlZibFkzeHpzRU5TS3J5RnNLZ0N0SU8zeU9SR01qZ2JTTmtyYWxraw==","repeats":1},{"count":247,"lower_bound":"Nm9KRjZCMHVNRnB5Y0Z6NkJOVlZKNFJ0dndRdDV5SUpT","upper_bound":"NnE2YmhEZ1ph","repeats":1},{"count":253,"lower_bound":"NnJMUkJneQ==","upper_bound":"NzZkNk1sRTBONA==","repeats":1},{"count":259,"lower_bound":"NzlWSEZ3bm01TWo1MnpuYXdNWjFnU0EwQWRX","upper_bound":"N0Z3a3BlY21JNUUxRFM5a2VxSDB2N3VUVUdEWjdGRg==","repeats":1},{"count":265,"lower_bound":"N05aVWVRYW96OVVYcjlGemNFNlQ3dkdheFRNaEtZVUg0WlMyc1dGekc=","upper_bound":"N1ZiVU9yTG5sdjh2OU9yU1pKbWdUVFJadVNxaGM1SG5vd3l3TlBBaWZFYkpLMHo=","repeats":1},{"count":271,"lower_bound":"N2FWcGc=","upper_bound":"N2ZNSFhtcWd5RmRoZFJBZ0IwbTRKRDA3UXhwTEF2TWltQzI3Rw==","repeats":1},{"count":277,"lower_bound":"N2djRkVyMllDY1cwRXJidTdaWExISlE0RGxHTWQ3VE00aGNuMndEZThxcEdJNg==","upper_bound":"N3NtbWNhUVFrRW5KUG5xQTVxVmd1UHFNaTlzNlE0RmlkSWU2N3p0QXh0Q1hLV3ZKOFh3NWM=","repeats":1},{"count":283,"lower_bound":"N3RaZVhKZllXamdxMm5Dc3lSU2U1ak9mTVkzdzJ4NVJNVmVrSA==","upper_bound":"OA==","repeats":1},{"count":289,"lower_bound":"ODcyYm1iT296SnBiTzBHZ1dhbTM=","upper_bound":"OEwzMEFOWmphTVRubA==","repeats":1},{"count":295,"lower_bound":"OFYwaXpQNlJBV2tnbDFxeUtRWUxkd2hoSDVKRVd5NnpEUUMycGFU","upper_bound":"OFo1NnNxY3JhSTRtcDREN2Z3dUl5WEtZa0J4REt3Rzk2dnlNMUQwSXNURVpH","repeats":1},{"count":301,"lower_bound":"OGNCMnJ0OGdKUWRrVXM=","upper_bound":"OGpBZHYxR3lPQldXbmNIdXQ5Q3VrTFN6TTV6YjA0aTlvS3JBNEFscXEzZUp3YXJ0","repeats":1},{"count":307,"lower_bound":"OGtmdGxL","upper_bound":"OHI=","repeats":1},{"count":313,"lower_bound":"OHZudjhhbXQzaTBka3FSWVM5bXJIOXowNHdmYjRQSTNIQUEzV1hXUVRH","upper_bound":"OHdza0R4QWRoRXdycWJ4TWRSbTJ2aXNINHlLMGUxVTR6VE92bDBkTXBvWlRoQmRwelBwZkdXcVF0NE0=","repeats":1},{"count":319,"lower_bound":"OTA0anl0alBDenF3STIwMVVPTVZHSEFxOExTU2FVMUxicUthNG1LeU12bVNmZFg0N2VJdk9zS0tkOUk=","upper_bound":"OTh0aHluT1VEa3VaTXowd2RwQzloMld3cw==","repeats":1},{"count":325,"lower_bound":"OUxJMVFZYk5XTEZzMDc5OHdpS0lPM0U4RWF4ZzhpelFTUkxqbmgzbEZZN2Y=","upper_bound":"OVBQS1hnRDNRMzI4anI2UkJqeUxWdXJqNElzeE0wSngyQ0Mw","repeats":1},{"count":331,"lower_bound":"OVRpY2U0eXB2OVlROTlOZHN3TEg1Qw==","upper_bound":"OWhRcE1sZnBaZU82WXZsVko1Y0tHSnBLVldMUWdLWg==","repeats":1},{"count":337,"lower_bound":"OWpoZHAwdWF5aDlVYVJuTUZhTmp4RE90","upper_bound":"OW44SHN6OFJWaDBKTk55TzNvZm4=","repeats":1},{"count":343,"lower_bound":"OXFtcVNOVDF2Y3JGTHNlY0p3MnRYazc3NVg1OG9DZm1DUlZPVVVIQlZDU3NsTEpKdXNLRw==","upper_bound":"QTBtaE1DVnBTMUJJOTJ3NG53N1M=","repeats":1},{"count":349,"lower_bound":"QTI3SGdWQ3VvTEZWQzRuRGxKbW00UGo=","upper_bound":"QTdqNUp4STZPYW9BeTlaUk0xVHdnalpmQktFeTNiNkZHWTE3b1RD","repeats":1},{"count":355,"lower_bound":"QURVeGI3bzMwTjdBdWJX","upper_bound":"QUtGM1dn","repeats":1},{"count":361,"lower_bound":"QVFzYm1FYm5vazZhcWNhVWVnUU44aWVmbkpJZURMZTI4NnNp","upper_bound":"QWR3OFhNNFBTT1c1MkRmM1AxOUcyYk8xbmZFZDUwbHc=","repeats":1},{"count":367,"lower_bound":"QWU0R1RMRnlFMk1XbU1LN2I2NHR5aUg4M214QVpRSG42ekZsczF0T2VON3VVTzVIN29EOEd2Uk5MRDV0TkJk","upper_bound":"QWxyeTdlR0J6WlVRNw==","repeats":1},{"count":373,"lower_bound":"QXdGQklQbEo5cnd3VUFRMlFtTDhz","upper_bound":"QjNGRHp0Wnd4akd0ZnNmcVJUaVo1UjFNUkxEZzE3TFRFT0xnR01QSVZ0SGhjQkNBN29NdUs0","repeats":1},{"count":379,"lower_bound":"QjUxZHBtQTNES3dIUUpJQmM4c0tFS2c5eGxsV2ZHSg==","upper_bound":"QkZXWWNWbnIxVG9QOUtGTFdtRnI=","repeats":1},{"count":387,"lower_bound":"QkdBYXFIR3k3TlJYWGs5RVNuYjRq","upper_bound":"QmhoamkxWnA3T29MQzJiRFd3Sjhr","repeats":1},{"count":395,"lower_bound":"QmtPcVVxZDVKanBra2NNMWZuaVVadUo0NmtETEpUY2dXZm02RkszNQ==","upper_bound":"Qnc5UTVZV0cw","repeats":1},{"count":403,"lower_bound":"QzhacTZ0NnVWYzVJTFBuZW80QkpROWxKVUZUeVVqZ1NXSXN2cVFEUzQwUERxM3NsU2s3ZmxIdmFSeGU=","upper_bound":"Q0ZCbDYzZlJLNlkyazdkd2lzNUU5WWY4QjhSRkFLTXQ4M2Z5d2VLNg==","repeats":1},{"count":411,"lower_bound":"Q01BNFRBZ0daUkRJVVliZ2Rpa0R0dXV4WDdL","upper_bound":"Q1BpbmNFUURQRzBiVDFmUEh4aThueA==","repeats":1},{"count":419,"lower_bound":"Q1YwdjlQNUtVblhhdXprOHRMeDFCUkRjOER4YVBKdktpS0pvUm8zeHdtWFhFSmx3ZUsxdQ==","upper_bound":"Q3RsVDB1SEJITW9WZEtGUUtmRFkx","repeats":1},{"count":427,"lower_bound":"RDVMak5EMHBNOTZ3SWRtbWhDaW5xTG9Fb0Z1WkE=","upper_bound":"REFlRGFVNTkwWkxSYkZZbmd5b2xFQmlSc2xJeFM3TzJGSnpPSG5weVF2OWRqQkg=","repeats":1},{"count":435,"lower_bound":"REhI","upper_bound":"RFRmaFBZQ2RHWVpNVzlQZXBPWFViVWRyY3VVeHVz","repeats":1},{"count":443,"lower_bound":"RFhoeXVEcks3SXBhekpsR3lidVNpTTlyN2NSVmFqbTJJeG9SSTlvbU1jV2VSc3dXbldxazFkUGxYNG5IY0FsdA==","upper_bound":"RGlUVUU0S1B6WVU0a0hOVXFWMkdVUzFSbmlaTDJHTVVoWGcxNkNQR3dY","repeats":1},{"count":451,"lower_bound":"RGlsMDFCUXA1MDRic1VUaWNsMm1acWEzblBBTlNaZVVob1A3VXJXaG9VbzRiNnRyeE0=","upper_bound":"RGxX","repeats":1},{"count":459,"lower_bound":"RG12RjJXb1FHS2Y3QlZR","upper_bound":"RHRKU3VnVm9MNHJVVFZZQm1Wd1BDaEZM","repeats":1},{"count":467,"lower_bound":"RHdQekxocmlSN2NBSzZ5UVZERFdDUWRNenFhOA==","upper_bound":"RTNGZGxqaEgxN0w3WVljenYxNHY2aHdaZTlFVDNWMFNzNmRlRFQ=","repeats":1},{"count":475,"lower_bound":"RTNlcFlEd3FVdmtZVENaNEs1NXplOHVsVkFsSg==","upper_bound":"RTdvVVoyUDE0S2xrOEt5","repeats":1},{"count":483,"lower_bound":"RTl2UExuVXcyelkzNjlwbU9LcEI0NFM5NWtPSHN1dnUwclFySElqTTV0bGFMY3BWbWFPSnBMOTVqdA==","upper_bound":"RU50a1FIZHVFc3c=","repeats":1},{"count":491,"lower_bound":"RVBCZjZlbDFtWmhTeXlWZUpoWVd6RURIak5WbjVNWE13dmF0ZjNwT0ZYendLZ1FmRXdRcFFGV2hjUlBP","upper_bound":"RVFxcW9EQUEySlBkeWxCdlRmTTZ0cThtbVYweWltbkc3","repeats":1},{"count":499,"lower_bound":"RVRU","upper_bound":"RW1tU0F2U25LUFo4OUE4elFMeUxqRzRnSjZIVU9j","repeats":1},{"count":507,"lower_bound":"RXBQb0dGV0JpNk1vUm9XUmdJMVpPODZ2Nm5tZWszM3FJd1RuQUFuSU11bFZ5b1J3NVVEelhXSE4=","upper_bound":"RXZsV0loWEVBUXJ5b1BYS3BUVEMwTkhweVdMallIbmRZbVRpNEw3SEpqQ25HcmtWM25abFA0MFVZZEFHbg==","repeats":1},{"count":515,"lower_bound":"RXp1cWllVHFOcE02YlhDeEFoOXBoVG1BNVow","upper_bound":"RjRqZnRmNzFWa2tXTFVZdXpGQnhrRGQ=","repeats":1},{"count":523,"lower_bound":"RkFFcW5qQ05CajF6c1NBWTRk","upper_bound":"Rk9DTGdJRHNJamNpRHJKWkpvWko3V202TzJYaUVHVUlDdnJZRnhRNktUV0ht","repeats":1},{"count":531,"lower_bound":"Rk9IbHZRSVZ5c2pQb25pZ3plRkI=","upper_bound":"RlBybEJpUUQ1WUJ6SXZhNmQ4dkxqSmxlWlowM3pVN25pZkhh","repeats":1},{"count":539,"lower_bound":"RldLdVJDMVZXNXRiQ3MxbVF3MllXYWM0ZlRtMEV3dA==","upper_bound":"RnBlNDJXbGkzSFNYc3k=","repeats":1},{"count":547,"lower_bound":"RnNNdkVIOWl2eXVnb1REZXdmNEtzMFJTdFg2UHF0","upper_bound":"R0dhT3RGb3FLSXF5N3hYYTN0Ym5RVXRzVmpJMWxQNGx3aGJ3Q3VpeExxd3pW","repeats":1},{"count":555,"lower_bound":"R1hCTHBkQTRJaFduWWxZU2k3dDVuNUJzY0JIaVBaUU1XcVhrRkNLNU0zQ1h1NlExdzhkdGNjVFVmcW1EYVM2","upper_bound":"R2N0UlN2MTAwQ09FVnVVY2JHNGNTWVpoaU5BRm00UmNBRUJ6MlFBekRseThrSndINzlmclJOa3RtcGNVeXhIeQ==","repeats":1},{"count":563,"lower_bound":"R2dXcmZVZGU0TWtvZXE0OE4=","upper_bound":"R2xBZllES2tFdDdPbEg3Ym1UVGl3QnR4","repeats":1},{"count":571,"lower_bound":"R3plZjZpckdrZUhORTNRa2dRbDh3U1NDbVRPaA==","upper_bound":"SEo=","repeats":1},{"count":579,"lower_bound":"SE8=","upper_bound":"SG1hTllYd01JckRqU0xnWmo4Q2dqdkZk","repeats":1},{"count":587,"lower_bound":"SHJsWnNZQkN2MXA2UUFxT0NzNVNRc25Bcw==","upper_bound":"STBjMkhPaVk5c1BUeEZ4SkJLUERPVXdXWVNPdzNwV2NjNTVnYUM=","repeats":1},{"count":595,"lower_bound":"SUQ0MzJjUFFRV1Z0aDFUNTNRZ1R1Z1JFZnhzeGd3dlVlWXB3ck9zUlVDMDE5R0dud1l5","upper_bound":"SVhZdzNqdElOcTJWcWdjSURaZmcwaU9JU3ZGaGpWaTVxVzNtck9Zd2kyMVl5SjREVjNm","repeats":1},{"count":603,"lower_bound":"SVlDeFNSQVRtaUNKVUhuWGhYQUNhZDAxZE8wNk83czZ3Zk1CWFM4VHJPbkR1TFpD","upper_bound":"SWlsQjY=","repeats":1},{"count":611,"lower_bound":"SW5iTWF3MWFzTXU0N2QwTW4wOHFQMVpaM1FpVWFMYkZicERN","upper_bound":"SjMzV2t1ajN2eXYzS3lzYzFVaE9PcTY3RGdGb2w3bmpDMDVnZWxRemtIclJoZDRGWjVO","repeats":1},{"count":619,"lower_bound":"SjhMQnVYTXoyTkpWR1BjcjJuakRJdVpsQk91eG9rMkxHZzh4dWQzcVpPY01NckR0czY=","upper_bound":"Sk5GeHY3WTFGZVp5NXdheEtZY0Y4ZWJ1bWRaa1BlYUNCQWdoaTY=","repeats":1},{"count":627,"lower_bound":"Sk9peHFwalh1N1Nqc1Jh","upper_bound":"SlVrUVRvNTBvYm9EbGhXcEpjMFl1dG9rS05sMTRRaU9xcE1LNW5SdUJnNXplTGRFaEtNUVpI","repeats":1},{"count":635,"lower_bound":"SmM1MjM2cFFFOW1Ed0lOM0hNaDhvWUg0eFA1bUZDRllyZkhZb0JLbg==","upper_bound":"SzFjSUVGOFM2TkRycHY5R2Zuc083d1BGQkVONkFORA==","repeats":1},{"count":643,"lower_bound":"SzIxbE9XcWlkcHRwaUtObndBdEJSOEM1VDhscFdyMjNsUHFPZ1JjdEVydFVzWmw0WkQ4UmxHdTlWUnAy","upper_bound":"SzZ4Nnl3bWRxdExONFFkaHRTd1NVWEd4WXd2VDJyNHgxSWdjMmRIQ05BWXV3eVhyMmMybGFOenA=","repeats":1},{"count":651,"lower_bound":"S0FHanNCN2dGTzE3OElWaXRBZmtEcGk1cEV6Ykl4ZUJGM3BIRkw4YVM1UUxPNmd0UE82WVJhQkQ4ZzFzd3NGWA==","upper_bound":"S1hQYm9mSmFhWU1QMXR5M2NmNXBoMmtiTU02RDlnV1NMM2RRVTFLWg==","repeats":1},{"count":659,"lower_bound":"S2htTHBEYg==","upper_bound":"S25VNWRrSmZOcXZ4M2VROXhRbjBpd3h3dXB6YUhkRE51MjFST2laVWdXVU9uSGlpWXNZckVLNXp6cE5GOWc2","repeats":1},{"count":667,"lower_bound":"S25oTW5kak1zWkRyODh6OVhBYUViNGh0SVhKZ2ZLbzhHaFpXSm5yRENacUZxSXpxVENCZDU=","upper_bound":"S3BSc1MxR2x5RWR3UzRVWkpWOTE=","repeats":1},{"count":675,"lower_bound":"S3BWWXFqUDJBY0tEVE01MW1nVVViVEhWNGYwRWlVd3NVbXNaYnJWZWRuWllm","upper_bound":"S3REVmwyckJKNW14U1ZQWXBXSklieDlxZUdlZXl0SnNheWJpaUFwVWlkMEt3aVhnU0RGbjhsZnV2MXgycE90cg==","repeats":1},{"count":683,"lower_bound":"S3k1NklIRzRJRVFBaFBh","upper_bound":"TA==","repeats":1},{"count":691,"lower_bound":"TDBuT0lvWXF4OVJKZVR4R2Z2eDBrWUpQb3d1bVc0UjFCNUQ0TUJYTExKUWkyUTBwZ0pwMWlKc2JoZlNTZVhwag==","upper_bound":"TDd0VTJuV1lGQ2lIYm40aTlBelc5Z1pDemloNHVtNGNSYzhES3FsT0dSNTZ4eXk4NjFpck9QbzJlWG1CYTFj","repeats":1},{"count":699,"lower_bound":"TEZRU1ROOENsSWtURURUNU90ejl3MW1xR1R5NVUxVFZVYnFDV1JvZWZOSld5djRSQXI1NndG","upper_bound":"TExqMnV1cThYc0Fj","repeats":1},{"count":707,"lower_bound":"TE40SmRWQVllTU9iR1JuQWlJZUFRS2NGVEVNcWMzTTJ2allHQ0RpY0wzRlpFSXVwQXJCcVVic0lmNWpWTEhHSw==","upper_bound":"TFFYVmRCNVU3bUs4Um4=","repeats":1},{"count":715,"lower_bound":"TFF0","upper_bound":"TFVzUmtOSFRaOEhIOXlJenNmUmJKU0tjU2hPUzk2MUg1aXhPbFZsSGVKblFkSTN5NkQ1VlJWbVFScHNNQg==","repeats":1},{"count":723,"lower_bound":"TFZ2TlZTYkhSeVNTY2ZGZG9pQTl0VEVnVVlPalFUemoxc0x5ZTFEYmlDeEVRRlVSOEhBdEQzMA==","upper_bound":"TGNTb2p2Y2IxRFhrY0xaWUhDUVBuRzJqUGs1TlAxT1NsNWV3WFhy","repeats":1},{"count":731,"lower_bound":"TGlDdUNlaFcxOGxHRVZLM3p2OEJkWVloRkEzanVRejdtOTNhWkdlREhQQTNUYTlRWXFBUk1s","upper_bound":"TG9rVG5LVFdMa0lNQXZGdDZiN21JVXRaMFJBU1pjVmVqYnRVWVZGQnFTeVJnMGRZemk=","repeats":1},{"count":739,"lower_bound":"THBsZkhPTEd1ajFwbmxHWU9aM0RwQU81UDl5a2ZzVDgzT01pWWU4VDgx","upper_bound":"TTFGWHFjOFNnOTA5UTd2VVVvS2NkWjRhb0d1RDRxNEtpZQ==","repeats":1},{"count":747,"lower_bound":"TTJ2VzhC","upper_bound":"TTR1Z2x6ZXBB","repeats":1},{"count":755,"lower_bound":"TTY=","upper_bound":"TUt6NDdEUjRYM0diSVhNbTFnMkNGNm5ob2JXZUxaRTdiWEpwczhnVE52RzZ1WXFlT0h4eW5jWlBEcHFseXpn","repeats":1},{"count":763,"lower_bound":"TUxEMDBKbFU2b2EzcUtkUHJCSEJCYXRZRGg3a2VmRXZWZ3ZPRktYVllrQU1JRkhvVjI4VTdvU3ZwZ3hUdnU=","upper_bound":"TVQ1NDBjQWlHak1yV2J3TFVvdlBjc1lmcG9tanJZMThoQnhxQ250aWljTG1SaWw0SGsxTFZLeg==","repeats":1},{"count":771,"lower_bound":"TVRheFh6SW5IYkg1TklZNFExbzlrcXcyZTc0b3Ju","upper_bound":"TVc3SWNHTkFXZEc=","repeats":1},{"count":779,"lower_bound":"TVg4eHZtanNCQmxwN2I4ek5HVGFvcFRH","upper_bound":"TW5DYmE1cExMNHVYaVpnaFhNck4yUVZQMWFBUGN1UmJPMWtEalY=","repeats":1},{"count":787,"lower_bound":"TW9xUVJKYmlWbWVvdWY5MlFvYjVOT3Nx","upper_bound":"TXZxOEtrbEFXZnZHNXg3ZXBGbWY1OGhHTjdPd2lJbktvdGtqY2x0aVZNZjMyTm10bXVlcmJQ","repeats":1},{"count":795,"lower_bound":"TXdkeUYzN3dmcVFU","upper_bound":"TkRJVUJPbjVqeUtRVEtuSU1HYmZEdGh4WkxiTmxCTU5FaG5SVVhFQjA=","repeats":1},{"count":803,"lower_bound":"TkRNTHE2V1pDMnpIeElLNFplZlgzNlNpUTJaWEdaWkJNNnVKZEszTG1UaUZwN1hJWQ==","upper_bound":"TlRYRzBibDQxM25uMW16MHg5RVBTc1hURm5pQw==","repeats":1},{"count":811,"lower_bound":"TlZhWjRlbTlKZHpH","upper_bound":"TmpQVmtrNVQyeTBOeTl0Rm9vNGZUN1hCQlpSb0ZOTmM3eE1MZFQ1dQ==","repeats":1},{"count":819,"lower_bound":"Tm5oWWxaRk9UdkFONUNiR3NPZExtSjY3","upper_bound":"TnFFcGNCR0ZSZVRVUzlrUkNGUk9ZbVJMWFZXSUxneEwzdTR4cnJVd3VRYWZ0N2NwOE9GWXVJY1JyeVNXZVpY","repeats":1},{"count":827,"lower_bound":"TnhOZ0I2eUhZcjdwQmpwUVVSRzdUc3l2YVNLdUFnd1hOZjZhZzZaQ3hpcUJ1ODZQUjFvdzFFT2E=","upper_bound":"TzMyNzhtd0FlMWp6ak5NalV6cHR4ckVYV215NmdscEdaaXRKTWplTjZzTlZtNlNaZ0tT","repeats":1},{"count":835,"lower_bound":"Tzdjazl5anFPdzl5Y2dQdjhUcmlFdXJYeQ==","upper_bound":"T0c=","repeats":1},{"count":843,"lower_bound":"T0d2RFE=","upper_bound":"T1NqZ0ZuUG5KR0pNaTZDOHRXREd3WTFVYkVSTDFoZGc3cEE=","repeats":1},{"count":851,"lower_bound":"T2RCQ1JKVUZkVXNqWUtsZzNJTXJKRUs0SFU1bzk=","upper_bound":"T3JEQ0FIOE9JeDRjSXFlNGdWTkpJN2lwaDNNeWdtNUpObEFGQlEzeUMxNDB6bENzTXpxSDJ2S1lRZm1Y","repeats":1},{"count":859,"lower_bound":"T3MwZTlaVER0SXozQzVOSGhrb3R6ajYzUVdzajlpcEc0Qk1YaDFSZ1RhWXlWVVZkV0Y4b2JpNG9YNXBSSnF4OA==","upper_bound":"UDFpSWhZMUlObkRmckhGbw==","repeats":1},{"count":867,"lower_bound":"UDJoc3JUbWk=","upper_bound":"UEVvR3cwQjQ2OFF1UzlZV1RseTFQOUV0QXVpREhVbzFBNzhiUkJmMExDZ0lpdGJ0WWxsU1E1SmRESw==","repeats":1},{"count":875,"lower_bound":"UEdlRldocnhVdk53WE5zTE96WmdnRlhlclQ1SXBoUkNHejVJU054NFVBRXZraFA2bWlaSTVLbTFvVGpxQVoyMg==","upper_bound":"UE1GQU9zaGo2cmhOZGZ0MEJUQloxQVQzcTRzQ1I5NHc5RlFQTm5LU3ZUSFplTVZTRHNvakpHM1JE","repeats":1},{"count":883,"lower_bound":"UFQ4bHRZMnBySHRpd2pqbTlRaUZ0a3o=","upper_bound":"UGE0Tlg4TlJNUFhkTVUy","repeats":1},{"count":891,"lower_bound":"UGJySm9w","upper_bound":"UHl2QXlIN0xXZ1ozWEtPcGF0NHNPa2NEMkd0anpETFBOQVJQekNWVk1vQ0Uwcml6OGdr","repeats":1},{"count":899,"lower_bound":"UTJrTHZ0QjU3Rk1udzgya0I4dDhuY3lMeDhCeUda","upper_bound":"UTdoNUNjTGJhd0xEdTZaeHEzTUhQN1FYeGk2NW9GSDI5Mg==","repeats":1},{"count":907,"lower_bound":"UTk2SmZBcmhNQVRWUXRWbW1vRw==","upper_bound":"UU5SM0h4b3VMZk5KdDVCa2ZjTHRJQXVoSjNHOFFBNGFqT0Na","repeats":1},{"count":915,"lower_bound":"UVFuWVpuOTE=","upper_bound":"UWdo","repeats":1},{"count":923,"lower_bound":"UW1ta2NWZWVKeVVJZmVaQ0tobHJxbEh6NGE0Mmo3cVBld3NHU0xMSg==","upper_bound":"UjlHYUhZ","repeats":1},{"count":931,"lower_bound":"UjlqNUlDU1pGd1ZCWVBFQ1FpMmlBUWtscmRiODFScUc0MFRhUlg3N2dEWWRPbTFKVlhVenkzNQ==","upper_bound":"Uk1uempmeTZtVWhOMTRxaFBJYTExekRndldHTHdOaWRhbg==","repeats":1},{"count":939,"lower_bound":"Uk9XUkxuSTdLQmV0c2o1WUI2NVdPSUdIdHhtRW04MlQ4T09DamJzWW9YYTBaRVU3STNWTHMxb09w","upper_bound":"UlZmNnd4b3FjRXBFVG91VnZrZWVxbDVXaXlGY2VhNQ==","repeats":1},{"count":947,"lower_bound":"UlpTN2FQa2pxUk5GZg==","upper_bound":"Uml1YXgwOFR5MU8xUVRRU3pzOUxrWFlXRFp1SWxkTko2THUxaXVWYjBobDNTZm1ZUmlNRTRK","repeats":1},{"count":955,"lower_bound":"Ums0SVRoNXViQUFMMmx5bFhCVW40ZDJEY250NDdaQTV0","upper_bound":"UnhlRVhrcnkyV0RVR09hUFhNakhWYVBIbVlzSEF6akJyMUVmWWFJd2ZuWjNJeFQ=","repeats":1},{"count":963,"lower_bound":"UzNhdTlIbVJNV1l4WDJzSUhmajhPZzY=","upper_bound":"UzlCSVQzaWNmS2FhWEQ1M0tOUkw5NEE2OGJkdDFuYlZGSFFjeDBkM3p2QWltd3BsRVF5WFQ=","repeats":1},{"count":971,"lower_bound":"U0F1S01BZmJkUHA1cDBpNkF3VkZFTnp6M2ZVNGtsdlRDUUI3T3ZuUmUxcVloZkw=","upper_bound":"U1E3bEU2MUtB","repeats":1},{"count":979,"lower_bound":"U1FnSG45ZWJacHRISU45c2ZpcUU3Z0tzZlBo","upper_bound":"U1U=","repeats":1},{"count":987,"lower_bound":"U2NzdFo3ZEozeDNHRGJzczVMczFxaTNvNzB6MjJqTE1SVEk2eER4UHlJVE52SjNGSWR3Z0c2dFlqWWpUcg==","upper_bound":"U2tDejNPbUdrRWJhcW4yRTRWa0ZnMmJtTnA=","repeats":1},{"count":995,"lower_bound":"U2xQMkwzOGd2OGcyYXplaEc2TlFoOFdoRw==","upper_bound":"U3pJOE9DM05OeWgwSTN4RFNVbXV1Z1M2VUZnZHc5aGFDSGRHMFFmeA==","repeats":1},{"count":1003,"lower_bound":"VDV2MUhQSGxUVkhUajMyempPaW9Bb0c1M3lUaEw4dFAxbGI=","upper_bound":"VGNFUGhNVHphZG1Da2NzSk1scWNlWXduTE5idUd6UWVjSjloZg==","repeats":1},{"count":1011,"lower_bound":"VG1PZVBaN1ZDUGJBN0ZLemtRckVpa1RjV0d1aXkxZDlzYkQycWZNT2YxSlRhdA==","upper_bound":"VHl5U2loSUFMQjZ2Z0dzZg==","repeats":1},{"count":1019,"lower_bound":"VTFjWm0zakpuNUdqVk8wYU9XdWduYUlHMUpmcklhbjBX","upper_bound":"VTllc0tSaWpUUWNtb0xRaklKdHQ4UkNJRmpBejU=","repeats":1},{"count":1027,"lower_bound":"VUE=","upper_bound":"VVZUV1RtY1REZ2FvdWF5OQ==","repeats":1},{"count":1035,"lower_bound":"VWF2ZndQanpnUDBPWmJOUmRKeGFYbEwzclJFS3EzTVl6aUNjT3MzRkg2MGpKcVpubVZ4QzNIS21I","upper_bound":"VWxod1k=","repeats":1},{"count":1043,"lower_bound":"VXNYQ0xyVkFVNndyU3hPd2VHcEtnU0NudGthNnVRaE5waQ==","upper_bound":"VXhhTWlHTFBCNWlO","repeats":1},{"count":1051,"lower_bound":"VjBuQUZWQjVQVmxVMXduS3hIb0lyQTNabG1kR1FRQlFn","upper_bound":"VkQxTzBaZkxaemQxcXpQYjBOcjVEcEhvSlJTTTdk","repeats":1},{"count":1059,"lower_bound":"VkdrVVBpbHd0ZHRVcFk4WW5ScFF6N0Y4RmJaM2hDTlFySUFLSA==","upper_bound":"Vmt0Y1FrczIwZXl5eTBBUW5WNFpsWjA5cXE0S1dXd0hXcmtsTmpidnNBSW1BSWk=","repeats":1},{"count":1067,"lower_bound":"Vmx2TExSSkg3OVd0WGRZYWIwRDNkWHRSNzB6UHZyOWFOZTFFdnJHVVBiUE8=","upper_bound":"VzlhWU43Y2R5VlhoeEZSU3dpU0FJd0ZTTjM2TDZZZXE5Y29GNTZMM0dudTdGMTE2Z25iN00zVXprQnNNbWY5VQ==","repeats":1},{"count":1075,"lower_bound":"V09hOEtoMnpLcmJsdDNMM3Jvb2FPSWYzZTRzU1oyM2tuVlZ4ZUtCRWdzY00xbg==","upper_bound":"V1h0QnAxNA==","repeats":1},{"count":1083,"lower_bound":"V1l0bG1yWWF4QXU5UEJ3aEtQaVdLUW15YnRXdlpjZ3lGVGtiMmhnM0FzeTBJdzg3ek5PR3o3","upper_bound":"V2xXOVlBMHZOZWY=","repeats":1},{"count":1091,"lower_bound":"V21QSzlQem9BdTVCcWNaTFJLN1BSNzkzbGphQW00eVFHaGFrcGp0dllYREFES2tUM1FEUQ==","upper_bound":"V3ZTU0ZzMVBnaGxJWVdTaU9NUE9rWkI0eDZkZEVxbkFBcg==","repeats":1},{"count":1099,"lower_bound":"WA==","upper_bound":"WDgzTUo4cTFUYUFHYW9GZ0xzMkRQMXhVbTZwQTVOQ2FQbGtaU2w1T3dSdw==","repeats":1},{"count":1107,"lower_bound":"WEdiWU1NQWlvaVFLTmJlYWVycDh0VlZRNDhFUTFoY0g3WUYwdmRnY1gxaDZIaUJSQg==","upper_bound":"WElnc2lqc3h0dmFoN3JYbFp6TkZZNTljNHpWaUlxWUU3SkV2QjZxMFRacQ==","repeats":1},{"count":1115,"lower_bound":"WFJSMUI3Z05XMDdaZnFYRVU3TFdnOVZZcUtBdVU3Y1o3ZFJrc3lWajJvSTVOc3UxYnFQTFh0VVo0QTdJQ3dUQQ==","upper_bound":"WGdWRnZZSUZ3WW5Id2VUYWFWa21tRzlYandKWXBmY2M=","repeats":1},{"count":1123,"lower_bound":"WGdXM09EczVJdGJIWjZLb05rUEVFQWdGeXhjU2RiYUZ5U29mak4xa2x1N2xrUTBiUmFRS3lVV29idVU=","upper_bound":"WGt0d0RFRFUyRXA1emhhTVl1V1lVTUpXWjVQSncxZW5uU3BBMFRPN3o2UTFEUk1TcA==","repeats":1},{"count":1131,"lower_bound":"WGxlMWtpOEhrNFM3cHR6R1pnYWt5eTQyNTJueUI1aFpDSjNQMW1kYTVlbVJkeExvWElQSFpNRkRxZXZKMVUy","upper_bound":"WHlrMGwxYlEwbkVYNEVhemhtdHBsdzZIVmNPc3FVN05nNTJDRnROYk9Ra2h4TjB5SFJJaDVFaU9V","repeats":1},{"count":1139,"lower_bound":"WUJQc2NUZmla","upper_bound":"WUkzVDkwdEY5RmVRQ2VpRnhsWllTZXp4","repeats":1},{"count":1147,"lower_bound":"WUk2czdGNE9wY3BHMVR3Rk9RWHhMNWR0cVRHMUhsQU50TQ==","upper_bound":"WWRTQzlSRXdjN2dhQm80MkpmMDJPeXNXV04yNUZkZ3RGRFFRdg==","repeats":1},{"count":1155,"lower_bound":"WXAzUnVCQ1FnR1RQMlhwRlJ3eldMTElWQWtmdXkxZkVaZFA0UEl3VEc0cFZTY1NFWEswNngzdnF4d1k=","upper_bound":"Wkh0SHBCdkFTNERvSDlJMzhnRWc5blVkV1ZCVG1mbg==","repeats":1},{"count":1163,"lower_bound":"WlRBTTVX","upper_bound":"WmZ5R1kyQTRSaDdyUUNic29XVTRPcUdJRE45R1h6eDJVZGtXRDhpRnN5NlNnbkg4Mm1JUERQT2xjZTc=","repeats":1},{"count":1171,"lower_bound":"WmhmM1ljQVg0U1YyWFRER1UxRFFWczFXSGdpT2h1bFg5aFNXbkFxWmFlOXhZWmZnRE0=","upper_bound":"WnpBTjhwNlVld01GRGliVlNUM0lzRUNOeUhIWmJONmRVclNq","repeats":1},{"count":1179,"lower_bound":"YTFjVDdsZ3k0SW94SEE2SklHTWhab2xDN2d2SkI2UEpyWjQxTw==","upper_bound":"YTRFcFN3STRVc2pBd3VUY3JpamZBNFpaNmgzZEhkZHhHWENxcnFUMDRMODZOWWpU","repeats":1},{"count":1187,"lower_bound":"YTc1T0c5dU45Um5KS2VYYkFWY1Vj","upper_bound":"YUtwelZRN3BlTFNPZXB6OU1p","repeats":1},{"count":1195,"lower_bound":"YU1WTW9EMnhZN2NDV0U3Z1FCdk1HSEd4dk11YWhzZ1g0ejJZMWJUNm84SkpSdlRC","upper_bound":"YVhMbklWeDFuSQ==","repeats":1},{"count":1203,"lower_bound":"YVhnVGk4S1pkRXo0YVlEZGdRTm1vNQ==","upper_bound":"YWl4UW5hTExndHJvZGpvSXNWblZMQlU3N0cybzVSbEtVZ1M0dWE=","repeats":1},{"count":1211,"lower_bound":"YXB1N1dQMTVFN2ZLTzA1ekVCZk4wVzdTbVJPczdQT25TTjNoWjdNYUFkdEJzMUllODJrcENreW5RSnpl","upper_bound":"YjNKRGFRMXJQOWozdUF1QThUQ1VUdDIzb1RKR2d1TGRPcVdXT2dmTmlHSkcyQWFsQTA=","repeats":1},{"count":1219,"lower_bound":"YjNPYjVNN1RUZlJUZm1jTVl4c3VuM3VUSUQ2TlFHd0xISmIzSzFsN1liWkprMm10anZHYm91ZnRNMzN2Tk9SUg==","upper_bound":"YkZra3BoMTBZcUc0dmVsdXR6Nno3dTBTVEQxaGdBUEFuaE5EOXVMT2w0dXpveHRyb2JTZDNiUVlP","repeats":1},{"count":1227,"lower_bound":"Ykc2R1FGbmFUZGhDZHZHY3pV","upper_bound":"YlNpV1pycFllQVZpWENkekV4Yg==","repeats":1},{"count":1235,"lower_bound":"YldiWkdFT2Y1YmxzTXR2ZnpTQWt1Rkd2UnhacXNKRUFGMWl1UE91R0lHblFoTExOTlZqZjFJMDBJejV1d1hWVQ==","upper_bound":"YmhMWkVl","repeats":1},{"count":1243,"lower_bound":"YmlTSjc0elFM","upper_bound":"YnNuNmxQaXE0cVZyYVFXSHM3QmpnaVJWeG5BSDhMQ2R6d1Jn","repeats":1},{"count":1251,"lower_bound":"YnQzYg==","upper_bound":"YzBXZFdXeDJtVFg0RFlKTFAzOVFSams2TU1OaWRENzhVUjlOY1M2Vkxzd3pMRTM1Rnd5YnlacXpvbTlFSzRWcA==","repeats":1},{"count":1259,"lower_bound":"YzBYSHNhckZHdHFBOVdYU0I4ajJ0TXZKdzlH","upper_bound":"Y1NEd25nYW9ET1hNa05iQ1J6OUc0ekZFemY=","repeats":1},{"count":1267,"lower_bound":"Y1QwSVl4MUIwVTM5QQ==","upper_bound":"Y1djdmMydTBzcFRURHFYOXJrRmRERmlBV2FQZ0d5OWNuU0E4ekZVVDkyQmdFZkF3ZWRmcXhhVg==","repeats":1},{"count":1275,"lower_bound":"Y2FNcDVTeW5kQlJLTmw4Ykt4NXpMOHF6","upper_bound":"Y3J0MHpsNmpCTmx0RUtZRzlHbEZr","repeats":1},{"count":1283,"lower_bound":"Y3NPaEw1R08yckkxejd3Q1RmVzg4akphbVZFcG1kVjJ3Z2t6SHpNMHlrWGtVeA==","upper_bound":"ZDM2SnE5QUZBbEFvblEwY2xpYUw=","repeats":1},{"count":1291,"lower_bound":"ZDQzNzZoNkx6SjA=","upper_bound":"ZEEzakxrSGtzNmxlNEppb29CVHRLUGZEdUJRWlhXZ0lSQTFhMDNlVnVEdkRvSQ==","repeats":1},{"count":1299,"lower_bound":"ZENKSVVDcVE5VmVLbzliWFYx","upper_bound":"ZFhTMmw3a1BjNEIwR2xTaU1SQXc2NXZuMkl4Nm9EVGRzYkRHc0RL","repeats":1},{"count":1307,"lower_bound":"ZFhnZzNuOXZ5bkJyaVB5RWgwSW42cTQ4Q0tpMkZuY1E4djlBdzVvQXMwVFhqVERZS1pHc1pnRHZpZA==","upper_bound":"ZHN5dENoNUs0U05aeXk=","repeats":1},{"count":1315,"lower_bound":"ZHpvd1MzZzNUc0JYQW5JM00yY0xyNWM=","upper_bound":"ZTduQTVEbzlpNDVwTkNMdVVVa3NhUWF3cFBtZGt5ZkhrTTVzRDhLZXVWVw==","repeats":1},{"count":1323,"lower_bound":"ZUU=","upper_bound":"ZUoxNXhtVDJvaHdrbVVMeVFK","repeats":1},{"count":1331,"lower_bound":"ZVRZNzFCbG80RFFWYjNa","upper_bound":"ZWNYTU5Cd3VlT25nME11V2VuRldBUlRudkV6dld5YVdHZEhkSGFpQ1o5aVE=","repeats":1},{"count":1339,"lower_bound":"ZWRkWEY0QnRtSFdRQVFNUUJJUFZ6d1hnTGNIS0N0ZWJRRmRSQ0Voc05i","upper_bound":"ZXlrMUFPR0ZOZzRuYzFMN2pSbllrdlNhcExURFlyZ1VLNnlaTHdsNmUyeVdNNEtPRTdKWjRXUlhHdnU=","repeats":1},{"count":1347,"lower_bound":"Zg==","upper_bound":"ZkV2VkVEZ3YwWGh0ZGUxalpi","repeats":1},{"count":1355,"lower_bound":"Zk1waERKQmRsaFhMYk1rdA==","upper_bound":"ZlM5SENFM08wWnMyYnZqeHl1RkNLRVNDUGxlT1p5ejJBaTdtNEZSZUdqT2J1cU8=","repeats":1},{"count":1363,"lower_bound":"ZlRYOQ==","upper_bound":"ZmRhQmdETlZKM0x0em80WXR3dGl1M1ZRbk1jWWxEakpCUzNWZk1TR0lBUW03eVBoMkN4N2V0OQ==","repeats":1},{"count":1371,"lower_bound":"ZnBVMWhnYQ==","upper_bound":"ZzNPcml2cklqcXRTRjFqazlVQ3NQYVdETjFWc00=","repeats":1},{"count":1379,"lower_bound":"Z0Q=","upper_bound":"Z2FaaEFyTDBZRGkydGhnUEI5dGdy","repeats":1},{"count":1387,"lower_bound":"Z2pWZWphOFFyaXhkdA==","upper_bound":"Z3FTR1cwT2NoM1FFVkVSbFU=","repeats":1},{"count":1395,"lower_bound":"Z3drMUZETnBjdklMNDBWeHVEN3g1OUV5ckN3aHczVEd3Vk45MEpnUE5rcDcxRjFoNg==","upper_bound":"aDFvNHBnZg==","repeats":1},{"count":1403,"lower_bound":"aDVrU3FWeTl3NFJsdHZ1QWtpY0d4dnlmREljU0xMd3dkQWExNml3MjB6OG4=","upper_bound":"aFRONzU1","repeats":1},{"count":1411,"lower_bound":"aFVRV1Z3S3RJdVEyZzlsTVRLMzBHR1VpVWc1dERjTWZnQ3ozUGVwVTI=","upper_bound":"aFoyb2JVUFA3ZkxCV05SVEppNDBkUEhkS0RLOHppUlh4SUJCWlc2RmdLNjNaOTVEcW9Ldg==","repeats":1},{"count":1419,"lower_bound":"aGFvMFo0Skt0M2wydVNoMjBF","upper_bound":"aGo2MXZFd1NhSVpPY3hvRzZydzhocExEa0ZEWGNtTWpZdHpuR3pyM0VqOVc=","repeats":1},{"count":1427,"lower_bound":"aG5NNUo=","upper_bound":"aHJFQklLZFF6cDIwdHBZOG5QVkRlbzJSaXBzOVo0eENVaW5TZWF5dk1Cb0RjTGpoaw==","repeats":1},{"count":1435,"lower_bound":"aHVvb0FuMDdnbzJr","upper_bound":"aTV2WFdmS3hwREF0QVN1TDdzMGc=","repeats":1},{"count":1443,"lower_bound":"aThMQkxtd1c=","upper_bound":"aUNZcDFRTUF1RWN2d1VyZjloSFJQanp1d1V3YXF5T3dlcVdxNmhvVlI4NEd3am1NMFV4WG1oRA==","repeats":1},{"count":1451,"lower_bound":"aUNmdGRac3E1bGtwcTQ1TzNKeDRO","upper_bound":"aUx3bGtFbnF5Mm9FaTY4eUdFSQ==","repeats":1},{"count":1459,"lower_bound":"aVNiY0M2eWxVcUxZcjNPbnlOZ2dkYjNNMVpqUU1VY2c=","upper_bound":"aVkxRjJRa3lyYVROV2I5dWo3OG1pWVd1ZVZla3g5NGxv","repeats":1},{"count":1467,"lower_bound":"aVpBT1ZzVnpJamdNR3ZoM2ZXcg==","upper_bound":"aW4=","repeats":1},{"count":1475,"lower_bound":"aW9SQ0Nrb3A4bVdRZTZpT2JpZWNaamQ1RFdqNkhndnEzb25LRVZ3S0dheQ==","upper_bound":"ajNlYWViVEdXQ0hQUGJlaUNUTWduVkhUcVZqZ2gwZE1NY251b3VXdm04TDlqS01PZXhVSg==","repeats":1},{"count":1483,"lower_bound":"alYyeDFpV3lhanFDUmx6MHg5VTJIZ3AyTThibnNRbTZBY1Y4ZDRK","upper_bound":"amk2ZDM4cA==","repeats":1},{"count":1491,"lower_bound":"amlQNzBCNDQ4NzRJVDhud1d0OG5xbkRDeUN0Q3ZMQUJP","upper_bound":"azhMbDdvdlN5Zg==","repeats":1},{"count":1499,"lower_bound":"a01zdWxlZFROSFhXeUI2N2pFWk5GQmMyZDVOMTdVVnM4Y0JuNg==","upper_bound":"a1R1MHB0UnZ5VXMwd3JTTzJqTXROb2FoTUI3bGswdnhxeGRj","repeats":1},{"count":1507,"lower_bound":"a1U3c0haSEVTVEJxV1hzNFBGag==","upper_bound":"a2hNQm1EVw==","repeats":1},{"count":1515,"lower_bound":"a2xzaTA1QURwNDd6S0VONjVoY2poUmpwaFV6QnQ4Z0dsdHg0ZzBGcE4xd1FuTGg=","upper_bound":"bDB3TUdiWHFvbzFMeUpXUg==","repeats":1},{"count":1523,"lower_bound":"bDZHc1A1NFdROThaUHhxYjJNNlRtakc0ZnRmWG1vaXk0SDVZb1VFQXFvcFZMb0VncDN5MFFFZmYzOA==","upper_bound":"bE5ja2ZMZmQzaVJ4R29jTVpwVkZjS0pkMEN5RnR4UnlYNTlNeGtidU5S","repeats":1},{"count":1531,"lower_bound":"bFE2Qzczc2pwZW82RXdaZUpaMUJhVDQyVE5UdVNGVWNKNHRiamZqTDJFRkhucmptakVFNncwZGhZemRhWVJ5","upper_bound":"bFdWUXJSMjZ0ZWxYdWsxQmlPMWZQenNXVzBPUWVmRVU0NGNYTk9MUFI5ckEwZmhOYWxSdkJUdHpLQQ==","repeats":1},{"count":1539,"lower_bound":"bFpt","upper_bound":"bGowSTdkUDZLbkFnTVdPYkZOSnRmOFBR","repeats":1},{"count":1547,"lower_bound":"bHNTV2xMaFVYRTQ1Uk1jS09RS1hSNGZEa2hpdTV4aXBYRnhGN1hLOGxjMDZ3UENXNG1CaHRyeWZCVw==","upper_bound":"bTR0WDZXQXRQdWVqWFVjTncwOXl5MDBlaFFLM09kSHZaRks0VkxEakN6WU5iY2F4V2Q=","repeats":1},{"count":1555,"lower_bound":"bTR0dXhuY1BxaE5IWjR1WXJ3ZEppNWVRWWE3WlJNMmdhWW45WXlUNVduSVNNdHB5OFAxZ3Y=","upper_bound":"bUEwRzE=","repeats":1},{"count":1563,"lower_bound":"bUJtTTF0OXlMb2owZDV5dmc0WHFBbnBnbURFZ3h6czc=","upper_bound":"bURoYXVa","repeats":1},{"count":1571,"lower_bound":"bUZiVm41ZzFGeVB0cU5VN0w1RW1DZmg1THdEb3lyS29pb0Q0d0FkNXY3TlM1RUNHYWVYc2FoUUZ4aW8=","upper_bound":"bU96WHhWYTNhSUlvNDNUQlpyS3VlYng5V1NQcTZhVndSbFZrYw==","repeats":1},{"count":1579,"lower_bound":"bVI5NWJVNEU4SVl0T3FwMEFHWFZIV1Z3Zzh6Z0F3Zg==","upper_bound":"bVN2VGxxNHFaYXRZQWRVdW9tSW1tVmlwT0lXQUprSEdSUDdCQUd1M05UVjZGNQ==","repeats":1},{"count":1587,"lower_bound":"bVVNQnZwNERZZTlwaFFPRThkb2RKZ1NnNXowN21rUW45M3poMnFZcjNjYThKOThMbTBVZw==","upper_bound":"bWpYeGplazc4SGw0b283Y2RiNg==","repeats":1},{"count":1595,"lower_bound":"bXVIYjNmbXZTWHpXeHA4YjFuQUdMdWF4VkhlT01iTVliZQ==","upper_bound":"bkZ1Mm5zazNDYUlVb0ozWUdubnZmM2NFUHlVbk9GNXVOQk1wcWxwTGh5M0I5Nkhw","repeats":1},{"count":1603,"lower_bound":"bkpDdE41T3JFNEZ5dWdsMmZzZEFxbTJTcXJtTTlrcFJKbW9iWVcxUQ==","upper_bound":"blVPeWVyT3hu","repeats":1},{"count":1611,"lower_bound":"bll4aE1LUG9qdzA=","upper_bound":"bm1RTGd4dzc3TVhtWUJtdDlzUEFHZDc=","repeats":1},{"count":1619,"lower_bound":"bm16VkllN2F2V0p0NEtNcWp0NzRnbnN5WGliRVdh","upper_bound":"bnU0ODFGUXFOUjQxN1hZRmxJbGQyWTY3V1BoQ2lJ","repeats":1},{"count":1627,"lower_bound":"bnVRN2x5NjRFamNXdXEzNG45bEdtZlVuYXFTR29OdWNLOHlOcmpDZHZPTWlv","upper_bound":"bzFaR2hiOGdhUHNIWUV6OU80a2VMY1RIUnhpem1vbmhhN21CcWJzUkNVSjI2TXc=","repeats":1},{"count":1635,"lower_bound":"bzRBR2Jjc0QxVkZYVGJzVTZmWWlPcTJRUTBiMkpHYklZckpqZDl0R21OQQ==","upper_bound":"b0RLbmE4SlpC","repeats":1},{"count":1643,"lower_bound":"b0RRd3JjMWd1SERPNjQ=","upper_bound":"b1VmM1dmczhtMG81V004R1JKY0Q3aEVjSGJrRHZ5Y1hvY1VkbW1TZGE2T096SkljNW1E","repeats":1},{"count":1651,"lower_bound":"b1l0aw==","upper_bound":"b3FYRUliQThhczVGelk=","repeats":1},{"count":1659,"lower_bound":"cDRiVmhyWVJma2VQQVlVZG9TVkV3bGRjNkM=","upper_bound":"cEh1eFpXNmlXOVRrbzlNMzFUZzJTS1ZuSzEwOEVQUmdTbU52Q1VnNEdjM3UwRUdRUFJ6TkY3eg==","repeats":1},{"count":1667,"lower_bound":"cElCV2ZTTFMzdTBMTUNxb3JYMDJpdzdQcmNKRnRubndlcUUzS3RSSXY2cGE3","upper_bound":"cE5CcWllajhjSTJNVndFdWRjWXRhV3dZRmE3U0V6ZXhWcnZJd2pGWTZ3RWxoSlNWSDRqUnhiYms1WkgzSE1EUQ==","repeats":1},{"count":1675,"lower_bound":"cE9h","upper_bound":"cFYzRTNSQWpZQkJzZ1lj","repeats":1},{"count":1683,"lower_bound":"cFpqTFQ4dXdBa0dOZHdDeUozdA==","upper_bound":"cHQ4MDdpbFlw","repeats":1},{"count":1691,"lower_bound":"cHoxNml4ODVqelcxeGJiNDlFbg==","upper_bound":"cTRsZnJ3ZWFJQVEyR1dMOFNRRmNrN0Q4TlpoZ2dtdUFKek9wclM2NmxPcTdCeA==","repeats":1},{"count":1699,"lower_bound":"cTZlSG10d3lPVkdQTW1QdQ==","upper_bound":"cVR4d1Jhb2s0VkpIZGc=","repeats":1},{"count":1707,"lower_bound":"cVZOSGRrWWtmaXp4OWFXck1tc2s4WndCT3JWTk9rdTZWVGI=","upper_bound":"cVlVVUc3Q0paYWNJVGZsN1Q5bVIzNG1SZWFLTHhVRUZaUFhWN0RTRGpwYzRQYWdB","repeats":1},{"count":1715,"lower_bound":"cWJOMER5WGZialZjV2U2SElmUUJUeHVXYUlQNHZzMmpkYkdjYUx3bmVpdGw=","upper_bound":"cWVnSFBCcHA3YmRPNUhtRTlPWW4xZjNyQU9pMlc=","repeats":1},{"count":1723,"lower_bound":"cWVxWFN1a1lNdzU4Z21FTldTTEhlekhLUEVCRE5xdFpZWFRJWmJjcXIyVEZuZGd4RDJrV0t6ag==","upper_bound":"cXF5dHlaR0RqNUZ5Wk94ag==","repeats":1},{"count":1731,"lower_bound":"cXh3bVZQVktk","upper_bound":"cjNOaW12THlpbzlzcTZsSHZyd0dJNktzR0dYS0ls","repeats":1},{"count":1739,"lower_bound":"cjRCNm1HcUJYUWRvS1RhM3BTYWJvUkFQcWNSeTNQeG5LcFZtOXhXUGZoekJmNTBrUTB5bUFGTFJoMw==","upper_bound":"ckFEbFlHRk55Q3V5cGdFMDhZWWxWZlJUNnhtanlmVVpNUjJ6bXY=","repeats":1},{"count":1747,"lower_bound":"cklBQ0RsekZGang2UDRoMndSR0kzNUFBQVJhazQxWVhGbQ==","upper_bound":"cllNeW9ZOXA0S2NkUlI2RGU4UDNrcEpjTEdUQ0M2bnR5YUloWkhzVkdqeldORUxCdGd6b3h4TWtZVFc0Yzg=","repeats":1},{"count":1755,"lower_bound":"cmVMTWVuMEdMWkZ0MnpXV1VJaEFtV1hmdXB3VWw=","upper_bound":"cmt4S0s2VWJyaW5pYWUzOEY5emZxMVoxQkhxeExuaXM1UmFza1hPTnBRd3BnQlJvWjBt","repeats":1},{"count":1763,"lower_bound":"cnFkTk1aNmhUbHUzRHMyTFdOc1NWWDl5UmdOb2ZLTzVjRkhWR2Y5RlhYams=","upper_bound":"cno1YlFLM0RFdjloYlhlcW5HbzViZVNJWHVSSE13RDNvb0p4V2NxaVRqeFVXU1ZhZHhiMUM1QW8=","repeats":1},{"count":1771,"lower_bound":"czZacA==","upper_bound":"c0ZBNXM1bWlEVEJUck1jc2g5RnZLejM3Mmd3NkxmRDFBdktr","repeats":1},{"count":1779,"lower_bound":"c0l5VVlwY3RZblpybmd2aHRFdzNiOUs4NHFTeDJpWXAyYms=","upper_bound":"c2JQU3R3SWZkZXNGVnczWE5wY0tiU3FoWmd6clY4ZE12anZrd2VOT3ZPb3o=","repeats":1},{"count":1787,"lower_bound":"c21pZ2xGN2lsUlU=","upper_bound":"c3JybTRhMVZ6M3IzQXFvMHJHdTlvdXJlZkFkaDc0UGMzUmpqSEoxTzRtRlNteWFHZU9yZg==","repeats":1},{"count":1795,"lower_bound":"c3NyUUQ4cUFiQ0lRR2g2a2FkdVVwajBIeTRr","upper_bound":"dDdUN1RwVkczTTZXS0ZMR2taazlQeVZsN2N5ek93TQ==","repeats":1},{"count":1803,"lower_bound":"dDk1Q043bGFRT0F4Qko2S05mc2s3TXZCQTV2MHZKNzZUcFdxd1AzcEhmTlZKUmVRY0RlWk5BT2NYcUhhdVM=","upper_bound":"dFN6Q1Y=","repeats":1},{"count":1811,"lower_bound":"dFZGRVliempSbEV2a2RaWlZxQmlOOHI3aXhZSzkwd040Z3E5TlZ4N1JLbQ==","upper_bound":"dHBaVzVXblU4SzlOVllVaTF5cTUwODdicHNyWHVaWkJvVDlWRnRsZw==","repeats":1},{"count":1819,"lower_bound":"dHZHRTVkYXF3bmVENnJrVFlUaEtwYU1acWlmWnlOQ1VDakJlWnIzOWNYbkRSOEJRMzE4cnZoVGZPQw==","upper_bound":"dThlNFpFMG8=","repeats":1},{"count":1827,"lower_bound":"dUNwMDhtMjc=","upper_bound":"dVd3SFBTSnZRRnFiM2ZHY01YbVBSWlBPdGZsSW5HSk5FQk9MSDNXcWM2aXlydHZHdnNtY2FKek9zamRwdFFKeA==","repeats":1},{"count":1835,"lower_bound":"dWQ=","upper_bound":"dXFjMkQwR05yek9sUU93ZlpvQVdGUXBvOE9uczRQNUhjMHFCdVk3V0dEUERBeQ==","repeats":1},{"count":1843,"lower_bound":"dXNseDQ4eFdDZllUN3dKUUtkVmdDRFlBV3ZoT0tFeWJZeXFUWUhGMTRTSWJNSW9ZRGRyclZKaXVrWGRPYW9sMw==","upper_bound":"djh4U1o0cE9zMmprdk5nUjZL","repeats":1},{"count":1851,"lower_bound":"djlEalB3UElaNkNlcU1zNko2OXd5Mk9xaUJKWmlFanEzRUxtbk1CN1M2dU51M0dxTVlsd2ZDTXR2ZjVLTVVI","upper_bound":"dkh6Y2dMenF1ODhrMXlBUXZWUFAxekJEZk1wcmxXUUkxWUppVm1LMFVhVzF0dA==","repeats":1},{"count":1859,"lower_bound":"dkxhOUtsRktNY2cwbEQ5SWhxZlRydmJWVmExVWpkMFduN1VQRWhKTHNucjM=","upper_bound":"dllrS0N5T0IzWWtDd2o2RzNYMVhtMkl6SXJzajJYTUQ2cHhzU25xbE5hTUhWSVRGb2lodUpSSFI=","repeats":1},{"count":1867,"lower_bound":"dlo=","upper_bound":"dm9xQkZxeVlsYmlwWlZBQk15QzZjMkZ5Rg==","repeats":1},{"count":1875,"lower_bound":"dnBHNkVQQm4xVHJmamQyVUgwQXoyckRqbUp0a0ZkcUZlTmY5TUE5SA==","upper_bound":"dno1NUE5TUd4UkpzTnBsbXQ2UUV5OVU5RloyMDBCbVV1Sks2TmR1R3RRWTI1a3JJZGt1SFRKWmJn","repeats":1},{"count":1883,"lower_bound":"dzlqOTVMWFVzdU9KckE=","upper_bound":"d044eFVtZGo1aGN2RlJMTGVuVkxCaGpZZlNBcjcyalZuRDBjWGV4aUR5cVllcnp1eEw4dkc=","repeats":1},{"count":1891,"lower_bound":"d1lsTDA2RnJONGpYQWdxdTJjRDVDM1RCY251N2gwb2hnT2pHcEp4YzNiYnNmZDZoMnc=","upper_bound":"d2VtVFFIWnNRV0Mx","repeats":1},{"count":1899,"lower_bound":"d2ZXVXlId0tkUlZMMWpncnU4ZlIzeGxIV0JSUjVybmMyemtkdDNMUGdGa0tvbjUyZ1p5NGlT","upper_bound":"d21IbE5iM0xNVDlTTzNhVVlpNw==","repeats":1},{"count":1907,"lower_bound":"d29PalE=","upper_bound":"d3lwWUVqRHZDbmgyNEdPaDlOeVVicjNIeDJBdkM4MHFxdVEyUVA5UlZJSHVaUm94cw==","repeats":1},{"count":1915,"lower_bound":"eDFpVVk3bWloSWEwUkpyN3BMTnc2SHZZVmk=","upper_bound":"eEJjR3VwdlRtV3NMTDRQbWZobG1YMmtnNTZ6Wg==","repeats":1},{"count":1923,"lower_bound":"eEM1T1JTeU9aRGw5QVFoNFFFTFpLdzdrR1lBb3RCanB4elNQQUFBemlRVWJMWkFiazlm","upper_bound":"eFJtalE4alZ0UE5VZG9JNXdxa1BjaGRY","repeats":1},{"count":1931,"lower_bound":"eFprb3lXUlU=","upper_bound":"eGxMaE8zM3I4QkhpVERQNmZRd3lUNVNrdFZadnp6V2cy","repeats":1},{"count":1939,"lower_bound":"eHBYdTAySlo4bWs0dmV0R0ZZeTRzeFA0aHpYdjluZmJ4UFVIalNNbmJxeHhqZklXTXRhalhZd1lCRw==","upper_bound":"eQ==","repeats":1},{"count":1947,"lower_bound":"eTJrVnlycUZMZk9HQzVIWjJFV2NLVDR0VGlFSlVObmRKczA=","upper_bound":"eUpqd0J2aE1rU1E3Q1pJME0wb24wd2pEcUljYk5BQ1g=","repeats":1},{"count":1955,"lower_bound":"eUt1U0RKaGZQTlNUZEYyVWdwcUxmd3F5","upper_bound":"eVpFOFJ2TG1K","repeats":1},{"count":1963,"lower_bound":"eWFtWDJXR0VVR3pzZkY=","upper_bound":"eWxKdWVvaEdHQ1FtMXJGMXZzdjQ5ZDhDSkFlV0VmNzJwNFdPUzczbFFnbVFCVlNjdjdUNVZvTWpkQ1NOclNo","repeats":1},{"count":1973,"lower_bound":"eW5wOG9xS2JVbmt5QUlDZlM4WnZubzJS","upper_bound":"eg==","repeats":2},{"count":1981,"lower_bound":"ejBNck9TVWRmNmZYRUhBNGF3Z09HYmNVSFdLS2E3WmJTbm9XMkprRTdaR3FKd3RzWW81VWhWblI2QmJEazFB","upper_bound":"elBweU5adFJWNFlkbTV3SG1WQnBxd0M5aG9EZDAzYnVjcHE=","repeats":1},{"count":1989,"lower_bound":"elVZbVdDV1c2SXhZYXNlalUxbmNlSTJndGg0bXpodU5jWXpqSW56Z29SdVlSdVVEWEhNMTJL","upper_bound":"ellXalU4SWZEcXpHbVdmZTVVVXpremVpNXNDbERKRWp1RHdscUNKZFFsN0U0a0pyYW53cQ==","repeats":1},{"count":1997,"lower_bound":"emFmQU9GRWp3U0pGVDRGTFlKcTlzOTJnbw==","upper_bound":"enVJcGVQTEx5Qmxm","repeats":1},{"count":1999,"lower_bound":"enp4aXNCYWxVYUZoSHRDUXFONDNUT3pvQ0Q5dTZOdE4zcA==","upper_bound":"enp4aXNCYWxVYUZoSHRDUXFONDNUT3pvQ0Q5dTZOdE4zcA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,1,2,0,2,0,1,1,0,1,1,0,1,1,1,0,0,0,3,1,2,2,3,0,0,0,0,2,1,2,1,0,1,0,0,2,1,0,1,0,1,1,1,2,0,0,1,0,1,2,1,0,1,0,1,1,1,1,1,1,1,1,2,0,1,3,1,1,0,2,1,2,0,1,1,1,0,2,0,1,4,1,0,1,1,0,0,2,2,1,1,1,1,0,1,1,1,2,0,1,1,1,1,1,2,0,0,2,0,2,0,2,0,1,1,0,1,0,1,2,1,1,2,1,1,1,0,2,2,3,1,0,2,1,0,2,1,0,1,0,2,1,2,0,0,1,0,1,0,1,1,1,1,0,0,0,3,0,1,0,0,1,0,0,1,1,2,1,0,1,2,0,1,0,0,1,0,1,2,1,1,0,2,4,1,1,1,3,2,1,1,1,1,1,2,2,1,0,0,0,0,0,0,0,0,1,0,2,0,3,1,0,0,1,1,1,1,1,0,1,1,0,1,1,2,4,0,1,4,2,0,0,0,1,1,0,1,1,1,0,1,0,0,2,0,0,0,2,0,0,1,2,5,0,0,1,0,2,1,2,2,3,1,3,3,1,1,0,1,0,2,1,0,1,1,2,1,4,0,1,1,1,1,0,3,0,2,0,1,0,1,0,2,2,1,1,1,1,2,1,1,1,1,1,0,0,0,0,3,1,0,1,1,0,2,0,0,1,1,1,0,1,1,1,2,0,1,1,0,2,0,0,1,3,1,1,2,1,1,2,1,0,1,1,2,1,1,0,3,0,2,3,0,0,1,1,2,2,3,1,0,0,0,2,2,1,0,0,0,2,0,0,1,1,1,1,2,0,1,1,2,1,0,0,1,2,0,1,0,0,1,1,2,1,0,0,0,2,2,2,3,1,3,1,1,3,0,1,0,1,0,0,1,0,0,1,0,2,0,1,0,2,2,2,0,0,0,1,0,2,1,2,4,1,0,0,2,2,0,0,0,0,3,0,0,1,0,3,1,1,1,2,0,1,0,0,2,2,0,0,0,0,2,0,1,1,0,0,1,0,2,1,4,0,0,1,3,2,2,1,0,2,1,0,0,1,2,0,1,1,2,1,0,0,2,0,3,0,0,1,0,3,2,1,1,0,0,0,0,0,0,2,1,1,2,1,0,1,1,0,1,1,1,2,2,3,3,0,1,1,2,0,3,2,0,2,0,1,1,0,0,1,1,1,1,0,3,1,4,0,1,2,2,0,1,1,1,1,0,0,0,1,2,0,0,1,2,0,0,0,1,1,1,0,2,0,0,2,4,2,1,1,4,1,1,0,1,1,0,2,1,1,1,3,1,1,0,0,1,1,2,2,0,2,0,0,1,1,1,1,0,2,2,1,1,1,0,0,2,3,2,1,1,2,2,0,4,1,0,0,1,1,1,1,2,1,1,2,2,1,0,2,0,1,0,2,1,1,1,4,1,0,1,1,1,3,1,0,0,0,0,1,3,1,2,3,1,0,0,0,0,2,1,3,1,2,1,1,1,4,0,0,1,2,1,1,0,0,0,3,2,1,0,0,1,1,1,0,0,1,0,1,1,2,1,1,0,1,1,1,0,0,0,1,0,2,2,1,1,1,0,2,1,0,1,1,0,1,1,0,0,1,5,1,0,1,0,1,0,0,2,2,2,1,0,0,0,2,0,2,0,1,0,2,2,0,0,2,1,1,0,0,1,0,0,2,1,0,0,2,0,1,1,1,1,2,0,1,0,1,2,0,1,0,1,0,1,2,0,1,2,1,0,2,0,0,0,0,1,2,1,1,1,0,1,1,2,2,0,1,0,2,0,2,0,1,0,1,0,0,1,2,0,2,2,3,0,1,1,1,0,0,1,0,0,3,1,2,1,1,1,1,1,2,0,1,0,1,2,2,1,0,1,1,1,0,0,3,2,0,0,3,3,1,1,1,3,0,1,1,1,0,2,0,0,0,0,0,1,2,0,2,1,2,0,1,1,0,0,2,1,2,2,0,0,0,1,1,3,2,0,0,2,0,1,1,4,2,1,0,0,2,0,0,2,0,2,1,1,1,1,1,1,0,1,1,0,1,1,1,2,0,0,2,3,2,1,1,2,0,1,1,1,1,2,1,1,1,1,0,0,0,2,0,3,1,1,0,1,1,1,2,2,1,1,3,2,0,0,0,0,1,0,2,2,0,3,0,0,2,0,2,0,0,1,4,1,1,2,2,1,1,0,3,3,2,0,1,1,1,0,1,0,0,1,3,2,1,0,1,0,1,0,0,0,1,1,1,2,1,1,1,1,1,0,2,3,2,1,1,1,2,0,0,1,2,1,0,2,0,2,0,1,1,2,1,1,2,0,1,0,1,2,0,1,1,2,1,2,0,1,0,1,0,1,1,0,0,1,0,2,1,0,2,1,1,1,2,2,1,2,1,0,2,1,1,3,1,2,0,2,0,2,0,4,1,0,2,2,2,0,1,0,2,2,0,0,0,0,1,1,2,2,1,1,0,0,0,2,0,1,0,2,0,1,1,2,2,0,1,2,0,0,1,2,0,2,1,1,1,1,1,0,3,0,1,1,1,0,0,2,0,2,2,0,0,0,0,0,3,0,2,2,1,1,3,1,3,0,1,2,2,0,0,1,2,1,0,0,0,1,0,0,3,2,1,0,0,2,0,0,0,1,0,1,2,0,1,0,0,1,1,3,0,1,1,0,0,1,1,1,2,0,1,2,0,2,0,0,2,0,1,2,1,0,2,0,0,1,0,1,0,1,0,0,1,1,1,2,1,0,0,1,1,0,2,0,0,0,1,0,4,1,1,0,0,3,0,0,0,0,0,0,2,0,1,3,1,1,0,4,0,2,1,0,1,1,0,0,0,0,0,4,2,2,1,1,2,2,0,1,0,0,0,1,2,1,3,2,4,1,3,3,0,0,1,0,2,0,1,0,0,1,0,0,1,1,2,0,0,0,1,0,0,0,2,0,0,0,2,0,0,2,2,1,1,0,3,1,1,0,1,3,4,2,2,0,0,0,1,0,4,2,2,2,0,1,1,0,0,0,2,1,0,1,0,1,1,2,1,1,1,0,0,4,1,0,1,2,2,1,0,0,0,0,0,0,2,2,2,0,3,0,0,1,0,3,1,2,0,1,3,1,0,1,1,1,4,0,1,1,0,1,0,1,1,1,2,3,0,4,0,1,1,1,3,0,2,3,1,1,0,0,0,0,0,0,1,4,1,1,1,1,0,1,2,2,0,1,0,1,1,1,3,1,1,0,0,5,1,0,2,2,0,0,2,0,0,1,3,2,2,0,2,0,0,0,0,0,0,0,1,1,0,1,0,1,1,0,1,1,1,1,0,1,0,1,1,0,2,1,0,0,0,1,1,0,1,0,1,3,2,0,1,0,0,0,1,1,0,2,2,1,0,2,2,0,2,0,1,3,0,2,1,1,2,0,1,2,1,1,2,1,2,1,2,1,1,1,0,1,3,0,0,2,0,2,0,0,0,1,2,1,1,1,1,0,1,1,1,1,0,0,2,1,1,1,1,0,4,0,1,2,1,3,2,0,3,1,2,0,1,0,1,0,0,1,1,1,2,2,3,1,1,0,0,1,2,1,1,0,1,1,2,2,1,1,0,0,1,1,0,0,0,1,1,0,1,2,2,3,6,1,0,0,1,1,2,1,0,1,3,4,0,1,0,0,3,1,0,0,0,3,1,1,0,1,0,3,1,1,2,1,1,0,2,0,1,3,0,3,0,2,1,0,0,0,3,2,1,1,1,1,0,1,3,1,1,1,0,2,2,2,2,0,1,0,0,2,0,0,2,0,0,1,0,0,2,1,1,1,0,0,4,3,1,1,1,3,4,1,0,0,3,0,1,0,0,0,0,2,1,0,2,0,2,1,1,0,1,2,0,0,1,0,1,1,2,2,0,1,2,1,0,2,0,2,0,2,0,1,1,0,0,0,1,0,0,0,0,2,2,2,0,0,0,0,0,2,0,3,0,2,1,0,2,0,1,1,1,0,0,2,1,1,2,0,2,1,1,0,1,1,0,2,0,1,0,2,0,0,3,1,0,0,3,2,1,1,0,0,2,1,0,3,0,1,2,1,2,1,0,1,0,1,2,1,0,1,1,0,1,1,2,0,0,1,1,2,1,0,1,1,0,1,2,0,1,0,1,0,1,0,2,1,1,2,1,1,2,1,1,1,1,0,0,0,0,1,0,1,1,0,1,1,1,1,1,1,0,2,2,3,2,0,1,1,0,0,1,1,4,1,1,1,0,3,1,0,1,1,1,1,0,1,1,1,1,0,1,3,0,1,1,1,0,1,0,0,0,4,2,3,1,1,2,0,1,1,0,2,1,0,2,0,1,4,1,0,1,0,0,0,1,0,1,0,1,0,1,1,0,0,0,0,0,1,0,1,2,2,1,1,1,0,0,0,0,1,0,0,0,0,0,4,1,2,1,2,3,1,2,3,0,1,2,0,3,1,3,2,0,0,0,0,0,3,0,2,1,0,0,2,0,0,1,1,0,0,3,0,1,1,2,2,0,1,0,3,2,1,1,1,2,2,2,2,2,0,0,0,0,1,1,0,0,1]},{"counters":[0,0,0,1,0,2,0,2,2,1,0,1,0,2,1,2,1,0,1,4,0,0,0,2,1,1,1,0,0,1,1,2,0,1,1,2,1,0,1,0,1,0,0,1,2,1,0,0,0,3,1,1,0,1,1,3,2,3,0,0,2,1,0,0,1,0,1,3,1,4,0,1,1,0,2,2,0,0,2,1,1,0,2,1,1,0,1,1,1,1,1,1,1,3,0,0,3,0,2,1,1,2,1,4,3,1,1,0,3,1,2,2,3,0,0,2,0,2,2,0,0,0,1,0,2,0,1,0,4,1,0,1,4,2,0,6,1,0,0,2,4,1,1,1,1,3,3,0,1,1,0,1,2,1,5,1,3,2,2,1,2,2,1,2,0,0,0,0,4,1,4,0,1,1,0,1,1,2,1,1,0,0,2,1,3,0,0,1,0,1,0,3,1,0,1,3,1,2,3,0,1,1,3,0,0,0,2,0,1,1,2,2,1,2,1,0,2,1,0,1,0,0,1,0,0,1,1,0,3,1,1,1,0,3,0,0,1,2,0,2,2,2,0,0,2,1,0,1,0,2,1,1,1,1,0,1,2,1,0,2,0,1,1,3,1,2,0,2,2,1,0,2,0,4,0,3,0,1,1,0,3,2,2,0,1,2,3,0,2,3,1,1,0,2,0,0,1,1,0,0,2,2,1,0,2,0,4,0,1,0,0,3,2,1,1,3,0,1,0,1,2,0,0,2,0,1,0,0,1,1,1,1,0,1,1,1,1,2,3,0,2,0,1,0,1,1,0,0,0,1,1,0,1,1,1,0,0,0,3,0,1,1,1,4,1,2,1,0,2,1,0,0,0,1,0,2,2,0,0,4,0,0,1,1,2,3,1,1,1,2,1,1,1,1,5,1,0,0,0,0,1,2,1,0,2,1,0,1,4,2,0,1,0,0,0,2,2,2,0,0,1,1,1,1,1,2,2,2,2,1,1,2,0,0,1,0,1,1,0,0,0,4,0,1,0,1,2,0,1,0,0,2,0,0,3,0,2,0,1,2,1,0,0,0,2,0,1,2,0,0,0,3,0,1,1,0,3,1,1,3,2,2,0,1,3,1,2,1,1,0,1,0,1,2,0,3,0,0,1,1,1,0,4,1,1,0,0,3,0,2,1,2,0,1,0,0,0,3,0,0,0,1,0,0,2,0,1,0,0,0,4,0,1,1,1,1,2,1,1,0,2,0,1,1,0,0,0,1,1,1,0,0,1,2,0,1,0,0,2,1,1,1,1,0,1,2,1,0,1,0,0,0,1,0,2,0,2,3,0,0,1,0,0,0,1,2,1,0,1,1,0,2,0,0,2,0,1,1,0,1,1,1,1,2,2,0,3,1,1,1,1,1,1,1,0,1,0,1,0,0,0,0,1,0,1,1,4,2,1,1,0,2,0,1,0,0,1,2,2,0,0,1,1,1,0,1,2,0,6,2,0,0,1,1,1,1,0,0,2,0,1,0,0,0,2,0,2,1,0,3,1,1,1,0,2,2,0,0,0,2,0,0,0,3,1,2,2,1,0,0,1,0,1,2,2,0,0,1,1,0,1,0,1,1,0,4,1,0,1,2,2,0,3,0,1,0,2,0,2,2,1,1,2,0,1,1,0,1,1,0,1,2,0,1,1,0,2,1,1,0,0,3,0,1,3,1,4,3,2,2,3,0,1,3,0,1,0,2,3,3,0,1,0,1,1,0,0,1,1,2,1,0,0,0,3,1,2,0,1,3,1,0,0,1,2,2,1,1,1,0,1,1,3,0,0,0,0,0,0,1,1,0,0,1,1,0,1,3,2,0,0,1,2,0,0,1,1,0,0,0,0,1,1,1,1,1,0,2,3,2,0,1,0,0,1,1,0,0,0,0,1,1,0,1,2,0,0,0,1,3,0,0,0,1,0,1,2,2,1,1,0,1,1,0,1,1,0,1,0,0,0,1,2,0,3,2,2,1,1,0,3,0,0,1,2,3,1,1,0,0,1,1,0,4,0,4,1,1,1,1,2,1,0,0,1,0,0,0,0,0,0,0,0,0,2,1,3,2,1,1,0,4,1,1,2,2,1,0,2,3,0,0,1,0,1,1,0,2,1,2,1,1,1,0,1,1,2,2,1,1,2,0,1,0,1,3,0,1,0,0,1,0,0,0,1,1,0,2,3,0,0,1,4,2,3,0,2,1,0,2,0,2,1,2,1,1,0,1,3,0,1,2,2,1,1,1,0,2,1,1,0,0,1,0,1,1,1,2,0,0,2,1,1,0,1,2,0,0,0,0,1,0,1,1,2,1,0,3,1,3,3,0,1,1,1,0,0,1,1,0,2,2,1,0,2,0,1,1,0,1,1,2,0,0,0,1,0,1,0,0,0,2,2,0,5,2,1,1,0,0,1,0,0,0,1,0,0,1,2,1,2,1,1,2,0,1,3,2,1,0,1,2,1,1,0,0,0,0,1,2,0,2,2,1,2,1,0,1,0,1,0,1,2,1,0,2,0,1,0,0,2,0,0,4,1,1,0,0,2,0,0,0,0,1,1,1,1,1,1,2,1,2,2,2,0,0,1,0,0,0,1,0,3,0,1,0,1,0,4,1,0,0,0,2,2,2,0,1,4,2,2,0,1,2,1,1,0,2,0,2,0,2,1,1,1,0,1,0,0,0,2,0,0,2,1,1,1,0,0,0,0,1,0,2,0,0,0,4,3,1,0,1,1,0,0,0,2,0,0,2,2,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,2,3,1,1,0,2,0,0,0,0,1,1,0,0,0,1,1,2,2,0,1,1,0,1,1,2,0,1,0,0,2,0,1,0,3,0,1,1,1,1,2,2,0,1,1,0,1,0,2,3,1,1,0,0,0,2,1,2,1,1,0,1,2,0,1,2,0,2,1,1,1,1,1,0,1,0,1,1,1,2,1,0,0,0,3,1,2,1,2,1,2,0,1,1,2,0,2,1,0,1,2,1,2,0,0,0,1,1,1,0,0,2,0,1,1,1,0,2,0,0,2,1,1,1,0,0,0,1,1,0,3,2,1,3,0,0,0,2,0,0,5,1,1,2,2,1,1,1,2,1,0,2,0,1,0,2,1,2,2,0,0,3,0,2,0,1,4,1,2,1,1,1,1,0,2,2,1,0,3,0,1,0,1,0,1,1,2,0,1,1,1,1,1,2,0,1,1,3,0,1,1,0,0,1,0,2,0,1,1,0,1,4,0,0,1,0,1,0,1,0,2,1,0,1,2,1,0,1,1,1,0,1,0,0,1,0,1,0,0,0,0,0,1,2,2,1,2,0,2,3,3,1,0,0,0,1,2,1,3,1,1,0,2,3,0,1,2,0,1,2,3,1,1,0,1,1,1,1,0,2,2,3,4,1,1,0,0,0,1,1,1,1,0,0,2,0,0,2,1,0,0,2,2,0,1,1,1,0,0,2,0,1,1,0,0,0,1,0,0,2,3,1,0,3,0,3,0,0,1,2,1,1,1,1,1,0,2,5,0,2,0,1,2,1,1,1,1,0,0,0,4,1,1,0,0,2,1,0,1,0,2,0,0,0,1,0,1,2,1,1,0,1,1,1,1,0,1,1,0,0,2,1,2,1,0,1,1,0,1,0,1,0,2,1,0,0,1,1,0,2,3,0,2,1,1,0,0,2,4,2,1,1,5,1,1,0,1,3,1,1,0,2,0,0,1,1,0,0,1,1,3,1,0,1,1,0,0,0,2,0,0,1,0,0,1,2,1,2,0,3,1,1,1,0,1,1,0,0,0,2,0,0,1,2,1,0,0,1,1,2,1,0,1,0,1,3,1,2,0,3,0,2,0,2,1,0,2,0,1,1,2,0,3,1,1,2,3,1,2,0,0,0,1,1,0,2,0,0,0,2,1,0,0,1,2,0,1,0,3,0,1,0,0,1,2,1,1,1,0,2,0,1,0,2,0,1,0,0,1,0,0,2,1,0,2,1,2,0,0,0,2,0,1,3,2,1,3,0,2,2,0,1,0,1,0,1,1,3,2,1,2,2,0,1,1,1,1,3,0,1,1,0,1,1,2,1,0,1,0,1,0,0,0,2,0,0,0,1,1,3,1,1,1,0,3,2,1,3,0,1,1,0,0,2,0,0,2,0,1,0,0,1,1,0,2,1,2,1,2,1,1,0,1,0,0,1,0,1,1,0,1,1,1,2,0,1,2,2,0,0,1,1,1,0,2,0,0,0,0,1,0,0,3,1,1,1,3,0,1,0,2,1,0,1,2,0,1,0,0,1,1,2,1,0,2,3,0,0,0,1,0,0,3,0,3,0,2,1,1,1,2,2,1,0,0,1,0,0,0,2,1,1,1,2,1,2,1,2,0,1,2,1,2,0,0,1,4,1,0,1,2,1,0,2,2,0,1,1,1,2,3,0,1,1,0,1,1,1,0,1,2,1,4,2,0,0,0,0,1,3,0,3,0,1,1,1,1,0,0,1,1,1,0,0,0,1,0,1,2,1,3,2,1,1,0,2,3,0,2,0,1,1,0,0,2,1,1,1,1,2,1,2,2,1,1,0,1,1,1,1,1,2]},{"counters":[0,0,0,0,0,1,1,0,0,0,1,0,2,0,1,0,1,1,0,3,1,3,2,1,1,1,1,1,0,0,0,4,0,0,1,2,0,0,2,0,0,1,1,3,1,1,2,0,1,0,2,0,0,3,0,2,1,1,2,3,2,2,1,1,0,0,2,0,1,0,1,0,1,1,2,0,1,0,3,0,0,0,0,1,1,2,1,3,2,2,1,1,0,0,2,0,1,0,1,0,1,0,1,1,0,0,2,1,0,1,0,1,2,0,3,0,2,0,2,1,2,1,1,1,2,1,1,1,0,1,1,3,2,0,1,3,1,1,0,1,1,0,2,0,1,0,0,0,1,1,0,1,0,1,0,1,1,1,1,1,3,0,1,2,2,1,0,1,0,0,1,2,1,0,0,0,2,0,1,1,0,1,0,0,2,2,1,0,0,2,1,0,0,1,2,0,0,0,0,0,0,1,0,0,2,3,2,1,1,1,0,1,3,1,1,0,2,0,1,1,0,2,0,1,3,3,2,0,1,1,1,2,1,1,0,0,2,1,1,0,1,0,0,0,0,1,2,0,1,2,2,0,2,2,1,2,0,0,1,1,2,1,3,0,1,0,0,2,0,0,1,1,0,2,2,0,0,2,0,0,0,0,0,0,0,2,1,2,1,0,1,5,1,1,0,0,1,2,3,2,0,1,0,1,2,0,0,1,0,4,2,1,0,1,0,1,2,1,0,0,0,0,1,0,0,1,1,0,1,0,2,0,0,0,0,3,1,1,0,0,1,0,1,3,1,1,2,1,0,3,1,4,0,1,0,1,1,0,1,0,2,0,0,2,2,2,1,2,2,1,1,1,0,1,1,4,1,2,3,1,1,3,1,0,1,0,1,4,0,2,1,2,0,1,1,2,1,2,0,1,0,0,0,0,0,1,1,1,2,1,1,2,2,0,0,0,1,2,1,0,0,1,1,2,3,1,3,1,0,1,0,0,0,0,3,2,0,1,0,2,3,2,1,1,0,1,1,1,0,4,0,1,1,1,0,1,2,0,0,1,3,0,0,0,0,0,0,0,1,1,1,2,3,0,0,0,1,1,2,1,0,1,2,1,1,2,2,1,0,2,0,1,1,2,0,1,2,1,0,1,4,2,1,0,0,2,2,1,0,2,0,0,0,2,0,0,2,0,2,4,0,2,0,0,2,1,1,0,0,0,1,0,1,2,1,1,1,3,1,2,0,1,0,0,0,3,1,1,0,0,1,0,1,2,1,0,0,1,0,0,2,0,1,0,1,2,0,0,1,1,1,0,0,2,3,2,1,0,0,3,0,1,0,1,1,1,2,0,1,1,1,0,0,2,1,0,2,2,0,1,0,1,0,1,0,0,0,0,1,0,3,1,2,0,0,0,1,0,1,0,1,0,2,1,2,1,0,2,3,1,0,1,1,1,1,1,0,1,1,1,2,2,2,2,0,2,0,2,1,0,1,1,1,0,0,2,0,1,1,3,0,2,2,1,0,2,0,1,0,0,0,0,0,2,1,0,2,0,1,1,0,0,3,2,0,2,0,1,0,0,3,1,0,0,1,1,0,2,1,2,2,1,2,1,2,1,0,0,0,0,0,4,2,1,0,0,0,1,0,1,0,0,1,0,0,1,2,0,0,3,1,1,0,2,0,0,0,1,2,1,2,1,0,1,0,0,1,0,1,1,2,3,2,1,0,0,0,1,1,1,0,1,2,1,1,0,2,0,1,1,1,1,0,1,0,1,2,0,1,2,1,1,0,1,1,1,0,0,1,1,1,1,1,3,0,1,2,1,2,1,0,2,1,1,1,0,0,0,1,0,0,0,0,2,0,3,1,2,1,2,1,2,0,0,0,2,0,0,1,2,1,0,1,0,1,4,0,1,2,1,2,0,1,3,1,2,0,0,2,0,2,0,1,1,4,2,0,1,2,1,0,0,2,1,0,3,2,0,0,1,0,1,0,1,0,0,3,0,0,0,0,2,1,1,1,1,2,1,1,0,0,3,3,1,4,2,0,1,1,0,2,1,2,0,4,0,3,0,0,2,1,0,2,0,1,1,0,2,2,1,3,0,0,1,0,3,0,3,0,1,2,0,2,3,0,2,1,3,1,0,1,0,0,1,0,0,2,0,0,0,0,1,0,2,0,1,2,1,1,1,1,0,1,1,1,0,1,1,1,0,2,1,0,2,1,0,1,0,4,1,0,0,1,3,1,1,0,0,2,1,2,0,1,4,3,1,3,0,2,1,1,1,0,0,0,1,0,0,1,1,2,1,1,2,1,1,0,1,0,1,2,2,1,1,2,1,1,3,1,1,0,1,4,0,0,1,2,4,1,2,3,0,0,0,1,0,0,0,1,0,0,1,4,0,4,0,0,2,3,0,1,1,1,1,0,1,1,3,0,4,0,1,3,4,2,2,1,0,1,0,1,1,2,1,2,0,0,2,1,0,1,1,2,0,1,0,2,2,1,2,0,1,0,0,4,0,1,0,1,0,0,1,0,2,0,0,2,0,0,3,2,0,0,1,1,0,1,1,2,1,2,0,1,1,1,1,3,0,0,0,2,0,3,0,0,2,1,2,1,1,2,0,2,3,1,0,1,0,1,3,3,0,0,0,2,1,0,1,0,0,1,0,1,1,0,1,2,3,0,0,0,0,0,1,2,2,0,2,1,2,1,1,1,0,1,0,0,1,2,2,1,2,0,0,1,1,0,1,1,0,2,3,0,0,1,0,1,2,0,1,2,0,3,1,1,0,1,3,1,1,0,2,1,1,0,3,3,0,2,0,3,3,0,2,2,1,2,0,2,2,0,0,0,1,1,1,2,0,0,1,0,0,2,1,2,2,2,1,1,0,0,2,0,1,1,1,1,0,1,1,1,0,0,2,1,0,1,1,2,0,1,1,0,0,2,0,1,0,1,1,1,2,1,2,2,1,0,1,2,1,1,1,1,0,0,2,0,1,1,1,0,0,0,1,1,0,2,0,2,1,0,1,1,1,0,2,1,1,0,2,0,3,6,0,2,2,1,4,3,0,1,1,1,1,0,2,0,1,2,0,1,1,0,1,2,1,1,2,0,1,0,0,3,1,3,1,1,0,2,2,1,1,2,0,2,0,1,1,0,1,2,3,1,0,0,3,0,1,1,1,0,0,2,1,0,2,1,2,2,1,3,0,0,2,0,1,0,1,0,0,1,0,0,1,1,1,1,3,0,0,3,1,2,1,0,2,0,1,0,0,0,2,0,0,2,1,0,2,3,1,1,1,2,2,3,1,0,0,1,0,2,0,1,0,0,1,0,2,0,0,2,3,1,0,2,0,1,1,0,1,1,2,1,0,0,3,1,0,1,0,1,0,1,0,0,1,1,0,1,4,1,0,2,1,2,0,3,0,0,0,0,1,1,0,1,0,0,1,3,0,0,0,0,0,0,0,1,0,3,1,1,0,0,1,2,0,0,1,1,1,0,2,1,1,0,1,0,1,0,0,1,0,1,1,1,0,1,0,1,3,0,0,1,4,2,0,0,1,1,2,2,0,2,1,0,1,1,0,1,0,0,2,1,1,0,1,0,1,0,3,1,1,1,3,1,1,1,0,1,1,2,0,2,2,1,1,1,0,1,1,1,2,1,0,0,1,2,0,2,0,0,0,2,0,0,1,1,1,1,2,0,0,2,1,0,0,2,1,0,0,1,1,1,1,0,3,0,0,0,0,2,0,1,3,1,1,2,0,2,0,3,1,0,1,0,3,3,0,2,1,2,0,0,1,2,4,1,0,0,0,0,2,2,1,0,1,3,0,2,2,2,1,0,1,1,1,1,1,1,2,2,0,1,2,0,1,2,0,0,0,1,0,0,0,2,1,1,0,1,1,1,0,0,0,0,2,1,0,2,0,1,1,0,2,1,1,3,3,0,1,1,0,1,0,1,0,0,3,2,1,2,2,1,1,3,1,1,1,1,2,0,3,1,0,1,1,1,0,1,0,1,4,0,1,3,1,1,0,0,0,1,1,0,1,2,0,2,1,0,1,1,1,0,0,1,3,0,1,0,1,3,0,1,0,0,1,2,1,1,2,4,2,2,0,0,1,0,1,0,5,0,4,0,0,1,2,0,0,0,0,0,1,0,2,1,0,4,0,2,2,1,1,1,1,1,0,0,2,2,0,2,0,1,1,2,1,3,0,0,3,1,2,0,2,0,0,0,0,1,1,2,2,1,1,0,0,1,0,0,2,4,2,1,1,2,0,0,1,1,1,2,1,4,1,0,2,0,0,2,0,4,2,0,0,1,1,1,0,1,2,0,0,1,1,1,0,1,2,2,2,0,1,0,0,1,1,1,1,1,2,0,0,0,0,1,2,0,0,2,1,0,1,1,1,1,5,0,1,1,1,0,1,1,0,0,1,4,2,2,0,2,0,0,3,0,2,0,1,0,2,0,0,0,1,0,2,1,0,2,0,4,2,1,0,0,4,1,0,0,1,0,0,2,0,2,0,3,2,2,1,1,1,2,1,2,1,0,0,4,1,3,0,1,2,1,2,1,2,0,0,2,2,0,1,4,0,2,1,0,1,3,1,0,3,1,1,3,0,1,0,0,0,1,2,1,0,0,0]},{"counters":[1,1,2,3,0,2,0,2,0,0,1,1,1,0,0,2,0,0,0,1,0,1,3,2,0,1,0,0,0,1,1,0,0,2,0,0,0,1,2,1,1,1,2,0,1,1,1,1,0,2,2,0,1,1,1,0,2,2,1,0,1,0,1,1,0,1,1,1,1,0,1,2,2,0,2,1,1,1,1,0,1,3,2,1,2,0,0,1,3,1,3,0,1,1,0,0,1,0,0,1,1,2,0,0,0,0,1,3,2,0,2,2,3,2,1,3,2,1,0,3,2,2,1,3,2,0,0,1,0,2,3,1,0,1,1,0,2,2,0,2,0,0,3,0,0,1,1,0,3,1,2,0,2,2,1,2,2,0,2,0,0,1,1,2,0,0,0,1,0,1,0,1,1,0,2,1,2,2,0,1,0,1,1,3,1,1,0,0,2,0,0,3,0,0,0,2,0,2,1,0,1,2,2,1,2,0,0,1,2,0,0,0,1,2,4,0,0,0,3,0,0,0,2,1,2,2,0,0,2,2,1,1,1,0,2,0,0,1,0,1,5,1,0,0,1,1,1,1,0,2,0,0,0,2,1,0,3,0,4,4,0,0,2,0,3,0,0,1,0,1,1,0,0,0,0,1,1,0,2,1,2,3,0,0,1,1,0,0,1,2,0,3,1,0,0,1,1,3,2,0,2,0,0,0,2,0,0,1,2,3,2,0,0,0,1,0,1,2,0,0,0,1,2,5,1,1,0,3,1,0,1,1,1,0,4,1,1,0,0,0,0,3,2,2,1,2,3,4,1,0,2,1,3,0,1,1,0,1,0,2,0,1,2,1,2,0,2,1,0,0,0,0,0,1,2,0,0,1,1,1,2,2,3,2,0,0,2,1,1,3,3,2,2,0,0,0,1,0,1,1,2,0,1,3,1,1,2,3,1,1,3,0,2,1,1,0,0,0,1,2,0,0,0,1,0,3,1,2,0,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,0,0,1,0,3,1,2,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,1,0,2,0,0,5,0,0,0,1,1,5,0,1,2,1,1,2,0,1,0,2,1,0,1,1,2,1,0,0,0,0,0,1,1,2,1,0,0,0,2,1,0,0,1,0,0,1,3,0,1,2,0,0,2,1,0,2,0,0,0,1,1,4,0,1,1,1,0,1,2,0,1,1,4,0,0,2,1,1,1,0,1,1,2,1,0,1,0,0,1,0,2,0,0,3,1,0,1,1,1,2,0,1,0,1,2,1,2,1,0,2,2,1,1,1,0,4,0,0,2,1,1,0,1,1,1,1,1,2,5,0,1,0,4,2,2,1,0,0,0,0,7,0,0,1,1,0,3,0,0,0,1,1,0,4,2,1,0,1,0,1,1,1,0,1,1,1,1,1,0,3,2,1,1,2,1,2,1,0,2,0,1,1,0,0,1,0,1,3,4,1,0,0,1,0,4,0,0,0,3,0,2,1,2,1,2,0,0,0,3,1,1,1,2,1,0,1,0,0,1,0,2,0,1,0,2,1,0,1,3,1,1,1,1,1,3,2,2,1,1,0,2,3,1,0,1,1,1,0,1,1,2,1,1,0,1,0,1,1,1,3,2,0,0,1,0,1,0,0,0,0,1,0,1,0,2,1,0,1,0,0,0,1,2,1,2,0,0,1,1,0,2,0,0,0,1,0,0,0,3,1,0,2,1,0,1,5,1,0,1,0,0,0,1,0,1,0,2,3,1,0,5,0,0,1,0,0,1,1,1,1,0,1,1,4,2,1,2,0,1,1,0,1,0,2,1,0,0,0,2,1,2,1,0,1,1,0,0,0,0,4,0,0,0,1,0,1,0,3,2,1,0,0,2,1,1,3,0,0,0,2,2,1,0,1,1,0,3,0,2,0,0,0,2,0,0,0,1,0,1,1,0,1,2,1,1,1,3,0,2,2,1,0,1,0,1,1,1,0,1,3,2,1,0,0,0,0,0,0,1,4,1,0,0,2,1,0,0,1,0,0,1,0,1,1,2,2,0,1,1,0,1,1,1,1,1,0,0,0,1,2,2,1,2,1,2,1,0,1,0,1,1,2,0,1,0,1,0,2,1,0,0,1,1,2,0,1,3,1,0,1,1,1,2,1,2,0,1,1,1,3,2,3,1,1,1,3,1,1,0,0,1,1,0,1,1,0,1,0,0,2,2,0,1,0,3,3,0,2,0,0,1,1,0,0,0,0,2,2,0,1,0,2,2,0,0,3,1,0,0,0,2,1,1,1,1,2,0,2,2,0,2,0,1,3,0,0,0,0,0,1,1,0,1,1,0,2,0,1,1,0,1,1,0,1,1,0,3,0,1,0,0,1,1,2,1,1,0,1,0,2,2,0,2,3,0,1,1,0,1,2,0,2,1,0,0,1,1,1,0,0,0,1,0,0,1,1,0,0,3,0,4,0,1,2,0,1,1,2,2,3,2,1,3,0,1,1,1,1,2,0,0,1,2,1,2,1,0,1,0,1,1,3,0,0,2,0,1,1,1,1,0,0,1,1,0,0,0,0,1,2,0,2,1,1,1,2,0,0,1,1,1,1,1,4,0,0,1,0,2,0,0,1,1,1,2,1,2,0,0,1,2,1,0,1,1,1,0,1,0,1,1,1,2,1,0,0,1,1,2,2,1,1,1,1,1,1,3,1,1,0,0,1,3,0,1,1,0,0,1,0,0,3,0,1,2,0,1,1,1,1,1,1,1,0,1,1,1,0,2,0,0,1,0,1,1,0,1,1,1,1,0,1,0,2,0,1,1,0,1,2,0,0,0,0,1,0,0,2,1,3,2,1,0,2,0,1,0,2,1,0,1,0,0,2,1,1,0,1,0,0,0,1,0,2,2,0,0,1,1,0,1,3,1,2,0,1,0,1,1,1,1,0,0,1,1,0,2,1,0,0,0,0,0,1,0,1,1,1,0,0,3,1,2,1,2,2,3,0,0,1,1,0,0,2,1,1,0,0,2,1,1,1,1,2,0,0,1,1,3,0,0,0,2,3,1,2,2,1,0,1,3,1,1,0,0,3,1,1,1,2,1,1,1,0,1,0,1,1,1,1,0,2,4,1,0,1,3,0,1,1,0,0,0,1,1,1,0,2,0,0,0,1,2,1,0,3,1,0,0,1,0,1,1,1,0,1,0,0,0,5,0,0,0,0,2,1,1,0,0,0,0,0,0,2,2,0,2,2,0,1,0,1,1,1,0,1,1,1,2,1,0,0,0,0,1,2,3,1,1,1,0,3,2,3,0,0,1,0,0,2,1,2,3,0,0,0,1,1,1,2,1,0,1,0,1,1,1,2,1,0,2,3,2,0,1,2,1,0,1,0,0,0,2,2,0,1,2,2,0,0,2,0,1,1,3,1,0,2,2,2,1,3,0,0,1,0,0,4,3,1,0,0,3,3,2,0,1,0,0,2,3,1,0,0,1,0,1,1,2,0,0,0,0,1,1,2,3,1,2,0,2,0,0,0,3,2,1,3,0,1,2,0,2,2,0,1,1,0,0,2,1,1,1,2,0,1,0,2,2,2,2,2,2,3,2,2,0,1,0,1,0,0,2,0,1,0,0,1,1,1,1,1,2,3,1,1,0,0,0,0,1,1,0,1,0,0,0,2,2,1,0,1,2,1,0,2,2,0,1,0,1,0,1,1,2,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,3,0,1,2,1,1,3,2,1,2,2,0,2,0,2,0,2,3,0,1,1,0,0,0,1,0,2,0,1,0,1,0,0,2,2,0,0,1,0,1,2,0,0,2,0,0,1,0,1,2,3,2,0,2,1,1,2,4,2,2,2,1,1,1,0,2,2,2,1,1,1,2,1,1,1,0,1,1,1,2,1,0,0,2,0,2,1,2,0,1,1,2,0,0,3,0,2,0,1,0,1,2,4,0,0,0,1,1,1,4,0,0,1,1,0,1,2,0,1,1,0,0,1,3,2,0,2,1,0,0,0,0,1,1,0,1,3,1,0,1,1,0,1,2,0,0,1,1,2,1,2,1,3,0,1,1,1,1,2,3,3,1,0,2,1,0,0,1,1,0,0,1,0,0,1,1,1,1,2,0,1,2,1,1,1,1,0,1,0,0,0,0,4,1,0,2,0,2,0,1,1,3,2,0,0,2,4,3,1,4,0,3,0,0,2,0,2,0,3,0,1,2,1,1,1,1,1,1,0,0,1,0,0,1,1,3,1,2,1,2,1,3,0,2,1,0,0,2,0,1,1,1,1,1,3,0,1,2,0,2,1,1,1,0,0,0,1,0,2,3,1,1,0,2,1,1,2,4,2,0,1,1,0,0,1,0,2,1,1,0,0,1,0,3,0,1,1,0,2,3,0,0,1,2,0,2,2,3,0,1,1,0,0,0,3,5,0,0,6,2,1,1,2,1,1,1,1,0,3,3,2,1,0,0,0,1,1,0,2,1,0,1,2,1,3,0,0,0,1,0,1,1,2,0,2,3,2,0,0,1,0,2,2,0,2,0,0,3,1,4,0,1,1,2]},{"counters":[2,4,0,1,1,0,3,0,2,1,0,1,1,1,2,3,1,0,1,0,1,1,1,1,0,1,0,2,0,2,0,1,2,2,1,1,2,2,2,0,0,3,2,1,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,1,1,2,1,2,1,2,1,0,1,0,0,0,1,0,1,3,0,1,2,2,1,1,2,1,0,0,1,3,2,0,2,0,1,1,0,0,0,1,0,1,1,1,0,0,1,2,1,1,2,0,3,1,0,0,2,0,2,0,1,0,0,2,3,2,1,1,0,2,1,2,0,2,1,1,0,1,0,2,1,1,1,0,0,1,3,2,0,0,0,0,1,1,1,1,1,0,2,0,0,0,1,2,0,0,1,0,3,0,1,0,5,0,1,2,0,0,2,0,1,1,1,0,2,2,0,1,0,2,0,2,1,3,0,1,1,1,1,0,0,1,0,4,2,0,0,0,0,0,0,2,0,2,0,0,1,1,2,2,2,1,1,2,2,0,1,0,2,0,1,0,1,2,1,2,3,0,2,0,1,2,0,0,2,2,0,0,1,2,1,0,1,0,0,2,3,0,2,3,0,2,1,1,1,1,2,1,2,1,0,3,0,1,1,2,1,0,2,0,2,1,3,1,2,1,0,2,2,0,1,0,1,1,1,2,1,0,0,0,1,0,1,1,1,2,0,2,2,0,2,0,1,0,1,0,2,1,1,0,1,2,2,2,1,3,1,0,2,0,0,1,1,0,0,1,1,1,1,2,3,1,2,0,2,2,1,0,1,0,1,2,0,1,0,0,1,0,1,0,2,0,2,2,0,0,0,3,4,0,1,1,0,2,1,1,0,2,0,3,1,1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,1,1,0,1,0,1,1,1,2,0,0,2,3,0,1,0,2,1,0,1,0,2,0,1,1,1,0,1,0,3,1,1,1,1,1,0,1,2,2,1,0,0,0,3,3,2,0,0,0,2,2,1,1,0,1,1,1,0,2,2,0,0,2,0,1,3,3,1,0,1,0,0,0,0,0,0,1,3,2,0,3,2,0,0,0,0,0,1,0,2,0,0,1,0,0,0,0,2,0,1,0,1,1,1,0,4,1,1,2,0,0,1,0,0,0,2,0,1,0,1,1,1,1,0,0,1,1,1,0,0,1,0,1,2,1,1,1,0,1,1,0,0,3,2,1,1,1,1,0,0,0,0,0,0,0,0,1,2,0,1,2,2,0,1,1,2,0,1,0,0,0,3,1,2,0,0,2,1,0,2,0,0,1,1,2,1,2,1,1,0,1,0,2,0,0,0,1,2,0,0,0,2,1,1,2,2,3,1,3,0,0,3,3,0,0,1,0,0,0,1,2,0,0,1,2,0,0,1,1,1,1,0,0,0,1,0,0,1,2,0,0,0,0,1,1,1,1,1,2,0,2,0,0,0,2,1,1,2,2,0,0,1,0,0,0,0,1,0,0,1,3,0,0,1,1,1,0,1,0,0,0,2,0,3,1,1,2,1,1,2,2,1,0,1,0,1,0,1,2,0,2,2,3,0,3,3,1,1,1,0,1,1,2,2,4,1,0,2,1,0,2,2,0,2,1,3,0,0,1,0,2,1,0,1,2,1,0,1,2,0,3,0,2,0,0,1,0,2,3,0,1,2,2,0,1,2,0,1,0,1,1,1,1,1,1,0,2,0,1,2,0,2,0,1,2,3,1,1,1,2,0,1,2,0,3,0,0,2,1,0,0,3,0,1,1,3,0,1,0,1,0,0,2,0,1,0,1,2,1,2,0,0,0,0,1,2,1,2,0,1,0,1,1,1,0,1,1,0,0,2,1,0,1,1,2,1,1,0,0,1,1,1,1,1,0,1,1,1,0,0,0,0,2,0,2,3,2,0,1,0,1,0,2,1,0,0,2,0,2,2,0,0,1,1,1,1,1,1,0,2,0,1,2,1,1,0,0,0,0,1,0,0,1,0,0,1,3,1,2,2,2,2,1,1,0,1,0,0,1,1,1,2,2,3,0,0,2,1,0,1,0,1,3,1,0,2,0,4,0,2,1,0,1,0,0,2,0,2,0,0,1,1,1,0,0,1,0,0,3,0,0,1,0,0,1,0,1,2,0,1,1,1,0,1,1,1,3,3,0,2,0,0,1,1,1,0,0,1,0,1,1,0,1,1,3,2,0,1,1,0,1,0,1,1,4,1,3,0,1,0,1,1,0,0,1,0,1,1,0,0,0,0,1,1,1,1,0,2,0,1,0,1,0,0,0,1,1,0,1,2,1,1,1,2,1,0,0,0,1,0,1,1,0,2,1,0,1,0,0,3,3,0,1,1,0,1,0,3,1,1,2,0,1,1,5,4,0,0,1,0,0,1,2,2,2,0,2,4,1,4,1,0,0,1,0,1,2,1,0,2,1,2,1,4,1,1,2,2,2,1,2,1,1,1,0,4,0,1,0,2,0,0,1,2,1,1,0,0,2,0,0,0,0,3,3,0,2,0,1,0,3,1,1,1,0,3,1,1,1,1,0,0,2,2,2,2,0,3,3,2,2,1,2,1,1,0,0,1,0,0,2,1,1,2,0,1,3,1,1,1,6,2,0,1,1,2,1,1,1,4,0,1,1,2,4,1,0,1,2,0,1,1,0,2,0,3,0,0,2,2,1,1,0,1,0,0,1,1,0,0,1,1,1,0,0,0,0,2,1,0,0,1,2,0,1,0,0,1,2,4,1,1,0,3,0,0,2,2,0,0,1,1,2,1,1,0,0,1,0,1,0,3,1,0,0,0,3,1,1,0,1,1,2,1,0,0,2,0,1,1,1,1,4,0,0,2,2,2,0,1,0,3,1,1,0,0,2,1,2,3,1,2,1,2,0,1,1,1,2,0,2,2,1,0,1,0,0,3,4,1,0,0,1,0,1,2,0,1,1,0,0,0,0,1,1,1,2,1,1,0,1,0,3,0,0,3,0,1,2,1,1,1,3,0,0,0,0,1,0,1,2,0,3,1,1,1,4,0,1,1,0,0,0,0,1,1,1,0,0,0,1,0,2,1,0,3,3,0,1,1,1,1,1,0,1,3,0,1,2,0,0,0,1,1,2,2,2,0,1,0,0,3,1,0,0,0,1,1,0,0,2,0,1,1,1,0,1,1,0,2,0,2,1,1,3,2,2,2,1,2,2,2,1,2,1,0,3,1,3,0,1,0,1,0,2,1,2,1,0,0,1,0,0,1,0,1,0,0,2,0,1,0,1,0,1,2,1,1,0,2,0,0,1,0,3,1,1,0,0,1,2,0,1,1,2,0,3,0,1,3,0,1,1,2,1,0,0,0,1,0,2,0,1,2,0,2,0,1,0,2,3,2,3,0,2,0,0,0,2,0,0,1,1,2,2,1,0,2,0,0,2,0,0,3,0,1,0,1,1,0,0,0,0,2,0,3,0,2,0,0,2,1,0,4,1,0,1,0,3,1,0,2,4,1,0,3,0,2,1,2,1,2,2,2,2,1,0,1,1,1,1,0,0,1,2,3,0,0,2,2,2,1,0,1,0,1,1,1,0,2,1,2,1,4,2,0,1,3,2,2,1,0,1,2,2,3,1,0,0,0,0,2,0,1,0,3,2,1,0,2,2,2,0,2,1,2,1,3,3,1,0,1,0,0,3,3,3,0,2,1,2,0,1,2,2,0,0,1,1,1,1,0,0,1,2,0,1,1,0,1,2,1,0,3,3,1,4,1,1,2,0,0,1,2,1,1,0,0,1,5,1,2,0,0,0,0,1,2,0,0,1,0,0,2,1,0,1,0,1,0,0,1,1,1,1,1,1,1,3,1,2,0,0,0,0,2,2,1,1,2,1,1,1,3,1,0,0,3,3,1,1,0,3,0,1,1,1,1,3,1,2,1,2,1,1,1,0,3,0,2,3,0,1,1,0,0,0,0,1,1,0,1,0,1,2,1,0,2,1,2,0,0,2,1,2,2,0,1,0,1,0,0,1,1,2,1,0,0,2,0,0,0,0,3,0,0,1,1,2,1,1,1,0,1,0,0,1,0,1,1,2,1,1,1,0,1,0,0,1,0,0,0,0,2,3,1,1,1,1,0,1,1,1,1,1,3,1,0,1,1,0,0,1,1,0,0,0,1,2,0,1,2,1,1,1,0,0,0,0,2,2,1,2,1,2,0,0,0,1,2,1,3,0,0,1,2,1,2,2,0,1,1,4,0,1,2,0,1,3,0,2,1,3,1,2,1,1,2,1,3,1,1,0,1,2,0,2,0,1,1,5,1,1,0,1,2,0,1,0,1,1,4,1,0,2,2,0,1,1,1,1,0,2,1,1,0,0,0,2,0,1,1,2,0,0,0,2,0,0,2,2,1,3,0,2,0,2,0,1,1,0,3,0,1,2,0,1,1,1,2,1,1,1,0,0,0,0,1,2,2,1,0,0,0,1,0,1,0,1,0,3,0,1,1,0,1,2,1,0,0,2,2,1,1,0,2,0,0,0,0,0,1,3,0,2,0,2,0,1,0,2,0,2,2,0,0,3,0,0,2,1,0,1,0,1,1,3,0,0,2,0,0,2,0]}]},"null_count":0,"last_update_version":397952033091747840},"p6_md5":{"histogram":{"ndv":1972,"buckets":[{"count":7,"lower_bound":"MDBiNHh6NlBnTjRqaE80WUY=","upper_bound":"MFJZ","repeats":1},{"count":13,"lower_bound":"MGRPbmF6eEVQZzc3TGcydlV2QmY1Tm1yNExBQw==","upper_bound":"MGlwTE9JUUd2RjZRWk1NSHVUY2RBUFpZbWRmck42NA==","repeats":1},{"count":19,"lower_bound":"MG56bmtRdDdhOXVz","upper_bound":"MTV1YWQydEEyWWxRakRx","repeats":1},{"count":25,"lower_bound":"MVFXcjZxR29yeTdncEFuQ2g4","upper_bound":"MWZ4RloxUXQ5cQ==","repeats":1},{"count":31,"lower_bound":"MWlFSFJLd2s1dHY3Rng=","upper_bound":"MXVkaWlxMHpFTWtYY2QwcUZYekN3MWtsR1hCV1NiUQ==","repeats":1},{"count":37,"lower_bound":"MXhYb0tZVVpNeGNmSnczSjNLTjRrZmtpZQ==","upper_bound":"MjA4ejkz","repeats":1},{"count":43,"lower_bound":"MjBkRUJtbw==","upper_bound":"MjREV2o=","repeats":1},{"count":49,"lower_bound":"MkJ4Yjc=","upper_bound":"MkkwaXJEcmxQN29FSlNuSFBXa0p3NUhu","repeats":1},{"count":55,"lower_bound":"Mk5vdjhKcmRMUlhKUUx6RFFa","upper_bound":"MlBiUlhaZVgzY3pZbjcy","repeats":1},{"count":61,"lower_bound":"MlE2UEFUUVhmZlR1enM0SWhKWVFXSG9qa2FpVHc=","upper_bound":"Mlk0RGE4eE15Ym1hTkh5YVN1ZTNEQzVTcQ==","repeats":1},{"count":67,"lower_bound":"MmJ3UHdYendTTko5QmpvWFJaaks2","upper_bound":"MnBDT1pNUk9wcg==","repeats":1},{"count":73,"lower_bound":"MnF5Qw==","upper_bound":"MnNNWFNQaW1yWXlnR29WT21oMTcyckJRVk0=","repeats":1},{"count":79,"lower_bound":"MzVSMzR0QUc=","upper_bound":"MzlkZzhXMWRo","repeats":1},{"count":85,"lower_bound":"M0QzbUNYTXplWUhCa1JPTWlVdXl1cmxGYUVvWA==","upper_bound":"M092T1VLUkQwMnFwQWhvTQ==","repeats":1},{"count":91,"lower_bound":"M1JKZEozaURGcmhZdUJTVA==","upper_bound":"M1R2eDJwNHczU2ZkSnptSHRFblQzWVV1cVNqME9j","repeats":1},{"count":97,"lower_bound":"M1VuaWZnRW5Pblh5YzI1MlByN3Zmc28zYTNNTk5Q","upper_bound":"M2pkSkZDRUpjVWk=","repeats":1},{"count":103,"lower_bound":"M2xBWWFsdzVtM3NoUUZMaHNJNHk4T0JPeA==","upper_bound":"M3dKM0VteTRnbzdXUlc3UFpmZ3RnaE51emdj","repeats":1},{"count":109,"lower_bound":"NDJ6blFRNTNVQTNh","upper_bound":"NDdwREhQbjd6V2JPOVNOSUMwZ0VlRkxJbFRRM2NTUFM=","repeats":1},{"count":115,"lower_bound":"NDhpOHZOTTA3dHN0","upper_bound":"NEdmeE9pTzk=","repeats":1},{"count":121,"lower_bound":"NFBUV3A0Njhsd3dFcExYaDgzQmw=","upper_bound":"NFVJUENRcUlzRWExNzU1Qkl5MGplMzFMQWs3ZlBN","repeats":1},{"count":127,"lower_bound":"NGZjT0xzOA==","upper_bound":"NG9Rc2VMWnpHSVdjSFR4OWpT","repeats":1},{"count":133,"lower_bound":"NG9YdHJFM3R5aXJtV2tzRlc2eXk=","upper_bound":"NHZZNENnOHRN","repeats":1},{"count":139,"lower_bound":"NTBLVVhDWmg=","upper_bound":"NTFwVWlreVo4UkFkbFltMVVYQVh4bzYyUw==","repeats":1},{"count":145,"lower_bound":"NTVhYlc=","upper_bound":"NUF1aXFPbU1ZbVFHZlFtVkF4WVh1Y0o=","repeats":1},{"count":151,"lower_bound":"NUJnR2ZncDVORlBBZW4=","upper_bound":"NU1ub21NWmViQ1UzdlJ6SGFNZEdGVmVlSTZjWGtVRTA=","repeats":1},{"count":157,"lower_bound":"NU14TzhTU0Ewck1VUzhSWmM3bGREa0la","upper_bound":"NVRUbXB5SjFTVA==","repeats":1},{"count":163,"lower_bound":"NVRjNVpHeE1LQ2FTN1JS","upper_bound":"NWFxZXBTZVFaNTE0MkZyZk0=","repeats":1},{"count":169,"lower_bound":"NXB0dE1sMXhHUjlUag==","upper_bound":"Ng==","repeats":1},{"count":175,"lower_bound":"NjQ4akNET0xQUWxhSm5tdXI=","upper_bound":"NjhGcThpRkk2RnhObVM=","repeats":1},{"count":181,"lower_bound":"Nkx6WFVzR20zSmJ6RzFUVWdiZ3p4WW9hNWs=","upper_bound":"Nk9KOGRLR3pFWWxa","repeats":1},{"count":187,"lower_bound":"Nk9wN1BYc3dVaw==","upper_bound":"Nlk3aWFY","repeats":1},{"count":193,"lower_bound":"NmRyY01HZFRGbUNXQXkyeGd0WHVncjlPektONk1zSFg=","upper_bound":"Nmg=","repeats":1},{"count":199,"lower_bound":"NmgwYjlZbGRXWg==","upper_bound":"NnAwVHk3M05HYlJiRktxaDU4RA==","repeats":1},{"count":205,"lower_bound":"Nndw","upper_bound":"NnozRW5Ud09yYjd6SGRHTFNZUHk1aXY5QnpJWVc=","repeats":1},{"count":211,"lower_bound":"Nw==","upper_bound":"NzYwenVRVXE=","repeats":1},{"count":217,"lower_bound":"N0FNOGhoMzNxbGNubmlWZFdkTHBhWjhHcGhXa3BJ","upper_bound":"N0R0SXdG","repeats":1},{"count":223,"lower_bound":"N0lDYzI1b1M3SUtC","upper_bound":"N015dVRGSjEwUWhlc25FZXg=","repeats":1},{"count":229,"lower_bound":"N1c5TUxNakIzZEhZWWZLQ2ZPd0hxcXR3bVpUVnY=","upper_bound":"N1pZ","repeats":1},{"count":235,"lower_bound":"N2Rn","upper_bound":"N2p6b2hmTWVGNEVudkR2WUFt","repeats":1},{"count":241,"lower_bound":"N3FnV3RQdXByZEZ2RmxVNnVNYXk=","upper_bound":"N3d1bEFpVXJP","repeats":1},{"count":247,"lower_bound":"OEJyamg1THZJRHVHVXd4NGZjOUhUUWdh","upper_bound":"OEtoQmRNYnVBSlhhR1l4ZU5WMThnM0ZQWVBtN3JCaHU=","repeats":1},{"count":253,"lower_bound":"OFVzdUFQTnJWekNYTnJPTWNTSm1rWktQ","upper_bound":"OFpQek5PdnJJSDlKMmNDQWg0N0pzcnc2bGt2TzRXTVM=","repeats":1},{"count":259,"lower_bound":"OGNW","upper_bound":"OGhvblBwYkVMcHpnV1VnQg==","repeats":1},{"count":265,"lower_bound":"OHNCU1g1cndiRHFKNktmZ3dq","upper_bound":"OHR6UkRTOHR3bEQzSzZxY0hRSVIzNA==","repeats":1},{"count":271,"lower_bound":"OHUwaVI5ckR2NENs","upper_bound":"OTV0MTRqdGVyNUlMNFQ3aQ==","repeats":1},{"count":277,"lower_bound":"OUJYSmpESQ==","upper_bound":"OU5HVQ==","repeats":1},{"count":283,"lower_bound":"OU8yR3RrakhYNXUzcm5LTWJ0aVA2ZUhQTjNtT20yVg==","upper_bound":"OWVvRWtxdXB4Z3FLT1pXRA==","repeats":1},{"count":289,"lower_bound":"OW9scEgzN1pxNGVsVUJONk1ueFdhZXhZYmR5bg==","upper_bound":"OXRjTG8=","repeats":1},{"count":295,"lower_bound":"OXhZWlVEQk5UREkyMXVRVFRYYnBUbkF2eXo=","upper_bound":"QUZNelNtZkR1Y2gxQkhWa3lrQU5GdnJY","repeats":1},{"count":301,"lower_bound":"QUpiOWFRWXRENUVPbDBTNUc=","upper_bound":"QVNnZzUzd3c=","repeats":1},{"count":307,"lower_bound":"QVkzMk55QlY5bEVtRXRNOUJ2cw==","upper_bound":"QWhaNFhxY20=","repeats":1},{"count":313,"lower_bound":"QWlTUk02VWlsM3c4VmFtOThBb2ZYbVF2UmlYNFpG","upper_bound":"QXVrRWtubXZhdkI4TWoyN08=","repeats":1},{"count":319,"lower_bound":"QjJqSjQ0RzNpa3dMUW1ZRFJlMUk=","upper_bound":"QjY4VGUwYmk0ZG5NMWU=","repeats":1},{"count":325,"lower_bound":"QjZ6RFl2QnVld0FDaWZx","upper_bound":"QjlESmU5cEx1a3I4ME1TV3Zl","repeats":1},{"count":331,"lower_bound":"QkQxUmFVRWp3bDU4VWdrcXFoQVQxSWhkQ1ozNjk=","upper_bound":"QkU3Ynl1","repeats":1},{"count":337,"lower_bound":"QkVVSFM5aHlGWEM=","upper_bound":"Qk44b0QzVU4=","repeats":1},{"count":343,"lower_bound":"Qk5Ddm5heEtjTEpRSjVWcXgy","upper_bound":"QmhVVmFuMWZwOWdidEdQTkRTN2k5VA==","repeats":1},{"count":349,"lower_bound":"QmxDNjlmcEFXOWs2cVVhTlk=","upper_bound":"QnhzdGdrcGhCRXVHcHo=","repeats":1},{"count":355,"lower_bound":"Qnl0bnlSamU0cHBTZTEzVlR6Q28=","upper_bound":"QzFnejV3NWJq","repeats":1},{"count":361,"lower_bound":"QzI=","upper_bound":"QzVlRmNiSnR6d1VYZVZUTE1uZjd2MXduUEpqTzNZ","repeats":1},{"count":367,"lower_bound":"QzlyeDN6a1Jlek1RTk1CQU9Wc010OVF3","upper_bound":"Q0xZRHJxM3Z0VUFqVjc=","repeats":1},{"count":373,"lower_bound":"Q1NRVTJRT2E4R05OTjFBNjI5S3k1cG9wTllqSg==","upper_bound":"Q1VJSjlxNEFrbnR4UmtOYQ==","repeats":1},{"count":379,"lower_bound":"Q1Y=","upper_bound":"Q2RKdTNXTUlwVXRGblpvUlNvMVM=","repeats":1},{"count":387,"lower_bound":"Q2prSTRiZVFQaGRLcWE=","upper_bound":"Q3Z4WldIYnBQWkw=","repeats":1},{"count":395,"lower_bound":"RDMzck1rekhmVkJ0QXFiM2dYVEl3UVdh","upper_bound":"RER6Z1EwZnBqaFlPQ0FIUFJ4dTlEcHRKUkM=","repeats":1},{"count":403,"lower_bound":"RFJPMHNTM2dhUG5lQU1zMDBkb2t1OFd2","upper_bound":"RGFVWEhjaFg0eHZFMUJnODJmUm1JVXU0bnhIVHM=","repeats":1},{"count":411,"lower_bound":"RGVMenVC","upper_bound":"RG1TRHIwUUZnOW5EaVc=","repeats":1},{"count":419,"lower_bound":"RHh0b3o=","upper_bound":"RUJEQXNtZ3gyRmRteHZZZzRNT1B1cGVKbDY2MDJicXk=","repeats":1},{"count":427,"lower_bound":"RUpQNzRK","upper_bound":"RVRZNkNkVDE0M1I3TlN4Smk3Mnk0ZTFjOVduVTBHUQ==","repeats":1},{"count":435,"lower_bound":"RVpPWHhRWmc3OGdaclpTN1M=","upper_bound":"RWltQndVUUpmcjJu","repeats":1},{"count":443,"lower_bound":"RWluRU41WkJtN1cyQTJGQXp0eTZLVTV2ckJRNTdk","upper_bound":"RXVVUzJBbVJoTXRMaE5yVHk4c1AwSVVGWmt0SG5wSA==","repeats":1},{"count":451,"lower_bound":"RXY=","upper_bound":"RkQ3Qm8y","repeats":1},{"count":459,"lower_bound":"RkxhWXFMaVU4dXJCVHhaM3MwYnJ6T1hGUE1iVUVBbA==","upper_bound":"Rlpo","repeats":1},{"count":467,"lower_bound":"RmFEcjZnYQ==","upper_bound":"RmRBR1dpUTJwbkxLU3ZvYw==","repeats":1},{"count":475,"lower_bound":"RmRNVHo2aFFBWVVDakhP","upper_bound":"RnFYV2pWZmtZN0VTZng4VHZX","repeats":1},{"count":483,"lower_bound":"RnI1MEpaakh1OU9NOVpEd2l1SVB1ZnFBSExrdFVtbVo=","upper_bound":"RzRy","repeats":1},{"count":491,"lower_bound":"R0I1bTZhS2ZMRlg3ZE4=","upper_bound":"R1BLN0xlaE94N1Azb3U=","repeats":1},{"count":499,"lower_bound":"R1BmR0V2eDZZYk14QmJaM0tl","upper_bound":"R2Y1UWZRNWI3QnJGeFAwSHZOTVZ6NUJuUVlRdg==","repeats":1},{"count":507,"lower_bound":"R2cyeW43VXU=","upper_bound":"R202SzFrTWV0N1JlNjE=","repeats":1},{"count":515,"lower_bound":"R21HM3V4UlVsMkZVNFpFdWZvQ0NXTjA=","upper_bound":"R3d4V3hFRUQ3blZqSjZN","repeats":1},{"count":523,"lower_bound":"R3ljR2xPZWdRR2ZSTUFMMHBjbU1ZdVA2azB3Ulha","upper_bound":"SDdiNHJMM3hKeFludWQ2dXV0Nw==","repeats":1},{"count":531,"lower_bound":"SDdwTUU4Y2h4U1hwTDhCb1FFcVo=","upper_bound":"SEVqZ3lyZGQ2c2Z3U3Bs","repeats":1},{"count":539,"lower_bound":"SE9rRDFMZU1ZVUN5STlMY0VqMEVLQWNkeldMZg==","upper_bound":"SFpB","repeats":1},{"count":547,"lower_bound":"SGpRR2NC","upper_bound":"SHFKMWMwMzFHZg==","repeats":1},{"count":555,"lower_bound":"SHFwaw==","upper_bound":"SQ==","repeats":1},{"count":563,"lower_bound":"STJFcDcxQlE0Z2JRUg==","upper_bound":"STc4OGpiZDNDQ3ViVHhSOWpSNVE2RzY5NmZCY0E=","repeats":1},{"count":571,"lower_bound":"STlTMzJubm9TazJY","upper_bound":"SUYwb2RKRngwTld1dGZSeWJJV2F1QTEzSG1GRw==","repeats":1},{"count":579,"lower_bound":"SUhlaUtOWnVSZ2NUNVd4eGpldWV2UlFnUG52Qg==","upper_bound":"SVpTR1p0U1Vpc0k=","repeats":1},{"count":587,"lower_bound":"SWFzVE5PN09oTUZnZXdTcjhjN0hDbkw2NlYwSHQ=","upper_bound":"SW04am1ndkc2TkltRGw3c2Q4ckNi","repeats":1},{"count":595,"lower_bound":"SXBQSkQ4MjFNTFdNa2E3Z0JxNm9wWHlzQXo=","upper_bound":"SjJEY3BqZVJpRG43QXI4N20xUnVxaXRuUTg=","repeats":1},{"count":603,"lower_bound":"SjRPNFlwdEE2MnEycG5qOVV1Rm5CQThKU2FuZnA=","upper_bound":"SkFOempqcVRRNkE=","repeats":1},{"count":611,"lower_bound":"SkFndWxySFZCeXRyQkdzdXlueFQ0MDJWUEh3ZkE1eg==","upper_bound":"Skg=","repeats":1},{"count":619,"lower_bound":"SkpzbVR3TnRhdzBHNG1ubXlTZ3JTbXE=","upper_bound":"SlM2REEwMEk=","repeats":1},{"count":627,"lower_bound":"SmpQcFp5NWE=","upper_bound":"SndRdHFGdlFWNXRrS1o0QVVDNG0wYTNRQlhV","repeats":1},{"count":635,"lower_bound":"SndxREpqbmlqZw==","upper_bound":"Szc0SA==","repeats":1},{"count":643,"lower_bound":"S1JqZUZIc0RjQUt4UA==","upper_bound":"S29xRTc3aXpSRWV1bjVjSmdzUWFGWWJ6","repeats":1},{"count":651,"lower_bound":"S296a2k0M2s3VU9PZ0xB","upper_bound":"TDEx","repeats":1},{"count":659,"lower_bound":"TDlEU2NPWEFhbA==","upper_bound":"TEZsMg==","repeats":1},{"count":667,"lower_bound":"TEtPajY2M2FISE9EMUtoVWpQSGFiSmdKSlZHeXZjMA==","upper_bound":"TFFwdTFIbnQ2MW5sVlc5MUd5dDczeGNSTg==","repeats":1},{"count":675,"lower_bound":"TFNpSUlPVGpVeXFGVUZtNDVRUnNkUXdwYlBi","upper_bound":"TGVNUlhkYlI1ckx5eDRiTzUy","repeats":1},{"count":683,"lower_bound":"TGhZNjE=","upper_bound":"TVBnWk1FUg==","repeats":1},{"count":691,"lower_bound":"TVFRb3EyM09OamdiMFVNcXF1RUxyOFJLQks=","upper_bound":"TW1UQzNR","repeats":1},{"count":699,"lower_bound":"TW1ibENXb05RdnhGM0lPOFhKTGVNZ1U=","upper_bound":"TXVMWnNVUkIyeHlMSFJG","repeats":1},{"count":707,"lower_bound":"TXZEUHB5V3cwc0lzaHpDSEhFM2xsU3hpSw==","upper_bound":"TkVPdFY5NU55cUNMdGFFOXQx","repeats":1},{"count":715,"lower_bound":"Tkh5cExHQjdaM3NxTFpxWEY2dGFKRQ==","upper_bound":"TldZZ3hOQThpT01YVQ==","repeats":1},{"count":723,"lower_bound":"TmFEcG9tUWVn","upper_bound":"TnRVTGQ4TU01QUFKUnVUQmtXWDQwTkI1TEd0T3k=","repeats":1},{"count":731,"lower_bound":"TnVBRUU4ZFlt","upper_bound":"T0FaWUs=","repeats":1},{"count":739,"lower_bound":"T0lGQWdTWA==","upper_bound":"T1RSeA==","repeats":1},{"count":747,"lower_bound":"T1ZVUzBTOW9VSDg=","upper_bound":"T1o=","repeats":1},{"count":755,"lower_bound":"T2IyYWFzSjNLWElZUElGY1JES1VS","upper_bound":"UDJkQUQ4THJ2NHd0","repeats":1},{"count":763,"lower_bound":"UDNUZHhHUEdT","upper_bound":"UEJBSU9uczY5","repeats":1},{"count":771,"lower_bound":"UEZ6RExtRTUyemY0ejQ0dHRFdEpVOXA=","upper_bound":"UGJWakpoWlgyQ0hG","repeats":1},{"count":779,"lower_bound":"UGNHUWZwaXZyWjNYOEx3NmphbUVHMGJlck13S0FJ","upper_bound":"UGg5MzVqVE1SWklYMw==","repeats":1},{"count":787,"lower_bound":"UG5tYnBBQw==","upper_bound":"UHJTelo5VFRuYWE0ZmdjdWMzNGxSZHlRQzYyc1l6SA==","repeats":1},{"count":795,"lower_bound":"UHVpSUVOUnY4YzR4UGZjdWFzVnpSczhNMGp3RA==","upper_bound":"UTdidGhScEVYNEFuWkFEZVpYZ2ExcQ==","repeats":1},{"count":803,"lower_bound":"UUNKOUdUUkJ2MUVq","upper_bound":"UVNoS1ptZ2g=","repeats":1},{"count":811,"lower_bound":"UVRXbEJzaWJwS0lxeU5ZVQ==","upper_bound":"UWNFbTRhemZZd3AxWWtkY0pCRw==","repeats":1},{"count":819,"lower_bound":"UWhudFY4ZzhQNE1iVk5VMUx6UjZx","upper_bound":"UXRJZFNlWW80M3pBZ3VNSHdvTFNjcTE=","repeats":1},{"count":827,"lower_bound":"UjB5bUZ3c2tXQnJPZ0U4","upper_bound":"Ujh3Zg==","repeats":1},{"count":835,"lower_bound":"UkdHOVluNllydlMySUszQ3JCV2tFdTRnN1NC","upper_bound":"UktXdmlFYWVYU2FK","repeats":1},{"count":843,"lower_bound":"Uk05Y3BuUWNibUI2YklvVE1IMFhYTGZ1TkFlVXdl","upper_bound":"UmNaSEV6eVRvaWJzOWh5NHFGTGdJTFM0MWVWWDBq","repeats":1},{"count":851,"lower_bound":"UmRwbll1YmcxUlFBZVNiU1h0U1htOTdYNEU2","upper_bound":"UmpDY1FMRUV2","repeats":1},{"count":859,"lower_bound":"UmxJQmFUam9NZGw4MHNHT0JJaQ==","upper_bound":"UnhxMTZDUmdNdnZ0TEVjZA==","repeats":1},{"count":867,"lower_bound":"Uw==","upper_bound":"U0FqQVU3","repeats":1},{"count":875,"lower_bound":"U0VueTBHd0xjU1FERDMyeTVZZkxONGl0WVIyWDFQRlM=","upper_bound":"U0lXdlpjQlF4a0pVV2IyUjBKSGRUZFJUTHFQeUlL","repeats":1},{"count":883,"lower_bound":"U0w5Q25IQkM3dXNqa2VZSGowekw5Qw==","upper_bound":"U1MySUJIM2JOSldkemZZNGE=","repeats":1},{"count":891,"lower_bound":"U1VzMklGNVhjRUt4dVQxMGF4N0dT","upper_bound":"U2ZpMVdGVXhTNEpjWEpKMzhMTjlWRmJLQU5NU1ZU","repeats":1},{"count":899,"lower_bound":"U2pvaVBWdFdqOFp3Tw==","upper_bound":"U2xhNTZpMDN6TXhyZVc0VWFBTg==","repeats":1},{"count":907,"lower_bound":"U2xyT2NRc1BQd1BFRjd5T1NBaHFLcEh5NHZyQkRQdg==","upper_bound":"U25nMG5adEg4UmY=","repeats":1},{"count":915,"lower_bound":"U3BFS0RnU052cw==","upper_bound":"U3pyemI2dkFKVXEwRHBCZEpid2Z5SzlORUQ=","repeats":1},{"count":923,"lower_bound":"VDI=","upper_bound":"VEwwd1BMaHJqNnhZ","repeats":1},{"count":931,"lower_bound":"VGhEWlY=","upper_bound":"VHE1VFFOVFdockI2YTEyMVkxYjVJ","repeats":1},{"count":939,"lower_bound":"VHNzN1JSZ2dmTTVlMlZmYWRad3BDZUtsWXozYjM=","upper_bound":"VTRCeUc=","repeats":1},{"count":947,"lower_bound":"VTRaNVJVZURkSjBwVg==","upper_bound":"VTkyR29VWlJu","repeats":1},{"count":955,"lower_bound":"VUJIUk1mTzlrVDZkeVdvc0U4RVRJ","upper_bound":"VVZXT0xSOExDbnhpa0M2YjFLOXNYTg==","repeats":1},{"count":963,"lower_bound":"VVcyU0JRYUhLTmtLWUw3UDJHR1BU","upper_bound":"VWhUSHRHUWRJRnBvSElFOFU=","repeats":1},{"count":971,"lower_bound":"VWlHdXpQeHdOcnVpUFpqM2didDllaEFZcEVSVFBpMQ==","upper_bound":"VXRDbGg1dEVCbWtzMQ==","repeats":1},{"count":979,"lower_bound":"VXoyWg==","upper_bound":"VkI0REJlQlJNV1dPZw==","repeats":1},{"count":987,"lower_bound":"VkY3blBmMG9mT3p6enFD","upper_bound":"Vk1jd0lMcU9lWWVFUkk4","repeats":1},{"count":995,"lower_bound":"Vk9DY1pMUGd0cEc=","upper_bound":"VlhtYQ==","repeats":1},{"count":1003,"lower_bound":"VloxdFFVcTNDRVF2YlVGeXBZZA==","upper_bound":"Vml6aHQ=","repeats":1},{"count":1011,"lower_bound":"Vms2NThvclY3bEtaRzdZbk93Zw==","upper_bound":"VnBnU2JOWHdkR3NPWExqOWVjbVlWWkRReW94cA==","repeats":1},{"count":1019,"lower_bound":"VnFLMUU0MG5oMXY=","upper_bound":"V0F2aTA=","repeats":1},{"count":1027,"lower_bound":"V0tBeHd1VlpQR0JB","upper_bound":"V2NrMDRwVm9rTTNxQ3dLUEluY2tCRnVKb1BZcXZyZg==","repeats":1},{"count":1035,"lower_bound":"V2dUcjY3cmVLdDZvak5uSVpiVmFEd1lt","upper_bound":"V3dnQjQ1Y1R3SDA1d2VMOGdDWg==","repeats":1},{"count":1043,"lower_bound":"V3l6UGNCOW5PdlRTTUhMU0RObkhxNQ==","upper_bound":"WDZUdkFMR1VubXZzd1hEdjd1eUNjRHJvb1N2eg==","repeats":1},{"count":1051,"lower_bound":"WDhGaHhEVDNi","upper_bound":"WEd4","repeats":1},{"count":1059,"lower_bound":"WEhGcU5YSVY=","upper_bound":"WFBES1pJaWY=","repeats":1},{"count":1067,"lower_bound":"WGllT2R1SXhzOEJF","upper_bound":"WTFK","repeats":1},{"count":1075,"lower_bound":"WTVP","upper_bound":"WUVFQjlZUA==","repeats":1},{"count":1083,"lower_bound":"WUhO","upper_bound":"WUlUaw==","repeats":1},{"count":1091,"lower_bound":"WVhPd0ExcA==","upper_bound":"WWpHZ2lwZDFTejFlRThiNENoUg==","repeats":1},{"count":1099,"lower_bound":"WWtLbnlGZmVjeEZhdHZjOVJxdQ==","upper_bound":"WXlsaTFh","repeats":1},{"count":1107,"lower_bound":"WXo=","upper_bound":"WkdiNDNSUDhVS285SnZOQ1g=","repeats":1},{"count":1115,"lower_bound":"WkhKdWk4cDlhcjFwelB4RU5sbQ==","upper_bound":"WllnMkVPYVhxMWZieWliS3Fkbg==","repeats":1},{"count":1123,"lower_bound":"WmJndUpPNzNUalB3","upper_bound":"WnBMTFNqR2sy","repeats":1},{"count":1131,"lower_bound":"WnhzcWo2NzZpWWJMQVU=","upper_bound":"YTA3S25yZXg1U05POEs3Zkxx","repeats":1},{"count":1139,"lower_bound":"YTB5emNxbGtzZFQ0RXdlMng0U21BYg==","upper_bound":"YTZHVEdHZVNvVlFTcm1OT3NQdlE5aDk4","repeats":1},{"count":1147,"lower_bound":"YUJSUVBtVVBEUk56QlBIdDJMeWdjU1l2","upper_bound":"YVBiQg==","repeats":1},{"count":1155,"lower_bound":"YVFZNzZmOXg0Rm9NQnc2R0w3S1J6Q2ptSHNj","upper_bound":"YWw0dEJwSGhmNkdSWkRZQ2pGWHc=","repeats":1},{"count":1163,"lower_bound":"YjU0cXFaaWoyazJmbGZ2ZTAwTw==","upper_bound":"Yk4wWWpjM3lWdW8=","repeats":1},{"count":1171,"lower_bound":"YmE3WkZjSEM4RHYyR1BEb0dM","upper_bound":"YnRBS0ZNeA==","repeats":1},{"count":1179,"lower_bound":"YnRJZzkyOG5ianpPckZ2UGo0MzBMdmtEcFRHN0N6","upper_bound":"YzNTQw==","repeats":1},{"count":1187,"lower_bound":"YzZLaUZIR2FHemY1TlVtdHpWeGVaeFJXMVdhYXFhRUY=","upper_bound":"Y0NDdk5wTGd1QmVWY2FpbDBWSjdhRjJqQ09lVGNw","repeats":1},{"count":1195,"lower_bound":"Y0k1RlpScTN2","upper_bound":"Y1RjblRoRjBTZDRZOHExU1RubXpJM3NXNkQwV2FQ","repeats":1},{"count":1203,"lower_bound":"Y1hvZTdqOU9ObzM=","upper_bound":"Y2Nza25vQkZvVkd3alRKTlFXTE9uOHkySVc=","repeats":1},{"count":1211,"lower_bound":"Y2RnMEJ4bUk0eEVvdngzSUYwNjJ3RmY=","upper_bound":"Y2ZScXhtbTFJ","repeats":1},{"count":1219,"lower_bound":"Y2hWVkdIV1ZP","upper_bound":"Y3ByTnZUSkZLQzZn","repeats":1},{"count":1227,"lower_bound":"Y3J6amlPNUdGR00zdTJyTFV6ckZpbkhSaw==","upper_bound":"Y3pFdmRiVXlOWFFtT1o0M2MyMWZKTWs=","repeats":1},{"count":1235,"lower_bound":"ZE5kQXp2WklPbk1JUjNlVXRRcXNUSXNKRHY=","upper_bound":"ZGxjTkZEZmV3VGtTZjVlbklTcW5xWg==","repeats":1},{"count":1243,"lower_bound":"ZHFNMlZranJvR2s0dA==","upper_bound":"ZHpVYVMzTE5EYldWRjVTZHBPbWZjcQ==","repeats":1},{"count":1251,"lower_bound":"ZHp2S2w=","upper_bound":"ZUQ=","repeats":1},{"count":1259,"lower_bound":"ZURZRnVNVmRCMw==","upper_bound":"ZU4=","repeats":1},{"count":1267,"lower_bound":"ZVZRcGlKMEs=","upper_bound":"ZWJHNDhWTXJjcGNzUDRpU2JXdmpqNlE5Znc5RQ==","repeats":1},{"count":1275,"lower_bound":"ZWc2eEQwM1V6azM3OUE0cXJUZTFUQ0FNR3Nzbg==","upper_bound":"ZjJ5TUVDY2dtaXYyM1JFV1NkbVcwSzBtbg==","repeats":1},{"count":1283,"lower_bound":"ZkFqR2tHV0x4cHpkU0wzQWd2cjN3NTZZVFE5","upper_bound":"ZkhjcnlRWFI=","repeats":1},{"count":1291,"lower_bound":"ZkpHYWJkYkZjSEE4WlF6czlBeW96bXlNN21HQUk=","upper_bound":"Zk1kclM=","repeats":1},{"count":1299,"lower_bound":"ZllueGpEaDZKcUdwOFJ3bzF3TW9ldw==","upper_bound":"ZzAwYlRRYUptVzFLVGlSUU05YVAxd3A0dms=","repeats":1},{"count":1307,"lower_bound":"ZzJTdXgwcDVENHZS","upper_bound":"Z0Fta1FxakF5OEJadk5wVVhEQW80SVRMU3V1dVVR","repeats":1},{"count":1315,"lower_bound":"Z01oRQ==","upper_bound":"Z1N1YTEyeEZZeDJ3RkF3MUpJVHRlTWdpcQ==","repeats":1},{"count":1323,"lower_bound":"Z1R4VkRSOEI1NA==","upper_bound":"Z2ZnUEdRT2xHSUNrVEt0","repeats":1},{"count":1331,"lower_bound":"Z250dVBxUEF5bkJZaFkwbklsUHc=","upper_bound":"Z3JwYnNwaHdkNg==","repeats":1},{"count":1339,"lower_bound":"Z3Rj","upper_bound":"aA==","repeats":1},{"count":1347,"lower_bound":"aDA0Y3NGcmUyTEZ5V1U0dXVxUkNISERIaDB1Yjk=","upper_bound":"aDlUaUtubVVFcFhhSWJBM0F4cnQ=","repeats":1},{"count":1355,"lower_bound":"aEpLanF1MHB4RDREYWttUTc5cA==","upper_bound":"aGJUeHVsNGRSV01MS2VrUkk1bVBQbGxtUm9l","repeats":1},{"count":1363,"lower_bound":"aGYwNkVxU2FiYUtQUDhJUDdpVHhHM1kzbnM=","upper_bound":"aGp1cm1zVw==","repeats":1},{"count":1371,"lower_bound":"aHByS3FnTU1taHppMHhBOUo1WXJYYWRMbQ==","upper_bound":"aURZSDg=","repeats":1},{"count":1379,"lower_bound":"aUkwcUJRWU1VREplbEIwNG1RcWI=","upper_bound":"aUxScEh4dTRGQUI=","repeats":1},{"count":1387,"lower_bound":"aUxYTw==","upper_bound":"aU90VTI1Yw==","repeats":1},{"count":1395,"lower_bound":"aVE=","upper_bound":"aWRiWjZucjhRclA1MzJERmxZM0k0NU5tOWQ=","repeats":1},{"count":1403,"lower_bound":"aWRwOFdKazFia05VVXZEVw==","upper_bound":"aXRZVmN0N01W","repeats":1},{"count":1411,"lower_bound":"aXZIMFlrbmg2cXh1b1EzZDhFZXV4VkhUUEY=","upper_bound":"ajNIMVpxVzFWTkhyWDMwYXFBcFpSY05FWU55c0xQUU0=","repeats":1},{"count":1419,"lower_bound":"ajYzMmEwWm9vUlBwVVZuYnlMQlE=","upper_bound":"akhiSEVic3lGZVMyeQ==","repeats":1},{"count":1427,"lower_bound":"aktWZUNlSFBZVzE3alI=","upper_bound":"alM4","repeats":1},{"count":1435,"lower_bound":"alNybXZvSkZVeGU1a1pSdExNZVlmaWM=","upper_bound":"am9Wckprbk00blEyblJNbU9uN1BpU1Ba","repeats":1},{"count":1443,"lower_bound":"anNpMGhlTUZkbGh4","upper_bound":"anhUNDZNaw==","repeats":1},{"count":1451,"lower_bound":"azcwM2Y4RDZoRktPWnRKSVVzY1VqNk9CMHJr","upper_bound":"a0loWUloSDlMd2JWMzlyanZOR2ZiT0FIamI=","repeats":1},{"count":1459,"lower_bound":"a1VjTnNQdXNUemhWbHFudXlhUllNTG1kTDVpZw==","upper_bound":"a21XM0c3U1VqVVpDdFVEdVFtRGY5MEd4cUVlbHkyeHc=","repeats":1},{"count":1467,"lower_bound":"a25lbHJBV3BkZFdzbkE=","upper_bound":"bERyeDJGb2F4a2lGR1dT","repeats":1},{"count":1475,"lower_bound":"bEY=","upper_bound":"bFhYRTRPTHRvYzlrYU1C","repeats":1},{"count":1483,"lower_bound":"bGFJd2pJTA==","upper_bound":"bGd4dWxSVFJCTVZj","repeats":1},{"count":1491,"lower_bound":"bGlQZTUydFpmeGNWUDlhbjI5bHl0aHNwRnJqbGdMdTY=","upper_bound":"bHBSc2xFOG9ndXZXbkczZlhpWUlnZFlkVEhnVw==","repeats":1},{"count":1499,"lower_bound":"bHMya3FFRQ==","upper_bound":"bQ==","repeats":1},{"count":1507,"lower_bound":"bTZYbDRiU2dseVRxejl5czRicjZyd2t1NnBYNGln","upper_bound":"bUs0OEJNYQ==","repeats":1},{"count":1515,"lower_bound":"bU1YbGVIdmFFazh2SEQzNw==","upper_bound":"bVZiQURHUW02ZHc2Q2Q5dk5ZbG9i","repeats":1},{"count":1523,"lower_bound":"bVZkMmFhREpBd3BoUW11RGl2ZEpsWDNnaG44SGI=","upper_bound":"bWxyWHhBbDdIaERWQQ==","repeats":1},{"count":1533,"lower_bound":"bW1aQnVXVDdralk3eGxHaVUyS0F5","upper_bound":"bg==","repeats":2},{"count":1541,"lower_bound":"bjNJMUNIT0dJa0k=","upper_bound":"blZ6","repeats":1},{"count":1549,"lower_bound":"blhKSTA=","upper_bound":"bm5HN3pZeElNcDd5N09DYnRQOFpyalV4ZHRX","repeats":1},{"count":1557,"lower_bound":"bnB6UTJLU2k4d3pOYTdjQmlQUHRJRHRXbzJURFVveg==","upper_bound":"bnYwNw==","repeats":1},{"count":1565,"lower_bound":"bw==","upper_bound":"b0FINg==","repeats":1},{"count":1573,"lower_bound":"b0I2NWNOQ1BicEtmekxyUw==","upper_bound":"b1p1aGpCbUV0elVMdGNqNXpqUndRd2dDbkI=","repeats":1},{"count":1581,"lower_bound":"b2F5cVV1bHZBdnhEb1JzemZITFl2a0Rt","upper_bound":"b29ydGo5dG1i","repeats":1},{"count":1589,"lower_bound":"b3FoYQ==","upper_bound":"cDV5Z1pmaTlyM3ZKMA==","repeats":1},{"count":1597,"lower_bound":"cEFnNHBlZjhRZHVjd3IyWTVkMVdM","upper_bound":"cE1Pbg==","repeats":1},{"count":1605,"lower_bound":"cE5ITGdUR0s=","upper_bound":"cGNYVjZBSlhnclhNSHMyVGQ=","repeats":1},{"count":1613,"lower_bound":"cGdoOGZyNWZQU3BMdlc3eFE3QUdOeW9XMFQyYlM1","upper_bound":"cHFOQlR3YkozYTlSSEhJQXRydmd5emU=","repeats":1},{"count":1621,"lower_bound":"cHNJYzEwQ080U2NQOVZOTVVrb2xlbEdzY2s=","upper_bound":"cTRC","repeats":1},{"count":1629,"lower_bound":"cTRYdHZa","upper_bound":"cTg0azVFbE9VS213YTFvRk9Zb3VVUmtGZjVYVlE2","repeats":1},{"count":1637,"lower_bound":"cUNpdlFlb2RlMzBZT2pTYndiZjJhOGljZVNnUw==","upper_bound":"cVd0aXZCT3BDVWtJN1lSV0xMQg==","repeats":1},{"count":1645,"lower_bound":"cWFYMWJESDJkOXRPR29UcmZiaXVHZWZleg==","upper_bound":"cWdqTVZlNlJqak8x","repeats":1},{"count":1653,"lower_bound":"cWlxcVBrU0Zv","upper_bound":"cW9YbDB5a2I2Zg==","repeats":1},{"count":1661,"lower_bound":"cXNIZA==","upper_bound":"cXc=","repeats":1},{"count":1669,"lower_bound":"cjE2RUNpRw==","upper_bound":"ckFiQnFMTUt0ZEpOMUs=","repeats":1},{"count":1677,"lower_bound":"ckIxNjZZQUplUUxLeGs=","upper_bound":"ck5vTmpDMnk0R01JYw==","repeats":1},{"count":1685,"lower_bound":"clJ1S0Qy","upper_bound":"cmNzZDZveXdnQ1loaTVvanRIcHJrcjZYdENGUktOZGw=","repeats":1},{"count":1693,"lower_bound":"cmYwZzJHTGRiYjNmWTBEdFZ1NGR3bzZG","upper_bound":"cm14cnNlZw==","repeats":1},{"count":1701,"lower_bound":"cnBEcHJCWkdkRW9wMHpQcXM=","upper_bound":"cnhpSWVaRQ==","repeats":1},{"count":1709,"lower_bound":"cnk5ZVY4bGFVMkh2UG1FazdpVEdIeE4=","upper_bound":"cw==","repeats":2},{"count":1717,"lower_bound":"czRKVGNUUkF4aGEwY3g3TkdJM0hSQ3NXb1FjNg==","upper_bound":"c1hwOXNHN3B4U2swZ29HRGNjNXNiY0RnS1RtQw==","repeats":1},{"count":1725,"lower_bound":"c2JBczk2MUxDRWtpZlMzZmkyS2t2RmpoRnVV","upper_bound":"c2U=","repeats":1},{"count":1733,"lower_bound":"c2ppdg==","upper_bound":"c25jaXVyQkgzak5vekdTRTZ6cTYx","repeats":1},{"count":1741,"lower_bound":"c3FSMW9NVzhCZlo5cFM1aVM=","upper_bound":"dA==","repeats":1},{"count":1749,"lower_bound":"dDJibDZLQm1r","upper_bound":"dEtTdERMRHN2VXdTNzdCR29pdTZONQ==","repeats":1},{"count":1757,"lower_bound":"dFJPaGJNQXpLZHk=","upper_bound":"dGVVaHJsa0tlWnVObmF6azk=","repeats":1},{"count":1765,"lower_bound":"dGpL","upper_bound":"dGx6Q3QxVkl6bWJVdA==","repeats":1},{"count":1773,"lower_bound":"dG9aRlFmclBFY2JIRURPaGNp","upper_bound":"dHZxV0RLaUFyT2s4Y1li","repeats":1},{"count":1781,"lower_bound":"dTFnWjVCOEhGYg==","upper_bound":"dTl1U3Y3M253WDh0QUw0MTI=","repeats":1},{"count":1789,"lower_bound":"dUN5TGxPVmp5MVBrOERqQ3dZMzBHdTk4dXM=","upper_bound":"dUpCMzlYeUNJMTluZnpWbTdyMllwZjREU3RteFZMOA==","repeats":1},{"count":1797,"lower_bound":"dU1EVw==","upper_bound":"dWJzYmNRYjdWN0dYWFc4VVp2aUxRMWxy","repeats":1},{"count":1805,"lower_bound":"dWNpem1JZ3FiaW5KSVAyTVNlbjZSRFJLcEFVd2o=","upper_bound":"dWdSMUtDcnV1ckxJWkk4T0ZBUTBYdw==","repeats":1},{"count":1813,"lower_bound":"dWdwVkZuSEN6ZVZSTmc1WWQ2","upper_bound":"dXBqYU83MG41STJNUTRUSUNxUUE0","repeats":1},{"count":1821,"lower_bound":"dXJ5VmdOWnE4OVp1T0IyOWU1eGJncXdCeUZQRHdxdw==","upper_bound":"djVqWk1zVkE0WWJBeGV1","repeats":1},{"count":1829,"lower_bound":"djZoRw==","upper_bound":"dlAz","repeats":1},{"count":1837,"lower_bound":"dlQ=","upper_bound":"dlpCVzc4","repeats":1},{"count":1845,"lower_bound":"dmhodEpGbmdRU3ZNQm4=","upper_bound":"dm1kaGN1c2hwUnlLZktiTmVlSlB5M2xxdXhaT2ZL","repeats":1},{"count":1853,"lower_bound":"dnBFSVNtTnJNbXc=","upper_bound":"dw==","repeats":1},{"count":1861,"lower_bound":"dzBrYVpnOTkycVFzbDNQTHR2Qmg=","upper_bound":"d0NtNkpkekpnWnJuMA==","repeats":1},{"count":1869,"lower_bound":"d0pLNzJjRGVhWmRvaDNkSmk4","upper_bound":"d1VXVWtPNDU0YUpZU1U=","repeats":1},{"count":1877,"lower_bound":"d1lCbHdSM3BDYg==","upper_bound":"d29leFlDRDVCaEl3","repeats":1},{"count":1885,"lower_bound":"d29zeFVUSFQxNEpydktI","upper_bound":"d3J6Q2Q2ODk0eER5eG80WTJVZFNXVjJvcg==","repeats":1},{"count":1893,"lower_bound":"d3Qz","upper_bound":"eDRDVDJvOURhZkp1TDBkV1pZMHVrN3RoSndDeQ==","repeats":1},{"count":1901,"lower_bound":"eDlxRUZnQ2x4TkhWZ3MxYjlRSlQ2QzNZZ2dt","upper_bound":"eEVJalJ5NFozUXBra3pVNDdGTEc3TDNMVVNVMGVUYw==","repeats":1},{"count":1909,"lower_bound":"eEZwWXhXZVBrWGlIczlFYm9PSA==","upper_bound":"eFNlUW9OajE1VjI=","repeats":1},{"count":1917,"lower_bound":"eFRqOERNbEM4ZWllc0ZJMVg0V2x5V0U1WVU=","upper_bound":"eFpjeG8=","repeats":1},{"count":1925,"lower_bound":"eGQwTVJ2NjlpNk82dms=","upper_bound":"eGZxSnk0SXcyQ3JXbEw=","repeats":1},{"count":1933,"lower_bound":"eGloaEVhVGdNOHA1MnlKVFJTd2xTNmZudFc0NURJbQ==","upper_bound":"eTRDZXBMUjJ4MlV5TA==","repeats":1},{"count":1941,"lower_bound":"eUx6Q3ZhTWs5S3FPeHdaOGppUEM=","upper_bound":"eVZEVjRjc1ZFdVZW","repeats":1},{"count":1949,"lower_bound":"eVdSMncwYg==","upper_bound":"eWoxczNLMEtJOE0=","repeats":1},{"count":1957,"lower_bound":"eW8zMnlQN0FtaE9NV2lU","upper_bound":"ejBOTUQyaW13bXZVSElIcw==","repeats":1},{"count":1965,"lower_bound":"ejhCdlNuSE55SnVZTXpJcVZMNGhtNGo0UmFobVZQSw==","upper_bound":"ekZVemhyUW85","repeats":1},{"count":1973,"lower_bound":"ekdiQTltUW5Ldg==","upper_bound":"elE0MDNLU1lvWXpmVTBrODE=","repeats":1},{"count":1981,"lower_bound":"elRyeXNnSk10YnZwUQ==","upper_bound":"elpIYUl5N0pqcQ==","repeats":1},{"count":1989,"lower_bound":"elpOWGNtVFZOSTVYU1ZJaHNJQktldHJDQWo=","upper_bound":"emxTT2lEV1djT2JnYzB6c0M=","repeats":1},{"count":1997,"lower_bound":"em1DWkhY","upper_bound":"eng=","repeats":1},{"count":1999,"lower_bound":"enl6cU9Jd2h5dVppaTN3RlB2a3I=","upper_bound":"enl6cU9Jd2h5dVppaTN3RlB2a3I=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,3,2,1,2,0,2,2,0,2,1,0,0,1,0,0,2,1,1,1,1,0,1,0,0,1,0,0,2,0,1,0,0,0,1,1,1,0,1,1,0,1,1,0,1,2,1,0,2,0,1,1,0,2,2,1,2,1,1,1,1,0,1,0,1,1,1,3,0,1,1,0,0,0,2,1,1,1,3,1,1,0,1,1,2,1,2,2,0,1,0,2,0,1,0,3,2,0,0,3,3,3,1,0,4,0,1,1,1,0,2,2,2,2,1,4,1,1,0,1,1,0,1,2,0,2,0,0,1,0,0,3,0,0,1,1,1,1,0,1,0,4,2,1,2,1,2,0,1,1,1,1,1,0,0,1,1,0,2,0,1,2,0,0,1,1,3,1,0,1,1,0,0,0,1,0,1,0,1,2,2,0,2,0,0,2,1,0,1,2,0,0,1,0,2,1,2,0,2,0,2,0,0,1,0,2,1,0,3,1,0,2,0,0,1,1,1,2,2,3,0,0,1,0,1,1,3,2,0,1,2,0,1,1,2,1,1,0,3,0,1,4,2,1,0,0,1,0,1,0,0,1,0,1,5,3,0,1,0,1,2,1,4,2,0,0,1,1,1,0,1,0,2,1,0,0,0,2,0,3,1,2,0,0,1,0,2,0,2,2,3,1,1,2,0,2,1,0,1,3,3,1,1,2,0,0,1,1,1,0,0,2,1,2,0,0,3,1,0,0,2,5,1,4,2,2,0,1,2,0,0,2,1,3,1,2,1,2,0,1,0,0,0,0,0,0,0,1,1,0,0,1,1,0,1,2,2,0,2,0,0,0,0,2,2,1,1,2,0,0,0,0,0,0,0,2,0,1,2,4,0,0,0,1,1,3,3,1,3,0,0,1,3,0,3,1,0,1,1,1,0,2,0,0,0,0,3,2,2,1,1,0,4,3,0,1,1,1,0,0,3,4,1,1,0,1,1,3,1,0,3,1,1,2,2,0,1,3,1,1,0,0,2,0,1,0,2,0,0,1,0,1,0,1,1,0,0,1,0,0,0,0,0,0,2,1,0,1,3,1,0,2,0,4,0,1,0,4,1,1,0,0,2,1,0,0,0,0,0,0,1,1,0,1,2,0,0,1,0,0,0,0,0,1,2,1,0,1,0,2,0,1,0,1,0,4,3,1,2,3,1,0,3,0,0,0,0,0,1,0,0,1,1,0,0,1,1,1,1,3,0,1,3,1,1,1,2,2,0,0,3,0,1,1,1,1,2,1,1,0,0,0,0,1,2,1,0,1,0,0,1,5,1,0,1,1,1,1,0,1,0,0,2,0,0,2,2,0,0,0,0,0,2,1,1,0,2,1,1,4,0,0,3,2,0,0,1,3,2,0,2,0,1,0,0,2,0,0,2,0,1,0,0,1,1,0,1,1,1,1,0,0,1,2,1,0,1,0,2,2,0,2,1,1,1,0,0,0,1,0,1,1,0,4,0,0,2,2,1,0,5,0,0,1,2,0,2,0,1,1,0,2,3,0,0,1,1,0,1,0,1,1,3,0,2,0,2,2,2,0,3,2,1,3,0,1,1,0,0,2,0,1,1,2,0,0,0,0,3,0,1,0,1,1,0,0,1,2,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,4,1,1,0,2,1,0,0,0,1,1,0,2,3,0,1,1,0,1,1,0,1,1,1,2,0,0,1,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,2,0,2,0,0,0,2,0,0,4,1,0,0,0,0,0,0,1,1,0,1,2,1,0,1,0,0,1,1,0,0,2,1,1,0,0,0,1,1,1,0,1,2,1,3,0,0,2,1,2,0,1,3,1,0,2,0,0,1,0,1,1,0,1,2,1,0,0,0,0,2,1,0,3,1,0,1,0,2,0,1,0,1,0,0,1,1,0,0,1,2,0,1,0,2,0,0,2,0,2,0,3,1,2,0,1,0,1,0,1,1,0,0,2,1,1,0,0,1,1,1,0,0,1,0,0,0,1,2,3,1,1,0,1,1,0,1,2,3,1,1,2,0,1,0,1,2,1,0,0,1,0,3,4,1,2,1,0,2,3,0,0,1,2,2,1,1,1,1,2,0,0,2,2,1,2,2,1,1,0,0,0,1,1,2,0,2,1,1,1,2,2,0,0,1,0,0,1,0,0,0,1,0,0,1,0,1,1,2,3,0,2,0,0,0,0,0,4,1,1,0,1,0,3,1,3,2,0,1,2,1,0,4,1,1,1,1,0,1,0,1,1,1,1,0,1,0,0,1,0,2,2,0,3,0,1,0,1,0,0,0,1,0,4,2,0,0,0,0,2,0,1,2,0,0,1,1,0,1,1,1,0,1,1,0,0,0,0,2,0,2,0,1,3,0,1,2,2,3,0,1,4,0,0,3,1,0,1,2,1,1,1,2,0,1,0,0,1,0,0,2,2,0,2,2,1,2,0,1,1,1,1,1,1,0,0,1,2,1,1,1,2,0,0,2,1,1,1,2,1,3,0,3,1,2,0,1,1,2,1,0,3,0,1,1,1,0,0,0,1,3,0,3,2,2,0,0,1,0,1,1,0,2,1,1,0,1,4,3,0,1,1,1,3,0,2,0,2,0,0,2,0,0,0,1,1,0,0,0,0,1,1,1,0,0,1,1,1,1,1,1,0,1,0,1,1,0,2,1,0,0,2,1,0,2,0,0,2,0,1,0,1,1,0,1,2,2,0,0,1,2,0,3,2,0,2,3,1,3,0,2,0,0,0,0,1,1,3,1,1,1,0,0,4,4,5,0,2,1,0,1,0,1,3,2,0,0,3,1,0,1,1,0,0,3,3,2,1,0,1,5,3,0,0,0,2,2,1,0,1,4,3,1,0,2,0,2,1,1,4,3,1,1,0,1,0,0,0,2,1,1,2,0,1,0,0,2,1,0,0,2,4,1,3,0,1,3,0,1,2,0,0,3,3,3,1,1,2,2,0,0,1,0,3,3,1,3,1,0,0,1,0,1,1,0,1,0,1,0,1,1,0,3,0,1,3,2,2,1,0,2,0,1,0,3,2,1,1,1,1,0,1,0,1,0,0,3,2,1,0,2,0,0,2,1,1,0,2,1,1,1,3,4,1,0,1,1,0,0,1,0,0,1,1,1,1,0,1,1,1,2,0,1,3,2,3,1,4,2,1,1,3,0,2,0,3,1,0,2,1,0,1,2,1,4,2,0,0,2,2,0,0,0,0,1,1,2,0,1,3,0,1,2,1,0,0,1,1,1,1,2,1,0,1,1,1,0,1,3,0,2,0,0,2,1,1,3,1,1,2,1,0,2,1,1,1,0,0,0,1,0,1,0,2,1,0,3,1,1,0,1,1,1,1,1,1,0,0,1,0,1,1,0,1,0,1,1,0,3,2,1,0,3,1,0,0,0,0,0,0,0,1,1,2,0,0,0,0,1,1,3,1,1,1,1,3,0,0,0,5,1,2,2,1,0,0,2,0,2,4,1,0,0,1,1,1,1,2,0,2,2,1,3,0,0,1,0,1,0,1,0,0,0,0,3,1,1,1,1,0,1,0,5,1,0,3,0,1,3,1,0,0,0,1,0,0,5,2,1,0,2,0,2,3,1,0,1,1,0,1,0,0,0,0,3,0,1,0,0,0,1,2,1,0,3,0,0,0,2,1,1,1,0,3,0,1,0,0,1,1,2,0,0,0,2,0,0,1,0,2,0,0,0,1,0,1,1,0,0,0,0,0,1,1,0,2,1,0,0,1,0,1,1,1,0,0,0,0,1,1,4,1,2,0,1,1,3,0,1,2,1,2,2,0,0,0,2,2,3,2,1,0,1,1,2,3,0,0,0,1,2,0,1,0,1,1,2,1,2,0,1,3,1,3,0,2,1,2,0,0,1,1,1,0,0,1,0,2,1,4,1,0,0,3,1,1,1,0,0,0,1,0,0,2,1,1,0,1,0,4,0,2,2,2,3,0,0,1,0,0,1,1,3,2,2,0,1,0,1,3,2,0,0,1,2,2,1,1,0,0,2,1,1,0,1,0,0,2,0,1,1,0,0,0,1,0,1,2,1,0,1,0,1,0,0,3,1,0,0,0,1,1,0,1,0,0,1,2,0,1,2,1,1,1,3,2,1,0,1,0,1,0,0,2,3,0,2,1,2,1,2,4,0,0,0,1,4,0,0,1,2,0,2,0,1,1,0,2,0,3,0,2,0,2,1,1,0,1,1,1,0,2,1,0,1,2,2,2,3,3,1,0,0,1,0,1,0,3,1,0,1,0,3,0,2,1,1,0,3,3,1,1,2,1,0,0,1,0,1,1,1,1,1,0,2,2,1,1,1,3,0,0,0,0,1,1,2,0,1,1,1,1,1,3,2,0,1,1,1,1,0,0,0,1,1,3,0,0,1,2,4,3,0,0,1,0,3,1,0,0,2,0,1,1,1,3,0,1,1,1,1,0,2,3,1,1,1,1,0,1,0,1,2,2,1,2,2,2,2,1,0,2,1,1,0,2,0,2,2,1,3,0,0,1,1,0,0,1,1,1,3,1,0,1,2,2,1,0,1,1]},{"counters":[1,0,1,1,1,0,1,1,2,1,5,0,1,1,1,0,0,2,0,3,2,1,0,0,1,0,1,2,0,1,3,1,0,2,1,2,0,0,0,1,3,0,3,0,1,1,2,2,1,0,2,2,3,0,0,4,4,0,0,2,0,2,0,0,2,2,0,1,1,2,2,0,0,0,0,3,2,1,1,2,2,2,0,2,2,0,0,2,0,0,2,0,1,2,0,1,1,3,2,1,0,0,2,1,2,2,0,2,1,1,0,0,0,1,1,3,1,1,2,3,0,0,0,0,1,1,1,2,1,1,0,0,0,1,0,2,1,0,3,1,0,2,0,0,1,2,0,0,0,1,0,1,0,0,1,2,0,2,3,1,0,0,3,0,0,2,1,1,4,2,0,0,1,0,2,0,1,0,0,2,0,0,2,2,4,0,0,1,2,0,1,2,3,0,2,0,1,0,0,0,2,1,0,2,0,3,0,1,1,2,3,1,1,3,1,0,0,1,0,1,0,1,0,1,1,1,0,0,2,0,7,0,2,3,2,2,2,0,2,0,1,1,0,1,1,0,2,2,0,0,2,0,0,2,1,3,0,1,1,2,1,0,0,1,0,2,1,0,0,1,2,1,0,0,0,1,1,1,0,2,1,1,3,0,0,0,0,0,3,2,1,0,0,1,1,0,0,0,1,1,1,0,1,0,2,0,1,0,2,1,2,1,0,0,1,1,1,3,1,2,0,2,1,1,1,0,1,2,0,0,2,1,3,0,1,0,0,2,2,1,2,0,1,1,1,0,1,0,2,0,1,1,1,0,0,1,2,3,2,3,4,1,1,0,2,0,2,0,1,0,1,2,0,1,1,0,0,0,1,3,2,1,1,2,1,1,1,1,1,1,0,1,1,1,0,2,0,1,0,1,2,2,2,0,0,0,0,0,1,1,1,1,1,2,1,3,2,0,0,1,0,0,0,0,0,1,0,1,0,1,1,1,0,0,1,1,1,1,2,0,2,1,0,1,1,0,0,2,2,4,1,1,0,1,2,1,0,0,0,3,3,0,0,1,4,1,3,0,0,0,0,2,2,0,0,2,2,1,0,1,0,2,2,1,0,0,0,1,2,1,2,1,1,1,0,0,1,0,2,1,2,1,0,1,2,0,0,0,0,0,0,1,1,3,2,1,1,0,3,0,1,2,2,0,0,1,1,0,0,3,1,1,2,0,1,0,0,0,0,0,0,2,1,1,1,0,1,1,0,1,1,1,1,1,0,1,0,4,1,1,0,3,1,0,1,0,0,2,0,0,2,2,1,0,1,0,2,0,1,0,2,2,1,2,1,0,1,0,0,2,3,1,2,2,0,1,1,0,2,0,1,1,1,1,1,4,0,1,0,2,0,2,4,0,0,1,1,0,0,0,0,1,0,5,0,0,1,1,1,1,1,1,0,2,2,2,2,2,1,0,1,1,0,2,1,2,0,3,0,4,2,2,0,0,2,0,4,0,0,1,0,0,0,1,1,1,0,0,2,1,1,1,0,1,0,1,1,1,2,1,4,0,2,0,0,3,2,2,2,0,1,2,1,1,2,1,4,2,1,2,1,1,0,0,0,0,0,1,0,1,0,1,0,0,1,5,1,0,2,0,1,2,1,1,0,0,0,1,0,0,0,2,1,2,4,1,0,2,0,3,1,2,2,2,3,2,0,1,0,1,1,1,0,0,1,2,1,1,2,0,1,1,0,1,0,1,1,0,1,1,2,2,2,1,2,3,0,0,2,0,0,1,1,2,0,1,1,2,1,1,2,1,2,2,3,2,0,1,0,1,1,0,0,3,2,0,0,2,0,0,1,0,0,1,0,0,1,0,2,2,2,0,0,0,0,2,0,1,1,0,1,0,0,0,1,0,0,1,0,2,1,0,2,1,2,1,1,2,2,1,0,2,1,1,3,2,2,1,2,2,1,0,1,2,2,1,0,3,0,2,1,1,0,0,0,0,0,3,0,0,2,0,0,1,1,0,1,0,0,1,3,1,1,3,2,2,2,0,0,0,0,0,0,1,0,0,0,2,0,1,0,2,0,1,3,1,0,0,1,3,1,1,1,4,1,3,1,1,0,0,1,3,1,1,1,0,1,3,0,2,0,0,0,0,0,2,1,0,0,0,2,1,1,1,2,0,2,0,1,1,1,1,0,1,1,0,1,1,1,1,1,0,0,1,3,1,1,2,1,2,1,1,2,1,2,2,1,2,3,0,1,2,2,0,0,1,0,0,3,2,1,1,2,0,1,1,0,1,3,0,2,0,2,2,0,1,3,1,0,1,0,0,2,2,4,1,0,0,1,1,1,0,3,0,1,4,1,2,1,1,1,0,1,0,0,0,0,0,1,0,2,4,2,1,0,3,2,1,3,0,0,1,0,2,3,0,1,1,0,1,1,1,0,2,3,0,2,1,2,1,0,3,0,0,1,1,0,2,0,0,2,1,0,1,1,0,1,1,1,1,0,1,2,0,1,0,0,2,0,2,0,1,1,2,0,3,3,0,1,0,0,0,2,0,0,0,2,1,0,0,3,0,1,3,1,1,1,0,1,1,0,0,2,0,1,0,1,0,1,1,1,1,0,0,1,0,1,3,0,2,2,2,1,1,0,1,0,1,1,0,2,2,2,2,0,0,0,0,0,0,0,0,1,0,1,0,0,2,2,1,1,1,1,0,2,1,2,1,1,1,0,0,3,2,1,1,1,3,0,0,1,0,2,2,0,0,2,0,0,0,0,0,1,3,1,0,0,0,1,1,1,0,0,1,6,1,1,1,1,1,1,0,0,1,3,1,0,0,2,0,2,2,0,2,0,0,0,0,2,0,0,1,0,0,0,2,1,1,1,0,0,2,1,1,2,0,0,1,0,0,0,2,2,0,0,3,2,0,1,2,2,2,1,1,4,0,1,2,2,0,1,2,0,4,0,3,0,0,0,0,0,2,1,2,1,2,1,0,2,0,0,2,0,3,1,0,1,0,2,1,1,1,0,2,2,1,1,4,2,1,2,1,1,0,0,0,1,0,2,0,4,2,1,0,2,0,2,0,1,1,2,1,1,0,0,0,0,1,0,0,2,4,2,0,0,2,1,1,1,0,1,3,1,0,0,1,1,0,0,3,1,1,2,1,0,1,1,1,1,0,1,0,2,0,1,1,1,1,1,1,1,1,0,0,1,1,0,0,2,0,2,0,1,0,2,0,2,1,2,1,3,0,5,2,2,1,1,2,1,0,0,2,0,1,1,0,1,4,1,3,0,4,1,1,0,1,0,0,0,0,0,2,1,3,1,0,0,0,0,2,1,1,1,2,0,0,0,0,0,1,1,0,2,1,1,1,0,1,0,2,0,0,0,2,0,0,3,0,1,4,2,1,1,1,1,1,1,1,1,2,0,0,3,1,0,1,0,1,1,1,1,0,4,0,4,1,0,1,1,2,3,2,1,3,0,1,3,1,3,1,1,0,0,2,2,0,0,1,0,0,0,1,2,0,2,1,0,0,0,2,2,0,0,1,2,1,1,4,2,1,1,0,0,1,2,0,0,1,1,0,0,1,0,1,1,0,0,0,1,0,0,1,1,1,0,2,1,0,1,0,0,0,1,1,2,1,1,3,0,1,1,0,1,2,0,3,0,1,1,0,2,1,2,2,0,0,3,3,1,1,1,1,0,0,2,0,0,1,2,2,2,4,1,1,1,0,1,1,0,3,1,1,1,1,1,3,0,1,2,0,0,0,2,0,2,0,0,0,0,1,1,0,1,2,1,1,0,2,1,2,1,2,3,1,2,0,1,1,1,0,1,0,2,0,2,1,0,1,1,1,0,0,2,0,1,1,1,0,0,0,1,2,0,2,1,0,3,0,0,0,0,0,1,1,0,2,1,2,1,0,1,1,3,3,1,1,0,1,0,2,0,2,0,0,2,3,1,0,1,1,3,1,0,1,0,2,0,0,0,2,3,2,5,2,0,0,0,1,3,1,3,1,0,1,1,1,1,0,0,1,1,1,1,1,1,2,1,1,2,1,1,2,1,0,0,0,0,3,1,1,2,2,1,2,0,2,1,2,0,1,0,0,1,0,0,1,1,0,1,1,1,2,1,1,0,0,1,0,0,1,1,2,0,0,0,1,2,2,2,0,1,1,1,0,0,0,2,1,1,0,1,1,0,1,2,2,3,0,1,1,2,0,0,1,0,0,4,1,1,1,0,0,0,1,2,1,0,0,0,0,1,0,1,0,0,0,2,0,0,0,1,4,1,0,0,0,1,2,1,0,0,1,1,0,1,1,0,1,2,0,0,1,1,0,0,1,0,2,0,1,3,1,0,0,1,1,2,1,2,0,1,1,0,0,1,0,2,0,2,2,1,2,0,0,0,1,0,1,0,1,1,2,0,1,1,3,2,1,2,1,1,0,0,0,2,0,0,0,2,2,0,0,4,3,1,2,2,0,0,0,1,2,0,2,1,0,1,2,0,1,1,0,0,2,4,0,0,0,1,0,2,0,1,0,2,0,0,2,0,2,0,1,0,0,0,2,3,1,0,1,1,0,1,1,1,0,1,1,0,1,0,1,0,0,3,2,0,0,1,1,0,1,1,1,0,1,1,0]},{"counters":[2,1,1,0,6,1,0,0,0,0,2,3,0,0,1,1,2,1,2,2,1,1,1,2,0,0,1,1,2,1,0,3,2,2,0,0,1,1,0,1,2,2,2,2,0,0,1,2,1,0,0,1,3,0,1,0,1,3,0,1,0,1,1,1,0,0,0,0,0,2,0,0,1,0,1,0,0,1,2,1,2,2,3,1,0,1,0,2,1,0,2,0,1,0,1,0,3,1,1,1,1,1,1,2,1,0,1,1,0,1,1,2,3,1,2,0,1,3,0,0,1,1,2,1,0,1,1,2,0,3,0,0,1,0,1,0,1,3,1,1,2,1,1,3,0,0,3,0,2,0,2,0,0,1,0,3,1,3,2,3,2,2,1,1,0,0,1,0,0,0,0,1,4,2,1,1,0,2,0,1,1,1,0,0,0,3,0,1,0,1,0,1,0,2,0,1,1,0,2,1,1,0,1,2,1,0,2,3,2,0,2,0,1,1,0,0,3,1,0,2,1,1,2,1,2,0,1,2,1,0,0,0,0,1,1,0,0,4,0,5,0,1,2,0,3,1,2,0,3,0,2,1,1,2,2,0,1,0,2,0,0,2,2,1,0,1,1,1,2,0,2,0,0,2,0,1,0,2,0,1,1,1,0,0,0,1,0,0,0,0,2,1,0,0,2,1,0,1,2,0,1,1,1,1,0,3,0,0,2,1,0,1,1,1,1,5,1,2,1,0,1,0,1,0,0,2,1,3,0,0,0,1,2,2,4,0,3,0,3,2,1,1,0,0,2,1,2,1,2,0,0,2,0,0,0,1,2,1,4,1,4,2,1,1,2,1,2,1,1,1,0,1,3,0,0,2,0,0,4,0,5,1,0,1,0,0,0,0,0,3,0,1,1,0,2,0,1,2,0,2,0,1,3,1,4,1,0,1,0,1,5,0,2,1,1,3,1,2,2,1,3,3,0,3,1,2,0,0,1,0,0,0,1,0,4,0,0,2,1,0,1,0,0,3,3,1,1,0,0,1,0,3,0,1,2,1,2,1,1,1,3,2,0,1,1,2,1,1,0,1,1,1,1,1,1,2,1,2,0,1,1,1,1,0,0,3,2,2,1,1,1,2,0,1,2,1,0,2,1,0,2,0,2,1,1,1,0,2,0,1,1,0,2,2,1,0,0,0,1,2,1,0,0,0,0,1,1,4,2,1,0,0,0,0,5,1,2,0,2,0,1,1,1,3,0,2,1,0,1,1,1,0,0,0,0,1,1,1,4,0,1,3,2,0,0,2,3,1,2,2,3,0,2,1,1,0,2,0,2,1,2,0,1,2,0,1,4,2,0,1,1,0,0,0,0,1,4,3,0,0,2,2,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,1,1,1,1,0,0,0,2,2,3,0,0,1,0,1,1,2,0,1,1,2,0,1,1,0,1,2,1,1,0,1,0,2,2,0,1,1,0,2,1,3,2,1,2,2,1,2,0,1,0,1,1,1,0,0,1,2,1,2,0,2,0,0,3,1,0,1,2,1,2,0,0,0,0,2,1,1,2,0,2,1,0,2,2,1,1,2,1,2,1,0,3,0,0,2,1,3,2,1,3,1,2,1,3,0,0,3,0,0,1,1,0,2,1,1,1,0,0,1,0,0,1,0,0,0,2,0,1,1,0,1,0,1,3,1,0,0,2,0,2,0,0,0,2,1,0,1,0,1,1,1,2,0,2,0,2,0,0,1,0,1,2,5,1,2,0,1,2,2,3,1,0,0,1,1,1,2,0,1,1,0,0,0,2,1,2,0,2,0,2,1,1,1,1,0,0,2,1,0,3,2,1,3,1,0,0,3,2,1,2,0,2,2,0,0,0,2,1,1,0,3,0,0,0,0,0,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,2,2,2,0,1,0,1,0,0,1,2,1,1,1,2,1,0,2,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,1,1,1,3,2,1,1,0,2,1,0,0,0,2,1,0,0,3,0,1,0,0,1,2,0,3,3,0,0,0,1,1,3,1,0,0,0,1,1,2,0,0,3,0,1,3,3,2,1,1,0,0,0,3,0,3,3,1,2,0,1,2,1,0,2,2,1,1,1,0,1,1,1,1,1,0,0,0,3,0,3,2,1,1,0,2,1,0,0,1,0,1,0,2,1,1,1,0,1,1,1,3,2,0,0,1,0,1,0,2,1,1,1,0,1,0,1,2,0,0,0,0,1,0,1,1,0,0,1,1,0,2,1,0,1,2,3,0,1,0,0,0,0,2,0,1,2,1,0,1,0,1,0,2,0,1,0,1,0,2,1,0,2,1,2,2,0,4,0,1,1,0,0,2,2,1,1,1,0,0,0,2,3,1,0,1,0,3,2,1,1,0,0,1,0,2,2,1,0,1,1,2,1,0,1,1,0,1,2,1,2,1,0,0,0,1,1,0,1,2,1,2,1,3,0,1,1,1,4,3,2,0,1,4,1,0,1,1,3,1,0,3,1,2,2,3,0,0,1,2,2,0,0,3,1,1,1,0,3,0,3,0,0,1,2,0,1,1,0,3,1,1,2,1,0,1,2,3,2,2,1,1,0,0,0,0,1,1,1,0,2,2,0,1,1,1,2,0,1,1,0,2,0,1,4,1,1,3,3,1,2,2,1,0,3,1,0,1,5,1,2,0,1,1,0,1,0,1,1,0,0,0,0,1,1,0,3,2,0,1,0,1,2,0,3,0,1,1,3,1,0,0,0,1,1,0,1,1,3,1,1,2,0,0,0,0,0,1,1,2,1,0,0,2,2,0,1,0,2,1,2,2,1,3,1,0,0,0,1,0,0,3,1,1,1,0,1,0,0,1,1,0,1,1,0,0,1,2,0,1,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,1,2,2,0,1,1,0,1,0,1,3,0,3,0,2,1,1,2,0,1,0,1,1,0,0,0,0,3,1,1,2,2,2,2,0,3,0,2,0,0,0,0,0,0,1,0,1,1,1,1,2,0,2,2,2,2,0,1,0,1,2,1,0,3,2,0,4,0,0,0,2,2,0,0,0,0,1,0,1,0,1,3,1,0,0,3,1,2,0,1,1,1,1,1,1,2,2,0,0,2,0,0,0,1,2,0,0,0,0,2,0,0,0,0,1,1,0,1,1,0,1,0,1,0,1,0,0,0,0,1,1,0,2,0,2,0,0,1,0,3,0,1,0,0,1,2,0,0,2,0,1,0,1,0,0,0,1,1,0,1,1,1,0,4,0,3,0,1,0,1,1,2,1,2,0,0,2,0,0,6,1,3,0,2,1,2,0,1,1,1,0,1,0,1,0,2,4,1,0,1,2,1,2,0,2,0,2,1,2,2,1,1,0,0,1,0,2,1,0,0,0,2,4,1,0,2,0,2,0,1,4,2,0,2,1,0,1,1,1,0,0,0,0,3,1,1,2,0,0,1,1,2,2,0,2,0,0,1,1,2,2,0,1,1,1,1,3,2,0,1,1,1,0,0,0,2,0,0,0,1,1,1,1,1,0,1,0,1,0,0,1,0,0,1,0,0,1,2,0,1,1,0,2,2,1,2,1,2,0,0,0,2,3,0,0,0,1,0,1,0,2,0,0,1,2,1,1,0,1,0,4,0,1,2,0,1,1,0,1,2,2,0,0,0,1,0,0,0,1,0,0,0,0,0,2,0,0,1,1,0,0,0,1,1,0,0,2,2,2,0,1,1,0,1,0,1,2,1,0,1,2,0,2,0,1,4,1,0,1,1,2,1,1,2,0,1,0,1,2,0,0,1,1,1,1,0,2,1,1,0,2,3,1,1,1,0,1,0,0,2,0,1,0,2,0,1,0,0,0,2,2,1,2,0,0,3,1,1,0,1,0,3,2,1,0,4,1,0,1,1,0,0,0,0,2,0,1,1,2,1,2,1,1,0,1,1,0,2,3,1,4,3,0,0,1,0,0,2,3,0,0,2,3,0,1,0,0,3,3,0,1,0,2,0,1,1,2,0,3,1,0,0,1,0,2,0,1,1,0,3,0,0,0,1,0,1,1,0,2,1,1,1,2,1,1,0,2,0,0,1,0,1,0,0,1,0,1,0,1,0,0,4,3,1,1,0,1,0,1,0,0,1,0,3,0,0,0,1,2,1,0,3,1,0,0,0,0,2,1,0,2,0,3,1,0,2,2,0,2,0,1,0,1,0,0,0,1,1,2,3,1,5,0,1,0,2,1,0,2,0,1,1,0,1,1,3,1,0,1,0,0,1,0,0,0,1,0,0,3,1,2,1,0,0,0,0,0,1,0,2,1,0,0,1,3,3,0,1,2,1,0,1,2,1,0,0,0,1,1,0,2,0,0,1,1,0,0,1,0,2,1,1,1,1,1,0,0,1,1,1,0,1,0,2,2,4,0,0,3,1,2,1,2,3,1,2,0,0,0,2,1,1,0,0,1,0,0,1,2,2,2,0,0,2,0,0,0,3,2,0,1,1,4,1,0,2,2,1,1,1,1,0,1,1,0,1,1,0,1,0,1]},{"counters":[0,2,0,0,0,4,0,5,0,0,0,0,1,2,0,0,0,2,3,1,1,1,1,2,1,0,0,0,0,1,0,1,1,2,2,1,0,0,0,3,0,4,0,1,0,0,0,1,0,2,0,0,3,0,2,1,0,0,1,2,0,0,2,1,1,2,0,1,2,3,1,1,1,0,0,2,2,0,1,2,1,0,0,1,1,1,0,1,0,0,1,1,0,3,2,1,2,0,0,3,0,1,0,3,1,1,1,0,0,2,1,2,1,1,0,0,0,0,1,1,1,1,1,1,0,0,1,0,3,1,0,1,1,2,1,1,1,0,0,1,1,0,1,0,0,0,1,1,0,1,0,3,1,2,0,0,0,0,0,2,1,0,1,0,2,1,0,1,1,0,0,2,1,0,1,0,2,0,0,1,1,0,4,0,0,1,0,0,1,2,2,4,0,5,1,1,0,0,0,0,0,1,0,1,1,1,1,0,1,1,1,0,1,1,2,1,0,1,3,0,1,1,1,1,1,0,0,0,2,1,0,0,1,1,0,0,1,0,1,1,1,0,2,0,2,0,0,0,3,0,0,1,1,1,2,0,0,1,1,2,2,1,1,3,0,2,0,1,0,0,0,2,0,2,2,0,1,1,0,1,1,0,2,1,1,1,1,1,0,0,0,2,3,3,2,0,1,1,1,0,1,1,0,1,3,0,2,2,1,0,0,0,2,4,0,3,1,0,1,1,2,1,0,1,3,1,1,1,1,0,3,1,3,1,2,1,0,2,1,0,1,0,0,1,2,0,0,2,0,2,1,1,0,2,4,1,3,0,0,0,2,2,2,1,0,1,0,1,1,1,2,1,0,1,2,1,1,0,0,0,2,1,1,0,2,1,0,2,2,0,1,2,1,1,0,1,0,3,1,0,1,2,0,0,1,1,1,2,0,2,0,2,1,2,1,2,1,0,1,1,1,1,1,0,0,2,0,1,0,1,1,0,0,3,0,2,1,0,2,1,2,1,2,0,2,1,2,1,0,1,1,1,2,2,1,0,1,1,2,3,0,2,0,1,2,1,1,2,2,0,0,1,1,1,0,0,0,4,2,2,2,0,0,2,0,0,0,2,0,2,0,1,0,2,0,1,1,0,3,2,0,0,1,1,0,1,0,1,0,1,0,0,3,1,0,2,1,0,4,0,0,1,2,0,1,0,0,1,2,2,0,1,0,2,1,2,0,2,3,1,2,0,2,0,1,2,1,1,0,0,0,1,3,1,3,0,0,1,1,0,1,0,1,1,0,2,1,3,0,0,3,1,0,0,0,0,1,1,1,0,3,1,2,0,0,0,1,1,2,1,1,0,2,1,0,0,1,0,1,0,1,0,3,2,2,2,1,0,1,0,0,3,1,0,1,2,2,1,2,0,1,2,1,1,2,2,1,1,0,2,1,1,2,0,0,0,1,0,1,1,2,0,3,3,1,0,2,1,1,0,2,2,2,2,2,0,3,0,1,0,1,0,1,0,0,0,0,0,1,1,0,3,1,0,1,0,0,1,1,1,1,1,0,0,1,1,1,0,1,2,0,0,1,1,0,0,1,0,1,1,1,1,3,0,0,1,1,0,0,0,1,0,0,1,0,0,1,2,1,1,1,1,3,0,0,0,2,3,1,0,2,4,1,2,2,2,1,1,1,1,0,0,1,1,2,2,2,1,2,1,0,1,2,1,2,1,0,3,0,1,1,0,2,3,0,1,0,1,1,0,0,1,1,2,4,0,1,1,2,5,1,0,0,1,1,0,3,2,1,1,1,1,2,1,0,0,1,2,0,1,2,1,2,0,0,1,2,0,1,2,0,1,0,3,3,0,0,0,1,0,0,1,0,1,3,2,0,1,4,2,2,0,0,1,0,1,1,0,1,2,0,0,2,0,2,1,4,0,0,3,1,2,0,2,0,1,0,1,0,0,0,0,1,2,1,3,2,3,0,1,3,0,1,2,0,0,0,3,3,2,3,0,0,0,0,0,0,1,1,6,5,0,0,1,3,1,0,0,2,3,1,0,2,1,0,0,1,3,1,0,1,2,0,0,3,1,1,1,0,2,0,0,1,1,0,1,1,1,0,1,2,0,0,0,0,1,0,1,1,3,1,1,0,1,0,1,0,3,0,1,0,0,2,0,0,1,1,1,1,0,2,0,1,1,0,2,1,0,0,2,1,1,2,0,2,0,2,2,1,0,0,1,1,0,0,0,1,1,0,0,0,1,3,3,1,0,2,1,1,3,1,1,1,2,3,0,1,1,1,0,1,2,1,0,0,0,3,1,1,0,2,2,0,0,0,2,0,1,0,0,1,1,4,2,3,1,0,0,2,0,1,1,0,3,0,1,0,1,0,1,1,0,0,1,0,1,0,2,0,2,1,2,0,0,0,2,1,1,0,1,2,0,1,2,1,0,0,0,0,0,1,0,1,1,2,0,4,2,0,0,1,1,0,3,3,0,1,1,2,3,1,0,1,2,2,0,1,2,2,0,1,1,3,1,3,2,0,2,1,2,2,0,0,0,0,0,0,1,1,0,0,0,1,3,0,1,0,2,1,1,0,0,0,0,1,3,2,0,3,0,1,3,0,1,0,1,0,3,0,3,0,0,0,0,0,1,2,1,1,0,2,3,1,1,0,2,2,0,5,0,1,1,1,1,1,1,0,3,1,0,0,3,1,0,1,0,0,2,1,0,0,0,0,0,0,3,2,0,1,1,0,3,0,3,1,2,2,0,0,2,2,0,1,0,1,0,3,0,1,0,0,1,1,0,3,1,3,2,0,1,2,1,0,0,0,1,0,0,0,1,1,1,0,2,1,0,0,2,0,1,1,0,0,0,1,0,1,5,0,0,0,2,1,0,2,1,0,2,2,1,0,3,1,2,1,1,2,1,0,1,2,0,4,0,1,0,2,1,1,1,2,1,0,1,1,0,2,0,1,3,0,0,1,2,0,0,0,3,1,0,0,0,2,3,4,0,3,0,3,2,0,1,0,0,1,1,1,0,1,0,2,0,0,2,3,0,0,2,2,3,0,0,3,4,1,0,2,2,0,0,0,0,0,1,1,1,2,0,0,0,0,0,1,0,1,0,1,3,1,1,1,2,0,2,1,0,1,1,2,0,1,0,0,1,3,0,0,0,0,2,1,3,1,2,0,0,0,0,1,0,1,1,0,0,0,0,0,2,1,1,1,0,1,2,0,0,0,1,0,0,1,1,3,1,1,0,1,1,1,0,1,0,1,1,0,1,2,3,4,1,2,0,1,1,2,1,1,1,1,0,1,1,2,2,1,1,1,6,1,0,1,0,4,3,4,2,0,1,0,0,1,0,0,0,0,0,1,1,1,0,2,1,2,0,1,0,2,0,1,2,0,1,0,2,3,2,0,1,1,1,1,3,2,1,0,1,3,0,2,2,1,0,2,2,0,2,1,0,0,0,0,0,2,2,1,2,1,1,2,0,0,0,0,0,2,1,0,3,0,1,1,0,1,0,1,1,3,1,2,2,1,1,0,0,1,1,2,0,0,0,1,1,1,0,0,2,0,1,0,1,2,0,1,0,2,1,1,2,1,1,0,1,1,0,1,0,3,0,0,1,0,0,0,1,0,2,0,0,1,0,0,1,0,0,0,1,1,0,3,1,1,0,3,1,2,1,0,1,4,1,0,2,2,1,0,2,1,1,0,2,1,0,1,2,1,3,1,1,1,0,0,1,1,1,1,0,1,0,0,1,0,0,1,1,0,0,0,0,0,1,2,1,0,1,1,0,0,1,1,1,0,0,3,0,0,1,0,0,0,1,1,1,1,1,0,1,2,2,0,0,1,1,0,2,1,0,2,0,1,1,2,2,1,1,1,0,2,1,2,2,0,0,2,0,1,1,1,1,0,0,0,3,1,1,1,2,0,1,1,0,0,1,1,3,1,1,1,0,1,0,1,0,2,0,0,1,1,1,4,3,3,0,2,0,3,2,3,2,1,0,2,0,0,1,0,1,2,0,1,2,0,1,3,1,1,2,1,0,0,0,0,3,1,0,3,0,0,2,0,2,3,1,0,2,1,0,1,0,1,1,0,0,1,2,1,1,1,1,0,2,0,1,0,0,1,1,0,0,1,0,2,0,0,0,1,1,2,0,1,1,2,0,0,0,0,0,2,2,4,0,7,2,1,1,3,2,3,1,0,2,1,3,0,2,2,0,1,1,1,0,0,0,0,1,0,1,0,0,1,2,0,1,0,2,5,1,2,2,2,2,0,0,3,1,1,0,2,0,0,1,1,2,2,0,0,0,1,1,1,1,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,0,2,1,2,0,1,1,1,1,0,0,1,1,1,0,3,1,0,0,1,1,2,2,0,1,3,1,3,1,0,2,0,2,1,0,0,0,2,2,1,2,1,2,3,2,1,3,1,0,1,0,0,1,1,2,3,0,1,2,2,0,0,2,1,0,1,1,0,0,0,0,0,1,0,1,0,0,3,2,1,2,2,2,1,2,1,2,2,2,1,3,2,2,1,2,0,0,2,1,0,2,1,0,1,1,3,2,0,2,0,2,1,1,2,0,0,4,2,4,1,1]},{"counters":[1,0,1,1,2,1,0,1,0,0,1,2,2,2,1,0,0,1,1,0,1,1,1,0,0,2,1,0,0,2,0,0,3,1,4,1,0,1,0,1,0,3,5,0,1,2,2,1,1,1,2,1,2,3,1,0,1,1,4,4,1,2,1,0,0,0,0,1,1,0,2,0,1,0,2,1,0,0,3,0,2,1,2,3,1,1,2,0,1,1,1,0,0,0,1,0,1,3,0,3,1,4,0,1,0,0,0,0,0,0,0,1,0,0,1,2,3,1,2,2,1,2,1,1,1,2,0,1,1,3,2,1,1,2,1,2,2,0,0,0,2,0,0,2,0,2,2,2,1,1,1,0,1,1,0,0,2,0,0,2,1,1,3,0,2,2,3,1,2,0,1,4,2,0,1,0,0,1,1,1,2,1,0,0,2,3,2,2,1,0,4,0,2,1,3,1,1,0,3,3,0,2,1,2,0,1,0,0,1,0,0,4,0,1,1,1,1,0,0,0,2,2,2,2,2,1,1,0,2,0,0,2,1,1,0,1,0,0,1,1,0,3,1,0,1,1,1,1,1,1,0,0,2,3,2,1,0,0,1,1,1,0,0,0,0,0,2,0,0,1,0,1,1,0,1,0,0,0,2,3,0,2,4,0,1,2,2,2,2,1,2,1,0,1,2,0,1,4,1,3,1,1,1,1,0,2,0,0,0,0,0,0,2,1,1,2,0,1,0,1,3,1,2,1,0,1,1,2,0,1,2,1,1,0,0,3,0,0,1,0,0,1,0,2,1,0,2,2,0,3,0,2,0,0,0,1,1,0,0,0,2,0,0,0,1,3,0,1,1,1,2,1,0,1,2,1,1,1,1,0,0,1,2,1,1,0,1,0,1,0,1,0,1,1,0,2,1,1,1,1,1,1,0,1,0,0,0,2,0,2,0,1,1,0,1,1,0,0,0,1,3,1,0,2,1,1,2,1,2,0,0,3,1,2,4,2,0,1,1,0,1,1,1,1,0,2,1,1,1,0,0,1,2,0,0,0,0,0,1,0,0,3,2,0,0,2,1,0,3,0,2,0,1,0,2,0,1,1,1,0,1,1,1,0,1,2,0,0,0,1,0,1,1,0,2,0,2,1,1,2,0,1,2,1,1,1,0,0,1,4,0,5,3,1,0,0,1,1,1,0,1,0,1,0,0,1,2,3,1,0,3,0,1,0,2,1,0,1,1,0,2,0,1,1,2,0,2,0,0,0,0,1,1,2,2,2,1,2,1,2,0,1,0,0,2,2,0,2,1,2,2,2,0,1,1,1,0,1,0,0,1,0,1,1,2,0,0,1,0,0,1,1,5,0,1,1,1,0,0,0,2,2,0,0,1,1,2,0,2,2,1,1,2,0,1,0,2,2,1,3,2,0,1,1,0,0,4,1,2,0,1,0,0,2,0,0,1,0,0,2,2,0,1,4,3,1,0,1,1,0,3,0,0,1,1,0,1,1,0,2,1,0,0,0,3,1,1,1,1,0,1,0,1,0,1,1,0,1,1,0,0,2,1,0,2,2,1,1,2,1,0,1,1,0,0,3,2,0,1,3,3,0,2,0,1,0,1,0,2,1,0,0,0,4,2,0,0,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,0,2,0,3,2,2,2,0,0,0,1,0,0,1,2,1,1,1,0,1,1,1,0,1,0,0,1,1,0,0,1,0,0,1,2,1,1,0,0,3,1,0,2,2,0,2,2,2,0,1,1,3,0,0,3,1,0,2,2,1,2,1,1,2,1,0,1,0,0,0,0,1,0,2,1,3,2,2,1,0,2,2,1,0,2,0,2,1,1,0,2,0,1,0,1,1,0,1,0,2,0,1,1,1,0,1,2,1,2,1,0,1,0,2,0,1,0,1,1,1,0,1,1,0,1,0,1,2,1,0,0,0,1,0,1,2,0,0,1,0,1,1,0,0,1,3,0,2,0,1,3,3,0,2,3,0,1,0,1,6,0,3,3,0,3,1,0,0,3,3,0,0,2,0,1,0,1,0,2,0,0,1,1,0,0,1,1,1,1,0,2,4,0,1,2,0,0,1,0,0,0,2,0,0,1,3,1,1,1,0,0,0,0,0,1,1,0,0,2,0,1,3,0,1,0,1,2,1,2,2,0,0,0,1,1,0,0,1,1,1,1,0,1,1,2,1,2,0,1,2,2,0,0,0,1,3,1,2,0,1,1,0,1,2,3,1,2,0,1,2,2,2,0,2,0,0,1,1,0,0,3,2,2,2,0,0,2,0,1,1,0,4,1,1,0,1,1,1,1,1,1,0,2,2,1,1,2,1,1,0,1,0,2,1,2,2,3,1,2,0,4,1,0,0,0,0,1,1,1,0,2,3,1,1,0,1,1,1,0,0,0,0,0,0,0,2,1,3,0,0,0,1,0,2,0,3,0,0,0,1,1,3,0,1,1,1,1,1,3,1,0,1,3,0,0,1,0,0,0,1,2,1,1,0,3,2,1,0,0,0,0,1,3,0,0,1,0,0,3,0,2,2,0,0,0,3,1,1,2,0,0,0,1,0,0,1,1,2,1,1,1,2,2,1,0,0,0,1,0,4,1,0,1,1,0,1,1,0,1,0,2,0,0,1,1,0,1,0,0,0,0,0,5,0,2,0,2,1,0,0,1,2,1,1,0,1,1,2,0,0,0,3,1,1,0,0,1,1,2,3,0,2,0,0,4,1,0,0,2,0,0,0,1,0,2,1,0,1,0,1,1,0,2,4,0,0,6,1,0,2,1,0,0,0,2,0,2,2,1,0,2,2,0,0,1,3,2,2,1,1,0,2,4,0,1,2,1,0,1,0,0,0,4,0,2,1,1,1,0,1,1,0,1,0,2,2,4,0,2,3,0,0,1,0,0,0,1,1,2,4,2,3,0,0,0,2,1,1,0,0,3,2,2,0,0,2,0,1,0,0,3,0,1,0,1,0,1,5,2,2,2,2,1,0,1,0,1,0,2,2,3,3,1,1,0,0,0,2,1,1,0,0,4,3,1,1,1,0,0,1,1,0,1,0,2,2,0,2,2,1,1,1,0,1,1,2,0,2,1,0,1,1,0,0,1,1,2,2,1,0,0,0,0,1,0,1,2,1,4,0,1,0,0,3,1,0,0,5,3,1,1,0,3,1,0,2,1,0,2,1,7,1,1,1,1,0,0,0,0,0,0,1,0,3,0,2,1,1,1,1,0,1,0,1,1,0,1,3,1,5,2,1,1,2,0,0,3,1,0,3,0,0,1,1,0,0,4,1,0,0,2,2,1,1,2,0,3,2,0,2,0,0,1,0,0,0,1,0,0,0,1,1,1,0,1,3,0,1,2,1,2,2,1,1,0,0,1,0,1,0,0,0,2,1,2,0,0,0,1,1,0,1,0,0,2,1,2,0,0,1,0,1,0,1,0,2,0,1,2,1,0,0,0,1,0,0,1,0,1,0,0,0,0,1,1,0,2,1,0,0,0,0,2,3,3,0,3,0,0,1,3,0,0,0,2,0,0,2,1,2,0,1,0,0,2,1,3,0,0,0,2,0,4,3,0,0,0,0,2,1,0,0,1,2,0,2,0,4,1,0,1,0,3,1,2,1,1,1,1,0,0,1,2,0,0,2,4,0,0,0,0,1,1,3,3,1,2,2,3,1,1,0,3,2,0,0,0,0,0,1,0,3,3,1,0,3,0,0,0,0,0,1,2,0,0,1,0,1,0,0,0,0,0,1,3,1,0,2,1,0,0,1,1,0,0,3,0,1,0,0,1,1,0,0,2,1,2,1,1,1,1,2,1,1,1,2,0,0,3,1,1,0,1,0,0,3,1,1,0,0,2,2,1,1,3,2,0,1,0,0,0,0,1,1,0,0,1,1,1,0,2,0,0,0,5,1,1,0,0,1,1,1,1,1,0,1,0,3,1,0,1,2,0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,4,0,0,0,3,1,0,1,3,1,0,2,1,2,2,1,1,0,0,0,1,1,2,0,0,0,1,1,0,2,1,2,0,3,0,2,1,3,1,1,1,2,2,1,1,0,0,1,0,2,1,4,1,2,1,1,2,0,0,1,1,1,5,3,0,1,1,4,1,0,1,0,1,1,0,0,0,1,1,2,2,1,0,0,2,1,2,2,1,1,0,2,1,0,0,1,5,2,0,0,1,0,0,2,0,2,0,1,0,1,0,0,1,0,1,0,0,0,1,0,1,1,0,2,1,0,0,0,1,0,2,0,1,2,2,0,1,0,1,1,2,1,1,1,1,2,3,0,2,1,0,0,1,1,0,1,2,0,1,0,1,0,1,1,1,2,2,1,1,0,2,1,1,3,1,0,2,2,1,0,0,1,0,0,1,3,0,1,1,1,0,1,1,1,3,2,3,2,0,2,1,2,1,1,0,1,1,0,2,1,0,0,0,1,1,2,3,2,0,0,1,0,1,1,0,0,0,2,0,2,0,1,1,1,3,1,0,0,2,0,2,0,3,1,1,2,1,1,2,0,1,2,2,0,0,2,0,0,1,2,3,0,4,1,2,2,1,0]}]},"null_count":0,"last_update_version":397952033199751168},"p7_md5":{"histogram":{"ndv":1973,"buckets":[{"count":7,"lower_bound":"MDJZWGdMbWlUMEs5anBwYTZpVA==","upper_bound":"MEhaZXZCdHl2QXdm","repeats":1},{"count":13,"lower_bound":"MEh4Q0F2VlVqVjZlWlpweFJucDA=","upper_bound":"ME9oVXR1S3JCbGtlRUVX","repeats":1},{"count":19,"lower_bound":"MFJ6ejdHRW44Mm4xVlZyM0xG","upper_bound":"MG1sZjY=","repeats":1},{"count":25,"lower_bound":"MG81ZUdQS3hkY0Vo","upper_bound":"MHhJWllOT25XaFFNZENZOGpr","repeats":1},{"count":31,"lower_bound":"MHhzVkN6SzI=","upper_bound":"MQ==","repeats":1},{"count":37,"lower_bound":"MUlEV2diamd0YlZkb2g5NGxibm1m","upper_bound":"MVIxQjF6dGhKdjJFeTljN2NhaA==","repeats":1},{"count":43,"lower_bound":"MVUwRTZSMEJBd1BnaGFmNA==","upper_bound":"MXltM0tIOTBYVnJlSFo=","repeats":1},{"count":49,"lower_bound":"Mg==","upper_bound":"MjR5TWRYN0pNQmdoUHRUWTdoYlEyOUs=","repeats":1},{"count":55,"lower_bound":"MjhlMzl0SW8xc0I0SE5RWG5sa2VVWFhYYlJRbVp3","upper_bound":"MklDZXhMc01nZmk2a0FqaVhkaEllNHZJSHdE","repeats":1},{"count":61,"lower_bound":"Mlk5TmVCdQ==","upper_bound":"MmNMZ2FTTQ==","repeats":1},{"count":67,"lower_bound":"MmgzZGw5eA==","upper_bound":"MmtaYVZQT0NPbHJEUXlSNHprRWY=","repeats":1},{"count":73,"lower_bound":"Mm9NUWI=","upper_bound":"MnQ=","repeats":1},{"count":79,"lower_bound":"MzJNR1l5eFQ=","upper_bound":"M0Rjb2N0a2RDTU9wOTZTRzFsbQ==","repeats":1},{"count":85,"lower_bound":"M0d0RnhSZXkxdXBVdHJ3MlJLS0dRU0Ft","upper_bound":"M0hnaUNFQWM5amkwbThtaDlLRk9PanNqSkhMWjNqcnM=","repeats":1},{"count":91,"lower_bound":"M0hpS2JHNTZUNzR0c2RrRQ==","upper_bound":"M1FqOGJmQllrVG5MZkdqbDlXbHZlM3plVQ==","repeats":1},{"count":97,"lower_bound":"M1NyUGdabGhGcVY=","upper_bound":"M2U=","repeats":1},{"count":103,"lower_bound":"M2ZUSm9kMXR1Qg==","upper_bound":"M2pFNmt6ZHphSQ==","repeats":1},{"count":109,"lower_bound":"M2xJUzExclJna0Y0YWR2dzdONXR6d1NQZ21qVlRKcDM=","upper_bound":"M25hUzJUcQ==","repeats":1},{"count":115,"lower_bound":"M29HNGc1QTRPVllhRHJzRkNacDQ3OFZxQlRvN2Y=","upper_bound":"M3o=","repeats":1},{"count":121,"lower_bound":"NDZZY0o=","upper_bound":"NDlab3djREVQNURMM2tpaFZRTUJtSU4=","repeats":1},{"count":127,"lower_bound":"NEFXNFFaSDhjOXA2aXloVEw4MXJOUGxURE5ZYTg=","upper_bound":"NEd4bTNBemtMMGVYVVJnVk9NUjNvNUc5bw==","repeats":1},{"count":133,"lower_bound":"NEhaSHNpamZ3OEN3V3VG","upper_bound":"NEo=","repeats":1},{"count":139,"lower_bound":"NEp6bnM5ZDY0SmJ5UGFUNXRZTGhaaERWTWVv","upper_bound":"NE93TlIxY1Q=","repeats":1},{"count":145,"lower_bound":"NFRJcGNMR0hzTnRZOWk=","upper_bound":"NGFCemVBNlNRQVpoWHUyYQ==","repeats":1},{"count":151,"lower_bound":"NG9yNnFTazRYc2NGa3RXTWRMQ2ky","upper_bound":"NHI5","repeats":1},{"count":157,"lower_bound":"NQ==","upper_bound":"NTU4c2FPVHpSUWdvZ0ZNYUp3","repeats":1},{"count":163,"lower_bound":"NTZJNHV0Z2YzNTZLTVE2TlhGN0R6T1lDZG42VzJh","upper_bound":"NUk=","repeats":1},{"count":169,"lower_bound":"NUpWbzI5YVQ1M1g3R0ZrOW01NGFCRQ==","upper_bound":"NVBqa0dqSGd3NVVHTHV1TVFIdUZvYVBhUXNzQWRlMlQ=","repeats":1},{"count":175,"lower_bound":"NVZlMmRvQXVNWXBYWXpmVmhSY3NsZlJjZWtmTw==","upper_bound":"NWhLZjlkREdBQVhUU0hDcmdGMWMyUW1mTTNtWA==","repeats":1},{"count":181,"lower_bound":"NWlOcXhaSTBRSFVCeldkdUlSaFg1Y1l0bkdJdUNi","upper_bound":"NXF1Y29Ic0YxMENlNXNNaXc2ZHRw","repeats":1},{"count":187,"lower_bound":"NXF6cUFpc3cxeVhNd3o=","upper_bound":"NXZvT0d1","repeats":1},{"count":193,"lower_bound":"NXlxMDVQN1lpc3VaM1RlMw==","upper_bound":"NkpkWXQ0dVNWT0VBMDNjY2lxNA==","repeats":1},{"count":199,"lower_bound":"NkxFU1c0am95RTdrcWRnZVRpY3lWV1J1Z3g=","upper_bound":"NlBLS3FXUFFQa2pUZUdxbg==","repeats":1},{"count":205,"lower_bound":"NlBnR0Zl","upper_bound":"NlRvVWFaVEVIMzN4Vml2aWVj","repeats":1},{"count":211,"lower_bound":"NlpWN0xvdllGRUY1TnNOblNQTGJOZjRod0RlZzlNT0M=","upper_bound":"NmNrTUNKVUFvcUoydlhVZmk1NlZJMg==","repeats":1},{"count":217,"lower_bound":"NmRGRmp3MHJ5N2dncFhLYTQydW9LREk=","upper_bound":"NnQ0bW5a","repeats":1},{"count":223,"lower_bound":"Nnk0N211R2k4WEFaT1lsMQ==","upper_bound":"Nzd3dWxtd0xZd2IxZ1hyUzJGdHc5","repeats":1},{"count":229,"lower_bound":"N0hJMVVwR2NCQkllYTd5dQ==","upper_bound":"N01md3laSk5UY0U5SHNYS2I2V2EyRUJs","repeats":1},{"count":235,"lower_bound":"N1ZNbHFYQjY4bDl2djlldzdEVWdUMHU=","upper_bound":"N2QweXlUWmxvZVZiUw==","repeats":1},{"count":241,"lower_bound":"N2RnNmJLUVNWd2pjT3Y4dm04Um1FV3BkaEtL","upper_bound":"N2ZQYVl3R2YxUk9kOTdWTVRsYm85Ug==","repeats":1},{"count":247,"lower_bound":"ODU4b3lBcnpjc1ZTUjY2eUUzaUVtMg==","upper_bound":"OEV2Q0dDZDdxSVpS","repeats":1},{"count":253,"lower_bound":"OEc5N3Zl","upper_bound":"OFNt","repeats":1},{"count":259,"lower_bound":"OFRFY3E0MGRJNGRsWFFDUzlhVE4wUWx6STU0VU0=","upper_bound":"OFhIR1BqZHVjZWJO","repeats":1},{"count":265,"lower_bound":"OGZxRHBHaGlqb3NCZW94YUJ0T2hWRHQ=","upper_bound":"OGxUcTByc2dRemltTkMyQkNxcG9iaEJsbFRqbGVG","repeats":1},{"count":271,"lower_bound":"OHBzdQ==","upper_bound":"OHQ=","repeats":1},{"count":277,"lower_bound":"OHdEeWxIUGdHWDZkR2VrbWlHeWFCZUhGNXpvWg==","upper_bound":"OTBjV09teGxiSXFhVg==","repeats":1},{"count":283,"lower_bound":"OTBjb2FMdDdxY1NrU2ptajdMZng=","upper_bound":"OUN5WUFJRUFmSTZ2bDkyZGttdHZPSUJVWHI=","repeats":1},{"count":289,"lower_bound":"OUZTcVRhdEhtZ1NRNHR2UDByWERrR0FpcGdIVA==","upper_bound":"OUpt","repeats":1},{"count":295,"lower_bound":"OUtKMmF3clRHTEc3dVlpcWF5YW1Nd3k=","upper_bound":"OWNOc0l3RWI2TFo=","repeats":1},{"count":301,"lower_bound":"OWZqMFhUVXRtZDNHZTdHWWt3bEkzcTRpUWM5","upper_bound":"OWppdU9IQXNvTkhpRVp6YVJ3Uzc1UzRNU2VRb05ZVw==","repeats":1},{"count":307,"lower_bound":"OXBRN2dtTnY=","upper_bound":"OXUwYkJONWxDbXN1RzR0alVtZDY2","repeats":1},{"count":313,"lower_bound":"OXl1a3J2TG9oTHZmbEJMSWhwN0FUekxPUzQ=","upper_bound":"QTJQVFh4RzhDV0xtRFZoUw==","repeats":1},{"count":319,"lower_bound":"QTY5MlU=","upper_bound":"QURtbnpRWHh1TkJ4MVdmSGQ0SU4=","repeats":1},{"count":325,"lower_bound":"QUZKS2FuNDdjM3N0UGRWT2ZvOWZuR2I=","upper_bound":"QUx4VkFHT2JPU1E=","repeats":1},{"count":331,"lower_bound":"QU01d1RDSndISU1S","upper_bound":"QU50S21sT0ZTdw==","repeats":1},{"count":337,"lower_bound":"QW5zR25uZDI1VHZIQ3ZNT1NTYm5Pa2xW","upper_bound":"QXJrMXFSQVZPbEhkNTNqRjJRaVIyN0FYcU5q","repeats":1},{"count":343,"lower_bound":"QXN3eDFJRXhxRUpPcUVYR1VkTTNreVZJWUNCaHdsZVA=","upper_bound":"Qjk=","repeats":1},{"count":349,"lower_bound":"QkVuNWxHU1Q=","upper_bound":"QlEzaUpsbXIxWmYyMGQ3ZlI1Z0pmaHpQTw==","repeats":1},{"count":355,"lower_bound":"QmJlNDUzNElNRGJvem5WWnVuV0VuSElaWk9NWlM=","upper_bound":"QmNGUUFMRQ==","repeats":1},{"count":361,"lower_bound":"QmhRTWpTdFBDMkpjYW1rSllyWXFwbnVTTlF1eA==","upper_bound":"QnRjNTFxamNlUUlNb0dDbTQ3UDlTNmhXbzNBZA==","repeats":1},{"count":367,"lower_bound":"QnlsSzI5a0k1ZlpkdENIbGNOclpCR2RE","upper_bound":"QzNoOGxzQWJrQVB3M1BKSzJY","repeats":1},{"count":373,"lower_bound":"QzN4R3BZcWVjS3EycU5leFVHcU10Y2k=","upper_bound":"QzlNb1UxbnptOEg3cUtLdUNwVEwyQUZ3ejdkYg==","repeats":1},{"count":379,"lower_bound":"Q0YzaQ==","upper_bound":"Q0k4SFVldHB5dnF5M0o=","repeats":1},{"count":387,"lower_bound":"Q0x2ZHJGOW9LUTdOTzRCcw==","upper_bound":"Q1h6YWE3R1lKWWJTd3padWFNSjBOcEE=","repeats":1},{"count":395,"lower_bound":"Q2FSRnZtZW0=","upper_bound":"Q2U=","repeats":1},{"count":403,"lower_bound":"Q2h2T2I=","upper_bound":"Q3V4QkR0S1ZWSnZzTG9sblhKZ01Z","repeats":1},{"count":411,"lower_bound":"Q3Z1b1hEbw==","upper_bound":"RA==","repeats":1},{"count":419,"lower_bound":"REE5RXpPaUgxRmxaUUxrUFZxV0NPYkVVR2M=","upper_bound":"RE9EcXFRRDgzRGlyVU03Uk9zdDFkb3VhRUd1bg==","repeats":1},{"count":427,"lower_bound":"RFBXV3BXVklzbE1BcUhHVHR1","upper_bound":"RFU2bFlD","repeats":1},{"count":435,"lower_bound":"RGVKMWZEODRlRGpQUVV0bm1jbG0=","upper_bound":"RG1rbDJxRjZlc3hIUDM0Szk=","repeats":1},{"count":443,"lower_bound":"RG5lbEVVVGtjMVFCbE1vdzlsN3owUDNlWDI=","upper_bound":"RHd6YmNpSVdIT0ZhbDJUczB0SXlpRHhPOA==","repeats":1},{"count":451,"lower_bound":"RHpTYnFpMHoxdGNkZ3J0b3U=","upper_bound":"RTdSS1Nteg==","repeats":1},{"count":459,"lower_bound":"RUN1N3lVYXdRU2VE","upper_bound":"RVFDMXdlRDU=","repeats":1},{"count":467,"lower_bound":"RVVqd3RiSHhpbGk0WWd6Sg==","upper_bound":"RWZuWlF2SmVTRTc4T0xhZFh0czNYbGpRSWNqUVpBc3o=","repeats":1},{"count":475,"lower_bound":"RWhWQzJSajZ0V1pVWnRUQ3hKYlB5QTBIbw==","upper_bound":"Rg==","repeats":2},{"count":483,"lower_bound":"RjNhQW1hWmp5dHJDcUFiQWZCSlFyUWt0QVI=","upper_bound":"RkNpSVdVZ2JQ","repeats":1},{"count":491,"lower_bound":"RlhNRTJ2aWVJOFE1UTllc3REWFRGZjBCaGU4UVFsR3M=","upper_bound":"RmdqQUEyUkdDdlByTzNKMlZySnhQVkNY","repeats":1},{"count":499,"lower_bound":"RmxPRFo2VHN1aXFMc1FFazh4MExJdmo1Yw==","upper_bound":"RnlD","repeats":1},{"count":507,"lower_bound":"Rw==","upper_bound":"RzhGeEtCU0tZeFg=","repeats":1},{"count":515,"lower_bound":"R0FCeFU2QmFZa01WMExrQm4xbGI1T3Fp","upper_bound":"R2dmTzlJTVlmS2trWHBqMkVaa2h3WjY2WnBkalE=","repeats":1},{"count":523,"lower_bound":"R2lMNnpwSjJ6cGR4OUw5c3lF","upper_bound":"R21KUA==","repeats":1},{"count":531,"lower_bound":"R285bG51eXpCZE51Qk1QcHM=","upper_bound":"R3czZEhyZWxCZjRWUm4=","repeats":1},{"count":539,"lower_bound":"SA==","upper_bound":"SERYWkhzMWxjajBjV29Dcmh3YWJVTTZ4","repeats":1},{"count":547,"lower_bound":"SEc3dTNnSXFHS2tIaDNNSFdzdnoxT2loZGhhcg==","upper_bound":"SEl3NEZnV2QzQkZpUHNldURFS2tlR3QxckNtMg==","repeats":1},{"count":555,"lower_bound":"SE54OEk5VWN6anhW","upper_bound":"SGpiM1Q5RUNEWWVhaXNIOFdKUFpoYklwWkcxd04zcQ==","repeats":1},{"count":563,"lower_bound":"SHdIb1dCMGR2bktvTzVVSlN4YmtSekM=","upper_bound":"SVFGTTNDaXNlM0ZjVmFZRg==","repeats":1},{"count":571,"lower_bound":"SVpx","upper_bound":"SW05TTZ6T1Z2bG9td0NvcGNOZkRkcWx3ZkV2WlY=","repeats":1},{"count":581,"lower_bound":"SW1BMjNwSUVmWjlCSHJJ","upper_bound":"Sg==","repeats":2},{"count":589,"lower_bound":"SjhUMk5ISkcyZ29pTDRFc01OcnBEcWdIN05td1hMYQ==","upper_bound":"Sk5KMA==","repeats":1},{"count":597,"lower_bound":"Sk9kdVY1VEJ2aHV3NmdkWWRTcnphTmZDbzNoQQ==","upper_bound":"SmRRSTRhQ2hmeTVD","repeats":1},{"count":605,"lower_bound":"SmZvTw==","upper_bound":"SzBsNXpHQ3VuY2laeWZzWm5KZUJKZEZFUA==","repeats":1},{"count":613,"lower_bound":"SzRRamJpdDNqOGJzRTdhSERVN05GZmxKdVBP","upper_bound":"S0NDbkU0WE5nUEFPNnNLQkJtckJOV3M3TlV1V29ZdQ==","repeats":1},{"count":621,"lower_bound":"S0RzdHZMOGt4cm11ZmIzRElySDY=","upper_bound":"S2FiamgzQko2OXFzT2o5UHdERmQ1M3B0eDdyZUFJMA==","repeats":1},{"count":629,"lower_bound":"S2dMNzh1bXRtak1BYVNIRm1QTUQ3NnVQ","upper_bound":"S3I3TTlKeg==","repeats":1},{"count":637,"lower_bound":"S3NJVWhTY2tNSENmV0xhdGFYUmlhNWVPdGtzMmZw","upper_bound":"TENGRjRQWDVFVHZFTnNEMXlhS0R3bm02QlpXRw==","repeats":1},{"count":645,"lower_bound":"TEZOSVpOM3JUbmlPRG0=","upper_bound":"TFRJYmVvblE=","repeats":1},{"count":653,"lower_bound":"TFVPSEQ=","upper_bound":"TGQxOGdIUXFnUlRhRG1yYWY=","repeats":1},{"count":661,"lower_bound":"TGlpNE1p","upper_bound":"THlxVnJTVmEwc3BmQVVMajFqQTgyaA==","repeats":1},{"count":669,"lower_bound":"TQ==","upper_bound":"TTBwYmFrQUpkQ2Z2T2JKTm5SNGtQd09sQ3N4OA==","repeats":1},{"count":677,"lower_bound":"TTJ1U042aGw=","upper_bound":"TUlSa0pLVEJOaFJVUWxzSDhucXBCWTA2VUkyTTdk","repeats":1},{"count":685,"lower_bound":"TU5od3ZZRTMzdEMzMHY=","upper_bound":"TVNvS29jSDlGVVBTZ3JuOTNnaDZmVGhSMU0=","repeats":1},{"count":693,"lower_bound":"TVNyb3JZa3FsUEVkNFNmWkZFbzhWTw==","upper_bound":"TWN3RllGcFZIWXRHRnZxZkFTb0NSN0dJeEpy","repeats":1},{"count":701,"lower_bound":"TWVvcWdXZWU0S2hCSHlFRDVX","upper_bound":"TXM5R1BsdjlJbzFk","repeats":1},{"count":709,"lower_bound":"TXNtelRudVhsZTlSM0VQdVEzMWFTd0RQRHhha0R0","upper_bound":"TXlxUFdReGVqc2lYWUt6bnFYUkpWWGdUaA==","repeats":1},{"count":717,"lower_bound":"TjJiMGFLdHZRT1RvTThz","upper_bound":"Tk1TZXJJV2ZLWXlncVVvcGNxdkhWZ3ZSdDd5dA==","repeats":1},{"count":725,"lower_bound":"TlJyZklPdUhnZzJiNw==","upper_bound":"TmJLNFlFdlVld0d4V1d0cE1Xd0pxTFNQOWg0cGZjVg==","repeats":1},{"count":733,"lower_bound":"TmVMOVFUSUlyMjN5VVFOVUhXUA==","upper_bound":"Tmk5MGdVOGx1ZmJiT3VvOTZpdnR2c0NBYXl2eEw4aEw=","repeats":1},{"count":741,"lower_bound":"TmtFTzc2V0JJZDdDVURObVFmWmc2OUtVME9ENA==","upper_bound":"TzB6cUwzMmJIS2dOcGN6M0E1bzh5Q1lqMw==","repeats":1},{"count":749,"lower_bound":"TzR4Zmg=","upper_bound":"TzdLWURu","repeats":1},{"count":757,"lower_bound":"T0NuZ1JlbGVv","upper_bound":"T1BYRUdJN1BTRUtGTUV1YVVQb1djT2RmckxwV1Q0","repeats":1},{"count":765,"lower_bound":"T1I0aVUwVU5YcXRxRUNJd3BZeVZLeURwbDlINUJ3Zzg=","upper_bound":"T1kwaENYYU9ZWWVlZzdlQnc=","repeats":1},{"count":773,"lower_bound":"T1o=","upper_bound":"T2ZlOGFsaA==","repeats":1},{"count":781,"lower_bound":"T2dHd3FC","upper_bound":"T240","repeats":1},{"count":789,"lower_bound":"T3lwOW5xVGVS","upper_bound":"UDg4Mm5LdnA1MkxUWGVLR2d5Y2NBbVRpeA==","repeats":1},{"count":797,"lower_bound":"UEJSY2ljeUdGSHdqYWpGdFUySGdWRDQ=","upper_bound":"UFJiako2NlFiZkFrS2FsSDdORWgzQ2RSZGM=","repeats":1},{"count":805,"lower_bound":"UGJjNzBFMDE5RnlMeTducXFzaDBPUlg5UTZOUEVD","upper_bound":"UG9DRG0xTHdDdUVIZTJHZk9Tdlk0TzBn","repeats":1},{"count":813,"lower_bound":"UHA4NEc=","upper_bound":"UHg3WFFlNXY1VFdtZk1DSEFsQXc=","repeats":1},{"count":821,"lower_bound":"UTFhelVYVmM=","upper_bound":"UUVYVjJZNm5xQXR3MA==","repeats":1},{"count":829,"lower_bound":"UUh2VTdl","upper_bound":"UVJDQkVIclFZT2wzVUh4QmJzWWREY2RkQUY=","repeats":1},{"count":837,"lower_bound":"UVVuTHBmSTVRS05PU2EzTDVnRklkTGRM","upper_bound":"UW1jaVkxOHVR","repeats":1},{"count":845,"lower_bound":"UXFzaDBRMkpKTk4xZVFR","upper_bound":"UjZ4aW1EZ0xLT3BXZw==","repeats":1},{"count":853,"lower_bound":"UjhpWWRoUHI3R2VJanpycWpEeVhv","upper_bound":"Ukx0dmFEbjRLUUwwa202amdjWGFq","repeats":1},{"count":861,"lower_bound":"Uk9qNENVeTBRRw==","upper_bound":"Uld1dlpOM0dydVJtcWVxZFo=","repeats":1},{"count":869,"lower_bound":"Uld4ZzZmdg==","upper_bound":"Umk4QXI1NEtqS0sxYU9FbjRiU3dhZjlFSGc1SUFC","repeats":1},{"count":877,"lower_bound":"UnJUT0p2MTJ1bEZvWFlzYm9zRkhVN2oycktDOA==","upper_bound":"Unp2T25MdzdSaVhWRWpEQ21kNjVZ","repeats":1},{"count":885,"lower_bound":"UzFiYmRIRFN3VHh5ak5FY0xMWDF5UHBQaHVv","upper_bound":"U0QzTkZ0TFNZMG45NUdoOVE4N1U2UHVWMHNqNw==","repeats":1},{"count":893,"lower_bound":"U0VSQ05JVFFVaE9qbnhFc0VJOXlpb3JGSGtqU3FYZVU=","upper_bound":"U0dCc2o=","repeats":1},{"count":901,"lower_bound":"U0tCOE8xRmthcDN2dm54S1c5ZG1qeHZDV2dTZw==","upper_bound":"U1RwWjVGcXVBSGZKSGlvUWwzNEtiMmpZbUhw","repeats":1},{"count":909,"lower_bound":"U1ZiZFllejFmaWpMaTE0VjczdEt0WEs4c1k=","upper_bound":"U2hlbk9ENms2eThlTHNaR3pDTG9FTVNud3JGaHI4","repeats":1},{"count":917,"lower_bound":"U2l1WGZCbmZoUHJk","upper_bound":"U3U=","repeats":1},{"count":925,"lower_bound":"U3V2bw==","upper_bound":"U3cyMEtoSmhrVEZE","repeats":1},{"count":933,"lower_bound":"VDBRaU5vc09keHZNUg==","upper_bound":"VDZldEJQUDFCeHlmcUdUa3VW","repeats":1},{"count":941,"lower_bound":"VDlUY2s=","upper_bound":"VE9mYUpQQw==","repeats":1},{"count":949,"lower_bound":"VFoxNVVnVkg2ZkYwMDBQS05hMHVYcERhS0R3ZlVs","upper_bound":"VHBVVA==","repeats":1},{"count":957,"lower_bound":"VHRGSVpKNzZna3k5WjhobkNTMkZPT0Iy","upper_bound":"VUExSVJvQlpoZDZsNg==","repeats":1},{"count":965,"lower_bound":"VUNIS0dXd3YzRUVMMXRn","upper_bound":"VUkweUdvcEZYTjVnZ08=","repeats":1},{"count":973,"lower_bound":"VUw5SFEwZExzQXo3U25RYk9sUUJDOXpCR20=","upper_bound":"VVRSZ1RvNG1jUEFK","repeats":1},{"count":981,"lower_bound":"VVUzUnh2RGdP","upper_bound":"VXkwWGky","repeats":1},{"count":989,"lower_bound":"VXl1bGlhYkV1","upper_bound":"VjFHZnJwd1hWNFZqWURGdHQ=","repeats":1},{"count":997,"lower_bound":"VjJFQ0M5SEgwWkZKZUkxRnlvdEwzcGVB","upper_bound":"VkYwUmo1d3RqTnZBVEpZSzBqQXZKclpPWkhR","repeats":1},{"count":1005,"lower_bound":"VlJ6N3g=","upper_bound":"VmdyakM=","repeats":1},{"count":1013,"lower_bound":"Vmo=","upper_bound":"VnZ3MlpHZVQ4NzF4ZHBGbHc1M1c3WFQ3dXo0dw==","repeats":1},{"count":1021,"lower_bound":"VzJycXFXY0JwZnptUw==","upper_bound":"V00yVTdhWEU=","repeats":1},{"count":1029,"lower_bound":"V1MxcUthbjRQeUExZUQ=","upper_bound":"V1pxT3RFRlJwUg==","repeats":1},{"count":1037,"lower_bound":"V2F1b05QMA==","upper_bound":"V2N6Y05uWU5SNw==","repeats":1},{"count":1045,"lower_bound":"V2ZVeWo2b05YY01EdnFyT1lybVRmUjAy","upper_bound":"V2xFZ0I4Mm1JTDRiRGZ0bA==","repeats":1},{"count":1053,"lower_bound":"V21qd0FBclQ1ZEM4R2hJT3dETXVLS3RPRQ==","upper_bound":"V3Z1T1NnOHJWTEdsTXA5THZ2RGg2ZTJwNEpqcEU=","repeats":1},{"count":1061,"lower_bound":"V3cweEhQeFZIQnZmdUdQeQ==","upper_bound":"WEVMRmxxenBYdDdWV0c3T0VaQktoNnVWUHI=","repeats":1},{"count":1069,"lower_bound":"WEh0ZW5hQlBOa2lDcGs=","upper_bound":"WFBQb3oyVHFQUXRYSnBSNVJVcUtFd09lTWtUZEhw","repeats":1},{"count":1077,"lower_bound":"WFR5MUV0bllCNWY5SnFDeFhPRw==","upper_bound":"WGt5MzM=","repeats":1},{"count":1085,"lower_bound":"WG01WkQ=","upper_bound":"WHRzOTEzcTRa","repeats":1},{"count":1093,"lower_bound":"WHZYQ3ROUERzdg==","upper_bound":"WTM=","repeats":1},{"count":1101,"lower_bound":"WTdFQVZIa2F6TnYxTlBEbHdLd1NFb3do","upper_bound":"WUlYOXoxYmw2Q0JYejduS1g=","repeats":1},{"count":1109,"lower_bound":"WUtnUlZFSDVXdXViSjdnbg==","upper_bound":"WWUxTE91ZGFoRXgyNXpuTEdzQmpzaHZWRVA=","repeats":1},{"count":1117,"lower_bound":"WWVEVmxMN1FtSU1sZkZYSm9qQmc=","upper_bound":"WXI2RURsNGVPR1RiQTJwRWxXOU1l","repeats":1},{"count":1125,"lower_bound":"WXJXTkY2bFhsY202bXlqTUhyWXg0UkhXUEY4Vw==","upper_bound":"WjJ0ckgyV2NVMW5PTUJxeENLdWRMT0hXQnZv","repeats":1},{"count":1133,"lower_bound":"WjJ5WjZvN2p0MDc2","upper_bound":"Wkc2akg0czExU1NO","repeats":1},{"count":1141,"lower_bound":"WkpkNnF4NTNhRll3bDlzcW55NEU=","upper_bound":"WlF4ZHNKamluZjZMNFU5YUpoRVNGWnNE","repeats":1},{"count":1149,"lower_bound":"WlJLMGJvMFR1dFpCVVd6MkQ=","upper_bound":"WlplMFgzTVlk","repeats":1},{"count":1157,"lower_bound":"WmNFWEwwMlI=","upper_bound":"WnRLbjRzOU1Xc0hUejZHenptbnhESlhpWHg5S2J0YQ==","repeats":1},{"count":1165,"lower_bound":"WncyRmxuQkJXdnQzYjBnN0VJVFVGalo5Z3ZPNGY0dA==","upper_bound":"YTRRNEJWZEtjeklJbkdhVjI1Q1Q=","repeats":1},{"count":1173,"lower_bound":"YTRURUE4dURKUUFTYzBvbDNp","upper_bound":"YUNCZ25iS204","repeats":1},{"count":1181,"lower_bound":"YUhRazFDM1dBYkl5d2ZNVmE=","upper_bound":"YVlJM0dWZUNJR2RrbDRUb1FSdjR5NENWM24wYk5uSHU=","repeats":1},{"count":1189,"lower_bound":"YWVzRzg0ZXpMV0k1","upper_bound":"YW00QkVpekh4SzJYVFNhOWxmTTM=","repeats":1},{"count":1197,"lower_bound":"YXNoYnNOekdtUWhXNncz","upper_bound":"YjZrWk9ac1owdQ==","repeats":1},{"count":1205,"lower_bound":"YkFkcnBBQWZMQmdPN09VSGs=","upper_bound":"Yk03d1NSYmtYZ1dGVQ==","repeats":1},{"count":1213,"lower_bound":"Yk1abHlwSzlMRE9uNFJtdm4yb2hwaW9yWUNwWkhM","upper_bound":"YlNEbUdh","repeats":1},{"count":1221,"lower_bound":"YlpzQk4=","upper_bound":"Ym41","repeats":1},{"count":1229,"lower_bound":"Ym9Oc2hXMXdsZEx5bVdBVDVkOXNXYmYw","upper_bound":"YndoYllPT0tIQW5lS1M5V1VUMw==","repeats":1},{"count":1237,"lower_bound":"Yw==","upper_bound":"Y1FMd3h0MU5tdng=","repeats":1},{"count":1245,"lower_bound":"Y1FjZGw1OHU=","upper_bound":"Y1R4VEhRWHlBQVJkQkV0RlFabFpMY0VPZWtLWjA=","repeats":1},{"count":1253,"lower_bound":"Y2pPdEdsa3lwbmkwY1M=","upper_bound":"ZDBxTWdOZW9sWERIMk1y","repeats":1},{"count":1261,"lower_bound":"ZDRJQXpKZFdqcG5acVA4UHdMeEdBSg==","upper_bound":"ZERWTW9McXBkUTdy","repeats":1},{"count":1269,"lower_bound":"ZExjdVhwRldHaTZubkwxSmtiRUVoSk5PdmpCeU9EU1k=","upper_bound":"ZFVqTDRzQXVyaWVxZA==","repeats":1},{"count":1277,"lower_bound":"ZFh3THN2Q2tseG9IUEh5MkJuSU1K","upper_bound":"ZGZzaDJYUTNaem9mYjk0Ng==","repeats":1},{"count":1285,"lower_bound":"ZGxxY0M=","upper_bound":"ZHkzZ3VhUk9yM05EV3hrcQ==","repeats":1},{"count":1293,"lower_bound":"ZHpjUjF4UkF5VVd2cEtCTDNjUWJ1aXcw","upper_bound":"ZTJ1MW1tUA==","repeats":1},{"count":1301,"lower_bound":"ZThzMWZkWDM5WDhlejZ3MUo1TTQzSU0=","upper_bound":"ZUduWlEycG92MnRJUGhkWDNjd25xTnVLb0ZV","repeats":1},{"count":1309,"lower_bound":"ZVE4","upper_bound":"ZVV4WUNjSXJNag==","repeats":1},{"count":1317,"lower_bound":"ZVh1ampzNWthM2NHOXJDWTZQMjg4U2d5djFj","upper_bound":"ZWlwZUdab1BVSjJvTzJ3OGs=","repeats":1},{"count":1325,"lower_bound":"ZWx2U1NwaXJTNVlXY0s4RXFlNmhVOQ==","upper_bound":"Zg==","repeats":1},{"count":1333,"lower_bound":"ZjFNSlFjUWZyOEhodQ==","upper_bound":"ZkpsSEZ3Y1d0b0ZBUDJDZFo0ZVp1aG5BV1dva2hoUQ==","repeats":1},{"count":1341,"lower_bound":"Zk1l","upper_bound":"ZnQ5WG5RRTM=","repeats":1},{"count":1349,"lower_bound":"ZnRvbW1VeFEwYlVqSzVZY2FBY0w5","upper_bound":"Z0ZYTUNacDN6","repeats":1},{"count":1357,"lower_bound":"Z0ZuTk9ObnNFYWNLSDN1Y1dZTlVraEl2TEV3cU0=","upper_bound":"Z014M3hCNGlscU11TjNKNjBoandX","repeats":1},{"count":1365,"lower_bound":"Z1A5V2Na","upper_bound":"Z2lZeUV4UEs3U01pUGZ2NE5PVDM4RENOWWRx","repeats":1},{"count":1373,"lower_bound":"Z2pmYTlNNmZGMnZUUjUxcnMzQ2xZOE15bGJ6Yk9qZA==","upper_bound":"aDhLVzdaQUZjSXZEdFVO","repeats":1},{"count":1381,"lower_bound":"aEhJeDNzdVJtcUtBWmpNTXRDdg==","upper_bound":"aFA4RDJUdEU5MURtTXVOSkp2TUNoYzE4aEFGNDBNZA==","repeats":1},{"count":1389,"lower_bound":"aFYzU2dZM0R1REF4dnBodDJFMUsySDhmT0U=","upper_bound":"aFpKSkFQTEVtYjhzaGdWVlhQNXNsZVRFdw==","repeats":1},{"count":1397,"lower_bound":"aGJJZg==","upper_bound":"aGpWUkEzbUUyTmJVdmJXb1o1SmFOYk9pcA==","repeats":1},{"count":1405,"lower_bound":"aG0ydGdjYjlWbEFOWE5qZlpRQWNUOEJPVjRZUA==","upper_bound":"aHdFWkNROTJ4ZWZqUnI3d2VrZktuemdLVmZFaXk=","repeats":1},{"count":1413,"lower_bound":"aQ==","upper_bound":"aTJ3MlByaktUS0FyOWRiR1k=","repeats":1},{"count":1421,"lower_bound":"aThhOA==","upper_bound":"aURUNkJDbUs2bE9rbFo5dnVBSGdC","repeats":1},{"count":1429,"lower_bound":"aUxSTUE1OEZYdzNoTlJBU2E=","upper_bound":"aVlSN1BLVA==","repeats":1},{"count":1437,"lower_bound":"aWFnSXVnN1VFaDMyR2M1Sjk2RjFSWlA=","upper_bound":"aWU=","repeats":1},{"count":1445,"lower_bound":"aWdGcU5nSGh3VEJMYzVuNHdWZU45QmZGRXhkWHNIWA==","upper_bound":"aW0wV1p3YXhhcTJY","repeats":1},{"count":1453,"lower_bound":"aXUzSlQ=","upper_bound":"ag==","repeats":1},{"count":1461,"lower_bound":"ajNoVFVGQTJpeTFkaHdHOTRQYW52enhjQnA=","upper_bound":"ajY0V0V2WnJXV08wZklPa1pWR0xlb2lK","repeats":1},{"count":1469,"lower_bound":"akNmTENjaENLbUxIMXliTGhnREJyT1A=","upper_bound":"akpFdFh1eU04eWhVbzVZZnNR","repeats":1},{"count":1477,"lower_bound":"ak1iTnhJdVM5VUE=","upper_bound":"allBVVZ3R01pRWhtYVVGQkRoNlN4eUhidVpwZzVB","repeats":1},{"count":1485,"lower_bound":"allhQXFXTGxuNUFyTWJIazBXajVhZWs5VzA=","upper_bound":"am4wSWxnbWFhcmNKNTR6RWFm","repeats":1},{"count":1493,"lower_bound":"anZHdG5zbW1UclZ1T2x1OTVBeXQ3MEI2OA==","upper_bound":"a0NpVzNySjc4SkhTc1Z6cFE2cg==","repeats":1},{"count":1501,"lower_bound":"a0NvY3dTVVJ5RXZ1","upper_bound":"a051R0h4cVp5ZFJObWo=","repeats":1},{"count":1509,"lower_bound":"a08ycDhXWkY4OVlDY0xiQktIWXpH","upper_bound":"a2d0OHZpZW5WZG5ScjlWcVJQTlFRYk9ETUNXRlFQNDg=","repeats":1},{"count":1517,"lower_bound":"a2kzQjNERTBMOXlrdlNvS1E2Q3QwTlZvZHBHelI=","upper_bound":"a3ZnWG03Ym9xWGM4SDNJenkyc3pyNGlxaVhBYXduTk8=","repeats":1},{"count":1525,"lower_bound":"a3dDRFk=","upper_bound":"bEV2TUpKaGtpeUhnVEc2WHZDZWE2SzEwR3ZQ","repeats":1},{"count":1533,"lower_bound":"bE1aaWlyM2thSFQ1ekx5b2Vwd0Rj","upper_bound":"bFdrYzdVWlFPZUdXVg==","repeats":1},{"count":1541,"lower_bound":"bGNvM2VhMWtzYkVQUUNkRE81eTlZclF4U1h2S2U=","upper_bound":"bHFSVEZ4OE5sUA==","repeats":1},{"count":1549,"lower_bound":"bHFyMmk5VXFDbndMSDhiUHQwYkJwZzVQM0VDVWp6bw==","upper_bound":"bQ==","repeats":1},{"count":1557,"lower_bound":"bTc3NHNhVjhUckFHV3d4UW82RDliVA==","upper_bound":"bUlpYnBoRW0yZXNJRXZHZ3U=","repeats":1},{"count":1565,"lower_bound":"bUo5VGdp","upper_bound":"bVNJTjdkR1lUWWJlOWdoOGJqbElNbw==","repeats":1},{"count":1573,"lower_bound":"bVlWRUdFOQ==","upper_bound":"bWZQNm9tRmUzTTlkcmI=","repeats":1},{"count":1581,"lower_bound":"bXEwNHBwUnlsV2g3","upper_bound":"bjFrZExaeEFwZmN2eGZXMU5NTUVWRU1ETg==","repeats":1},{"count":1589,"lower_bound":"bjN4WXdMS2ZyaXFYeE9ybUlXM3VVaDc=","upper_bound":"bjdkVXJiWlY2T3R0NnQyblJsUg==","repeats":1},{"count":1597,"lower_bound":"bkFEeVYyYnFqMmR1c1pnanI3ZVFYZnczVjY=","upper_bound":"bkplR1U5RjhnbDc1cnVVOUlnMVNRa1NudzdWUTNXcQ==","repeats":1},{"count":1605,"lower_bound":"bkw1N050NHFSUkdTeg==","upper_bound":"blRNSTNhMDZkdUZuaUZE","repeats":1},{"count":1613,"lower_bound":"bmFlQ0IzVlpza0FoQ3E5","upper_bound":"bm5uV3g5ckxBeVNjZndMZVJucXZ6WGxiSW5pWW5p","repeats":1},{"count":1621,"lower_bound":"bnFGeHpWalRqNlVyRVN0NDN4VHJjV0Q5WHRUSDNp","upper_bound":"bw==","repeats":1},{"count":1629,"lower_bound":"bzNBcjB2STk=","upper_bound":"b0lBZ3k=","repeats":1},{"count":1637,"lower_bound":"b041Z3p2NmUyUGtrMkYzTE9zbW1WYWluTDc2OEE5Mg==","upper_bound":"b2ZHWWVYTDZyRHpyRg==","repeats":1},{"count":1645,"lower_bound":"b2ZlVFJPQmxGcmR4dXVmQ2tPSkd4Yg==","upper_bound":"b2pyUGowdFM1UWdCc2tPVEx0Tkw=","repeats":1},{"count":1653,"lower_bound":"b2twTEo3V2xjRGcwaDVldHk5ZEo=","upper_bound":"b3NpajFXcDFUM3dTYnhuNGcyeXpMTGQ=","repeats":1},{"count":1661,"lower_bound":"b3RYRk1WWTc3ZFo4MzY5bzFV","upper_bound":"b3YwT1F6Z0JIaU5sN1pZUW9oSFRG","repeats":1},{"count":1669,"lower_bound":"cEw=","upper_bound":"cG1peVYzRTdHREdNZXk=","repeats":1},{"count":1677,"lower_bound":"cG5DY2oyZzBad1pBeGtRYWo=","upper_bound":"cHZCMTRmV2lKUzFCd29CaW9zVWt5S0M0cVM=","repeats":1},{"count":1685,"lower_bound":"cHljcFg2S2lHTm1SZ29CTnBtbVBzUUhQbXZiQ3F0OGY=","upper_bound":"cTBBZlhlTW9J","repeats":1},{"count":1693,"lower_bound":"cTE0VlZqYlJROWY=","upper_bound":"cUJrQUw0VlJRQ01pMnNkRjJ2Skk4","repeats":1},{"count":1701,"lower_bound":"cUdRZ0xRVG8yazJQSGFmaFJUVEVQVQ==","upper_bound":"cWJCT0VMb2pnSERMbm5pelZhYXVIeFZKV3NTdFNJ","repeats":1},{"count":1709,"lower_bound":"cWU1Vkc3cHRRV2hTSG1MSXdVdXQ=","upper_bound":"cW5PQW9sVFc0akZtT2FyOEF0T0NRQlJLUm40dlR2","repeats":1},{"count":1717,"lower_bound":"cW5tNnho","upper_bound":"cg==","repeats":1},{"count":1725,"lower_bound":"cjdEWUFSS3cyelVWamtXSkc1NXBDVXQ=","upper_bound":"ckIxbVVpc1hTekdZdHE3czFoTms=","repeats":1},{"count":1733,"lower_bound":"ckJ4REdlbnVZY3hFMGVJUzJzeGh3bA==","upper_bound":"ck13Z0IyNW4zc0lJbg==","repeats":1},{"count":1741,"lower_bound":"ck53eHlabzlMTTJ5OHFvZ1JsSU1PTXFFTGFHTGpTNw==","upper_bound":"cmZpWEFiMFhGTXVldzlrUEQ0N0YyN3k=","repeats":1},{"count":1749,"lower_bound":"cmdPdGNVcGJZWG52NEpSQQ==","upper_bound":"cmtLVU83V0J5SHhROEptOWpXU3JLWHBxc0tURU4xMA==","repeats":1},{"count":1757,"lower_bound":"cnJubVpwS0Vhdzh1dlF3aXNsYUJCRHY=","upper_bound":"cnZkN2FRTVVYY3lkS3hJQVMwQnlUNUNIY3M=","repeats":1},{"count":1765,"lower_bound":"czlncDFRQzEzTWlSdE1Ma2FnajE3TUs=","upper_bound":"c0hRSTZ5VTNU","repeats":1},{"count":1773,"lower_bound":"c0wwVg==","upper_bound":"c1FRY1NMRm8zaGwzcE9XVWx2SnJqS1Bj","repeats":1},{"count":1781,"lower_bound":"c1Y1Ykh3VVNUSzc5STZOclBRTmJ6","upper_bound":"c2lVSmVYa2lRRm1RMU0yZzByUg==","repeats":1},{"count":1789,"lower_bound":"c2xCRXVqaUVyckV6UFI0Y0FXb2Y2ZUVlcGMxeGVE","upper_bound":"c3RHeUJSallCa09WdWw5VlhjZzJEYjFzcg==","repeats":1},{"count":1797,"lower_bound":"c3dyeFZ6amlu","upper_bound":"dERDQjBDTlBhZ3Z4dHNaMWZjTnJsb3ZQMQ==","repeats":1},{"count":1805,"lower_bound":"dEk4cmQ=","upper_bound":"dFNGQ3dLNkJuQ1QzRHo=","repeats":1},{"count":1813,"lower_bound":"dFQz","upper_bound":"dFpnQQ==","repeats":1},{"count":1821,"lower_bound":"dGV5SDNLUHhMazRs","upper_bound":"dHM2","repeats":1},{"count":1829,"lower_bound":"dHdiYTNWc2QwenB3SEtjaW1IQ2p0UDZHaXc=","upper_bound":"dUJSUFRTSm1iNHJtaA==","repeats":1},{"count":1837,"lower_bound":"dUJmQmNEc3g2RXBsQlF1QXhnSGh6aGVoR0s0Sk1h","upper_bound":"dUxWblJwRHVPTTM=","repeats":1},{"count":1845,"lower_bound":"dU1wM0t4cUZ4eVJZalFoMnBXazNHMQ==","upper_bound":"dWpKTUpDTld4Y1o=","repeats":1},{"count":1853,"lower_bound":"dWpXUFVTazF1ajlLeW9JWEtveEoyT3BLR3c=","upper_bound":"dXlRWnlmSkNlRkV6Z1lyTkJDVA==","repeats":1},{"count":1861,"lower_bound":"djBMZGtMR2JjMlQ5Q1pMd3NzWjJURjdF","upper_bound":"djFhOFhjREp2NnB5clpDdG5zYzlYb1ZlQnh2","repeats":1},{"count":1869,"lower_bound":"djhUYzg5c2tGcVM5ekZ3Qk0=","upper_bound":"dkRYbUpNN3p6VTBRZW5Cb1NRbldmUWN2UHlTU2Q=","repeats":1},{"count":1877,"lower_bound":"dkh3VWRqN0F3dWY5YlZv","upper_bound":"dlliUQ==","repeats":1},{"count":1885,"lower_bound":"dlprejZ0Vw==","upper_bound":"dmxCU3pH","repeats":1},{"count":1893,"lower_bound":"dmxSdlBobEhuU25uZA==","upper_bound":"dzJ1cTFQek5R","repeats":1},{"count":1901,"lower_bound":"d0F4TzdtSHFkM2tONlFsNE1aVmtBMEY0","upper_bound":"d01YTk5BYU1lbHJWOHhMR0I4NTFicDFzYzliVmQ=","repeats":1},{"count":1909,"lower_bound":"d05SUkFrZGtZWlpWSHNwa2FZdFhhMjZhdXRqa3pl","upper_bound":"d2ZDV0NveHhmeU03","repeats":1},{"count":1917,"lower_bound":"d2dPR09ReA==","upper_bound":"d2xaSA==","repeats":1},{"count":1925,"lower_bound":"d29V","upper_bound":"d3k1S1JHQW1HbmF3WGp3WDkxZQ==","repeats":1},{"count":1933,"lower_bound":"eA==","upper_bound":"eE5IN2duWENtekxoT1BFSUEwaUNscEhxanlw","repeats":1},{"count":1941,"lower_bound":"eFM5c2hna3R0U1h6RFNzbW5ZNkRyQVBOWGprUUQx","upper_bound":"eGZ5","repeats":1},{"count":1949,"lower_bound":"eG5hNThBOUd0OVFFRmRjT04wTlF6OWk5","upper_bound":"eTJ3enk5YWVDZXVzNFJwcUJh","repeats":1},{"count":1957,"lower_bound":"eUM=","upper_bound":"eVVwZVRkUVhtNnppaFB6TTdqWDZBdTNW","repeats":1},{"count":1965,"lower_bound":"eW5CbUVidFlwZjJiaDFsZ3plaUE5c09xeG52NTR6WWs=","upper_bound":"ejFNaWVW","repeats":1},{"count":1973,"lower_bound":"ejVKa3g=","upper_bound":"ektWSGYxUmlsQ1BXa0VQbWhvaFRKdzF6SXpUdzhaRg==","repeats":1},{"count":1981,"lower_bound":"ektoVUoyUXI=","upper_bound":"ek5pSkR3Z29PRDhwZVd1aU5Tb0RweXl5","repeats":1},{"count":1989,"lower_bound":"elQ=","upper_bound":"empm","repeats":1},{"count":1997,"lower_bound":"enFIQWhvSVdlZUlYMUhoUUtkTUpMdA==","upper_bound":"enc1UVN4bWhSaDBWM09LNDdvMnhhZk4y","repeats":1},{"count":1999,"lower_bound":"enpmbVFoaTBoWmljWW9WQU1qTWdXWm53ZFlIaE40TQ==","upper_bound":"enpmbVFoaTBoWmljWW9WQU1qTWdXWm53ZFlIaE40TQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,1,1,1,1,0,1,1,4,3,0,1,0,0,1,1,1,1,0,1,2,1,3,0,2,1,0,1,1,0,1,2,0,1,1,1,1,0,0,2,1,1,0,1,0,1,3,2,0,1,0,0,3,1,0,0,0,1,1,4,0,2,0,2,0,0,1,1,0,0,0,2,0,2,1,1,0,0,0,1,1,1,2,2,1,0,2,2,1,0,2,0,1,4,0,0,0,2,0,1,0,0,2,0,1,1,0,1,1,2,0,1,1,0,2,0,0,1,2,0,0,1,0,1,0,1,0,0,0,3,0,1,2,2,1,4,2,0,2,1,1,0,2,0,1,2,1,0,0,1,1,1,1,0,2,1,0,2,1,1,1,0,1,2,0,1,1,1,0,0,0,1,1,0,1,0,1,1,2,3,0,0,0,1,0,0,0,0,2,2,0,1,1,2,1,3,3,1,1,2,0,1,2,0,2,1,3,0,1,3,1,1,1,0,1,1,0,0,0,0,2,2,0,1,1,2,1,3,0,0,0,2,2,0,5,1,0,1,1,0,3,0,0,1,1,0,1,1,0,1,1,0,4,2,0,2,0,0,1,1,1,1,0,0,1,0,1,1,1,2,0,0,3,1,1,1,0,1,1,1,1,0,2,1,0,0,0,1,1,0,0,0,1,2,1,1,0,2,3,1,2,1,1,4,0,0,1,0,1,0,0,2,1,1,0,1,0,1,2,0,2,4,3,0,2,1,2,2,0,1,2,2,1,0,2,2,1,1,0,0,1,3,4,0,2,3,1,1,2,1,1,0,1,0,0,1,2,0,0,2,1,2,1,1,0,0,1,2,0,1,0,1,0,0,0,0,2,2,1,0,1,0,0,0,1,1,1,1,0,1,0,0,0,1,2,1,0,5,1,1,1,0,1,2,1,4,1,1,0,1,0,1,0,1,1,0,0,2,0,0,2,1,1,0,1,0,2,2,0,0,2,1,3,3,0,2,0,0,4,1,1,0,0,1,0,2,0,0,0,0,1,2,0,0,0,1,1,2,3,0,0,1,2,1,1,2,0,1,2,0,1,2,3,0,0,0,1,0,1,1,4,0,1,1,1,0,0,1,0,2,0,1,2,2,2,3,0,0,2,0,1,0,0,0,0,2,1,3,0,1,4,0,2,0,2,1,2,0,2,0,0,1,1,2,4,2,1,0,0,0,1,0,1,0,1,0,1,0,3,1,0,1,2,1,0,1,1,1,1,1,1,0,1,1,1,3,0,1,1,2,1,2,0,0,0,1,0,2,1,2,2,1,1,1,2,1,2,2,0,2,1,0,2,2,0,0,2,1,1,0,1,2,0,3,2,0,1,0,1,2,0,1,2,2,0,0,0,2,0,0,2,2,1,3,0,1,0,0,2,0,2,0,0,1,1,2,0,1,2,0,1,2,0,0,0,2,1,0,3,1,0,1,1,0,0,2,1,2,0,0,1,0,2,1,1,0,1,2,0,1,1,0,3,0,0,2,1,1,0,1,2,0,1,0,1,1,3,1,2,1,0,1,3,3,0,2,0,1,2,0,2,2,0,0,1,0,1,3,0,0,3,3,2,1,1,0,2,0,1,0,2,0,1,1,1,1,0,2,0,2,1,3,0,0,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1,1,2,4,0,2,3,1,1,1,2,0,0,1,1,2,1,1,0,2,0,0,3,1,2,0,0,1,0,0,5,2,3,0,1,0,1,0,0,0,0,1,1,1,0,0,0,2,2,0,0,0,1,2,0,0,0,0,3,1,0,0,1,2,0,0,1,0,1,1,0,0,0,1,0,1,1,0,0,1,0,0,1,4,0,1,1,0,0,0,3,0,0,0,1,0,1,1,1,1,0,0,2,0,2,0,0,1,0,1,1,1,1,1,0,2,0,0,3,3,0,2,2,2,2,1,2,0,4,0,1,1,0,3,1,2,1,1,0,0,1,0,0,1,4,0,0,1,1,0,0,1,0,1,1,0,0,2,1,0,3,0,2,1,0,0,0,1,2,1,0,1,1,0,2,0,1,0,1,1,2,4,0,1,1,0,3,1,0,2,1,2,2,0,0,3,0,1,1,3,3,1,0,0,1,1,1,2,0,4,3,4,2,2,0,1,2,1,0,1,0,0,0,1,1,1,1,3,0,0,2,1,0,1,1,1,1,1,0,0,1,1,0,1,1,1,1,1,2,2,2,1,0,1,2,2,1,1,0,2,0,0,4,1,2,1,1,1,1,0,0,1,1,1,0,0,1,0,1,0,1,1,1,2,1,0,0,2,2,0,1,0,1,1,0,1,0,4,1,1,1,3,2,0,0,1,1,0,0,1,2,1,0,1,1,4,1,4,0,1,1,1,2,0,1,1,0,1,1,1,2,2,1,1,2,1,0,2,0,2,2,1,1,2,0,2,0,1,1,2,0,4,0,0,0,0,1,0,0,2,0,0,2,2,2,0,1,3,1,0,1,2,0,0,2,0,1,0,0,2,0,1,2,0,1,0,2,0,2,4,2,0,1,0,1,1,0,1,0,1,1,0,0,1,3,0,1,0,2,0,0,2,1,3,0,2,1,1,1,2,2,1,0,2,0,1,1,1,0,0,2,0,0,1,1,3,2,0,0,1,2,2,0,3,2,0,0,3,1,0,1,4,0,0,1,2,2,1,1,4,1,1,0,0,0,0,1,2,0,4,1,4,0,0,2,2,3,0,1,1,1,0,1,2,0,0,1,1,2,2,2,2,0,1,1,3,1,0,1,0,0,1,1,1,1,1,2,0,1,0,0,1,1,1,0,0,3,0,0,0,1,0,0,2,0,1,2,1,4,2,1,0,1,2,3,0,0,0,4,1,0,0,1,2,1,0,1,0,3,0,1,2,2,1,0,0,2,2,0,0,3,1,2,1,0,1,2,2,4,1,0,1,1,1,4,1,3,2,2,4,2,2,0,6,0,0,2,0,1,1,1,0,4,1,1,1,1,1,3,1,1,0,2,2,0,2,1,1,0,0,1,1,0,1,0,0,0,0,1,0,1,1,4,0,0,1,1,1,0,1,1,1,1,1,1,1,2,1,3,1,0,1,1,0,0,1,0,1,0,0,0,0,0,1,0,0,3,2,0,2,0,2,0,2,0,0,3,0,0,3,0,1,1,1,0,4,1,2,0,0,2,2,0,1,0,0,2,2,0,4,0,1,0,1,0,2,1,0,0,3,0,0,0,0,0,0,1,1,0,1,1,0,1,0,1,1,2,1,1,2,1,0,0,0,0,3,0,0,1,1,0,1,3,0,2,1,1,2,1,3,2,0,0,1,3,1,2,0,0,1,0,0,1,1,2,1,1,4,0,2,1,2,0,2,2,0,0,1,1,1,0,1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,0,0,1,1,1,2,1,0,1,0,2,0,2,2,1,1,1,1,2,2,2,0,1,1,0,0,1,0,1,1,1,1,0,2,0,0,0,0,0,1,0,2,0,1,1,1,0,1,0,0,2,0,0,2,1,1,1,1,1,1,0,0,1,2,1,0,0,0,0,2,2,0,2,2,3,0,2,1,3,1,0,1,0,2,1,0,2,4,1,0,2,1,0,2,0,3,1,2,2,1,2,3,2,1,1,1,1,2,0,1,5,4,0,1,1,3,1,2,0,2,0,1,0,1,0,1,0,3,2,0,2,2,0,0,0,1,0,0,1,0,1,2,1,1,1,0,0,0,1,1,0,2,1,1,0,1,0,1,3,3,0,1,0,1,3,1,1,1,0,6,2,0,1,0,0,1,0,1,1,3,3,1,1,0,0,1,2,0,2,0,2,1,2,1,1,1,0,1,2,2,5,1,1,0,0,1,1,0,0,2,1,1,1,0,1,0,1,0,0,2,1,1,1,0,0,0,0,2,0,1,2,2,0,0,0,2,2,1,0,1,0,2,0,1,1,0,1,1,0,0,2,0,1,1,0,1,2,0,1,3,1,0,0,0,0,0,1,1,1,0,2,1,3,0,0,0,1,0,2,0,1,3,4,1,0,3,1,1,0,0,0,2,0,0,1,0,0,1,2,1,2,4,0,0,1,1,1,1,0,0,2,0,3,0,0,0,0,0,1,1,3,2,1,0,1,1,1,0,0,2,2,1,2,1,0,0,3,2,2,0,0,1,0,2,0,1,2,2,3,3,0,0,0,1,0,0,1,0,0,2,0,0,1,0,1,0,1,1,0,0,0,3,2,1,1,0,4,0,0,0,1,1,0,0,1,1,6,0,1,1,0,4,4,2,2,0,1,1,0,1,0,1,1,2,0,1,0,0,0,1,0,1,1,0,0,1,1,1,4,0,0,1,2,1,0,0,2,1,1,1,0,2,1,0,0,0,0,1,1,1,0,1,1,3,0,0,1,0,0,2,2,1,2,1,0,2,2,2,0,3,0,1,1,0,2,0,1,0,1,1,1,0,0,2,1,1,0,1,1,0,2,0,2,2,2,0,0,1,1,1,1,1,2,0,0,3,0,1,2,3,1,0,1,2,0,0,0,1,1,0,2,1,1,2,0,0,0]},{"counters":[1,1,4,0,1,2,1,1,1,2,1,0,2,1,1,0,2,1,1,3,0,1,1,0,0,1,1,0,1,0,1,0,2,1,0,1,3,0,1,1,3,0,0,0,1,1,2,3,0,0,1,4,1,0,1,1,0,0,4,0,2,1,0,0,0,0,0,0,1,3,0,1,0,1,4,0,2,0,0,1,1,1,0,2,0,1,0,0,1,2,1,0,2,0,1,0,0,1,2,0,0,1,1,3,2,0,0,1,4,3,2,1,0,0,1,2,0,0,1,1,1,0,1,0,1,1,0,0,0,2,1,2,0,3,1,2,0,1,1,0,1,0,1,1,2,0,0,0,0,1,0,0,2,2,2,0,1,1,0,1,2,0,3,2,0,1,0,1,1,2,3,0,0,0,0,1,1,1,2,3,3,0,0,2,2,0,1,0,1,0,0,0,1,1,0,1,2,0,1,1,0,0,2,0,0,1,0,2,0,2,1,0,2,2,2,0,0,1,1,0,1,1,1,2,0,1,1,0,0,1,1,1,2,0,1,1,1,1,2,2,1,1,1,0,0,1,1,1,0,3,1,0,1,3,0,1,0,1,1,0,0,0,1,0,1,0,2,4,0,1,1,2,1,1,1,3,3,1,1,0,0,0,1,1,2,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,3,1,0,3,1,0,0,0,0,2,1,0,0,0,1,0,1,1,0,1,2,0,0,1,0,0,1,2,0,1,0,1,0,0,1,1,1,1,0,1,0,2,2,3,2,0,0,1,0,1,2,2,0,3,1,0,0,3,1,1,1,1,1,3,1,1,1,0,2,1,0,0,1,1,0,0,0,0,1,1,0,1,2,0,0,1,0,0,0,0,2,2,1,0,1,1,1,1,0,2,3,0,1,1,1,1,1,0,1,1,2,1,0,0,1,1,1,0,1,1,1,0,4,2,3,0,1,0,0,1,1,0,0,1,3,0,1,1,3,2,0,0,1,1,2,0,0,2,0,3,0,1,3,1,1,1,3,0,1,3,0,1,2,0,3,7,1,2,1,1,1,0,1,2,0,0,1,2,0,1,2,1,0,0,1,0,1,2,2,1,2,0,1,1,0,0,0,1,0,3,1,1,4,1,1,1,2,2,1,2,5,0,1,1,0,0,0,0,0,0,3,2,3,3,0,1,0,1,1,2,1,3,1,2,0,3,0,1,2,2,0,3,2,1,1,0,1,3,1,1,0,2,0,0,0,3,0,0,2,1,0,0,2,1,2,0,1,0,2,2,1,0,1,0,1,1,1,1,3,1,2,1,1,1,2,2,0,1,1,1,1,1,0,0,1,0,0,0,0,0,1,2,1,0,0,1,0,1,1,1,2,3,2,0,0,3,1,2,0,1,0,1,2,1,2,2,0,1,1,0,1,0,3,0,1,1,1,0,1,5,0,0,0,0,1,1,0,1,1,1,2,2,0,0,0,2,0,0,0,1,1,2,0,1,0,1,1,0,1,1,2,1,0,1,1,2,3,1,2,2,0,0,0,1,1,1,2,0,1,1,0,0,2,2,1,0,1,1,1,5,1,2,1,0,2,0,1,0,2,1,0,1,1,0,0,1,1,0,1,0,0,1,1,2,1,3,2,1,2,1,2,0,1,0,0,0,1,1,1,0,2,0,0,2,1,2,1,1,0,0,0,2,1,1,0,2,1,1,0,0,1,0,1,0,3,1,2,1,0,0,3,1,1,1,1,0,2,0,0,1,1,0,0,1,2,0,0,1,1,2,3,3,0,3,0,0,0,2,3,1,0,0,2,2,0,1,2,1,2,1,3,2,1,1,0,1,1,3,2,1,1,0,1,0,0,2,1,2,0,0,0,1,2,0,1,0,2,0,0,1,0,3,1,3,0,3,1,1,3,1,2,0,2,1,0,0,2,0,2,1,1,1,1,0,2,0,4,1,0,0,2,2,1,0,1,0,0,2,2,0,2,3,1,0,0,0,1,0,1,1,0,2,1,1,0,1,0,0,1,0,3,1,0,1,1,0,1,1,0,1,1,2,0,2,0,0,1,1,1,0,1,0,2,2,1,1,2,2,3,1,1,0,0,1,0,1,1,1,1,1,0,2,2,0,1,0,1,1,0,2,0,2,0,0,1,1,0,2,0,2,0,4,0,0,2,0,0,1,3,0,2,1,0,2,0,0,0,3,0,0,0,4,1,2,0,2,0,1,3,0,2,1,3,2,1,2,3,1,1,2,0,1,0,0,0,1,0,0,1,2,1,1,0,3,0,1,0,1,0,0,2,1,1,0,2,1,1,0,3,0,1,0,0,1,0,0,0,1,0,1,1,2,1,2,0,0,0,1,3,2,0,0,0,0,1,0,0,0,0,0,0,1,0,2,0,1,1,2,1,0,2,1,2,1,1,0,0,0,1,1,0,0,0,1,1,2,1,0,0,0,0,1,2,1,0,1,1,1,5,1,3,0,1,3,0,0,0,2,3,1,1,1,2,0,1,0,2,1,1,0,0,0,0,0,0,1,1,0,0,3,0,0,2,1,3,2,1,0,1,1,2,1,1,1,1,0,0,0,1,1,1,0,2,1,1,0,1,1,3,0,3,1,1,0,1,1,0,3,0,1,1,0,1,2,1,3,2,0,4,1,1,2,2,3,1,2,0,1,1,0,2,0,0,0,2,1,1,0,1,0,1,3,0,0,2,1,0,0,3,0,1,0,1,1,0,2,0,1,1,0,1,1,0,1,3,1,2,0,1,1,1,1,1,1,0,1,3,1,0,0,4,1,2,1,0,0,1,0,1,1,0,3,1,1,0,3,4,1,1,6,4,0,0,1,0,2,0,0,1,2,1,2,0,2,0,5,1,2,1,0,1,3,0,1,0,0,1,1,1,0,2,3,3,2,1,0,0,0,0,0,2,1,0,1,1,7,0,2,0,0,0,0,1,0,3,1,2,1,1,0,0,2,0,2,0,2,0,0,2,2,0,0,1,1,1,1,1,0,1,1,1,0,3,0,1,2,1,2,0,1,1,0,2,1,1,0,0,3,1,1,1,0,0,1,0,1,0,1,2,1,1,0,2,0,1,1,2,0,0,0,1,1,0,1,1,0,0,2,1,2,0,1,2,1,0,1,0,0,1,0,1,0,2,1,0,0,0,2,1,1,1,0,1,3,0,2,1,2,1,1,3,0,2,1,0,1,2,2,1,1,0,5,1,1,1,1,2,1,1,1,2,0,0,1,0,0,0,0,0,2,3,1,2,0,0,0,0,0,0,0,0,3,1,0,2,1,2,1,1,0,1,0,3,0,2,0,1,2,4,0,0,0,2,1,1,2,1,0,0,2,1,1,0,0,0,0,0,0,1,0,0,0,0,0,1,2,2,1,1,1,2,0,0,2,0,2,0,2,1,2,1,0,2,0,0,3,2,1,1,1,1,1,2,0,1,1,0,1,1,1,0,0,2,0,1,2,3,1,2,1,2,1,0,3,1,1,3,0,3,0,0,0,0,1,1,0,0,2,1,2,0,2,0,0,0,1,1,1,0,0,3,1,2,1,0,0,1,0,2,2,1,3,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,2,0,1,1,0,2,1,2,0,2,1,2,0,1,0,2,0,1,1,0,1,1,0,1,0,1,1,1,0,0,1,0,0,1,0,1,1,1,1,2,0,2,2,3,3,0,1,0,2,1,0,0,0,1,0,1,0,1,0,3,0,1,1,3,0,0,3,1,1,0,1,0,3,0,0,1,2,0,2,1,1,0,2,1,1,1,1,3,0,2,2,0,0,1,4,0,0,2,0,3,0,1,1,3,2,0,0,1,1,2,0,1,2,2,0,0,0,1,1,0,2,0,4,2,4,0,2,1,0,2,1,0,1,0,2,0,1,0,2,1,0,1,0,1,1,2,0,1,0,1,0,2,2,2,1,2,2,0,2,1,1,0,2,2,2,1,0,0,0,0,2,1,1,1,1,3,2,2,0,0,1,2,4,0,1,0,0,0,0,1,0,1,1,0,2,0,0,3,3,3,0,0,0,0,0,2,1,3,1,2,1,1,0,0,1,0,0,0,0,1,2,2,0,0,1,6,2,1,2,1,2,5,0,2,0,2,1,1,1,0,0,1,2,1,0,0,2,0,2,1,0,1,1,1,1,1,3,1,3,1,0,0,0,1,0,3,0,0,0,3,2,0,2,1,1,1,0,0,1,1,4,0,0,0,1,3,1,2,0,0,5,0,1,3,0,0,0,2,0,2,0,0,0,1,0,0,3,2,0,0,1,3,2,0,0,0,0,1,0,1,1,1,1,2,0,1,3,4,2,2,1,0,0,0,3,1,1,0,0,3,2,3,1,1,5,0,3,0,1,1,2,0,0,0,1,0,0,1,0,2,1,1,0,3,1,1,1,0,1,0,0,0,1,2,2,1,1,2,0,1,0,1,0,1,2,1,1,1,0,3,1,0,0,1,2,1,0,0,1,2,0,1,1,1,1,1,0,1,3,2,0,0,0,1,0,3,1,0,0,4,0,0,2,3,1,1,0,0,1,1,1,0,0,3,0,0,0,2,1,0]},{"counters":[2,0,1,2,0,3,1,1,0,1,4,3,0,0,0,0,0,1,1,0,0,0,0,0,0,2,1,0,1,0,1,0,0,1,1,0,1,0,0,1,0,2,1,0,1,3,0,2,0,0,1,1,1,3,0,3,4,2,1,1,2,1,1,1,1,1,1,1,1,1,1,0,0,2,0,2,1,0,1,1,0,3,1,1,0,0,2,0,0,1,3,0,0,0,3,2,0,2,1,1,2,0,1,2,0,1,0,0,1,0,0,3,2,1,1,1,0,2,2,3,2,0,1,2,0,0,1,4,1,1,2,0,2,3,0,4,2,0,1,2,0,0,1,1,1,1,2,1,0,1,0,1,2,0,1,3,1,1,0,0,1,0,1,2,3,3,0,1,2,0,1,2,3,0,0,1,2,0,1,1,1,0,1,1,0,0,2,2,0,1,0,1,0,1,0,2,1,4,0,0,0,0,1,0,2,4,2,0,1,0,0,1,1,2,0,1,1,3,0,3,0,0,1,2,1,2,1,1,1,5,0,0,0,1,1,1,1,1,0,0,2,1,1,0,2,0,0,1,0,1,1,0,1,1,0,2,4,1,0,1,2,0,0,3,0,4,1,2,4,0,2,0,0,0,0,1,0,0,1,1,1,1,2,3,1,0,1,4,2,1,2,0,3,1,0,1,0,4,0,0,0,1,0,1,0,0,1,2,0,0,3,0,1,3,2,3,0,1,0,0,1,2,0,1,2,1,0,1,0,1,1,1,3,0,1,1,1,1,2,2,1,1,0,1,1,2,0,1,3,0,0,0,0,0,2,1,0,1,2,2,2,0,0,0,1,0,1,0,0,0,2,2,1,0,1,2,3,1,5,1,3,0,3,1,2,0,0,0,0,0,1,0,1,1,1,2,1,0,1,2,3,2,3,0,3,2,0,0,1,0,1,2,0,1,0,2,0,1,0,1,0,0,3,1,1,1,1,0,1,1,3,1,0,1,0,2,1,2,2,0,4,1,1,2,1,4,0,1,0,2,0,2,2,0,1,2,0,0,0,1,1,2,1,0,1,1,3,0,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,0,1,2,0,2,2,0,1,2,1,1,2,1,1,1,0,0,0,0,0,2,0,1,2,3,2,1,0,1,2,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,1,0,2,3,0,0,1,1,1,2,2,0,2,1,1,1,4,1,0,1,0,0,2,1,0,0,2,1,0,3,1,1,1,2,0,1,1,2,1,1,0,2,0,0,3,0,0,1,1,0,0,4,0,0,0,0,0,2,1,1,0,1,1,2,1,0,1,1,1,3,2,0,1,1,1,0,0,3,1,3,1,1,1,0,0,0,0,1,2,1,1,0,1,1,1,0,1,2,0,2,2,1,1,1,2,0,0,0,1,1,2,2,2,2,3,0,1,3,0,3,0,1,1,0,2,1,2,1,0,1,3,2,2,1,0,2,0,1,1,0,0,0,3,2,1,1,2,2,0,2,1,0,2,2,0,3,0,3,0,1,0,1,2,0,1,1,0,1,0,1,3,1,0,1,0,0,0,2,2,0,2,2,0,0,4,0,0,3,1,1,0,1,2,0,0,2,0,0,1,2,1,0,2,1,1,1,0,2,1,0,1,1,0,0,3,0,0,1,2,0,1,4,0,5,0,1,1,0,3,0,0,1,0,0,1,2,1,0,0,1,2,1,1,2,3,1,2,1,0,1,2,0,1,2,2,0,2,1,0,0,0,1,0,1,0,2,0,2,2,3,1,0,0,3,2,0,0,0,3,0,0,2,0,0,2,1,0,1,1,0,1,2,0,1,1,3,1,1,0,5,0,0,2,0,0,1,1,1,1,0,0,0,1,0,0,3,3,2,1,0,1,0,0,1,1,1,1,0,1,0,0,1,0,1,3,3,0,1,2,0,1,0,0,0,2,0,1,1,0,0,0,0,2,1,1,1,3,0,0,1,0,0,2,0,2,0,1,0,2,1,1,2,2,1,2,0,1,0,3,1,1,1,1,0,0,1,0,3,2,2,0,1,2,0,2,0,0,0,2,0,0,1,1,0,0,0,1,0,1,0,2,0,0,1,1,3,0,1,1,6,3,1,2,2,2,0,1,1,0,3,1,2,3,1,1,1,1,4,0,1,1,2,1,3,1,1,1,1,3,3,0,0,0,0,1,1,0,3,1,0,3,0,3,1,1,0,2,0,3,0,1,0,3,1,2,0,0,3,1,1,1,2,0,1,0,1,0,0,5,1,0,3,1,0,2,3,0,0,3,1,0,0,1,0,0,0,2,0,0,0,1,0,1,0,0,2,1,1,1,0,0,0,0,6,0,1,0,1,1,2,2,2,3,1,0,1,0,1,0,1,0,0,0,2,4,0,3,1,1,0,1,2,0,2,0,2,2,1,3,0,2,0,0,0,0,1,1,0,0,1,0,0,1,1,2,0,0,2,3,0,0,1,1,0,0,0,1,1,0,0,1,1,3,2,3,2,4,1,2,2,1,1,0,3,0,0,0,0,0,1,1,0,1,0,3,2,2,2,0,1,0,0,5,1,0,1,1,2,0,2,0,0,1,1,0,0,0,1,0,1,1,1,0,0,1,2,1,1,1,0,2,1,2,1,0,2,1,0,2,0,0,0,0,1,0,0,0,0,0,2,2,1,1,1,5,2,1,1,2,1,2,1,0,0,0,2,0,1,3,1,0,1,0,0,1,0,0,1,0,0,0,0,1,0,2,3,0,1,1,1,1,1,1,1,0,2,1,3,1,0,2,1,0,1,0,0,1,0,0,1,1,1,2,1,0,1,0,0,1,0,0,1,2,2,0,0,0,0,1,0,4,0,4,0,1,1,1,1,1,0,0,2,0,2,3,2,2,0,0,0,0,1,0,0,2,0,0,1,0,0,2,0,0,1,2,0,0,1,0,3,1,2,1,2,0,2,0,0,1,0,2,1,0,0,1,0,0,1,0,0,1,0,1,2,2,0,0,1,1,1,1,0,1,2,3,1,1,1,0,4,1,1,2,1,1,0,1,1,0,1,3,1,1,1,1,0,3,1,3,1,0,0,0,1,0,0,0,0,2,0,0,1,1,2,1,3,1,1,2,1,0,0,1,2,1,1,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,3,1,1,1,2,1,0,1,0,1,0,0,1,0,0,1,0,0,1,0,1,2,1,1,1,1,0,0,1,1,1,1,3,2,0,1,0,1,1,1,0,2,0,0,0,0,1,0,2,1,0,0,2,2,2,4,0,1,0,0,1,2,4,1,0,1,0,0,1,2,1,2,1,1,4,2,0,0,0,0,0,1,0,0,4,0,1,2,0,0,1,2,3,1,0,2,4,2,1,0,2,1,2,0,3,2,1,1,0,0,1,1,1,0,0,1,0,1,1,1,3,0,1,0,0,1,1,2,3,1,2,1,0,4,0,0,0,0,0,0,1,0,1,0,0,1,1,0,0,2,0,2,2,1,2,3,0,1,1,0,2,1,0,2,2,1,2,2,2,0,0,2,1,0,1,0,2,1,1,2,2,3,2,1,0,0,1,0,0,0,2,0,1,3,4,2,3,1,0,0,2,2,2,2,2,0,0,2,1,0,1,1,0,0,0,2,0,2,1,0,1,1,0,0,0,1,1,0,1,2,3,1,2,1,0,0,1,2,2,5,2,0,0,1,1,2,0,0,1,0,0,2,0,2,0,0,1,1,0,1,0,1,0,2,1,1,0,4,1,0,0,0,1,3,1,1,0,2,0,4,4,1,3,1,2,2,0,2,3,2,0,1,2,0,2,0,1,2,2,0,0,1,0,0,1,0,4,1,0,2,0,0,0,1,1,1,0,1,0,0,0,0,0,3,2,1,2,3,2,0,1,3,2,1,0,2,1,1,1,1,2,2,0,3,1,1,1,0,0,0,0,1,0,0,0,3,0,1,2,0,2,0,1,0,1,0,0,3,1,0,2,1,2,1,3,2,1,0,1,1,2,1,1,1,1,2,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,1,2,2,0,2,0,1,1,1,1,1,1,0,1,1,1,2,3,0,0,0,1,4,0,0,0,0,1,0,1,2,2,0,2,1,2,0,1,3,1,1,2,1,1,1,0,1,3,1,1,2,0,1,0,0,1,0,2,1,1,2,1,1,0,0,0,0,0,0,0,1,2,0,0,0,0,0,0,0,4,0,1,0,0,0,1,0,1,0,1,2,0,1,0,0,2,1,2,0,3,1,1,1,0,1,0,0,0,0,3,0,3,0,0,1,1,1,1,0,2,1,2,1,0,1,0,1,0,3,0,1,1,0,0,0,0,2,0,0,0,2,0,0,0,1,1,0,1,0,0,1,0,4,0,1,0,3,0,0,1,2,1,1,2,2,0,1,0,0,1,0,1,1,2,1,1,1,1,0,0,2,0,1,1,3,0,2,0,0,2,0,1,2,0,0,0,2,2,2,1,1,2,0,2,3,1,1,0,1,1,0,1,0,1,0,2,2,0,0,1,2,3,1,1,0]},{"counters":[0,1,3,1,1,0,0,0,0,1,0,4,1,1,1,0,2,1,1,0,0,1,0,0,1,0,0,0,0,0,1,2,0,0,1,0,0,0,0,1,1,0,1,0,0,0,1,3,1,1,2,0,1,2,3,1,1,0,1,3,3,0,0,0,3,2,1,0,0,0,2,0,0,0,1,0,1,0,1,1,2,1,3,3,0,1,3,2,2,3,0,0,2,1,1,1,2,0,0,2,2,2,1,0,0,0,2,0,0,2,1,2,1,2,3,0,1,1,0,2,0,0,2,2,0,1,1,2,0,1,0,1,1,1,2,1,0,0,1,1,2,0,2,0,0,1,0,5,1,0,1,1,3,5,1,0,1,0,0,2,1,1,0,3,2,1,0,1,0,2,0,0,2,1,3,1,2,0,0,3,0,0,0,2,0,0,2,0,0,0,0,1,0,2,1,2,3,0,1,0,0,1,0,0,0,0,0,1,1,1,3,2,1,0,1,2,1,2,3,1,1,0,1,0,1,0,0,1,1,0,2,0,0,2,2,0,2,1,0,0,0,3,2,0,2,0,2,1,1,3,0,1,0,2,3,2,2,3,1,0,0,0,1,1,0,1,0,0,1,1,0,0,0,2,0,0,1,1,3,0,1,0,0,1,1,0,1,2,0,2,1,4,3,2,1,1,0,2,0,0,2,0,0,1,1,0,1,2,2,4,1,0,0,2,0,1,1,1,1,2,0,1,0,1,2,1,1,0,1,0,1,2,0,1,2,0,0,1,0,2,1,2,0,0,0,0,0,0,0,1,1,0,1,1,2,0,2,2,1,0,2,1,0,0,0,0,0,0,2,0,1,0,1,1,0,4,3,0,0,1,2,1,2,1,2,0,1,0,1,0,1,0,1,1,0,1,1,1,0,3,2,0,1,0,2,0,0,2,1,1,2,0,1,0,0,0,2,2,0,1,1,0,0,0,0,2,3,1,1,1,0,0,0,0,2,0,3,1,1,0,0,1,1,0,1,0,0,3,0,1,3,0,1,0,0,0,0,0,0,0,0,1,1,0,2,1,2,0,0,2,0,0,0,2,1,1,1,2,2,3,2,2,1,1,1,0,0,1,0,1,0,1,0,2,2,0,0,0,0,0,0,0,0,1,2,1,1,0,0,2,0,1,0,1,2,0,2,0,1,0,0,1,0,2,0,1,3,1,1,1,1,1,1,1,2,1,2,0,3,1,1,0,3,2,2,1,1,1,1,3,0,1,1,0,2,2,0,1,1,1,0,0,1,1,2,1,0,1,1,2,2,1,0,1,1,3,1,1,2,0,0,1,1,1,3,1,2,1,1,1,1,1,0,1,0,2,1,1,2,1,3,0,0,0,0,0,1,0,2,0,0,1,1,2,0,3,1,1,0,2,0,1,0,0,0,1,0,0,4,0,2,2,2,1,2,1,1,1,1,1,1,0,1,1,3,3,1,2,1,3,0,0,1,1,2,1,2,0,0,1,1,2,2,0,0,0,1,1,1,1,0,2,1,1,1,1,3,3,1,2,1,3,0,2,1,2,1,0,1,1,1,0,0,2,3,1,1,1,0,1,0,0,2,1,0,2,1,3,2,0,1,0,0,2,1,0,1,2,0,1,1,2,2,1,1,2,1,1,1,1,1,0,3,1,0,1,0,2,1,1,1,1,2,1,1,1,0,0,1,1,1,2,0,1,2,1,1,2,0,0,2,1,0,1,1,1,3,1,2,0,0,4,0,2,0,0,2,1,2,0,1,0,0,0,1,3,1,0,0,0,1,2,1,0,1,0,0,2,0,3,0,0,0,2,1,0,1,1,2,2,1,2,1,2,0,3,1,0,1,1,1,2,1,0,0,2,0,0,1,1,0,1,0,0,1,2,2,2,1,2,1,3,3,1,1,0,0,1,2,2,2,0,0,0,1,1,3,3,2,1,0,3,2,0,1,0,1,0,1,1,1,1,1,1,2,1,2,0,0,4,0,3,4,0,2,1,1,0,0,1,5,1,0,1,1,1,0,2,1,1,2,1,3,2,1,1,0,0,1,2,1,2,0,0,3,2,1,0,1,1,0,0,1,2,0,0,0,1,0,2,0,1,2,0,0,0,1,1,0,2,0,1,2,1,0,0,2,1,1,2,2,1,0,1,2,1,0,1,2,1,4,0,3,0,1,1,0,0,0,2,1,1,1,0,1,2,0,0,0,2,0,1,0,1,1,0,0,0,1,0,1,1,1,0,1,2,0,2,2,1,2,0,0,1,1,2,0,3,4,1,3,2,0,0,0,1,0,1,1,1,1,0,1,1,3,3,2,1,2,0,1,0,0,2,0,0,2,0,0,0,2,2,3,1,0,1,2,1,1,0,1,2,0,1,0,1,2,0,4,0,1,0,0,3,2,0,2,0,0,0,1,1,1,1,1,1,0,0,2,0,1,0,0,0,1,1,1,0,0,0,2,0,0,3,0,0,0,2,1,1,1,0,1,1,2,1,2,1,0,1,0,1,2,1,2,2,1,2,1,1,1,0,1,0,2,1,0,1,0,1,3,1,1,0,0,2,2,1,0,4,2,0,1,0,0,0,1,0,1,1,3,0,1,1,0,1,0,0,2,2,1,2,3,1,1,0,1,0,0,4,1,1,1,0,4,1,1,3,2,1,0,1,1,0,0,1,3,1,1,2,1,3,0,1,0,4,0,1,2,0,1,1,1,1,0,2,0,0,1,2,1,1,0,2,0,0,2,0,1,0,0,1,0,2,0,1,1,2,0,0,0,1,1,0,1,0,0,2,1,5,1,2,2,1,1,0,2,2,2,0,1,2,2,0,1,1,0,2,0,0,2,1,2,1,1,0,2,1,1,2,0,0,0,2,1,0,2,4,0,1,0,0,1,1,2,1,2,0,0,1,0,3,0,3,1,0,1,2,0,0,1,0,2,1,3,1,3,1,1,0,7,0,3,1,1,0,0,0,0,1,0,1,1,1,0,0,2,0,1,1,1,2,0,0,0,2,3,0,1,0,0,1,1,1,0,1,1,1,0,1,0,3,0,2,0,0,3,1,2,1,2,1,1,0,1,0,1,0,1,1,0,1,1,2,1,1,0,1,1,1,1,2,1,4,1,0,0,0,3,0,3,2,1,0,0,2,0,3,2,0,4,0,3,1,0,1,1,1,3,1,1,1,0,1,1,0,1,2,0,1,1,2,0,0,1,0,1,0,0,0,0,0,1,1,0,1,0,1,0,0,1,1,1,1,0,1,0,3,1,0,0,3,0,0,1,2,2,1,0,1,0,1,0,0,0,2,0,2,0,2,1,4,2,1,1,2,1,4,0,0,0,0,0,0,1,2,1,1,1,1,2,0,2,2,0,0,2,3,0,0,1,1,1,2,1,2,2,0,1,0,0,1,1,2,1,0,1,3,0,0,1,0,0,1,1,1,0,1,1,0,1,0,0,1,2,0,1,1,0,1,1,3,0,0,1,0,1,1,3,1,1,1,2,1,1,1,0,2,2,0,1,2,1,3,1,2,2,0,3,0,1,1,2,1,1,0,1,1,2,1,2,2,0,1,0,1,3,1,1,1,2,1,0,1,1,0,2,0,0,0,0,0,1,1,0,5,3,5,2,0,0,0,2,0,2,1,0,1,2,1,1,2,1,0,0,2,0,0,3,1,3,4,1,0,2,0,4,1,0,1,1,1,1,0,1,1,1,2,0,0,0,1,0,0,1,1,1,3,1,2,0,2,1,1,0,1,1,2,1,1,0,1,2,1,2,0,1,0,0,1,3,1,0,1,1,2,0,0,0,2,0,1,2,2,0,0,0,0,2,1,3,1,2,0,0,2,0,0,1,0,0,0,1,1,0,0,1,0,3,1,1,0,0,1,0,1,1,1,0,2,0,0,2,0,2,2,1,2,2,0,0,1,0,1,1,0,2,1,3,0,0,2,1,0,1,0,0,3,1,1,0,2,1,0,1,0,1,0,1,3,0,0,1,2,1,1,5,1,1,0,0,3,1,3,4,2,1,3,0,0,0,0,1,3,1,2,1,1,0,0,0,2,0,1,0,1,0,2,0,1,0,1,0,1,2,0,0,2,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,1,0,1,0,1,1,1,1,1,0,0,0,2,1,0,2,1,2,2,0,0,2,1,1,1,0,3,2,3,1,2,1,2,0,0,0,0,2,0,1,2,1,1,2,0,1,0,3,1,2,2,2,1,1,2,1,0,2,1,3,2,1,2,0,1,0,0,0,1,0,1,2,2,0,1,1,2,3,1,2,1,1,3,1,0,0,1,2,3,2,0,0,2,0,1,3,1,2,0,2,0,0,2,0,2,0,1,0,0,1,0,2,3,1,1,0,1,3,0,0,1,1,2,2,1,1,2,0,1,1,0,2,2,0,0,0,2,0,0,0,0,5,0,0,1,4,1,0,1,1,0,1,0,1,0,2,0,1,1,0,0,0,1,0,2,2,0,0,1,0,2,0,0,1,1,1,1,1,0,1,0,0,2,1,0,0,0,0,2,1,2,0,1,3,0,1,3,1,0,0,0,0,2,1,0,2,0,0,0,1,1,1,1,1]},{"counters":[0,1,0,1,0,0,2,0,3,2,2,1,1,1,1,1,1,0,0,3,0,0,0,2,0,2,3,1,1,0,1,0,2,1,1,1,0,0,1,2,0,0,2,1,2,1,3,0,0,1,2,1,2,1,1,1,0,1,1,1,1,0,0,2,1,0,0,0,2,0,2,2,2,0,1,0,2,1,4,1,0,3,0,0,0,2,1,0,1,1,5,0,1,1,1,2,2,2,1,4,0,2,1,1,2,1,1,0,1,1,2,2,2,1,0,1,3,2,1,1,0,2,1,3,0,1,3,5,0,2,2,1,2,0,2,1,0,0,1,1,0,0,0,0,0,1,1,1,0,0,1,0,2,1,0,3,0,1,1,0,0,4,1,0,2,1,2,1,0,0,0,1,0,0,2,0,2,1,0,1,0,0,0,0,0,2,1,0,0,0,0,1,0,1,1,0,1,2,0,3,1,0,2,0,1,1,1,0,3,2,1,2,2,0,3,2,2,2,1,1,1,0,1,0,0,1,2,2,1,1,2,0,0,0,0,2,0,2,2,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,2,0,0,1,0,0,1,0,0,1,0,4,1,1,1,0,1,0,3,0,0,0,0,1,0,3,0,1,3,0,1,2,0,0,1,2,0,2,1,2,0,0,2,3,0,1,3,2,3,1,1,5,1,1,1,0,0,0,1,0,1,2,2,1,1,1,2,2,1,1,1,0,0,2,0,0,0,4,1,2,1,0,1,1,0,1,1,0,1,0,1,0,1,1,1,0,0,0,2,1,2,3,0,1,3,3,0,1,2,4,2,0,1,1,1,1,1,1,1,1,1,3,0,1,0,2,0,0,0,2,1,2,0,2,1,1,0,1,1,2,2,1,1,0,2,2,0,2,0,1,1,0,2,0,3,1,1,1,4,2,0,2,1,0,1,3,0,1,1,1,1,4,0,0,2,0,1,2,2,0,1,0,0,1,0,0,1,3,0,0,0,0,0,2,0,1,0,0,0,1,1,4,1,2,2,0,3,0,0,2,2,0,2,1,1,1,2,0,0,1,1,1,2,0,0,2,2,0,1,1,1,1,1,1,1,2,1,0,1,2,0,2,2,1,0,0,0,1,0,1,0,1,2,0,1,1,3,2,1,2,2,2,1,4,1,1,1,1,0,2,2,1,1,0,1,1,0,1,0,2,2,1,3,2,1,4,2,2,1,2,0,1,2,1,0,0,2,1,0,0,3,2,0,3,0,0,1,1,1,4,1,2,1,1,0,1,5,0,1,0,0,1,1,1,0,2,2,3,3,0,1,0,3,0,1,0,0,1,1,1,0,1,1,1,0,0,0,1,1,1,0,1,1,0,2,0,1,1,0,0,1,2,1,3,0,0,2,2,1,1,3,2,0,2,0,1,1,2,2,2,0,1,1,2,1,1,1,0,2,2,0,0,0,0,0,0,0,3,0,0,1,0,0,0,2,2,1,0,0,0,1,1,1,1,0,0,2,2,1,1,0,1,5,0,0,1,0,1,0,1,1,0,0,2,0,2,1,1,0,0,0,1,1,0,2,2,1,1,2,1,1,2,0,1,1,0,1,1,1,2,1,0,0,0,1,0,0,3,1,0,2,1,1,1,5,1,0,3,2,1,0,2,1,1,0,1,0,0,0,0,1,1,1,1,2,2,1,1,1,1,1,0,0,0,4,1,1,1,1,0,0,2,1,2,2,0,0,2,1,0,2,2,1,2,1,1,1,1,1,0,2,1,1,3,3,1,1,1,1,2,0,1,0,2,0,2,1,0,0,0,0,0,0,0,1,1,0,2,0,1,2,1,1,2,2,0,0,3,0,1,1,0,0,0,0,0,1,2,1,2,1,1,2,1,2,0,2,2,1,4,0,0,0,1,4,2,1,0,0,0,2,0,1,1,0,1,1,0,1,1,1,0,2,0,1,1,2,0,1,2,0,2,2,0,2,3,0,0,1,1,0,1,1,0,0,0,1,2,2,1,2,2,0,2,0,1,0,2,1,1,2,0,0,0,1,1,0,2,1,2,0,1,0,0,0,0,0,4,2,1,4,2,1,0,0,0,0,2,1,1,0,0,1,0,1,0,2,0,0,1,0,0,1,0,1,1,0,3,1,0,3,0,0,2,1,5,3,0,0,0,1,2,1,0,2,1,0,2,0,1,0,2,1,0,2,0,1,1,0,2,0,0,1,1,0,0,2,0,0,2,1,0,0,1,0,1,1,2,1,1,0,3,0,4,2,1,1,1,0,4,2,0,1,2,1,1,0,1,3,0,2,0,1,0,0,3,3,1,0,0,1,1,1,1,1,3,2,1,1,0,2,1,0,1,3,0,4,0,0,2,0,2,1,1,0,2,1,0,1,1,0,2,0,0,1,2,0,3,2,3,0,0,0,1,2,0,0,1,0,0,1,0,3,1,1,2,4,0,1,2,0,0,0,2,2,0,0,2,2,1,0,0,1,2,1,1,1,2,0,1,0,3,1,2,2,3,1,1,0,0,0,0,1,2,0,2,0,2,3,0,0,1,0,0,0,0,4,1,1,1,0,2,0,1,2,0,0,1,4,1,2,0,0,0,0,1,0,0,0,4,3,1,0,2,2,0,0,2,0,0,3,0,1,1,0,1,0,1,1,4,0,0,0,1,0,2,0,2,3,0,0,2,0,0,1,0,0,0,0,1,2,1,0,0,0,1,2,0,0,2,3,2,0,1,2,0,0,0,1,0,0,1,1,2,0,0,1,1,1,0,2,1,0,0,0,1,2,1,2,1,1,2,2,1,1,0,0,0,0,0,1,1,1,2,1,0,2,2,0,2,2,0,2,3,1,0,0,1,1,2,1,1,2,1,2,1,1,1,3,1,0,0,1,1,1,2,1,0,1,1,1,1,0,1,5,1,1,1,2,0,0,2,1,0,0,0,0,2,1,0,0,0,2,0,2,1,1,0,2,2,2,3,3,0,0,1,1,1,2,4,1,1,0,2,0,2,2,1,0,0,1,0,1,1,3,5,2,0,1,0,1,1,1,1,0,2,1,2,3,0,0,1,0,0,2,1,3,1,1,1,0,0,0,2,5,0,1,1,0,2,1,0,0,1,0,1,2,0,0,0,0,1,1,2,2,1,2,3,0,1,3,1,2,0,0,2,0,0,1,1,2,1,1,0,0,0,1,1,1,0,1,0,3,0,1,1,0,1,0,2,0,3,1,2,1,0,0,1,0,1,2,1,0,1,0,1,3,3,0,2,1,1,0,3,0,1,3,0,1,0,2,1,2,1,0,1,1,1,3,0,2,1,1,1,0,1,2,2,0,3,0,2,0,0,0,0,0,3,0,0,1,1,2,1,1,0,2,0,2,1,1,1,1,1,0,2,1,1,2,1,1,0,1,0,1,2,2,0,1,1,0,0,1,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,3,1,1,1,4,1,0,0,2,0,2,0,1,0,3,1,0,1,0,3,0,0,2,1,1,0,1,1,0,1,0,2,0,1,1,1,0,0,1,0,2,2,2,1,0,1,0,1,1,0,1,1,3,2,2,1,0,0,4,2,0,0,0,1,1,2,1,2,3,0,1,0,0,1,1,0,0,0,0,2,0,1,1,0,1,1,0,1,1,0,2,0,0,2,0,0,3,2,1,3,1,0,1,1,3,1,1,0,0,1,1,0,0,2,0,2,1,1,1,1,0,1,1,1,1,0,2,2,1,1,0,1,0,0,1,1,2,1,0,0,1,0,2,0,1,0,1,1,1,0,0,0,2,0,0,0,1,1,0,0,1,0,2,0,1,1,1,0,0,0,1,1,0,1,1,0,0,0,2,1,0,0,1,2,0,1,2,2,3,1,0,0,1,0,1,2,0,3,1,3,1,0,0,0,1,1,1,3,1,0,0,3,0,0,1,0,1,0,2,0,2,2,0,0,0,0,1,3,5,3,0,0,2,0,2,2,0,1,0,2,0,0,3,1,2,1,2,0,2,2,2,1,0,5,1,1,1,2,0,0,0,3,1,1,0,0,2,1,2,2,1,0,1,2,2,2,0,1,0,0,1,2,0,2,0,0,0,0,1,1,2,1,0,1,1,0,0,2,1,0,0,1,1,0,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,0,0,1,3,0,0,2,1,1,1,4,0,1,1,0,3,2,2,1,2,1,0,1,0,0,0,1,0,0,0,2,0,3,1,0,0,3,2,1,0,1,2,2,1,0,1,0,0,1,1,0,1,1,1,0,1,3,1,3,2,0,2,1,0,1,1,1,0,1,0,2,0,0,2,1,0,1,2,2,0,0,1,4,0,1,1,0,0,0,0,2,1,1,0,0,1,0,1,1,1,1,1,2,1,1,2,3,0,0,0,1,0,2,0,0,1,0,2,1,1,0,2,2,0,1,1,0,0,0,0,4,1,0,0,0,3,1,0,0,0,1,2,1,0,0,0,2,2,2,3,1,0,1,2,1,0,1,1,0,2,1,0,0,0,0,1,2,0,2,1,1,0,0,2,2,0,1,2,3,1,1,0]}]},"null_count":0,"last_update_version":397952033299103744},"pt":{"histogram":{"ndv":2,"buckets":[{"count":949,"lower_bound":"YW5kcm9pZA==","upper_bound":"YW5kcm9pZA==","repeats":475},{"count":1999,"lower_bound":"aW9z","upper_bound":"aW9z","repeats":525}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,983,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"last_update_version":397952032398901248}},"indices":{"icd":{"histogram":{"ndv":1932,"buckets":[{"count":8,"lower_bound":"A4AAAAAAAAPuBBmfRgAAAAAA","upper_bound":"A4AAAAAAAAQYBBme2AAAAAAA","repeats":1},{"count":16,"lower_bound":"A4AAAAAAAAQYBBmfEgAAAAAA","upper_bound":"A4AAAAAAAAQ+BBmhKAAAAAAA","repeats":1},{"count":24,"lower_bound":"A4AAAAAAAARABBmfKAAAAAAA","upper_bound":"A4AAAAAAAARbBBmhqgAAAAAA","repeats":1},{"count":32,"lower_bound":"A4AAAAAAAAReBBmgYAAAAAAA","upper_bound":"A4AAAAAAAASOBBmheAAAAAAA","repeats":1},{"count":40,"lower_bound":"A4AAAAAAAASRBBmgbgAAAAAA","upper_bound":"A4AAAAAAAASlBBmgcgAAAAAA","repeats":1},{"count":48,"lower_bound":"A4AAAAAAAASnBBmglgAAAAAA","upper_bound":"A4AAAAAAAATABBmg2gAAAAAA","repeats":1},{"count":56,"lower_bound":"A4AAAAAAAATDBBmgMAAAAAAA","upper_bound":"A4AAAAAAAATXBBmfLgAAAAAA","repeats":1},{"count":64,"lower_bound":"A4AAAAAAAATgBBmgdAAAAAAA","upper_bound":"A4AAAAAAAAT7BBmgiAAAAAAA","repeats":1},{"count":72,"lower_bound":"A4AAAAAAAAUDBBmgxgAAAAAA","upper_bound":"A4AAAAAAAAUTBBmfIgAAAAAA","repeats":1},{"count":81,"lower_bound":"A4AAAAAAAAUYBBmgNgAAAAAA","upper_bound":"A4AAAAAAAAUiBBmhNgAAAAAA","repeats":1},{"count":89,"lower_bound":"A4AAAAAAAAUlBBmhHgAAAAAA","upper_bound":"A4AAAAAAAAUyBBmfbgAAAAAA","repeats":1},{"count":97,"lower_bound":"A4AAAAAAAAUyBBmf3gAAAAAA","upper_bound":"A4AAAAAAAAU9BBmgEgAAAAAA","repeats":1},{"count":105,"lower_bound":"A4AAAAAAAAVEBBmfZAAAAAAA","upper_bound":"A4AAAAAAAAVJBBmfkAAAAAAA","repeats":1},{"count":113,"lower_bound":"A4AAAAAAAAVJBBmhiAAAAAAA","upper_bound":"A4AAAAAAAAVbBBmhiAAAAAAA","repeats":1},{"count":121,"lower_bound":"A4AAAAAAAAVcBBmgEgAAAAAA","upper_bound":"A4AAAAAAAAVkBBmgTAAAAAAA","repeats":1},{"count":129,"lower_bound":"A4AAAAAAAAVlBBmgrgAAAAAA","upper_bound":"A4AAAAAAAAV2BBmfFgAAAAAA","repeats":1},{"count":137,"lower_bound":"A4AAAAAAAAV2BBmfSAAAAAAA","upper_bound":"A4AAAAAAAAWFBBmheAAAAAAA","repeats":1},{"count":145,"lower_bound":"A4AAAAAAAAWHBBmgpAAAAAAA","upper_bound":"A4AAAAAAAAWYBBmfDAAAAAAA","repeats":1},{"count":153,"lower_bound":"A4AAAAAAAAWcBBmgAgAAAAAA","upper_bound":"A4AAAAAAAAWqBBmgqgAAAAAA","repeats":1},{"count":161,"lower_bound":"A4AAAAAAAAWwBBmhqgAAAAAA","upper_bound":"A4AAAAAAAAXEBBmgbAAAAAAA","repeats":1},{"count":169,"lower_bound":"A4AAAAAAAAXEBBmg+AAAAAAA","upper_bound":"A4AAAAAAAAXNBBmhCAAAAAAA","repeats":1},{"count":177,"lower_bound":"A4AAAAAAAAXQBBmfNgAAAAAA","upper_bound":"A4AAAAAAAAXfBBmgUgAAAAAA","repeats":1},{"count":185,"lower_bound":"A4AAAAAAAAXhBBmgjgAAAAAA","upper_bound":"A4AAAAAAAAXsBBmgHAAAAAAA","repeats":1},{"count":193,"lower_bound":"A4AAAAAAAAXsBBmhbAAAAAAA","upper_bound":"A4AAAAAAAAX+BBmfjAAAAAAA","repeats":1},{"count":201,"lower_bound":"A4AAAAAAAAX+BBmgZgAAAAAA","upper_bound":"A4AAAAAAAAYTBBmhKAAAAAAA","repeats":1},{"count":209,"lower_bound":"A4AAAAAAAAYUBBmg5gAAAAAA","upper_bound":"A4AAAAAAAAYlBBmgLAAAAAAA","repeats":1},{"count":217,"lower_bound":"A4AAAAAAAAYmBBmhFAAAAAAA","upper_bound":"A4AAAAAAAAY+BBmhGgAAAAAA","repeats":1},{"count":225,"lower_bound":"A4AAAAAAAAY/BBmfkgAAAAAA","upper_bound":"A4AAAAAAAAZTBBmhXgAAAAAA","repeats":1},{"count":233,"lower_bound":"A4AAAAAAAAZVBBmfngAAAAAA","upper_bound":"A4AAAAAAAAZeBBmhbAAAAAAA","repeats":1},{"count":241,"lower_bound":"A4AAAAAAAAZhBBmf3gAAAAAA","upper_bound":"A4AAAAAAAAZzBBmexgAAAAAA","repeats":1},{"count":249,"lower_bound":"A4AAAAAAAAZzBBmfCAAAAAAA","upper_bound":"A4AAAAAAAAZ6BBmgVAAAAAAA","repeats":1},{"count":257,"lower_bound":"A4AAAAAAAAZ/BBmhmAAAAAAA","upper_bound":"A4AAAAAAAAaLBBme3AAAAAAA","repeats":1},{"count":265,"lower_bound":"A4AAAAAAAAaLBBme4gAAAAAA","upper_bound":"A4AAAAAAAAaSBBmgcgAAAAAA","repeats":1},{"count":273,"lower_bound":"A4AAAAAAAAaTBBmgngAAAAAA","upper_bound":"A4AAAAAAAAaeBBme+AAAAAAA","repeats":1},{"count":281,"lower_bound":"A4AAAAAAAAafBBmhHAAAAAAA","upper_bound":"A4AAAAAAAAapBBmgigAAAAAA","repeats":1},{"count":289,"lower_bound":"A4AAAAAAAAapBBmhLgAAAAAA","upper_bound":"A4AAAAAAAAayBBmgogAAAAAA","repeats":1},{"count":297,"lower_bound":"A4AAAAAAAAa2BBmhqgAAAAAA","upper_bound":"A4AAAAAAAAbHBBmgsgAAAAAA","repeats":1},{"count":305,"lower_bound":"A4AAAAAAAAbJBBmhpgAAAAAA","upper_bound":"A4AAAAAAAAbWBBmhHgAAAAAA","repeats":1},{"count":313,"lower_bound":"A4AAAAAAAAbYBBmg0AAAAAAA","upper_bound":"A4AAAAAAAAblBBmfGAAAAAAA","repeats":1},{"count":321,"lower_bound":"A4AAAAAAAAblBBmhGgAAAAAA","upper_bound":"A4AAAAAAAAcHBBmeyAAAAAAA","repeats":1},{"count":329,"lower_bound":"A4AAAAAAAAcIBBmfKgAAAAAA","upper_bound":"A4AAAAAAAAcTBBmfyAAAAAAA","repeats":1},{"count":337,"lower_bound":"A4AAAAAAAAcTBBmgbAAAAAAA","upper_bound":"A4AAAAAAAAckBBmg6AAAAAAA","repeats":1},{"count":345,"lower_bound":"A4AAAAAAAAcpBBmhaAAAAAAA","upper_bound":"A4AAAAAAAAcvBBmgzgAAAAAA","repeats":1},{"count":353,"lower_bound":"A4AAAAAAAAczBBmgIAAAAAAA","upper_bound":"A4AAAAAAAAdIBBmg5AAAAAAA","repeats":1},{"count":361,"lower_bound":"A4AAAAAAAAdKBBmf4AAAAAAA","upper_bound":"A4AAAAAAAAdbBBmhlAAAAAAA","repeats":1},{"count":369,"lower_bound":"A4AAAAAAAAdcBBmgCAAAAAAA","upper_bound":"A4AAAAAAAAdnBBmfzgAAAAAA","repeats":1},{"count":377,"lower_bound":"A4AAAAAAAAdoBBmfuAAAAAAA","upper_bound":"A4AAAAAAAAd1BBmhqgAAAAAA","repeats":1},{"count":385,"lower_bound":"A4AAAAAAAAd2BBmgCAAAAAAA","upper_bound":"A4AAAAAAAAeBBBmfYAAAAAAA","repeats":1},{"count":393,"lower_bound":"A4AAAAAAAAeBBBmgCgAAAAAA","upper_bound":"A4AAAAAAAAeRBBmfLAAAAAAA","repeats":1},{"count":401,"lower_bound":"A4AAAAAAAAeUBBmgzAAAAAAA","upper_bound":"A4AAAAAAAAejBBmhlgAAAAAA","repeats":1},{"count":409,"lower_bound":"A4AAAAAAAAelBBmfrgAAAAAA","upper_bound":"A4AAAAAAAAe2BBmgtgAAAAAA","repeats":1},{"count":417,"lower_bound":"A4AAAAAAAAe8BBmfNgAAAAAA","upper_bound":"A4AAAAAAAAfSBBmfqAAAAAAA","repeats":1},{"count":425,"lower_bound":"A4AAAAAAAAfUBBmfKAAAAAAA","upper_bound":"A4AAAAAAAAfmBBmgMgAAAAAA","repeats":1},{"count":433,"lower_bound":"A4AAAAAAAAfnBBmfVgAAAAAA","upper_bound":"A4AAAAAAAAf3BBmhaAAAAAAA","repeats":1},{"count":441,"lower_bound":"A4AAAAAAAAf5BBme8AAAAAAA","upper_bound":"A4AAAAAAAAgJBBmhIgAAAAAA","repeats":1},{"count":449,"lower_bound":"A4AAAAAAAAgNBBmf0gAAAAAA","upper_bound":"A4AAAAAAAAgXBBmhBAAAAAAA","repeats":1},{"count":457,"lower_bound":"A4AAAAAAAAgZBBme3gAAAAAA","upper_bound":"A4AAAAAAAAgsBBmhDAAAAAAA","repeats":1},{"count":465,"lower_bound":"A4AAAAAAAAgsBBmhFAAAAAAA","upper_bound":"A4AAAAAAAAg0BBmf9gAAAAAA","repeats":1},{"count":473,"lower_bound":"A4AAAAAAAAg2BBmfjAAAAAAA","upper_bound":"A4AAAAAAAAg/BBmgxAAAAAAA","repeats":1},{"count":481,"lower_bound":"A4AAAAAAAAhGBBmg7gAAAAAA","upper_bound":"A4AAAAAAAAhgBBme9gAAAAAA","repeats":1},{"count":489,"lower_bound":"A4AAAAAAAAhjBBme9AAAAAAA","upper_bound":"A4AAAAAAAAhuBBmf3gAAAAAA","repeats":1},{"count":497,"lower_bound":"A4AAAAAAAAhvBBmfoAAAAAAA","upper_bound":"A4AAAAAAAAh3BBmf3gAAAAAA","repeats":1},{"count":505,"lower_bound":"A4AAAAAAAAh3BBmgAgAAAAAA","upper_bound":"A4AAAAAAAAiCBBmgKAAAAAAA","repeats":1},{"count":513,"lower_bound":"A4AAAAAAAAiHBBmfGgAAAAAA","upper_bound":"A4AAAAAAAAibBBmg0AAAAAAA","repeats":1},{"count":521,"lower_bound":"A4AAAAAAAAidBBmhjgAAAAAA","upper_bound":"A4AAAAAAAAi2BBmfZgAAAAAA","repeats":1},{"count":529,"lower_bound":"A4AAAAAAAAi2BBmgHAAAAAAA","upper_bound":"A4AAAAAAAAjGBBmfYgAAAAAA","repeats":1},{"count":537,"lower_bound":"A4AAAAAAAAjIBBmg1gAAAAAA","upper_bound":"A4AAAAAAAAjQBBmfSgAAAAAA","repeats":1},{"count":545,"lower_bound":"A4AAAAAAAAjQBBmfdAAAAAAA","upper_bound":"A4AAAAAAAAjiBBmfcgAAAAAA","repeats":1},{"count":553,"lower_bound":"A4AAAAAAAAjiBBmhrgAAAAAA","upper_bound":"A4AAAAAAAAj3BBmfHgAAAAAA","repeats":1},{"count":561,"lower_bound":"A4AAAAAAAAj3BBmhnAAAAAAA","upper_bound":"A4AAAAAAAAkIBBmgHAAAAAAA","repeats":1},{"count":569,"lower_bound":"A4AAAAAAAAkJBBmgWAAAAAAA","upper_bound":"A4AAAAAAAAkVBBmfKAAAAAAA","repeats":1},{"count":577,"lower_bound":"A4AAAAAAAAkcBBmfuAAAAAAA","upper_bound":"A4AAAAAAAAksBBmgzAAAAAAA","repeats":1},{"count":585,"lower_bound":"A4AAAAAAAAksBBmhRgAAAAAA","upper_bound":"A4AAAAAAAAk6BBme8gAAAAAA","repeats":1},{"count":593,"lower_bound":"A4AAAAAAAAk8BBmgjAAAAAAA","upper_bound":"A4AAAAAAAAlJBBmg3gAAAAAA","repeats":1},{"count":601,"lower_bound":"A4AAAAAAAAlPBBmhHAAAAAAA","upper_bound":"A4AAAAAAAAlZBBmhmgAAAAAA","repeats":1},{"count":609,"lower_bound":"A4AAAAAAAAlaBBmf8AAAAAAA","upper_bound":"A4AAAAAAAAlkBBmhLgAAAAAA","repeats":1},{"count":617,"lower_bound":"A4AAAAAAAAlmBBmgGAAAAAAA","upper_bound":"A4AAAAAAAAlzBBmgDAAAAAAA","repeats":1},{"count":625,"lower_bound":"A4AAAAAAAAl3BBmgBgAAAAAA","upper_bound":"A4AAAAAAAAmMBBme1gAAAAAA","repeats":1},{"count":633,"lower_bound":"A4AAAAAAAAmNBBme0gAAAAAA","upper_bound":"A4AAAAAAAAmUBBme5gAAAAAA","repeats":1},{"count":641,"lower_bound":"A4AAAAAAAAmUBBmgagAAAAAA","upper_bound":"A4AAAAAAAAmhBBmgTAAAAAAA","repeats":1},{"count":649,"lower_bound":"A4AAAAAAAAmjBBmgNAAAAAAA","upper_bound":"A4AAAAAAAAmuBBmfjgAAAAAA","repeats":1},{"count":657,"lower_bound":"A4AAAAAAAAmxBBmgyAAAAAAA","upper_bound":"A4AAAAAAAAm/BBmgSAAAAAAA","repeats":1},{"count":665,"lower_bound":"A4AAAAAAAAnKBBmg3AAAAAAA","upper_bound":"A4AAAAAAAAnXBBmgVAAAAAAA","repeats":1},{"count":673,"lower_bound":"A4AAAAAAAAnZBBmhZAAAAAAA","upper_bound":"A4AAAAAAAAngBBmgXAAAAAAA","repeats":1},{"count":681,"lower_bound":"A4AAAAAAAAngBBmhXgAAAAAA","upper_bound":"A4AAAAAAAAn7BBmewgAAAAAA","repeats":1},{"count":689,"lower_bound":"A4AAAAAAAAn9BBmg5gAAAAAA","upper_bound":"A4AAAAAAAAoHBBmhbAAAAAAA","repeats":1},{"count":697,"lower_bound":"A4AAAAAAAAoJBBmhrAAAAAAA","upper_bound":"A4AAAAAAAAofBBmgGAAAAAAA","repeats":1},{"count":705,"lower_bound":"A4AAAAAAAAojBBmgKAAAAAAA","upper_bound":"A4AAAAAAAAo9BBmfuAAAAAAA","repeats":1},{"count":713,"lower_bound":"A4AAAAAAAApBBBmfsgAAAAAA","upper_bound":"A4AAAAAAAApSBBmhFAAAAAAA","repeats":1},{"count":721,"lower_bound":"A4AAAAAAAApTBBmhjgAAAAAA","upper_bound":"A4AAAAAAAApeBBmgsAAAAAAA","repeats":1},{"count":729,"lower_bound":"A4AAAAAAAApfBBmfnAAAAAAA","upper_bound":"A4AAAAAAAAppBBmf8AAAAAAA","repeats":1},{"count":737,"lower_bound":"A4AAAAAAAAprBBmhGgAAAAAA","upper_bound":"A4AAAAAAAAqGBBmgjAAAAAAA","repeats":1},{"count":745,"lower_bound":"A4AAAAAAAAqOBBmgzgAAAAAA","upper_bound":"A4AAAAAAAAqYBBmfdgAAAAAA","repeats":1},{"count":753,"lower_bound":"A4AAAAAAAAqcBBmgsAAAAAAA","upper_bound":"A4AAAAAAAAqlBBmfSgAAAAAA","repeats":1},{"count":761,"lower_bound":"A4AAAAAAAAqlBBmgwgAAAAAA","upper_bound":"A4AAAAAAAAqtBBmfDAAAAAAA","repeats":1},{"count":769,"lower_bound":"A4AAAAAAAAqtBBmgXAAAAAAA","upper_bound":"A4AAAAAAAAq9BBme6AAAAAAA","repeats":1},{"count":777,"lower_bound":"A4AAAAAAAArEBBmfSAAAAAAA","upper_bound":"A4AAAAAAAArPBBmfnAAAAAAA","repeats":1},{"count":785,"lower_bound":"A4AAAAAAAArUBBmhVAAAAAAA","upper_bound":"A4AAAAAAAArjBBmgLAAAAAAA","repeats":1},{"count":793,"lower_bound":"A4AAAAAAAArkBBmgcgAAAAAA","upper_bound":"A4AAAAAAAAr1BBmf4AAAAAAA","repeats":1},{"count":801,"lower_bound":"A4AAAAAAAAr5BBmhNgAAAAAA","upper_bound":"A4AAAAAAAAsEBBmfxAAAAAAA","repeats":1},{"count":809,"lower_bound":"A4AAAAAAAAsEBBmhdAAAAAAA","upper_bound":"A4AAAAAAAAsQBBmguAAAAAAA","repeats":1},{"count":817,"lower_bound":"A4AAAAAAAAsRBBmgBgAAAAAA","upper_bound":"A4AAAAAAAAscBBmfogAAAAAA","repeats":1},{"count":825,"lower_bound":"A4AAAAAAAAscBBmhCgAAAAAA","upper_bound":"A4AAAAAAAAsyBBmfkAAAAAAA","repeats":1},{"count":833,"lower_bound":"A4AAAAAAAAszBBmgeAAAAAAA","upper_bound":"A4AAAAAAAAs+BBmgtgAAAAAA","repeats":1},{"count":841,"lower_bound":"A4AAAAAAAAtBBBmfDgAAAAAA","upper_bound":"A4AAAAAAAAtJBBmgLgAAAAAA","repeats":1},{"count":849,"lower_bound":"A4AAAAAAAAtMBBme3AAAAAAA","upper_bound":"A4AAAAAAAAtgBBmfXAAAAAAA","repeats":1},{"count":857,"lower_bound":"A4AAAAAAAAthBBmgSgAAAAAA","upper_bound":"A4AAAAAAAAtvBBmgRAAAAAAA","repeats":1},{"count":865,"lower_bound":"A4AAAAAAAAtvBBmgjgAAAAAA","upper_bound":"A4AAAAAAAAt3BBmhdAAAAAAA","repeats":1},{"count":873,"lower_bound":"A4AAAAAAAAt4BBmgNgAAAAAA","upper_bound":"A4AAAAAAAAt+BBmhpAAAAAAA","repeats":1},{"count":881,"lower_bound":"A4AAAAAAAAuCBBmgkAAAAAAA","upper_bound":"A4AAAAAAAAuQBBmhIAAAAAAA","repeats":1},{"count":889,"lower_bound":"A4AAAAAAAAuRBBmg8gAAAAAA","upper_bound":"A4AAAAAAAAuhBBmf8AAAAAAA","repeats":1},{"count":897,"lower_bound":"A4AAAAAAAAujBBmfngAAAAAA","upper_bound":"A4AAAAAAAAuxBBmfSAAAAAAA","repeats":1},{"count":905,"lower_bound":"A4AAAAAAAAuzBBmgqgAAAAAA","upper_bound":"A4AAAAAAAAvIBBmguAAAAAAA","repeats":1},{"count":913,"lower_bound":"A4AAAAAAAAvMBBmhYAAAAAAA","upper_bound":"A4AAAAAAAAvbBBme5AAAAAAA","repeats":1},{"count":921,"lower_bound":"A4AAAAAAAAveBBmf+AAAAAAA","upper_bound":"A4AAAAAAAAvlBBmglAAAAAAA","repeats":1},{"count":929,"lower_bound":"A4AAAAAAAAvqBBme0AAAAAAA","upper_bound":"A4AAAAAAAAv2BBmgggAAAAAA","repeats":1},{"count":937,"lower_bound":"A4AAAAAAAAv5BBmfUAAAAAAA","upper_bound":"A4AAAAAAAAwJBBmg2AAAAAAA","repeats":1},{"count":945,"lower_bound":"A4AAAAAAAAwKBBmfRAAAAAAA","upper_bound":"A4AAAAAAAAwRBBmgrgAAAAAA","repeats":1},{"count":953,"lower_bound":"A4AAAAAAAAwUBBmhJAAAAAAA","upper_bound":"A4AAAAAAAAwrBBmgTgAAAAAA","repeats":1},{"count":961,"lower_bound":"A4AAAAAAAAwsBBmhHAAAAAAA","upper_bound":"A4AAAAAAAAw5BBmgJgAAAAAA","repeats":1},{"count":969,"lower_bound":"A4AAAAAAAAw8BBmgNgAAAAAA","upper_bound":"A4AAAAAAAAxJBBmfaAAAAAAA","repeats":1},{"count":977,"lower_bound":"A4AAAAAAAAxKBBmhWgAAAAAA","upper_bound":"A4AAAAAAAAxmBBmhRAAAAAAA","repeats":1},{"count":985,"lower_bound":"A4AAAAAAAAxoBBmfwgAAAAAA","upper_bound":"A4AAAAAAAAx4BBmhKgAAAAAA","repeats":1},{"count":993,"lower_bound":"A4AAAAAAAAx5BBmgRgAAAAAA","upper_bound":"A4AAAAAAAAyEBBmfqgAAAAAA","repeats":1},{"count":1001,"lower_bound":"A4AAAAAAAAyEBBmfzAAAAAAA","upper_bound":"A4AAAAAAAAyPBBmhigAAAAAA","repeats":1},{"count":1009,"lower_bound":"A4AAAAAAAAySBBmfSgAAAAAA","upper_bound":"A4AAAAAAAAyvBBmgpgAAAAAA","repeats":1},{"count":1017,"lower_bound":"A4AAAAAAAAywBBmhKAAAAAAA","upper_bound":"A4AAAAAAAAy5BBmf5gAAAAAA","repeats":1},{"count":1025,"lower_bound":"A4AAAAAAAAy7BBmfpgAAAAAA","upper_bound":"A4AAAAAAAAzHBBmhAgAAAAAA","repeats":1},{"count":1033,"lower_bound":"A4AAAAAAAAzIBBmexgAAAAAA","upper_bound":"A4AAAAAAAAzWBBmfAgAAAAAA","repeats":1},{"count":1041,"lower_bound":"A4AAAAAAAAzYBBmezgAAAAAA","upper_bound":"A4AAAAAAAAzfBBmgbgAAAAAA","repeats":1},{"count":1049,"lower_bound":"A4AAAAAAAAzgBBmgTAAAAAAA","upper_bound":"A4AAAAAAAAz1BBmfMAAAAAAA","repeats":1},{"count":1057,"lower_bound":"A4AAAAAAAAz1BBmfbAAAAAAA","upper_bound":"A4AAAAAAAAz/BBme5gAAAAAA","repeats":1},{"count":1065,"lower_bound":"A4AAAAAAAA0DBBmg3AAAAAAA","upper_bound":"A4AAAAAAAA0PBBmgYAAAAAAA","repeats":1},{"count":1073,"lower_bound":"A4AAAAAAAA0VBBmfxgAAAAAA","upper_bound":"A4AAAAAAAA0iBBmg2AAAAAAA","repeats":1},{"count":1081,"lower_bound":"A4AAAAAAAA0kBBmhRgAAAAAA","upper_bound":"A4AAAAAAAA02BBmhoAAAAAAA","repeats":1},{"count":1089,"lower_bound":"A4AAAAAAAA07BBme2AAAAAAA","upper_bound":"A4AAAAAAAA1MBBmgBgAAAAAA","repeats":1},{"count":1097,"lower_bound":"A4AAAAAAAA1NBBmfbAAAAAAA","upper_bound":"A4AAAAAAAA1ZBBmhQgAAAAAA","repeats":1},{"count":1105,"lower_bound":"A4AAAAAAAA1gBBmf4AAAAAAA","upper_bound":"A4AAAAAAAA1rBBmg4AAAAAAA","repeats":1},{"count":1113,"lower_bound":"A4AAAAAAAA1sBBmg1gAAAAAA","upper_bound":"A4AAAAAAAA14BBmgSgAAAAAA","repeats":1},{"count":1121,"lower_bound":"A4AAAAAAAA16BBmf5AAAAAAA","upper_bound":"A4AAAAAAAA2DBBme1AAAAAAA","repeats":1},{"count":1129,"lower_bound":"A4AAAAAAAA2EBBmfjgAAAAAA","upper_bound":"A4AAAAAAAA2PBBmgrAAAAAAA","repeats":1},{"count":1137,"lower_bound":"A4AAAAAAAA2QBBmgHAAAAAAA","upper_bound":"A4AAAAAAAA2lBBmhHAAAAAAA","repeats":1},{"count":1145,"lower_bound":"A4AAAAAAAA2oBBmgJAAAAAAA","upper_bound":"A4AAAAAAAA21BBmgbAAAAAAA","repeats":1},{"count":1153,"lower_bound":"A4AAAAAAAA24BBmhmgAAAAAA","upper_bound":"A4AAAAAAAA3FBBmgwgAAAAAA","repeats":1},{"count":1161,"lower_bound":"A4AAAAAAAA3KBBmhLgAAAAAA","upper_bound":"A4AAAAAAAA3jBBmexAAAAAAA","repeats":1},{"count":1169,"lower_bound":"A4AAAAAAAA3mBBmfWAAAAAAA","upper_bound":"A4AAAAAAAA30BBmhbgAAAAAA","repeats":1},{"count":1177,"lower_bound":"A4AAAAAAAA33BBmhagAAAAAA","upper_bound":"A4AAAAAAAA4NBBmf5AAAAAAA","repeats":1},{"count":1185,"lower_bound":"A4AAAAAAAA4OBBmfjgAAAAAA","upper_bound":"A4AAAAAAAA4aBBmgkAAAAAAA","repeats":1},{"count":1193,"lower_bound":"A4AAAAAAAA4eBBmf5AAAAAAA","upper_bound":"A4AAAAAAAA4pBBmhtAAAAAAA","repeats":1},{"count":1201,"lower_bound":"A4AAAAAAAA4rBBmfmgAAAAAA","upper_bound":"A4AAAAAAAA47BBmfaAAAAAAA","repeats":1},{"count":1209,"lower_bound":"A4AAAAAAAA48BBmhogAAAAAA","upper_bound":"A4AAAAAAAA5MBBmg6gAAAAAA","repeats":1},{"count":1217,"lower_bound":"A4AAAAAAAA5QBBmf2AAAAAAA","upper_bound":"A4AAAAAAAA5fBBmgKAAAAAAA","repeats":1},{"count":1225,"lower_bound":"A4AAAAAAAA5gBBmfIAAAAAAA","upper_bound":"A4AAAAAAAA5qBBmhNgAAAAAA","repeats":1},{"count":1233,"lower_bound":"A4AAAAAAAA5rBBmghAAAAAAA","upper_bound":"A4AAAAAAAA58BBmfkAAAAAAA","repeats":1},{"count":1241,"lower_bound":"A4AAAAAAAA5+BBmfZgAAAAAA","upper_bound":"A4AAAAAAAA6VBBme5gAAAAAA","repeats":1},{"count":1249,"lower_bound":"A4AAAAAAAA6WBBme9AAAAAAA","upper_bound":"A4AAAAAAAA6oBBmfqgAAAAAA","repeats":1},{"count":1257,"lower_bound":"A4AAAAAAAA6qBBmfhgAAAAAA","upper_bound":"A4AAAAAAAA7LBBmhNgAAAAAA","repeats":1},{"count":1265,"lower_bound":"A4AAAAAAAA7RBBmfEgAAAAAA","upper_bound":"A4AAAAAAAA7jBBme2gAAAAAA","repeats":1},{"count":1273,"lower_bound":"A4AAAAAAAA7kBBmhggAAAAAA","upper_bound":"A4AAAAAAAA7xBBmhdAAAAAAA","repeats":1},{"count":1281,"lower_bound":"A4AAAAAAAA7yBBmf7gAAAAAA","upper_bound":"A4AAAAAAAA7+BBmhRAAAAAAA","repeats":1},{"count":1289,"lower_bound":"A4AAAAAAAA8DBBmflgAAAAAA","upper_bound":"A4AAAAAAAA8eBBmgogAAAAAA","repeats":1},{"count":1297,"lower_bound":"A4AAAAAAAA8iBBmgrAAAAAAA","upper_bound":"A4AAAAAAAA8pBBmgqgAAAAAA","repeats":1},{"count":1305,"lower_bound":"A4AAAAAAAA8qBBmgXgAAAAAA","upper_bound":"A4AAAAAAAA8zBBmgKgAAAAAA","repeats":1},{"count":1313,"lower_bound":"A4AAAAAAAA82BBmfeAAAAAAA","upper_bound":"A4AAAAAAAA9JBBmgxgAAAAAA","repeats":1},{"count":1321,"lower_bound":"A4AAAAAAAA9KBBmf7AAAAAAA","upper_bound":"A4AAAAAAAA9WBBmgOAAAAAAA","repeats":1},{"count":1329,"lower_bound":"A4AAAAAAAA9XBBmf+AAAAAAA","upper_bound":"A4AAAAAAAA9dBBmhKgAAAAAA","repeats":1},{"count":1337,"lower_bound":"A4AAAAAAAA9eBBmfFgAAAAAA","upper_bound":"A4AAAAAAAA9mBBmhmAAAAAAA","repeats":1},{"count":1345,"lower_bound":"A4AAAAAAAA9nBBmgpgAAAAAA","upper_bound":"A4AAAAAAAA9yBBmfBgAAAAAA","repeats":1},{"count":1353,"lower_bound":"A4AAAAAAAA9yBBmg2AAAAAAA","upper_bound":"A4AAAAAAAA99BBmgJAAAAAAA","repeats":1},{"count":1361,"lower_bound":"A4AAAAAAAA+ABBmfsgAAAAAA","upper_bound":"A4AAAAAAAA+IBBmfRAAAAAAA","repeats":1},{"count":1369,"lower_bound":"A4AAAAAAAA+IBBmhBAAAAAAA","upper_bound":"A4AAAAAAAA+eBBmgWAAAAAAA","repeats":1},{"count":1377,"lower_bound":"A4AAAAAAAA+eBBmhngAAAAAA","upper_bound":"A4AAAAAAAA+nBBmfTgAAAAAA","repeats":1},{"count":1385,"lower_bound":"A4AAAAAAAA+pBBmhHAAAAAAA","upper_bound":"A4AAAAAAAA+yBBmfBAAAAAAA","repeats":1},{"count":1393,"lower_bound":"A4AAAAAAAA+yBBmgAgAAAAAA","upper_bound":"A4AAAAAAAA+8BBmfMgAAAAAA","repeats":1},{"count":1401,"lower_bound":"A4AAAAAAAA+9BBmezgAAAAAA","upper_bound":"A4AAAAAAAA/IBBmfigAAAAAA","repeats":1},{"count":1409,"lower_bound":"A4AAAAAAAA/JBBmfKAAAAAAA","upper_bound":"A4AAAAAAAA/RBBmgrgAAAAAA","repeats":1},{"count":1417,"lower_bound":"A4AAAAAAAA/SBBmgDAAAAAAA","upper_bound":"A4AAAAAAAA/mBBmfzAAAAAAA","repeats":1},{"count":1425,"lower_bound":"A4AAAAAAAA/mBBmhSAAAAAAA","upper_bound":"A4AAAAAAAA/tBBmglAAAAAAA","repeats":1},{"count":1433,"lower_bound":"A4AAAAAAAA/wBBmf+AAAAAAA","upper_bound":"A4AAAAAAAA/5BBmfVgAAAAAA","repeats":1},{"count":1441,"lower_bound":"A4AAAAAAAA/6BBmfcgAAAAAA","upper_bound":"A4AAAAAAABAABBmhmgAAAAAA","repeats":1},{"count":1449,"lower_bound":"A4AAAAAAABAEBBmgyAAAAAAA","upper_bound":"A4AAAAAAABAQBBmgrgAAAAAA","repeats":1},{"count":1457,"lower_bound":"A4AAAAAAABASBBmgOAAAAAAA","upper_bound":"A4AAAAAAABAeBBmgRgAAAAAA","repeats":1},{"count":1465,"lower_bound":"A4AAAAAAABAhBBme0gAAAAAA","upper_bound":"A4AAAAAAABAxBBmgKAAAAAAA","repeats":1},{"count":1473,"lower_bound":"A4AAAAAAABA3BBmfuAAAAAAA","upper_bound":"A4AAAAAAABBDBBmgRAAAAAAA","repeats":1},{"count":1481,"lower_bound":"A4AAAAAAABBDBBmg1gAAAAAA","upper_bound":"A4AAAAAAABBQBBmhVAAAAAAA","repeats":1},{"count":1489,"lower_bound":"A4AAAAAAABBRBBmfSAAAAAAA","upper_bound":"A4AAAAAAABBZBBmg7gAAAAAA","repeats":1},{"count":1497,"lower_bound":"A4AAAAAAABBcBBmhEgAAAAAA","upper_bound":"A4AAAAAAABBrBBmhqAAAAAAA","repeats":1},{"count":1505,"lower_bound":"A4AAAAAAABBtBBmgIgAAAAAA","upper_bound":"A4AAAAAAABB4BBmeyAAAAAAA","repeats":1},{"count":1513,"lower_bound":"A4AAAAAAABB7BBmhCAAAAAAA","upper_bound":"A4AAAAAAABCOBBmf6gAAAAAA","repeats":1},{"count":1521,"lower_bound":"A4AAAAAAABCOBBmhpgAAAAAA","upper_bound":"A4AAAAAAABCdBBmgbgAAAAAA","repeats":1},{"count":1529,"lower_bound":"A4AAAAAAABCfBBmgWgAAAAAA","upper_bound":"A4AAAAAAABC0BBmfSgAAAAAA","repeats":1},{"count":1537,"lower_bound":"A4AAAAAAABC4BBmgygAAAAAA","upper_bound":"A4AAAAAAABDBBBmfDAAAAAAA","repeats":1},{"count":1545,"lower_bound":"A4AAAAAAABDBBBmglAAAAAAA","upper_bound":"A4AAAAAAABDGBBmhMgAAAAAA","repeats":1},{"count":1553,"lower_bound":"A4AAAAAAABDIBBme8AAAAAAA","upper_bound":"A4AAAAAAABDUBBmheAAAAAAA","repeats":1},{"count":1561,"lower_bound":"A4AAAAAAABDXBBmfsAAAAAAA","upper_bound":"A4AAAAAAABDoBBmgDgAAAAAA","repeats":1},{"count":1569,"lower_bound":"A4AAAAAAABDpBBmhmgAAAAAA","upper_bound":"A4AAAAAAABDwBBmhFAAAAAAA","repeats":1},{"count":1577,"lower_bound":"A4AAAAAAABDzBBmgYgAAAAAA","upper_bound":"A4AAAAAAABEGBBmgLAAAAAAA","repeats":1},{"count":1585,"lower_bound":"A4AAAAAAABEIBBmfagAAAAAA","upper_bound":"A4AAAAAAABEcBBmgXAAAAAAA","repeats":1},{"count":1593,"lower_bound":"A4AAAAAAABEcBBmhsgAAAAAA","upper_bound":"A4AAAAAAABEwBBmgnAAAAAAA","repeats":1},{"count":1601,"lower_bound":"A4AAAAAAABEwBBmhRgAAAAAA","upper_bound":"A4AAAAAAABE8BBmhCgAAAAAA","repeats":1},{"count":1609,"lower_bound":"A4AAAAAAABFABBmfQgAAAAAA","upper_bound":"A4AAAAAAABFMBBmfuAAAAAAA","repeats":1},{"count":1617,"lower_bound":"A4AAAAAAABFPBBmfhAAAAAAA","upper_bound":"A4AAAAAAABFZBBmfAgAAAAAA","repeats":1},{"count":1625,"lower_bound":"A4AAAAAAABFcBBmg6AAAAAAA","upper_bound":"A4AAAAAAABFmBBmgVgAAAAAA","repeats":1},{"count":1633,"lower_bound":"A4AAAAAAABFoBBmg0AAAAAAA","upper_bound":"A4AAAAAAABGBBBme2gAAAAAA","repeats":1},{"count":1641,"lower_bound":"A4AAAAAAABGBBBmgbAAAAAAA","upper_bound":"A4AAAAAAABGHBBmhRgAAAAAA","repeats":1},{"count":1649,"lower_bound":"A4AAAAAAABGLBBmhOAAAAAAA","upper_bound":"A4AAAAAAABGTBBmgUgAAAAAA","repeats":1},{"count":1657,"lower_bound":"A4AAAAAAABGUBBmgCAAAAAAA","upper_bound":"A4AAAAAAABGdBBme2gAAAAAA","repeats":1},{"count":1665,"lower_bound":"A4AAAAAAABGdBBmg4gAAAAAA","upper_bound":"A4AAAAAAABGtBBmexAAAAAAA","repeats":1},{"count":1673,"lower_bound":"A4AAAAAAABGtBBmgnAAAAAAA","upper_bound":"A4AAAAAAABG6BBmgNAAAAAAA","repeats":1},{"count":1681,"lower_bound":"A4AAAAAAABG7BBmgKgAAAAAA","upper_bound":"A4AAAAAAABHFBBmfsgAAAAAA","repeats":1},{"count":1689,"lower_bound":"A4AAAAAAABHGBBmfIgAAAAAA","upper_bound":"A4AAAAAAABHRBBmhrAAAAAAA","repeats":1},{"count":1697,"lower_bound":"A4AAAAAAABHSBBmgWgAAAAAA","upper_bound":"A4AAAAAAABHqBBmgHgAAAAAA","repeats":1},{"count":1705,"lower_bound":"A4AAAAAAABHvBBmgngAAAAAA","upper_bound":"A4AAAAAAABH6BBmgwgAAAAAA","repeats":1},{"count":1713,"lower_bound":"A4AAAAAAABH8BBmhdAAAAAAA","upper_bound":"A4AAAAAAABIIBBmfdAAAAAAA","repeats":1},{"count":1721,"lower_bound":"A4AAAAAAABIJBBme6AAAAAAA","upper_bound":"A4AAAAAAABIRBBmfXgAAAAAA","repeats":1},{"count":1729,"lower_bound":"A4AAAAAAABIRBBmfrAAAAAAA","upper_bound":"A4AAAAAAABIhBBmg2gAAAAAA","repeats":1},{"count":1737,"lower_bound":"A4AAAAAAABImBBmfRgAAAAAA","upper_bound":"A4AAAAAAABIwBBmexgAAAAAA","repeats":1},{"count":1745,"lower_bound":"A4AAAAAAABIwBBmfggAAAAAA","upper_bound":"A4AAAAAAABJABBmfMAAAAAAA","repeats":1},{"count":1753,"lower_bound":"A4AAAAAAABJABBmhmAAAAAAA","upper_bound":"A4AAAAAAABJNBBmgXgAAAAAA","repeats":1},{"count":1761,"lower_bound":"A4AAAAAAABJQBBme+AAAAAAA","upper_bound":"A4AAAAAAABJlBBmgFgAAAAAA","repeats":1},{"count":1769,"lower_bound":"A4AAAAAAABJoBBmhggAAAAAA","upper_bound":"A4AAAAAAABJvBBmg9gAAAAAA","repeats":1},{"count":1777,"lower_bound":"A4AAAAAAABJwBBmfqgAAAAAA","upper_bound":"A4AAAAAAABJ9BBmhnAAAAAAA","repeats":1},{"count":1785,"lower_bound":"A4AAAAAAABKEBBmhHgAAAAAA","upper_bound":"A4AAAAAAABKSBBmgXgAAAAAA","repeats":1},{"count":1793,"lower_bound":"A4AAAAAAABKVBBmfMgAAAAAA","upper_bound":"A4AAAAAAABKpBBmhDAAAAAAA","repeats":1},{"count":1801,"lower_bound":"A4AAAAAAABKrBBmfRgAAAAAA","upper_bound":"A4AAAAAAABK7BBmhigAAAAAA","repeats":1},{"count":1809,"lower_bound":"A4AAAAAAABK8BBmhXAAAAAAA","upper_bound":"A4AAAAAAABLKBBme+AAAAAAA","repeats":1},{"count":1817,"lower_bound":"A4AAAAAAABLKBBmfsgAAAAAA","upper_bound":"A4AAAAAAABLcBBmfagAAAAAA","repeats":1},{"count":1825,"lower_bound":"A4AAAAAAABLeBBmgWAAAAAAA","upper_bound":"A4AAAAAAABLnBBmf7AAAAAAA","repeats":1},{"count":1833,"lower_bound":"A4AAAAAAABLpBBmg9gAAAAAA","upper_bound":"A4AAAAAAABL5BBmfkgAAAAAA","repeats":1},{"count":1841,"lower_bound":"A4AAAAAAABL8BBmfqgAAAAAA","upper_bound":"A4AAAAAAABMIBBmgaAAAAAAA","repeats":1},{"count":1849,"lower_bound":"A4AAAAAAABMJBBmf8gAAAAAA","upper_bound":"A4AAAAAAABMVBBmezAAAAAAA","repeats":1},{"count":1857,"lower_bound":"A4AAAAAAABMVBBmfqgAAAAAA","upper_bound":"A4AAAAAAABMiBBmgNAAAAAAA","repeats":1},{"count":1865,"lower_bound":"A4AAAAAAABMkBBmhkAAAAAAA","upper_bound":"A4AAAAAAABMwBBmhJgAAAAAA","repeats":1},{"count":1873,"lower_bound":"A4AAAAAAABMzBBmgIgAAAAAA","upper_bound":"A4AAAAAAABM7BBmg6AAAAAAA","repeats":1},{"count":1881,"lower_bound":"A4AAAAAAABM+BBmhggAAAAAA","upper_bound":"A4AAAAAAABNGBBmgEgAAAAAA","repeats":1},{"count":1889,"lower_bound":"A4AAAAAAABNHBBmgxAAAAAAA","upper_bound":"A4AAAAAAABNRBBmhYgAAAAAA","repeats":1},{"count":1897,"lower_bound":"A4AAAAAAABNRBBmhogAAAAAA","upper_bound":"A4AAAAAAABNbBBmfhgAAAAAA","repeats":1},{"count":1905,"lower_bound":"A4AAAAAAABNcBBmfEAAAAAAA","upper_bound":"A4AAAAAAABNkBBmg1gAAAAAA","repeats":1},{"count":1913,"lower_bound":"A4AAAAAAABNlBBmg6AAAAAAA","upper_bound":"A4AAAAAAABNwBBmfcAAAAAAA","repeats":1},{"count":1921,"lower_bound":"A4AAAAAAABNwBBmf4AAAAAAA","upper_bound":"A4AAAAAAABN7BBmfdAAAAAAA","repeats":1},{"count":1929,"lower_bound":"A4AAAAAAABN8BBme5AAAAAAA","upper_bound":"A4AAAAAAABOEBBmgsgAAAAAA","repeats":1},{"count":1933,"lower_bound":"A4AAAAAAABOEBBmhlAAAAAAA","upper_bound":"A4AAAAAAABOIBBmfbAAAAAAA","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,2,2,0,0,3,2,2,1,0,0,3,1,1,0,0,0,0,1,1,1,3,0,1,0,1,0,2,2,2,1,1,3,0,1,1,2,0,1,2,1,2,1,2,0,0,0,1,5,1,0,3,2,1,0,0,1,3,0,3,1,4,0,1,1,0,2,0,2,1,0,0,0,1,0,0,1,0,1,0,0,0,1,0,2,0,0,0,0,0,0,1,1,0,0,0,1,3,1,1,1,2,2,0,0,2,1,2,2,0,1,1,0,1,2,1,2,0,1,1,0,0,0,1,0,0,2,1,1,0,0,1,0,2,0,1,1,2,0,2,1,1,0,1,0,1,0,1,0,1,1,0,1,2,0,1,1,0,1,1,2,0,0,1,0,0,1,1,0,0,0,2,1,1,3,0,0,1,3,2,0,2,1,2,0,2,0,1,0,2,0,2,1,4,0,1,1,2,0,0,0,1,2,1,0,1,1,2,2,0,0,0,0,0,0,0,3,0,1,0,1,3,2,2,2,2,2,2,1,0,1,0,1,1,1,2,0,2,2,0,0,2,2,1,1,2,2,2,0,0,1,1,0,1,1,4,1,1,0,2,1,0,1,0,1,3,1,0,1,0,1,0,0,0,2,0,0,1,0,0,1,0,2,1,0,2,2,0,0,0,1,0,0,2,0,0,1,0,1,2,0,3,1,0,0,0,2,0,0,0,1,0,0,1,2,1,0,0,0,1,0,1,1,2,2,3,1,4,0,2,0,2,4,2,1,0,3,1,1,0,0,1,0,1,3,1,3,0,0,3,0,1,1,0,1,1,2,3,1,0,1,0,0,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,0,0,2,2,1,2,2,0,1,0,2,2,1,1,0,0,0,1,1,0,0,0,0,1,2,1,0,4,0,0,0,2,0,0,0,0,0,2,0,0,0,1,0,0,1,3,1,1,0,0,0,1,1,1,0,2,1,0,4,1,2,0,2,2,2,0,0,1,1,0,1,0,3,1,3,1,1,1,0,0,1,0,1,2,0,1,5,1,1,1,2,0,2,0,1,0,0,0,0,1,2,0,1,0,2,1,2,2,1,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,0,1,1,2,2,1,0,1,0,2,0,1,0,0,2,4,1,0,2,1,0,2,1,0,0,0,0,1,0,1,0,1,0,0,1,1,1,1,1,3,0,1,3,0,0,1,2,0,1,1,1,0,1,1,0,0,2,2,1,0,1,0,0,1,0,2,1,0,2,0,0,2,1,0,3,1,1,3,0,1,1,1,1,0,1,3,0,0,0,2,0,0,0,2,1,1,0,0,0,3,1,0,1,0,0,1,0,3,0,0,4,1,0,1,0,3,2,1,0,1,0,0,1,0,0,1,0,0,0,1,1,0,2,1,3,2,2,0,2,0,0,0,1,2,0,1,1,0,2,4,2,0,1,1,1,1,0,1,3,1,0,0,1,0,3,1,5,1,2,2,0,0,0,0,1,1,1,0,2,2,0,2,1,1,1,2,0,0,0,0,0,2,0,1,1,2,1,0,0,0,0,1,2,2,0,0,0,1,1,0,0,1,0,4,2,1,0,2,1,1,0,2,2,3,2,1,1,0,1,0,1,0,1,1,3,1,1,1,0,1,2,0,2,1,0,4,1,3,2,0,2,0,0,0,0,2,2,0,0,0,1,0,1,0,2,0,1,0,0,0,1,1,1,4,0,0,0,0,0,1,0,1,1,0,2,1,1,1,2,0,1,1,3,2,2,2,2,4,1,1,0,0,0,3,0,0,0,1,0,3,0,2,1,0,0,0,1,1,0,1,4,0,1,0,0,1,0,2,2,1,2,1,3,2,0,0,0,0,1,2,0,1,1,1,0,1,2,0,0,0,1,1,0,1,0,1,0,2,2,0,2,2,3,2,2,0,0,3,1,2,3,0,1,2,1,1,0,2,0,1,0,3,0,1,1,0,2,0,1,0,1,3,0,0,4,2,0,0,2,0,1,0,1,1,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,1,1,0,1,4,0,3,0,0,2,0,1,0,3,2,2,2,0,1,1,0,1,0,0,1,2,2,1,3,2,0,0,1,1,1,0,1,0,0,1,0,2,1,2,1,3,3,0,1,0,1,2,3,1,0,3,0,0,1,2,1,1,1,0,1,1,1,1,1,1,1,1,0,2,1,0,1,1,0,2,1,1,0,0,1,0,0,0,0,4,3,3,1,1,0,0,0,2,0,1,1,1,0,0,2,1,1,0,0,1,1,0,1,2,0,1,0,2,2,1,0,1,1,1,0,1,0,2,1,2,1,2,2,2,0,1,2,0,0,0,2,2,1,1,2,1,0,0,1,1,2,1,0,0,0,2,2,3,2,0,1,0,2,4,2,1,4,0,0,1,1,0,0,0,0,0,1,0,2,1,0,0,4,1,0,2,0,0,0,3,0,0,0,1,2,3,1,1,2,1,2,0,1,2,1,0,1,3,0,2,0,1,0,0,1,0,2,1,1,1,0,0,1,3,0,2,1,2,0,1,0,1,0,2,0,0,1,1,1,0,0,0,0,1,2,2,3,1,0,0,1,1,1,1,0,1,2,1,1,0,1,1,2,2,1,1,0,1,1,0,0,0,1,0,3,1,2,1,0,0,0,1,2,1,0,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,0,3,1,0,1,0,2,0,2,1,2,1,0,3,3,0,0,2,2,1,1,0,3,2,0,1,1,1,2,2,1,1,1,2,0,2,1,1,0,0,2,2,0,3,1,1,1,1,1,0,0,2,0,2,0,1,1,2,0,0,1,1,0,0,3,2,1,0,0,0,1,1,1,0,0,2,2,0,2,1,2,2,0,0,1,0,2,1,1,1,1,2,1,3,1,1,2,2,0,1,2,0,0,1,1,0,0,2,0,1,1,1,1,1,0,1,2,5,0,0,0,1,0,1,1,0,0,2,0,0,0,2,1,0,1,0,2,0,0,0,1,0,2,1,2,2,0,0,0,0,1,1,0,1,0,1,0,0,4,0,1,1,0,1,0,2,1,0,1,0,1,1,1,1,0,0,2,2,1,1,1,4,0,2,1,0,1,0,0,2,0,2,3,0,1,3,1,0,0,0,1,1,1,0,2,2,0,0,3,0,0,0,2,0,0,0,1,0,1,2,2,0,1,0,2,3,1,2,1,2,0,1,2,1,1,0,0,1,2,0,1,1,0,0,0,0,1,0,1,0,0,0,2,3,0,1,2,1,1,0,1,1,2,1,2,3,0,1,2,0,1,0,0,2,2,3,2,1,3,1,0,1,1,3,1,1,3,2,1,0,2,4,1,0,2,0,0,1,2,2,1,0,2,1,1,1,0,3,2,0,4,0,0,1,2,1,0,1,2,2,1,1,1,0,1,1,0,0,1,2,1,4,0,1,1,0,1,0,1,1,3,3,0,0,1,0,0,3,1,0,2,2,1,0,0,0,1,0,0,0,1,0,0,3,1,2,3,1,0,0,0,1,4,1,0,2,0,0,3,1,0,0,1,0,1,3,4,0,1,0,1,1,2,1,0,1,1,1,1,3,1,0,0,2,2,0,1,0,0,0,0,0,0,1,1,0,0,2,1,0,1,0,2,1,4,0,0,1,0,0,0,2,0,0,2,2,1,0,0,1,1,0,4,0,1,3,1,0,1,2,0,1,0,2,3,1,0,2,1,1,3,0,3,0,1,0,2,1,1,2,1,3,1,0,2,0,0,1,2,0,0,1,0,2,1,0,0,2,1,0,0,3,1,1,1,0,1,2,0,0,1,3,0,2,0,0,0,2,0,3,1,3,1,1,0,0,0,2,2,1,3,0,1,2,1,1,0,1,1,0,0,0,1,1,3,2,1,0,0,0,2,0,0,0,2,1,2,2,3,1,0,3,0,2,0,0,2,0,0,1,1,0,0,1,1,1,1,3,1,0,1,1,0,1,1,2,4,1,0,1,3,2,3,0,3,1,2,1,4,0,0,0,3,3,0,1,1,1,0,0,0,0,1,0,1,2,0,2,1,0,0,2,0,1,0,1,0,0,1,1,2,1,0,0,3,1,2,0,0,2,0,0,0,0,0,2,1,3,1,2,0,1,1,1,1,0,0,2,2,2,0,0,2,0,0,0,1,0,1,1,0,3,0,0,2,0,0,1,1,2,1,0,1,2,2,1,4,2,0,0,2,0,2,1,1,0,1,1,1,2,1,1,3,1,1,2,1,1,0,2,1,1,0,1,0,0,2,0,1,1,0,0,3,0,1,1,0,0,1,0,0,2,0,1,1,1,0,0,0,0,2,0,2,1,4,0,0,0,0,0,1,0,1,0,0,0,0,2,1,0,2,2,0,3,1,0,1,1,2,0,0,2,0,2,0,2,1,1,1,0,2,0,2,2,0,1,0,3,0,0,0,2,0,3,0,1,1,0,0,1,0,1,1,0,0,3,3,1,0,1,0,1,2,3,2,0,0,1,2,2,1,0,0,3,1,1,0,1,1,0,1,0]},{"counters":[1,1,0,0,2,1,0,0,3,0,0,1,1,2,1,0,3,0,1,0,1,1,1,3,1,1,3,1,0,5,1,0,2,3,0,0,1,0,2,3,1,0,0,1,1,1,1,0,0,0,1,0,1,1,0,1,0,1,1,2,2,1,0,3,1,2,0,0,1,1,2,1,1,3,0,0,0,1,2,0,1,0,0,1,1,0,2,1,0,1,2,0,0,3,0,0,1,2,2,0,0,0,2,1,0,0,2,0,2,2,2,1,2,0,1,0,2,2,0,0,1,1,0,1,1,0,1,1,1,0,3,0,0,0,0,0,1,0,0,1,2,1,2,3,1,1,1,1,2,0,0,2,0,1,0,1,1,0,2,0,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,1,1,2,0,1,0,1,0,2,1,1,0,0,3,0,0,0,3,1,0,2,0,2,0,2,0,1,2,0,0,3,3,1,1,1,0,1,0,0,1,2,1,3,0,1,0,0,1,0,3,1,0,2,1,2,0,1,0,1,0,0,1,3,1,0,0,0,1,1,1,0,2,0,0,1,1,0,1,0,2,1,2,1,1,0,2,0,1,1,0,0,1,0,2,0,0,2,2,1,0,1,2,2,1,1,1,0,2,0,0,0,0,0,1,0,2,0,0,1,0,1,2,0,1,1,1,1,0,1,0,0,1,2,1,1,1,1,1,0,1,0,1,1,2,0,0,0,1,0,0,0,2,1,0,1,1,0,1,1,0,2,1,2,3,1,0,2,1,2,0,2,2,1,2,1,1,0,0,1,1,1,2,0,3,2,2,0,0,1,4,1,1,1,0,0,3,3,3,3,0,1,1,0,1,1,1,1,0,1,1,1,2,0,1,1,2,2,1,0,0,0,1,1,1,1,1,0,2,1,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,2,2,0,0,0,0,3,3,1,0,3,2,0,0,0,0,0,0,1,1,1,0,1,1,0,2,0,1,2,1,0,1,1,0,0,0,0,1,2,2,1,0,0,1,1,0,2,1,2,1,0,1,0,0,1,1,1,2,0,0,0,3,2,0,3,2,1,3,0,1,2,2,1,2,3,2,0,1,0,2,1,1,2,1,0,2,2,1,2,1,2,0,1,3,1,2,0,2,0,0,0,0,0,1,0,3,2,1,0,2,0,3,0,1,2,2,0,2,2,1,1,3,2,2,1,0,1,0,3,2,0,1,1,1,1,1,1,1,2,0,0,1,0,1,2,0,0,1,1,0,0,1,1,1,1,2,2,0,0,0,1,0,0,2,4,0,0,0,0,0,1,1,2,0,1,1,0,2,1,3,2,0,1,1,2,0,3,0,1,4,0,3,1,1,1,0,0,1,0,0,1,1,3,1,1,3,2,1,1,1,1,3,2,2,0,1,0,2,0,1,0,1,0,1,0,2,1,3,2,3,0,3,2,0,1,0,1,0,0,1,0,0,0,2,1,2,0,1,0,0,0,1,1,0,1,0,1,2,0,1,2,1,1,0,0,0,2,1,3,0,0,0,2,2,2,1,1,3,1,0,0,2,0,0,3,1,0,2,1,2,0,1,2,1,1,2,0,3,0,2,0,2,1,2,1,0,0,0,0,1,1,1,1,0,1,1,0,2,1,2,1,1,3,0,2,1,2,0,2,0,0,0,1,0,1,0,1,0,0,4,1,0,1,1,0,0,0,0,0,0,5,2,0,0,2,2,0,0,0,4,0,1,1,2,0,0,0,1,0,0,1,2,1,1,3,1,5,1,3,1,3,1,0,1,0,2,2,1,0,0,1,2,1,2,0,0,2,1,0,1,0,0,0,0,0,1,1,1,0,0,3,1,2,1,0,1,3,0,3,0,1,0,1,0,0,2,1,1,1,0,3,1,1,1,1,1,0,0,1,1,4,0,1,1,1,0,2,0,1,1,0,2,2,0,1,1,0,0,0,2,2,1,0,0,2,0,2,0,1,1,2,1,1,1,0,0,0,3,2,0,0,1,2,0,0,1,0,1,0,0,2,2,1,3,1,0,1,1,1,3,1,1,1,0,4,0,2,2,0,1,2,1,0,1,3,0,2,0,2,2,3,2,2,0,0,1,2,0,2,0,3,1,2,0,0,3,1,1,1,1,0,2,0,1,0,2,0,1,0,2,0,3,1,1,0,0,0,1,0,0,1,1,1,0,1,0,0,1,0,1,0,3,0,0,1,0,1,1,1,1,1,2,1,2,0,0,3,2,2,1,1,0,1,2,1,1,0,2,1,1,1,0,2,1,0,0,2,0,0,0,2,1,0,0,0,0,0,0,1,0,1,2,0,1,1,0,0,3,2,0,0,3,2,1,2,0,0,0,0,2,1,2,0,0,1,0,1,0,0,0,1,0,0,2,1,1,1,2,1,1,0,4,1,2,0,0,1,0,1,0,3,0,1,2,1,0,1,0,0,0,1,0,3,2,0,0,0,1,0,1,0,0,0,1,2,0,1,1,0,1,0,2,1,2,5,0,2,1,1,1,1,1,0,0,0,1,2,1,2,2,0,1,0,1,0,1,0,2,1,2,1,1,2,2,1,0,1,0,1,0,2,0,0,1,0,1,1,0,0,1,1,2,1,1,2,2,4,1,1,0,0,1,1,0,0,0,1,0,1,0,1,1,1,1,1,1,1,0,1,2,1,0,2,1,2,0,1,2,0,1,1,2,1,3,2,0,0,3,0,3,3,1,1,1,1,0,2,1,3,1,1,2,0,1,0,0,1,0,1,0,0,0,1,2,2,3,1,0,1,1,0,1,1,0,0,0,0,1,0,2,2,0,0,0,0,2,1,1,0,0,0,1,2,2,1,3,2,2,0,1,0,0,1,0,0,2,0,0,4,1,0,1,1,1,1,0,1,1,1,1,2,0,2,0,0,2,2,0,0,2,1,0,3,0,0,0,2,2,1,0,1,0,3,1,0,1,0,2,1,0,1,0,1,0,1,2,0,4,0,2,2,0,0,0,0,3,0,3,1,0,1,1,1,1,1,1,1,2,1,2,1,1,1,2,2,1,1,1,0,1,1,0,0,1,0,1,2,1,1,0,1,0,1,3,1,1,0,0,0,0,0,0,1,0,1,2,0,0,0,2,1,1,1,1,0,0,3,1,1,2,0,0,0,0,0,3,0,2,2,1,1,0,1,0,1,1,1,0,0,1,3,1,1,1,0,2,0,0,0,0,0,0,1,1,0,2,0,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,0,1,0,2,0,2,3,3,0,1,1,0,0,1,1,0,1,1,0,0,1,1,4,1,2,0,1,3,2,0,1,1,2,1,0,1,0,0,0,0,0,1,0,3,0,2,0,0,3,3,2,0,2,1,0,0,0,1,4,0,0,0,1,1,0,2,1,1,1,1,0,1,1,1,0,1,5,2,1,0,0,0,2,2,0,0,0,4,1,1,1,0,2,2,2,0,1,1,1,2,1,1,0,2,0,0,1,2,0,1,2,3,0,0,0,1,0,1,1,0,4,1,1,0,0,2,1,1,1,4,0,1,2,1,0,1,1,1,1,1,0,0,0,1,1,2,0,2,1,2,1,0,1,0,2,1,2,1,0,2,0,0,1,1,2,2,2,2,2,1,1,1,1,0,0,0,2,0,0,0,0,3,0,0,2,2,2,1,1,1,0,1,2,1,0,0,2,0,1,4,0,1,0,3,0,3,1,1,1,1,0,3,0,0,2,0,0,1,0,0,1,0,1,1,0,1,1,2,1,1,1,2,0,1,1,0,0,0,0,1,1,2,0,0,0,2,0,0,0,1,1,1,0,0,2,1,2,1,0,2,1,1,0,0,1,0,2,1,1,0,0,2,2,0,0,2,2,1,3,2,1,0,4,3,1,1,0,0,1,1,1,1,1,0,1,1,2,3,0,1,0,1,0,0,2,0,3,3,1,1,1,2,0,0,2,0,1,0,1,1,0,0,1,2,1,2,0,1,0,2,1,1,2,1,1,1,1,1,1,1,1,0,1,1,0,1,1,2,1,1,1,2,1,0,1,2,0,0,0,2,3,0,2,1,1,1,1,0,1,2,1,2,0,0,1,0,1,2,0,1,0,2,1,0,1,2,0,0,0,0,0,5,1,1,4,0,3,1,2,3,0,0,0,0,1,0,2,1,1,1,0,1,1,1,1,0,3,1,0,0,2,0,1,2,3,0,2,0,0,2,0,0,0,0,1,1,0,1,0,0,3,0,2,0,0,0,1,0,2,2,2,1,0,0,0,1,0,3,0,1,0,1,0,0,0,5,2,1,3,0,1,1,1,2,1,0,0,0,1,3,0,1,2,2,2,1,1,0,0,0,0,1,1,2,1,0,2,0,0,3,0,1,1,1,2,4,3,0,2,3,3,1,2,1,2,0,2,1,0,1,2,0,0,0,0,0,2,1,1,0,2,1,1,0,1,1,1,2,2,3,2,0,1,0,2,3,0,1,1,0,1,1,2,4,0,1,0,0,1,2,2,2,0,3,1,1,0,0,0,2,0,0,0,1,1,1,1,0,1,1,1,0,0,0,1]},{"counters":[2,0,0,1,2,4,0,3,0,1,0,0,4,0,1,2,0,0,0,1,1,1,1,0,1,2,0,0,0,4,1,0,0,1,2,0,1,2,3,0,0,0,1,3,0,1,0,2,0,1,1,0,1,0,1,1,3,1,3,2,3,2,1,1,1,1,1,0,2,1,2,1,1,0,3,2,0,1,0,2,2,3,1,0,1,1,2,0,0,0,3,1,1,0,0,1,1,2,0,0,1,0,2,0,2,2,1,1,1,2,0,0,1,2,1,1,1,1,1,2,4,0,1,2,0,2,0,1,1,1,2,1,2,3,2,2,0,1,2,2,0,1,0,2,0,0,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,1,1,0,0,0,0,1,0,1,1,0,0,2,0,2,0,0,0,2,0,2,3,1,3,1,0,0,1,0,1,0,1,0,2,1,0,0,1,1,3,1,1,0,3,1,1,0,1,1,2,1,0,2,0,1,2,0,0,0,1,1,0,0,1,2,1,2,0,0,0,1,1,1,0,0,1,1,0,0,0,0,1,0,1,2,0,2,1,1,2,0,2,0,1,2,1,0,0,2,0,0,0,1,4,3,1,0,1,2,0,1,1,2,2,1,0,1,0,0,1,0,4,2,0,1,0,2,2,2,2,1,1,1,0,1,0,2,0,1,0,1,0,1,1,2,1,0,3,0,1,1,1,1,1,2,0,0,0,1,2,1,1,0,2,1,1,0,0,0,2,2,1,0,0,0,0,0,0,1,1,0,0,2,0,0,1,0,2,1,1,0,3,1,1,0,0,1,1,2,0,1,2,1,1,3,0,4,1,1,1,1,1,0,2,0,0,0,1,4,1,0,1,2,1,1,0,1,1,0,1,0,1,2,0,1,1,4,1,0,1,0,1,1,4,0,0,1,0,1,1,0,1,0,0,1,0,2,0,3,0,1,1,1,1,1,0,2,0,3,2,1,1,0,1,0,0,2,0,1,1,2,0,1,1,2,1,0,0,1,1,2,3,1,0,0,2,1,0,0,3,0,0,0,1,1,2,1,1,0,0,0,0,1,0,0,0,1,0,3,1,1,3,1,2,2,0,0,3,0,2,2,2,1,0,1,0,0,0,0,2,1,0,1,6,0,3,2,0,1,0,0,0,1,1,1,0,1,4,1,0,0,3,0,1,1,1,1,1,2,1,0,0,0,1,3,0,1,1,0,0,0,1,1,2,1,1,1,3,1,5,1,2,1,0,1,0,3,1,1,3,0,0,1,0,0,2,0,0,1,1,0,0,0,2,1,0,0,1,1,0,0,1,1,0,2,1,0,0,1,1,0,0,1,0,1,0,2,0,0,1,0,3,1,0,2,1,0,1,2,2,2,0,1,1,0,1,3,0,0,1,1,0,1,2,1,0,0,1,2,3,1,0,1,0,1,1,2,3,1,2,1,2,0,0,1,0,0,1,1,1,2,2,0,0,0,1,0,2,0,0,0,1,0,1,0,2,2,1,2,1,0,1,5,4,1,0,0,1,0,0,0,0,3,1,0,2,1,1,0,3,2,0,2,1,1,1,1,2,0,2,0,2,1,3,1,3,1,1,1,1,0,2,1,2,2,0,2,1,0,0,1,1,0,0,2,1,1,0,0,0,2,0,3,0,2,0,1,1,1,2,1,2,0,1,1,0,2,2,1,2,1,0,1,0,0,0,1,2,2,0,1,2,0,2,1,0,0,0,2,0,2,2,1,1,1,0,1,2,4,2,0,3,1,1,1,1,1,2,2,1,1,0,2,0,0,0,0,1,0,2,3,0,2,0,0,0,0,0,0,3,1,0,0,0,0,4,0,1,0,0,0,1,0,3,0,1,0,1,1,2,3,0,0,3,2,2,1,1,4,0,1,0,1,0,1,1,1,1,0,1,0,0,1,0,2,0,0,2,2,2,1,1,1,2,1,0,4,1,0,0,0,4,2,1,0,0,0,0,1,0,0,2,1,2,1,0,0,1,3,2,0,0,0,1,2,1,1,1,0,0,0,1,0,0,2,0,3,1,1,3,2,1,1,3,1,2,0,0,0,1,1,2,0,2,1,2,1,0,0,0,3,2,0,0,2,2,1,1,0,1,0,2,1,0,0,1,0,0,0,0,1,1,2,0,0,1,0,1,1,0,2,0,2,1,1,1,1,0,1,1,3,1,0,0,0,1,2,2,3,1,2,0,1,0,2,1,4,2,3,1,0,2,0,0,0,1,0,1,2,0,3,2,1,0,1,3,0,1,1,4,1,1,0,0,1,0,1,1,1,0,0,1,0,0,0,2,0,2,1,0,0,2,3,0,2,2,0,4,0,0,0,2,0,0,0,0,2,0,0,1,1,1,0,1,1,0,1,2,2,1,0,1,0,0,2,1,0,0,1,0,2,1,0,1,2,1,0,3,1,2,2,0,1,2,0,1,3,0,1,0,0,0,0,0,2,0,2,2,0,1,3,1,0,3,1,1,1,0,1,1,0,0,2,0,0,0,1,2,1,2,0,2,0,1,3,0,1,1,0,0,0,2,1,1,1,1,2,0,1,2,3,0,0,0,0,1,0,1,3,0,1,1,0,2,0,1,0,0,2,0,1,2,2,1,0,0,0,0,1,0,1,1,0,1,1,2,1,0,0,2,0,1,1,0,1,0,1,0,1,1,2,1,1,1,1,2,1,1,1,0,3,1,3,0,1,1,0,0,1,0,0,0,0,2,1,0,0,0,2,2,0,3,0,0,0,0,2,1,1,0,0,1,1,0,2,0,0,0,2,1,1,1,1,1,1,1,2,3,1,1,1,2,1,0,2,1,2,0,1,3,0,1,5,0,0,3,2,2,0,1,2,3,0,1,1,1,0,0,0,2,1,2,1,1,0,4,0,0,0,1,2,0,3,2,1,1,0,2,2,3,1,2,2,2,1,0,2,1,0,0,0,0,1,0,0,1,2,3,2,1,2,2,2,0,1,3,0,1,0,1,0,1,0,0,1,1,1,2,1,0,1,0,1,1,1,1,1,1,1,0,3,0,0,3,1,1,1,1,2,0,1,3,0,1,1,0,4,0,2,1,1,1,0,0,2,1,0,0,3,1,0,1,1,1,1,3,0,1,1,1,2,3,1,0,2,2,2,2,0,0,3,0,1,2,1,0,0,2,1,2,0,0,3,1,1,2,1,0,4,0,3,3,0,0,0,0,0,2,1,0,0,1,0,1,0,0,0,0,1,1,1,0,1,2,1,0,2,2,1,1,1,1,0,3,1,1,1,2,1,0,0,2,2,0,1,1,1,0,0,1,1,1,2,2,3,1,0,0,2,2,0,0,2,1,1,0,0,1,0,0,0,0,1,0,0,0,1,1,1,0,0,0,0,1,2,1,1,0,0,0,2,1,0,3,1,0,1,1,1,2,0,5,1,1,0,0,1,2,0,0,1,0,2,1,2,0,1,1,0,1,0,2,0,0,1,1,2,0,0,0,1,1,2,2,1,1,0,0,0,2,0,0,1,2,1,1,1,1,0,0,3,0,6,1,2,0,0,0,1,0,1,0,1,2,1,0,1,0,1,0,0,2,0,1,0,0,3,0,1,3,1,0,0,1,2,1,1,0,0,1,1,1,1,1,1,0,1,1,1,0,0,1,0,2,1,0,0,0,0,3,0,0,3,4,0,0,0,0,1,1,1,0,1,1,0,0,1,2,2,0,1,1,0,2,1,1,0,1,1,0,1,0,0,1,0,0,0,1,1,0,1,2,2,0,2,2,0,1,0,1,0,2,0,1,0,1,2,0,0,0,0,2,1,0,1,0,0,0,0,1,1,1,0,0,4,1,3,1,1,0,0,0,0,0,1,4,2,1,0,0,1,1,0,0,1,0,0,2,1,1,0,0,2,1,2,1,2,0,0,0,1,1,3,1,1,2,3,1,0,2,3,2,2,1,3,2,0,0,0,0,2,0,2,0,0,0,1,1,0,0,1,1,1,0,0,3,0,1,1,1,1,1,3,1,0,0,0,2,0,0,0,2,0,1,2,0,1,2,0,0,2,1,1,2,1,2,1,0,2,0,2,0,1,0,2,1,0,2,1,0,1,1,0,2,2,0,2,0,0,0,1,2,4,0,0,0,1,0,1,1,2,1,0,0,0,2,2,1,0,1,1,0,1,3,1,0,0,0,0,2,0,1,2,1,0,0,1,1,1,1,0,3,0,0,2,0,1,4,0,0,1,1,3,1,3,0,0,1,1,1,1,0,1,1,0,0,2,3,0,0,1,1,3,1,0,2,1,0,1,0,1,2,2,0,0,2,0,1,2,1,1,0,0,2,2,1,0,0,0,0,2,0,0,2,0,1,5,1,1,0,3,1,1,0,0,0,3,1,1,0,0,4,4,0,1,2,0,2,1,4,0,0,0,0,3,0,0,1,0,1,3,1,1,1,2,1,2,0,0,0,2,1,1,1,0,0,0,0,1,0,0,1,0,0,2,3,0,0,4,1,0,1,0,2,0,0,1,3,4,2,0,0,0,1,0,1,2,1,0,1,1,0,3,0,3,0,0,0,0,2,0,1,1,0,0,0,0,1,0,1,2,2,1,0]},{"counters":[1,0,1,0,0,1,1,1,1,0,1,1,0,2,0,0,1,1,2,0,2,0,3,1,0,0,1,0,0,1,0,0,2,1,2,2,0,0,1,0,0,2,0,3,0,3,0,2,0,0,0,0,1,1,2,0,0,1,2,0,1,0,1,2,0,2,1,0,1,1,1,1,1,0,2,0,2,1,0,0,0,1,1,1,2,1,0,0,3,1,1,0,4,1,1,1,0,1,0,1,1,1,2,1,2,2,2,1,0,1,0,2,2,1,1,2,0,1,0,1,0,1,0,0,0,2,1,1,3,1,1,0,1,1,1,0,1,1,0,1,1,1,5,3,1,1,1,1,1,0,1,0,0,1,2,0,0,0,0,1,1,0,2,0,3,2,1,2,2,0,0,1,0,1,2,0,1,0,0,0,1,2,1,1,1,0,0,1,0,1,0,1,2,3,1,0,0,0,0,0,0,0,2,0,0,0,0,0,2,1,0,1,0,0,2,1,3,0,0,0,2,0,1,1,0,1,2,2,3,1,1,0,1,0,2,0,2,1,1,0,2,1,0,2,2,0,0,0,2,3,1,1,2,2,0,1,0,2,0,0,2,1,1,2,1,2,0,2,3,1,1,1,1,1,1,2,1,2,0,2,1,2,3,0,4,0,0,1,1,1,0,3,1,0,2,3,2,1,2,0,0,1,1,0,1,2,0,2,1,2,3,0,3,1,3,0,2,0,1,1,1,0,1,2,3,0,0,2,0,0,0,1,1,0,1,1,3,1,0,1,1,1,1,0,1,0,2,0,0,1,0,2,0,0,2,1,0,1,1,0,2,1,1,0,2,2,2,1,1,0,0,1,3,1,2,1,0,2,0,2,3,0,1,0,2,1,1,2,1,0,0,0,1,1,1,0,0,1,1,3,3,1,1,0,0,1,2,1,1,1,0,0,1,0,1,0,2,2,0,2,1,1,2,2,1,0,0,1,0,2,1,0,0,1,1,3,1,0,1,2,0,4,1,2,0,1,2,1,1,0,0,2,1,1,0,1,1,1,1,1,1,0,1,1,2,0,1,1,4,2,4,1,1,3,2,2,1,0,1,0,0,0,1,1,0,1,1,0,1,0,0,0,2,0,2,2,1,1,0,1,0,1,1,0,2,0,1,2,0,0,2,1,2,0,0,0,0,1,2,2,0,1,2,1,0,0,0,0,0,0,0,4,1,1,0,0,0,3,1,2,0,0,0,1,1,1,2,0,2,2,2,1,1,3,2,0,0,0,2,1,0,1,0,1,1,3,1,2,0,0,0,0,2,1,1,0,0,0,0,2,2,0,0,0,2,2,0,2,1,1,0,0,0,0,1,0,2,0,2,1,1,1,1,1,0,1,0,1,0,3,0,1,1,1,0,1,1,4,0,2,2,0,0,2,1,1,0,1,0,2,0,0,1,0,0,0,0,2,0,1,1,0,0,1,0,0,0,1,1,2,2,1,4,1,0,1,3,2,1,1,0,0,1,1,2,1,1,1,1,0,0,0,2,2,1,1,1,2,1,1,0,0,2,1,1,1,1,0,1,1,1,1,0,1,1,0,0,1,1,2,1,2,0,0,2,3,2,2,3,0,0,0,3,2,0,1,0,0,0,0,0,1,1,2,2,1,2,1,1,1,2,0,3,1,1,1,1,1,4,1,0,0,1,1,1,0,0,1,0,0,1,1,1,0,0,2,1,1,1,1,0,2,0,2,1,0,1,2,1,2,0,0,3,5,2,1,0,0,1,4,0,0,0,0,1,0,1,0,1,0,0,1,2,4,1,1,0,2,0,0,2,0,0,2,0,2,1,0,0,0,0,1,1,0,2,2,0,3,0,0,1,1,2,0,0,1,4,2,1,0,1,1,1,5,2,1,3,0,2,1,1,1,0,0,1,0,3,1,3,1,0,0,2,2,0,0,1,2,0,1,1,1,2,0,1,0,1,0,1,2,0,0,1,1,2,0,2,0,1,0,0,0,3,1,2,0,1,1,0,0,0,0,0,1,2,0,1,0,0,2,0,0,0,2,3,0,0,3,2,1,0,0,3,0,1,0,1,0,1,2,0,4,0,2,2,3,1,1,0,0,0,1,1,0,0,0,0,0,2,3,1,1,1,1,0,2,2,2,2,1,1,1,0,2,2,1,0,1,0,2,2,0,0,1,1,2,1,1,0,1,1,0,2,0,1,1,0,2,1,3,2,0,1,1,0,2,0,1,2,1,1,1,1,1,0,1,0,0,1,0,2,1,1,1,1,0,1,1,2,0,1,1,1,2,2,0,2,3,1,1,0,1,2,2,3,1,0,2,2,1,0,2,0,2,0,1,3,0,2,2,1,0,1,1,0,0,0,0,0,0,0,1,1,3,0,0,2,0,1,2,0,2,2,0,0,1,2,0,0,0,2,1,0,0,3,0,3,0,1,0,2,0,0,2,0,1,0,0,1,0,0,3,0,1,0,0,1,0,1,1,0,2,1,0,1,2,2,2,1,1,2,1,0,0,5,0,2,0,0,1,0,0,0,2,2,0,1,2,1,0,1,1,0,2,2,0,1,3,4,0,1,0,1,0,0,0,1,1,3,0,1,0,0,2,1,0,0,1,2,1,2,1,0,2,1,0,3,0,1,1,0,3,0,0,2,3,3,1,0,0,0,1,1,0,0,0,0,1,1,0,0,0,2,0,1,0,0,0,0,1,0,2,0,1,2,0,1,1,0,0,2,0,2,3,1,0,1,0,1,1,2,1,0,1,1,1,0,0,0,2,0,1,1,0,1,2,3,2,0,2,2,0,0,0,0,5,0,0,1,0,1,0,0,1,0,2,0,1,0,1,0,0,1,0,2,2,0,2,0,1,1,1,1,1,0,1,2,1,0,3,1,0,1,0,0,0,3,0,0,0,0,0,1,0,1,2,0,1,1,1,3,0,1,2,1,1,2,1,4,0,1,2,0,1,2,2,1,1,1,0,0,0,0,1,2,1,0,1,4,3,0,0,0,2,2,2,1,1,2,3,1,1,0,1,1,1,3,0,0,0,0,1,0,2,1,0,0,0,1,0,0,0,4,1,1,0,0,2,3,2,1,1,3,0,1,0,2,0,0,0,2,1,1,0,0,0,0,1,1,2,1,2,0,1,0,1,1,0,1,0,1,3,0,0,1,3,1,2,0,0,1,2,0,0,0,1,1,0,0,2,4,0,0,3,0,2,2,3,2,0,0,1,4,0,2,4,2,3,1,1,1,2,0,0,0,0,1,1,2,1,1,1,0,2,0,1,0,0,1,0,0,1,1,1,0,0,0,3,0,2,1,1,0,1,0,0,1,2,1,2,2,0,1,1,0,0,3,0,0,0,2,1,1,0,3,0,0,0,0,3,1,0,1,0,0,0,2,2,3,1,0,0,1,2,1,0,0,1,1,2,1,0,1,1,0,2,3,0,1,2,1,1,0,1,1,1,1,2,0,0,0,1,0,0,4,0,2,0,0,1,1,0,0,1,1,1,2,0,1,0,1,0,0,3,2,1,0,3,2,1,1,0,1,1,1,0,1,1,1,1,1,1,0,0,1,1,1,0,0,2,1,0,2,2,0,1,1,0,1,1,4,1,0,1,2,3,2,2,1,0,1,1,0,0,0,1,1,0,1,1,1,0,2,2,0,0,1,1,0,0,3,1,0,1,0,0,1,0,0,2,1,3,3,0,0,0,0,2,1,1,0,0,1,0,1,0,3,3,0,2,2,0,1,0,2,1,0,1,2,3,1,2,1,0,3,3,0,0,3,1,1,1,1,0,3,0,3,2,0,0,1,2,0,2,1,0,1,2,1,0,0,1,1,0,1,2,0,1,2,2,3,1,1,1,2,1,0,1,0,0,1,1,0,1,2,0,2,1,1,1,2,2,1,0,0,0,0,1,0,0,1,0,0,0,2,1,0,0,2,0,0,1,0,0,2,1,1,0,1,0,1,0,1,1,1,1,2,1,1,2,0,2,2,1,2,0,2,0,0,0,1,0,2,1,1,0,1,0,2,0,1,1,0,2,0,3,0,1,0,2,1,3,0,1,1,1,0,1,1,1,0,2,0,2,0,1,3,2,0,0,0,0,2,1,0,1,0,0,0,1,1,2,1,1,3,0,0,1,0,1,4,0,0,2,2,0,4,0,2,1,1,4,2,0,0,1,1,1,1,0,3,1,1,0,1,1,0,2,1,0,2,1,0,2,2,0,1,3,0,0,1,1,1,1,2,2,0,1,0,0,1,0,0,1,1,2,3,0,2,0,1,0,1,2,1,2,1,0,2,2,1,2,1,0,1,1,1,1,1,0,1,0,1,0,3,1,2,1,0,0,0,2,2,0,0,1,2,0,0,1,0,1,1,4,1,1,0,3,2,2,0,0,0,1,1,0,0,2,0,0,2,0,0,0,0,0,0,1,1,0,1,0,0,0,2,0,2,1,0,1,0,0,2,1,0,0,0,0,1,1,2,1,1,2,1,0,2,1,2,1,0,1,2,2,1,1,0,1,2,3,1,1,0,1,0,2,2,0,1,0,0,0,1,0,2,2,0,2,2,0,1,2,0,1,2,1,2,1,1,1,0,0,0,2,0,0,1,0]},{"counters":[2,0,0,1,2,1,1,0,0,1,1,0,1,1,1,2,0,1,1,1,0,0,1,2,2,0,2,1,0,0,0,1,1,1,1,2,2,0,2,1,2,1,1,3,0,1,1,1,2,0,1,0,0,1,1,1,2,1,0,1,1,1,2,1,0,0,2,0,0,3,1,1,0,0,4,2,2,0,2,0,0,0,1,0,0,0,0,1,1,0,2,1,0,1,0,1,1,3,1,0,0,1,0,2,0,1,1,0,2,1,0,3,1,2,1,0,0,0,0,1,0,1,1,1,3,0,1,1,1,2,0,2,1,0,0,0,1,1,1,0,0,1,2,2,0,0,1,0,0,2,0,2,2,2,0,0,0,1,2,1,3,0,2,0,2,1,1,0,0,2,0,0,0,0,1,1,1,0,0,0,1,2,2,0,0,1,1,1,1,1,1,2,0,1,1,3,1,1,1,0,1,1,2,0,2,0,0,1,0,1,1,2,1,2,0,1,0,0,1,1,2,0,0,0,0,3,0,0,0,1,0,0,0,1,2,0,1,0,1,1,0,0,1,0,1,0,1,0,1,1,1,1,1,1,3,1,0,1,1,2,0,0,1,0,3,0,2,1,3,3,2,1,0,1,1,0,1,0,1,2,1,2,1,2,1,1,2,1,1,1,1,1,0,1,2,1,3,0,3,0,1,0,1,0,0,0,0,0,0,0,1,0,2,1,0,1,0,2,0,0,1,0,1,0,0,0,2,2,0,0,2,1,1,3,0,0,1,2,3,1,0,0,2,0,1,2,0,0,0,1,0,0,0,1,2,2,0,1,0,1,0,1,0,0,1,2,0,1,0,1,0,1,1,0,0,1,0,1,1,0,2,2,2,1,0,2,1,5,0,0,1,1,1,2,2,0,2,1,1,1,2,1,0,1,1,0,2,0,0,0,1,2,2,1,1,0,1,1,0,1,0,1,1,2,0,2,1,0,1,0,0,2,0,2,2,1,2,0,2,1,0,0,0,1,0,0,0,0,0,0,2,0,1,1,3,2,0,0,3,1,0,2,0,0,1,2,0,0,0,0,2,1,1,2,2,3,1,1,1,2,2,0,2,1,0,1,0,0,1,2,1,0,0,2,1,2,0,3,1,1,2,0,1,0,0,0,3,2,0,0,0,1,1,0,0,1,1,1,0,0,0,0,1,2,0,0,1,1,0,1,1,1,1,4,1,2,2,0,3,1,0,0,1,2,1,2,2,3,3,0,2,0,3,0,1,1,0,1,0,1,1,0,1,0,0,1,3,1,0,0,2,0,0,0,0,0,0,1,1,1,2,2,1,0,0,1,0,0,1,0,2,2,1,1,0,1,1,3,1,3,4,0,1,1,1,0,0,0,0,1,0,1,2,2,1,0,0,0,1,0,2,1,0,1,0,2,3,3,2,1,2,0,0,1,1,1,1,0,1,2,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,1,3,0,0,0,1,1,3,0,1,1,1,1,2,0,0,1,2,1,1,0,1,1,1,3,0,1,0,1,1,3,1,1,0,1,0,0,0,0,1,3,0,1,0,0,2,4,1,2,0,1,2,2,1,4,1,0,1,1,2,0,1,0,0,0,0,0,1,0,1,3,0,1,3,0,2,0,1,3,0,0,0,0,1,1,1,2,1,1,0,2,2,3,1,2,1,1,0,1,2,1,0,0,1,0,3,1,1,0,3,1,0,1,2,1,1,2,2,1,0,1,0,0,1,0,0,1,1,0,0,0,2,1,0,0,1,1,2,0,2,0,2,1,0,1,1,0,0,0,0,0,0,2,1,3,0,0,1,0,1,1,1,2,1,0,1,2,3,0,0,2,1,2,0,2,0,3,0,2,1,0,1,1,0,2,1,0,1,0,1,1,2,0,1,1,2,0,0,3,1,1,3,1,0,0,0,1,2,1,1,2,1,2,1,1,2,1,1,2,1,2,0,2,1,1,0,0,2,3,1,0,0,3,0,2,1,3,0,0,2,0,1,3,0,0,0,1,2,0,1,1,0,0,1,0,2,1,0,0,1,2,1,2,1,5,1,1,1,1,1,0,2,3,1,1,0,2,1,1,0,1,1,1,1,1,1,0,1,1,1,0,0,0,1,1,1,1,1,0,2,0,1,0,0,0,2,0,2,0,2,0,2,1,4,1,1,0,1,0,1,0,3,1,2,1,1,1,2,0,0,1,1,2,0,2,1,1,0,1,0,0,0,3,1,1,2,4,1,1,1,0,1,0,2,2,2,2,0,0,0,0,3,2,0,1,1,0,2,1,1,0,0,2,2,2,0,1,2,3,0,1,0,0,0,2,0,1,2,4,1,1,4,2,0,1,1,2,1,0,2,0,1,0,2,2,1,1,2,0,0,1,1,1,3,0,2,0,2,0,2,1,0,1,2,0,0,0,3,0,1,1,1,1,1,1,1,1,2,1,0,2,0,1,1,1,1,0,2,1,0,0,1,0,0,0,0,1,0,1,1,1,1,2,1,0,1,0,4,0,0,0,4,3,0,1,2,0,0,0,0,1,1,1,2,1,1,1,0,1,0,1,0,0,0,1,0,2,0,0,1,0,0,0,1,1,1,0,3,1,4,0,0,2,1,0,0,1,0,3,0,0,0,0,0,1,0,0,2,0,3,2,0,0,0,2,0,1,0,2,1,1,1,0,2,1,4,2,1,0,1,1,1,0,1,1,1,2,1,0,0,4,0,2,0,1,1,0,1,1,1,2,2,1,0,0,0,0,1,0,2,2,1,1,1,1,1,1,0,1,3,1,2,0,0,3,1,0,1,0,1,1,2,0,0,4,2,3,1,1,0,1,1,1,0,2,2,2,0,1,0,0,2,1,1,1,0,3,4,1,1,0,0,0,2,1,1,2,0,0,1,1,0,0,1,0,1,1,0,0,1,1,2,0,0,2,1,1,0,0,2,1,1,1,2,0,1,0,1,0,2,0,0,0,0,2,1,2,2,0,2,4,1,1,1,0,0,1,1,0,2,0,0,1,2,1,2,1,1,0,3,0,0,0,0,2,0,0,3,0,1,2,1,1,2,2,1,1,0,0,0,0,1,0,0,3,1,1,1,1,0,0,0,1,0,1,1,1,4,2,1,0,1,3,1,2,0,1,1,0,1,5,1,0,2,3,3,0,0,0,0,0,1,2,0,1,0,2,1,3,3,1,2,1,0,2,1,2,1,2,3,0,1,3,2,3,0,0,0,1,0,0,2,1,0,0,0,0,0,1,0,3,1,3,0,2,1,1,1,3,1,1,0,1,2,0,2,0,2,1,2,0,3,1,1,1,1,0,0,0,1,1,1,1,1,1,0,1,0,0,0,1,0,2,1,1,0,1,1,0,0,2,2,5,2,0,0,0,0,2,0,0,1,0,2,1,0,0,2,1,2,1,2,0,2,1,1,0,0,0,0,1,0,1,2,5,1,3,1,0,1,0,0,1,3,0,0,0,0,0,0,2,1,0,0,2,1,1,2,1,2,0,0,1,1,3,2,0,2,1,2,2,1,0,1,0,0,0,1,0,0,2,3,1,2,0,1,2,1,1,1,0,2,1,0,1,0,0,2,1,0,1,3,0,0,0,0,0,0,0,0,2,2,1,0,0,0,2,2,0,1,0,0,2,0,0,1,1,2,1,1,1,1,2,1,0,0,1,1,1,1,2,1,1,1,2,0,1,1,1,0,4,1,0,0,3,2,0,0,0,0,2,1,0,0,0,0,1,1,0,0,1,1,1,2,1,1,1,1,2,1,0,0,0,2,0,0,2,2,0,0,0,1,0,1,2,0,0,2,0,1,2,0,2,0,1,1,1,1,0,4,2,2,1,2,0,0,0,1,0,0,0,2,0,1,1,1,1,0,1,1,2,0,2,1,1,1,0,1,0,2,2,1,1,0,2,2,3,0,0,2,2,3,2,1,1,0,0,0,2,0,2,2,0,0,3,1,0,0,1,0,2,0,0,1,1,2,0,1,4,1,0,0,0,1,0,2,2,2,0,1,1,0,2,0,2,3,1,0,2,0,2,1,1,2,0,3,1,3,0,1,0,0,1,1,0,0,1,0,1,3,0,2,1,0,2,1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,2,0,3,0,0,2,1,2,1,1,0,1,1,1,0,2,3,0,3,0,1,0,2,3,2,0,1,1,2,3,3,1,1,0,0,0,0,0,1,2,1,2,1,0,0,1,0,0,0,1,0,0,0,1,1,0,0,1,1,3,0,2,1,0,1,1,1,0,1,2,0,3,1,1,1,3,2,3,1,0,2,1,1,0,2,1,0,3,2,1,2,0,1,0,2,1,2,3,1,0,1,1,3,0,1,3,0,0,0,1,2,2,2,0,2,2,0,3,1,1,0,0,3,1,2,0,0,1,2,0,1,0,1,0,0,2,0,2,1,1,1,0,2,2,0,0,0,1,0,0,1,0,1,2,0,2,0,1,1,3,0,3,3,1,1,1,0,2,0,0,0,0,0,1,0,2,1,2,0,0,2,2,1,1,1,2,0,0,0,2,1,0,0,0,0,1,2,3,1,1,2,0,1]}]},"null_count":0,"last_update_version":397952032098222080},"t":{"histogram":{"ndv":1999,"buckets":[{"count":8,"lower_bound":"A4AAAABYGBV1","upper_bound":"A4AAAABYGCUI","repeats":1},{"count":16,"lower_bound":"A4AAAABYGCZo","upper_bound":"A4AAAABYGDQI","repeats":1},{"count":24,"lower_bound":"A4AAAABYGDTT","upper_bound":"A4AAAABYGE2W","repeats":1},{"count":32,"lower_bound":"A4AAAABYGFji","upper_bound":"A4AAAABYGGsg","repeats":1},{"count":40,"lower_bound":"A4AAAABYGGsl","upper_bound":"A4AAAABYGHfV","repeats":1},{"count":48,"lower_bound":"A4AAAABYGHly","upper_bound":"A4AAAABYGINg","repeats":1},{"count":56,"lower_bound":"A4AAAABYGIOU","upper_bound":"A4AAAABYGJaW","repeats":1},{"count":64,"lower_bound":"A4AAAABYGJea","upper_bound":"A4AAAABYGKFM","repeats":1},{"count":72,"lower_bound":"A4AAAABYGKSd","upper_bound":"A4AAAABYGLBh","repeats":1},{"count":80,"lower_bound":"A4AAAABYGLDN","upper_bound":"A4AAAABYGLzD","repeats":1},{"count":88,"lower_bound":"A4AAAABYGL49","upper_bound":"A4AAAABYGNjb","repeats":1},{"count":96,"lower_bound":"A4AAAABYGNv6","upper_bound":"A4AAAABYGP7k","repeats":1},{"count":104,"lower_bound":"A4AAAABYGP+T","upper_bound":"A4AAAABYGQ71","repeats":1},{"count":112,"lower_bound":"A4AAAABYGQ/o","upper_bound":"A4AAAABYGRqs","repeats":1},{"count":120,"lower_bound":"A4AAAABYGRt1","upper_bound":"A4AAAABYGUBV","repeats":1},{"count":128,"lower_bound":"A4AAAABYGUFN","upper_bound":"A4AAAABYGVD3","repeats":1},{"count":136,"lower_bound":"A4AAAABYGVai","upper_bound":"A4AAAABYGWg/","repeats":1},{"count":144,"lower_bound":"A4AAAABYGWmU","upper_bound":"A4AAAABYGYFB","repeats":1},{"count":152,"lower_bound":"A4AAAABYGYNS","upper_bound":"A4AAAABYGZVq","repeats":1},{"count":160,"lower_bound":"A4AAAABYGZmp","upper_bound":"A4AAAABYGadb","repeats":1},{"count":168,"lower_bound":"A4AAAABYGakO","upper_bound":"A4AAAABYGcG/","repeats":1},{"count":176,"lower_bound":"A4AAAABYGcND","upper_bound":"A4AAAABYGdSL","repeats":1},{"count":184,"lower_bound":"A4AAAABYGdi9","upper_bound":"A4AAAABYGejG","repeats":1},{"count":192,"lower_bound":"A4AAAABYGel+","upper_bound":"A4AAAABYGf5T","repeats":1},{"count":200,"lower_bound":"A4AAAABYGgXK","upper_bound":"A4AAAABYGgzi","repeats":1},{"count":208,"lower_bound":"A4AAAABYGg1V","upper_bound":"A4AAAABYGh9K","repeats":1},{"count":216,"lower_bound":"A4AAAABYGiIH","upper_bound":"A4AAAABYGjWV","repeats":1},{"count":224,"lower_bound":"A4AAAABYGjXS","upper_bound":"A4AAAABYGknP","repeats":1},{"count":232,"lower_bound":"A4AAAABYGkxc","upper_bound":"A4AAAABYGljx","repeats":1},{"count":240,"lower_bound":"A4AAAABYGlpS","upper_bound":"A4AAAABYGm3O","repeats":1},{"count":248,"lower_bound":"A4AAAABYGnH6","upper_bound":"A4AAAABYGn5+","repeats":1},{"count":256,"lower_bound":"A4AAAABYGoHb","upper_bound":"A4AAAABYGpWe","repeats":1},{"count":264,"lower_bound":"A4AAAABYGpXg","upper_bound":"A4AAAABYGqsB","repeats":1},{"count":272,"lower_bound":"A4AAAABYGqsQ","upper_bound":"A4AAAABYGsfK","repeats":1},{"count":280,"lower_bound":"A4AAAABYGsmO","upper_bound":"A4AAAABYGtRg","repeats":1},{"count":288,"lower_bound":"A4AAAABYGtjF","upper_bound":"A4AAAABYGuIo","repeats":1},{"count":296,"lower_bound":"A4AAAABYGuKi","upper_bound":"A4AAAABYGu2g","repeats":1},{"count":304,"lower_bound":"A4AAAABYGvbK","upper_bound":"A4AAAABYGwfC","repeats":1},{"count":312,"lower_bound":"A4AAAABYGwi8","upper_bound":"A4AAAABYGw9M","repeats":1},{"count":320,"lower_bound":"A4AAAABYGw/d","upper_bound":"A4AAAABYGx8h","repeats":1},{"count":328,"lower_bound":"A4AAAABYGyAv","upper_bound":"A4AAAABYGyr4","repeats":1},{"count":336,"lower_bound":"A4AAAABYGyuB","upper_bound":"A4AAAABYGzYV","repeats":1},{"count":344,"lower_bound":"A4AAAABYGzq/","upper_bound":"A4AAAABYG05f","repeats":1},{"count":352,"lower_bound":"A4AAAABYG1Ci","upper_bound":"A4AAAABYG11R","repeats":1},{"count":360,"lower_bound":"A4AAAABYG1/a","upper_bound":"A4AAAABYG2jy","repeats":1},{"count":368,"lower_bound":"A4AAAABYG2kX","upper_bound":"A4AAAABYG3s+","repeats":1},{"count":376,"lower_bound":"A4AAAABYG3wo","upper_bound":"A4AAAABYG4iL","repeats":1},{"count":384,"lower_bound":"A4AAAABYG4lV","upper_bound":"A4AAAABYG5aR","repeats":1},{"count":392,"lower_bound":"A4AAAABYG5bJ","upper_bound":"A4AAAABYG6jL","repeats":1},{"count":400,"lower_bound":"A4AAAABYG6jN","upper_bound":"A4AAAABYG7Ls","repeats":1},{"count":408,"lower_bound":"A4AAAABYG7iX","upper_bound":"A4AAAABYG8Hn","repeats":1},{"count":416,"lower_bound":"A4AAAABYG8TR","upper_bound":"A4AAAABYG9e3","repeats":1},{"count":424,"lower_bound":"A4AAAABYG9lr","upper_bound":"A4AAAABYG+ig","repeats":1},{"count":432,"lower_bound":"A4AAAABYG+1I","upper_bound":"A4AAAABYG/yQ","repeats":1},{"count":440,"lower_bound":"A4AAAABYG/6e","upper_bound":"A4AAAABYHAbp","repeats":1},{"count":448,"lower_bound":"A4AAAABYHAgC","upper_bound":"A4AAAABYHBgQ","repeats":1},{"count":456,"lower_bound":"A4AAAABYHBm2","upper_bound":"A4AAAABYHCOl","repeats":1},{"count":464,"lower_bound":"A4AAAABYHCSL","upper_bound":"A4AAAABYHDSR","repeats":1},{"count":472,"lower_bound":"A4AAAABYHDVM","upper_bound":"A4AAAABYHEgf","repeats":1},{"count":480,"lower_bound":"A4AAAABYHEna","upper_bound":"A4AAAABYHGb3","repeats":1},{"count":488,"lower_bound":"A4AAAABYHGdV","upper_bound":"A4AAAABYHHT5","repeats":1},{"count":496,"lower_bound":"A4AAAABYHHcF","upper_bound":"A4AAAABYHIKR","repeats":1},{"count":504,"lower_bound":"A4AAAABYHITe","upper_bound":"A4AAAABYHI0O","repeats":1},{"count":512,"lower_bound":"A4AAAABYHI7r","upper_bound":"A4AAAABYHK6C","repeats":1},{"count":520,"lower_bound":"A4AAAABYHK8F","upper_bound":"A4AAAABYHNAt","repeats":1},{"count":528,"lower_bound":"A4AAAABYHNEL","upper_bound":"A4AAAABYHNci","repeats":1},{"count":536,"lower_bound":"A4AAAABYHNmD","upper_bound":"A4AAAABYHOL7","repeats":1},{"count":544,"lower_bound":"A4AAAABYHOXt","upper_bound":"A4AAAABYHPDO","repeats":1},{"count":552,"lower_bound":"A4AAAABYHPHy","upper_bound":"A4AAAABYHQBT","repeats":1},{"count":560,"lower_bound":"A4AAAABYHQJ4","upper_bound":"A4AAAABYHSmC","repeats":1},{"count":568,"lower_bound":"A4AAAABYHS/R","upper_bound":"A4AAAABYHT8z","repeats":1},{"count":576,"lower_bound":"A4AAAABYHUPO","upper_bound":"A4AAAABYHVYQ","repeats":1},{"count":584,"lower_bound":"A4AAAABYHVcT","upper_bound":"A4AAAABYHWBA","repeats":1},{"count":592,"lower_bound":"A4AAAABYHWF+","upper_bound":"A4AAAABYHW2E","repeats":1},{"count":600,"lower_bound":"A4AAAABYHXF7","upper_bound":"A4AAAABYHYKz","repeats":1},{"count":608,"lower_bound":"A4AAAABYHYYN","upper_bound":"A4AAAABYHZkO","repeats":1},{"count":616,"lower_bound":"A4AAAABYHaNI","upper_bound":"A4AAAABYHb75","repeats":1},{"count":624,"lower_bound":"A4AAAABYHb/h","upper_bound":"A4AAAABYHcw7","repeats":1},{"count":632,"lower_bound":"A4AAAABYHcyY","upper_bound":"A4AAAABYHeQ4","repeats":1},{"count":640,"lower_bound":"A4AAAABYHeT9","upper_bound":"A4AAAABYHe+n","repeats":1},{"count":648,"lower_bound":"A4AAAABYHfM6","upper_bound":"A4AAAABYHgZt","repeats":1},{"count":656,"lower_bound":"A4AAAABYHglG","upper_bound":"A4AAAABYHiV+","repeats":1},{"count":664,"lower_bound":"A4AAAABYHibK","upper_bound":"A4AAAABYHjMZ","repeats":1},{"count":672,"lower_bound":"A4AAAABYHjhr","upper_bound":"A4AAAABYHk6O","repeats":1},{"count":680,"lower_bound":"A4AAAABYHk91","upper_bound":"A4AAAABYHl9g","repeats":1},{"count":688,"lower_bound":"A4AAAABYHl+o","upper_bound":"A4AAAABYHmly","repeats":1},{"count":696,"lower_bound":"A4AAAABYHmr4","upper_bound":"A4AAAABYHnxW","repeats":1},{"count":704,"lower_bound":"A4AAAABYHnzy","upper_bound":"A4AAAABYHpRu","repeats":1},{"count":712,"lower_bound":"A4AAAABYHpWP","upper_bound":"A4AAAABYHq6x","repeats":1},{"count":720,"lower_bound":"A4AAAABYHrO+","upper_bound":"A4AAAABYHr6l","repeats":1},{"count":728,"lower_bound":"A4AAAABYHr+R","upper_bound":"A4AAAABYHsze","repeats":1},{"count":736,"lower_bound":"A4AAAABYHtKK","upper_bound":"A4AAAABYHuLw","repeats":1},{"count":744,"lower_bound":"A4AAAABYHuNr","upper_bound":"A4AAAABYHvNH","repeats":1},{"count":752,"lower_bound":"A4AAAABYHvif","upper_bound":"A4AAAABYHxCA","repeats":1},{"count":760,"lower_bound":"A4AAAABYHxE5","upper_bound":"A4AAAABYHyAw","repeats":1},{"count":768,"lower_bound":"A4AAAABYHyK/","upper_bound":"A4AAAABYHyyu","repeats":1},{"count":776,"lower_bound":"A4AAAABYHy4m","upper_bound":"A4AAAABYH0Cb","repeats":1},{"count":784,"lower_bound":"A4AAAABYH0Fd","upper_bound":"A4AAAABYH1hM","repeats":1},{"count":792,"lower_bound":"A4AAAABYH1zv","upper_bound":"A4AAAABYH27S","repeats":1},{"count":800,"lower_bound":"A4AAAABYH27f","upper_bound":"A4AAAABYH33P","repeats":1},{"count":808,"lower_bound":"A4AAAABYH36I","upper_bound":"A4AAAABYH4ol","repeats":1},{"count":816,"lower_bound":"A4AAAABYH4pr","upper_bound":"A4AAAABYH5T9","repeats":1},{"count":824,"lower_bound":"A4AAAABYH5oN","upper_bound":"A4AAAABYH69F","repeats":1},{"count":832,"lower_bound":"A4AAAABYH69L","upper_bound":"A4AAAABYH7xr","repeats":1},{"count":840,"lower_bound":"A4AAAABYH7yf","upper_bound":"A4AAAABYH9i9","repeats":1},{"count":848,"lower_bound":"A4AAAABYH90S","upper_bound":"A4AAAABYH/Uv","repeats":1},{"count":856,"lower_bound":"A4AAAABYH/V8","upper_bound":"A4AAAABYIANU","repeats":1},{"count":864,"lower_bound":"A4AAAABYIAQM","upper_bound":"A4AAAABYIBfP","repeats":1},{"count":872,"lower_bound":"A4AAAABYIBpP","upper_bound":"A4AAAABYIDKp","repeats":1},{"count":880,"lower_bound":"A4AAAABYIDNG","upper_bound":"A4AAAABYIEXb","repeats":1},{"count":888,"lower_bound":"A4AAAABYIEZ5","upper_bound":"A4AAAABYIE5w","repeats":1},{"count":896,"lower_bound":"A4AAAABYIFLw","upper_bound":"A4AAAABYIHH2","repeats":1},{"count":904,"lower_bound":"A4AAAABYIHTe","upper_bound":"A4AAAABYIID2","repeats":1},{"count":912,"lower_bound":"A4AAAABYIIEA","upper_bound":"A4AAAABYIJmZ","repeats":1},{"count":920,"lower_bound":"A4AAAABYIJqu","upper_bound":"A4AAAABYIKcY","repeats":1},{"count":928,"lower_bound":"A4AAAABYIKpc","upper_bound":"A4AAAABYIMAX","repeats":1},{"count":936,"lower_bound":"A4AAAABYIMDK","upper_bound":"A4AAAABYINCh","repeats":1},{"count":944,"lower_bound":"A4AAAABYINUt","upper_bound":"A4AAAABYIOUU","repeats":1},{"count":952,"lower_bound":"A4AAAABYIOeX","upper_bound":"A4AAAABYIPms","repeats":1},{"count":960,"lower_bound":"A4AAAABYIPoT","upper_bound":"A4AAAABYIQ/q","repeats":1},{"count":968,"lower_bound":"A4AAAABYIRJX","upper_bound":"A4AAAABYISP+","repeats":1},{"count":976,"lower_bound":"A4AAAABYISTQ","upper_bound":"A4AAAABYITPA","repeats":1},{"count":984,"lower_bound":"A4AAAABYITd7","upper_bound":"A4AAAABYIUtL","repeats":1},{"count":992,"lower_bound":"A4AAAABYIU4d","upper_bound":"A4AAAABYIVWK","repeats":1},{"count":1000,"lower_bound":"A4AAAABYIVrO","upper_bound":"A4AAAABYIWXT","repeats":1},{"count":1008,"lower_bound":"A4AAAABYIWc+","upper_bound":"A4AAAABYIXTq","repeats":1},{"count":1016,"lower_bound":"A4AAAABYIXVr","upper_bound":"A4AAAABYIX/j","repeats":1},{"count":1024,"lower_bound":"A4AAAABYIYDo","upper_bound":"A4AAAABYIY/h","repeats":1},{"count":1032,"lower_bound":"A4AAAABYIZEq","upper_bound":"A4AAAABYIabk","repeats":1},{"count":1040,"lower_bound":"A4AAAABYIamo","upper_bound":"A4AAAABYIcXL","repeats":1},{"count":1048,"lower_bound":"A4AAAABYIcXn","upper_bound":"A4AAAABYIc5p","repeats":1},{"count":1056,"lower_bound":"A4AAAABYIc+n","upper_bound":"A4AAAABYIeU8","repeats":1},{"count":1064,"lower_bound":"A4AAAABYIep4","upper_bound":"A4AAAABYIgGD","repeats":1},{"count":1072,"lower_bound":"A4AAAABYIgJb","upper_bound":"A4AAAABYIhhw","repeats":1},{"count":1080,"lower_bound":"A4AAAABYIh3W","upper_bound":"A4AAAABYIiz5","repeats":1},{"count":1088,"lower_bound":"A4AAAABYIi3j","upper_bound":"A4AAAABYIjWQ","repeats":1},{"count":1096,"lower_bound":"A4AAAABYIjg+","upper_bound":"A4AAAABYIke1","repeats":1},{"count":1104,"lower_bound":"A4AAAABYIkhY","upper_bound":"A4AAAABYIk9q","repeats":1},{"count":1112,"lower_bound":"A4AAAABYIlA5","upper_bound":"A4AAAABYImGY","repeats":1},{"count":1120,"lower_bound":"A4AAAABYImIO","upper_bound":"A4AAAABYImyW","repeats":1},{"count":1128,"lower_bound":"A4AAAABYInrC","upper_bound":"A4AAAABYIo4T","repeats":1},{"count":1136,"lower_bound":"A4AAAABYIo9f","upper_bound":"A4AAAABYIqIj","repeats":1},{"count":1144,"lower_bound":"A4AAAABYIqJK","upper_bound":"A4AAAABYIrJX","repeats":1},{"count":1152,"lower_bound":"A4AAAABYIrWa","upper_bound":"A4AAAABYIsJ3","repeats":1},{"count":1160,"lower_bound":"A4AAAABYIsUr","upper_bound":"A4AAAABYItJC","repeats":1},{"count":1168,"lower_bound":"A4AAAABYItNA","upper_bound":"A4AAAABYIuoq","repeats":1},{"count":1176,"lower_bound":"A4AAAABYIupB","upper_bound":"A4AAAABYIvk2","repeats":1},{"count":1184,"lower_bound":"A4AAAABYIvm9","upper_bound":"A4AAAABYIwYL","repeats":1},{"count":1192,"lower_bound":"A4AAAABYIwZr","upper_bound":"A4AAAABYIxUz","repeats":1},{"count":1200,"lower_bound":"A4AAAABYIxqL","upper_bound":"A4AAAABYIylo","repeats":1},{"count":1208,"lower_bound":"A4AAAABYIylu","upper_bound":"A4AAAABYIzbl","repeats":1},{"count":1216,"lower_bound":"A4AAAABYIzfV","upper_bound":"A4AAAABYI0m9","repeats":1},{"count":1224,"lower_bound":"A4AAAABYI0r4","upper_bound":"A4AAAABYI1P8","repeats":1},{"count":1232,"lower_bound":"A4AAAABYI1Rf","upper_bound":"A4AAAABYI10l","repeats":1},{"count":1240,"lower_bound":"A4AAAABYI13g","upper_bound":"A4AAAABYI2ot","repeats":1},{"count":1248,"lower_bound":"A4AAAABYI23v","upper_bound":"A4AAAABYI4T/","repeats":1},{"count":1256,"lower_bound":"A4AAAABYI4WO","upper_bound":"A4AAAABYI5p7","repeats":1},{"count":1264,"lower_bound":"A4AAAABYI5sP","upper_bound":"A4AAAABYI6xq","repeats":1},{"count":1272,"lower_bound":"A4AAAABYI63N","upper_bound":"A4AAAABYI8T7","repeats":1},{"count":1280,"lower_bound":"A4AAAABYI8Um","upper_bound":"A4AAAABYI9Mc","repeats":1},{"count":1288,"lower_bound":"A4AAAABYI9No","upper_bound":"A4AAAABYI95Z","repeats":1},{"count":1296,"lower_bound":"A4AAAABYI95n","upper_bound":"A4AAAABYI+TZ","repeats":1},{"count":1304,"lower_bound":"A4AAAABYI+Uq","upper_bound":"A4AAAABYI/+3","repeats":1},{"count":1312,"lower_bound":"A4AAAABYJALi","upper_bound":"A4AAAABYJBKa","repeats":1},{"count":1320,"lower_bound":"A4AAAABYJBo1","upper_bound":"A4AAAABYJCIs","repeats":1},{"count":1328,"lower_bound":"A4AAAABYJCRJ","upper_bound":"A4AAAABYJDQz","repeats":1},{"count":1336,"lower_bound":"A4AAAABYJDse","upper_bound":"A4AAAABYJEZj","repeats":1},{"count":1344,"lower_bound":"A4AAAABYJEa5","upper_bound":"A4AAAABYJFI4","repeats":1},{"count":1352,"lower_bound":"A4AAAABYJFRY","upper_bound":"A4AAAABYJGOV","repeats":1},{"count":1360,"lower_bound":"A4AAAABYJGTK","upper_bound":"A4AAAABYJHVR","repeats":1},{"count":1368,"lower_bound":"A4AAAABYJHVd","upper_bound":"A4AAAABYJIw/","repeats":1},{"count":1376,"lower_bound":"A4AAAABYJI1g","upper_bound":"A4AAAABYJKFU","repeats":1},{"count":1384,"lower_bound":"A4AAAABYJKMS","upper_bound":"A4AAAABYJKu7","repeats":1},{"count":1392,"lower_bound":"A4AAAABYJKyJ","upper_bound":"A4AAAABYJMQJ","repeats":1},{"count":1400,"lower_bound":"A4AAAABYJMgx","upper_bound":"A4AAAABYJM9N","repeats":1},{"count":1408,"lower_bound":"A4AAAABYJNDU","upper_bound":"A4AAAABYJNc8","repeats":1},{"count":1416,"lower_bound":"A4AAAABYJNe2","upper_bound":"A4AAAABYJOTa","repeats":1},{"count":1424,"lower_bound":"A4AAAABYJOXB","upper_bound":"A4AAAABYJPbc","repeats":1},{"count":1432,"lower_bound":"A4AAAABYJPjf","upper_bound":"A4AAAABYJQMP","repeats":1},{"count":1440,"lower_bound":"A4AAAABYJQR8","upper_bound":"A4AAAABYJRaZ","repeats":1},{"count":1448,"lower_bound":"A4AAAABYJRef","upper_bound":"A4AAAABYJSMY","repeats":1},{"count":1456,"lower_bound":"A4AAAABYJSOK","upper_bound":"A4AAAABYJTN4","repeats":1},{"count":1464,"lower_bound":"A4AAAABYJTPZ","upper_bound":"A4AAAABYJUNu","repeats":1},{"count":1472,"lower_bound":"A4AAAABYJUfG","upper_bound":"A4AAAABYJVvJ","repeats":1},{"count":1480,"lower_bound":"A4AAAABYJWIW","upper_bound":"A4AAAABYJW8A","repeats":1},{"count":1488,"lower_bound":"A4AAAABYJW/d","upper_bound":"A4AAAABYJX88","repeats":1},{"count":1496,"lower_bound":"A4AAAABYJYju","upper_bound":"A4AAAABYJZKv","repeats":1},{"count":1504,"lower_bound":"A4AAAABYJZSL","upper_bound":"A4AAAABYJaUC","repeats":1},{"count":1512,"lower_bound":"A4AAAABYJaVm","upper_bound":"A4AAAABYJa41","repeats":1},{"count":1520,"lower_bound":"A4AAAABYJa6Z","upper_bound":"A4AAAABYJco4","repeats":1},{"count":1528,"lower_bound":"A4AAAABYJct8","upper_bound":"A4AAAABYJd3j","repeats":1},{"count":1536,"lower_bound":"A4AAAABYJd9X","upper_bound":"A4AAAABYJflq","repeats":1},{"count":1544,"lower_bound":"A4AAAABYJf8A","upper_bound":"A4AAAABYJg1a","repeats":1},{"count":1552,"lower_bound":"A4AAAABYJg11","upper_bound":"A4AAAABYJicN","repeats":1},{"count":1560,"lower_bound":"A4AAAABYJio5","upper_bound":"A4AAAABYJjco","repeats":1},{"count":1568,"lower_bound":"A4AAAABYJjil","upper_bound":"A4AAAABYJkSD","repeats":1},{"count":1576,"lower_bound":"A4AAAABYJkSu","upper_bound":"A4AAAABYJlQW","repeats":1},{"count":1584,"lower_bound":"A4AAAABYJlU/","upper_bound":"A4AAAABYJl+q","repeats":1},{"count":1592,"lower_bound":"A4AAAABYJmBq","upper_bound":"A4AAAABYJmrn","repeats":1},{"count":1600,"lower_bound":"A4AAAABYJmvM","upper_bound":"A4AAAABYJnjd","repeats":1},{"count":1608,"lower_bound":"A4AAAABYJnkV","upper_bound":"A4AAAABYJoSo","repeats":1},{"count":1616,"lower_bound":"A4AAAABYJoaY","upper_bound":"A4AAAABYJpTr","repeats":1},{"count":1624,"lower_bound":"A4AAAABYJpt/","upper_bound":"A4AAAABYJqee","repeats":1},{"count":1632,"lower_bound":"A4AAAABYJqfZ","upper_bound":"A4AAAABYJrD6","repeats":1},{"count":1640,"lower_bound":"A4AAAABYJrLU","upper_bound":"A4AAAABYJsbJ","repeats":1},{"count":1648,"lower_bound":"A4AAAABYJsmn","upper_bound":"A4AAAABYJt9o","repeats":1},{"count":1656,"lower_bound":"A4AAAABYJuHp","upper_bound":"A4AAAABYJuy1","repeats":1},{"count":1664,"lower_bound":"A4AAAABYJu4x","upper_bound":"A4AAAABYJvxT","repeats":1},{"count":1672,"lower_bound":"A4AAAABYJwDa","upper_bound":"A4AAAABYJwif","repeats":1},{"count":1680,"lower_bound":"A4AAAABYJwpg","upper_bound":"A4AAAABYJxRq","repeats":1},{"count":1688,"lower_bound":"A4AAAABYJxR2","upper_bound":"A4AAAABYJytf","repeats":1},{"count":1696,"lower_bound":"A4AAAABYJyyd","upper_bound":"A4AAAABYJzn5","repeats":1},{"count":1704,"lower_bound":"A4AAAABYJzuT","upper_bound":"A4AAAABYJ0fg","repeats":1},{"count":1712,"lower_bound":"A4AAAABYJ0jN","upper_bound":"A4AAAABYJ1kA","repeats":1},{"count":1720,"lower_bound":"A4AAAABYJ1mD","upper_bound":"A4AAAABYJ2nq","repeats":1},{"count":1728,"lower_bound":"A4AAAABYJ2pl","upper_bound":"A4AAAABYJ3dt","repeats":1},{"count":1736,"lower_bound":"A4AAAABYJ3jL","upper_bound":"A4AAAABYJ4m8","repeats":1},{"count":1744,"lower_bound":"A4AAAABYJ5N2","upper_bound":"A4AAAABYJ63i","repeats":1},{"count":1752,"lower_bound":"A4AAAABYJ7Gk","upper_bound":"A4AAAABYJ8D7","repeats":1},{"count":1760,"lower_bound":"A4AAAABYJ8Gl","upper_bound":"A4AAAABYJ82/","repeats":1},{"count":1768,"lower_bound":"A4AAAABYJ9v+","upper_bound":"A4AAAABYJ+kd","repeats":1},{"count":1776,"lower_bound":"A4AAAABYJ+r4","upper_bound":"A4AAAABYKAR2","repeats":1},{"count":1784,"lower_bound":"A4AAAABYKAZ1","upper_bound":"A4AAAABYKBSV","repeats":1},{"count":1792,"lower_bound":"A4AAAABYKBia","upper_bound":"A4AAAABYKCZw","repeats":1},{"count":1800,"lower_bound":"A4AAAABYKCa8","upper_bound":"A4AAAABYKDq2","repeats":1},{"count":1808,"lower_bound":"A4AAAABYKDrP","upper_bound":"A4AAAABYKE6T","repeats":1},{"count":1816,"lower_bound":"A4AAAABYKE9E","upper_bound":"A4AAAABYKGK5","repeats":1},{"count":1824,"lower_bound":"A4AAAABYKGdA","upper_bound":"A4AAAABYKHhA","repeats":1},{"count":1832,"lower_bound":"A4AAAABYKHrJ","upper_bound":"A4AAAABYKJGf","repeats":1},{"count":1840,"lower_bound":"A4AAAABYKJXn","upper_bound":"A4AAAABYKJyB","repeats":1},{"count":1848,"lower_bound":"A4AAAABYKJ3H","upper_bound":"A4AAAABYKLWp","repeats":1},{"count":1856,"lower_bound":"A4AAAABYKLXK","upper_bound":"A4AAAABYKMWd","repeats":1},{"count":1864,"lower_bound":"A4AAAABYKMrr","upper_bound":"A4AAAABYKOIv","repeats":1},{"count":1872,"lower_bound":"A4AAAABYKOJ9","upper_bound":"A4AAAABYKO3V","repeats":1},{"count":1880,"lower_bound":"A4AAAABYKO9/","upper_bound":"A4AAAABYKPt2","repeats":1},{"count":1888,"lower_bound":"A4AAAABYKP3M","upper_bound":"A4AAAABYKRZD","repeats":1},{"count":1896,"lower_bound":"A4AAAABYKRaj","upper_bound":"A4AAAABYKR+c","repeats":1},{"count":1904,"lower_bound":"A4AAAABYKR/5","upper_bound":"A4AAAABYKSpW","repeats":1},{"count":1912,"lower_bound":"A4AAAABYKSpo","upper_bound":"A4AAAABYKTW/","repeats":1},{"count":1920,"lower_bound":"A4AAAABYKTkM","upper_bound":"A4AAAABYKUOe","repeats":1},{"count":1928,"lower_bound":"A4AAAABYKUTw","upper_bound":"A4AAAABYKVTN","repeats":1},{"count":1936,"lower_bound":"A4AAAABYKVdy","upper_bound":"A4AAAABYKWuL","repeats":1},{"count":1944,"lower_bound":"A4AAAABYKW9b","upper_bound":"A4AAAABYKXv2","repeats":1},{"count":1952,"lower_bound":"A4AAAABYKXwg","upper_bound":"A4AAAABYKYUN","repeats":1},{"count":1960,"lower_bound":"A4AAAABYKYbr","upper_bound":"A4AAAABYKZ+h","repeats":1},{"count":1968,"lower_bound":"A4AAAABYKaER","upper_bound":"A4AAAABYKa2z","repeats":1},{"count":1976,"lower_bound":"A4AAAABYKbI4","upper_bound":"A4AAAABYKby8","repeats":1},{"count":1984,"lower_bound":"A4AAAABYKb4Y","upper_bound":"A4AAAABYKcat","repeats":1},{"count":1992,"lower_bound":"A4AAAABYKccp","upper_bound":"A4AAAABYKdNr","repeats":1},{"count":2000,"lower_bound":"A4AAAABYKdTQ","upper_bound":"A4AAAABYKfBU","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,0,2,1,0,0,0,1,2,1,0,1,1,1,1,3,2,1,1,0,2,1,2,0,1,2,1,3,0,1,6,0,1,0,2,1,0,0,2,0,1,0,1,1,0,2,2,2,1,2,0,2,0,3,2,0,0,0,1,0,1,1,1,0,2,0,2,1,0,2,2,0,0,0,0,4,3,2,0,2,0,2,0,1,2,0,1,1,3,0,0,0,0,2,1,1,0,1,2,1,3,1,1,2,0,0,0,1,3,0,0,0,2,1,1,3,0,0,2,1,0,2,1,0,0,3,1,2,1,1,1,0,1,0,0,0,0,1,1,0,1,1,2,1,1,1,0,0,0,2,1,1,0,2,1,1,1,0,0,2,0,1,1,0,0,0,1,0,1,1,0,0,1,1,0,0,1,1,2,1,0,0,0,1,1,2,2,1,2,0,0,3,0,1,2,2,0,4,0,0,4,2,0,1,2,0,1,1,0,0,1,0,1,1,0,3,3,0,0,0,0,2,2,2,2,1,0,1,0,1,0,2,1,3,4,2,1,0,1,1,1,1,1,1,2,3,1,2,1,1,2,2,1,3,3,0,0,1,1,6,2,0,0,1,1,1,3,0,1,1,0,0,2,0,3,2,1,0,2,0,0,1,1,2,1,2,0,0,0,0,1,0,0,0,0,0,1,1,3,0,2,1,0,0,5,0,2,0,2,5,2,0,1,2,0,0,1,3,2,1,0,1,2,0,1,1,1,0,1,1,1,0,1,2,2,0,0,0,0,0,3,1,1,0,0,0,1,0,3,2,0,2,2,0,2,1,2,0,1,2,0,0,1,1,0,0,1,1,0,2,1,0,0,1,0,1,1,0,2,1,0,0,2,0,0,1,1,0,1,1,0,0,0,0,0,1,0,3,1,0,2,0,0,1,3,1,0,1,1,1,0,0,0,1,2,1,1,3,1,0,1,1,1,0,2,2,0,0,0,4,0,1,3,1,0,0,1,0,1,0,1,1,1,3,3,2,0,2,0,0,3,1,1,1,1,1,1,2,0,3,0,3,0,1,2,2,0,0,3,0,2,2,0,0,2,0,2,0,1,3,3,0,1,0,1,0,0,2,1,1,0,0,1,1,1,2,0,1,0,0,2,1,4,3,0,0,2,3,1,1,2,0,1,1,0,1,2,0,0,0,1,0,0,2,0,0,0,0,2,1,1,1,2,1,2,0,0,2,3,0,0,2,0,1,4,2,1,0,1,1,0,1,0,2,1,2,2,6,1,1,1,1,3,0,1,0,1,1,2,0,0,2,1,1,0,1,0,1,3,2,0,0,0,1,1,1,0,0,0,4,1,2,0,3,1,1,0,0,2,1,0,0,0,1,1,2,0,0,1,0,1,0,1,1,1,1,0,1,0,2,1,2,0,1,1,1,0,1,0,1,1,0,1,0,2,0,0,1,0,1,1,2,1,0,4,2,2,0,1,1,1,0,2,0,2,0,1,0,1,3,0,0,1,1,2,1,0,0,4,0,1,0,1,1,1,1,3,1,0,1,1,0,3,1,1,0,0,1,0,2,0,0,0,0,1,0,0,1,0,0,2,2,2,1,0,1,1,1,0,1,1,0,1,0,1,1,0,1,2,0,0,2,1,3,0,1,3,1,1,1,0,0,1,2,0,2,1,0,2,0,0,2,1,3,1,0,1,1,0,1,3,1,3,1,1,1,1,1,1,0,3,1,2,3,3,2,1,1,1,1,1,1,0,1,2,1,2,0,1,1,1,1,2,1,2,0,3,1,0,0,0,1,0,0,0,0,1,1,2,1,0,0,1,3,4,1,2,1,1,4,0,0,1,4,2,1,0,0,1,2,2,1,0,1,0,1,1,0,2,2,1,0,0,4,1,1,4,1,2,0,3,0,0,3,1,1,1,0,1,1,0,1,2,0,0,1,2,4,1,2,1,0,2,0,1,0,2,2,0,2,1,0,1,2,0,0,0,3,1,1,0,1,0,2,0,1,3,3,1,1,2,2,0,1,1,1,1,2,3,2,1,0,0,0,1,0,0,3,2,1,4,0,0,1,2,0,0,1,3,0,1,0,0,0,0,0,1,1,1,0,0,2,0,0,0,0,4,1,0,0,1,3,0,2,2,1,1,1,1,2,1,1,0,0,1,2,0,3,3,2,1,2,0,3,0,1,3,2,1,1,3,1,1,1,0,0,1,1,0,1,0,1,1,0,0,1,0,2,0,1,1,2,0,0,0,0,0,0,0,2,1,1,1,0,1,2,0,2,1,0,1,1,0,0,1,0,1,2,1,1,0,0,0,1,0,2,0,0,0,1,1,0,0,0,0,0,3,0,1,0,0,2,0,1,0,0,1,1,2,1,0,1,0,1,0,1,2,2,1,1,0,2,1,1,0,2,1,0,1,1,3,0,1,0,1,1,2,1,0,1,1,2,0,0,0,1,1,1,1,3,0,1,1,1,1,1,2,0,1,1,2,1,0,2,2,2,2,0,1,2,1,2,1,0,0,0,0,2,2,0,2,0,0,1,1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,0,2,1,2,1,0,0,0,0,5,0,0,1,0,0,1,4,0,1,0,0,2,1,1,0,4,2,2,2,1,2,0,0,0,0,1,0,0,4,1,2,1,1,0,0,1,0,1,2,1,2,2,0,1,4,0,4,1,3,0,3,0,1,1,1,0,0,0,1,1,1,2,1,0,2,3,1,1,1,0,1,0,1,3,1,1,0,1,0,1,1,1,0,2,1,1,0,3,0,2,2,2,0,0,3,0,1,0,0,1,1,1,1,1,0,0,1,0,3,1,1,1,0,0,0,3,1,3,0,2,0,0,1,1,0,0,0,0,0,0,1,0,0,2,0,0,0,1,1,4,0,0,2,1,0,3,0,0,0,0,1,0,0,2,0,3,5,0,0,0,2,2,0,1,1,0,3,0,1,2,1,3,0,0,1,0,0,2,1,2,5,0,1,2,1,0,1,0,2,0,2,1,1,1,0,0,1,2,0,0,1,1,0,1,0,0,1,1,0,1,2,1,0,0,1,1,0,1,0,1,2,0,2,0,1,0,1,0,0,0,0,2,0,2,1,0,2,0,2,1,1,0,3,0,0,3,0,3,4,1,4,0,0,1,0,0,0,0,1,0,0,3,1,1,1,0,1,1,3,0,1,2,2,1,1,2,0,1,2,3,1,0,2,1,0,2,0,0,0,2,4,3,1,1,0,0,0,1,2,0,0,1,2,3,1,0,0,0,2,2,0,0,2,0,1,2,1,0,0,2,0,2,2,1,0,0,0,1,1,1,0,3,0,1,1,0,2,0,0,0,0,1,0,2,1,0,0,0,1,3,1,1,0,0,0,0,1,1,1,1,1,0,0,1,2,2,0,0,2,1,0,4,0,0,1,1,1,0,0,1,0,1,0,0,0,0,1,1,1,0,0,1,2,0,1,1,1,0,2,0,1,0,0,1,3,1,0,1,2,1,2,3,2,1,0,1,3,0,4,2,1,0,1,3,2,1,2,1,2,0,1,1,1,0,0,1,0,0,1,1,0,1,1,1,1,1,2,0,0,0,1,1,2,1,1,0,0,1,0,2,0,0,1,0,1,1,1,1,1,0,0,1,1,1,1,2,1,0,0,0,2,1,4,0,0,1,1,1,2,0,3,1,2,2,1,1,0,2,1,0,1,1,0,0,0,1,1,1,2,0,0,3,1,1,0,2,0,1,0,0,1,1,1,0,0,2,0,1,0,0,1,2,1,0,1,0,0,2,1,1,4,0,0,1,0,2,1,2,1,0,0,0,2,1,1,2,2,2,2,3,0,2,1,1,1,0,3,1,3,1,0,1,3,0,0,3,3,0,1,0,2,1,2,2,1,0,1,0,0,2,0,0,2,1,2,1,1,1,2,0,1,1,0,0,2,1,1,1,1,1,0,1,1,0,0,1,1,0,2,0,1,1,0,1,1,0,0,1,2,1,2,1,1,1,1,3,1,1,0,0,1,2,0,0,2,2,0,1,1,2,0,0,2,2,1,1,0,0,2,2,2,0,1,1,1,2,1,4,1,2,1,0,1,0,1,1,0,3,1,2,1,4,0,2,1,1,2,0,1,0,1,0,0,0,0,0,1,1,0,0,2,2,1,1,0,1,0,0,1,1,0,0,0,0,1,1,2,0,1,3,3,2,1,0,1,1,0,1,0,1,1,1,0,1,1,3,0,2,0,1,0,0,2,0,1,1,0,0,0,1,1,1,3,0,3,2,0,1,0,1,1,1,0,2,0,0,2,1,0,0,0,3,0,2,0,1,3,0,0,1,2,3,1,0,0,3,0,2,2,2,1,0,1,1,1,0,1,1,2,0,0,1,1,1,2,1,1,1,2,1,0,1,1,0,0,3,3,2,3,2,3,1,2,0,2,2,1,2,1,2,0,0,1,0,1,0,1,0,2,3,0,0,1,0,3,1,4,1,0,1,0,2,0,0,0,1,1,0,0,0,2,1,0,0,2,1,1,0,1,3,0,1,1,1,2,1,0,2,1,0,1,3,3,2,0,3,1,2,0,2]},{"counters":[1,1,1,1,1,0,2,1,2,1,1,0,1,2,3,0,0,1,1,0,0,2,3,1,0,0,5,0,0,1,1,0,0,1,1,0,1,1,1,1,3,2,3,0,1,1,0,1,1,0,3,1,0,0,0,0,0,2,0,0,2,0,1,1,0,0,0,1,0,1,4,1,0,1,1,1,1,1,0,1,0,2,0,0,2,1,2,1,1,0,2,1,1,1,1,1,1,1,1,1,0,0,1,2,0,4,2,2,0,1,0,1,1,1,0,1,1,0,1,0,1,0,2,0,1,1,1,0,2,0,1,2,1,0,1,1,0,0,2,1,1,3,2,0,2,1,0,0,0,1,0,1,1,2,0,0,1,1,1,0,1,1,3,0,0,0,1,0,1,0,2,2,2,3,0,0,0,0,0,0,2,1,0,0,3,0,0,0,1,2,1,3,2,2,0,0,1,1,2,0,0,2,2,1,0,1,2,2,1,1,1,1,4,1,1,0,1,1,1,1,0,1,0,2,0,0,0,0,1,0,0,0,2,0,1,0,3,0,0,1,2,1,3,1,0,2,0,0,0,1,0,1,2,1,1,1,0,0,1,1,1,0,2,0,1,3,0,0,0,1,1,3,1,1,1,3,1,1,0,3,1,1,2,1,1,0,2,2,2,2,0,2,1,0,2,1,0,0,4,0,1,0,2,2,2,0,1,1,1,3,1,1,1,2,1,0,1,0,1,1,2,0,1,0,1,1,1,1,1,0,1,2,0,0,0,2,2,1,1,3,1,0,0,1,0,0,1,0,1,2,1,1,0,0,1,4,2,3,2,1,0,2,1,1,2,3,0,1,1,2,0,0,0,1,1,0,2,2,1,1,1,0,1,2,3,1,0,1,0,3,0,0,1,2,0,0,3,1,0,1,1,2,3,1,1,0,1,1,1,1,1,0,1,0,1,1,0,3,0,3,0,1,0,1,1,1,0,1,0,1,0,3,2,1,2,0,1,1,0,0,0,3,0,2,0,0,0,0,0,0,1,3,3,0,1,0,2,3,0,1,1,0,0,0,1,0,1,0,2,0,2,0,1,2,0,0,1,0,2,1,1,3,1,0,2,0,0,4,1,1,0,1,3,1,1,4,1,3,2,2,1,1,3,1,3,1,0,1,2,1,1,1,1,0,0,1,3,0,1,0,0,2,0,3,3,2,1,0,1,3,4,1,1,0,0,1,1,0,3,1,0,1,0,0,0,2,0,2,5,2,3,0,1,1,0,0,1,2,1,0,2,1,1,1,0,0,0,1,0,2,0,1,1,1,0,0,1,2,0,3,1,1,0,0,1,0,3,2,0,1,3,1,0,3,1,0,1,1,0,4,2,1,1,1,0,0,0,0,1,0,2,0,5,1,2,0,3,0,1,1,1,3,2,2,1,0,2,0,1,1,0,3,0,0,0,0,0,1,2,1,0,0,2,1,0,0,2,1,2,1,1,1,2,2,0,1,2,0,0,1,0,0,1,0,0,0,2,0,1,3,2,1,2,0,0,3,0,0,0,1,2,1,1,1,0,1,2,1,0,0,2,0,0,0,0,1,1,2,0,1,3,0,2,0,0,0,1,1,0,0,1,1,0,1,3,0,2,0,2,1,2,0,0,4,1,0,0,1,0,3,2,1,1,1,0,2,3,1,1,2,2,1,1,2,0,2,2,1,1,0,1,1,1,0,1,0,4,2,3,1,3,2,3,0,2,0,0,0,3,1,0,1,0,0,1,0,0,0,1,2,0,1,0,0,2,0,0,1,1,1,0,0,0,3,2,4,1,1,1,1,3,3,0,0,0,2,1,1,2,0,0,0,3,0,1,1,2,1,1,0,0,2,0,0,2,3,0,2,1,0,0,2,0,0,1,1,1,1,0,2,0,0,0,1,2,1,1,1,0,0,0,0,0,1,2,2,1,0,0,1,1,2,1,0,0,0,2,0,0,1,0,1,2,0,1,1,1,0,0,2,1,0,0,0,1,3,0,0,3,0,2,0,1,0,1,0,1,1,0,1,0,0,2,1,0,1,0,0,1,1,2,1,2,1,1,0,1,2,1,1,0,0,1,3,0,1,0,0,0,1,1,0,0,2,0,0,0,1,1,0,0,0,2,0,3,0,0,1,0,0,2,1,1,1,1,0,2,0,0,0,0,2,2,0,4,0,1,3,1,0,2,2,1,0,0,2,2,0,0,0,0,1,1,2,1,1,0,0,0,2,1,1,2,2,2,0,2,0,0,0,2,0,2,1,0,1,1,1,2,3,2,3,1,2,0,3,1,0,3,1,2,1,3,1,1,2,0,1,1,0,1,0,2,0,0,0,0,0,4,1,2,0,1,1,0,1,1,0,0,0,0,0,1,0,0,0,1,0,1,0,2,1,0,1,1,2,1,0,0,0,1,0,1,2,1,1,3,1,0,2,0,0,1,0,1,2,1,0,3,0,2,0,1,2,3,2,0,0,1,0,1,0,1,0,1,0,1,1,3,1,1,1,2,0,0,4,0,1,1,0,1,1,1,0,0,2,1,0,1,1,1,3,2,0,1,0,0,0,1,0,3,0,2,1,0,0,2,2,0,0,1,2,1,0,0,4,0,1,1,1,1,1,0,2,1,2,1,0,0,1,2,0,3,2,4,1,1,1,1,1,1,0,1,0,1,2,1,1,0,2,0,1,0,0,1,1,1,0,0,2,2,2,4,1,2,1,1,0,0,1,1,0,0,0,0,1,1,1,0,0,2,1,0,0,1,0,1,1,0,0,0,2,3,0,0,2,0,2,1,1,0,3,0,0,2,1,2,1,1,1,1,0,1,1,0,3,0,1,1,0,1,0,0,1,1,2,1,0,1,0,3,3,1,2,0,1,0,0,0,0,1,1,1,0,2,2,0,1,0,0,1,0,0,1,0,0,1,0,2,1,2,1,2,2,1,0,0,2,1,1,0,2,0,1,1,1,0,3,0,1,3,1,4,1,2,0,0,1,1,0,4,1,0,0,1,0,2,3,1,1,1,1,0,1,0,2,1,0,0,2,1,2,1,1,1,0,0,1,0,1,0,1,0,1,1,1,1,4,1,0,2,4,0,3,1,1,2,0,0,1,1,4,0,1,1,0,1,1,1,2,1,1,0,0,4,0,1,1,0,2,0,1,0,2,0,2,2,1,2,0,1,0,2,1,0,0,4,1,0,0,0,1,0,0,0,0,1,0,0,1,1,0,1,1,2,3,1,1,0,2,1,2,1,0,1,2,2,1,1,0,1,0,1,1,1,1,1,3,0,0,1,0,2,0,0,0,0,3,1,2,1,0,0,0,2,2,0,0,0,0,2,1,1,1,2,1,2,0,1,1,1,0,0,0,0,2,3,2,1,1,2,1,1,1,2,0,1,0,1,0,2,0,1,0,2,0,2,0,1,0,2,2,1,0,1,0,1,2,2,3,1,0,2,1,1,3,1,0,2,0,0,0,1,1,1,2,2,0,0,1,3,0,2,0,1,0,0,1,4,1,0,1,1,2,0,3,1,0,0,2,1,1,1,2,1,2,1,0,2,3,1,0,1,0,0,0,1,0,2,0,1,0,1,0,0,2,0,4,1,1,1,2,2,0,0,2,0,1,1,1,1,0,1,2,2,0,1,2,2,0,0,1,1,2,1,2,0,0,1,4,1,1,2,2,1,2,2,1,1,0,1,3,0,2,0,0,0,1,0,0,1,2,2,2,1,2,0,0,0,1,3,1,0,2,2,0,3,1,0,0,0,0,1,0,0,1,2,0,0,1,0,0,1,1,4,1,0,0,1,2,0,1,2,2,1,1,0,2,0,0,1,0,1,1,3,1,2,0,2,1,2,0,1,0,1,2,2,0,1,2,0,0,0,1,0,1,1,2,2,2,2,1,0,1,2,1,0,2,1,3,1,0,1,0,0,0,1,1,1,0,2,3,2,1,2,1,3,0,1,5,1,1,0,0,2,2,2,0,1,0,0,1,0,0,1,1,1,1,0,0,1,1,2,0,0,2,1,1,1,1,2,0,1,0,1,2,2,1,1,0,1,2,1,4,1,1,2,0,3,0,2,0,0,1,3,1,0,1,2,2,1,1,0,2,0,1,3,1,0,1,0,1,2,0,1,1,1,3,2,2,1,2,0,0,0,1,0,0,0,1,0,1,6,0,3,2,2,2,1,1,2,1,0,0,0,2,1,1,1,1,0,1,0,0,0,0,2,2,1,1,0,1,1,0,2,3,4,1,0,3,2,0,0,1,1,1,2,0,0,0,1,1,1,0,1,0,1,1,0,3,0,0,1,1,2,0,1,3,0,2,1,0,1,1,0,0,1,1,1,0,1,1,0,2,4,0,1,1,1,0,1,1,1,2,2,1,0,1,2,2,0,2,0,1,0,1,1,1,0,0,0,2,0,1,1,2,1,2,2,1,3,1,1,0,0,2,0,0,1,0,1,1,0,0,1,3,1,0,1,0,0,0,1,2,1,3,0,2,0,3,0,0,0,1,0,2,2,1,0,2,0,2,1,2,0,3,1,4,1,1,0,2,1,1,2,0,2,1,1,2,1,2,1,0,0,2,0,0,0,1,0,1,2,0,1,1,1,1]},{"counters":[1,6,4,0,1,1,1,1,0,1,1,2,2,0,1,0,0,1,1,0,1,1,0,1,1,1,0,0,2,2,0,3,0,3,2,1,1,1,1,1,1,1,1,2,1,1,2,1,1,1,2,3,0,0,1,0,0,1,0,0,1,1,2,0,2,1,2,0,1,0,1,0,2,1,1,3,1,0,1,0,1,1,2,1,4,1,0,2,2,1,1,3,0,1,1,2,1,2,0,0,1,2,1,1,0,0,3,2,0,1,1,0,0,0,0,1,0,0,2,2,0,1,0,0,3,1,1,1,1,3,0,1,1,1,2,0,2,2,0,0,3,2,1,0,2,3,2,1,0,2,2,0,1,1,2,1,1,0,1,1,1,2,1,0,0,0,0,1,1,0,1,1,0,2,4,1,0,0,1,0,0,0,1,1,1,1,4,0,2,2,2,1,0,0,1,3,0,0,1,0,0,1,1,1,0,0,1,0,0,2,4,1,0,0,1,4,3,1,3,1,0,1,1,1,2,1,2,0,1,2,0,0,1,2,1,1,1,0,2,1,2,0,1,2,0,1,0,0,2,2,1,0,2,0,1,0,2,1,1,2,2,1,1,0,0,0,0,1,1,0,1,1,0,2,1,2,2,0,0,0,1,1,5,1,0,2,1,0,1,1,1,2,0,1,2,0,1,0,1,1,0,1,0,0,1,0,0,0,0,2,1,1,1,0,1,1,2,0,0,3,0,1,1,0,1,1,1,0,1,2,1,1,1,1,1,0,0,1,0,2,1,1,0,1,0,0,2,1,0,1,0,1,1,0,0,0,1,0,2,2,1,1,3,1,0,3,1,2,1,0,3,0,0,1,0,0,1,0,1,4,2,0,3,0,0,0,2,2,0,1,1,1,1,1,0,1,1,0,2,2,2,0,0,0,3,0,1,4,0,2,2,0,0,1,1,1,1,0,1,1,0,0,1,2,2,1,1,1,0,1,2,2,3,1,2,2,1,1,2,4,0,1,1,1,1,2,0,0,1,0,0,1,1,0,2,0,3,1,2,0,0,2,1,2,2,0,0,0,0,1,4,0,0,0,1,2,1,0,2,1,0,0,1,0,1,0,0,2,0,0,0,0,0,1,2,0,0,2,1,2,2,0,0,0,0,2,1,0,0,1,1,0,4,0,0,0,2,0,0,1,1,0,1,2,3,0,1,0,0,1,1,1,1,1,1,1,1,1,1,0,1,0,3,2,0,1,0,1,1,0,0,0,0,1,0,1,1,2,1,0,1,1,1,0,1,2,1,1,2,1,0,3,1,2,0,0,2,1,0,1,0,0,2,1,2,0,0,1,1,2,0,1,1,0,0,2,2,1,2,4,0,0,1,2,1,0,3,2,2,1,1,1,1,4,1,3,2,1,1,0,1,2,1,1,0,3,0,1,1,1,1,0,0,2,1,1,1,1,1,1,0,1,1,1,0,3,0,1,1,1,1,1,0,0,0,1,0,2,1,0,1,2,0,2,0,0,0,2,0,1,0,0,1,0,1,1,1,2,0,0,0,0,1,2,0,0,0,1,1,1,1,1,2,3,0,0,2,1,2,0,2,0,0,0,1,0,2,1,1,1,0,0,1,2,2,1,0,1,0,1,3,1,0,1,1,0,1,2,0,1,0,1,0,0,0,1,4,3,2,1,0,1,2,1,0,1,0,1,2,0,1,0,0,1,1,1,1,1,1,3,2,2,0,0,0,2,4,1,0,0,2,2,1,3,1,1,0,1,1,1,0,1,0,0,1,2,0,0,1,1,2,0,1,0,0,0,0,4,1,0,4,1,1,0,0,0,0,1,0,2,1,0,0,1,2,5,0,0,3,0,0,2,0,2,1,0,3,4,0,1,0,1,0,1,1,1,0,1,1,0,0,1,1,1,1,1,0,2,2,1,0,0,2,4,0,2,1,0,3,1,1,1,2,0,1,1,0,1,0,2,0,2,1,0,0,1,2,2,2,0,2,1,2,0,0,3,0,1,0,2,0,1,2,0,0,1,2,1,1,2,0,0,3,3,0,1,1,0,1,1,1,0,0,1,1,0,2,1,1,0,2,1,0,0,0,2,0,2,0,0,0,1,0,1,2,0,0,0,1,0,0,1,3,0,1,1,2,0,4,2,3,0,0,2,0,2,1,1,0,0,1,1,1,1,0,0,1,0,1,0,1,1,0,2,2,0,0,0,0,2,0,0,2,3,2,0,1,3,0,0,2,0,0,1,0,1,0,0,3,2,2,0,2,1,2,2,0,0,1,2,1,0,0,1,1,0,0,0,2,1,0,2,0,2,1,1,1,1,2,1,2,1,2,1,5,1,1,1,0,1,1,1,4,0,2,0,0,2,0,0,1,1,0,2,1,0,2,1,1,3,1,1,6,1,1,1,0,1,1,1,1,1,2,1,0,2,1,0,1,0,3,2,2,1,2,1,2,1,0,1,0,1,0,3,0,2,1,1,2,0,0,0,1,1,4,0,2,0,2,1,2,3,0,1,0,2,1,0,2,1,0,2,5,0,0,0,0,0,4,1,0,1,2,2,0,0,0,0,3,3,0,0,0,2,0,0,0,2,1,2,1,0,0,1,1,0,1,0,2,1,3,2,0,0,1,2,2,1,1,1,0,0,1,0,1,1,0,2,0,0,0,1,1,1,0,0,2,0,0,2,2,1,1,0,1,0,1,0,0,1,1,2,1,1,0,1,1,1,0,1,1,0,2,1,1,1,1,0,0,1,1,0,1,0,2,0,1,3,2,1,0,1,1,1,0,0,0,2,1,0,3,0,1,2,1,0,3,1,1,3,1,2,1,0,1,1,2,1,1,1,1,1,1,2,0,1,1,2,1,0,0,1,1,2,2,1,0,1,1,3,0,0,1,0,1,0,1,1,1,1,0,1,0,1,1,1,0,3,0,0,1,1,2,0,1,1,1,1,0,2,1,0,1,0,0,2,0,2,1,3,0,0,0,1,0,1,2,2,0,0,1,0,0,1,1,4,1,1,1,2,0,1,1,1,1,0,3,2,2,0,0,1,1,0,1,1,1,3,1,3,1,2,0,0,1,1,2,1,0,1,0,0,1,1,0,1,1,2,1,0,0,1,1,1,1,0,0,2,0,2,1,1,2,0,1,1,0,1,2,0,0,1,3,1,1,0,1,0,0,0,2,0,2,1,1,2,2,2,2,1,2,1,0,0,1,1,2,0,0,1,3,3,1,1,1,2,0,1,0,1,0,0,1,1,0,1,1,1,0,0,2,1,3,1,2,0,0,2,0,1,3,0,0,0,2,1,4,0,0,0,0,1,0,2,3,3,1,1,0,1,1,1,6,0,0,1,0,0,1,1,3,2,1,0,0,1,0,0,2,0,0,0,4,2,1,0,1,0,2,3,1,2,1,0,1,1,0,0,1,0,1,1,0,1,1,1,3,1,1,1,0,1,1,3,0,2,1,0,0,2,1,0,2,2,3,3,1,2,2,3,2,0,0,0,1,1,2,2,2,3,0,1,1,1,1,0,1,0,2,0,1,3,0,1,0,1,0,0,0,1,2,1,0,0,1,3,3,2,2,0,1,0,2,1,1,3,2,0,1,2,0,2,0,3,1,1,0,2,0,2,2,1,1,1,2,3,0,1,1,0,1,3,1,1,1,2,0,0,0,0,0,1,1,0,1,0,1,1,0,1,2,0,0,2,1,1,1,1,1,1,1,0,2,0,2,0,0,1,0,0,2,0,0,1,1,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,2,0,1,0,0,0,0,1,1,2,1,1,0,0,1,0,1,2,0,0,1,1,0,0,0,0,1,0,1,2,1,1,4,1,0,1,1,2,2,1,0,3,2,0,2,2,1,2,2,0,0,2,1,0,2,2,1,0,0,2,0,0,1,1,0,1,3,1,1,3,1,0,0,0,0,0,0,1,1,1,0,1,1,1,0,0,0,2,2,2,0,1,0,2,3,2,1,0,1,1,0,0,0,2,0,0,1,2,1,0,0,1,0,0,0,1,1,1,1,0,1,0,0,2,1,2,0,0,2,2,2,0,0,1,1,1,1,1,0,0,2,0,1,5,1,0,0,0,2,0,0,0,2,0,0,0,2,1,2,1,1,1,3,1,0,0,0,1,0,2,1,1,2,3,2,0,1,0,1,0,1,0,1,0,0,1,2,0,0,3,0,3,2,1,2,0,0,0,0,3,1,1,2,2,2,0,2,0,0,1,0,2,1,1,2,2,0,2,1,1,0,3,2,0,0,5,0,0,1,1,1,2,0,3,1,0,0,0,1,2,1,1,1,0,1,0,2,0,1,1,1,1,1,2,1,1,0,0,2,1,1,0,0,0,1,1,0,2,1,2,1,0,2,2,1,1,1,0,2,2,2,1,0,0,1,0,1,2,2,2,1,4,2,0,0,2,4,0,1,0,1,2,1,2,2,4,1,1,1,0,0,2,2,0,1,0,0,1,1,0,0,1,0,1,1,1,2,0,2,2,0,1,1,0,1,1,1,4,0,1,0,3,2,1,0,1,1,1,1,2,0,1,1,2,4,1,0,0,0,2,4,1,2,0,2,0,2,3]},{"counters":[1,0,2,1,2,1,2,0,2,2,1,0,0,0,2,1,0,0,2,1,1,0,3,0,5,0,0,0,1,1,0,1,0,0,1,1,1,1,0,0,1,1,2,0,1,0,1,2,0,1,1,0,0,1,3,0,0,1,2,1,0,0,3,1,0,0,0,2,0,0,0,1,0,2,1,0,1,3,1,1,0,1,1,0,0,0,0,1,0,0,1,0,2,0,1,2,3,1,1,1,2,1,0,2,0,2,0,0,1,2,3,1,1,1,3,1,1,1,0,4,1,0,2,1,1,1,0,0,0,4,1,1,3,0,0,0,2,2,0,0,1,0,1,2,1,1,1,0,1,1,2,0,1,1,2,0,0,0,0,2,1,0,0,0,0,0,3,3,1,0,1,0,4,1,2,2,1,0,1,2,1,2,0,0,0,1,1,1,0,1,2,1,1,1,1,2,1,1,1,2,1,1,0,0,2,3,0,0,0,0,1,1,0,1,0,1,0,3,1,0,1,0,2,1,0,0,0,1,0,0,1,2,0,0,0,0,1,1,1,1,1,1,1,0,0,2,1,0,2,0,2,0,1,0,0,1,1,0,3,1,1,0,0,2,0,0,2,2,1,1,0,0,0,2,0,1,1,2,1,1,0,1,2,0,1,1,0,0,1,1,0,1,3,1,0,0,1,0,3,0,1,2,1,2,1,1,1,2,0,3,0,1,0,1,0,2,1,2,0,1,1,2,1,0,1,1,2,2,2,0,1,0,2,2,1,3,0,1,2,1,2,1,1,0,0,2,0,2,2,0,0,1,2,1,2,0,0,0,1,2,2,0,2,1,0,0,2,0,2,0,3,3,0,0,1,1,1,0,1,1,2,2,3,2,1,0,2,2,1,2,0,0,0,2,1,2,0,0,0,1,1,0,0,0,1,3,2,0,0,1,2,1,2,1,0,1,2,0,0,1,1,4,0,0,0,1,1,1,3,1,3,1,0,0,2,3,1,3,0,2,1,0,2,0,0,1,1,4,1,1,1,1,1,2,2,0,0,0,1,0,1,0,0,1,1,1,1,1,0,2,1,1,0,0,1,0,1,1,2,1,0,0,0,0,0,0,1,0,1,4,0,0,1,1,2,0,4,0,2,1,0,0,0,0,1,0,2,0,0,1,2,1,1,2,1,0,1,0,1,1,0,0,0,2,3,0,2,3,1,2,0,1,1,4,1,2,0,0,4,1,1,2,0,1,1,0,1,0,0,0,0,1,1,0,3,3,1,0,0,0,1,1,0,1,1,1,0,1,2,1,0,1,1,2,3,1,2,0,2,0,0,1,2,1,1,1,1,1,1,3,0,1,0,0,0,1,2,2,0,1,0,2,1,0,1,1,1,2,2,1,0,2,2,0,0,0,0,3,1,2,2,3,0,3,1,3,0,1,0,1,0,1,0,2,1,1,0,1,1,1,0,0,3,2,0,1,1,0,1,1,2,0,1,1,3,1,1,1,1,0,3,0,0,2,0,2,2,2,0,1,0,0,0,0,2,1,1,0,1,1,1,1,2,1,2,2,1,0,1,2,0,2,0,1,0,2,0,1,0,2,3,1,2,0,1,1,3,0,1,0,2,1,1,2,2,3,1,0,1,1,1,2,0,1,2,0,1,1,1,4,0,2,0,0,0,2,3,1,2,0,1,0,2,2,2,2,6,0,1,1,0,0,1,1,1,1,2,0,0,0,2,0,2,0,0,3,1,1,2,0,0,2,0,1,3,1,2,1,2,1,0,0,1,2,3,2,0,1,3,1,0,1,3,2,2,1,0,1,1,1,1,0,0,0,0,1,2,1,3,0,0,2,2,1,0,1,3,3,1,2,3,0,1,0,1,1,1,1,0,2,1,1,0,0,0,0,0,1,1,2,0,2,1,0,1,0,0,2,0,1,1,1,1,0,0,1,0,0,2,0,0,1,2,0,0,0,1,1,1,4,1,1,0,0,1,1,4,0,2,0,1,0,1,2,1,1,2,1,2,0,2,0,0,2,1,1,2,1,1,1,0,1,1,0,0,0,0,1,1,3,0,0,2,2,2,1,1,1,0,0,0,0,3,0,1,0,4,0,1,0,0,0,3,1,1,0,0,2,0,1,0,1,0,2,0,0,1,0,1,2,1,2,0,1,0,1,0,2,0,2,2,1,0,0,1,0,0,2,2,1,0,2,0,1,1,0,1,1,0,2,0,1,0,1,3,3,0,0,2,3,0,0,3,1,0,0,1,1,2,0,0,1,1,3,1,1,0,2,3,1,1,1,1,1,0,0,2,1,0,2,2,0,1,1,2,0,2,1,3,0,5,2,1,0,0,2,1,1,0,1,3,2,0,0,0,1,0,1,1,2,1,4,2,0,2,3,0,0,2,1,0,1,0,0,1,2,1,0,0,2,1,0,2,3,1,1,1,0,4,0,1,1,1,2,2,0,3,1,1,0,1,1,1,2,1,1,2,1,0,1,0,0,0,2,2,0,0,1,3,0,0,0,2,0,1,1,1,0,1,0,1,1,0,2,0,3,0,1,1,1,0,3,1,3,1,1,1,3,3,1,1,1,0,2,1,2,4,1,0,1,0,2,0,0,1,3,0,1,2,0,2,1,0,0,3,3,0,0,3,1,0,1,0,1,1,0,1,2,2,0,0,0,0,0,2,0,1,1,0,0,1,0,3,3,1,2,1,1,1,1,0,2,2,2,2,2,2,1,3,1,0,0,2,2,2,1,1,1,2,1,2,2,1,0,1,1,1,1,0,0,2,0,1,1,2,2,0,1,0,0,1,0,1,3,5,0,0,0,4,1,0,0,2,1,2,0,0,1,0,2,0,0,1,5,0,0,0,2,2,0,2,1,0,0,2,0,2,0,1,1,1,3,0,2,0,0,1,2,1,2,2,1,0,0,1,2,2,0,0,0,0,1,0,0,3,1,0,0,0,3,0,0,1,0,0,0,2,0,1,0,1,1,0,0,0,2,0,1,1,1,1,2,0,0,0,1,0,0,3,0,1,2,1,2,1,0,1,3,0,0,1,0,1,0,5,0,1,1,1,0,0,0,0,0,1,1,1,0,1,0,3,0,0,0,0,0,3,0,1,1,0,0,2,1,0,1,1,2,2,1,0,0,1,0,2,1,2,1,2,0,0,0,0,0,3,4,0,2,2,1,0,1,0,4,0,2,0,1,0,0,2,0,0,0,0,1,2,0,0,1,0,0,1,2,2,0,1,2,1,2,0,1,1,1,0,2,0,1,0,0,1,3,2,2,1,1,1,2,1,1,0,1,1,2,0,1,0,1,0,0,3,2,2,0,2,1,2,1,0,1,1,1,1,1,1,1,0,1,4,0,2,2,2,1,0,2,1,0,1,6,2,2,1,0,0,0,0,0,1,0,2,1,2,0,1,0,2,2,0,2,0,0,0,1,1,0,1,1,2,0,2,0,0,0,1,1,0,0,0,0,4,2,2,1,1,1,0,1,2,1,3,1,0,1,0,0,0,0,1,1,1,2,2,1,0,1,3,2,3,0,1,2,1,1,1,1,0,2,2,2,2,1,0,2,0,0,1,1,0,0,1,0,1,0,1,0,0,3,3,0,0,1,0,0,1,1,0,1,2,0,1,0,1,0,0,3,1,0,0,0,1,0,1,1,2,0,0,0,0,0,3,0,2,0,0,0,0,2,1,3,2,0,0,1,1,0,0,1,4,0,1,1,1,0,0,1,0,0,1,0,2,1,0,0,0,2,3,0,2,1,0,2,3,2,1,0,4,1,0,1,2,2,1,1,1,1,0,1,1,0,1,1,1,1,0,2,1,2,1,1,1,3,1,0,2,0,3,1,1,0,0,3,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,0,1,1,1,2,1,0,0,0,0,1,1,1,0,0,2,1,0,0,1,0,1,0,2,2,3,3,1,7,1,0,2,2,0,0,0,0,1,0,0,0,0,1,3,3,1,1,0,0,1,2,1,0,0,0,0,3,0,1,0,0,1,1,2,2,2,1,0,0,1,2,4,0,3,1,2,0,1,2,0,2,2,1,1,1,0,1,1,1,1,0,1,2,1,1,3,1,0,2,0,0,0,1,0,2,1,1,0,2,0,2,1,2,2,1,0,1,0,0,0,1,0,1,1,0,0,0,0,0,1,0,1,1,0,1,0,0,0,0,0,1,1,2,2,0,1,1,1,1,2,1,0,0,1,1,1,0,1,1,0,0,1,2,2,1,0,1,1,0,3,2,1,0,1,1,0,2,1,1,0,0,1,2,3,1,2,0,3,3,2,1,1,0,3,1,3,0,0,0,1,3,1,1,1,1,0,0,0,1,1,3,0,2,0,2,2,0,0,0,0,3,2,0,1,0,0,2,1,0,0,0,0,0,0,2,0,1,0,3,2,1,0,4,1,0,3,0,0,1,2,0,0,0,0,1,3,1,0,1,1,1,0,1,1,0,1,4,3,2,1,1,1,2,3,0,3,3,4,2,1,0,1,2,1,1,2,0,2,2,2,1,0,2,0,0,0,0,1,1,0,2,0,1,1,0,1,1,1,1,0,1,2,1,2,0,1,0,1,1,2,0]},{"counters":[0,1,0,0,0,2,0,0,1,1,0,1,0,0,1,0,2,0,3,0,1,0,1,0,2,2,1,5,1,1,2,1,1,1,2,0,0,0,1,0,1,1,2,1,2,0,0,1,2,1,1,1,0,1,1,2,0,4,0,1,1,2,1,1,0,4,0,1,1,1,1,0,3,1,3,1,2,0,3,0,1,1,2,2,0,0,1,0,2,1,0,2,1,1,1,2,1,1,1,2,0,2,0,0,1,2,1,0,1,0,0,0,0,1,1,3,3,0,3,0,1,0,0,1,0,2,1,2,2,0,1,1,0,1,0,2,1,0,0,2,5,3,0,0,1,0,1,3,2,1,3,2,0,0,1,0,2,1,0,3,0,2,1,2,2,0,2,1,3,2,0,2,2,2,2,1,1,1,1,1,0,5,0,2,1,3,0,2,0,0,1,1,0,2,0,1,2,1,0,2,2,2,0,1,1,0,3,0,1,0,1,1,3,2,0,0,1,0,2,2,1,1,2,3,1,0,1,1,0,1,0,0,0,0,1,0,0,2,0,0,3,2,2,0,1,1,1,0,1,2,0,0,1,0,1,3,0,2,1,1,1,1,1,2,0,1,3,1,1,1,0,1,1,1,2,0,0,1,1,0,4,4,0,2,1,0,1,0,0,1,2,2,1,0,0,2,0,1,0,1,0,0,1,0,1,3,2,1,0,1,1,1,0,0,0,3,1,1,1,0,4,2,0,2,0,1,2,2,4,0,0,0,0,1,2,0,0,1,0,1,0,0,1,4,2,0,0,0,1,0,1,1,1,3,0,0,0,0,1,2,0,0,0,0,1,2,2,1,0,0,0,0,1,2,2,1,0,2,1,0,0,0,1,2,1,0,0,0,2,1,1,1,1,0,0,1,2,3,1,2,2,0,2,1,0,3,1,2,2,0,1,1,0,2,0,1,0,1,0,1,0,0,0,1,0,0,1,0,1,0,2,1,0,2,2,1,1,1,0,1,1,0,0,0,0,0,0,1,0,5,2,0,1,1,1,1,0,1,2,3,0,1,2,0,0,0,1,1,1,0,2,1,0,2,2,2,0,1,0,0,0,0,0,0,2,0,1,0,1,1,4,3,0,1,0,0,2,0,2,1,0,1,0,0,1,0,2,1,2,0,2,0,0,3,1,0,1,1,1,1,2,2,0,0,1,2,2,2,0,2,0,0,2,0,0,0,1,1,1,2,0,2,1,1,2,1,2,0,0,1,2,2,1,1,0,3,3,2,2,2,0,1,1,1,0,2,0,0,1,1,1,1,0,4,0,1,1,2,1,2,1,0,0,0,0,2,0,1,2,0,0,2,0,2,1,0,1,2,1,1,2,2,0,0,1,1,1,0,1,1,1,0,1,1,1,0,3,2,1,1,1,1,3,1,1,2,0,0,0,1,0,2,2,1,2,1,0,0,1,1,1,1,1,1,0,0,2,2,1,1,0,1,1,1,2,1,1,0,1,0,0,0,1,0,0,1,1,3,1,0,3,1,0,0,0,0,2,0,0,0,2,1,1,1,3,1,4,0,2,0,1,0,2,0,2,0,0,2,0,0,1,1,0,1,4,1,1,2,2,2,1,2,1,2,1,0,0,0,1,0,1,3,2,3,1,1,2,1,2,1,1,1,0,1,0,0,1,0,1,1,1,2,2,2,2,2,2,0,1,0,1,1,1,0,0,0,3,0,1,0,0,3,0,0,1,0,1,0,1,4,1,3,2,1,1,1,1,2,1,0,0,0,1,1,2,3,0,0,0,1,2,0,0,0,1,2,3,1,0,2,2,1,3,0,2,0,3,2,1,1,2,1,0,1,0,0,0,0,1,1,0,0,3,2,1,0,3,1,1,1,3,2,2,0,0,0,1,0,0,1,2,3,1,1,1,0,0,1,0,1,0,2,0,3,1,2,3,0,0,1,2,0,2,4,1,0,1,1,0,0,3,3,2,0,0,1,1,0,0,0,0,1,0,1,1,2,2,1,0,2,0,1,1,0,0,1,1,0,0,2,0,2,1,1,3,0,3,2,1,0,2,0,0,0,1,0,0,1,1,2,0,1,2,1,0,0,1,1,0,2,1,2,1,0,1,0,0,3,0,0,1,0,2,1,1,0,1,0,1,2,1,1,1,2,0,2,0,0,0,3,0,0,1,0,0,2,1,0,1,0,0,0,2,2,3,0,2,1,1,0,0,0,0,0,1,1,1,0,2,1,0,0,1,1,1,0,0,0,1,1,2,1,2,2,1,0,0,2,1,0,1,1,1,3,2,0,0,0,1,2,1,1,1,0,0,0,0,1,0,0,3,0,0,0,3,0,0,0,1,1,3,0,0,1,0,0,1,0,2,1,1,1,0,0,3,1,0,2,1,1,0,0,1,1,2,2,2,1,1,1,1,3,2,1,0,1,2,0,1,0,0,2,2,0,0,1,2,1,1,1,1,0,2,0,0,1,0,2,3,0,1,0,1,2,0,0,2,1,0,2,2,1,1,0,1,1,2,0,1,2,1,0,1,1,1,0,0,1,2,0,0,0,1,2,0,1,0,0,0,2,0,0,1,1,1,0,0,0,0,2,0,0,1,3,2,0,0,0,2,1,1,0,0,1,1,2,2,0,0,1,0,1,0,3,0,1,0,1,2,1,0,1,0,1,0,0,3,3,0,2,0,1,3,2,1,3,2,0,1,1,0,3,2,0,0,2,1,1,1,2,1,1,0,0,1,3,0,0,0,0,0,2,0,0,0,1,2,0,1,4,0,0,0,0,0,0,0,0,0,0,1,2,3,2,1,2,1,0,3,0,2,1,1,1,2,1,1,2,1,2,2,1,1,0,1,0,0,0,2,1,0,2,1,0,2,0,0,2,2,2,0,2,2,3,0,0,1,0,1,2,0,1,0,1,1,1,1,0,0,0,1,0,2,1,0,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,1,0,0,0,1,2,2,0,4,1,3,1,3,1,0,0,0,2,1,2,1,1,3,1,2,0,1,4,0,1,2,1,0,1,0,0,0,2,0,1,0,3,1,0,2,1,3,2,1,0,2,0,0,2,4,1,0,2,0,2,1,0,0,1,0,0,1,1,1,2,0,0,1,2,2,0,1,2,0,0,0,1,0,0,0,1,3,0,2,2,2,1,0,2,2,2,0,0,0,0,0,3,1,0,3,2,2,3,0,0,2,1,0,0,0,2,1,2,1,1,3,2,1,2,0,0,0,2,1,3,2,2,1,1,0,0,0,3,0,2,1,1,3,2,1,0,0,0,1,1,1,0,0,0,1,0,2,1,3,0,1,3,1,0,2,2,1,1,0,4,2,0,0,0,1,1,1,0,0,0,0,0,0,2,0,0,2,1,2,1,0,1,0,1,2,1,1,0,0,2,0,2,0,2,0,1,1,2,2,0,1,0,1,0,0,1,2,0,3,2,0,0,2,1,3,0,3,0,1,2,0,0,1,1,3,0,2,1,1,0,2,0,2,3,0,0,0,0,1,1,2,3,2,1,0,3,1,0,0,2,0,0,1,1,1,1,0,1,2,0,1,0,0,2,1,0,1,0,1,0,1,2,1,0,1,0,1,0,3,1,0,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,1,0,5,1,0,2,1,1,1,2,2,3,1,1,2,1,0,0,1,0,1,0,2,2,2,2,0,0,0,1,2,2,0,1,0,0,2,2,0,1,2,0,0,2,3,0,3,4,1,1,1,1,1,2,1,0,0,2,0,4,1,4,0,1,1,0,2,3,2,1,1,0,0,1,1,0,0,1,0,1,1,0,1,2,3,1,2,2,0,1,1,1,1,1,1,1,3,0,1,0,3,2,1,1,3,4,0,0,1,1,0,0,0,2,1,1,0,0,0,3,2,0,1,1,3,0,1,3,2,0,0,0,0,3,1,0,1,0,1,1,2,1,0,2,0,0,1,4,2,0,1,1,1,1,0,0,0,0,2,1,0,0,0,0,1,1,1,1,2,1,0,0,2,1,0,0,3,0,2,0,1,1,2,0,2,0,0,2,1,2,2,2,4,2,2,2,2,2,1,1,0,0,1,2,1,0,1,0,2,1,2,1,0,1,0,2,2,3,1,0,0,2,0,1,1,0,0,1,1,0,0,0,0,1,1,1,2,2,1,2,0,1,0,1,0,1,3,2,3,2,3,0,1,1,1,3,0,0,0,3,1,1,0,0,0,2,0,2,2,2,3,0,0,0,0,0,2,0,0,1,0,1,1,1,1,3,2,1,5,3,1,1,1,0,2,1,1,1,0,1,2,0,0,2,2,1,0,0,1,1,0,0,1,1,0,0,1,2,0,2,1,0,2,2,4,0,0,2,0,0,0,2,0,1,0,0,0,1,0,1,0,3,1,0,1,3,2,0,2,0,2,0,1,0,2,1,0,0,1,1,0,1,2,0,0,1,1,0,1,1,0,2,0,1,1,0,0,1,0,0,0,0,1,1,1,2,1,2,2,2,2,1,2,1,0,0,2,2,0,0,0,0,2,1,0,2,2,3,1,0,0,1,0,2,2,1,1,1,0,0,0,1]}]},"null_count":0,"last_update_version":397952032172933120}},"count":1999,"modify_count":0,"version":0} diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_001.json b/cmd/explaintest/s/explain_complex_stats_tbl_001.json deleted file mode 100644 index 4c07114df4a9f..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_001.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_001","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDE0MjY2MTQ=","upper_bound":"LTIxMzI2NzI3NTA=","repeats":1},{"count":16,"lower_bound":"LTIxMjY0MDYzMDQ=","upper_bound":"LTIxMDM3NTU3OTU=","repeats":1},{"count":24,"lower_bound":"LTIwODQxNDY4NTU=","upper_bound":"LTIwNjIxODYwOTI=","repeats":1},{"count":32,"lower_bound":"LTIwNjIwNDQxMzI=","upper_bound":"LTIwNTg1NTkyNDY=","repeats":1},{"count":40,"lower_bound":"LTIwNTgzNjg4ODc=","upper_bound":"LTIwNDE5NzQ4OTI=","repeats":1},{"count":48,"lower_bound":"LTIwMzUxMzM2OTE=","upper_bound":"LTIwMzIzMDkyOTE=","repeats":1},{"count":56,"lower_bound":"LTIwMzIwMTg0ODA=","upper_bound":"LTIwMDE1NTQzOTY=","repeats":1},{"count":64,"lower_bound":"LTE5OTI2MTkyNzA=","upper_bound":"LTE5NzA0NzkxMTQ=","repeats":1},{"count":72,"lower_bound":"LTE5NjY4NjcxNjE=","upper_bound":"LTE5NTM1NTEyMTg=","repeats":1},{"count":80,"lower_bound":"LTE5NTA0ODQwMDg=","upper_bound":"LTE5MTk5OTIzNDQ=","repeats":1},{"count":88,"lower_bound":"LTE5MTU1Njc3Nzg=","upper_bound":"LTE4OTk1MDM3NjE=","repeats":1},{"count":96,"lower_bound":"LTE4OTQ5MTM4MzA=","upper_bound":"LTE4ODMwNzIwODQ=","repeats":1},{"count":104,"lower_bound":"LTE4ODA4NDgwMDE=","upper_bound":"LTE4NTU1MzIyODY=","repeats":1},{"count":112,"lower_bound":"LTE4NTUxMTQ3MzI=","upper_bound":"LTE4MzY2NDk1MTQ=","repeats":1},{"count":120,"lower_bound":"LTE4MzQ3OTc1MzA=","upper_bound":"LTE4MjAwNDM5NTA=","repeats":1},{"count":128,"lower_bound":"LTE4MTg0NzYyOTY=","upper_bound":"LTE4MDUyNTIyOTQ=","repeats":1},{"count":136,"lower_bound":"LTE4MDMyMDQwNDA=","upper_bound":"LTE3Njc4MDgxMDc=","repeats":1},{"count":144,"lower_bound":"LTE3NjcxOTgxODg=","upper_bound":"LTE3NjM1NzEzNDk=","repeats":1},{"count":152,"lower_bound":"LTE3NjEzNjYwMjA=","upper_bound":"LTE3NTA0NjQyMDQ=","repeats":1},{"count":160,"lower_bound":"LTE3NTAyNzc0NzU=","upper_bound":"LTE3NDE0NjUxODE=","repeats":1},{"count":168,"lower_bound":"LTE3Mzg2MDM0NTQ=","upper_bound":"LTE3MDI1MjA2NTA=","repeats":1},{"count":176,"lower_bound":"LTE2OTg3NjgxNTI=","upper_bound":"LTE2ODE0OTMxNTA=","repeats":1},{"count":184,"lower_bound":"LTE2Nzk3MjI1MTU=","upper_bound":"LTE2Njc3ODI5MjM=","repeats":1},{"count":192,"lower_bound":"LTE2NTY3MTY5MjU=","upper_bound":"LTE2Mzg4Nzc3ODc=","repeats":1},{"count":200,"lower_bound":"LTE2Mzg0NDYyMDI=","upper_bound":"LTE2MjIwMDM0MzY=","repeats":1},{"count":208,"lower_bound":"LTE2MTgzNDc5NTc=","upper_bound":"LTE2MTY4ODQzMjU=","repeats":1},{"count":216,"lower_bound":"LTE2MTY3MjI3ODc=","upper_bound":"LTE2MTM0MTY4Mjc=","repeats":1},{"count":224,"lower_bound":"LTE2MTMzMTg4ODM=","upper_bound":"LTE2MDQ4NTMxMTM=","repeats":1},{"count":232,"lower_bound":"LTE1OTc3ODA2ODg=","upper_bound":"LTE1OTI3OTE3MTg=","repeats":1},{"count":240,"lower_bound":"LTE1ODAyOTYwODM=","upper_bound":"LTE1NjY4OTYyMjg=","repeats":1},{"count":248,"lower_bound":"LTE1NjU4MzQ4NjY=","upper_bound":"LTE1NDY3ODEzNjY=","repeats":1},{"count":256,"lower_bound":"LTE1NDU2MzMxMDc=","upper_bound":"LTE1MzI0NzYxNzg=","repeats":1},{"count":264,"lower_bound":"LTE1MzA5OTA4MDQ=","upper_bound":"LTE1MTM2NjQyMjA=","repeats":1},{"count":272,"lower_bound":"LTE1MTE0NjQzMjc=","upper_bound":"LTE1MDA4MzA4MTI=","repeats":1},{"count":280,"lower_bound":"LTE1MDAxNDg0MDM=","upper_bound":"LTE0OTI2NDUxMTA=","repeats":1},{"count":288,"lower_bound":"LTE0ODk0MTQzNjM=","upper_bound":"LTE0NjY2MTczNzA=","repeats":1},{"count":296,"lower_bound":"LTE0NjQ2MTcxMzM=","upper_bound":"LTE0NTk2MjIwMjg=","repeats":1},{"count":304,"lower_bound":"LTE0NTgwMjE0NDA=","upper_bound":"LTE0NTA1MTA4OTI=","repeats":1},{"count":312,"lower_bound":"LTE0NDk1OTQ0ODg=","upper_bound":"LTE0MzE0NTg5NTE=","repeats":1},{"count":320,"lower_bound":"LTE0MjM4NzMzMDI=","upper_bound":"LTE0MDc0MTc3NDk=","repeats":1},{"count":328,"lower_bound":"LTE0MDY2MzkyOTM=","upper_bound":"LTEzOTYyODY4ODE=","repeats":1},{"count":336,"lower_bound":"LTEzOTU3NjQ1NTA=","upper_bound":"LTEzNzEzMTE0NzI=","repeats":1},{"count":344,"lower_bound":"LTEzNjA5NTEzMzI=","upper_bound":"LTEzNDc5NDQwMDk=","repeats":1},{"count":352,"lower_bound":"LTEzNDMzMTAxNDc=","upper_bound":"LTEzMjU5MDMzMTc=","repeats":1},{"count":360,"lower_bound":"LTEzMTk5MTU2OTM=","upper_bound":"LTEzMDk2NTEyMzA=","repeats":1},{"count":368,"lower_bound":"LTEzMDI2NDkzNzU=","upper_bound":"LTEyODk0NTA1MjI=","repeats":1},{"count":376,"lower_bound":"LTEyODg0ODQ5OTQ=","upper_bound":"LTEyNjYwNTg4NzA=","repeats":1},{"count":384,"lower_bound":"LTEyNjMyNTQwNTY=","upper_bound":"LTEyNDkyNzMxMzk=","repeats":1},{"count":392,"lower_bound":"LTEyNDcyNjQ3MDE=","upper_bound":"LTEyMzg4Nzk1NDQ=","repeats":1},{"count":400,"lower_bound":"LTEyMzc3MTMzOTg=","upper_bound":"LTEyMzIwNTc3ODU=","repeats":1},{"count":408,"lower_bound":"LTEyMzE1OTA2MzI=","upper_bound":"LTEyMTg2NTYxMDM=","repeats":1},{"count":416,"lower_bound":"LTEyMTQ3Njc2MjA=","upper_bound":"LTEyMDMwNzU5NTE=","repeats":1},{"count":424,"lower_bound":"LTEyMDI0MjgwNDc=","upper_bound":"LTExOTU2NjgzOTU=","repeats":1},{"count":432,"lower_bound":"LTExOTM5MTQwMzE=","upper_bound":"LTExNzc2MDI4MTA=","repeats":1},{"count":440,"lower_bound":"LTExNjE4MjI0ODg=","upper_bound":"LTExNTU3NTQzNzY=","repeats":1},{"count":448,"lower_bound":"LTExNTQ3NzM3MDQ=","upper_bound":"LTExNDI3MzMzODI=","repeats":1},{"count":456,"lower_bound":"LTExNDAzNDkyNzg=","upper_bound":"LTExMzA3ODcyOTI=","repeats":1},{"count":464,"lower_bound":"LTExMjg0NzgwMTA=","upper_bound":"LTExMTc1MTM2ODI=","repeats":1},{"count":472,"lower_bound":"LTExMTU2OTgxOTc=","upper_bound":"LTEwOTk3OTIxNDc=","repeats":1},{"count":480,"lower_bound":"LTEwOTk0ODQ0OTc=","upper_bound":"LTEwODc2ODYxNjg=","repeats":1},{"count":488,"lower_bound":"LTEwODM5NjI2MzY=","upper_bound":"LTEwNzU3ODg2MTM=","repeats":1},{"count":496,"lower_bound":"LTEwNjQ4NTU2ODQ=","upper_bound":"LTEwNTk0MjUxNzg=","repeats":1},{"count":504,"lower_bound":"LTEwNTMyOTg4MTU=","upper_bound":"LTEwNDU1Njc3NTk=","repeats":1},{"count":512,"lower_bound":"LTEwNDExMDM4MTM=","upper_bound":"LTEwMzI2Nzk5ODU=","repeats":1},{"count":520,"lower_bound":"LTEwMjAwNzM3NjI=","upper_bound":"LTk4OTA0OTIxNQ==","repeats":1},{"count":528,"lower_bound":"LTk3NTk0NzA1OA==","upper_bound":"LTk2NDgyMDIwMA==","repeats":1},{"count":536,"lower_bound":"LTk2MzM3MzY5OA==","upper_bound":"LTk1NzU5NTQwOQ==","repeats":1},{"count":544,"lower_bound":"LTk1NTk5NDc4Mw==","upper_bound":"LTk0MjEzODMxNA==","repeats":1},{"count":552,"lower_bound":"LTkzOTcwODIwMQ==","upper_bound":"LTkxNzEwMDkxNQ==","repeats":1},{"count":560,"lower_bound":"LTg5ODM5ODI4Nw==","upper_bound":"LTg3ODU3MTE0MA==","repeats":1},{"count":568,"lower_bound":"LTg3Njk3MTk4Mg==","upper_bound":"LTg1MDAzMDExNA==","repeats":1},{"count":576,"lower_bound":"LTg0OTkxMjE5Ng==","upper_bound":"LTgzNjIyMDY1OA==","repeats":1},{"count":584,"lower_bound":"LTgzNTI5ODkzNg==","upper_bound":"LTgyMjQ2NzA5OA==","repeats":1},{"count":592,"lower_bound":"LTgxOTkzMTc3Nw==","upper_bound":"LTgwMjI1ODY1Ng==","repeats":1},{"count":600,"lower_bound":"LTgwMDk4NzcxNg==","upper_bound":"LTc5MTcwOTc2NA==","repeats":1},{"count":608,"lower_bound":"LTc4ODc0OTU3NQ==","upper_bound":"LTc3Nzc5NjQyNQ==","repeats":1},{"count":616,"lower_bound":"LTc3MzUxNTE1Mg==","upper_bound":"LTc2NDkzODk2MA==","repeats":1},{"count":624,"lower_bound":"LTc2NDM2MjczOA==","upper_bound":"LTczMjE4OTUxMQ==","repeats":1},{"count":632,"lower_bound":"LTcyMzU0MjcwOQ==","upper_bound":"LTcyMDI1MzgwMQ==","repeats":1},{"count":640,"lower_bound":"LTcyMDE1NzIwMA==","upper_bound":"LTY5MjE3ODQxMQ==","repeats":1},{"count":648,"lower_bound":"LTY5MjAyMTg0Mw==","upper_bound":"LTY4NDc5NzcxNw==","repeats":1},{"count":656,"lower_bound":"LTY3ODg3NDgyMA==","upper_bound":"LTY3Mjg3OTg4NQ==","repeats":1},{"count":664,"lower_bound":"LTY2NjIzNjMyNg==","upper_bound":"LTY1Mzc0NDk3Ng==","repeats":1},{"count":672,"lower_bound":"LTY1MzY5MTYzNQ==","upper_bound":"LTY0MDU1NzAyMg==","repeats":1},{"count":680,"lower_bound":"LTYzMjk0Njc5Mw==","upper_bound":"LTYzMTYxMDQxOQ==","repeats":1},{"count":688,"lower_bound":"LTYyNTQ1NjQ4Mw==","upper_bound":"LTYwMzM1MzM0Nw==","repeats":1},{"count":696,"lower_bound":"LTU5OTIwMzY0MA==","upper_bound":"LTU4MDA0MTU0MA==","repeats":1},{"count":704,"lower_bound":"LTU3ODY1NzI3Mw==","upper_bound":"LTU2Mjg4NjYzOA==","repeats":1},{"count":712,"lower_bound":"LTU2MTU5MTEyOA==","upper_bound":"LTUzNjQ4NzY5MA==","repeats":1},{"count":720,"lower_bound":"LTUzMzMyNjk0Ng==","upper_bound":"LTUyMzI0NTE5Mw==","repeats":1},{"count":728,"lower_bound":"LTUyMjkzOTk5Ng==","upper_bound":"LTUxNjQwNDM2OA==","repeats":1},{"count":736,"lower_bound":"LTUwNDY5NzQ2Mg==","upper_bound":"LTQ5NTY5ODYwOA==","repeats":1},{"count":744,"lower_bound":"LTQ5MjU0MDY3Mw==","upper_bound":"LTQ4NjI4Nzc5OQ==","repeats":1},{"count":752,"lower_bound":"LTQ4NTk5Njg3Mw==","upper_bound":"LTQ3Njc5MzYwNQ==","repeats":1},{"count":760,"lower_bound":"LTQ3NjQ5NzQ0Mw==","upper_bound":"LTQ2NjE0MjM2Nw==","repeats":1},{"count":768,"lower_bound":"LTQ0NzgxODQ3Mg==","upper_bound":"LTQ0NDIyMTE4NQ==","repeats":1},{"count":776,"lower_bound":"LTQ0MzQxNzUwMA==","upper_bound":"LTQzNTgyNTE5Mg==","repeats":1},{"count":784,"lower_bound":"LTQzMTc3MjIzNQ==","upper_bound":"LTQxMDc5MDE2NQ==","repeats":1},{"count":792,"lower_bound":"LTQwMjA3Nzc1Mw==","upper_bound":"LTM3NDk3NTQwNQ==","repeats":1},{"count":800,"lower_bound":"LTM3MzE4NTE1Mg==","upper_bound":"LTM2NzI2NjgzMA==","repeats":1},{"count":808,"lower_bound":"LTM2NjI1NjQ1MA==","upper_bound":"LTM1NDUyNTMwMg==","repeats":1},{"count":816,"lower_bound":"LTM1MjkxMDMxNg==","upper_bound":"LTMzNzM1ODI0MA==","repeats":1},{"count":824,"lower_bound":"LTMzNTM1MDUwOQ==","upper_bound":"LTMyNzc2ODM5Mg==","repeats":1},{"count":832,"lower_bound":"LTMyNzE3Nzg4NQ==","upper_bound":"LTMxOTU4NDMwNQ==","repeats":1},{"count":840,"lower_bound":"LTMxMjExNzY5OQ==","upper_bound":"LTMwNDQyNDM1Mw==","repeats":1},{"count":848,"lower_bound":"LTMwMjQzMjQzNg==","upper_bound":"LTI5MTUwOTQzNw==","repeats":1},{"count":856,"lower_bound":"LTI4Mjg5NzY0Ng==","upper_bound":"LTI3MjE5Njk5Mw==","repeats":1},{"count":864,"lower_bound":"LTI3MDY2MzczMQ==","upper_bound":"LTI2Mjk2ODI5NA==","repeats":1},{"count":872,"lower_bound":"LTI2MjA1MzA4MA==","upper_bound":"LTI0NTc4NDI3Nw==","repeats":1},{"count":880,"lower_bound":"LTI0NDQwOTcwNg==","upper_bound":"LTIzMzczNjI1Mg==","repeats":1},{"count":888,"lower_bound":"LTIzMDk3MzcyNQ==","upper_bound":"LTIyMjIwODA0OA==","repeats":1},{"count":896,"lower_bound":"LTIxNTcwOTQ5Mw==","upper_bound":"LTIwNTE0OTcyNA==","repeats":1},{"count":904,"lower_bound":"LTIwMTU5NzMzNg==","upper_bound":"LTE5MjIzMzI4Mg==","repeats":1},{"count":912,"lower_bound":"LTE5MTEzMTk3Mg==","upper_bound":"LTE3NjY5MDkxMw==","repeats":1},{"count":920,"lower_bound":"LTE3MzI0NjI0Nw==","upper_bound":"LTE3MTkyMDMxMQ==","repeats":1},{"count":928,"lower_bound":"LTE3MTY3ODg5OQ==","upper_bound":"LTE2MjQ1NjY5NQ==","repeats":1},{"count":936,"lower_bound":"LTE1NzIwMTUwMA==","upper_bound":"LTE1MTA3MTg1NA==","repeats":1},{"count":944,"lower_bound":"LTE0MDE3MzQ3MA==","upper_bound":"LTEyNjkwODc5MA==","repeats":1},{"count":952,"lower_bound":"LTEyNTY0MDYzMg==","upper_bound":"LTExNTk1MDc1Mg==","repeats":1},{"count":960,"lower_bound":"LTExMjQyNTk3NA==","upper_bound":"LTEwMTU0ODkyNw==","repeats":1},{"count":968,"lower_bound":"LTkzNzY4NjM3","upper_bound":"LTc0OTM1MDgy","repeats":1},{"count":976,"lower_bound":"LTczNDUxODgy","upper_bound":"LTYzMjQzNzA3","repeats":1},{"count":984,"lower_bound":"LTQ2ODE1OTYy","upper_bound":"LTI3NTMxODU0","repeats":1},{"count":992,"lower_bound":"LTI2NTk2OTU0","upper_bound":"LTMwMjIyODk=","repeats":1},{"count":1000,"lower_bound":"NDczMTAw","upper_bound":"ODgxMDc5MA==","repeats":1},{"count":1008,"lower_bound":"MTAwNjUyODE=","upper_bound":"MjczNDUwNDc=","repeats":1},{"count":1016,"lower_bound":"Mjc1NTE3NzQ=","upper_bound":"NDA1NjUwMTI=","repeats":1},{"count":1024,"lower_bound":"NDI1Mzc4MDY=","upper_bound":"NTEwOTU5NDQ=","repeats":1},{"count":1032,"lower_bound":"NTM4MzYzNjc=","upper_bound":"NzMwODM3ODM=","repeats":1},{"count":1040,"lower_bound":"Nzk0OTY3OTM=","upper_bound":"MTA2OTEyMTEx","repeats":1},{"count":1048,"lower_bound":"MTE2MDU1MDg0","upper_bound":"MTI0MDc3Mjkz","repeats":1},{"count":1056,"lower_bound":"MTMyMTA3MjE5","upper_bound":"MTQxNzA4NTk3","repeats":1},{"count":1064,"lower_bound":"MTQ1MzY2OTgz","upper_bound":"MTc3ODA2ODIx","repeats":1},{"count":1072,"lower_bound":"MTgxNTY1NTY1","upper_bound":"MTg4NzgyNjg5","repeats":1},{"count":1080,"lower_bound":"MTk5MjY1NzE5","upper_bound":"MjEyNzM3MTYy","repeats":1},{"count":1088,"lower_bound":"MjE2OTcyNjU4","upper_bound":"MjI2NDMwNzM2","repeats":1},{"count":1096,"lower_bound":"MjI3MTAzNzY2","upper_bound":"MjMyMDMwNjQx","repeats":1},{"count":1104,"lower_bound":"MjMzNDE4NTc0","upper_bound":"MjQ1MDgyNDcx","repeats":1},{"count":1112,"lower_bound":"MjQ4MTA3OTk2","upper_bound":"MjUxMjA5NTA5","repeats":1},{"count":1120,"lower_bound":"MjU0MzE1NTc1","upper_bound":"MjYyNDI4NzQ3","repeats":1},{"count":1128,"lower_bound":"MjYyNTIwODA3","upper_bound":"Mjc1MzI3Njg2","repeats":1},{"count":1136,"lower_bound":"Mjc2NjY4NTg2","upper_bound":"Mjk3NTk4NjI5","repeats":1},{"count":1144,"lower_bound":"MzAyMzg0OTMw","upper_bound":"MzEzMzk5NjIw","repeats":1},{"count":1152,"lower_bound":"MzIwNjAxNzQ3","upper_bound":"MzQxOTk4OTA3","repeats":1},{"count":1160,"lower_bound":"MzQ5MTgwNDM0","upper_bound":"MzczMDgwODM1","repeats":1},{"count":1168,"lower_bound":"Mzc0MzE1NjY3","upper_bound":"Mzc5MzU0MTAx","repeats":1},{"count":1176,"lower_bound":"MzkxMjU4MDA0","upper_bound":"NDIyNTg4MDIw","repeats":1},{"count":1184,"lower_bound":"NDI3OTUwMDk3","upper_bound":"NDQ5MzQ1NjUx","repeats":1},{"count":1192,"lower_bound":"NDUxMjEyOTkw","upper_bound":"NDY0MjQ1MDkx","repeats":1},{"count":1200,"lower_bound":"NDY5MDcyNTQ5","upper_bound":"NDgwMjkzODY0","repeats":1},{"count":1208,"lower_bound":"NDg1NzM1NTgy","upper_bound":"NTAyOTU2NzQ5","repeats":1},{"count":1216,"lower_bound":"NTA2NzY5NzIz","upper_bound":"NTQ5OTE2NDEy","repeats":1},{"count":1224,"lower_bound":"NTcxNDk0MzU0","upper_bound":"NTc2NDYyNDUw","repeats":1},{"count":1232,"lower_bound":"NTgwMDMzNzUy","upper_bound":"NTgzNzcyODQx","repeats":1},{"count":1240,"lower_bound":"NTg0MDczNTkz","upper_bound":"NTk4Nzg0NzI2","repeats":1},{"count":1248,"lower_bound":"NjAyNzA2NzUw","upper_bound":"NjE4OTAwNzk5","repeats":1},{"count":1256,"lower_bound":"NjIxMjQ5MTAx","upper_bound":"NjM0NTE4ODk3","repeats":1},{"count":1264,"lower_bound":"NjM1NTI0MDcy","upper_bound":"NjQ2MTA1ODk4","repeats":1},{"count":1272,"lower_bound":"NjQ3NjcxNTA4","upper_bound":"Njc1ODQwMDA5","repeats":1},{"count":1280,"lower_bound":"Njc2MzA4MDE3","upper_bound":"Njg2NjYwMTU5","repeats":1},{"count":1288,"lower_bound":"Njg3OTEyMjUx","upper_bound":"NjkyNzMyMTQx","repeats":1},{"count":1296,"lower_bound":"NjkzNzYwOTA0","upper_bound":"NzEyNzEzMTc1","repeats":1},{"count":1304,"lower_bound":"NzE0NzI0NDU3","upper_bound":"NzUwOTEzNzA1","repeats":1},{"count":1312,"lower_bound":"NzUwOTk0ODI4","upper_bound":"NzY4MjI4MzMw","repeats":1},{"count":1320,"lower_bound":"NzcyMjUwMDE0","upper_bound":"Nzc1NjU2MzUx","repeats":1},{"count":1328,"lower_bound":"NzgwMTEzNjE0","upper_bound":"ODAwNjYwNDY5","repeats":1},{"count":1336,"lower_bound":"ODE0NzI2NTgx","upper_bound":"ODIxMDQzOTQy","repeats":1},{"count":1344,"lower_bound":"ODI5MDU5MjA0","upper_bound":"ODQwNzk5NzQw","repeats":1},{"count":1352,"lower_bound":"ODUwOTQyMjkw","upper_bound":"ODY4MTc1MzEw","repeats":1},{"count":1360,"lower_bound":"ODc1NzYwNDk3","upper_bound":"OTA1MzYxMTc1","repeats":1},{"count":1368,"lower_bound":"OTA4MjUxMzI2","upper_bound":"OTIxMzYyODI4","repeats":1},{"count":1376,"lower_bound":"OTIxODIyNTIw","upper_bound":"OTQzMTcxNDAx","repeats":1},{"count":1384,"lower_bound":"OTUyMzQ4NDkz","upper_bound":"OTc2ODExNTIy","repeats":1},{"count":1392,"lower_bound":"OTc3MTM1MDgx","upper_bound":"OTg1MDQyMjMy","repeats":1},{"count":1400,"lower_bound":"OTkyNzI0NDg2","upper_bound":"MTAwNjQxNDI2OQ==","repeats":1},{"count":1408,"lower_bound":"MTAxODQxNTY0NA==","upper_bound":"MTA0MzgyMDIyNg==","repeats":1},{"count":1416,"lower_bound":"MTA0NTYzOTYzMA==","upper_bound":"MTA1ODA5NTAwOA==","repeats":1},{"count":1424,"lower_bound":"MTA2MzE1NzU1Ng==","upper_bound":"MTA3OTMxNTAwNw==","repeats":1},{"count":1432,"lower_bound":"MTA4MjU5OTE2NA==","upper_bound":"MTA5MTA2NzgyMw==","repeats":1},{"count":1440,"lower_bound":"MTA5MzM3NDE4OA==","upper_bound":"MTEwMjkxODU5MA==","repeats":1},{"count":1448,"lower_bound":"MTEwNjgzNTI2OQ==","upper_bound":"MTExMzQ3Mzk5NA==","repeats":1},{"count":1456,"lower_bound":"MTExNDkwOTIwMg==","upper_bound":"MTExOTkyODA4Mg==","repeats":1},{"count":1464,"lower_bound":"MTEyMzQ3NTE3Mw==","upper_bound":"MTE0NDM2OTk0NA==","repeats":1},{"count":1472,"lower_bound":"MTE0OTEyMzI3MA==","upper_bound":"MTE1NjM3ODgwNw==","repeats":1},{"count":1480,"lower_bound":"MTE1OTU1MDAyMA==","upper_bound":"MTE4MTU0MDY5OA==","repeats":1},{"count":1488,"lower_bound":"MTE4MjIyMzkxOQ==","upper_bound":"MTE4NjQ3ODYwMg==","repeats":1},{"count":1496,"lower_bound":"MTE5NjQ0MjUwMQ==","upper_bound":"MTE5OTYyMzYzNA==","repeats":1},{"count":1504,"lower_bound":"MTIwMzYxMzIyNA==","upper_bound":"MTIxMjg4MjY0OQ==","repeats":1},{"count":1512,"lower_bound":"MTIxNTUyMTM0Ng==","upper_bound":"MTIxNjcwMDkxOA==","repeats":1},{"count":1520,"lower_bound":"MTIxODY3MTgwOQ==","upper_bound":"MTI0MTk5MjYzNg==","repeats":1},{"count":1528,"lower_bound":"MTI0NTAyOTk1MQ==","upper_bound":"MTI1MDgyNzg2Mg==","repeats":1},{"count":1536,"lower_bound":"MTI1NzMxMzQwMA==","upper_bound":"MTI2MTk1ODA3NQ==","repeats":1},{"count":1544,"lower_bound":"MTI3MjU4NTc4Mg==","upper_bound":"MTI5MTAxNzAxNQ==","repeats":1},{"count":1552,"lower_bound":"MTI5MTA0NTk0Mg==","upper_bound":"MTMwMzIxMDE3NQ==","repeats":1},{"count":1560,"lower_bound":"MTMwNjAyODcwNw==","upper_bound":"MTMxMjAxOTA2Mg==","repeats":1},{"count":1568,"lower_bound":"MTMxMjM5ODY2Nw==","upper_bound":"MTMyMjM1MzExNw==","repeats":1},{"count":1576,"lower_bound":"MTMzMTA1MjYzNA==","upper_bound":"MTMzNDMwMjgwNA==","repeats":1},{"count":1584,"lower_bound":"MTMzNTM3OTI4Nw==","upper_bound":"MTM1MTA3MzgzMQ==","repeats":1},{"count":1592,"lower_bound":"MTM1NDg5MTkzMg==","upper_bound":"MTM3NDU3MzM1Mw==","repeats":1},{"count":1600,"lower_bound":"MTM3NzQ4NDgzNw==","upper_bound":"MTM5ODQ2MDkyMQ==","repeats":1},{"count":1608,"lower_bound":"MTQwMDQyMTUyMQ==","upper_bound":"MTQxMjM2Mjg4OA==","repeats":1},{"count":1616,"lower_bound":"MTQxMjgxNjA2OA==","upper_bound":"MTQyMTc2NjI5NA==","repeats":1},{"count":1624,"lower_bound":"MTQyMzI4MjI4Nw==","upper_bound":"MTQ2MDA5ODYyMQ==","repeats":1},{"count":1632,"lower_bound":"MTQ2NjQyOTE0MA==","upper_bound":"MTQ2NzY5NTUwNA==","repeats":1},{"count":1640,"lower_bound":"MTQ2ODU1NDk3OQ==","upper_bound":"MTQ4MjI2NzczNg==","repeats":1},{"count":1648,"lower_bound":"MTQ4OTExMDEwOQ==","upper_bound":"MTUwNzQ2MDkzMQ==","repeats":1},{"count":1656,"lower_bound":"MTUwOTU5MjU0Nw==","upper_bound":"MTUxNzA3ODA5OA==","repeats":1},{"count":1664,"lower_bound":"MTUyMjkwOTQxMw==","upper_bound":"MTUyNzAyODA4OQ==","repeats":1},{"count":1672,"lower_bound":"MTUyOTkwMzI3MA==","upper_bound":"MTUzNTY1NjkzNQ==","repeats":1},{"count":1680,"lower_bound":"MTUzNjg0ODcwNA==","upper_bound":"MTU2MzExMjEwNg==","repeats":1},{"count":1688,"lower_bound":"MTU3MjM1MzcwNg==","upper_bound":"MTU3NjA0NzMyMw==","repeats":1},{"count":1696,"lower_bound":"MTU3OTU3NTg2NQ==","upper_bound":"MTU5NTg5MjAwNA==","repeats":1},{"count":1704,"lower_bound":"MTYwODIyNDMxNw==","upper_bound":"MTYyMTAwMjYwNw==","repeats":1},{"count":1712,"lower_bound":"MTYyMzI5ODg3NQ==","upper_bound":"MTY1NDcyODQ4MQ==","repeats":1},{"count":1720,"lower_bound":"MTY2MjA5MTc4OA==","upper_bound":"MTY2Mjc5NDgzNA==","repeats":1},{"count":1728,"lower_bound":"MTY2NjM1OTY2MQ==","upper_bound":"MTY3NjgwNzIxMg==","repeats":1},{"count":1736,"lower_bound":"MTY4MTE2NTE3Mg==","upper_bound":"MTY4MzUwMTU4Mw==","repeats":1},{"count":1744,"lower_bound":"MTY4OTc1ODM1Mg==","upper_bound":"MTY5NjQzMzQzOQ==","repeats":1},{"count":1752,"lower_bound":"MTcwODU2MDI3MA==","upper_bound":"MTcxNzM0MTQzMw==","repeats":1},{"count":1760,"lower_bound":"MTcxODQzODA0Ng==","upper_bound":"MTcyNTM3NTM3Mw==","repeats":1},{"count":1768,"lower_bound":"MTcyODU0ODEzMQ==","upper_bound":"MTczNDQ4NzA0OA==","repeats":1},{"count":1776,"lower_bound":"MTczNzc4OTM0MA==","upper_bound":"MTc0MzkzOTExMw==","repeats":1},{"count":1784,"lower_bound":"MTc0NTgzMDY5MA==","upper_bound":"MTc1NTY1OTg5MQ==","repeats":1},{"count":1792,"lower_bound":"MTc1NTY5NzY5MA==","upper_bound":"MTc1ODU1OTMxNw==","repeats":1},{"count":1800,"lower_bound":"MTc2MzUzODczMA==","upper_bound":"MTc4MTkwMzAzMg==","repeats":1},{"count":1808,"lower_bound":"MTc4MjIzOTkxOA==","upper_bound":"MTc4NjMyNDkxMw==","repeats":1},{"count":1816,"lower_bound":"MTc4OTYxMTE5MQ==","upper_bound":"MTgwMzAxOTczNg==","repeats":1},{"count":1824,"lower_bound":"MTgxMTQ0NzcyMQ==","upper_bound":"MTgyOTQwNzc2Mw==","repeats":1},{"count":1832,"lower_bound":"MTgzNTIyNDkwNA==","upper_bound":"MTg0MjI4MTI0OA==","repeats":1},{"count":1840,"lower_bound":"MTg0MjM4OTI1Ng==","upper_bound":"MTg0NTk2MjIxNw==","repeats":1},{"count":1848,"lower_bound":"MTg0NzQxMjAwOA==","upper_bound":"MTg1MDg2MTg4NQ==","repeats":1},{"count":1856,"lower_bound":"MTg1NTExMzg2OA==","upper_bound":"MTg3MDI3MTY3MA==","repeats":1},{"count":1864,"lower_bound":"MTg3MzY1OTkzMw==","upper_bound":"MTg4MjQ0ODA0Mg==","repeats":1},{"count":1872,"lower_bound":"MTg4MzUyNzgwOA==","upper_bound":"MTg5MDQ1OTI0NA==","repeats":1},{"count":1880,"lower_bound":"MTg5MTIzMjY0NQ==","upper_bound":"MTkwNTUxODE3NQ==","repeats":1},{"count":1888,"lower_bound":"MTkwOTk1NDI5OA==","upper_bound":"MTkyNDAyMjM4OQ==","repeats":1},{"count":1896,"lower_bound":"MTkyNTA4MDU1Mg==","upper_bound":"MTk0MTk5OTg3Nw==","repeats":1},{"count":1904,"lower_bound":"MTk0MzMyNDE4OQ==","upper_bound":"MTk1NTk3ODgzNQ==","repeats":1},{"count":1912,"lower_bound":"MTk1ODUwNzM5OQ==","upper_bound":"MTk2NzYxODkyNw==","repeats":1},{"count":1920,"lower_bound":"MTk2NzgzNDQ2OQ==","upper_bound":"MTk3ODUwMzA4Mw==","repeats":1},{"count":1928,"lower_bound":"MTk3OTM3Nzg5NQ==","upper_bound":"MTk4NTU0NzcyMg==","repeats":1},{"count":1936,"lower_bound":"MjAwMDE4Mjc1Ng==","upper_bound":"MjAyMjc0ODY2MA==","repeats":1},{"count":1944,"lower_bound":"MjAyMjg3OTc1NA==","upper_bound":"MjAzODczODUyNw==","repeats":1},{"count":1952,"lower_bound":"MjA0NDI2ODU0Ng==","upper_bound":"MjA0ODY0NzU1Ng==","repeats":1},{"count":1960,"lower_bound":"MjA1NTYwMjA2MA==","upper_bound":"MjA2NDI1ODA1MA==","repeats":1},{"count":1968,"lower_bound":"MjA2OTYzNjg2MQ==","upper_bound":"MjA4ODQyNjQyOA==","repeats":1},{"count":1976,"lower_bound":"MjA5MTAxOTA5NA==","upper_bound":"MjA5ODI1MjkwOQ==","repeats":1},{"count":1984,"lower_bound":"MjEwMzI1ODQ4Ng==","upper_bound":"MjExNDA4NTUxNA==","repeats":1},{"count":1992,"lower_bound":"MjEyMjU2MDE4NA==","upper_bound":"MjEzMzg3OTkzNA==","repeats":1},{"count":2000,"lower_bound":"MjEzNDIxMDEwMg==","upper_bound":"MjE0Njg3NTgzMA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,4,2,0,1,0,1,1,2,1,1,2,2,0,3,1,0,0,0,2,0,1,0,1,1,1,2,3,0,0,0,0,1,2,0,3,0,1,0,0,0,2,0,1,2,0,2,0,3,2,0,1,0,0,0,0,1,0,1,1,0,1,1,2,0,3,1,2,1,0,0,1,2,0,1,1,0,1,3,1,0,1,0,0,2,3,4,0,2,0,1,2,0,0,2,1,0,3,0,0,1,0,0,0,3,1,0,4,0,3,2,0,2,0,0,0,2,0,0,3,3,1,0,1,0,0,0,0,1,1,0,0,2,3,1,1,0,0,1,1,2,1,0,1,1,1,0,1,2,0,2,0,0,2,1,0,1,0,0,1,2,1,0,0,2,0,0,0,1,3,0,0,2,0,1,0,2,1,0,1,1,2,1,1,1,1,1,1,2,0,1,3,0,1,2,2,1,0,2,0,2,1,1,3,0,0,1,1,0,1,1,1,0,0,2,1,5,1,1,1,2,1,1,0,0,0,0,0,1,1,1,5,1,2,0,0,0,2,3,0,2,0,2,1,0,1,1,0,1,2,1,1,1,1,1,1,2,1,0,1,0,0,0,1,1,2,0,2,1,1,1,3,0,2,1,0,1,4,4,4,2,1,1,2,1,0,2,2,2,1,2,0,0,1,1,1,2,0,1,0,1,0,2,1,2,0,1,0,2,0,1,3,1,2,2,3,1,2,1,2,0,1,1,1,0,0,1,4,1,1,1,1,1,1,0,0,2,2,1,1,2,0,2,0,1,1,2,1,3,0,1,1,2,1,0,2,1,3,0,4,1,0,1,1,0,0,2,1,4,2,1,2,1,2,0,0,2,1,0,1,0,0,0,1,0,0,0,0,5,1,1,2,1,0,1,1,1,0,0,1,0,0,1,0,2,1,0,0,0,1,1,1,1,1,4,1,2,1,2,4,0,1,2,0,1,1,1,2,1,1,1,3,2,1,0,3,1,0,0,0,0,1,2,3,1,1,0,1,0,1,2,2,2,3,1,0,3,3,0,0,1,2,1,2,0,0,1,2,1,2,1,2,0,1,1,0,1,2,0,0,1,2,0,0,0,0,1,1,0,1,2,0,0,0,0,1,1,2,3,0,1,0,3,2,1,1,0,1,0,1,2,0,2,1,1,0,1,1,2,0,1,1,2,0,1,1,0,1,0,0,1,1,1,2,1,2,1,0,0,1,2,0,1,0,1,0,1,3,0,0,0,1,2,0,0,1,0,2,0,1,3,5,2,1,0,0,2,1,1,1,1,0,1,1,0,1,0,3,0,1,3,1,1,1,0,0,2,1,2,0,0,1,1,1,0,1,1,0,2,1,0,2,1,2,1,0,2,0,1,0,0,1,0,3,0,2,1,0,0,2,1,0,1,0,1,2,1,1,2,2,2,1,2,1,0,4,0,0,0,0,1,1,1,4,2,0,1,2,0,0,0,0,1,1,3,0,1,2,1,0,0,0,1,2,1,2,1,2,1,1,0,1,2,0,3,1,1,0,1,1,0,1,2,2,5,2,1,0,2,0,0,2,0,0,1,1,3,0,1,0,0,0,1,1,2,0,2,0,1,0,1,2,2,0,0,0,0,0,0,1,0,0,0,0,0,1,0,2,1,1,3,0,1,0,1,3,1,1,1,1,0,2,1,1,0,1,2,1,1,0,0,1,1,1,2,0,2,1,0,1,0,0,2,2,0,1,0,0,1,1,0,2,0,0,1,0,1,3,0,0,1,1,2,1,0,0,1,2,0,1,0,0,2,1,0,0,2,2,1,2,1,1,1,0,1,0,0,1,2,1,3,1,4,0,2,1,0,1,1,2,1,1,0,1,3,1,1,2,1,0,2,3,0,2,1,1,1,2,0,0,2,0,0,0,1,0,0,0,0,1,0,0,0,2,1,1,1,0,1,1,2,0,1,4,3,1,1,1,0,0,2,1,3,0,1,0,1,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,0,0,0,2,0,3,2,1,1,3,0,1,1,1,0,0,3,1,2,1,0,0,1,0,1,0,0,1,0,0,1,1,1,0,1,1,0,0,2,2,1,0,1,0,0,1,1,1,1,0,1,1,2,1,2,1,1,0,2,0,1,1,0,0,3,1,0,0,0,2,1,0,1,1,3,1,2,1,0,0,2,2,0,1,1,2,3,1,1,3,1,2,0,1,4,2,0,0,0,1,0,0,2,3,0,0,2,0,1,0,0,3,0,0,1,1,1,0,0,1,0,3,1,2,2,0,0,0,0,1,0,1,1,1,1,1,0,1,2,1,1,0,3,0,0,2,0,1,2,0,3,1,1,0,1,1,0,1,1,2,1,0,1,2,1,2,2,0,1,2,1,2,4,1,0,2,2,0,0,1,1,0,2,1,1,1,0,0,0,0,1,2,1,0,2,0,0,0,1,2,1,1,1,2,1,0,1,2,3,1,0,0,0,0,0,1,1,3,2,1,3,5,2,1,2,0,1,0,0,2,0,0,1,2,0,2,1,2,0,1,0,0,2,2,0,0,2,1,1,1,0,0,3,1,1,0,0,1,0,0,1,0,2,0,3,0,1,4,1,2,1,0,2,0,2,2,1,2,0,0,0,1,1,1,0,2,1,0,0,1,0,0,0,0,1,0,1,4,1,1,1,1,0,0,3,1,0,2,1,0,0,1,1,1,2,1,2,3,0,2,0,0,1,3,1,1,2,2,3,2,3,2,0,1,2,1,2,3,1,0,1,1,0,2,2,1,1,2,1,1,3,0,2,1,2,1,0,1,0,2,3,1,1,1,0,2,2,0,2,0,4,1,1,0,2,2,0,0,0,1,0,0,0,1,0,2,2,0,0,0,0,3,2,0,1,2,1,0,1,1,3,2,0,0,2,1,0,0,1,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,1,0,0,2,0,1,0,0,0,0,3,0,1,2,0,1,1,0,1,1,3,1,0,2,2,3,0,2,0,2,0,0,0,0,0,0,1,2,3,0,1,2,1,2,2,0,0,0,1,2,1,0,0,0,0,1,1,2,0,1,0,1,1,2,2,2,2,1,2,1,1,2,2,1,0,0,0,3,1,1,1,0,0,1,2,0,1,2,2,0,1,1,1,1,0,1,0,3,1,1,1,1,1,1,1,0,0,1,1,0,0,0,2,3,2,0,1,1,1,1,0,0,0,2,3,2,2,0,1,1,0,0,1,0,2,0,2,2,0,1,1,0,2,0,1,1,2,1,1,2,0,2,1,1,0,0,2,1,1,3,0,1,1,0,0,2,0,0,1,2,1,3,1,0,0,0,1,0,1,1,2,0,2,1,1,3,1,1,1,1,0,0,0,1,2,2,3,1,1,0,1,2,0,0,1,1,1,2,1,1,0,1,0,1,1,0,1,0,0,1,1,0,3,2,0,0,0,1,0,1,2,2,1,2,0,0,0,0,1,0,0,0,2,2,1,0,0,0,1,0,0,0,0,1,2,2,0,2,1,1,0,0,2,0,3,0,0,2,0,1,0,2,2,0,2,2,1,2,2,3,0,1,3,0,1,0,2,1,1,0,1,1,1,1,0,4,0,2,1,2,2,2,1,2,2,0,1,1,0,2,0,0,1,0,1,0,0,0,2,1,1,1,1,0,2,4,3,1,1,1,1,3,1,1,0,0,3,1,3,2,2,1,1,0,2,1,0,1,2,1,1,1,1,1,1,2,1,1,2,1,1,1,1,1,0,0,0,2,2,1,4,1,0,1,0,1,2,0,0,2,1,1,0,0,1,2,1,0,1,1,0,3,0,0,1,1,0,1,1,0,0,0,0,1,2,1,1,1,2,2,2,0,1,3,3,1,0,1,0,0,1,2,1,1,0,3,0,1,1,1,1,1,1,1,1,2,0,2,5,3,1,1,2,1,0,1,2,2,0,2,0,5,0,0,1,0,2,0,0,1,1,0,0,0,2,3,1,1,1,1,0,0,1,2,2,1,0,0,3,1,3,2,1,0,1,1,1,0,0,0,0,1,1,0,0,0,1,1,1,1,0,1,0,2,0,2,0,1,0,1,1,1,0,1,0,0,0,1,0,0,4,1,0,0,0,4,2,0,0,1,0,2,2,0,0,1,0,1,2,0,0,0,1,1,2,2,2,1,1,0,0,0,0,1,0,3,1,1,0,0,2,2,0,0,1,1,2,3,2,2,3,0,1,1,0,2,1,0,0,1,1,0,3,0,0,0,2,1,1,0,2,0,0,0,1,0,0,0,0,0,0,2,1,1,1,3,1,1,0,1,2,0,0,1,1,0,1,0,2,2,1,1,3,1,1,0,2,1,4,0,1,0,0,2,0,1,0,2,2,1,1,1,0,1,1,1,0,2,0,2,0,1,1,1,1,0,3,1,2,0,1,2,0,0,1,1,3,0,1,2,0,2,0,0,1,1,0,2,0,0,1,0,1,0,1,1,0,1,2,0,0,0,0,1,1,1,2,0,2,0,2,1,0,2,0,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,2,1,0,0,3,1,1,2,0,0,2]},{"counters":[0,1,0,1,0,0,1,0,0,1,2,0,0,1,1,1,0,2,2,2,1,2,1,1,2,1,1,2,1,1,1,0,2,0,0,2,1,2,2,1,1,0,0,2,2,1,1,1,1,0,0,1,0,0,0,1,0,2,2,4,0,1,1,0,0,0,2,1,0,1,1,2,1,1,0,1,1,0,1,1,1,1,0,0,2,2,4,3,0,3,1,1,0,0,1,1,1,0,0,0,0,2,1,0,1,0,0,0,1,0,0,1,0,0,0,1,0,3,1,2,1,1,2,2,0,4,1,0,1,3,1,1,2,2,1,0,1,1,0,2,1,2,1,1,0,2,1,1,0,1,0,0,0,0,1,4,1,1,1,2,0,2,3,0,0,1,4,0,2,2,0,1,2,2,0,3,1,0,1,0,2,3,1,0,0,1,0,0,1,1,1,2,0,1,1,1,2,1,0,3,0,1,4,1,1,0,1,2,0,0,0,3,1,0,3,1,2,0,1,1,1,0,2,0,0,1,0,1,2,0,0,2,1,0,0,1,1,2,1,3,0,0,0,1,0,2,1,2,1,3,1,1,0,1,0,1,2,0,2,4,2,0,0,0,0,1,2,2,0,4,0,3,3,0,0,3,3,1,3,0,1,1,1,0,1,0,1,0,0,1,2,1,1,0,1,1,0,3,0,0,1,1,1,0,2,0,2,2,1,0,0,0,1,3,3,0,0,0,1,0,0,0,1,1,2,1,1,1,2,1,1,1,0,1,2,1,1,0,1,0,0,0,1,0,1,1,1,0,2,0,1,1,2,0,3,0,0,1,0,1,1,3,1,0,1,1,0,1,2,3,1,0,1,1,2,1,0,1,2,3,2,0,1,1,1,1,2,0,0,0,2,1,3,1,0,1,0,1,2,1,0,2,1,0,1,1,0,0,1,3,0,1,2,0,0,0,0,1,1,1,0,2,2,0,1,0,4,1,1,2,2,1,2,0,0,2,1,1,2,0,1,2,0,0,0,1,1,1,0,2,1,2,4,0,2,1,0,0,0,0,1,0,0,2,0,1,0,1,1,1,1,1,0,2,0,1,2,1,0,0,1,1,2,0,4,1,1,1,3,1,0,1,2,1,1,3,2,2,0,0,1,0,0,0,0,1,0,1,1,2,1,2,3,1,1,2,0,1,0,0,0,2,3,1,2,0,1,3,1,0,0,0,0,0,0,0,1,2,2,0,0,1,0,1,0,3,2,1,0,0,1,1,1,2,1,1,1,0,1,1,0,1,1,1,3,0,1,1,1,2,0,2,1,0,1,0,1,0,0,0,2,0,0,3,1,1,0,1,2,0,1,2,2,2,0,1,3,0,0,2,2,1,1,2,1,0,1,0,0,0,1,1,0,0,1,2,0,1,1,0,0,0,0,2,0,1,0,1,2,1,2,0,0,1,2,3,1,0,0,0,1,0,0,2,0,1,1,1,0,0,0,3,0,1,0,0,1,0,2,2,1,2,0,2,0,1,1,0,1,2,1,2,2,2,3,2,2,0,1,1,0,0,1,0,1,5,0,1,2,2,1,2,0,1,1,2,0,2,0,2,1,1,3,2,2,1,0,1,0,1,2,0,0,2,1,0,0,2,0,0,1,2,0,1,0,2,0,3,1,2,1,1,0,0,1,2,1,2,1,0,1,2,1,0,0,0,1,0,2,1,1,1,1,1,2,1,1,0,0,2,0,1,1,1,0,4,2,1,2,0,0,2,1,1,4,0,1,0,1,0,0,0,0,3,1,1,0,2,2,1,2,1,1,0,1,0,1,1,0,1,0,0,1,1,0,3,0,1,0,1,3,0,0,1,0,1,1,1,1,2,2,3,2,0,0,1,0,1,1,0,0,1,2,1,2,2,0,2,1,1,0,1,0,0,0,1,3,0,1,3,0,0,1,0,1,1,1,1,1,1,1,1,1,2,1,1,0,1,1,2,0,0,1,0,0,0,1,1,1,0,0,2,0,1,2,0,2,0,1,1,0,0,0,1,0,2,1,1,0,0,2,1,0,0,1,0,0,1,2,3,1,1,2,2,1,1,0,2,0,0,1,0,1,0,0,1,1,1,0,0,2,1,1,3,0,7,0,1,1,1,2,2,0,1,1,1,0,1,0,1,1,1,0,0,1,0,0,1,3,1,0,2,2,2,2,2,1,1,2,1,1,0,1,1,1,1,2,1,0,1,0,2,1,2,1,2,0,0,2,0,0,0,0,2,0,0,0,0,2,0,0,1,2,2,0,0,0,0,3,0,2,0,0,3,0,4,1,0,1,0,3,0,2,0,1,1,1,1,1,0,4,0,0,1,2,2,1,0,0,3,0,0,1,2,0,2,1,0,0,1,2,2,1,1,2,1,2,4,1,0,0,0,2,0,0,1,0,0,1,2,1,2,2,3,1,2,2,1,1,0,1,0,3,0,1,1,1,0,2,0,1,1,2,5,0,2,0,1,3,1,0,0,1,1,1,0,0,2,2,0,0,2,0,1,1,0,4,2,0,0,2,5,1,1,0,1,0,3,1,2,0,0,0,3,2,0,0,0,0,1,1,0,1,2,1,1,0,1,0,0,0,3,0,0,2,0,1,1,1,0,2,1,1,0,2,3,1,0,0,1,1,2,1,0,0,0,0,4,1,2,1,2,0,1,0,1,2,0,1,1,0,1,0,0,0,0,0,0,1,1,0,2,2,1,0,1,0,2,2,1,0,0,0,3,1,0,1,1,3,2,2,1,0,0,3,2,0,1,1,0,1,1,1,0,1,1,1,4,1,3,1,0,2,1,2,1,1,2,0,0,0,1,1,1,1,1,1,4,0,1,1,0,0,0,0,2,1,4,1,2,0,1,0,2,0,1,1,1,1,3,0,1,0,1,2,0,1,3,2,0,0,1,0,1,1,2,1,0,2,2,0,0,2,1,1,0,1,1,0,0,0,0,0,2,0,0,3,0,1,0,0,1,0,2,0,0,0,0,2,1,1,1,1,0,1,0,1,0,2,1,0,2,1,1,0,1,1,2,0,1,0,1,2,1,1,1,1,2,0,0,0,0,0,2,0,0,0,1,2,0,0,0,0,0,1,0,1,0,1,2,0,1,0,2,0,1,1,3,1,0,3,0,3,2,1,2,0,1,0,2,1,1,0,3,0,0,1,1,1,3,2,0,0,0,0,3,2,2,2,0,1,1,0,3,2,1,1,1,2,1,1,0,0,0,1,1,0,2,1,0,1,1,1,2,1,1,3,1,1,1,0,0,0,1,4,1,2,2,0,0,0,0,2,2,1,2,1,2,1,2,1,0,1,0,2,2,0,0,0,1,1,0,1,0,1,1,3,1,3,1,1,1,3,0,3,1,0,4,1,1,0,0,0,1,1,1,2,1,1,1,1,1,3,0,0,2,1,2,2,1,2,0,2,0,2,1,1,0,2,0,0,0,0,1,5,1,1,2,0,1,0,0,1,1,1,1,1,1,0,0,0,2,1,0,1,0,1,2,2,1,1,1,2,0,2,2,2,1,0,0,1,0,1,0,1,0,0,1,3,0,1,0,1,1,0,1,0,0,0,0,2,1,1,1,1,0,1,1,1,1,0,0,0,2,0,1,1,1,1,0,2,0,0,0,1,0,0,1,0,1,0,0,1,1,1,1,4,1,1,0,0,1,3,0,2,1,2,1,1,1,0,3,1,1,2,5,1,0,1,4,1,0,2,1,2,0,0,1,2,1,1,3,1,0,0,1,1,1,1,1,1,1,2,1,1,0,2,1,0,0,2,0,1,1,0,1,3,0,1,0,1,2,0,1,1,0,0,2,3,0,2,2,2,0,2,2,0,2,0,0,0,2,0,0,2,0,1,2,1,1,2,5,1,0,1,0,1,4,1,0,0,2,1,1,0,3,2,0,1,0,2,0,0,2,1,1,0,1,1,1,2,0,1,2,1,2,1,2,0,1,0,2,1,0,3,0,1,0,0,0,1,2,2,1,1,0,1,0,1,1,5,1,1,0,1,0,2,0,1,1,2,1,2,0,1,4,0,2,2,0,1,1,0,1,2,1,1,3,2,3,0,1,1,0,1,0,2,2,1,1,1,1,2,2,3,1,0,0,1,1,0,1,0,3,0,2,2,2,2,1,0,0,2,1,1,3,1,0,0,2,1,2,1,1,0,0,2,1,1,0,0,1,1,0,0,0,1,0,2,1,1,0,1,1,1,1,0,0,3,3,1,1,0,0,2,0,2,4,1,0,0,0,0,0,1,0,1,0,3,0,2,0,1,0,1,2,2,0,1,0,2,1,0,0,1,3,1,1,1,1,0,0,2,1,0,2,1,1,1,1,1,0,0,0,3,0,4,0,0,2,2,0,2,0,2,1,0,0,3,2,0,0,2,0,1,2,0,1,1,1,0,0,1,2,1,2,0,1,0,0,0,1,1,0,2,1,0,3,3,2,2,3,1,1,1,0,3,2,1,1,0,1,2,0,2,2,0,0,2,1,1,2,2,2,1,0,0,1,1,1,4,0,0,1,1,1,2,0,2,0,3,1,1,1,0,1,0,0,1,1,0,0,0,0,0,1,1,0,0,1,0,1,1,0,1,1,0,0]},{"counters":[1,0,0,1,0,2,0,2,3,1,1,1,1,1,1,1,1,1,0,1,1,2,1,0,1,0,0,0,0,2,1,1,3,1,1,1,1,1,1,0,1,0,1,2,0,2,0,0,1,0,2,1,1,0,1,2,0,1,0,1,0,1,1,0,1,0,0,1,2,1,0,2,2,0,1,1,2,3,1,0,1,0,2,0,0,1,0,0,2,0,0,0,0,1,2,0,0,0,1,0,2,1,0,3,0,2,0,2,1,2,0,2,1,2,0,3,0,0,2,3,0,0,0,1,1,0,2,2,1,1,1,0,0,0,2,0,1,1,1,2,1,2,2,0,1,1,1,1,2,2,1,0,0,0,1,2,0,1,0,1,0,1,0,1,1,3,1,1,4,3,1,0,1,0,3,2,2,1,0,2,2,1,1,0,1,1,1,0,1,2,1,0,1,1,1,0,3,1,1,3,3,1,2,0,2,0,0,1,1,0,2,1,2,2,0,1,2,0,1,0,1,2,0,1,1,2,0,1,1,2,1,0,0,3,3,0,0,2,0,1,2,2,2,4,1,4,2,0,1,0,0,0,1,0,3,2,0,1,0,3,2,5,0,2,1,0,0,1,1,0,3,1,1,0,1,0,1,1,0,1,1,3,1,2,3,2,1,1,2,0,3,1,0,1,2,1,1,1,3,0,0,1,1,0,2,2,3,1,1,1,2,1,0,1,0,0,0,1,1,0,1,2,1,1,2,1,2,1,2,0,0,3,1,0,0,0,0,1,0,1,0,4,0,3,0,1,1,1,2,2,0,2,1,1,2,2,0,1,2,2,2,0,1,0,1,1,0,1,2,0,0,0,1,2,0,0,0,0,1,1,1,0,0,0,1,1,0,1,1,0,0,2,3,0,0,0,2,1,1,0,3,1,0,0,1,0,0,0,1,2,0,1,0,3,1,0,1,0,1,0,2,0,2,0,2,1,1,2,1,0,0,3,2,2,0,1,1,3,0,0,2,0,2,1,1,3,0,1,1,1,2,0,1,1,1,0,1,3,0,2,0,2,0,2,2,0,0,2,0,2,0,1,0,1,1,0,1,3,0,2,1,0,3,3,0,2,1,1,2,3,4,0,2,0,1,1,1,1,0,2,0,3,2,0,0,0,0,0,1,3,1,0,2,2,3,0,0,2,0,0,0,0,1,2,1,2,1,1,2,0,3,1,2,0,2,2,1,0,2,0,1,0,1,0,0,0,0,1,1,0,3,2,1,1,0,0,2,2,1,0,0,1,0,1,0,0,1,1,2,1,1,0,1,1,2,0,0,1,0,1,1,0,1,1,0,1,1,0,1,0,0,1,1,1,1,2,0,2,0,2,3,3,1,1,2,1,0,0,4,0,0,3,3,1,0,1,2,1,0,1,3,0,1,0,1,1,2,2,0,2,0,3,1,3,1,2,1,1,0,0,1,4,1,1,0,0,0,0,0,1,1,1,1,0,1,0,2,0,1,1,1,1,3,1,0,1,0,1,3,2,1,0,0,1,0,1,3,0,0,1,0,2,3,0,1,1,1,0,2,2,1,1,1,2,0,2,3,2,3,2,1,1,0,3,2,1,1,0,1,1,1,0,1,0,2,1,0,1,1,0,3,0,1,0,1,1,0,1,1,1,2,3,1,2,0,3,1,0,1,1,1,1,2,0,0,0,1,1,0,3,2,0,0,0,1,0,0,1,0,0,0,2,2,1,0,2,2,2,1,1,0,1,3,0,0,2,1,2,1,1,3,2,0,1,2,0,2,1,1,2,1,1,2,1,1,0,0,2,0,0,2,0,0,1,0,0,1,0,1,1,0,1,1,1,0,3,0,0,1,0,0,2,2,1,0,3,0,0,0,0,0,0,1,3,0,0,2,3,1,1,1,3,0,2,0,2,0,2,1,0,1,0,2,0,2,2,0,2,0,1,2,1,0,0,2,0,3,2,1,2,1,2,1,2,0,2,1,2,0,2,1,1,2,1,1,0,1,3,0,2,1,2,1,0,1,0,1,0,0,1,2,0,1,0,0,2,1,1,3,2,0,2,1,0,1,0,1,0,0,1,0,1,1,1,2,1,0,0,0,1,2,0,1,2,0,1,0,1,4,1,1,2,2,1,0,0,1,2,0,2,0,0,2,0,3,2,1,2,0,0,0,1,0,2,0,2,2,4,1,1,1,2,2,1,1,0,1,1,1,0,0,0,1,0,1,0,1,0,0,1,2,2,0,0,1,2,1,0,1,3,1,0,1,1,2,1,0,0,2,0,1,0,1,1,0,0,2,1,0,0,0,1,1,1,2,1,1,0,0,2,0,1,2,0,1,3,1,0,0,2,0,1,1,0,0,2,0,1,1,1,1,0,1,0,0,1,1,0,0,2,0,1,3,1,1,0,0,2,0,0,0,1,0,0,0,0,1,3,1,0,4,0,2,1,0,0,2,2,0,1,0,0,1,2,1,2,1,1,1,0,2,0,1,1,1,1,3,1,0,0,1,0,0,1,3,2,1,1,0,1,1,0,2,1,2,2,0,2,1,1,1,0,3,2,2,1,2,1,1,0,0,2,0,1,0,0,2,1,0,1,0,1,0,1,2,1,0,0,1,0,0,0,0,0,0,2,0,1,1,0,0,2,0,0,2,2,0,0,1,1,0,0,1,0,0,3,1,2,1,0,2,0,1,2,1,2,0,2,0,0,0,2,3,2,2,0,0,2,0,0,0,0,0,1,2,3,3,1,0,2,0,2,0,0,0,1,0,0,1,0,0,2,2,2,0,2,2,0,0,2,4,3,2,2,2,0,1,2,0,3,1,1,1,0,0,3,4,0,3,1,0,0,1,2,1,1,1,0,1,2,1,3,1,1,2,2,1,0,0,0,0,0,1,1,2,0,4,1,0,0,2,2,1,1,0,0,3,2,2,0,0,2,2,1,1,0,1,0,0,0,0,1,1,0,3,0,1,2,1,0,2,0,0,0,1,3,1,3,0,0,2,0,1,0,1,2,1,0,0,2,1,0,3,1,0,1,0,0,1,1,1,1,2,1,0,2,0,0,1,2,3,0,2,1,2,0,2,2,2,1,1,3,1,3,1,4,1,0,1,1,0,0,1,1,1,1,1,1,0,2,2,0,0,1,1,1,1,1,0,0,2,2,0,1,3,1,1,0,3,4,1,2,0,2,1,1,0,1,1,1,4,1,0,2,0,2,1,0,0,2,2,0,0,0,0,1,2,1,0,0,0,1,0,2,0,1,0,0,0,0,0,2,0,1,0,0,0,1,1,4,0,2,1,1,0,1,1,1,1,2,1,2,1,1,1,2,1,2,1,0,1,0,1,2,1,1,2,1,3,3,0,0,0,0,3,0,1,0,1,2,0,0,4,0,2,3,0,3,0,1,3,1,0,1,2,0,1,1,1,0,3,1,2,2,2,0,0,0,1,1,0,0,0,1,1,0,2,1,0,1,3,0,2,1,2,1,1,0,2,2,1,1,1,2,0,1,2,0,1,1,0,1,1,1,0,3,1,0,3,1,0,0,1,1,1,1,2,1,3,1,1,0,1,2,0,2,2,0,1,1,0,0,0,2,2,0,1,0,4,2,2,0,2,0,1,0,2,0,0,2,1,2,1,0,0,1,1,2,0,1,1,1,0,0,0,0,0,2,0,1,0,1,2,1,0,0,4,0,1,0,1,0,0,3,1,1,1,1,0,0,2,1,0,1,1,0,2,3,4,1,0,0,0,0,0,2,0,0,0,1,2,2,1,2,0,2,1,0,2,0,1,2,1,0,0,0,1,0,3,1,2,0,0,0,2,1,1,0,0,1,1,0,1,1,0,0,1,0,1,0,2,1,2,1,2,0,2,1,1,0,0,0,0,1,0,0,0,0,0,0,0,2,2,0,1,2,2,2,1,2,4,1,1,1,0,0,0,2,0,0,2,0,0,1,1,1,1,1,2,0,3,0,3,3,2,1,1,1,3,1,1,1,0,0,0,2,0,1,2,1,1,2,3,0,0,3,1,0,0,0,0,1,0,0,1,1,1,0,1,1,0,1,0,3,0,2,2,2,0,2,0,0,0,0,0,0,1,2,2,0,1,0,2,1,0,1,0,0,0,1,1,1,1,0,4,1,1,0,1,0,0,0,0,0,0,0,0,1,1,0,2,2,0,0,0,3,1,0,1,4,0,1,3,1,2,1,2,0,1,0,2,0,1,1,1,1,0,0,2,1,2,0,2,1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,3,0,0,1,1,1,0,2,3,0,3,0,1,0,1,2,1,0,0,0,1,2,1,0,0,1,1,2,1,1,0,1,1,1,1,3,1,1,1,2,0,1,2,0,1,0,2,2,0,0,2,0,1,0,0,1,3,1,2,0,0,0,1,1,0,3,0,0,0,0,0,1,0,0,1,1,1,2,0,2,1,0,1,2,0,2,0,3,0,0,2,1,1,0,2,0,0,0,0,1,0,0,1,3,1,1,1,2,0,0,0,1,2,0,1,4,2,0,0,1,1,1,4,3,0,2,1,0,2,0,0,1,0,2,0,0,1,2,1,1,1,2,0,2,0,0,0,2]},{"counters":[0,2,2,4,1,1,1,2,1,0,1,0,0,2,1,0,0,0,3,2,0,4,0,1,1,1,0,1,2,2,1,1,3,1,2,1,1,0,2,3,1,2,0,1,0,0,1,5,2,2,0,1,0,2,1,1,1,1,1,2,1,2,0,0,2,0,0,3,0,0,1,2,0,1,1,0,0,2,1,0,0,1,0,0,4,1,1,0,0,0,1,0,1,1,1,0,0,1,1,0,0,1,2,1,0,0,2,1,1,1,1,4,0,0,2,0,1,0,1,2,0,1,1,2,0,0,1,0,0,0,1,0,1,1,2,1,0,0,0,3,3,2,2,1,0,1,0,0,0,0,0,2,1,1,0,1,0,2,0,0,1,1,0,0,1,3,0,1,1,2,0,1,1,0,2,0,1,1,2,2,2,0,1,1,0,0,1,1,1,3,0,0,4,3,2,0,1,0,1,2,4,0,0,1,2,3,1,1,2,0,1,3,0,3,0,2,2,1,1,2,0,1,0,0,1,2,0,0,0,1,1,1,1,0,0,0,2,0,1,0,1,1,0,1,1,1,1,1,2,0,1,0,0,2,1,1,1,1,1,2,1,0,1,2,3,2,0,1,1,0,2,2,3,1,0,0,1,1,3,0,2,2,1,0,1,1,0,1,1,0,3,3,2,0,0,0,1,1,2,1,0,0,0,0,3,0,1,3,0,0,2,2,0,1,2,1,2,1,0,1,1,4,1,0,0,1,0,1,2,0,0,3,1,0,1,0,1,1,0,0,1,1,3,0,3,1,0,0,0,1,1,1,0,2,0,0,1,0,0,0,1,0,1,0,2,1,1,0,2,0,1,1,2,1,2,0,0,2,1,2,0,1,1,1,1,1,1,0,0,1,1,2,1,1,1,0,0,3,2,3,0,1,0,0,0,0,1,0,0,2,3,2,4,4,1,1,1,0,1,1,0,1,2,0,1,2,1,0,1,0,1,1,0,2,1,2,2,1,0,3,0,2,2,3,1,1,0,1,1,2,0,0,0,0,1,1,0,1,0,0,1,1,0,0,3,1,0,0,1,0,0,0,1,1,1,1,1,3,1,2,1,1,0,0,0,0,2,1,3,1,0,1,1,2,0,1,3,1,0,2,0,2,2,1,2,3,2,1,1,1,1,0,3,0,1,1,1,0,1,1,0,1,1,0,1,1,2,2,0,2,0,2,0,1,0,0,1,0,0,1,1,1,2,0,1,1,2,2,0,1,2,4,0,2,0,2,0,0,2,1,0,2,1,0,1,0,0,0,1,0,3,0,1,1,1,1,1,0,2,2,1,1,2,1,0,0,0,1,1,1,0,1,0,2,1,1,1,2,0,1,0,1,2,0,2,1,0,1,2,2,2,0,1,0,1,1,1,0,0,1,0,0,2,0,2,1,0,1,2,1,0,5,2,1,0,0,0,0,0,0,2,2,1,2,3,0,0,2,2,0,0,2,0,2,0,1,1,1,1,1,2,2,2,0,1,0,2,2,1,1,1,4,1,2,0,1,0,2,1,1,3,0,0,1,2,0,0,1,0,1,2,1,0,1,0,0,1,0,1,0,0,0,0,0,3,1,1,3,0,0,3,0,2,1,1,1,1,0,2,0,0,0,0,1,2,0,1,1,1,1,0,0,2,0,2,1,1,1,1,0,2,0,0,3,0,0,0,1,1,0,1,0,2,2,0,2,4,1,0,0,0,0,0,4,0,0,1,1,2,0,2,2,3,3,2,1,0,0,1,0,0,0,1,1,1,1,2,0,1,2,0,0,2,2,0,1,1,1,0,0,0,4,0,0,1,2,5,1,1,0,3,0,1,1,2,1,0,1,0,1,1,1,2,1,1,2,1,0,2,0,1,1,2,0,0,1,3,2,2,0,1,2,3,2,1,1,2,0,0,1,0,1,2,0,2,2,0,0,2,0,2,1,2,1,0,2,0,2,2,1,1,0,0,0,0,0,0,2,0,0,0,1,1,0,1,1,0,1,1,0,1,0,1,2,0,1,2,4,1,0,1,1,3,0,2,2,0,0,0,1,0,1,1,1,2,1,0,0,1,2,0,0,0,1,1,0,1,2,1,1,0,2,1,0,0,3,0,1,2,1,1,1,1,2,0,1,0,1,0,2,2,1,0,0,3,1,1,0,1,2,1,3,1,0,1,2,1,1,0,0,1,1,0,2,2,1,1,1,0,0,1,0,0,2,1,1,0,0,0,1,0,3,0,1,1,0,2,3,1,1,1,1,0,0,2,0,2,0,1,0,0,1,0,0,1,0,0,3,1,1,1,0,1,1,0,3,0,0,0,0,2,2,1,2,1,2,1,0,0,0,0,0,0,0,0,1,2,1,3,1,1,1,0,1,0,1,1,2,3,3,2,3,1,1,3,1,2,1,2,1,1,2,2,1,0,1,2,0,1,2,1,2,0,1,1,2,0,1,1,2,3,2,0,1,0,0,0,0,1,1,0,0,2,3,2,0,0,2,0,0,1,0,3,1,0,0,0,1,2,0,0,1,0,1,2,0,1,1,1,0,0,1,0,1,2,0,2,0,2,1,2,2,0,2,0,1,0,0,1,2,1,1,1,0,2,1,0,0,0,0,2,1,0,2,0,2,0,1,1,1,1,0,1,0,1,1,3,0,1,2,1,0,2,0,2,0,2,1,1,1,2,2,1,0,3,1,1,1,0,1,1,2,0,1,2,1,1,0,1,0,0,1,0,0,0,1,1,1,0,1,0,0,3,1,1,1,0,1,3,0,1,1,1,2,0,2,1,1,2,2,1,1,1,2,2,0,2,1,0,1,1,1,3,1,1,3,2,2,2,0,1,0,0,2,5,1,0,0,1,3,0,1,0,2,0,0,3,2,0,2,0,1,1,1,1,1,0,1,0,1,2,0,0,1,0,3,1,2,1,0,0,0,0,3,0,2,1,0,2,0,0,2,2,1,1,2,2,1,2,1,1,0,1,1,1,1,0,2,1,0,1,0,0,2,1,0,2,2,1,2,1,1,0,0,1,3,2,0,0,0,1,0,0,1,2,2,1,0,1,2,1,1,1,0,1,6,1,3,3,2,0,0,0,1,2,1,0,0,1,1,1,0,0,0,2,0,1,0,0,2,0,3,0,0,0,3,2,2,1,2,0,3,0,0,1,2,1,1,1,2,0,2,2,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,1,0,0,1,0,1,1,0,1,2,1,0,0,1,1,2,0,1,2,1,2,2,1,1,5,1,1,0,0,1,1,0,1,1,0,0,0,0,0,1,1,1,3,1,2,3,0,2,0,2,2,3,1,1,2,4,2,0,1,3,3,1,1,0,0,0,0,2,1,0,0,1,1,1,1,2,1,1,2,2,0,1,2,1,1,0,0,2,2,0,1,1,0,2,1,2,1,1,1,3,0,2,1,2,2,1,1,1,0,0,0,0,3,2,3,0,0,0,0,1,1,0,1,1,1,2,0,1,1,0,0,2,3,0,1,0,1,0,2,2,1,1,3,1,1,0,0,2,1,2,3,0,1,0,2,1,0,2,0,3,0,1,1,1,1,1,3,1,1,0,1,1,0,1,1,1,3,1,5,0,1,1,3,3,2,1,0,0,2,2,0,1,1,2,0,1,3,0,0,1,3,1,0,1,2,0,0,0,1,1,0,1,1,1,1,1,1,0,0,2,1,0,0,0,5,0,1,2,0,2,1,0,1,1,2,3,2,2,1,1,1,1,1,0,1,0,0,2,0,2,1,1,0,2,2,0,3,3,1,0,1,2,1,0,1,1,0,2,0,3,2,0,1,1,0,0,0,0,1,0,3,1,1,0,1,0,0,0,0,0,1,0,0,0,1,2,3,1,1,0,0,0,0,2,1,0,0,0,0,0,1,2,2,0,0,3,0,0,2,1,0,0,0,0,1,0,1,1,0,0,1,0,1,0,2,0,1,1,1,1,0,1,0,2,1,0,1,0,0,3,1,1,0,5,1,2,2,2,1,3,2,1,1,1,1,2,2,1,0,1,1,0,0,0,1,1,2,0,0,0,1,1,2,2,1,3,2,1,1,1,0,0,0,0,2,0,2,2,1,3,1,3,2,0,4,3,0,2,1,1,1,0,1,0,0,0,0,2,0,1,1,3,0,1,0,0,1,0,4,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,1,1,0,0,2,2,1,1,1,0,1,0,2,1,0,0,5,0,1,3,1,0,1,0,2,1,2,0,1,3,1,0,1,1,1,0,2,0,1,5,0,0,0,1,1,1,0,0,1,2,1,2,1,1,1,0,0,0,2,1,0,1,0,2,3,0,0,1,1,0,0,0,4,1,1,2,2,1,1,1,3,2,1,0,0,0,0,2,2,0,0,1,1,0,0,0,1,1,2,0,0,2,0,0,1,1,0,1,0,1,2,1,0,1,3,1,0,1,0,1,0,2,0,0,2,1,0,1,2,2,0,1,1,1,3,0,2,2,1,0,0,2,3,0,1,0,1,1,0,1,1,1,1,3,1,1,0,1,1,1,0,1,1,2,1,0,1]},{"counters":[2,0,1,0,1,0,0,1,2,0,1,2,0,0,1,1,0,0,2,2,2,1,0,0,1,0,2,0,0,1,1,1,0,4,1,1,0,1,1,1,0,1,0,0,1,3,1,1,1,0,2,0,0,1,0,1,1,2,2,0,3,1,2,0,1,0,0,1,1,0,1,1,0,1,2,0,0,1,1,1,1,1,2,0,1,4,2,0,1,1,1,2,1,1,0,3,1,5,1,1,2,1,2,0,2,4,1,0,0,0,1,0,4,0,5,0,1,1,0,3,0,1,2,2,0,1,0,2,1,0,1,1,0,1,0,1,0,0,0,1,1,1,2,1,2,0,3,2,0,0,0,2,1,1,0,0,3,0,1,2,0,0,2,0,1,0,1,2,0,3,1,1,1,0,0,1,2,2,0,3,1,1,0,0,0,0,0,0,0,2,1,0,4,2,0,2,0,1,2,2,2,0,2,1,0,1,0,3,1,1,0,1,1,2,1,3,2,0,0,0,0,2,2,1,5,1,1,0,1,2,1,0,0,3,1,2,0,0,0,3,2,1,0,2,0,1,2,0,0,2,0,0,1,1,1,0,4,1,0,1,2,1,0,0,3,3,0,0,0,2,1,1,1,1,1,1,1,0,1,0,3,3,1,0,1,0,0,2,2,5,1,1,0,0,1,1,2,3,0,1,1,2,0,1,1,0,1,2,1,1,0,1,2,3,2,0,1,2,1,0,1,2,0,0,1,1,3,0,0,3,1,0,0,0,0,0,3,0,2,3,1,0,1,1,1,0,1,1,3,0,2,0,0,1,2,0,2,0,2,1,2,1,2,2,0,0,1,1,0,0,1,1,2,2,1,2,0,0,1,0,1,0,1,1,0,2,0,0,3,2,2,1,1,1,1,0,1,0,1,1,0,1,1,3,1,0,1,1,1,0,3,0,2,0,0,1,0,1,0,2,1,0,1,1,2,0,1,0,2,0,1,0,0,0,0,0,2,1,1,0,2,1,2,1,2,1,2,1,2,0,1,1,0,0,0,2,4,0,2,3,2,0,1,3,0,1,1,0,0,2,1,2,2,1,1,0,0,2,1,1,0,0,1,4,2,2,0,0,0,0,1,2,1,0,1,2,1,1,2,1,3,1,1,1,0,0,0,0,1,1,1,1,0,1,1,2,0,2,2,0,2,3,1,0,1,1,0,0,0,2,4,1,0,1,0,0,0,1,1,0,2,3,0,2,4,2,1,1,2,1,1,0,1,2,3,1,1,1,1,0,1,1,0,1,1,1,2,0,1,1,0,0,3,1,0,1,2,1,0,0,0,1,0,1,0,1,3,2,1,3,0,0,0,1,0,1,0,0,2,3,1,3,1,1,1,0,0,1,4,2,1,1,3,2,1,2,0,1,0,0,2,1,0,1,1,2,0,1,0,0,2,1,1,0,0,0,0,0,1,0,1,0,1,0,1,0,0,1,3,2,1,1,0,1,1,0,1,2,0,1,1,1,3,1,0,1,0,1,1,2,1,0,0,1,0,6,0,0,0,2,1,2,0,2,0,2,1,3,0,2,1,1,1,3,0,0,1,0,0,1,4,1,2,0,2,0,2,1,1,1,2,0,0,2,1,2,2,1,3,3,0,2,2,2,1,0,0,0,1,1,2,2,1,0,0,1,0,2,0,0,1,3,1,0,1,1,0,1,1,0,1,1,1,0,4,2,0,2,1,2,1,1,1,1,0,0,1,1,1,0,0,0,0,1,1,0,0,1,0,2,1,1,0,0,0,1,0,2,1,0,2,0,0,2,0,0,0,1,1,1,1,2,1,0,0,2,1,1,0,1,0,2,1,2,2,0,2,0,0,0,1,3,1,2,3,0,1,0,1,3,0,0,0,0,1,0,2,0,2,0,1,0,1,3,0,1,0,0,0,1,1,2,0,2,2,1,0,2,3,2,4,0,0,3,1,1,1,1,1,1,1,1,0,0,1,1,2,0,0,1,1,2,0,0,0,2,1,0,1,0,0,1,2,0,2,2,1,1,1,0,1,0,2,0,1,1,2,0,0,0,4,1,0,0,1,2,3,1,1,0,2,2,1,0,0,1,2,1,1,1,2,1,0,1,3,1,0,0,0,0,0,1,1,1,0,0,1,1,2,0,2,0,3,2,1,1,1,1,1,0,0,0,1,0,0,1,1,3,0,2,0,1,1,3,0,2,2,0,1,1,0,0,1,1,0,1,0,1,2,1,1,0,2,1,3,0,1,1,0,1,1,0,0,0,1,1,1,0,2,4,3,0,2,0,3,1,1,1,1,1,1,0,0,2,2,0,1,2,3,0,0,3,1,0,1,0,0,0,0,3,0,2,2,0,0,1,3,2,1,1,0,0,0,1,2,1,0,1,2,0,2,1,0,1,0,0,1,2,3,0,0,0,1,4,2,0,1,1,0,0,1,2,0,1,3,3,0,1,1,0,1,1,3,3,2,2,0,1,1,2,1,0,0,1,2,2,0,0,1,0,0,2,0,0,0,0,1,0,2,1,2,0,2,2,1,1,0,2,1,1,2,0,3,3,2,3,1,1,1,0,1,0,1,0,0,2,0,1,0,0,1,0,0,1,1,1,1,0,1,1,0,3,1,1,1,1,3,2,4,2,0,2,1,1,2,0,2,0,0,0,1,0,1,1,2,2,0,3,1,1,1,1,2,1,3,0,1,0,1,1,2,1,1,0,1,0,3,0,0,3,1,1,3,0,0,0,4,1,0,0,3,0,1,0,2,0,1,0,2,2,2,1,2,2,1,0,2,0,1,0,0,0,2,1,1,3,1,0,0,2,0,0,0,1,1,2,0,1,0,1,0,1,0,0,0,0,4,2,1,1,0,2,3,1,1,0,1,2,1,0,0,0,1,1,1,0,1,1,2,0,1,0,2,0,2,1,0,0,1,0,1,1,0,0,2,2,0,1,0,1,1,0,1,2,2,2,1,1,1,0,2,2,1,4,1,1,1,3,0,1,1,0,2,0,1,3,1,0,0,2,2,0,1,1,0,1,2,0,0,1,4,1,4,2,3,3,0,1,0,1,3,0,0,0,0,1,1,1,0,0,2,1,0,0,1,0,3,0,1,0,0,2,0,0,1,0,0,0,1,0,1,2,0,0,1,1,0,1,0,1,1,0,0,1,0,0,2,0,0,0,2,1,0,1,2,0,0,0,0,1,1,1,1,1,1,1,0,0,0,2,0,0,0,1,1,1,0,1,2,0,1,0,0,0,1,0,1,0,1,1,0,1,0,0,1,3,3,1,2,0,2,0,0,0,1,3,1,0,0,2,1,1,1,3,0,4,0,1,1,4,0,0,0,0,0,2,0,1,0,3,1,2,3,1,0,1,0,1,1,0,0,1,0,2,1,3,0,3,2,1,0,1,0,1,1,1,3,3,0,1,0,3,0,0,1,1,4,1,2,3,0,0,0,2,0,1,0,1,1,1,1,3,0,0,0,0,0,1,2,1,0,1,0,1,1,3,2,1,1,2,1,2,1,1,1,1,0,1,2,1,0,0,1,1,0,0,0,3,0,3,2,1,1,0,0,0,2,2,1,2,0,0,1,1,1,1,0,1,0,0,2,1,1,0,1,1,1,0,1,3,3,0,0,1,2,0,3,1,1,1,1,2,0,2,0,4,4,1,2,0,0,3,1,1,0,2,0,1,1,0,2,1,1,0,1,1,1,1,0,1,2,2,1,1,2,2,0,1,1,2,0,1,1,2,1,0,0,2,0,2,1,0,1,0,1,1,1,1,1,2,1,0,0,1,0,1,0,0,1,1,0,0,1,1,0,1,0,0,0,1,1,3,0,0,0,3,2,2,1,2,0,1,1,0,0,0,1,2,2,1,1,0,0,2,1,0,0,0,0,0,3,3,1,3,1,0,3,2,0,2,0,2,4,1,0,2,0,1,1,1,0,0,1,1,0,2,1,1,2,2,2,1,0,0,1,0,1,2,0,3,0,1,0,0,0,2,1,1,1,1,1,0,0,0,0,0,1,1,0,0,1,0,0,0,1,0,4,1,0,0,1,1,0,1,0,1,0,1,4,0,2,1,2,0,1,1,1,1,0,0,1,3,0,0,1,1,3,1,2,0,1,0,0,2,1,2,1,1,2,2,1,0,2,1,0,1,0,1,2,2,1,1,0,0,0,2,2,0,0,3,2,1,0,0,2,1,0,1,0,1,2,0,1,1,0,1,3,2,0,2,1,0,0,0,2,1,0,3,0,2,0,0,1,0,0,0,2,0,1,1,5,0,0,1,2,1,3,2,1,2,1,3,0,0,2,1,1,2,2,0,1,0,1,1,2,0,0,3,1,2,0,2,0,0,0,2,2,4,0,2,1,2,1,1,0,2,1,1,0,2,1,0,4,0,0,2,0,1,1,1,0,1,4,1,1,0,1,1,0,2,0,3,1,0,0,2,0,3,0,0,0,1,1,1,1,1,1,1,1,0,2,1,1,1,3,0,0,0,0,1,1,0,1,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,3,0,0,2,2,0,0,1,1,2,0,1,0,0,0,1,1,0,1,0,2,1,1,0,1,1,0,1,0,0]}]},"null_count":0,"last_update_version":397952044994396160},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDY1NzQ2ODk=","upper_bound":"LTIxMzA1NjM1Mzg=","repeats":1},{"count":16,"lower_bound":"LTIxMTgwMzQyMzA=","upper_bound":"LTIxMDkzNTgyMTY=","repeats":1},{"count":24,"lower_bound":"LTIxMDMyMjM3ODI=","upper_bound":"LTIwODA3MDk0NDI=","repeats":1},{"count":32,"lower_bound":"LTIwNzQzMzY2MTk=","upper_bound":"LTIwNjc5MjQ3NDA=","repeats":1},{"count":40,"lower_bound":"LTIwNjE4OTA5NDI=","upper_bound":"LTIwNTc4NTc1OTg=","repeats":1},{"count":48,"lower_bound":"LTIwNTUzNzQ2MzY=","upper_bound":"LTIwNDM5NjE5MTc=","repeats":1},{"count":56,"lower_bound":"LTIwMzc2OTUzMzk=","upper_bound":"LTIwMjUzODIwODM=","repeats":1},{"count":64,"lower_bound":"LTIwMjQyNDkyNDU=","upper_bound":"LTIwMjEyNjA1OTg=","repeats":1},{"count":72,"lower_bound":"LTIwMjA4NjMxNzM=","upper_bound":"LTIwMDYxOTMwMDE=","repeats":1},{"count":80,"lower_bound":"LTIwMDQyODE4OTk=","upper_bound":"LTE5OTg3OTcxNzI=","repeats":1},{"count":88,"lower_bound":"LTE5OTE3MjgzNTQ=","upper_bound":"LTE5ODU1ODQ1OTk=","repeats":1},{"count":96,"lower_bound":"LTE5ODE5MTIzNDc=","upper_bound":"LTE5NjEzMzQ1OTc=","repeats":1},{"count":104,"lower_bound":"LTE5NTQ4NTkyOTA=","upper_bound":"LTE5NDcwMzYxODA=","repeats":1},{"count":112,"lower_bound":"LTE5NDE0MDM5ODc=","upper_bound":"LTE5MjQxMDYzMDQ=","repeats":1},{"count":120,"lower_bound":"LTE5MjIxNTYxNzU=","upper_bound":"LTE5MTU3OTEzNzk=","repeats":1},{"count":128,"lower_bound":"LTE5MTQ3NTU4Mjc=","upper_bound":"LTE4OTQ3OTg0NDc=","repeats":1},{"count":136,"lower_bound":"LTE4ODcyMTQ0MTE=","upper_bound":"LTE4NzAxNTI3OTI=","repeats":1},{"count":144,"lower_bound":"LTE4NjgzMDM4MzU=","upper_bound":"LTE4NTcyNDcyNjQ=","repeats":1},{"count":152,"lower_bound":"LTE4NTI4NTcxOTI=","upper_bound":"LTE4NDc0ODAxOTE=","repeats":1},{"count":160,"lower_bound":"LTE4MzUzMzY0NTc=","upper_bound":"LTE4MjI5NTIwMTk=","repeats":1},{"count":168,"lower_bound":"LTE4MjE5NzQzNDU=","upper_bound":"LTE4MTAxNTYxMzE=","repeats":1},{"count":176,"lower_bound":"LTE4MDk0NDU3NjI=","upper_bound":"LTE3OTA4MDgwMDY=","repeats":1},{"count":184,"lower_bound":"LTE3ODk5ODk3NjU=","upper_bound":"LTE3ODYyNDQ5MTY=","repeats":1},{"count":192,"lower_bound":"LTE3ODU5MzM0NjU=","upper_bound":"LTE3NzUzNTg4OTY=","repeats":1},{"count":200,"lower_bound":"LTE3NzEwOTE2MTY=","upper_bound":"LTE3NjQ5OTQ4Nzc=","repeats":1},{"count":208,"lower_bound":"LTE3NjA3NTQ1NDQ=","upper_bound":"LTE3NTc0MzI4ODA=","repeats":1},{"count":216,"lower_bound":"LTE3NTQ2ODIzMDE=","upper_bound":"LTE3Mzg3MDUxMzk=","repeats":1},{"count":224,"lower_bound":"LTE3Mzc0MzE2NTE=","upper_bound":"LTE3MjMyOTMxOTQ=","repeats":1},{"count":232,"lower_bound":"LTE3MTgyNzA3MzQ=","upper_bound":"LTE3MTA3MjE4MzM=","repeats":1},{"count":240,"lower_bound":"LTE3MDk5NzIzMjk=","upper_bound":"LTE2ODY0NjE3MDE=","repeats":1},{"count":248,"lower_bound":"LTE2ODQyMTY4MDc=","upper_bound":"LTE2Njk0NDM1MzI=","repeats":1},{"count":256,"lower_bound":"LTE2NjQ0NDIxNTM=","upper_bound":"LTE2NjA4MTg2MTg=","repeats":1},{"count":264,"lower_bound":"LTE2NTc2Njg5MzQ=","upper_bound":"LTE2NTE4NTc2NzY=","repeats":1},{"count":272,"lower_bound":"LTE2NDkwNzUyMzA=","upper_bound":"LTE2Mjc4NTM5MzE=","repeats":1},{"count":280,"lower_bound":"LTE2MTg2OTY2NDA=","upper_bound":"LTE1OTk5NjU2OTY=","repeats":1},{"count":288,"lower_bound":"LTE1ODM1NzE1MjY=","upper_bound":"LTE1NzIzMjM4OTI=","repeats":1},{"count":296,"lower_bound":"LTE1Njk0ODA1MDA=","upper_bound":"LTE1NTc2NTE0NjU=","repeats":1},{"count":304,"lower_bound":"LTE1NDM4NzcwODI=","upper_bound":"LTE1MTcxNDU4MjI=","repeats":1},{"count":312,"lower_bound":"LTE1MTAzNzMzMzY=","upper_bound":"LTE0OTUxMTE2MDM=","repeats":1},{"count":320,"lower_bound":"LTE0ODU2NzE3NTM=","upper_bound":"LTE0Nzc3NTY5ODM=","repeats":1},{"count":328,"lower_bound":"LTE0NjcwNzI5OTY=","upper_bound":"LTE0NDc3MDkwMTU=","repeats":1},{"count":336,"lower_bound":"LTE0NDYxOTc5NDI=","upper_bound":"LTE0MjA4NjE2NDI=","repeats":1},{"count":344,"lower_bound":"LTE0MjA1OTM1NzE=","upper_bound":"LTE0MTM4OTYxODU=","repeats":1},{"count":352,"lower_bound":"LTE0MTM1OTQ5NzM=","upper_bound":"LTEzOTEzMTExNzk=","repeats":1},{"count":360,"lower_bound":"LTEzODc2Mjk2NzY=","upper_bound":"LTEzNTc0Mjk2MDk=","repeats":1},{"count":368,"lower_bound":"LTEzNTY3OTM1NDY=","upper_bound":"LTEzNDQ1NTY3NDA=","repeats":1},{"count":376,"lower_bound":"LTEzMzY4NTMxMzg=","upper_bound":"LTEzMjkxNDY4NzQ=","repeats":1},{"count":384,"lower_bound":"LTEzMjgzMDE0NDk=","upper_bound":"LTEzMDYwMjY3MjQ=","repeats":1},{"count":392,"lower_bound":"LTEzMDEyOTU3MTE=","upper_bound":"LTEyNjU5MjYwNDM=","repeats":1},{"count":400,"lower_bound":"LTEyNjE5NjI3OTk=","upper_bound":"LTEyNDk5NDk4NzU=","repeats":1},{"count":408,"lower_bound":"LTEyNDQ2ODgyMTE=","upper_bound":"LTEyMjU1MTQzODQ=","repeats":1},{"count":416,"lower_bound":"LTEyMjI3MjMwODM=","upper_bound":"LTEyMDc0NjQxMzI=","repeats":1},{"count":424,"lower_bound":"LTEyMDc0MDM5ODg=","upper_bound":"LTExOTUyNjY1OTM=","repeats":1},{"count":432,"lower_bound":"LTExODkxNTkzNjk=","upper_bound":"LTExNjcyMzI1ODc=","repeats":1},{"count":440,"lower_bound":"LTExNjQ5MDM1ODY=","upper_bound":"LTExNTY1NTEyODE=","repeats":1},{"count":448,"lower_bound":"LTExNTYxNjkzNjI=","upper_bound":"LTExNTA4NTAyNTM=","repeats":1},{"count":456,"lower_bound":"LTExNDM3MjYxOTY=","upper_bound":"LTExMjg0MTk2NjI=","repeats":1},{"count":464,"lower_bound":"LTExMTc3MTE0MDI=","upper_bound":"LTExMDIxMDYxMTE=","repeats":1},{"count":472,"lower_bound":"LTEwOTc5MzgwMzg=","upper_bound":"LTEwODQzMzYwOTM=","repeats":1},{"count":480,"lower_bound":"LTEwODMwMjkwNjY=","upper_bound":"LTEwNzY5MDcyNzM=","repeats":1},{"count":488,"lower_bound":"LTEwNzYzNTUyNzQ=","upper_bound":"LTEwNjY0NzI5ODU=","repeats":1},{"count":496,"lower_bound":"LTEwNjA3MzA3Mjc=","upper_bound":"LTEwNDM4MDE5MjQ=","repeats":1},{"count":504,"lower_bound":"LTEwMzk5MTc1NTI=","upper_bound":"LTEwMzM1ODE1NDQ=","repeats":1},{"count":512,"lower_bound":"LTEwMzI3MDc5NTU=","upper_bound":"LTEwMjAzMTE2Njg=","repeats":1},{"count":520,"lower_bound":"LTEwMTYyNDU3MTM=","upper_bound":"LTk4OTMxOTUwMg==","repeats":1},{"count":528,"lower_bound":"LTk4NzkyMTkyMA==","upper_bound":"LTk1Mzk4ODI0MQ==","repeats":1},{"count":536,"lower_bound":"LTk0OTUxNTgyNw==","upper_bound":"LTkzMTE3MTUwNA==","repeats":1},{"count":544,"lower_bound":"LTkzMDQ0MTAyNg==","upper_bound":"LTkyNTUzNzg0MQ==","repeats":1},{"count":552,"lower_bound":"LTkyNTE3ODkxOA==","upper_bound":"LTkxOTI2NzQ4Ng==","repeats":1},{"count":560,"lower_bound":"LTkwMjQ3ODQyNA==","upper_bound":"LTg4ODM5NjQ4MA==","repeats":1},{"count":568,"lower_bound":"LTg4MDc3MDk2OA==","upper_bound":"LTg3NzAyNjQ0NQ==","repeats":1},{"count":576,"lower_bound":"LTg3NjMxODQ0MA==","upper_bound":"LTg2NTgwMzAxOA==","repeats":1},{"count":584,"lower_bound":"LTg1ODE4NDkwMQ==","upper_bound":"LTg1MTY5MjM0OA==","repeats":1},{"count":592,"lower_bound":"LTg1MDEyNDYyOQ==","upper_bound":"LTg0MjYxNDMwMA==","repeats":1},{"count":600,"lower_bound":"LTg0MDM2MTg4MQ==","upper_bound":"LTgzMjMxNjM4MA==","repeats":1},{"count":608,"lower_bound":"LTgyNzIwMTQ2Ng==","upper_bound":"LTgwOTIxMjk3MQ==","repeats":1},{"count":616,"lower_bound":"LTgwNjkwMTk2Ng==","upper_bound":"LTc5ODQ3MzE5Mw==","repeats":1},{"count":624,"lower_bound":"LTc5NDMzNDY4NA==","upper_bound":"LTc4NDA2MTc0Mg==","repeats":1},{"count":632,"lower_bound":"LTc4MDc4MzQ5Nw==","upper_bound":"LTc2OTg2MjA3Mw==","repeats":1},{"count":640,"lower_bound":"LTc2ODY2MDE3Nw==","upper_bound":"LTc1OTE2NDA2OQ==","repeats":1},{"count":648,"lower_bound":"LTc0OTgxMDA4MQ==","upper_bound":"LTc0NDI5ODQxMA==","repeats":1},{"count":656,"lower_bound":"LTczOTg2MTI5MA==","upper_bound":"LTcxODQwMzY5MA==","repeats":1},{"count":664,"lower_bound":"LTcxMzUzNDE5MA==","upper_bound":"LTcwNDkwODgyMg==","repeats":1},{"count":672,"lower_bound":"LTcwNDM4NDYzMA==","upper_bound":"LTY3NjUxNTM0OA==","repeats":1},{"count":680,"lower_bound":"LTY3MjM3NzEwNQ==","upper_bound":"LTY2MDk2MDEwNw==","repeats":1},{"count":688,"lower_bound":"LTY1NzQwMTg2Mg==","upper_bound":"LTYyOTQzNTAzNQ==","repeats":1},{"count":696,"lower_bound":"LTYyODQ4MzIyMg==","upper_bound":"LTYwNDE3MTUyNw==","repeats":1},{"count":704,"lower_bound":"LTYwMTA3MzMxMA==","upper_bound":"LTU4MzI3NjU0OQ==","repeats":1},{"count":712,"lower_bound":"LTU4MjgzMzk4Mg==","upper_bound":"LTU3NDA0NzIzNw==","repeats":1},{"count":720,"lower_bound":"LTU2NzcxNzAxOQ==","upper_bound":"LTU1MzA4OTUyMg==","repeats":1},{"count":728,"lower_bound":"LTU1MDMzMDAxMw==","upper_bound":"LTU0MzE2ODY3Mg==","repeats":1},{"count":736,"lower_bound":"LTU0MTk4MTI5Mg==","upper_bound":"LTUxOTczODA2MA==","repeats":1},{"count":744,"lower_bound":"LTUxNDQ1NDQyNQ==","upper_bound":"LTUxMjA5MTU2MA==","repeats":1},{"count":752,"lower_bound":"LTUwMzE1OTY1Ng==","upper_bound":"LTQ5NjUwOTk2OA==","repeats":1},{"count":760,"lower_bound":"LTQ4OTg4MTM1Ng==","upper_bound":"LTQ4MzA3NjAzMg==","repeats":1},{"count":768,"lower_bound":"LTQ4MDQ5Nzc0MQ==","upper_bound":"LTQ2ODgxNDI3Mw==","repeats":1},{"count":776,"lower_bound":"LTQ2NDU5MDM1OA==","upper_bound":"LTQ1MzkxMDc5Mw==","repeats":1},{"count":784,"lower_bound":"LTQ1MzQxMTExNA==","upper_bound":"LTQzNzMwOTYxOQ==","repeats":1},{"count":792,"lower_bound":"LTQzNjM1MTM3NA==","upper_bound":"LTQyNzU3MTE0MA==","repeats":1},{"count":800,"lower_bound":"LTQyNjY5NjQ3MQ==","upper_bound":"LTQyMTMyMzc1MA==","repeats":1},{"count":808,"lower_bound":"LTQxNTM0MzMxNw==","upper_bound":"LTQwOTc4ODI3OA==","repeats":1},{"count":816,"lower_bound":"LTQwODI2MzE0OQ==","upper_bound":"LTM5NjQ5NzYzNg==","repeats":1},{"count":824,"lower_bound":"LTM5NTUzNDUwNw==","upper_bound":"LTM4Nzk3NTAyNA==","repeats":1},{"count":832,"lower_bound":"LTM4MTQ5NDg2Mg==","upper_bound":"LTM3NzE2MTA4Mg==","repeats":1},{"count":840,"lower_bound":"LTM3NjM1NzM1OA==","upper_bound":"LTM2OTkxOTk1OQ==","repeats":1},{"count":848,"lower_bound":"LTM2Nzc5ODg0NA==","upper_bound":"LTM0NTc0NjU4NQ==","repeats":1},{"count":856,"lower_bound":"LTM0NDM5MDk1Nw==","upper_bound":"LTM0MjY2MjcwMA==","repeats":1},{"count":864,"lower_bound":"LTM0MTAwMjIwMQ==","upper_bound":"LTMzNTc0OTEyOQ==","repeats":1},{"count":872,"lower_bound":"LTMzMzk4NjQ2Mg==","upper_bound":"LTMyNjk2NzgzMQ==","repeats":1},{"count":880,"lower_bound":"LTMxMjcxMDUxOA==","upper_bound":"LTI5NDE1MzM1Ng==","repeats":1},{"count":888,"lower_bound":"LTI5MDk2ODYwOA==","upper_bound":"LTI3MzE5MDQ3Mw==","repeats":1},{"count":896,"lower_bound":"LTI2OTIxMjM1NA==","upper_bound":"LTI1ODEzODU5Mg==","repeats":1},{"count":904,"lower_bound":"LTI0MDQyNDY3Nw==","upper_bound":"LTIxNzU0MzY4MQ==","repeats":1},{"count":912,"lower_bound":"LTIxMzkwOTEzNw==","upper_bound":"LTIwNDQyODExMw==","repeats":1},{"count":920,"lower_bound":"LTIwMzQ5MzM0MQ==","upper_bound":"LTE4NDAwMDY5NQ==","repeats":1},{"count":928,"lower_bound":"LTE4MjUzNjQzNg==","upper_bound":"LTE2OTMyNDk0Nw==","repeats":1},{"count":936,"lower_bound":"LTE2Nzc1MTE3MA==","upper_bound":"LTE1NzMzNzA4OQ==","repeats":1},{"count":944,"lower_bound":"LTE1NjYyNjgxNA==","upper_bound":"LTE0NzYwOTg4MQ==","repeats":1},{"count":952,"lower_bound":"LTE0MzA0NDQ3NA==","upper_bound":"LTE0MjM1NjE4OA==","repeats":1},{"count":960,"lower_bound":"LTE0MDMyODc3Ng==","upper_bound":"LTEyNzk2MDczNg==","repeats":1},{"count":968,"lower_bound":"LTEyMzM5OTI3OA==","upper_bound":"LTExODM3MDQ5Mw==","repeats":1},{"count":976,"lower_bound":"LTExNjEzNDY0Ng==","upper_bound":"LTExMDE5Njk1MQ==","repeats":1},{"count":984,"lower_bound":"LTEwMjM3NzUxOQ==","upper_bound":"LTgzNzI5OTY3","repeats":1},{"count":992,"lower_bound":"LTgyNTc2NjEy","upper_bound":"LTY3NTU3NzYw","repeats":1},{"count":1000,"lower_bound":"LTY2NzU3MDAx","upper_bound":"LTQ3MTc4ODY4","repeats":1},{"count":1008,"lower_bound":"LTQ2NjMxMzk3","upper_bound":"LTMxNTA3MDMw","repeats":1},{"count":1016,"lower_bound":"LTI0NDM5OTIy","upper_bound":"LTE2NDE4MjI0","repeats":1},{"count":1024,"lower_bound":"LTEyODc3MTg4","upper_bound":"NDEwNDgzMA==","repeats":1},{"count":1032,"lower_bound":"NTAyODcxMw==","upper_bound":"MTY2MTc3MDg=","repeats":1},{"count":1040,"lower_bound":"MjYxODMyODY=","upper_bound":"NDgyNjI2NzY=","repeats":1},{"count":1048,"lower_bound":"NDk2MDU3Mjg=","upper_bound":"NTc5ODg3Mjk=","repeats":1},{"count":1056,"lower_bound":"NjczMDIzMzA=","upper_bound":"NzM0NTYzMDY=","repeats":1},{"count":1064,"lower_bound":"NzU0Nzg0MTQ=","upper_bound":"ODM2MTg0NDM=","repeats":1},{"count":1072,"lower_bound":"ODM4MTk0NTY=","upper_bound":"OTA5ODIzNjU=","repeats":1},{"count":1080,"lower_bound":"OTEwMzU2NjI=","upper_bound":"OTgwMTcwMzM=","repeats":1},{"count":1088,"lower_bound":"MTAwNTgyMjIy","upper_bound":"MTEyNzA0MDE4","repeats":1},{"count":1096,"lower_bound":"MTIwNTAzNDUw","upper_bound":"MTI4ODczNDQ2","repeats":1},{"count":1104,"lower_bound":"MTMzMzQ2ODAx","upper_bound":"MTQzNTQ1MTI1","repeats":1},{"count":1112,"lower_bound":"MTQ0ODkyODk0","upper_bound":"MTQ4Njg4MzQ0","repeats":1},{"count":1120,"lower_bound":"MTU0MDczNTIx","upper_bound":"MTY5NzMxMDEy","repeats":1},{"count":1128,"lower_bound":"MTcyODMwNzk4","upper_bound":"MTg2ODk4NTUz","repeats":1},{"count":1136,"lower_bound":"MTkxNjY5MDM0","upper_bound":"MTk4NzYyNTM3","repeats":1},{"count":1144,"lower_bound":"MjAzODI3OTUw","upper_bound":"MjEzNzIxMTk1","repeats":1},{"count":1152,"lower_bound":"MjE0NzEzNDAw","upper_bound":"MjI3NzE5OTUy","repeats":1},{"count":1160,"lower_bound":"MjMzMzE3MzUx","upper_bound":"MjQwNjAxMTA4","repeats":1},{"count":1168,"lower_bound":"MjQyMzIzMzA0","upper_bound":"Mjc1ODY1OTM5","repeats":1},{"count":1176,"lower_bound":"MjgyOTIyNDk4","upper_bound":"MjkwNDE2NTEz","repeats":1},{"count":1184,"lower_bound":"MzAwMDkxOTg0","upper_bound":"MzA4OTk1NjY2","repeats":1},{"count":1192,"lower_bound":"MzEwOTEwMTIx","upper_bound":"MzMwODg4NjE0","repeats":1},{"count":1200,"lower_bound":"MzMxNTQ1MjYz","upper_bound":"MzQyMTQ2Mzk5","repeats":1},{"count":1208,"lower_bound":"MzQ0MTQ4Mzcw","upper_bound":"MzUxNTU2NDY3","repeats":1},{"count":1216,"lower_bound":"MzU4OTQxMjI3","upper_bound":"MzY1MDU0MDc3","repeats":1},{"count":1224,"lower_bound":"MzY2ODk2ODA1","upper_bound":"Mzc2MjY5MDIz","repeats":1},{"count":1232,"lower_bound":"Mzc2NTU0NTE5","upper_bound":"MzkzMTg5ODM2","repeats":1},{"count":1240,"lower_bound":"NDAwNDU4ODAz","upper_bound":"NDIzODIxMzE1","repeats":1},{"count":1248,"lower_bound":"NDI2Mzg4OTYx","upper_bound":"NDMyMDIxMzYw","repeats":1},{"count":1256,"lower_bound":"NDM0MDY4MDQx","upper_bound":"NDQ1NjQzNzI2","repeats":1},{"count":1264,"lower_bound":"NDUxODEyMzI5","upper_bound":"NDc3MzEyNDMx","repeats":1},{"count":1272,"lower_bound":"NDc4NzMwNDQ4","upper_bound":"NDkxNjI4Nzgy","repeats":1},{"count":1280,"lower_bound":"NDkyNDAyODg1","upper_bound":"NTExMzE0Mzk3","repeats":1},{"count":1288,"lower_bound":"NTM4MzMzMjk0","upper_bound":"NTQ0MDAzMjgy","repeats":1},{"count":1296,"lower_bound":"NTQ5NzEzNzE4","upper_bound":"NTY0NzE0MTUz","repeats":1},{"count":1304,"lower_bound":"NTY2OTQ1NDIx","upper_bound":"NTgwMDU0ODky","repeats":1},{"count":1312,"lower_bound":"NTg0MTMyNzk4","upper_bound":"NjAzMTgwNjgx","repeats":1},{"count":1320,"lower_bound":"NjA5NjU0ODYz","upper_bound":"NjI1OTE2ODEx","repeats":1},{"count":1328,"lower_bound":"NjMwNDAzMzQ4","upper_bound":"NjQxMTA1NTAy","repeats":1},{"count":1336,"lower_bound":"NjUxMTk3OTk4","upper_bound":"NjczMDQzNjg4","repeats":1},{"count":1344,"lower_bound":"NjgzMzY0MjY5","upper_bound":"NzA0MTk4MzU1","repeats":1},{"count":1352,"lower_bound":"NzEwNjkxNzcz","upper_bound":"NzMxNjg2Mjgy","repeats":1},{"count":1360,"lower_bound":"NzM0MzM5OTg2","upper_bound":"NzQwMTM4MjE4","repeats":1},{"count":1368,"lower_bound":"NzQyNDc5NjQz","upper_bound":"NzYwMjczOTU1","repeats":1},{"count":1376,"lower_bound":"NzYzNDg5NjEy","upper_bound":"NzcwNDE4Njk3","repeats":1},{"count":1384,"lower_bound":"NzczNDYyMDkw","upper_bound":"Nzk0NTQwMzUz","repeats":1},{"count":1392,"lower_bound":"Nzk3OTkyNzIy","upper_bound":"ODA1MDIzODQy","repeats":1},{"count":1400,"lower_bound":"ODIwNTA1NDcx","upper_bound":"ODI0ODQwNTc5","repeats":1},{"count":1408,"lower_bound":"ODI5MjYxNDcz","upper_bound":"ODQ1NjExOTY3","repeats":1},{"count":1416,"lower_bound":"ODQ4Nzg3NTUx","upper_bound":"ODU0MTg0OTM3","repeats":1},{"count":1424,"lower_bound":"ODYxMjYzMzk3","upper_bound":"ODcwODc1ODI5","repeats":1},{"count":1432,"lower_bound":"ODc0MDgxODU3","upper_bound":"ODgyMDQwNTM0","repeats":1},{"count":1440,"lower_bound":"ODgzMzg1MDcw","upper_bound":"ODk1NjM0MjE4","repeats":1},{"count":1448,"lower_bound":"ODk3OTc4NjA2","upper_bound":"OTE3MjIxOTYw","repeats":1},{"count":1456,"lower_bound":"OTI0MzA3MjY4","upper_bound":"OTM2NzYwNTU4","repeats":1},{"count":1464,"lower_bound":"OTM5MzI3MTA3","upper_bound":"OTczNjczOTcz","repeats":1},{"count":1472,"lower_bound":"OTc0NjMxNjk3","upper_bound":"OTgwMjI2MzYz","repeats":1},{"count":1480,"lower_bound":"OTgxNzIzMzk5","upper_bound":"MTAwNjEyMzg3OA==","repeats":1},{"count":1488,"lower_bound":"MTAwNjk4MjM0MA==","upper_bound":"MTAxNjkwOTQ1Nw==","repeats":1},{"count":1496,"lower_bound":"MTAyNzgzMjk4NQ==","upper_bound":"MTAzODgzOTIxMQ==","repeats":1},{"count":1504,"lower_bound":"MTA0NTA2NjY3Nw==","upper_bound":"MTA1OTQ3MTc4NA==","repeats":1},{"count":1512,"lower_bound":"MTA2MDYzOTAxMA==","upper_bound":"MTA3NjIwMjk4Mg==","repeats":1},{"count":1520,"lower_bound":"MTA3NjIxOTY2MA==","upper_bound":"MTA4NDgwMTMxOQ==","repeats":1},{"count":1528,"lower_bound":"MTA4NTA5NDUzMA==","upper_bound":"MTExNjYyMTE1NA==","repeats":1},{"count":1536,"lower_bound":"MTExODQ0NDM0Ng==","upper_bound":"MTEyMzAxMzk0Mg==","repeats":1},{"count":1544,"lower_bound":"MTEyMzI1Njc3Mw==","upper_bound":"MTEzNDQzOTEwNw==","repeats":1},{"count":1552,"lower_bound":"MTEzNzU5NTk3Nw==","upper_bound":"MTE1ODMyNTI4Mg==","repeats":1},{"count":1560,"lower_bound":"MTE3MzE1NjgzOA==","upper_bound":"MTE4MTk2Njc3OA==","repeats":1},{"count":1568,"lower_bound":"MTE4NzIzODc3Mw==","upper_bound":"MTE5NTcyNDA3Mw==","repeats":1},{"count":1576,"lower_bound":"MTIwMDAyMTExNg==","upper_bound":"MTIxNTI2NjA1Nw==","repeats":1},{"count":1584,"lower_bound":"MTIxNzQ1MzgyMg==","upper_bound":"MTIzNjAyMTcxMQ==","repeats":1},{"count":1592,"lower_bound":"MTIzNjE1OTczNg==","upper_bound":"MTI0NDk4ODg3NQ==","repeats":1},{"count":1600,"lower_bound":"MTI0NzIxOTU4Mw==","upper_bound":"MTI1MTkyNTA0MA==","repeats":1},{"count":1608,"lower_bound":"MTI1MzU5NDAwMw==","upper_bound":"MTI2NDk4MzY1OQ==","repeats":1},{"count":1616,"lower_bound":"MTI2Nzk3Mjg5NQ==","upper_bound":"MTI4MzY5Mzk1Mw==","repeats":1},{"count":1624,"lower_bound":"MTI4NDg5MTg3NQ==","upper_bound":"MTI4ODA5OTA3Ng==","repeats":1},{"count":1632,"lower_bound":"MTI5MDc2Njk4OA==","upper_bound":"MTI5NjgzMjM5NA==","repeats":1},{"count":1640,"lower_bound":"MTI5ODk5NzAxOQ==","upper_bound":"MTMxMTA3NzE3NQ==","repeats":1},{"count":1648,"lower_bound":"MTMxMTgxMTQ1OA==","upper_bound":"MTMyNjQxMDYzNg==","repeats":1},{"count":1656,"lower_bound":"MTMyNzQ4NzI2NA==","upper_bound":"MTM0NTUyNTkwNQ==","repeats":1},{"count":1664,"lower_bound":"MTM1MTU4NDM5MQ==","upper_bound":"MTM3ODIxNjY1MQ==","repeats":1},{"count":1672,"lower_bound":"MTM4MTI3NzAxNw==","upper_bound":"MTM5NTYxMzc0MQ==","repeats":1},{"count":1680,"lower_bound":"MTM5NjIxMzU4Mg==","upper_bound":"MTQyMTE4Mzk2Mw==","repeats":1},{"count":1688,"lower_bound":"MTQyNDY3Nzg3MA==","upper_bound":"MTQyODQ4ODQwOA==","repeats":1},{"count":1696,"lower_bound":"MTQzODk1Mzk2Mg==","upper_bound":"MTQ1MzI2MjQ1NA==","repeats":1},{"count":1704,"lower_bound":"MTQ1NTIxOTg4OQ==","upper_bound":"MTQ1ODk2MjQzOQ==","repeats":1},{"count":1712,"lower_bound":"MTQ1OTAyNTQyNA==","upper_bound":"MTQ3MTk0NDc1MQ==","repeats":1},{"count":1720,"lower_bound":"MTQ3NzM2MDU4OA==","upper_bound":"MTQ4NjMxMTMwMQ==","repeats":1},{"count":1728,"lower_bound":"MTQ4OTQxMTY4Mg==","upper_bound":"MTUwMzg1NzY3OA==","repeats":1},{"count":1736,"lower_bound":"MTUxMDQyOTQ0Mg==","upper_bound":"MTUyMjY5NDgxMg==","repeats":1},{"count":1744,"lower_bound":"MTUyNTY4OTcwMg==","upper_bound":"MTUzODAzODQxNw==","repeats":1},{"count":1752,"lower_bound":"MTU0MDMwNTY5MQ==","upper_bound":"MTU0OTA0NTIxOQ==","repeats":1},{"count":1760,"lower_bound":"MTU1NTcxNTg4MA==","upper_bound":"MTU3MDc5ODAxOQ==","repeats":1},{"count":1768,"lower_bound":"MTU4MTg5MjI1Ng==","upper_bound":"MTU5NTk2NzgzNQ==","repeats":1},{"count":1776,"lower_bound":"MTYwMDA2OTkxOQ==","upper_bound":"MTYwNzkwODYzMg==","repeats":1},{"count":1784,"lower_bound":"MTYxMjAxMTczMw==","upper_bound":"MTYyODk4MTcwMQ==","repeats":1},{"count":1792,"lower_bound":"MTYzMjExNjYzNw==","upper_bound":"MTY1OTM5MzUzNA==","repeats":1},{"count":1800,"lower_bound":"MTY2MDc1NjU2Mw==","upper_bound":"MTY3NDM2Mjc1NA==","repeats":1},{"count":1808,"lower_bound":"MTY4MTExNTUwNw==","upper_bound":"MTY5NDgzODY0MQ==","repeats":1},{"count":1816,"lower_bound":"MTY5NzUxMTY4Mw==","upper_bound":"MTcxNjMxNDQwMQ==","repeats":1},{"count":1824,"lower_bound":"MTcxODgwNzEyNQ==","upper_bound":"MTczODg1NzQ2OA==","repeats":1},{"count":1832,"lower_bound":"MTc0NTgxMzEwMQ==","upper_bound":"MTc2MDQwNTk2MA==","repeats":1},{"count":1840,"lower_bound":"MTc3NTAyNjU0Nw==","upper_bound":"MTc4Mjc0NjAzMg==","repeats":1},{"count":1848,"lower_bound":"MTc4MzQ1NjEwNA==","upper_bound":"MTc5Nzg0NzM3Mg==","repeats":1},{"count":1856,"lower_bound":"MTgwODc1ODc0Mw==","upper_bound":"MTgzOTIxNTkyNw==","repeats":1},{"count":1864,"lower_bound":"MTg0MjM2NzY3OA==","upper_bound":"MTg2NTczNTI3MQ==","repeats":1},{"count":1872,"lower_bound":"MTg2OTI0MzgwOA==","upper_bound":"MTg4MDA5MDcyNA==","repeats":1},{"count":1880,"lower_bound":"MTg4MDQxMDUyNA==","upper_bound":"MTg5MzM0MTAxNw==","repeats":1},{"count":1888,"lower_bound":"MTg5NDg1MjgwOA==","upper_bound":"MTkwMTc2MTE0Ng==","repeats":1},{"count":1896,"lower_bound":"MTkwMjY5ODExMA==","upper_bound":"MTkxMzAxMzYxNg==","repeats":1},{"count":1904,"lower_bound":"MTkxNzEyNzM2MQ==","upper_bound":"MTkyNDYzODUzMg==","repeats":1},{"count":1912,"lower_bound":"MTkyNzQ4MTc4Mw==","upper_bound":"MTkzNjIxMDQzMg==","repeats":1},{"count":1920,"lower_bound":"MTkzNjg3NTA3OA==","upper_bound":"MTk0MjIzNzE4Mw==","repeats":1},{"count":1928,"lower_bound":"MTk0NzIzODc1NA==","upper_bound":"MTk1OTc5MzIzNw==","repeats":1},{"count":1936,"lower_bound":"MTk2ODAzODM5NA==","upper_bound":"MTk3ODgzOTc4NA==","repeats":1},{"count":1944,"lower_bound":"MTk5NjU1MTUzNQ==","upper_bound":"MjAxODYxNDMzOQ==","repeats":1},{"count":1952,"lower_bound":"MjAyMTQ0MTgyMA==","upper_bound":"MjAzNDg2NTIxMg==","repeats":1},{"count":1960,"lower_bound":"MjAzNzcwMDQzNg==","upper_bound":"MjA1MTEzNjUxNg==","repeats":1},{"count":1968,"lower_bound":"MjA1MTI0MDEyMw==","upper_bound":"MjA1OTA5NDk2Mw==","repeats":1},{"count":1976,"lower_bound":"MjA4ODc3NTIwMw==","upper_bound":"MjA5NTkzMDY2MQ==","repeats":1},{"count":1984,"lower_bound":"MjEwODkyNzMyNw==","upper_bound":"MjEyNTUxNzM0Ng==","repeats":1},{"count":1992,"lower_bound":"MjEyNTgzODU0MQ==","upper_bound":"MjEzMTgxMDkyOQ==","repeats":1},{"count":2000,"lower_bound":"MjEzMzE5MTMzNw==","upper_bound":"MjE0NjI3NjA4NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,2,0,0,1,1,4,1,1,0,3,0,0,0,2,2,1,0,1,1,0,1,0,4,3,0,0,0,0,0,0,0,0,2,0,0,1,1,3,1,0,0,0,1,1,2,0,0,0,2,1,2,1,1,0,2,2,1,2,0,0,1,0,0,1,1,3,3,2,0,2,0,2,2,2,3,1,0,1,1,0,1,2,1,0,1,1,0,1,1,0,0,0,0,2,3,1,0,0,0,0,1,3,2,0,1,1,1,2,0,1,0,2,0,1,1,1,2,1,2,1,0,1,1,0,0,1,2,2,2,0,0,0,0,1,2,1,0,2,4,0,2,3,1,1,0,0,0,1,0,1,1,1,1,1,0,2,2,1,1,0,1,0,0,3,3,1,1,0,0,1,1,2,0,3,1,1,0,0,1,4,0,2,1,2,0,1,1,1,2,0,1,1,0,0,2,0,0,0,0,0,2,1,1,4,1,0,1,3,1,0,1,0,0,2,1,2,1,1,1,0,1,0,0,0,1,0,1,1,1,1,0,2,0,3,0,0,0,1,0,0,2,0,1,0,1,0,2,1,1,1,0,0,0,1,1,2,1,0,0,1,3,0,1,2,1,3,1,1,1,2,2,1,1,1,0,0,1,0,3,5,1,1,2,0,2,0,0,1,0,1,1,1,0,1,2,2,0,3,3,1,1,1,1,1,2,0,1,0,0,0,2,3,3,1,0,2,1,1,0,1,1,3,2,0,0,0,1,0,5,3,0,1,1,1,1,1,0,0,0,0,2,3,0,0,0,2,3,1,1,3,2,0,1,2,0,2,2,0,3,0,1,0,0,2,0,0,0,1,1,0,1,0,1,1,0,1,1,1,1,0,1,0,0,2,0,2,1,2,1,1,0,0,0,0,2,0,0,2,0,0,1,0,0,1,1,2,0,0,2,2,0,1,2,2,3,0,2,1,0,4,1,5,0,1,1,2,2,0,0,5,1,2,0,1,1,3,3,0,1,2,3,0,1,0,0,2,1,2,0,1,0,1,0,0,2,2,0,1,3,2,1,1,0,1,2,1,0,1,1,0,3,1,1,2,1,2,0,1,0,0,0,2,2,1,3,1,2,1,0,0,0,1,1,0,0,1,0,0,0,1,1,0,0,2,0,1,1,1,0,1,3,1,0,0,3,0,0,3,0,2,0,1,0,1,1,0,3,2,3,1,1,1,0,1,2,0,5,1,1,0,2,0,0,0,0,1,0,1,2,1,2,1,0,1,1,2,1,0,1,4,2,2,3,1,0,0,0,1,1,1,0,2,0,2,2,0,3,0,1,1,0,1,1,1,0,0,2,1,0,1,2,2,2,0,0,1,2,3,0,1,2,2,0,1,3,0,2,0,1,2,1,2,2,0,0,0,2,2,1,0,1,1,0,0,2,1,0,0,1,0,2,3,0,0,3,0,0,1,0,1,1,0,0,5,0,0,0,2,0,3,1,0,1,1,0,2,0,1,0,1,0,1,1,0,0,1,1,1,2,1,0,1,2,0,1,1,0,2,0,1,0,2,3,2,1,3,2,1,0,1,3,3,1,0,1,0,0,1,2,0,0,0,0,1,0,0,1,2,1,2,3,0,1,2,1,0,1,1,0,2,0,0,4,1,1,0,2,1,2,0,1,1,1,4,1,1,0,2,1,1,0,0,0,0,3,2,0,0,1,1,1,0,0,0,1,0,1,1,0,3,1,0,1,2,0,1,2,1,0,0,1,1,0,1,0,4,0,2,2,1,1,1,1,0,1,2,1,1,2,2,1,2,2,1,4,2,1,0,1,3,1,1,1,1,2,1,2,0,0,0,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,0,0,0,0,1,0,1,1,1,0,3,0,0,0,0,0,1,1,2,0,1,0,0,2,1,0,0,1,1,1,0,3,2,0,0,4,1,1,1,1,2,2,0,0,3,3,0,1,1,0,0,1,2,0,1,2,4,0,0,1,1,1,1,1,3,0,0,1,0,0,1,1,2,3,1,1,3,2,1,2,1,2,0,2,3,1,0,0,0,0,2,1,1,0,5,2,2,0,1,0,1,1,1,1,0,2,0,0,1,0,0,1,0,1,4,0,1,3,1,0,1,0,2,0,1,1,1,0,0,2,2,3,2,0,2,0,1,0,3,2,1,1,0,2,0,1,0,2,1,0,2,3,2,3,1,1,1,0,1,2,2,0,0,3,1,3,0,0,2,0,0,1,0,0,1,1,1,3,2,1,0,0,1,1,0,2,3,1,2,1,2,3,3,2,0,1,1,1,2,2,0,0,0,0,1,0,0,0,2,0,0,1,1,0,0,1,1,0,0,1,0,0,2,1,1,1,1,1,0,6,1,1,0,1,2,0,3,1,1,0,2,1,3,1,2,1,1,0,1,2,0,0,1,1,1,5,2,1,2,1,1,2,1,2,2,0,1,1,0,1,1,0,0,1,4,0,0,0,0,1,1,0,0,2,1,2,0,1,1,0,2,2,0,0,1,0,2,2,1,0,0,0,0,1,2,2,0,1,0,0,1,1,3,0,0,1,1,0,0,2,0,1,0,2,1,2,2,3,0,2,2,0,4,2,2,2,2,1,0,2,0,0,1,0,3,0,0,0,1,0,0,0,0,1,1,1,0,2,1,0,0,2,0,0,0,3,3,0,3,1,1,1,1,1,1,1,3,0,2,0,1,0,1,0,2,1,1,2,1,0,1,4,1,0,0,0,1,0,0,1,1,1,0,0,1,0,1,2,0,1,1,0,2,1,0,0,1,1,1,1,0,0,2,0,0,0,0,1,2,1,2,4,2,1,0,0,3,1,1,1,2,0,1,0,0,2,0,1,1,1,1,0,2,4,0,2,1,3,1,0,1,1,2,2,1,0,1,0,0,0,0,2,1,1,0,0,3,0,2,0,1,1,0,0,1,0,0,0,0,1,0,0,2,0,2,0,1,2,2,2,2,1,2,0,0,0,2,1,0,0,4,0,1,0,0,0,0,1,0,2,1,2,1,0,0,1,2,0,0,0,0,3,0,1,1,0,0,1,2,0,2,2,1,0,1,1,0,3,4,2,0,1,0,0,0,2,0,2,1,0,3,0,0,1,1,1,1,0,1,1,0,1,1,1,1,0,1,0,1,0,2,2,0,0,3,0,1,0,0,1,2,0,0,1,2,0,0,2,1,1,0,0,3,3,1,1,1,2,0,1,2,0,4,1,0,0,2,1,1,1,1,1,0,1,3,1,2,2,1,0,0,1,0,1,1,0,0,2,0,0,1,2,2,2,0,0,0,0,0,0,3,0,0,1,0,1,0,0,2,2,0,2,0,2,1,1,1,0,1,1,1,0,1,3,2,2,2,3,2,0,2,1,2,1,2,1,0,4,1,1,1,1,2,1,2,0,2,1,0,0,0,0,0,2,1,1,3,1,1,2,1,0,0,2,1,1,1,1,0,1,4,2,0,0,2,2,0,2,1,1,0,3,1,0,1,1,0,0,0,3,0,2,1,1,0,0,1,1,2,0,4,2,3,2,1,1,3,1,0,1,2,0,3,1,0,0,0,0,2,0,1,0,1,1,1,0,0,0,2,1,1,1,1,0,1,1,1,0,2,0,0,1,0,1,0,0,2,2,1,0,8,2,0,1,0,2,0,2,1,2,2,0,0,1,2,1,1,1,1,2,1,2,0,1,0,4,2,0,0,0,3,1,1,2,1,2,1,1,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,4,0,1,0,1,1,1,2,3,0,1,1,0,0,0,1,0,0,0,0,1,1,1,0,3,1,2,2,1,1,1,0,1,1,1,1,1,0,2,0,0,0,2,1,0,0,1,0,1,1,0,2,1,1,0,1,2,0,0,1,0,2,2,4,1,1,1,0,2,5,1,0,1,1,1,1,1,0,0,1,1,2,0,1,0,1,0,0,0,3,3,2,3,1,1,0,2,0,1,1,0,1,1,0,1,1,1,2,1,4,2,1,1,0,1,0,0,2,0,0,0,3,0,1,0,0,3,0,1,3,2,4,0,0,1,0,2,1,1,0,0,1,0,1,2,0,1,2,3,2,4,1,0,3,2,1,0,0,1,0,0,1,0,0,0,1,1,1,3,1,2,0,0,1,1,2,0,0,0,0,1,1,0,1,0,0,2,0,2,0,2,2,0,2,1,1,1,2,1,1,1,0,1,0,0,1,0,2,0,0,1,0,1,0,0,4,0,3,1,2,1,0,1,1,1,1,0,1,1,1,1,0,0,3,0,1,0,1,1,1,0,0,1,1,3,0,0,1,0,0,0,1,1,0,0,1,0,2,1,2,1,2,0,0,0,1,1,1,2,1,0,1,2,2,0,0,1,0,1,0,3,1,1,1,0,0,1,1,0,2,0,0,1,1,1,0,3,1,1,2,1,0,0,0,1,0,0,0,3,0,0,1,0,3,2,0,1,1,2,1,1,0,1,1,1,1,0,0,0,2,1,2,2,0,0,2,1,0,2,1,0,0,2,0,0,0,0,0,0,1,1,2,1,0,1,0,1,0,0,1,0,3,4,0,1,1,0,1,0]},{"counters":[1,3,0,1,2,1,2,1,0,1,1,1,0,1,1,0,2,3,0,0,0,0,2,0,2,0,2,1,0,1,1,3,2,1,2,1,0,2,1,1,1,0,0,1,1,2,0,0,0,2,0,0,2,0,1,0,0,1,0,3,1,2,0,1,2,0,1,0,1,2,1,0,0,0,0,4,0,0,1,1,0,0,2,1,1,1,0,0,1,1,1,1,2,0,0,0,0,0,1,0,1,0,0,3,0,4,3,0,2,2,1,2,4,1,0,0,1,1,0,0,2,1,1,1,2,0,0,0,0,0,2,0,0,0,0,0,1,2,0,2,2,1,1,0,0,2,0,1,4,1,1,2,1,1,2,2,0,0,3,3,1,0,0,2,4,0,0,1,2,0,0,0,0,0,1,2,2,1,0,2,1,1,1,0,0,1,2,1,0,0,0,2,1,1,1,0,0,0,3,0,1,1,1,1,4,0,0,0,0,2,2,1,1,0,0,1,1,1,1,2,0,0,0,0,0,1,0,1,0,3,1,0,0,1,2,1,1,3,0,0,2,0,1,1,1,0,1,0,1,0,2,1,0,3,0,2,2,2,3,1,1,2,1,0,4,1,1,1,1,0,3,0,0,0,1,2,0,0,1,0,2,0,0,2,1,0,2,1,4,1,1,2,2,1,1,0,1,0,1,2,2,0,0,0,3,1,0,1,0,1,0,1,1,0,0,1,0,1,2,2,1,1,1,0,0,3,2,0,1,0,2,0,0,1,0,0,1,0,0,1,0,2,1,1,0,3,0,2,4,0,1,0,1,2,2,2,0,1,0,2,0,0,2,0,0,2,0,1,3,5,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,2,1,3,1,1,1,1,0,0,0,1,1,2,2,1,1,3,1,0,1,0,1,1,0,3,1,3,0,1,0,2,0,0,0,1,1,1,2,3,0,1,2,1,2,2,2,1,1,1,4,1,0,1,2,1,1,0,1,1,1,0,3,2,0,3,0,0,1,0,1,1,0,0,1,1,0,0,2,0,3,1,1,0,1,1,1,0,0,0,1,2,1,0,1,0,0,0,0,1,1,1,0,0,1,1,0,1,2,1,1,2,2,1,2,1,1,0,0,6,1,1,0,1,3,0,0,2,2,2,2,1,1,0,1,1,3,3,1,0,0,2,0,1,3,0,2,0,0,3,1,0,0,2,0,3,0,2,2,1,1,1,1,1,1,2,2,0,1,1,2,3,2,1,0,1,0,0,0,0,0,0,0,0,1,3,1,2,0,2,1,0,0,1,2,1,1,1,1,2,1,0,1,1,1,0,0,4,0,0,1,2,0,1,1,0,1,0,1,1,1,0,1,1,1,2,2,2,3,0,0,1,0,0,1,0,0,1,2,2,0,1,2,1,0,0,1,0,2,0,0,1,1,0,5,1,0,0,0,0,2,0,0,1,2,2,2,0,1,1,0,0,0,0,1,1,1,1,1,1,2,0,0,2,3,1,0,1,1,2,0,0,2,1,2,1,0,2,0,1,1,2,1,0,2,0,1,3,1,1,1,0,2,3,0,0,1,2,1,0,2,1,2,1,2,1,1,0,0,2,1,0,1,2,0,3,1,0,2,0,2,0,0,2,0,1,2,0,0,2,1,0,4,0,0,0,2,0,2,2,2,1,0,0,0,1,1,0,0,0,1,0,1,4,2,3,1,1,3,1,2,0,1,0,0,0,4,1,1,4,0,0,1,1,1,0,2,2,2,0,0,0,1,0,2,1,1,3,0,1,2,2,0,5,0,1,1,1,1,0,3,0,1,0,0,1,1,2,1,0,1,1,0,1,2,0,1,0,1,1,1,2,2,0,1,0,0,0,3,1,2,2,2,1,2,1,2,0,0,1,0,0,1,1,1,1,1,2,0,1,0,0,0,1,3,0,2,0,0,0,0,2,1,0,0,3,0,1,0,2,3,2,2,1,1,3,0,0,2,1,1,1,0,1,0,2,0,1,0,0,1,3,0,2,1,1,1,1,2,2,0,0,1,1,2,0,1,1,1,2,0,1,0,1,0,2,2,2,0,2,0,1,0,4,1,1,1,0,1,1,3,3,1,2,2,0,1,1,1,1,1,0,4,1,0,0,1,1,0,1,1,0,2,0,0,0,4,0,0,4,2,2,0,0,1,0,0,3,1,0,1,1,0,2,0,1,0,3,0,2,1,2,0,2,0,0,1,0,3,1,3,0,2,1,1,0,0,0,0,1,2,1,0,2,0,0,0,2,0,0,3,0,1,0,0,3,0,0,0,0,2,2,1,2,1,0,0,0,1,0,0,1,3,4,1,3,1,2,1,0,2,2,1,0,1,2,0,1,2,0,0,2,5,1,1,3,1,2,0,0,1,1,0,0,0,0,2,1,2,2,0,0,3,1,0,2,1,3,1,1,0,0,0,2,2,1,1,1,0,0,3,4,2,0,2,0,1,0,0,0,2,0,0,2,0,3,1,2,1,1,0,1,1,1,0,1,0,0,0,1,0,2,2,1,2,2,1,1,3,1,0,1,1,0,2,1,0,1,0,2,0,2,1,1,1,1,0,1,1,1,0,1,0,1,0,0,3,0,1,0,0,1,2,1,0,2,1,0,3,1,1,0,1,0,3,1,0,0,4,3,1,0,2,1,0,1,1,2,1,1,1,2,0,1,1,0,1,1,1,1,0,1,1,0,0,2,1,2,1,1,0,0,2,2,1,1,0,1,1,0,1,2,2,2,1,1,0,0,0,1,1,0,0,0,1,2,1,0,1,3,2,4,2,3,0,1,0,0,0,0,0,2,2,0,2,2,0,0,1,1,0,2,1,1,1,1,1,0,0,0,1,1,0,0,0,0,2,2,3,0,1,0,0,1,1,0,0,0,1,0,1,1,0,1,1,1,1,0,1,2,2,2,0,2,0,0,2,1,2,1,0,0,0,0,2,0,2,1,0,0,0,0,2,2,1,2,1,3,2,2,1,1,1,1,0,0,2,0,0,1,1,1,1,1,1,0,1,1,0,3,0,0,1,1,0,3,0,2,1,1,0,1,4,2,0,1,2,3,0,1,1,1,0,2,1,1,1,3,1,1,0,2,0,0,0,2,0,1,1,0,3,2,2,0,0,1,1,1,1,1,1,0,2,1,2,0,1,1,0,2,0,1,0,0,0,1,1,1,1,1,0,1,1,1,5,0,2,2,2,0,1,2,0,0,0,1,0,1,1,1,2,0,2,0,0,0,0,1,1,1,0,0,1,3,3,1,0,0,0,1,1,3,2,3,1,2,1,3,1,1,1,2,1,1,1,0,1,1,1,1,1,0,3,0,2,1,2,0,1,0,2,2,3,0,0,1,3,0,2,0,1,0,1,1,1,1,2,0,2,1,2,1,0,2,3,0,1,2,0,0,1,0,0,2,1,1,0,1,3,0,0,2,2,0,2,1,2,2,2,2,1,1,1,0,0,0,2,2,2,0,1,0,1,1,1,0,0,1,0,0,1,3,2,2,1,1,2,0,1,3,1,1,2,1,1,1,0,0,0,1,0,0,1,1,0,3,2,0,3,0,0,0,1,2,1,1,0,0,1,0,1,0,0,1,1,1,0,0,0,2,2,1,1,0,0,0,2,1,1,0,0,0,0,0,1,1,0,2,0,1,2,0,1,3,0,0,0,2,0,2,4,2,0,3,0,0,1,2,1,0,1,1,0,0,0,0,0,0,0,1,0,0,0,5,0,0,3,3,1,1,1,0,0,1,0,3,2,2,1,0,1,1,1,1,0,1,1,0,0,1,0,1,0,1,1,0,0,2,3,0,0,1,0,0,1,1,0,1,1,0,2,2,0,1,0,0,1,1,0,0,0,0,2,0,0,3,0,1,1,1,0,3,2,1,1,1,0,2,0,1,0,2,1,0,0,2,2,0,0,0,3,0,1,1,0,2,2,1,1,2,0,1,0,1,2,1,0,2,1,0,0,1,1,2,1,1,2,0,2,3,1,1,2,0,0,1,2,0,0,0,1,1,1,0,1,2,1,1,0,1,2,1,0,0,1,0,0,2,3,1,0,2,0,2,2,0,1,0,2,1,1,1,0,1,0,3,0,2,0,2,2,1,0,1,1,0,0,3,1,0,0,2,2,1,2,0,3,1,2,2,0,1,1,4,2,0,1,1,0,2,2,2,0,2,1,1,1,1,1,1,2,1,1,1,1,1,0,1,3,2,1,0,1,0,1,1,2,1,0,3,0,1,0,0,0,0,1,0,2,0,1,1,0,0,0,0,1,3,0,1,3,1,1,1,0,0,4,0,1,0,2,3,1,0,2,4,1,2,2,2,1,2,0,2,1,0,0,1,1,0,1,0,1,1,1,0,0,1,0,1,0,0,3,1,1,0,1,0,2,0,1,0,0,1,1,1,0,0,2,1,0,0,1,1,4,0,1,1,1,0,0,1,3,0,0,1,0,1,4,1,0,0,0,1,3,4,3,0,1,1,0,2,1,1,2,1,3,1,1,4,0,1,0,2,1,0,4,2,0,2,0,0,2,0,0,1,0,3,1,1,1,0,0,1,1,1,1,3,1,1,0,0,2]},{"counters":[1,2,3,1,0,0,0,1,1,1,2,1,1,0,0,1,0,1,0,0,3,2,0,1,0,1,0,0,2,0,0,0,1,1,4,0,1,0,2,1,0,0,0,1,1,1,1,0,0,1,2,2,1,2,0,1,1,0,1,0,0,0,1,2,2,0,0,1,3,0,1,5,1,0,1,1,1,1,1,1,0,1,1,1,3,2,0,2,0,2,1,1,3,0,2,1,1,0,1,2,4,0,0,1,0,3,1,1,0,0,0,1,0,1,3,0,1,0,0,1,1,1,2,1,1,2,1,1,1,1,2,1,1,4,1,1,2,1,1,1,4,3,0,0,2,1,2,0,0,0,1,1,0,0,1,0,2,1,2,0,0,2,0,0,1,1,2,0,1,0,3,1,1,3,0,1,1,0,0,0,1,0,1,0,3,1,0,1,0,1,3,1,2,1,3,1,0,0,2,0,0,2,0,0,0,0,0,3,0,0,0,1,1,0,1,0,1,2,2,0,1,1,1,1,1,1,2,1,1,1,1,0,0,5,2,1,0,1,4,1,1,3,2,2,2,0,0,2,0,1,0,0,0,1,0,0,1,3,0,1,1,1,1,0,0,0,1,1,1,0,1,0,2,0,1,0,0,1,0,0,2,1,1,3,1,1,1,0,1,1,1,0,1,0,0,0,2,1,1,2,3,0,2,0,3,0,0,2,2,2,0,0,0,2,1,1,2,1,2,0,0,1,2,2,3,0,1,0,2,1,2,2,0,1,1,0,3,1,1,1,0,3,0,1,2,0,1,1,0,2,2,2,0,1,1,2,0,1,1,0,0,2,2,3,1,2,3,0,2,0,0,0,0,1,3,0,3,2,1,0,1,1,1,0,0,1,2,0,0,3,1,1,1,0,3,2,3,2,0,0,1,1,0,0,0,1,1,1,0,2,1,1,1,1,2,2,1,1,0,0,1,0,4,2,0,1,0,1,0,1,0,0,0,0,1,1,2,1,0,0,1,0,2,1,1,0,1,3,1,1,1,0,0,0,0,4,0,0,0,2,0,2,3,1,2,2,1,0,1,0,0,0,1,2,2,1,0,2,1,1,0,0,0,1,1,2,1,1,0,0,2,0,1,1,0,1,0,1,0,1,1,1,1,0,0,0,1,0,2,0,1,2,1,1,0,2,1,0,2,0,4,2,1,1,0,1,0,2,5,1,0,0,0,1,1,1,0,2,2,1,1,2,0,0,0,2,1,0,3,1,1,2,1,2,2,0,0,1,1,0,1,1,0,2,1,1,1,0,1,2,1,1,1,0,0,3,2,2,0,1,0,2,1,0,0,0,0,0,1,0,1,1,2,3,0,1,0,5,2,2,0,0,2,1,0,2,2,1,1,0,0,0,0,1,0,3,1,0,2,2,0,1,0,1,1,1,2,1,0,0,0,1,0,0,1,3,0,0,4,0,4,0,0,0,1,0,1,1,0,1,1,1,0,0,1,1,1,1,1,1,0,0,2,0,2,2,3,1,2,0,2,4,1,1,1,1,1,1,3,0,0,0,1,1,0,3,4,0,1,0,0,1,1,0,2,0,2,0,0,0,1,1,0,0,2,0,1,0,1,1,2,1,1,1,2,3,0,0,0,0,0,0,1,0,0,0,1,0,1,0,2,0,0,1,4,1,2,1,2,1,0,0,0,1,0,0,0,2,0,2,0,0,1,0,2,4,2,1,0,0,1,0,2,0,2,0,1,1,0,2,4,1,1,2,0,0,1,2,3,0,2,3,3,0,0,1,2,1,3,3,1,1,0,0,2,0,1,1,0,1,3,0,0,0,0,0,1,1,0,0,1,1,2,0,1,0,0,5,2,1,0,1,0,0,2,1,1,1,1,0,1,1,1,0,2,2,0,0,0,0,0,0,0,1,1,2,1,0,1,1,1,0,0,0,1,2,1,5,0,4,0,1,1,1,1,1,0,0,3,1,0,1,1,3,5,0,0,1,0,0,1,1,0,1,0,0,1,1,1,0,0,1,0,1,1,0,2,0,1,0,0,1,3,2,1,1,2,1,0,1,0,0,1,1,1,0,0,1,2,0,1,0,0,1,0,1,0,0,0,1,0,0,1,1,4,1,2,0,2,3,1,0,1,3,1,1,0,1,2,1,1,0,2,0,0,1,0,1,4,2,1,1,1,2,1,1,1,0,1,2,0,0,2,1,1,1,0,0,0,0,0,1,3,2,2,1,2,0,1,1,1,0,0,1,0,0,2,0,0,1,2,2,1,2,1,0,0,0,2,0,1,0,1,1,0,5,1,0,0,2,1,1,1,1,0,0,2,3,2,1,0,1,1,0,0,3,0,1,4,2,0,0,0,1,1,2,0,0,1,1,2,2,2,1,1,1,2,1,4,1,0,3,1,1,1,3,2,1,1,0,1,0,1,1,0,0,0,0,2,2,1,2,1,1,1,2,1,0,1,2,0,0,0,1,0,1,1,1,0,1,2,2,3,0,0,3,1,2,2,1,2,0,1,1,0,4,1,0,1,0,0,2,1,0,1,2,1,1,2,0,0,1,2,1,1,1,2,1,2,0,1,1,0,0,0,1,0,2,1,1,1,3,3,2,3,1,1,0,1,1,1,0,3,2,0,2,0,0,1,0,0,1,0,0,3,0,2,1,0,0,0,1,1,0,0,4,0,0,2,1,2,2,0,0,1,1,0,0,1,1,1,0,0,1,0,0,0,0,1,0,0,0,2,1,0,1,1,0,0,1,1,1,0,3,1,1,1,0,1,3,0,1,1,1,1,1,0,1,1,1,0,0,1,0,0,0,0,1,2,0,1,1,1,0,1,2,1,1,0,1,0,2,2,1,1,0,0,0,1,0,0,1,3,1,0,2,1,0,1,0,0,0,0,0,2,1,0,1,0,1,0,1,1,1,1,2,3,2,0,1,0,0,0,0,3,1,1,0,0,1,1,2,3,1,1,2,1,1,0,2,1,1,1,3,1,1,2,0,0,0,2,1,0,1,1,1,0,1,0,1,1,0,1,1,0,2,0,1,1,0,0,1,0,2,1,1,1,0,0,1,2,0,1,2,0,1,1,0,0,0,1,1,1,1,2,5,1,0,0,1,0,0,1,0,0,0,2,5,3,0,0,1,0,2,1,0,2,0,0,0,0,3,2,1,0,2,1,1,1,4,1,1,0,0,1,1,2,0,1,0,2,0,1,0,1,1,0,0,2,4,0,1,0,1,1,1,2,0,3,1,1,1,2,0,1,0,0,1,2,1,2,1,1,0,2,0,2,1,2,3,0,1,1,2,0,1,0,1,0,2,0,1,1,0,2,1,1,3,0,1,2,0,1,0,2,2,5,0,2,0,4,0,1,2,1,2,2,0,0,2,2,1,1,4,0,0,1,0,1,0,0,0,0,1,2,2,3,0,1,0,0,3,1,1,0,0,3,1,0,0,0,1,2,2,1,1,2,2,2,1,3,0,2,1,0,1,0,0,1,0,1,2,1,1,1,1,1,0,2,0,0,1,2,2,1,0,2,2,2,1,3,0,1,0,2,3,1,1,1,0,0,0,1,0,5,0,1,1,3,0,0,1,3,0,1,3,1,1,0,1,1,0,1,0,0,2,2,0,3,0,2,0,1,1,1,3,3,2,0,0,1,1,0,0,1,0,1,1,0,0,2,1,1,1,1,3,2,0,2,2,3,0,1,0,2,2,2,1,2,0,1,2,2,0,0,0,3,1,0,1,0,0,0,1,2,0,1,1,1,0,0,1,0,2,2,0,3,2,1,1,1,0,1,0,3,1,0,1,0,2,0,3,2,0,2,0,1,2,2,0,0,1,2,1,0,1,0,0,1,1,1,1,2,1,2,0,0,1,0,2,0,1,1,0,0,3,3,3,3,0,0,0,0,2,1,2,0,0,0,0,1,2,0,1,1,1,0,0,0,0,0,0,1,2,1,1,1,0,3,0,1,0,1,1,0,1,1,1,1,1,1,1,0,2,2,3,1,1,0,1,1,2,1,0,4,2,0,0,1,2,2,2,1,2,0,0,1,0,0,1,0,3,0,2,2,3,2,1,1,0,2,1,1,0,1,1,0,4,1,0,1,0,1,0,1,1,2,1,0,0,1,2,2,0,1,0,0,2,4,0,4,5,1,2,1,0,1,2,2,1,1,3,1,0,0,0,0,1,1,1,0,0,0,0,1,3,1,0,1,2,2,1,1,0,2,2,4,2,1,2,0,2,1,0,1,0,0,1,1,1,0,1,1,1,4,0,2,0,2,3,1,1,0,1,1,1,1,0,2,0,1,1,0,0,1,0,1,2,1,3,0,1,1,3,0,0,2,1,0,0,1,2,2,1,2,0,2,1,1,2,1,1,1,1,1,3,3,1,1,1,2,1,2,0,2,1,0,2,1,1,0,1,1,1,1,1,0,0,0,0,0,2,2,1,1,2,0,1,1,0,0,2,2,1,2,1,0,2,1,0,2,1,0,0,4,1,0,0,0,0,2,1,0,3,1,0,1,2,1,4,0,1,0,0,0,0,1,0,1,1,1,0,2,0,1,2,0,1,1,0,2,0,0,3,0,2,0,0,1,0,0,0,2,0,0,1,0,1]},{"counters":[0,0,0,0,1,1,0,2,0,0,0,0,1,1,1,3,2,0,0,0,1,1,0,0,3,1,3,0,2,1,0,1,0,2,0,0,3,1,0,0,1,2,0,3,2,2,2,2,1,1,1,1,1,0,0,0,2,2,0,2,0,0,0,1,3,0,1,2,1,0,0,3,0,1,1,2,0,0,0,0,0,1,2,0,1,2,2,2,0,0,2,2,1,0,0,0,2,1,0,0,0,1,1,0,0,1,0,2,0,1,0,5,0,1,0,0,0,1,3,1,0,0,0,0,1,1,3,2,3,3,1,2,1,1,0,1,0,0,2,0,1,1,1,0,2,0,0,0,1,0,2,1,4,0,1,3,1,0,1,0,0,0,2,1,0,1,0,0,2,3,1,0,2,1,3,1,2,0,1,1,1,2,2,1,1,0,3,2,0,0,0,1,2,4,2,0,0,0,1,1,0,0,2,1,1,1,0,1,0,0,1,0,0,1,0,0,0,1,3,3,1,2,0,1,0,1,1,3,1,0,0,2,0,1,4,1,0,1,0,1,1,2,0,0,0,0,4,0,1,0,3,1,2,2,1,2,1,0,2,1,4,0,1,1,0,0,2,1,1,2,3,0,1,3,1,1,1,1,1,0,1,2,1,0,0,2,3,0,0,2,1,0,0,0,0,0,1,1,0,0,1,2,0,1,1,0,1,3,1,0,2,1,2,0,2,1,0,4,0,1,0,0,2,2,1,1,0,3,4,2,1,0,0,1,1,1,2,1,2,0,1,0,1,0,1,2,1,1,2,0,2,2,1,1,3,0,1,0,0,0,1,2,0,0,1,1,3,1,1,0,0,0,1,1,2,2,0,1,1,2,0,2,0,1,1,0,1,1,0,2,1,1,1,0,1,1,2,0,1,2,0,1,0,0,1,0,1,1,1,1,0,1,0,1,0,0,2,1,1,2,0,1,0,1,0,2,0,1,1,2,2,2,0,1,1,1,0,0,0,2,1,1,1,0,0,0,1,1,0,1,1,1,0,0,2,0,2,2,2,0,1,1,0,0,0,3,0,1,0,1,2,0,0,1,0,1,1,0,2,1,2,1,2,2,1,1,2,0,1,0,1,2,0,2,0,0,3,2,1,2,2,0,1,1,1,0,1,3,4,2,2,0,1,1,1,1,0,0,3,0,2,3,1,0,2,1,0,1,0,1,2,0,2,1,1,0,0,0,2,1,1,2,4,0,0,2,1,2,1,0,0,1,0,2,0,1,2,2,1,0,1,1,0,0,4,1,2,2,1,1,3,0,3,0,0,2,3,2,0,2,0,1,1,0,1,1,1,2,1,0,2,0,2,1,1,0,3,1,0,3,0,1,0,0,0,2,2,3,0,0,0,0,1,0,2,0,2,0,1,1,2,2,1,1,2,2,1,2,0,1,0,0,4,0,2,0,0,0,0,1,0,1,1,0,3,1,2,1,5,0,0,0,0,1,0,2,2,2,3,2,1,1,3,2,0,0,2,1,0,1,1,0,2,0,2,0,3,2,0,1,1,1,0,1,2,0,0,2,1,1,2,0,0,1,1,1,3,1,0,1,1,2,0,1,0,3,1,0,0,0,0,3,0,0,2,1,2,1,1,0,0,2,2,1,2,2,0,0,0,0,0,0,1,0,0,0,3,1,0,1,0,0,0,0,2,0,3,0,4,1,1,1,3,2,1,0,0,0,1,1,0,1,0,3,0,0,2,1,2,2,1,3,0,0,0,1,1,2,1,1,1,1,0,1,0,0,1,1,1,0,3,3,1,0,1,1,1,0,1,1,3,0,0,1,0,5,0,0,0,1,1,0,1,1,2,0,0,1,0,0,1,3,0,3,0,0,2,1,1,2,2,0,4,1,0,3,1,4,4,0,2,0,1,2,0,0,1,1,0,1,1,2,0,2,1,0,0,0,1,1,0,0,0,0,0,0,1,0,3,1,3,2,1,0,1,0,2,0,3,0,0,2,1,1,1,0,0,0,0,1,3,3,0,0,1,3,0,2,3,0,0,0,2,0,0,0,1,1,0,1,0,1,2,1,1,0,1,1,0,1,2,0,1,1,0,1,1,0,2,1,3,0,1,2,0,0,1,1,1,2,2,0,0,4,1,1,1,2,0,0,0,0,1,1,0,2,2,1,1,0,0,1,4,1,1,2,1,2,1,1,0,4,1,2,1,0,0,0,1,3,0,1,1,1,2,1,0,1,1,0,2,2,0,1,0,0,0,2,1,3,1,2,2,0,0,1,1,0,1,3,1,1,1,0,1,0,1,3,1,1,1,1,0,1,1,0,0,2,2,0,0,3,1,0,2,0,0,2,0,2,1,1,0,0,0,2,2,0,1,3,2,1,0,3,0,0,0,0,0,1,2,0,0,0,0,1,1,1,0,4,1,0,0,0,0,1,1,1,1,1,1,1,1,2,0,0,0,1,1,1,0,1,0,0,2,2,1,1,1,0,2,2,0,0,1,1,0,3,1,1,1,0,0,4,2,1,1,1,2,0,1,0,1,0,0,1,0,1,1,1,1,1,0,0,0,1,1,0,2,1,0,2,0,0,1,0,2,1,0,1,0,2,2,1,0,2,0,1,2,0,5,1,3,0,0,0,1,1,0,0,0,0,0,1,3,2,1,2,1,1,0,1,0,1,2,0,2,0,2,0,1,2,0,1,0,1,2,1,0,2,0,1,0,0,3,0,3,0,2,0,0,0,1,1,1,0,0,0,3,1,1,1,2,1,1,1,0,0,1,1,0,1,1,1,2,1,0,0,2,0,3,0,2,1,0,1,1,1,0,2,0,3,0,0,1,1,2,2,0,3,1,1,1,2,0,0,2,0,0,0,1,2,1,0,1,1,2,0,0,0,0,3,0,0,0,2,3,0,1,0,0,1,2,2,1,0,1,1,0,1,0,1,1,2,2,1,2,0,1,1,3,1,1,1,0,1,1,1,0,0,0,2,0,1,1,1,0,3,0,2,2,0,1,1,0,0,3,2,0,1,1,0,1,2,0,0,1,1,0,1,1,3,0,2,1,0,2,0,1,2,1,3,2,3,1,0,1,3,1,1,1,4,1,1,0,0,0,2,0,1,0,3,0,0,2,2,1,1,4,0,2,0,0,2,2,1,1,0,1,1,3,2,3,0,1,0,2,1,2,1,2,0,2,2,1,1,0,0,0,3,2,0,3,1,2,2,1,0,0,1,1,0,2,2,3,1,1,1,3,0,2,2,4,1,2,0,0,2,2,1,0,2,0,1,0,5,2,0,0,0,0,0,1,0,1,0,1,1,1,2,1,2,0,0,0,0,0,0,2,1,0,1,0,1,2,0,0,0,0,0,0,1,3,2,1,0,1,1,1,1,1,0,0,1,1,1,1,0,1,2,0,1,1,0,0,0,1,2,0,1,1,0,3,2,1,1,2,1,2,1,0,2,1,0,1,0,0,1,0,2,4,1,0,1,0,1,2,0,1,2,0,0,1,0,3,0,1,1,1,0,2,0,0,0,1,2,0,0,1,1,1,1,1,0,4,3,0,2,2,0,2,2,4,3,2,2,1,1,1,1,2,3,0,2,1,2,0,1,0,3,0,1,2,0,1,1,2,0,4,1,1,1,1,0,0,0,0,1,1,1,0,0,2,0,1,1,0,1,1,1,3,1,1,1,0,1,0,1,0,1,1,2,2,0,0,1,1,1,0,1,2,3,1,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1,2,3,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,1,2,1,3,1,1,0,1,0,1,1,1,1,1,1,1,0,0,0,1,0,2,1,2,0,0,1,1,2,0,0,1,1,1,0,0,0,3,1,1,2,2,2,1,0,2,0,2,1,1,0,1,2,1,0,0,1,0,0,1,1,0,2,1,0,2,1,2,3,2,2,1,0,1,1,1,4,1,3,1,0,3,0,4,0,0,1,2,3,1,2,0,1,0,1,1,1,0,1,3,2,1,1,0,2,2,1,0,0,0,1,2,0,1,2,1,1,1,0,1,2,0,2,0,4,3,0,0,1,2,2,2,2,0,0,1,1,1,1,0,1,1,1,1,1,1,0,2,1,1,0,1,2,0,3,0,3,2,0,0,0,0,0,0,0,0,0,2,4,0,0,2,2,0,0,0,2,0,1,1,0,0,0,1,1,1,0,0,2,3,0,1,0,0,0,4,1,0,0,1,4,5,1,0,1,0,1,2,3,1,2,0,2,1,0,1,0,0,2,0,0,1,0,0,0,0,2,1,2,1,1,2,1,1,0,0,1,0,3,3,2,1,0,1,2,0,0,0,4,1,0,0,1,2,3,0,4,1,1,0,1,0,1,1,1,0,1,2,0,2,0,0,0,1,2,1,0,2,2,0,0,0,1,1,0,1,1,1,0,0,2,2,1,1,1,1,0,0,1,2,1,3,1,0,2,0,0,3,2,1,0,1,0,1,0,2,1,2,2,0,0,2,1,0,0,0,0,1,0,1,0,4,2,1,2,0,0,0,1,0,1,3,2,0,0,0,0,0,2,1,0,0,0,1,0,0,0,0,2,4,1,1]},{"counters":[3,0,2,0,0,0,1,2,2,1,0,0,0,1,0,1,1,1,0,1,1,0,2,0,1,0,2,0,3,0,0,3,0,0,1,1,0,0,2,0,0,0,0,1,1,2,0,0,0,0,3,1,1,1,2,0,1,1,1,2,2,0,2,1,1,0,1,1,2,1,1,0,0,2,0,0,0,2,1,1,1,0,1,2,3,0,1,1,0,2,0,2,1,1,0,1,0,1,2,1,1,1,1,1,2,0,1,3,0,2,0,1,1,2,2,1,0,0,1,0,1,0,0,4,2,3,1,0,1,3,2,0,1,1,1,1,2,1,2,2,1,0,1,0,2,3,0,0,0,0,1,1,0,0,0,0,1,0,1,1,1,0,0,1,1,0,1,0,0,0,1,1,1,2,1,0,1,1,1,0,2,1,2,0,1,3,0,0,1,0,1,0,0,1,0,1,0,0,1,2,0,1,1,1,0,0,0,1,1,0,1,1,2,1,2,0,1,2,2,0,0,1,0,0,2,2,4,2,1,1,4,1,0,0,1,1,2,2,0,1,2,0,1,0,1,0,1,1,0,0,1,2,0,2,0,0,0,0,1,2,3,1,0,2,2,0,1,1,0,1,2,2,0,0,0,2,1,0,1,0,0,0,1,1,1,1,1,4,0,0,0,1,1,0,2,1,1,0,1,1,0,2,0,1,1,1,2,1,1,0,0,1,3,1,1,1,3,1,0,0,0,1,3,3,0,1,0,1,1,0,0,1,0,3,1,1,0,0,0,1,6,1,0,1,1,0,1,0,0,0,1,1,0,1,0,1,4,1,1,2,0,1,0,2,3,0,2,0,1,0,0,1,1,3,3,2,1,2,4,1,0,1,0,3,0,1,3,1,1,2,3,2,0,0,1,1,1,1,4,1,0,3,1,1,1,1,0,1,0,2,0,0,1,2,1,0,3,1,0,2,1,2,1,0,2,1,0,0,2,2,0,2,0,0,1,4,0,1,0,1,2,1,1,0,1,2,0,1,1,0,1,4,3,2,2,2,0,1,0,1,0,2,2,0,3,1,1,1,1,0,0,1,1,0,0,1,0,0,0,0,2,0,1,3,0,1,4,3,2,1,1,1,1,0,0,0,1,2,2,1,0,0,0,3,2,2,0,3,2,0,2,1,0,1,0,0,1,1,1,1,0,1,1,1,1,0,0,1,0,0,1,0,0,2,1,1,0,1,2,1,4,1,1,0,1,1,2,0,3,3,3,1,0,0,0,0,1,1,1,1,0,5,2,0,1,1,1,0,2,1,1,0,0,1,3,2,0,0,1,0,0,1,2,0,0,1,1,0,1,0,2,1,0,3,2,0,0,2,0,1,1,0,1,0,1,0,1,2,1,1,1,0,2,1,1,2,2,1,0,3,1,1,2,0,2,1,2,0,0,0,2,1,1,1,2,0,2,1,0,0,0,2,0,1,3,3,1,1,1,0,2,1,0,1,1,0,3,0,1,3,1,1,0,2,2,0,1,1,1,2,0,2,1,2,0,1,2,1,1,1,0,1,0,0,0,0,0,0,2,0,2,0,1,1,1,1,0,1,1,1,1,1,2,2,1,0,0,0,2,1,1,2,0,3,1,0,1,0,0,1,1,1,1,0,1,1,0,0,0,2,1,3,1,0,0,0,1,0,3,1,0,1,1,0,0,2,0,0,0,0,2,1,5,2,1,0,0,0,3,1,1,1,1,0,1,0,0,0,0,1,1,1,0,1,2,3,1,2,0,0,1,0,1,1,0,0,1,2,2,0,1,2,0,2,0,0,1,0,1,1,3,2,0,1,0,1,0,1,3,0,1,0,0,3,2,0,1,1,2,3,2,1,2,1,0,1,1,2,2,0,1,0,1,0,1,0,2,1,1,0,0,1,3,0,0,0,2,0,1,1,1,3,1,2,0,2,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1,2,0,1,0,0,0,0,3,2,2,2,0,1,2,0,2,0,1,2,1,2,2,0,2,2,1,0,1,0,0,0,0,2,0,1,4,1,2,1,3,3,0,3,0,0,0,0,0,2,2,0,0,1,0,0,3,1,0,1,1,3,1,0,0,1,1,0,1,1,1,1,0,1,0,2,1,1,0,2,0,3,2,1,1,1,0,0,0,0,0,2,0,1,2,1,1,3,1,2,0,2,2,0,1,4,2,2,2,1,2,3,0,1,0,0,1,1,0,1,1,3,0,0,1,1,1,0,3,1,2,1,0,2,0,0,1,0,0,1,1,1,2,1,1,0,0,3,0,0,1,0,4,0,1,3,1,0,1,2,0,2,1,2,1,1,1,0,1,0,1,3,0,3,1,0,2,1,0,0,3,1,0,3,0,0,1,2,3,2,1,0,1,1,1,1,1,1,2,0,2,1,1,1,2,2,0,2,2,0,0,0,0,1,2,5,1,0,4,0,2,0,2,3,1,0,0,1,0,0,0,1,0,0,3,0,0,1,2,1,1,0,0,2,0,3,1,1,0,0,1,2,0,1,0,0,1,1,2,2,0,0,1,0,0,2,1,0,2,0,1,1,1,0,1,2,1,3,0,0,0,1,3,1,2,2,1,0,0,1,0,2,2,0,3,1,0,0,1,0,6,0,0,1,0,1,0,0,1,1,1,2,2,0,0,0,1,1,0,0,2,0,1,0,1,1,0,1,1,3,1,0,1,0,1,3,2,1,2,2,1,2,1,2,1,0,1,1,1,1,1,0,0,1,3,0,2,3,1,2,0,3,0,2,1,0,0,3,0,1,0,0,0,1,0,0,0,1,0,1,2,0,2,3,4,1,1,1,0,1,0,0,2,1,0,1,0,1,1,1,1,0,3,2,1,0,1,1,1,0,1,0,3,1,2,1,1,1,1,1,0,1,0,1,0,1,1,0,1,0,0,2,1,0,1,0,1,1,2,0,1,0,4,2,2,0,1,0,1,2,0,1,1,1,1,2,1,1,0,0,2,1,2,0,2,1,1,1,0,1,2,0,0,0,1,1,0,0,0,1,0,1,0,2,1,0,0,2,1,2,1,1,2,3,2,1,1,4,1,0,3,0,0,1,1,1,2,2,3,0,1,2,1,1,2,0,1,0,1,1,0,2,0,0,0,6,1,2,3,2,0,5,0,1,1,0,1,1,0,0,0,0,1,0,1,1,0,0,3,0,1,1,0,2,1,0,2,1,3,1,0,0,1,2,0,0,2,0,0,1,1,5,2,1,1,2,1,1,1,0,0,2,1,1,3,1,1,3,0,2,1,1,1,1,2,1,1,2,0,2,0,0,1,2,0,2,1,2,0,0,0,2,0,0,0,2,1,0,1,1,0,2,0,1,0,0,0,4,0,2,0,1,1,1,0,1,2,1,0,3,0,0,0,0,1,1,1,1,0,1,0,1,0,1,2,1,1,1,0,3,0,4,1,0,1,2,0,0,0,0,3,0,2,2,0,0,2,1,3,0,0,2,0,1,0,1,0,1,4,1,0,0,0,2,1,2,1,2,2,1,4,1,1,1,1,0,1,1,0,0,0,0,1,2,1,1,0,0,2,2,1,0,4,0,3,0,2,0,1,1,0,0,1,3,1,2,0,0,0,1,0,2,2,1,2,0,0,0,0,0,0,1,1,1,2,1,1,0,1,1,0,0,1,1,0,4,2,0,1,1,0,1,3,0,0,0,0,2,1,2,0,1,0,2,1,0,1,2,1,1,0,1,2,0,0,0,0,0,3,1,0,0,0,0,0,2,0,0,3,1,0,1,1,0,0,0,1,2,1,1,2,1,0,2,2,0,0,1,1,0,1,1,2,2,0,0,0,2,0,0,0,0,0,0,1,0,1,0,2,1,0,4,0,2,2,0,0,1,0,1,2,1,0,3,1,3,2,2,3,2,0,0,1,0,4,1,2,1,1,0,0,0,2,1,2,0,1,3,0,3,1,2,0,0,3,0,2,0,1,1,0,0,0,0,3,1,0,2,3,1,3,1,0,2,0,1,1,1,1,0,2,0,3,1,0,0,0,1,1,1,0,3,2,2,2,1,2,2,2,1,2,1,0,1,1,1,0,2,0,2,1,1,1,0,1,2,1,0,1,1,3,3,1,0,1,3,0,0,2,0,2,0,0,1,1,1,2,2,0,1,0,0,0,1,1,2,2,0,0,2,2,1,0,1,1,0,1,0,2,0,2,1,2,1,1,0,1,3,0,3,1,0,0,1,0,0,0,0,0,0,1,1,0,4,0,2,2,0,0,1,0,0,1,1,1,2,0,2,2,4,0,0,0,0,0,1,3,1,0,1,0,1,4,0,3,0,3,0,2,2,0,0,0,0,2,1,2,1,0,0,1,3,1,0,0,1,1,2,0,1,1,2,1,1,1,0,3,2,0,1,0,1,1,1,1,1,0,0,0,2,1,0,1,2,4,0,0,1,2,1,0,1,1,2,0,1,1,2,1,1,0,0,0,1,0,0,1,3,0,0,2,4,0,0,0,0,0,0,2,2,1,3,2,2,0,1,0,1,2,0,0,1,1,1,1,1,0,2,1,1,0,3,3,1,0,2,0,1,0,1,1,4,0,1,1,0,1]}]},"null_count":0,"last_update_version":397952045062553600}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_002.json b/cmd/explaintest/s/explain_complex_stats_tbl_002.json deleted file mode 100644 index c552cd3dc6b7e..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_002.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_002","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDQzNDE3MDU=","upper_bound":"LTIxMzM5MjY3NTU=","repeats":1},{"count":16,"lower_bound":"LTIxMzE2MDAwODg=","upper_bound":"LTIxMDI2NTM2MDE=","repeats":1},{"count":24,"lower_bound":"LTIwOTg2ODA4NTI=","upper_bound":"LTIwODIyMzkwMDE=","repeats":1},{"count":32,"lower_bound":"LTIwODIyMDI4NTI=","upper_bound":"LTIwNjY4NDE0NjA=","repeats":1},{"count":40,"lower_bound":"LTIwNjAzMzkxMzc=","upper_bound":"LTIwNTA1Mzg4MzA=","repeats":1},{"count":48,"lower_bound":"LTIwNDQ1OTA1Mjg=","upper_bound":"LTIwMzczMjIyMjQ=","repeats":1},{"count":56,"lower_bound":"LTIwMzAyMTI1MjU=","upper_bound":"LTIwMTc5MjI3OTY=","repeats":1},{"count":64,"lower_bound":"LTIwMTc3Mjk2ODg=","upper_bound":"LTIwMDQyNTM1NDY=","repeats":1},{"count":72,"lower_bound":"LTIwMDMzNzEwNTY=","upper_bound":"LTE5ODc3MDg1OTY=","repeats":1},{"count":80,"lower_bound":"LTE5NjAxNTI4OTY=","upper_bound":"LTE5NDAzNDc5Njg=","repeats":1},{"count":88,"lower_bound":"LTE5MzUyNzA1MDg=","upper_bound":"LTE5MjQ4OTA2NDE=","repeats":1},{"count":96,"lower_bound":"LTE5MjMyMzc3NDQ=","upper_bound":"LTE5MDcwODk3MDQ=","repeats":1},{"count":104,"lower_bound":"LTE5MDQ5NzA4OTU=","upper_bound":"LTE4OTQwNDk2MTQ=","repeats":1},{"count":112,"lower_bound":"LTE4ODk0MTYyNzI=","upper_bound":"LTE4NzkwNjY0MzU=","repeats":1},{"count":120,"lower_bound":"LTE4Nzg2NzEwMDE=","upper_bound":"LTE4NjcyOTE5NTY=","repeats":1},{"count":128,"lower_bound":"LTE4NjQ1Nzg4ODc=","upper_bound":"LTE4NjA2NDg0ODg=","repeats":1},{"count":136,"lower_bound":"LTE4NTg0MzQzNTg=","upper_bound":"LTE4NDkxNzQ3NzY=","repeats":1},{"count":144,"lower_bound":"LTE4NDcyODk3MDc=","upper_bound":"LTE4MzcxMzMzNDM=","repeats":1},{"count":152,"lower_bound":"LTE4MzIwMzQ5Mjc=","upper_bound":"LTE4MTYyMzYwMDY=","repeats":1},{"count":160,"lower_bound":"LTE4MTQ1ODU5MjY=","upper_bound":"LTE3ODQwNTU4ODg=","repeats":1},{"count":168,"lower_bound":"LTE3ODA3MDk0MDY=","upper_bound":"LTE3NzYzODM4ODU=","repeats":1},{"count":176,"lower_bound":"LTE3NzYyNDQwMzc=","upper_bound":"LTE3NjcwMjE4NzU=","repeats":1},{"count":184,"lower_bound":"LTE3NjA0MDM4NjM=","upper_bound":"LTE3NDgyNjIzOTY=","repeats":1},{"count":192,"lower_bound":"LTE3NDgwODA0Mjg=","upper_bound":"LTE3MzEwMTg2NTg=","repeats":1},{"count":200,"lower_bound":"LTE3Mjg2ODY0MjU=","upper_bound":"LTE3MTk0NjYzMjk=","repeats":1},{"count":208,"lower_bound":"LTE3MTYyOTQwNTQ=","upper_bound":"LTE3MTA3MTk0MjI=","repeats":1},{"count":216,"lower_bound":"LTE3MDYzMjczMzA=","upper_bound":"LTE3MDM0MTMzMzA=","repeats":1},{"count":224,"lower_bound":"LTE3MDA3ODIyOTg=","upper_bound":"LTE2ODE2MTM5NzU=","repeats":1},{"count":232,"lower_bound":"LTE2Nzg5NzU0NDA=","upper_bound":"LTE2NzI1NjIxOTc=","repeats":1},{"count":240,"lower_bound":"LTE2NzEyMjc4NjM=","upper_bound":"LTE2NTg0NzUxODg=","repeats":1},{"count":248,"lower_bound":"LTE2NTcxNTk2Mzk=","upper_bound":"LTE2NDUzODAwNjc=","repeats":1},{"count":256,"lower_bound":"LTE2NDEwNTQ0MjA=","upper_bound":"LTE2MjIyMDk3NDg=","repeats":1},{"count":264,"lower_bound":"LTE2MTY1NTMxNzk=","upper_bound":"LTE2MDY2OTQ5Nzc=","repeats":1},{"count":272,"lower_bound":"LTE2MDUzNDM3MDg=","upper_bound":"LTE1OTM3NTQ5Mzc=","repeats":1},{"count":280,"lower_bound":"LTE1ODYzODcxNzY=","upper_bound":"LTE1Nzc4Nzk2MDE=","repeats":1},{"count":288,"lower_bound":"LTE1NzY3NDExMzQ=","upper_bound":"LTE1NjMyOTkyNTk=","repeats":1},{"count":296,"lower_bound":"LTE1NjA3NDA5NjA=","upper_bound":"LTE1NDYxMzA3NDQ=","repeats":1},{"count":304,"lower_bound":"LTE1MzQxNzUyMTI=","upper_bound":"LTE1MjE1MDU2MDM=","repeats":1},{"count":312,"lower_bound":"LTE1MDM5OTkwOTQ=","upper_bound":"LTE0ODU5MzU2NTk=","repeats":1},{"count":320,"lower_bound":"LTE0ODExMDU2Nzc=","upper_bound":"LTE0NzI2Nzk5MDg=","repeats":1},{"count":328,"lower_bound":"LTE0NjUyMzIxMTc=","upper_bound":"LTE0NjI5MjM0MDM=","repeats":1},{"count":336,"lower_bound":"LTE0NjE0NDgxNzI=","upper_bound":"LTE0NTMwNDcxMDA=","repeats":1},{"count":344,"lower_bound":"LTE0NTE0MjUzODI=","upper_bound":"LTE0MzcyNjQ1NTY=","repeats":1},{"count":352,"lower_bound":"LTE0MzY5Njg2ODM=","upper_bound":"LTE0MjA1NTAyMzA=","repeats":1},{"count":360,"lower_bound":"LTE0MTgyMjk5NjE=","upper_bound":"LTEzOTgzNDUzNjE=","repeats":1},{"count":368,"lower_bound":"LTEzOTQ2MjAzMDM=","upper_bound":"LTEzNzQ2MjAwMTY=","repeats":1},{"count":376,"lower_bound":"LTEzNzA5NTUyMjM=","upper_bound":"LTEzNTk3NzQ4ODk=","repeats":1},{"count":384,"lower_bound":"LTEzNTg3MzI2OTA=","upper_bound":"LTEzMzAzNzM1NTY=","repeats":1},{"count":392,"lower_bound":"LTEzMjMzNzEwMjg=","upper_bound":"LTEzMDE0Njc4ODI=","repeats":1},{"count":400,"lower_bound":"LTEyOTQyNjkyMTA=","upper_bound":"LTEyNjY0MDExOTY=","repeats":1},{"count":408,"lower_bound":"LTEyNjExMjE1NTE=","upper_bound":"LTEyMzg5MDgyNjE=","repeats":1},{"count":416,"lower_bound":"LTEyMzU1OTM1OTk=","upper_bound":"LTEyMzA5ODU3Njk=","repeats":1},{"count":424,"lower_bound":"LTEyMjk3MjcxNTI=","upper_bound":"LTEyMjE1MDgwNjM=","repeats":1},{"count":432,"lower_bound":"LTEyMjEyNTczMTM=","upper_bound":"LTEyMTE2NjAwNDY=","repeats":1},{"count":440,"lower_bound":"LTEyMDQ3MjIwODU=","upper_bound":"LTEyMDI3NjkwODQ=","repeats":1},{"count":448,"lower_bound":"LTEyMDIzNzM3MzI=","upper_bound":"LTExOTU3OTU1NjY=","repeats":1},{"count":456,"lower_bound":"LTExOTU3NDcyOTU=","upper_bound":"LTExOTQyMTIwNTA=","repeats":1},{"count":464,"lower_bound":"LTExOTMzOTc0MDY=","upper_bound":"LTExODMwNjYwMTc=","repeats":1},{"count":472,"lower_bound":"LTExODEwMTIzNTk=","upper_bound":"LTExNzI0MTgyMjQ=","repeats":1},{"count":480,"lower_bound":"LTExNjc5MTQ2MDM=","upper_bound":"LTExNTk5NDk1MTQ=","repeats":1},{"count":488,"lower_bound":"LTExNTY5MDc3NDM=","upper_bound":"LTExNDE4NjQ2MjQ=","repeats":1},{"count":496,"lower_bound":"LTExMzM4MjE5MTk=","upper_bound":"LTExMTE2NDczODY=","repeats":1},{"count":504,"lower_bound":"LTExMDkzODM3OTc=","upper_bound":"LTExMDIwMjc4MDI=","repeats":1},{"count":512,"lower_bound":"LTExMDA4NzA2NjE=","upper_bound":"LTEwOTQzNjAyMDI=","repeats":1},{"count":520,"lower_bound":"LTEwOTIxODM1MTY=","upper_bound":"LTEwODUxODA4NTY=","repeats":1},{"count":528,"lower_bound":"LTEwODQ5NjA5MDU=","upper_bound":"LTEwNzM0MjAyMzE=","repeats":1},{"count":536,"lower_bound":"LTEwNzMzNzk3MDQ=","upper_bound":"LTEwNjQ5OTU4NTk=","repeats":1},{"count":544,"lower_bound":"LTEwNjI2ODA0MTU=","upper_bound":"LTEwNTI5MzQ1MTM=","repeats":1},{"count":552,"lower_bound":"LTEwNTI2ODQ3OTc=","upper_bound":"LTEwNDEyNDM0MjQ=","repeats":1},{"count":560,"lower_bound":"LTEwMzk1MTA1NDg=","upper_bound":"LTEwMjAxMTg1MTU=","repeats":1},{"count":568,"lower_bound":"LTEwMTg5NDM0NDU=","upper_bound":"LTEwMDk2MzM3MzU=","repeats":1},{"count":576,"lower_bound":"LTEwMDg3NjcxMzU=","upper_bound":"LTEwMDA5MzMzMjE=","repeats":1},{"count":584,"lower_bound":"LTk5OTk1MzM0NA==","upper_bound":"LTk4MzMwODg2Ng==","repeats":1},{"count":592,"lower_bound":"LTk3ODk4NTQ4MQ==","upper_bound":"LTk2NDg5MTEzMQ==","repeats":1},{"count":600,"lower_bound":"LTk2Mzc0NzM4MQ==","upper_bound":"LTk1NzE2MTI0Nw==","repeats":1},{"count":608,"lower_bound":"LTk1Njk0MDU3MA==","upper_bound":"LTk0NDI2NjAzMQ==","repeats":1},{"count":616,"lower_bound":"LTkzNzc2OTc3Mw==","upper_bound":"LTkyNjk1OTQyNA==","repeats":1},{"count":624,"lower_bound":"LTkyNTY2NTEzNQ==","upper_bound":"LTkxNTk5OTY2OA==","repeats":1},{"count":632,"lower_bound":"LTkxNDY0MjY5NA==","upper_bound":"LTg5NzU2MzExMA==","repeats":1},{"count":640,"lower_bound":"LTg5NzA4OTIwNw==","upper_bound":"LTg4MTc3ODY4MQ==","repeats":1},{"count":648,"lower_bound":"LTg4MDc5ODIwNA==","upper_bound":"LTg2MzQ5NzQyMw==","repeats":1},{"count":656,"lower_bound":"LTg2MTAzNjczMQ==","upper_bound":"LTg0ODk3ODg5MQ==","repeats":1},{"count":664,"lower_bound":"LTg0MzYwNDg1Mw==","upper_bound":"LTgzNjUyMjg4NA==","repeats":1},{"count":672,"lower_bound":"LTgzNDM3OTU3OQ==","upper_bound":"LTgwMjkxMTExNQ==","repeats":1},{"count":680,"lower_bound":"LTc5OTA4NTI3NQ==","upper_bound":"LTc5MTAwMzc5NQ==","repeats":1},{"count":688,"lower_bound":"LTc4MjQ0NDE4MA==","upper_bound":"LTc3OTIzNDQyNg==","repeats":1},{"count":696,"lower_bound":"LTc3Nzk1OTc5NA==","upper_bound":"LTc3NDk2ODYwNg==","repeats":1},{"count":704,"lower_bound":"LTc1NjY4ODg5Mw==","upper_bound":"LTczMjg3NDExOQ==","repeats":1},{"count":712,"lower_bound":"LTcyNzkzNzc2NQ==","upper_bound":"LTcyMjY5MjUxMw==","repeats":1},{"count":720,"lower_bound":"LTcyMjA1OTg2OQ==","upper_bound":"LTcxNDYxMzc4MQ==","repeats":1},{"count":728,"lower_bound":"LTcxNDU5MDA3Ng==","upper_bound":"LTY5OTQ2MTc1OQ==","repeats":1},{"count":736,"lower_bound":"LTY5NTUxMzIyMA==","upper_bound":"LTY3MDc4MTk0Ng==","repeats":1},{"count":744,"lower_bound":"LTY2ODQxMDI5Mg==","upper_bound":"LTY2Mjc3MjYzNQ==","repeats":1},{"count":752,"lower_bound":"LTY2MDk1OTEyMQ==","upper_bound":"LTY0NTI5NjYyNQ==","repeats":1},{"count":760,"lower_bound":"LTY0MjQ1NTcwOQ==","upper_bound":"LTYzMDkxMDQ1Mg==","repeats":1},{"count":768,"lower_bound":"LTYzMDA3MDQ1MQ==","upper_bound":"LTYyMDk5MDM2Nw==","repeats":1},{"count":776,"lower_bound":"LTYxMDcyMDc2Mw==","upper_bound":"LTYwODMwMDIxMQ==","repeats":1},{"count":784,"lower_bound":"LTYwNzUwNjY2Mw==","upper_bound":"LTYwMDU0OTU4Mg==","repeats":1},{"count":792,"lower_bound":"LTU4ODkzMjczMg==","upper_bound":"LTU4MjQ2Nzg1Mw==","repeats":1},{"count":800,"lower_bound":"LTU3NDgwMTkzMg==","upper_bound":"LTU1OTgwNDcxOQ==","repeats":1},{"count":808,"lower_bound":"LTU1OTU4NDM0OA==","upper_bound":"LTUzNTU0NDg5NA==","repeats":1},{"count":816,"lower_bound":"LTUzNTIxNzQ1MA==","upper_bound":"LTUzMjMyMTQ5NQ==","repeats":1},{"count":824,"lower_bound":"LTUzMDU0Mjg4NA==","upper_bound":"LTUyMzg0OTE0OA==","repeats":1},{"count":832,"lower_bound":"LTUyMDc1NTgyMg==","upper_bound":"LTQ2NzU5MTY5Ng==","repeats":1},{"count":840,"lower_bound":"LTQ2NDE4Mjk1Nw==","upper_bound":"LTQ1NjkwNzM5Ng==","repeats":1},{"count":848,"lower_bound":"LTQ1NDE1NDgzMQ==","upper_bound":"LTQ0NzMyMzQ5MQ==","repeats":1},{"count":856,"lower_bound":"LTQzOTUxOTM2OA==","upper_bound":"LTQyOTI2NDA5MA==","repeats":1},{"count":864,"lower_bound":"LTQxMjIzNzkzMg==","upper_bound":"LTQwODgwNzY0Mw==","repeats":1},{"count":872,"lower_bound":"LTQwNzk0Mzk0NQ==","upper_bound":"LTM5MDg0NTAzMw==","repeats":1},{"count":880,"lower_bound":"LTM4OTQ1MTI5OQ==","upper_bound":"LTM1NzE2MTMwMA==","repeats":1},{"count":888,"lower_bound":"LTM1NzA1ODk1Nw==","upper_bound":"LTM1NDEyMzcxNw==","repeats":1},{"count":896,"lower_bound":"LTM1MTgyMDUzMQ==","upper_bound":"LTMzMzE1MDU4Mg==","repeats":1},{"count":904,"lower_bound":"LTMzMjAyMzU0NA==","upper_bound":"LTMyNTQyNTE0OA==","repeats":1},{"count":912,"lower_bound":"LTMxODY2NzE1OQ==","upper_bound":"LTMwNDE4MzI5Mg==","repeats":1},{"count":920,"lower_bound":"LTI5Nzk5NjMzOA==","upper_bound":"LTI4MzUzNDEzNg==","repeats":1},{"count":928,"lower_bound":"LTI3Njg3OTczOA==","upper_bound":"LTI1OTEyOTU3OA==","repeats":1},{"count":936,"lower_bound":"LTI1MzQ2NTA1NQ==","upper_bound":"LTI0MjEzNzc1NQ==","repeats":1},{"count":944,"lower_bound":"LTIzODE2MzMyNA==","upper_bound":"LTIyODY2ODczNA==","repeats":1},{"count":952,"lower_bound":"LTIyODEyNDUwMw==","upper_bound":"LTIyNDQ1MjQ3MQ==","repeats":1},{"count":960,"lower_bound":"LTIyNDA5NzE5Mw==","upper_bound":"LTIxMzk4ODQ1OA==","repeats":1},{"count":968,"lower_bound":"LTIwOTczMDc0Mg==","upper_bound":"LTE5MzA2MjMzMQ==","repeats":1},{"count":976,"lower_bound":"LTE4NDU3MzgzOQ==","upper_bound":"LTE3NzY3Nzc1NA==","repeats":1},{"count":984,"lower_bound":"LTE3MzU0OTAyNw==","upper_bound":"LTE2ODk1ODM5NA==","repeats":1},{"count":992,"lower_bound":"LTE2NDA3NjY3Mw==","upper_bound":"LTE1MzgyMTE3Nw==","repeats":1},{"count":1000,"lower_bound":"LTE1MDk2MDQ5NQ==","upper_bound":"LTEyMTE5OTgzMw==","repeats":1},{"count":1008,"lower_bound":"LTExMzQyMTk4Ng==","upper_bound":"LTEwOTM4NzY2Mg==","repeats":1},{"count":1016,"lower_bound":"LTk4NDE4MDY5","upper_bound":"LTg2NTE1MzQ1","repeats":1},{"count":1024,"lower_bound":"LTgzMzQwNTA3","upper_bound":"LTYwNjI5NjYw","repeats":1},{"count":1032,"lower_bound":"LTU5MTMxMTUy","upper_bound":"LTQ4MjA3MTM4","repeats":1},{"count":1040,"lower_bound":"LTQ2NzMwOTQz","upper_bound":"LTE2MTA0Nzc1","repeats":1},{"count":1048,"lower_bound":"LTEwOTg4OTY0","upper_bound":"LTc2NTAxMzQ=","repeats":1},{"count":1056,"lower_bound":"NjY2MTUzMw==","upper_bound":"MTczMTA2NDg=","repeats":1},{"count":1064,"lower_bound":"MTc5MTYyMTQ=","upper_bound":"MjI0MzQwNjc=","repeats":1},{"count":1072,"lower_bound":"MjU0MjU0Nzg=","upper_bound":"NDA2MjYzNjc=","repeats":1},{"count":1080,"lower_bound":"NDI2MDc2ODQ=","upper_bound":"NTc1MTEwNjU=","repeats":1},{"count":1088,"lower_bound":"NTk5ODkxNTE=","upper_bound":"NzAzMDI2Mzc=","repeats":1},{"count":1096,"lower_bound":"ODQwODMwODE=","upper_bound":"ODU4ODEyODk=","repeats":1},{"count":1104,"lower_bound":"OTIzMjYxNDQ=","upper_bound":"OTgxNTk1NDc=","repeats":1},{"count":1112,"lower_bound":"MTAxNjc3NzY2","upper_bound":"MTMyMTgwNzIy","repeats":1},{"count":1120,"lower_bound":"MTM5ODQ3MzE4","upper_bound":"MTUyNTI5NjUz","repeats":1},{"count":1128,"lower_bound":"MTUyNTQ4MzIy","upper_bound":"MTU5NTcyNDQx","repeats":1},{"count":1136,"lower_bound":"MTY4Mzk0MTYy","upper_bound":"MTgxMjA1OTMz","repeats":1},{"count":1144,"lower_bound":"MTgyMzM1ODI1","upper_bound":"MTg1MTM3MTY0","repeats":1},{"count":1152,"lower_bound":"MTg1OTcwNjAy","upper_bound":"MTkzNjgwMjc4","repeats":1},{"count":1160,"lower_bound":"MjA3Mjc2NTY1","upper_bound":"MjExODg0MzM2","repeats":1},{"count":1168,"lower_bound":"MjEzMTM1NzI5","upper_bound":"MjM2NDg1OTAw","repeats":1},{"count":1176,"lower_bound":"MjQwNDEzNDY2","upper_bound":"MjUzNzYwMjQ5","repeats":1},{"count":1184,"lower_bound":"MjU2MDgzNzc4","upper_bound":"MjYyMjU4Mzc3","repeats":1},{"count":1192,"lower_bound":"MjYyNjUyMjA3","upper_bound":"MjY3NjQwODA5","repeats":1},{"count":1200,"lower_bound":"MjcxMjIyNTk4","upper_bound":"MzAyODkxMzg2","repeats":1},{"count":1208,"lower_bound":"MzA1NTk1ODY2","upper_bound":"MzA5NDA5OTAx","repeats":1},{"count":1216,"lower_bound":"MzExOTg4MzY3","upper_bound":"MzE1OTAzMTU5","repeats":1},{"count":1224,"lower_bound":"MzE2NDA1Njk4","upper_bound":"MzQzMzY5ODAy","repeats":1},{"count":1232,"lower_bound":"MzQ2MzQyMjY5","upper_bound":"MzYzNTYxMzg0","repeats":1},{"count":1240,"lower_bound":"MzcwMTY1MzYy","upper_bound":"MzgzMjYxMTU1","repeats":1},{"count":1248,"lower_bound":"Mzg1ODc2MDUx","upper_bound":"NDEwODQ4MjYx","repeats":1},{"count":1256,"lower_bound":"NDE2NDM4NTA3","upper_bound":"NDMzNzYwMTM4","repeats":1},{"count":1264,"lower_bound":"NDM1ODc3ODQ2","upper_bound":"NDQ2NDIxMTAw","repeats":1},{"count":1272,"lower_bound":"NDUxOTQ0MDAz","upper_bound":"NDYwNTg5OTQw","repeats":1},{"count":1280,"lower_bound":"NDYwNjkzMDk3","upper_bound":"NDcwNjcwOTE3","repeats":1},{"count":1288,"lower_bound":"NDcxOTExMDU1","upper_bound":"NDkyNjQyOTMx","repeats":1},{"count":1296,"lower_bound":"NDk3NjY0NDg4","upper_bound":"NTA3OTYzODMw","repeats":1},{"count":1304,"lower_bound":"NTEzMjUzMjk2","upper_bound":"NTIxNDM4NDUx","repeats":1},{"count":1312,"lower_bound":"NTI0OTE1ODM4","upper_bound":"NTM1NDM4Nzcw","repeats":1},{"count":1320,"lower_bound":"NTM2MzAzODY5","upper_bound":"NTUxODQ5MjY0","repeats":1},{"count":1328,"lower_bound":"NTYwMDY5NDMw","upper_bound":"NTc5MDIwMTY2","repeats":1},{"count":1336,"lower_bound":"NTgwNzI0MTgx","upper_bound":"NTk5Mzk3NTUy","repeats":1},{"count":1344,"lower_bound":"NjA1Mjc3OTI1","upper_bound":"NjA3NTE1NTI5","repeats":1},{"count":1352,"lower_bound":"NjA4MjIyODQ4","upper_bound":"NjExNTAwODc2","repeats":1},{"count":1360,"lower_bound":"NjE2MTA2NzM0","upper_bound":"NjI0MDM3Mjkx","repeats":1},{"count":1368,"lower_bound":"NjMwMjY3ODQ0","upper_bound":"NjM3MTgxNzEz","repeats":1},{"count":1376,"lower_bound":"NjQxMTg2MjA5","upper_bound":"NjU5OTc3NjE5","repeats":1},{"count":1384,"lower_bound":"NjY3MDk3Njk3","upper_bound":"Njg2NDY0NzIw","repeats":1},{"count":1392,"lower_bound":"Njg4OTM5OTQx","upper_bound":"NzA4MDAzMTY2","repeats":1},{"count":1400,"lower_bound":"NzEwMjgzODUz","upper_bound":"NzE2MjU3MDQ2","repeats":1},{"count":1408,"lower_bound":"NzE3MTc5NjQ1","upper_bound":"NzMxNDE4NjU5","repeats":1},{"count":1416,"lower_bound":"NzM0NDY2MzI3","upper_bound":"NzQ0NDQzNTI4","repeats":1},{"count":1424,"lower_bound":"NzQ0NDU1OTQ4","upper_bound":"NzU2MjY1MzM2","repeats":1},{"count":1432,"lower_bound":"NzU4NjE3Mjgy","upper_bound":"NzY2NzU1ODAy","repeats":1},{"count":1440,"lower_bound":"NzcyODk1NzE1","upper_bound":"NzgyNjk2NjUy","repeats":1},{"count":1448,"lower_bound":"Nzg1MzA0NzE5","upper_bound":"NzkzNzgyMzUz","repeats":1},{"count":1456,"lower_bound":"ODA2ODc4MDEy","upper_bound":"ODI1NzcyNzU5","repeats":1},{"count":1464,"lower_bound":"ODMyMTY3MDk2","upper_bound":"ODQ4OTYyNTk5","repeats":1},{"count":1472,"lower_bound":"ODU0Mjc4MTc1","upper_bound":"ODY1MDQ5NTA3","repeats":1},{"count":1480,"lower_bound":"ODgwNTAzODAw","upper_bound":"ODg0MzY4MzY1","repeats":1},{"count":1488,"lower_bound":"ODkwOTU3MjMy","upper_bound":"OTAwNjg1ODY5","repeats":1},{"count":1496,"lower_bound":"OTA3NDQ4NjI2","upper_bound":"OTEwMDc5NjY2","repeats":1},{"count":1504,"lower_bound":"OTE2Mjg0NjQ5","upper_bound":"OTQ4Nzk4MjQy","repeats":1},{"count":1512,"lower_bound":"OTUwMzkyODUw","upper_bound":"OTY3NjQ0ODY1","repeats":1},{"count":1520,"lower_bound":"OTcwNzAzMDI2","upper_bound":"OTg0MjYyMzMx","repeats":1},{"count":1528,"lower_bound":"OTg1NzczNjgz","upper_bound":"OTk5MzQ2MTE4","repeats":1},{"count":1536,"lower_bound":"MTAwMjA3MjA5NQ==","upper_bound":"MTAxMTgwMDY3OQ==","repeats":1},{"count":1544,"lower_bound":"MTAyMTc3MTAwNw==","upper_bound":"MTAyNjY1MjIyMw==","repeats":1},{"count":1552,"lower_bound":"MTAzMjU5MjQyNQ==","upper_bound":"MTA0NTY5MjIxOQ==","repeats":1},{"count":1560,"lower_bound":"MTA0NzY5NjkyNA==","upper_bound":"MTA3NTQwOTgxNA==","repeats":1},{"count":1568,"lower_bound":"MTA3NjAyODc5Mw==","upper_bound":"MTA5NjcxNDM0MQ==","repeats":1},{"count":1576,"lower_bound":"MTEwMjAzMzYyNw==","upper_bound":"MTExMTUyNTU3OQ==","repeats":1},{"count":1584,"lower_bound":"MTExODU0MDg4OA==","upper_bound":"MTEzNjkxNDUwMw==","repeats":1},{"count":1592,"lower_bound":"MTE0MzY4Mzc0NA==","upper_bound":"MTE5MDAyMzYyMw==","repeats":1},{"count":1600,"lower_bound":"MTE5MzIzMjgzNw==","upper_bound":"MTE5ODAzNzA0MA==","repeats":1},{"count":1608,"lower_bound":"MTE5ODczMTY3Ng==","upper_bound":"MTIwMDk5NzMxNQ==","repeats":1},{"count":1616,"lower_bound":"MTIwNDkxMzYxMQ==","upper_bound":"MTIyMDgwMTgxOQ==","repeats":1},{"count":1624,"lower_bound":"MTIyMzU3MDAxOQ==","upper_bound":"MTIzMjg0MjY3OA==","repeats":1},{"count":1632,"lower_bound":"MTI1NDcwNTg0OQ==","upper_bound":"MTI2MTAwMDYyNg==","repeats":1},{"count":1640,"lower_bound":"MTI4MDcwMTk0Ng==","upper_bound":"MTI5MjQ5Mzk5NQ==","repeats":1},{"count":1648,"lower_bound":"MTI5Njk1Njg1Nw==","upper_bound":"MTMxMDQxMDMyOQ==","repeats":1},{"count":1656,"lower_bound":"MTMxMDgwNjQ1NQ==","upper_bound":"MTMyNTg2NTgyOQ==","repeats":1},{"count":1664,"lower_bound":"MTM0Njg3NzcwMQ==","upper_bound":"MTM3NTc3MzE4MQ==","repeats":1},{"count":1672,"lower_bound":"MTM4NjIwMTYzMw==","upper_bound":"MTQwMjMzNDQ4Nw==","repeats":1},{"count":1680,"lower_bound":"MTQwMzUwNjc4Nw==","upper_bound":"MTQxMTY0Nzc3MQ==","repeats":1},{"count":1688,"lower_bound":"MTQyMjEyOTExOQ==","upper_bound":"MTQzMzA5ODAyNQ==","repeats":1},{"count":1696,"lower_bound":"MTQzNTU4Mjc3Ng==","upper_bound":"MTQ2MjgyOTEyNQ==","repeats":1},{"count":1704,"lower_bound":"MTQ2MzQzNDk3OA==","upper_bound":"MTQ3MDM1Njg0OA==","repeats":1},{"count":1712,"lower_bound":"MTQ3NDM5MDc1NA==","upper_bound":"MTQ4Njg4NzE1MQ==","repeats":1},{"count":1720,"lower_bound":"MTQ4ODIwNDcxMA==","upper_bound":"MTQ5ODk3OTMxOQ==","repeats":1},{"count":1728,"lower_bound":"MTQ5OTY0NzgzOA==","upper_bound":"MTUxMzE0NTQzMg==","repeats":1},{"count":1736,"lower_bound":"MTUyMTI5NTE4Ng==","upper_bound":"MTU0NDY0NDY2MQ==","repeats":1},{"count":1744,"lower_bound":"MTU0NzEzMDE3MA==","upper_bound":"MTU1NjQzNDQ5Ng==","repeats":1},{"count":1752,"lower_bound":"MTU1Nzc2ODgzNQ==","upper_bound":"MTU3MDc5ODEyOA==","repeats":1},{"count":1760,"lower_bound":"MTU3NDMwODUzMA==","upper_bound":"MTU4MTk5NTY2NQ==","repeats":1},{"count":1768,"lower_bound":"MTU5MTkzNTI3NQ==","upper_bound":"MTYwODIwMTM1Ng==","repeats":1},{"count":1776,"lower_bound":"MTYxMjUyMjk0NA==","upper_bound":"MTYyNTA4NDAxOQ==","repeats":1},{"count":1784,"lower_bound":"MTYzMDc5MDI3OA==","upper_bound":"MTY0ODMyNDU5MA==","repeats":1},{"count":1792,"lower_bound":"MTY1MTYwMTY2MA==","upper_bound":"MTY2MjgwNjUyOA==","repeats":1},{"count":1800,"lower_bound":"MTY3MjQzODYzOQ==","upper_bound":"MTY3NTI1ODAwOA==","repeats":1},{"count":1808,"lower_bound":"MTY5MTM3NzQxNQ==","upper_bound":"MTcwODAxNTc2Ng==","repeats":1},{"count":1816,"lower_bound":"MTcxMDk0Njc0MQ==","upper_bound":"MTcxNTI2NzU2Ng==","repeats":1},{"count":1824,"lower_bound":"MTcxNTg0NzM5NQ==","upper_bound":"MTczMzQ1NTU5OQ==","repeats":1},{"count":1832,"lower_bound":"MTczNjAwOTYyOA==","upper_bound":"MTc0NzY3ODI1MA==","repeats":1},{"count":1840,"lower_bound":"MTc1MDA4OTAxNw==","upper_bound":"MTc2NDczMjg1Nw==","repeats":1},{"count":1848,"lower_bound":"MTc2NjMzMzE4Nw==","upper_bound":"MTc3NDkyMzAwNg==","repeats":1},{"count":1856,"lower_bound":"MTc3NTIzMDk2Mg==","upper_bound":"MTc4NTcyNjE0MA==","repeats":1},{"count":1864,"lower_bound":"MTc4NjEyOTQ3Mg==","upper_bound":"MTc5Mzk4MjE2Nw==","repeats":1},{"count":1872,"lower_bound":"MTc5OTE0MTM1MA==","upper_bound":"MTgxNDEwNzA1Ng==","repeats":1},{"count":1880,"lower_bound":"MTgyNTg2OTAyOQ==","upper_bound":"MTg1OTUwMzQzOA==","repeats":1},{"count":1888,"lower_bound":"MTg2MzI0NDIwOQ==","upper_bound":"MTg4MzIwODU2NQ==","repeats":1},{"count":1896,"lower_bound":"MTg4OTU5ODg0MA==","upper_bound":"MTkxMjI2MTAwMA==","repeats":1},{"count":1904,"lower_bound":"MTkxNDcyNzQ0NA==","upper_bound":"MTk0NDgzMzIxOA==","repeats":1},{"count":1912,"lower_bound":"MTk1NTk1Mjk3Mg==","upper_bound":"MTk2MDQ5OTIxMg==","repeats":1},{"count":1920,"lower_bound":"MTk2NTU5OTE3Mw==","upper_bound":"MTk3NTc2MTQ2OQ==","repeats":1},{"count":1928,"lower_bound":"MTk4NTM0NjY5Ng==","upper_bound":"MTk4ODczMDY3Nw==","repeats":1},{"count":1936,"lower_bound":"MTk5MjExODQ0NQ==","upper_bound":"MjAwNzcyMTUyMA==","repeats":1},{"count":1944,"lower_bound":"MjAxMzE5MDMyNQ==","upper_bound":"MjAyNzM0ODkxMA==","repeats":1},{"count":1952,"lower_bound":"MjAyOTk4NTc1Mg==","upper_bound":"MjA2MTA1MjU2NQ==","repeats":1},{"count":1960,"lower_bound":"MjA2NTI2NzMxNg==","upper_bound":"MjA3NzM2NzM5OA==","repeats":1},{"count":1968,"lower_bound":"MjA3Nzg5Nzk1MA==","upper_bound":"MjA5NjA4NTI1Mw==","repeats":1},{"count":1976,"lower_bound":"MjA5NzIzMjA5Mw==","upper_bound":"MjEwNzE2MjAwNg==","repeats":1},{"count":1984,"lower_bound":"MjExMTE4MDcwOA==","upper_bound":"MjEyMjE1NTAwNg==","repeats":1},{"count":1992,"lower_bound":"MjEyODk3ODg2Mw==","upper_bound":"MjEzODYyMzk4OA==","repeats":1},{"count":2000,"lower_bound":"MjEzODgyMDUyMw==","upper_bound":"MjE0NjE0NjEwMw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,0,0,0,0,0,0,0,1,1,2,3,1,0,0,0,2,0,3,1,1,0,1,1,1,0,1,1,1,1,2,1,0,2,0,0,3,1,1,0,2,1,0,0,1,1,2,1,1,1,0,1,3,0,0,0,1,3,0,3,0,1,0,1,0,2,1,0,0,0,0,2,1,0,1,2,0,1,1,2,0,1,1,0,2,0,0,0,1,1,1,1,1,0,1,1,1,1,2,1,1,1,1,0,0,1,5,0,1,1,1,0,0,1,1,0,1,1,2,0,0,1,0,1,1,2,0,0,1,2,2,2,1,1,0,2,1,0,1,0,0,1,2,2,0,1,1,1,0,1,1,1,0,2,1,1,2,3,1,0,3,2,2,3,2,1,1,0,3,1,1,1,0,1,2,3,2,2,1,0,2,2,0,0,1,0,0,0,0,2,0,2,0,0,2,2,3,1,0,0,1,1,3,2,1,0,1,0,1,1,0,0,1,1,0,1,0,1,1,0,0,0,2,0,1,4,2,2,1,2,2,1,1,3,2,3,0,1,2,1,2,1,2,1,3,0,2,1,2,0,3,0,1,0,1,0,1,0,0,0,1,0,0,0,1,2,1,1,2,0,0,0,1,2,1,0,1,1,0,1,1,1,0,2,0,2,4,2,2,1,0,0,0,1,1,0,1,0,0,1,0,1,0,0,5,4,4,0,5,2,1,1,0,1,0,2,0,1,3,0,0,0,1,1,0,1,2,2,0,1,1,0,0,2,0,1,1,2,2,2,0,1,3,0,3,1,1,1,0,0,1,0,2,0,1,0,1,1,2,0,1,2,1,1,1,2,0,1,1,1,1,0,0,1,3,0,0,0,1,2,2,0,1,0,0,0,0,0,3,2,1,2,2,0,1,1,1,2,0,3,0,1,0,0,2,1,1,0,0,2,1,3,0,0,0,0,0,0,0,2,0,1,0,1,1,1,2,0,2,0,0,3,1,0,1,1,2,1,0,2,1,2,0,1,3,0,0,3,2,2,0,1,1,1,0,3,1,1,1,0,2,1,1,0,0,0,0,2,1,2,1,1,0,1,2,0,0,0,1,0,1,2,5,0,0,1,0,0,3,2,3,0,1,2,2,1,2,0,0,1,0,1,1,1,2,1,0,0,1,1,1,2,0,2,1,0,1,0,1,0,3,1,0,1,0,2,1,1,0,0,1,2,0,1,1,0,0,0,1,2,3,1,1,2,1,1,0,1,0,0,0,0,0,0,2,0,1,0,0,1,0,0,1,1,1,1,1,0,2,0,2,1,1,1,2,1,2,0,1,0,1,0,0,0,1,0,1,4,0,0,0,0,0,1,3,0,1,1,0,1,0,1,2,0,0,0,4,4,1,0,0,1,1,0,0,0,0,1,1,1,0,1,0,2,1,1,0,3,0,3,0,0,0,1,0,0,1,0,0,0,0,3,0,3,1,0,0,2,2,1,3,1,2,1,0,0,1,0,1,0,1,0,0,0,0,2,0,0,0,1,1,2,1,3,1,0,0,0,0,1,1,2,1,1,1,1,0,2,1,1,1,0,3,1,0,1,3,2,0,2,0,0,2,0,4,1,0,1,2,2,1,0,2,0,1,2,1,0,0,0,4,3,1,1,0,0,2,1,2,0,1,3,0,0,0,2,2,0,1,0,1,2,0,0,1,3,1,1,1,1,2,2,3,0,0,0,2,1,2,1,0,2,3,0,1,0,2,0,1,3,2,1,0,0,0,0,2,0,2,1,1,0,2,1,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,2,0,0,2,1,1,0,0,1,0,0,2,1,1,1,1,0,2,0,0,0,3,2,1,0,0,1,0,2,1,2,2,3,0,1,2,0,1,0,0,0,1,0,1,1,0,2,1,0,1,0,0,2,0,1,1,0,1,0,2,0,0,1,3,3,1,0,0,2,2,2,1,0,1,3,1,1,2,0,1,1,1,1,1,2,1,0,1,2,0,0,1,0,0,0,2,0,1,2,1,1,1,1,1,3,0,2,1,1,1,2,0,0,2,2,0,1,0,1,0,2,1,2,0,1,3,0,2,2,0,0,0,0,0,1,4,1,1,1,2,2,4,0,1,0,3,1,2,1,1,0,2,0,0,0,1,2,2,1,0,0,1,2,0,0,0,1,3,1,1,0,5,1,1,1,1,0,0,2,1,0,0,3,0,3,1,2,0,2,1,1,0,0,2,1,2,1,1,0,0,0,0,2,0,1,0,0,3,4,2,0,0,3,1,1,0,2,1,0,1,0,0,0,0,2,0,0,1,0,1,0,0,1,0,1,2,1,1,2,0,2,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,2,0,1,1,0,1,3,1,0,1,2,1,1,1,0,1,0,1,5,0,0,0,3,0,0,1,0,0,2,0,2,2,1,1,0,0,0,0,0,3,0,1,1,1,0,1,3,0,0,1,0,1,0,2,2,3,0,1,0,1,0,0,1,0,1,1,1,0,1,1,4,2,2,2,0,0,1,0,1,0,1,1,1,0,3,2,3,0,1,3,1,1,1,0,1,3,2,3,1,2,0,0,1,2,1,1,1,0,0,1,1,1,0,0,0,1,0,3,1,0,0,1,1,0,0,2,0,1,4,2,0,3,0,1,1,1,0,2,0,0,1,1,1,3,1,0,1,0,2,0,0,1,1,1,4,1,1,0,1,3,0,1,1,1,1,1,1,1,0,0,3,2,1,0,1,2,1,0,0,2,2,1,2,0,1,1,2,2,0,3,0,2,0,1,2,3,1,1,2,2,1,1,0,2,1,2,1,2,0,2,2,1,1,0,1,1,1,1,2,0,2,1,0,0,1,0,1,1,1,1,1,1,2,2,0,2,2,0,2,2,0,1,2,4,0,0,2,1,1,1,1,1,1,2,1,2,2,0,4,1,1,3,1,1,2,1,2,0,2,2,0,0,2,0,2,0,4,3,0,1,1,0,1,0,1,5,2,0,2,1,3,0,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,1,0,1,0,1,2,2,0,0,0,1,0,0,1,0,0,2,0,1,0,3,1,3,2,0,2,0,1,0,0,0,2,1,3,2,0,0,1,1,0,2,1,1,0,2,0,1,0,2,1,1,0,1,0,2,1,1,3,0,2,0,2,0,2,1,1,0,1,2,1,0,1,2,1,1,2,0,0,0,0,1,0,0,0,0,2,0,1,1,1,2,0,1,3,1,1,0,1,1,0,1,3,3,3,0,2,1,1,1,0,0,0,0,1,0,0,1,0,1,0,4,2,1,1,0,3,1,1,0,4,1,0,3,2,1,1,4,0,1,2,1,0,1,0,1,2,3,2,1,1,0,1,0,0,0,1,2,1,2,0,1,2,2,2,0,1,1,1,0,1,0,1,0,4,4,4,0,3,1,1,3,2,0,0,0,1,2,2,1,1,1,1,0,1,1,1,0,0,0,2,0,0,3,1,1,2,1,1,1,0,0,1,0,2,0,1,0,0,4,1,1,1,0,2,1,1,0,1,0,0,1,2,2,2,0,1,2,1,1,0,1,1,1,0,0,1,0,1,1,0,0,1,4,1,1,3,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,2,1,2,1,0,2,0,0,0,1,0,1,1,1,1,1,0,1,0,1,2,0,3,1,1,0,0,1,1,0,1,3,1,1,1,0,1,3,1,2,0,0,2,0,1,2,1,0,2,0,2,3,0,1,1,2,2,0,1,0,0,2,0,2,1,2,0,2,2,3,0,0,0,0,1,1,1,0,2,1,1,0,1,0,2,0,2,0,0,3,2,0,0,2,0,1,1,1,3,3,0,0,0,1,0,1,2,1,0,0,1,2,1,2,1,0,2,1,4,1,1,0,3,2,1,0,3,1,0,2,2,0,0,0,0,4,2,2,1,1,1,0,1,3,1,2,1,2,2,0,1,0,1,0,2,0,0,2,2,1,0,1,1,1,1,1,0,1,2,0,1,3,0,0,0,2,2,1,0,0,1,0,3,3,1,0,0,1,0,0,0,1,6,2,0,0,1,1,1,1,0,2,0,1,2,1,2,1,1,0,1,1,0,1,1,0,0,2,0,0,1,2,1,3,1,2,0,2,0,1,2,2,2,0,2,1,3,0,1,2,0,1,0,1,1,1,2,3,0,0,0,1,2,0,1,3,0,2,0,0,1,0,1,1,1,1,1,1,2,1,0,0,0,0,0,0,0,2,1,3,0,2,1,0,0,1,1,1,0,2,2,1,0,1,1,1,3,2,1,1,1,0,4,1,0,1,0,0,0,1,1,3,3,0,0,0,2,1,3,1,0,1,1,1,1,1,0,5,0,2,1,0,1,2,2,2,4,0,0,0,1,2,1,0,1,2,1,1,1,1,1,1,1,1,2,0,0,1,3,0,1,0,0,0,1,2,0,0,0,0,2,1,1,1,2,1,1,1,1,1,0,0,1,0,1,0,0,1,3,1,1,1,1,0,0,3,0,0,2,2,0,0,1,1,1,2,2,1]},{"counters":[1,2,1,3,2,1,2,0,0,1,3,1,1,0,0,1,0,1,1,0,1,2,1,1,0,1,1,2,1,1,1,1,0,2,1,0,1,0,1,0,1,1,1,0,0,1,1,1,2,1,1,1,0,0,1,3,0,3,1,2,0,1,2,0,2,2,3,4,2,0,3,2,2,1,1,1,0,1,2,1,0,0,1,2,1,0,0,1,2,0,1,0,1,0,1,0,0,0,1,0,2,1,0,1,1,1,1,3,1,1,0,0,1,1,2,3,0,2,2,0,0,1,1,1,2,0,1,1,1,1,0,2,2,0,1,1,0,1,1,2,2,1,2,1,2,0,0,0,0,0,0,0,0,1,1,1,2,1,1,0,1,2,3,3,2,2,1,1,2,0,0,1,1,0,2,0,1,3,3,3,0,0,1,0,0,1,3,1,3,0,0,2,1,1,0,1,0,0,1,0,0,0,1,3,0,1,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,2,2,1,1,0,0,0,0,1,0,2,1,1,0,2,3,2,1,1,1,1,2,2,2,2,2,0,5,2,0,0,0,1,2,2,1,0,0,1,1,0,0,0,0,1,0,0,3,2,1,0,1,0,1,0,0,1,1,0,4,0,1,0,2,3,1,1,2,0,2,2,0,1,1,1,3,3,0,1,0,1,0,0,0,1,0,1,2,1,0,0,1,1,0,0,1,1,0,1,1,1,0,1,1,1,3,0,2,1,2,4,3,4,1,1,1,3,1,1,1,2,1,2,1,0,2,0,1,3,0,0,4,1,2,0,0,2,1,0,0,1,1,0,2,1,0,1,2,1,1,0,0,2,1,0,0,2,1,0,0,0,0,3,0,0,2,1,1,0,0,1,0,2,2,1,0,1,0,1,1,1,1,0,0,2,1,2,1,0,1,2,1,0,0,1,1,2,1,0,2,0,1,1,1,0,0,0,1,0,0,0,0,0,0,2,2,0,1,2,1,1,0,0,0,0,1,0,1,0,1,1,2,3,1,2,1,0,0,0,1,0,0,3,1,2,1,0,2,4,0,2,0,1,1,0,2,2,0,1,2,1,0,1,0,1,1,0,0,2,1,0,0,2,2,0,0,3,2,0,1,3,1,0,1,0,1,3,0,1,0,0,0,1,1,3,1,0,0,1,1,0,1,3,2,0,2,1,0,0,0,1,2,1,0,1,0,1,2,0,2,0,1,2,2,1,0,1,1,2,1,0,2,2,0,1,2,3,1,0,3,0,3,1,1,1,2,0,2,1,0,1,2,0,2,1,0,1,0,0,1,0,1,0,0,1,0,2,0,0,0,0,2,0,1,0,0,4,0,0,1,0,4,1,0,2,1,1,0,1,0,1,1,0,1,1,1,0,1,0,1,3,1,2,1,2,0,2,0,1,3,1,3,0,1,1,0,1,1,2,1,2,1,3,1,1,2,1,0,0,0,0,3,3,2,2,2,2,2,1,3,1,1,0,1,1,3,1,2,1,1,0,1,3,0,1,0,2,2,2,1,0,0,2,0,0,0,0,1,0,1,1,0,1,0,2,0,3,1,0,1,0,0,3,2,1,1,0,0,1,4,1,1,1,3,0,2,0,0,0,2,1,1,2,2,1,1,1,0,0,0,1,5,0,2,2,1,2,1,2,0,0,2,1,2,0,0,0,1,0,1,1,2,0,1,2,0,0,0,0,0,1,0,2,1,0,0,2,0,1,2,1,2,0,0,3,2,1,0,1,0,1,0,1,2,0,0,0,1,0,1,1,1,1,0,0,0,0,2,0,1,1,1,0,1,2,0,1,3,2,0,1,0,4,1,0,0,4,0,1,1,1,2,1,1,1,2,1,0,1,0,4,0,0,0,0,0,1,1,0,1,3,2,1,2,0,1,1,1,1,1,1,0,2,0,3,1,1,1,0,2,2,0,2,1,1,1,3,1,1,2,2,0,1,2,1,0,1,0,0,0,1,2,0,0,1,0,2,0,0,0,1,1,2,2,0,0,1,0,0,2,2,1,3,0,0,0,2,0,0,1,1,1,5,2,0,0,1,0,0,1,1,2,0,0,0,1,0,1,0,1,0,1,2,2,2,0,0,0,1,0,1,1,0,1,2,1,2,1,0,1,1,1,2,3,1,0,1,0,1,2,2,0,1,1,3,3,1,4,0,1,1,1,2,2,0,2,0,1,0,1,0,0,1,1,1,0,0,1,3,0,1,0,1,0,3,1,0,0,0,0,2,2,1,1,1,2,2,1,0,2,0,3,2,1,0,1,1,1,2,2,1,0,1,0,0,1,0,2,1,0,1,1,1,1,0,2,1,2,1,1,1,1,1,1,1,0,1,1,1,2,2,0,0,0,2,1,2,1,1,3,2,0,0,1,2,0,0,2,1,0,2,1,0,1,0,0,2,3,1,2,2,1,0,0,1,0,0,1,1,0,0,2,2,1,1,0,1,1,0,0,0,0,0,0,1,2,0,1,1,2,1,0,1,1,1,3,2,1,0,1,0,1,0,0,0,0,0,0,2,2,1,0,2,1,1,0,0,0,1,1,1,0,1,0,0,0,1,0,2,0,1,1,3,0,4,0,1,0,1,0,2,1,0,0,0,0,2,1,1,1,3,2,1,2,1,0,0,3,0,4,5,2,1,3,0,1,3,0,0,2,0,0,0,1,0,1,3,1,1,0,2,1,1,3,1,2,0,1,1,0,0,2,2,2,0,1,1,1,0,0,1,1,1,3,1,2,2,0,0,2,3,0,1,0,3,1,0,1,2,2,3,2,0,2,2,0,4,0,0,1,1,0,2,2,1,2,1,3,3,1,1,2,2,0,1,1,1,1,0,1,2,0,0,0,0,1,2,0,1,1,3,1,0,0,0,2,0,2,3,1,1,0,1,0,1,0,2,0,2,1,3,2,0,1,2,2,0,0,3,4,1,2,1,0,1,3,0,0,2,2,0,2,1,2,0,1,3,2,0,1,2,0,0,0,2,1,1,0,2,3,0,0,0,1,0,0,1,2,0,1,1,0,1,1,0,1,1,1,3,1,0,2,1,1,0,0,0,1,0,0,0,0,0,2,1,1,1,0,0,0,3,1,0,1,0,2,0,1,1,1,2,1,1,2,1,1,2,0,2,1,1,0,3,1,0,1,0,1,0,0,1,0,0,1,1,2,1,0,0,1,1,0,0,0,2,1,0,0,1,0,0,2,0,0,1,3,0,1,1,1,0,4,1,0,0,2,1,1,0,1,1,2,2,3,1,0,0,0,1,0,1,0,0,2,0,1,2,0,0,0,1,1,2,0,1,1,3,1,0,0,1,0,2,0,3,0,1,0,1,1,0,0,1,1,2,0,0,0,2,1,1,0,2,2,0,0,0,0,1,0,1,1,1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,2,2,3,2,0,0,1,1,1,0,0,0,0,1,1,0,0,0,1,3,1,1,0,1,2,1,0,0,0,1,1,0,1,2,3,3,1,3,1,0,1,0,0,1,0,3,3,0,0,2,1,1,0,2,2,1,2,3,1,2,1,2,1,0,0,0,2,1,1,3,0,0,2,0,2,3,0,2,0,4,1,1,1,0,1,2,2,0,1,1,2,0,3,1,2,2,2,1,1,1,2,0,3,0,1,0,0,2,1,0,1,1,1,0,2,0,3,1,2,1,3,3,0,2,2,0,2,1,1,0,1,1,2,0,1,1,0,1,0,0,0,1,2,1,0,1,1,0,2,3,0,3,0,2,2,3,2,1,1,1,0,2,0,0,0,0,2,0,2,1,0,0,1,1,0,1,1,0,1,1,0,1,4,0,1,0,3,0,1,0,2,0,1,2,0,2,2,1,3,1,0,0,3,1,0,1,1,0,2,1,0,0,1,2,2,0,0,1,2,1,0,3,2,4,0,1,0,2,0,4,1,2,0,0,2,1,1,1,0,4,2,0,0,0,0,1,0,1,0,3,1,2,0,0,3,1,3,0,0,1,0,3,1,3,0,2,1,0,1,2,0,1,2,0,0,1,2,0,1,0,1,1,0,4,1,0,0,2,0,0,0,0,0,1,0,1,2,1,0,0,1,1,0,2,0,1,0,0,0,0,2,2,1,1,2,2,1,1,1,0,0,1,2,0,0,0,2,1,3,1,1,0,2,1,1,0,2,0,1,3,0,2,0,1,0,0,0,2,3,1,2,2,1,0,1,1,0,3,1,0,2,1,2,0,1,1,1,1,0,0,0,0,1,4,1,1,3,0,1,0,0,2,2,1,0,0,0,1,0,0,1,1,2,0,0,2,1,2,2,0,0,1,1,1,1,1,1,1,0,2,2,1,0,1,2,1,2,1,0,0,1,1,0,2,0,2,1,2,0,2,1,1,1,0,1,3,2,0,0,0,1,1,0,2,3,0,0,2,1,1,2,0,1,1,0,0,2,0,0,1,1,0,0,0,1,1,3,0,0,1,0,2,0,1,0,1,1,3,1,1,2,0,1,1,1,1,0,4,1,0,0,0,1,0,1,1,1,2,1,0,1,2,0,1,0,1,2,1,0,0,1,1,1,3,2,1,1,1,1,0]},{"counters":[2,0,0,1,1,1,1,0,1,1,2,0,2,1,3,1,4,4,3,2,2,0,2,2,1,2,0,1,0,1,1,0,0,1,2,0,0,2,3,1,2,1,0,0,0,0,2,3,1,0,0,0,0,0,0,0,1,2,1,2,2,1,1,1,0,0,1,3,0,2,3,1,3,1,1,0,0,1,3,1,2,0,1,0,1,2,1,1,0,2,1,0,1,1,1,1,3,1,0,0,0,2,0,1,1,3,2,1,2,0,2,0,0,2,2,2,0,0,1,2,2,0,1,0,1,0,1,2,3,1,0,4,1,0,1,0,1,1,4,0,0,1,0,4,3,1,2,0,0,1,1,1,1,0,0,2,1,0,0,0,2,1,1,1,0,2,0,2,1,2,0,1,2,1,1,3,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,2,0,1,1,1,1,1,1,2,2,1,1,1,0,0,0,0,1,1,1,2,0,2,0,0,3,0,1,2,1,0,0,1,0,0,0,0,0,1,2,0,0,1,1,1,0,0,1,1,2,1,1,0,0,0,1,0,1,2,1,2,1,1,0,2,0,0,1,0,1,2,0,1,0,0,2,1,1,1,2,2,1,1,2,2,1,1,0,0,0,0,0,1,0,1,1,2,1,0,0,2,1,2,2,2,1,1,2,0,0,0,0,1,3,1,0,2,1,0,0,1,1,1,0,1,0,1,2,0,1,2,0,1,1,1,2,2,1,6,1,1,1,0,0,2,2,0,0,2,1,1,1,1,0,0,0,3,1,3,0,1,1,0,0,1,0,1,1,1,1,1,1,1,0,1,2,0,0,2,1,0,3,0,1,1,5,2,3,0,3,3,3,0,1,2,4,1,0,1,0,2,0,2,1,1,1,1,3,0,2,1,1,2,1,1,2,1,0,0,0,0,0,0,2,0,1,0,2,2,1,4,0,2,1,2,1,1,1,0,0,1,0,0,1,1,0,1,0,0,2,3,0,0,0,2,1,2,0,1,1,1,1,2,1,0,0,1,1,0,1,0,0,2,0,0,1,0,1,2,1,0,0,1,0,2,1,0,0,4,1,2,0,1,0,0,2,1,0,2,1,0,1,1,2,2,0,1,0,0,2,4,0,1,2,0,2,1,0,0,3,3,2,2,0,1,0,2,0,0,2,0,0,1,0,1,1,0,1,2,1,2,0,0,1,1,0,0,2,2,2,2,0,1,0,0,2,3,0,1,1,1,1,0,3,0,2,0,2,0,0,1,1,3,0,0,1,2,1,1,0,3,1,1,2,2,0,2,3,1,0,0,3,1,0,1,0,2,0,1,0,3,1,0,1,2,2,1,1,0,0,4,1,0,2,2,2,2,2,1,2,1,0,1,1,1,0,1,0,1,1,0,0,1,0,2,1,1,0,1,3,0,0,1,1,1,2,0,0,0,0,1,0,2,0,1,2,1,1,2,2,1,1,1,0,0,1,0,1,2,0,2,4,1,1,0,1,0,0,1,1,1,0,5,1,1,1,1,0,0,7,1,0,1,1,3,1,0,0,3,2,1,0,0,0,2,2,3,1,2,2,2,2,2,2,2,0,3,0,1,1,2,1,3,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,0,1,1,1,1,2,1,1,0,0,0,2,1,0,1,2,1,1,1,1,3,0,1,2,0,0,1,1,0,1,1,1,2,1,1,1,2,1,3,0,0,0,1,1,1,0,1,1,3,0,0,0,0,0,1,1,0,3,0,1,0,0,2,1,0,1,3,1,2,0,0,0,0,0,1,3,1,1,0,1,2,3,0,0,1,0,1,1,0,0,0,0,0,1,2,1,1,0,0,0,3,3,1,1,0,2,0,1,1,0,1,0,1,3,0,2,1,3,3,1,1,0,1,0,0,0,2,0,1,2,0,0,0,0,1,1,1,0,2,1,2,0,1,0,0,1,1,0,0,2,0,0,1,2,1,1,2,0,1,0,0,0,1,1,1,0,1,1,0,2,0,2,1,1,0,1,0,1,2,1,1,1,0,2,1,0,0,1,1,2,1,2,0,0,0,1,1,0,0,2,1,3,0,0,1,1,0,1,1,0,0,2,3,0,0,1,1,0,2,3,1,0,0,0,1,1,1,2,0,1,3,0,0,3,1,2,2,0,0,2,0,5,1,1,0,1,1,0,0,0,0,1,3,1,1,1,2,3,3,2,3,2,0,2,0,1,0,2,0,0,3,2,2,1,1,0,2,0,0,0,0,0,1,1,1,0,2,2,0,1,2,3,0,3,0,1,1,0,0,0,2,0,1,0,2,1,0,2,2,3,1,2,3,0,1,0,1,0,2,0,0,0,0,0,2,0,1,0,0,4,1,0,1,1,1,3,0,2,2,0,0,3,0,1,0,3,0,2,2,2,0,2,3,1,0,0,1,0,1,2,0,0,1,1,3,0,0,3,1,1,1,1,2,2,1,3,0,2,1,0,2,2,0,0,1,0,1,1,2,1,1,1,2,1,1,2,1,0,1,2,0,1,2,0,2,0,1,0,0,2,1,1,0,0,1,1,0,2,0,0,2,3,2,0,4,2,1,1,0,1,4,0,1,0,1,1,0,2,1,2,0,2,1,1,1,0,0,0,2,4,2,2,2,1,2,0,1,1,0,1,2,4,0,1,2,0,2,3,1,0,1,0,2,1,0,1,0,1,3,1,1,1,1,1,0,1,0,1,0,0,1,2,0,1,1,4,3,0,0,2,2,0,2,1,0,2,1,0,2,0,0,0,2,1,4,0,2,0,1,1,1,2,3,1,0,1,1,1,0,0,1,1,2,0,0,0,0,2,1,1,3,2,0,0,0,1,0,1,1,1,1,1,1,0,2,0,0,0,1,0,2,1,2,1,1,1,1,2,0,1,2,0,1,0,7,0,1,0,0,1,0,1,1,1,1,1,1,0,2,1,0,1,1,2,0,1,1,3,2,0,0,0,0,1,1,2,1,1,0,1,1,0,3,0,4,1,0,1,1,1,0,2,0,1,1,1,0,2,0,1,0,0,1,1,0,1,0,0,1,0,2,1,1,1,2,2,0,2,3,1,2,1,1,0,0,3,2,0,1,0,0,2,0,1,1,2,0,0,2,2,0,1,0,2,0,0,0,1,3,0,2,1,1,1,0,1,2,0,2,0,2,0,2,0,0,2,2,0,0,0,0,0,2,0,1,0,2,0,0,2,1,0,0,2,0,3,0,1,0,2,1,2,0,1,0,1,2,3,5,2,1,3,0,3,0,3,1,0,0,5,0,0,0,1,0,2,0,0,0,1,0,2,0,0,0,0,2,0,0,2,0,1,0,0,0,1,1,1,0,1,1,0,0,2,1,0,0,0,1,1,3,1,1,1,1,2,1,0,1,0,0,1,0,0,2,2,0,1,2,1,1,1,0,0,0,1,0,1,2,2,0,0,1,0,0,2,1,0,2,4,2,1,1,3,0,0,1,1,1,0,1,0,1,0,2,0,2,0,0,0,3,2,2,1,1,2,0,0,3,1,1,1,3,1,1,0,0,0,1,1,1,0,1,1,2,1,2,1,0,3,0,1,1,1,2,1,1,1,0,0,2,1,0,0,0,1,0,1,0,2,0,0,0,1,0,1,2,0,1,1,2,1,2,1,0,1,1,2,1,1,0,0,0,2,2,0,1,0,0,1,0,0,2,1,0,1,4,0,0,3,0,0,0,2,1,1,0,0,1,2,0,0,0,2,1,2,0,1,0,1,0,2,2,3,0,1,0,0,1,0,0,0,0,0,0,0,3,0,4,1,1,1,2,0,0,1,3,0,0,1,1,1,1,0,2,2,1,0,1,0,2,0,0,1,1,3,1,1,1,2,0,0,0,1,3,1,0,4,0,1,1,2,0,0,0,0,1,2,2,0,1,2,2,2,4,0,0,3,1,0,2,3,1,4,2,3,1,0,2,0,2,0,0,1,0,0,2,0,0,3,0,0,1,0,1,1,0,0,0,1,0,0,0,1,0,1,0,1,1,1,0,1,1,2,1,0,0,1,1,1,0,1,0,2,0,1,0,0,1,2,1,0,2,2,1,1,2,1,2,1,1,1,1,0,0,1,2,2,0,0,4,1,1,2,0,1,0,2,0,3,0,0,2,0,0,1,0,0,1,2,0,0,1,2,4,1,0,1,2,0,0,1,0,0,1,1,2,0,2,1,1,0,3,1,0,0,0,0,1,2,1,1,1,1,2,0,0,1,2,1,1,3,1,2,1,2,3,2,1,3,0,1,0,1,1,1,0,2,0,1,3,0,0,1,2,0,0,1,0,0,1,1,0,1,3,3,1,0,2,0,1,2,1,0,0,0,0,0,2,1,0,1,0,2,0,0,1,0,2,0,1,1,1,0,1,2,1,0,3,2,0,0,1,2,2,1,1,1,1,1,1,0,1,0,1,0,0,0,1,1,0,2,0,3,2,2,3,0,1,4,0,0,0,1,3,2,2,1,3,0,3,1,0,3,0,0,1,0,1,2,5,1,0,1,0,1,0,2,0,2,0,0,1,0,1,0,0,1,1,3,1,0,0,3,1,1,0]},{"counters":[2,1,1,0,1,2,1,0,1,1,0,1,0,0,1,2,1,1,2,1,0,0,0,1,1,3,1,0,2,0,3,0,1,0,2,0,3,3,1,0,0,1,1,0,1,3,1,1,0,3,2,3,0,1,1,1,0,3,0,0,1,2,1,0,1,1,3,1,1,2,1,1,0,2,0,1,1,0,1,2,0,2,1,2,1,0,1,0,0,0,0,0,0,0,0,1,1,5,1,1,1,1,0,0,0,0,0,0,0,0,2,0,2,0,1,1,1,2,3,1,1,0,1,1,0,2,1,1,2,1,1,0,0,2,0,1,1,0,4,1,1,1,1,3,0,1,0,2,2,1,2,1,1,0,1,1,0,1,2,0,1,0,0,4,2,1,1,0,0,1,1,0,0,0,0,1,4,1,2,0,1,2,0,1,1,0,3,0,1,0,1,2,1,1,1,3,0,3,0,1,2,1,2,1,1,0,1,0,2,1,0,2,1,1,1,0,0,1,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,2,0,0,0,0,1,1,0,1,0,1,2,2,1,1,1,0,0,0,0,0,0,0,1,2,0,0,1,0,2,0,2,0,1,2,1,0,0,0,1,1,1,1,1,0,3,0,0,0,0,1,2,1,1,0,0,1,0,1,1,1,2,0,1,0,1,0,0,0,1,2,0,3,1,1,3,1,3,1,2,1,0,1,1,0,2,1,1,0,0,0,1,0,1,0,0,1,2,0,0,3,0,0,4,1,0,1,0,1,0,2,1,0,3,2,1,0,1,0,1,2,4,3,1,0,2,2,0,1,3,1,0,1,1,2,1,2,1,1,1,0,0,1,0,0,1,1,1,2,2,0,1,0,0,0,4,0,2,1,1,2,1,1,0,1,3,3,1,1,3,0,2,2,3,1,0,0,1,1,0,1,1,0,1,2,2,0,0,4,1,0,0,0,2,2,1,3,1,0,2,0,2,1,2,1,2,0,0,2,0,1,2,1,2,2,0,2,0,0,0,2,0,1,1,2,0,0,2,0,3,1,2,2,0,1,1,1,1,1,2,0,2,3,1,1,0,1,2,3,2,1,0,0,1,0,0,3,0,2,0,2,0,0,1,0,1,0,0,1,0,0,2,1,2,1,2,1,0,1,0,1,1,1,0,1,2,0,0,1,0,0,2,2,0,0,0,0,1,1,2,2,0,1,0,0,0,0,0,4,1,0,2,1,1,0,1,0,1,1,1,2,3,1,1,3,2,3,4,1,0,1,1,3,1,1,1,0,1,2,2,0,0,0,0,0,1,0,1,1,2,1,3,1,2,2,0,1,1,1,2,0,2,2,1,1,0,2,1,1,0,2,0,2,3,0,0,0,0,1,0,1,1,0,4,0,0,1,0,3,0,0,1,1,1,2,1,0,0,3,1,1,3,4,1,1,0,0,0,0,0,2,0,2,2,2,0,0,2,0,1,1,2,1,1,1,5,0,1,1,1,0,1,1,0,1,2,0,0,1,1,3,0,1,0,2,0,2,1,1,0,0,0,1,3,1,1,1,1,1,1,0,1,0,1,1,0,0,1,0,1,2,1,1,1,1,0,0,0,1,0,0,2,0,0,0,0,1,1,1,2,0,1,1,1,2,1,0,0,1,2,1,1,2,1,1,0,1,2,1,0,0,0,1,1,2,1,1,1,2,0,0,1,0,1,0,0,0,1,1,2,0,0,2,1,0,1,1,0,0,2,1,0,0,3,0,0,0,2,1,1,1,2,0,1,0,1,2,0,0,2,0,2,1,1,1,2,2,3,1,0,1,2,1,2,2,1,0,2,0,0,0,2,2,0,1,1,1,2,0,1,2,1,0,0,1,1,0,0,0,0,0,1,0,0,0,1,1,4,0,2,0,2,0,5,3,1,1,2,1,2,0,0,0,3,1,4,2,0,1,1,1,0,0,1,2,0,3,4,3,4,0,3,2,2,1,2,3,1,0,0,1,1,1,1,0,1,3,0,0,2,1,1,0,2,0,4,2,1,1,2,0,0,0,0,0,1,0,1,0,0,0,1,0,1,2,4,1,1,1,0,2,1,1,0,0,0,1,2,0,2,2,1,1,1,2,1,0,1,0,1,0,1,1,3,1,0,3,2,0,1,1,0,2,2,4,0,1,1,1,2,1,1,0,0,1,0,0,0,2,2,1,1,2,2,1,1,2,0,2,3,0,2,1,1,1,0,0,1,1,2,1,1,1,0,2,0,1,0,0,2,1,0,1,0,2,1,1,3,0,2,0,3,0,3,0,2,0,1,0,1,1,2,1,2,1,0,0,0,0,0,0,0,1,1,2,1,1,1,0,0,1,4,0,3,1,2,0,0,0,1,1,0,0,2,1,0,1,1,0,0,1,2,0,0,0,0,0,0,0,0,2,0,2,2,2,0,2,0,1,1,1,0,0,1,0,0,1,0,1,2,2,0,1,1,1,1,0,2,2,0,1,1,1,0,0,2,0,1,2,2,0,0,2,1,0,2,2,0,2,1,2,1,3,2,0,1,1,0,3,0,1,1,1,1,0,2,3,3,1,2,1,3,2,1,0,1,0,2,1,0,0,1,1,0,1,2,2,0,0,0,1,1,1,1,1,3,0,1,1,0,2,2,0,2,2,1,0,0,1,2,3,1,4,2,0,2,3,2,0,1,3,2,2,1,1,2,2,1,1,3,2,1,2,0,0,0,2,0,0,1,0,3,2,1,1,1,1,2,1,1,0,0,1,1,2,1,2,0,1,2,0,3,0,1,1,1,0,1,1,1,1,0,1,0,1,1,1,1,2,0,1,0,4,0,0,1,2,0,0,4,2,0,0,1,0,0,0,3,1,0,1,1,0,0,0,1,1,0,1,1,0,0,2,1,1,2,0,1,0,2,0,0,2,0,1,2,2,1,1,1,0,2,0,1,1,1,0,1,1,2,0,2,2,0,0,0,2,2,1,2,0,2,2,0,0,1,0,0,2,3,2,1,3,2,0,2,0,0,2,1,2,1,1,0,1,1,1,2,0,0,0,5,3,2,0,0,2,1,0,1,0,1,1,0,0,0,1,2,1,0,0,3,1,0,3,0,1,1,1,1,1,2,0,0,0,1,2,2,0,0,1,2,0,1,1,1,1,0,0,1,1,1,1,2,2,1,0,0,0,1,2,0,0,1,0,0,0,2,0,1,0,1,1,3,1,2,1,2,0,0,1,1,2,1,1,3,2,0,0,4,1,1,1,0,1,0,0,1,1,1,0,0,1,1,1,1,1,1,2,0,1,1,1,1,1,1,1,0,1,1,1,3,2,2,1,1,1,1,2,4,2,2,0,1,0,1,2,1,0,3,0,1,3,0,0,1,1,0,1,1,2,0,2,0,1,0,3,0,1,1,1,1,0,0,1,3,1,2,1,2,1,0,1,2,1,0,1,0,3,3,2,1,2,1,1,0,1,1,1,0,1,0,0,0,0,3,1,0,0,0,0,1,0,0,3,2,1,0,1,2,2,1,1,0,0,0,1,1,0,2,0,1,0,0,2,2,2,0,1,0,2,1,4,0,2,0,1,1,0,0,3,0,3,0,0,2,1,1,1,1,2,0,0,1,1,1,0,1,0,1,0,0,0,1,2,1,1,1,2,0,0,1,0,1,0,1,3,2,0,0,0,1,2,1,0,2,0,4,1,2,0,1,1,0,0,0,0,0,2,1,0,1,1,0,0,0,2,2,2,1,1,1,0,1,1,0,1,0,2,0,0,1,2,0,1,0,0,0,4,1,0,1,0,1,1,1,0,0,1,0,1,0,1,1,1,1,4,0,2,2,2,2,0,0,1,0,2,5,1,0,3,2,0,1,0,3,0,4,0,1,1,1,0,1,1,0,1,0,1,4,4,1,1,1,0,2,2,0,1,0,0,1,1,1,1,1,2,2,1,0,1,0,0,1,1,0,1,0,1,1,0,1,2,2,0,0,0,1,0,0,0,0,0,1,0,1,2,0,0,0,0,0,1,1,0,2,2,1,0,1,0,1,0,1,1,0,3,1,1,1,2,1,1,0,0,1,0,1,1,0,1,2,2,0,0,3,1,1,1,0,1,0,1,1,0,0,1,0,1,2,0,1,1,1,2,1,5,3,1,0,1,0,2,2,0,2,1,0,1,0,3,1,1,0,3,2,0,1,1,0,1,0,1,3,1,0,2,0,1,3,0,0,1,1,4,1,2,2,2,0,0,2,1,0,0,1,0,0,1,1,1,0,0,1,0,1,1,2,1,1,1,1,1,1,0,0,2,1,0,0,1,0,1,0,1,1,3,2,2,1,0,1,1,2,1,0,0,2,5,0,1,2,1,2,1,0,0,0,1,0,1,0,1,0,0,1,1,1,1,0,3,2,1,1,1,2,4,2,1,1,2,2,0,0,2,0,1,2,2,1,0,1,1,3,1,0,0,1,1,0,1,0,0,2,3,0,1,1,2,1,2,1,0,1,1,1,1,1,1,1,0,1,0,2,1,0,0,1,1,0,1,3,1,1,2,0,0,0,0,1,0,0,1,0,2,1,1,1,2,1,1,0,1,0,1,0,2,1,1,1,2,0,1,1]},{"counters":[1,1,1,0,1,1,2,1,0,1,0,1,1,0,1,1,1,3,1,0,1,0,1,2,2,1,1,1,0,0,0,0,1,1,1,1,2,2,0,1,1,0,1,0,1,0,1,2,2,1,0,1,2,1,3,1,0,1,1,1,0,2,2,0,1,2,1,0,1,1,0,2,0,0,0,2,0,0,0,0,1,1,0,1,0,0,3,2,1,2,1,0,0,1,0,2,0,0,0,0,1,1,0,2,0,2,0,0,3,0,1,0,2,1,0,2,1,2,1,2,1,1,2,1,1,1,0,1,3,0,0,0,1,2,0,3,1,3,1,1,0,0,0,2,0,1,0,0,4,0,0,0,1,1,1,0,2,2,1,1,1,0,0,0,0,2,3,1,1,1,3,0,1,0,1,1,1,1,1,2,0,2,1,0,1,3,1,0,0,1,1,1,3,2,2,3,1,1,1,2,1,1,0,0,1,1,1,0,2,0,2,1,0,0,1,2,1,1,2,1,0,0,0,1,2,0,1,0,3,1,3,0,1,2,1,0,1,0,0,1,0,0,1,1,0,0,0,2,0,0,4,5,1,1,0,0,1,4,0,1,1,0,3,2,0,1,2,1,0,0,1,2,1,1,1,1,1,0,3,0,2,1,0,1,0,4,0,0,0,2,0,2,0,1,0,2,0,1,0,1,0,0,1,0,2,1,0,2,3,1,0,0,0,3,1,0,2,0,0,1,3,2,1,1,1,2,1,1,0,1,4,0,0,0,3,1,1,0,1,1,0,2,0,2,1,2,0,1,2,4,3,2,3,0,0,0,0,1,1,1,0,1,0,1,1,2,2,0,1,0,3,1,2,0,0,0,0,0,1,0,1,2,0,2,1,2,1,1,2,1,2,1,0,1,0,0,2,0,2,0,3,2,0,1,2,2,1,1,2,2,0,1,1,1,1,0,0,0,3,1,2,0,0,3,0,0,0,1,1,1,0,0,1,2,1,2,1,0,1,0,1,1,3,3,1,2,2,1,0,0,0,0,1,2,1,1,2,2,0,2,1,0,1,1,1,1,3,0,0,1,0,2,1,0,1,0,0,0,2,2,4,0,1,0,1,2,1,2,2,2,3,0,0,1,1,0,2,0,0,3,0,1,2,1,1,1,2,0,2,1,3,1,0,0,2,1,0,1,1,3,1,4,1,0,1,1,3,1,0,0,0,0,1,1,0,1,0,0,2,1,1,1,0,0,0,0,2,0,1,1,3,0,0,2,2,1,0,1,0,1,1,2,2,1,1,2,2,0,0,0,3,0,1,4,1,1,2,1,1,1,0,2,0,0,0,3,0,0,1,0,0,1,0,0,1,2,0,1,1,2,0,0,0,2,0,1,1,0,3,0,4,1,0,1,1,1,3,0,0,0,1,0,2,0,2,0,0,1,1,3,2,1,0,0,2,0,0,2,1,0,2,2,0,0,1,0,1,0,1,1,0,0,0,2,1,1,1,1,0,0,0,0,1,4,0,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,1,1,2,2,1,2,0,1,1,2,3,1,3,0,0,1,3,0,1,0,1,2,2,0,2,0,0,0,0,0,1,0,0,2,1,1,3,1,3,1,0,1,2,2,3,1,1,1,2,1,0,1,1,1,0,2,1,1,0,4,2,1,0,1,0,0,0,2,0,1,1,4,0,2,1,3,1,1,2,0,1,0,1,3,1,1,1,1,2,0,2,0,1,3,1,0,2,3,2,0,0,1,1,1,1,0,1,0,0,1,0,0,0,1,1,2,1,2,1,0,2,1,3,3,0,1,0,1,1,0,1,1,0,1,0,1,0,1,4,1,0,0,1,1,1,2,1,2,0,2,2,0,1,0,1,0,2,2,0,0,0,0,2,1,2,3,1,2,1,0,2,3,1,0,1,0,1,2,0,2,1,1,0,0,1,0,3,1,2,3,5,0,0,1,3,1,0,3,2,0,3,0,1,0,0,1,0,1,1,1,1,3,0,1,2,3,0,0,0,0,0,1,0,1,2,0,2,1,1,2,2,1,2,0,0,1,1,0,0,0,0,0,1,3,1,2,0,0,0,0,1,1,0,0,0,1,0,2,2,2,1,3,1,1,2,1,0,0,1,0,4,1,1,0,1,1,1,1,1,1,0,3,3,1,0,1,1,1,1,2,0,0,1,0,1,1,0,3,1,3,0,1,1,3,0,0,2,0,2,1,1,1,0,1,1,1,1,1,2,0,2,0,1,2,2,3,0,2,0,0,0,1,0,0,0,0,0,1,2,2,1,0,0,0,1,2,1,1,0,1,1,0,1,0,1,1,0,0,0,1,1,1,2,1,1,1,1,1,0,3,5,0,0,0,0,2,2,0,1,1,0,1,0,1,0,2,1,2,0,2,0,0,2,1,2,1,0,2,1,1,2,1,1,3,2,0,0,1,0,1,1,1,0,0,1,0,0,3,1,1,0,2,2,2,2,1,2,2,1,2,4,1,1,0,2,0,1,3,2,0,1,2,1,3,0,1,1,2,1,1,0,0,1,3,1,0,1,0,1,0,0,1,0,0,2,0,0,1,0,1,0,1,2,0,0,0,0,1,1,0,1,2,0,1,1,0,1,0,2,2,3,0,0,1,1,3,1,0,0,0,1,0,0,1,0,1,1,2,3,1,0,2,1,0,1,0,1,4,0,1,0,1,0,0,0,1,0,0,0,2,0,1,3,3,0,0,3,0,0,3,0,2,0,1,2,0,0,0,0,2,0,0,1,0,1,1,4,1,0,0,2,1,0,0,1,1,0,1,2,1,1,3,1,1,1,2,0,0,1,0,0,2,2,1,1,0,1,0,1,0,2,1,1,1,2,0,0,0,0,1,1,0,1,0,1,0,1,1,1,0,0,1,1,1,2,0,1,1,0,1,1,1,1,0,1,1,1,0,1,1,3,0,1,0,3,1,1,1,0,2,2,0,3,2,2,0,1,1,0,2,1,0,1,1,0,0,1,1,1,1,1,1,1,0,1,1,0,0,0,1,0,2,0,1,1,1,0,0,2,0,1,0,2,0,3,0,1,2,0,0,0,2,1,1,2,1,2,0,0,2,1,1,3,1,0,0,0,1,0,2,0,3,2,1,0,0,0,1,1,2,1,1,1,2,1,1,2,1,1,0,0,3,1,0,1,2,1,1,2,0,1,3,0,1,0,0,0,1,0,1,1,0,1,0,1,1,0,1,1,3,2,1,2,0,0,2,1,3,1,0,1,1,0,1,1,0,0,2,1,1,0,2,2,2,0,0,2,2,1,0,1,2,1,2,1,2,1,2,2,0,1,1,0,2,2,0,0,1,1,1,2,1,0,0,1,1,0,2,1,0,1,1,0,0,1,0,0,0,3,1,2,0,1,2,3,1,1,4,0,0,1,1,0,1,0,1,1,2,0,1,0,0,0,0,1,3,2,0,0,2,0,1,0,1,0,1,4,0,1,0,0,1,0,3,0,2,0,1,2,1,0,1,1,1,0,0,0,1,2,0,0,0,2,0,0,2,3,0,1,0,1,1,1,1,0,0,2,2,0,1,5,2,3,4,0,0,2,3,2,2,2,3,1,1,0,2,0,4,0,1,1,1,0,1,1,1,1,1,0,1,0,0,1,2,0,2,2,0,2,2,2,3,1,4,1,2,1,1,0,1,2,0,1,1,2,0,1,1,1,1,3,0,1,0,1,1,2,2,2,2,2,3,0,0,2,0,0,1,1,0,3,1,0,1,0,0,3,1,0,4,0,2,2,2,1,1,0,1,0,0,0,0,1,1,2,1,3,1,2,2,1,1,0,0,0,0,0,1,1,0,3,1,0,0,1,4,1,3,1,2,0,2,2,0,0,1,1,0,4,0,2,3,1,0,4,2,3,1,1,1,1,1,1,0,3,1,2,2,1,0,0,0,1,0,0,3,2,1,1,1,1,1,1,0,0,2,1,0,0,0,2,2,2,1,2,1,0,3,2,0,0,1,0,0,0,0,1,2,3,1,0,0,4,2,4,1,0,1,1,1,0,1,0,0,0,5,1,0,0,0,0,1,1,0,0,1,2,2,1,0,2,0,2,1,1,0,2,1,2,0,0,1,2,0,0,1,2,0,0,2,2,2,1,1,2,0,1,1,1,0,2,2,0,1,0,0,2,1,1,0,1,0,1,1,0,1,1,1,0,1,2,0,2,0,1,0,1,0,0,0,1,1,1,1,0,1,0,1,2,0,1,1,2,0,0,0,1,3,1,0,0,3,1,1,0,3,0,2,2,2,3,4,1,1,1,0,1,0,2,0,0,1,3,1,2,1,0,1,1,3,0,0,0,0,2,0,0,0,0,3,0,0,2,1,1,0,0,2,2,1,0,0,1,1,0,1,0,1,1,2,0,2,0,0,1,2,1,2,0,1,0,1,2,0,2,0,2,0,2,0,1,0,0,1,0,1,0,0,1,0,1,0,1,1,0,0,0,1,0,2,0,1,0,3,2,0,0,2,2,1,1,0,1,2,0,1,1,1,0,1,2,0,1,1,0,3,0,1,2,0,1,3,0,2,2,1,0,1,0,2,1,1,0,1]}]},"null_count":0,"last_update_version":397952045711884288},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDAyMjg4Njg=","upper_bound":"LTIxMjI2MDg1Mzg=","repeats":1},{"count":16,"lower_bound":"LTIxMjIxNTI1OTA=","upper_bound":"LTIxMTIxOTk0OTQ=","repeats":1},{"count":24,"lower_bound":"LTIxMDk5OTE3NTk=","upper_bound":"LTIwOTI2MTcxNzQ=","repeats":1},{"count":32,"lower_bound":"LTIwOTE1MjY5MTk=","upper_bound":"LTIwNjg5MzI0NDM=","repeats":1},{"count":40,"lower_bound":"LTIwNTQ4MTU1NjQ=","upper_bound":"LTIwMzIyNTEwOTI=","repeats":1},{"count":48,"lower_bound":"LTIwMzA4NTI3NTU=","upper_bound":"LTIwMTkzNTQ1Nzg=","repeats":1},{"count":56,"lower_bound":"LTIwMTAyNDE1NDQ=","upper_bound":"LTE5OTY0NDY4ODc=","repeats":1},{"count":64,"lower_bound":"LTE5OTY0MjM5MDc=","upper_bound":"LTE5Njg2MTgzNTk=","repeats":1},{"count":72,"lower_bound":"LTE5NjU4Mzk3OTY=","upper_bound":"LTE5NTk5Nzk1OTk=","repeats":1},{"count":80,"lower_bound":"LTE5MzgwNDA4MTI=","upper_bound":"LTE5MzQwMjA3MDY=","repeats":1},{"count":88,"lower_bound":"LTE5MzM0NDYyOTU=","upper_bound":"LTE5MjE5NDgyMzE=","repeats":1},{"count":96,"lower_bound":"LTE5MTQ3MTk4Njc=","upper_bound":"LTE5MDY4NTM5NTI=","repeats":1},{"count":104,"lower_bound":"LTE5MDQ4OTM3Njg=","upper_bound":"LTE5MDA1NDQ5OTg=","repeats":1},{"count":112,"lower_bound":"LTE4OTU1NDU3NTI=","upper_bound":"LTE4ODI1ODI3MTU=","repeats":1},{"count":120,"lower_bound":"LTE4Nzc4MTYzMTI=","upper_bound":"LTE4NjI5NDI1OTg=","repeats":1},{"count":128,"lower_bound":"LTE4NTg4NjAxNjQ=","upper_bound":"LTE4NTI5MjA4MTk=","repeats":1},{"count":136,"lower_bound":"LTE4NTE4NjE4NDY=","upper_bound":"LTE4NDI4MzkzNTk=","repeats":1},{"count":144,"lower_bound":"LTE4NDA0MjM0NzM=","upper_bound":"LTE4MjQzMjIwNDQ=","repeats":1},{"count":152,"lower_bound":"LTE4MjI4MTc2ODY=","upper_bound":"LTE4MDk2MzkxNDA=","repeats":1},{"count":160,"lower_bound":"LTE4MDYyMzMxMjY=","upper_bound":"LTE4MDA4ODc3NjM=","repeats":1},{"count":168,"lower_bound":"LTE3OTk3OTAwODA=","upper_bound":"LTE3ODUzNTQ4NzE=","repeats":1},{"count":176,"lower_bound":"LTE3NzY3OTYxMTM=","upper_bound":"LTE3NzEwMjYwNjE=","repeats":1},{"count":184,"lower_bound":"LTE3Njg4NjAyOTc=","upper_bound":"LTE3NTY5NzE1ODQ=","repeats":1},{"count":192,"lower_bound":"LTE3NTM1MDA5NTU=","upper_bound":"LTE3NDQ3MTk4OTQ=","repeats":1},{"count":200,"lower_bound":"LTE3NDQ0NDU1NTM=","upper_bound":"LTE3MzUwNjAwMjQ=","repeats":1},{"count":208,"lower_bound":"LTE3MjU2MTQ2NzU=","upper_bound":"LTE3MDQwOTY1ODU=","repeats":1},{"count":216,"lower_bound":"LTE3MDEyOTA1NDA=","upper_bound":"LTE2OTkzNDI4MjQ=","repeats":1},{"count":224,"lower_bound":"LTE2OTg2MDU3OTg=","upper_bound":"LTE2OTEyODMyNDg=","repeats":1},{"count":232,"lower_bound":"LTE2ODg5MTA3ODM=","upper_bound":"LTE2Njc5NDkwMzk=","repeats":1},{"count":240,"lower_bound":"LTE2NjI0Mzg3Nzg=","upper_bound":"LTE2MjM3NTg1Njg=","repeats":1},{"count":248,"lower_bound":"LTE2MjIyNjAwNzc=","upper_bound":"LTE2MDk5MjIwMTI=","repeats":1},{"count":256,"lower_bound":"LTE2MDQ4NzM3Mzc=","upper_bound":"LTE1ODA5NDM3MTA=","repeats":1},{"count":264,"lower_bound":"LTE1Nzk2MDk0NTA=","upper_bound":"LTE1NjQ4ODI1MDg=","repeats":1},{"count":272,"lower_bound":"LTE1NTU0MTI0MDk=","upper_bound":"LTE1NDkzNjg4NDk=","repeats":1},{"count":280,"lower_bound":"LTE1NDc0ODY2OTE=","upper_bound":"LTE1MzIyMDgxODU=","repeats":1},{"count":288,"lower_bound":"LTE1MjcxNDI1MDE=","upper_bound":"LTE1MTU4NTg5Nzg=","repeats":1},{"count":296,"lower_bound":"LTE1MTM1MzA0OTY=","upper_bound":"LTE0ODUyNjA5ODg=","repeats":1},{"count":304,"lower_bound":"LTE0ODMzNTQyNTc=","upper_bound":"LTE0Nzc0Mjg0Nzg=","repeats":1},{"count":312,"lower_bound":"LTE0NzU5NjAyNDY=","upper_bound":"LTE0Mjc4NzQzNjI=","repeats":1},{"count":320,"lower_bound":"LTE0MTU2MDgxMTk=","upper_bound":"LTEzODE5Mzk2Mzc=","repeats":1},{"count":328,"lower_bound":"LTEzODAxMTQwNTY=","upper_bound":"LTEzNzQ0MTgxOTg=","repeats":1},{"count":336,"lower_bound":"LTEzNjk0ODE0MTc=","upper_bound":"LTEzNTY2MDIzMzY=","repeats":1},{"count":344,"lower_bound":"LTEzNTI4MTM0ODM=","upper_bound":"LTEzMjc0NzM2ODg=","repeats":1},{"count":352,"lower_bound":"LTEzMjYxNjU1MzE=","upper_bound":"LTEzMTcwNTkwODY=","repeats":1},{"count":360,"lower_bound":"LTEzMTQ5OTY3MDI=","upper_bound":"LTEzMDAyNTE4NDc=","repeats":1},{"count":368,"lower_bound":"LTEyOTM3NTQwNDU=","upper_bound":"LTEyOTI1OTY4NDU=","repeats":1},{"count":376,"lower_bound":"LTEyOTA3Nzc5NTY=","upper_bound":"LTEyODQ0MjA5NzQ=","repeats":1},{"count":384,"lower_bound":"LTEyODE1MzQwNzU=","upper_bound":"LTEyNTc3MTYwMDM=","repeats":1},{"count":392,"lower_bound":"LTEyNTY3NTg0NTY=","upper_bound":"LTEyNDY3NjcxNzc=","repeats":1},{"count":400,"lower_bound":"LTEyNDU5Mjg1NzI=","upper_bound":"LTEyNDM2MDgwNzc=","repeats":1},{"count":408,"lower_bound":"LTEyMzcxNjg0MzM=","upper_bound":"LTEyMjIxOTU4NDU=","repeats":1},{"count":416,"lower_bound":"LTEyMTg4MDYyNDU=","upper_bound":"LTEyMTQ4NDM2ODM=","repeats":1},{"count":424,"lower_bound":"LTEyMTM5NTkyNDk=","upper_bound":"LTEyMDk3MzgzNTU=","repeats":1},{"count":432,"lower_bound":"LTEyMDg5MTU3NTk=","upper_bound":"LTEyMDI4ODc0NDI=","repeats":1},{"count":440,"lower_bound":"LTEyMDIyNDgxMDg=","upper_bound":"LTExOTk1NzU0MTU=","repeats":1},{"count":448,"lower_bound":"LTExOTg5OTc5Nzc=","upper_bound":"LTExOTAxMjUwMzY=","repeats":1},{"count":456,"lower_bound":"LTExODMzNTAyMDI=","upper_bound":"LTExNzQ3MDAwOTQ=","repeats":1},{"count":464,"lower_bound":"LTExNjg2MTM4NDE=","upper_bound":"LTExNTY5NDczMTg=","repeats":1},{"count":472,"lower_bound":"LTExNDY4MDIwMjY=","upper_bound":"LTExMzE5NjI4ODg=","repeats":1},{"count":480,"lower_bound":"LTExMjIxMTQ3NTU=","upper_bound":"LTEwOTc5ODI2MDI=","repeats":1},{"count":488,"lower_bound":"LTEwOTI1NjM5MzQ=","upper_bound":"LTEwNzYxOTY1Mzk=","repeats":1},{"count":496,"lower_bound":"LTEwNjE1NzM5Mjg=","upper_bound":"LTEwNTI3OTIwMDc=","repeats":1},{"count":504,"lower_bound":"LTEwMzkwODI5NDM=","upper_bound":"LTEwMzM0MzA4NTM=","repeats":1},{"count":512,"lower_bound":"LTEwMzExOTEyMjU=","upper_bound":"LTEwMTMyNDQ4Njg=","repeats":1},{"count":520,"lower_bound":"LTEwMTI2NTkzNzg=","upper_bound":"LTEwMDYyMzM1MjI=","repeats":1},{"count":528,"lower_bound":"LTEwMDQ3MjEyNDY=","upper_bound":"LTk2NTMzOTkxOQ==","repeats":1},{"count":536,"lower_bound":"LTk2NTAxNTk4Mg==","upper_bound":"LTk0ODQwNDc2Ng==","repeats":1},{"count":544,"lower_bound":"LTk0ODMxMzEzOA==","upper_bound":"LTkwNTAxOTg2MQ==","repeats":1},{"count":552,"lower_bound":"LTg5NTg4MzE2OA==","upper_bound":"LTg4MDA3MjcwNw==","repeats":1},{"count":560,"lower_bound":"LTg3NTA4MzA1NQ==","upper_bound":"LTg2NzM2OTE2NA==","repeats":1},{"count":568,"lower_bound":"LTg2NDE0NzQ2OQ==","upper_bound":"LTg1NDI5MjE5Mw==","repeats":1},{"count":576,"lower_bound":"LTg0NTYxNTYwOA==","upper_bound":"LTgzMzMwOTYzMQ==","repeats":1},{"count":584,"lower_bound":"LTgzMjcyMDg4MQ==","upper_bound":"LTgyNTQ1NzUyMw==","repeats":1},{"count":592,"lower_bound":"LTgxNjg2MTYzNg==","upper_bound":"LTgwMjQzOTU0NQ==","repeats":1},{"count":600,"lower_bound":"LTgwMjE5NzgwNQ==","upper_bound":"LTc4MzM2OTIwNQ==","repeats":1},{"count":608,"lower_bound":"LTc3MDg1MTc0OA==","upper_bound":"LTc2NjYwOTA4MQ==","repeats":1},{"count":616,"lower_bound":"LTc2NDEwMDQ5Mg==","upper_bound":"LTc1Nzk0OTUzNg==","repeats":1},{"count":624,"lower_bound":"LTc1NjA5MzYzNQ==","upper_bound":"LTc0NzM4MDg1NA==","repeats":1},{"count":632,"lower_bound":"LTc0NDM1MDAxMg==","upper_bound":"LTcyOTEwMTE3OQ==","repeats":1},{"count":640,"lower_bound":"LTcyODI2ODE1Mg==","upper_bound":"LTcyMTc0MTQzNg==","repeats":1},{"count":648,"lower_bound":"LTcyMTM1Njc3OA==","upper_bound":"LTY5NTMxNTY3Ng==","repeats":1},{"count":656,"lower_bound":"LTY5NDcxNjE1OA==","upper_bound":"LTY5MzU0OTkwNw==","repeats":1},{"count":664,"lower_bound":"LTY4ODEyNzkyMw==","upper_bound":"LTY3OTU0NzM4Ng==","repeats":1},{"count":672,"lower_bound":"LTY2OTQzNjAwOA==","upper_bound":"LTY1NzAxMDc5OQ==","repeats":1},{"count":680,"lower_bound":"LTY1Mzg3MDY0NQ==","upper_bound":"LTY0ODI2OTU5OA==","repeats":1},{"count":688,"lower_bound":"LTY0NDQyNjMzNQ==","upper_bound":"LTYyODg5MjUyNg==","repeats":1},{"count":696,"lower_bound":"LTYyNzEwNjg2Mg==","upper_bound":"LTU5OTkzMjg5OA==","repeats":1},{"count":704,"lower_bound":"LTU5ODM1NDIzMA==","upper_bound":"LTU4OTQ1OTI1MA==","repeats":1},{"count":712,"lower_bound":"LTU4Njc5Nzg4OA==","upper_bound":"LTU1NzcwMzE1Mw==","repeats":1},{"count":720,"lower_bound":"LTU1MTIwMzYxNw==","upper_bound":"LTU0NTc2NDQ2Mg==","repeats":1},{"count":728,"lower_bound":"LTUzNTc3MTc1MQ==","upper_bound":"LTUyNzAyMzY0Ng==","repeats":1},{"count":736,"lower_bound":"LTUyNTAzOTgyNw==","upper_bound":"LTUxNzQ1NzM0OQ==","repeats":1},{"count":744,"lower_bound":"LTUxMzE4NDI5NA==","upper_bound":"LTUwNDA2NDAzMA==","repeats":1},{"count":752,"lower_bound":"LTQ5MDAwMDY3OQ==","upper_bound":"LTQ3Mzc0NTcwNg==","repeats":1},{"count":760,"lower_bound":"LTQ3MTg1NjMzNw==","upper_bound":"LTQ1OTY2MDc0NQ==","repeats":1},{"count":768,"lower_bound":"LTQ0OTI5MzY0OA==","upper_bound":"LTQzNjA2MzE5NA==","repeats":1},{"count":776,"lower_bound":"LTQzNTMxMTg2MQ==","upper_bound":"LTQzMTEwMTI1Mw==","repeats":1},{"count":784,"lower_bound":"LTQyOTAyODMzMw==","upper_bound":"LTQyNjEzNzc2Mw==","repeats":1},{"count":792,"lower_bound":"LTQyNDYzMzE3MQ==","upper_bound":"LTQxODU1OTYxMQ==","repeats":1},{"count":800,"lower_bound":"LTQxMjQ4NjI5OA==","upper_bound":"LTM5NTI1MzI0MA==","repeats":1},{"count":808,"lower_bound":"LTM5NTExNDk1Nw==","upper_bound":"LTM4Njk0OTUwOA==","repeats":1},{"count":816,"lower_bound":"LTM4MjEwNjYxOA==","upper_bound":"LTM2Nzk4OTg5NA==","repeats":1},{"count":824,"lower_bound":"LTM2NzEzMzY1MA==","upper_bound":"LTM2NDUzNTY3MA==","repeats":1},{"count":832,"lower_bound":"LTM2NDEzNzkxOQ==","upper_bound":"LTM1NjM5ODQ4OQ==","repeats":1},{"count":840,"lower_bound":"LTM1MzI5MDI4Mw==","upper_bound":"LTM0NTE0MjI5MQ==","repeats":1},{"count":848,"lower_bound":"LTM0MjcyNjE2Mg==","upper_bound":"LTMyNjk3NTA3NA==","repeats":1},{"count":856,"lower_bound":"LTMyMzk3MDIwMw==","upper_bound":"LTMxMDQ1MzQxOA==","repeats":1},{"count":864,"lower_bound":"LTMwNjE1MzEyNQ==","upper_bound":"LTMwMTg4MjY3OA==","repeats":1},{"count":872,"lower_bound":"LTMwMTg3NDk1MQ==","upper_bound":"LTI5MzY1NjkyNg==","repeats":1},{"count":880,"lower_bound":"LTI5MzM1MTIyNQ==","upper_bound":"LTI3OTE4NjAzNQ==","repeats":1},{"count":888,"lower_bound":"LTI2Nzg4MzE0Mg==","upper_bound":"LTI2NDAxODM3OQ==","repeats":1},{"count":896,"lower_bound":"LTI1Nzg1OTQ3NA==","upper_bound":"LTI0ODgyMzQwMw==","repeats":1},{"count":904,"lower_bound":"LTI0ODMwMDI0Nw==","upper_bound":"LTIzMDkxODMxNg==","repeats":1},{"count":912,"lower_bound":"LTIzMDc0ODkwNg==","upper_bound":"LTIxOTQ0NTQ3OQ==","repeats":1},{"count":920,"lower_bound":"LTIxNzkxMTU2Mw==","upper_bound":"LTIwODU4NjAxNA==","repeats":1},{"count":928,"lower_bound":"LTE5NDg3NzEyNQ==","upper_bound":"LTE4MDM4NTA1NQ==","repeats":1},{"count":936,"lower_bound":"LTE3MjczMjgyNQ==","upper_bound":"LTE2MzMzNTg3MA==","repeats":1},{"count":944,"lower_bound":"LTE2MDUzMTg1OQ==","upper_bound":"LTE1MjI1OTg3OQ==","repeats":1},{"count":952,"lower_bound":"LTE1MTQ0MTEzNw==","upper_bound":"LTEzNjk0MDY0MA==","repeats":1},{"count":960,"lower_bound":"LTExMTQzNTUwNQ==","upper_bound":"LTkzNTYzNjIw","repeats":1},{"count":968,"lower_bound":"LTg2NTk1ODc4","upper_bound":"LTc5MTYxNTM4","repeats":1},{"count":976,"lower_bound":"LTc2NzE5NjQ3","upper_bound":"LTUzNzIwNzEw","repeats":1},{"count":984,"lower_bound":"LTUzMTk5ODgy","upper_bound":"LTMzODQxODAz","repeats":1},{"count":992,"lower_bound":"LTMzMzg4MjI5","upper_bound":"LTI1ODA2OTIw","repeats":1},{"count":1000,"lower_bound":"LTE5NTU2NDcx","upper_bound":"MjUyMTA5Nw==","repeats":1},{"count":1008,"lower_bound":"NDkyNTEzOA==","upper_bound":"MjE3MjI5Mzc=","repeats":1},{"count":1016,"lower_bound":"MjIwMjIyMTk=","upper_bound":"MjM1MTEwODA=","repeats":1},{"count":1024,"lower_bound":"MzA3MjQ2MzU=","upper_bound":"NjkxMDYzMDk=","repeats":1},{"count":1032,"lower_bound":"NjkxOTgyMjM=","upper_bound":"MTAyNzkyMTYx","repeats":1},{"count":1040,"lower_bound":"MTAzOTQxNzc4","upper_bound":"MTEwMzU1Mjcw","repeats":1},{"count":1048,"lower_bound":"MTEyNDYxMjgx","upper_bound":"MTI2NjMxNjU1","repeats":1},{"count":1056,"lower_bound":"MTI5MjY4MzEx","upper_bound":"MTQ2MzM5ODAz","repeats":1},{"count":1064,"lower_bound":"MTU5ODExMDQz","upper_bound":"MTc1NDEzMTQy","repeats":1},{"count":1072,"lower_bound":"MTc4OTUxMDE1","upper_bound":"MTgxODk0ODMz","repeats":1},{"count":1080,"lower_bound":"MTk0Mjg0MDk1","upper_bound":"MjIyNzc0MTM3","repeats":1},{"count":1088,"lower_bound":"MjI0NDI3ODA3","upper_bound":"MjM2ODg2MDE4","repeats":1},{"count":1096,"lower_bound":"MjM5Nzk5MDQ0","upper_bound":"MjU5Mjk5Mzgz","repeats":1},{"count":1104,"lower_bound":"MjYyNjY5Njc1","upper_bound":"MjY2OTk3NTg1","repeats":1},{"count":1112,"lower_bound":"MjgxODczMjM0","upper_bound":"MzE2MzE4Mzg0","repeats":1},{"count":1120,"lower_bound":"MzI2OTc0NzAx","upper_bound":"MzU2Mjk1MTY1","repeats":1},{"count":1128,"lower_bound":"MzYxOTY5MzEy","upper_bound":"MzY1MDUyNDA5","repeats":1},{"count":1136,"lower_bound":"MzY5ODA1ODAy","upper_bound":"Mzg0OTExOTMy","repeats":1},{"count":1144,"lower_bound":"Mzg1MzQyNTcz","upper_bound":"Mzk2MTE5NzE1","repeats":1},{"count":1152,"lower_bound":"Mzk4ODQ4MzM2","upper_bound":"NDAyMTU5NDY3","repeats":1},{"count":1160,"lower_bound":"NDA0MTIxNjA3","upper_bound":"NDEyOTYyNDE4","repeats":1},{"count":1168,"lower_bound":"NDE2NzQ2NDI3","upper_bound":"NDE5NjA2OTI0","repeats":1},{"count":1176,"lower_bound":"NDI3NDYwMTM3","upper_bound":"NDM3NTY4NDE1","repeats":1},{"count":1184,"lower_bound":"NDM3NzE5MzM3","upper_bound":"NDQ0MDExNjc0","repeats":1},{"count":1192,"lower_bound":"NDQ2MjcxNjc3","upper_bound":"NDU5MjY0NTc5","repeats":1},{"count":1200,"lower_bound":"NDY1MjA2NTg4","upper_bound":"NDc2MjA5NTA0","repeats":1},{"count":1208,"lower_bound":"NDgwNDU0OTY2","upper_bound":"NTAwNjM5NzY0","repeats":1},{"count":1216,"lower_bound":"NTA3OTYyNTc1","upper_bound":"NTE4ODg4MDUy","repeats":1},{"count":1224,"lower_bound":"NTIxMzA5Njg4","upper_bound":"NTM0MTEyNTA5","repeats":1},{"count":1232,"lower_bound":"NTM3MzE5Mjgy","upper_bound":"NTQyOTAyMzUw","repeats":1},{"count":1240,"lower_bound":"NTQ4Njc3NDc2","upper_bound":"NTY0NzY1NjEy","repeats":1},{"count":1248,"lower_bound":"NTY3MDczMzE0","upper_bound":"NTc3NTE1NTE2","repeats":1},{"count":1256,"lower_bound":"NTgyNzQwNDYy","upper_bound":"NTkyMDIwODQ0","repeats":1},{"count":1264,"lower_bound":"NjA0MzgwOTgw","upper_bound":"NjE1NDg1NTY4","repeats":1},{"count":1272,"lower_bound":"NjM2OTM1NjIx","upper_bound":"NjQ1NDY4NjIz","repeats":1},{"count":1280,"lower_bound":"NjQ3MjE1Mjk5","upper_bound":"NjY4OTk0OTIw","repeats":1},{"count":1288,"lower_bound":"NjcyNjE2OTUx","upper_bound":"NjkyMTAzMTE3","repeats":1},{"count":1296,"lower_bound":"NjkzNDk5NjAz","upper_bound":"NzEyMDI4Nzk0","repeats":1},{"count":1304,"lower_bound":"NzE1NDM3MDA3","upper_bound":"NzMxNzE3MTgz","repeats":1},{"count":1312,"lower_bound":"NzM4OTE0MjQw","upper_bound":"NzUyOTgwNDcy","repeats":1},{"count":1320,"lower_bound":"NzUzNjcxOTEw","upper_bound":"NzYxNTgxMzQ2","repeats":1},{"count":1328,"lower_bound":"NzY3MTE5MjEx","upper_bound":"NzY5NDA0Njgz","repeats":1},{"count":1336,"lower_bound":"NzY5NDc0Nzk2","upper_bound":"ODA4MzQxOTg1","repeats":1},{"count":1344,"lower_bound":"ODEyNDM0OTY1","upper_bound":"ODIwMTEwNDM1","repeats":1},{"count":1352,"lower_bound":"ODIwNDMwODc5","upper_bound":"ODI2ODUwMDM5","repeats":1},{"count":1360,"lower_bound":"ODM3NDc0NDUy","upper_bound":"ODUxODA2Nzkw","repeats":1},{"count":1368,"lower_bound":"ODUyMDY1OTAw","upper_bound":"ODcwNjYxNjk2","repeats":1},{"count":1376,"lower_bound":"ODcxMDQ2NDMw","upper_bound":"ODk1NTA2NTM2","repeats":1},{"count":1384,"lower_bound":"ODk1NTI5NTk5","upper_bound":"OTAzNTk3NDkx","repeats":1},{"count":1392,"lower_bound":"OTA0MTkzOTYw","upper_bound":"OTExNTI1NzA1","repeats":1},{"count":1400,"lower_bound":"OTE0NDkyMDgx","upper_bound":"OTIxNTQ3OTc2","repeats":1},{"count":1408,"lower_bound":"OTI3NTY3OTgx","upper_bound":"OTM1NDg3NDA5","repeats":1},{"count":1416,"lower_bound":"OTQwNTQwMTg0","upper_bound":"OTUwMDkyNjY2","repeats":1},{"count":1424,"lower_bound":"OTUyMTUzNjA5","upper_bound":"OTU5MTE4MzIx","repeats":1},{"count":1432,"lower_bound":"OTYwMDgxODA3","upper_bound":"OTgyNzc0MjMx","repeats":1},{"count":1440,"lower_bound":"OTg1NTE1MjY2","upper_bound":"OTkwNzQzMTc4","repeats":1},{"count":1448,"lower_bound":"OTk2NjgzNTgy","upper_bound":"MTAwODE0ODkzMg==","repeats":1},{"count":1456,"lower_bound":"MTAxMjA4MjA0Ng==","upper_bound":"MTAyNTgxMTc1MA==","repeats":1},{"count":1464,"lower_bound":"MTAzMTM5MTE1MA==","upper_bound":"MTAzNjU3OTAwMw==","repeats":1},{"count":1472,"lower_bound":"MTAzOTMzOTkwMQ==","upper_bound":"MTA0NTcxMTgyMw==","repeats":1},{"count":1480,"lower_bound":"MTA1NzEzMTQzNw==","upper_bound":"MTA3NjA2MzMwNQ==","repeats":1},{"count":1488,"lower_bound":"MTA4NTc1MTc1Mw==","upper_bound":"MTA5NTQ3OTYwMg==","repeats":1},{"count":1496,"lower_bound":"MTA5NzA3NzM4Mw==","upper_bound":"MTExOTg5NDE4MQ==","repeats":1},{"count":1504,"lower_bound":"MTEyNjI0ODczNg==","upper_bound":"MTE1MjIwOTI1NQ==","repeats":1},{"count":1512,"lower_bound":"MTE1NTY4MDQ1Ng==","upper_bound":"MTE2NjEzNzQyOQ==","repeats":1},{"count":1520,"lower_bound":"MTE2ODE0MjIyMA==","upper_bound":"MTE3NDczOTM3OA==","repeats":1},{"count":1528,"lower_bound":"MTE4MDE3MzEwNA==","upper_bound":"MTE4ODUyODU0Nw==","repeats":1},{"count":1536,"lower_bound":"MTE5MTU1MjE4MA==","upper_bound":"MTIwNTIxMTc3Ng==","repeats":1},{"count":1544,"lower_bound":"MTIwODY0MTU3Ng==","upper_bound":"MTIxNzA2NDQ1Mg==","repeats":1},{"count":1552,"lower_bound":"MTIxOTkxOTU5MQ==","upper_bound":"MTIzNjA3ODg2NQ==","repeats":1},{"count":1560,"lower_bound":"MTIzNjkxNjAwOA==","upper_bound":"MTI0NDI3NjAyNQ==","repeats":1},{"count":1568,"lower_bound":"MTI1MjAwMzM4MA==","upper_bound":"MTI1NDU3MzI2Ng==","repeats":1},{"count":1576,"lower_bound":"MTI1NjY5MjU1OQ==","upper_bound":"MTI2MDI4ODczMw==","repeats":1},{"count":1584,"lower_bound":"MTI2MTMxMjM3OQ==","upper_bound":"MTI3ODIzMjkzNA==","repeats":1},{"count":1592,"lower_bound":"MTI3OTI2MDU1Mw==","upper_bound":"MTI4Mzg3MDUzNQ==","repeats":1},{"count":1600,"lower_bound":"MTI4NTcwNjUwNQ==","upper_bound":"MTI5NzI1NDMxNA==","repeats":1},{"count":1608,"lower_bound":"MTI5Nzk0MzIxNw==","upper_bound":"MTMwMDEzNzE3NA==","repeats":1},{"count":1616,"lower_bound":"MTMwMDUyODc0NQ==","upper_bound":"MTMxMjc2NTc4Mg==","repeats":1},{"count":1624,"lower_bound":"MTMxNDk1MjM4Mw==","upper_bound":"MTMyNDI4OTEzNw==","repeats":1},{"count":1632,"lower_bound":"MTMyODM1NTAyNQ==","upper_bound":"MTM0ODA3MzcxMQ==","repeats":1},{"count":1640,"lower_bound":"MTM1MTA0NTg4MA==","upper_bound":"MTM2MzU4NzMzNg==","repeats":1},{"count":1648,"lower_bound":"MTM2Mzc2MjIzNA==","upper_bound":"MTM3MTE4OTE5Ng==","repeats":1},{"count":1656,"lower_bound":"MTM3NDMxNjE0NQ==","upper_bound":"MTM5NzYxOTg2OQ==","repeats":1},{"count":1664,"lower_bound":"MTQwNTI3ODYxOA==","upper_bound":"MTQxMTg1OTMwNw==","repeats":1},{"count":1672,"lower_bound":"MTQyMDUyOTIzNg==","upper_bound":"MTQyNzYzMjI0OQ==","repeats":1},{"count":1680,"lower_bound":"MTQyNzg3OTIzOQ==","upper_bound":"MTQ0NDc3MTczNA==","repeats":1},{"count":1688,"lower_bound":"MTQ0NjY4NDUyMw==","upper_bound":"MTQ2NzI4NTgyNg==","repeats":1},{"count":1696,"lower_bound":"MTQ2NzMxMTI2OQ==","upper_bound":"MTQ3NTg0NDMzMQ==","repeats":1},{"count":1704,"lower_bound":"MTQ3OTUxNjU4OA==","upper_bound":"MTUwMTgwODUyOQ==","repeats":1},{"count":1712,"lower_bound":"MTUxMDEwMzY4NA==","upper_bound":"MTUyMTIzNjAxNw==","repeats":1},{"count":1720,"lower_bound":"MTUyMjYzNTg4OA==","upper_bound":"MTU0NTk3OTU1Nw==","repeats":1},{"count":1728,"lower_bound":"MTU1NDY4ODg1OA==","upper_bound":"MTU1NzYzOTczNw==","repeats":1},{"count":1736,"lower_bound":"MTU2MzQyMTM4MQ==","upper_bound":"MTU2NzQwMjIwNg==","repeats":1},{"count":1744,"lower_bound":"MTU3NTQ3MTQzNA==","upper_bound":"MTYwMDg0OTc2NQ==","repeats":1},{"count":1752,"lower_bound":"MTYwMTE2OTg4OQ==","upper_bound":"MTYyOTgyMTU0Ng==","repeats":1},{"count":1760,"lower_bound":"MTYzMjcyNTg4Ng==","upper_bound":"MTYzOTYxMDUxOQ==","repeats":1},{"count":1768,"lower_bound":"MTY0NTU3ODAzMQ==","upper_bound":"MTY2Njk5OTg2Nw==","repeats":1},{"count":1776,"lower_bound":"MTY3NzM4OTc5NQ==","upper_bound":"MTY4MjUxMTkxNA==","repeats":1},{"count":1784,"lower_bound":"MTY4MjU5NzI4Ng==","upper_bound":"MTY5NDkyOTkyMw==","repeats":1},{"count":1792,"lower_bound":"MTY5OTQ2MDU5OQ==","upper_bound":"MTcwODU0ODA2MA==","repeats":1},{"count":1800,"lower_bound":"MTcxNjEzODUyMw==","upper_bound":"MTcyNDcwNDI1Ng==","repeats":1},{"count":1808,"lower_bound":"MTcyNTkxNjU0Nw==","upper_bound":"MTc0MjY3MTA5Nw==","repeats":1},{"count":1816,"lower_bound":"MTc0Mjc0OTY3OQ==","upper_bound":"MTc3MTQ4ODcwMg==","repeats":1},{"count":1824,"lower_bound":"MTc3MzQ1ODEzNg==","upper_bound":"MTc4MzIwMjQ1Mg==","repeats":1},{"count":1832,"lower_bound":"MTc4Mzc2MzUwMA==","upper_bound":"MTc4Nzk5Mzc4Mg==","repeats":1},{"count":1840,"lower_bound":"MTc4ODk5MDc5Ng==","upper_bound":"MTgwNzM1MDcxMA==","repeats":1},{"count":1848,"lower_bound":"MTgwODU0NjgxNQ==","upper_bound":"MTgzMTA3NzEzNQ==","repeats":1},{"count":1856,"lower_bound":"MTgzMzQ2NDg3NA==","upper_bound":"MTg1NDEzMDQ5NQ==","repeats":1},{"count":1864,"lower_bound":"MTg1ODkzMzI3MA==","upper_bound":"MTg2Njc0NTQ0NA==","repeats":1},{"count":1872,"lower_bound":"MTg2ODUxNDMxMw==","upper_bound":"MTg4MTU5NzQzMQ==","repeats":1},{"count":1880,"lower_bound":"MTg4MTY1NDU2NA==","upper_bound":"MTg5MTA0OTU4Mw==","repeats":1},{"count":1888,"lower_bound":"MTg5MTg4MTc0MQ==","upper_bound":"MTkxNzkzNDk1Ng==","repeats":1},{"count":1896,"lower_bound":"MTkyMTcyNzA1Ng==","upper_bound":"MTkzNzU4NjI1NA==","repeats":1},{"count":1904,"lower_bound":"MTkzOTM3OTg4OA==","upper_bound":"MTk1MTQ2ODM1Ng==","repeats":1},{"count":1912,"lower_bound":"MTk1MTk0NDc1Nw==","upper_bound":"MTk2NzI4OTkyOA==","repeats":1},{"count":1920,"lower_bound":"MTk3MDQ1NzA4Nw==","upper_bound":"MTk5Mjk2MzAwMg==","repeats":1},{"count":1928,"lower_bound":"MTk5MzAxNzYxMA==","upper_bound":"MjAwMDg2NjQyOQ==","repeats":1},{"count":1936,"lower_bound":"MjAwMzA3ODQ4MA==","upper_bound":"MjAwOTUzODY5MQ==","repeats":1},{"count":1944,"lower_bound":"MjAxMTI2MjYyMQ==","upper_bound":"MjAyNzcyODc3Ng==","repeats":1},{"count":1952,"lower_bound":"MjAyODUwMzA4OA==","upper_bound":"MjAzNjcxMzg5MQ==","repeats":1},{"count":1960,"lower_bound":"MjAzNzE0MjAwMA==","upper_bound":"MjA0MDUzODI3NQ==","repeats":1},{"count":1968,"lower_bound":"MjA0MzYxMjc4OA==","upper_bound":"MjA0NzcyNzExNg==","repeats":1},{"count":1976,"lower_bound":"MjA2MzkzMjk1NQ==","upper_bound":"MjA3MjU4MTAyNA==","repeats":1},{"count":1984,"lower_bound":"MjA4MzA0MTU4Ng==","upper_bound":"MjA5MzI4OTExNw==","repeats":1},{"count":1992,"lower_bound":"MjEwNzEwNTgzMQ==","upper_bound":"MjEyMzgxMDc3Ng==","repeats":1},{"count":2000,"lower_bound":"MjEzNTI5NTI5MA==","upper_bound":"MjE0MzI0MDExOQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,3,0,1,2,0,2,4,1,0,0,0,0,0,3,1,0,0,0,1,1,0,2,1,1,3,1,0,0,1,2,1,0,2,1,2,1,1,1,1,0,3,2,3,5,0,3,0,2,0,0,0,0,1,0,1,0,1,0,3,1,0,0,0,0,0,0,3,1,3,0,2,0,0,1,1,1,0,0,0,0,2,0,1,2,1,0,0,2,1,0,1,0,1,1,0,0,0,1,1,1,0,2,2,2,1,0,3,1,3,1,0,1,2,1,1,2,0,0,2,0,1,2,0,1,1,0,3,0,1,1,4,1,1,0,0,4,2,2,0,1,0,3,2,1,1,2,1,3,2,1,0,1,0,0,0,0,2,0,0,0,2,0,0,0,0,1,0,1,0,1,3,0,1,0,0,0,1,0,3,1,1,1,1,0,1,0,1,0,0,0,1,0,2,3,0,0,0,0,1,2,2,0,3,2,1,0,0,1,2,0,1,2,3,0,1,1,1,0,2,1,0,1,1,0,0,1,1,0,0,0,0,1,0,2,2,2,1,1,0,3,0,1,0,4,1,0,2,0,0,0,1,0,1,2,1,1,1,1,1,0,1,2,1,1,1,0,0,1,0,1,1,1,1,1,0,0,1,0,2,1,1,0,0,3,0,1,1,1,2,0,1,0,1,1,2,0,1,0,1,0,1,0,2,1,1,1,0,1,1,0,2,2,1,0,2,1,1,0,0,3,1,1,0,2,2,2,0,2,0,0,1,1,2,1,2,0,1,3,0,0,0,1,0,2,1,1,2,0,1,0,1,1,0,1,0,3,2,2,1,1,0,2,0,0,3,1,0,2,1,2,1,1,1,2,1,0,1,3,3,1,0,1,2,0,0,1,0,2,1,0,0,0,0,1,0,0,0,2,2,0,1,3,2,1,1,0,1,0,0,2,0,0,1,1,0,2,2,1,1,1,0,1,2,0,0,1,1,1,0,3,1,0,1,0,0,2,0,0,0,0,0,1,0,0,1,3,0,2,2,0,2,0,1,1,0,0,2,1,1,0,1,1,2,3,2,1,1,1,1,1,0,2,0,2,1,4,1,1,0,2,1,2,0,5,2,2,0,3,2,1,1,0,1,2,3,1,0,1,4,2,0,0,2,0,3,1,1,1,0,0,1,0,3,1,2,0,1,0,0,0,0,2,1,1,0,1,3,0,1,0,0,0,2,2,0,1,1,0,2,1,0,1,0,2,2,0,2,2,1,0,0,1,1,4,2,1,0,1,1,3,2,1,1,0,1,2,2,0,2,2,0,0,2,0,3,1,1,1,0,0,1,3,0,1,0,0,2,1,1,0,0,2,1,1,1,0,1,0,2,3,1,0,0,0,0,1,0,2,0,1,0,1,1,2,0,3,2,0,0,3,1,1,0,1,1,1,2,0,4,0,1,1,2,0,0,1,1,0,0,0,2,0,3,0,1,2,2,1,2,1,0,2,1,0,0,2,0,0,0,0,1,1,1,0,0,0,2,1,3,1,0,0,1,1,0,0,0,0,1,0,1,0,1,0,0,1,3,0,1,0,2,1,0,0,0,4,0,2,0,1,0,0,0,0,1,3,0,0,0,2,2,2,1,2,0,0,0,0,1,1,2,1,3,0,2,2,3,2,1,1,1,0,0,1,1,1,0,5,0,0,1,1,2,2,1,1,1,4,1,2,0,1,0,0,2,4,2,1,1,3,1,3,0,1,0,0,0,0,1,0,2,2,0,0,2,1,1,0,1,3,1,0,2,1,0,1,2,0,0,1,4,0,1,0,0,1,2,0,0,2,0,1,2,2,1,1,4,1,1,1,0,3,2,0,1,0,0,0,0,0,0,1,1,2,0,2,0,0,0,0,1,0,1,2,0,0,0,0,1,1,0,0,2,0,2,0,2,0,2,1,0,0,1,2,0,1,1,1,2,0,2,1,1,0,0,1,0,0,3,3,0,0,1,0,3,1,0,0,0,0,2,1,0,1,2,0,1,1,1,1,0,0,1,0,2,1,0,0,1,1,0,3,1,2,0,0,1,0,0,1,2,1,0,2,2,0,1,1,0,2,1,2,1,1,1,1,2,1,1,1,0,0,2,1,1,1,0,2,1,2,3,1,2,1,0,2,2,0,0,0,2,0,1,0,2,2,1,1,0,0,1,2,2,2,0,0,0,0,0,3,1,1,0,2,3,1,0,1,0,0,1,0,1,1,1,0,0,1,1,3,1,0,2,1,0,2,0,2,3,0,0,1,0,1,3,0,3,2,0,0,1,1,2,3,0,2,0,0,0,3,0,0,2,1,1,0,1,1,1,0,1,1,0,0,1,1,1,0,1,1,1,2,0,0,1,1,0,2,0,0,1,0,5,2,6,1,0,2,0,1,1,1,1,0,0,0,2,1,1,1,1,2,2,1,0,0,0,0,4,1,0,2,1,2,2,2,1,1,0,1,0,0,2,0,3,1,0,1,2,1,3,0,1,0,1,0,2,1,1,1,1,0,1,0,4,1,0,1,1,1,1,2,3,0,1,0,0,0,0,1,0,1,1,0,2,1,2,1,0,1,2,1,0,1,1,0,0,2,3,0,1,1,1,0,1,1,0,1,0,0,3,1,2,0,1,1,1,1,1,2,0,1,1,0,2,1,1,1,3,1,1,1,0,0,1,0,1,1,0,2,0,1,0,5,2,2,2,1,0,0,2,0,2,1,2,1,3,0,1,0,0,1,0,1,1,3,1,0,0,0,0,1,1,1,2,1,2,0,0,2,1,1,1,1,3,2,2,1,0,0,1,1,1,1,0,3,1,1,4,2,0,3,0,0,2,1,0,1,2,0,2,4,0,2,2,0,2,1,1,3,0,1,0,1,1,2,1,0,0,2,2,1,1,2,3,0,0,0,0,1,2,2,0,2,0,1,0,2,2,0,3,0,1,0,0,0,1,2,0,0,3,1,1,0,3,0,0,1,2,0,2,1,1,1,3,2,1,0,1,1,2,0,0,1,0,0,0,0,1,0,2,1,4,0,0,2,1,1,0,0,1,0,0,0,3,1,0,0,1,1,0,3,2,3,2,4,0,1,1,1,0,0,2,2,0,0,0,1,0,1,2,0,0,0,1,1,3,0,0,2,2,0,2,0,1,2,1,2,2,0,1,3,1,0,0,2,1,2,1,1,2,2,0,1,0,2,2,1,2,1,1,2,1,0,0,0,0,1,1,0,1,2,1,0,1,2,1,0,1,0,2,2,2,1,1,0,0,1,1,1,1,0,0,2,0,3,1,1,0,1,1,0,1,0,0,1,1,4,0,0,2,2,2,1,1,2,0,0,1,0,1,0,0,1,1,0,2,1,1,1,2,1,0,1,3,0,0,2,3,0,0,3,0,0,1,0,1,0,2,3,0,0,0,0,2,1,1,2,0,0,2,1,0,1,1,2,1,1,1,1,0,1,0,0,1,2,2,1,1,0,2,2,0,1,3,1,0,1,1,0,3,0,0,0,0,1,0,1,0,1,3,2,2,0,1,3,1,2,2,2,3,0,2,1,2,2,1,0,1,1,1,0,2,0,2,2,1,2,5,0,3,1,0,2,1,1,0,0,1,1,0,0,1,3,0,0,3,2,1,0,3,2,1,1,0,1,1,1,2,0,0,1,2,1,1,2,1,1,0,1,2,2,1,2,0,1,0,1,0,1,1,0,0,1,1,2,0,0,1,0,3,0,0,0,0,2,0,0,1,1,1,0,1,1,2,1,0,1,0,0,1,0,0,1,2,1,0,1,0,2,1,1,0,0,0,1,4,0,0,0,0,0,0,0,0,0,1,0,1,2,0,1,2,2,3,2,0,0,2,1,0,2,2,3,2,0,2,2,1,2,2,0,0,0,0,1,2,1,0,1,1,2,0,0,1,1,0,1,3,0,2,1,0,0,0,3,2,1,0,0,1,2,1,0,2,0,0,1,1,0,1,0,0,0,0,1,3,0,1,2,0,1,0,2,1,3,0,1,1,1,0,1,1,1,1,1,2,0,0,0,1,0,1,0,2,0,1,0,0,1,0,0,0,2,1,0,3,0,0,0,2,1,1,1,3,1,0,0,1,1,2,1,2,0,2,0,2,0,3,3,1,2,2,0,2,0,1,3,0,0,0,0,0,3,0,1,1,2,1,0,1,0,0,0,1,1,0,1,2,0,1,0,2,1,0,2,1,1,1,0,1,1,2,0,0,0,1,2,2,0,1,0,0,0,0,0,0,2,1,1,1,0,0,1,0,0,2,2,2,1,2,5,1,0,0,1,2,3,0,4,2,2,0,1,3,1,2,3,0,0,1,1,2,1,1,1,1,0,0,2,0,2,1,2,0,2,2,2,0,1,2,0,2,0,2,0,0,1,0,3,2,0,1,1,0,1,1,0,1,1,2,0,2,0,0,0,1,0,0,1,0,1,4,0,0,1,0,0,0,0,1,1,0,2,0,2,1,2,0,2,2,0,3,1,3,1,2,1,1,0,0,0,2,1,0,0,3,0,1,1,0,2,0,2,1,1,2,2,1,0,1,0,1,1,1,2,2,2,2,0,0,3,1,2,2,1,1,3,2,1,2,1,1,2,0,4,2]},{"counters":[1,0,1,3,1,0,1,0,1,0,0,0,3,0,1,0,1,1,1,2,1,2,1,0,1,0,2,0,2,1,3,0,1,2,0,0,3,1,2,1,2,0,1,1,3,3,0,2,0,2,2,1,1,0,1,0,1,1,2,1,0,1,0,0,2,0,0,0,2,0,0,0,0,0,1,2,3,1,1,2,1,3,2,0,0,1,2,0,1,0,3,1,1,0,0,1,1,1,1,2,0,1,1,1,1,2,1,0,1,2,1,0,1,0,2,1,1,0,0,3,2,0,0,4,1,0,1,1,0,4,0,1,3,2,1,0,0,3,1,3,0,0,2,1,2,0,0,2,0,0,3,0,0,0,2,1,0,3,1,2,0,1,0,0,1,4,0,0,0,1,1,2,2,0,2,2,0,0,0,1,1,2,0,2,0,1,2,0,0,2,1,1,1,0,1,0,0,0,3,2,1,1,2,1,1,0,1,0,2,0,0,0,0,2,1,1,3,0,0,0,1,1,2,0,0,1,1,0,1,1,0,1,0,0,2,2,0,1,0,1,1,2,0,1,0,0,2,0,0,2,2,0,3,0,3,0,3,0,1,2,2,0,0,5,1,0,0,1,1,2,1,1,2,2,3,0,2,0,0,4,1,1,0,1,0,1,3,1,0,1,1,1,2,1,3,0,0,3,1,1,1,0,2,1,0,1,0,1,0,2,0,0,0,4,2,0,3,0,0,1,1,4,0,3,0,1,3,4,1,0,0,0,2,0,1,2,0,2,1,1,0,1,1,0,1,3,0,1,0,1,0,1,3,4,0,2,1,0,0,1,0,1,0,2,0,1,3,0,2,2,0,0,0,2,1,1,3,0,0,1,0,2,1,1,0,0,2,0,0,2,1,2,1,2,1,1,1,2,1,0,4,1,0,1,0,0,0,0,1,0,2,1,1,1,2,0,1,1,3,1,1,1,1,2,1,3,1,1,3,2,0,2,1,0,1,2,0,0,0,1,0,2,1,1,0,2,2,2,0,1,0,1,1,0,0,1,0,0,0,1,0,0,0,1,0,0,2,0,0,2,1,0,1,1,2,3,0,1,1,1,0,2,3,2,3,2,2,1,2,2,0,1,1,0,1,1,0,0,1,0,1,2,1,1,1,0,0,1,2,0,0,1,1,1,0,0,3,0,1,0,0,0,0,0,2,0,1,2,1,0,0,0,0,2,2,0,1,0,2,0,0,3,1,0,1,0,1,0,1,0,2,1,0,3,4,3,0,2,2,2,0,0,0,1,2,2,3,0,0,2,0,1,1,1,0,0,0,0,0,0,0,3,0,0,1,0,0,1,1,0,1,2,1,0,2,2,1,0,0,0,2,0,2,2,3,0,1,0,4,0,1,3,0,2,0,1,1,1,1,0,1,4,1,2,1,1,1,1,0,0,3,1,1,0,1,1,2,0,2,4,1,0,1,0,2,0,1,3,2,1,0,2,1,2,0,1,2,0,3,2,0,1,2,3,1,0,2,2,0,3,3,0,3,1,2,0,1,0,2,1,1,0,2,1,3,1,1,3,1,0,0,1,1,0,0,0,0,1,2,1,0,1,6,1,1,0,1,0,1,2,0,0,0,1,0,0,2,0,0,1,0,1,1,0,1,1,1,1,1,0,2,0,1,1,1,0,1,1,0,1,3,0,0,2,4,0,1,0,2,2,1,0,1,2,2,0,1,0,1,4,1,0,1,2,0,2,2,2,2,1,3,1,1,1,0,2,1,1,2,1,0,1,0,1,2,3,1,2,0,1,0,1,0,0,1,0,1,0,1,1,1,0,1,1,2,0,1,1,0,1,2,2,1,2,2,1,2,1,1,0,0,0,1,1,4,1,2,0,0,1,0,1,0,2,2,0,0,1,1,3,1,0,1,1,1,2,1,1,1,1,1,0,0,3,0,0,2,0,0,0,2,1,1,1,1,0,1,0,4,1,0,1,3,3,0,1,0,0,0,3,2,1,1,0,1,2,1,2,1,3,3,0,0,1,1,0,0,2,0,0,0,0,1,0,0,1,0,0,2,0,0,2,1,1,2,0,2,1,0,2,1,0,0,2,0,3,0,1,1,0,0,2,2,0,0,2,1,1,0,1,2,0,0,0,0,4,0,0,1,1,0,0,0,1,2,0,2,1,1,1,2,0,0,2,0,0,0,1,1,1,0,1,0,1,3,2,0,1,0,0,0,1,1,1,1,2,1,1,1,0,0,0,2,1,1,1,2,2,2,0,1,0,0,0,2,0,1,1,2,3,1,0,0,2,1,0,3,1,1,1,1,0,1,0,1,2,0,1,0,1,1,1,2,1,1,1,2,2,2,1,3,2,1,3,2,0,2,0,1,1,1,0,0,0,0,1,0,1,0,0,0,2,0,2,3,0,1,0,0,1,3,1,1,1,2,1,1,0,1,1,0,1,0,0,1,0,1,1,0,4,1,1,1,0,1,0,1,1,1,0,1,1,2,1,0,2,3,0,0,1,1,0,4,0,1,1,0,1,0,0,1,1,3,1,0,1,0,0,1,1,1,2,0,2,1,1,1,1,1,2,0,1,1,0,5,2,1,1,0,0,2,0,0,3,1,0,2,0,1,0,1,0,1,1,2,3,0,0,0,1,1,2,0,1,0,0,1,2,0,2,3,0,1,2,1,1,1,1,1,3,0,1,0,2,2,1,2,0,1,1,0,0,2,1,2,2,2,1,0,0,0,2,0,0,2,2,1,1,3,2,0,0,0,0,0,0,2,0,2,1,0,1,1,1,1,2,2,0,1,0,1,1,1,0,0,1,0,0,2,2,1,3,1,0,4,0,2,1,1,0,1,1,1,1,1,2,0,1,0,0,1,1,3,1,2,0,2,1,1,0,1,2,2,0,0,2,3,3,1,0,2,2,3,0,0,3,0,2,1,0,0,0,0,1,0,1,0,0,0,1,1,3,1,0,0,1,0,0,1,1,2,1,1,0,0,2,0,1,1,0,0,1,2,3,2,3,0,2,1,0,0,1,1,0,2,1,1,0,2,5,0,0,0,1,0,0,0,2,0,3,2,0,0,1,1,1,1,1,2,0,2,2,0,0,0,0,0,4,0,0,0,3,2,1,1,0,0,1,2,0,1,1,2,3,3,1,1,0,1,0,0,0,1,0,1,0,0,0,2,1,1,0,2,0,0,0,1,0,2,0,0,0,2,0,0,1,0,0,2,0,1,1,2,0,2,0,1,1,0,0,0,0,1,1,0,0,2,3,1,2,3,1,0,0,2,0,0,1,1,2,1,1,0,0,1,3,0,2,0,2,0,0,0,0,2,2,3,0,1,1,2,0,0,1,2,1,1,1,0,0,0,1,1,1,0,2,1,0,2,0,0,0,2,2,1,1,0,0,0,1,0,3,2,0,0,0,1,0,0,2,0,3,1,3,0,2,2,0,1,0,1,0,0,3,0,4,0,1,0,0,1,0,1,1,2,3,1,2,2,0,2,1,2,0,3,1,1,2,3,2,2,0,0,1,4,1,2,1,0,2,0,1,0,1,0,2,1,1,1,0,1,0,0,2,0,0,0,0,2,0,1,0,2,1,1,2,3,0,0,0,0,0,1,1,0,3,0,1,0,1,2,1,0,1,0,1,0,0,0,1,0,0,0,1,0,1,3,1,0,1,3,3,3,1,1,1,2,1,1,1,1,2,1,1,1,1,3,0,3,2,0,0,1,1,1,3,0,1,0,0,0,0,0,1,1,1,1,2,0,0,1,2,1,1,0,2,1,0,1,1,0,0,0,2,1,1,3,1,0,2,1,1,1,2,1,1,1,4,0,1,3,1,1,2,1,1,3,0,0,0,3,2,2,0,0,0,3,0,0,1,0,2,2,1,0,1,0,1,2,2,2,0,0,1,0,1,2,0,0,0,1,3,2,0,1,1,0,2,1,0,1,1,0,2,2,1,0,1,1,2,0,1,1,0,0,0,1,1,1,1,1,0,0,1,1,1,0,1,2,1,1,1,2,0,1,0,2,1,1,0,1,1,1,0,1,2,1,2,0,1,2,2,2,1,1,2,0,0,0,2,4,2,0,2,1,1,0,1,1,1,1,1,0,3,1,2,2,2,0,1,2,0,3,0,1,0,1,1,0,0,1,0,1,2,2,2,1,1,0,1,2,1,1,1,0,0,1,3,1,1,0,1,1,1,1,0,0,1,2,1,1,1,0,1,1,1,0,3,0,0,0,0,2,2,0,1,0,2,1,1,1,1,1,1,1,1,2,0,2,1,1,0,0,1,1,0,0,0,0,0,2,2,0,1,0,0,0,2,2,0,1,2,4,0,0,2,2,0,1,0,0,1,0,1,0,0,0,0,1,0,0,2,0,3,0,1,1,1,3,4,2,3,0,0,1,5,4,1,0,1,2,1,1,1,0,4,1,0,1,0,1,0,1,3,1,0,0,1,1,1,0,0,4,2,0,2,1,0,0,1,1,0,0,1,1,1,1,0,0,0,1,1,0,3,1,0,1,3,2,0,0,1,2,1,0,0,0,1,0,1,2,0,1,1,1,0,1,1,0,1,0,1,1,1,0,3,0,2,1,3,1,0,0,0,0,0,2,1]},{"counters":[0,0,1,0,1,0,3,0,1,1,1,0,2,1,2,0,2,0,1,2,1,0,2,0,1,0,0,2,1,0,0,1,0,1,2,1,0,1,0,1,1,1,1,1,1,1,2,0,1,1,3,1,1,5,1,2,1,0,2,1,2,0,0,0,2,1,0,0,2,0,4,1,1,1,1,1,1,1,0,1,2,1,0,3,0,0,2,0,2,0,0,0,2,0,0,0,2,3,2,1,0,2,0,0,1,0,1,0,1,0,1,0,0,0,1,2,0,2,1,1,0,2,1,2,0,2,1,1,0,0,2,1,2,0,3,1,1,0,1,0,0,0,0,1,0,0,0,2,0,1,1,1,2,1,0,0,2,0,2,2,1,0,2,0,1,2,1,1,0,0,0,1,1,0,0,3,1,2,0,0,2,2,1,2,1,1,1,1,1,1,1,1,1,0,2,2,1,1,2,1,0,2,1,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,2,2,0,1,1,3,0,2,2,0,3,1,2,1,2,0,0,0,1,1,0,0,0,1,2,1,0,1,0,1,2,3,1,1,2,2,0,0,3,2,1,2,0,1,3,1,1,0,1,4,1,0,1,1,2,0,0,0,0,0,5,0,4,3,0,1,0,0,0,1,0,2,2,0,1,0,0,1,2,1,1,2,1,0,0,1,2,2,1,2,2,0,1,0,2,2,0,3,2,2,1,1,0,0,0,0,1,2,2,0,0,1,2,1,1,0,1,1,1,1,0,2,0,0,2,0,0,2,2,1,1,1,1,0,2,0,2,2,1,1,0,1,0,1,0,1,1,1,1,1,2,2,0,0,1,1,0,2,1,1,2,2,1,1,1,1,1,0,1,2,0,2,1,1,1,1,0,0,0,2,1,0,1,1,2,0,0,2,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,1,0,3,0,1,1,1,1,1,1,1,1,1,0,1,1,1,4,2,2,0,1,0,0,1,1,1,0,1,0,2,1,2,0,1,1,1,2,2,0,0,1,0,1,0,0,1,1,1,1,2,1,2,1,1,0,0,0,1,0,1,0,2,1,0,0,1,1,0,4,4,1,3,2,0,1,1,1,0,2,1,0,2,0,0,2,1,0,1,1,0,1,1,2,0,2,0,1,1,0,1,1,1,0,0,2,2,2,1,2,1,1,1,0,1,0,2,0,2,0,3,0,1,2,3,2,2,0,2,0,2,0,0,0,0,1,0,2,1,0,2,0,0,1,1,2,1,1,0,1,2,3,3,2,0,1,0,0,2,0,3,1,1,1,1,0,1,0,1,2,2,2,1,0,0,0,0,0,1,0,0,0,0,2,0,0,1,0,2,1,2,1,3,1,1,0,1,2,2,1,1,0,0,3,0,3,1,0,1,0,1,1,0,3,2,1,0,1,2,1,1,1,3,1,2,1,0,1,2,1,0,2,1,1,0,3,2,0,0,2,0,2,3,1,1,1,1,2,2,3,2,0,1,0,1,5,1,1,1,1,0,1,0,2,1,0,0,2,1,1,0,0,1,2,0,1,0,0,1,1,0,1,1,1,0,0,0,1,2,4,0,0,1,4,0,1,0,0,2,1,2,1,2,1,1,2,2,0,1,1,2,1,1,0,1,2,1,3,1,1,4,0,0,1,0,1,1,0,0,0,3,1,1,0,2,1,3,1,0,1,1,0,3,1,1,1,0,0,0,0,1,1,0,1,3,0,2,1,0,2,1,1,2,2,0,2,2,3,2,0,0,2,1,1,2,1,1,3,0,0,2,1,0,1,3,1,0,1,0,1,2,0,1,0,0,0,2,1,1,1,0,1,3,1,3,1,1,2,1,1,0,1,1,1,1,2,0,2,1,0,2,0,0,3,0,1,1,2,1,0,1,0,0,1,1,1,2,2,2,3,1,3,1,0,1,2,0,1,3,0,1,0,0,1,1,1,2,1,2,0,0,0,2,0,1,0,2,3,1,1,0,4,1,1,1,3,2,2,0,1,0,0,1,0,2,2,1,0,2,3,1,1,0,0,3,1,1,0,3,0,0,0,0,1,1,2,1,2,0,0,1,0,3,0,1,1,0,2,3,1,1,1,0,0,0,0,1,1,0,1,2,0,1,1,0,2,2,1,0,2,0,1,1,1,0,0,0,0,1,0,2,1,0,0,3,0,1,1,0,0,0,0,0,2,0,1,0,1,2,0,0,0,0,0,0,2,2,0,3,4,0,1,1,0,3,3,0,0,1,1,2,0,1,1,1,1,1,1,0,0,3,0,2,1,0,2,3,1,4,2,2,1,1,1,0,0,0,3,0,0,0,0,0,2,1,0,1,1,2,1,0,1,0,3,1,1,2,0,1,0,4,3,3,2,0,1,0,0,0,1,1,0,1,0,2,2,0,0,0,1,0,2,0,3,2,2,1,0,1,0,0,1,1,1,1,0,2,1,0,0,0,1,1,1,1,1,3,1,0,0,1,0,0,1,1,2,0,1,0,2,5,0,0,1,0,0,2,1,0,2,1,0,0,1,0,0,0,1,0,1,0,1,0,1,0,0,0,1,0,1,2,1,0,0,1,2,3,1,0,0,4,0,2,1,1,0,1,0,1,0,2,3,0,1,1,2,0,0,4,1,0,1,1,0,1,2,0,4,1,0,0,0,0,1,0,2,1,1,1,0,0,0,2,2,2,1,0,1,1,0,2,1,3,1,1,0,3,0,1,3,0,1,0,0,0,0,0,0,2,0,1,1,1,0,1,1,3,2,1,0,0,0,1,0,0,0,0,0,2,0,0,0,0,1,3,1,5,1,2,0,1,0,1,1,1,1,4,1,2,0,1,1,2,0,2,3,3,4,1,3,1,2,1,0,0,1,1,2,0,1,3,2,2,0,1,2,1,1,1,0,1,1,1,0,1,1,0,2,0,0,1,0,2,0,1,0,0,3,2,0,1,0,1,1,1,1,2,2,0,1,0,3,0,0,1,0,1,0,1,1,2,3,0,0,4,0,0,1,3,1,0,0,0,1,2,0,2,1,1,1,1,0,0,0,2,4,1,1,0,3,1,2,2,3,1,0,1,1,3,2,3,1,0,1,0,2,0,0,0,0,0,4,1,0,0,0,2,0,1,0,2,0,1,0,0,0,1,1,0,1,2,1,1,0,1,2,1,2,1,0,1,0,0,0,1,0,3,1,2,0,2,1,0,0,3,3,2,1,1,1,0,0,0,0,1,2,1,2,0,1,1,1,1,0,3,1,1,0,0,2,1,0,0,2,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,3,1,0,1,1,1,1,0,1,3,0,1,0,0,3,1,1,0,0,1,0,0,2,2,1,3,2,0,1,0,1,3,1,1,0,0,0,1,0,1,1,1,1,0,0,4,2,0,0,1,2,1,0,1,1,2,2,3,4,0,1,2,0,1,1,3,1,1,0,1,1,0,1,1,2,0,0,0,0,1,0,2,1,1,2,1,0,1,3,3,1,1,0,2,1,3,0,0,1,0,0,1,1,0,1,2,3,1,0,2,0,2,0,0,0,1,1,1,0,0,0,0,1,0,2,0,3,3,1,1,0,2,0,0,1,1,1,2,0,0,1,1,0,2,1,0,1,1,2,1,2,1,0,1,0,0,1,1,1,2,1,0,2,0,2,1,2,2,2,2,1,3,1,2,1,0,1,0,1,1,0,0,0,1,0,1,0,0,0,2,0,3,1,2,2,1,1,1,1,0,0,1,2,2,0,1,1,2,1,1,1,0,2,2,2,0,0,0,0,1,0,2,1,0,0,3,0,1,1,0,1,2,0,0,2,0,0,0,2,0,0,0,2,1,1,2,0,2,0,2,0,4,1,4,1,1,1,0,1,3,1,0,0,2,1,0,0,1,3,2,0,0,1,2,1,1,1,2,1,2,0,0,1,2,0,2,1,1,2,0,0,1,0,0,0,1,1,0,1,1,1,1,2,0,0,1,2,2,1,2,2,1,2,2,1,1,1,2,2,2,0,2,4,1,0,2,1,0,0,1,0,1,2,3,1,0,0,1,1,0,0,1,1,1,0,2,1,0,2,2,1,1,0,0,0,1,1,0,2,0,3,3,3,1,0,0,1,0,1,1,0,0,2,1,1,2,0,1,2,1,0,0,1,2,1,1,0,1,2,1,1,0,1,0,1,0,0,1,3,0,0,0,2,1,1,0,3,2,0,2,1,2,2,1,0,1,1,0,2,1,2,1,0,1,3,2,0,0,0,1,0,1,2,2,3,2,1,0,4,1,1,0,1,0,1,2,2,4,0,0,2,1,1,0,1,0,1,1,2,0,0,3,0,1,1,0,0,0,0,2,1,1,0,3,0,1,2,1,0,1,3,0,1,0,1,1,1,3,1,0,1,0,1,0,1,2,2,1,1,0,0,1,0,2,0,1,0,2,0,0,2,2,0,0,0,0,0,2,2,1,2,3,1,1,0,0,3,0,2,1,1,0,0,0,0,0,2,2,0,0,1,1,0,2,2,0,1,2,3,2,1,3,1,1,2,2,1,0]},{"counters":[0,0,1,1,2,1,1,0,1,1,1,4,1,1,3,1,3,1,0,3,1,0,1,1,1,0,1,3,1,1,0,2,0,2,0,3,1,3,0,1,1,3,1,0,1,0,0,3,2,1,1,2,0,0,1,0,2,1,0,1,0,1,2,3,3,2,1,1,1,0,1,0,2,1,2,1,1,2,1,1,1,0,4,2,2,1,3,0,0,0,1,2,2,1,0,1,2,1,0,0,1,0,1,1,1,0,2,1,1,1,1,0,1,1,0,0,0,0,0,1,2,0,0,1,2,2,0,1,1,1,0,2,1,1,3,1,3,2,0,2,2,3,1,2,0,3,2,0,0,3,1,0,0,2,1,2,0,0,0,0,1,2,1,0,1,2,1,1,2,2,1,2,2,2,1,1,1,2,1,0,0,0,0,1,2,0,1,1,0,3,1,3,1,1,0,0,3,1,1,1,0,2,0,2,1,2,1,4,1,0,1,0,0,0,1,0,1,2,1,0,3,4,3,1,3,1,3,4,0,0,0,2,2,0,2,1,1,1,1,0,1,0,1,1,0,1,0,1,3,2,0,3,2,1,1,0,1,0,0,3,1,2,0,3,0,1,2,0,0,0,0,0,0,2,1,5,1,2,3,1,4,0,1,2,1,0,1,1,1,1,1,1,2,1,3,0,1,1,1,0,2,0,0,1,3,0,1,1,0,0,2,0,0,0,1,1,1,1,1,0,0,0,2,0,0,1,2,2,0,1,1,1,2,1,2,0,1,5,0,0,0,0,0,1,1,1,0,1,0,1,0,0,1,1,4,0,0,0,0,1,0,0,2,2,0,1,2,0,0,0,0,1,0,0,0,0,1,0,0,1,0,1,2,0,3,2,2,1,3,1,1,2,3,1,1,2,0,1,1,0,1,0,1,1,2,0,1,0,0,1,3,2,2,0,1,1,1,0,0,3,2,3,0,1,1,3,4,0,0,1,1,1,1,0,2,0,2,2,0,0,0,2,1,0,1,1,2,0,2,1,0,3,1,1,2,1,1,0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,1,1,1,0,0,0,1,3,1,1,0,1,1,1,0,1,1,1,3,0,3,0,2,2,0,0,2,0,0,0,2,2,0,2,3,1,1,4,3,0,1,2,0,2,0,2,0,3,1,1,3,2,0,0,1,2,1,3,3,0,2,0,1,3,1,0,0,1,0,0,2,0,0,0,2,1,2,3,0,2,2,1,1,0,2,0,1,1,0,0,0,1,0,0,0,3,1,1,1,1,1,1,0,1,1,2,2,3,0,0,2,1,0,0,1,0,1,2,1,0,1,0,2,0,0,1,3,2,1,1,0,2,0,2,2,0,1,4,3,0,4,2,0,0,0,2,2,0,2,1,1,0,2,0,0,2,1,1,0,0,1,1,0,1,0,0,1,0,0,1,1,1,0,2,1,3,0,0,0,0,0,0,0,1,0,0,1,1,1,0,1,4,1,1,0,0,0,1,4,1,0,2,1,0,1,1,0,1,0,0,3,1,1,2,0,2,1,0,0,1,4,1,3,0,2,0,2,3,1,1,2,0,0,1,0,1,0,0,1,4,3,1,1,1,2,0,0,1,1,0,2,0,0,0,1,2,0,0,2,0,0,0,3,0,2,1,0,1,1,0,1,0,1,1,2,1,1,1,1,0,3,0,1,1,0,2,0,3,1,1,0,3,0,1,0,0,1,1,2,3,1,1,1,0,1,1,1,2,0,0,0,3,1,1,0,1,1,1,1,1,1,0,1,1,1,2,1,1,1,1,2,2,2,0,1,2,0,3,0,1,0,0,1,1,0,3,2,1,2,2,1,2,2,2,2,0,3,0,0,1,0,1,1,1,0,0,0,0,3,0,0,2,1,1,0,1,1,0,0,1,1,0,0,1,2,1,0,0,1,0,0,2,2,3,0,0,1,1,1,0,1,1,2,1,1,1,1,1,0,1,2,1,3,1,0,2,1,1,3,0,2,1,1,1,1,2,2,2,0,2,0,0,0,0,0,1,0,1,2,1,2,0,0,0,1,3,1,0,0,0,1,0,2,1,1,2,1,1,1,0,0,1,0,0,1,0,1,1,0,0,2,1,1,0,0,1,0,1,0,1,1,1,2,1,1,1,1,0,0,0,1,0,0,0,1,1,0,2,0,1,0,1,1,1,0,3,1,1,1,2,0,0,2,0,1,1,1,2,0,2,2,0,1,1,2,3,0,0,0,0,1,1,2,2,0,0,2,0,0,1,2,0,2,1,0,1,1,0,1,0,0,1,0,1,1,0,3,1,1,0,1,2,1,1,0,1,0,1,2,1,1,1,0,1,1,2,0,1,1,1,0,1,0,1,1,1,3,0,3,0,1,1,0,0,2,0,2,1,0,0,2,0,0,0,1,0,2,2,1,2,1,1,3,2,0,0,0,2,2,1,1,1,2,0,0,0,2,1,2,2,0,0,1,1,0,0,1,0,0,0,1,0,2,1,1,0,0,0,1,3,1,0,2,2,1,1,0,0,1,1,2,2,0,0,0,0,0,0,1,1,2,1,0,0,0,1,1,1,0,2,4,0,0,1,0,3,1,0,0,0,0,0,2,0,1,0,1,1,0,2,1,1,2,0,1,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,3,2,1,1,1,2,1,0,1,0,0,2,1,1,0,0,1,0,1,0,0,0,1,2,1,1,1,3,0,0,1,1,1,1,0,0,0,0,0,1,2,1,0,0,0,1,0,1,0,1,1,0,0,0,1,0,1,1,1,0,0,1,2,1,2,1,0,4,2,0,1,1,1,2,0,0,1,1,1,3,0,1,1,0,0,2,2,0,0,2,0,0,2,0,2,1,1,0,0,1,1,1,3,0,1,0,2,0,3,2,2,2,1,0,2,2,2,1,1,1,0,2,2,1,0,2,0,1,1,2,0,3,0,1,2,0,1,0,2,1,3,1,1,1,1,1,2,1,0,0,1,2,0,0,1,0,1,2,0,0,0,2,1,0,1,0,0,1,1,0,0,0,2,2,3,1,1,0,0,2,3,1,3,0,1,0,0,2,1,1,1,2,0,0,1,0,1,1,2,0,0,2,0,0,2,0,0,1,4,1,0,3,1,3,1,1,0,2,1,1,2,1,1,2,0,1,1,2,3,1,3,0,2,1,4,1,2,2,1,0,2,1,3,1,2,1,1,0,1,1,2,1,2,0,0,3,1,2,1,0,1,2,3,4,1,2,3,0,0,2,3,1,0,0,2,1,1,0,0,1,0,3,2,1,0,0,0,0,0,0,1,1,2,2,0,0,1,1,0,2,1,2,5,1,0,0,0,1,1,0,1,0,1,0,0,2,0,0,1,1,0,0,0,1,0,1,1,2,0,2,1,2,1,1,0,4,2,1,0,4,1,1,0,1,1,2,0,0,0,1,0,0,1,1,0,0,0,2,2,0,0,1,1,0,1,0,1,0,0,2,3,2,0,1,2,2,0,0,0,1,1,1,2,1,1,0,1,1,1,4,0,1,1,4,0,1,1,1,2,1,1,1,1,2,1,1,1,2,1,0,0,1,3,1,1,1,1,1,0,0,1,1,0,1,1,0,1,3,0,0,2,2,2,1,1,0,0,0,0,0,0,1,0,1,1,3,0,1,0,0,0,0,1,1,1,3,3,0,1,0,0,0,3,3,1,0,1,2,1,0,2,0,0,0,0,0,0,1,2,0,0,3,1,1,0,1,0,3,1,1,0,2,1,0,0,0,0,1,1,3,0,0,3,0,4,1,0,1,2,1,1,0,0,0,0,3,2,1,0,1,1,1,1,1,2,1,1,2,2,1,0,1,1,0,0,0,0,0,2,0,1,1,2,0,1,1,2,1,1,0,2,1,2,1,2,1,1,1,1,0,2,2,0,1,1,0,0,2,3,1,1,0,3,0,0,1,0,1,3,2,2,1,1,0,0,1,1,2,2,0,0,2,0,1,0,0,2,1,0,1,2,1,0,1,1,3,0,3,0,2,0,2,0,0,1,0,1,0,1,2,1,0,2,0,0,0,1,1,1,2,0,0,3,1,0,3,3,1,0,3,1,1,4,1,2,1,0,2,0,1,3,1,0,2,1,2,2,0,1,1,0,1,2,0,0,0,0,1,0,1,2,2,1,3,0,1,0,1,2,1,2,2,0,0,0,2,0,3,0,0,1,1,1,2,2,0,1,1,1,1,0,2,2,1,0,0,3,1,0,2,2,1,1,1,0,1,2,0,4,1,2,1,1,1,2,1,2,1,1,0,2,3,2,0,1,1,0,3,2,1,2,1,1,1,1,0,1,1,2,0,2,0,0,2,1,1,0,2,0,1,0,0,0,1,2,1,0,3,1,0,0,0,0,1,0,1,3,1,0,0,1,0,1,0,2,0,0,0,1,1,2,1,1,2,0,1,3,1,0,2,2,0,1,0,1,1,1,1,1,0,2,1,0,0,1,0,0,2,4,0,0,0,1,0,1,0,1,2,1,2,0,0,0,0,0,0,1,1,1,0,0,1,0,1,0,2,0,1,1,0,0,0,1]},{"counters":[2,0,0,0,1,0,1,2,1,0,2,1,1,1,1,0,0,5,2,0,0,0,0,1,0,1,1,1,0,1,1,1,1,1,2,1,1,4,6,2,0,1,2,3,1,2,3,2,1,2,0,0,1,2,0,1,1,1,1,2,2,0,3,0,0,0,1,2,3,0,0,0,1,3,1,2,3,0,0,1,1,1,0,2,1,1,1,1,1,0,0,1,0,1,0,0,3,1,1,2,1,0,1,0,0,0,1,1,0,1,1,0,1,0,1,2,0,0,0,0,2,0,1,1,0,0,1,1,4,0,1,1,1,1,2,1,0,2,1,0,3,2,0,0,1,0,2,1,0,2,2,4,0,0,1,0,2,1,1,0,1,0,1,2,3,0,0,1,1,0,0,0,2,0,1,1,0,2,0,2,2,0,1,0,1,1,1,1,1,1,1,1,1,3,1,2,3,0,1,0,1,0,1,1,2,1,1,0,1,1,3,1,0,1,1,3,1,0,1,0,0,0,0,0,1,0,2,1,0,0,0,0,0,1,1,1,0,0,1,2,1,0,2,0,2,0,0,2,1,3,0,1,1,2,1,0,2,1,1,1,2,3,2,0,0,2,1,0,1,0,0,3,1,1,0,0,0,1,0,0,0,2,1,2,1,2,0,3,3,0,1,0,0,2,0,3,0,1,1,1,0,2,0,1,1,0,0,1,4,1,0,1,1,1,0,2,0,0,0,2,1,0,0,1,1,1,0,0,1,1,0,3,0,0,0,0,2,3,1,1,1,1,2,0,1,0,2,1,3,1,2,1,1,0,1,0,1,1,3,3,0,1,2,1,0,0,0,1,0,2,0,1,1,0,1,2,1,0,1,1,2,0,2,2,0,2,3,2,1,0,3,1,0,1,1,0,1,0,1,2,0,0,0,1,0,0,0,1,0,1,1,1,0,0,1,2,0,0,2,2,1,0,0,5,1,1,2,1,0,1,0,3,1,1,0,2,0,1,0,1,0,0,0,3,0,1,2,0,3,0,2,1,1,2,1,1,0,2,1,1,1,0,0,1,1,0,0,1,0,0,0,2,2,2,1,4,0,0,0,2,1,0,2,1,0,0,1,2,2,2,1,2,0,0,0,0,0,1,1,3,0,0,1,1,3,1,1,2,0,0,0,0,4,1,2,1,1,1,1,1,0,1,0,1,1,0,0,0,0,0,0,0,1,0,1,2,2,0,3,0,1,3,0,1,1,2,0,0,1,1,2,0,0,1,1,2,1,0,2,0,0,0,1,1,0,0,0,0,2,2,0,1,0,0,1,4,0,0,2,0,2,0,2,1,0,0,0,1,1,0,0,0,4,1,0,1,1,0,1,0,1,0,3,0,0,0,0,0,1,0,2,2,1,1,2,3,0,4,1,1,0,0,0,2,0,1,1,3,2,2,2,2,2,1,1,3,1,2,1,2,0,1,0,0,0,3,2,3,1,1,0,2,0,0,2,0,2,2,0,0,0,2,3,2,1,0,1,0,1,1,2,3,0,1,0,1,1,0,2,0,2,1,2,0,1,1,1,2,1,0,2,0,1,1,1,1,1,1,0,2,0,0,1,2,0,4,1,0,0,4,2,1,1,1,0,1,1,2,0,1,0,0,2,2,0,2,1,1,2,1,1,0,2,0,0,2,0,0,0,0,0,3,2,3,1,2,0,2,0,0,2,2,2,0,1,1,1,1,0,0,0,0,0,2,0,2,0,0,1,1,2,0,0,2,1,1,0,0,1,1,2,1,3,1,0,1,2,1,0,0,2,1,1,4,1,0,1,1,0,2,0,0,2,0,1,0,2,2,0,0,3,2,1,0,0,2,2,0,0,1,1,0,0,1,0,0,4,0,0,2,0,0,1,3,0,1,0,0,1,0,1,2,2,2,2,0,2,1,1,0,2,4,1,0,1,3,1,1,0,4,0,1,0,2,2,2,0,2,1,2,0,0,0,1,0,1,1,0,1,0,1,2,2,0,2,0,0,2,2,1,3,1,0,1,2,2,0,1,1,1,0,0,0,2,1,2,1,4,3,0,1,1,2,2,1,3,1,0,3,2,1,1,0,1,2,0,0,0,0,2,1,3,1,1,1,1,1,0,0,0,0,0,1,1,0,0,0,2,2,0,0,2,1,1,0,0,3,1,0,1,0,2,1,0,0,0,4,1,2,1,0,1,1,1,1,0,1,1,3,0,2,0,1,1,2,1,0,2,0,0,0,2,2,1,0,1,0,0,0,0,2,1,2,1,1,0,0,0,0,0,0,1,2,1,0,0,1,1,0,2,1,0,0,2,1,0,1,0,0,0,1,0,2,1,0,0,1,2,1,0,2,2,0,0,2,0,1,0,0,2,2,0,3,2,0,0,1,0,0,1,0,2,0,3,1,2,1,1,2,1,0,3,1,1,0,2,2,2,1,0,1,3,2,2,2,0,2,1,0,1,3,1,0,2,2,1,0,1,0,2,0,2,2,1,3,3,2,1,1,2,1,0,3,0,2,2,2,0,1,1,1,2,0,1,2,2,2,0,0,0,1,0,2,1,2,3,1,0,1,0,1,3,0,0,0,1,1,0,0,1,2,0,0,4,0,0,0,2,1,0,2,2,0,1,1,0,0,0,0,0,0,2,1,1,1,1,1,1,2,0,2,1,0,0,0,2,0,0,1,1,3,0,0,2,1,0,2,0,1,0,4,0,4,0,0,1,1,1,0,0,3,0,4,1,1,0,1,3,0,0,0,0,0,2,1,1,1,1,0,0,2,1,1,2,1,3,1,1,0,2,1,1,1,1,0,1,1,0,0,3,0,0,0,0,2,0,1,0,1,0,1,1,1,2,1,0,3,2,0,2,1,2,0,1,0,1,1,3,0,1,1,1,0,1,1,1,1,0,0,0,1,0,2,1,1,1,2,0,0,0,1,0,0,2,3,3,0,1,2,2,1,3,0,3,0,2,1,4,0,2,1,0,2,1,4,1,3,1,1,3,1,4,0,0,0,0,4,0,1,2,4,0,2,0,3,1,1,0,1,1,1,1,0,1,0,1,0,0,1,1,2,1,0,0,0,0,3,0,0,3,0,0,1,3,0,1,0,0,0,2,1,0,0,0,1,0,0,0,0,2,0,0,2,0,1,2,0,0,1,2,1,0,1,1,1,0,3,3,0,0,0,1,0,1,0,0,1,1,0,1,1,2,3,3,2,2,0,1,0,0,2,1,1,0,0,0,1,1,3,2,1,1,0,1,0,1,1,2,2,1,1,0,0,0,0,2,1,2,1,0,1,2,3,2,0,0,1,1,0,0,3,1,0,0,0,2,0,0,2,0,4,2,0,1,1,2,0,0,1,0,1,0,1,2,1,1,1,2,1,1,0,2,3,1,0,0,0,0,1,1,2,0,3,1,0,1,0,0,2,4,1,0,0,2,0,1,1,0,0,1,1,3,0,0,0,3,2,0,1,2,0,2,1,2,1,1,1,3,0,1,0,2,0,0,2,2,2,2,2,0,2,0,1,2,0,1,2,5,0,1,0,2,2,0,4,0,2,3,0,0,0,2,1,1,2,0,2,0,0,1,2,0,1,1,2,2,3,1,2,3,3,0,0,0,1,0,0,0,1,2,2,0,1,1,1,2,0,2,2,2,3,1,0,0,1,3,0,2,3,1,1,3,1,3,0,0,2,3,0,1,0,0,0,2,1,1,2,2,1,1,0,0,1,3,2,1,0,0,0,1,0,1,0,1,3,0,1,2,4,0,3,0,1,2,1,4,2,2,0,0,1,0,2,0,2,1,3,0,0,0,3,2,1,3,0,1,0,1,1,2,0,1,0,4,1,2,1,0,0,2,0,0,0,0,3,2,1,2,2,0,0,1,0,0,2,0,1,0,0,1,0,1,0,0,1,0,1,0,2,0,2,2,0,2,0,0,1,0,1,0,0,0,1,0,2,1,1,1,0,2,0,0,1,0,0,4,0,3,0,1,1,1,3,0,0,1,0,0,0,1,1,2,0,1,1,0,1,2,0,1,2,3,2,0,1,1,0,1,3,0,0,0,0,2,2,1,0,0,0,0,0,3,0,1,2,1,0,0,0,1,0,0,1,3,1,1,1,0,0,1,2,0,0,3,0,1,0,0,0,1,0,0,0,1,1,0,0,0,1,1,2,1,0,1,1,2,1,0,2,1,2,1,0,0,1,4,2,0,1,0,1,1,1,2,0,2,0,0,0,1,0,1,2,2,1,0,0,2,1,1,2,0,0,2,2,1,0,1,0,2,3,1,0,1,0,2,1,1,1,1,2,1,0,0,3,1,1,0,1,0,0,2,1,0,2,0,3,3,1,0,0,1,1,1,3,0,3,0,0,1,3,0,2,0,0,2,0,2,0,0,1,1,0,0,0,0,0,1,0,1,0,1,1,1,1,0,1,2,1,2,1,2,0,1,0,0,1,0,1,2,1,1,0,0,0,0,1,0,1,1,1,2,2,1,1,0,0,3,1,0,0,1,1,4,0,1,0,0,1,1,0,0,1,1,1,2,1,0,2,0,2,1,1,0,2,1,0,1,1,2,0,0,4,2,3,2,1,1,1,1,1,2,0,1,1,2,1,1]}]},"null_count":0,"last_update_version":397952045772439552}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_003.json b/cmd/explaintest/s/explain_complex_stats_tbl_003.json deleted file mode 100644 index ae645f7f1f8b4..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_003.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_003","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDQ5Njc4MzM=","upper_bound":"LTIxMzU2NTk1MzE=","repeats":1},{"count":16,"lower_bound":"LTIxMzQ0MjcyNjk=","upper_bound":"LTIxMjU2NjUyNjI=","repeats":1},{"count":24,"lower_bound":"LTIxMjM2OTgwNzM=","upper_bound":"LTIxMTExNzk5NDY=","repeats":1},{"count":32,"lower_bound":"LTIxMDc3NzA4Njg=","upper_bound":"LTIwODc5Mzg2NTk=","repeats":1},{"count":40,"lower_bound":"LTIwODM2MzUxODc=","upper_bound":"LTIwNzQ2ODAwMzI=","repeats":1},{"count":48,"lower_bound":"LTIwNzIyMzEwNzg=","upper_bound":"LTIwNjc3MTUyNzI=","repeats":1},{"count":56,"lower_bound":"LTIwNjQzMDg3Mjg=","upper_bound":"LTIwMzY5MjgyMjE=","repeats":1},{"count":64,"lower_bound":"LTIwMzQzNTA2MDg=","upper_bound":"LTIwMjY0MjU0MTk=","repeats":1},{"count":72,"lower_bound":"LTIwMjQ4OTM0NzM=","upper_bound":"LTIwMDc3MTEzMjg=","repeats":1},{"count":80,"lower_bound":"LTIwMDc1NTU4NDM=","upper_bound":"LTE5OTgwODMyNDA=","repeats":1},{"count":88,"lower_bound":"LTE5ODcxNzAwMzQ=","upper_bound":"LTE5NzgxOTE3MDk=","repeats":1},{"count":96,"lower_bound":"LTE5NzgwNTY5MTM=","upper_bound":"LTE5NjM5NzkyMTk=","repeats":1},{"count":104,"lower_bound":"LTE5NTcwODM0ODg=","upper_bound":"LTE5NDI3MTMxOTc=","repeats":1},{"count":112,"lower_bound":"LTE5NDIzOTQwMzQ=","upper_bound":"LTE5Mjk1OTY4MDE=","repeats":1},{"count":120,"lower_bound":"LTE5MjgwMjg0NTc=","upper_bound":"LTE5MjI3NDAxMjU=","repeats":1},{"count":128,"lower_bound":"LTE5MTM0ODQzMzc=","upper_bound":"LTE4OTk1NTM4NDA=","repeats":1},{"count":136,"lower_bound":"LTE4OTg5NTYzNzE=","upper_bound":"LTE4ODI5MjM3MjY=","repeats":1},{"count":144,"lower_bound":"LTE4ODI0MDE0MDk=","upper_bound":"LTE4NjkyMTQ3Njk=","repeats":1},{"count":152,"lower_bound":"LTE4NjgxMjMwNjI=","upper_bound":"LTE4NDY0MzUwNjM=","repeats":1},{"count":160,"lower_bound":"LTE4NDU5MjA3NDA=","upper_bound":"LTE4MjQzNDkwNjQ=","repeats":1},{"count":168,"lower_bound":"LTE4MTU4NDQ5NzM=","upper_bound":"LTE3OTcyOTUxNjE=","repeats":1},{"count":176,"lower_bound":"LTE3ODEwNDg5MzQ=","upper_bound":"LTE3NzM0Mzc4MDY=","repeats":1},{"count":184,"lower_bound":"LTE3NzIwMTA4NDk=","upper_bound":"LTE3NDU4MzY3OTQ=","repeats":1},{"count":192,"lower_bound":"LTE3NDMxNzU1MjA=","upper_bound":"LTE3NDE0MjU4MjI=","repeats":1},{"count":200,"lower_bound":"LTE3MzgwMjgzODc=","upper_bound":"LTE3MjU1MDg5NTY=","repeats":1},{"count":208,"lower_bound":"LTE3MjM2NTExODg=","upper_bound":"LTE2OTg1Mjk2NDE=","repeats":1},{"count":216,"lower_bound":"LTE2OTM5MjEwOTM=","upper_bound":"LTE2Nzc1MDkxMDY=","repeats":1},{"count":224,"lower_bound":"LTE2NjkwNzU4MzQ=","upper_bound":"LTE2NjE4MzA4MDI=","repeats":1},{"count":232,"lower_bound":"LTE2NTUyNjE0OTk=","upper_bound":"LTE2NDUwOTQ5MzI=","repeats":1},{"count":240,"lower_bound":"LTE2NDM0NTI4MDE=","upper_bound":"LTE2Mzk3NjM0MDM=","repeats":1},{"count":248,"lower_bound":"LTE2Mzc0NTYyNTU=","upper_bound":"LTE2MTk2MTAzNTY=","repeats":1},{"count":256,"lower_bound":"LTE2MDgyNTMzMjM=","upper_bound":"LTE1OTg1NDg0MzU=","repeats":1},{"count":264,"lower_bound":"LTE1OTMwNDEwNTE=","upper_bound":"LTE1Njc5MzExOTQ=","repeats":1},{"count":272,"lower_bound":"LTE1NjM3NzgyNjg=","upper_bound":"LTE1NTY3ODE4Nzg=","repeats":1},{"count":280,"lower_bound":"LTE1NTQ2OTc3NTM=","upper_bound":"LTE1MzcyMzQ1MDI=","repeats":1},{"count":288,"lower_bound":"LTE1MzI0NzM3MzE=","upper_bound":"LTE1MjMxNTQyOTA=","repeats":1},{"count":296,"lower_bound":"LTE1MjExMzQ0NzQ=","upper_bound":"LTE1MDk5MjEyOTc=","repeats":1},{"count":304,"lower_bound":"LTE1MDc4MTg5OTI=","upper_bound":"LTE0OTQ4MDQ5MjA=","repeats":1},{"count":312,"lower_bound":"LTE0OTI4NzUyNTM=","upper_bound":"LTE0NzczNjEzNjg=","repeats":1},{"count":320,"lower_bound":"LTE0NjY3NjU2OTE=","upper_bound":"LTE0NTk3Mzk5MzE=","repeats":1},{"count":328,"lower_bound":"LTE0NTkyNjE3NzU=","upper_bound":"LTE0NTEzODc1MDM=","repeats":1},{"count":336,"lower_bound":"LTE0NTA4NTY5MTA=","upper_bound":"LTE0MzMxODg5MjU=","repeats":1},{"count":344,"lower_bound":"LTE0MjY4MTc1NzM=","upper_bound":"LTE0MTI2NzI3NjM=","repeats":1},{"count":352,"lower_bound":"LTE0MTE2NDc5Njc=","upper_bound":"LTEzOTc4NzQ2Nzg=","repeats":1},{"count":360,"lower_bound":"LTEzODg2MjgxMjU=","upper_bound":"LTEzNjUwODIzMzU=","repeats":1},{"count":368,"lower_bound":"LTEzNjQ3NjY2Mzc=","upper_bound":"LTEzNTI4NzA4Njc=","repeats":1},{"count":376,"lower_bound":"LTEzNDkzODY5NDQ=","upper_bound":"LTEzNDUxMDE0MzI=","repeats":1},{"count":384,"lower_bound":"LTEzMzgwNTM1NDI=","upper_bound":"LTEzMTk0NTY5MDk=","repeats":1},{"count":392,"lower_bound":"LTEzMTg1NTY1NTY=","upper_bound":"LTEzMDk4MzI4NTI=","repeats":1},{"count":400,"lower_bound":"LTEzMDU5NDYyODk=","upper_bound":"LTEyODg1NzEzNDg=","repeats":1},{"count":408,"lower_bound":"LTEyODc4MzU1ODg=","upper_bound":"LTEyNzU4MDc2NTk=","repeats":1},{"count":416,"lower_bound":"LTEyNzUzMjY0MjU=","upper_bound":"LTEyNTQ4NjA3ODQ=","repeats":1},{"count":424,"lower_bound":"LTEyMzk1ODkyMjk=","upper_bound":"LTEyMTg0OTUzNDg=","repeats":1},{"count":432,"lower_bound":"LTEyMTc1MDI1ODI=","upper_bound":"LTEyMDg4ODk3NzY=","repeats":1},{"count":440,"lower_bound":"LTEyMDQ5MTM0Nzk=","upper_bound":"LTExODI5MDA3NzA=","repeats":1},{"count":448,"lower_bound":"LTExNzQ5MzQ0OTE=","upper_bound":"LTExNjQxNzE1ODI=","repeats":1},{"count":456,"lower_bound":"LTExNjE5OTA0MDc=","upper_bound":"LTExNTIxMTMzODY=","repeats":1},{"count":464,"lower_bound":"LTExNDcxMjM3ODE=","upper_bound":"LTExMzIxNzI5NDU=","repeats":1},{"count":472,"lower_bound":"LTExMjg5NTk5NTg=","upper_bound":"LTEwOTc5Mjg1MDg=","repeats":1},{"count":480,"lower_bound":"LTEwOTY4MTc0ODE=","upper_bound":"LTEwOTM2NzM5OTE=","repeats":1},{"count":488,"lower_bound":"LTEwOTAzNDkyMzY=","upper_bound":"LTEwNzA4NDA2OTA=","repeats":1},{"count":496,"lower_bound":"LTEwNjgwMzcwODk=","upper_bound":"LTEwNDQ1OTA2ODI=","repeats":1},{"count":504,"lower_bound":"LTEwNDEyNTE2NTY=","upper_bound":"LTEwMzA2MjU5OTM=","repeats":1},{"count":512,"lower_bound":"LTEwMzAxMjUwNzE=","upper_bound":"LTEwMjQ4MTI3OTA=","repeats":1},{"count":520,"lower_bound":"LTEwMjI0MjM0Nzg=","upper_bound":"LTEwMTA4ODYwODk=","repeats":1},{"count":528,"lower_bound":"LTEwMDYzNzQyMzQ=","upper_bound":"LTk5NjI3MTI3NQ==","repeats":1},{"count":536,"lower_bound":"LTk5MjY5NzEyNw==","upper_bound":"LTk3Nzg2Mzg3Ng==","repeats":1},{"count":544,"lower_bound":"LTk3MTgwNjIxNg==","upper_bound":"LTk2MjczMDI5Mw==","repeats":1},{"count":552,"lower_bound":"LTk1NzA1MDAzNg==","upper_bound":"LTk0NTE0NDUzNQ==","repeats":1},{"count":560,"lower_bound":"LTk0MTk5MDUwMg==","upper_bound":"LTkzMjQ3MDgwMw==","repeats":1},{"count":568,"lower_bound":"LTkzMTY5MjM0NA==","upper_bound":"LTkxNzE1NzE2NA==","repeats":1},{"count":576,"lower_bound":"LTkxNjU4NDMwOA==","upper_bound":"LTkxMTcyMjY0MQ==","repeats":1},{"count":584,"lower_bound":"LTkxMTMxMzIyMg==","upper_bound":"LTg5NDU4MDQxNg==","repeats":1},{"count":592,"lower_bound":"LTg4OTQxNjEyOQ==","upper_bound":"LTg1NTk4MjM2Mg==","repeats":1},{"count":600,"lower_bound":"LTg0MTU4OTMwNA==","upper_bound":"LTgyOTU3MDA0MA==","repeats":1},{"count":608,"lower_bound":"LTgyMjA3OTQyNQ==","upper_bound":"LTgxNzQwODA3OQ==","repeats":1},{"count":616,"lower_bound":"LTgwMjIyOTU4Mg==","upper_bound":"LTc4ODk2MzA5Mw==","repeats":1},{"count":624,"lower_bound":"LTc4ODg4OTg2OA==","upper_bound":"LTc4MDE4MDE3MQ==","repeats":1},{"count":632,"lower_bound":"LTc2Nzc1MjgwNQ==","upper_bound":"LTc1NDIxMTYyMA==","repeats":1},{"count":640,"lower_bound":"LTc1MTQ0MzkxOA==","upper_bound":"LTc0MDYxNDQ3OA==","repeats":1},{"count":648,"lower_bound":"LTczOTUxMjI3Ng==","upper_bound":"LTczNTk2MTgzNw==","repeats":1},{"count":656,"lower_bound":"LTcyMTU5NDQ3Nw==","upper_bound":"LTcwODgxNzM1NA==","repeats":1},{"count":664,"lower_bound":"LTcwNDk2NzU4OA==","upper_bound":"LTcwMTY3ODYwNA==","repeats":1},{"count":672,"lower_bound":"LTcwMDIyNzk1OA==","upper_bound":"LTY4Mzg3NjM2NQ==","repeats":1},{"count":680,"lower_bound":"LTY4MTQxOTk4OA==","upper_bound":"LTY2OTI1MjQ0NA==","repeats":1},{"count":688,"lower_bound":"LTY2MjI5MzIzNg==","upper_bound":"LTY0OTM3NzEzNA==","repeats":1},{"count":696,"lower_bound":"LTY0ODQ0Nzk3OQ==","upper_bound":"LTYzNDY1NjI2MA==","repeats":1},{"count":704,"lower_bound":"LTYzMzMyODYzNA==","upper_bound":"LTYyNTkzNTY1MQ==","repeats":1},{"count":712,"lower_bound":"LTYyNDU3MTYxNA==","upper_bound":"LTYxNjIxMTE0Ng==","repeats":1},{"count":720,"lower_bound":"LTYwNTI3ODczNA==","upper_bound":"LTU5NzkxMzMyMA==","repeats":1},{"count":728,"lower_bound":"LTU5NTE1NDc4Mg==","upper_bound":"LTU3OTcwMDM3Ng==","repeats":1},{"count":736,"lower_bound":"LTU3NzY1ODI2Mg==","upper_bound":"LTU2OTg2Mjc5NA==","repeats":1},{"count":744,"lower_bound":"LTU2NjQ3MDQ4OA==","upper_bound":"LTU1NDM1NjI0MA==","repeats":1},{"count":752,"lower_bound":"LTUzNzY3NDI3OA==","upper_bound":"LTUyNjM0NzgyNg==","repeats":1},{"count":760,"lower_bound":"LTUyMzA0MTA5OQ==","upper_bound":"LTUxMzU2NDg3Ng==","repeats":1},{"count":768,"lower_bound":"LTQ5NzI2NTY1Mg==","upper_bound":"LTQ4NjA2NzczNg==","repeats":1},{"count":776,"lower_bound":"LTQ4Mzk3NzE5MA==","upper_bound":"LTQ3NDUyNjc3NQ==","repeats":1},{"count":784,"lower_bound":"LTQ2NDE2MDkyOA==","upper_bound":"LTQ0NzgyODc4OA==","repeats":1},{"count":792,"lower_bound":"LTQzNzU1NTE1Mw==","upper_bound":"LTQyMzU3NjYxMg==","repeats":1},{"count":800,"lower_bound":"LTQyMDA0MjgxMQ==","upper_bound":"LTQwNTA5NjE3NA==","repeats":1},{"count":808,"lower_bound":"LTM5ODU5NzE0NQ==","upper_bound":"LTM5MDg3MDkzMQ==","repeats":1},{"count":816,"lower_bound":"LTM4OTU5MTA2OA==","upper_bound":"LTM2NjQ2NzEwNg==","repeats":1},{"count":824,"lower_bound":"LTM2MTkyMzE4Mg==","upper_bound":"LTM0NjE4MDQ5Ng==","repeats":1},{"count":832,"lower_bound":"LTM0NTY2NzgxNQ==","upper_bound":"LTMxNzY2Nzc1OA==","repeats":1},{"count":840,"lower_bound":"LTMxNzQ5MTI0Mw==","upper_bound":"LTI5ODgxMjU5OQ==","repeats":1},{"count":848,"lower_bound":"LTI4NzQzODkyMA==","upper_bound":"LTI3NjM2NjE3OQ==","repeats":1},{"count":856,"lower_bound":"LTI3MzA0NTUzOQ==","upper_bound":"LTI2MjcyMTcwNg==","repeats":1},{"count":864,"lower_bound":"LTI2MDkwMTUxMw==","upper_bound":"LTI0MTUwNTY5Mg==","repeats":1},{"count":872,"lower_bound":"LTI0MTMyMTM0OQ==","upper_bound":"LTIzMjcyMjQ0MA==","repeats":1},{"count":880,"lower_bound":"LTIyODM0NjA0Mw==","upper_bound":"LTIyMjEzNzAwOQ==","repeats":1},{"count":888,"lower_bound":"LTIyMTMzMTU2NQ==","upper_bound":"LTIwODU3NzA4Nw==","repeats":1},{"count":896,"lower_bound":"LTE5MDE3MDkzMA==","upper_bound":"LTE3ODc5NDA0NA==","repeats":1},{"count":904,"lower_bound":"LTE2OTIyNTc1OQ==","upper_bound":"LTE1ODYxMjkxMA==","repeats":1},{"count":912,"lower_bound":"LTE1MDg2MzI3Ng==","upper_bound":"LTE0NTg5NTUyMw==","repeats":1},{"count":920,"lower_bound":"LTEzODEwNTczNg==","upper_bound":"LTEzMjAyNTUxMg==","repeats":1},{"count":928,"lower_bound":"LTEyNDQ3ODYwMw==","upper_bound":"LTExMDE0MzE4Ng==","repeats":1},{"count":936,"lower_bound":"LTEwOTc3NDU0Ng==","upper_bound":"LTEwNTIzMzY5NA==","repeats":1},{"count":944,"lower_bound":"LTEwMjYwMjE2OQ==","upper_bound":"LTkxNTA3MDg4","repeats":1},{"count":952,"lower_bound":"LTg3Mjc3MTk0","upper_bound":"LTc0MTgyMTg0","repeats":1},{"count":960,"lower_bound":"LTY4NDcxNjQ5","upper_bound":"LTU3NTM4NjA1","repeats":1},{"count":968,"lower_bound":"LTUyOTM0MTY1","upper_bound":"LTQ0MTQ3ODI4","repeats":1},{"count":976,"lower_bound":"LTQzMjQzMjAy","upper_bound":"LTI4NzMwOTUx","repeats":1},{"count":984,"lower_bound":"LTI4MjY4OTA3","upper_bound":"LTE2NDY5NjU4","repeats":1},{"count":992,"lower_bound":"LTE0ODY4Njc2","upper_bound":"LTEyNjQzNzQ=","repeats":1},{"count":1000,"lower_bound":"MjI0MDc1Ng==","upper_bound":"MTEzNDA1ODQ=","repeats":1},{"count":1008,"lower_bound":"MTE4MDU0MDg=","upper_bound":"MjExMDg5Mzk=","repeats":1},{"count":1016,"lower_bound":"MjMyNTEwOTU=","upper_bound":"Mjg0MDA0NDQ=","repeats":1},{"count":1024,"lower_bound":"Mjk1NTE0Mjc=","upper_bound":"NDI2NTMyNzU=","repeats":1},{"count":1032,"lower_bound":"NDQ0Nzk5Mzg=","upper_bound":"Njg4MTg2OTU=","repeats":1},{"count":1040,"lower_bound":"NjkyMzQ2NDU=","upper_bound":"NzgyMzk0NDQ=","repeats":1},{"count":1048,"lower_bound":"ODI1NTEzNTU=","upper_bound":"MTE0MjQxNjYw","repeats":1},{"count":1056,"lower_bound":"MTE1MDMwNDY2","upper_bound":"MTI2OTUwNzgx","repeats":1},{"count":1064,"lower_bound":"MTMxNTQ1MDEx","upper_bound":"MTM3MzcwNjEx","repeats":1},{"count":1072,"lower_bound":"MTQwMjc1Nzcw","upper_bound":"MTQ4Njc3ODU0","repeats":1},{"count":1080,"lower_bound":"MTUyNTg4ODIy","upper_bound":"MTY5NzcwMzk3","repeats":1},{"count":1088,"lower_bound":"MTc5NjAzOTgy","upper_bound":"MTg3NDQ4MDcw","repeats":1},{"count":1096,"lower_bound":"MTg4NDIzOTA0","upper_bound":"MTkzMDE2NDUy","repeats":1},{"count":1104,"lower_bound":"MTkzMTk0OTMx","upper_bound":"MjA5OTY2NTY4","repeats":1},{"count":1112,"lower_bound":"MjEwODU3MDQx","upper_bound":"MjIxNjMwMDgy","repeats":1},{"count":1120,"lower_bound":"MjIyOTU3ODQw","upper_bound":"MjQ3MTA0Mzg4","repeats":1},{"count":1128,"lower_bound":"MjUzOTc2NzIw","upper_bound":"MjY4MDE5Njk0","repeats":1},{"count":1136,"lower_bound":"MjY5MTYwMTgx","upper_bound":"Mjg0NTY4NDk2","repeats":1},{"count":1144,"lower_bound":"Mjg0Nzc3ODUw","upper_bound":"MjkwMTczNjM2","repeats":1},{"count":1152,"lower_bound":"MjkwNzkxODAw","upper_bound":"MzAwNjA0Nzk1","repeats":1},{"count":1160,"lower_bound":"MzAyMTg3NDUw","upper_bound":"MzE0NzM0MzE0","repeats":1},{"count":1168,"lower_bound":"MzE3MzU1MTgw","upper_bound":"MzIxNjEwNjY2","repeats":1},{"count":1176,"lower_bound":"MzIxODc5NjI5","upper_bound":"MzMxNjM5MDk4","repeats":1},{"count":1184,"lower_bound":"MzM2MDEwNzg2","upper_bound":"MzQ2NzM1Njg5","repeats":1},{"count":1192,"lower_bound":"MzQ4OTUzNjI1","upper_bound":"MzY3NTkyOTE3","repeats":1},{"count":1200,"lower_bound":"MzY4MTExMzQw","upper_bound":"Mzk1NDk3Mjgw","repeats":1},{"count":1208,"lower_bound":"Mzk5NTc5OTYy","upper_bound":"NDEyMDM3NjY4","repeats":1},{"count":1216,"lower_bound":"NDEzNTQ5NjUz","upper_bound":"NDE2NTU1MjYx","repeats":1},{"count":1224,"lower_bound":"NDE3NTgwNjE1","upper_bound":"NDI2NTQzMjI1","repeats":1},{"count":1232,"lower_bound":"NDI2ODQ3MDU3","upper_bound":"NDM0NzA4NjYw","repeats":1},{"count":1240,"lower_bound":"NDM1MjgzNTM0","upper_bound":"NDU1MTI4NjQ3","repeats":1},{"count":1248,"lower_bound":"NDU1NDM1MTc1","upper_bound":"NDU3NzYzNjMy","repeats":1},{"count":1256,"lower_bound":"NDY5MDg1MTU4","upper_bound":"NDg3OTQwNTg2","repeats":1},{"count":1264,"lower_bound":"NDg5NDg3NjM3","upper_bound":"NTA3NjgxNzgz","repeats":1},{"count":1272,"lower_bound":"NTE2NzQ1NDY5","upper_bound":"NTI5ODUxNjMz","repeats":1},{"count":1280,"lower_bound":"NTMwNjMxMTcz","upper_bound":"NTQ3NTIyMTY1","repeats":1},{"count":1288,"lower_bound":"NTQ4OTQxMzIz","upper_bound":"NTU1NTg3Mzk3","repeats":1},{"count":1296,"lower_bound":"NTcyNDE5NzU5","upper_bound":"NTkyODgxOTI5","repeats":1},{"count":1304,"lower_bound":"NTk4ODgwOTQz","upper_bound":"NjE2Mjc4NjI0","repeats":1},{"count":1312,"lower_bound":"NjE2NDczMjc1","upper_bound":"NjMzMzQ5MjU4","repeats":1},{"count":1320,"lower_bound":"NjQ0ODAyNDY3","upper_bound":"NjUyNDA1ODA5","repeats":1},{"count":1328,"lower_bound":"NjU3OTExMzM3","upper_bound":"Njc0NzczMDY1","repeats":1},{"count":1336,"lower_bound":"Njc4NzMxODUz","upper_bound":"Njg5NDQ3NTQ1","repeats":1},{"count":1344,"lower_bound":"NjkwOTE0MDcw","upper_bound":"Njk1Nzg2ODU1","repeats":1},{"count":1352,"lower_bound":"Njk5NDk5MTE3","upper_bound":"NzA3NDQ0NTEy","repeats":1},{"count":1360,"lower_bound":"NzIwNzE1MDE2","upper_bound":"NzM1NjQ2MTQy","repeats":1},{"count":1368,"lower_bound":"NzM5MDMzNTQw","upper_bound":"NzUzMzE1MjU2","repeats":1},{"count":1376,"lower_bound":"NzYxNjM0MzQ0","upper_bound":"NzY4MDUxMjgw","repeats":1},{"count":1384,"lower_bound":"NzY5ODA5NzI5","upper_bound":"ODEzMDM1NzU2","repeats":1},{"count":1392,"lower_bound":"ODIwNDUwNTAw","upper_bound":"ODI2NjkzOTA4","repeats":1},{"count":1400,"lower_bound":"ODMwNzc1OTY0","upper_bound":"ODM5MzQwODQ5","repeats":1},{"count":1408,"lower_bound":"ODQwMjM3NDc2","upper_bound":"ODUzOTYxMTk1","repeats":1},{"count":1416,"lower_bound":"ODU0NDgwMTYw","upper_bound":"ODU2ODIzMDQz","repeats":1},{"count":1424,"lower_bound":"ODYxMTI2NzU0","upper_bound":"ODc2NjEzNTQw","repeats":1},{"count":1432,"lower_bound":"ODc3NTA4ODk3","upper_bound":"ODg3Nzk2NTY1","repeats":1},{"count":1440,"lower_bound":"ODkxMjc4OTc0","upper_bound":"ODk1MTcwMzQ5","repeats":1},{"count":1448,"lower_bound":"ODk2MjE5MjA1","upper_bound":"OTE3ODA5NDk1","repeats":1},{"count":1456,"lower_bound":"OTI1MzE3Njg0","upper_bound":"OTQwMzM2MDc3","repeats":1},{"count":1464,"lower_bound":"OTQyOTc2NTQx","upper_bound":"OTcxNTkzNDI0","repeats":1},{"count":1472,"lower_bound":"OTg4NjYwODQz","upper_bound":"MTAwMjUzNzQ1MQ==","repeats":1},{"count":1480,"lower_bound":"MTAwMzY5MTI2OQ==","upper_bound":"MTAyMzkzMDIwOA==","repeats":1},{"count":1488,"lower_bound":"MTAzNDc1NzQwMw==","upper_bound":"MTAzOTc5OTg1NQ==","repeats":1},{"count":1496,"lower_bound":"MTA0MTU5MDIwOA==","upper_bound":"MTA1MDI1MTA4OA==","repeats":1},{"count":1504,"lower_bound":"MTA2Mzk2MzI4Mw==","upper_bound":"MTA2OTM2MjQ0Ng==","repeats":1},{"count":1512,"lower_bound":"MTA5MTYxMjQ4MQ==","upper_bound":"MTEwNTk5NjUyMg==","repeats":1},{"count":1520,"lower_bound":"MTEwNjA1ODA5OQ==","upper_bound":"MTExNzI2ODgxNg==","repeats":1},{"count":1528,"lower_bound":"MTEyMjM3ODE1Mw==","upper_bound":"MTEzOTk2MzQyNw==","repeats":1},{"count":1536,"lower_bound":"MTE0NDAwNDkzNA==","upper_bound":"MTE1NjI4MDUyNA==","repeats":1},{"count":1544,"lower_bound":"MTE1ODYzNTQwMg==","upper_bound":"MTE2NDY1MDg0MQ==","repeats":1},{"count":1552,"lower_bound":"MTE2NjYwOTY5Nw==","upper_bound":"MTE3MTcwNjY3NA==","repeats":1},{"count":1560,"lower_bound":"MTE3NzQ5NjEzMQ==","upper_bound":"MTIxNzI5NDgwMA==","repeats":1},{"count":1568,"lower_bound":"MTIxODUxOTA3NQ==","upper_bound":"MTIzMTM4OTg2OA==","repeats":1},{"count":1576,"lower_bound":"MTIzODMyMjk2MQ==","upper_bound":"MTI0ODU3NDkwOQ==","repeats":1},{"count":1584,"lower_bound":"MTI1MDE4MTE1MA==","upper_bound":"MTI2ODM5OTI0Mg==","repeats":1},{"count":1592,"lower_bound":"MTI3MzQyODAyNw==","upper_bound":"MTI4MzM2MTU4OA==","repeats":1},{"count":1600,"lower_bound":"MTI5NjAzOTk1Mg==","upper_bound":"MTMxMDk1MjIzMw==","repeats":1},{"count":1608,"lower_bound":"MTMxNDE4OTk5MQ==","upper_bound":"MTMyNTYwMjY1Mw==","repeats":1},{"count":1616,"lower_bound":"MTM0NTUwMzI1NQ==","upper_bound":"MTM1MzE3MTU0OQ==","repeats":1},{"count":1624,"lower_bound":"MTM2MDcyMjUxOQ==","upper_bound":"MTM3OTg0NjY3Ng==","repeats":1},{"count":1632,"lower_bound":"MTM4MTA1NjE1OQ==","upper_bound":"MTM4NTgzOTcxNQ==","repeats":1},{"count":1640,"lower_bound":"MTM5NTQxODc5Ng==","upper_bound":"MTQwODMzNDMyMQ==","repeats":1},{"count":1648,"lower_bound":"MTQxMzkyMjAyMw==","upper_bound":"MTQxNzkzNjQ4OA==","repeats":1},{"count":1656,"lower_bound":"MTQzOTc2NTk3MA==","upper_bound":"MTQ0NTE0NzQyNg==","repeats":1},{"count":1664,"lower_bound":"MTQ1NzkwMDM4OA==","upper_bound":"MTQ2NDUyODQ3Mg==","repeats":1},{"count":1672,"lower_bound":"MTQ2ODM2NTg0NQ==","upper_bound":"MTQ3ODk5OTc1OA==","repeats":1},{"count":1680,"lower_bound":"MTQ3OTExMjIzNw==","upper_bound":"MTQ5OTQzNDcwOA==","repeats":1},{"count":1688,"lower_bound":"MTUwMDE2OTMzMA==","upper_bound":"MTUxMjY3MTAyOQ==","repeats":1},{"count":1696,"lower_bound":"MTUxMzAxNzAzNg==","upper_bound":"MTUyMDMyODI5Mw==","repeats":1},{"count":1704,"lower_bound":"MTUyNjA2MTY0Mw==","upper_bound":"MTUzNjYyNTM3MQ==","repeats":1},{"count":1712,"lower_bound":"MTUzNzA3NTUyNw==","upper_bound":"MTU2MTA3OTc0NA==","repeats":1},{"count":1720,"lower_bound":"MTU2MTQxNDA1OA==","upper_bound":"MTU2OTg2MzEzNw==","repeats":1},{"count":1728,"lower_bound":"MTU3MTQ0OTMxNw==","upper_bound":"MTU4MTkzMDAwMA==","repeats":1},{"count":1736,"lower_bound":"MTU4OTk3MDkyNw==","upper_bound":"MTU5ODU3NjA1Nw==","repeats":1},{"count":1744,"lower_bound":"MTU5OTM3ODQ0Ng==","upper_bound":"MTYwODY3MDkzOQ==","repeats":1},{"count":1752,"lower_bound":"MTYxMDUyNjk2MQ==","upper_bound":"MTYxNjg2MDczNA==","repeats":1},{"count":1760,"lower_bound":"MTYxODM5NTYwMg==","upper_bound":"MTYyNzU1NTIyMQ==","repeats":1},{"count":1768,"lower_bound":"MTYyODY1NzI4Mw==","upper_bound":"MTYzNDYzMjI3Nw==","repeats":1},{"count":1776,"lower_bound":"MTYzNTk1MDQ2Mg==","upper_bound":"MTY0MTY2NzIyNw==","repeats":1},{"count":1784,"lower_bound":"MTY0MjQ0MzEyMA==","upper_bound":"MTY2MzkxNjA0OQ==","repeats":1},{"count":1792,"lower_bound":"MTY2NDY5MTE5Mw==","upper_bound":"MTY3ODIwNTM4Mw==","repeats":1},{"count":1800,"lower_bound":"MTY3ODgzOTI0Mw==","upper_bound":"MTY5Mzg0MzgzNQ==","repeats":1},{"count":1808,"lower_bound":"MTcxNzEyODYxMg==","upper_bound":"MTcyMTQ3ODA5NQ==","repeats":1},{"count":1816,"lower_bound":"MTcyMzk0NjYxNQ==","upper_bound":"MTczNTUwNTIyMQ==","repeats":1},{"count":1824,"lower_bound":"MTczNjk3MTM4Nw==","upper_bound":"MTc0Njc1MDEyNw==","repeats":1},{"count":1832,"lower_bound":"MTc0Njc4Njg1OQ==","upper_bound":"MTc2NTUyNDUwNg==","repeats":1},{"count":1840,"lower_bound":"MTc2NjM0MTgzOQ==","upper_bound":"MTc2OTUzNDUxMQ==","repeats":1},{"count":1848,"lower_bound":"MTc3MTg4Nzc1OQ==","upper_bound":"MTc5MTkyNjU1Mg==","repeats":1},{"count":1856,"lower_bound":"MTc5MzY2Mzk2NA==","upper_bound":"MTgxMjk1MTM0Mw==","repeats":1},{"count":1864,"lower_bound":"MTgyMTU2ODI5MA==","upper_bound":"MTg0ODM0ODYwMA==","repeats":1},{"count":1872,"lower_bound":"MTg1OTE4OTAyOQ==","upper_bound":"MTg3NzcwMTYxNA==","repeats":1},{"count":1880,"lower_bound":"MTg4MTE3MzE0NA==","upper_bound":"MTg5OTA3MTc1MQ==","repeats":1},{"count":1888,"lower_bound":"MTg5OTc3MTAxNA==","upper_bound":"MTkxODk4ODE2MA==","repeats":1},{"count":1896,"lower_bound":"MTkyMzk0NDg2Mg==","upper_bound":"MTk1MDM2NTUwOQ==","repeats":1},{"count":1904,"lower_bound":"MTk1MDM5NTM4MA==","upper_bound":"MTk1Njg4NzIzNw==","repeats":1},{"count":1912,"lower_bound":"MTk1ODA4ODIxMQ==","upper_bound":"MTk2MjQxMDU2Mg==","repeats":1},{"count":1920,"lower_bound":"MTk2Njc2NTA0Ng==","upper_bound":"MTk2OTg5MTE5OQ==","repeats":1},{"count":1928,"lower_bound":"MTk3MzczMjM5MQ==","upper_bound":"MTk4MTYyNzk5Mg==","repeats":1},{"count":1936,"lower_bound":"MTk4NTc3MDMyMA==","upper_bound":"MTk5MzExOTUwNA==","repeats":1},{"count":1944,"lower_bound":"MTk5MzUwMDY4Mw==","upper_bound":"MjAxMDYzODgzNA==","repeats":1},{"count":1952,"lower_bound":"MjAxMTQ4MzY2MA==","upper_bound":"MjAxODM1MjcwMw==","repeats":1},{"count":1960,"lower_bound":"MjAyMzc1MzgyMA==","upper_bound":"MjAzNDk0MzY0Mg==","repeats":1},{"count":1968,"lower_bound":"MjAzODE5MzM0Mg==","upper_bound":"MjA0NzM4ODQ5MQ==","repeats":1},{"count":1976,"lower_bound":"MjA1NTI0NDA1MQ==","upper_bound":"MjA3NTk0MjE5Nw==","repeats":1},{"count":1984,"lower_bound":"MjA3NzA4ODQ5OQ==","upper_bound":"MjA5MzY5NTMwMQ==","repeats":1},{"count":1992,"lower_bound":"MjEwMjc1MzA0OA==","upper_bound":"MjEyODM2MDYzNg==","repeats":1},{"count":2000,"lower_bound":"MjEzMDU1OTk0Nw==","upper_bound":"MjE0NDc0NDY2Mg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3,0,2,1,0,0,2,1,0,0,1,3,0,1,3,0,0,1,2,3,1,1,1,1,1,2,1,0,1,0,2,0,0,2,0,0,1,1,1,2,0,1,1,2,1,1,0,0,1,2,0,0,2,0,0,1,1,1,1,2,1,2,1,2,0,0,0,0,2,0,1,1,0,3,2,0,2,0,2,1,0,1,1,0,0,0,0,1,0,0,0,1,0,1,1,0,0,0,0,0,1,1,1,1,0,1,0,2,1,0,0,0,1,3,2,0,1,0,2,0,0,1,1,0,1,0,0,1,1,0,2,2,1,1,1,2,0,0,0,0,1,2,3,0,2,1,1,1,3,0,1,0,1,1,1,2,1,0,0,1,2,1,2,1,0,0,3,2,0,0,0,0,1,1,1,2,0,0,0,1,1,1,0,2,2,1,2,1,0,2,4,0,1,0,0,2,0,0,0,2,2,0,0,1,1,0,1,0,2,0,0,1,2,0,0,0,1,2,0,0,2,0,2,1,1,1,1,2,0,0,0,0,2,1,2,1,2,0,0,1,1,2,2,2,1,0,0,1,1,2,2,2,1,0,2,1,2,1,0,0,0,0,1,2,1,2,2,0,0,3,1,1,1,0,2,0,0,0,2,1,1,2,0,0,2,1,1,0,1,1,0,0,0,0,0,1,2,0,2,0,0,0,2,2,0,2,1,1,3,0,0,0,2,0,3,1,0,1,3,0,1,0,0,1,1,1,0,3,0,1,2,0,1,1,1,1,0,0,0,2,2,0,2,2,1,2,2,1,1,1,1,1,0,2,1,0,0,3,2,0,1,0,0,0,3,1,1,3,1,1,2,0,2,0,2,0,3,3,0,2,2,0,4,0,2,1,1,1,0,1,1,3,1,1,0,1,2,0,0,0,0,2,2,2,2,1,2,0,1,1,0,3,0,0,2,5,0,2,1,0,0,0,0,2,1,2,2,2,2,2,3,1,1,1,1,0,0,0,1,1,0,2,1,0,1,0,1,3,1,1,2,0,1,1,1,1,2,2,2,1,0,3,1,1,1,2,1,0,1,0,0,4,4,1,2,0,0,0,1,1,2,1,2,2,0,1,0,1,2,0,1,0,1,2,1,5,1,1,1,1,0,1,2,1,2,2,1,0,1,1,1,2,3,1,1,1,1,0,0,1,0,3,2,0,0,1,2,2,3,2,1,3,1,0,1,0,2,0,1,4,0,2,0,0,1,2,1,1,0,0,0,1,2,1,1,0,0,0,1,1,0,3,1,0,0,0,1,2,2,1,0,3,0,0,5,2,0,1,1,1,2,0,3,2,0,0,2,0,1,0,1,4,1,0,1,0,1,0,1,1,2,2,4,0,0,0,1,1,0,3,0,0,0,2,1,0,1,0,1,1,1,2,0,0,1,0,0,2,1,4,1,2,1,0,0,0,0,0,1,1,0,1,0,1,1,1,0,1,1,2,1,1,0,2,1,3,3,0,0,0,1,0,2,0,1,0,0,1,0,1,0,3,1,1,1,2,2,0,0,2,1,0,0,0,1,1,1,0,1,0,2,1,0,2,1,0,0,2,1,0,2,2,2,0,2,0,0,3,1,1,1,1,1,0,1,1,2,0,0,1,0,0,0,0,0,3,0,1,0,2,1,0,0,0,0,2,0,0,1,0,0,1,1,1,0,1,3,0,0,1,1,1,3,1,2,0,0,1,2,2,1,2,3,0,4,0,2,5,0,1,1,1,1,1,1,0,1,1,2,1,1,0,0,0,2,2,1,1,1,1,0,1,0,2,0,1,0,1,0,2,2,3,1,0,3,1,0,2,1,2,1,0,1,2,2,0,0,2,0,1,2,0,1,1,0,0,1,1,1,1,3,1,1,3,1,1,0,1,1,2,0,0,0,3,2,1,0,0,1,1,0,1,0,1,1,3,0,0,3,0,1,0,1,0,0,1,0,0,1,1,1,1,1,0,0,2,1,1,0,0,0,0,3,0,0,2,4,2,0,2,0,3,0,2,3,3,1,2,0,1,1,2,0,2,1,1,0,1,0,5,0,2,4,3,0,1,3,0,1,1,0,0,1,1,2,0,1,0,0,1,1,1,2,0,1,2,1,0,0,2,0,0,2,1,0,0,2,2,1,2,2,3,0,0,1,0,1,1,4,1,1,2,1,2,0,0,1,1,2,0,0,0,0,1,0,0,2,1,1,0,0,1,0,2,0,2,2,0,3,3,1,2,0,1,0,2,2,2,2,1,0,1,2,1,2,1,1,2,1,1,0,0,0,1,2,2,0,1,1,0,1,1,0,1,0,0,0,1,1,1,2,1,1,2,1,1,0,1,1,0,1,1,0,0,0,2,1,1,2,2,0,1,2,1,4,1,4,1,1,2,3,1,1,0,2,0,1,0,3,0,1,1,2,1,1,1,2,2,2,3,0,1,2,2,0,0,3,1,2,2,2,3,0,0,1,1,0,1,1,0,0,1,0,0,1,1,3,0,1,0,0,2,0,0,3,2,1,0,1,1,0,1,2,0,1,2,0,1,0,1,1,1,0,0,1,1,3,1,1,0,1,0,0,0,1,0,0,0,0,1,3,1,0,0,2,1,0,0,1,0,0,1,3,1,2,1,1,1,1,1,1,1,0,2,0,2,0,0,1,0,1,2,1,1,0,2,1,1,1,0,0,1,0,1,2,1,1,0,2,0,1,2,0,1,3,2,2,1,0,2,2,1,1,1,2,2,2,2,0,0,2,2,0,0,2,1,1,1,0,1,1,2,2,0,0,0,1,1,2,1,2,0,1,3,0,0,1,1,3,1,0,0,0,1,1,1,0,0,0,0,1,1,0,0,1,0,1,3,0,1,1,1,2,0,2,3,0,1,2,1,2,1,0,1,0,1,1,0,1,3,1,0,2,1,0,0,0,2,1,0,1,1,1,0,0,2,0,0,1,2,1,1,2,0,2,0,1,0,1,1,2,0,0,0,0,1,0,0,0,1,1,0,3,1,0,4,0,1,0,1,0,3,5,1,1,0,2,0,0,2,1,1,1,1,0,0,1,0,3,0,1,1,1,2,0,1,1,0,0,0,0,0,2,2,1,0,0,0,1,1,1,0,1,1,0,3,0,1,1,1,1,0,1,0,0,0,1,4,1,1,0,3,1,3,0,2,2,2,1,0,1,2,1,0,1,1,0,0,2,1,0,0,1,0,0,1,1,0,0,0,2,0,0,1,0,1,2,2,1,1,2,2,0,1,0,3,1,0,0,2,1,0,0,2,0,0,1,0,2,0,1,2,2,2,1,0,1,1,0,0,2,0,0,0,1,0,2,1,0,1,3,1,1,1,2,2,3,1,1,2,0,1,2,0,1,1,1,0,0,2,0,1,1,1,0,2,0,1,0,2,1,0,1,2,0,1,0,1,1,1,3,1,0,0,5,2,0,2,0,0,0,0,0,0,1,3,3,0,0,1,1,1,0,1,0,1,0,1,2,1,0,3,0,0,1,1,0,2,0,1,1,0,1,1,1,2,1,2,0,0,1,1,0,0,2,1,1,0,1,3,0,2,0,2,1,1,1,1,0,2,1,2,0,0,1,1,0,0,1,0,0,1,0,0,1,2,1,1,0,1,0,2,0,0,0,2,1,3,0,1,1,1,0,0,1,1,3,2,2,0,1,0,1,1,3,0,1,0,4,1,0,0,1,3,4,0,2,1,0,0,0,2,1,1,0,2,0,0,1,0,0,2,2,0,3,0,1,0,0,0,1,0,3,0,2,0,2,1,3,0,3,0,0,3,2,2,2,0,2,1,0,1,2,1,1,3,1,0,1,0,1,1,0,1,1,2,0,1,1,0,0,1,2,1,0,0,0,2,1,1,2,1,1,2,1,1,1,1,1,1,0,0,1,0,0,1,0,1,1,4,0,1,2,3,0,0,1,1,1,0,1,0,1,1,1,1,0,1,1,1,0,2,2,0,0,0,1,3,2,1,0,0,2,1,2,0,3,1,0,0,4,0,1,0,2,1,0,0,1,3,1,2,2,1,0,0,2,0,1,0,0,0,0,0,1,0,1,0,0,2,0,1,0,0,1,2,1,0,2,1,1,0,1,2,0,0,1,0,1,0,4,0,0,0,0,1,1,1,2,1,1,0,0,0,3,0,1,2,1,3,2,1,2,0,0,0,1,2,1,0,1,0,4,0,3,1,1,1,1,0,1,2,2,3,1,1,1,2,0,1,0,0,2,4,1,1,1,0,1,1,1,1,0,0,1,0,1,4,1,1,1,3,1,1,0,0,2,2,1,2,3,3,0,0,1,1,4,0,2,0,3,1,0,0,0,0,1,1,2,0,2,0,1,1,0,2,1,2,2,2,0,0,2,0,0,1,0,2,1,0,0,0,1,1,2,1,2,1,2,2,2,1,0,1,1,0,0,1,1,0,2,0,1,2,1,2,1,2,0,2,2,3,1,1,1,1,0,4,0,1,2,0,0,2,0,0,1,0,0,3,0,0,0,1,2,1,1,2,2,0,2,1,0,0,0,2,0,3,0,0,2,0,1,1,0,1,2,1,2,0,3,1,0,1,0,1,2,1,1,2,2,2,2,0,0,1,0,3]},{"counters":[0,1,1,0,0,1,2,1,0,0,0,0,3,0,0,2,0,0,0,1,1,0,2,0,1,2,0,1,1,4,0,0,1,1,2,2,0,2,2,1,0,2,0,0,0,1,0,2,0,0,2,1,1,1,2,1,0,0,1,0,3,4,0,2,1,1,0,0,2,1,2,1,3,0,2,1,0,3,1,1,2,0,0,0,1,2,0,0,1,0,1,1,2,0,0,1,1,1,1,1,0,0,2,3,0,2,0,2,2,1,3,0,0,1,1,0,0,0,3,4,1,1,2,1,0,0,1,1,0,0,2,1,2,1,1,2,1,0,1,1,1,0,1,0,0,0,3,1,3,1,1,0,1,0,1,0,1,2,2,1,0,1,2,1,2,1,0,0,0,1,1,2,0,1,1,3,1,3,0,0,0,1,3,2,2,3,1,1,0,3,1,1,4,1,1,1,1,0,0,2,0,0,0,1,0,2,0,1,0,1,0,0,1,1,1,2,0,1,2,0,2,1,1,0,0,0,1,2,0,1,0,1,1,0,4,2,0,0,1,2,0,1,0,0,1,2,0,1,0,1,0,1,4,4,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,0,1,1,2,0,2,0,0,2,0,0,1,0,0,1,2,1,0,0,1,1,0,0,0,2,0,0,2,0,0,0,0,4,1,1,1,0,0,0,1,2,2,0,1,1,0,0,0,2,1,0,1,1,1,3,0,0,1,2,4,2,1,2,0,1,0,0,2,1,2,2,0,0,3,0,0,1,2,4,2,0,0,2,0,0,0,0,1,2,2,0,0,2,2,2,1,1,0,0,1,0,1,2,3,3,0,1,1,0,0,0,2,0,1,2,1,0,1,0,2,2,0,1,5,1,0,0,0,0,1,1,1,0,0,1,0,1,0,0,1,0,1,2,0,0,1,0,0,1,0,0,2,0,1,3,0,2,1,0,0,1,1,0,1,1,0,0,0,0,2,0,1,0,1,1,0,2,0,1,0,1,2,1,2,5,0,1,1,0,1,1,0,1,2,0,0,2,3,1,0,1,1,1,2,1,3,1,0,0,0,0,0,2,1,1,3,0,1,1,1,2,1,4,1,1,1,1,0,1,0,2,2,2,2,1,0,2,1,2,0,1,0,0,0,1,1,0,4,1,2,0,0,3,0,0,0,0,0,0,0,1,3,2,0,1,0,1,0,2,1,0,1,0,2,1,1,0,1,1,0,0,2,0,0,1,1,0,0,3,3,0,1,1,0,2,1,0,2,0,0,1,0,0,1,1,2,1,1,0,1,0,1,3,1,3,0,0,1,0,0,2,0,1,0,0,2,1,2,0,1,0,1,1,3,1,1,1,3,1,1,1,0,2,2,0,1,2,0,2,2,1,0,1,0,0,2,0,1,3,0,0,0,1,4,0,0,1,0,0,0,2,2,0,0,2,1,1,1,1,0,0,1,1,1,2,1,1,0,1,2,0,1,0,1,1,0,2,1,0,1,2,1,2,0,1,0,0,0,0,2,2,0,1,2,1,0,2,2,0,0,1,1,1,1,0,0,0,3,0,2,2,2,1,3,2,1,2,0,0,3,0,2,3,1,0,1,0,4,0,1,2,2,1,1,1,1,0,1,1,3,1,0,2,3,0,0,3,1,1,1,0,2,1,1,0,0,3,2,1,2,2,2,0,1,0,0,0,0,2,0,4,1,3,1,3,1,1,0,0,2,0,0,0,1,1,1,1,0,1,0,1,1,0,3,0,0,2,3,0,1,0,0,1,1,1,1,1,0,0,1,0,0,1,2,2,2,1,1,1,1,2,1,0,3,1,1,0,1,1,2,0,1,1,4,2,0,0,1,1,4,0,0,1,1,0,1,0,2,1,0,1,2,1,0,2,1,0,1,0,0,4,0,2,1,1,1,1,3,0,1,0,0,2,0,0,1,1,2,1,2,1,1,0,0,1,0,2,0,2,0,0,0,1,0,0,1,1,0,1,1,0,0,0,2,3,1,0,0,0,1,0,1,2,0,0,1,0,2,0,0,2,0,2,0,1,4,1,0,1,1,1,0,0,2,2,0,2,0,1,1,0,0,2,1,2,0,2,1,2,0,1,1,0,1,1,0,0,0,1,1,2,0,1,0,3,1,1,2,1,2,1,2,0,2,1,1,2,0,3,0,1,0,0,1,4,0,0,0,0,0,0,0,2,2,3,1,0,1,2,1,3,1,1,0,0,0,0,0,0,1,2,1,0,2,0,3,2,1,1,3,1,0,0,1,3,2,0,0,1,0,3,1,3,0,0,0,0,2,1,3,0,2,1,1,3,1,0,4,0,0,1,0,1,1,1,0,1,2,2,1,0,1,2,2,0,4,2,1,1,3,1,0,0,1,0,0,1,2,3,1,0,2,1,3,3,3,1,0,2,2,1,1,1,0,1,0,0,0,2,0,3,1,1,2,1,0,1,0,0,2,0,2,2,2,0,0,1,1,0,2,1,0,1,1,1,0,2,1,1,1,0,2,3,0,1,2,2,0,1,3,0,0,0,2,0,0,1,2,2,0,1,1,2,1,1,1,2,2,1,1,1,1,1,2,0,1,0,0,0,1,1,2,1,0,0,4,0,1,1,3,1,1,0,0,1,1,1,2,2,1,3,0,1,0,0,1,1,0,3,0,1,0,0,0,1,0,1,0,1,0,0,3,2,0,2,0,1,0,2,0,0,1,3,2,0,2,1,1,0,3,0,1,0,1,1,1,0,2,0,0,2,2,3,0,1,0,1,0,1,2,0,1,0,2,1,0,0,0,0,0,0,1,2,1,1,0,0,1,0,0,1,1,1,1,0,0,0,0,1,4,1,1,2,0,0,0,1,1,1,1,0,0,0,1,1,1,1,0,1,0,1,3,3,2,2,1,2,0,1,2,1,0,1,2,0,0,2,2,1,1,2,0,0,0,1,2,2,0,0,2,1,5,0,0,1,0,1,3,1,1,0,0,0,0,3,0,3,1,1,0,0,0,3,1,0,1,0,1,2,0,5,0,3,0,1,2,0,0,0,0,0,2,1,1,2,0,0,1,0,2,2,0,1,1,1,0,0,2,1,1,0,0,2,0,0,1,0,1,2,0,3,0,0,1,1,0,1,0,1,2,0,1,2,1,1,2,1,1,2,1,0,1,1,0,1,2,1,2,1,2,0,0,1,0,2,1,1,2,0,0,1,1,2,0,1,1,2,1,1,1,0,0,1,0,2,0,0,0,1,0,2,1,1,2,2,0,0,1,1,0,1,0,0,1,2,1,0,2,0,2,4,0,0,0,1,1,3,0,1,3,2,0,0,3,0,1,1,2,1,0,0,0,3,2,1,0,1,0,3,0,0,1,0,0,0,2,2,1,1,2,0,1,2,2,1,2,0,2,2,1,2,1,0,1,0,0,0,2,0,1,1,0,0,3,0,1,1,0,0,0,2,0,0,2,0,0,1,0,0,0,0,1,0,0,1,2,1,1,1,1,2,0,3,0,1,2,0,1,1,1,0,0,0,0,1,1,2,0,4,0,4,1,2,3,0,0,0,0,4,1,2,0,2,1,2,0,1,0,1,1,3,1,0,1,1,1,1,1,1,1,2,2,0,0,0,0,1,2,1,1,0,0,1,0,4,1,0,1,2,0,1,3,0,0,1,0,1,2,1,1,1,1,2,0,4,4,1,2,0,3,3,2,2,0,1,0,2,1,0,2,1,2,0,1,1,1,3,0,0,3,4,1,0,1,0,0,0,0,0,1,1,4,3,1,0,0,1,0,0,0,0,1,2,1,0,0,2,2,0,1,3,2,0,2,2,0,0,1,0,2,1,3,0,2,2,0,0,2,3,1,0,1,1,0,1,0,2,1,1,0,1,1,0,0,1,1,2,1,0,0,1,1,1,1,2,0,3,0,0,3,1,4,0,0,0,1,2,0,0,0,4,1,3,0,1,1,1,2,3,2,1,2,2,0,1,0,1,1,0,2,1,1,0,0,1,0,1,1,1,1,4,1,0,0,1,1,2,0,1,1,1,0,0,0,5,0,2,1,0,0,2,4,0,0,1,2,1,2,0,0,0,1,0,0,1,1,0,0,0,0,1,0,1,1,0,2,3,0,0,1,1,0,0,0,2,2,1,0,3,1,1,3,0,1,0,2,1,0,0,1,1,4,1,1,1,0,1,1,0,0,1,1,1,3,0,2,2,1,2,1,1,1,2,1,3,2,2,3,3,0,1,0,2,0,1,0,0,0,0,1,0,1,1,1,2,2,0,2,1,3,1,0,1,0,1,0,0,0,2,0,0,2,1,1,2,1,0,0,0,3,0,0,2,0,1,1,1,2,0,3,2,2,1,1,1,0,0,0,1,1,1,3,1,1,1,0,0,0,0,2,2,1,2,2,2,0,1,0,1,2,2,0,1,1,3,3,0,0,0,1,2,1,1,2,2,0,0,3,1,1,0,1,0,1,0,0,0,0,1,4,0,2,1,1,2,2,1,1,4,2,2,2,1,3,0,0,1,0,2,2,0,1,1,1,3,2,1,1,0,3,1,0,0,0,4,0,2,0,0,1,1,2,1,2,0,2,2,1,0]},{"counters":[1,0,2,0,2,0,0,1,3,1,3,0,1,1,1,1,1,3,0,1,3,0,0,1,0,3,1,3,1,0,2,0,1,1,1,3,2,1,0,1,0,0,2,0,2,0,2,1,1,0,6,0,0,0,1,1,0,1,0,0,1,0,1,1,1,1,3,1,0,1,0,0,1,0,0,0,1,1,1,0,2,0,2,1,1,0,1,0,0,1,1,0,1,1,2,0,0,0,1,1,2,2,0,1,2,0,1,5,0,1,1,2,3,1,1,3,1,1,0,2,0,0,1,3,0,0,0,1,0,1,0,0,0,1,2,2,0,1,0,1,1,1,2,2,0,1,1,1,3,0,1,2,0,2,0,1,2,3,3,0,3,1,2,0,3,0,0,0,0,0,0,0,0,1,1,0,1,2,1,1,2,0,0,0,1,0,1,0,1,0,0,3,0,2,2,2,0,1,1,0,1,2,1,1,0,1,1,0,0,2,1,0,1,2,2,1,1,3,1,2,0,0,0,0,0,2,1,1,1,4,1,0,3,1,2,1,1,0,0,1,1,1,0,0,2,1,0,2,1,1,1,2,0,1,0,0,1,1,0,3,0,1,0,3,0,1,0,0,1,1,1,0,1,0,0,0,1,1,0,0,0,2,1,0,1,0,0,1,0,1,0,1,2,1,0,3,0,1,2,0,2,1,1,0,2,3,1,0,4,0,0,0,2,2,1,1,0,2,0,3,2,0,1,1,0,0,0,0,0,1,1,1,2,1,0,0,0,2,4,0,0,0,0,0,1,0,1,0,0,2,2,1,1,0,1,1,1,1,0,0,1,0,0,0,0,1,1,2,1,1,0,1,0,1,1,2,2,1,2,0,1,0,2,1,1,0,1,0,0,2,0,1,1,0,1,0,1,1,0,2,0,0,3,3,0,0,0,0,1,2,0,0,1,0,0,1,0,0,0,0,2,2,1,0,2,1,0,0,0,0,1,1,2,0,2,0,2,1,1,1,0,1,1,0,0,2,1,1,1,0,0,0,1,1,0,2,2,0,0,0,0,0,2,1,0,0,0,2,1,1,4,1,1,0,0,2,0,4,1,0,0,1,0,1,3,0,1,2,0,2,2,1,2,2,2,1,0,0,1,2,1,1,1,1,0,2,0,1,0,2,1,1,0,2,0,3,0,1,0,2,1,3,2,0,3,1,0,0,0,1,1,3,1,3,0,2,1,1,2,1,1,2,0,0,0,2,2,2,0,0,0,0,0,0,2,0,0,2,1,1,2,4,1,0,0,1,1,2,1,0,2,0,0,1,1,2,1,0,0,2,2,0,0,1,0,2,0,3,1,1,0,2,0,0,2,1,0,1,2,1,1,1,0,0,2,0,0,1,1,0,2,1,0,0,1,1,1,0,1,1,1,1,0,0,1,3,3,1,0,0,1,3,0,0,1,1,2,3,1,1,1,1,1,2,0,0,3,1,1,1,1,2,1,0,0,0,0,0,1,0,0,0,1,2,1,0,1,2,1,2,5,1,0,1,1,1,0,2,1,0,1,0,2,1,0,2,1,1,0,0,0,0,0,0,1,0,2,1,2,0,0,0,1,0,0,0,1,4,2,2,1,0,0,0,4,2,1,2,1,3,1,2,2,0,0,2,2,0,0,2,0,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,0,1,1,1,2,0,0,0,1,1,1,0,0,2,1,1,3,0,1,2,0,0,2,0,0,0,0,0,2,1,3,1,2,1,1,1,1,1,1,1,2,2,0,2,0,2,0,1,0,0,1,0,1,0,1,1,1,1,1,0,1,2,0,0,3,0,1,0,0,1,0,1,1,0,1,0,0,0,1,2,0,3,1,5,1,1,3,0,0,2,0,0,2,0,0,0,0,3,1,0,0,2,1,0,0,0,3,0,1,1,1,0,2,2,1,0,0,1,2,2,1,2,2,0,0,1,2,4,2,1,0,1,1,2,1,3,2,0,4,0,1,0,0,4,2,2,0,0,0,3,0,1,1,2,0,2,3,1,2,0,1,1,2,2,0,0,0,3,1,1,1,1,0,0,2,1,1,0,4,0,2,1,1,0,1,2,0,1,1,1,2,0,1,0,1,1,1,2,3,0,2,2,1,0,0,2,0,2,1,0,1,0,1,1,0,0,1,1,2,2,1,0,0,1,2,1,1,0,2,0,1,1,1,0,2,3,1,0,1,0,0,3,2,0,1,2,1,0,1,1,2,3,0,2,0,0,1,1,1,1,1,3,0,1,2,4,1,4,2,0,1,1,2,4,2,2,3,4,0,1,0,2,1,0,0,1,1,0,2,1,0,2,2,1,2,2,2,1,1,3,1,0,0,2,2,1,3,1,1,1,1,1,2,2,0,1,0,1,1,0,1,0,1,0,1,0,1,3,0,0,2,0,1,0,0,0,0,1,3,1,0,1,2,2,1,0,2,0,0,1,1,2,1,3,3,0,2,0,2,2,2,0,1,0,1,1,2,0,2,0,1,1,0,0,2,1,0,0,3,2,0,1,1,1,0,3,0,1,2,0,0,0,0,0,2,2,1,1,2,0,1,1,1,0,2,1,1,0,2,0,0,1,0,0,1,1,0,0,2,0,0,0,0,0,0,0,1,1,1,2,0,0,0,5,0,0,0,2,3,2,0,0,0,1,1,2,1,1,0,1,2,0,1,0,0,0,0,0,1,1,0,2,1,1,3,0,0,2,1,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,3,1,4,1,1,0,0,4,1,0,1,0,1,1,1,1,1,2,2,0,1,3,0,2,1,0,1,1,1,2,2,0,0,1,2,0,3,1,1,1,1,2,0,0,1,0,2,2,0,2,0,0,4,2,1,0,1,1,1,0,2,0,1,1,1,0,0,2,0,2,2,0,0,3,0,2,2,2,0,2,2,1,3,1,2,3,3,0,0,0,1,2,1,1,0,1,0,1,1,1,2,1,2,1,1,3,1,2,1,1,0,2,1,1,1,0,2,0,2,1,0,1,1,2,1,3,1,0,1,2,1,2,3,3,0,0,0,0,4,2,0,3,1,2,0,3,1,1,1,0,1,0,1,2,2,0,0,0,0,0,0,0,0,0,1,1,1,1,0,2,0,1,1,1,2,1,3,0,0,4,0,2,3,2,1,0,2,0,2,1,0,0,0,2,1,0,0,0,1,5,0,1,1,0,1,0,1,2,0,4,0,1,1,1,3,0,2,1,0,1,1,1,0,3,1,0,0,1,2,0,0,3,1,0,0,1,0,0,0,1,1,3,0,0,1,1,3,1,1,0,1,0,2,0,2,1,2,0,1,1,2,1,0,1,1,0,1,2,1,1,2,4,1,2,0,1,1,1,1,2,2,0,0,1,0,1,3,2,2,1,0,1,0,1,2,3,0,0,2,3,0,0,1,0,0,2,0,0,0,0,0,1,0,1,3,0,3,1,2,1,1,1,2,1,0,0,0,2,3,1,5,0,1,0,2,0,1,0,1,1,0,1,0,3,4,1,0,0,2,1,4,1,0,0,0,2,0,1,0,1,0,1,1,0,1,0,1,0,0,0,2,0,2,2,1,3,1,2,2,1,0,3,1,0,0,5,1,0,3,1,1,1,0,1,2,2,0,2,1,0,0,2,1,4,1,1,1,0,1,2,0,3,0,0,0,0,0,0,0,1,3,1,0,0,1,3,1,0,1,1,0,1,3,2,1,0,0,0,1,0,1,1,1,0,0,1,3,1,0,1,4,2,2,1,1,1,0,1,0,1,0,0,1,2,1,1,1,0,0,2,0,0,0,1,1,1,1,0,0,0,1,1,1,0,2,4,0,1,0,0,0,3,2,2,0,4,2,2,1,1,0,1,1,0,1,2,0,1,0,1,0,2,0,2,3,0,0,1,3,0,2,1,2,0,3,0,1,1,3,2,2,1,2,0,0,0,1,0,2,3,1,0,1,0,1,1,1,0,0,1,0,0,1,1,0,0,2,1,2,2,0,1,0,0,0,1,1,1,1,0,0,1,1,0,0,0,2,0,0,0,0,0,0,0,1,1,2,1,2,1,3,1,0,0,1,0,0,1,6,1,0,0,1,2,1,0,3,1,3,5,1,1,1,1,0,2,0,0,0,0,0,0,1,2,0,0,2,2,0,2,3,0,0,0,1,0,2,1,0,0,0,1,1,0,1,3,1,1,2,2,0,2,2,2,2,1,1,0,0,1,2,0,0,2,0,1,3,0,0,0,2,0,2,0,1,1,3,3,0,0,1,4,0,1,1,3,2,1,4,2,2,0,3,0,2,0,0,1,0,0,3,1,1,1,1,2,1,0,0,0,0,1,0,0,2,1,2,0,2,0,0,1,1,0,0,1,1,0,2,0,1,2,2,1,1,3,0,0,1,0,1,0,0,2,1,0,3,0,0,2,2,1,0,1,4,1,0,1,1,3,0,0,0,3,3,0,2,1,2,1,2,1,2,1,0,1,0,1,2,0,5,1,0,1,1,1,0,1,2,1,0,2,1,1,2,1,1,0,1,1,1,1,1,0,0,0,1,0,0,0,2,0,1,1,3,1,0,1]},{"counters":[1,0,0,2,0,0,1,1,3,0,2,1,0,1,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,1,1,2,0,1,2,1,0,0,1,2,2,1,1,0,1,1,1,0,1,1,1,1,1,0,0,0,0,2,1,1,1,2,0,0,2,2,2,1,1,2,2,1,1,1,2,0,0,1,1,0,2,1,0,0,1,2,1,1,0,0,0,1,1,2,1,1,0,0,0,0,0,2,1,1,1,0,2,0,1,1,0,2,1,1,1,4,3,1,0,1,1,1,2,1,0,1,2,1,2,2,0,2,1,4,1,0,0,1,0,0,1,3,1,0,2,2,0,1,0,1,1,2,2,0,2,1,1,1,2,0,1,2,1,1,3,0,0,0,0,0,1,1,0,0,1,0,2,2,0,2,1,2,0,0,2,0,1,1,1,1,0,1,0,1,0,0,1,2,0,1,0,0,0,0,0,1,1,2,2,0,0,0,4,2,0,0,0,1,1,2,1,2,0,0,1,1,0,1,1,1,0,2,0,2,0,1,0,1,0,1,0,0,1,2,0,1,0,1,0,1,1,1,1,1,2,0,1,2,1,0,2,3,1,1,1,0,1,0,0,2,1,1,0,2,0,2,1,1,3,0,2,1,0,1,1,0,1,1,1,2,2,1,2,3,0,2,1,1,1,2,0,0,0,0,1,1,0,0,3,2,2,1,3,3,0,0,1,1,2,3,1,1,2,1,0,2,3,2,3,0,1,0,1,1,1,1,1,2,1,1,0,0,0,0,0,0,0,3,0,0,1,1,5,3,2,0,2,1,2,2,1,1,3,2,1,2,3,1,0,2,1,3,0,2,0,0,3,0,2,1,2,0,0,1,0,1,1,3,2,1,1,1,0,2,1,1,1,0,0,1,4,2,0,0,2,1,1,4,0,0,0,1,0,1,2,2,0,2,2,2,0,1,3,1,0,2,4,1,1,1,0,0,1,2,2,0,2,1,0,0,2,0,1,3,0,0,2,0,0,1,1,2,1,2,2,1,1,1,1,0,2,1,2,1,1,0,1,1,1,2,2,1,0,0,3,0,0,1,0,1,2,1,0,0,0,0,0,1,4,0,1,1,2,2,0,1,2,2,0,0,0,0,1,1,1,1,0,2,3,1,1,1,0,0,3,1,1,2,2,0,1,1,0,0,1,0,0,0,2,1,0,0,0,1,2,3,0,1,2,0,3,1,2,1,2,3,0,1,1,1,1,0,2,1,3,3,1,2,1,1,1,3,2,1,4,0,1,0,2,1,1,2,0,1,2,0,2,1,0,2,0,0,0,0,3,0,0,1,0,0,0,0,0,1,0,1,1,1,2,0,1,1,0,0,0,0,2,0,3,0,0,0,1,1,2,0,0,0,1,0,1,2,0,1,1,2,1,2,0,1,0,1,1,1,0,0,0,4,0,0,0,0,1,0,1,1,1,0,1,1,0,1,2,0,0,0,0,0,1,0,0,2,0,1,3,1,1,1,2,2,0,0,0,1,2,2,1,1,0,1,0,0,1,2,0,0,0,2,1,1,3,2,1,1,3,2,1,0,3,1,0,1,1,2,0,0,1,2,1,0,3,0,0,0,0,0,1,0,0,0,1,0,0,1,1,0,1,0,1,0,0,1,3,1,0,0,1,0,0,0,1,0,0,2,2,3,0,0,1,0,1,1,1,0,1,2,2,2,1,1,0,5,0,0,0,2,1,2,1,2,0,1,0,0,0,0,2,3,0,3,1,0,0,0,0,0,0,1,2,1,3,1,0,2,0,1,1,1,0,1,1,1,0,1,0,2,2,1,0,0,0,1,1,0,0,4,1,0,2,1,0,2,1,0,1,1,1,0,4,3,2,0,0,0,2,2,2,0,0,1,0,1,1,0,2,0,2,1,2,0,1,0,0,1,2,0,1,1,1,1,1,2,1,0,1,2,1,0,0,2,0,1,2,1,1,3,2,2,1,0,1,1,2,0,2,1,1,3,0,1,4,0,0,1,1,2,1,1,2,1,2,0,0,1,2,0,0,2,0,2,0,1,0,1,1,2,0,1,2,2,0,2,1,1,1,1,2,1,2,1,2,0,0,1,1,2,0,1,0,3,1,0,0,0,2,1,1,1,1,0,0,1,0,0,0,1,1,0,1,0,2,1,1,0,2,1,0,0,0,0,1,0,2,2,2,2,2,2,2,0,1,1,2,1,2,3,1,2,0,0,0,1,0,1,0,1,1,0,1,0,0,1,1,1,1,0,0,4,1,1,0,0,0,1,2,4,0,3,0,0,1,1,0,0,0,2,0,1,0,3,2,2,2,1,2,0,0,1,1,2,1,1,1,1,1,1,2,1,0,2,1,1,1,0,2,3,1,2,0,0,1,0,2,3,1,2,1,0,1,0,2,0,0,1,1,0,0,1,2,1,4,0,0,1,1,2,1,3,1,1,2,2,0,1,0,1,3,1,2,0,2,1,1,2,1,1,0,2,0,2,0,0,0,1,3,2,3,0,2,1,1,0,3,2,1,1,0,1,0,3,2,1,2,1,1,2,1,2,1,1,3,2,1,1,0,3,1,2,1,0,1,3,0,0,0,1,0,1,1,2,0,1,1,1,1,1,1,0,2,2,1,0,0,1,1,0,1,1,3,1,0,1,0,1,1,1,0,2,1,2,1,2,1,2,4,0,1,3,1,0,0,1,0,0,0,0,2,1,1,0,1,2,0,1,1,0,5,1,1,1,0,1,1,0,3,1,1,1,0,1,0,1,2,0,0,1,0,3,1,1,0,2,0,1,0,1,3,1,1,0,1,1,0,1,0,0,1,3,1,0,1,0,2,3,1,1,1,3,0,0,0,0,2,2,1,0,1,1,3,0,0,1,2,0,0,0,2,0,1,0,0,0,0,0,2,0,0,1,2,0,1,2,0,3,1,1,0,0,2,1,0,2,1,1,2,0,2,1,1,2,0,0,0,0,0,2,3,1,2,1,0,0,0,1,2,1,2,0,0,2,0,1,0,1,2,3,0,3,1,1,0,0,1,0,0,0,1,0,0,3,3,0,1,2,1,2,1,0,0,2,1,3,0,0,0,0,1,1,1,2,3,2,1,1,2,0,0,1,0,1,0,0,2,3,0,0,1,4,0,3,0,2,2,0,1,1,1,5,0,1,1,1,1,0,1,2,0,0,1,0,2,1,1,0,1,3,1,2,0,1,0,2,1,1,2,0,0,2,1,1,1,2,1,0,1,0,2,1,0,0,1,1,0,2,0,1,1,0,0,0,0,1,0,2,1,1,0,1,1,2,0,0,1,0,2,0,1,0,2,1,1,1,2,0,0,3,0,0,1,1,2,1,1,1,0,3,0,0,0,0,0,4,0,1,1,0,1,1,1,0,0,1,2,1,0,0,1,0,2,0,0,1,2,1,0,1,1,0,1,0,3,0,0,0,1,0,1,2,1,3,2,0,2,0,0,0,1,0,3,2,1,0,2,0,2,1,3,2,2,0,3,0,0,0,2,2,1,0,0,0,0,2,1,2,0,0,3,2,0,2,1,1,0,1,2,0,1,2,2,1,1,1,3,0,2,0,0,1,0,1,2,3,2,0,2,0,2,1,0,0,2,1,0,4,0,1,0,1,0,0,0,1,0,0,2,1,1,1,1,4,0,1,3,1,2,2,1,1,2,0,1,0,2,1,1,2,1,2,1,1,0,1,1,2,0,0,3,1,2,3,1,1,0,2,1,0,0,0,2,3,0,2,0,0,2,1,2,4,0,1,2,2,3,0,0,1,1,1,3,1,1,0,1,0,1,2,0,2,1,0,1,2,2,0,1,0,1,2,1,1,0,0,0,1,0,2,2,1,0,1,0,2,1,0,1,0,0,1,1,1,2,3,1,0,0,3,1,0,0,1,0,0,0,0,0,1,1,1,1,2,1,2,1,3,0,0,0,3,0,0,0,1,0,3,0,0,1,0,0,0,1,1,2,0,0,2,0,1,1,0,1,0,0,0,1,3,2,2,2,2,2,0,1,2,2,2,4,0,1,2,0,2,1,1,1,0,0,1,0,0,0,0,1,2,2,2,0,0,3,0,3,3,2,0,1,1,0,1,0,0,1,1,1,3,0,2,1,2,1,0,0,1,0,0,0,1,1,2,1,0,1,1,0,2,0,0,1,0,0,1,2,1,2,3,1,1,0,0,0,1,0,1,2,1,0,1,1,1,1,0,1,2,0,0,2,1,2,1,1,2,0,1,1,0,3,2,0,0,2,0,2,0,1,0,0,1,0,2,1,1,0,3,0,3,0,0,1,0,1,1,0,0,1,1,1,0,1,0,1,0,0,1,0,3,2,2,0,0,1,1,1,3,0,0,4,3,1,2,0,1,0,0,1,0,1,2,1,1,2,1,1,0,0,0,0,0,0,1,0,2,0,0,0,0,1,2,0,1,3,0,1,1,0,0,1,3,3,1,0,0,0,0,1,3,2,2,0,0,0,1,3,0,0,0,1,0,0,1,1,0,1,0,4,2,0,0,1,2,1,3,4,2,2,1,0,0,2,2,1,1,2,1,3,0,1,2,2,0,1,0,2,1,0,3,0,1,0,1]},{"counters":[0,2,0,0,0,1,0,1,3,1,0,1,2,1,0,2,0,0,2,0,0,1,0,1,1,0,1,1,1,1,0,1,2,1,1,1,1,0,2,0,0,1,2,3,0,0,0,3,4,2,0,1,2,1,1,1,2,1,2,2,5,0,2,0,0,0,3,2,1,1,2,1,2,2,1,1,3,0,1,1,0,3,0,1,3,1,0,0,1,0,1,0,3,2,0,1,0,0,0,2,2,0,1,0,2,1,1,2,0,0,0,2,4,1,0,0,1,0,1,1,1,2,1,2,1,1,3,2,0,1,2,0,2,3,2,3,0,1,1,2,0,0,4,1,0,2,2,0,0,0,1,0,1,3,0,0,0,0,1,0,0,0,1,0,2,1,1,0,1,0,0,3,1,1,0,2,0,1,1,0,3,1,2,1,2,5,0,1,0,1,1,0,0,3,1,0,0,0,0,2,1,0,1,1,2,1,0,2,0,0,0,1,1,2,1,1,1,2,4,4,0,2,2,0,1,0,0,1,0,0,4,1,2,0,1,1,1,1,2,0,0,1,4,2,2,1,1,1,2,1,0,1,2,1,1,3,1,2,2,0,1,1,1,0,1,0,2,1,1,0,1,2,0,2,0,1,0,0,1,0,1,0,3,1,3,3,1,1,1,2,2,1,0,0,1,2,0,0,0,0,0,2,2,2,1,1,1,0,0,3,1,1,0,1,0,0,0,0,1,2,1,2,3,3,1,2,1,2,1,2,0,1,1,1,0,1,0,0,1,2,1,0,1,2,0,1,1,1,2,1,3,2,0,1,1,1,0,1,1,2,0,0,2,2,0,1,0,1,0,1,1,0,0,3,1,2,1,0,1,1,1,1,0,0,1,0,0,1,1,2,0,2,0,1,3,1,0,0,1,3,1,1,0,0,0,0,1,0,1,1,1,2,1,1,2,0,0,2,1,0,0,1,0,0,3,1,0,0,2,2,2,2,2,1,3,1,1,1,0,5,0,1,2,0,0,1,1,1,0,0,2,1,0,1,2,1,1,0,0,0,2,1,1,0,0,1,2,0,1,0,1,0,1,2,1,2,1,0,0,0,0,0,0,2,2,1,3,0,0,1,0,2,0,0,2,0,1,0,1,0,0,3,2,1,0,0,1,0,0,0,1,0,0,1,0,1,2,0,1,3,0,0,0,1,1,0,1,0,1,0,0,1,2,0,2,3,2,2,1,0,1,0,1,3,1,2,1,1,0,0,1,2,0,0,3,1,3,1,0,0,4,0,1,2,2,1,3,0,1,0,2,2,0,0,1,0,2,0,2,0,1,1,1,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1,2,0,1,0,1,2,1,0,1,0,1,4,1,0,1,1,0,1,1,0,0,0,3,0,0,0,1,1,1,0,2,2,2,1,3,1,1,1,2,0,1,1,2,0,0,0,1,0,1,0,2,0,0,3,3,0,0,0,0,1,0,1,0,2,1,1,0,0,2,2,0,1,0,1,0,2,1,1,1,2,3,1,1,0,1,0,1,1,2,2,1,0,0,2,1,0,1,4,2,3,1,0,1,0,2,2,1,1,1,1,1,2,0,1,2,0,0,0,1,2,0,0,0,0,0,2,0,1,1,1,0,3,0,2,1,0,0,1,0,0,2,1,1,0,3,0,2,1,0,1,1,0,1,1,0,1,4,3,0,1,0,1,3,3,0,1,0,1,0,1,0,2,0,1,0,2,1,1,4,4,0,2,2,2,0,0,0,0,2,0,0,1,2,1,0,1,0,1,0,1,1,0,2,2,1,1,0,1,0,0,1,0,3,1,1,1,2,1,1,0,0,4,3,2,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,3,1,1,1,0,1,0,1,1,0,2,0,1,1,2,1,0,0,1,1,1,4,1,2,0,1,0,1,0,0,1,0,0,5,0,2,1,2,2,0,1,1,3,1,1,0,1,2,2,0,1,1,3,1,2,0,1,1,1,1,2,0,1,1,0,3,0,0,0,1,1,2,2,3,1,0,0,2,0,0,0,2,2,3,1,2,1,1,1,1,0,0,1,0,0,1,1,0,0,0,1,1,0,1,2,2,3,0,1,1,0,1,5,1,2,1,4,0,1,0,0,1,1,0,1,1,1,0,1,0,2,2,2,0,2,1,1,0,2,2,1,3,1,2,0,1,1,0,1,3,0,2,1,2,0,1,2,0,1,2,1,2,1,2,0,0,1,3,0,1,0,2,1,1,1,0,1,3,0,1,0,4,0,0,1,0,0,0,0,0,0,5,1,1,1,0,0,1,0,4,1,2,0,0,1,1,2,1,3,1,4,1,1,0,1,1,1,0,1,3,1,1,1,0,1,2,1,1,2,0,1,4,0,0,1,2,1,4,1,2,0,2,0,0,1,0,1,1,1,0,1,0,1,1,0,2,1,0,1,1,1,0,2,0,3,0,1,1,0,0,1,2,0,1,4,0,0,3,2,1,1,0,0,3,2,1,1,1,2,2,0,1,1,1,1,0,0,3,1,0,2,0,0,1,4,3,1,0,0,1,0,1,2,0,0,0,1,2,0,3,1,2,0,2,1,1,0,1,1,1,1,1,0,1,2,0,1,1,0,1,1,2,1,0,0,1,0,1,2,0,4,0,0,1,1,1,0,0,3,0,1,2,1,1,0,0,1,1,1,2,0,0,2,0,0,0,1,2,0,1,1,1,2,0,0,1,0,2,3,0,0,0,1,0,3,1,3,1,0,2,0,2,1,0,1,1,3,1,1,1,1,0,0,0,1,0,1,0,2,0,1,1,3,0,1,1,0,1,0,2,3,0,1,1,0,2,4,0,0,0,0,1,0,2,1,0,1,2,1,1,1,1,1,0,1,1,1,1,1,2,1,1,0,3,0,0,0,2,1,1,1,1,3,0,0,0,0,4,1,0,0,1,0,3,0,1,0,1,3,1,0,0,0,0,1,2,1,0,1,0,3,0,2,0,2,2,3,2,2,0,2,2,1,1,2,0,0,4,2,4,1,1,1,2,3,1,0,1,1,0,3,1,2,2,0,1,0,0,1,2,1,1,1,0,0,0,0,1,1,1,1,1,0,0,2,1,2,1,0,2,1,0,1,0,1,2,3,0,1,0,0,3,0,0,1,1,1,1,2,0,1,2,1,1,0,1,1,0,0,0,1,0,0,1,0,1,2,0,3,2,2,2,2,2,0,0,0,0,2,1,1,2,0,0,1,0,1,0,3,0,0,0,0,0,3,0,0,1,2,2,0,3,0,2,2,2,1,1,2,1,0,1,0,0,1,0,1,1,0,0,0,0,1,1,4,0,0,0,1,0,1,0,1,4,2,0,5,0,1,0,1,0,1,0,0,2,1,0,1,0,3,0,0,1,1,2,0,1,1,0,0,2,1,1,0,1,1,1,2,3,1,2,1,0,0,2,0,3,1,0,0,1,0,2,0,1,0,0,3,0,0,1,2,2,1,1,1,0,0,2,0,1,2,0,1,3,0,0,1,2,0,0,2,1,0,0,0,1,1,0,0,0,1,0,0,2,1,2,1,1,1,0,2,2,1,0,1,0,1,0,0,1,3,2,0,0,2,2,2,1,1,0,0,1,1,1,2,1,0,2,1,0,4,3,1,1,3,1,2,0,2,1,3,0,0,0,0,0,0,2,3,1,1,1,4,0,0,0,0,0,2,1,0,0,1,0,1,1,1,2,0,1,1,0,0,0,1,0,3,0,3,0,1,3,1,0,1,1,2,1,1,0,2,1,2,1,1,0,1,1,0,1,0,4,1,0,1,2,3,1,0,0,1,1,1,1,0,0,2,1,0,0,0,0,1,2,1,0,0,1,2,0,0,5,0,0,0,1,0,0,1,0,3,0,1,0,1,2,0,1,2,5,2,0,3,0,0,2,0,2,2,1,0,1,0,1,1,0,1,2,0,2,1,1,0,1,0,2,1,2,0,2,1,3,1,1,0,2,1,1,0,0,0,1,0,2,0,2,1,1,1,0,1,0,2,2,1,1,0,1,2,2,1,2,0,1,0,2,2,2,2,0,2,0,1,0,1,2,2,1,0,2,0,2,2,1,1,1,4,1,0,0,1,0,1,0,1,1,0,2,1,0,4,1,0,1,0,1,0,0,1,0,0,2,0,0,0,0,1,0,1,2,4,0,1,0,2,2,2,3,0,1,0,3,0,1,1,2,1,0,2,0,1,2,0,4,0,1,1,2,1,0,3,2,0,0,2,1,3,0,0,0,3,1,2,0,1,0,0,0,1,2,0,0,1,2,0,2,0,0,2,1,1,1,3,0,0,1,1,0,1,0,1,1,0,0,0,1,0,0,3,2,1,1,0,1,0,0,2,0,2,0,1,1,2,1,0,0,0,4,0,0,0,1,0,0,1,1,0,1,0,2,1,0,0,2,2,1,1,2,0,1,1,1,0,0,1,0,1,1,3,1,0,0,0,3,1,0,2,2,0,1,2,1,2,0,0,1,0,0,1,0,0,3,0,1,3,0,2,2,1,0,0,1,0,0,0,2,4,2,0,0,4,0]}]},"null_count":0,"last_update_version":397952046391361536},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDIxNzczMzk=","upper_bound":"LTIxMzUwNzc4MTY=","repeats":1},{"count":16,"lower_bound":"LTIxMzA0NzI3ODk=","upper_bound":"LTIxMTY1NjcyODc=","repeats":1},{"count":24,"lower_bound":"LTIxMTY0OTg5NDk=","upper_bound":"LTIwODQxNDQ0MTc=","repeats":1},{"count":32,"lower_bound":"LTIwODA1NTEwNjg=","upper_bound":"LTIwNjQ2MzIzOTM=","repeats":1},{"count":40,"lower_bound":"LTIwNjMxNTY5MDg=","upper_bound":"LTIwNDQ2MjUxNTY=","repeats":1},{"count":48,"lower_bound":"LTIwNDIwMzU3MDE=","upper_bound":"LTIwMjUzMjk1MDM=","repeats":1},{"count":56,"lower_bound":"LTIwMjI5MTU1Mzc=","upper_bound":"LTIwMjA0MzEzNjQ=","repeats":1},{"count":64,"lower_bound":"LTIwMTc4MDQxNjU=","upper_bound":"LTIwMDg5NDcxMjU=","repeats":1},{"count":72,"lower_bound":"LTIwMDE4NzY0OTE=","upper_bound":"LTE5OTMwNjg5ODE=","repeats":1},{"count":80,"lower_bound":"LTE5ODYyMjg0Njk=","upper_bound":"LTE5ODA3NTkwMDE=","repeats":1},{"count":88,"lower_bound":"LTE5Nzk4NDQ0NTI=","upper_bound":"LTE5NTQ0MjEwNTk=","repeats":1},{"count":96,"lower_bound":"LTE5NTQxMDkzMzQ=","upper_bound":"LTE5NDE1MjAyMTU=","repeats":1},{"count":104,"lower_bound":"LTE5MjkyNjMwNjQ=","upper_bound":"LTE5MTUzNDg4NTE=","repeats":1},{"count":112,"lower_bound":"LTE5MTI4Mjc5NDY=","upper_bound":"LTE5MDQ2NTgzNzM=","repeats":1},{"count":120,"lower_bound":"LTE4ODg3ODUzNTk=","upper_bound":"LTE4NTY2NTUwMTI=","repeats":1},{"count":128,"lower_bound":"LTE4NTY0MzE2OTI=","upper_bound":"LTE4NTA0ODMyMzQ=","repeats":1},{"count":136,"lower_bound":"LTE4NTAwMTczMjQ=","upper_bound":"LTE4NDQ5MTYxMDM=","repeats":1},{"count":144,"lower_bound":"LTE4Mzg0ODgxNTA=","upper_bound":"LTE4MDc2NDczNDE=","repeats":1},{"count":152,"lower_bound":"LTE3NzgyNzQ4MzE=","upper_bound":"LTE3Njg0ODM4ODE=","repeats":1},{"count":160,"lower_bound":"LTE3Njc1ODcyMDQ=","upper_bound":"LTE3NTM5NTQ5NTU=","repeats":1},{"count":168,"lower_bound":"LTE3NTI0MzYyNTE=","upper_bound":"LTE3Mzk4MzE2NTQ=","repeats":1},{"count":176,"lower_bound":"LTE3MzY1MDc4Mjc=","upper_bound":"LTE3MzEyMzU2Njg=","repeats":1},{"count":184,"lower_bound":"LTE3MTg1MDg2OTI=","upper_bound":"LTE3MDg1NDkzODk=","repeats":1},{"count":192,"lower_bound":"LTE2OTk0MzUwNzU=","upper_bound":"LTE2ODQ1NTY4NTQ=","repeats":1},{"count":200,"lower_bound":"LTE2ODM2MDU0MzQ=","upper_bound":"LTE2NzUyMDc3MTA=","repeats":1},{"count":208,"lower_bound":"LTE2NzQ5NTUxMDU=","upper_bound":"LTE2NjIyMTQ1Mjc=","repeats":1},{"count":216,"lower_bound":"LTE2NTc5NzExMjc=","upper_bound":"LTE2Mjg2MDAzOTU=","repeats":1},{"count":224,"lower_bound":"LTE2MjY3NjI1NjQ=","upper_bound":"LTE1ODQzNzI1Mzg=","repeats":1},{"count":232,"lower_bound":"LTE1NzkzNTE1NjY=","upper_bound":"LTE1NzI3MTEzMjI=","repeats":1},{"count":240,"lower_bound":"LTE1NjU5NDU4NTc=","upper_bound":"LTE1NTg2ODY3MTA=","repeats":1},{"count":248,"lower_bound":"LTE1NTgzODI2ODA=","upper_bound":"LTE1NDM3NDE3NDM=","repeats":1},{"count":256,"lower_bound":"LTE1NDE3OTA2Mzg=","upper_bound":"LTE1MzA0NDY2ODY=","repeats":1},{"count":264,"lower_bound":"LTE1MzA0MjgwNTY=","upper_bound":"LTE1MDE5NTExMzE=","repeats":1},{"count":272,"lower_bound":"LTE0OTQyMzY2OTU=","upper_bound":"LTE0OTE5NTc1NzM=","repeats":1},{"count":280,"lower_bound":"LTE0OTA3NDg3MzQ=","upper_bound":"LTE0NzM5MDE3Mjk=","repeats":1},{"count":288,"lower_bound":"LTE0NzIwNjI0NTA=","upper_bound":"LTE0NDcxMTIzMjQ=","repeats":1},{"count":296,"lower_bound":"LTE0NDYxNjU0MTY=","upper_bound":"LTE0Mzk0NzEwNTI=","repeats":1},{"count":304,"lower_bound":"LTE0Mzg4Njk3MTI=","upper_bound":"LTE0MjY1MzAzMzA=","repeats":1},{"count":312,"lower_bound":"LTE0MTMxMzMyNzA=","upper_bound":"LTE0MDcwMjA5NTY=","repeats":1},{"count":320,"lower_bound":"LTE0MDUzMzA0NjE=","upper_bound":"LTEzODI1MDk3NzA=","repeats":1},{"count":328,"lower_bound":"LTEzODA3OTY0MDc=","upper_bound":"LTEzNjg2NDE2MzA=","repeats":1},{"count":336,"lower_bound":"LTEzNjY4OTIyNjA=","upper_bound":"LTEzNjA0MjgxMTM=","repeats":1},{"count":344,"lower_bound":"LTEzNTc0MTcxNjg=","upper_bound":"LTEzNDk5MTk0MTY=","repeats":1},{"count":352,"lower_bound":"LTEzNDg0MTQ5MjQ=","upper_bound":"LTEzNDAyMTA5ODE=","repeats":1},{"count":360,"lower_bound":"LTEzMzkxNzMwODM=","upper_bound":"LTEzMjQ3MjYwNTQ=","repeats":1},{"count":368,"lower_bound":"LTEzMTg1MzUzNDA=","upper_bound":"LTEyODY1MTEwMzA=","repeats":1},{"count":376,"lower_bound":"LTEyODUxNzU2MTM=","upper_bound":"LTEyNzkwMTkwNjM=","repeats":1},{"count":384,"lower_bound":"LTEyNzgwODkxODk=","upper_bound":"LTEyNzIxNzU3MjE=","repeats":1},{"count":392,"lower_bound":"LTEyNjQ3OTA0NDI=","upper_bound":"LTEyMzkwMDA2NTg=","repeats":1},{"count":400,"lower_bound":"LTEyMzU1Mzk1Nzk=","upper_bound":"LTEyMjYyNDY4Nzg=","repeats":1},{"count":408,"lower_bound":"LTEyMjU0ODE0MzY=","upper_bound":"LTEyMTk1NTY0OTY=","repeats":1},{"count":416,"lower_bound":"LTEyMTU1MTI2NDE=","upper_bound":"LTExOTcyMjE4MjY=","repeats":1},{"count":424,"lower_bound":"LTExOTcxNjMzNzE=","upper_bound":"LTExODY4OTk3NTY=","repeats":1},{"count":432,"lower_bound":"LTExODU1NjkwMTY=","upper_bound":"LTExNzY4MDYzNDI=","repeats":1},{"count":440,"lower_bound":"LTExNzUwNTU4Nzg=","upper_bound":"LTExNTc3MDMxODg=","repeats":1},{"count":448,"lower_bound":"LTExNTA5NTMxOTU=","upper_bound":"LTExMTk5NzQ4MDY=","repeats":1},{"count":456,"lower_bound":"LTExMTM2Mjg2NzY=","upper_bound":"LTExMDkzMTMyMDk=","repeats":1},{"count":464,"lower_bound":"LTExMDg1NDc2NTg=","upper_bound":"LTExMDQ2MTQ0MjQ=","repeats":1},{"count":472,"lower_bound":"LTExMDM4NTkyNTY=","upper_bound":"LTEwODg3ODkzODc=","repeats":1},{"count":480,"lower_bound":"LTEwODg1NjI2Nzc=","upper_bound":"LTEwNzU5ODkyNTQ=","repeats":1},{"count":488,"lower_bound":"LTEwNzQ3MDIwMjU=","upper_bound":"LTEwNjg1NTg1NTc=","repeats":1},{"count":496,"lower_bound":"LTEwNTM4MzIzMTY=","upper_bound":"LTEwMzM2NTEyNTA=","repeats":1},{"count":504,"lower_bound":"LTEwMzI1MDM1MTI=","upper_bound":"LTEwMjMwODU1NzE=","repeats":1},{"count":512,"lower_bound":"LTEwMTg1NDgyNjk=","upper_bound":"LTk5NzM3OTczMA==","repeats":1},{"count":520,"lower_bound":"LTk5NjQ5MDY2MQ==","upper_bound":"LTk5MDA2MTEyOQ==","repeats":1},{"count":528,"lower_bound":"LTk4MTEwNzU5MQ==","upper_bound":"LTk3MjYwODAyOQ==","repeats":1},{"count":536,"lower_bound":"LTk1Mzg3OTc5NQ==","upper_bound":"LTk0MjU5MDA1MQ==","repeats":1},{"count":544,"lower_bound":"LTk0MjQ1MDEyMQ==","upper_bound":"LTkyNTk5NTEyMQ==","repeats":1},{"count":552,"lower_bound":"LTkyNTIzMDEzMg==","upper_bound":"LTkxMTk5MjU4NQ==","repeats":1},{"count":560,"lower_bound":"LTkxMTAxODc0Ng==","upper_bound":"LTkwMTkwMDU0Mw==","repeats":1},{"count":568,"lower_bound":"LTg5NDk4NDg0MQ==","upper_bound":"LTg4MTQzMDczMA==","repeats":1},{"count":576,"lower_bound":"LTg3Nzg3OTA3Mg==","upper_bound":"LTg1NTU3MTAwMg==","repeats":1},{"count":584,"lower_bound":"LTg0OTY2NjcwNw==","upper_bound":"LTg0Mzk0NjExOQ==","repeats":1},{"count":592,"lower_bound":"LTg0MzMxMzk3NA==","upper_bound":"LTgzNzc2NzQ3NQ==","repeats":1},{"count":600,"lower_bound":"LTgzNjM4OTkyOA==","upper_bound":"LTgyNTc0MjU3NQ==","repeats":1},{"count":608,"lower_bound":"LTgyMDk1NDU0NQ==","upper_bound":"LTgxMzMxMzI0Mw==","repeats":1},{"count":616,"lower_bound":"LTgxMzI2MTI0OA==","upper_bound":"LTgwMjk2ODA1MQ==","repeats":1},{"count":624,"lower_bound":"LTgwMDkyNDIxOA==","upper_bound":"LTc3NzA2NTUyMg==","repeats":1},{"count":632,"lower_bound":"LTc3NjU2MTg0Mg==","upper_bound":"LTc2Nzg1NDcxOA==","repeats":1},{"count":640,"lower_bound":"LTc2NjkxMjkyOA==","upper_bound":"LTc1NDQ2NDE2Nw==","repeats":1},{"count":648,"lower_bound":"LTczOTc2Njc2OQ==","upper_bound":"LTcyMjgxNzY4Mw==","repeats":1},{"count":656,"lower_bound":"LTcxNDY5OTAwOA==","upper_bound":"LTcwMzI5Nzc2NA==","repeats":1},{"count":664,"lower_bound":"LTY5ODQ0NDY2OQ==","upper_bound":"LTY4MjcxMzkxNw==","repeats":1},{"count":672,"lower_bound":"LTY3NTM1OTU5NA==","upper_bound":"LTY2MzgxNTkxOA==","repeats":1},{"count":680,"lower_bound":"LTY1NTYxMDY4MQ==","upper_bound":"LTY0NjQxMzc0Nw==","repeats":1},{"count":688,"lower_bound":"LTY0NDMyOTM1Ng==","upper_bound":"LTYyODQ0MjI3MQ==","repeats":1},{"count":696,"lower_bound":"LTYyNDU3OTU0NA==","upper_bound":"LTYwODgwOTQ0Ng==","repeats":1},{"count":704,"lower_bound":"LTU5NzQ4MTI1Mg==","upper_bound":"LTU5MzUwNDM3MQ==","repeats":1},{"count":712,"lower_bound":"LTU3NTYyOTUyMw==","upper_bound":"LTU2NzYzNjU2OQ==","repeats":1},{"count":720,"lower_bound":"LTU2NjgzMjUxNA==","upper_bound":"LTU2MDM3NjIxNA==","repeats":1},{"count":728,"lower_bound":"LTU1NTU0MDQ2NA==","upper_bound":"LTU0NzU2NjM0Ng==","repeats":1},{"count":736,"lower_bound":"LTU0NTgxNjQ0MA==","upper_bound":"LTUyNDY2NDkxMQ==","repeats":1},{"count":744,"lower_bound":"LTUxNjA5OTE5Mw==","upper_bound":"LTUwNDA2MjMxNA==","repeats":1},{"count":752,"lower_bound":"LTQ5ODg0MzM1Mw==","upper_bound":"LTQ4OTg5MDY2Mw==","repeats":1},{"count":760,"lower_bound":"LTQ4ODcxODU2MQ==","upper_bound":"LTQ2NTkyMDAyMw==","repeats":1},{"count":768,"lower_bound":"LTQ1Mjk3NTg0OQ==","upper_bound":"LTQzNTc4NDYxMA==","repeats":1},{"count":776,"lower_bound":"LTQzMTcwNzQ1NQ==","upper_bound":"LTQyNDYzMjgwNA==","repeats":1},{"count":784,"lower_bound":"LTQyMDQ2MjM4Ng==","upper_bound":"LTM5OTYwMTQ3Ng==","repeats":1},{"count":792,"lower_bound":"LTM5OTIwMDg4OQ==","upper_bound":"LTM4Nzc2NTcyMA==","repeats":1},{"count":800,"lower_bound":"LTM3MTAwMDgzMg==","upper_bound":"LTM1MjU5MzQ4Ng==","repeats":1},{"count":808,"lower_bound":"LTM0NjQzMjgwMA==","upper_bound":"LTMyMTM2MzEwNA==","repeats":1},{"count":816,"lower_bound":"LTMxNzMyMzk0OA==","upper_bound":"LTMwMzE4ODUyNw==","repeats":1},{"count":824,"lower_bound":"LTMwMTA3NDI0Ng==","upper_bound":"LTI4ODYwNDkwNg==","repeats":1},{"count":832,"lower_bound":"LTI4Nzc3MjE0OQ==","upper_bound":"LTI3NjUxMjY4MQ==","repeats":1},{"count":840,"lower_bound":"LTI3MTcxOTAwNQ==","upper_bound":"LTI2NTU1ODA0Nw==","repeats":1},{"count":848,"lower_bound":"LTI2NDI5NTUzNA==","upper_bound":"LTIzOTQzMTc2Nw==","repeats":1},{"count":856,"lower_bound":"LTIzODM3NTMzOA==","upper_bound":"LTIyMTk2NzkzNg==","repeats":1},{"count":864,"lower_bound":"LTIxOTc2OTQ2Ng==","upper_bound":"LTE4MzUxODc0Mw==","repeats":1},{"count":872,"lower_bound":"LTE4MDA0NzQyMg==","upper_bound":"LTE3MjIwOTgxMg==","repeats":1},{"count":880,"lower_bound":"LTE2Mzg4MjY0OA==","upper_bound":"LTE1MjM0NTQxOA==","repeats":1},{"count":888,"lower_bound":"LTE0NDA3MTMwNA==","upper_bound":"LTEzMjQxMTQyMw==","repeats":1},{"count":896,"lower_bound":"LTEzMTgyMDExNQ==","upper_bound":"LTEyMzc0MTExOA==","repeats":1},{"count":904,"lower_bound":"LTEyMzI0MTgxNQ==","upper_bound":"LTExNTEyNjE5MQ==","repeats":1},{"count":912,"lower_bound":"LTEwNjYxMzU3MA==","upper_bound":"LTg0NTA1Mjg1","repeats":1},{"count":920,"lower_bound":"LTgzMDU1MTYz","upper_bound":"LTY4MTQ1NjU1","repeats":1},{"count":928,"lower_bound":"LTY3OTc4MzYy","upper_bound":"LTUzMjk5ODI4","repeats":1},{"count":936,"lower_bound":"LTQ4OTYwMjE3","upper_bound":"LTQ0Mzk0MzUx","repeats":1},{"count":944,"lower_bound":"LTQzMzE2OTU3","upper_bound":"LTM5NzczODY2","repeats":1},{"count":952,"lower_bound":"LTM3NzI1MzEy","upper_bound":"LTI1MzcyNzI3","repeats":1},{"count":960,"lower_bound":"LTI0NTkxMjAz","upper_bound":"LTE4ODg1Nzcz","repeats":1},{"count":968,"lower_bound":"LTE2NjEwNDMw","upper_bound":"LTExMzIwNTc4","repeats":1},{"count":976,"lower_bound":"LTc1MDY0MTg=","upper_bound":"MTM3MjEyNjc=","repeats":1},{"count":984,"lower_bound":"MTQyNDk1NDA=","upper_bound":"Mjk1ODQ3MTg=","repeats":1},{"count":992,"lower_bound":"MzIwNzAyMDI=","upper_bound":"NDAxNjQ2MTU=","repeats":1},{"count":1000,"lower_bound":"NDIyNDU0MzM=","upper_bound":"NDc2NzYwOTg=","repeats":1},{"count":1008,"lower_bound":"NDkzMTYzNDA=","upper_bound":"NTYzMjY3NzY=","repeats":1},{"count":1016,"lower_bound":"NTY3NjUyNDQ=","upper_bound":"NjY0ODM4NDI=","repeats":1},{"count":1024,"lower_bound":"NzY0NTUwMzU=","upper_bound":"ODY3ODYzNDI=","repeats":1},{"count":1032,"lower_bound":"ODc3OTUxMjU=","upper_bound":"OTE4NjM2NzY=","repeats":1},{"count":1040,"lower_bound":"OTE4OTYwMTQ=","upper_bound":"MTA4NzIyNzc1","repeats":1},{"count":1048,"lower_bound":"MTEwNTM4Nzgx","upper_bound":"MTE4OTM2OTEx","repeats":1},{"count":1056,"lower_bound":"MTE5MjkxODcz","upper_bound":"MTMzMzYyMzA4","repeats":1},{"count":1064,"lower_bound":"MTQ4MTA0MjEx","upper_bound":"MTU3MzU2NzEz","repeats":1},{"count":1072,"lower_bound":"MTU5ODc5Mzcz","upper_bound":"MTcyMzY2NTg2","repeats":1},{"count":1080,"lower_bound":"MTcyNDE5NjI5","upper_bound":"MTgyODIxOTk4","repeats":1},{"count":1088,"lower_bound":"MTg5OTMyNDQ4","upper_bound":"MTkzNTc4NzQ4","repeats":1},{"count":1096,"lower_bound":"MTk0NDIyMTk4","upper_bound":"MjE0OTU4OTU2","repeats":1},{"count":1104,"lower_bound":"MjIxNDQxNDMy","upper_bound":"MjM0MDY1MjAx","repeats":1},{"count":1112,"lower_bound":"MjQzNDU1MjYw","upper_bound":"MjQ5MjQxNTkz","repeats":1},{"count":1120,"lower_bound":"MjUwODc4NjU1","upper_bound":"MjgyNjE0NzMw","repeats":1},{"count":1128,"lower_bound":"Mjg5NjI0NzI4","upper_bound":"Mjk1NzczMjk4","repeats":1},{"count":1136,"lower_bound":"MzAzNDU1MDEw","upper_bound":"MzA4MjYyMDQ0","repeats":1},{"count":1144,"lower_bound":"MzExNzUxMDIx","upper_bound":"MzIyNTA1Njcw","repeats":1},{"count":1152,"lower_bound":"MzI3ODQ1MDA3","upper_bound":"MzQ3NTg5NDIz","repeats":1},{"count":1160,"lower_bound":"MzU3NzkxMzEw","upper_bound":"MzczNDQxMjU1","repeats":1},{"count":1168,"lower_bound":"Mzg1NTg4MDcy","upper_bound":"NDEzODQxOTcx","repeats":1},{"count":1176,"lower_bound":"NDI0OTgzNTI2","upper_bound":"NDM4OTMxNTk0","repeats":1},{"count":1184,"lower_bound":"NDQxNzAwMzgy","upper_bound":"NDQ3MzE5MDgy","repeats":1},{"count":1192,"lower_bound":"NDQ4NjQ0NDc0","upper_bound":"NDU1MDgzNTA5","repeats":1},{"count":1200,"lower_bound":"NDYwOTI5Njk4","upper_bound":"NDc4ODQ2NDcx","repeats":1},{"count":1208,"lower_bound":"NDgzNzMzMDk2","upper_bound":"NDg4NzY1NDU1","repeats":1},{"count":1216,"lower_bound":"NDg5MDc5MTI2","upper_bound":"NDk1OTYwOTUx","repeats":1},{"count":1224,"lower_bound":"NDk2ODE5OTAy","upper_bound":"NTAyMjcxMTYw","repeats":1},{"count":1232,"lower_bound":"NTA4MzI3Nzg3","upper_bound":"NTE2Njk1Mzg4","repeats":1},{"count":1240,"lower_bound":"NTIyNTkxODY2","upper_bound":"NTI5NDgwMDQy","repeats":1},{"count":1248,"lower_bound":"NTMzMzU4MDI2","upper_bound":"NTQxODY2Njg0","repeats":1},{"count":1256,"lower_bound":"NTQzOTIzMjAz","upper_bound":"NTQ5NDQ4MDgy","repeats":1},{"count":1264,"lower_bound":"NTY3NTkyNjg5","upper_bound":"NTc4NTMwMjE4","repeats":1},{"count":1272,"lower_bound":"NTgyNTk5Nzc5","upper_bound":"NTkwNzkyOTkw","repeats":1},{"count":1280,"lower_bound":"NTkyNTQ2MDgx","upper_bound":"NTk5NTY3ODUy","repeats":1},{"count":1288,"lower_bound":"NjAxODczOTU4","upper_bound":"NjEwMzg3ODUy","repeats":1},{"count":1296,"lower_bound":"NjEyODk4OTM5","upper_bound":"NjIwNDY4NzE1","repeats":1},{"count":1304,"lower_bound":"NjIwODUyODY2","upper_bound":"NjM1NjY4NzMy","repeats":1},{"count":1312,"lower_bound":"NjM2NzIzOTgw","upper_bound":"NjUwMDM3NDc4","repeats":1},{"count":1320,"lower_bound":"NjUwNDgwNzQz","upper_bound":"NjY3MDE5MTA3","repeats":1},{"count":1328,"lower_bound":"NjcwNjcwMDI2","upper_bound":"Njg2MTkyNzIy","repeats":1},{"count":1336,"lower_bound":"Njg2ODg5NjQ0","upper_bound":"Njk3NDEzNTY3","repeats":1},{"count":1344,"lower_bound":"NzAxNzQxMTM5","upper_bound":"NzExMjQ2MDYy","repeats":1},{"count":1352,"lower_bound":"NzE1NDQwMTkw","upper_bound":"NzIxMjAxMDA2","repeats":1},{"count":1360,"lower_bound":"NzIxMzYwNDMw","upper_bound":"NzMxNzE0NTAx","repeats":1},{"count":1368,"lower_bound":"NzM2OTYzODUz","upper_bound":"NzQ1OTcyMzgz","repeats":1},{"count":1376,"lower_bound":"NzU1NTQ0NjMw","upper_bound":"NzY0MjQ5ODA5","repeats":1},{"count":1384,"lower_bound":"NzY2MTI5NTI1","upper_bound":"Nzc0NDYxMTQ4","repeats":1},{"count":1392,"lower_bound":"Nzc5OTUzMzg0","upper_bound":"Nzg5OTgzOTA5","repeats":1},{"count":1400,"lower_bound":"NzkxNDIwNTI3","upper_bound":"Nzk0NDExNTU1","repeats":1},{"count":1408,"lower_bound":"ODE3MjA5Nzk1","upper_bound":"ODIzNzY3ODU2","repeats":1},{"count":1416,"lower_bound":"ODI3MjY3Nzgz","upper_bound":"ODM3NDQ5MDAy","repeats":1},{"count":1424,"lower_bound":"ODQ5NTE2OTU2","upper_bound":"ODUzNDA3OTk4","repeats":1},{"count":1432,"lower_bound":"ODUzNDM0MTM1","upper_bound":"ODU3OTAwNjQ4","repeats":1},{"count":1440,"lower_bound":"ODYxNjc4OTM5","upper_bound":"ODc2OTA3Nzc5","repeats":1},{"count":1448,"lower_bound":"ODc3NTYyOTYw","upper_bound":"OTA5NTYxNDA2","repeats":1},{"count":1456,"lower_bound":"OTEzMjgyNjkx","upper_bound":"OTI1NjE5ODY0","repeats":1},{"count":1464,"lower_bound":"OTI2MjU0NTU2","upper_bound":"OTMwODA2OTk3","repeats":1},{"count":1472,"lower_bound":"OTMxMjU4NzQy","upper_bound":"OTU4MzkxMTUz","repeats":1},{"count":1480,"lower_bound":"OTY4MjE3NjQy","upper_bound":"OTkyNjI4MDAx","repeats":1},{"count":1488,"lower_bound":"OTkyODc2MjQ3","upper_bound":"MTAyNDQ3MzgwNw==","repeats":1},{"count":1496,"lower_bound":"MTAyNjgwNDQwNw==","upper_bound":"MTAzOTI5ODcwNA==","repeats":1},{"count":1504,"lower_bound":"MTAzOTc0OTA2Nw==","upper_bound":"MTA0NTk5ODI4MA==","repeats":1},{"count":1512,"lower_bound":"MTA1MDAxOTMwMw==","upper_bound":"MTA2MDkyMDU3NQ==","repeats":1},{"count":1520,"lower_bound":"MTA2MTM1NzkzMQ==","upper_bound":"MTA3NTM2OTcxNQ==","repeats":1},{"count":1528,"lower_bound":"MTA3OTI2OTEzOA==","upper_bound":"MTA5Mjc2ODIyMA==","repeats":1},{"count":1536,"lower_bound":"MTA5NDg3NDk5OA==","upper_bound":"MTEwOTQ1Nzk1NQ==","repeats":1},{"count":1544,"lower_bound":"MTExNjU5Njc1MA==","upper_bound":"MTEyNDIwMjA0OQ==","repeats":1},{"count":1552,"lower_bound":"MTEyNjkxNTI3Mw==","upper_bound":"MTE0MzE1ODkzMQ==","repeats":1},{"count":1560,"lower_bound":"MTE1MjkwMjE4NQ==","upper_bound":"MTE2MDUxOTgzNg==","repeats":1},{"count":1568,"lower_bound":"MTE2NzE4MDU0Mg==","upper_bound":"MTE4MDQ5NzI5MQ==","repeats":1},{"count":1576,"lower_bound":"MTE4MTk2MTIxMw==","upper_bound":"MTE5MjkzNTQyMg==","repeats":1},{"count":1584,"lower_bound":"MTE5ODU5NDUzNQ==","upper_bound":"MTIxMDUxNTE3OQ==","repeats":1},{"count":1592,"lower_bound":"MTIxNTAzNTc0NA==","upper_bound":"MTIyNTY4ODQ0Mg==","repeats":1},{"count":1600,"lower_bound":"MTIyNjkwNjc4Nw==","upper_bound":"MTIzNjgzMDM3Mw==","repeats":1},{"count":1608,"lower_bound":"MTIzODQ1MjY1MA==","upper_bound":"MTI0NTA3MjczNw==","repeats":1},{"count":1616,"lower_bound":"MTI1MTA5MDExNA==","upper_bound":"MTI3MzE3Mjc1NA==","repeats":1},{"count":1624,"lower_bound":"MTI3NTE4NDI3MA==","upper_bound":"MTMwMjQ5MzYxMA==","repeats":1},{"count":1632,"lower_bound":"MTMwMzYwMTAxMw==","upper_bound":"MTMxMzEyMTg2MQ==","repeats":1},{"count":1640,"lower_bound":"MTMyNTU3NzQ4OA==","upper_bound":"MTM0MDYyNzc0Ng==","repeats":1},{"count":1648,"lower_bound":"MTM0MzU3NDY1OQ==","upper_bound":"MTM0ODM3NjcxMA==","repeats":1},{"count":1656,"lower_bound":"MTM1MTUxMDU5MQ==","upper_bound":"MTM2Njk4NDIzMw==","repeats":1},{"count":1664,"lower_bound":"MTM3NDY4NDQ3Ng==","upper_bound":"MTQwOTY0MzkwNg==","repeats":1},{"count":1672,"lower_bound":"MTQxNjI0MzY3Mw==","upper_bound":"MTQyMTY3MjQ3Mg==","repeats":1},{"count":1680,"lower_bound":"MTQyMzAzOTk3Nw==","upper_bound":"MTQzNzAyOTE5NA==","repeats":1},{"count":1688,"lower_bound":"MTQzNzUxNzY4NQ==","upper_bound":"MTQ3MTMyMjQ0Ng==","repeats":1},{"count":1696,"lower_bound":"MTQ4MzY5NDI1Mw==","upper_bound":"MTUwNDEyMDE2Mw==","repeats":1},{"count":1704,"lower_bound":"MTUxMTA0NDcxMg==","upper_bound":"MTUyMDcwMDY5MA==","repeats":1},{"count":1712,"lower_bound":"MTUyMDgwODI0OQ==","upper_bound":"MTUzMjQ1NjkyMA==","repeats":1},{"count":1720,"lower_bound":"MTUzMjczNjY5Ng==","upper_bound":"MTUzNTA2NjkxOA==","repeats":1},{"count":1728,"lower_bound":"MTUzOTkzNTk2OA==","upper_bound":"MTU0ODQxMzYzNQ==","repeats":1},{"count":1736,"lower_bound":"MTU0OTExMjkyNA==","upper_bound":"MTU2ODY4MzI1Mg==","repeats":1},{"count":1744,"lower_bound":"MTU3Njk3MTY5Mw==","upper_bound":"MTU5MjM2MjAyNg==","repeats":1},{"count":1752,"lower_bound":"MTYwMDk1NDk5OQ==","upper_bound":"MTYwOTU5MTAwNA==","repeats":1},{"count":1760,"lower_bound":"MTYxMjQwNTAxMw==","upper_bound":"MTYyMTk1Mjk4OA==","repeats":1},{"count":1768,"lower_bound":"MTYyNDIzMTU1MA==","upper_bound":"MTYzNDI0NDQxMg==","repeats":1},{"count":1776,"lower_bound":"MTYzNzc5OTg0Mg==","upper_bound":"MTY1NjM3NjgyNg==","repeats":1},{"count":1784,"lower_bound":"MTY1ODUyOTgzMw==","upper_bound":"MTY3OTA0NzUzMg==","repeats":1},{"count":1792,"lower_bound":"MTY3OTQzODUyNQ==","upper_bound":"MTY5MDYzOTU0MA==","repeats":1},{"count":1800,"lower_bound":"MTY5MDc1NzYwNQ==","upper_bound":"MTcxODYwNjYxNA==","repeats":1},{"count":1808,"lower_bound":"MTc0ODg1Mzc2NQ==","upper_bound":"MTc1ODI4NTA5MA==","repeats":1},{"count":1816,"lower_bound":"MTc2ODcyODk3Mw==","upper_bound":"MTc4ODkwOTcxNg==","repeats":1},{"count":1824,"lower_bound":"MTc5MjY0ODE0NQ==","upper_bound":"MTc5NjY2NzYxMw==","repeats":1},{"count":1832,"lower_bound":"MTc5NzkwNTE0Ng==","upper_bound":"MTgwOTEwNjYxMQ==","repeats":1},{"count":1840,"lower_bound":"MTgxOTM1NjM5NA==","upper_bound":"MTgzMzg4MzExMA==","repeats":1},{"count":1848,"lower_bound":"MTg0MzAzMTMzMg==","upper_bound":"MTg1MjEwMDE1Mw==","repeats":1},{"count":1856,"lower_bound":"MTg1ODU3NjA2NA==","upper_bound":"MTg2MzkzNjQxMQ==","repeats":1},{"count":1864,"lower_bound":"MTg2NzE4ODYzNQ==","upper_bound":"MTg3OTkxMjUyMQ==","repeats":1},{"count":1872,"lower_bound":"MTg4MDU3NDU4Ng==","upper_bound":"MTkwMTU4NzE3Ng==","repeats":1},{"count":1880,"lower_bound":"MTkwMjcxNzAzMA==","upper_bound":"MTkxOTc3NDAyOQ==","repeats":1},{"count":1888,"lower_bound":"MTkyMTA4ODI1Mg==","upper_bound":"MTkzMTQ0OTQwOQ==","repeats":1},{"count":1896,"lower_bound":"MTkzMjE4MjI5MA==","upper_bound":"MTk0NDMxNzk0MA==","repeats":1},{"count":1904,"lower_bound":"MTk0OTk3ODAxNw==","upper_bound":"MTk1MjYyMjg0Ng==","repeats":1},{"count":1912,"lower_bound":"MTk1NDc4MjIyMQ==","upper_bound":"MTk4NjQwNDYwMw==","repeats":1},{"count":1920,"lower_bound":"MTk4Nzg0MzYxNA==","upper_bound":"MjAxMzIzNzA1OQ==","repeats":1},{"count":1928,"lower_bound":"MjAxNDUyNTM5OA==","upper_bound":"MjAxODY1NTQ4Ng==","repeats":1},{"count":1936,"lower_bound":"MjAzMTk2Nzc2MQ==","upper_bound":"MjAzNjgwMzc1OQ==","repeats":1},{"count":1944,"lower_bound":"MjAzOTE0ODY5NQ==","upper_bound":"MjA0NzI1MzE2Nw==","repeats":1},{"count":1952,"lower_bound":"MjA0NzM2Mzg2OQ==","upper_bound":"MjA1Mjc4MzQxNg==","repeats":1},{"count":1960,"lower_bound":"MjA1NTcyMDIzNw==","upper_bound":"MjA3ODE1OTY3NA==","repeats":1},{"count":1968,"lower_bound":"MjA4MzM5MDgyNQ==","upper_bound":"MjEwNjkyMjEzMw==","repeats":1},{"count":1976,"lower_bound":"MjEwOTk4MDc1NA==","upper_bound":"MjExNDIyNDg0Nw==","repeats":1},{"count":1984,"lower_bound":"MjExNTk1ODc3MQ==","upper_bound":"MjExOTMzMTE3Ng==","repeats":1},{"count":1992,"lower_bound":"MjEyNDI5NDAwMw==","upper_bound":"MjE0MDI3NTQzMA==","repeats":1},{"count":2000,"lower_bound":"MjE0MTI0OTMwNw==","upper_bound":"MjE0NTY1ODI1Ng==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,0,2,0,1,1,1,3,1,1,0,0,1,1,1,1,1,1,1,2,1,2,1,2,4,1,1,0,1,0,0,4,1,1,0,2,1,2,1,3,0,0,2,2,2,0,0,2,1,0,0,1,0,1,1,0,1,1,0,1,0,1,2,0,4,1,0,0,2,2,0,1,2,1,0,1,1,0,1,1,1,1,1,0,1,0,1,2,0,0,2,1,2,1,1,3,1,0,0,1,0,0,4,0,2,0,1,1,1,0,0,1,2,1,1,2,1,1,1,0,1,0,1,0,0,0,4,0,1,3,1,0,1,1,1,3,0,0,1,4,3,2,4,2,1,0,1,1,1,1,1,5,0,0,0,3,0,1,1,1,4,0,1,1,1,0,0,1,3,0,1,1,1,2,2,4,2,1,0,1,0,2,0,1,0,0,0,2,1,1,1,0,1,2,0,1,2,0,0,0,1,4,1,0,1,1,0,3,0,0,0,1,1,1,2,0,0,1,1,1,1,0,2,0,2,1,0,0,0,1,0,2,0,2,0,0,0,0,0,1,0,1,1,1,2,0,0,2,3,0,2,2,1,1,0,1,0,2,2,1,0,0,1,1,0,1,1,1,0,3,0,0,1,1,0,0,2,0,2,0,1,1,0,3,0,0,0,0,1,2,0,0,1,2,0,2,0,1,1,2,0,1,1,3,0,0,2,0,1,0,1,2,0,5,1,0,1,3,2,1,1,1,0,1,3,0,0,0,1,1,1,1,0,1,1,2,2,1,0,1,1,1,0,1,3,2,0,2,1,0,1,1,1,3,1,0,1,3,2,1,1,2,0,1,0,2,4,1,1,1,0,1,0,0,2,1,0,0,0,0,2,0,1,0,2,2,2,0,0,0,1,2,1,1,1,2,2,0,1,1,1,2,1,3,3,1,0,1,1,0,0,0,1,3,1,0,2,1,0,2,3,2,2,1,0,0,0,0,1,0,2,0,1,0,0,1,1,3,2,0,0,1,1,0,0,1,1,1,0,0,2,2,3,1,1,0,5,1,1,0,0,1,1,0,0,2,0,3,1,2,1,0,2,0,0,3,0,0,1,3,0,2,0,0,0,3,0,0,1,3,1,0,2,1,3,2,2,1,2,0,1,0,1,1,0,2,2,0,0,0,0,2,0,1,1,0,0,2,1,0,1,0,2,1,1,0,0,1,1,2,2,0,2,1,0,3,2,1,1,2,2,0,2,1,0,2,1,2,0,1,0,1,1,1,1,1,1,0,3,1,2,0,3,2,1,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,2,0,0,0,1,2,1,0,2,1,0,2,0,2,1,0,1,2,1,1,2,1,1,0,1,3,0,3,0,2,0,2,0,0,0,0,2,2,1,0,1,4,0,1,1,2,1,1,0,0,0,1,1,0,2,2,1,2,0,0,0,1,0,0,2,0,0,2,0,0,3,1,0,1,1,1,0,0,2,2,0,1,1,2,1,0,1,0,0,1,2,0,2,2,0,2,2,0,3,1,0,0,1,0,2,2,3,1,3,1,2,0,2,0,2,1,0,1,0,0,0,3,2,2,1,1,0,0,0,1,0,0,1,0,0,0,2,0,2,4,3,1,2,0,1,2,2,0,1,1,3,1,4,2,2,0,1,2,1,1,2,1,0,2,2,2,0,2,2,1,0,1,0,1,1,0,1,1,1,0,0,0,0,0,1,1,0,2,2,2,2,3,2,1,0,0,0,0,1,0,1,1,1,2,3,1,0,1,1,2,0,0,1,2,1,3,0,2,0,2,1,0,1,2,2,2,1,0,0,2,1,1,1,1,0,1,0,1,0,0,2,0,0,2,0,0,0,1,2,1,0,0,1,1,0,1,2,2,1,3,0,0,1,1,1,0,1,0,1,3,1,0,1,0,0,1,3,1,0,1,2,0,0,1,0,1,1,1,0,1,0,1,0,1,0,0,1,2,2,0,0,2,0,0,2,0,2,0,1,2,1,0,0,1,2,2,1,2,2,0,0,2,2,2,1,2,0,1,0,1,2,2,1,2,0,1,1,1,3,0,0,4,1,2,1,1,1,0,3,0,1,0,2,0,2,2,1,1,0,0,0,0,1,0,2,1,0,1,0,1,0,0,0,0,0,2,1,0,1,3,0,1,0,2,0,0,0,0,0,0,1,1,1,0,0,1,0,0,0,1,0,0,0,0,2,0,1,3,0,2,2,0,2,2,1,4,2,0,1,1,1,0,1,1,0,4,3,1,2,1,0,1,2,1,0,4,2,1,1,3,1,0,3,0,2,0,1,0,0,1,1,1,0,3,1,0,0,1,2,1,0,0,2,1,1,2,0,0,1,0,1,1,4,1,0,1,2,2,0,1,1,2,2,1,1,0,0,0,0,0,1,0,0,2,1,2,0,1,0,0,0,1,1,2,2,1,0,1,0,0,1,2,0,1,2,2,1,2,0,1,1,1,0,0,1,1,1,1,0,1,0,0,0,0,1,1,0,0,1,0,0,1,1,1,0,0,0,1,0,1,2,1,0,0,0,1,1,1,0,1,0,0,1,1,0,1,0,0,0,1,1,1,0,1,2,1,2,1,1,0,2,3,1,2,2,1,2,2,0,1,0,2,0,0,0,1,3,1,1,1,2,1,2,2,2,2,1,0,0,0,1,1,1,1,2,1,0,2,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,1,0,1,0,0,0,3,1,1,0,3,0,1,1,3,1,0,2,0,0,3,1,1,0,1,0,0,0,1,1,1,1,1,4,2,2,0,2,0,1,1,1,0,2,1,2,1,1,1,0,1,1,1,2,0,0,1,1,2,3,0,1,0,3,1,1,0,0,1,2,1,1,1,2,1,0,0,1,3,2,1,2,1,2,0,0,0,1,0,1,3,0,1,0,2,1,1,0,2,1,0,1,0,3,0,0,1,1,1,1,1,1,0,1,1,0,4,1,0,2,1,2,0,0,1,1,1,0,4,0,0,1,2,2,1,0,1,0,1,1,0,3,0,1,1,1,0,1,0,0,0,0,1,0,3,2,2,3,1,2,0,5,1,0,1,0,0,0,2,2,0,0,1,1,1,1,0,0,1,0,1,0,1,2,0,0,2,1,0,1,0,1,3,5,1,1,1,0,0,0,1,1,2,1,1,2,0,1,0,3,2,0,1,2,1,2,1,3,1,0,1,2,0,0,0,2,1,1,1,1,0,0,0,0,2,1,4,3,1,2,2,1,0,3,1,0,1,0,1,0,2,2,0,1,0,0,0,1,2,0,1,0,1,3,2,1,3,2,2,2,1,1,4,0,2,0,0,2,1,0,1,1,1,0,0,2,1,0,1,0,0,0,0,1,1,1,1,0,3,2,1,1,0,0,0,1,1,1,1,0,0,1,3,0,0,2,0,1,0,0,1,2,2,1,1,0,0,2,0,1,2,1,1,0,2,0,0,1,0,0,1,2,3,0,2,1,2,1,2,1,2,2,0,1,0,0,0,1,1,1,0,0,0,1,0,1,3,1,0,0,1,2,2,0,1,0,5,1,1,2,1,0,0,0,0,0,0,0,1,1,1,1,3,3,2,0,0,0,1,1,3,1,0,1,2,1,2,2,1,1,1,1,2,0,0,0,0,1,2,2,2,0,0,0,1,1,0,0,1,0,0,2,0,1,0,1,0,1,3,0,0,1,3,0,2,2,2,1,2,1,0,0,3,0,2,0,0,0,0,1,2,1,1,0,1,2,1,2,1,2,2,0,0,3,2,0,0,4,1,1,1,1,1,1,1,0,0,3,1,2,1,0,2,1,1,0,0,0,2,2,1,0,1,1,2,2,0,1,2,2,3,0,0,2,1,1,0,1,1,3,0,0,1,2,1,0,2,1,1,0,0,1,4,2,1,0,3,2,0,0,0,1,2,0,2,0,2,1,0,2,0,0,3,1,0,0,1,1,2,0,1,1,1,2,2,1,1,4,3,1,3,1,1,0,2,1,2,2,0,0,0,3,0,1,1,1,2,2,0,2,1,1,1,2,0,1,1,0,0,2,0,2,2,0,0,0,2,0,2,2,2,0,1,0,1,1,1,1,1,0,1,1,1,0,1,2,1,0,2,1,1,0,1,1,0,0,0,2,0,2,0,2,1,1,1,1,1,1,1,1,1,1,1,1,0,1,2,0,0,1,2,0,2,1,1,1,1,0,0,2,1,1,2,2,1,1,3,2,0,2,2,0,0,1,2,1,2,1,0,0,0,0,1,1,0,3,4,1,1,1,1,1,0,2,2,1,0,1,0,0,1,0,1,1,2,1,1,2,2,2,1,2,0,1,1,3,4,1,0,1,1,0,0,0,1,0,0,0,1,0,2,0,1,0,1,1,0,0,0,1,0,1,0,0,1,2,4,2,0,0,3,2,1,1,3,0,1,2,1,3,3,0,0,0,1,1,1,1,2,0,2,0,0,2,0,0,1,1,1,0,1,0,0,1,0,2,1,0,0,3,2,0,0,1,1,1,0,2,0,2,1,0,1,1,1,1,1,0,0,0,2,1,0,2,3,0,1,0,1,0,0,2,1,1]},{"counters":[0,0,2,0,2,0,0,0,3,2,3,0,0,0,2,4,1,1,0,2,0,2,0,1,0,0,2,0,2,1,1,1,0,1,0,0,2,1,1,0,0,0,0,0,0,0,2,0,0,0,0,0,1,1,1,0,0,4,1,0,3,0,0,2,0,1,1,0,0,3,1,1,1,2,0,0,1,1,2,0,1,3,0,2,0,0,0,2,0,2,2,2,1,2,1,0,1,0,2,1,2,2,3,0,1,1,0,1,0,0,0,0,0,0,1,0,1,1,2,4,2,0,2,1,1,3,1,1,2,1,1,0,0,3,1,1,1,0,0,2,1,0,0,2,0,2,0,1,1,0,0,1,1,0,2,0,2,2,1,1,0,2,2,1,0,0,1,1,0,2,0,0,0,1,0,0,2,1,0,1,2,0,0,0,1,2,2,0,0,0,1,0,0,0,1,0,1,1,0,1,1,1,0,1,1,2,2,0,1,1,0,0,3,0,3,3,1,2,0,0,1,0,0,0,1,0,2,2,0,0,0,0,0,1,0,2,2,0,1,1,1,1,2,1,0,0,0,1,0,0,0,0,4,2,2,2,2,1,2,1,1,0,0,0,1,0,0,1,3,0,0,2,1,3,0,0,0,1,1,1,0,1,1,0,0,0,1,0,0,3,1,2,2,2,4,0,0,0,2,1,2,1,0,1,4,0,0,2,1,1,0,0,3,2,0,1,0,0,0,2,0,2,0,2,0,0,0,2,0,1,0,0,0,0,2,1,0,3,0,2,1,2,0,1,0,1,1,0,1,1,0,1,0,1,2,0,0,2,1,0,1,2,3,0,0,1,1,0,0,0,2,4,0,2,1,2,2,0,1,2,2,2,1,0,0,4,0,1,2,1,0,0,0,1,0,0,1,1,1,1,1,0,0,0,0,2,0,1,2,3,2,0,1,0,3,1,0,1,1,1,3,1,1,1,0,0,0,3,0,1,0,4,1,0,1,0,0,0,2,1,1,0,1,2,1,0,3,2,2,1,2,3,0,1,1,2,0,0,1,0,0,2,2,0,0,1,1,2,1,1,0,0,0,0,0,0,2,1,1,0,0,0,1,0,1,0,1,2,1,2,0,1,0,2,1,1,0,3,2,0,1,0,1,0,1,0,2,0,0,1,0,0,0,1,0,2,2,2,3,0,0,1,2,1,1,2,0,3,1,6,1,2,0,1,0,0,0,2,1,0,1,1,1,2,0,1,0,2,1,0,1,1,1,0,2,1,2,3,0,1,1,1,1,1,0,2,1,1,0,1,0,2,2,0,1,1,2,3,0,2,0,1,2,2,0,3,0,1,0,1,0,0,2,1,0,1,2,1,3,1,0,1,2,1,0,2,0,3,0,0,2,2,1,1,1,1,2,0,3,0,0,0,0,0,0,0,1,1,0,3,1,1,0,1,2,0,1,0,0,1,1,0,0,2,0,1,1,1,0,2,1,1,0,5,2,0,0,2,1,1,3,0,2,2,1,0,2,1,1,0,2,1,2,0,2,2,4,2,0,0,1,0,1,3,0,0,2,0,1,1,1,2,1,1,1,0,0,2,1,1,0,1,0,1,1,3,1,0,2,0,2,2,2,1,1,1,2,1,1,2,3,0,1,1,3,0,1,0,1,1,2,2,1,1,0,0,1,0,0,0,4,3,0,1,4,2,2,3,1,2,2,0,0,3,0,0,0,0,3,1,0,3,2,2,1,3,1,3,1,2,0,1,0,3,2,1,0,0,1,2,0,3,0,2,2,1,1,1,0,0,1,2,3,3,2,3,1,2,2,0,0,0,3,1,2,2,1,0,1,1,1,2,0,0,1,1,0,1,1,2,0,1,1,2,1,1,0,0,1,0,1,2,1,0,4,2,0,1,0,1,1,1,0,3,1,0,3,0,0,0,1,4,0,1,1,0,0,0,1,0,2,2,3,1,2,1,2,2,2,1,2,0,0,0,1,0,1,3,1,1,2,1,0,1,1,1,2,0,1,0,0,1,2,1,0,1,0,1,1,1,0,1,0,3,0,1,2,0,1,0,0,0,3,1,0,2,3,2,1,2,2,1,0,0,1,1,0,1,0,0,0,1,1,3,0,0,2,0,0,0,2,1,0,0,2,1,1,1,2,1,0,1,2,1,0,0,1,0,0,1,0,0,2,2,0,0,0,1,0,0,1,1,1,3,1,1,3,1,1,0,0,2,1,0,0,0,1,2,3,0,0,3,0,0,0,0,0,0,2,0,1,0,0,1,1,1,0,1,0,2,0,2,0,1,1,2,1,4,0,1,1,2,0,0,2,1,0,0,1,2,0,1,1,2,2,0,1,3,0,0,0,0,0,1,3,1,0,2,0,2,2,0,1,2,0,0,1,1,1,1,1,4,2,1,0,1,0,1,2,0,1,0,1,0,3,1,1,1,1,1,1,0,1,0,2,2,0,0,1,1,2,1,2,1,2,0,1,1,0,2,1,0,1,0,0,1,1,1,1,1,1,1,1,2,0,0,1,1,0,1,1,1,0,2,1,1,0,0,0,0,1,1,1,0,0,0,0,2,0,0,0,0,0,0,0,1,2,0,0,2,3,2,2,1,0,2,2,1,1,0,1,0,3,1,2,1,0,0,0,2,0,0,1,2,3,3,1,0,1,1,1,0,2,0,2,0,2,1,1,0,1,0,0,2,0,0,1,0,0,1,1,0,2,1,3,3,1,0,0,3,0,1,4,2,2,0,2,0,0,1,0,1,0,0,1,0,0,2,4,2,0,1,1,0,1,2,2,0,1,0,1,0,0,2,1,0,0,0,0,1,0,0,0,2,0,1,1,1,3,3,0,3,0,0,2,0,0,2,1,1,1,0,0,0,1,1,1,1,2,0,1,2,1,0,2,0,1,1,0,2,0,0,1,4,2,2,0,2,1,3,0,0,0,1,0,3,1,1,1,0,2,1,0,1,1,0,1,3,0,0,0,0,1,1,0,0,1,3,1,0,0,0,0,1,1,1,1,1,1,0,1,1,2,1,4,1,0,1,0,0,2,2,2,0,2,0,2,0,2,1,4,2,0,1,0,2,1,0,0,4,3,2,3,0,0,2,1,2,4,2,2,2,2,0,0,1,2,1,1,2,1,0,2,2,1,2,0,2,1,1,1,2,2,1,1,1,2,1,1,0,2,1,0,1,1,1,1,0,0,1,0,0,0,3,1,1,1,0,0,0,0,0,2,1,2,1,0,1,1,2,0,0,5,1,0,2,0,0,1,1,2,0,0,2,1,0,3,3,1,0,2,0,1,1,0,1,2,0,0,1,0,1,0,2,1,0,3,0,0,1,3,1,1,1,1,1,0,3,3,0,1,0,1,2,1,1,1,2,0,0,0,0,2,0,2,0,1,1,0,1,2,0,2,0,1,0,0,0,1,1,1,0,0,0,0,0,2,1,1,0,1,1,0,1,1,0,0,0,2,1,1,0,2,1,0,4,3,2,0,2,1,0,1,1,2,1,1,0,0,2,1,2,1,2,3,0,3,0,2,2,1,0,0,1,0,1,1,0,1,2,2,0,0,2,0,3,0,0,0,1,2,0,1,3,0,0,0,1,2,2,0,0,0,1,0,0,2,3,0,1,0,0,1,2,2,1,1,1,0,1,1,0,0,2,2,1,1,0,2,0,0,1,0,1,0,1,1,0,0,2,0,1,0,0,0,3,1,1,3,1,0,1,3,0,1,1,1,2,3,1,1,1,0,0,0,0,1,3,1,2,0,3,0,1,4,1,0,4,1,3,2,1,3,3,2,2,2,1,1,0,0,0,1,2,1,0,1,1,0,1,0,0,0,0,0,1,1,2,1,0,3,1,1,0,4,1,3,0,0,4,1,0,2,2,2,1,2,0,2,0,1,1,2,4,0,1,0,1,2,0,2,1,1,0,2,0,3,1,1,1,0,2,2,0,3,1,1,0,1,0,0,1,0,0,1,0,0,0,1,1,3,1,1,0,2,1,1,1,0,1,0,3,3,0,0,0,2,0,3,1,0,2,2,2,1,0,0,1,3,2,2,0,1,1,0,3,5,0,1,1,0,0,3,2,0,0,1,0,1,1,0,2,1,1,1,2,0,0,0,0,1,1,3,0,0,0,1,0,0,0,2,1,1,0,0,0,1,2,0,1,0,0,2,1,1,1,1,0,1,0,1,1,0,0,1,1,1,0,0,1,0,3,2,0,2,0,4,1,1,1,0,2,1,0,0,1,0,1,0,1,1,1,2,0,0,2,0,1,0,0,0,1,0,2,0,0,3,1,0,2,1,0,0,3,2,1,1,1,1,1,0,2,1,1,0,0,3,2,0,0,0,0,2,0,1,1,0,2,1,0,1,2,2,3,0,3,1,2,1,3,1,3,0,3,1,0,0,0,1,1,0,0,0,2,0,1,3,0,1,1,1,0,1,2,1,1,0,1,0,1,0,1,1,1,2,1,1,2,0,0,0,0,1,1,1,1,3,0,0,2,0,2,3,0,2,0,1,2,1,0,1,4,0,1,1,2,1,0,2,2,0,2,2,0,1,0,1,2,2,1,2,1,1,0,1,2,1,1,0,1,0,4,0,0,3,0,1,4]},{"counters":[2,1,1,0,1,4,0,2,0,1,1,0,0,0,1,3,0,1,1,0,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,2,1,0,2,2,0,0,4,0,3,1,0,0,1,2,2,0,2,2,1,0,1,0,0,1,1,1,3,0,1,1,1,1,1,1,0,2,2,0,1,0,0,1,1,0,1,1,0,0,2,1,2,2,0,1,0,3,0,0,3,1,3,1,1,0,2,1,1,0,1,0,3,1,0,1,0,1,0,3,1,0,0,0,2,1,0,1,1,2,0,1,1,1,0,0,3,3,2,2,1,1,0,2,2,0,1,0,3,0,0,1,2,1,1,0,1,1,0,1,1,0,1,1,3,0,1,2,1,2,2,1,1,1,0,1,2,2,1,3,0,1,2,0,1,1,0,1,0,0,1,4,3,3,0,2,1,2,1,0,1,1,1,2,0,1,2,1,0,3,4,0,1,1,2,0,2,2,1,0,1,2,2,0,4,0,2,0,1,1,2,0,2,0,1,0,1,0,1,1,2,0,0,3,0,2,2,1,0,1,0,1,1,4,0,1,0,0,2,1,1,0,0,2,1,1,1,1,0,0,1,0,0,1,0,0,2,2,0,0,1,0,2,0,1,1,1,1,1,0,2,2,1,1,1,0,0,1,1,0,0,1,2,1,0,0,0,1,0,1,1,1,0,0,3,0,1,4,3,1,2,0,0,2,0,1,0,1,0,1,1,0,1,0,1,3,1,1,0,1,3,1,0,0,0,2,0,0,2,3,1,0,0,0,4,0,0,0,0,1,1,2,1,0,1,3,1,1,1,1,1,1,0,2,2,2,1,2,1,0,1,0,0,3,2,0,0,1,0,2,3,0,0,0,2,1,0,1,0,1,2,0,0,0,3,1,1,2,1,0,0,2,3,1,0,0,0,2,0,0,2,1,3,3,1,3,3,1,0,1,1,1,1,1,0,0,0,2,2,0,0,2,0,0,1,0,1,1,1,0,0,1,0,1,2,0,0,2,0,1,0,2,3,0,1,1,1,0,1,1,3,0,1,0,2,0,1,1,0,0,1,1,1,0,1,0,1,1,0,1,0,2,1,3,0,3,1,1,0,0,1,0,0,1,1,0,3,0,1,0,3,2,2,1,1,1,2,0,1,1,1,2,1,1,1,1,1,3,4,0,0,0,0,0,2,2,1,0,1,0,2,1,2,1,1,1,0,1,1,0,3,1,4,2,0,3,0,1,0,1,0,1,1,3,0,1,0,1,1,3,1,1,0,0,0,0,1,1,0,1,3,1,3,1,1,0,1,1,0,2,0,2,2,2,1,1,0,3,0,1,0,0,2,2,2,0,0,2,1,0,1,1,0,2,0,0,1,1,0,0,0,1,1,0,0,0,0,2,1,0,0,0,3,0,1,0,1,1,1,1,1,2,0,1,1,3,1,0,0,2,2,1,0,0,0,0,3,1,0,0,0,2,0,0,1,0,2,2,2,1,0,1,1,2,0,0,2,0,0,1,1,0,1,0,0,2,2,0,0,1,2,1,0,0,1,1,0,1,2,0,1,1,1,2,1,2,1,0,1,0,0,2,0,0,1,0,0,2,2,1,0,1,2,1,2,0,0,2,0,1,1,3,2,0,0,0,1,1,0,2,1,2,1,4,0,0,1,2,1,1,1,0,0,2,3,2,1,1,1,0,0,1,2,1,0,0,2,0,0,2,2,0,0,1,1,1,0,1,0,0,1,0,2,1,1,0,3,3,2,0,0,0,0,1,0,1,1,1,0,0,1,0,2,2,4,1,1,0,2,1,1,0,2,1,1,0,1,0,3,0,2,1,1,1,1,2,0,0,0,2,1,1,1,1,0,4,2,2,3,0,0,0,0,2,1,2,0,0,2,0,2,1,0,1,0,2,1,0,1,0,1,0,0,0,1,1,4,0,0,2,2,0,1,1,0,1,1,1,1,0,0,1,0,0,0,0,1,0,1,0,0,0,0,4,2,1,0,0,0,0,1,1,0,0,0,2,0,4,0,1,3,1,1,0,2,2,2,0,0,1,0,0,1,3,1,2,1,3,1,0,3,1,2,0,1,1,0,0,1,0,2,2,1,0,0,1,1,0,1,0,1,0,1,0,4,0,0,0,1,1,2,1,3,0,0,0,1,3,1,0,1,1,1,4,0,1,0,3,1,1,2,4,0,0,1,4,0,0,0,0,2,2,1,2,0,0,1,0,4,1,0,2,0,0,1,0,1,1,4,0,1,0,2,0,0,0,1,2,0,1,2,0,0,0,0,0,1,0,1,0,0,1,0,1,1,0,1,0,1,1,0,2,3,2,2,2,2,0,0,0,3,0,2,0,0,0,0,1,0,2,1,1,1,0,1,1,1,1,1,0,1,0,3,0,2,2,0,1,0,1,3,0,2,0,3,0,1,0,1,2,3,2,1,3,1,1,3,2,1,2,0,1,3,1,0,2,0,1,1,0,0,1,0,0,1,1,1,1,1,1,0,3,2,0,1,2,1,0,2,0,3,2,0,0,3,0,1,1,2,1,2,0,1,2,1,1,2,1,1,3,0,1,2,2,0,1,4,0,0,0,1,0,2,4,3,1,1,2,2,1,0,0,1,2,2,2,0,2,1,1,1,1,0,0,0,1,0,0,0,1,2,1,3,1,1,1,0,0,0,2,4,2,1,0,1,2,1,0,0,1,1,1,2,2,1,1,0,1,2,0,0,0,1,0,1,1,2,0,2,1,1,2,2,0,1,0,1,1,2,0,2,1,0,1,1,0,3,0,2,1,0,1,3,1,0,0,1,3,0,2,2,0,1,1,0,2,2,0,2,1,5,2,0,3,0,1,2,2,1,1,1,2,2,1,1,1,2,1,0,2,1,0,1,1,0,0,0,3,0,0,2,0,4,2,2,0,0,1,1,0,3,2,1,0,3,1,1,2,2,2,1,1,1,2,1,0,0,0,1,1,2,3,0,1,1,1,2,1,0,0,2,1,2,0,0,0,1,3,1,0,0,1,0,1,2,0,0,1,0,2,0,0,1,2,3,1,1,2,0,1,1,1,1,3,0,1,0,1,2,0,2,0,0,0,3,1,1,0,0,1,1,0,1,3,1,3,2,0,0,0,1,0,0,1,0,2,1,0,1,0,0,0,0,1,0,0,0,2,0,0,1,2,0,1,3,1,0,1,3,1,2,2,1,1,1,1,2,0,1,2,1,0,2,1,1,0,1,1,1,1,1,0,0,2,1,1,0,0,1,1,0,0,2,0,3,0,1,2,0,1,0,0,0,2,3,3,1,0,0,1,0,0,0,0,0,3,4,0,2,0,1,0,2,0,0,1,0,0,0,3,1,1,0,1,0,0,1,2,0,1,1,0,1,1,0,0,2,2,0,1,1,1,1,1,0,2,1,0,0,0,3,0,2,2,2,0,2,0,1,0,0,2,0,1,1,0,0,0,2,2,1,0,2,0,1,1,0,1,2,3,2,0,1,2,1,0,0,0,0,2,0,1,0,1,1,0,2,1,2,1,1,0,2,0,2,1,1,0,0,0,1,1,0,0,0,0,3,1,2,1,1,1,3,1,0,1,1,2,1,1,0,0,1,0,1,3,1,0,1,1,0,0,0,0,1,2,2,1,0,2,1,2,2,1,1,2,3,0,3,3,0,1,1,2,2,1,1,1,0,0,0,0,1,2,1,2,1,1,0,2,0,3,0,1,0,1,2,0,0,0,1,1,0,1,0,1,0,0,1,2,0,0,0,2,0,2,1,2,2,1,0,1,3,2,1,2,1,0,0,0,0,1,0,1,0,1,1,0,1,0,1,1,0,3,1,0,1,1,2,2,0,1,1,1,1,1,2,1,3,2,0,1,2,3,1,2,2,2,3,1,2,1,1,0,2,0,0,0,1,0,0,2,1,0,0,1,0,0,4,0,1,2,1,1,1,2,1,1,2,2,0,2,0,0,3,1,1,0,3,1,0,0,0,1,3,4,0,1,0,0,0,0,0,0,2,1,1,3,2,0,1,0,1,0,1,2,0,0,1,1,1,0,1,0,0,2,2,1,2,1,0,1,1,2,1,0,1,0,0,0,0,2,1,0,1,0,0,0,1,1,0,2,0,1,1,0,1,0,1,1,0,0,1,2,3,2,1,2,2,2,2,1,1,1,0,0,2,2,0,1,1,0,3,0,1,1,0,2,1,0,3,3,0,0,1,1,0,0,1,1,2,3,1,1,1,0,1,0,2,1,0,2,0,1,0,1,2,1,0,1,2,0,0,0,3,0,0,1,2,3,1,0,1,1,0,0,4,0,1,3,1,2,1,3,1,1,0,1,1,1,1,1,2,1,0,2,3,0,0,0,1,0,2,1,1,0,0,2,0,2,0,0,0,0,3,1,2,0,2,4,3,0,1,2,0,0,1,2,2,0,1,3,2,1,0,1,2,2,1,0,1,1,1,0,1,1,1,0,1,1,1,0,1,2,3,1,0,1,0,0,1,0,0,2,2,0,0,2,2,1,2,1,1,0,2,3,0,0,0,0,1,0,0,1,3,2,2,2,2,2,3,1,1,1,1,1,0,2,0,0,0,3]},{"counters":[0,1,2,1,1,1,0,0,0,1,1,2,3,0,0,1,0,1,1,2,3,2,1,0,2,0,0,1,0,0,0,1,1,1,1,1,3,1,0,0,0,0,0,1,1,1,1,3,1,2,1,2,0,4,1,1,1,0,1,1,1,1,2,1,0,0,0,0,1,1,0,3,3,0,0,1,1,2,2,0,0,0,0,0,1,0,0,1,0,1,0,3,4,0,2,1,0,2,2,1,2,0,1,0,1,0,0,1,1,1,0,2,0,0,1,0,1,0,0,1,1,0,1,1,1,0,1,0,1,0,0,1,1,2,2,0,1,0,1,3,0,1,0,2,2,0,2,2,2,0,1,1,0,3,0,0,1,2,2,0,2,0,1,2,0,0,1,2,1,2,0,0,0,3,1,1,0,1,1,2,0,2,2,0,1,1,1,1,0,1,1,1,2,1,1,1,1,1,1,0,0,1,1,1,3,1,0,1,2,1,2,0,1,0,2,2,1,1,1,2,0,0,0,2,2,0,0,2,3,0,0,0,1,0,0,1,0,1,1,2,1,2,1,1,0,1,1,1,0,1,0,1,1,1,1,1,3,1,2,1,1,0,1,0,1,2,1,2,2,0,0,0,1,0,2,0,1,0,1,0,0,1,1,2,0,0,0,0,0,1,2,0,1,1,0,3,1,1,1,2,1,1,1,0,1,0,3,1,0,1,1,1,0,4,0,1,2,1,0,0,1,0,1,1,0,1,0,1,2,0,0,1,3,1,0,1,2,1,4,1,0,1,1,0,2,1,0,1,0,2,1,0,2,0,1,0,1,0,0,0,2,1,1,1,3,2,4,1,3,1,2,0,3,0,0,1,1,2,3,1,2,2,1,2,1,1,2,0,1,1,1,2,0,1,0,0,1,0,1,0,0,2,1,3,0,0,0,0,2,0,2,0,2,2,1,0,1,0,2,0,0,2,0,0,0,0,3,0,1,1,0,0,0,1,1,2,0,0,1,0,0,0,1,0,0,2,3,0,0,2,1,2,1,2,2,2,0,1,0,1,0,0,1,2,2,4,1,1,2,0,2,1,0,1,2,3,0,1,1,1,2,4,1,0,3,1,0,0,0,2,2,0,2,1,0,1,0,1,1,0,0,1,0,0,0,1,1,2,2,1,0,1,1,2,0,1,1,0,0,1,0,1,2,0,0,1,0,0,2,1,1,0,1,0,0,0,2,0,2,1,1,2,2,2,1,1,1,1,2,0,1,2,0,1,0,1,0,2,2,1,0,0,1,1,1,2,3,0,0,1,1,1,0,1,0,1,4,2,1,1,2,2,1,1,0,0,2,2,1,2,0,0,1,1,0,1,0,1,0,1,2,3,2,1,0,1,1,0,1,0,1,0,0,2,2,1,1,2,1,0,2,1,3,2,4,0,0,1,0,2,1,0,3,0,2,0,2,1,0,1,0,1,2,1,0,1,1,0,0,0,3,3,1,4,2,2,1,2,1,2,1,1,2,1,0,1,0,1,0,0,1,1,0,2,0,0,1,2,1,1,2,0,1,0,0,1,1,2,1,3,0,1,2,0,0,1,0,2,2,1,2,0,1,2,1,1,1,0,0,1,1,0,0,2,0,1,1,0,3,0,2,0,0,2,1,0,0,1,0,2,0,1,1,2,2,1,0,4,1,0,0,1,1,1,2,0,2,0,0,0,0,1,0,3,0,1,1,0,1,2,1,1,1,2,0,0,1,0,1,3,1,2,0,1,1,2,0,0,0,0,0,0,0,0,0,0,2,2,1,1,0,2,2,0,0,2,1,2,1,2,3,1,1,3,1,1,0,0,0,3,4,2,0,2,1,0,0,0,0,2,0,3,0,3,1,0,1,2,1,2,3,0,1,2,2,3,2,2,0,0,1,0,0,1,0,2,1,1,1,4,0,0,1,0,1,0,0,3,0,2,0,0,1,2,1,1,2,0,1,0,0,2,1,1,0,0,0,0,0,0,3,0,0,2,2,2,2,1,1,1,2,1,0,0,1,1,0,0,1,2,2,2,2,2,1,3,0,0,0,1,1,1,3,3,0,1,1,1,1,3,2,0,0,0,2,1,1,2,2,1,1,1,1,1,0,0,0,1,1,1,0,1,0,1,1,1,0,0,1,1,1,1,0,0,1,0,1,1,1,1,2,1,0,2,2,0,2,0,2,0,2,0,0,0,0,1,1,1,3,0,0,1,0,1,1,1,1,0,2,1,0,2,0,0,3,3,1,2,1,1,0,1,1,0,0,0,0,0,3,1,0,1,0,0,0,0,4,0,0,1,2,0,0,3,0,0,0,0,3,0,1,1,2,0,1,1,2,1,1,3,1,2,1,2,3,3,0,1,1,1,0,0,0,1,1,1,1,2,1,0,1,2,0,2,2,0,3,1,1,1,2,1,2,1,2,0,0,0,1,2,1,1,1,0,2,1,0,1,1,2,0,0,1,1,0,1,2,2,0,2,1,0,2,0,2,4,0,0,0,2,3,3,1,0,2,0,2,0,0,2,2,1,0,1,1,0,3,1,0,0,1,0,1,1,1,0,2,2,0,1,0,0,1,0,1,0,1,0,2,2,1,0,1,1,1,1,1,0,0,2,0,1,2,1,2,1,2,2,2,1,0,0,1,0,2,2,0,3,1,0,0,1,3,0,0,1,0,0,2,0,1,2,2,1,0,0,2,0,0,3,0,0,0,0,0,2,0,0,4,0,1,0,0,0,0,0,0,0,1,0,1,2,0,0,0,0,4,0,1,1,0,0,0,1,2,2,2,2,0,2,1,0,0,1,0,3,1,0,3,0,0,1,1,1,1,4,0,1,2,0,2,0,0,0,2,0,1,0,0,0,2,2,0,0,1,1,0,1,1,0,3,1,2,0,2,1,2,1,1,1,0,0,2,1,1,2,1,0,1,2,2,1,2,0,2,0,1,3,0,1,1,2,1,1,0,1,2,1,1,1,0,0,1,0,0,0,0,1,1,1,2,2,1,3,2,1,0,0,1,2,0,4,2,0,2,0,0,4,2,0,0,0,1,1,0,1,1,1,1,0,2,2,0,1,0,0,0,1,2,0,3,0,2,0,1,0,0,2,2,1,1,0,3,0,0,1,0,2,1,1,3,1,1,1,0,1,1,1,3,1,0,5,1,3,0,0,1,1,2,1,0,0,0,0,0,0,1,1,2,1,0,1,0,0,3,0,0,1,1,0,1,1,0,2,1,2,1,0,0,1,3,1,2,0,0,1,0,0,0,1,0,1,0,0,0,2,1,2,1,0,0,0,0,2,1,0,4,1,2,0,1,0,1,2,2,1,3,2,0,0,1,0,0,0,2,0,1,1,1,2,0,0,0,3,1,2,0,1,2,0,1,1,1,0,2,0,0,1,4,4,2,1,2,2,0,1,0,1,0,4,3,0,1,2,0,0,1,5,1,1,0,3,1,3,1,2,2,0,0,1,1,1,3,1,0,1,0,2,1,1,0,2,0,1,1,2,1,2,1,2,0,0,0,1,1,1,0,1,2,1,0,1,0,0,0,0,1,0,0,1,0,1,2,0,1,0,2,2,2,2,1,0,2,0,1,0,1,1,0,0,2,2,1,2,1,1,1,1,1,2,3,0,1,1,3,0,3,0,1,1,0,1,2,1,0,1,0,2,0,1,0,0,0,0,0,3,1,0,2,0,2,1,0,3,0,2,1,0,0,0,3,0,0,2,1,0,0,0,0,1,1,1,0,1,0,2,1,0,1,1,0,1,0,0,0,0,2,1,1,1,0,1,1,0,0,1,2,2,1,2,2,2,1,1,1,1,3,3,0,0,1,0,0,1,0,1,0,0,0,1,0,3,1,1,2,0,1,1,1,1,0,1,0,1,1,1,1,1,3,0,1,1,1,0,2,2,1,0,1,1,2,0,2,0,1,1,0,0,1,0,2,3,2,2,0,3,1,2,0,0,0,0,0,1,1,4,0,1,0,1,0,0,1,1,2,3,1,1,1,1,0,2,2,2,1,2,1,3,0,1,0,0,0,4,3,0,1,2,3,1,1,1,1,3,0,1,4,3,0,3,0,0,0,1,1,2,0,0,2,3,1,0,0,4,0,0,0,1,0,1,1,3,4,2,1,3,1,1,0,2,1,0,2,2,1,2,0,0,1,1,1,1,1,1,2,1,1,0,1,1,1,1,0,1,1,0,0,1,0,1,0,0,0,1,2,2,0,0,2,1,0,1,0,0,1,1,0,2,0,1,1,0,1,2,1,3,1,1,2,3,1,3,0,2,2,1,1,1,0,0,0,1,2,2,3,0,2,1,2,2,0,0,0,1,1,1,1,1,2,1,0,0,3,1,2,2,1,2,0,0,0,0,2,1,2,1,2,2,1,0,0,0,3,2,3,0,1,0,0,0,2,1,2,3,0,2,3,1,0,2,1,1,0,1,1,0,0,0,0,2,3,2,2,2,1,1,1,2,1,2,0,2,1,1,2,0,1,1,3,1,0,0,0,1,2,1,0,0,1,0,1,0,0,0,0,1,0,1,1,0,0,1,0,1,1,0,2,1,2,2,1,1,0,1,0,2,1,2,1,0,2,1,1,2,0,2,1,1]},{"counters":[0,3,2,1,1,1,0,2,0,0,2,1,2,0,3,2,0,0,0,1,1,2,1,1,0,3,1,3,1,1,1,0,2,1,0,0,1,2,0,2,0,2,1,1,1,0,1,0,1,0,0,0,0,1,0,0,0,0,1,1,1,1,2,0,3,1,1,0,1,1,2,0,3,2,2,1,2,1,3,1,0,0,1,4,1,0,2,1,2,1,1,0,0,0,2,0,1,1,0,1,1,3,1,0,2,0,1,1,1,2,2,0,0,2,1,3,2,0,3,1,2,0,1,1,2,0,1,1,2,0,0,2,0,2,2,0,0,0,1,2,0,0,1,2,1,0,0,0,1,2,0,1,0,0,2,2,0,0,1,0,0,1,1,1,0,1,1,1,0,0,1,1,2,2,0,0,2,0,3,1,1,1,1,2,1,0,2,0,0,0,1,2,4,0,1,1,2,0,1,1,1,0,0,2,1,1,0,1,1,1,0,0,3,1,1,0,4,3,0,0,1,1,1,0,1,2,0,1,4,1,1,1,1,2,0,0,0,0,0,0,0,1,0,0,3,0,1,1,1,0,2,1,1,1,0,1,0,1,0,4,0,1,2,2,0,2,0,1,1,1,1,2,0,0,1,1,0,0,0,1,2,3,1,1,2,2,1,2,0,3,1,3,0,0,2,1,0,1,1,0,3,1,3,1,1,1,1,1,2,0,1,1,2,1,2,1,0,4,0,2,1,1,0,2,0,1,3,1,0,3,2,0,5,1,1,0,0,1,1,0,1,0,0,0,1,0,1,0,1,0,1,1,1,0,1,0,0,0,0,0,2,1,0,1,2,0,1,1,1,0,2,0,1,0,2,0,0,1,0,3,1,1,0,1,1,0,2,2,0,1,2,2,2,2,0,2,1,2,3,0,1,2,2,2,0,1,0,1,1,1,1,1,1,0,0,2,0,2,1,1,3,2,1,1,1,1,0,1,1,1,0,3,2,1,1,0,1,1,0,1,3,0,1,0,0,0,1,2,1,0,2,1,0,1,2,3,1,0,0,1,2,0,4,1,0,0,0,4,0,0,1,0,0,0,1,0,0,1,0,0,0,0,1,1,0,1,1,1,2,1,2,1,0,1,1,1,2,2,2,2,2,3,2,1,2,2,2,1,0,2,2,2,0,1,1,0,0,1,1,2,0,1,2,1,0,0,0,1,0,2,3,0,1,0,0,0,1,1,0,1,2,1,1,3,2,0,1,0,2,2,3,2,3,0,1,0,2,1,3,2,0,1,1,1,1,2,1,0,2,0,1,0,0,0,1,0,5,0,2,0,2,0,0,0,4,0,0,1,1,0,1,2,0,0,1,2,2,1,2,3,1,2,0,1,1,1,1,1,2,0,0,1,0,0,3,1,1,0,1,0,2,1,1,0,1,1,1,1,0,0,0,1,1,0,0,2,1,1,0,2,2,0,1,0,0,2,0,1,0,1,5,0,0,2,4,2,1,1,2,0,2,1,1,1,1,0,0,0,2,1,1,0,1,2,1,1,1,0,1,1,1,2,1,0,3,0,1,3,1,2,1,1,1,2,1,0,2,3,0,0,1,0,0,0,1,1,2,1,1,0,0,3,1,1,0,0,1,1,0,3,0,0,0,0,1,3,0,0,0,0,1,0,0,1,0,0,0,1,1,0,2,0,1,2,2,1,1,2,0,0,0,0,1,2,0,0,2,0,1,0,1,1,1,0,0,1,3,1,1,0,0,1,2,0,0,0,0,3,1,0,2,0,4,0,2,0,2,0,1,0,2,2,1,0,3,1,1,4,0,0,1,0,1,1,1,0,0,1,1,1,2,0,0,1,1,1,1,1,1,3,0,1,1,0,1,1,0,0,1,1,0,3,3,0,2,0,0,1,1,3,2,1,2,0,1,0,0,0,1,1,1,0,0,0,3,2,0,0,0,1,0,1,1,1,0,2,1,2,4,1,1,1,3,2,3,0,0,1,0,1,0,0,0,1,0,0,1,0,3,1,0,0,0,1,0,0,2,2,1,1,0,0,0,2,1,1,0,3,0,1,2,0,0,4,1,0,1,0,1,0,1,1,1,0,3,3,1,0,2,1,1,1,0,1,0,0,0,0,0,1,2,1,0,2,0,1,0,1,3,3,0,1,1,1,1,1,1,1,0,0,0,0,0,3,0,1,2,0,1,1,0,2,0,1,1,0,0,1,1,0,0,0,1,1,0,2,1,2,0,1,0,1,2,1,1,1,1,0,1,1,1,2,0,0,0,2,2,1,0,2,2,1,0,0,0,1,3,1,2,2,1,1,1,1,1,0,1,2,2,1,2,0,2,1,0,3,1,3,2,0,1,1,1,1,3,0,2,3,2,1,2,2,0,1,0,2,1,0,1,1,1,0,2,0,0,2,3,1,1,2,1,1,0,2,1,0,1,2,0,1,2,2,0,1,3,0,1,1,0,1,0,0,1,1,0,3,1,0,2,2,2,3,0,0,1,0,2,2,1,0,2,0,2,4,0,0,0,3,2,0,0,0,0,1,0,2,2,0,0,0,3,1,0,0,1,2,2,1,1,0,3,0,0,0,0,1,1,0,1,1,0,4,0,0,0,0,0,0,1,3,0,1,0,0,0,1,1,0,0,0,1,1,1,0,0,1,1,0,2,0,1,0,0,0,1,1,1,1,2,0,1,1,1,0,0,3,3,0,0,0,3,0,2,0,1,0,2,1,1,2,3,0,2,2,0,1,0,1,1,1,0,1,0,0,1,0,1,0,3,0,0,0,2,0,1,0,2,0,0,1,0,1,0,1,1,0,1,3,2,3,0,1,1,1,1,1,3,0,2,0,2,3,1,0,0,2,0,1,2,2,0,0,2,0,1,0,2,0,0,2,1,2,1,1,0,2,0,2,2,0,1,2,0,4,1,0,3,1,1,3,1,1,3,0,3,0,4,0,0,1,0,1,1,3,0,0,2,1,1,1,2,0,0,1,3,2,2,1,1,0,0,2,1,1,0,1,1,0,2,2,2,2,1,2,3,0,1,0,1,0,0,2,0,2,2,2,1,0,1,2,0,1,2,0,1,1,1,1,0,0,0,3,0,0,2,1,3,1,2,0,0,1,0,0,0,0,0,1,2,0,2,3,0,1,3,0,0,2,1,1,1,1,2,1,2,1,1,1,3,0,0,0,2,1,0,1,2,0,2,1,0,2,1,0,0,0,0,1,2,0,0,1,2,3,0,0,1,0,4,3,0,2,2,1,1,0,1,0,2,1,3,0,3,1,1,0,0,1,0,0,0,2,1,1,3,3,1,3,0,0,1,1,0,1,2,0,1,1,3,2,0,0,0,1,1,0,2,0,3,3,3,0,0,0,0,0,0,0,1,1,1,1,0,1,1,1,1,1,1,0,1,0,0,0,0,0,1,0,1,2,0,1,0,0,0,0,1,2,0,1,1,0,0,0,1,1,1,2,0,0,1,1,1,0,2,3,2,0,2,2,2,1,3,1,0,0,0,1,1,1,0,1,0,1,0,1,2,0,0,1,2,0,0,1,2,1,2,0,2,0,0,0,3,0,1,2,0,1,1,2,2,3,2,1,1,2,2,0,3,2,0,3,0,1,2,1,0,0,2,0,1,1,1,0,1,1,1,0,3,0,1,4,1,1,1,1,1,0,3,0,1,1,1,2,1,1,1,1,2,1,0,1,2,2,1,2,3,1,0,3,1,3,0,1,0,0,0,0,1,0,0,1,1,1,1,0,1,1,0,2,0,3,1,0,1,0,2,1,2,1,1,1,0,0,0,1,1,2,0,1,2,1,3,1,1,3,0,0,1,0,0,2,1,1,0,0,1,2,1,0,3,0,2,0,2,1,1,1,2,2,2,3,0,1,0,0,1,0,0,2,1,0,0,1,0,1,3,2,1,0,2,2,2,1,0,2,1,0,0,1,0,0,2,1,0,1,1,3,1,1,1,1,2,2,1,0,1,3,1,1,2,0,0,0,1,1,0,1,1,1,0,2,3,1,2,1,1,1,1,1,0,3,2,1,1,0,1,1,3,2,0,2,0,1,0,1,0,1,0,1,0,1,0,1,3,0,1,0,2,2,1,3,1,1,0,0,2,2,0,1,2,0,1,0,1,1,1,0,0,3,0,0,1,0,0,2,0,1,1,1,1,0,1,1,2,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,1,3,1,0,0,0,0,3,2,2,1,1,0,2,0,1,0,1,1,0,2,1,0,0,1,1,1,2,0,1,1,2,0,0,1,1,0,1,1,0,1,0,2,3,2,2,0,2,2,1,2,1,2,0,0,1,2,0,1,0,1,2,1,1,1,0,0,3,1,0,1,1,0,1,1,0,0,1,0,2,1,1,2,0,0,0,0,1,1,1,2,2,0,4,1,0,2,0,5,0,1,1,0,1,1,1,1,2,2,0,5,1,1,1,1,1,0,0,3,2,1,2,1,1,1,0,0,0,1,1,1,0,1,2,2,1,0,0,0,0,0,4,1,3,1,0,2,0,1,1,1,4,2,2,0,0,0,0,0,0,3,1,0,1,0,1,0,1,0,0,0,1,0,1,1,1]}]},"null_count":0,"last_update_version":397952046447984640}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_004.json b/cmd/explaintest/s/explain_complex_stats_tbl_004.json deleted file mode 100644 index 06df63f03eb45..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_004.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_004","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDA3NzQ3NzI=","upper_bound":"LTIxMzE4MDg3MTI=","repeats":1},{"count":16,"lower_bound":"LTIxMzEyMDQxOTY=","upper_bound":"LTIxMjA1MzczOTI=","repeats":1},{"count":24,"lower_bound":"LTIxMTg0Mjc1ODc=","upper_bound":"LTIwOTA0MDQ3MzQ=","repeats":1},{"count":32,"lower_bound":"LTIwODgzOTEzODU=","upper_bound":"LTIwNzkxNzU3NDc=","repeats":1},{"count":40,"lower_bound":"LTIwNzE3MDU0OTI=","upper_bound":"LTIwNTMxODIzNzU=","repeats":1},{"count":48,"lower_bound":"LTIwNTMxODA3MzY=","upper_bound":"LTIwNDg2MDE1MzI=","repeats":1},{"count":56,"lower_bound":"LTIwNDUyNjQzNTk=","upper_bound":"LTIwMjcyMjExNjU=","repeats":1},{"count":64,"lower_bound":"LTIwMjAxNzMwNDE=","upper_bound":"LTIwMDkzNDAzMTI=","repeats":1},{"count":72,"lower_bound":"LTIwMDUxMDgwMDk=","upper_bound":"LTE5OTcyODkzNTk=","repeats":1},{"count":80,"lower_bound":"LTE5OTU3ODc4MDI=","upper_bound":"LTE5ODUyOTc1NTQ=","repeats":1},{"count":88,"lower_bound":"LTE5Nzc0MDk1MDE=","upper_bound":"LTE5NjQ0OTA5NDU=","repeats":1},{"count":96,"lower_bound":"LTE5NjAxNzg4Mzg=","upper_bound":"LTE5MzE2NTE5MDc=","repeats":1},{"count":104,"lower_bound":"LTE5MzEwMjAyNzg=","upper_bound":"LTE5MTI5MDUxMjU=","repeats":1},{"count":112,"lower_bound":"LTE5MDQ0Nzg0NjA=","upper_bound":"LTE4OTA2NzY3NDg=","repeats":1},{"count":120,"lower_bound":"LTE4ODY5MTA4NjY=","upper_bound":"LTE4NzI2NTk5Nzg=","repeats":1},{"count":128,"lower_bound":"LTE4Njk3OTc1NzM=","upper_bound":"LTE4NjIyNTMxOTM=","repeats":1},{"count":136,"lower_bound":"LTE4NTk5OTY0MjM=","upper_bound":"LTE4NDQyOTgzOTQ=","repeats":1},{"count":144,"lower_bound":"LTE4NDI4NDkzMjA=","upper_bound":"LTE4MzQ3OTQyMjQ=","repeats":1},{"count":152,"lower_bound":"LTE4MzEwNzI5MjA=","upper_bound":"LTE4MTk2NzU4NDQ=","repeats":1},{"count":160,"lower_bound":"LTE4MTg1OTE5MzE=","upper_bound":"LTE4MTI3NDg2ODM=","repeats":1},{"count":168,"lower_bound":"LTE3OTg4NzEyNjY=","upper_bound":"LTE3ODI5Mjc1ODE=","repeats":1},{"count":176,"lower_bound":"LTE3Nzg1NzEzMDQ=","upper_bound":"LTE3NzE3MDY2NDc=","repeats":1},{"count":184,"lower_bound":"LTE3Njk4NDE1OTI=","upper_bound":"LTE3NTMyNzEzMTQ=","repeats":1},{"count":192,"lower_bound":"LTE3NDU3NzgwNDk=","upper_bound":"LTE3MzY2MDE1MzQ=","repeats":1},{"count":200,"lower_bound":"LTE3MzQxNjUyODM=","upper_bound":"LTE3MjY5MTk5MDc=","repeats":1},{"count":208,"lower_bound":"LTE3MjU5ODE0OTE=","upper_bound":"LTE3MDQ1NTU0NDM=","repeats":1},{"count":216,"lower_bound":"LTE3MDE4NjkxMjE=","upper_bound":"LTE2ODQ0NzA4MDk=","repeats":1},{"count":224,"lower_bound":"LTE2ODMzNzAyOTc=","upper_bound":"LTE2NzA3ODQxMjU=","repeats":1},{"count":232,"lower_bound":"LTE2NjYxMjE2MDY=","upper_bound":"LTE2NTg0MzgzMzI=","repeats":1},{"count":240,"lower_bound":"LTE2NTA2ODcwMjk=","upper_bound":"LTE2NDQ3MzQ2MDg=","repeats":1},{"count":248,"lower_bound":"LTE2NDI5MTAzMjk=","upper_bound":"LTE2MzQ3ODg2OTY=","repeats":1},{"count":256,"lower_bound":"LTE2MzQxNjkyNTc=","upper_bound":"LTE2Mjk4MTY1NjM=","repeats":1},{"count":264,"lower_bound":"LTE2MjQ1NzcyMTQ=","upper_bound":"LTE2MDgwMDM1MjQ=","repeats":1},{"count":272,"lower_bound":"LTE2MDQ4Mzc1NjQ=","upper_bound":"LTE1ODI4MDYxNDU=","repeats":1},{"count":280,"lower_bound":"LTE1NzEzNDMzOTI=","upper_bound":"LTE1NjE0Mjg3NDc=","repeats":1},{"count":288,"lower_bound":"LTE1NTM2MTM1MDM=","upper_bound":"LTE1Mjg2MTg5NTc=","repeats":1},{"count":296,"lower_bound":"LTE1MjE3OTIzMTM=","upper_bound":"LTE1MTA0NzQ4NjA=","repeats":1},{"count":304,"lower_bound":"LTE1MDg0NTI1NzY=","upper_bound":"LTE1MDI1NDcyNjk=","repeats":1},{"count":312,"lower_bound":"LTE1MDIyMDUwNzc=","upper_bound":"LTE0NzgyNDg2MDg=","repeats":1},{"count":320,"lower_bound":"LTE0NzQ1MDg2MTc=","upper_bound":"LTE0NjU1NDEyNDM=","repeats":1},{"count":328,"lower_bound":"LTE0NjI0NDE5ODQ=","upper_bound":"LTE0NTUxODE1MDQ=","repeats":1},{"count":336,"lower_bound":"LTE0NDI5Mjk0NjU=","upper_bound":"LTE0Mjk1OTExMjQ=","repeats":1},{"count":344,"lower_bound":"LTE0MjkwODQ5MjQ=","upper_bound":"LTE0MjU2NjQ3MDU=","repeats":1},{"count":352,"lower_bound":"LTE0MjIyODEwNjQ=","upper_bound":"LTE0MTUwNDA1MzE=","repeats":1},{"count":360,"lower_bound":"LTE0MDg5MDEyOTE=","upper_bound":"LTEzOTcwNjk0NDc=","repeats":1},{"count":368,"lower_bound":"LTEzOTY1NTE4ODA=","upper_bound":"LTEzOTI4ODg5NjM=","repeats":1},{"count":376,"lower_bound":"LTEzOTIxNDM5MDY=","upper_bound":"LTEzODkyNjkyMDA=","repeats":1},{"count":384,"lower_bound":"LTEzNzg4NTIwMDM=","upper_bound":"LTEzNjU3MzM4Njc=","repeats":1},{"count":392,"lower_bound":"LTEzNTg4NTM0MDc=","upper_bound":"LTEzMzY4OTY2MTc=","repeats":1},{"count":400,"lower_bound":"LTEzMzEyOTE5MjE=","upper_bound":"LTEzMDc1OTk3NDE=","repeats":1},{"count":408,"lower_bound":"LTEzMDczMjcyOTU=","upper_bound":"LTEyOTg5NTcyMDE=","repeats":1},{"count":416,"lower_bound":"LTEyOTg3ODM0NTM=","upper_bound":"LTEyODc2OTM4Nzc=","repeats":1},{"count":424,"lower_bound":"LTEyNzk5ODExNzM=","upper_bound":"LTEyNjg2NTE2ODQ=","repeats":1},{"count":432,"lower_bound":"LTEyNjM3NTMxODU=","upper_bound":"LTEyNTQzMjMwNjI=","repeats":1},{"count":440,"lower_bound":"LTEyNTIwMzIwNjU=","upper_bound":"LTEyNDU4NjA2NzU=","repeats":1},{"count":448,"lower_bound":"LTEyNDA0NjYzMzc=","upper_bound":"LTEyMjY4NTgzOTM=","repeats":1},{"count":456,"lower_bound":"LTEyMjQ0NjQ4MDA=","upper_bound":"LTEyMTIwNzIxOTU=","repeats":1},{"count":464,"lower_bound":"LTEyMDI0Nzc3MDY=","upper_bound":"LTExODY1NDY4NTA=","repeats":1},{"count":472,"lower_bound":"LTExNzQxOTI3MTU=","upper_bound":"LTExNjQxMzYzNjc=","repeats":1},{"count":480,"lower_bound":"LTExNjA3ODk2MDY=","upper_bound":"LTExNTY4Mjk4MTc=","repeats":1},{"count":488,"lower_bound":"LTExNTIxNDQ1MTg=","upper_bound":"LTExNDEzNTIwMDc=","repeats":1},{"count":496,"lower_bound":"LTExMzkwNTk4Mzc=","upper_bound":"LTExMzI2MTc0NjQ=","repeats":1},{"count":504,"lower_bound":"LTExMjk0MjgzMTM=","upper_bound":"LTExMjM0NTEyMjM=","repeats":1},{"count":512,"lower_bound":"LTExMjI0MDEyMzU=","upper_bound":"LTExMTU2NzEzNzA=","repeats":1},{"count":520,"lower_bound":"LTExMTQ4MzI1NTI=","upper_bound":"LTExMDgyMTI3OTU=","repeats":1},{"count":528,"lower_bound":"LTExMDY3NDA2NTk=","upper_bound":"LTEwNzI0NjcxMDM=","repeats":1},{"count":536,"lower_bound":"LTEwNjQ4NDQ0OTU=","upper_bound":"LTEwMzgzMjkzNDU=","repeats":1},{"count":544,"lower_bound":"LTEwMjcyMjI2OTk=","upper_bound":"LTEwMTQzMjk3MTg=","repeats":1},{"count":552,"lower_bound":"LTEwMTEyNDQ1NTQ=","upper_bound":"LTk4MTk5MjkxNg==","repeats":1},{"count":560,"lower_bound":"LTk4MDk2ODQ2MQ==","upper_bound":"LTk3MDMzMzEzNA==","repeats":1},{"count":568,"lower_bound":"LTk2NjE1NTIwMw==","upper_bound":"LTk2MDExNDQ1MA==","repeats":1},{"count":576,"lower_bound":"LTk1OTA2MTI4Ng==","upper_bound":"LTk0ODg2Nzg3NQ==","repeats":1},{"count":584,"lower_bound":"LTk0MDA5MTIwMw==","upper_bound":"LTkzMDEzNTE1MQ==","repeats":1},{"count":592,"lower_bound":"LTkyNDAzMzQ5Mw==","upper_bound":"LTg5NDg0MTczNw==","repeats":1},{"count":600,"lower_bound":"LTg5MTU5MDA3OA==","upper_bound":"LTg4NTA2ODUyMg==","repeats":1},{"count":608,"lower_bound":"LTg2OTc1NjY5Nw==","upper_bound":"LTg1Mzk3MDkxNg==","repeats":1},{"count":616,"lower_bound":"LTg1MzczODYxNg==","upper_bound":"LTgzNDgyNjQwMw==","repeats":1},{"count":624,"lower_bound":"LTgzMzM3MzMzNA==","upper_bound":"LTgyMDM5NzU4OA==","repeats":1},{"count":632,"lower_bound":"LTgyMDI5MjA2Nw==","upper_bound":"LTgxODE3ODUwMg==","repeats":1},{"count":640,"lower_bound":"LTgxMjQzMTk4Ng==","upper_bound":"LTgwMDQ4MDczNA==","repeats":1},{"count":648,"lower_bound":"LTc5NDczOTc3Ng==","upper_bound":"LTc4MTY2ODkxMA==","repeats":1},{"count":656,"lower_bound":"LTc3ODU3NzQ5Mw==","upper_bound":"LTc1OTkyMzIyMQ==","repeats":1},{"count":664,"lower_bound":"LTc1OTUwOTI4Ng==","upper_bound":"LTczNDc4MTc4NA==","repeats":1},{"count":672,"lower_bound":"LTcyOTM1MzY0Ng==","upper_bound":"LTcxMDU0ODczMA==","repeats":1},{"count":680,"lower_bound":"LTcxMDUwMjkxOQ==","upper_bound":"LTY5Njg3ODk4MA==","repeats":1},{"count":688,"lower_bound":"LTY5Njc2MjQ4Ng==","upper_bound":"LTY4ODg5NjQ1Mw==","repeats":1},{"count":696,"lower_bound":"LTY3ODQ5MzE2OA==","upper_bound":"LTY3MDY4NzM1Ng==","repeats":1},{"count":704,"lower_bound":"LTY3MDI2MjE0NA==","upper_bound":"LTY1NDg3MDQzOQ==","repeats":1},{"count":712,"lower_bound":"LTY1MzY3NjM4Mw==","upper_bound":"LTY0MzU0NTYyMQ==","repeats":1},{"count":720,"lower_bound":"LTYzNzYxOTA4OA==","upper_bound":"LTYyOTc4ODgzMQ==","repeats":1},{"count":728,"lower_bound":"LTYyOTU3MjI0MA==","upper_bound":"LTYyNDQ2MzU0Ng==","repeats":1},{"count":736,"lower_bound":"LTYyMTEwMDQwMw==","upper_bound":"LTYxMTYzNjc1Mg==","repeats":1},{"count":744,"lower_bound":"LTYxMTQyNzE0MA==","upper_bound":"LTYwMjc5MTA4MQ==","repeats":1},{"count":752,"lower_bound":"LTU5OTY2OTQyMA==","upper_bound":"LTU4NzIxMzQ5MA==","repeats":1},{"count":760,"lower_bound":"LTU4MzY1NjQ5NQ==","upper_bound":"LTU3NTA0MjE4NA==","repeats":1},{"count":768,"lower_bound":"LTU3MTk1NzQxNw==","upper_bound":"LTU2MzUwNTEzNA==","repeats":1},{"count":776,"lower_bound":"LTU2MDQ2ODY3Mw==","upper_bound":"LTU1NTUwMDE0NQ==","repeats":1},{"count":784,"lower_bound":"LTU0OTIxNTk5OQ==","upper_bound":"LTU0NjM5NjA2NQ==","repeats":1},{"count":792,"lower_bound":"LTU0MjkxODExNA==","upper_bound":"LTUzMzczMTQ4Mw==","repeats":1},{"count":800,"lower_bound":"LTUzMDAzMzIyMw==","upper_bound":"LTUwMzgzMjk3MA==","repeats":1},{"count":808,"lower_bound":"LTUwMjkwNDA5OQ==","upper_bound":"LTQ5MDM1NDk5Mw==","repeats":1},{"count":816,"lower_bound":"LTQ4OTg3MjM2Nw==","upper_bound":"LTQ3NzUwOTU1NQ==","repeats":1},{"count":824,"lower_bound":"LTQ3NzE0NTQyMQ==","upper_bound":"LTQ3MDg3MjI1MA==","repeats":1},{"count":832,"lower_bound":"LTQ2ODY3MjcxMA==","upper_bound":"LTQ1MjczMjM5NQ==","repeats":1},{"count":840,"lower_bound":"LTQ0OTk3NjYwMQ==","upper_bound":"LTQ0MzQ3NTIxOA==","repeats":1},{"count":848,"lower_bound":"LTQzNTc4MTU5NA==","upper_bound":"LTQxNDUyMzA1Ng==","repeats":1},{"count":856,"lower_bound":"LTQxNDQ5NDM1NQ==","upper_bound":"LTM5OTExODEyMA==","repeats":1},{"count":864,"lower_bound":"LTM5ODI3NzM3MA==","upper_bound":"LTM4NTgwMDg2Ng==","repeats":1},{"count":872,"lower_bound":"LTM4NDgzNTk1Nw==","upper_bound":"LTM2NjA0NDE5Ng==","repeats":1},{"count":880,"lower_bound":"LTM2NTA2NjYzOA==","upper_bound":"LTM1ODExNDk1NQ==","repeats":1},{"count":888,"lower_bound":"LTM1NTU1OTAzMQ==","upper_bound":"LTM0MDI5OTQ2MQ==","repeats":1},{"count":896,"lower_bound":"LTMzNjc0MTk5Ng==","upper_bound":"LTMyNTUxMDYzMw==","repeats":1},{"count":904,"lower_bound":"LTMxNjk3NDA5OQ==","upper_bound":"LTMwMzc0NzYyMw==","repeats":1},{"count":912,"lower_bound":"LTMwMDU1ODI5OQ==","upper_bound":"LTI4NDgxNDI4NQ==","repeats":1},{"count":920,"lower_bound":"LTI4MDEyODQ0NA==","upper_bound":"LTI3MTEwNTk2Mg==","repeats":1},{"count":928,"lower_bound":"LTI3MDMyMzMxNw==","upper_bound":"LTI0MjQ5NTA0Ng==","repeats":1},{"count":936,"lower_bound":"LTIzMTkzMTUxOQ==","upper_bound":"LTIwNDA4Njc5Ng==","repeats":1},{"count":944,"lower_bound":"LTIwMjIzMDYxNQ==","upper_bound":"LTE4NzQ4NTY3OQ==","repeats":1},{"count":952,"lower_bound":"LTE3ODk0NTg2NA==","upper_bound":"LTE2OTc5OTM1Mg==","repeats":1},{"count":960,"lower_bound":"LTE2ODE4ODkwNw==","upper_bound":"LTE0NTcxMjI1Mg==","repeats":1},{"count":968,"lower_bound":"LTE0MjY4NjE5MA==","upper_bound":"LTEzMDk2MjU4MQ==","repeats":1},{"count":976,"lower_bound":"LTEyNjE1ODAwNw==","upper_bound":"LTEwOTUyOTk0NQ==","repeats":1},{"count":984,"lower_bound":"LTEwNDk2MTAwMw==","upper_bound":"LTg4ODExMDAw","repeats":1},{"count":992,"lower_bound":"LTg2MTcwMjM2","upper_bound":"LTczNTA5NDQ2","repeats":1},{"count":1000,"lower_bound":"LTczMjQyNzE4","upper_bound":"LTU4NzcwMTU1","repeats":1},{"count":1008,"lower_bound":"LTU3NzMyOTM2","upper_bound":"LTUxNzExODI1","repeats":1},{"count":1016,"lower_bound":"LTUwNjExNTQ3","upper_bound":"LTQ3NTQ1Mzc2","repeats":1},{"count":1024,"lower_bound":"LTQ1Njc0MjEw","upper_bound":"LTM1MjUyMTkx","repeats":1},{"count":1032,"lower_bound":"LTMzNDI5NTI2","upper_bound":"LTE5MjU3MjA4","repeats":1},{"count":1040,"lower_bound":"LTkyMzcyMDQ=","upper_bound":"MTAzMTA3ODY=","repeats":1},{"count":1048,"lower_bound":"MTA1MDQ2NDA=","upper_bound":"MTY4Mjg4MjQ=","repeats":1},{"count":1056,"lower_bound":"MjM5NDkzODE=","upper_bound":"MzUxODc4ODU=","repeats":1},{"count":1064,"lower_bound":"MzU1MDYxMDc=","upper_bound":"Mzk2MjIxODc=","repeats":1},{"count":1072,"lower_bound":"NDEwNTgyMTE=","upper_bound":"NTQ4OTYxNjU=","repeats":1},{"count":1080,"lower_bound":"NTczNzI1ODY=","upper_bound":"NzgzMzIyMzE=","repeats":1},{"count":1088,"lower_bound":"ODMwNDkyMjE=","upper_bound":"OTM2ODA5Mzc=","repeats":1},{"count":1096,"lower_bound":"OTU5NDc4MDM=","upper_bound":"MTA2NDM0MDcy","repeats":1},{"count":1104,"lower_bound":"MTEwNDI5NDMy","upper_bound":"MTMyNjM5Nzcy","repeats":1},{"count":1112,"lower_bound":"MTMzNjk2NzIx","upper_bound":"MTM2MzMwMzg3","repeats":1},{"count":1120,"lower_bound":"MTQyNzgzMDUy","upper_bound":"MTY0OTAzNDU1","repeats":1},{"count":1128,"lower_bound":"MTY4MjY0MDg5","upper_bound":"MTk2NjMyNzI3","repeats":1},{"count":1136,"lower_bound":"MjExNTAzMTQ3","upper_bound":"MjIyNDYyOTkw","repeats":1},{"count":1144,"lower_bound":"MjIzNTQwMjky","upper_bound":"MjM4Mzg0OTc4","repeats":1},{"count":1152,"lower_bound":"MjQwNzEzMjQy","upper_bound":"MjQ5MTg3MjAz","repeats":1},{"count":1160,"lower_bound":"MjQ5MzU2NjQw","upper_bound":"MjUwNzA3NjYx","repeats":1},{"count":1168,"lower_bound":"MjcxNDkyNDUx","upper_bound":"MjgzNTEwNDM5","repeats":1},{"count":1176,"lower_bound":"Mjk0NzkwNDEz","upper_bound":"MzEyMjI2MTUx","repeats":1},{"count":1184,"lower_bound":"MzE3MDQ3ODUx","upper_bound":"MzM1OTExNDMz","repeats":1},{"count":1192,"lower_bound":"MzQwMDM0Mjcw","upper_bound":"MzY0NjcyODY0","repeats":1},{"count":1200,"lower_bound":"MzY1MDc4NTQ3","upper_bound":"Mzc4NDk2NzE4","repeats":1},{"count":1208,"lower_bound":"Mzc5MjE2MDIx","upper_bound":"Mzg1ODkxNDE5","repeats":1},{"count":1216,"lower_bound":"Mzg2NDcyMjEx","upper_bound":"NDA3MTgxNDU3","repeats":1},{"count":1224,"lower_bound":"NDEwNTEzMTk0","upper_bound":"NDMzMTIzOTc3","repeats":1},{"count":1232,"lower_bound":"NDMzMTU1MTY5","upper_bound":"NDQ2MzExMDE4","repeats":1},{"count":1240,"lower_bound":"NDUzNTM4NjA4","upper_bound":"NDc1NDAwMzA5","repeats":1},{"count":1248,"lower_bound":"NDc5MjgwNTQx","upper_bound":"NDg3OTQxOTI2","repeats":1},{"count":1256,"lower_bound":"NDkxMjI0Nzc4","upper_bound":"NTAwMDU3ODMw","repeats":1},{"count":1264,"lower_bound":"NTAyMDk0ODIy","upper_bound":"NTE1OTcwMTcx","repeats":1},{"count":1272,"lower_bound":"NTIxODA0NTY4","upper_bound":"NTQ0OTg5MDgz","repeats":1},{"count":1280,"lower_bound":"NTQ1Mjk1MDIy","upper_bound":"NTUzMjg4ODMw","repeats":1},{"count":1288,"lower_bound":"NTU0NTk1NTQ3","upper_bound":"NTY1MTAxMTQ1","repeats":1},{"count":1296,"lower_bound":"NTczMjE0NjQx","upper_bound":"NTc5OTA3Njkw","repeats":1},{"count":1304,"lower_bound":"NTgxNDgzNDY1","upper_bound":"NTkwMTE4MTgx","repeats":1},{"count":1312,"lower_bound":"NTkwNzY0Mjg1","upper_bound":"NjEzNTAwNjY2","repeats":1},{"count":1320,"lower_bound":"NjE2ODUzOTM3","upper_bound":"NjM1MTQ4OTM1","repeats":1},{"count":1328,"lower_bound":"NjQ4MjI4NTY3","upper_bound":"NjU0NjUxNDU1","repeats":1},{"count":1336,"lower_bound":"NjU2NDU1MzQ4","upper_bound":"NjY1ODk0MTIx","repeats":1},{"count":1344,"lower_bound":"Njg0NTk1MjEw","upper_bound":"NjkxNDMzNTA5","repeats":1},{"count":1352,"lower_bound":"NjkyMTUzMDEy","upper_bound":"NzA4NzkzNDA4","repeats":1},{"count":1360,"lower_bound":"NzIxNDcxNDcx","upper_bound":"NzMxMTQ4NDE5","repeats":1},{"count":1368,"lower_bound":"NzM4NjMxMTI1","upper_bound":"NzQzNDUxMjIx","repeats":1},{"count":1376,"lower_bound":"NzQ3NzkxODg4","upper_bound":"NzYyMjEwMjEz","repeats":1},{"count":1384,"lower_bound":"NzY3NzUzNzY2","upper_bound":"Nzg2OTEzMjU2","repeats":1},{"count":1392,"lower_bound":"Nzk0OTA1NzI2","upper_bound":"ODAyMDEwNzgw","repeats":1},{"count":1400,"lower_bound":"ODA0OTA0Mjk2","upper_bound":"ODI1Mjg2MTQ2","repeats":1},{"count":1408,"lower_bound":"ODI5NTQxNTA5","upper_bound":"ODM3OTcxOTEw","repeats":1},{"count":1416,"lower_bound":"ODUzMDQ3MDg4","upper_bound":"ODY0MTE1MDkx","repeats":1},{"count":1424,"lower_bound":"ODY4NjM3MDU2","upper_bound":"ODkxMDgzODg2","repeats":1},{"count":1432,"lower_bound":"ODkzNTU5NTgx","upper_bound":"OTA0MzYyMTQ3","repeats":1},{"count":1440,"lower_bound":"OTA0NjUxMTgw","upper_bound":"OTExOTQ2MDcw","repeats":1},{"count":1448,"lower_bound":"OTEyNjA2MTk1","upper_bound":"OTIxNTE0ODE4","repeats":1},{"count":1456,"lower_bound":"OTIzMzExMDU3","upper_bound":"OTI1NzM2OTA5","repeats":1},{"count":1464,"lower_bound":"OTM5NDc2MDc5","upper_bound":"OTU3OTQwMTEy","repeats":1},{"count":1472,"lower_bound":"OTY3MzUyNTg1","upper_bound":"OTk2MDc3NzE2","repeats":1},{"count":1480,"lower_bound":"MTAwNjA3OTE0Nw==","upper_bound":"MTAyNDU1NDEzOA==","repeats":1},{"count":1488,"lower_bound":"MTAzOTE4ODkwNQ==","upper_bound":"MTA0Njk3MTg0MQ==","repeats":1},{"count":1496,"lower_bound":"MTA1MTg1ODI1NA==","upper_bound":"MTA2NjMyODM2OQ==","repeats":1},{"count":1504,"lower_bound":"MTA2NjgzNTAwNw==","upper_bound":"MTA3Mjk5NTQxNw==","repeats":1},{"count":1512,"lower_bound":"MTA3NDE4NjAyNQ==","upper_bound":"MTA4NTc5NTg0Nw==","repeats":1},{"count":1520,"lower_bound":"MTA5MTgyMDE0MQ==","upper_bound":"MTEwMzcyODE3MQ==","repeats":1},{"count":1528,"lower_bound":"MTEwNDQwMTgxNg==","upper_bound":"MTExMTg3ODE0MA==","repeats":1},{"count":1536,"lower_bound":"MTEyMjMxNzAyNQ==","upper_bound":"MTE1MDU1MDQ4Mw==","repeats":1},{"count":1544,"lower_bound":"MTE1NDYyNDI0Mw==","upper_bound":"MTE1ODU2NDIxNg==","repeats":1},{"count":1552,"lower_bound":"MTE3NTY4Mjk3Mg==","upper_bound":"MTE4MTQyMzczOQ==","repeats":1},{"count":1560,"lower_bound":"MTE4NTk3NTMwMg==","upper_bound":"MTE5NjE0MDM4Mg==","repeats":1},{"count":1568,"lower_bound":"MTE5OTkwODkzMw==","upper_bound":"MTIwNzUzOTQyOQ==","repeats":1},{"count":1576,"lower_bound":"MTIwODE1ODE4Nw==","upper_bound":"MTIxMzk2Nzk0MQ==","repeats":1},{"count":1584,"lower_bound":"MTIxNjM1NjQyOA==","upper_bound":"MTIzMTkxOTgyMQ==","repeats":1},{"count":1592,"lower_bound":"MTIzMzYwNDIxNQ==","upper_bound":"MTI0MzEyNjg4NQ==","repeats":1},{"count":1600,"lower_bound":"MTI0NDgzMzQ0Mg==","upper_bound":"MTI5OTA4ODgwNg==","repeats":1},{"count":1608,"lower_bound":"MTMwMjI0NjMyOQ==","upper_bound":"MTMxOTczMzUyNQ==","repeats":1},{"count":1616,"lower_bound":"MTMzMzMxNTM0MQ==","upper_bound":"MTM0NTMzNDA0MQ==","repeats":1},{"count":1624,"lower_bound":"MTM0NTM5MDQ4Nw==","upper_bound":"MTM0OTUwMzA1NA==","repeats":1},{"count":1632,"lower_bound":"MTM1MTQ1NTY5Ng==","upper_bound":"MTM2Mzc4NDk1Mg==","repeats":1},{"count":1640,"lower_bound":"MTM2NTY1NTEyMQ==","upper_bound":"MTM2OTA4OTA3OA==","repeats":1},{"count":1648,"lower_bound":"MTM4NzI4MDc2MQ==","upper_bound":"MTQ0OTQ2NDUxMg==","repeats":1},{"count":1656,"lower_bound":"MTQ1Mjk3MDgzMA==","upper_bound":"MTQ4MDExNjc2NQ==","repeats":1},{"count":1664,"lower_bound":"MTQ4MjM0MzM0MA==","upper_bound":"MTQ5MDQ2MDkyOQ==","repeats":1},{"count":1672,"lower_bound":"MTQ5MTg4MDAwMg==","upper_bound":"MTUwMzA2ODU1MA==","repeats":1},{"count":1680,"lower_bound":"MTUwNTEyODk5Ng==","upper_bound":"MTUxNTA0NjI5Mg==","repeats":1},{"count":1688,"lower_bound":"MTUxNjEzNDY1MQ==","upper_bound":"MTUyMDkzNjA1Nw==","repeats":1},{"count":1696,"lower_bound":"MTUyMTE3MDcxNg==","upper_bound":"MTUyOTE4OTU0Nw==","repeats":1},{"count":1704,"lower_bound":"MTUzMDA3NDE5MQ==","upper_bound":"MTUzNzA1NTg2MQ==","repeats":1},{"count":1712,"lower_bound":"MTU0MDExNTExMQ==","upper_bound":"MTU0ODEzMTE5NQ==","repeats":1},{"count":1720,"lower_bound":"MTU1MDAyNTc0NQ==","upper_bound":"MTU2MDYxNDIzMw==","repeats":1},{"count":1728,"lower_bound":"MTU2NjAzNjY4Ng==","upper_bound":"MTU3NzU0NTM5NQ==","repeats":1},{"count":1736,"lower_bound":"MTU4NDU0OTgxNQ==","upper_bound":"MTYwMTY1OTk4NQ==","repeats":1},{"count":1744,"lower_bound":"MTYwMjA4NTgxMg==","upper_bound":"MTYxNjM2NjYzNQ==","repeats":1},{"count":1752,"lower_bound":"MTYxNzEzNTc4Ng==","upper_bound":"MTYyNDczNjE2Ng==","repeats":1},{"count":1760,"lower_bound":"MTYzMDYxNDMzMA==","upper_bound":"MTY0NTIxMjA0MQ==","repeats":1},{"count":1768,"lower_bound":"MTY1NTQzNzc2Mw==","upper_bound":"MTY3NzUwMzI4MQ==","repeats":1},{"count":1776,"lower_bound":"MTY3Nzk4MTE1NA==","upper_bound":"MTY4NTczMjM0NA==","repeats":1},{"count":1784,"lower_bound":"MTY5MTQ3MTk1Nw==","upper_bound":"MTcwMzM3NTI5MQ==","repeats":1},{"count":1792,"lower_bound":"MTcxMjIyNjk2Nw==","upper_bound":"MTcxODY3NDY3OQ==","repeats":1},{"count":1800,"lower_bound":"MTcyMDkyMDkzMw==","upper_bound":"MTczODY5NTExMQ==","repeats":1},{"count":1808,"lower_bound":"MTc0MjQzMzExNQ==","upper_bound":"MTc1ODU4MjY1MQ==","repeats":1},{"count":1816,"lower_bound":"MTc2MTkxNzUwNQ==","upper_bound":"MTc2Mjk0MzI3Nw==","repeats":1},{"count":1824,"lower_bound":"MTc2Mzc1NzYxNw==","upper_bound":"MTc3NDI2MDc5NA==","repeats":1},{"count":1832,"lower_bound":"MTc4MjgxNzM2Mg==","upper_bound":"MTc5NjE5MTM0NA==","repeats":1},{"count":1840,"lower_bound":"MTgwNTQxOTU0OQ==","upper_bound":"MTgwODcwMjgxNQ==","repeats":1},{"count":1848,"lower_bound":"MTgwODc1NzMzNg==","upper_bound":"MTgyNDAxOTUwOA==","repeats":1},{"count":1856,"lower_bound":"MTgyNjI0MTIxNg==","upper_bound":"MTgyOTMyMzI5NA==","repeats":1},{"count":1864,"lower_bound":"MTgzMjc1OTEwMg==","upper_bound":"MTg0MjU4MDEzOQ==","repeats":1},{"count":1872,"lower_bound":"MTg0MzQxMTM4Mw==","upper_bound":"MTg1MTI5NTU4Nw==","repeats":1},{"count":1880,"lower_bound":"MTg1MTk4ODg3OQ==","upper_bound":"MTg2NTAzNTg2MA==","repeats":1},{"count":1888,"lower_bound":"MTg2NTczNzY1MQ==","upper_bound":"MTg4NDMyOTY2Mw==","repeats":1},{"count":1896,"lower_bound":"MTg5MjcwOTIzMQ==","upper_bound":"MTkwMTk2NjU5MA==","repeats":1},{"count":1904,"lower_bound":"MTkwNDY5Njg0Mg==","upper_bound":"MTkxNzcwMDYwNQ==","repeats":1},{"count":1912,"lower_bound":"MTkxOTAyOTA1NQ==","upper_bound":"MTkzNDI3NzU4MQ==","repeats":1},{"count":1920,"lower_bound":"MTk0NDg4MzI0Nw==","upper_bound":"MTk3Njg4MjQ3MQ==","repeats":1},{"count":1928,"lower_bound":"MTk4NzQ4NjkyMg==","upper_bound":"MTk5ODk1OTM4NQ==","repeats":1},{"count":1936,"lower_bound":"MjAwNjQ1NDM4Ng==","upper_bound":"MjAwOTUwODg2MA==","repeats":1},{"count":1944,"lower_bound":"MjAxNDcyMTAyOA==","upper_bound":"MjAyNjQyMjc1Mw==","repeats":1},{"count":1952,"lower_bound":"MjAyNzI1MDg0Ng==","upper_bound":"MjAyOTMyNDEwNA==","repeats":1},{"count":1960,"lower_bound":"MjAzNTkyMjEwNw==","upper_bound":"MjA0NTAxNzY5Ng==","repeats":1},{"count":1968,"lower_bound":"MjA0NTQ5MTc3Mg==","upper_bound":"MjA2NzI1MjI3OQ==","repeats":1},{"count":1976,"lower_bound":"MjA3MjMzNzU3MQ==","upper_bound":"MjA4MDkyMzY2Mw==","repeats":1},{"count":1984,"lower_bound":"MjA4Mzk4NzU2OA==","upper_bound":"MjA5NTMzNzk0Mg==","repeats":1},{"count":1992,"lower_bound":"MjExOTc0NDczOA==","upper_bound":"MjEzMzcxNDM3MA==","repeats":1},{"count":2000,"lower_bound":"MjEzNDgxNjg0NQ==","upper_bound":"MjE0MTIxODc2NQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,3,3,0,1,0,1,1,1,2,0,2,1,1,1,0,0,1,0,1,1,0,0,1,0,2,0,0,3,1,0,1,0,1,1,1,1,1,2,1,2,1,1,2,0,0,0,1,3,0,2,0,2,0,0,3,1,1,0,1,1,1,1,1,1,2,1,0,1,2,1,0,3,0,2,2,1,3,0,1,1,3,0,0,0,0,1,1,0,0,1,1,0,3,1,1,0,0,1,2,2,0,0,1,0,4,2,1,1,0,0,0,1,3,0,0,0,1,1,0,0,1,3,1,5,0,0,0,0,3,2,3,0,3,1,0,1,0,2,1,0,0,1,0,1,0,0,0,0,0,5,0,1,2,1,1,0,0,0,1,0,2,2,0,2,1,1,1,3,1,0,1,0,1,1,0,2,2,0,1,0,0,1,3,0,0,1,0,1,0,2,0,1,2,1,2,3,0,2,0,0,1,2,0,2,2,1,1,0,0,1,2,0,1,0,0,1,3,1,1,1,1,0,3,3,3,1,0,2,0,2,0,2,4,0,2,1,1,0,2,0,1,0,0,1,1,1,1,2,0,1,3,0,0,2,2,2,0,2,1,2,1,1,0,1,1,1,1,1,2,1,1,3,1,1,1,0,0,0,0,0,0,2,0,2,2,2,0,0,3,1,0,3,1,1,3,0,2,1,1,3,0,0,1,1,0,0,0,1,0,0,1,1,0,1,2,0,0,0,0,1,1,2,2,1,0,0,3,0,0,1,0,0,2,1,0,0,1,1,0,0,2,0,1,0,3,1,1,2,1,0,1,0,1,0,2,2,1,1,1,1,1,2,0,2,1,2,2,2,0,1,0,0,1,1,1,0,0,1,0,1,3,0,0,0,2,1,1,0,0,1,0,1,1,1,2,0,1,0,0,0,0,1,0,0,1,4,1,0,0,2,1,0,2,0,2,2,1,1,2,0,0,1,1,0,2,0,2,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,2,1,2,0,0,0,2,0,0,1,1,0,2,1,1,4,0,2,0,0,1,3,0,1,2,1,2,0,0,1,1,2,1,1,0,1,3,2,3,1,2,2,2,2,1,1,0,1,1,0,0,0,0,2,6,1,0,1,3,0,1,0,2,2,1,1,1,1,1,1,1,2,1,2,0,0,0,0,2,1,0,1,0,1,0,0,2,1,0,1,1,1,0,2,0,2,1,1,1,1,0,4,3,2,1,0,0,0,2,0,2,1,1,1,1,2,1,0,1,0,1,2,2,1,1,1,0,1,2,2,1,2,1,0,1,0,0,0,1,0,1,0,0,2,1,2,1,1,0,1,1,0,2,0,1,1,2,2,2,0,1,0,4,2,1,3,2,4,0,2,1,0,1,0,0,0,0,2,2,1,2,0,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,1,0,1,2,2,0,3,0,2,0,0,0,0,1,0,1,0,3,0,0,1,2,0,1,1,1,2,0,0,3,1,0,0,3,0,1,0,1,1,0,0,1,0,1,0,3,2,1,0,1,3,0,0,0,1,1,1,2,0,0,1,0,1,0,1,1,1,0,2,1,0,3,0,2,0,2,1,2,4,0,1,2,1,0,0,4,1,3,1,0,1,1,2,0,0,3,0,1,0,0,0,0,0,0,0,0,0,1,1,1,3,0,0,1,1,2,4,2,2,0,0,1,2,1,0,2,2,1,2,0,2,3,0,0,0,0,2,2,0,1,1,3,1,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,2,0,3,1,2,1,1,1,1,2,0,0,0,1,1,0,1,1,2,0,5,1,1,1,0,1,2,0,1,2,1,1,0,0,1,1,2,3,1,3,0,0,0,0,1,2,0,0,1,1,2,0,2,2,3,0,2,2,1,2,1,1,4,0,2,1,0,0,1,1,2,1,1,1,3,0,0,0,1,1,1,1,3,1,2,1,0,0,2,1,0,0,0,3,1,1,2,2,0,2,1,1,0,2,1,1,0,0,2,0,0,2,1,1,2,3,2,0,1,1,1,2,0,1,1,0,0,2,2,1,2,0,1,1,2,1,0,1,1,0,1,1,3,0,0,0,0,0,1,0,0,1,2,1,1,1,0,1,1,2,0,1,1,1,2,2,3,1,1,2,2,0,2,1,1,1,2,0,2,0,0,2,1,1,1,1,0,1,3,1,0,1,0,2,0,0,2,1,2,1,0,1,1,0,3,1,1,2,2,1,0,1,1,1,2,0,2,1,1,0,2,2,2,2,0,3,2,0,3,0,0,0,1,1,1,1,4,0,1,1,2,0,1,1,3,1,0,0,2,0,1,1,0,1,1,2,1,4,2,1,0,0,3,2,0,0,1,1,0,0,1,1,1,0,2,2,0,0,1,0,0,0,0,1,0,1,0,0,0,2,1,2,1,1,3,0,2,2,0,1,0,1,3,1,0,3,1,1,1,0,1,1,0,0,0,1,2,2,0,0,1,0,2,1,0,1,2,2,3,2,2,3,0,0,0,1,3,1,1,1,1,0,2,1,0,1,0,1,0,2,1,1,0,0,0,0,2,0,0,0,0,0,0,1,1,0,1,0,2,1,0,1,1,1,1,1,0,0,1,2,1,1,1,0,2,2,1,1,2,3,1,1,1,0,1,0,0,2,2,1,0,2,1,1,1,1,1,1,2,0,4,1,0,1,1,0,0,0,1,0,1,0,0,1,2,1,1,3,0,0,1,0,0,0,1,2,2,2,0,1,1,0,1,1,1,0,1,1,0,2,1,0,1,2,1,2,1,2,2,0,1,2,1,0,2,0,0,3,0,0,1,0,1,2,1,1,0,0,0,0,1,1,1,2,1,0,1,0,1,1,1,2,2,1,2,1,4,2,0,0,1,0,3,1,1,0,0,1,2,2,0,1,3,0,0,0,1,1,0,1,2,2,3,0,0,0,1,3,0,0,1,1,1,1,2,0,2,2,2,1,1,0,0,1,0,2,3,1,0,2,1,1,1,1,1,1,3,0,1,1,2,0,2,0,2,1,1,0,1,0,1,1,3,1,1,0,0,0,0,1,0,0,0,1,2,2,1,4,1,2,0,1,1,1,1,1,2,0,0,4,1,1,1,2,2,0,1,1,2,0,0,1,0,2,0,0,1,3,0,0,1,0,0,1,1,2,2,1,1,1,1,2,0,1,1,1,2,0,0,1,0,0,0,2,1,2,1,2,2,1,2,1,1,1,1,1,2,2,1,1,1,1,1,1,1,0,0,0,1,1,1,0,2,0,2,0,0,1,1,3,0,2,3,1,0,0,3,0,1,0,0,1,1,1,0,1,1,1,0,2,1,0,0,0,3,2,1,1,1,0,1,0,2,3,2,1,1,2,0,2,0,1,0,0,0,1,1,1,3,1,0,3,0,3,3,0,1,1,0,1,0,1,3,3,1,3,0,3,2,0,1,3,2,2,3,1,1,2,1,2,1,1,1,1,2,0,4,0,0,0,0,0,1,0,0,1,1,1,1,0,1,0,0,1,1,0,0,2,2,0,0,1,3,2,0,1,0,0,2,2,1,2,0,1,0,2,0,0,4,1,1,1,2,1,2,0,1,0,2,0,0,0,0,2,0,1,0,0,1,0,2,0,3,1,0,0,0,2,1,2,0,0,4,1,1,0,1,1,0,1,0,2,0,0,1,3,3,0,0,1,1,2,2,0,1,0,1,0,0,0,3,0,1,0,3,0,2,0,2,0,1,2,0,2,1,1,0,0,0,1,3,2,2,0,4,1,1,3,0,0,2,1,0,0,1,0,0,2,0,0,2,1,0,0,1,3,2,0,0,3,1,2,4,3,0,1,0,0,1,2,2,0,0,1,0,1,2,1,0,1,3,2,1,1,3,0,0,1,1,1,1,1,1,0,0,0,3,3,0,0,0,0,1,1,4,2,0,3,1,1,0,2,2,1,1,2,2,0,1,2,3,0,0,1,1,1,0,1,0,0,1,1,0,2,3,1,1,0,2,0,0,1,1,0,2,0,1,2,3,0,2,0,3,3,0,1,0,0,1,1,0,2,1,1,4,2,1,1,2,2,1,0,3,1,0,0,1,0,1,0,0,0,3,0,1,0,2,0,0,0,1,0,3,0,0,2,2,1,1,2,0,2,1,1,0,0,2,1,1,1,0,1,1,3,0,2,0,1,2,1,2,1,1,1,0,1,1,1,0,2,1,1,1,0,0,2,0,0,1,2,0,2,2,1,1,1,1,1,1,0,0,0,0,0,2,1,0,2,1,0,1,0,2,2,1,0,0,1,1,0,1,2,0,2,0,2,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,4,0,0,3,0,1,2,0,0,1,2,1,0,0,1,2,0,0,3,0,1,0,1,1,0,3,1,0,1,1,2,1,1,0,0,0,0,0,0,2,0,1,1,0,1,0,0,0,0,3,2,0,2,2,1,1,0,0,1,0,1,1,0,1,4,2,1,1,1,1,1,1,2,0,0,0,1,1,0,1,1,1,1,2,1,2]},{"counters":[0,1,1,2,2,1,0,1,0,0,1,3,0,0,1,2,0,1,1,2,0,0,2,1,0,0,0,2,2,0,0,0,1,1,1,0,0,3,0,1,1,0,2,0,2,2,2,1,0,0,0,1,1,0,0,0,3,2,0,0,0,0,1,2,1,0,2,1,1,0,1,0,1,0,0,0,1,0,0,2,1,0,2,2,1,3,2,0,1,0,1,0,0,1,0,0,1,0,3,1,1,0,1,1,1,2,0,1,1,0,1,2,4,1,2,0,0,1,2,2,0,1,1,2,0,1,1,6,0,0,0,1,2,0,1,1,2,0,0,0,1,0,2,2,0,0,0,3,1,2,2,1,1,1,2,0,0,0,1,0,4,0,0,0,0,2,0,0,1,2,0,2,2,1,1,0,1,1,2,3,0,1,1,1,0,1,1,1,2,2,2,0,0,3,0,2,0,2,0,0,0,1,1,0,0,0,0,2,1,2,2,4,1,1,0,0,2,1,0,2,0,2,1,0,2,3,0,0,0,1,2,2,1,0,1,0,0,1,0,0,4,1,1,0,4,2,2,1,1,2,0,1,1,0,2,1,1,0,4,1,1,1,1,0,0,0,0,0,2,0,1,0,0,0,0,0,1,1,0,1,0,0,0,1,1,0,0,0,1,0,0,2,1,2,1,0,0,1,1,1,0,0,1,0,2,1,0,1,0,1,3,1,1,1,0,2,0,1,3,1,2,1,0,1,1,1,2,0,1,2,0,1,1,0,1,1,1,1,2,2,2,1,0,1,0,1,2,1,1,2,0,1,1,1,0,0,3,1,1,0,3,2,0,0,1,0,1,1,4,0,2,0,0,0,3,2,0,0,2,0,0,0,0,2,0,0,0,1,3,0,2,1,0,1,1,1,1,1,4,2,1,0,3,1,2,0,0,0,2,0,1,1,0,0,2,0,0,2,1,1,0,0,0,3,1,0,1,2,0,0,0,1,0,0,1,0,2,2,3,0,1,3,1,2,2,2,0,1,0,1,1,0,4,0,2,0,2,1,0,0,2,2,0,3,3,1,2,1,2,0,2,0,2,2,1,2,0,2,0,0,1,0,1,1,2,1,1,5,1,0,1,1,1,2,1,0,0,4,1,1,0,0,0,2,2,2,2,1,0,0,0,2,1,0,1,2,0,1,2,0,2,0,0,1,2,1,2,0,0,0,0,3,4,0,3,0,3,1,3,2,3,1,0,3,0,2,1,2,1,0,2,0,1,3,0,3,3,0,0,1,1,1,1,1,1,2,0,1,0,0,2,0,0,0,2,1,0,0,2,2,3,1,0,2,3,0,1,4,2,3,3,1,3,2,2,2,3,1,0,1,4,1,1,0,0,0,1,3,2,1,2,0,3,2,2,3,0,0,3,0,3,1,1,1,1,0,1,0,0,1,0,0,3,0,1,0,0,0,2,0,3,2,1,1,1,1,0,0,0,2,0,1,1,0,0,0,2,1,0,1,0,1,0,0,3,1,1,1,1,2,0,1,3,1,1,0,5,0,1,2,1,2,0,1,0,3,0,1,0,3,0,0,1,3,1,2,2,5,1,1,1,1,1,2,1,1,2,1,0,1,0,2,1,1,1,4,1,1,0,1,1,0,0,3,1,1,1,2,0,0,1,0,2,2,1,3,0,0,0,1,0,0,0,1,0,2,0,1,3,2,0,2,1,1,3,1,0,1,0,2,2,1,0,0,1,0,2,0,1,1,0,1,1,1,1,0,2,3,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,0,0,0,0,1,0,1,1,2,2,1,0,3,0,3,2,3,2,1,1,2,0,0,2,0,0,1,1,0,2,1,0,1,1,3,2,1,0,0,0,0,1,0,1,0,3,2,1,0,1,2,0,0,1,1,0,1,1,0,0,3,3,1,0,0,0,0,1,2,0,1,0,1,0,0,0,2,0,2,0,0,2,2,2,2,3,2,1,2,1,0,0,1,0,1,1,0,0,0,2,0,1,2,0,0,0,0,1,3,1,1,1,1,0,3,1,0,1,3,1,1,0,1,1,0,3,1,1,0,1,0,3,0,0,1,1,2,0,0,0,0,3,2,2,2,2,1,0,0,0,0,1,0,1,1,0,0,2,0,0,1,1,0,1,1,0,0,0,1,0,1,3,3,2,1,1,2,1,0,0,0,2,1,1,2,0,0,1,0,0,4,1,0,1,3,0,0,0,1,3,1,0,4,0,2,0,2,1,0,1,0,3,1,1,2,3,2,1,0,0,1,1,1,3,0,1,1,1,0,1,0,3,0,1,2,0,2,1,0,0,1,1,3,1,4,2,1,1,3,1,2,0,0,0,1,0,0,1,1,0,1,2,0,1,2,2,0,1,3,0,3,1,0,1,1,1,0,0,1,0,2,1,1,0,1,0,0,0,3,0,1,0,2,0,1,4,0,2,0,3,0,0,0,0,1,2,1,0,0,0,1,0,0,1,0,2,2,2,0,0,1,0,1,1,1,1,1,0,1,3,3,1,0,0,1,1,1,2,1,0,0,0,0,1,1,0,0,1,2,3,1,1,0,2,1,0,2,0,0,1,0,2,0,0,1,1,0,2,0,0,1,0,1,1,0,1,1,0,0,0,0,1,0,0,0,2,1,2,2,0,2,2,0,2,0,1,0,1,2,0,1,0,0,0,1,0,0,0,0,1,3,1,0,1,1,2,0,1,1,0,1,0,2,0,0,0,0,1,1,0,0,3,2,0,0,0,0,1,2,0,0,1,1,1,1,0,1,1,1,0,1,2,0,0,0,0,2,0,0,0,0,1,2,3,1,2,0,3,0,1,1,2,1,3,2,1,1,0,0,0,1,1,0,0,1,0,0,0,1,1,0,1,0,0,2,0,0,0,2,0,1,0,0,0,2,1,0,1,2,1,1,0,1,0,0,4,1,0,1,2,0,0,3,0,0,1,0,2,1,1,2,0,0,1,0,1,4,0,1,2,0,0,2,1,1,0,0,0,1,0,1,2,4,1,0,1,1,3,1,2,0,0,0,0,0,1,2,2,1,0,1,1,0,2,0,2,0,1,2,0,1,0,1,2,1,2,1,2,2,2,0,0,2,3,0,1,2,0,1,1,0,0,0,2,1,1,1,0,3,0,1,2,1,2,0,0,3,0,1,1,2,1,2,0,0,0,1,2,0,1,1,1,0,4,0,2,0,1,2,1,1,0,1,0,2,2,1,3,1,1,1,1,2,1,2,0,0,0,1,1,1,1,0,0,1,1,0,2,1,1,0,2,1,0,2,0,1,0,0,1,0,2,0,3,1,0,2,1,1,0,0,3,1,1,1,1,0,1,0,1,2,1,0,1,1,0,1,0,1,0,0,3,1,1,1,2,3,1,1,1,2,3,2,0,3,1,2,0,1,0,1,6,1,0,0,1,1,1,2,2,1,1,1,1,1,0,2,1,0,2,2,3,2,1,1,2,0,2,0,1,2,2,1,2,3,1,0,1,1,1,1,2,0,0,1,0,2,2,0,1,1,1,1,2,1,1,0,0,1,0,1,3,1,1,0,0,0,0,0,0,2,4,0,1,0,3,0,2,3,2,2,2,0,0,0,1,2,1,1,1,2,0,2,2,0,0,0,0,0,2,0,1,1,0,1,1,2,1,1,2,0,0,0,1,0,0,0,1,2,0,1,1,0,3,0,1,1,1,1,0,0,2,1,1,1,1,2,0,2,1,2,1,1,1,1,1,3,3,1,2,0,2,4,1,2,1,2,2,1,2,1,1,0,4,0,2,1,0,1,2,3,0,2,1,0,2,1,1,0,2,1,1,0,1,2,0,0,2,2,1,0,0,0,1,1,0,2,0,0,0,2,1,0,1,1,0,2,1,0,0,0,2,1,3,2,2,1,0,1,1,0,1,0,0,0,1,0,1,1,1,1,0,2,2,1,1,0,0,2,0,1,1,1,0,2,0,2,1,2,1,0,0,1,0,1,1,0,2,2,1,0,0,1,0,1,1,1,0,0,2,0,2,2,1,1,0,2,1,0,1,1,0,0,0,2,1,2,0,1,2,0,1,0,2,1,1,0,0,1,0,0,2,1,0,1,3,1,0,1,0,1,3,2,2,1,3,0,1,0,2,0,1,0,1,1,2,0,0,1,2,0,1,0,2,1,2,0,0,1,0,1,3,0,1,0,2,0,0,0,1,2,1,1,1,2,0,0,1,1,0,1,2,3,0,0,1,1,0,2,0,0,0,0,0,1,1,1,0,0,1,1,1,0,0,0,1,0,1,0,2,1,1,1,0,1,1,2,1,0,2,0,0,1,1,4,3,1,1,1,0,1,2,1,2,2,4,1,1,1,2,0,1,3,2,2,0,0,4,0,0,0,2,0,1,1,0,2,0,2,0,3,2,0,0,2,0,0,0,1,0,0,0,4,1,3,0,0,3,1,1,0,0,1,1,1,0,2,0,5,0,1,4,1,0,0,1,0,1,1,0,0,1,1,2,1,1,0,2,2,0,0,2,0,2,2,1,2,1,1,0,2,1,0,0,1,0,0,4,1,1,0,0,0,0,0,2,1,3,1,1,4,2,2,2,2]},{"counters":[0,0,1,0,1,3,0,0,1,1,2,0,0,2,3,1,1,1,2,0,1,0,1,1,1,0,2,3,0,3,1,1,1,0,1,0,0,0,2,0,0,1,2,1,0,0,1,1,2,3,1,0,2,1,0,0,1,1,0,1,2,0,1,1,2,1,0,0,0,3,1,2,2,0,1,0,2,1,2,1,0,1,1,1,1,1,1,0,1,3,1,2,2,3,1,1,0,1,3,1,0,1,1,2,1,0,0,0,2,0,0,2,1,1,1,0,2,1,2,0,1,2,0,1,2,1,1,1,2,0,1,2,0,1,1,0,3,2,2,2,1,1,0,1,0,2,0,0,0,0,0,0,2,2,0,2,1,0,0,1,0,1,0,0,0,3,0,0,1,0,0,0,1,1,1,2,0,1,1,2,0,0,0,1,1,1,4,2,2,1,0,1,0,1,0,2,1,2,1,1,0,2,1,6,0,0,0,1,1,0,2,1,1,0,0,3,2,0,1,3,0,1,1,0,0,1,0,0,1,1,1,2,1,0,1,1,3,0,0,1,3,2,2,2,0,1,2,4,1,2,0,2,0,1,1,2,1,1,2,0,1,0,1,1,1,0,2,2,0,2,1,2,2,0,1,2,0,1,0,2,0,2,0,1,1,2,1,1,0,0,0,1,0,0,1,1,1,1,0,0,1,1,2,2,1,1,0,0,0,3,2,2,1,0,0,1,0,1,1,1,2,1,2,1,3,1,1,0,0,0,1,0,0,0,1,1,0,1,2,0,0,0,0,0,4,2,0,1,2,1,3,0,1,0,3,0,2,2,2,1,0,3,1,4,1,4,1,2,1,0,0,0,0,1,1,2,2,0,0,1,0,1,0,0,2,0,2,1,1,1,1,0,0,0,0,2,0,1,0,2,0,0,6,1,1,0,1,1,1,2,1,1,0,3,0,0,2,1,3,0,2,1,1,2,0,1,1,1,1,1,1,1,0,3,0,2,0,2,1,0,1,4,3,0,0,3,1,1,1,1,1,1,1,0,2,0,1,1,0,1,1,0,0,1,1,0,1,0,0,0,0,1,2,1,1,2,2,3,2,0,2,1,1,2,2,1,1,3,2,1,1,1,2,0,1,4,0,0,0,0,1,2,0,1,1,4,0,3,2,1,1,0,3,1,1,0,1,2,0,3,0,1,0,2,2,3,1,0,3,3,1,3,0,1,1,2,2,1,0,1,2,3,2,1,0,0,0,2,1,1,0,2,2,1,0,1,2,2,0,2,3,1,0,1,1,0,1,0,1,3,3,2,0,1,0,0,0,0,1,0,0,0,2,1,3,1,1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,2,1,2,0,0,1,1,0,2,0,1,4,0,1,0,1,1,1,1,0,2,1,0,0,1,0,0,0,2,1,1,0,0,2,1,1,2,0,2,1,2,0,1,1,2,2,0,1,1,3,1,0,1,2,1,0,1,1,3,1,2,2,1,2,1,0,1,1,3,4,0,0,0,2,1,0,0,0,0,1,1,0,1,1,0,0,1,0,1,1,0,2,0,0,0,1,3,1,0,0,1,2,3,1,2,0,1,2,2,0,2,2,1,1,1,1,0,2,1,1,2,0,1,1,3,0,0,1,3,2,0,0,0,2,1,3,1,1,0,1,3,1,0,1,1,0,0,2,0,1,1,1,2,1,0,0,0,0,2,4,2,1,0,2,2,0,1,1,1,0,1,1,2,0,0,1,0,2,1,2,3,1,2,0,0,1,0,3,1,1,0,1,3,3,1,2,0,0,1,1,2,0,1,4,2,1,1,1,1,2,2,0,3,1,0,0,0,0,0,2,4,0,0,5,3,1,0,1,0,2,1,0,1,1,0,1,0,2,1,0,1,0,1,0,3,0,1,0,1,0,1,1,0,2,2,2,1,1,1,0,1,1,0,2,0,0,1,0,1,0,2,0,0,1,1,0,2,0,1,0,0,0,1,0,1,0,1,1,0,1,2,2,1,0,1,1,0,1,1,0,1,3,1,0,1,0,1,1,0,0,0,0,2,1,0,2,0,2,1,0,0,1,0,1,0,2,1,1,0,0,0,1,0,0,0,0,0,0,1,2,1,3,1,0,0,0,1,0,0,0,1,2,2,0,0,0,0,0,0,0,1,0,1,2,0,1,0,0,0,2,1,1,2,0,0,0,1,0,1,0,1,0,0,1,1,0,1,0,2,0,0,0,1,1,1,0,2,2,0,0,2,2,0,1,0,0,3,3,0,0,0,2,3,2,1,1,1,0,1,1,0,6,1,1,3,0,2,1,0,1,0,0,2,1,2,2,1,0,0,1,2,2,1,1,2,1,0,1,2,1,1,2,0,2,0,1,1,2,3,1,0,0,0,0,1,2,2,2,0,1,0,0,1,0,2,1,1,1,0,0,0,0,2,1,0,0,0,1,0,0,1,1,0,3,2,1,1,2,2,0,0,2,0,0,1,0,2,1,1,1,2,0,0,3,0,1,1,0,1,0,2,0,1,1,2,2,1,0,2,0,3,1,0,0,1,0,0,2,1,0,0,0,0,0,2,0,0,3,1,1,0,0,1,1,2,4,0,0,2,0,1,3,1,1,0,0,1,1,1,0,0,1,0,1,1,0,0,3,2,0,1,0,0,0,3,0,0,1,1,1,0,0,1,2,1,3,1,1,2,2,0,1,2,1,1,0,1,1,1,0,0,0,0,1,0,1,2,1,1,1,1,2,1,0,3,2,2,3,0,1,0,2,0,0,0,2,2,0,2,1,0,1,1,1,1,0,0,1,1,1,1,1,0,2,1,2,1,0,1,1,2,1,0,2,1,1,1,1,1,0,2,0,1,1,0,2,2,1,2,2,1,1,1,0,3,4,0,0,0,1,1,1,5,1,1,1,0,3,0,0,1,0,0,1,1,1,0,2,0,0,1,0,0,3,2,3,0,1,0,0,0,2,0,1,1,0,2,2,0,1,1,2,3,1,4,2,2,1,0,1,1,1,0,1,0,2,1,0,1,3,1,2,0,3,1,1,0,1,2,0,1,0,0,1,2,0,1,1,3,1,0,0,0,0,1,2,0,0,2,1,3,2,3,2,1,1,3,1,1,2,1,1,0,0,1,0,2,1,5,1,1,0,2,1,1,0,0,2,0,1,0,3,0,3,1,1,1,3,0,1,1,0,0,0,0,2,0,1,0,0,3,1,0,3,0,2,1,0,0,0,0,0,1,1,0,2,2,0,0,0,2,0,2,1,0,1,2,0,0,0,1,0,1,0,0,0,3,2,3,1,0,0,0,0,2,0,1,0,0,2,1,0,0,0,0,2,0,3,3,0,1,3,4,1,1,0,1,1,0,0,0,0,0,2,2,0,2,0,0,2,0,0,2,0,0,1,1,0,1,1,2,0,2,0,1,2,1,2,1,1,2,2,1,0,2,0,1,1,0,1,1,1,2,3,3,2,1,1,0,0,2,0,0,0,1,0,1,1,2,2,1,1,1,0,1,2,0,2,0,4,0,0,2,0,2,0,2,0,2,1,0,2,2,1,0,0,0,2,1,0,4,0,1,1,1,1,1,1,0,3,0,2,1,0,3,1,0,1,3,1,0,1,1,1,1,2,1,2,0,0,0,0,0,1,2,0,1,5,1,1,1,0,1,0,1,2,0,0,0,2,2,0,0,1,3,1,0,1,1,1,0,0,0,0,0,3,1,0,0,0,0,1,2,2,4,0,2,0,1,0,0,1,2,1,0,0,0,1,2,1,1,2,3,0,0,0,1,1,2,1,0,0,1,1,1,0,2,1,3,1,1,0,1,1,4,1,0,1,0,2,2,0,1,4,1,3,1,0,0,0,0,1,3,1,0,1,3,1,2,1,0,2,1,1,3,0,1,3,3,2,0,2,1,0,2,3,1,1,0,0,0,0,1,0,0,1,1,1,0,1,0,0,1,2,1,0,0,1,0,0,2,1,0,1,1,0,1,0,3,1,1,2,0,0,2,0,0,3,1,1,1,0,0,0,2,0,0,2,0,0,1,0,0,1,2,0,1,2,2,3,1,4,1,1,3,3,1,1,4,1,0,2,0,1,0,1,1,3,0,1,0,1,0,1,1,1,1,1,1,1,0,0,1,2,0,0,0,1,1,1,2,0,2,1,3,2,1,0,1,1,1,1,0,1,0,0,1,0,2,1,2,0,0,3,1,0,1,0,1,2,2,0,2,0,1,1,0,0,2,2,2,0,1,0,2,0,1,1,1,0,1,1,1,4,3,2,0,1,0,1,1,1,0,0,1,0,3,1,3,0,1,0,0,0,2,1,2,2,1,2,3,1,2,0,1,2,2,2,0,1,0,1,0,2,0,1,0,2,0,0,0,0,2,0,1,0,0,1,3,0,1,0,1,0,1,0,0,2,1,0,1,1,0,2,1,0,2,3,1,2,0,0,1,2,1,3,0,1,1,0,0,1,2,0,1,0,2,1,0,1,0,0,1,0,1,1,4,3,0,0,0,0,0,1,0,0,1,1,1,1,0,1,2,1,0,0,1,1,0,2,1,1,0,1,3,1,0,1,2,0,0,1,1,2,0,3,1]},{"counters":[2,3,1,0,1,2,0,0,1,1,1,2,1,0,1,3,1,1,1,2,1,2,0,2,0,1,4,1,0,2,1,0,1,1,1,1,0,2,0,1,0,1,0,1,1,1,0,2,1,0,2,1,1,1,1,0,1,1,0,0,3,1,1,0,1,0,1,0,3,2,0,1,0,1,2,2,0,0,1,1,0,1,0,0,0,2,1,0,0,0,3,0,2,0,1,0,2,0,0,1,0,3,1,1,0,0,1,3,0,2,0,3,3,0,1,1,1,0,1,2,0,1,1,0,0,1,1,1,1,0,2,1,2,1,0,0,0,1,0,2,3,0,2,1,0,3,0,1,0,2,1,2,0,2,1,0,2,0,2,1,1,1,0,0,0,0,1,0,1,0,2,1,0,0,0,0,1,1,4,2,3,1,1,2,0,1,0,0,0,0,1,4,1,1,2,0,0,1,2,0,3,0,0,1,1,1,2,0,3,3,0,1,0,0,0,1,0,0,2,2,0,2,3,1,1,1,0,1,1,0,1,0,1,0,2,1,0,2,1,1,0,1,0,2,0,2,1,0,0,1,0,1,2,1,0,0,0,0,0,1,2,1,2,0,0,1,2,0,1,1,1,0,0,1,0,0,0,2,1,0,0,0,0,0,0,1,2,1,2,1,0,0,0,0,1,0,0,2,1,0,0,1,2,2,2,1,3,1,3,1,0,0,1,0,0,0,0,5,1,1,1,1,3,1,0,0,3,0,0,2,1,2,0,0,0,1,0,0,1,1,1,0,2,1,1,0,0,1,1,0,0,0,0,0,1,2,2,1,1,0,2,0,1,0,1,0,0,1,2,0,3,0,2,0,1,1,2,0,1,4,2,0,0,3,1,1,0,1,1,3,1,3,0,2,2,1,2,2,0,1,1,1,1,2,0,0,1,0,2,2,1,0,0,1,1,0,2,1,1,0,1,2,0,2,2,0,0,2,0,0,0,2,1,1,1,0,3,0,1,3,0,3,1,1,2,1,1,2,0,0,1,1,3,2,0,2,1,0,2,2,1,2,0,1,2,1,3,0,1,2,1,0,3,0,0,2,1,3,3,0,1,1,0,0,0,3,0,1,0,2,2,0,4,1,4,0,1,1,0,0,5,1,0,1,0,1,0,1,0,1,0,0,3,1,1,0,2,0,3,0,1,0,0,2,0,0,0,1,2,0,2,0,0,2,0,3,3,1,0,0,1,1,0,2,0,2,0,1,1,2,0,0,1,1,1,1,1,1,3,1,0,0,0,1,0,1,3,1,1,2,0,0,2,0,2,2,2,1,2,2,1,0,1,2,1,2,2,1,0,0,1,0,1,0,0,1,1,1,0,0,2,1,0,0,1,2,2,1,1,0,3,1,1,1,0,0,1,2,0,0,1,4,3,0,0,0,3,0,2,0,0,3,1,1,2,3,1,0,5,0,2,3,0,0,1,0,0,0,0,0,2,0,0,2,2,2,1,2,0,0,0,0,0,0,1,3,1,1,0,2,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,2,4,1,0,1,1,1,1,1,2,0,2,2,1,0,2,0,1,1,0,2,2,0,0,1,0,0,4,2,0,0,1,0,2,1,1,1,1,0,2,0,2,0,0,0,0,1,1,2,0,0,3,1,0,0,0,1,0,1,1,1,0,0,2,0,0,1,0,1,1,1,0,0,1,2,2,1,1,3,2,3,0,1,1,0,2,1,1,1,3,2,1,3,1,1,1,3,1,1,0,0,0,2,1,0,1,1,2,1,0,0,1,2,3,3,1,0,1,3,3,1,0,0,2,1,1,2,1,1,1,0,2,1,0,2,0,1,0,2,0,1,0,0,0,1,1,2,0,3,1,0,0,2,3,1,2,2,1,0,1,1,0,3,1,1,0,2,0,1,0,0,1,0,0,1,0,0,0,0,1,0,1,2,1,0,0,1,1,2,0,1,0,1,2,1,3,1,0,2,0,1,0,0,1,0,1,2,1,2,1,3,1,2,1,1,0,1,2,0,0,0,0,2,1,2,1,1,0,1,1,0,1,0,1,0,2,1,1,0,0,0,1,1,0,2,0,1,0,1,4,1,2,0,1,1,0,4,0,2,3,1,0,0,0,1,2,4,2,0,1,0,0,2,2,1,0,0,2,2,2,1,3,0,1,0,0,0,1,1,1,1,1,1,2,0,0,1,1,0,0,0,2,1,2,3,1,0,2,3,0,2,0,1,0,1,1,1,0,1,2,1,0,0,2,1,0,0,2,1,0,0,2,0,1,3,1,0,2,1,0,0,0,2,0,0,0,0,2,0,2,1,0,2,0,1,1,0,4,0,0,2,1,2,1,0,1,1,1,1,1,1,1,1,0,0,1,0,2,0,2,2,1,2,0,1,2,0,1,1,1,1,0,0,2,1,1,1,1,1,0,0,0,0,1,1,2,1,1,0,5,1,3,1,2,1,1,1,0,0,0,1,2,3,0,1,1,0,3,0,0,0,1,0,1,0,2,2,3,0,1,2,0,2,1,0,2,1,1,3,1,0,1,1,0,0,1,2,1,1,0,0,2,0,4,1,1,2,0,3,0,1,0,0,0,1,2,2,3,1,4,0,2,2,2,0,3,3,1,3,2,1,0,1,0,0,1,0,1,0,1,0,3,0,2,1,3,0,1,1,0,1,1,0,0,1,0,0,1,1,2,1,4,1,0,0,0,3,0,2,1,2,1,0,2,1,1,3,1,3,1,1,1,1,2,1,0,0,1,0,0,2,2,0,1,1,0,1,0,2,0,0,0,1,1,2,0,1,0,1,0,1,2,1,0,1,3,3,2,0,0,1,1,1,1,2,0,1,0,0,1,2,2,3,1,1,1,2,2,0,4,0,2,1,0,1,0,2,0,0,0,0,1,2,1,1,0,2,3,1,1,1,0,1,1,1,1,1,0,1,3,1,2,2,0,0,1,1,2,1,2,3,2,0,0,0,0,0,2,0,2,3,0,1,2,1,1,2,0,5,2,0,1,1,2,0,1,1,2,1,1,1,0,0,2,1,1,1,2,1,2,0,0,0,1,0,0,2,2,1,0,0,3,2,1,0,1,1,3,1,2,0,2,2,0,1,1,2,0,1,1,0,0,1,0,0,3,0,1,4,3,1,3,1,2,2,0,2,1,0,0,2,1,0,2,2,0,0,1,1,1,0,0,2,2,2,0,0,2,0,1,0,0,2,0,1,0,2,1,1,0,0,1,0,1,0,1,1,0,2,0,2,3,0,1,0,2,3,0,0,0,2,0,0,1,0,2,0,0,0,1,1,1,1,2,0,3,1,1,2,2,3,1,0,0,2,3,1,1,1,1,0,1,0,1,0,1,0,0,1,0,1,1,0,3,2,2,1,1,1,1,1,1,2,0,1,2,1,1,1,0,0,3,1,0,1,1,1,2,2,2,2,0,0,1,4,2,1,0,1,0,1,1,4,3,1,1,0,0,1,1,1,0,1,0,1,1,2,1,0,0,0,1,2,2,0,0,1,0,1,1,0,1,0,0,0,1,0,0,0,2,1,1,2,0,2,0,0,0,1,3,2,0,1,1,2,0,1,1,0,0,0,1,1,2,2,2,0,0,0,0,2,1,3,1,0,3,1,0,1,2,1,2,1,0,0,2,1,0,1,2,2,1,0,0,0,1,0,2,1,1,1,1,0,2,1,1,1,1,0,1,0,0,3,1,2,0,1,0,3,0,2,4,2,1,0,0,1,1,1,0,1,0,3,1,0,1,0,2,2,0,3,1,1,0,2,2,3,0,0,1,1,3,0,3,0,3,3,1,0,2,0,1,1,1,1,2,1,2,0,0,1,1,1,2,1,2,0,0,1,1,0,2,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,2,1,2,3,1,3,1,1,0,1,1,0,1,0,0,1,1,1,0,1,0,0,0,3,1,1,0,0,1,1,1,1,0,0,1,2,2,3,2,1,1,0,0,0,0,0,2,1,1,1,3,1,1,2,4,0,3,0,1,2,1,0,1,0,1,0,1,1,1,0,0,0,1,2,0,1,2,1,3,0,1,0,2,1,1,2,1,0,1,0,2,1,0,1,1,3,0,0,0,0,1,2,1,4,0,2,1,4,3,2,0,1,3,0,1,4,1,1,1,0,1,0,0,2,1,0,0,0,4,0,0,0,1,1,0,1,0,1,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,0,2,2,0,0,2,2,1,0,0,2,2,1,2,1,1,2,1,1,2,1,1,3,0,1,0,0,0,2,0,1,0,3,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,0,1,2,1,3,0,0,1,1,0,0,0,1,2,2,1,0,1,1,0,1,2,2,1,1,0,0,1,0,0,0,0,0,2,1,0,1,1,0,1,0,1,2,1,0,1,0,0,1,2,1,2,1,0,3,0,2,3,2,4,2,1,1,1,1,1,2,0,1,0,0,1,0,0,1,2,1,1,0,2,3,1,0,1,1,0,0,0,2,1,1,0,1,1,1,1,1,0,1]},{"counters":[0,1,0,0,2,0,0,0,1,1,0,1,1,0,0,0,1,1,0,2,1,2,0,2,2,2,0,0,1,2,1,1,0,1,1,1,0,0,0,2,2,0,3,0,1,2,0,0,1,0,1,1,0,1,0,0,1,0,0,2,2,2,3,1,0,0,0,0,2,1,3,0,3,3,3,2,1,3,0,0,3,1,0,3,0,0,0,1,1,1,0,0,1,1,0,0,1,2,3,0,0,2,2,2,0,2,0,0,0,0,1,1,3,2,3,1,2,2,0,3,1,1,0,1,0,1,0,0,1,3,1,3,1,0,0,0,2,1,0,1,0,0,0,1,1,3,0,2,0,1,0,0,1,2,3,0,0,2,0,2,0,1,0,1,0,0,1,1,2,0,1,4,1,2,0,0,4,3,0,2,1,1,0,2,0,1,1,1,4,0,1,1,0,0,1,1,0,0,2,0,1,0,0,2,0,2,1,0,2,0,1,0,0,2,2,1,2,2,3,2,0,1,0,0,1,0,0,0,3,1,2,2,1,2,3,1,2,1,1,1,0,1,0,1,1,0,2,3,0,2,0,0,0,2,1,1,0,2,0,2,2,4,1,0,1,2,1,1,2,0,1,2,1,3,2,3,1,2,2,0,3,5,1,1,0,0,0,1,1,0,0,1,0,1,3,0,1,0,2,1,0,0,2,0,0,0,1,1,1,0,2,0,1,0,2,1,2,0,2,1,1,0,2,2,1,1,0,1,0,0,0,0,1,4,1,1,1,3,0,0,1,1,2,0,1,2,2,1,0,1,1,3,1,1,0,1,0,0,2,3,0,1,0,2,2,3,0,3,0,1,2,1,2,1,0,2,2,1,1,0,2,1,1,1,1,3,2,0,2,0,1,1,1,2,1,0,0,0,0,0,0,0,1,1,1,3,1,0,0,1,0,0,0,0,0,0,1,0,1,1,1,0,1,1,2,1,1,2,0,1,2,1,0,2,0,2,2,1,0,1,0,3,1,1,0,2,0,0,2,1,2,2,2,0,3,1,1,0,1,1,1,2,1,0,0,2,0,1,3,0,2,0,0,1,0,2,1,3,2,2,1,1,1,1,1,2,1,2,0,0,1,0,0,0,2,1,0,2,3,1,0,2,1,1,2,0,1,1,1,1,0,3,0,0,2,1,1,1,0,2,0,1,2,0,0,0,0,0,0,2,1,3,1,2,1,1,1,1,1,1,0,1,2,0,0,0,2,1,1,1,0,2,0,1,1,0,1,2,0,0,3,2,0,3,3,1,1,1,1,1,0,1,0,0,1,2,0,1,1,0,1,2,3,0,1,0,3,2,1,2,0,4,0,1,0,2,1,2,2,0,1,0,0,1,1,0,1,2,1,1,0,1,1,1,0,1,0,1,0,1,0,0,5,1,0,2,1,0,1,0,3,1,0,1,1,6,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,2,1,1,1,2,0,0,0,1,1,0,1,0,0,1,3,2,1,0,1,0,2,0,0,2,1,1,1,1,0,1,2,0,1,1,0,3,5,2,1,1,2,1,0,1,1,2,3,1,0,0,1,1,1,0,2,2,1,3,0,0,1,0,3,0,1,1,1,0,1,1,0,1,1,0,0,1,1,0,0,1,2,0,1,0,0,0,1,2,1,1,0,1,0,2,0,3,0,1,0,0,2,1,2,0,2,3,2,3,3,0,0,2,1,0,2,2,0,1,0,1,0,1,3,0,0,0,1,0,1,0,1,0,1,1,2,1,4,0,0,2,0,1,1,2,0,1,2,2,1,3,4,2,1,1,0,1,0,0,2,1,2,0,0,1,0,1,1,2,1,1,0,0,1,0,3,2,0,1,1,1,2,0,0,0,1,0,1,1,3,2,0,0,0,1,1,1,0,3,2,0,2,1,1,0,1,1,1,0,1,1,2,1,0,3,0,1,2,2,0,1,2,1,0,3,0,1,0,1,0,1,2,1,1,0,0,1,4,3,1,2,1,1,0,1,0,4,1,0,1,1,2,0,2,2,0,5,3,1,0,0,1,0,0,0,2,0,0,0,2,1,1,0,1,0,0,1,0,0,0,2,2,2,2,2,1,1,1,1,2,1,2,2,0,2,1,2,2,3,2,2,1,1,0,1,1,2,2,1,0,0,1,2,1,1,1,1,3,2,0,0,1,2,2,2,2,1,0,0,2,0,0,1,2,4,2,3,0,2,1,3,0,2,2,0,3,2,2,1,0,1,0,0,0,0,0,0,1,0,1,1,0,2,1,1,1,0,2,2,1,1,0,0,2,1,3,0,1,1,2,2,0,0,0,0,3,1,0,0,1,0,0,0,1,1,2,0,2,0,1,1,1,2,1,0,1,1,0,1,0,0,1,0,0,0,2,1,1,1,1,2,0,0,2,3,1,2,1,1,1,1,2,0,2,1,1,2,0,1,3,0,1,2,2,1,0,0,0,1,3,0,1,0,0,2,1,0,2,1,1,3,0,2,0,3,2,2,1,2,1,1,2,1,1,0,0,0,2,0,3,2,0,2,1,0,0,1,0,2,2,0,0,0,0,1,1,2,0,1,1,1,1,0,0,1,0,1,0,1,2,0,0,4,0,1,0,0,0,1,0,1,1,2,1,0,1,3,1,4,0,2,0,1,1,2,5,0,1,0,0,2,4,1,0,1,1,0,1,1,0,2,0,0,0,1,1,1,0,2,0,2,0,0,1,1,3,0,0,0,1,0,0,1,0,0,2,1,1,0,0,0,1,2,1,1,2,1,0,1,3,4,2,1,2,3,1,0,2,0,1,1,1,2,0,1,3,2,1,2,2,1,2,0,1,0,0,1,1,0,2,1,2,3,0,1,0,0,1,0,1,2,0,2,1,0,1,0,1,1,0,0,1,0,1,2,2,1,0,0,0,0,2,0,0,2,1,0,2,0,1,0,0,1,1,1,0,0,2,2,1,0,2,0,1,1,0,3,0,1,0,0,1,0,4,0,0,1,0,1,0,0,0,4,1,2,1,1,0,1,1,1,1,2,0,2,0,1,1,1,3,0,1,0,0,1,0,0,2,1,1,4,0,2,1,0,0,3,0,0,1,1,1,2,0,0,2,0,0,0,2,0,1,2,1,0,0,1,1,0,0,0,1,1,1,2,1,1,2,1,0,1,0,1,0,0,3,3,1,0,3,0,2,2,1,0,0,2,1,0,0,0,0,1,3,2,0,1,2,2,1,0,2,2,1,1,0,1,0,0,0,1,1,1,2,0,0,0,2,1,0,2,1,2,1,0,0,0,0,2,1,0,1,0,1,0,1,0,3,2,0,0,1,0,0,1,1,1,1,3,1,0,0,3,0,0,0,0,2,1,0,1,0,0,0,0,2,2,1,1,1,2,3,1,1,0,2,2,0,2,0,0,0,1,1,5,0,3,1,0,0,1,1,0,3,0,1,0,1,0,1,1,2,0,0,0,3,0,1,3,0,0,0,1,2,3,1,1,0,1,0,0,3,2,1,0,1,0,1,0,2,3,0,2,1,2,0,0,1,3,2,0,1,1,0,1,2,0,0,1,1,2,0,1,3,2,0,2,2,0,1,1,2,1,0,1,1,1,2,4,0,0,1,1,1,2,1,1,1,1,2,3,1,0,2,0,0,2,0,0,0,0,1,1,0,0,0,1,0,1,1,1,1,1,0,3,0,0,0,2,0,1,0,1,0,0,0,0,1,2,1,1,1,3,1,0,1,3,1,0,0,2,1,0,0,1,0,0,1,0,2,0,1,1,2,1,1,1,1,1,1,1,1,2,2,0,1,0,3,1,1,0,1,1,1,0,1,0,0,0,2,0,3,2,1,0,2,0,2,1,0,3,0,1,0,2,3,0,0,0,3,0,0,0,0,2,0,2,0,2,1,1,1,0,2,0,1,0,2,0,1,0,2,2,0,2,1,3,2,1,2,0,4,1,0,3,0,0,0,1,2,1,0,1,1,0,2,2,1,0,0,1,1,1,1,1,2,1,1,2,0,2,1,0,1,0,1,1,1,0,0,1,2,3,2,1,0,1,1,2,4,0,0,3,0,1,0,2,0,0,3,1,0,1,0,1,0,1,1,0,0,1,1,0,0,2,0,1,2,0,2,1,1,1,0,0,0,0,0,3,0,0,0,2,0,0,1,0,1,3,1,0,1,1,4,0,4,2,1,0,2,1,0,1,1,1,2,0,3,3,0,1,1,0,3,0,0,0,1,0,0,0,1,1,1,3,2,2,0,1,0,0,2,0,1,2,1,1,3,1,1,2,0,4,2,2,2,0,0,0,2,1,2,0,0,1,1,1,1,2,0,2,2,3,0,0,2,1,0,0,0,0,1,0,1,1,0,0,1,1,0,0,1,0,1,1,0,1,0,3,1,1,1,1,0,0,1,1,1,2,1,0,1,1,2,0,1,0,0,1,2,1,0,0,0,0,1,0,1,1,0,2,0,1,1,1,0,2,0,0,1,1,1,1,0,1,1,0,1,1,1,2,0,0,1,0,0,0,0,1,2,0,0,1,0,0,2,2,1,0,0,1,2,0,0,3,1,2,1,0,3,1,2,0,0,1,0,2]}]},"null_count":0,"last_update_version":397952047068741632},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxMzg3MTY3NTE=","upper_bound":"LTIxMjI2MjgwMjk=","repeats":1},{"count":16,"lower_bound":"LTIxMjI1NDgxNTk=","upper_bound":"LTIxMDQxNDA1MTU=","repeats":1},{"count":24,"lower_bound":"LTIwOTkwNTYyNjM=","upper_bound":"LTIwODA1ODI4MTk=","repeats":1},{"count":32,"lower_bound":"LTIwNzcxNDQxNzk=","upper_bound":"LTIwNjY5MDIyMTQ=","repeats":1},{"count":40,"lower_bound":"LTIwNjY3ODEyMTk=","upper_bound":"LTIwNTIwOTk0MDU=","repeats":1},{"count":48,"lower_bound":"LTIwNDcyNDg3NTE=","upper_bound":"LTIwMzY0NTcyMjQ=","repeats":1},{"count":56,"lower_bound":"LTIwMzE3ODI0NjQ=","upper_bound":"LTIwMTYyNjUwMTM=","repeats":1},{"count":64,"lower_bound":"LTIwMTUxMzg5NjU=","upper_bound":"LTE5OTk2NjAyMDg=","repeats":1},{"count":72,"lower_bound":"LTE5OTQwOTgyMzg=","upper_bound":"LTE5ODY3NDQ0MjQ=","repeats":1},{"count":80,"lower_bound":"LTE5ODQyNTI2MDk=","upper_bound":"LTE5NzAyNDI1ODI=","repeats":1},{"count":88,"lower_bound":"LTE5Njk0NzU2NjI=","upper_bound":"LTE5NTM2NjIxMzY=","repeats":1},{"count":96,"lower_bound":"LTE5NTEzNjA4MDg=","upper_bound":"LTE5Mzc0MDc0OTQ=","repeats":1},{"count":104,"lower_bound":"LTE5MzcxODU5NDQ=","upper_bound":"LTE5MjY5NjYyNjg=","repeats":1},{"count":112,"lower_bound":"LTE5MjQ0MDE1MDg=","upper_bound":"LTE5MTE4OTU1OTI=","repeats":1},{"count":120,"lower_bound":"LTE5MDgxMTI4NTc=","upper_bound":"LTE5MDI2ODU2MjI=","repeats":1},{"count":128,"lower_bound":"LTE5MDEyNTA3ODQ=","upper_bound":"LTE4ODMxOTI4OTg=","repeats":1},{"count":136,"lower_bound":"LTE4NzYxMDc0Njk=","upper_bound":"LTE4NjY0MTM3OTM=","repeats":1},{"count":144,"lower_bound":"LTE4NjE0ODMwNTU=","upper_bound":"LTE4NTE0MDA0MTE=","repeats":1},{"count":152,"lower_bound":"LTE4NTAyMTI4NDM=","upper_bound":"LTE4NDE3NTk5OTU=","repeats":1},{"count":160,"lower_bound":"LTE4NDEwMTY1NzE=","upper_bound":"LTE4MTU5MzgwODM=","repeats":1},{"count":168,"lower_bound":"LTE4MDQ3MjkwNzE=","upper_bound":"LTE3Nzg3MzYyNDg=","repeats":1},{"count":176,"lower_bound":"LTE3NzgyMTA3NTA=","upper_bound":"LTE3NTQ5OTExMDM=","repeats":1},{"count":184,"lower_bound":"LTE3NTAyOTY1MDY=","upper_bound":"LTE3NDI0ODc1MjU=","repeats":1},{"count":192,"lower_bound":"LTE3Mzk3NzcwNTQ=","upper_bound":"LTE3MzU2MzAzMTQ=","repeats":1},{"count":200,"lower_bound":"LTE3MzUxMzk2NDg=","upper_bound":"LTE3MzI5MzY3MjE=","repeats":1},{"count":208,"lower_bound":"LTE3MzA5Nzg3MzA=","upper_bound":"LTE3MjIzOTkzNTk=","repeats":1},{"count":216,"lower_bound":"LTE3MTMzNjc0OTQ=","upper_bound":"LTE2ODY0MDA5ODU=","repeats":1},{"count":224,"lower_bound":"LTE2ODU5MDM1MDE=","upper_bound":"LTE2NzI1NjQ1MDQ=","repeats":1},{"count":232,"lower_bound":"LTE2NjM2NjgxMzc=","upper_bound":"LTE2NTM1ODE4NTI=","repeats":1},{"count":240,"lower_bound":"LTE2NDA2OTExNDI=","upper_bound":"LTE2MzE2NjE1MTk=","repeats":1},{"count":248,"lower_bound":"LTE2MjQxNTM3NjA=","upper_bound":"LTE2MDYzMDk0MDU=","repeats":1},{"count":256,"lower_bound":"LTE1OTkwNzAyNzE=","upper_bound":"LTE1OTE4NTA2OTk=","repeats":1},{"count":264,"lower_bound":"LTE1OTE2NTA2NDI=","upper_bound":"LTE1ODQxMjYxNDA=","repeats":1},{"count":272,"lower_bound":"LTE1ODIxNTg4MzE=","upper_bound":"LTE1NTkyMzc3MzY=","repeats":1},{"count":280,"lower_bound":"LTE1NTgwNDUyNjQ=","upper_bound":"LTE1NDU5MjkzMDY=","repeats":1},{"count":288,"lower_bound":"LTE1NDQ4OTI4ODc=","upper_bound":"LTE1MzEwMTE4NjQ=","repeats":1},{"count":296,"lower_bound":"LTE1MjkzNzQ2MTc=","upper_bound":"LTE1MTA2OTM0NTQ=","repeats":1},{"count":304,"lower_bound":"LTE1MDY1ODMyNTc=","upper_bound":"LTE0OTUwMDQ3NDU=","repeats":1},{"count":312,"lower_bound":"LTE0ODgyNTQwMzk=","upper_bound":"LTE0ODIzNjc0NTk=","repeats":1},{"count":320,"lower_bound":"LTE0NzA5MTgyNDQ=","upper_bound":"LTE0NjA0NTcwMjU=","repeats":1},{"count":328,"lower_bound":"LTE0NTc1MTI0NDA=","upper_bound":"LTE0NDE1ODEzNDk=","repeats":1},{"count":336,"lower_bound":"LTE0NDEzODM0ODE=","upper_bound":"LTE0MzkxMzA1OTU=","repeats":1},{"count":344,"lower_bound":"LTE0MzkxMDI5NzM=","upper_bound":"LTE0MzEwNzc0NTk=","repeats":1},{"count":352,"lower_bound":"LTE0MjU5MjExMTM=","upper_bound":"LTE0MTgyMDk0ODQ=","repeats":1},{"count":360,"lower_bound":"LTE0MTY2Mzg2NjY=","upper_bound":"LTE0MTE5MTE2NDE=","repeats":1},{"count":368,"lower_bound":"LTE0MDE3MzcwMjE=","upper_bound":"LTEzOTI4MjQ1Nzg=","repeats":1},{"count":376,"lower_bound":"LTEzOTE2NDExODM=","upper_bound":"LTEzNzgyMjc5MzI=","repeats":1},{"count":384,"lower_bound":"LTEzNjg4NzQ3MzU=","upper_bound":"LTEzNTc3NzIwNDg=","repeats":1},{"count":392,"lower_bound":"LTEzMzc5OTczMzI=","upper_bound":"LTEzMjg2NTc3NjA=","repeats":1},{"count":400,"lower_bound":"LTEzMjY4MjM4MTY=","upper_bound":"LTEzMjExMzM0OTM=","repeats":1},{"count":408,"lower_bound":"LTEzMTU3MjUzMjM=","upper_bound":"LTEzMDE2MTI1ODI=","repeats":1},{"count":416,"lower_bound":"LTEzMDE0NTc5MTY=","upper_bound":"LTEyODc3NDI1MTA=","repeats":1},{"count":424,"lower_bound":"LTEyODEyNzMwNzE=","upper_bound":"LTEyNzQ4MjQ3MTU=","repeats":1},{"count":432,"lower_bound":"LTEyNzQyMTQ1MjA=","upper_bound":"LTEyNjU1NDMxMDE=","repeats":1},{"count":440,"lower_bound":"LTEyNTYxMDI0ODg=","upper_bound":"LTEyMzMxNDU5NTU=","repeats":1},{"count":448,"lower_bound":"LTEyMzI5NzExNjg=","upper_bound":"LTEyMTI2MjE1NTQ=","repeats":1},{"count":456,"lower_bound":"LTEyMTE4NTY2Nzg=","upper_bound":"LTEyMDE2MDEyMDY=","repeats":1},{"count":464,"lower_bound":"LTExOTUzMTM3NDc=","upper_bound":"LTExODk2NjQ0NDQ=","repeats":1},{"count":472,"lower_bound":"LTExODg5NTEyMTc=","upper_bound":"LTExNzgxMzU0NTI=","repeats":1},{"count":480,"lower_bound":"LTExNzY4Mzc0MTU=","upper_bound":"LTExNjY3MjU2NTM=","repeats":1},{"count":488,"lower_bound":"LTExNTI3ODcxNDU=","upper_bound":"LTExMzU0ODAxODU=","repeats":1},{"count":496,"lower_bound":"LTExMjcyNTQ3MjQ=","upper_bound":"LTExMjQwNjU2MjM=","repeats":1},{"count":504,"lower_bound":"LTExMDgyMjc3MTE=","upper_bound":"LTEwOTk1MjI1MzE=","repeats":1},{"count":512,"lower_bound":"LTEwOTY1MjE4MTA=","upper_bound":"LTEwNzY2MDcxNDM=","repeats":1},{"count":520,"lower_bound":"LTEwNzA5MzI3ODg=","upper_bound":"LTEwMzk5MzMwNTA=","repeats":1},{"count":528,"lower_bound":"LTEwMzI1MzA1OTE=","upper_bound":"LTEwMjM1OTM4Njc=","repeats":1},{"count":536,"lower_bound":"LTEwMjMxOTU4NTc=","upper_bound":"LTEwMDczNzg3NjQ=","repeats":1},{"count":544,"lower_bound":"LTk5ODM4ODAzNA==","upper_bound":"LTk4NjM4MzYxNA==","repeats":1},{"count":552,"lower_bound":"LTk4MTM1MTk0MA==","upper_bound":"LTk3ODYxMzk2MQ==","repeats":1},{"count":560,"lower_bound":"LTk2MjYwMDc0OQ==","upper_bound":"LTk1MDY4Nzk4NA==","repeats":1},{"count":568,"lower_bound":"LTk0MzMxOTU2OA==","upper_bound":"LTkyODE0MzA2OQ==","repeats":1},{"count":576,"lower_bound":"LTkyNzE5ODA4Ng==","upper_bound":"LTg5NDIxNDE5NQ==","repeats":1},{"count":584,"lower_bound":"LTg4NDE5MzI3Mg==","upper_bound":"LTg2NTI4MDE0Mg==","repeats":1},{"count":592,"lower_bound":"LTg2MDEwNDQ3NA==","upper_bound":"LTg0NDc2MjY4MA==","repeats":1},{"count":600,"lower_bound":"LTgzNzI4ODkwMA==","upper_bound":"LTgyNjI0OTg2OA==","repeats":1},{"count":608,"lower_bound":"LTgwOTE0NzM4NQ==","upper_bound":"LTc4NTAzOTMzOQ==","repeats":1},{"count":616,"lower_bound":"LTc4MzgzODI0MQ==","upper_bound":"LTc3NjkwMjQ4MA==","repeats":1},{"count":624,"lower_bound":"LTc3MjA5MzQ4NQ==","upper_bound":"LTc2NTQ2NTEwOA==","repeats":1},{"count":632,"lower_bound":"LTc1NjY2ODc2Nw==","upper_bound":"LTc0NDY3NjcxMQ==","repeats":1},{"count":640,"lower_bound":"LTczOTM3NDMyMA==","upper_bound":"LTczNTMxMTcyOA==","repeats":1},{"count":648,"lower_bound":"LTczMzgxMjEwOA==","upper_bound":"LTcyMDA2Mzg5MQ==","repeats":1},{"count":656,"lower_bound":"LTcxOTc3NDU4NA==","upper_bound":"LTcxMzQzNDQ2Ng==","repeats":1},{"count":664,"lower_bound":"LTcwOTk0MzQ1Mw==","upper_bound":"LTcwNDEwMzIzOA==","repeats":1},{"count":672,"lower_bound":"LTcwMjQ1NDAyNg==","upper_bound":"LTcwMDkwMDgzNA==","repeats":1},{"count":680,"lower_bound":"LTY5NjY2NTA3MA==","upper_bound":"LTY3MzY4MzI5Nw==","repeats":1},{"count":688,"lower_bound":"LTY2NjQ4MTk0MQ==","upper_bound":"LTYzNjIwMjU3NA==","repeats":1},{"count":696,"lower_bound":"LTYzNTYzMjI0OA==","upper_bound":"LTYwNzIzNDEwOA==","repeats":1},{"count":704,"lower_bound":"LTYwMTU5MjM1MQ==","upper_bound":"LTU5Mzg1MjU5MA==","repeats":1},{"count":712,"lower_bound":"LTU4ODAyOTk0Ng==","upper_bound":"LTU3OTg0NTkzMQ==","repeats":1},{"count":720,"lower_bound":"LTU3Nzk0NTc1OA==","upper_bound":"LTU3Mjk2OTk5Mg==","repeats":1},{"count":728,"lower_bound":"LTU2NzI1NTAxMg==","upper_bound":"LTU0Njc5NjA4NQ==","repeats":1},{"count":736,"lower_bound":"LTUzOTQ3OTA4NA==","upper_bound":"LTUxNjUwNzEyMw==","repeats":1},{"count":744,"lower_bound":"LTUxMzg4ODU3MA==","upper_bound":"LTUwNzc5NTY2NA==","repeats":1},{"count":752,"lower_bound":"LTUwNTQ2ODczNQ==","upper_bound":"LTQ5ODU1NDY3NQ==","repeats":1},{"count":760,"lower_bound":"LTQ4NDMwODcwOA==","upper_bound":"LTQ2MjA4OTk3Ng==","repeats":1},{"count":768,"lower_bound":"LTQ2MTgxMTA0NA==","upper_bound":"LTQ1MTIwMjE0Nw==","repeats":1},{"count":776,"lower_bound":"LTQ0NzU2NDM4Mw==","upper_bound":"LTQzMzg0MjE2OQ==","repeats":1},{"count":784,"lower_bound":"LTQzMzc4MTUxMQ==","upper_bound":"LTQyODc2NjI0MA==","repeats":1},{"count":792,"lower_bound":"LTQyMzgwOTM1NQ==","upper_bound":"LTQwOTIyNzQ2Mg==","repeats":1},{"count":800,"lower_bound":"LTM5MzAyMTkyMA==","upper_bound":"LTM4MTg4MDA3OQ==","repeats":1},{"count":808,"lower_bound":"LTM2MTg1NzEwMg==","upper_bound":"LTM1NTk1NzQ2OQ==","repeats":1},{"count":816,"lower_bound":"LTM0OTQzMjYxNA==","upper_bound":"LTM0MTI4MDc3NA==","repeats":1},{"count":824,"lower_bound":"LTM0MDM4NTU5Mg==","upper_bound":"LTMzNTIwODMxMQ==","repeats":1},{"count":832,"lower_bound":"LTMzMTA3NDM1Mw==","upper_bound":"LTMxNjE2MTQ2Mg==","repeats":1},{"count":840,"lower_bound":"LTMxNTE3NTk4NQ==","upper_bound":"LTMwNTc1NTU0OA==","repeats":1},{"count":848,"lower_bound":"LTMwNTQ3NzA2Mg==","upper_bound":"LTI5MDc3OTA3NQ==","repeats":1},{"count":856,"lower_bound":"LTI5MDcyNTY1Ng==","upper_bound":"LTI4NzcwMjAxNw==","repeats":1},{"count":864,"lower_bound":"LTI3ODQxNjQ4MA==","upper_bound":"LTI3MDQ1NTA5NA==","repeats":1},{"count":872,"lower_bound":"LTI2NzcyODUyNQ==","upper_bound":"LTI0NDEwODk5NQ==","repeats":1},{"count":880,"lower_bound":"LTI0MDcyMzM3Nw==","upper_bound":"LTIzODU2OTU5OA==","repeats":1},{"count":888,"lower_bound":"LTIzMzEzMTkwMQ==","upper_bound":"LTIyMTQ1Nzk3MQ==","repeats":1},{"count":896,"lower_bound":"LTE5NjY3ODU5Nw==","upper_bound":"LTE4MTI1MzI0MA==","repeats":1},{"count":904,"lower_bound":"LTE3NTE3MDcyNA==","upper_bound":"LTE2NTA4MDU0MQ==","repeats":1},{"count":912,"lower_bound":"LTE1NDE5NjA4NA==","upper_bound":"LTE0OTQzMjcxNg==","repeats":1},{"count":920,"lower_bound":"LTE0ODkzMjY2Nw==","upper_bound":"LTEzMjczMTE5NA==","repeats":1},{"count":928,"lower_bound":"LTEzMDU4NjY4OQ==","upper_bound":"LTExNDA1NDM2Ng==","repeats":1},{"count":936,"lower_bound":"LTExMzA4Njg4Nw==","upper_bound":"LTk5NzU5ODY4","repeats":1},{"count":944,"lower_bound":"LTk2ODM1Mzk3","upper_bound":"LTc0OTA2NjIy","repeats":1},{"count":952,"lower_bound":"LTcxMjM3Mjc3","upper_bound":"LTY1Mzc3MDky","repeats":1},{"count":960,"lower_bound":"LTU3NDk5NTQw","upper_bound":"LTUwMjI2NDYy","repeats":1},{"count":968,"lower_bound":"LTQ4NDg5NjE5","upper_bound":"LTI2OTAwNjUy","repeats":1},{"count":976,"lower_bound":"LTIyNTIzMzI5","upper_bound":"LTE5OTY5NDUy","repeats":1},{"count":984,"lower_bound":"LTE3OTk3NTU5","upper_bound":"Mzg1NTM5OQ==","repeats":1},{"count":992,"lower_bound":"NDE4MjQwOA==","upper_bound":"MTU0NzA3Njk=","repeats":1},{"count":1000,"lower_bound":"MTY4NTU1NTY=","upper_bound":"MjU4NDkyMjk=","repeats":1},{"count":1008,"lower_bound":"MjkwMzQzNzQ=","upper_bound":"MzE3ODg4NDQ=","repeats":1},{"count":1016,"lower_bound":"NDc4NDI0Njg=","upper_bound":"NjQ2NDQxMzU=","repeats":1},{"count":1024,"lower_bound":"NjQ3ODMxOTY=","upper_bound":"NzM4ODUyNzE=","repeats":1},{"count":1032,"lower_bound":"NzQzODc5NzA=","upper_bound":"ODQ2NDk2NjM=","repeats":1},{"count":1040,"lower_bound":"OTE4ODc4NDk=","upper_bound":"OTk5OTcwMDI=","repeats":1},{"count":1048,"lower_bound":"MTAwOTMyOTc0","upper_bound":"MTAyNjE0NjE4","repeats":1},{"count":1056,"lower_bound":"MTA1NDM3MjM2","upper_bound":"MTExOTU0Njcw","repeats":1},{"count":1064,"lower_bound":"MTEyMjIxNjc0","upper_bound":"MTE5NDIxNjU3","repeats":1},{"count":1072,"lower_bound":"MTI1NzA3NzU2","upper_bound":"MTM2NDA0NzY5","repeats":1},{"count":1080,"lower_bound":"MTM4MDQzMTM3","upper_bound":"MTQ2ODQ2MTM5","repeats":1},{"count":1088,"lower_bound":"MTU0ODI5MzIy","upper_bound":"MTYzMDczMjUy","repeats":1},{"count":1096,"lower_bound":"MTY2NTcxOTE2","upper_bound":"MTc4MTY1NjMw","repeats":1},{"count":1104,"lower_bound":"MTc4NTYzMjkx","upper_bound":"MTkzNjA5ODA1","repeats":1},{"count":1112,"lower_bound":"MTk5OTEyODAw","upper_bound":"MjIxODI1MzUz","repeats":1},{"count":1120,"lower_bound":"MjI5MTU1NzEz","upper_bound":"MjM3MTg0MTI0","repeats":1},{"count":1128,"lower_bound":"MjQ3MzgzMDM0","upper_bound":"MjUyODg3MDgz","repeats":1},{"count":1136,"lower_bound":"MjU1MDkwODQ5","upper_bound":"MjY2NDQxNDk2","repeats":1},{"count":1144,"lower_bound":"MjcwNjEyMjY4","upper_bound":"Mjk0NTk0MTQy","repeats":1},{"count":1152,"lower_bound":"Mjk1MDEwMzc4","upper_bound":"MzA5OTA3MjE2","repeats":1},{"count":1160,"lower_bound":"MzEwMzU2MTc5","upper_bound":"MzE0MzQwNjU0","repeats":1},{"count":1168,"lower_bound":"MzE0NDk1ODc2","upper_bound":"MzIxNzE4NzAw","repeats":1},{"count":1176,"lower_bound":"MzI2MjgxODI3","upper_bound":"MzQzNzA2NTA4","repeats":1},{"count":1184,"lower_bound":"MzQ0ODUyNDQ3","upper_bound":"MzYwMjYzMDk0","repeats":1},{"count":1192,"lower_bound":"MzY4NTIzMzU2","upper_bound":"Mzc4NTA2MDkz","repeats":1},{"count":1200,"lower_bound":"MzgxMjMyNzEw","upper_bound":"Mzg4NzkyMTY0","repeats":1},{"count":1208,"lower_bound":"MzkwNjcxNzQ0","upper_bound":"Mzk2ODM5MjI4","repeats":1},{"count":1216,"lower_bound":"Mzk5NDM1MTY3","upper_bound":"NDA5NjY3NzY1","repeats":1},{"count":1224,"lower_bound":"NDE0NDIwMjMz","upper_bound":"NDIxMjI3MTAx","repeats":1},{"count":1232,"lower_bound":"NDI0NTIzMTI0","upper_bound":"NDM0NDA2NTA3","repeats":1},{"count":1240,"lower_bound":"NDM5MjI5MDY1","upper_bound":"NDQ1MDUyOTU2","repeats":1},{"count":1248,"lower_bound":"NDQ3MDkwMjEx","upper_bound":"NDUzODM1MDg0","repeats":1},{"count":1256,"lower_bound":"NDU2MzA2NTUw","upper_bound":"NDY5Nzg0MDcy","repeats":1},{"count":1264,"lower_bound":"NDcwNDAyNjUx","upper_bound":"NDgzNjY3NjMy","repeats":1},{"count":1272,"lower_bound":"NDkxNzU5MDc4","upper_bound":"NTE0NjU0NDkz","repeats":1},{"count":1280,"lower_bound":"NTIwOTIzNjUz","upper_bound":"NTM4ODMzMDA0","repeats":1},{"count":1288,"lower_bound":"NTUxNjI5MTE2","upper_bound":"NTc2MzQyNDY3","repeats":1},{"count":1296,"lower_bound":"NTc2OTM1OTI1","upper_bound":"NTgzOTk4NDc5","repeats":1},{"count":1304,"lower_bound":"NTg5NjgzNTQ5","upper_bound":"NjAzMDQyMzI3","repeats":1},{"count":1312,"lower_bound":"NjE2ODM0ODcy","upper_bound":"NjI1NjQ3MjQ2","repeats":1},{"count":1320,"lower_bound":"NjI4NzU4MTU4","upper_bound":"NjQwOTY0MDk2","repeats":1},{"count":1328,"lower_bound":"NjQ0OTk2NTY3","upper_bound":"NjU4NTU5NDE3","repeats":1},{"count":1336,"lower_bound":"NjYwNzU5MDQ1","upper_bound":"NjY2MjE1NjQ5","repeats":1},{"count":1344,"lower_bound":"Njc0Nzg0NTg3","upper_bound":"Njc4NjM1NDcy","repeats":1},{"count":1352,"lower_bound":"Njc5Mjk5OTU1","upper_bound":"Njg4NDA2OTA0","repeats":1},{"count":1360,"lower_bound":"NjkwNzA2MTgy","upper_bound":"NzAxMDY4NDg2","repeats":1},{"count":1368,"lower_bound":"NzI2Nzk4Mjc3","upper_bound":"NzMzMjcxMTk3","repeats":1},{"count":1376,"lower_bound":"NzMzODg1NzEy","upper_bound":"NzQwNjMzMDQx","repeats":1},{"count":1384,"lower_bound":"NzUxMzgyNDM5","upper_bound":"NzU5Nzc0NDIx","repeats":1},{"count":1392,"lower_bound":"NzY0NDIxOTg1","upper_bound":"Nzc2NTI4OTE0","repeats":1},{"count":1400,"lower_bound":"NzgwMzc3MzY2","upper_bound":"NzkwNjYyNTg0","repeats":1},{"count":1408,"lower_bound":"NzkxNTI4NTM1","upper_bound":"ODAyNTg4MTky","repeats":1},{"count":1416,"lower_bound":"ODAzMTY5NzEz","upper_bound":"ODI3Mzk0NTcw","repeats":1},{"count":1424,"lower_bound":"ODI3NTkxNjE2","upper_bound":"ODUxMjg3Njky","repeats":1},{"count":1432,"lower_bound":"ODUxODU3MDM0","upper_bound":"ODYxNzc2NjIw","repeats":1},{"count":1440,"lower_bound":"ODk3MzU2NjQw","upper_bound":"OTA5MzIzNzMw","repeats":1},{"count":1448,"lower_bound":"OTEzOTg4NTM5","upper_bound":"OTIyNDU1Mjgy","repeats":1},{"count":1456,"lower_bound":"OTI0MjIyODA5","upper_bound":"OTM0NDc2OTc2","repeats":1},{"count":1464,"lower_bound":"OTM1ODEyMTA0","upper_bound":"OTQyMDY4MjQy","repeats":1},{"count":1472,"lower_bound":"OTQyNzg3MTI0","upper_bound":"OTUzNTY3ODU1","repeats":1},{"count":1480,"lower_bound":"OTU4MjU2MTcw","upper_bound":"OTY4ODIxMzk0","repeats":1},{"count":1488,"lower_bound":"OTcxNDE0MzA5","upper_bound":"OTc3MDQ2MjY5","repeats":1},{"count":1496,"lower_bound":"OTgzMDYzNzU1","upper_bound":"OTk1MTE2NzUx","repeats":1},{"count":1504,"lower_bound":"OTk3NjY0MDM5","upper_bound":"MTAxOTA5OTkzNg==","repeats":1},{"count":1512,"lower_bound":"MTAzMzA0OTQ5OQ==","upper_bound":"MTAzOTYxNzc1NA==","repeats":1},{"count":1520,"lower_bound":"MTA0ODI3MjAzMw==","upper_bound":"MTA2MzU4NjA0OQ==","repeats":1},{"count":1528,"lower_bound":"MTA2NzE3NDE4Ng==","upper_bound":"MTA3OTg0Mzk5NQ==","repeats":1},{"count":1536,"lower_bound":"MTA4MDk5OTg2MQ==","upper_bound":"MTA4ODA2NTAwNg==","repeats":1},{"count":1544,"lower_bound":"MTA4ODY3MTQzNA==","upper_bound":"MTA5NDI2MjIyOA==","repeats":1},{"count":1552,"lower_bound":"MTA5NTQ5MTQyMQ==","upper_bound":"MTExMzE0MzE3OA==","repeats":1},{"count":1560,"lower_bound":"MTEyMjQ5OTQ1MA==","upper_bound":"MTEzMDkzMTc4Nw==","repeats":1},{"count":1568,"lower_bound":"MTEzMTMwMzUxMQ==","upper_bound":"MTE0NDE1MjA0NQ==","repeats":1},{"count":1576,"lower_bound":"MTE0ODYxMjcyOA==","upper_bound":"MTE1NzI2NTk3Ng==","repeats":1},{"count":1584,"lower_bound":"MTE3MzQ5OTAzNw==","upper_bound":"MTE5NjU3NzM0NA==","repeats":1},{"count":1592,"lower_bound":"MTE5OTA3ODM5Ng==","upper_bound":"MTIwNzk2MTAxMA==","repeats":1},{"count":1600,"lower_bound":"MTIwOTk0NTc0NA==","upper_bound":"MTIxODEzNjU1Mw==","repeats":1},{"count":1608,"lower_bound":"MTIxOTI1OTY5MA==","upper_bound":"MTIyMzQ1Njc4Mw==","repeats":1},{"count":1616,"lower_bound":"MTIzODc3MTc4MA==","upper_bound":"MTI0ODIyNzU2MA==","repeats":1},{"count":1624,"lower_bound":"MTI1MDgzNzk1Mg==","upper_bound":"MTI3MzgzMjEwMQ==","repeats":1},{"count":1632,"lower_bound":"MTI4NDM0Mzg3MA==","upper_bound":"MTI4NzQyNTcyMQ==","repeats":1},{"count":1640,"lower_bound":"MTI5MDU4NDY3Ng==","upper_bound":"MTMwNzQxNTAzMw==","repeats":1},{"count":1648,"lower_bound":"MTMyNzY5NDQwNQ==","upper_bound":"MTMzOTI3NTkwMA==","repeats":1},{"count":1656,"lower_bound":"MTM2MzUyNjk3Ng==","upper_bound":"MTM2OTEyNjkyOQ==","repeats":1},{"count":1664,"lower_bound":"MTM3NjY4Mjc2Mg==","upper_bound":"MTM4MDg3NzMyNg==","repeats":1},{"count":1672,"lower_bound":"MTM4MTg5MTQxMQ==","upper_bound":"MTQwMjA5ODg1NA==","repeats":1},{"count":1680,"lower_bound":"MTQwMjMyOTk5Mg==","upper_bound":"MTQxNzc2OTIxNA==","repeats":1},{"count":1688,"lower_bound":"MTQxOTA4NTQyMQ==","upper_bound":"MTQyMzI4NjQ0MA==","repeats":1},{"count":1696,"lower_bound":"MTQyNTIzNzMwMg==","upper_bound":"MTQ0MDI3OTI3Mw==","repeats":1},{"count":1704,"lower_bound":"MTQ0MzY2ODM2Ng==","upper_bound":"MTQ2Mjc1Mjk3Mw==","repeats":1},{"count":1712,"lower_bound":"MTQ2NTAwMzQyMQ==","upper_bound":"MTQ3MDc1ODU3NA==","repeats":1},{"count":1720,"lower_bound":"MTQ3MTM5NDg3Ng==","upper_bound":"MTQ3NTQ1Mzk1MQ==","repeats":1},{"count":1728,"lower_bound":"MTQ4NjExNjY3MQ==","upper_bound":"MTQ5MDYwNDAzNg==","repeats":1},{"count":1736,"lower_bound":"MTQ5NDcyMDA3MA==","upper_bound":"MTUxNTEzMDE5MA==","repeats":1},{"count":1744,"lower_bound":"MTUxNzE1MDI3Ng==","upper_bound":"MTUzMzY5ODU4OQ==","repeats":1},{"count":1752,"lower_bound":"MTU0MDU3NjcxMg==","upper_bound":"MTU1MjUwMzI5Ng==","repeats":1},{"count":1760,"lower_bound":"MTU1MjkxOTc5Nw==","upper_bound":"MTU1ODEyNTAxNA==","repeats":1},{"count":1768,"lower_bound":"MTU2MTk0MjI2NQ==","upper_bound":"MTU5ODMyOTA3MA==","repeats":1},{"count":1776,"lower_bound":"MTYwNTYxOTQ5MQ==","upper_bound":"MTYyMDQwNTMwOA==","repeats":1},{"count":1784,"lower_bound":"MTYyNDY1NTI3MA==","upper_bound":"MTY0NTMzNTM2Ng==","repeats":1},{"count":1792,"lower_bound":"MTY1NDUwODYzMA==","upper_bound":"MTY2ODg1Njc2Ng==","repeats":1},{"count":1800,"lower_bound":"MTY2OTAzNzAzOQ==","upper_bound":"MTY4NzMzMTA2Nw==","repeats":1},{"count":1808,"lower_bound":"MTY4ODUzNzY2MQ==","upper_bound":"MTY5MDEzMjQzMg==","repeats":1},{"count":1816,"lower_bound":"MTY5NTg2NDkzOQ==","upper_bound":"MTcwMTMyOTYwMw==","repeats":1},{"count":1824,"lower_bound":"MTcxMjQ5OTQ3Mg==","upper_bound":"MTczMTMzMjA0Mw==","repeats":1},{"count":1832,"lower_bound":"MTczMTc1Mzk3MQ==","upper_bound":"MTc0NzgxNDUyOQ==","repeats":1},{"count":1840,"lower_bound":"MTc1NDkwODY4MA==","upper_bound":"MTc2MDAzODc1Mw==","repeats":1},{"count":1848,"lower_bound":"MTc2NjI5MjM2OQ==","upper_bound":"MTc3ODM0NDcyMQ==","repeats":1},{"count":1856,"lower_bound":"MTc4MTg2MjU0Nw==","upper_bound":"MTgwNDkzNjE2NQ==","repeats":1},{"count":1864,"lower_bound":"MTgwNjUwMjI0Ng==","upper_bound":"MTgyNDQxODEwOQ==","repeats":1},{"count":1872,"lower_bound":"MTgyNzg0NTU1OQ==","upper_bound":"MTg0MTM2ODA3NQ==","repeats":1},{"count":1880,"lower_bound":"MTg0MzgyNzYzOQ==","upper_bound":"MTg2MzExMjkyMw==","repeats":1},{"count":1888,"lower_bound":"MTg2Mzk2NDAzOQ==","upper_bound":"MTg4NzQzMjUzNQ==","repeats":1},{"count":1896,"lower_bound":"MTg5NjEzMDkzMA==","upper_bound":"MTkwMTM2NzA1NQ==","repeats":1},{"count":1904,"lower_bound":"MTkwNTQzNzAxNg==","upper_bound":"MTkxNjY3MzQyOQ==","repeats":1},{"count":1912,"lower_bound":"MTkyOTE3NzU4NA==","upper_bound":"MTk1MDI0OTA0NQ==","repeats":1},{"count":1920,"lower_bound":"MTk1MzkxMjUyNA==","upper_bound":"MTk3NDM0MzE0OQ==","repeats":1},{"count":1928,"lower_bound":"MTk3NDQ1OTIxNQ==","upper_bound":"MTk4MDYwNjk0OA==","repeats":1},{"count":1936,"lower_bound":"MTk4MjUyODk3Mg==","upper_bound":"MTk5NTQ4MTI3OA==","repeats":1},{"count":1944,"lower_bound":"MjAxODQ5NjMxMQ==","upper_bound":"MjAzODc2MDcwOA==","repeats":1},{"count":1952,"lower_bound":"MjA0MzUzNDIwNA==","upper_bound":"MjA1MjczMDM5MQ==","repeats":1},{"count":1960,"lower_bound":"MjA1NDYxMDY0NA==","upper_bound":"MjA2OTcyMDU1NQ==","repeats":1},{"count":1968,"lower_bound":"MjA3MTMxODI0NQ==","upper_bound":"MjA4MTQ5MjEyMQ==","repeats":1},{"count":1976,"lower_bound":"MjA4MjE1MzY4NQ==","upper_bound":"MjA5NzkzMjU0OQ==","repeats":1},{"count":1984,"lower_bound":"MjEwMjM1Njg5MQ==","upper_bound":"MjEwNzY4ODEzOA==","repeats":1},{"count":1992,"lower_bound":"MjEwNzc0ODI3MQ==","upper_bound":"MjEyMTkyMDQ1MQ==","repeats":1},{"count":2000,"lower_bound":"MjEyOTI3MjQ3MA==","upper_bound":"MjE0NDk1MTk5Mg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,2,1,1,1,2,1,1,1,1,1,0,1,1,0,0,2,0,0,0,0,0,2,0,1,0,1,0,0,0,1,2,0,1,0,0,0,2,1,1,2,1,1,0,1,1,0,1,2,2,0,2,0,0,0,3,1,1,0,0,1,0,0,1,2,2,1,2,2,2,1,0,0,1,0,1,0,1,0,2,3,0,1,1,3,3,2,1,0,0,3,0,0,4,0,1,0,2,1,1,2,0,0,0,0,3,2,0,1,1,1,2,1,0,1,0,1,2,2,2,1,2,2,0,0,2,0,1,2,3,2,0,1,3,1,2,0,0,1,2,0,0,0,0,1,2,2,2,0,0,0,0,1,1,2,0,1,2,0,1,0,2,0,0,0,2,0,0,0,2,0,2,1,0,1,3,0,0,2,4,1,0,0,1,1,1,1,1,1,1,2,0,0,0,0,0,2,0,0,0,1,0,1,3,2,4,2,3,1,2,3,2,0,2,0,0,1,1,1,0,0,0,0,3,1,2,1,2,1,0,0,1,1,1,2,1,5,1,1,0,1,1,2,1,0,1,1,1,0,0,0,2,1,0,1,0,2,0,2,3,1,1,1,0,4,1,0,0,1,1,0,0,0,0,2,0,1,1,1,2,0,2,1,1,0,1,0,0,0,1,1,0,1,0,3,1,0,1,0,0,2,2,1,0,1,1,0,2,1,3,1,0,0,1,1,0,0,4,0,1,0,0,1,0,0,3,1,1,0,2,0,1,0,1,2,0,1,1,1,1,1,0,0,1,0,3,1,0,1,0,0,2,0,0,0,0,0,1,3,1,0,0,0,0,0,0,1,2,0,0,2,1,3,1,0,0,1,1,1,0,0,1,1,0,0,0,1,3,0,0,1,0,0,5,0,1,1,0,2,0,2,0,2,0,1,0,2,0,0,1,1,0,0,1,0,1,3,1,1,1,0,0,0,0,0,1,0,0,0,0,3,0,0,2,0,0,0,1,2,0,1,0,1,0,1,2,1,0,0,2,0,0,1,2,0,1,0,1,0,0,0,0,3,1,0,0,1,2,2,0,0,0,1,1,0,2,1,1,1,0,2,1,0,2,1,0,2,2,3,1,1,0,1,1,1,0,1,2,1,1,2,0,1,2,0,1,0,2,1,3,0,3,1,0,2,0,0,1,1,1,0,2,2,0,2,5,0,1,3,0,2,1,0,2,0,1,1,0,1,0,1,2,0,2,0,0,1,0,0,0,1,1,1,0,3,0,2,0,2,0,0,1,1,0,1,0,1,1,0,2,3,0,2,0,0,0,0,1,2,0,0,0,2,1,0,2,1,0,2,1,3,1,2,0,1,1,1,0,1,3,1,1,1,1,1,1,1,0,1,0,2,1,1,2,1,1,0,1,2,4,0,0,0,1,0,1,1,1,1,0,1,1,1,5,2,1,1,0,1,0,1,1,1,3,2,0,1,1,2,1,3,0,3,0,2,0,1,2,1,1,1,1,1,1,0,3,0,1,0,1,2,1,1,0,1,1,1,1,0,2,0,2,1,1,1,1,1,0,0,1,0,0,1,0,1,1,1,1,0,1,0,0,0,1,2,0,1,2,1,3,1,1,0,2,0,2,2,2,1,1,3,0,2,2,1,3,1,3,0,1,1,1,1,0,3,0,1,0,0,0,2,1,3,1,0,1,0,1,0,0,1,1,0,2,0,0,2,1,1,0,0,0,2,2,2,0,0,3,0,1,1,0,1,2,0,2,0,1,1,0,0,0,0,3,2,0,0,2,2,2,1,1,0,1,0,0,0,1,3,2,2,2,2,1,1,1,2,2,1,1,0,3,0,1,2,0,2,0,0,0,1,3,1,0,2,1,2,2,3,0,3,1,0,0,2,1,0,1,0,0,0,1,1,1,0,2,1,0,1,1,0,2,0,1,2,0,0,0,1,0,0,2,1,1,0,1,2,0,5,0,1,1,2,0,1,0,2,0,1,0,0,0,1,1,1,0,3,2,1,2,0,2,2,2,1,1,1,1,1,0,1,1,1,0,1,1,1,4,0,2,1,2,1,0,1,1,0,2,3,1,0,0,2,0,1,1,4,1,1,2,0,1,2,0,0,1,0,1,1,1,1,1,0,1,0,1,0,1,1,0,2,2,3,2,1,2,1,1,0,0,0,0,3,1,0,0,2,0,1,3,1,0,0,1,1,3,2,2,2,0,1,0,1,0,0,0,1,0,5,1,0,1,0,0,0,0,0,2,2,0,1,0,2,1,2,0,1,1,1,0,1,1,2,1,2,1,1,0,1,2,0,1,0,1,3,0,0,0,0,2,1,1,1,0,2,0,1,0,0,0,1,1,2,0,4,1,0,0,1,0,0,2,2,1,5,2,1,0,5,2,1,0,1,2,0,1,1,0,2,3,0,1,2,1,2,1,1,0,1,0,0,3,0,1,1,1,0,1,0,0,0,1,0,2,0,2,2,0,1,0,1,1,0,1,0,0,1,1,1,0,0,1,1,2,1,0,1,1,0,1,2,1,2,1,1,1,1,2,1,1,2,0,1,1,0,0,0,0,0,1,1,0,1,1,0,2,0,3,1,1,1,1,0,0,2,1,0,0,0,1,1,1,2,1,1,2,2,1,2,3,3,0,0,2,0,0,0,0,0,3,0,2,0,1,0,2,0,2,0,2,0,0,2,1,0,3,0,1,0,1,2,1,3,2,2,4,2,0,0,1,2,1,1,1,1,2,0,0,3,1,1,1,2,2,0,3,3,2,1,0,1,2,0,0,3,1,1,1,2,2,1,0,0,2,1,3,1,1,1,0,2,0,0,3,1,0,0,1,0,0,3,0,1,0,2,1,2,1,1,0,1,0,1,0,3,2,3,1,1,0,1,0,0,1,0,1,2,1,0,1,2,0,1,1,1,0,1,1,1,1,1,1,1,2,0,0,2,0,1,0,0,0,1,1,0,2,0,1,1,0,0,0,0,2,1,3,0,0,2,1,0,1,0,3,1,2,0,1,2,0,0,2,0,1,1,0,0,0,1,2,0,1,0,2,0,1,2,2,1,2,0,3,0,1,0,0,0,1,0,0,0,0,0,2,0,2,2,1,1,1,3,0,1,0,1,0,0,0,0,1,3,2,2,0,2,1,1,1,1,2,1,0,1,0,0,1,1,2,1,0,1,0,1,1,1,0,1,1,2,0,2,0,2,2,2,0,2,1,4,2,2,4,1,1,0,2,2,1,1,1,1,1,1,1,0,0,0,2,2,0,0,1,2,0,0,3,2,1,0,1,1,1,1,0,1,1,0,1,3,0,1,4,1,0,2,1,1,0,1,2,1,3,0,1,0,2,1,1,1,4,1,1,0,1,1,0,0,1,1,1,0,1,2,0,0,2,1,0,0,0,0,1,1,1,0,0,0,0,2,4,1,0,2,2,2,1,4,2,1,0,3,3,3,4,1,4,3,2,0,0,1,0,2,1,0,1,2,1,2,1,2,2,0,0,1,1,2,1,0,0,1,1,4,1,0,0,2,1,2,1,0,1,1,2,2,2,2,0,3,1,0,2,0,1,0,0,0,2,1,1,3,0,1,0,1,0,5,1,1,0,2,0,1,0,0,1,3,3,1,0,1,0,1,1,0,1,0,1,1,1,1,2,1,0,1,1,0,0,0,1,1,2,1,1,0,1,0,1,1,1,0,0,3,3,2,1,0,2,0,0,0,0,2,1,1,3,0,1,1,3,0,2,1,0,0,4,0,2,0,3,0,1,2,0,0,5,0,0,0,1,0,1,0,1,1,0,0,1,2,0,0,0,1,0,0,0,1,0,3,0,1,1,1,0,1,0,2,1,0,2,1,1,2,0,1,1,2,0,2,3,0,1,1,2,3,2,0,3,4,0,0,0,1,0,1,1,0,1,0,0,0,2,0,1,1,4,0,1,0,1,2,0,0,1,2,1,0,1,2,2,0,2,1,0,1,1,0,2,3,0,2,0,1,1,0,0,1,2,0,0,1,1,1,0,1,1,0,1,0,1,1,0,1,2,4,1,1,0,0,0,0,0,2,2,2,2,2,1,1,2,2,2,2,1,0,2,1,1,2,0,1,0,1,1,2,0,0,0,0,5,0,0,0,2,2,1,1,2,0,0,1,3,2,1,0,1,1,3,2,1,0,1,4,1,0,1,1,2,1,0,0,1,0,1,0,1,4,1,2,0,2,2,1,1,1,1,0,2,1,0,1,2,0,2,0,1,1,2,0,1,1,0,1,1,5,1,1,0,2,1,1,0,0,1,3,0,0,0,0,1,2,1,0,2,3,1,0,0,0,0,1,2,0,2,1,1,2,1,3,1,1,0,1,1,1,2,1,0,0,2,0,1,2,0,1,0,1,1,2,1,0,0,0,0,2,1,1,1,2,0,1,2,1,1,4,1,0,1,0,1,2,1,2,0,2,1,0,1,3,2,0,3,1,0,0,0,1,1,0,0,2,0,0,0,0,0,1,1,2,1,1,1,0,3,0,1,1,3,0,4,3,1,0,0,0,3,0,0,3,2,0,1,2,1,1,1,1,4,1,0,0,1,0,1,3,1,0,1,0,2,2,0,1,0,0,0,0,1]},{"counters":[0,1,1,1,2,0,0,1,0,1,2,0,0,2,0,1,1,2,1,2,1,0,0,3,1,2,0,2,1,0,0,1,3,3,1,2,1,2,0,1,3,2,1,1,0,1,1,2,0,0,1,1,1,0,0,0,3,0,1,0,1,0,1,0,0,3,1,2,0,0,0,0,2,3,1,1,3,0,3,1,1,1,2,3,0,1,2,2,1,1,1,3,2,2,0,1,0,0,2,4,0,1,1,2,0,0,0,2,1,1,1,0,2,3,2,1,1,0,1,1,2,2,0,0,1,2,1,1,1,0,0,2,0,2,2,1,1,3,1,2,0,1,0,1,0,3,1,0,1,1,1,1,0,2,3,0,0,1,2,1,0,3,2,1,1,4,1,1,0,1,0,0,0,1,1,1,1,0,1,0,1,1,0,1,0,2,0,0,1,1,0,0,1,2,2,0,0,2,3,1,0,2,1,1,0,3,1,1,1,3,1,0,0,1,1,0,0,0,2,0,0,1,0,2,2,2,1,1,0,2,2,0,2,3,1,1,1,1,1,1,0,1,0,1,0,1,1,0,2,0,3,1,0,0,1,1,1,1,0,1,1,0,0,2,0,0,1,0,1,2,0,1,0,0,3,0,2,1,2,2,3,1,0,1,0,3,1,1,0,1,0,0,1,0,2,0,1,1,1,0,0,1,0,1,1,0,1,0,0,0,1,1,1,2,0,1,0,1,1,1,0,1,0,2,1,1,0,1,0,3,1,2,0,0,0,1,1,0,1,1,1,1,0,1,0,1,1,2,0,0,1,2,0,2,2,2,0,1,0,1,2,1,0,2,3,2,2,2,2,0,2,1,1,1,2,1,0,2,3,0,1,1,2,1,1,2,0,2,2,0,1,5,1,3,3,2,1,0,1,1,0,1,2,0,1,2,2,2,0,0,2,0,3,1,0,0,1,1,2,2,1,0,1,0,2,0,0,0,0,0,3,0,3,0,2,0,1,2,1,1,1,4,0,0,4,0,1,3,1,0,1,0,0,1,1,1,0,1,0,1,1,3,3,1,1,1,2,2,0,2,3,1,5,0,1,0,2,2,1,1,0,0,1,1,1,0,1,1,1,2,1,2,1,0,0,1,1,2,1,0,0,0,2,3,0,2,1,2,2,1,2,1,1,0,2,0,0,0,3,2,0,0,3,1,0,1,1,1,1,0,1,2,1,0,1,2,1,0,2,1,1,1,3,1,0,2,0,1,1,1,1,0,0,0,1,1,0,1,0,1,0,2,1,1,1,1,1,4,2,0,0,2,0,4,1,0,1,0,3,0,1,1,2,1,1,0,1,2,1,2,1,1,0,1,0,2,0,0,1,1,0,0,4,1,2,1,1,1,1,2,0,0,0,2,1,0,0,1,0,0,1,1,2,1,2,2,3,2,1,1,0,0,2,1,1,1,0,0,0,0,2,1,2,1,1,0,0,0,1,2,1,1,1,1,2,1,2,0,0,0,2,0,3,0,1,1,0,0,1,0,3,1,0,0,1,1,1,0,1,0,1,1,0,2,1,0,2,1,1,0,0,2,0,1,0,1,1,0,3,1,0,1,1,0,0,3,1,0,2,1,1,0,1,2,1,0,2,2,1,2,0,0,1,1,1,1,2,1,0,2,1,0,1,1,0,0,1,0,2,0,1,0,2,2,2,1,2,0,4,0,0,0,1,0,0,3,2,1,1,0,0,0,1,1,0,1,0,1,0,2,3,0,2,0,1,2,1,1,0,2,0,1,0,1,0,0,0,2,1,1,1,1,1,0,1,1,2,0,2,0,1,0,2,1,0,2,1,0,1,1,2,1,1,0,0,0,0,0,0,2,0,1,1,0,1,1,0,0,2,1,1,0,0,2,0,0,0,1,0,2,1,0,0,0,0,1,1,2,1,0,0,2,1,0,1,1,1,0,1,0,0,1,0,0,0,0,3,0,0,1,1,2,0,1,1,0,3,0,1,1,1,0,1,1,0,2,0,3,0,0,3,1,2,0,1,4,1,1,0,2,1,1,4,0,3,0,1,1,4,1,2,0,3,0,1,0,1,1,1,0,1,0,1,2,1,2,1,0,0,1,1,0,3,1,1,2,2,0,0,0,0,0,3,3,1,0,0,2,3,1,3,0,4,3,1,0,1,3,1,0,0,1,0,1,2,2,0,1,0,0,0,0,0,0,0,0,2,0,0,0,1,0,3,0,1,1,2,2,2,2,2,0,1,1,1,2,0,0,0,1,0,2,0,2,0,1,1,1,1,1,2,0,0,1,4,1,2,0,1,0,2,1,0,0,0,0,0,2,1,1,1,1,0,2,2,1,2,1,1,0,0,2,1,3,2,0,0,1,1,3,1,0,0,2,1,1,1,2,1,1,1,1,1,1,0,4,2,1,2,1,0,3,0,4,0,0,2,0,2,1,1,1,0,3,1,1,0,1,1,1,0,3,1,0,1,2,1,0,1,0,0,2,0,0,2,0,0,0,1,2,2,0,1,4,0,0,1,2,0,0,1,0,1,0,0,1,1,0,1,0,0,1,0,0,0,0,5,2,0,0,0,2,1,1,3,1,0,1,1,0,0,1,2,0,1,2,0,2,0,0,1,2,0,1,1,1,2,1,1,0,1,1,1,2,0,0,2,2,0,2,1,3,1,3,1,0,1,1,1,1,1,1,0,2,0,1,0,2,0,1,0,1,1,2,0,1,2,1,0,1,1,1,0,0,1,1,0,1,1,2,0,0,2,2,2,0,1,0,4,1,0,0,1,4,0,0,1,1,1,1,0,1,0,0,0,1,2,1,0,0,1,1,1,1,1,0,0,1,1,0,1,2,2,2,0,2,2,0,4,3,1,1,1,3,0,0,0,0,3,0,4,1,1,0,4,4,0,1,4,1,2,0,1,1,2,0,2,0,0,1,1,0,0,1,0,2,0,0,3,1,0,1,0,1,2,0,3,0,0,1,1,0,1,2,2,0,0,1,3,0,0,1,3,0,1,0,1,2,0,0,2,0,1,1,0,1,1,1,2,0,0,2,1,0,2,0,0,0,1,0,0,0,2,1,0,0,2,1,0,1,1,0,1,1,0,4,0,0,3,0,0,1,0,1,0,1,4,0,1,1,1,1,3,0,1,1,2,0,0,1,1,0,1,1,0,1,3,1,1,0,0,1,1,1,1,1,0,2,1,1,0,2,0,1,0,1,1,0,2,2,1,1,2,2,1,3,1,2,1,2,0,3,1,1,0,0,3,0,1,1,0,2,2,1,2,3,1,0,2,1,0,0,2,2,2,2,0,4,0,1,0,2,2,0,1,0,3,2,2,0,0,0,1,1,0,1,2,0,1,1,1,2,2,0,2,0,0,3,2,1,1,2,3,1,1,2,1,0,1,0,0,1,0,0,1,0,3,1,0,1,2,1,1,1,1,1,0,1,0,0,2,0,1,1,1,0,2,1,1,0,2,0,0,0,1,1,2,2,0,0,0,0,1,0,1,2,1,1,0,0,0,1,3,1,1,1,2,2,2,2,2,0,2,2,2,1,0,0,0,1,0,3,0,0,0,1,1,2,1,0,2,0,0,2,0,1,0,1,0,1,2,0,0,4,2,1,0,0,2,1,0,2,3,1,0,1,1,0,1,0,2,4,3,2,0,0,0,0,0,0,3,0,0,0,0,1,1,1,3,3,0,0,1,0,1,1,4,0,2,1,0,2,0,1,0,2,3,0,0,1,0,0,3,2,1,2,1,1,0,1,0,2,0,1,1,1,1,0,2,2,0,0,1,2,3,1,1,1,0,1,2,0,0,0,0,0,0,2,1,0,0,1,0,1,1,0,1,0,3,1,0,3,2,0,2,0,0,0,1,1,1,1,0,2,1,1,1,1,1,1,1,2,5,0,0,1,2,1,0,0,1,1,0,1,0,0,0,4,1,2,3,2,0,2,1,2,2,2,2,0,1,2,2,1,1,0,0,0,0,0,2,2,1,2,0,3,0,0,0,0,2,1,0,0,0,2,1,2,0,1,1,2,0,2,0,1,0,1,2,1,0,1,1,1,2,2,1,1,0,0,1,1,0,0,2,0,0,0,3,0,2,2,0,2,1,0,3,0,1,0,0,2,0,2,2,0,1,1,3,1,1,0,3,0,2,1,0,0,2,0,2,0,0,2,2,0,0,0,0,0,1,0,2,1,0,0,2,1,2,0,4,1,1,0,0,0,1,0,0,0,1,0,2,1,1,1,1,1,0,2,1,1,0,3,0,1,0,2,0,1,0,0,0,0,4,2,2,1,0,0,1,0,0,0,0,0,0,2,0,2,0,1,0,1,0,1,2,0,0,3,3,0,1,0,0,1,1,0,2,1,1,1,2,1,1,1,4,1,1,1,1,1,0,1,0,0,1,0,0,2,2,1,1,0,0,4,1,1,2,0,1,1,2,1,1,1,0,1,1,2,2,0,2,1,2,0,1,0,1,1,1,1,0,0,1,1,1,0,0,0,2,0,0,2,1,0,1,1,0,2,1,1,1,1,1,1,1,1,1,0,0,1,0,2,2,2,0,0,1,2,4,1,1,2,0,0,0,2,0,1,0,0,0,3,1,2,0,4]},{"counters":[3,0,0,0,0,0,0,1,0,1,0,2,1,1,0,1,0,1,2,0,1,1,0,0,2,2,0,0,1,2,1,1,0,2,0,1,0,1,1,1,0,0,2,0,2,2,4,0,0,0,0,2,0,3,2,5,2,2,2,1,1,2,1,1,2,1,0,0,3,0,0,1,0,0,1,1,2,2,0,6,0,2,1,0,1,1,2,1,0,0,0,3,1,1,1,2,1,2,1,0,1,0,1,0,0,1,1,1,2,0,3,1,1,1,3,1,1,3,0,1,0,1,2,1,1,2,1,0,3,3,0,1,0,0,1,1,1,0,2,3,2,0,1,2,1,0,0,0,0,1,0,0,1,1,0,2,0,1,1,1,0,1,0,3,2,0,1,0,0,2,1,3,0,0,1,2,0,1,0,0,1,0,2,2,1,1,2,2,0,2,2,2,0,1,0,0,3,2,3,1,0,1,1,0,0,2,0,2,0,1,0,1,1,1,1,0,0,1,0,1,0,3,1,0,0,2,0,0,1,1,0,1,2,1,2,1,0,0,0,1,2,1,1,0,2,2,1,1,3,3,0,2,1,0,1,3,1,1,2,0,2,1,0,0,0,2,3,0,1,2,1,0,0,1,2,1,0,0,2,1,1,1,0,1,2,1,0,2,0,2,1,0,5,0,0,0,3,0,2,0,0,0,0,0,0,1,0,0,2,1,1,0,0,2,0,1,2,0,1,1,0,0,1,0,0,1,0,0,1,2,2,1,1,1,0,4,2,0,0,1,1,0,0,0,1,2,0,2,0,0,1,2,2,0,4,2,0,1,0,0,1,2,0,0,0,0,0,0,1,0,1,1,0,1,0,2,2,2,0,1,1,0,0,3,3,1,0,4,0,0,2,1,0,1,2,2,1,4,0,1,1,1,1,0,3,0,1,3,1,2,2,1,2,1,1,0,0,1,1,2,1,2,0,1,0,0,0,1,0,0,2,0,1,0,0,0,2,1,0,3,1,2,0,0,1,0,0,0,0,1,1,1,0,2,2,3,0,1,2,0,1,1,0,1,0,0,1,1,1,1,1,0,3,1,1,0,0,0,1,0,3,0,0,2,0,0,1,3,2,0,0,1,0,1,0,1,2,1,1,0,0,1,1,2,0,0,0,0,1,0,2,1,1,0,0,2,1,1,1,2,0,0,2,4,1,1,4,1,0,1,1,2,0,1,1,2,1,2,0,0,0,0,1,1,2,4,0,0,0,0,1,0,0,0,3,2,2,2,0,0,1,1,2,1,0,1,0,0,3,0,2,2,0,1,1,1,2,1,1,2,5,2,0,1,4,0,0,0,1,1,0,0,1,1,2,2,3,2,0,1,2,0,4,0,0,0,2,0,1,1,1,1,3,0,3,0,0,0,0,1,0,1,0,1,1,0,1,1,2,0,0,0,0,1,0,1,2,0,0,1,0,1,2,2,2,1,0,0,1,0,0,2,0,1,0,0,1,1,1,0,0,1,2,2,0,2,0,0,3,0,1,0,1,1,0,0,0,1,0,2,0,1,2,1,1,1,0,1,1,1,0,2,2,0,1,1,1,2,1,2,1,3,1,2,0,0,0,3,0,0,0,4,1,0,0,0,2,0,2,1,0,0,2,1,1,1,2,0,1,0,1,0,3,1,0,1,3,2,1,1,2,3,0,0,1,3,0,0,2,2,1,1,1,2,0,1,0,3,1,1,0,2,1,0,0,1,1,1,0,1,0,0,1,0,0,2,2,0,1,1,0,0,2,3,3,1,0,3,0,0,1,0,1,1,2,3,1,1,3,2,1,0,2,0,1,1,2,1,0,1,1,1,0,0,0,0,0,1,2,1,1,1,2,0,0,1,4,3,1,0,0,2,1,0,0,1,2,0,2,0,0,1,1,2,1,1,0,1,2,2,0,1,0,1,1,2,1,2,0,0,0,0,2,1,2,1,0,1,1,0,2,1,2,1,2,1,1,2,2,0,3,0,1,1,2,0,2,1,1,4,0,0,0,0,1,2,0,1,1,3,1,1,1,0,1,1,1,2,2,1,0,0,0,1,0,0,2,0,0,0,0,0,1,2,3,1,1,1,1,1,0,0,2,2,0,0,1,2,0,3,3,0,2,1,2,0,0,0,1,2,0,1,0,1,1,1,1,0,0,0,2,0,3,0,0,3,1,0,1,1,1,1,0,2,1,0,0,3,1,1,0,0,0,2,0,1,2,1,0,2,1,1,1,1,1,0,2,2,1,1,2,0,2,1,2,4,2,1,1,0,2,2,0,1,0,0,3,0,0,1,1,1,0,2,1,0,4,2,1,1,2,1,0,1,1,0,0,0,0,1,1,0,2,0,0,1,1,1,0,4,1,1,0,2,0,1,0,0,1,1,1,0,0,1,0,5,0,0,1,0,2,0,1,1,1,1,0,3,1,0,1,0,2,0,0,2,0,1,1,0,4,2,1,3,0,0,0,4,1,1,1,4,2,2,0,1,1,2,1,0,0,0,0,1,0,2,0,1,1,1,0,4,1,1,0,0,0,0,3,1,1,1,1,1,1,0,1,2,1,1,1,1,1,0,0,0,1,0,0,1,1,1,0,0,1,1,3,3,1,1,0,1,0,0,2,0,1,1,2,1,0,2,3,0,2,2,2,0,0,0,2,0,4,2,3,2,0,0,1,2,0,0,0,1,0,0,4,0,2,3,1,1,0,0,1,0,0,3,1,0,2,1,0,0,2,3,1,0,1,1,1,0,1,1,0,2,2,1,0,1,1,0,4,1,2,1,1,2,1,1,2,0,0,0,1,2,0,1,1,1,2,1,1,1,0,0,1,1,0,0,2,3,1,1,2,1,2,0,0,1,2,1,1,1,3,1,1,2,2,0,1,1,1,0,2,1,1,0,0,0,2,1,0,1,1,0,1,1,2,0,3,1,0,1,0,1,2,0,2,0,0,1,1,2,1,1,1,2,1,1,0,0,0,2,0,1,1,2,0,1,1,1,1,0,0,1,1,0,2,2,0,0,1,2,1,2,0,0,2,1,2,2,2,0,1,1,1,1,0,1,2,0,0,3,3,1,0,1,4,0,2,3,0,0,1,1,4,2,0,2,1,0,0,2,0,1,0,1,2,0,2,0,1,0,1,2,1,2,1,0,0,0,0,0,3,0,3,1,2,0,1,1,1,0,1,2,4,2,0,2,2,1,1,0,1,2,0,2,2,1,1,1,2,0,0,0,0,3,0,1,0,3,1,3,1,0,0,1,0,1,1,1,2,0,1,0,0,1,0,1,1,1,0,1,0,0,1,0,1,1,0,0,0,1,1,2,1,1,2,1,1,0,2,2,0,2,0,1,1,1,0,1,0,1,1,3,1,1,1,1,2,0,3,0,1,2,2,2,1,1,2,1,2,1,1,1,2,1,1,2,0,3,1,1,1,0,0,2,0,0,1,0,0,1,0,1,0,1,0,2,1,1,0,0,1,2,3,2,2,2,0,0,1,0,0,2,1,0,0,3,2,0,0,0,0,0,1,0,1,4,1,0,1,1,0,0,3,0,0,0,1,1,0,1,0,1,1,1,2,0,0,1,0,0,1,0,1,0,2,0,1,0,3,0,0,1,1,1,0,0,2,1,1,0,2,0,1,1,0,1,1,1,1,2,0,1,1,1,0,1,0,0,1,0,0,0,3,1,0,1,1,1,2,1,3,1,1,1,1,2,2,1,0,1,2,0,0,1,2,3,0,1,1,1,2,2,0,0,4,0,0,1,2,1,1,2,2,0,1,2,0,1,0,1,1,2,0,2,1,2,0,1,1,0,1,1,1,1,2,2,0,1,3,3,1,1,0,0,0,1,1,1,2,0,1,2,1,0,2,0,2,2,1,1,0,0,1,2,1,0,0,2,1,0,0,3,2,1,0,1,0,0,2,0,1,0,1,1,1,2,2,1,2,1,0,2,0,0,3,0,1,0,1,1,2,0,0,2,0,1,0,2,1,0,2,2,0,0,2,2,0,2,0,2,0,2,1,0,2,1,0,2,1,2,1,2,1,0,3,0,0,1,1,1,1,0,0,1,1,0,0,2,0,0,2,1,0,3,0,0,0,1,0,2,1,0,2,2,1,2,2,0,0,1,2,2,0,1,0,1,1,2,1,1,1,1,0,3,2,0,2,2,1,1,3,1,1,0,1,1,1,2,1,2,0,2,3,1,2,1,0,0,0,1,0,1,1,2,2,0,3,2,2,0,0,1,2,1,0,3,1,0,1,0,0,1,1,2,0,0,1,2,1,0,2,0,3,0,1,1,1,0,2,2,0,1,0,0,2,0,0,0,2,0,1,1,0,0,0,1,2,1,2,0,0,1,0,0,2,0,1,2,1,0,0,0,0,2,1,3,1,0,1,1,2,0,0,0,0,1,1,1,0,0,0,0,1,4,1,0,0,2,1,1,1,2,3,0,1,1,0,1,4,0,2,0,0,2,2,0,0,0,2,2,3,0,1,1,3,2,1,0,1,1,1,1,1,1,1,1,3,0,0,0,1,2,1,2,0,1,3,2,0,2,2,0,0,3,1,2,1,1,0,0,3,1,2,1,0,0,1,2,2,0,2,1,0,3]},{"counters":[2,0,0,2,0,1,1,0,2,1,0,0,0,2,2,0,1,0,3,1,0,2,0,0,0,0,0,0,5,2,0,2,2,1,0,0,0,0,0,2,2,0,0,0,0,3,1,0,2,2,0,0,1,0,0,1,0,2,1,2,0,0,1,0,2,2,1,0,1,1,1,0,1,2,1,0,3,1,2,1,0,2,1,1,2,1,0,0,2,2,0,0,0,0,0,1,1,1,0,1,0,1,0,0,1,1,0,1,0,0,2,0,0,4,0,1,2,0,2,1,1,2,0,0,1,2,1,2,0,0,0,0,0,2,0,1,1,1,0,2,1,1,2,2,1,2,2,0,1,0,0,1,1,1,0,2,0,0,1,1,0,2,0,1,0,2,1,2,1,2,1,0,1,1,0,0,0,7,0,2,2,1,2,0,3,0,1,2,1,1,0,2,1,1,1,3,0,1,0,1,1,1,1,1,0,1,1,1,1,1,2,0,0,0,0,1,2,0,1,2,0,0,1,1,1,1,0,1,2,1,2,2,1,1,1,1,1,1,0,1,0,0,1,1,1,2,0,0,0,1,1,2,0,1,0,0,1,0,0,2,1,2,2,3,1,2,0,0,0,0,1,3,2,2,2,1,3,0,5,1,2,0,1,1,0,2,2,0,3,0,0,0,2,2,0,0,1,3,1,1,0,1,1,1,0,0,1,1,1,4,0,1,0,1,0,2,0,0,0,1,0,0,1,2,1,1,1,2,2,0,2,3,2,1,0,2,1,1,1,0,0,0,0,0,3,2,2,2,1,1,2,1,0,2,0,0,1,2,1,2,0,1,0,0,1,1,0,0,0,1,0,1,1,1,1,3,0,3,1,1,0,1,1,2,1,1,0,0,2,0,0,5,0,1,0,3,1,2,2,2,2,1,2,3,0,0,0,0,0,0,1,1,0,0,1,0,0,1,2,1,1,1,0,0,0,0,0,1,0,0,0,1,2,0,1,1,1,1,1,1,0,0,0,2,1,0,0,1,1,3,0,0,1,0,2,0,0,2,1,2,1,1,3,0,1,2,0,1,1,0,0,1,1,2,1,1,1,0,3,0,0,0,1,2,2,0,2,0,0,2,1,1,0,2,2,3,1,1,1,0,0,0,0,0,2,0,0,3,4,1,1,0,0,1,0,2,1,0,1,1,0,1,1,1,0,2,3,2,1,0,0,2,1,0,2,1,0,3,0,1,0,0,1,1,0,1,1,2,0,1,0,0,0,1,1,2,0,1,4,0,2,1,4,3,0,0,0,0,1,1,1,0,0,0,0,0,2,0,1,2,1,0,1,3,0,0,2,0,1,1,2,0,2,2,2,2,1,1,1,0,1,1,0,1,3,0,1,1,1,0,1,2,2,1,0,1,0,0,2,1,1,1,1,2,0,1,2,1,2,0,1,1,4,1,1,1,0,0,2,3,1,2,3,0,2,0,0,0,2,2,2,1,2,1,1,0,0,2,2,0,1,1,1,0,1,1,1,1,0,1,1,0,0,2,4,0,1,1,0,1,1,0,2,2,0,1,4,3,1,1,1,2,1,1,0,2,1,2,1,0,0,2,0,0,0,3,0,0,3,0,2,0,0,2,1,1,1,1,1,0,2,1,2,2,1,0,1,1,3,3,1,0,0,2,2,0,0,0,3,0,1,1,2,0,1,0,3,2,1,2,2,2,5,1,3,1,0,1,1,1,0,1,0,0,0,1,1,0,2,2,2,0,0,0,1,0,0,0,0,4,1,0,2,0,2,0,0,0,0,1,3,2,2,0,1,0,1,2,2,0,3,2,2,1,0,1,1,2,0,0,0,1,1,0,1,1,1,1,0,0,0,1,0,0,1,2,2,1,0,1,4,0,4,2,3,2,2,2,3,0,1,1,1,1,0,2,1,0,1,0,1,1,0,0,1,0,2,0,2,1,1,0,0,1,0,5,2,1,0,2,0,3,0,1,0,1,1,2,2,0,1,2,1,0,2,0,0,2,2,2,3,3,3,2,1,0,1,1,2,1,0,1,1,1,1,2,0,1,3,0,1,0,2,0,0,0,3,1,2,1,0,0,0,0,0,1,1,0,3,0,2,0,0,3,2,2,0,0,0,1,0,0,0,2,2,0,3,1,5,1,1,3,2,0,2,2,0,1,1,0,1,3,3,0,1,0,1,1,2,3,0,1,1,1,2,1,0,0,0,1,0,1,1,1,0,1,0,2,1,1,0,0,2,2,1,0,1,1,0,0,1,0,1,2,1,1,1,0,1,0,1,1,2,2,1,1,2,0,1,0,2,2,1,0,2,0,2,1,1,0,1,2,2,0,1,2,1,1,1,0,2,0,4,1,1,1,1,3,0,0,0,1,0,1,4,1,2,0,0,0,1,1,1,0,2,0,3,2,1,3,1,2,1,1,0,1,0,1,1,3,2,2,0,1,0,0,0,1,1,0,0,0,0,3,2,0,0,2,2,2,2,1,2,0,0,0,0,0,0,1,1,0,1,2,2,0,1,0,2,0,3,0,2,0,1,1,1,3,0,2,0,1,2,3,0,2,1,1,1,1,2,1,3,0,1,2,1,1,1,3,1,1,3,0,2,2,0,0,1,0,0,1,1,2,1,1,2,1,0,0,0,0,0,2,0,2,0,2,0,0,0,0,0,1,0,0,0,0,0,1,2,0,2,0,1,0,0,2,3,3,2,1,0,0,3,0,0,1,1,1,1,3,1,1,1,0,1,0,0,3,0,0,1,0,2,1,0,0,0,1,1,1,1,3,1,2,1,1,1,1,1,1,0,1,1,4,1,0,0,0,1,0,2,3,2,0,0,0,1,0,2,0,1,2,2,1,1,2,0,0,0,0,1,1,1,0,0,0,2,0,0,2,0,2,0,1,2,1,0,1,2,0,1,1,1,1,0,1,0,0,0,1,1,0,1,0,2,0,1,2,1,1,3,0,2,1,0,0,1,1,0,1,2,0,1,0,2,0,0,2,0,0,0,2,3,1,1,0,1,0,1,1,1,2,2,1,1,2,1,2,1,2,0,1,2,2,0,1,0,1,1,4,0,1,3,0,0,2,1,3,1,2,3,0,1,0,0,1,2,1,2,1,1,3,2,0,0,0,1,1,1,1,0,0,0,0,0,1,1,1,2,1,0,0,2,0,1,1,0,1,1,0,1,2,2,0,3,2,0,1,0,0,2,0,2,1,1,1,0,0,1,0,3,2,0,0,0,0,1,3,1,0,1,1,3,0,1,1,0,1,1,1,2,1,0,1,1,0,2,1,0,2,0,0,0,1,1,1,2,0,0,1,2,1,3,2,4,0,2,2,1,1,0,2,0,0,0,1,3,1,0,3,0,0,1,0,3,1,1,2,1,0,1,0,2,0,0,1,0,1,2,0,0,2,2,2,1,0,1,1,1,1,0,1,1,0,1,1,1,1,1,1,1,1,0,0,1,0,2,0,0,0,2,2,4,1,0,3,2,0,0,2,0,0,1,4,2,1,0,1,0,0,1,1,1,1,1,1,1,0,1,2,2,0,0,2,0,1,1,1,3,2,0,0,4,1,0,0,0,2,1,0,2,0,0,0,2,1,2,0,3,0,0,0,1,3,0,3,2,1,1,2,1,0,1,0,3,3,3,0,1,0,0,1,2,1,2,2,1,1,1,0,2,0,0,0,0,1,3,1,2,0,1,0,0,2,0,1,2,1,0,2,1,1,3,0,1,1,1,0,0,0,0,2,0,1,1,1,0,0,2,1,0,1,0,1,0,2,1,0,2,1,1,0,0,0,0,2,2,1,1,1,0,3,0,2,1,2,1,1,2,1,1,1,1,3,1,1,1,0,1,0,0,0,1,1,2,2,0,1,0,0,2,0,1,0,0,0,1,3,0,2,0,1,1,0,1,0,0,0,2,1,1,1,0,0,2,1,3,0,2,0,2,0,0,3,0,1,0,0,0,0,0,1,1,0,1,0,1,2,0,0,0,1,1,1,1,1,0,1,2,1,1,0,2,0,0,1,1,2,0,2,0,1,0,2,2,2,2,2,1,0,2,1,2,0,2,1,0,1,1,4,1,0,3,2,1,0,1,0,0,3,1,0,1,0,0,1,0,2,1,2,0,0,0,0,3,1,0,0,0,1,1,0,0,0,2,0,0,0,1,2,1,4,1,0,1,1,3,0,0,1,1,2,1,1,1,2,0,4,1,1,2,1,0,1,0,1,1,1,1,3,0,1,1,0,0,0,2,3,0,1,0,1,0,1,0,1,0,3,2,1,0,1,0,1,1,1,0,0,0,2,1,0,0,1,0,2,0,4,1,0,2,2,0,2,1,1,0,0,2,1,0,1,1,1,4,0,2,1,0,0,0,0,1,0,3,1,3,0,1,2,1,2,1,0,0,1,0,3,1,0,3,2,2,0,1,0,0,0,0,0,0,2,2,0,2,1,1,0,2,0,1,0,0,0,2,2,0,0,3,2,1,1,1,2,0,1,1,0,1,1,3,1,1,2,0,3,1,0,0,0,1,0,1,0,1,0,0,3,0,2,2,1,1,0,2,0,0,1,0,0,2,3,1,2,2,1,1,1,0,1,0,3,3,1,1,2]},{"counters":[2,1,2,0,0,1,2,0,0,2,1,0,2,0,2,2,0,1,2,1,2,2,0,0,0,0,2,1,1,4,1,2,1,2,3,4,0,2,2,2,0,1,2,0,1,2,2,1,1,0,2,0,0,1,2,1,0,0,0,0,1,3,2,1,1,1,2,0,1,0,0,1,2,1,0,2,1,1,0,0,2,0,0,0,0,2,1,1,0,4,0,0,0,0,1,0,2,1,0,2,0,0,2,0,0,1,0,1,1,0,1,0,2,1,2,0,1,3,0,0,0,0,0,1,0,0,3,1,1,0,3,3,0,1,1,1,1,0,1,1,3,2,1,0,0,0,0,1,1,5,1,3,1,1,1,0,1,1,1,1,2,1,1,2,2,0,1,1,0,0,2,0,0,0,2,1,2,1,1,1,0,1,2,0,1,1,1,0,1,2,1,2,1,2,3,2,0,0,0,1,2,0,1,1,1,0,1,1,3,2,1,2,2,1,2,2,1,1,0,1,1,1,0,0,2,0,2,2,3,0,2,1,1,0,1,2,0,1,1,3,1,0,2,2,2,1,0,1,2,2,1,0,2,2,1,0,3,0,0,2,2,1,1,1,1,1,1,1,1,0,3,0,1,0,0,2,0,0,0,1,3,1,1,1,1,0,2,1,0,0,2,0,1,2,0,0,0,1,2,2,3,0,0,0,1,0,0,0,0,0,0,1,0,2,2,0,0,1,0,0,2,2,2,1,4,0,1,0,0,0,1,3,1,4,0,1,2,2,2,1,1,0,2,1,0,0,1,0,0,0,0,0,1,1,2,1,0,2,2,1,0,0,1,0,1,0,2,0,3,0,0,1,0,0,1,0,3,3,3,0,0,2,0,1,2,0,0,1,2,1,0,0,0,0,0,1,2,4,2,0,1,0,0,1,1,1,0,1,0,0,2,2,1,2,2,2,1,1,1,0,1,1,0,4,0,1,1,1,0,1,2,2,0,0,1,0,0,1,3,1,0,2,0,3,0,0,1,1,1,0,2,0,1,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,0,1,1,0,2,1,0,1,2,0,1,1,1,0,0,0,0,1,1,1,0,2,2,1,0,3,1,2,0,1,0,0,0,2,1,2,1,1,0,0,0,1,1,0,0,1,0,1,1,0,2,1,1,0,0,1,0,1,1,0,0,2,2,0,1,2,1,1,1,0,1,1,0,1,0,2,1,1,0,2,1,1,0,1,0,2,2,1,0,0,4,1,2,2,0,2,1,0,0,0,1,0,4,4,0,1,2,1,0,1,0,2,0,0,0,0,1,1,3,0,0,1,1,2,1,0,0,1,0,0,1,1,2,0,1,0,2,1,1,1,2,1,3,0,0,2,1,1,4,0,1,0,2,1,1,0,1,1,0,3,1,0,0,1,2,0,0,0,0,0,0,1,3,1,0,1,1,1,1,1,1,2,0,1,0,1,3,1,0,2,1,1,1,1,0,1,0,1,0,1,2,0,1,0,0,1,2,2,2,1,1,3,1,1,0,2,0,0,2,0,0,2,0,0,3,0,0,1,2,2,2,0,1,0,1,0,1,1,0,1,0,1,1,1,0,1,0,3,1,0,2,0,2,1,2,2,0,0,0,2,0,0,0,0,1,1,1,0,0,0,1,2,2,2,1,0,2,0,1,1,0,2,2,0,0,2,1,0,1,1,1,0,0,2,0,1,0,0,1,0,0,1,0,1,1,1,1,0,0,0,0,1,0,4,2,2,0,2,2,2,1,1,1,0,0,1,0,1,3,3,1,3,1,0,0,0,1,0,2,1,1,1,1,2,1,1,0,1,0,1,0,0,1,0,0,0,1,2,1,0,1,1,0,1,0,0,1,1,4,3,0,0,1,0,2,2,2,2,4,1,0,2,2,2,2,0,1,1,1,1,0,0,1,1,1,1,0,0,0,1,2,0,0,0,1,0,0,1,0,1,1,1,0,1,0,0,0,2,2,1,0,2,1,1,0,1,1,1,0,2,0,3,1,1,1,2,0,2,3,2,0,1,1,0,1,0,1,0,1,3,2,0,2,1,1,1,1,0,2,1,0,1,0,2,0,0,0,1,1,0,3,0,0,0,1,2,1,0,1,3,1,1,2,0,1,2,0,1,0,1,0,1,2,0,2,1,0,0,1,0,2,2,1,0,2,0,1,1,0,2,0,0,0,1,0,3,0,0,0,0,2,2,0,1,2,0,2,1,1,1,3,1,1,3,1,1,2,0,2,1,1,2,0,0,1,1,1,2,2,1,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,0,1,1,0,5,1,0,2,2,0,0,0,0,2,1,0,1,2,1,0,0,1,1,2,0,0,3,0,1,1,0,1,4,2,0,2,2,1,1,0,0,0,1,0,0,0,2,2,0,3,4,0,2,1,2,0,2,0,2,0,1,0,0,1,0,3,0,0,1,0,0,0,2,1,0,1,1,1,1,1,0,1,1,1,1,2,1,1,2,0,0,0,1,1,2,1,2,1,0,1,0,0,2,0,1,0,1,1,2,3,0,4,1,4,1,0,0,2,1,2,0,2,0,2,1,5,0,0,0,1,4,1,1,1,1,0,0,0,2,0,2,1,0,3,2,1,0,0,1,1,2,0,0,2,1,4,2,4,1,0,1,0,1,0,1,0,1,0,4,0,2,1,1,2,1,1,0,3,0,1,0,2,0,2,1,1,2,0,3,1,1,0,2,1,2,0,0,2,4,0,0,3,0,1,1,1,1,0,1,0,2,2,0,2,1,2,2,1,1,0,0,2,1,2,1,0,0,1,1,1,0,0,0,3,1,0,0,2,1,1,0,2,2,1,3,0,0,0,2,1,2,1,1,0,4,2,0,0,0,0,1,0,1,1,0,0,0,0,1,1,2,3,3,0,1,3,0,1,1,0,2,0,0,2,0,1,0,1,1,0,0,1,0,3,0,1,1,3,2,0,3,1,1,2,1,1,0,1,2,1,1,1,1,0,1,3,1,0,2,1,2,0,1,0,0,1,3,2,2,1,3,1,1,1,2,0,0,1,1,1,0,1,4,2,2,1,0,0,0,1,1,0,0,0,2,3,1,0,3,2,2,1,1,0,0,1,3,1,1,1,1,1,2,0,0,1,1,3,0,1,1,4,0,0,0,3,1,0,0,1,0,1,1,0,0,0,1,2,0,0,2,1,2,3,2,0,0,0,1,0,3,0,3,3,3,1,2,1,2,0,2,1,0,2,1,0,0,0,4,1,2,1,1,0,1,0,0,1,0,1,1,2,0,1,0,0,3,0,1,0,3,1,0,2,0,2,1,0,1,0,1,1,2,0,2,1,0,0,3,0,2,0,1,1,1,1,1,0,0,1,2,0,1,2,1,4,1,0,0,1,0,2,2,1,0,0,0,1,3,2,2,0,0,0,3,2,0,0,0,0,2,1,2,1,1,1,2,1,2,2,0,0,0,2,0,5,1,0,1,0,2,0,1,3,1,1,1,0,0,2,1,0,1,1,1,5,1,0,1,1,0,1,2,2,0,0,0,2,2,0,2,1,0,0,0,2,2,0,1,1,0,1,0,0,1,1,1,0,0,0,0,1,0,1,0,4,0,1,2,1,0,3,1,0,0,2,0,0,2,0,1,0,3,1,2,0,3,1,3,0,1,1,0,0,0,0,5,0,0,0,0,1,1,0,2,0,0,1,2,1,0,1,0,1,0,1,1,0,0,2,3,0,0,0,0,1,0,3,2,3,1,1,0,1,0,1,1,0,1,1,0,0,1,0,3,0,0,0,1,2,0,1,2,3,0,0,2,2,1,1,0,1,1,1,0,1,0,2,0,1,0,1,1,2,1,2,1,1,2,2,1,1,0,0,1,2,1,0,2,2,1,1,0,1,1,1,1,0,2,2,2,0,0,1,2,1,1,1,2,0,1,0,1,1,0,1,0,1,0,2,1,1,2,0,2,0,1,1,1,0,0,0,0,0,0,2,1,0,1,1,0,1,1,1,1,1,0,0,0,0,0,0,2,0,3,1,0,2,1,1,1,1,3,4,1,0,0,0,1,2,0,2,1,0,1,0,1,0,0,3,0,0,0,1,1,2,3,0,0,0,1,0,1,0,0,2,2,2,0,1,1,2,2,4,0,0,1,1,0,1,2,3,0,3,0,2,0,2,4,0,0,1,0,1,0,0,2,1,2,3,0,1,0,0,4,1,2,2,0,0,0,1,1,0,0,0,0,1,1,2,1,1,1,1,2,1,1,1,3,0,2,1,1,1,1,0,1,2,0,1,3,0,0,0,1,0,1,0,0,1,1,1,0,2,2,1,1,2,1,3,1,0,0,2,1,1,1,0,1,1,1,0,2,0,1,1,0,1,2,0,1,3,0,2,2,1,2,2,1,0,1,1,4,0,1,2,0,0,1,1,3,2,1,3,1,1,1,3,4,0,1,1,0,1,4,1,2,0,0,0,0,1,2,1,1,2,1,2,1,4,2,1,3,0,1,0,2,0,0,3,2,1,0,0,2,1,3,3,0,0,0,2,0,1,1,0,2,2,0,3,1,1,0,1,2]}]},"null_count":0,"last_update_version":397952047127986176}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_005.json b/cmd/explaintest/s/explain_complex_stats_tbl_005.json deleted file mode 100644 index dd8b09a5544ca..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_005.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_005","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxMzgzNDEzODM=","upper_bound":"LTIxMzM2NDM5NDQ=","repeats":1},{"count":16,"lower_bound":"LTIxMjY0Nzg5MzE=","upper_bound":"LTIxMjMzNzA4Mjc=","repeats":1},{"count":24,"lower_bound":"LTIxMTc5MTc2ODI=","upper_bound":"LTIxMTIwNzI4ODI=","repeats":1},{"count":32,"lower_bound":"LTIxMTA1NjUwMjM=","upper_bound":"LTIxMDc4MDA2MDA=","repeats":1},{"count":40,"lower_bound":"LTIwOTgwMzc2MDc=","upper_bound":"LTIwODgyODE2NzA=","repeats":1},{"count":48,"lower_bound":"LTIwODYxMzUwOTM=","upper_bound":"LTIwNzE1Njc5OTM=","repeats":1},{"count":56,"lower_bound":"LTIwNjUxMjQxNzc=","upper_bound":"LTIwNTYxMDYzNzc=","repeats":1},{"count":64,"lower_bound":"LTIwNTIzNDUyNDk=","upper_bound":"LTIwMzE5NjAwNDc=","repeats":1},{"count":72,"lower_bound":"LTIwMzEwMTk4NjE=","upper_bound":"LTIwMjEwNTgwNjQ=","repeats":1},{"count":80,"lower_bound":"LTIwMTI1MDg4NjY=","upper_bound":"LTE5OTM2MjQ0OTk=","repeats":1},{"count":88,"lower_bound":"LTE5OTEwMzg2MjE=","upper_bound":"LTE5ODA2MzcyMzA=","repeats":1},{"count":96,"lower_bound":"LTE5NzY0NDk0OTU=","upper_bound":"LTE5NjQyMjM5ODY=","repeats":1},{"count":104,"lower_bound":"LTE5NTUzNjY1MzI=","upper_bound":"LTE5NDI0ODQxMDc=","repeats":1},{"count":112,"lower_bound":"LTE5Mzk0OTQyNjk=","upper_bound":"LTE5MTc4NzA1NTU=","repeats":1},{"count":120,"lower_bound":"LTE5MTE0MTU5MTM=","upper_bound":"LTE4OTMzODMxNjM=","repeats":1},{"count":128,"lower_bound":"LTE4ODQ1NjYwNzM=","upper_bound":"LTE4NzI2MDk5MjM=","repeats":1},{"count":136,"lower_bound":"LTE4NzA1MDIxMTY=","upper_bound":"LTE4NjEzMjg0OTg=","repeats":1},{"count":144,"lower_bound":"LTE4NTA1ODk3MjM=","upper_bound":"LTE4Mzc5OTQxNDQ=","repeats":1},{"count":152,"lower_bound":"LTE4MjkyNDM4MzA=","upper_bound":"LTE4MTQ4NzgwMTE=","repeats":1},{"count":160,"lower_bound":"LTE4MTE4NDIwOTQ=","upper_bound":"LTE3OTk3MDcwMzk=","repeats":1},{"count":168,"lower_bound":"LTE3OTgyNDg2MjA=","upper_bound":"LTE3OTMzMDM0NTQ=","repeats":1},{"count":176,"lower_bound":"LTE3ODU5MjQxMjQ=","upper_bound":"LTE3NzQ5MDc0NzA=","repeats":1},{"count":184,"lower_bound":"LTE3NzAyMTI0MTg=","upper_bound":"LTE3NTUzNDAyNzE=","repeats":1},{"count":192,"lower_bound":"LTE3NTM4MjkwNDA=","upper_bound":"LTE3NDEzNzgwMDc=","repeats":1},{"count":200,"lower_bound":"LTE3MzgyMTQ0NDI=","upper_bound":"LTE3MzAzOTY4MDQ=","repeats":1},{"count":208,"lower_bound":"LTE3MjQ2NzA4NDM=","upper_bound":"LTE3MTE4MDgyOTc=","repeats":1},{"count":216,"lower_bound":"LTE3MTE2ODkyODE=","upper_bound":"LTE2OTIyNTA3NTI=","repeats":1},{"count":224,"lower_bound":"LTE2OTE1MzQ2NzM=","upper_bound":"LTE2ODc4NDcwMTI=","repeats":1},{"count":232,"lower_bound":"LTE2ODY2MTY4NjM=","upper_bound":"LTE2NjM0MDY1NDE=","repeats":1},{"count":240,"lower_bound":"LTE2NjI0ODQyNDc=","upper_bound":"LTE2NTk1MTI3OTQ=","repeats":1},{"count":248,"lower_bound":"LTE2NTg0NTg1OTk=","upper_bound":"LTE2NDY2MzE0NTY=","repeats":1},{"count":256,"lower_bound":"LTE2NDMwMDY4OTA=","upper_bound":"LTE2MzUxODY3MjU=","repeats":1},{"count":264,"lower_bound":"LTE2MzA4NTEyOTE=","upper_bound":"LTE2MjMyNTA3NTc=","repeats":1},{"count":272,"lower_bound":"LTE2MTc2NjUxODY=","upper_bound":"LTE2MTM0MzQ2NjU=","repeats":1},{"count":280,"lower_bound":"LTE2MTI0MTg0NTI=","upper_bound":"LTE2MDQzNzE1NDE=","repeats":1},{"count":288,"lower_bound":"LTE1OTgzNzcwMTY=","upper_bound":"LTE1NjYzNTUzNjE=","repeats":1},{"count":296,"lower_bound":"LTE1NjMyMzU5MDQ=","upper_bound":"LTE1NTQzMjQyNTk=","repeats":1},{"count":304,"lower_bound":"LTE1NDc5MTM5OTE=","upper_bound":"LTE1MzM4MTgzNDQ=","repeats":1},{"count":312,"lower_bound":"LTE1MzE3NjA1OTM=","upper_bound":"LTE1MDE4MTczMjU=","repeats":1},{"count":320,"lower_bound":"LTE0OTE5NzY4NTQ=","upper_bound":"LTE0NzkzNzE0NDM=","repeats":1},{"count":328,"lower_bound":"LTE0NzkzNjA4NzE=","upper_bound":"LTE0NjQyMzgwNzU=","repeats":1},{"count":336,"lower_bound":"LTE0NjQwMjE3NzY=","upper_bound":"LTE0NjA3MjM2NDU=","repeats":1},{"count":344,"lower_bound":"LTE0NDc0MDQ5Mjc=","upper_bound":"LTE0MzUzMDk2Mzk=","repeats":1},{"count":352,"lower_bound":"LTE0MzE2NTA5NjQ=","upper_bound":"LTE0MTg3MDUxOTI=","repeats":1},{"count":360,"lower_bound":"LTE0MTc0NDgwMjA=","upper_bound":"LTE0MTQ4MDE3NDc=","repeats":1},{"count":368,"lower_bound":"LTE0MTQwNzIxODI=","upper_bound":"LTE0MDE3NzA0NDM=","repeats":1},{"count":376,"lower_bound":"LTE0MDAwMjA2Njc=","upper_bound":"LTEzNjA0OTYzMDE=","repeats":1},{"count":384,"lower_bound":"LTEzNTc2MTQ5OTU=","upper_bound":"LTEzNTU1MTkyMDg=","repeats":1},{"count":392,"lower_bound":"LTEzNTMwNjkwMDM=","upper_bound":"LTEzNDc5NTI1NjE=","repeats":1},{"count":400,"lower_bound":"LTEzMzk0MTA5NDY=","upper_bound":"LTEzMjUxNzI1NDI=","repeats":1},{"count":408,"lower_bound":"LTEzMjQzODk0NzM=","upper_bound":"LTEzMTQ2NDAyMDM=","repeats":1},{"count":416,"lower_bound":"LTEzMDc2ODU3NjE=","upper_bound":"LTEyOTUzOTY3MjQ=","repeats":1},{"count":424,"lower_bound":"LTEyOTUyNDk3NDg=","upper_bound":"LTEyNjYzNTY1MDk=","repeats":1},{"count":432,"lower_bound":"LTEyNjU0NjEyOTg=","upper_bound":"LTEyNTAxMzY5MTg=","repeats":1},{"count":440,"lower_bound":"LTEyNDg3Mjk2NzE=","upper_bound":"LTEyMzgzMDg0NTY=","repeats":1},{"count":448,"lower_bound":"LTEyMzM0Nzg0NzM=","upper_bound":"LTEyMjI5NzYyNTI=","repeats":1},{"count":456,"lower_bound":"LTEyMTQ3MDk0MzI=","upper_bound":"LTEyMDYyOTgwOTc=","repeats":1},{"count":464,"lower_bound":"LTEyMDM2ODM4ODQ=","upper_bound":"LTEyMDEyNTI0NjU=","repeats":1},{"count":472,"lower_bound":"LTExOTg2OTIzNjI=","upper_bound":"LTExODU1MjMzNzc=","repeats":1},{"count":480,"lower_bound":"LTExODM2NDA4ODE=","upper_bound":"LTExNzU5ODI4NzU=","repeats":1},{"count":488,"lower_bound":"LTExNzU5NDA1NDQ=","upper_bound":"LTExNzMwMDc5ODA=","repeats":1},{"count":496,"lower_bound":"LTExNjk4NDU3Nzk=","upper_bound":"LTExNjQ2OTU1Mjk=","repeats":1},{"count":504,"lower_bound":"LTExNTk2MTU5NTg=","upper_bound":"LTExNTczMTIwMzM=","repeats":1},{"count":512,"lower_bound":"LTExNTAwODQyODQ=","upper_bound":"LTExMzg1ODQxNjM=","repeats":1},{"count":520,"lower_bound":"LTExMzU2MzI5NDQ=","upper_bound":"LTExMTk4OTUwMzc=","repeats":1},{"count":528,"lower_bound":"LTExMTk0MDM2NDM=","upper_bound":"LTExMDY2NTE4NjQ=","repeats":1},{"count":536,"lower_bound":"LTExMDQwOTM5NDM=","upper_bound":"LTEwODA2NDk5MDY=","repeats":1},{"count":544,"lower_bound":"LTEwNzc3NTQzNDA=","upper_bound":"LTEwNjkzODQ1OTU=","repeats":1},{"count":552,"lower_bound":"LTEwNjc2Mjk4NTY=","upper_bound":"LTEwNTAwMDgzNTI=","repeats":1},{"count":560,"lower_bound":"LTEwNDk1ODc1NDY=","upper_bound":"LTEwMzI1NjA0Njk=","repeats":1},{"count":568,"lower_bound":"LTEwMjAxMjUwODI=","upper_bound":"LTEwMTM3NDM5MDE=","repeats":1},{"count":576,"lower_bound":"LTEwMTE5NDE4MzA=","upper_bound":"LTEwMDM1ODMxMzY=","repeats":1},{"count":584,"lower_bound":"LTEwMDExMTUzODY=","upper_bound":"LTk4NjkzNzE1Ng==","repeats":1},{"count":592,"lower_bound":"LTk4MjYxMTM5MA==","upper_bound":"LTk3MzMxMzI5MQ==","repeats":1},{"count":600,"lower_bound":"LTk2NzMyNDIzNA==","upper_bound":"LTk0NjAyOTg3OA==","repeats":1},{"count":608,"lower_bound":"LTk0NDMxNDQ3OA==","upper_bound":"LTk0MTU2NjcwMA==","repeats":1},{"count":616,"lower_bound":"LTkzNDU2MTc5OQ==","upper_bound":"LTkyMzI4NTY4MA==","repeats":1},{"count":624,"lower_bound":"LTkxODIzMjc4Nw==","upper_bound":"LTkxMTA2NTY4OQ==","repeats":1},{"count":632,"lower_bound":"LTkwODU0OTE4OQ==","upper_bound":"LTkwNDgzMTQxNw==","repeats":1},{"count":640,"lower_bound":"LTg5NDQ5NTQ5Ng==","upper_bound":"LTg3OTE4MjQ4Mw==","repeats":1},{"count":648,"lower_bound":"LTg2Mzc1ODcyOQ==","upper_bound":"LTg0NTE1NjQ5Mg==","repeats":1},{"count":656,"lower_bound":"LTgzODgwOTE4Ng==","upper_bound":"LTgyODc4NDg3Ng==","repeats":1},{"count":664,"lower_bound":"LTgyMjMyOTAwNg==","upper_bound":"LTgxNDUwODMxOQ==","repeats":1},{"count":672,"lower_bound":"LTgxMjgwNjk3OQ==","upper_bound":"LTc5NDQ2Mjg2OA==","repeats":1},{"count":680,"lower_bound":"LTc5NDA4MTYwOA==","upper_bound":"LTc4MzE0MzM2MQ==","repeats":1},{"count":688,"lower_bound":"LTc4Mjc1NjYzMA==","upper_bound":"LTc3NDIxMjA2Ng==","repeats":1},{"count":696,"lower_bound":"LTc2ODM4MjAzOA==","upper_bound":"LTc1NDI0MDg1Ng==","repeats":1},{"count":704,"lower_bound":"LTc0Nzg5NTc4Nw==","upper_bound":"LTczNzk4NzcwMA==","repeats":1},{"count":712,"lower_bound":"LTczMjA4MTgxOA==","upper_bound":"LTcxODQ0NjIwNg==","repeats":1},{"count":720,"lower_bound":"LTcxNzEwMDE0MQ==","upper_bound":"LTcwNDg3NTQ4OA==","repeats":1},{"count":728,"lower_bound":"LTcwNDQwODUzNQ==","upper_bound":"LTY5MjI1Mzc4Mw==","repeats":1},{"count":736,"lower_bound":"LTY5MDMzMDI5NQ==","upper_bound":"LTY3Njc2MTM1NQ==","repeats":1},{"count":744,"lower_bound":"LTY3MzgwMTA0Mw==","upper_bound":"LTY2NjE3Njg4Nw==","repeats":1},{"count":752,"lower_bound":"LTY1NjkwODU1Nw==","upper_bound":"LTY0NjYyODYwOA==","repeats":1},{"count":760,"lower_bound":"LTY0MzE0NDI5MQ==","upper_bound":"LTYxNzQyNTE3Mg==","repeats":1},{"count":768,"lower_bound":"LTYxMDk5MzExMA==","upper_bound":"LTU4Njc5Njc1MQ==","repeats":1},{"count":776,"lower_bound":"LTU3ODAzMDc5MQ==","upper_bound":"LTU2NzU2NDI3Mg==","repeats":1},{"count":784,"lower_bound":"LTU2MTAzMzg3Mg==","upper_bound":"LTU1NzQ3NTE4MA==","repeats":1},{"count":792,"lower_bound":"LTU1NjExODM2MQ==","upper_bound":"LTU0ODMzNjAxNw==","repeats":1},{"count":800,"lower_bound":"LTUyODMxODE4MQ==","upper_bound":"LTUxNTEyNDIzNA==","repeats":1},{"count":808,"lower_bound":"LTUwNTU3MDkxOA==","upper_bound":"LTQ4NDE0OTQ2MQ==","repeats":1},{"count":816,"lower_bound":"LTQ3NTQ2NDYzNw==","upper_bound":"LTQ2ODgyOTg0Mw==","repeats":1},{"count":824,"lower_bound":"LTQ2Nzc0MDk5Ng==","upper_bound":"LTQ2MTU2NzcxNg==","repeats":1},{"count":832,"lower_bound":"LTQ1ODY1NjI2NA==","upper_bound":"LTQzNDk1MzcwNA==","repeats":1},{"count":840,"lower_bound":"LTQyNzQ2NDcyOQ==","upper_bound":"LTQwNDAwMzk0OQ==","repeats":1},{"count":848,"lower_bound":"LTQwMjAyNDAzNw==","upper_bound":"LTM5MTc0MTk4MQ==","repeats":1},{"count":856,"lower_bound":"LTM4OTUwNjc3OA==","upper_bound":"LTM3NTM0MjI0OQ==","repeats":1},{"count":864,"lower_bound":"LTM2OTM5MzM5OA==","upper_bound":"LTM2Mzk0NDUwMw==","repeats":1},{"count":872,"lower_bound":"LTM2MTcxOTkwMw==","upper_bound":"LTM0NTA0OTA0Mw==","repeats":1},{"count":880,"lower_bound":"LTM0MjczNzM1Mw==","upper_bound":"LTMyNzEyNjU1NA==","repeats":1},{"count":888,"lower_bound":"LTMyNzEwODg4Mw==","upper_bound":"LTMyMTk0MzgxOQ==","repeats":1},{"count":896,"lower_bound":"LTMxNTc1NzU1Mg==","upper_bound":"LTMwMjAzMTg5NQ==","repeats":1},{"count":904,"lower_bound":"LTMwMDA4MjA4NQ==","upper_bound":"LTI4NjU1MTc3Nw==","repeats":1},{"count":912,"lower_bound":"LTI4NTQzMDE5OA==","upper_bound":"LTI3MTkyMjU4MQ==","repeats":1},{"count":920,"lower_bound":"LTI2NjI5NDk0Ng==","upper_bound":"LTI1NzEwMTI3MQ==","repeats":1},{"count":928,"lower_bound":"LTI1Mzk1ODMwOA==","upper_bound":"LTIzNjgyNDQxMQ==","repeats":1},{"count":936,"lower_bound":"LTIzNTY0MzUyMA==","upper_bound":"LTIyMDk4MjgwMw==","repeats":1},{"count":944,"lower_bound":"LTIxNzUwNTUyOA==","upper_bound":"LTIwNTA0MDg1MA==","repeats":1},{"count":952,"lower_bound":"LTE5ODAxOTc5Ng==","upper_bound":"LTE5MzYxNjY0Ng==","repeats":1},{"count":960,"lower_bound":"LTE4NTQwMDc1NA==","upper_bound":"LTE3MzYyMzc5NQ==","repeats":1},{"count":968,"lower_bound":"LTE2OTU3MjIzNg==","upper_bound":"LTE2NzUyNTY4MQ==","repeats":1},{"count":976,"lower_bound":"LTE2NTI0MDk0NQ==","upper_bound":"LTE1MjAyOTg2MA==","repeats":1},{"count":984,"lower_bound":"LTE1MTEzMTc1NA==","upper_bound":"LTEzNDgwNzk0Mw==","repeats":1},{"count":992,"lower_bound":"LTEzNDQ4MzkwMw==","upper_bound":"LTExMTIyODMwMg==","repeats":1},{"count":1000,"lower_bound":"LTEwODM2MTc4Mw==","upper_bound":"LTEwMjYwNzg3OA==","repeats":1},{"count":1008,"lower_bound":"LTk5ODI1NzA4","upper_bound":"LTc2MjE5MTM3","repeats":1},{"count":1016,"lower_bound":"LTcyMjM4NTQ3","upper_bound":"LTU1MDgwNTky","repeats":1},{"count":1024,"lower_bound":"LTUzNzEyOTc5","upper_bound":"LTMxODI4NTY2","repeats":1},{"count":1032,"lower_bound":"LTI4NTkyNTQ5","upper_bound":"LTIyNjU1MDcy","repeats":1},{"count":1040,"lower_bound":"LTE5MDE5NTI5","upper_bound":"LTExMTI3MTA2","repeats":1},{"count":1048,"lower_bound":"LTU3NTUxMTQ=","upper_bound":"MzQwMzY4OQ==","repeats":1},{"count":1056,"lower_bound":"MTA2MTIxMzU=","upper_bound":"MjYxNTIwOTI=","repeats":1},{"count":1064,"lower_bound":"Mjg2NDc5MTY=","upper_bound":"MzY4MzI0NTA=","repeats":1},{"count":1072,"lower_bound":"NTM0MzcwMzY=","upper_bound":"NjA2NzQzNTU=","repeats":1},{"count":1080,"lower_bound":"MTAwNjIwNzQ5","upper_bound":"MTEyNDg5MDI0","repeats":1},{"count":1088,"lower_bound":"MTE3NDkyMDg2","upper_bound":"MTI0OTE0NTAz","repeats":1},{"count":1096,"lower_bound":"MTI2NjQ2Mzkw","upper_bound":"MTM1NjY2Mjg2","repeats":1},{"count":1104,"lower_bound":"MTQwNjQ3MDA4","upper_bound":"MTQ3MTg4NDA5","repeats":1},{"count":1112,"lower_bound":"MTQ5MzA2MjMz","upper_bound":"MTcyNTA0MTE5","repeats":1},{"count":1120,"lower_bound":"MTcyOTIxMTI0","upper_bound":"MTk2MDQ3NDc1","repeats":1},{"count":1128,"lower_bound":"MjA5NjY1Nzc2","upper_bound":"MjMwMzQyMDk0","repeats":1},{"count":1136,"lower_bound":"MjM2MTA1Njk5","upper_bound":"MjY0MjUyNTQ0","repeats":1},{"count":1144,"lower_bound":"MjY0ODk1MDc1","upper_bound":"Mjc1MTM1ODAw","repeats":1},{"count":1152,"lower_bound":"Mjc4NDU0ODA1","upper_bound":"MjkyMDUxODI5","repeats":1},{"count":1160,"lower_bound":"Mjk1NTU0OTgy","upper_bound":"Mjk5MDI5MjI2","repeats":1},{"count":1168,"lower_bound":"MzExOTUwNjEy","upper_bound":"MzE3NDE5NjEy","repeats":1},{"count":1176,"lower_bound":"MzE4MzMyNDgz","upper_bound":"MzM1NDEzNDY3","repeats":1},{"count":1184,"lower_bound":"MzU1NDQ1MzYy","upper_bound":"MzY1OTU0ODA3","repeats":1},{"count":1192,"lower_bound":"MzcwNjI1NzA5","upper_bound":"MzkwMDUwMTA0","repeats":1},{"count":1200,"lower_bound":"MzkyMjM3NTQz","upper_bound":"NDEyNDQ3ODE0","repeats":1},{"count":1208,"lower_bound":"NDI3MDU0Nzc4","upper_bound":"NDQxODg2MzUy","repeats":1},{"count":1216,"lower_bound":"NDQ1OTc1ODg3","upper_bound":"NDY0MzAzMjY0","repeats":1},{"count":1224,"lower_bound":"NDc2NzI1OTY1","upper_bound":"NDgzMDE0Njc1","repeats":1},{"count":1232,"lower_bound":"NDg2ODU2ODU0","upper_bound":"NDk0MDQ4NjQ5","repeats":1},{"count":1240,"lower_bound":"NDk5NzY3MDE1","upper_bound":"NTA3NjU3NTgy","repeats":1},{"count":1248,"lower_bound":"NTA4ODk0ODEy","upper_bound":"NTEyMDQzMjE0","repeats":1},{"count":1256,"lower_bound":"NTE1MjQyMDgw","upper_bound":"NTI0NjQ4MDM4","repeats":1},{"count":1264,"lower_bound":"NTM4MDI2Mjc3","upper_bound":"NTQ2MTc5NzQw","repeats":1},{"count":1272,"lower_bound":"NTUxODAyNzg1","upper_bound":"NTY1NTg5Nzc3","repeats":1},{"count":1280,"lower_bound":"NTY5MjQyODQ0","upper_bound":"NTczMTI1NTYy","repeats":1},{"count":1288,"lower_bound":"NTg2NTQ1MzE0","upper_bound":"NjEzMDg0MTcx","repeats":1},{"count":1296,"lower_bound":"NjE1NjU5MjMx","upper_bound":"NjIwMjA1ODEx","repeats":1},{"count":1304,"lower_bound":"NjI4Njc2NzUx","upper_bound":"NjMzNjU3MjEw","repeats":1},{"count":1312,"lower_bound":"NjM1ODI0NDQw","upper_bound":"NjM5NzE3NDI1","repeats":1},{"count":1320,"lower_bound":"NjQ5NjI2OTAy","upper_bound":"NjU0MjI5ODM5","repeats":1},{"count":1328,"lower_bound":"NjU2Mjk3OTM0","upper_bound":"NjczMzU3Mjk4","repeats":1},{"count":1336,"lower_bound":"Njg0MjkzNzU1","upper_bound":"NjkyOTEwNDI2","repeats":1},{"count":1344,"lower_bound":"Njk2NTE2NjM1","upper_bound":"NzAyMDI1MDU4","repeats":1},{"count":1352,"lower_bound":"NzAzNjU4OTIx","upper_bound":"NzExMzMzODQ3","repeats":1},{"count":1360,"lower_bound":"NzExMzg5NTI0","upper_bound":"NzM4MTMyOTU2","repeats":1},{"count":1368,"lower_bound":"NzM5MTgyODE2","upper_bound":"NzYyNTk0MjI4","repeats":1},{"count":1376,"lower_bound":"NzY0MDk0NjM3","upper_bound":"Nzc3NTUxNjEx","repeats":1},{"count":1384,"lower_bound":"Nzc5Nzk1OTUw","upper_bound":"NzkwMzk5NDM1","repeats":1},{"count":1392,"lower_bound":"NzkxMDY3NDE0","upper_bound":"ODAwOTU2MzA0","repeats":1},{"count":1400,"lower_bound":"ODA0Nzk4NjU2","upper_bound":"ODA2NzQwMDQz","repeats":1},{"count":1408,"lower_bound":"ODE0NTY0NTY0","upper_bound":"ODMwNDkyMDI3","repeats":1},{"count":1416,"lower_bound":"ODM0MzQ0NTA1","upper_bound":"ODQ0MzE4NjMx","repeats":1},{"count":1424,"lower_bound":"ODUxMTAyMTM2","upper_bound":"ODU5MjEzMzI1","repeats":1},{"count":1432,"lower_bound":"ODYwODU3NDE3","upper_bound":"ODc0NTIxMzk1","repeats":1},{"count":1440,"lower_bound":"ODc0Nzk3MDMy","upper_bound":"ODgyNDA4NjQz","repeats":1},{"count":1448,"lower_bound":"ODg0ODk4OTU5","upper_bound":"OTE0OTU3NzUy","repeats":1},{"count":1456,"lower_bound":"OTE5Nzg3NzEw","upper_bound":"OTMzNDQwOTY5","repeats":1},{"count":1464,"lower_bound":"OTQ5NjI2ODI3","upper_bound":"OTY0MTEwMTU0","repeats":1},{"count":1472,"lower_bound":"OTcyMjE1NDkz","upper_bound":"OTg0MzA5ODQ1","repeats":1},{"count":1480,"lower_bound":"OTg2MDQ1Mzcy","upper_bound":"OTk5Mzc4Njc3","repeats":1},{"count":1488,"lower_bound":"OTk5NzU5NzE4","upper_bound":"MTAxOTI4MzA4Mw==","repeats":1},{"count":1496,"lower_bound":"MTAyOTIwNzczNw==","upper_bound":"MTA0NDg5NzEyNA==","repeats":1},{"count":1504,"lower_bound":"MTA0NzIyNzQ1Mw==","upper_bound":"MTA3MDY2NTIwNw==","repeats":1},{"count":1512,"lower_bound":"MTA4Nzc3MTM5Ng==","upper_bound":"MTEwMDc5NzUzMg==","repeats":1},{"count":1520,"lower_bound":"MTEwMTMzNTM5Ng==","upper_bound":"MTExMjA4NzEzNA==","repeats":1},{"count":1528,"lower_bound":"MTExMjg1NTYyMw==","upper_bound":"MTExOTI1NjI1OQ==","repeats":1},{"count":1536,"lower_bound":"MTEyNzQ0NzQwMw==","upper_bound":"MTEyOTcyNDcwMQ==","repeats":1},{"count":1544,"lower_bound":"MTEzMDY5MjcyOA==","upper_bound":"MTEzNjgzMDMzOQ==","repeats":1},{"count":1552,"lower_bound":"MTE0MDQ0MTA2Ng==","upper_bound":"MTE1NTk3NDI0MQ==","repeats":1},{"count":1560,"lower_bound":"MTE1Njk5MzY5Mw==","upper_bound":"MTE3MTIyMTkyOA==","repeats":1},{"count":1568,"lower_bound":"MTE3NzExNDY3MQ==","upper_bound":"MTE5MTk2NjkzNw==","repeats":1},{"count":1576,"lower_bound":"MTIwMTQyNTE3NA==","upper_bound":"MTIxNDQ1OTUwMg==","repeats":1},{"count":1584,"lower_bound":"MTIxNDk3MDQ5NA==","upper_bound":"MTIzOTI2OTA4Mw==","repeats":1},{"count":1592,"lower_bound":"MTI0MTUzMjM5NA==","upper_bound":"MTI0NDg1NjU3NQ==","repeats":1},{"count":1600,"lower_bound":"MTI0NzI2NjY1MQ==","upper_bound":"MTI2MDUzOTc0NA==","repeats":1},{"count":1608,"lower_bound":"MTI2MjA4ODU3Mw==","upper_bound":"MTI3NzE5NTUwOA==","repeats":1},{"count":1616,"lower_bound":"MTI4NDUwNjA4OA==","upper_bound":"MTI5OTQxMTY3Ng==","repeats":1},{"count":1624,"lower_bound":"MTMwMTQ2NzM5OQ==","upper_bound":"MTMwNjMwOTEwMg==","repeats":1},{"count":1632,"lower_bound":"MTMwNjU2MDU5Mw==","upper_bound":"MTMxNTc2OTI1MQ==","repeats":1},{"count":1640,"lower_bound":"MTMxOTg0Njc2MQ==","upper_bound":"MTM0MDMyNTc1OA==","repeats":1},{"count":1648,"lower_bound":"MTM0Mjc5MzcwNg==","upper_bound":"MTM1MDEzMjk3MQ==","repeats":1},{"count":1656,"lower_bound":"MTM1NTI2MjAzNw==","upper_bound":"MTM2Mzk3NTUwNg==","repeats":1},{"count":1664,"lower_bound":"MTM2NDExODIyOA==","upper_bound":"MTM4MTM5ODk3Nw==","repeats":1},{"count":1672,"lower_bound":"MTM4MzQwMDAxNA==","upper_bound":"MTM4NTExNzUzOQ==","repeats":1},{"count":1680,"lower_bound":"MTM5NzQyMTIyNg==","upper_bound":"MTQyMjU2MDY4OQ==","repeats":1},{"count":1688,"lower_bound":"MTQzMDcxMDQyNg==","upper_bound":"MTQzNzY0OTk5OA==","repeats":1},{"count":1696,"lower_bound":"MTQzOTEwNjI0Ng==","upper_bound":"MTQ0OTU3OTcxOA==","repeats":1},{"count":1704,"lower_bound":"MTQ1MzYyOTcxMw==","upper_bound":"MTQ2NDAyMjUxNw==","repeats":1},{"count":1712,"lower_bound":"MTQ4MzgzNjY5MA==","upper_bound":"MTUxMTc1MTYxNA==","repeats":1},{"count":1720,"lower_bound":"MTUxMzYwODczMg==","upper_bound":"MTUyNzYyOTk2MQ==","repeats":1},{"count":1728,"lower_bound":"MTUzNTQ4ODczMQ==","upper_bound":"MTU0ODMwNTUyNg==","repeats":1},{"count":1736,"lower_bound":"MTU0OTYxNDI4NA==","upper_bound":"MTU1MTc1MjI2OQ==","repeats":1},{"count":1744,"lower_bound":"MTU1NDgwNDg1Mg==","upper_bound":"MTU2NjU4NzU3MA==","repeats":1},{"count":1752,"lower_bound":"MTU3MzQ0OTI1MQ==","upper_bound":"MTU3ODkyMjE1Ng==","repeats":1},{"count":1760,"lower_bound":"MTU4NjM4MTU5OA==","upper_bound":"MTYxODM3OTcxNA==","repeats":1},{"count":1768,"lower_bound":"MTYyMzc4NTAxMA==","upper_bound":"MTYzMzg2NjM1Nw==","repeats":1},{"count":1776,"lower_bound":"MTYzOTU2NDA0MQ==","upper_bound":"MTY1MzM0NjU1OQ==","repeats":1},{"count":1784,"lower_bound":"MTY1MzU2NDk0MA==","upper_bound":"MTY2NjU4MjUyMA==","repeats":1},{"count":1792,"lower_bound":"MTY3NzM5MzIwNg==","upper_bound":"MTcwNDMxNjU2Nw==","repeats":1},{"count":1800,"lower_bound":"MTcwNTUzNzYyMw==","upper_bound":"MTcwOTkxMTcwNw==","repeats":1},{"count":1808,"lower_bound":"MTcxNDMxMTI3Mg==","upper_bound":"MTcxOTA1OTkzMA==","repeats":1},{"count":1816,"lower_bound":"MTcyNzk5NjEwOQ==","upper_bound":"MTc0NTc5NDI4OA==","repeats":1},{"count":1824,"lower_bound":"MTc1MDA3NDcwNg==","upper_bound":"MTc3MTk1NDkzNQ==","repeats":1},{"count":1832,"lower_bound":"MTc3Mzc2NTU0MA==","upper_bound":"MTc3ODY0NjY2NQ==","repeats":1},{"count":1840,"lower_bound":"MTc5MzkyNTk5MA==","upper_bound":"MTgwMjgyNzQ0OQ==","repeats":1},{"count":1848,"lower_bound":"MTgwNTc0MjYwNg==","upper_bound":"MTgxMzM4ODYxNA==","repeats":1},{"count":1856,"lower_bound":"MTgxMzgwMDIxNA==","upper_bound":"MTgyMDkxODA3OQ==","repeats":1},{"count":1864,"lower_bound":"MTgyMTYwNzM2NA==","upper_bound":"MTg1MjIyMDgyNQ==","repeats":1},{"count":1872,"lower_bound":"MTg1NDQyNTMzMQ==","upper_bound":"MTg1ODUzMDY4Nw==","repeats":1},{"count":1880,"lower_bound":"MTg2MDMzODEwNg==","upper_bound":"MTg3MzQ3MTQ3OA==","repeats":1},{"count":1888,"lower_bound":"MTg3NTMyNjYzNA==","upper_bound":"MTg5MDk2NjcyOQ==","repeats":1},{"count":1896,"lower_bound":"MTg5MTI0NDUyMg==","upper_bound":"MTkwODU2NDAyNA==","repeats":1},{"count":1904,"lower_bound":"MTkwOTgxMDY3OA==","upper_bound":"MTkxOTM4NTM3Mw==","repeats":1},{"count":1912,"lower_bound":"MTkyNDIzODUwMA==","upper_bound":"MTk1MjAzNDExNw==","repeats":1},{"count":1920,"lower_bound":"MTk1NzI0NTE3MA==","upper_bound":"MTk2NTU0Nzg2NQ==","repeats":1},{"count":1928,"lower_bound":"MTk2ODYyMzY2Nw==","upper_bound":"MTk3NjIyMjA0OA==","repeats":1},{"count":1936,"lower_bound":"MTk3NzYxODc5NA==","upper_bound":"MTk5NzczMzk2MA==","repeats":1},{"count":1944,"lower_bound":"MTk5ODY4OTY1NQ==","upper_bound":"MjAyNzEyODA3MQ==","repeats":1},{"count":1952,"lower_bound":"MjAyODAyMDQ2MA==","upper_bound":"MjA2MjMzMDA0Mw==","repeats":1},{"count":1960,"lower_bound":"MjA2MjQ1MzU2MQ==","upper_bound":"MjA3MzA4NjkzNA==","repeats":1},{"count":1968,"lower_bound":"MjA3NjQ3NDk0OQ==","upper_bound":"MjA4NjczNTQ5Mg==","repeats":1},{"count":1976,"lower_bound":"MjA5MDczMjI5Nw==","upper_bound":"MjA5MzgzNzMyMA==","repeats":1},{"count":1984,"lower_bound":"MjA5OTIyMjI3MQ==","upper_bound":"MjExNzQ2MDYzMg==","repeats":1},{"count":1992,"lower_bound":"MjEyNjczMDc4OQ==","upper_bound":"MjEzNzQxNzk3OQ==","repeats":1},{"count":2000,"lower_bound":"MjEzNzkyMzkzOA==","upper_bound":"MjE0MjI0ODc4NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,4,4,1,1,0,1,2,0,0,1,3,3,0,2,2,0,0,3,2,1,3,1,2,2,2,0,1,1,2,1,2,1,0,0,0,0,1,0,1,0,0,4,0,0,1,0,2,1,1,0,2,3,0,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,0,0,2,0,2,1,0,1,1,1,0,1,1,1,1,1,1,1,1,2,2,0,0,2,0,2,1,1,2,1,0,1,0,2,0,2,1,1,0,2,4,1,0,1,0,3,1,2,0,1,0,2,2,0,0,0,1,1,0,2,0,0,2,3,2,0,0,0,1,0,1,2,1,0,0,2,4,0,0,0,1,4,1,1,2,1,0,0,2,1,0,1,1,3,1,2,1,0,1,1,3,0,1,1,2,0,1,0,0,1,0,1,1,1,0,0,0,1,0,1,2,1,1,3,2,1,0,1,0,3,0,0,1,0,1,1,1,0,1,1,0,0,2,0,2,3,3,0,0,0,0,3,2,1,1,0,1,0,2,0,1,0,1,1,2,2,1,2,0,2,1,1,0,1,2,1,1,1,1,0,2,0,0,1,1,2,1,2,0,1,0,1,2,1,1,0,0,2,0,1,0,0,1,2,0,3,1,2,2,1,1,1,3,0,1,1,1,1,1,1,0,0,2,1,2,0,1,0,2,0,1,2,1,0,2,1,1,3,2,1,0,1,0,0,0,2,0,1,0,0,2,1,0,0,1,1,2,1,2,0,1,0,1,1,0,1,3,1,0,1,1,0,1,2,4,1,0,0,1,5,0,1,1,2,0,1,1,2,1,2,2,2,2,2,0,0,2,1,0,1,3,0,1,3,1,0,1,1,2,1,2,0,1,1,1,0,1,1,0,0,1,2,2,1,1,1,0,1,1,0,1,2,0,0,0,1,1,0,2,1,0,0,1,1,1,0,1,0,2,2,1,0,0,1,0,0,1,0,3,0,1,0,0,1,0,0,0,0,0,1,1,1,0,0,2,0,0,3,0,1,0,0,2,0,2,1,2,0,2,1,0,1,0,2,1,0,2,2,1,1,3,0,1,2,1,1,0,3,0,1,0,0,2,1,2,0,1,3,1,3,5,1,0,0,0,2,1,1,1,2,3,0,0,0,3,0,3,1,1,0,0,2,2,3,1,0,0,1,0,1,2,2,1,0,1,1,1,2,1,0,1,0,1,2,5,2,2,1,0,1,0,0,0,0,0,2,1,1,1,0,0,0,2,2,0,1,0,1,2,0,1,3,0,0,1,0,2,0,0,1,1,1,0,2,1,0,1,3,1,1,1,0,1,1,1,0,1,1,2,0,2,3,0,2,0,0,4,2,0,2,3,2,1,2,1,1,1,2,3,0,0,1,3,4,2,1,0,2,1,2,1,0,2,1,1,3,1,1,3,1,0,0,5,0,2,0,3,0,2,0,0,0,1,1,0,1,5,0,0,0,0,1,1,0,0,2,0,0,1,0,0,0,2,1,1,0,0,2,0,3,1,0,1,0,1,1,1,0,0,2,0,1,1,0,0,1,3,0,1,1,1,1,0,0,3,2,3,2,0,1,0,1,2,2,2,1,0,0,0,0,0,1,1,1,1,1,0,1,1,1,1,0,0,0,2,1,3,1,0,3,1,1,2,2,0,1,2,0,0,0,3,0,1,0,1,3,1,0,1,1,1,1,5,0,2,1,4,1,1,0,0,1,3,2,0,0,3,0,3,0,1,2,3,2,1,0,1,1,0,1,1,2,2,1,1,1,1,1,1,2,2,0,1,2,1,2,0,1,0,1,2,1,1,1,1,0,1,0,1,0,0,0,1,0,0,1,1,0,1,3,0,0,1,1,1,1,0,2,2,0,0,1,2,2,2,5,0,1,1,2,1,2,1,0,0,2,2,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,0,1,1,2,1,0,0,2,2,1,1,4,0,2,0,1,0,0,0,1,3,1,0,2,1,2,0,1,2,1,1,2,2,1,0,2,0,1,1,1,4,2,0,1,1,1,3,0,1,1,0,0,1,1,1,0,2,1,0,2,1,0,2,2,3,1,0,1,0,0,0,0,0,1,0,3,0,0,1,3,0,1,0,0,0,3,0,0,0,0,2,1,1,2,2,0,1,0,0,3,1,0,0,1,1,0,1,1,0,1,2,0,1,0,0,1,3,1,0,0,0,0,0,1,1,2,2,2,1,1,0,1,1,1,1,2,1,0,1,0,0,1,1,2,1,3,1,1,1,2,1,1,1,2,0,1,1,0,3,0,1,2,1,2,1,1,0,2,2,0,0,0,4,2,0,0,3,1,0,1,1,1,1,2,2,0,1,0,0,0,2,2,0,0,2,0,0,0,1,6,0,2,3,3,1,2,0,1,3,1,0,1,0,0,2,0,0,0,0,0,1,1,0,0,0,1,0,1,3,2,1,1,1,2,1,0,1,2,1,0,0,0,1,2,3,0,0,0,0,1,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,2,0,2,0,2,0,2,0,2,1,1,1,0,2,0,3,0,1,1,2,0,1,0,2,1,2,1,0,0,0,0,0,1,2,1,0,2,1,0,0,0,1,2,0,1,1,3,2,0,2,1,3,1,0,0,4,0,2,0,0,0,2,1,0,2,1,1,0,1,2,0,1,2,2,2,1,0,0,0,3,0,0,1,3,0,0,3,0,0,0,0,1,2,0,1,0,0,4,1,1,1,2,1,3,0,1,1,0,0,1,3,1,2,1,1,2,1,0,0,0,0,0,0,2,1,0,2,1,1,1,1,1,2,1,1,0,1,2,1,0,1,0,2,0,0,1,4,1,0,2,2,0,1,2,1,2,0,1,3,3,0,2,1,0,1,2,1,1,0,1,0,0,1,1,0,1,0,0,2,0,1,2,1,1,0,1,0,1,0,0,2,0,0,1,1,0,0,1,0,2,1,0,2,2,1,0,1,1,1,1,0,1,0,2,2,2,2,1,4,1,0,2,1,0,0,0,0,2,1,1,0,0,1,0,0,3,1,1,2,0,1,0,1,1,2,1,1,0,0,0,0,0,0,0,0,1,1,0,1,2,0,1,1,0,3,1,0,3,0,0,3,1,1,1,1,0,0,2,2,0,0,1,0,3,0,0,3,1,0,0,0,1,1,1,1,0,2,1,0,0,0,1,3,0,1,0,1,0,0,4,1,1,1,0,0,0,1,2,0,1,2,1,1,0,0,0,2,0,2,2,1,0,0,1,0,0,3,2,2,0,1,1,0,0,1,1,0,2,0,0,2,0,0,0,2,0,3,0,0,0,2,0,1,0,1,1,2,1,1,3,2,1,0,0,0,0,1,1,2,3,2,1,1,0,0,1,1,1,1,2,1,1,0,0,1,0,1,1,1,2,1,1,0,2,0,0,0,0,0,3,0,0,2,1,1,1,0,1,1,0,0,0,2,0,0,3,2,1,1,2,2,0,2,0,0,0,0,0,0,2,2,1,1,2,0,3,1,0,1,3,0,0,0,1,0,0,0,3,0,0,1,1,4,0,1,1,1,0,0,2,0,1,2,0,0,0,1,1,0,1,0,1,0,0,0,0,0,4,1,0,0,0,2,1,3,0,1,0,2,0,4,2,3,0,1,1,0,1,1,0,1,1,0,1,0,0,0,0,2,1,2,2,0,1,1,1,3,0,3,0,1,0,1,0,1,2,1,1,1,3,0,3,1,0,0,1,1,0,1,2,2,0,1,0,1,0,1,3,1,2,2,1,0,1,0,1,1,1,0,1,2,2,2,0,2,2,0,3,0,3,1,2,1,2,2,1,2,1,3,1,5,0,1,6,0,1,0,2,1,1,3,2,1,0,1,1,0,0,3,0,1,1,1,1,1,0,1,1,2,2,0,1,1,1,1,0,1,3,1,2,0,1,0,2,1,0,3,2,1,1,1,2,2,1,0,0,0,2,2,0,0,0,0,0,1,1,1,0,1,1,1,1,1,0,1,0,0,1,2,0,0,0,1,1,0,1,2,2,0,0,1,0,0,2,0,1,2,0,2,1,0,0,0,2,0,0,3,1,1,2,2,2,1,0,2,1,0,0,1,1,1,4,0,1,0,1,2,1,1,2,1,0,0,0,1,0,0,0,2,1,1,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,3,0,0,0,2,1,0,2,0,1,1,1,1,1,1,3,0,2,0,1,0,2,1,1,3,0,2,3,1,1,0,2,1,3,1,2,0,0,3,0,0,1,0,1,0,1,1,2,1,0,2,0,2,1,0,3,2,4,0,0,2,1,3,1,1,0,2,1,3,0,1,1,1,1,2,1,2,0,1,0,0,0,1,1,1,0,0,1,1,1,0,3,0,0,1,3,1,2,1,1,0,2,1,0,0,1,1,1,0,0,2,0,1,0,0,2,3,0,2,0,1,1,1,1,1,2,1,2,0,0,1,3,3,3,0,2,1,1,2,4,1,0,0,0,0,2,1,2,1,1,0,1,3,1,0,1,1,2,0,0,1,1,0,2,0,1,4,0,1,0]},{"counters":[0,1,2,0,0,1,4,1,0,1,1,0,0,0,2,0,1,1,1,0,0,1,1,1,1,1,0,1,2,0,3,0,2,2,3,2,1,2,0,2,2,1,1,3,2,2,1,0,4,0,1,1,1,0,2,0,0,1,0,1,1,3,0,1,2,2,1,0,1,0,0,2,2,3,0,1,2,2,1,1,1,0,3,2,1,1,1,1,0,0,0,2,1,1,3,1,1,0,2,2,1,2,1,1,2,0,1,1,0,0,2,0,1,2,2,0,0,0,2,1,1,1,0,2,0,1,1,1,0,1,0,2,1,0,3,1,1,0,0,0,1,0,4,0,0,1,3,0,0,0,1,1,2,3,0,1,0,2,2,0,1,0,1,1,1,0,2,0,2,1,1,3,3,1,0,2,1,3,0,1,1,1,0,1,0,1,1,0,1,0,0,0,0,1,1,0,0,0,0,3,0,0,1,1,1,2,1,1,2,0,0,0,1,0,0,2,0,2,1,0,1,1,1,1,0,1,1,2,1,2,3,1,1,0,3,1,0,1,2,1,0,0,1,2,0,2,0,0,0,2,0,0,1,0,1,0,3,2,0,1,2,0,0,1,0,0,0,1,2,2,0,0,1,1,2,0,1,1,1,1,1,3,1,0,2,3,1,0,0,0,0,1,1,1,1,0,1,0,2,0,0,1,2,0,0,1,2,1,1,1,1,2,2,1,3,2,0,1,0,2,1,0,1,0,0,0,0,0,0,2,5,4,0,2,3,0,1,1,1,1,1,1,2,1,2,0,1,0,1,0,2,0,0,1,1,2,1,2,2,0,0,1,1,1,2,1,2,2,1,1,1,2,1,1,2,2,2,0,1,1,1,1,2,2,0,1,1,2,0,0,1,1,2,1,2,0,2,3,1,0,1,0,1,2,0,0,0,3,1,1,0,2,0,1,1,2,0,0,2,1,1,2,0,1,1,1,1,0,2,1,3,1,1,0,0,3,2,0,0,1,0,1,2,0,2,2,0,3,0,0,1,1,1,1,1,0,0,1,0,2,2,2,0,2,1,0,0,2,1,0,0,0,1,1,3,0,1,1,1,1,1,1,0,1,4,0,0,2,1,2,1,1,2,0,0,0,1,2,0,1,0,0,0,1,2,1,0,1,0,0,2,2,1,0,1,0,2,2,3,2,0,0,1,0,0,3,1,1,0,3,0,1,0,2,2,1,0,5,0,2,3,0,0,0,3,0,0,4,0,0,0,0,2,4,2,0,1,2,1,1,0,1,0,4,0,0,1,1,1,1,2,0,1,1,1,2,1,1,0,0,2,2,1,0,0,2,0,3,1,0,0,0,1,1,0,0,0,0,3,1,0,0,1,0,1,1,0,1,2,1,0,0,1,1,1,4,0,1,0,0,0,1,0,0,1,3,5,0,2,0,1,1,1,0,1,1,0,2,2,2,0,0,1,2,0,2,1,2,0,0,0,1,0,1,1,1,1,3,2,0,2,1,0,0,2,0,2,1,0,0,1,1,1,1,0,1,1,1,2,3,0,2,0,0,1,1,0,0,1,1,0,2,2,3,3,2,1,0,1,0,1,0,0,0,3,1,0,3,1,3,0,0,1,0,1,2,0,3,0,0,2,0,0,3,1,1,0,3,0,1,0,2,0,3,2,1,1,0,2,1,3,2,1,0,1,0,0,1,0,0,1,1,1,0,1,1,0,2,0,3,0,0,1,0,0,3,1,0,0,1,0,1,1,1,0,1,2,0,0,0,1,0,1,0,3,0,0,1,1,0,1,0,1,0,1,2,0,0,2,0,1,2,1,3,2,1,0,0,1,2,1,0,1,0,0,0,0,4,1,2,1,2,0,1,0,1,2,1,2,1,1,1,0,1,1,1,2,0,1,1,0,0,3,1,0,0,0,3,3,0,1,2,2,0,2,0,2,3,2,3,0,0,0,0,2,2,2,4,1,0,2,2,0,1,1,2,2,0,3,0,2,1,2,0,0,2,1,0,1,3,2,1,1,0,0,1,3,2,1,3,0,4,0,2,0,0,1,0,0,3,0,1,2,1,0,2,0,0,0,0,0,1,1,1,0,2,1,1,0,1,0,1,2,0,0,0,1,0,1,2,0,1,1,1,0,0,0,2,2,3,3,3,1,0,1,1,1,1,0,2,0,0,2,0,3,1,1,0,1,2,1,2,3,0,0,1,4,0,2,2,0,3,1,1,0,2,2,1,2,1,2,1,0,1,0,4,1,0,0,3,0,0,1,1,1,1,1,2,0,1,0,1,0,0,1,0,0,2,0,3,1,0,1,1,1,1,1,2,0,1,0,0,1,3,0,0,2,1,0,0,1,1,0,2,0,3,0,2,3,1,1,4,0,4,1,3,0,0,3,0,2,0,2,1,0,3,1,0,1,0,1,4,3,3,0,0,0,0,1,0,1,0,1,0,2,1,2,2,2,2,2,1,0,0,1,2,1,3,0,0,0,2,0,0,3,1,1,0,0,3,0,2,0,0,1,1,1,1,1,2,0,0,1,0,0,0,0,0,1,0,1,1,0,2,1,2,0,0,2,2,0,1,0,2,0,1,2,2,1,1,1,1,1,1,1,0,2,0,1,1,1,1,2,1,1,3,0,0,1,0,1,2,3,0,0,0,1,0,0,0,1,0,1,0,1,0,0,1,0,0,0,2,1,1,1,0,1,0,1,0,0,1,3,0,1,0,1,0,1,0,0,0,0,0,0,1,1,1,1,0,1,0,3,0,1,0,1,1,1,3,0,1,0,1,1,1,0,2,0,2,1,0,1,0,0,1,4,2,0,0,4,1,2,0,1,1,1,1,1,1,1,0,0,1,1,1,1,2,0,2,2,1,1,0,1,1,1,0,1,1,1,1,0,0,2,0,0,1,1,0,0,1,0,1,0,0,2,1,1,1,0,2,0,3,0,0,2,1,1,1,3,2,0,1,0,0,0,2,2,0,0,3,1,0,0,1,0,4,0,0,0,0,1,2,3,2,0,0,2,1,0,1,1,1,0,0,0,2,1,0,0,1,0,2,1,1,2,1,1,1,1,1,0,1,0,0,1,1,1,0,3,0,1,1,2,0,0,1,0,0,2,1,1,0,1,2,0,1,2,0,3,0,2,2,0,2,3,1,2,2,0,2,3,1,2,3,2,0,0,1,0,3,2,0,1,1,1,0,1,0,1,0,1,2,3,4,3,1,2,1,2,2,3,2,0,1,4,0,2,1,1,2,0,0,0,4,2,1,0,2,0,2,4,0,1,0,1,3,2,1,3,1,1,1,2,1,0,0,0,0,3,0,2,0,1,1,1,1,2,1,0,2,2,0,3,2,1,2,2,3,0,1,1,0,2,0,2,1,1,0,0,1,0,0,0,2,1,1,1,2,0,0,0,2,0,1,0,1,2,2,2,0,0,0,1,1,0,2,0,2,1,1,0,0,2,0,1,0,3,0,0,2,0,2,6,2,2,1,0,0,1,2,1,0,0,0,1,1,1,0,2,0,1,1,1,1,1,1,3,2,0,1,1,0,1,1,1,0,1,1,0,0,0,1,2,1,0,1,1,0,0,1,0,0,0,0,2,0,0,2,0,0,1,2,3,1,0,1,1,1,0,0,1,1,1,1,1,0,1,1,0,1,0,1,2,0,2,2,0,2,1,0,4,0,0,0,2,0,2,2,0,2,2,0,1,1,1,0,0,0,1,3,0,1,1,0,2,0,0,1,0,2,3,1,0,1,1,0,1,0,0,2,1,1,2,1,1,2,1,0,0,1,2,0,0,2,2,0,2,1,0,0,1,1,0,0,0,0,0,0,0,2,1,0,0,0,4,1,0,2,1,2,1,0,0,1,0,1,0,1,2,0,2,2,0,0,3,0,2,1,1,0,1,0,1,3,0,1,1,0,0,0,1,1,0,0,0,1,2,1,0,2,1,1,2,1,0,0,0,1,1,0,1,3,0,2,3,1,0,0,5,1,0,2,0,0,0,4,0,1,0,0,3,2,0,1,2,1,0,1,2,2,2,1,1,1,0,1,2,3,0,0,0,0,2,3,2,2,1,2,1,1,1,0,2,0,1,3,1,2,0,1,1,2,1,1,1,0,3,2,1,1,2,0,0,0,2,1,1,1,1,0,1,0,0,1,1,1,0,2,1,2,1,0,0,1,1,1,0,1,1,2,1,1,1,2,0,0,1,1,0,0,2,0,1,0,0,0,0,0,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,2,1,1,0,2,3,2,2,0,0,1,3,1,5,0,1,1,1,1,1,0,0,1,0,1,0,1,0,1,1,1,0,2,1,1,1,2,0,0,1,1,1,0,1,0,0,0,0,2,0,0,2,1,2,1,3,0,2,0,0,3,0,0,0,0,1,0,1,1,0,1,0,0,1,2,1,0,1,0,0,0,0,3,0,2,0,0,1,0,1,0,3,3,2,1,2,1,1,0,2,2,1,1,2,0,2,0,4,1,2,1,2,2,1,1,1,0,5,2,0,1,2,1,0,0,1,0,1,0,1,1,1,1,0,1,0,1,0,0,1,0,1,0,0,1,1,1,1,1,1,3,0,1]},{"counters":[1,1,3,0,1,0,0,0,0,0,2,0,0,2,1,2,1,1,0,1,1,2,0,3,1,2,1,1,1,3,0,0,1,1,1,3,0,3,1,0,1,0,1,0,2,1,2,1,1,0,0,0,0,1,1,0,2,0,2,0,2,2,0,0,3,1,0,2,0,0,1,1,1,0,3,2,1,0,1,0,2,0,3,2,1,0,2,1,0,1,0,2,0,1,1,2,2,2,1,1,2,1,0,1,0,1,1,1,1,1,0,0,0,0,1,1,1,2,0,2,0,0,4,0,0,1,1,2,1,2,0,1,1,2,0,1,0,2,1,1,0,4,0,0,0,4,0,0,2,1,1,2,2,0,1,0,0,1,1,0,0,0,2,0,1,0,2,2,1,1,1,0,0,0,0,1,0,1,1,0,2,2,1,1,0,3,0,0,1,0,2,1,2,1,2,2,1,3,4,1,0,4,1,2,2,1,2,1,0,4,0,0,1,0,2,2,1,0,2,2,0,0,1,2,1,0,0,1,0,0,0,0,3,1,1,0,1,1,1,0,1,4,1,3,0,1,0,1,2,1,3,2,2,2,0,0,1,0,1,1,1,0,1,0,1,0,0,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,2,3,1,2,0,0,0,1,2,1,2,3,2,2,3,0,3,0,0,2,0,2,1,0,0,1,0,0,0,1,1,1,2,0,0,1,0,0,0,0,0,1,1,1,1,3,0,2,0,0,1,0,1,0,1,4,1,0,1,1,1,3,0,0,2,1,0,0,1,1,3,1,1,1,0,0,4,1,1,2,0,2,0,1,0,0,0,2,1,0,2,2,2,2,1,2,1,1,3,0,0,0,1,1,1,2,1,1,0,1,1,2,2,2,0,1,0,1,3,2,1,1,0,1,1,2,0,1,1,0,2,1,2,0,1,1,1,1,2,0,2,1,1,1,0,0,4,0,0,0,1,1,1,0,2,2,2,1,3,1,0,2,2,1,0,0,1,1,1,0,2,0,1,0,0,0,1,0,0,1,2,1,0,1,0,2,1,1,1,1,0,0,1,1,1,0,2,1,2,1,0,1,0,1,1,0,1,0,2,0,2,0,2,0,0,0,1,1,0,2,4,0,0,1,1,1,0,0,3,1,0,0,0,2,0,0,1,1,3,1,2,1,1,0,1,0,1,0,2,1,0,2,2,3,3,0,2,2,4,1,1,2,0,0,2,1,3,0,0,1,2,0,1,0,1,2,1,1,0,2,2,0,2,3,1,0,2,2,2,1,0,0,0,0,1,1,1,2,0,1,2,0,1,1,1,1,0,1,0,1,0,1,0,2,4,2,1,0,1,0,2,1,3,1,1,1,1,0,0,2,2,4,4,0,0,1,0,0,0,1,2,2,0,0,1,1,2,0,0,2,0,2,2,1,2,2,0,2,3,0,0,0,0,1,2,0,0,1,0,0,1,1,0,1,0,2,0,3,0,0,0,0,2,2,0,1,0,2,2,2,0,2,5,3,0,2,0,1,1,0,1,0,2,1,1,0,1,1,1,1,1,0,3,1,1,0,3,0,1,0,0,1,1,0,1,2,4,0,1,2,0,2,1,0,2,0,0,1,2,1,0,2,1,0,1,0,0,4,1,1,1,1,0,1,0,2,1,1,2,0,1,0,1,1,1,0,3,0,1,1,5,2,1,0,1,0,1,0,1,2,0,1,2,0,0,1,0,0,2,2,1,0,0,3,1,1,1,3,2,1,0,1,2,0,0,0,1,3,1,0,1,1,1,0,0,1,2,1,2,3,0,0,0,3,0,0,0,2,0,1,1,0,0,1,3,1,0,2,2,1,0,3,2,0,1,0,1,1,0,0,1,2,1,0,3,2,0,2,0,1,0,1,0,1,1,1,1,0,1,1,1,0,0,2,2,0,0,0,1,1,1,2,1,1,0,1,0,0,0,0,2,1,1,2,0,0,2,2,0,0,0,0,0,0,3,2,0,1,3,0,0,1,0,0,0,2,2,1,0,1,0,1,1,1,1,1,0,1,1,2,0,0,3,2,1,0,1,1,1,1,2,1,0,1,1,0,1,2,1,1,0,0,2,3,1,0,1,3,0,2,1,1,2,0,1,0,2,2,1,1,3,0,1,0,0,1,1,0,0,1,1,2,1,0,1,0,1,2,0,0,1,1,1,3,3,4,2,0,0,2,2,1,0,1,2,1,0,1,0,1,1,1,1,3,0,2,3,1,1,0,0,0,0,0,0,1,0,2,0,1,1,0,1,0,0,0,0,0,2,1,0,0,1,1,2,2,0,0,3,0,0,0,1,2,0,1,0,1,0,0,1,2,1,0,1,0,0,1,0,0,3,0,0,1,1,0,2,1,2,0,2,3,2,2,3,2,2,2,1,0,1,1,0,5,2,0,1,1,2,2,0,0,2,3,2,0,3,0,2,2,1,1,1,2,0,1,1,3,0,1,0,0,0,0,1,1,3,1,0,4,1,0,1,1,2,1,1,0,0,0,2,0,2,1,1,1,0,1,1,0,0,0,2,2,2,2,1,0,0,1,0,1,3,0,1,2,0,1,0,2,1,0,3,2,1,0,0,1,0,0,0,1,1,0,1,0,1,1,1,0,1,1,1,1,0,1,2,0,1,0,1,0,0,2,0,1,0,0,1,0,0,0,0,1,0,1,0,2,0,0,2,4,1,2,0,0,0,1,0,0,0,0,1,0,0,3,0,3,1,1,1,1,1,1,0,3,1,1,1,0,2,0,2,4,0,1,1,0,1,2,0,0,1,1,1,1,3,1,0,3,0,1,1,1,0,1,0,1,1,1,2,1,0,2,1,1,2,0,0,2,0,0,0,0,0,1,4,1,2,1,1,0,1,2,0,1,2,1,2,1,0,1,0,1,0,1,1,4,1,0,2,1,2,0,2,2,1,1,1,0,1,1,2,2,1,1,3,1,0,0,1,2,0,5,2,0,1,0,1,3,1,1,0,1,0,0,2,1,0,0,2,3,0,4,0,1,0,1,1,1,2,0,2,0,1,2,0,4,3,1,4,4,0,2,1,0,0,1,0,1,1,0,0,1,2,0,2,1,0,1,1,1,0,1,1,1,2,0,1,0,0,0,2,1,2,0,0,0,0,2,2,0,0,1,2,1,3,0,1,0,0,0,1,0,1,4,0,1,1,1,1,1,1,0,0,1,1,2,1,0,1,1,2,1,0,4,1,1,0,2,0,3,0,1,1,1,0,0,2,1,0,1,1,1,0,1,1,1,0,2,0,1,2,1,1,1,1,0,0,1,2,1,0,0,1,0,0,1,1,0,0,0,3,2,1,0,0,2,0,0,0,0,1,3,2,0,1,1,0,2,1,1,3,2,3,3,0,2,0,0,1,1,1,2,1,0,0,0,1,1,1,1,0,1,2,1,0,0,1,1,0,3,0,1,2,1,0,2,0,1,1,0,0,1,0,1,1,1,3,2,1,1,2,1,1,0,1,1,0,0,2,1,0,1,0,1,0,1,1,0,1,1,1,4,3,1,1,3,0,1,2,1,0,0,1,2,2,0,1,0,2,1,0,0,2,1,1,2,3,0,2,0,2,1,0,0,1,2,1,1,0,0,1,1,2,1,3,0,1,3,1,0,1,2,0,1,2,3,1,1,3,0,1,1,1,1,0,0,0,0,0,1,1,3,0,0,0,0,1,1,0,1,0,1,2,1,0,0,0,0,1,2,4,0,1,0,2,1,2,1,0,0,2,1,2,0,0,1,0,0,1,0,2,1,1,1,1,0,0,0,0,0,2,1,0,3,0,2,1,1,2,2,1,0,2,1,0,2,1,2,2,1,1,0,5,1,2,1,0,1,2,2,0,0,2,2,2,1,0,0,0,0,0,2,0,2,1,1,2,2,2,1,1,1,0,1,1,1,0,1,2,0,0,0,1,0,0,3,2,2,3,1,0,0,1,3,3,0,0,0,0,0,1,5,1,3,1,0,1,1,0,0,0,2,0,3,2,1,0,2,0,0,0,0,0,1,1,3,2,2,0,0,0,1,4,1,1,3,1,2,0,2,0,0,0,0,0,2,3,0,2,0,2,1,2,1,1,1,0,1,1,1,0,2,1,2,1,2,1,2,2,0,1,1,2,1,1,2,1,1,2,2,1,1,1,0,2,0,0,1,2,1,0,0,0,0,1,2,1,1,0,1,1,1,0,1,1,0,1,3,2,0,0,1,1,1,0,1,1,1,0,1,0,0,0,1,1,1,0,2,0,2,0,3,1,0,3,0,2,0,1,1,0,1,1,1,0,1,2,0,1,0,2,1,0,0,0,4,0,1,2,2,2,1,0,1,1,1,3,2,1,2,1,0,1,1,0,0,2,1,0,0,0,2,1,0,1,0,1,2,0,1,2,0,0,3,2,3,1,0,2,2,0,1,2,2,2,1,0,1,2,1,0,1,3,2,1,1,0,0,0,4,0,0,0,0,0,1,1,1,0,0,1,1,1,1,2,2,2,0,2,0,1,3,0,0,0,0,3,0,0,1,0,1,0,1,0,2,0,0,1,0,2,1,0,1,0,2,1,0,0,2,2,0,1,0]},{"counters":[3,1,0,2,0,1,2,0,1,0,1,1,2,0,0,3,0,1,2,2,2,0,1,2,2,0,1,0,0,1,2,0,0,0,0,1,0,1,0,2,1,0,2,1,0,0,1,0,1,2,0,1,0,2,1,1,0,1,2,1,1,1,0,1,1,1,0,2,3,2,1,1,1,1,1,0,1,1,1,0,2,2,1,0,0,0,1,2,0,3,0,1,3,0,1,1,1,2,1,1,1,0,1,0,1,2,1,0,0,1,0,1,0,1,2,0,1,0,0,1,1,1,2,2,0,2,0,1,3,1,1,1,0,0,2,0,0,2,5,0,0,0,0,1,3,2,2,1,0,1,1,0,0,2,1,3,3,1,0,1,1,2,0,0,0,1,1,1,2,0,0,3,1,0,1,0,1,4,0,0,2,1,1,1,1,2,2,1,1,1,1,3,0,2,1,1,4,0,2,2,1,2,0,0,0,1,1,0,0,0,2,0,0,1,2,2,3,2,1,6,1,1,2,0,1,1,2,1,0,1,0,1,0,0,3,0,1,0,1,0,0,0,1,0,3,1,0,1,2,1,1,1,1,0,1,0,2,1,1,0,0,0,0,1,1,0,0,2,0,3,0,2,0,1,0,0,2,1,1,0,0,1,2,1,0,2,0,0,0,1,0,0,1,0,1,1,2,2,2,0,1,1,2,1,2,0,1,0,0,1,2,2,0,1,0,2,1,0,0,0,3,1,2,0,0,2,1,0,0,1,0,1,2,2,1,2,0,0,0,1,0,1,3,1,3,0,2,0,1,2,3,1,2,1,0,1,1,1,1,1,0,1,1,0,2,0,3,1,1,0,1,1,2,1,0,1,0,0,0,0,2,0,0,2,0,2,2,0,1,0,0,1,0,1,2,1,0,0,2,0,1,0,1,1,0,1,2,1,2,1,1,2,0,2,1,3,3,2,1,3,1,0,2,0,1,0,0,1,3,2,3,0,0,0,0,1,2,1,0,1,0,1,1,0,0,0,0,0,1,1,0,0,2,3,1,0,2,0,0,0,0,2,1,3,0,0,0,2,2,1,0,1,2,1,0,1,0,0,0,2,0,0,0,1,2,0,2,0,0,0,2,2,0,1,1,0,1,1,0,0,0,1,2,0,0,0,1,1,1,1,0,0,1,0,1,1,1,0,0,2,0,0,0,1,3,2,1,2,2,0,1,1,1,2,0,0,0,0,0,0,1,0,0,1,1,2,2,2,2,2,1,0,1,1,0,1,0,0,1,1,2,0,1,0,1,1,1,3,2,0,4,1,1,3,2,0,0,3,1,0,2,2,1,0,1,1,3,1,2,0,1,1,1,0,1,2,1,0,1,2,1,0,1,2,1,1,0,4,0,0,0,0,1,1,1,2,1,1,0,2,1,0,2,3,1,3,1,1,1,2,2,2,2,1,3,1,2,0,0,1,1,2,1,3,2,0,1,2,1,1,1,3,2,2,2,2,2,1,0,1,2,1,2,0,0,1,0,3,0,0,0,0,1,0,0,1,1,1,2,0,0,0,2,1,1,1,0,0,3,0,2,3,0,0,0,1,2,1,1,2,1,1,0,2,1,0,1,0,0,1,1,2,2,2,3,1,1,2,0,0,0,1,0,0,0,1,2,1,0,2,2,1,0,3,2,2,0,2,0,1,0,1,1,3,1,1,2,0,0,0,1,3,0,1,0,0,0,0,0,0,0,1,0,1,0,1,1,1,1,3,1,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,0,2,2,2,1,1,1,1,1,1,2,0,0,0,0,1,3,0,1,1,1,1,1,0,0,0,1,0,1,0,0,3,0,3,1,0,0,1,0,1,0,1,1,1,2,2,0,2,0,1,1,2,0,3,0,2,0,1,1,2,2,1,0,2,0,0,0,0,0,2,1,1,0,0,0,3,0,1,1,1,1,1,1,1,0,2,0,1,4,3,1,0,2,1,1,1,0,1,0,3,1,1,2,1,4,0,0,0,0,0,2,2,1,0,0,1,1,3,0,0,0,2,0,1,1,2,0,2,1,1,1,1,1,0,1,3,1,1,0,1,0,1,0,1,1,1,0,0,1,0,0,1,0,1,0,1,1,2,2,0,1,2,1,2,1,1,2,1,1,0,1,0,1,2,3,5,2,1,1,1,0,2,0,0,0,2,2,0,0,1,1,0,0,0,1,3,0,1,0,1,2,1,2,0,0,1,1,1,1,1,0,1,1,1,0,3,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,3,1,0,1,1,1,1,1,1,0,0,1,1,3,0,0,1,1,4,1,0,1,0,1,0,0,1,1,0,2,1,1,0,0,3,2,0,1,2,3,1,1,1,1,2,3,1,0,0,0,3,2,0,0,3,0,2,2,0,0,1,2,0,0,0,0,1,0,0,1,1,2,2,1,0,0,0,2,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,3,1,0,0,0,0,1,2,0,1,3,0,1,2,1,3,4,0,4,1,1,1,1,0,2,2,0,1,0,1,0,1,0,1,1,0,2,0,1,0,0,1,3,0,1,1,0,0,0,2,0,0,0,2,1,0,0,1,1,0,0,1,0,0,0,1,2,1,1,0,1,2,1,1,0,0,2,1,2,1,1,2,0,2,2,1,0,3,1,2,1,1,0,0,0,0,4,2,1,0,1,0,1,0,0,1,0,0,1,1,2,1,3,1,0,0,2,1,1,0,1,0,1,1,1,1,0,1,1,0,1,0,1,0,2,0,0,1,1,0,1,0,2,1,2,0,0,1,0,1,0,3,0,0,2,2,1,0,0,0,1,0,1,0,1,4,1,0,1,4,1,0,1,1,1,2,1,1,0,1,1,2,2,2,1,0,2,1,0,3,1,0,0,0,0,2,2,1,5,1,0,1,2,1,1,0,0,0,0,0,0,1,2,2,2,1,2,1,1,1,1,1,0,1,2,1,0,1,0,0,1,3,1,3,0,2,0,0,2,1,2,4,2,0,2,0,3,6,2,2,0,0,0,2,0,1,2,0,1,1,1,2,1,1,3,0,2,1,1,1,0,0,1,1,3,2,1,0,2,1,0,0,1,2,0,1,0,0,0,1,2,2,1,0,2,1,1,1,2,4,0,1,2,0,1,1,0,0,1,0,4,2,1,2,0,2,2,2,0,1,2,0,1,0,2,1,1,0,1,2,1,1,1,0,4,1,1,2,1,2,1,0,1,1,1,3,3,0,1,1,2,1,2,1,1,0,1,2,1,1,0,2,2,0,2,3,2,2,2,1,0,0,2,0,0,2,1,0,0,1,1,0,0,5,2,0,0,0,2,0,0,3,2,3,2,1,0,1,2,1,0,1,0,0,2,0,2,0,2,0,3,0,3,1,3,1,0,1,0,0,0,0,0,3,1,0,0,0,1,1,0,0,0,2,3,0,1,1,2,1,2,1,0,1,1,1,1,0,1,1,2,1,0,0,1,0,2,0,1,1,1,1,1,1,0,0,0,0,5,1,0,0,0,2,0,1,2,2,2,1,1,0,1,0,1,0,0,2,2,0,3,1,0,3,2,1,1,1,0,0,1,2,0,0,0,1,1,1,1,1,1,2,0,1,1,1,0,0,1,0,0,1,1,0,0,4,2,2,0,2,0,0,2,0,2,1,0,1,0,2,1,1,0,0,1,1,0,4,0,0,3,3,0,1,0,2,0,1,2,1,0,0,2,0,3,2,0,1,2,3,2,0,0,0,2,1,2,3,0,3,1,0,0,1,1,2,1,1,1,0,1,0,2,3,0,0,0,0,5,0,1,2,1,1,2,2,0,3,0,1,0,3,0,1,1,0,0,2,0,2,2,2,4,1,0,2,3,1,0,2,2,2,1,0,2,1,1,0,0,1,1,0,1,1,0,1,2,0,2,0,0,1,0,1,1,1,0,0,0,1,2,2,3,1,2,1,3,0,2,2,1,1,2,2,1,0,2,1,0,1,1,0,1,0,1,2,0,1,0,1,2,0,1,1,2,3,0,0,3,1,1,1,0,1,0,3,0,1,0,1,2,0,2,1,1,0,1,1,1,3,1,1,1,2,0,2,1,1,1,1,3,0,1,2,0,1,2,1,0,1,1,2,3,1,0,1,1,0,0,2,0,2,4,0,1,0,1,3,0,0,1,1,1,1,0,2,0,1,1,0,2,2,2,2,0,0,0,2,3,0,1,1,1,2,1,0,1,0,0,1,0,2,1,3,1,1,2,0,0,1,1,0,2,1,1,0,0,1,1,1,0,1,1,1,0,0,1,1,1,0,1,0,1,1,3,0,0,3,1,0,2,0,1,0,0,0,0,1,1,0,1,1,1,0,2,1,0,0,4,4,4,1,1,2,0,0,3,3,1,1,0,2,0,1,0,0,1,2,0,1,0,0,0,0,0,1,0,1,1,2,3,0,1,1,2,1,1,0,0,0,0,0,2,0,5,1,0,0,1,2,0,1,0,0,2,2,1,0,1,2,1,0,1,0,3,0,0,0,2,3,3,0,0,3,1,1,0,0,1,0,1,0,0,0,1,4,2,2]},{"counters":[0,1,3,0,0,3,3,0,0,1,0,1,1,0,1,0,1,0,0,1,3,0,1,1,0,0,0,2,0,0,1,1,3,0,0,1,0,0,1,2,2,1,0,1,2,1,0,0,1,1,0,2,1,2,0,2,3,1,4,2,1,0,2,1,3,1,1,2,1,0,3,2,0,1,2,0,0,1,2,2,0,0,1,0,1,1,0,3,1,1,1,0,0,0,3,0,1,1,2,1,1,0,3,0,0,2,0,0,2,0,0,2,0,5,1,0,0,2,3,1,0,1,3,1,0,4,3,2,1,1,1,0,2,0,0,0,1,1,1,1,1,2,2,1,0,0,2,1,1,1,0,0,0,2,0,0,1,1,0,1,1,0,1,1,0,3,0,1,0,2,0,2,1,1,0,0,1,1,3,2,1,0,0,0,0,1,2,2,0,1,0,1,1,1,0,1,1,1,0,0,1,0,0,1,0,1,1,1,0,1,2,2,1,3,1,0,0,1,1,0,0,1,1,0,1,1,0,1,0,0,1,2,1,1,1,1,1,2,2,1,2,2,0,3,2,0,2,1,1,0,2,0,0,2,0,1,0,2,1,0,0,3,1,3,0,0,1,0,1,1,1,1,4,0,0,1,1,1,1,1,0,0,1,1,0,2,3,2,0,1,0,2,1,0,0,1,0,2,0,2,2,0,1,1,1,0,1,0,1,0,0,1,1,0,0,0,1,1,1,1,0,1,4,0,1,0,2,0,0,0,1,0,2,0,3,0,1,1,2,0,1,0,1,0,3,0,2,0,0,2,3,0,0,1,1,0,2,2,0,1,0,2,0,1,1,1,1,0,2,0,1,0,0,1,1,0,0,1,1,0,1,2,1,3,0,0,1,2,1,0,0,1,0,2,0,0,1,2,0,1,0,2,0,1,0,0,2,1,2,2,2,0,2,1,2,1,0,0,0,0,0,0,2,0,0,1,2,1,0,1,1,2,0,0,0,2,0,2,0,1,1,0,3,1,3,2,1,0,1,0,1,2,1,0,0,0,0,0,0,1,1,1,0,1,1,0,0,1,2,2,2,2,1,1,0,1,1,0,2,1,1,1,0,2,1,0,0,0,1,2,2,2,2,0,0,0,0,1,0,1,1,2,1,0,1,0,1,1,2,0,2,0,0,2,2,1,2,0,1,3,3,4,2,3,2,0,4,1,0,1,1,0,0,1,0,0,0,3,1,1,2,2,0,0,1,0,3,1,1,0,0,2,1,2,0,1,1,1,0,2,2,0,0,1,1,0,0,0,1,0,0,1,1,0,0,1,0,0,1,0,0,0,1,2,0,0,3,1,1,1,0,3,0,1,2,2,2,0,0,1,1,4,2,2,1,0,3,2,1,0,2,0,1,2,2,1,0,1,1,0,0,1,0,0,1,1,0,0,1,1,2,2,1,0,2,2,0,1,0,0,0,3,3,1,1,0,2,1,0,1,1,0,2,1,3,0,1,0,2,2,0,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,0,2,0,1,3,0,1,0,2,1,1,0,0,2,6,1,1,0,1,0,1,1,0,0,1,0,0,1,0,1,1,0,0,1,0,0,1,2,2,1,1,3,0,3,0,0,0,1,1,0,1,0,1,1,1,1,3,1,2,1,1,0,0,0,0,2,1,0,1,0,1,3,1,2,0,1,0,1,0,3,1,1,1,1,2,2,1,1,0,1,0,0,0,1,0,0,1,0,1,1,1,1,2,0,1,2,0,2,0,1,0,0,2,1,2,2,0,0,0,0,1,1,0,1,1,0,2,1,5,0,1,1,0,2,1,0,1,2,1,4,0,4,2,1,0,0,2,1,0,1,2,2,1,1,1,2,1,0,1,2,0,2,2,2,0,0,1,0,0,2,0,2,1,1,0,1,3,2,1,0,0,1,0,0,1,2,2,0,2,0,0,2,0,4,1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,3,1,1,1,0,1,0,0,1,1,1,0,2,0,1,3,1,1,3,1,0,3,3,2,1,0,0,0,0,0,0,0,1,0,0,0,0,1,2,0,1,1,3,0,0,1,0,0,0,0,0,0,2,1,3,0,0,2,1,0,0,1,1,1,1,0,1,2,4,1,0,0,0,2,3,1,3,0,0,1,1,1,2,1,1,0,1,1,0,1,0,2,0,0,1,0,1,2,1,0,1,3,3,2,1,2,0,5,1,1,1,0,3,0,0,1,2,2,2,0,1,0,2,0,1,2,1,1,2,0,0,2,1,1,0,1,1,1,1,1,0,0,0,1,2,0,0,1,1,1,2,1,0,2,0,2,1,0,3,1,0,1,1,0,0,1,2,1,1,1,3,1,2,0,0,0,1,1,4,0,1,2,3,0,2,2,0,1,2,1,2,2,1,1,2,0,0,1,2,1,1,0,1,1,0,0,1,2,0,0,1,1,1,2,0,3,1,0,1,1,0,0,2,1,0,2,1,0,1,1,1,2,3,1,3,1,0,1,0,1,0,1,2,1,0,1,0,1,1,0,0,3,0,1,1,0,1,1,2,1,0,1,0,0,0,0,1,1,2,1,2,0,0,1,0,0,1,3,0,0,1,1,3,2,1,2,4,0,3,0,2,1,0,1,1,0,1,2,2,0,2,1,2,0,0,0,0,1,0,2,1,1,1,1,1,2,0,0,0,0,0,0,2,0,0,2,1,1,2,0,0,0,2,0,0,0,1,0,3,0,2,1,1,0,1,0,1,1,1,1,2,2,1,1,2,2,1,1,0,1,0,1,0,2,1,3,0,2,0,1,3,2,0,1,3,2,0,0,2,1,1,2,1,3,1,0,1,2,1,0,1,0,3,0,1,1,1,1,1,1,3,0,0,2,0,2,1,2,0,2,1,0,2,0,1,1,0,1,2,1,0,2,0,1,1,1,0,0,2,2,1,0,1,0,2,0,1,0,0,0,0,3,1,1,1,0,1,1,3,0,1,3,2,2,0,1,1,1,1,2,0,0,1,0,1,1,2,1,1,0,0,0,0,0,0,1,2,1,0,1,2,0,1,1,0,1,2,1,3,3,3,0,1,1,2,1,1,2,0,2,2,0,0,0,1,0,3,1,0,2,0,4,1,0,1,0,0,4,0,1,1,0,2,2,2,1,0,0,1,1,0,2,1,1,1,1,3,0,0,2,2,1,3,1,1,3,1,0,1,2,3,0,0,0,2,1,0,0,1,1,0,2,1,1,1,1,0,1,1,2,2,1,1,0,2,1,0,2,2,1,2,0,0,0,1,0,3,2,1,2,0,0,1,0,1,0,0,2,0,0,0,1,1,2,1,0,1,1,3,0,1,6,2,0,0,1,0,4,2,0,0,3,4,2,0,0,3,0,1,2,0,1,0,3,0,1,1,1,0,1,0,0,0,1,3,1,0,2,1,1,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,1,1,0,2,1,0,2,1,1,0,2,1,1,1,0,0,1,4,1,1,1,2,1,0,3,0,0,1,2,0,1,1,1,1,0,3,1,1,1,0,1,0,1,3,0,3,1,0,0,2,1,2,0,1,2,0,0,0,3,1,2,0,0,1,2,1,0,0,0,2,1,2,3,1,3,1,1,2,1,2,0,0,2,0,0,0,2,0,0,0,0,0,0,2,0,0,1,0,1,1,1,0,0,0,3,3,2,1,2,0,1,2,0,1,0,0,0,2,1,0,1,2,1,1,0,0,1,1,1,2,0,2,0,0,2,3,0,2,1,0,1,2,1,0,2,1,3,0,4,1,1,0,0,3,1,0,2,1,2,3,3,0,2,0,0,0,0,1,1,0,1,5,0,2,1,1,0,1,1,2,2,1,2,0,3,2,2,1,1,1,1,1,2,0,3,0,0,2,0,2,4,1,0,2,3,2,0,0,1,0,0,2,0,0,2,2,1,0,0,2,0,2,1,1,3,2,0,0,1,1,0,2,1,0,0,4,1,2,1,1,1,1,0,1,2,2,3,1,1,4,2,2,2,2,0,0,0,1,0,1,1,1,3,0,1,1,1,0,0,1,1,2,1,2,3,1,1,3,1,0,4,1,1,2,0,3,1,0,2,1,2,1,1,0,0,0,2,0,1,0,2,2,0,2,0,1,5,0,1,0,2,2,3,1,0,2,0,1,2,1,0,0,0,0,0,0,2,2,1,2,1,4,0,1,2,2,0,0,0,2,1,2,1,0,0,1,5,0,0,1,0,1,1,1,1,1,0,0,0,1,0,0,0,0,2,0,0,1,0,0,2,3,1,0,2,1,1,2,1,1,0,1,0,1,4,1,0,1,1,2,1,0,0,0,0,1,1,0,0,1,1,1,2,2,0,0,1,1,3,0,1,2,0,0,2,0,2,2,0,2,2,0,1,0,3,1,0,1,0,0,3,0,1,1,0,1,3,1,0,0,0,1,1,1,1,2,2,0,0,1,0,1,2,1,0,1,2,1,2,2,1,0,3,1,0,3,1,1,0,1,0,2,0,2,1,0,3,1,0,3,2,2,1,3,0,0,0,1,2,0,0,0,0,1,0,1,1,2]}]},"null_count":0,"last_update_version":397952047758180352},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDU4MTk2MDc=","upper_bound":"LTIxMzQ1OTA5NDQ=","repeats":1},{"count":16,"lower_bound":"LTIxMjU4ODI3NzE=","upper_bound":"LTIxMTg2NTgyMDk=","repeats":1},{"count":24,"lower_bound":"LTIxMTg0ODg1OTQ=","upper_bound":"LTIxMDQ0Mzc0Njc=","repeats":1},{"count":32,"lower_bound":"LTIxMDMzNTY1Njg=","upper_bound":"LTIwOTAxMzc2MDA=","repeats":1},{"count":40,"lower_bound":"LTIwODQyNjA4Njc=","upper_bound":"LTIwNjUxNTM2NzI=","repeats":1},{"count":48,"lower_bound":"LTIwNjM0NDgyNjg=","upper_bound":"LTIwNTAyODYxOTc=","repeats":1},{"count":56,"lower_bound":"LTIwNDk1MzgwNTY=","upper_bound":"LTIwMzgzOTc1MTg=","repeats":1},{"count":64,"lower_bound":"LTIwMzQ1MTYxOTQ=","upper_bound":"LTIwMjEyNTQzNTI=","repeats":1},{"count":72,"lower_bound":"LTIwMTgzNDE1MjU=","upper_bound":"LTIwMDc5NzEwNzU=","repeats":1},{"count":80,"lower_bound":"LTIwMDc2Nzg1MTg=","upper_bound":"LTE5OTUyMzU1NjM=","repeats":1},{"count":88,"lower_bound":"LTE5ODkxNDQ5Njk=","upper_bound":"LTE5NzA2MTQ2OTY=","repeats":1},{"count":96,"lower_bound":"LTE5NzAxNDk5NjM=","upper_bound":"LTE5NDgzOTQ5MjI=","repeats":1},{"count":104,"lower_bound":"LTE5NDY2NDMyNTE=","upper_bound":"LTE5MzQ0NTc4MDc=","repeats":1},{"count":112,"lower_bound":"LTE5MjkzNjEyNzQ=","upper_bound":"LTE5MjA0MjkxMzY=","repeats":1},{"count":120,"lower_bound":"LTE5MjAwMTI1NDg=","upper_bound":"LTE4OTY5MTkyNDk=","repeats":1},{"count":128,"lower_bound":"LTE4ODg3MTY2NDg=","upper_bound":"LTE4ODAzNTAzMTI=","repeats":1},{"count":136,"lower_bound":"LTE4NzgyOTkwNjU=","upper_bound":"LTE4NjkyNTczMTk=","repeats":1},{"count":144,"lower_bound":"LTE4NjkyMjI5MDU=","upper_bound":"LTE4NTc0OTkzNjk=","repeats":1},{"count":152,"lower_bound":"LTE4NTcyOTAzODU=","upper_bound":"LTE4NDc1NTQ0OTA=","repeats":1},{"count":160,"lower_bound":"LTE4NDQzMTU2MTQ=","upper_bound":"LTE4MjIxNjQ1NzA=","repeats":1},{"count":168,"lower_bound":"LTE4MjEyNzM4MDE=","upper_bound":"LTE4MDQ5NzcxMTk=","repeats":1},{"count":176,"lower_bound":"LTE4MDM5OTYwNjI=","upper_bound":"LTE3OTE1NTczMjA=","repeats":1},{"count":184,"lower_bound":"LTE3ODk5NTc1Mzk=","upper_bound":"LTE3NjE1NTAxMzQ=","repeats":1},{"count":192,"lower_bound":"LTE3NTkwMjYyMjU=","upper_bound":"LTE3NDUxNTQxMTM=","repeats":1},{"count":200,"lower_bound":"LTE3NDA4NDAzODE=","upper_bound":"LTE3MjkwNzcxMzg=","repeats":1},{"count":208,"lower_bound":"LTE3MjkwNzEzODk=","upper_bound":"LTE3MjcyMDQyODk=","repeats":1},{"count":216,"lower_bound":"LTE3MTQ3OTQ4MTU=","upper_bound":"LTE2OTY1NjQ1MTM=","repeats":1},{"count":224,"lower_bound":"LTE2OTM3OTA3NjM=","upper_bound":"LTE2NjQ1MzQwMTA=","repeats":1},{"count":232,"lower_bound":"LTE2NjQzNjg5MTU=","upper_bound":"LTE2Mjk2OTc0ODg=","repeats":1},{"count":240,"lower_bound":"LTE2Mjc2MzgzOTk=","upper_bound":"LTE2MjE1MDIxNzc=","repeats":1},{"count":248,"lower_bound":"LTE2MTY1OTEwMTU=","upper_bound":"LTE2MDAzMjg2ODI=","repeats":1},{"count":256,"lower_bound":"LTE1OTc3OTg3NjA=","upper_bound":"LTE1ODk4MzI4MTU=","repeats":1},{"count":264,"lower_bound":"LTE1ODkyNzc0MzE=","upper_bound":"LTE1NzU1MDU5NDc=","repeats":1},{"count":272,"lower_bound":"LTE1NzM0MzQ0NjQ=","upper_bound":"LTE1NzAwNzA5NDg=","repeats":1},{"count":280,"lower_bound":"LTE1NjkzOTYwODc=","upper_bound":"LTE1NTk3NjY1Mjg=","repeats":1},{"count":288,"lower_bound":"LTE1NTE2MjU4NDA=","upper_bound":"LTE1MjU5MTUzOTE=","repeats":1},{"count":296,"lower_bound":"LTE1MjMyNDYzNzU=","upper_bound":"LTE1MDgxNDAyNzc=","repeats":1},{"count":304,"lower_bound":"LTE1MDU0NDM0MjE=","upper_bound":"LTE0OTY0MDIwODg=","repeats":1},{"count":312,"lower_bound":"LTE0OTM2MjkwMzU=","upper_bound":"LTE0ODM1MzQ3NjQ=","repeats":1},{"count":320,"lower_bound":"LTE0ODA0OTcwODk=","upper_bound":"LTE0NzIxNjUyMDA=","repeats":1},{"count":328,"lower_bound":"LTE0Njg2NTE0Njk=","upper_bound":"LTE0NDg1Nzg1Mzg=","repeats":1},{"count":336,"lower_bound":"LTE0NDc0NTc0NjQ=","upper_bound":"LTE0MzQ2NjY5OTQ=","repeats":1},{"count":344,"lower_bound":"LTE0MzE3NTI3MTI=","upper_bound":"LTE0MzAwOTM0NDI=","repeats":1},{"count":352,"lower_bound":"LTE0Mjk2NTM2NjE=","upper_bound":"LTEzOTI5MzcwOTY=","repeats":1},{"count":360,"lower_bound":"LTEzOTIwNjk0NDY=","upper_bound":"LTEzNjYxMjUzNDA=","repeats":1},{"count":368,"lower_bound":"LTEzNTk5MTg0NDI=","upper_bound":"LTEzNTE5NzgxNTQ=","repeats":1},{"count":376,"lower_bound":"LTEzNTA4Njg2MTY=","upper_bound":"LTEzMzYwNzIyODk=","repeats":1},{"count":384,"lower_bound":"LTEzMzIzNTE5NDE=","upper_bound":"LTEzMjAyMDY0ODY=","repeats":1},{"count":392,"lower_bound":"LTEzMTcwMzA1NTM=","upper_bound":"LTEyODcxMTQ1NzM=","repeats":1},{"count":400,"lower_bound":"LTEyODQ1MDA2Mjc=","upper_bound":"LTEyNzM1NzY3MzE=","repeats":1},{"count":408,"lower_bound":"LTEyNzMwNzM5NzY=","upper_bound":"LTEyNjg3ODEzOTE=","repeats":1},{"count":416,"lower_bound":"LTEyNjQ5MTY0MTc=","upper_bound":"LTEyNDgxNTc5NjQ=","repeats":1},{"count":424,"lower_bound":"LTEyMzc3OTcwNTY=","upper_bound":"LTEyMTQ2Mzc0NDA=","repeats":1},{"count":432,"lower_bound":"LTEyMTE3MjE1OTU=","upper_bound":"LTEyMDEzNjM2NjY=","repeats":1},{"count":440,"lower_bound":"LTExOTk5ODUwMjk=","upper_bound":"LTExOTg2NzIzOTE=","repeats":1},{"count":448,"lower_bound":"LTExOTM4NDk5Nzg=","upper_bound":"LTExNzA5ODczNDk=","repeats":1},{"count":456,"lower_bound":"LTExNTc2MzQ5Mjg=","upper_bound":"LTExNTA4NjU5MjM=","repeats":1},{"count":464,"lower_bound":"LTExNDk4MjcyMjE=","upper_bound":"LTExNDAzNjg3NzY=","repeats":1},{"count":472,"lower_bound":"LTExMzk1NTQ5MjA=","upper_bound":"LTExMTkzMzk4NTI=","repeats":1},{"count":480,"lower_bound":"LTExMTQ4NDU5MDY=","upper_bound":"LTExMTA0MzU0NTg=","repeats":1},{"count":488,"lower_bound":"LTExMDk1NTA4MzA=","upper_bound":"LTExMDA2MjYxMTY=","repeats":1},{"count":496,"lower_bound":"LTEwOTE3MTE0MDA=","upper_bound":"LTEwNjcyMzM1Nzk=","repeats":1},{"count":504,"lower_bound":"LTEwNjY1NDc0OTQ=","upper_bound":"LTEwNTIzMjAyMzI=","repeats":1},{"count":512,"lower_bound":"LTEwNDYzOTkwMzM=","upper_bound":"LTEwMzg2MjkyNzQ=","repeats":1},{"count":520,"lower_bound":"LTEwMzU5MzUzNzU=","upper_bound":"LTEwMjQ5MjQzNzg=","repeats":1},{"count":528,"lower_bound":"LTEwMTc2MjkyODc=","upper_bound":"LTEwMDAwMDAyNjA=","repeats":1},{"count":536,"lower_bound":"LTk5NTcwNjM1Mw==","upper_bound":"LTk4MzI1NjM5Mw==","repeats":1},{"count":544,"lower_bound":"LTk4MDIwMTM1OQ==","upper_bound":"LTk1NjMyMTgxNw==","repeats":1},{"count":552,"lower_bound":"LTk1NTk2MzQzOA==","upper_bound":"LTk0MzY0MzAyOQ==","repeats":1},{"count":560,"lower_bound":"LTkzODg3OTMxNw==","upper_bound":"LTkzMjkyNjg5OQ==","repeats":1},{"count":568,"lower_bound":"LTkyNzEwNjgwOA==","upper_bound":"LTkwODM5NTU2OQ==","repeats":1},{"count":576,"lower_bound":"LTkwNzU0OTg0Mw==","upper_bound":"LTg5ODc0NTQwMw==","repeats":1},{"count":584,"lower_bound":"LTg3NTA2MzkwOA==","upper_bound":"LTg2MDk3MjAwMg==","repeats":1},{"count":592,"lower_bound":"LTg1Njg5MDUxNg==","upper_bound":"LTg1MzU3NjkwMA==","repeats":1},{"count":600,"lower_bound":"LTg1MDM1NTU2OA==","upper_bound":"LTgxNzI4Njg5Ng==","repeats":1},{"count":608,"lower_bound":"LTgxMzgyNzk2Ng==","upper_bound":"LTgwODgyNTYzNw==","repeats":1},{"count":616,"lower_bound":"LTc5MzM3ODYzOQ==","upper_bound":"LTc4MzI2OTI2Mw==","repeats":1},{"count":624,"lower_bound":"LTc2ODA2OTkxMg==","upper_bound":"LTc2NzI2OTgzNg==","repeats":1},{"count":632,"lower_bound":"LTc2NjQ5MjY4NA==","upper_bound":"LTc2MzA3MzI2Mw==","repeats":1},{"count":640,"lower_bound":"LTc2MjMwNzg1OA==","upper_bound":"LTc1NDA4NTI4Ng==","repeats":1},{"count":648,"lower_bound":"LTc1MDg5NjEyMA==","upper_bound":"LTcyNzg2MzAwNg==","repeats":1},{"count":656,"lower_bound":"LTcyNjA1NDgyMA==","upper_bound":"LTcxNTg3MTI5OA==","repeats":1},{"count":664,"lower_bound":"LTcxMTEwMjgyNw==","upper_bound":"LTY4NzA3NDUxOA==","repeats":1},{"count":672,"lower_bound":"LTY3NjM0NjY0NA==","upper_bound":"LTY1MDg3MzQ0MQ==","repeats":1},{"count":680,"lower_bound":"LTY0ODc2MjU2MA==","upper_bound":"LTYzNjgzMDczNg==","repeats":1},{"count":688,"lower_bound":"LTYzNjU0OTIzOA==","upper_bound":"LTYxNTkyMDYwMw==","repeats":1},{"count":696,"lower_bound":"LTYwODYzMjI1MQ==","upper_bound":"LTYwMDQwMzMzMQ==","repeats":1},{"count":704,"lower_bound":"LTU5NjU3NjQzNA==","upper_bound":"LTU4ODUxMDM3Mw==","repeats":1},{"count":712,"lower_bound":"LTU4MDE3MjU2Nw==","upper_bound":"LTU3MjY1MzA4Mg==","repeats":1},{"count":720,"lower_bound":"LTU3MTkxODE2Mw==","upper_bound":"LTU1OTc5MDAwNA==","repeats":1},{"count":728,"lower_bound":"LTU1NjkwMzM0OA==","upper_bound":"LTU0NTYxMzExOQ==","repeats":1},{"count":736,"lower_bound":"LTUzMTkxODcxNw==","upper_bound":"LTUxMzMwMTI1Mw==","repeats":1},{"count":744,"lower_bound":"LTUwNDkwODc2MQ==","upper_bound":"LTQ4NjU1MDE1NA==","repeats":1},{"count":752,"lower_bound":"LTQ4Mzk4MjUxNQ==","upper_bound":"LTQ3Njg5Mjg3NQ==","repeats":1},{"count":760,"lower_bound":"LTQ1OTU3MjI2OQ==","upper_bound":"LTQ1Mzk4MDYzMw==","repeats":1},{"count":768,"lower_bound":"LTQ0ODc2MTQyOA==","upper_bound":"LTQ0MDg1MDc0OA==","repeats":1},{"count":776,"lower_bound":"LTQzNjA3NDEwMg==","upper_bound":"LTQyOTc2MDU0OA==","repeats":1},{"count":784,"lower_bound":"LTQxMjA5NzE4Mw==","upper_bound":"LTQwNDAwMTM3Ng==","repeats":1},{"count":792,"lower_bound":"LTQwMzc3NzM0OA==","upper_bound":"LTM3NDQ3Mjk3OA==","repeats":1},{"count":800,"lower_bound":"LTM2MDU0NDEzNg==","upper_bound":"LTM1MTQ1NTI1OA==","repeats":1},{"count":808,"lower_bound":"LTM0ODU3NjQyMw==","upper_bound":"LTMzNjMyNjMwNQ==","repeats":1},{"count":816,"lower_bound":"LTMzNDM0OTEyNg==","upper_bound":"LTMyODI0Nzc2NQ==","repeats":1},{"count":824,"lower_bound":"LTMxNzk0OTc4NQ==","upper_bound":"LTI5OTQ3MDIxMA==","repeats":1},{"count":832,"lower_bound":"LTI5NDM4NDgzMw==","upper_bound":"LTI4MTE3NjA3NQ==","repeats":1},{"count":840,"lower_bound":"LTI3ODQwOTIzMg==","upper_bound":"LTI2NTIwODM4Nw==","repeats":1},{"count":848,"lower_bound":"LTI1OTgyMjg1NQ==","upper_bound":"LTI1MjkzMzQ3Nw==","repeats":1},{"count":856,"lower_bound":"LTI1MDg1MTc4MQ==","upper_bound":"LTI0MDU3OTY1NA==","repeats":1},{"count":864,"lower_bound":"LTIzNzAyMjg0NQ==","upper_bound":"LTIxOTUzMDc3NA==","repeats":1},{"count":872,"lower_bound":"LTIxMjM0MDQyNg==","upper_bound":"LTE5NzI3OTE3MQ==","repeats":1},{"count":880,"lower_bound":"LTE5MTAwOTY2MQ==","upper_bound":"LTE3MjA0ODk4NQ==","repeats":1},{"count":888,"lower_bound":"LTE3MDY2NjE0Mg==","upper_bound":"LTE2NTAwMjcyMQ==","repeats":1},{"count":896,"lower_bound":"LTE2NDQ4MjYxMw==","upper_bound":"LTE0Nzk5OTIwNg==","repeats":1},{"count":904,"lower_bound":"LTE0MTAyMzYyMg==","upper_bound":"LTEyODk0MTg1NA==","repeats":1},{"count":912,"lower_bound":"LTExOTQ1OTcwNw==","upper_bound":"LTk5MTM1NDEy","repeats":1},{"count":920,"lower_bound":"LTk2NjAxOTAz","upper_bound":"LTkwMzI4MTAx","repeats":1},{"count":928,"lower_bound":"LTgwNTMwNDcz","upper_bound":"LTc0NjQyMDM5","repeats":1},{"count":936,"lower_bound":"LTY1NjUyNzAw","upper_bound":"LTEyMzcyNDA2","repeats":1},{"count":944,"lower_bound":"LTEyMTQyMjk3","upper_bound":"LTQ5OTM1MDQ=","repeats":1},{"count":952,"lower_bound":"LTE3NDQ0NTE=","upper_bound":"MTAyODkxNTU=","repeats":1},{"count":960,"lower_bound":"MTI3OTk4NjE=","upper_bound":"MjAyMDA1NjQ=","repeats":1},{"count":968,"lower_bound":"MzUyMzAyMzI=","upper_bound":"NTc0OTc2MjQ=","repeats":1},{"count":976,"lower_bound":"NTc5MDM5MzQ=","upper_bound":"NjE3NzIyMzU=","repeats":1},{"count":984,"lower_bound":"NjM1OTc2NzU=","upper_bound":"ODU1Mzk3Mjk=","repeats":1},{"count":992,"lower_bound":"ODk5NDU3MjE=","upper_bound":"MTAwNzU1MzI1","repeats":1},{"count":1000,"lower_bound":"MTA0MTA4NDkx","upper_bound":"MTM0Njc5ODQ2","repeats":1},{"count":1008,"lower_bound":"MTM1NjI2MTc5","upper_bound":"MTQ0MjM3MjY5","repeats":1},{"count":1016,"lower_bound":"MTQ1ODE2OTkx","upper_bound":"MTUxODIxNTg3","repeats":1},{"count":1024,"lower_bound":"MTYwNTYzNTQ4","upper_bound":"MTc4NjgyNTE2","repeats":1},{"count":1032,"lower_bound":"MTgxODIxNDA2","upper_bound":"MTgzNjY0NDgz","repeats":1},{"count":1040,"lower_bound":"MTg0MjA5NzI2","upper_bound":"MTk3Njk4Nzg5","repeats":1},{"count":1048,"lower_bound":"MjAyNjYyMTU4","upper_bound":"MjExMzYyNDE2","repeats":1},{"count":1056,"lower_bound":"MjIzODY0NjYz","upper_bound":"MjQxMzY1NDgy","repeats":1},{"count":1064,"lower_bound":"MjQ0MjQ3MTg4","upper_bound":"MjU2NzQ5MjQ3","repeats":1},{"count":1072,"lower_bound":"MjU3OTAyNzAx","upper_bound":"MjYxNTkxMTAw","repeats":1},{"count":1080,"lower_bound":"MjYyNzg0Mzcz","upper_bound":"MjY2ODM5Mzc0","repeats":1},{"count":1088,"lower_bound":"MjY4MTQyNTEw","upper_bound":"MjgxNDY2NTA4","repeats":1},{"count":1096,"lower_bound":"MjgxNTEyNTEz","upper_bound":"Mjg1MzA3Nzc1","repeats":1},{"count":1104,"lower_bound":"Mjg1ODIyNTU4","upper_bound":"Mjk0NTk2NjAz","repeats":1},{"count":1112,"lower_bound":"Mjk2NjU3MzMz","upper_bound":"MzEwMDEyNTEy","repeats":1},{"count":1120,"lower_bound":"MzE1MDU1NzUy","upper_bound":"MzM5MTk1NzQ4","repeats":1},{"count":1128,"lower_bound":"MzQzNjU1NjY1","upper_bound":"MzU4NzkwOTEx","repeats":1},{"count":1136,"lower_bound":"MzY2OTQ0MjA5","upper_bound":"Mzg3NDc5MjA3","repeats":1},{"count":1144,"lower_bound":"Mzk3MjMyNzcz","upper_bound":"NDAyNzI2NzAx","repeats":1},{"count":1152,"lower_bound":"NDA4NTU4NDIw","upper_bound":"NDMyNTAwNjgx","repeats":1},{"count":1160,"lower_bound":"NDMyNjk2NDM1","upper_bound":"NDQwMzQ1NjAy","repeats":1},{"count":1168,"lower_bound":"NDQ0ODQ1ODQ2","upper_bound":"NDUyNjUyMzQ5","repeats":1},{"count":1176,"lower_bound":"NDU1ODY0NTI4","upper_bound":"NDY0MDA5NTc1","repeats":1},{"count":1184,"lower_bound":"NDY5NzIxMjEz","upper_bound":"NDc1ODQyMTg0","repeats":1},{"count":1192,"lower_bound":"NDc3NjY4Mjk3","upper_bound":"NDgxNzg5NDgx","repeats":1},{"count":1200,"lower_bound":"NDgzOTI4NDE4","upper_bound":"NDk1NDIxOTI4","repeats":1},{"count":1208,"lower_bound":"NTAwOTkzNzc5","upper_bound":"NTI3ODc3Mzg1","repeats":1},{"count":1216,"lower_bound":"NTI5NjAzMTc3","upper_bound":"NTQyMDQ5Njcx","repeats":1},{"count":1224,"lower_bound":"NTQ4MzcyNTQ5","upper_bound":"NTY3Nzc0OTQx","repeats":1},{"count":1232,"lower_bound":"NTY4NjEzMjYz","upper_bound":"NTcyMzIxMTQ3","repeats":1},{"count":1240,"lower_bound":"NTczMzYzNTU0","upper_bound":"NTgyNDcwMjM0","repeats":1},{"count":1248,"lower_bound":"NTg1OTU0ODAz","upper_bound":"NTkwMTczMTU2","repeats":1},{"count":1256,"lower_bound":"NTk5OTc0Njk1","upper_bound":"NjIwMTY0OTk0","repeats":1},{"count":1264,"lower_bound":"NjIzMjQ0MTIy","upper_bound":"NjI5NzYwMzA3","repeats":1},{"count":1272,"lower_bound":"NjMwNzM3MzM4","upper_bound":"NjU3Mjc4OTEx","repeats":1},{"count":1280,"lower_bound":"NjU3NTIwMjQy","upper_bound":"NjY5Mjc0ODY5","repeats":1},{"count":1288,"lower_bound":"NjcwMTc1ODgz","upper_bound":"Njk3MjI4NTcz","repeats":1},{"count":1296,"lower_bound":"Njk5OTAwMDky","upper_bound":"NzE1NzA4ODQw","repeats":1},{"count":1304,"lower_bound":"NzE2MzY2NjA0","upper_bound":"NzIzNzA1OTEw","repeats":1},{"count":1312,"lower_bound":"NzI4NjA4Nzgw","upper_bound":"NzU0OTEwNjQ0","repeats":1},{"count":1320,"lower_bound":"NzU4MDk5NDkz","upper_bound":"NzgwNzg3NDcx","repeats":1},{"count":1328,"lower_bound":"NzgyMTk2NjQy","upper_bound":"Nzk1MjU1MzY3","repeats":1},{"count":1336,"lower_bound":"Nzk5MDYzNDQx","upper_bound":"ODA3Nzc2MzQ3","repeats":1},{"count":1344,"lower_bound":"ODE0Njg1NDUy","upper_bound":"ODMzODAwNjE3","repeats":1},{"count":1352,"lower_bound":"ODM5NjA2NjM3","upper_bound":"ODQ2MjIyMzgz","repeats":1},{"count":1360,"lower_bound":"ODUwNTI5OTk5","upper_bound":"ODgzMjc4MTEy","repeats":1},{"count":1368,"lower_bound":"ODg2MjY1OTQw","upper_bound":"OTAwNzg1MTQ1","repeats":1},{"count":1376,"lower_bound":"OTAxODM4MDE4","upper_bound":"OTM2ODQwMjAz","repeats":1},{"count":1384,"lower_bound":"OTM2ODk1NDM0","upper_bound":"OTQ1MTM5MTA0","repeats":1},{"count":1392,"lower_bound":"OTQ2OTA1NjU3","upper_bound":"OTU0MDU0ODQ5","repeats":1},{"count":1400,"lower_bound":"OTU2MjUzMDEz","upper_bound":"OTg5NTcyNTIz","repeats":1},{"count":1408,"lower_bound":"MTAwMzYzNTc1Mg==","upper_bound":"MTAxNjM3NDcwMg==","repeats":1},{"count":1416,"lower_bound":"MTAyMjc3MzM3MQ==","upper_bound":"MTA0ODI4MDU0NQ==","repeats":1},{"count":1424,"lower_bound":"MTA1NzU1NTQ1Mw==","upper_bound":"MTA2OTMyNjk3Mg==","repeats":1},{"count":1432,"lower_bound":"MTA3MTIyNDc0OA==","upper_bound":"MTA3NjkzOTU5NA==","repeats":1},{"count":1440,"lower_bound":"MTA3OTU4MzQ4OQ==","upper_bound":"MTA5Nzk0OTYxMQ==","repeats":1},{"count":1448,"lower_bound":"MTA5OTE1NjY2NQ==","upper_bound":"MTExMTM5NTkzOA==","repeats":1},{"count":1456,"lower_bound":"MTExNzQ5NzU4Nw==","upper_bound":"MTEyOTgzMDQ0NA==","repeats":1},{"count":1464,"lower_bound":"MTE0NDQyODk1Ng==","upper_bound":"MTE2MDg5NDg3OQ==","repeats":1},{"count":1472,"lower_bound":"MTE2MjM5NjA0MQ==","upper_bound":"MTE2NjUzMzIzMQ==","repeats":1},{"count":1480,"lower_bound":"MTE2NzI5MjYwOQ==","upper_bound":"MTE3OTc4MDYzNg==","repeats":1},{"count":1488,"lower_bound":"MTE4MzI0NTE4Mg==","upper_bound":"MTE4OTEzMDY1MA==","repeats":1},{"count":1496,"lower_bound":"MTE5MjQ4NzQ5MQ==","upper_bound":"MTIwODMzNDczMA==","repeats":1},{"count":1504,"lower_bound":"MTIxNDg3MTgxOA==","upper_bound":"MTIyMTEyMzUwMQ==","repeats":1},{"count":1512,"lower_bound":"MTIyMjc2MTIxMA==","upper_bound":"MTI0NTgxMDk3NQ==","repeats":1},{"count":1520,"lower_bound":"MTI0NzU0NzgzMA==","upper_bound":"MTI1NjU3NzA4Nw==","repeats":1},{"count":1528,"lower_bound":"MTI1NjY3ODcxNw==","upper_bound":"MTI2Njg2OTc4MQ==","repeats":1},{"count":1536,"lower_bound":"MTI3MDA2MzE2OA==","upper_bound":"MTI4MjYwOTMxMQ==","repeats":1},{"count":1544,"lower_bound":"MTI4MzM3MjU2Ng==","upper_bound":"MTI5MDA2NjcyNw==","repeats":1},{"count":1552,"lower_bound":"MTI5MjI2NzM1Ng==","upper_bound":"MTMwMjM0NjU4Nw==","repeats":1},{"count":1560,"lower_bound":"MTMwNDcyOTM2NA==","upper_bound":"MTMxMDcxMTgzOQ==","repeats":1},{"count":1568,"lower_bound":"MTMxNjAxNDk3MA==","upper_bound":"MTMyMzk5NTQ0OA==","repeats":1},{"count":1576,"lower_bound":"MTMzNDg0MTkwMw==","upper_bound":"MTM0NDMyMDQ2Mw==","repeats":1},{"count":1584,"lower_bound":"MTM0NTI5NzA3NQ==","upper_bound":"MTM1NDQwMTIyMg==","repeats":1},{"count":1592,"lower_bound":"MTM1NjAzNzgzMw==","upper_bound":"MTM2NzkwNDk2NA==","repeats":1},{"count":1600,"lower_bound":"MTM3MTQwNDgwOQ==","upper_bound":"MTM4MTk2MjgyNQ==","repeats":1},{"count":1608,"lower_bound":"MTM4NDY2ODc0Mw==","upper_bound":"MTQxMDAyMTk4MQ==","repeats":1},{"count":1616,"lower_bound":"MTQxMjc2NzU3OQ==","upper_bound":"MTQxNjgwOTc0Mw==","repeats":1},{"count":1624,"lower_bound":"MTQyMjA5MDA4Ng==","upper_bound":"MTQ0Nzk3NDUwOA==","repeats":1},{"count":1632,"lower_bound":"MTQ1MDg5NTYxMw==","upper_bound":"MTQ3MTE4ODg3OQ==","repeats":1},{"count":1640,"lower_bound":"MTQ3OTAzOTA1OQ==","upper_bound":"MTQ5MzM2NjE3MA==","repeats":1},{"count":1648,"lower_bound":"MTQ5MzM4OTk2OQ==","upper_bound":"MTUwNzY0MjE1NQ==","repeats":1},{"count":1656,"lower_bound":"MTUxMzk4NTAxNg==","upper_bound":"MTUyNDcxODcxNA==","repeats":1},{"count":1664,"lower_bound":"MTUyODE4OTQwNQ==","upper_bound":"MTUzMjI3Njg5Nw==","repeats":1},{"count":1672,"lower_bound":"MTUzOTU3NjQ2MA==","upper_bound":"MTU1MDg1MzIzMg==","repeats":1},{"count":1680,"lower_bound":"MTU1NDQ2MDY4OA==","upper_bound":"MTU2MTY2NTIwNw==","repeats":1},{"count":1688,"lower_bound":"MTU2MzU0NDUxMw==","upper_bound":"MTU4MDQ3MjUzMg==","repeats":1},{"count":1696,"lower_bound":"MTU5MDAzMTgzNg==","upper_bound":"MTU5Njk3MzAwOA==","repeats":1},{"count":1704,"lower_bound":"MTU5NzU1ODMyNQ==","upper_bound":"MTYxNTU1MzQzNg==","repeats":1},{"count":1712,"lower_bound":"MTYxNTY0NDE4Mg==","upper_bound":"MTYyNjc2NDc1Mg==","repeats":1},{"count":1720,"lower_bound":"MTYyNzk0MDU0OA==","upper_bound":"MTYzMzU5NzMwMg==","repeats":1},{"count":1728,"lower_bound":"MTYzNDAzODk3NA==","upper_bound":"MTY0NTMxODg4MQ==","repeats":1},{"count":1736,"lower_bound":"MTY0NTkzMjMwMA==","upper_bound":"MTY1MjY2OTAwNQ==","repeats":1},{"count":1744,"lower_bound":"MTY1Njc1ODc2MA==","upper_bound":"MTY3NDE2ODg3NQ==","repeats":1},{"count":1752,"lower_bound":"MTY3NDc2ODI1Ng==","upper_bound":"MTY5MjM1NDgxMg==","repeats":1},{"count":1760,"lower_bound":"MTY5ODA4ODc3NQ==","upper_bound":"MTcwOTEyNTY2OA==","repeats":1},{"count":1768,"lower_bound":"MTcxNDUxODY3Mg==","upper_bound":"MTcyMzA1MDQ2Nw==","repeats":1},{"count":1776,"lower_bound":"MTcyNjEyMDU2Ng==","upper_bound":"MTczNjA5MjYyMA==","repeats":1},{"count":1784,"lower_bound":"MTczODA2MjA3Mw==","upper_bound":"MTc0NDQ5NzIwMg==","repeats":1},{"count":1792,"lower_bound":"MTc0Njc0NzAzMw==","upper_bound":"MTc2NzI5ODExMA==","repeats":1},{"count":1800,"lower_bound":"MTc3OTk0NDI3Mg==","upper_bound":"MTc5NTAwNzg0OQ==","repeats":1},{"count":1808,"lower_bound":"MTc5NTU4NzI3MQ==","upper_bound":"MTgwMjA0NzUxNw==","repeats":1},{"count":1816,"lower_bound":"MTgwOTcwODAxOQ==","upper_bound":"MTgxOTg0MDAxOA==","repeats":1},{"count":1824,"lower_bound":"MTgyMjY3MDM5NQ==","upper_bound":"MTg0NTUwNTE2Mw==","repeats":1},{"count":1832,"lower_bound":"MTg0NTU2MTYwMg==","upper_bound":"MTg0NzQ2OTk4Ng==","repeats":1},{"count":1840,"lower_bound":"MTg0OTYyOTc5MA==","upper_bound":"MTg3MDM0OTY3Ng==","repeats":1},{"count":1848,"lower_bound":"MTg3NTIwNzU1Nw==","upper_bound":"MTg4NTcyNDIyMA==","repeats":1},{"count":1856,"lower_bound":"MTg4NjExNDQxOQ==","upper_bound":"MTg5NDIyMjYyNw==","repeats":1},{"count":1864,"lower_bound":"MTg5NDgxOTQzMQ==","upper_bound":"MTg5OTQ0MzY1OA==","repeats":1},{"count":1872,"lower_bound":"MTg5OTc0MjI3Mg==","upper_bound":"MTkyMTUzNzY0OA==","repeats":1},{"count":1880,"lower_bound":"MTkyMjEyNTU0OQ==","upper_bound":"MTkzMjc4MTU3MA==","repeats":1},{"count":1888,"lower_bound":"MTk0NDM0OTY2Mw==","upper_bound":"MTk2NjM5OTI5Ng==","repeats":1},{"count":1896,"lower_bound":"MTk3MzA4MjcyNw==","upper_bound":"MTk3NzEyOTkxMg==","repeats":1},{"count":1904,"lower_bound":"MTk4NjIwODAzNA==","upper_bound":"MTk5MDYwMTQzNw==","repeats":1},{"count":1912,"lower_bound":"MTk5MTgxNTU4OQ==","upper_bound":"MTk5NzAxMjIyNA==","repeats":1},{"count":1920,"lower_bound":"MTk5ODQwOTgwNA==","upper_bound":"MjAwMjM2OTExNQ==","repeats":1},{"count":1928,"lower_bound":"MjAwOTQ2MTU2Ng==","upper_bound":"MjAyOTI1ODYyNg==","repeats":1},{"count":1936,"lower_bound":"MjAyOTcxNTk1Mw==","upper_bound":"MjAzMTcwNzQxOA==","repeats":1},{"count":1944,"lower_bound":"MjAzMjcwOTcxNg==","upper_bound":"MjA1NDIzMDY4Ng==","repeats":1},{"count":1952,"lower_bound":"MjA1NTE0NzcxOQ==","upper_bound":"MjA2OTQ4MDA4MA==","repeats":1},{"count":1960,"lower_bound":"MjA3MDQ3NDU1Ng==","upper_bound":"MjA3ODU2NzAzOA==","repeats":1},{"count":1968,"lower_bound":"MjA4ODg3NDYxNA==","upper_bound":"MjA5MTQxMjI0OQ==","repeats":1},{"count":1976,"lower_bound":"MjA5NDM2Nzk4Mg==","upper_bound":"MjEwNjE5Mzk0Mw==","repeats":1},{"count":1984,"lower_bound":"MjExMTAzNDA5MQ==","upper_bound":"MjExMzIxMzQ3OQ==","repeats":1},{"count":1992,"lower_bound":"MjExODg5NzIxNg==","upper_bound":"MjEyNzI3Mjc2Mg==","repeats":1},{"count":2000,"lower_bound":"MjEyNzQ2MDgwMw==","upper_bound":"MjE0MzIxMTY1MQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,3,0,2,0,0,1,1,1,0,1,1,2,0,1,1,2,1,0,0,1,1,1,1,0,1,0,1,1,0,1,1,0,4,1,0,0,1,0,1,0,0,2,0,2,1,2,2,0,2,0,1,2,0,0,0,1,2,3,2,1,0,2,0,2,0,0,0,1,0,1,0,2,1,0,2,2,1,1,1,0,1,0,0,2,2,1,3,3,0,2,1,0,0,1,0,1,1,0,1,1,1,1,0,2,0,1,2,1,3,2,1,2,1,1,0,2,1,0,0,1,0,0,1,2,0,1,0,1,0,3,2,1,3,2,3,1,1,1,0,3,0,0,3,2,2,1,2,2,1,0,2,0,2,0,1,1,0,1,0,0,1,1,1,0,2,0,0,0,0,0,1,0,1,1,1,2,2,3,0,1,1,0,2,1,1,1,2,1,1,1,0,1,0,3,3,1,1,1,0,1,3,1,1,1,1,1,2,1,1,1,5,0,0,1,0,0,1,1,1,1,0,0,2,0,0,1,4,1,1,0,0,3,0,4,0,2,1,1,1,0,0,1,0,1,0,0,0,2,1,0,1,1,1,0,1,1,1,2,0,1,0,0,3,1,0,0,0,2,2,1,1,1,1,4,1,1,1,0,2,1,1,3,0,2,0,1,0,1,2,0,5,0,1,0,0,1,2,0,1,1,1,2,0,1,1,2,1,1,1,0,1,1,2,2,1,2,0,1,1,1,0,1,3,0,0,0,1,2,0,0,2,3,1,1,3,1,2,0,0,1,1,0,2,1,1,1,1,1,1,0,0,2,4,1,0,1,1,2,2,0,1,1,1,0,1,1,2,1,0,1,0,0,0,0,1,0,2,3,3,1,1,0,0,0,1,4,1,0,1,2,1,1,1,2,0,1,0,0,1,3,0,0,3,1,3,3,0,1,0,2,0,2,1,0,4,1,1,1,0,1,0,2,0,1,1,1,2,0,1,0,1,0,1,0,0,1,1,2,0,0,2,1,0,0,2,0,1,0,0,1,1,0,0,1,0,2,0,0,3,2,0,0,0,1,0,0,0,1,2,2,0,1,1,1,0,2,0,0,0,0,1,1,0,2,0,1,2,1,0,1,1,0,2,0,2,1,1,0,0,0,1,0,2,0,0,1,2,1,2,0,1,2,0,1,2,3,0,0,2,1,0,0,1,2,1,1,2,2,1,2,3,1,0,2,0,0,5,1,1,0,2,2,1,0,2,1,0,0,2,1,1,1,0,0,1,0,2,1,1,1,0,4,0,0,4,0,1,0,1,2,2,3,1,0,3,0,0,3,2,1,0,1,1,1,1,0,2,0,1,0,1,0,1,0,0,3,0,1,1,0,0,2,2,2,0,0,1,1,1,0,0,0,0,0,1,0,2,4,0,0,1,1,2,2,2,0,0,0,0,0,2,2,2,0,0,1,0,0,1,1,2,1,1,1,0,0,0,0,2,1,2,1,0,1,1,0,2,1,2,0,0,1,0,1,2,1,1,0,0,0,1,2,1,1,1,1,1,0,1,0,1,3,0,2,0,0,2,1,1,3,0,1,0,2,0,2,2,0,0,3,3,0,1,2,0,3,2,1,0,0,4,0,3,0,1,1,0,1,1,2,0,4,0,2,1,2,0,0,0,0,1,0,1,0,2,0,0,0,2,1,1,2,2,1,1,0,1,1,1,0,1,1,0,2,2,0,0,2,3,1,1,0,1,1,0,2,0,1,1,0,0,0,0,0,0,1,0,1,1,0,0,0,1,2,0,0,0,1,2,0,0,2,1,0,1,3,1,0,3,0,1,3,0,1,0,2,0,1,2,3,0,1,0,0,2,1,1,1,0,1,1,2,0,3,0,3,0,1,0,0,4,0,0,2,2,0,1,2,0,0,3,3,1,0,1,1,0,1,0,1,3,2,0,2,0,0,0,0,0,1,0,1,0,1,1,1,2,1,1,2,1,0,0,2,2,0,1,1,0,0,0,0,1,5,3,1,0,1,0,2,1,0,2,0,1,2,0,0,2,1,2,2,1,2,0,2,0,1,1,0,1,2,2,1,1,1,2,1,3,2,3,2,2,1,2,1,2,0,0,1,1,0,1,1,1,3,1,3,1,2,0,1,1,2,1,3,0,0,1,1,2,0,0,2,1,1,1,0,2,2,0,0,2,2,1,0,0,0,2,0,1,0,2,1,0,0,1,0,1,1,1,0,3,0,0,2,0,1,0,0,2,0,1,0,0,3,1,1,1,0,1,1,1,0,1,0,1,0,0,0,0,0,3,1,1,2,2,3,2,1,1,3,1,0,0,0,0,1,0,1,0,1,1,3,0,0,1,1,0,0,1,0,2,1,2,0,0,2,3,0,1,0,1,1,0,1,0,4,1,5,2,2,1,0,0,0,2,1,2,2,4,1,1,0,2,1,2,0,2,1,0,3,1,0,0,1,1,1,2,0,2,1,1,0,1,2,2,1,1,1,1,0,0,3,0,1,1,0,2,1,1,0,0,1,2,3,1,0,0,3,1,1,2,2,0,2,3,1,3,0,1,2,0,1,1,1,2,2,2,0,2,0,2,0,0,1,2,1,0,3,2,1,0,2,1,1,0,0,1,0,0,1,1,0,0,0,1,0,0,0,1,0,0,0,1,1,2,3,0,4,1,1,1,1,1,1,0,2,1,1,2,0,0,1,0,2,1,1,0,0,0,1,2,0,1,3,1,0,0,1,2,2,1,0,0,4,1,0,1,1,1,1,1,0,2,0,1,1,0,1,0,1,0,0,3,1,0,1,2,2,1,0,1,0,1,0,1,0,2,0,2,1,0,1,1,4,1,2,2,3,1,1,1,1,0,0,1,0,1,1,0,1,2,0,0,0,0,0,1,0,1,2,2,1,1,1,3,0,2,2,1,1,1,1,1,2,2,1,0,2,0,1,0,0,0,1,2,1,0,3,2,2,1,0,0,0,0,1,2,2,1,2,2,0,0,2,1,3,0,0,0,0,0,3,3,1,1,0,0,0,0,1,0,1,1,0,0,1,4,0,0,2,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,2,1,0,2,2,1,2,0,0,1,0,3,1,2,0,0,2,0,0,0,1,0,1,2,1,0,1,2,2,2,0,0,1,3,0,0,0,0,0,2,0,0,0,1,0,2,1,2,0,0,0,0,3,2,3,0,2,1,0,1,0,0,1,1,2,2,0,0,0,1,0,2,1,1,3,0,0,1,1,1,3,0,1,1,2,1,2,1,1,2,1,1,2,3,2,2,1,3,3,0,1,1,1,1,0,0,0,1,1,0,3,2,2,1,4,2,0,0,1,1,0,0,2,0,2,1,1,3,0,2,3,3,1,1,1,1,2,0,0,2,0,1,1,4,0,1,1,1,0,0,3,0,0,1,1,1,2,1,1,1,0,2,1,0,3,5,0,2,0,1,2,0,3,1,0,1,1,0,1,1,2,1,0,1,1,0,1,0,1,1,2,1,2,1,1,0,0,0,0,0,1,1,0,1,0,0,1,1,1,2,0,0,1,0,0,1,0,3,1,2,2,0,0,1,1,0,1,0,0,0,1,1,0,0,2,2,2,2,3,0,1,0,0,1,0,0,2,0,0,3,1,3,2,0,1,2,1,0,1,1,0,0,1,1,3,0,0,2,2,1,1,0,0,1,0,1,1,3,3,1,1,2,1,2,1,0,0,0,1,0,0,0,5,1,0,1,1,2,4,0,1,0,1,2,2,1,3,0,0,3,1,1,0,1,1,2,0,1,0,2,2,0,3,1,1,1,1,1,2,1,0,0,2,1,1,0,1,1,1,0,0,1,0,0,2,1,0,0,1,2,2,1,1,1,0,3,3,0,1,0,0,0,0,3,0,0,1,0,1,0,1,1,0,0,0,0,2,1,0,1,1,0,0,1,1,2,0,0,1,0,1,1,1,1,0,1,1,1,1,1,1,0,2,0,4,0,1,0,3,1,3,0,1,2,0,0,1,1,1,2,0,0,1,1,0,0,3,1,1,2,1,1,1,2,0,0,0,1,3,1,1,1,1,1,2,1,0,3,2,1,0,1,0,4,3,1,2,0,0,1,1,1,0,2,0,3,1,1,0,0,0,2,1,0,4,0,1,2,1,1,0,1,3,1,3,1,1,0,0,1,0,0,0,1,2,2,1,2,0,2,2,0,2,3,1,0,0,1,0,4,2,0,0,0,1,1,0,1,0,1,0,3,0,1,1,0,1,0,1,0,1,0,1,0,3,2,0,1,0,1,0,0,0,1,3,0,2,2,1,0,0,3,3,0,0,1,0,0,1,1,1,1,3,1,1,2,1,1,2,0,1,0,3,0,1,3,2,4,1,2,1,3,1,0,1,0,1,1,2,0,1,1,1,1,1,0,0,0,0,4,1,2,0,1,0,0,1,0,2,1,3,0,1,0,0,0,1,1,1,0,1,0,1,1,4,1,0,0,0,0,1,2,0,3,1,0,1,3,0,2,1,0,0,0,0,3,2,0,1,0,1,0,1,1,2,1,1,1,1,0,0,0,0,1,0,4,1,1,1,0,0,0,0,1,2,0,2,0,1]},{"counters":[0,0,3,2,1,1,0,0,0,1,1,1,1,2,2,2,1,1,1,1,1,1,1,0,2,0,2,2,1,0,2,2,2,0,2,0,0,3,2,2,1,1,0,0,1,0,0,2,1,4,0,1,0,2,1,0,0,0,0,2,2,0,0,1,0,1,2,0,0,0,4,2,2,2,0,0,1,0,0,0,3,1,0,0,1,1,0,2,1,2,1,2,1,0,1,2,0,2,0,1,1,2,0,1,0,1,3,3,2,1,0,2,0,1,0,2,1,1,1,0,0,3,0,1,1,1,1,2,0,4,1,1,1,1,1,2,0,0,2,2,2,0,1,2,1,1,2,0,1,0,0,0,1,2,1,0,0,2,2,1,2,0,0,1,2,2,1,1,1,2,1,1,1,3,1,1,1,1,1,1,0,1,0,2,1,0,0,1,2,0,3,1,1,0,1,1,1,2,2,1,1,1,3,1,0,1,1,1,1,2,0,0,2,0,0,0,1,0,0,0,1,1,2,0,1,1,0,0,1,0,0,0,0,0,1,2,3,0,1,0,1,3,1,0,1,0,0,2,0,0,0,1,0,1,1,1,2,0,1,1,1,0,0,0,2,2,1,0,0,3,0,3,3,1,0,2,0,0,1,0,5,0,2,2,1,0,1,0,1,0,1,1,1,1,0,0,0,1,0,3,1,1,0,0,2,0,1,2,0,1,2,1,2,1,2,3,3,2,0,1,0,2,0,0,0,2,2,1,0,2,1,1,0,1,0,0,1,1,2,3,2,0,4,3,0,0,2,1,3,0,0,3,0,3,1,0,3,0,2,0,2,2,2,0,3,0,2,0,1,1,1,0,3,4,1,1,2,0,0,1,1,1,0,0,0,2,0,0,1,1,1,0,2,0,0,0,2,0,0,0,0,1,2,0,1,3,0,2,0,1,0,2,0,1,1,0,0,0,0,2,2,3,0,1,2,2,3,4,0,1,0,0,0,0,0,2,0,2,2,1,3,1,1,1,0,3,1,1,1,1,0,1,2,0,0,0,0,0,0,1,0,1,1,0,1,0,0,1,0,3,1,0,1,0,0,2,1,2,2,1,0,1,1,0,0,1,1,0,1,1,5,2,2,0,3,2,0,1,1,4,1,2,0,1,3,0,4,0,1,0,3,2,0,3,0,0,0,0,0,0,1,0,0,3,1,0,2,0,2,1,0,1,0,0,3,2,1,0,1,1,0,1,0,1,3,1,3,2,0,3,0,0,1,2,2,1,1,1,0,1,0,0,3,1,0,1,1,2,2,0,1,1,1,0,1,3,0,1,2,1,0,1,1,1,0,1,1,1,2,1,2,0,3,0,0,0,3,1,1,0,2,0,1,0,1,1,0,2,0,0,1,1,4,0,0,0,1,0,2,0,2,0,0,1,1,2,0,1,0,1,2,0,0,1,1,1,1,0,0,2,0,2,0,0,1,2,3,1,0,1,0,1,3,0,1,1,2,1,2,0,2,3,1,0,0,0,1,2,1,2,2,2,0,1,0,1,0,0,1,2,0,0,3,2,1,1,0,0,3,0,1,0,2,0,1,0,0,3,1,0,0,4,0,1,1,1,0,0,1,0,0,1,1,1,0,2,1,0,1,2,2,2,1,0,3,2,0,0,0,0,0,0,1,1,0,0,1,0,2,0,1,2,3,1,1,1,2,0,1,2,0,1,2,3,0,1,1,1,0,0,0,1,1,0,3,2,1,0,2,0,0,1,1,1,0,3,1,1,1,2,1,1,0,1,0,1,1,0,2,0,0,1,0,0,1,0,3,0,3,0,1,0,1,2,0,3,1,1,3,0,2,2,2,0,1,0,0,3,1,1,0,1,0,2,1,1,1,0,1,2,0,1,1,1,0,0,1,1,0,0,2,3,1,0,0,0,1,1,0,2,0,0,0,0,1,1,1,1,1,2,0,2,0,3,1,0,1,5,2,0,2,2,0,2,1,0,0,2,2,1,0,1,0,2,2,1,0,2,2,1,1,0,0,1,1,1,0,1,1,0,4,3,0,0,3,0,2,2,0,1,1,1,2,0,0,1,0,2,1,0,0,2,0,0,1,0,0,0,0,2,1,1,3,2,3,0,1,1,3,1,0,0,1,3,0,2,0,0,0,0,1,1,0,0,0,2,1,0,1,0,3,0,1,0,0,0,2,2,0,1,1,1,1,1,0,1,1,2,0,0,1,0,0,0,0,1,0,1,2,2,2,0,1,0,0,0,0,2,1,1,1,0,2,2,0,1,1,3,0,0,1,0,0,1,2,0,2,0,0,1,0,0,2,0,1,3,1,1,1,2,2,0,1,0,1,3,0,2,1,1,0,2,1,0,0,2,1,2,2,1,2,1,0,1,0,0,1,0,1,0,0,0,4,1,0,0,1,2,1,0,0,1,2,1,0,1,0,0,0,3,1,0,1,4,1,3,1,1,1,1,0,2,0,1,0,0,1,2,1,0,2,3,1,0,1,0,0,0,1,1,1,2,0,1,1,2,2,1,2,0,0,1,2,1,3,3,0,0,1,1,1,1,1,0,2,0,0,0,3,2,0,5,0,2,3,4,1,1,0,2,0,2,1,0,1,2,3,0,2,2,0,0,2,3,0,1,1,1,0,0,0,2,1,2,2,1,3,0,1,1,1,1,1,0,0,1,1,0,3,0,2,1,0,0,4,0,1,0,1,2,1,0,1,2,0,1,0,1,1,0,2,1,2,4,2,3,0,0,1,2,1,1,2,0,2,0,2,0,1,3,1,0,0,2,0,0,2,1,4,1,1,1,1,1,0,0,1,0,1,0,0,1,1,2,1,0,4,0,1,0,4,1,3,0,0,0,0,0,0,2,1,1,0,1,0,0,0,0,0,0,0,3,0,2,0,0,2,0,0,0,1,1,1,2,2,0,1,3,1,0,2,0,0,3,2,2,1,1,3,0,2,1,0,0,1,2,1,0,0,0,0,0,2,2,0,0,0,1,2,0,0,1,1,1,1,1,0,1,1,1,0,0,1,0,2,1,0,3,2,0,0,4,2,0,1,7,1,2,3,1,1,1,0,2,0,1,1,1,1,0,4,0,1,3,2,1,0,1,0,1,1,2,0,0,0,1,2,2,0,0,1,0,0,1,0,0,1,0,0,0,0,3,2,1,1,0,0,0,1,0,0,1,2,0,0,1,2,1,0,1,0,2,3,1,1,2,0,2,0,1,0,1,3,0,2,3,2,1,0,0,0,0,1,1,3,1,0,0,0,1,1,0,0,1,1,0,0,2,0,2,4,0,1,1,1,1,1,0,0,1,1,2,0,0,0,2,0,1,2,0,1,0,0,0,2,1,0,1,1,0,0,1,0,0,2,2,2,2,1,1,1,0,0,1,1,0,4,0,1,0,1,0,1,1,2,1,2,1,0,3,1,0,1,0,2,0,2,1,2,1,0,1,4,1,1,4,0,1,1,0,0,1,0,1,0,0,0,3,2,2,1,1,1,2,1,2,1,1,1,2,2,1,2,0,1,1,1,0,0,0,1,0,2,0,3,1,0,2,0,3,2,3,1,0,0,2,1,3,2,0,1,2,2,1,1,0,3,0,2,3,1,1,0,2,1,1,0,0,0,1,2,1,0,0,3,0,1,1,1,0,0,2,1,0,1,2,1,3,1,0,1,1,2,1,1,0,2,1,3,4,1,0,0,0,1,0,0,5,1,2,0,2,0,2,0,1,0,2,1,0,0,1,1,2,0,2,1,2,0,1,0,2,1,1,0,0,0,1,1,0,1,0,1,0,2,1,1,2,2,0,1,2,3,1,3,4,2,0,1,0,0,1,2,0,0,3,0,0,1,1,0,0,0,1,2,2,0,1,1,3,2,0,0,2,0,1,1,2,0,0,0,4,1,1,1,1,1,0,0,1,2,2,1,1,0,0,1,0,1,0,2,2,2,0,1,1,1,1,2,0,1,1,2,2,1,2,1,3,3,1,1,1,1,3,1,0,0,0,0,1,0,0,2,1,1,2,0,2,0,1,4,0,0,0,2,0,2,0,0,3,0,1,0,1,2,1,3,3,3,0,0,1,1,3,1,0,0,0,2,1,2,0,0,0,0,3,0,1,1,1,1,1,0,1,2,2,1,1,0,0,1,0,2,1,0,0,0,3,1,2,0,3,0,0,0,2,1,0,1,1,0,1,1,1,1,0,0,0,3,0,0,0,1,1,0,1,0,0,0,2,0,0,0,1,0,1,1,0,2,3,0,2,1,1,1,0,3,2,0,0,1,3,0,0,0,2,1,2,1,0,1,2,1,2,1,0,1,1,0,3,0,1,1,0,1,0,3,1,0,2,0,0,1,0,0,1,0,1,1,0,1,0,0,1,1,1,1,0,0,3,0,1,0,0,3,1,0,1,0,1,0,3,1,2,1,1,0,0,0,1,2,0,2,0,0,1,1,0,1,0,1,2,0,0,0,4,0,0,1,2,2,0,3,1,0,1,2,0,1,1,0,1,4,1,1,1,2,1,1,1,1,0,0,1,0,1,0,2,0,3,0,0,0,0,2,0,0,0,1,1,2,1,1,1,1,0,0,1,1,0,1,0,0,2,3,3,1,1]},{"counters":[2,1,0,1,0,0,1,0,2,0,1,3,0,0,0,0,1,1,1,0,1,2,0,1,0,0,1,0,2,1,2,2,0,0,0,1,1,0,1,1,2,0,1,1,1,0,2,0,1,3,0,1,1,0,0,0,0,1,1,4,3,0,1,1,0,2,0,0,0,1,2,0,1,1,1,1,0,0,1,4,5,0,0,1,2,0,0,0,2,1,1,2,2,1,1,0,0,1,1,1,4,0,2,0,0,3,0,1,1,0,1,0,0,0,0,2,1,2,0,3,1,1,1,1,1,0,1,0,1,0,0,1,3,2,0,2,0,0,1,2,2,1,1,1,1,2,0,0,2,2,1,0,1,3,1,2,2,1,1,0,0,1,0,0,0,2,1,0,0,1,1,2,1,1,0,1,0,1,3,0,0,0,0,1,2,1,1,0,1,2,0,0,1,1,0,1,2,1,0,2,0,0,1,3,0,0,1,3,0,2,2,2,0,0,0,2,0,1,1,0,1,2,1,1,1,1,1,0,1,2,1,0,1,1,0,2,0,2,1,0,5,0,2,2,1,0,2,1,1,1,0,1,0,2,1,0,1,0,0,2,1,0,1,0,2,1,0,0,2,1,1,0,1,0,2,1,4,0,1,0,5,0,1,0,2,2,2,1,0,1,0,1,0,1,1,1,1,0,1,1,0,0,1,0,0,0,1,2,1,0,2,0,1,0,2,0,1,0,1,2,0,0,1,1,1,2,4,0,0,2,1,0,1,2,0,4,1,0,0,2,0,4,2,0,4,1,1,1,1,2,1,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,2,1,3,0,3,1,1,1,2,0,2,1,1,1,0,1,0,3,1,0,1,0,0,2,1,0,1,0,1,1,2,0,5,1,1,1,1,3,2,0,3,1,0,0,3,0,1,0,0,1,1,3,1,0,0,0,1,1,0,0,2,1,1,1,1,2,1,3,0,0,0,2,1,0,0,2,3,1,1,0,0,1,0,0,1,0,0,1,0,2,1,0,0,4,2,2,0,1,0,3,3,1,0,3,2,2,1,1,3,2,3,1,1,2,1,1,1,1,1,0,2,0,2,1,0,0,1,0,0,1,1,1,1,1,1,0,1,0,0,0,0,1,0,0,0,0,2,1,0,2,1,1,3,1,1,1,1,2,0,0,3,0,1,1,0,1,1,2,1,0,1,0,3,1,1,1,2,0,2,0,2,0,1,0,0,1,0,1,5,4,2,1,1,1,4,0,3,1,2,2,0,3,1,1,0,1,0,1,1,1,2,1,1,4,1,3,1,2,0,0,1,2,1,0,1,0,0,1,0,3,2,1,1,0,1,2,2,3,0,1,0,1,1,0,2,1,1,2,1,1,1,1,2,0,1,3,0,0,2,1,0,0,1,1,2,2,0,0,0,2,1,0,3,0,2,1,2,0,1,1,1,3,1,0,2,1,0,1,1,1,2,1,1,2,1,2,3,3,3,0,2,2,0,0,1,1,1,1,1,2,0,2,1,0,1,0,0,0,0,2,1,2,2,0,2,2,0,2,1,1,1,1,0,1,3,0,2,3,0,2,0,3,1,3,1,1,1,1,0,2,1,0,1,3,0,2,2,2,1,2,3,4,2,6,2,1,0,0,0,1,1,0,2,1,1,1,0,1,0,1,1,2,2,1,1,0,1,1,0,0,2,2,0,1,3,1,0,0,0,1,0,4,0,1,0,5,1,1,1,2,1,1,0,0,0,0,0,0,0,2,0,0,0,1,0,0,5,0,3,4,1,0,3,1,1,0,0,2,1,1,0,0,1,1,1,1,0,0,2,0,1,0,1,2,3,1,0,1,0,0,1,2,4,1,1,0,4,2,1,0,1,1,0,5,0,0,0,2,2,3,1,2,1,3,1,0,1,1,3,0,0,2,0,1,0,2,4,3,2,2,0,2,3,2,2,1,0,0,0,3,0,0,1,0,2,0,4,1,1,1,0,0,0,2,2,0,1,1,2,2,1,2,1,1,2,2,0,1,0,2,0,0,0,1,0,1,2,2,0,1,2,1,0,0,0,0,0,0,2,0,0,3,0,2,0,0,0,1,1,1,0,2,0,4,1,1,1,0,1,3,1,0,2,1,1,0,0,2,0,1,1,0,3,0,2,1,1,0,0,3,1,0,1,0,2,0,0,2,1,2,2,0,0,1,0,1,2,0,2,1,0,2,0,0,2,1,2,1,4,1,1,1,0,0,0,1,1,0,3,1,0,0,0,0,0,2,3,0,1,0,0,0,0,2,0,0,1,2,0,0,1,1,3,3,1,1,3,1,1,0,1,0,2,1,2,1,2,2,0,3,1,0,0,2,0,2,1,2,1,0,0,1,0,0,0,2,1,0,0,2,1,0,1,1,0,2,0,2,3,0,0,2,0,3,0,2,1,0,0,0,1,0,1,2,1,1,0,2,0,0,2,0,2,0,0,1,2,3,3,0,1,1,1,0,0,0,2,0,1,1,0,1,1,0,0,0,0,0,1,1,0,1,0,2,0,1,1,0,4,0,0,2,0,2,0,0,3,2,0,0,0,1,1,2,0,1,0,1,1,1,2,2,1,2,1,1,2,1,1,1,0,1,0,2,0,2,0,1,0,1,1,2,1,1,1,2,1,1,1,2,2,0,0,2,0,2,0,1,0,0,1,2,1,2,0,1,0,1,0,2,1,3,3,2,1,1,1,0,1,0,0,0,0,2,1,2,2,2,1,0,0,1,4,2,1,1,0,1,1,0,1,0,0,0,1,0,1,0,2,0,3,0,0,1,2,2,1,2,0,1,0,2,1,2,0,0,1,0,0,2,2,1,1,1,3,0,3,4,2,1,1,0,1,2,1,0,1,0,2,1,0,2,2,1,1,1,1,1,1,1,2,0,1,1,0,1,2,2,3,1,0,3,1,1,2,0,1,0,2,1,2,0,4,0,1,0,2,0,1,1,1,3,2,1,0,1,1,0,0,1,1,1,0,0,1,1,0,0,1,0,2,0,2,0,2,2,1,1,3,2,0,1,1,1,4,0,0,0,0,2,1,0,1,1,0,0,1,1,1,1,1,2,1,1,0,0,1,1,0,1,2,3,1,1,0,1,0,1,0,1,0,3,1,0,3,0,3,1,1,1,0,3,2,1,2,1,0,1,0,1,1,0,0,0,0,2,1,0,0,3,0,2,2,1,0,2,1,0,0,1,0,0,0,1,0,0,3,2,0,0,2,0,1,2,1,1,1,0,2,1,0,2,4,1,0,0,0,1,0,1,2,3,1,1,0,3,0,1,1,0,1,2,0,1,1,0,1,0,1,0,3,0,2,0,1,2,0,2,1,1,1,0,2,2,1,2,3,1,1,0,1,1,2,0,0,0,0,1,1,1,0,2,0,0,1,1,1,0,1,3,2,0,2,1,2,0,0,3,1,2,0,0,1,0,2,1,1,1,2,0,0,0,0,0,1,0,0,0,1,1,0,1,1,1,0,0,0,0,1,2,0,1,0,1,1,0,0,1,2,1,1,1,2,1,0,1,3,0,0,1,3,0,1,1,0,1,2,1,1,1,0,3,1,4,1,2,0,0,0,2,0,1,0,1,1,1,1,4,1,0,0,1,2,0,1,0,1,0,0,0,2,0,1,3,1,0,0,2,0,1,2,1,0,1,0,0,0,0,1,2,1,2,3,1,1,0,1,0,0,1,0,0,2,2,1,0,1,3,1,0,0,0,0,0,3,0,1,0,1,1,1,0,1,0,1,2,0,1,1,2,1,2,1,0,0,1,0,2,1,0,1,0,1,0,3,0,0,1,2,0,2,2,0,0,1,1,1,2,1,0,1,2,2,0,1,1,0,0,0,2,1,1,1,2,0,0,1,0,0,2,2,1,1,1,0,0,0,2,0,0,1,0,0,1,1,0,2,1,1,0,1,3,2,0,1,1,0,0,1,1,0,1,0,1,2,0,1,1,2,2,1,1,2,1,2,0,3,3,0,0,1,0,1,0,1,3,0,0,0,0,0,1,0,1,0,0,2,0,3,1,2,0,1,4,0,1,1,0,3,0,0,3,0,2,1,0,0,2,0,2,0,1,0,1,0,0,0,2,1,1,0,0,0,1,0,0,1,1,2,0,1,1,2,1,2,2,0,0,5,0,0,4,0,0,1,0,0,1,0,2,0,1,0,2,0,0,1,2,2,0,1,1,0,0,1,1,1,0,2,1,1,0,0,0,1,3,2,1,1,1,1,0,1,0,1,2,1,0,1,0,1,2,1,0,0,0,0,0,0,1,3,1,2,0,2,0,0,1,2,2,0,0,1,2,1,2,0,1,2,1,3,0,0,0,1,1,2,1,0,1,0,2,1,1,1,1,0,2,0,0,0,0,0,3,0,0,2,1,1,2,0,1,1,2,0,1,0,0,1,0,0,1,1,0,2,4,1,0,2,0,2,2,1,3,0,2,0,2,2,0,0,1,3,0,2,0,0,1,2,0,0,2,1,1,1,0,1,0,1,1,2,1,0,0,2,0,0,0,0,2,1,2,0,0,0,2,0,0,1,0,0,1,1,0,2,2,2,3,0,0,0,4]},{"counters":[2,3,3,1,2,0,1,1,1,0,0,0,1,0,0,3,1,0,0,0,0,2,0,0,1,1,2,1,0,0,2,1,1,0,0,0,1,0,1,1,2,1,1,0,1,0,0,2,0,2,1,1,1,2,1,0,3,1,3,1,0,0,0,1,1,0,1,1,0,1,2,2,1,1,0,2,0,2,2,1,1,0,2,1,2,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,0,3,0,1,2,0,0,2,1,0,1,1,0,0,2,0,5,1,2,1,2,1,1,0,3,3,1,3,1,1,1,2,2,0,0,0,1,0,0,3,0,0,2,0,1,1,1,3,1,0,0,1,1,0,1,0,0,1,2,0,1,1,0,0,2,0,2,1,0,1,2,1,2,0,0,0,0,0,0,0,3,1,2,1,0,0,0,1,3,0,0,1,0,0,0,2,0,2,0,1,1,1,3,2,0,1,2,1,1,1,1,1,0,1,1,1,0,1,0,2,1,1,1,1,0,0,0,0,0,0,2,1,1,1,1,2,2,0,0,0,0,0,0,3,0,0,0,2,0,0,1,1,0,1,1,1,1,1,0,1,1,3,1,0,1,0,2,0,0,1,2,0,0,0,1,2,1,2,0,0,2,2,0,0,0,1,0,0,0,1,0,1,0,3,0,1,1,0,0,0,3,0,2,1,1,1,0,1,2,2,3,1,1,1,1,1,0,1,1,1,2,0,0,2,0,0,0,1,2,2,1,2,2,1,0,0,1,0,1,1,0,1,2,1,1,0,3,1,1,0,1,0,1,2,0,0,2,0,1,2,1,0,0,2,0,1,0,0,1,3,3,3,2,1,0,3,0,0,2,0,0,2,1,2,0,4,1,1,4,0,0,0,2,2,2,1,0,1,3,3,3,2,1,1,1,0,0,2,1,0,1,1,0,1,1,2,4,1,2,1,0,4,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,2,1,0,2,4,0,0,0,0,1,2,0,1,3,1,1,1,1,1,0,1,1,0,2,3,1,0,0,0,3,2,1,2,0,0,0,1,3,1,1,1,2,0,1,0,0,0,3,1,1,2,0,1,2,1,0,1,0,0,0,0,0,1,4,2,2,3,0,1,0,0,4,1,1,0,0,0,3,0,3,0,0,0,1,1,1,0,3,2,1,0,0,0,1,2,0,0,0,1,0,0,2,0,1,2,1,3,1,3,2,1,0,1,1,2,0,1,0,3,0,0,0,0,0,0,1,2,1,3,1,0,1,1,0,1,1,1,1,1,0,1,2,1,2,1,0,0,1,1,0,3,0,1,0,0,1,5,1,0,0,1,0,3,0,1,1,0,0,1,0,1,2,0,0,3,2,0,1,0,0,2,1,2,1,1,0,1,2,3,1,0,0,2,1,2,0,1,1,1,1,0,0,3,0,2,1,1,1,0,0,0,0,1,3,0,2,3,1,2,0,0,0,1,2,2,1,2,0,0,0,2,2,1,0,0,0,1,0,2,0,3,1,1,2,1,1,3,3,0,0,1,1,4,0,2,0,1,2,0,1,0,0,2,2,2,2,0,0,0,0,1,2,0,1,0,1,0,1,0,1,0,2,0,1,0,2,0,1,1,0,1,1,0,0,0,2,3,3,0,3,0,2,1,2,0,2,0,1,1,1,0,1,0,0,0,0,2,4,0,1,2,1,1,0,0,2,0,1,0,1,2,3,0,0,1,0,2,1,2,3,0,1,1,0,1,1,1,1,3,2,1,0,0,2,2,1,2,0,0,0,2,3,2,0,1,0,2,1,1,1,1,3,0,2,0,1,1,0,1,1,2,1,1,2,1,0,1,1,3,2,1,0,0,0,1,2,1,1,0,1,3,0,1,0,2,0,0,1,1,1,1,1,1,1,1,2,1,2,1,0,4,1,0,0,1,2,0,1,3,0,2,0,1,1,1,0,1,2,1,0,0,0,0,1,2,0,0,1,0,1,0,1,0,1,1,2,2,3,1,2,2,0,0,0,0,4,2,0,1,1,2,1,1,0,1,0,0,5,0,1,0,1,0,0,2,0,0,3,0,0,1,2,1,0,1,3,3,0,1,1,0,1,2,0,0,3,1,0,1,2,0,0,2,0,1,2,1,0,1,0,2,2,1,1,2,0,1,0,0,1,0,0,2,2,2,2,0,0,2,1,2,3,0,2,0,3,1,0,0,0,1,1,0,1,2,0,1,1,1,0,0,2,1,2,0,1,0,0,4,2,0,1,0,1,1,0,1,0,0,0,0,1,0,2,2,2,3,3,0,0,1,0,2,1,1,3,3,1,3,1,0,1,2,1,3,2,2,0,0,2,3,2,0,1,1,1,1,2,0,1,1,1,0,1,0,0,1,0,1,2,0,0,0,0,1,0,2,1,0,1,1,1,0,1,2,1,1,1,0,0,2,0,1,0,0,0,0,2,1,2,3,1,1,1,0,1,3,0,1,2,1,0,2,1,0,2,3,0,1,0,2,0,0,0,0,0,2,0,0,2,1,1,0,1,0,0,4,2,3,1,1,3,2,0,3,0,0,1,0,1,1,3,0,0,2,1,1,3,1,1,1,0,0,0,0,0,1,1,0,1,2,1,1,1,0,1,0,2,2,0,1,2,1,0,1,1,0,2,2,1,1,1,1,2,0,1,1,2,0,3,1,1,1,0,1,3,0,1,0,2,2,2,1,1,0,4,0,0,2,0,3,0,3,1,2,3,2,1,0,1,1,1,1,1,1,1,0,0,1,3,0,1,1,1,1,1,0,0,0,3,2,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,1,1,2,1,1,1,1,0,2,1,0,0,2,0,0,2,1,1,0,1,2,1,0,2,3,1,1,1,1,4,1,1,0,2,0,0,0,0,0,2,0,3,1,1,2,0,2,0,0,0,0,1,2,0,1,1,0,2,1,1,1,0,5,0,1,1,4,1,1,0,1,0,1,2,1,1,2,2,0,0,1,1,1,0,0,0,1,1,0,1,0,0,1,1,2,0,0,0,1,1,1,1,0,2,1,1,1,0,0,0,0,2,2,1,1,2,0,3,1,0,2,0,1,1,1,3,1,0,4,0,3,1,0,2,1,2,1,1,1,0,0,1,1,0,1,1,2,0,1,0,1,2,1,0,2,0,2,1,0,0,1,0,2,1,2,0,0,1,2,1,1,0,0,2,1,2,2,0,1,1,3,2,3,4,0,1,0,0,1,3,2,1,0,2,2,0,4,0,0,1,0,0,0,1,1,1,1,0,0,1,0,1,0,0,0,2,1,2,3,1,0,0,1,1,0,3,0,1,1,0,1,0,1,0,1,4,2,0,1,1,1,0,1,1,0,0,1,1,0,1,0,4,0,0,3,2,1,1,1,2,0,0,1,3,0,0,1,2,1,1,3,0,0,0,2,3,1,1,1,1,0,1,2,2,1,1,0,2,0,0,1,2,1,0,0,1,2,0,1,3,1,1,0,0,0,1,0,1,1,2,0,1,4,1,0,0,2,2,2,0,2,0,1,1,1,0,2,1,1,4,1,2,3,0,2,2,1,0,1,0,2,0,0,0,1,2,0,1,0,2,0,1,1,0,0,1,1,2,1,0,2,1,0,1,0,2,0,0,2,1,2,0,1,1,2,1,0,0,2,0,0,1,3,2,1,1,0,1,1,2,3,0,1,2,1,0,2,0,0,0,0,2,1,0,2,2,2,1,2,1,1,2,1,1,0,0,1,0,0,0,0,0,0,0,1,0,0,1,2,0,1,2,1,0,0,1,0,1,2,1,1,3,0,0,0,1,1,2,1,1,1,0,2,0,2,0,1,0,2,0,3,2,2,1,0,2,1,0,2,2,1,5,0,3,2,1,2,0,1,1,0,1,2,4,1,2,1,0,1,1,2,1,0,1,0,0,1,3,2,0,4,0,1,2,0,2,2,2,2,1,1,2,2,0,0,0,1,2,0,1,2,0,3,0,0,0,1,1,2,1,0,2,1,2,3,1,3,1,0,1,0,0,0,0,1,1,1,0,1,0,4,0,1,0,0,4,4,1,1,1,3,0,0,0,1,1,1,0,3,1,2,0,0,1,1,0,0,1,2,1,1,3,0,2,1,2,0,1,1,0,1,2,2,0,1,1,1,2,0,1,2,2,1,0,0,2,1,2,2,1,1,1,0,1,0,3,2,1,1,2,2,0,1,0,1,2,1,0,2,1,1,1,0,0,2,1,1,0,0,1,0,2,1,0,2,1,1,0,0,0,1,2,1,0,1,1,0,1,0,2,0,0,1,1,0,1,0,1,1,0,2,2,1,1,0,0,0,0,0,1,1,1,0,1,0,0,1,0,0,1,2,1,0,1,1,0,0,1,0,1,2,2,2,2,0,0,1,2,1,1,1,1,3,0,1,0,1,1,2,1,3,0,1,4,2,1,1,0,2,0,0,1,1,0,0,0,0,0,2,1,0,1,0,1,0,1,3,0,2,3,0,0,0,1,0,0,2,0,0,1,0,1,2,2,0,1,0,0,0,3,1,2,3,0,2,1,2,0,2,1,3,0,2,2,3]},{"counters":[2,2,1,3,0,2,3,0,1,2,0,1,0,1,1,2,1,1,1,1,1,1,0,1,2,0,1,1,5,0,3,0,2,1,2,1,0,0,0,1,1,2,1,0,2,1,0,2,0,2,4,0,0,0,1,2,1,0,1,2,1,0,3,1,0,0,0,1,2,1,1,1,0,0,1,1,0,2,1,0,1,2,2,0,0,1,0,0,0,2,1,1,1,4,2,2,0,0,0,0,0,0,0,2,2,1,0,2,0,3,3,0,1,1,1,0,0,0,0,1,0,0,0,2,1,1,0,2,1,0,0,2,0,1,4,2,0,2,2,1,0,0,0,0,0,1,0,2,2,1,1,0,0,0,1,2,1,1,0,3,2,0,0,2,1,0,1,0,0,0,2,0,0,1,2,5,0,0,1,0,0,1,0,3,0,0,0,1,1,1,1,1,0,1,4,0,1,1,0,1,1,3,0,3,1,0,0,0,0,0,1,0,1,1,0,1,1,2,2,2,1,1,0,2,0,0,0,0,1,0,1,0,1,1,4,2,0,0,3,0,2,1,1,2,1,0,0,3,1,1,0,0,1,3,2,1,0,0,1,2,3,1,0,1,1,1,2,0,1,1,1,1,0,2,0,1,0,1,2,2,0,0,0,1,4,1,0,1,1,0,0,0,2,2,0,0,1,1,0,0,1,1,1,2,0,1,0,1,1,2,0,2,0,0,2,2,3,0,0,0,1,1,0,2,0,2,0,1,2,0,1,0,1,0,1,1,0,0,2,0,0,0,0,0,0,2,0,1,0,2,0,0,0,2,0,3,2,1,1,1,1,1,4,1,0,0,0,0,0,2,2,3,1,0,0,1,1,1,1,0,1,0,2,0,1,1,2,0,0,1,1,0,0,1,0,1,0,0,1,2,1,1,0,2,1,0,1,2,1,0,2,0,1,1,1,2,3,0,1,1,0,0,0,1,2,0,2,0,0,0,0,1,1,1,1,0,1,3,1,0,1,1,2,2,7,1,0,1,0,4,0,4,1,0,1,1,0,0,1,0,2,1,1,2,1,1,0,0,1,1,0,3,1,1,0,2,1,2,1,0,2,0,0,1,0,3,2,2,1,1,1,0,0,1,1,2,1,0,0,1,0,0,0,2,2,0,1,4,2,0,0,0,1,2,1,1,0,1,1,0,2,0,1,0,0,2,1,1,0,1,2,3,0,0,0,1,2,0,0,1,0,3,1,2,0,2,0,1,0,1,2,2,0,0,0,0,0,2,0,0,0,0,1,0,1,1,2,3,0,2,2,2,0,1,1,3,1,0,1,0,2,0,1,2,1,1,1,1,0,0,0,3,0,0,1,0,1,0,3,1,2,0,0,3,1,4,2,1,1,2,0,0,1,3,0,1,1,0,3,4,1,1,1,1,2,3,2,2,0,0,2,0,2,3,2,0,1,0,3,2,2,1,1,0,1,2,1,2,1,0,1,0,2,3,0,2,1,2,1,0,2,1,1,1,0,3,4,1,0,1,2,0,2,2,2,1,1,0,1,2,0,0,2,2,0,4,2,1,0,3,0,0,1,0,1,1,0,1,0,0,3,1,1,2,3,0,0,0,0,1,0,1,3,0,1,0,0,0,2,1,1,1,1,1,1,1,1,0,2,1,0,3,2,2,1,0,0,2,0,0,1,0,1,1,0,0,2,2,3,1,1,0,2,0,2,3,1,1,2,3,1,0,0,3,1,1,0,2,1,1,1,2,0,0,2,4,1,4,1,0,1,1,3,0,0,3,0,1,0,2,1,3,3,0,1,4,0,1,2,1,1,2,1,1,2,2,4,0,1,1,1,2,0,0,2,0,0,0,0,1,0,2,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,1,1,2,1,2,3,0,2,0,0,2,0,0,2,0,2,2,1,0,0,0,0,1,0,0,2,0,2,2,1,1,3,3,1,0,0,0,1,4,1,0,2,1,3,0,0,3,0,1,1,0,0,0,0,0,1,2,1,2,0,0,1,2,3,1,1,1,1,3,1,2,1,0,3,1,3,1,1,1,0,0,3,3,1,1,1,0,0,1,2,0,0,4,1,2,1,3,0,1,0,2,4,2,0,0,0,1,0,0,0,2,1,0,1,0,1,1,0,1,4,0,0,6,1,0,0,3,1,1,2,0,1,1,0,0,1,0,3,0,1,0,1,3,0,1,1,1,0,2,0,1,5,0,0,1,0,1,1,1,1,1,0,0,1,2,0,0,1,1,0,1,1,1,1,0,1,1,1,0,0,2,2,0,0,2,0,2,0,3,0,0,0,2,1,1,1,0,0,1,2,1,1,2,3,0,1,1,0,3,3,1,2,1,1,2,0,2,2,1,2,0,0,1,2,1,1,1,1,2,3,2,1,0,1,1,3,2,1,0,0,0,2,2,0,0,0,1,0,3,0,0,1,2,0,1,0,0,1,1,0,1,4,2,2,2,0,0,1,1,0,1,0,1,0,2,0,2,2,0,0,0,2,0,0,1,2,1,1,0,2,1,0,0,0,0,2,1,4,0,1,0,1,0,1,2,1,1,0,2,2,2,3,1,2,0,0,0,0,2,0,2,1,1,0,1,0,1,0,1,2,2,1,0,0,0,0,1,0,2,0,3,0,0,1,0,2,3,1,1,2,2,0,0,0,5,2,2,1,1,0,1,0,1,0,1,0,0,0,1,0,3,1,0,1,1,0,0,1,1,2,0,2,0,0,1,0,0,1,2,2,2,0,1,1,0,2,0,0,3,0,0,1,1,0,2,1,3,1,0,0,1,0,2,3,1,1,1,1,2,1,0,1,0,2,1,0,4,0,0,2,4,2,1,0,1,1,0,0,4,3,1,0,0,1,1,1,0,1,1,0,1,1,0,0,0,1,1,0,1,1,0,0,0,0,0,0,2,2,2,1,1,0,0,2,0,0,1,0,1,1,1,0,0,0,1,1,1,0,0,2,1,2,0,2,3,0,3,0,1,0,0,1,0,1,0,2,3,0,1,1,0,2,1,1,0,1,2,1,0,2,1,0,3,1,1,1,3,0,0,0,0,0,1,2,1,1,4,1,0,1,0,0,1,0,2,1,2,1,0,0,1,0,3,0,1,1,1,0,0,2,1,0,2,0,0,1,2,1,2,1,1,1,1,3,1,1,0,0,1,0,1,0,1,0,1,1,1,0,1,1,0,2,1,1,0,1,3,1,0,1,0,2,1,1,0,1,0,0,1,0,0,2,1,0,1,1,0,0,1,2,1,2,1,0,1,1,0,0,0,0,1,1,2,1,1,0,1,0,1,0,0,0,0,1,2,0,0,1,2,1,1,1,0,1,0,1,3,0,1,2,0,0,0,1,2,1,2,0,0,1,1,1,0,1,1,3,0,1,3,0,1,3,4,0,1,2,2,1,4,1,1,0,1,0,0,2,1,2,1,0,1,0,3,1,1,1,1,1,1,2,0,1,1,2,0,0,2,1,2,0,0,1,0,2,0,1,3,3,4,0,1,0,0,2,1,1,0,1,1,0,1,0,2,1,0,0,2,2,2,2,1,1,0,2,0,2,1,2,2,2,1,2,0,0,1,1,0,0,0,1,0,0,0,0,2,0,0,2,2,0,0,0,2,1,1,0,1,0,2,2,0,0,3,1,0,1,0,2,2,2,1,1,1,1,1,0,1,0,2,1,1,1,1,0,1,6,1,4,3,0,0,2,1,1,2,1,1,1,0,1,0,1,1,1,0,0,2,1,1,1,0,3,0,0,1,1,0,2,0,1,1,2,0,1,0,0,0,0,1,2,0,1,2,1,1,0,1,0,1,1,0,1,0,2,0,1,0,2,2,1,1,2,0,1,4,0,1,0,0,0,0,0,2,2,4,2,0,1,0,2,3,0,0,1,1,1,1,0,1,0,1,1,0,1,1,2,0,1,1,1,0,2,2,3,2,0,1,1,1,1,3,0,0,0,1,0,1,1,1,0,0,4,2,1,0,2,0,0,2,0,1,1,2,1,0,1,1,0,1,1,0,3,1,1,1,1,1,1,0,1,1,3,0,0,1,3,1,0,0,0,0,2,1,1,0,1,1,1,2,1,2,1,1,0,0,2,3,3,4,3,1,1,3,1,3,3,0,4,2,0,0,2,0,2,1,1,0,1,0,1,0,0,2,0,2,0,2,0,1,2,1,1,1,0,1,2,0,0,3,2,2,2,2,0,2,1,0,1,2,1,0,3,0,1,2,2,0,0,1,1,0,0,2,1,0,0,0,2,0,1,0,0,0,1,0,1,2,1,1,1,0,0,2,1,1,0,1,0,1,0,1,0,0,1,1,3,2,0,1,0,1,2,2,0,1,3,1,1,1,0,2,1,0,1,1,1,0,2,1,0,0,1,1,2,1,0,0,0,3,1,0,1,0,0,0,2,2,2,1,0,2,2,0,0,2,1,2,0,0,0,1,0,2,1,1,0,1,1,1,0,2,1,0,0,2,0,2,0,1,1,0,2,1,0,2,1,1,1,1,2,0,0,1,0,1,2,1,3,0,0,0,1,1,0,0,0,0,2,1,3,0,4,0,2,0,0,0,0,0,2]}]},"null_count":0,"last_update_version":397952047847833600}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_006.json b/cmd/explaintest/s/explain_complex_stats_tbl_006.json deleted file mode 100644 index d66c0f80b2910..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_006.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_006","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDI0NTk0NjM=","upper_bound":"LTIxMzMxNDY2NjY=","repeats":1},{"count":16,"lower_bound":"LTIxMzI0MDk4MzU=","upper_bound":"LTIxMTMwMDY4NzU=","repeats":1},{"count":24,"lower_bound":"LTIxMDc3ODI4OTI=","upper_bound":"LTIwOTI2NTY2OTA=","repeats":1},{"count":32,"lower_bound":"LTIwODk2NDA3MDc=","upper_bound":"LTIwNzgwMjk1NjM=","repeats":1},{"count":40,"lower_bound":"LTIwNTYzODU0NDM=","upper_bound":"LTIwNDI3MzQxNjE=","repeats":1},{"count":48,"lower_bound":"LTIwMzk4MDA5NDg=","upper_bound":"LTIwMjE0ODI1MjQ=","repeats":1},{"count":56,"lower_bound":"LTIwMTQzODc0MTk=","upper_bound":"LTIwMDEzNzAwMzY=","repeats":1},{"count":64,"lower_bound":"LTE5OTg1OTM4NDY=","upper_bound":"LTE5Nzg1NjY2Mzc=","repeats":1},{"count":72,"lower_bound":"LTE5NzUwMDgxNTg=","upper_bound":"LTE5NjI4NDQzMTY=","repeats":1},{"count":80,"lower_bound":"LTE5NTA0MjEzMzk=","upper_bound":"LTE5NDM3ODM1Nzk=","repeats":1},{"count":88,"lower_bound":"LTE5NDMzODk0MjA=","upper_bound":"LTE5MjM4ODczMDU=","repeats":1},{"count":96,"lower_bound":"LTE5MjE0NzcyODc=","upper_bound":"LTE5MDY3MzgwODI=","repeats":1},{"count":104,"lower_bound":"LTE5MDMwNTQyODM=","upper_bound":"LTE4OTg0ODgxODQ=","repeats":1},{"count":112,"lower_bound":"LTE4OTYyMDMzOTA=","upper_bound":"LTE4ODc2OTY1MzY=","repeats":1},{"count":120,"lower_bound":"LTE4ODY0Njk5MjQ=","upper_bound":"LTE4NzMwMTE2MzU=","repeats":1},{"count":128,"lower_bound":"LTE4NzIxNTY3NjQ=","upper_bound":"LTE4NTc3ODg3NDA=","repeats":1},{"count":136,"lower_bound":"LTE4NDU5MDA4NDU=","upper_bound":"LTE4NDMwMDAwNDQ=","repeats":1},{"count":144,"lower_bound":"LTE4MzgyODk2ODg=","upper_bound":"LTE4Mjc5OTM2NTg=","repeats":1},{"count":152,"lower_bound":"LTE4MjAwMzQ1MDQ=","upper_bound":"LTE4MDQ5MDE5NTE=","repeats":1},{"count":160,"lower_bound":"LTE4MDE4MDM2Mzg=","upper_bound":"LTE3Nzg4MTU3NzE=","repeats":1},{"count":168,"lower_bound":"LTE3Njk1NTkyMzk=","upper_bound":"LTE3NDM3NTkwMDI=","repeats":1},{"count":176,"lower_bound":"LTE3NDI4ODgzMDc=","upper_bound":"LTE3MzYwMTcwOTE=","repeats":1},{"count":184,"lower_bound":"LTE3MzQzMzI1NTk=","upper_bound":"LTE3Mjc4MTQ5NTg=","repeats":1},{"count":192,"lower_bound":"LTE3MjU3NDUzNTM=","upper_bound":"LTE3MDg5Mzg4NTk=","repeats":1},{"count":200,"lower_bound":"LTE3MDcyODMwOTM=","upper_bound":"LTE2OTQ5NjQ1MjM=","repeats":1},{"count":208,"lower_bound":"LTE2OTA3OTc2ODk=","upper_bound":"LTE2ODYxNDU1NDg=","repeats":1},{"count":216,"lower_bound":"LTE2ODQxMjUyNjM=","upper_bound":"LTE2NTUwNDU2NjQ=","repeats":1},{"count":224,"lower_bound":"LTE2NTAzNTE1NjI=","upper_bound":"LTE2Mzg1NjYyNjM=","repeats":1},{"count":232,"lower_bound":"LTE2MzYzNjk4NTE=","upper_bound":"LTE2MjI3Mzg3NTE=","repeats":1},{"count":240,"lower_bound":"LTE2MTU0Njc4NDA=","upper_bound":"LTE2MDE3NDgwNzY=","repeats":1},{"count":248,"lower_bound":"LTE1OTcwMzYxMjM=","upper_bound":"LTE1NjM4Mzk5NTU=","repeats":1},{"count":256,"lower_bound":"LTE1NjIxMTQwMTY=","upper_bound":"LTE1NTU5MDQwNjQ=","repeats":1},{"count":264,"lower_bound":"LTE1NDQ5MjEzNTI=","upper_bound":"LTE1NDA3OTkxMTU=","repeats":1},{"count":272,"lower_bound":"LTE1Mzk1OTk1OTU=","upper_bound":"LTE0OTUxNzQxOTI=","repeats":1},{"count":280,"lower_bound":"LTE0OTI0NDQyMzA=","upper_bound":"LTE0NzQxNTIxMDc=","repeats":1},{"count":288,"lower_bound":"LTE0Njk4MjgzNjc=","upper_bound":"LTE0NjQ2MjIxMDc=","repeats":1},{"count":296,"lower_bound":"LTE0NjI5MDMzNjM=","upper_bound":"LTE0NTU4OTkwNTE=","repeats":1},{"count":304,"lower_bound":"LTE0NTQzMzc0MjI=","upper_bound":"LTE0MzQ4NjE5NDU=","repeats":1},{"count":312,"lower_bound":"LTE0Mjg3NTk1OTU=","upper_bound":"LTE0MjE1MzAzMzk=","repeats":1},{"count":320,"lower_bound":"LTE0MDUwNDk0NDI=","upper_bound":"LTE0MDA2MzYwMDk=","repeats":1},{"count":328,"lower_bound":"LTEzOTQ5NzAxNDQ=","upper_bound":"LTEzODMyNzE2NzI=","repeats":1},{"count":336,"lower_bound":"LTEzODI4ODUxMDM=","upper_bound":"LTEzNjg3OTY1ODE=","repeats":1},{"count":344,"lower_bound":"LTEzNjMyNzM0NjQ=","upper_bound":"LTEzNDc1OTg3MjM=","repeats":1},{"count":352,"lower_bound":"LTEzMzExODMzNDM=","upper_bound":"LTEzMjc5MDI1Mzk=","repeats":1},{"count":360,"lower_bound":"LTEzMjY1MzQ3NDI=","upper_bound":"LTEzMjA4MjA4Njc=","repeats":1},{"count":368,"lower_bound":"LTEzMTk1MDg3MzU=","upper_bound":"LTEzMTI3ODU2OTA=","repeats":1},{"count":376,"lower_bound":"LTEzMDkzNzUwMjQ=","upper_bound":"LTEyOTkwMTA1MjU=","repeats":1},{"count":384,"lower_bound":"LTEyOTU3Mzk4MDY=","upper_bound":"LTEyODg1Mjg5NTE=","repeats":1},{"count":392,"lower_bound":"LTEyODI5NjAwNjI=","upper_bound":"LTEyNzA2MDQ0NTY=","repeats":1},{"count":400,"lower_bound":"LTEyNjk1MTM5MDg=","upper_bound":"LTEyNjEzOTg0OTk=","repeats":1},{"count":408,"lower_bound":"LTEyNTE2NjQwMzc=","upper_bound":"LTEyNDUxNDM4Mjg=","repeats":1},{"count":416,"lower_bound":"LTEyMzg4MDg5NzA=","upper_bound":"LTEyMTk5MzE4NDM=","repeats":1},{"count":424,"lower_bound":"LTExOTc0NzYxNzA=","upper_bound":"LTExODM0MTA1OTU=","repeats":1},{"count":432,"lower_bound":"LTExODE3OTA1MTg=","upper_bound":"LTExNzA5NzIxMjI=","repeats":1},{"count":440,"lower_bound":"LTExNjc4NTE4ODI=","upper_bound":"LTExNTI2MzkxNjI=","repeats":1},{"count":448,"lower_bound":"LTExNDgxMzg3MDU=","upper_bound":"LTExMzk2MTA2MTE=","repeats":1},{"count":456,"lower_bound":"LTExMzU3ODcwNDM=","upper_bound":"LTExMTI5MDc3OTQ=","repeats":1},{"count":464,"lower_bound":"LTExMDg4NDUzOTk=","upper_bound":"LTEwOTQzNTM3NTQ=","repeats":1},{"count":472,"lower_bound":"LTEwOTMwNDM1ODA=","upper_bound":"LTEwNzQ3OTc1NTk=","repeats":1},{"count":480,"lower_bound":"LTEwNzI0NTg3MzI=","upper_bound":"LTEwMzkwMTY2MDA=","repeats":1},{"count":488,"lower_bound":"LTEwMzc4NjczMjM=","upper_bound":"LTEwMjE5Njg3NDk=","repeats":1},{"count":496,"lower_bound":"LTEwMTM3NDU4NjA=","upper_bound":"LTk4NzA1NjMxMg==","repeats":1},{"count":504,"lower_bound":"LTk4NjkxOTE2Nw==","upper_bound":"LTk3NTQzMTI5NA==","repeats":1},{"count":512,"lower_bound":"LTk3NTM5NTY0NQ==","upper_bound":"LTk1NDgwMTA5OA==","repeats":1},{"count":520,"lower_bound":"LTk1MjQ4NTcxMg==","upper_bound":"LTk0NDQ5Mjg0NQ==","repeats":1},{"count":528,"lower_bound":"LTkzNDg4MzU0MQ==","upper_bound":"LTkxNzUyNDcxNQ==","repeats":1},{"count":536,"lower_bound":"LTkxNzAzODIzMw==","upper_bound":"LTkwMDM5MDkxMA==","repeats":1},{"count":544,"lower_bound":"LTg5OTU0Mzc0NQ==","upper_bound":"LTg5NTM1NTcxMw==","repeats":1},{"count":552,"lower_bound":"LTg4Njg3MzE3MA==","upper_bound":"LTg3ODY5ODk5NQ==","repeats":1},{"count":560,"lower_bound":"LTg3ODE2OTA1NA==","upper_bound":"LTg3MDg1ODk0NQ==","repeats":1},{"count":568,"lower_bound":"LTg2OTIxMTM3MA==","upper_bound":"LTg1NTc3NDUwNQ==","repeats":1},{"count":576,"lower_bound":"LTg1NDU0MTQzMQ==","upper_bound":"LTgzNzMwOTY0Nw==","repeats":1},{"count":584,"lower_bound":"LTgzNTI1NjU1Nw==","upper_bound":"LTgxOTQ4ODM1Mg==","repeats":1},{"count":592,"lower_bound":"LTgxNjAyNzM5Ng==","upper_bound":"LTgwMjYxNTE0OA==","repeats":1},{"count":600,"lower_bound":"LTgwMjM2MTg4Nw==","upper_bound":"LTc5ODU0NzcwNw==","repeats":1},{"count":608,"lower_bound":"LTc5MzMzMTI1MQ==","upper_bound":"LTc3NTUzMTE4NA==","repeats":1},{"count":616,"lower_bound":"LTc3MzQ3ODYwNg==","upper_bound":"LTc2NjQ5NDk1MQ==","repeats":1},{"count":624,"lower_bound":"LTc2NTQ2MzAwMw==","upper_bound":"LTc1NDE0Mjc5MQ==","repeats":1},{"count":632,"lower_bound":"LTc1MzIzODM2NA==","upper_bound":"LTc0ODg2ODIwMA==","repeats":1},{"count":640,"lower_bound":"LTc0NTkwOTMwOQ==","upper_bound":"LTczNTg3MTA3MQ==","repeats":1},{"count":648,"lower_bound":"LTcyNTIxODgxNw==","upper_bound":"LTcxNTY5NTU2Nw==","repeats":1},{"count":656,"lower_bound":"LTcwODY1MjE0MQ==","upper_bound":"LTcwNTgyMjE0NQ==","repeats":1},{"count":664,"lower_bound":"LTcwNTEwOTA3OQ==","upper_bound":"LTY3OTEyMzE4Mw==","repeats":1},{"count":672,"lower_bound":"LTY3NzYyNzcxMQ==","upper_bound":"LTY2MTE4NTI2MA==","repeats":1},{"count":680,"lower_bound":"LTY1NTg5MzQwNQ==","upper_bound":"LTYzNTU1MTY1NA==","repeats":1},{"count":688,"lower_bound":"LTYzNTM1MzA3Nw==","upper_bound":"LTYyMDgzODcyOA==","repeats":1},{"count":696,"lower_bound":"LTYwNzQwNDU0OQ==","upper_bound":"LTU3NzM3NTAxMw==","repeats":1},{"count":704,"lower_bound":"LTU3NDY3MjU3OQ==","upper_bound":"LTU2NzM5Mzc2OQ==","repeats":1},{"count":712,"lower_bound":"LTU2NzIxMzQ4NQ==","upper_bound":"LTU2MDkzODMzNQ==","repeats":1},{"count":720,"lower_bound":"LTU0OTg1MTk2Nw==","upper_bound":"LTU0NTg4NjE0NA==","repeats":1},{"count":728,"lower_bound":"LTU0NDA0MDQzNQ==","upper_bound":"LTUyODgyNzQxOQ==","repeats":1},{"count":736,"lower_bound":"LTUxOTc5MTYwNg==","upper_bound":"LTQ5MDE2NTE4OA==","repeats":1},{"count":744,"lower_bound":"LTQ4MzExMTQ5MQ==","upper_bound":"LTQ2MzE2ODk5NQ==","repeats":1},{"count":752,"lower_bound":"LTQ2MTk5MzUzNA==","upper_bound":"LTQ1NTcwNDc5OQ==","repeats":1},{"count":760,"lower_bound":"LTQ1NTA1OTAwNg==","upper_bound":"LTQ0NDczMTA4OA==","repeats":1},{"count":768,"lower_bound":"LTQ0NDQzMjc4MA==","upper_bound":"LTQzNTk2OTk0NA==","repeats":1},{"count":776,"lower_bound":"LTQzNDU5OTAwNA==","upper_bound":"LTQyMzI5OTQ4Nw==","repeats":1},{"count":784,"lower_bound":"LTQxNjU5NTYyMg==","upper_bound":"LTQwNzc0NTEwMQ==","repeats":1},{"count":792,"lower_bound":"LTQwNTQ1NDkyNQ==","upper_bound":"LTM5Mzg1NDQ5OA==","repeats":1},{"count":800,"lower_bound":"LTM3ODk2NzIxMQ==","upper_bound":"LTM2NTQ0Mzk2Mw==","repeats":1},{"count":808,"lower_bound":"LTM2MzY1MTkzNg==","upper_bound":"LTM1NzYzMDUwOA==","repeats":1},{"count":816,"lower_bound":"LTM0ODYzNDgwOQ==","upper_bound":"LTM0MDQ4OTk5Nw==","repeats":1},{"count":824,"lower_bound":"LTM0MDQ1MTI0NQ==","upper_bound":"LTMzNzUyOTU0NA==","repeats":1},{"count":832,"lower_bound":"LTMzNTYxMzgxMQ==","upper_bound":"LTMyOTA4ODcwNg==","repeats":1},{"count":840,"lower_bound":"LTMyNzE2ODg2Nw==","upper_bound":"LTMwOTM2MjYxNg==","repeats":1},{"count":848,"lower_bound":"LTMwMDA4Njc4MA==","upper_bound":"LTI5MTY3MjIyNg==","repeats":1},{"count":856,"lower_bound":"LTI4ODY1MTY0OA==","upper_bound":"LTI4MDIyNzk2Ng==","repeats":1},{"count":864,"lower_bound":"LTI3OTY4OTEwMA==","upper_bound":"LTI2OTUzMTkxNQ==","repeats":1},{"count":872,"lower_bound":"LTI2NjYxNTk0NQ==","upper_bound":"LTI1MjYwMzYyNw==","repeats":1},{"count":880,"lower_bound":"LTI0ODU5NTEzNw==","upper_bound":"LTI0MjExNTgwMw==","repeats":1},{"count":888,"lower_bound":"LTIyOTU4NzEwNg==","upper_bound":"LTIyMjQxNzI1MA==","repeats":1},{"count":896,"lower_bound":"LTIxNzQ1Mjc2NQ==","upper_bound":"LTIwODgzMTQ3Ng==","repeats":1},{"count":904,"lower_bound":"LTIwNzY0NDU1NA==","upper_bound":"LTE5MTc1MzQzMQ==","repeats":1},{"count":912,"lower_bound":"LTE4ODc2MzQ4OQ==","upper_bound":"LTE3MjI4ODY4Mw==","repeats":1},{"count":920,"lower_bound":"LTE3MjA5MzAzNg==","upper_bound":"LTE2NjcxMDkzMA==","repeats":1},{"count":928,"lower_bound":"LTE1NTg2Njg3NQ==","upper_bound":"LTE1MDk0NTkwOQ==","repeats":1},{"count":936,"lower_bound":"LTE0OTQ0ODc0Mg==","upper_bound":"LTE0NTQ1NzU3Mw==","repeats":1},{"count":944,"lower_bound":"LTE0NDExMjk2OQ==","upper_bound":"LTEzNzEzNDg1OA==","repeats":1},{"count":952,"lower_bound":"LTEzNjkwNzc2NA==","upper_bound":"LTEyNDQ1MjQ1Mw==","repeats":1},{"count":960,"lower_bound":"LTEyMzI0NjgzMw==","upper_bound":"LTk4MDA5NjQz","repeats":1},{"count":968,"lower_bound":"LTk2MDE2MTU5","upper_bound":"LTg4NjM2MjIz","repeats":1},{"count":976,"lower_bound":"LTg4MzQ1MDA1","upper_bound":"LTgwODQ0OTI5","repeats":1},{"count":984,"lower_bound":"LTc2OTE3MzAw","upper_bound":"LTcyMDE0Njk4","repeats":1},{"count":992,"lower_bound":"LTcxNTEwMDI5","upper_bound":"LTUyNzYyNDIz","repeats":1},{"count":1000,"lower_bound":"LTUxNDQ0NTQ3","upper_bound":"LTM4MDQ1MTE4","repeats":1},{"count":1008,"lower_bound":"LTIzMTYyOTg3","upper_bound":"LTYzNzk2NTM=","repeats":1},{"count":1016,"lower_bound":"LTExNDkwMA==","upper_bound":"OTM0NTM2MQ==","repeats":1},{"count":1024,"lower_bound":"MTIwNTcwNzM=","upper_bound":"MjM3OTczODA=","repeats":1},{"count":1032,"lower_bound":"MjUzNTcwMzI=","upper_bound":"NDY4MTYxNTM=","repeats":1},{"count":1040,"lower_bound":"NTEzODQxNTg=","upper_bound":"NjMyODY1ODk=","repeats":1},{"count":1048,"lower_bound":"Njk0Mjk1ODI=","upper_bound":"ODc4MDgwMTc=","repeats":1},{"count":1056,"lower_bound":"OTEzNTYyMjM=","upper_bound":"MTEzMTg4NjAx","repeats":1},{"count":1064,"lower_bound":"MTE2MTM5OTUz","upper_bound":"MTI0NTc5Mzg3","repeats":1},{"count":1072,"lower_bound":"MTI1ODYyODEw","upper_bound":"MTMwMzA0MjEw","repeats":1},{"count":1080,"lower_bound":"MTMzMjgwNjE1","upper_bound":"MTM4NjM2MjIx","repeats":1},{"count":1088,"lower_bound":"MTQzODQyNzcy","upper_bound":"MTYwMzk2ODA3","repeats":1},{"count":1096,"lower_bound":"MTYwNDM3OTM1","upper_bound":"MTY4MTc1NzU4","repeats":1},{"count":1104,"lower_bound":"MTcxMzY5MDAx","upper_bound":"MTc4MTg3NzMw","repeats":1},{"count":1112,"lower_bound":"MTc5ODg2ODMz","upper_bound":"MTkwNzY2NTU2","repeats":1},{"count":1120,"lower_bound":"MTkxNTcwNDg4","upper_bound":"MTk0OTMzMTYx","repeats":1},{"count":1128,"lower_bound":"MTk1ODYzMzUx","upper_bound":"MjAyMzM2NzM2","repeats":1},{"count":1136,"lower_bound":"MjAzNjMwNjAw","upper_bound":"MjI1NjQ1Nzg1","repeats":1},{"count":1144,"lower_bound":"MjM0NDk4Nzk2","upper_bound":"MjUzNDI5MjI5","repeats":1},{"count":1152,"lower_bound":"MjY4MzY2MzEy","upper_bound":"MjcyODI4MDc2","repeats":1},{"count":1160,"lower_bound":"Mjc0MDUyODY0","upper_bound":"MjkzNzcwNjI0","repeats":1},{"count":1168,"lower_bound":"Mjk4ODE3NjU5","upper_bound":"MzA3MDE0ODkw","repeats":1},{"count":1176,"lower_bound":"MzA3ODA2NzQx","upper_bound":"MzE2MTUzMjIx","repeats":1},{"count":1184,"lower_bound":"MzI1MjIwNDUz","upper_bound":"MzQ4NTU4MzQx","repeats":1},{"count":1192,"lower_bound":"MzQ5MjEwMDQy","upper_bound":"MzYyMjA2OTY1","repeats":1},{"count":1200,"lower_bound":"MzY0OTU2MDM3","upper_bound":"MzgzOTExMDQ4","repeats":1},{"count":1208,"lower_bound":"Mzg0MTY3MDg1","upper_bound":"NDA0MDgyNzAw","repeats":1},{"count":1216,"lower_bound":"NDExMTI1NTQ5","upper_bound":"NDI1MjI0NzI3","repeats":1},{"count":1224,"lower_bound":"NDM1Njk1OTEx","upper_bound":"NDUyNTE0OTk5","repeats":1},{"count":1232,"lower_bound":"NDU1ODUzMzIz","upper_bound":"NDg1ODY2NTk5","repeats":1},{"count":1240,"lower_bound":"NDkwODM3MzQ0","upper_bound":"NDk4Njg3MTIy","repeats":1},{"count":1248,"lower_bound":"NTA0NTMyMzYz","upper_bound":"NTE0NTMyNjk2","repeats":1},{"count":1256,"lower_bound":"NTIyMzY3OTgx","upper_bound":"NTMyMTIyMDY3","repeats":1},{"count":1264,"lower_bound":"NTQwMjUxMDIw","upper_bound":"NTQzMTY5NzE1","repeats":1},{"count":1272,"lower_bound":"NTQ0NTQ5MTI2","upper_bound":"NTU5OTkwOTUw","repeats":1},{"count":1280,"lower_bound":"NTY1OTk2MTk4","upper_bound":"NTgxOTU2MzA1","repeats":1},{"count":1288,"lower_bound":"NTgzMTk2MzI5","upper_bound":"NjA0MjIwODcz","repeats":1},{"count":1296,"lower_bound":"NjA5MjgwNDgw","upper_bound":"NjE1ODEwODEx","repeats":1},{"count":1304,"lower_bound":"NjE3MTU3Mjgw","upper_bound":"NjI4ODczNDI0","repeats":1},{"count":1312,"lower_bound":"NjM0MTM5NDIy","upper_bound":"NjU1MjY5MTc0","repeats":1},{"count":1320,"lower_bound":"NjU2MzA4MDU1","upper_bound":"NjY3Njc4NzUz","repeats":1},{"count":1328,"lower_bound":"NjY4Mzc1MjQ2","upper_bound":"Njk4MDA4MjMy","repeats":1},{"count":1336,"lower_bound":"NzAwOTc2NzM1","upper_bound":"NzA2MzUyNDAy","repeats":1},{"count":1344,"lower_bound":"NzA2NTI0MTc3","upper_bound":"NzExMTEzNTU1","repeats":1},{"count":1352,"lower_bound":"NzExMjk0NzQx","upper_bound":"NzM3NDIzMzM0","repeats":1},{"count":1360,"lower_bound":"NzM3ODI2NzEy","upper_bound":"NzUwMTI1NDcw","repeats":1},{"count":1368,"lower_bound":"NzcwOTYzNDc2","upper_bound":"Nzg4NDgwNjgz","repeats":1},{"count":1376,"lower_bound":"NzkzNjE0MzI5","upper_bound":"Nzk3MDk0OTk1","repeats":1},{"count":1384,"lower_bound":"ODAyODAzOTUx","upper_bound":"ODA4MDU5MjYx","repeats":1},{"count":1392,"lower_bound":"ODA4MDYxMzAx","upper_bound":"ODIzNjA5ODI1","repeats":1},{"count":1400,"lower_bound":"ODI5NDcwNjgw","upper_bound":"ODM3NjE0OTY4","repeats":1},{"count":1408,"lower_bound":"ODQyMzI0OTEz","upper_bound":"ODQ4NTEyMTQ5","repeats":1},{"count":1416,"lower_bound":"ODUyODY0NDM1","upper_bound":"ODYzNDEzMTI0","repeats":1},{"count":1424,"lower_bound":"ODcxMTQxNjc0","upper_bound":"ODc1NDcwODAw","repeats":1},{"count":1432,"lower_bound":"ODc4MzYwNDMx","upper_bound":"ODg0NzIyNDA3","repeats":1},{"count":1440,"lower_bound":"ODg1Mzg2ODg2","upper_bound":"ODk5MzgwNzgw","repeats":1},{"count":1448,"lower_bound":"OTEwNjE3NDEy","upper_bound":"OTE3ODcxNTM2","repeats":1},{"count":1456,"lower_bound":"OTIzMjM0MzE0","upper_bound":"OTM5MTk3Mzgy","repeats":1},{"count":1464,"lower_bound":"OTQzMDE5MDc2","upper_bound":"OTUzNjI3Mzc0","repeats":1},{"count":1472,"lower_bound":"OTY2MDQ3MTU3","upper_bound":"OTkwNjc5Nzg1","repeats":1},{"count":1480,"lower_bound":"MTAwNDgwNDk4OA==","upper_bound":"MTAzMDA3NzY5MA==","repeats":1},{"count":1488,"lower_bound":"MTAzMzk1MzMwNA==","upper_bound":"MTA0NjQ4OTUxNw==","repeats":1},{"count":1496,"lower_bound":"MTA0Njg1Njg3OA==","upper_bound":"MTA1Mzc1NTM3NA==","repeats":1},{"count":1504,"lower_bound":"MTA1NDU4MTkyNw==","upper_bound":"MTA3MzQxNzgwMA==","repeats":1},{"count":1512,"lower_bound":"MTA3NDkxMDk3Mw==","upper_bound":"MTA4OTA3OTU0OA==","repeats":1},{"count":1520,"lower_bound":"MTA5MzQxMjg5Mg==","upper_bound":"MTEwNDAwMzY1Ng==","repeats":1},{"count":1528,"lower_bound":"MTEwNTMyMDQyNw==","upper_bound":"MTExNjkzMzIxMQ==","repeats":1},{"count":1536,"lower_bound":"MTEyMzc5OTI0Mw==","upper_bound":"MTE1MzA2NzgyMg==","repeats":1},{"count":1544,"lower_bound":"MTE1MzYzMjYxNw==","upper_bound":"MTE2MDk4ODY2NA==","repeats":1},{"count":1552,"lower_bound":"MTE2NDYxNzg5MQ==","upper_bound":"MTE3OTM5ODY1OQ==","repeats":1},{"count":1560,"lower_bound":"MTE4NjQ4MDUwNw==","upper_bound":"MTIwNDQ1NDU1Nw==","repeats":1},{"count":1568,"lower_bound":"MTIwNTc3NDE2Mw==","upper_bound":"MTIzNzAxODQ0Mg==","repeats":1},{"count":1576,"lower_bound":"MTIzODAxMzkzNw==","upper_bound":"MTI0NTU4NzYyNQ==","repeats":1},{"count":1584,"lower_bound":"MTI1MTg0MTM0Mg==","upper_bound":"MTI2NzY2OTYzOA==","repeats":1},{"count":1592,"lower_bound":"MTI3MzMwNjg0OA==","upper_bound":"MTI3NTE5ODI0MA==","repeats":1},{"count":1600,"lower_bound":"MTI5MTcxMjgzMw==","upper_bound":"MTMwMjk4NjM2OQ==","repeats":1},{"count":1608,"lower_bound":"MTMwMzE0NTEyNg==","upper_bound":"MTMxMDA2MjQyOQ==","repeats":1},{"count":1616,"lower_bound":"MTMxNDc1ODgyMQ==","upper_bound":"MTMyNDcxMjUxMQ==","repeats":1},{"count":1624,"lower_bound":"MTMyNjc0MzA4OA==","upper_bound":"MTM0NjQ4MjE2Ng==","repeats":1},{"count":1632,"lower_bound":"MTM1MDc1NjYwNQ==","upper_bound":"MTM2MjE4ODEzMg==","repeats":1},{"count":1640,"lower_bound":"MTM2MjMxNTgzNQ==","upper_bound":"MTM2ODg1NDQ2MQ==","repeats":1},{"count":1648,"lower_bound":"MTM3MTg3MDQ2MA==","upper_bound":"MTM4NTQwOTU5Nw==","repeats":1},{"count":1656,"lower_bound":"MTM5NDAzODgxNA==","upper_bound":"MTQwOTg5OTY0NQ==","repeats":1},{"count":1664,"lower_bound":"MTQxMDYwOTU0MA==","upper_bound":"MTQyNzk5MDE4Ng==","repeats":1},{"count":1672,"lower_bound":"MTQzMDE1NTU0Mw==","upper_bound":"MTQzNzE4MTY0OA==","repeats":1},{"count":1680,"lower_bound":"MTQzODI5NzU2Nw==","upper_bound":"MTQ2MTM2MTYzNw==","repeats":1},{"count":1688,"lower_bound":"MTQ2Mzc3NzgyMw==","upper_bound":"MTQ3OTQyMjU2Nw==","repeats":1},{"count":1696,"lower_bound":"MTQ4MDcxNTgwNQ==","upper_bound":"MTUxNjE3NjI2MA==","repeats":1},{"count":1704,"lower_bound":"MTUxNjQ2NzA2OA==","upper_bound":"MTU1MDMzNTk1Nw==","repeats":1},{"count":1712,"lower_bound":"MTU1MzMxMjU5Mg==","upper_bound":"MTU3OTQxMTg3Mw==","repeats":1},{"count":1720,"lower_bound":"MTU4Mjc4MDAyMg==","upper_bound":"MTYwNDk2ODUwOA==","repeats":1},{"count":1728,"lower_bound":"MTYwNTMxMTI0OA==","upper_bound":"MTYxOTAyMzEzNQ==","repeats":1},{"count":1736,"lower_bound":"MTYxOTQxMTAxNw==","upper_bound":"MTYyMjcwNjE1MQ==","repeats":1},{"count":1744,"lower_bound":"MTYyMzM0NjA1OA==","upper_bound":"MTY0NjIzMDQ0OA==","repeats":1},{"count":1752,"lower_bound":"MTY0NjQwMzc1NA==","upper_bound":"MTY1NTI0NTEwNw==","repeats":1},{"count":1760,"lower_bound":"MTY1NTcyMjgzMg==","upper_bound":"MTY3MTA3NjM5Ng==","repeats":1},{"count":1768,"lower_bound":"MTY3NTQ5ODk1Ng==","upper_bound":"MTY4OTQyNTkyNA==","repeats":1},{"count":1776,"lower_bound":"MTY5NTUyOTczOQ==","upper_bound":"MTcwNTc5MTM2OQ==","repeats":1},{"count":1784,"lower_bound":"MTcwODg5NDM3OA==","upper_bound":"MTcyMDU3ODg3Mw==","repeats":1},{"count":1792,"lower_bound":"MTcyMDYzNTg5NQ==","upper_bound":"MTczMjgxMDA5OQ==","repeats":1},{"count":1800,"lower_bound":"MTc0NDE5NjA3Ng==","upper_bound":"MTc0Njk5Nzk0Mw==","repeats":1},{"count":1808,"lower_bound":"MTc0OTE4NTg4NQ==","upper_bound":"MTc1NTQ3NjU5Ng==","repeats":1},{"count":1816,"lower_bound":"MTc2MDkwNzkxMw==","upper_bound":"MTc3ODM4NTgxOA==","repeats":1},{"count":1824,"lower_bound":"MTc4MjA2ODE4Mw==","upper_bound":"MTc5MjU5NTI3MQ==","repeats":1},{"count":1832,"lower_bound":"MTc5NTc0Nzc1NA==","upper_bound":"MTgxMDE1NzI3NA==","repeats":1},{"count":1840,"lower_bound":"MTgxMTQ5OTg0NA==","upper_bound":"MTgyOTk4ODA1MQ==","repeats":1},{"count":1848,"lower_bound":"MTgzMDY1Njc1Ng==","upper_bound":"MTgzODIzMDU1NA==","repeats":1},{"count":1856,"lower_bound":"MTg0MjUyMjcxOQ==","upper_bound":"MTg1ODUxNzI4Ng==","repeats":1},{"count":1864,"lower_bound":"MTg1ODU5NTQ3NQ==","upper_bound":"MTg2NzA2MTAxNg==","repeats":1},{"count":1872,"lower_bound":"MTg3MTIzOTg4Ng==","upper_bound":"MTg4MTc1NzI0NA==","repeats":1},{"count":1880,"lower_bound":"MTg5MDM5OTI4NA==","upper_bound":"MTg5NDE3MTU4OA==","repeats":1},{"count":1888,"lower_bound":"MTkwNDU2MTg0NA==","upper_bound":"MTkwOTE3ODUyOQ==","repeats":1},{"count":1896,"lower_bound":"MTkyMTcxMTIyNQ==","upper_bound":"MTkyNDE0NTk1Ng==","repeats":1},{"count":1904,"lower_bound":"MTkyNDE1MzIyOA==","upper_bound":"MTkzMDY2NDc5MQ==","repeats":1},{"count":1912,"lower_bound":"MTkzMzYyNzc5MA==","upper_bound":"MTk0OTc5MzM1NA==","repeats":1},{"count":1920,"lower_bound":"MTk2MTkzNjQzNw==","upper_bound":"MTk5Mzc5NDUyNQ==","repeats":1},{"count":1928,"lower_bound":"MTk5NDcxMTU1NQ==","upper_bound":"MjAwNzAwOTIyMQ==","repeats":1},{"count":1936,"lower_bound":"MjAwNzY3MDA0OA==","upper_bound":"MjAzMjc0MjY1Nw==","repeats":1},{"count":1944,"lower_bound":"MjAzNTE4MzI0MQ==","upper_bound":"MjA1MDQ0NDU0Mw==","repeats":1},{"count":1952,"lower_bound":"MjA1MzcwNzEyMw==","upper_bound":"MjA2NDQ0MTMxOA==","repeats":1},{"count":1960,"lower_bound":"MjA3MDU5Njg2Mg==","upper_bound":"MjA3NTcwNjE3Ng==","repeats":1},{"count":1968,"lower_bound":"MjA3NjQzNjI5Ng==","upper_bound":"MjA4MzczNzA1MA==","repeats":1},{"count":1976,"lower_bound":"MjA4NDM1NDc4Mg==","upper_bound":"MjExMzI0MDYwNA==","repeats":1},{"count":1984,"lower_bound":"MjExNDg2NjYzMg==","upper_bound":"MjEyMzIyOTIxMQ==","repeats":1},{"count":1992,"lower_bound":"MjEyNzA1MDM1NQ==","upper_bound":"MjE0MjQ3MjEyMA==","repeats":1},{"count":2000,"lower_bound":"MjE0Mjc0NjYwNQ==","upper_bound":"MjE0NjM0Nzc2NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[5,0,3,0,0,1,1,0,1,0,0,2,2,0,2,1,1,0,1,1,0,2,2,0,0,2,3,1,1,0,0,0,2,2,1,1,2,2,0,0,2,0,1,1,1,0,1,1,2,3,0,0,2,0,0,1,2,1,1,4,1,0,1,1,0,3,1,3,0,1,0,1,0,1,0,2,0,2,0,1,1,4,0,0,1,0,1,0,2,1,1,2,2,2,0,0,1,0,1,1,3,0,1,1,2,2,1,1,0,2,1,1,1,2,0,1,1,1,1,1,0,0,0,0,2,0,1,1,1,1,1,1,2,1,1,2,3,0,0,1,2,0,0,1,1,2,4,0,0,2,0,3,4,0,0,0,1,0,1,2,0,1,0,4,0,2,1,2,2,1,1,1,1,1,0,0,1,1,1,0,1,4,1,2,1,1,0,0,1,0,2,1,1,1,1,0,3,0,1,1,2,2,1,1,0,0,3,1,0,1,0,1,1,1,0,3,0,1,0,0,4,1,1,2,0,0,0,0,1,0,0,1,0,1,1,0,1,1,2,0,1,3,1,2,1,0,2,1,1,1,2,1,1,2,2,2,0,0,3,0,0,0,0,2,0,2,1,3,0,2,1,2,0,0,2,3,1,1,0,0,2,1,0,4,2,0,2,1,1,0,1,2,1,1,2,0,0,1,3,1,0,2,1,0,0,1,0,6,1,1,0,2,1,0,1,0,0,1,1,3,0,1,0,1,1,1,0,0,0,0,0,0,2,2,1,2,1,0,0,1,0,1,2,1,1,0,0,1,2,1,1,0,2,0,1,0,2,1,0,0,0,1,1,1,1,1,0,0,1,1,0,0,2,0,0,0,1,0,0,0,2,1,0,0,1,0,0,2,0,1,0,2,2,0,2,2,0,0,4,1,1,2,0,1,0,0,1,5,1,0,0,2,0,2,3,0,0,0,1,2,1,2,2,0,1,1,1,1,0,2,1,2,1,1,0,0,0,0,4,0,1,1,0,3,0,1,2,1,0,0,2,1,1,0,0,3,1,1,1,3,1,1,1,1,1,0,1,3,1,2,1,1,1,1,1,1,1,0,0,1,0,2,0,0,0,4,2,0,1,3,2,3,1,2,2,3,1,1,3,0,1,2,0,2,2,0,2,0,3,0,1,0,2,0,1,3,2,2,0,2,3,0,1,3,2,1,3,1,1,0,0,0,2,0,3,1,1,0,0,1,1,0,2,2,1,1,2,1,4,2,2,1,0,1,1,2,3,2,0,0,0,1,2,3,0,0,0,2,2,3,0,0,2,0,2,2,1,0,1,2,0,1,2,0,1,1,3,1,1,1,3,0,0,2,0,1,2,1,4,1,2,1,0,1,1,1,1,0,0,0,0,1,0,0,2,0,0,1,0,1,0,0,2,2,3,0,1,1,3,0,2,1,0,1,0,2,1,0,1,0,2,1,0,1,1,1,4,0,0,1,1,1,1,0,2,2,0,2,0,0,1,1,2,1,2,0,1,0,0,1,0,0,2,2,1,4,1,2,2,1,0,1,2,0,1,1,2,0,1,0,2,0,1,2,1,0,2,1,1,1,2,0,2,2,1,1,0,2,2,1,2,0,1,2,1,0,1,0,1,3,1,1,1,2,2,0,0,2,0,0,2,0,0,1,1,1,0,1,2,0,3,3,1,1,0,0,0,0,1,0,2,0,0,2,0,1,2,0,1,1,1,2,4,1,1,1,2,2,0,0,0,0,0,2,1,1,0,2,2,1,1,1,0,1,1,0,2,1,0,0,0,1,0,0,2,2,2,0,2,1,1,1,1,1,0,0,0,0,3,1,1,0,1,0,1,0,0,1,2,1,1,2,0,1,1,1,1,3,0,0,1,0,3,0,1,1,1,0,2,0,0,0,1,1,1,1,1,0,0,1,0,2,1,0,1,1,0,1,1,3,2,0,0,0,0,1,1,0,1,0,1,0,1,0,0,0,1,3,1,1,0,1,1,0,1,1,2,1,0,0,0,2,0,0,2,0,0,2,1,4,0,3,1,3,1,1,1,1,2,5,0,1,0,0,4,2,1,1,0,5,1,2,1,1,1,1,2,2,2,1,1,0,0,0,0,0,0,2,2,1,0,1,2,0,0,0,1,0,1,1,0,0,3,2,1,0,1,1,0,0,0,1,0,1,1,1,2,1,0,2,1,1,0,1,0,4,0,0,1,1,4,2,1,2,1,1,0,1,0,1,1,1,0,2,1,2,2,0,0,2,1,0,1,0,0,1,0,0,0,1,2,0,0,0,3,2,0,0,0,3,0,5,1,1,1,2,2,0,3,2,1,1,0,1,1,0,0,1,1,2,0,0,2,1,2,0,1,0,2,1,0,2,0,0,1,1,1,1,1,0,1,3,0,1,0,1,0,1,1,1,1,0,2,2,2,0,1,1,1,2,0,1,0,1,0,0,0,0,0,3,1,1,1,2,0,1,1,0,0,2,3,0,0,1,1,1,1,0,2,1,3,2,0,1,0,1,3,2,0,1,1,0,2,0,0,0,1,0,0,2,4,0,1,0,2,1,2,4,7,3,3,1,1,0,1,3,2,1,2,1,0,2,1,2,1,0,0,2,0,2,1,1,0,0,2,1,0,1,0,2,0,1,1,0,0,0,3,1,0,2,1,1,1,0,2,2,1,1,1,0,2,1,2,0,0,1,0,0,1,0,2,1,0,1,0,1,2,0,2,1,2,1,1,1,2,0,2,0,0,1,1,1,1,2,2,2,1,1,0,0,1,1,0,0,0,3,2,1,1,0,2,2,0,1,1,1,2,1,0,0,0,1,0,0,1,2,1,1,0,0,1,2,0,0,1,0,2,0,0,0,0,1,0,2,1,1,3,1,0,2,0,2,0,1,1,1,0,1,1,2,1,5,1,0,0,2,2,0,2,1,3,0,1,4,2,0,1,0,1,0,0,1,3,1,2,1,1,0,0,1,2,2,1,0,2,1,0,0,0,1,0,0,2,1,2,1,2,1,3,3,1,2,0,1,2,0,2,1,3,1,0,0,0,0,1,0,0,3,1,1,2,1,0,1,0,0,0,0,0,1,1,1,2,0,1,1,0,1,0,0,0,2,1,0,1,2,0,0,1,2,0,0,0,3,1,2,1,0,1,1,1,1,0,2,1,0,1,1,2,1,1,3,0,1,0,1,0,1,2,0,1,1,2,1,0,2,2,1,1,1,1,0,1,2,0,1,0,1,3,2,0,0,1,1,2,1,0,1,2,1,2,2,1,0,0,1,1,1,0,0,3,2,1,0,0,1,0,2,2,2,2,0,0,1,0,0,4,0,0,0,0,0,1,0,0,0,2,1,1,3,4,1,1,2,0,0,1,0,3,3,0,2,2,0,1,2,0,0,1,1,0,1,2,0,0,0,1,0,2,2,2,0,0,0,2,1,0,1,0,0,1,0,2,1,0,0,0,0,0,0,0,0,1,1,0,1,1,1,0,2,1,0,1,3,0,1,2,0,0,1,1,1,1,3,1,3,3,0,0,1,0,0,0,0,1,0,2,1,0,0,2,2,1,0,0,0,0,0,0,0,0,0,1,1,2,1,1,0,0,1,0,1,2,1,2,1,0,1,0,1,1,0,1,0,0,1,1,1,2,2,0,1,1,3,0,1,0,2,2,1,2,1,0,0,0,1,3,0,0,0,2,1,1,1,0,0,0,2,0,1,0,1,2,2,2,1,0,2,0,0,0,1,0,2,0,1,1,4,2,0,0,1,0,2,0,0,1,0,4,3,1,1,1,2,0,1,1,1,2,1,0,4,2,1,1,1,1,0,1,2,1,1,1,0,0,3,0,0,0,1,0,1,2,2,0,0,0,1,1,0,3,3,0,1,1,1,0,3,1,0,0,2,2,1,2,2,0,0,2,0,0,0,0,0,1,2,0,1,0,1,2,2,1,0,0,2,1,1,0,2,0,3,1,0,1,0,1,2,0,1,0,1,0,1,2,0,2,1,3,2,2,1,0,1,2,0,0,2,1,0,2,2,2,1,0,1,2,2,0,1,1,0,0,1,1,0,0,0,2,0,0,0,2,0,1,3,0,1,1,0,1,2,1,1,1,0,1,0,2,1,1,2,1,2,2,0,0,1,2,1,1,1,0,0,0,0,1,2,1,1,1,1,1,2,0,2,0,0,3,1,2,0,1,1,0,2,3,1,1,1,0,1,1,0,2,1,0,0,1,0,1,0,0,1,0,0,2,0,3,1,1,0,1,1,0,3,1,1,0,2,1,0,1,1,2,2,0,1,1,1,1,2,3,1,3,1,0,0,0,1,1,1,1,0,0,1,1,3,1,0,0,2,0,0,1,0,0,1,0,1,1,2,2,0,0,1,1,0,2,1,2,2,0,1,2,1,2,2,0,2,1,0,0,1,1,2,1,0,0,0,1,1,2,0,0,3,1,0,2,1,1,2,0,0,0,1,1,1,0,1,1,1,0,1,3,0,1,4,0,1,2,2,0,0,0,2,2,0,0,1,0,0,0,0,2,0,0,0,1,0,0,3,1,0,0,2,2,0,0,2,1,1,2,0,0,1,1,2,0,1,1,0,1,1,0,1,1,1]},{"counters":[0,3,0,1,4,0,2,0,0,0,0,0,0,1,0,1,2,0,1,3,0,1,2,4,0,0,0,5,1,1,0,2,2,1,0,0,3,5,0,0,1,2,2,2,1,0,1,1,0,0,2,1,0,1,2,1,0,0,0,0,1,0,0,2,1,0,2,2,1,0,1,2,1,1,3,0,1,0,1,0,2,0,3,1,1,2,1,0,0,0,0,2,1,1,0,0,1,0,0,0,1,1,0,0,1,1,2,1,1,0,2,0,0,2,2,3,3,1,1,0,0,1,2,1,0,1,1,0,1,1,0,1,1,0,1,0,2,0,1,0,0,0,2,0,1,1,1,1,2,0,1,0,1,1,0,1,1,1,2,1,1,1,1,0,0,1,0,2,0,0,0,0,0,1,0,0,2,0,0,1,2,1,1,2,0,0,1,0,1,2,1,0,1,2,3,0,0,1,3,1,0,1,1,0,3,1,0,0,0,4,1,1,2,3,5,0,1,1,0,1,0,0,0,0,0,1,2,1,0,1,1,2,1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,2,0,0,0,2,2,1,1,0,1,0,2,0,0,1,0,2,1,2,1,0,1,1,1,2,1,1,1,1,1,1,1,2,1,1,0,0,1,1,0,2,0,1,1,1,2,2,0,0,0,1,4,2,4,1,0,0,1,2,1,0,2,2,1,4,0,0,1,0,1,2,1,1,1,1,0,1,2,1,1,1,0,2,4,2,1,0,1,2,0,0,0,3,0,1,0,0,0,1,1,0,3,2,0,1,0,0,1,0,0,1,0,1,1,1,4,4,0,1,0,1,2,1,0,0,2,1,2,2,1,0,0,1,1,1,0,2,2,0,1,0,2,4,1,4,4,0,2,0,1,3,1,0,4,0,0,1,1,1,1,1,1,1,0,0,2,1,1,1,1,2,1,0,0,1,1,3,1,0,1,0,0,0,0,1,0,0,4,1,0,2,0,0,1,0,2,1,0,1,1,0,4,1,0,0,1,0,2,2,2,0,2,2,2,1,1,0,1,0,2,0,0,1,3,0,1,0,0,1,1,1,1,2,1,2,0,2,1,0,0,1,0,2,2,2,1,1,3,0,1,0,1,0,4,2,1,1,2,2,0,1,3,0,4,1,0,1,1,1,1,3,1,3,1,0,1,0,0,0,1,0,2,1,1,0,1,0,0,3,0,1,0,0,0,2,2,1,1,2,1,0,1,0,0,2,0,1,1,0,0,0,1,0,1,0,2,1,0,0,0,0,2,2,0,2,1,3,0,3,1,0,1,2,2,3,0,1,3,2,0,1,1,1,3,0,2,0,1,1,0,0,2,3,2,1,3,1,2,1,1,2,0,2,0,1,0,0,1,0,1,0,1,2,1,1,0,0,1,1,2,0,0,1,1,1,0,1,0,1,0,1,0,1,2,0,0,1,0,0,2,1,2,0,0,0,1,1,2,2,0,2,0,0,1,2,3,0,1,1,1,2,1,1,1,1,1,1,1,2,2,2,1,2,1,0,0,1,1,0,0,0,0,2,0,2,0,2,1,1,0,0,1,2,0,0,1,0,2,1,2,1,1,2,0,1,0,1,0,2,1,2,0,3,0,0,1,0,2,0,1,1,1,4,0,0,3,2,1,3,1,1,2,0,1,0,1,0,2,0,2,2,2,1,1,1,2,1,0,0,1,0,2,3,0,3,0,0,0,1,1,0,1,1,0,0,1,1,2,0,0,0,0,1,3,1,0,2,0,0,0,0,0,2,1,1,1,0,1,2,0,0,2,2,1,0,0,4,0,1,1,1,2,1,0,1,0,0,0,2,3,1,1,0,0,1,3,4,0,1,1,1,3,1,0,1,1,0,1,0,1,0,1,1,2,1,1,2,2,0,3,0,1,2,2,1,0,0,0,1,3,1,1,3,2,0,1,2,1,3,1,1,2,1,2,1,1,1,2,1,1,0,1,1,0,0,1,1,0,0,1,1,0,1,1,1,1,1,2,0,1,1,0,1,1,0,1,2,0,2,0,0,2,2,1,0,2,1,1,1,0,3,0,1,0,0,2,0,0,0,2,2,1,0,1,0,1,1,0,2,0,2,3,1,0,1,0,1,1,3,0,0,1,1,1,0,2,2,0,1,0,3,1,1,0,0,3,2,0,0,0,0,0,0,0,1,0,1,1,1,1,1,1,2,0,1,0,1,0,1,0,0,3,0,1,1,1,1,1,1,0,2,1,0,1,1,0,1,1,0,1,0,0,3,2,1,2,0,2,1,3,0,1,1,0,1,1,0,1,0,1,1,1,3,0,2,2,0,1,0,1,1,0,3,1,0,1,2,1,1,2,1,0,1,0,2,0,0,2,0,0,1,0,2,0,1,2,3,2,1,0,1,1,1,4,1,1,0,2,1,3,2,2,1,1,1,2,1,1,3,0,1,0,1,1,1,2,2,1,2,2,1,0,3,2,1,0,2,1,1,1,1,2,1,1,0,0,0,2,1,2,0,2,1,1,1,2,1,1,3,2,0,1,2,1,3,0,1,1,1,2,0,0,2,1,0,0,2,2,2,1,1,1,0,2,2,1,0,1,3,0,2,3,0,2,1,2,1,1,1,0,1,1,1,2,0,1,1,0,1,1,1,0,2,0,0,2,0,1,0,0,1,1,1,3,1,2,0,1,2,0,2,1,1,0,0,1,1,1,1,0,0,1,2,2,0,1,2,0,2,1,0,0,1,4,1,3,1,1,0,0,0,1,2,0,1,1,2,1,1,0,1,0,0,2,0,0,0,0,2,3,1,0,3,2,0,0,3,4,0,0,1,0,1,3,1,0,1,1,0,1,2,1,0,1,0,0,0,0,1,0,2,1,0,1,1,1,0,1,0,1,1,0,2,1,0,1,1,0,0,1,1,0,1,1,0,0,0,0,1,1,3,1,3,2,1,0,1,0,1,0,2,0,2,2,0,2,0,1,0,2,1,1,2,0,3,1,1,0,1,1,0,0,0,1,1,1,1,2,5,0,0,0,0,2,0,2,2,0,2,0,1,1,0,2,0,1,1,4,3,1,1,2,0,1,2,2,0,1,0,1,3,2,0,1,2,0,0,1,0,1,0,3,2,1,0,1,1,2,1,1,1,0,0,2,3,0,0,0,1,0,3,0,0,0,2,2,1,0,0,0,2,1,0,2,2,0,0,1,3,0,2,1,1,1,0,1,1,0,0,1,1,1,2,0,0,0,0,2,0,1,0,0,2,2,1,1,2,0,1,0,2,1,1,0,0,3,3,2,1,2,3,1,0,1,0,1,0,1,1,0,2,2,0,4,0,2,1,1,2,0,4,1,1,1,1,2,1,1,1,0,0,1,1,0,4,0,2,0,0,1,2,1,0,2,0,1,0,0,5,1,2,2,2,0,0,1,2,1,0,1,0,2,0,1,0,0,1,0,0,1,3,0,0,1,1,1,2,2,0,1,1,0,1,0,0,0,2,1,2,2,0,2,0,1,0,2,1,3,0,0,1,0,1,3,4,0,0,0,1,1,1,0,0,0,2,0,2,2,0,2,0,3,0,2,1,0,0,2,0,5,1,1,0,2,0,1,1,0,2,1,0,0,0,0,0,4,1,2,1,0,1,0,2,1,0,1,0,0,0,1,3,1,1,1,0,0,0,3,1,0,1,2,1,2,1,0,0,0,1,1,1,0,1,2,0,0,2,3,1,0,0,0,0,3,0,1,0,0,1,1,1,4,1,0,1,1,1,0,0,0,1,0,0,0,1,3,0,3,1,1,3,1,0,2,4,2,0,1,0,0,1,1,0,1,1,1,1,1,1,1,0,1,0,0,0,0,1,2,0,1,0,3,0,0,1,0,0,1,3,0,3,0,2,2,1,4,2,1,2,0,0,3,1,1,1,1,1,2,1,0,2,0,0,2,2,1,2,4,0,0,1,0,2,1,1,1,0,0,1,3,1,0,2,0,0,2,1,1,2,0,0,1,2,1,1,2,0,3,1,0,0,1,2,0,0,1,2,1,0,2,0,0,1,1,1,0,0,1,4,2,0,0,2,1,0,1,1,0,0,1,0,0,1,1,1,3,1,1,1,1,1,0,0,0,2,1,0,2,0,1,1,2,0,0,1,3,0,4,0,1,1,1,2,1,0,0,0,2,2,0,3,3,3,1,0,1,1,1,2,0,1,1,0,4,0,0,1,1,1,0,0,1,0,2,0,0,1,0,0,2,1,1,2,3,0,1,2,2,0,1,2,0,2,1,0,0,1,3,1,2,1,2,0,1,3,1,0,3,1,1,0,1,0,0,1,1,2,2,1,1,2,2,0,1,2,1,2,0,1,0,0,0,0,0,0,1,0,2,0,0,0,1,0,3,0,1,0,0,0,0,1,2,1,4,0,1,3,2,1,0,1,0,0,0,0,1,0,1,0,0,2,0,1,2,0,1,1,1,1,1,0,0,1,0,1,2,0,2,1,1,0,1,0,1,0,2,1,2,1,1,1,0,1,3,0,0,0,3,2,0,1,1,1,0,0,3,0,3,1,1,0,3,0,2,2,1,1,0,2,0,1,0,1,1,0,2,0,0,2,0,1]},{"counters":[0,2,2,1,2,2,2,0,1,0,0,0,0,0,0,1,0,0,0,1,1,2,2,1,1,0,1,0,1,1,0,0,1,1,0,2,0,3,2,0,1,1,1,2,2,1,0,1,0,0,0,2,1,1,1,0,1,0,0,0,3,1,0,1,1,0,2,1,0,0,1,0,1,2,1,1,3,2,0,0,2,1,1,0,1,2,2,1,0,0,0,0,0,0,2,6,1,0,3,0,0,1,0,2,0,0,2,0,0,3,1,1,1,0,0,1,0,0,2,2,0,0,0,2,1,0,1,1,1,1,0,3,1,1,2,0,0,1,2,1,3,2,2,0,1,3,2,1,1,1,1,3,0,0,1,0,1,2,1,0,1,1,1,2,0,0,2,1,4,1,0,1,2,1,0,0,2,2,1,0,2,0,0,0,0,2,0,1,1,2,0,0,0,1,1,1,0,1,2,2,1,0,0,1,3,1,3,1,0,0,0,0,1,1,0,0,2,2,3,0,0,1,1,2,1,0,4,1,1,0,0,0,0,1,3,0,2,2,3,1,0,2,0,1,1,1,1,0,1,2,2,0,1,1,0,0,1,1,2,2,0,2,0,0,1,0,2,1,1,2,0,2,1,0,2,1,1,0,1,2,3,1,0,0,0,3,0,0,0,0,1,1,1,1,2,0,2,0,0,0,0,1,0,2,1,0,1,2,2,1,0,1,0,0,1,1,0,1,1,1,0,1,1,1,0,1,2,3,1,1,1,1,1,0,0,1,0,0,1,0,0,0,1,1,1,3,2,0,1,1,0,1,0,0,1,2,2,1,5,1,0,2,0,1,1,0,0,1,3,0,0,3,0,0,2,0,0,1,2,1,0,0,2,0,1,0,0,2,1,2,2,0,0,1,0,1,2,0,0,2,0,0,1,0,0,2,1,0,1,0,1,0,1,3,1,0,1,0,0,0,0,1,0,2,2,0,0,0,2,2,1,1,0,2,0,2,3,1,1,1,1,0,0,3,1,1,0,2,2,0,3,1,1,2,1,1,0,2,1,0,2,0,0,1,1,0,4,1,2,1,2,0,2,1,0,2,0,2,0,0,1,0,2,0,1,0,1,0,0,1,0,0,2,4,1,0,2,1,1,2,1,0,2,0,1,2,2,1,2,1,2,2,1,1,0,2,0,1,2,0,3,4,1,0,1,3,0,1,1,0,2,2,1,0,1,1,1,0,0,1,0,2,1,0,2,1,2,1,0,1,2,1,2,0,2,1,3,2,0,0,0,1,2,0,0,1,2,0,1,1,0,1,1,1,0,1,2,0,0,2,2,1,1,0,0,2,0,1,0,1,0,1,0,1,1,2,3,0,0,0,1,0,1,1,0,1,1,5,0,1,0,0,3,0,1,1,4,0,2,0,0,0,3,0,1,0,1,0,2,2,0,0,1,0,1,1,2,0,1,1,0,3,3,1,1,0,2,0,0,1,0,1,1,0,2,1,0,2,0,0,1,3,0,1,1,0,2,1,0,2,0,0,2,1,1,0,1,2,0,0,2,1,0,1,1,1,2,3,0,1,5,3,1,2,2,0,0,0,1,0,1,1,1,1,0,0,4,1,1,0,1,0,0,0,0,1,0,0,2,2,0,1,1,1,0,0,1,3,0,3,1,1,0,2,0,1,1,0,1,1,2,1,0,0,0,5,0,0,2,2,0,1,0,1,0,2,0,1,1,1,2,2,0,0,1,0,0,1,4,1,1,0,3,3,1,0,2,2,0,1,1,0,0,1,1,0,0,0,0,1,1,1,1,2,0,1,1,1,0,0,1,1,0,0,1,1,3,0,1,1,1,0,3,2,1,2,2,0,0,1,2,1,0,1,4,1,1,0,0,1,0,2,1,0,2,1,2,1,0,1,0,1,2,0,1,1,0,2,5,0,1,1,2,1,2,1,0,3,2,4,1,0,0,0,4,1,2,1,1,2,2,1,2,1,3,0,1,0,1,0,0,1,0,0,2,2,0,0,1,2,1,0,2,0,1,0,0,2,0,0,1,3,1,1,0,1,1,0,0,0,0,0,2,0,3,1,1,2,1,0,2,0,0,1,1,0,0,2,0,0,1,1,1,1,1,0,0,1,1,1,0,3,1,0,1,2,0,3,0,3,1,1,2,1,0,2,2,0,0,0,1,2,2,2,1,2,0,0,1,1,1,2,4,1,0,1,0,1,0,0,2,0,1,0,3,1,1,2,0,1,1,2,2,1,1,0,0,1,1,0,0,3,0,0,0,0,2,1,2,1,1,0,1,0,1,1,1,0,3,1,1,0,1,1,2,0,0,3,1,1,2,2,1,2,2,1,3,1,1,0,1,0,0,1,0,2,0,1,3,2,0,1,0,0,1,0,2,1,0,1,1,1,0,1,1,3,0,1,1,0,0,1,1,1,1,0,2,2,0,1,1,0,1,5,0,0,1,1,1,0,1,1,2,1,2,1,0,2,0,2,1,0,1,1,1,1,2,0,4,1,0,0,0,2,2,1,0,0,2,0,1,0,1,2,2,1,3,1,0,4,0,2,0,0,0,1,2,1,0,1,0,1,1,2,3,2,0,0,2,1,2,1,0,1,0,0,0,2,3,0,1,1,0,1,0,0,1,0,0,4,2,0,1,0,1,1,1,1,2,1,0,2,2,1,1,0,3,0,1,0,1,1,1,1,1,2,0,0,2,1,0,1,2,1,0,2,2,1,0,0,0,0,0,1,1,1,0,1,2,2,2,0,0,2,3,3,1,1,0,2,1,2,2,2,0,1,2,2,2,0,1,0,1,1,1,1,0,2,2,2,1,2,1,2,0,0,1,1,1,0,1,1,2,0,1,1,2,1,1,0,0,0,0,1,0,1,2,2,0,0,3,2,1,1,2,0,0,1,0,1,3,2,1,0,2,1,0,2,2,0,0,2,1,1,1,0,1,3,1,2,0,0,0,2,1,0,0,0,3,2,1,2,0,1,2,1,1,0,0,0,1,2,1,0,0,3,2,0,1,2,2,0,1,0,1,1,2,0,1,0,1,2,1,0,1,1,1,2,0,0,2,3,5,3,2,4,1,3,1,3,3,1,2,0,1,2,1,2,1,2,1,1,0,1,1,0,2,1,0,0,2,2,0,0,1,0,0,3,0,1,1,3,1,0,2,0,2,2,0,1,1,0,2,0,1,1,1,1,0,1,3,0,1,1,0,0,0,1,0,0,2,1,1,0,3,0,1,0,0,0,2,0,0,3,3,2,0,1,1,3,0,0,0,0,1,0,0,1,2,2,0,2,4,0,1,1,0,0,0,0,0,0,1,1,2,1,2,0,1,0,0,0,0,0,2,0,2,1,2,2,0,2,1,2,1,1,4,1,0,0,0,0,2,0,1,2,0,1,0,1,2,2,1,3,1,0,0,1,2,0,0,2,0,0,0,0,1,2,0,0,2,1,1,2,1,2,1,1,1,0,2,2,1,0,0,1,0,2,1,1,0,1,1,2,0,1,1,0,0,1,1,0,0,1,0,0,0,1,0,2,0,3,1,1,3,0,1,1,2,1,0,0,1,1,1,1,0,0,0,0,0,0,2,0,2,1,0,2,3,2,1,2,0,2,0,2,0,1,0,0,1,2,0,2,1,1,1,1,2,2,1,2,0,1,0,0,0,0,0,2,1,0,2,1,2,1,0,5,0,2,1,2,5,1,0,1,0,0,1,0,0,0,2,0,0,1,1,1,2,0,0,2,0,1,0,3,1,1,1,0,0,0,3,1,0,0,0,2,1,1,1,2,0,0,1,0,1,1,0,1,2,1,1,1,0,0,1,0,1,0,1,2,0,3,3,1,2,1,1,1,0,1,0,0,1,0,2,0,1,0,1,1,1,0,1,1,1,1,0,0,0,1,1,1,0,1,0,1,1,1,1,1,1,1,2,2,0,1,0,0,0,2,0,2,1,1,0,2,1,1,0,1,1,1,0,1,0,0,2,1,1,1,1,1,2,0,0,1,1,2,1,4,0,1,0,0,0,0,0,0,0,1,2,2,2,1,2,2,1,0,0,0,1,0,2,1,0,2,0,1,0,1,2,1,1,0,1,1,1,0,0,1,0,3,1,0,0,2,1,2,1,1,1,2,0,2,0,2,1,2,1,1,1,0,1,0,3,1,0,2,1,0,0,0,1,0,0,2,2,0,2,1,1,1,3,3,0,0,1,0,0,1,1,2,0,3,3,0,1,1,1,2,0,1,1,0,1,0,0,0,0,3,3,2,0,1,1,2,1,1,1,2,0,0,0,0,0,3,1,1,0,0,2,2,0,1,0,1,1,2,0,1,2,2,1,3,1,5,0,2,1,2,1,1,2,0,2,2,1,2,0,1,1,0,1,2,1,0,2,1,5,1,0,0,1,2,1,0,0,2,0,1,0,1,2,0,1,1,1,2,2,1,0,3,0,1,0,2,1,1,1,1,1,2,0,0,2,2,2,1,2,3,3,1,0,0,0,0,1,2,0,0,2,1,1,2,2,3,1,2,2,0,0,2,1,2,1,1,5,1,1,2,0,2,1,1,0,2,0,0,2,0,0,0,0,2,0,3,1,2,0,1,0,1,2,1,0,1]},{"counters":[2,2,3,2,0,2,0,0,0,3,1,2,1,3,2,2,2,1,0,0,0,0,0,1,0,0,1,1,0,0,1,3,1,0,2,0,0,1,2,2,0,1,2,1,1,2,0,0,0,6,0,1,1,0,0,1,1,2,0,3,4,1,1,1,1,0,0,0,0,1,2,1,1,0,1,2,1,0,0,0,2,0,2,0,2,2,0,2,1,1,0,0,1,1,2,1,0,1,1,1,0,0,0,0,2,2,1,0,0,0,1,1,2,1,0,1,0,1,1,1,0,0,2,0,2,5,1,1,0,0,0,3,4,0,6,1,3,1,0,0,0,0,1,2,0,3,1,1,0,1,1,0,1,0,1,0,1,1,2,2,0,3,1,2,3,1,1,1,0,3,0,0,1,1,0,2,1,1,1,0,3,1,2,3,2,0,4,3,1,0,3,0,2,0,2,1,2,0,1,2,1,3,0,1,1,0,3,0,0,0,2,3,2,2,0,2,1,1,0,0,0,0,2,1,0,1,0,0,0,4,1,1,3,2,6,1,0,0,0,1,0,0,2,0,0,0,1,1,0,1,1,0,0,1,0,1,1,2,0,2,0,0,1,2,0,1,0,0,0,0,1,3,0,3,0,1,2,5,2,2,1,2,1,0,1,0,0,0,1,0,2,0,1,0,1,3,0,2,0,1,1,0,2,1,3,1,0,1,1,1,1,1,2,0,1,0,1,0,1,4,1,2,2,0,1,0,3,2,0,0,2,0,0,0,0,1,1,1,0,1,0,0,1,1,1,0,3,0,0,1,2,2,1,0,0,0,0,1,1,0,0,1,1,1,2,1,1,0,1,0,1,1,1,0,1,0,0,1,0,1,0,0,1,0,2,0,0,1,1,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,2,2,0,0,1,0,0,1,1,0,1,0,0,2,1,0,0,2,2,0,2,0,1,1,0,1,1,0,1,0,2,1,1,1,0,1,0,2,1,1,2,0,0,3,3,1,1,1,1,0,1,1,4,1,2,2,0,0,3,0,1,1,1,1,2,0,0,0,0,2,1,1,0,0,0,1,1,1,2,1,2,0,1,0,0,1,1,2,1,4,0,1,1,1,1,2,4,0,1,0,0,0,1,0,0,1,1,1,0,0,1,0,0,1,0,2,2,0,1,2,2,1,2,0,2,1,0,0,1,1,0,1,2,0,1,2,0,0,2,0,2,0,3,2,2,2,0,1,0,0,0,1,2,1,0,3,0,1,1,1,2,2,1,0,1,4,2,0,0,1,2,0,2,3,0,2,1,1,0,1,0,0,2,1,0,1,2,1,2,0,3,0,0,2,4,2,4,0,1,1,1,0,0,1,0,1,0,1,0,0,0,1,0,1,3,0,2,0,1,0,1,0,2,2,2,3,1,0,2,2,1,1,2,0,1,3,0,0,2,1,1,0,1,1,0,1,1,0,1,0,0,0,1,1,0,2,1,0,0,1,1,1,0,2,1,0,1,0,2,1,2,0,0,0,1,1,1,0,1,3,1,1,0,0,0,2,2,1,1,0,0,0,2,0,1,0,2,1,0,0,1,1,0,2,2,1,3,0,1,2,0,3,1,1,3,0,0,0,0,1,0,1,0,2,2,0,0,2,1,2,0,0,1,1,1,1,2,1,0,0,0,0,2,0,0,0,1,2,1,1,5,2,1,3,0,2,0,0,0,0,1,0,0,1,0,1,3,1,1,0,0,2,2,0,1,1,1,0,2,1,1,2,0,4,4,1,1,2,0,1,1,2,1,1,1,2,2,1,1,0,0,2,1,0,0,1,0,1,0,1,3,1,1,1,1,2,3,2,1,0,3,4,2,1,0,0,1,0,0,0,1,0,1,3,1,1,0,1,0,1,1,1,0,3,1,0,0,0,1,0,0,2,0,1,0,5,1,1,3,1,0,1,2,0,0,3,0,1,0,0,0,2,1,0,1,1,0,0,2,0,0,0,0,3,2,2,3,0,1,4,0,1,1,1,2,2,1,1,2,0,2,0,1,0,3,0,0,1,0,2,1,4,3,1,2,2,0,4,1,2,2,2,1,1,0,1,2,1,1,2,2,2,3,1,0,0,2,0,0,1,2,1,1,1,2,0,1,1,2,1,2,0,0,0,1,0,2,0,2,0,1,0,1,2,1,1,2,2,1,1,2,2,3,0,1,0,0,1,0,1,2,0,1,0,1,0,2,0,2,1,5,1,1,1,0,0,0,0,0,1,0,1,1,1,0,1,3,0,0,1,1,2,1,1,3,0,1,3,0,0,0,2,1,0,2,0,0,1,1,1,0,1,2,1,0,0,2,1,2,0,2,2,0,0,0,1,2,0,2,1,2,1,1,0,1,2,0,0,3,3,1,1,0,0,0,1,1,0,2,0,1,0,1,2,0,2,0,0,0,1,1,1,0,1,1,1,2,0,0,0,0,3,2,2,0,0,1,1,1,0,1,0,0,3,1,2,0,1,0,2,2,0,0,0,0,0,1,0,1,1,0,0,4,1,2,2,0,1,0,0,1,2,1,0,1,0,1,0,0,0,0,2,3,2,0,1,1,0,0,1,0,0,2,0,1,0,1,2,1,3,1,0,0,0,1,1,0,0,0,0,0,2,0,1,1,0,1,1,2,1,1,2,0,1,1,1,2,1,0,0,0,2,1,0,1,1,2,2,1,0,1,1,0,0,1,0,1,1,0,0,1,0,0,0,1,0,2,0,0,5,0,1,0,3,0,0,0,1,1,1,1,2,2,0,2,0,2,0,2,1,3,1,1,1,1,0,2,1,0,0,2,0,2,3,2,2,3,0,1,1,0,4,1,0,1,1,0,0,2,1,1,1,0,3,1,4,1,0,2,0,1,1,1,2,2,1,0,0,2,1,2,1,0,1,0,2,2,1,2,2,0,1,2,1,0,0,1,0,0,1,0,1,1,0,4,1,0,0,1,0,2,2,1,1,1,1,0,1,0,2,0,1,0,1,0,0,2,0,0,1,0,0,2,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,1,0,0,2,2,1,2,2,0,2,0,2,0,2,2,1,0,1,0,0,0,1,1,4,0,2,1,1,0,2,0,0,1,0,2,1,3,1,0,1,2,2,0,0,3,1,1,0,2,1,1,1,2,2,0,1,2,0,1,0,0,2,1,0,1,1,0,0,3,1,0,0,1,2,2,3,1,2,1,0,2,0,2,1,1,1,2,0,0,2,2,0,2,0,2,2,0,0,0,2,0,2,0,2,1,1,1,0,2,2,2,0,1,1,0,0,0,1,0,0,2,1,3,1,3,0,2,0,1,2,0,2,2,3,0,0,0,4,2,4,0,1,2,0,1,2,0,2,1,1,2,0,0,3,0,0,1,3,1,0,0,0,0,2,0,1,2,3,1,0,2,0,2,0,0,3,1,0,1,0,1,0,3,1,0,0,1,2,0,0,1,2,1,0,2,2,0,1,1,1,0,1,1,1,1,4,1,0,2,1,1,1,0,2,2,0,1,0,1,3,3,1,0,0,1,0,3,1,1,3,0,0,0,0,0,1,2,0,1,1,3,0,1,1,2,2,2,2,0,0,0,1,1,3,1,0,1,0,0,1,3,1,2,1,0,0,1,0,0,1,0,2,3,3,0,0,0,1,4,3,1,0,0,2,1,0,0,0,0,1,0,1,1,0,3,0,2,0,0,2,0,1,2,3,0,2,1,1,2,2,0,3,0,2,2,1,0,1,1,2,0,3,1,0,1,1,0,1,2,3,3,1,4,1,1,1,1,0,0,2,2,2,1,0,1,2,1,0,2,0,0,1,2,1,1,0,0,1,1,0,2,1,0,2,1,0,2,0,1,1,0,0,1,0,0,1,1,1,5,2,4,1,0,0,1,0,2,2,3,0,0,3,0,1,1,1,1,0,0,1,0,3,1,2,2,0,3,1,4,1,1,0,1,0,1,1,3,1,1,0,2,2,0,0,1,1,1,1,0,0,2,0,2,3,1,0,1,3,0,0,0,1,0,0,1,1,1,2,0,1,2,2,0,2,0,0,1,0,0,0,2,1,2,1,1,2,0,0,1,1,0,1,0,0,2,0,1,0,2,0,0,1,2,3,1,1,0,2,2,2,1,0,1,0,1,1,2,0,2,1,1,1,1,1,0,1,0,1,1,1,2,0,0,1,2,0,1,1,1,2,2,0,1,2,1,0,0,2,0,1,2,1,2,0,3,0,0,1,0,0,1,2,0,1,3,1,1,0,1,1,1,2,2,0,0,0,1,0,2,2,0,1,1,0,0,2,0,3,1,1,2,1,1,0,0,0,1,0,0,0,0,0,2,1,4,0,0,3,0,0,1,2,1,1,0,0,0,1,1,4,0,0,0,0,0,0,0,1,1,0,0,0,1,2,1,1,0,0,1,1,1,1,0,0,1,0,2,0,2,0,2,2,1,1,1,0,0,1,3,5,2,0,2,4,1,1,0,0,1,3,1,0,0,1,2,2,1,1,2,0,0,0,0,0,2,0,1,0,3,0,0,2,0,0,1,2,0,1,2,2,0,1,2,1,3,0]},{"counters":[0,1,1,0,0,1,1,0,1,1,1,2,1,0,0,6,1,1,1,2,1,1,1,1,1,1,0,0,1,1,1,0,0,4,1,2,1,1,0,1,1,2,1,3,0,1,0,0,0,2,1,1,1,1,0,0,3,0,2,0,0,1,0,2,0,0,0,1,0,0,1,0,1,0,1,1,1,0,4,0,1,3,1,1,2,1,2,0,1,2,0,2,0,0,0,2,1,0,0,1,2,0,1,1,0,3,2,2,0,0,1,2,1,0,0,2,1,1,1,1,0,0,0,1,0,1,1,2,1,2,2,1,1,1,1,3,1,2,0,1,1,0,1,3,0,2,2,0,2,0,0,1,1,2,1,1,0,0,1,1,1,1,0,0,0,1,1,0,0,0,0,1,2,1,3,2,0,1,1,1,2,1,1,0,0,0,0,0,0,0,0,1,1,0,0,1,2,1,0,1,1,0,1,3,1,0,1,0,0,3,1,0,1,1,0,1,4,0,0,0,0,1,2,4,0,2,3,3,0,0,2,2,1,2,0,1,1,1,0,0,0,0,1,1,1,2,1,1,2,1,0,1,2,1,0,1,0,0,1,1,0,1,4,0,1,1,1,2,0,0,1,0,2,1,1,2,0,2,0,0,0,1,0,2,0,1,0,0,1,1,1,2,1,2,0,1,1,1,1,3,0,0,2,1,2,1,1,2,1,1,0,2,1,0,0,0,1,1,0,1,1,2,0,1,0,0,0,0,2,1,0,0,2,1,0,1,0,0,2,0,1,1,2,1,1,0,2,1,1,1,0,2,1,1,0,0,0,0,0,2,0,1,0,2,2,1,0,1,2,1,1,1,0,1,0,2,0,1,1,2,1,0,0,0,1,1,1,0,0,3,0,2,2,0,3,1,1,0,1,0,3,1,1,2,2,1,0,1,2,0,0,0,1,0,3,1,1,1,1,1,1,1,0,0,0,0,0,1,1,5,1,1,2,0,0,0,1,1,1,0,1,0,0,0,0,1,1,1,0,0,0,1,2,1,0,1,2,1,0,0,0,2,3,5,0,1,1,0,1,0,1,0,1,1,1,1,0,1,1,1,2,0,1,1,0,1,0,1,1,1,2,0,2,0,0,0,2,2,1,1,0,3,0,2,1,2,0,0,0,0,1,2,0,0,0,2,1,1,0,2,0,1,1,2,1,2,0,2,1,1,1,2,0,1,2,1,0,1,1,2,0,2,3,0,0,1,1,0,0,3,0,2,1,0,0,0,0,0,3,2,2,1,2,0,0,1,0,0,0,1,2,1,1,2,1,0,0,1,1,0,3,0,1,2,1,0,1,1,1,1,1,2,0,1,1,1,0,1,2,2,2,0,0,1,0,2,0,1,2,3,0,0,1,0,2,0,0,2,0,1,1,0,1,2,2,0,0,1,4,2,2,1,0,2,0,0,2,1,1,4,0,2,3,0,0,1,1,1,1,2,2,0,2,0,1,0,2,0,1,0,0,2,2,2,2,2,1,1,1,0,2,1,1,1,1,2,1,2,0,0,2,0,0,1,0,2,0,0,1,1,0,1,1,0,3,0,2,3,0,1,0,1,0,0,1,1,0,0,1,3,0,1,0,1,2,0,2,0,2,0,1,0,1,0,2,1,2,0,3,0,1,1,2,0,0,1,0,0,0,1,2,1,1,0,0,2,2,0,3,1,0,1,2,1,0,2,1,2,2,0,0,2,0,2,3,2,0,2,2,2,1,1,1,1,2,0,0,1,3,0,3,0,2,1,0,2,1,1,3,1,1,0,1,0,0,0,1,0,0,0,1,0,0,3,1,1,0,0,0,1,0,3,1,1,0,3,3,0,1,1,1,0,0,0,4,1,2,0,0,1,1,2,1,2,1,3,3,0,0,1,0,0,2,0,2,1,3,0,1,0,3,1,3,0,1,2,1,2,1,0,1,1,3,0,0,2,1,4,0,1,2,3,2,1,1,1,0,2,1,0,2,2,0,0,0,1,1,0,0,1,2,0,2,6,1,2,2,3,0,3,2,0,1,0,2,0,2,1,0,0,0,3,1,1,0,1,0,1,0,0,1,3,0,0,0,0,1,0,0,0,0,2,2,0,0,1,0,0,0,0,1,0,2,1,0,2,0,1,2,1,1,0,1,2,0,1,0,1,0,0,0,0,1,0,1,1,3,1,0,2,1,2,2,0,2,2,0,1,0,3,0,1,2,0,0,2,0,1,1,2,0,0,0,1,1,0,2,0,0,0,1,1,0,1,1,0,0,0,0,1,1,0,1,0,1,1,1,0,1,2,0,0,3,2,2,1,3,4,0,1,1,2,0,2,1,0,0,0,2,3,2,2,1,1,1,0,1,2,3,1,2,0,0,2,1,1,1,0,0,1,0,0,0,1,2,1,2,1,0,1,0,0,0,0,1,0,3,1,1,3,0,0,2,2,2,0,0,0,0,1,3,1,2,0,0,0,0,1,0,3,2,0,1,0,3,0,1,0,0,1,0,1,3,0,1,1,2,1,3,1,2,3,1,1,0,1,0,1,1,0,2,1,1,2,1,2,0,0,2,2,2,1,1,2,0,0,0,2,2,1,0,2,1,1,0,2,3,1,2,1,1,4,1,1,0,2,0,1,1,2,1,0,1,2,0,1,0,0,1,0,1,0,0,0,2,0,1,0,0,1,2,1,2,1,2,1,3,1,2,0,0,0,3,3,0,2,1,2,2,0,1,1,3,2,2,1,2,1,0,3,1,2,4,0,1,3,5,2,0,2,4,1,0,0,1,2,2,0,1,2,1,1,3,0,1,2,1,1,2,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,4,0,0,0,0,1,0,2,0,0,0,1,1,1,2,3,0,1,1,1,3,0,1,2,1,0,0,0,1,0,1,2,0,0,1,0,0,1,1,1,1,1,0,1,0,0,2,1,0,0,0,2,1,3,0,1,0,0,2,2,0,1,1,0,1,1,3,2,1,1,0,0,3,0,0,1,0,0,0,2,0,0,1,0,2,1,4,2,2,0,1,0,0,1,1,1,1,1,1,0,1,0,1,2,0,0,0,1,1,1,2,2,2,1,1,3,0,0,0,0,1,3,1,0,0,0,1,1,0,2,1,0,2,1,1,1,0,0,0,4,0,4,1,1,1,1,0,1,1,1,1,3,2,1,3,0,3,1,3,0,1,0,1,0,1,2,0,2,0,0,1,0,0,0,0,1,5,1,0,2,2,0,0,2,0,2,1,1,2,2,2,0,3,1,1,2,2,1,2,0,1,0,1,0,0,1,0,1,2,1,1,0,1,1,0,2,2,0,0,1,1,1,0,1,1,0,1,1,2,3,1,1,0,2,0,0,3,1,1,0,2,1,0,0,2,1,0,2,0,2,4,1,1,2,1,3,0,0,3,1,0,3,0,0,0,0,1,1,1,1,0,0,1,1,2,1,1,2,2,1,1,5,0,1,2,0,2,2,0,1,1,1,0,2,0,2,0,1,1,2,0,1,1,0,0,1,1,2,2,1,3,2,2,1,1,1,0,1,1,2,2,0,2,3,0,3,0,2,1,1,1,1,1,0,0,3,2,0,1,1,1,1,1,1,2,1,1,2,1,1,1,3,1,1,1,1,1,2,1,0,1,0,1,1,1,0,1,2,2,0,3,4,1,1,0,2,2,0,0,1,1,0,1,1,2,2,0,3,0,0,1,2,0,1,0,0,1,0,1,2,2,0,0,1,1,0,1,1,1,0,0,2,0,1,1,1,1,1,3,3,0,0,1,1,2,5,1,1,1,0,1,0,0,0,1,1,1,2,0,2,1,1,2,0,0,1,1,0,2,1,1,0,2,1,1,2,0,0,1,1,1,1,1,2,0,2,0,4,1,2,4,0,1,0,4,1,0,3,2,0,0,2,1,4,1,0,0,0,0,2,0,2,0,1,1,1,0,0,2,0,1,0,0,1,0,1,2,0,1,0,3,1,2,0,4,2,1,2,1,0,1,1,1,0,2,1,3,1,0,0,0,1,0,0,0,1,0,0,0,0,1,2,0,2,2,1,1,2,0,1,1,2,0,2,0,0,0,0,0,0,0,2,1,1,2,0,1,0,0,1,2,0,2,3,1,1,1,2,0,0,1,0,0,0,0,2,1,3,4,1,2,1,1,3,1,1,0,2,0,0,0,1,1,0,1,1,0,1,0,1,3,0,0,1,0,0,2,1,2,0,1,0,1,2,3,1,0,0,3,0,0,0,4,0,2,0,2,2,0,1,1,0,0,0,1,0,2,0,3,1,1,3,4,2,1,0,1,1,2,0,1,2,1,2,0,0,0,1,0,2,0,0,0,2,2,1,1,0,0,0,0,0,3,1,1,0,0,0,2,0,1,0,0,0,3,0,0,0,1,0,1,1,0,1,1,0,1,1,0,2,2,2,2,1,3,2,3,3,0,2,1,1,0,0,0,0,1,2,2,2,2,2,2,1,1,1,0,1,0,0,0,1,2,0,2,1,0,0,0,0,0,0,1,1,1,1,1,2,2,0,0,1,1,1,0,1,0,0,2,1,3,0,2,2,2,1,0,0,1,2,0,1,1,0]}]},"null_count":0,"last_update_version":397952048920264704},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDE0NDAwODI=","upper_bound":"LTIxMjg3MjE1NjA=","repeats":1},{"count":16,"lower_bound":"LTIxMjg1NzA0MDM=","upper_bound":"LTIxMjIwMjc2NDk=","repeats":1},{"count":24,"lower_bound":"LTIxMjA0MDEwNDU=","upper_bound":"LTIxMDI2MTIzMTE=","repeats":1},{"count":32,"lower_bound":"LTIxMDA0NTgwMjk=","upper_bound":"LTIwODg2NDE1MjQ=","repeats":1},{"count":40,"lower_bound":"LTIwODM4Nzg1MzE=","upper_bound":"LTIwNjY3MjQ3Njk=","repeats":1},{"count":48,"lower_bound":"LTIwNTgyMjU4Mzg=","upper_bound":"LTIwNDIzMzI5MzQ=","repeats":1},{"count":56,"lower_bound":"LTIwNDA3MjY2MTc=","upper_bound":"LTIwMDkzMTMyOTI=","repeats":1},{"count":64,"lower_bound":"LTIwMDU4NjA5Nzc=","upper_bound":"LTE5OTc3MTY3MTM=","repeats":1},{"count":72,"lower_bound":"LTE5OTE3MzYxNjI=","upper_bound":"LTE5ODAwNTk0MjM=","repeats":1},{"count":80,"lower_bound":"LTE5Nzg0ODIzMzM=","upper_bound":"LTE5NTkzNzU1Mzk=","repeats":1},{"count":88,"lower_bound":"LTE5NTI0MTE5NDM=","upper_bound":"LTE5MTcwNDU4Njg=","repeats":1},{"count":96,"lower_bound":"LTE5MTQ0NjU3NTg=","upper_bound":"LTE5MDc2NjI2MDA=","repeats":1},{"count":104,"lower_bound":"LTE5MDQxNDcxMjE=","upper_bound":"LTE4OTYzNTk2NjE=","repeats":1},{"count":112,"lower_bound":"LTE4OTM2ODE0NjQ=","upper_bound":"LTE4ODEwMjI0NDc=","repeats":1},{"count":120,"lower_bound":"LTE4NzczMDM0MjA=","upper_bound":"LTE4NzI3NDE2ODk=","repeats":1},{"count":128,"lower_bound":"LTE4Njk4MTEzNDQ=","upper_bound":"LTE4NTg0ODIyNzc=","repeats":1},{"count":136,"lower_bound":"LTE4NDk4NDEwMjQ=","upper_bound":"LTE4NDEwNDk4MjI=","repeats":1},{"count":144,"lower_bound":"LTE4MzgyNjY5Njg=","upper_bound":"LTE4MjY0MTY3NDI=","repeats":1},{"count":152,"lower_bound":"LTE4MjAzNzU4MTE=","upper_bound":"LTE4MDY2NjUwMzE=","repeats":1},{"count":160,"lower_bound":"LTE4MDY0NzM2ODQ=","upper_bound":"LTE3ODk3NDA3OTk=","repeats":1},{"count":168,"lower_bound":"LTE3ODM0NjI3MzA=","upper_bound":"LTE3NzgyOTI2NTI=","repeats":1},{"count":176,"lower_bound":"LTE3NjM2ODI1NjI=","upper_bound":"LTE3NDc1NDM4Mjc=","repeats":1},{"count":184,"lower_bound":"LTE3NDM4NjYxODY=","upper_bound":"LTE3MzY2MTQxMjM=","repeats":1},{"count":192,"lower_bound":"LTE3MzY1MDQyNDA=","upper_bound":"LTE3MTIzMjE1ODc=","repeats":1},{"count":200,"lower_bound":"LTE3MDU5MTE0Nzg=","upper_bound":"LTE2ODY3MDg3Mjk=","repeats":1},{"count":208,"lower_bound":"LTE2ODU3MTMxNjI=","upper_bound":"LTE2ODM2NTg4NjY=","repeats":1},{"count":216,"lower_bound":"LTE2ODExODc5NjU=","upper_bound":"LTE2Njc5NDc4NzY=","repeats":1},{"count":224,"lower_bound":"LTE2NjcyOTc5NTg=","upper_bound":"LTE2NTM1ODkzNDU=","repeats":1},{"count":232,"lower_bound":"LTE2NTI3MTc2MzE=","upper_bound":"LTE2NDM1MDQ1MDk=","repeats":1},{"count":240,"lower_bound":"LTE2NDE2NzY5ODM=","upper_bound":"LTE2MjMzNTczOTU=","repeats":1},{"count":248,"lower_bound":"LTE2MjAxODY2MzE=","upper_bound":"LTE2MTIyMDk2NzM=","repeats":1},{"count":256,"lower_bound":"LTE2MTIwMzExOTY=","upper_bound":"LTE2MDU1MzgxODA=","repeats":1},{"count":264,"lower_bound":"LTE2MDMxMDgyNjE=","upper_bound":"LTE1OTQxMjc5MjQ=","repeats":1},{"count":272,"lower_bound":"LTE1OTI3MDc5MTI=","upper_bound":"LTE1OTAyMjczNzQ=","repeats":1},{"count":280,"lower_bound":"LTE1ODQ2MTkxODQ=","upper_bound":"LTE1ODE5MjQxNjE=","repeats":1},{"count":288,"lower_bound":"LTE1ODEyMTc3MDE=","upper_bound":"LTE1NzIyOTQyNjQ=","repeats":1},{"count":296,"lower_bound":"LTE1NjM3Njc1NjM=","upper_bound":"LTE1NTg2OTcwMTE=","repeats":1},{"count":304,"lower_bound":"LTE1NTY1NDkzNTQ=","upper_bound":"LTE1NDM4OTQyNDU=","repeats":1},{"count":312,"lower_bound":"LTE1MzUwMjEwMjQ=","upper_bound":"LTE1MDQwNTA5NzY=","repeats":1},{"count":320,"lower_bound":"LTE0ODY4MjUxNDc=","upper_bound":"LTE0NzU2NDU1OTU=","repeats":1},{"count":328,"lower_bound":"LTE0NzQ4MDkzNjM=","upper_bound":"LTE0NTkzNzk0NzY=","repeats":1},{"count":336,"lower_bound":"LTE0NTczNTYxODc=","upper_bound":"LTE0MzE3NTczODI=","repeats":1},{"count":344,"lower_bound":"LTE0MjM2MjE1NzM=","upper_bound":"LTE0MTc4MTIxMzc=","repeats":1},{"count":352,"lower_bound":"LTE0MTAzMDQwMTY=","upper_bound":"LTEzOTcyMzI2OTA=","repeats":1},{"count":360,"lower_bound":"LTEzOTY3ODIzMDY=","upper_bound":"LTEzODY0ODgzMzY=","repeats":1},{"count":368,"lower_bound":"LTEzNzk1NjA3NDg=","upper_bound":"LTEzNTM2MTY0MzI=","repeats":1},{"count":376,"lower_bound":"LTEzNDc1OTY0OTk=","upper_bound":"LTEzMjg3ODE1NDM=","repeats":1},{"count":384,"lower_bound":"LTEzMjY4OTg0MDA=","upper_bound":"LTEzMDI1MzAwNTE=","repeats":1},{"count":392,"lower_bound":"LTEyODM5OTg3MzM=","upper_bound":"LTEyNzc0MDIzNDA=","repeats":1},{"count":400,"lower_bound":"LTEyNjMwNjExODg=","upper_bound":"LTEyNDQ0MzI1NDQ=","repeats":1},{"count":408,"lower_bound":"LTEyNDQxNzAwNjY=","upper_bound":"LTEyMjg5NjY1NzU=","repeats":1},{"count":416,"lower_bound":"LTEyMTY4MjE1MzM=","upper_bound":"LTEyMDg1ODgxNzI=","repeats":1},{"count":424,"lower_bound":"LTExOTk0OTYwODQ=","upper_bound":"LTExODQ3NTkxMzk=","repeats":1},{"count":432,"lower_bound":"LTExNzQ4NTU5MzM=","upper_bound":"LTExNjM2NDAzNzc=","repeats":1},{"count":440,"lower_bound":"LTExNjMwNjg4MzM=","upper_bound":"LTExNTY2MDA2NjM=","repeats":1},{"count":448,"lower_bound":"LTExNTY1Mjc3OTI=","upper_bound":"LTExMzE3MzI3NTc=","repeats":1},{"count":456,"lower_bound":"LTExMTg4NzUyOTk=","upper_bound":"LTExMDg3MTkwNTg=","repeats":1},{"count":464,"lower_bound":"LTExMDM2MjU1NDU=","upper_bound":"LTEwOTk4NDA2MDY=","repeats":1},{"count":472,"lower_bound":"LTEwODk2ODM0MTk=","upper_bound":"LTEwODc5NjA1MzE=","repeats":1},{"count":480,"lower_bound":"LTEwODYzMzQ3MzM=","upper_bound":"LTEwODI0MjQ0NTg=","repeats":1},{"count":488,"lower_bound":"LTEwNzMzMjg1MTA=","upper_bound":"LTEwNTE5OTI1MTA=","repeats":1},{"count":496,"lower_bound":"LTEwNDg0NjIxMTk=","upper_bound":"LTEwMzk2NTEyNjQ=","repeats":1},{"count":504,"lower_bound":"LTEwMzY1MzAwNjM=","upper_bound":"LTEwMjMwMTQxODE=","repeats":1},{"count":512,"lower_bound":"LTEwMjA3MjA0MjU=","upper_bound":"LTEwMTM3MTg5ODU=","repeats":1},{"count":520,"lower_bound":"LTEwMTMxNzg1MjA=","upper_bound":"LTEwMDM2MDIxMTU=","repeats":1},{"count":528,"lower_bound":"LTEwMDA4NDc3MDg=","upper_bound":"LTk5NTI1MzM3Ng==","repeats":1},{"count":536,"lower_bound":"LTk4NTk0ODQxMA==","upper_bound":"LTk4MTAzMTQwNA==","repeats":1},{"count":544,"lower_bound":"LTk3OTA4NjgxMQ==","upper_bound":"LTk3NDQzNjg0Ng==","repeats":1},{"count":552,"lower_bound":"LTk3MTc3MDQzMQ==","upper_bound":"LTk3MDU4NDU1MA==","repeats":1},{"count":560,"lower_bound":"LTk2ODQ3MjM1OA==","upper_bound":"LTk1Nzk1MTU4NQ==","repeats":1},{"count":568,"lower_bound":"LTk0Mjk0ODQ0NA==","upper_bound":"LTkyNzQyNjUwOQ==","repeats":1},{"count":576,"lower_bound":"LTkyNTc5Mzg2OA==","upper_bound":"LTkxNTM2Mjc2Mw==","repeats":1},{"count":584,"lower_bound":"LTkwODI1NTMzOA==","upper_bound":"LTg4MzcwMDA4Ng==","repeats":1},{"count":592,"lower_bound":"LTg3OTUzMDMyMQ==","upper_bound":"LTg2MDM2NzgzMg==","repeats":1},{"count":600,"lower_bound":"LTg1NzAzMzQ5OA==","upper_bound":"LTg0Mzk3ODgxNg==","repeats":1},{"count":608,"lower_bound":"LTg0MzU0NzU4OQ==","upper_bound":"LTgyNTI4ODgzMA==","repeats":1},{"count":616,"lower_bound":"LTgyMzM1MDE1Nw==","upper_bound":"LTgwMTEyODE2NQ==","repeats":1},{"count":624,"lower_bound":"LTc5MTE5MTQ1MQ==","upper_bound":"LTc4MTA0NTQxMQ==","repeats":1},{"count":632,"lower_bound":"LTc4MTAzNjE4Ng==","upper_bound":"LTc0NDEzMjA2Mg==","repeats":1},{"count":640,"lower_bound":"LTc0MzUxMzg4Mg==","upper_bound":"LTczMDA3NzE4Ng==","repeats":1},{"count":648,"lower_bound":"LTcyNjMyODIxOA==","upper_bound":"LTY4MzcyNjYzMQ==","repeats":1},{"count":656,"lower_bound":"LTY3OTk2ODY5NA==","upper_bound":"LTY2Mjg4MTk2Mw==","repeats":1},{"count":664,"lower_bound":"LTY1OTAwOTA1OQ==","upper_bound":"LTY0OTc4MDU4Mg==","repeats":1},{"count":672,"lower_bound":"LTY0NjI0NjcwMg==","upper_bound":"LTYyMDU5NzIxMw==","repeats":1},{"count":680,"lower_bound":"LTYxODI5MDI2OA==","upper_bound":"LTYxMDUxNDgwMQ==","repeats":1},{"count":688,"lower_bound":"LTYwODY2Njg5NA==","upper_bound":"LTU5ODI2MTI5MA==","repeats":1},{"count":696,"lower_bound":"LTU5NDg5NDg4Mw==","upper_bound":"LTU4NTcwMTk5Nw==","repeats":1},{"count":704,"lower_bound":"LTU3OTY4OTcxNQ==","upper_bound":"LTU3NTYzMDM4NQ==","repeats":1},{"count":712,"lower_bound":"LTU3NTYxMzQwNA==","upper_bound":"LTU3NTIxNDQ0NA==","repeats":1},{"count":720,"lower_bound":"LTU3NDIyMzIzOQ==","upper_bound":"LTU1ODY3OTcxNQ==","repeats":1},{"count":728,"lower_bound":"LTU1MTI2MzczMw==","upper_bound":"LTU0NjU5Nzg1MQ==","repeats":1},{"count":736,"lower_bound":"LTU0NDA1Mjc5MA==","upper_bound":"LTUzNzk5NzcwOA==","repeats":1},{"count":744,"lower_bound":"LTUzMjQxMDU4Mg==","upper_bound":"LTQ5MTM3MDU4MQ==","repeats":1},{"count":752,"lower_bound":"LTQ5MTI2NDg0Mw==","upper_bound":"LTQ4MDc0OTQwMw==","repeats":1},{"count":760,"lower_bound":"LTQ3ODM4MTk0Mw==","upper_bound":"LTQ2Mzc0Mzk0Mw==","repeats":1},{"count":768,"lower_bound":"LTQ1NzkxMzAyNA==","upper_bound":"LTQ1MjEwODkzMQ==","repeats":1},{"count":776,"lower_bound":"LTQ0NjEwNzA2NA==","upper_bound":"LTQzNjI4Mjc4Nw==","repeats":1},{"count":784,"lower_bound":"LTQzMjA5MDkwMA==","upper_bound":"LTQyNTQ4NjUxNw==","repeats":1},{"count":792,"lower_bound":"LTQyNDY5NTg4Mw==","upper_bound":"LTQwNjkzNDU3Nw==","repeats":1},{"count":800,"lower_bound":"LTQwNTI1ODI1NQ==","upper_bound":"LTM5NzEwNjY5NQ==","repeats":1},{"count":808,"lower_bound":"LTM5NTQ0MjE5MQ==","upper_bound":"LTM4MDU4ODAzNw==","repeats":1},{"count":816,"lower_bound":"LTM3NjM1MTE0Mw==","upper_bound":"LTM1OTc5MTA2Mg==","repeats":1},{"count":824,"lower_bound":"LTM1NzA4Nzc0NQ==","upper_bound":"LTM0ODg3MjQ2Ng==","repeats":1},{"count":832,"lower_bound":"LTMzOTMzNjI0Ng==","upper_bound":"LTMyMDM5NjY0NQ==","repeats":1},{"count":840,"lower_bound":"LTMxODk2NDQ5OQ==","upper_bound":"LTMwMzI4NDcyNw==","repeats":1},{"count":848,"lower_bound":"LTMwMjY4OTI0Ng==","upper_bound":"LTI5NjAwMjkzNQ==","repeats":1},{"count":856,"lower_bound":"LTI5NDE2OTU1Mw==","upper_bound":"LTI5MDgyOTU0OA==","repeats":1},{"count":864,"lower_bound":"LTI5MDI0MTI4OQ==","upper_bound":"LTI3ODEwNjA1OQ==","repeats":1},{"count":872,"lower_bound":"LTI3MzE0NzYxOA==","upper_bound":"LTI2MTY4NDg3Mg==","repeats":1},{"count":880,"lower_bound":"LTI1MzczMjU4OQ==","upper_bound":"LTI0NzU3MTcwNQ==","repeats":1},{"count":888,"lower_bound":"LTI0NDUxNDQyNQ==","upper_bound":"LTIwNzE3Njg2MA==","repeats":1},{"count":896,"lower_bound":"LTIwMzc0MDk0NQ==","upper_bound":"LTE3ODUyODg5OQ==","repeats":1},{"count":904,"lower_bound":"LTE2ODk0NTk1Ng==","upper_bound":"LTE1NjE0OTY0Mg==","repeats":1},{"count":912,"lower_bound":"LTE1NDE1MDcwNw==","upper_bound":"LTE0MDIyNjU0Mg==","repeats":1},{"count":920,"lower_bound":"LTEzNjc3MTE3OA==","upper_bound":"LTEyOTI2NDcwMw==","repeats":1},{"count":928,"lower_bound":"LTEyNjgwNTcxNQ==","upper_bound":"LTExNDM3NzA4OA==","repeats":1},{"count":936,"lower_bound":"LTExNDMyNzIyNA==","upper_bound":"LTEwNzE2NzQ3MA==","repeats":1},{"count":944,"lower_bound":"LTEwNTUwNzgzNg==","upper_bound":"LTk3MjgzODU2","repeats":1},{"count":952,"lower_bound":"LTkzMjkxOTY4","upper_bound":"LTc4NjQ2MzIz","repeats":1},{"count":960,"lower_bound":"LTc1MjAwNTI2","upper_bound":"LTU5MzU4OTQx","repeats":1},{"count":968,"lower_bound":"LTU5MTM5MTI4","upper_bound":"LTQ0NzEzNTYw","repeats":1},{"count":976,"lower_bound":"LTQzMTMxNjA1","upper_bound":"LTM2OTMxNTI5","repeats":1},{"count":984,"lower_bound":"LTM1MzQ5Mzg1","upper_bound":"LTU5MTMxNzc=","repeats":1},{"count":992,"lower_bound":"LTEyMDU2NzI=","upper_bound":"MTI1NDE0Njc=","repeats":1},{"count":1000,"lower_bound":"MTQwNTI2NjM=","upper_bound":"MzA2Njg4OTg=","repeats":1},{"count":1008,"lower_bound":"MzA3Njk2MzI=","upper_bound":"NDU4NTI2ODg=","repeats":1},{"count":1016,"lower_bound":"NDgwNjY3MDE=","upper_bound":"NTMwMzMzNjc=","repeats":1},{"count":1024,"lower_bound":"NTQyMzA5MDU=","upper_bound":"Njc2OTgxODY=","repeats":1},{"count":1032,"lower_bound":"Njg0MTg3NjQ=","upper_bound":"ODE1MjA5MzQ=","repeats":1},{"count":1040,"lower_bound":"ODgzNDkxMzU=","upper_bound":"MTAwNjQ1NzQy","repeats":1},{"count":1048,"lower_bound":"MTE4MTgzMDYy","upper_bound":"MTI1NzU1NTE0","repeats":1},{"count":1056,"lower_bound":"MTQzNjMwMjg1","upper_bound":"MTU2NDU0OTQx","repeats":1},{"count":1064,"lower_bound":"MTU3MDIyNjMw","upper_bound":"MTcyMjYwMjQz","repeats":1},{"count":1072,"lower_bound":"MTc4MTIwNTA2","upper_bound":"MTg2NDc0OTE1","repeats":1},{"count":1080,"lower_bound":"MTg3NjY0MTg2","upper_bound":"MjAwODk4MDIx","repeats":1},{"count":1088,"lower_bound":"MjAyNzIwMDM1","upper_bound":"MjA4NzY2MTk4","repeats":1},{"count":1096,"lower_bound":"MjA5MDA5MDE3","upper_bound":"MjMxNTc2NDIx","repeats":1},{"count":1104,"lower_bound":"MjMzOTg1NjEw","upper_bound":"MjY1NDE2ODM1","repeats":1},{"count":1112,"lower_bound":"MjY2MjkwMzQy","upper_bound":"MzA3NjEzMzE4","repeats":1},{"count":1120,"lower_bound":"MzE1Mjc0NDE2","upper_bound":"MzI5ODkwNTM1","repeats":1},{"count":1128,"lower_bound":"MzM1MzIxNDI0","upper_bound":"MzQ2NTc5OTgw","repeats":1},{"count":1136,"lower_bound":"MzQ3MDM2MDI2","upper_bound":"MzU0NTg2NDk2","repeats":1},{"count":1144,"lower_bound":"MzYwMjQ5MzYw","upper_bound":"MzY1MjA5MDg4","repeats":1},{"count":1152,"lower_bound":"Mzc3MTc1Njgw","upper_bound":"MzgzMjk3Mjkx","repeats":1},{"count":1160,"lower_bound":"MzgzNDM4OTAy","upper_bound":"Mzk2NDk5NDc4","repeats":1},{"count":1168,"lower_bound":"Mzk3MTQxNDI0","upper_bound":"NDExMzExMTE1","repeats":1},{"count":1176,"lower_bound":"NDExMzE3OTc0","upper_bound":"NDE2NDYxNDg1","repeats":1},{"count":1184,"lower_bound":"NDE2NTk3MTg1","upper_bound":"NDIwODA4OTM5","repeats":1},{"count":1192,"lower_bound":"NDIyMTc4OTY3","upper_bound":"NDM5NDQ5NjAx","repeats":1},{"count":1200,"lower_bound":"NDQxMzM5ODU1","upper_bound":"NDUzMzU0MzI5","repeats":1},{"count":1208,"lower_bound":"NDU2NDc1ODk0","upper_bound":"NDY1MjM4NTY5","repeats":1},{"count":1216,"lower_bound":"NDY4MjcyNjU2","upper_bound":"NDg4MTMyMjIy","repeats":1},{"count":1224,"lower_bound":"NTAzNTgwMjkz","upper_bound":"NTA2OTQ0ODE3","repeats":1},{"count":1232,"lower_bound":"NTA3MjQzNzUw","upper_bound":"NTE1Nzk0NzU1","repeats":1},{"count":1240,"lower_bound":"NTIyNDY0NzU1","upper_bound":"NTI1NDA2NDQ3","repeats":1},{"count":1248,"lower_bound":"NTI4NTEyNjUz","upper_bound":"NTQ5MzA3NTI0","repeats":1},{"count":1256,"lower_bound":"NTUwNjY0NTE0","upper_bound":"NTcwMzY4MzU5","repeats":1},{"count":1264,"lower_bound":"NTcyOTQ1NDI5","upper_bound":"NTgyMDQxNTcx","repeats":1},{"count":1272,"lower_bound":"NTgyNjAwNDI3","upper_bound":"NTkwMTY0MTAw","repeats":1},{"count":1280,"lower_bound":"NTk3MzUxODQw","upper_bound":"NjAxODg2NDE0","repeats":1},{"count":1288,"lower_bound":"NjA2NzAxNjA1","upper_bound":"NjI0NjY3Njkx","repeats":1},{"count":1296,"lower_bound":"NjI3NDY1MDI1","upper_bound":"NjQ4MDM1ODI0","repeats":1},{"count":1304,"lower_bound":"NjUwNzM5OTAw","upper_bound":"NjU5NTUzMzky","repeats":1},{"count":1312,"lower_bound":"Njc1MDk5NTAw","upper_bound":"Njg4Nzk4NjAy","repeats":1},{"count":1320,"lower_bound":"NjkxMTA5ODg3","upper_bound":"Njk5MjQyNTc5","repeats":1},{"count":1328,"lower_bound":"NzA1NzMxMTQw","upper_bound":"NzEyNzY3NDI5","repeats":1},{"count":1336,"lower_bound":"NzE3MDQ2MTIx","upper_bound":"NzIyNDA1NTk5","repeats":1},{"count":1344,"lower_bound":"NzIyNTA5NTc2","upper_bound":"NzI5MTg0Mzc2","repeats":1},{"count":1352,"lower_bound":"NzI5NjA3MTQw","upper_bound":"NzM5NzM3ODE1","repeats":1},{"count":1360,"lower_bound":"NzQwNDA2NzE3","upper_bound":"NzYzMTg2OTYw","repeats":1},{"count":1368,"lower_bound":"NzY1ODQwNDU1","upper_bound":"NzgzMTk1MDIw","repeats":1},{"count":1376,"lower_bound":"Nzg1OTc2NTU1","upper_bound":"Nzk3MTAzOTk3","repeats":1},{"count":1384,"lower_bound":"ODA0ODU4ODY3","upper_bound":"ODE4MTU5OTEz","repeats":1},{"count":1392,"lower_bound":"ODI2NTk4MDUw","upper_bound":"ODUwNjI3NDk4","repeats":1},{"count":1400,"lower_bound":"ODUwNjYzOTAw","upper_bound":"ODU4OTU5ODcw","repeats":1},{"count":1408,"lower_bound":"ODYxMTQ3OTgy","upper_bound":"ODc2MTUwNjkz","repeats":1},{"count":1416,"lower_bound":"ODc2Nzg2Nzk2","upper_bound":"ODgzNTIwNTUy","repeats":1},{"count":1424,"lower_bound":"ODg2NTMyMzg2","upper_bound":"ODk3NjA2NTY2","repeats":1},{"count":1432,"lower_bound":"OTEyNzcxMDM3","upper_bound":"OTE1NTQ1MjA4","repeats":1},{"count":1440,"lower_bound":"OTE5NDYyNjQ4","upper_bound":"OTMwMjQ1NjA3","repeats":1},{"count":1448,"lower_bound":"OTMyNDA5ODMw","upper_bound":"OTM5NDE4NjU2","repeats":1},{"count":1456,"lower_bound":"OTQyODc1NTc5","upper_bound":"OTU4OTU4MjM2","repeats":1},{"count":1464,"lower_bound":"OTYxMTAzMjU3","upper_bound":"OTgyNjgxMzA3","repeats":1},{"count":1472,"lower_bound":"OTg1MDQ3NDA5","upper_bound":"OTkwNzAyNjE0","repeats":1},{"count":1480,"lower_bound":"OTkwNzQ1MTYy","upper_bound":"MTAxNDU2NTU1Mg==","repeats":1},{"count":1488,"lower_bound":"MTAxNDk2MDk3Ng==","upper_bound":"MTAyOTAzNDc0OA==","repeats":1},{"count":1496,"lower_bound":"MTAzMDcwNzk2OA==","upper_bound":"MTA0MTU0NjA1Mg==","repeats":1},{"count":1504,"lower_bound":"MTA0MTU5OTc3MA==","upper_bound":"MTA1NjgxMjUzMg==","repeats":1},{"count":1512,"lower_bound":"MTA2MjA3OTQ4NQ==","upper_bound":"MTA2ODA2ODM2OQ==","repeats":1},{"count":1520,"lower_bound":"MTA2ODY0Mzg3NA==","upper_bound":"MTA4NjY0NDgyNQ==","repeats":1},{"count":1528,"lower_bound":"MTA5Mjk1OTE0NQ==","upper_bound":"MTEwOTk2MzgwMA==","repeats":1},{"count":1536,"lower_bound":"MTExMTA3NDIwNQ==","upper_bound":"MTEyMTg3MTY2Mg==","repeats":1},{"count":1544,"lower_bound":"MTEyNTA0OTcxNA==","upper_bound":"MTEzNDM2MTY1OQ==","repeats":1},{"count":1552,"lower_bound":"MTE0MDY4MjcwMg==","upper_bound":"MTE0Mzg3MzQxOA==","repeats":1},{"count":1560,"lower_bound":"MTE0NDU3NzYxMg==","upper_bound":"MTE3MzA4MDA3Ng==","repeats":1},{"count":1568,"lower_bound":"MTE3MzI1NTU5Mg==","upper_bound":"MTE4NTgxMjg2Ng==","repeats":1},{"count":1576,"lower_bound":"MTE5NzI2NDUzNQ==","upper_bound":"MTIxNDkyMDU5MQ==","repeats":1},{"count":1584,"lower_bound":"MTIxODMzMTIzMQ==","upper_bound":"MTIyOTcwMTkyMA==","repeats":1},{"count":1592,"lower_bound":"MTIzMDcyNTE4Nw==","upper_bound":"MTI1MjAxOTY5Mw==","repeats":1},{"count":1600,"lower_bound":"MTI1MjcwOTk2NQ==","upper_bound":"MTI2MTgyNDg3MQ==","repeats":1},{"count":1608,"lower_bound":"MTI2MzQ3OTU0Mw==","upper_bound":"MTI4MDA0MTUxNA==","repeats":1},{"count":1616,"lower_bound":"MTI4NTA3NjIyMQ==","upper_bound":"MTI5NjM2MDAxMw==","repeats":1},{"count":1624,"lower_bound":"MTI5NjY3OTcyMw==","upper_bound":"MTMwNjQ1MTU0NA==","repeats":1},{"count":1632,"lower_bound":"MTMwNzcxNjEyMg==","upper_bound":"MTMyMzc4ODYxNg==","repeats":1},{"count":1640,"lower_bound":"MTMyNDU3ODA1NA==","upper_bound":"MTMzNDY0NzE1MQ==","repeats":1},{"count":1648,"lower_bound":"MTM0NDU0NjAzNA==","upper_bound":"MTM1OTIxNDgzMQ==","repeats":1},{"count":1656,"lower_bound":"MTM2MjczOTE2NQ==","upper_bound":"MTM3NDQ0MDcyOA==","repeats":1},{"count":1664,"lower_bound":"MTM3NTcxMDM3MA==","upper_bound":"MTM3NzYxMDQ0Ng==","repeats":1},{"count":1672,"lower_bound":"MTM3Nzc0NjczMA==","upper_bound":"MTM4MTE1MDg5Ng==","repeats":1},{"count":1680,"lower_bound":"MTM4MzgwNTc3NA==","upper_bound":"MTQxMDQ0MjI0OA==","repeats":1},{"count":1688,"lower_bound":"MTQxMTYyMzgxNA==","upper_bound":"MTQyNjY4NTczOA==","repeats":1},{"count":1696,"lower_bound":"MTQyNzYxODk0Mw==","upper_bound":"MTQ0MDk4MTM0Mg==","repeats":1},{"count":1704,"lower_bound":"MTQ0MzA1NDM5OA==","upper_bound":"MTQ1MDY0Mjg4Nw==","repeats":1},{"count":1712,"lower_bound":"MTQ1MTQ3NjQwOQ==","upper_bound":"MTQ2NTI4NzI4NQ==","repeats":1},{"count":1720,"lower_bound":"MTQ3MTI0Mjk4Mw==","upper_bound":"MTQ5MDM0OTUyOA==","repeats":1},{"count":1728,"lower_bound":"MTQ5NjUyOTcxMg==","upper_bound":"MTUyOTQ1NTAzMw==","repeats":1},{"count":1736,"lower_bound":"MTUyOTU3ODc0Mw==","upper_bound":"MTU0MTAwMjU2OA==","repeats":1},{"count":1744,"lower_bound":"MTU0NTc3MzQ0MA==","upper_bound":"MTU3NzI2Nzk1MA==","repeats":1},{"count":1752,"lower_bound":"MTU4ODUwMTA1NA==","upper_bound":"MTU5NjcwNTcxOQ==","repeats":1},{"count":1760,"lower_bound":"MTYwMDQ3NTE4Nw==","upper_bound":"MTYxODg5NjQ5OQ==","repeats":1},{"count":1768,"lower_bound":"MTYyMDgyMjQyNA==","upper_bound":"MTYyMzI4MTgyMg==","repeats":1},{"count":1776,"lower_bound":"MTYzMDkyNDU0Mg==","upper_bound":"MTY1NDI2ODg4Nw==","repeats":1},{"count":1784,"lower_bound":"MTY3MTYyMTU4Ng==","upper_bound":"MTY5MTEwMTk1NA==","repeats":1},{"count":1792,"lower_bound":"MTY5NTYxODI5NA==","upper_bound":"MTcwNTA4OTIzMw==","repeats":1},{"count":1800,"lower_bound":"MTcwNTczOTQ3MQ==","upper_bound":"MTczMzA1ODUzNw==","repeats":1},{"count":1808,"lower_bound":"MTczNDY3NzM1NQ==","upper_bound":"MTc0MDg0MjUyOA==","repeats":1},{"count":1816,"lower_bound":"MTc0MDg2NTI3Mg==","upper_bound":"MTc0NjQ2OTYyMg==","repeats":1},{"count":1824,"lower_bound":"MTc0ODc3MTYzOA==","upper_bound":"MTc1MjkyOTgxOQ==","repeats":1},{"count":1832,"lower_bound":"MTc1Njg0MzAxMA==","upper_bound":"MTc3MDExNzk0OQ==","repeats":1},{"count":1840,"lower_bound":"MTc3NzAyMzMyMg==","upper_bound":"MTc4NTM2Mjc1NQ==","repeats":1},{"count":1848,"lower_bound":"MTc5NDE0MzI5OQ==","upper_bound":"MTc5OTM0Njc2OQ==","repeats":1},{"count":1856,"lower_bound":"MTgwMTAzNzA2MA==","upper_bound":"MTgwMjk4NDQyMQ==","repeats":1},{"count":1864,"lower_bound":"MTgwOTEwODM5Nw==","upper_bound":"MTgyNjgwNzAyMA==","repeats":1},{"count":1872,"lower_bound":"MTgyODIwNDQ0Nw==","upper_bound":"MTg0NzExNzgwNw==","repeats":1},{"count":1880,"lower_bound":"MTg1ODM5ODIwOA==","upper_bound":"MTg2Nzg0MzMxOQ==","repeats":1},{"count":1888,"lower_bound":"MTg2OTIzMDE4Mg==","upper_bound":"MTg3NzA4MTUxMw==","repeats":1},{"count":1896,"lower_bound":"MTg3ODM2Mjk1Ng==","upper_bound":"MTg4MjQ0OTYzNA==","repeats":1},{"count":1904,"lower_bound":"MTg4MzExOTIwMw==","upper_bound":"MTkwMzE0ODczNQ==","repeats":1},{"count":1912,"lower_bound":"MTkwNjMyMjY2NQ==","upper_bound":"MTkyNjI2OTExOQ==","repeats":1},{"count":1920,"lower_bound":"MTkzNDcyNTEzMw==","upper_bound":"MTk1OTc4NjIzOA==","repeats":1},{"count":1928,"lower_bound":"MTk2NTQ5MTg3MA==","upper_bound":"MTk5MTQ0Nzk1Ng==","repeats":1},{"count":1936,"lower_bound":"MTk5MjkyODM5MA==","upper_bound":"MjAxMTQ2ODc1NQ==","repeats":1},{"count":1944,"lower_bound":"MjAyNzQ4NDI2MQ==","upper_bound":"MjAzODA3OTc2NA==","repeats":1},{"count":1952,"lower_bound":"MjA0MTEyNzU1Ng==","upper_bound":"MjA0NDA0MzMzMw==","repeats":1},{"count":1960,"lower_bound":"MjA0NjUyMTYxOA==","upper_bound":"MjA1ODI2OTc3NA==","repeats":1},{"count":1968,"lower_bound":"MjA2MDEyNDQwMQ==","upper_bound":"MjA2OTU4OTg0NQ==","repeats":1},{"count":1976,"lower_bound":"MjA3MDA3OTA2Mw==","upper_bound":"MjA3NjIyMTg4NA==","repeats":1},{"count":1984,"lower_bound":"MjA3ODM2MTI5Ng==","upper_bound":"MjA5ODc2OTkwMw==","repeats":1},{"count":1992,"lower_bound":"MjA5OTI5OTM1OA==","upper_bound":"MjEyMjI4MDA3NQ==","repeats":1},{"count":2000,"lower_bound":"MjEyNDc4MzQ4NQ==","upper_bound":"MjEzMTY3Njg0OA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,2,1,0,0,3,1,0,0,1,0,2,0,0,0,0,0,0,0,1,0,1,4,3,1,1,3,2,0,1,1,0,1,1,0,3,1,1,0,0,1,2,1,0,1,1,0,1,0,0,1,0,1,2,0,1,2,1,1,4,2,3,0,1,2,0,1,1,1,1,1,1,2,0,1,1,1,2,2,2,0,2,0,0,2,1,1,0,0,3,0,0,0,0,1,0,0,1,1,1,0,1,3,2,0,2,2,1,0,2,1,0,2,0,0,0,0,0,3,1,0,0,0,1,2,1,0,2,0,0,1,1,1,0,1,1,0,2,0,1,2,3,1,1,1,0,1,0,2,0,1,0,1,1,1,0,2,0,0,1,0,2,2,1,1,1,0,0,1,0,1,2,0,1,1,1,1,1,1,2,1,1,2,2,0,0,0,0,2,1,1,1,2,0,1,0,0,0,1,2,2,0,2,4,2,0,2,0,1,0,1,1,2,1,1,1,2,0,2,1,2,0,0,0,0,0,2,0,0,4,2,2,1,1,2,0,3,0,1,0,1,0,2,2,1,1,0,1,2,1,2,1,1,1,3,1,1,1,3,1,1,1,0,0,0,2,0,0,1,1,4,3,1,1,0,3,2,1,1,1,0,2,0,0,1,2,1,0,0,0,1,0,1,1,2,1,1,1,2,2,0,1,2,2,1,1,2,1,0,0,2,1,4,0,2,0,0,0,0,0,1,1,1,1,1,1,0,1,0,0,2,0,1,0,1,0,1,0,1,2,0,1,0,1,3,0,2,0,0,0,0,2,0,0,1,0,1,1,0,0,1,0,0,1,0,2,2,2,2,1,0,1,0,0,0,0,2,2,1,0,0,2,0,1,1,0,1,1,1,0,4,0,1,1,2,1,2,2,2,1,0,0,0,0,1,0,1,2,1,1,0,3,0,0,2,0,4,2,0,0,1,0,0,2,4,0,1,2,0,0,0,1,0,0,1,0,0,3,1,1,0,0,1,2,1,2,1,1,0,1,1,2,1,0,2,3,0,0,0,0,1,1,1,0,3,4,4,0,2,2,2,3,0,1,3,2,0,0,2,0,1,0,2,0,1,0,3,1,2,4,0,2,2,2,0,0,0,3,0,2,1,2,1,0,0,1,3,1,0,0,1,2,0,1,0,1,2,0,2,2,2,0,0,1,2,3,0,0,4,0,1,1,0,1,0,1,0,1,0,0,2,0,0,3,1,0,0,1,2,2,1,0,2,3,3,1,1,2,0,1,0,1,1,1,1,1,1,1,1,2,1,0,0,0,3,0,1,1,2,0,0,1,1,1,0,0,1,0,1,1,3,1,1,0,0,0,2,0,1,1,2,0,2,0,0,1,0,1,2,0,0,0,1,2,0,1,1,0,1,0,1,2,0,4,1,1,0,0,1,2,0,0,1,0,3,4,2,0,1,1,0,0,1,3,2,0,0,0,1,2,1,1,2,3,2,1,1,1,2,2,1,0,0,0,0,0,1,0,0,1,2,1,1,0,1,0,2,2,0,1,1,2,1,2,0,2,0,2,0,2,0,1,1,0,2,1,2,0,0,0,0,1,0,0,1,2,1,1,1,0,0,1,1,1,0,0,2,1,2,0,1,0,3,0,4,0,1,1,1,0,4,3,0,0,1,0,0,0,0,3,2,0,2,3,0,0,0,2,0,1,0,0,2,0,2,0,1,0,0,0,2,0,0,2,2,1,3,1,1,0,2,1,2,2,2,0,0,0,1,3,0,0,2,1,1,1,0,0,0,0,0,1,2,0,1,0,0,2,1,0,1,1,1,0,1,2,1,1,1,2,0,0,0,0,1,1,0,1,3,1,0,1,2,0,2,1,0,1,2,0,0,1,0,0,0,1,1,1,2,0,2,0,0,1,1,0,1,0,0,0,0,1,4,2,0,1,1,0,0,1,0,1,1,0,0,0,0,0,2,1,1,0,2,0,0,1,4,1,0,0,1,1,2,2,2,1,1,1,0,1,1,3,1,0,0,1,2,1,0,0,0,3,0,2,3,3,3,0,0,0,0,1,3,1,3,0,2,1,1,0,1,1,1,2,1,3,0,0,2,1,1,0,0,3,2,0,0,2,0,0,0,1,2,0,2,3,1,1,0,3,2,2,2,2,1,0,1,1,1,0,3,3,1,0,1,3,2,2,2,1,1,0,1,2,2,0,2,0,3,4,0,0,0,0,2,0,0,2,1,1,3,3,0,2,0,1,2,1,1,0,1,0,0,1,0,0,0,1,1,1,1,0,2,2,2,0,0,1,2,1,0,0,1,0,2,1,1,3,2,3,0,2,0,1,1,0,3,2,1,2,1,0,1,3,2,0,0,1,1,0,1,1,1,0,0,2,0,0,1,3,1,2,1,2,1,0,0,1,0,1,3,2,0,0,3,1,1,1,0,3,1,1,0,1,1,0,0,3,0,2,2,2,1,2,0,1,0,1,1,3,3,0,0,0,0,0,0,1,4,1,2,0,0,0,1,1,1,1,1,1,2,0,2,0,1,1,1,0,0,1,1,0,0,2,0,2,2,2,0,2,2,1,2,0,1,1,1,1,0,1,1,1,2,1,2,0,1,0,0,1,1,2,0,1,0,1,3,0,3,0,1,0,2,0,3,0,0,1,0,2,0,3,2,2,1,2,1,0,2,3,1,1,1,1,0,1,1,1,1,1,1,2,0,1,0,1,2,4,0,0,0,2,3,0,0,0,2,1,0,3,2,0,0,0,0,3,0,1,0,1,0,1,1,1,1,0,2,3,1,0,0,2,1,0,1,0,0,2,2,0,1,1,1,0,1,0,1,1,1,0,0,0,0,0,2,0,1,2,0,1,0,2,0,2,2,1,2,1,2,1,0,0,1,0,0,1,1,1,0,1,3,2,0,0,1,0,1,0,1,0,1,2,0,0,2,1,1,2,2,1,2,2,0,2,1,1,0,2,0,0,1,0,2,1,1,1,0,1,1,2,2,1,2,0,0,1,0,1,1,2,1,2,0,0,0,1,1,1,0,0,1,1,3,1,1,1,0,0,3,0,1,0,3,1,1,1,2,2,1,3,0,0,2,1,2,0,1,0,1,0,1,2,3,0,1,1,0,0,1,2,0,0,1,2,0,1,0,0,2,4,0,0,0,0,2,1,0,1,0,1,3,0,1,0,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,0,3,0,0,0,0,0,1,0,4,0,1,3,1,1,2,2,2,0,1,2,0,1,0,2,1,0,1,0,3,3,1,1,0,0,1,1,1,2,1,0,1,0,1,3,1,0,1,1,1,0,1,0,1,1,0,1,3,4,1,0,0,1,2,0,0,1,1,1,2,0,2,1,0,1,2,1,0,3,0,1,0,1,2,0,1,0,2,4,2,1,1,0,2,1,4,2,1,2,3,1,1,3,0,2,0,0,0,0,0,2,2,0,2,1,0,1,1,1,1,0,0,0,1,1,1,0,0,1,2,0,1,1,5,0,0,0,0,3,3,0,1,1,1,0,1,1,1,1,0,0,0,2,1,1,2,0,2,1,0,1,1,0,1,2,1,3,0,0,1,0,0,0,0,1,1,0,0,1,1,3,2,1,0,1,0,2,3,0,2,2,3,1,0,2,0,2,3,0,2,0,0,3,0,0,3,0,2,0,3,3,0,2,1,1,1,1,0,1,0,0,2,0,1,1,1,1,0,1,2,2,1,2,1,0,0,2,0,3,4,1,0,0,1,1,1,2,3,1,0,0,2,2,0,2,2,1,0,1,1,0,1,2,1,1,3,1,2,0,1,2,0,0,0,3,1,4,0,1,0,0,3,1,0,2,1,1,1,0,0,0,0,0,2,0,0,0,1,0,1,0,0,1,0,3,1,0,1,1,0,1,0,0,0,1,1,0,1,1,0,0,1,2,0,1,3,1,2,0,1,1,0,1,1,2,2,0,0,2,2,2,0,1,1,2,0,1,0,2,1,1,1,2,2,0,2,0,0,3,1,2,1,0,1,2,0,2,1,1,0,0,0,0,2,0,0,1,2,1,0,0,1,1,1,0,2,0,3,1,0,4,1,0,1,0,1,2,3,0,0,1,0,0,0,5,1,1,0,1,1,0,1,1,0,0,0,3,0,0,0,0,0,0,0,0,1,0,0,2,0,1,1,2,2,1,0,2,1,2,2,4,1,2,0,1,0,3,0,0,1,1,2,2,1,3,0,0,1,0,0,0,2,5,1,6,1,1,0,2,1,2,0,1,0,1,3,1,1,1,1,2,0,0,1,1,2,2,3,1,0,0,0,5,1,0,0,2,1,0,0,3,0,0,2,0,1,0,0,2,1,2,2,1,0,1,1,0,0,0,1,1,0,1,2,1,2,2,2,1,0,1,2,1,0,0,0,1,3,0,1,1,0,0,1,1,1,0,2,1,1,2,2,2,1,0,2,1,1,0,1,1,0,0,0,1,1,1,1,0,2,0,1,2,2,0,2,2,1,2,0,2,0,0,0,1,1,2,0,1,3,0,0,0,1,0,1,0,0,2,2,0,1,1,1,0,1,0,2,3,0,2,1,1,4,0,1]},{"counters":[3,0,0,2,3,0,0,0,0,2,1,0,1,3,1,1,2,0,0,0,2,1,2,2,2,0,2,0,2,0,1,2,0,1,0,1,0,0,2,0,0,0,1,1,2,1,4,2,2,0,0,2,0,0,1,2,1,1,2,2,0,0,1,1,0,3,0,2,2,4,1,0,1,2,1,0,3,2,2,2,0,3,0,3,1,2,1,1,2,0,1,1,1,1,1,1,1,1,0,1,0,0,0,0,0,1,2,1,1,0,1,0,3,1,1,0,0,0,1,1,0,1,3,1,1,1,1,1,1,0,0,2,1,2,0,0,1,3,2,2,0,3,2,0,0,1,1,1,0,3,1,2,3,0,0,3,0,2,4,0,1,2,2,0,0,3,2,1,0,0,0,0,1,2,1,0,1,0,0,1,1,1,2,5,0,1,0,1,1,0,0,0,2,1,1,1,1,2,2,1,2,0,0,1,4,3,0,2,0,3,1,0,0,0,2,0,1,1,1,0,0,3,1,2,1,0,1,0,1,2,0,0,1,0,0,0,0,0,3,0,3,0,0,0,0,0,1,1,0,0,2,1,1,1,0,1,2,3,2,1,1,3,1,2,1,0,2,1,0,0,0,0,0,1,2,2,0,3,0,1,1,1,1,2,3,0,1,1,0,1,1,1,2,0,1,0,0,1,0,0,0,3,0,2,1,1,2,0,1,2,4,2,0,0,1,1,1,1,1,0,1,1,0,0,3,2,0,0,3,0,1,0,0,0,1,2,2,3,2,0,0,0,2,0,1,1,2,2,0,4,1,0,1,0,2,2,0,1,0,2,0,2,0,1,0,0,1,3,1,0,0,1,1,1,2,2,1,1,0,0,0,0,2,0,0,1,2,1,3,1,1,1,1,1,1,0,0,1,1,0,0,1,2,0,0,0,0,0,2,1,2,0,1,1,0,2,1,3,2,2,0,2,2,0,2,2,0,1,1,1,1,0,1,1,1,2,0,0,1,0,2,0,1,0,0,1,1,1,0,2,0,3,2,2,4,1,1,1,1,2,2,2,0,3,1,2,0,3,2,1,3,0,2,1,3,2,0,1,0,0,4,2,0,0,2,0,1,1,2,1,0,0,0,1,2,3,1,1,3,1,0,1,0,0,0,1,1,1,1,2,1,1,1,1,0,1,1,2,0,0,0,1,1,2,2,0,1,0,2,0,2,1,0,1,0,0,0,0,1,2,0,1,0,1,1,0,3,4,2,1,2,0,0,1,1,1,0,1,0,0,1,0,1,1,1,2,1,0,1,1,2,1,2,0,1,0,2,1,0,0,2,0,0,0,0,0,2,1,0,1,1,1,0,1,0,1,0,0,0,4,1,1,1,0,0,0,0,2,1,1,1,1,1,0,1,1,2,0,0,0,3,2,0,1,0,0,4,0,1,0,0,0,4,1,0,0,2,2,2,2,2,1,0,1,0,2,1,1,1,1,1,1,1,1,1,0,0,1,3,1,1,1,2,0,2,0,0,1,0,0,2,2,0,1,0,1,0,1,0,3,0,2,1,0,0,2,1,1,0,0,0,0,0,1,0,0,1,1,2,0,0,0,0,2,1,0,0,2,2,1,3,1,0,1,1,0,1,1,0,0,0,2,0,1,2,0,3,0,0,0,2,1,3,1,2,0,1,0,0,1,1,0,1,1,0,2,1,1,2,3,2,4,1,2,1,1,1,0,1,0,2,0,2,1,0,3,2,1,2,0,1,0,1,1,1,1,0,0,1,2,0,2,0,1,0,1,0,0,2,1,0,0,1,2,3,2,2,1,3,1,1,2,0,0,0,0,0,1,0,1,3,0,0,1,1,2,0,2,0,1,2,0,1,0,1,1,0,0,1,3,1,1,0,0,1,1,1,1,2,1,0,1,2,0,1,1,2,1,0,0,1,1,1,2,0,1,0,0,1,1,0,0,2,0,0,0,1,2,1,0,0,1,1,0,2,0,2,1,1,3,1,2,1,1,2,0,2,1,0,1,1,0,0,0,0,0,1,1,0,0,1,2,0,3,2,1,0,1,1,1,1,0,3,1,1,1,2,2,1,1,0,0,1,2,1,1,1,2,1,0,1,1,2,0,0,0,1,2,2,2,3,2,1,1,1,1,1,2,0,2,0,2,0,0,1,1,2,1,1,1,0,1,1,0,2,1,2,1,5,1,1,0,2,0,1,1,1,0,0,1,0,0,2,0,0,0,1,1,0,2,1,4,0,1,0,0,0,0,1,1,0,1,2,0,1,0,2,0,0,0,2,0,0,0,1,0,1,1,0,1,0,1,0,1,0,1,1,3,1,2,0,0,0,1,2,0,3,2,0,1,2,3,1,2,2,2,0,3,1,1,0,2,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,1,0,2,2,0,0,1,1,1,0,3,0,2,1,0,2,1,0,0,1,0,1,0,1,1,2,1,0,2,3,2,0,1,0,1,2,1,0,1,0,1,0,1,0,1,1,1,0,2,0,0,2,0,1,1,1,2,1,3,1,2,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,1,0,1,2,0,0,2,2,2,0,0,2,1,2,0,3,0,2,1,1,0,0,1,1,1,0,0,1,1,2,0,3,1,1,0,2,2,0,2,0,0,1,0,1,3,2,0,2,0,1,2,0,0,0,2,4,1,2,1,1,2,2,0,1,2,1,4,0,3,1,1,1,2,2,0,3,1,3,0,0,1,2,1,3,0,2,2,1,2,0,2,3,2,0,1,1,1,2,0,1,1,2,1,0,2,2,4,1,0,0,4,0,2,2,1,1,0,1,0,2,1,3,1,1,3,1,0,1,1,0,3,3,1,2,5,0,0,1,0,0,1,0,3,1,1,0,1,0,1,0,0,1,1,1,0,1,0,0,0,0,1,1,2,0,1,1,0,2,0,0,2,0,1,2,3,1,1,0,1,2,0,0,0,1,0,1,2,2,1,0,0,0,0,0,2,2,0,2,1,1,1,0,3,0,2,1,0,4,0,1,0,0,1,1,1,1,0,0,0,1,1,2,1,0,0,1,0,1,2,0,2,0,1,2,0,0,1,1,1,2,0,3,1,2,2,0,1,1,2,1,0,1,1,1,1,0,3,3,3,0,1,0,0,2,2,1,1,2,1,1,2,2,3,1,2,1,3,1,0,0,0,2,2,1,1,2,1,2,1,0,1,0,1,1,3,0,0,0,0,0,0,2,0,1,1,3,0,2,0,1,0,2,0,1,0,3,1,2,0,0,2,1,1,1,0,1,1,2,0,1,0,1,0,1,2,0,0,1,0,3,0,0,2,2,1,2,1,1,0,0,1,0,2,0,2,0,1,1,0,2,0,3,1,3,3,0,0,2,2,1,1,3,0,1,3,1,1,1,0,0,1,3,2,3,0,2,0,1,0,0,0,2,2,0,1,0,0,1,3,0,1,0,2,1,0,4,1,0,0,0,1,1,1,2,1,1,0,0,1,1,2,0,2,2,0,1,1,2,1,1,2,1,2,0,2,0,1,0,1,1,1,0,2,1,1,1,1,0,1,1,1,1,0,0,3,1,0,0,1,1,2,3,2,0,1,0,1,4,2,0,3,0,0,3,1,1,1,1,0,0,1,1,0,1,1,0,3,0,2,0,2,1,2,3,1,1,0,1,1,1,1,0,0,0,4,2,0,0,1,0,1,0,1,0,0,0,0,1,1,0,0,1,0,3,0,2,1,2,0,1,2,1,0,0,0,1,0,1,2,0,1,1,0,1,1,2,0,1,0,0,3,1,1,1,1,1,1,5,1,0,4,0,1,0,1,0,0,1,1,2,2,0,3,1,1,1,2,3,0,1,1,1,0,0,1,1,1,2,1,1,1,1,0,1,3,0,1,1,2,0,1,1,1,0,0,1,0,2,0,2,0,1,1,1,1,0,1,2,0,1,0,0,1,2,1,2,0,0,1,1,0,0,0,1,1,0,2,1,0,1,1,0,1,1,2,0,4,0,1,0,0,0,2,2,1,1,2,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,1,1,3,0,2,2,0,0,3,0,2,0,1,1,1,1,2,3,2,1,2,0,1,1,0,0,2,0,0,0,0,1,0,0,2,1,3,1,0,2,1,2,0,3,4,3,2,1,2,2,2,0,2,0,0,3,1,1,1,2,2,1,1,0,1,0,2,1,1,3,1,0,1,0,0,0,2,1,2,0,1,1,2,2,1,0,2,1,0,1,1,0,0,0,0,0,0,0,2,0,0,2,0,1,0,1,1,2,1,1,1,1,1,1,2,2,0,1,0,0,1,2,0,1,1,1,1,1,1,2,0,1,0,0,3,1,3,1,1,3,1,1,0,0,0,0,0,2,0,0,2,0,1,1,0,1,0,1,2,3,1,0,0,1,3,3,2,0,1,0,1,3,1,1,0,1,1,1,2,2,2,0,1,0,0,1,0,1,0,1,0,1,0,1,1,0,2,0,1,1,0,3,1,0,0,3,0,2,1,0,2,0,0,0,1,1,3,1,1,0,2,1,0,0,0]},{"counters":[0,0,0,4,0,0,2,4,1,2,2,3,1,3,0,0,0,0,2,3,0,0,1,0,1,3,2,0,0,1,1,0,2,2,1,2,2,0,2,2,1,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,3,0,1,0,1,0,0,2,0,1,3,1,0,2,0,2,0,1,0,0,1,1,0,1,2,1,0,2,1,1,0,0,2,2,0,2,1,2,2,2,1,1,1,0,0,0,1,1,1,1,2,3,1,2,2,2,3,1,0,1,1,0,1,0,0,0,1,3,1,0,3,2,1,1,1,0,0,1,0,1,1,1,1,2,0,0,0,1,0,0,2,0,1,2,2,0,0,2,2,1,2,2,2,0,2,0,3,0,1,1,0,1,0,0,0,0,2,1,0,0,1,1,0,1,0,1,2,0,0,0,1,0,1,1,0,1,4,0,1,3,1,1,1,0,0,0,0,0,1,1,0,4,2,0,1,1,0,2,0,0,2,5,0,2,0,0,1,1,0,1,3,0,1,0,0,0,0,0,1,2,1,0,1,0,2,1,0,1,2,0,0,2,2,1,1,2,1,1,1,0,3,1,1,3,0,2,0,0,0,0,0,2,1,0,2,1,0,2,1,0,1,0,1,0,1,1,1,0,0,1,0,2,2,1,1,1,1,0,1,2,2,3,2,1,1,1,4,1,0,1,0,1,0,2,0,1,1,0,0,2,2,1,1,0,1,1,2,0,2,0,2,5,1,0,1,1,1,1,1,1,1,2,1,1,0,1,1,0,1,3,0,1,1,2,0,2,0,1,0,1,1,2,3,0,0,1,0,0,2,2,1,2,1,0,0,1,1,2,1,3,0,0,1,0,1,0,3,2,0,2,1,1,1,0,0,2,1,0,1,1,1,1,0,0,0,2,4,1,0,1,0,2,1,1,0,0,2,1,0,2,0,1,0,4,1,2,1,1,2,0,0,0,0,1,1,0,1,2,1,1,1,0,2,0,0,2,1,0,0,1,1,0,3,2,1,0,0,2,1,1,0,2,2,0,0,0,1,0,2,3,0,0,5,2,0,0,3,2,0,0,1,4,0,1,0,2,1,2,0,1,0,1,0,2,1,4,0,3,1,2,1,1,2,0,1,2,1,1,4,2,2,3,2,3,0,1,3,0,0,1,0,0,0,2,2,0,1,0,0,1,1,0,0,1,0,2,0,3,1,0,1,0,0,1,2,0,1,2,0,0,1,1,0,2,0,1,0,1,1,1,1,2,2,1,1,1,0,0,0,1,1,0,1,1,3,1,2,1,2,1,1,3,1,2,0,0,2,0,2,0,0,2,4,1,0,1,1,2,2,0,0,1,1,2,1,0,0,3,1,2,1,0,1,0,1,0,1,0,0,0,2,0,2,2,3,1,1,0,0,1,3,0,0,0,1,1,0,1,1,1,2,0,3,1,0,1,2,0,1,1,1,0,0,1,2,1,0,0,1,1,1,1,0,1,0,1,1,4,2,0,1,0,2,1,0,2,0,1,1,1,0,0,0,0,1,2,0,1,1,0,1,1,1,1,1,1,0,1,0,1,0,3,1,0,0,0,4,1,1,1,0,2,2,1,1,1,4,0,3,0,1,1,3,2,1,0,0,1,0,0,0,0,0,1,1,0,0,0,2,2,0,1,1,0,1,1,0,0,0,3,2,1,1,1,3,2,0,1,2,2,0,2,0,0,1,2,2,0,0,0,0,1,0,2,1,1,1,2,3,0,4,1,0,0,1,0,2,2,0,1,1,1,3,2,4,1,2,1,0,2,1,0,0,1,1,0,0,1,1,3,0,1,0,1,2,1,2,3,0,1,0,0,1,2,0,0,0,2,0,2,1,1,1,1,2,2,0,0,2,0,0,0,2,0,2,0,2,1,0,0,1,2,1,1,1,0,1,2,1,0,2,1,2,2,3,0,0,1,1,1,1,1,1,0,0,0,3,0,0,0,1,2,0,1,0,1,1,0,2,1,1,3,0,0,0,0,1,0,0,0,2,0,1,0,0,2,4,0,2,2,0,0,1,2,1,0,1,0,1,1,0,1,1,0,2,0,0,2,1,3,2,6,0,5,0,0,2,0,2,0,2,0,2,0,0,2,1,1,0,1,1,1,2,2,0,0,0,1,0,0,0,0,0,0,2,0,1,2,1,1,1,0,3,0,0,0,1,3,0,0,2,1,2,1,1,1,2,0,0,5,2,1,2,1,4,0,1,1,1,1,0,0,1,2,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,1,0,1,1,1,2,3,0,1,0,1,1,0,1,2,3,0,0,1,0,0,1,2,2,0,0,1,4,1,1,2,0,0,2,2,0,1,1,1,0,3,1,0,1,0,4,1,1,0,0,2,0,3,0,0,1,0,0,1,2,1,0,1,0,0,2,1,1,1,3,2,1,4,2,0,1,1,0,0,0,2,0,2,0,0,0,1,0,0,1,0,1,0,0,5,0,2,1,1,0,2,0,0,1,1,3,1,0,1,1,2,0,0,1,1,2,0,1,3,1,2,1,3,1,3,1,0,3,0,0,2,2,1,0,0,0,0,0,0,0,3,1,1,1,0,3,1,1,1,0,1,1,0,0,1,1,1,0,0,4,1,3,1,1,0,2,2,0,2,2,0,0,3,0,2,1,1,0,0,3,0,0,2,1,0,1,2,0,1,3,1,2,1,1,3,1,2,1,1,0,0,2,3,0,0,1,1,0,2,1,2,0,0,2,1,0,0,1,1,0,1,1,0,1,0,0,2,0,1,2,1,3,0,0,1,1,1,1,0,1,1,1,2,0,0,1,0,0,2,0,0,0,0,2,0,1,0,0,1,0,1,2,0,2,0,0,1,0,0,1,1,3,1,3,1,1,1,1,1,1,2,2,2,0,0,1,0,1,0,2,0,0,2,1,2,1,0,1,0,1,1,2,1,0,1,1,0,2,1,2,0,0,2,1,1,1,1,4,1,0,0,0,1,2,1,0,0,1,1,0,1,1,0,1,1,1,4,0,0,0,2,2,2,2,1,1,1,0,1,1,1,2,1,0,0,1,1,2,1,1,1,1,1,1,3,1,1,0,1,0,0,0,3,0,0,0,1,1,0,1,1,3,1,0,0,1,3,2,0,2,1,0,1,2,0,2,1,0,0,2,3,1,2,0,0,0,0,3,1,1,2,1,2,2,0,1,0,2,1,2,1,0,0,0,0,1,1,0,3,3,0,2,0,0,1,0,2,0,0,0,0,3,1,1,1,0,0,0,1,1,1,0,0,3,0,0,1,0,0,1,0,1,1,2,0,1,2,3,1,0,1,0,3,1,0,1,3,1,1,2,1,1,1,3,0,1,2,1,1,1,1,0,2,1,2,1,1,1,0,2,1,0,1,0,2,0,0,1,0,2,1,0,0,2,2,0,3,0,0,1,1,0,1,0,0,1,1,0,0,2,0,1,2,2,2,0,0,0,3,2,3,1,0,2,0,1,3,1,3,0,1,0,0,1,0,1,0,1,1,0,1,3,1,0,3,1,0,1,1,1,1,0,2,0,0,0,0,2,0,2,0,3,3,1,0,1,1,1,0,2,0,1,1,2,0,1,0,0,2,2,1,2,1,1,0,1,0,0,0,1,1,0,1,1,4,1,1,2,0,2,1,0,1,4,0,0,1,0,0,2,0,1,1,0,0,3,2,0,0,1,1,0,1,0,1,3,1,2,1,0,2,1,0,1,1,1,0,1,3,0,0,0,1,1,0,2,1,0,1,0,1,0,1,0,0,0,2,2,1,1,0,1,0,2,0,0,0,3,2,1,0,1,2,1,1,1,1,2,0,0,0,1,1,2,0,2,1,3,1,1,2,1,0,2,1,3,1,0,0,0,2,0,1,1,2,1,1,1,1,0,1,0,1,0,1,0,1,1,3,1,0,1,1,1,1,0,0,0,1,1,1,2,2,1,0,0,1,1,1,1,0,1,0,3,1,0,0,1,2,0,3,1,3,0,1,0,1,1,1,1,2,1,0,2,2,1,1,1,1,2,1,0,0,1,1,1,1,2,0,4,1,0,0,1,2,0,3,2,2,0,2,0,0,1,0,1,1,1,1,1,0,1,2,1,3,1,2,2,1,2,1,0,1,1,2,1,1,0,1,1,1,0,1,1,2,1,0,0,2,1,1,2,1,2,2,1,0,0,0,1,1,2,1,0,2,0,1,1,3,2,0,1,0,1,1,0,3,1,1,0,2,1,0,2,1,0,0,1,4,2,3,2,3,1,0,0,1,0,3,2,1,0,2,2,0,1,3,0,0,0,0,1,0,0,4,1,1,0,1,1,1,0,0,0,2,4,0,1,1,2,0,2,0,2,1,0,2,1,1,0,2,1,0,0,1,3,0,1,0,0,1,0,1,0,0,2,0,2,3,1,1,2,1,0,1,0,2,1,1,2,0,4,1,0,1,2,2,1,2,0,1,3,0,1,0,1,2,2,2,1,0,0,2,1,0,0,1,0,0,0,0,0,2,1,1,1,1,0,2,2,0,1,3,2,0,2,0,0,1,1,3,1,1,0,2,0,0,1,0,1,3,0,0]},{"counters":[0,1,1,2,1,1,0,1,2,0,0,2,1,1,0,1,0,0,1,1,1,1,1,0,0,0,3,3,0,0,1,1,3,0,0,1,1,0,0,1,0,0,3,1,0,0,1,1,1,1,2,0,1,2,0,0,5,1,0,2,1,2,3,0,2,1,0,0,0,0,3,1,0,0,1,0,0,1,1,0,1,0,0,2,2,0,0,1,3,3,1,0,3,2,0,0,1,1,2,2,2,0,2,1,0,1,0,0,0,2,2,0,1,1,0,0,2,1,0,1,4,0,1,1,2,2,2,0,3,2,1,0,0,1,1,1,0,1,1,1,1,0,1,0,0,1,2,1,1,2,1,1,1,2,2,0,1,1,1,2,3,1,0,3,1,1,0,3,1,0,0,0,2,0,3,3,0,0,2,2,0,1,1,0,1,0,0,2,1,1,2,0,0,1,1,0,1,3,1,1,0,1,0,0,1,1,2,0,3,0,0,1,0,2,0,1,1,1,2,1,1,2,3,2,1,1,1,0,1,0,0,1,0,2,1,0,1,0,2,1,1,0,1,0,1,0,1,1,0,2,0,0,0,3,1,2,2,0,0,0,0,0,0,0,2,1,0,0,0,1,0,1,1,1,0,2,1,3,0,0,1,3,2,1,1,0,1,0,2,0,1,2,0,1,2,3,2,0,2,4,3,3,0,0,0,1,0,1,1,0,0,2,1,3,0,2,0,0,0,1,2,2,3,1,0,3,0,2,0,1,1,1,4,2,1,3,1,0,2,2,1,0,2,0,1,0,3,1,2,1,1,2,1,2,0,2,0,0,0,1,4,1,2,1,2,4,1,0,2,2,0,0,1,1,1,0,0,0,1,0,0,2,1,0,1,1,1,0,1,2,2,1,1,0,1,0,2,2,2,2,0,0,2,1,0,0,3,2,0,0,2,0,2,1,0,1,1,0,1,1,2,1,0,1,1,1,2,2,2,0,0,2,0,0,3,1,2,1,1,1,1,0,0,1,1,1,3,0,1,2,0,2,1,1,2,1,0,0,1,2,2,0,2,1,2,1,1,3,2,0,0,2,0,1,1,1,0,2,3,1,1,1,0,0,0,0,2,1,0,1,2,1,0,3,0,1,1,0,0,0,2,0,0,1,1,3,0,0,1,0,3,0,1,2,3,1,1,0,0,1,1,0,0,1,0,2,1,0,0,0,0,2,1,0,2,1,0,0,3,3,0,0,1,0,0,1,1,0,0,1,2,2,2,1,4,3,0,1,0,1,3,0,0,1,3,0,1,0,0,0,1,0,0,2,1,0,2,2,2,2,0,0,1,1,0,1,1,0,3,3,1,0,3,1,2,1,3,1,1,0,1,2,0,1,1,4,1,0,0,2,1,1,0,0,3,1,1,3,3,3,1,0,2,0,3,0,0,0,2,0,0,2,0,0,2,3,1,0,1,2,0,1,0,0,0,2,0,1,0,2,0,1,0,2,1,2,1,3,1,0,2,0,0,0,1,2,1,1,1,1,0,1,3,1,2,1,1,3,3,0,1,2,1,1,2,0,0,1,0,2,2,3,3,1,0,0,2,1,1,1,0,1,0,1,3,2,1,0,3,0,2,0,1,1,0,0,1,2,0,1,1,0,0,1,0,2,2,0,1,0,1,0,1,1,1,1,1,2,3,0,1,1,1,2,0,2,1,0,0,0,0,0,1,0,0,1,0,1,2,0,0,0,0,0,1,0,2,1,2,1,1,2,2,0,0,1,1,1,0,4,1,1,1,1,1,0,1,2,1,0,0,1,4,3,2,1,1,0,0,1,3,4,2,1,1,1,0,1,1,0,1,3,0,1,0,0,2,1,0,1,0,1,1,0,1,0,3,0,0,3,2,1,0,2,2,1,0,0,1,3,1,1,0,0,0,1,1,0,1,2,0,1,1,0,1,3,2,2,1,0,1,1,2,0,1,1,3,0,1,1,0,1,1,0,0,1,1,0,0,0,1,0,1,4,2,0,0,0,2,2,1,4,0,0,0,0,1,0,2,1,2,1,0,2,3,1,0,0,2,1,2,0,1,1,1,2,1,0,0,1,0,0,1,1,1,1,2,0,1,1,0,1,0,2,1,0,0,1,2,0,1,0,0,0,2,1,2,1,2,1,0,0,1,1,1,0,0,0,1,3,0,3,1,2,1,0,3,3,1,2,1,1,3,1,2,3,1,1,0,0,0,2,0,1,0,1,2,1,0,1,1,0,1,1,0,0,0,1,0,2,3,1,1,2,0,0,2,0,2,3,2,0,0,0,2,1,0,3,1,1,1,1,0,2,2,0,0,0,1,0,1,1,1,1,0,4,2,0,0,1,0,0,0,1,1,1,0,1,0,2,0,1,1,0,1,0,1,0,1,0,1,0,0,3,0,3,1,0,0,0,0,2,1,1,1,1,0,0,0,1,0,2,3,1,0,1,0,0,1,1,1,1,0,1,1,2,1,0,0,1,1,2,0,0,1,3,1,2,0,1,2,0,0,0,4,0,0,1,1,0,0,1,1,0,0,3,1,0,1,1,2,1,2,2,2,2,0,1,0,1,1,1,2,1,1,0,1,4,0,2,0,2,1,1,1,0,1,3,0,2,1,1,0,0,1,0,1,1,0,1,2,0,2,1,0,1,3,0,4,1,0,0,0,1,1,0,2,1,0,4,0,2,1,0,2,1,0,0,1,1,0,1,2,0,1,0,3,1,2,3,0,0,2,2,0,3,0,1,1,0,2,1,3,0,0,0,2,1,2,3,0,1,0,0,0,0,0,2,0,1,1,3,0,1,1,0,1,0,0,1,1,1,0,1,2,0,0,1,2,2,1,1,2,1,1,0,0,0,1,1,1,2,1,1,0,0,0,0,0,1,0,0,1,2,1,1,1,4,0,1,2,1,1,0,1,2,0,1,1,1,2,0,1,0,0,0,1,1,2,2,0,1,1,3,1,0,0,4,0,2,0,1,0,0,1,1,0,1,0,2,1,2,1,0,0,0,1,0,0,0,0,0,0,2,1,1,0,1,0,1,0,0,1,0,1,0,1,0,2,0,1,0,0,1,1,3,0,1,0,1,1,0,1,0,0,1,2,3,0,1,2,2,5,2,2,1,0,3,1,0,1,1,2,2,1,1,1,1,0,3,2,1,2,1,1,0,1,0,0,2,2,2,1,3,0,0,0,1,0,0,0,1,2,2,1,1,0,0,1,1,0,0,1,1,1,0,3,1,3,3,0,1,0,1,0,1,2,0,2,1,0,1,1,2,1,1,0,1,0,1,1,0,0,2,3,2,1,3,1,1,1,1,2,0,1,0,0,0,0,3,0,0,0,1,2,1,3,0,0,3,1,0,0,1,1,0,0,0,2,1,1,0,0,1,1,3,0,0,2,0,1,2,1,1,0,2,1,0,1,2,1,0,0,1,1,1,2,0,3,1,0,4,1,1,1,2,0,1,1,0,0,0,2,0,0,1,3,2,2,0,0,1,0,0,0,2,0,1,0,1,2,1,0,2,1,0,2,0,1,2,0,1,1,1,0,1,1,1,1,1,2,2,0,0,2,1,1,1,0,0,1,2,0,2,0,0,0,2,0,1,0,0,1,0,0,2,2,2,0,0,1,1,2,1,2,1,1,1,1,3,0,2,0,1,0,0,1,2,1,1,4,3,0,0,1,1,0,2,3,1,1,1,3,1,3,1,2,1,1,0,1,2,1,0,5,2,1,0,1,2,1,1,3,1,4,1,2,1,2,4,1,1,2,1,1,0,0,1,0,0,1,3,0,0,0,1,0,0,1,1,2,2,3,0,3,0,3,0,1,0,1,2,2,0,1,1,0,1,0,1,1,1,1,3,2,1,1,0,1,2,0,2,0,3,1,0,2,1,1,3,0,0,3,1,0,0,1,0,1,1,1,1,3,0,0,1,0,1,1,3,0,0,0,0,0,0,1,2,3,1,2,1,0,1,0,3,1,1,1,2,1,3,0,0,2,1,1,1,1,1,2,2,2,3,0,1,0,2,1,0,1,1,2,0,1,2,1,2,0,1,3,0,1,3,1,0,0,1,1,1,1,1,0,0,1,2,0,2,1,0,0,0,0,1,1,0,0,1,2,1,0,1,3,0,1,1,0,1,0,0,0,1,1,1,0,0,0,2,0,1,0,3,2,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,2,2,0,0,0,0,1,1,1,0,3,0,1,0,0,3,0,1,0,1,2,1,0,1,1,2,0,0,2,2,0,0,2,1,1,2,1,0,0,0,2,0,1,3,3,0,0,1,1,1,2,2,0,1,1,1,0,1,1,1,2,1,1,2,1,2,3,0,1,0,0,0,1,3,0,1,1,5,1,1,1,0,1,1,4,0,3,0,0,0,0,0,2,1,1,0,0,0,2,0,0,1,0,0,0,3,0,0,0,1,1,2,1,2,2,3,0,0,1,3,1,0,2,0,0,0,0,2,1,0,2,0,2,2,2,1,0,1,0,0,2,0,1,1,0,1,2,1,1,1,0,1,2,2,3,1,0,0,0,0,0,1,1,0,1,0,0,2,2,0,1,0,1,1,3,1,0,2,0,1]},{"counters":[0,0,1,3,1,1,0,1,1,0,0,0,1,1,1,2,0,1,1,1,1,0,2,0,0,0,1,1,1,1,1,0,1,1,1,0,1,0,2,2,0,0,1,0,1,0,5,3,1,1,0,0,1,1,1,0,2,1,0,0,2,1,1,1,2,0,1,1,0,1,0,1,1,3,2,1,1,0,0,1,2,1,1,1,0,0,2,1,0,0,0,0,0,1,0,1,1,0,0,1,1,0,1,1,1,0,2,0,0,1,1,0,0,1,0,0,4,1,2,1,0,2,1,3,2,0,2,0,1,2,2,0,0,2,1,2,1,1,0,1,0,1,1,1,0,1,0,0,2,0,1,0,1,2,2,2,2,2,1,0,2,1,1,0,0,0,1,2,0,1,0,0,0,0,0,1,0,0,3,3,1,0,2,0,0,1,1,0,1,1,3,1,1,1,2,0,1,1,3,2,3,1,0,0,0,1,3,1,1,2,2,0,1,0,0,1,1,0,1,0,2,1,1,2,0,0,0,0,0,1,3,0,2,1,0,2,1,0,0,1,1,1,0,1,0,0,2,0,0,0,0,2,5,3,0,3,0,0,1,2,0,3,0,0,1,0,1,1,0,1,0,1,1,0,0,0,2,2,0,0,0,1,2,2,0,1,1,3,0,0,0,4,1,2,1,0,1,3,3,0,1,1,1,0,2,2,0,1,1,0,1,0,1,1,0,0,2,2,1,4,1,2,0,2,2,1,0,1,1,3,2,1,0,3,1,1,1,1,2,1,0,2,1,0,3,2,1,1,2,1,1,2,1,2,1,0,0,0,0,0,1,0,1,0,1,1,1,0,1,2,0,0,3,0,0,0,1,0,0,1,0,2,2,1,1,1,0,1,3,2,3,1,1,0,1,2,0,0,1,3,0,1,0,2,3,0,0,0,3,1,0,3,1,1,0,0,1,0,0,3,2,1,0,0,0,1,2,2,1,2,0,3,0,0,0,0,1,2,0,2,1,1,2,2,1,2,1,2,3,1,1,0,2,1,1,1,1,0,2,0,2,1,0,0,1,0,4,0,3,1,0,1,1,0,1,0,2,1,0,0,0,1,3,1,4,2,0,1,2,1,0,0,0,0,3,1,1,2,3,1,2,1,1,2,0,0,0,1,0,1,0,0,0,1,1,0,3,2,0,2,1,0,0,0,1,1,0,0,2,1,2,1,1,0,0,3,1,1,2,0,0,1,1,2,1,3,2,2,0,2,1,1,3,1,1,0,0,2,0,0,2,1,4,0,0,1,3,2,0,0,0,0,0,0,0,1,0,1,1,0,1,1,2,0,1,0,0,1,1,4,1,0,0,2,1,0,1,1,2,1,1,0,2,1,0,0,0,1,1,1,1,0,0,2,1,0,3,3,1,1,0,1,1,1,0,0,0,0,2,0,0,0,2,0,0,0,0,0,0,1,0,1,1,3,2,4,0,1,2,2,1,0,0,0,0,0,2,0,2,2,2,1,1,2,0,2,0,3,1,2,1,0,0,1,1,0,2,1,1,0,2,2,0,1,1,1,1,1,2,0,3,0,0,0,0,1,1,1,0,0,0,2,0,1,2,1,3,2,1,1,1,0,0,2,0,2,1,0,0,1,1,0,4,2,1,2,0,1,0,2,0,1,2,1,1,0,0,0,1,0,1,1,0,3,1,1,1,0,2,1,2,0,1,2,0,1,1,0,0,2,0,0,1,1,2,4,2,2,0,0,0,1,0,0,0,2,0,1,0,0,0,0,0,1,0,3,1,2,2,2,0,1,0,1,0,1,1,1,1,1,2,0,0,1,2,3,0,3,1,1,2,4,2,1,1,3,3,2,2,1,0,0,0,1,1,1,1,0,4,1,0,0,0,1,0,1,2,0,2,0,1,1,0,2,2,0,1,0,2,4,0,3,1,0,1,3,2,0,0,0,1,0,2,0,0,1,1,1,3,0,0,1,1,0,2,1,1,1,1,0,1,0,2,4,0,2,0,2,1,2,1,0,3,0,2,1,0,2,0,1,0,2,1,1,1,1,2,0,0,1,1,4,1,0,0,0,0,2,0,1,0,0,0,1,0,1,3,2,2,0,0,0,1,2,0,1,1,0,0,1,1,0,0,1,2,1,1,0,1,1,1,0,0,3,1,1,1,2,0,0,1,2,0,1,0,0,1,1,1,1,0,1,1,0,2,1,1,4,0,0,0,3,0,1,1,2,0,1,0,1,0,1,1,0,1,1,0,0,1,1,0,2,1,1,0,0,0,0,0,0,0,0,0,0,2,3,0,0,3,1,2,3,2,0,1,0,1,0,1,0,4,2,2,4,0,1,0,3,1,1,2,1,1,0,0,1,0,1,1,0,1,0,2,2,1,2,0,1,3,0,1,1,3,0,2,2,1,0,1,1,0,0,1,1,1,0,0,0,3,0,1,2,0,0,0,0,0,2,2,1,0,0,1,0,1,1,2,1,1,1,0,0,3,1,2,1,2,2,1,0,2,1,0,2,0,1,1,0,2,1,0,0,3,2,2,3,1,1,1,0,1,1,1,0,1,0,2,1,1,1,1,0,0,0,3,2,1,2,1,1,2,3,1,2,0,0,0,0,1,2,1,1,1,0,1,1,1,2,0,1,1,2,0,3,0,0,0,0,1,1,3,0,3,2,3,1,0,0,3,0,0,2,0,3,3,0,2,0,0,1,0,2,1,0,1,2,0,0,1,0,2,1,0,3,0,0,0,1,0,0,0,1,1,2,4,1,0,0,0,0,1,3,0,1,0,0,0,2,1,3,0,0,1,2,0,1,3,1,2,1,4,0,0,1,1,1,0,2,2,0,0,0,1,0,4,0,2,0,0,1,0,1,1,0,1,1,0,1,3,3,2,1,2,0,1,0,0,0,1,1,0,1,1,0,0,1,1,0,2,1,0,4,1,1,0,0,1,1,3,3,4,0,2,0,1,2,1,0,1,0,1,2,1,1,2,2,1,1,0,1,1,4,1,1,2,2,0,2,0,0,0,1,1,2,2,3,0,1,1,0,1,1,0,2,0,0,1,2,1,0,1,1,1,2,1,0,2,1,1,2,0,2,0,1,1,2,0,0,0,1,1,2,1,0,2,1,1,1,1,0,1,1,0,0,1,0,0,1,0,1,3,1,1,0,1,0,2,0,1,1,2,1,1,1,1,1,1,0,0,1,0,0,1,1,1,1,0,0,0,0,1,1,0,1,2,2,0,1,1,1,1,2,1,0,2,1,0,0,1,0,1,2,5,2,4,2,3,1,2,0,1,0,1,1,0,0,0,1,3,0,0,1,2,0,0,1,1,1,1,1,0,2,0,0,0,0,1,0,1,1,2,0,0,0,2,1,3,0,2,1,0,1,0,1,0,0,0,1,1,1,0,2,3,1,1,1,0,0,1,1,0,3,0,2,0,1,1,0,4,1,0,2,0,1,0,0,1,0,1,1,1,2,1,0,1,1,1,2,0,2,2,0,1,1,0,1,0,2,0,1,0,2,2,2,1,0,2,1,1,0,0,1,0,1,0,1,1,1,3,1,1,1,2,2,1,0,0,0,3,1,1,0,1,0,1,1,0,2,2,1,1,0,1,1,3,0,1,2,0,2,0,0,1,3,1,1,1,4,1,0,1,0,0,3,0,0,1,3,0,0,0,2,1,0,0,4,3,2,2,0,0,2,2,0,0,2,1,1,2,0,1,2,1,1,1,1,0,3,0,0,1,1,1,3,0,1,0,1,0,1,0,4,0,3,1,3,0,0,1,0,0,1,1,1,0,1,1,1,0,0,0,0,0,0,3,2,2,2,0,1,2,0,1,2,0,3,1,1,1,1,1,0,2,1,0,2,3,2,3,2,1,1,0,1,1,0,1,3,0,0,1,0,0,0,1,0,2,3,1,2,3,1,0,1,0,3,2,1,1,0,1,0,0,0,1,3,0,0,1,0,3,1,1,0,1,1,1,2,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,2,1,2,0,0,0,2,1,1,0,1,1,1,4,3,2,0,2,2,0,0,2,0,0,1,1,3,1,1,1,1,1,0,1,2,1,0,0,1,2,0,2,1,1,3,1,1,1,1,0,2,0,1,0,1,2,3,1,0,2,0,0,1,0,2,2,1,1,2,1,1,1,0,1,0,3,2,2,2,1,1,3,2,2,3,2,1,1,0,0,4,1,0,1,0,0,2,0,1,0,1,1,3,0,2,0,1,1,3,1,1,3,2,2,1,1,0,0,2,1,3,0,0,2,4,1,0,2,0,0,3,0,1,1,1,2,3,0,0,1,0,1,3,1,2,0,0,0,2,1,1,0,2,0,0,0,1,1,0,2,2,1,2,1,1,1,0,1,1,0,1,1,2,4,0,0,1,2,4,0,2,2,1,1,1,3,0,0,0,1,1,0,2,0,1,1,0,1,1,1,0,1,1,2,1,0,2,2,1,2,2,0,1,1,1,1,0,0,0,0,1,1,0,0,0,1,1,2,0,0,0,1,2,0,1,1,1,1,0,0,2,2,1,1,1,3,1,1,2,0,0,1,1,0,1,1,1,4,1,1,1,1,0,1,1]}]},"null_count":0,"last_update_version":397952049000480768}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_007.json b/cmd/explaintest/s/explain_complex_stats_tbl_007.json deleted file mode 100644 index d447f64373556..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_007.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_007","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDY0NzUwMzA=","upper_bound":"LTIxNDMwMzU0MDg=","repeats":1},{"count":16,"lower_bound":"LTIxMzgwODQ1MzU=","upper_bound":"LTIxMzQ1MzAwNTQ=","repeats":1},{"count":24,"lower_bound":"LTIxMzQyNjE5NDA=","upper_bound":"LTIxMzAwMTE1ODU=","repeats":1},{"count":32,"lower_bound":"LTIxMjk2MDk0ODE=","upper_bound":"LTIxMTYxNTE5MTQ=","repeats":1},{"count":40,"lower_bound":"LTIxMTIwODQyNjc=","upper_bound":"LTIwOTUzNTI2OTA=","repeats":1},{"count":48,"lower_bound":"LTIwOTQ2ODg2NjU=","upper_bound":"LTIwNzg5MTIwMDY=","repeats":1},{"count":56,"lower_bound":"LTIwNzU3Njc3MDA=","upper_bound":"LTIwNzE5MTE0MTE=","repeats":1},{"count":64,"lower_bound":"LTIwNjk4MzQ0NjU=","upper_bound":"LTIwNTI2ODE1NjM=","repeats":1},{"count":72,"lower_bound":"LTIwNTIwODQ4NzI=","upper_bound":"LTIwNDMzMDg5NDE=","repeats":1},{"count":80,"lower_bound":"LTIwNDEwOTEzMjk=","upper_bound":"LTIwMzI2MjEyNDE=","repeats":1},{"count":88,"lower_bound":"LTIwMzAyODE0MTM=","upper_bound":"LTIwMDk0NDkwNzE=","repeats":1},{"count":96,"lower_bound":"LTIwMDY5ODI0ODE=","upper_bound":"LTIwMDM5ODMwNjk=","repeats":1},{"count":104,"lower_bound":"LTIwMDI2MTU2MDg=","upper_bound":"LTE5OTA0NjM2MjQ=","repeats":1},{"count":112,"lower_bound":"LTE5ODM3ODUwNzQ=","upper_bound":"LTE5ODA1NTYyMTA=","repeats":1},{"count":120,"lower_bound":"LTE5Njg3NTI2ODA=","upper_bound":"LTE5NTQ1ODQyODQ=","repeats":1},{"count":128,"lower_bound":"LTE5MzU3MTQ1Mzc=","upper_bound":"LTE5Mjg1MDYwMDE=","repeats":1},{"count":136,"lower_bound":"LTE5MjM4OTEzOTE=","upper_bound":"LTE5MTI0MDk2OTI=","repeats":1},{"count":144,"lower_bound":"LTE5MDMzMTMzNzU=","upper_bound":"LTE4OTM0MzcwOTA=","repeats":1},{"count":152,"lower_bound":"LTE4ODU5ODkwMTg=","upper_bound":"LTE4NjI0MjE2NjY=","repeats":1},{"count":160,"lower_bound":"LTE4NDM0OTcyNTI=","upper_bound":"LTE4MjcxOTY0Njc=","repeats":1},{"count":168,"lower_bound":"LTE4MjA4NTEzMzg=","upper_bound":"LTE4MDk3ODk5MTE=","repeats":1},{"count":176,"lower_bound":"LTE4MDczMjU1NjQ=","upper_bound":"LTE3ODQ4NDk1NTM=","repeats":1},{"count":184,"lower_bound":"LTE3NzQ4NTg3MTU=","upper_bound":"LTE3NjMyNTcyMjE=","repeats":1},{"count":192,"lower_bound":"LTE3NjMwODgyNjE=","upper_bound":"LTE3NTcwODEwMzU=","repeats":1},{"count":200,"lower_bound":"LTE3NTY2NTExMTc=","upper_bound":"LTE3NDM5MTMwNDk=","repeats":1},{"count":208,"lower_bound":"LTE3Mzc2Nzc5NjE=","upper_bound":"LTE3MjI0ODA2MjM=","repeats":1},{"count":216,"lower_bound":"LTE3MjE5Nzg2MDQ=","upper_bound":"LTE3MTUyNjY2MjY=","repeats":1},{"count":224,"lower_bound":"LTE3MTUyMzc5ODk=","upper_bound":"LTE3MDU0NTE5NjY=","repeats":1},{"count":232,"lower_bound":"LTE3MDM5NTQxOTE=","upper_bound":"LTE2OTM5NzAxMzc=","repeats":1},{"count":240,"lower_bound":"LTE2ODk2NDgzNzA=","upper_bound":"LTE2ODMxMTI4NjU=","repeats":1},{"count":248,"lower_bound":"LTE2Njk4MzY0OTk=","upper_bound":"LTE2NjU0MDM1NDk=","repeats":1},{"count":256,"lower_bound":"LTE2NjM5MTIyNTY=","upper_bound":"LTE2NTU3MDA4OTA=","repeats":1},{"count":264,"lower_bound":"LTE2NTE4MTM1Mzg=","upper_bound":"LTE2NDA2ODEyMjc=","repeats":1},{"count":272,"lower_bound":"LTE2Mzc3NzA2MzI=","upper_bound":"LTE2MTc0Nzc5ODk=","repeats":1},{"count":280,"lower_bound":"LTE2MTQyMTY5MDA=","upper_bound":"LTE2MDA1MDcxMjY=","repeats":1},{"count":288,"lower_bound":"LTE2MDAyNzE3OTQ=","upper_bound":"LTE1ODQ2MjkwNjY=","repeats":1},{"count":296,"lower_bound":"LTE1Nzk2Njg1NjY=","upper_bound":"LTE1NjU4NTE5MzE=","repeats":1},{"count":304,"lower_bound":"LTE1NjQyNjkwNDk=","upper_bound":"LTE1NDM3MTAwNDQ=","repeats":1},{"count":312,"lower_bound":"LTE1MzI3MTM3NTQ=","upper_bound":"LTE1MTQzMTA5NTU=","repeats":1},{"count":320,"lower_bound":"LTE1MTE4ODk2OTI=","upper_bound":"LTE1MDI0NTIzODI=","repeats":1},{"count":328,"lower_bound":"LTE0OTkwOTc5NjY=","upper_bound":"LTE0NzI2NjA4ODY=","repeats":1},{"count":336,"lower_bound":"LTE0NjE4MDQxMjk=","upper_bound":"LTE0NTQ2MjkzNjQ=","repeats":1},{"count":344,"lower_bound":"LTE0NTMwNDM5MDI=","upper_bound":"LTE0NDEwNjg0MDA=","repeats":1},{"count":352,"lower_bound":"LTE0MzUxODEwNTI=","upper_bound":"LTE0MjEwODM3OTA=","repeats":1},{"count":360,"lower_bound":"LTE0MTE2MDE1NzQ=","upper_bound":"LTE0MDcxNzE1NjA=","repeats":1},{"count":368,"lower_bound":"LTE0MDY2ODIwMTc=","upper_bound":"LTE0MDEwODY1NjU=","repeats":1},{"count":376,"lower_bound":"LTEzOTkxMzk4MzA=","upper_bound":"LTEzOTU5NjkzMDk=","repeats":1},{"count":384,"lower_bound":"LTEzNzMyMjA4NDI=","upper_bound":"LTEzNjgwNDM3MjU=","repeats":1},{"count":392,"lower_bound":"LTEzNTE3NzI0Mzc=","upper_bound":"LTEzNDU2NTM1NDY=","repeats":1},{"count":400,"lower_bound":"LTEzNDQxOTE2MDY=","upper_bound":"LTEzMTI3MDEwMzk=","repeats":1},{"count":408,"lower_bound":"LTEzMDY0MzU4NzA=","upper_bound":"LTEyODU1NTA4OTc=","repeats":1},{"count":416,"lower_bound":"LTEyODUwODk5NTc=","upper_bound":"LTEyNzgyMjMxODE=","repeats":1},{"count":424,"lower_bound":"LTEyNzMyMzQ3NTg=","upper_bound":"LTEyNjQ5NDc1MDc=","repeats":1},{"count":432,"lower_bound":"LTEyNjMzNjczOTI=","upper_bound":"LTEyNDM4MDkzNDU=","repeats":1},{"count":440,"lower_bound":"LTEyMzgxNDgzNDU=","upper_bound":"LTEyMjk1NTM4ODI=","repeats":1},{"count":448,"lower_bound":"LTEyMjYxNDkwNTc=","upper_bound":"LTEyMTc1NDYwMTA=","repeats":1},{"count":456,"lower_bound":"LTEyMTQwMjc5NTM=","upper_bound":"LTExODU1MzYxNzE=","repeats":1},{"count":464,"lower_bound":"LTExNzk0MjcyOTU=","upper_bound":"LTExNjk1OTkwOTQ=","repeats":1},{"count":472,"lower_bound":"LTExNjg0MDQzNDk=","upper_bound":"LTExMzIzMjUzOTI=","repeats":1},{"count":480,"lower_bound":"LTExMzEyNjY0Mjg=","upper_bound":"LTExMTc0NDc3NjY=","repeats":1},{"count":488,"lower_bound":"LTExMTEyNTU4NDY=","upper_bound":"LTExMDcwMDExMjA=","repeats":1},{"count":496,"lower_bound":"LTExMDQ2MjA1MDY=","upper_bound":"LTEwOTgxNjIzMjk=","repeats":1},{"count":504,"lower_bound":"LTEwODg2ODMwMjA=","upper_bound":"LTEwNzU1MTg1NjU=","repeats":1},{"count":512,"lower_bound":"LTEwNTMwNjAzMjU=","upper_bound":"LTEwMzc1NjQ3Nzk=","repeats":1},{"count":520,"lower_bound":"LTEwMzM4NDE0NzY=","upper_bound":"LTEwMTczMDgxODU=","repeats":1},{"count":528,"lower_bound":"LTEwMDk5OTc0NzM=","upper_bound":"LTk3MTMwMjkzMQ==","repeats":1},{"count":536,"lower_bound":"LTk2Njg5NTkyMA==","upper_bound":"LTk1OTk2MDUxNw==","repeats":1},{"count":544,"lower_bound":"LTk1NjgyNjA1MQ==","upper_bound":"LTkzNTM0Nzk4MQ==","repeats":1},{"count":552,"lower_bound":"LTkzMDg4OTMyNQ==","upper_bound":"LTkyNzU2Nzc2Mg==","repeats":1},{"count":560,"lower_bound":"LTkyNzA1NzE5OQ==","upper_bound":"LTkyMTk5NTAzNQ==","repeats":1},{"count":568,"lower_bound":"LTkxOTAwNTQwMg==","upper_bound":"LTkxMTUxNjAzNQ==","repeats":1},{"count":576,"lower_bound":"LTkwNjk1NDQ5MA==","upper_bound":"LTkwMjQ4ODA4MQ==","repeats":1},{"count":584,"lower_bound":"LTg5ODQyNDI2Nw==","upper_bound":"LTg4MTQyNzAzMQ==","repeats":1},{"count":592,"lower_bound":"LTg4MDE5NzkxOA==","upper_bound":"LTg3MTUxODkwMQ==","repeats":1},{"count":600,"lower_bound":"LTg2Mzk0MjczMA==","upper_bound":"LTg2MjEwNjA4Nw==","repeats":1},{"count":608,"lower_bound":"LTg1Mjc2NjUyOQ==","upper_bound":"LTg0Nzg3MTUwOA==","repeats":1},{"count":616,"lower_bound":"LTg0NjM1OTQzMA==","upper_bound":"LTgzMjgxNjk3NA==","repeats":1},{"count":624,"lower_bound":"LTgyNDYzODYyNw==","upper_bound":"LTgxMzA1MTY1OA==","repeats":1},{"count":632,"lower_bound":"LTgwNjU1NDA1MQ==","upper_bound":"LTc4MDkyMjU3NQ==","repeats":1},{"count":640,"lower_bound":"LTc3MDI3NzU0Nw==","upper_bound":"LTc2OTA2OTY2MQ==","repeats":1},{"count":648,"lower_bound":"LTc2NTU5MTk5Ng==","upper_bound":"LTc1ODU4NTE0Nw==","repeats":1},{"count":656,"lower_bound":"LTc0NDU0OTAyMQ==","upper_bound":"LTczMTg1NTY0MQ==","repeats":1},{"count":664,"lower_bound":"LTcyODE0NjQ5MQ==","upper_bound":"LTcxOTcyNzA3NA==","repeats":1},{"count":672,"lower_bound":"LTcxNDczODcxMQ==","upper_bound":"LTcwNjMxMDc0MA==","repeats":1},{"count":680,"lower_bound":"LTY5NjIxNTQ4MQ==","upper_bound":"LTY4MjMzMDkyNw==","repeats":1},{"count":688,"lower_bound":"LTY3NjAzNTQxMw==","upper_bound":"LTY1Njk0NzMzNw==","repeats":1},{"count":696,"lower_bound":"LTY1MzUyNTExMg==","upper_bound":"LTY0NDA3OTk0OQ==","repeats":1},{"count":704,"lower_bound":"LTY0MTQ4MjQ4NQ==","upper_bound":"LTYyODcwMzYxMg==","repeats":1},{"count":712,"lower_bound":"LTYyNjg4NDQzOA==","upper_bound":"LTYxMjk4NzE5OQ==","repeats":1},{"count":720,"lower_bound":"LTYxMjAxMjU2Ng==","upper_bound":"LTYwMzEyMTQ4OA==","repeats":1},{"count":728,"lower_bound":"LTU5OTkxMjY3MA==","upper_bound":"LTU5MTQzMjg5Ng==","repeats":1},{"count":736,"lower_bound":"LTU3OTE4MjA5Nw==","upper_bound":"LTU1NTkxMzIyMA==","repeats":1},{"count":744,"lower_bound":"LTU1NTA0NjEwMg==","upper_bound":"LTU0NDIwNzAyOQ==","repeats":1},{"count":752,"lower_bound":"LTUyNjE0MzA4OQ==","upper_bound":"LTUwNzE5Mjg4Ng==","repeats":1},{"count":760,"lower_bound":"LTUwMzk3Mjg1Mw==","upper_bound":"LTQ5NjEzNDkwNA==","repeats":1},{"count":768,"lower_bound":"LTQ5NDM4NDA1Ng==","upper_bound":"LTQ4NTU4ODI0Nw==","repeats":1},{"count":776,"lower_bound":"LTQ4NDE0OTk2Nw==","upper_bound":"LTQ3MzUyMDAwMQ==","repeats":1},{"count":784,"lower_bound":"LTQ3MTQ2MjUwNw==","upper_bound":"LTQ2OTIxNzAyOQ==","repeats":1},{"count":792,"lower_bound":"LTQ2NTQ0OTc5OA==","upper_bound":"LTQ2MjgxNjMwNQ==","repeats":1},{"count":800,"lower_bound":"LTQ1NzAwMzk4Ng==","upper_bound":"LTQ0NTM5MTg1Mw==","repeats":1},{"count":808,"lower_bound":"LTQ0NDEwNjIwOA==","upper_bound":"LTQzNzQ1NTcwMA==","repeats":1},{"count":816,"lower_bound":"LTQzNTMyNzA1NQ==","upper_bound":"LTQxMjIxMDU5Mg==","repeats":1},{"count":824,"lower_bound":"LTQxMDA3NjIxMg==","upper_bound":"LTM5OTYzMDY5OA==","repeats":1},{"count":832,"lower_bound":"LTM5ODI4NzE5OA==","upper_bound":"LTM5MDY2OTYxMw==","repeats":1},{"count":840,"lower_bound":"LTM4OTE4MjQ1MA==","upper_bound":"LTM1OTg3NDY5Mg==","repeats":1},{"count":848,"lower_bound":"LTM1MTc2NDc2NQ==","upper_bound":"LTM0NjA0OTQ1Nw==","repeats":1},{"count":856,"lower_bound":"LTMzOTMyODg2NQ==","upper_bound":"LTMyMjg1NjQ3Ng==","repeats":1},{"count":864,"lower_bound":"LTMyMTY2MTA1Mw==","upper_bound":"LTMwMzg3MTM0MA==","repeats":1},{"count":872,"lower_bound":"LTMwMTk4NTA5NA==","upper_bound":"LTI5NDE1Nzc1Mw==","repeats":1},{"count":880,"lower_bound":"LTI5MTkxMjMyNg==","upper_bound":"LTI4OTI3MjEyNA==","repeats":1},{"count":888,"lower_bound":"LTI4NDQyMzUzMA==","upper_bound":"LTI3MjM4OTUxOA==","repeats":1},{"count":896,"lower_bound":"LTI2MDgzNzAxMw==","upper_bound":"LTI0OTk4MzU2NA==","repeats":1},{"count":904,"lower_bound":"LTI0NzI4NzYwMQ==","upper_bound":"LTIyOTk3NzkyNQ==","repeats":1},{"count":912,"lower_bound":"LTIyNjk5NTEyMg==","upper_bound":"LTIyMjk4NTg0Mw==","repeats":1},{"count":920,"lower_bound":"LTIyMTE1ODcyOQ==","upper_bound":"LTIxNDYxMjM5Nw==","repeats":1},{"count":928,"lower_bound":"LTIxMTE4OTg4NA==","upper_bound":"LTE5NTAxMTM3Mg==","repeats":1},{"count":936,"lower_bound":"LTE5Mjg4NTc5Nw==","upper_bound":"LTE3NTEwOTU2MQ==","repeats":1},{"count":944,"lower_bound":"LTE2MTU3NDM1Mw==","upper_bound":"LTE1MzE5NjA4Ng==","repeats":1},{"count":952,"lower_bound":"LTE0NjQ3NDgzMw==","upper_bound":"LTEzNjAzOTIyNw==","repeats":1},{"count":960,"lower_bound":"LTEzNDI4MDMzNw==","upper_bound":"LTEyNzA0NjY5OA==","repeats":1},{"count":968,"lower_bound":"LTExNTYwODY0MA==","upper_bound":"LTk4OTY5ODMz","repeats":1},{"count":976,"lower_bound":"LTk3MjIwMjYz","upper_bound":"LTkwNjIwMDg4","repeats":1},{"count":984,"lower_bound":"LTg2MzQxMjU4","upper_bound":"LTc2MjgyMTgw","repeats":1},{"count":992,"lower_bound":"LTcyNTIxOTc2","upper_bound":"LTU1NDcyMTU4","repeats":1},{"count":1000,"lower_bound":"LTUwNjc2NDYx","upper_bound":"LTQ3MjUxMzc4","repeats":1},{"count":1008,"lower_bound":"LTQ0MjYzNjY4","upper_bound":"LTI3NTE1NTEz","repeats":1},{"count":1016,"lower_bound":"LTIyNDEyMTkx","upper_bound":"LTM3OTMxMDU=","repeats":1},{"count":1024,"lower_bound":"MTI5NTc0MTI=","upper_bound":"MjU0MTY5ODU=","repeats":1},{"count":1032,"lower_bound":"MjY3OTcyMzc=","upper_bound":"MzI4NzU5MzA=","repeats":1},{"count":1040,"lower_bound":"NDYyMzc3Nzc=","upper_bound":"NjE3NDgxMjQ=","repeats":1},{"count":1048,"lower_bound":"NjYxMDkyMjg=","upper_bound":"Nzc3MzExNjQ=","repeats":1},{"count":1056,"lower_bound":"ODM4NDUzODA=","upper_bound":"OTM3Mjk3OTQ=","repeats":1},{"count":1064,"lower_bound":"OTQ5MTk3MjI=","upper_bound":"MTA1OTIyNTgw","repeats":1},{"count":1072,"lower_bound":"MTEzMTI2NjI0","upper_bound":"MTI2ODE3NTQ3","repeats":1},{"count":1080,"lower_bound":"MTMyNjQ2MzA0","upper_bound":"MTUyMTc2MzEw","repeats":1},{"count":1088,"lower_bound":"MTU4ODM4OTc5","upper_bound":"MTc0MzM2NTMy","repeats":1},{"count":1096,"lower_bound":"MTc0NzI3ODQ0","upper_bound":"MTgxNzIwOTc3","repeats":1},{"count":1104,"lower_bound":"MTg1OTY4MTMz","upper_bound":"MTk2OTQ0OTUx","repeats":1},{"count":1112,"lower_bound":"MTk3NDk0MzQz","upper_bound":"MjA2NDIyNjI2","repeats":1},{"count":1120,"lower_bound":"MjEzNTU4ODIz","upper_bound":"MjE2MTcyOTg3","repeats":1},{"count":1128,"lower_bound":"MjI0NjQ2NDY1","upper_bound":"MjM1MTc1NTY0","repeats":1},{"count":1136,"lower_bound":"MjQwODQxNDY2","upper_bound":"MjUxNzIzMzQy","repeats":1},{"count":1144,"lower_bound":"MjYyMjg1MTg2","upper_bound":"MjczMTYxNTEw","repeats":1},{"count":1152,"lower_bound":"Mjc0Mjg0NzI5","upper_bound":"Mjk5NzM3Njc0","repeats":1},{"count":1160,"lower_bound":"MzAxODA2NjQy","upper_bound":"MzE4MDk4Mjk5","repeats":1},{"count":1168,"lower_bound":"MzIxNjY2ODc4","upper_bound":"MzQwODcxMDg4","repeats":1},{"count":1176,"lower_bound":"MzQ0MDcwNDEy","upper_bound":"MzU2MjU4MjAy","repeats":1},{"count":1184,"lower_bound":"MzU5NDU2ODk1","upper_bound":"MzYyNjA5ODY0","repeats":1},{"count":1192,"lower_bound":"Mzc2NzQxODA3","upper_bound":"MzkxMTQzMzAx","repeats":1},{"count":1200,"lower_bound":"MzkxMzc1NzU4","upper_bound":"Mzk4MDM0NDM0","repeats":1},{"count":1208,"lower_bound":"Mzk5MTUxMDM0","upper_bound":"NDA1OTgzNjQ0","repeats":1},{"count":1216,"lower_bound":"NDEwNDE1MjA1","upper_bound":"NDI2NzEwMDI5","repeats":1},{"count":1224,"lower_bound":"NDI2OTk2NzA0","upper_bound":"NDUyMzM2NDU0","repeats":1},{"count":1232,"lower_bound":"NDcxNDg1OTg0","upper_bound":"NDg3MjM1OTY4","repeats":1},{"count":1240,"lower_bound":"NDg4NDUzNzcx","upper_bound":"NDk0ODQ3MDU5","repeats":1},{"count":1248,"lower_bound":"NDk3ODQ0MDQy","upper_bound":"NTA0NjcwMjg1","repeats":1},{"count":1256,"lower_bound":"NTA4ODE4MjMw","upper_bound":"NTE5MjcxMjc0","repeats":1},{"count":1264,"lower_bound":"NTI0MjA0NzM3","upper_bound":"NTMzMDI5ODI4","repeats":1},{"count":1272,"lower_bound":"NTMzNzcwNDM0","upper_bound":"NTQxMzA4MzQ3","repeats":1},{"count":1280,"lower_bound":"NTQ4NjI1OTkz","upper_bound":"NTY5MDAxNDU0","repeats":1},{"count":1288,"lower_bound":"NTcwMDI0MTQ5","upper_bound":"NTgxMTAxMzE1","repeats":1},{"count":1296,"lower_bound":"NTg0NzgxMjMy","upper_bound":"NjA3MzQwOTA1","repeats":1},{"count":1304,"lower_bound":"NjA3Njk3NDAw","upper_bound":"NjE0NzQ1NTky","repeats":1},{"count":1312,"lower_bound":"NjIwODQwMjEw","upper_bound":"NjIzMjg3MjQw","repeats":1},{"count":1320,"lower_bound":"NjI5ODU4Mzkw","upper_bound":"NjQzMDUwOTM4","repeats":1},{"count":1328,"lower_bound":"NjQ1MTE5Nzgx","upper_bound":"NjU1MzM0MDg4","repeats":1},{"count":1336,"lower_bound":"NjU2MDkzMjYz","upper_bound":"NjYwNjQwOTE2","repeats":1},{"count":1344,"lower_bound":"NjYzNzU4NDcw","upper_bound":"NjY3NDE4NTgw","repeats":1},{"count":1352,"lower_bound":"NjY5MzcwMDYw","upper_bound":"Njg3MDIwODc0","repeats":1},{"count":1360,"lower_bound":"Njg5NTY0NDk0","upper_bound":"Njk0NzA2ODI0","repeats":1},{"count":1368,"lower_bound":"NzAwOTY1NjMx","upper_bound":"NzE0Nzk2NzIw","repeats":1},{"count":1376,"lower_bound":"NzI0MzExMjkz","upper_bound":"NzMxNTUyNjIy","repeats":1},{"count":1384,"lower_bound":"NzM0Njg2ODcx","upper_bound":"NzM4Njk0Mjg5","repeats":1},{"count":1392,"lower_bound":"NzQ5ODUzMzIw","upper_bound":"NzY1NTA0MTU2","repeats":1},{"count":1400,"lower_bound":"NzcwMjY2MDg2","upper_bound":"Nzg0Mzg2NDE2","repeats":1},{"count":1408,"lower_bound":"Nzg1NzQyNjQ5","upper_bound":"Nzk5NjM1NTk4","repeats":1},{"count":1416,"lower_bound":"ODA1MTg3NjYw","upper_bound":"ODEyNjQ3MjAy","repeats":1},{"count":1424,"lower_bound":"ODE2MDQ5MDEw","upper_bound":"ODMxOTI5MTEy","repeats":1},{"count":1432,"lower_bound":"ODM5MDA1ODQw","upper_bound":"ODUzNzgwMzA5","repeats":1},{"count":1440,"lower_bound":"ODU2ODE3MDQ0","upper_bound":"ODY2MTk0MDgw","repeats":1},{"count":1448,"lower_bound":"ODY3MDAwNDU5","upper_bound":"ODc3Nzc1NzYz","repeats":1},{"count":1456,"lower_bound":"ODg0NzExNDky","upper_bound":"OTEyMTg0NTMw","repeats":1},{"count":1464,"lower_bound":"OTI3MzQyNTA5","upper_bound":"OTQyNjQyMTY5","repeats":1},{"count":1472,"lower_bound":"OTQ0MDI3MjQ5","upper_bound":"OTUwNjM0ODUx","repeats":1},{"count":1480,"lower_bound":"OTUyNjY4MTc1","upper_bound":"OTcxNTM4MDYz","repeats":1},{"count":1488,"lower_bound":"OTc0OTg2MTMz","upper_bound":"OTk5OTQ3ODk4","repeats":1},{"count":1496,"lower_bound":"MTAwMDU0ODgxMw==","upper_bound":"MTAxMTMzOTA2Ng==","repeats":1},{"count":1504,"lower_bound":"MTAxMzMxMTA5OQ==","upper_bound":"MTAyMjA3OTM0Ng==","repeats":1},{"count":1512,"lower_bound":"MTAyMzc1OTU1NQ==","upper_bound":"MTAzNDUxNDE2OQ==","repeats":1},{"count":1520,"lower_bound":"MTAzNTI3MDg2MQ==","upper_bound":"MTA1MjM3MDM4Ng==","repeats":1},{"count":1528,"lower_bound":"MTA2NDAxOTIxMA==","upper_bound":"MTA2Nzg5MDc5NA==","repeats":1},{"count":1536,"lower_bound":"MTA3MTQ2MTIzMw==","upper_bound":"MTA4NTcxMDA5OQ==","repeats":1},{"count":1544,"lower_bound":"MTA4ODk5MTk3MQ==","upper_bound":"MTEwMjYwNTIyMQ==","repeats":1},{"count":1552,"lower_bound":"MTEwNTQ2ODk2MQ==","upper_bound":"MTEwOTU5MzA3NA==","repeats":1},{"count":1560,"lower_bound":"MTEwOTYxNDgxNg==","upper_bound":"MTE0MTc2NTg2OA==","repeats":1},{"count":1568,"lower_bound":"MTE0NDMzNTkzMQ==","upper_bound":"MTE2MzkyMjAyOA==","repeats":1},{"count":1576,"lower_bound":"MTE3OTkyMTU4MA==","upper_bound":"MTIwMjMwNzA1Ng==","repeats":1},{"count":1584,"lower_bound":"MTIwMjYxOTM3OA==","upper_bound":"MTIwOTI3NjUyOA==","repeats":1},{"count":1592,"lower_bound":"MTIxMTg4MjYzOQ==","upper_bound":"MTIyMzc0NDQ5Ng==","repeats":1},{"count":1600,"lower_bound":"MTIyNzIyNjE4NA==","upper_bound":"MTIzNjQ1NzkwMQ==","repeats":1},{"count":1608,"lower_bound":"MTI1MTIzMTc3Nw==","upper_bound":"MTI2MDM0OTczNA==","repeats":1},{"count":1616,"lower_bound":"MTI2MTQ2NzQ2NQ==","upper_bound":"MTI2ODMwNzYxNQ==","repeats":1},{"count":1624,"lower_bound":"MTI3MTc0MDEwMA==","upper_bound":"MTMxODIxNjc4Nw==","repeats":1},{"count":1632,"lower_bound":"MTMxODM2OTQ5NQ==","upper_bound":"MTMzMDEzMzIxNg==","repeats":1},{"count":1640,"lower_bound":"MTMzMDYyNjIyNQ==","upper_bound":"MTM2OTY1NDQwNg==","repeats":1},{"count":1648,"lower_bound":"MTM3MjI5ODczNA==","upper_bound":"MTM4NzQ3ODA2NA==","repeats":1},{"count":1656,"lower_bound":"MTM4ODY5MTE3Mw==","upper_bound":"MTQwMTUyNDcyNQ==","repeats":1},{"count":1664,"lower_bound":"MTQwODE5Mjc0NQ==","upper_bound":"MTQyMTA1MTIzNA==","repeats":1},{"count":1672,"lower_bound":"MTQyNDUyODA4NQ==","upper_bound":"MTQ0MDQyNzI1Mw==","repeats":1},{"count":1680,"lower_bound":"MTQ0MTU2NTMzNg==","upper_bound":"MTQ1MDU4NTc5OQ==","repeats":1},{"count":1688,"lower_bound":"MTQ1MTA5OTQxOA==","upper_bound":"MTQ2ODU5NDc3MA==","repeats":1},{"count":1696,"lower_bound":"MTQ4OTIyNjQwMQ==","upper_bound":"MTUyMzE3MTMwMQ==","repeats":1},{"count":1704,"lower_bound":"MTU0MjAxMjAzNA==","upper_bound":"MTU1NTY1NDY1OA==","repeats":1},{"count":1712,"lower_bound":"MTU1NjcxOTY2MQ==","upper_bound":"MTU2Njc4ODc5Ng==","repeats":1},{"count":1720,"lower_bound":"MTU3MjA3NjcxNA==","upper_bound":"MTU4NzQyNjAxMw==","repeats":1},{"count":1728,"lower_bound":"MTYwMDQyNDkyOA==","upper_bound":"MTYxMTA4MDAwOQ==","repeats":1},{"count":1736,"lower_bound":"MTYxODI1MDcxNQ==","upper_bound":"MTYyOTM1NDAyOA==","repeats":1},{"count":1744,"lower_bound":"MTYzMjMyOTYxNA==","upper_bound":"MTYzOTk0ODE5Mg==","repeats":1},{"count":1752,"lower_bound":"MTY0NDQxNDY3OQ==","upper_bound":"MTY1MjM4ODkyMw==","repeats":1},{"count":1760,"lower_bound":"MTY1MzAyNjEzNg==","upper_bound":"MTY2NTEzNzg4OA==","repeats":1},{"count":1768,"lower_bound":"MTY2NTc2MzQzMw==","upper_bound":"MTY3MTM3MzU3OQ==","repeats":1},{"count":1776,"lower_bound":"MTY3MTU0NzcyNg==","upper_bound":"MTY4MzIxNDUxOQ==","repeats":1},{"count":1784,"lower_bound":"MTY4NjU2MzYxNQ==","upper_bound":"MTcwNjY1NTM5NQ==","repeats":1},{"count":1792,"lower_bound":"MTcwNjc5MjgwNw==","upper_bound":"MTcxNzI5NzA1OQ==","repeats":1},{"count":1800,"lower_bound":"MTcyNjM5Mzg5OQ==","upper_bound":"MTczODA5MjgwMQ==","repeats":1},{"count":1808,"lower_bound":"MTczODM2NzcxOQ==","upper_bound":"MTc0NzE5OTM5MQ==","repeats":1},{"count":1816,"lower_bound":"MTc1MDgyNDAwMA==","upper_bound":"MTc2MjkzODU2OA==","repeats":1},{"count":1824,"lower_bound":"MTc3MDE1NjgxMw==","upper_bound":"MTc4MDk2ODAyNg==","repeats":1},{"count":1832,"lower_bound":"MTc4Mzk3MjM4NA==","upper_bound":"MTc4ODI0NDk2NQ==","repeats":1},{"count":1840,"lower_bound":"MTc5MzM4NDAzOA==","upper_bound":"MTgwODEzOTY3Ng==","repeats":1},{"count":1848,"lower_bound":"MTgxMzgxMTY2Ng==","upper_bound":"MTgyODgyODc2OA==","repeats":1},{"count":1856,"lower_bound":"MTg0MzI2OTU0MQ==","upper_bound":"MTg0OTAzMjA3OA==","repeats":1},{"count":1864,"lower_bound":"MTg1MjYwNDAwNg==","upper_bound":"MTg2MDc4OTQ2MA==","repeats":1},{"count":1872,"lower_bound":"MTg2OTYxNjE2Mw==","upper_bound":"MTg3ODk3MzE3OQ==","repeats":1},{"count":1880,"lower_bound":"MTg3OTAxNDE2MA==","upper_bound":"MTg5NTg2MjA3Mw==","repeats":1},{"count":1888,"lower_bound":"MTkwMTQzNjI2NQ==","upper_bound":"MTkxNjMwMTAwOA==","repeats":1},{"count":1896,"lower_bound":"MTkxOTg0MjE1NQ==","upper_bound":"MTkzMDgyNzczMA==","repeats":1},{"count":1904,"lower_bound":"MTkzMjExOTYzMA==","upper_bound":"MTk0NTMwNTkxMw==","repeats":1},{"count":1912,"lower_bound":"MTk0NTQ2ODQyMA==","upper_bound":"MTk0OTI3NjkxOQ==","repeats":1},{"count":1920,"lower_bound":"MTk1MTEzMDk1OQ==","upper_bound":"MTk1ODMyODQ3Ng==","repeats":1},{"count":1928,"lower_bound":"MTk2MTUyNzU4NA==","upper_bound":"MTk3MjkzOTE3Ng==","repeats":1},{"count":1936,"lower_bound":"MTk3NTUzMzk5MA==","upper_bound":"MTk5MDY2NzUyNA==","repeats":1},{"count":1944,"lower_bound":"MTk5MTE4MDg4NQ==","upper_bound":"MjAwNzIzODQ0Mg==","repeats":1},{"count":1952,"lower_bound":"MjAwODQzNjM1MA==","upper_bound":"MjAxMTM3MTQwOQ==","repeats":1},{"count":1960,"lower_bound":"MjAxNzA0MDQ0NA==","upper_bound":"MjAyNjc1MzU0OQ==","repeats":1},{"count":1968,"lower_bound":"MjAzMzcxMjU5Nw==","upper_bound":"MjA3MTU3NDE2Mw==","repeats":1},{"count":1976,"lower_bound":"MjA4NzU5NzQ4Ng==","upper_bound":"MjA5NjU0MzI1Ng==","repeats":1},{"count":1984,"lower_bound":"MjEwMTQ0MDY0Ng==","upper_bound":"MjEwOTYwMTYzOQ==","repeats":1},{"count":1992,"lower_bound":"MjExNTA3MzUyNQ==","upper_bound":"MjEzMTQwODM0OA==","repeats":1},{"count":2000,"lower_bound":"MjEzOTk5NjkyOQ==","upper_bound":"MjE0NTc4Mzk3NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,3,2,0,1,1,1,0,0,0,1,3,2,0,2,0,0,0,1,0,1,2,0,0,0,2,1,1,1,0,0,0,0,0,2,0,1,0,2,1,1,2,0,0,1,2,0,3,0,2,1,0,0,0,2,1,0,1,1,1,0,0,3,1,0,0,1,1,1,0,2,3,1,1,1,1,0,1,1,2,0,1,0,0,0,0,1,1,3,1,0,5,2,1,1,1,2,1,1,1,1,5,0,0,2,2,2,0,0,1,2,2,1,0,1,2,1,1,0,1,1,2,0,2,2,2,1,1,0,4,1,1,4,1,0,0,2,1,0,0,0,0,1,1,0,2,0,2,0,0,0,3,1,0,1,1,1,2,0,1,4,3,1,0,2,1,1,0,0,1,1,3,1,1,1,3,1,1,3,2,0,5,1,0,1,1,0,1,1,2,5,1,2,0,0,1,1,2,1,0,1,1,3,2,0,1,0,0,0,1,0,2,2,2,2,1,0,3,2,0,0,0,1,2,0,1,0,2,1,2,0,3,0,0,0,1,0,1,1,0,0,1,0,1,1,0,1,1,0,0,1,1,1,0,1,1,1,1,2,0,1,2,2,0,2,4,3,2,2,0,0,0,2,1,2,0,2,1,2,2,1,1,1,0,0,2,1,2,1,3,0,1,0,0,1,3,0,0,1,3,1,0,0,1,0,2,3,2,2,1,0,1,3,0,1,1,1,0,3,1,0,1,1,1,1,2,0,1,0,2,0,0,0,1,0,1,1,2,2,0,1,1,0,2,0,1,1,0,1,2,2,2,1,1,0,0,2,1,1,0,0,0,0,0,0,0,0,1,0,2,4,2,3,1,1,2,2,0,0,1,1,0,3,2,4,0,2,1,1,1,1,1,0,0,1,2,0,1,0,1,2,0,2,3,3,1,1,1,0,0,3,2,0,0,0,1,0,3,1,0,4,0,0,1,0,1,0,1,1,1,2,0,0,1,0,0,0,2,1,2,1,1,0,1,0,0,2,1,1,0,0,2,0,1,1,2,0,0,1,0,1,1,1,0,2,1,0,2,1,1,0,0,1,2,0,0,1,2,0,3,1,0,0,0,3,0,1,3,0,0,0,3,0,2,1,1,1,1,1,0,1,1,0,0,2,2,0,0,1,0,1,1,4,0,0,1,1,2,0,2,1,1,0,0,1,1,0,0,0,1,0,2,1,0,0,2,0,2,1,4,1,2,1,1,0,3,0,0,2,1,2,0,1,3,1,2,2,0,1,1,1,1,0,0,1,0,1,1,0,0,2,0,0,1,1,1,0,0,0,0,1,1,0,0,0,3,1,0,1,0,0,3,0,0,1,0,2,0,1,2,1,0,0,3,0,4,2,1,1,1,3,2,3,2,0,1,0,1,1,3,0,2,2,5,1,2,0,3,2,1,2,1,1,2,1,2,3,2,1,1,1,0,0,1,1,1,0,0,1,1,0,0,2,2,2,1,0,1,2,1,0,2,0,1,2,0,0,1,2,0,2,2,0,0,2,1,2,0,1,2,1,0,3,0,2,2,2,1,1,0,1,2,2,1,0,1,2,1,1,0,0,1,2,0,1,2,0,0,2,0,1,1,1,0,1,1,1,0,2,0,2,3,1,1,1,2,1,1,1,0,1,0,2,2,1,1,0,1,2,0,2,0,0,2,2,0,0,0,1,1,1,0,1,1,1,1,2,1,2,1,1,3,0,1,2,1,1,0,3,1,0,1,0,0,0,0,1,1,0,0,1,1,0,1,1,0,2,2,0,1,0,1,1,0,0,2,0,1,2,1,1,0,1,1,0,1,2,1,1,4,1,2,0,0,1,1,1,0,0,2,2,1,1,1,0,0,3,3,0,0,0,1,2,1,0,2,0,1,3,2,2,1,2,1,0,0,2,0,2,2,0,1,1,2,0,0,0,0,0,1,0,2,0,1,2,0,1,1,1,1,2,1,1,0,1,2,1,0,0,1,2,0,0,5,1,1,1,0,1,1,0,0,1,2,0,0,1,1,1,0,1,1,1,0,2,2,0,0,2,0,0,1,2,1,1,0,2,1,0,0,1,1,0,2,1,3,1,1,1,3,2,0,1,3,0,1,1,1,3,0,0,0,0,1,1,0,1,2,3,0,0,2,1,1,0,2,0,0,0,0,3,1,1,2,1,1,1,1,4,1,2,0,1,0,2,2,0,0,1,0,2,3,0,2,1,1,0,0,3,0,0,1,1,1,2,1,1,1,1,2,0,0,1,0,0,2,5,2,0,2,0,1,0,0,2,0,0,0,0,1,0,1,0,1,2,0,1,5,0,1,1,0,1,2,1,0,2,0,0,1,0,2,2,2,0,2,1,1,0,0,0,1,2,2,1,1,2,0,0,1,0,0,0,2,0,0,0,0,1,2,2,0,0,4,2,2,1,1,0,1,0,2,2,2,0,4,1,1,0,1,3,0,2,0,0,0,1,1,0,0,3,0,1,0,1,0,0,1,0,0,1,3,1,0,0,0,0,2,1,1,3,3,3,2,3,1,1,1,0,0,3,0,0,0,2,0,0,2,1,0,3,0,2,0,0,1,0,1,1,0,2,2,2,1,0,0,1,0,0,1,2,2,0,1,0,1,1,1,2,1,0,1,0,0,1,0,2,3,1,1,2,3,3,1,0,1,1,1,0,0,1,1,0,0,0,0,1,1,1,1,0,0,2,1,0,1,2,1,1,0,0,1,2,1,3,1,1,1,0,1,1,2,3,0,2,0,0,1,0,1,0,0,0,3,0,2,1,0,0,3,1,1,2,2,0,1,4,1,1,2,0,1,1,0,2,1,0,1,3,1,0,0,0,1,0,1,1,4,1,0,0,1,0,2,1,0,2,1,0,1,0,1,2,1,1,1,1,3,1,2,0,0,1,1,3,1,0,0,1,3,0,1,0,2,0,0,1,0,1,2,0,2,3,1,0,1,0,0,0,0,0,3,2,0,2,1,1,2,0,0,2,1,1,0,1,1,0,0,0,0,1,1,0,0,0,2,2,1,1,1,0,1,0,0,1,2,3,3,1,0,2,0,2,1,2,1,0,0,5,0,2,1,0,2,2,0,0,2,3,0,0,0,2,1,3,0,2,1,2,0,1,0,0,0,1,1,0,1,2,0,1,0,1,0,1,1,1,2,0,0,0,1,1,1,0,0,0,1,2,0,0,1,0,1,0,1,0,0,2,0,1,0,0,0,1,1,1,1,2,0,2,0,1,0,1,1,4,0,1,1,3,1,1,0,2,1,1,1,2,2,3,0,0,0,2,1,0,1,0,0,1,1,2,5,0,0,2,1,0,3,1,2,0,0,0,1,1,0,1,1,0,1,0,2,1,2,3,1,1,1,0,1,0,1,2,0,2,0,1,1,1,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0,2,0,2,1,0,0,1,0,2,0,0,0,1,0,0,0,0,4,0,2,0,2,1,1,2,2,0,1,0,1,2,0,1,2,0,2,2,0,0,0,2,1,0,2,2,1,0,1,0,3,0,0,0,4,0,0,0,0,1,1,3,1,1,2,0,2,1,1,1,1,1,4,1,0,3,0,0,0,0,2,2,1,0,0,0,1,3,0,1,1,2,0,0,0,1,0,1,2,0,1,0,2,2,1,0,0,0,0,3,0,2,1,1,0,0,1,0,0,3,0,0,0,0,2,0,0,1,0,0,1,0,3,1,0,2,1,1,2,0,1,3,1,0,0,0,2,1,1,0,1,0,1,0,1,0,0,1,1,2,2,2,0,2,0,1,0,0,2,1,1,1,1,1,1,0,0,3,2,5,2,1,1,1,0,0,1,1,1,1,1,1,1,2,0,1,1,1,1,0,0,0,0,0,0,2,0,0,0,0,0,1,1,0,2,1,0,2,1,0,1,0,0,1,2,5,0,1,0,2,1,0,1,0,4,1,0,0,1,2,0,0,1,0,1,0,1,0,2,0,2,0,1,0,2,0,1,1,1,2,2,3,2,0,1,0,0,2,0,0,0,2,0,3,2,1,1,2,2,0,0,3,1,2,2,0,2,1,1,0,0,1,2,1,0,0,1,1,3,2,2,1,0,2,1,1,3,1,2,1,1,1,1,3,1,3,2,0,1,0,0,1,0,1,1,0,0,1,0,2,2,0,0,2,0,2,1,0,1,1,0,0,1,0,1,1,2,1,1,0,0,2,3,3,1,3,2,0,1,1,0,1,2,3,0,0,0,0,0,0,1,0,1,2,1,3,0,1,0,1,0,3,2,0,2,0,4,2,1,1,1,2,1,1,0,2,2,1,1,1,0,2,1,0,2,1,0,2,0,2,2,0,0,1,0,1,2,1,0,1,2,1,0,1,3,0,1,1,0,0,3,1,0,0,1,3,5,1,0,1,2,1,1,2,0,1,2,0,1,1,1,2,1,1,0,0,0,0,0,3,1,3,2,0,2,0,2,0,1,1,2,3,1,4,1,1,0,1,1,0,0,3,0,0,1,0,0,0,0,0,0,2,0,3,0,2,0,0,0,1,0,1,3,3,1,0,0,1,0,0,1,1,0,1,0,1,4,2,2,1,1,0]},{"counters":[2,1,0,2,1,0,1,2,0,3,2,1,1,0,3,0,1,0,0,1,1,1,1,0,0,1,1,0,0,3,3,0,1,0,0,2,1,0,1,0,0,2,1,3,2,0,1,0,1,3,2,2,0,1,1,1,2,1,1,1,0,1,0,1,0,0,1,0,1,1,0,2,1,1,0,1,0,0,0,1,1,2,0,0,1,3,0,1,2,3,0,2,0,1,0,0,3,1,2,0,1,2,0,1,0,1,1,3,1,1,0,1,0,2,1,3,0,0,2,0,2,2,0,1,0,0,1,1,1,1,1,2,2,0,2,1,1,0,1,0,0,1,0,1,2,0,3,1,1,0,1,0,0,1,0,1,0,3,0,2,1,1,1,2,2,2,3,1,2,1,0,0,1,1,3,2,2,2,0,0,3,0,0,0,1,2,0,1,2,0,3,1,2,0,1,1,0,1,1,1,2,3,1,0,2,1,1,1,0,1,0,0,0,0,3,0,0,0,2,1,1,0,1,1,0,0,1,0,1,1,0,0,0,1,0,3,2,1,2,2,2,0,2,0,1,4,1,0,1,0,1,1,0,0,1,0,0,1,1,1,0,0,2,1,1,0,2,0,0,0,2,1,1,1,1,0,2,1,0,1,2,0,0,3,0,1,1,1,4,0,0,2,1,1,0,0,1,1,0,1,1,1,0,0,1,1,1,1,0,1,0,1,0,0,1,1,2,0,3,1,0,0,0,1,0,1,2,1,1,1,1,3,3,0,0,1,0,1,3,0,1,1,2,0,1,0,0,0,0,0,1,2,2,1,3,2,0,1,1,1,0,2,0,0,2,0,0,0,1,1,1,0,1,1,1,0,1,1,0,1,2,3,1,2,0,0,2,0,1,1,1,0,0,0,1,1,1,2,1,1,1,2,2,1,0,1,2,2,0,1,1,0,0,2,0,1,2,2,1,1,2,0,0,0,0,0,3,5,0,2,0,2,0,1,3,1,1,0,1,0,1,1,0,1,0,0,2,1,2,0,1,0,0,0,0,2,0,1,1,1,1,2,1,0,2,0,2,1,2,2,2,1,0,1,0,1,0,1,2,2,0,0,0,2,1,0,1,0,1,2,2,2,1,0,0,0,2,2,0,1,3,0,0,1,0,1,2,0,2,0,1,1,1,0,1,0,1,2,0,0,2,1,0,0,0,2,2,0,1,0,2,0,0,1,2,1,0,1,1,2,1,1,3,1,1,0,1,0,0,1,1,2,3,3,1,1,1,0,3,2,0,0,2,0,1,1,1,2,1,2,1,2,0,0,1,0,2,2,2,2,0,0,2,1,1,1,0,0,0,0,0,0,0,1,1,1,1,0,1,2,1,1,2,2,0,0,2,1,0,2,1,3,2,0,0,1,1,2,1,1,2,4,1,1,0,1,1,1,1,0,1,0,0,0,1,0,1,2,0,1,1,1,2,0,0,2,1,1,0,1,3,0,0,1,2,1,3,2,0,0,1,1,1,0,4,3,2,2,1,2,0,2,1,1,1,1,0,1,2,0,2,0,1,2,0,0,0,0,0,1,5,1,2,3,1,1,1,1,0,1,1,1,2,1,2,0,0,0,1,0,1,0,0,0,1,1,1,2,2,1,0,1,2,0,1,1,1,0,0,0,0,2,5,1,2,2,2,0,0,1,1,0,3,0,3,0,1,0,0,1,0,1,0,1,0,2,1,0,1,0,0,1,2,0,1,0,0,0,1,1,1,1,0,0,0,2,1,0,2,0,1,2,1,2,3,0,4,1,2,1,1,2,2,4,2,3,1,1,2,0,0,0,0,1,1,1,1,2,0,0,1,0,4,3,0,0,2,1,2,2,0,0,0,1,2,1,1,0,0,3,4,1,1,0,2,1,1,2,0,1,1,1,2,2,1,3,1,0,1,1,3,1,1,0,0,1,1,1,2,1,0,0,2,0,1,3,0,0,0,1,2,0,2,1,1,1,0,2,0,0,0,2,2,1,0,2,0,1,1,0,2,3,1,2,0,2,0,1,0,0,0,0,0,2,2,1,1,0,0,1,0,2,2,4,1,0,0,0,0,0,2,0,0,1,1,3,2,0,2,1,0,2,2,0,1,1,0,1,1,1,0,0,0,0,1,0,1,0,0,0,4,0,1,1,0,0,2,1,2,1,1,0,0,0,0,1,0,0,2,1,1,0,1,1,1,0,0,0,2,1,1,0,0,1,0,1,2,1,0,3,0,1,0,2,0,0,1,0,2,0,3,1,3,1,2,0,1,0,0,1,2,0,0,1,1,4,0,0,2,1,1,1,0,2,0,1,1,1,3,1,1,2,0,0,1,4,1,0,0,2,3,2,1,1,2,0,0,2,2,1,1,0,0,0,1,0,0,2,0,0,1,0,2,2,1,2,1,1,0,1,0,0,2,0,2,2,0,2,1,2,1,4,1,0,2,2,1,1,0,0,0,4,3,1,2,0,0,1,1,0,2,2,2,1,0,0,0,2,2,1,0,0,0,2,1,0,1,2,0,2,2,3,1,3,1,2,1,1,2,2,2,1,1,3,3,0,1,4,1,0,1,2,1,0,0,0,0,0,0,0,1,0,1,3,1,0,0,3,1,0,0,0,0,0,0,1,0,1,2,3,0,2,0,0,0,1,0,0,2,2,2,1,0,0,0,1,0,2,1,0,0,0,0,0,1,0,0,0,0,0,2,1,2,1,1,0,3,0,3,1,1,0,1,1,0,2,1,1,0,2,0,1,1,0,3,1,0,1,0,1,1,0,0,2,2,2,2,0,1,0,0,2,1,0,0,1,0,2,0,3,2,1,1,2,2,1,1,0,1,1,0,1,0,0,1,0,0,0,1,2,1,1,1,2,0,0,0,1,1,5,1,0,0,1,2,0,0,0,0,2,0,0,2,2,2,1,2,0,3,1,0,0,0,2,0,1,1,2,1,0,1,1,2,1,0,0,1,1,1,1,0,2,1,0,1,1,0,3,1,0,0,1,1,0,1,2,0,0,1,2,2,1,2,0,1,0,1,3,0,1,2,0,3,1,5,1,0,4,0,1,0,0,2,1,2,0,2,0,0,1,3,0,0,0,0,0,1,1,0,0,0,3,1,0,0,1,2,1,1,1,1,1,0,1,1,1,1,1,3,0,2,3,2,1,0,3,0,2,1,0,1,1,1,1,1,1,1,0,1,1,1,3,3,1,1,1,1,2,1,0,0,2,0,2,1,0,1,1,2,1,1,3,2,1,0,1,1,1,1,1,1,0,0,0,0,1,1,3,1,0,1,1,4,0,1,0,0,2,1,3,4,0,2,5,2,0,0,0,0,1,0,2,1,0,2,2,1,0,1,0,2,3,0,1,0,2,1,2,1,1,1,0,0,0,1,2,1,3,2,2,1,0,0,1,0,0,1,1,2,2,1,0,0,1,0,0,3,0,1,1,3,0,0,0,1,0,2,1,0,2,0,0,0,1,1,2,1,1,3,4,3,1,0,0,2,0,0,1,2,1,2,0,1,2,3,4,3,1,0,0,0,2,0,1,2,1,1,2,1,1,2,1,2,2,0,1,1,1,3,0,0,1,0,0,0,1,1,1,2,1,1,0,1,0,0,2,0,2,0,0,3,1,1,1,3,1,0,1,0,0,0,1,1,0,1,2,5,2,0,0,1,0,1,1,2,0,1,1,1,1,3,1,0,0,2,0,3,3,0,2,1,1,1,0,1,0,0,2,0,3,2,1,1,1,2,1,1,2,1,0,1,2,1,0,1,2,0,0,0,0,1,0,1,0,1,1,0,1,0,0,0,1,1,1,1,0,2,0,2,4,1,2,1,0,0,2,1,1,0,1,1,0,0,2,1,0,0,1,1,1,1,1,1,0,1,1,2,0,1,1,0,0,0,1,1,0,2,1,2,1,0,1,0,1,1,4,1,0,0,3,1,0,0,2,0,0,1,0,1,0,0,0,1,0,1,2,0,1,2,2,0,1,2,0,2,0,0,0,0,0,3,1,4,2,2,0,0,0,1,2,2,3,2,1,0,1,1,2,0,2,1,2,0,2,0,1,1,4,0,1,1,0,2,1,0,0,2,4,0,1,4,0,1,0,1,0,1,0,0,0,0,3,1,0,2,1,2,1,3,2,1,0,1,3,2,0,0,0,0,4,0,1,2,3,1,1,2,3,0,0,1,0,0,0,1,0,1,1,2,2,3,0,0,2,0,0,0,0,0,1,2,0,0,0,1,1,0,2,0,1,1,2,1,1,0,4,1,0,1,4,1,2,2,2,0,1,0,2,0,0,0,1,2,0,1,4,1,0,0,1,2,0,1,0,0,0,0,1,1,1,2,0,0,0,2,0,2,0,1,1,2,0,1,0,2,0,0,2,3,1,0,1,1,1,1,0,1,1,1,0,0,1,0,0,1,0,0,4,1,2,1,2,1,2,0,0,0,2,1,0,3,1,3,0,2,1,0,1,1,2,1,1,1,1,0,0,1,0,0,0,0,2,3,0,3,1,2,1,0,2,3,1,1,2,0,2,0,1,2,0,1,1,1,0,2,3,0,0,0,0,1,0,0,0,1,1,0,1,1,1,0,3,3,0,3,1,0,1]},{"counters":[0,2,0,1,2,0,0,2,1,3,2,0,0,1,1,0,1,1,0,1,2,2,1,1,0,1,1,0,2,0,0,4,1,0,0,0,1,1,0,0,0,1,1,0,1,1,0,2,1,1,0,1,1,1,1,2,2,2,3,2,1,1,0,1,0,2,1,1,0,0,0,0,0,2,1,1,0,2,0,0,1,0,0,1,2,2,0,1,0,2,0,0,3,2,2,0,2,0,1,0,0,0,1,2,1,3,0,0,3,0,0,0,1,0,0,1,1,1,1,1,1,2,1,3,3,0,0,1,0,0,1,1,1,1,1,0,2,1,3,0,2,3,1,0,3,1,4,1,0,1,0,0,2,2,0,0,4,4,2,1,0,1,2,1,1,1,1,1,0,0,0,1,2,2,0,1,0,2,1,0,1,2,2,1,2,0,0,2,1,2,0,2,0,1,0,2,1,0,1,2,1,2,2,1,2,3,1,1,1,0,1,0,0,1,1,2,0,1,0,1,0,0,0,0,1,2,1,1,1,1,2,1,0,0,1,2,0,1,0,2,2,0,0,1,2,0,2,2,1,0,1,1,3,0,1,0,0,0,1,0,1,1,1,1,2,2,0,1,2,2,1,0,1,1,0,0,0,3,1,2,4,0,1,0,2,1,2,2,0,1,1,0,1,1,1,1,0,2,0,0,0,2,1,1,2,1,1,1,2,1,1,1,0,0,4,2,0,0,1,1,0,0,1,1,2,1,0,1,1,2,2,0,0,1,0,2,1,1,1,0,1,1,0,0,3,0,1,1,1,0,1,2,0,1,1,0,1,0,2,0,2,0,0,1,1,3,5,1,4,0,0,2,2,1,2,0,1,2,0,1,0,2,0,0,0,0,1,2,0,0,0,0,2,0,1,2,0,0,2,2,2,1,0,1,1,1,2,0,0,3,2,2,1,0,1,1,0,1,0,1,0,0,1,3,0,2,3,0,0,1,1,1,0,1,2,1,0,1,1,0,1,2,1,2,4,1,0,0,1,1,1,1,3,0,1,1,1,0,0,2,1,0,1,1,1,0,1,2,0,0,0,0,0,0,2,0,1,1,1,1,0,1,0,0,1,2,0,0,0,0,0,1,1,1,0,0,5,4,1,0,1,0,0,0,0,0,0,2,1,1,2,0,0,1,2,1,0,1,2,1,2,0,0,1,2,0,1,1,1,2,0,1,3,3,4,1,0,0,0,1,2,1,0,0,0,1,0,1,0,0,0,0,0,0,3,0,0,1,0,0,1,1,0,3,3,0,0,1,1,1,1,1,0,0,2,0,1,2,0,1,3,3,1,3,0,2,1,1,1,1,1,2,0,0,0,0,0,3,2,2,0,1,2,0,1,0,0,0,1,0,1,1,1,0,1,0,0,2,2,2,1,2,2,0,1,1,1,0,2,0,1,3,0,1,1,1,1,1,0,0,2,0,0,0,2,0,0,2,0,1,2,0,1,0,0,1,0,2,0,2,0,2,1,0,1,1,0,1,2,0,1,1,0,0,1,1,1,0,0,2,5,2,1,2,2,2,3,0,1,2,0,1,1,0,0,0,4,0,4,1,0,3,2,1,4,0,1,1,0,0,1,0,0,1,2,0,0,3,1,3,2,1,1,0,0,1,0,0,1,0,0,0,1,2,1,1,1,1,2,2,1,2,1,1,1,3,1,0,0,1,1,0,2,1,2,0,2,4,1,3,1,1,1,0,0,1,0,0,0,0,2,0,1,1,0,0,1,3,2,1,2,0,1,0,1,0,0,1,0,0,0,2,0,1,0,0,1,0,1,1,5,0,1,0,1,1,1,2,1,1,0,1,0,3,1,1,0,4,1,1,1,0,1,3,1,2,4,0,2,0,2,3,3,0,2,2,1,0,1,0,3,1,2,0,0,1,0,2,2,0,0,0,1,0,2,0,1,1,4,2,1,1,2,1,0,2,1,0,0,0,1,2,0,0,1,0,0,2,1,2,0,0,0,2,0,1,0,0,1,1,3,1,0,0,0,0,2,2,2,0,1,1,0,0,2,1,0,3,1,0,1,0,0,0,1,1,2,3,0,1,2,1,2,2,1,1,1,1,1,3,1,1,1,0,1,0,3,0,1,1,1,1,0,1,0,1,0,1,0,0,0,2,1,0,0,0,2,2,1,0,2,2,0,2,1,1,3,0,3,2,1,3,1,3,1,0,1,0,0,0,0,3,1,0,5,1,1,2,0,0,1,0,1,0,2,1,2,1,1,1,0,1,1,1,1,3,1,0,3,0,0,2,2,0,0,0,2,0,1,0,1,1,1,2,2,0,0,0,0,1,0,0,0,1,0,1,0,0,4,2,1,1,1,0,0,0,2,1,1,1,2,2,1,4,0,0,2,2,1,3,1,0,4,0,0,1,1,2,0,1,1,2,1,1,1,0,2,3,1,2,2,1,0,0,0,5,0,1,0,2,0,0,1,2,1,1,3,0,0,1,1,0,1,0,1,0,0,2,0,1,1,2,2,2,0,0,0,2,1,1,0,0,1,2,2,1,0,0,2,0,1,1,2,1,1,1,2,4,1,1,1,1,0,1,0,1,2,1,3,0,0,0,1,1,0,2,1,3,0,1,2,1,0,2,2,1,2,2,0,1,2,3,1,2,0,1,0,0,1,0,1,1,1,0,1,2,2,4,1,1,2,1,0,1,0,0,0,1,0,2,0,1,1,1,2,1,1,0,0,0,3,0,1,1,1,3,0,0,1,1,0,0,1,1,1,2,1,0,0,1,1,2,1,0,1,2,1,0,1,4,1,0,1,0,1,1,2,0,1,1,0,1,0,0,2,0,0,0,1,2,1,1,1,1,0,1,1,0,1,1,0,0,0,0,2,1,0,2,0,3,2,0,2,1,0,3,1,0,0,0,1,0,1,0,1,0,2,1,1,1,0,0,1,1,1,0,0,2,2,0,2,0,2,1,1,1,2,0,2,3,1,0,0,2,0,2,1,1,2,1,2,1,2,0,1,2,3,0,1,1,4,0,2,0,2,2,1,0,1,2,1,0,0,0,1,3,1,1,3,1,0,3,1,3,0,1,0,0,0,0,1,0,4,2,1,1,0,1,1,2,1,1,0,0,2,3,3,3,0,0,1,0,0,2,2,0,0,1,3,0,1,1,0,0,0,0,0,3,0,2,1,2,1,0,2,0,1,0,3,2,1,2,1,0,0,0,1,0,1,1,2,2,0,1,0,0,1,0,1,1,0,0,0,0,0,3,0,1,1,0,0,1,2,2,2,0,1,2,0,3,1,1,1,1,0,2,2,1,0,0,0,0,1,0,1,2,1,1,3,0,2,3,1,3,0,0,0,0,2,1,2,3,1,2,0,3,2,1,1,2,0,1,3,2,3,1,0,1,1,0,0,0,4,1,0,1,0,0,1,2,0,0,3,2,0,0,1,1,2,0,0,1,0,2,1,0,0,1,1,0,0,2,0,0,0,0,0,2,4,1,0,1,0,0,0,1,2,1,0,2,2,1,0,0,1,0,1,2,1,4,3,0,1,1,0,2,0,1,1,2,0,0,1,2,0,0,4,2,3,0,2,2,1,0,2,1,1,1,2,1,1,2,0,0,2,1,1,0,1,0,0,1,3,1,1,0,1,1,2,0,1,0,1,0,0,0,2,1,0,1,1,1,1,2,0,0,2,0,0,0,1,0,1,0,3,1,1,2,0,0,1,0,2,0,0,3,2,0,0,1,2,0,1,0,0,2,0,0,0,2,0,1,0,1,0,0,2,4,1,3,0,1,1,3,0,0,0,0,0,0,1,3,0,4,1,0,1,0,1,2,1,2,1,1,1,3,0,1,1,0,0,1,0,2,3,1,0,0,0,2,0,1,0,1,1,0,1,3,1,1,1,3,1,0,1,0,0,2,1,0,0,0,0,3,0,1,2,0,1,1,0,0,0,2,0,0,3,3,0,0,1,0,1,0,3,0,2,1,1,3,1,3,1,0,2,1,1,0,2,0,2,3,0,2,0,0,0,1,4,0,2,1,1,1,0,0,0,1,3,0,1,2,0,2,2,0,1,1,1,1,1,2,3,4,1,0,1,0,0,0,1,1,1,2,2,2,0,2,1,1,0,1,1,0,2,2,2,1,0,0,1,2,1,1,1,0,0,0,0,1,1,1,1,3,1,0,0,2,2,0,0,3,2,1,0,1,0,0,1,0,3,2,0,0,1,1,0,0,0,1,0,1,0,0,1,0,1,2,1,1,4,1,1,2,2,0,3,0,2,1,0,2,0,0,1,1,0,1,2,0,1,0,1,0,0,0,4,1,1,0,2,0,1,1,2,1,0,1,2,1,2,1,1,1,1,2,1,0,1,0,1,0,1,3,1,0,0,0,0,0,1,3,2,1,1,1,1,1,1,0,2,0,0,1,1,1,1,0,3,0,0,0,1,2,0,1,1,1,0,0,0,0,1,1,1,3,1,1,3,1,1,0,0,3,0,2,0,0,1,0,1,0,0,1,1,3,1,2,0,0,0,0,0,1,2,0,1,2,2,0,0,0,4,0,0,6,0,0,1,0,3,1,1,0,1,1,1,2,1,2,1,3,0,2,1,1,2,0]},{"counters":[0,4,0,1,1,0,1,0,0,0,1,2,1,2,0,1,1,0,0,2,1,3,0,3,1,2,0,2,1,4,0,1,1,2,1,2,1,0,1,2,0,0,1,2,1,1,1,1,1,0,1,1,2,1,1,2,0,1,1,0,0,0,1,1,0,2,1,2,0,0,0,0,0,1,1,1,0,0,1,0,1,2,0,2,1,3,2,0,1,0,1,1,0,3,1,1,5,1,2,1,0,0,1,1,0,1,2,1,2,0,0,3,3,3,0,1,3,0,1,0,0,1,3,2,1,2,0,1,0,0,1,0,1,0,0,3,2,1,0,0,0,0,1,3,0,1,1,0,0,1,0,0,0,1,1,1,2,1,2,1,1,2,2,0,1,1,1,2,1,0,1,2,1,0,1,1,0,2,0,0,2,0,1,0,3,0,1,0,1,0,2,1,2,1,0,0,0,0,2,1,2,0,2,0,2,1,3,1,1,1,1,1,0,1,0,3,3,0,2,1,1,1,2,1,1,0,0,4,0,2,0,0,1,0,2,1,1,1,1,0,0,0,0,1,0,2,2,2,3,0,1,0,2,0,0,1,4,0,3,0,1,0,2,1,0,0,3,0,0,1,2,1,3,0,1,0,0,0,1,1,2,0,1,2,3,0,1,1,2,1,2,1,1,1,2,3,1,1,0,0,2,2,0,1,2,2,0,1,2,1,1,2,0,2,2,4,0,3,0,1,2,0,3,1,0,2,0,0,1,0,1,0,3,0,0,1,1,0,1,1,0,0,3,0,2,0,0,2,0,2,2,1,1,0,2,1,0,0,1,0,0,2,0,0,2,1,4,0,0,2,2,1,0,0,0,0,0,0,3,2,0,1,1,2,2,0,0,0,0,2,1,1,0,0,1,0,1,3,0,0,4,2,2,2,2,0,1,0,0,0,0,3,3,2,3,0,1,0,0,0,2,2,0,1,1,2,0,0,1,1,2,1,0,2,1,2,2,0,1,0,0,1,0,2,1,1,1,1,0,0,1,0,0,1,3,1,3,3,1,0,3,1,0,1,0,1,2,3,2,0,0,3,0,1,4,0,1,1,0,0,1,1,2,0,0,1,0,0,1,0,1,1,0,2,0,0,2,0,2,1,1,2,0,0,0,0,1,1,0,1,1,1,0,0,0,1,3,0,3,1,0,2,0,0,2,2,0,0,5,1,4,0,2,3,0,2,1,2,1,0,0,2,0,1,1,2,1,2,0,1,5,3,0,0,0,1,2,0,1,0,1,0,1,0,0,2,2,1,2,1,1,0,1,0,1,1,2,1,0,1,1,0,0,3,0,0,1,2,1,3,0,1,1,0,2,1,1,1,0,1,2,1,4,1,0,3,0,3,2,0,0,0,0,1,0,0,0,0,1,1,0,1,0,0,1,0,3,0,0,2,1,0,2,2,0,0,0,0,1,1,0,0,0,2,1,0,0,1,3,1,1,1,1,0,2,0,0,1,1,1,2,1,0,0,1,1,1,2,2,1,0,1,2,1,1,1,1,1,0,1,1,1,1,0,2,1,0,1,1,1,0,1,2,0,2,0,1,2,0,3,1,1,2,2,0,2,2,0,3,1,0,4,1,1,1,0,1,0,1,1,1,0,1,3,0,2,1,0,1,1,1,1,0,1,0,1,1,6,0,2,1,0,0,4,1,2,0,2,1,2,0,0,0,1,0,0,2,0,0,0,0,2,2,0,1,0,0,1,0,0,0,1,1,2,1,1,1,1,4,0,1,2,2,4,2,3,1,1,0,2,1,1,2,0,0,2,0,4,0,0,2,0,0,3,3,3,1,2,0,2,2,2,1,1,0,2,0,1,0,0,0,1,1,1,0,1,3,1,1,1,0,0,0,1,3,1,1,2,0,0,1,1,0,1,0,2,4,0,0,0,0,0,1,1,2,1,1,1,0,1,3,1,0,0,0,1,0,0,1,1,1,1,2,0,2,0,1,3,0,0,2,1,4,1,2,3,0,1,1,1,0,3,2,0,0,1,2,0,4,1,0,2,1,0,1,0,2,0,2,1,0,0,0,2,2,0,1,3,1,2,0,1,1,2,2,1,0,3,2,2,0,0,0,0,1,1,0,0,0,0,0,0,2,0,0,1,0,0,0,1,0,1,1,0,1,0,1,1,2,3,0,0,2,0,0,1,0,1,1,2,1,1,0,0,0,0,0,0,0,1,0,0,0,2,1,1,0,1,1,0,3,0,3,3,2,1,1,0,1,0,1,2,0,1,0,0,1,1,1,1,2,1,2,1,1,1,2,1,0,1,1,0,0,1,1,2,2,1,1,3,2,0,2,0,1,0,1,1,1,3,3,0,3,0,1,1,0,1,0,3,0,0,1,0,0,0,1,1,0,2,1,0,0,2,0,0,1,0,1,0,1,1,1,0,1,2,3,0,1,0,0,1,1,1,0,2,1,1,0,0,3,0,0,0,2,0,1,2,0,3,2,2,2,2,2,0,1,1,1,0,0,1,2,4,3,2,4,1,1,0,1,1,1,1,1,2,0,0,1,1,2,0,0,2,2,0,1,1,0,2,2,2,1,0,0,0,1,1,3,0,2,1,1,1,2,2,1,0,0,1,0,1,0,1,1,0,1,0,0,1,3,1,0,1,0,2,1,0,2,3,1,0,1,0,0,1,1,0,0,1,2,0,0,1,2,1,1,2,1,0,0,1,2,4,1,1,0,0,2,1,1,1,1,1,2,0,2,1,3,0,0,0,1,2,0,0,1,0,2,3,1,1,0,1,0,0,0,3,2,1,2,1,1,0,1,1,0,0,2,2,0,0,3,0,3,1,0,3,0,0,1,1,0,0,2,1,1,2,0,1,1,3,1,0,0,1,0,2,0,0,1,0,0,1,5,2,1,1,2,0,0,1,2,1,1,1,0,0,1,1,0,1,1,1,2,0,2,0,1,0,2,2,0,0,0,1,0,0,0,0,0,0,2,1,0,0,0,0,3,3,0,0,1,1,1,2,0,1,0,3,0,3,2,1,1,0,2,0,0,1,1,1,0,2,2,2,3,1,1,3,0,3,0,1,2,0,2,2,0,0,0,0,2,1,1,1,2,0,1,0,1,2,0,1,0,1,2,0,0,2,0,1,0,1,0,1,1,2,1,2,0,0,0,3,1,2,1,1,1,2,0,0,0,2,1,2,2,1,0,0,0,1,1,1,2,3,1,1,0,3,0,0,3,1,1,1,3,0,2,0,0,0,1,1,3,1,1,1,0,2,0,1,2,0,1,2,0,1,0,0,2,3,1,0,1,2,2,0,2,1,0,2,1,0,1,1,2,0,2,1,1,1,1,0,0,3,2,0,0,0,2,0,0,0,2,1,1,1,0,0,0,1,0,1,0,1,3,2,3,1,0,1,0,0,0,0,1,0,2,1,2,1,1,0,0,2,0,0,0,0,1,1,0,2,1,1,1,2,0,2,0,0,1,0,0,2,2,0,0,3,1,1,1,1,0,1,2,2,1,0,2,3,1,0,0,1,1,2,0,2,2,1,1,0,1,4,3,0,0,1,1,1,0,0,0,4,2,1,2,2,0,0,2,2,1,0,1,0,2,1,1,0,1,0,2,1,2,3,2,1,0,2,1,0,0,0,0,1,1,1,0,0,1,1,2,1,1,1,0,0,0,1,2,2,1,4,2,0,0,2,0,1,3,0,0,0,1,1,1,1,0,1,0,2,1,1,0,0,1,0,1,0,0,1,0,1,2,3,1,2,1,1,1,0,1,0,2,0,0,1,3,1,4,2,3,1,1,1,0,2,0,1,1,1,1,3,2,0,2,2,0,0,2,0,0,0,1,0,0,0,1,2,2,0,1,0,0,1,0,1,0,0,1,2,0,1,0,0,0,0,0,1,0,1,1,2,0,1,2,0,4,1,2,1,1,1,1,1,3,2,1,0,0,1,1,0,0,3,2,0,0,2,0,0,0,1,2,2,0,1,1,1,0,2,0,0,0,0,1,1,1,3,0,0,0,1,0,1,1,0,2,1,2,1,2,0,0,1,2,0,2,0,0,0,3,0,1,0,2,0,2,0,1,1,2,0,3,1,2,2,4,1,0,0,2,2,2,1,0,0,1,0,3,0,0,1,0,0,0,1,0,0,2,1,0,1,0,2,0,1,1,2,1,1,1,3,1,0,1,1,0,0,1,0,1,1,3,2,1,1,1,1,0,0,1,1,1,2,1,0,0,0,1,2,1,0,1,0,2,0,1,2,0,0,1,1,0,1,0,0,0,1,2,3,2,0,2,1,3,1,0,0,0,1,0,1,1,0,0,0,2,0,0,2,1,0,2,0,1,2,1,2,0,0,2,0,2,1,1,0,1,1,0,1,0,3,1,0,2,0,2,2,1,0,0,2,1,1,0,1,1,0,0,0,2,2,2,2,3,0,1,1,0,0,0,1,0,2,0,1,0,0,2,1,0,0,2,1,1,2,4,1,0,2,0,2,1,1,1,1,0,2,1,1,0,2,0,1,3,2,0,3,1,2,1,0,0,3,0,2,0,0,1,2,3,2,1,0,0,1,2,1,0,1,1,0,3,0,0,1,6,4,0,1,0,0,1,1]},{"counters":[0,1,1,1,3,0,0,2,0,2,1,0,1,3,1,1,1,0,0,1,0,0,0,0,0,1,0,1,1,2,1,0,0,0,0,3,2,2,2,1,1,2,0,0,0,1,0,2,2,1,1,0,0,2,1,0,1,1,0,2,0,1,1,0,2,2,1,1,0,0,1,1,0,2,2,0,0,1,2,0,0,1,1,0,1,1,0,1,0,3,1,0,1,0,0,0,2,0,0,1,0,2,0,3,0,0,0,1,0,1,2,1,0,0,1,0,0,1,1,1,0,0,1,0,2,3,1,1,3,0,2,3,3,2,0,0,2,1,1,2,1,0,0,0,0,0,1,1,1,3,2,1,0,2,1,2,3,1,2,2,1,0,0,1,1,2,2,0,1,0,1,1,0,0,1,0,0,0,0,2,1,2,0,1,1,2,3,0,1,2,0,1,1,1,1,2,0,0,2,0,2,2,0,0,3,0,1,0,2,1,1,1,3,1,0,2,0,5,1,0,2,1,2,0,1,2,3,2,1,1,1,1,1,1,1,0,1,2,0,0,1,0,3,0,0,1,0,1,1,2,1,0,0,1,0,4,3,2,0,0,1,1,0,0,0,1,0,0,0,1,1,1,1,2,0,0,0,0,0,0,0,0,2,0,0,0,1,4,0,0,1,0,1,0,0,1,1,0,2,1,1,0,5,2,2,0,1,3,0,0,0,0,2,2,0,3,0,2,0,0,1,0,2,2,0,2,1,0,2,0,1,0,1,0,3,1,1,0,0,2,1,1,1,1,1,0,3,1,0,1,0,2,2,0,2,1,2,2,1,4,1,3,1,0,2,1,0,3,1,1,1,0,0,0,0,2,1,0,1,1,3,0,1,0,4,3,2,1,2,1,1,0,3,2,0,1,2,1,0,0,1,2,2,0,1,1,2,0,0,1,1,1,2,0,1,1,3,2,0,1,0,2,1,1,0,2,2,0,0,0,0,0,0,2,0,0,2,0,3,0,3,3,0,1,1,1,1,1,0,1,1,1,2,1,1,0,3,1,1,0,0,1,2,1,1,1,2,1,1,3,1,2,1,0,0,1,2,0,1,2,0,3,1,0,0,1,2,2,1,1,1,1,1,0,0,2,1,2,2,2,1,2,1,1,0,1,0,0,1,0,0,1,1,1,2,4,2,1,0,2,2,0,1,2,0,0,1,1,1,0,2,1,1,2,1,1,0,0,0,0,2,2,3,0,0,1,0,0,2,0,0,1,3,1,2,0,1,1,0,0,1,1,2,2,0,1,1,2,3,2,2,2,0,0,1,1,2,0,1,2,2,1,0,1,1,1,3,2,1,0,2,3,1,2,0,2,1,1,0,2,3,2,0,0,3,1,0,3,0,0,0,0,0,0,1,2,0,2,4,1,3,1,2,0,0,0,1,2,0,1,1,0,1,1,2,1,0,0,1,0,2,0,0,0,1,0,1,1,0,1,2,3,2,3,0,2,2,0,0,1,2,1,1,0,2,0,3,0,2,0,0,1,1,2,1,0,0,1,0,1,0,2,1,1,1,0,3,2,2,0,2,0,2,4,0,3,1,0,0,3,1,1,0,2,2,1,0,1,1,0,1,3,0,0,0,1,1,2,1,1,0,2,0,1,0,3,1,1,1,0,2,2,1,2,4,1,0,1,1,1,0,0,1,1,1,0,2,1,0,0,2,0,2,1,2,3,1,2,1,0,1,1,2,0,1,1,2,0,0,0,0,0,0,0,0,3,0,1,3,1,0,1,1,1,0,2,0,3,0,0,2,0,2,4,2,3,0,0,0,1,0,0,0,1,1,1,1,0,0,0,1,0,1,2,0,3,1,0,0,0,0,0,0,0,0,0,1,3,0,0,4,1,2,2,1,3,2,0,2,1,1,0,1,1,3,1,0,0,3,0,0,1,0,1,0,1,3,0,2,1,1,1,1,1,2,0,0,1,0,0,0,1,0,2,0,2,1,1,0,0,1,0,0,1,0,1,0,1,2,3,1,1,2,0,1,2,1,1,2,0,0,1,1,1,1,0,0,0,1,0,1,1,2,1,0,0,0,3,0,0,1,0,0,3,0,0,0,0,0,1,0,1,1,1,1,0,0,2,1,0,1,1,0,0,2,1,0,0,1,1,2,3,0,1,0,0,3,1,4,3,2,1,0,1,1,2,0,2,1,1,0,2,0,1,4,1,1,1,2,2,1,0,1,1,1,1,1,1,2,1,1,1,5,2,0,0,1,1,2,0,0,2,1,1,0,0,2,2,0,1,1,1,1,2,0,0,2,2,0,0,2,0,5,0,3,0,1,0,0,1,1,0,0,1,1,1,2,5,0,1,2,1,0,1,1,1,1,2,1,2,0,3,2,1,0,2,2,0,0,0,3,1,1,0,0,0,0,1,1,0,0,0,0,0,2,0,1,1,0,3,1,4,0,3,2,1,0,2,0,0,0,0,0,0,0,1,0,3,0,3,1,2,1,0,3,0,2,0,0,2,2,0,1,2,1,1,1,1,0,0,0,0,1,3,1,1,3,1,2,2,2,0,1,3,0,1,1,1,0,0,2,0,1,1,2,1,0,1,1,0,1,2,0,1,2,0,2,1,1,0,2,2,1,1,3,1,2,0,2,0,1,0,1,2,0,2,2,0,2,0,1,0,0,0,1,0,2,1,2,0,1,1,2,3,0,1,1,0,1,0,1,2,1,2,1,0,2,1,0,1,2,1,0,0,0,0,0,0,1,0,2,2,1,0,3,2,1,1,1,1,2,1,2,0,3,1,0,1,0,2,1,1,0,3,1,0,2,1,0,1,1,1,2,1,0,1,0,0,0,0,1,1,1,2,1,1,4,1,3,2,1,2,0,0,1,3,1,1,3,0,1,0,0,1,1,1,1,0,3,1,1,3,0,2,0,0,0,0,1,2,2,1,0,4,1,3,1,0,0,2,1,1,0,0,2,1,2,1,0,3,1,2,0,2,0,3,2,1,3,3,0,3,1,0,0,1,3,2,2,1,0,0,2,3,1,0,1,1,0,1,0,2,0,2,3,0,1,1,3,0,1,0,1,0,1,1,1,0,0,0,2,2,0,1,3,1,1,1,0,1,0,1,0,0,1,1,0,0,0,0,1,0,0,0,1,0,2,1,2,2,1,0,2,0,1,0,1,0,0,1,0,0,0,1,1,1,3,2,0,1,1,1,5,1,2,0,0,0,1,1,0,2,1,1,1,0,1,2,1,0,0,0,1,1,0,3,1,0,1,2,1,0,2,3,2,0,0,3,1,1,0,0,0,0,0,1,1,1,1,4,2,0,2,1,0,0,1,0,1,0,0,1,1,0,0,1,2,1,2,1,1,1,0,0,0,1,1,0,0,1,1,4,0,0,0,0,1,0,1,1,0,1,0,1,0,2,0,1,2,1,2,0,2,0,2,1,2,0,1,3,1,1,1,2,0,1,2,5,1,2,1,1,0,0,1,0,0,1,1,2,1,0,3,0,1,1,2,1,1,0,1,0,1,3,2,3,1,1,5,1,0,0,1,1,0,1,1,0,1,0,2,0,0,1,2,0,0,0,4,1,1,0,0,1,3,1,1,0,1,0,2,3,1,1,2,1,3,1,1,1,0,2,1,2,0,1,0,2,0,1,1,0,1,4,2,0,0,0,0,0,1,2,1,1,2,0,2,0,2,0,2,0,2,2,0,2,0,2,0,2,1,2,0,2,1,0,0,1,1,0,2,0,3,2,0,0,0,1,0,0,0,0,0,1,0,1,1,2,2,2,0,0,1,0,1,0,1,1,1,1,0,2,2,0,0,1,1,1,1,1,0,0,1,0,0,1,0,0,0,0,2,0,3,0,2,1,1,0,2,2,1,0,2,0,1,1,2,2,1,1,0,0,2,1,1,0,0,1,2,0,1,1,0,0,0,1,1,0,1,0,4,2,1,2,2,1,0,0,0,1,0,0,1,1,1,0,0,1,0,2,2,2,1,0,0,0,1,1,0,0,0,2,3,0,1,0,0,3,2,2,4,0,0,1,0,3,2,2,1,0,2,1,2,2,2,1,1,0,0,2,0,3,0,0,1,0,2,0,0,1,1,0,2,1,0,2,1,0,1,2,1,1,1,0,0,2,1,3,0,2,0,1,1,0,0,2,0,1,0,1,1,2,1,1,3,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,1,2,3,2,1,1,0,1,0,1,0,1,1,0,3,0,1,0,1,1,1,0,1,0,0,0,0,0,4,0,1,0,2,2,0,0,0,3,0,0,0,2,3,1,1,2,0,4,3,3,1,0,0,0,2,0,4,1,1,3,0,0,0,0,1,1,0,0,1,0,3,0,1,0,1,1,1,1,0,1,2,1,1,0,1,0,1,2,0,2,0,2,2,1,0,1,1,3,1,1,0,1,2,1,1,1,0,0,0,2,2,0,2,2,2,2,1,0,0,1,0,2,0,1,1,0,0,2,1,0,0,1,1,2,2,3,1,0,1,1,0,0,2,1,1,1,1,3,0,0,0,0,0,2,3,0,0,0,0,2,1,0,0,1,0,0,0,1,1,1,1,0,0,0,0,0,2,1]}]},"null_count":0,"last_update_version":397952049660035072},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDQ4NzYyMTc=","upper_bound":"LTIxMzQ5MzY0NjA=","repeats":1},{"count":16,"lower_bound":"LTIxMjg4OTgzNjY=","upper_bound":"LTIwOTc0NjM4MjU=","repeats":1},{"count":24,"lower_bound":"LTIwOTUzNzA5MTI=","upper_bound":"LTIwNjE4ODEyNjI=","repeats":1},{"count":32,"lower_bound":"LTIwNTYzODE1ODI=","upper_bound":"LTIwNTE4NjE4MjE=","repeats":1},{"count":40,"lower_bound":"LTIwNTE3MzI4OTc=","upper_bound":"LTIwNDEyMTA0NDk=","repeats":1},{"count":48,"lower_bound":"LTIwMzk3NzAxMTg=","upper_bound":"LTIwMzQwOTQ5NDI=","repeats":1},{"count":56,"lower_bound":"LTIwMzIwMzA2Mzk=","upper_bound":"LTIwMTY3MDU3MTc=","repeats":1},{"count":64,"lower_bound":"LTIwMTA2MzcwNTQ=","upper_bound":"LTE5ODYxNjI5MDU=","repeats":1},{"count":72,"lower_bound":"LTE5ODI5NTk4MDM=","upper_bound":"LTE5NzQwNTI3Mjc=","repeats":1},{"count":80,"lower_bound":"LTE5Njk4MDc4ODA=","upper_bound":"LTE5NTMzMTc5MTU=","repeats":1},{"count":88,"lower_bound":"LTE5NTI5MTIxNTI=","upper_bound":"LTE5NDE0MTkyNTM=","repeats":1},{"count":96,"lower_bound":"LTE5MzYwNDkzOTQ=","upper_bound":"LTE5MzEwMzMwMjM=","repeats":1},{"count":104,"lower_bound":"LTE5Mjk1MDc5OTc=","upper_bound":"LTE5MTg5MzU5NDU=","repeats":1},{"count":112,"lower_bound":"LTE5MTg0NTUwOTI=","upper_bound":"LTE4OTk2NTQzNzI=","repeats":1},{"count":120,"lower_bound":"LTE4ODIxMDQwNDM=","upper_bound":"LTE4NjEwOTI5Njg=","repeats":1},{"count":128,"lower_bound":"LTE4NTkyMjI3NjE=","upper_bound":"LTE4NDg3OTEyNDk=","repeats":1},{"count":136,"lower_bound":"LTE4NDA3MjM4NTM=","upper_bound":"LTE4MzE2NzMzNzM=","repeats":1},{"count":144,"lower_bound":"LTE4MjEwMDY4MzY=","upper_bound":"LTE4MTEwMTkyODA=","repeats":1},{"count":152,"lower_bound":"LTE4MDkzODM0ODA=","upper_bound":"LTE3OTc1MTk3Mzg=","repeats":1},{"count":160,"lower_bound":"LTE3ODg4NDI3MzU=","upper_bound":"LTE3ODM0OTE1NDk=","repeats":1},{"count":168,"lower_bound":"LTE3ODI0NjA0Nzg=","upper_bound":"LTE3Njg4OTQ2MTM=","repeats":1},{"count":176,"lower_bound":"LTE3NjE1ODUyNjU=","upper_bound":"LTE3NTc2NDU4NzE=","repeats":1},{"count":184,"lower_bound":"LTE3NTQ3NTU5OTk=","upper_bound":"LTE3NDcwNTk3MjU=","repeats":1},{"count":192,"lower_bound":"LTE3NDM4MjgxMzM=","upper_bound":"LTE3MzgxNTMwMjY=","repeats":1},{"count":200,"lower_bound":"LTE3Mzc0NTQyMTg=","upper_bound":"LTE3MzEzMDc2MjQ=","repeats":1},{"count":208,"lower_bound":"LTE3MjExODM3NTg=","upper_bound":"LTE3MTA3NjAyMjc=","repeats":1},{"count":216,"lower_bound":"LTE3MTA0MjgwNDg=","upper_bound":"LTE2OTM4OTA1NDg=","repeats":1},{"count":224,"lower_bound":"LTE2OTMyMDczMDc=","upper_bound":"LTE2ODIyMzI5MjI=","repeats":1},{"count":232,"lower_bound":"LTE2NzM1NDIxNDA=","upper_bound":"LTE2NTk2NjY2MTI=","repeats":1},{"count":240,"lower_bound":"LTE2NTM5NDA5NTg=","upper_bound":"LTE2NTAzNTc4MzM=","repeats":1},{"count":248,"lower_bound":"LTE2NDYxNDc3Mzk=","upper_bound":"LTE2NDE1ODQ2NTc=","repeats":1},{"count":256,"lower_bound":"LTE2MzI1ODkxNzA=","upper_bound":"LTE2MTI1NTY5ODY=","repeats":1},{"count":264,"lower_bound":"LTE2MTA2MzQwNDE=","upper_bound":"LTE2MDEzMzQ0NDg=","repeats":1},{"count":272,"lower_bound":"LTE1OTc4OTU2Mjc=","upper_bound":"LTE1ODg3NzI3NjE=","repeats":1},{"count":280,"lower_bound":"LTE1Nzk1MjgwMjU=","upper_bound":"LTE1NjgyMDQ2NTg=","repeats":1},{"count":288,"lower_bound":"LTE1NjM4MTQ1NTE=","upper_bound":"LTE1NDE3NjYwODM=","repeats":1},{"count":296,"lower_bound":"LTE1MzUwNDg1NTg=","upper_bound":"LTE1MjI4NzYzMDQ=","repeats":1},{"count":304,"lower_bound":"LTE1MTg1NDg1NDc=","upper_bound":"LTE1MDE0MDc3ODQ=","repeats":1},{"count":312,"lower_bound":"LTE1MDEzMDI2Nzk=","upper_bound":"LTE0OTQxNTg1Njg=","repeats":1},{"count":320,"lower_bound":"LTE0ODQ5MjI0Mzg=","upper_bound":"LTE0ODEwOTkyNjk=","repeats":1},{"count":328,"lower_bound":"LTE0Nzc2NDM3NjY=","upper_bound":"LTE0NjQzNTAyMDk=","repeats":1},{"count":336,"lower_bound":"LTE0NTA5NjMxOTA=","upper_bound":"LTE0NDU0MTU1NTQ=","repeats":1},{"count":344,"lower_bound":"LTE0Mzc2NDA3OTQ=","upper_bound":"LTE0MjcwNDQzNTM=","repeats":1},{"count":352,"lower_bound":"LTE0MjUyMTMzNzI=","upper_bound":"LTE0MjE0OTI5ODQ=","repeats":1},{"count":360,"lower_bound":"LTE0MjEzNDE3Njk=","upper_bound":"LTE0MTMyMzg1OTE=","repeats":1},{"count":368,"lower_bound":"LTE0MDc1NjAxOTM=","upper_bound":"LTEzOTQwMDczNTg=","repeats":1},{"count":376,"lower_bound":"LTEzOTM1OTc1MzM=","upper_bound":"LTEzODIzNzQ0MDM=","repeats":1},{"count":384,"lower_bound":"LTEzODE3NzgxMjQ=","upper_bound":"LTEzNjM0MjYxMjk=","repeats":1},{"count":392,"lower_bound":"LTEzNjI4NDcxNDI=","upper_bound":"LTEzMzE1MjkwNzI=","repeats":1},{"count":400,"lower_bound":"LTEzMTc2NDY3NTU=","upper_bound":"LTEzMDM4NTIwMDI=","repeats":1},{"count":408,"lower_bound":"LTEzMDIwNTc5NTY=","upper_bound":"LTEyOTk3NTQzNTY=","repeats":1},{"count":416,"lower_bound":"LTEyOTU1MTQxMDU=","upper_bound":"LTEyODY5MDMyNjE=","repeats":1},{"count":424,"lower_bound":"LTEyODA4NjY5NTc=","upper_bound":"LTEyNzczMDkwNTk=","repeats":1},{"count":432,"lower_bound":"LTEyNzIxMzYzNjM=","upper_bound":"LTEyNDYxNzcxNjY=","repeats":1},{"count":440,"lower_bound":"LTEyNDUzNTk3OTk=","upper_bound":"LTEyMzAzMjg5NDI=","repeats":1},{"count":448,"lower_bound":"LTEyMjg0OTAwNDU=","upper_bound":"LTEyMDAwMjIwMDM=","repeats":1},{"count":456,"lower_bound":"LTExOTgxMTM5Njg=","upper_bound":"LTExODY4MjU0MjI=","repeats":1},{"count":464,"lower_bound":"LTExNzYzMjA4MjI=","upper_bound":"LTExNjA2MDcxNTI=","repeats":1},{"count":472,"lower_bound":"LTExNTQxODIzNjk=","upper_bound":"LTExNTEzMjc2MjI=","repeats":1},{"count":480,"lower_bound":"LTExNDk5OTA5MTQ=","upper_bound":"LTExMzU0NDUzNzk=","repeats":1},{"count":488,"lower_bound":"LTExMzQzMzk4NTU=","upper_bound":"LTExMjMxMzAzNzM=","repeats":1},{"count":496,"lower_bound":"LTExMjEyMjY4NzY=","upper_bound":"LTEwOTc2NDcxNzg=","repeats":1},{"count":504,"lower_bound":"LTEwOTAyMTg0NzY=","upper_bound":"LTEwNTEyNjM2NjE=","repeats":1},{"count":512,"lower_bound":"LTEwNDU0ODA2NDU=","upper_bound":"LTEwMzk5ODM1MDA=","repeats":1},{"count":520,"lower_bound":"LTEwMzQ2NDc5MDU=","upper_bound":"LTEwMTg0NDU0ODU=","repeats":1},{"count":528,"lower_bound":"LTEwMTI2NTk1ODU=","upper_bound":"LTEwMDczMDIwMTI=","repeats":1},{"count":536,"lower_bound":"LTEwMDQ4MTIwNzk=","upper_bound":"LTk3NTgxOTA5Nw==","repeats":1},{"count":544,"lower_bound":"LTk3MDg2NzYwNQ==","upper_bound":"LTk2NjQxMDk4Ng==","repeats":1},{"count":552,"lower_bound":"LTk2MzY4MDU0MA==","upper_bound":"LTk1NzQ0ODQ1OA==","repeats":1},{"count":560,"lower_bound":"LTk1NjQ5MzM2MA==","upper_bound":"LTkzODk1NTg0Nw==","repeats":1},{"count":568,"lower_bound":"LTkzODEyMjkxMg==","upper_bound":"LTkyODYzNzQzMg==","repeats":1},{"count":576,"lower_bound":"LTkyNjY3NzM5MA==","upper_bound":"LTkwODQ4Nzg4OQ==","repeats":1},{"count":584,"lower_bound":"LTg5Nzg1MzkzOA==","upper_bound":"LTg5MzQ5NjU0MA==","repeats":1},{"count":592,"lower_bound":"LTg5MTIzNzg2NQ==","upper_bound":"LTg3OTc4MDQ5NQ==","repeats":1},{"count":600,"lower_bound":"LTg2NTczNDc1OA==","upper_bound":"LTgzNjczMDY2Ng==","repeats":1},{"count":608,"lower_bound":"LTgzNjUyMzYzOQ==","upper_bound":"LTgyODcxNjg1MQ==","repeats":1},{"count":616,"lower_bound":"LTgxNDk3NjQ5NA==","upper_bound":"LTgwMDIyNzEwMw==","repeats":1},{"count":624,"lower_bound":"LTc5OTAzNDY5OQ==","upper_bound":"LTc4MDI1MDQ0Nw==","repeats":1},{"count":632,"lower_bound":"LTc3NjY0NTM2NA==","upper_bound":"LTc2NDQ0OTY2Mg==","repeats":1},{"count":640,"lower_bound":"LTc1OTc1NTM2MA==","upper_bound":"LTc1MjE5MzA1MA==","repeats":1},{"count":648,"lower_bound":"LTc0MjM5NzQ2Mg==","upper_bound":"LTcyNzcyNDA5OQ==","repeats":1},{"count":656,"lower_bound":"LTcyNjQ5OTQ2Mw==","upper_bound":"LTcxODYwMTE1Ng==","repeats":1},{"count":664,"lower_bound":"LTcxMjE2OTI3Ng==","upper_bound":"LTY4MzMyMDc1Mg==","repeats":1},{"count":672,"lower_bound":"LTY4MDg5OTMzMw==","upper_bound":"LTY2OTEwNjc5OA==","repeats":1},{"count":680,"lower_bound":"LTY1NzU0ODc5OQ==","upper_bound":"LTY0NTYyNzMyOA==","repeats":1},{"count":688,"lower_bound":"LTY0MzA1NDY0Nw==","upper_bound":"LTYzMDg3MjkzOQ==","repeats":1},{"count":696,"lower_bound":"LTYyNDg3NjU4OQ==","upper_bound":"LTYxMjI1ODU0OQ==","repeats":1},{"count":704,"lower_bound":"LTYwODY2ODgzNg==","upper_bound":"LTYwMDk1MDY4NA==","repeats":1},{"count":712,"lower_bound":"LTU3NTYwNzAwOQ==","upper_bound":"LTU2NDM1MjQzNg==","repeats":1},{"count":720,"lower_bound":"LTU1NzMxOTY4MA==","upper_bound":"LTU0OTMzNTAxMg==","repeats":1},{"count":728,"lower_bound":"LTU0NTc3NzM0MA==","upper_bound":"LTU0Mzk1NDk1Mw==","repeats":1},{"count":736,"lower_bound":"LTU0MzEzMjM3MA==","upper_bound":"LTUyNzUwNDk0NA==","repeats":1},{"count":744,"lower_bound":"LTUyNTQwODgxNQ==","upper_bound":"LTUwNTUxMjAyNw==","repeats":1},{"count":752,"lower_bound":"LTUwNDU2OTUxNw==","upper_bound":"LTQ5NTE4MjE1Nw==","repeats":1},{"count":760,"lower_bound":"LTQ4ODIxODk5Ng==","upper_bound":"LTQ1NTkyMDMwOQ==","repeats":1},{"count":768,"lower_bound":"LTQ1NDgzODQ1NA==","upper_bound":"LTQ0NDk0MDQ1OQ==","repeats":1},{"count":776,"lower_bound":"LTQ0MzI4NjUwNg==","upper_bound":"LTQzNjQxOTU5Mw==","repeats":1},{"count":784,"lower_bound":"LTQzMjYyNDgyNw==","upper_bound":"LTQwMjA3OTQ0Mw==","repeats":1},{"count":792,"lower_bound":"LTM5NDI0NjYwMg==","upper_bound":"LTM4NDQ3MTk0NA==","repeats":1},{"count":800,"lower_bound":"LTM4MjczNzE0OA==","upper_bound":"LTM3MDQxNjAyNw==","repeats":1},{"count":808,"lower_bound":"LTM2NTI4ODE3MQ==","upper_bound":"LTM1Mzc0MDIwNA==","repeats":1},{"count":816,"lower_bound":"LTM0ODk4NjA1NA==","upper_bound":"LTM0MjQ2NDkwNw==","repeats":1},{"count":824,"lower_bound":"LTM0MjQyMDYzMw==","upper_bound":"LTM0MDc4NDEzNA==","repeats":1},{"count":832,"lower_bound":"LTMzODg0NTA1Nw==","upper_bound":"LTMyMDU3ODA4Nw==","repeats":1},{"count":840,"lower_bound":"LTMxNzI5MjUxOA==","upper_bound":"LTMxMzQ3MTY5Ng==","repeats":1},{"count":848,"lower_bound":"LTMwMzM0MzY0MQ==","upper_bound":"LTI5NzQwMzQxMQ==","repeats":1},{"count":856,"lower_bound":"LTI5NjY1MTI4OA==","upper_bound":"LTI3NTczNTM4NQ==","repeats":1},{"count":864,"lower_bound":"LTI3Mzg4MTg4MQ==","upper_bound":"LTI1OTQzNTg2NQ==","repeats":1},{"count":872,"lower_bound":"LTI1MTk2MzM1OA==","upper_bound":"LTI0NTcxNzcyOQ==","repeats":1},{"count":880,"lower_bound":"LTI0MzYwMDAwNw==","upper_bound":"LTIzMjMzNzA5Nw==","repeats":1},{"count":888,"lower_bound":"LTIyODA2NzAyOQ==","upper_bound":"LTIwODA1NjUwNQ==","repeats":1},{"count":896,"lower_bound":"LTIwNTU3NDIzMw==","upper_bound":"LTE4Nzg4ODQ0MA==","repeats":1},{"count":904,"lower_bound":"LTE4MTU3MTk1OA==","upper_bound":"LTE3MDA0MTA4Mg==","repeats":1},{"count":912,"lower_bound":"LTE2MDg5Njc1NA==","upper_bound":"LTE1NDAzOTk0Nw==","repeats":1},{"count":920,"lower_bound":"LTE1MDY4NjQ5Mg==","upper_bound":"LTEzMzczNTcxOQ==","repeats":1},{"count":928,"lower_bound":"LTEzMTgyOTc5Nw==","upper_bound":"LTEyMTIxNDI5NQ==","repeats":1},{"count":936,"lower_bound":"LTExNjgwMDg4Mw==","upper_bound":"LTExMzQ3MzE5Mw==","repeats":1},{"count":944,"lower_bound":"LTEwODk2MjM3OQ==","upper_bound":"LTEwMTczMDIzMA==","repeats":1},{"count":952,"lower_bound":"LTk2MTg2MzM3","upper_bound":"LTc4ODg3NTUx","repeats":1},{"count":960,"lower_bound":"LTczMTQ4MDI1","upper_bound":"LTcwODc5NDA5","repeats":1},{"count":968,"lower_bound":"LTY5NzI2ODY3","upper_bound":"LTU0NzkxMDMy","repeats":1},{"count":976,"lower_bound":"LTU0NDgzNjg3","upper_bound":"LTQwNTEwNTc1","repeats":1},{"count":984,"lower_bound":"LTM0OTg0NTYz","upper_bound":"LTI3MzUzMjk3","repeats":1},{"count":992,"lower_bound":"LTI0NjI5NzA3","upper_bound":"LTc1NzIzODE=","repeats":1},{"count":1000,"lower_bound":"LTczNzQxNDk=","upper_bound":"MTAyNTY3","repeats":1},{"count":1008,"lower_bound":"MTQ0NTAyMDU=","upper_bound":"MTk2MzI5Mjg=","repeats":1},{"count":1016,"lower_bound":"MzA1NDk3MzM=","upper_bound":"MzYyNjcxODM=","repeats":1},{"count":1024,"lower_bound":"MzgwOTYyODQ=","upper_bound":"NDcyMjU4OTM=","repeats":1},{"count":1032,"lower_bound":"NTI2NDU5NzY=","upper_bound":"NTc3MTczMjc=","repeats":1},{"count":1040,"lower_bound":"NjE1MjQwODI=","upper_bound":"NjkyNzU0Mjk=","repeats":1},{"count":1048,"lower_bound":"Njk3NDk1MTI=","upper_bound":"ODExNzY2MTQ=","repeats":1},{"count":1056,"lower_bound":"ODQ2MTU5NjM=","upper_bound":"MTA0MTYxNzE4","repeats":1},{"count":1064,"lower_bound":"MTExMTM5NzI1","upper_bound":"MTE2MDkwOTky","repeats":1},{"count":1072,"lower_bound":"MTIxODI1MTIz","upper_bound":"MTM0MjE3MzQx","repeats":1},{"count":1080,"lower_bound":"MTM0NzA3OTY4","upper_bound":"MTQ2NDc5ODMz","repeats":1},{"count":1088,"lower_bound":"MTQ2NzM2MDU5","upper_bound":"MTUwNjY0MjI5","repeats":1},{"count":1096,"lower_bound":"MTUwNzgxMzcw","upper_bound":"MTU4MjI5NDA0","repeats":1},{"count":1104,"lower_bound":"MTYwMTUwMjg3","upper_bound":"MTgwMTAwNzIy","repeats":1},{"count":1112,"lower_bound":"MTg1Mzc2ODc2","upper_bound":"MTk2MzU0NzAx","repeats":1},{"count":1120,"lower_bound":"MTk4OTUxMjAy","upper_bound":"MjE4OTc0MDQw","repeats":1},{"count":1128,"lower_bound":"MjIzNDEyNDg2","upper_bound":"MjMxNDk2MzUx","repeats":1},{"count":1136,"lower_bound":"MjQyMjM5MTc0","upper_bound":"MjU3MzQ1MTA5","repeats":1},{"count":1144,"lower_bound":"MjU3Njk3ODc0","upper_bound":"MjY2ODA3ODY4","repeats":1},{"count":1152,"lower_bound":"MjcwODg5Mzky","upper_bound":"Mjc2NzY1MjE4","repeats":1},{"count":1160,"lower_bound":"Mjc4Mzc3MTg2","upper_bound":"Mjg4MTk5MTg3","repeats":1},{"count":1168,"lower_bound":"Mjg5NDY2Njk3","upper_bound":"Mjk2MzA1NDEx","repeats":1},{"count":1176,"lower_bound":"MzAzNTg2OTAw","upper_bound":"MzA4MjQxMDE0","repeats":1},{"count":1184,"lower_bound":"MzExNTYxMjQ0","upper_bound":"MzE4NDIwNDY2","repeats":1},{"count":1192,"lower_bound":"MzM0ODM3MzI2","upper_bound":"MzQwMzkyODAx","repeats":1},{"count":1200,"lower_bound":"MzUwOTQ0NDg0","upper_bound":"MzU5NDY4MDE5","repeats":1},{"count":1208,"lower_bound":"MzYwMDM0MjY3","upper_bound":"Mzk0MDQ4OTYz","repeats":1},{"count":1216,"lower_bound":"Mzk0OTQ2MTIx","upper_bound":"NDEwNjM2OTU3","repeats":1},{"count":1224,"lower_bound":"NDExNzYyODk1","upper_bound":"NDM1MzQwMzQ2","repeats":1},{"count":1232,"lower_bound":"NDM2ODgxMTQw","upper_bound":"NDYyMjY3Nzc3","repeats":1},{"count":1240,"lower_bound":"NDY4Nzk0MDgx","upper_bound":"NTA4NDU2ODM5","repeats":1},{"count":1248,"lower_bound":"NTIyNDA5NDk1","upper_bound":"NTI1NDMyODkz","repeats":1},{"count":1256,"lower_bound":"NTI2MjcxNjUw","upper_bound":"NTMxNDE1NDAy","repeats":1},{"count":1264,"lower_bound":"NTQwNjQ4MzI1","upper_bound":"NTU3MDM5NzAy","repeats":1},{"count":1272,"lower_bound":"NTU4MDQxMTc2","upper_bound":"NTcyMjE5ODI4","repeats":1},{"count":1280,"lower_bound":"NTc0NjQwODE5","upper_bound":"NTgwMTU0MTA5","repeats":1},{"count":1288,"lower_bound":"NTgwMTg1OTgx","upper_bound":"NTkwMTc3NjYx","repeats":1},{"count":1296,"lower_bound":"NTk0MTUzOTkx","upper_bound":"NTk2MzE4MDk5","repeats":1},{"count":1304,"lower_bound":"NjA0NzEyNzMw","upper_bound":"NjE0ODE2NDE3","repeats":1},{"count":1312,"lower_bound":"NjE3OTA0ODcw","upper_bound":"NjI1MDM3MTA5","repeats":1},{"count":1320,"lower_bound":"NjI2MjE1OTE3","upper_bound":"NjM0ODYwMzEx","repeats":1},{"count":1328,"lower_bound":"NjM2MzgxMzE3","upper_bound":"Njc5MDM1MTI4","repeats":1},{"count":1336,"lower_bound":"NjgxODA0NzE5","upper_bound":"Njg3OTg2OTQw","repeats":1},{"count":1344,"lower_bound":"Njg5MjcwMDc2","upper_bound":"NzE5MDI2MTQ0","repeats":1},{"count":1352,"lower_bound":"NzIxNDI3MDAz","upper_bound":"NzI5Mzc5OTQz","repeats":1},{"count":1360,"lower_bound":"NzMzNDEzNDY4","upper_bound":"NzUwNTU2MDky","repeats":1},{"count":1368,"lower_bound":"NzUzMjc2NzE3","upper_bound":"Nzg2OTcwNzky","repeats":1},{"count":1376,"lower_bound":"Nzg3OTA0NDcx","upper_bound":"NzkzNzAxMzM4","repeats":1},{"count":1384,"lower_bound":"Nzk4MDU3ODUw","upper_bound":"ODE5OTQxMjIz","repeats":1},{"count":1392,"lower_bound":"ODM4MzY4MzMy","upper_bound":"ODQ2MTU0NTI2","repeats":1},{"count":1400,"lower_bound":"ODQ5NjQ4Nzg2","upper_bound":"ODU3NjM5Njg1","repeats":1},{"count":1408,"lower_bound":"ODU4MzQ4MjMz","upper_bound":"ODY4NDQxODk2","repeats":1},{"count":1416,"lower_bound":"ODcxMzkyMzQ3","upper_bound":"ODg0MTE0MTIx","repeats":1},{"count":1424,"lower_bound":"ODg5MTUwNDg2","upper_bound":"OTA5OTU1NTY3","repeats":1},{"count":1432,"lower_bound":"OTEwMjgzNTkw","upper_bound":"OTEzOTU4ODcw","repeats":1},{"count":1440,"lower_bound":"OTIwMTE3MTAw","upper_bound":"OTMxNjk3NjE0","repeats":1},{"count":1448,"lower_bound":"OTM1MDEwNDg4","upper_bound":"OTM5MzU3NTMz","repeats":1},{"count":1456,"lower_bound":"OTQ2MDAzOTgx","upper_bound":"OTU4MDc0NDM3","repeats":1},{"count":1464,"lower_bound":"OTYxNzk5NTM3","upper_bound":"OTY4ODM1NDcz","repeats":1},{"count":1472,"lower_bound":"OTcwNjgxNTU2","upper_bound":"OTgzMjYzODYw","repeats":1},{"count":1480,"lower_bound":"OTgzNDUzNzA1","upper_bound":"OTg3MzE1Nzgz","repeats":1},{"count":1488,"lower_bound":"OTkzNjA4NDgw","upper_bound":"MTAxMzQ5MDgwMg==","repeats":1},{"count":1496,"lower_bound":"MTAyNzA0MDEzOQ==","upper_bound":"MTAzNzIzNTcxMA==","repeats":1},{"count":1504,"lower_bound":"MTAzOTE1MjUzOA==","upper_bound":"MTA0OTU5MzIwNg==","repeats":1},{"count":1512,"lower_bound":"MTA1MDgyNjgyMA==","upper_bound":"MTA3ODc3NzIwNw==","repeats":1},{"count":1520,"lower_bound":"MTA5NzUxMDUwOA==","upper_bound":"MTExMDUwMzQ4Ng==","repeats":1},{"count":1528,"lower_bound":"MTExNTQxNjQzNA==","upper_bound":"MTEyNzU2MTA2Mg==","repeats":1},{"count":1536,"lower_bound":"MTEzMDMxNzUxOA==","upper_bound":"MTEzNzE1MDQ0NA==","repeats":1},{"count":1544,"lower_bound":"MTE0MTAyMjYzOQ==","upper_bound":"MTE1MDI1NzA2MA==","repeats":1},{"count":1552,"lower_bound":"MTE1MzAyMjQ4NA==","upper_bound":"MTE1OTI0NzExNw==","repeats":1},{"count":1560,"lower_bound":"MTE2MDU4MjEwNg==","upper_bound":"MTE3MTAzODIxOQ==","repeats":1},{"count":1568,"lower_bound":"MTE3ODExOTI5OA==","upper_bound":"MTE5NjAyMjMzOQ==","repeats":1},{"count":1576,"lower_bound":"MTIwMDEzNzIzNw==","upper_bound":"MTIzMTM2MTM2OQ==","repeats":1},{"count":1584,"lower_bound":"MTIzMzk0Njc3Mw==","upper_bound":"MTI1MTUyNzI2Mg==","repeats":1},{"count":1592,"lower_bound":"MTI1NTA0NzkxMQ==","upper_bound":"MTI4NjkxNjU3MA==","repeats":1},{"count":1600,"lower_bound":"MTI4ODg2NTg2MA==","upper_bound":"MTI5OTUxODg4NQ==","repeats":1},{"count":1608,"lower_bound":"MTMwOTQ1NjI1OQ==","upper_bound":"MTMyNDM3NzM5OA==","repeats":1},{"count":1616,"lower_bound":"MTMyNDc3OTc2Mw==","upper_bound":"MTM0Mjg2MDIxMA==","repeats":1},{"count":1624,"lower_bound":"MTM0NjQxOTQyMQ==","upper_bound":"MTM2NTQ1NDk3Nw==","repeats":1},{"count":1632,"lower_bound":"MTM2ODYzNDAwOQ==","upper_bound":"MTM4NjgxOTM3Nw==","repeats":1},{"count":1640,"lower_bound":"MTM5MDkyNDc1OA==","upper_bound":"MTM5NjYwNDYzMQ==","repeats":1},{"count":1648,"lower_bound":"MTM5ODUzNjg5Ng==","upper_bound":"MTQwODY4MjYxNA==","repeats":1},{"count":1656,"lower_bound":"MTQwOTU1NTI3MA==","upper_bound":"MTQxNzIzMDk4MA==","repeats":1},{"count":1664,"lower_bound":"MTQxNzM2OTkxOQ==","upper_bound":"MTQyNTU5NTI0NQ==","repeats":1},{"count":1672,"lower_bound":"MTQyNTc0Nzg0MA==","upper_bound":"MTQ0MzcyOTE1Mw==","repeats":1},{"count":1680,"lower_bound":"MTQ0Nzg1OTE4Ng==","upper_bound":"MTQ0OTgyMTM4OA==","repeats":1},{"count":1688,"lower_bound":"MTQ1MjQyMzE2MQ==","upper_bound":"MTQ1ODc1OTI1NA==","repeats":1},{"count":1696,"lower_bound":"MTQ2ODAwNzg0OA==","upper_bound":"MTQ4MjM4ODU4Mg==","repeats":1},{"count":1704,"lower_bound":"MTQ4MzM0NzQzOA==","upper_bound":"MTQ5MjAxNjc5Mw==","repeats":1},{"count":1712,"lower_bound":"MTQ5MzQyMDgyNg==","upper_bound":"MTUyODAxMTk1NA==","repeats":1},{"count":1720,"lower_bound":"MTUyODU1NTY3Nw==","upper_bound":"MTUzNDQyMTMxMw==","repeats":1},{"count":1728,"lower_bound":"MTUzNTQwNDU4MA==","upper_bound":"MTU1MjMxMzI3Mw==","repeats":1},{"count":1736,"lower_bound":"MTU1MzYwNjg5OQ==","upper_bound":"MTU2MzcyODk4NA==","repeats":1},{"count":1744,"lower_bound":"MTU2NjczNjQ1Mw==","upper_bound":"MTU3Njk0MjI5NQ==","repeats":1},{"count":1752,"lower_bound":"MTU4MzYyODAzOA==","upper_bound":"MTU5NzAxMjYxNA==","repeats":1},{"count":1760,"lower_bound":"MTU5NzQ3NDYzNg==","upper_bound":"MTYwMzIwNDg4MA==","repeats":1},{"count":1768,"lower_bound":"MTYxMzAxOTg4OQ==","upper_bound":"MTYzNjczNzYzMA==","repeats":1},{"count":1776,"lower_bound":"MTYzNzEzOTYzNA==","upper_bound":"MTY2MDc1NDEwMw==","repeats":1},{"count":1784,"lower_bound":"MTY2NzI0MjEwMA==","upper_bound":"MTcwMjQwNjYzNw==","repeats":1},{"count":1792,"lower_bound":"MTcwNzQ0ODM4Mw==","upper_bound":"MTcxNTE4NjYwNA==","repeats":1},{"count":1800,"lower_bound":"MTcxODIxNzUyMQ==","upper_bound":"MTcyMzI4MjYxMw==","repeats":1},{"count":1808,"lower_bound":"MTcyMzI5MDkyNQ==","upper_bound":"MTczNTQ2NjI1OA==","repeats":1},{"count":1816,"lower_bound":"MTczOTU0ODEyMA==","upper_bound":"MTc0NzAzNjA1Mg==","repeats":1},{"count":1824,"lower_bound":"MTc0OTQ1NDEwNA==","upper_bound":"MTc1MjYxMTI5NQ==","repeats":1},{"count":1832,"lower_bound":"MTc1NjYyNjg4MA==","upper_bound":"MTc1OTYwNzAzMQ==","repeats":1},{"count":1840,"lower_bound":"MTc3MzY2NzM5MQ==","upper_bound":"MTc4NzUwOTU2MA==","repeats":1},{"count":1848,"lower_bound":"MTc5MDQwMzg1MA==","upper_bound":"MTgwNTk1ODc2OQ==","repeats":1},{"count":1856,"lower_bound":"MTgwNjU2MDczMA==","upper_bound":"MTgxODUxODI2Mw==","repeats":1},{"count":1864,"lower_bound":"MTgyMTcwNzg4NQ==","upper_bound":"MTgzNzM3MDM3MA==","repeats":1},{"count":1872,"lower_bound":"MTg0MjIxNTY4Ng==","upper_bound":"MTg1NDY2MzI1MQ==","repeats":1},{"count":1880,"lower_bound":"MTg3MTI5ODExMA==","upper_bound":"MTg3NDA3NTY2Mg==","repeats":1},{"count":1888,"lower_bound":"MTg3NDYwMzE2NA==","upper_bound":"MTg5MDM5MTY0Mw==","repeats":1},{"count":1896,"lower_bound":"MTg5MTY0NTczMg==","upper_bound":"MTkwMzQwNzAwMA==","repeats":1},{"count":1904,"lower_bound":"MTkwNTA2NTE5MA==","upper_bound":"MTkxMTEwOTM1MA==","repeats":1},{"count":1912,"lower_bound":"MTkxMzA0MzU4Mw==","upper_bound":"MTkxODY5NjkyMQ==","repeats":1},{"count":1920,"lower_bound":"MTkxOTAyNzQxNQ==","upper_bound":"MTkzNzk0MjUwNw==","repeats":1},{"count":1928,"lower_bound":"MTk0OTI3NDUzNg==","upper_bound":"MTk2Mjg1MjExMw==","repeats":1},{"count":1936,"lower_bound":"MTk2ODg3Mzc1OA==","upper_bound":"MTk4NTc3NTU2MA==","repeats":1},{"count":1944,"lower_bound":"MTk4NTgwOTc1OQ==","upper_bound":"MTk5NzI3MzkwMA==","repeats":1},{"count":1952,"lower_bound":"MjAwMDk2MDg1NQ==","upper_bound":"MjAwOTk2NzgxNQ==","repeats":1},{"count":1960,"lower_bound":"MjAxMDMwNzg0NA==","upper_bound":"MjA0MDkwMjc1Mw==","repeats":1},{"count":1968,"lower_bound":"MjA1MDk4MDY2Mw==","upper_bound":"MjA4MjQ2OTU1Nw==","repeats":1},{"count":1976,"lower_bound":"MjA4MzczNzQyNw==","upper_bound":"MjA5NDU2Mjc0Nw==","repeats":1},{"count":1984,"lower_bound":"MjEwMzkxNDA2Nw==","upper_bound":"MjExMzEwOTYzNg==","repeats":1},{"count":1992,"lower_bound":"MjEyNTE4NjQwNQ==","upper_bound":"MjEzNDkwMDEyNw==","repeats":1},{"count":2000,"lower_bound":"MjEzNTIxMzUyMA==","upper_bound":"MjE0NzIxODg5OA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,1,0,0,1,2,1,0,2,1,3,3,1,0,4,2,0,2,3,0,0,0,0,1,0,1,0,0,5,0,2,1,1,2,0,1,0,1,0,0,2,2,1,1,0,4,0,0,1,0,1,0,0,2,1,2,1,1,0,2,0,0,0,1,1,0,0,2,0,0,0,3,0,1,3,0,0,3,0,0,1,0,0,1,0,0,2,1,0,2,1,0,1,3,0,1,1,2,0,4,1,2,0,0,2,1,0,1,1,0,0,1,4,0,2,0,1,0,1,0,0,3,2,4,1,1,1,0,0,1,1,0,0,0,1,1,2,0,0,1,0,0,1,1,0,2,0,1,0,0,2,2,0,0,1,2,2,1,0,1,1,2,1,0,0,0,0,1,2,1,0,4,0,0,0,1,1,1,0,0,2,2,0,1,1,1,1,0,0,1,2,3,1,4,0,1,0,2,2,0,1,0,1,0,1,1,1,4,0,1,0,2,0,0,1,4,1,2,2,0,0,0,0,1,1,1,3,1,0,2,2,1,1,3,0,2,0,1,2,1,4,0,1,1,0,2,2,1,3,0,1,2,2,3,4,1,1,2,0,1,0,2,2,0,1,0,2,0,1,2,4,0,0,2,2,1,1,0,2,0,0,1,1,1,1,0,1,2,1,3,1,0,1,1,1,2,1,2,0,2,2,3,1,0,0,2,0,1,4,1,1,0,0,3,1,1,1,0,1,1,0,2,0,1,1,0,1,2,2,0,0,0,2,1,0,1,1,0,0,2,0,0,2,0,0,1,0,2,3,1,1,0,1,0,1,1,0,3,4,2,1,1,1,1,0,1,2,0,3,1,1,0,0,0,0,0,2,1,1,3,3,1,1,2,1,1,0,1,1,1,0,2,1,1,2,0,1,1,0,0,0,2,1,0,0,1,2,2,1,2,0,0,0,0,0,2,0,0,3,0,1,2,2,1,1,0,3,1,3,1,0,0,0,0,1,2,2,0,1,0,0,1,2,3,1,1,2,0,2,0,1,0,3,2,1,2,0,0,0,2,0,1,0,0,1,1,0,0,3,1,1,2,0,0,1,0,0,2,0,0,0,0,1,0,1,0,1,1,1,0,1,1,3,2,1,2,0,1,0,0,0,0,2,2,2,0,3,0,0,0,0,1,1,0,2,0,0,2,1,0,1,0,2,0,3,2,1,2,0,2,1,2,2,0,2,3,1,3,2,1,2,0,0,1,3,0,0,1,0,2,0,1,0,0,0,0,1,1,1,1,0,1,0,2,0,0,1,2,1,1,1,2,1,0,2,2,1,0,0,2,3,1,1,3,0,1,1,0,0,1,1,1,0,1,1,1,3,1,1,0,0,2,0,1,1,1,2,0,1,1,0,0,0,0,0,1,1,0,0,2,0,2,0,0,3,0,1,1,0,1,1,0,1,1,0,1,0,1,1,2,2,0,1,0,0,1,0,3,2,0,1,1,1,1,2,4,2,1,1,4,2,0,1,0,2,1,1,2,0,0,0,0,2,0,1,1,3,1,2,2,0,1,1,3,0,1,1,1,0,2,1,1,0,1,1,1,0,1,2,2,1,1,0,0,1,0,2,1,2,1,2,1,0,1,0,2,1,0,0,2,0,2,1,1,1,0,0,0,2,0,0,0,2,0,1,2,0,2,3,2,0,2,1,3,2,3,0,1,1,0,0,0,2,2,0,2,0,2,0,2,2,1,2,1,1,0,1,0,1,1,1,1,0,0,3,0,1,0,2,0,1,0,2,1,1,1,1,1,0,3,0,2,1,1,0,1,2,2,1,2,0,1,1,0,0,1,0,1,1,0,0,0,0,1,4,1,1,1,0,2,1,0,2,1,0,3,1,1,1,1,0,0,1,1,0,2,0,1,2,1,2,2,0,1,1,0,0,2,0,0,0,2,1,1,0,2,0,1,0,3,1,2,0,0,0,1,1,0,1,2,1,2,1,0,3,2,1,1,0,1,1,1,1,2,0,1,4,1,2,1,0,2,1,0,3,0,0,0,0,1,0,0,2,0,2,0,2,0,0,0,0,2,0,2,1,1,0,1,3,0,0,1,0,2,1,0,2,1,2,1,0,1,0,1,3,1,2,0,0,1,1,1,2,0,3,1,1,1,3,1,2,1,0,1,1,2,0,0,0,2,2,2,0,2,1,3,0,2,0,2,0,2,0,2,1,1,0,0,0,0,0,1,1,2,3,1,0,0,1,0,0,2,2,0,0,0,2,1,4,0,2,1,1,2,2,4,1,1,1,1,2,2,1,0,0,2,2,0,1,0,0,1,1,0,0,1,0,1,0,1,2,1,0,1,0,1,0,2,1,1,2,1,4,1,0,0,0,0,0,1,0,1,1,2,2,0,1,1,1,0,1,0,0,0,2,0,2,1,0,2,2,1,3,0,2,0,0,3,0,0,0,2,1,0,1,1,0,1,1,0,1,0,2,0,2,0,1,1,2,2,1,2,1,0,1,1,2,0,2,2,0,2,0,0,2,0,0,0,0,0,0,2,1,0,1,0,2,0,0,1,1,0,1,0,0,1,0,3,1,2,1,1,1,1,0,2,1,2,3,2,3,0,1,3,0,1,3,1,0,0,1,1,2,0,1,2,2,1,1,1,1,1,2,1,2,2,0,2,1,0,1,0,1,0,1,1,2,0,0,0,0,0,1,0,0,0,0,1,2,2,2,0,1,1,2,1,1,0,2,2,0,0,2,1,1,1,1,2,1,2,2,1,1,0,0,0,3,0,0,0,1,0,0,0,1,1,0,1,3,2,2,0,1,1,0,1,0,1,1,1,1,2,0,1,1,1,1,1,1,0,0,0,1,1,1,3,1,2,0,1,1,0,1,3,0,0,0,1,1,2,1,0,0,1,1,2,2,1,0,0,1,0,0,2,0,2,1,0,2,2,0,3,0,3,0,1,1,2,1,2,2,1,0,2,1,3,0,2,0,1,1,1,2,2,1,1,4,1,1,2,2,2,4,1,2,1,1,1,0,0,2,1,0,2,1,0,3,3,1,1,0,2,1,0,0,0,2,1,0,0,0,1,0,0,0,0,1,0,1,2,0,0,0,0,0,1,1,0,1,1,1,1,1,1,0,0,0,0,0,0,0,3,1,4,1,3,1,0,0,0,1,2,2,0,1,0,1,0,1,2,2,0,1,0,1,0,1,1,0,1,1,0,1,2,3,1,0,0,1,1,1,0,0,0,2,2,2,0,2,0,0,1,1,1,0,0,0,0,0,0,0,1,1,0,2,2,2,0,3,0,3,2,1,1,2,0,1,1,0,0,3,0,2,1,0,1,0,1,2,1,1,2,1,1,1,2,0,3,1,1,0,0,1,3,1,2,0,1,0,0,4,2,0,2,1,3,2,4,1,0,0,1,1,2,0,0,1,4,2,2,0,0,1,0,1,0,1,0,1,6,1,1,0,1,3,0,0,0,0,1,2,2,0,3,1,0,0,1,0,3,0,0,0,0,0,0,2,1,0,2,0,0,2,3,1,1,2,0,1,1,0,0,1,0,0,2,1,0,1,0,1,2,2,1,2,2,0,0,1,0,0,1,0,0,1,2,1,0,0,1,1,1,2,0,0,1,0,1,3,4,2,1,2,0,3,1,1,3,0,0,3,2,1,1,1,1,3,2,0,1,2,2,0,1,0,3,0,1,0,1,0,3,0,3,2,2,1,1,1,0,2,1,1,2,2,1,0,1,1,0,1,0,0,1,3,2,1,2,0,0,2,2,1,2,1,1,0,2,1,0,0,1,1,0,2,1,0,0,0,2,2,3,1,2,2,3,0,0,2,1,0,1,1,1,0,1,1,0,1,1,0,1,1,0,1,0,0,2,1,1,0,0,2,2,0,3,2,0,1,2,2,0,1,1,1,3,1,0,1,1,0,0,0,1,1,2,3,1,0,0,1,1,0,2,0,1,0,1,0,2,0,2,2,2,0,1,2,0,1,1,2,0,2,1,0,0,2,0,0,4,1,1,2,2,1,0,1,0,0,0,1,0,0,0,2,1,2,0,1,0,0,1,2,2,1,0,0,0,0,3,3,1,0,0,2,3,2,2,0,1,0,1,0,0,0,1,0,1,0,2,0,0,1,1,0,0,0,1,0,0,0,1,0,1,0,1,0,2,1,3,2,0,3,1,3,0,2,0,0,0,1,3,1,2,1,1,1,0,0,3,1,2,2,2,1,1,1,0,1,2,0,2,1,1,0,3,0,1,1,0,2,1,1,2,1,2,0,0,1,1,0,0,1,0,1,0,1,2,0,2,1,1,2,2,0,1,0,0,0,1,2,3,0,1,0,1,2,1,2,0,2,1,1,1,0,2,0,2,2,2,0,0,0,1,1,0,0,2,0,1,1,0,1,0,0,0,0,0,0,1,2,1,2,2,0,1,1,0,3,2,2,0,0,2,2,1,0,0,3,0,1,0,0,3,0,1,0,0,1,1,0,0,2,0,1,1,0,0,1,2,0,0,3,1,1,1,0,2,0,1,0,0,0,0,0,0,3,2,2,1,0,2,1,3,1,1,2,1,1,1,0,1,3,3,0,2,0,0,1,1,1,1,1,1,1,0,0,0]},{"counters":[2,1,0,1,1,0,0,0,0,2,1,1,1,1,1,2,0,1,3,2,1,2,2,1,2,1,2,1,3,1,2,2,0,0,0,0,2,2,0,2,2,1,1,0,1,0,1,2,1,4,4,3,1,1,3,0,1,3,2,1,0,1,1,1,1,1,0,2,1,0,2,0,2,1,1,0,0,0,3,0,1,1,1,1,1,0,1,0,0,2,0,0,0,0,2,0,0,1,0,1,0,0,2,2,1,2,1,0,2,0,2,0,0,2,1,0,0,1,0,1,0,0,2,4,1,1,0,0,0,0,0,2,1,0,0,0,2,1,0,0,1,1,2,2,0,0,0,1,1,1,0,1,2,0,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,0,1,0,2,0,2,1,1,0,1,0,1,0,0,0,2,0,0,2,2,0,1,2,1,0,0,1,3,1,1,1,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,3,0,1,0,3,1,0,1,3,2,0,0,2,0,2,1,0,0,0,2,2,1,1,0,0,1,0,0,0,2,1,0,1,0,0,2,2,0,2,0,1,0,1,1,1,0,2,0,1,1,0,0,1,1,1,1,2,1,2,1,1,2,0,1,0,1,1,2,0,1,0,1,1,1,1,4,1,1,3,0,1,0,1,0,0,0,1,1,0,1,1,0,3,1,0,0,1,2,1,2,1,0,1,0,1,0,0,3,1,1,1,1,0,0,3,0,2,0,1,0,1,0,1,2,0,2,2,0,1,2,0,0,1,4,0,2,1,3,0,1,1,1,0,1,0,0,0,0,0,2,1,0,0,2,1,2,2,2,1,0,0,1,0,1,1,1,0,2,1,2,1,2,2,0,2,5,1,3,1,1,1,0,1,3,0,1,0,0,1,4,2,2,0,1,0,0,1,0,2,0,0,0,1,2,2,2,1,1,0,0,2,0,0,0,0,0,1,0,0,4,0,0,1,0,1,1,3,2,2,3,1,2,0,1,0,0,0,2,3,0,0,3,0,1,0,3,0,1,2,0,1,3,2,0,1,2,0,1,1,1,0,1,2,0,1,2,0,1,0,1,0,0,1,1,0,1,0,0,1,1,3,0,1,1,1,1,2,2,0,1,2,2,2,1,1,0,0,2,1,2,0,1,1,3,0,0,1,0,1,2,1,1,1,2,1,1,1,2,1,1,1,1,1,1,4,0,0,1,0,0,0,1,0,1,1,0,2,1,1,1,0,3,2,1,1,2,0,1,0,2,1,1,1,1,1,2,0,0,0,2,1,1,2,1,2,1,1,1,0,1,1,0,2,2,2,0,1,1,0,1,1,0,0,2,2,0,1,2,0,0,0,0,0,0,1,1,0,1,1,1,0,0,2,1,1,1,2,0,1,0,2,0,0,1,0,0,0,3,0,0,1,1,1,0,1,0,1,1,2,2,0,2,1,1,2,1,4,0,1,1,2,1,0,2,1,1,1,1,2,0,0,0,3,2,3,0,0,1,1,2,2,1,1,0,1,2,4,3,0,2,1,0,0,2,0,1,1,0,0,1,1,2,2,0,1,1,1,1,0,2,0,1,1,0,0,1,1,1,0,0,2,0,2,0,2,0,2,1,1,0,1,0,0,3,2,4,1,2,2,0,2,1,0,1,1,1,0,2,0,0,2,2,1,4,2,0,1,1,3,0,0,0,0,1,4,1,1,1,1,2,2,1,1,4,0,0,1,0,0,1,1,0,2,2,1,0,1,0,2,2,0,0,1,1,1,0,1,0,1,1,3,0,1,1,2,0,0,1,1,1,1,1,2,1,0,0,1,2,1,0,0,1,1,0,0,0,1,2,0,1,1,1,1,0,1,0,1,2,1,1,1,1,2,0,0,0,0,0,0,1,1,1,3,3,1,1,0,1,1,1,0,2,1,1,1,1,2,0,1,2,2,1,4,0,1,2,1,1,2,3,0,1,1,1,0,0,1,1,2,1,1,1,0,1,0,0,1,3,0,1,0,1,2,1,4,0,1,0,0,0,1,2,1,1,2,0,1,4,1,0,0,1,3,2,1,1,0,2,2,4,2,1,2,2,0,2,1,0,2,3,1,2,2,0,2,2,3,0,1,0,0,2,1,0,1,1,0,1,1,0,1,0,1,2,0,0,3,2,2,0,0,3,1,0,3,2,0,0,2,1,3,0,0,0,1,1,1,1,0,1,0,1,1,2,0,5,1,3,1,1,0,0,1,0,1,1,0,1,1,1,1,2,1,0,3,1,1,2,1,0,2,1,0,1,0,0,0,1,1,0,2,1,0,0,1,1,1,1,2,0,0,0,1,0,4,0,0,2,0,0,0,0,2,2,0,2,2,0,3,2,1,1,1,2,2,0,1,0,2,3,3,1,2,0,1,0,1,0,1,3,1,1,2,0,2,1,0,1,3,2,2,2,0,3,1,2,0,1,0,0,1,0,1,0,3,0,1,0,1,0,0,0,1,2,1,0,1,0,3,0,0,1,0,1,0,1,3,1,1,1,0,0,0,1,1,1,0,1,1,0,1,2,2,0,0,0,0,1,0,2,0,2,2,0,4,1,3,4,1,2,0,2,1,1,3,1,1,2,0,0,2,2,2,0,1,0,2,1,4,1,0,3,0,1,1,0,1,2,1,1,1,1,1,0,0,0,2,2,1,0,0,2,0,1,2,1,3,2,0,1,0,2,0,0,0,0,0,2,3,1,1,0,0,1,1,0,0,1,1,0,2,1,0,1,1,1,1,1,0,0,0,0,0,1,1,1,0,1,1,1,0,2,1,2,0,3,0,2,1,1,0,1,1,0,1,1,0,2,1,0,1,0,1,2,0,1,0,2,2,3,0,0,0,0,1,1,1,2,0,0,2,1,2,1,2,0,2,0,1,2,4,2,2,1,1,2,0,1,1,0,2,0,1,0,0,1,1,1,1,0,0,2,1,1,1,4,1,0,1,0,1,1,1,1,3,1,1,4,1,0,2,0,3,0,0,0,0,0,3,0,1,0,0,1,1,1,4,1,1,1,1,1,1,0,1,1,0,0,2,1,1,1,1,0,2,2,1,0,3,1,1,2,1,1,2,1,2,1,0,2,0,2,0,0,1,0,1,2,0,0,1,0,1,0,0,2,0,0,0,1,2,1,0,1,2,1,2,1,3,0,1,0,0,1,1,1,2,1,0,1,2,0,1,4,1,1,0,0,1,0,1,0,0,1,0,1,0,1,2,2,1,0,1,0,2,2,1,1,1,1,1,1,2,0,1,1,2,0,1,1,1,0,2,0,0,1,0,0,1,1,1,1,2,2,0,2,0,0,2,0,1,0,1,1,0,1,2,0,0,0,0,2,1,1,0,1,1,3,1,0,0,0,1,0,0,0,0,2,0,2,2,4,3,1,1,0,1,1,0,0,2,0,3,2,2,2,1,0,2,1,4,0,1,1,0,0,3,0,0,0,3,1,1,1,0,4,2,2,2,2,0,0,0,1,0,1,0,1,3,0,1,2,1,2,4,1,2,1,0,0,1,0,1,0,1,1,1,2,1,0,1,1,1,0,1,0,2,0,3,1,1,1,1,1,0,0,1,0,1,0,3,2,1,0,0,0,2,0,0,4,3,0,1,0,0,1,0,0,1,2,0,0,1,0,0,2,0,2,0,1,4,0,0,0,2,1,2,2,3,1,1,0,1,1,1,0,2,0,0,3,0,0,0,1,0,2,0,1,2,0,1,0,1,2,0,1,0,2,1,0,0,2,0,2,1,1,2,0,1,2,0,1,1,2,2,0,3,3,1,1,1,0,0,2,1,1,0,1,0,1,1,1,1,0,1,2,1,0,0,0,3,0,1,0,1,1,2,2,1,2,2,1,2,1,0,0,2,3,3,0,1,3,0,2,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,1,2,1,0,2,4,2,1,2,0,1,0,0,3,1,1,0,4,1,2,0,1,1,1,0,3,2,1,1,0,0,2,1,0,0,0,1,1,1,0,0,1,0,0,2,2,1,1,0,0,1,2,0,1,3,0,4,2,1,1,0,1,1,2,0,1,1,4,1,1,0,0,1,2,2,0,1,1,0,2,0,0,4,1,3,2,1,2,0,3,1,0,1,0,4,1,1,3,2,2,1,0,0,1,1,1,2,1,0,1,1,0,2,0,0,0,1,1,5,0,2,1,4,1,2,0,0,1,1,1,3,0,2,1,0,1,0,2,1,0,0,3,1,0,0,1,1,3,3,0,1,0,0,1,1,0,3,1,0,0,2,0,0,1,2,2,0,2,0,1,3,1,1,4,1,0,1,0,0,2,1,0,0,1,1,1,0,0,0,1,2,0,1,1,0,2,0,1,1,0,0,0,1,1,1,0,0,1,1,2,2,0,0,0,0,2,2,1,0,1,1,1,0,0,1,0,1,2,2,1,1,0,0,0,2,2,0,1,3,1,1,0,0,0,1,0,2,0,2,0,1,3,3,0,1,1,3,1,0,1,0,0,2,3,1,1,1,3,0,1,1,4,0,0,1,0,1,2,1,0,1]},{"counters":[2,2,0,3,1,1,2,0,0,0,1,4,0,1,1,0,1,0,0,1,0,2,2,3,0,1,3,1,1,0,0,0,1,0,2,0,1,0,2,0,0,0,0,1,2,0,0,0,0,1,2,0,0,0,1,0,0,0,2,2,0,0,0,0,1,1,1,2,0,1,0,3,0,2,1,0,0,1,1,0,0,2,1,0,2,0,1,0,1,0,1,1,3,1,2,3,1,5,1,0,0,1,3,1,0,1,3,0,0,1,1,1,1,2,2,0,1,4,3,0,0,0,1,1,2,2,1,0,0,1,1,0,1,2,1,1,1,3,0,2,0,0,0,0,0,1,1,2,1,2,0,0,2,3,0,0,1,0,0,1,3,0,2,1,0,1,1,3,2,2,0,0,0,0,0,0,1,0,1,0,1,0,2,0,0,2,1,0,1,2,1,1,0,1,2,1,0,1,4,1,1,1,1,1,1,0,1,0,0,0,0,1,2,1,2,1,1,1,1,1,0,1,0,1,0,0,0,1,1,3,0,0,1,0,1,1,1,2,0,4,1,0,1,3,1,1,0,0,1,1,1,2,0,0,0,0,1,2,1,0,1,1,2,4,0,1,1,1,0,0,0,2,2,1,2,0,1,3,2,0,3,0,2,0,0,1,1,1,0,1,1,2,0,1,0,1,0,0,1,2,4,3,0,1,1,0,1,2,2,1,2,1,0,2,0,3,0,0,3,1,1,0,4,3,1,0,0,0,1,2,1,1,2,1,0,3,1,0,1,0,1,1,0,0,0,2,1,2,0,0,4,0,1,1,1,1,0,2,1,1,0,0,1,0,1,0,0,0,0,1,3,0,1,1,1,2,0,2,0,1,0,0,0,0,2,0,2,0,1,0,0,2,1,1,4,2,2,0,1,0,0,2,1,1,0,1,2,0,1,1,3,0,1,1,1,2,1,0,2,1,1,1,0,2,2,0,3,1,2,0,0,3,0,0,1,0,2,1,2,1,1,1,0,0,0,1,1,0,1,2,3,3,1,2,3,1,0,0,2,1,0,1,2,2,0,1,0,0,0,1,0,1,1,2,0,1,0,0,1,0,0,0,1,4,1,1,0,6,1,0,1,2,2,1,0,3,1,0,3,1,1,1,0,0,2,1,1,1,0,1,0,2,1,2,0,1,2,0,0,2,2,0,1,2,2,1,0,0,1,2,0,0,0,2,0,4,4,1,0,3,0,2,2,0,0,1,0,0,1,0,0,1,0,0,1,2,2,1,1,3,1,0,0,0,0,0,0,1,2,0,1,4,1,0,0,3,1,0,0,3,3,1,0,1,2,2,2,2,0,1,1,0,1,0,1,2,1,1,3,0,0,1,1,1,0,0,0,2,2,0,1,0,2,0,0,1,2,1,0,0,0,0,3,2,1,0,0,2,0,0,1,0,1,0,1,0,1,0,1,1,0,2,1,0,2,2,2,1,0,1,2,0,2,0,2,1,0,0,1,2,0,1,0,1,1,1,2,3,1,0,1,1,0,0,1,2,1,1,1,1,1,1,1,1,3,1,0,1,0,1,0,1,1,2,0,1,1,0,0,0,2,1,0,0,1,1,0,3,2,2,1,0,0,0,0,1,0,1,0,3,1,0,0,2,1,0,1,1,2,0,1,1,2,1,0,2,0,0,2,1,1,1,0,2,0,0,2,1,1,0,0,0,1,0,1,0,0,3,0,2,0,0,1,2,0,0,0,0,0,1,3,0,4,1,0,3,1,0,0,3,1,0,1,0,2,0,1,1,1,0,0,1,0,0,1,2,0,2,1,0,1,4,2,2,3,1,2,0,2,1,0,3,1,1,0,0,2,0,1,0,0,0,1,2,3,1,0,5,1,1,0,0,0,1,0,3,3,0,2,3,1,0,0,1,1,3,1,1,1,0,0,2,0,0,0,2,1,2,0,0,2,0,1,3,1,0,0,0,0,2,1,1,2,1,5,1,0,2,1,1,0,0,1,1,2,2,2,2,2,0,0,0,1,0,1,0,1,1,1,0,3,1,1,2,2,0,0,0,1,2,0,1,1,0,1,1,0,0,0,3,0,1,0,1,5,1,0,1,0,2,1,1,3,0,0,0,1,2,2,3,0,0,1,1,1,1,0,2,2,4,1,1,2,0,1,1,0,0,0,3,2,1,2,0,1,1,3,0,0,1,1,2,3,0,0,3,0,2,3,0,0,1,1,0,3,1,1,0,0,1,1,1,1,1,0,2,0,0,0,1,0,0,0,2,1,0,4,0,2,0,1,2,1,2,1,0,1,0,0,4,0,1,0,0,0,2,1,0,0,1,1,1,1,0,0,3,1,2,1,0,1,1,1,2,1,1,2,4,1,1,0,1,1,1,2,2,1,1,0,0,0,0,2,1,0,0,2,0,0,0,1,1,1,0,0,4,0,3,0,3,0,1,0,0,1,1,0,0,1,0,1,3,0,3,0,0,1,0,2,1,0,0,0,1,1,2,3,1,0,0,0,2,1,2,0,0,3,0,1,0,0,1,2,4,0,4,3,1,1,2,1,0,1,1,0,1,1,1,1,1,1,0,0,0,1,1,0,0,1,0,1,3,2,0,1,1,0,0,1,1,2,4,0,1,3,1,0,2,1,2,0,1,0,1,0,1,0,0,1,1,1,2,0,1,0,0,3,5,2,0,1,1,1,0,0,0,0,1,1,1,0,3,1,1,0,0,1,3,0,2,0,2,0,2,2,1,2,0,0,0,1,0,2,1,1,1,2,0,3,1,0,1,2,1,1,0,2,0,0,3,3,0,2,1,1,1,2,2,2,1,1,1,1,0,0,1,2,1,0,4,0,0,0,1,0,1,1,0,0,1,1,0,1,0,1,0,2,2,0,1,2,0,0,2,1,2,2,2,0,0,1,1,0,0,1,2,2,1,1,2,0,1,1,1,0,3,1,1,0,1,0,1,0,3,1,3,0,4,0,1,0,0,1,0,1,5,1,0,1,2,0,1,0,0,0,3,1,1,1,1,0,4,2,4,2,2,4,0,1,3,2,0,0,1,2,2,0,0,2,2,0,0,1,2,2,1,1,0,2,1,0,1,1,2,3,1,0,1,3,1,2,1,0,0,2,0,0,1,1,1,3,3,0,0,0,1,2,1,1,1,0,0,1,1,1,1,0,1,1,1,0,0,1,0,1,3,0,3,0,0,1,0,1,1,4,1,1,0,1,0,0,2,2,0,1,1,0,7,2,1,1,2,2,0,0,0,1,1,0,0,1,3,1,3,1,1,1,0,1,0,0,0,2,1,2,0,0,0,0,1,1,0,1,1,1,1,0,1,1,1,3,2,1,0,2,0,0,1,2,2,2,2,0,2,0,2,2,0,1,3,1,1,0,1,3,0,0,2,1,2,1,1,0,2,1,1,0,0,0,1,1,0,1,0,1,0,2,0,0,1,0,0,2,1,2,2,1,0,0,1,2,1,1,0,2,3,0,3,1,0,0,2,1,1,1,1,0,0,1,0,0,2,2,0,0,1,1,1,1,3,1,0,0,0,1,1,0,0,0,2,1,0,3,1,0,0,1,0,2,2,0,2,0,0,1,1,0,0,1,0,0,0,1,0,0,0,1,3,0,1,1,1,0,0,0,0,2,0,0,1,0,2,1,1,3,2,0,2,1,0,1,0,2,1,2,2,0,2,0,3,0,0,2,2,1,0,0,1,0,0,0,0,2,3,3,0,0,0,2,1,3,0,0,3,1,0,1,1,0,1,1,1,1,1,0,2,1,2,0,0,2,2,1,0,0,0,0,1,1,1,0,0,0,2,0,0,1,1,1,0,1,2,3,3,1,1,4,0,0,1,2,0,0,2,1,0,1,1,2,0,1,0,1,3,1,1,2,3,0,0,1,2,0,1,5,1,1,3,2,1,0,3,1,0,0,3,3,3,1,1,0,1,2,1,4,2,0,0,0,3,1,1,0,1,0,1,0,1,0,0,5,0,1,1,2,2,0,0,0,1,3,1,1,2,3,0,1,0,1,0,1,1,1,0,0,1,1,1,0,0,1,2,1,1,2,1,0,1,1,1,0,1,2,0,1,1,3,1,1,0,4,0,1,0,0,1,1,2,0,2,0,0,3,1,1,0,1,0,0,0,0,1,3,0,1,0,0,1,0,2,2,0,0,0,1,1,1,1,1,0,4,3,1,1,1,3,0,1,1,1,0,1,1,1,0,0,0,0,3,2,0,2,1,0,3,2,0,3,1,1,0,2,1,1,0,1,0,0,1,0,2,1,1,1,0,0,1,0,3,0,1,2,0,1,0,2,2,0,1,3,1,1,0,1,1,1,1,1,0,2,0,0,0,3,0,1,1,3,1,0,1,1,1,0,2,2,0,1,3,1,0,2,1,1,1,0,0,0,2,2,1,2,1,1,0,2,0,2,1,2,1,0,0,1,1,0,3,1,1,0,2,0,0,2,1,3,1,0,1,2,1,2,0,0,1,0,0,1,1,0,1,0,0,0,1,0,2,1,1,2,1,0,2,0,2,1,0,0,1,2,0,1,2,0,1,1,1,1,1,3,1,0,1,3,0,0,1,0,2,1,1,0,1,1,1,1,0,1]},{"counters":[1,1,0,0,1,2,0,0,4,1,1,3,2,3,3,1,2,1,0,1,3,5,0,0,2,0,1,0,2,1,0,2,0,1,1,0,1,2,0,1,2,2,0,0,1,1,1,3,0,0,2,2,0,3,2,1,1,1,3,1,0,1,1,1,1,2,3,1,1,1,0,5,1,1,1,0,1,0,3,0,1,0,0,0,2,1,1,4,0,0,1,0,1,1,3,2,0,0,1,1,0,0,0,2,0,0,0,1,2,1,0,2,2,1,1,0,1,0,0,1,0,2,1,0,0,2,1,0,1,1,0,2,2,0,1,0,1,3,1,1,0,1,2,0,0,5,3,0,3,2,1,3,1,0,7,0,0,1,0,2,1,1,1,1,1,0,1,0,0,0,0,1,2,1,0,1,1,2,0,0,0,1,0,1,3,1,1,0,2,1,3,1,1,0,2,2,1,3,0,0,0,1,2,3,0,3,1,1,0,0,0,2,0,1,1,0,2,2,0,2,0,2,0,0,1,0,1,3,1,2,1,1,0,0,0,2,1,2,0,0,4,2,0,1,2,3,2,2,1,0,0,0,0,1,0,1,3,3,3,0,1,0,0,0,0,1,0,1,4,1,2,2,2,2,0,1,1,1,1,0,1,0,1,0,1,0,0,1,1,0,1,1,4,1,1,1,0,1,2,0,1,1,1,0,3,1,3,0,0,0,0,0,1,0,1,1,2,1,2,1,1,3,1,2,0,0,0,1,0,0,0,0,1,1,2,2,1,1,0,2,3,0,5,2,2,0,3,0,1,2,0,4,1,0,1,1,0,2,0,0,3,0,0,1,3,0,1,0,1,2,1,0,0,3,0,1,0,0,1,1,0,0,0,1,1,1,2,2,0,2,1,2,2,0,2,0,1,0,0,1,0,1,3,1,2,0,1,4,0,1,1,0,2,0,0,1,0,1,2,2,2,0,0,2,1,1,0,1,0,1,0,1,0,0,2,3,1,0,1,0,0,1,1,0,0,1,3,0,1,0,1,1,1,1,1,2,0,1,0,0,3,0,1,1,1,0,0,1,1,2,0,1,2,0,0,0,2,0,2,0,1,0,0,2,2,2,0,3,0,0,0,0,1,1,2,2,0,0,2,0,0,0,0,3,1,0,2,0,2,1,1,2,1,1,0,0,1,1,0,0,0,1,2,1,0,1,3,2,1,0,1,0,4,1,2,3,2,1,2,3,0,1,0,2,3,1,1,0,0,1,0,0,1,2,1,2,0,1,0,1,2,0,0,0,1,1,1,0,0,1,1,1,0,1,0,3,1,2,1,0,3,0,1,1,0,1,2,0,0,2,1,1,1,1,2,0,1,0,0,0,1,0,1,0,0,1,1,1,1,2,0,1,0,1,3,0,0,1,0,0,0,3,2,2,2,2,1,4,2,1,2,5,1,1,1,2,0,0,1,0,2,0,0,1,2,2,1,2,5,2,1,2,0,1,3,4,3,0,2,1,2,0,2,2,2,0,2,2,0,1,0,3,0,4,0,3,3,1,2,0,1,0,2,0,1,2,0,2,0,1,0,1,1,1,0,0,1,0,2,0,0,1,1,1,1,2,0,1,0,0,0,3,1,1,2,3,0,1,2,0,1,0,0,3,0,4,1,0,1,0,0,2,2,0,0,1,0,2,2,3,1,2,0,0,2,2,1,2,1,3,0,0,0,1,0,1,2,1,1,1,0,1,0,2,1,4,2,4,0,0,0,2,0,2,1,2,1,3,0,2,1,2,4,0,0,0,1,0,0,1,1,0,0,2,0,0,1,0,1,1,1,2,0,0,2,0,0,0,0,0,3,0,1,0,0,2,0,1,2,3,2,0,1,0,0,1,1,0,2,2,2,1,1,3,0,2,3,1,1,1,0,4,1,0,0,0,1,1,0,0,0,1,0,2,0,0,0,1,0,2,0,1,0,0,0,0,1,0,2,2,1,2,1,0,1,1,0,1,0,0,3,0,1,0,1,2,1,1,2,2,2,0,2,2,0,1,1,0,1,1,2,1,0,0,0,1,1,0,2,2,0,0,1,0,1,2,0,4,1,2,2,0,0,0,0,1,0,1,2,2,1,2,2,1,1,0,1,1,1,1,0,2,0,3,0,1,4,1,1,0,1,0,1,1,1,4,1,0,0,2,0,0,2,0,0,1,2,2,1,1,1,2,1,1,0,1,2,0,3,0,1,0,0,0,1,2,0,1,1,0,1,0,1,2,0,1,1,0,1,1,3,0,1,2,1,1,0,0,1,1,0,1,0,1,1,0,0,1,1,2,0,0,1,2,0,1,0,0,2,3,0,1,0,2,3,2,0,1,3,2,1,1,1,0,2,2,1,1,1,3,0,5,2,1,2,2,2,1,0,0,0,1,0,0,1,2,1,1,0,2,2,1,1,0,1,0,2,1,0,0,2,0,2,1,1,0,0,1,2,0,0,1,1,2,3,0,0,1,1,1,1,1,3,2,1,0,1,2,1,1,0,3,4,0,0,0,4,0,0,0,0,0,1,0,0,1,0,2,1,0,2,0,3,2,2,0,3,3,0,1,2,2,2,1,0,2,0,1,0,1,0,0,0,0,2,2,1,1,0,1,1,0,1,2,3,1,1,2,1,2,1,0,0,0,2,0,0,1,1,3,1,2,0,0,0,1,1,2,2,0,2,1,0,0,1,0,0,0,1,2,3,2,2,1,0,2,1,1,0,1,1,3,1,1,1,0,1,0,2,1,1,0,1,2,1,0,0,0,0,1,1,2,0,0,1,0,1,1,1,0,0,1,2,0,2,0,2,0,0,2,2,0,1,3,1,1,0,0,1,1,3,0,1,2,0,1,2,0,0,1,1,0,1,0,0,3,2,2,1,4,2,3,0,2,4,1,2,0,1,1,1,0,1,1,0,1,0,1,2,0,2,0,0,0,2,1,1,1,1,1,2,0,1,1,0,0,0,0,1,2,1,0,1,1,3,1,2,0,3,0,1,2,1,2,1,0,0,0,0,2,1,1,0,1,2,1,0,0,1,0,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,0,2,3,0,4,1,0,0,0,1,1,1,0,0,1,2,1,2,0,1,0,1,1,0,5,2,3,3,1,0,1,0,0,0,1,1,8,0,3,1,1,0,3,0,1,0,1,0,0,0,0,2,0,0,2,2,1,0,1,1,1,0,0,0,0,0,0,0,1,1,0,1,1,0,1,1,0,0,1,0,0,1,1,0,3,0,0,0,1,2,0,2,1,0,0,0,1,1,2,3,2,0,2,0,1,0,0,0,0,0,0,2,1,3,3,0,1,1,0,1,0,1,1,0,0,2,1,1,0,0,0,0,1,3,3,1,0,0,2,1,0,1,0,1,1,2,1,0,0,0,2,3,0,2,4,0,2,0,0,0,1,0,0,0,1,3,0,1,1,1,1,1,1,1,1,1,0,2,0,1,1,1,1,3,0,1,0,0,3,0,0,0,0,2,1,0,1,1,0,1,0,1,0,0,0,0,1,2,1,0,2,0,0,0,1,1,0,1,1,0,0,1,1,0,2,0,1,0,1,1,2,1,1,0,0,0,0,0,2,1,2,1,0,0,0,1,0,3,1,1,0,2,1,3,2,1,0,0,0,1,0,1,1,2,1,0,1,1,0,0,3,0,0,0,1,2,0,4,3,2,0,2,2,0,0,0,3,1,2,1,0,0,1,1,2,1,0,0,1,0,0,1,1,2,1,1,2,3,1,0,1,1,1,0,2,0,2,0,0,3,0,0,0,1,0,1,3,1,1,0,2,1,1,2,1,0,1,1,0,0,1,2,1,1,1,1,1,0,0,1,1,0,0,0,2,2,0,0,2,0,0,0,2,0,1,0,1,0,1,1,1,0,0,2,1,0,0,1,1,1,1,3,1,0,2,1,0,1,1,1,0,1,0,0,3,1,1,4,1,1,3,0,3,0,0,1,1,1,1,0,3,0,1,1,0,2,2,1,2,0,1,0,1,0,2,0,1,2,1,0,1,1,1,0,0,3,0,0,2,1,0,0,2,2,1,1,0,0,2,0,1,0,1,2,0,3,0,0,0,0,2,0,1,2,0,5,1,2,2,1,0,2,1,0,1,0,2,0,1,1,1,0,2,1,1,0,3,0,1,1,0,1,2,0,0,0,0,4,0,0,1,0,1,0,0,2,0,1,4,1,0,1,0,2,1,0,2,0,2,1,3,0,0,3,3,0,0,0,0,1,0,2,1,1,0,0,0,1,0,0,0,1,0,1,1,1,2,0,0,0,0,0,1,0,1,1,1,1,1,1,2,2,1,2,2,1,1,1,1,1,2,0,0,0,1,5,0,0,1,1,3,0,1,1,0,1,2,2,0,1,1,0,2,2,0,1,1,2,1,1,0,0,0,0,2,1,1,0,2,0,1,3,0,2,1,0,0,2,0,1,1,2,0,2,0,1,2,3,1,1,1,0,1,0,2,0,0,1,1,1,1,1,2,1,0,1,3,2,0,3,0,1,0,0,0,1,0,1,1,1,2,0,2,2,1,1,3,1,1,2,2,1,0,1,2,0,1,1,0,2,0,1,1]},{"counters":[1,3,2,0,2,1,1,2,3,0,1,0,1,3,0,0,2,0,2,0,0,0,2,2,1,2,1,0,0,0,0,1,1,1,0,0,3,0,1,0,0,0,1,1,1,3,0,3,0,1,0,0,1,0,0,0,3,0,3,2,0,0,0,0,0,1,1,3,1,3,1,1,1,0,0,2,0,1,0,1,1,2,1,2,0,0,0,2,0,1,0,1,1,0,0,2,0,5,0,0,0,2,0,0,1,1,0,4,0,1,2,1,0,1,2,1,1,1,2,3,0,2,1,0,1,3,1,0,1,0,0,1,2,2,0,1,1,0,1,3,1,0,1,1,0,0,1,1,1,0,1,3,1,1,0,0,1,1,2,1,1,1,1,2,1,1,1,0,0,2,1,1,0,2,3,0,1,2,0,1,0,1,2,0,0,3,1,1,0,0,0,0,0,1,0,2,1,1,1,1,1,0,0,4,0,1,0,0,1,1,5,1,0,1,1,0,0,1,1,1,2,3,2,2,0,0,1,2,2,0,0,1,0,2,0,1,0,1,1,2,0,0,0,1,0,1,1,2,1,1,2,0,2,1,2,2,2,1,1,0,0,1,1,3,2,0,0,2,0,1,0,1,1,2,2,0,0,0,1,0,0,0,1,2,0,2,2,1,0,3,0,3,2,2,0,0,1,0,1,4,3,1,0,3,0,0,1,2,0,2,0,0,0,1,0,1,0,2,1,0,2,0,1,0,2,2,1,3,1,4,1,1,0,1,0,1,0,0,1,1,1,3,0,1,5,2,2,1,0,0,1,1,0,2,2,0,2,0,0,0,1,2,1,0,2,0,0,1,0,1,1,1,0,1,1,1,3,1,3,1,0,0,2,1,0,2,1,2,1,0,1,0,1,1,2,1,3,0,1,0,1,1,0,0,2,1,1,2,2,0,0,1,1,0,2,0,1,2,3,1,0,1,0,0,1,3,0,2,0,0,0,1,1,0,0,1,0,0,1,4,1,2,0,1,2,1,0,0,1,0,2,2,0,4,1,2,1,1,1,1,2,0,1,4,1,1,2,0,0,1,0,1,0,0,0,1,1,3,1,0,0,0,1,0,3,0,2,0,2,0,1,3,1,0,0,1,0,1,0,1,0,1,1,2,0,1,1,1,1,1,1,1,1,1,0,1,2,4,1,3,0,0,0,1,1,2,0,3,3,2,0,3,1,2,1,2,1,2,1,4,1,0,2,1,0,4,0,1,0,0,0,0,2,2,0,1,2,1,3,1,0,1,1,0,0,1,2,0,0,3,1,2,0,1,1,1,3,1,0,0,2,2,1,2,3,0,2,0,0,1,2,1,0,2,4,1,0,1,1,2,2,0,1,1,2,1,0,1,0,1,0,4,3,3,2,1,1,0,1,1,0,1,0,0,0,1,1,3,2,3,0,2,2,1,1,1,0,1,2,2,2,2,1,0,1,0,2,3,2,1,0,3,2,1,0,1,2,1,0,1,0,2,0,0,0,1,1,1,1,1,1,0,0,1,0,2,0,1,2,0,2,0,0,1,0,0,1,0,0,3,2,1,2,0,0,1,3,0,0,0,1,0,1,1,1,1,1,0,2,1,2,0,0,3,1,1,0,1,2,1,1,0,0,3,0,1,5,2,1,1,1,1,2,1,0,1,1,1,1,0,1,3,0,0,1,1,1,1,2,2,1,0,2,1,1,2,1,1,1,2,2,3,1,1,2,1,2,0,0,1,1,1,0,1,1,2,0,2,2,2,1,1,1,1,0,1,0,1,0,0,0,0,0,2,2,1,2,0,3,1,0,1,0,1,0,1,2,0,2,2,2,1,2,2,1,1,0,0,1,0,1,2,0,0,1,0,1,1,1,1,0,0,3,0,1,0,2,2,0,4,0,4,1,1,2,1,1,0,2,0,3,2,1,1,1,1,0,1,3,2,0,1,0,1,1,0,2,2,1,3,0,0,1,0,3,0,1,1,0,2,1,1,1,0,2,2,3,1,0,1,0,1,1,0,0,2,1,1,0,0,1,1,0,0,2,0,0,0,0,0,1,0,1,1,1,0,2,2,1,0,1,0,1,2,2,0,4,0,0,1,0,1,1,2,0,1,0,1,0,2,0,1,1,0,1,1,0,2,0,1,3,1,0,2,1,2,4,1,0,1,1,0,0,1,0,1,0,1,0,4,2,1,0,0,1,3,1,0,4,2,1,0,1,0,0,0,0,0,0,1,2,1,1,0,0,1,2,0,3,1,1,0,0,0,0,0,0,2,1,0,3,2,0,0,1,0,1,0,0,0,3,1,2,2,0,0,0,0,1,2,1,1,1,0,2,3,3,1,1,0,0,0,1,1,0,0,1,1,1,0,2,0,0,1,3,1,1,1,1,0,0,1,0,3,2,1,0,0,2,0,1,1,1,2,1,0,0,1,1,1,0,0,1,2,0,2,0,2,2,0,3,2,1,1,0,0,0,0,0,2,2,1,1,1,1,1,4,0,0,0,3,1,1,0,0,1,0,2,1,1,1,2,0,0,1,0,2,2,1,0,0,1,1,1,1,0,2,1,1,1,2,1,2,3,1,2,0,2,0,1,3,0,1,0,0,1,0,3,1,2,1,1,0,1,0,0,2,1,1,1,0,0,1,1,1,1,0,1,1,1,1,3,1,3,0,0,0,0,2,2,0,2,0,0,2,0,1,0,2,1,0,0,2,0,1,4,0,1,1,1,1,1,0,1,0,0,2,1,2,0,1,2,1,1,0,1,3,1,1,1,0,1,1,1,1,1,3,0,1,1,2,1,3,1,2,0,0,0,1,0,1,1,0,0,0,4,2,1,1,0,0,1,1,0,3,1,0,0,1,1,2,1,0,0,2,3,1,2,1,0,0,3,1,0,0,3,1,1,0,1,2,4,0,1,0,0,1,0,2,0,2,1,0,2,1,1,2,3,0,2,1,1,0,1,0,1,1,0,0,1,0,0,0,0,2,0,1,1,2,0,0,2,0,2,0,1,1,3,2,1,2,2,1,1,0,1,1,1,1,0,3,1,1,2,0,1,0,1,2,1,0,3,3,0,1,1,2,3,1,3,2,1,1,1,0,1,1,0,1,1,0,2,3,1,0,1,0,3,1,1,1,4,1,2,2,1,1,1,0,1,0,3,1,1,2,0,3,4,4,0,1,2,1,0,0,0,2,1,0,2,1,0,0,0,0,0,0,1,0,1,0,1,1,2,1,1,1,2,1,1,1,2,1,0,0,1,1,0,4,0,0,1,0,1,1,0,2,1,1,2,4,4,0,0,0,0,1,1,1,1,0,2,0,2,0,1,1,2,0,1,0,1,0,0,1,0,1,1,0,0,3,0,0,2,2,3,3,0,0,0,0,0,1,0,0,1,0,0,2,0,1,0,1,1,1,0,2,0,0,2,0,3,0,1,0,0,1,0,3,3,0,0,1,1,0,1,0,4,1,1,0,0,1,2,1,2,2,0,0,1,1,0,1,0,1,2,0,0,0,1,1,2,1,1,0,1,2,3,1,1,2,0,0,0,0,1,0,0,0,1,2,1,0,1,0,1,0,3,0,1,1,1,2,0,1,0,0,3,0,0,2,2,1,0,0,0,2,0,2,0,2,0,0,0,3,2,1,0,0,1,1,0,0,2,1,1,1,2,1,2,1,2,0,0,2,0,1,3,0,0,2,0,1,0,1,0,1,2,1,1,1,0,1,1,2,2,0,1,1,0,1,1,1,0,1,1,1,0,1,0,2,0,1,0,1,1,0,2,0,0,0,0,0,0,2,2,2,0,1,0,1,2,3,1,0,1,2,0,1,0,1,2,0,1,0,0,1,4,1,3,1,1,1,0,1,0,1,1,1,1,0,0,0,0,1,0,2,0,1,3,0,2,0,0,0,2,0,1,1,0,3,1,2,3,0,1,0,0,1,1,1,1,1,1,1,1,1,0,0,1,1,0,0,1,1,1,1,2,1,0,1,3,1,1,2,1,0,0,1,0,2,2,1,0,0,1,2,1,0,0,4,0,2,0,1,0,0,2,0,1,0,1,0,1,3,1,0,0,0,0,0,1,1,2,2,0,0,4,1,0,0,1,1,1,1,0,1,0,0,0,0,0,2,1,1,1,0,1,1,2,1,1,1,0,1,3,1,1,1,3,0,2,1,1,0,1,0,1,3,0,0,0,2,0,0,3,0,1,1,1,3,1,0,1,0,1,1,0,0,0,2,1,1,1,0,2,2,1,0,1,3,1,0,2,0,1,1,0,2,2,1,2,0,4,1,1,5,1,1,1,1,1,0,1,2,0,1,0,0,1,1,1,1,0,0,1,1,0,0,0,0,2,2,1,3,0,2,0,1,3,0,1,2,0,0,2,0,0,2,1,3,1,0,2,0,2,0,0,0,1,0,2,0,1,0,3,0,2,2,1,4,0,2,0,3,1,1,1,1,0,2,0,1,2,0,2,2,2,2,1,1,1,1,0,2,2,0,1,1,1,0,0,1,1,0,2,0,2,1,0,1,1,0,0,1,1,1,0,2,0,1,2,0,0,1,1,3,0,1,0,1,0,0,0,2,0,2,0,2,0,0,0,0,0,4,2,0,0]}]},"null_count":0,"last_update_version":397952049719541760}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_008.json b/cmd/explaintest/s/explain_complex_stats_tbl_008.json deleted file mode 100644 index 1c976a74c983a..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_008.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_008","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDQ4NDkxOTQ=","upper_bound":"LTIxMjY0NTc5ODU=","repeats":1},{"count":16,"lower_bound":"LTIxMjQ1MzI4Njk=","upper_bound":"LTIxMTI2NjUzODY=","repeats":1},{"count":24,"lower_bound":"LTIxMTI2MzY5NDE=","upper_bound":"LTIxMDU1OTU1NjI=","repeats":1},{"count":32,"lower_bound":"LTIxMDMzMDE2NTI=","upper_bound":"LTIwNzU3ODM0NjA=","repeats":1},{"count":40,"lower_bound":"LTIwNzA5NjI5MDY=","upper_bound":"LTIwNDgzMjg2NTA=","repeats":1},{"count":48,"lower_bound":"LTIwNDI5MzA2ODY=","upper_bound":"LTIwMzMzNzgzNzU=","repeats":1},{"count":56,"lower_bound":"LTIwMjY3OTEzNjE=","upper_bound":"LTIwMDk3OTkyMzI=","repeats":1},{"count":64,"lower_bound":"LTIwMDc4NjYxMzI=","upper_bound":"LTIwMDEwMTI1ODE=","repeats":1},{"count":72,"lower_bound":"LTE5OTI4OTU4MzE=","upper_bound":"LTE5NjQyODcyMjY=","repeats":1},{"count":80,"lower_bound":"LTE5NTc0NjI4MDk=","upper_bound":"LTE5NDQ3NjgyNTY=","repeats":1},{"count":88,"lower_bound":"LTE5NDIxNjgyMDg=","upper_bound":"LTE5MTAxODAyNzk=","repeats":1},{"count":96,"lower_bound":"LTE4OTcwNzc3Mjk=","upper_bound":"LTE4ODczOTA1NjM=","repeats":1},{"count":104,"lower_bound":"LTE4ODcwNDA1NDE=","upper_bound":"LTE4Nzc0NTcyNDM=","repeats":1},{"count":112,"lower_bound":"LTE4NzUzMDA0ODA=","upper_bound":"LTE4Njg2NTkxNTI=","repeats":1},{"count":120,"lower_bound":"LTE4NjgyNDU5NTM=","upper_bound":"LTE4NTczMzExODE=","repeats":1},{"count":128,"lower_bound":"LTE4NTU3NDQwNzY=","upper_bound":"LTE4MzQ4Nzc1MTc=","repeats":1},{"count":136,"lower_bound":"LTE4MjQ4Nzk0MjM=","upper_bound":"LTE3OTQ2MTgzODM=","repeats":1},{"count":144,"lower_bound":"LTE3OTM3MDUzMTE=","upper_bound":"LTE3Nzk4OTA3MjY=","repeats":1},{"count":152,"lower_bound":"LTE3NTkyNjI4NjQ=","upper_bound":"LTE3NDk4NjYzOTY=","repeats":1},{"count":160,"lower_bound":"LTE3NDg2MTU1OTk=","upper_bound":"LTE3NDE0NDU2NDE=","repeats":1},{"count":168,"lower_bound":"LTE3MzQxMzc2MTM=","upper_bound":"LTE3MTg5MzM1OTY=","repeats":1},{"count":176,"lower_bound":"LTE3MTc3NjEzNTM=","upper_bound":"LTE2OTUyODIwNDg=","repeats":1},{"count":184,"lower_bound":"LTE2OTQxNjM2MDY=","upper_bound":"LTE2NzY2OTE4MzQ=","repeats":1},{"count":192,"lower_bound":"LTE2NzIyMzUwNzU=","upper_bound":"LTE2NjM3ODU3MzA=","repeats":1},{"count":200,"lower_bound":"LTE2NTI3MjczMjU=","upper_bound":"LTE2NDQ5NzY2NDg=","repeats":1},{"count":208,"lower_bound":"LTE2NDM5NjczNzA=","upper_bound":"LTE2MjY1OTAyNjY=","repeats":1},{"count":216,"lower_bound":"LTE2MjUzNTE3MDQ=","upper_bound":"LTE1OTM5OTUzMTQ=","repeats":1},{"count":224,"lower_bound":"LTE1ODkwMzIzOTQ=","upper_bound":"LTE1ODI5NDMxMDM=","repeats":1},{"count":232,"lower_bound":"LTE1NzEzNDA4MDk=","upper_bound":"LTE1NDQxMzMyODQ=","repeats":1},{"count":240,"lower_bound":"LTE1NDM1MzU1ODE=","upper_bound":"LTE1MzM4NzI1NTk=","repeats":1},{"count":248,"lower_bound":"LTE1MzI1Mjg4MjQ=","upper_bound":"LTE1MjM2MTM0MTM=","repeats":1},{"count":256,"lower_bound":"LTE1MjE5NDI4Mjk=","upper_bound":"LTE1MDU2NjI5NTE=","repeats":1},{"count":264,"lower_bound":"LTE1MDAyNDM4NDk=","upper_bound":"LTE0NzQ2NTk5NjQ=","repeats":1},{"count":272,"lower_bound":"LTE0NzM5Mzc0ODU=","upper_bound":"LTE0NjQ3Njg2NTQ=","repeats":1},{"count":280,"lower_bound":"LTE0NTM4ODY1NjA=","upper_bound":"LTE0MzQ5NTkyNjE=","repeats":1},{"count":288,"lower_bound":"LTE0MzMzMjE1NjM=","upper_bound":"LTE0MTM3NTQ0NDU=","repeats":1},{"count":296,"lower_bound":"LTE0MTA1NjMyMjI=","upper_bound":"LTE0MDA0NzAwNzI=","repeats":1},{"count":304,"lower_bound":"LTEzOTkyODc5NDg=","upper_bound":"LTEzOTQzMjAwNDI=","repeats":1},{"count":312,"lower_bound":"LTEzOTM4MTA2NjQ=","upper_bound":"LTEzNzkzMDEyMDI=","repeats":1},{"count":320,"lower_bound":"LTEzNzQ4MTE2OTI=","upper_bound":"LTEzNjc2MTkzODg=","repeats":1},{"count":328,"lower_bound":"LTEzNjUxOTk4NDc=","upper_bound":"LTEzNTk5MDc2ODE=","repeats":1},{"count":336,"lower_bound":"LTEzNTk3MjMwNjI=","upper_bound":"LTEzNTU0MTM3NTM=","repeats":1},{"count":344,"lower_bound":"LTEzNTE4Mzg2MzY=","upper_bound":"LTEzMzg5MTU3OTk=","repeats":1},{"count":352,"lower_bound":"LTEzMzY3OTgyMTc=","upper_bound":"LTEzMDc1OTk2MTM=","repeats":1},{"count":360,"lower_bound":"LTEzMDY1OTg4MzM=","upper_bound":"LTEyODc5MjU5NTk=","repeats":1},{"count":368,"lower_bound":"LTEyODAwNjkwNjc=","upper_bound":"LTEyNzU2NjI2NjE=","repeats":1},{"count":376,"lower_bound":"LTEyNzQzNDA0NDQ=","upper_bound":"LTEyNjU3MTI0MTg=","repeats":1},{"count":384,"lower_bound":"LTEyNjIxNDIxMDI=","upper_bound":"LTEyMzU2NjAxMTQ=","repeats":1},{"count":392,"lower_bound":"LTEyMTA0Mjc1MTY=","upper_bound":"LTEyMDkzODk4MTM=","repeats":1},{"count":400,"lower_bound":"LTEyMDQ4OTQxNDc=","upper_bound":"LTExOTc4NjU3MzY=","repeats":1},{"count":408,"lower_bound":"LTExOTQ1NTU3NzE=","upper_bound":"LTExOTA0NjU0MzM=","repeats":1},{"count":416,"lower_bound":"LTExODYxNTAwNjI=","upper_bound":"LTExODQyMTUxNTk=","repeats":1},{"count":424,"lower_bound":"LTExNzQ0ODAwNjg=","upper_bound":"LTExNTgyMTgzNzA=","repeats":1},{"count":432,"lower_bound":"LTExNTYwMTk2NDQ=","upper_bound":"LTExMzcwMjU5NjI=","repeats":1},{"count":440,"lower_bound":"LTExMjI1NTEzMDc=","upper_bound":"LTEwOTY1ODI4ODc=","repeats":1},{"count":448,"lower_bound":"LTEwOTMzNDg0MDA=","upper_bound":"LTEwODMxMDYyNjI=","repeats":1},{"count":456,"lower_bound":"LTEwNzc3OTUxMDU=","upper_bound":"LTEwNjgwNzAwNTM=","repeats":1},{"count":464,"lower_bound":"LTEwNTg4NTg1NzA=","upper_bound":"LTEwNDQ0NTM3Mzg=","repeats":1},{"count":472,"lower_bound":"LTEwNDI3MDg0Mzk=","upper_bound":"LTEwMzMyNDYwOTc=","repeats":1},{"count":480,"lower_bound":"LTEwMjY3MzQ1NTM=","upper_bound":"LTEwMTk4Mjg1MDI=","repeats":1},{"count":488,"lower_bound":"LTEwMTk1MTIyMjQ=","upper_bound":"LTEwMDI3MDM0Njk=","repeats":1},{"count":496,"lower_bound":"LTk5Nzg4NzcwNQ==","upper_bound":"LTk4ODIzMzQzNg==","repeats":1},{"count":504,"lower_bound":"LTk4NzM0OTc2NA==","upper_bound":"LTk3NjQ4NTUyNQ==","repeats":1},{"count":512,"lower_bound":"LTk3MzA0MDU1Ng==","upper_bound":"LTk2NzIwNTQyOQ==","repeats":1},{"count":520,"lower_bound":"LTk2Njk2NjIxNw==","upper_bound":"LTk2MDEzMzA1OQ==","repeats":1},{"count":528,"lower_bound":"LTk0ODEwNjM1MA==","upper_bound":"LTkzODU3NzM0Nw==","repeats":1},{"count":536,"lower_bound":"LTkzNzA5MTQyOQ==","upper_bound":"LTkyNjA3MjM5OA==","repeats":1},{"count":544,"lower_bound":"LTkyNTQzODU5OA==","upper_bound":"LTkxOTQwNzI2NA==","repeats":1},{"count":552,"lower_bound":"LTkwMzA2NDM2OQ==","upper_bound":"LTg4OTQ0MzQ1Mw==","repeats":1},{"count":560,"lower_bound":"LTg4NzMwNzQ1NQ==","upper_bound":"LTg3NDg5MTU3NQ==","repeats":1},{"count":568,"lower_bound":"LTg3NDE1ODIzMA==","upper_bound":"LTg3MDAzMzk0Ng==","repeats":1},{"count":576,"lower_bound":"LTg2ODYwMzkwNA==","upper_bound":"LTg2MjAyOTk5MQ==","repeats":1},{"count":584,"lower_bound":"LTg0NjY1MDY3MA==","upper_bound":"LTgyNTc0MzcxNQ==","repeats":1},{"count":592,"lower_bound":"LTgyNDA5Nzg5OA==","upper_bound":"LTgxNTYyNTczOA==","repeats":1},{"count":600,"lower_bound":"LTgwODU0OTA4NQ==","upper_bound":"LTc5NDA1NDk2NQ==","repeats":1},{"count":608,"lower_bound":"LTc4MzcyNTM4MQ==","upper_bound":"LTc3NzA1MTE2Ng==","repeats":1},{"count":616,"lower_bound":"LTc3Mzg5MTE2NQ==","upper_bound":"LTc1NjMwNTc3Mw==","repeats":1},{"count":624,"lower_bound":"LTc0NzQwOTMwNw==","upper_bound":"LTc0Mzg0NDcwMQ==","repeats":1},{"count":632,"lower_bound":"LTczNjk3NDAwMQ==","upper_bound":"LTcxNDgwOTUwNw==","repeats":1},{"count":640,"lower_bound":"LTcxMTMzNzg3OA==","upper_bound":"LTY5OTU2NjE4Ng==","repeats":1},{"count":648,"lower_bound":"LTY4OTQ3NTEwNA==","upper_bound":"LTY4NTgyMDIwOQ==","repeats":1},{"count":656,"lower_bound":"LTY4NDI4OTkzNw==","upper_bound":"LTY3MzEwMjg0OQ==","repeats":1},{"count":664,"lower_bound":"LTY3MjM0NDA5Nw==","upper_bound":"LTY2MzE2ODg5Ng==","repeats":1},{"count":672,"lower_bound":"LTY2MDc1MTI5MQ==","upper_bound":"LTY0NDU4ODc4NQ==","repeats":1},{"count":680,"lower_bound":"LTY0MTAzMDA5NA==","upper_bound":"LTYzMDQzMjM3Mg==","repeats":1},{"count":688,"lower_bound":"LTYyOTM4NDk3NQ==","upper_bound":"LTYyMjMwNTc1MQ==","repeats":1},{"count":696,"lower_bound":"LTYyMDEyNzQ4NA==","upper_bound":"LTYxMDU5MjU4Nw==","repeats":1},{"count":704,"lower_bound":"LTYxMDM2MTY5MA==","upper_bound":"LTU4MzM5MjgwMA==","repeats":1},{"count":712,"lower_bound":"LTU3ODA5NjQ4Mg==","upper_bound":"LTU2NTIxODMxMA==","repeats":1},{"count":720,"lower_bound":"LTU2MzY0MzI5MQ==","upper_bound":"LTU1NzYzNDY1MQ==","repeats":1},{"count":728,"lower_bound":"LTU1NzQ3MTAyMA==","upper_bound":"LTU0NzMyODA2MQ==","repeats":1},{"count":736,"lower_bound":"LTU0NTEzODkxNQ==","upper_bound":"LTUzODY2NTUyMA==","repeats":1},{"count":744,"lower_bound":"LTUyNzYzMjYwNw==","upper_bound":"LTUyMjk3MDMwNA==","repeats":1},{"count":752,"lower_bound":"LTUyMjYxNjUyNQ==","upper_bound":"LTUxMDM1MTA0Ng==","repeats":1},{"count":760,"lower_bound":"LTUwOTkwMTU1MA==","upper_bound":"LTUwNDUyMjY0OQ==","repeats":1},{"count":768,"lower_bound":"LTUwMDM0NTg1OQ==","upper_bound":"LTQ2OTM2NTI0Mw==","repeats":1},{"count":776,"lower_bound":"LTQ2OTA1NDk5OA==","upper_bound":"LTQ2MTcwNzYwMA==","repeats":1},{"count":784,"lower_bound":"LTQ2MDg4NTU2MQ==","upper_bound":"LTQ1MjkwNTAwNA==","repeats":1},{"count":792,"lower_bound":"LTQ1MjcxOTQyMQ==","upper_bound":"LTQ0OTYwODMxMQ==","repeats":1},{"count":800,"lower_bound":"LTQzMzA2MzU5OQ==","upper_bound":"LTQyNTkwNTE4Nw==","repeats":1},{"count":808,"lower_bound":"LTQyNTU5MTAyMQ==","upper_bound":"LTM5MDczMTU1Nw==","repeats":1},{"count":816,"lower_bound":"LTM4OTc4ODU5MA==","upper_bound":"LTM4MDY0MTM3OA==","repeats":1},{"count":824,"lower_bound":"LTM3NTI2NjYyNA==","upper_bound":"LTM2OTc3ODA5MQ==","repeats":1},{"count":832,"lower_bound":"LTM2ODM4MzU5OQ==","upper_bound":"LTM1NjYzNzU0Mg==","repeats":1},{"count":840,"lower_bound":"LTM1NjQzOTYzOQ==","upper_bound":"LTMzMDE3Nzk2NQ==","repeats":1},{"count":848,"lower_bound":"LTMxODgzMzMyMQ==","upper_bound":"LTMwNjY3NTExMQ==","repeats":1},{"count":856,"lower_bound":"LTMwNTc3NzI2NQ==","upper_bound":"LTI4OTkwMDg1NQ==","repeats":1},{"count":864,"lower_bound":"LTI4Nzk0ODgxMg==","upper_bound":"LTI3MzM2OTgyMg==","repeats":1},{"count":872,"lower_bound":"LTI3MjgwNjA5Nw==","upper_bound":"LTIzODk1MjA0Mg==","repeats":1},{"count":880,"lower_bound":"LTIzNTYyOTg5NA==","upper_bound":"LTIzMjUwODU3NA==","repeats":1},{"count":888,"lower_bound":"LTIzMDExNzk1Nw==","upper_bound":"LTIxOTYyMTc5MQ==","repeats":1},{"count":896,"lower_bound":"LTIxODQxNTA2Ng==","upper_bound":"LTE5OTc4MTU2MA==","repeats":1},{"count":904,"lower_bound":"LTE5NDUzNDQxOA==","upper_bound":"LTE3NTk1OTEyNA==","repeats":1},{"count":912,"lower_bound":"LTE3MjU2NDc5Ng==","upper_bound":"LTE1NDA1MzQzOQ==","repeats":1},{"count":920,"lower_bound":"LTE1MjA5ODQ5Mw==","upper_bound":"LTEzNjM2NjY2Mg==","repeats":1},{"count":928,"lower_bound":"LTEzNTg4NzExNA==","upper_bound":"LTExODkwNzI3Nw==","repeats":1},{"count":936,"lower_bound":"LTExNDU0MDI2MA==","upper_bound":"LTEwNTUwNDAwOA==","repeats":1},{"count":944,"lower_bound":"LTEwMzg2MTQ5Mg==","upper_bound":"LTk0Mzk1MTIw","repeats":1},{"count":952,"lower_bound":"LTkyNDQxMjg3","upper_bound":"LTc3NjkzODA4","repeats":1},{"count":960,"lower_bound":"LTc3MTkxNDY0","upper_bound":"LTYxNzgwNDU5","repeats":1},{"count":968,"lower_bound":"LTYxMTU2NTg1","upper_bound":"LTU3NDA4OTI2","repeats":1},{"count":976,"lower_bound":"LTUwNjIyNzQx","upper_bound":"LTQyMDc1Mzcz","repeats":1},{"count":984,"lower_bound":"LTM2OTY1NjAz","upper_bound":"LTI5MjE4MDY1","repeats":1},{"count":992,"lower_bound":"LTI4MDQxMzIw","upper_bound":"LTEzOTU0ODcw","repeats":1},{"count":1000,"lower_bound":"LTEzNjUzNTg2","upper_bound":"MTAxMDk2NDM=","repeats":1},{"count":1008,"lower_bound":"MTM1MzI2MDU=","upper_bound":"MjI5MDA3MTM=","repeats":1},{"count":1016,"lower_bound":"MjI5NTQyNDA=","upper_bound":"MzMyMDU5NDM=","repeats":1},{"count":1024,"lower_bound":"MzQ2NzMxMDk=","upper_bound":"NDI0Mjg5NTE=","repeats":1},{"count":1032,"lower_bound":"NDQxODM5MzQ=","upper_bound":"NTIyNjM3ODM=","repeats":1},{"count":1040,"lower_bound":"NTkwODk0NzI=","upper_bound":"OTI3MjM2OTI=","repeats":1},{"count":1048,"lower_bound":"OTYxOTg1NzE=","upper_bound":"MTAzOTUzNDQ3","repeats":1},{"count":1056,"lower_bound":"MTA5MDQ1MDY0","upper_bound":"MTI0Mzk1NzY4","repeats":1},{"count":1064,"lower_bound":"MTMyMTgzMzg0","upper_bound":"MTQ0ODEyMTY0","repeats":1},{"count":1072,"lower_bound":"MTUwNTM0NTA4","upper_bound":"MTY5ODQ4OTc1","repeats":1},{"count":1080,"lower_bound":"MTgzOTU5ODIw","upper_bound":"MTkxNTM4MDk0","repeats":1},{"count":1088,"lower_bound":"MTk1NDQ4NzUx","upper_bound":"MTk5Nzc0NzAz","repeats":1},{"count":1096,"lower_bound":"MjA4NDE4NzIy","upper_bound":"MjE1NjQwODQw","repeats":1},{"count":1104,"lower_bound":"MjE4NjIwNDc3","upper_bound":"MjQxODUwNTYx","repeats":1},{"count":1112,"lower_bound":"MjQ1MTQ3NjA5","upper_bound":"MjU5ODAwNDcy","repeats":1},{"count":1120,"lower_bound":"MjcwNDY1MjM5","upper_bound":"MzAyMTMyNzM1","repeats":1},{"count":1128,"lower_bound":"MzExNDU4NTgz","upper_bound":"MzE2OTQ2Nzc2","repeats":1},{"count":1136,"lower_bound":"MzE4Mjg1ODc0","upper_bound":"MzI1Nzk2MDAw","repeats":1},{"count":1144,"lower_bound":"MzI3ODY1NjMx","upper_bound":"MzM1OTY0Nzc4","repeats":1},{"count":1152,"lower_bound":"MzQ1OTM3MDk3","upper_bound":"MzYxOTUwMjQw","repeats":1},{"count":1160,"lower_bound":"MzYyMDkzMDc3","upper_bound":"Mzc4NzU3MjEy","repeats":1},{"count":1168,"lower_bound":"Mzg4NjA4MDU3","upper_bound":"Mzk3MDAwNzg0","repeats":1},{"count":1176,"lower_bound":"NDAzODM0OTI3","upper_bound":"NDIzMTA2MjM1","repeats":1},{"count":1184,"lower_bound":"NDI2MTI0NzA5","upper_bound":"NDI4OTkyOTkw","repeats":1},{"count":1192,"lower_bound":"NDM0MDIyMTc0","upper_bound":"NDQxOTU3MTM0","repeats":1},{"count":1200,"lower_bound":"NDQyNzE2NzQw","upper_bound":"NDU4NTk3ODk1","repeats":1},{"count":1208,"lower_bound":"NDYzMjM0MDQz","upper_bound":"NDcwNzcyNDEw","repeats":1},{"count":1216,"lower_bound":"NDczMjc1NTM2","upper_bound":"NDg2NTQ5MzY3","repeats":1},{"count":1224,"lower_bound":"NDk4NDUyNzEx","upper_bound":"NTA4MjU5MTcy","repeats":1},{"count":1232,"lower_bound":"NTA4NTc2NTc0","upper_bound":"NTIzNzMxMDUx","repeats":1},{"count":1240,"lower_bound":"NTI0NzgzMTgy","upper_bound":"NTMzMTE2ODEy","repeats":1},{"count":1248,"lower_bound":"NTM1MTExNTY4","upper_bound":"NTQ3MTcxNTg3","repeats":1},{"count":1256,"lower_bound":"NTUwMjQ5MjM1","upper_bound":"NTY4NzQ1Mzc2","repeats":1},{"count":1264,"lower_bound":"NTcxMjQ5ODEy","upper_bound":"NTc2MDMxODYy","repeats":1},{"count":1272,"lower_bound":"NTgxMTEwNTAy","upper_bound":"NTg1OTcxMTY4","repeats":1},{"count":1280,"lower_bound":"NTg4NjEyMjg0","upper_bound":"NTk4ODE3NDI1","repeats":1},{"count":1288,"lower_bound":"NjAyOTkxMzEx","upper_bound":"NjIwMTIwNzcx","repeats":1},{"count":1296,"lower_bound":"NjI3NTE3NTE3","upper_bound":"NjM1ODI2MDEz","repeats":1},{"count":1304,"lower_bound":"NjM2MDQ2ODY1","upper_bound":"NjQwNDAzMDk5","repeats":1},{"count":1312,"lower_bound":"NjQxNjgzNzU2","upper_bound":"NjUzNzcyNDAx","repeats":1},{"count":1320,"lower_bound":"NjYwNDgyNzQ1","upper_bound":"NjgxNTU5MzU4","repeats":1},{"count":1328,"lower_bound":"Njg3OTE5NTk3","upper_bound":"NzAwMjk5MDk2","repeats":1},{"count":1336,"lower_bound":"NzAwODIwMTQ3","upper_bound":"NzI1NzcxNzgz","repeats":1},{"count":1344,"lower_bound":"NzMxNTk2MTI2","upper_bound":"NzQwMzExMjIz","repeats":1},{"count":1352,"lower_bound":"NzQwNTAxMzMw","upper_bound":"NzY4NjkxNDM2","repeats":1},{"count":1360,"lower_bound":"NzczMTAyMTIy","upper_bound":"Nzc3ODAxNzAw","repeats":1},{"count":1368,"lower_bound":"NzgwNjk0ODAy","upper_bound":"Nzg5MTMwMjA5","repeats":1},{"count":1376,"lower_bound":"ODAwMTY5MTg3","upper_bound":"ODEwODQyMzIx","repeats":1},{"count":1384,"lower_bound":"ODE5NTA3NjA1","upper_bound":"ODM4MjU0ODM0","repeats":1},{"count":1392,"lower_bound":"ODM4MjU1OTUw","upper_bound":"ODQyMDk4NDc3","repeats":1},{"count":1400,"lower_bound":"ODQzMDUxMTAz","upper_bound":"ODUwMzg1MDMz","repeats":1},{"count":1408,"lower_bound":"ODU3MDIwNDE0","upper_bound":"ODYwMDI3NjU2","repeats":1},{"count":1416,"lower_bound":"ODY2NDczNDY4","upper_bound":"ODc4OTc3MTE0","repeats":1},{"count":1424,"lower_bound":"ODg4NDY3MDE0","upper_bound":"ODk0MDc1MTUw","repeats":1},{"count":1432,"lower_bound":"OTEyMTY3MjE1","upper_bound":"OTI2MDg3Mjg5","repeats":1},{"count":1440,"lower_bound":"OTMwNDUxOTUz","upper_bound":"OTU3NDYwMTQz","repeats":1},{"count":1448,"lower_bound":"OTcxMDkwODc5","upper_bound":"OTc3OTgwNTYw","repeats":1},{"count":1456,"lower_bound":"OTc4Mzk0NjM5","upper_bound":"OTk5ODA1MDIw","repeats":1},{"count":1464,"lower_bound":"MTAwNTAwOTg5Ng==","upper_bound":"MTAxMzk5MjE3Nw==","repeats":1},{"count":1472,"lower_bound":"MTAyNzI2MDAzMw==","upper_bound":"MTAzMjkyNjI1OA==","repeats":1},{"count":1480,"lower_bound":"MTAzNzcyMjM4NA==","upper_bound":"MTA1MjY4MzMzMg==","repeats":1},{"count":1488,"lower_bound":"MTA1Mjk0MjI3OQ==","upper_bound":"MTA2ODI2NDMxNg==","repeats":1},{"count":1496,"lower_bound":"MTA2OTQ2Njg3OA==","upper_bound":"MTA3MzI5MTEzOQ==","repeats":1},{"count":1504,"lower_bound":"MTA3NTk0NTc4NQ==","upper_bound":"MTA4NjA0MTcwNw==","repeats":1},{"count":1512,"lower_bound":"MTA5MDA0MzY4MA==","upper_bound":"MTEyNDEyMTAxMw==","repeats":1},{"count":1520,"lower_bound":"MTEyNzI1Nzc3OA==","upper_bound":"MTE0MTAwOTUzMA==","repeats":1},{"count":1528,"lower_bound":"MTE0NDUzMjI1Nw==","upper_bound":"MTE2MDAwMzAyOA==","repeats":1},{"count":1536,"lower_bound":"MTE2MjIzMTQ4MQ==","upper_bound":"MTE2NzMwODY4MA==","repeats":1},{"count":1544,"lower_bound":"MTE4MDQzNjQ0Nw==","upper_bound":"MTE4NTk5MjI0OA==","repeats":1},{"count":1552,"lower_bound":"MTE4NzExMDg4Mg==","upper_bound":"MTE5Nzc1MzE0Ng==","repeats":1},{"count":1560,"lower_bound":"MTIwMDExNzMyNw==","upper_bound":"MTIxMjI5MzQzNA==","repeats":1},{"count":1568,"lower_bound":"MTIyNjE4NTg4MA==","upper_bound":"MTIzNzI2MDc5MA==","repeats":1},{"count":1576,"lower_bound":"MTIzOTc2OTU1MQ==","upper_bound":"MTI0NTAyNDU5OQ==","repeats":1},{"count":1584,"lower_bound":"MTI1MTAyOTc2OQ==","upper_bound":"MTI1ODcyNDQ3MQ==","repeats":1},{"count":1592,"lower_bound":"MTI2MTcwODM4Ng==","upper_bound":"MTI3MTY0MDcxMw==","repeats":1},{"count":1600,"lower_bound":"MTI3MjYwOTAyMg==","upper_bound":"MTI3NjQ1NjU5Ng==","repeats":1},{"count":1608,"lower_bound":"MTI4NjEyNTE1Ng==","upper_bound":"MTMwNjgyOTc0NQ==","repeats":1},{"count":1616,"lower_bound":"MTMxMDIzNzQ5OA==","upper_bound":"MTMyNjMwOTU2MA==","repeats":1},{"count":1624,"lower_bound":"MTMyNzc5Nzc4Mw==","upper_bound":"MTM0NzQ0OTY3Nw==","repeats":1},{"count":1632,"lower_bound":"MTM1MjQ5MzU2MA==","upper_bound":"MTM3MDQ1MDU5Ng==","repeats":1},{"count":1640,"lower_bound":"MTM3NzYwNzgyNg==","upper_bound":"MTM4MjI4NTExNg==","repeats":1},{"count":1648,"lower_bound":"MTM5MTQ0MDc5NA==","upper_bound":"MTQxMjk2NDg2OA==","repeats":1},{"count":1656,"lower_bound":"MTQxNjg2MDAwMQ==","upper_bound":"MTQxOTE1NDMyMA==","repeats":1},{"count":1664,"lower_bound":"MTQyNTg5MDY2Nw==","upper_bound":"MTQzMjQ4OTQ1OQ==","repeats":1},{"count":1672,"lower_bound":"MTQzNjU5NTI0NQ==","upper_bound":"MTQ1MTEwNTI1Mw==","repeats":1},{"count":1680,"lower_bound":"MTQ1MTk2MDk3Ng==","upper_bound":"MTQ2MDU5NzgwMA==","repeats":1},{"count":1688,"lower_bound":"MTQ2OTY1MjE5NQ==","upper_bound":"MTQ4MzY2MTQ5NA==","repeats":1},{"count":1696,"lower_bound":"MTQ4NTQ5NTU0Nw==","upper_bound":"MTUwNDE0NDM1NQ==","repeats":1},{"count":1704,"lower_bound":"MTUzMDc4MTYxOA==","upper_bound":"MTU0OTMyODc4Mw==","repeats":1},{"count":1712,"lower_bound":"MTU1MjcwMjE2OQ==","upper_bound":"MTU2MTc2MzcyMQ==","repeats":1},{"count":1720,"lower_bound":"MTU2MjQ5NjY3Nw==","upper_bound":"MTU3MjM2NjY1NQ==","repeats":1},{"count":1728,"lower_bound":"MTU3Njg3ODI3OA==","upper_bound":"MTU4NzAzNTE0OQ==","repeats":1},{"count":1736,"lower_bound":"MTU4NzY3NDM0Mw==","upper_bound":"MTU5NDIyNDQ5OA==","repeats":1},{"count":1744,"lower_bound":"MTYwMDg2NTIyNg==","upper_bound":"MTYxMDk3NTE2Ng==","repeats":1},{"count":1752,"lower_bound":"MTYyNjE3NTM2MA==","upper_bound":"MTY0NjUxNzkzNw==","repeats":1},{"count":1760,"lower_bound":"MTY0NzczNDE5Mg==","upper_bound":"MTY1NTc0Nzc3NA==","repeats":1},{"count":1768,"lower_bound":"MTY1NjI5Mzg0NA==","upper_bound":"MTY3MzY3NTU2NA==","repeats":1},{"count":1776,"lower_bound":"MTY3NzAwMDM4NA==","upper_bound":"MTY5MTg4MTQ1NA==","repeats":1},{"count":1784,"lower_bound":"MTY5NDA4NjQ4MA==","upper_bound":"MTcxMTM0MDk0NQ==","repeats":1},{"count":1792,"lower_bound":"MTcxMzkyNjc0NA==","upper_bound":"MTcyNjg2ODY4Nw==","repeats":1},{"count":1800,"lower_bound":"MTczMDQ4MTI5NQ==","upper_bound":"MTc0MzYwNjY3Mg==","repeats":1},{"count":1808,"lower_bound":"MTc0NzkyMjk1NA==","upper_bound":"MTc1NjAyMDY2OA==","repeats":1},{"count":1816,"lower_bound":"MTc2Nzc1NDQ0Mw==","upper_bound":"MTc3NjE1MTA1Mw==","repeats":1},{"count":1824,"lower_bound":"MTc3OTM0MzE4MA==","upper_bound":"MTc4OTg4NTA3Nw==","repeats":1},{"count":1832,"lower_bound":"MTc5Mjk4ODYwMg==","upper_bound":"MTgyNzc0NDMwNQ==","repeats":1},{"count":1840,"lower_bound":"MTgzMTM0NjQyMA==","upper_bound":"MTgzNDE5MDkyMg==","repeats":1},{"count":1848,"lower_bound":"MTgzNzk3MTE3Ng==","upper_bound":"MTg1NTAxOTMyMw==","repeats":1},{"count":1856,"lower_bound":"MTg1NTczNjk4MA==","upper_bound":"MTg1ODAyNDEzMA==","repeats":1},{"count":1864,"lower_bound":"MTg2ODIwODYxMg==","upper_bound":"MTg3OTk1NDcwNA==","repeats":1},{"count":1872,"lower_bound":"MTg5MDU2MTU1MQ==","upper_bound":"MTg5ODA2MjEyNw==","repeats":1},{"count":1880,"lower_bound":"MTg5ODA3ODY5Mw==","upper_bound":"MTkwMjk5ODk1NA==","repeats":1},{"count":1888,"lower_bound":"MTkwNDQyNjk2Mg==","upper_bound":"MTkzMTQ0NDEwNw==","repeats":1},{"count":1896,"lower_bound":"MTkzMTU3MzA2Nw==","upper_bound":"MTkzNDI5MTcwMA==","repeats":1},{"count":1904,"lower_bound":"MTkzNzUwOTgzNQ==","upper_bound":"MTk0MTQ4MjYwNg==","repeats":1},{"count":1912,"lower_bound":"MTk1OTU2Mzg0Mg==","upper_bound":"MTk3NTA4NTU5OQ==","repeats":1},{"count":1920,"lower_bound":"MTk3NTUyNjkzMA==","upper_bound":"MTk4MDI1NTgwNw==","repeats":1},{"count":1928,"lower_bound":"MTk4NDEzMjE0Nw==","upper_bound":"MTk5ODAwOTU4NA==","repeats":1},{"count":1936,"lower_bound":"MjAwMzc4MDkyOQ==","upper_bound":"MjAyMDgyODg1MQ==","repeats":1},{"count":1944,"lower_bound":"MjAyNjU2MTM1MA==","upper_bound":"MjAzMTQ3Mzg3NQ==","repeats":1},{"count":1952,"lower_bound":"MjAzNDUyNTIwOA==","upper_bound":"MjA0OTM5OTIzNw==","repeats":1},{"count":1960,"lower_bound":"MjA1MDI2ODM2NQ==","upper_bound":"MjA1NDU3NjY5Ng==","repeats":1},{"count":1968,"lower_bound":"MjA1NDcxNTYzNg==","upper_bound":"MjA2NzU5NzI0MQ==","repeats":1},{"count":1976,"lower_bound":"MjA2ODUxMjMxNA==","upper_bound":"MjA4NTcwNTY0Mg==","repeats":1},{"count":1984,"lower_bound":"MjA4NzgzMTM5Mw==","upper_bound":"MjA5NjI2ODI2MQ==","repeats":1},{"count":1992,"lower_bound":"MjEwMzg5Nzk1Ng==","upper_bound":"MjExMzk5MDUwOA==","repeats":1},{"count":2000,"lower_bound":"MjEyMzc5MTgxNg==","upper_bound":"MjEzOTExNzU2MA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,0,1,1,1,1,1,1,1,1,1,0,0,0,0,1,0,0,0,0,1,1,3,1,0,1,2,1,2,1,1,1,2,0,0,0,1,2,1,2,0,1,1,2,0,0,2,1,2,2,1,1,2,1,1,2,0,2,0,1,0,0,1,1,1,1,3,0,0,1,0,1,2,1,1,1,1,0,1,1,1,1,2,0,0,1,0,2,0,2,0,0,3,1,0,0,0,0,3,0,1,0,0,0,1,1,2,2,2,0,0,3,0,2,0,1,0,0,1,1,2,0,1,1,5,2,2,1,2,1,1,0,0,1,2,0,1,0,0,0,0,1,0,1,5,0,2,2,1,1,0,1,1,4,3,2,2,1,0,3,3,1,0,1,1,1,0,1,2,1,0,1,0,1,0,1,3,2,0,2,1,0,2,0,1,3,0,0,2,1,0,0,2,0,0,1,0,1,1,1,1,1,0,2,1,2,1,1,1,1,0,1,1,0,0,3,1,0,1,1,2,1,1,1,2,0,1,1,2,1,2,0,1,4,0,3,1,4,2,0,0,0,0,3,1,1,1,2,0,1,1,1,1,1,0,1,0,2,1,4,0,2,0,0,0,2,0,2,1,1,1,0,2,1,1,4,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1,0,0,0,2,0,2,1,0,2,1,2,0,3,1,0,1,1,1,2,0,1,3,0,0,0,3,0,0,1,1,0,0,3,1,0,1,2,0,0,1,1,0,0,0,0,1,1,2,1,1,1,0,1,1,2,2,0,1,1,2,2,2,2,0,1,0,0,0,2,2,0,1,0,1,3,1,2,1,2,0,2,1,1,1,2,1,0,0,2,0,1,0,1,0,0,3,0,1,2,1,0,0,5,0,0,1,0,2,1,0,1,0,2,0,2,1,0,2,1,1,1,0,1,2,1,0,1,0,4,2,0,0,3,0,1,0,2,1,0,0,0,1,1,2,0,1,1,1,3,1,4,1,0,0,2,1,1,1,0,1,1,2,2,0,1,0,0,3,3,1,1,1,3,0,0,2,0,2,0,2,0,0,0,1,1,0,1,1,1,0,0,3,0,0,2,3,1,1,1,1,2,1,0,1,2,0,0,1,1,0,1,1,1,1,2,0,2,1,0,0,0,0,0,0,3,2,0,3,1,0,1,1,1,2,0,1,1,0,1,2,0,0,1,3,0,1,2,0,1,0,1,1,0,0,0,2,1,1,0,1,0,1,0,0,0,0,1,0,1,0,1,2,0,1,0,2,2,1,0,1,0,0,2,1,2,1,0,0,1,1,1,0,1,0,1,1,0,2,1,1,0,3,1,0,0,2,2,0,0,3,1,1,3,3,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,1,2,0,2,0,0,1,1,2,0,0,0,0,1,2,2,3,0,1,1,2,0,1,1,0,0,0,1,1,1,0,0,1,2,4,1,1,1,1,1,1,0,0,2,2,1,0,2,0,0,2,0,0,2,2,2,0,2,0,2,1,1,2,1,0,0,3,0,0,1,2,0,1,1,1,1,0,0,1,1,0,3,0,1,2,0,1,0,1,0,4,1,1,1,3,1,1,1,1,2,0,0,0,1,3,2,0,2,1,0,0,1,4,0,1,0,1,0,3,2,1,0,0,0,3,0,2,0,1,2,1,0,1,3,2,1,3,0,0,1,1,0,1,0,0,0,1,0,0,1,2,0,0,3,0,0,0,3,0,0,1,0,0,1,4,2,2,0,0,0,0,1,1,1,0,1,0,2,1,0,1,0,3,0,2,0,3,2,0,0,1,2,1,3,0,0,1,0,0,2,0,0,1,1,1,2,2,2,2,1,0,1,1,2,2,1,1,0,1,1,1,3,1,1,1,1,0,1,1,0,1,2,0,1,1,0,2,2,0,0,0,1,0,2,2,1,2,2,0,0,1,2,3,2,0,1,1,2,1,1,0,1,0,1,1,1,0,1,0,0,1,0,1,1,0,1,0,3,1,1,2,0,0,1,3,2,2,1,2,1,2,0,0,1,0,0,1,1,1,0,0,0,1,1,0,0,1,0,1,4,1,0,1,2,0,1,0,1,2,0,0,0,0,1,0,0,0,0,0,4,2,1,0,0,1,0,1,0,3,1,0,1,1,2,0,1,1,1,3,1,1,0,0,1,0,2,0,1,1,1,2,2,0,1,1,1,2,3,2,2,1,1,0,1,2,3,2,0,0,0,1,0,1,1,1,1,2,0,1,1,3,0,0,0,0,0,0,1,2,2,1,1,0,0,0,1,0,1,1,3,1,0,2,2,2,1,3,2,0,0,2,1,1,0,1,2,2,2,1,0,0,0,0,1,0,1,3,3,1,0,0,3,0,4,1,2,0,1,0,0,0,0,3,1,1,1,1,0,3,1,3,2,1,1,0,0,2,0,1,0,0,1,0,0,1,0,0,2,3,0,1,0,0,0,1,2,1,0,1,1,0,0,0,2,3,0,0,0,1,1,1,0,2,1,0,2,2,0,0,2,0,2,1,1,2,3,1,1,1,2,1,1,2,1,0,2,0,1,2,2,1,0,2,0,1,0,1,1,1,1,0,3,1,1,2,2,1,1,2,0,2,1,2,1,0,1,3,0,1,2,0,3,1,0,1,2,1,2,0,1,1,1,2,2,1,2,0,0,0,0,2,1,0,0,0,1,1,0,1,1,2,1,2,1,1,1,1,1,1,1,1,2,0,0,1,1,0,2,1,2,0,1,2,0,2,0,0,1,1,0,0,1,1,1,1,0,1,1,0,0,0,1,2,0,0,1,2,1,0,2,0,1,0,0,0,0,1,0,0,1,0,1,1,0,2,2,3,2,1,3,0,0,0,2,0,0,0,2,1,1,1,1,0,2,3,1,0,0,0,1,1,2,0,0,2,1,1,1,1,1,1,1,1,0,1,1,1,0,0,1,1,1,0,2,0,1,1,1,1,1,2,2,2,1,0,0,2,1,0,0,2,1,2,1,1,2,0,0,0,1,0,0,2,1,0,2,1,0,0,0,0,1,1,0,0,0,1,0,1,0,2,1,1,2,0,1,0,2,1,1,1,1,1,3,0,1,2,0,0,0,1,3,1,1,0,0,0,1,3,1,2,3,0,2,0,0,2,0,3,0,1,0,0,3,1,1,0,2,0,0,0,0,0,0,3,0,0,1,2,1,4,1,0,2,1,0,1,1,0,4,0,1,1,2,1,0,3,0,0,0,1,2,0,1,2,2,0,1,1,0,1,2,1,2,0,1,1,2,1,1,2,0,1,1,1,1,1,2,2,3,0,2,0,0,1,3,2,1,2,0,0,1,2,0,1,4,0,2,0,1,0,1,0,1,1,0,0,0,1,2,2,1,0,1,0,3,2,0,2,2,0,1,0,1,1,1,0,2,1,1,1,3,1,4,2,0,0,0,0,1,2,0,1,2,1,4,0,0,2,2,0,0,2,0,0,0,1,1,3,0,1,2,1,1,1,1,2,1,0,1,1,2,0,2,0,0,2,0,1,1,2,2,0,0,3,3,2,0,3,2,0,3,0,1,2,1,1,2,0,3,0,0,4,1,2,0,0,2,1,1,1,3,0,2,2,1,1,0,2,0,1,5,0,1,1,2,0,1,1,0,2,0,2,0,0,3,1,2,0,1,0,0,1,0,0,2,0,0,0,0,0,1,2,0,1,0,1,0,2,0,1,0,2,2,0,1,0,0,2,0,1,1,2,1,1,0,2,0,0,2,0,1,1,0,0,0,0,0,4,0,1,1,0,3,2,0,1,1,0,0,0,0,0,0,2,0,0,1,0,0,3,0,0,1,0,2,1,0,1,2,2,1,0,2,0,0,0,1,0,2,1,1,1,2,0,3,0,3,0,0,0,2,0,0,0,2,2,0,0,1,1,0,1,0,2,1,0,2,1,3,0,2,1,1,2,1,0,2,2,2,0,2,2,2,1,1,1,1,1,4,2,2,0,3,1,1,1,0,2,1,0,0,2,3,4,0,0,2,2,0,0,1,1,3,1,2,3,1,0,1,2,0,1,2,1,2,1,4,1,1,0,1,2,4,3,2,0,0,2,2,0,1,1,1,0,0,1,1,2,1,0,1,3,0,0,0,0,0,0,0,0,2,2,0,1,1,1,2,1,2,3,0,1,3,4,0,1,0,2,0,0,2,3,1,2,2,1,1,1,1,0,1,1,2,2,0,2,0,1,1,1,1,0,2,2,1,0,0,0,0,0,3,0,2,0,1,0,1,1,0,2,0,0,2,1,2,0,0,1,0,1,0,1,1,0,0,2,1,2,2,2,1,0,2,1,0,1,1,1,1,0,1,0,3,1,2,0,1,1,1,0,2,0,3,4,1,2,1,1,1,1,0,2,1,1,2,0,0,0,0,0,0,1,1,3,0,2,2,2,2,0,1,2,2,0,1,2,1,1,0,1,0,2,1,2,0,0,0,0,0,1,3,1,0,2,0,3,2,2,0,1,5,2,0,0,2,2,3,0,2,2,1,2,1,1,0,2,0,0,4,0,1,1,1,1,1,0,2,1,1,1,1,1,1,0,0]},{"counters":[0,1,0,0,1,0,0,1,0,1,0,1,2,1,1,0,2,1,0,0,1,1,0,2,1,0,0,0,0,0,1,1,2,0,1,2,0,1,0,0,0,0,1,1,1,1,0,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,0,1,2,1,0,1,1,0,0,1,0,5,2,2,0,1,4,0,3,1,0,2,0,3,0,1,1,0,2,0,1,1,1,0,1,2,0,0,0,1,2,1,1,0,1,2,0,2,0,1,2,0,0,1,3,2,1,0,2,2,0,0,0,2,0,1,0,0,0,1,1,2,0,0,3,1,2,1,0,4,1,3,0,1,2,1,1,1,1,2,1,0,1,0,2,1,0,0,0,1,0,3,0,0,0,1,0,0,1,0,0,3,2,1,0,1,1,1,1,0,0,1,0,2,2,0,4,1,0,3,0,2,0,0,2,1,2,0,0,1,1,0,1,2,2,1,0,1,2,0,0,1,0,3,0,0,1,0,1,2,1,0,2,0,3,1,0,0,1,0,1,1,0,1,2,1,0,0,1,2,1,2,1,1,0,0,1,1,0,1,0,1,0,3,1,1,0,1,2,0,0,1,1,0,2,0,3,2,1,2,1,2,0,2,2,0,3,0,0,2,1,0,1,2,1,0,1,2,1,0,0,2,2,2,2,1,1,3,0,2,0,1,2,1,0,1,0,0,2,1,2,0,2,0,1,1,2,0,1,1,1,2,1,0,0,1,3,2,1,0,1,0,1,1,1,1,0,0,0,1,3,0,1,1,1,0,2,0,1,3,1,1,2,2,2,0,0,2,1,2,1,2,1,2,0,2,1,1,1,2,2,2,1,0,1,1,4,0,0,2,0,0,2,4,1,0,1,0,0,1,1,1,1,1,1,0,3,1,1,0,1,4,2,0,1,0,0,0,0,0,3,1,4,0,4,1,1,4,3,2,1,1,0,1,1,1,0,1,0,1,0,1,1,0,0,1,0,0,0,3,0,1,1,1,0,1,5,0,0,2,0,4,0,1,0,2,0,2,1,0,0,1,1,0,2,1,0,1,2,3,0,0,1,0,2,1,3,0,1,1,0,1,1,1,2,2,0,0,1,1,2,3,2,1,3,0,0,0,1,0,1,2,1,0,1,0,0,1,2,0,1,2,0,2,1,1,1,2,0,1,1,3,0,1,0,0,1,1,0,1,2,1,1,1,1,0,1,0,0,0,0,2,0,2,1,3,0,1,2,0,1,0,1,1,2,0,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,0,0,0,0,0,2,0,0,1,0,2,1,1,0,1,0,0,2,1,2,1,0,0,1,2,1,1,0,1,3,0,0,2,0,2,2,2,0,1,0,2,1,0,0,2,0,3,1,2,1,1,2,1,2,1,0,0,0,0,0,1,0,1,1,0,0,1,0,1,1,0,1,0,2,1,0,1,2,3,1,3,1,0,2,0,1,1,1,0,2,2,1,0,1,1,4,1,0,1,1,0,1,3,2,1,0,2,0,0,1,0,1,1,1,0,1,1,2,1,0,0,1,2,2,2,1,0,1,1,1,0,1,0,0,3,1,3,1,2,1,1,0,0,0,0,1,1,0,0,1,1,1,0,2,3,0,3,0,1,0,2,0,1,0,0,2,2,1,1,1,0,1,0,3,0,1,1,0,1,1,0,0,0,0,0,1,3,0,0,1,1,1,1,0,0,1,0,0,0,2,1,0,0,1,2,1,0,0,1,2,0,1,1,1,0,0,1,0,0,1,0,1,3,0,0,1,1,2,2,2,0,1,1,0,1,2,0,0,0,0,0,1,2,1,0,0,1,2,3,0,0,1,0,0,0,1,1,1,1,2,0,1,2,0,1,0,0,1,1,2,2,2,0,0,0,0,1,2,0,1,1,4,2,1,2,1,1,0,1,0,1,1,0,3,1,4,1,1,2,1,3,4,0,0,2,0,1,1,0,1,1,0,1,2,0,0,1,1,2,1,2,1,0,2,1,1,1,1,2,0,1,0,1,1,1,1,0,0,3,1,2,1,2,1,1,1,0,1,0,0,2,2,0,2,0,2,1,1,0,1,4,1,1,3,1,0,0,1,2,1,1,2,1,1,1,0,0,1,1,1,1,0,1,2,2,1,0,0,1,0,1,1,0,3,2,1,2,2,1,2,0,1,1,0,2,1,0,1,0,1,1,3,4,2,0,1,2,3,3,0,0,0,0,2,2,2,2,3,1,1,2,0,1,2,2,2,0,0,0,3,0,4,1,1,1,1,1,1,0,1,0,2,3,1,3,1,0,1,3,2,1,4,2,0,0,0,0,2,0,1,4,0,0,4,1,1,0,1,1,2,0,2,2,0,0,0,3,1,1,0,0,2,2,0,1,0,1,2,2,0,0,3,1,1,0,2,1,0,0,2,0,0,0,2,1,0,2,0,2,1,0,2,2,2,2,1,1,0,1,0,2,1,1,2,4,0,1,2,1,2,2,1,0,1,2,0,0,1,0,0,1,0,1,0,1,1,2,2,1,0,1,1,0,0,1,1,1,2,0,0,2,1,1,1,1,3,1,0,1,3,2,0,0,1,0,2,2,2,0,2,1,2,0,1,0,2,1,3,1,0,0,1,0,0,2,0,1,2,2,1,0,0,0,0,0,1,0,0,1,2,0,1,3,1,1,0,1,1,1,0,0,1,1,0,1,2,0,0,1,3,1,0,1,0,1,1,2,0,0,1,0,1,1,1,1,0,0,1,2,3,1,3,3,3,0,0,2,1,1,1,1,1,0,2,0,1,1,2,1,4,2,1,1,2,0,1,1,1,0,1,1,1,1,1,1,3,0,1,0,1,0,1,1,1,0,0,3,0,0,0,3,0,0,2,0,2,1,0,1,1,3,2,1,0,1,2,1,1,1,0,2,0,2,1,1,3,1,0,1,0,2,0,3,0,3,1,1,0,0,0,0,0,2,0,1,1,2,0,1,1,3,1,0,0,1,0,1,0,3,1,0,0,1,0,1,0,1,1,1,0,3,1,3,2,1,0,1,0,0,0,4,0,2,1,1,4,1,3,0,1,0,1,3,2,0,0,0,2,0,0,1,7,1,1,1,0,0,0,1,2,2,2,0,0,1,1,1,0,0,1,1,1,0,0,1,1,1,0,2,1,3,1,0,1,1,0,1,0,2,1,1,1,0,1,3,1,2,0,0,1,0,1,1,1,1,2,0,0,0,0,1,4,0,0,0,0,1,1,0,0,2,1,2,1,1,2,2,1,0,4,3,0,2,1,0,2,0,1,1,0,1,2,1,2,2,1,1,0,0,1,2,1,1,0,4,1,1,1,0,1,0,0,0,0,1,1,1,0,3,0,2,0,0,1,0,1,0,0,1,1,1,4,0,1,1,0,0,0,1,0,0,1,3,3,1,2,0,1,1,1,1,1,2,1,1,1,1,0,1,1,1,1,1,0,1,3,0,0,0,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,4,1,1,4,1,0,0,1,1,1,0,1,0,1,2,1,2,0,6,1,1,2,0,2,0,1,2,0,2,1,2,0,3,1,2,1,1,0,0,1,1,1,1,0,1,0,0,2,1,0,2,1,1,1,1,2,3,1,0,0,1,1,0,1,0,0,1,2,0,0,0,1,0,0,1,0,0,1,2,0,0,2,0,0,2,1,0,1,0,1,0,1,0,0,1,0,0,2,1,0,0,0,0,2,0,1,0,1,0,1,2,1,1,2,0,1,1,0,3,0,1,0,2,2,0,0,2,0,2,0,0,1,2,1,1,5,1,0,0,1,2,0,1,1,0,0,0,2,2,0,1,0,2,0,1,0,0,3,0,0,1,1,2,1,0,1,1,1,1,3,2,1,1,1,1,1,1,1,0,1,2,1,1,1,0,3,0,1,0,2,1,1,3,0,1,1,2,0,0,1,0,0,1,1,3,1,0,3,2,0,3,2,1,3,1,2,0,0,1,1,3,0,1,1,0,1,1,0,0,2,1,1,5,1,0,1,0,1,2,0,0,3,0,2,0,1,1,2,2,0,0,0,0,0,0,1,0,0,1,2,0,1,2,1,0,1,0,1,1,0,1,1,0,1,3,0,0,0,0,0,2,2,2,0,0,1,0,1,2,1,0,0,0,2,0,2,3,0,1,2,0,1,0,1,1,1,3,2,0,1,2,3,2,2,0,0,0,1,1,1,0,3,2,2,2,1,1,2,3,1,1,1,1,0,0,2,4,2,0,1,0,2,0,1,1,1,1,1,0,1,2,0,2,1,0,0,1,0,2,2,0,2,1,2,4,2,0,2,1,1,2,0,0,2,0,0,1,0,2,0,1,1,0,2,1,0,0,1,2,0,2,3,0,4,0,0,0,0,3,1,1,1,1,2,3,1,0,1,1,1,1,2,2,0,2,1,0,1,3,1,0,1,0,1,1,1,0,0,0,1,2,3,0,1,1,0,1,2,0,0,0,0,1,0,4,2,0,0,2,1,2,1,0,0,0,1,3,4,1,0,0,0,0,1,1,0,2,0,2,2,2,0,0,0,0,1,2,1,4,1,3]},{"counters":[0,1,0,1,0,2,2,1,0,0,1,1,0,0,0,1,1,0,2,3,0,1,0,2,1,0,1,0,1,1,2,1,0,2,0,3,0,1,0,1,3,0,1,1,0,0,0,1,0,1,1,0,1,3,2,0,1,2,1,1,0,2,0,0,2,1,2,0,2,0,3,2,0,1,1,1,1,2,1,1,0,0,1,0,1,1,1,0,2,3,1,1,1,0,1,1,2,2,0,3,1,0,0,1,0,2,0,1,2,1,1,1,2,1,0,2,2,0,1,2,2,1,1,1,0,2,1,0,1,1,0,4,1,0,0,0,2,0,0,0,1,0,1,0,0,1,0,0,2,1,0,1,0,1,1,1,2,1,0,1,0,0,2,1,2,0,0,0,0,0,0,1,0,1,0,0,1,2,0,1,2,0,1,0,1,0,1,2,0,0,2,2,2,2,0,1,0,1,3,1,0,0,0,2,1,1,3,0,0,1,3,0,2,2,0,3,0,0,2,2,1,2,1,1,1,1,2,2,0,3,1,2,1,0,3,2,3,1,0,1,2,0,0,1,0,1,0,1,0,0,1,0,1,1,0,1,1,3,0,0,2,1,3,2,0,1,0,1,0,0,0,2,1,1,0,2,1,0,1,1,2,2,1,0,2,0,0,2,2,1,0,1,3,1,1,0,5,1,1,0,2,1,0,0,0,1,0,3,0,2,1,1,1,0,0,2,1,1,0,1,1,3,3,2,1,0,2,2,0,0,2,0,2,1,1,3,0,0,1,3,0,0,1,0,1,1,1,1,0,1,2,0,0,2,0,1,0,1,0,0,1,3,0,0,1,1,2,1,1,1,1,0,1,0,1,4,0,1,0,1,2,1,2,1,0,0,3,2,3,1,0,0,1,1,1,2,1,1,1,0,0,2,0,0,1,3,0,1,0,0,0,2,1,1,3,1,4,0,0,1,2,2,1,0,0,0,0,3,0,3,0,0,1,0,0,2,1,3,1,0,1,2,0,0,1,3,1,1,0,0,0,0,0,1,0,1,1,3,1,1,1,0,1,0,0,2,2,0,1,2,1,0,1,2,2,1,0,1,2,3,1,2,2,2,1,0,2,1,0,1,0,1,1,1,1,0,1,0,0,1,0,1,0,0,1,1,1,1,4,0,1,0,0,1,0,0,0,1,0,2,1,0,0,1,1,1,2,2,1,3,0,2,2,0,1,0,1,1,2,1,0,0,1,2,1,3,4,2,0,4,2,2,2,1,0,1,1,1,3,1,1,3,1,1,0,1,1,0,2,0,0,0,1,2,2,1,2,2,0,0,2,0,3,1,2,1,2,2,0,0,0,0,2,3,0,0,1,2,2,1,1,2,0,2,0,0,1,1,0,1,1,1,2,0,1,1,0,0,2,1,2,3,0,1,0,0,0,1,0,0,1,0,1,1,0,1,0,2,2,0,2,0,1,1,1,1,2,1,1,2,0,0,3,1,0,0,0,1,2,2,1,3,2,0,0,1,1,0,1,0,0,0,2,0,2,0,0,2,3,1,3,2,1,2,1,1,1,0,3,1,0,1,0,2,0,3,0,0,1,0,3,0,0,2,0,1,0,0,2,1,2,1,1,0,0,1,0,3,1,0,1,1,1,3,2,1,0,1,1,1,2,0,2,1,0,0,1,1,1,1,0,1,1,1,0,0,0,3,1,0,2,0,0,1,1,0,0,1,1,1,1,4,2,0,1,1,1,0,0,2,1,0,1,3,1,3,0,1,1,0,1,0,1,0,1,1,0,0,0,1,1,0,1,3,0,1,0,1,1,0,3,1,0,1,2,4,1,3,2,0,1,2,0,0,2,0,0,3,2,0,0,2,2,3,1,1,0,1,2,1,1,2,0,0,0,0,0,2,1,1,0,0,1,2,1,2,0,1,2,0,1,1,0,1,1,2,2,0,1,1,2,1,2,1,2,1,0,5,0,1,1,4,0,3,0,1,0,0,0,1,1,1,2,2,0,0,2,0,1,0,1,2,0,1,2,1,4,1,1,1,2,0,3,1,0,1,0,1,1,1,0,1,0,0,0,2,2,0,0,1,2,2,1,2,0,2,1,2,1,0,0,0,0,1,0,1,1,2,0,2,1,2,3,0,0,1,2,0,0,0,0,1,1,1,1,0,1,2,1,0,0,0,1,2,1,0,2,0,2,1,1,1,3,0,1,0,1,1,3,1,5,0,0,1,0,0,2,0,2,2,0,0,1,0,0,0,3,0,1,0,4,0,3,1,2,0,0,0,1,1,1,0,2,3,0,1,0,0,2,2,1,1,2,1,1,0,0,2,1,2,2,2,0,1,3,1,0,0,0,0,1,1,2,0,2,1,1,1,3,0,4,0,1,0,1,0,1,2,0,1,2,2,0,4,0,0,2,1,0,0,0,2,0,0,1,1,1,1,1,0,0,0,0,2,1,1,1,1,0,0,0,1,2,2,0,1,2,4,2,0,1,0,4,1,1,0,3,2,1,0,2,0,2,0,3,1,1,0,1,0,0,0,0,0,0,1,1,0,1,2,1,2,1,0,0,0,0,0,0,0,1,1,2,3,1,3,0,0,0,0,0,0,1,0,0,0,2,2,2,0,2,0,1,0,2,1,2,2,0,3,0,1,1,2,0,2,1,0,1,0,1,0,2,0,0,0,0,0,1,1,2,0,0,2,0,2,1,1,2,2,1,0,3,2,1,1,3,0,0,2,1,1,0,1,0,2,0,0,1,3,0,1,0,3,0,3,0,0,1,0,0,2,1,1,0,1,0,0,2,2,0,0,1,1,2,0,2,2,2,0,0,0,1,4,2,1,1,1,0,0,0,2,2,1,2,1,1,1,3,3,0,1,0,0,5,0,0,3,1,0,2,1,2,3,0,2,1,1,1,1,2,0,2,1,4,0,0,1,1,0,0,0,1,0,2,2,1,3,0,2,1,1,2,2,2,2,0,1,0,0,3,0,1,0,1,1,3,1,0,2,2,1,0,0,1,1,1,1,1,0,2,1,1,1,2,2,1,2,3,0,1,0,0,0,1,1,2,0,1,1,1,0,0,1,0,0,3,1,0,3,1,1,1,5,0,0,0,0,1,1,1,1,0,0,1,2,2,1,1,0,2,2,1,1,0,1,0,1,1,0,0,1,0,1,2,0,1,0,0,1,0,2,2,4,0,0,3,0,0,0,0,1,0,1,1,1,1,1,3,0,0,0,0,1,0,0,1,1,1,0,0,2,0,0,1,0,1,1,1,0,0,0,2,0,0,1,3,1,0,1,0,3,0,4,1,1,0,2,0,2,2,0,0,0,1,3,0,4,4,2,0,0,1,0,1,0,1,4,0,0,1,0,0,2,2,0,0,1,2,1,0,3,0,1,0,3,2,1,0,3,2,1,2,0,0,0,0,0,1,1,1,0,0,0,3,3,1,0,1,0,1,1,1,1,0,0,0,1,0,1,1,1,2,0,2,1,0,1,1,1,2,2,1,1,0,0,1,0,0,1,1,1,2,2,0,0,2,0,1,1,1,0,1,0,2,2,0,2,0,1,0,1,0,0,1,0,0,0,1,2,1,1,1,2,1,0,1,1,0,0,1,2,2,2,0,1,3,0,0,0,0,1,0,2,2,0,0,0,0,0,3,2,1,1,1,0,1,1,2,1,1,0,1,0,2,0,2,0,1,0,0,2,1,2,1,1,2,0,1,0,2,0,3,0,1,1,0,1,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,2,2,0,2,0,0,1,1,3,0,2,1,1,0,1,1,0,1,0,3,0,0,3,0,0,0,0,1,1,0,2,4,0,1,1,0,1,0,2,2,0,2,0,0,1,1,1,2,2,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,4,3,1,0,3,1,1,1,0,0,0,0,0,0,3,1,1,3,0,0,3,2,0,1,1,2,4,0,0,0,0,0,1,2,1,1,3,5,1,2,0,2,0,1,1,0,1,1,0,0,3,1,1,1,0,0,0,0,0,1,0,1,1,1,2,0,0,1,0,1,1,2,2,0,2,1,1,3,2,2,1,0,2,2,2,2,2,1,1,0,3,1,0,1,1,1,2,0,0,3,1,1,0,3,0,1,0,2,1,1,2,3,0,1,0,1,1,1,1,3,1,1,1,1,3,2,1,0,1,1,1,0,0,2,3,1,0,1,1,0,1,0,1,1,2,1,1,0,0,0,1,2,0,2,0,3,2,1,1,0,0,0,1,0,2,1,1,1,1,0,2,1,1,0,0,2,2,0,0,1,0,2,0,0,1,2,0,3,0,0,0,1,0,2,2,0,2,1,0,0,0,2,1,2,1,0,0,0,0,0,1,2,2,0,3,1,0,2,2,0,2,1,0,1,0,0,0,3,0,0,2,1,3,1,2,1,0,2,0,4,1,1,3,1,2,1,2,2,1,2,0,0,0,0,1,2,0,1,4,0,1,3,0,0,1,2,2,2,3,2,3,3,2,1,0,0,1,0,1,0,2,0,1,1,1,0,0,1,1,0,1,0,0,3,2,1,1,1,2,0,0,1,2,2,0,1,0,1,1,3]},{"counters":[1,1,2,1,1,3,1,0,2,0,1,2,3,1,2,1,1,0,1,1,0,2,2,2,1,2,1,2,0,0,2,1,1,0,1,0,0,1,0,0,2,0,1,3,1,0,3,4,0,1,1,1,2,0,1,3,2,2,0,0,2,1,0,0,3,3,1,2,1,0,2,0,0,0,2,0,1,1,0,0,2,1,3,1,0,0,2,0,4,2,0,3,1,1,3,1,2,1,0,0,1,1,0,1,1,0,0,0,0,3,3,1,0,1,3,1,0,0,1,2,3,1,0,2,0,1,1,2,0,1,0,1,0,0,1,1,0,0,0,0,3,1,1,0,1,1,0,2,3,1,0,0,0,1,1,0,1,0,0,2,0,1,1,1,1,2,0,2,0,1,0,0,1,2,1,0,3,0,1,1,0,0,3,2,0,0,4,1,0,0,1,0,0,0,1,0,1,1,0,1,1,0,1,2,1,1,2,0,1,0,0,1,1,2,1,1,1,1,0,0,1,3,1,2,0,0,0,2,6,0,0,0,3,3,1,3,4,0,1,1,0,2,0,1,0,0,1,0,2,1,0,2,0,1,1,2,2,1,1,1,0,0,4,0,1,0,0,0,1,3,1,1,0,0,4,1,0,0,2,1,2,0,0,0,1,1,1,1,0,2,0,0,1,1,1,0,1,1,2,0,2,1,2,2,1,0,2,2,1,1,0,0,1,2,0,0,1,0,1,0,0,0,1,3,0,1,4,0,1,0,3,1,1,1,0,0,1,1,0,1,2,0,0,1,0,2,0,2,2,1,2,0,0,1,0,4,0,1,1,0,1,1,0,0,0,4,1,0,0,1,1,0,0,0,0,1,2,1,2,0,2,0,0,4,1,0,0,2,0,0,2,2,1,1,2,1,1,0,0,0,1,1,1,0,0,2,1,0,1,0,0,3,0,1,0,0,0,1,0,0,0,0,1,2,0,3,0,0,0,0,2,0,0,0,1,0,3,1,0,2,1,0,3,0,1,1,1,0,1,2,0,0,1,0,0,3,1,1,3,2,1,2,1,0,1,0,1,1,1,2,2,2,1,1,1,0,0,4,0,0,1,1,2,0,1,1,0,1,1,0,2,0,1,3,0,0,1,0,2,2,1,4,1,2,0,1,2,3,1,1,1,0,0,1,1,0,1,2,1,0,1,0,1,3,1,2,1,0,4,0,1,3,2,1,1,0,0,1,0,2,0,0,0,1,2,0,2,0,3,0,0,0,0,2,1,0,0,1,0,2,0,1,1,3,1,0,2,0,2,3,1,1,1,0,1,2,0,2,1,2,1,3,0,1,0,2,1,1,0,1,0,2,0,1,2,0,1,0,0,0,1,0,2,0,1,0,1,1,0,2,1,1,0,1,0,0,1,0,1,3,1,0,2,4,1,0,0,3,0,3,3,2,3,1,0,1,2,0,2,3,0,1,0,0,1,1,0,1,3,1,0,1,2,2,0,1,2,1,1,2,2,1,2,1,1,0,1,1,0,1,1,0,2,1,1,0,0,2,0,1,1,1,1,2,1,0,0,0,0,0,1,1,0,0,1,1,0,0,2,0,2,2,0,1,1,0,0,1,0,0,0,1,1,0,0,1,1,1,1,1,2,1,2,0,1,1,0,0,0,3,0,4,2,0,1,0,0,1,0,1,2,2,1,1,1,0,1,0,2,0,1,1,0,1,1,0,3,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,0,1,1,1,1,0,1,2,2,0,0,1,0,1,2,2,2,1,1,2,2,1,1,3,0,3,1,0,0,1,2,1,1,1,0,1,2,3,2,2,1,1,0,2,1,0,1,2,1,0,0,1,0,2,0,3,2,0,2,1,0,0,0,2,2,1,1,1,4,3,0,0,1,3,0,1,1,0,2,0,3,1,0,1,0,3,2,1,0,0,1,1,1,2,2,0,0,1,1,0,2,1,4,2,0,0,4,1,1,0,0,2,1,2,3,0,1,1,1,2,0,1,0,0,1,1,2,2,0,1,1,0,1,0,2,0,3,0,2,2,0,3,1,0,0,1,0,1,1,1,0,1,2,2,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,2,0,1,2,2,1,2,0,0,0,2,4,1,0,3,1,0,0,1,1,1,3,0,0,1,1,0,1,0,1,2,1,0,1,1,3,0,1,1,2,3,1,0,0,0,3,1,3,0,0,1,0,0,1,2,1,0,0,1,0,1,2,2,0,0,3,1,1,0,0,0,0,1,1,2,2,1,1,2,1,0,1,3,2,0,1,0,1,1,1,4,1,0,2,1,0,2,1,0,2,0,0,0,0,1,0,1,0,1,0,3,0,2,1,1,1,3,0,1,1,2,2,2,2,2,0,0,2,1,0,1,1,0,0,1,1,1,1,1,1,1,0,1,1,1,2,1,0,2,1,2,1,1,0,1,1,0,0,0,0,1,0,0,0,1,1,0,1,4,1,0,3,3,5,2,2,0,0,1,1,1,2,2,1,2,2,0,0,1,1,0,1,1,0,2,1,0,0,1,0,2,2,0,1,3,2,1,0,0,0,0,1,0,2,1,0,0,0,2,2,1,3,0,1,2,2,0,0,0,1,1,0,1,1,2,1,0,0,0,3,0,2,1,6,3,0,0,1,0,0,4,1,1,1,3,1,1,0,1,1,1,1,0,1,0,0,2,0,2,3,0,2,0,1,3,0,0,2,0,0,0,2,0,0,1,4,0,0,0,0,2,4,0,0,1,2,2,0,0,0,0,3,1,1,0,1,1,0,0,0,0,1,0,3,0,2,1,1,3,1,1,1,0,2,1,0,2,0,2,0,0,0,3,4,1,0,0,1,1,2,0,0,2,0,1,1,3,1,2,0,1,0,2,0,1,0,2,0,1,0,1,0,1,3,1,0,0,2,1,0,1,0,2,0,1,0,0,1,2,0,2,1,1,1,0,0,2,1,0,0,0,2,1,0,3,1,0,1,0,0,2,0,0,1,0,1,0,3,2,0,4,0,1,0,1,2,2,2,0,1,1,1,0,1,0,0,2,1,2,0,2,0,0,1,1,2,3,2,2,2,0,0,1,2,1,0,2,1,0,2,1,1,1,3,1,2,0,0,0,1,2,0,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,2,1,2,2,0,2,0,1,1,1,0,0,0,0,0,1,0,5,0,1,1,0,0,2,1,0,0,1,0,1,0,1,3,1,1,3,0,1,1,0,1,0,0,3,1,1,1,3,2,0,2,4,2,1,1,0,0,2,1,1,0,1,1,1,1,0,0,0,2,0,1,0,2,0,2,1,0,1,0,0,0,0,2,1,0,1,3,0,0,1,1,2,1,0,1,0,3,0,0,1,0,0,0,3,0,1,2,0,2,0,0,2,1,1,0,4,1,1,1,1,2,1,1,2,2,0,2,2,2,0,0,1,1,0,2,1,2,0,0,3,1,3,0,4,0,0,0,1,3,1,0,0,0,0,1,2,1,0,0,4,3,0,1,2,0,0,1,1,3,1,1,0,0,1,0,0,2,1,2,1,3,1,1,1,1,3,2,2,3,0,3,0,1,3,1,1,1,0,0,0,1,1,1,0,0,2,0,2,1,1,2,0,1,2,1,1,2,1,1,1,1,2,2,2,1,2,0,1,1,2,0,0,0,0,1,2,0,0,1,0,2,1,3,2,0,0,3,1,1,1,1,0,1,5,2,0,1,1,0,3,0,0,0,1,0,0,1,2,1,2,0,2,2,1,2,0,0,2,0,2,1,1,2,2,2,1,0,1,0,3,2,2,1,1,1,0,0,1,0,0,2,0,0,0,0,1,0,2,0,1,1,1,2,1,0,0,5,0,2,1,0,2,0,0,1,1,0,1,0,3,2,1,0,0,2,2,1,1,0,0,2,1,2,0,4,3,1,0,0,0,2,1,0,1,1,1,1,1,0,1,1,1,0,0,2,0,0,0,1,0,1,0,2,1,1,0,1,2,0,2,0,2,0,1,1,0,1,1,2,4,1,0,1,0,0,1,0,0,0,1,1,4,1,0,0,1,2,1,1,1,0,0,1,1,2,1,0,0,3,0,2,0,2,0,2,1,1,1,3,0,0,0,1,0,0,2,2,1,0,0,2,3,1,1,1,1,0,2,1,3,0,1,1,0,0,0,1,1,0,0,2,1,3,2,2,2,1,1,1,1,0,0,1,0,3,3,0,2,0,1,3,1,0,3,0,0,1,1,1,0,0,2,1,0,1,1,2,1,3,0,1,0,0,1,1,3,0,0,0,0,0,1,1,1,0,2,1,1,0,2,2,0,2,0,1,4,1,2,1,1,0,0,1,3,1,0,0,2,2,0,0,1,0,0,0,3,1,1,0,3,0,0,0,0,1,2,0,1,0,1,1,1,0,0,1,1,0,0,1,2,3,0,2,2,0,5,3,1,1,2,1,2,1,1,1,0,1,1,1,0,1,0,1,0,1,0,1,2,0,1,3,0,4,0,1,3,1,0,1,1,0,1,1,1,1,1,0,0,1,1,2,2,1,2]},{"counters":[1,1,0,1,0,1,1,1,0,2,0,0,0,1,0,2,0,0,1,2,2,1,1,1,0,1,1,2,2,1,1,0,1,0,0,1,2,1,0,3,0,0,1,1,0,2,1,1,3,0,2,0,1,0,0,1,0,1,1,1,0,1,0,0,3,1,1,0,1,3,0,0,1,1,1,1,2,0,1,0,2,0,0,0,1,1,0,2,1,0,2,3,2,0,1,0,2,1,0,0,0,2,1,0,0,4,1,0,1,1,4,0,0,1,0,0,1,0,0,1,0,1,0,1,1,2,1,1,1,0,2,1,0,3,1,1,1,0,3,1,3,1,6,0,1,2,0,2,1,0,0,4,0,0,2,0,0,1,0,2,1,1,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,1,2,0,0,0,0,2,0,2,0,1,0,0,0,0,1,2,0,2,2,1,1,2,1,1,1,0,1,0,0,0,0,3,0,1,0,0,0,0,1,3,0,0,0,0,1,1,0,3,2,0,2,1,2,2,1,3,1,1,0,0,1,2,3,2,0,0,1,0,1,0,1,2,1,1,0,2,2,0,5,0,2,1,2,1,1,1,1,1,1,1,0,1,0,2,1,0,0,0,1,0,3,0,0,0,0,2,0,1,0,1,0,0,1,0,1,0,0,1,1,0,2,2,0,0,0,1,0,2,2,0,1,3,1,1,2,1,0,3,2,2,0,0,1,0,1,0,0,1,0,0,0,2,0,0,1,1,1,1,0,0,1,0,2,1,0,0,2,2,0,1,1,0,2,0,0,0,0,1,0,0,2,0,0,2,2,2,2,0,1,2,1,0,0,0,2,2,1,2,1,1,0,1,0,0,0,2,0,1,0,1,0,1,1,0,2,1,2,0,2,3,1,1,2,1,1,0,0,2,1,3,0,1,1,1,0,1,2,2,0,1,1,1,1,1,2,1,1,2,2,0,2,4,2,2,0,1,0,0,0,1,0,0,3,0,1,0,4,1,0,0,2,1,1,1,1,0,1,1,0,1,1,1,1,1,2,2,0,0,1,0,0,0,1,0,3,1,0,2,2,4,0,0,1,2,0,0,1,2,0,1,0,1,0,3,1,2,1,3,0,0,0,1,1,0,0,2,2,3,0,0,1,1,0,1,1,1,1,1,1,0,2,0,1,0,1,1,1,4,0,1,1,0,0,0,0,2,2,1,0,2,1,2,2,0,2,1,0,1,2,2,0,1,1,0,2,1,2,1,1,0,0,2,1,0,1,0,1,0,1,1,1,0,0,1,2,0,1,2,0,2,1,3,1,3,0,1,1,0,2,1,2,2,2,1,2,0,1,2,0,0,2,1,2,0,2,0,1,0,0,1,1,0,0,0,1,1,0,2,1,4,2,4,3,0,2,0,1,1,1,1,2,1,1,0,0,1,1,1,1,4,1,2,0,0,2,3,0,2,0,1,3,0,2,1,0,2,4,1,1,1,3,0,1,0,3,1,2,1,0,2,0,1,0,2,1,1,2,2,2,0,1,0,3,2,0,2,1,2,2,1,0,1,0,1,5,0,2,1,2,0,2,1,0,1,2,2,1,1,2,0,0,0,1,0,0,1,3,0,1,0,1,0,2,1,0,2,2,2,1,3,1,0,0,1,0,1,4,0,0,1,0,0,0,1,1,1,1,1,0,1,0,0,2,1,0,2,1,0,0,0,3,1,0,0,0,1,2,1,0,2,3,2,0,0,0,1,1,1,2,0,0,1,2,1,1,0,0,2,0,2,2,1,1,1,1,0,0,1,0,2,2,0,4,1,1,1,1,1,1,0,2,1,0,1,1,1,2,2,1,2,0,1,1,4,4,1,0,1,0,0,0,1,0,2,1,0,1,5,3,2,3,0,2,0,4,3,1,0,1,0,0,0,1,1,0,0,0,2,0,2,0,0,2,1,0,1,1,4,0,0,2,1,0,0,0,0,0,2,2,3,1,0,0,1,0,1,0,0,3,2,0,1,1,1,0,0,1,0,2,1,1,1,1,0,2,1,1,1,1,2,0,0,4,2,1,0,1,1,1,3,0,0,0,3,0,1,0,0,1,0,1,0,2,2,1,1,0,4,0,2,0,1,1,1,1,1,2,2,1,1,0,2,1,0,1,1,0,3,0,2,0,0,1,0,1,0,2,0,0,1,1,3,1,2,1,0,1,1,0,1,1,1,1,0,0,1,1,0,2,0,1,0,2,2,0,0,0,0,0,0,1,0,0,1,0,1,3,0,2,4,1,1,1,0,1,1,2,1,2,1,1,1,0,0,1,0,2,0,0,2,1,1,0,2,1,0,2,0,0,0,0,2,1,1,0,1,0,1,1,1,0,1,2,1,2,0,0,3,1,1,1,1,3,0,0,0,0,2,2,1,0,2,2,0,3,0,0,0,0,1,1,1,0,0,0,1,4,1,0,0,1,1,2,2,1,2,0,1,0,2,2,1,2,0,3,2,0,0,2,0,1,1,0,0,2,0,1,4,0,1,3,0,0,3,0,1,0,3,2,0,1,0,2,2,2,0,0,1,2,5,2,1,1,0,2,0,2,0,2,2,1,1,2,1,0,0,2,2,0,1,0,4,1,2,0,2,1,0,1,2,0,2,4,3,2,1,0,3,0,1,1,1,0,1,2,1,2,0,2,0,3,0,2,1,1,0,0,1,3,0,2,0,0,2,0,2,1,2,0,0,2,0,1,1,3,0,2,1,0,1,0,1,3,0,1,2,0,2,0,1,1,1,1,1,0,0,0,0,0,0,2,1,1,2,1,1,1,1,2,2,1,0,3,3,1,1,0,0,2,1,1,1,1,2,0,3,0,0,1,0,1,2,1,2,1,0,2,0,1,2,0,1,2,3,0,1,0,0,1,0,1,2,0,1,0,2,0,4,1,1,1,1,0,0,1,1,1,2,1,2,2,0,2,1,1,0,1,0,1,0,5,0,0,0,1,0,2,0,1,0,1,2,0,2,3,1,0,0,1,2,0,0,0,0,1,0,1,1,5,1,0,0,0,0,1,1,2,0,0,0,0,1,1,0,1,1,1,2,0,2,0,1,3,0,2,1,2,3,3,0,0,2,0,0,1,4,1,2,3,2,2,1,2,0,0,1,1,0,0,2,1,2,1,1,0,1,2,0,2,1,0,1,2,0,1,0,2,0,2,1,2,1,0,2,0,1,1,0,1,1,1,1,1,0,1,0,1,2,0,2,0,0,1,1,0,0,0,2,2,3,0,0,0,1,1,0,1,1,0,1,1,1,3,3,0,0,2,1,2,1,0,0,1,1,0,1,0,0,2,0,2,1,0,0,2,2,1,1,2,0,0,1,1,1,1,2,1,0,1,4,0,3,0,0,0,0,1,1,0,1,2,1,2,0,0,2,3,1,1,1,0,1,2,2,1,2,0,0,0,2,2,1,2,0,3,1,1,3,0,3,0,2,3,2,0,2,0,1,0,1,1,0,2,1,2,1,0,0,2,0,1,0,0,3,0,0,1,1,0,1,0,1,0,0,1,0,1,0,0,1,0,0,0,2,1,1,2,2,0,0,3,0,0,0,1,1,0,2,0,0,2,0,0,0,0,0,1,1,1,0,0,3,2,2,1,1,1,0,1,1,2,2,0,2,1,0,0,2,0,0,0,0,0,1,1,0,2,0,2,0,3,1,0,1,0,1,1,1,2,1,1,0,1,0,2,2,0,2,2,1,2,0,1,1,1,0,1,2,1,0,1,2,2,1,1,2,4,0,1,2,2,1,1,1,3,1,2,0,1,1,0,0,2,0,0,1,0,3,1,1,0,2,0,2,2,1,0,0,1,1,1,1,0,2,2,0,1,0,1,1,1,1,0,1,0,1,2,1,1,1,0,1,3,1,1,0,0,0,0,1,1,1,0,0,0,2,1,2,0,1,2,2,2,1,1,1,0,0,1,1,0,1,0,1,0,1,0,1,0,1,1,0,1,0,2,1,0,0,0,0,0,1,1,2,1,1,1,2,7,1,0,3,1,1,1,1,0,2,1,1,1,0,1,0,1,1,1,0,1,2,1,2,1,0,0,1,2,0,1,1,1,2,1,3,1,3,1,2,1,0,0,3,1,0,0,1,3,0,1,1,0,1,1,3,1,0,1,0,1,1,2,4,2,0,4,1,0,1,1,0,0,1,0,0,1,1,1,1,0,0,0,1,1,2,1,0,0,1,0,0,0,2,2,2,0,0,1,2,1,1,0,1,0,2,0,2,1,0,1,1,1,1,0,0,2,1,0,1,2,2,1,3,0,3,1,0,1,1,1,3,2,3,0,2,0,2,0,1,1,4,0,0,0,0,0,0,1,2,0,0,0,0,0,1,0,0,2,2,0,2,1,1,2,1,1,1,1,0,1,1,1,1,2,2,3,0,1,1,1,1,2,0,1,0,1,2,0,0,0,0,3,1,1,1,2,1,1,2,3,1,0,2,3,0,0,0,3,1,2,1,3,0,0,5,1,2,5,0,2,0,0,1,3,1,0,1,1,0,1,1,0,0,1,2,0,0,3,1,1,0,2,0,1,1,0,1,1,1,0,1,0,0,1,1,0,2,1,1]}]},"null_count":0,"last_update_version":397952050369396736},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxMzc4MDkyMTM=","upper_bound":"LTIxMjA4MDI4OTQ=","repeats":1},{"count":16,"lower_bound":"LTIxMTk1MzY0NDg=","upper_bound":"LTIxMDMyNDkzMzE=","repeats":1},{"count":24,"lower_bound":"LTIwOTE0NDc4MzQ=","upper_bound":"LTIwNzY3MzcxNDY=","repeats":1},{"count":32,"lower_bound":"LTIwNjgzMDY1MDQ=","upper_bound":"LTIwNDk3OTEwNDI=","repeats":1},{"count":40,"lower_bound":"LTIwNDc0OTQ5MDU=","upper_bound":"LTIwMzUxMDg0NjM=","repeats":1},{"count":48,"lower_bound":"LTIwMjQ1MDE0MTE=","upper_bound":"LTIwMTQ2MTk3OTA=","repeats":1},{"count":56,"lower_bound":"LTIwMDk3MjkwNDg=","upper_bound":"LTE5OTA4NTkyMjI=","repeats":1},{"count":64,"lower_bound":"LTE5ODg3NzIwNTE=","upper_bound":"LTE5NzMzNTQ1MjM=","repeats":1},{"count":72,"lower_bound":"LTE5NjgyMzUyMDU=","upper_bound":"LTE5NDc1NDYyMjM=","repeats":1},{"count":80,"lower_bound":"LTE5NDA1ODg2MjE=","upper_bound":"LTE5MzcyNzQ4MzM=","repeats":1},{"count":88,"lower_bound":"LTE5MzQxOTIwNTI=","upper_bound":"LTE5MjA0NTY3MzE=","repeats":1},{"count":96,"lower_bound":"LTE5MTkwMTM0MDc=","upper_bound":"LTE4OTk3NTAyODM=","repeats":1},{"count":104,"lower_bound":"LTE4OTkxNjkxNzY=","upper_bound":"LTE4ODQ3MzE4ODc=","repeats":1},{"count":112,"lower_bound":"LTE4NzI0OTk1MzU=","upper_bound":"LTE4NjQzMzY1OTc=","repeats":1},{"count":120,"lower_bound":"LTE4NjQyMzA5MDA=","upper_bound":"LTE4NDU2NjY2MzA=","repeats":1},{"count":128,"lower_bound":"LTE4NDIwNjM2NDY=","upper_bound":"LTE4MzIyMTg2NjM=","repeats":1},{"count":136,"lower_bound":"LTE4MzE5MzQ3NzI=","upper_bound":"LTE4Mjk4MzU5Njk=","repeats":1},{"count":144,"lower_bound":"LTE4MjQ1NzA3NzE=","upper_bound":"LTE4MDQ1NTA4MzQ=","repeats":1},{"count":152,"lower_bound":"LTE4MDIyMzc5Mzk=","upper_bound":"LTE3OTU3MDA3NDc=","repeats":1},{"count":160,"lower_bound":"LTE3ODg1NzczMDM=","upper_bound":"LTE3NzU2MTQyMzY=","repeats":1},{"count":168,"lower_bound":"LTE3NzQ3NjExMDM=","upper_bound":"LTE3NTkwMTgxMDQ=","repeats":1},{"count":176,"lower_bound":"LTE3NTM5Nzg0ODA=","upper_bound":"LTE3NDU3MTU3ODE=","repeats":1},{"count":184,"lower_bound":"LTE3MzY1MTU2NjA=","upper_bound":"LTE2OTc1NjM4MDk=","repeats":1},{"count":192,"lower_bound":"LTE2OTM0ODY3MDY=","upper_bound":"LTE2ODk5MDk1NTU=","repeats":1},{"count":200,"lower_bound":"LTE2Nzk4Mjk1OTk=","upper_bound":"LTE2NzYxMjc0NDk=","repeats":1},{"count":208,"lower_bound":"LTE2NzI2OTU2NzE=","upper_bound":"LTE2NjQxMjU1MDY=","repeats":1},{"count":216,"lower_bound":"LTE2NjI0MTcxMzU=","upper_bound":"LTE2NTI4MzYzMzQ=","repeats":1},{"count":224,"lower_bound":"LTE2NDE1MzEzMTY=","upper_bound":"LTE2MzIxNjk1Njg=","repeats":1},{"count":232,"lower_bound":"LTE2MjkxMTY3ODc=","upper_bound":"LTE2MDk5NjUwNzU=","repeats":1},{"count":240,"lower_bound":"LTE2MDgzMTk0NjY=","upper_bound":"LTE2MDE2MDA1MjU=","repeats":1},{"count":248,"lower_bound":"LTE1OTkyODIyMjY=","upper_bound":"LTE1ODM5NjExMTc=","repeats":1},{"count":256,"lower_bound":"LTE1ODEwOTU1NzY=","upper_bound":"LTE1NzAxMTgxODM=","repeats":1},{"count":264,"lower_bound":"LTE1Njk0ODc3OTk=","upper_bound":"LTE1NDgzNDQ3NzM=","repeats":1},{"count":272,"lower_bound":"LTE1NDcxNDg3Mzg=","upper_bound":"LTE1MzIxMjc0MjQ=","repeats":1},{"count":280,"lower_bound":"LTE1Mjc5MzcxOTA=","upper_bound":"LTE1MDg0NDM5NjA=","repeats":1},{"count":288,"lower_bound":"LTE1MDg0MDgwNjg=","upper_bound":"LTE1MDEzNDIwOTE=","repeats":1},{"count":296,"lower_bound":"LTE0OTgzNDQzMTU=","upper_bound":"LTE0ODMwODIxOTY=","repeats":1},{"count":304,"lower_bound":"LTE0NzM2NjczMjM=","upper_bound":"LTE0NjA1MDIxODI=","repeats":1},{"count":312,"lower_bound":"LTE0NTgzOTUyMzM=","upper_bound":"LTE0NTA5ODk0NTU=","repeats":1},{"count":320,"lower_bound":"LTE0NDk3ODM0NDk=","upper_bound":"LTE0MjI5MTcyNzU=","repeats":1},{"count":328,"lower_bound":"LTE0MjIzNzI1MTE=","upper_bound":"LTE0MDYyMjM5MjQ=","repeats":1},{"count":336,"lower_bound":"LTE0MDM1NDk1OTA=","upper_bound":"LTEzOTAwNDk1Mzc=","repeats":1},{"count":344,"lower_bound":"LTEzODcyMjgwODA=","upper_bound":"LTEzNzY1MjYxMDg=","repeats":1},{"count":352,"lower_bound":"LTEzNzYxMjAyNjg=","upper_bound":"LTEzNTU3MzU3NTQ=","repeats":1},{"count":360,"lower_bound":"LTEzMzU5NDU2NDI=","upper_bound":"LTEzMjU0ODEzNTE=","repeats":1},{"count":368,"lower_bound":"LTEzMjQ0MDgzNzA=","upper_bound":"LTEzMDczODQ0MzM=","repeats":1},{"count":376,"lower_bound":"LTEzMDU0MjcyMTY=","upper_bound":"LTEyOTYyNzA4Njg=","repeats":1},{"count":384,"lower_bound":"LTEyOTEyMzY1MTY=","upper_bound":"LTEyODE3OTA4NzQ=","repeats":1},{"count":392,"lower_bound":"LTEyODE3NzExMzM=","upper_bound":"LTEyNzI0ODYwMDg=","repeats":1},{"count":400,"lower_bound":"LTEyNzIzOTU2MDQ=","upper_bound":"LTEyNDcwODQwMTg=","repeats":1},{"count":408,"lower_bound":"LTEyNDQxMDE0MDI=","upper_bound":"LTEyMzg3ODYxODE=","repeats":1},{"count":416,"lower_bound":"LTEyMzc4ODM4MTc=","upper_bound":"LTEyMzMwNjQ1NzU=","repeats":1},{"count":424,"lower_bound":"LTEyMzI3ODc5ODk=","upper_bound":"LTEyMTkwODgzNjk=","repeats":1},{"count":432,"lower_bound":"LTEyMTQ2NTk2MDU=","upper_bound":"LTEyMDc3NzI2MTY=","repeats":1},{"count":440,"lower_bound":"LTEyMDUzODUxODA=","upper_bound":"LTEyMDE0MDA1OTc=","repeats":1},{"count":448,"lower_bound":"LTExODczNDA5OTA=","upper_bound":"LTExNzI5MTY5MTM=","repeats":1},{"count":456,"lower_bound":"LTExNzA0MzYwNjY=","upper_bound":"LTExNTc1Njk1NDM=","repeats":1},{"count":464,"lower_bound":"LTExNTE0Njg4MzI=","upper_bound":"LTExMzUzNDg3MDY=","repeats":1},{"count":472,"lower_bound":"LTExMzQxNTE1NjU=","upper_bound":"LTExMzA0Nzg4MDk=","repeats":1},{"count":480,"lower_bound":"LTExMjM3MzEyMzQ=","upper_bound":"LTExMTQzNjQzNTk=","repeats":1},{"count":488,"lower_bound":"LTExMTIxMzQxMDY=","upper_bound":"LTExMDQ2ODYxNzk=","repeats":1},{"count":496,"lower_bound":"LTExMDA3MTY1MjA=","upper_bound":"LTEwNzUyODM3Mjk=","repeats":1},{"count":504,"lower_bound":"LTEwNzIxNDUyMjU=","upper_bound":"LTEwNTQyNzg1NzY=","repeats":1},{"count":512,"lower_bound":"LTEwNTIxNjgwNTE=","upper_bound":"LTEwNDQwNDkwODI=","repeats":1},{"count":520,"lower_bound":"LTEwNDE4MzIzODI=","upper_bound":"LTEwMjU5OTE4MjY=","repeats":1},{"count":528,"lower_bound":"LTEwMTg3NjA2NTM=","upper_bound":"LTk5OTYxNzI5Ng==","repeats":1},{"count":536,"lower_bound":"LTk5ODc0OTc2OA==","upper_bound":"LTk4ODU5MDk5NA==","repeats":1},{"count":544,"lower_bound":"LTk4NjQ0OTU1NQ==","upper_bound":"LTk3MTU2NTcxOA==","repeats":1},{"count":552,"lower_bound":"LTk2MTEyNzI5NA==","upper_bound":"LTk0NDYzMjc1NQ==","repeats":1},{"count":560,"lower_bound":"LTk0MTM2MDc5Mg==","upper_bound":"LTkzNDQ0NzMxMw==","repeats":1},{"count":568,"lower_bound":"LTkzNDI3MTUzNw==","upper_bound":"LTkyNDEzMjE2NQ==","repeats":1},{"count":576,"lower_bound":"LTg5NzA2NDQ4Mg==","upper_bound":"LTg4NjkwNDI2Ng==","repeats":1},{"count":584,"lower_bound":"LTg3MzQ3NzIyOA==","upper_bound":"LTg1NjYxNjkwOQ==","repeats":1},{"count":592,"lower_bound":"LTg1NDEyMTY5NA==","upper_bound":"LTgzODY0NzA3Mw==","repeats":1},{"count":600,"lower_bound":"LTgzNjUwMzQ2OQ==","upper_bound":"LTgxMzU0ODUxNw==","repeats":1},{"count":608,"lower_bound":"LTgxMjU4NDQxNg==","upper_bound":"LTgwOTUyNzAxNw==","repeats":1},{"count":616,"lower_bound":"LTgwNzI3ODUzMg==","upper_bound":"LTc5ODg0OTQ4OA==","repeats":1},{"count":624,"lower_bound":"LTc5MjkzODc3Ng==","upper_bound":"LTc3MTExOTc2Mw==","repeats":1},{"count":632,"lower_bound":"LTc2Mzg4ODk1OA==","upper_bound":"LTc1NTY5ODM2OA==","repeats":1},{"count":640,"lower_bound":"LTc0OTUxOTM3Mw==","upper_bound":"LTczOTEwNTY5Mg==","repeats":1},{"count":648,"lower_bound":"LTczNTM3NTM1MA==","upper_bound":"LTcyNDIyNjExMg==","repeats":1},{"count":656,"lower_bound":"LTcyMDc3Mzg3OQ==","upper_bound":"LTcxMjcwMzQ0MA==","repeats":1},{"count":664,"lower_bound":"LTcwODQ1NTEyMQ==","upper_bound":"LTY5MDMyMzE1MA==","repeats":1},{"count":672,"lower_bound":"LTY4NTU2NTUxOQ==","upper_bound":"LTY3NDM0OTU2NQ==","repeats":1},{"count":680,"lower_bound":"LTY3Mjc4NjY5NQ==","upper_bound":"LTY2NDEyMzA1MQ==","repeats":1},{"count":688,"lower_bound":"LTY2MzI2NDU0NA==","upper_bound":"LTY0NzE4MzczMw==","repeats":1},{"count":696,"lower_bound":"LTY0MjYyMzcxNg==","upper_bound":"LTYyMTA4MDQzOQ==","repeats":1},{"count":704,"lower_bound":"LTYyMDU0ODY1Mw==","upper_bound":"LTYxMjY1MzQzNg==","repeats":1},{"count":712,"lower_bound":"LTYxMDU1NTA1Ng==","upper_bound":"LTU5MDkxMjk5Ng==","repeats":1},{"count":720,"lower_bound":"LTU4MjU3MjcxMw==","upper_bound":"LTU3NzY2MTAwMQ==","repeats":1},{"count":728,"lower_bound":"LTU3MzI4NDMzOA==","upper_bound":"LTU2MDY4MTgyMA==","repeats":1},{"count":736,"lower_bound":"LTU1OTU1ODc1MA==","upper_bound":"LTU1MjAzODI0MQ==","repeats":1},{"count":744,"lower_bound":"LTUzODMwNzgxOQ==","upper_bound":"LTUzNTc4NTk1NQ==","repeats":1},{"count":752,"lower_bound":"LTUzMjk4ODQwOA==","upper_bound":"LTUyNDY4Mjg3Mg==","repeats":1},{"count":760,"lower_bound":"LTUyNDMxNTQ3OQ==","upper_bound":"LTQ5NDEyNjY2Mg==","repeats":1},{"count":768,"lower_bound":"LTQ4NzczNDIxOA==","upper_bound":"LTQ3MzMwNjk2Ng==","repeats":1},{"count":776,"lower_bound":"LTQ3Mjg0MjIwMw==","upper_bound":"LTQ2MzI0OTE3NQ==","repeats":1},{"count":784,"lower_bound":"LTQ1OTY1MzkyOQ==","upper_bound":"LTQ0ODQ3MzI3OQ==","repeats":1},{"count":792,"lower_bound":"LTQ0NzY2ODUzMg==","upper_bound":"LTQzNTU0NDY1OA==","repeats":1},{"count":800,"lower_bound":"LTQzMDk2Mzg0Mg==","upper_bound":"LTQxNDg3NzkxMw==","repeats":1},{"count":808,"lower_bound":"LTQxNDE1NzI1Mg==","upper_bound":"LTQwNDA4Mjg0MA==","repeats":1},{"count":816,"lower_bound":"LTM5NTg1MDczMQ==","upper_bound":"LTM4NjkzNjQ1Mw==","repeats":1},{"count":824,"lower_bound":"LTM4NDY5ODk1Mg==","upper_bound":"LTM3ODcxNzk3OQ==","repeats":1},{"count":832,"lower_bound":"LTM3MDg0NjEzNQ==","upper_bound":"LTM2MzI3MzgyNA==","repeats":1},{"count":840,"lower_bound":"LTM1MzA0MTE5Mw==","upper_bound":"LTM0NDc0NzYwNQ==","repeats":1},{"count":848,"lower_bound":"LTM0NDIzNDcxOA==","upper_bound":"LTM0MDMwODg1OQ==","repeats":1},{"count":856,"lower_bound":"LTMzNzUxNzk5Ng==","upper_bound":"LTMyMjI5MjgwMA==","repeats":1},{"count":864,"lower_bound":"LTMxOTEwMjY2MQ==","upper_bound":"LTMwNjI3NDAxNw==","repeats":1},{"count":872,"lower_bound":"LTMwMTQ3MjQwMg==","upper_bound":"LTI5MTk5Mzc4NQ==","repeats":1},{"count":880,"lower_bound":"LTI5MTM5MjM1OA==","upper_bound":"LTI4OTA1MTIyNg==","repeats":1},{"count":888,"lower_bound":"LTI4NjcxOTIyMg==","upper_bound":"LTI3Mzc3OTk5Mg==","repeats":1},{"count":896,"lower_bound":"LTI2ODk2OTQxNQ==","upper_bound":"LTI2MDczNDYwOA==","repeats":1},{"count":904,"lower_bound":"LTI0ODkzMzU2Nw==","upper_bound":"LTIyODY1MTc0MQ==","repeats":1},{"count":912,"lower_bound":"LTIyMzIyNTQ4OQ==","upper_bound":"LTIxMzM0MjEzMg==","repeats":1},{"count":920,"lower_bound":"LTIxMjc3NDgyMQ==","upper_bound":"LTIwMzc0ODkwMg==","repeats":1},{"count":928,"lower_bound":"LTE4OTAyNjY1Ng==","upper_bound":"LTE4NDY4MjE1MQ==","repeats":1},{"count":936,"lower_bound":"LTE4MTQ3MDE1NQ==","upper_bound":"LTE1ODk1MTA4NQ==","repeats":1},{"count":944,"lower_bound":"LTE1NTk1NDI3OQ==","upper_bound":"LTE0NDM1MzMwOQ==","repeats":1},{"count":952,"lower_bound":"LTE0MzQxMzUzNA==","upper_bound":"LTEzOTIwMTkyNw==","repeats":1},{"count":960,"lower_bound":"LTEzNzcyMjQ4OA==","upper_bound":"LTEyMjA5ODMyMQ==","repeats":1},{"count":968,"lower_bound":"LTExODQ4NzAwMw==","upper_bound":"LTEwNTcyNjAyOQ==","repeats":1},{"count":976,"lower_bound":"LTEwMzQ2NzU3Ng==","upper_bound":"LTk1MTI5Njgx","repeats":1},{"count":984,"lower_bound":"LTkzMjg0ODQz","upper_bound":"LTcyODExNDYz","repeats":1},{"count":992,"lower_bound":"LTY0MzE1OTAw","upper_bound":"LTU0MjMyOTEw","repeats":1},{"count":1000,"lower_bound":"LTUyMjgyNDU3","upper_bound":"LTM1NzMzODU1","repeats":1},{"count":1008,"lower_bound":"LTMwMDA5ODU0","upper_bound":"LTE4ODQ4ODM0","repeats":1},{"count":1016,"lower_bound":"LTE2NTcyMzc5","upper_bound":"MjcxNTgyMw==","repeats":1},{"count":1024,"lower_bound":"NzkwMzU5MA==","upper_bound":"MTgwNTI5MTU=","repeats":1},{"count":1032,"lower_bound":"MTk5MjUyNTE=","upper_bound":"MjYxNTEwMzk=","repeats":1},{"count":1040,"lower_bound":"MjkyMjYyODg=","upper_bound":"Mzc0MTExOTM=","repeats":1},{"count":1048,"lower_bound":"NDIxOTU0MTY=","upper_bound":"NDk0MDg3MzM=","repeats":1},{"count":1056,"lower_bound":"NDk2NzIyNjg=","upper_bound":"NTc3NjY3MTA=","repeats":1},{"count":1064,"lower_bound":"MTAyNjUxNDM4","upper_bound":"MTE5NzI1Njg0","repeats":1},{"count":1072,"lower_bound":"MTIyNTc2NjEx","upper_bound":"MTQ1NjA2MzA4","repeats":1},{"count":1080,"lower_bound":"MTQ5MTM3ODE4","upper_bound":"MTU1MzczNTg2","repeats":1},{"count":1088,"lower_bound":"MTYzMjM4ODY4","upper_bound":"MTgyMjU2OTMx","repeats":1},{"count":1096,"lower_bound":"MTg1MzMyMTY3","upper_bound":"MTkyOTEzODY1","repeats":1},{"count":1104,"lower_bound":"MTkzNTUyODkz","upper_bound":"MjAyNDI0NzY0","repeats":1},{"count":1112,"lower_bound":"MjAyNzA3ODc5","upper_bound":"MjEzMTM1MjQy","repeats":1},{"count":1120,"lower_bound":"MjE1Nzg1ODM0","upper_bound":"MjI4ODIwODA3","repeats":1},{"count":1128,"lower_bound":"MjMwMDMxMTM4","upper_bound":"MjM2MTcyMDcz","repeats":1},{"count":1136,"lower_bound":"MjM4NDU0OTY2","upper_bound":"MjQ1NzQyODIx","repeats":1},{"count":1144,"lower_bound":"MjUwODIwNDY4","upper_bound":"MjY1MjM0NDU4","repeats":1},{"count":1152,"lower_bound":"MjY2MTQzMjA3","upper_bound":"Mjc0MzEzMzUz","repeats":1},{"count":1160,"lower_bound":"Mjg2OTMyODA3","upper_bound":"MzEwMDUxNjA0","repeats":1},{"count":1168,"lower_bound":"MzE4NjAxNzY0","upper_bound":"MzMwMDA1MDY4","repeats":1},{"count":1176,"lower_bound":"MzMwMjI3NzU0","upper_bound":"MzM0MjQ3MzE0","repeats":1},{"count":1184,"lower_bound":"MzM2ODEwMzI1","upper_bound":"MzQ5NzAwNTcx","repeats":1},{"count":1192,"lower_bound":"MzUxMzU2MDcx","upper_bound":"MzY4NDI4NzI3","repeats":1},{"count":1200,"lower_bound":"MzY5Njk2NTU2","upper_bound":"Mzg4MzU1MjYy","repeats":1},{"count":1208,"lower_bound":"MzkyMTczMjM5","upper_bound":"NDA4NDQxMDAy","repeats":1},{"count":1216,"lower_bound":"NDA4NzQxMzYy","upper_bound":"NDExNDg3NjU2","repeats":1},{"count":1224,"lower_bound":"NDE0MjQyOTY4","upper_bound":"NDQzMDk4NTU2","repeats":1},{"count":1232,"lower_bound":"NDQ1MTA0MDY0","upper_bound":"NDQ5NTkwMzQ0","repeats":1},{"count":1240,"lower_bound":"NDUyMDExOTYz","upper_bound":"NDYwMzg0NzAz","repeats":1},{"count":1248,"lower_bound":"NDYxNDA1NDYx","upper_bound":"NDc3NjYyNDg4","repeats":1},{"count":1256,"lower_bound":"NDc4NTA4MjAx","upper_bound":"NDk1MzkwMTM0","repeats":1},{"count":1264,"lower_bound":"NDk2Nzc0NjU4","upper_bound":"NTA0ODMyODg5","repeats":1},{"count":1272,"lower_bound":"NTA1NzYwNzQx","upper_bound":"NTIxODU5MTQx","repeats":1},{"count":1280,"lower_bound":"NTI0MjIxNTU1","upper_bound":"NTM5NTU2ODM5","repeats":1},{"count":1288,"lower_bound":"NTQ4MDM0NjMy","upper_bound":"NTUxODAwNTYz","repeats":1},{"count":1296,"lower_bound":"NTU1NTU3ODYw","upper_bound":"NTU5NDc4ODkz","repeats":1},{"count":1304,"lower_bound":"NTY2MTkwNTE3","upper_bound":"NTcxMzg3MDM4","repeats":1},{"count":1312,"lower_bound":"NTc2Mjk2MjY5","upper_bound":"NjA4Njk0OTIx","repeats":1},{"count":1320,"lower_bound":"NjI1OTY4OTM1","upper_bound":"NjM3NDkzMzU3","repeats":1},{"count":1328,"lower_bound":"NjQwNjE5OTY4","upper_bound":"NjQzNDA3NDkx","repeats":1},{"count":1336,"lower_bound":"NjU0MTc4Njcx","upper_bound":"NjYzNDM4MjI2","repeats":1},{"count":1344,"lower_bound":"NjgwMzU0Mzcy","upper_bound":"Njk1MjczNjEw","repeats":1},{"count":1352,"lower_bound":"Njk4MjQwNzg4","upper_bound":"NzExNTEzNjIw","repeats":1},{"count":1360,"lower_bound":"NzE1NDc4Mjc4","upper_bound":"NzQwMTY1OTE4","repeats":1},{"count":1368,"lower_bound":"NzQyNTM1MDAx","upper_bound":"NzYwODkxNDA0","repeats":1},{"count":1376,"lower_bound":"NzYxNzYzMDI1","upper_bound":"NzczNzI0ODg2","repeats":1},{"count":1384,"lower_bound":"Nzc5MDE4OTE1","upper_bound":"NzkzMDAzMzEx","repeats":1},{"count":1392,"lower_bound":"Nzk5OTE0OTY1","upper_bound":"ODE5NTI0MDk4","repeats":1},{"count":1400,"lower_bound":"ODIxMTAwMDkx","upper_bound":"ODM1Mzc2MTA1","repeats":1},{"count":1408,"lower_bound":"ODM2MzM4OTIz","upper_bound":"ODUxMDcwODk3","repeats":1},{"count":1416,"lower_bound":"ODU2OTkyMzEz","upper_bound":"ODY0Mjg5NjYy","repeats":1},{"count":1424,"lower_bound":"ODY5OTEyODcx","upper_bound":"ODc1NDAwMjE3","repeats":1},{"count":1432,"lower_bound":"ODg4MjM3Njg2","upper_bound":"OTA3NDk5MTM5","repeats":1},{"count":1440,"lower_bound":"OTA4NDE2MjU5","upper_bound":"OTM2NzQ5ODYx","repeats":1},{"count":1448,"lower_bound":"OTM4MDk1NjQ0","upper_bound":"OTUzOTg1Mzg3","repeats":1},{"count":1456,"lower_bound":"OTU1NDAwNjA5","upper_bound":"OTY1OTgxMTU4","repeats":1},{"count":1464,"lower_bound":"OTc3MjQxNjM0","upper_bound":"OTgyNjg3MzI2","repeats":1},{"count":1472,"lower_bound":"OTg5MDE0MTgw","upper_bound":"OTkzNTU0MjA5","repeats":1},{"count":1480,"lower_bound":"OTk5OTQ5MjI0","upper_bound":"MTAyODQ2MTQ5MA==","repeats":1},{"count":1488,"lower_bound":"MTAzMTA1MTE3MQ==","upper_bound":"MTA0Mzk0MTM1NQ==","repeats":1},{"count":1496,"lower_bound":"MTA0ODY2Mjk2Nw==","upper_bound":"MTA1OTI4MDI3MA==","repeats":1},{"count":1504,"lower_bound":"MTA2MDkzMTI4Ng==","upper_bound":"MTA3MzQxMzA3Ng==","repeats":1},{"count":1512,"lower_bound":"MTA4MTM0MTQ2Mg==","upper_bound":"MTA5MDgyODM5OA==","repeats":1},{"count":1520,"lower_bound":"MTA5MDk4MDgzOA==","upper_bound":"MTExMzA2MzY5NA==","repeats":1},{"count":1528,"lower_bound":"MTExNTgyNzYxNg==","upper_bound":"MTEzNTIzODExNA==","repeats":1},{"count":1536,"lower_bound":"MTEzNTUwNTQ4OA==","upper_bound":"MTE1OTc2Mzc0Nw==","repeats":1},{"count":1544,"lower_bound":"MTE2MTA1Njg2OQ==","upper_bound":"MTE3MDA0NjcwMw==","repeats":1},{"count":1552,"lower_bound":"MTE3MDM5MjM2NA==","upper_bound":"MTE4NDIzNTY0Ng==","repeats":1},{"count":1560,"lower_bound":"MTE4NTgzMTg2MQ==","upper_bound":"MTE5ODUzNTMyMg==","repeats":1},{"count":1568,"lower_bound":"MTE5OTU3NDM4Mg==","upper_bound":"MTIwNDQxODU4MA==","repeats":1},{"count":1576,"lower_bound":"MTIxMTA4MDU4NQ==","upper_bound":"MTIyNDE1MjYzMw==","repeats":1},{"count":1584,"lower_bound":"MTIzNTEzMDc5MQ==","upper_bound":"MTI0OTA5NTI3Mw==","repeats":1},{"count":1592,"lower_bound":"MTI1NDQwNjM5NQ==","upper_bound":"MTI2NjkzMDgwMQ==","repeats":1},{"count":1600,"lower_bound":"MTI3MTUyODE5MQ==","upper_bound":"MTI4MjQ1MTUyMA==","repeats":1},{"count":1608,"lower_bound":"MTI4NzM5Njk1MA==","upper_bound":"MTMwMDM3OTU0NA==","repeats":1},{"count":1616,"lower_bound":"MTMwMjY4ODk1OQ==","upper_bound":"MTMxOTA0OTQyOA==","repeats":1},{"count":1624,"lower_bound":"MTMyNDY4NTY2OA==","upper_bound":"MTM0NDc0ODg1MA==","repeats":1},{"count":1632,"lower_bound":"MTM0NTY2NDU4MA==","upper_bound":"MTM1NDkwNTI5Nw==","repeats":1},{"count":1640,"lower_bound":"MTM1NzcwMzQzMg==","upper_bound":"MTM2NDEzNjAxNw==","repeats":1},{"count":1648,"lower_bound":"MTM2Njg5ODYzNA==","upper_bound":"MTM3ODUyMjg1Mg==","repeats":1},{"count":1656,"lower_bound":"MTM4MTY3OTc4NQ==","upper_bound":"MTM5ODU5OTYyNA==","repeats":1},{"count":1664,"lower_bound":"MTQwMzIwMDUzNg==","upper_bound":"MTQwNTY0Mjg2NA==","repeats":1},{"count":1672,"lower_bound":"MTQxMTE3MTgyOA==","upper_bound":"MTQyNzAwODIwNQ==","repeats":1},{"count":1680,"lower_bound":"MTQzMzE3NTU1OQ==","upper_bound":"MTQ0Mjk0MDk1OQ==","repeats":1},{"count":1688,"lower_bound":"MTQ0NDUxMjk4OQ==","upper_bound":"MTQ1NjI1NTQxOQ==","repeats":1},{"count":1696,"lower_bound":"MTQ1ODcyNjU5Mw==","upper_bound":"MTQ2MjAxNjM2MQ==","repeats":1},{"count":1704,"lower_bound":"MTQ2NDM3MzU3OA==","upper_bound":"MTQ3NTg5NzEzNQ==","repeats":1},{"count":1712,"lower_bound":"MTQ4NDkxNDU2MQ==","upper_bound":"MTQ5ODQ2MzgwNg==","repeats":1},{"count":1720,"lower_bound":"MTUwMzM4MTcwMQ==","upper_bound":"MTUyNTY1NzI4Nw==","repeats":1},{"count":1728,"lower_bound":"MTUyNTY1NzczMA==","upper_bound":"MTUzOTY4MjM0NQ==","repeats":1},{"count":1736,"lower_bound":"MTUzOTg2NDE1Ng==","upper_bound":"MTU1MTQxMjg0NA==","repeats":1},{"count":1744,"lower_bound":"MTU1NTY3NjcwMQ==","upper_bound":"MTU2MzcwNDIzMQ==","repeats":1},{"count":1752,"lower_bound":"MTU2NjE1NjM0MA==","upper_bound":"MTU4OTUwODYyMA==","repeats":1},{"count":1760,"lower_bound":"MTU5MDE4NTE1Ng==","upper_bound":"MTYxMTQxNjMzOA==","repeats":1},{"count":1768,"lower_bound":"MTYxNTkyMTU2OA==","upper_bound":"MTYzMDQwMjc0Ng==","repeats":1},{"count":1776,"lower_bound":"MTYzOTI0MzU0NA==","upper_bound":"MTY0NDEwMTc4MQ==","repeats":1},{"count":1784,"lower_bound":"MTY0NDExMDU5MA==","upper_bound":"MTY1NzIzNDA0MA==","repeats":1},{"count":1792,"lower_bound":"MTY1OTUyNjQ1MQ==","upper_bound":"MTY4MDI5MjgwNQ==","repeats":1},{"count":1800,"lower_bound":"MTY4MTgxOTUwMw==","upper_bound":"MTY4NDIzMTA5MA==","repeats":1},{"count":1808,"lower_bound":"MTY5NDM4Nzc2OA==","upper_bound":"MTcyNjAzNzE3NA==","repeats":1},{"count":1816,"lower_bound":"MTczMzY3MTk3MA==","upper_bound":"MTc0MDMyMjc2NA==","repeats":1},{"count":1824,"lower_bound":"MTc0MTAzNTI2Ng==","upper_bound":"MTc0ODMxMjg4OA==","repeats":1},{"count":1832,"lower_bound":"MTc0OTE3OTk4Nw==","upper_bound":"MTc1NDkwMTI2MQ==","repeats":1},{"count":1840,"lower_bound":"MTc3MDQ1MDcyNg==","upper_bound":"MTc4Mzg4MDE4NA==","repeats":1},{"count":1848,"lower_bound":"MTc5NjIzNTgxNg==","upper_bound":"MTgyNjgwMzY0Mg==","repeats":1},{"count":1856,"lower_bound":"MTgzMTkxNDg0MA==","upper_bound":"MTg0NDE2NjU5Ng==","repeats":1},{"count":1864,"lower_bound":"MTg1MjgwOTc3Mg==","upper_bound":"MTg2NjMxNzAxMQ==","repeats":1},{"count":1872,"lower_bound":"MTg2NzgxMzc4MA==","upper_bound":"MTg3NDM0MDAxNA==","repeats":1},{"count":1880,"lower_bound":"MTg3NTA1MDU0OQ==","upper_bound":"MTg5MTQ5NTkyMA==","repeats":1},{"count":1888,"lower_bound":"MTg5MjgzMzk0Ng==","upper_bound":"MTkwMjY4NzcwNA==","repeats":1},{"count":1896,"lower_bound":"MTkwMzY3NzU5Ng==","upper_bound":"MTkyNDI0MTc4NQ==","repeats":1},{"count":1904,"lower_bound":"MTkyNzYwMTg1Mg==","upper_bound":"MTkzOTg3NTcxOA==","repeats":1},{"count":1912,"lower_bound":"MTk0ODM1NzI3NQ==","upper_bound":"MTk0OTkyNjQ2MQ==","repeats":1},{"count":1920,"lower_bound":"MTk1OTA1OTc2Ng==","upper_bound":"MTk3ODk2MDI5Mg==","repeats":1},{"count":1928,"lower_bound":"MTk4MDU2MzUzNg==","upper_bound":"MTk4NzgyMjkxNw==","repeats":1},{"count":1936,"lower_bound":"MTk4ODQzMzU5OQ==","upper_bound":"MjAxNzYyMTgwNA==","repeats":1},{"count":1944,"lower_bound":"MjAxODYyMTE1OA==","upper_bound":"MjAzMDk2NTg1OQ==","repeats":1},{"count":1952,"lower_bound":"MjAzNDQxNTYxOA==","upper_bound":"MjA1MTE0NjA5Nw==","repeats":1},{"count":1960,"lower_bound":"MjA1MjE5MjM4Nw==","upper_bound":"MjA2MjM4MjYyNQ==","repeats":1},{"count":1968,"lower_bound":"MjA2OTc0MTc2NQ==","upper_bound":"MjA4NjU2MzM3Mg==","repeats":1},{"count":1976,"lower_bound":"MjA4NzA3MTk3Mg==","upper_bound":"MjExMzkxMjIxMA==","repeats":1},{"count":1984,"lower_bound":"MjExODE3NDA1OA==","upper_bound":"MjEyMDEzNDEzMw==","repeats":1},{"count":1992,"lower_bound":"MjEyMDcyMjgwOA==","upper_bound":"MjEyODM4MzQ2MA==","repeats":1},{"count":2000,"lower_bound":"MjEyODU4NzMwNg==","upper_bound":"MjE0MzczNDIzMw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,3,1,0,1,0,0,1,1,0,2,0,1,1,2,0,1,0,1,2,2,2,1,0,0,1,1,0,0,0,0,1,2,1,1,2,0,0,0,1,1,2,2,1,1,1,1,1,4,2,1,1,0,0,1,1,2,0,1,2,0,0,1,0,2,1,1,0,0,0,1,1,1,1,0,1,0,1,2,1,2,3,0,0,0,1,1,4,1,2,0,1,1,1,0,1,1,0,2,2,0,2,0,3,0,0,2,0,0,1,0,1,1,0,1,1,1,0,0,0,1,2,0,1,0,1,1,0,0,1,4,1,1,1,1,0,1,1,0,1,1,0,1,3,1,2,0,0,2,1,0,3,1,2,0,2,1,2,0,0,1,1,2,0,1,0,0,0,2,1,1,0,0,0,1,1,0,2,1,1,2,0,0,0,0,0,0,1,1,2,1,1,0,1,2,0,0,2,2,0,3,0,1,0,2,1,3,1,0,2,1,1,4,0,0,4,1,2,1,1,1,2,2,2,0,1,1,1,3,2,2,3,1,1,3,3,0,3,1,1,2,2,1,3,1,0,0,1,2,0,0,2,2,2,3,1,0,2,0,0,2,0,2,0,0,1,1,0,1,0,1,0,1,0,2,1,2,1,0,2,1,1,3,0,2,0,1,2,0,1,1,0,1,2,1,2,2,0,3,3,3,2,4,3,0,0,0,2,2,1,2,0,1,1,2,0,0,2,3,0,0,2,1,0,1,1,1,2,1,2,2,2,0,0,2,1,2,1,3,0,2,1,2,1,2,2,0,3,0,2,1,1,0,0,2,0,0,1,0,0,1,0,2,3,1,1,1,0,2,0,0,1,2,0,2,1,1,0,1,1,2,2,1,0,0,0,0,2,1,1,0,1,2,0,0,0,2,1,2,0,1,2,1,0,1,1,2,1,0,4,1,1,2,0,1,1,3,1,1,1,0,0,4,0,4,0,0,1,0,0,1,0,2,0,0,0,2,1,0,1,2,0,1,0,2,2,2,0,2,0,2,0,2,0,0,2,1,0,0,1,1,0,1,3,3,1,1,1,0,0,1,1,2,1,1,1,1,2,3,0,2,0,0,1,0,3,3,1,1,3,1,0,0,0,0,2,0,5,1,2,1,1,1,2,1,2,0,1,1,2,3,0,0,0,0,0,1,1,1,0,1,1,2,0,2,1,2,2,0,0,1,2,2,0,0,1,1,1,0,0,1,3,0,0,1,0,3,0,2,0,2,1,1,0,0,1,1,0,1,1,1,0,1,1,0,0,2,1,0,2,2,1,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,2,1,0,1,0,2,1,2,1,2,1,1,1,3,0,0,1,0,1,2,0,1,1,1,1,0,0,2,0,0,1,2,1,1,0,0,0,0,1,1,0,0,0,1,2,4,2,1,0,0,0,4,0,0,0,1,1,1,0,0,1,0,0,1,0,2,0,3,1,1,4,0,2,2,2,1,1,2,0,1,0,1,3,1,1,2,2,1,1,0,0,0,1,1,1,2,0,2,3,1,0,3,0,2,1,3,0,2,0,0,1,0,1,1,2,0,0,1,0,0,2,1,0,2,1,0,0,0,2,1,3,1,1,0,2,1,0,0,0,1,1,3,1,1,2,1,1,1,1,0,1,2,2,0,1,0,0,0,2,0,0,3,0,2,1,1,1,2,0,0,0,0,1,2,1,2,1,1,0,0,2,1,1,0,1,2,0,1,1,1,2,0,0,0,0,2,0,0,1,0,0,2,1,0,1,0,0,0,2,0,2,1,2,0,2,1,0,0,1,0,0,1,4,1,1,1,0,1,4,1,2,0,0,0,2,2,1,2,1,2,2,0,1,0,1,0,1,1,1,1,0,1,0,3,1,3,2,0,1,0,3,1,0,1,2,2,1,2,0,0,0,0,2,1,3,1,2,0,1,0,3,0,1,1,2,1,2,1,1,1,4,1,0,1,3,1,0,0,0,1,1,1,0,1,1,1,2,1,1,0,1,5,0,0,1,0,1,0,1,1,3,0,1,1,1,1,0,0,0,3,0,2,2,1,0,0,1,0,1,3,1,0,1,2,2,1,0,1,1,0,0,0,0,1,1,2,1,1,0,2,3,1,3,1,2,0,1,0,1,0,4,1,1,0,1,0,1,2,0,2,0,1,1,0,3,0,1,0,1,2,1,4,0,2,2,3,0,1,1,1,2,1,1,0,0,0,2,2,2,3,2,1,0,0,2,0,3,2,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,0,1,3,2,2,3,2,1,1,1,0,0,0,0,1,1,2,0,0,3,0,3,1,1,0,1,0,1,0,1,3,1,2,1,1,0,1,3,1,1,0,0,0,1,1,2,1,1,0,2,1,1,2,0,0,0,0,1,0,0,1,0,0,1,2,2,0,0,1,0,1,2,2,0,1,1,2,1,3,4,1,1,0,0,2,1,1,0,0,1,2,1,1,0,1,0,0,2,1,0,1,1,2,0,0,1,0,2,2,1,2,1,1,1,1,1,0,1,2,2,0,0,3,0,0,1,1,0,0,0,1,1,0,1,0,1,0,0,0,0,0,0,2,0,2,0,1,1,2,1,0,0,1,0,0,1,0,0,1,1,2,1,1,0,0,0,3,2,3,1,2,2,1,3,3,1,0,1,1,0,0,1,4,0,1,1,1,0,1,0,0,0,0,2,0,2,1,0,1,3,0,0,0,1,1,0,0,3,2,0,1,0,2,3,0,4,0,2,2,2,1,1,0,2,1,3,2,1,0,3,1,0,2,0,1,1,1,0,3,0,0,4,2,1,0,0,0,0,3,3,0,3,1,0,1,2,0,1,1,1,0,2,0,1,2,3,2,2,0,0,0,0,1,1,0,1,3,0,1,0,0,0,0,2,0,1,3,1,0,0,2,0,3,1,1,1,0,1,1,1,0,0,1,1,0,0,1,2,1,0,1,2,1,2,0,0,0,0,2,2,1,1,1,0,0,0,0,5,2,2,1,1,0,1,3,1,0,0,1,2,1,0,0,3,2,0,1,2,0,0,0,1,3,2,2,1,0,2,2,4,1,0,0,1,2,0,2,0,1,2,1,0,0,0,1,0,0,2,0,2,1,0,0,0,2,3,2,2,0,2,1,0,0,0,3,1,2,3,0,1,1,0,0,0,1,2,2,2,2,1,1,3,1,0,1,2,2,0,1,1,2,3,1,2,2,0,0,3,2,1,2,0,2,0,0,0,0,0,0,1,0,0,1,1,1,2,1,1,2,1,1,1,0,1,1,1,2,0,2,2,1,1,2,1,0,2,2,0,1,0,0,0,1,1,0,0,2,1,0,1,0,1,0,1,1,1,1,0,0,0,1,0,0,0,0,0,1,3,1,1,1,0,0,0,0,2,0,3,0,1,1,1,2,3,1,0,0,1,2,3,5,1,0,0,1,1,2,3,1,0,0,1,0,3,0,2,1,0,0,3,3,1,1,1,3,1,2,0,0,0,0,1,1,1,0,1,2,1,1,2,1,2,2,0,0,0,0,1,2,2,1,0,0,0,1,0,2,0,1,0,1,1,3,0,2,1,0,1,1,0,5,1,1,0,0,1,0,1,0,0,3,1,2,1,2,0,0,3,1,1,1,0,2,1,0,0,0,0,1,1,2,0,3,2,2,0,1,2,0,1,1,1,3,3,0,1,2,1,1,2,1,0,1,0,0,0,0,2,0,0,1,1,0,1,1,0,1,0,4,0,0,1,1,3,1,1,1,0,0,0,2,2,0,2,0,1,1,2,1,1,2,0,3,0,2,3,0,0,1,1,0,1,4,1,0,2,0,0,2,1,1,3,0,0,1,2,1,0,0,1,1,0,1,0,1,1,1,1,1,2,0,0,0,1,1,0,1,1,1,1,0,1,2,0,1,1,0,2,0,0,2,3,1,2,3,3,0,0,2,1,0,1,1,2,0,1,0,0,0,1,0,1,0,3,3,0,1,0,1,0,0,1,1,1,1,0,2,1,1,1,0,0,2,0,0,1,0,0,1,3,0,3,0,1,3,1,2,0,3,1,2,1,0,3,2,1,1,0,0,0,0,0,2,2,1,1,0,1,3,0,0,2,1,0,1,1,0,0,0,1,1,2,3,1,0,0,2,1,0,1,2,0,2,0,2,0,1,0,1,0,0,0,3,0,3,0,0,0,1,1,0,0,0,2,1,0,0,0,0,0,2,0,1,1,0,1,1,1,1,1,2,2,0,1,0,0,1,1,2,3,0,1,0,0,2,1,0,1,1,1,0,0,0,2,0,1,0,0,0,1,0,1,1,2,1,0,2,1,0,0,1,3,0,0,1,1,0,2,0,3,0,0,2,1,1,0,1,1,1,0,1,1,0,1,1,1,0,0,1,4,1,1,3,2,0,0,0,4,1,0,1,2,2,2,1,0,1,1,0,1,0,0,1,1,1,0,0,1,1,0,3,0,1,0,0,1,1,1,0,1,1,0,0,1,2,0,1,0,1,1,1,0,1,1,0,1,0,0,2,3,1,1,1,0,0,0,1,1,2,0,1,2,0,1,1,0]},{"counters":[1,1,3,1,0,0,0,0,1,0,0,0,2,1,1,1,2,0,0,2,3,1,2,2,1,0,0,0,2,1,1,0,0,1,0,2,0,2,1,0,0,1,1,1,2,0,1,1,1,0,3,1,1,0,1,3,0,0,1,1,2,1,1,2,1,0,2,1,1,2,2,0,0,1,1,0,0,2,0,1,1,2,1,1,1,2,2,2,1,0,0,1,1,1,0,0,1,2,1,1,1,0,2,2,4,2,1,1,1,1,2,0,1,0,2,1,0,0,0,2,0,2,2,2,1,2,0,1,3,1,1,3,0,0,1,1,0,3,0,1,3,2,1,2,0,0,0,3,2,1,0,2,1,0,0,4,0,0,0,1,2,0,0,1,2,0,0,3,0,2,0,1,0,1,2,0,1,1,0,1,1,1,0,2,0,1,4,1,0,0,0,0,0,0,2,0,0,1,1,1,0,2,1,0,1,2,2,0,0,0,1,1,2,2,2,0,1,2,0,0,1,4,2,2,3,0,1,2,0,2,2,3,0,5,0,0,2,1,1,1,0,0,1,1,1,0,1,2,1,0,0,0,0,1,3,1,1,0,2,1,1,1,1,0,2,1,0,1,0,0,2,2,0,0,0,2,1,0,1,2,1,1,1,2,0,3,1,0,0,1,2,0,1,1,1,1,2,2,1,1,1,1,0,0,4,1,0,2,0,0,0,1,1,1,1,1,2,1,2,0,0,0,1,0,1,1,1,2,0,0,0,1,0,1,1,1,3,4,0,2,1,0,0,3,2,0,2,0,2,3,2,1,2,1,1,0,0,0,1,1,0,0,4,0,0,1,3,1,1,1,0,1,2,1,1,0,1,0,0,0,1,0,0,1,2,0,2,0,1,3,1,2,0,2,1,2,1,0,1,0,4,0,0,1,2,0,1,0,1,0,0,2,2,1,1,0,1,3,1,1,0,2,2,0,1,1,1,2,1,1,1,0,3,4,0,0,1,3,1,1,0,0,3,1,0,3,0,0,2,2,1,1,2,1,0,1,0,0,0,0,1,0,0,2,2,1,1,1,0,1,0,0,1,2,2,2,2,1,1,2,0,5,1,2,0,0,0,0,0,4,0,0,0,1,0,0,0,0,0,3,1,0,0,1,0,0,0,4,1,1,0,3,1,3,0,3,0,1,2,1,0,0,1,0,0,2,2,0,0,0,0,0,2,0,1,0,0,2,1,1,0,1,1,0,2,1,1,2,1,2,1,2,1,2,0,1,2,2,0,1,0,1,1,1,2,2,3,1,1,0,1,0,3,3,0,1,0,0,1,2,2,0,1,0,0,1,2,0,2,0,0,0,3,0,3,0,1,0,2,2,2,2,0,1,0,1,3,1,2,0,0,0,1,0,1,2,1,0,0,0,2,0,2,0,0,0,0,0,0,3,0,1,0,2,0,1,3,0,0,2,2,0,3,0,0,2,1,1,1,0,3,1,0,1,0,1,2,1,2,2,0,1,0,1,2,1,0,2,3,4,0,0,0,1,1,0,1,0,1,2,1,1,2,2,2,2,0,0,0,0,1,1,0,1,2,0,3,3,1,0,0,0,2,0,2,0,0,1,0,1,0,0,1,0,3,0,1,1,0,2,1,2,2,4,0,2,1,0,0,1,1,0,0,0,2,1,1,0,1,4,0,0,1,0,0,0,0,2,1,2,1,0,1,1,2,3,1,1,0,1,1,0,2,0,1,1,1,1,2,0,1,0,1,0,1,1,1,2,1,3,0,2,1,0,1,2,1,2,0,0,1,1,0,1,3,1,1,2,0,0,2,1,1,0,1,1,0,0,2,3,2,0,0,2,0,0,3,0,0,1,0,2,0,4,0,1,2,0,0,1,3,3,0,0,0,4,1,0,0,1,0,0,1,0,0,1,0,0,3,0,1,3,1,0,2,2,2,0,1,0,1,0,3,1,1,0,1,1,2,1,3,2,0,2,0,2,0,2,0,0,0,1,2,0,3,4,0,0,0,0,0,1,2,3,2,2,1,0,0,1,0,1,1,0,0,3,1,0,1,3,4,0,3,1,2,1,1,0,1,1,0,1,3,0,0,0,1,2,1,0,1,1,3,0,1,0,5,1,2,1,0,1,1,0,0,1,0,1,0,0,1,1,0,2,0,1,1,2,0,0,0,3,0,0,1,0,2,2,0,0,1,1,1,0,0,0,0,0,1,0,2,2,1,2,2,1,0,2,2,1,0,3,4,1,2,1,0,1,1,1,0,2,1,0,3,2,0,1,1,0,1,1,0,0,0,1,1,1,0,1,0,0,1,0,0,1,2,1,0,0,0,2,1,1,3,1,1,1,0,2,1,2,2,2,0,0,1,2,2,1,1,0,3,1,0,2,2,1,1,2,0,4,2,0,0,1,2,1,2,0,2,2,1,1,0,2,1,0,0,1,1,0,0,1,1,0,0,0,1,3,1,1,1,0,0,1,2,0,0,3,3,1,0,0,1,1,0,1,1,2,0,0,0,0,2,1,0,1,0,0,0,0,2,1,0,0,1,1,0,1,1,1,2,0,0,1,2,1,1,2,0,1,0,1,0,2,3,2,1,0,3,0,0,0,0,1,1,3,0,1,2,1,1,0,0,2,1,2,0,0,0,3,0,0,1,1,0,0,4,0,1,1,1,0,1,1,0,1,2,1,2,0,1,2,0,1,0,1,2,1,0,1,0,1,2,2,1,0,1,3,1,1,1,0,2,0,0,0,1,2,1,2,2,1,0,0,0,3,0,2,1,1,1,1,1,0,2,3,0,0,3,0,2,2,0,1,1,2,0,1,1,2,0,2,3,0,3,0,0,2,4,2,0,3,0,1,0,1,1,1,1,1,2,0,1,1,1,0,0,0,0,0,0,2,0,2,0,2,0,3,0,0,0,0,0,3,2,2,2,0,0,2,1,1,3,1,1,3,0,0,1,0,1,1,2,1,0,2,0,0,1,0,1,0,1,2,1,1,2,3,3,0,1,0,0,2,0,0,0,1,0,0,1,1,1,0,0,2,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,1,0,1,1,0,0,1,1,1,1,2,0,1,0,0,1,0,1,0,1,1,0,1,0,0,0,2,1,2,1,1,0,1,0,0,0,0,1,1,1,0,0,0,0,3,1,0,3,0,1,2,0,2,2,1,0,0,0,2,0,0,1,2,1,1,0,5,1,3,0,2,1,3,1,2,1,0,3,1,1,0,1,1,1,1,0,2,1,0,0,0,0,1,1,0,1,0,1,0,1,2,1,3,0,2,1,0,1,2,1,1,1,3,2,0,3,2,1,0,1,0,1,2,1,0,0,1,0,1,2,2,1,3,0,4,1,1,1,1,0,1,1,0,0,3,2,1,3,0,0,1,1,1,0,0,1,3,0,2,0,1,1,1,1,0,1,0,2,3,1,0,1,1,1,0,1,0,1,0,2,1,0,2,0,0,1,1,1,3,1,3,3,0,2,0,1,0,4,1,2,1,4,0,1,0,0,2,2,0,0,0,1,2,0,1,1,1,1,1,1,0,0,1,1,0,0,2,1,0,1,1,0,1,0,0,0,0,0,0,1,2,0,1,1,1,0,1,0,0,0,1,0,2,1,0,1,0,2,0,0,0,0,1,0,0,1,0,3,0,0,1,0,1,2,2,2,0,1,0,1,0,1,1,1,0,0,1,0,0,0,1,1,0,0,1,1,1,0,3,3,0,2,1,0,0,0,3,0,0,3,1,1,0,1,2,2,1,1,0,1,0,0,0,0,0,1,0,1,0,1,2,1,2,1,1,1,0,1,0,1,0,0,1,1,1,2,1,1,2,1,2,1,0,0,1,1,3,2,1,1,1,0,1,1,0,1,0,2,1,0,1,3,2,0,0,0,1,2,1,2,1,1,0,2,1,1,0,3,1,2,1,1,3,1,2,0,1,0,0,0,0,1,1,2,0,1,1,3,1,1,1,1,1,2,2,1,0,2,2,0,0,1,0,3,2,1,2,0,1,0,0,0,1,0,2,0,0,1,1,2,1,2,1,0,1,1,0,0,2,0,2,1,2,2,1,2,0,1,1,0,1,1,0,2,0,0,3,1,2,1,3,1,2,0,5,0,2,1,0,3,2,3,2,0,0,0,0,1,0,1,0,0,1,2,1,0,1,0,0,2,2,4,1,1,2,2,0,0,1,0,0,1,2,0,1,2,0,1,1,2,0,1,0,3,4,2,0,1,1,1,1,1,1,0,2,0,0,0,0,1,0,1,2,1,1,0,2,2,3,0,1,3,1,1,3,0,0,3,1,2,0,1,0,2,4,2,2,1,0,0,3,4,3,1,0,0,0,2,0,3,1,0,2,1,0,4,0,0,0,1,1,7,1,0,1,0,0,1,1,0,0,1,1,1,3,2,1,1,2,1,1,1,1,1,1,0,0,0,1,1,2,1,1,2,0,0,1,1,0,0,1,2,1,0,0,3,0,2,0,0,2,0,0,0,0,1,2,1,1,0,1,2,1,2,3,2,0,1,1,1,3,3,0,0,2,1,0,0,3,0,0,2,2,1,5,2,1,3,2,0,0,0,1]},{"counters":[0,1,2,1,0,1,2,1,2,3,1,1,0,1,1,1,0,0,0,2,3,0,1,0,2,2,0,0,1,0,0,2,3,1,1,0,0,1,0,0,2,0,1,1,1,0,2,1,0,1,1,1,2,2,1,0,1,1,0,2,2,2,1,1,0,0,2,1,0,0,0,1,1,1,1,1,2,1,0,1,0,1,1,2,1,1,1,1,0,1,2,0,1,0,1,1,1,1,2,1,1,1,1,3,0,1,0,0,1,1,0,1,1,2,0,0,1,1,3,0,2,0,2,1,0,0,0,0,1,0,2,1,0,3,1,2,1,2,1,3,1,1,1,2,1,0,3,0,0,1,0,0,0,0,0,1,0,1,2,1,0,1,0,2,0,0,0,0,0,0,2,0,0,1,1,0,0,0,2,0,0,0,1,0,1,2,1,1,1,1,1,2,1,0,1,2,0,0,0,1,1,1,0,0,3,1,0,0,2,1,0,0,0,1,0,2,0,1,1,1,2,0,0,2,0,2,0,1,0,0,1,0,0,1,0,1,3,2,1,1,2,0,1,0,0,1,0,1,1,2,0,1,2,2,0,0,0,0,0,1,0,3,2,1,2,2,2,0,4,1,0,2,1,0,0,1,0,2,2,2,0,0,0,0,1,1,0,1,0,1,0,1,0,2,1,2,3,2,0,1,0,2,1,0,2,2,1,1,1,0,0,0,0,0,1,0,0,2,1,0,0,0,1,1,1,0,1,0,3,0,0,0,0,2,1,0,1,0,1,0,1,2,1,1,1,1,4,2,2,0,0,0,0,0,2,0,2,0,4,1,0,4,1,1,2,3,1,0,0,2,0,2,2,1,0,0,1,2,1,1,2,1,2,0,0,0,0,2,1,2,0,0,0,1,1,2,2,3,0,4,0,2,0,0,0,0,0,1,0,0,0,1,2,0,2,0,1,1,0,4,3,2,1,2,0,2,3,0,1,1,0,0,1,2,1,0,1,0,2,0,0,1,0,2,1,0,1,0,0,1,0,1,1,1,1,0,1,0,1,0,1,1,1,0,2,0,0,2,0,1,0,2,1,0,1,0,1,3,1,1,1,0,2,1,2,0,0,0,1,0,2,1,1,2,0,2,1,0,2,0,0,2,4,3,1,0,2,1,0,0,0,1,1,1,1,2,0,0,0,1,0,2,1,1,0,1,1,0,1,1,0,0,0,1,0,2,2,2,1,1,0,0,3,0,0,1,2,1,0,0,1,0,1,2,1,4,0,0,0,2,2,0,1,3,0,1,1,2,1,1,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,1,2,0,0,2,0,1,2,1,0,4,3,0,1,2,2,1,0,0,0,3,0,0,1,2,1,3,2,1,0,4,0,0,2,0,1,0,1,0,0,0,0,3,1,2,0,1,2,1,2,1,0,1,1,1,3,1,1,0,0,2,2,0,0,2,1,4,1,5,1,1,0,0,0,0,0,2,1,1,0,0,2,0,3,0,0,2,1,2,1,1,1,1,2,1,1,0,2,1,0,1,0,1,0,1,0,1,2,1,1,1,2,0,3,2,4,0,0,0,0,3,3,1,3,0,3,1,0,3,0,2,1,1,2,2,2,2,1,0,1,0,0,1,3,0,0,2,1,1,2,2,1,1,2,0,0,0,2,0,0,2,0,0,0,1,0,0,0,1,1,1,0,0,2,2,1,2,2,0,2,3,2,1,1,2,0,0,4,0,0,1,1,0,0,1,1,1,2,0,1,1,1,1,0,0,3,0,3,1,2,1,0,2,0,0,0,1,0,0,0,0,0,2,1,0,2,0,4,1,0,1,3,1,0,0,0,2,0,0,1,0,1,0,0,0,3,0,1,0,1,1,1,1,1,2,2,0,3,0,0,2,0,1,0,2,0,2,2,1,2,2,1,0,1,2,3,2,0,1,2,0,3,1,1,3,2,1,1,1,0,0,2,2,0,0,1,0,0,3,1,2,1,1,1,0,3,1,0,1,0,0,2,1,1,0,0,1,0,2,1,0,1,3,2,2,0,1,1,1,1,2,1,0,1,0,0,0,1,0,0,2,1,1,2,1,0,0,1,1,1,1,1,1,2,0,3,1,1,1,0,0,1,0,2,4,1,0,2,2,0,1,0,0,1,2,2,0,2,2,0,2,0,1,1,1,3,3,2,1,1,1,0,2,2,1,0,2,0,3,2,2,3,4,3,1,2,3,0,1,1,1,1,2,1,0,2,1,1,0,1,1,1,0,0,2,1,0,2,0,1,3,1,2,0,2,1,1,1,0,3,0,0,3,0,0,0,1,1,1,2,1,0,0,2,2,2,0,0,1,1,1,0,3,1,1,0,2,1,3,1,1,0,2,2,1,0,1,0,1,1,2,1,2,0,1,1,0,1,1,0,1,2,1,1,1,0,0,0,1,0,1,1,2,2,2,1,2,0,1,1,0,0,2,0,1,0,2,2,2,1,1,2,0,0,0,0,2,3,2,1,3,0,0,1,1,1,0,0,0,0,1,1,1,0,2,4,1,0,0,1,0,0,2,0,1,2,0,1,1,0,1,0,1,1,0,0,0,1,1,4,3,1,1,2,3,0,4,2,0,0,2,0,0,1,1,3,0,3,2,1,2,0,2,3,1,1,0,0,1,0,1,2,1,2,1,1,0,0,2,1,0,1,2,2,1,3,2,0,0,0,3,0,1,1,0,0,0,0,2,0,2,0,0,1,0,1,2,0,0,3,3,0,2,2,1,1,1,0,3,0,2,2,3,2,0,0,2,2,1,1,0,1,1,2,1,0,1,1,1,0,2,0,1,2,3,2,1,0,0,0,0,1,0,0,0,0,0,0,0,2,2,2,1,2,3,0,1,1,3,1,1,1,1,2,1,2,0,0,2,0,0,1,0,0,1,1,1,1,1,0,3,0,0,0,0,2,2,0,0,1,0,0,0,4,0,0,1,1,0,1,1,1,0,1,3,1,0,2,3,0,0,0,2,0,0,0,3,1,0,3,0,1,2,0,1,2,0,2,1,0,1,1,0,0,0,1,0,0,0,0,0,3,1,1,0,0,1,0,0,1,1,2,0,2,1,1,2,1,1,0,0,0,0,2,0,0,1,1,1,0,0,1,2,0,0,1,1,2,2,1,0,2,2,2,3,2,3,2,0,1,0,0,1,1,1,1,1,1,0,0,2,1,1,2,0,1,0,0,0,1,0,0,0,0,1,0,0,1,2,1,1,1,0,0,0,0,1,0,1,2,1,3,1,1,2,1,1,0,0,0,2,0,1,2,0,1,3,1,1,3,1,0,0,1,0,1,1,1,0,0,2,0,0,3,2,2,4,1,0,0,0,0,3,0,0,2,1,0,1,1,2,2,3,1,3,0,1,0,4,1,1,1,0,2,0,1,4,0,2,1,2,0,3,2,2,1,3,0,1,0,0,0,0,2,2,0,1,0,1,1,1,0,0,1,2,2,0,0,1,0,1,0,1,1,2,2,0,3,1,1,2,0,0,0,0,1,0,1,0,0,1,1,0,1,1,2,0,2,3,3,1,1,2,2,0,4,1,1,2,0,0,0,0,0,0,0,0,1,0,0,0,1,1,1,0,1,1,2,0,1,2,1,1,1,1,1,2,1,0,0,2,1,1,0,0,0,1,0,2,1,0,0,3,1,0,0,2,0,1,1,0,0,3,1,1,2,3,2,0,2,1,1,4,1,0,2,1,3,2,1,1,1,0,2,0,1,0,1,2,1,0,0,0,1,1,0,0,2,2,1,0,1,2,1,2,0,1,2,0,2,1,0,1,5,1,0,3,1,5,0,1,0,3,1,0,1,1,1,0,2,0,1,0,2,0,1,1,0,0,1,0,0,1,0,2,3,1,2,1,1,1,1,0,1,1,0,0,1,0,2,2,1,1,2,1,1,1,0,2,2,0,1,1,0,2,2,2,2,2,0,0,1,1,1,1,0,0,0,3,0,2,0,1,2,0,0,0,0,3,1,3,1,2,0,1,0,3,1,1,2,1,1,2,0,1,2,1,0,0,0,3,0,0,5,0,3,1,2,0,1,0,0,0,0,4,0,0,1,1,1,2,0,1,0,2,2,1,2,0,1,0,0,1,2,2,1,1,3,0,1,1,1,1,1,3,1,1,0,1,2,0,2,2,2,2,1,2,0,1,1,1,2,0,2,1,0,1,1,0,0,2,4,1,2,2,1,1,3,1,1,1,1,1,0,1,2,1,1,0,2,3,1,0,1,1,2,0,0,0,2,3,1,0,1,0,3,0,2,2,0,0,0,1,3,1,0,3,1,1,1,0,1,0,1,1,2,3,1,0,1,0,2,1,2,1,3,0,1,1,0,0,0,0,2,2,0,1,1,0,1,1,0,0,0,1,1,0,2,0,1,2,1,0,0,1,0,0,1,1,2,2,0,0,1,1,3,0,0,1,0,2,2,1,0,1,0,0,1,3,1,0,4,4,1,2,1,0,0,0,1,1,0,1,2,1,2,0,0,2,1,0,0,2,3,1,2,0,0,0,1,0,1,0,0,1,1,1,0,1,0,1,1,0,1,1,0,1,4,0,0,0,1,2]},{"counters":[0,0,1,0,0,0,1,0,1,0,3,1,2,0,1,2,0,1,1,1,0,0,1,0,0,2,0,1,1,3,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,1,3,1,0,1,3,2,0,3,1,0,1,1,1,0,0,1,1,0,1,0,0,1,1,1,0,3,0,1,1,1,0,1,1,1,1,3,1,0,0,1,2,1,0,1,0,1,0,2,1,1,0,0,1,2,1,1,2,4,0,1,3,1,3,1,0,2,0,1,3,2,1,0,2,2,2,2,0,3,2,2,3,1,1,0,1,1,0,0,1,0,1,0,2,2,1,0,0,0,2,1,0,0,0,0,0,2,2,1,1,0,0,2,0,1,0,0,0,0,1,0,1,0,0,1,1,1,0,0,1,1,2,0,0,0,0,0,2,1,2,2,0,1,1,1,1,1,0,1,3,1,1,1,1,0,1,0,1,0,1,1,1,1,0,0,0,0,1,1,0,0,3,1,0,3,0,2,1,0,2,2,1,1,2,1,0,0,1,0,0,1,1,1,0,2,0,2,2,2,0,0,2,2,0,1,3,0,0,2,1,2,2,1,1,0,1,1,0,0,0,1,0,1,1,0,0,3,1,2,0,1,1,1,3,0,2,2,2,1,0,4,1,1,0,1,0,0,3,2,2,1,3,1,2,1,1,2,1,2,0,0,0,1,0,1,0,1,1,0,1,0,1,0,0,1,1,0,0,0,1,1,1,1,2,2,0,1,0,0,1,1,0,2,4,2,0,1,0,0,2,3,1,0,0,1,0,3,4,2,0,3,1,0,1,1,1,1,0,0,0,1,2,0,1,1,1,3,1,1,0,1,0,1,3,1,0,1,1,0,1,0,0,2,3,0,1,1,1,1,1,5,0,0,0,0,3,2,0,1,0,0,3,2,0,2,1,0,0,2,0,3,3,2,3,0,0,2,0,0,2,1,2,0,0,2,3,2,3,1,1,1,0,0,1,0,2,2,1,1,0,1,3,2,1,1,3,3,0,1,2,1,3,1,1,1,1,2,2,0,2,1,1,0,1,1,0,1,1,1,1,0,0,1,3,1,2,0,1,1,1,0,1,1,0,0,0,1,1,1,0,2,2,3,3,0,2,2,0,2,0,0,1,1,1,0,1,0,1,0,1,0,1,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,2,0,0,0,1,1,1,1,0,1,1,1,2,0,1,0,3,0,1,1,0,0,0,1,3,2,1,1,1,0,1,0,1,0,1,0,1,0,1,1,2,4,2,1,1,1,1,1,0,0,1,0,0,1,0,2,1,1,0,2,0,0,0,0,4,0,1,1,3,1,0,0,0,0,1,1,1,0,1,3,0,2,1,3,1,0,2,2,0,2,1,1,0,1,1,0,1,2,1,1,0,1,0,0,1,2,1,2,2,2,0,1,1,1,0,1,1,0,0,0,0,0,1,2,1,0,1,1,0,0,0,2,1,1,0,2,1,1,0,0,2,0,1,0,0,0,0,0,1,1,1,0,1,0,0,2,0,0,1,0,5,2,0,0,1,2,1,3,0,1,1,2,1,0,0,1,2,1,1,0,0,0,0,1,1,1,0,1,0,3,2,0,0,0,1,1,0,0,0,0,0,2,1,0,1,0,4,4,3,2,0,1,0,3,1,1,2,1,0,0,0,0,0,1,1,2,4,0,1,1,2,1,2,1,0,1,1,0,0,1,2,0,1,0,1,0,0,1,2,2,0,1,2,0,1,1,3,3,2,1,1,1,0,0,2,0,0,1,0,0,1,2,2,1,1,0,1,0,0,0,2,2,1,0,0,0,0,1,0,1,0,0,0,1,2,0,3,1,2,0,0,0,1,2,1,2,1,1,1,0,0,1,1,1,0,0,1,0,0,2,2,0,2,0,0,1,0,0,0,2,0,0,0,1,2,1,1,2,1,1,1,1,2,1,0,2,1,0,2,0,0,1,2,2,1,3,0,0,1,0,0,0,0,3,2,1,0,2,1,2,0,0,1,2,0,1,2,0,2,0,1,1,0,1,4,0,2,2,2,0,0,1,0,0,2,2,2,2,0,1,1,2,1,1,0,2,2,1,0,2,0,1,3,1,1,0,3,1,0,2,0,2,2,0,0,0,1,0,4,0,0,0,2,0,0,3,2,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,0,0,1,0,1,2,0,1,0,2,0,3,1,0,0,1,0,0,0,0,1,1,1,3,0,0,2,1,2,0,1,1,0,1,0,2,0,0,1,1,4,1,0,1,0,1,2,3,1,0,0,0,1,1,3,2,0,0,1,1,1,1,0,2,1,5,1,1,3,0,1,0,0,1,0,1,0,0,1,0,2,0,0,1,1,1,2,4,4,1,1,0,0,1,0,1,0,0,1,2,2,0,0,1,0,2,3,0,2,1,0,0,1,2,4,0,2,1,2,2,1,1,2,0,0,0,0,0,2,0,0,0,1,0,2,3,1,0,2,1,0,0,0,1,0,1,2,0,0,0,0,0,2,0,1,0,0,1,0,0,1,1,0,0,1,2,1,1,1,0,0,2,0,1,0,1,0,0,1,2,1,0,1,1,1,2,1,1,2,1,2,0,2,1,1,1,0,1,0,1,1,1,1,0,0,2,0,2,1,2,1,2,1,5,1,0,1,1,1,1,0,2,0,1,2,1,0,3,1,0,1,1,0,3,0,2,1,2,1,3,2,0,0,0,0,2,0,0,1,1,0,0,1,1,3,0,1,0,1,1,0,0,2,0,2,1,0,1,0,1,0,0,3,0,2,3,0,1,0,0,1,0,2,2,1,2,1,4,0,1,2,0,1,1,2,2,1,0,1,2,1,2,1,0,1,1,2,0,1,1,1,2,1,0,1,2,0,1,2,1,0,1,0,1,0,0,3,2,2,1,1,1,2,1,1,2,1,0,2,3,0,0,0,4,1,1,0,1,2,0,2,1,1,1,0,0,0,0,1,2,0,1,1,1,0,1,1,1,2,1,0,1,1,0,2,1,1,2,2,1,4,0,3,1,1,2,0,0,1,1,2,1,0,0,1,0,1,2,2,2,0,0,1,1,0,1,1,0,0,1,1,2,0,1,0,0,0,1,1,0,1,3,0,1,1,2,3,1,1,3,1,5,0,2,0,2,0,2,1,1,0,2,1,3,0,0,0,3,1,0,1,2,2,0,0,1,3,1,2,5,1,2,0,1,0,0,2,1,0,1,1,0,0,3,0,1,3,0,0,0,1,0,1,1,3,1,1,0,2,1,1,2,2,3,1,3,0,0,1,0,3,2,2,2,1,0,1,2,0,2,0,0,0,1,0,1,0,1,1,0,0,1,1,3,1,4,2,0,1,1,0,2,1,1,1,1,2,2,2,0,0,0,2,1,0,1,0,2,0,0,1,1,1,3,1,1,0,0,0,1,1,0,1,2,3,2,2,3,1,1,1,1,2,2,0,0,1,0,0,1,1,2,0,1,5,3,2,2,0,0,1,1,1,3,2,1,4,1,1,1,0,1,1,1,1,3,1,1,3,1,2,1,0,0,3,3,0,1,3,1,0,1,1,2,1,1,1,2,0,2,2,3,0,1,0,2,1,0,0,4,0,0,0,0,3,1,2,1,2,0,1,1,1,2,0,2,2,0,3,1,0,2,1,1,2,1,1,0,1,2,1,1,2,1,0,0,2,1,1,1,0,1,0,1,1,0,0,3,1,1,1,1,2,3,0,0,0,1,2,0,3,1,0,1,0,3,1,0,0,0,0,0,1,1,1,1,0,0,0,2,1,4,1,0,2,0,4,0,1,2,2,0,1,1,1,2,3,0,0,2,1,1,1,0,1,1,0,2,1,2,2,1,0,1,0,3,0,0,2,0,0,2,2,2,3,3,2,2,0,1,0,0,1,1,0,2,0,1,4,1,1,1,1,0,2,0,3,1,0,3,2,0,0,3,0,2,0,2,1,0,1,0,2,0,2,0,2,0,0,0,0,2,1,0,1,2,0,2,1,1,0,1,0,1,5,1,1,4,2,0,1,0,1,0,1,1,2,1,2,3,1,2,1,2,0,0,1,0,0,4,0,1,2,0,0,2,0,0,0,0,0,1,1,1,0,2,0,1,1,3,0,0,1,3,1,0,0,1,0,1,2,0,1,1,1,0,0,1,0,0,1,0,1,0,0,1,1,0,0,1,2,1,1,1,2,1,1,1,0,1,1,0,0,2,1,1,3,0,0,0,4,1,0,1,1,1,0,2,0,2,0,1,1,1,1,1,1,0,0,2,5,1,1,2,3,1,1,1,0,1,3,1,1,1,0,3,2,1,0,1,1,1,1,2,0,1,0,2,0,1,1,0,0,0,0,0,1,0,1,2,0,0,1,1,0,1,0,0,1,1,1,4,1,1,2,3,3,1,3,0,0,2,0,0,3,1,2,0,0,1,1,1,1,1,3,1,0,0,2,0,1,0,0,0,1,4,0,0,3,4,1,1,1,1,2,1,1,2,1,1,1,0,2,0,1,0,0,1,2,1,2,1,1,1,2,3,0,0,1,1,0,2]},{"counters":[0,1,1,0,1,0,1,1,1,0,1,1,1,3,0,1,0,1,3,1,0,3,0,1,0,0,1,1,3,1,0,0,1,0,0,0,1,0,0,4,2,1,2,0,2,1,1,1,2,0,1,0,1,0,2,2,0,1,0,1,1,0,1,1,0,0,1,1,0,1,1,0,1,0,2,1,2,3,1,0,0,1,1,0,3,0,2,0,2,2,1,1,0,1,2,2,1,2,1,1,3,0,1,0,1,0,1,1,1,0,0,1,2,1,1,1,2,1,1,1,1,0,0,1,0,0,2,0,1,0,0,1,1,0,1,0,1,2,1,1,2,0,0,0,1,0,4,0,1,1,1,0,0,1,3,1,0,2,1,0,2,0,2,0,1,0,0,1,1,3,1,1,0,3,0,2,0,1,1,0,0,0,1,1,1,1,1,2,0,1,1,2,1,1,1,1,1,0,1,3,1,0,0,1,0,0,1,0,2,1,1,3,1,1,0,0,0,1,1,2,0,1,0,2,1,1,3,0,0,0,2,2,0,2,0,1,1,3,0,0,3,0,0,4,0,1,2,3,0,0,2,2,0,2,0,1,1,2,1,0,2,0,0,3,1,3,0,0,0,1,1,4,0,0,1,0,0,1,0,2,0,2,1,2,3,5,1,1,0,2,0,6,0,1,0,0,2,1,1,3,0,1,0,1,3,2,0,2,0,0,1,0,1,0,0,2,1,0,2,0,0,5,2,2,1,1,0,0,0,0,1,1,1,0,1,0,1,1,2,1,0,3,1,1,0,0,1,1,2,1,0,1,0,0,0,3,1,1,1,2,1,3,1,1,0,0,3,0,1,0,1,0,1,1,0,0,1,3,1,0,2,0,2,1,1,0,2,3,1,0,2,1,2,1,2,1,2,2,1,3,1,3,2,1,1,0,1,1,1,0,0,1,1,1,1,2,0,0,0,1,2,2,0,0,2,2,2,0,2,0,1,1,1,2,0,1,1,1,1,1,2,3,2,1,1,1,2,1,0,1,0,0,1,0,1,0,1,0,0,0,0,1,1,3,1,0,0,1,0,1,0,2,0,0,1,2,0,1,3,1,1,0,1,0,0,0,1,1,2,2,3,0,0,0,0,1,1,4,0,1,0,1,0,0,1,2,0,0,1,3,2,1,2,0,0,1,0,2,3,3,0,1,0,0,1,1,0,1,1,0,1,2,0,0,1,0,2,0,0,1,0,1,0,1,1,0,2,2,1,0,2,1,3,4,0,1,2,1,0,0,0,0,1,2,2,1,0,1,1,3,0,1,0,1,0,1,0,0,0,1,4,2,0,1,3,1,1,1,1,2,0,2,0,1,1,1,0,1,0,1,0,2,0,0,1,0,1,1,0,2,0,0,1,3,1,2,1,0,1,1,0,1,0,1,1,0,1,1,2,1,2,1,1,1,1,1,1,1,0,1,2,2,2,2,0,2,2,0,2,4,2,1,1,1,0,2,0,0,0,0,2,0,0,2,0,0,0,1,2,3,1,0,1,1,1,1,2,2,1,2,2,0,0,0,1,3,2,2,0,1,1,0,1,1,1,1,0,0,0,0,1,5,2,0,1,1,0,0,2,0,0,1,4,1,1,3,1,2,3,1,1,1,0,0,1,0,1,2,3,3,2,0,1,1,2,1,0,0,1,4,1,0,1,2,0,2,2,3,1,0,1,0,1,0,2,1,0,3,0,1,0,1,1,0,2,2,0,2,0,2,1,2,2,2,0,0,1,1,0,0,1,0,2,2,1,0,1,0,1,0,3,1,3,4,1,1,0,0,0,1,1,1,0,1,0,1,2,6,1,2,1,1,1,0,0,0,2,0,2,0,0,1,0,2,2,0,0,0,1,1,0,2,1,1,0,0,1,0,1,0,1,2,0,1,0,1,0,0,3,0,1,2,0,3,1,1,2,1,1,0,1,1,2,0,1,1,1,2,0,3,3,1,1,2,0,1,2,0,2,1,1,0,0,0,0,1,1,1,1,0,0,0,4,1,1,4,0,3,1,1,1,1,0,0,0,3,2,0,0,0,2,0,1,1,3,2,1,3,2,1,0,1,0,2,0,1,2,0,1,1,1,1,2,3,2,0,3,1,1,3,1,1,2,3,1,2,1,2,0,1,0,1,0,2,1,1,2,1,1,1,3,0,2,1,1,1,0,1,1,0,0,1,0,0,0,1,1,2,0,2,0,1,0,2,0,1,1,1,1,0,1,0,1,1,0,3,0,0,1,0,0,0,2,1,0,1,1,2,1,1,0,0,1,0,0,0,0,1,1,0,0,3,0,0,0,0,1,2,0,0,2,1,1,1,1,1,1,0,1,1,0,0,1,1,1,1,0,1,1,0,1,0,1,0,1,2,1,1,1,0,3,1,1,2,0,0,1,1,1,0,2,2,0,0,0,0,0,1,2,2,1,2,2,3,0,1,1,2,0,0,0,0,1,1,0,1,0,0,2,2,0,0,0,0,1,1,1,2,1,0,0,1,1,2,1,0,0,1,2,1,1,1,3,0,0,1,1,2,1,0,1,0,0,1,0,1,0,3,1,0,1,0,0,0,0,0,1,3,4,1,1,1,0,2,0,1,0,0,1,0,1,0,0,1,1,1,2,1,1,0,1,1,0,1,2,0,1,1,0,1,1,0,0,1,0,1,0,0,2,0,2,0,2,2,1,3,0,0,1,2,3,1,1,1,0,2,1,1,0,2,2,1,1,1,1,1,1,0,1,1,0,2,2,0,2,0,0,2,0,1,0,1,2,0,0,0,1,1,0,1,1,0,0,0,2,1,2,0,0,2,0,0,1,1,2,1,1,0,0,0,0,0,3,2,1,0,1,1,1,1,0,1,2,0,0,1,0,1,0,0,1,2,2,0,1,2,2,1,1,2,1,0,2,0,0,0,0,1,0,1,2,3,0,1,0,2,1,1,1,2,0,1,2,3,2,0,2,2,0,0,0,1,2,0,0,2,0,1,4,1,0,1,0,0,1,1,1,0,0,0,2,3,1,0,2,1,1,2,0,0,2,1,1,0,0,1,1,2,0,0,2,1,1,1,3,2,1,0,0,1,2,4,1,0,3,1,2,1,1,0,2,0,1,1,0,0,0,0,1,2,1,1,0,1,2,1,0,1,0,2,1,1,1,1,2,0,2,1,0,0,0,2,1,2,1,1,1,0,5,0,2,0,0,2,1,0,1,1,1,2,2,1,2,0,2,2,1,2,1,0,1,2,0,2,1,0,0,0,2,1,0,0,0,0,0,0,0,1,1,1,2,2,3,0,2,0,1,1,1,2,1,0,0,2,3,0,1,0,3,0,0,0,0,1,0,1,1,0,3,0,2,0,1,0,1,0,0,0,1,2,1,2,0,2,1,2,1,1,3,3,3,0,1,3,1,0,1,1,0,1,0,2,0,1,1,1,3,2,1,0,1,2,1,0,0,2,1,0,0,0,2,0,1,2,0,1,1,1,0,0,0,0,1,1,2,2,1,0,1,2,0,1,1,1,2,0,1,2,2,2,1,1,2,1,1,0,0,0,2,4,1,1,1,0,1,2,1,1,0,1,0,2,0,0,2,1,2,0,2,0,1,2,2,2,5,0,0,1,0,0,1,2,1,2,1,0,0,1,0,0,0,1,0,0,1,0,0,1,0,1,1,2,1,0,3,1,1,1,1,2,0,1,1,0,0,0,1,0,0,1,2,1,0,0,3,0,2,2,1,2,0,0,0,2,0,1,0,0,0,2,1,1,3,0,2,1,2,1,1,2,0,0,2,2,2,1,1,0,1,3,0,1,0,0,1,1,0,1,0,1,1,1,0,1,1,0,1,1,0,0,0,3,0,0,2,0,1,3,2,0,0,0,1,2,0,0,1,1,0,1,1,1,1,2,0,0,0,2,0,1,1,0,3,3,1,2,1,0,2,1,0,0,2,0,0,3,0,1,0,1,0,1,1,0,3,1,0,3,1,1,0,0,3,1,4,1,0,0,1,1,2,2,0,2,0,3,0,0,1,2,0,1,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,1,0,1,2,1,1,1,1,0,1,1,1,2,1,0,1,0,1,1,1,1,1,0,1,1,1,0,1,1,0,1,0,2,2,1,0,1,2,2,2,1,1,0,0,2,0,0,0,1,1,4,2,0,0,1,1,0,1,1,2,0,2,2,0,1,2,0,0,1,0,0,0,1,3,1,0,2,0,3,2,2,0,1,1,0,1,0,1,3,1,1,1,1,0,1,0,0,0,1,2,1,2,2,3,1,1,0,2,2,3,1,2,2,2,1,1,1,1,0,0,4,1,2,1,2,2,0,4,2,1,1,0,0,0,1,1,0,3,1,1,2,2,1,0,1,1,0,2,0,0,1,1,0,0,1,1,1,2,3,2,0,1,1,0,1,1,2,0,0,2,3,3,1,1,0,2,0,0,0,2,0,2,0,0,2,1,2,3,1,3,0,2,3,1,3,1,1,1,1,1,1,0,2,2,0,3,4,1,2,1,0,3,2,1,1,0,0,3,0,0,0,2,3,3,2,1,0,0,0,2,0,0,0,0,0,1,4,2,3,3,1]}]},"null_count":0,"last_update_version":397952050429689856}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_complex_stats_tbl_009.json b/cmd/explaintest/s/explain_complex_stats_tbl_009.json deleted file mode 100644 index d5d5668db8b4f..0000000000000 --- a/cmd/explaintest/s/explain_complex_stats_tbl_009.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl_009","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDM1Mzg1Mzg=","upper_bound":"LTIxMjQ5NDU5OTM=","repeats":1},{"count":16,"lower_bound":"LTIxMTU0NDkyNzk=","upper_bound":"LTIxMDUyNDAwMzg=","repeats":1},{"count":24,"lower_bound":"LTIxMDE0NDE5MDA=","upper_bound":"LTIwOTA0OTY0MjA=","repeats":1},{"count":32,"lower_bound":"LTIwODYwODI5NzY=","upper_bound":"LTIwNjg5NTMyNTg=","repeats":1},{"count":40,"lower_bound":"LTIwNjcxMjU1MTg=","upper_bound":"LTIwNjEyMzIyODU=","repeats":1},{"count":48,"lower_bound":"LTIwNTEzNTAyOTE=","upper_bound":"LTIwMjMwNzA5MDI=","repeats":1},{"count":56,"lower_bound":"LTIwMTYwNTk1NzY=","upper_bound":"LTIwMDAxODU2ODQ=","repeats":1},{"count":64,"lower_bound":"LTE5OTc5NjYzNDI=","upper_bound":"LTE5NjQ1NjY4NDU=","repeats":1},{"count":72,"lower_bound":"LTE5NjA0Mjc4Nzc=","upper_bound":"LTE5NDk3OTMwODY=","repeats":1},{"count":80,"lower_bound":"LTE5NDgzODU1Mzg=","upper_bound":"LTE5Mzc1Nzc1MTc=","repeats":1},{"count":88,"lower_bound":"LTE5MzE2NzAzMzA=","upper_bound":"LTE5MjA0NTc5MDY=","repeats":1},{"count":96,"lower_bound":"LTE5MTg1MDYxMjc=","upper_bound":"LTE5MTMyMjA4NDA=","repeats":1},{"count":104,"lower_bound":"LTE5MDkwNTgwNTQ=","upper_bound":"LTE4OTczOTExMTg=","repeats":1},{"count":112,"lower_bound":"LTE4ODYzNzM2MDU=","upper_bound":"LTE4NjA0NzE0NjA=","repeats":1},{"count":120,"lower_bound":"LTE4NTcyNTk4NzA=","upper_bound":"LTE4MzkyMDExOTE=","repeats":1},{"count":128,"lower_bound":"LTE4MzUxNjc1NzU=","upper_bound":"LTE4MjY3MTQyODc=","repeats":1},{"count":136,"lower_bound":"LTE4MjI5NDAyNjg=","upper_bound":"LTE4MDg1MDMyNjU=","repeats":1},{"count":144,"lower_bound":"LTE3OTU2MTQyMjc=","upper_bound":"LTE3ODA2NjA0NTY=","repeats":1},{"count":152,"lower_bound":"LTE3ODAyOTA4NTQ=","upper_bound":"LTE3NzMxOTU5MTQ=","repeats":1},{"count":160,"lower_bound":"LTE3Njc1OTE1NTE=","upper_bound":"LTE3NTIxMDczOTc=","repeats":1},{"count":168,"lower_bound":"LTE3NTA1NDE2MjQ=","upper_bound":"LTE3MzU1NjAyMzY=","repeats":1},{"count":176,"lower_bound":"LTE3MzIwMjgyOTA=","upper_bound":"LTE3MjE0OTk4NTA=","repeats":1},{"count":184,"lower_bound":"LTE3MjA2MzY0NTI=","upper_bound":"LTE3MTI5ODkwOTU=","repeats":1},{"count":192,"lower_bound":"LTE3MDQ4Mjc5ODE=","upper_bound":"LTE2OTgzNDI0Mjg=","repeats":1},{"count":200,"lower_bound":"LTE2OTczNzQzMjg=","upper_bound":"LTE2OTQ4MDM0OTA=","repeats":1},{"count":208,"lower_bound":"LTE2Njc0NjgwNDU=","upper_bound":"LTE2NTM0NTQ5MDI=","repeats":1},{"count":216,"lower_bound":"LTE2NDc0MTE1MjQ=","upper_bound":"LTE2MzIzOTU5NzY=","repeats":1},{"count":224,"lower_bound":"LTE2MjQ0NzU2NTY=","upper_bound":"LTE2MDE3ODI3MjY=","repeats":1},{"count":232,"lower_bound":"LTE1OTgwMDQ4ODc=","upper_bound":"LTE1ODM5Njk5NTY=","repeats":1},{"count":240,"lower_bound":"LTE1NzkyNDk0NDc=","upper_bound":"LTE1NzQ4MDU4OTk=","repeats":1},{"count":248,"lower_bound":"LTE1NzQ0NDE3NzY=","upper_bound":"LTE1NTQ2MzI0NDE=","repeats":1},{"count":256,"lower_bound":"LTE1NDgxNzA1NTU=","upper_bound":"LTE1MjUwNDEyNjc=","repeats":1},{"count":264,"lower_bound":"LTE1MTU5NDEwODk=","upper_bound":"LTE0OTY3Mjg1NzM=","repeats":1},{"count":272,"lower_bound":"LTE0OTYzNjI2MDQ=","upper_bound":"LTE0ODcyMDAzNjQ=","repeats":1},{"count":280,"lower_bound":"LTE0ODMwOTE0NTg=","upper_bound":"LTE0NzgwNTI4Mjk=","repeats":1},{"count":288,"lower_bound":"LTE0NzY5Mjk5MTc=","upper_bound":"LTE0NzA3NDA5MjQ=","repeats":1},{"count":296,"lower_bound":"LTE0NjY1MDUzMzc=","upper_bound":"LTE0NjAyMDc3Mjg=","repeats":1},{"count":304,"lower_bound":"LTE0NTU3MDg2OTc=","upper_bound":"LTE0NDEwNDc1NzA=","repeats":1},{"count":312,"lower_bound":"LTE0MzgwNzA2NDg=","upper_bound":"LTE0MjU0NDQ3NDM=","repeats":1},{"count":320,"lower_bound":"LTE0MTkxMDY4Njc=","upper_bound":"LTE0MTEzODAyMjQ=","repeats":1},{"count":328,"lower_bound":"LTE0MDk3Nzk4OTg=","upper_bound":"LTEzOTcwMDc4MDc=","repeats":1},{"count":336,"lower_bound":"LTEzOTUyNTM1OTM=","upper_bound":"LTEzOTA5MDI4NDA=","repeats":1},{"count":344,"lower_bound":"LTEzOTAxNjgwMjA=","upper_bound":"LTEzODI0MzgyNTc=","repeats":1},{"count":352,"lower_bound":"LTEzODEwOTY4OTE=","upper_bound":"LTEzNjAzNDYzOTI=","repeats":1},{"count":360,"lower_bound":"LTEzNDQwOTYyMjc=","upper_bound":"LTEzMzc3NTM0MjA=","repeats":1},{"count":368,"lower_bound":"LTEzMzU1MDQ5NTY=","upper_bound":"LTEzMTY2NTA5OTY=","repeats":1},{"count":376,"lower_bound":"LTEzMTIwNzEwNjU=","upper_bound":"LTEyOTc0NjA2MTk=","repeats":1},{"count":384,"lower_bound":"LTEyOTMwNjk4NjE=","upper_bound":"LTEyOTEwMjEyMTg=","repeats":1},{"count":392,"lower_bound":"LTEyODkxOTkwMTc=","upper_bound":"LTEyNTcwMjAwNDc=","repeats":1},{"count":400,"lower_bound":"LTEyNDY4MzUxODY=","upper_bound":"LTEyMzgxMDMwNjA=","repeats":1},{"count":408,"lower_bound":"LTEyMzU1MTI5NjM=","upper_bound":"LTEyMTQwMDE3NDE=","repeats":1},{"count":416,"lower_bound":"LTEyMTA1MjQ3OTE=","upper_bound":"LTExNzE2NzEwMzg=","repeats":1},{"count":424,"lower_bound":"LTExNzAxNDQ0OTg=","upper_bound":"LTExNjA3ODc0MjM=","repeats":1},{"count":432,"lower_bound":"LTExNTg2NDM3MDQ=","upper_bound":"LTExMzc3MTY3MDM=","repeats":1},{"count":440,"lower_bound":"LTExMzU5OTUxNjY=","upper_bound":"LTExMjkxNzgzMDg=","repeats":1},{"count":448,"lower_bound":"LTExMjY0MzMzNzQ=","upper_bound":"LTExMDE2MjExMTA=","repeats":1},{"count":456,"lower_bound":"LTExMDEzNzgzNDI=","upper_bound":"LTEwOTU1MDA1NjM=","repeats":1},{"count":464,"lower_bound":"LTEwODYwMDc4MTA=","upper_bound":"LTEwNjQ0ODc4NzM=","repeats":1},{"count":472,"lower_bound":"LTEwNjEzNDI2MTI=","upper_bound":"LTEwNTA2NTEwMTU=","repeats":1},{"count":480,"lower_bound":"LTEwNDc5OTIzNjc=","upper_bound":"LTEwNDE2OTk3MDE=","repeats":1},{"count":488,"lower_bound":"LTEwNDA3MDg1NTk=","upper_bound":"LTEwMjgyNjU5NDA=","repeats":1},{"count":496,"lower_bound":"LTEwMTQxMTQ1MzI=","upper_bound":"LTEwMDY0MTY3ODc=","repeats":1},{"count":504,"lower_bound":"LTEwMDA0NzE3ODU=","upper_bound":"LTk4MTg1NDg0NQ==","repeats":1},{"count":512,"lower_bound":"LTk3OTI5NTQxOQ==","upper_bound":"LTk2OTUzNTY2MA==","repeats":1},{"count":520,"lower_bound":"LTk2OTQ4MDM5OA==","upper_bound":"LTk1OTAyMzUwOQ==","repeats":1},{"count":528,"lower_bound":"LTk1NDA5NzI5Mg==","upper_bound":"LTk0ODc2MzgzNA==","repeats":1},{"count":536,"lower_bound":"LTk0NzMwMDg4Ng==","upper_bound":"LTkyMzM3MzI5NQ==","repeats":1},{"count":544,"lower_bound":"LTkyMjQ1Mzg5OA==","upper_bound":"LTkxMDY5MTgwNA==","repeats":1},{"count":552,"lower_bound":"LTkwOTc5NDM3Ng==","upper_bound":"LTg5NDg1NDQ4Mw==","repeats":1},{"count":560,"lower_bound":"LTg5MzI2NTMxNw==","upper_bound":"LTg4MjU2Nzc1MQ==","repeats":1},{"count":568,"lower_bound":"LTg4MTY4NDg0Nw==","upper_bound":"LTg3ODc1ODQ2Nw==","repeats":1},{"count":576,"lower_bound":"LTg3ODI2NjM1OQ==","upper_bound":"LTg2NjU5NTg4NA==","repeats":1},{"count":584,"lower_bound":"LTg2NTc0OTk0OQ==","upper_bound":"LTg1MTY0MjY5OQ==","repeats":1},{"count":592,"lower_bound":"LTg0NTY2MjMyNw==","upper_bound":"LTgzNzk0NzI5MA==","repeats":1},{"count":600,"lower_bound":"LTgzNjI5NDUzMQ==","upper_bound":"LTgyODI5OTA4NQ==","repeats":1},{"count":608,"lower_bound":"LTgyMjgxMzI0OA==","upper_bound":"LTgxNTA1MTU2NQ==","repeats":1},{"count":616,"lower_bound":"LTgxMzE5MzUwOA==","upper_bound":"LTc4OTYzMzMxNw==","repeats":1},{"count":624,"lower_bound":"LTc4OTI5MTA2MQ==","upper_bound":"LTc3ODYwNTY5Ng==","repeats":1},{"count":632,"lower_bound":"LTc3NTk3OTg5OQ==","upper_bound":"LTc2NTAwMTE4OQ==","repeats":1},{"count":640,"lower_bound":"LTc2NDA0MTczOA==","upper_bound":"LTc1MjI5OTIzMw==","repeats":1},{"count":648,"lower_bound":"LTc1MTU2Nzc1Ng==","upper_bound":"LTc0NTI0ODM4OA==","repeats":1},{"count":656,"lower_bound":"LTczMDAyODY1NA==","upper_bound":"LTcxMjM4MjQwOA==","repeats":1},{"count":664,"lower_bound":"LTcwNzYwNjk5Mg==","upper_bound":"LTY5NzY0NTI0Nw==","repeats":1},{"count":672,"lower_bound":"LTY5MjIzNDAxNg==","upper_bound":"LTY4MzMwNDY2Nw==","repeats":1},{"count":680,"lower_bound":"LTY4Mjk1Njk4Nw==","upper_bound":"LTY2NTYxNjUzNg==","repeats":1},{"count":688,"lower_bound":"LTY1OTc0OTE5OQ==","upper_bound":"LTYzODUzODIzMA==","repeats":1},{"count":696,"lower_bound":"LTYzMjk5ODQzMA==","upper_bound":"LTYxNzY0NzI1OQ==","repeats":1},{"count":704,"lower_bound":"LTYxNDk2MTc0NQ==","upper_bound":"LTU5ODM5MjQ1Mw==","repeats":1},{"count":712,"lower_bound":"LTU5NDAzMDAxMA==","upper_bound":"LTU3MTM5MTk0Mg==","repeats":1},{"count":720,"lower_bound":"LTU2ODkxODIwNw==","upper_bound":"LTU2MjA4MTQ4NQ==","repeats":1},{"count":728,"lower_bound":"LTU2MTcxOTI4MQ==","upper_bound":"LTU1Nzk5MzU5MA==","repeats":1},{"count":736,"lower_bound":"LTU1NTU1OTU0OQ==","upper_bound":"LTU0OTMzMDE1Mw==","repeats":1},{"count":744,"lower_bound":"LTU0ODI5NDc2Mg==","upper_bound":"LTUzMTQzMjUxNw==","repeats":1},{"count":752,"lower_bound":"LTUzMDQ4MjkwMw==","upper_bound":"LTUxODIwODUxMA==","repeats":1},{"count":760,"lower_bound":"LTUxMDkzMDc5MA==","upper_bound":"LTQ5MzU5NzQ0Mg==","repeats":1},{"count":768,"lower_bound":"LTQ5MjQ5Mjg2Mg==","upper_bound":"LTQ4MjIwODA4MQ==","repeats":1},{"count":776,"lower_bound":"LTQ3Njc1MzQwMw==","upper_bound":"LTQ2MzczMzkzMA==","repeats":1},{"count":784,"lower_bound":"LTQ2MzIxNzcwNA==","upper_bound":"LTQ1ODUxNDkwNA==","repeats":1},{"count":792,"lower_bound":"LTQ1NTU5Mzk4NA==","upper_bound":"LTQ0NjEwMzYyMQ==","repeats":1},{"count":800,"lower_bound":"LTQ0MDQzNDc1Mg==","upper_bound":"LTQzMjE3MjE1MA==","repeats":1},{"count":808,"lower_bound":"LTQxNTAyNzI2NQ==","upper_bound":"LTM5NTI4ODE2Mg==","repeats":1},{"count":816,"lower_bound":"LTM5MjI4ODc4MA==","upper_bound":"LTM3ODg4NDM4OQ==","repeats":1},{"count":824,"lower_bound":"LTM3NDQ3MDUxOQ==","upper_bound":"LTM1NDcwMzA3Mg==","repeats":1},{"count":832,"lower_bound":"LTM1MDM0NDEyNQ==","upper_bound":"LTM0MjMyNTcxNA==","repeats":1},{"count":840,"lower_bound":"LTM0MjMyMDk2Ng==","upper_bound":"LTMyNTA2MjM2Ng==","repeats":1},{"count":848,"lower_bound":"LTMxOTE5NTg4Mw==","upper_bound":"LTMwNzI2NjAyNA==","repeats":1},{"count":856,"lower_bound":"LTMwNjM1MzY3Ng==","upper_bound":"LTI4Mzc3MzQ2MQ==","repeats":1},{"count":864,"lower_bound":"LTI3Njk0ODQyMg==","upper_bound":"LTI1OTU0MzcyNg==","repeats":1},{"count":872,"lower_bound":"LTI1NzMxMjQ1Mg==","upper_bound":"LTI1Mzg0NTQ2MQ==","repeats":1},{"count":880,"lower_bound":"LTI1MTU2OTI3MA==","upper_bound":"LTI0NjUyNDQ4NA==","repeats":1},{"count":888,"lower_bound":"LTI0NTk4NjA3Mg==","upper_bound":"LTIwNzg4MDcyMA==","repeats":1},{"count":896,"lower_bound":"LTIwMzk2MjY3NQ==","upper_bound":"LTE5MzA5MjkyOA==","repeats":1},{"count":904,"lower_bound":"LTE3NzMyNDI0NA==","upper_bound":"LTE2ODc0NzM5MA==","repeats":1},{"count":912,"lower_bound":"LTE1ODA3ODAzOQ==","upper_bound":"LTEzNjA2MTY5Mg==","repeats":1},{"count":920,"lower_bound":"LTEzNDcxMDU4Ng==","upper_bound":"LTEyMTc4NTIyOQ==","repeats":1},{"count":928,"lower_bound":"LTEyMDAxOTAyMw==","upper_bound":"LTEwOTUyMzY5Nw==","repeats":1},{"count":936,"lower_bound":"LTEwOTE1MTQ0Mg==","upper_bound":"LTk5MzY4NjQ4","repeats":1},{"count":944,"lower_bound":"LTk5MTY2ODQz","upper_bound":"LTkxNjc4Nzcz","repeats":1},{"count":952,"lower_bound":"LTg2MjI4MTgy","upper_bound":"LTYyMzk3ODM4","repeats":1},{"count":960,"lower_bound":"LTU3NTA3Njgw","upper_bound":"LTQ5NTkxNDEz","repeats":1},{"count":968,"lower_bound":"LTI3Njg1NjQ2","upper_bound":"LTE3ODkzMzk3","repeats":1},{"count":976,"lower_bound":"LTI3Mjc5MzQ=","upper_bound":"MjYxMjU0NzU=","repeats":1},{"count":984,"lower_bound":"MzA1MTE2MDc=","upper_bound":"MzkwNzA4NTA=","repeats":1},{"count":992,"lower_bound":"NDI2MDE4MjY=","upper_bound":"NjgzMzA3MjA=","repeats":1},{"count":1000,"lower_bound":"NjkxMjkxMDc=","upper_bound":"NzYzNDMyNTI=","repeats":1},{"count":1008,"lower_bound":"OTExOTQ3ODI=","upper_bound":"MTEwOTM2Mzc2","repeats":1},{"count":1016,"lower_bound":"MTEzMjg3OTM1","upper_bound":"MTIzNDg4OTQ2","repeats":1},{"count":1024,"lower_bound":"MTUzMzE3NjAz","upper_bound":"MTYxMjAzNzYw","repeats":1},{"count":1032,"lower_bound":"MTYyNDU1MDU5","upper_bound":"MTc5ODY5NTMw","repeats":1},{"count":1040,"lower_bound":"MTkzMTcyMzIx","upper_bound":"MTk1MzA0MzY5","repeats":1},{"count":1048,"lower_bound":"MTk5MzU4ODk2","upper_bound":"MjEwMzM2OTYw","repeats":1},{"count":1056,"lower_bound":"MjIwNjkzMTg4","upper_bound":"MjI2OTQ0ODM2","repeats":1},{"count":1064,"lower_bound":"MjI3MTAxNTYy","upper_bound":"MjM2MTA4OTYw","repeats":1},{"count":1072,"lower_bound":"MjM4Mzc1NzUy","upper_bound":"MjQ1Nzc5MDc4","repeats":1},{"count":1080,"lower_bound":"MjUyOTA3MDk4","upper_bound":"MjYyODMwNjc3","repeats":1},{"count":1088,"lower_bound":"MjY2MzMxMjYx","upper_bound":"Mjc5NDY5NTM0","repeats":1},{"count":1096,"lower_bound":"MjgxMzY2MzUy","upper_bound":"Mjk1OTEyNzg4","repeats":1},{"count":1104,"lower_bound":"Mjk2MDA2Njc3","upper_bound":"MzE5MDU3OTIw","repeats":1},{"count":1112,"lower_bound":"MzE5OTgxMjMy","upper_bound":"MzI1OTY3ODM3","repeats":1},{"count":1120,"lower_bound":"MzMyNjQwMTY3","upper_bound":"MzM5OTM0MDE4","repeats":1},{"count":1128,"lower_bound":"MzQ0MzQ3MDc1","upper_bound":"MzYwNTYyNDQ2","repeats":1},{"count":1136,"lower_bound":"MzYzMzI1MTcy","upper_bound":"MzY4MzQ0NjY4","repeats":1},{"count":1144,"lower_bound":"MzY5NDU5MTEx","upper_bound":"Mzg1MDcxMDQ2","repeats":1},{"count":1152,"lower_bound":"Mzg1MjA5MTA0","upper_bound":"Mzg5NTc4OTk1","repeats":1},{"count":1160,"lower_bound":"Mzk3Nzk0OTIz","upper_bound":"NDIxMzY0MTI5","repeats":1},{"count":1168,"lower_bound":"NDIzNDM1MjY4","upper_bound":"NDI2ODAwNDEx","repeats":1},{"count":1176,"lower_bound":"NDMyMDIwOTUx","upper_bound":"NDM1OTg3ODAy","repeats":1},{"count":1184,"lower_bound":"NDM2ODM5Njcw","upper_bound":"NDQ5OTE5NTkw","repeats":1},{"count":1192,"lower_bound":"NDUwMzI5NzAw","upper_bound":"NDU4NjU2MTc0","repeats":1},{"count":1200,"lower_bound":"NDYzMzQxMzIx","upper_bound":"NDY2MzE1ODIy","repeats":1},{"count":1208,"lower_bound":"NDczMTQxMDcx","upper_bound":"NDc2NDU1MDg4","repeats":1},{"count":1216,"lower_bound":"NDgxOTYyNzk4","upper_bound":"NDk3OTY3ODE0","repeats":1},{"count":1224,"lower_bound":"NDk4NTczMjI3","upper_bound":"NTA1NDIwODI0","repeats":1},{"count":1232,"lower_bound":"NTA3MjgwNjI5","upper_bound":"NTE3NTA1Mzcz","repeats":1},{"count":1240,"lower_bound":"NTE3ODA4MzY2","upper_bound":"NTM5NjAxMTM3","repeats":1},{"count":1248,"lower_bound":"NTQxNzE3MjYz","upper_bound":"NTUwODkwMjI0","repeats":1},{"count":1256,"lower_bound":"NTUzNDQ5NTU4","upper_bound":"NTc0Nzk3MjM4","repeats":1},{"count":1264,"lower_bound":"NTc1MTM3NDIw","upper_bound":"NTg2MDgzMjUz","repeats":1},{"count":1272,"lower_bound":"NjA1OTY2NzUx","upper_bound":"NjE0MDE3OTUw","repeats":1},{"count":1280,"lower_bound":"NjE0NDY0MTcx","upper_bound":"NjE5MjM4MjQy","repeats":1},{"count":1288,"lower_bound":"NjIxMTk0OTM1","upper_bound":"NjMyMDAxOTA1","repeats":1},{"count":1296,"lower_bound":"NjM2MDM4MzU2","upper_bound":"Njc0MjY3OTU4","repeats":1},{"count":1304,"lower_bound":"Njc3MTg1MDIx","upper_bound":"Njg3NTM5NTI4","repeats":1},{"count":1312,"lower_bound":"NjkyNTk5MzA3","upper_bound":"Njk5MDg5NDEy","repeats":1},{"count":1320,"lower_bound":"NzAxNjMzNzI1","upper_bound":"NzIzMTQ0NjM5","repeats":1},{"count":1328,"lower_bound":"NzI0Nzc1NTM5","upper_bound":"NzMzMzE5NDEz","repeats":1},{"count":1336,"lower_bound":"NzMzNjUxMzU1","upper_bound":"NzQ1NTM5NTYy","repeats":1},{"count":1344,"lower_bound":"NzQ2MTA2NjA1","upper_bound":"NzU4ODIzNDQ2","repeats":1},{"count":1352,"lower_bound":"NzU5NzYwODc3","upper_bound":"NzY0MDU2MTE0","repeats":1},{"count":1360,"lower_bound":"NzY5NDY5MjQy","upper_bound":"Nzc3MTIyODM2","repeats":1},{"count":1368,"lower_bound":"NzgxNzI5OTcx","upper_bound":"NzkwMTgxNTE1","repeats":1},{"count":1376,"lower_bound":"NzkwNjc5MDcw","upper_bound":"ODA3NTE4Mjk2","repeats":1},{"count":1384,"lower_bound":"ODI1NDgyMTgx","upper_bound":"ODQxNjczMTQx","repeats":1},{"count":1392,"lower_bound":"ODQxODI2MjA5","upper_bound":"ODY1MDMzNjc5","repeats":1},{"count":1400,"lower_bound":"ODc2OTg3MDI1","upper_bound":"ODgyNzQ3NzAz","repeats":1},{"count":1408,"lower_bound":"ODg0NTUzNzYz","upper_bound":"ODk0ODg2NjI4","repeats":1},{"count":1416,"lower_bound":"ODk4MzkzMTQ5","upper_bound":"OTE4MjAzNTQ5","repeats":1},{"count":1424,"lower_bound":"OTE5OTE1NTY5","upper_bound":"OTMzNTA0OTg4","repeats":1},{"count":1432,"lower_bound":"OTM1ODkyODU3","upper_bound":"OTU5NjY5OTEz","repeats":1},{"count":1440,"lower_bound":"OTU5ODgxMzEw","upper_bound":"OTY4Mjg0MDIy","repeats":1},{"count":1448,"lower_bound":"OTY5MzI4MzEz","upper_bound":"OTc4NjA5OTEx","repeats":1},{"count":1456,"lower_bound":"OTgxMTQ2NDQx","upper_bound":"MTAxMDIzNDkwMQ==","repeats":1},{"count":1464,"lower_bound":"MTAxOTIyNTc2MQ==","upper_bound":"MTAzMTQxNzMxNg==","repeats":1},{"count":1472,"lower_bound":"MTAzMzM1NjEyNw==","upper_bound":"MTA2MzE1NzExMQ==","repeats":1},{"count":1480,"lower_bound":"MTA2NDQwNzk0OA==","upper_bound":"MTA3MzI4NDE3Mg==","repeats":1},{"count":1488,"lower_bound":"MTA4MDI0MTE0OA==","upper_bound":"MTA4NzQ1NDkxNA==","repeats":1},{"count":1496,"lower_bound":"MTA4NzU4NTg1NA==","upper_bound":"MTEwMjg5MTY0OA==","repeats":1},{"count":1504,"lower_bound":"MTEwMzU1NDEzMg==","upper_bound":"MTExMjk5NzkwNQ==","repeats":1},{"count":1512,"lower_bound":"MTExNTIzMjMwOQ==","upper_bound":"MTEyNTczNjk0OQ==","repeats":1},{"count":1520,"lower_bound":"MTEyNjk3MDcxMA==","upper_bound":"MTE0Nzg0MDg1Mw==","repeats":1},{"count":1528,"lower_bound":"MTE0OTk2OTYxMQ==","upper_bound":"MTE1OTI3NDU4NQ==","repeats":1},{"count":1536,"lower_bound":"MTE1OTI5OTkwNQ==","upper_bound":"MTE3NTIxNzY5Mg==","repeats":1},{"count":1544,"lower_bound":"MTE3NjgxMzc0Ng==","upper_bound":"MTE3OTk5NDkyMw==","repeats":1},{"count":1552,"lower_bound":"MTE4MDM5MzMzNQ==","upper_bound":"MTE5MTcwNzQ5MQ==","repeats":1},{"count":1560,"lower_bound":"MTIwNjQ2NDc4Mw==","upper_bound":"MTIxMDI3OTY0NA==","repeats":1},{"count":1568,"lower_bound":"MTIxNDIxOTkwMg==","upper_bound":"MTIyMDU1NTE5Mw==","repeats":1},{"count":1576,"lower_bound":"MTIyMTA1NDI4Mw==","upper_bound":"MTIyOTM5NDY5NQ==","repeats":1},{"count":1584,"lower_bound":"MTIzMjM2MDA2Ng==","upper_bound":"MTI0MDQ5NDAxNA==","repeats":1},{"count":1592,"lower_bound":"MTI0MDUwNjMwNg==","upper_bound":"MTI1NTM0MDA1OQ==","repeats":1},{"count":1600,"lower_bound":"MTI3NjgwMTEzMQ==","upper_bound":"MTI5MTM0MTAzNA==","repeats":1},{"count":1608,"lower_bound":"MTI5NTkwOTU3MQ==","upper_bound":"MTMwMDkzNDg4NQ==","repeats":1},{"count":1616,"lower_bound":"MTMwMTA4MDMyOQ==","upper_bound":"MTMxNjUzMTM4Ng==","repeats":1},{"count":1624,"lower_bound":"MTMxOTA1MzkwMg==","upper_bound":"MTMzMTQ4NjUyNw==","repeats":1},{"count":1632,"lower_bound":"MTMzNzExNzQ1NQ==","upper_bound":"MTM1NTE2MTE5Mg==","repeats":1},{"count":1640,"lower_bound":"MTM2Mzg1NjY3OQ==","upper_bound":"MTM3NzM5OTA5Ng==","repeats":1},{"count":1648,"lower_bound":"MTM5Mzg0MjM2Mw==","upper_bound":"MTM5NjkwMTYyMw==","repeats":1},{"count":1656,"lower_bound":"MTQwMDk1OTk4MA==","upper_bound":"MTQxMDcwMTk3Mw==","repeats":1},{"count":1664,"lower_bound":"MTQxMTIwMzA0Nw==","upper_bound":"MTQyNjM3ODczNg==","repeats":1},{"count":1672,"lower_bound":"MTQzMDQxMzc3OQ==","upper_bound":"MTQ0MTc4OTI2NA==","repeats":1},{"count":1680,"lower_bound":"MTQ0NTUyMTQ5NQ==","upper_bound":"MTQ2MjI3MzUxNg==","repeats":1},{"count":1688,"lower_bound":"MTQ4MzI1MDQ3Mg==","upper_bound":"MTQ4NjI1MzYzNA==","repeats":1},{"count":1696,"lower_bound":"MTQ4Nzg0NzM1Mg==","upper_bound":"MTUwNTYyNjAxOA==","repeats":1},{"count":1704,"lower_bound":"MTUwNTk1NDE5Nw==","upper_bound":"MTUxNDA5MzYwNg==","repeats":1},{"count":1712,"lower_bound":"MTUxNTQyNTc1MQ==","upper_bound":"MTUyMTc3NzEwMA==","repeats":1},{"count":1720,"lower_bound":"MTUyMjA2Mjk0Nw==","upper_bound":"MTUzMjY2OTUyMg==","repeats":1},{"count":1728,"lower_bound":"MTUzODg2MjU4MA==","upper_bound":"MTU2NDg0NTkxNg==","repeats":1},{"count":1736,"lower_bound":"MTU2NjI1ODAxOA==","upper_bound":"MTU4OTI5OTUxMA==","repeats":1},{"count":1744,"lower_bound":"MTU5MDc0Mjg2MQ==","upper_bound":"MTYyMTczNTQ0MQ==","repeats":1},{"count":1752,"lower_bound":"MTYyMzUxNjgwOA==","upper_bound":"MTYzNzY0NzM1MQ==","repeats":1},{"count":1760,"lower_bound":"MTY0NTAyNjc0Ng==","upper_bound":"MTY1MTA5MzYxNQ==","repeats":1},{"count":1768,"lower_bound":"MTY1NTA3Mjg1MA==","upper_bound":"MTY4NDUwMzAyNA==","repeats":1},{"count":1776,"lower_bound":"MTY4NTQ4OTI3MQ==","upper_bound":"MTcwNTMzMDkyMQ==","repeats":1},{"count":1784,"lower_bound":"MTcwNjkzNjg1OQ==","upper_bound":"MTcyNjc2MTQ2MA==","repeats":1},{"count":1792,"lower_bound":"MTcyNzg0OTIyOA==","upper_bound":"MTc0MTUxMzkyNg==","repeats":1},{"count":1800,"lower_bound":"MTc0ODU4MjczNA==","upper_bound":"MTc1MzE0MzEzNw==","repeats":1},{"count":1808,"lower_bound":"MTc3MDU2OTY1MA==","upper_bound":"MTc3ODQzNTA5NQ==","repeats":1},{"count":1816,"lower_bound":"MTc4NzgxNjg4NQ==","upper_bound":"MTgwODgzODkxOA==","repeats":1},{"count":1824,"lower_bound":"MTgxMzM4NjI5Mw==","upper_bound":"MTgxOTgwNTM5Mw==","repeats":1},{"count":1832,"lower_bound":"MTgyNDE1MzEyNA==","upper_bound":"MTgzNDA5MzE3Mw==","repeats":1},{"count":1840,"lower_bound":"MTgzOTA4MDE2Mg==","upper_bound":"MTg1Mzk3MjYxMQ==","repeats":1},{"count":1848,"lower_bound":"MTg1NDg5MDczNA==","upper_bound":"MTg2OTg5ODc3NA==","repeats":1},{"count":1856,"lower_bound":"MTg3Mjg2OTcxMA==","upper_bound":"MTg4Mjk5NTcwNA==","repeats":1},{"count":1864,"lower_bound":"MTg4Mzc4MzU1MA==","upper_bound":"MTg5MjU4MTI2OA==","repeats":1},{"count":1872,"lower_bound":"MTg5NTE1MTQ0OA==","upper_bound":"MTg5OTE5ODQ4NA==","repeats":1},{"count":1880,"lower_bound":"MTkwMDk3MjU4NQ==","upper_bound":"MTkwNzA4MTU4NQ==","repeats":1},{"count":1888,"lower_bound":"MTkwNzczNTA0Nw==","upper_bound":"MTkyMTQ0MzYzNA==","repeats":1},{"count":1896,"lower_bound":"MTkyMTcxMzQxOA==","upper_bound":"MTk2NTY3MDcwMQ==","repeats":1},{"count":1904,"lower_bound":"MTk3MzQ4OTk3OA==","upper_bound":"MTk3ODMyMTYwOA==","repeats":1},{"count":1912,"lower_bound":"MTk4MTgzNzE2OA==","upper_bound":"MTk5ODA2NTI1MA==","repeats":1},{"count":1920,"lower_bound":"MTk5ODQ1NTEyNA==","upper_bound":"MjAwNTg3Njk1OA==","repeats":1},{"count":1928,"lower_bound":"MjAxMDE1NDkwMQ==","upper_bound":"MjAyNzMzMzc5NQ==","repeats":1},{"count":1936,"lower_bound":"MjAzMTk0MDUyNw==","upper_bound":"MjA1Mzc3ODEwNA==","repeats":1},{"count":1944,"lower_bound":"MjA2MjIxNjI5OA==","upper_bound":"MjA3MzIzMDQxNg==","repeats":1},{"count":1952,"lower_bound":"MjA3NTkzMzYzNw==","upper_bound":"MjA4NDM3NjcwNA==","repeats":1},{"count":1960,"lower_bound":"MjA4OTY0MDQ0Mg==","upper_bound":"MjA5MjAyNjI3NA==","repeats":1},{"count":1968,"lower_bound":"MjA5MjM1ODY2NQ==","upper_bound":"MjA5NjE1MjAyMw==","repeats":1},{"count":1976,"lower_bound":"MjA5NzQ5NTY1OQ==","upper_bound":"MjEwMjg1OTYxMQ==","repeats":1},{"count":1984,"lower_bound":"MjEwMzQ4NjI2Ng==","upper_bound":"MjEyMDk0NDIyNA==","repeats":1},{"count":1992,"lower_bound":"MjEyMzQ4ODU2MQ==","upper_bound":"MjEzNTM1ODI1Mg==","repeats":1},{"count":2000,"lower_bound":"MjEzNTkwNDYxMA==","upper_bound":"MjE0NDc2Mjc4Ng==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,2,2,1,1,1,0,1,0,2,0,1,0,1,1,3,0,0,1,2,1,1,0,0,2,3,0,4,1,1,2,0,2,3,1,0,0,0,1,0,0,1,1,0,3,1,0,0,0,1,0,0,3,1,2,0,2,2,1,1,0,1,0,2,0,1,1,2,1,0,0,3,0,0,2,0,0,0,2,0,1,0,1,1,1,1,0,1,4,1,0,0,2,1,1,1,0,0,0,0,0,1,1,4,2,0,1,2,0,1,0,0,1,1,1,2,1,1,2,0,0,1,0,0,1,0,0,1,0,2,1,0,2,0,1,1,0,0,3,1,0,0,3,0,0,1,2,0,3,3,2,1,0,1,0,1,1,3,1,2,1,2,0,1,1,1,0,0,2,0,1,0,0,2,1,1,2,0,0,0,1,1,2,0,1,0,0,1,0,0,1,0,0,3,0,0,3,0,2,3,1,1,0,1,4,2,1,1,0,2,3,0,1,0,2,1,0,0,1,2,1,0,4,1,1,1,2,2,0,1,1,1,0,2,2,0,3,0,0,1,0,1,1,1,2,0,1,0,1,1,1,3,0,2,1,1,2,2,1,1,2,4,0,1,1,1,0,1,0,0,4,1,0,1,0,0,1,1,1,0,1,0,3,0,0,4,0,2,1,2,1,0,0,3,1,0,0,3,1,2,2,0,1,2,2,1,2,1,0,2,3,1,0,0,0,2,0,1,1,0,0,2,2,1,3,2,0,1,0,1,0,0,0,0,1,1,2,3,0,1,0,1,0,0,0,2,1,3,2,2,0,1,1,0,0,0,0,2,3,3,3,0,1,1,0,1,0,0,1,1,1,1,0,0,2,2,2,1,4,1,3,0,0,2,0,0,2,0,0,0,3,1,1,1,1,0,2,1,2,3,1,1,0,1,0,1,2,0,0,1,0,0,1,1,0,3,0,1,2,1,1,1,0,3,3,0,1,0,1,2,0,1,2,0,0,0,1,1,1,1,0,1,2,1,0,0,2,2,1,1,1,1,0,2,1,1,2,2,2,2,2,0,1,2,1,3,2,1,2,2,1,1,0,1,1,0,3,1,0,3,1,2,1,1,0,0,1,0,0,0,3,0,0,3,3,1,1,1,0,1,1,1,0,0,2,2,0,0,1,0,1,1,2,1,2,4,1,0,2,1,0,2,1,2,0,0,1,0,1,3,0,1,1,1,2,2,1,1,2,2,1,1,0,2,2,4,2,1,0,1,1,1,1,0,2,1,1,0,0,1,1,0,0,0,1,0,0,1,0,2,5,1,2,0,3,0,1,2,1,1,1,1,0,0,0,0,1,0,0,0,2,1,3,5,3,3,2,0,1,0,1,0,0,0,2,1,1,0,1,1,2,2,1,4,0,0,1,1,1,1,2,1,2,0,0,0,1,0,0,3,2,0,0,2,2,4,1,1,1,0,2,1,1,2,0,1,1,0,0,1,0,2,0,3,1,0,2,0,0,1,3,1,1,0,0,1,0,1,1,2,2,1,0,2,3,0,2,2,0,0,0,0,0,1,0,1,1,0,1,0,1,1,0,1,1,1,0,0,0,0,1,3,0,2,3,1,2,2,1,1,1,1,0,1,0,0,0,0,2,2,2,1,1,1,2,0,1,0,0,1,1,2,1,1,0,0,1,0,1,1,0,2,3,0,2,0,3,0,1,0,0,1,2,1,1,0,0,0,2,1,1,0,1,1,0,0,2,0,1,1,2,0,4,1,0,0,0,1,1,0,0,0,0,1,0,0,1,2,3,0,2,1,1,4,1,1,1,0,1,2,0,0,0,2,2,0,1,0,0,0,0,1,1,0,2,0,1,0,1,0,2,1,1,0,0,2,2,1,0,2,2,0,1,0,1,0,0,0,0,1,1,0,0,2,2,1,2,2,2,2,1,0,0,1,0,2,0,3,1,3,1,2,0,0,2,1,0,1,2,1,1,0,1,2,2,0,0,2,0,1,1,1,0,2,1,1,0,0,1,2,0,0,1,1,1,0,0,2,2,1,0,0,2,0,0,0,1,1,2,1,0,2,1,1,0,0,1,0,1,0,0,1,0,2,0,1,1,0,0,2,0,1,0,2,0,0,0,1,3,0,1,2,1,3,1,0,1,0,2,1,0,1,2,1,2,1,0,0,2,3,0,2,2,1,2,1,1,0,2,3,1,0,1,0,0,0,0,1,0,0,2,0,1,0,0,1,0,2,1,2,2,0,1,0,2,1,0,1,2,0,2,2,1,1,0,1,2,2,2,0,0,1,0,2,2,1,0,0,2,0,2,1,1,2,0,2,1,1,0,2,0,2,0,4,0,0,0,0,1,0,1,4,0,2,0,3,2,0,1,2,1,2,0,0,0,2,0,2,2,1,1,1,0,0,0,2,0,1,1,1,0,5,0,1,2,0,0,0,1,0,1,0,2,1,2,1,2,3,1,0,1,0,2,2,0,1,1,0,1,0,1,0,1,0,3,0,1,1,0,0,0,1,1,1,0,0,1,0,0,0,1,1,0,1,2,0,1,0,3,0,2,1,0,1,0,1,0,1,0,0,1,0,1,1,3,0,0,2,2,1,2,0,0,4,3,2,2,2,2,0,1,1,0,1,2,3,0,1,1,0,1,1,2,3,4,2,0,0,1,1,2,0,1,1,0,1,2,0,4,1,1,0,2,1,2,0,5,0,2,1,2,1,1,0,3,1,1,1,2,0,1,0,1,2,0,1,1,0,1,2,0,2,2,0,4,1,0,1,2,1,0,1,0,2,2,0,0,1,1,3,1,1,1,0,0,0,2,1,1,0,1,1,2,0,0,0,2,1,0,0,0,0,1,0,1,1,1,0,2,0,0,1,1,1,0,1,1,2,1,0,0,1,4,1,1,0,0,0,0,1,2,0,0,0,2,0,0,2,0,0,0,0,0,1,0,0,1,0,0,1,5,1,1,2,1,1,2,1,2,0,0,1,0,0,2,1,1,1,0,0,2,1,1,1,0,0,0,0,2,0,0,1,0,3,1,2,0,0,2,0,1,2,2,2,2,1,1,1,1,1,0,0,1,0,1,1,0,1,0,3,0,1,2,1,1,3,0,0,0,1,1,0,1,1,2,3,0,0,1,0,3,2,1,2,1,1,0,1,0,1,1,1,0,1,1,1,1,1,1,2,1,0,0,0,1,0,0,1,0,0,1,1,2,1,2,0,0,1,0,2,1,1,0,2,3,1,2,1,0,0,1,0,1,2,0,1,2,3,1,0,1,0,1,1,3,0,0,1,0,0,1,0,0,0,1,2,0,0,1,1,2,1,0,0,0,0,2,0,2,0,0,2,0,1,0,3,2,2,0,2,0,2,1,1,0,0,1,4,0,0,0,1,1,1,1,0,1,0,1,2,0,2,0,2,0,1,1,1,1,0,1,2,0,0,0,0,3,1,1,1,1,1,1,2,0,2,1,2,1,0,0,2,1,1,0,0,0,2,1,2,2,0,0,0,2,1,2,2,2,0,2,0,1,0,1,3,0,1,0,1,1,0,1,0,1,0,1,1,1,0,2,0,2,0,0,0,0,1,1,1,0,0,0,0,0,0,1,0,0,3,1,2,1,1,1,0,1,2,2,2,2,1,1,2,0,2,0,1,2,0,0,0,2,0,3,2,1,1,1,3,0,1,2,0,2,0,4,0,1,3,0,3,1,1,1,0,0,0,1,1,0,1,1,3,0,0,1,0,0,0,0,0,0,1,2,0,1,1,1,1,1,0,1,6,1,2,1,0,0,1,0,0,0,0,0,1,3,1,1,1,1,1,1,1,1,0,2,0,3,0,1,0,1,1,0,0,0,0,1,1,1,0,2,0,2,0,0,0,0,1,1,2,2,1,0,1,0,1,0,2,0,2,1,0,1,2,2,0,0,1,0,1,0,1,0,2,2,1,1,0,2,3,1,0,0,1,1,3,1,1,2,1,1,2,1,0,0,1,0,1,0,0,1,2,0,2,0,1,0,1,0,2,1,4,0,1,0,0,2,1,2,1,4,1,1,0,2,0,0,0,0,0,0,1,0,0,2,3,1,3,0,4,0,1,3,2,2,2,1,2,0,1,1,0,3,1,2,0,0,3,2,1,0,0,1,2,0,1,0,2,2,3,1,0,0,0,1,2,0,1,1,0,1,0,3,1,1,0,1,1,0,1,1,1,1,2,1,0,2,1,2,1,0,1,0,0,1,1,1,0,3,1,1,4,0,1,0,2,2,3,1,1,3,2,2,2,0,0,0,3,0,0,1,1,1,2,5,0,3,3,0,1,2,2,1,2,1,1,1,0,0,3,0,2,0,4,1,1,0,2,2,0,1,2,1,2,1,0,0,2,3,1,2,1,1,1,1,0,0,0,0,2,1,1,5,0,1,2,0,1,2,3,1,1,0,2,3,0,1,2,0,0,0,0,2,3,0,1,1,3,1,2,3,1,4,0,2,1,0,2,1,0,1,0,0,0,2,1,1,1,1,0,0,1,0,1,1,0,1,1,0,0,1,0,1,1,1,2,1,2,1,0,1,1,0,2,1,1,0,2,3,1,2,2,0,2,1,0,1,0,0,3,0,1,2,1,1]},{"counters":[0,1,1,0,3,2,0,1,2,4,0,2,1,1,3,1,0,3,2,1,2,0,0,1,2,2,2,2,0,2,2,0,0,0,3,0,2,0,0,1,0,1,1,0,2,3,1,2,0,0,1,1,1,0,0,1,4,3,0,2,2,0,0,0,3,2,2,2,0,1,1,1,0,0,0,0,0,0,1,0,1,2,0,1,0,3,0,1,0,1,0,2,1,1,1,2,2,1,0,1,2,1,0,0,2,0,0,2,0,0,0,0,0,1,1,3,1,0,1,2,2,0,2,2,2,1,2,0,1,2,2,3,1,2,1,1,0,0,2,1,3,1,1,2,1,2,2,2,1,2,1,2,0,0,0,3,1,1,0,0,2,1,2,2,1,2,1,0,2,2,0,0,0,0,0,1,3,3,0,0,1,1,0,0,0,1,0,1,0,1,3,1,1,2,0,2,0,1,0,0,4,1,1,0,0,1,2,1,0,1,0,0,1,0,1,1,1,1,3,1,1,4,0,1,1,1,0,1,0,1,1,1,0,2,1,0,2,3,1,1,0,0,0,2,3,1,0,2,0,1,0,1,1,0,0,1,0,2,1,1,2,3,1,1,1,1,0,1,0,1,0,0,2,1,1,1,2,0,0,0,1,0,1,1,3,1,1,0,1,1,0,1,2,0,0,2,0,1,1,0,2,0,1,2,0,2,2,1,1,1,0,2,1,0,1,1,1,1,1,2,0,3,0,1,0,0,2,0,3,1,2,0,0,1,2,1,2,0,0,2,0,1,0,2,1,0,0,0,0,0,0,2,1,0,0,1,0,0,2,1,0,0,3,1,0,0,2,2,0,0,0,3,1,0,0,2,1,1,0,2,2,1,0,1,0,2,0,0,0,1,2,1,0,1,0,1,2,2,1,0,1,2,2,0,2,1,0,1,0,0,1,0,2,1,3,1,1,0,0,1,2,0,1,0,0,2,1,2,3,1,0,0,1,0,2,2,0,3,2,1,1,0,0,0,1,0,1,3,1,1,2,1,1,0,1,0,1,1,1,1,3,1,0,1,0,0,2,1,0,1,3,1,0,2,1,2,1,0,0,3,1,1,0,3,1,1,0,2,2,1,1,0,0,1,0,3,0,1,0,0,0,3,1,1,2,0,0,1,0,1,1,2,0,1,0,0,0,0,0,2,0,0,0,1,1,0,0,0,2,2,0,1,0,2,1,1,0,3,0,3,2,1,0,0,2,1,0,1,1,0,0,2,0,0,0,0,0,0,1,0,3,2,0,2,0,1,1,0,2,1,0,0,2,2,0,2,1,0,0,3,0,0,1,1,2,0,0,0,2,3,2,1,1,1,0,0,2,2,3,2,1,3,0,0,3,0,0,0,2,0,1,1,1,1,0,3,1,1,3,1,0,0,0,2,1,2,2,1,2,1,1,0,0,1,2,3,1,3,2,1,0,0,0,0,1,1,0,0,0,1,0,0,0,3,1,0,1,0,0,0,0,2,1,1,0,1,0,1,2,0,1,2,0,1,1,1,0,0,1,1,0,0,0,0,0,1,2,2,1,1,1,1,1,0,2,2,0,0,0,0,1,0,1,1,0,0,0,0,0,2,1,3,1,0,0,2,1,2,1,0,0,2,0,1,1,1,2,1,2,0,0,3,0,1,0,0,0,2,0,1,1,0,2,0,1,2,1,1,1,2,1,0,1,1,1,4,1,1,1,1,1,0,2,0,0,3,1,2,1,0,1,1,2,2,5,2,3,1,2,0,1,1,3,2,0,1,4,0,1,0,0,2,1,2,0,1,0,1,0,0,1,2,0,2,1,2,2,2,2,0,1,0,2,1,0,1,3,3,1,1,2,2,0,1,2,3,1,0,1,1,1,3,0,0,2,3,0,1,3,0,1,2,4,0,2,1,0,1,1,0,0,0,0,4,0,1,1,0,1,2,1,1,1,1,0,1,2,2,2,0,0,2,2,0,1,0,1,1,2,0,4,1,2,2,0,2,1,1,0,1,2,2,0,1,1,1,1,0,3,5,3,2,3,0,0,1,1,0,0,0,0,1,0,2,1,0,0,0,0,0,0,1,0,1,0,0,1,0,2,2,2,0,2,3,1,1,2,1,0,0,2,1,2,1,1,1,3,1,0,1,0,0,0,0,1,2,0,1,0,2,2,0,0,1,1,1,0,0,1,0,2,2,2,1,0,1,1,0,0,0,1,0,3,1,0,3,1,0,0,0,1,4,1,1,0,2,0,1,3,0,0,0,1,2,0,1,1,0,0,3,2,0,0,0,0,1,1,0,1,3,1,0,2,1,2,1,0,0,1,1,1,0,0,1,0,2,0,0,2,2,0,1,2,1,0,1,0,0,1,0,0,0,0,4,1,0,0,0,1,1,1,1,1,1,1,0,2,1,1,0,3,1,2,1,1,0,1,0,2,0,0,1,0,0,3,1,1,0,0,0,2,2,2,4,0,0,2,3,0,3,0,0,1,2,0,3,2,2,1,0,2,0,3,0,0,0,1,2,2,0,1,1,1,1,0,1,1,1,1,1,1,1,1,0,1,3,1,5,1,0,1,2,3,0,1,3,0,0,2,2,1,0,0,3,0,1,1,1,3,2,0,0,0,0,0,2,0,0,3,1,0,1,1,1,2,0,0,1,2,3,0,2,0,1,2,0,0,3,1,0,1,0,0,0,0,1,3,0,1,1,0,2,1,0,1,1,1,0,1,3,0,2,1,0,1,1,1,0,0,0,1,2,2,0,2,3,0,1,1,0,0,1,0,3,0,1,1,1,2,0,1,0,1,0,1,3,0,0,1,0,1,1,1,0,0,1,2,2,1,1,0,3,0,1,2,0,0,1,1,1,2,2,3,3,1,1,1,2,1,2,2,0,1,0,2,0,0,1,1,3,0,0,0,2,1,1,0,2,1,1,3,1,3,1,0,2,0,0,1,2,1,0,1,2,0,4,0,1,0,1,0,0,2,1,1,1,2,1,2,1,0,0,1,0,4,0,2,0,0,1,1,0,0,0,0,0,2,0,1,2,1,3,0,2,2,2,3,1,1,0,0,2,0,0,0,0,1,1,2,1,0,1,0,0,1,2,0,1,1,5,0,1,1,0,2,1,0,0,2,2,0,1,1,0,1,0,2,0,2,0,1,0,1,1,1,1,0,1,1,0,0,1,3,1,1,0,1,1,2,1,0,2,0,0,1,1,2,1,1,1,1,2,1,2,0,1,0,1,2,2,0,2,0,1,1,2,0,3,2,0,1,1,0,1,0,1,0,2,3,1,3,0,1,1,1,1,0,2,0,0,0,3,0,0,1,0,2,1,1,0,2,0,1,1,2,0,1,0,0,1,1,1,0,2,1,0,1,1,0,0,2,2,0,1,2,2,0,0,1,0,1,1,1,2,0,0,1,1,0,1,1,0,1,0,0,0,1,0,1,0,2,0,0,1,2,1,1,1,1,1,0,2,1,2,1,2,1,1,1,1,1,2,0,2,1,4,2,1,1,1,0,1,1,0,1,0,1,0,0,1,1,1,1,1,0,0,1,1,0,1,2,1,1,3,1,2,0,0,1,2,2,0,3,1,3,1,2,1,0,1,1,2,1,2,1,1,2,0,2,0,2,0,1,0,3,0,1,4,2,0,1,1,0,3,1,1,0,0,0,0,0,0,0,1,3,1,3,2,0,0,0,1,0,0,2,0,2,1,1,0,1,0,1,1,1,4,0,0,2,3,0,1,2,0,0,1,0,0,1,0,3,1,1,0,0,0,1,0,1,2,0,2,0,1,0,1,2,1,2,3,0,2,4,1,1,1,0,4,1,0,1,0,2,0,1,1,0,0,1,1,0,1,1,5,2,0,0,1,3,0,0,0,1,0,0,0,1,0,0,1,3,0,1,1,1,1,1,0,1,1,1,2,2,0,2,2,2,1,1,1,1,0,0,1,0,2,1,5,1,0,1,0,0,0,2,0,1,1,0,1,0,0,1,1,4,1,1,1,0,1,1,0,1,0,1,0,2,3,0,0,1,0,0,1,0,2,0,1,1,0,0,1,1,0,0,1,1,0,0,0,1,2,0,2,1,3,2,0,1,0,1,1,1,1,1,1,1,1,4,4,1,0,1,0,1,1,0,3,3,2,2,0,0,1,0,0,0,0,0,2,0,2,0,2,2,4,0,0,3,1,2,2,1,1,4,0,0,2,0,1,1,1,0,0,0,1,0,0,1,0,0,4,0,3,0,0,0,2,0,0,1,4,2,3,0,1,2,2,0,2,1,3,1,0,2,1,0,2,0,2,1,1,1,0,2,1,0,1,1,1,0,0,0,1,2,1,1,0,0,0,1,0,0,1,3,0,1,0,1,1,1,1,3,1,0,1,0,2,0,1,2,0,0,0,0,4,1,2,1,2,0,2,1,0,3,0,0,1,1,0,0,1,1,1,0,1,1,1,3,1,2,2,4,0,0,1,0,0,0,2,2,1,1,2,0,0,3,1,0,1,1,1,0,2,2,2,1,0,1,0,1,0,2,1,0,1,3,1,2,0,0,0,0,1,1,3,0,0,1,1,1,0,4,1,1,1,2,1,0,1,1,1,1,1,1,0,1,0]},{"counters":[2,0,1,0,2,2,0,0,1,1,0,0,1,1,0,0,3,1,2,2,0,1,1,1,1,1,0,1,0,1,0,2,1,1,2,2,1,3,2,0,0,2,0,0,1,2,0,1,2,0,0,1,0,2,2,1,0,3,3,0,1,1,0,0,2,0,0,0,0,1,2,0,0,0,0,3,0,0,1,1,0,2,1,2,0,0,1,1,0,0,1,1,1,1,1,2,0,2,1,0,2,0,0,2,0,1,5,2,1,0,2,1,0,2,0,1,2,1,1,2,0,3,0,3,2,1,0,0,0,0,0,0,0,1,0,1,2,1,0,1,2,3,0,1,1,2,0,0,0,1,2,1,1,1,1,1,0,2,2,1,0,1,1,1,1,0,0,0,0,1,1,0,0,0,3,1,1,0,2,2,2,0,0,2,1,1,3,0,2,1,3,1,0,0,2,0,0,0,1,1,0,0,2,0,0,0,0,2,1,0,0,0,0,2,1,0,1,1,1,0,2,2,2,2,1,0,0,0,2,1,0,0,1,1,2,1,1,1,0,2,2,2,3,2,0,0,0,0,1,1,2,0,0,1,5,0,2,0,0,1,1,0,1,2,3,1,0,1,1,2,1,1,1,2,1,1,0,2,1,0,0,1,2,0,2,1,2,0,2,1,0,1,0,1,0,2,2,0,2,1,0,2,3,2,1,1,2,1,3,2,0,2,0,2,2,0,2,1,1,2,1,0,3,4,0,1,1,0,1,1,0,3,3,1,2,1,1,0,1,1,0,1,0,1,0,1,2,3,1,0,2,2,1,2,0,0,0,0,1,0,1,1,1,1,2,1,3,1,0,1,0,0,0,1,1,1,3,2,0,2,1,0,1,1,0,2,1,2,0,2,0,1,3,3,0,3,3,0,1,0,2,1,1,1,0,1,0,1,0,1,2,0,2,2,0,1,0,1,1,2,0,1,1,1,0,3,0,0,0,2,0,0,1,1,1,1,1,1,2,1,3,1,2,2,2,1,1,1,1,0,2,0,1,1,0,1,1,1,0,1,0,1,0,1,2,3,2,1,2,2,1,2,2,1,3,1,1,0,2,3,1,3,0,0,1,0,1,1,1,0,1,1,1,0,1,0,0,1,0,0,0,1,1,0,3,3,1,0,1,0,1,0,2,2,0,1,1,1,1,1,2,0,1,0,1,0,3,0,1,1,2,0,2,2,2,1,1,1,0,2,0,1,4,1,1,0,1,1,2,4,0,1,2,2,0,3,2,0,0,0,1,0,0,2,0,1,1,0,0,3,2,1,2,2,0,2,1,0,0,0,0,0,0,0,0,0,2,0,0,2,4,2,0,3,1,1,3,0,1,0,1,0,2,1,0,2,2,1,0,1,0,2,0,1,1,0,0,0,4,1,1,1,1,0,1,0,2,2,0,1,0,2,4,2,0,0,1,1,2,0,1,1,1,1,1,5,2,0,1,2,1,2,1,1,0,1,2,0,0,1,0,0,2,1,1,2,3,1,0,0,0,0,1,1,1,0,1,1,1,0,1,1,1,1,0,1,1,0,1,2,0,1,2,2,2,1,2,2,2,0,0,0,3,0,1,0,1,2,0,1,1,0,1,2,0,1,2,1,0,3,2,0,1,0,0,2,1,2,0,0,0,1,1,1,0,1,0,2,0,0,0,0,1,3,2,1,0,0,0,2,0,1,2,0,1,1,1,2,1,0,0,0,0,0,1,1,2,0,1,1,1,0,1,1,0,2,1,2,1,3,2,1,1,0,0,1,1,2,2,2,3,1,4,1,1,4,0,1,0,0,0,0,0,0,0,1,1,0,1,2,0,2,1,1,0,1,0,0,0,2,0,1,2,0,0,1,4,2,3,1,0,0,1,0,0,1,1,1,3,0,0,1,1,1,1,2,2,3,1,1,1,0,0,1,0,1,3,0,1,0,1,0,0,1,1,1,1,0,0,0,2,0,2,1,0,1,1,2,0,0,1,0,2,0,0,2,4,2,0,1,2,0,0,0,1,2,2,0,0,0,3,2,1,2,1,1,1,1,1,0,0,1,5,3,2,0,2,0,0,1,1,0,0,1,2,2,1,1,3,1,1,2,2,1,0,0,1,0,0,0,1,2,1,0,1,1,1,2,0,0,2,2,1,2,1,0,0,0,3,2,0,1,1,1,3,0,0,1,1,2,0,1,1,1,0,1,2,1,0,2,1,3,0,2,0,1,3,1,2,1,0,3,0,1,0,0,0,0,1,1,2,2,0,0,0,0,2,1,2,1,1,1,0,2,0,0,0,2,1,1,0,0,0,2,0,0,1,1,2,3,2,0,1,1,1,1,1,0,1,0,1,0,0,1,0,0,2,0,2,0,2,1,0,2,1,0,2,0,2,3,0,1,1,0,3,2,3,1,2,0,2,2,3,2,0,0,1,3,1,1,0,1,0,1,0,0,0,1,0,0,2,0,2,0,0,1,1,2,0,0,2,2,1,1,0,1,2,0,1,1,0,0,3,3,1,2,2,0,0,0,0,1,1,3,2,2,2,2,1,2,1,1,2,0,2,0,1,0,1,4,0,0,0,2,0,0,0,0,1,1,1,2,2,0,1,1,0,0,2,2,1,0,2,0,3,0,3,0,0,2,1,1,1,0,2,0,2,2,1,1,0,1,0,0,0,0,0,0,1,2,1,0,1,0,2,3,0,0,1,3,2,0,2,0,0,1,0,3,0,3,2,3,2,2,0,0,3,3,1,3,0,0,1,2,2,0,3,0,3,2,1,1,3,1,0,2,1,2,1,2,2,3,1,1,0,1,0,1,2,0,1,1,0,0,2,0,1,1,0,0,2,3,2,3,2,1,2,2,0,0,0,0,1,0,0,1,0,3,0,0,1,0,0,3,3,0,1,0,0,1,1,2,0,2,1,0,0,0,2,1,3,1,1,0,1,1,1,1,0,0,0,2,2,1,0,1,1,1,0,0,0,1,1,0,1,0,2,0,3,3,1,0,2,0,0,3,1,1,0,2,2,2,2,0,1,0,1,2,0,0,3,3,0,1,2,0,1,1,2,0,1,1,1,0,0,2,0,0,2,1,1,0,1,0,2,0,1,1,0,2,3,2,0,1,0,2,3,0,1,0,2,5,0,3,0,1,2,1,0,2,1,1,0,3,2,2,0,1,1,0,0,0,0,1,0,1,2,2,0,1,1,1,2,0,1,0,2,0,1,0,5,2,0,0,1,1,1,1,0,2,2,1,0,0,1,0,2,2,1,0,0,0,0,1,0,4,3,1,0,0,0,0,0,1,0,0,0,0,1,1,2,1,0,3,0,2,0,1,2,1,0,0,0,2,0,1,1,1,0,0,2,1,1,0,1,2,3,0,1,0,1,0,3,1,0,1,1,3,1,1,0,0,1,1,1,1,0,2,0,1,2,0,0,1,1,3,1,0,0,2,1,1,2,3,1,0,0,2,0,1,0,1,0,2,2,1,0,1,1,2,0,1,1,1,0,0,1,0,1,0,0,0,0,1,0,1,1,4,2,1,0,1,3,1,1,2,0,1,1,0,1,0,1,0,0,1,0,0,1,0,0,2,1,1,0,0,2,0,0,0,1,3,1,1,2,1,0,1,1,0,1,0,0,0,2,1,0,0,1,2,2,0,2,0,1,1,0,2,1,0,1,1,0,0,0,0,3,1,0,2,0,0,0,0,2,0,0,0,2,1,1,6,0,5,0,3,1,0,0,1,1,0,0,1,0,0,0,2,3,0,0,0,3,0,1,2,2,1,0,1,2,1,0,0,1,1,1,4,0,1,0,0,1,2,1,0,1,2,3,0,0,1,0,1,1,3,1,3,0,2,0,1,1,2,3,0,1,1,1,0,1,0,0,2,2,2,1,0,1,0,1,0,0,1,0,1,0,1,0,1,0,2,1,1,1,0,0,2,2,1,2,0,1,1,3,0,1,0,1,0,2,1,0,1,1,0,0,0,0,2,0,0,0,2,1,0,2,2,0,2,1,1,2,1,3,0,1,0,1,1,0,2,1,0,2,0,1,2,0,2,1,3,1,0,1,0,0,2,1,0,3,1,0,0,2,2,1,0,2,0,2,1,0,3,0,0,1,0,1,0,0,1,1,0,0,0,0,3,0,0,1,1,2,0,3,0,1,0,0,0,1,2,3,2,1,1,3,0,3,0,1,4,0,1,2,0,3,0,1,1,0,0,1,1,1,2,0,2,2,2,0,1,0,3,2,1,0,1,1,0,2,0,1,0,0,2,1,0,2,0,0,1,1,2,2,0,1,0,0,0,0,1,2,0,0,0,1,0,0,1,1,0,2,1,0,1,1,0,2,2,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,2,1,0,1,0,0,1,1,1,3,0,2,2,1,0,2,3,0,2,1,3,1,4,1,4,2,0,2,0,0,0,1,0,0,1,1,0,4,2,0,0,0,1,1,1,2,0,1,1,2,1,0,1,1,0,1,0,2,2,1,2,1,3,2,1,2,1,0,0,2,0,1,2,0,0,1,0,0,0,0,1,4,1,0,2,1,1,0,0,0,0,1,1,1,0,0,2,0,1,0,2,2,2]},{"counters":[0,1,0,2,2,2,1,0,2,0,0,1,1,0,0,3,0,0,1,1,1,2,0,1,0,2,0,0,0,0,1,0,1,2,0,3,1,1,2,0,0,0,0,1,2,1,1,2,2,0,1,0,0,1,1,0,0,1,1,2,1,1,0,1,0,0,0,1,0,0,0,1,1,1,0,1,0,0,1,2,0,1,2,1,1,2,0,0,1,2,0,2,0,1,5,1,0,0,2,2,0,1,4,0,2,3,1,2,2,0,2,1,1,0,0,2,0,0,0,2,1,1,4,2,4,0,2,1,2,1,1,0,1,2,3,2,2,2,0,0,1,1,1,1,0,2,2,2,1,0,2,2,0,2,2,3,0,2,2,1,0,0,0,2,0,2,0,1,0,0,2,1,2,0,1,1,0,1,0,0,1,2,0,1,1,2,0,2,1,0,0,2,0,1,0,0,1,1,2,3,1,1,1,0,1,1,1,0,0,2,1,2,0,0,1,0,1,1,1,1,2,0,3,2,3,0,2,1,0,1,1,1,1,1,0,0,1,2,3,1,1,1,1,3,1,0,1,1,0,0,0,2,0,2,0,2,0,0,0,2,1,2,1,1,1,0,0,0,1,0,0,2,0,1,1,1,1,1,0,0,1,1,2,1,0,1,0,1,2,2,1,1,0,1,2,3,1,3,0,1,2,0,0,0,2,1,0,3,0,2,1,0,4,1,1,1,3,0,0,0,1,2,0,0,1,2,0,1,0,0,0,0,0,0,0,1,1,2,0,0,1,1,0,3,1,1,0,0,1,0,1,0,0,2,1,1,2,0,0,0,0,0,0,2,2,1,0,1,1,0,1,0,1,1,1,0,2,1,1,0,0,2,3,2,1,0,0,3,1,2,1,1,0,0,3,2,2,0,3,0,1,0,2,4,1,2,1,2,0,0,0,1,3,0,4,2,2,1,0,1,1,2,2,1,1,1,1,0,1,1,2,1,2,2,0,1,0,1,0,0,0,0,2,1,1,1,3,1,1,2,1,2,1,0,0,3,1,2,1,0,0,2,1,1,0,1,1,0,1,0,1,1,0,1,0,3,1,0,2,0,1,0,2,0,3,0,0,0,1,2,0,3,0,4,0,2,0,2,0,0,0,2,3,0,1,0,0,1,2,2,2,1,4,0,1,0,3,1,0,0,0,3,0,0,1,2,0,0,3,1,1,2,0,1,2,2,1,1,1,1,0,2,1,2,1,2,2,1,0,1,2,1,0,1,0,1,0,0,0,0,1,2,1,2,1,2,2,2,0,1,0,2,3,0,1,1,1,0,0,2,2,3,0,2,1,2,4,4,0,1,1,2,2,0,2,0,0,0,2,0,1,3,1,1,1,0,0,1,0,1,1,1,3,0,1,0,1,1,0,1,1,0,0,0,0,0,0,1,0,1,1,2,0,1,0,0,2,1,0,0,0,2,1,2,1,0,2,0,0,1,0,0,0,3,1,0,3,1,3,0,0,1,1,2,0,0,0,0,2,2,0,2,1,0,2,1,2,0,0,0,1,2,1,1,0,0,2,1,1,2,2,1,1,1,4,0,0,1,0,1,0,3,3,1,1,0,3,0,2,1,2,0,1,1,3,3,1,1,0,2,0,1,2,2,1,2,1,0,1,0,0,1,2,0,0,3,0,1,0,1,0,1,1,1,1,0,0,3,0,1,1,0,3,0,0,2,1,3,0,1,3,1,1,2,2,3,0,0,1,2,4,0,2,0,0,3,1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,1,0,1,1,0,0,1,2,0,3,2,2,0,0,0,1,0,1,2,1,0,2,2,0,1,1,1,1,1,0,0,2,2,1,0,0,1,1,2,2,0,1,0,0,2,1,1,2,0,0,1,0,2,0,1,0,1,1,1,2,2,1,2,0,2,0,0,2,0,3,0,1,1,0,1,2,1,1,0,0,0,0,1,1,1,1,0,2,1,2,1,2,0,0,1,1,3,1,0,3,2,1,1,1,1,3,2,1,2,0,1,0,0,1,1,0,0,2,1,3,0,0,1,4,0,2,2,1,1,0,2,0,1,2,2,3,1,2,2,0,0,0,1,0,0,0,0,0,1,0,0,2,1,0,1,2,1,0,1,1,1,2,0,0,0,1,1,1,3,1,0,0,1,1,1,0,2,0,3,0,1,1,1,2,0,1,2,0,1,4,3,0,0,0,0,1,1,1,1,2,0,0,2,1,0,3,0,1,0,0,1,1,0,0,2,1,1,1,1,1,3,1,2,0,1,0,0,1,1,1,0,0,1,2,1,1,2,0,3,0,0,1,1,1,1,0,1,0,0,0,4,1,0,2,0,1,0,0,0,1,0,1,2,0,0,2,1,1,2,0,1,0,1,0,0,1,1,2,0,0,1,2,0,3,1,1,0,1,1,0,1,0,1,0,1,0,0,1,2,1,0,0,1,1,1,0,2,0,0,1,0,0,1,2,3,0,0,0,0,2,1,1,3,1,1,1,3,0,1,2,1,3,0,2,1,0,2,2,0,2,0,1,1,0,1,0,0,1,1,0,1,1,0,0,1,1,1,1,0,1,1,0,1,0,3,2,0,0,1,1,0,1,1,0,0,0,0,0,1,2,0,1,0,1,1,1,2,1,2,0,3,1,1,0,1,1,1,0,0,2,1,2,1,6,0,1,1,1,1,0,1,1,1,1,0,0,0,1,2,1,0,0,0,0,2,2,0,0,0,1,1,0,1,0,0,0,3,2,0,2,1,2,1,2,0,1,1,1,0,1,2,2,1,0,1,0,0,1,1,0,3,1,2,0,0,2,0,0,2,0,3,0,0,0,2,3,0,4,1,1,2,2,1,0,0,1,0,2,0,0,1,0,1,1,2,0,0,0,2,1,0,0,0,2,0,2,0,2,1,0,0,1,2,0,1,1,0,1,1,1,2,1,2,0,1,1,2,3,0,0,2,0,3,0,0,0,0,0,0,0,1,0,1,0,2,2,3,0,1,0,0,1,1,1,1,0,1,0,1,0,0,1,1,3,0,1,1,0,2,0,0,1,2,1,0,0,2,0,1,0,1,2,2,1,2,0,0,1,0,2,0,1,2,1,0,1,4,0,1,0,0,0,2,1,0,0,0,1,1,0,4,1,2,1,3,0,1,1,0,0,1,0,2,1,1,3,1,0,3,0,2,1,0,1,3,1,1,1,2,0,1,0,2,0,2,1,0,1,3,1,2,1,2,0,1,1,2,1,0,6,0,1,1,0,0,0,1,0,1,1,0,0,0,2,1,0,0,1,1,0,0,1,1,1,0,1,0,2,0,1,0,1,2,1,0,1,2,0,3,1,0,1,1,1,0,1,1,0,0,1,1,2,1,0,3,1,3,1,1,4,2,3,1,2,0,2,3,1,2,1,0,0,4,4,3,1,1,1,0,0,1,0,1,0,1,0,2,0,2,0,1,1,3,0,0,0,0,0,2,1,0,0,2,2,0,1,2,1,0,1,1,1,1,2,1,0,3,1,1,0,1,1,0,1,1,2,1,2,0,0,0,5,0,0,1,1,0,1,0,0,2,0,1,0,2,1,0,0,0,0,0,1,1,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,2,0,2,1,0,1,3,0,0,0,0,2,1,5,1,0,0,1,2,2,1,0,1,0,2,2,0,1,1,1,0,1,0,1,1,3,0,1,1,2,1,1,0,1,1,0,1,0,0,2,1,0,3,0,2,0,1,1,1,2,1,2,1,2,3,2,2,0,0,0,0,0,0,1,2,1,1,2,1,1,1,4,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,2,0,4,2,0,2,1,2,1,1,0,3,1,1,1,1,1,1,3,1,2,0,2,1,2,1,0,1,2,2,1,0,1,1,2,2,1,3,2,0,2,0,1,4,2,1,2,2,0,1,1,4,1,0,1,2,1,0,1,2,1,0,1,0,2,1,2,0,3,1,0,0,1,2,1,1,0,3,1,1,1,1,1,1,1,0,1,1,0,2,0,0,1,3,0,1,4,2,0,1,0,0,0,2,0,1,0,1,2,1,1,2,2,2,0,2,2,0,3,1,1,0,3,1,2,0,1,1,1,0,0,0,0,1,1,0,3,2,1,4,1,0,1,1,1,1,3,0,0,1,1,1,0,0,0,0,0,1,0,0,1,1,0,2,0,2,2,0,1,0,0,1,0,0,0,0,1,2,1,1,1,1,1,1,1,2,0,5,2,1,2,2,2,1,2,0,0,2,1,3,1,1,1,0,0,1,3,1,2,1,2,2,1,0,4,0,2,2,2,2,0,1,0,1,1,2,1,5,1,0,1,0,2,2,1,0,2,0,1,1,0,0,1,2,0,0,0,2,2,1,1,0,1,3,0,1,0,1,0,2,3,3,4,1,2,1,2,1,0,0,1,1,1,1,1,2,1,1,1,1,1,0,0,1,2,0,2,0,0,0,0,2,0,0,2,2,2,2,1,0,1,1,3,0,0,1,1,1,0,2,0,2,1,1,0,0,0,2,1,2,1,1,2,1,2,3,1,0,1]},{"counters":[1,1,0,2,0,0,2,1,0,0,1,2,0,0,0,2,0,0,0,2,1,1,0,1,0,1,2,1,1,0,1,1,1,2,0,3,0,0,0,1,1,0,0,0,2,2,0,0,1,0,2,0,1,4,1,3,1,1,0,0,2,2,0,2,2,0,1,1,0,0,2,1,0,0,2,0,2,1,1,1,1,0,1,0,1,1,6,0,1,1,0,1,2,3,3,1,1,2,0,1,0,2,0,0,0,0,0,0,3,0,0,2,1,0,1,2,2,0,1,2,0,0,2,3,2,1,1,0,2,3,0,2,1,0,2,1,1,0,0,0,0,0,0,1,2,0,0,1,2,0,2,1,0,1,1,0,0,2,0,3,1,1,0,0,2,2,2,1,0,0,0,0,0,2,1,0,0,1,0,0,0,2,0,0,0,0,2,2,0,0,1,0,1,1,1,0,0,0,3,1,2,1,0,1,0,3,1,3,0,1,3,0,2,3,0,2,0,1,0,0,0,0,1,2,0,2,0,0,1,3,1,0,0,0,1,1,1,1,0,2,0,1,2,1,1,1,1,0,0,2,5,5,2,2,0,0,0,2,0,1,2,0,1,0,2,2,1,1,3,1,1,1,1,0,1,1,1,0,1,0,3,1,1,1,3,1,1,2,1,1,0,2,1,0,1,2,2,1,2,1,0,2,0,0,3,0,0,1,0,0,2,2,0,1,2,0,1,0,1,0,0,0,1,1,0,1,0,2,1,1,1,2,3,1,2,3,0,0,2,0,0,0,3,0,0,3,2,0,0,0,1,0,0,2,2,1,1,0,1,2,0,0,3,1,1,0,2,0,0,2,0,2,1,1,2,1,2,2,0,2,2,2,3,2,1,1,1,1,1,1,0,0,1,2,1,1,2,1,1,0,1,1,1,1,2,1,0,1,1,0,0,1,0,0,0,1,0,1,0,1,2,1,1,0,1,2,2,1,0,1,0,0,0,3,1,1,2,0,0,1,2,1,1,3,0,2,1,0,1,0,1,1,2,0,2,1,1,1,1,2,0,2,3,1,1,0,0,1,1,1,0,0,1,0,1,0,0,0,0,1,1,0,0,0,1,0,2,1,1,0,2,3,1,0,1,0,4,0,0,0,1,2,3,1,5,0,3,2,0,0,1,0,0,1,1,0,1,0,0,1,2,2,0,0,1,2,1,1,1,2,2,4,0,0,2,2,1,1,1,4,1,0,1,2,2,0,1,2,0,1,0,1,0,1,0,0,3,1,1,0,0,2,0,0,1,1,0,0,1,0,2,0,1,2,1,1,1,0,0,1,2,2,1,1,1,1,4,1,2,2,2,1,1,1,1,1,1,0,1,4,0,1,0,3,1,1,0,2,0,1,0,1,2,1,1,1,0,0,1,1,1,0,0,2,1,1,1,0,1,0,1,1,2,1,3,2,0,0,1,1,1,0,0,1,2,1,0,0,0,1,1,1,1,1,0,1,0,1,2,2,1,2,1,0,0,1,0,0,1,1,2,1,1,1,2,2,0,0,2,1,5,1,0,0,1,2,1,1,1,0,3,1,0,1,1,1,1,0,2,2,3,0,2,1,1,1,1,1,0,1,2,3,0,1,1,1,0,3,0,5,2,1,1,0,0,0,0,0,2,0,2,1,1,1,0,2,2,1,1,2,1,3,2,1,0,0,1,1,2,0,0,0,2,1,0,1,1,1,0,2,2,1,2,1,1,0,1,2,1,1,1,0,1,0,1,1,0,0,4,3,1,0,0,3,0,0,1,2,0,2,1,1,1,2,3,1,1,3,2,1,2,0,0,0,1,1,1,0,0,1,0,2,0,0,1,3,0,1,0,1,0,2,1,3,1,3,2,4,2,2,1,0,1,0,2,0,1,1,3,0,1,1,0,0,0,0,0,2,1,0,1,1,1,1,0,2,0,0,1,0,2,0,0,1,0,1,3,1,2,0,2,0,2,1,0,0,2,1,0,2,1,1,2,2,2,1,2,1,3,1,2,1,0,2,3,1,1,0,4,0,3,1,4,0,0,1,0,3,0,3,0,1,2,3,0,2,0,0,0,0,0,1,1,3,0,2,1,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,1,1,1,1,1,2,1,1,2,0,1,0,1,1,1,0,0,0,0,0,2,0,0,1,2,4,0,2,1,0,1,1,4,0,1,0,1,2,0,0,0,0,1,2,3,0,1,1,1,1,0,4,4,4,0,2,2,2,0,0,1,1,0,2,2,1,1,3,1,1,0,1,4,0,1,0,0,2,0,0,0,1,2,3,1,0,0,0,2,0,0,1,2,1,4,1,0,0,1,0,1,1,1,0,0,1,0,2,2,1,0,1,1,1,0,1,4,2,1,0,0,1,1,2,1,1,0,3,0,4,1,0,0,0,1,1,1,1,2,2,1,1,0,2,1,3,2,0,1,0,0,2,0,0,0,2,2,1,1,0,1,2,1,0,1,0,2,0,0,1,1,1,0,0,2,1,1,5,2,0,2,1,0,0,2,1,1,0,0,2,2,0,1,1,1,4,1,2,0,1,2,1,1,1,3,0,2,3,0,0,0,0,1,1,1,3,1,1,1,1,1,0,2,1,0,1,1,1,1,0,4,0,3,0,0,2,1,1,0,1,0,0,0,1,2,1,1,1,2,1,2,1,1,0,0,2,1,0,1,0,1,0,2,0,2,1,0,2,1,0,1,3,1,0,1,1,0,0,1,1,0,1,0,0,2,0,0,1,2,1,1,1,0,0,1,0,1,0,0,2,1,1,0,1,0,0,1,2,0,1,2,0,0,0,0,1,2,3,0,0,2,0,1,0,1,0,1,2,0,0,0,1,0,1,0,1,0,3,2,0,1,1,1,2,0,0,0,0,0,2,0,1,1,0,0,0,0,2,0,0,0,0,1,1,0,1,2,0,2,2,0,1,0,1,0,0,0,1,0,2,1,0,0,1,3,1,1,0,3,0,1,0,2,2,1,0,0,1,1,0,0,0,0,0,1,0,0,0,2,0,1,1,1,2,2,0,0,1,0,0,0,1,2,3,1,1,0,0,1,1,0,1,2,1,2,1,1,3,2,1,3,0,0,0,0,0,0,3,0,1,0,3,1,2,2,2,0,1,2,1,3,2,0,2,1,2,0,2,0,2,0,1,0,1,0,0,0,0,2,0,1,4,1,0,1,1,0,0,1,1,1,0,0,0,0,3,1,1,1,1,1,1,0,3,4,1,1,1,1,1,2,1,0,1,1,1,2,0,1,0,0,3,3,0,1,2,1,0,1,1,0,1,0,1,1,0,4,0,1,0,0,3,1,0,4,1,1,0,3,2,1,1,0,1,3,2,0,1,0,2,0,0,0,1,3,2,0,0,1,0,0,2,2,1,0,1,2,2,1,0,3,1,2,2,3,3,0,0,0,0,2,1,1,1,2,1,0,1,0,3,2,0,0,0,1,1,2,1,0,1,0,0,2,5,0,1,1,0,0,1,1,0,1,3,2,0,1,2,1,2,0,1,0,2,2,1,0,1,3,1,1,1,0,3,2,1,1,0,0,3,2,0,2,0,1,2,0,0,0,1,0,2,0,1,0,1,1,1,2,2,0,0,0,0,0,0,0,1,0,0,1,3,0,1,1,1,1,0,2,3,1,2,0,0,1,0,1,1,0,2,2,0,0,1,1,1,1,4,0,2,1,0,0,1,0,1,1,2,0,0,0,2,0,0,2,1,2,2,1,0,2,1,0,1,0,0,2,1,1,0,1,1,0,0,1,1,0,1,0,1,0,1,1,0,1,1,0,0,0,0,1,2,1,0,1,2,1,4,1,1,1,3,2,0,3,0,0,1,1,1,1,1,1,1,2,0,1,0,1,0,2,3,0,0,2,2,0,0,1,0,3,1,0,0,0,0,1,0,1,1,1,1,0,0,1,1,3,1,1,1,3,0,0,2,0,0,2,1,4,3,1,0,0,1,0,1,1,2,0,4,1,3,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,2,4,0,2,0,0,0,1,0,0,1,1,2,0,1,1,0,0,0,3,0,1,1,2,2,2,2,0,3,1,0,1,1,1,1,0,2,1,1,1,1,1,1,0,2,2,1,1,3,1,0,0,2,1,2,2,2,1,3,1,5,1,0,2,1,1,1,1,1,2,0,2,1,1,1,2,0,1,0,2,2,0,3,2,1,0,0,1,1,1,0,3,0,2,1,0,0,0,2,2,1,0,1,1,0,2,0,1,1,2,0,2,1,4,0,1,0,3,1,0,0,0,0,0,0,3,2,1,0,0,1,2,0,1,1,0,0,0,0,1,1,2,0,1,1,0,2,0,1,0,0,0,4,1,1,1,0,0,1,2,0,2,0,1,1,1,1,0,0,1,0,0,0,3,0,1,0,0,1,1,2,3,0,0,1,1,1,4,0,1,2,0,1,3,0,2,0,2,1,0,0,2,1,0,1,2,1,0,0,1,1,0,2,0,1,2,1,1,1,1,2,2,2,0,2,1,1,2,1,1,0,1,1,2,2,0,1,2,2,1,0,0,0,1,1,2,1]}]},"null_count":0,"last_update_version":397952051032621056},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDY0MDE5NTU=","upper_bound":"LTIxMzUxODA1NDU=","repeats":1},{"count":16,"lower_bound":"LTIxMzAwMTk5Mjk=","upper_bound":"LTIxMTQ5MTcwNjM=","repeats":1},{"count":24,"lower_bound":"LTIxMTQ0NzUxNTY=","upper_bound":"LTIxMDA0MDE0MTI=","repeats":1},{"count":32,"lower_bound":"LTIwOTgyMzg5MzI=","upper_bound":"LTIwOTYxODMzMzI=","repeats":1},{"count":40,"lower_bound":"LTIwOTQyODgyMDI=","upper_bound":"LTIwNzMyNzgzODY=","repeats":1},{"count":48,"lower_bound":"LTIwNjcxNDU5ODA=","upper_bound":"LTIwNDk2NTY3ODE=","repeats":1},{"count":56,"lower_bound":"LTIwNDkyNTMxMDY=","upper_bound":"LTIwMTA3MTQxNjg=","repeats":1},{"count":64,"lower_bound":"LTIwMTA1MzgyMDY=","upper_bound":"LTIwMDA1Njg4Mjc=","repeats":1},{"count":72,"lower_bound":"LTE5OTY5MTMxNTM=","upper_bound":"LTE5NzQzOTYzOTc=","repeats":1},{"count":80,"lower_bound":"LTE5NzIyMDMzNzI=","upper_bound":"LTE5NDcxMTQyNTE=","repeats":1},{"count":88,"lower_bound":"LTE5NDAzODI1NDM=","upper_bound":"LTE5MzMzMjA4NTU=","repeats":1},{"count":96,"lower_bound":"LTE5Mjk0MTIwMzc=","upper_bound":"LTE5MTM3NjY0MTY=","repeats":1},{"count":104,"lower_bound":"LTE5MDA5ODQ5MzE=","upper_bound":"LTE4ODY0NDg3Mjk=","repeats":1},{"count":112,"lower_bound":"LTE4ODE4MDI3MDQ=","upper_bound":"LTE4NzQwMjcwNDY=","repeats":1},{"count":120,"lower_bound":"LTE4NjU1NTMwNzk=","upper_bound":"LTE4NTY4MTA5MzI=","repeats":1},{"count":128,"lower_bound":"LTE4NTMxODE0MjI=","upper_bound":"LTE4NDM2OTI4MTE=","repeats":1},{"count":136,"lower_bound":"LTE4NDI2NDkxNzM=","upper_bound":"LTE4MzI2MTA3MTQ=","repeats":1},{"count":144,"lower_bound":"LTE4MzAxNTc5NTI=","upper_bound":"LTE3OTc3NjUyNjg=","repeats":1},{"count":152,"lower_bound":"LTE3OTUzMTU4NjY=","upper_bound":"LTE3NzUyMDg4MzY=","repeats":1},{"count":160,"lower_bound":"LTE3NzQwNDMwMDU=","upper_bound":"LTE3NzEwODk0NTQ=","repeats":1},{"count":168,"lower_bound":"LTE3NzAyOTk0OTk=","upper_bound":"LTE3NTA3NTU2NTU=","repeats":1},{"count":176,"lower_bound":"LTE3MzcxNTA3NDU=","upper_bound":"LTE3MjM0MzEyMDY=","repeats":1},{"count":184,"lower_bound":"LTE3MjIwNzI1Njk=","upper_bound":"LTE3MTQ4NzIzNzE=","repeats":1},{"count":192,"lower_bound":"LTE3MDk2NjM1OTA=","upper_bound":"LTE3MDAyMDQ4NTc=","repeats":1},{"count":200,"lower_bound":"LTE2OTc3MDU2NTk=","upper_bound":"LTE2ODk4OTkyNTg=","repeats":1},{"count":208,"lower_bound":"LTE2ODYzNzEyODM=","upper_bound":"LTE2ODA2MzczMDg=","repeats":1},{"count":216,"lower_bound":"LTE2Njg4MjAwMjM=","upper_bound":"LTE2NDUxMzA2MzA=","repeats":1},{"count":224,"lower_bound":"LTE2MzIxNDAzODE=","upper_bound":"LTE2MjMxNzIyOTE=","repeats":1},{"count":232,"lower_bound":"LTE2MTg4NTU5Njk=","upper_bound":"LTE1OTkxNTA5NTQ=","repeats":1},{"count":240,"lower_bound":"LTE1ODk4NTM4NTk=","upper_bound":"LTE1NzE2MTUzNDk=","repeats":1},{"count":248,"lower_bound":"LTE1Njg1MDAwNzk=","upper_bound":"LTE1NjIwMDI3NDE=","repeats":1},{"count":256,"lower_bound":"LTE1NTQxNjYwMDU=","upper_bound":"LTE1NDQxMjg1MDQ=","repeats":1},{"count":264,"lower_bound":"LTE1NDMyNTYyODk=","upper_bound":"LTE1MjQyMTI0NzA=","repeats":1},{"count":272,"lower_bound":"LTE1MjEzNzQ4NjY=","upper_bound":"LTE1MTAyMDU4OTk=","repeats":1},{"count":280,"lower_bound":"LTE1MDc5ODM4NTc=","upper_bound":"LTE0OTU3NTkxNDU=","repeats":1},{"count":288,"lower_bound":"LTE0OTE5NjMyOTY=","upper_bound":"LTE0NjU3MDA3MzI=","repeats":1},{"count":296,"lower_bound":"LTE0NjQzNDI2Mjc=","upper_bound":"LTE0NTQ3MTQ5NDc=","repeats":1},{"count":304,"lower_bound":"LTE0Mzk3NDEyMTU=","upper_bound":"LTE0MTc2OTg2MzQ=","repeats":1},{"count":312,"lower_bound":"LTE0MTMwMTg2ODA=","upper_bound":"LTE0MDYwNjc4ODI=","repeats":1},{"count":320,"lower_bound":"LTE0MDUxMzIxNTc=","upper_bound":"LTE0MDAyMjQ0NjY=","repeats":1},{"count":328,"lower_bound":"LTEzODkzODk0NTk=","upper_bound":"LTEzNzgwOTUyMTI=","repeats":1},{"count":336,"lower_bound":"LTEzNzE1NzAyMzY=","upper_bound":"LTEzNTQxNzgyMTM=","repeats":1},{"count":344,"lower_bound":"LTEzNDQ5NzA2MjE=","upper_bound":"LTEzNDE2OTM5OTM=","repeats":1},{"count":352,"lower_bound":"LTEzMzc1NjYxMDE=","upper_bound":"LTEzMzE2MzM1MzA=","repeats":1},{"count":360,"lower_bound":"LTEzMzE2MzI2Njc=","upper_bound":"LTEzMTczODkwNTk=","repeats":1},{"count":368,"lower_bound":"LTEzMTEwMDcyMzk=","upper_bound":"LTEyOTc1ODgyNDE=","repeats":1},{"count":376,"lower_bound":"LTEyOTUzNzU1Mzc=","upper_bound":"LTEyOTAxNTM4NTY=","repeats":1},{"count":384,"lower_bound":"LTEyODkwNTIwMTc=","upper_bound":"LTEyNzQ1MjA4MjY=","repeats":1},{"count":392,"lower_bound":"LTEyNzE0NTE5NDc=","upper_bound":"LTEyNTk1ODQ2MDk=","repeats":1},{"count":400,"lower_bound":"LTEyNTgwODIwNzg=","upper_bound":"LTEyNTI2MjkzMjE=","repeats":1},{"count":408,"lower_bound":"LTEyNTE4ODQ3Njk=","upper_bound":"LTEyNDY1MzQyOTE=","repeats":1},{"count":416,"lower_bound":"LTEyNDM4OTUyODE=","upper_bound":"LTEyMzk5MDU2Njk=","repeats":1},{"count":424,"lower_bound":"LTEyMjQ4OTg4MTY=","upper_bound":"LTEyMTk4NzIwMzM=","repeats":1},{"count":432,"lower_bound":"LTEyMTM0NTA5MzM=","upper_bound":"LTEyMTI2NjYyNjk=","repeats":1},{"count":440,"lower_bound":"LTEyMDIxMzc5NTk=","upper_bound":"LTExODE2Njg2ODg=","repeats":1},{"count":448,"lower_bound":"LTExNzY0OTczOTA=","upper_bound":"LTExNjYxODEwMTg=","repeats":1},{"count":456,"lower_bound":"LTExNjU3NjA2MTk=","upper_bound":"LTExNTc1NTU4MTI=","repeats":1},{"count":464,"lower_bound":"LTExNTE3NDY3Nzg=","upper_bound":"LTExMzY4ODA2MDY=","repeats":1},{"count":472,"lower_bound":"LTExMzQ4MTA4ODU=","upper_bound":"LTExMjk5NjAyMzI=","repeats":1},{"count":480,"lower_bound":"LTExMjkxOTM2NDA=","upper_bound":"LTExMjEzNjQ0Mjk=","repeats":1},{"count":488,"lower_bound":"LTExMjEwMDAzMTc=","upper_bound":"LTExMDE5NjUxMjA=","repeats":1},{"count":496,"lower_bound":"LTExMDAyODgxODM=","upper_bound":"LTEwODk0MzQ4NzU=","repeats":1},{"count":504,"lower_bound":"LTEwODgxMjM1MTI=","upper_bound":"LTEwODY3ODEzNTg=","repeats":1},{"count":512,"lower_bound":"LTEwODQ3MTEwMDU=","upper_bound":"LTEwODI0ODc4OTg=","repeats":1},{"count":520,"lower_bound":"LTEwODA2MTMxMTI=","upper_bound":"LTEwNjI1MTk2Mzk=","repeats":1},{"count":528,"lower_bound":"LTEwNTk3MjI3ODE=","upper_bound":"LTEwNTc0ODkyNjU=","repeats":1},{"count":536,"lower_bound":"LTEwNTYxNzU3OTU=","upper_bound":"LTEwNDYzMjY0NTA=","repeats":1},{"count":544,"lower_bound":"LTEwNDQ0MDMzODA=","upper_bound":"LTEwMzczMTg0NDY=","repeats":1},{"count":552,"lower_bound":"LTEwMzM5MjQxMzc=","upper_bound":"LTEwMTQ2NDYwMDU=","repeats":1},{"count":560,"lower_bound":"LTEwMTQ0NzEwMjg=","upper_bound":"LTEwMDE3OTg3OTM=","repeats":1},{"count":568,"lower_bound":"LTk5Nzc4NzE4Nw==","upper_bound":"LTk4MTY0MDkwMQ==","repeats":1},{"count":576,"lower_bound":"LTk3OTcyMjE1NA==","upper_bound":"LTk3NDMxOTcyMA==","repeats":1},{"count":584,"lower_bound":"LTk2NzAzMDg3NQ==","upper_bound":"LTk1MzA2MDczNw==","repeats":1},{"count":592,"lower_bound":"LTk1MjA0MTk0Ng==","upper_bound":"LTkyMzg0NTYxOA==","repeats":1},{"count":600,"lower_bound":"LTkxMzIyNjU0NA==","upper_bound":"LTg5NzE0NjkwMg==","repeats":1},{"count":608,"lower_bound":"LTg5NDAwMzkzOQ==","upper_bound":"LTg4ODY4MzI5Ng==","repeats":1},{"count":616,"lower_bound":"LTg4ODMzODUyNA==","upper_bound":"LTg3MjE1MDMwMA==","repeats":1},{"count":624,"lower_bound":"LTg2NTk0OTAzOA==","upper_bound":"LTg1NDQ2NTQzMA==","repeats":1},{"count":632,"lower_bound":"LTg0MTY4OTUyOA==","upper_bound":"LTgzNjUxNjQwNQ==","repeats":1},{"count":640,"lower_bound":"LTgzNjIzMjU2Mg==","upper_bound":"LTgyODMyNDU0Nw==","repeats":1},{"count":648,"lower_bound":"LTgyNDM0MTUwNQ==","upper_bound":"LTgxODgyNDE0OQ==","repeats":1},{"count":656,"lower_bound":"LTgxMzMyODQ2Nw==","upper_bound":"LTc4OTMwOTIxOA==","repeats":1},{"count":664,"lower_bound":"LTc3ODMzNTI2NQ==","upper_bound":"LTc2NDQwOTYzMQ==","repeats":1},{"count":672,"lower_bound":"LTc2MTg5Njc0NA==","upper_bound":"LTczNTA0MTA4Ng==","repeats":1},{"count":680,"lower_bound":"LTczMjI2MTI4NA==","upper_bound":"LTcwMjE1MjcxMQ==","repeats":1},{"count":688,"lower_bound":"LTY5NzM3ODU4Mw==","upper_bound":"LTY4OTIzMDM2OA==","repeats":1},{"count":696,"lower_bound":"LTY4NzUzMTY2MA==","upper_bound":"LTY3ODc2NDU4Ng==","repeats":1},{"count":704,"lower_bound":"LTY3Njc3MzAwOQ==","upper_bound":"LTY2OTk0NDUxOA==","repeats":1},{"count":712,"lower_bound":"LTY2MzMyMjMxNw==","upper_bound":"LTY1MjA5Mzc3NQ==","repeats":1},{"count":720,"lower_bound":"LTY1MTU3NTc0Nw==","upper_bound":"LTY0MjQ4NTExMw==","repeats":1},{"count":728,"lower_bound":"LTYzNTc5OTM0Mw==","upper_bound":"LTYxNjA5NjQ4Nw==","repeats":1},{"count":736,"lower_bound":"LTYxNDE5MDkyMg==","upper_bound":"LTYwNzUwNzI5OA==","repeats":1},{"count":744,"lower_bound":"LTYwNTM3NDcyOQ==","upper_bound":"LTU5OTM2Mjc3MA==","repeats":1},{"count":752,"lower_bound":"LTU5MTc3MDE4OQ==","upper_bound":"LTU2NDY3NTcxOA==","repeats":1},{"count":760,"lower_bound":"LTU1NjEyNjY5Mw==","upper_bound":"LTU0NDcxNTg0NQ==","repeats":1},{"count":768,"lower_bound":"LTU0MzgzMjEwMw==","upper_bound":"LTUzMzUxOTMzMg==","repeats":1},{"count":776,"lower_bound":"LTUzMDkwOTYwOA==","upper_bound":"LTUyMjcwNjg4Ng==","repeats":1},{"count":784,"lower_bound":"LTUxODY2NzU3MQ==","upper_bound":"LTUwNjU0MDUwOA==","repeats":1},{"count":792,"lower_bound":"LTUwNTAxNjU5Mw==","upper_bound":"LTQ3OTkyOTMyMg==","repeats":1},{"count":800,"lower_bound":"LTQ3ODM1NTcyOA==","upper_bound":"LTQ2OTI0NDEwMw==","repeats":1},{"count":808,"lower_bound":"LTQ2OTE3MDg1OQ==","upper_bound":"LTQ2MTAyODQ0OA==","repeats":1},{"count":816,"lower_bound":"LTQ1NTQwNTQyNA==","upper_bound":"LTQ0ODI4MTU0MQ==","repeats":1},{"count":824,"lower_bound":"LTQzOTc2MzY4MA==","upper_bound":"LTQzMDc0MTAyOQ==","repeats":1},{"count":832,"lower_bound":"LTQyOTI2OTQxNg==","upper_bound":"LTQwMzM2NTkwMQ==","repeats":1},{"count":840,"lower_bound":"LTQwMTk3MDQyOQ==","upper_bound":"LTM5MDg0NjEwOA==","repeats":1},{"count":848,"lower_bound":"LTM4NzY3NDAwNQ==","upper_bound":"LTM3NDkwNzA2Mw==","repeats":1},{"count":856,"lower_bound":"LTM3MDAzMTg3MQ==","upper_bound":"LTM2NzMyMDYxMA==","repeats":1},{"count":864,"lower_bound":"LTM2NDE4ODA4Nw==","upper_bound":"LTM0MTMwMTI0Nw==","repeats":1},{"count":872,"lower_bound":"LTM0MDM2NDU5NQ==","upper_bound":"LTMzMjE5MTU3OA==","repeats":1},{"count":880,"lower_bound":"LTMzMTkwODczMQ==","upper_bound":"LTMyMzM0NDE4MA==","repeats":1},{"count":888,"lower_bound":"LTMyMTg3NzYzOA==","upper_bound":"LTMwODAxMDYxOA==","repeats":1},{"count":896,"lower_bound":"LTMwNjM5MzgxMA==","upper_bound":"LTI4MjEyMzEzNA==","repeats":1},{"count":904,"lower_bound":"LTI3MjU2MTY1NQ==","upper_bound":"LTI1MDQxNTMzNA==","repeats":1},{"count":912,"lower_bound":"LTI0NzE3NTAyOQ==","upper_bound":"LTIyODYwMDIzOA==","repeats":1},{"count":920,"lower_bound":"LTIyNTQ2OTE0MQ==","upper_bound":"LTIwOTQ5NTcyNA==","repeats":1},{"count":928,"lower_bound":"LTIwMzkxMDE2Mg==","upper_bound":"LTIwMTc3NDc1Mg==","repeats":1},{"count":936,"lower_bound":"LTIwMDQ3ODY5NQ==","upper_bound":"LTE4NTE0NzM3NA==","repeats":1},{"count":944,"lower_bound":"LTE3ODk4MDk2OQ==","upper_bound":"LTE2NzkxODg1Nw==","repeats":1},{"count":952,"lower_bound":"LTE2NzA0NDc5NA==","upper_bound":"LTE1NzM0NzM5Mw==","repeats":1},{"count":960,"lower_bound":"LTE0NDkzNjU0Ng==","upper_bound":"LTEzNjIwMTg1MA==","repeats":1},{"count":968,"lower_bound":"LTEzMjM0MzE4Nw==","upper_bound":"LTExNDYxMDQxNA==","repeats":1},{"count":976,"lower_bound":"LTExMDE2NTUzNw==","upper_bound":"LTg5MDc0Mjcz","repeats":1},{"count":984,"lower_bound":"LTg0NTAxNDc2","upper_bound":"LTcyMzM2NjA3","repeats":1},{"count":992,"lower_bound":"LTcwMjIzMDAw","upper_bound":"LTUyOTQ0NjQ5","repeats":1},{"count":1000,"lower_bound":"LTUyMDExNDcw","upper_bound":"LTQxNTE4NDM4","repeats":1},{"count":1008,"lower_bound":"LTM5MjA4MTY3","upper_bound":"LTMxMjk3NDg2","repeats":1},{"count":1016,"lower_bound":"LTI0NDQwMjQx","upper_bound":"LTExMjQ1NDYy","repeats":1},{"count":1024,"lower_bound":"LTk3MDMzNzQ=","upper_bound":"LTU4NDMxNDQ=","repeats":1},{"count":1032,"lower_bound":"LTI2MTM2NjM=","upper_bound":"NzgzMDAxMw==","repeats":1},{"count":1040,"lower_bound":"ODc4ODAzOA==","upper_bound":"MTc1MjQ2MDk=","repeats":1},{"count":1048,"lower_bound":"MTk2MzQ2MzI=","upper_bound":"MzQ3Mjg4Nzk=","repeats":1},{"count":1056,"lower_bound":"NDI4MzE2Mjg=","upper_bound":"NDczMzk3NjI=","repeats":1},{"count":1064,"lower_bound":"NTg4ODk2NTU=","upper_bound":"NzM1MzIwODM=","repeats":1},{"count":1072,"lower_bound":"NzY3NjEyNTE=","upper_bound":"ODkzMTk3MTU=","repeats":1},{"count":1080,"lower_bound":"MTAzMDM5ODA0","upper_bound":"MTQ2ODkwODQw","repeats":1},{"count":1088,"lower_bound":"MTQ5ODUxMTI0","upper_bound":"MTU0ODMyMTQ1","repeats":1},{"count":1096,"lower_bound":"MTU4MjcyNzM0","upper_bound":"MTY0MzE3NTcw","repeats":1},{"count":1104,"lower_bound":"MTY0NTM0ODk1","upper_bound":"MTkxMTI3MTAy","repeats":1},{"count":1112,"lower_bound":"MTk0NzQwNTkw","upper_bound":"MjAxOTk2ODk3","repeats":1},{"count":1120,"lower_bound":"MjAyMjkyNDgx","upper_bound":"MjA3OTYxNzgz","repeats":1},{"count":1128,"lower_bound":"MjA5MDk5NjE2","upper_bound":"MjI5NDMzOTky","repeats":1},{"count":1136,"lower_bound":"MjMxODA2Nzc3","upper_bound":"MjYwOTA0Mzc0","repeats":1},{"count":1144,"lower_bound":"MjY2MzA0NDUw","upper_bound":"Mjg0NjUxODA4","repeats":1},{"count":1152,"lower_bound":"MjkxMTQ3ODcy","upper_bound":"Mjk0NTEzNDI4","repeats":1},{"count":1160,"lower_bound":"MzAwNTM4MDY2","upper_bound":"MzEyODcxNTQ3","repeats":1},{"count":1168,"lower_bound":"MzIxNTY4NTk0","upper_bound":"MzIzNzQ5NTgy","repeats":1},{"count":1176,"lower_bound":"MzIzOTE3NjY0","upper_bound":"MzI3ODY1NzM5","repeats":1},{"count":1184,"lower_bound":"MzI3OTM1MDEy","upper_bound":"MzQ0NTA4ODkw","repeats":1},{"count":1192,"lower_bound":"MzQ4ODk5ODI4","upper_bound":"MzYwOTE5ODky","repeats":1},{"count":1200,"lower_bound":"MzYyNDM0MTA0","upper_bound":"MzY3OTkzNDQx","repeats":1},{"count":1208,"lower_bound":"Mzc2ODk3MTE0","upper_bound":"NDA5NTMwNTcw","repeats":1},{"count":1216,"lower_bound":"NDEwMjEzMTk3","upper_bound":"NDIwNDU5NzM1","repeats":1},{"count":1224,"lower_bound":"NDIzOTk5Nzg0","upper_bound":"NDM1ODk2OTEx","repeats":1},{"count":1232,"lower_bound":"NDM3OTI1NjI3","upper_bound":"NDQyODUzMzgz","repeats":1},{"count":1240,"lower_bound":"NDQ2MTI5ODU5","upper_bound":"NDUxNDUwNTI5","repeats":1},{"count":1248,"lower_bound":"NDU4MDg5NjEw","upper_bound":"NDczMDMyNzE1","repeats":1},{"count":1256,"lower_bound":"NDg0Njc5OTgw","upper_bound":"NTAxMjM2MDk2","repeats":1},{"count":1264,"lower_bound":"NTA5MzQyNDEx","upper_bound":"NTE2OTkyNTQ4","repeats":1},{"count":1272,"lower_bound":"NTE3MTk5NzI0","upper_bound":"NTI5OTcwNzY3","repeats":1},{"count":1280,"lower_bound":"NTQyODA3NzY2","upper_bound":"NTU0MzgwNTE0","repeats":1},{"count":1288,"lower_bound":"NTU3MzY0OTQ5","upper_bound":"NTc1ODg5MzY5","repeats":1},{"count":1296,"lower_bound":"NTg0MTIzMzQw","upper_bound":"NTkxMjYyMTE2","repeats":1},{"count":1304,"lower_bound":"NTkyMzA5ODMw","upper_bound":"NjA1ODUwNTU5","repeats":1},{"count":1312,"lower_bound":"NjA3NTg5Nzkw","upper_bound":"NjIyMzI2NzY3","repeats":1},{"count":1320,"lower_bound":"NjQzNTgwMjk5","upper_bound":"NjUxMTIxODg2","repeats":1},{"count":1328,"lower_bound":"NjU0MzMzNTM3","upper_bound":"Njg0Nzk3OTEy","repeats":1},{"count":1336,"lower_bound":"NjkzMzk0MTA0","upper_bound":"NzI3ODIxNTYx","repeats":1},{"count":1344,"lower_bound":"NzM5Njc5NTc3","upper_bound":"NzU1ODIyMTEx","repeats":1},{"count":1352,"lower_bound":"NzU4MDQxMTY1","upper_bound":"NzY1Nzc3OTM4","repeats":1},{"count":1360,"lower_bound":"NzY2NjI1MDQ0","upper_bound":"NzcwOTI1MDIx","repeats":1},{"count":1368,"lower_bound":"Nzc5NzEzMzIy","upper_bound":"Nzg5MjY0MjMx","repeats":1},{"count":1376,"lower_bound":"NzkwNTI4NDIy","upper_bound":"ODEwMTI0MzAy","repeats":1},{"count":1384,"lower_bound":"ODE0MzExNjY1","upper_bound":"ODI4MDQ2NzI0","repeats":1},{"count":1392,"lower_bound":"ODM0Njk1Njk1","upper_bound":"ODQyNjYxNDQw","repeats":1},{"count":1400,"lower_bound":"ODYwMTE1MzQx","upper_bound":"ODcyOTczMzE5","repeats":1},{"count":1408,"lower_bound":"ODc1NTkzMTQz","upper_bound":"ODg5NTcxNzUw","repeats":1},{"count":1416,"lower_bound":"ODkwNjc1NzQw","upper_bound":"ODk2NDc0NTcz","repeats":1},{"count":1424,"lower_bound":"ODk3MDk5MTA1","upper_bound":"OTAzMzgyOTg3","repeats":1},{"count":1432,"lower_bound":"OTAzNTAwODEz","upper_bound":"OTE0MzExOTQw","repeats":1},{"count":1440,"lower_bound":"OTE1NDkzNTIw","upper_bound":"OTIwMTgxMjQ3","repeats":1},{"count":1448,"lower_bound":"OTIxMzc0MzE1","upper_bound":"OTM0NTkwMDky","repeats":1},{"count":1456,"lower_bound":"OTQyMTQ1MDU4","upper_bound":"OTcxMzA0ODkx","repeats":1},{"count":1464,"lower_bound":"OTc3ODExMTcz","upper_bound":"MTAxMjg4NTcxNA==","repeats":1},{"count":1472,"lower_bound":"MTAxNDc5MDQ0Nw==","upper_bound":"MTAzMDQ3MjY1OQ==","repeats":1},{"count":1480,"lower_bound":"MTAzMTUyMTc2Mw==","upper_bound":"MTA0MzA4OTE4MA==","repeats":1},{"count":1488,"lower_bound":"MTA0Mzk0Njk4OQ==","upper_bound":"MTA1MjQ4NzY5Mw==","repeats":1},{"count":1496,"lower_bound":"MTA1NDc0MzM5MA==","upper_bound":"MTA2NDU1NTUzNg==","repeats":1},{"count":1504,"lower_bound":"MTA2Njc4MDkwMw==","upper_bound":"MTA3ODU4ODMwNw==","repeats":1},{"count":1512,"lower_bound":"MTA3OTk0MDgwNQ==","upper_bound":"MTA5MDY1NzIzMg==","repeats":1},{"count":1520,"lower_bound":"MTA5NTc0NzM5OQ==","upper_bound":"MTEwNjg5NTkyNA==","repeats":1},{"count":1528,"lower_bound":"MTEwODYyOTY0NQ==","upper_bound":"MTEyMzM3NzM4Nw==","repeats":1},{"count":1536,"lower_bound":"MTEyNTAyNjk4Ng==","upper_bound":"MTEzMTIwMzU5NA==","repeats":1},{"count":1544,"lower_bound":"MTEzNjA5MjM4Mg==","upper_bound":"MTE0ODE3MzEwMA==","repeats":1},{"count":1552,"lower_bound":"MTE1MTg2NTc4MA==","upper_bound":"MTE2MzQ4ODA5OQ==","repeats":1},{"count":1560,"lower_bound":"MTE2NDgzMDg5MA==","upper_bound":"MTE2NjY2MDg3Mg==","repeats":1},{"count":1568,"lower_bound":"MTE3ODczNTExMw==","upper_bound":"MTE4NjMxMDU4Nw==","repeats":1},{"count":1576,"lower_bound":"MTE5NDMwMjkwNw==","upper_bound":"MTIxMzYwMDYxOA==","repeats":1},{"count":1584,"lower_bound":"MTIxMzk2NDg1Nw==","upper_bound":"MTIzMTYxMzc3OA==","repeats":1},{"count":1592,"lower_bound":"MTI0MTA2MjIyMA==","upper_bound":"MTI0NjY0MDY0Nw==","repeats":1},{"count":1600,"lower_bound":"MTI0Njk5Mzc1Mg==","upper_bound":"MTI1ODA5MjE5Mw==","repeats":1},{"count":1608,"lower_bound":"MTI1ODY2MDE4NQ==","upper_bound":"MTI2MjgyNzM3NA==","repeats":1},{"count":1616,"lower_bound":"MTI2MzEyOTIzNg==","upper_bound":"MTI2ODQxOTI1NA==","repeats":1},{"count":1624,"lower_bound":"MTI2ODc2ODkwNw==","upper_bound":"MTI4MjU3MTgzNw==","repeats":1},{"count":1632,"lower_bound":"MTI4MzY1MzUzMA==","upper_bound":"MTI4NzU5NDk4Mw==","repeats":1},{"count":1640,"lower_bound":"MTI5OTMzODM0Nw==","upper_bound":"MTMwODgxNTU5MA==","repeats":1},{"count":1648,"lower_bound":"MTMxMjAxMjczNg==","upper_bound":"MTMyMjI2MjA1NQ==","repeats":1},{"count":1656,"lower_bound":"MTMzMDgyNDE3OQ==","upper_bound":"MTM0ODE3MTEzOA==","repeats":1},{"count":1664,"lower_bound":"MTM1NjE5MDE4Mw==","upper_bound":"MTM2MjI2MTE0Mg==","repeats":1},{"count":1672,"lower_bound":"MTM2NTEwNzY0NQ==","upper_bound":"MTM2NzM3MzI0MQ==","repeats":1},{"count":1680,"lower_bound":"MTM4MjM3Nzc4Mg==","upper_bound":"MTQxMDM0ODI0NQ==","repeats":1},{"count":1688,"lower_bound":"MTQxNjY2OTI3OQ==","upper_bound":"MTQzMjE3OTk2OQ==","repeats":1},{"count":1696,"lower_bound":"MTQzMzQ0MDAyOQ==","upper_bound":"MTQ0NTA5OTE5OA==","repeats":1},{"count":1704,"lower_bound":"MTQ0NjI5NjE2Nw==","upper_bound":"MTQ2MTc3NzIzMQ==","repeats":1},{"count":1712,"lower_bound":"MTQ3NjMwMzUyMQ==","upper_bound":"MTQ4NTE4NzQxMQ==","repeats":1},{"count":1720,"lower_bound":"MTQ4NTc5MzE2NQ==","upper_bound":"MTUxMTMwNDAyNw==","repeats":1},{"count":1728,"lower_bound":"MTUxNDkyNTg5Nw==","upper_bound":"MTU0MTE3NjA5Ng==","repeats":1},{"count":1736,"lower_bound":"MTU0MjAzMTk0Mg==","upper_bound":"MTU0NzYwOTEzNQ==","repeats":1},{"count":1744,"lower_bound":"MTU0ODIwOTc5OA==","upper_bound":"MTU1OTYyMjc1Ng==","repeats":1},{"count":1752,"lower_bound":"MTU2MTkzMDI5MQ==","upper_bound":"MTU2NTM2ODI3OA==","repeats":1},{"count":1760,"lower_bound":"MTU3MDg2MjM3MA==","upper_bound":"MTU4MTM4ODY1Mw==","repeats":1},{"count":1768,"lower_bound":"MTU4MjAxNTI0MA==","upper_bound":"MTU5Nzk2MzA3Ng==","repeats":1},{"count":1776,"lower_bound":"MTYxMTE3ODc5NA==","upper_bound":"MTYxNzY1Mjc5Nw==","repeats":1},{"count":1784,"lower_bound":"MTYyNDUyNDY3Nw==","upper_bound":"MTYyOTU1NjY3Ng==","repeats":1},{"count":1792,"lower_bound":"MTYzMTgxOTM0NA==","upper_bound":"MTY1MzYxMTU2Mg==","repeats":1},{"count":1800,"lower_bound":"MTY1ODk4NjgzMQ==","upper_bound":"MTY3MDQ4ODY0Nw==","repeats":1},{"count":1808,"lower_bound":"MTY3MDY4NDE2OQ==","upper_bound":"MTcwMTkyMTk1OQ==","repeats":1},{"count":1816,"lower_bound":"MTcxMTY3MTc1MA==","upper_bound":"MTcyMTMwNDcxNQ==","repeats":1},{"count":1824,"lower_bound":"MTcyMTg4NjgyMg==","upper_bound":"MTczMzA3OTI1Nw==","repeats":1},{"count":1832,"lower_bound":"MTc0MTk0MDk5Ng==","upper_bound":"MTc1ODg3MjQxMw==","repeats":1},{"count":1840,"lower_bound":"MTc2NDI1Nzk3Mw==","upper_bound":"MTc5MzIwOTU3Nw==","repeats":1},{"count":1848,"lower_bound":"MTc5MzY2MzAyMQ==","upper_bound":"MTgwNzQ2ODIxOQ==","repeats":1},{"count":1856,"lower_bound":"MTgxODQ3NjUyNQ==","upper_bound":"MTgyMzExNjMyNg==","repeats":1},{"count":1864,"lower_bound":"MTgzNzgzMjA3Nw==","upper_bound":"MTg1NDM1MzEyMQ==","repeats":1},{"count":1872,"lower_bound":"MTg1ODYyNTExNw==","upper_bound":"MTg4MjI3MzI0Mw==","repeats":1},{"count":1880,"lower_bound":"MTg5NzQ2ODE5NA==","upper_bound":"MTkwMjU3MDE2MA==","repeats":1},{"count":1888,"lower_bound":"MTkwNDYxOTg5OA==","upper_bound":"MTkxNjkyMTcwNA==","repeats":1},{"count":1896,"lower_bound":"MTkyMDc3NDg3OQ==","upper_bound":"MTkzOTQwNDg5MQ==","repeats":1},{"count":1904,"lower_bound":"MTk0MDIwMTkxOA==","upper_bound":"MTk1NjE1MDc4Nw==","repeats":1},{"count":1912,"lower_bound":"MTk2MTUyNTYyMQ==","upper_bound":"MTk4MjU5NzE5NQ==","repeats":1},{"count":1920,"lower_bound":"MTk5MjI3NDU0NQ==","upper_bound":"MTk5NzgzNTMwNw==","repeats":1},{"count":1928,"lower_bound":"MjAwNTY4NTg2NA==","upper_bound":"MjAxMTgwNTE2NA==","repeats":1},{"count":1936,"lower_bound":"MjAxMjIzNzE3Mg==","upper_bound":"MjAxNjUzMjY1OA==","repeats":1},{"count":1944,"lower_bound":"MjAyMDc4MzA4Nw==","upper_bound":"MjAzNzEzMzU5Ng==","repeats":1},{"count":1952,"lower_bound":"MjAzNzIwODM3MQ==","upper_bound":"MjA0NDc1NjI0Ng==","repeats":1},{"count":1960,"lower_bound":"MjA0NjE4NDUzNQ==","upper_bound":"MjA1MzE1NDIzMg==","repeats":1},{"count":1968,"lower_bound":"MjA1OTM3NjEwOQ==","upper_bound":"MjA2OTcyMTI1NQ==","repeats":1},{"count":1976,"lower_bound":"MjA3NjM2MDExOA==","upper_bound":"MjA4NDA1NzM2Mw==","repeats":1},{"count":1984,"lower_bound":"MjA4ODc0Nzk1Mg==","upper_bound":"MjEwMjMwNDcwNQ==","repeats":1},{"count":1992,"lower_bound":"MjEwODY4NzE3Nw==","upper_bound":"MjEyNzMwNDQ3NA==","repeats":1},{"count":2000,"lower_bound":"MjEzMjM4MDgwNA==","upper_bound":"MjE0MDQyNDMzNA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,0,2,2,1,1,0,2,0,0,1,1,0,0,0,0,0,2,2,3,0,0,1,3,2,0,1,0,2,1,0,1,0,0,1,0,2,2,0,0,2,1,0,0,1,0,0,1,0,3,0,2,1,0,0,0,0,2,0,2,1,1,1,3,0,1,0,3,2,2,1,1,2,1,0,3,1,3,0,2,1,1,1,2,2,2,1,0,0,2,1,1,2,0,1,1,2,1,0,0,2,0,0,0,0,1,0,0,1,1,0,2,0,1,0,1,0,1,2,0,2,1,3,1,1,1,0,0,0,2,2,1,1,3,3,0,2,1,0,0,0,0,1,1,0,1,0,1,1,0,0,0,3,2,2,0,2,1,0,1,0,1,1,2,0,1,1,0,1,1,0,0,2,1,1,2,1,0,0,0,1,4,0,0,1,1,2,1,0,1,4,1,1,1,0,0,3,2,0,1,1,0,0,1,2,1,0,1,1,1,1,2,1,2,0,0,4,1,2,1,1,0,0,1,1,1,0,1,1,4,2,0,1,1,1,0,1,2,1,3,0,0,1,0,0,0,3,1,1,0,0,1,1,2,1,2,1,0,2,0,1,1,0,4,0,0,1,1,0,2,0,2,1,0,1,0,0,1,0,2,1,0,1,1,0,1,1,1,1,1,1,0,0,0,1,1,0,1,1,0,1,0,2,1,1,0,3,0,0,0,1,1,0,1,1,0,1,1,1,1,0,0,1,2,0,1,2,1,0,1,0,0,1,0,0,2,1,2,0,1,1,0,1,2,1,2,1,0,2,0,0,3,0,2,2,0,2,1,0,2,0,2,1,0,0,0,0,0,1,0,0,0,1,1,1,1,1,1,2,1,0,0,1,2,0,1,0,0,1,0,2,1,1,2,2,2,0,0,1,1,2,3,2,1,2,2,2,1,0,1,1,0,2,0,0,0,3,0,0,1,1,1,0,1,1,1,2,1,1,1,3,1,2,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,1,5,1,2,1,2,3,2,2,1,0,1,1,3,2,1,0,0,0,2,0,1,0,2,0,1,1,1,0,0,0,0,3,0,1,0,2,1,0,0,0,1,3,2,2,0,2,2,3,3,1,0,1,2,2,1,0,0,0,1,1,1,2,3,1,0,0,2,1,2,2,1,2,1,1,1,1,2,1,2,1,0,1,0,0,0,2,0,1,1,0,3,1,0,4,3,1,0,0,0,0,2,0,2,1,1,2,0,0,1,0,1,1,2,1,2,1,0,2,0,1,1,0,0,3,1,3,1,1,0,2,1,0,2,0,3,2,0,0,2,0,0,2,1,1,1,1,1,1,1,0,1,2,2,5,0,1,2,0,1,0,0,2,0,1,0,2,2,1,2,1,0,0,1,1,3,0,1,2,1,1,0,1,1,2,0,0,2,2,2,1,0,1,2,2,1,1,1,0,1,0,0,0,0,2,2,2,0,3,0,0,0,3,1,2,3,0,0,2,0,1,0,1,0,2,3,0,0,4,0,1,1,0,0,2,2,2,1,1,3,2,0,0,0,1,0,1,2,2,2,1,0,2,1,2,0,3,1,3,0,1,1,1,2,1,0,0,0,1,1,3,1,1,0,0,0,0,1,2,0,1,0,0,0,2,0,0,0,1,2,0,3,0,0,2,1,0,0,1,1,2,2,1,0,1,3,3,1,0,2,2,0,1,2,0,3,0,1,0,2,2,1,0,0,1,2,2,0,0,0,0,0,1,2,1,2,1,2,0,1,1,0,2,0,2,1,2,2,2,0,1,1,2,1,0,1,1,1,2,2,1,0,0,3,0,0,1,1,0,1,3,1,4,0,1,2,0,0,0,0,1,1,2,1,1,2,1,1,0,0,0,1,0,2,1,1,0,0,1,6,2,2,1,0,0,1,2,0,0,1,0,1,1,1,1,0,0,0,0,1,2,1,0,2,2,0,3,0,2,1,0,0,0,1,3,0,1,1,1,0,0,4,1,1,1,0,1,0,1,0,1,1,0,1,1,1,2,0,2,0,2,0,0,0,0,2,0,4,1,0,1,1,2,2,2,0,3,1,1,4,1,0,1,3,0,3,1,1,1,0,2,0,3,0,1,2,1,1,0,1,2,2,1,1,0,0,1,1,0,1,1,1,2,2,2,1,2,1,0,2,2,1,0,3,1,2,1,1,1,1,2,1,2,0,0,1,2,1,1,0,3,2,2,1,0,1,2,2,1,1,4,0,1,2,0,3,0,0,0,0,2,2,1,2,2,0,2,0,2,1,1,2,1,0,2,2,1,0,0,1,1,1,1,0,3,0,0,1,0,2,1,1,2,2,0,3,1,0,1,1,1,0,4,2,1,0,0,0,0,1,0,1,3,1,1,4,1,2,2,1,5,0,1,0,0,2,1,2,1,3,1,1,0,1,1,0,0,0,1,1,2,1,1,3,3,2,1,1,0,0,2,1,2,2,2,2,0,2,1,0,1,0,0,1,0,0,0,1,2,0,1,2,1,0,0,1,0,0,4,2,1,1,0,1,0,1,0,1,1,1,1,0,0,1,2,1,1,0,1,1,0,0,0,2,1,0,0,0,0,2,0,0,1,0,0,0,1,1,1,0,1,0,1,0,0,1,1,1,1,0,0,1,2,1,0,0,1,1,2,1,0,1,2,1,1,1,1,2,1,1,1,1,1,2,1,2,0,1,0,1,3,0,2,1,1,1,1,0,0,4,0,0,2,1,2,2,1,0,1,1,3,0,0,0,0,1,0,1,0,0,1,1,1,0,1,1,1,1,2,1,1,1,1,0,2,1,2,0,2,2,0,1,0,0,0,1,0,1,0,1,1,1,1,1,0,1,2,1,2,1,2,3,1,1,0,1,1,0,1,0,1,0,2,0,2,1,0,0,1,1,1,0,0,2,1,2,2,0,2,1,1,0,1,0,2,0,0,0,3,1,2,0,2,0,3,3,1,1,0,0,3,2,1,2,0,2,3,0,0,1,0,1,1,1,2,2,4,1,1,1,1,2,0,0,0,0,0,1,1,1,1,2,2,0,2,1,0,1,0,0,0,4,1,1,0,2,1,1,0,0,1,1,2,1,0,0,1,0,1,0,2,3,2,0,1,1,1,0,0,1,0,0,2,0,0,0,1,0,0,1,2,1,1,6,1,0,0,1,1,1,0,1,0,0,1,0,1,2,0,0,1,1,1,1,0,1,3,0,0,1,3,0,1,0,1,1,3,1,0,4,2,2,0,1,1,3,2,1,1,0,1,1,2,1,1,1,0,2,1,1,1,2,1,1,1,0,3,0,1,0,2,1,0,1,3,0,1,0,0,0,0,0,2,0,1,1,1,0,1,1,1,0,2,0,3,2,1,0,0,0,1,1,1,0,0,1,1,0,0,1,1,0,1,1,0,1,0,0,1,1,0,1,1,1,0,0,0,0,2,0,2,1,3,3,1,1,2,2,0,0,3,0,1,1,0,1,3,0,0,2,2,2,0,0,0,1,0,0,3,1,2,1,0,0,2,1,1,0,1,0,1,1,0,0,1,2,0,1,2,1,1,1,1,1,0,0,1,2,1,2,2,0,0,1,1,0,1,0,4,2,1,1,1,2,3,0,1,1,1,0,0,1,0,1,1,0,3,0,3,0,2,2,1,1,0,0,0,1,1,0,1,2,1,1,0,1,1,0,1,2,1,3,2,2,0,2,1,0,3,0,0,0,0,0,2,0,2,2,2,0,3,1,1,0,1,0,3,3,1,4,1,1,1,0,2,1,0,0,3,2,0,0,0,1,0,2,0,3,2,1,1,0,0,1,1,0,1,1,2,1,0,1,2,0,2,1,0,1,1,1,1,3,0,2,1,2,0,2,1,1,0,1,0,0,2,1,2,1,0,1,1,2,2,1,2,0,0,1,0,2,1,0,0,0,0,3,2,0,1,0,0,0,1,1,0,1,0,1,2,1,2,2,0,0,1,0,0,1,1,0,1,0,1,0,0,1,2,0,3,1,0,2,1,0,2,0,1,0,0,1,2,2,2,0,0,3,0,3,1,1,2,4,1,0,0,0,0,0,2,3,1,1,1,1,0,0,1,0,1,1,2,1,0,0,0,0,0,2,2,2,0,1,0,2,1,0,1,1,1,1,0,0,0,1,2,1,0,1,1,1,0,0,1,0,2,0,3,0,2,2,0,1,0,2,1,3,2,1,0,1,1,2,4,1,3,1,1,0,1,1,1,1,1,0,0,1,0,3,1,0,0,0,1,2,1,2,0,1,1,3,1,1,0,1,2,2,0,1,0,0,3,0,1,1,0,2,2,2,0,1,1,1,0,0,0,1,2,0,2,1,3,0,1,0,0,0,0,0,2,0,1,1,1,1,0,0,2,2,1,0,1,2,0,0,0,1,2,2,1,1,2,1,1,0,0,4,2,3,1,2,0,0,2,0,0,2,3,1,1,0,0,0,0,0,0,0,1,1,0,2,2,2,1,3,1,1,1,1,0,0,2,0,2,1,1,1,1,1,1,0,0,1,1,1,2,0,1,3,0,1,1,0,1,2,1,1,2,0,3,0,1,0,0,0,0,0,1,2,0]},{"counters":[2,1,0,1,2,3,0,0,0,2,0,1,1,2,3,1,1,3,1,4,2,0,1,2,1,0,2,2,1,0,0,0,1,1,0,0,1,0,2,0,0,1,0,1,0,3,0,1,1,0,0,0,4,1,0,0,1,1,0,0,0,1,0,0,1,1,1,0,0,0,2,1,1,1,0,1,4,1,1,2,0,0,0,0,0,2,1,0,1,0,0,0,1,3,2,0,1,2,0,0,1,2,2,0,2,2,1,0,1,1,0,1,2,0,1,2,0,1,0,0,1,1,1,0,2,1,1,0,0,1,2,2,0,0,1,1,1,0,0,0,0,3,0,0,0,0,0,0,4,2,0,0,1,2,2,0,2,0,0,0,1,0,0,1,0,1,1,0,1,2,0,2,1,0,0,1,0,0,1,1,0,2,1,3,0,1,0,1,2,0,0,1,1,1,1,1,1,3,0,0,1,1,1,1,1,0,0,2,0,4,0,0,3,1,2,0,1,2,1,1,1,4,0,0,2,0,0,0,0,1,1,2,0,1,0,1,1,0,0,1,0,3,1,1,0,0,4,1,0,0,0,1,1,0,0,3,0,1,0,1,1,0,1,1,1,3,1,2,0,3,1,2,2,0,3,2,0,3,1,1,0,0,1,1,3,0,0,4,2,1,1,1,0,2,0,1,1,0,1,1,2,0,3,3,1,2,0,1,0,0,0,0,3,2,0,2,0,1,0,2,0,1,0,2,1,2,0,1,2,0,1,1,0,0,4,1,1,2,4,2,1,1,1,1,0,0,1,1,0,0,0,1,0,1,0,0,1,1,1,0,1,2,1,2,0,2,1,1,0,0,0,2,2,2,0,1,0,1,1,0,2,1,1,0,1,0,0,2,1,2,2,3,1,1,0,1,2,0,1,2,0,2,0,2,1,2,1,2,0,1,0,0,4,1,2,0,1,1,0,0,0,2,1,1,1,0,0,1,0,1,1,2,0,0,1,3,0,2,0,1,0,1,1,1,0,0,2,1,1,0,2,3,0,0,0,2,2,3,2,2,0,1,0,0,2,1,0,0,0,0,1,1,1,0,0,1,2,3,1,0,2,1,2,3,2,1,0,1,1,0,1,4,1,0,1,1,1,3,0,1,1,0,3,1,0,1,1,3,2,1,1,0,0,0,0,2,1,2,0,1,2,1,1,1,3,1,0,1,0,0,1,1,0,2,0,1,2,2,0,2,2,0,0,0,0,0,0,1,2,0,1,2,0,2,0,0,1,1,1,3,3,1,1,1,0,2,0,2,0,2,0,1,1,0,3,0,2,0,0,0,1,2,1,0,0,0,0,1,3,0,0,0,0,0,1,1,1,1,1,0,0,0,1,2,1,1,1,0,0,0,1,2,1,4,1,2,1,1,1,1,1,0,1,1,0,2,2,0,1,0,2,1,1,0,0,0,2,0,2,1,3,0,2,3,0,2,2,0,1,2,0,0,2,1,1,0,1,4,1,0,3,0,1,1,0,1,0,2,0,0,1,0,2,1,1,5,1,1,3,2,2,0,0,0,0,3,1,0,0,0,2,1,1,1,3,1,2,1,0,1,2,1,0,0,1,1,4,1,0,0,1,2,1,0,0,1,2,0,3,1,1,1,0,1,2,0,3,1,2,1,1,1,0,2,0,0,0,1,3,1,0,3,1,0,3,2,0,1,1,4,1,1,1,0,1,3,0,1,0,1,2,1,0,0,1,1,3,0,3,1,1,2,4,2,1,0,1,1,0,0,1,1,0,1,2,1,1,1,0,0,1,0,0,0,0,1,2,1,1,1,0,1,1,3,1,2,2,2,0,2,1,0,1,0,2,0,0,2,1,1,1,1,1,1,2,1,2,1,1,1,0,0,1,1,0,1,1,3,0,0,4,2,0,2,1,0,2,1,1,1,3,0,3,2,1,1,0,0,0,0,2,0,1,0,0,0,0,1,0,1,0,1,0,2,0,1,0,1,0,0,0,0,1,1,1,1,1,0,2,1,2,0,0,2,0,0,2,2,2,0,0,1,1,0,1,2,2,0,1,3,1,1,1,2,0,2,2,0,0,1,0,1,1,2,3,0,2,1,2,1,1,1,0,0,0,0,1,1,1,0,1,0,0,1,3,1,0,0,2,1,2,1,1,0,0,0,2,0,0,1,1,0,3,1,2,3,1,0,1,1,0,0,0,0,0,3,0,2,1,2,1,0,2,4,0,0,0,3,4,0,0,3,0,1,1,1,5,0,4,1,2,0,2,1,3,3,0,1,0,0,2,1,1,0,2,1,0,1,2,2,1,1,0,0,2,3,0,3,2,4,0,0,0,0,0,2,0,0,5,0,1,1,0,0,0,1,1,1,0,0,1,0,1,1,0,2,0,1,2,2,1,1,1,1,0,1,0,2,1,0,3,2,2,0,0,4,1,1,1,2,1,1,5,0,0,1,4,1,0,0,0,0,1,2,1,0,1,0,1,0,0,0,0,1,0,1,1,1,1,2,1,0,1,0,2,0,1,1,1,0,1,4,2,3,0,2,1,1,1,0,0,3,1,0,1,0,1,0,1,0,1,3,0,1,0,0,0,0,0,0,1,1,1,3,1,1,2,1,0,1,5,2,0,1,3,0,2,0,2,2,2,1,0,2,2,0,0,3,2,0,0,3,2,3,0,0,2,2,0,0,0,1,2,0,0,0,0,1,0,1,1,1,0,0,1,1,0,3,0,3,0,0,1,0,1,1,0,0,2,1,1,0,0,1,0,0,2,2,1,3,1,2,0,1,1,1,0,1,3,1,0,1,4,2,2,2,2,4,0,1,1,1,2,3,0,0,0,0,3,2,1,2,1,0,0,1,0,2,1,3,0,0,2,2,0,0,0,0,1,0,0,0,1,0,2,0,1,0,1,4,1,0,1,1,0,1,1,0,2,1,0,0,2,2,2,2,1,0,1,1,3,2,1,1,0,2,1,0,1,1,0,0,2,0,1,1,1,2,1,0,2,0,1,1,4,3,1,0,1,2,1,1,1,0,1,1,1,0,1,1,1,1,1,2,0,1,2,0,0,0,5,1,1,1,0,0,0,0,0,3,3,1,0,1,0,1,1,1,1,1,0,2,2,0,0,1,1,0,0,0,3,0,0,2,1,3,1,0,0,1,1,0,0,1,1,2,4,1,0,0,0,1,1,1,2,0,0,0,1,1,0,1,0,1,1,1,0,1,0,0,1,1,0,1,0,0,0,2,1,1,2,1,0,0,1,1,1,1,3,2,1,1,1,2,0,2,1,2,1,1,0,2,1,2,2,1,3,2,1,1,0,3,1,3,0,2,2,1,0,1,1,2,0,1,0,1,2,1,0,2,0,1,2,0,1,1,0,0,1,1,1,1,1,0,2,0,1,1,2,1,0,1,1,0,0,0,1,0,2,1,1,0,3,0,1,0,2,2,0,0,0,0,0,0,0,2,1,0,1,1,4,1,0,0,0,2,1,1,0,1,4,1,1,0,1,1,1,2,0,2,1,1,1,0,2,0,3,0,1,3,0,1,1,1,0,0,2,2,1,1,1,0,3,3,1,1,3,0,1,1,2,1,0,1,1,0,0,1,2,1,0,0,1,0,1,0,0,0,0,2,0,0,3,0,0,0,2,1,1,0,0,1,1,2,2,0,1,0,1,3,1,0,0,3,0,0,1,4,3,0,1,0,0,2,2,2,1,2,0,2,0,1,3,0,1,0,1,0,3,0,1,2,1,2,1,2,0,1,2,1,1,0,0,1,2,2,2,2,0,1,0,2,0,0,1,3,3,2,1,0,4,1,0,0,0,2,1,0,0,1,0,3,1,2,0,0,0,2,1,1,3,0,2,0,1,1,2,1,2,0,0,2,1,3,1,3,0,1,0,1,0,1,1,1,0,2,3,1,0,0,1,2,0,1,0,1,0,3,1,2,1,0,0,0,1,2,0,0,1,1,1,0,1,1,0,0,0,0,0,0,2,2,0,2,0,3,1,0,1,0,1,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,2,1,0,1,2,0,0,1,0,2,0,0,2,0,1,1,0,2,0,0,2,2,5,2,2,0,0,0,1,0,0,0,2,0,1,3,3,0,1,1,0,1,0,0,0,3,2,0,0,1,0,0,2,2,1,3,2,1,3,3,1,1,0,1,2,2,2,1,0,1,1,3,3,2,0,0,1,1,0,1,1,2,0,1,0,0,0,0,3,0,0,1,0,2,4,2,0,1,2,3,1,1,0,4,1,0,0,0,0,2,1,0,2,5,1,0,0,1,1,3,2,0,2,0,2,2,0,2,2,2,0,4,2,0,2,3,0,1,0,2,0,0,3,2,0,1,2,1,1,3,1,1,0,2,1,0,1,1,0,1,1,1,0,1,0,0,2,2,1,0,2,0,1,0,0,1,1,3,1,0,0,0,2,0,1,0,0,1,1,1,2,1,0,1,2,2,0,1,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,0,1,0,1,0,1,0,0,1,2,1,1,0,1,0,0,1,0,1,0,2,2,1,1,0,3,0,3,0,1,1,0,1,0,1,1,0]},{"counters":[1,0,1,1,0,1,1,1,0,0,0,1,1,2,3,0,1,0,1,1,0,1,1,2,1,1,0,1,0,0,1,4,0,2,1,2,0,2,2,1,1,1,0,0,1,3,0,1,0,2,0,2,1,1,0,2,3,2,1,1,2,0,0,5,0,1,0,0,0,2,0,0,1,0,0,2,0,0,1,0,1,0,0,2,0,0,1,0,0,0,0,0,1,0,2,0,2,2,0,0,1,1,0,1,0,0,0,1,1,1,3,1,1,0,1,0,0,0,0,3,1,1,0,0,2,1,3,1,3,2,0,0,2,0,0,1,1,0,0,0,3,1,0,1,1,1,0,2,2,2,0,1,0,2,2,0,1,2,1,0,1,2,0,0,2,2,0,2,3,2,1,1,1,2,3,2,0,3,1,2,0,2,0,0,1,2,2,2,1,3,1,1,1,0,3,1,0,0,2,3,1,1,0,0,1,1,3,1,1,1,2,1,0,2,1,1,0,0,1,1,1,1,0,1,1,2,0,0,2,2,0,1,0,0,1,0,1,2,0,2,0,2,0,2,3,2,1,0,0,1,3,0,1,0,1,1,1,0,1,0,0,2,0,0,1,0,1,0,1,0,1,0,1,1,1,0,2,0,0,0,2,2,0,1,2,3,0,1,1,2,1,0,0,2,1,0,0,1,0,0,0,1,1,0,2,1,0,1,1,0,0,1,1,1,0,0,0,1,3,2,1,1,1,0,1,0,0,0,0,1,0,1,1,1,0,2,3,3,0,0,0,0,0,1,0,2,0,0,0,0,1,0,0,4,2,2,3,2,1,1,1,2,0,0,0,0,1,1,0,1,2,1,1,2,1,1,2,1,2,2,1,2,1,1,1,0,0,1,0,0,1,1,1,0,2,4,0,1,4,0,1,0,0,1,0,2,2,1,0,1,0,2,0,4,0,0,3,0,2,1,0,2,2,0,0,3,1,2,3,1,4,2,2,2,1,0,6,0,2,2,1,2,4,1,0,2,3,1,1,1,0,3,0,1,1,0,0,0,0,0,1,3,0,0,3,2,0,0,1,2,1,0,1,1,3,1,0,0,1,0,0,0,0,1,0,3,0,1,2,1,0,1,1,1,1,1,1,1,1,2,0,0,2,1,1,2,2,1,2,1,1,1,1,0,3,1,1,0,0,1,0,0,0,1,1,1,0,0,2,0,0,3,0,1,3,1,0,2,0,0,1,3,0,0,0,2,0,1,0,2,1,2,1,0,2,0,0,1,0,4,1,0,1,4,0,1,0,2,0,0,3,0,0,1,1,2,1,0,2,0,0,1,2,1,1,1,1,0,3,3,0,1,1,1,2,0,1,1,3,0,3,0,2,0,2,0,0,2,2,0,1,1,0,1,0,0,0,1,1,0,0,2,0,1,0,2,0,2,1,1,0,0,2,1,2,1,0,0,0,1,0,1,1,2,2,1,0,0,0,0,0,3,0,1,0,0,0,3,0,0,0,1,0,1,4,1,1,1,1,0,0,1,0,0,1,0,0,1,0,0,0,1,2,0,0,1,2,0,1,0,0,0,0,1,0,1,1,0,0,0,3,0,1,2,1,1,2,3,1,1,1,1,1,4,1,1,3,3,1,3,1,2,3,2,3,1,1,1,1,0,2,1,2,2,1,1,0,0,0,1,2,2,0,0,1,4,2,1,0,1,0,0,1,0,2,1,2,1,1,0,2,0,1,1,1,4,1,3,1,1,1,2,2,0,0,0,0,0,0,0,1,1,1,1,0,1,2,0,0,0,2,1,2,3,1,2,2,1,1,0,1,1,2,0,1,0,0,0,2,1,2,0,0,1,2,1,1,0,1,2,1,0,1,1,0,3,1,0,1,0,1,4,3,3,0,1,1,2,0,1,0,0,2,2,0,1,0,1,1,1,2,0,0,1,3,1,0,0,3,1,1,0,1,1,1,1,1,1,0,2,0,1,0,1,0,0,2,3,2,0,1,0,1,1,3,1,1,2,2,3,3,0,0,0,1,2,2,0,1,0,2,0,1,3,1,0,0,3,1,1,4,1,1,1,1,1,1,3,0,2,2,0,1,1,2,0,1,2,1,2,1,1,1,0,0,3,1,3,1,3,3,1,1,0,0,1,3,1,2,1,1,0,0,1,1,1,1,1,0,4,0,2,2,0,1,0,3,1,3,2,0,4,1,2,3,0,1,1,0,1,1,1,2,0,0,2,0,0,1,0,2,1,0,1,3,1,1,0,1,0,1,0,0,1,1,1,1,5,0,0,3,2,0,0,0,1,1,0,0,0,1,2,1,1,1,1,1,0,3,2,1,1,1,1,1,3,1,0,0,1,1,0,1,0,2,0,1,1,1,0,1,1,2,1,0,0,1,2,2,0,1,0,2,1,0,0,0,1,0,0,1,0,1,2,2,1,1,4,1,1,0,0,1,2,0,1,2,1,1,1,4,1,1,0,0,1,1,1,0,1,0,2,1,3,1,0,0,2,1,0,2,1,1,2,0,2,1,2,1,1,0,1,0,0,1,1,1,0,0,0,0,1,2,2,1,1,2,2,0,0,1,1,2,0,0,0,1,1,0,0,1,2,2,1,1,0,1,0,0,0,0,1,0,3,0,0,1,2,3,2,0,0,1,3,1,0,1,1,1,1,1,0,0,2,1,0,1,0,1,1,1,0,1,1,1,1,0,2,2,0,2,0,0,1,0,4,0,3,0,0,1,0,1,1,1,3,3,0,0,2,0,0,0,2,2,1,1,0,4,2,3,0,0,1,0,0,1,0,0,3,2,1,0,0,2,1,2,0,4,1,0,1,0,0,0,2,2,1,0,2,1,0,1,0,1,1,0,0,0,0,3,3,1,2,1,1,0,2,2,1,0,1,1,0,1,2,0,4,1,0,2,1,2,3,1,1,0,2,0,2,3,1,1,0,0,0,0,0,0,2,1,0,0,2,1,0,0,3,1,2,0,1,1,1,0,2,1,0,1,1,1,0,3,0,3,2,1,1,1,0,0,2,0,1,1,1,0,0,1,1,2,0,2,1,0,1,1,1,0,1,0,1,1,1,0,1,0,2,1,2,3,0,0,0,3,0,1,1,0,0,0,0,0,0,2,1,2,0,1,1,0,0,2,1,2,2,0,0,0,3,0,2,0,1,0,1,2,1,0,0,0,1,2,0,0,1,0,1,1,1,0,1,0,1,2,2,2,1,1,1,2,0,1,0,1,0,2,1,0,0,0,2,2,1,1,2,2,1,0,2,1,2,2,0,2,0,1,1,1,0,1,2,0,0,2,1,0,2,2,2,2,5,2,0,2,0,0,3,3,2,0,0,0,1,1,0,1,2,0,1,0,1,2,0,1,3,3,1,1,1,0,0,0,1,1,1,2,1,1,0,1,2,0,0,1,0,2,1,0,1,1,1,2,1,1,0,2,0,0,0,0,1,1,0,1,2,2,3,2,2,0,0,0,3,0,1,2,0,0,1,2,1,0,3,1,1,0,1,1,0,1,1,2,1,1,3,0,0,0,3,1,1,1,1,2,1,2,1,2,0,0,1,1,1,3,0,2,3,0,0,2,1,1,0,2,0,0,0,1,2,0,1,2,1,0,0,1,0,1,0,1,0,0,4,1,0,1,1,1,1,1,1,1,0,0,2,0,1,1,0,1,1,0,0,1,1,3,3,1,0,1,2,0,1,5,0,3,0,0,1,1,0,1,1,1,2,1,1,2,0,0,0,1,0,0,1,0,0,0,3,1,1,1,2,1,2,1,0,0,0,2,0,2,0,0,2,0,2,2,1,1,1,1,1,1,0,1,0,2,0,2,2,1,1,2,1,0,0,0,2,0,1,1,0,2,1,0,1,1,0,2,1,0,1,1,0,0,2,0,1,4,0,2,0,1,1,0,0,3,1,2,0,0,1,1,0,1,1,1,1,1,0,1,0,1,0,0,3,0,1,1,1,0,0,0,1,1,1,0,1,1,1,2,4,0,1,0,3,1,2,1,2,1,2,1,3,2,2,0,1,2,1,0,1,2,1,1,0,0,0,1,1,0,2,0,1,0,1,0,0,1,1,2,2,1,0,2,0,0,0,0,1,1,2,1,1,2,1,2,2,1,0,2,1,1,0,1,3,1,0,1,1,1,0,1,1,2,2,2,1,4,2,0,1,0,3,0,0,1,1,1,2,2,2,0,2,1,1,1,2,1,2,1,0,0,1,2,1,1,2,1,0,0,2,1,0,2,0,0,0,1,0,0,1,2,1,0,3,0,1,0,3,1,0,3,0,0,0,1,0,0,0,0,3,0,0,2,1,0,0,2,2,0,2,1,0,1,3,1,0,1,3,1,1,0,3,0,0,1,1,0,0,1,2,1,0,0,1,1,1,0,0,1,1,0,1,1,3,2,1,0,1,1,2,0,2,1,0,0,0,1,1,1,2,0,2,1,2,2,0,0,3,1,1,0,0,0,1,0,0,0,1,2,1,1,3,1,1,1,0,2,1,1,2,0,2,2,0,1,1,0,0,2,2,0,0,3,1,0,1,1,0,2,0,0,0,1,2,1,1,2,0,0,0,0,1,0,0,1,0,3,0,0,3,0,1,1,0]},{"counters":[2,1,1,2,0,0,1,1,2,1,0,2,1,0,1,0,1,1,0,0,0,3,0,0,1,1,0,2,3,1,0,1,1,0,1,1,2,1,1,2,1,0,2,1,1,1,1,1,0,0,1,2,0,0,0,3,1,1,2,2,0,1,3,2,0,3,0,0,2,0,0,3,2,1,1,0,0,0,1,1,0,2,0,0,0,0,0,2,1,0,3,0,0,0,0,4,0,1,2,1,2,1,0,0,2,4,0,0,1,0,1,0,0,0,1,1,0,0,1,0,0,2,0,2,1,3,0,0,1,1,0,1,4,0,0,1,1,2,2,0,1,0,0,0,0,1,0,2,0,1,1,2,0,1,2,0,0,1,1,1,0,2,1,0,1,1,1,2,2,1,1,0,2,1,1,1,1,1,2,2,0,0,1,0,0,1,1,0,0,1,0,1,1,0,0,0,2,1,2,2,0,0,0,1,3,1,0,0,1,2,3,0,0,3,2,1,0,1,1,2,1,2,0,1,1,1,0,0,1,2,0,1,0,1,0,0,1,2,2,0,1,0,0,0,2,0,1,0,0,1,2,1,1,0,0,1,0,1,1,0,1,1,5,0,0,0,2,0,1,2,2,3,1,2,0,0,0,0,1,2,2,1,1,0,1,3,1,0,0,1,1,0,1,0,1,1,1,1,1,0,3,1,0,2,0,2,1,3,0,0,0,1,0,0,3,0,0,3,1,0,0,1,0,1,3,0,1,2,0,2,1,0,0,2,2,3,2,1,0,0,2,1,1,2,1,0,1,2,3,2,1,3,2,1,0,1,1,1,0,3,0,2,1,1,1,0,2,3,0,2,3,1,3,2,1,2,2,0,1,1,2,1,0,0,1,1,1,1,0,2,2,1,1,0,2,0,2,1,1,2,1,1,0,2,0,1,3,0,0,1,1,1,0,2,0,1,0,0,1,0,1,2,1,2,2,1,1,0,1,0,1,0,1,1,1,1,0,1,1,1,0,0,1,1,0,1,0,0,1,0,0,1,1,0,0,0,1,3,0,1,2,1,0,1,1,2,1,3,2,1,1,0,1,0,1,0,1,2,2,1,1,1,3,2,1,2,1,1,2,0,1,0,0,2,0,4,0,1,0,0,0,0,0,0,1,3,2,0,0,1,0,1,1,3,1,0,4,2,0,4,1,1,1,1,3,0,0,3,0,1,0,1,1,1,1,3,1,0,0,3,0,0,0,0,0,0,0,2,1,2,1,2,1,2,1,1,1,2,0,0,3,2,0,0,1,1,1,2,2,2,1,0,0,0,0,0,0,0,0,2,1,1,1,1,1,3,1,1,0,0,2,1,2,2,0,0,1,0,0,0,1,2,1,1,0,0,2,0,1,1,1,0,1,0,0,0,0,0,0,2,1,0,2,0,1,1,1,1,0,2,1,0,4,0,1,2,0,2,2,0,0,0,2,1,0,0,0,1,2,3,0,0,0,0,1,1,0,0,2,2,2,0,0,2,1,1,0,3,2,1,2,2,1,1,0,2,0,1,2,1,0,1,2,0,1,0,0,0,0,1,2,0,1,1,0,0,1,1,0,1,1,1,1,2,0,0,1,0,0,0,2,0,2,2,0,1,0,2,0,1,2,2,0,0,1,1,3,1,2,0,1,1,1,3,1,0,2,1,2,2,1,0,2,0,1,1,2,2,2,1,2,1,2,0,0,2,2,0,0,3,1,0,0,3,2,0,2,1,0,1,1,1,1,1,1,1,1,0,3,1,0,1,1,2,0,0,1,1,0,2,2,1,3,0,2,1,2,2,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,2,1,3,0,1,0,1,2,0,0,1,1,1,0,2,1,2,2,1,0,0,1,1,0,0,3,1,5,0,0,0,0,1,0,3,0,4,1,0,0,0,1,0,0,2,2,1,0,1,0,1,0,0,1,3,1,2,0,0,0,0,2,2,1,1,2,1,0,1,2,0,0,1,1,3,2,2,2,1,0,0,4,1,1,2,2,0,0,1,0,0,0,0,7,2,2,3,0,2,2,0,1,3,0,0,3,0,0,0,0,0,0,0,0,1,1,2,0,1,0,5,2,1,1,0,0,2,1,0,2,0,0,2,0,2,2,2,0,0,1,0,0,0,0,2,3,2,0,1,2,0,0,0,1,1,0,4,0,1,0,1,0,3,3,1,0,0,1,2,1,2,0,0,2,2,1,1,4,0,2,1,1,1,3,2,0,0,1,1,1,1,1,1,3,0,1,1,0,0,1,0,0,1,0,1,0,1,0,2,1,0,0,2,1,1,1,1,2,2,1,1,2,1,0,0,2,0,2,1,1,3,0,1,2,0,0,2,1,0,1,0,0,0,2,2,0,0,0,0,2,3,2,1,2,1,1,0,1,1,0,0,3,2,0,2,2,2,1,0,1,0,2,1,0,2,1,1,2,3,3,0,0,2,2,1,1,2,0,0,1,0,4,3,1,0,1,0,0,1,2,3,1,1,1,2,0,1,0,1,1,0,0,1,1,1,1,0,1,1,0,1,0,1,1,1,1,1,0,1,0,1,0,0,2,1,2,1,1,0,3,2,3,1,1,2,1,0,4,1,0,0,1,0,2,1,2,1,2,2,2,1,0,0,1,1,4,1,1,0,2,0,0,1,0,2,1,4,0,0,0,1,0,3,1,0,0,1,0,2,1,0,0,1,1,1,1,0,2,0,1,1,1,2,0,2,2,0,0,3,2,1,1,3,2,1,2,1,1,1,0,1,4,1,0,1,2,1,1,1,1,0,0,2,0,0,0,2,0,1,1,3,0,1,0,0,2,1,0,1,1,1,0,0,4,1,1,0,1,2,0,0,2,3,1,0,0,2,1,0,0,0,1,0,2,3,0,0,0,0,1,0,0,2,1,3,1,1,1,0,3,1,0,1,1,0,1,1,3,1,1,1,0,1,1,2,1,0,1,2,2,0,0,0,0,0,1,3,1,0,2,2,0,2,0,0,2,1,2,0,0,1,1,4,2,0,4,3,0,1,0,1,0,2,0,1,1,0,2,3,1,1,1,1,2,0,0,0,2,1,2,1,1,0,0,2,1,2,1,0,1,2,0,0,1,0,1,0,0,1,0,0,1,0,1,1,1,3,4,0,2,1,1,0,0,5,2,0,1,0,2,0,0,2,1,1,1,2,2,0,0,2,1,0,2,2,1,1,0,1,0,1,0,1,4,2,0,3,0,1,1,1,2,0,0,1,2,2,0,2,1,0,1,0,0,0,1,0,0,2,0,0,0,1,1,0,2,0,0,0,4,0,1,0,1,1,1,4,1,0,1,1,1,3,2,1,0,5,1,0,2,0,3,0,1,1,1,1,2,3,1,1,1,1,1,0,1,1,1,0,1,4,0,1,2,1,1,0,1,1,1,0,0,6,0,0,0,2,0,2,1,2,2,2,2,1,0,1,1,0,0,1,1,2,0,1,1,2,0,0,1,0,1,3,4,3,1,0,1,3,1,2,0,2,0,0,0,2,1,1,0,4,1,0,1,2,0,2,0,0,0,3,0,0,0,0,1,1,1,1,2,1,2,2,0,2,1,0,2,2,0,1,3,1,1,3,1,1,0,0,1,0,0,2,1,1,3,0,0,1,1,0,0,1,0,0,0,4,1,1,0,2,0,1,0,2,1,1,0,2,3,0,2,0,2,1,0,4,0,1,2,1,1,1,2,1,1,3,0,1,0,2,1,0,0,2,0,0,0,2,1,0,3,3,1,0,1,1,1,1,1,2,1,1,3,1,1,1,1,2,1,0,2,1,2,0,1,0,0,1,2,0,0,0,0,2,0,0,1,0,2,0,0,2,0,1,1,1,1,2,1,1,4,1,0,1,2,2,1,1,0,0,0,1,4,2,1,0,0,2,0,1,0,3,1,0,0,1,1,1,2,1,1,1,0,0,1,0,2,0,1,1,1,0,0,0,1,0,0,2,3,0,5,2,0,0,0,2,0,2,0,1,0,1,0,0,3,1,3,1,3,2,2,0,0,1,0,0,4,3,0,1,2,2,1,0,0,0,0,0,2,3,0,2,0,1,0,0,1,2,0,0,3,1,1,1,0,1,1,0,3,2,1,0,2,0,1,0,2,2,0,0,1,0,2,1,0,0,0,0,1,2,0,0,2,0,0,2,1,1,0,1,0,0,1,0,0,2,2,2,1,0,1,0,3,0,0,2,0,0,1,1,1,0,1,1,0,1,0,0,1,2,3,1,2,0,1,0,1,3,0,0,1,0,1,1,0,1,2,0,2,0,1,1,0,0,1,2,1,0,1,0,1,0,1,0,0,1,3,0,0,0,0,3,0,1,1,0,1,1,0,0,0,2,0,1,0,0,0,0,1,0,1,1,0,0,2,1,0,0,3,1,4,1,0,1,2,1,2,1,3,0,1,2,4,1,1,0,1,2,1,2,0,0,1,1,1,1,0,1,0,1,1,1,0,1,1,0,0,0,0,0,3,1,1,1,1,0,2,2,1,1,1,1,0,0,0,0,1,0,1,1,1,0,2,2,0,3,1,3,2,2,1,1,0,0,0,2,1,2,0,2,1,0,0,3]},{"counters":[0,1,1,1,2,0,1,0,1,0,0,1,2,0,0,0,2,1,0,0,1,0,0,1,2,1,1,1,0,3,2,1,0,1,2,2,1,2,2,2,0,3,2,1,0,2,0,0,0,2,0,2,0,2,0,0,0,1,1,3,1,1,0,1,1,1,2,2,0,0,2,0,0,1,0,0,2,0,3,1,1,3,0,0,0,3,3,3,4,1,3,0,1,1,2,1,1,1,3,0,2,0,1,1,0,3,0,0,1,1,1,2,2,1,2,1,0,2,0,1,0,0,2,1,0,0,1,1,0,0,0,1,1,1,1,0,0,1,1,1,0,4,0,2,0,1,0,2,2,0,1,1,3,0,1,0,1,1,1,0,0,0,0,1,0,1,2,1,3,2,0,2,3,3,4,2,2,0,1,1,0,0,3,1,1,0,2,1,1,0,1,1,0,0,1,2,2,2,0,0,0,0,0,0,1,1,1,1,1,1,2,1,3,2,1,0,0,0,1,1,0,0,0,1,2,2,0,1,1,1,0,2,1,2,0,1,1,1,1,3,0,0,1,1,1,0,1,0,3,4,0,0,1,2,0,2,2,0,6,0,0,1,1,1,1,0,4,0,2,1,0,1,1,3,0,0,2,1,0,3,0,4,0,0,1,0,0,1,2,1,1,0,0,1,0,0,1,2,1,0,0,0,0,2,0,1,1,2,1,1,1,0,2,0,1,1,2,1,0,0,2,1,0,0,1,2,1,1,0,1,0,0,0,1,0,0,1,3,0,1,1,2,0,1,0,2,0,0,1,1,0,1,1,0,3,0,2,2,1,1,2,1,1,2,0,1,0,0,0,0,0,0,2,0,2,1,0,1,1,1,1,0,0,1,3,0,0,0,1,1,0,0,0,0,0,0,0,2,1,0,1,0,1,0,1,0,1,2,1,1,0,1,1,3,2,0,0,0,0,1,1,1,1,0,1,0,1,4,0,2,2,1,2,4,0,2,2,3,1,0,0,0,2,3,1,1,0,1,1,0,0,0,2,0,0,2,2,0,1,0,0,0,1,1,0,2,3,1,1,0,0,0,1,1,2,0,1,2,2,1,0,1,0,0,3,1,2,1,2,4,0,2,1,1,1,2,3,1,0,0,2,2,1,0,0,2,0,0,0,0,2,1,1,1,0,3,1,2,1,1,0,0,0,1,1,2,1,1,0,1,1,0,1,0,0,5,1,1,2,3,1,1,3,1,1,2,3,1,1,1,0,0,0,0,0,0,2,0,0,1,2,1,2,0,1,3,1,0,1,2,2,2,1,2,1,1,0,2,2,1,0,2,2,2,0,1,0,0,1,0,1,0,1,2,0,0,0,1,0,2,1,1,1,2,1,3,0,0,1,1,0,1,1,1,2,0,1,1,1,0,1,2,0,2,2,4,2,1,3,3,0,0,2,2,0,1,2,2,1,3,1,1,1,0,1,0,2,1,2,0,2,0,1,0,2,2,0,0,0,0,3,2,0,0,0,0,0,2,0,2,0,2,0,1,1,1,0,2,0,1,0,1,0,0,3,0,1,1,1,1,1,1,1,2,1,0,0,0,1,1,1,0,1,1,2,1,0,0,2,1,1,1,1,1,1,0,2,0,2,1,1,1,1,0,0,1,3,1,1,2,4,0,2,1,2,1,2,2,1,3,0,2,3,0,1,0,2,2,0,0,0,0,1,0,0,1,2,0,0,0,1,0,1,0,0,0,0,2,1,0,1,0,0,1,0,1,0,1,0,0,0,0,0,1,2,0,1,0,1,1,0,0,0,0,0,1,0,2,0,0,0,1,0,1,2,1,1,2,1,1,1,2,1,2,0,2,1,0,3,2,1,0,2,3,0,0,1,4,1,2,4,2,1,1,2,2,2,1,1,2,0,0,1,0,2,3,0,1,1,1,2,0,1,2,0,2,2,0,2,1,1,5,0,1,0,0,0,0,1,2,2,0,0,0,0,1,1,2,0,1,1,2,3,1,0,3,1,1,1,1,0,1,0,1,0,2,0,1,1,0,2,1,0,1,1,1,1,0,1,0,2,0,1,0,0,2,1,2,2,1,0,3,3,1,1,0,0,1,1,1,2,0,1,0,2,1,1,3,2,2,0,3,2,3,1,0,0,0,1,3,0,0,0,1,2,2,1,0,1,3,1,0,1,2,1,1,0,1,4,0,2,0,0,0,0,1,0,1,1,4,3,1,2,1,0,1,1,1,1,3,1,0,0,1,1,0,1,2,1,2,2,2,1,0,0,1,0,0,1,0,2,1,3,3,1,0,1,1,0,0,1,3,1,0,1,3,3,0,0,1,0,1,0,0,0,0,0,1,1,0,2,2,2,2,0,0,0,1,1,0,1,0,2,1,1,3,1,1,0,0,2,2,1,1,1,2,0,2,0,0,1,2,1,2,0,1,1,1,1,1,2,1,3,0,1,0,1,0,3,4,0,2,4,0,2,0,2,2,1,1,2,1,1,2,2,0,2,2,1,1,1,0,3,1,1,2,0,3,0,0,0,0,1,0,2,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,3,2,1,2,1,1,0,1,1,0,2,2,1,2,3,3,1,1,0,1,2,0,2,0,2,2,1,0,2,0,1,1,1,0,2,0,1,0,1,1,0,0,1,1,1,1,0,2,3,1,0,2,1,2,2,2,0,1,0,0,1,1,0,0,1,2,1,0,2,0,1,1,1,1,1,1,0,0,0,0,1,3,0,1,1,1,2,0,2,1,1,3,2,1,2,2,1,3,0,1,0,0,2,0,0,0,1,1,0,3,2,2,1,1,0,0,0,4,2,0,1,1,1,1,2,2,2,2,2,0,1,2,0,0,1,1,0,3,1,1,1,1,2,3,1,2,0,2,1,2,2,1,2,1,0,1,3,1,1,2,1,1,2,2,2,0,0,0,0,0,0,1,1,0,1,0,2,0,4,0,0,0,3,1,1,2,3,0,0,2,0,1,1,1,0,2,0,1,2,1,2,1,1,0,1,1,1,2,1,0,0,1,0,0,0,1,0,0,1,3,0,0,1,1,0,1,1,0,2,2,2,1,0,2,0,1,1,1,0,4,1,1,1,0,1,0,1,2,1,0,3,0,1,1,0,0,2,0,4,1,2,3,0,2,1,2,0,1,1,1,0,2,1,1,2,1,0,0,0,0,0,1,1,0,2,2,1,1,0,1,1,1,1,0,1,2,0,2,3,1,0,2,0,1,2,2,3,1,1,0,0,2,0,0,3,4,0,0,2,1,0,1,2,1,0,0,1,0,2,1,1,1,1,2,2,3,0,4,0,1,2,0,4,0,2,1,0,0,1,1,1,2,0,0,0,1,0,1,2,1,0,1,0,0,0,1,0,1,1,3,1,0,1,0,2,1,0,2,2,0,2,0,2,0,1,0,0,0,0,1,1,2,1,3,0,1,4,0,2,0,1,0,2,1,0,0,2,1,0,1,1,0,1,2,0,1,4,0,0,1,1,1,2,2,0,0,1,2,1,1,0,0,2,1,1,0,0,2,1,1,0,2,3,0,3,0,1,1,1,3,2,3,0,1,1,2,2,0,0,1,1,0,2,4,0,0,1,1,1,0,1,2,0,1,1,1,0,1,0,1,0,1,0,1,0,0,0,2,0,0,0,1,2,2,2,2,1,0,0,1,0,0,2,2,1,0,0,0,0,1,0,1,0,1,0,1,1,3,2,1,2,4,0,1,1,0,2,1,0,1,2,0,0,0,1,1,1,1,1,1,1,1,0,2,1,0,1,0,0,4,1,3,1,0,0,2,0,0,0,2,1,2,1,0,1,0,2,0,2,1,0,2,1,1,0,1,0,0,1,2,1,0,0,1,0,0,1,0,2,1,0,0,0,2,2,0,1,1,1,1,1,0,0,2,1,0,0,2,0,0,1,0,0,1,0,2,1,3,1,1,2,0,0,0,0,3,1,1,1,3,1,0,2,0,2,2,2,0,2,0,0,0,1,1,0,3,0,3,1,1,2,3,2,0,0,0,2,0,1,0,2,3,2,1,0,0,0,0,1,2,1,0,0,1,0,3,2,1,0,1,1,1,1,2,2,1,0,0,3,1,0,1,0,1,1,1,0,1,0,2,0,1,0,1,0,1,1,0,1,0,1,1,0,0,0,1,0,2,0,2,3,1,1,0,0,0,1,0,2,0,0,3,1,1,0,0,2,0,2,0,1,1,0,3,1,2,2,0,1,2,1,0,0,1,0,2,1,0,2,1,1,0,0,0,2,0,2,0,1,1,0,0,1,0,0,0,1,0,0,2,1,1,1,2,0,1,0,1,2,2,0,1,1,0,0,0,0,1,0,3,2,1,1,0,1,1,2,1,0,1,1,2,1,0,0,2,1,0,2,1,1,0,1,1,1,1,0,0,1,1,0,1,2,2,0,1,0,0,1,0,1,0,0,0,0,1,3,0,0,1,1,1,0,2,1,2,0,0,0,2,3,0,4,1,1,0,0,5,0,2,0,2,2,1,0,1,0,1,1,2,5,0,0,1,0,1,1,1,0,0,2,1,2,0,0,3,1,1,0,2,0,1,0,1,0,0,0,0]}]},"null_count":0,"last_update_version":397952051122274304}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_easy_stats_index_prune.json b/cmd/explaintest/s/explain_easy_stats_index_prune.json deleted file mode 100644 index 93d64caa20e9b..0000000000000 --- a/cmd/explaintest/s/explain_easy_stats_index_prune.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"index_prune","columns":{"a":{"histogram":{"ndv":12937216,"buckets":[{"count":54675,"lower_bound":"NjY2NjU1MTE5MTY3NTY5OTIz","upper_bound":"Njg0MzQ0NjQ5MzA2OTgwMzU0","repeats":1},{"count":109351,"lower_bound":"Njg0NDE2OTIwMTgwNjA0OTI5","upper_bound":"NjkwODg1ODM3MjQ5OTUzNzk2","repeats":1},{"count":164026,"lower_bound":"NjkxMTA2Mjc5ODY0Nzc4NzU2","upper_bound":"Njk5OTQ5MjI1MTU0NDEyNTQ4","repeats":1},{"count":218702,"lower_bound":"NzAwMTAyMjAzMTY5NzY3NDI1","upper_bound":"NzA2MTE0Mjk1NjA5NDA5NTQw","repeats":1},{"count":273377,"lower_bound":"NzA2MzYzMzM0NjEzOTA5NTA1","upper_bound":"NzEyMjEyMDEzMzAyNTMwMDUw","repeats":1},{"count":328053,"lower_bound":"NzEyMjU5MzEwNzY5NTIwNjQx","upper_bound":"NzE2NDY5OTY2ODIyMTYyNDM1","repeats":1},{"count":382728,"lower_bound":"NzE2ODYwNzI2NzU3NTM5ODQ0","upper_bound":"NzIyNjE0NTQzODIxMjkxNTIz","repeats":1},{"count":437404,"lower_bound":"NzIyNjMxOTk3MDMyNDMxNjE3","upper_bound":"NzMxNDQ5OTY5MDUyMjA1MDU3","repeats":1},{"count":492080,"lower_bound":"NzMxNDc1ODg0NDI3OTUyMTMw","upper_bound":"NzQzMDQwNzMwMDc3MDM2NTQ1","repeats":1},{"count":546755,"lower_bound":"NzQzMDc2NTcyMjcyMDY2NTYz","upper_bound":"NzQ4NzQ1MjQ0MjU3Nzk2MTAw","repeats":1},{"count":601431,"lower_bound":"NzQ4NzQ4MzcyMzU5MTAyNDY1","upper_bound":"NzUyODIxMDU0MTMzMzU0NDk3","repeats":1},{"count":656106,"lower_bound":"NzUyODUzMDU2NDMzMDEyNzM3","upper_bound":"NzU3MzkyNzk1ODIzODgyMjQy","repeats":1},{"count":710782,"lower_bound":"NzU3NDA3NTk4MDMzMjIzNjgy","upper_bound":"NzYxMjM3MDMxMDA4ODQ1ODI4","repeats":1},{"count":765457,"lower_bound":"NzYxNTkzODMxODY2NzQ0ODM1","upper_bound":"NzY1MTU5MzAxNTMyMjg2OTgy","repeats":1},{"count":820133,"lower_bound":"NzY1MTkwMzk5MTE1OTY4NTE3","upper_bound":"NzY5MDQ4Njg3NDU0OTYxNjcw","repeats":1},{"count":874809,"lower_bound":"NzY5MDUwNTUwMjk5NTc0Mjc1","upper_bound":"NzczMzY4NDM1OTg3ODI0NjQz","repeats":1},{"count":929484,"lower_bound":"NzczNzUyMTA1NzMxMzQyMzM5","upper_bound":"Nzc2Njg1ODQ4MTI4ODk3MDMw","repeats":1},{"count":984160,"lower_bound":"Nzc2Njg5NTc2MzgzODczMDI4","upper_bound":"Nzc5MTgwNzA3MDA3NjYwMDM4","repeats":1},{"count":1038835,"lower_bound":"Nzc5MjE0MTc5MTI5ODY4Mjk1","upper_bound":"NzgyODM2OTA3MjEyNTcwNjMx","repeats":1},{"count":1093511,"lower_bound":"NzgyODY2NDU4Njg3MDI5MjUx","upper_bound":"Nzg2MTA2NzI1NzA4NzA5ODkx","repeats":1},{"count":1148186,"lower_bound":"Nzg2MTU1NzMxMjk0MzcxODQ4","upper_bound":"Nzg4OTgxOTU4MTE4NzE5NDk2","repeats":1},{"count":1202862,"lower_bound":"Nzg5MDMxODQ2Mzc3NzM0MTUw","upper_bound":"NzkyMTQ1NjcxOTE0NjM1MjY3","repeats":1},{"count":1257537,"lower_bound":"NzkyMTY0OTM5MTMyOTYwNzY5","upper_bound":"Nzk0OTE2MDUxMzY5NDkyNDg2","repeats":1},{"count":1312213,"lower_bound":"Nzk0OTI3MjM5MDg2NjIwNjc0","upper_bound":"Nzk3NjkwNzUzOTE3NDM1OTA2","repeats":1},{"count":1366889,"lower_bound":"Nzk3NzA5MzQ1MjkzNzEzNDEy","upper_bound":"ODAwMjg0MDEwOTIwNjg5NjY4","repeats":1},{"count":1421564,"lower_bound":"ODAwMjk4MTg5NDM3MjU1Njgz","upper_bound":"ODAzNTgxOTg3OTU2NDU3NDc2","repeats":1},{"count":1476240,"lower_bound":"ODAzODQzMTI1Mzg3NDQ0MjI3","upper_bound":"ODA2ODYzOTI0NDMyNjgzMDE2","repeats":1},{"count":1530915,"lower_bound":"ODA2ODgyNDU3NjIzMTAxNDQy","upper_bound":"ODA5Mjc5NjY3MTU5MDIzNjIx","repeats":1},{"count":1585591,"lower_bound":"ODA5Mjk5MTk0ODU4MDEyNjc0","upper_bound":"ODExOTE0NTg2MjMyNzAwOTM2","repeats":1},{"count":1640266,"lower_bound":"ODExOTE4MTI0NzI4MzAzNjE5","upper_bound":"ODE0NzEwNDQwMjkzNDMzMzUx","repeats":1},{"count":1694942,"lower_bound":"ODE0NzI5MzgyODEwOTkyNjQx","upper_bound":"ODE3Njc2Mjg4Mzc1ODk4MTE5","repeats":1},{"count":1749618,"lower_bound":"ODE3OTIzOTgyMDM4NTE1NzE5","upper_bound":"ODIxMjEzOTQzNTY1MjM4Mjcz","repeats":1},{"count":1804293,"lower_bound":"ODIxMjE2OTg0NTc4NjM3ODI3","upper_bound":"ODI2Mzc3NDQ3MTQxMDk3NDcz","repeats":1},{"count":1858969,"lower_bound":"ODI2NDI5Mjg4MTk5OTEzNDc1","upper_bound":"ODI5MTI2ODAxNjI0MjUyNDI0","repeats":1},{"count":1913644,"lower_bound":"ODI5MTg1MDUzMzg5NjM1NTg2","upper_bound":"ODMxMDc4NzEyNTA1Mzg0OTY0","repeats":1},{"count":1968320,"lower_bound":"ODMxMTExMzAyOTAwMjAzNTIx","upper_bound":"ODMyODU2NzU0OTQ5ODQ5MDky","repeats":1},{"count":2022995,"lower_bound":"ODMyODc2NDAxMjk1NDc0Njk0","upper_bound":"ODM0NjA2ODM5MDI2NTMyMzU1","repeats":1},{"count":2077671,"lower_bound":"ODM0NjQ5NDAzNTIyNjYyNDA0","upper_bound":"ODM2ODM2MzMwNTU1ODE3OTg2","repeats":1},{"count":2132346,"lower_bound":"ODM2ODgyMDI4OTAzMDcxNzQ5","upper_bound":"ODM4OTA0NDE5NjM3NTEwMTQ4","repeats":1},{"count":2187022,"lower_bound":"ODM4OTQzMzY3NzMyMjMyMTkz","upper_bound":"ODQwODAyNjU5MTM4ODYzMTA3","repeats":1},{"count":2241698,"lower_bound":"ODQwODM1NzE0NTUwNDQ4MTMx","upper_bound":"ODQzMTAyNDAwNTU0MjcwNzIz","repeats":1},{"count":2296373,"lower_bound":"ODQzMTEyMzU0ODIzMzU2NDE3","upper_bound":"ODQ1Mjk5MDA5MjY1NTMyOTM2","repeats":1},{"count":2351049,"lower_bound":"ODQ1MzIwMzQzODQ5MTU2NjE0","upper_bound":"ODQ2OTM0MDExODg3MTU3MjUy","repeats":1},{"count":2405724,"lower_bound":"ODQ2OTM4NTkxMzYyNTMxMzMz","upper_bound":"ODQ4NDQwNjM4NjE5ODkzNzg4","repeats":1},{"count":2460400,"lower_bound":"ODQ4NDUwMjgxMzE3NDQ5NzU2","upper_bound":"ODQ5ODIwMTk0Nzk3MjA3NTgy","repeats":1},{"count":2515075,"lower_bound":"ODQ5ODY0MjY5MDkzMTA5Nzkw","upper_bound":"ODUyMTQwNDA3NTQyNjI4Mzgy","repeats":1},{"count":2569751,"lower_bound":"ODUyMTU3ODY2NzI0NDA5Mzcz","upper_bound":"ODU0MTMzMDU0MzY5MDIxOTgz","repeats":1},{"count":2624427,"lower_bound":"ODU0MTQ4NzM2MTU0OTI3MTMy","upper_bound":"ODU2MzMzMjk2ODA4MDAxNTY0","repeats":1},{"count":2679102,"lower_bound":"ODU2MzM0ODU1NjQ2MzMwOTEx","upper_bound":"ODU4MTQxNDg5NDEzMDk1NDU1","repeats":1},{"count":2733778,"lower_bound":"ODU4MTc5NjY0MTExNjY1MTgx","upper_bound":"ODU5Njc2OTcwMTYzNzQ4ODky","repeats":1},{"count":2788453,"lower_bound":"ODU5Njg4NTExMTE0MDM1MjMx","upper_bound":"ODYxNjE2NTU4NzU4OTM2NjA0","repeats":1},{"count":2843129,"lower_bound":"ODYxNzY1MTI2MzU1MjcxNzA4","upper_bound":"ODYzNjEzNDA4ODg1MzkxMzg5","repeats":1},{"count":2897804,"lower_bound":"ODYzNjU0NjUzODM5OTY2MjM3","upper_bound":"ODY1MjI3MjM0ODA2MTg2MDE1","repeats":1},{"count":2952480,"lower_bound":"ODY1MjMwNTQxMDAzNTM4NDYz","upper_bound":"ODY2NTAyMjQwMDcyODc2MDYz","repeats":1},{"count":3007156,"lower_bound":"ODY2NTI4MDUwMzMyNjgwMjIy","upper_bound":"ODY3OTcxMDQ3MjkwOTk0NzE5","repeats":1},{"count":3061831,"lower_bound":"ODY3OTk5NzIxMTcxNTY2NjIw","upper_bound":"ODY5MTk0MDQyNzI4ODA4NDc3","repeats":1},{"count":3116507,"lower_bound":"ODY5MjUzNjQwNzIzMzQ5NTMy","upper_bound":"ODcwODY2NzcyNjE4NjI1MDM2","repeats":1},{"count":3171182,"lower_bound":"ODcwOTI2MTUyNjEzMzQ3MzQy","upper_bound":"ODczMzAyOTg2NDkyMzI5OTk2","repeats":1},{"count":3225858,"lower_bound":"ODczMzgwOTM2ODA3NTk2MDQ0","upper_bound":"ODc1Mjc0NzE0NTYzMjgwOTA5","repeats":1},{"count":3280533,"lower_bound":"ODc1Mjc5MDgxNzM1OTYyNjQ1","upper_bound":"ODc2ODEyNDE2NjE0NTE0NzA5","repeats":1},{"count":3335209,"lower_bound":"ODc2ODE4NDI2MjY2ODk0MzUw","upper_bound":"ODc4MTcyNjIyMzkxMzQ1MTY2","repeats":1},{"count":3389884,"lower_bound":"ODc4MjA0MjY0NjkzMDA2MzU3","upper_bound":"ODgwMDcwOTc2MTQ1OTk3ODM2","repeats":1},{"count":3444560,"lower_bound":"ODgwMDc3NzEzNzc5MTc5NTM0","upper_bound":"ODgxNTA5ODUzOTUyNDU4NzY0","repeats":1},{"count":3499236,"lower_bound":"ODgxNTIzMjgwMzMzNjg0NzQ5","upper_bound":"ODgyOTUwMDY1ODEzMDQ1MjY5","repeats":1},{"count":3553911,"lower_bound":"ODgyOTUzOTU4NTA1OTcxNzI2","upper_bound":"ODg0OTcxODMxNTEwMzY4MjY4","repeats":1},{"count":3608587,"lower_bound":"ODg1MDI2NjMwMzM4NzA3NDc3","upper_bound":"ODg2NzYyNjcxMjg5NzEyNjUz","repeats":1},{"count":3663262,"lower_bound":"ODg2NzcyNjM3NTgyMzExNDM2","upper_bound":"ODg3OTAzMzE3ODI0MjI1Mjk0","repeats":1},{"count":3717938,"lower_bound":"ODg3OTgzNDgzNjczNDI3OTg5","upper_bound":"ODg5MzI0MjA2NzM1MjEyNTY1","repeats":1},{"count":3772613,"lower_bound":"ODg5MzYwMDcxODY0NTAwMjM4","upper_bound":"ODkwMTY1MDM5ODIyNTIwMzQx","repeats":1},{"count":3827289,"lower_bound":"ODkwMTg1NDA3OTY2MjY1MzU3","upper_bound":"ODkxNjc0NTk1MjgyNTgzNTY0","repeats":1},{"count":3881965,"lower_bound":"ODkxNjg4NTU2OTk5Njg4MjA2","upper_bound":"ODkzMzEzMDU1OTYxMTA0NDA1","repeats":1},{"count":3936640,"lower_bound":"ODkzMzIzNjkxNTk4NDk1NzU3","upper_bound":"ODk0ODI4MDU5NzU3MDAyNzY0","repeats":1},{"count":3991316,"lower_bound":"ODk0ODMyNzgzNTM1NjIwMTEw","upper_bound":"ODk1OTk3MDcyMTk3NDAyNjQ1","repeats":1},{"count":4045991,"lower_bound":"ODk2MDAxODIyNjkyNDI1NzQw","upper_bound":"ODk3MzY2NTM5Mjk2ODE3MTY0","repeats":1},{"count":4100667,"lower_bound":"ODk3Mzc1MTQ4NzY3MTMzNzA5","upper_bound":"ODk4NDc5ODg4MDQ4ODE2MTQw","repeats":1},{"count":4155342,"lower_bound":"ODk4NTE5MDM3Nzc2MDg1MDA0","upper_bound":"ODk5NDc0MDc1NzQ1ODk0NDE0","repeats":1},{"count":4210018,"lower_bound":"ODk5NDc0Mjg0OTE1ODM0ODk0","upper_bound":"OTAwNjczMDkzMTE5ODg1MzI1","repeats":1},{"count":4264693,"lower_bound":"OTAwNjgxNjExNDkzOTAwMzA5","upper_bound":"OTAxNDY2NTIyMTEwMjQ2OTI0","repeats":1},{"count":4319369,"lower_bound":"OTAxNDcwOTAyMDU0Nzk3MzMz","upper_bound":"OTAyNDg3NDg3ODY2MTkxODg1","repeats":1},{"count":4374045,"lower_bound":"OTAyNDg5MDM3MjkwOTc5MzQy","upper_bound":"OTAzNTA2OTUxMTM3NTc0OTI1","repeats":1},{"count":4428720,"lower_bound":"OTAzNTUzODYyNjExODQ1MTMy","upper_bound":"OTA0NzQ4MDY5ODAwODg2Mjkz","repeats":1},{"count":4483396,"lower_bound":"OTA0ODYzMzE2OTUyNTE0NTcy","upper_bound":"OTA1ODU4OTU5Mjk2ODcyNDYw","repeats":1},{"count":4538071,"lower_bound":"OTA1OTU0MjI2NTU4ODQ0OTQ5","upper_bound":"OTA2NzY2NTMyNTQ3MDM1MTQ4","repeats":1},{"count":4592747,"lower_bound":"OTA2ODA5MTA1NTEzMzk4Mjkz","upper_bound":"OTA3ODcwNDI5NTQ3NDQ2Mjkz","repeats":1},{"count":4647422,"lower_bound":"OTA3ODcyMDgzODM2Mzg3MzQy","upper_bound":"OTA4OTM0ODQxNjc2NTc4ODM3","repeats":1},{"count":4702098,"lower_bound":"OTA4OTM3NDE4OTE4NzcyNzQ5","upper_bound":"OTA5Njg2MTA4MDY0ODkwODky","repeats":1},{"count":4756774,"lower_bound":"OTA5Njg4NjAxNDA3OTMwMzgx","upper_bound":"OTEwNjg2NzU5MzUyMzg1NTUw","repeats":1},{"count":4811449,"lower_bound":"OTEwNjk2NTI1MjEzOTc0NTQw","upper_bound":"OTExNTQwOTY1MTA0MDA5MjMw","repeats":1},{"count":4866125,"lower_bound":"OTExNTQ2NzE1MTE1NjY3NDc3","upper_bound":"OTEyNTM2Njk1NjA1Njc0MDA1","repeats":1},{"count":4920800,"lower_bound":"OTEyNTQ1OTQxMjgwMzc0ODA1","upper_bound":"OTEzNzMxMTI1MDIyMTYyOTU4","repeats":1},{"count":4975476,"lower_bound":"OTEzNzQ3MDcwMjc3NTk5MjQ2","upper_bound":"OTE0NzAxNzc5Mzc1NzgzOTUw","repeats":1},{"count":5030151,"lower_bound":"OTE0NzAyMDk0OTU1NjkyMDQ2","upper_bound":"OTE1NzcxNTUzNTM4NDkwMzgw","repeats":1},{"count":5084827,"lower_bound":"OTE1NzkxOTc1NjEyMjY4NTY1","upper_bound":"OTE2NTcwMTg0OTE1OTc2MjEz","repeats":1},{"count":5139503,"lower_bound":"OTE2NTcxMDkxNjExMjcxMTgy","upper_bound":"OTE3MjY1NTk0NDYzMjcyOTcy","repeats":1},{"count":5194178,"lower_bound":"OTE3Mjc0NzUzNTkyNTI0ODIx","upper_bound":"OTE4MzA0NjIzOTczNjYyNzQx","repeats":1},{"count":5248854,"lower_bound":"OTE4MzA4NTUxMzE3MTEwODA1","upper_bound":"OTE5MDg0NDEyNjEzNDI3MjIx","repeats":1},{"count":5303529,"lower_bound":"OTE5MTAxNjQyODEwMTc5NTk2","upper_bound":"OTE5ODE3NzEzMDA4MDk5MzQ5","repeats":1},{"count":5358205,"lower_bound":"OTE5ODIyOTA3NTEwMTEyMjcw","upper_bound":"OTIwNjgyNjA4NTE3NjkzNDU0","repeats":1},{"count":5412880,"lower_bound":"OTIwNjg2NzE1MTYyOTY4MDc2","upper_bound":"OTIxNTgwMzI0Njk0NDA5MjI5","repeats":1},{"count":5467556,"lower_bound":"OTIxNTgyODQyNzQ4NDUyODg1","upper_bound":"OTIyMTEwOTM4OTIwNzYzNDA2","repeats":1},{"count":5522231,"lower_bound":"OTIyMTMwMzM1MzA2ODU4NTA4","upper_bound":"OTIzMDgxMjkyMDcxMjg4ODQ0","repeats":1},{"count":5576907,"lower_bound":"OTIzMDgxNjcxMzQxNzE5NTcz","upper_bound":"OTIzNzkzNzI0NjgwNDM3Nzc0","repeats":1},{"count":5631583,"lower_bound":"OTIzODIzMzg1NzUyMzg3NTk2","upper_bound":"OTI0NTI5MjcwOTYxMTkyOTcz","repeats":1},{"count":5686258,"lower_bound":"OTI0NTc2MzQyMTE3MTcxMjEy","upper_bound":"OTI1NjEyNzQxNTUwNzg0NTMz","repeats":1},{"count":5740934,"lower_bound":"OTI1NjIyOTEwNDgzODA4Mjcw","upper_bound":"OTI2MzkwNDUxNzY5ODE5MTU3","repeats":1},{"count":5795609,"lower_bound":"OTI2Mzk0MzY4NDA4MTQxODM4","upper_bound":"OTI3MzMzNjk4NTU4MjE0MTU3","repeats":1},{"count":5850285,"lower_bound":"OTI3MzYwNTA1ODYxNjE5NzI2","upper_bound":"OTI4MTg5NzE4NTI0MDg0MjM3","repeats":1},{"count":5904960,"lower_bound":"OTI4MjMyMDYyMzQxODU3MzAx","upper_bound":"OTI4OTYyMDUwMDQyMjAwMDc3","repeats":1},{"count":5959636,"lower_bound":"OTI4OTYyMzM5OTM0Mjg5OTM0","upper_bound":"OTI5OTEyNDM5Mzg4MzU2NjI5","repeats":1},{"count":6014312,"lower_bound":"OTI5OTE3ODUzMDI5ODc1NzI0","upper_bound":"OTMwNzk0ODkzMTYwODU3NjEy","repeats":1},{"count":6068987,"lower_bound":"OTMwNzk4MzQ3MjU1NjkzMzMz","upper_bound":"OTMxNzIzNzMzNTI5MDUxMTQ4","repeats":1},{"count":6123663,"lower_bound":"OTMxNzU2NjIxNDkxMjkwMTI2","upper_bound":"OTMyNTc1OTYzMDc0NTEwODY5","repeats":1},{"count":6178338,"lower_bound":"OTMyNTgzMTgwMjI0ODA2OTI1","upper_bound":"OTMzNDkwODUyMzczMTg0NTI2","repeats":1},{"count":6233014,"lower_bound":"OTMzNTE5MzcxMTc0NTI2OTk3","upper_bound":"OTM0MjkyMDY5NjM2NzE4NjA2","repeats":1},{"count":6287689,"lower_bound":"OTM0MzA1MjMwMjQwNTk1OTg5","upper_bound":"OTM1MTA1MzQ4NzEzMTE5NzU3","repeats":1},{"count":6342365,"lower_bound":"OTM1MTEwNDg0ODM2NDY2NzAy","upper_bound":"OTM1ODczMzc1NjY4NzY0Njg0","repeats":1},{"count":6397040,"lower_bound":"OTM2MDM2NDE0MDg2NDQ3MTE2","upper_bound":"OTM2Nzk0ODkyMDA2NDQwOTcy","repeats":1},{"count":6451716,"lower_bound":"OTM2ODM2NDI2NDQ5NTM0OTg5","upper_bound":"OTM3NTcwMjQwMDU0NDExMjc2","repeats":1},{"count":6506392,"lower_bound":"OTM3NTg5NTQ0NjAwNTY3ODI5","upper_bound":"OTM4MjY3MTU2MzI3MzMzOTAx","repeats":1},{"count":6561067,"lower_bound":"OTM4MjY3NjUxMzAwOTAwODc3","upper_bound":"OTM5MTQwNjUwMTMyNTUzNzQy","repeats":1},{"count":6615743,"lower_bound":"OTM5MTQxMzc5OTM5MjIxNTI1","upper_bound":"OTM5ODU0ODk0MjYwNzMxOTE4","repeats":1},{"count":6670418,"lower_bound":"OTM5ODY2Mjk3NDI5MzQ0Mjcw","upper_bound":"OTQwNzQ3NTE2MTUxNDQ3NTY2","repeats":1},{"count":6725094,"lower_bound":"OTQwNzcyNjg5NTQ1Mzc5ODU0","upper_bound":"OTQxNTgwNjU0ODk1NDY0NDYw","repeats":1},{"count":6779769,"lower_bound":"OTQxNTgxODgzOTI3OTM3MDM2","upper_bound":"OTQyNDExNTE3MjAxMjAzMjEy","repeats":1},{"count":6834445,"lower_bound":"OTQyNDE2Mzc2MTEyNDYzODg1","upper_bound":"OTQzMzA5NzcwMzc5MjgwMzk3","repeats":1},{"count":6889121,"lower_bound":"OTQzMzIzNTAyMDQ0MjMzNzQw","upper_bound":"OTQ0MTQxMjg1MDkyMzExMDYx","repeats":1},{"count":6943796,"lower_bound":"OTQ0MTQ5MDkxNDEwNzg4Mzcz","upper_bound":"OTQ0ODU3NTkxMjY5NDA4Nzgy","repeats":1},{"count":6998472,"lower_bound":"OTQ0OTE3NzgyNjAzNDgxMTAx","upper_bound":"OTQ1ODc5ODgyNjQ2NTM2MjA0","repeats":1},{"count":7053147,"lower_bound":"OTQ1ODc5OTAyNTc0ODg2OTMz","upper_bound":"OTQ2NzU5OTU3MjQ2ODg1OTA5","repeats":1},{"count":7107823,"lower_bound":"OTQ2Nzc2MjU0OTU5ODc4MTU3","upper_bound":"OTQ3NDMzNTA5MjY5MDQ1MjY5","repeats":1},{"count":7162498,"lower_bound":"OTQ3NDQzNzEyNDkxODk2ODQ1","upper_bound":"OTQ4MDY2MzA5Nzc5ODgxOTk3","repeats":1},{"count":7217174,"lower_bound":"OTQ4MDcwMjY1MzkzMjMzOTMy","upper_bound":"OTQ4NzU0MzAzNjIxOTA2NDUz","repeats":1},{"count":7271850,"lower_bound":"OTQ4NzcyMzcwODEwODk2Mzk4","upper_bound":"OTQ5NDUzMDU0NTI5MDkzNjUz","repeats":1},{"count":7326525,"lower_bound":"OTQ5NDU0MDE2NDUwMDE5MzQ5","upper_bound":"OTUwMTg2OTM3NzA0Mzk4ODYw","repeats":1},{"count":7381201,"lower_bound":"OTUwMjAyMTIxNzMxMDMxMDU0","upper_bound":"OTUwOTMyNTE1NDk3NDQzMzQ5","repeats":1},{"count":7435876,"lower_bound":"OTUwOTUxNjAxMTUxNjU1OTUw","upper_bound":"OTUxNzI1NTMwMzUwNDAzNTk4","repeats":1},{"count":7490552,"lower_bound":"OTUxNzM4NjI0OTc0MzQwMTEw","upper_bound":"OTUyMzg1NzAyODYwMTQ0NjYx","repeats":1},{"count":7545227,"lower_bound":"OTUyNDAxMzE4MjM1NzE3NjQ1","upper_bound":"OTUzMjMwNTkxMzIwMTQ1OTQx","repeats":1},{"count":7599903,"lower_bound":"OTUzMjc2NjI4MzI2MDA2Nzk4","upper_bound":"OTU0MTM2NDQ3MzA2Njc4Mjg2","repeats":1},{"count":7654578,"lower_bound":"OTU0MTQzNTgwMDU0NTg1MzU3","upper_bound":"OTU0NzE5Njk0ODQ2NTQxODM2","repeats":1},{"count":7709254,"lower_bound":"OTU0NzIzNjg5Njk5MTk2OTQx","upper_bound":"OTU1NjU4NTM3NzUzMTMzMDcw","repeats":1},{"count":7763930,"lower_bound":"OTU1NjcyNTk0MjY2MTQ0Nzgw","upper_bound":"OTU2MzYyNDk5MTIwMjAxNzQy","repeats":1},{"count":7818605,"lower_bound":"OTU2NDEyMjkzNTMzOTA5MDA0","upper_bound":"OTU3MTIyMDUxNTI1Mzc4MDYx","repeats":1},{"count":7873281,"lower_bound":"OTU3MTI4Mjk2Mzg5NTI1NTE4","upper_bound":"OTU3ODE5NDEwMzkwMTcxNjYx","repeats":1},{"count":7927956,"lower_bound":"OTU3ODI1MDQ0Njg4MDI3NjYy","upper_bound":"OTU4MzkzOTc1Mzc4MTMzMDA2","repeats":1},{"count":7982632,"lower_bound":"OTU4NDQ0MzcxNDQ3ODI0NDA1","upper_bound":"OTU5MDU1ODE1NjUxNjA2NTQw","repeats":1},{"count":8037307,"lower_bound":"OTU5MDU2MzUxODk3NjQ5MTcz","upper_bound":"OTU5NzE0NjMxNzk2NjM3NzA5","repeats":1},{"count":8091983,"lower_bound":"OTU5NzE5MTA5MTQ1Mzc4ODI5","upper_bound":"OTYwNDEwMzEzODQ3NjY4NzQ4","repeats":1},{"count":8146659,"lower_bound":"OTYwNDE2MTU1OTk2NjM1MTQ4","upper_bound":"OTYxMTU5MjY0MDQ4ODA3OTUw","repeats":1},{"count":8201334,"lower_bound":"OTYxMTY3NDEzNjc3MDE1MDU0","upper_bound":"OTYyMjA3NzU0MjcxMDQ3Njkz","repeats":1},{"count":8256010,"lower_bound":"OTYyMjA4MDI4MzM5NDUzOTcz","upper_bound":"OTYzNTgxODk1NTc2ODI5OTY2","repeats":1},{"count":8310685,"lower_bound":"OTYzNjI1OTc0NDk3ODA0MzAx","upper_bound":"OTY0NzEyNzY4MTg3OTA4MTE3","repeats":1},{"count":8365361,"lower_bound":"OTY0NzMyMTQ3Mjk4Nzk1NTQx","upper_bound":"OTY1ODQyNjc5NjU1MTUzNjg1","repeats":1},{"count":8420036,"lower_bound":"OTY1ODQ3MzY3NDk4NzExMDU0","upper_bound":"OTY2NTIwMjkzMTU5MDU5NDc3","repeats":1},{"count":8474712,"lower_bound":"OTY2NTM0NTY4ODg4ODc3MDY5","upper_bound":"OTY2OTM1ODUyNDk5Nzc5NTk4","repeats":1},{"count":8529387,"lower_bound":"OTY2OTQ4ODI0MTM4MzY2OTg4","upper_bound":"OTY3NDE0MTc5MDYwMzY3Mzgx","repeats":1},{"count":8584063,"lower_bound":"OTY3NDM1NDUwMTgzODI3NDc3","upper_bound":"OTY4MDE5OTU2Nzk5NzUwMTU3","repeats":1},{"count":8638739,"lower_bound":"OTY4MDMxMjg5NTA5NjU4NjQ1","upper_bound":"OTY4NjkzNTUxODk5MTgxMDY4","repeats":1},{"count":8693414,"lower_bound":"OTY4NzA4ODEwNjgzODQyNTcz","upper_bound":"OTY5MjI5MDU3NzM4MjYwNDky","repeats":1},{"count":8748090,"lower_bound":"OTY5MjI5NDMxODE5Nzk2NDky","upper_bound":"OTY5ODY1MzczOTU3NTcwNTc0","repeats":1},{"count":8802765,"lower_bound":"OTY5ODc4MDA1NzM4MjI1Njc3","upper_bound":"OTcwMjU1NDM2MzI3MDEwMzE4","repeats":1},{"count":8857441,"lower_bound":"OTcwMjY5ODQ2MzM3NzE2MjM2","upper_bound":"OTcwNzM0NzEzNjkxMTc2OTcy","repeats":1},{"count":8912116,"lower_bound":"OTcwODA1OTA1ODg2MTk5ODI5","upper_bound":"OTcxMjA3NjY5ODI2OTk0MTg4","repeats":1},{"count":8966792,"lower_bound":"OTcxMjE0NjkxMzc0NTc5NzI1","upper_bound":"OTcxNzE3ODM2Mjc5NzU4ODYw","repeats":1},{"count":9021468,"lower_bound":"OTcxNzI1NTE4NjIwMTgwNDkz","upper_bound":"OTcyMzczMTg4MzkxMzg3MTQ4","repeats":1},{"count":9076143,"lower_bound":"OTcyNDAyODU0NDUwOTM3ODY5","upper_bound":"OTcyNzkxOTY4NjkzNTY3NTAw","repeats":1},{"count":9130819,"lower_bound":"OTcyODAzMDg4MTk5MDkwMTg4","upper_bound":"OTczNDA1MDQzODA3MjA3NDM3","repeats":1},{"count":9185494,"lower_bound":"OTczNDEyMzIzNzIwNDEzMjA1","upper_bound":"OTc0MTU1MTEyNDc0MDM0MTkw","repeats":1},{"count":9240170,"lower_bound":"OTc0MTU4MzQxMzY2NDY0NTI0","upper_bound":"OTc0NTc1ODM4Mjc3MjU1MTgy","repeats":1},{"count":9294845,"lower_bound":"OTc0NTc4Mjc1NDkzMzMwOTU2","upper_bound":"OTc0OTYwMzQxMTgxNzc1ODg0","repeats":1},{"count":9349521,"lower_bound":"OTc0OTc2MjMxOTg0ODA3OTQ4","upper_bound":"OTc1Mzc4ODMxOTM0MjEwMDYw","repeats":1},{"count":9404197,"lower_bound":"OTc1MzgxMjg4NTAyMDE4MDYy","upper_bound":"OTc1OTEyNDc2MTE1NDg0Njg1","repeats":1},{"count":9458872,"lower_bound":"OTc1OTIwNjU2NTQzMjM2MTEw","upper_bound":"OTc2NDE0MzE3NzI4ODc0NTEw","repeats":1},{"count":9513548,"lower_bound":"OTc2NDQzMzY2NTc5NjM0MTkw","upper_bound":"OTc3MDgwOTY2NjU0MTQ4NjIw","repeats":1},{"count":9568223,"lower_bound":"OTc3MDk3MjgzOTI4NDQwODQ1","upper_bound":"OTc3NTQwMzU4NzI4NTY0NzQ5","repeats":1},{"count":9622899,"lower_bound":"OTc3NTQyODc0MTQ5MTc1MzEw","upper_bound":"OTc4MTc2OTQ1ODAzNjA4MDc4","repeats":1},{"count":9677574,"lower_bound":"OTc4MTkyNzYwNTU3MTkxMTgy","upper_bound":"OTc4ODQyOTI0MDQ5NTk2NDMw","repeats":1},{"count":9732250,"lower_bound":"OTc4ODQ4NTI1OTQ4NjY1ODY5","upper_bound":"OTc5MjcwNzE0NTIzMjM4NDE0","repeats":1},{"count":9786925,"lower_bound":"OTc5MjkyNTAxNTU2NTQzNTAx","upper_bound":"OTc5ODg5Mjk4NzQyMDM0NDQ2","repeats":1},{"count":9841601,"lower_bound":"OTc5ODkwOTgwMzcwMTIyMjUy","upper_bound":"OTgwMjE4MjMwMzU2NTc0MjIy","repeats":1},{"count":9896277,"lower_bound":"OTgwMjI1MjEwNjM4MDI0NzE2","upper_bound":"OTgwNzE1NjcyNjU0OTU0NTA5","repeats":1},{"count":9950952,"lower_bound":"OTgwNzE4MDM5MjQ1NTA0NTMz","upper_bound":"OTgxMTU0NDM3OTE1ODM2NDI4","repeats":1},{"count":10005628,"lower_bound":"OTgxMTU4NjU4NTQzMDA5ODA2","upper_bound":"OTgxNTM4MzA5NDE2Nzk2MTgx","repeats":1},{"count":10060303,"lower_bound":"OTgxNTYyNzA0ODIwNTUxNjkz","upper_bound":"OTgyMDM3MTQ4NDk0Mzk3NDYx","repeats":1},{"count":10114979,"lower_bound":"OTgyMDM5NDIxMTg2MzI2NTQx","upper_bound":"OTgyMzkyNjEzMzA0Mzg1NTQ4","repeats":1},{"count":10169654,"lower_bound":"OTgyMzkzODM3MTkyNzQxOTAy","upper_bound":"OTgyODMwODAzMDIyNjI2ODIw","repeats":1},{"count":10224330,"lower_bound":"OTgyODM1OTE2NTMyNzQ0MjA1","upper_bound":"OTgzMTMyMzg3MzI5ODE4NjM4","repeats":1},{"count":10279006,"lower_bound":"OTgzMTUyOTc5MjczODI2MzE4","upper_bound":"OTgzNTQ1MTMzMjM2OTQ0OTA5","repeats":1},{"count":10333681,"lower_bound":"OTgzNTQ3MTY0MDMwNDg0NDky","upper_bound":"OTgzOTUzMDkwNDYzNzc2Nzgw","repeats":1},{"count":10388357,"lower_bound":"OTgzOTYwOTg2NjgxNDc1MDg2","upper_bound":"OTg0MzE4MjAyNjA1OTEyMDg1","repeats":1},{"count":10443032,"lower_bound":"OTg0MzE5NDU0MDUzNTE1Mjc3","upper_bound":"OTg0NzM2ODQ5NjU1NjkzMzI2","repeats":1},{"count":10497708,"lower_bound":"OTg0NzQyOTU1NzE2MTE2NTAx","upper_bound":"OTg1MDk4NTY0ODM5ODMzNjEy","repeats":1},{"count":10552383,"lower_bound":"OTg1MDk5ODE2OTg0ODg3MzEw","upper_bound":"OTg1NDk4NDI4NTA3OTMwNjQ1","repeats":1},{"count":10607059,"lower_bound":"OTg1NTA0MjgzODk2MTY4NDY5","upper_bound":"OTg2MTE5MjUzMTc4MTcxNDA0","repeats":1},{"count":10661734,"lower_bound":"OTg2MTM5NjA5ODE5MzMyNjIx","upper_bound":"OTg2NTA3MzI0NjE5MzQxODQ1","repeats":1},{"count":10716410,"lower_bound":"OTg2NTEwMDc2ODI5NDMzODY5","upper_bound":"OTg3MDk0NTUyNDAxMDY4MDQ2","repeats":1},{"count":10771086,"lower_bound":"OTg3MTE1Njg4OTE5Njc4OTk3","upper_bound":"OTg3NTIzNzU3NDkyNjAwODQ1","repeats":1},{"count":10825761,"lower_bound":"OTg3NTI5MjkxNzY4NzI1NTE3","upper_bound":"OTg3OTQ4NDA3MTk0MDc1MTUw","repeats":1},{"count":10880437,"lower_bound":"OTg3OTY0NDkzMTg0MzUyMjY4","upper_bound":"OTg4NDIzNDc1NTY1MTAxMDc3","repeats":1},{"count":10935112,"lower_bound":"OTg4NDMwMzI3MjUyNzYzMTUw","upper_bound":"OTg4OTU0NzAyMTg2ODQwMDc3","repeats":1},{"count":10989788,"lower_bound":"OTg4OTY2MDU4NDA4MTMyNjIx","upper_bound":"OTg5MzkzOTE5MTYwMjIxNzEw","repeats":1},{"count":11044463,"lower_bound":"OTg5NDA0OTkyMDI3MzQ0OTA4","upper_bound":"OTg5ODIxNDg3MjIwNzY4Nzgw","repeats":1},{"count":11099139,"lower_bound":"OTg5ODMxMzc1NTM1ODY1ODcw","upper_bound":"OTkwNDc3NDAxNTg3NDMzNDg0","repeats":1},{"count":11153815,"lower_bound":"OTkwNDc4NTg5NDY4MDgyMTk3","upper_bound":"OTkwODA3NDQ2Mzg4MjI4MTA4","repeats":1},{"count":11208490,"lower_bound":"OTkwODIwOTY4MzM0NDc1Mjc3","upper_bound":"OTkxMzE1Mjk5MjM0MzMyNjg1","repeats":1},{"count":11263166,"lower_bound":"OTkxMzMyMTk2Mjc1NTE5NTAx","upper_bound":"OTkxOTc2MDg0ODA3OTkxMzA4","repeats":1},{"count":11317841,"lower_bound":"OTkxOTk1OTMzODM5MDY1MTAx","upper_bound":"OTkyNTk5OTM0MDg5MjgxNTU3","repeats":1},{"count":11372517,"lower_bound":"OTkyNjIwNzgzNjcwOTE5MTgx","upper_bound":"OTkyOTgzNTgwMTg5NTA3NTk2","repeats":1},{"count":11427192,"lower_bound":"OTkzMDEyOTIyMjI3MzQzMzcz","upper_bound":"OTkzNjU0MjAwMjY4ODQ5MTcz","repeats":1},{"count":11481868,"lower_bound":"OTkzNjcwNjk5NzgzMTQzNDM3","upper_bound":"OTk0MTM5NjAzMzQ5OTEzNjE0","repeats":1},{"count":11536544,"lower_bound":"OTk0MTQ5ODQ5NzgwNzY0Njg0","upper_bound":"OTk0NTQ5NjE2NjE5MDc5Njk0","repeats":1},{"count":11591219,"lower_bound":"OTk0NTUwNDQ3ODgwNzgxODM3","upper_bound":"OTk1MTA0OTc5MzMzOTIyODI4","repeats":1},{"count":11645895,"lower_bound":"OTk1MTEyNzE4OTk5Nzk3Nzc0","upper_bound":"OTk1NTAyNDc4MDQwOTA3Nzg4","repeats":1},{"count":11700570,"lower_bound":"OTk1NTA0MDI4MDMyMTU1NjY5","upper_bound":"OTk1ODkxNDUwNjMxOTI5ODc3","repeats":1},{"count":11755246,"lower_bound":"OTk1OTAwMzUzNzA2ODIwMTEw","upper_bound":"OTk2MzI4MDI4NzE2MDQwMjA2","repeats":1},{"count":11809921,"lower_bound":"OTk2MzMxMjg1MjAwMDkzMjA1","upper_bound":"OTk2NzEzMjA4NTQ3MjI5NzEw","repeats":1},{"count":11864597,"lower_bound":"OTk2NzIyMDY4MDI1MzkzMTcz","upper_bound":"OTk3MzEwNjAyNDc4MzcwODMw","repeats":1},{"count":11919272,"lower_bound":"OTk3MzExNjUwMjMzOTU4NDE0","upper_bound":"OTk3NzUwOTQ3MjIxMzIzNzg5","repeats":1},{"count":11973948,"lower_bound":"OTk3NzYyNjUzNzIwMDg0NDk0","upper_bound":"OTk4MTA4NDg1MDg1MTUxMjQ2","repeats":1},{"count":12028624,"lower_bound":"OTk4MTEzMzcyNjc2ODAwNTI0","upper_bound":"OTk4NTQ0OTI1MDQxMzQ0NTI2","repeats":1},{"count":12083299,"lower_bound":"OTk4NTQ3NjU5MDUyMjM2ODEz","upper_bound":"OTk5MDk1MjEzMTI3NDgzNDA2","repeats":1},{"count":12137975,"lower_bound":"OTk5MTA2ODk5MTEwMjk3NjE0","upper_bound":"OTk5NjA2MjUzMDkzNzMyMzY1","repeats":1},{"count":12192650,"lower_bound":"OTk5NjIwNTc4NjI5OTk1NTMz","upper_bound":"MTAwMDAzMjY3OTIyMzA4MzAyMQ==","repeats":1},{"count":12247326,"lower_bound":"MTAwMDA0MTU0Nzc2OTE4NDI2OA==","upper_bound":"MTAwMDU4MjQxNDE2ODYwNjczMg==","repeats":1},{"count":12302001,"lower_bound":"MTAwMDU5OTMwMTIxMDgxNjUyNg==","upper_bound":"MTAwMTE0MTg3OTU1NTkzMjE3NA==","repeats":1},{"count":12356677,"lower_bound":"MTAwMTI0ODU2ODAzNDc1NDU4MQ==","upper_bound":"MTAwMTYzMjY3MTY0MzE4OTI2OQ==","repeats":1},{"count":12411353,"lower_bound":"MTAwMTY0NzEzNDk4NTI4OTc0MQ==","upper_bound":"MTAwMjAzOTY4MzMxNTk3NDE1OA==","repeats":1},{"count":12466028,"lower_bound":"MTAwMjA0MTk2ODY5MzQxMTg2MQ==","upper_bound":"MTAwMjU0MDQzNjc1NjYxMTA5Mw==","repeats":1},{"count":12520704,"lower_bound":"MTAwMjU0MTk5MDE5Nzk4NTI5NA==","upper_bound":"MTAwMzA5ODU4NTAwNDgwMzU5OA==","repeats":1},{"count":12575379,"lower_bound":"MTAwMzEwMTUxOTM3NDM2OTgwNQ==","upper_bound":"MTAwMzQ4MjgwMjk3NDk5ODU0OQ==","repeats":1},{"count":12630055,"lower_bound":"MTAwMzQ4NjU3ODYzMTg4NDgxMw==","upper_bound":"MTAwMzkxMjkwNzgzNjYyMDgxMw==","repeats":1},{"count":12684730,"lower_bound":"MTAwMzkxOTM2MzIwODkzNzQ5Mw==","upper_bound":"MTAwNDM0ODQzMzU5NTc3NzAzOA==","repeats":1},{"count":12739406,"lower_bound":"MTAwNDM1NjM1Mjg3MjgwODQ2MQ==","upper_bound":"MTAwNTAwMDczNTg2MjI3NjEwOQ==","repeats":1},{"count":12794081,"lower_bound":"MTAwNTAwNzM5MjkxMjE2MjgzNw==","upper_bound":"MTAwNTM0MjEzNTI4MjIwNDY5Mw==","repeats":1},{"count":12848757,"lower_bound":"MTAwNTM0NDIzMDE5ODA4MzU5Nw==","upper_bound":"MTAwNTc0NDYxODAyMTM0MDY4NA==","repeats":1},{"count":12903433,"lower_bound":"MTAwNTc0NzgyMjAzNDc4MDE3NA==","upper_bound":"MTAwNjIxMDk2ODcxODgzNTczMw==","repeats":1},{"count":12958108,"lower_bound":"MTAwNjIyMjE4MzAwMTA3OTgyOQ==","upper_bound":"MTAwNjY4NTM1NzAyMDUxMjI2OA==","repeats":1},{"count":13012784,"lower_bound":"MTAwNjY5MzE2MjQwNDM5NzA3Nw==","upper_bound":"MTAwNzA1ODg2ODU4Mjk4OTgzNw==","repeats":1},{"count":13067459,"lower_bound":"MTAwNzA2ODYyOTU3MjUzOTQxMw==","upper_bound":"MTAwNzQ1Nzc0MjA4MDg1MjQ5NA==","repeats":1},{"count":13122135,"lower_bound":"MTAwNzQ2MDE1MDQwOTk2OTY4NQ==","upper_bound":"MTAwNzc5OTE2MjM0ODMwNjQ1Mw==","repeats":1},{"count":13176810,"lower_bound":"MTAwNzgwMTM3NTQzNTc2NzgyMA==","upper_bound":"MTAwODAyNTU2NTgzOTIxMjU1Ng==","repeats":1},{"count":13231486,"lower_bound":"MTAwODA0NDM1NDIwMDkxMTg5Mw==","upper_bound":"MTAwODMyMDcwNzI5MTc1ODYwNQ==","repeats":1},{"count":13286162,"lower_bound":"MTAwODM0NzU1MjMzMDQ5ODA2MA==","upper_bound":"MTAwODcwMTAwMDQ0NDg3MDY3Nw==","repeats":1},{"count":13340837,"lower_bound":"MTAwODcwMTQxNjg5OTk4NTQyOQ==","upper_bound":"MTAwOTIzODk1NjAyMzcyNjA5NA==","repeats":1},{"count":13395513,"lower_bound":"MTAwOTI0MDA5NzEwMTU2MTg3Nw==","upper_bound":"MTAwOTYxMjk2MTQxNDk4Nzc4OQ==","repeats":1},{"count":13450188,"lower_bound":"MTAwOTYxNTc3OTY5NzE5ODYxMw==","upper_bound":"MTAwOTgyMDEwMTY0MzI4ODU5MA==","repeats":1},{"count":13504864,"lower_bound":"MTAwOTgyNjI3ODQxMjM2OTkzNA==","upper_bound":"MTAxMDExMTAyMzEyNjcyNTE0MQ==","repeats":1},{"count":13559539,"lower_bound":"MTAxMDExODAzOTkzMjU2OTEwMg==","upper_bound":"MTAxMDUwMzUyMDY4ODI1OTA4NQ==","repeats":1},{"count":13614215,"lower_bound":"MTAxMDUzMjk4OTQ5MDkzNzg2OA==","upper_bound":"MTAxMDkxMDU3MDgwMDQ2Mzg4NA==","repeats":1},{"count":13668891,"lower_bound":"MTAxMDkxMzkwNTQzOTA2NDA3OA==","upper_bound":"MTAxMTMwNDg4Mzc5NTkwMjQ3Nw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[6716,6657,6683,6771,6567,6577,6645,6628,6657,6601,6700,6739,6603,6524,6667,6920,6645,6795,6749,6720,6777,6620,6575,6573,6642,6687,6699,6779,6605,6707,6821,6550,6665,6686,6727,6543,6692,6739,6676,6802,6659,6746,6590,6708,6646,6739,6535,6715,6659,6612,6528,6747,6907,6673,6684,6824,6640,6701,6757,6687,6635,6577,6765,6713,6758,6631,6801,6683,6772,6693,6690,6720,6629,6653,6802,6771,6648,6686,6755,6616,6649,6596,6689,6706,6695,6741,6679,6657,6696,6818,6670,6688,6727,6742,6752,6685,6630,6726,6717,6688,6644,6662,6639,6776,6696,6795,6677,6607,6809,6686,6638,6537,6711,6547,6629,6779,6774,6599,6630,6745,6601,6400,6626,6655,6704,6613,6660,6821,6742,6646,6529,6753,6667,6691,6791,6613,6670,6682,6555,6608,6697,6641,6887,6584,6604,6718,6695,6806,6724,6587,6615,6681,6617,6767,6681,6577,6559,6734,6587,6653,6443,6720,6760,6665,6566,6818,6595,6592,6746,6525,6678,6639,6718,6744,6707,6644,6644,6754,6741,6702,6723,6622,6601,6612,6904,6704,6654,6723,6602,6773,6602,6792,6703,6661,6766,6646,6869,6642,6803,6822,6764,6692,6613,6701,6587,6701,6747,6887,6645,6661,6660,6691,6662,6753,6513,6758,6769,6445,6713,6684,6619,6718,6870,6772,6630,6632,6601,6555,6568,6666,6772,6734,6576,6683,6552,6703,6732,6791,6540,6651,6771,6550,6780,6685,6658,6628,6703,6683,6800,6664,6705,6675,6591,6755,6753,6597,6600,6942,6577,6675,6663,6692,6659,6717,6693,6667,6764,6697,6720,6694,6652,6851,6604,6784,6658,6723,6598,6555,6828,6703,6670,6673,6746,6605,6623,6809,6769,6662,6823,6596,6671,6801,6687,6613,6664,6732,6706,6582,6902,6685,6565,6642,6616,6692,6561,6715,6847,6679,6566,6548,6795,6645,6643,6724,6606,6541,6556,6572,6647,6763,6779,6781,6628,6677,6779,6875,6538,6610,6713,6936,6627,6611,6734,6611,6640,6626,6601,6664,6739,6632,6799,6723,6750,6719,6827,6734,6574,6694,6800,6605,6813,6657,6770,6867,6883,6585,6761,6834,6726,6745,6650,6704,6775,6859,6794,6719,6702,6613,6741,6582,6520,6779,6584,6771,6673,6676,6632,6811,6756,6718,6572,6595,6502,6604,6690,6654,6718,6687,6728,6541,6723,6648,6582,6728,6714,6697,6766,6665,6672,6642,6716,6745,6622,6507,6636,6711,6743,6739,6583,6592,6647,6665,6640,6614,6634,6653,6679,6571,6710,6838,6701,6587,6772,6577,6593,6577,6640,6699,6785,6783,6812,6734,6702,6573,6758,6847,6687,6626,6785,6794,6652,6616,6668,6644,6692,6618,6656,6577,6726,6688,6667,6588,6901,6702,6674,6803,6622,6589,6601,6775,6554,6747,6686,6627,6674,6758,6646,6635,6448,6785,6882,6505,6650,6650,6626,6595,6707,6665,6841,6838,6617,6617,6763,6613,6786,6728,6766,6604,6632,6678,6721,6768,6825,6584,6831,6690,6860,6728,6677,6711,6607,6667,6582,6560,6528,6636,6735,6765,6652,6644,6725,6717,6653,6682,6902,6648,6757,6620,6713,6621,6548,6765,6586,6530,6477,6536,6632,6669,6611,6626,6576,6595,6688,6657,6826,6625,6654,6681,6612,6557,6786,6699,6707,6639,6663,6779,6613,6622,6750,6481,6563,6576,6650,6634,6601,6621,6690,6722,6690,6762,6749,6734,6782,6759,6611,6635,6706,6598,6596,6757,6600,6499,6729,6535,6604,6775,6595,6690,6541,6777,6578,6555,6852,6708,6701,6565,6521,6636,6639,6693,6871,6585,6755,6638,6615,6691,6615,6686,6544,6856,6736,6839,6654,6630,6733,6704,6679,6601,6772,6840,6629,6671,6693,6685,6744,6691,6600,6623,6605,6619,6657,6448,6576,6540,6754,6782,6619,6761,6643,6680,6757,6785,6627,6555,6442,6760,6627,6735,6754,6796,6686,6762,6742,6594,6562,6660,6445,6732,6741,6729,6531,6726,6746,6728,6605,6555,6600,6607,6710,6709,6617,6604,6661,6673,6614,6587,6664,6659,6633,6730,6630,6636,6651,6811,6631,6770,6736,6613,6824,6754,6783,6570,6694,6774,6726,6679,6689,6735,6626,6672,6638,6585,6590,6741,6771,6689,6705,6647,6659,6778,6598,6787,6770,6574,6545,6557,6837,6759,6635,6665,6693,6588,6628,6777,6699,6556,6640,6794,6680,6564,6611,6668,6590,6708,6662,6647,6747,6589,6681,6598,6571,6670,6518,6719,6621,6586,6578,6633,6856,6571,6604,6624,6652,6576,6553,6646,6615,6583,6595,6721,6793,6484,6584,6715,6799,6498,6628,6632,6582,6838,6587,6428,6556,6614,6701,6474,6526,6841,6770,6711,6740,6715,6634,6687,6555,6573,6612,6584,6643,6631,6598,6650,6632,6594,6512,6800,6608,6688,6737,6629,6725,6710,6672,6775,6693,6729,6648,6489,6768,6679,6726,6612,6523,6692,6677,6686,6787,6730,6698,6549,6626,6738,6671,6559,6540,6777,6762,6611,6562,6663,6725,6651,6791,6580,6637,6605,6766,6686,6733,6584,6580,6659,6862,6757,6699,6788,6579,6606,6665,6716,6577,6775,6600,6720,6624,6650,6612,6687,6810,6564,6738,6639,6537,6808,6701,6760,6700,6744,6740,6813,6628,6573,6651,6710,6784,6734,6630,6669,6804,6605,6660,6759,6713,6651,6714,6707,6587,6674,6698,6706,6511,6693,6693,6575,6534,6819,6682,6618,6768,6894,6597,6646,6762,6804,6615,6606,6721,6733,6594,6609,6554,6718,6587,6635,6616,6711,6710,6669,6658,6727,6640,6725,6498,6617,6643,6470,6592,6607,6561,6696,6766,6643,6702,6763,6639,6587,6627,6661,6534,6575,6560,6499,6570,6725,6562,6600,6605,6847,6660,6538,6587,6790,6720,6694,6712,6778,6637,6699,6603,6649,6491,6708,6592,6779,6705,6893,6807,6705,6602,6574,6707,6655,6681,6663,6589,6750,6605,6618,6717,6717,6552,6705,6610,6621,6489,6643,6624,6738,6570,6709,6673,6549,6758,6629,6839,6597,6661,6793,6667,6631,6555,6654,6757,6630,6761,6620,6750,6794,6603,6647,6715,6721,6788,6681,6598,6659,6615,6815,6680,6704,6579,6640,6682,6633,6615,6701,6678,6684,6672,6628,6804,6714,6637,6709,6641,6701,6814,6601,6608,6647,6673,6793,6593,6688,6515,6844,6789,6707,6785,6650,6548,6519,6676,6681,6753,6887,6684,6612,6637,6757,6774,6860,6682,6578,6700,6534,6694,6636,6560,6680,6770,6648,6590,6626,6510,6760,6490,6841,6624,6701,6713,6749,6718,6710,6642,6604,6605,6716,6656,6587,6585,6693,6656,6586,6573,6709,6570,6696,6734,6549,6774,6741,6682,6696,6762,6662,6651,6631,6579,6657,6681,6798,6659,6671,6610,6763,6720,6684,6382,6636,6763,6725,6632,6604,6718,6733,6646,6702,6685,6719,6485,6670,6615,6693,6719,6544,6675,6592,6708,6775,6665,6678,6538,6851,6679,6658,6571,6685,6771,6734,6635,6621,6706,6578,6613,6645,6783,6582,6826,6679,6781,6959,6673,6681,6679,6611,6643,6678,6630,6591,6637,6617,6649,6596,6649,6652,6720,6750,6600,6857,6701,6695,6645,6754,6581,6708,6459,6538,6812,6681,6608,6552,6609,6582,6755,6833,6599,6650,6630,6646,6530,6608,6836,6686,6703,6693,6673,6723,6607,6714,6793,6679,6807,6712,6738,6656,6609,6723,6568,6604,6611,6654,6858,6676,6635,6569,6732,6722,6680,6720,6589,6555,6611,6581,6830,6739,6771,6726,6749,6663,6667,6563,6723,6516,6679,6759,6599,6753,6606,6842,6793,6610,6626,6740,6711,6710,6545,6561,6737,6769,6457,6830,6687,6675,6649,6541,6728,6818,6673,6618,6851,6716,6832,6824,6751,6715,6825,6737,6576,6765,6653,6635,6441,6579,6612,6788,6751,6564,6799,6568,6772,6587,6477,6849,6670,6837,6789,6801,6712,6923,6665,6566,6701,6606,6771,6738,6650,6688,6680,6612,6721,6849,6419,6553,6712,6706,6765,6936,6585,6735,6732,6801,6655,6745,6560,6840,6689,6713,6550,6690,6656,6816,6792,6633,6668,6817,6715,6540,6705,6762,6652,6834,6610,6682,6731,6756,6755,6598,6611,6772,6820,6529,6579,6712,6672,6626,6726,6647,6618,6616,6636,6573,6719,6779,6588,6557,6656,6700,6729,6569,6720,6656,6794,6759,6630,6815,6675,6482,6647,6781,6742,6548,6668,6687,6818,6629,6611,6702,6762,6651,6738,6743,6613,6517,6640,6611,6618,6645,6717,6699,6541,6734,6691,6547,6681,6701,6675,6706,6549,6675,6866,6635,6568,6782,6820,6586,6609,6644,6598,6561,6649,6764,6707,6630,6751,6633,6554,6528,6716,6596,6761,6725,6590,6677,6758,6764,6805,6538,6571,6664,6709,6570,6711,6758,6715,6597,6670,6762,6597,6660,6680,6697,6634,6682,6708,6852,6595,6772,6760,6666,6760,6639,6953,6690,6619,6822,6672,6714,6702,6686,6640,6625,6515,6583,6635,6622,6542,6716,6837,6857,6633,6769,6676,6901,6721,6719,6598,6757,6583,6727,6781,6593,6716,6686,6787,6727,6896,6792,6815,6605,6765,6795,6559,6592,6568,6751,6776,6576,6794,6639,6598,6760,6715,6746,6618,6713,6678,6684,6672,6933,6712,6675,6654,6526,6666,6793,6750,6706,6623,6581,6715,6744,6635,6662,6605,6682,6727,6716,6724,6620,6710,6684,6627,6711,6604,6537,6731,6710,6717,6594,6662,6721,6625,6688,6648,6652,6713,6624,6705,6518,6659,6630,6780,6764,6615,6378,6744,6765,6575,6565,6792,6652,6605,6677,6604,6606,6921,6630,6702,6564,6774,6611,6795,6678,6604,6614,6611,6668,6696,6698,6756,6683,6816,6754,6767,6764,6588,6659,6589,6729,6443,6838,6626,6598,6585,6606,6503,6574,6764,6602,6830,6730,6642,6682,6698,6667,6574,6604,6797,6638,6710,6690,6645,6609,6874,6628,6809,6685,6655,6553,6638,6755,6855,6696,6558,6616,6684,6618,6658,6639,6602,6654,6733,6724,6612,6728,6748,6677,6509,6730,6690,6723,6667,6856,6729,6728,6560,6798,6775,6765,6504,6652,6644,6633,6690,6745,6764,6800,6686,6791,6683,6527,6547,6739,6716,6620,6763,6777,6683,6704,6575,6673,6643,6561,6702,6583,6671,6723,6691,6721,6816,6733,6731,6696,6532,6646,6662,6652,6696,6690,6580,6414,6665,6731,6531,6598,6616,6783,6570,6679,6540,6691,6743,6846,6671,6640,6725,6591,6639,6673,6878,6721,6475,6687,6701,6538,6783,6631,6658,6663,6603,6572,6605,6594,6797,6656,6762,6645,6712,6751,6607,6703,6714,6679,6609,6684,6630,6541,6704,6499,6763,6728,6632,6673,6563,6735,6548,6755,6726,6756,6737,6732,6610,6655,6729,6707,6602,6681,6848,6647,6692,6711,6648,6562,6631,6891,6625,6609,6837,6669,6732,6367,6461,6666,6594,6682,6775,6524,6610,6665,6833,6772,6690,6540,6533,6839,6739,6604,6653,6625,6704,6690,6611,6659,6564,6799,6692,6662,6676,6645,6777,6678,6579,6509,6719,6748,6594,6728,6672,6825,6677,6821,6649,6761,6612,6597,6741,6618,6799,6637,6600,6731,6742,6521,6655,6545,6697,6438,6454,6627,6542,6642,6746,6607,6653,6562,6652,6700,6665,6625,6759,6764,6846,6836,6692,6742,6551,6628,6835,6601,6833,6546,6714,6735,6772,6661,6627,6561,6547,6700,6651,6713,6606,6608,6648,6648,6814,6829,6644,6827,6717,6799,6612,6578,6661,6662,6609,6681,6637,6698,6682,6778,6718,6615,6486,6722,6544,6714,6700,6706,6548,6597,6612,6779,6900,6638,6612,6650,6507,6610,6811,6653,6742,6700,6629,6721,6737,6694,6516,6741,6553,6613,6617,6649,6858,6616,6784,6639,6751,6692,6786,6697,6674,6547,6626,6633,6687,6547,6544,6531,6595,6497,6810,6748,6696,6590,6732,6638,6740,6604,6754,6573,6714,6801,6707,6770,6485,6665,6544,6958,6698,6754,6767,6734,6797,6799,6729,6779,6687,6653,6831,6620,6589,6679,6627,6713,6501,6537,6733,6596,6683,6657,6598,6513,6734,6712,6579,6694,6626,6624,6657,6477,6634,6606,6677,6672,6756,6596,6776,6751,6688,6725,6639,6589,6651,6655,6614,6487,6608,6691,6632,6738,6605,6711,6683,6546,6688,6669,6687,6646,6719,6668,6752,6651,6825,6596,6727,6623,6738,6668,6499,6632,6693,6571,6475,6705,6577,6622,6666,6815,6534,6644,6705,6730,6643,6682,6725,6708,6669,6655,6588,6647,6708,6602,6631,6656,6704,6845]},{"counters":[6621,6765,6641,6817,6615,6635,6812,6668,6657,6808,6738,6624,6650,6651,6771,6731,6694,6616,6768,6772,6601,6572,6496,6733,6683,6626,6773,6677,6823,6569,6563,6743,6666,6710,6751,6711,6582,6822,6777,6685,6656,6687,6740,6725,6597,6729,6430,6535,6739,6621,6669,6711,6832,6793,6599,6650,6623,6585,6611,6654,6536,6679,6672,6719,6612,6772,6636,6714,6683,6632,6633,6693,6608,6601,6703,6741,6561,6600,6682,6621,6638,6481,6689,6777,6748,6684,6512,6598,6843,6560,6698,6592,6754,6863,6751,6642,6663,6658,6702,6692,6663,6642,6644,6638,6774,6747,6868,6652,6715,6764,6860,6609,6658,6523,6586,6746,6697,6683,6710,6602,6599,6573,6718,6735,6709,6784,6799,6591,6638,6598,6599,6702,6720,6736,6594,6689,6598,6669,6617,6603,6565,6754,6491,6629,6797,6621,6667,6538,6618,6666,6636,6704,6667,6808,6742,6657,6830,6580,6740,6634,6723,6652,6703,6830,6731,6784,6784,6690,6659,6646,6926,6675,6721,6566,6759,6637,6771,6522,6705,6699,6749,6633,6702,6563,6651,6485,6682,6718,6637,6625,6753,6785,6656,6598,6560,6885,6624,6652,6639,6686,6663,6347,6738,6534,6606,6589,6632,6640,6674,6640,6632,6545,6768,6678,6597,6819,6649,6568,6553,6714,6814,6629,6599,6750,6759,6752,6619,6582,6453,6527,6839,6639,6602,6710,6854,6811,6640,6602,6837,6718,6710,6531,6608,6701,6642,6704,6649,6574,6562,6652,6781,6648,6607,6468,6640,6565,6565,6635,6496,6806,6698,6847,6709,6694,6655,6596,6814,6807,6720,6508,6678,6589,6639,6866,6585,6654,6613,6657,6691,6562,6620,6677,6552,6743,6645,6739,6631,6744,6589,6730,6587,6692,6630,6545,6627,6727,6678,6612,6671,6822,6661,6664,6657,6636,6853,6663,6717,6660,6593,6831,6693,6771,6687,6704,6660,6591,6692,6809,6638,6618,6812,6552,6722,6631,6762,6689,6856,6749,6734,6560,6646,6689,6673,6702,6696,6650,6821,6607,6664,6792,6825,6691,6597,6666,6697,6686,6681,6548,6622,6917,6676,6517,6777,6492,6607,6661,6712,6644,6598,6727,6769,6658,6559,6879,6692,6586,6587,6761,6665,6671,6761,6756,6619,6748,6614,6710,6800,6702,6561,6749,6571,6820,6824,6781,6658,6783,6736,6548,6621,6621,6750,6652,6810,6699,6649,6469,6610,6801,6644,6594,6777,6719,6649,6763,6588,6716,6531,6775,6839,6642,6729,6669,6654,6859,6649,6593,6690,6712,6632,6851,6653,6704,6665,6841,6540,6637,6752,6614,6807,6553,6631,6726,6848,6707,6609,6741,6760,6667,6655,6725,6351,6633,6675,6710,6471,6776,6620,6664,6629,6667,6640,6653,6685,6815,6689,6591,6562,6644,6791,6618,6589,6650,6501,6709,6722,6634,6370,6531,6681,6742,6687,6671,6826,6619,6851,6731,6736,6666,6699,6650,6697,6751,6669,6704,6598,6659,6708,6594,6465,6566,6533,6607,6650,6783,6705,6619,6683,6676,6697,6578,6593,6763,6892,6561,6594,6614,6483,6611,6648,6650,6789,6557,6570,6754,6726,6698,6585,6606,6757,6688,6702,6633,6559,6611,6594,6788,6592,6827,6641,6653,6623,6769,6756,6517,6643,6585,6761,6591,6832,6576,6587,6669,6509,6638,6764,6598,6704,6701,6602,6567,6565,6632,6570,6638,6833,6636,6715,6693,6597,6622,6726,6677,6791,6613,6583,6644,6710,6534,6894,6843,6586,6587,6467,6660,6682,6756,6762,6604,6583,6719,6667,6751,6818,6559,6602,6416,6600,6873,6609,6741,6744,6575,6799,6648,6756,6650,6608,6845,6550,6678,6503,6853,6736,6773,6479,6691,6632,6680,6865,6594,6667,6834,6706,6670,6587,6677,6714,6653,6590,6690,6707,6566,6616,6773,6668,6768,6663,6572,6721,6658,6625,6718,6612,6551,6679,6737,6672,6540,6609,6577,6763,6750,6658,6611,6699,6816,6612,6622,6679,6694,6802,6758,6771,6769,6624,6723,6713,6715,6585,6769,6526,6840,6507,6630,6826,6737,6610,6599,6616,6702,6804,6733,6640,6714,6597,6629,6720,6834,6696,6689,6674,6625,6681,6506,6696,6660,6599,6846,6687,6721,6638,6661,6580,6520,6639,6779,6680,6557,6729,6677,6769,6701,6585,6733,6707,6752,6772,6625,6786,6638,6600,6744,6582,6637,6767,6780,6666,6680,6754,6669,6607,6764,6573,6631,6486,6598,6895,6640,6725,6564,6598,6664,6808,6566,6757,6648,6619,6659,6445,6689,6880,6498,6586,6642,6703,6672,6774,6564,6570,6775,6580,6843,6760,6642,6672,6733,6818,6643,6775,6618,6608,6707,6830,6637,6707,6610,6708,6572,6809,6809,6825,6502,6700,6638,6714,6677,6650,6692,6817,6737,6636,6682,6770,6605,6764,6693,6587,6728,6703,6650,6660,6640,6505,6761,6696,6635,6619,6624,6783,6505,6656,6686,6848,6650,6765,6722,6579,6740,6627,6716,6562,6647,6744,6736,6522,6692,6648,6641,6719,6687,6547,6609,6710,6679,6677,6680,6730,6613,6695,6654,6725,6717,6779,6870,6717,6672,6798,6759,6747,6760,6695,6684,6638,6595,6751,6659,6729,6656,6613,6622,6581,6778,6736,6794,6835,6611,6745,6602,6662,6654,6761,6715,6679,6677,6697,6671,6669,6685,6663,6775,6657,6434,6506,6658,6732,6846,6606,6749,6685,6599,6515,6675,6718,6804,6613,6640,6751,6627,6774,6655,6562,6603,6820,6731,6695,6567,6605,6620,6652,6713,6713,6751,6570,6800,6689,6581,6667,6648,6613,6739,6763,6698,6796,6592,6717,6679,6498,6656,6654,6610,6627,6712,6688,6621,6699,6661,6805,6687,6641,6765,6659,6736,6720,6634,6661,6756,6678,6767,6852,6635,6521,6624,6522,6649,6692,6648,6670,6752,6749,6684,6780,6729,6492,6650,6608,6597,6804,6699,6587,6526,6717,6686,6555,6644,6632,6610,6592,6603,6543,6745,6567,6728,6809,6631,6660,6702,6665,6643,6792,6593,6722,6638,6679,6691,6758,6661,6591,6787,6657,6661,6764,6562,6778,6576,6640,6727,6805,6738,6733,6559,6827,6772,6586,6631,6623,6696,6731,6669,6757,6527,6701,6509,6670,6769,6555,6630,6595,6734,6633,6777,6637,6634,6788,6487,6665,6719,6754,6785,6560,6650,6722,6713,6650,6602,6594,6718,6702,6605,6604,6703,6802,6730,6717,6580,6792,6691,6674,6721,6603,6813,6793,6889,6558,6640,6678,6829,6786,6758,6691,6790,6702,6668,6681,6574,6726,6693,6717,6694,6857,6606,6716,6621,6479,6688,6800,6553,6706,6725,6638,6700,6562,6645,6707,6867,6856,6519,6621,6753,6829,6648,6723,6711,6766,6572,6544,6708,6572,6764,6696,6717,6558,6387,6667,6575,6517,6591,6620,6616,6638,6738,6726,6603,6796,6706,6568,6654,6699,6657,6657,6849,6631,6565,6708,6667,6796,6845,6717,6704,6806,6649,6777,6596,6766,6629,6576,6660,6634,6590,6669,6721,6611,6637,6831,6840,6690,6634,6833,6681,6782,6450,6783,6716,6834,6536,6632,6648,6801,6757,6562,6718,6759,6726,6541,6629,6622,6713,6714,6662,6712,6614,6855,6582,6687,6646,6727,6551,6649,6600,6785,6689,6670,6813,6803,6664,6523,6535,6607,6616,6739,6728,6620,6578,6679,6628,6593,6802,6653,6757,6558,6604,6704,6714,6548,6802,6786,6818,6626,6604,6773,6667,6732,6678,6608,6598,6793,6632,6790,6795,6735,6718,6703,6668,6633,6560,6599,6660,6702,6645,6663,6609,6639,6672,6605,6651,6583,6625,6698,6650,6616,6785,6705,6727,6498,6710,6636,6538,6697,6794,6679,6663,6733,6650,6839,6790,6618,6738,6765,6653,6770,6861,6665,6665,6722,6647,6462,6745,6633,6626,6554,6592,6588,6684,6702,6671,6692,6773,6522,6523,6758,6687,6764,6583,6743,6672,6636,6763,6632,6661,6555,6655,6674,6648,6694,6663,6558,6721,6600,6540,6616,6785,6589,6634,6584,6743,6676,6714,6538,6764,6541,6765,6745,6803,6657,6578,6798,6616,6666,6663,6615,6638,6647,6826,6733,6665,6759,6841,6788,6523,6770,6563,6674,6551,6828,6690,6686,6589,6627,6612,6679,6738,6684,6807,6622,6691,6689,6522,6673,6655,6614,6581,6680,6664,6631,6630,6485,6714,6615,6773,6546,6615,6678,6621,6778,6513,6553,6697,6634,6573,6671,6593,6650,6729,6660,6839,6656,6810,6592,6539,6648,6634,6672,6647,6605,6616,6657,6567,6696,6506,6650,6470,6816,6680,6751,6572,6549,6710,6580,6734,6645,6642,6749,6689,6677,6737,6595,6697,6675,6815,6604,6673,6618,6798,6502,6552,6649,6710,6844,6673,6687,6675,6632,6674,6648,6675,6699,6675,6641,6518,6799,6656,6750,6789,6637,6635,6703,6670,6492,6637,6636,6626,6732,6694,6770,6607,6597,6801,6427,6699,6510,6646,6544,6566,6669,6601,6708,6686,6657,6829,6740,6485,6680,6772,6675,6579,6599,6588,6632,6837,6377,6591,6442,6824,6738,6627,6686,6798,6631,6825,6676,6746,6732,6748,6754,6813,6683,6719,6723,6659,6787,6682,6720,6692,6809,6531,6722,6805,6703,6745,6703,6818,6746,6654,6569,6679,6703,6690,6761,6499,6624,6711,6666,6692,6782,6753,6723,6714,6540,6604,6577,6789,6654,6827,6666,6842,6773,6675,6547,6705,6684,6574,6667,6821,6657,6598,6622,6546,6639,6631,6597,6671,6627,6754,6742,6542,6808,6816,6642,6701,6677,6845,6452,6760,6588,6861,6623,6707,6623,6674,6691,6642,6588,6710,6671,6648,6573,6650,6603,6573,6606,6744,6599,6745,6707,6532,6717,6676,6584,6714,6679,6674,6628,6738,6731,6591,6491,6674,6661,6689,6710,6675,6681,6712,6791,6624,6736,6612,6742,6699,6581,6692,6832,6712,6784,6783,6613,6675,6823,6612,6605,6482,6678,6438,6584,6694,6633,6661,6765,6752,6699,6688,6584,6632,6556,6732,6663,6687,6557,6674,6662,6696,6572,6529,6702,6701,6829,6742,6744,6557,6618,6759,6836,6698,6708,6575,6631,6684,6681,6711,6650,6495,6708,6490,6641,6580,6671,6592,6706,6670,6740,6655,6622,6613,6473,6638,6644,6670,6681,6622,6652,6648,6799,6564,6385,6778,6648,6654,6894,6561,6756,6761,6898,6682,6628,6730,6945,6636,6727,6588,6697,6858,6607,6682,6693,6561,6700,6794,6649,6742,6801,6717,6599,6581,6785,6606,6789,6796,6581,6751,6795,6669,6847,6628,6694,6635,6723,6712,6613,6582,6602,6801,6796,6719,6643,6577,6714,6638,6580,6648,6770,6778,6627,6814,6693,6560,6865,6623,6798,6707,6827,6607,6667,6744,6554,6575,6609,6768,6562,6650,6772,6544,6549,6672,6792,6772,6686,6758,6588,6679,6698,6476,6608,6703,6615,6649,6662,6661,6753,6426,6618,6599,6540,6811,6798,6760,6696,6668,6730,6822,6614,6647,6687,6691,6854,6649,6784,6616,6689,6603,6588,6657,6759,6542,6623,6740,6557,6659,6757,6779,6720,6574,6665,6751,6679,6860,6782,6616,6731,6750,6698,6522,6749,6657,6652,6672,6670,6510,6820,6651,6692,6666,6674,6644,6669,6801,6748,6652,6678,6643,6722,6763,6703,6694,6742,6741,6610,6650,6662,6602,6585,6712,6639,6735,6598,6707,6537,6735,6678,6636,6703,6606,6684,6753,6602,6615,6827,6729,6699,6725,6662,6664,6727,6717,6716,6551,6614,6619,6704,6767,6639,6670,6611,6667,6797,6646,6668,6762,6631,6619,6937,6694,6720,6632,6727,6548,6594,6575,6690,6736,6829,6843,6706,6775,6683,6598,6711,6724,6703,6685,6583,6792,6566,6706,6695,6541,6860,6861,6611,6657,6847,6778,6680,6790,6667,6676,6591,6679,6667,6726,6736,6598,6654,6599,6731,6761,6703,6769,6590,6674,6680,6677,6688,6503,6701,6551,6684,6669,6684,6620,6612,6822,6562,6736,6604,6706,6758,6698,6655,6594,6521,6540,6618,6871,6558,6705,6694,6651,6731,6558,6576,6512,6936,6503,6569,6645,6786,6682,6603,6748,6692,6612,6699,6658,6623,6584,6655,6772,6631,6631,6671,6494,6622,6675,6741,6694,6815,6764,6601,6555,6640,6698,6749,6753,6862,6589,6548,6753,6676,6609,6807,6518,6612,6641,6753,6718,6564,6823,6673,6473,6737,6709,6715,6669,6775,6794,6623,6752,6757,6653,6638,6835,6715,6473,6614,6673,6705,6807,6702,6651,6688,6580,6632,6833,6747,6828,6683,6726,6713,6752,6632,6820,6787,6544,6590,6677,6679,6628,6638,6716]},{"counters":[6685,6861,6590,6647,6751,6779,6665,6604,6706,6623,6601,6565,6673,6541,6577,6675,6633,6580,6566,6732,6757,6550,6699,6688,6678,6633,6689,6677,6659,6628,6605,6657,6587,6686,6625,6779,6631,6585,6757,6616,6702,6794,6755,6630,6807,6510,6748,6822,6588,6758,6692,6642,6833,6469,6671,6754,6606,6840,6804,6739,6657,6632,6652,6547,6524,6630,6697,6707,6561,6688,6604,6744,6732,6661,6729,6647,6793,6708,6677,6626,6657,6722,6818,6832,6683,6809,6651,6813,6794,6729,6592,6701,6785,6616,6635,6691,6650,6517,6624,6603,6719,6704,6771,6602,6530,6654,6661,6685,6603,6843,6684,6673,6564,6805,6783,6668,6703,6833,6443,6714,6817,6749,6566,6706,6852,6652,6611,6630,6701,6624,6712,6737,6565,6545,6529,6652,6666,6632,6705,6593,6781,6681,6570,6646,6702,6526,6872,6609,6587,6701,6701,6638,6715,6723,6631,6649,6680,6619,6593,6693,6697,6664,6681,6716,6577,6718,6519,6747,6532,6609,6730,6601,6704,6579,6682,6557,6723,6472,6596,6631,6674,6715,6783,6659,6725,6708,6443,6704,6710,6557,6681,6618,6524,6691,6606,6869,6746,6789,6696,6835,6782,6709,6542,6732,6694,6888,6779,6556,6650,6578,6499,6605,6754,6533,6679,6864,6474,6650,6690,6815,6643,6647,6679,6535,6687,6739,6511,6605,6590,6722,6774,6703,6709,6702,6747,6657,6586,6738,6704,6725,6728,6599,6801,6719,6828,6718,6735,6623,6608,6643,6646,6686,6737,6669,6673,6777,6644,6500,6583,6699,6796,6738,6653,6706,6816,6744,6813,6455,6731,6571,6751,6618,6701,6636,6787,6620,6687,6558,6813,6725,6619,6627,6656,6726,6559,6535,6746,6572,6542,6527,6579,6590,6644,6804,6704,6620,6733,6633,6615,6637,6726,6528,6748,6653,6637,6752,6649,6658,6633,6714,6658,6682,6672,6688,6722,6768,6497,6645,6661,6585,6659,6614,6619,6688,6597,6690,6734,6664,6628,6644,6534,6851,6631,6771,6594,6619,6646,6699,6731,6764,6649,6561,6791,6752,6691,6808,6583,6660,6721,6687,6578,6611,6875,6692,6511,6649,6740,6492,6838,6710,6612,6738,6737,6560,6589,6742,6714,6624,6666,6643,6615,6758,6669,6727,6639,6523,6704,6574,6577,6583,6647,6794,6603,6671,6648,6690,6482,6763,6649,6686,6869,6662,6571,6757,6735,6598,6744,6655,6709,6562,6648,6536,6765,6677,6634,6656,6691,6774,6731,6699,6578,6724,6765,6787,6583,6677,6736,6722,6724,6780,6596,6798,6690,6760,6762,6749,6735,6786,6666,6465,6662,6482,6705,6594,6811,6571,6594,6801,6565,6752,6646,6633,6663,6693,6781,6752,6703,6747,6706,6712,6699,6620,6778,6807,6593,6672,6702,6635,6788,6609,6646,6696,6643,6609,6650,6725,6695,6612,6591,6731,6745,6633,6716,6660,6675,6637,6693,6527,6817,6577,6650,6644,6553,6782,6748,6529,6693,6658,6651,6808,6689,6618,6642,6813,6706,6601,6697,6659,6652,6655,6737,6586,6801,6707,6764,6718,6583,6852,6635,6739,6590,6730,6764,6630,6811,6710,6686,6634,6736,6699,6673,6638,6757,6675,6577,6676,6670,6602,6671,6649,6636,6770,6713,6886,6601,6856,6679,6681,6691,6763,6600,6772,6756,6759,6548,6733,6564,6894,6611,6554,6590,6767,6666,6665,6722,6736,6865,6689,6677,6668,6652,6689,6601,6861,6557,6570,6582,6712,6593,6757,6586,6689,6616,6687,6709,6805,6659,6739,6758,6489,6575,6607,6647,6689,6712,6659,6705,6693,6625,6905,6718,6667,6732,6615,6688,6593,6698,6604,6709,6604,6523,6812,6652,6750,6685,6745,6713,6610,6638,6686,6786,6626,6647,6675,6703,6780,6688,6857,6629,6711,6764,6692,6665,6578,6605,6615,6699,6633,6564,6597,6645,6698,6801,6802,6576,6576,6636,6671,6756,6714,6678,6714,6704,6746,6643,6600,6708,6703,6650,6626,6579,6552,6690,6526,6777,6688,6610,6713,6923,6674,6588,6654,6718,6563,6715,6435,6769,6776,6592,6646,6803,6652,6718,6662,6730,6672,6740,6653,6698,6627,6679,6602,6807,6778,6733,6556,6697,6705,6667,6587,6743,6752,6716,6742,6502,6670,6735,6765,6653,6722,6793,6738,6716,6603,6580,6611,6783,6692,6672,6719,6655,6764,6634,6881,6802,6629,6606,6711,6647,6530,6714,6637,6732,6647,6596,6638,6836,6568,6557,6763,6622,6617,6460,6654,6642,6602,6600,6707,6624,6586,6660,6620,6663,6724,6696,6733,6756,6673,6588,6703,6754,6865,6665,6907,6780,6702,6753,6748,6690,6565,6721,6765,6683,6858,6610,6786,6838,6689,6710,6761,6576,6661,6646,6722,6758,6734,6760,6580,6674,6720,6571,6768,6795,6783,6608,6685,6631,6572,6654,6637,6736,6756,6560,6718,6700,6512,6618,6816,6625,6736,6647,6596,6618,6615,6722,6689,6656,6633,6572,6700,6740,6705,6733,6620,6564,6756,6694,6810,6573,6705,6700,6649,6674,6565,6644,6704,6636,6555,6638,6795,6813,6613,6713,6700,6768,6717,6701,6679,6603,6712,6774,6710,6526,6690,6729,6596,6825,6509,6778,6724,6512,6576,6656,6470,6580,6716,6780,6632,6591,6623,6832,6626,6562,6717,6631,6651,6650,6414,6674,6640,6644,6570,6626,6663,6532,6466,6741,6611,6654,6807,6791,6679,6770,6783,6652,6522,6548,6723,6689,6767,6797,6566,6610,6667,6599,6710,6719,6736,6547,6709,6649,6852,6754,6653,6636,6631,6831,6545,6639,6556,6834,6628,6660,6713,6706,6530,6817,6393,6479,6624,6789,6706,6720,6533,6582,6742,6635,6609,6654,6618,6594,6693,6790,6436,6609,6696,6677,6606,6791,6704,6727,6643,6599,6583,6703,6647,6586,6584,6576,6649,6581,6694,6770,6622,6756,6574,6624,6692,6737,6499,6700,6592,6607,6754,6746,6707,6796,6621,6668,6645,6689,6634,6716,6650,6682,6725,6639,6655,6722,6734,6554,6697,6636,6661,6665,6681,6714,6668,6779,6796,6584,6806,6592,6750,6579,6820,6749,6571,6798,6805,6834,6573,6706,6600,6567,6731,6623,6660,6606,6946,6655,6650,6710,6713,6741,6531,6629,6594,6874,6656,6664,6552,6624,6692,6698,6811,6751,6652,6704,6699,6737,6769,6606,6785,6646,6718,6762,6698,6687,6722,6687,6792,6690,6672,6662,6766,6782,6786,6583,6646,6676,6717,6580,6546,6702,6712,6624,6678,6729,6702,6676,6576,6709,6722,6679,6657,6631,6579,6551,6635,6698,6618,6670,6666,6587,6682,6770,6702,6776,6556,6613,6694,6416,6700,6670,6694,6694,6566,6731,6703,6840,6691,6818,6592,6639,6686,6649,6853,6501,6601,6615,6651,6623,6574,6615,6691,6774,6697,6499,6804,6632,6588,6706,6679,6576,6581,6644,6713,6813,6652,6602,6604,6664,6724,6677,6773,6593,6613,6712,6773,6597,6564,6747,6809,6733,6796,6757,6711,6582,6733,6615,6869,6758,6792,6607,6650,6546,6574,6751,6768,6763,6568,6811,6761,6724,6566,6569,6723,6721,6825,6706,6739,6716,6762,6475,6738,6762,6608,6679,6711,6698,6745,6677,6631,6628,6782,6648,6581,6671,6607,6775,6584,6740,6706,6716,6795,6540,6478,6592,6768,6685,6822,6604,6579,6720,6663,6723,6699,6747,6718,6700,6786,6614,6717,6640,6733,6568,6702,6699,6817,6751,6671,6589,6762,6646,6580,6659,6699,6881,6628,6725,6641,6733,6631,6727,6595,6682,6681,6609,6581,6762,6527,6584,6777,6415,6688,6657,6548,6725,6751,6641,6623,6630,6669,6639,6676,6508,6632,6697,6621,6672,6643,6679,6728,6570,6676,6644,6704,6563,6529,6677,6785,6595,6498,6711,6702,6790,6659,6764,6642,6622,6651,6643,6800,6718,6944,6658,6579,6739,6634,6711,6673,6667,6815,6640,6723,6568,6772,6539,6621,6718,6757,6655,6672,6489,6795,6652,6561,6628,6645,6669,6617,6605,6908,6625,6557,6695,6754,6775,6653,6836,6714,6587,6680,6592,6562,6663,6515,6606,6621,6775,6640,6702,6682,6737,6680,6622,6685,6938,6767,6816,6519,6693,6738,6653,6622,6752,6739,6558,6729,6695,6777,6611,6652,6714,6801,6552,6654,6398,6661,6727,6631,6627,6860,6813,6620,6571,6620,6665,6780,6681,6682,6790,6647,6767,6693,6607,6657,6751,6733,6594,6496,6655,6792,6595,6470,6853,6574,6559,6657,6791,6619,6602,6563,6695,6731,6663,6726,6628,6671,6841,6649,6763,6682,6533,6644,6531,6641,6603,6665,6707,6839,6700,6662,6680,6751,6589,6702,6802,6681,6700,6891,6625,6683,6623,6471,6595,6841,6733,6562,6736,6731,6638,6548,6560,6735,6583,6681,6706,6814,6732,6626,6800,6696,6659,6590,6736,6777,6701,6655,6643,6746,6654,6642,6687,6625,6772,6732,6646,6752,6715,6763,6785,6564,6607,6799,6653,6735,6741,6649,6690,6587,6819,6772,6797,6800,6513,6704,6667,6598,6753,6581,6587,6727,6595,6600,6594,6758,6690,6756,6570,6684,6713,6586,6760,6703,6566,6679,6697,6844,6593,6705,6681,6804,6682,6884,6653,6687,6654,6779,6562,6601,6809,6723,6681,6692,6838,6570,6683,6763,6725,6759,6599,6691,6801,6695,6784,6604,6474,6567,6620,6690,6771,6693,6616,6671,6763,6573,6858,6755,6653,6677,6661,6816,6772,6676,6539,6706,6686,6621,6603,6724,6557,6666,6675,6658,6624,6806,6765,6609,6807,6679,6563,6693,6588,6700,6790,6732,6635,6696,6707,6625,6699,6617,6775,6609,6635,6594,6662,6665,6741,6666,6658,6640,6717,6739,6576,6727,6721,6799,6587,6574,6612,6764,6601,6803,6854,6758,6560,6667,6669,6743,6538,6721,6592,6636,6465,6601,6738,6657,6834,6717,6825,6404,6582,6723,6726,6672,6750,6681,6478,6576,6736,6711,6575,6745,6651,6784,6629,6665,6570,6613,6680,6756,6620,6717,6695,6693,6631,6727,6645,6727,6662,6772,6648,6664,6744,6692,6481,6660,6707,6749,6906,6835,6643,6743,6743,6665,6708,6646,6549,6764,6750,6686,6573,6716,6642,6579,6557,6838,6581,6577,6755,6586,6685,6662,6654,6705,6681,6728,6645,6666,6682,6670,6661,6481,6779,6718,6604,6738,6683,6712,6632,6639,6529,6642,6627,6611,6682,6560,6599,6648,6764,6662,6710,6775,6592,6673,6762,6593,6674,6860,6749,6664,6643,6640,6620,6673,6554,6605,6707,6844,6804,6598,6716,6707,6692,6681,6870,6683,6753,6677,6739,6591,6658,6722,6737,6687,6806,6637,6801,6616,6624,6727,6641,6721,6417,6668,6685,6645,6718,6740,6514,6739,6775,6670,6674,6635,6784,6709,6663,6737,6598,6613,6751,6489,6478,6676,6750,6652,6726,6625,6849,6673,6622,6698,6708,6704,6773,6732,6738,6755,6594,6664,6502,6770,6722,6687,6594,6644,6702,6756,6720,6600,6635,6718,6698,6619,6644,6608,6860,6753,6721,6755,6584,6606,6761,6667,6785,6703,6634,6750,6613,6632,6552,6741,6726,6636,6472,6733,6630,6768,6682,6736,6787,6625,6660,6683,6626,6768,6516,6517,6656,6760,6688,6775,6701,6655,6640,6732,6708,6553,6784,6583,6653,6560,6809,6635,6676,6687,6661,6658,6689,6765,6631,6585,6475,6655,6542,6631,6649,6656,6861,6812,6709,6581,6649,6670,6608,6734,6639,6632,6626,6648,6568,6697,6676,6662,6732,6840,6732,6551,6702,6457,6769,6710,6731,6644,6727,6557,6695,6550,6651,6656,6614,6760,6780,6571,6638,6621,6665,6589,6645,6737,6718,6649,6735,6623,6592,6707,6717,6729,6618,6683,6753,6759,6733,6528,6751,6575,6590,6631,6563,6680,6663,6704,6681,6669,6741,6666,6769,6688,6906,6801,6718,6696,6665,6827,6745,6559,6629,6612,6622,6722,6426,6612,6727,6749,6640,6681,6525,6746,6704,6589,6692,6709,6611,6857,6652,6631,6918,6688,6626,6653,6667,6515,6773,6698,6736,6623,6625,6673,6707,6694,6641,6760,6772,6668,6637,6559,6523,6606,6486,6549,6662,6604,6684,6672,6470,6623,6660,6823,6574,6683,6786,6727,6691,6654,6538,6545,6679,6607,6677,6570,6614,6787,6621,6653,6555,6821,6591,6663,6800,6738,6557,6595,6591,6926,6722,6699,6609,6539,6736,6545,6672,6704,6668,6751,6760,6686,6639,6528,6721,6559,6658,6663,6641,6630,6567,6684,6550,6487,6612,6640,6563,6711,6646,6805,6572,6602,6621,6659,6624,6671,6664,6727,6601,6694]},{"counters":[6695,6643,6606,6749,6658,6775,6732,6773,6637,6555,6702,6598,6509,6475,6725,6467,6678,6729,6629,6669,6544,6628,6666,6648,6584,6745,6483,6673,6706,6774,6584,6601,6708,6633,6708,6606,6764,6762,6701,6849,6591,6688,6731,6735,6662,6789,6742,6724,6625,6548,6653,6812,6505,6711,6819,6776,6879,6516,6793,6514,6787,6641,6825,6775,6631,6716,6726,6736,6599,6643,6645,6628,6718,6714,6480,6527,6637,6896,6696,6694,6812,6621,6636,6566,6746,6751,6705,6733,6752,6648,6698,6666,6646,6675,6630,6710,6596,6805,6592,6739,6800,6706,6695,6573,6680,6544,6669,6777,6754,6564,6698,6662,6563,6773,6577,6721,6723,6635,6746,6753,6626,6764,6647,6620,6683,6590,6666,6598,6728,6637,6664,6740,6700,6605,6634,6658,6723,6692,6683,6591,6702,6636,6754,6523,6632,6707,6788,6681,6788,6552,6620,6864,6576,6758,6575,6746,6656,6627,6675,6572,6655,6619,6723,6760,6649,6636,6618,6718,6729,6743,6507,6845,6696,6737,6618,6708,6630,6671,6669,6692,6637,6672,6603,6800,6747,6685,6606,6775,6772,6726,6614,6609,6580,6611,6649,6632,6646,6873,6631,6795,6671,6683,6765,6679,6566,6484,6562,6632,6751,6750,6481,6560,6775,6778,6848,6623,6829,6597,6637,6653,6535,6597,6662,6627,6655,6649,6682,6831,6639,6668,6575,6633,6709,6733,6743,6693,6637,6736,6658,6678,6648,6527,6709,6653,6612,6632,6815,6651,6737,6544,6724,6795,6708,6686,6768,6627,6620,6730,6679,6696,6641,6680,6722,6560,6664,6709,6680,6803,6593,6774,6652,6560,6674,6598,6728,6681,6841,6645,6795,6850,6600,6715,6642,6604,6487,6505,6626,6508,6648,6583,6689,6530,6874,6593,6715,6512,6677,6814,6654,6521,6581,6581,6545,6777,6550,6688,6631,6852,6768,6638,6611,6708,6636,6792,6846,6699,6777,6775,6455,6745,6687,6565,6689,6739,6696,6734,6640,6781,6642,6525,6698,6639,6761,6617,6705,6748,6634,6640,6583,6698,6517,6606,6617,6611,6674,6822,6524,6702,6705,6615,6876,6522,6763,6546,6663,6549,6706,6875,6796,6717,6677,6771,6579,6576,6879,6503,6763,6644,6562,6627,6580,6615,6553,6600,6586,6484,6663,6664,6519,6691,6648,6682,6717,6523,6763,6682,6672,6682,6778,6687,6833,6712,6678,6484,6609,6531,6590,6611,6723,6646,6568,6807,6645,6537,6621,6640,6848,6740,6677,6803,6718,6568,6611,6574,6606,6520,6638,6713,6625,6579,6631,6726,6567,6676,6693,6505,6732,6644,6695,6840,6748,6764,6652,6806,6653,6723,6848,6704,6648,6598,6716,6734,6632,6474,6662,6586,6577,6802,6589,6634,6652,6683,6619,6523,6681,6544,6755,6596,6667,6551,6675,6718,6864,6631,6702,6642,6623,6706,6741,6895,6592,6663,6724,6571,6726,6636,6766,6783,6667,6675,6636,6747,6731,6684,6678,6648,6812,6714,6565,6815,6608,6516,6593,6544,6522,6640,6716,6778,6677,6616,6846,6609,6804,6776,6763,6662,6642,6799,6783,6768,6658,6564,6705,6533,6709,6674,6589,6540,6630,6571,6652,6640,6647,6593,6766,6578,6734,6600,6666,6800,6608,6737,6623,6792,6735,6776,6644,6709,6554,6634,6683,6623,6721,6770,6643,6700,6707,6539,6786,6625,6654,6776,6623,6785,6615,6752,6613,6627,6752,6721,6734,6730,6692,6546,6843,6642,6665,6558,6717,6728,6616,6574,6711,6542,6743,6730,6766,6811,6573,6641,6776,6741,6666,6521,6755,6672,6645,6640,6604,6699,6640,6716,6704,6660,6660,6606,6696,6743,6705,6603,6749,7031,6773,6752,6646,6620,6633,6808,6653,6625,6720,6572,6492,6656,6794,6553,6591,6606,6725,6710,6586,6560,6627,6711,6756,6690,6662,6732,6609,6692,6603,6656,6680,6683,6816,6701,6616,6573,6628,6708,6636,6731,6747,6721,6642,6688,6685,6674,6662,6719,6778,6802,6757,6541,6781,6819,6824,6665,6599,6820,6718,6710,6729,6778,6662,6400,6673,6598,6629,6625,6638,6820,6571,6648,6803,6594,6772,6701,6675,6553,6717,6697,6643,6770,6722,6686,6762,6597,6720,6684,6676,6603,6641,6744,6690,6738,6731,6553,6597,6587,6652,6643,6650,6635,6716,6698,6648,6704,6801,6511,6531,6722,6689,6610,6927,6593,6618,6684,6576,6658,6805,6731,6645,6746,6599,6673,6752,6656,6631,6678,6581,6791,6644,6562,6640,6626,6875,6726,6704,6677,6697,6839,6645,6713,6818,6753,6620,6787,6749,6761,6734,6688,6510,6724,6523,6505,6850,6567,6736,6765,6750,6601,6640,6693,6759,6669,6653,6631,6630,6555,6612,6582,6711,6681,6624,6705,6519,6674,6660,6737,6744,6754,6716,6662,6658,6734,6832,6631,6632,6628,6548,6572,6724,6595,6611,6643,6586,6738,6697,6619,6646,6697,6737,6784,6887,6619,6684,6808,6660,6689,6663,6616,6560,6561,6682,6559,6679,6813,6598,6641,6659,6614,6760,6695,6574,6768,6749,6525,6693,6709,6603,6718,6658,6873,6717,6623,6729,6745,6774,6562,6576,6668,6664,6672,6675,6750,6637,6666,6609,6693,6670,6647,6647,6628,6686,6649,6645,6695,6812,6724,6548,6784,6551,6648,6697,6742,6700,6774,6572,6925,6816,6622,6712,6752,6726,6750,6573,6893,6650,6697,6700,6751,6738,6777,6572,6589,6710,6552,6820,6705,6727,6551,6759,6694,6594,6640,6571,6608,6631,6818,6687,6750,6580,6547,6661,6657,6738,6722,6712,6638,6567,6780,6787,6854,6688,6689,6787,6732,6696,6728,6717,6768,6732,6475,6636,6678,6592,6666,6652,6712,6694,6876,6703,6685,6655,6785,6651,6713,6499,6603,6612,6674,6709,6680,6832,6820,6511,6620,6606,6757,6728,6829,6660,6553,6702,6626,6749,6721,6626,6621,6466,6708,6586,6725,6501,6735,6609,6696,6642,6778,6635,6657,6546,6703,6773,6660,6635,6731,6688,6767,6638,6683,6591,6694,6849,6707,6573,6666,6590,6655,6712,6594,6645,6649,6709,6695,6584,6800,6675,6516,6709,6642,6664,6703,6621,6769,6588,6830,6530,6729,6737,6637,6625,6724,6683,6595,6776,6697,6482,6673,6755,6595,6675,6709,6631,6677,6722,6648,6604,6816,6673,6744,6692,6655,6608,6686,6878,6708,6371,6683,6754,6740,6746,6676,6624,6684,6671,6616,6644,6791,6777,6642,6784,6610,6713,6645,6679,6681,6775,6521,6600,6852,6549,6780,6750,6763,6545,6624,6717,6502,6750,6553,6764,6754,6706,6636,6664,6769,6757,6683,6647,6745,6597,6572,6581,6596,6644,6619,6561,6789,6664,6741,6649,6719,6768,6574,6689,6682,6484,6731,6686,6744,6615,6710,6770,6789,6714,6724,6612,6623,6784,6674,6761,6514,6726,6570,6680,6622,6707,6686,6664,6620,6687,6485,6648,6557,6717,6478,6729,6769,6573,6652,6712,6811,6578,6711,6841,6656,6704,6519,6691,6817,6576,6640,6784,6683,6617,6588,6729,6577,6602,6740,6696,6548,6701,6545,6692,6616,6624,6720,6687,6621,6825,6489,6649,6625,6453,6744,6624,6817,6808,6589,6785,6759,6611,6822,6556,6783,6793,6709,6658,6562,6659,6674,6639,6460,6717,6732,6625,6687,6750,6622,6652,6536,6664,6806,6591,6809,6695,6637,6725,6700,6736,6665,6803,6836,6584,6592,6719,6549,6553,6680,6650,6735,6728,6704,6701,6659,6575,6565,6701,6730,6659,6691,6560,6711,6768,6744,6730,6683,6655,6617,6590,6769,6653,6626,6642,6622,6719,6598,6679,6798,6640,6715,6689,6687,6894,6469,6644,6879,6592,6599,6637,6579,6896,6553,6644,6655,6758,6670,6581,6669,6681,6520,6588,6806,6648,6612,6570,6529,6745,6655,6587,6637,6631,6596,6689,6655,6447,6688,6798,6748,6741,6710,6665,6706,6665,6645,6728,6633,6783,6569,6724,6602,6545,6472,6675,6603,6754,6856,6806,6589,6747,6648,6857,6632,6572,6593,6661,6722,6656,6484,6687,6716,6825,6708,6640,6626,6648,6730,6733,6552,6711,6665,6653,6920,6574,6750,6628,6648,6799,6682,6622,6768,6610,6756,6580,6697,6675,6638,6784,6686,6578,6741,6625,6722,6601,6809,6798,6742,6691,6709,6819,6546,6656,6709,6703,6732,6647,6626,6748,6671,6586,6710,6653,6735,6591,6515,6612,6870,6582,6755,6813,6695,6747,6716,6693,6665,6787,6622,6589,6592,6640,6641,6532,6782,6673,6593,6669,6631,6666,6675,6581,6713,6433,6579,6711,6741,6616,6666,6846,6582,6563,6762,6753,6714,6652,6589,6628,6657,6644,6440,6772,6671,6705,6751,6881,6708,6569,6569,6543,6837,6675,6636,6687,6659,6793,6626,6737,6699,6598,6472,6666,6800,6630,6727,6740,6696,6766,6584,6616,6842,6682,6671,6617,6792,6714,6543,6786,6586,6674,6697,6629,6497,6608,6622,6640,6819,6620,6631,6612,6702,6657,6734,6608,6811,6699,6640,6775,6752,6829,6646,6570,6607,6670,6551,6778,6789,6785,6740,6705,6585,6673,6707,6525,6567,6613,6717,6755,6608,6675,6691,6477,6833,6799,6667,6784,6660,6774,6690,6820,6492,6647,6586,6691,6494,6666,6661,6614,6680,6748,6676,6792,6846,6684,6602,6671,6642,6568,6764,6563,6541,6733,6684,6701,6621,6729,6722,6857,6863,6627,6651,6782,6518,6612,6565,6771,6508,6691,6774,6541,6520,6726,6432,6612,6710,6596,6621,6813,6748,6791,6660,6779,6712,6810,6541,6599,6725,6527,6657,6533,6645,6691,6726,6746,6713,6688,6667,6603,6684,6631,6720,6691,6600,6639,6669,6767,6732,6758,6567,6759,6683,6895,6793,6637,6743,6720,6645,6653,6605,6615,6520,6681,6665,6664,6705,6642,6737,6778,6731,6710,6681,6622,6782,6786,6811,6647,6598,6662,6763,6635,6830,6657,6822,6623,6648,6781,6786,6594,6632,6614,6751,6665,6724,6400,6837,6651,6627,6744,6553,6750,6626,6641,6624,6713,6803,6689,6643,6663,6482,6849,6627,6763,6635,6667,6521,6490,6598,6710,6876,6544,6599,6611,6541,6707,6734,6665,6742,6718,6609,6568,6715,6635,6626,6876,6541,6661,6662,6504,6707,6642,6835,6748,6600,6747,6716,6636,6651,6819,6611,6736,6800,6602,6585,6651,6666,6717,6659,6635,6751,6570,6642,6791,6820,6592,6670,6804,6548,6701,6876,6734,6661,6763,6686,6707,6666,6685,6584,6641,6769,6577,6677,6791,6626,6691,6751,6707,6660,6771,6741,6670,6698,6797,6571,6687,6645,6870,6738,6772,6633,6750,6684,6674,6738,6797,6613,6612,6650,6629,6621,6547,6741,6797,6768,6701,6584,6826,6742,6621,6781,6599,6758,6596,6769,6641,6693,6709,6681,6521,6701,6455,6712,6846,6802,6557,6626,6790,6716,6658,6738,6642,6848,6606,6644,6624,6737,6560,6768,6520,6640,6697,6883,6857,6613,6802,6739,6603,6642,6932,6573,6516,6652,6561,6573,6685,6688,6603,6625,6771,6712,6752,6694,6670,6657,6700,6651,6669,6840,6610,6806,6695,6737,6516,6771,6703,6506,6588,6658,6707,6672,6619,6758,6659,6673,6562,6652,6799,6655,6584,6715,6679,6605,6825,6679,6613,6548,6758,6658,6792,6700,6633,6739,6585,6599,6667,6654,6710,6696,6686,6596,6711,6693,6608,6459,6733,6728,6504,6841,6740,6667,6528,6814,6824,6536,6745,6640,6754,6631,6697,6684,6613,6659,6559,6683,6715,6695,6748,6779,6641,6597,6655,6614,6539,6575,6625,6732,6703,6653,6646,6691,6838,6612,6589,6564,6572,6608,6738,6679,6681,6447,6619,6515,6770,6578,6812,6674,6686,6468,6735,6740,6609,6521,6655,6545,6577,6560,6620,6661,6710,6872,6659,6687,6666,6623,6762,6903,6587,6630,6696,6703,6528,6810,6623,6589,6727,6699,6716,6893,6721,6613,6734,6696,6690,6579,6633,6677,6709,6602,6566,6605,6791,6647,6718,6679,6660,6789,6806,6693,6693,6776,6729,6621,6771,6663,6644,6614,6738,6483,6629,6670,6501,6731,6629,6618,6684,6695,6680,6648,6697,6563,6905,6768,6693,6737,6691,6717,6681,6700,6746,6576,6640,6607,6678,6725,6819,6521,6538,6717,6540,6548,6740,6715,6595,6598,6592,6712,6600,6581,6702,6779,6636,6667,6664,6785,6753,6646,6791,6715,6675,6621,6688,6732,6629,6702,6749,6654,6703,6585,6607,6678,6764,6657,6658,6864,6596,6547,6688,6658,6538,6698,6584,6777,6695,6790,6684,6655,6711,6655]},{"counters":[6589,6605,6775,6694,6706,6699,6622,6701,6649,6746,6660,6592,6607,6566,6598,6802,6581,6696,6759,6557,6601,6567,6602,6490,6665,6584,6706,6654,6723,6625,6702,6615,6784,6681,6620,6785,6644,6688,6684,6818,6800,6562,6612,6640,6667,6562,6635,6694,6650,6761,6814,6692,6507,6688,6692,6621,6701,6690,6635,6624,6457,6765,6682,6790,6702,6647,6581,6651,6672,6750,6779,6683,6837,6563,6664,6683,6660,6681,6684,6672,6686,6688,6670,6762,6455,6654,6608,6821,6676,6649,6683,6677,6733,6725,6524,6859,6628,6704,6441,6658,6631,6642,6699,6799,6505,6700,6751,6782,6793,6684,6772,6568,6728,6736,6622,6633,6740,6715,6691,6649,6802,6658,6483,6658,6677,6659,6616,6615,6698,6722,6805,6536,6608,6747,6671,6663,6761,6722,6688,6680,6607,6665,6593,6646,6761,6687,6652,6631,6757,6532,6675,6726,6637,6651,6600,6686,6668,6593,6673,6582,6456,6608,6624,6758,6630,6682,6753,6682,6773,6814,6674,6736,6834,6644,6642,6696,6825,6555,6817,6679,6736,6767,6625,6606,6702,6792,6692,6686,6533,6551,6669,6537,6839,6629,6623,6632,6653,6745,6901,6653,6727,6672,6700,6599,6667,6756,6536,6867,6462,6643,6634,6601,6701,6704,6653,6703,6650,6779,6571,6529,6917,6683,6600,6556,6603,6867,6586,6621,6697,6816,6730,6615,6644,6657,6725,6623,6726,6613,6599,6643,6610,6871,6731,6777,6626,6680,6614,6667,6657,6568,6726,6779,6786,6659,6667,6850,6666,6723,6677,6777,6774,6558,6798,6898,6642,6711,6727,6658,6678,6824,6767,6362,6640,6623,6670,6560,6768,6729,6635,6609,6967,6765,6548,6634,6715,6659,6570,6629,6551,6800,6535,6695,6551,6535,6586,6608,6779,6682,6668,6788,6756,6657,6574,6556,6551,6562,6671,6829,6452,6574,6593,6730,6625,6752,6632,6569,6827,6561,6646,6671,6535,6576,6632,6704,6655,6762,6655,6741,6607,6633,6581,6599,6670,6758,6691,6699,6578,6672,6658,6699,6724,6716,6695,6830,6649,6807,6721,6727,6687,6654,6647,6730,6598,6802,6772,6764,6738,6541,6732,6626,6637,6463,6609,6650,6751,6640,6608,6619,6672,6637,6696,6547,6551,6642,6729,6602,6707,6567,6626,6542,6702,6719,6695,6699,6765,6800,6593,6739,6628,6756,6723,6707,6633,6768,6623,6792,6740,6746,6522,6724,6580,6661,6581,6628,6744,6777,6649,6778,6629,6706,6587,6747,6737,6605,6579,6685,6667,6649,6699,6808,6718,6690,6834,6628,6758,6598,6730,6746,6601,6685,6615,6738,6610,6758,6642,6704,6655,6456,6643,6711,6522,6576,6730,6784,6633,6676,6587,6671,6610,6695,6663,6550,6792,6752,6715,6691,6818,6724,6698,6667,6504,6620,6548,6568,6651,6687,6842,6667,6777,6739,6668,6677,6651,6815,6638,6784,6633,6578,6566,6778,6705,6642,6699,6683,6843,6678,6632,6780,6614,6634,6555,6730,6792,6645,6760,6735,6698,6703,6791,6707,6493,6801,6701,6740,6612,6616,6722,6805,6584,6659,6609,6624,6795,6620,6853,6680,6796,6541,6721,6622,6801,6705,6723,6562,6708,6617,6754,6641,6701,6566,6634,6608,6573,6726,6642,6712,6534,6668,6837,6634,6840,6619,6704,6718,6579,6708,6724,6770,6563,6499,6639,6571,6541,6535,6623,6667,6608,6745,6700,6719,6690,6511,6769,6788,6610,6665,6705,6539,6679,6620,6626,6517,6568,6732,6542,6829,6642,6534,6581,6573,6634,6727,6707,6587,6666,6775,6688,6652,6782,6741,6638,6624,6741,6525,6577,6554,6809,6722,6744,6626,6688,6866,6678,6654,6598,6623,6695,6766,6569,6705,6701,6690,6662,6656,6734,6667,6587,6631,6767,6479,6673,6699,6567,6497,6527,6601,6829,6693,6781,6623,6804,6543,6686,6579,6575,6617,6659,6745,6681,6583,6801,6639,6768,6645,6834,6670,6695,6733,6769,6559,6451,6795,6608,6690,6655,6716,6632,6742,6720,6721,6648,6789,6553,6631,6750,6639,6716,6519,6653,6632,6621,6697,6694,6680,6820,6825,6575,6800,6704,6727,6558,6642,6703,6786,6659,6676,6605,6583,6893,6602,6686,6642,6699,6742,6678,6475,6740,6671,6713,6705,6780,6657,6685,6630,6661,6616,6599,6600,6621,6581,6660,6602,6618,6813,6627,6649,6649,6719,6646,6697,6638,6704,6769,6676,6589,6730,6633,6625,6703,6657,6691,6710,6693,6770,6665,6615,6572,6573,6757,6593,6494,6803,6627,6653,6464,6665,6558,6695,6599,6595,6577,6587,6764,6716,6695,6630,6667,6747,6656,6639,6687,6620,6697,6715,6690,6685,6510,6638,6788,6716,6562,6657,6656,6731,6734,6714,6746,6702,6595,6636,6686,6537,6777,6591,6629,6605,6830,6675,6626,6752,6586,6668,6745,6669,6784,6728,6623,6594,6495,6608,6552,6598,6796,6682,6642,6507,6695,6725,6819,6766,6681,6580,6768,6499,6752,6612,6718,6726,6580,6610,6530,6564,6543,6622,6685,6751,6662,6797,6691,6690,6743,6677,6576,6568,6633,6728,6707,6648,6698,6716,6680,6715,6614,6699,6644,6849,6663,6741,6781,6732,6717,6691,6557,6584,6567,6511,6719,6750,6599,6512,6787,6724,6629,6643,6646,6685,6663,6721,6788,6599,6582,6833,6585,6366,6564,6800,6691,6611,6509,6621,6710,6749,6775,6725,6717,6642,6646,6738,6647,6830,6866,6753,6664,6486,6673,6637,6740,6726,6484,6695,6905,6709,6793,6707,6694,6679,6785,6702,6691,6909,6569,6581,6483,6678,6626,6637,6650,6718,6770,6667,6736,6663,6772,6697,6588,6686,6647,6689,6662,6698,6783,6665,6792,6397,6734,6649,6739,6731,6648,6679,6757,6520,6694,6805,6815,6585,6607,6638,6695,6647,6799,6544,6796,6628,6841,6837,6559,6691,6609,6675,6614,6716,6689,6613,6640,6660,6775,6799,6683,6630,6809,6663,6712,6736,6519,6639,6765,6675,6861,6623,6700,6579,6531,6607,6728,6752,6725,6717,6931,6743,6707,6698,6567,6515,6598,6613,6555,6575,6631,6707,6527,6575,6657,6689,6768,6797,6668,6501,6570,6692,6632,6716,6659,6684,6612,6545,6786,6765,6783,6713,6814,6667,6701,6692,6901,6785,6673,6724,6832,6679,6624,6712,6749,6461,6719,6829,6637,6781,6790,6708,6547,6784,6684,6621,6758,6699,6683,6733,6656,6575,6646,6707,6528,6585,6696,6755,6649,6625,6679,6743,6674,6743,6629,6657,6654,6624,6660,6770,6741,6872,6684,6589,6556,6753,6675,6535,6627,6806,6692,6777,6578,6528,6719,6689,6596,6606,6625,6767,6785,6780,6722,6619,6641,6642,6643,6676,6839,6586,6795,6762,6589,6855,6846,6773,6721,6742,6573,6699,6760,6637,6612,6533,6617,6778,6660,6594,6597,6697,6580,6634,6560,6528,6739,6783,6699,6734,6608,6615,6654,6631,6649,6649,6738,6910,6752,6735,6771,6727,6740,6684,6695,6654,6684,6491,6653,6670,6657,6677,6710,6570,6657,6816,6627,6737,6564,6548,6769,6694,6660,6605,6722,6757,6721,6722,6590,6774,6712,6592,6764,6687,6784,6658,6648,6928,6663,6665,6749,6599,6564,6641,6525,6769,6865,6703,6788,6766,6689,6829,6661,6691,6689,6773,6633,6604,6713,6831,6538,6753,6713,6638,6728,6695,6902,6847,6561,6571,6805,6615,6608,6639,6545,6843,6666,6714,6541,6712,6544,6677,6700,6535,6729,6839,6642,6670,6698,6634,6659,6436,6557,6589,6682,6683,6759,6627,6659,6604,6890,6607,6604,6752,6647,6611,6624,6658,6823,6693,6691,6584,6641,6749,6772,6635,6787,6708,6520,6709,6532,6733,6738,6701,6672,6553,6582,6746,6787,6584,6662,6587,6679,6737,6835,6635,6704,6706,6609,6663,6666,6730,6583,6744,6680,6681,6668,6778,6584,6703,6628,6565,6612,6737,6626,6742,6697,6743,6474,6666,6617,6741,6697,6663,6708,6738,6663,6627,6592,6505,6837,6507,6551,6669,6564,6608,6526,6642,6768,6638,6664,6671,6606,6624,6654,6662,6600,6817,6693,6602,6713,6547,6708,6707,6604,6569,6733,6620,6740,6789,6798,6612,6491,6555,6658,6851,6777,6672,6816,6624,6688,6684,6625,6649,6715,6683,6583,6788,6569,6663,6625,6437,6691,6602,6624,6532,6609,6693,6619,6707,6627,6555,6716,6605,6553,6596,6656,6586,6543,6546,6559,6572,6657,6748,6709,6688,6680,6583,6558,6688,6749,6614,6720,6619,6528,6686,6611,6782,6743,6742,6574,6776,6705,6755,6812,6804,6638,6671,6722,6531,6631,6635,6748,6803,6526,6656,6624,6640,6741,6781,6430,6723,6597,6822,6572,6603,6703,6590,6763,6520,6608,6643,6755,6647,6887,6630,6843,6787,6808,6700,6600,6738,6691,6738,6720,6598,6644,6622,6550,6519,6749,6811,6651,6646,6599,6658,6643,6545,6606,6732,6687,6727,6670,6729,6716,6627,6769,6829,6611,6708,6628,6798,6843,6763,6663,6706,6672,6777,6635,6703,6654,6800,6689,6715,6732,6850,6620,6767,6650,6813,6784,6801,6612,6593,6580,6774,6647,6796,6768,6615,6592,6636,6691,6636,6777,6652,6674,6824,6674,6708,6807,6757,6573,6575,6792,6664,6731,6701,6730,6648,6519,6670,6554,6590,6589,6858,6614,6614,6761,6651,6708,6690,6676,6754,6862,6629,6910,6685,6809,6678,6683,6503,6631,6634,6682,6733,6651,6538,6569,6614,6773,6794,6526,6782,6652,6641,6746,6712,6586,6760,6718,6591,6703,6797,6738,6765,6712,6533,6726,6697,6894,6728,6557,6798,6613,6715,6628,6571,6682,6846,6705,6902,6676,6515,6691,6662,6679,6702,6796,6778,6602,6636,6796,6716,6655,6643,6546,6543,6636,6765,6687,6677,6732,6779,6724,6723,6535,6764,6746,6904,6669,6583,6647,6794,6597,6698,6594,6709,6608,6744,6651,6691,6623,6685,6774,6542,6624,6766,6712,6739,6516,6696,6740,6654,6679,6654,6655,6599,6665,6702,6546,6916,6640,6486,6653,6827,6640,6712,6612,6667,6685,6527,6893,6582,6659,6648,6712,6760,6813,6592,6687,6739,6730,6641,6691,6823,6572,6723,6697,6588,6659,6750,6592,6602,6707,6646,6832,6544,6640,6866,6662,6569,6671,6580,6692,6700,6572,6750,6646,6723,6450,6780,6736,6697,6675,6629,6580,6601,6758,6740,6689,6701,6677,6787,6715,6618,6607,6805,6654,6596,6709,6530,6862,6681,6872,6727,6654,6700,6631,6522,6709,6718,6827,6674,6658,6714,6737,6581,6556,6641,6755,6635,6505,6715,6684,6569,6771,6626,6789,6676,6769,6621,6736,6712,6547,6814,6620,6470,6763,6665,6505,6635,6658,6769,6776,6719,6602,6684,6676,6691,6744,6748,6706,6461,6651,6627,6584,6713,6537,6648,6653,6646,6532,6627,6638,6506,6797,6810,6616,6707,6682,6748,6609,6595,6621,6671,6703,6780,6594,6679,6777,6701,6708,6748,6630,6676,6791,6693,6732,6427,6754,6675,6618,6736,6625,6611,6692,6682,6669,6701,6626,6742,6825,6816,6791,6527,6690,6775,6843,6629,6695,6642,6624,6676,6686,6687,6734,6750,6569,6641,6689,6657,6562,6735,6632,6723,6560,6738,6634,6765,6740,6735,6667,6625,6712,6647,6648,6726,6701,6711,6689,6675,6537,6786,6556,6682,6546,6781,6631,6629,6590,6747,6758,6574,6695,6734,6837,6592,6701,6787,6419,6746,6633,6565,6676,6622,6675,6684,6631,6694,6685,6844,6490,6816,6835,6681,6699,6630,6591,6682,6871,6830,6489,6757,6740,6714,6598,6714,6693,6699,6730,6594,6736,6688,6767,6566,6584,6627,6629,6704,6636,6647,6652,6843,6624,6740,6650,6649,6552,6527,6575,6648,6703,6824,6650,6696,6642,6739,6722,6872,6708,6611,6572,6765,6638,6782,6791,6729,6548,6659,6674,6642,6593,6622,6720,6684,6668,6671,6685,6675,6741,6662,6685,6713,6622,6620,6657,6703,6820,6482,6760,6670,6805,6649,6623,6704,6709,6732,6721,6816,6624,6735,6760,6756,6638,6637,6776,6611,6726,6518,6726,6583,6793,6622,6448,6646,6784,6642,6675,6727,6784,6580,6714,6651,6585,6677,6580,6568,6756,6618,6697,6728,6622,6747,6479,6601,6555,6599,6730,6644,6766,6661,6556,6602,6657,6612,6623,6620,6729,6621,6759,6728,6753,6781,6700,6508,6766,6666,6609,6817,6578,6650,6596,6828,6460,6647,6723,6784,6763,6586,6580,6530,6729,6745,6735,6455,6685,6773,6613,6727,6780,6726]}]},"null_count":0,"tot_col_size":136688910,"last_update_version":401126096236183553},"b":{"histogram":{"ndv":2141696,"buckets":[{"count":586395,"lower_bound":"MTY5NTY3MTQ0NzExNzQ=","upper_bound":"MjY0NjcwODU1MjY3OTA=","repeats":583288},{"count":641070,"lower_bound":"Mjc0MTc3MzQ2MTI3NDM=","upper_bound":"MzU0NTM4ODE3NTMzNTg=","repeats":6},{"count":695746,"lower_bound":"MzU0NTU1NDkxMTAwMzM=","upper_bound":"MzU3NjQyNzE3NTkxMjE=","repeats":6},{"count":750422,"lower_bound":"MzU3Njg3MDE5ODQ1Mjg=","upper_bound":"MzU5ODAwMzI5NTYxODM=","repeats":6},{"count":805097,"lower_bound":"MzU5ODAzNTI2NjMzMTg=","upper_bound":"MzYxMzc2ODg5NzEwMjQ=","repeats":6},{"count":859773,"lower_bound":"MzYxMzgwOTAyOTA5NjA=","upper_bound":"MzYyNzAyMjIzOTkyNDY=","repeats":6},{"count":914448,"lower_bound":"MzYyNzQ0NjA2MDIxMzQ=","upper_bound":"MzY0NzE0ODUyMzQ5NjA=","repeats":6},{"count":969124,"lower_bound":"MzY0NzIwMzcyODU2NDc=","upper_bound":"MzY1Mjg1NDYxNDE5NzQ=","repeats":6},{"count":1023799,"lower_bound":"MzY1Mjk4NDQ2NjQwNzg=","upper_bound":"MzY2NDkwMzkxMzg1ODI=","repeats":6},{"count":1078475,"lower_bound":"MzY2NDk1NzE2MzA4NzA=","upper_bound":"MzY3MzQ5NzIxMzcyMzI=","repeats":6},{"count":1133151,"lower_bound":"MzY3MzU4MTczNTI5NzQ=","upper_bound":"MzY4MDQ0MTMwMjgxMTI=","repeats":6},{"count":1187826,"lower_bound":"MzY4MDQ5NTMzNzY1MzQ=","upper_bound":"MzY5MTEyNDkzMjk5MzQ=","repeats":6},{"count":1242502,"lower_bound":"MzY5MTc2MTc1MjA0MDE=","upper_bound":"MzcwNzg2OTI5NDc3Mjg=","repeats":6},{"count":1297177,"lower_bound":"MzcwODM5OTMzOTcwMTQ=","upper_bound":"MzcyODYzMjI4NTc3NDQ=","repeats":6},{"count":1351853,"lower_bound":"MzcyOTA2Mjc1NjczNzY=","upper_bound":"Mzc0NjEyNzU1NDk0NTU=","repeats":6},{"count":1406528,"lower_bound":"Mzc0NjEzMzgwMjc3OTI=","upper_bound":"Mzc1NTU5OTQ5MjY4NzE=","repeats":6},{"count":1462571,"lower_bound":"Mzc1Njc5Nzg1ODk5NzU=","upper_bound":"Mzc2ODMzMzA5MDc5MTk=","repeats":1372},{"count":1517246,"lower_bound":"Mzc2ODU2MjQzMTc3MTg=","upper_bound":"Mzc3OTI3MjEyNDU5Njk=","repeats":6},{"count":1571922,"lower_bound":"Mzc3OTgxNDk1MjczMTk=","upper_bound":"Mzc4ODg5NDAzNDMwNTU=","repeats":6},{"count":1626598,"lower_bound":"Mzc4ODkxMDA2MTk1MzY=","upper_bound":"Mzc5OTYwMjcxNDU5OTg=","repeats":6},{"count":1681273,"lower_bound":"Mzc5OTk5MjUxODQyNzg=","upper_bound":"MzgxMDA4NTk1MDIzNTM=","repeats":6},{"count":1735949,"lower_bound":"MzgxMDE5NTE4NzY4Nzg=","upper_bound":"MzgyMTQyNjM1MzUzNzU=","repeats":6},{"count":1790624,"lower_bound":"MzgyMTU5ODI2MTgzODI=","upper_bound":"MzgzNTA0ODgyMzM3NDI=","repeats":6},{"count":1845300,"lower_bound":"MzgzNTIyOTk4NzgxNTk=","upper_bound":"Mzg0ODA3OTU0Mjg2MjU=","repeats":6},{"count":1899975,"lower_bound":"Mzg0ODIxNzc5NzgxMjc=","upper_bound":"Mzg2MTc0ODgzNjUzMzU=","repeats":6},{"count":1954651,"lower_bound":"Mzg2MzI5NDQ1NjYwMzI=","upper_bound":"Mzg3NzQzOTIwNDEyMzk=","repeats":6},{"count":2009326,"lower_bound":"Mzg3NzQ0NDUzNTY4MTg=","upper_bound":"Mzg5OTA3NjgxNTQzODE=","repeats":6},{"count":2064002,"lower_bound":"Mzg5OTI2MDM5MDU4MTQ=","upper_bound":"MzkxNzA1Nzk5NTU0Nzg=","repeats":6},{"count":2118678,"lower_bound":"MzkxNzE4NTg5NjYyODc=","upper_bound":"MzkzMjA4NDM1NTg2NzQ=","repeats":6},{"count":2173353,"lower_bound":"MzkzMjI2NDA0NjU2Nzg=","upper_bound":"Mzk0Mjk3MTEzNDk1MjI=","repeats":6},{"count":2228029,"lower_bound":"Mzk0MzE4ODkxODQ1MzA=","upper_bound":"Mzk2NjY1NzE5OTY5NTA=","repeats":6},{"count":2282704,"lower_bound":"Mzk2Njc3OTY5NTg5OTQ=","upper_bound":"Mzk4NjY0NjY1MTY3NTY=","repeats":6},{"count":2337380,"lower_bound":"Mzk4NjY3MzMxMDA4MTk=","upper_bound":"Mzk5ODA5MjM0MTQyOTA=","repeats":6},{"count":2392055,"lower_bound":"Mzk5ODQyNTQ3MzgxOTI=","upper_bound":"NDAxMTQyOTcwODc3NjI=","repeats":6},{"count":2446731,"lower_bound":"NDAxMTcyOTE4OTg2NDE=","upper_bound":"NDAyNDI0MDI2Mzc1ODY=","repeats":6},{"count":2501407,"lower_bound":"NDAyNDI0MjI1OTczOTU=","upper_bound":"NDAzMzUyNjcxMjI5NTg=","repeats":6},{"count":2556082,"lower_bound":"NDAzMzc5MDYwNDI2NDI=","upper_bound":"NDAzOTY4OTc1MzU3NjE=","repeats":6},{"count":2610758,"lower_bound":"NDAzOTgzNTg1Mjc3NTk=","upper_bound":"NDA0NDE0MzQyNjc0MTQ=","repeats":6},{"count":2665433,"lower_bound":"NDA0NDI4MjA3MjY1NDY=","upper_bound":"NDA0OTI4MTQ1MzQ0MTY=","repeats":6},{"count":2720109,"lower_bound":"NDA0OTI5MzM2OTUyNDg=","upper_bound":"NDA1NDAwMTQ2OTAwNjE=","repeats":6},{"count":2774784,"lower_bound":"NDA1NDA2MjYwNjEwNzM=","upper_bound":"NDA2MDc3NDk5NzU4MjU=","repeats":6},{"count":2829460,"lower_bound":"NDA2MDk2ODc3Mjk5Mzc=","upper_bound":"NDA2NTI5MDAzMjkyMzQ=","repeats":6},{"count":2884136,"lower_bound":"NDA2NTM3NjU4NTA4OTk=","upper_bound":"NDA3MTIyOTE4OTA5NTk=","repeats":6},{"count":2938811,"lower_bound":"NDA3MTMxNDI5NjgwNzk=","upper_bound":"NDA3NzM3NDE5NDI1NDc=","repeats":6},{"count":2993487,"lower_bound":"NDA3NzU2NDgzMTMxMDI=","upper_bound":"NDA4MjY1NjQwMTk5ODY=","repeats":6},{"count":3048162,"lower_bound":"NDA4Mjc3NzA1Njg0NzE=","upper_bound":"NDA4OTAwNjA1ODg4MjI=","repeats":6},{"count":3102838,"lower_bound":"NDA4OTA3MTQ3NzMyNzE=","upper_bound":"NDA5NTc1MDgzNTM4MDg=","repeats":6},{"count":3157513,"lower_bound":"NDA5NTc5MTA3NDI3OTc=","upper_bound":"NDEwMjA3NjYxMTE1MTE=","repeats":6},{"count":3212189,"lower_bound":"NDEwMjA3OTMxMjg3MTc=","upper_bound":"NDEwODkyMTU2NzIwNzk=","repeats":6},{"count":3266864,"lower_bound":"NDEwODkzMzMzMzc4NzY=","upper_bound":"NDExNTAxNzkyOTI5NDQ=","repeats":6},{"count":3321540,"lower_bound":"NDExNTIwNzI3NDI2NzY=","upper_bound":"NDEyMDI4MDQ2NTM4NDY=","repeats":6},{"count":3376216,"lower_bound":"NDEyMDY2Njg1OTA4NjI=","upper_bound":"NDEyOTIyOTY5MTY3NTY=","repeats":6},{"count":3430891,"lower_bound":"NDEyOTI0MjMyNTc4NzQ=","upper_bound":"NDEzODM1NDQ4OTExNTE=","repeats":6},{"count":3485567,"lower_bound":"NDEzODk0NTY3ODMxMjM=","upper_bound":"NDE0NDQ2ODg3MTE0Mzk=","repeats":6},{"count":3540242,"lower_bound":"NDE0NDU1MDYzNjcyNTA=","upper_bound":"NDE1MzI2MzkzMTM2ODU=","repeats":6},{"count":3594918,"lower_bound":"NDE1MzM0MTczNTcwNzA=","upper_bound":"NDE1OTcyOTMxNDc5MjU=","repeats":6},{"count":3649593,"lower_bound":"NDE1OTgwMzcxMTA1NDk=","upper_bound":"NDE3MjMwMjgyNDIxOTg=","repeats":6},{"count":3704269,"lower_bound":"NDE3MjU1NzY0MjExMzk=","upper_bound":"NDE3Nzk2OTE3MjY2MTI=","repeats":6},{"count":3758945,"lower_bound":"NDE3ODAzNTcyNjUxNzE=","upper_bound":"NDE4NDk5MzgyODIyNjE=","repeats":6},{"count":3813620,"lower_bound":"NDE4NTQyMDQzNTYzNjU=","upper_bound":"NDE5MzI3Mjk4MDY2MTI=","repeats":6},{"count":3868296,"lower_bound":"NDE5Mzk4NTU0NjQyMTE=","upper_bound":"NDIwMTgxNzg1NTM2MjM=","repeats":6},{"count":3922971,"lower_bound":"NDIwMTg4NDIyOTgxMjc=","upper_bound":"NDIwNjg0MTQwODQ4ODc=","repeats":6},{"count":3977647,"lower_bound":"NDIwNzA0OTY0NzA4MDE=","upper_bound":"NDIxNDc4NzA5MTQzMjY=","repeats":6},{"count":4032322,"lower_bound":"NDIxNDc5MTQxODY1MTM=","upper_bound":"NDIyMTM5NzM2NjE0NTU=","repeats":6},{"count":4086998,"lower_bound":"NDIyMTQzMTg0ODkzNjY=","upper_bound":"NDIyODcwNTYxODUxMDI=","repeats":6},{"count":4141673,"lower_bound":"NDIyODgwNjg2ODE0OTU=","upper_bound":"NDIzNDg2MDM0NzE2Mzc=","repeats":6},{"count":4196349,"lower_bound":"NDIzNDg3MzEwMDY3MzY=","upper_bound":"NDI0MTA5MjI2NTU1MDE=","repeats":6},{"count":4251025,"lower_bound":"NDI0MTIxNDQ4NDI1MTU=","upper_bound":"NDI1MjAyMjAzNTYzNzQ=","repeats":6},{"count":4305700,"lower_bound":"NDI1MjAzMTc1ODUxNjg=","upper_bound":"NDI1ODg4ODM5MjY3OTc=","repeats":6},{"count":4360376,"lower_bound":"NDI1ODkwOTc0ODQwNDk=","upper_bound":"NDI2NTUxOTUwNDc2OTk=","repeats":6},{"count":4415051,"lower_bound":"NDI2NTgyNjg3NTc3ODM=","upper_bound":"NDI3NzU2OTU4Mjg3NTY=","repeats":6},{"count":4469727,"lower_bound":"NDI3NzYyMDQ5MTIzOTg=","upper_bound":"NDI4MzA5MzYyNzg3OTg=","repeats":6},{"count":4524402,"lower_bound":"NDI4MzExNjg3NTc1MjY=","upper_bound":"NDI4ODYyNTg3MDgyNDM=","repeats":6},{"count":4579078,"lower_bound":"NDI4ODg2NDU1MDQ3ODM=","upper_bound":"NDI5NTMwNTk3NDM1MTE=","repeats":6},{"count":4633754,"lower_bound":"NDI5NjMwMzI2MDAzMzc=","upper_bound":"NDMwMTYxMzc4MzgzNTY=","repeats":6},{"count":4688429,"lower_bound":"NDMwMTk4MzA2MzYzMDM=","upper_bound":"NDMwODYyNzY1OTEzODE=","repeats":6},{"count":4743105,"lower_bound":"NDMwODY0ODg5NTA1NDE=","upper_bound":"NDMxNzM2MzQ2ODI2NDE=","repeats":6},{"count":4797780,"lower_bound":"NDMxNzM3OTIzMDY5Njc=","upper_bound":"NDMyNzQxNjk2Mzg2NzE=","repeats":6},{"count":4852456,"lower_bound":"NDMyNzQ4ODAyMzkzNzk=","upper_bound":"NDMzNTE3ODExNjQ4MTQ=","repeats":6},{"count":4907131,"lower_bound":"NDMzNTI0NjA4NjExOTc=","upper_bound":"NDM0Mjk2Njg1NDgzNzU=","repeats":6},{"count":4961807,"lower_bound":"NDM0MzIzMTE3MjM3OTE=","upper_bound":"NDM1MTc1MzYyNTk4NTQ=","repeats":6},{"count":5016482,"lower_bound":"NDM1MTc2MDA4NjQwMTk=","upper_bound":"NDM2MTExMDcxNTk4MjQ=","repeats":6},{"count":5071158,"lower_bound":"NDM2MTE4NTIwMTMzMjU=","upper_bound":"NDM3MTY5NzM3NTAwMzA=","repeats":6},{"count":5125834,"lower_bound":"NDM3MTc4NDQyODkzMDA=","upper_bound":"NDM4Mzg2MzkyNDcxMTc=","repeats":6},{"count":5180509,"lower_bound":"NDM4Mzg2ODk1OTUxNDk=","upper_bound":"NDM5NjI4NzAwOTk3MzE=","repeats":6},{"count":5235185,"lower_bound":"NDM5NjY4ODQ5MjkzMDA=","upper_bound":"NDQwNDg4ODI0NjY1ODM=","repeats":6},{"count":5289860,"lower_bound":"NDQwNDkxNDQwNDEyMzM=","upper_bound":"NDQxNjE3NjU5MjA1MzE=","repeats":6},{"count":5344536,"lower_bound":"NDQxNjIzMDE5MTA4MDM=","upper_bound":"NDQyNDY4NDU5NDM1NzQ=","repeats":6},{"count":5399211,"lower_bound":"NDQyNDc4MjUxMzk0Njk=","upper_bound":"NDQzNDE0ODc5MDA0MzI=","repeats":6},{"count":5453887,"lower_bound":"NDQzNDE2NjQ1ODk1ODE=","upper_bound":"NDQ0NDMxNDI4NDIxMzE=","repeats":6},{"count":5508563,"lower_bound":"NDQ0NDczMTEyNjk2NDc=","upper_bound":"NDQ1Mzk1MzM4OTc0ODk=","repeats":6},{"count":5563238,"lower_bound":"NDQ1NDAxMTcwNTUyNTU=","upper_bound":"NDQ2NTAyNDg0OTQ4NjQ=","repeats":6},{"count":5617914,"lower_bound":"NDQ2NTIyMDk3NzQzNTc=","upper_bound":"NDQ3NTU4NTM2NDE0ODc=","repeats":6},{"count":5672589,"lower_bound":"NDQ3NTU5NjI0NTM3NzU=","upper_bound":"NDQ4NTAzMTc1ODIwOTM=","repeats":6},{"count":5727265,"lower_bound":"NDQ4NTEwMjM4MDgyNzM=","upper_bound":"NDQ5ODE1NjY1ODg2ODU=","repeats":6},{"count":5781940,"lower_bound":"NDQ5ODE2MjI1MTc1MTg=","upper_bound":"NDUxMTA4MDcxMzM5Njg=","repeats":6},{"count":5836616,"lower_bound":"NDUxMTI0MjU2MDQ4ODc=","upper_bound":"NDUyMzgwODMxNjE4NzE=","repeats":6},{"count":5891292,"lower_bound":"NDUyMzg5NDI0MzcxMzU=","upper_bound":"NDUyODczNTY1ODU3NDc=","repeats":6},{"count":5945967,"lower_bound":"NDUyOTE2MzQ4NTk3OTM=","upper_bound":"NDUzNjQxODg2NDUxNDI=","repeats":6},{"count":6000643,"lower_bound":"NDUzNzMxNTMzODgzMDc=","upper_bound":"NDU0NDUxNTMxNjkxNzM=","repeats":6},{"count":6055318,"lower_bound":"NDU0NDU1NTk5NTExMjU=","upper_bound":"NDU1MTk2Njk3ODg0MzI=","repeats":6},{"count":6109994,"lower_bound":"NDU1MjA2MjI3Mjg5ODM=","upper_bound":"NDU1OTU0ODIyODU4NDM=","repeats":1372},{"count":6164669,"lower_bound":"NDU1OTYyNjEwODQ5NDk=","upper_bound":"NDU2Njc0NjAzMzEyODY=","repeats":6},{"count":6219345,"lower_bound":"NDU2Njc2NzgxMDk0NTU=","upper_bound":"NDU3NjIwODAwODc4Mjg=","repeats":6},{"count":6274020,"lower_bound":"NDU3NjQzNTMyODk5OTc=","upper_bound":"NDU4NDc4NTQ2Nzc3Nzk=","repeats":6},{"count":6328696,"lower_bound":"NDU4NDc5Nzg1NTMxMDU=","upper_bound":"NDU5MjgwMTg5MTUwOTQ=","repeats":6},{"count":6383372,"lower_bound":"NDU5Mjg0ODQ2NTI4MTM=","upper_bound":"NDU5ODMyNzY5NDcyMTk=","repeats":6},{"count":6438047,"lower_bound":"NDU5OTQwNDE3MzA4MzI=","upper_bound":"NDYwODExODI2MDUwNzY=","repeats":6},{"count":6492723,"lower_bound":"NDYwODE2ODk2NTMwMTU=","upper_bound":"NDYxNTE2NDEzODY3NzM=","repeats":6},{"count":6547398,"lower_bound":"NDYxNTI1MjE3MTM0Mjc=","upper_bound":"NDYyMzkzNTYwMTAyNjA=","repeats":6},{"count":6602074,"lower_bound":"NDYyNDA2Mzg4NDY3MzU=","upper_bound":"NDYyOTE4NDEzNTU1Mzk=","repeats":6},{"count":6656749,"lower_bound":"NDYyOTIyNTA2NDQyMzk=","upper_bound":"NDYzNDkzMDY2NTQ0ODQ=","repeats":6},{"count":6711425,"lower_bound":"NDYzNTE5MTA3NjAyMDc=","upper_bound":"NDYzOTYxNzA5NDYzMTk=","repeats":6},{"count":6766101,"lower_bound":"NDYzOTc4ODY0MDIzMjE=","upper_bound":"NDY0NjQwMDkyNzMxMDQ=","repeats":6},{"count":6820776,"lower_bound":"NDY0NjUwNDMyMzA0ODA=","upper_bound":"NDY1Mjc2OTI1OTI5MTE=","repeats":6},{"count":6875452,"lower_bound":"NDY1Mjk5MTY3NzYyMDc=","upper_bound":"NDY2MjQwNjM4NDYxNTc=","repeats":6},{"count":6930127,"lower_bound":"NDY2MjU5Nzk2NDM2NzE=","upper_bound":"NDY2ODk0NDUxNzA5NTc=","repeats":6},{"count":6984803,"lower_bound":"NDY2OTE5NjkxNTY4Nzk=","upper_bound":"NDY3OTI0NTY3MDM3NTc=","repeats":6},{"count":7039478,"lower_bound":"NDY3OTQ5NTA0NDY4Njk=","upper_bound":"NDY4NDczODQwNjc4NTQ=","repeats":6},{"count":7094154,"lower_bound":"NDY4NTUwODk1OTQxMzM=","upper_bound":"NDY5Mjc5ODY5Mjk0MzE=","repeats":6},{"count":7148829,"lower_bound":"NDY5Mjk0OTIzNDY2NDc=","upper_bound":"NDcwMzM4Mzc1NTc1MjA=","repeats":6},{"count":7203505,"lower_bound":"NDcwMzQ2MzY4MzA0ODc=","upper_bound":"NDcxNDIyMjUyODg5NzY=","repeats":6},{"count":7258181,"lower_bound":"NDcxNDM3Njg3MzU1MDU=","upper_bound":"NDcyMTU1MjUzOTAxMDM=","repeats":6},{"count":7312856,"lower_bound":"NDcyMTk3NzIyMDg5MTk=","upper_bound":"NDcyODY2MDc3MzA0NTU=","repeats":6},{"count":7367532,"lower_bound":"NDcyODgwNTc2MjYzODc=","upper_bound":"NDczNjcyNzMwNDc4MzE=","repeats":6},{"count":7422207,"lower_bound":"NDczNzE2OTkzMzA4Mzk=","upper_bound":"NDc0NTk0MjY3ODI5OTY=","repeats":6},{"count":7476883,"lower_bound":"NDc0NTk4MDY1OTA3Mzc=","upper_bound":"NDc1MzE4NTU0OTI4Nzk=","repeats":6},{"count":7531558,"lower_bound":"NDc1MzkwMzE3NTA0MTk=","upper_bound":"NDc2MDk4MTgxOTE2MzU=","repeats":6},{"count":7586234,"lower_bound":"NDc2MTEwMTA5NTA5MzM=","upper_bound":"NDc2ODE5OTc4Mjc4NTM=","repeats":1372},{"count":7640910,"lower_bound":"NDc2ODM2OTQ5MjM1Mzg=","upper_bound":"NDc3NzA4NTYzMzcxNjU=","repeats":6},{"count":7695585,"lower_bound":"NDc3NzQ4ODgzOTQ1MTA=","upper_bound":"NDc4NjUwMTMwNDkxMDE=","repeats":6},{"count":7750261,"lower_bound":"NDc4NzEyMTQyNzQzMjM=","upper_bound":"NDc5NDA4MTg1MTU3MzE=","repeats":1372},{"count":7804936,"lower_bound":"NDc5NDQ2Njc2NzAyODk=","upper_bound":"NDgwMjgyOTU4MzMzNjU=","repeats":6},{"count":7859612,"lower_bound":"NDgwMjkwOTA3Nzg5MDM=","upper_bound":"NDgxMDQ2OTkxNzI2MjM=","repeats":6},{"count":7914287,"lower_bound":"NDgxMDU1MjAwMDg5ODE=","upper_bound":"NDgxODQ5MTYwODA0MDQ=","repeats":6},{"count":7968963,"lower_bound":"NDgxODU1ODQzODk5MDE=","upper_bound":"NDgyNjc5ODc1MDA4MTM=","repeats":6},{"count":8025005,"lower_bound":"NDgyNzA1NjkxMTMzNTg=","upper_bound":"NDgzNDM1MTg1MTA4NjE=","repeats":1372},{"count":8079681,"lower_bound":"NDgzNDM4Mjg0OTYxNDE=","upper_bound":"NDg0MTAyMDYyNzEyNTM=","repeats":6},{"count":8135723,"lower_bound":"NDg0MTAzODg4NDAyMTM=","upper_bound":"NDg0ODIwNDY5NjE0MzE=","repeats":1372},{"count":8190399,"lower_bound":"NDg0ODMwOTM2NDMwMzE=","upper_bound":"NDg1NjIxNDAxMTA2MTQ=","repeats":6},{"count":8245075,"lower_bound":"NDg1NjIyMjk2MDgyMTQ=","upper_bound":"NDg2Mzk2MTI4NzQ1MTQ=","repeats":6},{"count":8299750,"lower_bound":"NDg2NDA0Mjc4MjkwMTA=","upper_bound":"NDg3MTk1OTYyNDY3OTg=","repeats":6},{"count":8354426,"lower_bound":"NDg3MTk4NjIzNDc1NDM=","upper_bound":"NDg4MDI0NDc0NDM3MzI=","repeats":6},{"count":8409101,"lower_bound":"NDg4MDM1MDY1NjQ4Nzc=","upper_bound":"NDg4NTMxNjU5MzAyNTM=","repeats":6},{"count":8463777,"lower_bound":"NDg4NTYwMjc2MDY4MDA=","upper_bound":"NDg5MDAxODM5OTIwODQ=","repeats":6},{"count":8518452,"lower_bound":"NDg5MDAzMjY2MTY4NDU=","upper_bound":"NDg5NjA3NDI1Mjg3ODY=","repeats":6},{"count":8573128,"lower_bound":"NDg5NjA4NzQ3OTY4MTc=","upper_bound":"NDkwMjQ2ODU5NjkxNjk=","repeats":6},{"count":8627803,"lower_bound":"NDkwMjQ4MTE4MTQ2NzA=","upper_bound":"NDkwNzkwMjg0NTMxMzc=","repeats":6},{"count":8682479,"lower_bound":"NDkwNzkyNTExMDc1OTc=","upper_bound":"NDkxNDQyMzAzNDY1MTU=","repeats":6},{"count":8737155,"lower_bound":"NDkxNDQzOTY5ODYxMjU=","upper_bound":"NDkyMDQ3NTI0MzI5MTA=","repeats":6},{"count":8791830,"lower_bound":"NDkyMDYwMDM2Mjc3OTE=","upper_bound":"NDkyNTU2MjkzNjUwMTQ=","repeats":6},{"count":8846506,"lower_bound":"NDkyNTU4MTQzMzIxODA=","upper_bound":"NDkzMzE3MDU1NDY1MTk=","repeats":6},{"count":8901181,"lower_bound":"NDkzMzIxNjgwMzIwMjI=","upper_bound":"NDkzODU2MTA3ODg2Mjc=","repeats":6},{"count":8955857,"lower_bound":"NDkzODYxNzA1NjAyNzk=","upper_bound":"NDk0NTIyMzA2MzExODc=","repeats":6},{"count":9010532,"lower_bound":"NDk0NTMzMzE0MzczMzQ=","upper_bound":"NDk1MzM3NjYzNzkyODY=","repeats":6},{"count":9065208,"lower_bound":"NDk1MzU4MTA0NjU1NTQ=","upper_bound":"NDk1ODc3MDY2MDUzMzE=","repeats":6},{"count":9119884,"lower_bound":"NDk1ODc5OTE1NDM1NjU=","upper_bound":"NDk2NDc0MDU2NTU4Mjk=","repeats":6},{"count":9177293,"lower_bound":"NDk2NDc5NjA1MzA3MDI=","upper_bound":"NDk2Njg3MjYyMzI4NTQ=","repeats":35522},{"count":9231968,"lower_bound":"NDk2NjkxNDczMjgyNzE=","upper_bound":"NDk3Mzc4NTYwNjMyNTI=","repeats":6},{"count":9286644,"lower_bound":"NDk3NDA0NzU1ODQyNzk=","upper_bound":"NDk3OTc2NjQ0NzA3OTk=","repeats":6},{"count":9341320,"lower_bound":"NDk3OTk1Nzk0ODgwMTY=","upper_bound":"NDk4NTU0MTc4NzAwOTk=","repeats":6},{"count":9395995,"lower_bound":"NDk4NjMxMDc3MTY4ODc=","upper_bound":"NDk5MTEyMTAyNTQwOTU=","repeats":6},{"count":9450671,"lower_bound":"NDk5MTEzNjAxMjA1ODk=","upper_bound":"NDk5ODM1NjY4Mzk1NzE=","repeats":6},{"count":9505346,"lower_bound":"NDk5ODYwNTQwMzkzMTg=","upper_bound":"NTAwNDU3Mzg4NDM5MjA=","repeats":6},{"count":9560022,"lower_bound":"NTAwNDYxMDI5MDg2OTI=","upper_bound":"NTAwOTgyMDMxOTkyNDU=","repeats":6},{"count":9614697,"lower_bound":"NTAwOTk4MzYzNjg2NTQ=","upper_bound":"NTAxNTczNzA5MzkxNTE=","repeats":6},{"count":9669373,"lower_bound":"NTAxNTc4ODQ4MTEwMjM=","upper_bound":"NTAyMjMxODU1NjU0NTQ=","repeats":6},{"count":9724049,"lower_bound":"NTAyMjQxMTYxMzM2NTM=","upper_bound":"NTAyNzEzODcyMDk0ODc=","repeats":6},{"count":9778724,"lower_bound":"NTAyNzM3NjQzMjMwOTE=","upper_bound":"NTAzMzY4NTkyNjQ3ODQ=","repeats":6},{"count":9833400,"lower_bound":"NTAzMzcxNDg0MzQxOTg=","upper_bound":"NTA0MDU3MDQyMzg4NzE=","repeats":6},{"count":9888075,"lower_bound":"NTA0MDcwNTAzMjc4Mjk=","upper_bound":"NTA0NzIzMzQzMTExODg=","repeats":6},{"count":9942751,"lower_bound":"NTA0ODE4OTEzMzU5NTc=","upper_bound":"NTA1Mjk0NDY4MjM2OTg=","repeats":6},{"count":9997426,"lower_bound":"NTA1MzAyNzU4MDA4NTU=","upper_bound":"NTA1OTM1MDcwNDcxODk=","repeats":6},{"count":10052102,"lower_bound":"NTA1OTM2NzEwNjk0NTU=","upper_bound":"NTA2NjYxMTgzMzIxNzU=","repeats":6},{"count":10106778,"lower_bound":"NTA2NjcwNTkxNzMxNDE=","upper_bound":"NTA3MjkzMzY1MTAyMjg=","repeats":6},{"count":10161453,"lower_bound":"NTA3MzIwNTAyNzgxNTc=","upper_bound":"NTA4MTUxMjkxNzE3MzM=","repeats":6},{"count":10216129,"lower_bound":"NTA4MTUzNzk3MDM1NzU=","upper_bound":"NTA4NzMwMzU0NzA2MDc=","repeats":6},{"count":10270804,"lower_bound":"NTA4NzM3NTUwMTkwMjI=","upper_bound":"MzI1MjM1NzcwMTg5NTkzNg==","repeats":6},{"count":10325480,"lower_bound":"MzI2Njg2NjM2OTg5NDI3Mg==","upper_bound":"NDI5NTcyNTM3NDY5OTI2NA==","repeats":6},{"count":10380155,"lower_bound":"NDI5NjUzMDAyNjYxNjcwNA==","upper_bound":"NTIzNjQ1MzkwMjc3NjA2NA==","repeats":6},{"count":10434831,"lower_bound":"NTI2MzI5MTI2NTkzMzE4NA==","upper_bound":"NjYzODYxOTczMzQ2NDk2MA==","repeats":6},{"count":10489506,"lower_bound":"NjY0MTg2Mzk2NDUzNjU3Ng==","upper_bound":"Nzk3MTE3MjU0NTM3Mzk1Mg==","repeats":6},{"count":10544182,"lower_bound":"Nzk5ODgzNDIwMjU2NjUyOA==","upper_bound":"OTAyOTAxNTExNzcwMDk5Mg==","repeats":6},{"count":10598858,"lower_bound":"OTAzNjc4MDA1Nzk0MTg4OA==","upper_bound":"MTAxNDQ3MTIzMTI4NzA3ODQ=","repeats":6},{"count":10653533,"lower_bound":"MTAxNTY1NzYyOTE3ODI1Mjg=","upper_bound":"MTE4Nzc1NDY2MDIwMjI2NTY=","repeats":6},{"count":10708209,"lower_bound":"MTE5MjE1MjQ5NDQ3MTE0MjQ=","upper_bound":"MTM1NTU2ODc2MTU0NTUxMDQ=","repeats":6},{"count":10762884,"lower_bound":"MTM1NzAwNTQ1NjIxNTQyNDA=","upper_bound":"MTQ4NTY4MjYwNDY4OTU4NzI=","repeats":1372},{"count":10817560,"lower_bound":"MTQ4NjQzODYxNTM5MjI0MzI=","upper_bound":"MTU5NjI2NTMxMjE4ODE5ODQ=","repeats":6},{"count":10872235,"lower_bound":"MTU5NjI4OTQ3NDMxNDYyNDA=","upper_bound":"MTc3MzcxMzg3NjY0Njg5OTI=","repeats":6},{"count":10926911,"lower_bound":"MTc3NTQ4MDM3OTUxNTA1OTI=","upper_bound":"MTkxMTYzMDI2NTIyMTUwNDA=","repeats":6},{"count":10981587,"lower_bound":"MTkyNDg1NDI0NzY1ODQ3MDQ=","upper_bound":"MjAzNzMwOTYwNDEyNDY0NjQ=","repeats":6},{"count":11036262,"lower_bound":"MjA0NDczMzU1NTc2MTc1MzY=","upper_bound":"MjE3OTI1NDY0MDE0MzUzOTI=","repeats":6},{"count":11090938,"lower_bound":"MjE4MjcyNjM4NTUzMTI2NDA=","upper_bound":"MjI4MjMyMTA2NDI5MzM1MDQ=","repeats":6},{"count":11145613,"lower_bound":"MjI4Nzk1MTQwMTUyMzU5Njg=","upper_bound":"MjQ1MjkyMDg1OTYyODMyNjQ=","repeats":6},{"count":11200289,"lower_bound":"MjQ2MDk3NzU5OTYyNzg1Mjg=","upper_bound":"MjYxNTI5MzQ2MTAwNTcwODg=","repeats":6},{"count":11254964,"lower_bound":"MjYxNzQ3NzEzOTc5NTczNzY=","upper_bound":"MjgwNzQ2MzY0MTk5MjE2NjQ=","repeats":6},{"count":11309640,"lower_bound":"MjgxMjA1OTM3NDQzNDg5Mjg=","upper_bound":"Mjk0ODc2NzU1NzI2MDg3Njg=","repeats":6},{"count":11364315,"lower_bound":"Mjk0OTA1MzIzNTUwMjg4NjQ=","upper_bound":"MzA4NjM0NTU0NjA0NzY2NzI=","repeats":6},{"count":11418991,"lower_bound":"MzA4NjY5MjkxOTU2NzM0NzI=","upper_bound":"MzE5ODQxNTQwNDQ1MjIzNjg=","repeats":6},{"count":11473667,"lower_bound":"MzIwMTAyNzExMjQxMTMxNTI=","upper_bound":"MzIyNTU0NTAwMzY3NzQ3ODQ=","repeats":6},{"count":11528342,"lower_bound":"MzIyNjM5NTQ1NDk5OTk0ODg=","upper_bound":"MzMzNDY2ODEwMTc5NzY1NzY=","repeats":6},{"count":11583018,"lower_bound":"MzM0MDA5MjEwMjcyODg4MzI=","upper_bound":"MzQ5MjQzNTA4NDI5NzM5NTI=","repeats":6},{"count":11637693,"lower_bound":"MzUwNDI0NDc0NTMyODIxNzY=","upper_bound":"MzY1NzUzODc5ODMxNjEyMTY=","repeats":6},{"count":11692369,"lower_bound":"MzY1OTg5OTQ2MjQ5NDE5NTI=","upper_bound":"Mzc4MTY0MDg5NDc2OTEyNjQ=","repeats":6},{"count":11747044,"lower_bound":"Mzc4Mjk2NDg0NTY5ODI0MDA=","upper_bound":"Mzg3NzI3NDI0NDY2OTQyNzI=","repeats":6},{"count":11801720,"lower_bound":"Mzg4MDkyMDM5MjE1OTQyNDA=","upper_bound":"NDAxNTI5MTQwODk1NzAwNDg=","repeats":6},{"count":11856396,"lower_bound":"NDAxOTc3NzkwNzkwNDI5NDQ=","upper_bound":"NDE4MDIwMzY1NTk0Mzk2MTY=","repeats":6},{"count":11911071,"lower_bound":"NDE4MTYxMTQ2NTI2Mjg4NjQ=","upper_bound":"NDM0OTYwODAxMTcyNDk5MjA=","repeats":6},{"count":11965747,"lower_bound":"NDM1NjAyNTQ1MjAzMzIwMzI=","upper_bound":"NDU4NjczMTAyNjI3OTE5MzY=","repeats":6},{"count":12020422,"lower_bound":"NDU4NzEyMjI3MzAzNTIzODQ=","upper_bound":"NDgyMDAyNzU4NDgzMDI0NjQ=","repeats":6},{"count":12075098,"lower_bound":"NDgyMDM2MjM4ODg0OTQzMzY=","upper_bound":"NDk1ODczODUyMjY0NTA2ODg=","repeats":6},{"count":12129773,"lower_bound":"NDk2MjQxODkyNTg0NTQ5MTI=","upper_bound":"NTEwOTY2Nzk2Nzk3MTkyOTY=","repeats":6},{"count":12184449,"lower_bound":"NTEwOTgyNzQ3Nzc1OTM3Mjg=","upper_bound":"NTIyNDE5MTEwOTE3NTg5NzY=","repeats":6},{"count":12239125,"lower_bound":"NTIyNDkyNTE2MzU0NTU4NzI=","upper_bound":"NTMyODU0NTk0NTA5MTQ2ODg=","repeats":6},{"count":12293800,"lower_bound":"NTMzMDUzNDMzODc4NTI2NzI=","upper_bound":"NTQ2ODQxNzQ5Mzc4NDM1ODQ=","repeats":6},{"count":12348476,"lower_bound":"NTQ2ODc1MzM0NzY1OTc2MzI=","upper_bound":"NTU4NTIxMDkzMjQ3OTM2MDA=","repeats":6},{"count":12403151,"lower_bound":"NTU4Nzk1ODUwNTY3MjI4MTY=","upper_bound":"NTcyNzA5OTE4NTYwNzY2NzI=","repeats":6},{"count":12457827,"lower_bound":"NTczMTcwNDQyNDg0NTI4NjQ=","upper_bound":"NTg2OTE4NTc4MjMyOTExMzY=","repeats":6},{"count":12512502,"lower_bound":"NTg3MDQ0ODM3NjAzNDY4ODA=","upper_bound":"NjAyODE0OTc3NTk5MDU1MzY=","repeats":6},{"count":12567178,"lower_bound":"NjAyODM2MTQyNTE5Mzk3MTI=","upper_bound":"NjE3Njk0Mzk2NDkwODEwODg=","repeats":6},{"count":12621853,"lower_bound":"NjE3ODc5NTU4MzE4MjYxNzY=","upper_bound":"NjMwNjYyMTM2MTc2NTc2MDA=","repeats":6},{"count":12676529,"lower_bound":"NjMxMDIwNTQxNjM1MTMyMTY=","upper_bound":"NjQwODI1OTU1OTE1ODc1ODQ=","repeats":6},{"count":12731205,"lower_bound":"NjQwODMxMjg5OTM3MTU5Njg=","upper_bound":"NjQ2OTE4NDk2MTI1MjMzOTI=","repeats":6},{"count":12785880,"lower_bound":"NjQ4MTYzMDE3ODg2MTg2MjQ=","upper_bound":"NjU5OTU5MzAxNzE4NTI2NzI=","repeats":6},{"count":12840556,"lower_bound":"NjYwNTU0MjAxNjIzMzI0MTY=","upper_bound":"NjcwMTc0NzI1NzM4NjU3Mjg=","repeats":6},{"count":12895231,"lower_bound":"NjcwMTgxMDY2MjI3MjYwMTY=","upper_bound":"NjgxOTg4OTE3NDAzNjY1OTI=","repeats":6},{"count":12949907,"lower_bound":"NjgyMzc0MTQzMjU2NzM3Mjg=","upper_bound":"Njk3MzAzMzM5MjI1NzIwMzI=","repeats":6},{"count":13004582,"lower_bound":"Njk4OTAyNjk4NjQxNjkzNDQ=","upper_bound":"NzEwODE5NzE0MDQ2MTk2NDg=","repeats":6},{"count":13059258,"lower_bound":"NzEwOTMxNTQ1ODk0MjU0MDg=","upper_bound":"NzI1NjYyNjgwMTk5MzkyMDA=","repeats":6},{"count":13113934,"lower_bound":"NzI1NzU2NzkzMDAxNTcxODQ=","upper_bound":"NzM2NDI1MDUxMjc5ODI4NDg=","repeats":6},{"count":13168609,"lower_bound":"NzM2NDI1MjI2NTU3OTI4OTY=","upper_bound":"NzUxNjA5NzgzMzcxMDE2OTY=","repeats":6},{"count":13223285,"lower_bound":"NzUxODE2MTc0NzE0MzA1Mjg=","upper_bound":"NzY5MTQyMDgxNTQ5NDExODQ=","repeats":6},{"count":13277960,"lower_bound":"NzY5NDM0MDAxNDE5NTI4OTY=","upper_bound":"NzgzNzc1MTEyMzAyMDU4MjQ=","repeats":6},{"count":13332636,"lower_bound":"Nzg0MDgzMTk4ODIzNTA0NjQ=","upper_bound":"ODAyNDU5NDI1MzU3NTU2NDg=","repeats":6},{"count":13387311,"lower_bound":"ODAyNTAyNDI0OTAxNTg4NDg=","upper_bound":"ODIyMjE2NDEyOTk0NTM2OTY=","repeats":6},{"count":13441987,"lower_bound":"ODIyMzAyOTk0NzExOTU5MDQ=","upper_bound":"ODQ1NzIwNjk1ODg3MDEwNTY=","repeats":6},{"count":13496662,"lower_bound":"ODQ1NzgzNzY0NzU2NjYxNzY=","upper_bound":"ODYzNzkyNTc3OTM5MTQ3NTI=","repeats":6},{"count":13551338,"lower_bound":"ODYzOTE2MTQxNjcwOTMxMjA=","upper_bound":"ODgxNTMzMjQ5ODU0MTE0NTY=","repeats":6},{"count":13606014,"lower_bound":"ODgxODE5NDM3NjE3NjAwMDA=","upper_bound":"OTEwMzM5ODE3MjU3NjM0NTY=","repeats":6},{"count":13660689,"lower_bound":"OTExMTY3NzMwNzk4Nzk0MjQ=","upper_bound":"OTMyMDI3NDIzMzU4MzYwMzI=","repeats":6},{"count":13668891,"lower_bound":"OTMyMDg0NTU1NjQ4OTYxMjg=","upper_bound":"OTM2MTgyNzI5NzY4NzEyOTY=","repeats":6}]},"cm_sketch":{"rows":[{"counters":[5543,5755,6632,5848,6000,6277,6188,5783,6443,6086,5589,5923,5999,6561,6374,5571,5873,6879,5555,6168,5721,5650,6433,5074,5865,7119,6889,5335,4939,6124,5982,5675,6619,5586,7830,6611,5656,5652,6080,5196,5595,7103,5770,7481,6281,6050,6360,6147,5842,6432,5740,5930,5757,6150,5367,5900,6106,5045,5107,6388,5980,5417,5764,7862,6332,6610,5699,6141,6275,6261,6541,6538,5702,5397,8571,6040,6485,5727,5913,6390,5867,6028,6255,5456,5704,6667,7038,5777,5580,5900,5684,5685,6154,6870,6215,6405,5633,6384,5935,6727,6478,6501,5337,5765,50913,6400,5949,6059,5106,5853,5793,6715,6706,6009,6246,6522,6446,6578,5857,6661,5783,6684,5944,6196,5079,6947,6147,5515,6134,6007,5486,6425,5408,5273,5805,6965,5431,6445,5982,7657,13364,7261,5909,5363,6814,6376,5727,6803,5390,5800,8633,6672,5590,6403,6452,5902,5528,5181,8380,6286,7066,6648,7042,6991,5767,5790,5892,6703,6772,5896,6330,6435,6465,5373,5465,5556,6366,5435,8711,6103,5017,6860,6533,5392,5332,6736,5959,6148,7116,6156,6543,6733,5660,5968,6487,6022,6127,6014,5795,7622,6378,6977,5473,5400,7065,5615,6031,6906,6570,5989,6474,6227,5953,10013,6555,5995,5772,6124,7463,6648,5576,6045,5975,6316,7229,6715,6316,5577,6590,5803,6372,6022,6213,6749,5955,5473,6884,6177,6636,6224,6151,6522,5733,6248,6548,7570,5527,5701,5973,6693,6827,6039,7993,6040,6358,6192,5026,5538,6516,6396,6871,6583,5062,6150,6151,5491,6587,6186,5939,6395,6434,6676,5407,6258,5768,5381,7003,6885,6046,6546,5783,5594,6470,6010,6411,6795,6918,5616,6043,6819,5629,6258,5781,5885,5321,5387,5853,6818,5567,5930,6964,6940,5524,7088,6494,8116,7018,6524,6638,7669,5087,5991,6506,5552,5919,5561,6128,5757,6192,6151,5419,6043,6329,6712,6788,6132,7932,6022,6052,7870,6860,4881,7163,6043,5898,5420,6358,5742,5893,6121,5568,6897,5795,5506,5297,6535,6448,5915,5898,6151,6452,6941,7329,5992,6048,5647,5532,6429,5855,8492,5627,14223,6452,5254,6079,5604,5854,5999,8837,6768,5426,5498,6000,6406,5669,6030,5199,6830,5387,5686,6346,6851,6212,5822,5220,6344,6077,5669,6981,5215,55140,5635,6206,5793,6185,8328,6525,6298,7267,8236,6260,7355,6064,5474,5731,5600,6442,5543,6143,5435,5627,6151,6272,5515,7430,5865,5641,6191,5411,5834,5733,5156,5222,7794,6012,9780,8153,7055,6941,6135,5549,5323,7429,5690,6891,6467,6005,5944,6248,5487,5334,6352,6085,6069,5811,5671,7653,6793,6820,5766,6422,4755,6764,4912,5478,6537,5479,5865,8121,5211,5670,6061,5432,6747,6376,5457,5007,6125,5395,6411,6849,5679,5914,6218,6906,6466,6628,7802,6074,5899,5265,5790,6911,7147,7223,9469,6142,5379,8078,7358,5968,6518,6059,5987,6431,6720,6156,5238,5493,8336,6751,8108,6193,5859,5412,5090,6418,5987,5214,5179,6186,6458,5572,6558,8299,5525,6317,5197,7001,5358,5226,5697,6947,5582,6367,5895,8034,7117,5293,5701,7365,6539,5642,6321,6836,5755,5524,6087,5680,6050,7767,6104,5499,6758,6532,8466,5676,5695,5144,5109,6020,5632,6029,6277,5888,6535,6291,5452,6029,5856,6085,5348,5275,6263,6276,6538,6371,6617,5570,5719,5352,6271,5824,6509,8951,6598,6029,5310,10700,6334,5391,6396,5178,7372,5799,7574,5677,6815,6504,6655,7333,8542,5969,5637,5630,7174,5766,6642,4982,5810,6627,9115,6541,5747,7276,5849,5652,5613,6634,6348,5233,6178,5265,6777,5961,11610,5922,6139,6795,6560,5371,6559,7832,6523,6233,7247,6152,5886,5821,6798,6061,5458,5865,7108,6432,6495,5093,6687,6993,5714,5951,6453,5683,6213,6143,5105,5412,6367,6709,5748,5241,6042,5817,5778,5966,5872,6958,5887,6281,5573,5546,6064,6302,5252,5952,7511,6396,6926,5246,5852,8190,6141,5728,6779,6061,5665,7582,6960,6205,9366,6821,5640,4658,5398,6099,6013,5913,7061,6485,6417,5800,5534,6949,6660,5565,6480,6275,6087,5342,8085,6492,5797,6346,6174,7176,6313,7258,7598,6472,6634,6117,5921,6331,7046,5256,6438,5401,5318,6334,7692,6223,6551,5957,6451,5545,6005,6691,5613,6038,6832,6890,6025,5524,6481,5268,5301,7544,6433,6291,7149,6018,5205,5298,5121,5412,5618,5495,6604,6537,6082,6334,6357,6425,5505,5010,5507,7480,5795,5674,5766,5788,5417,6221,6680,6114,5245,6167,8384,5159,5842,5560,5444,5874,5883,6582,5591,5571,6738,7235,6025,5880,6902,6263,6408,6859,6422,6114,7112,5589,16030,5816,6139,5703,6336,10245,6362,5211,5360,5475,7255,5547,6883,6101,5176,7561,6544,7425,6178,4929,5810,5860,7188,5577,6709,5867,6130,5898,6250,6518,6700,6099,6333,6301,6272,5854,5941,6061,5475,6485,5255,6436,6310,6955,26487,8172,6224,5065,6668,5761,5683,7158,5556,6089,5962,5533,9464,6576,8228,6638,6141,6517,5462,6101,6803,6363,6052,5843,6237,6005,5909,5672,5788,8686,6957,5779,6794,5204,5241,5863,5711,6015,5284,7441,6248,7017,6072,5153,5485,7072,6908,5904,5360,6289,6770,6794,5621,6155,5208,5820,5415,6304,5049,5493,6904,7346,5882,19823,6578,7715,6541,5924,6129,5262,6877,5995,7187,5788,5429,5311,7363,5357,5743,7267,6474,5433,6425,6837,5932,6320,6724,5250,5723,6281,6008,7471,6711,6791,6996,5529,6183,5876,6225,6949,7708,6797,6927,5534,6065,5381,6022,6464,6664,5788,6175,7367,6180,6028,7170,6305,6434,6965,7985,5048,5494,5864,5839,5890,6252,7961,6523,6378,6070,6872,5684,4842,5283,6119,6098,6850,6617,5989,5514,6914,6544,6849,5310,8035,5537,23623,7027,7141,6433,6303,5290,6120,6096,5026,6304,9940,6466,5401,5867,5601,6046,6379,5504,6813,6023,7523,8834,11792,5020,6727,6309,5958,6149,7158,5745,6911,7402,6978,5859,6098,7334,6652,5744,6550,6023,5236,6958,6699,5583,6267,6886,6339,5737,7179,6359,5679,5464,5516,5010,6104,6183,6278,5956,5444,8829,5671,7248,5938,5560,9635,7640,5350,5945,6645,5505,5305,6107,6375,5604,5893,6161,6232,5938,6147,4661,6991,6877,6261,6070,5932,7714,6402,6334,6393,8239,6873,5213,5506,5903,5702,6550,5950,5354,6680,5650,7515,5665,5765,4842,6471,5630,5564,6114,5517,5542,5612,6122,5630,6815,5670,5889,6070,5657,4686,5363,6250,6103,5942,5977,5398,4747,7999,5952,11002,7053,5365,5370,5297,6517,5796,5142,6195,6687,6452,5824,6402,6225,7551,5640,10409,6131,5647,6011,6593,5129,6275,6274,7799,7544,7182,5440,6107,6847,12943,6142,6459,5455,5916,6257,7306,5076,8304,7756,6487,5955,7934,6755,7003,6345,5244,5902,6429,5478,6446,5475,6938,7125,5597,6043,5322,7348,5861,4807,5861,6343,5442,6154,6652,5383,5657,6467,4920,5205,5532,5857,5919,6292,7067,5399,9986,5341,6837,5872,6363,5553,5848,6008,5897,6088,6249,5728,7149,6529,6034,5457,5801,6686,7915,8068,6825,6059,4844,6547,5295,6809,6412,5636,7633,8937,5020,5059,6264,5936,6122,5388,5145,6589,5412,8199,6975,6981,6547,5766,6933,6199,5665,6475,5032,6887,5414,6325,6624,5580,7016,6049,6166,6387,6602,4719,5868,6141,6717,7157,5874,6433,5218,6038,5708,7055,8210,7052,7473,6648,6201,5703,6415,7839,6189,6350,6127,6803,5474,5491,5393,5095,5728,5542,5221,7164,6300,6208,5122,7723,6001,5892,5725,6178,5359,7371,6324,6492,5838,5733,7771,5814,7257,5233,6096,6926,11042,15453,7838,7101,6728,7111,6620,5656,5314,6473,6227,6161,5881,6144,7555,5606,6277,5476,5849,6394,5227,6187,6012,5282,5692,5791,6057,6491,7588,5759,6527,6793,5831,6653,5685,7523,5819,6172,6516,7791,5709,5995,6045,6797,579818,6922,5820,7068,6866,6855,6103,6266,5643,6619,6043,5939,8276,5671,5938,5662,5983,5888,5794,6184,7618,6474,6063,5472,6962,7020,7455,5598,5764,6760,5945,6199,6021,5768,6581,6473,6841,5736,6156,6158,5723,7293,6765,5476,5619,7159,9915,7095,7243,5107,6910,6026,5987,6745,7260,7751,4862,5431,8624,5321,6575,5409,5639,5394,5538,6601,7013,6325,6309,6474,5508,6427,5301,6192,6201,6791,5841,5548,7641,6626,6838,4926,7215,8990,5314,5562,6858,6203,6969,5491,7285,6733,8174,6382,5850,7584,6010,5847,6586,6038,6222,5065,5230,6301,5106,5218,5880,7089,6472,5531,6465,6337,5771,6172,7239,6514,5613,6460,6817,5932,7334,4821,7462,6212,7188,6105,5058,5428,7422,5553,13227,6552,6645,5581,5641,6417,5929,7383,5841,7038,5927,5621,6033,6009,6572,6447,5829,6419,5534,6669,8610,6648,5505,6689,5937,6006,6098,6221,5995,7099,7418,6161,6169,7199,6218,5693,6244,5424,4976,6210,6242,5493,5705,6893,6521,5624,6352,4967,5644,6622,6089,5724,6254,5624,6200,6270,5055,6117,7245,6153,6032,6146,5914,5286,6516,7492,5303,12944,6162,11228,6012,6243,7116,5649,7304,6493,5796,5966,5725,5415,5520,6336,6155,5281,5576,5937,6665,5643,7335,5214,5815,5463,6858,7733,5557,8240,7488,6050,6599,6351,6151,6817,6179,5877,5592,6171,6083,7868,5075,7402,5708,6081,8770,5690,5839,5429,6123,5316,6080,5928,5551,5029,6867,6700,6197,6489,5815,6724,5922,5355,6054,8412,5235,5228,8308,6092,9048,6580,5454,6198,6482,7613,8812,10221,6133,5707,5698,6390,4666,5300,5736,6116,6751,6252,4817,5620,5972,5053,5831,5919,5784,5939,6188,25718,5684,6056,7409,7110,6078,5490,5323,7785,6675,6289,6633,5978,5578,6676,6857,6883,6231,5104,5651,6083,5650,6855,5867,5099,6073,6234,8923,5269,7913,6605,6257,5932,6528,5846,5359,6854,6287,6529,4876,5731,6697,7279,6300,6095,7026,5092,7381,6282,5217,6161,6329,5659,5466,6472,4966,6238,5972,6023,5012,6167,6417,5338,7319,6363,6656,6102,5699,6964,6077,5439,7234,14812,5436,6580,5676,6586,7366,5569,5742,6678,6222,5641,6079,5023,7559,5496,5661,6154,5906,6704,6491,4628,5933,5881,6080,7986,5648,6241,5775,6451,6290,5544,6669,7071,5617,6093,5295,6126,5761,5864,5670,6028,5314,5346,4947,7589,5871,6062,5726,6157,8068,5466,5643,6369,6289,5972,5790,5766,5962,6153,7801,6295,6065,6842,5870,8095,6475,6380,26517,6239,6572,5708,5409,5772,5838,6948,7082,7233,5890,5503,6218,5457,6084,5044,6110,5586,6776,6788,5884,6672,5780,6868,5800,6384,5868,5690,7087,5897,6443,5505,6715,6238,9129,6876,8345,5950,6146,7335,5710,6154,6303,5921,5799,6353,6444,6141,6200,5574,6085,6865,5780,6852,6826,7096,7114,6877,5888,5751,5306,6188,6004,6937,6249,6715,7160,6653,6095,6174,6594,6469,5523,5289,5726,6263,5339,6388,7090,5438,6712,5857,5592,5365,6199,5333,6978,5980,8163,6802,8687,8392,5458,5902,5390,5705,5667,7009,5599,5489,5888,6218,5754,6208,6166,5834,6505,7835,6739,7606,7391,6217,7996,5937,5888,8299,6195,5895,6790,5860,5464,6258,5323,6575,7656,5457,6024,6267,5795,6251,6228,6223,6175,5687,5126,6918,6477,5026,6890,6532,6499,8282,9884,5022,5086,6254,5495,5162,5872,10016,6809,5615,5395,6014,5882,7651,5506,6652,6742,6293,8715,8398,7427,5824,6193,5788,6644,6383,6418,7395,5499,6088,5316,5785,7360,5388,9861,5688,7545,6507,5122,6502,5594,10037,7153,7482,5590,7860,6564,6772,7739,6752,7228,6537,6154,6462,6675,4758,6884,8889,5564,6362,6677,5372,6758,7195,6496,5791,6095,5626,5706,6250,5436,6929,6707,5925,6310,9982,5966,6040,6288,6174,4724,5568,6124,5891,5504,6418,5478,6604,6385,6809,7679,5414,6026,7069,7270,4955,6517,6839,7011,5271,8314,5317,5717,8400,6092,6119,6028,5934,5302,5016,4758,6729,5188,5536,5339,5854,7098,5678,6535,5614,5919,5754,6183,6063,8740,23323,5423,5901,5941,5953,6906,6463,5926,5305,5412,5663,7127,4585]},{"counters":[6712,5562,6287,7483,5568,5289,5438,6077,5779,6465,5354,6411,6196,5706,5540,5223,6497,6767,6284,6750,5907,6457,5468,7395,5422,6911,5258,6026,5512,6688,6012,6177,7522,6823,5696,6330,5854,7054,5542,6765,5946,6093,7258,7162,6374,6006,5801,5636,6011,6443,6043,6418,6118,6148,6064,6316,5966,6800,6091,6424,5422,5805,6786,5437,7607,5345,5717,7736,6881,5784,5081,13655,4963,5488,6578,6982,6510,8865,7681,6843,6218,6126,5768,5063,5760,5485,6387,5192,5161,6190,7839,24029,6924,6072,5762,4963,5675,5871,6514,6143,5549,6391,5103,5050,6116,7168,5644,5318,7879,6207,6261,5400,6783,5939,51781,6775,6077,5942,5258,4845,5397,5900,6260,8555,6749,6327,6329,5400,6089,6066,6075,5915,5401,8043,6147,6117,6602,7663,6011,5561,7241,6252,5438,6295,5394,7013,6047,5503,6587,5958,6705,6377,6437,6750,7193,5902,5728,5896,6567,6534,5943,6051,8325,6554,8689,6367,5174,5655,5419,7466,5640,5813,5973,5167,6635,8686,6489,5629,6501,11122,7003,5890,6247,6300,6028,5438,5407,7299,6135,6378,6903,6552,5978,6533,7786,7138,6719,7320,5796,6548,6668,5415,5698,5904,5416,5507,6400,5743,6076,6270,7241,5821,5357,6711,6910,6559,5640,6259,5231,6797,6227,6199,5956,5777,6642,6687,5612,6885,5939,6340,6147,5829,6925,6815,5993,6705,9910,6366,5670,6631,5196,6235,8931,7460,6381,5757,5710,5334,6169,6333,4949,6910,5772,6131,5006,5672,6200,6752,6200,5954,5085,5804,6521,6148,6316,5780,5933,5768,5112,5301,6083,6136,5397,6875,5701,5360,7007,5706,6788,6978,6296,6003,5595,6029,5574,6132,10597,6836,14520,6053,5858,7086,6141,6144,6359,6416,5838,5810,5795,6106,6916,7007,5521,5970,7185,6658,6578,7227,6194,7588,6682,5965,5793,6925,6157,5375,6541,7447,5938,6686,6601,5584,4853,5921,5829,6394,6292,6493,6002,6304,5243,6023,5812,6344,6335,6324,5872,5441,6475,5518,8654,5779,6968,7751,6566,6355,7375,7196,6408,6518,5750,5611,7153,6334,5384,6079,5527,5544,9855,5829,6220,5490,6246,5505,5252,6808,7845,5864,6128,5856,9093,5318,5239,5273,7279,4712,8952,6038,6844,5466,6309,5313,5867,6271,5024,5449,6452,6865,6518,4945,6267,5737,6332,5509,7396,5799,7553,7247,7174,8087,6006,6027,6366,5325,6045,6150,7139,13652,6833,5453,5756,7340,6396,5995,5503,5832,5109,6588,6955,6334,4982,5458,9095,5029,8216,6002,6939,6218,26124,4975,5270,7138,5767,6295,7048,5637,7230,6488,8088,5621,5770,5918,6220,6394,7071,6550,5601,4597,7367,5793,12915,7366,5407,5814,7700,5555,6567,5747,6758,7250,5962,5535,7836,6613,7059,6549,6134,26382,6440,5566,5308,6832,5510,6924,5808,7614,6455,5628,5366,6666,6291,6924,5730,5645,5406,5648,6530,6144,6437,6413,5560,6604,5598,6409,5915,5737,6144,5470,12376,6199,6828,9096,5291,6353,6895,5371,5356,5635,5504,5620,5859,5522,19108,6174,5722,6636,6136,5610,6261,5176,6562,5375,5402,5764,5456,5257,4338,5406,5201,5484,9776,6712,6554,5858,6345,5148,5778,5696,6112,5104,6384,7727,5770,6583,6142,5528,6466,6028,6551,6252,5550,5911,5538,6368,5770,5571,8863,5892,6433,9653,7247,5923,6153,8124,7965,5723,5787,6778,6834,5766,5914,5544,6363,6720,5830,5427,9311,6389,5919,5319,5790,6358,6998,5418,6255,5560,6858,5051,6899,6365,5692,7052,5218,5855,6454,7943,9293,5217,6327,5504,8736,6539,5303,5313,6475,9074,5906,7336,6698,6179,5736,6218,7247,5766,6994,7057,5739,6632,6171,5366,5604,6407,6384,6119,5614,6030,5921,5963,5957,6578,7956,6552,6291,5999,7756,6225,5820,6910,5924,5440,6250,5906,6700,5700,6359,5837,5434,6384,6846,5602,5314,6683,6055,7454,6314,5468,6244,5738,5130,5349,56373,5498,5837,6600,5348,6498,5817,6462,6514,5528,6446,5485,6499,5867,7621,6310,5763,5654,5888,5938,6341,5894,5031,6847,6630,6150,6606,5518,6155,6816,5784,7995,5762,6234,5234,6144,5276,5305,6233,5539,6873,6071,5566,6982,6453,5883,6584,6030,6119,8723,11566,4754,6043,7118,5479,7555,7082,6196,6254,5155,5129,5736,5201,6945,6650,6119,5764,6814,5750,8926,7911,6029,5775,6306,5401,5779,6593,7871,6536,5743,6369,6567,6230,7544,5963,6671,5676,5514,579190,5031,7132,6215,6256,5476,7445,6456,6381,6514,5559,6021,6208,6199,6929,7382,6543,5896,5598,5845,6435,5598,6232,5394,5870,5636,6627,6808,6960,5950,5760,5726,6121,5598,6270,6738,6514,5473,6139,5254,5203,5960,6014,5221,7767,5725,5971,6810,6575,7683,7914,6155,6326,6204,7511,7581,6481,6010,6260,8019,5852,6738,6024,5604,6220,6216,5187,9511,5378,12377,5755,5914,5838,6272,6380,5968,6159,6272,6270,5921,5096,6262,6067,6700,5516,5923,5546,5545,6184,8313,7370,7665,6169,7442,6105,22981,6557,5653,5616,5717,6354,6052,6178,6696,6840,5831,6074,5227,8031,9050,6149,5862,7481,5616,6653,5097,6208,5969,6314,5892,5670,4922,6173,5253,7203,6315,7456,6342,6567,6931,5442,10397,7075,6318,6151,6123,5576,6448,7488,5795,6326,5778,5593,5511,5996,12087,4735,5658,5640,6913,5677,6876,5535,6028,6320,5850,6196,5066,6215,5806,6086,5807,5456,6138,6036,5678,6254,5712,6360,5862,6309,5872,7745,5595,6120,6505,6155,5912,4970,5066,5566,5940,6857,6428,5913,9455,5998,6465,6305,6583,5880,6029,5415,6483,6128,5738,6778,6172,5484,5682,6502,5679,6960,6050,7945,6625,6323,6318,6133,5772,5680,6563,5594,6442,5978,5057,5688,5667,5959,6233,6121,5981,8191,6261,10857,5212,5729,6551,5219,7054,5489,5845,8263,6616,5589,8262,6330,5747,6045,5316,5994,5764,8147,5585,6143,6164,5262,5792,6328,5672,6948,5619,5180,6369,6172,6812,5865,7310,7084,6452,5669,5966,5181,6018,6047,5426,6960,5836,6821,6103,6169,5778,6461,6328,5419,5732,6027,5467,5799,5947,6258,5950,9492,6014,7278,5258,5922,6123,4662,7486,6289,5193,5288,6537,6682,5761,5558,6060,6409,7192,5986,6165,5885,6287,6670,4686,14579,5705,7136,6044,5730,7261,5606,5519,5114,5664,6039,6330,5483,5644,5083,6217,6066,6152,5719,5933,6198,5411,5887,7413,8122,5363,5436,7064,6276,5929,4969,6492,7341,5689,6460,5240,5394,6816,6285,6198,5840,5980,5643,5624,7405,5588,5150,5803,6006,8985,7699,6876,5768,6365,5988,5409,5689,6221,6230,5521,5786,5894,6710,4981,5996,5249,5791,7280,6392,7857,8512,6261,6087,6378,5357,6230,7500,6016,5338,5803,6166,8053,5965,7598,5981,5894,5861,5709,5367,6486,8316,5804,6066,6414,7676,5875,5760,5815,6343,5885,9476,5445,7147,7060,6276,7149,6042,5755,6029,5435,5328,6439,5765,5544,5910,6925,7794,5885,6140,6347,5807,5447,6659,5893,6127,6572,6731,6390,5275,5516,5361,6277,6581,5132,5155,6966,5328,8695,6054,7890,5915,6444,6770,6511,6933,7792,6164,7706,5696,6188,5564,5539,6090,5659,5893,5605,5950,6534,5653,6157,7776,5023,6324,5379,7096,7288,7505,6861,6105,6208,7494,6223,6417,6160,6831,5436,7732,7575,6724,6347,5878,4759,5775,6212,8607,5111,7829,6178,5516,5617,6207,6430,5956,5208,6066,6820,12168,7214,6157,5996,6686,6549,5679,7746,6438,5188,6143,5678,5207,5639,5569,7064,5870,6707,5662,6402,5779,5314,5311,5327,7208,5845,5605,7812,7962,6625,5684,5859,6413,4976,4846,6450,6357,5587,6628,6284,7758,5918,5900,6803,6885,6296,9248,5490,5829,6005,7152,10373,6243,6665,6502,8747,5795,6203,5622,5830,5952,5781,7840,5352,6352,6432,6514,9801,6014,5869,5902,5268,6966,10464,6257,6871,7589,5558,5549,5520,5860,5296,6897,6516,6189,5810,6631,5970,5478,6190,6098,5157,5842,6738,6518,5800,6557,6882,5067,5767,5706,5795,6547,4796,5243,6930,5719,5987,6713,5910,5378,6450,7260,5191,5946,5412,6490,6510,8113,5942,5333,7060,6292,7171,8349,6917,6061,5496,5047,6396,8127,5703,5563,7321,5575,5597,6294,5652,6628,6298,5518,5787,6203,6973,6460,7519,5835,5651,5119,5837,5891,6996,6478,7525,6476,6049,6783,6654,6070,6827,6618,5345,5539,6307,5054,5842,5370,6016,5826,6067,6561,5402,7449,6847,6719,6041,6121,6191,6844,6843,5351,7026,6610,6520,6028,6215,6414,7093,5752,6287,4861,7119,6602,6020,6904,6074,5718,7879,5870,8526,7470,5992,4364,6523,7692,6442,7385,5949,5590,7133,6320,5654,6130,5499,6976,6184,5676,7310,6152,4554,5710,5607,6747,5780,5750,5709,6705,7107,6300,5655,5786,5915,6281,7315,4763,5656,5696,7269,5688,5844,5731,4825,6127,6346,5705,5371,5749,7622,6217,6982,5631,5696,6171,5372,5326,8120,6851,7929,6212,7727,7163,5823,6619,6400,6065,9007,5755,6296,6087,6942,5998,5699,7372,5470,6261,5852,5425,7109,4887,6555,7127,5983,5743,5841,5975,5918,5413,5874,5239,7125,6947,6271,5714,7344,5848,7675,7915,5021,5876,5174,6097,6613,5838,5351,6827,5528,6770,7134,6889,6106,5557,6039,6949,6008,5535,6704,9317,6178,5698,25373,6482,6690,5120,5647,6005,5696,5843,7374,5378,5805,6168,5555,6016,6547,6938,6594,5462,6353,5698,5594,6605,6449,5315,5600,5049,5730,6689,9143,7100,5358,6538,6408,5472,6205,6374,5003,5281,6299,5305,6540,5011,5802,5830,6516,5236,5997,5759,6711,6828,11839,6271,6028,5193,6368,7617,6739,6617,5589,5519,5877,6297,6481,5628,7570,6236,6343,5467,6818,5839,5919,5888,5443,6256,5645,6317,6383,6362,6159,6554,5768,5338,6770,6947,7207,5428,6624,6182,6026,5868,6288,7295,5724,6630,5491,6274,6676,6298,6905,5488,6148,10506,5293,5081,7101,6581,6352,6871,5916,5599,6433,6662,5719,6481,5793,5798,5861,6212,4748,5340,5865,5430,6633,6483,6445,6728,5333,7261,6931,6046,6286,6394,5365,5771,6864,5611,5415,5421,6060,5683,4981,7784,5062,5314,5257,6805,5428,5422,5402,6681,5991,6069,5358,6230,5481,6408,6037,5927,5757,6046,5877,6185,5738,7129,6469,6634,6221,6138,7198,6429,5605,5773,6657,6460,5839,6296,6534,5545,5794,6783,7216,5477,6064,6381,4999,7003,7256,6500,5914,5593,4963,6535,5332,8260,5863,7122,6267,4927,5716,5687,6417,6396,6398,6299,5696,5725,5445,7578,5986,6526,5602,7009,6037,6716,5065,6387,7082,6143,5699,5301,7404,6353,6015,6900,5720,6329,6527,5530,5963,5274,6243,5598,5796,6534,6165,6249,7050,5680,6029,6149,7138,7082,6628,5793,5973,7901,7900,4978,5863,8174,5689,5544,6707,5519,6105,7335,10543,6542,6530,5795,7638,5502,8473,5991,5588,5329,5361,7101,6522,6445,5118,6392,7466,6421,5527,6839,9034,6710,8333,5881,5956,6380,5358,5126,5339,7381,6072,7682,6093,4811,6182,6405,6282,6105,7325,6369,6577,5476,6937,7166,7964,7482,5959,5468,7189,6127,7387,7421,6537,6815,6221,6368,6552,5459,5743,5690,5897,6474,7055,6489,7603,5997,5896,6843,7206,4526,5286,6106,7401,5455,6115,5537,7136,6050,5642,6226,5321,7040,5661,6104,15835,6133,5503,6500,5617,5797,5222,6266,7115,6361,6160,6514,7450,6258,6765,5702,6187,5651,5518,7490,6656,6082,5454,6093,6926,6294,6991,8095,6309,6972,5747,5801,5995,6074,5275,6399,6428,6029,5490,6444,5504,6729,6108,8449,5793,6179,6691,6591,6864,5645,6947,5291,6063,5664,7025,7572,4961,5404,6114,6347,5817,5082,6560,5574,4772,5503,7352,6266,6219,6831,5749,5376,5563,6161,6700,8345,5589,5008,6742,9755,6229,6401,7009,4854,7900,6214,6234,5584,7351,6234,5904,6069,5680,6039,5673,6006,6256,6207,7788,7354,7543,6683,7442,5637,6602,5758,5909,5922,7188,6370,6201,7418,6062,6225,6046,5538,8206,6668,5961,6071,5707,8066,7459,4774,7177,5115,5743,7064,7709,6324,5712,5310,5897,6048,6594,5410,6565,6046,6191]},{"counters":[5796,5350,5919,6374,7106,7357,6459,5665,5561,5300,6845,6021,5279,5606,6763,6273,5812,5767,5653,5428,7446,5271,6298,5920,6203,8506,5935,6663,5655,5594,5076,7801,7191,6192,6742,5851,5936,5990,5757,6643,5679,7343,9575,5773,6720,5654,6341,6579,5191,5528,5916,5762,7097,7269,6829,5793,6017,5590,8281,5338,7055,6373,6609,6096,6482,5424,6009,6489,7248,6439,5326,7217,5765,7925,7255,6057,6491,7240,5483,5975,6823,6190,6561,8462,7932,5278,5636,5833,6103,5826,6241,6880,6355,8344,5556,5459,8011,5069,5682,6303,5116,25895,5974,5755,5771,5600,5264,5727,5227,5493,7394,5047,6627,6451,5242,6502,6481,6731,7052,5929,6233,6849,7039,5848,51044,6350,6066,5722,19543,8414,6309,6599,6647,5508,5512,5874,6906,6208,6454,5528,5762,6463,6615,7042,7242,5508,6554,5625,5971,5907,5929,7124,5717,6173,6318,5591,5759,5748,6044,6120,579598,6324,6375,5985,6236,9093,5704,5321,6210,6382,6323,6870,5555,6027,6591,6261,7062,6769,6637,9076,7195,8041,6359,5738,8020,5292,5587,6250,5228,5261,5975,5957,5552,5943,7206,6845,5834,5805,6245,6047,7697,5364,6508,7529,7756,5959,6327,6568,5878,6472,5825,6749,6119,6989,5770,6454,6323,6303,6058,5331,8509,5312,7221,7156,6291,5753,6936,6049,6303,6149,5154,7480,7658,6577,5606,5176,6280,5448,5891,5571,5605,5342,6381,7763,6085,5849,7573,6654,5220,5256,5872,5642,6533,5933,7235,6154,5683,5906,6728,7043,5519,5670,6531,5897,6491,5724,8668,6254,6213,5986,7006,5873,6532,6292,8255,6230,7055,6655,6304,7191,4847,5937,5539,5852,5459,7204,6124,5266,7147,5524,8551,7311,6587,6444,7744,6350,5792,9392,5883,5273,7218,5433,6627,6450,6555,6296,6358,5553,6571,6185,5541,5900,6955,5930,5683,5488,7582,5255,5153,8140,6377,6350,5997,7006,6328,5888,6613,6423,5967,5137,5221,7247,5459,5386,6027,9472,5117,6047,5853,6648,6706,6258,5631,6076,6409,12048,5305,8192,5978,5877,6173,5569,6601,5958,9329,9377,5887,5674,6646,5871,5847,5619,7483,5690,8230,6766,6084,5613,5997,6062,6483,8141,7882,5901,6615,6781,5993,5590,5406,5725,5627,4992,6246,5998,6548,6533,5447,6553,5638,5881,6657,6401,6057,9295,8899,8188,6143,5746,6418,7074,5885,6257,6838,5626,7393,6386,5750,14074,5723,6452,5554,5640,5248,5132,7578,6323,6064,5638,5836,6427,5674,6814,6534,6155,6959,5872,5848,5970,5898,5731,5894,5824,5958,6292,5816,6686,7747,5617,6959,5522,7712,5919,6591,6364,5693,5720,6513,5927,6802,7528,6035,6628,6654,5885,6161,5653,7025,7033,5557,5405,8126,5669,5641,6334,5939,5962,5159,6612,6094,6862,6194,6116,6271,6454,6166,7294,6582,6533,6793,6086,8888,6702,5824,5527,5991,5566,5521,5816,6766,6056,6251,6272,5780,5565,5771,5827,6252,8788,5655,6636,5584,7199,7071,6229,7039,7050,5378,6223,5643,5290,5514,6314,6198,5816,7396,6798,6232,6434,5861,6019,5999,6516,6339,6826,5880,6479,4961,5311,6483,5593,5457,6749,5333,6117,5717,5766,5931,5707,6908,5830,6549,8006,5149,5318,6740,6750,5811,5259,5243,5362,5544,4809,6122,5186,5789,6342,6519,6247,6224,6487,5351,5608,5727,5761,5991,6093,7155,6614,5291,5819,5807,5814,6265,5269,5537,6088,9917,9119,6433,6446,6830,5642,6025,6550,5823,6502,5691,6876,6006,6787,7123,5831,5887,6048,6177,4777,6251,5057,7203,5884,8298,7110,6783,6005,6427,7068,6488,6223,6848,6184,5339,6890,5954,6321,5557,5292,5215,5289,6089,5937,6008,6117,5559,6327,6029,5567,9446,6023,7025,7117,5570,5407,5643,6604,6536,5708,7300,6555,5943,6634,4742,6710,6126,5380,7431,5850,5699,5992,6839,5893,6694,6450,6006,6845,5075,6156,6055,6076,5857,7415,6019,6220,6833,5989,6849,7027,6470,6489,5505,4929,5763,6747,5313,5748,13759,6016,5964,6170,6855,5669,5411,5512,5743,6533,5407,6680,5738,6886,5169,5462,7714,5278,7982,7222,5738,6333,7025,5672,5351,5819,6845,5628,5628,6509,6314,6029,6378,5724,5637,4856,5776,6620,5913,4650,6786,7340,6175,6303,6087,5239,7625,5088,6567,6416,6005,6031,6609,5980,7592,6321,5498,5405,6085,5723,6474,5720,5503,6457,5284,8176,5060,5079,5506,6380,7308,8192,6790,7046,6044,7153,6291,6026,6558,6801,5824,7188,6443,9039,6859,6289,5658,6159,8358,7311,5495,6600,6233,5807,4611,6029,5704,5496,5909,5558,5301,5941,5521,5290,8011,7552,6433,5301,6458,5853,5634,6577,12697,6282,6293,5432,5445,6851,5708,7053,5497,7092,5740,7060,5971,6278,7180,6808,5886,9593,9494,5013,6373,6116,6377,7294,5603,6883,6374,7400,5363,5852,6580,5812,6394,6105,5134,5568,7882,6928,6586,7476,6726,6322,7535,5839,6903,5556,6948,7006,5889,6586,6377,7237,7201,7548,5924,6300,6520,5709,6226,5827,8329,5700,6808,5674,5861,6627,7550,6714,5395,6110,8124,5766,6206,7093,6424,5511,5845,6436,5408,6336,6302,9089,5430,8901,6544,5899,6310,6487,6134,6196,6646,5895,5945,5569,5412,5923,6237,7221,5690,5410,6950,6942,5413,6086,5613,5805,6019,6329,6493,6437,5627,5804,5608,6256,6814,6123,5524,6345,5616,5577,5872,5719,6309,6536,6360,5799,5995,5698,6877,7200,6846,5853,6592,5626,7182,6254,6232,6857,6028,6296,6675,6370,6018,6486,55673,7834,5097,6544,5406,6240,5502,5889,6052,5525,4988,5939,7253,6247,5973,5054,6491,5067,5969,7291,5160,5698,5977,5712,5715,7783,6631,6431,5287,5378,6028,5580,6432,6539,7912,6112,8296,6797,6775,6165,6626,5518,6156,8099,7036,7337,5615,5816,6915,6652,6792,15367,6455,6981,6624,7218,6813,5885,6349,6780,6004,5573,6606,6748,5417,6542,5916,6528,5299,6536,5842,5948,6895,5811,6423,7091,5264,5066,5673,5829,6131,5361,5928,9029,5654,9053,5438,6702,5628,12337,5478,6143,6450,6744,5752,6532,6495,5908,5930,5847,5360,5293,6296,6866,6646,5144,6103,6468,5963,7449,5763,10090,7248,5727,9329,5752,6200,6614,5608,5062,8269,5645,6324,5064,6097,6741,6987,6975,5979,5724,6204,6693,5330,6862,5846,6599,5486,5879,6545,5527,5889,6136,5520,6327,6642,6150,6576,6249,4899,6516,5847,6992,5795,4874,5815,7516,5921,7536,5962,6549,9835,5360,6260,5700,7126,6451,6028,5942,6057,5745,5023,7378,4847,6050,5987,6627,6726,5542,5101,5192,6824,6416,7319,6644,6713,6892,5613,5840,5839,6312,5244,7009,6338,5176,8371,6751,5549,5888,7261,6365,5466,6662,5472,6818,6286,6809,6781,5578,6391,6996,6227,7546,6868,5926,5129,6304,6783,5746,8062,6727,5987,7368,5395,5709,5376,6084,5608,6200,5349,7760,6784,5737,5659,5239,5803,7510,5853,7891,5870,7033,5517,5157,6061,7786,5533,6219,6355,6150,6566,7384,5317,7300,5274,5614,5222,6163,5956,6846,6930,6862,6014,6307,6432,5725,5304,6126,6384,5544,10036,6277,5142,5779,6150,5392,5817,7206,5214,6247,6259,6828,5808,6462,5536,7432,6534,5925,5119,6509,5706,6126,5415,6414,6544,5132,6524,5948,6385,5218,9809,4849,6509,5395,6327,7086,7283,6144,5530,5507,11377,6564,6535,5939,6300,5316,5961,6624,9157,5362,4822,6649,7617,7470,23326,5793,6179,5436,6700,6977,6158,5464,7897,6110,6933,5487,5457,6037,6848,5469,4981,5985,5960,6600,4788,7035,7015,26847,6789,6968,5447,6413,6200,7214,5772,6346,13071,7652,5594,7652,7068,5594,5647,6322,5584,5353,7431,4990,6159,5435,6280,5565,6246,6356,6104,5907,5675,6505,5676,5319,6238,6000,7135,5963,5538,6961,6051,5244,5227,5221,6380,6122,5650,6617,6033,4842,5755,5955,5876,9281,5210,5908,5829,14456,5329,6416,6377,5519,5314,6711,5714,6481,7228,7471,5914,6840,5123,5362,7758,6138,5316,5917,6378,5968,5548,6774,6905,5873,6654,6049,6072,5476,5720,7408,5385,5678,16618,6171,5867,6474,5858,5922,25370,6766,5799,6390,6739,6693,6351,5115,6011,6295,5005,7108,6456,5067,10275,5201,6563,6358,5547,6333,5791,5996,6696,5590,7159,10276,5374,6058,5514,6099,5926,6468,5205,5449,7950,5783,7792,5359,5693,5977,5890,7225,5702,5529,6474,6133,5244,6093,5582,5054,5858,6266,5896,11331,5709,5187,5335,5351,8472,5270,5962,6363,6039,7503,5868,6611,5710,5762,6972,6426,6540,5923,5346,5646,5452,6779,5805,6228,5612,7117,6549,7092,5915,5346,5850,5836,6025,6052,6180,6682,5565,6672,6472,6095,6251,7557,6753,6630,5871,6047,7537,5656,5655,5985,6206,5192,4773,6948,7261,5994,4940,7487,13897,7345,6868,6872,5513,6332,5887,6078,6101,5619,5756,5995,5870,7271,6581,5895,5992,5705,6689,5433,6652,6606,5437,5404,5321,6130,5272,6575,6347,5344,6570,6762,6718,6087,6452,5765,5946,7326,5946,5492,4930,6452,5952,6098,6575,6060,5694,5559,6312,7443,6820,6884,6237,6762,7353,6333,8383,8601,5897,6063,5709,6874,6057,5536,5455,6296,6244,5358,6821,6644,5109,5289,5772,8095,7682,6053,6777,5803,6628,5507,4997,6720,4965,6633,6275,5363,5955,5790,5761,7566,5495,5750,6899,6061,4913,6560,8293,6101,6691,5768,5625,4811,7393,5271,7230,5601,5659,7014,5643,5560,5880,6370,6459,5743,5667,5721,5166,6170,5643,5742,7229,5379,6483,7009,7646,5733,6023,9382,5672,5661,5387,5950,7041,5509,4414,5417,6051,6206,5631,6628,7651,5651,6997,6061,6394,6043,5317,6499,6343,6915,5048,5591,6575,6865,6815,6274,5331,5501,8720,6756,5738,5305,5879,8460,5906,5558,6563,6163,7067,5484,5847,6053,5728,6108,6572,5625,5527,4979,6140,5494,6020,6291,7229,6638,7110,4856,8179,7360,5158,6439,6022,5940,6515,6105,7195,6134,5592,5915,5349,6572,5565,6165,5428,5991,6109,7022,5094,6300,7600,6097,5860,5314,5550,6510,6491,6319,6561,23934,6329,5782,5893,7439,7836,6571,6045,6080,6234,6096,5966,6428,5536,6028,5755,6177,5438,6703,5316,6637,5712,5293,5981,5857,6545,5703,5512,5420,5846,6982,6644,5435,5775,5809,5869,6753,6872,6790,6584,5593,6282,5853,5116,6292,5049,5864,5672,6101,6735,5920,6487,6043,6514,6981,6528,7207,7007,5952,6027,5450,5385,7258,5846,6410,5467,6788,4466,5888,6100,8102,6220,5820,7904,6455,6550,5508,6459,6234,8430,7081,8952,5248,7026,5285,5922,6335,8093,6029,4541,5901,7658,6149,5594,6127,6996,5340,5730,5664,6080,6553,5568,6643,5200,6180,5805,7080,6352,5684,5485,5316,5948,5660,7064,6628,5348,6262,7611,5969,6984,6885,6132,5598,6067,6963,5605,5741,5147,6335,5541,13148,6308,6073,5004,5475,7437,6004,8679,5363,7536,5875,11218,6081,5598,5482,6027,5628,9414,7984,5406,5851,8159,5050,5766,6935,4965,6453,7487,6399,5567,6282,7592,7629,7425,5514,6550,6666,5815,5978,6260,4924,6001,6169,5471,6400,4981,6028,6254,7188,6990,5762,7844,6095,6019,5243,5765,5222,5887,6537,7020,5526,6065,6649,4630,6461,5649,5248,6306,5477,6455,6533,6146,5844,5425,6157,5949,5526,8244,6509,5932,8324,6442,5164,5452,6505,4941,6466,6375,6070,6174,5977,5986,6642,6914,6422,7012,6240,7173,6269,5370,6299,6758,6158,6286,4823,5530,14361,5632,6859,10971,5580,5899,6578,6057,5168,4695,5306,4578,6572,5689,5894,5555,6114,5780,5792,9436,5444,6136,5646,6377,5286,5270,5572,5530,6084,7007,5533,5800,6848,6086,6030,6007,5547,6238,5696,6728,7109,5923,7129,5917,5751,5610,5868,5274,5709,6074,5728,6408,5936,5771,6837,6425,6279,5800,5694,7101,8421,6119,6782,6017,6713,6497,5678,5014,5710,7376,6455,5808,6204,6552,6164,6283,5078,5861,5518,5244,6499,6280,4753,6148,6094,7226,5680,5877,4518,6678,6755,8458,6039,5666,6339,7441,6593,7052,8094,5475,5861,5408,6075,6072,5889,5896,6174,5442,8018,6190,5815,5290,6257]},{"counters":[5433,6698,5491,6907,5355,5674,5947,5768,6459,6326,7688,5462,5761,5638,5479,6028,6515,7510,6800,5157,4859,7008,5658,5668,7093,6433,6304,5144,5245,6726,5104,6306,5434,6065,6137,5711,5543,5799,6187,6756,6981,9292,6424,5484,6361,5752,6976,6980,6420,6468,5994,5552,5312,14903,6322,5921,5780,5367,5864,5669,5675,5573,6072,5461,5524,6030,5770,5875,5214,7116,5812,5799,6240,6197,24562,5801,6776,7467,7773,5953,6527,5890,6190,6309,6070,7909,5962,8208,7039,7547,6737,6155,5486,6951,6116,6818,5889,6849,6014,5892,5166,5828,7371,6371,6481,6928,5644,5623,8234,8099,6409,6063,6428,5495,6035,6564,4871,4808,6380,6534,5861,10727,6790,5206,5874,7652,5732,5696,6702,7049,4852,5892,5778,5492,50061,5379,5632,5703,6405,5974,6124,6678,10101,6172,7758,5817,6171,5400,5294,5602,5521,5940,5880,6189,7225,7809,5665,6341,5593,6009,5648,6283,6180,5277,6493,5905,4998,6052,4813,5784,6544,5719,10012,7069,5390,6439,6474,7268,7387,5264,4939,5756,6103,5814,7455,5811,5371,5669,5196,6147,5589,6837,5894,5993,5844,5455,6007,5752,6089,5623,5954,5864,6512,5984,6967,6477,6187,5754,5791,5267,4920,7149,5574,5498,5395,5269,6302,5298,5227,6834,6046,6453,7313,5333,7079,6116,6046,6818,7130,6416,4973,5574,5530,6208,7964,5595,6135,7914,6388,6718,6652,5779,5725,6655,6468,6598,5960,6365,5710,7955,5847,6173,5527,5847,7015,6916,5614,6314,5700,5564,4978,6358,6231,6070,5998,6458,5627,5077,5455,5977,5445,8518,5822,9496,6813,6115,6562,6248,7136,6756,6042,5971,6462,6218,6739,7176,5335,6091,5543,6978,6387,5815,5979,5958,5713,7807,5973,5951,6453,5824,7036,8523,6648,6882,5461,5732,5763,7492,5218,5261,6153,5753,7099,6972,6099,10027,4767,6437,7134,4944,8014,5129,5240,6410,5419,5732,15769,6263,5797,5943,6444,6183,5108,6364,5541,7366,5939,6894,5572,7242,7207,12296,6799,5256,6567,6234,6501,7875,5391,5284,5821,7729,5017,6278,6560,5516,5966,6000,5535,5750,6375,6387,6597,5958,6643,23847,6630,5947,7976,5839,6217,5107,6068,7035,5779,6008,5655,5929,5668,7764,5887,6360,6317,6558,8151,5638,6352,6258,5525,5773,7004,6786,7873,6598,6271,5641,5213,6408,5917,6355,5831,6851,5734,7625,6230,6563,7187,6517,7159,6039,8088,6098,6787,5679,5666,7380,5351,8081,5863,6588,6832,5155,7231,6127,6698,5985,7072,5740,7458,6331,6151,7632,6103,7474,5963,5504,7166,5833,5199,5752,6062,5231,5899,5924,5755,7031,7402,6995,6030,5463,6173,6025,7502,6990,6004,6058,5931,5538,5970,5935,6855,6385,5617,5613,6355,5699,12344,5449,5071,6417,5739,6424,5160,6084,5467,7003,5243,5488,8766,5265,5429,6769,5393,6526,5479,5103,6226,6588,6976,5957,6778,5842,6631,6178,5138,5367,5762,8021,6241,5600,5102,6076,6676,5494,6111,5337,5471,23749,5493,5348,5823,6677,7345,6445,6857,4872,5778,6065,5991,5821,7376,4940,6591,6849,6688,6104,4891,7321,5944,5389,5604,6880,5473,6053,7312,9050,5343,5751,5549,5921,6192,7010,7626,7972,6199,5742,7682,6392,6754,6816,5741,7530,6331,5251,5759,5751,5028,5731,6172,6565,5861,5905,6813,5758,4968,6924,8981,5905,7091,5618,5342,5189,5939,5754,5820,5236,6695,5957,6634,6057,5332,6522,6698,7798,6145,6473,6638,6856,6090,7103,5298,6586,6292,6044,9350,4811,7096,6894,5254,5928,6334,4947,7844,6039,5084,5927,6096,6875,8185,5422,6870,5855,6119,5373,5767,5932,7203,7535,5875,5976,5796,6859,6573,6605,6750,7209,5926,6617,5864,4851,6825,5777,8203,6408,6499,5361,6979,6243,7593,5810,6560,7591,5935,5762,6409,6439,5645,5835,6850,5790,5441,6882,6847,10706,7276,5966,6149,5840,5612,6028,7649,9575,6362,6008,6150,6006,10556,6541,6446,6873,6116,8778,5957,5678,5368,5850,5524,6312,5734,12141,5845,7457,6413,7572,6341,6139,5993,6128,7366,5962,6524,6014,6097,5636,5322,6127,5988,5531,5849,7482,6437,5666,7234,6317,6945,5262,6127,7053,6319,4902,5936,5575,5484,6737,5747,5784,5230,7188,5642,6055,6604,8311,5286,6639,5909,6967,5456,5045,5656,6387,5224,7026,6949,7710,7507,6314,5610,6654,5921,5897,6248,5958,5778,6851,6000,7839,5224,5008,5794,6210,5084,5781,6101,5561,6457,6143,6229,5331,5301,6928,6117,6239,5553,6289,5605,6502,7617,6467,6678,5790,5770,5898,6677,4990,6419,7648,5414,6136,6003,5515,7822,8947,5810,6175,6944,6363,5849,4987,6532,5715,7574,6341,6730,5778,5862,6390,6097,6003,5699,7663,6199,9517,6574,5160,6400,5402,6378,6247,6410,5335,5403,5889,7280,8104,7269,5570,5970,5792,7854,5629,6172,5719,6631,5812,5990,6786,6191,7006,5450,5672,6295,6062,5452,5073,6104,6453,6092,6734,8076,5216,7790,7798,7151,7143,7342,8866,6312,8057,6336,6166,5683,5906,7011,5798,6297,4989,5631,5752,6152,7683,6107,5984,5597,6259,6084,5375,6201,6269,6556,5670,5422,4895,5281,6770,5962,6175,5763,6575,5911,7415,6181,5812,5772,5450,6330,6887,5960,5601,6212,5466,5236,6338,6712,6198,5784,6522,6899,5801,5246,8284,6527,5671,5812,5289,5126,6663,6055,5881,6841,6210,6036,5185,6609,7893,6337,5228,5958,6427,6532,6388,6760,6353,6868,6746,6127,6437,7597,6123,7188,7371,7311,6589,7998,7038,5629,6069,7121,6759,7567,6080,7179,14253,5516,6141,5669,6173,5306,5808,7578,6335,5689,6629,5349,6275,6460,5939,5164,5463,5351,5708,5955,6122,5639,6706,5110,5997,7074,6317,5913,6323,5266,5819,5800,5742,6893,5734,6593,5782,7239,5889,7179,6571,5910,5379,7570,5988,5583,5900,5632,5827,5462,6304,6211,5765,5192,5403,5845,6191,6025,6061,5924,7698,5632,6217,5892,5932,5541,6089,5535,5980,7296,6596,7153,7580,4938,6386,6604,6120,5220,6123,6803,5525,5862,5254,5645,5779,6111,5205,5527,6397,6255,6590,6397,5084,7294,6629,6839,5922,5593,5918,6572,5969,5620,5571,7315,5080,6873,6654,4996,5582,6252,7052,7498,6270,6035,5884,6822,6398,5596,5630,5242,6074,5739,5296,5910,5903,5925,6600,5625,6383,5520,6388,6088,5575,5942,6192,6849,6386,5684,5197,5767,6530,5434,6773,5636,5588,5954,7137,8377,5681,6440,5679,6197,5556,6315,6559,5072,6484,5435,6615,5956,6371,6246,6017,6785,6096,6596,5100,5262,5632,5785,5404,11771,6627,6475,5466,5657,5927,5751,9638,6913,5569,6287,9444,7168,5320,5903,8949,6606,5995,4631,5750,5843,7606,5979,7095,6655,7151,5792,5609,6268,5511,5197,6844,5809,6734,6598,6882,6855,5577,5946,6565,6887,5902,6024,7797,5786,6830,5568,5712,5293,6199,6333,6154,6331,7333,6233,5424,7115,5908,5940,25624,7688,5740,5964,6153,10782,6244,6373,5592,5929,7347,7188,6759,6097,6864,5982,6428,7733,6875,5518,6785,6803,5361,6628,5888,4957,5294,5965,5517,56941,6232,6920,5981,6462,5103,7541,6700,8901,6351,6177,5528,5671,6228,6660,5749,5491,6117,5976,6021,7382,13289,5611,4852,6001,6182,5848,7014,6130,5574,6011,6036,6140,8179,9294,5496,9832,6034,5341,5911,7046,5974,6294,5903,6025,6048,6798,6178,5984,5864,6055,6634,5740,8878,5628,5792,7870,5899,5223,5649,6639,5585,6181,6694,6359,5965,6585,5072,7529,5850,5992,5736,6043,5896,6183,5439,5436,6170,6168,7258,6846,6780,7977,5999,6070,5642,5873,5753,6001,6092,6342,7753,5741,7230,7646,5644,6140,7601,6543,4949,5744,6550,6129,6612,7810,5937,5190,5580,6292,6824,7239,6993,6371,6652,6193,6200,8844,6013,5030,5416,6199,6748,6192,5942,7084,7640,7404,6228,7625,6811,13563,5213,5612,5628,5844,7845,6146,6558,4961,6479,6700,5423,7766,5634,5289,5790,4877,5502,5403,6012,6876,6386,7325,5698,5359,6321,7083,5866,5911,5762,6471,5995,6404,5413,7906,5495,5545,5042,6189,7213,5331,6318,5420,5203,5395,6754,6702,5207,6610,5739,5327,7061,6468,6360,7340,5249,5867,6044,6377,7022,6243,5510,7768,5658,6927,5838,10872,5620,6779,8004,6198,6101,5932,6464,6023,5881,4927,6321,6164,7876,5550,6167,6201,6499,5913,5766,5839,5690,5740,5965,6979,6141,5216,5244,5364,4996,6033,6061,8628,6639,5161,6224,6833,6585,6267,6154,5607,5797,6798,5992,6060,6888,7451,5889,6012,6048,6493,5473,6728,5332,7261,5334,6665,6109,5963,6116,5735,5662,6061,8557,5960,4899,6388,5726,5741,6173,6092,6422,6543,8130,5254,6580,5606,4887,5476,5574,5880,5495,12331,8328,5787,6104,6490,5609,5467,6899,5348,4979,5842,5792,5746,5441,5655,6644,5546,7530,5567,6156,6056,6067,6756,6495,6332,6919,6726,7162,6927,6368,5614,5704,7239,7470,5689,5465,5940,5430,7200,5827,9471,7102,6176,6413,5099,6957,6456,6159,7999,8120,6027,4725,7385,7291,5137,7137,6474,6510,6069,5939,5974,13456,9725,6266,6059,5869,7013,5237,5722,6979,6018,8779,5986,6640,6685,6356,5551,6749,5704,6848,6344,6790,5123,5732,5208,6865,6284,5934,6143,6515,6607,6002,6216,6201,7537,6225,6757,6114,5590,6770,4870,7013,5266,5976,6833,6789,5347,5818,5339,6331,6631,5329,6745,5706,6214,6000,4868,6473,6258,5137,6489,5804,5103,6369,6293,5478,7078,5614,6330,6704,6055,6845,5960,4743,6117,6196,5346,5677,5409,6615,7521,5636,578730,5460,5357,6881,6337,7513,5513,5850,7124,7360,6283,5249,5722,8713,6992,5974,5637,7323,6545,5424,8259,9088,6473,5327,5571,6938,5329,5609,5766,7396,6612,6246,5391,6270,8381,6781,6050,6556,7137,6084,6224,6711,5560,5446,8226,5809,7715,5669,5422,6699,7504,5275,6378,5750,7033,5986,6684,6420,7019,6992,5868,6547,5496,5391,5557,5167,6665,6367,8147,6054,6136,5227,5168,5939,5640,5953,6374,5944,5912,5778,5586,6400,7251,6770,6744,6184,6510,6191,5476,5527,5339,5789,7032,6232,6111,5368,6281,6803,5530,4836,5136,6183,5607,6607,5556,5799,6238,6787,6212,8966,5421,5758,5594,6633,6097,6752,5771,5900,7123,7029,6621,7584,6531,4962,8377,6747,10569,6552,5933,6679,6128,6702,6324,6582,6098,7387,5824,5895,6080,6927,6591,5659,6150,6549,7984,6405,5414,5475,6792,5513,7060,5324,5975,6105,6201,5594,5340,5858,6515,6878,6258,5399,6935,26599,5204,6119,6322,6969,5471,6108,8206,5965,18099,6255,7405,5382,5779,7571,7445,5914,4538,5480,6580,6418,7627,7036,7008,5820,15216,5874,6225,9847,6381,5680,6166,7885,6589,6746,6609,6948,8337,6789,9464,6579,6384,6245,5232,6206,6160,5356,6622,6693,7540,6361,7299,5765,5766,6742,5844,5809,6755,5635,6537,6544,5607,6311,4955,5864,5773,6058,7206,5908,6168,5732,7974,7086,6632,7185,4655,5887,5966,6215,6372,6220,5845,6154,10448,5973,6383,6036,6630,5768,6662,5537,5857,6968,4407,4911,6001,5972,6570,6555,6630,5742,7087,6439,6098,7582,7448,5512,6753,6302,6275,5658,5753,8444,6125,5444,5498,5087,6089,5878,5713,6451,6303,5294,5400,7259,5550,5745,5837,6771,6758,5955,5907,5640,5421,6737,5152,5602,6162,6497,5792,5526,6474,4883,6676,6331,6606,5378,6600,6014,6823,5281,5933,5400,7350,6313,6522,6527,6153,7127,5688,7338,7056,5470,6447,5658,6139,6925,6093,5735,6039,6325,5684,6285,9030,5237,4868,7625,5591,6275,7245,5707,5435,6137,6201,6352,5110,6394,4848,6179,6321,5360,7294,7832,5914,5581,5279,5609,5639,5883,6114,6612,6512,5908,7753,5869,6220,6063,5935,5154,6694,6830,5679,6248,5830,5671,7836,5555,5926,5887,5494,6035,7187,7201,5965,5073,4555,5490,6438,6265,6905,6666,6463,5927,6057,6320,6009,5776,6181,7985,6256,6067,6705,9478,6491,5900,6007,5587,5713,6552,6296,5517,5798,6198,6715,6165,5084,5708,6106,6972,6330,5699,5263,6306,6097,5692]},{"counters":[5756,4528,6491,5751,5634,10637,6749,6034,7266,7128,7095,6821,6228,5624,6133,5523,5635,5553,5894,6213,6558,5882,6088,6167,5276,5845,6323,6737,6250,5071,6371,7765,5469,5336,5789,6222,6802,5784,7238,6442,5500,7090,5993,5268,5803,5484,8015,5537,6570,6223,6032,5432,5619,6494,7118,7271,5821,6048,8809,5969,6439,6321,6312,5241,6370,7163,5576,5911,5989,6054,6071,6679,7749,6761,6151,6368,9114,6641,6757,5918,5890,7138,6703,6507,6336,5503,6677,7309,6028,6203,6355,6097,7104,6363,6375,5384,5680,6306,5958,8636,6369,5386,6577,6221,6588,7348,6855,5048,6266,6443,4904,6666,7362,6471,5846,6302,6627,6628,5996,7367,6648,4929,7193,5372,7306,8094,6257,6510,7282,5943,7552,5803,6631,8727,6694,6846,5387,6180,5777,5817,5302,6659,6977,5780,51079,5299,5094,7835,6233,6678,5417,6172,5188,5950,7917,6286,6739,7135,6185,6597,6081,5950,6855,5676,5486,5418,7188,5680,7163,6187,5454,6764,5247,5870,6081,6766,7400,6553,5688,5175,5645,5497,6192,5379,6446,5973,7128,5334,5465,6631,6386,6034,5455,6261,7207,6505,5218,8399,5813,7051,5722,7726,6172,6156,5911,6913,5093,7696,6679,5801,6307,5212,5851,5511,5889,6252,5776,6304,7012,7549,6987,5483,6533,5896,5524,5807,6451,7372,6367,5886,7277,5356,4932,5968,5204,7040,6100,5641,6146,5755,8984,6211,7784,7026,5709,6467,6154,6219,5986,6069,7430,5631,7136,5657,5609,8279,6872,5868,5428,5502,6289,6002,6990,5745,5198,7979,5256,5934,5557,7411,6465,5666,5960,5542,6168,6199,6838,5418,6638,7642,6017,6768,6053,6212,7460,5406,7072,5840,6181,13087,7787,5917,5649,6495,5999,5817,5627,6694,4927,5555,5836,6334,5873,6574,6309,5681,7212,6078,5391,5647,5524,5918,6277,7813,8319,5490,5989,5571,5772,11868,6229,7281,6012,6185,6373,6840,6567,5108,6931,5425,5085,6671,6909,5944,5643,6216,4763,8754,5249,6167,6720,6444,5824,6509,6146,5480,6684,5603,5771,6213,6015,5827,6380,6370,5872,5663,5911,6778,6117,6390,6147,6055,4518,6717,6435,5059,5083,5599,6495,5005,6024,5457,5335,5678,6076,6538,9046,7219,5015,6945,6056,6821,8214,6642,5729,6665,7142,6905,5077,5968,6116,4914,6026,6375,6739,5788,7137,5590,5397,6189,5308,6088,7125,5971,5711,6008,6711,6529,5623,5589,6043,5122,6043,6182,9267,5967,6668,5560,5726,5375,6214,6567,5990,5058,5483,9593,7130,8367,7297,8919,6474,6282,6700,5771,6235,6442,5997,4658,6398,6371,4705,5883,5718,6396,5468,5448,5063,4995,5681,5582,5710,5866,5756,6695,6493,6537,7907,7869,6257,7232,6009,5596,6148,5973,6571,7316,5798,5722,5586,5349,6134,6604,8379,5800,5622,7731,6451,6146,6519,9505,6732,5787,6994,6552,5838,5985,9772,6399,6661,6047,5515,6180,5304,6841,5910,5701,6169,5604,7664,5692,6498,6161,5757,6855,5819,7166,5210,6810,7905,9496,8515,6250,7445,5568,5656,5499,6963,6092,5923,5786,7159,8969,6147,6895,6674,6414,5684,5539,7298,5868,6223,6481,6859,5433,6368,7243,5535,6561,5816,5492,5345,5672,5439,6510,6506,5924,5531,6437,6006,6918,6241,6005,5984,6252,7381,5305,5785,6827,5760,5354,5283,5799,8204,6088,6618,5889,5618,6390,6009,6130,5970,6671,12382,5798,6381,5364,6049,5695,7291,6872,6006,6245,6448,6020,5696,5638,5409,7158,7015,7306,5913,7245,6555,6775,5833,5046,5790,6293,6252,5031,5566,5610,5823,5932,7437,6302,6019,8114,6663,5928,6579,6504,6009,5975,5825,8959,5717,5987,6367,6465,6376,8564,7177,6991,6056,7127,6075,7002,6982,6285,5949,5502,5871,6890,6132,6388,5968,6135,10001,5658,5143,6110,5457,6126,6790,5741,6244,5568,5749,5867,5793,6040,6824,4685,8204,6248,5879,5876,6949,5882,5887,5356,5946,6113,5245,5576,7025,6636,6720,5616,5897,6088,5996,6082,6249,7073,6005,5645,5458,5269,6483,6036,6564,7390,5156,5469,5181,5661,6295,6212,5733,10620,5219,6937,5778,5127,5855,6393,6331,6207,5667,6162,5595,5372,5566,6429,6450,5959,5884,6488,8082,8190,5570,6247,6992,6260,6482,5568,5485,6539,5881,6261,10503,6283,5610,5941,6004,6224,7559,9564,5452,5794,5687,7014,7158,8915,5604,7915,6348,5061,6874,6961,5632,5756,5797,6720,6054,6675,5919,5970,5797,6373,5652,5332,4896,5181,6135,6191,7282,5971,6512,7940,5423,5859,7033,5551,7752,5918,6755,6921,5337,8508,6555,5706,6369,6915,5000,6187,7239,5379,5727,6876,7189,5459,5122,5584,6455,6373,6319,5671,6611,6083,5836,5721,6837,8084,5977,6867,7278,5751,5767,6288,5887,6745,5563,5567,4782,7057,5523,6048,4884,6239,7469,5662,5964,6685,5445,5625,6459,5854,6644,5774,6838,6208,5259,6365,5380,5468,7124,6422,6921,5657,6159,7706,6810,6912,8645,5112,11070,6723,5682,5195,5545,7977,5761,7537,5317,5533,5698,5087,6119,6091,5695,5495,5408,5089,5265,6141,6914,6042,6343,5542,6756,6816,5129,6463,5235,6502,6264,6747,7420,8968,6148,6606,6178,6160,7344,6580,7154,5281,6089,6130,5142,7311,6297,5197,6743,5087,5449,6235,6221,6636,5891,6631,7054,5302,5658,5320,4836,5740,6926,6650,6184,6265,5983,5960,5454,5510,5823,5613,6303,6707,5785,5400,6052,6475,6130,5913,6441,5521,5155,25193,7701,8035,5423,6812,9961,6625,6032,10728,6096,6475,6050,5798,5336,6948,5796,5619,6774,6270,5098,6606,5972,6388,5947,5562,6451,5971,5819,6260,5878,6589,5982,5974,5293,5724,5290,7003,6193,6155,6829,6131,6308,5294,5351,5252,5302,8544,6167,5572,6317,5511,25020,6983,5973,6115,6626,6011,6427,6391,5250,7292,6991,6757,5883,5356,6416,7024,6182,5973,8451,5860,5787,6125,5563,5915,6243,6595,7766,7678,6522,5917,5424,5068,5880,5636,5296,5500,6224,5232,8108,5589,5766,6406,6631,5619,9234,6304,6708,5585,6450,5532,6389,5539,5786,6717,6316,6330,6485,6048,5746,5171,578829,5840,6080,6595,6080,6591,6696,5933,6454,6129,6150,6332,6276,5630,6756,5504,5835,6582,6703,6643,5500,5384,7490,6007,5731,5455,6495,5674,6846,6493,5666,6114,6267,6156,6784,6975,5354,5933,6835,6906,6686,6107,6407,6198,6408,7541,6956,5755,5420,5566,5668,5222,5087,6580,6304,5882,6245,6262,9714,5705,6436,7740,10938,5473,5667,5137,6163,5709,6820,5788,5577,6664,6236,6980,5394,5809,5207,11656,5843,5884,5945,6186,7731,5309,5629,6719,7257,6528,5574,7289,7004,6293,6631,6391,5298,5473,5751,8784,5778,7069,5932,7107,5439,6578,8757,5701,5686,7042,6080,6053,6190,6039,4848,5363,5904,5952,6746,6143,5800,5954,5033,6889,5634,5170,5633,5910,7139,7225,5532,14627,7214,7760,9830,5687,4823,5335,5166,6130,6688,5629,4964,16469,5861,5685,6920,5949,6595,5719,6232,5198,6558,5947,5397,5279,5255,5737,5921,7072,5798,5760,6122,6609,6298,5339,7889,5837,6433,8455,6833,6520,6785,6400,6182,5315,5895,8242,13867,6185,6645,5184,6175,7807,5989,6511,6812,7508,6095,6845,5651,5355,7034,6640,6958,6366,5661,6349,9468,7584,5797,8110,5262,5551,5253,5348,5503,4705,6028,7381,6271,4898,4492,5579,6498,7826,5920,5905,6069,12949,5392,7473,6173,6298,7094,5925,9186,6659,8264,6247,5889,6851,6731,5840,5943,5372,6214,8075,5863,6123,6736,5751,5583,5740,6277,6513,6638,6283,5957,5664,5774,6095,6463,6619,5208,5267,6943,6816,5567,7182,7373,6412,5947,7196,5631,5165,5484,6588,6622,5638,5040,5958,6125,6432,5796,7004,5408,6649,6406,7209,6460,5510,6403,6417,5836,6698,6960,6230,5386,6075,6660,6439,5528,5307,5826,6964,7258,6346,5742,6190,7010,7499,7430,6714,5388,6089,5371,5439,6725,6654,4982,6922,5126,4614,5906,5864,5569,6131,6048,7211,6190,5755,6381,6152,5488,5495,5723,7572,6800,5301,6229,5943,6298,24033,6008,7121,5895,5869,7013,14542,5029,5826,6181,5526,5658,6977,6118,6023,6927,6558,6676,6772,6404,5143,7595,6136,5317,5737,6237,6053,7087,5377,6929,5938,5287,5888,5504,6403,6523,5694,6701,6624,6248,6039,6426,7644,5909,6190,19521,5684,5249,5793,5175,5542,6291,5500,6710,26514,6420,6615,8517,5584,7545,12470,5903,5427,5907,4878,5297,6082,6974,8284,5673,5072,6600,6918,6048,5903,5649,6236,7010,6389,6362,5998,5628,5673,13248,6942,6625,6805,5323,7270,8367,6736,5614,5946,5737,6320,6276,5936,6635,5737,7131,6129,5634,7596,6515,6347,6342,5745,56124,6684,5588,5301,5063,4884,7711,6228,8245,6617,6047,6663,5634,5996,5807,5274,5450,6072,5872,5785,5188,7737,6569,5993,6635,7243,5566,5536,12677,5694,5522,4933,8623,6579,6443,6281,6621,6513,6040,6359,5959,6298,5590,5484,5636,5435,5303,6909,6696,6292,6149,6909,8592,5924,6038,5975,23573,5020,6128,5896,5138,5952,6486,6787,5376,6302,5139,5687,6124,6622,7114,6688,5991,6685,6062,6865,5695,7866,5317,5290,6908,6369,7318,5741,5430,5941,6130,6420,6686,6873,6255,5694,5356,6607,5605,7047,5616,6629,6045,5675,5656,7417,7182,5039,7299,7019,6920,5336,7019,9090,5593,5568,5442,6038,5980,6638,5504,6830,5126,5342,5248,6081,13338,5911,9377,6085,6654,6436,5177,5543,6012,6123,5175,5858,6362,6255,5687,5608,8187,5252,5720,6068,6489,6135,6322,7358,7511,6268,6611,7173,8363,6233,8265,5712,6936,5385,5848,6146,5970,6013,6940,4942,4793,5884,6718,5765,6408,5998,5727,6316,5614,5170,6015,6325,6425,4876,7218,6052,5485,6489,5539,5939,5557,8306,5632,6279,5525,5944,6258,6056,6205,5258,5983,5513,5687,5656,4992,5240,6503,10317,7420,5830,9419,6189,7250,7542,7254,5881,6186,7524,5120,5497,7191,6938,6737,6144,6373,6974,7214,6777,7170,5283,7442,6106,6568,5889,7070,7058,6690,8417,5580,6703,5701,6516,7337,6132,5604,6085,6024,6153,5483,5910,8844,7047,4770,5940,5599,5072,7582,6091,5636,5395,6314,6452,5780,6688,6045,4766,4917,6461,6658,6065,5269,8684,7907,6325,5148,5918,6021,5517,6475,6259,4908,5752,6367,5122,6847,5497,6334,5951,5589,5878,7445,6709,4835,5795,5135,5150,6393,5220,6140,6449,6261,7007,5445,5800,5600,5387,7332,5266,8609,5596,7384,5560,6429,6058,5942,6341,6211,5826,6652,5924,6002,7020,5517,6059,6212,6036,6435,5417,7156,5906,6299,6585,5408,6422,5214,6920,5977,5834,5806,5756,7210,6910,6038,6355,5731,6875,5814,6427,4804,5747,6122,5743,5581,5691,5601,5738,5864,5220,6393,7148,6179,6108,5338,6508,6836,6118,6276,6103,6570,6111,6003,5957,6485,5559,5267,6137,5091,6688,6690,5498,6202,5777,5185,5302,7252,6838,6372,6926,5723,6414,5221,5713,5366,5609,6522,6160,6272,7114,5534,5286,6722,6013,5698,6919,5774,6630,7187,5729,5401,5773,5298,6326,6191,5864,5648,4641,6163,5512,6096,5871,6080,6272,7467,6842,6857,6687,5169,5699,6355,5738,6543,9561,5778,5651,7491,5514,6329,5364,5953,7741,7540,6272,5651,6183,5845,5460,6960,7188,9024,5090,6123,6768,5849,5293,6207,5105,7345,6081,7181,7067,6837,7283,7394,6150,5711,5648,7651,7258,5693,6372,5770,6124,6928,5914,6712,7972,6811,5530,5282,5310,5530,5083,5840,6338,6189,6197,5881,6214,5724,4895,5775,5763,5480,6981,5586,8266,7265,6000,6078,6012,5508,5908,6000,6333,6397,7043,6038,6145,5955,5935,7624,5632,7205,5974,7063,5747,5857,6755,5978,5342,5583,7495,5965,6356,6789,7616,6544,5563,7633,6411,5267,5149,6568,5812,5790,5816,6980,5674,6492,5621,7810,5124,5668,4988,8072,7187,5457,6615,6165,7168,6783,5499,5819,6037,7135,5606,9518,6590,6682,5753,5401,6731,6286,5595,6386,6568,4860,7268,7876,7887,5885,5474,5645,7285,5103,5836,5655,6767,5356,4940,6101,5615,6247,6626,5586,7384]}]},"null_count":0,"tot_col_size":114841425,"last_update_version":401126096224911360},"c":{"histogram":{"ndv":2,"buckets":[{"count":6794805,"lower_bound":"MA==","upper_bound":"MA==","repeats":6790386},{"count":13668891,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":6869614}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6780845,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6888046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6888046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6780845,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6780845,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6888046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6888046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6780845,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6780845,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6888046,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":27337782,"last_update_version":401126096235397120}},"indices":{"idx_b_c_a":{"histogram":{"ndv":13668897,"buckets":[{"count":131072,"lower_bound":"A4AAAAAAxFeQA4AAAAAAAAAAA4sWM+0SmEAG","upper_bound":"A4AAGBJZOycGA4AAAAAAAAAAA423oFapiFIN","repeats":1},{"count":262144,"lower_bound":"A4AAGBJZOycGA4AAAAAAAAAAA423oFapiFQN","upper_bound":"A4AAGBJZOycGA4AAAAAAAAAAA43enaN4CcIM","repeats":1},{"count":393216,"lower_bound":"A4AAGBJZOycGA4AAAAAAAAAAA43enaN4CcQM","upper_bound":"A4AAGBJZOycGA4AAAAAAAAAAA433aer6VYAN","repeats":1},{"count":524288,"lower_bound":"A4AAGBJZOycGA4AAAAAAAAAAA433aeuKzEAM","upper_bound":"A4AAGBJZOycGA4AAAAAAAAAAA44EWEOngMYO","repeats":1},{"count":652485,"lower_bound":"A4AAGBJZOycGA4AAAAAAAAAAA44EWEOngMgO","upper_bound":"A4AAIGseBEcXA4AAAAAAAAAAA4sClkxdnIAF","repeats":1},{"count":783557,"lower_bound":"A4AAIGseBEcXA4AAAAAAAAAAA4sCl3MFXIAB","upper_bound":"A4AAIQI2FccQA4AAAAAAAAABA4qiBXMo8cAB","repeats":1},{"count":914629,"lower_bound":"A4AAIQI3xkcXA4AAAAAAAAABA4l2Jj0b0cAD","upper_bound":"A4AAIU+NG/cQA4AAAAAAAAAAA4sUZXilOEAH","repeats":1},{"count":1045701,"lower_bound":"A4AAIU+NG/cQA4AAAAAAAAABA4n1yjtN/cAB","upper_bound":"A4AAIYsukbcPA4AAAAAAAAAAA44GvVQMw8AV","repeats":1},{"count":1176773,"lower_bound":"A4AAIYsukbcPA4AAAAAAAAABA4v/Ft8pbcAe","upper_bound":"A4AAIgMBp8cRA4AAAAAAAAABA4wMKGrWscAf","repeats":1},{"count":1307845,"lower_bound":"A4AAIgMBp8cRA4AAAAAAAAABA4x5cKYe8cAM","upper_bound":"A4AAIkWDMn8PA4AAAAAAAAAAA405FNEBzoAM","repeats":1},{"count":1438917,"lower_bound":"A4AAIkWDMn8PA4AAAAAAAAAAA407kWeQnoAV","upper_bound":"A4AAIooWTqcPA4AAAAAAAAABA4x3naJ2KcAV","repeats":1},{"count":1564334,"lower_bound":"A4AAIooWTqcPA4AAAAAAAAABA4yRVVwpqcAO","upper_bound":"A4AAIsfNAg8WA4AAAAAAAAABA4zkDlAyw8AO","repeats":1},{"count":1695406,"lower_bound":"A4AAIsfNAg8WA4AAAAAAAAABA4zkEANaw8AM","upper_bound":"A4AAIxeBo5cNA4AAAAAAAAAAA4zQw/5NsoAM","repeats":1},{"count":1826478,"lower_bound":"A4AAIxeBo5cNA4AAAAAAAAAAA4zTDZi1/4AO","upper_bound":"A4AAI27ObU8QA4AAAAAAAAABA4oPVdU708AD","repeats":1},{"count":1957550,"lower_bound":"A4AAI27PFN8OA4AAAAAAAAABA4oO4n/sd8AD","upper_bound":"A4AAI7uXuycXA4AAAAAAAAABA4v7CgE8CcAe","repeats":1},{"count":2088622,"lower_bound":"A4AAI7uXuycXA4AAAAAAAAABA4w4WW6bycAV","upper_bound":"A4AAJBDeR/8NA4AAAAAAAAAAA43tmT4A94AM","repeats":1},{"count":2219694,"lower_bound":"A4AAJBDeR/8NA4AAAAAAAAAAA436dGG35MAN","upper_bound":"A4AAJGFEW78QA4AAAAAAAAAAA4qku4l34gAF","repeats":1},{"count":2350766,"lower_bound":"A4AAJGFEW78QA4AAAAAAAAAAA4qtiGdXRkAB","upper_bound":"A4AAJJ/vR0cSA4AAAAAAAAABA4xrORzLUcAM","repeats":1},{"count":2481838,"lower_bound":"A4AAJJ/vR0cSA4AAAAAAAAABA4x6d5GGkcAO","upper_bound":"A4AAJMKxyWcVA4AAAAAAAAABA4ySojgB2cAV","repeats":1},{"count":2612910,"lower_bound":"A4AAJMKx+VcQA4AAAAAAAAABA4rBYVxIlcAI","upper_bound":"A4AAJNzwrv8PA4AAAAAAAAABA4qvBEXk/8AI","repeats":1},{"count":2743982,"lower_bound":"A4AAJNzxVGcSA4AAAAAAAAAAA4ptSAijwQAE","upper_bound":"A4AAJPvdNC8OA4AAAAAAAAAAA4q45Cf0VAAF","repeats":1},{"count":2875054,"lower_bound":"A4AAJPvdNC8OA4AAAAAAAAAAA4rIys+hv0AI","upper_bound":"A4AAJRqjLVcSA4AAAAAAAAABA4sEDN9fVcAC","repeats":1},{"count":2977418,"lower_bound":"A4AAJRqjLVcSA4AAAAAAAAABA4sEEQmV1cAC","upper_bound":"A4AAJTWQbvcOA4AAAAAAAAABA419UtxKvcAN","repeats":1},{"count":3042954,"lower_bound":"A4AAJTWQbvcOA4AAAAAAAAABA42J9BcuPcAO","upper_bound":"A4AAJUZSI18UA4AAAAAAAAABA4zZuhfsF8AM","repeats":1},{"count":3108490,"lower_bound":"A4AAJUZSI18UA4AAAAAAAAABA41ia2j618AN","upper_bound":"A4AAJVglvOcVA4AAAAAAAAAAA4wG+E324gAf","repeats":1},{"count":3174026,"lower_bound":"A4AAJVglvOcVA4AAAAAAAAAAA4yQuf6uZwAN","upper_bound":"A4AAJWkn//8NA4AAAAAAAAABA4qSVzhif8AD","repeats":1},{"count":3239562,"lower_bound":"A4AAJWkn//8NA4AAAAAAAAABA4qSkqqYP8AB","upper_bound":"A4AAJXykAV8TA4AAAAAAAAABA4u4U7XXF8AD","repeats":1},{"count":3305098,"lower_bound":"A4AAJXykAV8TA4AAAAAAAAABA4xXjEEkV8AO","upper_bound":"A4AAJZD4lBcQA4AAAAAAAAABA4uDWHknRcAB","repeats":1},{"count":3370634,"lower_bound":"A4AAJZD4lBcQA4AAAAAAAAABA4uH/nK6hcAE","upper_bound":"A4AAJaWwvIcXA4AAAAAAAAAAA41UeiW+hIAM","repeats":1},{"count":3436170,"lower_bound":"A4AAJaWwvIcXA4AAAAAAAAAAA43ax/4SOYAV","upper_bound":"A4AAJboanMcVA4AAAAAAAAAAA4wgw3XVJ4AN","repeats":1},{"count":3501706,"lower_bound":"A4AAJboanMcVA4AAAAAAAAAAA4whN+yrZ4AO","upper_bound":"A4AAJc50iIcQA4AAAAAAAAABA43bzss54cAV","repeats":1},{"count":3567242,"lower_bound":"A4AAJc50iIcQA4AAAAAAAAABA43j+onNocAM","upper_bound":"A4AAJeJPCwcOA4AAAAAAAAAAA426wWn4uwAV","repeats":1},{"count":3632778,"lower_bound":"A4AAJeJPCwcOA4AAAAAAAAAAA426x4HfJIAO","upper_bound":"A4AAJfXKzAcTA4AAAAAAAAAAA4tkYP0N7oAF","repeats":1},{"count":3693057,"lower_bound":"A4AAJfXKzAcTA4AAAAAAAAAAA4tm53IwDUAC","upper_bound":"A4AAJgl/Hb8PA4AAAAAAAAAAA4x+5OmakMAV","repeats":1},{"count":3758593,"lower_bound":"A4AAJgmAdC8QA4AAAAAAAAABA4q6BwXmC8AD","upper_bound":"A4AAJiEQkBcNA4AAAAAAAAAAA4q8msS4acAD","repeats":1},{"count":3824129,"lower_bound":"A4AAJiEQkBcNA4AAAAAAAAAAA4rpDCGKA8AF","upper_bound":"A4AAJjbwibcVA4AAAAAAAAABA41OgiTwbcAO","repeats":1},{"count":3889665,"lower_bound":"A4AAJjbwibcVA4AAAAAAAAABA41O6MIrLcAN","upper_bound":"A4AAJk7jIqcRA4AAAAAAAAABA4zQTVNt6cAM","repeats":1},{"count":3955201,"lower_bound":"A4AAJk7jIqcRA4AAAAAAAAABA4z46QJ46cAM","upper_bound":"A4AAJmCEIN8XA4AAAAAAAAAAA4zmzkcSr0AM","repeats":1},{"count":4020737,"lower_bound":"A4AAJmCEIN8XA4AAAAAAAAAAA4znAcE4L0AV","upper_bound":"A4AAJnW3xlcWA4AAAAAAAAABA4swDqMOFcAE","repeats":1},{"count":4086273,"lower_bound":"A4AAJnW3xlcWA4AAAAAAAAABA4tGtW911cAC","upper_bound":"A4AAJomV4ccNA4AAAAAAAAABA4rto2COscAB","repeats":1},{"count":4151809,"lower_bound":"A4AAJomV4ccNA4AAAAAAAAABA4rtv4UGMcAG","upper_bound":"A4AAJp/1Wb8NA4AAAAAAAAABA401k4npr8AN","repeats":1},{"count":4217345,"lower_bound":"A4AAJp/1Wb8NA4AAAAAAAAABA401lplc78AN","upper_bound":"A4AAJrZhkx8WA4AAAAAAAAAAA40uoLcmPgAV","repeats":1},{"count":4282881,"lower_bound":"A4AAJrZhkx8WA4AAAAAAAAAAA40vwSBvx4AN","upper_bound":"A4AAJspdaEcVA4AAAAAAAAAAA4sPjACZHMAE","repeats":1},{"count":4348417,"lower_bound":"A4AAJspdaEcVA4AAAAAAAAAAA4sQl4kDWAAB","upper_bound":"A4AAJt8psC8WA4AAAAAAAAAAA40pIhF8UMAV","repeats":1},{"count":4413953,"lower_bound":"A4AAJt8psC8WA4AAAAAAAAAAA40pK8pVUMAM","upper_bound":"A4AAJvIldB8OA4AAAAAAAAAAA4yaaQoMjwAO","repeats":1},{"count":4479489,"lower_bound":"A4AAJvIldB8OA4AAAAAAAAAAA42BxHg+u0AV","upper_bound":"A4AAJwUYLP8NA4AAAAAAAAABA404Nfug/8AV","repeats":1},{"count":4545025,"lower_bound":"A4AAJwUYLP8NA4AAAAAAAAABA404Nh0c/8AV","upper_bound":"A4AAJxU+TAcXA4AAAAAAAAAAA4sQ3KkD8MAC","repeats":1},{"count":4610561,"lower_bound":"A4AAJxU+TAcXA4AAAAAAAAAAA4sQ3Km13sAB","upper_bound":"A4AAJyrt578UA4AAAAAAAAABA4toHdTKL8AE","repeats":1},{"count":4676097,"lower_bound":"A4AAJyrt578UA4AAAAAAAAABA4tvunh8r8AG","upper_bound":"A4AAJ0F/k48VA4AAAAAAAAAAA4sHspVjMAAF","repeats":1},{"count":4741633,"lower_bound":"A4AAJ0F/k48VA4AAAAAAAAAAA4sasLuQvgAD","upper_bound":"A4AAJ1tP9Z8UA4AAAAAAAAAAA41IFI71mcAM","repeats":1},{"count":4807169,"lower_bound":"A4AAJ1tP9Z8UA4AAAAAAAAAAA41IM8Yz1UAN","upper_bound":"A4AAJ3WYkIcQA4AAAAAAAAAAA40acKrCLMAO","repeats":1},{"count":4872705,"lower_bound":"A4AAJ3WYkIcQA4AAAAAAAAABA4sQlNTlYcAC","upper_bound":"A4AAJ4quSpcQA4AAAAAAAAAAA4shMeABBgAD","repeats":1},{"count":4938241,"lower_bound":"A4AAJ4quXO8XA4AAAAAAAAAAA4usSrvMwcAH","upper_bound":"A4AAJ6B8D68UA4AAAAAAAAAAA4ykqbNzDoAV","repeats":1},{"count":4989582,"lower_bound":"A4AAJ6B8D68UA4AAAAAAAAAAA4y8nrA3yAAM","upper_bound":"A4AAJ7ZhTv8UA4AAAAAAAAAAA41+MadEzkAV","repeats":1},{"count":5055118,"lower_bound":"A4AAJ7ZhTv8UA4AAAAAAAAAAA41+OPs0TkAV","upper_bound":"A4AAJ9KDpmcWA4AAAAAAAAAAA4xUUuZTq0AO","repeats":1},{"count":5120654,"lower_bound":"A4AAJ9KDpmcWA4AAAAAAAAAAA4xyBPn4GIAM","upper_bound":"A4AAJ+3JaM8UA4AAAAAAAAAAA4svtKRHWMAF","repeats":1},{"count":5186190,"lower_bound":"A4AAJ+3JaM8UA4AAAAAAAAAAA4sv4PEWxYAB","upper_bound":"A4AAKAps+D8OA4AAAAAAAAAAA4z2ZiKyGAAV","repeats":1},{"count":5251726,"lower_bound":"A4AAKAps+D8OA4AAAAAAAAAAA40otjpem4AN","upper_bound":"A4AAKCTo8w8UA4AAAAAAAAAAA4z6+cLByUAM","repeats":1},{"count":5317262,"lower_bound":"A4AAKCTo8w8UA4AAAAAAAAAAA4z+G3entEAV","upper_bound":"A4AAKD7pyJ8WA4AAAAAAAAAAA42wwbJP3MAV","repeats":1},{"count":5382798,"lower_bound":"A4AAKD7pyJ8WA4AAAAAAAAAAA42w3+vwHMAM","upper_bound":"A4AAKFjhHjcPA4AAAAAAAAAAA4uF5nbK7oAG","repeats":1},{"count":5448334,"lower_bound":"A4AAKFjhHjcPA4AAAAAAAAAAA4uF62rqLoAF","upper_bound":"A4AAKHYvLpcRA4AAAAAAAAAAA44AqgJ6KQAO","repeats":1},{"count":5513870,"lower_bound":"A4AAKHYvQ48XA4AAAAAAAAABA4tQuoyso8AB","upper_bound":"A4AAKJGuBYcVA4AAAAAAAAABA4xc8zAe4cAN","repeats":1},{"count":5579406,"lower_bound":"A4AAKJGuBYcVA4AAAAAAAAABA4xc+4kj4cAO","upper_bound":"A4AAKKzVJicPA4AAAAAAAAAAA43HtUOSUIAN","repeats":1},{"count":5644942,"lower_bound":"A4AAKKzVJicPA4AAAAAAAAAAA43JLxGu0IAM","upper_bound":"A4AAKMuhVp8XA4AAAAAAAAABA4yQOhEp58AO","repeats":1},{"count":5710478,"lower_bound":"A4AAKMuhYecWA4AAAAAAAAABA4tp+cPbecAE","upper_bound":"A4AAKO/T27cXA4AAAAAAAAAAA4z/BDd8LkAO","repeats":1},{"count":5776014,"lower_bound":"A4AAKO/T8pcUA4AAAAAAAAAAA4wOo/E8IMAf","upper_bound":"A4AAKSE+eo8RA4AAAAAAAAAAA41p+DdflYAV","repeats":1},{"count":5841550,"lower_bound":"A4AAKSE+eo8RA4AAAAAAAAAAA41p/OHiB8AV","upper_bound":"A4AAKTVGcAcXA4AAAAAAAAABA44Fd3dyQcAM","repeats":1},{"count":5907086,"lower_bound":"A4AAKTVGcAcXA4AAAAAAAAABA44IqoZrwcAM","upper_bound":"A4AAKUntsB8WA4AAAAAAAAAAA4uT17Wr4UAG","repeats":1},{"count":5972622,"lower_bound":"A4AAKUntsB8WA4AAAAAAAAAAA4uVHgLHk0AH","upper_bound":"A4AAKVks6L8PA4AAAAAAAAAAA4wUgSBglUAO","repeats":1},{"count":6038158,"lower_bound":"A4AAKVktHY8WA4AAAAAAAAABA4uJeuFdo8AG","upper_bound":"A4AAKWqagPcQA4AAAAAAAAAAA4yYJ6ZPI4AV","repeats":1},{"count":6103694,"lower_bound":"A4AAKWqagPcQA4AAAAAAAAABA42AMcntPcAV","upper_bound":"A4AAKX2BJLcPA4AAAAAAAAAAA4x8QZh8GsAO","repeats":1},{"count":6169230,"lower_bound":"A4AAKX2BJLcPA4AAAAAAAAABA44GXAG17cAO","upper_bound":"A4AAKZI8N/cVA4AAAAAAAAAAA4uZwpfjC8AF","repeats":1},{"count":6215592,"lower_bound":"A4AAKZI8N/cVA4AAAAAAAAAAA4uZ3jbbi8AH","upper_bound":"A4AAKaFtQHcPA4AAAAAAAAAAA4zQYzhBBQAM","repeats":1},{"count":6281128,"lower_bound":"A4AAKaFtQHcPA4AAAAAAAAAAA4zQfvo3hQAM","upper_bound":"A4AAKbf7lV8WA4AAAAAAAAAAA4zH9xrvXAAV","repeats":1},{"count":6346664,"lower_bound":"A4AAKbf7lV8WA4AAAAAAAAAAA4zMDrCJasAM","upper_bound":"A4AAKc94ym8WA4AAAAAAAAAAA42dzXk7Z4AD","repeats":1},{"count":6412200,"lower_bound":"A4AAKc94ym8WA4AAAAAAAAAAA42dzf4050AF","upper_bound":"A4AAKeDxYe8TA4AAAAAAAAABA40jwIet+8AN","repeats":1},{"count":6477736,"lower_bound":"A4AAKeDxYe8TA4AAAAAAAAABA40kLZ39e8AM","upper_bound":"A4AAKfhxbDcXA4AAAAAAAAAAA4vidsMXw0Ad","repeats":1},{"count":6543272,"lower_bound":"A4AAKfhxbDcXA4AAAAAAAAAAA4vjpST7AwAd","upper_bound":"A4AAKg8fKx8RA4AAAAAAAAAAA40Gd79JEYAN","repeats":1},{"count":6608808,"lower_bound":"A4AAKg8fKx8RA4AAAAAAAAAAA40GukgghMAO","upper_bound":"A4AAKiZO9McOA4AAAAAAAAAAA4zHpvqMFgAM","repeats":1},{"count":6674344,"lower_bound":"A4AAKiZO9McOA4AAAAAAAAAAA4zJi2F0noAM","upper_bound":"A4AAKjd9nL8XA4AAAAAAAAAAA4yi2UO5HsAM","repeats":1},{"count":6739880,"lower_bound":"A4AAKjd9nL8XA4AAAAAAAAAAA4ymUdfDHsAO","upper_bound":"A4AAKkycX8cQA4AAAAAAAAAAA4vJ8gEOcIAd","repeats":1},{"count":6805416,"lower_bound":"A4AAKkycX8cQA4AAAAAAAAAAA4vMn6n98IAf","upper_bound":"A4AAKmEgYjcUA4AAAAAAAAABA4wMyWK+jcAf","repeats":1},{"count":6846279,"lower_bound":"A4AAKmEgYjcUA4AAAAAAAAABA4wMyvJqzcAf","upper_bound":"A4AAKm5xwm8XA4AAAAAAAAABA40zg/5oG8AO","repeats":1},{"count":6911815,"lower_bound":"A4AAKm5xwm8XA4AAAAAAAAABA400u0Zc28AM","upper_bound":"A4AAKoFowP8VA4AAAAAAAAABA43BV15FP8AV","repeats":1},{"count":6977351,"lower_bound":"A4AAKoFowP8VA4AAAAAAAAABA43wruHm/8AO","upper_bound":"A4AAKpQMpt8PA4AAAAAAAAABA4vb0Q6l98Ad","repeats":1},{"count":7042887,"lower_bound":"A4AAKpQMpt8PA4AAAAAAAAABA4yVxtw3t8AO","upper_bound":"A4AAKqkhp3cRA4AAAAAAAAABA4yCmCR1ncAO","repeats":1},{"count":7108423,"lower_bound":"A4AAKqkhp3cRA4AAAAAAAAABA4yFw8fOXcAV","upper_bound":"A4AAKr6CMwcVA4AAAAAAAAAAA43glEhtXkAM","repeats":1},{"count":7173959,"lower_bound":"A4AAKr6CMwcVA4AAAAAAAAAAA43hkUjlXkAN","upper_bound":"A4AAKtawNTcPA4AAAAAAAAAAA417BdIaq8AN","repeats":1},{"count":7239495,"lower_bound":"A4AAKtawNTcPA4AAAAAAAAAAA417B0n9q8AV","upper_bound":"A4AAKuz2QOcXA4AAAAAAAAABA40FsbnFucAM","repeats":1},{"count":7305031,"lower_bound":"A4AAKuz2QOcXA4AAAAAAAAABA40IftOh+cAO","upper_bound":"A4AAKwD40GcNA4AAAAAAAAAAA4xSb4GUUcAM","repeats":1},{"count":7370567,"lower_bound":"A4AAKwD40GcNA4AAAAAAAAAAA4xScqdPGgAV","upper_bound":"A4AAKxRNg2cXA4AAAAAAAAAAA41SlUqW38AN","repeats":1},{"count":7436103,"lower_bound":"A4AAKxRNg2cXA4AAAAAAAAAAA41mOdvzbkAN","upper_bound":"A4AAKyfpWw8XA4AAAAAAAAABA411LwdDw8AN","repeats":1},{"count":7501639,"lower_bound":"A4AAKyfpWw8XA4AAAAAAAAABA411NZu2w8AV","upper_bound":"A4AAKzqPRscRA4AAAAAAAAAAA42JPSI3DkAV","repeats":1},{"count":7567175,"lower_bound":"A4AAKzqPRscRA4AAAAAAAAAAA42KY8TPAoAN","upper_bound":"A4AAK04Ak3cTA4AAAAAAAAABA42RFD3iHcAO","repeats":1},{"count":7632711,"lower_bound":"A4AAK04Ak3cTA4AAAAAAAAABA42RFGtXXcAM","upper_bound":"A4AAK2CkeNcVA4AAAAAAAAABA4yXNw87NcAV","repeats":1},{"count":7698247,"lower_bound":"A4AAK2CkeNcVA4AAAAAAAAABA4ycUq6CtcAN","upper_bound":"A4AAK3Yxdk8VA4AAAAAAAAAAA43cgocWVEAV","repeats":1},{"count":7763783,"lower_bound":"A4AAK3Yxdk8VA4AAAAAAAAAAA43dMccBYYAO","upper_bound":"A4AAK4z02h8RA4AAAAAAAAAAA42yGDTC6QAO","repeats":1},{"count":7829319,"lower_bound":"A4AAK4z02h8RA4AAAAAAAAABA4xwKSwvB8AV","upper_bound":"A4AAK6CEJ78UA4AAAAAAAAAAA4xl+MD3aoAN","repeats":1},{"count":7878626,"lower_bound":"A4AAK6CEJ78UA4AAAAAAAAAAA4xl+MVxCgAN","upper_bound":"A4AAK6+LaP8VA4AAAAAAAAABA4wgWV6nf8AO","repeats":1},{"count":7944162,"lower_bound":"A4AAK6+L/18OA4AAAAAAAAAAA4wfdqz/sUAN","upper_bound":"A4AAK8XJGZ8NA4AAAAAAAAABA4yDZ63Op8AV","repeats":1},{"count":8009698,"lower_bound":"A4AAK8XJHF8VA4AAAAAAAAABA4zCXvo/V8AV","upper_bound":"A4AAK93Efd8RA4AAAAAAAAAAA4wxB+9US4AO","repeats":1},{"count":8075234,"lower_bound":"A4AAK93Eif8WA4AAAAAAAAABA4wqol52f8AV","upper_bound":"A4AAK/aoPK8WA4AAAAAAAAABA4zay80Iq8AO","repeats":1},{"count":8140770,"lower_bound":"A4AAK/aoPK8WA4AAAAAAAAABA4zcqsBM68AV","upper_bound":"A4AALAp5hT8QA4AAAAAAAAAAA4xS2tYqFIAV","repeats":1},{"count":8206306,"lower_bound":"A4AALAp5hT8QA4AAAAAAAAAAA4xVBhwWIgAO","upper_bound":"A4AALCD7DRcNA4AAAAAAAAAAA4yE/JKrdkAM","repeats":1},{"count":8271842,"lower_bound":"A4AALCD7DRcNA4AAAAAAAAAAA4yFAVrCdkAV","upper_bound":"A4AALDnUzFcRA4AAAAAAAAABA4xBo+w9VcAM","repeats":1},{"count":8337378,"lower_bound":"A4AALDnVg1cVA4AAAAAAAAAAA4xWSfrs6AAO","upper_bound":"A4AALFAB+fcVA4AAAAAAAAAAA43Tc/SavAAN","repeats":1},{"count":8402914,"lower_bound":"A4AALFAB+fcVA4AAAAAAAAAAA43Xtnn5+YAO","upper_bound":"A4AALGeyZU8QA4AAAAAAAAABA4xNJvAek8AN","repeats":1},{"count":8468450,"lower_bound":"A4AALGeyZU8QA4AAAAAAAAABA41EX8XBU8AO","upper_bound":"A4AALHdWcy8TA4AAAAAAAAABA4ys3ljvC8AV","repeats":1},{"count":8533986,"lower_bound":"A4AALHdWcy8TA4AAAAAAAAABA4ytEahbi8AN","upper_bound":"A4AALIgH9KcRA4AAAAAAAAABA42Cf/SCacAO","repeats":1},{"count":8599522,"lower_bound":"A4AALIgIBscQA4AAAAAAAAABA4yg175NccAN","upper_bound":"A4AALJian78SA4AAAAAAAAAAA4yJ0FszNYAN","repeats":1},{"count":8665058,"lower_bound":"A4AALJian78SA4AAAAAAAAAAA4yM5q9A18AV","upper_bound":"A4AALKujcL8VA4AAAAAAAAABA43nL4Udr8AV","repeats":1},{"count":8730594,"lower_bound":"A4AALKujcL8VA4AAAAAAAAABA4336Yzm78AN","upper_bound":"A4AALLz5jC8NA4AAAAAAAAABA4zlJJJ4i8AM","repeats":1},{"count":8796130,"lower_bound":"A4AALLz5jC8NA4AAAAAAAAABA4zlJK3fy8AM","upper_bound":"A4AALNAySQcOA4AAAAAAAAABA4zKvmVFQcAN","repeats":1},{"count":8861666,"lower_bound":"A4AALNAySQcOA4AAAAAAAAABA4zQ4zMmQcAN","upper_bound":"A4AALOQCPn8XA4AAAAAAAAABA41/mpecX8AO","repeats":1},{"count":8927202,"lower_bound":"A4AALOQCSXcRA4AAAAAAAAAAA4xuuqjsPAAN","upper_bound":"A4AALPSTlJ8UA4AAAAAAAAABA4yCqUb058AN","repeats":1},{"count":8992738,"lower_bound":"A4AALPSTnq8XA4AAAAAAAAABA4xydv0sq8AM","upper_bound":"A4AALQUB2r8WA4AAAAAAAAABA40B8o1478AO","repeats":1},{"count":9058274,"lower_bound":"A4AALQUB8CcTA4AAAAAAAAABA4x0b0VdCcAO","upper_bound":"A4AALRf4PpcTA4AAAAAAAAABA42hXJkWJcAO","repeats":1},{"count":9123810,"lower_bound":"A4AALRf4RFcTA4AAAAAAAAAAA42MaEGvZUAO","upper_bound":"A4AALSsd/icRA4AAAAAAAAABA43xXVHDicAM","repeats":1},{"count":9189346,"lower_bound":"A4AALSsd/icRA4AAAAAAAAABA44FSM7ricAM","upper_bound":"A4AALS6Dy28SA4AAAAAAAAAAA4yYiaME0cAO","repeats":1},{"count":9254882,"lower_bound":"A4AALS6Dy28SA4AAAAAAAAAAA4yZaPUercAM","upper_bound":"A4AALUHzt58PA4AAAAAAAAABA4yV152sp8AM","repeats":1},{"count":9320418,"lower_bound":"A4AALUHzt58PA4AAAAAAAAABA4yV3CK358AV","upper_bound":"A4AALVTn6pcNA4AAAAAAAAABA4093jGWZcAN","repeats":1},{"count":9385954,"lower_bound":"A4AALVTn6pcNA4AAAAAAAAABA43FxqjC5cAM","upper_bound":"A4AALWXmfR8TA4AAAAAAAAAAA4yav4IlY0AO","repeats":1},{"count":9428761,"lower_bound":"A4AALWXncDcXA4AAAAAAAAAAA4y2COqSlIAN","upper_bound":"A4AALXD3CBcNA4AAAAAAAAABA4075wsGRcAO","repeats":1},{"count":9494297,"lower_bound":"A4AALXD3CBcNA4AAAAAAAAABA41DsEhGRcAN","upper_bound":"A4AALYPdKc8UA4AAAAAAAAABA42BJs4is8AO","repeats":1},{"count":9559833,"lower_bound":"A4AALYPdKc8UA4AAAAAAAAABA42BLRNOc8AV","upper_bound":"A4AALZUGmG8QA4AAAAAAAAAAA40xlXc9cgAN","repeats":1},{"count":9625369,"lower_bound":"A4AALZUGmG8QA4AAAAAAAAABA40l9m1eW8AV","upper_bound":"A4AALaWA3B8OA4AAAAAAAAAAA43zrWR0ZUAV","repeats":1},{"count":9690905,"lower_bound":"A4AALaWA3B8OA4AAAAAAAAAAA433W600X0AM","upper_bound":"A4AALbeM8p8PA4AAAAAAAAAAA4yiuSO5YQAN","repeats":1},{"count":9756441,"lower_bound":"A4AALbeM8p8PA4AAAAAAAAAAA4yjcK7WvQAO","upper_bound":"A4AALcjH/6cOA4AAAAAAAAAAA4ytnp4RbQAV","repeats":1},{"count":9821977,"lower_bound":"A4AALcjH/6cOA4AAAAAAAAAAA4ytu3RDzsAN","upper_bound":"A4AALdxqII8PA4AAAAAAAAABA4yqSsZXo8AO","repeats":1},{"count":9887513,"lower_bound":"A4AALdxqII8PA4AAAAAAAAABA4yqTbNYI8AO","upper_bound":"A4AALfIF3ccTA4AAAAAAAAABA41vZA35scAO","repeats":1},{"count":9953049,"lower_bound":"A4AALfIF3ccTA4AAAAAAAAABA4150o69scAO","upper_bound":"A4AALgUhkpcTA4AAAAAAAAABA4y00PSHpcAM","repeats":1},{"count":10018585,"lower_bound":"A4AALgUjA/cXA4AAAAAAAAABA4y0fIYfvcAO","upper_bound":"A4AALhX5UMcQA4AAAAAAAAABA41a8X/4scAO","repeats":1},{"count":10084121,"lower_bound":"A4AALhX5UMcQA4AAAAAAAAABA41a8aFwMcAN","upper_bound":"A4AALif3xZcWA4AAAAAAAAABA40fDwT4JcAV","repeats":1},{"count":10149657,"lower_bound":"A4AALif3xZcWA4AAAAAAAAABA40gRXJWJcAM","upper_bound":"A4AALjpcWdcTA4AAAAAAAAABA4zB0go99cAO","repeats":1},{"count":10215193,"lower_bound":"A4AALjpcWdcTA4AAAAAAAAABA4zB2qj7NcAV","upper_bound":"A4AALk0H8U8QA4AAAAAAAAABA4037Y9X08AM","repeats":1},{"count":10235198,"lower_bound":"A4AALk0H8U8QA4AAAAAAAAABA41VNMz408AO","upper_bound":"A4AL+w4mQV+AA4AAAAAAAAABA4zv72YcV8AN","repeats":1},{"count":10300734,"lower_bound":"A4AL+xpIgl8AA4AAAAAAAAAAA4zRIl7B/MAV","upper_bound":"A4AQndCuRG8AA4AAAAAAAAAAA4zv1ZMNFkAV","repeats":1},{"count":10366270,"lower_bound":"A4AQndCuRG8AA4AAAAAAAAABA4zM4iCym8AO","upper_bound":"A4AVlbsLwt+AA4AAAAAAAAABA41GReImt8AM","repeats":1},{"count":10431806,"lower_bound":"A4AVlgYLAccAA4AAAAAAAAABA4zRwD/J8cAN","upper_bound":"A4AaJpA1QceAA4AAAAAAAAABA439InbUscAV","repeats":1},{"count":10497342,"lower_bound":"A4AaJpA1QceAA4AAAAAAAAABA44HLxwCccAV","upper_bound":"A4AfiK3xQ1eAA4AAAAAAAAABA42vKqs2VcAV","repeats":1},{"count":10562878,"lower_bound":"A4AfiK3xQ1eAA4AAAAAAAAABA422/CJDlcAM","upper_bound":"A4AlOo7LAYeAA4AAAAAAAAABA4zhO50eYcAM","repeats":1},{"count":10628414,"lower_bound":"A4AlOo7LAYeAA4AAAAAAAAABA4zv8N7VIcAO","upper_bound":"A4AqZmmAwleAA4AAAAAAAAABA40aicpb1cAM","repeats":1},{"count":10693950,"lower_bound":"A4AqZmmAwleAA4AAAAAAAAABA40g13anlcAN","upper_bound":"A4AwNeSJwocAA4AAAAAAAAAAA43yxitOaoAM","repeats":1},{"count":10759486,"lower_bound":"A4AwNeSJwocAA4AAAAAAAAAAA43yyt7kjUAV","upper_bound":"A4A2bPr2QdeAA4AAAAAAAAAAA406It2cUAAV","repeats":1},{"count":10825022,"lower_bound":"A4A2bPr2QdeAA4AAAAAAAAAAA406Ja574MAV","upper_bound":"A4A76qAVgReAA4AAAAAAAAABA40iWzQKxcAV","repeats":1},{"count":10890558,"lower_bound":"A4A76qAVgReAA4AAAAAAAAABA40izhLnhcAN","upper_bound":"A4BB1I0pQe8AA4AAAAAAAAAAA4z93IL5f8AN","repeats":1},{"count":10956094,"lower_bound":"A4BB1I0pQe8AA4AAAAAAAAAAA4z93ZcTRkAV","upper_bound":"A4BIRVgXwI+AA4AAAAAAAAAAA40E5sY/DoAV","repeats":1},{"count":11021630,"lower_bound":"A4BIRVgXwI+AA4AAAAAAAAAAA40E6GOuzoAO","upper_bound":"A4BOouEmwmeAA4AAAAAAAAABA40K0rHgGcAO","repeats":1},{"count":11087166,"lower_bound":"A4BOovakwbeAA4AAAAAAAAABA41JmRck7cAM","upper_bound":"A4BS8a83Qz8AA4AAAAAAAAABA44CJmT9j8AN","repeats":1},{"count":11152702,"lower_bound":"A4BS8a83Qz8AA4AAAAAAAAABA44CKj/tT8AV","upper_bound":"A4BZV8bLQPeAA4AAAAAAAAAAA43tb+IxJAAN","repeats":1},{"count":11218238,"lower_bound":"A4BZV8bLQPeAA4AAAAAAAAAAA43t1IPGxYAM","upper_bound":"A4Bgmg42gT8AA4AAAAAAAAABA40loz+kj8AM","repeats":1},{"count":11283774,"lower_bound":"A4Bgmg42gT8AA4AAAAAAAAABA40lo09Kz8AN","upper_bound":"A4BnHaHaQfcAA4AAAAAAAAABA406SaxoPcAO","repeats":1},{"count":11349310,"lower_bound":"A4BnHaHaQfcAA4AAAAAAAAABA406TLVAfcAM","upper_bound":"A4BspkV3wleAA4AAAAAAAAAAA40wVJ31MwAM","repeats":1},{"count":11414846,"lower_bound":"A4BspkV3wleAA4AAAAAAAAAAA40w/uUADUAN","upper_bound":"A4Bwlaz+Am8AA4AAAAAAAAABA41+bq5Qm8AV","repeats":1},{"count":11430609,"lower_bound":"A4BwlbVQgxcAA4AAAAAAAAAAA40tNXXd/QAM","upper_bound":"A4BxzX6Kwi8AA4AAAAAAAAABA42x7Mday8AN","repeats":1},{"count":11496145,"lower_bound":"A4BxzX6Kwi8AA4AAAAAAAAABA424ZPrBC8AO","upper_bound":"A4Bz0TUZQUeAA4AAAAAAAAABA43Vc45F0cAM","repeats":1},{"count":11561681,"lower_bound":"A4Bz0TUZQUeAA4AAAAAAAAABA43WrihDkcAO","upper_bound":"A4B6gSlvQ88AA4AAAAAAAAABA41NtB0Zs8AO","repeats":1},{"count":11627217,"lower_bound":"A4B6gSlvQ88AA4AAAAAAAAABA41NtEJEc8AN","upper_bound":"A4CALCKeQhcAA4AAAAAAAAABA410VitZhcAV","repeats":1},{"count":11692753,"lower_bound":"A4CALHSEQfeAA4AAAAAAAAAAA44E3B3yCsAN","upper_bound":"A4CGaivCBD+AA4AAAAAAAAAAA44DWms0woAV","repeats":1},{"count":11758289,"lower_bound":"A4CGaivCBD+AA4AAAAAAAAAAA44DZNg1QQAN","upper_bound":"A4CK7oL4Q3+AA4AAAAAAAAAAA416w/1J2cAO","repeats":1},{"count":11823825,"lower_bound":"A4CK7oL4Q3+AA4AAAAAAAAAAA416xSQZIEAN","upper_bound":"A4CRNqLkw8+AA4AAAAAAAAAAA424WVKi30AO","repeats":1},{"count":11889361,"lower_bound":"A4CRNqLkw8+AA4AAAAAAAAAAA425uoRMqUAO","upper_bound":"A4CX0jt3AM+AA4AAAAAAAAAAA43V2iL37QAM","repeats":1},{"count":11954897,"lower_bound":"A4CX0jt3AM+AA4AAAAAAAAAAA43XiT5h7QAN","upper_bound":"A4Cf+XwMg9+AA4AAAAAAAAABA42iTv8dN8AM","repeats":1},{"count":12020433,"lower_bound":"A4Cf+XwMg9+AA4AAAAAAAAABA42jwDJRt8AM","upper_bound":"A4CqQQxAQ0eAA4AAAAAAAAAAA41mRpJtqIAO","repeats":1},{"count":12027078,"lower_bound":"A4CqQQxAQ0eAA4AAAAAAAAAAA41mRwlN/AAV","upper_bound":"A4CrHvfAQw8AA4AAAAAAAAABA41oH9Kkw8AM","repeats":1},{"count":12092614,"lower_bound":"A4CrHvfAQw8AA4AAAAAAAAABA41ope/ug8AO","upper_bound":"A4CwuX8hQp8AA4AAAAAAAAABA43nLQ0NZ8AV","repeats":1},{"count":12158150,"lower_bound":"A4CwuX8hQp8AA4AAAAAAAAABA43nLmrKJ8AM","upper_bound":"A4C2IkUfA2cAA4AAAAAAAAAAA42R7C1PPkAN","repeats":1},{"count":12223686,"lower_bound":"A4C2IkUfA2cAA4AAAAAAAAAAA42SIpNYH4AN","upper_bound":"A4C7TcbIgneAA4AAAAAAAAABA42enxQfncAV","repeats":1},{"count":12289222,"lower_bound":"A4C7TcbIgneAA4AAAAAAAAABA42fwrG9ncAO","upper_bound":"A4DBLldegVeAA4AAAAAAAAABA43m26U51cAO","repeats":1},{"count":12354758,"lower_bound":"A4DBLl44QQeAA4AAAAAAAAAAA43qqYrkjIAV","upper_bound":"A4DGH73twq8AA4AAAAAAAAABA42CIMHE68AV","repeats":1},{"count":12420294,"lower_bound":"A4DGH73twq8AA4AAAAAAAAABA42UXOkL68AM","upper_bound":"A4DLrcguw08AA4AAAAAAAAAAA42qK47qYkAN","repeats":1},{"count":12485830,"lower_bound":"A4DLrcguw08AA4AAAAAAAAAAA44B0cIfLkAM","upper_bound":"A4DRB6OIgx+AA4AAAAAAAAAAA42hMzQSUAAV","repeats":1},{"count":12551366,"lower_bound":"A4DRB6OIgx+AA4AAAAAAAAABA42NEdpwh8AN","upper_bound":"A4DXG87kBG+AA4AAAAAAAAAAA42Uj83nhoAO","repeats":1},{"count":12616902,"lower_bound":"A4DXG+ZHwV+AA4AAAAAAAAABA42THHjKl8AV","upper_bound":"A4DdWrfZQ08AA4AAAAAAAAABA43Bb/tzk8AM","repeats":1},{"count":12682438,"lower_bound":"A4DdWrfZQ08AA4AAAAAAAAABA43BcPCaE8AM","upper_bound":"A4Dieg5QgKcAA4AAAAAAAAAAA426xhtIWQAN","repeats":1},{"count":12747974,"lower_bound":"A4Dieg5QgKcAA4AAAAAAAAAAA43Djqyf/wAN","upper_bound":"A4DmOPr2QVeAA4AAAAAAAAABA42iOpGU1cAD","repeats":1},{"count":12813510,"lower_bound":"A4DmOPr2QVeAA4AAAAAAAAABA42iO9ODVcAE","upper_bound":"A4DqxTChBl+AA4AAAAAAAAABA43KYJPzV8AM","repeats":1},{"count":12879046,"lower_bound":"A4DqxTExQi8AA4AAAAAAAAAAA42pPAtmnsAV","upper_bound":"A4DvyuP/gU8AA4AAAAAAAAABA43bKE1u08AM","repeats":1},{"count":12944582,"lower_bound":"A4DvyuP/gU8AA4AAAAAAAAABA43eMHgZk8AV","upper_bound":"A4D1lAS4greAA4AAAAAAAAABA433HnX/7cAM","repeats":1},{"count":13010118,"lower_bound":"A4D1lAS4greAA4AAAAAAAAABA4335oLRrcAV","upper_bound":"A4D7QDzDhk8AA4AAAAAAAAAAA43AIQlVDYAM","repeats":1},{"count":13075654,"lower_bound":"A4D7QDzDhk8AA4AAAAAAAAAAA43AZBV3ZIAO","upper_bound":"A4EA+rkehY+AA4AAAAAAAAAAA43hjdiYTgAM","repeats":1},{"count":13141190,"lower_bound":"A4EA+rkehY+AA4AAAAAAAAAAA43nMMI5JgAN","upper_bound":"A4EGizx0Qk8AA4AAAAAAAAAAA43D2hvmpYAV","repeats":1},{"count":13206726,"lower_bound":"A4EGizx0Qk8AA4AAAAAAAAAAA43D2pGCpYAM","upper_bound":"A4EM547rxAeAA4AAAAAAAAABA43+SNgigcAV","repeats":1},{"count":13272262,"lower_bound":"A4EM547rxAeAA4AAAAAAAAABA43+SOZ2QcAO","upper_bound":"A4ET5xLtAl8AA4AAAAAAAAABA43rAlLmV8AV","repeats":1},{"count":13337605,"lower_bound":"A4ET5xqvhT+AA4AAAAAAAAABA43P6SrnD8AC","upper_bound":"A4EbT9K0Be+AA4AAAAAAAAABA437mBX/O8AN","repeats":1},{"count":13403141,"lower_bound":"A4EbT93ZBL8AA4AAAAAAAAABA43XUK30b8AO","upper_bound":"A4EjVGn6RNeAA4AAAAAAAAABA43fV/YFtcQN","repeats":1},{"count":13468677,"lower_bound":"A4EjVGn6RNeAA4AAAAAAAAABA43fV/YFtcYN","upper_bound":"A4EslmGMAteAA4AAAAAAAAABA434iTUd9cAO","repeats":1},{"count":13534213,"lower_bound":"A4EslmGMAteAA4AAAAAAAAABA434jxttNcAM","upper_bound":"A4E2IVZwRE8AA4AAAAAAAAAAA43yKIJ2doAN","repeats":1},{"count":13599749,"lower_bound":"A4E2IVZwRE8AA4AAAAAAAAAAA43yKTHYbUAM","upper_bound":"A4E/xw1vBX+AA4AAAAAAAAABA437yQtcn8AO","repeats":1},{"count":13665285,"lower_bound":"A4E/xw1vBX+AA4AAAAAAAAABA437yTQg38AN","upper_bound":"A4FLdycbAT+AA4AAAAAAAAABA44HfOxpT8AO","repeats":1},{"count":13668897,"lower_bound":"A4FLdycbAT+AA4AAAAAAAAABA44Ic0xfj8AN","upper_bound":"A4FM/g3pwt8AA4AAAAAAAAABA44I/+kO98AO","repeats":1}]},"cm_sketch":{"rows":[{"counters":[6774,6700,6697,6576,6468,6673,6697,6693,6689,6763,6594,6712,6504,6607,6663,6564,6758,6784,6563,6622,6601,6503,6705,6614,6737,6543,6739,6661,6771,6809,6641,6503,6708,6686,6780,6738,6614,6431,6783,6696,6623,6618,6601,6758,6664,6694,6596,6720,6755,6693,6664,6503,6695,6542,6665,6681,6671,6713,6613,6627,6681,6751,6681,6737,6598,6583,6648,6599,6784,6705,6747,6777,6568,6696,6644,6577,6640,6637,6622,6673,6720,6707,6710,6652,6730,6688,6693,6692,6537,6707,6606,6661,6733,6740,6697,6710,6627,6739,6580,6721,6684,6705,6716,6631,6789,6581,6563,6629,6674,6604,6757,6643,6654,6622,6657,6591,6735,6630,6669,6713,6779,6849,6639,6564,6826,6654,6592,6513,6658,6702,6674,6674,6604,6708,6598,6589,6573,6726,6623,6613,6646,6810,6723,6774,6829,6712,6668,6602,6659,6664,6637,6749,6756,6585,6740,6585,6713,6594,6672,6607,6603,6562,6746,6753,6727,6653,6732,6731,6672,6558,6709,6688,6701,6649,6531,6820,6495,6677,6670,6776,6876,6762,6722,6722,6552,6710,6756,6663,6788,6566,6546,6682,6783,6774,6754,6746,6782,6705,6567,6677,6746,6716,6576,6764,6840,6594,6562,6758,6632,6740,6607,6729,6624,6552,6690,6814,6592,6653,6598,6640,6633,6788,6665,6632,6543,6492,6632,6599,6778,6799,6571,6604,6815,6608,6771,6714,6554,6571,6642,6669,6635,6723,6649,6721,6753,6674,6599,6741,6658,6564,6629,6575,6714,6647,6541,6607,6702,6557,6646,6649,6653,6756,6694,6698,6655,6597,6672,6764,6665,6641,6599,6629,6623,6731,6551,6696,6756,6519,6773,6741,6711,6797,6725,6550,6668,6672,6770,6509,6560,6656,6547,6683,6645,6674,6599,6623,6752,6595,6675,6532,6621,6611,6648,6740,6702,6611,6803,6627,6832,6683,6711,6653,6624,6655,6578,6717,6730,6493,6695,6634,6587,6663,6536,6572,6593,6501,6601,6567,6617,6554,6698,6785,6573,6605,6610,6560,6559,6669,6646,6621,6739,6633,6607,6809,6554,6673,6727,6753,6802,6737,6627,6626,6697,6785,6767,6665,6681,6751,6592,6642,6722,6715,6710,6732,6732,6646,6785,6640,6809,6695,6687,6762,6532,6897,6636,6725,6802,6672,6567,6758,6817,6657,6675,6784,6541,6550,6758,6656,6644,6774,6678,6682,6691,6592,6646,6562,6631,6645,6654,6505,6736,6544,6674,6629,6536,6757,6551,6493,6645,6829,6614,6712,6806,6597,6688,6615,6585,6676,6634,6838,6595,6607,6638,6697,6625,6722,6646,6753,6695,6724,6608,6633,6690,6796,6613,6734,6777,6757,6712,6743,6731,6821,6633,6704,6722,6694,6693,6608,6538,6826,6870,6857,6746,6798,6642,6756,6682,6501,6739,6762,6632,6614,6853,6705,6681,6569,6611,6641,6695,6734,6660,6613,6650,6570,6665,6748,6678,6839,6709,6722,6766,6567,6797,6705,6698,6551,6677,6893,6717,6703,6771,6596,6513,6554,6599,6492,6760,6568,6720,6688,6603,6637,6680,6711,6585,6610,6726,6556,6867,6781,6740,6617,6699,6692,6690,6754,6651,6581,6766,6622,6720,6622,6635,6777,6633,6538,6652,6767,6710,6692,6795,6766,6632,6813,6716,6600,6759,6731,6751,6585,6880,6780,6675,6835,6768,6621,6570,6739,6735,6788,6745,6652,6663,6707,6559,6714,6604,6876,6719,6721,6643,6728,6595,6794,6678,6733,6692,6728,6681,6705,6680,6653,6794,6695,6647,6624,6762,6692,6700,6689,6583,6677,6667,6658,6537,6693,6699,6761,6644,6692,6756,6572,6663,6900,6699,6581,6713,6708,6589,6626,6636,6659,6622,6823,6706,6743,6619,6777,6606,6601,6829,6665,6752,6556,6592,6618,6726,6646,6566,6660,6614,6781,6763,6739,6713,6654,6757,6664,6625,6817,6687,6746,6608,6661,6640,6691,6649,6843,6695,6737,6848,6632,6621,6656,6679,6740,6539,6585,6733,6799,6655,6873,6489,6680,6664,6512,6649,6644,6648,6679,6570,6577,6684,6684,6563,6547,6701,6663,6660,6668,6632,6769,6627,6575,6778,6791,6620,6651,6574,6642,6597,6586,6687,6637,6620,6660,6729,6595,6699,6698,6785,6696,6687,6663,6792,6773,6627,6760,6600,6679,6638,6752,6546,6694,6618,6776,6674,6666,6545,6719,6600,6772,6637,6727,6822,6621,6623,6570,6657,6726,6614,6598,6687,6474,6670,6769,6534,6654,6822,6663,6685,6818,6708,6517,6849,6711,6651,6678,6686,6661,6663,6609,6759,6839,6762,6733,6652,6745,6634,6622,6535,6789,6611,6684,6546,6765,6625,6882,6593,6537,6660,6682,6670,6603,6603,6711,6651,6806,6884,6789,6574,6585,6723,6712,6700,6685,6679,6737,6802,6717,6660,6686,6544,6571,6620,6717,6668,6670,6694,6630,6634,6617,6783,6721,6620,6748,6618,6835,6708,6649,6769,6718,6552,6632,6670,6577,6591,6581,6775,6661,6778,6583,6584,6748,6696,6623,6797,6580,6686,6742,6762,6596,6671,6635,6715,6695,6512,6756,6681,6730,6545,6657,6601,6635,6756,6605,6734,6633,6592,6678,6856,6859,6800,6705,6666,6786,6603,6545,6661,6665,6577,6831,6693,6594,6623,6619,6710,6679,6670,6695,6588,6546,6691,6723,6605,6762,6634,6707,6642,6655,6586,6570,6559,6768,6594,6718,6697,6687,6703,6776,6779,6831,6790,6600,6759,6682,6490,6764,6625,6669,6700,6761,6674,6490,6615,6636,6567,6460,6697,6750,6765,6682,6745,6672,6789,6579,6730,6679,6637,6502,6596,6674,6705,6814,6661,6731,6647,6796,6501,6608,6714,6674,6754,6712,6580,6718,6606,6584,6725,6574,6623,6666,6660,6523,6694,6744,6875,6691,6784,6595,6524,6637,6576,6732,6635,6704,6714,6683,6726,6697,6717,6623,6836,6621,6555,6675,6616,6624,6638,6739,6664,6699,6594,6658,6832,6670,6708,6668,6742,6737,6511,6868,6605,6671,6563,6752,6709,6765,6705,6824,6605,6720,6617,6613,6554,6632,6737,6669,6554,6660,6806,6509,6671,6655,6581,6648,6640,6718,6690,6637,6704,6711,6584,6848,6838,6644,6631,6705,6545,6680,6586,6783,6667,6879,6670,6600,6547,6659,6543,6792,6660,6602,6654,6699,6665,6620,6708,6697,6600,6783,6666,6656,6658,6768,6792,6688,6688,6668,6716,6636,6483,6687,6678,6662,6696,6712,6687,6652,6649,6718,6647,6753,6600,6581,6673,6777,6713,6721,6708,6701,6810,6598,6723,6735,6675,6609,6674,6673,6733,6757,6572,6655,6644,6693,6763,6520,6622,6656,6653,6737,6668,6694,6663,6669,6566,6622,6623,6744,6811,6562,6798,6586,6757,6680,6720,6665,6717,6708,6599,6747,6739,6698,6850,6696,6753,6787,6725,6606,6437,6736,6582,6659,6668,6657,6538,6707,6720,6670,6599,6747,6618,6618,6757,6840,6628,6598,6582,6614,6753,6798,6467,6631,6826,6620,6568,6615,6648,6658,6602,6748,6773,6646,6620,6668,6732,6672,6752,6705,6905,6690,6821,6438,6825,6859,6582,6616,6551,6698,6832,6688,6658,6780,6648,6762,6597,6637,6697,6595,6571,6802,6724,6846,6695,6664,6586,6625,6729,6635,6701,6653,6549,6631,6663,6703,6739,6587,6755,6629,6858,6564,6684,6735,6707,6646,6621,6553,6770,6875,6718,6785,6797,6681,6703,6748,6793,6751,6738,6614,6718,6666,6645,6643,6800,6577,6680,6498,6724,6605,6764,6674,6688,6654,6646,6745,6791,6700,6580,6602,6681,6669,6500,6591,6671,6622,6671,6636,6690,6559,6600,6774,6659,6610,6759,6683,6598,6751,6592,6586,6557,6699,6611,6606,6741,6759,6534,6708,6696,6638,6629,6578,6663,6821,6693,6639,6666,6644,6725,6661,6528,6717,6693,6778,6733,6590,6572,6616,6750,6571,6681,6755,6769,6686,6755,6666,6670,6573,6697,6673,6752,6477,6539,6694,6635,6687,6549,6656,6542,6754,6783,6772,6667,6924,6719,6646,6723,6722,6693,6531,6497,6662,6673,6624,6800,6708,6778,6735,6658,6723,6721,6660,6649,6681,6576,6687,6731,6788,6635,6736,6801,6689,6788,6716,6611,6750,6623,6463,6612,6634,6768,6670,6646,6651,6796,6678,6719,6740,6600,6564,6661,6616,6596,6678,6660,6688,6553,6578,6552,6654,6652,6602,6428,6670,6577,6758,6751,6573,6700,6660,6619,6709,6765,6675,6623,6784,6759,6562,6678,6602,6618,6723,6783,6737,6729,6550,6812,6633,6775,6726,6619,6764,6767,6690,6695,6783,6865,6612,6714,6702,6598,6695,6602,6820,6639,6689,6636,6565,6804,6671,6632,6705,6542,6623,6682,6604,6674,6603,6555,6647,6776,6721,6641,6560,6542,6735,6530,6736,6642,6496,6661,6689,6613,6762,6541,6753,6728,6710,6691,6720,6597,6722,6631,6650,6568,6630,6652,6646,6551,6606,6648,6753,6567,6653,6624,6761,6621,6648,6587,6664,6808,6777,6692,6792,6709,6719,6653,6541,6529,6696,6626,6698,6688,6625,6592,6736,6722,6599,6723,6817,6715,6799,6803,6729,6619,6739,6721,6725,6750,6757,6572,6740,6671,6724,6710,6710,6832,6628,6702,6650,6504,6710,6672,6709,6647,6613,6640,6703,6725,6666,6692,6764,6657,6705,6619,6698,6674,6659,6590,6650,6644,6574,6559,6690,6653,6540,6627,6788,6876,6718,6771,6859,6592,6641,6633,6575,6845,6625,6644,6685,6646,6720,6691,6643,6708,6669,6706,6677,6824,6728,6719,6650,6667,6689,6574,6763,6770,6642,6529,6715,6633,6562,6685,6749,6717,6801,6773,6757,6713,6661,6711,6661,6695,6720,6684,6668,6719,6623,6667,6624,6714,6682,6650,6622,6733,6681,6604,6670,6570,6645,6584,6686,6743,6726,6612,6698,6738,6556,6588,6715,6584,6778,6628,6647,6746,6814,6794,6661,6559,6637,6737,6699,6695,6719,6621,6714,6645,6761,6702,6540,6661,6678,6690,6765,6601,6833,6668,6836,6627,6689,6542,6606,6878,6602,6703,6501,6662,6696,6729,6519,6623,6699,6663,6631,6767,6865,6651,6712,6816,6656,6727,6770,6650,6773,6659,6769,6753,6549,6826,6782,6802,6684,6659,6775,6743,6713,6672,6650,6550,6584,6669,6606,6738,6650,6641,6575,6793,6608,6538,6775,6680,6788,6754,6757,6452,6673,6779,6704,6611,6615,6629,6614,6861,6690,6660,6642,6623,6752,6589,6655,6727,6668,6651,6660,6622,6755,6689,6705,6779,6558,6676,6676,6594,6628,6676,6560,6640,6642,6644,6733,6688,6686,6595,6693,6621,6660,6784,6615,6685,6647,6768,6653,6692,6689,6693,6710,6717,6656,6561,6737,6655,6696,6864,6736,6644,6515,6758,6692,6743,6647,6764,6747,6681,6624,6636,6708,6601,6642,6661,6751,6810,6641,6771,6710,6667,6795,6698,6688,6554,6756,6779,6720,6664,6530,6613,6778,6621,6691,6671,6832,6700,6894,6715,6700,6648,6764,6580,6548,6563,6660,6687,6588,6800,6583,6812,6733,6636,6694,6712,6753,6791,6616,6670,6668,6672,6705,6628,6688,6678,6571,6681,6667,6804,6592,6730,6693,6529,6550,6487,6603,6635,6578,6612,6696,6619,6748,6725,6577,6814,6674,6548,6606,6728,6649,6735,6705,6752,6896,6566,6490,6766,6626,6500,6706,6774,6547,6502,6699,6574,6595,6738,6646,6652,6673,6678,6682,6704,6674,6568,6570,6641,6572,6777,6568,6686,6737,6671,6505,6658,6632,6680,6656,6554,6513,6719,6582,6641,6729,6693,6687,6718,6716,6730,6510,6643,6680,6660,6658,6674,6727,6736,6764,6650,6736,6683,6714,6617,6760,6831,6530,6541,6684,6669,6715,6641,6786,6680,6603,6855,6702,6570,6632,6795,6770,6611,6664,6696,6566,6762,6634,6607,6661,6791,6721,6766,6626,6690,6759,6662,6606,6585,6717,6732,6776,6679,6671,6690,6725,6729,6711,6671,6649,6568,6612,6619,6696,6631,6731,6686,6737,6871,6795,6794,6772,6810,6751,6677,6672,6580,6710,6649,6774,6699,6678,6692,6596,6662,6657,6512,6636,6484,6762,6738,6689,6802,6672,6621,6496,6597,6621,6437,6676,6653,6556,6582,6799,6661,6698,6673,6600,6641,6658,6634,6663,6719,6690,6656,6609,6715,6750,6641,6714,6703,6721,6687,6657,6648,6635,6779,6735,6747,6788,6617,6712,6522,6809,6662,6626,6590,6712,6913,6625,6564,6702,6537,6669,6660,6666,6657,6688,6709,6681,6585,6530,6592,6773,6715,6603,6526,6698,6841,6767,6648,6626,6666,6612,6506,6684,6618,6589]},{"counters":[6449,6686,6664,6586,6871,6689,6573,6714,6763,6751,6847,6572,6685,6554,6602,6733,6650,6677,6699,6579,6669,6524,6728,6780,6610,6562,6593,6646,6486,6728,6714,6695,6734,6579,6566,6793,6704,6664,6572,6764,6617,6547,6696,6703,6708,6612,6813,6707,6731,6547,6638,6659,6621,6722,6543,6546,6738,6648,6684,6653,6633,6755,6639,6681,6711,6570,6721,6675,6603,6678,6698,6775,6686,6705,6845,6809,6768,6659,6607,6732,6739,6757,6669,6828,6712,6560,6697,6669,6753,6652,6622,6682,6512,6752,6656,6735,6851,6723,6612,6697,6564,6680,6729,6694,6758,6698,6520,6548,6709,6608,6645,6614,6589,6589,6649,6581,6748,6659,6717,6637,6641,6621,6662,6543,6796,6697,6750,6648,6574,6646,6726,6682,6590,6600,6706,6670,6782,6684,6743,6718,6690,6729,6671,6864,6556,6797,6448,6730,6661,6759,6608,6668,6749,6620,6607,6733,6588,6545,6679,6684,6820,6689,6713,6591,6720,6692,6672,6578,6754,6706,6559,6613,6615,6747,6681,6598,6785,6723,6689,6750,6831,6584,6641,6751,6664,6692,6571,6687,6591,6800,6631,6566,6646,6563,6477,6673,6690,6660,6710,6563,6612,6492,6689,6570,6766,6611,6580,6625,6754,6736,6533,6593,6738,6612,6694,6679,6596,6702,6839,6478,6684,6587,6609,6598,6830,6653,6654,6578,6718,6801,6628,6743,6763,6715,6773,6702,6773,6708,6639,6795,6539,6507,6633,6659,6763,6609,6732,6595,6656,6644,6770,6714,6741,6723,6672,6630,6649,6797,6596,6725,6651,6772,6599,6699,6622,6639,6685,6757,6739,6655,6634,6638,6735,6718,6602,6738,6759,6752,6716,6737,6802,6677,6784,6642,6506,6837,6724,6599,6600,6766,6606,6614,6817,6625,6715,6818,6595,6581,6736,6660,6677,6672,6770,6662,6624,6588,6758,6462,6779,6693,6640,6551,6593,6767,6625,6697,6575,6653,6785,6743,6677,6638,6654,6679,6532,6627,6648,6828,6730,6561,6716,6661,6569,6707,6791,6658,6478,6638,6512,6628,6532,6578,6611,6708,6707,6749,6710,6573,6717,6691,6530,6801,6744,6706,6686,6536,6605,6721,6711,6484,6711,6359,6846,6612,6718,6698,6622,6649,6708,6809,6818,6735,6585,6696,6723,6631,6588,6575,6562,6611,6752,6629,6723,6856,6727,6762,6720,6762,6698,6633,6705,6672,6639,6550,6605,6566,6740,6748,6758,6497,6661,6635,6626,6562,6845,6646,6570,6815,6695,6727,6601,6631,6652,6862,6601,6708,6602,6644,6715,6735,6657,6612,6853,6686,6576,6590,6718,6669,6782,6603,6568,6720,6705,6582,6629,6824,6697,6419,6673,6651,6562,6755,6693,6663,6759,6780,6739,6717,6682,6685,6473,6729,6685,6720,6599,6601,6762,6641,6584,6593,6666,6669,6720,6623,6693,6870,6505,6750,6467,6567,6646,6623,6698,6756,6702,6748,6603,6691,6680,6753,6715,6719,6761,6734,6750,6601,6586,6676,6649,6726,6543,6803,6704,6635,6690,6651,6669,6602,6695,6724,6563,6694,6694,6632,6687,6826,6675,6800,6715,6704,6697,6744,6687,6683,6539,6598,6767,6625,6688,6739,6523,6783,6728,6633,6687,6751,6731,6798,6653,6680,6766,6620,6759,6646,6570,6677,6459,6665,6671,6631,6592,6766,6675,6601,6612,6728,6715,6737,6741,6702,6659,6787,6703,6680,6755,6671,6459,6623,6649,6616,6655,6715,6750,6743,6599,6674,6592,6665,6762,6554,6794,6774,6755,6693,6470,6614,6557,6723,6448,6673,6540,6619,6686,6698,6767,6631,6724,6759,6678,6645,6800,6800,6664,6577,6688,6651,6682,6623,6713,6493,6774,6568,6662,6744,6732,6697,6588,6700,6832,6685,6697,6670,6726,6704,6737,6642,6696,6706,6689,6785,6706,6696,6745,6663,6816,6535,6593,6796,6531,6636,6683,6659,6625,6752,6671,6707,6622,6635,6709,6633,6638,6622,6687,6703,6495,6653,6694,6672,6629,6639,6650,6647,6632,6701,6714,6744,6721,6703,6814,6659,6578,6648,6682,6823,6601,6665,6693,6798,6659,6620,6676,6615,6766,6610,6528,6453,6757,6713,6720,6696,6573,6619,6693,6728,6792,6572,6801,6630,6578,6552,6648,6529,6564,6713,6790,6534,6705,6711,6662,6737,6750,6700,6614,6822,6729,6689,6545,6739,6675,6643,6705,6690,6681,6637,6812,6690,6625,6694,6568,6477,6652,6693,6688,6500,6639,6596,6751,6671,6662,6619,6629,6607,6699,6627,6637,6568,6622,6676,6672,6732,6729,6542,6675,6661,6653,6690,6576,6709,6674,6741,6802,6671,6499,6573,6683,6702,6628,6616,6617,6623,6606,6700,6650,6862,6813,6699,6648,6712,6601,6618,6663,6729,6608,6626,6570,6740,6775,6804,6762,6758,6832,6479,6658,6678,6550,6732,6791,6670,6691,6679,6605,6690,6596,6769,6701,6710,6791,6704,6628,6815,6689,6591,6720,6691,6818,6685,6609,6661,6628,6723,6648,6579,6581,6654,6702,6809,6858,6616,6558,6613,6623,6601,6757,6584,6614,6707,6672,6600,6692,6557,6616,6657,6642,6665,6654,6680,6578,6675,6677,6626,6693,6666,6706,6606,6750,6621,6639,6706,6624,6713,6443,6669,6670,6483,6633,6535,6702,6758,6733,6564,6781,6576,6650,6619,6696,6644,6698,6535,6688,6672,6778,6623,6640,6781,6806,6832,6647,6682,6571,6644,6625,6654,6726,6596,6741,6614,6632,6532,6671,6700,6641,6831,6713,6585,6720,6848,6679,6892,6641,6718,6796,6693,6642,6642,6566,6595,6652,6641,6732,6555,6573,6912,6694,6771,6632,6826,6618,6589,6717,6600,6642,6641,6751,6521,6638,6686,6712,6697,6699,6746,6643,6565,6494,6706,6686,6840,6732,6603,6654,6729,6740,6644,6617,6678,6705,6735,6646,6625,6570,6702,6694,6643,6547,6626,6801,6727,6673,6659,6689,6698,6683,6624,6816,6786,6705,6792,6705,6704,6603,6622,6672,6611,6617,6571,6613,6764,6667,6502,6643,6686,6522,6742,6639,6612,6591,6533,6618,6634,6600,6769,6750,6537,6673,6734,6615,6653,6875,6678,6594,6763,6690,6608,6675,6715,6642,6737,6623,6819,6629,6634,6665,6764,6554,6569,6716,6673,6622,6650,6676,6642,6577,6632,6464,6675,6625,6667,6593,6781,6717,6717,6675,6822,6649,6589,6620,6659,6844,6727,6758,6753,6744,6586,6625,6611,6669,6788,6704,6710,6627,6628,6720,6734,6686,6662,6446,6785,6783,6713,6724,6625,6756,6734,6779,6690,6582,6707,6608,6616,6743,6695,6542,6688,6568,6562,6679,6732,6623,6648,6563,6551,6730,6741,6723,6665,6760,6675,6704,6859,6729,6740,6614,6654,6697,6582,6722,6699,6602,6558,6617,6542,6640,6802,6649,6751,6718,6591,6830,6796,6744,6827,6805,6656,6633,6504,6677,6669,6604,6678,6724,6660,6660,6699,6623,6690,6621,6711,6713,6702,6565,6548,6668,6669,6800,6660,6688,6715,6769,6574,6506,6818,6737,6802,6850,6738,6766,6778,6668,6647,6654,6666,6517,6667,6662,6790,6647,6904,6750,6590,6876,6652,6755,6639,6751,6719,6681,6569,6713,6802,6596,6890,6739,6534,6710,6634,6677,6656,6655,6610,6585,6617,6697,6729,6707,6617,6784,6815,6699,6794,6631,6624,6593,6556,6598,6692,6799,6740,6841,6652,6662,6642,6741,6731,6574,6765,6715,6511,6585,6662,6902,6638,6668,6644,6662,6637,6686,6600,6681,6676,6628,6586,6727,6620,6656,6665,6417,6723,6557,6578,6649,6693,6677,6676,6702,6735,6645,6545,6667,6599,6608,6604,6588,6656,6679,6611,6699,6650,6737,6654,6642,6721,6457,6626,6665,6641,6723,6644,6614,6837,6739,6671,6717,6714,6811,6640,6740,6683,6710,6613,6625,6675,6619,6741,6642,6489,6577,6724,6788,6713,6711,6719,6748,6652,6875,6580,6668,6708,6724,6508,6796,6694,6730,6702,6687,6822,6617,6716,6677,6615,6724,6646,6676,6643,6660,6629,6588,6718,6821,6567,6824,6677,6613,6591,6675,6714,6463,6635,6579,6720,6693,6657,6638,6657,6614,6710,6530,6619,6662,6612,6704,6843,6775,6665,6686,6768,6630,6551,6787,6618,6744,6746,6844,6826,6845,6673,6652,6572,6758,6642,6712,6640,6790,6620,6778,6802,6691,6769,6709,6558,6552,6595,6807,6746,6779,6788,6613,6930,6662,6698,6649,6793,6891,6788,6752,6663,6846,6866,6606,6741,6438,6801,6673,6609,6733,6713,6651,6690,6708,6610,6715,6708,6677,6434,6664,6824,6683,6657,6629,6733,6650,6596,6699,6588,6558,6611,6709,6735,6625,6631,6541,6764,6557,6713,6872,6586,6743,6697,6641,6668,6688,6604,6771,6765,6695,6862,6733,6700,6698,6572,6688,6709,6610,6709,6610,6845,6626,6619,6755,6694,6721,6591,6562,6561,6683,6688,6616,6616,6802,6631,6588,6587,6605,6664,6656,6695,6880,6741,6698,6611,6610,6759,6605,6660,6576,6715,6724,6788,6656,6699,6655,6828,6524,6667,6656,6702,6826,6562,6567,6645,6679,6763,6571,6786,6818,6692,6833,6635,6719,6641,6646,6596,6704,6601,6588,6789,6713,6698,6581,6688,6752,6754,6563,6641,6734,6673,6729,6537,6593,6497,6563,6676,6675,6713,6666,6675,6592,6566,6720,6763,6658,6756,6743,6576,6629,6739,6645,6681,6603,6657,6741,6663,6756,6662,6654,6705,6848,6570,6781,6741,6655,6625,6658,6711,6567,6774,6684,6470,6664,6727,6649,6708,6629,6634,6683,6786,6691,6697,6596,6627,6689,6667,6655,6656,6698,6723,6647,6626,6804,6743,6623,6753,6714,6748,6718,6717,6568,6753,6677,6650,6810,6720,6617,6624,6848,6643,6571,6736,6694,6631,6651,6734,6552,6682,6730,6726,6698,6578,6694,6708,6704,6684,6549,6781,6624,6633,6668,6623,6599,6666,6683,6720,6681,6590,6667,6626,6630,6779,6563,6858,6561,6650,6804,6716,6586,6754,6641,6701,6720,6874,6702,6673,6702,6649,6723,6812,6592,6718,6702,6729,6732,6614,6687,6666,6530,6553,6777,6708,6628,6627,6583,6681,6627,6789,6789,6609,6615,6671,6669,6673,6737,6727,6663,6714,6654,6630,6702,6630,6555,6593,6723,6871,6745,6611,6686,6691,6692,6795,6749,6690,6661,6758,6801,6614,6842,6531,6689,6640,6727,6670,6583,6615,6772,6657,6650,6715,6804,6610,6617,6682,6779,6550,6676,6666,6647,6670,6781,6740,6689,6673,6624,6565,6691,6663,6756,6495,6784,6799,6713,6678,6703,6725,6628,6764,6561,6611,6622,6639,6634,6606,6726,6736,6636,6675,6680,6673,6601,6709,6597,6779,6839,6692,6698,6646,6541,6683,6712,6775,6761,6561,6665,6670,6705,6714,6633,6755,6513,6747,6765,6706,6765,6650,6616,6750,6646,6625,6777,6841,6644,6723,6768,6645,6727,6699,6628,6610,6666,6631,6752,6738,6699,6702,6603,6672,6527,6615,6719,6659,6562,6554,6877,6560,6654,6636,6599,6732,6695,6595,6692,6740,6616,6596,6684,6786,6548,6689,6835,6631,6587,6679,6651,6678,6542,6727,6726,6697,6797,6942,6571,6603,6713,6642,6615,6624,6784,6780,6604,6642,6574,6651,6747,6715,6653,6541,6743,6846,6810,6507,6770,6673,6669,6724,6649,6684,6698,6509,6662,6615,6709,6663,6690,6739,6612,6625,6580,6599,6831,6704,6677,6595,6599,6554,6687,6580,6642,6667,6624,6628,6598,6721,6618,6705,6798,6628,6682,6716,6651,6627,6606,6670,6628,6678,6595,6732,6644,6621,6803,6716,6639,6623,6637,6706,6758,6669,6748,6634,6640,6604,6763,6720,6756,6676,6767,6642,6634,6525,6712,6809,6617,6658,6663,6715,6627,6708,6786,6664,6569,6826,6592,6568,6579,6575,6708,6666,6543,6591,6675,6791,6826,6745,6598,6545,6584,6756,6706,6616,6686,6652,6619,6615,6553,6647,6642,6719,6664,6589,6684,6648,6644,6728,6706,6701,6749,6792,6683,6689,6710,6649,6750,6765,6506,6667,6629,6630,6665,6660,6683,6545,6720,6705,6712,6750,6672,6650,6679,6757,6626,6657,6580,6818,6559,6688,6813,6708,6806,6827,6671,6561,6755,6608,6630,6770,6805,6678,6628,6717,6652,6714,6695,6808,6674,6646,6706,6590,6702,6691,6666,6644,6522,6536,6659,6673,6567,6773,6697,6531,6592,6720,6678,6793,6809,6620,6670,6690,6589,6698,6796,6743,6671,6798,6701,6647,6699,6719,6654,6666,6819,6668,6659,6719,6738,6887,6556,6877,6743,6681,6685,6637,6714,6590]},{"counters":[6539,6539,6612,6564,6546,6762,6655,6804,6681,6761,6693,6701,6620,6611,6614,6598,6695,6648,6550,6718,6748,6771,6610,6801,6747,6678,6647,6682,6634,6529,6681,6673,6824,6441,6709,6663,6606,6794,6690,6616,6591,6681,6706,6682,6721,6761,6789,6824,6612,6526,6682,6638,6676,6815,6631,6632,6589,6708,6712,6925,6745,6754,6679,6629,6845,6663,6648,6716,6721,6772,6710,6555,6767,6545,6664,6662,6663,6829,6670,6526,6609,6684,6526,6633,6521,6714,6729,6618,6761,6765,6702,6571,6603,6673,6735,6784,6640,6854,6703,6487,6623,6657,6428,6774,6909,6536,6598,6758,6402,6674,6691,6821,6693,6815,6557,6560,6857,6661,6734,6634,6745,6604,6652,6498,6569,6593,6606,6748,6673,6715,6616,6597,6757,6647,6807,6690,6619,6735,6687,6683,6777,6639,6627,6619,6601,6643,6682,6711,6706,6679,6607,6673,6565,6825,6696,6703,6771,6786,6715,6689,6697,6770,6677,6748,6723,6851,6581,6546,6602,6822,6562,6611,6785,6596,6916,6680,6661,6740,6617,6677,6612,6488,6759,6674,6708,6641,6582,6670,6732,6592,6678,6649,6633,6691,6622,6598,6699,6711,6637,6612,6647,6632,6806,6624,6754,6713,6578,6715,6770,6699,6791,6634,6767,6772,6644,6756,6726,6794,6797,6615,6632,6673,6729,6829,6656,6705,6706,6700,6696,6441,6687,6680,6666,6809,6681,6548,6651,6734,6734,6634,6736,6746,6728,6779,6808,6703,6755,6593,6445,6547,6491,6615,6612,6528,6696,6669,6726,6581,6636,6766,6662,6574,6586,6595,6605,6623,6875,6786,6643,6768,6458,6688,6728,6685,6645,6580,6616,6682,6710,6598,6730,6666,6644,6740,6788,6747,6613,6582,6846,6652,6678,6598,6718,6599,6659,6668,6636,6764,6553,6680,6482,6594,6753,6724,6661,6604,6685,6697,6621,6688,6861,6571,6744,6718,6743,6592,6642,6713,6707,6510,6729,6794,6757,6676,6779,6702,6702,6708,6691,6735,6653,6674,6738,6670,6674,6757,6643,6618,6633,6718,6574,6768,6807,6750,6588,6611,6672,6639,6622,6669,6697,6719,6564,6608,6558,6640,6677,6650,6841,6595,6724,6677,6807,6748,6653,6691,6616,6667,6731,6555,6803,6692,6690,6667,6670,6820,6743,6645,6694,6596,6492,6706,6631,6794,6586,6634,6655,6612,6765,6594,6599,6679,6729,6643,6662,6560,6607,6592,6628,6573,6582,6706,6614,6632,6694,6663,6536,6504,6718,6542,6806,6569,6695,6695,6589,6571,6675,6650,6684,6753,6719,6615,6545,6519,6781,6727,6807,6539,6673,6562,6696,6589,6640,6522,6512,6622,6674,6640,6611,6638,6633,6747,6894,6777,6413,6755,6714,6725,6657,6690,6732,6613,6686,6551,6767,6694,6668,6671,6618,6599,6608,6663,6688,6724,6823,6769,6465,6696,6789,6720,6708,6774,6695,6672,6562,6717,6699,6582,6583,6692,6652,6647,6627,6797,6739,6601,6835,6693,6617,6803,6704,6682,6624,6682,6730,6493,6642,6609,6695,6709,6659,6594,6652,6893,6723,6673,6647,6720,6763,6579,6734,6741,6779,6640,6771,6826,6667,6685,6652,6575,6777,6721,6697,6662,6709,6672,6748,6671,6838,6577,6728,6722,6546,6555,6688,6787,6554,6745,6857,6786,6491,6795,6684,6789,6583,6553,6742,6877,6633,6643,6587,6773,6802,6687,6533,6702,6537,6552,6486,6756,6680,6643,6689,6559,6792,6740,6760,6802,6691,6672,6818,6779,6604,6719,6728,6551,6743,6684,6682,6694,6670,6746,6556,6478,6745,6616,6745,6621,6737,6631,6577,6753,6642,6660,6707,6817,6771,6566,6720,6743,6694,6704,6553,6841,6713,6689,6651,6747,6751,6664,6596,6688,6649,6651,6711,6885,6509,6616,6761,6664,6855,6621,6512,6671,6607,6741,6662,6627,6610,6579,6563,6607,6629,6636,6619,6567,6566,6647,6637,6627,6604,6639,6416,6750,6726,6779,6736,6821,6643,6563,6602,6721,6490,6703,6767,6688,6514,6696,6567,6705,6689,6762,6655,6791,6648,6781,6680,6647,6615,6664,6666,6749,6645,6698,6572,6492,6774,6681,6745,6640,6621,6733,6614,6785,6690,6548,6769,6686,6616,6668,6738,6723,6727,6663,6556,6732,6672,6781,6737,6740,6607,6719,6719,6662,6762,6645,6577,6733,6690,6621,6623,6720,6590,6748,6694,6651,6534,6684,6625,6632,6765,6780,6659,6675,6655,6641,6725,6559,6676,6547,6613,6678,6804,6636,6649,6667,6745,6570,6774,6683,6708,6595,6646,6832,6749,6591,6607,6661,6470,6706,6551,6721,6595,6475,6577,6678,6587,6676,6688,6727,6766,6694,6702,6846,6649,6608,6614,6571,6613,6691,6708,6710,6585,6791,6619,6643,6770,6673,6530,6761,6788,6541,6706,6800,6670,6814,6649,6821,6718,6659,6774,6558,6610,6624,6772,6614,6602,6690,6703,6640,6577,6543,6686,6844,6606,6685,6593,6657,6596,6792,6680,6635,6450,6711,6552,6740,6598,6838,6539,6619,6706,6730,6671,6742,6603,6695,6794,6685,6644,6723,6693,6594,6765,6806,6636,6630,6617,6561,6714,6690,6597,6647,6573,6646,6699,6628,6603,6805,6607,6739,6647,6745,6576,6691,6658,6824,6679,6624,6649,6718,6780,6620,6614,6564,6644,6564,6579,6722,6694,6816,6750,6735,6739,6820,6616,6640,6733,6731,6760,6738,6745,6558,6789,6760,6687,6663,6682,6685,6500,6573,6734,6575,6594,6636,6627,6653,6816,6633,6656,6758,6620,6615,6582,6793,6645,6548,6586,6662,6740,6652,6611,6670,6797,6780,6785,6750,6635,6844,6659,6587,6601,6608,6575,6637,6777,6607,6638,6779,6640,6655,6653,6764,6769,6685,6634,6660,6559,6742,6806,6617,6630,6597,6752,6618,6578,6610,6745,6701,6652,6446,6711,6703,6605,6608,6833,6811,6760,6639,6634,6673,6830,6545,6570,6684,6794,6641,6757,6633,6712,6705,6518,6695,6637,6663,6595,6670,6673,6736,6401,6802,6511,6648,6888,6744,6651,6674,6662,6552,6722,6714,6691,6692,6795,6777,6759,6745,6601,6559,6761,6678,6663,6527,6646,6705,6568,6639,6686,6683,6678,6629,6708,6777,6824,6846,6506,6866,6663,6558,6759,6666,6675,6574,6610,6669,6673,6621,6753,6696,6700,6877,6792,6698,6524,6736,6678,6562,6547,6570,6765,6825,6765,6701,6640,6647,6794,6632,6602,6712,6587,6772,6530,6824,6748,6675,6767,6507,6800,6666,6739,6648,6565,6551,6425,6684,6583,6625,6787,6695,6824,6627,6736,6658,6629,6655,6718,6623,6597,6528,6794,6621,6714,6793,6653,6666,6648,6624,6758,6541,6682,6675,6608,6674,6708,6607,6728,6684,6566,6767,6760,6746,6681,6698,6805,6658,6714,6561,6694,6691,6667,6496,6682,6525,6601,6681,6635,6660,6732,6579,6754,6583,6683,6647,6593,6721,6593,6626,6683,6661,6624,6651,6785,6764,6568,6668,6617,6574,6708,6621,6709,6688,6642,6650,6587,6790,6679,6914,6654,6639,6665,6668,6828,6703,6817,6730,6781,6578,6688,6789,6639,6610,6667,6708,6647,6816,6649,6513,6598,6752,6686,6547,6740,6779,6552,6802,6620,6808,6759,6705,6570,6702,6708,6602,6749,6598,6747,6671,6622,6703,6518,6587,6714,6754,6437,6659,6786,6772,6558,6710,6651,6674,6666,6601,6728,6566,6676,6812,6677,6653,6680,6666,6527,6557,6608,6702,6743,6573,6723,6705,6748,6666,6851,6798,6609,6720,6572,6667,6581,6678,6670,6709,6868,6786,6651,6567,6515,6710,6697,6654,6613,6720,6628,6554,6738,6508,6497,6740,6574,6620,6614,6675,6808,6705,6838,6642,6652,6735,6700,6762,6712,6769,6790,6666,6721,6722,6518,6707,6697,6670,6666,6656,6588,6603,6725,6762,6630,6810,6710,6580,6661,6681,6664,6601,6769,6684,6598,6706,6715,6628,6631,6675,6754,6639,6697,6684,6608,6627,6827,6684,6624,6678,6604,6745,6701,6596,6477,6662,6719,6885,6637,6627,6799,6670,6629,6692,6672,6675,6639,6741,6690,6643,6698,6654,6678,6642,6787,6637,6647,6628,6606,6636,6767,6739,6707,6769,6628,6776,6552,6727,6677,6664,6665,6658,6727,6519,6849,6703,6694,6747,6716,6642,6553,6742,6635,6652,6726,6581,6595,6594,6691,6756,6769,6715,6598,6588,6633,6694,6679,6649,6641,6686,6601,6797,6735,6710,6648,6703,6621,6681,6570,6620,6634,6744,6711,6541,6702,6641,6650,6659,6739,6632,6720,6564,6780,6697,6572,6801,6719,6577,6755,6673,6607,6697,6744,6582,6619,6611,6613,6849,6527,6711,6650,6797,6715,6727,6755,6666,6704,6553,6706,6727,6597,6559,6655,6752,6663,6829,6772,6583,6615,6635,6574,6857,6664,6856,6810,6796,6612,6699,6671,6591,6665,6694,6764,6717,6542,6779,6770,6633,6569,6575,6683,6686,6778,6656,6724,6680,6565,6573,6649,6702,6714,6685,6662,6721,6664,6611,6703,6723,6631,6625,6663,6586,6604,6802,6792,6718,6570,6673,6703,6618,6636,6633,6699,6643,6579,6831,6527,6769,6473,6769,6675,6580,6712,6686,6634,6605,6498,6725,6722,6723,6777,6814,6873,6794,6700,6732,6784,6532,6674,6737,6693,6707,6761,6616,6730,6764,6571,6643,6713,6617,6714,6741,6690,6639,6559,6633,6660,6763,6655,6876,6675,6663,6700,6615,6675,6704,6770,6600,6580,6607,6629,6748,6638,6554,6832,6461,6830,6709,6637,6672,6607,6881,6443,6814,6619,6823,6588,6768,6669,6655,6654,6698,6643,6679,6684,6715,6758,6750,6659,6768,6708,6658,6659,6649,6674,6764,6785,6723,6733,6595,6676,6724,6608,6777,6735,6608,6659,6724,6569,6664,6787,6732,6646,6580,6496,6668,6645,6565,6727,6615,6697,6691,6537,6878,6718,6932,6775,6636,6777,6693,6741,6710,6707,6626,6600,6682,6639,6645,6619,6666,6509,6637,6563,6599,6599,6656,6552,6570,6604,6674,6611,6661,6633,6718,6637,6658,6695,6680,6696,6448,6666,6888,6540,6722,6726,6604,6761,6730,6748,6643,6669,6611,6584,6797,6553,6738,6675,6591,6697,6745,6566,6498,6534,6630,6693,6742,6591,6720,6559,6649,6626,6748,6707,6721,6761,6637,6645,6802,6716,6681,6623,6706,6697,6600,6686,6498,6723,6514,6782,6611,6648,6613,6582,6623,6743,6589,6661,6698,6683,6671,6715,6758,6643,6740,6673,6536,6718,6764,6663,6590,6688,6722,6604,6656,6573,6681,6543,6682,6814,6497,6615,6744,6594,6689,6440,6752,6700,6717,6840,6662,6652,6655,6626,6575,6705,6632,6773,6790,6679,6640,6685,6728,6748,6614,6789,6819,6565,6724,6635,6803,6591,6647,6505,6637,6770,6545,6754,6609,6684,6591,6614,6754,6743,6678,6763,6625,6796,6640,6550,6578,6633,6716,6743,6657,6572,6651,6675,6611,6535,6694,6711,6823,6668,6649,6754,6636,6678,6662,6798,6603,6776,6744,6652,6533,6566,6601,6946,6736,6684,6695,6635,6723,6643,6697,6642,6613,6630,6648,6690,6725,6741,6740,6795,6480,6533,6774,6608,6620,6710,6551,6619,6725,6655,6708,6696,6771,6757,6805,6755,6737,6705,6706,6854,6641,6724,6631,6674,6679,6747,6879,6588,6646,6593,6598,6673,6733,6673,6618,6677,6703,6741,6786,6886,6631,6757,6674,6589,6649,6741,6660,6481,6548,6777,6742,6727,6710,6791,6691,6661,6677,6587,6558,6861,6646,6626,6642,6662,6744,6647,6695,6739,6810,6697,6588,6564,6771,6752,6709,6525,6753,6696,6719,6578,6691,6713,6673,6685,6636,6658,6607,6711,6645,6627,6666,6735,6643,6713,6747,6634,6536,6646,6640,6662,6511,6593,6600,6661,6566,6808,6633,6732,6692,6699,6688,6670,6687,6704,6740,6691,6751,6604,6728,6644,6582,6588,6718,6751,6862,6633,6639,6719,6782,6695,6674,6662,6840,6678,6633,6807,6640,6512,6687,6702,6691,6487,6763,6760,6743,6675,6757,6767,6580,6819,6640,6664,6579,6730,6708,6870,6732,6661,6512,6612,6602,6623,6732,6741,6804,6634,6717,6674,6738,6713,6609,6799,6659,6549,6571,6631,6674,6602,6636,6802,6591,6683,6746,6588,6730,6733,6673,6615,6742,6673,6711,6713,6762,6842,6648,6627,6759,6690,6728,6486,6623,6614,6699,6490,6567,6682,6664,6576,6708,6834,6774,6726,6777,6660,6694,6890,6554,6733,6666,6649,6540,6728,6764,6610,6662,6673,6808,6661,6653,6622,6651,6805,6708,6751,6872]},{"counters":[6615,6668,6840,6671,6728,6673,6717,6791,6646,6638,6656,6684,6693,6619,6604,6635,6753,6653,6853,6698,6783,6771,6631,6607,6575,6643,6766,6681,6655,6670,6702,6717,6847,6837,6776,6776,6675,6673,6599,6594,6602,6705,6875,6662,6685,6652,6596,6678,6766,6780,6706,6769,6648,6570,6773,6686,6682,6623,6721,6593,6699,6673,6644,6744,6497,6664,6781,6563,6600,6757,6678,6661,6657,6678,6776,6810,6658,6652,6651,6672,6669,6738,6684,6824,6655,6720,6776,6697,6808,6580,6732,6658,6712,6626,6779,6709,6777,6525,6611,6671,6763,6552,6658,6654,6665,6620,6692,6671,6689,6573,6701,6602,6678,6703,6598,6665,6663,6638,6589,6784,6817,6683,6836,6757,6627,6766,6616,6656,6650,6642,6730,6786,6625,6744,6702,6645,6691,6700,6722,6712,6652,6686,6660,6598,6588,6674,6642,6685,6715,6818,6638,6661,6711,6662,6660,6909,6514,6645,6618,6756,6707,6605,6799,6667,6628,6762,6665,6677,6696,6615,6562,6521,6569,6682,6548,6625,6676,6658,6651,6618,6713,6725,6816,6750,6737,6751,6694,6871,6810,6733,6868,6834,6733,6656,6587,6621,6543,6549,6673,6601,6660,6769,6693,6673,6759,6657,6632,6684,6599,6534,6619,6768,6640,6542,6743,6628,6538,6680,6651,6699,6818,6775,6636,6564,6670,6585,6606,6591,6672,6574,6687,6551,6768,6651,6717,6616,6637,6533,6658,6628,6585,6542,6806,6640,6772,6597,6693,6762,6606,6819,6697,6720,6675,6734,6574,6782,6579,6736,6664,6603,6605,6535,6547,6733,6577,6671,6752,6639,6645,6649,6821,6612,6717,6702,6674,6828,6619,6528,6596,6563,6614,6683,6667,6586,6653,6542,6691,6821,6797,6745,6659,6653,6540,6683,6663,6700,6569,6746,6678,6771,6758,6656,6594,6616,6659,6574,6663,6624,6648,6778,6708,6615,6724,6777,6700,6676,6563,6612,6608,6573,6618,6695,6733,6872,6666,6531,6461,6594,6855,6602,6749,6550,6684,6772,6567,6568,6676,6670,6705,6756,6545,6659,6630,6740,6725,6656,6696,6677,6765,6694,6642,6798,6803,6701,6748,6797,6562,6601,6655,6694,6848,6752,6621,6683,6690,6674,6682,6671,6718,6743,6660,6598,6639,6689,6722,6675,6743,6947,6721,6606,6710,6743,6750,6704,6803,6585,6611,6692,6699,6642,6724,6611,6633,6683,6672,6614,6715,6725,6577,6624,6787,6796,6695,6770,6683,6775,6532,6675,6703,6636,6718,6667,6645,6506,6562,6618,6651,6662,6789,6881,6640,6586,6622,6677,6694,6515,6647,6817,6698,6640,6536,6841,6627,6665,6609,6749,6644,6614,6655,6638,6662,6658,6671,6489,6800,6596,6645,6627,6827,6587,6687,6670,6745,6692,6616,6744,6556,6677,6607,6591,6712,6713,6651,6702,6722,6658,6712,6509,6667,6637,6768,6638,6644,6693,6705,6703,6757,6712,6782,6700,6686,6755,6750,6683,6626,6661,6708,6648,6500,6781,6665,6562,6572,6680,6740,6742,6743,6709,6598,6689,6726,6650,6702,6588,6676,6732,6575,6439,6649,6719,6682,6644,6707,6664,6605,6677,6690,6659,6687,6683,6655,6615,6696,6524,6623,6709,6702,6692,6695,6676,6641,6499,6636,6665,6795,6745,6917,6582,6727,6670,6703,6609,6680,6563,6787,6668,6659,6724,6539,6686,6781,6900,6630,6654,6706,6690,6630,6699,6534,6745,6597,6710,6521,6825,6837,6684,6606,6735,6649,6603,6784,6712,6796,6654,6755,6683,6675,6666,6744,6607,6606,6776,6722,6830,6645,6666,6754,6593,6614,6775,6729,6693,6627,6554,6553,6610,6616,6470,6601,6691,6730,6707,6721,6596,6705,6737,6643,6750,6725,6764,6686,6783,6784,6653,6646,6643,6599,6625,6570,6611,6613,6735,6752,6818,6756,6604,6760,6629,6724,6545,6632,6712,6657,6652,6585,6592,6735,6756,6686,6742,6628,6739,6780,6661,6584,6587,6688,6645,6630,6687,6707,6869,6556,6669,6717,6640,6726,6655,6666,6628,6608,6642,6664,6754,6607,6719,6613,6563,6702,6531,6732,6747,6740,6601,6672,6627,6710,6592,6671,6650,6674,6626,6611,6739,6648,6578,6629,6534,6588,6803,6510,6572,6682,6649,6540,6740,6848,6649,6646,6582,6484,6654,6667,6710,6545,6597,6772,6720,6584,6673,6857,6719,6625,6762,6714,6778,6647,6592,6694,6709,6775,6531,6825,6618,6773,6642,6692,6629,6648,6684,6540,6730,6640,6670,6659,6744,6716,6628,6673,6910,6639,6569,6622,6792,6678,6619,6676,6646,6597,6700,6783,6741,6698,6555,6715,6642,6627,6597,6740,6669,6732,6588,6563,6634,6699,6662,6624,6697,6696,6571,6608,6704,6640,6577,6795,6608,6514,6593,6621,6551,6697,6658,6610,6621,6628,6740,6725,6781,6710,6569,6781,6703,6646,6656,6665,6610,6813,6739,6889,6666,6767,6625,6715,6758,6654,6657,6625,6699,6689,6641,6708,6700,6674,6645,6739,6604,6761,6717,6685,6740,6722,6841,6537,6740,6641,6618,6684,6531,6613,6720,6518,6604,6572,6682,6651,6764,6615,6674,6678,6723,6642,6659,6522,6832,6668,6717,6755,6628,6631,6595,6647,6646,6509,6712,6669,6750,6597,6559,6661,6727,6761,6559,6643,6846,6643,6798,6641,6641,6709,6618,6801,6760,6623,6684,6872,6741,6618,6706,6605,6722,6774,6641,6746,6657,6781,6889,6885,6686,6701,6809,6665,6783,6655,6863,6642,6599,6611,6575,6662,6820,6454,6556,6835,6678,6520,6735,6655,6618,6630,6765,6702,6743,6749,6640,6729,6817,6787,6777,6620,6705,6680,6555,6628,6764,6745,6690,6663,6757,6740,6609,6542,6735,6728,6713,6654,6623,6639,6674,6686,6655,6560,6560,6812,6603,6815,6640,6614,6742,6861,6738,6613,6752,6573,6705,6669,6724,6726,6702,6760,6605,6667,6691,6745,6794,6689,6454,6843,6672,6490,6805,6767,6925,6767,6577,6629,6747,6752,6616,6705,6642,6684,6683,6636,6750,6701,6638,6612,6717,6582,6695,6607,6542,6642,6538,6578,6742,6482,6839,6784,6579,6690,6816,6679,6596,6720,6667,6577,6587,6593,6611,6727,6623,6729,6806,6710,6689,6625,6630,6817,6735,6607,6538,6799,6698,6820,6716,6673,6852,6658,6461,6776,6618,6787,6614,6764,6615,6695,6615,6632,6688,6675,6762,6782,6711,6676,6700,6685,6655,6595,6673,6643,6723,6689,6738,6640,6794,6563,6682,6614,6435,6554,6772,6724,6687,6888,6532,6675,6638,6633,6753,6660,6683,6563,6547,6702,6728,6669,6674,6631,6710,6602,6594,6683,6710,6674,6634,6616,6768,6631,6737,6744,6600,6676,6750,6730,6758,6571,6750,6581,6764,6693,6610,6764,6742,6554,6836,6722,6707,6657,6544,6682,6617,6610,6767,6643,6633,6778,6607,6795,6711,6532,6701,6649,6718,6733,6648,6662,6765,6677,6504,6663,6686,6486,6773,6630,6563,6695,6636,6722,6615,6828,6611,6577,6817,6674,6852,6731,6678,6707,6594,6570,6679,6789,6800,6747,6690,6611,6661,6647,6640,6732,6616,6575,6706,6732,6602,6615,6701,6647,6742,6669,6694,6647,6679,6699,6725,6643,6648,6760,6724,6532,6692,6598,6798,6752,6715,6610,6748,6572,6663,6544,6765,6628,6697,6811,6613,6685,6592,6681,6693,6662,6579,6653,6649,6477,6704,6621,6775,6573,6731,6765,6790,6692,6937,6792,6748,6716,6599,6795,6720,6717,6676,6807,6567,6614,6687,6542,6761,6797,6704,6630,6757,6763,6641,6560,6677,6674,6658,6689,6566,6627,6665,6710,6701,6689,6606,6758,6626,6497,6586,6664,6766,6639,6629,6711,6635,6647,6753,6627,6668,6617,6835,6619,6571,6567,6606,6688,6748,6663,6865,6636,6621,6847,6528,6796,6700,6717,6626,6702,6667,6704,6700,6720,6810,6457,6675,6706,6579,6750,6512,6636,6571,6663,6647,6667,6610,6558,6724,6839,6826,6851,6590,6654,6632,6662,6719,6561,6467,6690,6637,6554,6761,6669,6628,6539,6685,6733,6597,6728,6776,6515,6753,6684,6688,6597,6614,6585,6774,6632,6638,6658,6751,6547,6809,6622,6842,6529,6660,6547,6662,6779,6633,6637,6560,6803,6724,6668,6789,6747,6720,6665,6865,6674,6769,6534,6478,6738,6694,6757,6707,6700,6483,6586,6706,6722,6799,6651,6801,6536,6757,6613,6550,6609,6690,6618,6532,6604,6424,6436,6627,6610,6834,6568,6739,6603,6683,6711,6656,6559,6709,6739,6806,6629,6589,6661,6753,6627,6804,6602,6716,6825,6683,6573,6642,6786,6625,6601,6631,6686,6705,6662,6754,6657,6637,6628,6710,6638,6869,6726,6822,6627,6840,6885,6647,6702,6726,6701,6672,6716,6636,6651,6758,6632,6637,6666,6599,6651,6529,6731,6760,6632,6465,6725,6849,6716,6512,6578,6572,6597,6643,6678,6793,6646,6541,6698,6745,6661,6613,6740,6804,6619,6650,6731,6665,6513,6729,6769,6527,6621,6815,6831,6705,6745,6675,6670,6640,6614,6721,6739,6712,6616,6557,6620,6707,6648,6597,6795,6698,6739,6665,6640,6638,6777,6678,6735,6693,6713,6574,6620,6751,6734,6795,6512,6581,6814,6755,6707,6752,6587,6566,6543,6734,6518,6607,6682,6543,6760,6692,6719,6670,6782,6725,6762,6649,6529,6590,6665,6712,6776,6717,6651,6819,6683,6645,6688,6544,6682,6751,6789,6701,6664,6713,6562,6580,6653,6564,6700,6747,6672,6623,6651,6680,6730,6692,6658,6626,6734,6796,6491,6569,6594,6661,6683,6612,6649,6660,6688,6742,6727,6769,6766,6583,6895,6661,6645,6630,6726,6541,6755,6851,6672,6623,6573,6629,6551,6561,6748,6652,6720,6609,6756,6650,6709,6714,6605,6851,6565,6678,6703,6631,6665,6767,6714,6791,6665,6686,6704,6784,6731,6718,6601,6860,6674,6850,6768,6847,6631,6663,6733,6812,6792,6741,6741,6604,6695,6569,6678,6882,6731,6671,6608,6808,6700,6636,6710,6648,6577,6823,6489,6573,6750,6648,6754,6600,6631,6767,6819,6821,6753,6542,6666,6569,6607,6758,6559,6678,6521,6582,6692,6746,6601,6635,6621,6552,6683,6739,6794,6662,6668,6685,6626,6824,6651,6555,6739,6647,6562,6551,6544,6616,6698,6724,6609,6692,6691,6612,6692,6456,6624,6676,6705,6652,6749,6739,6661,6751,6734,6678,6632,6744,6681,6810,6648,6709,6774,6659,6717,6714,6690,6562,6801,6505,6487,6620,6660,6540,6608,6727,6514,6735,6583,6683,6677,6694,6811,6590,6487,6636,6623,6605,6667,6661,6515,6721,6529,6606,6579,6714,6665,6691,6765,6810,6627,6569,6680,6682,6667,6606,6612,6641,6713,6712,6760,6639,6705,6778,6799,6671,6747,6655,6863,6701,6639,6637,6562,6584,6655,6697,6626,6663,6703,6623,6747,6568,6685,6653,6746,6668,6729,6699,6707,6685,6609,6662,6689,6557,6752,6826,6631,6710,6701,6583,6746,6810,6743,6697,6690,6557,6683,6602,6700,6642,6813,6662,6736,6747,6731,6627,6605,6600,6536,6661,6614,6698,6886,6683,6623,6638,6561,6646,6759,6699,6564,6679,6583,6650,6815,6634,6801,6832,6698,6556,6755,6634,6704,6612,6662,6649,6684,6617,6651,6641,6828,6643,6601,6648,6865,6751,6732,6622,6713,6603,6607,6757,6691,6664,6859,6705,6630,6588,6627,6671,6480,6770,6547,6491,6653,6732,6685,6615,6705,6689,6755,6646,6663,6587,6455,6666,6635,6600,6713,6604,6573,6704,6571,6584,6707,6661,6645,6590,6670,6693,6782,6664,6756,6584,6654,6664,6552,6803,6637,6540,6734,6776,6632,6507,6785,6635,6663,6588,6604,6623,6659,6676,6658,6867,6814,6433,6782,6786,6665,6689,6640,6675,6690,6604,6564,6592,6730,6587,6794,6566,6812,6655,6816,6665,6615,6522,6670,6600,6557,6631,6654,6605,6651,6548,6731,6663,6643,6731,6727,6570,6678,6642,6657,6575,6684,6639,6617,6663,6687,6635,6661,6728,6647,6651,6605,6585,6587,6633,6717,6709,6459,6600,6784,6677,6655,6838,6567,6719,6690,6884,6545,6784,6574,6662,6552,6788,6694,6738,6624,6735,6648,6494,6800,6611,6656,6664,6574,6614,6742,6711,6616,6660,6629,6579,6636,6690,6532,6730,6674,6636,6542,6662,6726,6815,6739,6691,6724,6697,6801,6854,6719,6658,6580,6599,6794,6590,6747,6718,6644,6702,6773,6559,6789,6887,6750,6648,6715,6647,6712,6742,6635,6650,6674,6619,6655,6705]},{"counters":[6724,6706,6733,6589,6669,6724,6765,6736,6589,6677,6609,6597,6601,6629,6467,6667,6615,6685,6626,6656,6637,6636,6739,6650,6568,6707,6589,6673,6744,6779,6773,6612,6578,6608,6620,6625,6857,6605,6746,6753,6768,6661,6829,6760,6817,6647,6586,6458,6652,6714,6666,6639,6775,6634,6687,6803,6658,6729,6768,6646,6712,6587,6833,6638,6664,6495,6613,6529,6761,6665,6642,6607,6786,6717,6694,6624,6737,6674,6591,6640,6745,6592,6711,6706,6757,6776,6633,6655,6852,6629,6536,6703,6640,6582,6682,6582,6690,6695,6517,6683,6578,6740,6623,6631,6529,6641,6680,6668,6569,6810,6573,6575,6682,6676,6632,6570,6655,6696,6660,6792,6685,6615,6736,6704,6714,6632,6629,6633,6796,6609,6631,6658,6594,6612,6812,6663,6657,6679,6704,6674,6651,6660,6700,6631,6661,6693,6705,6736,6471,6682,6538,6753,6714,6497,6723,6694,6656,6675,6592,6682,6900,6742,6686,6761,6599,6741,6546,6505,6645,6633,6783,6653,6646,6783,6606,6622,6624,6737,6647,6805,6714,6737,6585,6620,6641,6678,6733,6822,6676,6649,6773,6687,6675,6646,6640,6653,6525,6604,6750,6704,6613,6721,6714,6714,6757,6638,6727,6577,6751,6784,6720,6536,6656,6653,6567,6691,6627,6693,6575,6853,6571,6492,6706,6773,6608,6743,6651,6639,6777,6814,6530,6755,6674,6693,6749,6737,6722,6748,6639,6701,6698,6577,6754,6691,6765,6769,6621,6754,6576,6771,6608,6585,6613,6587,6674,6736,6567,6633,6696,6703,6552,6758,6700,6520,6666,6613,6697,6561,6811,6606,6730,6778,6677,6652,6608,6734,6539,6792,6558,6699,6564,6602,6695,6562,6568,6619,6647,6694,6630,6720,6713,6804,6717,6569,6683,6660,6569,6799,6746,6561,6588,6883,6703,6604,6648,6569,6501,6637,6645,6618,6711,6844,6613,6746,6654,6707,6682,6603,6667,6557,6584,6716,6511,6671,6719,6769,6708,6752,6534,6697,6625,6641,6749,6760,6778,6591,6699,6517,6668,6646,6685,6840,6722,6582,6670,6719,6694,6690,6589,6482,6667,6799,6629,6635,6593,6633,6781,6653,6836,6784,6694,6730,6707,6611,6673,6677,6668,6785,6720,6710,6736,6735,6905,6684,6709,6615,6747,6674,6626,6785,6729,6732,6590,6662,6604,6748,6676,6731,6686,6739,6597,6734,6589,6817,6693,6617,6649,6547,6670,6723,6629,6682,6567,6744,6601,6704,6608,6686,6751,6645,6740,6693,6626,6588,6614,6741,6711,6630,6575,6676,6582,6614,6655,6688,6773,6772,6593,6548,6640,6708,6715,6638,6552,6691,6616,6761,6703,6642,6641,6720,6650,6660,6560,6614,6640,6695,6694,6832,6719,6510,6715,6720,6645,6709,6509,6689,6620,6632,6496,6844,6767,6674,6720,6621,6559,6613,6679,6612,6720,6829,6708,6784,6718,6684,6644,6690,6760,6585,6730,6708,6769,6760,6649,6536,6627,6524,6724,6729,6671,6590,6653,6677,6725,6601,6784,6677,6526,6736,6632,6632,6698,6673,6702,6593,6545,6672,6657,6665,6684,6623,6541,6699,6573,6625,6745,6750,6655,6703,6789,6619,6699,6660,6600,6659,6771,6558,6592,6648,6865,6703,6565,6695,6796,6703,6729,6794,6723,6511,6679,6695,6665,6720,6676,6579,6669,6699,6453,6751,6749,6686,6598,6587,6713,6763,6742,6542,6811,6702,6646,6649,6615,6602,6822,6553,6727,6671,6600,6726,6655,6646,6692,6683,6555,6800,6561,6699,6529,6726,6682,6669,6852,6855,6639,6603,6737,6517,6675,6618,6823,6637,6726,6691,6648,6546,6735,6617,6754,6844,6547,6752,6707,6561,6801,6594,6685,6762,6691,6738,6733,6540,6596,6684,6640,6858,6626,6740,6565,6756,6722,6537,6645,6563,6650,6675,6734,6513,6671,6580,6681,6810,6609,6608,6792,6583,6710,6586,6542,6664,6737,6741,6601,6665,6745,6749,6603,6723,6646,6689,6758,6743,6792,6533,6692,6606,6812,6668,6643,6714,6730,6778,6690,6690,6758,6900,6662,6680,6607,6673,6656,6600,6688,6779,6620,6545,6653,6578,6716,6673,6582,6638,6641,6571,6596,6579,6705,6724,6639,6795,6727,6782,6553,6783,6709,6724,6770,6688,6641,6696,6782,6708,6603,6583,6695,6608,6667,6698,6514,6745,6636,6739,6697,6606,6590,6767,6614,6581,6553,6581,6802,6627,6698,6831,6701,6655,6743,6513,6591,6660,6641,6474,6594,6724,6663,6740,6698,6675,6711,6924,6700,6760,6560,6589,6584,6660,6633,6767,6659,6703,6734,6572,6578,6707,6519,6699,6579,6524,6647,6788,6764,6682,6692,6608,6708,6738,6722,6659,6759,6535,6674,6805,6647,6502,6690,6668,6594,6613,6662,6793,6723,6812,6679,6802,6707,6624,6692,6588,6660,6510,6683,6727,6610,6676,6632,6463,6428,6704,6658,6697,6759,6620,6677,6640,6591,6640,6744,6686,6711,6765,6752,6587,6555,6604,6839,6738,6759,6655,6621,6728,6530,6786,6674,6670,6750,6641,6537,6615,6650,6660,6642,6581,6677,6672,6585,6683,6715,6817,6663,6664,6465,6659,6698,6730,6789,6524,6805,6728,6874,6546,6636,6670,6610,6726,6714,6641,6609,6697,6573,6696,6776,6886,6649,6808,6744,6525,6565,6688,6677,6721,6542,6697,6731,6628,6504,6690,6639,6646,6754,6493,6599,6802,6626,6614,6629,6589,6717,6747,6790,6699,6785,6513,6579,6620,6820,6728,6622,6626,6624,6623,6798,6704,6736,6721,6656,6559,6698,6650,6556,6705,6612,6580,6492,6615,6706,6646,6674,6710,6669,6771,6795,6674,6603,6680,6599,6662,6599,6659,6736,6614,6746,6687,6688,6713,6730,6641,6692,6499,6722,6622,6690,6781,6769,6578,6686,6823,6641,6751,6674,6704,6758,6610,6760,6631,6719,6767,6592,6680,6655,6742,6515,6734,6827,6492,6566,6583,6667,6684,6718,6609,6606,6658,6619,6746,6628,6645,6596,6647,6788,6585,6644,6628,6737,6644,6692,6596,6768,6726,6653,6608,6571,6550,6736,6684,6658,6556,6674,6619,6595,6750,6575,6602,6774,6840,6710,6759,6624,6581,6680,6630,6644,6711,6525,6615,6676,6747,6691,6638,6651,6697,6550,6734,6646,6610,6735,6800,6518,6931,6661,6633,6783,6745,6734,6702,6651,6691,6781,6622,6522,6781,6859,6724,6792,6758,6679,6818,6829,6576,6749,6584,6596,6697,6900,6640,6605,6769,6698,6828,6599,6574,6607,6528,6590,6541,6678,6720,6687,6646,6687,6714,6647,6709,6710,6713,6763,6800,6714,6624,6744,6470,6767,6796,6527,6793,6605,6670,6788,6636,6733,6725,6724,6621,6729,6733,6635,6685,6672,6646,6649,6660,6675,6623,6698,6631,6494,6621,6720,6684,6780,6523,6674,6616,6635,6764,6762,6622,6741,6730,6775,6643,6709,6735,6674,6574,6820,6720,6791,6673,6655,6725,6638,6516,6800,6701,6615,6706,6674,6503,6586,6701,6723,6680,6614,6649,6485,6639,6685,6787,6672,6610,6729,6664,6579,6572,6640,6747,6650,6758,6554,6786,6663,6663,6670,6493,6726,6708,6763,6686,6846,6751,6689,6641,6801,6665,6741,6603,6461,6611,6647,6704,6785,6654,6749,6708,6623,6564,6623,6665,6597,6663,6586,6679,6616,6493,6679,6717,6663,6651,6520,6564,6544,6719,6705,6655,6545,6606,6734,6742,6715,6726,6730,6699,6713,6600,6645,6636,6644,6577,6628,6663,6671,6703,6624,6599,6698,6593,6725,6587,6711,6782,6647,6609,6671,6822,6539,6741,6683,6617,6606,6683,6553,6730,6548,6651,6603,6478,6593,6520,6701,6791,6718,6565,6567,6815,6754,6503,6640,6732,6618,6663,6648,6654,6744,6628,6640,6690,6624,6574,6742,6662,6714,6693,6690,6735,6625,6632,6679,6706,6636,6573,6777,6546,6781,6645,6690,6697,6499,6748,6719,6658,6592,6696,6627,6589,6567,6846,6639,6675,6645,6674,6636,6667,6753,6652,6761,6649,6670,6673,6660,6565,6632,6616,6471,6743,6720,6561,6758,6539,6580,6776,6649,6514,6682,6560,6617,6656,6666,6781,6650,6817,6688,6668,6633,6724,6636,6580,6755,6731,6780,6659,6682,6609,6554,6561,6603,6699,6691,6823,6676,6719,6646,6535,6748,6580,6771,6764,6767,6633,6797,6661,6640,6831,6547,6697,6692,6732,6727,6587,6818,6693,6584,6612,6642,6759,6676,6697,6683,6762,6557,6799,6763,6534,6672,6762,6589,6705,6637,6773,6690,6732,6539,6788,6629,6522,6749,6487,6745,6891,6646,6769,6692,6710,6575,6761,6605,6668,6781,6728,6648,6775,6490,6789,6578,6741,6658,6671,6761,6584,6675,6606,6576,6626,6802,6814,6689,6754,6819,6756,6777,6740,6672,6786,6752,6634,6565,6774,6641,6738,6794,6740,6773,6742,6587,6504,6777,6578,6730,6765,6678,6650,6680,6772,6694,6627,6633,6732,6777,6663,6688,6683,6613,6645,6750,6687,6516,6715,6545,6574,6638,6673,6636,6625,6643,6736,6586,6502,6692,6650,6779,6596,6713,6642,6688,6747,6674,6771,6543,6757,6927,6690,6664,6639,6770,6642,6777,6848,6639,6528,6654,6656,6648,6795,6693,6670,6633,6755,6666,6695,6698,6501,6612,6759,6768,6533,6613,6742,6706,6640,6708,6753,6659,6668,6667,6690,6714,6538,6771,6594,6633,6663,6621,6715,6674,6651,6623,6505,6534,6679,6742,6768,6757,6646,6722,6639,6560,6808,6703,6701,6666,6752,6606,6735,6710,6605,6625,6651,6656,6621,6675,6636,6706,6803,6606,6602,6548,6726,6720,6817,6750,6779,6557,6719,6633,6676,6582,6820,6697,6715,6542,6717,6534,6741,6627,6637,6608,6788,6700,6695,6821,6607,6523,6584,6685,6793,6542,6708,6641,6690,6798,6744,6667,6558,6715,6631,6632,6636,6585,6723,6515,6638,6690,6675,6615,6572,6794,6566,6769,6727,6685,6618,6693,6703,6631,6818,6640,6664,6804,6813,6738,6807,6696,6764,6647,6733,6711,6710,6683,6714,6636,6730,6758,6671,6815,6652,6692,6590,6861,6556,6763,6756,6685,6772,6798,6770,6710,6769,6702,6770,6754,6816,6658,6639,6500,6758,6676,6780,6719,6872,6696,6743,6636,6967,6614,6818,6668,6682,6692,6680,6689,6628,6672,6743,6669,6723,6605,6622,6592,6720,6818,6784,6590,6622,6728,6728,6578,6608,6712,6639,6730,6602,6703,6703,6716,6626,6699,6586,6780,6653,6737,6587,6802,6714,6657,6665,6620,6979,6682,6766,6834,6753,6647,6769,6653,6694,6783,6778,6764,6745,6643,6659,6646,6753,6622,6550,6649,6717,6672,6676,6754,6707,6742,6654,6527,6671,6653,6622,6739,6615,6707,6595,6673,6738,6639,6601,6768,6660,6746,6601,6820,6595,6696,6641,6676,6601,6567,6689,6815,6738,6585,6726,6620,6667,6696,6694,6656,6704,6562,6675,6627,6717,6737,6675,6675,6864,6710,6640,6645,6650,6642,6773,6697,6748,6633,6656,6751,6614,6736,6742,6656,6591,6688,6747,6709,6681,6708,6664,6786,6510,6669,6704,6755,6685,6720,6650,6603,6711,6883,6608,6661,6583,6593,6700,6675,6766,6571,6778,6645,6761,6612,6571,6692,6589,6703,6795,6543,6655,6698,6676,6635,6648,6747,6611,6630,6742,6625,6730,6758,6632,6651,6666,6734,6779,6749,6628,6583,6781,6690,6617,6774,6566,6566,6767,6764,6599,6529,6533,6690,6620,6598,6500,6758,6671,6628,6639,6664,6948,6680,6615,6613,6664,6568,6706,6725,6732,6711,6674,6661,6826,6553,6775,6705,6712,6677,6588,6734,6709,6686,6659,6689,6786,6645,6818,6721,6577,6646,6638,6693,6654,6524,6731,6657,6618,6699,6643,6758,6655,6635,6526,6668,6741,6676,6714,6736,6833,6677,6911,6834,6714,6672,6601,6651,6597,6615,6448,6643,6735,6625,6712,6688,6619,6637,6899,6787,6737,6652,6661,6761,6819,6691,6665,6569,6791,6581,6710,6723,6649,6715,6657,6661,6721,6627,6617,6702,6808,6716,6718,6563,6576,6605,6512,6589,6657,6670,6624,6596,6591,6579,6746,6665,6628,6816,6509,6647,6733,6713,6788,6751,6630,6815,6880,6635,6626,6689,6846,6835,6853,6600,6767,6610,6707,6826,6703,6689,6695,6525,6736,6770,6724,6684,6686,6818,6712,6575,6809,6817,6566,6603,6678,6719,6886,6691,6685,6689,6595,6575,6681,6670,6628,6876,6522,6720,6566,6581,6796,6729,6716,6753,6760,6559,6700,6564,6530,6588,6741,6746,6539,6611,6683,6431,6739]}]},"null_count":0,"tot_col_size":0,"last_update_version":401126096250601472},"primary":{"histogram":{"ndv":13668892,"buckets":[{"count":131072,"lower_bound":"A4jp1jD3E8ABA4AAHdl5aU8K","upper_bound":"A4njaOYQnwABA4AAIi0X17cQ","repeats":1},{"count":262144,"lower_bound":"A4njaObot8ACA4AAIr0jZN8W","upper_bound":"A4o1szAUj0ACA4AAIkryz9cP","repeats":1},{"count":393216,"lower_bound":"A4o1szgfhcADA4AAIo3hmhcO","upper_bound":"A4psL6P19QABA4AAJMNwxZcO","repeats":1},{"count":524288,"lower_bound":"A4psL6eGaoABA4AAJOFpdicX","upper_bound":"A4qNSB73CIACA4AAJI/Ztb8S","repeats":1},{"count":655360,"lower_bound":"A4qNSDhW5MABA4AAJTB9Zq8S","upper_bound":"A4qtdvuM+8ACA4AAJX6kmO8N","repeats":1},{"count":786432,"lower_bound":"A4qtdv30KwAHA4AAJUaAQ48R","upper_bound":"A4rLZCuvUEAFA4AAJlGkNs8X","repeats":1},{"count":917504,"lower_bound":"A4rLZDvMNoAFA4AAJh8E7gcW","upper_bound":"A4rnx+sVaQAHA4AAI7jHyJcR","repeats":1},{"count":1048576,"lower_bound":"A4rnx+zaCIAEA4AAJLpIE+8P","upper_bound":"A4sAdsD3X8ACA4AAJyBLHn8U","repeats":1},{"count":1179648,"lower_bound":"A4sAdtHZ98ADA4AAJRs18N8U","upper_bound":"A4sXd1FphcACA4AAJ4no/2cQ","repeats":1},{"count":1310720,"lower_bound":"A4sXd1WvxUADA4AAImWGYa8O","upper_bound":"A4syGiULEsAHA4AAIaXPQBcQ","repeats":1},{"count":1434042,"lower_bound":"A4syGiZ70QACA4AAJdQ2ErcP","upper_bound":"A4tKYRMR/AADA4AAJ79kkvcP","repeats":1},{"count":1565114,"lower_bound":"A4tKYR6ZdcAGA4AAJGhTXDcX","upper_bound":"A4tizutqA8AFA4AAJfkAIw8R","repeats":1},{"count":1696186,"lower_bound":"A4tizwmRL8AEA4AAIpIPnL8P","upper_bound":"A4uCcmiTbIAEA4AAKTzusB8U","repeats":1},{"count":1827258,"lower_bound":"A4uCcnElQ8AHA4AAJePJRQ8W","upper_bound":"A4uRgMRVO0ABA4AAJgi9S2cT","repeats":1},{"count":1958330,"lower_bound":"A4uRgNYrk8ACA4AAKXkHB08P","upper_bound":"A4uiV+1YQkABA4AAJFMKeF8S","repeats":1},{"count":2089402,"lower_bound":"A4uiV/i1ccAFA4AAJd+2vscW","upper_bound":"A4uzyr+ZbcABA4AAIQ9XZbcW","repeats":1},{"count":2220474,"lower_bound":"A4uzyvj4dcAEA4AAKfMQFtcO","upper_bound":"A4vEFND/58AcA4AAIhtHvZ8X","repeats":1},{"count":2351546,"lower_bound":"A4vEFOaQTcAeA4AAJqyC1TcN","upper_bound":"A4vTharjgcAcA4AAKm+JcAcR","repeats":1},{"count":2482618,"lower_bound":"A4vTha2HEYAfA4AAIaEnLUcX","upper_bound":"A4vjjh4qw8AfA4AAIgOiIA8Q","repeats":1},{"count":2613690,"lower_bound":"A4vjjjgeDcAcA4AAKph/6zcR","upper_bound":"A4vy94TbdcAeA4AAKv8hf9cP","repeats":1},{"count":2737012,"lower_bound":"A4vy94U114AfA4AAJhhJricR","upper_bound":"A4v/+nksbUAeA4AAKxTMSO8X","repeats":1},{"count":2868084,"lower_bound":"A4v/+oYBu0AeA4AAIECdMr8X","upper_bound":"A4wL79xbGcAcA4AAKShg+mcU","repeats":1},{"count":2999156,"lower_bound":"A4wL7+Fp7cAfA4AAKXj0+bcV","upper_bound":"A4wYrZ2NtMAVA4AAJ3zZVe8Q","repeats":1},{"count":3130228,"lower_bound":"A4wYrZ4gxIAVA4AAJD0x6mcQ","upper_bound":"A4wmdKZ+eMANA4AAKnWrRScN","repeats":1},{"count":3261300,"lower_bound":"A4wmdKyEzcAMA4AAJLVLNzcQ","upper_bound":"A4wzYzOr1cAVA4AAKjQWGgcO","repeats":1},{"count":3392372,"lower_bound":"A4wzYzOr1cAVA4AAKnVlIFcV","upper_bound":"A4xAs/Ol08AMA4AAJyT6Xk8W","repeats":1},{"count":3523444,"lower_bound":"A4xAs/cG4cANA4AAKW7nyIcT","upper_bound":"A4xOgOgYqcAMA4AAKmBEA6cX","repeats":1},{"count":3654516,"lower_bound":"A4xOgOgYqcAMA4AAKn8jXacU","upper_bound":"A4xZG8rdG8AVA4AALJeGP28Q","repeats":1},{"count":3785588,"lower_bound":"A4xZG8rlZ8AOA4AAKkzMEp8O","upper_bound":"A4xjqrYQrcAOA4AAKwyEp7cP","repeats":1},{"count":3916660,"lower_bound":"A4xjqrYQrcAOA4AALKeVbV8P","upper_bound":"A4xtnnaAwcAVA4AAKfAIXwcN","repeats":1},{"count":4047732,"lower_bound":"A4xtnnuXPQAOA4AAJ57EMU8O","upper_bound":"A4x279WANcAVA4AALQpQydcS","repeats":1},{"count":4121902,"lower_bound":"A4x279Y4Q8ANA4AAJn9F/w8N","upper_bound":"A4x8AHboj8ANA4AAJvQqiT8X","repeats":1},{"count":4187438,"lower_bound":"A4x8AHhGDcAOA4AAKltjfDcX","upper_bound":"A4yAkM5c84AVA4AAJzSoKy8P","repeats":1},{"count":4252974,"lower_bound":"A4yAkNFhjMAOA4AAKfFs5U8O","upper_bound":"A4yE12t5H8AMA4AAJfOltn8X","repeats":1},{"count":4318510,"lower_bound":"A4yE12zVx8ANA4AALJ5NZR8R","upper_bound":"A4yJQRAkH8AMA4AAK/HG5H8W","repeats":1},{"count":4384046,"lower_bound":"A4yJQRuJOcANA4AALVhA3ecN","upper_bound":"A4yNhrRc9cANA4AALWleo9cP","repeats":1},{"count":4449582,"lower_bound":"A4yNhrYKJcAMA4AAIlZJuZcO","upper_bound":"A4yR1M8Vi8ANA4AAJd7GhC8V","repeats":1},{"count":4515118,"lower_bound":"A4yR1NLvaUANA4AAKaFszl8P","upper_bound":"A4yVyKWH+EANA4AAKeY1qK8R","repeats":1},{"count":4580654,"lower_bound":"A4yVyKZeecANA4AALYDST+cQ","upper_bound":"A4yabnxQbAAVA4AALWsRT+cX","repeats":1},{"count":4646190,"lower_bound":"A4yaboDiDcAOA4AAJRhfNzcP","upper_bound":"A4yeQrLcz4AVA4AALYoiF8cR","repeats":1},{"count":4711726,"lower_bound":"A4yeQrP8QcAMA4AAIYeGqQcO","upper_bound":"A4yiETAK6sAOA4AAJlyrAO8T","repeats":1},{"count":4777262,"lower_bound":"A4yiETEC4IAOA4AALYhUG9cQ","upper_bound":"A4yl5e0F88AMA4AAKvWJPc8X","repeats":1},{"count":4842798,"lower_bound":"A4yl5fC9ScAOA4AALW/5cycO","upper_bound":"A4yp1enTx8AVA4AAK5CnGC8Q","repeats":1},{"count":4908334,"lower_bound":"A4yp1enTx8AVA4AALQaG4x8X","upper_bound":"A4yuGuv1JcAVA4AAInlOrpcR","repeats":1},{"count":4973870,"lower_bound":"A4yuGu6M9gANA4AAK8kOHScV","upper_bound":"A4yyMPI/00ANA4AAK3DR3RcN","repeats":1},{"count":5039406,"lower_bound":"A4yyMPb6ucAVA4AAI6/uFOcP","upper_bound":"A4y2qqc6qIAMA4AAKo6hh/cV","repeats":1},{"count":5104942,"lower_bound":"A4y2qqySPIAVA4AALBbUTj8V","upper_bound":"A4y58rhoLcANA4AAJspOL7cW","repeats":1},{"count":5170478,"lower_bound":"A4y58ro13MANA4AALdrxuwcU","upper_bound":"A4y9ykAAq8AOA4AALYnyFq8T","repeats":1},{"count":5236014,"lower_bound":"A4y9ykA8RcANA4AAKbOEHRcV","upper_bound":"A4zBcL/vXcAVA4AALXpm2XcQ","repeats":1},{"count":5301550,"lower_bound":"A4zBcMCYxcANA4AAJzHWRVcR","upper_bound":"A4zFBGtRBcAVA4AAK2ssXrcS","repeats":1},{"count":5367086,"lower_bound":"A4zFBGtRBcAVA4AALjU7IBcS","upper_bound":"A4zI1jIeM8AOA4AAJw/fls8P","repeats":1},{"count":5432622,"lower_bound":"A4zI1jMovwAOA4AALVblOqcR","upper_bound":"A4zL168MzcAVA4ALOR0PgzeA","repeats":1},{"count":5490408,"lower_bound":"A4zL17IBq8ANA4AAKFiXmq8T","upper_bound":"A4zPU/st90AOA4AAIbRC5C8Q","repeats":1},{"count":5555944,"lower_bound":"A4zPU/2F38AMA4AALCx0in8T","upper_bound":"A4zShr6dW4AMA4AALMq3me8R","repeats":1},{"count":5621480,"lower_bound":"A4zShsJqK8AOA4AAJ8tDNK8O","upper_bound":"A4zV357k6cAOA4AAJsKzR6cU","repeats":1},{"count":5687016,"lower_bound":"A4zV358+gYAVA4AAItwPw38Q","upper_bound":"A4zZhnVss8AOA4AAJPwsUu8P","repeats":1},{"count":5752552,"lower_bound":"A4zZhnVss8AOA4AALedeB88O","upper_bound":"A4zcsH7u0cAOA4AAKp68qkcW","repeats":1},{"count":5818088,"lower_bound":"A4zcsH7u0cAOA4Ae5vU0hHcA","upper_bound":"A4zgWUv7j4ANA4AAKv7giOcQ","repeats":1},{"count":5883624,"lower_bound":"A4zgWU1dfEAOA4AAK2LENI8R","upper_bound":"A4zkCtvMnAAOA4AAK3a/hb8V","repeats":1},{"count":5949160,"lower_bound":"A4zkCt6qL8ANA4Amwm+bAr8A","upper_bound":"A4znDzqOaQANA4AAKALkRe8V","repeats":1},{"count":6014696,"lower_bound":"A4znDz3IugAOA4AAK1fFXQ8N","upper_bound":"A4zrc2HFacAVA4AALKbsdacT","repeats":1},{"count":6080232,"lower_bound":"A4zrc2IB5cANA4ArwBQUAZeA","upper_bound":"A4zuvNRs18AOA4AAKbsEZ18N","repeats":1},{"count":6145768,"lower_bound":"A4zuvNehfcAOA4AAJ3TWi/cW","upper_bound":"A4zye5OdmwANA4Az9DZihFcA","repeats":1},{"count":6211304,"lower_bound":"A4zye5e65wAMA4AALRgylxcQ","upper_bound":"A4z2cqXEzoANA4AAJog2G28Q","repeats":1},{"count":6276840,"lower_bound":"A4z2cqpP+cAOA4AAK8KWC+cU","upper_bound":"A4z6GuJMb8AMA4AAIiu6Jr8P","repeats":1},{"count":6342376,"lower_bound":"A4z6GubyhQAMA4AALS20QecV","upper_bound":"A4z93+KTr8AMA4AAKlZVWL8W","repeats":1},{"count":6407912,"lower_bound":"A4z93+RqKcANA4AAJsgJXqcW","upper_bound":"A40BdlRwi8AOA4AAJ1xspW8Q","repeats":1},{"count":6473448,"lower_bound":"A40BdlRwi8AOA4BE7ptLQi+A","upper_bound":"A40FEbfi1cANA4BJDo7dA1cA","repeats":1},{"count":6538984,"lower_bound":"A40FEb2Ln8AOA4AAJqqwIX8O","upper_bound":"A40I8X6KNgAOA4BJUT85AZeA","repeats":1},{"count":6604520,"lower_bound":"A40I8ZbcwsAOA4AAItVFhu8P","upper_bound":"A40MPVA6F8ANA4AAI8mrzl8S","repeats":1},{"count":6670056,"lower_bound":"A40MPVWaf8AOA4BKLDekw/+A","upper_bound":"A40P8WmTT8AOA4AALX6Vlj8T","repeats":1},{"count":6735592,"lower_bound":"A40P8W39wcAOA4AAJbZDdwcW","upper_bound":"A40TdQlJqcAMA4BXUbjqwqeA","repeats":1},{"count":6801128,"lower_bound":"A40TdQs5qcANA4BEvQvzQqeA","upper_bound":"A40XEeeDhcAVA4AALDXwIRcS","repeats":1},{"count":6834338,"lower_bound":"A40XEgJtscAMA4AAIuvNU8cS","upper_bound":"A40Y60cD5MAOA4AALIvonhcN","repeats":1},{"count":6899874,"lower_bound":"A40Y60evWUAOA4AALY7gUF8X","upper_bound":"A40cgg6GEoANA4A7rx5/g3cA","repeats":1},{"count":6965410,"lower_bound":"A40cghR9f8AMA4AtZzT7wv+A","upper_bound":"A40gCixmWUANA4AAJx/M7qcW","repeats":1},{"count":7030946,"lower_bound":"A40gCkNtmUAMA4AAJx/M7qcW","upper_bound":"A40jdExQLcAOA4AAKAIo6LcP","repeats":1},{"count":7096482,"lower_bound":"A40jdE9RtUAVA4Auv79XgQ8A","upper_bound":"A40m1h3UqcAVA4AALhOOEqcU","repeats":1},{"count":7162018,"lower_bound":"A40m1h+0VcAVA4AALiK78VcW","upper_bound":"A40p8+N8NwAMA4AALTEhf7cO","repeats":1},{"count":7227554,"lower_bound":"A40p8+TiXsAMA4AALNSTdy8P","upper_bound":"A40tVAD77IAOA4AAIVN9XB8Q","repeats":1},{"count":7293090,"lower_bound":"A40tVAF+7cAOA4AAJvvuYbcP","upper_bound":"A40wLLK6w8AOA4AAIQZilw8R","repeats":1},{"count":7358626,"lower_bound":"A40wLLK6w8AOA4AALIvY0jcV","upper_bound":"A40zqtUxfgAVA4AAKB/8vFcT","repeats":1},{"count":7424162,"lower_bound":"A40zqta3w8AVA4BsQvGQRA+A","upper_bound":"A402t/z128ANA4BngARLAW+A","repeats":1},{"count":7489698,"lower_bound":"A402t/2nGcANA4AALNBdL2cP","upper_bound":"A406BBZ7dcAMA4BeTDIqwteA","repeats":1},{"count":7555234,"lower_bound":"A406BBh3k8ANA4AALR2G7E8R","upper_bound":"A408/bQh+cAMA4BnhD6XQ+eA","repeats":1},{"count":7620770,"lower_bound":"A408/bR8p8AVA4AALXRaQJ8R","upper_bound":"A40/zBcE+8ANA4AAJ1ycke8R","repeats":1},{"count":7686306,"lower_bound":"A40/zBccB0AVA4AAKGMA5wcO","upper_bound":"A41C67r0A8AOA4AAKyfpWw8X","repeats":1},{"count":7751842,"lower_bound":"A41C68BIJEANA4BFlwCLwveA","upper_bound":"A41F7CWLxEANA4AAKdpAglcQ","repeats":1},{"count":7817378,"lower_bound":"A41F7CXLDMANA4AAKkhxBZcV","upper_bound":"A41IyKrRyIAMA4AAKuLw25cR","repeats":1},{"count":7882914,"lower_bound":"A41IyK89fMANA4CI5BtHwZ+A","upper_bound":"A41L+SjEicAMA4BY040egicA","repeats":1},{"count":7948450,"lower_bound":"A41L+SjEicAMA4CGTnhHwT+A","upper_bound":"A41O55N25AANA4AALTXaqY8T","repeats":1},{"count":8013986,"lower_bound":"A41O55W58EAMA4AAILlYLK8R","upper_bound":"A41R4hF53AAOA4AQ86L3glcA","repeats":1},{"count":8079522,"lower_bound":"A41R4hHgM8AOA4CV27ZcQM8A","upper_bound":"A41VeFz90UANA4CHrH/iAeeA","repeats":1},{"count":8145058,"lower_bound":"A41VeF70D8AMA4AAK3NPSj8N","upper_bound":"A41ZN8lVFcANA4CXLj7Vw1eA","repeats":1},{"count":8194652,"lower_bound":"A41ZN80SY8AMA4BTmxw/wzeA","upper_bound":"A41dBLa478AMA4BfhPg1gVcA","repeats":1},{"count":8260188,"lower_bound":"A41dBLbWckAMA4CXFBcAwg+A","upper_bound":"A41iPPidF8AVA4AAIk9Db18P","repeats":1},{"count":8325724,"lower_bound":"A41iPPidF8AVA4AAKZloIFcW","upper_bound":"A41mWE04Q8AMA4CS01b5wQ+A","repeats":1},{"count":8391260,"lower_bound":"A41mWFILCcAOA4AAIsGZXCcQ","upper_bound":"A41pwtHxy4AOA4AALHfRxPcX","repeats":1},{"count":8456796,"lower_bound":"A41pwtMIwAANA4CtrhBdwVcA","upper_bound":"A41sUFB5NMAMA4AvZSBdQX+A","repeats":1},{"count":8522332,"lower_bound":"A41sUFC7xUAMA4BwDjvTA4cA","upper_bound":"A41u1AOMlcANA4CTGb1kg1eA","repeats":1},{"count":8587868,"lower_bound":"A41u1AP2qsAVA4CxzYgYw/8A","upper_bound":"A41xY2HpGoAOA4AALMWheF8R","repeats":1},{"count":8653404,"lower_bound":"A41xY2IMKgAOA4AAK13Uiu8N","upper_bound":"A41z/60bScAOA4ASU+8OQScA","repeats":1},{"count":8718940,"lower_bound":"A41z/6/fTcAMA4BCtaVzRDcA","upper_bound":"A412SswdLcAOA4AAKGrfG7cU","repeats":1},{"count":8784476,"lower_bound":"A412SswdLcAOA4AAKlLLz8cQ","upper_bound":"A414gosTGcANA4AnAOs4BGcA","repeats":1},{"count":8850012,"lower_bound":"A414gozQOcAVA4C5Hdu7AOcA","upper_bound":"A417BQ8bUsAOA4AAIaY2Zo8P","repeats":1},{"count":8915548,"lower_bound":"A417BRAsC8AVA4AAKUyRQi8Q","upper_bound":"A419mcnspsAOA4CkQXN8Qs+A","repeats":1},{"count":8981084,"lower_bound":"A419mcpY4gAOA4AAJo6IRicR","upper_bound":"A41/13ZV78AOA4AAIoSyeL8Q","repeats":1},{"count":9046620,"lower_bound":"A41/13ZV78AOA4AALEvJRIcT","upper_bound":"A42CT2hZk4AVA4AAKVbREOcQ","repeats":1},{"count":9112156,"lower_bound":"A42CT2uYkgAVA4AAKhBSZrcT","upper_bound":"A42E0/k36MAOA4AAKTsorG8N","repeats":1},{"count":9177692,"lower_bound":"A42E0/0NFYAVA4DGDgiQgpeA","upper_bound":"A42HOY1cC4AVA4B6s4A/wrcA","repeats":1},{"count":9243228,"lower_bound":"A42HOY2sJ8AOA4AAJhIhmZ8V","upper_bound":"A42I96RAYgAMA4C9FRPewt+A","repeats":1},{"count":9308764,"lower_bound":"A42I96RBucAMA4Bx9GDJweeA","upper_bound":"A42LUrToxEQOA4AAGBJZOycG","repeats":1},{"count":9374300,"lower_bound":"A42LUrToxEYOA4AAGBJZOycG","upper_bound":"A42NxHP3I8AOA4ASbe8AgI8A","repeats":1},{"count":9439836,"lower_bound":"A42NxHRfpAAMA4C8CosiA2cA","upper_bound":"A42P/o0BDIAVA4AALh8JDe8Q","repeats":1},{"count":9505372,"lower_bound":"A42P/pBzlUAVA4DTNAQUQbcA","upper_bound":"A42R+mGRH8ANA4CLcph5hH+A","repeats":1},{"count":9554966,"lower_bound":"A42R+mHhEcAVA4DIIrHBAUcA","upper_bound":"A42TnsaqwgAVA4AALa9o2R8O","repeats":1},{"count":9620502,"lower_bound":"A42Tns2P/kANA4AAGBJZOycG","upper_bound":"A42WDl2owcAOA4AALaRepgcU","repeats":1},{"count":9686038,"lower_bound":"A42WDl41wcAVA4CZbSf9gg8A","upper_bound":"A42YbVUW58AVA4AAI68R858S","repeats":1},{"count":9751574,"lower_bound":"A42YbVWexcANA4DEISg1hBeA","upper_bound":"A42abW0QNwAOA4AAGBJZOycG","repeats":1},{"count":9817110,"lower_bound":"A42abW0QNwIOA4AAGBJZOycG","upper_bound":"A42cPJWAFkANA4DHlqHZAkcA","repeats":1},{"count":9882646,"lower_bound":"A42cPJWZ3oACA4AALSxmyJcW","upper_bound":"A42d7GA4h0ANA4AALD3C6gcV","repeats":1},{"count":9948182,"lower_bound":"A42d7GDRwQANA4AAIkO80W8O","upper_bound":"A42f+ydR7QAEA4AALSxmyJcW","repeats":1},{"count":10013718,"lower_bound":"A42f+yf6RAANA4DibPb/wQcA","upper_bound":"A42hgksrZ8ANA4DkUgpbAJ8A","repeats":1},{"count":10079254,"lower_bound":"A42hgks92kAMA4AALByE6t8V","upper_bound":"A42jkUjxOwAOA4AAJN2/upcS","repeats":1},{"count":10144790,"lower_bound":"A42jkUkHJcAEA4AALSxmyJcW","upper_bound":"A42lIasO1oANA4AAKPoa538O","repeats":1},{"count":10210326,"lower_bound":"A42lIatYpcAVA4CVJabTQ5cA","upper_bound":"A42m2r/J04AVA4AAKgKmix8X","repeats":1},{"count":10275862,"lower_bound":"A42m2sA5DYAOA4AALOYkxacN","upper_bound":"A42o/CArRcAMA4BD8yBuwhcA","repeats":1},{"count":10341398,"lower_bound":"A42o/CUjjoANA4DUnHXKwp+A","upper_bound":"A42qxs0cX8AVA4BaqGi0xH+A","repeats":1},{"count":10406934,"lower_bound":"A42qxtU9UsAOA4DIl39sQj8A","upper_bound":"A42sxCW6t8AMA4AALNtIk98W","repeats":1},{"count":10472470,"lower_bound":"A42sxCY0msAMA4AAJjBrB48P","upper_bound":"A42ukpDghQAOA4C+1JyVA98A","repeats":1},{"count":10538006,"lower_bound":"A42ukpMbv8ANA4AAJupia/8N","upper_bound":"A42w3dAeyYAMA4CgJiuHwb8A","repeats":1},{"count":10603542,"lower_bound":"A42w3dDmX8AOA4DdpT+BhH8A","upper_bound":"A42zLavDc0ANA4AAJbXcaHcN","repeats":1},{"count":10669078,"lower_bound":"A42zLbSeFcANA4AAGBJZOycG","upper_bound":"A4209iwizcAOA4AAKm/HOTcO","repeats":1},{"count":10734614,"lower_bound":"A4209iw0/8AOA4AAKQts0f8R","upper_bound":"A423Cnydn8AEA4DdXcjNBH8A","repeats":1},{"count":10800150,"lower_bound":"A423Cn72zYAEA4AAGBJZOycG","upper_bound":"A424xVhGocAOA4BOvsnrAocA","repeats":1},{"count":10865686,"lower_bound":"A424xVkEIcAMA4BNeMh+A4eA","upper_bound":"A427Fz9WvcAMA4D19Be2RPcA","repeats":1},{"count":10882512,"lower_bound":"A427F0EPOwAMA4AALWBgXicO","upper_bound":"A427hN76M8AVA4AAJ2K55c8T","repeats":1},{"count":10948048,"lower_bound":"A427hOLn/AANA4DCPdQkwzeA","upper_bound":"A4293jpnecAMA4AAJtB/+n8R","repeats":1},{"count":11013584,"lower_bound":"A4293jpnecAMA4Bx9GDJweeA","upper_bound":"A42/yeTiYQwOA4AAGBJZOycG","repeats":1},{"count":11079120,"lower_bound":"A42/yeTiYQ4OA4AAGBJZOycG","upper_bound":"A43BgI4xEcANA4EFf9FeRUcA","repeats":1},{"count":11144656,"lower_bound":"A43BgI+TtcAMA4EFCtKdRNcA","upper_bound":"A43D1oFA4cAVA4Dx8vqDg4cA","repeats":1},{"count":11210192,"lower_bound":"A43D1oR/u8AOA4AAKUEaC+8O","upper_bound":"A43FvxXgM8ANA4DctFZIQ8+A","repeats":1},{"count":11275728,"lower_bound":"A43Fvxct4cAMA4EJvZ05RYeA","upper_bound":"A43H3lgDPQAVA4AAJVXsXgcT","repeats":1},{"count":11341264,"lower_bound":"A43H3liWYcANA4D3AYxAQYeA","upper_bound":"A43KMCPMxoAOA4AAJl/isxcO","repeats":1},{"count":11406800,"lower_bound":"A43KMCVe+8AMA4AAK7VQXO8R","upper_bound":"A43MMy2IP8gNA4AAK7Utyf8O","repeats":1},{"count":11472336,"lower_bound":"A43MMy5dFcAOA4DAUiioA1cA","upper_bound":"A43OdE+qI8AOA4AAJ7RlcY8U","repeats":1},{"count":11537872,"lower_bound":"A43OdFD670AOA4EN/33xwkcA","upper_bound":"A43QLefX48IOA4AALiHy8Y8V","repeats":1},{"count":11603408,"lower_bound":"A43QLefX48QOA4AAGBJZOycG","upper_bound":"A43SQpiKBQAVA4AAGBJZOycG","repeats":1},{"count":11668944,"lower_bound":"A43SQpotdcAMA4AALNEm5dcW","upper_bound":"A43UgO6NEYANA4AALG3zdBcP","repeats":1},{"count":11734480,"lower_bound":"A43UgPNl7QAMA4ENJlO5Q88A","upper_bound":"A43WYTV3akAMA4AAJqbASr8Q","repeats":1},{"count":11800016,"lower_bound":"A43WYTj/5kACA4AALSxmyJcW","upper_bound":"A43YiuahE8ANA4Bk1lL+hE+A","repeats":1},{"count":11865552,"lower_bound":"A43Yiua5+IAOA4EY8J79BXcA","upper_bound":"A43aQCDUscAMA4EeO640Q8eA","repeats":1},{"count":11931088,"lower_bound":"A43aQCHhIEANA4AAGBJZOycG","upper_bound":"A43cagJQocAVA4AAJimjiocT","repeats":1},{"count":11996624,"lower_bound":"A43cagKvXMAVA4AALh4Zn7cS","upper_bound":"A43eO7WzT8AVA4AAIVUJGIcP","repeats":1},{"count":12062160,"lower_bound":"A43eO7WzT8AVA4EctlawRT8A","upper_bound":"A43geeAyNEgNA4AAGBJZOycG","repeats":1},{"count":12127696,"lower_bound":"A43geeKqE8ANA4AAJP6hUE8O","upper_bound":"A43iGvus+kANA4AAGBJZOycG","repeats":1},{"count":12193232,"lower_bound":"A43iGvus+kINA4AAGBJZOycG","upper_bound":"A43kKdnAVQANA4AAKjR4yo8T","repeats":1},{"count":12242826,"lower_bound":"A43kKdzjMwAMA4Enezg3wy+A","upper_bound":"A43lhdpaO8ANA4AAKvxW+q8X","repeats":1},{"count":12308362,"lower_bound":"A43lhdpaO8ANA4DGKSz/w+8A","upper_bound":"A43nLl9I44gMA4AAGBJZOycG","repeats":1},{"count":12373898,"lower_bound":"A43nLl9I44oMA4AAGBJZOycG","upper_bound":"A43pS1V25YAVA4AAKqPC0r8Q","repeats":1},{"count":12439434,"lower_bound":"A43pS1e+S8AVA4AALMBrFC8Q","upper_bound":"A43q/aJK+QAMA4AAKEnYxM8R","repeats":1},{"count":12504970,"lower_bound":"A43q/aTGAAAMA4Dc196RhC+A","upper_bound":"A43tCtgmMcAOA4AAK6cm/ccV","repeats":1},{"count":12570506,"lower_bound":"A43tCtgmMcAOA4EumJMYw68A","upper_bound":"A43u06RRi8AVA4EtvkqKAi+A","repeats":1},{"count":12636042,"lower_bound":"A43u06ZgIMAVA4AALPj4+mcW","upper_bound":"A43w41UMe8ANA4AAIonQoO8O","repeats":1},{"count":12701578,"lower_bound":"A43w41fRO8AVA4AAIuOFS+8W","upper_bound":"A43yny3VW8AOA4DPi+LsQm+A","repeats":1},{"count":12767114,"lower_bound":"A43yny68JMAOA4AAKDjXal8O","upper_bound":"A430JqnVccAOA4E4JbMnAMeA","repeats":1},{"count":12832650,"lower_bound":"A430JqvcVcANA4AMHWVNwlcA","upper_bound":"A432NKoy3QAVA4AALeqNl68U","repeats":1},{"count":12898186,"lower_bound":"A432NKtJFcAOA4AAKUVA+lcR","upper_bound":"A4331vIWE8INA4AOgU1UAU8A","repeats":1},{"count":12963722,"lower_bound":"A4331vIWE8QNA4AAGBJZOycG","upper_bound":"A435VDKcHcAOA4D8opsaQXeA","repeats":1},{"count":13029258,"lower_bound":"A435VDdfr0AVA4Et0sfSA6cA","upper_bound":"A437LaUZ2cAVA4ErAyvZhGeA","repeats":1},{"count":13094794,"lower_bound":"A437LagsNcAOA4Eki6gNAteA","upper_bound":"A438oVZtJcAMA4COoaAeQJcA","repeats":1},{"count":13160330,"lower_bound":"A438oVaGNcANA4AAIsEpyNcR","upper_bound":"A43+JTmWnEAOA4E8xquhAa+A","repeats":1},{"count":13225866,"lower_bound":"A43+JTqsN0ANA4AALWbjv5cP","upper_bound":"A43/m5aUH8AOA4AALMy50k8Q","repeats":1},{"count":13291402,"lower_bound":"A43/m5aUH8AOA4FDmrOjhH8A","upper_bound":"A44BcwYyKMAVA4AAGBJZOycG","repeats":1},{"count":13356938,"lower_bound":"A44Bcwg0pcAVA4AAJ8oPIZcT","upper_bound":"A44C74axaEAVA4CV/iPbQXeA","repeats":1},{"count":13422474,"lower_bound":"A44C74fmIUAMA4AALdGE6+8W","upper_bound":"A44EPdAanMAMA4AAGBJZOycG","repeats":1},{"count":13488010,"lower_bound":"A44EPdBIZYAOA4AALQhY0q8X","upper_bound":"A44FCfP8NcAMA4AALgZBtNcQ","repeats":1},{"count":13553546,"lower_bound":"A44FCfcRlIAMA4FISIw2BCcA","upper_bound":"A44Gn/ypa8AVA4EAC+Zzgq8A","repeats":1},{"count":13619082,"lower_bound":"A44Gn/ypa8AVA4FAZx44AX8A","upper_bound":"A44IDHRXjcAVA4AALJ0jgDcP","repeats":1},{"count":13668892,"lower_bound":"A44IDHTwa8AVA4AAKfCxMa8X","upper_bound":"A44I/509ecAVA4FKbX3jQ+cA","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401126096244834305}},"count":13690258,"modify_count":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_easy_stats_t1.json b/cmd/explaintest/s/explain_easy_stats_t1.json deleted file mode 100644 index 31b4b5046e557..0000000000000 --- a/cmd/explaintest/s/explain_easy_stats_t1.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"t1","columns":{"c1":{"histogram":{"ndv":1999,"buckets":[{"count":8,"lower_bound":"MQ==","upper_bound":"OA==","repeats":1},{"count":16,"lower_bound":"OQ==","upper_bound":"MTY=","repeats":1},{"count":24,"lower_bound":"MTc=","upper_bound":"MjQ=","repeats":1},{"count":32,"lower_bound":"MjU=","upper_bound":"MzI=","repeats":1},{"count":40,"lower_bound":"MzM=","upper_bound":"NDA=","repeats":1},{"count":48,"lower_bound":"NDE=","upper_bound":"NDg=","repeats":1},{"count":56,"lower_bound":"NDk=","upper_bound":"NTY=","repeats":1},{"count":64,"lower_bound":"NTc=","upper_bound":"NjQ=","repeats":1},{"count":72,"lower_bound":"NjU=","upper_bound":"NzI=","repeats":1},{"count":80,"lower_bound":"NzM=","upper_bound":"ODA=","repeats":1},{"count":88,"lower_bound":"ODE=","upper_bound":"ODg=","repeats":1},{"count":96,"lower_bound":"ODk=","upper_bound":"OTY=","repeats":1},{"count":104,"lower_bound":"OTc=","upper_bound":"MTA0","repeats":1},{"count":112,"lower_bound":"MTA1","upper_bound":"MTEy","repeats":1},{"count":120,"lower_bound":"MTEz","upper_bound":"MTIw","repeats":1},{"count":128,"lower_bound":"MTIx","upper_bound":"MTI4","repeats":1},{"count":136,"lower_bound":"MTI5","upper_bound":"MTM2","repeats":1},{"count":144,"lower_bound":"MTM3","upper_bound":"MTQ0","repeats":1},{"count":152,"lower_bound":"MTQ1","upper_bound":"MTUy","repeats":1},{"count":160,"lower_bound":"MTUz","upper_bound":"MTYw","repeats":1},{"count":168,"lower_bound":"MTYx","upper_bound":"MTY4","repeats":1},{"count":176,"lower_bound":"MTY5","upper_bound":"MTc2","repeats":1},{"count":184,"lower_bound":"MTc3","upper_bound":"MTg0","repeats":1},{"count":192,"lower_bound":"MTg1","upper_bound":"MTky","repeats":1},{"count":200,"lower_bound":"MTkz","upper_bound":"MjAw","repeats":1},{"count":208,"lower_bound":"MjAx","upper_bound":"MjA4","repeats":1},{"count":216,"lower_bound":"MjA5","upper_bound":"MjE2","repeats":1},{"count":224,"lower_bound":"MjE3","upper_bound":"MjI0","repeats":1},{"count":232,"lower_bound":"MjI1","upper_bound":"MjMy","repeats":1},{"count":240,"lower_bound":"MjMz","upper_bound":"MjQw","repeats":1},{"count":248,"lower_bound":"MjQx","upper_bound":"MjQ4","repeats":1},{"count":256,"lower_bound":"MjQ5","upper_bound":"MjU2","repeats":1},{"count":264,"lower_bound":"MjU3","upper_bound":"MjY0","repeats":1},{"count":272,"lower_bound":"MjY1","upper_bound":"Mjcy","repeats":1},{"count":280,"lower_bound":"Mjcz","upper_bound":"Mjgw","repeats":1},{"count":288,"lower_bound":"Mjgx","upper_bound":"Mjg4","repeats":1},{"count":296,"lower_bound":"Mjg5","upper_bound":"Mjk2","repeats":1},{"count":304,"lower_bound":"Mjk3","upper_bound":"MzA0","repeats":1},{"count":312,"lower_bound":"MzA1","upper_bound":"MzEy","repeats":1},{"count":320,"lower_bound":"MzEz","upper_bound":"MzIw","repeats":1},{"count":328,"lower_bound":"MzIx","upper_bound":"MzI4","repeats":1},{"count":336,"lower_bound":"MzI5","upper_bound":"MzM2","repeats":1},{"count":344,"lower_bound":"MzM3","upper_bound":"MzQ0","repeats":1},{"count":352,"lower_bound":"MzQ1","upper_bound":"MzUy","repeats":1},{"count":360,"lower_bound":"MzUz","upper_bound":"MzYw","repeats":1},{"count":368,"lower_bound":"MzYx","upper_bound":"MzY4","repeats":1},{"count":376,"lower_bound":"MzY5","upper_bound":"Mzc2","repeats":1},{"count":384,"lower_bound":"Mzc3","upper_bound":"Mzg0","repeats":1},{"count":392,"lower_bound":"Mzg1","upper_bound":"Mzky","repeats":1},{"count":400,"lower_bound":"Mzkz","upper_bound":"NDAw","repeats":1},{"count":408,"lower_bound":"NDAx","upper_bound":"NDA4","repeats":1},{"count":416,"lower_bound":"NDA5","upper_bound":"NDE2","repeats":1},{"count":424,"lower_bound":"NDE3","upper_bound":"NDI0","repeats":1},{"count":432,"lower_bound":"NDI1","upper_bound":"NDMy","repeats":1},{"count":440,"lower_bound":"NDMz","upper_bound":"NDQw","repeats":1},{"count":448,"lower_bound":"NDQx","upper_bound":"NDQ4","repeats":1},{"count":456,"lower_bound":"NDQ5","upper_bound":"NDU2","repeats":1},{"count":464,"lower_bound":"NDU3","upper_bound":"NDY0","repeats":1},{"count":472,"lower_bound":"NDY1","upper_bound":"NDcy","repeats":1},{"count":480,"lower_bound":"NDcz","upper_bound":"NDgw","repeats":1},{"count":488,"lower_bound":"NDgx","upper_bound":"NDg4","repeats":1},{"count":496,"lower_bound":"NDg5","upper_bound":"NDk2","repeats":1},{"count":504,"lower_bound":"NDk3","upper_bound":"NTA0","repeats":1},{"count":512,"lower_bound":"NTA1","upper_bound":"NTEy","repeats":1},{"count":520,"lower_bound":"NTEz","upper_bound":"NTIw","repeats":1},{"count":528,"lower_bound":"NTIx","upper_bound":"NTI4","repeats":1},{"count":536,"lower_bound":"NTI5","upper_bound":"NTM2","repeats":1},{"count":544,"lower_bound":"NTM3","upper_bound":"NTQ0","repeats":1},{"count":552,"lower_bound":"NTQ1","upper_bound":"NTUy","repeats":1},{"count":560,"lower_bound":"NTUz","upper_bound":"NTYw","repeats":1},{"count":568,"lower_bound":"NTYx","upper_bound":"NTY4","repeats":1},{"count":576,"lower_bound":"NTY5","upper_bound":"NTc2","repeats":1},{"count":584,"lower_bound":"NTc3","upper_bound":"NTg0","repeats":1},{"count":592,"lower_bound":"NTg1","upper_bound":"NTky","repeats":1},{"count":600,"lower_bound":"NTkz","upper_bound":"NjAw","repeats":1},{"count":608,"lower_bound":"NjAx","upper_bound":"NjA4","repeats":1},{"count":616,"lower_bound":"NjA5","upper_bound":"NjE2","repeats":1},{"count":624,"lower_bound":"NjE3","upper_bound":"NjI0","repeats":1},{"count":632,"lower_bound":"NjI1","upper_bound":"NjMy","repeats":1},{"count":640,"lower_bound":"NjMz","upper_bound":"NjQw","repeats":1},{"count":648,"lower_bound":"NjQx","upper_bound":"NjQ4","repeats":1},{"count":656,"lower_bound":"NjQ5","upper_bound":"NjU2","repeats":1},{"count":664,"lower_bound":"NjU3","upper_bound":"NjY0","repeats":1},{"count":672,"lower_bound":"NjY1","upper_bound":"Njcy","repeats":1},{"count":680,"lower_bound":"Njcz","upper_bound":"Njgw","repeats":1},{"count":688,"lower_bound":"Njgx","upper_bound":"Njg4","repeats":1},{"count":696,"lower_bound":"Njg5","upper_bound":"Njk2","repeats":1},{"count":704,"lower_bound":"Njk3","upper_bound":"NzA0","repeats":1},{"count":712,"lower_bound":"NzA1","upper_bound":"NzEy","repeats":1},{"count":720,"lower_bound":"NzEz","upper_bound":"NzIw","repeats":1},{"count":728,"lower_bound":"NzIx","upper_bound":"NzI4","repeats":1},{"count":736,"lower_bound":"NzI5","upper_bound":"NzM2","repeats":1},{"count":744,"lower_bound":"NzM3","upper_bound":"NzQ0","repeats":1},{"count":752,"lower_bound":"NzQ1","upper_bound":"NzUy","repeats":1},{"count":760,"lower_bound":"NzUz","upper_bound":"NzYw","repeats":1},{"count":768,"lower_bound":"NzYx","upper_bound":"NzY4","repeats":1},{"count":776,"lower_bound":"NzY5","upper_bound":"Nzc2","repeats":1},{"count":784,"lower_bound":"Nzc3","upper_bound":"Nzg0","repeats":1},{"count":792,"lower_bound":"Nzg1","upper_bound":"Nzky","repeats":1},{"count":800,"lower_bound":"Nzkz","upper_bound":"ODAw","repeats":1},{"count":808,"lower_bound":"ODAx","upper_bound":"ODA4","repeats":1},{"count":816,"lower_bound":"ODA5","upper_bound":"ODE2","repeats":1},{"count":824,"lower_bound":"ODE3","upper_bound":"ODI0","repeats":1},{"count":832,"lower_bound":"ODI1","upper_bound":"ODMy","repeats":1},{"count":840,"lower_bound":"ODMz","upper_bound":"ODQw","repeats":1},{"count":848,"lower_bound":"ODQx","upper_bound":"ODQ4","repeats":1},{"count":856,"lower_bound":"ODQ5","upper_bound":"ODU2","repeats":1},{"count":864,"lower_bound":"ODU3","upper_bound":"ODY0","repeats":1},{"count":872,"lower_bound":"ODY1","upper_bound":"ODcy","repeats":1},{"count":880,"lower_bound":"ODcz","upper_bound":"ODgw","repeats":1},{"count":888,"lower_bound":"ODgx","upper_bound":"ODg4","repeats":1},{"count":896,"lower_bound":"ODg5","upper_bound":"ODk2","repeats":1},{"count":904,"lower_bound":"ODk3","upper_bound":"OTA0","repeats":1},{"count":912,"lower_bound":"OTA1","upper_bound":"OTEy","repeats":1},{"count":920,"lower_bound":"OTEz","upper_bound":"OTIw","repeats":1},{"count":928,"lower_bound":"OTIx","upper_bound":"OTI4","repeats":1},{"count":936,"lower_bound":"OTI5","upper_bound":"OTM2","repeats":1},{"count":944,"lower_bound":"OTM3","upper_bound":"OTQ0","repeats":1},{"count":952,"lower_bound":"OTQ1","upper_bound":"OTUy","repeats":1},{"count":960,"lower_bound":"OTUz","upper_bound":"OTYw","repeats":1},{"count":968,"lower_bound":"OTYx","upper_bound":"OTY4","repeats":1},{"count":976,"lower_bound":"OTY5","upper_bound":"OTc2","repeats":1},{"count":984,"lower_bound":"OTc3","upper_bound":"OTg0","repeats":1},{"count":992,"lower_bound":"OTg1","upper_bound":"OTky","repeats":1},{"count":1000,"lower_bound":"OTkz","upper_bound":"MTAwMA==","repeats":1},{"count":1008,"lower_bound":"MTAwMQ==","upper_bound":"MTAwOA==","repeats":1},{"count":1016,"lower_bound":"MTAwOQ==","upper_bound":"MTAxNg==","repeats":1},{"count":1024,"lower_bound":"MTAxNw==","upper_bound":"MTAyNA==","repeats":1},{"count":1032,"lower_bound":"MTAyNQ==","upper_bound":"MTAzMg==","repeats":1},{"count":1040,"lower_bound":"MTAzMw==","upper_bound":"MTA0MA==","repeats":1},{"count":1048,"lower_bound":"MTA0MQ==","upper_bound":"MTA0OA==","repeats":1},{"count":1056,"lower_bound":"MTA0OQ==","upper_bound":"MTA1Ng==","repeats":1},{"count":1064,"lower_bound":"MTA1Nw==","upper_bound":"MTA2NA==","repeats":1},{"count":1072,"lower_bound":"MTA2NQ==","upper_bound":"MTA3Mg==","repeats":1},{"count":1080,"lower_bound":"MTA3Mw==","upper_bound":"MTA4MA==","repeats":1},{"count":1088,"lower_bound":"MTA4MQ==","upper_bound":"MTA4OA==","repeats":1},{"count":1096,"lower_bound":"MTA4OQ==","upper_bound":"MTA5Ng==","repeats":1},{"count":1104,"lower_bound":"MTA5Nw==","upper_bound":"MTEwNA==","repeats":1},{"count":1112,"lower_bound":"MTEwNQ==","upper_bound":"MTExMg==","repeats":1},{"count":1120,"lower_bound":"MTExMw==","upper_bound":"MTEyMA==","repeats":1},{"count":1128,"lower_bound":"MTEyMQ==","upper_bound":"MTEyOA==","repeats":1},{"count":1136,"lower_bound":"MTEyOQ==","upper_bound":"MTEzNg==","repeats":1},{"count":1144,"lower_bound":"MTEzNw==","upper_bound":"MTE0NA==","repeats":1},{"count":1152,"lower_bound":"MTE0NQ==","upper_bound":"MTE1Mg==","repeats":1},{"count":1160,"lower_bound":"MTE1Mw==","upper_bound":"MTE2MA==","repeats":1},{"count":1168,"lower_bound":"MTE2MQ==","upper_bound":"MTE2OA==","repeats":1},{"count":1176,"lower_bound":"MTE2OQ==","upper_bound":"MTE3Ng==","repeats":1},{"count":1184,"lower_bound":"MTE3Nw==","upper_bound":"MTE4NA==","repeats":1},{"count":1192,"lower_bound":"MTE4NQ==","upper_bound":"MTE5Mg==","repeats":1},{"count":1200,"lower_bound":"MTE5Mw==","upper_bound":"MTIwMA==","repeats":1},{"count":1208,"lower_bound":"MTIwMQ==","upper_bound":"MTIwOA==","repeats":1},{"count":1216,"lower_bound":"MTIwOQ==","upper_bound":"MTIxNg==","repeats":1},{"count":1224,"lower_bound":"MTIxNw==","upper_bound":"MTIyNA==","repeats":1},{"count":1232,"lower_bound":"MTIyNQ==","upper_bound":"MTIzMg==","repeats":1},{"count":1240,"lower_bound":"MTIzMw==","upper_bound":"MTI0MA==","repeats":1},{"count":1248,"lower_bound":"MTI0MQ==","upper_bound":"MTI0OA==","repeats":1},{"count":1256,"lower_bound":"MTI0OQ==","upper_bound":"MTI1Ng==","repeats":1},{"count":1264,"lower_bound":"MTI1Nw==","upper_bound":"MTI2NA==","repeats":1},{"count":1272,"lower_bound":"MTI2NQ==","upper_bound":"MTI3Mg==","repeats":1},{"count":1280,"lower_bound":"MTI3Mw==","upper_bound":"MTI4MA==","repeats":1},{"count":1288,"lower_bound":"MTI4MQ==","upper_bound":"MTI4OA==","repeats":1},{"count":1296,"lower_bound":"MTI4OQ==","upper_bound":"MTI5Ng==","repeats":1},{"count":1304,"lower_bound":"MTI5Nw==","upper_bound":"MTMwNA==","repeats":1},{"count":1312,"lower_bound":"MTMwNQ==","upper_bound":"MTMxMg==","repeats":1},{"count":1320,"lower_bound":"MTMxMw==","upper_bound":"MTMyMA==","repeats":1},{"count":1328,"lower_bound":"MTMyMQ==","upper_bound":"MTMyOA==","repeats":1},{"count":1336,"lower_bound":"MTMyOQ==","upper_bound":"MTMzNg==","repeats":1},{"count":1344,"lower_bound":"MTMzNw==","upper_bound":"MTM0NA==","repeats":1},{"count":1352,"lower_bound":"MTM0NQ==","upper_bound":"MTM1Mg==","repeats":1},{"count":1360,"lower_bound":"MTM1Mw==","upper_bound":"MTM2MA==","repeats":1},{"count":1368,"lower_bound":"MTM2MQ==","upper_bound":"MTM2OA==","repeats":1},{"count":1376,"lower_bound":"MTM2OQ==","upper_bound":"MTM3Ng==","repeats":1},{"count":1384,"lower_bound":"MTM3Nw==","upper_bound":"MTM4NA==","repeats":1},{"count":1392,"lower_bound":"MTM4NQ==","upper_bound":"MTM5Mg==","repeats":1},{"count":1400,"lower_bound":"MTM5Mw==","upper_bound":"MTQwMA==","repeats":1},{"count":1408,"lower_bound":"MTQwMQ==","upper_bound":"MTQwOA==","repeats":1},{"count":1416,"lower_bound":"MTQwOQ==","upper_bound":"MTQxNg==","repeats":1},{"count":1424,"lower_bound":"MTQxNw==","upper_bound":"MTQyNA==","repeats":1},{"count":1432,"lower_bound":"MTQyNQ==","upper_bound":"MTQzMg==","repeats":1},{"count":1440,"lower_bound":"MTQzMw==","upper_bound":"MTQ0MA==","repeats":1},{"count":1448,"lower_bound":"MTQ0MQ==","upper_bound":"MTQ0OA==","repeats":1},{"count":1456,"lower_bound":"MTQ0OQ==","upper_bound":"MTQ1Ng==","repeats":1},{"count":1464,"lower_bound":"MTQ1Nw==","upper_bound":"MTQ2NA==","repeats":1},{"count":1472,"lower_bound":"MTQ2NQ==","upper_bound":"MTQ3Mg==","repeats":1},{"count":1480,"lower_bound":"MTQ3Mw==","upper_bound":"MTQ4MA==","repeats":1},{"count":1488,"lower_bound":"MTQ4MQ==","upper_bound":"MTQ4OA==","repeats":1},{"count":1496,"lower_bound":"MTQ4OQ==","upper_bound":"MTQ5Ng==","repeats":1},{"count":1504,"lower_bound":"MTQ5Nw==","upper_bound":"MTUwNA==","repeats":1},{"count":1512,"lower_bound":"MTUwNQ==","upper_bound":"MTUxMg==","repeats":1},{"count":1520,"lower_bound":"MTUxMw==","upper_bound":"MTUyMA==","repeats":1},{"count":1528,"lower_bound":"MTUyMQ==","upper_bound":"MTUyOA==","repeats":1},{"count":1536,"lower_bound":"MTUyOQ==","upper_bound":"MTUzNg==","repeats":1},{"count":1544,"lower_bound":"MTUzNw==","upper_bound":"MTU0NA==","repeats":1},{"count":1552,"lower_bound":"MTU0NQ==","upper_bound":"MTU1Mg==","repeats":1},{"count":1560,"lower_bound":"MTU1Mw==","upper_bound":"MTU2MA==","repeats":1},{"count":1568,"lower_bound":"MTU2MQ==","upper_bound":"MTU2OA==","repeats":1},{"count":1576,"lower_bound":"MTU2OQ==","upper_bound":"MTU3Ng==","repeats":1},{"count":1584,"lower_bound":"MTU3Nw==","upper_bound":"MTU4NA==","repeats":1},{"count":1592,"lower_bound":"MTU4NQ==","upper_bound":"MTU5Mg==","repeats":1},{"count":1600,"lower_bound":"MTU5Mw==","upper_bound":"MTYwMA==","repeats":1},{"count":1608,"lower_bound":"MTYwMQ==","upper_bound":"MTYwOA==","repeats":1},{"count":1616,"lower_bound":"MTYwOQ==","upper_bound":"MTYxNg==","repeats":1},{"count":1624,"lower_bound":"MTYxNw==","upper_bound":"MTYyNA==","repeats":1},{"count":1632,"lower_bound":"MTYyNQ==","upper_bound":"MTYzMg==","repeats":1},{"count":1640,"lower_bound":"MTYzMw==","upper_bound":"MTY0MA==","repeats":1},{"count":1648,"lower_bound":"MTY0MQ==","upper_bound":"MTY0OA==","repeats":1},{"count":1656,"lower_bound":"MTY0OQ==","upper_bound":"MTY1Ng==","repeats":1},{"count":1664,"lower_bound":"MTY1Nw==","upper_bound":"MTY2NA==","repeats":1},{"count":1672,"lower_bound":"MTY2NQ==","upper_bound":"MTY3Mg==","repeats":1},{"count":1680,"lower_bound":"MTY3Mw==","upper_bound":"MTY4MA==","repeats":1},{"count":1688,"lower_bound":"MTY4MQ==","upper_bound":"MTY4OA==","repeats":1},{"count":1696,"lower_bound":"MTY4OQ==","upper_bound":"MTY5Ng==","repeats":1},{"count":1704,"lower_bound":"MTY5Nw==","upper_bound":"MTcwNA==","repeats":1},{"count":1712,"lower_bound":"MTcwNQ==","upper_bound":"MTcxMg==","repeats":1},{"count":1720,"lower_bound":"MTcxMw==","upper_bound":"MTcyMA==","repeats":1},{"count":1728,"lower_bound":"MTcyMQ==","upper_bound":"MTcyOA==","repeats":1},{"count":1736,"lower_bound":"MTcyOQ==","upper_bound":"MTczNg==","repeats":1},{"count":1744,"lower_bound":"MTczNw==","upper_bound":"MTc0NA==","repeats":1},{"count":1752,"lower_bound":"MTc0NQ==","upper_bound":"MTc1Mg==","repeats":1},{"count":1760,"lower_bound":"MTc1Mw==","upper_bound":"MTc2MA==","repeats":1},{"count":1768,"lower_bound":"MTc2MQ==","upper_bound":"MTc2OA==","repeats":1},{"count":1776,"lower_bound":"MTc2OQ==","upper_bound":"MTc3Ng==","repeats":1},{"count":1784,"lower_bound":"MTc3Nw==","upper_bound":"MTc4NA==","repeats":1},{"count":1792,"lower_bound":"MTc4NQ==","upper_bound":"MTc5Mg==","repeats":1},{"count":1800,"lower_bound":"MTc5Mw==","upper_bound":"MTgwMA==","repeats":1},{"count":1808,"lower_bound":"MTgwMQ==","upper_bound":"MTgwOA==","repeats":1},{"count":1816,"lower_bound":"MTgwOQ==","upper_bound":"MTgxNg==","repeats":1},{"count":1824,"lower_bound":"MTgxNw==","upper_bound":"MTgyNA==","repeats":1},{"count":1832,"lower_bound":"MTgyNQ==","upper_bound":"MTgzMg==","repeats":1},{"count":1840,"lower_bound":"MTgzMw==","upper_bound":"MTg0MA==","repeats":1},{"count":1848,"lower_bound":"MTg0MQ==","upper_bound":"MTg0OA==","repeats":1},{"count":1856,"lower_bound":"MTg0OQ==","upper_bound":"MTg1Ng==","repeats":1},{"count":1864,"lower_bound":"MTg1Nw==","upper_bound":"MTg2NA==","repeats":1},{"count":1872,"lower_bound":"MTg2NQ==","upper_bound":"MTg3Mg==","repeats":1},{"count":1880,"lower_bound":"MTg3Mw==","upper_bound":"MTg4MA==","repeats":1},{"count":1888,"lower_bound":"MTg4MQ==","upper_bound":"MTg4OA==","repeats":1},{"count":1896,"lower_bound":"MTg4OQ==","upper_bound":"MTg5Ng==","repeats":1},{"count":1904,"lower_bound":"MTg5Nw==","upper_bound":"MTkwNA==","repeats":1},{"count":1912,"lower_bound":"MTkwNQ==","upper_bound":"MTkxMg==","repeats":1},{"count":1920,"lower_bound":"MTkxMw==","upper_bound":"MTkyMA==","repeats":1},{"count":1928,"lower_bound":"MTkyMQ==","upper_bound":"MTkyOA==","repeats":1},{"count":1936,"lower_bound":"MTkyOQ==","upper_bound":"MTkzNg==","repeats":1},{"count":1944,"lower_bound":"MTkzNw==","upper_bound":"MTk0NA==","repeats":1},{"count":1952,"lower_bound":"MTk0NQ==","upper_bound":"MTk1Mg==","repeats":1},{"count":1960,"lower_bound":"MTk1Mw==","upper_bound":"MTk2MA==","repeats":1},{"count":1968,"lower_bound":"MTk2MQ==","upper_bound":"MTk2OA==","repeats":1},{"count":1976,"lower_bound":"MTk2OQ==","upper_bound":"MTk3Ng==","repeats":1},{"count":1984,"lower_bound":"MTk3Nw==","upper_bound":"MTk4NA==","repeats":1},{"count":1992,"lower_bound":"MTk4NQ==","upper_bound":"MTk5Mg==","repeats":1},{"count":1999,"lower_bound":"MTk5Mw==","upper_bound":"MTk5OQ==","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952053294923776},"c3":{"histogram":{"ndv":1999,"buckets":[{"count":7,"lower_bound":"LTIxMzgxMDIzMzE=","upper_bound":"LTIxMDY1MTcwODk=","repeats":1},{"count":13,"lower_bound":"LTIxMDQ0NDU0NDM=","upper_bound":"LTIwOTAwMjcwMDQ=","repeats":1},{"count":19,"lower_bound":"LTIwODc2MzQ5ODQ=","upper_bound":"LTIwNzM4ODQ3MzQ=","repeats":1},{"count":25,"lower_bound":"LTIwNTM3OTI4NDE=","upper_bound":"LTIwNDQ0NTM3ODE=","repeats":1},{"count":31,"lower_bound":"LTIwMzQ5MzMxNTQ=","upper_bound":"LTIwMTE2ODc0NDA=","repeats":1},{"count":37,"lower_bound":"LTIwMTExNzQ5NzQ=","upper_bound":"LTE5OTg2MTI5NTM=","repeats":1},{"count":43,"lower_bound":"LTE5OTY5ODE2MTk=","upper_bound":"LTE5ODk3ODQ3Mzk=","repeats":1},{"count":49,"lower_bound":"LTE5ODcyOTE3MDg=","upper_bound":"LTE5ODQ3OTE1ODg=","repeats":1},{"count":55,"lower_bound":"LTE5NzUyMjcxMzI=","upper_bound":"LTE5NzI5NzIxNjA=","repeats":1},{"count":61,"lower_bound":"LTE5NjI5MzI3MjA=","upper_bound":"LTE5NTY5NDE5MjY=","repeats":1},{"count":67,"lower_bound":"LTE5NDk0MjcwMTc=","upper_bound":"LTE5NDQ2MjI1NDY=","repeats":1},{"count":73,"lower_bound":"LTE5NDMyNjQ2NzI=","upper_bound":"LTE5MjI2MzY5NDU=","repeats":1},{"count":79,"lower_bound":"LTE5MjAzMTU2Njg=","upper_bound":"LTE5MTI5NTk4NTc=","repeats":1},{"count":85,"lower_bound":"LTE5MDQwODg3Mzc=","upper_bound":"LTE4OTU3NTMzODI=","repeats":1},{"count":91,"lower_bound":"LTE4ODg0MTc5MTc=","upper_bound":"LTE4NzkzMDU1NDI=","repeats":1},{"count":97,"lower_bound":"LTE4NzY1MDE0MTM=","upper_bound":"LTE4NzAxMTQyNjc=","repeats":1},{"count":103,"lower_bound":"LTE4Njg3Mzk3NDg=","upper_bound":"LTE4NjI4NDc5OTc=","repeats":1},{"count":109,"lower_bound":"LTE4NjE5OTIxNjM=","upper_bound":"LTE4NTczMTk4MzQ=","repeats":1},{"count":115,"lower_bound":"LTE4NTYyOTI4MzA=","upper_bound":"LTE4NDk4ODg5MTI=","repeats":1},{"count":121,"lower_bound":"LTE4NDE2NzE1OTY=","upper_bound":"LTE4MjU5MzAwNjU=","repeats":1},{"count":127,"lower_bound":"LTE4MjUyNzQxNDE=","upper_bound":"LTE4MTg2MjYzMzY=","repeats":1},{"count":133,"lower_bound":"LTE4MTUxODg4MzQ=","upper_bound":"LTE4MDY4Nzc5MTY=","repeats":1},{"count":139,"lower_bound":"LTE3OTk0NDU0MDM=","upper_bound":"LTE3OTU4Mjc3NjM=","repeats":1},{"count":145,"lower_bound":"LTE3ODkyODk1MDM=","upper_bound":"LTE3ODQ1MjM4MjQ=","repeats":1},{"count":151,"lower_bound":"LTE3Nzc5NzE5MDk=","upper_bound":"LTE3NzMwNjU4Mzc=","repeats":1},{"count":157,"lower_bound":"LTE3NjYwODc5MzU=","upper_bound":"LTE3NjI4NDc4Mjg=","repeats":1},{"count":163,"lower_bound":"LTE3NTI3NzgwNDU=","upper_bound":"LTE3NTAxNjY3OTQ=","repeats":1},{"count":169,"lower_bound":"LTE3NDU3MzYzMjU=","upper_bound":"LTE3NDE5MzcxMTM=","repeats":1},{"count":175,"lower_bound":"LTE3Mzg1OTAwODc=","upper_bound":"LTE3MzQ4MDYyNDM=","repeats":1},{"count":181,"lower_bound":"LTE3MzI0NTI2ODg=","upper_bound":"LTE3MTkwNTU4MDk=","repeats":1},{"count":187,"lower_bound":"LTE3MTM4OTYyNzc=","upper_bound":"LTE3MDExNjM4OTQ=","repeats":1},{"count":193,"lower_bound":"LTE2OTkwOTEwNTA=","upper_bound":"LTE2OTIxNzQ1NDI=","repeats":1},{"count":199,"lower_bound":"LTE2ODk3MDQ2MzM=","upper_bound":"LTE2ODQ0MjQ3MDU=","repeats":1},{"count":205,"lower_bound":"LTE2ODI4MzQ3NTU=","upper_bound":"LTE2NzM3NDc4MTk=","repeats":1},{"count":211,"lower_bound":"LTE2Njk1OTI4Njk=","upper_bound":"LTE2NjE3NTgzNzM=","repeats":1},{"count":217,"lower_bound":"LTE2NTk4ODc1NjM=","upper_bound":"LTE2NTQ4NDk4NDM=","repeats":1},{"count":223,"lower_bound":"LTE2NTM2MTY1Mjc=","upper_bound":"LTE2Mzk5MzE5MjA=","repeats":1},{"count":229,"lower_bound":"LTE2Mzc0MjQ5NDA=","upper_bound":"LTE2Mjk1OTY2MzM=","repeats":1},{"count":235,"lower_bound":"LTE2Mjg3NzY1Mzk=","upper_bound":"LTE2MjU2MjEyMTU=","repeats":1},{"count":241,"lower_bound":"LTE2MjM1MzQzNDA=","upper_bound":"LTE2MDgzODY1MzQ=","repeats":1},{"count":247,"lower_bound":"LTE2MDQxMDMwMTk=","upper_bound":"LTE1OTI4MDcwNDc=","repeats":1},{"count":253,"lower_bound":"LTE1ODUyNDMyMTM=","upper_bound":"LTE1Nzg5NTc0Nzk=","repeats":1},{"count":259,"lower_bound":"LTE1NzY1Njg1ODI=","upper_bound":"LTE1NzIzNDQ5NjI=","repeats":1},{"count":265,"lower_bound":"LTE1NzIyNTQ2NTA=","upper_bound":"LTE1NjczNjk3MTA=","repeats":1},{"count":271,"lower_bound":"LTE1NjA1NjQ5NTA=","upper_bound":"LTE1NTg5NzgwMTU=","repeats":1},{"count":277,"lower_bound":"LTE1NDczNjE5MjA=","upper_bound":"LTE1Mzc3MTcxMDM=","repeats":1},{"count":283,"lower_bound":"LTE1MzMxOTAyMDU=","upper_bound":"LTE1MzI2MTk2OTk=","repeats":1},{"count":289,"lower_bound":"LTE1Mjg1NzY3NDc=","upper_bound":"LTE1MTc5MzIwMDI=","repeats":1},{"count":295,"lower_bound":"LTE1MTUzNzk0MjY=","upper_bound":"LTE0OTQ4NDYyOTM=","repeats":1},{"count":301,"lower_bound":"LTE0ODI2ODkyMzg=","upper_bound":"LTE0Njk4MjY2MzQ=","repeats":1},{"count":307,"lower_bound":"LTE0NjI0NjA2MzM=","upper_bound":"LTE0NTI1NjgxMjI=","repeats":1},{"count":313,"lower_bound":"LTE0MzY3NzYyMDg=","upper_bound":"LTE0MzA5MjM3NTU=","repeats":1},{"count":319,"lower_bound":"LTE0MjIxOTk0NDY=","upper_bound":"LTE0MjExNzY0NTU=","repeats":1},{"count":325,"lower_bound":"LTE0MTg4MzI0NDc=","upper_bound":"LTE0MTYyNDM4OTc=","repeats":1},{"count":331,"lower_bound":"LTE0MDg2Nzc2Nzg=","upper_bound":"LTEzOTU2MzE2MTQ=","repeats":1},{"count":337,"lower_bound":"LTEzODk1NTIwMTc=","upper_bound":"LTEzODM4NjYzNTg=","repeats":1},{"count":343,"lower_bound":"LTEzODM2MTA5MjU=","upper_bound":"LTEzNzYxMzMwMjg=","repeats":1},{"count":349,"lower_bound":"LTEzNzQzMTI5MjU=","upper_bound":"LTEzNjg4MTI4MDE=","repeats":1},{"count":355,"lower_bound":"LTEzNTIzNDMwMDI=","upper_bound":"LTEzNDUzNzY1MDU=","repeats":1},{"count":361,"lower_bound":"LTEzNDA4MzgxNjE=","upper_bound":"LTEzMzQyNTAxMTE=","repeats":1},{"count":367,"lower_bound":"LTEzMzM5ODE1OTM=","upper_bound":"LTEzMjkyMjcxOTI=","repeats":1},{"count":373,"lower_bound":"LTEzMjg3OTIzMjE=","upper_bound":"LTEzMjc1MjEwOTA=","repeats":1},{"count":379,"lower_bound":"LTEzMjQwMTQ3MzI=","upper_bound":"LTEzMjA3NzkxNjU=","repeats":1},{"count":387,"lower_bound":"LTEzMTk2NjUyNzc=","upper_bound":"LTEzMTE4MzQwODA=","repeats":1},{"count":395,"lower_bound":"LTEzMDc3NjUyMzQ=","upper_bound":"LTEzMDI0NzUzNjM=","repeats":1},{"count":403,"lower_bound":"LTEyOTU0NjI5MDI=","upper_bound":"LTEyNTkyMTQ5MTk=","repeats":1},{"count":411,"lower_bound":"LTEyNTkwOTIyMjM=","upper_bound":"LTEyMjUwNTU0MzY=","repeats":1},{"count":419,"lower_bound":"LTEyMjMyOTAwNzM=","upper_bound":"LTEyMTU2MjM4Mzg=","repeats":1},{"count":427,"lower_bound":"LTEyMTIyMDA5NTM=","upper_bound":"LTEyMDQ3NTA3MDQ=","repeats":1},{"count":435,"lower_bound":"LTEyMDIwMDI4NjE=","upper_bound":"LTExODgzNjMzNzA=","repeats":1},{"count":443,"lower_bound":"LTExODgyMjA2ODk=","upper_bound":"LTExODIxNzA0OTc=","repeats":1},{"count":451,"lower_bound":"LTExNzA4NTk0NDI=","upper_bound":"LTExNTUyNTcxNDA=","repeats":1},{"count":459,"lower_bound":"LTExNTA1MDgyNTI=","upper_bound":"LTExMjQzMTE2MTk=","repeats":1},{"count":467,"lower_bound":"LTExMTA2NDQwODM=","upper_bound":"LTEwOTk5NDkzNDU=","repeats":1},{"count":475,"lower_bound":"LTEwOTQ5MTAyODU=","upper_bound":"LTEwODk1MDk0MzI=","repeats":1},{"count":483,"lower_bound":"LTEwODMwMzY2NDk=","upper_bound":"LTEwNzAyMjI0NjY=","repeats":1},{"count":491,"lower_bound":"LTEwNjkyMTcyMTk=","upper_bound":"LTEwNTgyMTAwMjM=","repeats":1},{"count":499,"lower_bound":"LTEwNTU3NjMxOTA=","upper_bound":"LTEwNDM4NDI5NTY=","repeats":1},{"count":507,"lower_bound":"LTEwNDI1MTQzOTY=","upper_bound":"LTEwMjYxMDA5Mjg=","repeats":1},{"count":515,"lower_bound":"LTEwMjQxOTE2Mzc=","upper_bound":"LTEwMTYxMDA0NzU=","repeats":1},{"count":523,"lower_bound":"LTEwMTUzOTkwODU=","upper_bound":"LTEwMDg1NDU4MTI=","repeats":1},{"count":531,"lower_bound":"LTEwMDI2NzU5NTU=","upper_bound":"LTk5MDExODgyNw==","repeats":1},{"count":539,"lower_bound":"LTk4MzAxNzg3MQ==","upper_bound":"LTk2MzczMzMyNw==","repeats":1},{"count":547,"lower_bound":"LTk2MTI2NDYzNQ==","upper_bound":"LTk0OTU0NDI4NA==","repeats":1},{"count":555,"lower_bound":"LTk0NjUzOTc5MQ==","upper_bound":"LTkzNTczMDc4NA==","repeats":1},{"count":563,"lower_bound":"LTkxNzg4ODYxOA==","upper_bound":"LTkwMzYyMDAxNw==","repeats":1},{"count":571,"lower_bound":"LTkwMTE1NTY5OQ==","upper_bound":"LTg4ODQzMjQ2OQ==","repeats":1},{"count":579,"lower_bound":"LTg4NjU0NzM5OQ==","upper_bound":"LTg4NTA2ODM5Mw==","repeats":1},{"count":587,"lower_bound":"LTg4MjQxOTA5NQ==","upper_bound":"LTg3NjU4Nzc5Mg==","repeats":1},{"count":595,"lower_bound":"LTg3Mzc3Mzk4Mg==","upper_bound":"LTg2NTkwNzc4Nw==","repeats":1},{"count":603,"lower_bound":"LTg2NDQwMzAxNg==","upper_bound":"LTg1MjM2NjUyNA==","repeats":1},{"count":611,"lower_bound":"LTg1MDk3NDE2Mw==","upper_bound":"LTgyNTA3NjI2Ng==","repeats":1},{"count":619,"lower_bound":"LTgyMjQ3NjM2MA==","upper_bound":"LTgxMzc0NDY4NA==","repeats":1},{"count":627,"lower_bound":"LTc5Njc1NjcwNA==","upper_bound":"LTc4MDIxMjYyMQ==","repeats":1},{"count":635,"lower_bound":"LTc3OTc1MzkxNA==","upper_bound":"LTc3NTQwMTY0NA==","repeats":1},{"count":643,"lower_bound":"LTc3MzgzMjEzNg==","upper_bound":"LTc2MjQ3Mzc1MQ==","repeats":1},{"count":651,"lower_bound":"LTc2MTgwOTExNg==","upper_bound":"LTc0OTg0NjMxNQ==","repeats":1},{"count":659,"lower_bound":"LTcyODQ1MTQwOQ==","upper_bound":"LTcwODI4MDg4MA==","repeats":1},{"count":667,"lower_bound":"LTcwMTE4MzE2NA==","upper_bound":"LTY3ODUyMDc2Mw==","repeats":1},{"count":675,"lower_bound":"LTY3Nzc1MTQ0Mg==","upper_bound":"LTY2MDYyNTMxMQ==","repeats":1},{"count":683,"lower_bound":"LTY2MDQ3OTIyNA==","upper_bound":"LTY1NDgzMTkwOQ==","repeats":1},{"count":691,"lower_bound":"LTY1Mzk0ODc1Mg==","upper_bound":"LTY0MjczMzYyNA==","repeats":1},{"count":699,"lower_bound":"LTYzODI5ODczMg==","upper_bound":"LTYzMDYxNjk0OQ==","repeats":1},{"count":707,"lower_bound":"LTYyOTU1Mzc5OQ==","upper_bound":"LTYwNDgyMzAxMA==","repeats":1},{"count":715,"lower_bound":"LTYwMzk4MzM0MQ==","upper_bound":"LTU4ODM1OTcwNw==","repeats":1},{"count":723,"lower_bound":"LTU4NzY5ODU4Nw==","upper_bound":"LTU4MDA5NjY0MA==","repeats":1},{"count":731,"lower_bound":"LTU3NTc1NTA0Mg==","upper_bound":"LTU3MDUwNjIzMQ==","repeats":1},{"count":739,"lower_bound":"LTU2OTg3NDcyMw==","upper_bound":"LTU1NDY2NzI4Ng==","repeats":1},{"count":747,"lower_bound":"LTU1MzY5NjUwOA==","upper_bound":"LTUzMzYxMTU4OQ==","repeats":1},{"count":755,"lower_bound":"LTUzMjYzNzk5NA==","upper_bound":"LTUyNzUzNDc3OA==","repeats":1},{"count":763,"lower_bound":"LTUyMjkzNjQyMA==","upper_bound":"LTUwOTg1NjE5MA==","repeats":1},{"count":771,"lower_bound":"LTUwNTc3OTAyMA==","upper_bound":"LTQ5NDk2OTAxMw==","repeats":1},{"count":779,"lower_bound":"LTQ5MDQzNTc1MA==","upper_bound":"LTQ3MzQ4NDI5OA==","repeats":1},{"count":787,"lower_bound":"LTQ3Mjg0MzY4Mg==","upper_bound":"LTQ2MDYzODIyOQ==","repeats":1},{"count":795,"lower_bound":"LTQ1ODE5MDUwOQ==","upper_bound":"LTQzODMwNzYxMg==","repeats":1},{"count":803,"lower_bound":"LTQzNTM2NzEwOA==","upper_bound":"LTQxMzA3OTUyNw==","repeats":1},{"count":811,"lower_bound":"LTQxMjgzNzExMg==","upper_bound":"LTQwMDU4MDA5OA==","repeats":1},{"count":819,"lower_bound":"LTM5MTkwOTQ1Ng==","upper_bound":"LTM3MjQ0MzYzMA==","repeats":1},{"count":827,"lower_bound":"LTM3MTA1NzU4MQ==","upper_bound":"LTM1OTM2NjU2Ng==","repeats":1},{"count":835,"lower_bound":"LTM1NTcxNTY1MQ==","upper_bound":"LTM1NDk1MDUyNw==","repeats":1},{"count":843,"lower_bound":"LTM1NDkxNzc5Mg==","upper_bound":"LTM0MTQ4NTcyNg==","repeats":1},{"count":851,"lower_bound":"LTMzODUxNTIzMQ==","upper_bound":"LTMyODQyNzk1NA==","repeats":1},{"count":859,"lower_bound":"LTMyNjY2Mzc0Nw==","upper_bound":"LTMxODkwODE3MQ==","repeats":1},{"count":867,"lower_bound":"LTMxNzU4NjE5OQ==","upper_bound":"LTI5NjQ2MjI1MA==","repeats":1},{"count":875,"lower_bound":"LTI4ODE1ODg1OA==","upper_bound":"LTI4MjQ4MzM5Ng==","repeats":1},{"count":883,"lower_bound":"LTI4MDM4MjQzMw==","upper_bound":"LTI2Mzc1MzE0Mg==","repeats":1},{"count":891,"lower_bound":"LTI2MDE3MDIwMQ==","upper_bound":"LTIzNjAwNjg4OQ==","repeats":1},{"count":899,"lower_bound":"LTIzMjM0Mzg0Nw==","upper_bound":"LTIzMTA1NDM3NA==","repeats":1},{"count":907,"lower_bound":"LTIxMzE4NTM2OQ==","upper_bound":"LTIwODgzNjA2NA==","repeats":1},{"count":915,"lower_bound":"LTIwNjExMTAyNw==","upper_bound":"LTE5MzI5ODg1MA==","repeats":1},{"count":923,"lower_bound":"LTE5MTA4MDg4NA==","upper_bound":"LTE3Nzg1NjY1Ng==","repeats":1},{"count":931,"lower_bound":"LTE3Nzc2MDAyMw==","upper_bound":"LTE2MjQ0NDIyOA==","repeats":1},{"count":939,"lower_bound":"LTE1OTc4MDYyNw==","upper_bound":"LTE1MDM3MjA0Mw==","repeats":1},{"count":947,"lower_bound":"LTE0NTk4NzU1MQ==","upper_bound":"LTEzNTcwMDYxNQ==","repeats":1},{"count":955,"lower_bound":"LTEzMTM3MDQxNQ==","upper_bound":"LTEyMjk2OTc0Mg==","repeats":1},{"count":963,"lower_bound":"LTEyMjQxNTE5Mg==","upper_bound":"LTExNDcwNzUwNQ==","repeats":1},{"count":971,"lower_bound":"LTExMDA3OTc0Mg==","upper_bound":"LTk0OTM3MTI4","repeats":1},{"count":979,"lower_bound":"LTkwOTQzODc1","upper_bound":"LTc4MzI2Mzc3","repeats":1},{"count":987,"lower_bound":"LTc0NDg0OTE2","upper_bound":"LTQ4NjgxODc3","repeats":1},{"count":995,"lower_bound":"LTQ1MzY3MjUy","upper_bound":"LTQwMTI1MDYy","repeats":1},{"count":1003,"lower_bound":"LTM5OTk4MzUx","upper_bound":"LTMxNzA3Mzg4","repeats":1},{"count":1011,"lower_bound":"LTI5NjU2MjI5","upper_bound":"LTIyMzg1NDUw","repeats":1},{"count":1019,"lower_bound":"LTkyMTg5NDc=","upper_bound":"LTY1NzE3Mg==","repeats":1},{"count":1027,"lower_bound":"MTcxODA2Nw==","upper_bound":"ODE3ODQ1NA==","repeats":1},{"count":1035,"lower_bound":"MTMxMDI3Nzk=","upper_bound":"MjQ0NjIwNzg=","repeats":1},{"count":1043,"lower_bound":"MjQ0NjYyMTc=","upper_bound":"NDQxMDMzNjM=","repeats":1},{"count":1051,"lower_bound":"NDUxNDYwODk=","upper_bound":"NTkyMTA2MDc=","repeats":1},{"count":1059,"lower_bound":"NTk1MjYzODk=","upper_bound":"Njg1Nzk0OTE=","repeats":1},{"count":1067,"lower_bound":"NzQxMzczMTY=","upper_bound":"ODY3MzExNDA=","repeats":1},{"count":1075,"lower_bound":"ODc4MTc4MTg=","upper_bound":"MTAwNzc0Mzgx","repeats":1},{"count":1083,"lower_bound":"MTA5NjUxMjcx","upper_bound":"MTE4NTkyMzI3","repeats":1},{"count":1091,"lower_bound":"MTE5ODEwMzA5","upper_bound":"MTMwMTY2NTcz","repeats":1},{"count":1099,"lower_bound":"MTQ1NjYxNjAw","upper_bound":"MTU2Mjg1MDg3","repeats":1},{"count":1107,"lower_bound":"MTU4MDE2MDYz","upper_bound":"MTc4MzA5NTE2","repeats":1},{"count":1115,"lower_bound":"MTc5MjQzODc2","upper_bound":"MjAwMTc5MDI4","repeats":1},{"count":1123,"lower_bound":"MjAxNDU0OTgz","upper_bound":"MjE5MzY3NTMy","repeats":1},{"count":1131,"lower_bound":"MjIwMDM0NjI1","upper_bound":"MjQ5MDU3ODE2","repeats":1},{"count":1139,"lower_bound":"MjQ5ODQ0NzM1","upper_bound":"MjU3MzAwMTk2","repeats":1},{"count":1147,"lower_bound":"MjY0MTEzMTAz","upper_bound":"MjY3NDYyODY2","repeats":1},{"count":1155,"lower_bound":"MjcwNDEyODk1","upper_bound":"MjcyNjczNDg2","repeats":1},{"count":1163,"lower_bound":"Mjc3MzAxODU5","upper_bound":"MjkxNjY3Njcz","repeats":1},{"count":1171,"lower_bound":"MzAyNTM3NTUz","upper_bound":"MzEzNDk1NDUx","repeats":1},{"count":1179,"lower_bound":"MzIxNjk4NDEw","upper_bound":"MzQwMDA2NDE5","repeats":1},{"count":1187,"lower_bound":"MzQwNTk3NTA2","upper_bound":"MzQzNDE4ODEw","repeats":1},{"count":1195,"lower_bound":"MzUwMTYwNDQx","upper_bound":"MzgwMjc3NDE0","repeats":1},{"count":1203,"lower_bound":"MzkxMjk0NjA4","upper_bound":"NDA0MjQ0NTI0","repeats":1},{"count":1211,"lower_bound":"NDExMzk5NTU2","upper_bound":"NDE5ODgwMDM5","repeats":1},{"count":1219,"lower_bound":"NDMxNTgxNjY4","upper_bound":"NDM2MjY0MDc1","repeats":1},{"count":1227,"lower_bound":"NDM3Mzg1MTI5","upper_bound":"NDQ3MDQzNjc0","repeats":1},{"count":1235,"lower_bound":"NDQ5ODUxMjkw","upper_bound":"NDU3OTg1Njg0","repeats":1},{"count":1243,"lower_bound":"NDU4ODI3MzAz","upper_bound":"NDcwOTY1Mzg1","repeats":1},{"count":1251,"lower_bound":"NDgxMzkxMzA1","upper_bound":"NTA3OTg0NTUx","repeats":1},{"count":1259,"lower_bound":"NTA5MzM0Mzg2","upper_bound":"NTI0OTg4NDUw","repeats":1},{"count":1267,"lower_bound":"NTI5NDU3NzIw","upper_bound":"NTUwMjM2NDI4","repeats":1},{"count":1275,"lower_bound":"NTU2NTY4OTU5","upper_bound":"NTc2NDExMTc0","repeats":1},{"count":1283,"lower_bound":"NTc5MTIxMjg2","upper_bound":"NjEwNzczODU4","repeats":1},{"count":1291,"lower_bound":"NjE3MDI4ODg2","upper_bound":"NjE4NzQzNjAz","repeats":1},{"count":1299,"lower_bound":"NjIwMDA4Mzcy","upper_bound":"NjM5MDAwNzA0","repeats":1},{"count":1307,"lower_bound":"NjQyNTU3ODMz","upper_bound":"NjU4NzU5NDE3","repeats":1},{"count":1315,"lower_bound":"NjYwMDY3NDY0","upper_bound":"Njc1OTc3OTM0","repeats":1},{"count":1323,"lower_bound":"NjgzNzEyMDc2","upper_bound":"NjkyNDYzMTUx","repeats":1},{"count":1331,"lower_bound":"NzAxMTI0NjI1","upper_bound":"NzIxMzM3Njk2","repeats":1},{"count":1339,"lower_bound":"NzIyNTcyNDc3","upper_bound":"NzMyMDg4MzM2","repeats":1},{"count":1347,"lower_bound":"NzMyOTQwNjAz","upper_bound":"NzQ5Nzc0NTY4","repeats":1},{"count":1355,"lower_bound":"NzUxNzkxNTUx","upper_bound":"NzY5MDg5MDQ5","repeats":1},{"count":1363,"lower_bound":"NzY5MzkyOTA4","upper_bound":"NzgwNDkxNzI0","repeats":1},{"count":1371,"lower_bound":"NzgxNTA4MjYz","upper_bound":"Nzg0NjA3MTE3","repeats":1},{"count":1379,"lower_bound":"NzkzODQ3OTYw","upper_bound":"ODA2MzQ3MjYy","repeats":1},{"count":1387,"lower_bound":"ODIwMjc1OTg5","upper_bound":"ODM3OTMxMTA3","repeats":1},{"count":1395,"lower_bound":"ODM5MDcyODg0","upper_bound":"ODQxNzczMzM2","repeats":1},{"count":1403,"lower_bound":"ODUwODAzNjY0","upper_bound":"ODc5MjI1Mzkz","repeats":1},{"count":1411,"lower_bound":"ODgxMjA0NjA5","upper_bound":"ODg2NzA1NDE0","repeats":1},{"count":1419,"lower_bound":"ODg4OTMzNzE4","upper_bound":"ODk1MjgwNzg0","repeats":1},{"count":1427,"lower_bound":"ODk4NjAwODE5","upper_bound":"OTEwMDE2Mzkz","repeats":1},{"count":1435,"lower_bound":"OTM2MDk5MTY4","upper_bound":"OTQyNTQ0Mzky","repeats":1},{"count":1443,"lower_bound":"OTQyNTcxMjAy","upper_bound":"OTYwMDE5NDky","repeats":1},{"count":1451,"lower_bound":"OTczNzk4MTg2","upper_bound":"OTc5MTY1ODAw","repeats":1},{"count":1459,"lower_bound":"OTg0MjM0MTE0","upper_bound":"OTkxNDcyOTg5","repeats":1},{"count":1467,"lower_bound":"OTk2Mzg4NTU1","upper_bound":"MTAwOTU0ODYzMw==","repeats":1},{"count":1475,"lower_bound":"MTAxNjM2OTIyNA==","upper_bound":"MTAzNTc0OTIyMQ==","repeats":1},{"count":1483,"lower_bound":"MTA1MTQ2MjA3OA==","upper_bound":"MTA1NjA5NzY2Mg==","repeats":1},{"count":1491,"lower_bound":"MTA1OTk2MjExMA==","upper_bound":"MTA3ODM0NDQ5NQ==","repeats":1},{"count":1499,"lower_bound":"MTA3ODg3MzE3MA==","upper_bound":"MTA5NjQwOTMzNA==","repeats":1},{"count":1507,"lower_bound":"MTEwMDU3ODg0Nw==","upper_bound":"MTExODQyMjA5OQ==","repeats":1},{"count":1515,"lower_bound":"MTExOTczNjYxOA==","upper_bound":"MTEyNDgzNTUwNA==","repeats":1},{"count":1523,"lower_bound":"MTEzMzUyODI0Mw==","upper_bound":"MTE0MzQ1MjM3OQ==","repeats":1},{"count":1531,"lower_bound":"MTE0NDEzNjg1MQ==","upper_bound":"MTE1MzYyOTg0MQ==","repeats":1},{"count":1539,"lower_bound":"MTE1NTI5MDk3OA==","upper_bound":"MTE1ODM4MzA5NQ==","repeats":1},{"count":1547,"lower_bound":"MTE3NTgzOTU2OA==","upper_bound":"MTE4MDkwMTIzMg==","repeats":1},{"count":1555,"lower_bound":"MTE4Mzc3NTM0OA==","upper_bound":"MTE5MzI0OTIwMQ==","repeats":1},{"count":1563,"lower_bound":"MTE5NDI1OTMyOA==","upper_bound":"MTIwOTMxODcwMA==","repeats":1},{"count":1571,"lower_bound":"MTIxMDkzNjIyNQ==","upper_bound":"MTIzODAwNTUxNQ==","repeats":1},{"count":1579,"lower_bound":"MTI0MDA5MzczOA==","upper_bound":"MTI1MDQ4OTMwNQ==","repeats":1},{"count":1587,"lower_bound":"MTI1MjMxNDI1OQ==","upper_bound":"MTI3ODEyMDM5Nw==","repeats":1},{"count":1595,"lower_bound":"MTI4MDQxMDY2MQ==","upper_bound":"MTI5OTQ4ODI5OA==","repeats":1},{"count":1603,"lower_bound":"MTMwMjM1OTkwMA==","upper_bound":"MTMwNzAzNTM3NQ==","repeats":1},{"count":1611,"lower_bound":"MTMwODI0ODMzMA==","upper_bound":"MTMxNjEzNDIxOQ==","repeats":1},{"count":1619,"lower_bound":"MTMyMDY5NTc5MA==","upper_bound":"MTMzMzYzMTgwMw==","repeats":1},{"count":1627,"lower_bound":"MTMzNDQ1MTMxOQ==","upper_bound":"MTM0NjI0OTI2Mg==","repeats":1},{"count":1635,"lower_bound":"MTM1MzgyMjgwMw==","upper_bound":"MTM2MjMwNjIxOA==","repeats":1},{"count":1643,"lower_bound":"MTM3NjMyODQxNA==","upper_bound":"MTM5MTQzNjUzMg==","repeats":1},{"count":1651,"lower_bound":"MTM5MjM1NzE1MQ==","upper_bound":"MTQxMTk4NTY3MQ==","repeats":1},{"count":1659,"lower_bound":"MTQyMjQwNjYzOQ==","upper_bound":"MTQzNjg4OTE1OA==","repeats":1},{"count":1667,"lower_bound":"MTQzOTM4ODg0MQ==","upper_bound":"MTQ1MTE0NTY1OQ==","repeats":1},{"count":1675,"lower_bound":"MTQ1MzgyODU5Mg==","upper_bound":"MTQ2ODI5NzIxNg==","repeats":1},{"count":1683,"lower_bound":"MTQ3NTgxMTQyOQ==","upper_bound":"MTQ5MzcxODIwMQ==","repeats":1},{"count":1691,"lower_bound":"MTQ5NDE1MTgwMg==","upper_bound":"MTUyMzMyNjgyNA==","repeats":1},{"count":1699,"lower_bound":"MTUyNTA1ODM3MQ==","upper_bound":"MTUzNTQwMzUxMw==","repeats":1},{"count":1707,"lower_bound":"MTUzODA0OTEzMw==","upper_bound":"MTU0NTI1MzYzMg==","repeats":1},{"count":1715,"lower_bound":"MTU1MDUzNzc4MA==","upper_bound":"MTU2NjM4NTQyMA==","repeats":1},{"count":1723,"lower_bound":"MTU2NzI0MTI4Mg==","upper_bound":"MTU5NjQ3OTIyNA==","repeats":1},{"count":1731,"lower_bound":"MTYwNTMzMzA1Mw==","upper_bound":"MTYwODc1NDY4Mg==","repeats":1},{"count":1739,"lower_bound":"MTYxMDQ0MDEzMg==","upper_bound":"MTYxNjMxMTUzNg==","repeats":1},{"count":1747,"lower_bound":"MTYzMjk2MzE2OQ==","upper_bound":"MTY2MTIyMzEyMA==","repeats":1},{"count":1755,"lower_bound":"MTY2MzM0NzI1NA==","upper_bound":"MTY4NzA2OTU3Mw==","repeats":1},{"count":1763,"lower_bound":"MTY5MTY3ODExOA==","upper_bound":"MTcwMDc2NjEzMQ==","repeats":1},{"count":1771,"lower_bound":"MTcwNzU4NDUwMA==","upper_bound":"MTczMjYwNDA3Ng==","repeats":1},{"count":1779,"lower_bound":"MTczNDk5NzM3NA==","upper_bound":"MTc0NDUyNTA1MQ==","repeats":1},{"count":1787,"lower_bound":"MTc0NjQ1NTI5Ng==","upper_bound":"MTc0OTcwNDgxMQ==","repeats":1},{"count":1795,"lower_bound":"MTc1MDg3MjQwOA==","upper_bound":"MTc3NzAwMzg5NQ==","repeats":1},{"count":1803,"lower_bound":"MTc4NDA1Nzc4Ng==","upper_bound":"MTgwMTQ3MTc0MQ==","repeats":1},{"count":1811,"lower_bound":"MTgwMzQxNjU5NQ==","upper_bound":"MTgxMTc1NDA3Mw==","repeats":1},{"count":1819,"lower_bound":"MTgxNTE4MzAwOQ==","upper_bound":"MTgyMTgzNjc5OQ==","repeats":1},{"count":1827,"lower_bound":"MTgyODAxMTY0NQ==","upper_bound":"MTgzMzQ3MTg3Mg==","repeats":1},{"count":1835,"lower_bound":"MTgzNzY3MDg5Mg==","upper_bound":"MTg1MDM0ODAxMw==","repeats":1},{"count":1843,"lower_bound":"MTg1MDUyMTEyNg==","upper_bound":"MTg1NTExNTg3NQ==","repeats":1},{"count":1851,"lower_bound":"MTg2ODQwMTg2Ng==","upper_bound":"MTkyNTIzMzM1OQ==","repeats":1},{"count":1859,"lower_bound":"MTkyODU4NjY2Mw==","upper_bound":"MTk0MDQzMDQwOA==","repeats":1},{"count":1867,"lower_bound":"MTk0MDY5NDk1Mw==","upper_bound":"MTk0OTQ1MDEwMg==","repeats":1},{"count":1875,"lower_bound":"MTk1MzUyNjA2Mg==","upper_bound":"MTk2NjUyMTcwMg==","repeats":1},{"count":1883,"lower_bound":"MTk2ODM1NTU0Ng==","upper_bound":"MTk3MDU1MTk0Mw==","repeats":1},{"count":1891,"lower_bound":"MTk3MDY4MzY0Mg==","upper_bound":"MTk3Nzc0OTI0Mw==","repeats":1},{"count":1899,"lower_bound":"MTk4Mzk0OTg5Mg==","upper_bound":"MTk5MzEyODkwOQ==","repeats":1},{"count":1907,"lower_bound":"MjAwNTkxNzc1OQ==","upper_bound":"MjAxMzE2NzcwMg==","repeats":1},{"count":1915,"lower_bound":"MjAxNjM5OTg1Nw==","upper_bound":"MjAzMDMyMDMyOQ==","repeats":1},{"count":1923,"lower_bound":"MjAzNjc1MDk4OQ==","upper_bound":"MjA0NDYwNDcxMg==","repeats":1},{"count":1931,"lower_bound":"MjA0NTUyMjk4Mw==","upper_bound":"MjA1MDI0NjU3OA==","repeats":1},{"count":1939,"lower_bound":"MjA1OTk4OTYyNQ==","upper_bound":"MjA2ODEyMzA0Nw==","repeats":1},{"count":1947,"lower_bound":"MjA2OTYyODcyNA==","upper_bound":"MjA3OTY0NjIwMA==","repeats":1},{"count":1955,"lower_bound":"MjA4MDY5MjM1Mw==","upper_bound":"MjA4OTM5MzI2OQ==","repeats":1},{"count":1963,"lower_bound":"MjA5MTY4MzU1MA==","upper_bound":"MjA5ODE5NTIzNA==","repeats":1},{"count":1971,"lower_bound":"MjEwNDEwMDM4Ng==","upper_bound":"MjEwODU0NjUxNA==","repeats":1},{"count":1979,"lower_bound":"MjEwODc0MTk0Mw==","upper_bound":"MjExMTQ2MjY5OA==","repeats":1},{"count":1987,"lower_bound":"MjExODE1NDE3MQ==","upper_bound":"MjEzMDE2MDAzMw==","repeats":1},{"count":1995,"lower_bound":"MjEzMDQxMjY4OA==","upper_bound":"MjE0Mzg5MjA1MA==","repeats":1},{"count":1999,"lower_bound":"MjE0Mzk1NjM5NQ==","upper_bound":"MjE0NTY0OTU3MA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,2,2,1,0,3,0,1,0,1,1,1,2,0,0,0,1,0,0,1,3,1,0,0,2,1,2,0,0,1,0,1,0,0,1,1,1,1,1,2,1,1,0,0,0,1,3,0,0,0,0,1,0,1,0,2,1,1,1,1,0,0,1,0,1,1,6,3,0,1,3,2,1,1,3,2,1,0,2,2,1,1,2,0,3,0,0,0,0,0,7,0,1,1,1,1,0,1,2,2,1,2,2,1,0,1,1,4,2,1,2,3,1,0,0,0,1,1,1,1,1,1,1,0,2,3,0,1,3,0,3,0,2,1,3,1,2,0,1,1,1,0,0,1,0,1,2,0,3,0,1,1,1,0,2,2,0,0,1,0,1,1,0,1,4,1,0,2,3,2,1,1,3,1,0,2,0,1,0,1,0,0,2,0,2,0,0,2,2,0,2,2,1,1,1,0,1,0,2,1,2,0,2,2,0,1,3,0,0,0,0,2,2,0,4,0,0,1,2,0,1,2,1,2,2,1,2,2,0,2,3,1,1,0,1,0,0,0,2,0,3,2,1,2,0,0,0,0,0,0,2,1,1,0,1,1,2,1,1,3,2,0,1,1,3,1,2,1,0,2,1,1,1,1,1,1,0,0,0,1,2,1,3,0,1,1,0,0,3,2,0,0,1,0,0,2,2,2,2,1,0,0,4,1,1,2,0,1,3,1,1,0,2,1,1,0,1,1,1,2,1,2,1,1,2,0,0,0,0,0,1,2,0,0,1,2,1,0,1,1,2,2,1,2,0,1,0,0,2,2,2,0,1,1,1,1,2,2,0,3,1,2,2,1,1,0,1,3,1,3,1,2,1,1,3,2,1,1,2,2,2,0,0,0,1,1,1,1,1,2,1,2,1,3,0,1,0,0,1,0,1,2,0,1,0,3,0,0,1,1,0,2,2,1,0,0,2,4,0,0,1,1,1,1,3,2,1,0,1,0,1,2,0,1,1,0,2,1,1,2,0,0,1,1,2,0,2,0,3,1,2,3,3,2,1,0,1,1,0,1,2,2,0,2,0,1,0,1,0,1,2,4,0,0,0,1,0,0,1,0,0,2,2,3,0,0,1,0,0,2,0,1,1,1,0,2,2,0,2,0,1,1,0,0,1,3,1,3,1,0,1,1,1,0,0,1,1,0,0,1,0,0,3,1,0,4,0,3,0,1,0,1,2,3,0,3,1,0,1,3,0,2,1,1,0,1,1,0,0,0,1,0,0,0,3,1,0,1,1,2,1,1,0,0,0,2,2,2,0,1,0,0,1,2,0,1,0,2,0,0,1,0,0,2,0,0,1,0,1,0,0,0,1,1,1,2,2,0,2,0,1,0,2,0,1,1,1,0,0,1,0,2,1,2,0,1,3,0,0,1,1,1,0,1,1,0,2,1,0,0,1,1,2,0,1,0,1,2,0,1,1,2,3,2,2,1,2,1,1,1,0,0,3,3,1,1,1,0,0,1,0,1,3,0,1,0,1,3,0,0,1,4,0,2,0,1,1,3,1,0,2,1,2,3,0,0,0,0,2,0,1,0,0,0,1,1,0,1,0,1,1,0,0,1,0,1,1,1,0,0,0,1,3,0,1,1,0,2,2,1,2,0,0,1,2,1,1,0,3,1,0,0,2,1,0,0,1,0,0,1,0,1,0,3,0,2,2,0,1,0,2,0,1,1,0,1,3,1,1,1,2,2,1,1,0,1,4,2,1,0,0,3,0,1,0,3,0,2,1,0,0,0,0,1,1,2,3,2,1,0,0,0,0,1,0,0,1,0,2,1,0,1,0,0,0,0,1,0,3,0,1,0,4,2,2,2,0,1,0,0,0,1,3,0,2,0,0,4,0,0,1,2,1,0,3,1,1,0,1,3,1,0,3,1,0,1,1,2,1,0,2,0,1,2,0,0,0,1,0,0,2,1,0,0,1,1,0,0,0,2,1,1,3,1,1,1,0,1,0,0,1,2,0,2,1,1,1,0,0,0,3,0,0,0,1,2,1,1,1,1,0,1,3,1,0,1,0,0,2,1,0,2,2,0,0,2,0,1,0,0,0,0,1,0,2,1,0,0,0,1,2,1,0,1,0,0,1,3,0,3,1,0,2,3,1,0,0,2,1,2,0,1,0,0,0,1,1,2,0,0,0,4,1,1,2,1,2,4,0,0,0,1,1,4,0,1,2,1,1,2,1,1,1,0,1,2,1,0,1,1,1,0,2,0,1,1,0,3,0,0,1,0,0,0,1,0,0,0,3,0,1,1,1,1,0,3,2,1,1,2,0,0,2,1,2,0,0,1,0,1,0,2,1,0,1,3,2,0,0,1,1,1,1,2,1,1,2,0,2,2,2,1,1,0,3,1,1,2,2,0,0,1,2,2,1,2,2,0,0,1,0,1,2,0,0,1,0,1,0,1,0,1,2,0,1,1,1,0,2,1,0,0,1,3,1,1,3,1,1,1,0,1,2,1,1,1,0,0,1,0,2,1,2,1,0,1,2,2,0,1,2,0,0,1,0,2,3,1,1,1,0,0,1,1,2,1,0,1,0,0,1,1,2,3,2,0,1,0,0,0,2,0,1,0,0,1,3,2,2,1,1,0,0,0,2,0,0,2,0,1,1,1,2,0,0,1,0,0,2,2,1,0,0,0,1,0,0,1,2,1,2,2,2,4,1,0,0,2,0,1,0,2,2,1,2,0,1,1,2,0,1,0,1,1,4,1,1,0,1,1,0,1,0,0,0,3,3,0,2,0,2,0,1,2,1,0,2,0,1,2,0,1,2,1,1,0,4,0,1,1,2,0,3,0,0,0,1,0,0,1,1,0,1,2,0,1,4,0,0,2,0,0,1,0,2,2,0,0,0,2,1,2,0,1,1,2,1,0,2,1,1,0,1,0,0,2,1,1,0,1,0,0,2,3,0,0,0,0,2,0,1,1,1,0,0,3,1,0,0,0,1,1,0,1,0,1,1,2,0,0,1,0,0,0,1,1,1,4,0,2,1,1,0,1,0,1,1,0,1,0,0,1,1,1,2,1,0,2,2,0,1,0,0,1,1,1,0,1,1,1,0,1,0,0,0,0,0,1,0,2,1,1,0,1,4,0,0,0,0,1,1,0,1,0,1,0,0,0,2,0,1,1,1,2,2,1,1,1,2,2,2,2,0,3,2,2,0,3,1,0,2,1,0,0,1,0,1,0,1,1,0,2,1,0,0,0,1,1,2,1,3,3,0,2,0,2,0,0,1,1,3,0,0,2,3,3,1,2,1,0,0,1,2,1,0,2,1,0,3,2,0,0,0,1,1,0,2,0,0,3,0,0,1,2,1,2,0,1,1,0,0,2,0,1,1,1,1,2,1,0,2,0,2,1,0,1,1,0,2,1,0,1,1,0,0,4,1,0,3,2,0,0,0,1,0,1,1,1,2,1,1,3,0,1,1,1,2,1,0,3,1,1,1,0,1,0,2,1,2,2,0,1,1,3,1,0,0,1,2,0,0,2,1,3,2,1,0,0,1,1,2,1,2,1,3,2,0,3,0,1,3,2,5,1,2,1,0,1,1,0,0,1,1,1,1,0,3,1,2,0,2,0,1,0,1,2,1,0,2,2,2,0,2,1,1,0,1,0,1,1,3,0,0,2,2,0,1,2,2,0,0,0,0,1,1,1,1,0,1,1,1,1,1,5,2,0,0,0,1,0,0,0,1,0,1,1,2,2,3,1,1,1,0,1,1,1,3,1,1,1,0,1,0,2,1,1,0,1,1,2,0,0,3,0,1,1,1,2,1,0,1,2,4,0,0,0,0,1,1,1,1,1,3,1,0,2,1,1,1,0,1,2,3,1,1,1,0,1,1,4,0,2,3,1,0,1,2,1,1,0,1,0,1,2,0,1,0,0,0,1,2,1,0,2,0,2,1,2,0,2,2,0,0,0,2,0,0,2,2,1,2,1,4,1,2,1,0,2,2,0,0,1,0,0,1,0,1,1,0,4,1,0,0,2,2,1,1,0,0,0,0,1,1,0,1,2,0,3,1,0,1,1,0,0,0,0,0,2,2,1,1,0,0,0,0,0,0,0,1,1,0,1,2,1,0,1,1,0,1,1,2,0,1,1,2,2,0,0,3,0,1,0,1,0,1,1,0,0,2,1,2,1,1,0,0,1,1,1,1,2,2,2,2,0,0,0,0,0,0,1,1,0,0,3,3,0,0,0,0,0,0,0,2,1,0,1,0,1,0,1,0,1,1,0,1,0,1,0,2,0,2,2,0,1,1,2,1,1,0,2,2,2,2,0,1,2,2,2,1,3,1,3,2,1,1,0,1,1,1,1,1,2,0,1,0,1,2,2,0,1,2,1,0,0,1,1,1,0,1,1,1,0,0,2,1,0,1,1,0,2,0,0,1,2,1,2,1,1,2,3,1,1,1,4,1,0,0,1,0,3,2,0,0,1,1,1,3,2,0,0,0,1,1,1,1,0,0,1,0,0,1,0,1,2,1,0,1,2,2,0,0,1,3,1,0,1,2,1,0,1,1,1,3,1,1,1,0,1,0,2,0,0,1,0,1,0,0,0,2,2,1,2,3,1,0,0,0]},{"counters":[3,0,1,1,0,1,1,0,3,0,1,0,1,0,3,0,2,1,1,3,1,3,0,2,0,1,3,0,1,1,1,2,1,2,1,3,0,0,1,0,0,0,2,0,2,0,1,4,1,2,4,0,1,0,2,1,2,2,1,0,2,0,1,1,0,1,2,0,0,1,1,2,1,0,0,0,0,0,2,0,1,1,0,2,4,1,2,2,1,0,3,0,1,0,1,2,2,0,0,1,2,1,0,2,0,2,0,1,2,0,0,1,1,0,0,2,0,2,2,0,0,2,0,1,1,2,1,2,3,2,1,3,0,2,0,0,1,1,1,2,1,0,2,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,2,3,0,2,1,2,3,0,2,0,3,0,1,2,1,0,2,0,1,1,3,2,2,2,2,1,1,1,0,2,0,0,0,1,4,0,1,3,1,1,2,1,0,3,0,1,1,1,4,0,2,0,2,1,0,0,2,1,0,5,1,1,1,1,0,0,0,0,3,0,1,0,0,1,1,1,0,3,1,1,1,0,1,0,1,0,0,4,0,0,0,1,0,1,2,0,2,1,1,1,2,0,3,1,0,0,0,3,0,0,0,2,1,2,0,3,0,2,1,0,0,0,2,0,3,0,2,2,1,1,0,0,1,2,0,2,1,0,2,1,2,0,1,0,1,1,0,0,0,0,2,1,3,1,2,0,1,1,1,0,0,1,0,0,2,1,0,2,0,1,1,0,1,0,1,0,1,2,1,1,0,0,0,0,0,1,1,1,1,1,0,1,0,0,0,1,1,0,0,3,0,2,0,2,2,1,0,2,2,2,1,1,0,2,1,0,1,0,0,1,2,0,0,0,1,1,0,0,2,2,1,0,2,1,2,1,0,1,0,0,0,0,1,2,3,1,0,0,2,0,0,0,0,0,2,1,0,0,2,0,1,0,0,1,0,0,0,0,0,1,3,0,3,0,1,1,1,0,1,1,0,4,1,1,1,0,2,0,0,0,1,0,0,0,1,0,2,1,0,0,2,1,0,1,1,1,1,0,1,1,0,0,2,0,1,2,0,0,1,1,0,1,1,2,1,0,1,3,0,1,1,1,1,2,0,0,1,1,1,1,1,1,0,4,0,0,0,2,0,0,2,0,1,0,1,2,1,0,2,2,2,1,1,1,1,0,3,1,2,1,1,0,0,2,2,2,1,2,1,1,0,1,1,2,0,0,0,0,0,3,0,0,0,4,7,3,2,1,1,1,3,0,1,4,1,0,1,3,2,0,0,0,1,1,2,0,1,2,0,1,2,0,1,1,1,1,2,0,2,0,2,0,4,1,0,0,0,2,3,0,1,1,1,2,1,0,1,0,0,0,1,0,2,2,2,1,1,0,1,2,0,3,3,0,1,1,0,0,1,1,1,0,0,0,0,0,0,2,0,0,1,2,1,2,2,0,0,3,2,0,0,1,1,2,1,1,1,0,2,3,1,0,0,0,1,0,3,0,1,0,1,0,1,1,0,2,2,2,1,1,2,1,1,0,2,0,1,0,1,1,0,1,1,1,4,1,1,1,1,0,4,3,0,1,0,1,2,1,3,2,1,1,0,1,0,0,1,1,1,1,2,1,1,0,3,1,0,1,1,0,1,0,0,2,1,1,1,1,1,0,1,1,1,1,0,0,2,0,0,0,1,4,0,1,0,2,2,1,0,0,3,0,1,1,1,2,1,2,2,0,2,0,1,2,1,1,0,1,1,1,1,0,1,1,0,3,1,1,2,1,1,0,0,3,1,1,1,1,2,0,2,1,1,0,1,1,2,2,1,1,1,0,0,1,1,1,0,0,3,0,1,0,1,0,2,1,0,1,2,1,0,2,1,3,2,0,0,0,2,1,2,5,1,0,1,1,2,0,0,0,1,1,1,0,1,1,0,1,0,1,2,0,0,2,0,0,0,0,0,1,0,0,0,1,0,2,0,2,1,2,1,0,1,4,0,0,1,2,0,0,1,1,0,0,0,2,1,1,1,1,3,1,0,0,2,0,0,1,1,1,0,0,1,3,0,4,0,0,1,2,1,0,2,0,2,4,0,2,1,0,1,0,2,0,0,1,1,0,2,0,1,1,1,3,2,0,2,1,0,2,2,1,0,0,0,0,1,4,0,1,2,1,2,0,1,4,3,2,1,2,0,1,2,2,2,0,2,1,0,2,0,0,2,2,2,1,1,2,0,1,0,0,1,0,0,0,1,2,2,2,1,0,1,1,2,0,0,1,2,1,1,1,0,1,0,2,2,2,0,0,1,0,1,0,2,0,1,1,3,3,0,0,0,2,1,0,1,1,1,0,1,1,0,0,0,2,0,3,0,1,0,1,1,0,0,1,2,2,2,1,1,0,2,0,1,1,1,1,2,1,1,3,1,3,1,0,1,0,1,0,0,0,0,2,0,2,1,0,0,2,2,0,1,0,1,1,1,3,1,1,1,2,0,3,0,2,2,2,0,2,1,1,2,0,0,0,2,2,0,2,0,1,1,3,2,0,1,0,0,1,0,1,1,1,2,0,1,3,1,2,0,0,0,0,2,0,0,0,1,3,1,0,2,0,0,2,1,2,3,0,1,1,0,2,1,1,1,0,1,1,1,0,1,1,1,2,1,1,0,2,1,1,0,1,0,1,1,1,1,0,0,1,0,1,1,1,2,0,1,1,0,0,2,0,0,0,1,1,0,0,1,1,0,0,0,3,0,3,1,0,3,0,0,1,1,2,1,3,0,3,3,0,1,1,2,1,3,1,0,0,1,0,2,0,1,0,2,1,2,0,0,1,2,1,0,0,1,3,2,0,2,3,1,1,1,2,0,2,0,2,0,1,1,0,1,1,3,1,2,0,0,0,1,0,1,0,2,0,0,0,0,1,2,0,0,2,4,1,1,0,1,1,0,2,1,1,3,2,0,2,2,1,0,0,2,2,0,0,2,0,2,2,1,0,0,1,0,0,0,0,1,1,0,1,0,0,0,4,0,1,1,1,0,0,0,0,3,1,0,0,2,1,0,2,0,2,4,1,1,2,1,0,0,2,5,0,1,0,0,0,0,0,0,0,0,1,1,0,2,0,2,0,1,2,3,0,2,1,0,0,0,2,0,0,0,0,0,0,0,2,2,2,0,2,0,2,1,0,0,0,2,3,1,0,1,1,0,3,1,3,1,0,1,0,0,1,1,3,0,1,1,2,2,2,0,3,2,3,2,1,1,1,1,1,2,1,0,2,1,3,1,0,0,0,3,2,1,0,1,2,3,1,1,0,3,2,0,2,4,1,0,0,0,0,1,1,1,1,0,1,0,2,1,1,0,2,1,0,0,0,0,3,1,2,0,0,0,0,0,0,2,4,1,3,1,1,2,1,1,2,1,3,2,0,2,1,2,0,1,1,0,2,1,0,0,2,1,1,1,0,1,2,2,0,1,1,2,0,0,1,0,0,1,1,0,1,2,1,2,0,0,1,0,3,1,1,1,0,0,0,5,1,1,1,2,2,0,2,1,1,0,0,0,1,1,0,2,2,2,1,1,0,1,2,0,1,1,0,0,0,1,0,0,2,0,0,2,0,0,2,0,1,3,0,0,2,0,0,0,0,1,2,1,2,1,2,4,1,1,1,0,1,1,1,0,0,1,2,1,2,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,1,2,0,1,2,1,1,0,0,2,0,0,2,0,1,0,2,3,1,2,2,2,1,0,2,3,1,1,1,0,2,1,1,0,0,2,1,1,2,1,0,1,0,0,0,1,1,1,1,0,1,2,1,1,0,1,0,0,2,1,1,1,3,1,0,1,1,0,0,1,1,0,2,1,4,4,3,2,1,2,2,1,1,2,2,3,2,1,2,1,1,0,1,1,0,0,1,3,2,1,0,0,2,0,1,0,1,2,1,0,1,1,3,5,5,1,1,0,1,0,4,0,1,1,2,2,1,1,2,2,1,0,1,1,0,0,0,1,1,2,0,2,1,2,0,1,0,1,1,0,0,0,1,1,0,3,2,1,1,0,0,1,1,3,0,2,0,0,0,0,1,1,0,0,2,0,0,1,1,1,1,2,0,1,1,0,1,0,1,2,1,0,0,1,1,1,0,2,2,1,0,1,4,0,0,0,0,3,1,0,1,0,0,1,0,0,1,0,2,3,1,0,2,0,1,1,2,0,1,1,4,2,4,1,1,0,2,2,0,1,1,1,1,0,0,0,4,0,1,1,0,0,0,0,2,1,0,2,2,1,4,2,1,0,1,0,3,1,2,0,1,3,0,1,2,0,0,1,0,0,1,0,2,2,1,2,1,0,2,0,0,2,1,0,2,0,2,1,3,1,0,2,1,1,0,1,1,1,0,1,0,0,1,1,0,0,0,0,1,1,2,3,1,1,2,1,1,1,2,2,1,0,2,1,0,1,0,1,1,1,0,0,1,0,2,0,1,0,1,0,0,2,0,1,0,0,0,1,1,4,0,2,0,0,0,0,1,0,0,1,0,5,2,0,0,1,2,1,2,2,1,0,0,1,2,2,0,2,2,2,0,0,1,2,2,0,0,1,0,0,0,1,1,2,0]},{"counters":[2,1,2,0,1,0,1,1,2,2,0,2,1,1,2,0,1,0,0,2,2,1,2,1,0,0,1,4,2,3,1,1,0,0,1,1,0,2,2,0,0,2,1,0,0,2,0,1,0,1,1,2,1,0,1,0,2,1,2,1,4,1,0,0,0,1,1,1,1,2,2,2,2,0,1,1,0,2,0,1,2,2,0,1,2,0,3,0,1,1,0,1,1,1,1,2,1,3,2,0,2,2,1,1,0,1,1,0,3,0,0,0,1,1,0,1,2,0,1,1,3,4,3,1,2,0,0,4,1,2,0,0,0,0,1,2,1,1,1,1,0,0,2,1,1,2,0,0,3,2,0,0,0,1,2,0,1,1,1,2,0,2,0,0,0,0,1,1,1,0,3,0,3,1,0,0,2,1,1,2,0,0,0,1,1,1,0,2,4,2,0,1,1,1,1,1,1,3,0,2,0,1,1,2,0,0,1,1,1,0,2,1,1,4,1,0,1,0,0,0,1,1,3,2,1,2,0,1,1,1,2,3,0,0,1,2,0,0,0,1,1,0,0,0,1,1,1,2,0,1,0,2,1,1,0,2,3,3,0,0,0,0,3,1,3,0,1,1,0,1,0,1,0,1,1,3,1,0,0,0,1,1,1,0,2,2,0,0,2,3,0,0,0,0,1,0,1,1,1,0,0,0,1,1,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,2,0,2,0,1,0,3,3,0,2,2,2,2,2,2,1,0,1,0,0,3,1,3,0,0,2,0,2,1,2,2,0,0,0,1,1,2,2,2,1,0,1,1,1,1,1,1,2,2,1,1,0,0,0,1,0,0,2,1,2,3,2,0,2,0,0,1,1,0,0,2,0,0,0,0,1,0,0,0,1,0,2,2,1,1,2,4,2,1,1,2,0,0,0,2,1,1,1,3,0,0,0,0,1,0,0,2,3,1,2,2,0,0,0,1,0,0,0,1,0,0,1,0,1,0,1,2,1,2,2,1,2,0,1,0,0,1,1,0,2,0,3,0,2,0,0,1,0,1,0,0,0,2,0,2,2,1,3,1,0,0,1,0,0,0,0,1,0,0,0,1,2,1,1,1,1,1,1,1,1,1,2,1,0,0,1,1,1,2,0,2,1,0,0,1,2,1,1,3,0,1,0,2,1,1,1,3,1,0,2,1,1,1,0,1,1,1,0,1,3,3,1,0,0,0,0,1,0,0,3,1,0,3,0,1,2,2,0,0,0,2,0,3,0,0,0,4,2,1,2,0,2,0,2,1,1,1,2,2,0,0,1,1,2,2,0,1,0,3,2,2,1,0,2,2,0,0,3,1,0,1,0,1,0,1,1,1,3,1,0,1,0,0,1,2,2,2,3,1,3,0,0,1,0,0,0,1,2,3,0,2,0,1,2,0,1,0,0,1,1,1,1,1,1,0,1,2,2,1,0,2,0,0,1,2,4,0,1,0,0,0,3,1,1,2,1,0,0,1,0,2,1,1,2,0,0,2,0,1,0,1,1,1,2,1,1,1,0,0,1,0,2,2,2,2,3,0,1,1,2,1,1,0,0,0,1,0,1,0,0,1,0,2,3,0,0,1,1,0,1,1,0,2,3,0,2,2,1,1,1,0,3,0,1,0,2,2,0,1,1,3,0,0,2,0,1,0,1,1,0,1,1,1,2,1,1,0,0,3,1,1,0,0,2,0,0,1,1,1,1,2,1,0,1,1,0,2,1,1,0,0,1,0,0,0,2,0,1,2,0,0,0,0,0,1,2,0,1,2,2,1,1,1,1,1,0,1,1,1,2,0,0,0,2,3,0,1,1,1,0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,3,3,2,0,1,0,1,1,2,1,1,1,0,1,1,1,0,0,1,0,1,0,0,2,0,2,2,1,0,2,1,0,1,3,1,1,0,0,0,0,0,2,1,2,3,0,1,1,1,0,2,1,0,0,0,0,1,0,1,0,0,3,1,0,2,1,1,2,2,0,0,0,1,0,1,0,2,0,3,1,1,0,1,0,0,1,0,1,1,0,2,3,0,1,3,0,1,0,2,2,2,0,3,0,1,1,1,1,0,1,0,3,1,0,1,1,0,1,0,1,2,0,3,1,1,0,2,1,1,1,3,0,3,2,0,3,0,2,2,2,0,1,0,0,1,0,2,0,0,2,0,2,2,0,2,1,1,2,0,1,0,0,1,2,1,0,2,1,0,1,2,0,2,1,1,0,2,0,2,1,2,0,3,0,1,0,1,1,0,1,0,2,0,1,2,0,0,1,0,2,3,1,1,0,0,2,2,1,0,2,1,0,1,3,0,0,0,0,1,1,1,0,0,0,1,0,2,1,2,2,1,1,2,1,2,0,1,2,1,1,0,1,4,2,0,1,2,1,2,1,2,2,1,1,0,0,1,0,0,1,2,3,2,1,4,1,1,2,1,2,1,1,1,2,1,0,1,0,2,0,0,1,0,0,0,2,0,0,0,2,1,0,1,2,1,1,2,0,1,2,2,3,0,0,1,0,1,1,1,0,0,1,1,1,0,2,0,0,2,1,0,1,1,3,1,1,0,0,7,2,1,1,0,0,1,1,0,1,3,0,0,3,1,1,2,0,0,3,2,1,1,1,1,2,0,0,0,0,2,0,1,4,0,0,1,1,2,0,1,1,2,0,1,0,0,0,1,0,0,0,0,0,0,1,2,0,1,2,1,0,2,0,2,0,0,0,2,0,1,1,0,1,1,0,1,1,1,1,0,1,2,2,0,1,0,2,3,0,2,2,0,2,0,1,0,1,0,1,0,1,1,0,0,0,2,0,1,1,0,0,1,1,1,2,0,2,0,0,4,1,0,1,0,0,1,0,0,3,2,1,2,2,2,2,2,1,1,1,1,0,1,1,2,2,2,1,2,2,3,1,3,1,1,2,1,0,3,1,1,1,1,2,3,1,2,0,1,1,0,4,2,5,1,0,1,4,1,0,3,1,1,1,2,1,1,0,0,1,2,0,1,1,1,1,1,0,0,1,0,1,0,3,1,1,1,1,0,0,2,2,0,0,0,0,0,3,2,1,0,1,0,0,1,1,0,0,1,1,1,1,2,1,1,0,3,0,1,1,0,0,1,1,1,0,1,0,2,1,1,0,0,2,0,1,0,1,0,3,0,0,1,1,4,1,1,0,2,1,0,1,0,1,1,0,1,1,1,1,1,3,2,2,0,0,1,0,1,0,0,0,2,2,1,1,1,0,0,2,1,3,0,1,0,3,0,2,4,1,1,2,3,0,0,0,0,0,2,0,0,0,0,0,1,0,1,0,1,1,2,0,1,0,0,1,1,1,2,0,1,0,1,2,3,1,0,2,2,3,0,1,0,1,2,0,1,1,0,0,0,1,1,0,2,0,0,1,3,0,1,0,0,0,0,0,1,3,1,2,1,1,1,0,1,0,2,1,1,2,0,1,0,1,0,1,2,1,1,0,1,0,1,2,1,0,0,1,1,0,1,1,1,1,1,3,0,1,0,0,0,1,1,1,0,1,2,0,1,1,0,0,5,0,0,2,2,3,0,0,0,2,0,2,1,1,1,0,2,0,0,1,1,0,2,1,3,1,0,0,0,1,0,0,1,2,1,0,0,2,1,0,1,1,2,1,1,1,0,1,2,3,2,0,0,2,2,0,0,1,0,2,1,0,0,2,1,1,1,0,0,1,2,1,4,1,0,0,1,1,1,2,2,4,1,3,1,1,1,1,0,1,1,1,0,3,0,1,0,4,2,3,1,0,2,0,3,1,0,2,0,1,0,1,0,3,1,0,2,1,3,1,2,1,1,2,1,1,1,3,2,0,0,2,1,1,0,3,0,1,0,2,1,0,2,1,2,1,2,3,1,1,1,0,0,0,1,1,1,2,0,1,1,0,2,1,0,1,3,2,1,3,2,1,2,1,1,1,0,0,0,0,1,0,3,1,0,0,2,0,1,1,1,0,0,1,1,0,2,2,2,1,0,0,0,0,1,1,1,3,0,0,1,0,3,0,1,3,1,2,2,0,1,1,0,1,2,0,1,3,2,4,1,0,1,1,0,1,1,0,2,2,2,1,1,1,1,0,0,0,0,1,2,2,1,0,2,0,2,3,0,3,0,1,1,1,0,0,0,0,0,0,1,1,0,3,1,0,0,1,1,0,0,1,0,1,0,2,2,4,0,1,1,0,3,0,1,0,2,1,0,1,1,2,3,0,1,1,0,1,2,2,0,1,1,3,1,2,1,2,0,2,0,2,2,2,2,0,0,3,0,2,2,1,0,2,2,1,1,0,0,1,2,0,1,2,2,0,2,2,1,0,0,1,1,1,0,0,1,1,0,2,2,1,1,0,1,1,2,0,0,1,1,0,2,0,1,1,0,0,4,3,1,0,2,2,2,1,2,0,0,2,2,0,0,0,1,3,0,0,2,1,0,0,0,1,0,1,0,1,0,1,2,0,1,0,2,1,0,3,1,1,0,2,0,0,1,0,1,0,4,1,0,0,0,1,0,1,1,0,0,0,4,1,1,1,0,0,1,2,0,2,1]},{"counters":[0,0,1,1,0,1,0,0,0,1,1,1,2,0,1,3,1,0,1,2,2,2,1,3,1,0,0,1,2,0,2,3,1,0,0,2,0,0,0,2,3,0,0,1,3,1,0,3,2,2,2,1,1,0,2,1,1,1,2,0,0,1,1,1,0,4,3,0,3,3,0,1,1,1,0,1,0,1,0,0,0,0,0,1,0,1,1,0,2,0,0,2,0,0,0,1,0,1,2,1,3,0,0,1,1,2,0,1,1,0,1,1,1,2,2,0,0,1,0,3,1,2,1,0,2,1,1,1,2,0,1,0,1,3,0,2,0,0,1,2,1,0,0,0,0,0,2,2,0,0,2,1,1,1,2,1,0,2,2,2,2,1,1,1,0,1,3,1,1,0,1,1,0,2,1,0,1,0,0,0,1,1,3,1,1,0,0,1,1,1,0,2,2,0,1,1,0,0,2,1,1,1,2,2,2,1,0,3,2,1,0,0,2,1,0,2,1,0,2,1,2,0,2,0,0,0,1,2,3,0,2,0,0,1,2,1,2,0,0,0,1,1,0,2,1,1,1,1,3,1,3,0,2,2,1,0,0,1,1,1,0,2,1,1,1,0,2,3,2,2,1,2,1,0,2,1,2,0,1,0,2,0,0,0,0,0,0,0,3,0,1,0,2,0,0,0,0,2,1,0,1,0,1,0,0,0,1,0,1,2,1,0,1,0,1,1,0,2,0,3,0,0,0,2,0,0,1,1,0,2,1,0,1,2,1,1,2,3,2,0,1,0,0,0,3,2,2,1,1,3,0,0,1,2,0,2,1,1,1,0,0,1,1,3,0,1,0,0,0,1,0,1,0,2,2,3,3,2,3,3,5,0,0,2,2,1,1,0,1,0,1,0,2,1,1,1,0,0,1,1,1,3,0,1,1,0,1,1,0,1,1,2,0,0,1,1,1,0,1,0,3,1,2,3,1,2,0,1,0,1,0,1,1,1,0,1,1,2,0,2,1,2,1,2,1,0,0,2,1,2,1,1,1,2,0,1,1,3,2,0,3,3,0,2,1,2,1,1,0,1,0,1,1,2,1,1,2,0,0,0,0,0,1,1,0,0,0,2,2,2,0,1,0,3,3,1,0,2,1,1,3,0,2,0,0,2,1,0,1,0,1,0,0,1,1,0,2,1,1,1,2,0,0,1,0,2,1,1,2,0,1,0,0,4,1,2,3,1,1,0,1,2,0,1,0,2,0,0,1,3,0,0,1,0,0,1,0,0,1,1,0,0,1,0,1,0,0,0,0,1,1,2,1,2,2,2,0,0,0,1,1,2,0,2,2,1,0,1,0,1,0,2,2,0,2,2,0,0,2,1,0,2,4,2,0,0,2,1,2,1,2,2,0,1,1,0,1,0,1,0,0,0,1,1,0,4,1,0,0,0,2,1,3,1,2,1,0,1,1,1,1,0,0,1,0,3,2,2,1,0,2,2,2,0,0,1,1,1,1,3,0,0,1,0,1,0,0,0,1,0,1,0,0,1,0,0,1,0,5,1,2,2,2,3,1,1,1,1,0,0,0,3,0,1,0,1,1,0,0,1,0,0,1,1,0,2,0,2,0,1,1,1,2,1,2,0,0,1,0,0,1,0,0,0,0,2,0,1,1,1,2,0,1,0,1,3,0,0,1,0,0,2,1,2,0,1,2,2,3,1,0,1,0,0,1,1,0,0,0,1,3,0,1,1,2,1,0,2,0,0,0,1,1,1,5,0,2,1,0,1,1,1,0,1,2,0,2,1,1,0,2,0,2,2,0,0,3,0,1,1,2,0,0,1,0,1,1,1,0,1,2,1,3,0,1,1,1,1,1,3,0,0,2,1,2,0,0,2,1,2,1,0,1,0,0,2,1,2,1,0,3,4,1,1,2,0,0,1,1,1,0,3,0,0,0,2,0,0,0,1,0,1,2,0,1,1,2,1,5,0,0,1,0,2,1,2,0,5,3,1,0,0,0,5,2,0,1,1,2,1,0,1,4,0,1,0,0,2,0,1,0,1,3,1,2,1,2,0,2,1,1,1,2,0,2,0,0,1,2,0,1,2,1,1,1,0,0,3,0,1,2,1,1,2,0,1,0,0,2,1,1,1,0,1,1,3,1,2,0,1,1,1,1,1,1,2,1,1,3,1,1,1,0,0,1,0,0,2,0,2,2,1,2,1,1,0,0,1,3,0,2,1,0,2,0,2,1,0,1,2,1,1,1,1,1,0,0,0,4,0,0,0,1,0,0,0,0,2,2,0,1,0,6,0,0,1,0,0,2,2,1,0,0,1,0,1,0,0,0,1,0,1,0,2,1,1,3,0,0,1,1,3,3,2,0,5,0,0,2,1,0,1,0,1,0,2,0,1,1,0,2,4,1,0,1,2,4,0,2,0,0,1,0,1,0,1,1,2,2,3,3,0,1,0,0,0,0,1,2,1,2,3,1,2,2,2,0,0,2,1,1,0,0,1,1,0,1,4,0,0,2,0,0,2,1,1,0,0,0,1,1,1,1,0,0,1,1,0,2,0,2,0,0,0,0,0,2,2,0,2,1,0,0,3,0,0,1,1,1,1,0,0,1,3,0,2,0,2,5,2,0,0,1,2,0,0,0,2,0,0,1,1,1,1,2,0,0,0,2,0,3,1,2,1,2,0,2,2,0,2,3,1,1,2,0,0,1,0,0,0,0,1,0,2,1,1,0,0,0,0,0,1,2,2,1,2,1,1,0,1,1,0,2,1,1,1,0,1,0,1,0,0,2,0,0,1,1,1,1,1,2,0,1,3,0,2,2,2,1,1,1,0,3,1,1,1,1,0,0,1,0,1,1,1,2,1,0,0,1,1,1,0,1,1,2,0,2,1,2,0,0,0,2,1,0,1,1,2,1,2,0,0,0,1,1,1,1,1,0,1,1,1,0,1,1,1,0,1,2,2,0,2,0,1,0,2,0,1,2,0,2,0,1,1,2,0,0,0,1,2,1,1,2,1,1,0,2,1,0,0,0,2,1,1,2,1,2,2,0,0,2,2,1,2,0,0,0,2,1,1,0,0,2,2,1,2,2,4,1,1,1,3,0,0,1,1,2,2,0,2,1,0,0,0,1,0,1,1,1,0,0,1,1,0,2,0,0,1,1,0,0,0,1,0,1,1,0,2,0,0,1,1,1,1,1,2,1,3,2,0,1,0,1,1,1,0,0,3,1,1,1,1,0,0,0,0,1,1,1,2,1,2,1,1,1,1,1,1,0,0,0,1,1,1,1,2,2,2,1,3,2,2,1,1,2,2,0,2,3,1,1,0,2,3,2,0,0,1,2,2,1,1,0,1,1,2,0,1,2,2,3,3,1,3,0,4,1,2,1,0,1,0,0,2,1,1,3,0,2,0,1,0,1,0,1,1,4,3,1,0,2,2,0,1,2,1,1,1,2,3,2,1,0,1,0,3,0,0,0,1,0,0,0,0,2,0,0,2,3,1,1,0,0,1,1,1,0,2,1,1,2,0,2,1,1,0,1,0,0,0,0,1,0,1,1,0,1,0,2,1,2,0,0,0,0,1,2,2,0,1,1,1,0,1,2,1,1,1,2,2,1,3,2,0,1,0,1,0,1,3,2,0,2,1,2,1,1,2,2,2,0,0,0,0,1,0,0,2,1,1,0,1,0,2,0,2,0,0,1,1,2,2,1,1,1,1,3,2,0,1,0,0,0,0,2,0,0,1,1,1,1,1,2,0,2,0,1,2,0,1,2,1,0,1,0,0,0,0,2,0,2,1,4,0,2,1,1,0,1,1,0,1,3,1,0,0,0,0,0,0,0,0,2,1,0,0,1,2,0,0,0,3,1,0,2,1,1,1,0,3,0,1,0,2,1,3,2,1,2,0,1,1,1,0,1,1,0,1,2,0,1,1,3,1,0,4,1,2,2,0,1,0,1,2,0,0,3,0,2,1,1,2,0,1,2,3,1,1,0,2,2,3,0,2,0,0,1,2,0,0,2,0,3,1,1,0,3,2,1,3,1,0,1,1,1,1,0,2,0,0,0,0,1,2,2,1,0,0,1,1,3,1,4,1,1,0,1,1,0,0,2,1,0,0,2,1,0,0,0,0,0,0,0,1,0,1,0,1,0,2,1,0,1,1,1,1,0,2,0,0,1,2,2,0,1,0,3,1,0,1,0,1,1,0,0,1,1,2,1,2,0,0,1,0,1,1,0,1,1,1,1,0,1,1,1,0,2,1,0,1,1,1,0,1,1,0,4,0,0,1,2,0,1,1,1,1,1,0,0,0,0,0,0,1,1,2,0,0,1,2,0,1,1,0,1,2,0,1,2,0,2,1,1,3,1,1,1,2,2,0,5,1,1,0,0,1,0,0,1,0,0,1,1,0,0,1,2,0,1,1,2,0,1,0,1,0,2,0,0,1,2,0,1,1,0,2,1,3,2,1,3,1,2,1,0,2,2,1,2,0,2,1,2,2,1,0,1,0,2,3,1,1,1,0,1,0,1,1,0,0,0,0,1,0,2,1,3,0,0,2,0,0,2,3,1,2,2,2,1,1,2,0,1,3,2,1,0,0,1,1,1,3,0,0,2,0,0,0]},{"counters":[1,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,2,2,1,1,2,1,1,1,1,0,1,0,0,1,0,2,1,2,0,0,0,0,1,1,1,1,0,2,2,1,0,1,3,1,1,2,0,1,0,2,1,1,0,2,0,1,1,1,1,0,1,0,2,0,1,0,1,0,0,0,1,0,1,0,2,0,0,3,3,0,0,2,0,3,2,2,0,1,0,1,1,1,1,1,0,0,1,0,0,2,1,2,1,1,2,1,3,0,3,2,3,0,1,2,1,1,1,1,0,0,1,1,1,0,2,1,3,3,3,0,1,0,1,0,0,0,1,1,0,0,1,0,2,0,0,2,0,1,1,1,1,3,2,2,2,1,1,1,0,1,0,0,0,1,2,0,2,2,0,1,1,2,1,1,0,1,0,3,0,1,0,0,2,2,2,2,1,2,1,2,1,1,0,0,2,0,0,1,3,1,2,1,0,1,1,2,1,1,2,1,1,1,0,0,1,0,1,2,1,0,2,1,0,0,0,0,2,0,1,1,1,0,0,1,0,2,0,1,2,2,0,1,1,0,3,3,0,0,1,0,0,0,0,0,2,0,2,2,1,0,1,0,1,2,0,0,0,1,2,0,1,1,2,1,4,0,1,0,0,1,0,2,0,3,2,0,2,3,1,4,1,2,0,1,0,1,1,0,0,2,2,1,1,0,0,0,0,0,2,1,1,1,3,2,0,2,1,1,1,0,1,2,2,1,3,0,3,0,0,0,1,1,1,0,0,3,0,0,2,2,1,0,0,1,2,2,0,0,1,0,0,1,0,2,0,1,2,1,1,0,1,0,2,1,1,2,0,1,0,0,3,2,0,0,0,1,1,1,1,0,1,2,1,0,3,3,1,2,3,0,0,0,1,0,2,0,0,3,2,0,1,2,1,1,1,0,0,2,0,0,1,0,3,1,1,0,1,1,0,0,2,0,1,3,1,2,1,0,3,0,1,2,2,1,1,0,1,0,0,2,2,1,1,0,1,3,0,0,2,0,2,0,0,1,1,2,0,1,2,0,3,0,1,3,0,1,1,1,1,2,0,3,1,0,3,0,0,0,0,0,1,0,2,2,0,0,0,1,1,1,1,2,1,1,3,0,0,1,0,2,1,3,2,2,2,2,0,1,0,1,3,0,0,2,2,0,1,0,0,1,1,1,1,2,0,0,2,1,0,1,1,3,0,1,1,1,1,1,0,0,0,0,2,2,1,1,1,2,1,1,3,1,1,1,2,1,0,0,1,1,0,1,4,3,2,1,2,1,0,2,2,1,2,1,1,1,1,0,0,0,2,1,1,1,1,2,0,0,1,0,0,2,1,0,3,1,1,0,0,1,0,1,1,1,1,1,0,1,1,1,2,1,2,0,0,0,0,2,0,0,0,1,0,0,0,1,3,1,1,1,2,1,0,1,0,1,2,0,0,2,0,1,0,0,0,1,1,0,0,0,1,0,1,0,3,1,1,1,1,0,0,3,0,0,0,1,1,0,3,1,1,0,2,1,0,0,0,1,2,0,0,0,2,0,1,0,0,0,1,4,2,1,0,1,1,1,3,1,0,1,0,3,2,1,1,1,1,2,0,1,0,2,1,1,1,2,2,0,1,1,0,0,2,0,0,0,0,0,0,0,2,0,0,0,1,0,0,1,1,1,1,0,1,2,0,0,2,0,1,2,1,2,4,0,2,3,2,1,0,0,0,0,1,0,1,0,1,0,1,1,1,1,0,3,1,2,2,0,2,1,1,0,2,0,2,1,0,2,0,0,1,1,1,0,0,0,0,1,2,2,0,0,0,0,1,0,2,0,0,0,1,0,1,2,0,2,2,1,3,2,1,2,2,1,0,1,3,3,0,0,0,1,1,1,0,0,0,1,2,1,1,1,1,0,0,2,0,1,2,1,0,2,3,2,1,1,1,1,1,1,1,0,1,2,1,0,1,2,1,1,2,1,0,1,2,2,0,1,0,3,0,1,1,3,2,1,3,1,1,0,0,3,1,0,2,0,0,0,1,1,0,1,0,1,2,4,2,1,2,2,0,4,0,2,1,1,1,0,0,2,0,1,2,0,0,1,0,0,0,1,0,4,1,0,0,2,0,0,0,2,2,0,0,1,3,0,0,1,1,3,1,3,1,1,0,3,2,1,1,0,1,2,0,0,1,0,2,2,0,1,1,2,1,1,0,0,1,3,2,0,1,0,1,2,0,0,1,0,2,1,0,0,0,2,0,1,0,0,1,0,1,0,0,1,1,0,2,1,1,3,2,1,1,0,0,0,1,1,0,1,1,1,1,1,0,0,0,1,0,1,0,1,2,0,0,0,0,0,2,3,0,2,0,1,3,0,0,0,0,1,0,0,0,0,1,0,3,1,0,0,0,0,0,0,2,1,3,0,0,0,2,1,0,0,2,1,3,1,0,2,2,2,1,1,1,0,1,1,0,1,2,2,1,1,1,0,0,4,0,3,2,2,2,3,0,0,2,2,2,1,2,1,3,1,1,0,1,0,4,2,0,0,2,1,0,0,0,0,0,0,1,1,2,1,2,2,0,0,2,0,1,1,0,2,0,1,1,2,1,1,1,0,0,1,1,1,3,1,0,1,0,1,1,2,1,2,1,0,1,4,1,4,2,1,2,1,2,2,2,0,5,0,1,1,1,0,1,0,1,2,1,3,0,1,3,1,1,2,0,1,2,1,1,0,1,2,3,0,1,0,2,1,0,2,2,1,0,0,2,3,3,2,1,1,0,4,0,0,1,0,3,4,0,0,2,1,0,0,1,2,0,0,0,0,1,3,0,2,0,0,1,1,2,1,1,0,1,1,1,1,2,2,1,3,2,1,1,2,1,2,1,2,0,2,1,0,0,0,0,0,1,1,2,0,2,1,1,2,0,2,1,0,1,1,2,1,1,1,0,0,3,0,1,0,0,2,0,0,2,0,1,1,0,0,1,1,0,1,0,1,4,1,1,1,0,1,1,2,1,1,1,0,3,2,2,1,0,0,2,3,0,3,0,1,1,0,0,2,2,0,1,2,1,0,0,0,2,2,0,0,2,1,0,1,0,1,0,1,2,1,0,2,1,0,0,1,0,1,3,1,1,0,1,2,1,0,3,0,0,1,0,2,0,0,1,2,2,2,0,0,0,1,0,2,2,1,1,0,2,2,1,0,1,0,4,0,1,4,0,1,0,0,0,0,1,1,0,2,1,2,1,1,0,1,1,1,0,0,0,3,1,1,0,2,0,0,2,0,0,1,1,2,0,3,2,3,1,0,1,0,1,2,0,0,2,1,1,1,1,1,1,0,0,1,1,1,1,2,0,0,1,0,1,1,2,1,0,1,0,2,1,1,2,0,0,0,1,4,4,1,1,0,0,0,0,1,2,4,0,0,0,1,1,1,0,0,1,0,1,0,0,1,1,0,1,2,1,1,1,0,1,1,1,1,3,4,0,0,1,3,0,0,0,3,1,2,1,1,0,0,0,0,3,1,1,2,0,1,2,1,1,2,1,0,2,0,2,1,1,1,0,0,0,2,0,1,0,3,3,2,0,0,2,1,1,3,0,1,1,3,0,1,2,1,2,1,0,1,3,1,0,2,1,0,1,0,1,3,3,1,2,1,0,1,4,1,1,0,0,0,1,0,0,0,0,2,0,1,0,1,2,0,3,0,0,0,1,1,1,1,1,1,1,3,0,2,2,1,4,2,0,0,0,1,1,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,2,0,1,0,1,2,0,1,2,1,0,0,1,1,0,1,0,0,2,2,1,1,0,0,3,1,2,0,0,2,0,2,0,0,0,0,4,3,2,2,1,1,1,0,0,1,4,0,1,1,1,0,1,2,1,2,0,0,0,1,1,2,0,0,0,3,3,1,0,3,1,0,1,1,0,4,2,2,2,0,1,1,0,0,1,2,0,1,3,1,1,0,0,2,4,0,0,1,2,0,0,0,2,0,0,1,0,4,0,2,2,2,1,0,1,0,0,3,0,0,2,2,0,1,0,2,1,2,3,2,1,1,0,1,1,0,0,1,1,3,0,1,0,2,0,1,1,1,0,1,0,1,0,0,2,2,2,0,0,0,2,1,1,2,1,0,0,0,2,0,2,4,1,0,1,2,2,0,0,0,0,0,1,1,0,0,1,3,1,1,0,4,2,0,0,5,1,0,0,0,1,4,0,0,0,1,1,1,0,0,2,2,1,3,3,2,1,2,1,4,0,2,0,1,1,0,2,2,0,1,0,3,2,1,1,0,4,3,1,3,0,0,2,0,0,0,1,1,1,0,0,2,2,0,1,0,1,1,1,4,1,0,2,0,0,1,0,2,1,1,1,1,1,1,0,2,2,1,0,2,1,0,0,1,1,0,0,1,0,0,0,1,1,0,2,2,3,0,2,3,1,1,0,2,0,0,1,1,0,1,1,1,2,1,3,3,2,0,1,1,1,3,0,2,0,1,2,1,1,1,0,0,3,0,0,0,0,0,1,1,0,4,2,3,0,0,1,0,0,1,3,0,1,2,1,1,1,0,0,0,2,0,1,0,1,1,0,1]}]},"null_count":0,"last_update_version":397952053507784704}},"indices":{"c2":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"A3////+ArNyX","upper_bound":"A3////+BpfR7","repeats":1},{"count":16,"lower_bound":"A3////+B2Hix","upper_bound":"A3////+ChboS","repeats":1},{"count":24,"lower_bound":"A3////+Ci81e","upper_bound":"A3////+DnTaL","repeats":1},{"count":32,"lower_bound":"A3////+Dr9G9","upper_bound":"A3////+EWvAJ","repeats":1},{"count":40,"lower_bound":"A3////+EgX14","upper_bound":"A3////+FA8Jx","repeats":1},{"count":48,"lower_bound":"A3////+FL69X","upper_bound":"A3////+GiAXv","repeats":1},{"count":56,"lower_bound":"A3////+GlE1T","upper_bound":"A3////+HKdur","repeats":1},{"count":64,"lower_bound":"A3////+HRXhg","upper_bound":"A3////+Hy/X5","repeats":1},{"count":72,"lower_bound":"A3////+H7xNd","upper_bound":"A3////+IgwUR","repeats":1},{"count":80,"lower_bound":"A3////+IiopC","upper_bound":"A3////+JLcp9","repeats":1},{"count":88,"lower_bound":"A3////+JOmdz","upper_bound":"A3////+KCcZ2","repeats":1},{"count":96,"lower_bound":"A3////+KO3UB","upper_bound":"A3////+KqvAC","repeats":1},{"count":104,"lower_bound":"A3////+KvNOP","upper_bound":"A3////+LmYMj","repeats":1},{"count":112,"lower_bound":"A3////+Lrkqr","upper_bound":"A3////+M1Ya/","repeats":1},{"count":120,"lower_bound":"A3////+M9zrr","upper_bound":"A3////+NvbFi","repeats":1},{"count":128,"lower_bound":"A3////+Nww18","upper_bound":"A3////+OZpvG","repeats":1},{"count":136,"lower_bound":"A3////+ObEjb","upper_bound":"A3////+Pfqkh","repeats":1},{"count":144,"lower_bound":"A3////+Plmne","upper_bound":"A3////+RiTSM","repeats":1},{"count":152,"lower_bound":"A3////+RrCkT","upper_bound":"A3////+SQ3Sp","repeats":1},{"count":160,"lower_bound":"A3////+SXLsp","upper_bound":"A3////+TUvHK","repeats":1},{"count":168,"lower_bound":"A3////+ThoBm","upper_bound":"A3////+UZkGd","repeats":1},{"count":176,"lower_bound":"A3////+UaHDg","upper_bound":"A3////+VQkoD","repeats":1},{"count":184,"lower_bound":"A3////+VRSUj","upper_bound":"A3////+V3ZHQ","repeats":1},{"count":192,"lower_bound":"A3////+V6t6U","upper_bound":"A3////+W2YEv","repeats":1},{"count":200,"lower_bound":"A3////+W9V/K","upper_bound":"A3////+YNkxu","repeats":1},{"count":208,"lower_bound":"A3////+YxE33","upper_bound":"A3////+Z7Y4n","repeats":1},{"count":216,"lower_bound":"A3////+aIbWi","upper_bound":"A3////+a26B3","repeats":1},{"count":224,"lower_bound":"A3////+bEXxv","upper_bound":"A3////+bnPuX","repeats":1},{"count":232,"lower_bound":"A3////+b+yIu","upper_bound":"A3////+cs1Hq","repeats":1},{"count":240,"lower_bound":"A3////+c21LI","upper_bound":"A3////+eEbEz","repeats":1},{"count":248,"lower_bound":"A3////+eLCiD","upper_bound":"A3////+e5Ru0","repeats":1},{"count":256,"lower_bound":"A3////+fH/tk","upper_bound":"A3////+f6Fg/","repeats":1},{"count":264,"lower_bound":"A3////+gQmf8","upper_bound":"A3////+hETRQ","repeats":1},{"count":272,"lower_bound":"A3////+hIoe0","upper_bound":"A3////+iHB5b","repeats":1},{"count":280,"lower_bound":"A3////+iT7KS","upper_bound":"A3////+jOh3v","repeats":1},{"count":288,"lower_bound":"A3////+j3AOR","upper_bound":"A3////+lDRaR","repeats":1},{"count":296,"lower_bound":"A3////+lEZur","upper_bound":"A3////+mLrnQ","repeats":1},{"count":304,"lower_bound":"A3////+mUmXg","upper_bound":"A3////+m5UAw","repeats":1},{"count":312,"lower_bound":"A3////+nKboB","upper_bound":"A3////+oa8hp","repeats":1},{"count":320,"lower_bound":"A3////+okau9","upper_bound":"A3////+peIJf","repeats":1},{"count":328,"lower_bound":"A3////+p7H/r","upper_bound":"A3////+qcSGd","repeats":1},{"count":336,"lower_bound":"A3////+qhyj3","upper_bound":"A3////+rUiv4","repeats":1},{"count":344,"lower_bound":"A3////+rioEh","upper_bound":"A3////+s3Za8","repeats":1},{"count":352,"lower_bound":"A3////+tHkeU","upper_bound":"A3////+uZRgP","repeats":1},{"count":360,"lower_bound":"A3////+ukMi1","upper_bound":"A3////+vyJAM","repeats":1},{"count":368,"lower_bound":"A3////+v1QJh","upper_bound":"A3////+w39Br","repeats":1},{"count":376,"lower_bound":"A3////+w40JM","upper_bound":"A3////+xze65","repeats":1},{"count":384,"lower_bound":"A3////+x3TLT","upper_bound":"A3////+yTTA8","repeats":1},{"count":392,"lower_bound":"A3////+yaEui","upper_bound":"A3////+y5CzZ","repeats":1},{"count":400,"lower_bound":"A3////+y56Se","upper_bound":"A3////+zYvGG","repeats":1},{"count":408,"lower_bound":"A3////+zx/8D","upper_bound":"A3////+0uvyb","repeats":1},{"count":416,"lower_bound":"A3////+02P/q","upper_bound":"A3////+1oxKX","repeats":1},{"count":424,"lower_bound":"A3////+1qBZQ","upper_bound":"A3////+270kk","repeats":1},{"count":432,"lower_bound":"A3////+3Hp+R","upper_bound":"A3////+3rKnN","repeats":1},{"count":440,"lower_bound":"A3////+3rxUw","upper_bound":"A3////+4cEjy","repeats":1},{"count":448,"lower_bound":"A3////+4crzi","upper_bound":"A3////+5B7WH","repeats":1},{"count":456,"lower_bound":"A3////+5RVmz","upper_bound":"A3////+6NoXv","repeats":1},{"count":464,"lower_bound":"A3////+6Pqv1","upper_bound":"A3////+6z5x5","repeats":1},{"count":472,"lower_bound":"A3////+67JHJ","upper_bound":"A3////+7xcrs","repeats":1},{"count":480,"lower_bound":"A3////+7/rQF","upper_bound":"A3////+9BJDZ","repeats":1},{"count":488,"lower_bound":"A3////+9BOdx","upper_bound":"A3////+9sVT3","repeats":1},{"count":496,"lower_bound":"A3////++ErZ2","upper_bound":"A3////+/Myl2","repeats":1},{"count":504,"lower_bound":"A3////+/jelP","upper_bound":"A3/////AbOJZ","repeats":1},{"count":512,"lower_bound":"A3/////Ae0Du","upper_bound":"A3/////BVpw8","repeats":1},{"count":520,"lower_bound":"A3/////BX5wD","upper_bound":"A3/////Cac6c","repeats":1},{"count":528,"lower_bound":"A3/////Cpif8","upper_bound":"A3/////ENHgu","repeats":1},{"count":536,"lower_bound":"A3/////EZlLO","upper_bound":"A3/////Fi+eq","repeats":1},{"count":544,"lower_bound":"A3/////FkI9z","upper_bound":"A3/////Gk2D0","repeats":1},{"count":552,"lower_bound":"A3/////GlnG9","upper_bound":"A3/////HTv1w","repeats":1},{"count":560,"lower_bound":"A3/////Hlxbw","upper_bound":"A3/////IeryD","repeats":1},{"count":568,"lower_bound":"A3/////Ifg7s","upper_bound":"A3/////JYGHh","repeats":1},{"count":576,"lower_bound":"A3/////JeU//","upper_bound":"A3/////J6w0s","repeats":1},{"count":584,"lower_bound":"A3/////KGES1","upper_bound":"A3/////K4rpM","repeats":1},{"count":592,"lower_bound":"A3/////K6a3x","upper_bound":"A3/////MMeqO","repeats":1},{"count":600,"lower_bound":"A3/////MRcNM","upper_bound":"A3/////M6lAR","repeats":1},{"count":608,"lower_bound":"A3/////NOBi4","upper_bound":"A3/////OFeL3","repeats":1},{"count":616,"lower_bound":"A3/////OICAS","upper_bound":"A3/////OzqGa","repeats":1},{"count":624,"lower_bound":"A3/////O+GHu","upper_bound":"A3/////POLXF","repeats":1},{"count":632,"lower_bound":"A3/////PYzmW","upper_bound":"A3/////QBInB","repeats":1},{"count":640,"lower_bound":"A3/////QWIzU","upper_bound":"A3/////Qztox","repeats":1},{"count":648,"lower_bound":"A3/////Qzvu8","upper_bound":"A3/////SyxYV","repeats":1},{"count":656,"lower_bound":"A3/////S9mMd","upper_bound":"A3/////UJob8","repeats":1},{"count":664,"lower_bound":"A3/////ULPnG","upper_bound":"A3/////U1v8y","repeats":1},{"count":672,"lower_bound":"A3/////VP9c4","upper_bound":"A3/////V10WL","repeats":1},{"count":680,"lower_bound":"A3/////WOGF9","upper_bound":"A3/////W9Tuy","repeats":1},{"count":688,"lower_bound":"A3/////XCokE","upper_bound":"A3/////X49J5","repeats":1},{"count":696,"lower_bound":"A3/////X7Gu/","upper_bound":"A3/////Y4Sax","repeats":1},{"count":704,"lower_bound":"A3/////Y8oUJ","upper_bound":"A3/////Z4wM1","repeats":1},{"count":712,"lower_bound":"A3/////Z9vrK","upper_bound":"A3/////aofg3","repeats":1},{"count":720,"lower_bound":"A3/////a4UUR","upper_bound":"A3/////b+ffl","repeats":1},{"count":728,"lower_bound":"A3/////cAxd7","upper_bound":"A3/////c6Iy/","repeats":1},{"count":736,"lower_bound":"A3/////dEhKT","upper_bound":"A3/////eArlm","repeats":1},{"count":744,"lower_bound":"A3/////eDcm6","upper_bound":"A3/////fRXv7","repeats":1},{"count":752,"lower_bound":"A3/////fVXG7","upper_bound":"A3/////gfz2p","repeats":1},{"count":760,"lower_bound":"A3/////gl9+z","upper_bound":"A3/////hcs7b","repeats":1},{"count":768,"lower_bound":"A3/////hdIdx","upper_bound":"A3/////i9voi","repeats":1},{"count":776,"lower_bound":"A3/////i/3ov","upper_bound":"A3/////j2qBF","repeats":1},{"count":784,"lower_bound":"A3/////kM4qu","upper_bound":"A3/////keLVI","repeats":1},{"count":792,"lower_bound":"A3/////kfR5p","upper_bound":"A3/////lVFzl","repeats":1},{"count":800,"lower_bound":"A3/////lbASA","upper_bound":"A3/////mdcq/","repeats":1},{"count":808,"lower_bound":"A3/////mf4IV","upper_bound":"A3/////nbgJY","repeats":1},{"count":816,"lower_bound":"A3/////nevvb","upper_bound":"A3/////oIcae","repeats":1},{"count":824,"lower_bound":"A3/////oisA5","upper_bound":"A3/////pRIXd","repeats":1},{"count":832,"lower_bound":"A3/////pYPJz","upper_bound":"A3/////p+2e5","repeats":1},{"count":840,"lower_bound":"A3/////qVFp/","upper_bound":"A3/////riATk","repeats":1},{"count":848,"lower_bound":"A3/////sHyoa","upper_bound":"A3/////s2Gt+","repeats":1},{"count":856,"lower_bound":"A3/////tOqGo","upper_bound":"A3/////uIuRK","repeats":1},{"count":864,"lower_bound":"A3/////uQ0RC","upper_bound":"A3/////vX85y","repeats":1},{"count":872,"lower_bound":"A3/////vzQ8Z","upper_bound":"A3/////wNVwk","repeats":1},{"count":880,"lower_bound":"A3/////waIVi","upper_bound":"A3/////w3PSk","repeats":1},{"count":888,"lower_bound":"A3/////w+jje","upper_bound":"A3/////xMrdn","repeats":1},{"count":896,"lower_bound":"A3/////xYzg5","upper_bound":"A3/////yklnv","repeats":1},{"count":904,"lower_bound":"A3/////ylafo","upper_bound":"A3/////zoj4/","repeats":1},{"count":912,"lower_bound":"A3/////zu9RY","upper_bound":"A3/////1MNDz","repeats":1},{"count":920,"lower_bound":"A3/////1uS7I","upper_bound":"A3/////2gtbt","repeats":1},{"count":928,"lower_bound":"A3/////2rbOS","upper_bound":"A3/////3bY/h","repeats":1},{"count":936,"lower_bound":"A3/////3r8pL","upper_bound":"A3/////4A+Xl","repeats":1},{"count":944,"lower_bound":"A3/////4FBHL","upper_bound":"A3/////5GoLQ","repeats":1},{"count":952,"lower_bound":"A3/////5L9gX","upper_bound":"A3/////5oPtm","repeats":1},{"count":960,"lower_bound":"A3/////5tLt5","upper_bound":"A3/////6nVrj","repeats":1},{"count":968,"lower_bound":"A3/////6ql/c","upper_bound":"A3/////7m811","repeats":1},{"count":976,"lower_bound":"A3/////7s0o5","upper_bound":"A3/////8LGs+","repeats":1},{"count":984,"lower_bound":"A3/////8VTEJ","upper_bound":"A3/////88SXE","repeats":1},{"count":992,"lower_bound":"A3/////9JRlj","upper_bound":"A3/////9wXOX","repeats":1},{"count":1000,"lower_bound":"A3/////913GI","upper_bound":"A3/////+reEx","repeats":1},{"count":1008,"lower_bound":"A3/////+wmPV","upper_bound":"A4AAAAAASbpp","repeats":1},{"count":1016,"lower_bound":"A4AAAAAAXIJC","upper_bound":"A4AAAAABF6/l","repeats":1},{"count":1024,"lower_bound":"A4AAAAABjyWs","upper_bound":"A4AAAAACks96","repeats":1},{"count":1032,"lower_bound":"A4AAAAACk1G+","upper_bound":"A4AAAAADz/+Z","repeats":1},{"count":1040,"lower_bound":"A4AAAAAEJhcq","upper_bound":"A4AAAAAEuAsT","repeats":1},{"count":1048,"lower_bound":"A4AAAAAFJCGw","upper_bound":"A4AAAAAGCyAW","repeats":1},{"count":1056,"lower_bound":"A4AAAAAGGq20","upper_bound":"A4AAAAAHPDTf","repeats":1},{"count":1064,"lower_bound":"A4AAAAAHTLjA","upper_bound":"A4AAAAAH12C/","repeats":1},{"count":1072,"lower_bound":"A4AAAAAH7bk6","upper_bound":"A4AAAAAIS9Rc","repeats":1},{"count":1080,"lower_bound":"A4AAAAAIXgJQ","upper_bound":"A4AAAAAJHuD6","repeats":1},{"count":1088,"lower_bound":"A4AAAAAJPBAl","upper_bound":"A4AAAAAJ+C7Z","repeats":1},{"count":1096,"lower_bound":"A4AAAAAJ/pmI","upper_bound":"A4AAAAAK8lr/","repeats":1},{"count":1104,"lower_bound":"A4AAAAAK/Gj5","upper_bound":"A4AAAAAMgRiD","repeats":1},{"count":1112,"lower_bound":"A4AAAAANBkgr","upper_bound":"A4AAAAAOfo0W","repeats":1},{"count":1120,"lower_bound":"A4AAAAAOmavF","upper_bound":"A4AAAAAPffk7","repeats":1},{"count":1128,"lower_bound":"A4AAAAAPgnAN","upper_bound":"A4AAAAAQp/S7","repeats":1},{"count":1136,"lower_bound":"A4AAAAAQ2L8b","upper_bound":"A4AAAAARZqad","repeats":1},{"count":1144,"lower_bound":"A4AAAAARjCp/","upper_bound":"A4AAAAASJw/H","repeats":1},{"count":1152,"lower_bound":"A4AAAAASXE6v","upper_bound":"A4AAAAAS4+cr","repeats":1},{"count":1160,"lower_bound":"A4AAAAAS5k30","upper_bound":"A4AAAAATvSf9","repeats":1},{"count":1168,"lower_bound":"A4AAAAAUH6iX","upper_bound":"A4AAAAAVI01Q","repeats":1},{"count":1176,"lower_bound":"A4AAAAAVOX3K","upper_bound":"A4AAAAAWOVI9","repeats":1},{"count":1184,"lower_bound":"A4AAAAAWPM+4","upper_bound":"A4AAAAAXZ43N","repeats":1},{"count":1192,"lower_bound":"A4AAAAAXaf01","upper_bound":"A4AAAAAYPoXO","repeats":1},{"count":1200,"lower_bound":"A4AAAAAYpqtS","upper_bound":"A4AAAAAZ68o/","repeats":1},{"count":1208,"lower_bound":"A4AAAAAZ/Xh1","upper_bound":"A4AAAAAa+pow","repeats":1},{"count":1216,"lower_bound":"A4AAAAAbCXBf","upper_bound":"A4AAAAAckLf3","repeats":1},{"count":1224,"lower_bound":"A4AAAAAcuf1S","upper_bound":"A4AAAAAd/xIP","repeats":1},{"count":1232,"lower_bound":"A4AAAAAeClqf","upper_bound":"A4AAAAAesItP","repeats":1},{"count":1240,"lower_bound":"A4AAAAAeuXSM","upper_bound":"A4AAAAAgCGNj","repeats":1},{"count":1248,"lower_bound":"A4AAAAAgE6Rn","upper_bound":"A4AAAAAg2enh","repeats":1},{"count":1256,"lower_bound":"A4AAAAAg6kaV","upper_bound":"A4AAAAAhnWiu","repeats":1},{"count":1264,"lower_bound":"A4AAAAAhqUY4","upper_bound":"A4AAAAAjXbft","repeats":1},{"count":1272,"lower_bound":"A4AAAAAjyW27","upper_bound":"A4AAAAAldapF","repeats":1},{"count":1280,"lower_bound":"A4AAAAAlvrox","upper_bound":"A4AAAAAmvZwL","repeats":1},{"count":1288,"lower_bound":"A4AAAAAm8nKQ","upper_bound":"A4AAAAAoHp52","repeats":1},{"count":1296,"lower_bound":"A4AAAAAoPuqb","upper_bound":"A4AAAAApLVfH","repeats":1},{"count":1304,"lower_bound":"A4AAAAApT4Uq","upper_bound":"A4AAAAAqaHu5","repeats":1},{"count":1312,"lower_bound":"A4AAAAAqc7VS","upper_bound":"A4AAAAArZWdw","repeats":1},{"count":1320,"lower_bound":"A4AAAAArZlOD","upper_bound":"A4AAAAAsDohT","repeats":1},{"count":1328,"lower_bound":"A4AAAAAsLhg+","upper_bound":"A4AAAAAtSWwD","repeats":1},{"count":1336,"lower_bound":"A4AAAAAtfy2d","upper_bound":"A4AAAAAuGhri","repeats":1},{"count":1344,"lower_bound":"A4AAAAAuHTZO","upper_bound":"A4AAAAAu/kM6","repeats":1},{"count":1352,"lower_bound":"A4AAAAAvEhMQ","upper_bound":"A4AAAAAwi1gd","repeats":1},{"count":1360,"lower_bound":"A4AAAAAwmF3l","upper_bound":"A4AAAAAxhAAC","repeats":1},{"count":1368,"lower_bound":"A4AAAAAxkN82","upper_bound":"A4AAAAAx3B/p","repeats":1},{"count":1376,"lower_bound":"A4AAAAAx436Q","upper_bound":"A4AAAAAy36Ve","repeats":1},{"count":1384,"lower_bound":"A4AAAAAy9i+Y","upper_bound":"A4AAAAAzoXqL","repeats":1},{"count":1392,"lower_bound":"A4AAAAAz/bhC","upper_bound":"A4AAAAA0jBxf","repeats":1},{"count":1400,"lower_bound":"A4AAAAA0jrXD","upper_bound":"A4AAAAA1QrhE","repeats":1},{"count":1408,"lower_bound":"A4AAAAA1d96e","upper_bound":"A4AAAAA1/V9x","repeats":1},{"count":1416,"lower_bound":"A4AAAAA2IyIo","upper_bound":"A4AAAAA3D4Zf","repeats":1},{"count":1424,"lower_bound":"A4AAAAA3InCL","upper_bound":"A4AAAAA4bCiW","repeats":1},{"count":1432,"lower_bound":"A4AAAAA4dV4K","upper_bound":"A4AAAAA5f7MK","repeats":1},{"count":1440,"lower_bound":"A4AAAAA5mhMK","upper_bound":"A4AAAAA6JcnM","repeats":1},{"count":1448,"lower_bound":"A4AAAAA6MIT/","upper_bound":"A4AAAAA7SML3","repeats":1},{"count":1456,"lower_bound":"A4AAAAA7S9yF","upper_bound":"A4AAAAA7ocKl","repeats":1},{"count":1464,"lower_bound":"A4AAAAA7o22u","upper_bound":"A4AAAAA8qZ/J","repeats":1},{"count":1472,"lower_bound":"A4AAAAA80MRM","upper_bound":"A4AAAAA90o7l","repeats":1},{"count":1480,"lower_bound":"A4AAAAA+N9n4","upper_bound":"A4AAAAA/VZ7D","repeats":1},{"count":1488,"lower_bound":"A4AAAAA/WJzt","upper_bound":"A4AAAABAoxJ8","repeats":1},{"count":1496,"lower_bound":"A4AAAABBRaHU","upper_bound":"A4AAAABB2rv4","repeats":1},{"count":1504,"lower_bound":"A4AAAABB2tVa","upper_bound":"A4AAAABDGH6J","repeats":1},{"count":1512,"lower_bound":"A4AAAABDJrZw","upper_bound":"A4AAAABD0wYE","repeats":1},{"count":1520,"lower_bound":"A4AAAABD1WY9","upper_bound":"A4AAAABEW1JD","repeats":1},{"count":1528,"lower_bound":"A4AAAABEx+f3","upper_bound":"A4AAAABFRvZs","repeats":1},{"count":1536,"lower_bound":"A4AAAABFSmZI","upper_bound":"A4AAAABFtNnF","repeats":1},{"count":1544,"lower_bound":"A4AAAABFwZHB","upper_bound":"A4AAAABGqLAZ","repeats":1},{"count":1552,"lower_bound":"A4AAAABGsQZ6","upper_bound":"A4AAAABH49pq","repeats":1},{"count":1560,"lower_bound":"A4AAAABH68KT","upper_bound":"A4AAAABItyjQ","repeats":1},{"count":1568,"lower_bound":"A4AAAABIy1GS","upper_bound":"A4AAAABJdW2p","repeats":1},{"count":1576,"lower_bound":"A4AAAABJvvKq","upper_bound":"A4AAAABKyByj","repeats":1},{"count":1584,"lower_bound":"A4AAAABK2kqW","upper_bound":"A4AAAABLPNmv","repeats":1},{"count":1592,"lower_bound":"A4AAAABLxwYP","upper_bound":"A4AAAABMXEAv","repeats":1},{"count":1600,"lower_bound":"A4AAAABMYqPH","upper_bound":"A4AAAABN2PZu","repeats":1},{"count":1608,"lower_bound":"A4AAAABN/fd9","upper_bound":"A4AAAABOqbyJ","repeats":1},{"count":1616,"lower_bound":"A4AAAABPAONw","upper_bound":"A4AAAABQXLYO","repeats":1},{"count":1624,"lower_bound":"A4AAAABQe6bc","upper_bound":"A4AAAABQzhj/","repeats":1},{"count":1632,"lower_bound":"A4AAAABQ3+9x","upper_bound":"A4AAAABRmTIM","repeats":1},{"count":1640,"lower_bound":"A4AAAABRye/P","upper_bound":"A4AAAABSn2tw","repeats":1},{"count":1648,"lower_bound":"A4AAAABSpWhG","upper_bound":"A4AAAABTQyu7","repeats":1},{"count":1656,"lower_bound":"A4AAAABTQzEb","upper_bound":"A4AAAABUsR2p","repeats":1},{"count":1664,"lower_bound":"A4AAAABUs9R4","upper_bound":"A4AAAABVz1kV","repeats":1},{"count":1672,"lower_bound":"A4AAAABV4X3a","upper_bound":"A4AAAABWssA5","repeats":1},{"count":1680,"lower_bound":"A4AAAABWwZ6R","upper_bound":"A4AAAABXKxRR","repeats":1},{"count":1688,"lower_bound":"A4AAAABXNdjB","upper_bound":"A4AAAABX6xZO","repeats":1},{"count":1696,"lower_bound":"A4AAAABYEe8q","upper_bound":"A4AAAABY8jyL","repeats":1},{"count":1704,"lower_bound":"A4AAAABY8o1c","upper_bound":"A4AAAABaOdBw","repeats":1},{"count":1712,"lower_bound":"A4AAAABaUXMJ","upper_bound":"A4AAAABbGD/g","repeats":1},{"count":1720,"lower_bound":"A4AAAABbVIaZ","upper_bound":"A4AAAABcDXlP","repeats":1},{"count":1728,"lower_bound":"A4AAAABcGPED","upper_bound":"A4AAAABdU/81","repeats":1},{"count":1736,"lower_bound":"A4AAAABdYehv","upper_bound":"A4AAAABeqWEZ","repeats":1},{"count":1744,"lower_bound":"A4AAAABezvXS","upper_bound":"A4AAAABfHC7l","repeats":1},{"count":1752,"lower_bound":"A4AAAABfTpIl","upper_bound":"A4AAAABfxpCO","repeats":1},{"count":1760,"lower_bound":"A4AAAABf0fRN","upper_bound":"A4AAAABgg3cp","repeats":1},{"count":1768,"lower_bound":"A4AAAABghte0","upper_bound":"A4AAAABiDjeR","repeats":1},{"count":1776,"lower_bound":"A4AAAABieULC","upper_bound":"A4AAAABjjX/O","repeats":1},{"count":1784,"lower_bound":"A4AAAABjzabG","upper_bound":"A4AAAABkWZF2","repeats":1},{"count":1792,"lower_bound":"A4AAAABkbq52","upper_bound":"A4AAAABlOri4","repeats":1},{"count":1800,"lower_bound":"A4AAAABlYZnc","upper_bound":"A4AAAABmTxX0","repeats":1},{"count":1808,"lower_bound":"A4AAAABmaq/p","upper_bound":"A4AAAABnhR/b","repeats":1},{"count":1816,"lower_bound":"A4AAAABnmVwK","upper_bound":"A4AAAABoVjKr","repeats":1},{"count":1824,"lower_bound":"A4AAAABokqD5","upper_bound":"A4AAAABqCjIs","repeats":1},{"count":1832,"lower_bound":"A4AAAABqDtyx","upper_bound":"A4AAAABrRY7z","repeats":1},{"count":1840,"lower_bound":"A4AAAABrS+u0","upper_bound":"A4AAAABsDLKf","repeats":1},{"count":1848,"lower_bound":"A4AAAABsFcO2","upper_bound":"A4AAAABskxe1","repeats":1},{"count":1856,"lower_bound":"A4AAAABsvQub","upper_bound":"A4AAAABt1+yr","repeats":1},{"count":1864,"lower_bound":"A4AAAABt4m2v","upper_bound":"A4AAAABudUeu","repeats":1},{"count":1872,"lower_bound":"A4AAAABujbLL","upper_bound":"A4AAAABvvjWK","repeats":1},{"count":1880,"lower_bound":"A4AAAABv6Kke","upper_bound":"A4AAAABwnEtv","repeats":1},{"count":1888,"lower_bound":"A4AAAABw9Fvb","upper_bound":"A4AAAABxXk+Q","repeats":1},{"count":1896,"lower_bound":"A4AAAAByNLbs","upper_bound":"A4AAAABzXNVw","repeats":1},{"count":1904,"lower_bound":"A4AAAABzfe82","upper_bound":"A4AAAABz8VX5","repeats":1},{"count":1912,"lower_bound":"A4AAAAB0AitT","upper_bound":"A4AAAAB0zRTK","repeats":1},{"count":1920,"lower_bound":"A4AAAAB00Exw","upper_bound":"A4AAAAB1zI+3","repeats":1},{"count":1928,"lower_bound":"A4AAAAB18C3a","upper_bound":"A4AAAAB3Rxuv","repeats":1},{"count":1936,"lower_bound":"A4AAAAB3UOY+","upper_bound":"A4AAAAB31gB1","repeats":1},{"count":1944,"lower_bound":"A4AAAAB32yRo","upper_bound":"A4AAAAB4c+eO","repeats":1},{"count":1952,"lower_bound":"A4AAAAB4dv8Y","upper_bound":"A4AAAAB5PCxt","repeats":1},{"count":1960,"lower_bound":"A4AAAAB5PoN1","upper_bound":"A4AAAAB6ZHS6","repeats":1},{"count":1968,"lower_bound":"A4AAAAB6xIRv","upper_bound":"A4AAAAB7SCb2","repeats":1},{"count":1976,"lower_bound":"A4AAAAB7WzD5","upper_bound":"A4AAAAB8sOQ2","repeats":1},{"count":1984,"lower_bound":"A4AAAAB8ykyc","upper_bound":"A4AAAAB9gZRz","repeats":1},{"count":1992,"lower_bound":"A4AAAAB9nk+s","upper_bound":"A4AAAAB+6TlC","repeats":1},{"count":2000,"lower_bound":"A4AAAAB/CgM9","upper_bound":"A4AAAAB/9ElK","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,0,1,1,0,2,0,1,0,2,0,1,0,2,1,0,1,0,1,1,1,1,3,1,1,2,1,2,1,0,0,1,0,3,0,1,2,2,2,2,0,1,0,0,1,2,0,0,1,1,1,2,0,0,2,1,2,0,0,0,1,1,1,0,0,1,1,1,0,2,2,0,2,1,0,1,0,1,1,0,2,1,2,0,0,1,2,0,2,1,2,1,2,0,1,3,2,1,4,0,2,2,1,0,2,0,1,3,1,2,0,0,0,0,0,0,2,1,0,0,1,0,0,1,1,1,0,1,1,1,1,0,0,0,1,3,1,2,0,3,1,1,1,2,0,1,0,2,0,0,0,0,1,0,1,0,1,2,1,1,0,1,0,3,2,0,2,1,1,1,1,0,0,2,1,5,0,0,0,0,0,0,0,2,3,2,2,1,1,1,3,2,1,1,0,1,1,1,0,3,2,1,0,1,0,1,2,0,0,2,4,0,0,2,3,0,1,0,1,0,1,0,1,0,0,1,0,1,1,1,0,2,0,2,0,2,1,2,2,2,1,2,2,1,2,0,1,1,1,0,2,0,2,0,1,2,0,0,1,1,1,2,1,1,1,0,0,0,1,0,3,3,0,2,2,0,1,0,2,1,0,0,1,1,1,0,3,0,2,1,2,1,0,2,1,0,3,1,2,2,3,0,1,0,0,1,0,2,1,1,1,2,1,2,1,1,2,1,0,1,2,1,0,0,2,0,0,1,1,1,0,2,0,0,0,2,1,1,1,0,1,2,0,1,1,1,1,1,2,2,1,0,1,0,0,0,0,0,1,1,0,3,0,3,0,1,3,2,2,2,1,1,1,2,1,0,0,0,0,2,0,1,1,2,0,0,0,1,2,0,2,1,0,1,3,0,3,3,2,0,1,1,0,0,0,1,2,3,0,0,1,2,2,2,1,2,2,0,1,2,0,2,1,2,1,1,0,1,1,0,1,0,3,3,1,1,1,0,1,0,0,0,0,0,4,1,0,1,1,0,1,2,0,1,1,0,3,1,2,2,0,2,2,1,2,1,0,1,1,1,2,1,2,0,0,1,0,2,1,1,1,2,1,0,0,0,0,0,2,1,0,0,1,0,0,2,1,1,0,1,0,1,1,0,0,0,0,4,0,1,2,0,2,2,0,0,3,0,0,3,3,1,2,1,0,0,0,1,0,0,0,0,0,0,0,3,4,1,3,1,0,2,4,0,1,2,0,0,1,0,1,0,0,0,1,0,1,2,2,0,1,1,1,0,1,0,2,0,1,1,2,2,3,0,2,2,0,0,1,0,1,1,1,2,0,1,2,0,3,3,0,0,0,0,2,0,0,3,0,0,1,1,1,1,1,2,0,1,1,3,0,1,0,1,2,0,0,1,1,2,2,2,1,1,2,2,2,1,1,0,0,1,3,1,0,2,1,1,0,0,2,0,1,2,0,0,1,1,0,1,1,0,1,2,1,1,0,1,2,3,0,0,0,0,1,0,1,2,1,1,1,1,1,1,1,1,0,2,2,1,1,0,0,1,0,0,0,0,0,2,1,4,0,3,0,1,0,1,1,1,0,4,2,4,0,2,1,2,1,1,1,1,0,0,0,1,0,0,2,2,1,1,0,0,2,0,0,2,1,1,0,0,0,1,2,2,0,1,1,1,1,1,0,0,1,0,1,0,2,1,0,1,1,2,0,0,0,0,0,2,0,1,0,0,0,0,2,2,1,3,2,0,1,0,1,1,1,1,2,2,2,1,1,0,0,0,0,0,2,1,2,1,1,1,0,1,1,1,1,2,1,0,0,1,0,0,1,3,2,0,0,0,0,2,0,1,2,2,1,1,0,2,0,1,2,0,0,1,1,4,1,4,0,0,1,0,0,0,2,2,0,4,1,1,0,1,0,3,2,1,1,1,1,1,1,1,0,1,1,1,0,2,1,1,2,1,0,1,1,1,0,1,2,3,0,1,0,0,1,1,0,1,2,1,2,1,2,3,3,0,1,1,1,2,0,3,0,0,0,1,0,1,5,1,1,1,0,0,0,1,1,0,0,0,2,2,0,1,4,2,0,0,3,2,0,0,0,0,2,1,0,0,0,3,1,1,2,3,2,3,0,1,0,1,2,1,0,0,0,2,1,0,0,1,1,0,0,0,2,0,0,1,0,2,2,1,1,2,0,1,0,1,0,0,2,2,3,2,0,0,4,1,2,1,0,2,2,0,1,3,1,1,2,1,0,1,2,1,2,2,0,0,0,1,1,1,3,2,1,0,1,0,0,0,1,0,0,2,1,0,0,2,2,0,0,0,2,0,2,0,1,3,2,0,1,1,0,0,0,0,2,0,1,1,1,2,0,0,1,0,0,2,0,0,1,0,0,1,2,1,1,0,2,2,1,0,1,2,1,2,1,0,0,1,4,0,0,1,1,4,0,1,0,2,0,1,2,1,0,2,2,0,2,3,0,0,0,1,0,2,0,1,0,1,1,1,1,2,3,1,3,0,1,3,1,2,2,0,0,0,2,1,3,1,1,2,1,0,0,0,0,1,2,1,0,1,1,0,0,0,2,2,1,1,1,2,0,0,2,2,3,1,0,1,2,0,2,1,2,2,2,1,0,2,1,3,2,2,1,1,0,4,1,1,0,1,1,1,0,3,0,0,1,0,2,0,1,1,1,2,1,1,1,1,1,2,1,1,1,0,0,0,2,0,2,2,1,0,0,0,2,1,0,4,1,1,1,2,4,0,0,0,1,3,3,2,0,1,0,2,3,0,2,0,0,1,1,2,2,1,1,1,1,3,4,1,1,3,1,0,1,1,0,1,0,0,0,0,1,1,0,1,0,2,2,0,1,4,3,1,1,0,2,0,1,0,2,0,0,3,1,0,0,1,2,0,1,1,0,0,0,0,1,0,2,1,3,0,2,1,1,2,2,0,3,0,0,0,0,1,2,0,1,0,1,1,1,2,0,3,2,2,0,2,3,0,0,1,1,0,1,3,1,0,1,2,1,1,2,1,0,1,1,2,1,0,1,2,2,2,1,0,1,1,1,1,2,1,0,0,2,0,1,1,1,0,1,3,0,1,1,0,0,2,0,2,1,2,1,2,2,1,3,0,1,0,1,0,3,0,0,2,1,0,2,0,1,1,2,2,1,1,1,1,0,1,1,2,3,0,0,1,1,0,3,0,1,1,0,0,0,2,1,0,1,0,3,4,1,2,2,0,0,0,1,0,1,2,0,0,0,0,0,2,0,1,1,0,0,0,1,2,0,1,0,3,1,1,2,0,1,1,2,2,2,1,0,1,2,2,0,1,3,2,2,1,1,1,0,0,1,3,0,4,1,0,0,1,1,0,3,1,1,2,2,1,3,0,1,0,1,0,0,2,1,0,1,0,2,2,1,0,2,0,1,1,0,1,1,0,0,0,0,1,0,1,4,1,0,2,2,0,1,0,2,2,1,0,3,0,2,0,1,2,0,1,0,1,3,1,1,2,2,1,1,1,0,1,0,0,0,2,1,0,0,1,2,2,0,0,0,3,0,0,2,1,0,0,1,0,2,1,0,1,2,1,1,0,2,2,2,1,1,1,0,2,2,1,0,0,0,3,1,1,0,2,1,0,0,1,2,0,2,2,1,1,0,1,1,1,1,0,1,0,0,1,1,2,2,0,0,0,4,1,0,1,1,1,0,0,0,1,2,1,1,0,1,0,0,0,2,0,0,1,0,0,4,0,1,1,1,2,2,1,1,1,3,2,0,1,1,0,3,1,0,1,1,3,1,0,0,0,3,1,0,1,3,2,2,0,0,1,1,0,0,1,0,0,2,1,0,1,0,1,0,2,0,2,0,1,1,4,0,0,2,3,0,2,0,1,2,0,2,0,4,0,0,1,0,3,0,0,0,0,0,3,1,1,0,2,0,1,1,1,0,1,1,0,2,1,1,1,0,2,0,1,2,1,1,0,0,1,1,1,0,4,2,1,4,2,0,0,2,3,0,3,1,1,0,0,0,0,1,0,1,0,0,0,0,1,1,1,1,0,0,0,1,2,2,1,1,1,2,1,0,1,0,0,1,2,1,2,0,1,1,3,1,1,2,0,2,1,2,0,1,0,0,2,1,1,1,0,0,0,0,1,0,0,2,0,0,0,2,0,1,2,0,0,1,1,1,1,2,1,1,1,1,0,1,2,2,0,0,0,1,1,1,1,2,1,1,1,1,0,1,0,2,2,0,2,1,3,1,0,0,1,1,0,1,2,1,1,1,0,0,0,2,2,1,0,0,1,0,1,2,0,1,0,1,2,0,1,0,2,0,2,0,0,0,3,1,2,3,1,1,1,0,3,0,1,2,1,1,0,0,1,0,2,1,0,0,3,0,0,0,0,0,0,1,3,4,2,1,0,2,1,0,1,0,0,1,1,0,1,1,2,0,0,2,2,0,1,0,1,0,1,0,0,1,1,0,1,1,0,0,1,1,0,1,0,1,3,0,0,1,0,0,1,1,0,0,3,0,3,2,1,2,1,0,3,0,0,1,0,1,1,1,1,1,3,2,1,0,0,2,1,0,1,2,1,1,0,0,1,0,3,0,1,2,0,1,0,1,2,1,1,0]},{"counters":[0,1,0,1,2,1,1,0,2,1,4,0,0,2,1,2,0,0,5,0,0,1,0,0,1,2,1,0,1,0,0,0,0,0,1,2,1,4,1,2,1,2,2,0,1,3,0,1,0,1,1,0,0,0,2,2,0,1,1,0,0,1,2,2,2,1,0,1,0,0,2,2,2,0,0,2,2,1,0,0,1,2,1,2,0,2,2,0,1,0,1,0,2,1,0,1,1,2,0,3,0,1,0,2,0,1,0,0,1,0,2,1,3,0,1,1,2,2,1,0,2,2,0,0,2,0,1,2,0,1,2,0,2,0,1,0,0,0,2,1,0,0,2,1,1,1,2,0,4,1,0,1,1,0,1,0,0,1,2,2,0,0,1,0,0,4,0,1,1,0,2,0,2,1,0,2,0,1,1,2,1,2,1,1,2,1,0,2,1,1,0,0,2,3,0,0,1,0,0,1,0,1,0,1,1,2,2,2,0,0,2,0,0,3,0,0,0,0,1,0,4,0,0,0,1,1,1,1,0,0,1,3,1,1,0,1,1,3,1,2,1,1,1,0,1,0,0,1,0,1,2,4,1,0,0,0,1,2,1,0,0,1,3,0,0,1,1,0,0,1,0,0,0,1,0,0,0,2,1,0,1,1,0,3,4,0,0,3,0,1,2,1,0,2,2,4,0,1,0,0,1,3,1,0,2,0,0,1,1,1,0,1,2,2,0,2,3,1,2,0,0,1,2,1,1,0,1,0,0,0,0,3,1,0,1,2,1,0,1,0,1,2,2,0,4,1,1,0,0,0,3,1,0,1,0,2,2,1,1,1,2,0,2,0,1,2,0,1,0,1,2,3,1,0,1,1,0,1,1,2,2,0,1,0,3,0,0,1,1,0,1,2,2,0,1,1,0,1,1,1,0,1,1,1,0,0,1,2,0,0,1,1,0,1,1,1,1,0,2,1,1,0,2,1,1,0,1,0,1,0,1,1,2,0,0,1,0,1,1,1,0,2,0,3,0,0,0,0,0,0,0,2,1,1,0,1,1,2,2,2,0,2,0,2,2,1,0,1,0,0,0,2,0,1,0,2,1,2,0,0,2,1,0,0,0,0,1,2,1,0,2,2,2,0,0,0,4,1,3,1,0,1,2,0,0,1,0,2,1,1,0,2,2,2,0,1,0,2,0,2,1,1,0,1,0,2,2,1,0,1,0,0,0,3,0,0,1,2,0,0,3,2,0,0,2,1,1,3,2,2,2,0,1,2,1,1,1,0,1,0,0,4,0,1,1,1,2,2,0,3,1,1,0,0,0,1,2,2,6,0,2,3,2,1,3,0,0,1,1,0,0,0,0,1,0,1,1,2,0,0,0,0,1,1,1,1,0,1,0,0,1,1,0,2,1,0,2,0,1,1,0,0,3,3,1,1,1,0,1,2,3,1,1,1,1,0,1,2,1,1,0,2,0,2,0,0,1,2,0,3,0,0,1,2,0,1,0,0,2,0,1,1,0,0,2,0,2,2,3,0,0,3,0,1,2,2,0,1,1,1,0,0,1,2,2,1,1,1,1,1,0,0,2,0,1,1,0,1,2,1,0,2,2,0,1,0,0,4,1,2,0,1,0,3,2,3,1,0,0,0,2,2,1,0,0,0,0,1,0,1,1,1,0,1,2,3,0,1,1,0,1,3,3,0,1,0,3,1,0,2,0,0,1,2,2,0,0,0,0,0,1,1,2,3,0,2,1,1,1,0,0,0,0,2,5,2,1,2,1,1,0,1,0,0,2,3,0,0,3,0,1,2,1,3,0,2,1,2,1,0,0,0,1,1,3,1,1,0,2,1,0,2,2,0,0,1,0,1,1,1,1,0,0,1,2,1,2,1,1,1,0,2,1,0,1,0,0,1,4,0,1,0,0,0,1,1,1,1,0,1,0,0,0,0,1,1,2,0,2,1,1,1,1,0,0,1,1,0,2,2,0,1,0,2,1,0,1,0,0,0,1,0,0,1,1,0,0,3,0,1,1,2,1,0,1,1,0,5,1,0,0,1,1,0,1,0,0,1,1,2,2,0,1,0,1,1,2,0,1,1,1,1,1,2,0,0,2,1,0,0,0,1,0,0,2,2,4,4,1,2,1,1,2,0,3,1,2,1,2,2,0,0,1,0,2,2,2,1,1,2,0,1,1,1,1,1,3,2,2,2,1,1,2,2,3,1,0,1,1,0,1,0,1,0,1,2,1,1,3,2,1,0,0,1,2,1,1,2,1,0,1,1,1,2,2,0,0,3,1,0,1,0,0,0,2,0,0,2,0,1,0,1,0,1,0,1,0,3,1,0,4,1,1,0,1,1,0,3,0,0,1,1,1,0,0,1,1,0,1,2,1,0,2,1,0,0,0,1,0,3,1,1,4,0,1,0,1,2,2,3,2,0,1,2,0,1,0,1,2,1,0,2,1,0,1,1,0,0,2,2,0,3,0,0,0,1,0,1,0,2,1,1,2,0,0,0,0,0,1,1,2,1,0,1,0,1,1,0,1,4,0,0,1,1,1,3,1,1,1,1,1,2,1,0,1,0,0,1,0,2,4,0,5,0,0,0,0,0,1,1,2,0,3,0,0,1,1,1,2,1,3,1,2,1,0,3,1,4,0,2,1,0,0,1,0,1,0,0,0,0,0,3,0,1,0,1,1,2,3,1,1,0,0,0,1,2,2,1,3,0,2,1,1,2,1,1,2,1,0,2,0,0,2,2,1,0,3,2,2,2,1,0,3,1,3,1,1,3,1,1,0,1,1,0,0,2,0,1,0,0,3,1,1,0,1,0,0,0,1,0,1,1,0,0,0,1,1,0,0,0,0,1,1,0,2,0,0,1,2,0,1,2,1,0,0,2,2,0,2,3,1,1,3,2,0,3,0,0,0,2,0,2,0,1,2,1,0,0,1,2,1,1,1,0,1,0,1,1,1,3,0,0,2,1,1,0,0,1,0,1,0,1,2,1,0,0,1,0,0,0,2,1,0,0,4,2,1,0,1,1,1,1,2,1,0,2,2,0,1,1,1,1,3,3,0,3,1,2,2,2,1,1,2,0,1,1,2,1,1,1,2,1,0,0,1,2,0,2,0,1,2,1,0,2,0,0,3,1,1,2,0,1,0,2,2,0,0,0,2,1,0,0,0,2,2,0,3,0,1,0,1,1,1,2,0,1,3,0,0,0,1,2,2,0,0,0,1,4,1,0,0,1,0,0,1,2,1,1,2,1,1,0,0,0,0,0,0,0,0,0,0,1,3,2,2,3,0,1,3,0,2,0,1,2,1,0,2,1,2,0,1,0,3,3,0,1,0,2,2,3,2,0,1,3,1,0,1,1,1,0,1,1,1,3,0,1,0,0,0,0,0,1,1,1,1,2,0,0,0,0,0,1,1,2,1,1,3,1,1,1,2,1,0,0,0,2,1,0,1,0,4,0,0,1,0,2,0,2,1,1,0,0,0,2,1,2,0,2,0,1,3,0,1,0,1,0,2,2,0,0,2,1,1,1,0,0,0,0,2,1,1,0,0,1,3,1,1,0,0,2,1,2,2,0,0,0,2,0,0,0,0,0,1,1,2,2,2,3,1,1,0,1,1,1,3,1,1,0,2,1,0,1,2,0,0,2,2,0,1,1,0,2,3,0,2,2,1,0,2,0,3,1,1,2,1,2,0,3,1,1,2,1,2,1,0,0,2,0,1,0,3,0,2,0,2,1,2,1,1,1,1,4,1,0,1,0,4,0,1,0,0,1,2,2,0,0,0,0,0,0,0,1,1,0,4,0,2,0,1,0,0,2,1,0,2,3,1,1,1,0,2,1,2,1,0,0,0,0,3,1,1,1,1,0,1,2,1,4,0,0,2,0,0,0,2,3,2,3,0,1,1,2,0,1,2,0,0,0,0,0,0,1,0,0,1,0,1,2,2,2,1,0,2,1,1,1,1,1,1,0,1,1,0,1,2,1,1,3,1,0,1,0,1,2,0,0,0,2,1,1,0,1,1,1,1,1,0,2,1,2,0,0,0,0,2,0,0,1,0,2,0,0,0,1,1,1,1,1,0,2,1,0,0,1,0,0,1,5,0,0,1,0,2,2,2,0,1,0,5,1,1,0,0,1,1,0,2,1,2,1,1,0,0,2,0,2,2,0,2,1,2,0,0,0,4,1,0,1,1,0,1,4,1,1,0,2,2,2,0,0,2,0,0,0,2,3,0,0,1,1,0,1,0,2,1,0,1,1,1,1,0,1,2,0,0,1,1,0,0,1,2,2,2,1,1,0,1,1,1,1,1,1,0,0,2,1,0,1,0,2,1,0,0,0,2,0,2,3,0,1,0,1,1,1,2,1,0,0,0,0,0,0,1,1,1,0,1,1,1,1,0,0,1,4,3,0,3,0,3,2,1,1,2,1,0,1,1,3,0,0,0,1,1,1,1,0,0,2,1,2,2,1,1,2,1,0,0,2,0,0,0,1,1,3,1,1,2,1,1,1,0,2,2,0,1,0,1,1,3,3,1,0,1,3,0,1,6,0,1,2,1,1,1,2,3,1,1,1,1,2,0,3,1,2,2,1,1,1,1,2,2,1,0,2,2,1,1,0]},{"counters":[0,3,1,1,0,2,1,1,0,1,0,2,0,2,2,0,3,0,2,1,0,2,3,0,0,1,0,0,0,4,0,0,0,0,1,0,1,0,1,0,0,1,3,3,1,0,1,1,0,0,0,0,2,1,1,0,1,1,1,0,1,1,0,0,0,0,0,2,3,0,1,0,1,2,0,0,0,5,0,1,1,0,1,0,1,3,1,0,0,1,3,0,1,1,1,0,0,1,1,0,2,0,1,2,1,2,1,1,1,1,3,0,1,1,1,1,2,2,0,3,1,3,3,2,1,1,2,0,1,0,2,0,0,1,1,1,1,0,2,1,0,1,1,1,1,1,0,0,2,1,0,2,1,0,0,0,1,0,0,2,0,3,0,1,1,0,1,0,1,1,1,0,1,2,4,0,0,0,2,0,2,2,0,0,2,1,2,1,0,1,0,0,0,0,2,0,2,3,0,1,0,0,0,2,2,1,1,0,2,2,1,1,2,0,0,0,1,3,0,1,3,1,0,0,1,0,0,1,0,1,3,0,1,0,0,0,2,0,0,0,1,0,0,0,1,1,1,2,0,1,0,0,1,0,1,0,1,1,1,1,4,0,2,1,0,3,0,2,0,0,0,0,0,1,0,0,1,0,0,1,1,2,2,0,0,2,0,1,1,2,2,1,1,0,1,1,0,2,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,2,2,2,1,0,3,0,3,0,1,0,2,1,1,1,2,0,0,2,0,2,2,0,2,0,2,1,1,1,4,0,2,2,3,0,2,1,0,2,2,2,0,0,1,0,1,1,0,0,1,1,0,1,1,0,0,0,1,0,0,0,0,0,0,2,0,0,1,1,0,2,2,2,3,1,3,2,0,1,2,1,1,3,3,0,0,2,1,1,1,1,1,1,0,1,3,1,0,1,4,2,1,0,2,0,0,1,0,1,2,0,1,0,2,0,0,1,1,0,1,1,0,1,1,2,2,3,0,0,2,0,0,1,1,3,0,1,1,0,4,0,1,1,1,0,3,2,4,2,0,1,0,4,0,0,1,0,1,1,1,0,0,0,1,1,0,2,2,2,0,2,2,4,2,1,1,2,0,2,0,0,1,2,0,0,0,1,3,1,1,3,0,1,0,1,1,0,1,2,1,1,2,0,0,1,0,1,3,0,1,1,0,1,1,6,2,0,0,1,3,1,1,0,0,1,0,0,0,0,0,0,0,0,1,2,2,1,1,1,1,2,0,1,1,1,2,1,1,0,0,0,1,2,0,1,0,2,0,1,3,0,2,1,0,1,3,0,0,0,0,1,0,0,0,1,1,1,0,0,2,1,1,0,1,1,1,1,0,1,2,1,2,1,0,1,0,0,1,0,1,0,0,5,1,0,1,0,0,0,2,0,1,1,3,1,0,1,2,1,2,0,0,0,1,0,2,0,0,1,1,0,2,3,0,1,2,3,1,1,1,2,3,0,0,2,0,0,1,0,2,4,3,1,1,2,0,0,1,2,2,0,1,2,0,0,3,0,0,0,1,0,4,1,1,0,1,0,3,0,2,1,2,1,2,1,1,2,0,1,1,2,0,2,0,2,2,2,4,0,1,1,0,0,2,1,2,0,3,0,0,2,1,1,0,1,1,0,2,0,1,1,0,0,2,1,1,2,2,0,1,1,0,2,6,3,3,1,0,1,2,2,1,2,0,1,3,2,4,0,3,1,1,0,0,2,0,2,2,0,0,2,1,3,0,0,1,0,0,2,0,0,4,0,0,2,1,0,0,1,1,0,2,0,1,1,0,0,4,2,1,0,3,0,1,2,0,0,1,1,0,1,0,1,0,1,1,1,0,2,4,1,0,1,0,1,0,1,1,0,0,0,1,1,0,2,0,1,0,1,1,0,1,3,0,0,1,0,1,0,1,3,0,1,0,1,0,0,3,0,2,0,2,2,1,1,2,1,0,1,1,0,2,0,0,0,2,2,4,1,2,0,0,4,2,0,1,0,2,5,2,1,2,3,0,0,0,0,0,1,1,2,1,1,3,0,1,0,0,1,1,3,2,1,0,1,2,1,0,0,0,1,1,0,2,0,2,2,1,2,1,1,0,0,1,2,2,4,3,2,1,1,4,2,1,1,2,2,1,1,0,0,2,0,1,3,1,0,0,0,0,0,0,0,3,2,1,4,0,2,3,1,0,0,0,0,0,0,0,0,3,0,0,3,2,1,0,1,1,0,1,0,2,3,3,1,2,1,2,0,1,0,2,1,0,0,2,3,2,0,1,1,1,1,1,0,0,2,0,3,1,1,1,2,2,1,0,3,1,0,0,1,1,2,1,2,2,3,0,2,3,3,1,1,0,1,1,2,1,2,2,0,0,2,0,0,0,1,1,1,1,0,0,1,1,1,3,0,2,1,0,1,1,3,1,1,0,0,2,2,2,3,0,0,1,0,0,0,1,0,0,2,1,0,0,1,2,1,1,0,0,1,2,1,0,1,0,1,1,2,0,0,1,0,3,1,2,0,1,1,2,0,0,1,0,1,0,1,1,0,2,0,0,1,1,2,3,1,1,3,0,1,1,2,0,2,1,1,1,0,1,0,0,0,1,3,0,0,2,3,2,2,1,2,0,0,0,0,1,1,1,0,2,2,0,0,0,2,1,0,0,2,0,0,0,0,1,2,1,2,1,0,2,1,3,1,1,1,0,1,2,4,0,0,1,1,0,0,0,0,0,1,1,2,1,0,1,3,1,1,2,2,0,1,1,1,1,0,0,1,2,1,0,0,2,0,4,0,3,0,0,0,0,1,2,0,1,0,1,1,1,2,1,1,1,1,2,2,1,1,2,0,0,1,0,1,2,3,2,2,1,1,2,2,1,2,1,2,1,3,2,2,2,2,0,0,2,0,2,1,2,3,1,1,0,0,0,0,1,0,0,0,0,1,1,3,1,1,2,2,0,1,0,0,1,0,1,1,1,2,1,0,2,0,1,1,0,1,1,1,1,2,1,2,0,1,0,1,1,0,2,2,1,2,0,1,0,1,0,1,1,1,1,0,4,0,2,0,0,0,2,2,2,0,1,0,1,2,0,1,1,4,0,0,2,0,2,1,1,2,0,1,3,3,1,1,1,1,0,2,0,1,1,1,2,1,3,0,1,0,0,1,1,2,2,1,1,0,1,1,1,1,0,1,1,0,0,1,0,0,3,1,0,2,1,0,1,0,0,0,1,1,2,1,1,1,0,1,1,0,0,0,0,1,1,0,1,0,1,0,0,1,1,0,1,2,0,1,1,0,0,1,1,3,0,1,1,0,1,0,0,1,1,2,4,1,0,0,2,1,1,2,1,2,1,1,1,0,1,2,1,0,1,0,1,0,0,0,1,0,5,1,0,2,2,1,1,0,1,1,1,1,1,1,0,0,2,0,2,1,2,1,0,1,1,2,0,0,2,2,0,1,1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,4,1,1,1,2,0,0,2,0,1,3,0,0,1,0,0,2,1,1,0,0,0,1,0,0,3,1,0,0,1,0,2,1,2,0,0,0,0,0,4,2,1,3,1,3,1,1,1,0,1,1,2,1,2,1,0,1,1,1,0,1,0,1,0,0,2,3,2,0,0,3,1,1,1,3,0,0,0,1,0,3,0,1,1,1,0,0,0,2,2,1,1,1,2,0,2,0,2,0,1,2,2,2,0,0,3,1,1,3,2,1,1,0,1,1,1,1,0,0,0,1,0,5,2,0,1,0,0,0,2,1,1,0,1,0,1,2,3,0,0,0,0,1,0,2,1,1,1,2,0,2,3,4,0,2,2,0,2,2,0,1,2,0,0,0,2,0,1,1,0,0,2,0,1,0,2,1,1,0,0,3,1,0,2,0,2,3,0,0,2,1,0,1,1,1,1,1,0,3,0,1,0,0,1,2,1,2,0,0,2,0,0,1,1,2,1,1,0,1,1,2,0,2,1,1,3,0,1,2,0,0,2,3,1,1,0,1,2,1,1,3,2,2,0,0,2,0,2,0,0,0,0,0,0,1,1,2,1,1,1,0,1,0,1,1,2,0,1,1,0,3,1,0,1,0,1,0,0,3,0,1,6,1,1,0,0,1,2,0,2,2,1,1,0,0,2,2,1,1,0,1,3,2,2,1,1,1,1,1,2,3,0,2,0,0,1,1,2,0,1,1,0,1,0,1,0,1,0,0,0,1,1,1,1,1,0,0,2,1,2,0,1,1,0,1,1,1,1,1,0,1,3,0,0,1,0,0,0,4,1,0,2,2,2,1,1,0,3,1,0,1,1,1,1,1,1,2,1,2,0,0,0,1,1,2,1,1,4,0,1,3,2,0,1,0,2,0,0,0,2,0,1,0,2,0,2,2,0,1,0,1,0,0,1,0,4,2,0,1,0,0,0,0,1,1,1,2,1,2,0,1,0,0,0,1,0,5,2,2,2,1,0,1,0,1,0,2,2,2,0,0,0,0,1,1,1,1,0,0,1,0,2,0,0,0,2,1,1,1,2,1,0,0,1,1,1,0,1,1,2,2,0,0,0,2,3,2,0,1,1,0,1,1,0,1,1,2]},{"counters":[2,0,1,1,0,0,0,1,0,0,0,2,2,3,0,1,0,1,0,1,0,0,1,1,1,0,1,6,1,2,1,1,0,1,0,2,0,1,0,2,1,0,2,0,3,0,1,0,1,4,1,1,0,1,2,1,0,0,2,1,1,4,0,2,1,1,4,1,2,0,2,2,2,1,0,1,0,0,1,0,2,0,1,0,1,0,1,0,0,2,4,0,1,2,0,1,1,1,1,3,0,1,0,0,1,0,0,2,2,0,1,1,1,2,2,0,0,1,0,1,1,1,1,1,1,5,0,4,1,0,0,1,0,0,0,0,0,2,2,1,0,1,2,0,0,1,1,2,0,2,1,2,1,0,0,2,0,0,1,0,0,2,0,1,0,1,2,0,2,2,0,2,0,2,1,3,1,1,2,0,2,0,4,0,0,1,0,1,0,0,0,0,1,1,0,4,0,1,2,0,1,1,0,1,2,1,1,0,0,2,1,0,2,0,2,0,1,0,0,1,1,0,0,3,2,2,0,1,5,0,1,0,1,2,0,1,1,0,0,0,2,0,1,1,6,2,5,2,1,0,1,4,0,2,0,0,1,0,0,2,2,0,0,0,2,0,1,1,1,1,0,1,0,0,1,0,0,0,1,3,1,1,0,3,1,3,0,0,2,0,0,1,0,1,4,1,0,4,1,1,0,0,0,1,2,2,2,0,0,0,0,1,0,1,2,3,0,0,0,1,0,4,1,2,1,1,1,1,0,1,2,1,2,1,0,0,1,1,0,0,1,2,2,1,1,0,1,1,0,2,0,0,1,2,0,2,2,2,2,1,0,1,2,1,0,3,0,1,0,1,0,1,2,0,0,0,2,0,0,2,2,0,1,1,1,2,1,0,3,0,2,2,0,0,1,1,1,0,1,0,1,0,0,1,2,1,0,2,0,2,0,0,0,0,4,1,0,2,4,0,1,1,1,0,1,0,2,0,1,1,1,2,1,2,1,1,1,1,0,0,0,0,1,1,2,1,1,2,1,0,1,0,1,2,0,0,1,1,0,0,2,2,0,2,1,1,0,2,1,0,0,1,2,1,0,0,1,0,0,1,0,0,2,1,2,1,0,1,0,2,1,1,0,0,0,1,1,1,0,0,1,0,3,1,1,0,1,1,1,1,0,3,2,0,2,0,0,1,0,0,1,1,0,0,1,1,1,2,2,1,1,1,0,3,1,3,1,1,0,3,3,0,0,0,1,0,0,0,1,2,0,1,0,1,0,1,2,0,0,1,1,1,1,0,0,0,0,1,2,2,0,0,0,0,0,0,1,1,1,1,1,0,0,0,1,1,1,1,3,0,1,1,2,0,0,0,1,2,0,1,1,5,1,0,0,0,0,2,0,0,3,2,1,1,1,0,1,2,0,5,2,2,1,3,1,0,3,0,0,0,0,1,2,0,0,3,2,0,1,1,1,0,2,0,1,0,1,0,1,0,0,1,4,0,1,0,1,0,1,0,1,0,2,1,1,1,1,0,2,1,1,3,0,0,0,0,0,1,0,1,1,0,0,3,3,2,3,0,3,1,3,1,1,0,0,2,3,2,0,1,0,2,0,1,0,2,1,0,1,0,1,0,0,1,0,1,2,1,0,2,1,0,0,2,1,3,0,1,1,1,0,1,2,1,1,4,0,0,0,1,0,0,1,2,0,2,0,2,0,2,0,0,1,1,2,3,0,0,2,0,0,2,1,0,1,2,2,0,1,0,0,2,1,1,2,0,1,1,1,1,1,0,2,0,2,0,0,1,2,0,1,0,1,2,1,2,0,2,1,2,0,1,1,2,2,1,2,1,1,0,0,0,1,0,0,1,1,2,1,1,1,1,2,0,1,0,0,0,1,0,1,1,1,0,0,1,1,2,0,2,0,1,1,2,0,1,0,1,1,1,3,2,1,2,0,0,1,1,0,1,2,1,1,0,2,4,2,1,3,0,3,0,1,4,2,2,0,0,0,0,0,2,1,0,0,1,2,1,1,0,0,2,0,1,1,4,1,0,0,0,2,0,2,2,0,0,2,0,0,1,0,2,0,2,1,0,1,0,0,0,1,0,0,1,1,0,0,1,0,0,2,2,0,0,1,0,0,2,2,0,1,0,1,0,1,2,0,2,0,0,2,1,1,2,2,0,2,0,0,1,0,2,1,2,2,1,1,1,0,2,1,2,1,0,2,0,0,0,1,0,1,1,1,0,1,3,2,2,1,1,0,2,0,1,1,0,1,0,1,1,0,1,0,1,2,0,2,2,3,0,0,1,3,0,1,1,0,1,0,2,1,0,3,3,0,0,1,3,1,1,1,2,1,2,1,0,1,0,3,2,2,0,1,1,1,0,1,2,1,1,1,0,2,3,2,0,0,1,0,0,1,3,1,1,0,0,0,1,0,0,1,2,0,3,1,0,1,1,0,1,1,0,3,0,3,0,3,0,0,1,2,2,0,0,2,0,1,1,1,0,1,1,1,0,1,3,2,1,1,0,1,1,2,0,0,0,0,0,0,2,2,3,1,0,3,1,2,1,0,2,2,0,0,1,0,1,2,0,3,1,0,1,1,0,0,2,1,2,2,0,2,2,1,1,2,3,1,1,0,0,0,5,3,2,1,1,1,1,2,1,1,5,1,1,0,1,1,1,1,0,1,1,1,0,1,1,1,2,0,1,1,1,1,0,3,0,0,2,0,1,0,0,2,0,1,1,2,1,0,0,1,2,2,1,1,2,0,0,2,2,1,0,1,1,1,0,0,1,0,0,0,0,2,0,1,0,1,2,0,1,0,0,1,2,0,0,1,2,2,0,0,2,1,0,0,1,4,0,1,2,0,3,1,0,1,0,2,1,1,2,0,1,1,1,2,1,0,0,0,1,1,0,0,0,1,0,1,1,0,1,2,1,1,1,0,1,1,0,1,0,0,2,1,0,2,0,1,2,0,0,1,1,1,2,0,1,4,1,2,0,0,0,1,3,1,1,1,1,1,0,1,0,4,1,1,3,1,0,1,1,4,0,2,0,0,0,0,1,1,0,1,0,2,1,0,3,0,1,2,2,0,3,0,1,1,1,2,0,0,0,3,2,2,0,0,1,1,0,1,1,1,0,1,3,1,0,2,0,0,2,2,1,0,0,1,1,2,0,0,1,2,0,1,0,0,2,0,1,0,1,1,1,0,0,1,2,0,1,1,0,0,2,0,0,5,2,0,0,1,0,3,0,0,0,3,0,1,0,0,3,1,0,1,1,1,0,3,0,2,1,0,1,2,0,1,1,2,0,0,3,1,0,2,0,1,2,0,1,1,1,0,0,1,0,0,2,0,1,1,2,1,0,0,0,2,1,1,0,0,2,1,2,0,0,2,2,0,1,2,2,2,0,3,1,1,1,1,3,1,2,0,2,0,1,1,2,1,3,0,1,1,1,3,1,0,1,0,0,2,2,1,2,2,0,2,1,2,0,1,0,0,1,0,2,2,2,0,0,1,0,1,0,1,0,0,0,2,2,2,0,0,1,2,0,2,1,2,1,0,3,0,2,1,2,0,1,2,0,1,0,2,2,2,2,5,0,2,0,2,0,0,0,1,2,3,1,1,0,0,1,2,0,1,0,0,1,1,1,0,1,0,1,2,4,1,0,0,3,4,1,2,1,2,2,2,1,0,0,1,0,2,4,1,1,2,1,1,2,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,2,0,2,1,0,2,1,1,1,0,1,0,1,1,0,1,2,1,2,0,1,2,1,1,2,4,0,2,0,2,0,1,2,0,3,1,2,1,1,1,1,2,2,1,2,0,0,0,0,2,2,1,0,0,1,4,1,2,0,0,2,2,3,2,0,0,1,1,1,0,1,1,0,0,1,4,2,1,0,2,2,1,1,0,3,1,2,1,1,2,1,2,5,2,4,2,1,0,0,0,1,1,0,1,0,1,2,1,1,2,2,0,1,1,1,0,1,1,0,1,1,1,1,0,3,2,2,0,2,0,0,1,0,1,3,1,2,3,1,0,0,0,1,0,5,1,0,1,3,0,1,0,0,1,0,2,2,1,0,2,0,0,2,1,1,1,2,1,1,2,3,0,1,0,1,2,2,0,2,1,1,1,0,0,2,1,2,0,1,1,1,1,0,2,1,1,1,4,1,0,2,3,2,1,2,0,0,0,0,1,2,1,0,1,0,3,1,0,1,2,1,0,2,0,2,0,0,1,1,2,1,1,2,1,1,0,0,0,1,1,0,1,1,0,0,2,1,0,0,2,1,1,0,2,0,0,1,0,0,0,0,1,1,0,1,1,0,1,2,0,0,1,1,1,0,0,1,1,1,2,3,0,2,1,1,1,0,2,0,2,2,1,1,0,0,1,0,3,0,1,1,1,0,1,0,0,2,1,0,3,2,0,1,0,0,0,1,2,2,0,1,1,1,0,1,3,0,1,1,3,0,0,4,3,1,0,0,1,2,2,2,0,1,0,2,3,1,0,0,0,2,0,2,1,0,1,0,1,0,1,0,1,2,1,3,2,0,2,0,1,0,2,1,2,1,1,2,0,0,3,3,1,0,2,0,2,0,0,0,4,2,0,2,2,0]},{"counters":[0,1,3,5,0,1,0,1,2,1,2,1,0,0,1,0,4,1,3,1,1,2,0,0,1,1,1,2,0,4,2,0,1,2,0,3,0,0,0,1,0,0,1,2,2,0,0,0,0,1,0,0,0,1,1,0,0,2,1,0,0,0,1,0,1,0,2,1,1,0,0,1,0,0,1,1,2,1,0,3,1,0,1,1,3,0,0,0,0,0,0,0,0,1,1,0,3,2,1,2,1,0,0,2,0,0,3,1,1,3,0,0,0,0,0,1,0,2,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,1,3,2,1,2,0,1,0,1,1,0,2,2,2,0,5,0,1,3,1,0,1,3,1,0,0,0,1,0,2,0,1,0,1,0,3,0,0,0,2,3,3,2,0,1,0,2,1,1,3,2,0,1,1,1,2,1,0,2,0,1,1,2,2,0,0,0,0,1,1,0,1,1,1,0,1,0,0,0,0,0,1,1,2,1,3,2,2,0,0,0,3,0,2,1,1,1,1,2,0,0,1,1,1,2,0,0,0,1,0,1,2,1,2,0,0,0,2,1,3,0,3,1,1,0,3,2,2,1,1,0,3,0,2,1,1,3,0,1,1,0,2,1,0,0,0,1,0,0,0,0,1,3,0,2,0,0,4,0,0,1,3,0,0,0,0,1,1,1,0,0,0,1,0,1,2,1,1,1,1,0,2,0,2,2,0,1,1,2,0,0,0,1,2,0,0,3,1,2,1,4,2,0,3,1,0,2,0,0,1,2,3,1,0,1,1,0,2,0,1,0,0,0,1,0,0,2,1,0,1,0,2,0,1,1,3,1,1,1,1,2,1,1,0,0,1,1,1,1,0,0,1,2,1,1,0,1,1,2,0,1,1,2,2,1,1,1,1,2,1,1,1,0,1,2,1,1,2,1,0,1,1,1,0,1,0,0,1,2,0,1,0,0,1,0,0,0,0,2,0,1,3,2,0,1,1,1,0,2,0,0,4,0,1,0,0,1,2,0,0,0,0,1,2,1,0,2,3,0,0,1,1,0,1,2,0,1,2,4,2,1,1,4,1,1,0,0,0,0,3,1,0,0,1,3,0,2,1,1,3,0,1,1,0,1,3,0,0,0,2,0,1,2,0,3,0,1,0,1,0,1,0,1,0,2,3,2,2,0,1,0,2,1,0,1,1,1,2,0,1,1,0,0,2,1,0,0,2,3,2,1,2,0,3,1,2,0,0,0,0,1,0,2,2,1,0,1,2,5,0,0,3,2,2,1,0,1,0,1,0,1,0,0,3,1,1,0,0,0,0,2,1,1,1,0,1,1,1,2,1,2,2,1,2,0,0,1,2,1,1,5,0,0,5,2,1,1,1,0,0,0,0,1,1,1,1,0,2,2,1,1,0,1,0,0,1,1,1,1,0,0,2,2,2,1,1,0,0,0,1,0,2,1,0,3,0,0,1,1,0,0,0,1,2,2,3,2,0,0,0,1,1,1,0,0,1,1,2,1,0,1,0,1,0,0,0,1,1,1,0,1,1,0,2,1,1,0,1,0,0,1,0,2,1,0,1,1,1,0,1,0,0,2,1,0,0,1,0,2,0,0,0,0,2,0,0,1,0,2,2,0,2,0,1,0,0,1,1,1,0,2,0,1,1,3,0,0,0,0,4,1,1,1,1,2,0,1,1,1,2,0,5,0,1,3,2,0,1,0,1,0,1,1,3,2,1,2,0,0,1,3,1,1,0,0,0,3,1,1,0,0,1,2,0,4,0,0,1,2,0,0,1,1,2,1,1,1,0,1,0,1,2,1,2,0,0,3,2,1,2,2,0,0,2,1,0,0,0,4,0,1,3,1,2,0,0,0,3,0,2,0,1,0,0,1,0,1,2,0,2,0,2,2,0,1,1,1,1,0,0,0,1,1,0,2,1,1,4,0,0,2,1,1,1,2,2,2,0,0,3,1,0,1,3,1,1,1,2,2,0,0,0,0,0,1,1,2,0,1,0,0,0,2,0,3,1,1,0,1,0,3,1,0,2,0,2,2,0,0,1,0,0,1,1,0,0,0,1,2,1,2,0,0,0,2,1,2,1,0,0,1,0,0,0,0,1,1,0,0,2,0,0,0,2,2,1,0,0,1,1,2,1,2,2,3,3,2,2,1,1,0,2,1,2,0,1,1,2,0,1,1,1,2,0,1,1,1,0,1,1,0,1,0,1,1,1,0,1,3,2,1,1,1,2,1,0,1,1,0,0,0,0,0,1,1,1,2,0,0,1,3,0,2,1,1,0,1,0,1,0,0,1,2,0,0,0,3,0,1,1,2,0,0,2,1,0,0,2,2,2,0,0,1,0,0,2,1,0,0,1,0,3,1,2,1,3,1,1,2,1,2,3,2,1,0,0,1,0,1,3,2,1,0,1,1,1,4,2,2,4,1,0,2,0,2,1,1,3,1,0,1,2,0,2,1,1,1,0,2,1,1,1,0,3,2,3,0,0,1,0,1,3,0,0,2,0,2,0,1,1,0,2,0,3,1,1,0,0,3,0,0,0,0,1,2,0,1,0,1,0,1,2,0,1,1,1,2,2,1,0,1,0,0,2,1,3,2,2,0,2,0,1,1,3,1,0,3,1,2,2,2,1,2,0,0,1,2,0,3,0,1,0,0,0,2,0,2,1,2,2,3,1,3,3,0,0,1,3,0,2,0,0,0,0,0,0,2,1,1,2,2,1,2,1,0,2,1,3,0,1,0,0,1,4,0,2,0,0,2,1,1,1,0,0,0,2,1,1,0,0,3,5,1,1,2,2,0,2,0,0,0,1,0,1,1,3,1,1,1,1,2,0,1,1,2,1,2,1,2,1,0,0,0,1,2,1,1,2,0,1,3,1,0,1,0,1,0,2,0,0,2,0,2,1,1,1,0,2,1,1,1,1,1,1,0,1,0,1,2,1,1,1,1,2,0,0,1,0,1,0,0,1,0,2,2,2,0,0,0,0,2,2,0,1,0,0,0,1,1,0,0,1,1,1,0,0,1,2,3,1,0,0,0,2,2,1,1,1,2,1,1,1,1,2,1,0,0,1,1,1,0,1,0,1,2,1,1,1,1,0,2,0,2,1,2,0,0,1,2,2,2,2,3,0,0,2,1,0,0,2,0,1,2,0,1,5,0,1,1,1,3,1,1,3,0,2,0,1,3,0,2,0,1,1,0,6,0,1,0,1,0,1,1,0,0,1,2,0,1,3,2,1,1,0,0,0,1,1,1,1,0,1,2,0,2,0,0,3,0,3,1,1,1,2,0,3,0,2,0,0,1,2,1,0,0,0,1,2,1,2,0,0,1,1,0,2,2,0,2,2,2,1,0,1,3,0,1,0,2,1,2,1,0,0,0,1,0,1,2,0,0,1,1,0,0,2,1,0,1,0,1,1,0,0,3,1,0,1,0,4,2,0,0,2,2,4,3,1,0,2,2,0,1,3,1,0,0,1,0,0,1,1,0,0,0,0,1,1,3,0,3,2,4,0,3,0,0,0,1,0,1,1,1,2,0,1,0,1,1,1,0,2,1,1,1,1,1,2,1,2,2,2,0,3,1,0,1,0,0,3,1,1,1,1,1,1,1,1,2,1,1,5,2,0,3,1,1,1,2,2,0,1,0,1,1,2,0,1,0,0,1,1,1,1,2,1,3,1,1,4,3,4,1,1,1,2,1,0,0,1,0,2,0,1,0,0,1,1,1,0,2,1,0,0,0,1,1,0,0,0,2,1,0,0,0,0,0,0,1,0,1,1,1,0,2,1,1,2,1,3,1,2,1,0,0,1,1,0,2,0,1,1,4,1,1,1,2,3,1,2,0,1,0,5,1,1,0,2,1,1,1,0,2,3,0,0,0,0,2,2,1,1,0,2,0,1,1,1,2,0,0,1,1,1,0,2,2,1,1,0,2,2,3,0,1,1,3,0,2,0,2,0,1,2,0,1,1,0,0,0,0,0,0,1,1,4,0,1,4,1,1,2,1,1,1,0,1,1,3,0,1,4,1,1,1,0,0,2,1,1,0,1,0,1,1,3,1,3,0,2,0,1,1,1,1,0,0,2,1,0,1,1,0,2,3,1,2,1,0,0,1,1,0,1,2,0,0,3,1,2,0,2,1,1,2,2,0,0,3,1,1,0,1,1,1,0,0,1,1,0,1,0,0,0,2,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,2,0,1,0,2,2,0,1,3,0,1,0,2,0,3,2,1,1,1,4,0,0,0,1,0,0,4,2,0,3,1,0,0,1,3,1,0,1,2,1,1,1,1,1,3,2,0,2,0,0,1,0,1,2,0,0,3,4,0,1,0,1,1,1,1,1,0,0,0,0,1,2,1,0,1,1,2,0,3,0,0,2,0,0,0,0,0,1,1,0,1,2,1,1,1,0,1,0,1,1,0,1,2,0,1,0,0,0,1,0,1,1,3,1,1,1,2,1,0,2,0,1,2,2,0,0,2,1,1,1,2,0,2,2,1,1,0,1,0,1,0,2,1,1,1,0,1,2,0,0,2,2,2,2,1,3,0,0,2,1,0,0,1]}]},"null_count":0,"last_update_version":397952053199503360}},"count":1999,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_easy_stats_t2.json b/cmd/explaintest/s/explain_easy_stats_t2.json deleted file mode 100644 index 79c0db6e7673d..0000000000000 --- a/cmd/explaintest/s/explain_easy_stats_t2.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"t2","columns":{"c2":{"histogram":{"ndv":1985,"buckets":[{"count":7,"lower_bound":"LTIxNDY2NzAyNjQ=","upper_bound":"LTIxMzc0MjM2NjM=","repeats":1},{"count":13,"lower_bound":"LTIxMzUyODU3NTg=","upper_bound":"LTIxMjM0MDQ4ODk=","repeats":1},{"count":19,"lower_bound":"LTIxMjEzMjQ0NjU=","upper_bound":"LTIxMTgxOTg4Njc=","repeats":1},{"count":25,"lower_bound":"LTIxMTQ4NjY3Njg=","upper_bound":"LTIxMTAzNDgwNDQ=","repeats":1},{"count":33,"lower_bound":"LTIxMTAwMDAyNTQ=","upper_bound":"LTIwOTk1NjY4NDg=","repeats":1},{"count":41,"lower_bound":"LTIwOTg1MTY4NzA=","upper_bound":"LTIwODUwOTAzOTU=","repeats":1},{"count":49,"lower_bound":"LTIwODM4NzU3MDc=","upper_bound":"LTIwNjkwNzg3NTY=","repeats":1},{"count":57,"lower_bound":"LTIwNjYzODk2NDg=","upper_bound":"LTIwNTE0NTY2NDM=","repeats":1},{"count":65,"lower_bound":"LTIwNDk2OTg2MDc=","upper_bound":"LTIwMjIwOTQ5NjA=","repeats":1},{"count":73,"lower_bound":"LTIwMTgzMjQxNjQ=","upper_bound":"LTE5OTI0OTc4NTc=","repeats":1},{"count":81,"lower_bound":"LTE5OTE5NjQyNzg=","upper_bound":"LTE5ODY0NDcxNzQ=","repeats":1},{"count":89,"lower_bound":"LTE5ODUyNTIwOTE=","upper_bound":"LTE5NjE4MTczMzE=","repeats":1},{"count":97,"lower_bound":"LTE5NjExNTA5NTM=","upper_bound":"LTE5NDYzMzM4MzI=","repeats":1},{"count":105,"lower_bound":"LTE5NDUwNDA5NzA=","upper_bound":"LTE5Mjg1NTQ3MDU=","repeats":1},{"count":113,"lower_bound":"LTE5MjUxMTQ4MjI=","upper_bound":"LTE5MDM1ODE3MTY=","repeats":1},{"count":121,"lower_bound":"LTE5MDM0OTQ1MjY=","upper_bound":"LTE5MDA4MjUwNzU=","repeats":1},{"count":129,"lower_bound":"LTE4OTgyNjk3OTQ=","upper_bound":"LTE4ODk0Njc3OTc=","repeats":1},{"count":136,"lower_bound":"LTE4ODgxODQ4NTY=","upper_bound":"LTE4NzE3MzMxNDk=","repeats":1},{"count":142,"lower_bound":"LTE4NjkyNDQyMDg=","upper_bound":"LTE4NjE2MTY2Njg=","repeats":1},{"count":148,"lower_bound":"LTE4NTc4OTAzMzE=","upper_bound":"LTE4NTAwNTc2NjM=","repeats":1},{"count":154,"lower_bound":"LTE4NDEzNzQ0ODM=","upper_bound":"LTE4MzEwMDA0NjU=","repeats":1},{"count":160,"lower_bound":"LTE4MzAwOTcyMDQ=","upper_bound":"LTE4MjIxNDEzMTg=","repeats":1},{"count":168,"lower_bound":"LTE4MTk4NTk2NTQ=","upper_bound":"LTE3ODIzMDY5MzY=","repeats":1},{"count":176,"lower_bound":"LTE3NzkyMjY0OTk=","upper_bound":"LTE3NTk4NTM0NTk=","repeats":1},{"count":184,"lower_bound":"LTE3NTk2NzI5NjY=","upper_bound":"LTE3NDI3MzU2NjE=","repeats":1},{"count":192,"lower_bound":"LTE3MzYyNzQ2NDc=","upper_bound":"LTE3MTkwMzQ3OTI=","repeats":1},{"count":200,"lower_bound":"LTE3MTcyNjY2Mzk=","upper_bound":"LTE3MDk1ODQ3NTI=","repeats":1},{"count":208,"lower_bound":"LTE2OTI4MzA4ODc=","upper_bound":"LTE2ODE1MjU5NjI=","repeats":1},{"count":216,"lower_bound":"LTE2Nzk3Nzg3MDM=","upper_bound":"LTE2NzAzOTY0NjM=","repeats":1},{"count":224,"lower_bound":"LTE2NjgwOTIzOTE=","upper_bound":"LTE2NDIxMjk4MjY=","repeats":1},{"count":232,"lower_bound":"LTE2Mjk4ODA3NDE=","upper_bound":"LTE2MjEwNjMwODM=","repeats":1},{"count":240,"lower_bound":"LTE2MTYzMTE5MzA=","upper_bound":"LTE2MTA5MjI0NDk=","repeats":1},{"count":248,"lower_bound":"LTE2MDg1OTQ3NDY=","upper_bound":"LTE2MDQ5MzY3MjI=","repeats":1},{"count":256,"lower_bound":"LTE2MDI5MDE4NDY=","upper_bound":"LTE1ODU4MDkzNzc=","repeats":1},{"count":264,"lower_bound":"LTE1ODMyOTg3NzE=","upper_bound":"LTE1NzAwNzkyNzk=","repeats":1},{"count":271,"lower_bound":"LTE1NjY1Njg3MTA=","upper_bound":"LTE1NjMxNDIzNzE=","repeats":1},{"count":277,"lower_bound":"LTE1NTMwODU5ODU=","upper_bound":"LTE1NDU3NzA0NTQ=","repeats":1},{"count":283,"lower_bound":"LTE1Mzk5MTM5MjI=","upper_bound":"LTE1MzU0MTQ2NTQ=","repeats":1},{"count":289,"lower_bound":"LTE1MTY3ODY1ODk=","upper_bound":"LTE0OTY4NDEwMTQ=","repeats":1},{"count":297,"lower_bound":"LTE0OTIyODQ5OTI=","upper_bound":"LTE0ODY3OTIzNjM=","repeats":1},{"count":305,"lower_bound":"LTE0ODYzMDM1MTQ=","upper_bound":"LTE0NzAwODA2NjY=","repeats":1},{"count":313,"lower_bound":"LTE0Njg3MDA3OTU=","upper_bound":"LTE0NjA4MzM1MTU=","repeats":1},{"count":321,"lower_bound":"LTE0NTgwNTE0OTI=","upper_bound":"LTE0NDc4NjU5NjE=","repeats":1},{"count":329,"lower_bound":"LTE0NDE2MDQ4ODY=","upper_bound":"LTE0Mzg0ODI1NzQ=","repeats":1},{"count":337,"lower_bound":"LTE0Mjk4MDIxODA=","upper_bound":"LTE0MTIzMTc2NTE=","repeats":1},{"count":345,"lower_bound":"LTE0MTExNzUwMjY=","upper_bound":"LTEzOTM1NjkwODY=","repeats":1},{"count":353,"lower_bound":"LTEzOTIxNjcxNTU=","upper_bound":"LTEzNzY1MzYxMTI=","repeats":1},{"count":361,"lower_bound":"LTEzNjEzODk1NjQ=","upper_bound":"LTEzMzQ2OTM1MDI=","repeats":1},{"count":369,"lower_bound":"LTEzMjk5NjQwOTI=","upper_bound":"LTEzMTc2MDgyMzI=","repeats":1},{"count":377,"lower_bound":"LTEzMTU1MDQxMjQ=","upper_bound":"LTEyOTYxNTkxMzI=","repeats":1},{"count":385,"lower_bound":"LTEyNzU4MDY0NTQ=","upper_bound":"LTEyNTg3NTg0NTQ=","repeats":1},{"count":393,"lower_bound":"LTEyNTc3MDEyMTg=","upper_bound":"LTEyNTAzMjU1NTg=","repeats":1},{"count":400,"lower_bound":"LTEyMzkxMDU2NzU=","upper_bound":"LTEyMjE0Mjg5NDU=","repeats":1},{"count":406,"lower_bound":"LTEyMTYxMjUyOTA=","upper_bound":"LTEyMDE0NDIwODI=","repeats":1},{"count":412,"lower_bound":"LTExOTYwNTc4NTk=","upper_bound":"LTExODc4NzUzODU=","repeats":1},{"count":418,"lower_bound":"LTExODczMTMxODE=","upper_bound":"LTExNjA4MDA0OTM=","repeats":1},{"count":424,"lower_bound":"LTExNDA4NDE1NTA=","upper_bound":"LTExMjgxMDI1MzE=","repeats":1},{"count":432,"lower_bound":"LTExMjY4MTUyMTU=","upper_bound":"LTExMjM4NDA4ODY=","repeats":1},{"count":440,"lower_bound":"LTExMTg2OTQ4MTM=","upper_bound":"LTEwOTA1MjQ1Mjk=","repeats":1},{"count":448,"lower_bound":"LTEwODg5OTA2NzU=","upper_bound":"LTEwNzQ0NDk5Mjg=","repeats":1},{"count":456,"lower_bound":"LTEwNDcyMzQwMzQ=","upper_bound":"LTEwNDQ4ODg2NDg=","repeats":1},{"count":464,"lower_bound":"LTEwNDQ3MDg5Nzc=","upper_bound":"LTEwMjc0MDQzMjc=","repeats":1},{"count":472,"lower_bound":"LTEwMjIwNjA5ODY=","upper_bound":"LTEwMTE5MzU5MTY=","repeats":1},{"count":480,"lower_bound":"LTEwMDkxNjQyNjE=","upper_bound":"LTk5NDU1MTQyMA==","repeats":1},{"count":488,"lower_bound":"LTk5MDc2MjA3MA==","upper_bound":"LTk4MjQ4MDk4NA==","repeats":1},{"count":496,"lower_bound":"LTk4MjQzNDM5MQ==","upper_bound":"LTk2MjA0MjAxNg==","repeats":1},{"count":504,"lower_bound":"LTk2MTUzNDA3Ng==","upper_bound":"LTk1Nzk0MjY3OA==","repeats":1},{"count":512,"lower_bound":"LTk1MDk1MTYxNg==","upper_bound":"LTk0MjM4MjU4NA==","repeats":1},{"count":520,"lower_bound":"LTkzNjYzODcwOQ==","upper_bound":"LTkxMDg2NzUyOQ==","repeats":1},{"count":528,"lower_bound":"LTkxMDI5NjY0OQ==","upper_bound":"LTg5NzIyNjk5MQ==","repeats":1},{"count":535,"lower_bound":"LTg5NjM2MjA5Nw==","upper_bound":"LTg3NDQzMzg3MQ==","repeats":1},{"count":541,"lower_bound":"LTg3MjU1OTk1Mg==","upper_bound":"LTg2NjMwMzkxNg==","repeats":1},{"count":547,"lower_bound":"LTg2MzgyNTA5Mg==","upper_bound":"LTg1NDA2NTIwMA==","repeats":1},{"count":553,"lower_bound":"LTg0OTMwNTI1NQ==","upper_bound":"LTgzNjc3MDcwMQ==","repeats":1},{"count":559,"lower_bound":"LTgzNDYxMTkyMg==","upper_bound":"LTgyMjMxNjQ0NQ==","repeats":1},{"count":567,"lower_bound":"LTgxNzc2MjMyMg==","upper_bound":"LTgwNDEyNjAzMg==","repeats":1},{"count":575,"lower_bound":"LTgwMDQ5ODA0MQ==","upper_bound":"LTc3NzUxMjg3OQ==","repeats":1},{"count":583,"lower_bound":"LTc3NjM5MTIyNQ==","upper_bound":"LTc2MzgwODU0OQ==","repeats":1},{"count":591,"lower_bound":"LTc2MjkxMzkzMA==","upper_bound":"LTc1MzM2OTM5MQ==","repeats":1},{"count":599,"lower_bound":"LTc1MjIwNDM3NA==","upper_bound":"LTc0NDUzNzk1Nw==","repeats":1},{"count":607,"lower_bound":"LTczOTgyODc3OQ==","upper_bound":"LTczMDExNDQ4Mg==","repeats":1},{"count":615,"lower_bound":"LTcyMjcwMzQ1OQ==","upper_bound":"LTcwMDA3NTc5OQ==","repeats":1},{"count":623,"lower_bound":"LTY5NDE2MzgyNQ==","upper_bound":"LTY4MDE1ODgwNw==","repeats":1},{"count":631,"lower_bound":"LTY1ODc2NTczMw==","upper_bound":"LTY1MTY1MTA0OQ==","repeats":1},{"count":639,"lower_bound":"LTYzOTc2OTMyOA==","upper_bound":"LTYzMzkzMzUyMQ==","repeats":1},{"count":647,"lower_bound":"LTYzMzIzODc1OQ==","upper_bound":"LTYwOTI2Nzc3MQ==","repeats":1},{"count":655,"lower_bound":"LTYwMjI5MDc1OA==","upper_bound":"LTU3MDEyMDI5Ng==","repeats":1},{"count":662,"lower_bound":"LTU2Mzk1Mzk1Nw==","upper_bound":"LTU1NDEyNzY2OQ==","repeats":1},{"count":668,"lower_bound":"LTU1NDA5NzMxMQ==","upper_bound":"LTU0NzI4ODU0Mg==","repeats":1},{"count":674,"lower_bound":"LTU0NTkxMDYyNA==","upper_bound":"LTU0MjU5ODU0Mw==","repeats":1},{"count":680,"lower_bound":"LTU0MDIyMTE4Nw==","upper_bound":"LTUyODgzMTE4MQ==","repeats":1},{"count":686,"lower_bound":"LTUyNzkwMTEzNw==","upper_bound":"LTUyMjI5OTM1Ng==","repeats":1},{"count":694,"lower_bound":"LTUyMTQyMjEzNA==","upper_bound":"LTUwMzgzMDY1NA==","repeats":1},{"count":702,"lower_bound":"LTUwMjc1MTc1MQ==","upper_bound":"LTQ4OTUxNzk1MA==","repeats":1},{"count":710,"lower_bound":"LTQ4NDkwMDYyNQ==","upper_bound":"LTQ2NTY1NjQxNQ==","repeats":1},{"count":718,"lower_bound":"LTQ2NDE4NjAyMQ==","upper_bound":"LTQ2MjM0NjgyMQ==","repeats":1},{"count":726,"lower_bound":"LTQ1MzgyNzA5Mw==","upper_bound":"LTQ0OTM5MTEwMg==","repeats":1},{"count":734,"lower_bound":"LTQ0NDM1NDcxMA==","upper_bound":"LTQzMjI3NjMyOA==","repeats":1},{"count":742,"lower_bound":"LTQwOTAwMDcwMg==","upper_bound":"LTQwNDg1NTI4MA==","repeats":1},{"count":750,"lower_bound":"LTQwNDEzMjIwOA==","upper_bound":"LTM5NTQ4MzczMw==","repeats":1},{"count":758,"lower_bound":"LTM4OTAyMjk0OQ==","upper_bound":"LTM4NTU3NTc4NQ==","repeats":1},{"count":766,"lower_bound":"LTM3OTM2NDY2MQ==","upper_bound":"LTM2MTAxNDU0OA==","repeats":1},{"count":774,"lower_bound":"LTM1OTU2ODA5Ng==","upper_bound":"LTM0NjAzNjc5OA==","repeats":1},{"count":782,"lower_bound":"LTM0NTU4MzU0Mw==","upper_bound":"LTMzODcwMDAyNA==","repeats":1},{"count":790,"lower_bound":"LTMzNjQ1NjY2Nw==","upper_bound":"LTMyMjQwNDg3Mw==","repeats":1},{"count":797,"lower_bound":"LTMyMjA4NDcwMg==","upper_bound":"LTMxNTg4NTE1OA==","repeats":1},{"count":803,"lower_bound":"LTMxMTQ2NTQwMg==","upper_bound":"LTMwNTM3NTI0NQ==","repeats":1},{"count":809,"lower_bound":"LTI5OTcwNzMwNw==","upper_bound":"LTI5ODc0NDYxMQ==","repeats":1},{"count":815,"lower_bound":"LTI5ODE3NDg5Ng==","upper_bound":"LTI5MDE0MzY2OQ==","repeats":1},{"count":821,"lower_bound":"LTI4MTExMjQwMw==","upper_bound":"LTI3NTY0MjI3Mw==","repeats":1},{"count":829,"lower_bound":"LTI3NDg4MzI2OQ==","upper_bound":"LTI1MjcyMTkwOQ==","repeats":1},{"count":837,"lower_bound":"LTI1MDgyNTI4Ng==","upper_bound":"LTI0MDM5MDQ1Ng==","repeats":1},{"count":845,"lower_bound":"LTIyOTM2NDY3NA==","upper_bound":"LTIyMDQ3ODkyOQ==","repeats":1},{"count":853,"lower_bound":"LTIyMDE1OTM1Mg==","upper_bound":"LTIwNDgyODY5Mg==","repeats":1},{"count":861,"lower_bound":"LTE5MDY4NjQxMA==","upper_bound":"LTE3MDcyMTc3Mw==","repeats":1},{"count":869,"lower_bound":"LTE1Mzc1NzU5OA==","upper_bound":"LTEzMTYxMjIyNA==","repeats":1},{"count":877,"lower_bound":"LTEyNjcxMjczMg==","upper_bound":"LTExNjUyNjY1Mg==","repeats":1},{"count":885,"lower_bound":"LTExMjIzNTY4OQ==","upper_bound":"LTEwNTcxMzU4Mw==","repeats":1},{"count":893,"lower_bound":"LTEwNDg2OTU5Nw==","upper_bound":"LTkxNTk3MDA3","repeats":1},{"count":901,"lower_bound":"LTkwNTI4ODg2","upper_bound":"LTgxODI5MTgz","repeats":1},{"count":909,"lower_bound":"LTc2MTk4MzUx","upper_bound":"LTU5ODQ2NzEw","repeats":1},{"count":917,"lower_bound":"LTU3NDM1NTA0","upper_bound":"LTQ1NTY3NDYx","repeats":1},{"count":925,"lower_bound":"LTQyNzA2MzE1","upper_bound":"LTIyNTAwNDM2","repeats":1},{"count":932,"lower_bound":"LTE4MzE4MTE1","upper_bound":"LTg2NzE5NzM=","repeats":1},{"count":938,"lower_bound":"LTEwMjU4Njg=","upper_bound":"MTUzMDQ1OTk=","repeats":1},{"count":944,"lower_bound":"MTczODI0ODY=","upper_bound":"MjIyMDI3OTc=","repeats":1},{"count":950,"lower_bound":"MjQ3MjA5MDU=","upper_bound":"Mjk5NjkwOTc=","repeats":1},{"count":956,"lower_bound":"MzU1NTk1NDg=","upper_bound":"Mzk0ODg1ODM=","repeats":1},{"count":964,"lower_bound":"NDI0NjkzMDc=","upper_bound":"NjQ5ODE1NDA=","repeats":1},{"count":972,"lower_bound":"NzcxNDc0MDY=","upper_bound":"ODY1NDg4NzU=","repeats":1},{"count":980,"lower_bound":"ODg5Njk4Mjk=","upper_bound":"MTA5Nzg5OTk4","repeats":1},{"count":988,"lower_bound":"MTE1ODc2OTIz","upper_bound":"MTI5MzEwODM3","repeats":1},{"count":996,"lower_bound":"MTI5ODM2MTk0","upper_bound":"MTM3NjcxMzgw","repeats":1},{"count":1004,"lower_bound":"MTQwMDAyMzY0","upper_bound":"MTUzNzUyMzg3","repeats":1},{"count":1012,"lower_bound":"MTU3NzM0NTkx","upper_bound":"MTY5Mjc0MTY4","repeats":1},{"count":1020,"lower_bound":"MTcxMjU0MjE3","upper_bound":"MTg0MzI0NDc4","repeats":1},{"count":1028,"lower_bound":"MTg4NzE3NzQ4","upper_bound":"MjAyODE1NDY5","repeats":1},{"count":1036,"lower_bound":"MjAzMzI2MTEy","upper_bound":"MjE3NTU2OTk1","repeats":1},{"count":1044,"lower_bound":"MjE3OTk0OTE4","upper_bound":"MjMxMjUxMDM4","repeats":1},{"count":1052,"lower_bound":"MjMzNTg5MTEy","upper_bound":"Mjc1MTA5MTk4","repeats":1},{"count":1059,"lower_bound":"Mjc5MDEzNjE2","upper_bound":"Mjk1NTM2ODk2","repeats":1},{"count":1065,"lower_bound":"MzAwMDQyMjc4","upper_bound":"MzA3ODk3MTYz","repeats":1},{"count":1071,"lower_bound":"MzEzNTc1OTM3","upper_bound":"MzE5MTkwNTI4","repeats":1},{"count":1077,"lower_bound":"MzIxMjE5ODA1","upper_bound":"MzIxNjE1ODk5","repeats":1},{"count":1083,"lower_bound":"MzI4NTczODM3","upper_bound":"MzM1ODUzOTMx","repeats":1},{"count":1091,"lower_bound":"MzM4ODAwNzYx","upper_bound":"MzQxNDEwODI1","repeats":1},{"count":1099,"lower_bound":"MzQ3NDM2MTMz","upper_bound":"MzUxNzM1MTgx","repeats":1},{"count":1107,"lower_bound":"MzU1NjEzMzc0","upper_bound":"MzY1NDAyODAx","repeats":1},{"count":1115,"lower_bound":"MzY4NzYzNjg5","upper_bound":"Mzc4MTI5NjM3","repeats":1},{"count":1123,"lower_bound":"Mzg5NzQxNDE0","upper_bound":"Mzk5MzI1Nzkx","repeats":1},{"count":1131,"lower_bound":"NDAzNDMzMTA4","upper_bound":"NDE1NjI1OTA2","repeats":1},{"count":1139,"lower_bound":"NDE4MDk0NzU3","upper_bound":"NDMwMTQ5OTgw","repeats":1},{"count":1147,"lower_bound":"NDMyNTYyMTA3","upper_bound":"NDM2MDkwOTc5","repeats":1},{"count":1155,"lower_bound":"NDM3NTk0MDM1","upper_bound":"NDQ3NDc4OTAz","repeats":1},{"count":1163,"lower_bound":"NDQ4NjE4MTc1","upper_bound":"NDc4NjE4MDg0","repeats":1},{"count":1171,"lower_bound":"NDg0NTYxMzc1","upper_bound":"NTA1MDAxMDgz","repeats":1},{"count":1179,"lower_bound":"NTExMjIxNDkw","upper_bound":"NTE1Nzc1MjY2","repeats":1},{"count":1187,"lower_bound":"NTIwMjgyODA1","upper_bound":"NTI3OTczMTU2","repeats":1},{"count":1194,"lower_bound":"NTMxMzkxNzI2","upper_bound":"NTQ0NDE0MzQ2","repeats":1},{"count":1200,"lower_bound":"NTU3Mzg5MTIy","upper_bound":"NTYwMzI2NTk4","repeats":1},{"count":1206,"lower_bound":"NTYyNjIyNTkw","upper_bound":"NTcyMzU1MTUz","repeats":1},{"count":1212,"lower_bound":"NTc2MDE2NzQ5","upper_bound":"NTk0MzUzOTI1","repeats":1},{"count":1218,"lower_bound":"NTk3MjU1OTQz","upper_bound":"NTk5MzcwMTIy","repeats":1},{"count":1226,"lower_bound":"NjAwMTgzNjc3","upper_bound":"NjIwODMwNjY3","repeats":1},{"count":1234,"lower_bound":"NjIxNzYyNDE4","upper_bound":"NjMyMjEyMDAw","repeats":1},{"count":1242,"lower_bound":"NjM5OTE2MjY4","upper_bound":"NjQ1NzI1NjQy","repeats":1},{"count":1250,"lower_bound":"NjUwNzQ4OTgy","upper_bound":"NjcyOTkzMTc4","repeats":1},{"count":1258,"lower_bound":"NjczMDQ3Njcx","upper_bound":"Njk4MzgxODIz","repeats":1},{"count":1266,"lower_bound":"Njk4OTIwOTE1","upper_bound":"NzA5NDQ1ODQw","repeats":1},{"count":1274,"lower_bound":"NzEzNzkxNjA0","upper_bound":"NzI1MzQzNDk4","repeats":1},{"count":1282,"lower_bound":"NzMyMDkyNDgw","upper_bound":"NzQyOTU0NTMx","repeats":1},{"count":1290,"lower_bound":"NzQ5NTE3NTg1","upper_bound":"NzYzNzM5MDUx","repeats":1},{"count":1298,"lower_bound":"NzY2OTAxNTI4","upper_bound":"Nzc2NjA5ODUy","repeats":1},{"count":1306,"lower_bound":"Nzg1MTA5MTk1","upper_bound":"Nzk1MDA4Njc3","repeats":1},{"count":1314,"lower_bound":"Nzk2Mzc5MjQ1","upper_bound":"ODEyODI0MzMz","repeats":1},{"count":1322,"lower_bound":"ODEzMDU4ODky","upper_bound":"ODI0NTc2Mzc5","repeats":1},{"count":1329,"lower_bound":"ODI5NjUyOTY5","upper_bound":"ODM4MjUyNzgy","repeats":1},{"count":1335,"lower_bound":"ODM5MTgwMjky","upper_bound":"ODQ5MDA0NDA3","repeats":1},{"count":1341,"lower_bound":"ODUxNzY0NzM4","upper_bound":"ODYwODM1MjY3","repeats":1},{"count":1347,"lower_bound":"ODYzMDQzMDUw","upper_bound":"ODY1MjM3ODEz","repeats":1},{"count":1353,"lower_bound":"ODcxNDE2MjEw","upper_bound":"ODc0MDI4Nzk4","repeats":1},{"count":1361,"lower_bound":"ODgzOTcxMjY4","upper_bound":"ODk2MTgyMzg1","repeats":1},{"count":1369,"lower_bound":"ODk4MzE4Nzk3","upper_bound":"OTEwNTU5Njkw","repeats":1},{"count":1377,"lower_bound":"OTE1NDMzNzM1","upper_bound":"OTI1NzE5NzUx","repeats":1},{"count":1385,"lower_bound":"OTI3MjA5NDM4","upper_bound":"OTQ1ODg1ODIx","repeats":1},{"count":1393,"lower_bound":"OTQ3MjYyNzM2","upper_bound":"OTcyOTY0NTM4","repeats":1},{"count":1401,"lower_bound":"OTc4Nzg1NTMw","upper_bound":"OTg0MDgzNzY4","repeats":1},{"count":1409,"lower_bound":"OTg1NzQ5OTY5","upper_bound":"OTk0NTM1NjQ1","repeats":1},{"count":1417,"lower_bound":"MTAwMTQwNjMyNA==","upper_bound":"MTAxMTY2MzAwMQ==","repeats":1},{"count":1425,"lower_bound":"MTAxMjUxMDE2Mw==","upper_bound":"MTAxNTg1ODI5Mw==","repeats":1},{"count":1433,"lower_bound":"MTAxNjUyMjExNA==","upper_bound":"MTAyODU1ODcxOA==","repeats":1},{"count":1441,"lower_bound":"MTAyOTY5MjI0Mw==","upper_bound":"MTAzMjY2NzQ1Mw==","repeats":1},{"count":1449,"lower_bound":"MTAzNzI2NDczNQ==","upper_bound":"MTA0MzkyMTg1OQ==","repeats":1},{"count":1456,"lower_bound":"MTA0NDAwNDYwNA==","upper_bound":"MTA2OTg5MjUwMw==","repeats":1},{"count":1462,"lower_bound":"MTA3MTgyNDE2OA==","upper_bound":"MTA3OTgwOTc1NA==","repeats":1},{"count":1468,"lower_bound":"MTA3OTkxNzI1Mw==","upper_bound":"MTA4MzA5NjM4OA==","repeats":1},{"count":1474,"lower_bound":"MTA4NTA3MzE1OQ==","upper_bound":"MTEwMjI1NTczNA==","repeats":1},{"count":1480,"lower_bound":"MTExNDkyMjM3NA==","upper_bound":"MTEyNjAwODgzMg==","repeats":1},{"count":1488,"lower_bound":"MTEyNjg5MDU2OA==","upper_bound":"MTEzNTg1NTQ3MA==","repeats":1},{"count":1496,"lower_bound":"MTEzNjgyOTEyMg==","upper_bound":"MTE0MTA2MzA4OA==","repeats":1},{"count":1504,"lower_bound":"MTE0MzQzMTI1Mg==","upper_bound":"MTE0NTgxODkyOQ==","repeats":1},{"count":1512,"lower_bound":"MTE0NjQ2NTAwOA==","upper_bound":"MTE3MjU0NTU3Mw==","repeats":1},{"count":1520,"lower_bound":"MTE4NjQ5MTkwNw==","upper_bound":"MTIxNjI4OTE5OQ==","repeats":1},{"count":1528,"lower_bound":"MTIxOTQ4MDQxMg==","upper_bound":"MTIyMzMwODQ1MQ==","repeats":1},{"count":1536,"lower_bound":"MTIyODc4NzQyNw==","upper_bound":"MTIzNDEyMDA4Ng==","repeats":1},{"count":1544,"lower_bound":"MTIzNzk4ODQ5MA==","upper_bound":"MTI0NjAwNDYyNw==","repeats":1},{"count":1552,"lower_bound":"MTI0ODczNTE3Ng==","upper_bound":"MTI2MjIxNTk5Ng==","repeats":1},{"count":1560,"lower_bound":"MTI2MzY0NTMwNg==","upper_bound":"MTI4MDk2OTE2OQ==","repeats":1},{"count":1568,"lower_bound":"MTI4Mjg2NjcwMQ==","upper_bound":"MTI4NDYxNjg1Mg==","repeats":1},{"count":1576,"lower_bound":"MTI5Mjc3OTg5OQ==","upper_bound":"MTI5NjQzMTU0Mg==","repeats":1},{"count":1584,"lower_bound":"MTI5NzU1MjI1OA==","upper_bound":"MTMwNjQxMTA2Nw==","repeats":1},{"count":1591,"lower_bound":"MTMwNzUxNTE1Mw==","upper_bound":"MTMyNDkzODgzNA==","repeats":1},{"count":1597,"lower_bound":"MTMyNjY5NDM0Ng==","upper_bound":"MTMyODU2NzQ1MA==","repeats":1},{"count":1603,"lower_bound":"MTMzMzA4MjA0Nw==","upper_bound":"MTM0MjkzMTEyMg==","repeats":1},{"count":1609,"lower_bound":"MTM0Mjk0ODgyMg==","upper_bound":"MTM1NTI0NzkwMA==","repeats":1},{"count":1615,"lower_bound":"MTM2Mzk4OTkwMA==","upper_bound":"MTM3ODU5MTIxMA==","repeats":1},{"count":1623,"lower_bound":"MTM3OTE1NzYwMQ==","upper_bound":"MTM4NzQwMDA2OQ==","repeats":1},{"count":1631,"lower_bound":"MTM5MDcwMzQxMw==","upper_bound":"MTM5OTQ3NDk3MA==","repeats":1},{"count":1639,"lower_bound":"MTQwMjI2MDYzOA==","upper_bound":"MTQxODQ4MDE1OA==","repeats":1},{"count":1647,"lower_bound":"MTQyMDcxMDkyOQ==","upper_bound":"MTQzMDIyMjczMQ==","repeats":1},{"count":1655,"lower_bound":"MTQzMzQ0NzQyMg==","upper_bound":"MTQ0NTc2Njc1Mw==","repeats":1},{"count":1663,"lower_bound":"MTQ1NTcwNTM0OQ==","upper_bound":"MTQ2NDg3OTgxNA==","repeats":1},{"count":1671,"lower_bound":"MTQ2NTMxNTc2MA==","upper_bound":"MTQ3Mzk3MTc3Nw==","repeats":1},{"count":1679,"lower_bound":"MTQ4NDMyODUzNg==","upper_bound":"MTQ5MzgxMjA2Nw==","repeats":1},{"count":1687,"lower_bound":"MTQ5NzIyOTQ5Mw==","upper_bound":"MTUwMzcxNDU3NA==","repeats":1},{"count":1695,"lower_bound":"MTUwNTc0Nzk1OQ==","upper_bound":"MTUxMzQ4NjExMQ==","repeats":1},{"count":1703,"lower_bound":"MTUxNTIzMTY1NA==","upper_bound":"MTUzMjE1MzAxNQ==","repeats":1},{"count":1711,"lower_bound":"MTUzNjY0OTAxNA==","upper_bound":"MTU2MTQzMDY1OA==","repeats":1},{"count":1719,"lower_bound":"MTU2NDY0Mjc3Mg==","upper_bound":"MTU3NDE5OTkwOA==","repeats":1},{"count":1726,"lower_bound":"MTU4MjkzMjMyMw==","upper_bound":"MTU5MDk5MTIwMw==","repeats":1},{"count":1732,"lower_bound":"MTU5MTY1Mjg2OQ==","upper_bound":"MTY0MDE4MDA4NQ==","repeats":1},{"count":1738,"lower_bound":"MTY0MDUzMDI4Mw==","upper_bound":"MTY1MjQ1NDEwOQ==","repeats":1},{"count":1744,"lower_bound":"MTY1MzYxODAzOQ==","upper_bound":"MTY2MzI0MDY2NQ==","repeats":1},{"count":1750,"lower_bound":"MTY2NjE4NjU5Nw==","upper_bound":"MTY3MTE3MTQxMw==","repeats":1},{"count":1758,"lower_bound":"MTY3ODgzMTM4NA==","upper_bound":"MTY4NjE3MTAzMA==","repeats":1},{"count":1766,"lower_bound":"MTY5NjEwNzYyMQ==","upper_bound":"MTY5ODY4ODgzNA==","repeats":1},{"count":1774,"lower_bound":"MTcwOTE0NzM2NQ==","upper_bound":"MTcyMjE0NDMwOA==","repeats":1},{"count":1782,"lower_bound":"MTcyNzU0NDE1Nw==","upper_bound":"MTczMDI1Mzc2MQ==","repeats":1},{"count":1790,"lower_bound":"MTczMTgwNzMzMA==","upper_bound":"MTczNjM4MzE4NA==","repeats":1},{"count":1798,"lower_bound":"MTc1MzgzNjM5MA==","upper_bound":"MTc2MjgwOTQ5NA==","repeats":1},{"count":1806,"lower_bound":"MTc2NDUxODA0MA==","upper_bound":"MTc2ODc3NTU1MA==","repeats":1},{"count":1814,"lower_bound":"MTc3NzMzNDI0OA==","upper_bound":"MTc4NjU1NDU2NA==","repeats":1},{"count":1822,"lower_bound":"MTc4NjY2MjgwNg==","upper_bound":"MTc5MDc0OTQwNw==","repeats":1},{"count":1830,"lower_bound":"MTc5MjA3MjU4NA==","upper_bound":"MTgwODQ0NjA0MQ==","repeats":1},{"count":1838,"lower_bound":"MTgxODU5MzU5MQ==","upper_bound":"MTgyNTk1NzY4Mw==","repeats":1},{"count":1846,"lower_bound":"MTgyOTI2NDcxNg==","upper_bound":"MTg0NDE1NjgxOQ==","repeats":1},{"count":1853,"lower_bound":"MTg0OTA2NTAyMw==","upper_bound":"MTg2Mzk3NTk5Mg==","repeats":1},{"count":1859,"lower_bound":"MTg3MzE0Mzc4Mg==","upper_bound":"MTg3OTg0NDQ1Ng==","repeats":1},{"count":1865,"lower_bound":"MTg4ODI0MjY0NQ==","upper_bound":"MTg5NTkyMzQyNQ==","repeats":1},{"count":1871,"lower_bound":"MTg5Njc0MDc2NQ==","upper_bound":"MTkxMDk1MjU1NA==","repeats":1},{"count":1877,"lower_bound":"MTkyMjIwMzA1OA==","upper_bound":"MTkyNzEzNTAyNg==","repeats":1},{"count":1885,"lower_bound":"MTkyODc5NDk1Nw==","upper_bound":"MTk0OTU4MTA2Nw==","repeats":1},{"count":1893,"lower_bound":"MTk1Mjc1MDA0OQ==","upper_bound":"MTk1NTE2OTcxNA==","repeats":1},{"count":1901,"lower_bound":"MTk1ODMxMTIyMg==","upper_bound":"MTk2NzQyMTE0MA==","repeats":1},{"count":1909,"lower_bound":"MTk3NTcxMjMwOQ==","upper_bound":"MTk5NjEwMzg5Ng==","repeats":1},{"count":1917,"lower_bound":"MTk5OTg0NzQ1OQ==","upper_bound":"MjAxNTgwNzUwNA==","repeats":1},{"count":1925,"lower_bound":"MjAxNzE5MjYxMA==","upper_bound":"MjAyMjQ4NDIyOQ==","repeats":1},{"count":1933,"lower_bound":"MjAyNjg2ODkzMA==","upper_bound":"MjA0MzYxNzYyNA==","repeats":1},{"count":1941,"lower_bound":"MjA0NTkwMTgzOQ==","upper_bound":"MjA2MjU5MTA5Ng==","repeats":1},{"count":1949,"lower_bound":"MjA2NDU0OTExOA==","upper_bound":"MjA3MTQxOTAxMQ==","repeats":1},{"count":1957,"lower_bound":"MjA3MjQwNjY1Ng==","upper_bound":"MjA3ODgxNTcwNw==","repeats":1},{"count":1965,"lower_bound":"MjA4MjYzMDA1OA==","upper_bound":"MjEwNzM4MDQwMg==","repeats":1},{"count":1973,"lower_bound":"MjExMDgwNjMwMg==","upper_bound":"MjExNzcxMDA3NA==","repeats":1},{"count":1981,"lower_bound":"MjExODAwMjk5MA==","upper_bound":"MjEzOTM2NzYwMQ==","repeats":1},{"count":1985,"lower_bound":"MjE0MjQxNzg1Mw==","upper_bound":"MjE0NjI4NTE4NA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,1,1,0,1,3,0,2,3,2,2,1,0,0,4,0,1,0,4,1,2,1,1,1,0,3,2,3,0,1,0,4,1,1,0,1,1,1,2,3,1,3,2,0,1,2,1,0,0,0,1,1,0,1,0,1,0,1,2,1,1,0,3,3,0,0,4,0,2,5,2,1,1,0,2,1,0,0,4,0,0,1,1,1,2,2,3,2,5,0,3,1,4,2,1,0,0,1,2,0,0,1,1,1,0,2,0,0,1,1,2,1,3,3,1,0,0,2,0,2,0,1,0,0,0,1,2,2,1,1,0,1,1,1,1,1,1,1,0,1,2,0,0,0,0,0,0,0,1,0,0,2,4,1,2,1,2,0,1,2,0,2,3,1,1,1,0,0,0,0,1,1,2,0,2,2,3,0,0,0,1,0,0,0,0,1,1,3,2,1,0,1,2,0,0,2,0,0,1,2,1,0,1,2,1,1,0,0,1,2,1,1,2,0,2,1,2,0,1,1,1,1,1,0,1,1,0,0,0,2,2,2,0,2,4,1,1,1,1,1,0,1,1,1,1,1,2,4,0,0,0,0,2,1,1,0,1,1,0,0,0,0,3,0,0,1,0,0,1,0,0,1,0,1,1,0,0,0,1,1,0,0,1,0,0,4,1,1,3,1,3,0,2,1,4,0,0,1,0,2,0,1,1,0,1,1,2,0,1,1,1,0,0,0,0,1,0,0,2,0,1,1,2,2,0,2,0,0,1,0,1,0,0,1,1,0,0,0,0,2,1,1,1,0,1,1,2,1,0,0,2,2,1,1,1,2,3,3,0,0,2,1,0,0,1,1,1,2,2,0,1,3,0,1,0,1,3,1,3,1,1,0,1,0,1,0,0,1,1,0,1,0,1,0,3,1,1,1,0,0,1,2,2,1,0,1,1,1,1,2,1,0,1,0,1,0,0,1,2,2,0,2,1,1,0,0,1,1,0,2,1,1,6,2,1,3,0,0,0,3,0,1,1,0,0,1,2,0,0,2,1,0,0,0,2,0,0,1,4,2,1,1,2,0,2,0,2,2,0,0,0,0,1,1,3,0,1,3,1,2,0,1,0,1,1,0,1,0,1,0,0,0,0,2,0,0,1,1,0,2,1,1,1,0,1,1,0,2,0,1,1,0,0,3,0,0,2,0,1,0,3,0,1,2,1,0,1,3,1,1,0,2,0,0,1,1,1,2,0,1,2,1,4,1,1,2,2,1,0,1,0,1,0,1,0,0,0,2,1,1,0,1,3,0,2,1,0,1,1,3,1,0,0,1,0,1,3,0,0,1,1,1,1,0,1,0,0,0,2,0,1,1,0,1,0,0,0,1,1,0,1,1,1,3,2,1,0,1,1,2,1,1,0,1,0,1,0,2,1,0,1,0,0,1,2,3,0,1,1,0,1,1,1,1,0,2,0,3,0,0,0,2,0,0,1,1,3,1,0,1,0,1,0,2,1,1,0,1,0,0,2,0,4,1,1,2,0,0,1,1,0,0,1,0,1,0,2,0,0,1,1,2,1,1,2,1,1,0,2,1,0,0,1,2,3,0,1,1,1,1,1,0,2,2,0,0,1,0,1,2,3,0,2,1,1,0,0,1,0,2,1,1,0,1,0,3,0,3,1,0,1,0,3,3,2,2,1,0,2,1,3,2,0,3,1,1,0,0,2,2,2,0,0,0,0,1,0,0,1,1,2,0,2,2,0,0,1,0,0,1,1,0,0,2,1,0,0,1,0,1,0,1,0,2,1,0,0,1,0,1,1,0,1,0,2,0,2,1,1,2,2,1,0,2,0,0,0,2,0,1,0,0,1,0,0,0,5,0,1,1,1,3,1,0,1,0,2,1,0,1,2,3,0,2,2,1,2,0,0,0,0,1,1,1,0,1,0,0,0,0,1,3,2,0,0,2,2,1,0,1,1,2,1,3,0,2,2,1,1,0,0,1,0,1,1,0,0,1,0,1,2,0,0,1,2,1,1,0,2,1,0,1,0,1,2,0,0,2,0,0,1,0,0,0,1,1,1,0,1,1,1,1,3,0,1,1,2,1,0,0,1,3,1,0,1,1,0,1,2,0,1,1,1,2,2,0,3,0,2,1,0,0,0,1,0,1,0,1,2,1,2,3,1,1,0,1,0,1,2,0,1,3,1,2,0,0,0,3,0,2,1,0,0,1,0,4,1,3,1,2,1,1,1,0,1,1,0,1,4,1,2,2,0,0,2,0,3,3,1,1,1,0,0,0,1,1,3,0,1,1,2,0,0,1,0,0,1,0,1,2,0,2,1,1,1,3,1,0,1,2,0,2,1,1,3,0,2,1,0,0,1,0,1,0,1,0,1,1,2,0,0,0,1,1,1,0,0,1,1,2,0,2,2,2,0,1,0,0,1,2,0,1,0,0,0,0,0,1,1,0,1,2,0,2,0,2,0,1,2,1,1,0,0,2,0,0,0,1,1,2,0,0,2,1,3,1,0,0,1,0,0,2,0,2,2,0,3,1,3,2,0,3,1,0,0,0,0,2,2,1,0,3,0,0,4,0,0,0,0,0,1,0,1,0,1,0,1,4,2,2,1,1,1,3,0,0,0,2,0,0,1,2,0,1,1,1,0,0,1,5,3,1,0,1,1,1,2,0,0,0,0,1,1,2,0,2,0,1,3,1,1,1,2,3,0,0,0,1,0,1,2,0,0,1,0,3,2,2,2,0,2,2,1,0,1,2,1,1,1,0,0,2,0,2,2,0,1,1,0,0,1,2,0,0,1,0,2,0,1,1,2,1,1,3,0,1,2,0,0,2,0,0,0,1,3,3,0,1,1,1,1,2,2,0,1,0,1,2,0,2,2,1,2,2,1,0,1,2,3,3,1,2,1,1,2,0,1,1,1,1,1,3,3,1,1,2,1,2,0,1,1,0,1,2,1,0,2,1,2,3,1,0,2,1,2,1,2,1,1,2,1,5,1,1,1,1,0,1,1,1,1,3,1,2,1,2,0,0,1,1,1,4,2,0,0,2,0,0,2,0,0,0,1,2,2,0,0,1,1,1,0,0,1,1,2,0,1,0,0,1,2,0,1,2,0,2,0,1,0,1,0,1,0,1,1,0,0,1,0,0,2,2,0,0,0,2,1,1,0,2,0,1,0,0,2,0,1,2,2,2,2,3,1,3,1,1,0,0,0,1,1,2,0,1,0,1,1,0,2,1,3,1,2,0,0,0,0,2,1,0,0,1,1,0,1,0,1,0,1,0,0,2,3,0,0,0,0,1,2,0,0,2,1,1,1,1,0,1,0,2,1,2,0,0,1,1,1,0,1,0,0,0,1,1,0,1,1,0,0,0,1,2,4,0,1,1,1,2,0,0,0,0,1,1,0,0,0,1,1,0,1,0,2,3,2,0,1,0,0,3,0,0,1,0,0,1,0,1,0,1,2,0,0,0,0,1,2,1,1,0,2,1,2,5,0,1,1,1,2,1,1,2,0,1,2,0,0,0,0,0,0,1,1,0,1,1,1,1,1,0,1,1,1,0,0,2,3,3,1,2,0,1,0,3,1,2,2,0,1,1,2,0,1,1,0,1,1,2,0,3,0,1,0,1,1,1,0,0,1,1,1,1,2,2,0,0,1,0,2,0,2,0,0,0,2,2,1,2,1,1,1,2,0,2,2,0,0,0,0,0,3,3,1,1,0,0,2,0,0,1,1,2,1,0,1,2,0,0,1,2,0,0,1,0,0,0,1,0,1,2,2,3,0,3,0,0,0,3,2,1,1,0,0,0,3,0,0,1,3,1,2,1,0,0,0,1,0,3,2,2,1,0,2,3,0,0,1,2,0,0,2,0,0,1,2,3,2,0,1,0,0,0,1,2,1,0,0,0,0,1,1,0,2,0,0,1,2,2,1,4,0,0,3,0,1,2,1,1,1,2,5,1,2,0,1,0,1,1,0,0,1,1,3,1,0,2,0,1,1,2,1,0,1,0,1,1,0,0,1,3,1,0,3,2,0,1,0,1,1,1,1,1,2,1,2,1,1,1,0,1,2,0,0,0,2,0,0,0,0,2,1,1,1,3,0,1,1,1,1,3,2,3,1,0,1,0,0,0,3,1,1,1,1,1,1,0,2,2,4,1,1,2,0,0,0,0,1,0,1,3,3,0,0,1,2,1,1,0,0,4,0,0,0,1,1,2,0,0,0,0,0,0,0,0,1,1,2,1,1,1,0,0,2,2,0,0,1,0,0,0,1,1,1,0,0,0,4,0,1,0,0,2,2,3,2,2,0,0,0,0,2,2,0,1,4,0,1,1,1,1,1,2,2,1,1,2,2,0,1,3,0,1,0,2,1,2,0,1,0,0,2,1,4,2,1,0,1,1,2,1,0,1,0,3,2,1,1,1,0,0,1,0,1,2,2,0,3,0,5,4,4,3,1,1,1,1,0,0,1,2,1,3,3,1,1,0,0,0,1,3,0,1,3,2,2,2,1,2,0,0,0,1,2,0,1,1,0,0,1,1,2,0,1,0,2,1,1,1,0,1,0,0,0,2,1,1,0,2,1,4,2,0,1,0,0,2,1,2,0,0,2,0,1,0,1]},{"counters":[0,0,2,2,2,0,2,2,2,1,0,1,2,1,0,1,0,1,1,0,0,1,2,2,0,1,1,1,0,0,2,0,1,2,1,1,1,0,1,1,2,0,3,0,0,3,1,1,0,2,1,0,1,0,3,0,2,1,3,2,0,2,0,1,0,0,0,3,2,0,1,2,1,2,0,1,3,1,0,0,1,0,2,0,0,2,2,1,1,2,0,0,0,2,0,0,0,1,1,2,0,1,0,0,1,1,0,0,1,2,1,0,3,2,0,0,1,0,1,1,0,0,1,1,1,1,1,0,1,1,1,1,1,0,1,1,2,1,1,1,1,1,0,0,1,4,2,3,2,0,2,0,0,1,1,1,3,2,1,2,1,2,2,2,0,1,3,1,0,0,0,3,1,0,3,0,0,1,2,1,1,1,0,0,1,0,0,3,1,0,0,1,0,3,3,2,2,1,1,1,1,1,0,1,1,2,1,0,0,0,0,1,2,0,3,0,0,1,0,1,0,0,0,0,2,2,1,3,0,0,0,1,2,3,0,0,0,0,0,1,1,2,2,2,0,1,0,2,1,1,1,1,4,0,1,2,0,1,1,0,0,1,2,0,4,1,0,2,3,0,2,1,0,1,1,0,1,1,0,0,2,1,1,0,0,2,0,0,0,1,1,1,2,1,3,3,0,0,0,0,0,2,0,1,2,1,0,0,0,0,0,1,2,5,0,1,0,3,1,0,2,1,1,1,2,0,0,2,0,0,3,2,1,3,1,1,1,0,1,0,0,1,0,2,0,6,0,0,2,1,0,0,0,0,5,2,1,0,0,0,1,0,1,1,0,2,1,0,2,0,0,1,0,1,0,0,0,1,3,0,3,0,0,1,1,1,1,0,1,0,1,1,2,2,2,1,3,2,0,3,1,1,1,2,2,0,1,0,1,3,2,3,1,2,1,1,0,1,0,1,0,2,2,1,1,1,2,1,0,0,1,2,1,2,0,1,1,1,0,1,2,2,0,0,0,1,1,1,2,1,0,0,0,1,1,3,0,1,0,2,0,0,1,0,3,2,0,1,0,0,0,2,1,0,0,0,0,0,1,0,2,3,0,1,1,1,1,1,0,1,3,0,2,1,0,0,0,0,0,2,0,0,1,0,1,0,0,1,3,1,1,1,0,1,0,2,1,1,0,1,0,0,1,2,0,0,0,3,0,1,0,3,0,0,0,1,1,2,0,2,1,0,0,2,0,1,1,0,1,2,1,1,0,0,0,2,2,1,0,2,1,1,1,0,2,1,0,2,0,3,2,2,2,4,1,1,1,1,0,1,1,1,2,3,1,4,2,0,0,2,3,0,0,1,3,0,1,1,0,2,0,3,0,0,2,2,1,0,0,0,1,2,0,4,0,1,0,1,0,0,0,0,3,1,3,0,1,0,0,1,1,2,1,3,0,0,0,0,2,0,1,1,0,1,0,0,0,0,0,1,0,0,0,1,0,2,0,0,0,1,0,1,3,1,1,1,2,0,1,0,1,0,1,1,1,1,2,0,2,0,0,2,1,1,0,0,0,2,1,1,2,1,1,0,1,0,1,1,2,3,2,2,0,1,1,0,0,2,2,1,1,0,0,3,1,0,1,1,0,1,0,0,1,1,0,2,0,0,1,1,1,3,0,0,2,1,2,0,0,1,1,2,2,3,0,1,1,1,0,1,0,1,2,0,1,1,1,1,2,0,0,0,2,1,1,0,0,2,0,2,0,3,1,2,1,2,0,1,0,3,0,1,2,1,0,2,0,1,0,4,1,0,1,1,4,1,1,1,2,0,5,0,0,0,2,0,1,0,2,0,0,1,1,0,2,0,1,1,0,1,0,1,0,0,1,0,1,0,2,1,1,0,0,1,2,0,1,0,1,0,0,1,1,1,0,1,1,0,1,2,1,0,0,3,4,0,0,3,3,1,0,3,2,0,3,0,1,0,2,0,2,1,3,1,0,0,1,2,0,2,1,1,0,3,1,3,0,3,2,1,0,1,1,1,0,0,1,1,1,0,1,0,1,0,3,1,3,0,2,3,1,0,1,0,0,3,1,1,0,2,1,1,1,2,0,0,0,0,3,3,1,0,3,0,1,1,1,2,0,1,0,1,2,3,0,0,1,0,0,1,0,2,3,1,1,0,0,1,2,1,0,1,0,0,1,2,0,1,0,1,0,1,1,0,2,0,1,2,0,0,2,0,1,0,0,4,2,0,2,2,0,0,1,1,1,0,2,3,0,1,1,2,0,2,0,0,1,0,0,0,1,2,2,1,0,0,0,0,0,1,4,2,3,1,1,0,0,0,1,0,3,0,1,2,1,1,0,0,0,1,1,1,0,3,2,0,1,1,1,2,1,2,2,1,3,1,1,0,1,1,0,2,1,1,1,0,0,0,3,0,4,3,0,2,2,1,2,3,1,1,0,2,0,0,1,0,2,1,2,0,1,0,1,2,3,4,0,2,0,2,1,1,2,0,1,2,1,0,2,1,0,1,1,0,1,1,0,2,1,1,2,1,1,2,2,2,1,1,1,1,3,1,0,0,0,1,1,0,0,3,0,2,0,2,1,3,0,2,0,1,0,1,2,0,1,3,5,1,0,1,0,0,1,1,0,1,0,1,0,0,1,2,0,2,1,0,1,0,0,0,2,1,1,0,1,1,2,1,1,2,1,0,1,4,2,2,2,2,0,0,0,1,1,1,0,0,1,1,1,0,1,2,0,1,2,0,0,1,0,4,1,0,4,0,0,3,1,0,0,3,2,0,1,0,2,0,0,2,0,3,1,0,2,1,1,0,0,1,0,2,0,0,1,1,0,1,2,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,1,1,1,1,1,1,1,1,2,0,1,0,2,1,3,2,1,0,1,0,0,1,1,0,0,2,0,2,2,0,1,0,0,2,4,2,1,0,1,0,0,2,0,0,2,1,1,0,1,1,1,2,1,2,0,0,0,0,1,2,1,1,2,1,1,1,0,0,0,0,0,0,1,1,2,0,0,4,2,1,0,2,0,0,1,1,0,0,3,1,2,2,0,2,1,2,3,0,1,1,1,2,1,0,2,1,1,1,0,1,2,2,1,4,3,1,2,1,2,0,3,1,0,1,1,2,2,0,1,1,3,0,1,1,1,1,1,1,1,2,1,0,1,1,0,2,0,0,0,0,1,1,0,2,1,0,1,3,0,1,0,0,1,1,0,2,0,2,1,0,1,0,2,1,5,3,0,1,0,2,2,4,2,2,0,1,0,2,1,1,0,2,2,1,2,1,1,0,1,0,0,1,1,0,1,0,2,0,1,1,0,2,0,0,1,0,0,1,2,1,0,0,0,1,1,1,1,1,1,0,0,0,1,0,6,2,1,0,0,2,0,3,0,2,1,2,0,1,2,0,1,0,0,1,1,1,2,0,0,0,0,2,0,1,0,0,3,0,1,2,2,2,0,1,2,1,0,0,1,0,1,0,1,0,1,0,1,2,1,1,0,2,0,0,1,1,3,2,1,1,2,3,1,1,1,0,1,2,1,2,2,1,0,0,2,1,1,1,3,1,1,0,1,0,1,1,0,1,0,1,1,1,0,0,1,3,2,0,2,1,2,1,0,0,0,2,1,0,0,2,1,1,0,1,2,2,2,1,0,1,2,1,0,0,2,1,3,1,0,0,0,0,1,1,1,0,1,1,0,0,0,0,5,1,2,0,1,0,1,0,0,0,0,1,1,1,0,1,1,0,1,4,1,2,1,2,0,1,0,1,0,0,2,2,0,1,1,2,3,0,0,0,2,2,0,1,2,0,1,3,2,1,1,0,1,1,1,1,0,1,2,0,0,1,0,2,1,0,2,0,1,0,4,1,0,0,0,2,0,1,3,0,1,2,0,1,1,1,0,2,0,2,1,0,0,0,0,1,1,1,0,0,1,0,0,2,1,1,0,0,1,2,1,0,0,1,1,0,0,0,3,2,1,1,1,1,2,0,3,1,0,2,0,1,0,0,4,1,1,0,0,1,2,2,1,0,2,0,1,1,2,1,0,2,0,0,0,0,1,1,1,0,2,2,0,0,0,1,0,2,2,0,1,0,2,0,1,1,1,2,0,0,0,1,1,0,2,0,1,0,1,0,2,0,0,0,1,0,1,0,0,1,0,0,0,1,2,2,0,0,1,1,1,1,0,1,4,0,1,0,4,2,2,0,2,0,0,1,2,1,3,2,1,2,0,0,2,0,2,1,2,1,3,0,0,1,0,0,0,1,0,0,1,2,1,1,0,0,0,0,0,1,2,0,2,0,2,1,0,1,0,0,1,3,0,1,0,1,0,3,0,0,2,0,1,3,0,3,0,2,2,1,1,2,1,2,2,1,0,0,1,1,1,1,0,1,2,1,0,0,1,0,0,1,4,1,1,3,0,1,1,1,4,1,0,1,1,2,0,2,0,1,1,0,1,3,3,0,0,1,1,1,2,0,0,0,1,1,0,0,0,0,0,1,0,2,1,1,1,1,0,3,1,0,2,2,0,2,3,0,1,3,0,1,2,0,0,2,2,2,2,1,4,0,1,3,1,3,1,1,0,0,2,2,1]},{"counters":[0,3,2,2,2,5,1,0,0,0,0,1,1,1,0,0,1,1,1,1,2,0,0,0,1,1,3,2,0,1,3,0,2,0,2,0,0,1,0,0,1,1,2,2,1,0,0,1,0,3,2,1,1,1,1,1,0,1,0,0,1,0,0,1,1,1,2,0,2,2,0,0,0,1,1,3,3,0,1,1,2,1,1,2,1,1,2,1,1,1,0,3,1,0,1,0,0,0,1,0,1,0,1,0,2,2,1,1,1,0,2,3,2,1,0,2,0,1,1,1,2,2,2,1,1,0,3,1,2,0,2,2,1,0,3,0,0,0,1,1,0,2,0,0,2,2,2,0,1,0,0,2,1,1,3,1,0,1,1,2,0,0,0,2,0,4,0,2,0,0,1,0,0,2,0,1,0,0,0,0,0,2,0,1,1,1,1,3,0,4,3,1,1,0,0,0,1,0,1,0,0,2,1,0,1,1,2,1,0,1,1,0,1,0,1,0,1,1,2,1,1,1,2,1,1,2,2,0,1,3,0,1,1,0,1,0,0,3,1,0,0,1,1,0,1,0,2,1,2,1,2,1,0,1,0,2,2,1,1,0,1,0,1,0,1,1,0,1,1,1,0,2,0,0,2,1,0,0,1,2,0,0,1,2,1,0,2,3,0,1,1,3,1,1,2,2,4,0,1,2,2,0,1,1,2,1,2,2,1,0,1,1,3,1,0,1,1,1,2,0,0,0,2,0,0,2,0,1,0,0,2,0,0,1,0,1,1,0,1,0,2,2,1,0,0,2,0,2,1,0,1,0,2,2,0,1,1,2,1,5,0,0,1,0,1,2,1,1,3,0,1,1,1,3,0,1,1,3,1,1,0,0,1,0,2,1,1,2,1,0,1,0,1,2,0,0,0,2,1,0,2,0,0,1,0,1,3,1,2,0,0,0,2,1,0,0,0,1,1,0,0,0,0,2,2,1,3,0,1,1,1,2,1,0,0,1,3,1,1,1,1,1,0,1,2,2,0,1,0,1,1,0,2,0,0,0,1,2,0,1,2,1,0,1,0,2,1,1,2,2,0,1,0,0,0,1,0,1,1,1,2,0,2,1,1,0,1,2,2,0,1,0,1,2,1,1,1,2,1,0,0,0,0,2,1,1,0,0,0,1,1,2,1,0,2,0,3,1,0,1,0,1,1,0,2,2,3,1,2,1,0,0,1,0,2,0,2,1,0,2,1,0,1,0,0,1,2,1,0,0,3,0,1,2,2,3,1,2,2,0,3,1,0,2,2,1,1,0,0,1,2,0,0,0,0,1,0,2,0,1,2,0,1,1,1,2,1,0,0,1,2,0,0,1,0,2,0,1,2,0,0,0,0,1,3,0,0,0,2,0,0,0,0,0,2,0,1,1,1,0,0,1,2,1,0,4,1,0,1,0,0,1,1,4,0,1,1,1,0,1,2,3,1,1,1,0,0,0,1,2,2,2,0,2,1,2,0,2,0,1,2,1,1,0,1,3,1,1,1,1,2,2,0,2,3,3,0,1,2,0,0,0,2,2,1,0,1,0,0,1,0,1,1,1,2,2,0,0,0,0,2,0,1,0,3,2,2,0,0,0,1,2,2,2,1,3,1,0,1,1,0,1,1,0,1,1,0,2,3,2,1,1,3,2,1,2,0,2,2,0,1,2,3,0,0,1,1,2,1,0,0,2,1,0,1,0,1,0,0,2,2,1,1,1,1,0,1,1,0,1,1,1,0,0,1,1,1,0,4,0,1,1,2,1,1,2,0,0,0,1,1,2,1,0,2,0,3,2,0,1,5,0,0,3,0,0,1,0,0,1,1,2,4,1,1,1,0,2,2,0,1,1,0,2,0,0,1,0,0,0,2,3,1,0,1,1,1,0,0,0,0,1,3,1,1,0,1,1,3,1,1,1,1,2,0,1,1,0,0,1,1,1,2,0,3,1,0,0,4,0,0,0,0,1,0,2,0,0,1,0,1,1,0,0,2,2,0,1,0,0,2,1,1,1,0,2,3,1,2,1,2,3,1,2,2,0,0,2,1,3,2,0,0,3,0,1,1,1,1,1,2,1,1,2,1,1,1,1,0,3,0,1,1,0,1,2,3,1,1,0,0,0,0,2,1,0,2,0,1,0,1,1,0,1,2,2,2,1,1,0,0,1,1,1,2,1,3,1,1,1,0,1,0,0,1,0,0,3,1,1,1,1,2,2,0,1,1,5,1,1,1,2,0,0,1,0,2,3,1,1,1,1,0,1,1,2,1,2,0,0,0,1,2,1,2,0,1,1,2,0,1,1,0,0,1,2,2,2,0,1,1,1,1,0,2,1,1,1,0,4,0,0,1,0,4,1,2,1,0,2,3,1,0,1,0,1,0,3,1,0,0,0,1,2,0,0,1,1,1,0,1,5,1,2,1,2,2,1,0,1,0,0,2,1,0,0,0,0,1,2,2,0,0,2,3,1,1,1,2,0,0,0,1,0,2,1,0,0,1,0,1,2,0,1,2,1,1,0,1,1,1,0,1,2,1,1,1,0,2,0,0,1,0,0,1,1,0,0,0,0,0,2,0,2,1,0,1,1,1,0,0,0,1,0,1,0,1,1,2,2,0,1,0,1,0,0,0,1,3,5,1,1,2,1,1,1,1,1,0,1,1,0,1,0,2,1,3,0,1,0,1,2,2,2,0,0,0,1,0,0,1,1,1,1,0,2,1,0,1,2,0,0,0,0,0,1,1,0,0,2,3,0,1,1,1,0,0,1,1,0,1,0,1,0,2,1,1,1,1,0,2,0,2,0,1,1,2,2,1,1,2,1,0,1,0,0,0,2,0,0,1,0,1,1,1,1,1,0,0,0,2,3,3,0,0,0,1,1,1,0,0,0,1,0,1,1,1,2,0,2,1,1,2,1,1,0,1,2,2,0,1,1,1,4,0,1,0,1,1,3,1,1,2,1,4,2,2,1,1,0,3,0,0,2,1,0,1,2,0,2,0,1,1,0,1,2,0,0,0,0,1,1,0,4,1,0,1,0,2,1,1,1,1,0,1,1,0,1,0,2,0,1,0,0,0,2,3,0,1,3,0,0,3,0,1,4,3,4,2,0,1,1,0,4,2,1,0,1,1,1,1,1,1,1,1,0,1,1,2,1,2,2,2,1,1,1,1,1,0,3,2,2,1,3,2,1,2,0,1,0,1,0,0,1,0,1,4,0,0,0,1,1,1,4,2,1,2,0,2,0,0,1,0,1,1,0,1,1,1,2,1,2,1,1,0,0,1,0,0,0,0,1,0,0,1,1,2,1,0,2,0,0,1,2,1,2,0,1,4,2,0,2,0,0,1,0,1,1,0,0,0,1,0,0,1,1,0,1,1,0,1,0,1,2,0,0,3,2,0,1,0,0,1,1,1,0,1,1,0,0,1,1,0,2,0,2,0,0,4,1,0,0,0,2,1,0,1,3,1,0,0,2,0,2,1,2,3,1,0,0,0,3,1,2,0,0,0,2,0,0,2,0,0,0,1,3,1,0,0,2,1,1,0,0,1,0,2,2,1,0,3,0,0,3,3,1,1,3,0,1,1,0,0,1,0,0,1,2,1,1,0,0,1,1,1,0,0,2,0,1,0,1,1,1,0,2,0,0,1,1,1,3,1,0,2,3,2,2,3,0,0,4,0,1,0,1,0,3,0,2,0,1,2,0,1,0,2,0,1,0,2,0,1,0,1,2,2,0,0,0,2,2,0,0,1,1,0,2,1,4,2,1,0,1,2,2,3,1,1,1,1,0,1,2,2,0,0,0,1,1,1,0,1,2,1,1,0,0,0,1,1,2,0,1,0,1,3,3,0,3,0,1,0,0,1,3,2,1,0,2,1,0,2,2,0,1,0,2,1,1,1,0,0,0,0,0,2,2,0,0,1,0,1,0,2,0,1,0,1,1,1,0,2,3,2,0,0,1,0,1,0,2,1,1,2,1,1,0,1,0,1,0,1,2,1,1,1,1,1,1,2,0,2,0,5,1,2,3,2,1,0,0,0,1,1,0,1,0,3,2,0,1,4,1,0,1,0,2,1,1,1,2,3,1,1,4,3,1,0,0,3,0,0,1,2,1,0,0,1,0,0,2,1,1,0,0,3,2,1,3,1,3,2,1,1,2,0,2,2,1,0,1,1,0,1,0,0,1,2,0,0,2,0,1,1,3,0,0,1,2,2,0,0,0,0,2,0,3,1,2,0,0,2,0,3,1,2,0,2,1,1,0,2,1,1,2,1,0,4,0,4,3,0,0,1,2,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,0,1,0,0,1,1,1,1,1,2,2,1,1,3,0,1,0,0,1,3,0,2,0,1,0,0,1,0,3,0,0,0,1,0,2,0,1,1,0,0,0,2,1,0,3,0,0,1,1,0,2,0,2,1,0,1,3,1,0,0,0,1,3,1,0,1,1,2,1,1,1,0,1,1,1,1,0,0,0,1,0,0,0,2,0,2,1,2,1,1,1,1,0,0,1,1,2,1,1,2,1,0,0,3,0,0,0,1,1,0,0,1,0,2,4,0,0,2,0,1,3,1,1,1,0,2,1]},{"counters":[1,0,0,0,1,1,0,1,5,0,1,0,0,0,1,3,1,0,3,0,1,1,1,2,0,1,2,0,2,0,0,1,0,0,2,0,0,0,1,0,0,0,1,0,0,2,1,2,1,0,0,1,0,2,1,1,2,0,3,2,0,1,2,0,0,1,0,1,1,0,0,1,0,4,1,1,1,1,1,1,0,2,0,1,1,0,1,1,2,0,2,0,3,0,2,1,2,1,0,1,1,1,1,1,0,1,1,1,1,1,0,1,2,1,0,0,0,0,2,0,2,1,0,1,0,1,0,1,2,2,2,1,3,2,1,2,3,1,0,1,0,0,1,1,3,0,0,2,1,1,1,1,4,2,0,0,1,1,1,2,1,1,1,0,0,2,0,0,1,1,1,0,0,1,2,1,0,2,1,0,0,0,0,3,3,3,2,2,1,0,2,0,0,1,0,1,0,1,1,0,0,2,1,0,0,0,1,0,0,0,1,0,1,2,0,2,1,0,3,0,0,4,1,3,1,2,0,1,0,1,1,4,0,0,2,1,0,1,0,0,0,0,1,2,4,1,1,0,0,0,2,1,0,3,2,3,1,1,0,2,0,1,2,0,1,0,2,2,1,2,1,0,0,1,0,2,1,2,2,1,1,1,1,1,0,1,1,0,2,1,1,0,0,0,1,1,0,0,1,1,1,0,1,2,1,1,0,0,0,0,1,0,0,0,1,2,0,3,1,0,2,1,2,1,1,1,0,1,1,0,2,0,1,0,1,1,2,1,4,1,0,1,0,1,1,1,3,0,2,1,0,2,0,0,3,1,1,0,1,2,1,1,1,0,0,2,1,2,2,1,1,0,1,1,2,1,0,0,1,2,0,1,0,1,1,1,0,1,1,4,0,1,0,1,2,3,2,0,2,2,2,1,0,2,1,1,2,1,2,1,1,1,1,1,2,2,2,0,0,0,0,0,0,2,1,1,3,1,1,1,1,1,1,0,1,0,1,1,0,2,0,1,3,1,1,4,0,1,0,0,3,1,1,2,0,2,2,0,2,0,0,3,0,0,1,2,1,3,1,0,0,1,0,0,2,3,0,0,1,1,1,2,3,0,0,1,1,0,1,1,0,0,0,1,1,0,2,2,1,0,0,0,1,3,0,1,0,4,0,1,1,3,2,2,2,3,0,2,1,0,0,0,2,3,1,2,3,0,1,1,0,1,0,3,1,0,1,1,2,5,2,0,1,1,0,0,0,0,1,2,1,1,3,1,2,1,0,3,1,2,0,3,0,0,0,2,1,0,1,1,2,0,1,1,0,1,0,2,1,1,2,0,0,1,0,1,1,3,1,0,0,2,1,1,2,2,0,4,1,0,1,1,1,1,0,3,2,1,3,2,1,1,0,1,2,3,2,1,1,0,2,1,1,1,1,1,1,0,1,1,0,1,0,1,0,1,0,1,0,1,2,0,1,1,0,0,3,0,1,0,0,2,2,1,3,2,2,2,1,0,0,2,1,1,0,0,0,0,1,1,1,0,1,1,3,0,1,0,1,2,4,3,1,0,2,1,1,1,0,2,1,3,0,2,2,1,2,0,2,0,0,1,2,0,1,0,0,1,1,1,0,0,0,2,2,2,0,0,1,2,1,0,1,2,0,3,3,1,3,0,0,0,0,5,1,1,0,0,1,3,0,0,1,2,2,1,0,0,0,1,0,1,3,1,1,0,2,1,2,1,0,0,1,2,1,0,1,0,2,0,1,0,1,2,1,1,1,1,2,0,1,1,0,2,1,1,0,2,0,0,1,3,0,0,0,3,0,1,0,1,0,1,1,2,0,3,1,1,2,1,1,1,0,0,2,0,2,0,0,0,1,4,1,1,1,1,2,2,2,2,1,1,1,2,5,0,1,2,3,2,0,1,2,6,1,1,1,0,3,2,0,3,0,0,1,3,2,0,0,3,0,1,0,2,0,1,1,0,0,0,0,2,1,2,1,1,1,2,0,0,2,0,0,0,0,0,0,0,0,0,1,1,1,2,3,0,0,1,0,1,0,4,2,2,1,3,1,1,2,0,0,0,1,1,1,1,0,0,1,1,2,0,2,1,0,0,0,1,1,1,1,3,1,3,3,3,1,0,1,0,2,2,1,1,2,0,1,1,0,1,2,0,1,1,0,1,3,0,0,0,2,1,2,0,2,1,1,2,0,0,1,1,3,3,0,1,3,1,0,0,2,0,1,0,0,1,1,2,0,1,0,1,0,0,2,2,0,2,1,1,0,3,1,0,0,0,1,3,3,2,0,1,3,0,1,2,0,3,0,0,1,1,0,0,0,0,0,2,0,2,0,0,0,0,2,3,0,2,0,1,0,0,3,1,2,2,2,1,0,1,0,2,1,0,2,3,0,0,1,1,1,1,0,0,1,1,1,2,0,1,0,4,1,2,1,5,1,0,1,0,2,2,1,0,2,1,1,2,2,1,1,0,0,2,1,1,0,0,3,1,1,1,1,2,1,0,0,0,0,2,0,0,2,1,1,2,1,1,1,1,0,0,2,2,2,0,0,0,0,2,0,2,2,2,3,1,1,1,0,1,3,3,2,0,2,1,0,2,0,1,3,0,0,1,2,0,1,0,0,0,1,0,2,2,1,3,0,1,2,0,2,2,0,0,1,2,0,0,2,0,0,1,1,1,1,1,3,0,1,3,2,0,2,2,0,1,1,2,0,1,1,0,0,1,2,1,2,3,0,0,0,1,0,0,0,1,0,0,0,2,2,1,0,0,1,0,3,1,1,0,1,0,0,1,1,1,3,1,1,0,0,2,1,1,2,1,0,0,0,3,0,1,1,1,1,0,1,1,2,0,1,2,0,0,1,1,2,1,1,1,0,4,0,0,1,2,2,2,0,0,0,3,0,1,3,0,2,1,1,0,1,1,0,0,1,2,1,0,1,0,0,4,1,1,1,0,0,1,1,2,1,1,1,1,1,1,0,1,1,0,0,1,1,1,0,3,1,2,0,3,1,1,0,2,1,0,1,1,0,2,1,0,0,1,1,1,1,1,1,1,0,0,0,1,1,0,2,1,1,0,1,2,0,1,3,1,1,1,0,0,1,0,2,2,2,2,0,2,0,0,0,2,1,2,0,0,1,0,1,1,0,1,2,0,0,1,0,3,0,2,0,2,3,1,1,3,1,1,2,0,0,1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,2,2,2,0,3,0,2,1,1,1,0,3,1,1,0,0,1,0,2,0,2,1,1,3,1,2,0,3,1,2,1,1,0,2,1,1,1,1,2,1,1,0,1,4,2,1,0,0,1,2,3,0,2,0,0,1,0,0,3,0,0,0,0,0,1,0,1,1,1,2,2,0,1,1,1,1,1,3,0,3,0,1,0,1,1,0,2,1,1,2,2,2,2,0,1,0,0,0,0,1,0,3,0,1,1,1,1,0,0,2,0,2,2,0,4,3,0,1,2,0,0,1,0,0,1,0,0,0,0,1,2,2,3,0,0,2,0,4,2,0,0,2,1,0,1,0,1,0,0,2,1,1,2,0,0,1,3,0,1,0,0,0,1,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,3,2,1,0,1,0,0,1,1,1,0,1,0,0,2,0,1,0,0,0,2,4,3,1,1,0,2,1,2,3,0,0,3,2,0,2,1,1,0,1,1,0,1,2,2,0,4,1,0,0,2,0,3,1,1,1,1,1,0,0,1,1,0,2,1,0,2,3,2,3,1,1,1,1,1,3,0,1,1,1,2,1,2,0,0,1,0,1,1,0,0,2,0,2,2,0,1,1,1,2,1,2,0,2,0,2,1,0,0,1,0,0,0,1,0,1,0,1,1,0,3,1,2,1,1,3,2,0,2,2,0,1,1,1,2,0,1,0,1,1,0,1,1,2,0,0,1,0,1,1,0,1,1,0,1,1,0,2,0,4,2,1,0,0,0,1,1,1,0,1,1,0,1,1,0,1,1,1,0,0,2,0,2,1,1,0,1,0,1,1,0,0,1,1,0,2,0,2,0,0,4,0,1,1,5,1,1,1,1,0,2,0,1,2,0,0,0,0,2,1,0,0,3,0,1,0,1,1,0,1,1,1,1,0,1,1,1,1,0,0,1,2,0,3,0,1,0,0,0,2,0,2,0,1,1,1,1,0,1,2,1,0,1,2,0,0,3,2,2,0,1,2,2,2,0,0,0,1,3,1,0,1,0,0,0,1,2,3,0,1,1,0,0,0,2,0,3,2,0,0,0,1,1,2,0,0,1,1,0,1,1,2,0,0,1,0,1,1,4,1,0,2,1,0,1,1,0,1,0,1,0,2,0,1,4,3,3,0,0,2,1,1,0,2,0,0,1,1,2,1,0,0,1,1,2,1,0,3,0,0,1,1,3,1,0,0,2,0,0,1,0,0,0,0,0,0,1,0,1,1,0,0,0,2,0,0,1,0,0,0,0,1,0,0,0,0,1,1,0,1,1,2,0,0,0,1,1,0,1,2,2,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,2,1,1,0,1,0,2,1,0,0,3,1,0,2,1,0,1]},{"counters":[0,0,0,0,0,1,0,0,0,2,0,0,1,2,1,0,0,0,1,3,2,0,0,1,1,0,0,1,1,3,0,1,1,1,2,0,3,1,1,1,0,3,0,0,1,0,2,1,0,2,1,1,1,2,1,1,0,0,1,0,0,0,1,1,1,0,0,0,0,2,0,2,0,1,0,1,0,3,0,2,0,1,0,3,0,0,2,0,0,2,4,3,1,1,0,0,2,1,2,1,2,1,0,1,3,2,0,0,1,1,0,1,2,1,0,1,2,0,0,1,0,0,1,0,2,3,0,0,1,1,0,0,2,2,0,1,0,1,0,0,0,0,6,0,1,2,0,0,2,1,0,0,0,0,2,0,1,0,1,1,1,2,0,0,1,2,3,1,1,1,1,0,2,4,0,1,1,2,0,0,0,4,1,2,0,0,0,3,0,0,1,1,0,1,0,2,0,1,1,2,1,2,1,2,1,0,0,0,1,1,1,0,1,1,0,0,1,1,2,0,0,1,0,1,1,0,1,1,0,0,0,1,0,0,0,1,2,1,0,0,3,0,0,0,1,1,1,4,1,1,2,0,1,1,1,1,1,0,1,1,1,1,2,3,0,1,1,1,2,3,4,0,0,0,2,0,1,1,1,1,1,2,1,0,0,0,2,3,2,0,0,1,4,3,2,1,1,0,0,1,0,3,1,0,1,0,2,0,1,0,2,2,1,0,1,2,1,2,2,3,2,1,1,0,1,0,3,0,1,0,0,0,3,0,0,0,0,0,0,2,3,1,3,1,0,1,1,0,1,2,0,0,2,0,0,1,1,0,1,1,0,1,2,1,2,0,2,2,0,0,0,0,1,2,0,2,1,2,0,3,3,1,0,0,1,0,0,0,3,1,0,0,0,1,0,1,0,1,1,0,1,0,0,0,0,1,4,1,0,2,0,0,0,1,2,2,0,4,1,2,1,3,0,0,1,1,1,1,2,1,2,0,0,0,0,1,0,0,1,1,1,0,2,0,1,1,0,0,4,1,0,0,0,1,0,0,1,0,2,1,0,1,2,2,2,2,1,1,0,2,1,2,2,2,0,0,2,4,0,3,0,0,1,1,0,0,0,0,2,1,1,0,6,2,0,2,2,0,2,0,0,1,1,1,2,0,0,0,5,1,2,0,2,0,1,2,1,1,2,1,1,0,0,1,2,1,0,0,1,1,2,0,3,1,3,0,1,3,3,0,2,2,0,1,1,0,1,0,4,2,2,2,1,2,0,0,2,0,0,1,1,2,0,0,1,2,0,5,0,2,0,0,0,1,0,1,0,0,1,1,0,0,0,2,0,2,0,3,2,1,3,1,1,0,0,2,0,0,3,1,1,1,0,0,1,0,2,0,2,1,0,4,2,0,0,1,1,0,0,1,1,3,1,3,0,0,1,1,0,0,0,0,0,1,1,0,1,0,1,2,2,0,1,0,2,2,0,2,1,0,0,0,1,0,3,0,0,4,1,1,2,1,1,1,2,0,1,0,0,3,2,0,1,1,1,0,2,2,0,1,2,0,0,0,1,1,0,0,3,1,2,0,1,1,0,0,2,0,1,0,0,1,1,1,0,1,0,2,2,1,1,1,2,1,3,0,1,1,0,0,2,3,1,2,1,0,1,0,1,2,1,1,2,1,1,0,2,2,0,0,1,2,0,3,1,1,1,0,0,0,1,2,0,2,2,0,2,0,2,2,1,1,1,1,3,0,1,2,1,1,0,0,1,0,0,1,1,0,0,2,0,1,2,1,3,2,4,0,0,0,0,0,1,1,0,0,0,2,1,3,0,3,1,0,1,1,2,0,2,0,0,0,0,0,2,1,3,1,1,1,0,3,1,2,2,1,0,1,2,0,0,0,2,2,0,2,2,3,3,1,2,0,2,0,0,1,1,1,0,3,2,0,1,0,1,1,0,2,1,2,1,2,2,1,1,0,0,1,0,0,3,2,0,1,0,1,3,0,3,0,0,0,1,0,0,1,1,4,3,0,1,0,2,1,1,0,1,1,2,2,2,0,3,0,3,1,1,1,2,4,1,3,2,1,0,3,1,3,0,0,1,1,0,0,0,0,0,0,0,2,2,2,3,0,2,1,0,2,2,1,1,0,2,0,3,2,1,1,0,1,1,3,1,1,0,1,1,0,2,0,1,0,4,1,0,0,3,0,1,1,1,1,1,0,0,0,2,4,1,0,2,1,0,1,1,2,0,1,1,1,0,0,1,0,1,0,0,2,2,2,1,0,2,3,0,1,0,0,0,1,2,0,0,0,1,3,2,1,2,0,1,1,2,2,0,2,2,0,0,2,0,1,1,1,0,0,1,1,1,0,0,0,1,1,1,0,1,1,2,1,0,2,1,1,1,1,0,1,1,3,1,1,2,3,0,0,3,1,0,0,0,1,0,1,1,0,0,1,0,0,0,1,2,2,0,2,1,1,0,1,1,1,0,1,0,1,1,0,2,1,2,3,0,0,1,1,1,2,0,1,1,0,0,1,0,0,1,0,0,1,3,1,2,6,0,1,0,2,0,2,1,3,5,0,0,1,0,2,0,0,0,1,1,3,1,3,0,1,0,1,0,0,1,0,1,0,1,1,1,0,0,2,1,1,2,1,0,0,0,1,1,0,2,0,2,0,0,1,1,2,0,0,1,2,0,2,1,1,0,1,0,1,0,0,1,2,2,0,0,3,1,1,2,0,1,2,2,1,0,0,0,1,0,1,1,1,1,0,0,0,0,2,2,1,2,1,0,1,2,2,1,2,0,1,1,0,1,0,1,0,1,1,1,1,2,0,0,2,1,0,0,0,0,0,1,2,4,0,2,1,2,0,0,1,1,2,1,0,1,1,3,3,0,3,0,2,1,0,1,0,1,2,2,0,0,1,2,1,0,1,1,1,1,2,1,0,1,3,0,1,2,0,0,0,1,0,1,3,0,0,1,1,2,0,2,3,2,3,0,1,1,1,1,1,0,2,0,1,2,2,0,0,2,1,1,2,2,2,1,1,1,1,1,0,2,1,0,1,2,1,2,0,1,0,0,0,1,1,0,0,2,1,1,0,0,2,1,2,3,1,0,0,0,0,0,0,2,4,1,0,1,0,2,2,1,0,1,1,1,0,0,1,3,2,1,0,2,0,0,2,1,1,2,2,1,2,0,1,1,1,1,0,1,1,0,3,2,1,1,2,2,1,1,0,0,0,1,2,1,0,1,1,1,3,3,1,2,2,2,2,2,2,1,0,1,3,1,1,1,0,2,1,0,0,1,0,0,0,0,2,2,0,2,1,0,0,0,1,0,0,2,0,2,2,1,1,1,0,1,0,0,1,0,2,0,0,3,1,0,2,0,0,1,1,1,3,0,1,1,2,2,0,1,0,2,0,1,2,2,0,0,0,4,2,2,0,0,1,0,1,2,0,1,2,1,0,0,0,0,0,1,0,1,1,4,1,2,2,0,0,1,0,2,1,0,2,0,0,0,2,0,0,1,0,0,0,1,2,1,1,2,0,1,1,2,2,0,1,0,2,2,1,0,1,1,1,0,0,2,0,0,0,2,0,1,0,0,1,0,2,0,0,0,3,0,0,0,2,1,0,3,2,2,0,0,2,3,0,0,1,1,4,2,1,0,1,1,2,1,1,0,0,2,0,0,0,0,0,2,0,0,1,3,0,1,1,2,1,5,3,0,2,0,1,1,1,2,0,2,2,2,0,1,2,1,0,1,0,2,0,1,3,0,1,1,1,2,3,0,3,1,1,0,1,2,1,0,3,0,0,3,1,1,1,0,0,1,4,0,3,0,1,1,1,3,1,2,1,0,0,0,2,0,0,1,0,2,1,0,1,0,3,3,2,3,1,3,0,1,1,1,1,1,0,0,1,0,1,2,1,1,2,1,1,0,1,0,1,2,0,3,0,1,0,1,1,0,2,0,2,1,1,1,0,2,2,3,2,1,2,1,1,0,1,0,1,1,2,1,2,1,0,1,0,3,0,2,2,1,1,2,1,1,1,1,2,0,0,2,0,0,0,0,0,0,1,1,2,0,3,2,0,1,1,2,2,2,1,2,1,1,0,2,1,0,1,0,0,1,2,1,2,3,2,0,1,2,2,0,1,1,2,1,0,1,1,1,0,0,1,1,0,0,0,1,0,0,3,1,1,0,1,1,2,1,1,2,0,1,3,1,0,0,2,1,1,1,2,1,0,0,0,0,0,0,2,1,2,1,1,0,0,2,0,0,2,0,2,1,2,2,0,2,1,1,2,1,0,0,0,2,2,2,2,1,1,2,1,0,0,0,1,0,0,2,0,2,1,0,0,0,1,0,0,2,0,1,0,1,0,0,1,1,1,2,3,2,0,0,1,1,1,3,0,0,1,2,0,0,0,0,1,0,0,1,2,0,1,1,2,1,0,1,2,0,1,0,1,0,1,0,2,0,0,1,1,1,0,2,0,0,0,2,0,0,2,2,1,0,3,1,1,0,2,2,1,2,0,1,0,0,1,0,0,0,3,0,0,1,0,0,0,0,1,1,0,3,1,0,1,0,3,2,1,0,0,0,1,1,2,0,0,1,1,1,2,1,0,0,1,1,1,0,1,2,0,2,0]}]},"null_count":0,"last_update_version":397952054694772736}},"indices":{"c1":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"A4AAAAAAAAAA","upper_bound":"A4AAAAAAAAAH","repeats":1},{"count":16,"lower_bound":"A4AAAAAAAAAI","upper_bound":"A4AAAAAAAAAP","repeats":1},{"count":24,"lower_bound":"A4AAAAAAAAAQ","upper_bound":"A4AAAAAAAAAX","repeats":1},{"count":32,"lower_bound":"A4AAAAAAAAAY","upper_bound":"A4AAAAAAAAAf","repeats":1},{"count":40,"lower_bound":"A4AAAAAAAAAg","upper_bound":"A4AAAAAAAAAn","repeats":1},{"count":48,"lower_bound":"A4AAAAAAAAAo","upper_bound":"A4AAAAAAAAAv","repeats":1},{"count":56,"lower_bound":"A4AAAAAAAAAw","upper_bound":"A4AAAAAAAAA3","repeats":1},{"count":64,"lower_bound":"A4AAAAAAAAA4","upper_bound":"A4AAAAAAAAA/","repeats":1},{"count":72,"lower_bound":"A4AAAAAAAABA","upper_bound":"A4AAAAAAAABH","repeats":1},{"count":80,"lower_bound":"A4AAAAAAAABI","upper_bound":"A4AAAAAAAABP","repeats":1},{"count":88,"lower_bound":"A4AAAAAAAABQ","upper_bound":"A4AAAAAAAABX","repeats":1},{"count":96,"lower_bound":"A4AAAAAAAABY","upper_bound":"A4AAAAAAAABf","repeats":1},{"count":104,"lower_bound":"A4AAAAAAAABg","upper_bound":"A4AAAAAAAABn","repeats":1},{"count":112,"lower_bound":"A4AAAAAAAABo","upper_bound":"A4AAAAAAAABv","repeats":1},{"count":120,"lower_bound":"A4AAAAAAAABw","upper_bound":"A4AAAAAAAAB3","repeats":1},{"count":128,"lower_bound":"A4AAAAAAAAB4","upper_bound":"A4AAAAAAAAB/","repeats":1},{"count":136,"lower_bound":"A4AAAAAAAACA","upper_bound":"A4AAAAAAAACH","repeats":1},{"count":144,"lower_bound":"A4AAAAAAAACI","upper_bound":"A4AAAAAAAACP","repeats":1},{"count":152,"lower_bound":"A4AAAAAAAACQ","upper_bound":"A4AAAAAAAACX","repeats":1},{"count":160,"lower_bound":"A4AAAAAAAACY","upper_bound":"A4AAAAAAAACf","repeats":1},{"count":168,"lower_bound":"A4AAAAAAAACg","upper_bound":"A4AAAAAAAACn","repeats":1},{"count":176,"lower_bound":"A4AAAAAAAACo","upper_bound":"A4AAAAAAAACv","repeats":1},{"count":184,"lower_bound":"A4AAAAAAAACw","upper_bound":"A4AAAAAAAAC3","repeats":1},{"count":192,"lower_bound":"A4AAAAAAAAC4","upper_bound":"A4AAAAAAAAC/","repeats":1},{"count":200,"lower_bound":"A4AAAAAAAADA","upper_bound":"A4AAAAAAAADH","repeats":1},{"count":208,"lower_bound":"A4AAAAAAAADI","upper_bound":"A4AAAAAAAADP","repeats":1},{"count":216,"lower_bound":"A4AAAAAAAADQ","upper_bound":"A4AAAAAAAADX","repeats":1},{"count":224,"lower_bound":"A4AAAAAAAADY","upper_bound":"A4AAAAAAAADf","repeats":1},{"count":232,"lower_bound":"A4AAAAAAAADg","upper_bound":"A4AAAAAAAADn","repeats":1},{"count":240,"lower_bound":"A4AAAAAAAADo","upper_bound":"A4AAAAAAAADv","repeats":1},{"count":248,"lower_bound":"A4AAAAAAAADw","upper_bound":"A4AAAAAAAAD3","repeats":1},{"count":256,"lower_bound":"A4AAAAAAAAD4","upper_bound":"A4AAAAAAAAD/","repeats":1},{"count":264,"lower_bound":"A4AAAAAAAAEA","upper_bound":"A4AAAAAAAAEH","repeats":1},{"count":272,"lower_bound":"A4AAAAAAAAEI","upper_bound":"A4AAAAAAAAEP","repeats":1},{"count":280,"lower_bound":"A4AAAAAAAAEQ","upper_bound":"A4AAAAAAAAEX","repeats":1},{"count":288,"lower_bound":"A4AAAAAAAAEY","upper_bound":"A4AAAAAAAAEf","repeats":1},{"count":296,"lower_bound":"A4AAAAAAAAEg","upper_bound":"A4AAAAAAAAEn","repeats":1},{"count":304,"lower_bound":"A4AAAAAAAAEo","upper_bound":"A4AAAAAAAAEv","repeats":1},{"count":312,"lower_bound":"A4AAAAAAAAEw","upper_bound":"A4AAAAAAAAE3","repeats":1},{"count":320,"lower_bound":"A4AAAAAAAAE4","upper_bound":"A4AAAAAAAAE/","repeats":1},{"count":328,"lower_bound":"A4AAAAAAAAFA","upper_bound":"A4AAAAAAAAFH","repeats":1},{"count":336,"lower_bound":"A4AAAAAAAAFI","upper_bound":"A4AAAAAAAAFP","repeats":1},{"count":344,"lower_bound":"A4AAAAAAAAFQ","upper_bound":"A4AAAAAAAAFX","repeats":1},{"count":352,"lower_bound":"A4AAAAAAAAFY","upper_bound":"A4AAAAAAAAFf","repeats":1},{"count":360,"lower_bound":"A4AAAAAAAAFg","upper_bound":"A4AAAAAAAAFn","repeats":1},{"count":368,"lower_bound":"A4AAAAAAAAFo","upper_bound":"A4AAAAAAAAFv","repeats":1},{"count":376,"lower_bound":"A4AAAAAAAAFw","upper_bound":"A4AAAAAAAAF3","repeats":1},{"count":384,"lower_bound":"A4AAAAAAAAF4","upper_bound":"A4AAAAAAAAF/","repeats":1},{"count":392,"lower_bound":"A4AAAAAAAAGA","upper_bound":"A4AAAAAAAAGH","repeats":1},{"count":400,"lower_bound":"A4AAAAAAAAGI","upper_bound":"A4AAAAAAAAGP","repeats":1},{"count":408,"lower_bound":"A4AAAAAAAAGQ","upper_bound":"A4AAAAAAAAGX","repeats":1},{"count":416,"lower_bound":"A4AAAAAAAAGY","upper_bound":"A4AAAAAAAAGf","repeats":1},{"count":424,"lower_bound":"A4AAAAAAAAGg","upper_bound":"A4AAAAAAAAGn","repeats":1},{"count":432,"lower_bound":"A4AAAAAAAAGo","upper_bound":"A4AAAAAAAAGv","repeats":1},{"count":440,"lower_bound":"A4AAAAAAAAGw","upper_bound":"A4AAAAAAAAG3","repeats":1},{"count":448,"lower_bound":"A4AAAAAAAAG4","upper_bound":"A4AAAAAAAAG/","repeats":1},{"count":456,"lower_bound":"A4AAAAAAAAHA","upper_bound":"A4AAAAAAAAHH","repeats":1},{"count":464,"lower_bound":"A4AAAAAAAAHI","upper_bound":"A4AAAAAAAAHP","repeats":1},{"count":472,"lower_bound":"A4AAAAAAAAHQ","upper_bound":"A4AAAAAAAAHX","repeats":1},{"count":480,"lower_bound":"A4AAAAAAAAHY","upper_bound":"A4AAAAAAAAHf","repeats":1},{"count":488,"lower_bound":"A4AAAAAAAAHg","upper_bound":"A4AAAAAAAAHn","repeats":1},{"count":496,"lower_bound":"A4AAAAAAAAHo","upper_bound":"A4AAAAAAAAHv","repeats":1},{"count":504,"lower_bound":"A4AAAAAAAAHw","upper_bound":"A4AAAAAAAAH3","repeats":1},{"count":512,"lower_bound":"A4AAAAAAAAH4","upper_bound":"A4AAAAAAAAH/","repeats":1},{"count":520,"lower_bound":"A4AAAAAAAAIA","upper_bound":"A4AAAAAAAAIH","repeats":1},{"count":528,"lower_bound":"A4AAAAAAAAII","upper_bound":"A4AAAAAAAAIP","repeats":1},{"count":536,"lower_bound":"A4AAAAAAAAIQ","upper_bound":"A4AAAAAAAAIX","repeats":1},{"count":544,"lower_bound":"A4AAAAAAAAIY","upper_bound":"A4AAAAAAAAIf","repeats":1},{"count":552,"lower_bound":"A4AAAAAAAAIg","upper_bound":"A4AAAAAAAAIn","repeats":1},{"count":560,"lower_bound":"A4AAAAAAAAIo","upper_bound":"A4AAAAAAAAIv","repeats":1},{"count":568,"lower_bound":"A4AAAAAAAAIw","upper_bound":"A4AAAAAAAAI3","repeats":1},{"count":576,"lower_bound":"A4AAAAAAAAI4","upper_bound":"A4AAAAAAAAI/","repeats":1},{"count":584,"lower_bound":"A4AAAAAAAAJA","upper_bound":"A4AAAAAAAAJH","repeats":1},{"count":592,"lower_bound":"A4AAAAAAAAJI","upper_bound":"A4AAAAAAAAJP","repeats":1},{"count":600,"lower_bound":"A4AAAAAAAAJQ","upper_bound":"A4AAAAAAAAJX","repeats":1},{"count":608,"lower_bound":"A4AAAAAAAAJY","upper_bound":"A4AAAAAAAAJf","repeats":1},{"count":616,"lower_bound":"A4AAAAAAAAJg","upper_bound":"A4AAAAAAAAJn","repeats":1},{"count":624,"lower_bound":"A4AAAAAAAAJo","upper_bound":"A4AAAAAAAAJv","repeats":1},{"count":632,"lower_bound":"A4AAAAAAAAJw","upper_bound":"A4AAAAAAAAJ3","repeats":1},{"count":640,"lower_bound":"A4AAAAAAAAJ4","upper_bound":"A4AAAAAAAAJ/","repeats":1},{"count":648,"lower_bound":"A4AAAAAAAAKA","upper_bound":"A4AAAAAAAAKH","repeats":1},{"count":656,"lower_bound":"A4AAAAAAAAKI","upper_bound":"A4AAAAAAAAKP","repeats":1},{"count":664,"lower_bound":"A4AAAAAAAAKQ","upper_bound":"A4AAAAAAAAKX","repeats":1},{"count":672,"lower_bound":"A4AAAAAAAAKY","upper_bound":"A4AAAAAAAAKf","repeats":1},{"count":680,"lower_bound":"A4AAAAAAAAKg","upper_bound":"A4AAAAAAAAKn","repeats":1},{"count":688,"lower_bound":"A4AAAAAAAAKo","upper_bound":"A4AAAAAAAAKv","repeats":1},{"count":696,"lower_bound":"A4AAAAAAAAKw","upper_bound":"A4AAAAAAAAK3","repeats":1},{"count":704,"lower_bound":"A4AAAAAAAAK4","upper_bound":"A4AAAAAAAAK/","repeats":1},{"count":712,"lower_bound":"A4AAAAAAAALA","upper_bound":"A4AAAAAAAALH","repeats":1},{"count":720,"lower_bound":"A4AAAAAAAALI","upper_bound":"A4AAAAAAAALP","repeats":1},{"count":728,"lower_bound":"A4AAAAAAAALQ","upper_bound":"A4AAAAAAAALX","repeats":1},{"count":736,"lower_bound":"A4AAAAAAAALY","upper_bound":"A4AAAAAAAALf","repeats":1},{"count":744,"lower_bound":"A4AAAAAAAALg","upper_bound":"A4AAAAAAAALn","repeats":1},{"count":752,"lower_bound":"A4AAAAAAAALo","upper_bound":"A4AAAAAAAALv","repeats":1},{"count":760,"lower_bound":"A4AAAAAAAALw","upper_bound":"A4AAAAAAAAL3","repeats":1},{"count":768,"lower_bound":"A4AAAAAAAAL4","upper_bound":"A4AAAAAAAAL/","repeats":1},{"count":776,"lower_bound":"A4AAAAAAAAMA","upper_bound":"A4AAAAAAAAMH","repeats":1},{"count":784,"lower_bound":"A4AAAAAAAAMI","upper_bound":"A4AAAAAAAAMP","repeats":1},{"count":792,"lower_bound":"A4AAAAAAAAMQ","upper_bound":"A4AAAAAAAAMX","repeats":1},{"count":800,"lower_bound":"A4AAAAAAAAMY","upper_bound":"A4AAAAAAAAMf","repeats":1},{"count":808,"lower_bound":"A4AAAAAAAAMg","upper_bound":"A4AAAAAAAAMn","repeats":1},{"count":816,"lower_bound":"A4AAAAAAAAMo","upper_bound":"A4AAAAAAAAMv","repeats":1},{"count":824,"lower_bound":"A4AAAAAAAAMw","upper_bound":"A4AAAAAAAAM3","repeats":1},{"count":832,"lower_bound":"A4AAAAAAAAM4","upper_bound":"A4AAAAAAAAM/","repeats":1},{"count":840,"lower_bound":"A4AAAAAAAANA","upper_bound":"A4AAAAAAAANH","repeats":1},{"count":848,"lower_bound":"A4AAAAAAAANI","upper_bound":"A4AAAAAAAANP","repeats":1},{"count":856,"lower_bound":"A4AAAAAAAANQ","upper_bound":"A4AAAAAAAANX","repeats":1},{"count":864,"lower_bound":"A4AAAAAAAANY","upper_bound":"A4AAAAAAAANf","repeats":1},{"count":872,"lower_bound":"A4AAAAAAAANg","upper_bound":"A4AAAAAAAANn","repeats":1},{"count":880,"lower_bound":"A4AAAAAAAANo","upper_bound":"A4AAAAAAAANv","repeats":1},{"count":888,"lower_bound":"A4AAAAAAAANw","upper_bound":"A4AAAAAAAAN3","repeats":1},{"count":896,"lower_bound":"A4AAAAAAAAN4","upper_bound":"A4AAAAAAAAN/","repeats":1},{"count":904,"lower_bound":"A4AAAAAAAAOA","upper_bound":"A4AAAAAAAAOH","repeats":1},{"count":912,"lower_bound":"A4AAAAAAAAOI","upper_bound":"A4AAAAAAAAOP","repeats":1},{"count":920,"lower_bound":"A4AAAAAAAAOQ","upper_bound":"A4AAAAAAAAOX","repeats":1},{"count":928,"lower_bound":"A4AAAAAAAAOY","upper_bound":"A4AAAAAAAAOf","repeats":1},{"count":936,"lower_bound":"A4AAAAAAAAOg","upper_bound":"A4AAAAAAAAOn","repeats":1},{"count":944,"lower_bound":"A4AAAAAAAAOo","upper_bound":"A4AAAAAAAAOv","repeats":1},{"count":952,"lower_bound":"A4AAAAAAAAOw","upper_bound":"A4AAAAAAAAO3","repeats":1},{"count":960,"lower_bound":"A4AAAAAAAAO4","upper_bound":"A4AAAAAAAAO/","repeats":1},{"count":968,"lower_bound":"A4AAAAAAAAPA","upper_bound":"A4AAAAAAAAPH","repeats":1},{"count":976,"lower_bound":"A4AAAAAAAAPI","upper_bound":"A4AAAAAAAAPP","repeats":1},{"count":984,"lower_bound":"A4AAAAAAAAPQ","upper_bound":"A4AAAAAAAAPX","repeats":1},{"count":992,"lower_bound":"A4AAAAAAAAPY","upper_bound":"A4AAAAAAAAPf","repeats":1},{"count":1000,"lower_bound":"A4AAAAAAAAPg","upper_bound":"A4AAAAAAAAPn","repeats":1},{"count":1008,"lower_bound":"A4AAAAAAAAPo","upper_bound":"A4AAAAAAAAPv","repeats":1},{"count":1016,"lower_bound":"A4AAAAAAAAPw","upper_bound":"A4AAAAAAAAP3","repeats":1},{"count":1024,"lower_bound":"A4AAAAAAAAP4","upper_bound":"A4AAAAAAAAP/","repeats":1},{"count":1032,"lower_bound":"A4AAAAAAAAQA","upper_bound":"A4AAAAAAAAQH","repeats":1},{"count":1040,"lower_bound":"A4AAAAAAAAQI","upper_bound":"A4AAAAAAAAQP","repeats":1},{"count":1048,"lower_bound":"A4AAAAAAAAQQ","upper_bound":"A4AAAAAAAAQX","repeats":1},{"count":1056,"lower_bound":"A4AAAAAAAAQY","upper_bound":"A4AAAAAAAAQf","repeats":1},{"count":1064,"lower_bound":"A4AAAAAAAAQg","upper_bound":"A4AAAAAAAAQn","repeats":1},{"count":1072,"lower_bound":"A4AAAAAAAAQo","upper_bound":"A4AAAAAAAAQv","repeats":1},{"count":1080,"lower_bound":"A4AAAAAAAAQw","upper_bound":"A4AAAAAAAAQ3","repeats":1},{"count":1088,"lower_bound":"A4AAAAAAAAQ4","upper_bound":"A4AAAAAAAAQ/","repeats":1},{"count":1096,"lower_bound":"A4AAAAAAAARA","upper_bound":"A4AAAAAAAARH","repeats":1},{"count":1104,"lower_bound":"A4AAAAAAAARI","upper_bound":"A4AAAAAAAARP","repeats":1},{"count":1112,"lower_bound":"A4AAAAAAAARQ","upper_bound":"A4AAAAAAAARX","repeats":1},{"count":1120,"lower_bound":"A4AAAAAAAARY","upper_bound":"A4AAAAAAAARf","repeats":1},{"count":1128,"lower_bound":"A4AAAAAAAARg","upper_bound":"A4AAAAAAAARn","repeats":1},{"count":1136,"lower_bound":"A4AAAAAAAARo","upper_bound":"A4AAAAAAAARv","repeats":1},{"count":1144,"lower_bound":"A4AAAAAAAARw","upper_bound":"A4AAAAAAAAR3","repeats":1},{"count":1152,"lower_bound":"A4AAAAAAAAR4","upper_bound":"A4AAAAAAAAR/","repeats":1},{"count":1160,"lower_bound":"A4AAAAAAAASA","upper_bound":"A4AAAAAAAASH","repeats":1},{"count":1168,"lower_bound":"A4AAAAAAAASI","upper_bound":"A4AAAAAAAASP","repeats":1},{"count":1176,"lower_bound":"A4AAAAAAAASQ","upper_bound":"A4AAAAAAAASX","repeats":1},{"count":1184,"lower_bound":"A4AAAAAAAASY","upper_bound":"A4AAAAAAAASf","repeats":1},{"count":1192,"lower_bound":"A4AAAAAAAASg","upper_bound":"A4AAAAAAAASn","repeats":1},{"count":1200,"lower_bound":"A4AAAAAAAASo","upper_bound":"A4AAAAAAAASv","repeats":1},{"count":1208,"lower_bound":"A4AAAAAAAASw","upper_bound":"A4AAAAAAAAS3","repeats":1},{"count":1216,"lower_bound":"A4AAAAAAAAS4","upper_bound":"A4AAAAAAAAS/","repeats":1},{"count":1224,"lower_bound":"A4AAAAAAAATA","upper_bound":"A4AAAAAAAATH","repeats":1},{"count":1232,"lower_bound":"A4AAAAAAAATI","upper_bound":"A4AAAAAAAATP","repeats":1},{"count":1240,"lower_bound":"A4AAAAAAAATQ","upper_bound":"A4AAAAAAAATX","repeats":1},{"count":1248,"lower_bound":"A4AAAAAAAATY","upper_bound":"A4AAAAAAAATf","repeats":1},{"count":1256,"lower_bound":"A4AAAAAAAATg","upper_bound":"A4AAAAAAAATn","repeats":1},{"count":1264,"lower_bound":"A4AAAAAAAATo","upper_bound":"A4AAAAAAAATv","repeats":1},{"count":1272,"lower_bound":"A4AAAAAAAATw","upper_bound":"A4AAAAAAAAT3","repeats":1},{"count":1280,"lower_bound":"A4AAAAAAAAT4","upper_bound":"A4AAAAAAAAT/","repeats":1},{"count":1288,"lower_bound":"A4AAAAAAAAUA","upper_bound":"A4AAAAAAAAUH","repeats":1},{"count":1296,"lower_bound":"A4AAAAAAAAUI","upper_bound":"A4AAAAAAAAUP","repeats":1},{"count":1304,"lower_bound":"A4AAAAAAAAUQ","upper_bound":"A4AAAAAAAAUX","repeats":1},{"count":1312,"lower_bound":"A4AAAAAAAAUY","upper_bound":"A4AAAAAAAAUf","repeats":1},{"count":1320,"lower_bound":"A4AAAAAAAAUg","upper_bound":"A4AAAAAAAAUn","repeats":1},{"count":1328,"lower_bound":"A4AAAAAAAAUo","upper_bound":"A4AAAAAAAAUv","repeats":1},{"count":1336,"lower_bound":"A4AAAAAAAAUw","upper_bound":"A4AAAAAAAAU3","repeats":1},{"count":1344,"lower_bound":"A4AAAAAAAAU4","upper_bound":"A4AAAAAAAAU/","repeats":1},{"count":1352,"lower_bound":"A4AAAAAAAAVA","upper_bound":"A4AAAAAAAAVH","repeats":1},{"count":1360,"lower_bound":"A4AAAAAAAAVI","upper_bound":"A4AAAAAAAAVP","repeats":1},{"count":1368,"lower_bound":"A4AAAAAAAAVQ","upper_bound":"A4AAAAAAAAVX","repeats":1},{"count":1376,"lower_bound":"A4AAAAAAAAVY","upper_bound":"A4AAAAAAAAVf","repeats":1},{"count":1384,"lower_bound":"A4AAAAAAAAVg","upper_bound":"A4AAAAAAAAVn","repeats":1},{"count":1392,"lower_bound":"A4AAAAAAAAVo","upper_bound":"A4AAAAAAAAVv","repeats":1},{"count":1400,"lower_bound":"A4AAAAAAAAVw","upper_bound":"A4AAAAAAAAV3","repeats":1},{"count":1408,"lower_bound":"A4AAAAAAAAV4","upper_bound":"A4AAAAAAAAV/","repeats":1},{"count":1416,"lower_bound":"A4AAAAAAAAWA","upper_bound":"A4AAAAAAAAWH","repeats":1},{"count":1424,"lower_bound":"A4AAAAAAAAWI","upper_bound":"A4AAAAAAAAWP","repeats":1},{"count":1432,"lower_bound":"A4AAAAAAAAWQ","upper_bound":"A4AAAAAAAAWX","repeats":1},{"count":1440,"lower_bound":"A4AAAAAAAAWY","upper_bound":"A4AAAAAAAAWf","repeats":1},{"count":1448,"lower_bound":"A4AAAAAAAAWg","upper_bound":"A4AAAAAAAAWn","repeats":1},{"count":1456,"lower_bound":"A4AAAAAAAAWo","upper_bound":"A4AAAAAAAAWv","repeats":1},{"count":1464,"lower_bound":"A4AAAAAAAAWw","upper_bound":"A4AAAAAAAAW3","repeats":1},{"count":1472,"lower_bound":"A4AAAAAAAAW4","upper_bound":"A4AAAAAAAAW/","repeats":1},{"count":1480,"lower_bound":"A4AAAAAAAAXA","upper_bound":"A4AAAAAAAAXH","repeats":1},{"count":1488,"lower_bound":"A4AAAAAAAAXI","upper_bound":"A4AAAAAAAAXP","repeats":1},{"count":1496,"lower_bound":"A4AAAAAAAAXQ","upper_bound":"A4AAAAAAAAXX","repeats":1},{"count":1504,"lower_bound":"A4AAAAAAAAXY","upper_bound":"A4AAAAAAAAXf","repeats":1},{"count":1512,"lower_bound":"A4AAAAAAAAXg","upper_bound":"A4AAAAAAAAXn","repeats":1},{"count":1520,"lower_bound":"A4AAAAAAAAXo","upper_bound":"A4AAAAAAAAXv","repeats":1},{"count":1528,"lower_bound":"A4AAAAAAAAXw","upper_bound":"A4AAAAAAAAX3","repeats":1},{"count":1536,"lower_bound":"A4AAAAAAAAX4","upper_bound":"A4AAAAAAAAX/","repeats":1},{"count":1544,"lower_bound":"A4AAAAAAAAYA","upper_bound":"A4AAAAAAAAYH","repeats":1},{"count":1552,"lower_bound":"A4AAAAAAAAYI","upper_bound":"A4AAAAAAAAYP","repeats":1},{"count":1560,"lower_bound":"A4AAAAAAAAYQ","upper_bound":"A4AAAAAAAAYX","repeats":1},{"count":1568,"lower_bound":"A4AAAAAAAAYY","upper_bound":"A4AAAAAAAAYf","repeats":1},{"count":1576,"lower_bound":"A4AAAAAAAAYg","upper_bound":"A4AAAAAAAAYn","repeats":1},{"count":1584,"lower_bound":"A4AAAAAAAAYo","upper_bound":"A4AAAAAAAAYv","repeats":1},{"count":1592,"lower_bound":"A4AAAAAAAAYw","upper_bound":"A4AAAAAAAAY3","repeats":1},{"count":1600,"lower_bound":"A4AAAAAAAAY4","upper_bound":"A4AAAAAAAAY/","repeats":1},{"count":1608,"lower_bound":"A4AAAAAAAAZA","upper_bound":"A4AAAAAAAAZH","repeats":1},{"count":1616,"lower_bound":"A4AAAAAAAAZI","upper_bound":"A4AAAAAAAAZP","repeats":1},{"count":1624,"lower_bound":"A4AAAAAAAAZQ","upper_bound":"A4AAAAAAAAZX","repeats":1},{"count":1632,"lower_bound":"A4AAAAAAAAZY","upper_bound":"A4AAAAAAAAZf","repeats":1},{"count":1640,"lower_bound":"A4AAAAAAAAZg","upper_bound":"A4AAAAAAAAZn","repeats":1},{"count":1648,"lower_bound":"A4AAAAAAAAZo","upper_bound":"A4AAAAAAAAZv","repeats":1},{"count":1656,"lower_bound":"A4AAAAAAAAZw","upper_bound":"A4AAAAAAAAZ3","repeats":1},{"count":1664,"lower_bound":"A4AAAAAAAAZ4","upper_bound":"A4AAAAAAAAZ/","repeats":1},{"count":1672,"lower_bound":"A4AAAAAAAAaA","upper_bound":"A4AAAAAAAAaH","repeats":1},{"count":1680,"lower_bound":"A4AAAAAAAAaI","upper_bound":"A4AAAAAAAAaP","repeats":1},{"count":1688,"lower_bound":"A4AAAAAAAAaQ","upper_bound":"A4AAAAAAAAaX","repeats":1},{"count":1696,"lower_bound":"A4AAAAAAAAaY","upper_bound":"A4AAAAAAAAaf","repeats":1},{"count":1704,"lower_bound":"A4AAAAAAAAag","upper_bound":"A4AAAAAAAAan","repeats":1},{"count":1712,"lower_bound":"A4AAAAAAAAao","upper_bound":"A4AAAAAAAAav","repeats":1},{"count":1720,"lower_bound":"A4AAAAAAAAaw","upper_bound":"A4AAAAAAAAa3","repeats":1},{"count":1728,"lower_bound":"A4AAAAAAAAa4","upper_bound":"A4AAAAAAAAa/","repeats":1},{"count":1736,"lower_bound":"A4AAAAAAAAbA","upper_bound":"A4AAAAAAAAbH","repeats":1},{"count":1744,"lower_bound":"A4AAAAAAAAbI","upper_bound":"A4AAAAAAAAbP","repeats":1},{"count":1752,"lower_bound":"A4AAAAAAAAbQ","upper_bound":"A4AAAAAAAAbX","repeats":1},{"count":1760,"lower_bound":"A4AAAAAAAAbY","upper_bound":"A4AAAAAAAAbf","repeats":1},{"count":1768,"lower_bound":"A4AAAAAAAAbg","upper_bound":"A4AAAAAAAAbn","repeats":1},{"count":1776,"lower_bound":"A4AAAAAAAAbo","upper_bound":"A4AAAAAAAAbv","repeats":1},{"count":1784,"lower_bound":"A4AAAAAAAAbw","upper_bound":"A4AAAAAAAAb3","repeats":1},{"count":1792,"lower_bound":"A4AAAAAAAAb4","upper_bound":"A4AAAAAAAAb/","repeats":1},{"count":1800,"lower_bound":"A4AAAAAAAAcA","upper_bound":"A4AAAAAAAAcH","repeats":1},{"count":1808,"lower_bound":"A4AAAAAAAAcI","upper_bound":"A4AAAAAAAAcP","repeats":1},{"count":1816,"lower_bound":"A4AAAAAAAAcQ","upper_bound":"A4AAAAAAAAcX","repeats":1},{"count":1824,"lower_bound":"A4AAAAAAAAcY","upper_bound":"A4AAAAAAAAcf","repeats":1},{"count":1832,"lower_bound":"A4AAAAAAAAcg","upper_bound":"A4AAAAAAAAcn","repeats":1},{"count":1840,"lower_bound":"A4AAAAAAAAco","upper_bound":"A4AAAAAAAAcv","repeats":1},{"count":1848,"lower_bound":"A4AAAAAAAAcw","upper_bound":"A4AAAAAAAAc3","repeats":1},{"count":1856,"lower_bound":"A4AAAAAAAAc4","upper_bound":"A4AAAAAAAAc/","repeats":1},{"count":1864,"lower_bound":"A4AAAAAAAAdA","upper_bound":"A4AAAAAAAAdH","repeats":1},{"count":1872,"lower_bound":"A4AAAAAAAAdI","upper_bound":"A4AAAAAAAAdP","repeats":1},{"count":1880,"lower_bound":"A4AAAAAAAAdQ","upper_bound":"A4AAAAAAAAdX","repeats":1},{"count":1888,"lower_bound":"A4AAAAAAAAdY","upper_bound":"A4AAAAAAAAdf","repeats":1},{"count":1896,"lower_bound":"A4AAAAAAAAdg","upper_bound":"A4AAAAAAAAdn","repeats":1},{"count":1904,"lower_bound":"A4AAAAAAAAdo","upper_bound":"A4AAAAAAAAdv","repeats":1},{"count":1912,"lower_bound":"A4AAAAAAAAdw","upper_bound":"A4AAAAAAAAd3","repeats":1},{"count":1920,"lower_bound":"A4AAAAAAAAd4","upper_bound":"A4AAAAAAAAd/","repeats":1},{"count":1928,"lower_bound":"A4AAAAAAAAeA","upper_bound":"A4AAAAAAAAeH","repeats":1},{"count":1936,"lower_bound":"A4AAAAAAAAeI","upper_bound":"A4AAAAAAAAeP","repeats":1},{"count":1944,"lower_bound":"A4AAAAAAAAeQ","upper_bound":"A4AAAAAAAAeX","repeats":1},{"count":1952,"lower_bound":"A4AAAAAAAAeY","upper_bound":"A4AAAAAAAAef","repeats":1},{"count":1960,"lower_bound":"A4AAAAAAAAeg","upper_bound":"A4AAAAAAAAen","repeats":1},{"count":1968,"lower_bound":"A4AAAAAAAAeo","upper_bound":"A4AAAAAAAAev","repeats":1},{"count":1976,"lower_bound":"A4AAAAAAAAew","upper_bound":"A4AAAAAAAAe3","repeats":1},{"count":1984,"lower_bound":"A4AAAAAAAAe4","upper_bound":"A4AAAAAAAAe/","repeats":1},{"count":1992,"lower_bound":"A4AAAAAAAAfA","upper_bound":"A4AAAAAAAAfH","repeats":1},{"count":2000,"lower_bound":"A4AAAAAAAAfI","upper_bound":"A4AAAAAAAAfP","repeats":1}]},"cm_sketch":null,"null_count":0,"last_update_version":397952054633693184}},"count":1985,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_easy_stats_t3.json b/cmd/explaintest/s/explain_easy_stats_t3.json deleted file mode 100644 index c4e010049d880..0000000000000 --- a/cmd/explaintest/s/explain_easy_stats_t3.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"t3","columns":{"a":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDYwOTg3MjI=","upper_bound":"LTIxMzE4OTUxNTQ=","repeats":1},{"count":16,"lower_bound":"LTIxMjYwMTk4NjM=","upper_bound":"LTIxMDEyNDIxNjc=","repeats":1},{"count":24,"lower_bound":"LTIwOTg3Mjk3MTM=","upper_bound":"LTIwOTQ0MTU2MDU=","repeats":1},{"count":32,"lower_bound":"LTIwODYxNzAxMjE=","upper_bound":"LTIwODM1MDMxODU=","repeats":1},{"count":40,"lower_bound":"LTIwNzk3MzY4MjY=","upper_bound":"LTIwNjk3MjM3MjM=","repeats":1},{"count":48,"lower_bound":"LTIwNjU4NTYzMTA=","upper_bound":"LTIwNDE0MTU0Nzk=","repeats":1},{"count":56,"lower_bound":"LTIwMzMzNjczNDU=","upper_bound":"LTIwMjE5Mjk3MjQ=","repeats":1},{"count":64,"lower_bound":"LTIwMTk0NjgzMjg=","upper_bound":"LTIwMTExNTMyMzM=","repeats":1},{"count":72,"lower_bound":"LTIwMDU5NDYyNDE=","upper_bound":"LTE5Nzk2NzY1OTQ=","repeats":1},{"count":80,"lower_bound":"LTE5Nzk1MjUxNDc=","upper_bound":"LTE5NzUzNjc1NjM=","repeats":1},{"count":88,"lower_bound":"LTE5NzQ4MDEzNTY=","upper_bound":"LTE5NjIzNzAzOTk=","repeats":1},{"count":96,"lower_bound":"LTE5NjE1MDI0MjE=","upper_bound":"LTE5NTY1MDM3NDE=","repeats":1},{"count":104,"lower_bound":"LTE5NTYwODUwNDk=","upper_bound":"LTE5NDA2MjYxMjQ=","repeats":1},{"count":112,"lower_bound":"LTE5MzY4NTg4MTE=","upper_bound":"LTE5MzIyNzkwNDU=","repeats":1},{"count":120,"lower_bound":"LTE5Mjc5MDM0Nzg=","upper_bound":"LTE5MTY3NDEyNTg=","repeats":1},{"count":128,"lower_bound":"LTE5MTQxNzE5OTE=","upper_bound":"LTE5MDY0NDQ1MTY=","repeats":1},{"count":136,"lower_bound":"LTE5MDYxMjEwNzk=","upper_bound":"LTE4OTgxNDY5MjE=","repeats":1},{"count":144,"lower_bound":"LTE4OTczOTIxMTc=","upper_bound":"LTE4OTMxNjkwNTc=","repeats":1},{"count":152,"lower_bound":"LTE4OTExNjAyNTc=","upper_bound":"LTE4ODg2NTY3ODY=","repeats":1},{"count":160,"lower_bound":"LTE4Nzk3Njg4NTk=","upper_bound":"LTE4Njc0NjI1MzM=","repeats":1},{"count":168,"lower_bound":"LTE4NjczNzQxNjU=","upper_bound":"LTE4NTg5MDQxMzg=","repeats":1},{"count":176,"lower_bound":"LTE4NDk2ODM4MTA=","upper_bound":"LTE4MzYzMDk4MDU=","repeats":1},{"count":184,"lower_bound":"LTE4MzUxNjQwMzc=","upper_bound":"LTE4MTI1MzYwMTI=","repeats":1},{"count":192,"lower_bound":"LTE3OTk4NzI5ODU=","upper_bound":"LTE3NzQxNTQ4MTg=","repeats":1},{"count":200,"lower_bound":"LTE3NjcxNDE3ODg=","upper_bound":"LTE3NDkzNzE1MzU=","repeats":1},{"count":208,"lower_bound":"LTE3NDY2Mjg2NDU=","upper_bound":"LTE3Mzk2Njg1NTY=","repeats":1},{"count":216,"lower_bound":"LTE3MzI2NzY3OTE=","upper_bound":"LTE3MjYxOTI3MTk=","repeats":1},{"count":224,"lower_bound":"LTE3MjYxMDU5ODA=","upper_bound":"LTE3MTY5ODQ1OTM=","repeats":1},{"count":232,"lower_bound":"LTE3MDU5Mjg3ODc=","upper_bound":"LTE2OTcwMTI5NDA=","repeats":1},{"count":240,"lower_bound":"LTE2ODQ4OTYyNjU=","upper_bound":"LTE2NjE4MTczNjU=","repeats":1},{"count":248,"lower_bound":"LTE2NTg1MTA0Mzc=","upper_bound":"LTE2NTU2NTQ3MDM=","repeats":1},{"count":256,"lower_bound":"LTE2NTI4ODU0NzU=","upper_bound":"LTE2NDY3NDUwNTA=","repeats":1},{"count":264,"lower_bound":"LTE2NDM1MzQ1NzM=","upper_bound":"LTE2Mjk3NzA4NzE=","repeats":1},{"count":272,"lower_bound":"LTE2Mjk3NTU1NTM=","upper_bound":"LTE2MDIwMDY5NjM=","repeats":1},{"count":280,"lower_bound":"LTE2MDEyNzQ0ODA=","upper_bound":"LTE1OTQ3MTY5NTE=","repeats":1},{"count":288,"lower_bound":"LTE1OTM5NTY4MjM=","upper_bound":"LTE1ODQxOTc1NjY=","repeats":1},{"count":296,"lower_bound":"LTE1ODM0MjExMTQ=","upper_bound":"LTE1NzczMTE5Mzk=","repeats":1},{"count":304,"lower_bound":"LTE1NjI3NDAzMTM=","upper_bound":"LTE1NTU5NDQ2OTM=","repeats":1},{"count":312,"lower_bound":"LTE1NTIyMjI5Mzg=","upper_bound":"LTE1NDIzOTQ3NTQ=","repeats":1},{"count":320,"lower_bound":"LTE1Mzk1MDg3MTA=","upper_bound":"LTE1MTU0NjY3OTE=","repeats":1},{"count":328,"lower_bound":"LTE1MDc0NTE5ODk=","upper_bound":"LTE0OTc1MTM5NTY=","repeats":1},{"count":336,"lower_bound":"LTE0OTc0MzEyMzI=","upper_bound":"LTE0ODUwNDM2MjI=","repeats":1},{"count":344,"lower_bound":"LTE0ODE4OTQ1NjY=","upper_bound":"LTE0NjczMTUzMzU=","repeats":1},{"count":352,"lower_bound":"LTE0NTA2ODMwMjY=","upper_bound":"LTE0Mzk4MzIwNzg=","repeats":1},{"count":360,"lower_bound":"LTE0MzIyODE5NTc=","upper_bound":"LTE0MjgyMDYyOTA=","repeats":1},{"count":368,"lower_bound":"LTE0MTQyNzU1Njg=","upper_bound":"LTE0MDcyNDcwNTk=","repeats":1},{"count":376,"lower_bound":"LTEzOTQwNDU5NjY=","upper_bound":"LTEzODQ2MDc1Nzc=","repeats":1},{"count":384,"lower_bound":"LTEzODI4NjIxMTc=","upper_bound":"LTEzNzMwNDE3NjE=","repeats":1},{"count":392,"lower_bound":"LTEzNjk3MTA1NDc=","upper_bound":"LTEzNjMwMTQ3MjM=","repeats":1},{"count":400,"lower_bound":"LTEzNjIzNDg0MzU=","upper_bound":"LTEzNjAwOTA2MDQ=","repeats":1},{"count":408,"lower_bound":"LTEzNTczMDczNDI=","upper_bound":"LTEzMzYzMDI3NDY=","repeats":1},{"count":416,"lower_bound":"LTEzMzM5MTkzNzE=","upper_bound":"LTEzMjA0NzQwNzY=","repeats":1},{"count":424,"lower_bound":"LTEzMTY4OTkyMjc=","upper_bound":"LTEzMTQ4NzE4NTM=","repeats":1},{"count":432,"lower_bound":"LTEzMTE2NTczNzQ=","upper_bound":"LTEzMDQ4OTYzMDg=","repeats":1},{"count":440,"lower_bound":"LTEzMDQxNzkzMTY=","upper_bound":"LTEyOTgyNzgwNDE=","repeats":1},{"count":448,"lower_bound":"LTEyOTcxMjYzNjE=","upper_bound":"LTEyODQxMDkzMjI=","repeats":1},{"count":456,"lower_bound":"LTEyODI1NDUzNTg=","upper_bound":"LTEyNjIwNjY3MTU=","repeats":1},{"count":464,"lower_bound":"LTEyNTg2NTM4MDU=","upper_bound":"LTEyMzQ0MTMyNzQ=","repeats":1},{"count":472,"lower_bound":"LTEyMjU4NTk3NjY=","upper_bound":"LTEyMjQwMzY3MjE=","repeats":1},{"count":480,"lower_bound":"LTEyMjA2ODQzNzk=","upper_bound":"LTEyMTc1NDgwNDQ=","repeats":1},{"count":488,"lower_bound":"LTEyMTcxNDE4ODI=","upper_bound":"LTExODQ5OTM5NTg=","repeats":1},{"count":496,"lower_bound":"LTExODMwOTI1MTQ=","upper_bound":"LTExNjkzMDI2Mzg=","repeats":1},{"count":504,"lower_bound":"LTExNjY4NjU4NzA=","upper_bound":"LTExNTgxNDE4MTg=","repeats":1},{"count":512,"lower_bound":"LTExNTI5Mzc2MDA=","upper_bound":"LTExNDY5NTA1NjA=","repeats":1},{"count":520,"lower_bound":"LTExNDU4OTU2ODY=","upper_bound":"LTExNDA0NDM4MTM=","repeats":1},{"count":528,"lower_bound":"LTExMzUyMDcyMzg=","upper_bound":"LTExMDMwMjM5NTI=","repeats":1},{"count":536,"lower_bound":"LTEwOTU5MzI4MDA=","upper_bound":"LTEwOTE4OTcxOTE=","repeats":1},{"count":544,"lower_bound":"LTEwODcxMjQ0MDM=","upper_bound":"LTEwNjgwNTg3ODQ=","repeats":1},{"count":552,"lower_bound":"LTEwNTI4MjE0MzM=","upper_bound":"LTEwMzM1Mzc4NzY=","repeats":1},{"count":560,"lower_bound":"LTEwMzM0ODQ4MTY=","upper_bound":"LTEwMjMxMDY2MDU=","repeats":1},{"count":568,"lower_bound":"LTEwMTg0NDg5NjA=","upper_bound":"LTEwMDU1MzI1NTQ=","repeats":1},{"count":576,"lower_bound":"LTk5MzI0MzYxOA==","upper_bound":"LTk4NTMwMDIwMw==","repeats":1},{"count":584,"lower_bound":"LTk4MDI2ODk3MQ==","upper_bound":"LTk1NzQ4NzU2NQ==","repeats":1},{"count":592,"lower_bound":"LTk1NTgwMzA0Mg==","upper_bound":"LTk1MTg4MTM4NQ==","repeats":1},{"count":600,"lower_bound":"LTk0NzU1NDQyNg==","upper_bound":"LTkzMTc0OTMyMw==","repeats":1},{"count":608,"lower_bound":"LTkyNzIyODUxNw==","upper_bound":"LTkyMjc2OTQxMQ==","repeats":1},{"count":616,"lower_bound":"LTkxOTc0NDg1MA==","upper_bound":"LTg5NDMyNzkxMA==","repeats":1},{"count":624,"lower_bound":"LTg4OTYxMTg5MQ==","upper_bound":"LTg2OTQ2NjU0NA==","repeats":1},{"count":632,"lower_bound":"LTg2NDgyMzY1Ng==","upper_bound":"LTg1NjI1MzM0MQ==","repeats":1},{"count":640,"lower_bound":"LTg1NTU3MTcwNQ==","upper_bound":"LTg0NjcxMjExMw==","repeats":1},{"count":648,"lower_bound":"LTg0NTIyNTA0OA==","upper_bound":"LTgyOTQwNzI0NQ==","repeats":1},{"count":656,"lower_bound":"LTgxOTk3NzE5Mg==","upper_bound":"LTc5MDI4MzM0Mw==","repeats":1},{"count":664,"lower_bound":"LTc4NjA3MjMyNg==","upper_bound":"LTc2NjQwNDU1MA==","repeats":1},{"count":672,"lower_bound":"LTc2NDE2NzQ4Mw==","upper_bound":"LTc2MDEzOTA3Nw==","repeats":1},{"count":680,"lower_bound":"LTc2MDA4NzEwMA==","upper_bound":"LTc0MzEwMjYwOQ==","repeats":1},{"count":688,"lower_bound":"LTc0MTY2NTc0Mg==","upper_bound":"LTcyODAxMDU4Nw==","repeats":1},{"count":696,"lower_bound":"LTcyNDQxMTUwMA==","upper_bound":"LTcxNjgwMDM2OA==","repeats":1},{"count":704,"lower_bound":"LTcwNTU0NDU0Ng==","upper_bound":"LTY3ODk4MDY5Ng==","repeats":1},{"count":712,"lower_bound":"LTY3MzM5OTAyOA==","upper_bound":"LTY2NzkxODA1OA==","repeats":1},{"count":720,"lower_bound":"LTY2NDY5NzIxMw==","upper_bound":"LTY1OTc2MTQ3Nw==","repeats":1},{"count":728,"lower_bound":"LTY1Nzg5Mjc1NQ==","upper_bound":"LTYzNjczMDExNg==","repeats":1},{"count":736,"lower_bound":"LTYzNjQwMDQ0OQ==","upper_bound":"LTYyNTE4NTc1Ng==","repeats":1},{"count":744,"lower_bound":"LTYyNDE2MjI3Nw==","upper_bound":"LTYxMjY3NjM5Ng==","repeats":1},{"count":752,"lower_bound":"LTYwOTE0ODc2NQ==","upper_bound":"LTU5MTI2MzE3Nw==","repeats":1},{"count":760,"lower_bound":"LTU3NjUxMDAxMA==","upper_bound":"LTU2OTA1MDI3Ng==","repeats":1},{"count":768,"lower_bound":"LTU2Nzk1ODQ2Ng==","upper_bound":"LTUzODc1NjI1Mg==","repeats":1},{"count":776,"lower_bound":"LTUzODM4MjA2OA==","upper_bound":"LTUyNDc3MTU5OQ==","repeats":1},{"count":784,"lower_bound":"LTUyMjgzNDY0OA==","upper_bound":"LTUxNzgzMjMwOA==","repeats":1},{"count":792,"lower_bound":"LTUwNzkxNjA3Mw==","upper_bound":"LTUwMzQ4MDgwNw==","repeats":1},{"count":800,"lower_bound":"LTUwMTc0MTQ5Mg==","upper_bound":"LTQ4NTk1ODQzNg==","repeats":1},{"count":808,"lower_bound":"LTQ3NTYxNTY2Ng==","upper_bound":"LTQ2ODIwNzUzNg==","repeats":1},{"count":816,"lower_bound":"LTQ2MDMzNTE2NQ==","upper_bound":"LTQ0OTI1MTA5OQ==","repeats":1},{"count":824,"lower_bound":"LTQ0OTE5MTcyNg==","upper_bound":"LTQ0MTc4MTAzNw==","repeats":1},{"count":832,"lower_bound":"LTQxOTc4NDk4NA==","upper_bound":"LTQxNTAyNDY3NA==","repeats":1},{"count":840,"lower_bound":"LTQwODk4NjYzNw==","upper_bound":"LTM5MjQ4NTIwNA==","repeats":1},{"count":848,"lower_bound":"LTM4NDI2NjI1OQ==","upper_bound":"LTM3MTU0MTk0NA==","repeats":1},{"count":856,"lower_bound":"LTM3MDY5NDk5OA==","upper_bound":"LTM1OTYwNTc4Mw==","repeats":1},{"count":864,"lower_bound":"LTM1Mjk3MzQ5Ng==","upper_bound":"LTMzNzYzMDQ1NQ==","repeats":1},{"count":872,"lower_bound":"LTMyNDg2MTA3OA==","upper_bound":"LTMwOTM2ODE0Nw==","repeats":1},{"count":880,"lower_bound":"LTMwODI5MjEyMg==","upper_bound":"LTI5ODE0NjcxNw==","repeats":1},{"count":888,"lower_bound":"LTI5NzY3OTQ4NQ==","upper_bound":"LTI5NDE2MTY0NQ==","repeats":1},{"count":896,"lower_bound":"LTI5MjA5NDM4NA==","upper_bound":"LTI4MTQyNjgwNQ==","repeats":1},{"count":904,"lower_bound":"LTI3NTk5ODA3NQ==","upper_bound":"LTI3MTIyMDI4Mg==","repeats":1},{"count":912,"lower_bound":"LTI2NzAyMDg2NA==","upper_bound":"LTI2MDYxNjI3OA==","repeats":1},{"count":920,"lower_bound":"LTI2MDIxNDM1Ng==","upper_bound":"LTIzNzAzMDM2Mg==","repeats":1},{"count":928,"lower_bound":"LTIzNTE2Mjk5MQ==","upper_bound":"LTIyMzE3NTI1Nw==","repeats":1},{"count":936,"lower_bound":"LTIxNzQ0MTk4MA==","upper_bound":"LTIwODIzOTA2Mw==","repeats":1},{"count":944,"lower_bound":"LTIwMjUzNzUyNw==","upper_bound":"LTE3ODc2MjkxMw==","repeats":1},{"count":952,"lower_bound":"LTE3NDY5ODkzOQ==","upper_bound":"LTE1OTE1NzAzNA==","repeats":1},{"count":960,"lower_bound":"LTE1NzU0ODU1NA==","upper_bound":"LTEzODQ3MDczMg==","repeats":1},{"count":968,"lower_bound":"LTEzNzc0NzcxMw==","upper_bound":"LTEyMTk4NzIxMA==","repeats":1},{"count":976,"lower_bound":"LTExMDQxNTcxMw==","upper_bound":"LTEwNDE4NjU0MA==","repeats":1},{"count":984,"lower_bound":"LTk1NDg5NjA2","upper_bound":"LTkyMjM4Nzc1","repeats":1},{"count":992,"lower_bound":"LTkxNTc2MjM5","upper_bound":"LTgyNjM2ODI0","repeats":1},{"count":1000,"lower_bound":"LTY4MjcxNzUy","upper_bound":"LTYwNTkzNTIy","repeats":1},{"count":1008,"lower_bound":"LTUyMzc5MjQ1","upper_bound":"LTQ1ODM3Mjc2","repeats":1},{"count":1016,"lower_bound":"LTIzODk0MzQ1","upper_bound":"LTcwNzA2MTI=","repeats":1},{"count":1024,"lower_bound":"LTk3MjEwNA==","upper_bound":"MzgzMDUyMA==","repeats":1},{"count":1032,"lower_bound":"NDcwODUwMA==","upper_bound":"MTY5NjcwODU=","repeats":1},{"count":1040,"lower_bound":"MTk1ODQ4MzQ=","upper_bound":"NTcyODIwMDc=","repeats":1},{"count":1048,"lower_bound":"NTg2OTY3MjQ=","upper_bound":"ODA1OTI4NzE=","repeats":1},{"count":1056,"lower_bound":"ODcwMDA3Mjk=","upper_bound":"ODkyNzM2Mjc=","repeats":1},{"count":1064,"lower_bound":"OTE0NTkwNjc=","upper_bound":"MTAxNTQzNjcz","repeats":1},{"count":1072,"lower_bound":"MTA3NDIxNDk2","upper_bound":"MTI0MjA3ODg2","repeats":1},{"count":1080,"lower_bound":"MTM5OTAxNTcy","upper_bound":"MTYzMTc0Njk1","repeats":1},{"count":1088,"lower_bound":"MTY2ODI3MDUy","upper_bound":"MTcxNzMxNDE0","repeats":1},{"count":1096,"lower_bound":"MTc2Mzk0Njkz","upper_bound":"MTg5OTU4OTQx","repeats":1},{"count":1104,"lower_bound":"MTkxMTkzODI3","upper_bound":"MjAzOTc0ODI3","repeats":1},{"count":1112,"lower_bound":"MjA1ODQ2ODU2","upper_bound":"MjEyODc4MjQ3","repeats":1},{"count":1120,"lower_bound":"MjEyODg5Mjg2","upper_bound":"MjI2NzMwMDkx","repeats":1},{"count":1128,"lower_bound":"MjI4NTA5NjM2","upper_bound":"MjM4MzMxMDAz","repeats":1},{"count":1136,"lower_bound":"MjQ0ODk0MTQ3","upper_bound":"MjU0MDY3NjE3","repeats":1},{"count":1144,"lower_bound":"MjU1ODA2Nzg1","upper_bound":"MjY4NjkxNDY2","repeats":1},{"count":1152,"lower_bound":"MjcwOTc1NjM5","upper_bound":"MjgxODIyNjcw","repeats":1},{"count":1160,"lower_bound":"Mjg3Mjk0Njc5","upper_bound":"MjkwMzAxMjQ1","repeats":1},{"count":1168,"lower_bound":"Mjk0Nzc1MTA1","upper_bound":"MzEzNjc5MzQ0","repeats":1},{"count":1176,"lower_bound":"MzIwMjY0MjAy","upper_bound":"MzM5NDEwNDYx","repeats":1},{"count":1184,"lower_bound":"MzU0MTk0MDYz","upper_bound":"MzU4MDI5NTg4","repeats":1},{"count":1192,"lower_bound":"MzU5MzU1MzM4","upper_bound":"MzY2OTM2MzA0","repeats":1},{"count":1200,"lower_bound":"MzcwODI0NzYx","upper_bound":"Mzk2Mzk5ODM0","repeats":1},{"count":1208,"lower_bound":"Mzk5NDIxNzIw","upper_bound":"NDA4OTQ4NTQ0","repeats":1},{"count":1216,"lower_bound":"NDEyMzUwMjI3","upper_bound":"NDE5MjY3MTkx","repeats":1},{"count":1224,"lower_bound":"NDI2NzkxNjUy","upper_bound":"NDU5MTkxNzg5","repeats":1},{"count":1232,"lower_bound":"NDU5MzE2ODY5","upper_bound":"NDY2ODMwNDEz","repeats":1},{"count":1240,"lower_bound":"NDY3MDAxMDU2","upper_bound":"NDc5Mjc5OTI2","repeats":1},{"count":1248,"lower_bound":"NDgyNDQ3MTU1","upper_bound":"NDk2MjQxNjE2","repeats":1},{"count":1256,"lower_bound":"NDk2NzY4Nzgw","upper_bound":"NTI5MzgzMzQ2","repeats":1},{"count":1264,"lower_bound":"NTM5MDY4MDEy","upper_bound":"NTQ2Njc5MjU5","repeats":1},{"count":1272,"lower_bound":"NTUyNzE2NTQ0","upper_bound":"NTY3MzAxNjEy","repeats":1},{"count":1280,"lower_bound":"NTcwNDI0NzI5","upper_bound":"NTg4MjI2ODg0","repeats":1},{"count":1288,"lower_bound":"NTkzNTEwNjI3","upper_bound":"NTk4NjcwOTkx","repeats":1},{"count":1296,"lower_bound":"NTk5MTMwMjU5","upper_bound":"NjE3MDA2OTE5","repeats":1},{"count":1304,"lower_bound":"NjI1OTQ5ODI3","upper_bound":"NjQ2MTIzMjkx","repeats":1},{"count":1312,"lower_bound":"NjUzNDY4NTM0","upper_bound":"Njc2NTg1ODkx","repeats":1},{"count":1320,"lower_bound":"Njc5Nzg4MTgx","upper_bound":"Njk2MzU4NTQ5","repeats":1},{"count":1328,"lower_bound":"Njk3MDY0MDcx","upper_bound":"NzE5OTI5Mjg2","repeats":1},{"count":1336,"lower_bound":"NzI0NTkzNjA2","upper_bound":"NzMwNzE5NTQ2","repeats":1},{"count":1344,"lower_bound":"NzMyMDg3MzEw","upper_bound":"NzQ5MDAzNDI3","repeats":1},{"count":1352,"lower_bound":"NzU2Mzk2OTM0","upper_bound":"NzczNTk5MDUw","repeats":1},{"count":1360,"lower_bound":"Nzg0NDU5ODU2","upper_bound":"Nzk2MjIwMjQx","repeats":1},{"count":1368,"lower_bound":"Nzk3MjY2NTI5","upper_bound":"ODAwNzU0MjY0","repeats":1},{"count":1376,"lower_bound":"ODA4NjA1Mzc0","upper_bound":"ODE2ODIxNzY2","repeats":1},{"count":1384,"lower_bound":"ODE5NTg4OTg1","upper_bound":"ODI5NTE2OTI3","repeats":1},{"count":1392,"lower_bound":"ODMxNTEzOTk0","upper_bound":"ODQxMzQ0ODUz","repeats":1},{"count":1400,"lower_bound":"ODU4OTM1Mjgx","upper_bound":"ODcxNzg5NDkw","repeats":1},{"count":1408,"lower_bound":"ODcyMzAyMjEw","upper_bound":"ODc4MjU2ODk0","repeats":1},{"count":1416,"lower_bound":"ODgxODMyOTMz","upper_bound":"ODk2OTE0NzIx","repeats":1},{"count":1424,"lower_bound":"OTAyNjM4NDAz","upper_bound":"OTI5MDcwMDI3","repeats":1},{"count":1432,"lower_bound":"OTMzMTg1MDgz","upper_bound":"OTM2NTE4MTUy","repeats":1},{"count":1440,"lower_bound":"OTM3MzAyNjA0","upper_bound":"OTU4NzkzMjQ5","repeats":1},{"count":1448,"lower_bound":"OTYwMzM0MjMz","upper_bound":"OTcxMDI1Mjcy","repeats":1},{"count":1456,"lower_bound":"OTczNTcyOTgw","upper_bound":"OTgzNTM2MzMz","repeats":1},{"count":1464,"lower_bound":"OTg1MzQxMzI2","upper_bound":"OTg3ODI0Mzc5","repeats":1},{"count":1472,"lower_bound":"OTkyOTc0ODE0","upper_bound":"OTk2Njk0ODYy","repeats":1},{"count":1480,"lower_bound":"OTk5MDE1NDcz","upper_bound":"MTAwMjM4MTgzOA==","repeats":1},{"count":1488,"lower_bound":"MTAwOTE5MTM5Mw==","upper_bound":"MTAxNDAxNDc5Nw==","repeats":1},{"count":1496,"lower_bound":"MTAxNTIzOTE1Mw==","upper_bound":"MTAzNDg5MDkyOQ==","repeats":1},{"count":1504,"lower_bound":"MTA0MDY3NTA5Mw==","upper_bound":"MTA0NTE2NDY3OQ==","repeats":1},{"count":1512,"lower_bound":"MTA0Njc2NzE3NA==","upper_bound":"MTA0ODc4ODYxMQ==","repeats":1},{"count":1520,"lower_bound":"MTA0OTgxNTk4OA==","upper_bound":"MTA2MTc0NjY2Mw==","repeats":1},{"count":1528,"lower_bound":"MTA2OTAwODEzMw==","upper_bound":"MTA3NjcxMzMxNw==","repeats":1},{"count":1536,"lower_bound":"MTA3ODYxMzQyMA==","upper_bound":"MTA4NTQ5NTUyMQ==","repeats":1},{"count":1544,"lower_bound":"MTA5NTI4MTA1OQ==","upper_bound":"MTEwMTU2Nzc2NQ==","repeats":1},{"count":1552,"lower_bound":"MTEwMzQyNDkyMA==","upper_bound":"MTExOTUxNDQyMw==","repeats":1},{"count":1560,"lower_bound":"MTEyMDA1Mzg5NA==","upper_bound":"MTEzMzAzMzI2MA==","repeats":1},{"count":1568,"lower_bound":"MTE0NTE4NTc5OA==","upper_bound":"MTE0ODUzNzI1OA==","repeats":1},{"count":1576,"lower_bound":"MTE1MzkwMDQ1NA==","upper_bound":"MTE2Mzc0MDkzMw==","repeats":1},{"count":1584,"lower_bound":"MTE2MzkwMDY5NQ==","upper_bound":"MTE3MjAyNjY4OQ==","repeats":1},{"count":1592,"lower_bound":"MTE3MjM3OTM2NQ==","upper_bound":"MTE4MDUyNDM4NA==","repeats":1},{"count":1600,"lower_bound":"MTE5MTE1NzI3NQ==","upper_bound":"MTIwNDY2MjU0NQ==","repeats":1},{"count":1608,"lower_bound":"MTIwNTQzMTA2OQ==","upper_bound":"MTIxNDcwNzk5Ng==","repeats":1},{"count":1616,"lower_bound":"MTIxNjAyMTY3Mg==","upper_bound":"MTIzMTM2NTAwNQ==","repeats":1},{"count":1624,"lower_bound":"MTIzNjE3NjY1MA==","upper_bound":"MTI0NjczMzAyOQ==","repeats":1},{"count":1632,"lower_bound":"MTI1MTUxNTU2MA==","upper_bound":"MTI1NzY0ODE5Nw==","repeats":1},{"count":1640,"lower_bound":"MTI2Nzk0OTcxOA==","upper_bound":"MTI4MjQ3NTMzNg==","repeats":1},{"count":1648,"lower_bound":"MTI4MzQ1NjY5NQ==","upper_bound":"MTI4OTM2MTkxMw==","repeats":1},{"count":1656,"lower_bound":"MTI5NzM0ODk1Mw==","upper_bound":"MTMxMTAxMTYxMw==","repeats":1},{"count":1664,"lower_bound":"MTMxNTE2MDI1MQ==","upper_bound":"MTMyODcyMDMzMA==","repeats":1},{"count":1672,"lower_bound":"MTMzMjQzOTQ5Ng==","upper_bound":"MTMzNTc5NjQxMg==","repeats":1},{"count":1680,"lower_bound":"MTM0Mzg2MTM1MQ==","upper_bound":"MTM1ODEyMzQ5NA==","repeats":1},{"count":1688,"lower_bound":"MTM2NDAzMTg4Mw==","upper_bound":"MTM3NjQwMDM1NQ==","repeats":1},{"count":1696,"lower_bound":"MTM4Njc1NjEwMA==","upper_bound":"MTQwMDAyOTg3Mw==","repeats":1},{"count":1704,"lower_bound":"MTQxNjA3OTA1Mw==","upper_bound":"MTQ2NjM2NzE3MQ==","repeats":1},{"count":1712,"lower_bound":"MTQ3MjUxMzU5NA==","upper_bound":"MTQ3NjA5ODExMg==","repeats":1},{"count":1720,"lower_bound":"MTQ3OTMxNTAwNA==","upper_bound":"MTQ5NzA0OTQzNA==","repeats":1},{"count":1728,"lower_bound":"MTUwNDM1MjQ3Mw==","upper_bound":"MTUzMzQxNjEwNA==","repeats":1},{"count":1736,"lower_bound":"MTUzOTMwMDE2NQ==","upper_bound":"MTU0OTk5NTA0Nw==","repeats":1},{"count":1744,"lower_bound":"MTU1MDg5NTI3MA==","upper_bound":"MTU1OTEwNzk2OA==","repeats":1},{"count":1752,"lower_bound":"MTU2MTIwNTcwMA==","upper_bound":"MTU2NzAwMTgxMw==","repeats":1},{"count":1760,"lower_bound":"MTU2NzI2MjM5OQ==","upper_bound":"MTU3MDc3Mzk0Ng==","repeats":1},{"count":1768,"lower_bound":"MTU3OTM5NDg1NA==","upper_bound":"MTU4NjQ5MDE2OQ==","repeats":1},{"count":1776,"lower_bound":"MTYwNDA3MTMwNg==","upper_bound":"MTYxNDM1OTM2MQ==","repeats":1},{"count":1784,"lower_bound":"MTYxNzk3MTE1NA==","upper_bound":"MTY1MTAyNTMzNQ==","repeats":1},{"count":1792,"lower_bound":"MTY1OTgwOTU2OA==","upper_bound":"MTY2ODgyNDA5Mw==","repeats":1},{"count":1800,"lower_bound":"MTY3NzE1Mjc2Mg==","upper_bound":"MTcwMzg3NjcwNQ==","repeats":1},{"count":1808,"lower_bound":"MTcwNDAzNjEwMA==","upper_bound":"MTcwNjc2NjU5OQ==","repeats":1},{"count":1816,"lower_bound":"MTcwNzM3NTk3MA==","upper_bound":"MTcxODEwODQzNw==","repeats":1},{"count":1824,"lower_bound":"MTcxODM0Mzg1MQ==","upper_bound":"MTcyMzI2MjQwNQ==","repeats":1},{"count":1832,"lower_bound":"MTczMTc0MDE2Nw==","upper_bound":"MTczNTc0OTM1MA==","repeats":1},{"count":1840,"lower_bound":"MTczNTc5NjkyNg==","upper_bound":"MTc0NTYzMjAzNw==","repeats":1},{"count":1848,"lower_bound":"MTc1NjU1MDYwOQ==","upper_bound":"MTc2Mjc4MjU2OQ==","repeats":1},{"count":1856,"lower_bound":"MTc3Mjk3NTI4MQ==","upper_bound":"MTc5OTYyNDA0NA==","repeats":1},{"count":1864,"lower_bound":"MTgwMTQzNDA3Mw==","upper_bound":"MTgwOTM4NjcwMQ==","repeats":1},{"count":1872,"lower_bound":"MTgxNzM2NzI3Mw==","upper_bound":"MTgyNzM4MzMzMg==","repeats":1},{"count":1880,"lower_bound":"MTgzNDM1ODg2NQ==","upper_bound":"MTgzOTQxMjY1MA==","repeats":1},{"count":1888,"lower_bound":"MTg0ODM4NjY0MQ==","upper_bound":"MTg2ODk0ODc5Ng==","repeats":1},{"count":1896,"lower_bound":"MTg2OTYwMzM2MQ==","upper_bound":"MTg3NjQ3NjIyMA==","repeats":1},{"count":1904,"lower_bound":"MTg4MTI3OTk4Mw==","upper_bound":"MTkxMDcxNTk3Mw==","repeats":1},{"count":1912,"lower_bound":"MTkzNDA4MTgxMQ==","upper_bound":"MTkzNTMwMDYyMg==","repeats":1},{"count":1920,"lower_bound":"MTkzNzk1NzUyNg==","upper_bound":"MTk1MDcyODcwOA==","repeats":1},{"count":1928,"lower_bound":"MTk1MzEyNzQ1Mw==","upper_bound":"MTk2MTQ4MjE5MA==","repeats":1},{"count":1936,"lower_bound":"MTk2MjMyMDcxNQ==","upper_bound":"MTk4Mjg0NDk3MA==","repeats":1},{"count":1944,"lower_bound":"MTk5NzcyMjUzNw==","upper_bound":"MjAwNjgwMzYyNA==","repeats":1},{"count":1952,"lower_bound":"MjAwODc0ODU1Nw==","upper_bound":"MjAyMjMyNDI5MQ==","repeats":1},{"count":1960,"lower_bound":"MjAyMzM1MTQwOA==","upper_bound":"MjA0MzU1NzUzOA==","repeats":1},{"count":1968,"lower_bound":"MjA0NTM3MjkyNA==","upper_bound":"MjA2ODE4OTY3Ng==","repeats":1},{"count":1976,"lower_bound":"MjA3MTYwNjY5NA==","upper_bound":"MjA4MDIwNjYwOA==","repeats":1},{"count":1984,"lower_bound":"MjA4MDg0NTYwNA==","upper_bound":"MjEwMjc0MjM0Mw==","repeats":1},{"count":1992,"lower_bound":"MjEwMjkwOTM0Mg==","upper_bound":"MjEyNTI2Njk2Ng==","repeats":1},{"count":2000,"lower_bound":"MjEzMDY1OTU5NQ==","upper_bound":"MjE0MjYxMzczMg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,1,2,0,2,1,1,0,2,2,0,2,0,0,2,1,1,0,3,1,1,0,0,1,1,0,0,0,1,0,1,1,0,1,1,1,1,2,1,0,0,2,0,2,2,2,0,1,0,0,1,0,1,0,2,1,1,1,3,0,1,0,1,1,1,1,1,0,1,1,0,0,1,1,2,2,0,1,0,2,1,0,3,1,2,1,1,1,0,1,0,3,1,3,1,0,1,1,0,3,2,0,1,1,1,1,2,1,1,1,0,0,0,1,1,2,2,2,1,1,2,2,3,3,1,2,1,0,1,2,1,0,0,2,0,0,3,1,0,1,1,0,3,2,1,0,2,0,3,1,1,0,2,1,1,0,0,0,0,4,2,0,1,0,1,2,2,2,1,1,1,1,1,2,1,0,2,1,2,0,0,0,1,0,0,0,1,1,0,1,1,0,0,0,0,1,0,1,1,0,3,1,0,0,2,0,0,0,0,2,1,1,2,2,1,0,0,1,0,0,1,1,1,1,2,3,1,2,2,2,0,1,1,1,4,0,2,0,0,1,0,0,0,1,1,3,0,1,1,1,0,3,1,2,0,0,1,1,1,1,2,2,2,0,2,0,1,0,2,3,0,1,2,0,3,1,0,0,1,1,4,0,1,0,1,1,2,0,0,1,1,1,1,0,1,1,0,0,0,4,0,1,1,0,0,2,1,1,0,0,5,0,1,1,2,2,1,0,1,0,0,0,1,1,1,0,1,1,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,3,1,3,2,0,1,0,3,0,0,1,0,1,0,3,2,1,1,1,2,0,2,1,0,0,4,1,3,0,0,0,1,0,0,4,0,0,0,0,1,1,0,2,0,1,0,1,2,2,1,0,3,1,1,0,1,0,1,1,0,0,0,0,0,1,0,2,1,0,1,2,1,2,0,2,0,2,0,1,2,0,0,1,1,1,1,2,3,4,0,1,3,2,2,0,0,0,1,1,0,1,0,0,1,2,0,0,3,1,0,2,1,0,3,0,1,2,1,0,0,0,0,0,0,2,2,1,2,3,0,0,1,1,1,0,2,3,3,0,0,1,0,1,2,2,1,1,0,2,3,0,1,2,3,0,3,1,2,1,0,0,2,4,2,3,0,0,0,0,3,4,0,1,0,1,2,2,0,2,1,1,1,1,0,0,0,0,0,1,1,1,0,0,1,0,1,1,0,0,0,1,1,1,1,0,0,0,1,1,1,1,3,0,1,0,0,0,2,0,3,1,0,1,2,0,0,1,0,1,2,0,1,0,0,1,0,1,0,0,0,1,0,3,1,4,0,2,1,2,2,0,0,2,1,0,0,2,0,0,1,1,0,1,2,0,0,1,1,0,2,0,0,0,0,2,0,3,2,1,0,2,1,1,1,0,0,0,0,1,0,0,1,0,1,1,0,0,3,2,1,2,0,0,2,1,2,1,1,2,1,2,0,0,0,1,0,0,3,2,0,1,0,2,1,0,0,3,2,0,1,4,1,0,1,2,1,0,3,0,0,1,1,1,1,3,1,2,1,1,0,1,1,1,0,0,2,0,1,1,2,0,2,0,0,1,1,1,3,2,1,1,1,3,1,1,1,0,0,1,0,1,0,2,0,1,0,2,1,2,3,1,1,1,2,0,2,1,2,2,0,0,1,2,1,2,2,1,0,0,2,3,0,1,1,0,1,1,0,0,0,1,0,1,2,1,1,1,1,0,3,1,3,0,1,3,1,0,0,2,2,1,2,1,0,0,0,1,0,0,0,1,0,0,0,1,1,1,0,0,0,1,0,0,1,0,0,1,1,3,0,2,0,1,0,2,1,1,1,1,1,0,0,1,1,1,2,0,3,0,0,0,1,0,0,0,1,1,3,2,1,2,1,0,3,1,0,2,1,0,0,0,0,0,0,1,2,2,0,1,1,0,0,0,1,0,0,1,1,3,1,0,2,0,1,0,1,1,3,1,1,2,1,0,0,0,3,0,0,0,1,1,2,1,1,3,1,0,1,0,2,1,2,0,0,1,1,1,0,0,0,1,0,0,2,2,1,1,2,3,0,1,3,1,2,0,0,2,0,1,0,2,1,2,0,0,2,0,1,3,0,1,0,1,0,1,2,0,1,1,1,1,1,2,1,1,0,3,1,1,3,0,0,1,3,1,1,3,3,2,0,0,1,0,1,1,1,4,2,1,2,0,2,0,1,3,0,1,2,3,1,0,3,3,1,0,0,4,0,0,0,1,0,2,0,1,2,0,3,1,2,1,2,1,4,0,0,1,0,4,0,1,1,0,0,1,2,1,1,0,1,2,1,2,2,3,4,2,0,0,0,0,2,0,0,2,0,1,3,0,1,1,2,1,3,1,4,1,0,0,1,0,1,2,2,2,0,1,1,1,1,1,3,0,0,1,1,1,0,0,2,2,3,0,2,3,1,1,0,1,0,1,0,0,1,1,0,3,0,1,2,1,0,2,1,3,2,0,0,3,1,2,1,1,3,0,3,0,0,0,0,0,0,1,0,1,1,2,0,2,0,2,4,0,0,0,0,0,1,1,0,1,3,0,2,1,1,0,1,2,1,0,2,1,1,1,2,0,1,0,1,0,2,1,2,1,3,1,3,2,2,1,0,1,2,0,0,1,0,1,1,1,2,2,0,1,1,0,0,2,0,2,1,0,0,5,0,2,2,2,1,0,1,1,1,2,1,0,2,1,1,1,0,1,0,1,2,3,0,1,1,1,1,1,1,2,1,1,1,1,0,1,2,0,0,2,2,1,0,2,0,0,0,2,2,0,2,1,2,0,0,1,2,0,2,2,1,3,2,3,0,0,0,3,1,2,0,2,1,0,1,0,1,1,0,0,5,1,0,1,0,1,1,1,1,2,1,2,2,3,0,2,0,2,1,0,0,1,2,1,0,1,1,0,0,0,0,1,0,3,1,1,1,2,2,2,2,0,0,0,2,0,1,0,0,2,0,1,1,1,0,2,0,3,1,1,3,2,2,2,1,1,0,1,0,0,1,1,1,2,1,1,1,1,0,1,3,0,3,1,1,1,0,0,1,2,1,1,0,1,0,0,1,1,0,0,0,0,1,0,2,0,1,1,1,1,0,1,0,1,0,4,1,0,2,1,1,0,4,0,0,3,1,1,2,0,1,1,0,3,0,0,0,3,0,1,2,0,0,2,2,0,0,1,0,0,2,1,0,2,1,2,1,0,1,3,2,1,0,0,0,2,0,1,1,1,3,0,0,1,1,1,1,1,2,2,0,0,1,2,1,1,0,1,1,0,1,2,0,0,0,2,1,1,0,2,0,0,1,0,0,0,1,1,1,1,2,1,0,0,3,3,1,2,1,1,2,1,2,3,0,0,1,1,0,0,1,0,1,1,0,1,1,0,1,0,0,1,2,0,0,3,3,3,2,0,1,0,2,1,2,0,2,0,1,1,0,1,1,1,0,0,1,0,2,1,2,1,1,1,3,0,0,1,0,0,2,0,0,1,1,1,2,1,0,1,0,0,0,1,0,0,2,2,0,0,1,3,2,1,0,1,1,2,1,0,0,0,2,1,2,1,1,1,0,0,0,1,1,0,2,1,2,1,1,1,0,0,1,1,1,1,3,0,1,0,0,1,1,0,1,2,0,1,1,0,1,1,0,0,1,0,1,1,0,0,1,2,0,1,1,1,0,3,0,2,2,2,2,0,0,0,0,1,0,1,1,1,3,0,0,0,1,0,0,1,0,0,0,0,3,2,0,0,1,0,2,3,0,2,0,1,1,2,1,1,1,2,1,1,0,1,0,1,0,1,0,5,1,0,2,4,0,1,1,1,1,2,2,1,2,0,1,1,1,0,0,0,1,0,2,0,2,2,1,0,0,0,1,0,0,0,0,0,0,1,1,0,0,5,0,0,3,2,0,2,1,1,1,0,1,0,0,0,2,0,1,1,2,1,0,2,0,0,0,3,3,1,0,0,2,1,3,1,1,0,1,0,1,0,3,2,2,0,0,1,3,1,1,1,0,2,0,1,0,2,0,1,1,2,1,0,2,2,1,1,0,2,0,2,0,2,0,3,2,0,2,3,2,0,2,4,0,1,0,2,0,1,0,1,0,0,4,2,0,0,2,2,1,0,3,0,0,0,1,2,1,0,3,1,1,0,0,0,0,2,1,0,1,0,1,1,2,2,0,3,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,1,1,0,0,0,0,1,1,3,1,1,0,1,1,1,0,2,1,3,1,2,3,0,0,0,1,1,3,0,1,0,1,2,1,1,2,2,1,2,1,0,1,1,0,0,2,3,1,1,0,1,1,1,0,0,0,1,1,2,1,0,0,1,1,0,1,1,0,0,1,0,2,1,0,0,1,3,1,1,0,1,1,1,0,1,1,1,2,3,2,0,0,1,0,3,1,0,1,4,3,1,0,2,1,1,0,1,0,1,2,0,3,0,1,0,1,2,0,1,0,0,1,4,0,1,2,2,0,0,1,1,0,0,0,0,2,1,1,0,3,0,1,2,3,1,2,1,2,4,1,1,4,0,3,2,2,0,0,0,0,2,1,0,1,0]},{"counters":[0,1,1,1,1,0,2,1,2,2,0,2,1,0,0,0,2,0,3,0,0,0,0,1,1,0,0,1,0,2,1,0,0,0,0,1,1,1,0,1,0,1,0,1,1,0,1,1,1,0,0,1,2,0,1,1,1,0,1,0,2,0,0,0,0,1,3,4,1,2,1,1,0,1,0,3,1,2,1,4,0,0,0,2,1,2,1,2,2,1,2,2,1,1,0,0,0,1,0,1,3,0,0,0,3,4,1,1,1,0,1,1,0,2,1,0,2,0,2,0,0,0,2,0,2,1,1,1,0,3,1,1,2,3,0,2,0,0,0,1,0,0,0,2,2,0,1,4,0,2,0,2,0,0,3,1,1,0,1,3,0,1,2,0,0,1,0,1,1,1,3,2,0,1,1,2,1,0,1,1,1,0,1,1,1,0,0,1,2,4,0,0,2,1,1,1,0,0,0,0,3,1,1,1,1,3,4,0,1,2,0,2,0,1,1,2,2,1,2,1,3,1,1,4,1,1,1,0,1,0,1,0,1,0,2,1,1,0,0,1,1,0,0,2,1,0,2,1,2,2,1,0,0,0,2,0,0,2,1,4,0,0,1,2,0,2,0,2,3,0,0,0,0,0,1,1,1,3,2,2,3,2,0,1,0,1,1,0,0,2,1,1,0,2,1,3,2,3,1,2,0,2,1,1,0,1,1,3,4,0,2,2,0,0,0,1,1,2,2,2,3,1,2,0,3,0,2,3,0,0,1,1,0,1,1,0,2,3,2,2,0,0,2,1,0,0,1,2,2,1,1,0,1,1,0,1,0,1,1,1,0,0,0,1,2,2,0,0,0,1,0,1,1,2,1,2,0,1,1,0,0,0,1,0,2,1,2,1,2,3,1,1,0,1,1,3,2,4,1,0,3,4,1,2,0,1,2,3,0,1,0,0,1,4,2,2,2,1,0,1,1,1,0,0,0,1,0,0,0,0,0,1,3,0,1,2,0,0,0,0,0,1,0,1,0,0,2,1,0,2,0,1,0,0,1,0,1,0,0,2,0,2,0,0,1,2,0,1,0,0,0,2,2,1,1,0,0,1,0,1,2,0,1,1,1,2,1,0,0,0,0,1,1,0,1,2,0,1,0,0,1,3,1,0,1,2,2,0,0,1,0,2,0,0,3,1,2,1,3,0,3,1,0,2,1,1,0,3,1,2,2,0,1,0,1,2,1,0,2,0,1,1,1,2,2,0,0,1,3,2,2,5,1,0,1,0,0,1,0,2,1,0,0,1,1,0,0,4,0,2,2,1,0,0,0,1,2,1,1,0,2,4,0,1,1,1,3,1,1,1,2,2,1,2,0,1,2,1,0,0,0,1,1,1,0,1,1,0,0,2,1,1,0,0,1,0,1,0,1,0,0,0,0,1,1,0,0,2,1,0,1,0,0,0,0,0,0,1,3,0,0,2,0,0,1,2,0,0,0,1,0,0,0,0,0,2,1,3,2,0,1,0,1,1,0,2,2,0,3,2,1,0,0,0,0,1,1,0,1,2,0,2,0,1,0,3,1,1,1,2,2,0,0,4,3,0,0,1,0,0,0,1,2,0,0,0,1,0,0,1,4,0,0,1,1,1,1,2,1,1,1,2,0,0,2,1,1,3,0,0,0,1,1,0,0,1,0,1,1,1,2,1,0,0,0,3,1,3,1,1,1,3,1,1,0,0,0,0,1,1,1,0,1,2,0,1,0,0,1,1,0,0,0,0,1,1,0,1,0,1,1,1,0,1,2,2,1,2,0,1,1,3,2,1,0,0,3,4,0,2,1,1,1,1,0,2,1,0,1,1,1,0,1,0,1,1,0,1,1,3,1,3,0,1,2,1,1,0,0,1,0,2,0,2,1,0,0,4,3,1,2,0,3,0,1,0,0,0,0,0,2,1,2,0,1,0,1,1,1,0,0,1,0,0,0,1,0,0,1,2,1,0,0,2,0,0,0,4,1,0,2,2,0,0,1,1,0,0,0,1,2,1,0,0,1,0,2,2,0,2,1,0,0,1,1,0,2,0,2,0,0,1,0,1,1,1,2,1,1,0,3,1,1,1,1,2,1,1,0,2,1,0,3,1,1,1,2,2,0,1,1,3,2,2,0,0,2,2,0,4,0,0,1,1,2,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,3,0,1,2,4,0,2,1,1,1,5,1,2,0,2,1,1,0,1,0,3,0,1,2,0,0,1,0,3,1,1,1,0,0,2,0,2,0,3,1,3,0,0,1,0,1,0,1,0,3,2,0,1,0,2,0,1,3,0,0,1,1,1,1,1,1,2,4,1,0,3,0,1,3,3,0,1,0,1,1,1,1,1,2,0,1,0,0,1,1,1,0,1,0,1,0,1,1,1,0,0,0,3,1,2,1,0,1,1,3,1,1,1,1,0,0,0,1,0,1,2,1,0,0,2,0,1,0,0,1,3,1,3,0,2,0,2,3,2,1,0,1,2,1,2,1,2,0,2,1,1,0,1,1,1,3,1,0,1,2,2,0,2,0,0,0,0,1,0,2,0,1,0,1,0,2,0,1,0,1,0,3,1,0,1,0,1,1,1,1,1,1,1,3,2,1,1,1,0,2,0,0,0,4,1,1,0,0,1,2,1,2,0,1,1,0,0,1,1,1,1,1,0,0,0,1,2,1,1,0,3,5,1,0,1,0,1,3,0,2,0,5,1,0,3,1,1,0,2,1,1,0,2,1,0,0,0,1,2,0,4,1,1,4,1,3,0,2,0,0,1,0,2,2,0,1,2,0,0,0,0,0,0,2,1,0,1,2,0,1,1,1,0,0,0,2,1,1,1,0,3,0,1,0,1,0,1,0,2,1,0,1,0,2,0,3,1,3,2,0,1,0,0,0,0,1,0,3,2,1,2,1,1,0,4,1,0,3,0,5,0,0,1,2,1,0,0,0,1,0,3,1,1,1,0,0,2,1,0,2,0,0,2,2,1,0,2,0,1,2,1,1,4,1,1,0,4,1,1,2,0,2,1,1,1,0,1,2,0,1,0,1,1,0,2,2,1,2,0,0,0,0,1,1,1,3,2,2,1,0,1,0,1,1,0,0,1,1,0,0,0,1,0,0,0,2,0,0,0,2,0,2,0,3,0,1,1,1,0,2,3,1,1,0,0,0,0,0,1,2,0,1,1,0,1,0,0,1,2,1,3,1,2,0,0,3,0,1,3,1,0,2,1,0,3,3,1,1,0,0,2,1,1,2,1,0,0,3,1,3,0,1,0,0,1,1,2,0,0,2,0,1,3,3,0,2,1,4,0,2,1,1,2,1,1,0,1,0,2,1,5,0,0,0,1,3,2,2,1,2,0,1,0,0,0,0,1,1,2,0,2,3,0,0,1,1,0,0,3,2,3,1,2,1,2,0,2,1,1,1,0,0,3,1,1,0,1,3,1,1,2,1,1,1,0,0,0,0,0,2,3,0,0,1,1,0,2,1,1,3,0,4,0,3,2,2,0,1,3,0,1,1,2,3,1,1,0,0,0,4,1,2,1,1,0,0,0,0,0,2,2,0,0,0,2,0,3,1,3,0,0,1,1,1,0,1,2,1,4,0,3,1,0,0,1,2,1,0,1,0,2,0,1,2,0,0,1,1,2,1,2,1,0,1,1,2,2,2,0,0,1,1,1,0,1,0,1,0,2,2,0,1,1,2,1,2,0,0,1,1,1,0,1,1,2,0,2,1,0,0,1,2,0,2,1,2,1,0,2,1,0,5,2,1,1,2,2,0,1,1,0,0,2,0,0,0,1,1,0,2,3,1,1,1,0,1,1,1,0,0,2,1,0,3,2,0,0,0,0,0,0,1,2,0,1,2,2,1,0,1,1,0,2,0,3,3,0,0,1,2,3,2,1,1,1,0,1,2,0,1,1,1,1,1,1,2,2,0,1,0,0,0,0,0,1,2,3,1,3,0,0,1,2,0,0,0,3,1,0,1,1,0,1,0,1,1,0,1,0,0,1,1,0,0,3,0,0,0,2,0,3,0,0,0,0,0,2,1,1,2,1,0,1,3,1,5,2,1,3,0,1,0,1,0,1,0,1,0,0,0,1,0,2,0,1,1,0,2,0,1,2,3,1,0,1,0,1,0,0,2,2,0,0,1,0,0,1,1,2,1,3,1,1,2,2,1,1,0,2,3,1,0,3,1,0,1,1,1,0,4,0,1,0,1,0,0,1,0,0,1,1,0,1,2,1,2,1,0,0,3,2,1,0,0,1,1,0,0,0,0,0,3,1,1,0,2,2,1,1,1,4,2,1,0,2,2,1,1,1,2,1,1,0,0,0,2,2,0,1,0,1,0,2,0,1,2,0,1,1,1,1,0,1,0,0,0,0,2,1,1,0,1,3,2,1,0,1,1,0,0,0,0,2,1,0,1,1,0,1,2,2,0,1,2,0,1,2,0,2,0,1,1,1,0,1,0,1,0,0,1,1,1,2,2,1,0,2,1,1,1,0,1,0,0,1,2,0,1,1,0,0,0,1,2,0,3,2,2,0,0,2,1,1,1,0,1,1,0,0,3,0,1,1,0,0,1,0,0]},{"counters":[1,0,0,0,0,1,0,3,3,0,0,0,1,1,0,0,2,0,0,0,1,1,2,3,3,2,0,0,1,0,1,0,3,4,1,0,1,0,2,1,3,0,0,2,1,1,0,0,0,2,1,0,0,1,0,0,0,1,2,0,1,2,0,1,2,0,0,3,0,2,3,0,0,1,1,1,3,1,5,3,0,2,2,2,1,0,1,1,1,2,0,0,0,0,2,0,0,2,0,2,1,1,1,1,1,0,0,0,3,0,0,1,0,3,0,0,4,0,1,0,1,2,0,1,0,2,1,0,2,0,0,0,1,1,0,1,0,0,1,0,1,0,2,0,1,2,1,1,1,0,1,1,0,0,1,2,2,2,2,0,1,0,1,1,4,0,1,1,0,0,0,2,1,0,1,1,0,1,1,1,0,0,2,2,1,1,0,0,1,1,1,2,1,1,2,0,1,0,1,1,0,1,0,1,2,4,0,2,4,0,0,0,1,0,0,3,0,1,0,4,1,1,0,0,0,1,0,0,0,0,0,0,2,0,0,1,0,1,0,1,0,0,1,1,0,1,1,3,1,1,1,0,2,2,0,0,1,1,0,1,0,2,0,1,1,0,1,2,1,2,1,0,0,0,1,1,1,0,0,0,1,1,2,2,1,1,3,1,1,1,4,1,2,1,0,0,0,1,1,1,1,3,0,0,2,1,0,1,0,0,1,1,0,3,2,1,2,1,0,1,1,2,1,1,1,0,0,0,1,1,3,2,0,0,1,2,0,0,2,1,5,1,1,1,0,1,1,1,1,1,1,1,4,1,2,0,1,0,0,0,3,2,0,0,1,0,1,1,0,1,0,1,2,3,2,1,0,1,2,1,2,1,1,2,1,1,1,2,1,1,0,2,0,0,2,0,1,1,1,2,1,1,0,1,1,0,0,0,1,3,1,1,0,0,1,2,1,1,0,2,1,1,1,1,1,0,2,0,0,0,1,0,0,1,1,1,0,0,0,2,1,1,0,0,1,1,0,0,1,1,1,1,1,1,1,0,0,4,0,2,1,1,1,1,1,2,2,0,1,0,2,0,2,1,0,2,0,0,1,1,0,1,2,1,1,2,2,0,0,2,0,1,0,0,1,1,1,0,2,2,1,1,2,1,1,1,0,0,1,0,0,0,3,0,1,0,1,2,2,0,1,4,0,0,2,1,1,2,0,1,2,0,0,1,3,1,0,0,0,3,0,0,0,2,4,1,1,0,2,1,1,3,0,0,0,1,2,0,3,0,1,0,0,1,0,1,1,0,3,0,3,1,1,1,0,1,0,1,2,3,0,1,0,0,0,0,0,2,3,0,0,1,0,0,0,0,1,1,0,1,0,1,0,0,4,1,1,0,0,1,1,0,5,0,1,1,0,0,1,1,2,1,1,1,2,0,1,1,2,2,2,1,1,0,1,0,0,0,0,1,1,0,2,0,1,2,0,3,1,0,1,0,2,0,0,2,2,1,2,1,1,1,2,0,0,2,1,1,1,2,2,1,1,1,2,0,0,3,0,0,2,1,1,1,2,3,1,0,0,4,0,0,1,1,0,1,1,0,1,2,1,0,1,0,0,1,0,1,1,0,1,1,0,2,2,1,1,0,0,1,2,1,0,1,3,1,0,0,1,1,1,4,1,1,0,0,4,0,0,0,0,2,0,0,2,1,1,2,0,3,0,1,0,0,3,0,2,0,3,3,1,0,1,0,0,1,2,2,1,2,0,1,1,0,2,0,1,2,0,0,1,1,1,2,2,0,1,0,1,1,1,1,1,1,1,2,1,1,0,1,1,2,0,1,1,0,2,2,0,1,1,1,2,2,2,2,1,2,1,1,0,0,1,3,1,4,1,0,1,1,0,1,1,0,0,2,0,1,3,0,2,2,0,1,2,1,4,0,1,0,1,0,1,2,1,0,1,0,0,1,2,0,0,2,0,2,1,0,1,0,2,2,0,2,2,2,1,2,0,1,1,1,3,0,2,3,0,2,0,0,1,1,1,1,1,0,2,0,1,1,1,0,1,0,0,2,1,1,0,1,0,1,0,0,0,2,0,1,1,1,1,1,1,0,1,1,2,2,5,1,0,1,2,1,1,1,1,0,3,0,1,2,0,0,1,2,0,0,0,1,2,1,1,1,1,0,2,2,0,0,1,2,1,1,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,1,1,2,0,1,2,1,2,0,0,2,1,1,1,2,1,0,2,2,0,0,0,1,2,1,0,0,1,0,1,1,1,0,0,1,0,2,0,1,1,0,1,1,2,1,0,1,1,2,1,0,3,0,0,2,1,3,1,0,0,2,2,1,4,0,1,1,3,2,0,1,1,2,0,0,0,0,0,2,1,2,1,1,0,0,2,2,2,1,1,1,1,1,0,3,0,0,1,1,1,0,1,1,1,1,3,1,2,1,1,2,1,2,0,2,2,1,0,1,2,2,3,0,2,0,2,0,0,0,3,1,2,1,1,0,4,2,1,1,0,2,1,0,1,0,2,0,0,2,1,0,0,0,0,2,0,0,2,1,0,1,1,3,3,1,4,0,2,0,2,0,0,0,0,0,2,0,0,1,1,3,2,0,1,2,1,1,1,2,1,2,2,2,0,1,1,1,1,0,2,3,0,1,2,0,0,1,0,1,1,2,2,1,1,0,0,1,0,0,1,0,2,3,1,0,1,0,0,2,3,1,2,1,2,2,0,3,0,1,1,2,0,0,0,2,0,2,3,2,1,1,0,1,1,1,2,2,0,1,1,0,0,0,0,1,1,3,2,2,2,2,2,2,1,0,0,1,2,3,1,1,1,1,1,2,0,1,3,2,0,2,0,0,0,1,2,1,1,1,2,0,0,1,0,0,1,0,1,1,2,0,1,0,1,1,0,0,0,0,0,0,0,3,1,0,0,1,1,2,1,0,1,0,0,0,1,1,1,2,2,0,3,3,1,0,1,2,0,1,1,2,1,0,0,0,1,0,1,0,0,3,0,1,1,2,1,2,1,3,0,1,1,2,0,2,1,0,0,1,1,1,0,2,0,1,0,0,2,3,0,1,0,1,1,1,2,2,0,3,1,0,2,0,1,0,0,0,3,1,1,1,1,1,0,1,1,0,1,1,1,3,1,2,1,0,0,1,0,0,1,1,0,1,1,0,1,2,1,1,3,2,2,4,0,1,0,1,2,0,2,1,3,0,0,0,1,1,2,1,0,1,0,0,0,0,3,0,2,0,0,1,0,2,0,1,1,1,2,2,0,0,1,0,0,1,1,1,3,1,0,1,1,2,3,0,2,1,0,1,0,2,0,1,1,1,0,1,3,2,1,1,2,1,0,0,1,2,0,2,3,2,1,0,0,1,0,0,1,0,1,0,3,0,1,6,1,4,3,0,2,1,0,2,0,0,1,3,4,1,1,2,1,0,1,0,0,0,0,0,0,0,1,0,0,2,2,0,0,1,0,0,3,1,1,2,1,3,3,2,1,0,1,1,1,0,0,1,2,1,1,0,2,0,0,1,1,2,3,0,2,1,1,1,1,1,2,2,1,0,1,0,3,1,0,1,1,1,2,2,0,1,0,0,2,0,1,3,0,0,0,0,3,0,0,1,0,0,1,0,2,1,4,1,0,1,1,2,1,2,2,0,2,1,1,0,0,0,3,0,1,2,2,2,1,3,0,2,1,0,1,1,1,4,1,1,1,0,0,1,1,3,1,1,0,0,3,1,0,1,2,0,0,1,0,0,0,0,1,1,0,0,1,1,1,3,2,0,1,0,0,0,2,2,0,0,0,0,2,0,2,3,0,1,1,2,0,1,0,0,1,0,3,2,0,1,0,2,4,1,1,2,1,2,2,0,0,1,0,4,0,0,0,1,1,0,0,3,1,1,1,0,1,2,1,1,4,0,0,0,1,2,0,1,1,1,0,1,0,0,1,2,0,2,2,1,0,1,1,2,0,1,1,0,1,2,1,3,0,0,0,1,0,3,0,0,1,3,1,1,1,0,1,1,5,3,0,3,0,1,0,1,1,1,1,2,0,0,1,1,1,1,2,0,1,1,0,0,1,0,2,1,1,2,2,0,0,3,0,0,3,1,2,1,0,3,0,1,2,0,0,1,1,0,1,0,1,1,0,0,1,3,2,3,0,2,0,0,0,2,3,2,0,2,0,1,0,0,2,2,3,1,3,0,2,1,1,0,2,3,1,1,2,0,1,0,0,0,2,1,1,3,0,0,0,3,1,0,0,2,0,2,1,0,2,2,0,1,0,1,1,0,4,2,0,1,1,0,1,1,1,2,3,0,1,1,1,0,1,3,1,2,0,2,0,4,0,1,1,3,0,2,0,2,2,3,1,0,0,0,1,1,1,1,1,0,1,0,0,0,2,0,0,0,0,1,0,0,0,1,1,0,2,2,1,1,1,2,1,2,1,2,0,2,0,1,1,0,0,0,0,2,1,1,0,0,1,0,1,1,0,0,2,0,0,0,3,1,2,0,1,1,0,2,0,0,1,1,1,2,2,2,2,2,1,1,0,2,0,1,1,1,2,2,2,1,1,1,0,2,0,0,1,0,1,1,1,1,0,0]},{"counters":[1,1,1,2,0,0,0,1,1,1,1,0,1,0,1,1,2,4,0,0,0,1,0,3,0,0,0,2,0,1,2,0,0,1,2,2,2,0,1,2,2,1,2,0,0,3,1,1,1,1,2,2,0,1,0,0,0,0,2,0,0,2,0,2,0,1,0,1,0,1,0,0,3,3,2,1,0,1,1,1,1,0,2,2,1,2,0,2,0,0,2,1,2,0,1,0,1,1,3,1,0,0,1,2,2,0,0,1,0,1,0,0,2,0,1,2,0,1,0,0,1,1,1,1,1,1,0,0,0,0,3,0,2,1,0,1,1,1,1,1,2,0,1,0,2,1,2,0,3,3,1,1,4,0,3,3,0,2,0,2,1,1,0,1,0,2,1,1,1,0,0,1,0,0,0,0,0,1,0,1,3,2,1,1,1,1,0,0,1,0,4,1,2,2,1,3,4,3,0,0,0,2,0,1,0,1,0,1,2,0,0,2,2,2,0,2,0,1,0,0,0,2,1,2,1,2,0,1,0,0,0,1,1,0,0,0,0,0,1,0,0,1,2,0,1,0,1,1,1,2,0,2,0,2,1,1,0,0,2,3,0,1,1,1,1,2,1,1,0,0,0,0,1,2,2,0,0,0,1,1,4,2,0,0,3,0,0,1,0,1,1,0,1,1,4,1,2,1,1,1,4,0,0,1,0,1,1,2,3,3,0,2,0,0,1,0,0,2,0,1,0,1,0,2,1,0,2,3,0,2,1,0,4,3,0,1,1,3,0,2,1,3,0,0,1,0,2,1,0,1,1,1,3,2,0,1,2,0,0,0,0,0,0,2,1,1,2,2,0,2,0,0,2,2,3,0,2,0,0,4,1,3,0,0,0,1,0,3,1,1,1,2,1,0,2,1,2,1,0,1,1,1,1,1,0,1,0,3,1,0,2,0,2,4,0,1,1,1,1,1,0,1,0,2,0,1,0,1,1,0,0,0,4,2,0,1,1,1,2,2,1,1,0,2,1,2,0,1,0,4,2,1,0,2,2,1,1,2,0,1,3,2,1,0,0,0,1,0,2,1,1,0,1,3,1,2,0,0,0,0,1,0,0,0,1,0,1,1,1,1,1,1,1,0,0,2,0,1,0,0,1,1,1,2,2,1,0,0,0,0,1,1,2,3,1,2,1,0,0,2,2,0,2,1,1,0,0,1,2,2,1,1,1,3,0,0,1,1,1,1,0,3,1,0,0,1,1,1,1,1,0,1,0,2,0,2,0,0,2,2,0,3,1,0,1,1,2,3,3,0,1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,2,2,1,1,1,2,0,1,0,1,0,1,1,1,0,1,0,1,2,1,0,0,2,0,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,0,0,0,1,1,0,2,2,0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,2,1,2,1,1,0,1,2,2,3,0,2,2,0,2,1,1,1,0,1,1,1,0,1,1,2,0,1,2,0,0,0,1,3,1,0,1,0,0,1,0,0,0,2,1,2,0,0,1,3,2,0,1,0,1,0,1,2,0,0,3,1,0,1,0,1,1,0,1,2,0,2,0,0,1,1,2,1,1,2,1,1,1,1,0,1,0,1,1,4,0,2,0,0,1,2,1,1,1,0,2,0,0,1,3,0,3,1,0,2,3,0,2,1,2,0,2,3,4,0,1,0,0,2,3,0,1,1,2,0,0,2,0,1,1,1,2,1,0,2,2,2,0,0,0,1,1,1,2,0,1,0,1,0,2,3,1,0,0,2,1,1,3,1,0,4,0,0,0,0,1,1,0,1,1,0,0,1,0,1,3,2,1,1,1,1,1,1,0,1,1,1,2,0,0,1,0,0,2,2,2,0,1,1,0,1,0,1,0,0,1,0,3,0,0,0,2,2,2,1,0,1,1,0,2,2,1,1,3,1,0,1,0,2,0,1,1,1,1,1,3,3,1,0,0,1,1,1,0,0,1,1,0,1,1,1,2,1,1,3,2,1,1,1,0,0,1,2,2,0,1,1,0,0,0,1,1,0,0,0,1,0,1,2,0,0,2,1,1,0,1,1,0,1,0,0,2,2,3,1,0,3,0,3,1,0,1,1,3,0,3,0,2,0,0,2,0,2,0,0,0,0,3,0,1,0,1,1,3,5,0,1,2,0,0,1,0,1,0,0,3,0,4,0,3,1,0,0,1,1,1,1,0,0,2,0,2,2,1,2,3,0,0,1,2,0,2,0,3,0,1,1,2,1,0,0,0,1,0,1,1,0,3,0,2,0,0,1,0,4,0,1,0,1,0,1,1,0,4,1,1,1,2,1,1,0,3,1,0,4,0,1,0,1,2,0,0,1,1,0,2,1,0,0,1,2,3,1,1,3,2,2,0,0,0,1,2,0,3,0,2,3,1,0,1,1,2,1,0,2,0,0,0,2,1,0,1,1,0,2,0,1,3,0,0,2,1,0,1,1,4,1,2,1,0,0,0,0,0,1,0,2,0,0,4,1,0,1,0,0,2,2,2,0,0,0,2,0,1,1,1,2,1,3,1,1,1,1,0,1,0,1,0,0,1,2,1,1,0,0,0,1,0,3,0,3,0,1,1,2,1,1,1,1,1,0,1,1,0,3,1,2,1,2,0,0,1,3,2,2,2,1,1,2,0,1,1,1,1,0,3,1,1,1,1,2,2,2,0,0,0,0,0,1,2,0,0,3,1,0,0,1,1,1,1,2,0,1,1,0,0,0,1,0,1,0,0,1,1,0,3,1,1,3,0,0,3,1,2,1,3,1,1,2,2,2,0,3,1,2,1,1,0,0,2,3,0,2,2,1,1,2,1,0,2,2,1,2,0,1,0,0,0,2,2,1,0,2,2,3,0,2,1,0,0,0,1,0,1,0,1,1,1,0,0,3,0,0,4,1,0,0,0,0,0,1,1,0,1,2,2,0,0,0,0,0,2,0,1,1,0,0,0,1,0,0,1,3,2,1,0,1,1,1,1,2,0,1,0,1,0,0,1,1,1,1,0,2,0,0,0,2,2,0,0,2,1,1,1,0,4,1,1,1,1,0,0,5,1,2,1,1,1,2,3,1,0,1,0,1,1,0,0,0,0,1,0,0,1,1,1,2,2,1,0,1,0,0,0,1,0,0,1,2,0,0,0,0,3,0,0,1,3,5,0,0,1,0,1,0,1,1,0,0,1,1,2,0,1,0,4,0,1,3,2,1,0,0,0,1,2,1,0,3,0,0,1,0,1,0,2,1,0,2,1,1,3,3,0,2,1,1,0,1,2,2,0,0,1,5,0,1,0,0,2,0,0,1,1,0,2,2,0,1,1,1,1,1,1,3,1,1,2,1,2,1,0,0,1,1,0,1,0,1,0,2,5,0,2,1,1,2,1,2,2,2,0,1,1,2,0,1,2,1,2,1,3,1,0,0,0,0,0,4,0,0,1,2,2,0,2,0,3,0,4,0,2,1,3,1,2,0,1,0,2,1,2,2,0,3,0,0,0,2,1,1,1,0,0,4,0,1,0,1,2,0,2,3,0,1,1,0,2,0,2,2,1,1,1,0,0,0,1,3,0,1,0,1,2,1,1,0,0,1,3,2,1,3,1,1,1,1,1,0,0,1,1,0,0,1,1,0,1,2,2,0,0,2,1,1,2,0,1,1,0,1,1,2,1,1,1,0,2,0,1,0,1,0,1,0,0,1,1,0,0,0,3,1,1,1,0,2,1,1,0,2,2,0,0,0,1,3,0,1,2,1,1,1,3,3,0,0,1,1,1,3,1,0,1,0,1,0,0,1,1,2,1,1,0,0,1,0,2,1,0,1,1,0,0,0,0,0,0,2,1,0,2,1,3,0,1,1,0,0,0,0,1,0,1,0,1,0,0,0,1,1,1,1,1,3,1,1,1,0,2,4,0,5,1,1,1,1,0,2,0,1,1,0,1,1,1,3,1,2,1,2,0,2,1,1,1,1,1,2,0,2,0,1,1,1,2,0,1,2,0,0,0,0,0,0,3,2,1,1,3,1,1,1,0,0,0,1,1,0,1,0,1,0,1,1,4,1,0,1,2,1,1,3,1,3,3,0,0,0,3,1,3,1,0,0,3,0,3,1,1,1,0,1,0,1,2,1,1,4,1,2,1,0,2,1,0,0,0,1,3,0,0,0,0,0,0,3,2,4,2,0,2,4,1,1,2,0,0,2,0,0,0,0,2,1,1,1,0,1,1,0,0,0,1,2,2,1,0,1,2,1,2,2,2,0,1,2,1,1,3,0,0,0,1,3,1,0,0,2,0,1,1,3,0,1,0,1,3,1,1,0,1,4,2,4,2,1,2,1,0,2,1,0,3,0,1,2,0,1,2,0,2,1,0,0,2,1,0,0,1,1,0,2,0,0,0,0,1,2,1,1,1,1,3,0,1,2,1,1,0,1,0,2,0,2,0,0,0,1,1,1,3,3,0,2,0,3,1,0,0,2,1,2,1,0,0,0,0,0,0,1,2,1,0,0,2,1,2,2,0,0,0,0,1,0,1,0,1,1,2,2,0,1,0,0,1]},{"counters":[1,1,3,1,1,1,0,3,1,2,2,1,1,1,1,2,1,1,0,0,2,0,1,0,0,0,2,0,2,2,1,0,1,2,2,0,1,2,1,0,1,0,1,0,0,3,0,1,0,1,1,2,0,0,1,1,1,1,1,0,1,1,1,0,1,0,0,0,0,1,2,2,3,5,0,1,0,0,0,1,1,0,1,2,1,1,1,1,0,0,0,1,0,1,0,0,1,2,0,0,1,2,1,0,1,0,1,0,1,0,0,0,0,1,1,1,0,1,2,0,1,0,0,1,0,3,2,1,0,1,1,2,0,1,1,1,0,1,1,2,1,0,1,1,1,0,2,0,1,3,0,2,1,0,0,0,0,1,0,1,1,0,0,0,3,2,1,0,1,2,1,2,1,2,1,0,0,1,1,3,1,0,1,0,1,1,1,0,3,1,3,0,0,2,1,0,0,1,0,1,0,0,0,0,1,1,0,0,1,2,2,0,1,2,2,1,1,0,1,0,0,2,1,1,1,1,0,1,1,2,3,0,1,2,0,4,0,0,3,0,0,2,0,0,1,2,1,4,0,1,5,3,1,1,1,1,2,3,2,0,0,1,0,1,1,0,0,0,0,0,1,3,1,1,1,1,0,0,0,3,0,1,1,1,2,0,1,3,3,1,0,0,1,0,1,0,2,1,1,0,3,2,2,0,0,0,2,3,2,1,3,1,0,2,0,1,1,1,0,3,3,1,1,0,1,2,0,1,3,6,1,2,0,1,2,2,1,1,0,0,0,2,0,1,0,1,1,2,0,2,0,0,0,1,0,2,0,1,1,1,0,0,2,1,0,3,3,3,0,0,0,0,0,1,1,2,0,2,2,0,2,0,3,2,1,2,2,1,0,2,2,3,1,3,0,0,0,1,1,2,0,1,0,0,0,0,1,0,0,0,2,2,1,0,1,3,0,0,0,1,0,1,1,1,3,2,3,1,2,1,1,2,0,2,2,1,0,0,3,3,0,0,0,0,1,0,1,0,0,1,1,1,1,1,2,2,2,2,0,0,0,1,0,1,1,1,3,2,0,3,1,1,0,2,0,1,1,3,0,1,3,1,0,1,1,1,1,0,0,0,0,0,0,2,1,0,0,0,0,1,1,0,0,0,2,2,1,1,0,2,2,1,1,2,1,0,1,0,2,1,2,0,1,3,2,0,1,0,0,0,0,1,1,1,0,1,0,0,2,0,0,0,0,1,1,1,2,1,0,0,2,0,0,3,0,0,1,2,1,1,3,0,0,1,2,0,3,2,0,0,0,1,1,1,0,0,2,0,0,2,1,2,2,0,0,0,0,0,1,1,0,1,2,0,5,1,0,3,1,1,1,3,1,0,0,1,1,2,1,1,0,0,3,0,3,2,0,0,1,1,2,1,2,0,3,1,1,1,1,1,0,2,0,0,1,1,0,2,1,2,3,2,1,1,1,0,0,1,0,0,2,0,2,0,0,3,0,2,2,0,0,1,4,1,1,0,1,1,1,1,0,3,1,0,1,1,0,1,1,1,1,2,2,0,2,0,1,2,3,0,3,3,0,1,0,1,0,0,1,2,1,2,0,0,0,2,1,2,1,1,1,2,2,1,0,0,0,2,0,0,0,1,1,2,0,2,0,0,2,0,0,1,1,2,0,0,1,0,1,1,1,0,2,0,1,2,1,2,3,0,0,0,0,0,1,1,0,0,0,1,1,0,1,1,1,0,1,1,2,0,0,1,1,0,0,0,0,1,1,1,2,1,0,0,0,1,1,0,2,2,0,1,1,2,0,1,1,2,2,2,1,2,2,2,2,1,4,1,0,1,0,1,2,1,3,2,1,0,1,1,1,3,1,0,4,0,1,1,0,1,0,0,1,3,2,1,1,0,0,1,0,4,0,1,3,2,1,0,0,0,0,1,2,0,0,0,1,0,0,0,1,0,0,3,2,1,2,2,2,1,1,1,1,1,1,3,3,2,1,0,2,2,0,1,2,0,0,0,1,0,0,1,2,1,3,2,3,1,1,0,1,0,0,0,0,1,3,0,0,3,3,0,2,1,2,1,0,1,1,1,1,0,1,0,0,0,1,0,0,2,3,1,0,0,1,2,0,1,1,1,0,2,2,0,3,0,0,1,0,1,3,0,0,1,0,0,0,0,1,0,2,1,0,1,0,1,2,0,2,0,1,0,0,0,1,2,0,3,2,2,0,1,3,0,1,4,1,1,1,1,1,0,0,0,0,1,1,0,0,1,3,1,0,0,2,3,1,2,0,3,0,0,0,0,3,0,0,1,0,0,1,3,0,1,2,1,1,0,2,0,4,0,0,2,0,1,1,2,2,0,3,1,2,0,3,2,0,2,2,1,0,0,2,0,1,0,0,0,0,0,0,1,3,1,1,2,0,0,1,1,0,0,1,1,1,0,0,1,1,2,0,1,0,0,0,0,1,1,1,0,0,0,1,2,1,2,2,0,1,1,1,2,1,0,1,1,0,1,0,0,2,2,0,2,2,1,1,1,0,3,0,1,0,3,1,0,1,0,2,3,0,2,1,0,0,1,1,1,2,0,1,3,4,0,2,0,2,0,0,2,1,0,2,1,1,1,2,0,2,2,1,0,1,0,1,0,0,1,1,0,3,2,3,1,0,2,1,0,1,1,0,1,0,0,0,2,0,0,2,0,1,2,1,0,1,0,1,0,2,1,0,0,2,3,0,2,1,2,0,1,0,1,2,0,2,2,2,2,1,5,1,0,1,1,3,2,0,1,0,0,1,1,0,0,2,0,0,0,1,1,1,2,2,1,1,0,4,2,0,2,3,0,2,1,4,1,2,0,0,0,0,3,2,1,2,3,1,0,1,3,0,1,0,0,0,1,0,1,1,0,0,0,0,1,0,0,1,2,0,2,2,1,2,0,2,0,0,1,1,1,2,3,1,1,1,3,0,2,0,3,0,0,3,2,0,0,1,4,2,0,2,0,0,2,0,0,1,3,0,1,0,1,3,0,1,4,0,1,0,0,0,1,1,1,2,0,1,3,0,0,2,0,2,1,1,2,0,1,0,1,1,0,0,0,0,2,3,2,0,1,2,2,1,0,0,0,0,1,1,0,0,0,0,2,1,0,0,0,0,0,0,0,3,2,0,1,0,2,0,2,1,1,0,2,1,1,1,2,0,0,2,2,3,1,0,0,0,3,0,0,0,1,1,0,0,0,0,3,1,0,0,1,2,0,3,1,0,1,0,1,1,0,2,2,1,1,0,1,1,1,2,0,0,1,4,1,0,2,0,0,2,1,3,0,1,1,0,4,0,0,0,1,1,1,1,0,0,0,2,2,2,0,0,0,3,2,2,0,1,0,1,0,0,0,0,1,0,2,0,2,1,1,0,1,3,3,5,3,0,2,1,1,2,1,3,1,1,0,3,1,0,0,2,2,4,0,1,0,1,0,0,0,0,1,0,2,0,0,0,0,1,2,0,1,4,3,0,1,2,2,0,3,1,1,0,1,2,1,0,1,0,2,2,2,1,0,0,0,0,2,1,2,0,1,0,1,1,0,2,0,1,1,1,2,1,1,1,3,1,1,1,1,0,1,0,3,0,0,0,1,1,4,0,1,2,0,2,2,0,2,1,0,0,1,1,1,1,0,0,2,1,1,2,1,0,0,0,1,2,1,0,0,0,1,1,1,1,0,0,2,1,1,1,1,0,1,1,0,1,0,1,0,3,0,4,0,1,1,0,0,2,3,0,1,0,1,2,1,1,1,0,2,2,1,0,3,0,0,2,0,1,1,0,1,0,4,1,1,0,1,1,2,1,0,0,0,2,0,1,2,0,1,1,2,1,2,1,1,2,0,1,1,2,0,1,0,0,2,1,0,1,0,2,4,0,3,0,1,1,1,2,1,1,0,0,1,1,0,2,1,2,0,1,1,1,1,2,2,2,1,1,1,1,0,1,5,3,1,1,5,0,1,0,3,2,3,0,0,0,0,1,1,2,0,1,1,3,1,2,1,2,1,0,2,1,0,1,0,0,2,0,0,6,1,0,0,1,1,4,1,0,1,1,1,1,1,1,0,2,3,1,0,3,1,0,2,0,1,3,1,1,0,0,0,0,2,2,0,0,1,1,3,0,0,1,2,1,2,2,1,1,0,0,1,0,1,1,2,0,0,0,0,0,1,0,1,0,1,0,1,0,2,2,0,3,0,1,1,0,2,3,0,2,0,3,1,0,0,0,0,1,0,1,0,1,0,1,2,1,0,1,2,5,0,1,1,1,1,2,0,1,0,0,0,1,1,0,0,1,1,1,2,0,0,3,2,0,0,1,1,0,1,1,1,1,0,1,1,0,1,2,1,2,0,4,2,0,2,1,1,1,0,2,1,0,0,2,1,2,2,1,0,1,0,1,2,1,1,0,0,1,2,1,1,2,0,1,0,0,0,2,0,1,1,0,0,0,0,1,0,1,2,0,1,0,1,1,1,1,0,0,1,1,1,2,0,0,3,2,0,2,2,2,0,1,0,2,2,3,0,1,1,0,0,0,1,1,0,0,1,1,0,1,3,1,2,2,1,3,1,0,0,1,3,0,1,2,1,2,4,1,0,1,1,0,0,0,1]}]},"null_count":0,"last_update_version":397952055272275968},"b":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDY3MzIxNDA=","upper_bound":"LTIxMzA5NjkxMTA=","repeats":1},{"count":16,"lower_bound":"LTIxMjA2MjUxMzU=","upper_bound":"LTIxMTMzNDU3MDM=","repeats":1},{"count":24,"lower_bound":"LTIxMTAxMjE3OTc=","upper_bound":"LTIwOTk0MzI3NzA=","repeats":1},{"count":32,"lower_bound":"LTIwOTQ0MDc0Njk=","upper_bound":"LTIwNzk5NzYwOTU=","repeats":1},{"count":40,"lower_bound":"LTIwNzg4NTg1NDQ=","upper_bound":"LTIwNjg5MDEwMjc=","repeats":1},{"count":48,"lower_bound":"LTIwNjMwODM5ODM=","upper_bound":"LTIwNDE3MDEyMzU=","repeats":1},{"count":56,"lower_bound":"LTIwMzc1MTgzMTI=","upper_bound":"LTIwMjgyNTM4MTM=","repeats":1},{"count":64,"lower_bound":"LTIwMjU1Njg3NjM=","upper_bound":"LTE5OTI4OTMyNDE=","repeats":1},{"count":72,"lower_bound":"LTE5ODk2MTE5NTI=","upper_bound":"LTE5Nzg2MjAxNDQ=","repeats":1},{"count":80,"lower_bound":"LTE5NzczMjQyNTY=","upper_bound":"LTE5NzEwMTkxMTQ=","repeats":1},{"count":88,"lower_bound":"LTE5NjUwOTIyNTM=","upper_bound":"LTE5NDkzNDk4NjU=","repeats":1},{"count":96,"lower_bound":"LTE5NDI5MTc3MTI=","upper_bound":"LTE5MjgyMTIyMzI=","repeats":1},{"count":104,"lower_bound":"LTE5MjA1ODc5OTY=","upper_bound":"LTE5MTQ1OTgzMzQ=","repeats":1},{"count":112,"lower_bound":"LTE5MTEyNzM5Mzg=","upper_bound":"LTE5MDE0MTE5ODI=","repeats":1},{"count":120,"lower_bound":"LTE5MDA0NjYyNTc=","upper_bound":"LTE4OTg2MzY2NTY=","repeats":1},{"count":128,"lower_bound":"LTE4OTYyODQ4MDk=","upper_bound":"LTE4ODIyODA3ODU=","repeats":1},{"count":136,"lower_bound":"LTE4ODE5MjAxNzE=","upper_bound":"LTE4NzMwODk3NzM=","repeats":1},{"count":144,"lower_bound":"LTE4NzE4OTUyNzQ=","upper_bound":"LTE4NTI5MDU1NjE=","repeats":1},{"count":152,"lower_bound":"LTE4NDk0NDk1MDg=","upper_bound":"LTE4NDMzNzI4NzM=","repeats":1},{"count":160,"lower_bound":"LTE4MjU4NjE1ODg=","upper_bound":"LTE4MTM0MDg1ODc=","repeats":1},{"count":168,"lower_bound":"LTE4MDc1ODQ5NzU=","upper_bound":"LTE4MDAyOTE3ODU=","repeats":1},{"count":176,"lower_bound":"LTE3OTkzNzIxNzU=","upper_bound":"LTE3ODk4NzEwMzg=","repeats":1},{"count":184,"lower_bound":"LTE3ODg2NjEwMTI=","upper_bound":"LTE3NzgyNjI1MDA=","repeats":1},{"count":192,"lower_bound":"LTE3NjM3NzQ4NDE=","upper_bound":"LTE3MzY1NDk2MDI=","repeats":1},{"count":200,"lower_bound":"LTE3MzY1MzY0NjE=","upper_bound":"LTE3MjI4Njc5NDM=","repeats":1},{"count":208,"lower_bound":"LTE3MTU3MTQ0MjM=","upper_bound":"LTE2OTY4ODUzNjM=","repeats":1},{"count":216,"lower_bound":"LTE2OTY4ODIxMTM=","upper_bound":"LTE2NjkwMjQwODE=","repeats":1},{"count":224,"lower_bound":"LTE2Njc5ODk5NDI=","upper_bound":"LTE2NTc5NjE5Mzk=","repeats":1},{"count":232,"lower_bound":"LTE2NTY0ODY1MDI=","upper_bound":"LTE2NDIxNjE4OTM=","repeats":1},{"count":240,"lower_bound":"LTE2NDExMzk5NTA=","upper_bound":"LTE2MTg3NDQyMDk=","repeats":1},{"count":248,"lower_bound":"LTE2MTQ3MzM5NDg=","upper_bound":"LTE2MDA5NDYzNjI=","repeats":1},{"count":256,"lower_bound":"LTE1OTk0NTQ0NzA=","upper_bound":"LTE1ODQ0NzMyNDc=","repeats":1},{"count":264,"lower_bound":"LTE1ODEwNzA4MjE=","upper_bound":"LTE1NzQ4ODY1NjM=","repeats":1},{"count":272,"lower_bound":"LTE1NDY1NTY1NjM=","upper_bound":"LTE1MzQ5MzcyMDI=","repeats":1},{"count":280,"lower_bound":"LTE1MzMxNDA0MjY=","upper_bound":"LTE1MTMzNzA5MjI=","repeats":1},{"count":288,"lower_bound":"LTE1MDQ1NDIwNjM=","upper_bound":"LTE0ODEyMzI0MjQ=","repeats":1},{"count":296,"lower_bound":"LTE0NzEzNTI0NTU=","upper_bound":"LTE0NTQ5Njk0NTM=","repeats":1},{"count":304,"lower_bound":"LTE0NDk3Nzk5MTQ=","upper_bound":"LTE0MjkxNDUyNzc=","repeats":1},{"count":312,"lower_bound":"LTE0MjYxMTYyMDE=","upper_bound":"LTE0MTgzODU5MzU=","repeats":1},{"count":320,"lower_bound":"LTE0MDQ1NDY0MTk=","upper_bound":"LTEzOTg0ODYyNjk=","repeats":1},{"count":328,"lower_bound":"LTEzOTM1NjgwMDI=","upper_bound":"LTEzNzIwODc3MTQ=","repeats":1},{"count":336,"lower_bound":"LTEzNzE2NzI5NjE=","upper_bound":"LTEzNTk1NDk4MTQ=","repeats":1},{"count":344,"lower_bound":"LTEzNTg5NjA3MDA=","upper_bound":"LTEzMzgyMzU2OTg=","repeats":1},{"count":352,"lower_bound":"LTEzMzQzMzE1MDY=","upper_bound":"LTEzMjA0MTc5Mzg=","repeats":1},{"count":360,"lower_bound":"LTEzMDYwNjU3Njc=","upper_bound":"LTEyODE4NzkyODc=","repeats":1},{"count":368,"lower_bound":"LTEyNzA3MTA4MjE=","upper_bound":"LTEyNTYzNzQ2OTg=","repeats":1},{"count":376,"lower_bound":"LTEyNTU4MTcxODQ=","upper_bound":"LTEyMzY1OTUwMzQ=","repeats":1},{"count":384,"lower_bound":"LTEyMTg3ODgzMDg=","upper_bound":"LTEyMDg1Mzc3MDg=","repeats":1},{"count":392,"lower_bound":"LTEyMDMwNjIzNjM=","upper_bound":"LTExOTI1NjA2MjA=","repeats":1},{"count":400,"lower_bound":"LTExOTE1MTAxOTk=","upper_bound":"LTExODY0NjA1MzU=","repeats":1},{"count":408,"lower_bound":"LTExODUzMDU2ODQ=","upper_bound":"LTExNzc2ODMxMzc=","repeats":1},{"count":416,"lower_bound":"LTExNzY2OTAzMjc=","upper_bound":"LTExNzIwNzA4MjA=","repeats":1},{"count":424,"lower_bound":"LTExNjk5OTc1NjA=","upper_bound":"LTExNjM0MTc3NjM=","repeats":1},{"count":432,"lower_bound":"LTExNDkxMjE5ODI=","upper_bound":"LTExNDE3NjU2NDQ=","repeats":1},{"count":440,"lower_bound":"LTExMzI2Nzg4MTg=","upper_bound":"LTExMTUwNTg1MDI=","repeats":1},{"count":448,"lower_bound":"LTExMTMyOTU1ODI=","upper_bound":"LTEwOTYzNDE0Mzc=","repeats":1},{"count":456,"lower_bound":"LTEwOTUwMDk2NjQ=","upper_bound":"LTEwODczMzg5MDg=","repeats":1},{"count":464,"lower_bound":"LTEwODQyNjcyNDg=","upper_bound":"LTEwNzExNzI4NDQ=","repeats":1},{"count":472,"lower_bound":"LTEwNjc2MjUxNzA=","upper_bound":"LTEwNjI4NTI2NDA=","repeats":1},{"count":480,"lower_bound":"LTEwNjIyMzQwMjQ=","upper_bound":"LTEwNDE2NTE5ODk=","repeats":1},{"count":488,"lower_bound":"LTEwNDA0OTgzMTk=","upper_bound":"LTEwMTk5NTU3OTI=","repeats":1},{"count":496,"lower_bound":"LTEwMTU4MjM0NDI=","upper_bound":"LTk5OTI4ODE0OA==","repeats":1},{"count":504,"lower_bound":"LTk5MzU2NDMxMg==","upper_bound":"LTk2NjgwMTY5Mg==","repeats":1},{"count":512,"lower_bound":"LTk2NjAxMzc2Mg==","upper_bound":"LTk1NjA2MDc2Ng==","repeats":1},{"count":520,"lower_bound":"LTk1NDE5MjYxNQ==","upper_bound":"LTkzOTQwNDg2OQ==","repeats":1},{"count":528,"lower_bound":"LTkzOTEzMTgzNw==","upper_bound":"LTkyMTYzOTI1NQ==","repeats":1},{"count":536,"lower_bound":"LTkyMTQwMTI0Mg==","upper_bound":"LTkxMTk5ODU1NA==","repeats":1},{"count":544,"lower_bound":"LTkwNzYwMjA3Ng==","upper_bound":"LTkwNTI0NDU1Mw==","repeats":1},{"count":552,"lower_bound":"LTkwMzM2NzYyNQ==","upper_bound":"LTg5NDM4MTc4NQ==","repeats":1},{"count":560,"lower_bound":"LTg5MzA4NjIzNA==","upper_bound":"LTg5MDQ3NzQ5MA==","repeats":1},{"count":568,"lower_bound":"LTg4MzE0NjcxOA==","upper_bound":"LTg2OTI5ODExMw==","repeats":1},{"count":576,"lower_bound":"LTg2NTYxNjI2Mw==","upper_bound":"LTg1MjI0NzM4MQ==","repeats":1},{"count":584,"lower_bound":"LTg0NjYzMTQ4MQ==","upper_bound":"LTgzMzc3NzI0NA==","repeats":1},{"count":592,"lower_bound":"LTgxMzk0NjcwMg==","upper_bound":"LTc3NzIyOTc5NQ==","repeats":1},{"count":600,"lower_bound":"LTc3NzAyNjYxMA==","upper_bound":"LTc2NjU3MTM3Nw==","repeats":1},{"count":608,"lower_bound":"LTc2MjEzOTM3MQ==","upper_bound":"LTc1NDA2Nzc5OQ==","repeats":1},{"count":616,"lower_bound":"LTc1Mzc4OTQ3Mg==","upper_bound":"LTcyMTQxOTM4OA==","repeats":1},{"count":624,"lower_bound":"LTcyMDEyMTM4OA==","upper_bound":"LTY5Njk4MTc2Ng==","repeats":1},{"count":632,"lower_bound":"LTY5MzgyNzM3Mg==","upper_bound":"LTY3Mzg2ODgyNA==","repeats":1},{"count":640,"lower_bound":"LTY2NTQ3MDg1MQ==","upper_bound":"LTY1NjY5ODg2Nw==","repeats":1},{"count":648,"lower_bound":"LTY1NTIyNTk4NQ==","upper_bound":"LTY1MjQ3MDA4MQ==","repeats":1},{"count":656,"lower_bound":"LTY1MTE4MDM2NQ==","upper_bound":"LTYzMjg4NTIzNg==","repeats":1},{"count":664,"lower_bound":"LTYyNzI2NzQ0NQ==","upper_bound":"LTYxMzk2MTMyNg==","repeats":1},{"count":672,"lower_bound":"LTYwODk0MzM4OQ==","upper_bound":"LTU5NjYxNjQ2NQ==","repeats":1},{"count":680,"lower_bound":"LTU5MzU5Mzc5Mw==","upper_bound":"LTU4MTIyMzQ2OQ==","repeats":1},{"count":688,"lower_bound":"LTU3ODc1ODcxMA==","upper_bound":"LTU1OTc2ODYzMQ==","repeats":1},{"count":696,"lower_bound":"LTU1NjQxNzA5NA==","upper_bound":"LTUzODI0MTA2Nw==","repeats":1},{"count":704,"lower_bound":"LTUyMDk5Mzk3Mg==","upper_bound":"LTUxMjQ3MTM3NA==","repeats":1},{"count":712,"lower_bound":"LTUxMTAzMzMxNg==","upper_bound":"LTQ4MzQwNTA5NA==","repeats":1},{"count":720,"lower_bound":"LTQ4MDM2MTgzNQ==","upper_bound":"LTQ1NTMwMzQ1NA==","repeats":1},{"count":728,"lower_bound":"LTQ1MzcxNzk2MA==","upper_bound":"LTQ0NzM4NjA4OQ==","repeats":1},{"count":736,"lower_bound":"LTQ0MTkxNDEwMQ==","upper_bound":"LTQzMTQxOTkxMw==","repeats":1},{"count":744,"lower_bound":"LTQyOTg3OTM3MQ==","upper_bound":"LTQwNDMwOTU5Mw==","repeats":1},{"count":752,"lower_bound":"LTQwMjY3NDU1NQ==","upper_bound":"LTM5NzA3MDg5MQ==","repeats":1},{"count":760,"lower_bound":"LTM5NTQ1NjM2Ng==","upper_bound":"LTM5MjMzNDc5Mg==","repeats":1},{"count":768,"lower_bound":"LTM4NjMxNDg1NQ==","upper_bound":"LTM3MjU2MzgxMQ==","repeats":1},{"count":776,"lower_bound":"LTM3MDYwMzg4OA==","upper_bound":"LTM1ODY5NTA0NA==","repeats":1},{"count":784,"lower_bound":"LTM1MTc2Mzg3NA==","upper_bound":"LTM0MDA1MDUwNw==","repeats":1},{"count":792,"lower_bound":"LTMzMTc5Nzk4OA==","upper_bound":"LTMyMTAxMDQwMA==","repeats":1},{"count":800,"lower_bound":"LTMxNzk2ODY3Ng==","upper_bound":"LTMwOTY5Njc3Mg==","repeats":1},{"count":808,"lower_bound":"LTMwOTU0NDExNQ==","upper_bound":"LTMwNDQ3NTUxNw==","repeats":1},{"count":816,"lower_bound":"LTMwMzc5NzA4MQ==","upper_bound":"LTI5NzAxMjc5OA==","repeats":1},{"count":824,"lower_bound":"LTI5MjM4OTc0OQ==","upper_bound":"LTI4NDkxNjk5NA==","repeats":1},{"count":832,"lower_bound":"LTI4MTM2MTg0Mg==","upper_bound":"LTI2NDA0MDgyMA==","repeats":1},{"count":840,"lower_bound":"LTI2MzM4MDc3NQ==","upper_bound":"LTI0ODEwOTc0NA==","repeats":1},{"count":848,"lower_bound":"LTI0NjgyOTk2MA==","upper_bound":"LTIzMjE5NTg0OA==","repeats":1},{"count":856,"lower_bound":"LTIyNTg0ODg4OA==","upper_bound":"LTIxMDYzMTc1NQ==","repeats":1},{"count":864,"lower_bound":"LTIwNDg2NTQ3MA==","upper_bound":"LTIwMTUwNzc3OQ==","repeats":1},{"count":872,"lower_bound":"LTIwMDc0MTI3OA==","upper_bound":"LTE4MzcwODYyOA==","repeats":1},{"count":880,"lower_bound":"LTE4MjM3NTg5Mw==","upper_bound":"LTE1NDk4MTMxNg==","repeats":1},{"count":888,"lower_bound":"LTE1MjU4Mjc1MA==","upper_bound":"LTEyODc0NjcwNg==","repeats":1},{"count":896,"lower_bound":"LTEyODA2MjU1MA==","upper_bound":"LTEwOTUxNTc3MA==","repeats":1},{"count":904,"lower_bound":"LTEwMjY0NjU0NQ==","upper_bound":"LTkxNzg4MzUz","repeats":1},{"count":912,"lower_bound":"LTgyNDMzNzMz","upper_bound":"LTYzNDA5NzUy","repeats":1},{"count":920,"lower_bound":"LTYyMzE3ODQw","upper_bound":"LTQ5MjEyMjE2","repeats":1},{"count":928,"lower_bound":"LTQ3MjIyMjY1","upper_bound":"LTQwMTU5MjM0","repeats":1},{"count":936,"lower_bound":"LTM5MzczMjk3","upper_bound":"LTMzMzA2NTA0","repeats":1},{"count":944,"lower_bound":"LTI5NjMwOTAx","upper_bound":"LTIyMDM5NDMy","repeats":1},{"count":952,"lower_bound":"LTE5MTgyMjIx","upper_bound":"LTEyNDU3Njk0","repeats":1},{"count":960,"lower_bound":"LTEwNDMyMDU4","upper_bound":"LTc2MjE2MQ==","repeats":1},{"count":968,"lower_bound":"MTE1ODUxNDc=","upper_bound":"MTk5MTUxMzc=","repeats":1},{"count":976,"lower_bound":"MTk5NTQ3OTg=","upper_bound":"Mjk1NTk4Njg=","repeats":1},{"count":984,"lower_bound":"MzUwMzczODI=","upper_bound":"NDI4NTMzMTI=","repeats":1},{"count":992,"lower_bound":"NDMwMjgxODQ=","upper_bound":"NTQ0NTg3NzE=","repeats":1},{"count":1000,"lower_bound":"NjEyMTM4ODQ=","upper_bound":"Njk5MTk2ODM=","repeats":1},{"count":1008,"lower_bound":"NzQzMzkxNjA=","upper_bound":"ODY4NDg0MDU=","repeats":1},{"count":1016,"lower_bound":"MTAxNjY4NTYy","upper_bound":"MTE0MDcwMjEw","repeats":1},{"count":1024,"lower_bound":"MTIyODc3NjY5","upper_bound":"MTMwNDA2NDE0","repeats":1},{"count":1032,"lower_bound":"MTMwNjkyNDcy","upper_bound":"MTQ1NTI3NDkx","repeats":1},{"count":1040,"lower_bound":"MTQ4NTI0NTE5","upper_bound":"MTU3MTI5NTg3","repeats":1},{"count":1048,"lower_bound":"MTY2MTI5NzYx","upper_bound":"MTc1Nzc3NzMx","repeats":1},{"count":1056,"lower_bound":"MTgwMTc3OTIx","upper_bound":"MTkwMDAzMDMy","repeats":1},{"count":1064,"lower_bound":"MTkxMDU4NjAy","upper_bound":"MjE4ODg5NDk2","repeats":1},{"count":1072,"lower_bound":"MjIwMzQwMzE1","upper_bound":"MjMzOTM0MjY0","repeats":1},{"count":1080,"lower_bound":"MjM1NzMzNTE1","upper_bound":"MjUwNTgwODkw","repeats":1},{"count":1088,"lower_bound":"MjU1MTYxOTI3","upper_bound":"MjYyMjkxODM5","repeats":1},{"count":1096,"lower_bound":"MjgwNTU2MjE5","upper_bound":"MjgzOTM4MTMx","repeats":1},{"count":1104,"lower_bound":"Mjg0NjQwMzE0","upper_bound":"MzA4ODM2NDkw","repeats":1},{"count":1112,"lower_bound":"MzEwNzY5ODYw","upper_bound":"MzIyMDU3NzMy","repeats":1},{"count":1120,"lower_bound":"MzI1OTMxMzM5","upper_bound":"MzUyMDMzNzk0","repeats":1},{"count":1128,"lower_bound":"MzUyMzUwMjk2","upper_bound":"MzUzOTM1NTg0","repeats":1},{"count":1136,"lower_bound":"MzU0Mjc2MzM5","upper_bound":"MzY2NzU3MzE5","repeats":1},{"count":1144,"lower_bound":"MzY2NzY5NzU5","upper_bound":"Mzc0MDg5MjI4","repeats":1},{"count":1152,"lower_bound":"Mzc4MTA5OTgz","upper_bound":"Mzk4MzY4NzU0","repeats":1},{"count":1160,"lower_bound":"Mzk4NTgyMDY2","upper_bound":"NDE5NjI2MjUx","repeats":1},{"count":1168,"lower_bound":"NDE5NzA5OTA1","upper_bound":"NDM4Njg2OTQw","repeats":1},{"count":1176,"lower_bound":"NDQ0MDk4MTA4","upper_bound":"NDY1ODcwMDky","repeats":1},{"count":1184,"lower_bound":"NDY3NDYzMDYz","upper_bound":"NDc3NDE0ODcx","repeats":1},{"count":1192,"lower_bound":"NDc4NjY1OTQ5","upper_bound":"NDg1Mzk5NjA1","repeats":1},{"count":1200,"lower_bound":"NDg3NTEwMDUz","upper_bound":"NDk3NjU1NzEz","repeats":1},{"count":1208,"lower_bound":"NDk4OTkyNTAx","upper_bound":"NTA5NjU4NDUz","repeats":1},{"count":1216,"lower_bound":"NTEzMDc4MzQ0","upper_bound":"NTIzMzY4OTAx","repeats":1},{"count":1224,"lower_bound":"NTI2NzUwOTY3","upper_bound":"NTMxMTEyODcy","repeats":1},{"count":1232,"lower_bound":"NTMxMjc0MzYw","upper_bound":"NTQwMzA2MTY3","repeats":1},{"count":1240,"lower_bound":"NTQ1MDgzMDY0","upper_bound":"NTY2MTEyMjky","repeats":1},{"count":1248,"lower_bound":"NTY4NTk4NDgx","upper_bound":"NTg3OTA5MjEz","repeats":1},{"count":1256,"lower_bound":"NTkyMDc2OTkz","upper_bound":"NTk4NjExNzc4","repeats":1},{"count":1264,"lower_bound":"NjE5NDQ4OTc5","upper_bound":"NjI0NTk2NTA3","repeats":1},{"count":1272,"lower_bound":"NjI0NzUxNjkw","upper_bound":"NjMyNTg0MjA2","repeats":1},{"count":1280,"lower_bound":"NjM5NTQyMTgz","upper_bound":"NjQ5NDk4OTU5","repeats":1},{"count":1288,"lower_bound":"NjUwODMyNzIy","upper_bound":"NjYxNDcyMTQ5","repeats":1},{"count":1296,"lower_bound":"NjY4MzE5MzMw","upper_bound":"Njc4OTk1NzY5","repeats":1},{"count":1304,"lower_bound":"NjgyOTM5NDc4","upper_bound":"NzA1MjY3NjI1","repeats":1},{"count":1312,"lower_bound":"NzA1ODk3NDY4","upper_bound":"NzMzODU5OTU0","repeats":1},{"count":1320,"lower_bound":"NzM3MDc2Mjkx","upper_bound":"NzQ3NDI5MTc0","repeats":1},{"count":1328,"lower_bound":"NzUzNzMyNjk0","upper_bound":"NzcwMTUwMzAz","repeats":1},{"count":1336,"lower_bound":"NzcxMzczNTUy","upper_bound":"Nzk0MTc1MjEw","repeats":1},{"count":1344,"lower_bound":"Nzk3MDg2NTU4","upper_bound":"ODE2MjIxNTYz","repeats":1},{"count":1352,"lower_bound":"ODE2NTAwOTE5","upper_bound":"ODM0OTI0Mjg1","repeats":1},{"count":1360,"lower_bound":"ODQwMjg1Nzg0","upper_bound":"ODQ5NDkxMTQ4","repeats":1},{"count":1368,"lower_bound":"ODUwODExMjI4","upper_bound":"ODU4Nzc1OTA1","repeats":1},{"count":1376,"lower_bound":"ODYwODkxNDAy","upper_bound":"ODcxNDk1OTA4","repeats":1},{"count":1384,"lower_bound":"ODcxNjczMDY0","upper_bound":"ODg5MDQyNDY4","repeats":1},{"count":1392,"lower_bound":"OTA1ODExODg1","upper_bound":"OTEzNjI4ODU1","repeats":1},{"count":1400,"lower_bound":"OTI4ODUyMDM3","upper_bound":"OTQ2NTQzNTE3","repeats":1},{"count":1408,"lower_bound":"OTU3NjQwNTMz","upper_bound":"OTYzMDk0NjE4","repeats":1},{"count":1416,"lower_bound":"OTYzMjQ0Mzk1","upper_bound":"OTcyNTAzOTAy","repeats":1},{"count":1424,"lower_bound":"OTczNjA0MDQ0","upper_bound":"OTkyMTQ2MTQ4","repeats":1},{"count":1432,"lower_bound":"MTAwMzExOTM1Ng==","upper_bound":"MTAwODgwODQ3MQ==","repeats":1},{"count":1440,"lower_bound":"MTAxNTkwMjU4OQ==","upper_bound":"MTAxODQ4NTQ2OQ==","repeats":1},{"count":1448,"lower_bound":"MTAyMDU5NTk3NA==","upper_bound":"MTAzNDMxMjU1Ng==","repeats":1},{"count":1456,"lower_bound":"MTAzNTEzODU4MQ==","upper_bound":"MTA0MDA0MzQ1MA==","repeats":1},{"count":1464,"lower_bound":"MTA0MTQ0MDkzMQ==","upper_bound":"MTA2NjU5NTM2OA==","repeats":1},{"count":1472,"lower_bound":"MTA3Njg4MDU4Mw==","upper_bound":"MTA4MTM5NDQ1Mw==","repeats":1},{"count":1480,"lower_bound":"MTA4MTkxNzYyNA==","upper_bound":"MTA5NzM2NTc2NA==","repeats":1},{"count":1488,"lower_bound":"MTA5Nzc4MTEzOQ==","upper_bound":"MTEwMzUxMjk1NA==","repeats":1},{"count":1496,"lower_bound":"MTEwNzUzNTQzNA==","upper_bound":"MTEzNDg3MDI1OQ==","repeats":1},{"count":1504,"lower_bound":"MTE0Mzg2MDk0NQ==","upper_bound":"MTE1MzQwMzUxMw==","repeats":1},{"count":1512,"lower_bound":"MTE1ODk4Nzk0Ng==","upper_bound":"MTE5OTQ5Nzc5MA==","repeats":1},{"count":1520,"lower_bound":"MTIwMDk2ODA0Nw==","upper_bound":"MTIxMTk5OTA2MQ==","repeats":1},{"count":1528,"lower_bound":"MTIxMjI5Njg2NA==","upper_bound":"MTIyNTExMTA3Nw==","repeats":1},{"count":1536,"lower_bound":"MTIyNTM1ODYwMg==","upper_bound":"MTIyNjAzNTAwMA==","repeats":1},{"count":1544,"lower_bound":"MTIzMTc1ODM5NA==","upper_bound":"MTI0ODc0MzU3Nw==","repeats":1},{"count":1552,"lower_bound":"MTI1MjYzNjYyOQ==","upper_bound":"MTI2MDcwOTc4Mg==","repeats":1},{"count":1560,"lower_bound":"MTI3MDIwMDc0Nw==","upper_bound":"MTI4MjQzMjg3MQ==","repeats":1},{"count":1568,"lower_bound":"MTI4MjYzNzY2MQ==","upper_bound":"MTI5NTk2ODY4OA==","repeats":1},{"count":1576,"lower_bound":"MTI5NzY3MjI1OQ==","upper_bound":"MTMwODMyMjU3OA==","repeats":1},{"count":1584,"lower_bound":"MTMxMjA5MjI1Ng==","upper_bound":"MTM1MjY3NzQxNw==","repeats":1},{"count":1592,"lower_bound":"MTM3MjkwNjQ3OQ==","upper_bound":"MTM4MzEzNTkxNQ==","repeats":1},{"count":1600,"lower_bound":"MTM4MzM0NTI4NA==","upper_bound":"MTM5NTUzNjEwMw==","repeats":1},{"count":1608,"lower_bound":"MTM5NjIyMzc2NA==","upper_bound":"MTQwNjYwMDM5OQ==","repeats":1},{"count":1616,"lower_bound":"MTQxMDU2MjkxNA==","upper_bound":"MTQxNzAxNTIwNA==","repeats":1},{"count":1624,"lower_bound":"MTQxOTQ0NTAwNw==","upper_bound":"MTQzMzUwODgzNA==","repeats":1},{"count":1632,"lower_bound":"MTQzNDg5ODE2OA==","upper_bound":"MTQzNzY5MDExNQ==","repeats":1},{"count":1640,"lower_bound":"MTQzOTIzODMyMg==","upper_bound":"MTQ1MzE1OTgxMQ==","repeats":1},{"count":1648,"lower_bound":"MTQ1OTgwNTk4NA==","upper_bound":"MTQ2MjY4NzQxNw==","repeats":1},{"count":1656,"lower_bound":"MTQ2Mjk1MTE0Mw==","upper_bound":"MTQ3MTMwNDgzMw==","repeats":1},{"count":1664,"lower_bound":"MTQ3MjcwMTE2NA==","upper_bound":"MTQ4NjE0MzQwMw==","repeats":1},{"count":1672,"lower_bound":"MTQ4ODI2ODQ5MQ==","upper_bound":"MTQ5NDc2NzM4Mg==","repeats":1},{"count":1680,"lower_bound":"MTQ5NTY4MTg5NQ==","upper_bound":"MTUwMjM4ODI3Mw==","repeats":1},{"count":1688,"lower_bound":"MTUwNDAyNDkzMg==","upper_bound":"MTUxNTk2NTgwNA==","repeats":1},{"count":1696,"lower_bound":"MTUxNzg2MDE4MA==","upper_bound":"MTUyMDk5NzMxNg==","repeats":1},{"count":1704,"lower_bound":"MTUyMTQwNjg2NQ==","upper_bound":"MTUyOTM2NDcxNA==","repeats":1},{"count":1712,"lower_bound":"MTU0MDcwMjQ2Mw==","upper_bound":"MTU1NjkxNDg5NA==","repeats":1},{"count":1720,"lower_bound":"MTU1NzY5NDM5NQ==","upper_bound":"MTU4MTQxMzc2OA==","repeats":1},{"count":1728,"lower_bound":"MTU4MjY1NTQ1Nw==","upper_bound":"MTU4ODA3NDY3Nw==","repeats":1},{"count":1736,"lower_bound":"MTU4ODQyNTUwNA==","upper_bound":"MTYwMTM2MzAzNA==","repeats":1},{"count":1744,"lower_bound":"MTYxMDQyMTUxNA==","upper_bound":"MTYyNTkyODk3NA==","repeats":1},{"count":1752,"lower_bound":"MTYyNjE0ODg3NQ==","upper_bound":"MTY0NjY0NzcyNw==","repeats":1},{"count":1760,"lower_bound":"MTY1MjQ5MzY0NQ==","upper_bound":"MTY2MzY5MjQ1OQ==","repeats":1},{"count":1768,"lower_bound":"MTY2OTM5OTM3NQ==","upper_bound":"MTY3MjMyMTg3MQ==","repeats":1},{"count":1776,"lower_bound":"MTY3NDUyOTkzNQ==","upper_bound":"MTY4NzMyMDk4NQ==","repeats":1},{"count":1784,"lower_bound":"MTY4NzcxODY4Mw==","upper_bound":"MTcwNDAwNjE5Nw==","repeats":1},{"count":1792,"lower_bound":"MTcwNDc5NzIyOQ==","upper_bound":"MTcxOTA1NzE4MQ==","repeats":1},{"count":1800,"lower_bound":"MTcyNjcyNTYxNg==","upper_bound":"MTc0MDA0NDcxOQ==","repeats":1},{"count":1808,"lower_bound":"MTc0MDc4OTkwMg==","upper_bound":"MTc0NzMzNjA5NA==","repeats":1},{"count":1816,"lower_bound":"MTc2MTExMjYzNg==","upper_bound":"MTc5MzMzMjE5OA==","repeats":1},{"count":1824,"lower_bound":"MTgwMDI0MDkwOQ==","upper_bound":"MTgwMjgyMTcwOA==","repeats":1},{"count":1832,"lower_bound":"MTgxMTIzODUwNA==","upper_bound":"MTgxNzcwMjM3OA==","repeats":1},{"count":1840,"lower_bound":"MTgyMTcwMjUwOA==","upper_bound":"MTgzNTk1MDQ4Ng==","repeats":1},{"count":1848,"lower_bound":"MTgzNjQ4NTM4NA==","upper_bound":"MTg0Njc4MTI1Mw==","repeats":1},{"count":1856,"lower_bound":"MTg1MjU0ODEzMg==","upper_bound":"MTg2MzMwMzkyMw==","repeats":1},{"count":1864,"lower_bound":"MTg2NTA5Njg1Nw==","upper_bound":"MTg3NTI0NzE0MA==","repeats":1},{"count":1872,"lower_bound":"MTg3OTQ4NTIwNw==","upper_bound":"MTg4MTk3NDE5Mw==","repeats":1},{"count":1880,"lower_bound":"MTg4NTQ3NjA1Ng==","upper_bound":"MTg5NDIzOTc0OQ==","repeats":1},{"count":1888,"lower_bound":"MTg5OTM3Mjk5MA==","upper_bound":"MTkwNDQ1OTk2MQ==","repeats":1},{"count":1896,"lower_bound":"MTkwODY3NjU0OQ==","upper_bound":"MTkxODQzMDU1Nw==","repeats":1},{"count":1904,"lower_bound":"MTkyMDA0NTgxMA==","upper_bound":"MTkzMDkzODExNw==","repeats":1},{"count":1912,"lower_bound":"MTkzMTU0MTM1Mg==","upper_bound":"MTkzODQ4MTE4Nw==","repeats":1},{"count":1920,"lower_bound":"MTkzOTY1MzE4OA==","upper_bound":"MTk0OTM2NTU3Mg==","repeats":1},{"count":1928,"lower_bound":"MTk1NzM3Mzg0NA==","upper_bound":"MTk2ODc4Nzc5Mg==","repeats":1},{"count":1936,"lower_bound":"MTk3MzQ3OTczNg==","upper_bound":"MTk4NjEzMjY3NQ==","repeats":1},{"count":1944,"lower_bound":"MTk4ODA3MjAwOA==","upper_bound":"MTk5NjIzNDQ0MQ==","repeats":1},{"count":1952,"lower_bound":"MjAwNjE5OTgzMg==","upper_bound":"MjAyMjcxMjUzMw==","repeats":1},{"count":1960,"lower_bound":"MjAzMTU1ODA5Ng==","upper_bound":"MjA0NTI1NjA5Nw==","repeats":1},{"count":1968,"lower_bound":"MjA1NTU3MTEzMg==","upper_bound":"MjA3MzYyNTk5MQ==","repeats":1},{"count":1976,"lower_bound":"MjA3NDQyODkzNg==","upper_bound":"MjA4NDUwNTE5Nw==","repeats":1},{"count":1984,"lower_bound":"MjA4NjE3NDM3Mg==","upper_bound":"MjA5NTE4NTUxMw==","repeats":1},{"count":1992,"lower_bound":"MjA5ODAwMjEwOA==","upper_bound":"MjEzNDgwMDc4MQ==","repeats":1},{"count":2000,"lower_bound":"MjEzNTY3MjUzNA==","upper_bound":"MjE0NzE0NTQwNA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2,0,2,1,0,1,1,1,0,0,1,0,4,2,1,1,2,1,0,1,0,0,1,0,1,1,1,3,0,2,2,2,1,0,1,0,2,1,2,2,1,0,0,0,0,0,3,2,0,0,1,0,1,1,2,0,1,1,1,3,1,0,1,1,0,1,0,1,2,2,0,1,0,1,0,2,1,2,2,3,2,1,0,1,1,1,0,1,1,0,0,1,1,2,0,2,1,0,1,1,0,1,1,1,1,0,0,1,1,3,0,0,0,1,2,2,1,0,1,0,3,4,1,2,1,1,3,0,0,0,0,2,0,2,0,0,1,0,2,2,0,2,0,1,1,0,1,2,1,0,1,0,1,2,2,0,0,0,5,0,1,1,0,1,1,0,2,0,3,2,1,1,0,0,0,0,0,0,0,0,1,2,0,0,1,0,1,0,0,3,0,0,2,2,0,0,0,1,0,1,0,2,0,0,1,1,0,0,2,1,1,0,1,3,0,0,0,2,0,1,0,5,0,1,0,1,0,1,1,2,2,1,1,1,1,3,3,1,0,1,0,1,2,1,0,0,0,0,2,2,0,0,1,0,2,0,0,0,1,0,1,0,1,1,0,0,0,1,2,1,0,0,0,0,0,0,3,0,1,3,0,0,3,1,0,2,0,0,3,1,1,0,0,0,1,0,1,4,2,1,2,0,1,2,2,4,1,1,0,0,1,2,0,0,3,2,0,1,0,2,1,2,0,2,0,3,2,2,1,1,3,3,1,0,0,0,1,1,2,2,2,0,1,0,3,0,1,1,0,0,0,0,0,1,1,1,2,0,1,1,3,2,1,0,1,0,2,4,2,3,0,1,0,1,0,3,0,3,2,0,1,1,2,0,1,2,0,0,0,0,0,3,0,0,1,1,1,0,4,1,2,0,0,1,0,1,0,2,2,1,0,1,0,2,0,1,3,0,2,0,1,1,1,1,0,2,1,1,0,0,1,0,1,2,0,1,2,1,2,3,1,2,0,1,2,1,4,1,0,0,1,2,0,0,1,2,0,4,2,1,0,0,0,0,2,0,3,1,1,1,0,1,1,2,4,3,0,2,1,1,1,0,0,0,0,1,0,1,0,0,1,0,0,0,0,2,3,1,1,0,3,0,1,2,1,0,1,0,0,1,1,3,1,1,0,3,1,1,0,0,2,1,1,1,1,0,0,0,1,2,2,2,1,0,1,0,0,0,1,4,3,0,1,0,2,0,1,0,2,0,0,1,0,0,2,2,2,2,0,4,1,1,1,1,1,2,0,0,2,0,1,0,1,1,1,3,0,1,1,0,3,1,2,1,1,0,1,0,1,0,1,2,2,0,1,1,0,3,0,2,1,3,1,2,0,0,1,0,1,1,0,2,1,0,0,1,0,3,0,2,1,1,2,2,0,1,0,1,1,0,0,0,0,0,0,0,0,2,1,1,0,2,1,0,2,0,3,1,0,0,0,2,4,1,1,4,1,1,0,0,2,1,0,0,0,0,2,1,1,1,0,1,1,1,3,0,1,0,0,1,0,0,2,1,2,0,3,0,1,1,1,4,1,0,1,2,0,1,0,0,1,0,2,3,0,2,0,3,1,1,0,1,1,1,0,0,2,1,0,2,1,0,0,3,1,0,0,1,0,1,0,1,1,3,2,1,2,1,1,0,0,0,0,0,0,0,0,3,1,1,3,1,1,2,1,0,4,1,1,2,0,1,0,1,0,1,1,1,1,2,1,0,2,1,1,1,1,1,0,1,1,2,0,0,0,0,0,0,1,1,1,0,1,0,1,3,0,2,0,0,1,1,0,1,1,2,1,2,0,2,1,3,2,1,1,2,1,0,1,2,1,0,2,2,0,3,2,1,2,1,1,2,1,1,2,0,0,0,2,0,3,1,2,1,0,0,0,3,0,3,1,1,2,1,0,0,1,2,1,0,1,0,1,2,4,2,1,1,0,2,1,2,1,3,1,2,2,1,1,0,2,2,1,2,0,1,0,0,0,0,1,2,2,1,0,0,1,0,1,0,0,3,1,1,2,2,2,1,0,0,1,0,0,0,2,0,1,0,3,0,1,3,0,1,0,0,0,1,0,0,1,0,0,1,0,1,0,0,2,0,1,1,1,2,1,2,0,2,2,0,1,1,0,2,1,1,1,1,1,0,2,1,0,0,1,0,0,1,0,0,0,3,0,0,1,1,0,3,0,1,0,1,2,2,3,2,1,0,0,1,1,1,0,1,0,1,1,1,2,1,0,0,1,1,0,0,1,1,0,1,1,1,2,0,0,0,1,2,0,0,3,2,1,0,1,0,3,1,0,2,0,2,1,0,2,1,2,1,1,1,0,3,2,0,0,0,2,3,1,1,0,3,1,1,2,0,0,0,0,0,1,3,1,1,0,0,2,0,2,1,4,1,0,1,2,0,1,0,2,2,0,1,1,0,0,2,0,0,0,1,2,0,2,0,0,1,1,0,3,1,0,1,1,1,0,1,0,1,1,2,1,0,2,2,1,1,1,1,0,0,2,0,0,0,2,1,0,0,3,0,1,0,1,0,1,1,2,0,0,0,1,0,1,0,1,0,0,0,1,0,1,0,1,1,1,0,4,2,1,1,1,2,3,1,1,4,0,2,2,3,1,0,0,1,1,1,2,1,1,0,0,0,1,3,1,0,1,1,3,1,1,3,0,2,0,2,1,1,0,1,2,0,1,1,2,0,0,1,0,0,1,0,0,0,0,0,2,1,2,1,2,2,0,1,1,0,0,0,1,0,1,0,1,1,3,0,1,0,1,0,1,1,2,0,3,1,1,1,1,1,2,1,1,3,0,2,3,0,0,0,0,1,2,2,1,2,2,3,0,0,0,3,0,0,3,0,3,0,1,0,1,2,2,1,0,0,1,1,2,4,1,0,1,6,0,1,1,0,2,3,2,1,0,2,3,2,0,2,0,1,1,1,0,1,1,1,1,1,1,1,1,2,0,0,0,0,2,1,2,1,1,2,2,1,0,4,1,1,1,1,0,2,0,0,3,0,2,0,1,2,0,1,2,0,1,1,1,0,0,0,2,0,2,0,1,1,3,1,2,0,1,1,2,0,0,0,0,3,2,1,0,0,2,0,3,0,1,1,1,1,1,1,2,0,0,1,2,1,0,1,2,0,2,3,0,2,3,0,3,1,1,2,0,0,1,1,2,1,4,1,1,1,0,2,0,0,0,1,1,1,0,0,2,0,1,0,0,1,0,1,0,3,3,1,1,0,1,1,1,0,0,0,3,4,1,1,1,0,0,4,0,0,0,1,0,2,2,0,0,1,0,2,3,1,0,0,1,1,4,0,2,1,0,0,1,2,3,0,1,1,0,1,0,1,1,0,0,1,1,0,2,2,1,1,1,1,0,0,0,5,1,0,0,1,2,0,0,1,0,2,1,0,1,1,1,1,2,1,2,0,0,1,1,0,0,2,0,1,2,2,0,0,1,1,1,0,1,2,0,2,1,2,0,1,0,2,3,0,2,1,1,0,2,0,1,1,3,1,1,1,0,1,0,0,1,3,0,1,1,0,1,1,0,1,1,1,0,0,2,1,1,0,0,2,1,0,0,0,1,1,2,0,3,0,3,0,0,3,0,2,1,0,1,1,1,1,1,0,0,2,0,3,1,2,2,0,1,0,2,0,1,1,1,0,1,3,2,1,0,2,0,1,2,2,1,2,1,0,2,2,0,1,2,2,0,3,3,2,0,2,2,1,1,3,0,2,3,2,0,0,2,0,0,0,1,0,1,3,2,1,1,0,1,0,3,2,0,0,2,2,3,0,2,0,0,0,0,1,1,1,1,2,2,2,2,2,1,1,1,0,2,2,0,1,3,0,0,1,2,1,0,1,0,0,1,1,0,1,2,1,0,0,0,0,0,1,1,3,0,2,0,0,1,1,0,1,1,1,2,2,1,1,1,0,0,1,2,1,1,2,2,0,2,0,1,1,0,0,1,0,1,0,1,0,0,0,1,2,1,1,0,1,0,1,0,0,0,0,2,1,1,1,0,1,0,1,0,3,2,0,2,2,2,0,0,2,0,2,0,3,0,1,3,2,0,0,2,2,1,2,0,0,0,0,0,1,2,3,0,1,1,0,1,3,0,1,0,1,0,1,1,2,1,1,1,3,0,1,1,1,1,1,2,0,3,2,0,0,1,0,2,0,2,3,3,0,0,1,0,2,0,1,1,3,2,0,2,1,1,1,1,2,2,0,0,1,0,0,0,1,0,3,2,0,0,1,0,1,2,2,0,1,0,2,0,1,2,0,2,0,0,1,2,4,3,1,1,1,1,1,1,0,3,3,0,2,1,1,2,0,0,0,2,1,1,1,1,2,2,2,2,1,2,0,0,2,2,1,2,0,0,0,0,0,2,0,0,1,0,0,1,1,0,2,0,3,0,0,0,0,0,2,2,1,4,0,2,2,1,0,0,1,1,0,2,0,2,2,1,0,1,1,2,1,0,1,2,1,1,0,1,0,0,1,0,1,0,0,0,1,3,2,2,0,0,1,0,0,1,1,1,0,2,1,2,0,0,0,0,0,1,0,0,0,2,0,1,3,1,0,2,0,2,1,0,3,1,1]},{"counters":[0,1,0,1,3,0,0,2,0,0,1,0,0,1,0,2,1,0,1,0,0,1,0,2,2,1,0,0,0,1,2,2,1,1,3,1,0,0,2,3,0,3,2,4,0,1,0,3,0,3,0,2,1,2,1,0,0,0,2,0,0,1,1,2,3,3,2,1,0,2,1,2,0,1,3,2,0,3,0,1,0,2,1,0,0,0,0,0,1,4,0,2,1,1,0,1,3,0,1,0,0,1,1,0,1,0,1,1,2,0,0,1,0,0,0,1,2,1,1,1,2,2,0,1,0,0,0,1,3,2,2,1,2,0,2,0,1,2,0,1,1,1,0,1,0,1,0,0,2,1,1,2,2,1,1,0,1,0,0,0,1,0,0,1,4,1,1,1,0,1,2,2,0,0,1,1,1,0,2,1,1,3,0,0,2,1,1,1,0,2,1,1,0,4,3,2,1,0,2,0,2,0,0,2,1,0,1,2,0,0,0,1,1,2,1,0,1,1,1,0,0,0,1,1,2,0,0,1,2,0,0,3,4,1,2,1,1,1,1,1,1,0,0,2,0,1,0,0,0,0,1,0,1,0,1,0,2,0,1,1,3,1,0,1,1,0,2,1,1,3,2,1,0,1,0,2,0,0,1,1,1,1,0,0,1,0,1,1,1,2,0,0,0,1,0,0,0,2,3,0,0,1,1,2,2,1,1,2,1,1,0,2,1,1,1,1,1,3,0,1,1,1,0,1,0,0,5,2,2,3,0,0,1,2,1,2,1,1,2,0,1,0,2,2,0,0,2,1,0,2,5,1,3,1,2,1,0,0,1,2,2,2,0,0,0,1,1,1,2,0,0,2,0,0,0,0,2,1,0,2,1,2,2,3,1,1,2,0,0,1,1,0,1,0,0,1,0,0,1,3,0,1,0,1,2,0,2,1,3,1,0,0,0,1,3,1,2,2,2,1,1,0,1,2,1,2,2,1,0,1,1,1,0,0,0,0,0,3,1,2,0,1,1,4,2,1,1,0,1,1,2,1,0,1,1,0,1,0,1,0,1,2,3,2,1,1,1,1,1,1,2,0,1,0,2,0,1,1,0,1,0,1,2,0,1,0,3,1,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,1,1,0,2,1,1,0,1,1,0,1,1,0,0,1,1,0,1,1,1,2,1,2,0,2,1,1,1,3,2,1,1,0,2,2,0,0,0,1,0,1,0,2,0,1,2,2,0,4,2,0,0,4,0,1,0,1,2,1,0,0,1,0,1,0,1,2,0,2,3,0,1,1,1,1,3,2,1,0,3,0,3,2,0,2,3,1,1,1,1,1,2,0,0,1,0,1,1,1,2,2,0,2,0,2,1,5,0,2,1,0,1,2,1,2,1,0,1,1,0,4,1,3,1,1,0,1,1,0,0,4,1,1,1,0,3,0,2,1,2,4,1,0,1,2,0,0,1,1,1,0,1,1,2,0,3,2,0,0,0,1,1,0,1,1,0,0,2,0,0,0,0,0,0,2,0,0,2,2,0,0,1,0,2,1,1,1,0,2,0,0,1,0,0,0,2,3,0,1,1,0,0,0,2,2,0,2,1,1,0,0,0,2,0,0,0,1,3,0,2,1,2,1,2,2,1,1,1,2,0,1,1,2,0,0,0,0,0,3,2,1,1,1,2,1,1,0,0,0,0,2,2,2,0,0,1,2,1,3,0,3,1,0,2,0,1,2,2,1,1,0,0,1,0,1,0,0,0,1,0,2,0,2,0,1,2,0,0,0,2,1,1,0,1,0,2,0,1,1,2,1,3,1,1,1,0,0,1,2,1,0,0,2,1,1,1,1,2,2,2,1,2,1,3,0,2,0,0,0,1,0,1,2,1,0,1,1,0,2,0,1,1,0,1,3,1,0,1,1,1,2,1,0,0,0,2,2,2,1,1,1,2,1,0,1,2,1,1,1,3,0,0,0,0,1,1,0,0,2,1,1,1,0,1,0,1,0,0,0,1,1,2,0,1,0,1,1,1,0,4,1,2,3,2,2,2,0,1,2,3,1,0,1,1,1,2,2,0,0,1,1,2,0,0,1,2,0,1,1,0,0,0,0,2,2,0,0,1,1,1,1,1,4,0,1,1,0,2,1,1,0,2,1,0,0,1,2,4,0,1,3,1,3,0,0,1,0,0,0,0,1,2,0,2,3,1,1,1,2,0,0,2,1,0,0,0,1,0,2,0,3,0,1,0,0,1,1,0,1,2,0,2,1,1,0,0,0,1,2,2,1,2,0,1,0,1,1,3,0,1,0,0,1,0,0,1,0,1,3,0,1,1,2,1,4,0,0,0,1,1,1,0,0,3,0,2,2,0,0,0,1,0,1,0,1,1,0,4,1,0,0,1,2,0,1,1,2,2,2,3,0,0,2,2,1,1,2,3,1,1,0,1,0,1,0,0,0,1,0,1,0,2,1,0,2,2,0,1,1,0,1,1,2,1,0,0,0,0,2,0,0,1,1,1,2,0,0,1,1,1,0,0,0,1,0,1,2,0,3,2,1,0,1,0,2,1,1,1,0,0,0,2,1,1,1,1,3,1,0,2,2,0,2,0,1,0,0,1,1,0,1,0,1,2,1,1,0,0,0,0,0,1,1,1,1,2,1,1,0,1,2,0,0,1,1,1,0,0,2,2,0,2,1,1,0,0,0,0,1,0,1,2,0,0,3,0,1,2,2,2,0,1,2,0,1,0,0,0,2,1,0,1,2,0,1,1,1,1,3,0,0,0,1,2,1,1,0,1,1,2,3,2,2,2,0,1,1,0,1,1,5,0,0,0,2,0,3,2,0,1,0,0,1,2,3,2,2,5,4,2,1,2,2,0,2,2,1,2,1,1,1,1,0,0,0,1,0,3,1,0,0,3,3,2,3,2,0,2,1,1,1,0,2,0,2,0,3,1,2,0,0,2,0,0,0,4,0,1,0,1,3,1,2,3,0,0,2,3,1,0,0,0,0,0,1,1,0,0,2,1,1,0,1,3,1,2,0,1,2,1,2,4,1,0,0,1,1,0,0,0,1,0,1,1,1,0,2,0,1,0,2,2,0,2,0,1,0,0,1,1,0,0,1,1,0,2,0,2,1,0,2,1,2,1,0,0,2,1,0,0,0,0,3,2,1,1,1,0,1,0,1,1,3,0,0,1,2,1,0,0,0,1,0,2,1,3,1,0,2,1,0,1,3,1,1,1,1,1,0,2,3,1,0,1,1,0,1,0,1,2,1,0,0,0,4,1,0,1,0,1,0,0,0,4,0,0,0,0,1,1,0,2,2,1,0,0,1,1,1,1,3,0,2,0,3,1,1,0,1,1,0,0,1,2,0,3,3,1,0,0,1,2,0,0,1,0,1,0,2,0,2,2,0,2,1,1,1,1,2,1,0,1,1,0,0,2,2,0,0,1,2,0,3,1,3,0,2,1,0,2,2,1,0,0,0,0,0,0,0,1,0,2,1,1,0,1,0,0,2,2,2,1,1,1,2,1,2,2,1,0,0,2,2,1,0,1,2,1,0,0,1,2,0,0,0,0,1,0,1,0,1,1,1,0,1,1,1,1,1,1,3,0,0,2,0,2,1,2,2,1,1,1,0,1,1,1,0,1,2,0,1,1,0,2,4,2,2,0,0,0,0,1,1,0,1,2,0,0,0,1,1,1,1,0,2,1,0,0,0,2,2,0,2,1,1,2,3,1,3,2,1,1,0,2,1,1,0,2,1,0,0,1,1,0,3,1,1,1,0,1,0,0,0,1,1,4,1,0,0,2,1,0,0,2,1,1,1,3,3,2,1,1,3,0,2,2,2,2,1,0,0,0,1,1,0,2,2,1,1,0,1,1,3,0,1,2,1,1,3,0,0,0,0,3,1,1,4,1,1,0,1,0,1,1,0,1,3,0,0,2,1,1,1,1,0,3,1,0,0,0,0,0,2,0,3,0,0,0,1,0,0,0,0,3,2,3,1,1,2,0,1,4,0,0,2,1,0,1,0,1,1,0,0,2,0,0,1,1,1,1,2,0,1,4,1,2,2,0,2,4,0,1,0,2,0,1,0,2,1,2,1,0,0,1,2,0,1,0,3,1,1,2,1,1,0,1,0,1,2,1,2,1,0,1,1,0,1,1,1,1,3,1,2,2,2,0,1,1,0,1,2,3,1,0,0,2,2,2,0,0,2,2,1,1,0,0,2,0,0,0,0,0,0,0,0,3,1,1,0,1,1,0,1,1,1,2,1,2,0,0,0,2,0,3,2,1,0,0,1,2,1,0,0,1,1,0,1,1,1,2,1,0,0,0,0,2,3,0,1,3,0,2,1,0,1,1,1,1,2,1,1,2,2,1,1,1,1,1,1,1,1,0,0,0,1,0,0,2,2,0,2,1,0,3,2,2,2,1,2,0,1,1,0,3,1,2,1,1,1,2,0,1,0,0,1,2,1,1,0,2,0,3,2,0,1,1,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,1,1,0,1,0,1,1,1,0,2,2,2,0,1,3,1,0,1,1,2,3,1,1,0,0,0,2,0,3,1,1,1,0]},{"counters":[1,0,2,2,1,1,1,1,1,2,2,0,3,1,1,0,1,0,1,0,0,1,2,2,0,1,2,1,1,0,1,1,3,0,0,2,0,1,0,0,0,0,2,0,3,1,1,2,1,2,0,1,1,1,0,4,0,0,2,4,1,2,1,2,1,0,2,1,0,0,0,3,0,2,0,2,0,0,0,0,2,2,1,2,1,2,1,0,2,1,0,1,0,2,1,1,0,1,0,3,0,0,1,2,4,0,1,0,4,2,1,1,3,0,1,1,2,1,0,0,1,2,2,1,2,0,1,0,0,1,2,0,2,1,0,2,2,1,1,2,2,2,2,1,0,2,2,0,0,2,0,0,0,1,0,2,0,0,2,1,1,1,1,0,1,0,1,1,1,0,0,1,1,1,3,0,1,1,2,2,2,0,0,0,2,1,0,0,2,0,1,2,2,0,0,0,0,2,0,1,3,3,1,0,1,2,3,1,1,1,2,1,1,0,1,1,1,0,1,2,0,0,3,1,0,1,1,0,1,2,2,1,1,0,1,2,2,0,0,1,1,1,2,0,2,1,1,0,0,2,1,1,0,0,0,1,1,0,2,2,0,0,1,0,0,1,1,1,3,1,1,0,0,0,0,2,1,1,0,0,1,1,1,2,0,2,0,1,1,1,0,1,2,1,0,1,1,2,2,2,1,2,1,3,0,0,2,1,1,2,2,1,0,2,1,0,1,1,1,1,1,1,0,0,0,1,3,1,1,0,0,1,0,0,1,3,3,1,0,0,0,0,0,1,0,2,1,2,2,0,1,0,0,2,0,1,1,1,1,3,0,0,2,1,1,1,0,2,0,3,2,2,1,1,1,2,1,0,0,1,1,0,4,1,2,2,1,0,2,0,0,1,2,0,1,0,0,1,1,1,1,0,1,0,1,1,4,0,0,1,1,0,3,0,1,0,0,4,2,1,0,1,1,0,1,1,1,1,1,0,2,0,0,1,1,1,1,1,2,2,1,0,0,3,1,0,0,2,2,1,2,0,1,3,0,1,0,1,1,1,1,0,1,0,2,1,2,1,3,1,0,1,0,0,1,0,0,2,3,1,1,1,0,0,2,1,0,0,0,1,0,1,0,0,1,1,1,1,0,0,2,2,1,1,0,2,1,2,0,1,1,0,1,2,0,3,1,3,0,1,3,1,1,2,1,0,0,0,0,0,1,1,2,2,0,2,0,1,1,0,2,2,1,1,3,1,1,0,0,1,1,1,0,2,3,0,2,0,1,4,2,0,3,0,3,1,0,2,1,2,0,2,0,2,0,2,1,0,2,1,1,2,1,1,0,4,1,1,0,0,1,0,2,1,0,1,2,1,1,0,0,4,1,0,1,1,1,0,2,0,0,1,1,2,1,0,1,1,0,2,1,0,0,2,1,0,0,2,1,2,1,1,1,3,1,1,3,1,0,1,1,1,1,1,3,0,2,0,0,2,1,0,1,2,0,3,0,3,2,0,0,0,1,1,1,2,1,0,2,1,0,1,2,3,2,2,0,0,0,0,0,2,0,1,1,4,1,3,0,3,0,2,0,0,0,0,1,1,1,0,1,0,0,0,0,1,0,1,0,1,2,1,1,2,2,0,1,1,2,1,0,2,0,0,1,1,2,1,3,1,1,0,1,0,2,1,2,1,2,2,3,3,0,3,1,1,2,1,1,0,0,3,1,0,0,2,0,2,0,2,1,0,2,2,1,0,1,1,1,0,0,0,1,2,1,0,1,1,2,1,1,1,1,1,1,1,0,0,1,1,0,1,1,1,1,0,1,1,3,2,1,2,0,0,2,0,1,3,2,0,2,1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,0,1,0,0,2,3,0,0,1,0,0,0,0,0,2,1,1,2,1,0,1,2,3,0,1,2,1,0,2,1,0,0,0,2,1,2,1,4,1,2,0,1,1,1,3,0,0,0,0,0,1,2,0,0,0,0,1,1,1,0,1,0,4,0,1,0,0,0,0,0,3,0,0,1,0,0,1,2,4,0,0,0,0,0,2,2,2,2,1,1,1,1,0,1,0,0,0,2,1,2,0,1,0,0,0,2,1,1,2,0,1,2,2,0,1,2,1,2,2,2,1,0,0,0,3,0,1,1,2,4,1,2,1,1,2,2,0,1,0,0,1,0,1,0,0,3,1,0,1,0,2,0,0,1,2,1,0,0,1,0,1,1,1,3,1,2,0,0,4,1,1,1,0,3,1,2,1,1,1,2,1,1,2,3,0,0,1,0,1,0,2,1,3,2,1,1,0,4,3,0,1,3,1,0,1,2,1,0,2,2,1,0,2,2,0,0,0,1,1,0,2,3,2,2,0,0,1,5,1,1,0,3,1,2,0,1,0,1,2,0,0,2,1,1,2,0,2,0,0,0,2,0,1,1,0,1,2,1,0,2,0,0,0,0,0,0,1,4,2,0,2,0,2,1,1,0,0,1,4,2,1,0,0,0,2,1,1,0,0,0,1,1,1,0,1,0,2,3,2,1,2,2,0,0,3,1,1,0,0,0,0,0,0,1,0,2,1,3,0,0,2,1,0,1,0,1,0,0,1,1,2,1,1,0,0,1,2,3,0,1,0,2,2,1,3,0,1,1,0,1,0,2,2,0,1,0,1,0,1,0,1,2,0,1,0,1,2,0,1,0,1,2,1,0,0,0,1,1,1,1,0,2,1,1,0,0,0,1,1,1,1,1,1,2,0,0,1,1,1,2,1,1,1,2,0,1,1,2,1,0,0,1,2,1,1,1,1,2,0,0,1,1,1,1,0,1,1,0,0,0,2,1,1,2,0,0,3,0,0,1,1,3,1,0,2,1,0,0,1,0,4,1,0,0,0,0,0,1,1,0,1,0,4,1,1,1,3,1,0,0,2,0,0,0,0,1,1,0,0,2,0,1,1,2,3,1,2,0,0,1,1,3,2,1,1,2,1,1,1,1,2,1,2,1,0,0,0,1,3,2,1,0,0,3,0,0,0,1,2,0,0,1,0,1,0,0,0,3,1,0,1,3,0,0,1,1,1,0,2,1,0,0,2,2,1,3,1,0,1,0,1,0,0,2,0,0,2,2,3,2,0,0,1,0,0,1,2,0,0,1,1,1,0,1,1,4,0,0,1,2,0,1,1,2,1,0,0,0,0,1,2,1,3,1,2,1,0,1,1,1,0,0,2,0,0,2,0,0,0,0,0,0,1,1,0,0,0,0,2,0,0,0,2,1,1,0,3,1,2,1,0,0,0,0,0,4,1,2,2,0,0,1,0,2,1,0,2,0,1,2,1,1,2,0,1,3,0,0,0,0,2,2,0,0,1,2,1,1,0,0,2,0,0,0,0,1,1,0,1,1,0,2,1,0,1,0,2,1,0,2,1,3,1,0,1,0,0,0,1,2,2,0,1,1,0,0,1,0,3,1,3,4,0,0,1,0,1,1,2,0,2,3,1,3,1,0,0,2,1,1,0,1,0,1,2,3,1,0,0,1,1,2,2,2,2,1,2,1,1,0,2,1,0,1,0,0,3,1,1,1,2,1,1,1,1,1,1,0,1,1,0,1,1,0,1,1,1,1,0,0,2,0,1,0,2,0,1,2,4,1,0,1,1,2,0,0,0,0,0,0,1,0,2,1,4,4,1,0,0,0,1,1,0,0,0,2,1,1,1,3,1,0,0,0,1,2,2,0,2,1,4,1,1,1,0,1,1,2,1,0,1,1,1,0,0,0,1,0,0,2,0,0,1,0,1,0,2,2,0,0,1,1,2,0,2,1,2,1,0,2,2,0,0,1,2,3,1,2,2,1,0,1,1,0,2,0,0,1,1,2,0,0,0,1,4,1,2,0,2,1,1,0,2,0,2,0,0,2,0,2,2,3,0,0,1,3,0,1,0,1,1,2,3,2,1,1,1,3,0,1,1,4,1,0,2,2,2,2,1,0,0,1,1,1,1,1,1,2,0,0,0,1,1,1,2,2,3,0,0,1,1,2,2,0,3,0,0,1,0,0,0,0,1,0,1,1,1,1,2,1,0,1,1,0,2,0,1,0,4,1,2,0,2,2,1,3,3,2,0,1,1,0,1,2,2,3,2,0,2,0,1,0,1,2,2,1,2,0,1,1,2,2,0,0,2,0,0,0,1,1,1,1,3,1,2,1,0,1,0,2,0,1,1,0,0,2,0,1,2,1,0,2,0,0,0,0,1,2,1,2,0,2,0,1,0,0,0,1,2,1,2,0,0,0,1,0,1,1,2,0,1,0,0,3,1,1,1,3,0,2,0,3,1,2,0,0,1,1,0,0,0,1,0,0,0,0,2,2,0,1,0,0,0,5,1,0,0,0,0,3,0,1,1,0,0,0,1,0,1,2,1,1,0,2,1,1,1,1,1,3,2,2,0,1,2,2,0,2,0,1,0,0,1,0,0,0,1,1,0,1,2,0,0,4,1,1,2,0,0,1,0,3,0,1,2,0,1,2,0,2,0,3,0,1,1,0,0,0,0,0,0,0,1,2,3,1,0,2,1,0,3,1,2,1,2,2,0,1,1,2,2,0,0,1,1,5,1,1,1]},{"counters":[1,1,0,1,1,0,0,1,0,2,4,0,2,1,0,1,1,0,1,0,0,0,2,0,0,1,2,2,0,0,0,1,2,0,0,0,0,2,1,4,2,1,1,1,2,0,1,1,0,1,1,1,1,1,2,0,1,1,2,0,0,1,2,2,0,2,0,0,4,0,0,2,1,1,2,1,0,1,1,0,0,1,0,3,0,1,3,1,0,0,1,1,0,0,1,1,1,1,2,3,1,1,1,1,1,0,2,2,1,2,1,2,1,3,1,2,1,3,0,1,1,1,0,3,0,0,1,1,0,2,3,1,1,2,1,0,4,1,1,2,1,0,3,0,3,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,3,1,1,1,0,1,1,2,2,0,0,3,1,1,2,1,0,0,1,2,0,3,1,1,1,1,0,1,0,1,1,1,1,2,1,2,0,1,0,1,1,0,3,1,1,1,3,0,1,1,1,1,1,1,0,0,1,0,2,1,1,1,2,0,1,2,0,4,2,1,1,1,3,2,2,2,1,3,1,0,0,2,0,1,2,0,1,1,1,1,0,1,0,1,3,2,1,2,1,1,2,1,2,0,0,0,3,0,1,0,0,0,0,0,1,0,2,1,0,1,0,0,0,1,0,2,1,1,0,2,0,0,1,1,2,1,1,0,4,0,1,0,0,1,0,3,0,1,0,2,0,0,3,0,0,1,2,1,0,1,0,0,1,1,1,1,0,0,1,2,2,3,1,0,2,0,0,1,2,1,0,0,3,0,2,0,0,0,0,1,0,1,0,3,0,0,0,1,1,1,1,1,1,2,0,0,0,1,0,2,1,0,1,1,0,0,1,0,0,1,0,0,2,0,1,1,1,0,0,1,1,1,2,0,1,0,2,0,1,0,3,2,0,0,0,0,1,1,2,1,1,1,0,1,2,0,1,3,0,1,0,3,0,0,1,3,2,1,0,0,1,0,3,0,2,1,2,0,1,2,0,1,1,0,3,2,1,2,0,4,0,0,0,0,0,4,0,3,2,1,1,0,2,2,2,3,3,0,1,2,0,1,1,1,0,2,0,1,0,0,2,2,1,0,1,0,1,1,0,2,0,1,0,1,1,1,0,2,0,0,0,0,3,0,2,5,1,0,0,2,2,1,0,1,0,0,1,1,2,0,1,1,1,1,1,1,2,2,1,0,1,3,0,4,2,1,2,1,1,2,0,1,0,0,2,0,0,1,1,0,2,0,1,1,0,6,1,1,0,2,1,0,2,2,1,1,2,3,0,3,1,0,1,0,0,2,3,1,2,2,1,2,0,0,1,1,0,2,2,1,1,2,1,1,2,3,1,0,0,0,3,1,1,0,1,1,2,2,1,2,2,4,4,1,1,0,2,1,1,1,0,3,0,0,2,2,0,0,0,1,1,1,0,3,2,0,1,1,2,1,2,1,1,2,0,0,0,0,0,1,4,1,0,2,1,2,0,0,2,2,0,0,1,0,1,1,1,0,1,2,1,1,1,0,2,2,0,3,1,2,0,1,1,0,0,0,1,0,1,1,1,2,0,1,0,2,0,0,1,0,2,1,0,2,2,0,1,1,1,0,0,1,1,1,3,0,0,0,0,1,0,1,1,0,1,0,0,3,2,1,2,1,1,0,4,1,0,1,3,0,2,3,0,1,2,0,0,0,2,2,0,0,2,0,1,2,1,3,1,1,1,2,0,1,1,2,0,0,0,2,5,0,0,1,2,0,1,1,1,1,0,2,0,1,0,1,2,2,1,0,1,0,4,0,0,1,0,3,1,1,1,0,0,0,2,1,0,2,0,1,0,1,1,1,1,0,2,0,0,2,4,2,1,0,2,0,0,2,1,1,0,1,1,0,0,2,1,1,0,2,0,0,0,1,1,1,1,1,0,1,4,1,2,2,2,1,0,1,1,0,0,0,1,0,0,2,0,0,2,1,1,1,0,1,1,2,3,3,1,1,1,0,3,1,0,0,0,2,1,1,0,1,0,2,0,1,4,1,1,1,0,0,0,1,0,0,0,0,0,2,0,1,1,2,2,1,0,2,0,1,1,0,0,1,0,1,2,1,0,0,1,2,3,2,0,4,0,2,1,0,0,1,0,3,0,1,1,1,2,0,1,0,1,0,0,0,3,1,1,1,0,0,1,0,0,3,3,2,0,0,0,2,0,2,0,2,0,2,1,1,3,2,2,2,0,1,2,2,0,2,2,0,0,3,0,2,0,3,0,2,2,3,3,2,2,2,1,2,0,1,2,1,0,3,1,2,2,0,2,0,1,0,1,1,3,0,2,1,4,3,3,1,0,2,0,1,0,1,1,2,0,1,2,1,1,4,0,0,0,1,1,1,3,0,1,1,1,1,2,2,0,2,0,2,0,0,3,3,1,2,4,1,0,1,0,1,1,1,1,0,2,2,0,0,1,0,3,0,1,1,0,0,1,1,1,0,0,0,0,1,3,1,2,0,1,0,0,0,0,1,2,0,3,2,0,1,1,2,0,1,1,1,0,0,3,1,2,0,1,1,3,1,0,0,2,2,4,0,3,0,2,1,0,1,1,1,2,1,1,0,0,2,1,0,0,1,2,1,0,0,7,2,2,4,0,0,2,0,0,1,1,0,1,0,0,0,1,0,3,1,1,0,1,0,0,0,1,2,0,0,1,4,2,1,2,1,2,1,1,0,0,3,1,1,0,1,0,0,2,0,2,3,1,1,2,0,0,2,3,0,0,3,0,1,1,1,3,2,2,1,1,0,1,0,0,3,1,0,1,5,1,0,0,0,0,3,0,0,0,0,1,0,0,1,1,0,1,2,3,2,1,0,1,0,0,2,1,1,2,0,1,1,0,1,0,2,1,2,0,2,0,0,2,0,0,0,1,0,1,0,2,0,1,0,1,0,2,0,1,0,1,0,1,0,0,2,0,1,0,1,0,2,0,1,1,1,2,2,2,0,0,1,0,3,1,1,1,1,0,0,0,0,3,0,5,0,2,4,2,0,0,1,0,0,1,2,0,0,0,0,0,1,1,5,0,1,0,2,0,0,0,0,1,0,1,3,0,3,0,2,0,0,0,0,1,1,2,0,1,0,5,0,3,2,2,1,1,1,1,0,3,1,2,0,0,2,1,1,0,1,2,1,0,0,0,1,2,0,0,2,1,1,1,0,1,1,1,0,5,1,2,1,1,1,2,1,1,0,2,0,0,0,1,1,2,1,1,1,0,1,1,0,0,1,1,3,3,0,1,2,1,1,0,0,0,2,1,2,1,1,1,1,0,3,0,0,1,1,1,1,1,0,2,0,0,1,2,0,1,0,2,2,4,1,0,2,0,1,1,1,1,1,0,0,1,2,3,2,0,1,0,2,1,0,1,1,2,1,1,0,2,0,1,0,1,1,1,1,1,1,0,0,1,1,0,3,0,1,2,1,1,0,0,0,2,1,0,0,4,0,1,0,1,1,0,0,2,1,0,0,2,1,1,2,0,3,0,1,1,1,0,0,0,1,0,0,0,1,0,1,1,0,1,0,1,3,0,1,0,0,0,1,1,1,3,0,2,0,0,3,0,0,0,1,1,1,1,4,0,1,1,0,1,2,3,2,1,1,0,0,1,1,1,1,0,0,3,1,2,0,0,2,2,0,3,2,1,0,2,3,0,1,0,2,3,0,2,0,0,1,2,0,1,1,0,2,0,1,0,0,1,0,0,2,2,1,0,1,2,0,1,0,1,1,0,1,0,1,0,1,0,1,0,3,0,1,1,1,0,2,0,2,1,0,0,0,1,2,2,2,0,0,0,0,0,0,1,1,0,0,0,0,0,1,4,0,1,2,1,1,0,0,1,0,0,2,0,1,1,1,0,1,2,1,1,2,1,2,1,0,0,1,2,1,0,2,2,0,0,0,1,1,2,1,2,1,1,0,3,2,2,1,2,0,1,2,0,0,0,1,0,0,2,1,0,1,1,2,1,2,0,1,1,0,2,2,1,1,2,1,0,1,1,0,1,0,0,0,0,0,0,1,3,2,2,3,2,1,0,2,1,1,1,0,0,1,3,1,0,0,1,1,2,0,1,0,0,0,0,3,0,1,0,2,3,2,2,3,2,1,0,2,1,1,3,1,1,0,0,0,1,0,0,1,0,0,1,0,0,2,2,0,1,1,0,1,1,0,0,1,0,0,2,0,1,1,0,1,1,3,1,2,1,0,0,0,0,0,1,1,0,2,5,1,0,0,1,2,1,1,2,1,0,0,0,0,0,1,0,3,0,1,1,2,1,1,1,0,0,0,1,1,1,3,3,0,1,1,1,0,1,1,1,1,1,0,1,0,0,2,1,1,0,1,1,0,0,0,0,2,1,2,1,0,0,0,0,1,2,1,2,1,2,1,0,1,2,1,1,0,0,1,1,1,0,0,1,1,0,0,1,2,2,1,1,0,0,0,1,2,0,1,0,2,0,2,1,0,0,0,0,1,0,0,2,0,1,0,0,2,2,1,0,1,0,1,1,2,0,1,1,0,0,0,2,1,1,1,2,2,2,0,2,1,1,1,0,0,1,0,0,2,3,1,0,3,2,1,1,0,1,0,1,1,1,0,2,3]},{"counters":[2,2,0,0,0,0,0,2,0,2,1,1,1,3,0,0,1,1,2,1,1,1,2,0,2,1,0,2,1,3,1,1,2,1,0,1,0,3,0,0,0,1,0,0,2,4,3,0,1,0,1,1,1,2,1,0,4,2,0,0,1,1,3,1,0,1,2,0,2,1,0,2,0,0,1,0,1,1,0,0,1,0,1,0,0,0,4,1,0,3,0,1,1,1,0,2,3,0,0,0,1,1,1,1,1,0,2,0,1,0,0,1,0,1,1,1,0,1,1,2,0,0,2,2,0,2,0,0,0,1,0,1,1,1,1,1,0,1,0,2,2,1,1,3,1,2,0,0,0,2,0,1,3,2,3,0,1,2,1,1,3,0,2,2,0,0,0,1,0,2,2,0,3,2,1,0,1,2,0,0,0,1,3,1,1,1,0,1,1,1,0,0,1,1,0,1,1,0,3,0,2,3,2,1,0,3,0,1,2,0,2,1,1,1,1,1,1,0,0,2,2,2,1,1,0,2,0,0,5,0,0,0,1,0,1,2,1,1,1,1,1,1,2,1,0,1,3,0,0,2,0,1,0,0,1,0,1,2,1,1,0,1,0,0,1,2,1,0,0,1,2,0,2,1,1,1,0,1,1,0,1,1,3,1,3,1,1,2,1,0,1,1,1,2,0,0,0,3,1,0,0,0,0,3,1,1,2,0,0,0,2,1,3,2,0,1,2,1,2,1,1,0,1,0,3,0,2,2,1,3,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,2,2,0,2,0,0,0,1,0,0,0,4,0,0,1,2,2,0,1,0,1,3,0,2,1,0,0,3,2,0,1,1,1,1,0,2,2,1,1,0,0,1,0,3,0,0,0,0,1,1,2,1,1,0,1,1,2,2,1,2,0,3,1,2,1,3,0,2,1,2,1,3,3,2,0,1,1,1,3,0,1,0,0,2,0,0,3,3,2,0,0,0,3,0,1,0,1,2,0,1,1,0,3,3,1,1,1,1,2,2,1,1,0,1,0,1,4,0,1,2,1,1,0,0,1,2,1,1,1,1,1,0,1,0,2,0,0,1,0,0,0,1,0,1,2,0,0,1,2,0,0,0,1,0,1,1,0,0,1,0,0,0,3,2,1,1,2,2,1,2,0,1,2,0,3,0,0,0,0,1,1,1,4,0,0,1,0,3,0,2,2,3,1,0,3,4,1,0,1,2,0,1,3,0,1,1,1,1,0,0,2,2,2,0,1,1,0,1,0,1,2,1,0,0,2,0,2,1,1,0,3,0,0,2,2,3,1,1,0,0,1,0,2,0,3,0,1,0,2,0,2,1,1,1,0,0,0,1,0,3,1,2,2,0,0,1,0,1,1,0,0,1,0,0,2,0,4,2,1,2,0,2,0,1,1,2,0,0,0,0,0,1,1,1,0,1,2,0,0,1,1,2,0,0,1,1,2,1,0,1,0,0,0,1,2,1,1,2,3,1,4,1,2,1,0,1,1,1,1,1,4,1,0,0,1,1,1,1,1,1,0,1,0,1,0,2,0,1,2,2,0,1,3,1,0,1,0,1,2,1,0,2,1,3,1,1,0,1,0,2,0,1,0,1,1,1,1,2,3,0,2,0,0,0,0,1,0,4,1,0,1,3,3,1,1,0,4,0,1,2,2,3,1,2,0,1,1,2,0,2,1,1,3,0,1,1,0,0,1,1,0,1,0,2,1,1,3,0,1,0,0,0,1,1,0,0,2,1,1,0,0,1,2,1,0,1,0,0,0,1,0,0,0,3,0,0,0,1,1,0,1,0,0,1,0,2,0,1,0,1,1,1,0,0,1,4,1,3,2,0,3,2,0,0,0,0,0,1,0,0,1,0,1,2,1,0,2,1,0,4,1,0,1,1,1,2,1,0,3,1,2,2,1,0,1,2,2,1,1,1,0,1,3,5,0,0,0,0,1,2,0,4,3,3,1,0,1,0,1,0,2,0,1,0,0,3,1,1,1,2,1,0,0,1,1,0,1,1,2,0,0,2,0,1,0,0,1,0,0,2,2,0,1,1,1,1,0,0,2,0,3,1,0,0,3,3,2,2,1,1,0,2,2,2,0,2,1,0,1,2,0,0,1,0,0,1,0,1,0,0,1,2,2,1,2,3,2,3,0,0,1,1,0,0,0,2,1,1,3,1,0,0,1,0,1,2,0,2,0,0,0,2,0,0,2,1,0,2,3,0,2,1,1,1,1,3,0,0,0,0,0,1,0,1,2,0,0,2,3,1,0,1,1,1,0,0,3,1,0,0,1,0,0,1,0,2,0,3,0,1,1,1,1,2,1,1,2,0,4,1,1,0,1,1,0,4,0,0,2,0,3,0,1,2,1,1,1,0,0,1,0,0,1,0,0,1,0,0,1,0,3,0,1,0,1,1,0,0,3,1,1,3,0,1,1,1,0,1,1,2,1,2,1,0,1,1,0,0,2,2,1,0,1,0,3,1,1,4,0,1,0,0,1,2,0,0,1,0,1,1,1,0,1,0,2,0,1,3,0,2,1,0,1,0,0,0,0,0,0,0,1,2,1,0,0,1,0,1,1,0,3,0,0,1,2,1,0,0,1,2,0,0,0,3,1,2,1,0,0,0,2,1,2,3,2,1,2,0,0,1,0,0,1,1,1,2,1,3,2,1,1,1,2,1,0,0,0,2,0,0,2,0,1,1,0,2,0,0,1,0,2,1,0,1,2,0,2,0,1,0,1,0,1,1,1,1,1,0,3,2,2,2,2,1,0,1,1,1,0,0,2,2,2,1,0,2,0,1,0,1,0,3,0,3,3,0,1,2,0,2,1,0,1,0,1,1,0,0,2,1,1,0,2,3,2,1,1,2,0,1,0,1,1,2,1,1,1,2,0,0,0,1,2,0,2,1,0,1,1,1,1,0,0,1,0,0,0,0,0,0,2,1,0,2,3,1,0,1,1,0,1,0,1,0,1,2,2,3,2,2,0,0,0,0,1,0,3,2,1,1,0,0,1,0,0,2,0,1,2,4,1,0,3,2,0,1,1,1,1,0,2,4,0,0,0,1,1,1,0,2,0,1,2,1,0,0,1,0,2,1,3,5,1,1,0,1,0,1,0,4,4,2,2,2,0,1,1,0,1,1,2,0,1,2,0,2,2,1,0,2,2,0,2,1,0,1,0,0,0,1,0,3,1,1,0,0,1,1,2,0,2,1,0,0,1,1,2,3,1,1,0,0,1,2,1,2,1,1,0,1,1,0,0,0,1,1,1,0,2,0,0,2,1,3,2,1,0,0,1,1,1,0,2,1,1,0,0,0,0,0,0,2,1,1,1,0,0,0,1,0,2,1,2,0,3,0,1,1,1,0,1,1,2,0,0,4,0,2,2,1,1,0,1,1,1,2,1,0,1,2,1,0,2,1,1,1,2,0,1,2,1,0,1,1,0,0,1,0,2,0,1,0,1,1,1,0,1,1,5,0,1,0,2,3,2,0,1,0,2,2,1,1,3,1,0,1,1,3,0,4,2,0,0,1,3,2,3,1,0,1,1,0,1,0,1,0,2,0,3,1,0,0,2,2,1,2,0,1,1,1,1,2,2,1,0,2,1,0,1,1,0,3,1,0,0,0,0,1,1,1,3,0,0,0,0,0,0,0,2,3,2,1,1,0,0,1,0,1,1,3,1,0,0,2,0,0,1,0,3,0,1,0,2,0,2,2,1,1,0,1,0,1,2,0,0,0,0,2,2,1,1,1,3,2,2,0,1,1,2,2,1,2,0,0,1,1,0,0,0,0,0,2,1,1,1,1,1,0,1,1,1,1,3,2,1,2,1,1,1,1,1,0,0,1,0,2,0,0,0,1,0,2,0,0,1,1,0,1,0,0,2,2,0,1,0,2,1,0,1,1,1,1,2,3,0,1,0,0,0,2,0,0,2,0,1,1,2,2,0,0,1,0,1,0,0,0,1,0,1,1,1,0,3,1,0,0,0,0,3,1,0,0,1,1,1,2,0,0,0,0,1,2,1,1,1,0,1,2,0,1,1,2,1,1,0,0,1,0,1,0,1,1,0,2,2,0,1,1,1,1,2,1,1,0,1,2,3,2,2,1,3,2,1,2,1,1,0,1,2,0,0,0,1,1,3,0,1,1,0,1,0,0,0,1,3,0,3,1,0,1,0,2,0,0,2,2,1,0,1,2,2,0,2,1,1,0,2,0,1,2,2,3,1,3,4,1,2,1,2,1,1,0,2,0,0,1,3,2,3,0,1,1,0,1,2,1,1,0,1,1,1,0,2,0,0,0,1,0,2,2,1,0,1,1,2,1,1,1,1,1,2,0,2,1,0,0,1,0,0,0,0,1,1,0,0,0,1,2,1,1,2,1,1,2,0,2,2,2,0,0,0,1,3,3,2,1,0,3,2,2,1,2,2,1,2,0,1,2,2,1,0,2,1,1,0,1,0,0,2,0,0,1,2,1,0,1,2,1,1,3,2,2,2,1,1,1,2,0,1,2,1,0,1,0,0,2,1,0,1,0,2,1,0,1,0,0,1,1,2,0,0,2,3,1,1,1,0,2,0,2,0]}]},"null_count":0,"last_update_version":397952055348297728},"c":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDc0MzEyMjg=","upper_bound":"LTIxMTkwNTkyNjk=","repeats":1},{"count":16,"lower_bound":"LTIxMTMzMzAyNDM=","upper_bound":"LTIxMDA3OTQ4NTI=","repeats":1},{"count":24,"lower_bound":"LTIwOTYyMDQ3OTg=","upper_bound":"LTIwNzU0NzY2OTA=","repeats":1},{"count":32,"lower_bound":"LTIwNjg0NTI3Mzg=","upper_bound":"LTIwNDg4OTYwODU=","repeats":1},{"count":40,"lower_bound":"LTIwMzk2ODY2MDU=","upper_bound":"LTIwMjk2MDAwNTY=","repeats":1},{"count":48,"lower_bound":"LTIwMjY1MzYzNTI=","upper_bound":"LTIwMDk4MDI0NDY=","repeats":1},{"count":56,"lower_bound":"LTIwMDE0ODQ5MDI=","upper_bound":"LTE5OTYwNTY3MDM=","repeats":1},{"count":64,"lower_bound":"LTE5OTUyMDM0MDI=","upper_bound":"LTE5OTAyMzUyNTY=","repeats":1},{"count":72,"lower_bound":"LTE5ODQxNjU0OTM=","upper_bound":"LTE5NjU5NzY3Njg=","repeats":1},{"count":80,"lower_bound":"LTE5NjA3ODEwODU=","upper_bound":"LTE5NDc3NjIxNjk=","repeats":1},{"count":88,"lower_bound":"LTE5NDMxNzExMzg=","upper_bound":"LTE5Mzk4MDc5MzY=","repeats":1},{"count":96,"lower_bound":"LTE5MzkwODQ4Mjc=","upper_bound":"LTE5MjcwMTcyNTc=","repeats":1},{"count":104,"lower_bound":"LTE5MjY3NTY0NjE=","upper_bound":"LTE5MTY0ODg0MzA=","repeats":1},{"count":112,"lower_bound":"LTE5MTQ2MzYyOTQ=","upper_bound":"LTE4OTg0NTYwOTg=","repeats":1},{"count":120,"lower_bound":"LTE4OTE5MTI1MzE=","upper_bound":"LTE4ODg3MjY0NTY=","repeats":1},{"count":128,"lower_bound":"LTE4ODEzNjA0OTY=","upper_bound":"LTE4NzA4MDM4Mjc=","repeats":1},{"count":136,"lower_bound":"LTE4NzAzNTMwNjE=","upper_bound":"LTE4NDg2MDQyMTc=","repeats":1},{"count":144,"lower_bound":"LTE4NDc0NTU4MjM=","upper_bound":"LTE4NDAzNDcwMzg=","repeats":1},{"count":152,"lower_bound":"LTE4MzA0NzQ0NTY=","upper_bound":"LTE4MDc2NjU4NTk=","repeats":1},{"count":160,"lower_bound":"LTE3OTE3Nzg4MjM=","upper_bound":"LTE3Nzc4NjEyNzI=","repeats":1},{"count":168,"lower_bound":"LTE3NzU0NDkwMjk=","upper_bound":"LTE3NzM3NDc4NTA=","repeats":1},{"count":176,"lower_bound":"LTE3NzE4MjAwNzQ=","upper_bound":"LTE3NjMxNzIzMTM=","repeats":1},{"count":184,"lower_bound":"LTE3NTg5Njk1Njk=","upper_bound":"LTE3Mzg4MzU4OTA=","repeats":1},{"count":192,"lower_bound":"LTE3MzU4NDgyNTU=","upper_bound":"LTE3MjYzOTMyNTU=","repeats":1},{"count":200,"lower_bound":"LTE3MjYwODI5MzY=","upper_bound":"LTE3MjU1OTgwOTQ=","repeats":1},{"count":208,"lower_bound":"LTE3MjMzNjkyNzk=","upper_bound":"LTE3MTEzOTk1ODc=","repeats":1},{"count":216,"lower_bound":"LTE3MDg1NzUzMTk=","upper_bound":"LTE2OTE2ODAzOTM=","repeats":1},{"count":224,"lower_bound":"LTE2ODQ1MDEwMTI=","upper_bound":"LTE2NzE3NzI0NTg=","repeats":1},{"count":232,"lower_bound":"LTE2NzAzNTE4OTY=","upper_bound":"LTE2NTc4OTAwMDY=","repeats":1},{"count":240,"lower_bound":"LTE2NTU0Njc3NDM=","upper_bound":"LTE2NTMxNzUzNjg=","repeats":1},{"count":248,"lower_bound":"LTE2NDg1NjMxNDQ=","upper_bound":"LTE2NDQ2MDI3ODU=","repeats":1},{"count":256,"lower_bound":"LTE2NDAwMTM4MTU=","upper_bound":"LTE2MzU0Mjc5MDQ=","repeats":1},{"count":264,"lower_bound":"LTE2MjU0Njc5Nzk=","upper_bound":"LTE2MTUwMDM2ODA=","repeats":1},{"count":272,"lower_bound":"LTE2MTE4NzcxMTY=","upper_bound":"LTE1OTk3NTgwNTg=","repeats":1},{"count":280,"lower_bound":"LTE1OTg4NzA1OTI=","upper_bound":"LTE1OTIxNDEwNTg=","repeats":1},{"count":288,"lower_bound":"LTE1ODQ1OTYyMTU=","upper_bound":"LTE1NzQ0ODc5MzE=","repeats":1},{"count":296,"lower_bound":"LTE1NTUyNTk5NjE=","upper_bound":"LTE1NDA2MDU5Mjg=","repeats":1},{"count":304,"lower_bound":"LTE1MzgxMzU1NDU=","upper_bound":"LTE1MzU0MjU0MDk=","repeats":1},{"count":312,"lower_bound":"LTE1MzE1ODY4MzQ=","upper_bound":"LTE1MjI1NDUzMTE=","repeats":1},{"count":320,"lower_bound":"LTE1MTgzNDY1NzE=","upper_bound":"LTE1MTY5Mjc3ODE=","repeats":1},{"count":328,"lower_bound":"LTE1MTQxMTM4MTM=","upper_bound":"LTE0OTgzNjgyMTc=","repeats":1},{"count":336,"lower_bound":"LTE0OTYwMDQzNjk=","upper_bound":"LTE0ODU2NTk0NjU=","repeats":1},{"count":344,"lower_bound":"LTE0ODA0MjMzNjY=","upper_bound":"LTE0NDcwODUzNTQ=","repeats":1},{"count":352,"lower_bound":"LTE0NDMwODc1MDI=","upper_bound":"LTE0MjI2NTgwOTk=","repeats":1},{"count":360,"lower_bound":"LTE0MjAyMzYzNjQ=","upper_bound":"LTEzODk0NzM4MjQ=","repeats":1},{"count":368,"lower_bound":"LTEzODM1Mjk0MTQ=","upper_bound":"LTEzNzMyNjk5ODE=","repeats":1},{"count":376,"lower_bound":"LTEzNjYzNTUxMzc=","upper_bound":"LTEzNDk0ODIzNDg=","repeats":1},{"count":384,"lower_bound":"LTEzNDY2NDMxNjk=","upper_bound":"LTEzMzQyMzE3NDE=","repeats":1},{"count":392,"lower_bound":"LTEzMzMxNDU2OTc=","upper_bound":"LTEzMjE5MjQ0Nzk=","repeats":1},{"count":400,"lower_bound":"LTEzMTc1NzgwMzQ=","upper_bound":"LTEzMTA5NzE4MjA=","repeats":1},{"count":408,"lower_bound":"LTEzMDkyMjIyOTY=","upper_bound":"LTEyOTk4NzAzOTk=","repeats":1},{"count":416,"lower_bound":"LTEyODQ2NTA0NjU=","upper_bound":"LTEyNjU3NTM4MzE=","repeats":1},{"count":424,"lower_bound":"LTEyNjQ4MDUzOTk=","upper_bound":"LTEyNDYxOTMyNzc=","repeats":1},{"count":432,"lower_bound":"LTEyNDQyMzgzMTc=","upper_bound":"LTEyMjg0NDQwNTk=","repeats":1},{"count":440,"lower_bound":"LTEyMjIxMzU0NzM=","upper_bound":"LTEyMDA2ODQyODY=","repeats":1},{"count":448,"lower_bound":"LTExOTg4MzkzOTI=","upper_bound":"LTExNzk5OTQzNDM=","repeats":1},{"count":456,"lower_bound":"LTExNzQyMDk4NjI=","upper_bound":"LTExNTc4ODQyMzM=","repeats":1},{"count":464,"lower_bound":"LTExNTUyMjc3NzM=","upper_bound":"LTExMzk0ODY5MDY=","repeats":1},{"count":472,"lower_bound":"LTExMzU5MjY1MzE=","upper_bound":"LTExMzI2MjQ5ODM=","repeats":1},{"count":480,"lower_bound":"LTExMjc1NDI2NDc=","upper_bound":"LTExMTQ1NTg1Mzg=","repeats":1},{"count":488,"lower_bound":"LTExMTI3NTk3OTU=","upper_bound":"LTExMDI3MzMzMDY=","repeats":1},{"count":496,"lower_bound":"LTEwOTkxNzcyMjA=","upper_bound":"LTEwODA0NDgwMTk=","repeats":1},{"count":504,"lower_bound":"LTEwNzg5ODQ0NDY=","upper_bound":"LTEwNjQ5MTczMzc=","repeats":1},{"count":512,"lower_bound":"LTEwNjA5OTM3NTY=","upper_bound":"LTEwNTI5NjAxODU=","repeats":1},{"count":520,"lower_bound":"LTEwNTEwOTAwMTQ=","upper_bound":"LTEwNDcyMTcwNzY=","repeats":1},{"count":528,"lower_bound":"LTEwNDU5NDc4NDA=","upper_bound":"LTEwMjM1NjEzNTQ=","repeats":1},{"count":536,"lower_bound":"LTEwMjIwNTI5NDM=","upper_bound":"LTEwMTcwMTI3OTE=","repeats":1},{"count":544,"lower_bound":"LTEwMTYzMTU4MTg=","upper_bound":"LTEwMDY2ODQwMDE=","repeats":1},{"count":552,"lower_bound":"LTEwMDM3Nzg3MDA=","upper_bound":"LTk5ODQzMDkwMg==","repeats":1},{"count":560,"lower_bound":"LTk5NzU3MjE0Mg==","upper_bound":"LTk3Njc5NzIyNw==","repeats":1},{"count":568,"lower_bound":"LTk3NjAzNDIzMg==","upper_bound":"LTk3MTE2MDE2Mg==","repeats":1},{"count":576,"lower_bound":"LTk2ODQ3MjIxNg==","upper_bound":"LTk1MjI4NzA0Ng==","repeats":1},{"count":584,"lower_bound":"LTk1MTExMDY1NA==","upper_bound":"LTkzOTczNTIzNA==","repeats":1},{"count":592,"lower_bound":"LTkyNzQyNTIwNQ==","upper_bound":"LTkxNTEyOTA2Nw==","repeats":1},{"count":600,"lower_bound":"LTkxMzg3NTcwNQ==","upper_bound":"LTg4NzUwOTk3OA==","repeats":1},{"count":608,"lower_bound":"LTg4NDA4MTQ1MQ==","upper_bound":"LTg1OTA0MDg4Nw==","repeats":1},{"count":616,"lower_bound":"LTg1NjU1MDk0MA==","upper_bound":"LTg1MzY3MjE2MA==","repeats":1},{"count":624,"lower_bound":"LTg0NTkyOTMzOA==","upper_bound":"LTgxNjUxNTQ1Mw==","repeats":1},{"count":632,"lower_bound":"LTgwODY0MDMzMg==","upper_bound":"LTgwMjgyODg1NQ==","repeats":1},{"count":640,"lower_bound":"LTc5ODU5NTE0Mw==","upper_bound":"LTc4NTA5ODA2Ng==","repeats":1},{"count":648,"lower_bound":"LTc4NDc2NjQxOA==","upper_bound":"LTc1OTUxMzg0OQ==","repeats":1},{"count":656,"lower_bound":"LTc1NjMyMjkzNw==","upper_bound":"LTc0MzAyMjc4MQ==","repeats":1},{"count":664,"lower_bound":"LTczOTEyNDYxOQ==","upper_bound":"LTczMDk2NDE2Mg==","repeats":1},{"count":672,"lower_bound":"LTczMDYyMzczOQ==","upper_bound":"LTcyNTg3MDcwNQ==","repeats":1},{"count":680,"lower_bound":"LTcxNTk3MTI1MA==","upper_bound":"LTY5MjcwNzkwMg==","repeats":1},{"count":688,"lower_bound":"LTY5MjQ0MjIzNA==","upper_bound":"LTY4MjkyMDgxNQ==","repeats":1},{"count":696,"lower_bound":"LTY4MTk3NTc2MQ==","upper_bound":"LTY2ODE1NjY5Mg==","repeats":1},{"count":704,"lower_bound":"LTY2MzAwNTI0Mg==","upper_bound":"LTY0OTk0Mzc2NQ==","repeats":1},{"count":712,"lower_bound":"LTY0ODUwMTM5Ng==","upper_bound":"LTYzNjg3MzQxMQ==","repeats":1},{"count":720,"lower_bound":"LTYzMjk0MDkyMw==","upper_bound":"LTYxMjE4MTIyNA==","repeats":1},{"count":728,"lower_bound":"LTYxMTIyMzQ0Ng==","upper_bound":"LTU5MjM5MDk3Mg==","repeats":1},{"count":736,"lower_bound":"LTU5MTE0MjgyNQ==","upper_bound":"LTU4NzE5Njk4NA==","repeats":1},{"count":744,"lower_bound":"LTU3ODQzMTQ4Ng==","upper_bound":"LTU1MTEzNjgxNw==","repeats":1},{"count":752,"lower_bound":"LTU0ODcwODEyOQ==","upper_bound":"LTU0MTcyMDIxMQ==","repeats":1},{"count":760,"lower_bound":"LTUzNzQxMTU1MQ==","upper_bound":"LTUyNjU2MzE5OA==","repeats":1},{"count":768,"lower_bound":"LTUyNDI0ODc2MA==","upper_bound":"LTUxMjU4MTA0Mg==","repeats":1},{"count":776,"lower_bound":"LTUxMTc5NDMwOQ==","upper_bound":"LTUwMzc1Mjg1Mw==","repeats":1},{"count":784,"lower_bound":"LTUwMjUyODM3MA==","upper_bound":"LTQ5NjE0MjUyOQ==","repeats":1},{"count":792,"lower_bound":"LTQ5NTc3OTg0OA==","upper_bound":"LTQ5MTg3ODU2NA==","repeats":1},{"count":800,"lower_bound":"LTQ5MDQ3MTkzMQ==","upper_bound":"LTQ3NjIwNDA4Ng==","repeats":1},{"count":808,"lower_bound":"LTQ3NTYzNjAzOQ==","upper_bound":"LTQ2ODIzMjE1NQ==","repeats":1},{"count":816,"lower_bound":"LTQ2NzAyMjQ4Ng==","upper_bound":"LTQ2MzI4NTY4NQ==","repeats":1},{"count":824,"lower_bound":"LTQ2MTEwMzEzMA==","upper_bound":"LTQ1NjIxNTM4Mg==","repeats":1},{"count":832,"lower_bound":"LTQ1NTMyMDkzNg==","upper_bound":"LTQ0MTkxMTIyMQ==","repeats":1},{"count":840,"lower_bound":"LTQzNzEwMjUyNA==","upper_bound":"LTQyNzAyNDc4OA==","repeats":1},{"count":848,"lower_bound":"LTQyMTQ2ODkxNw==","upper_bound":"LTQxODA0ODQ5NA==","repeats":1},{"count":856,"lower_bound":"LTQxNzU3MzcyMA==","upper_bound":"LTQwOTEwOTE0Nw==","repeats":1},{"count":864,"lower_bound":"LTQwOTA5NTA1Nw==","upper_bound":"LTM5ODA3MDEwNQ==","repeats":1},{"count":872,"lower_bound":"LTM5NDM2NDAwOA==","upper_bound":"LTM3MzY0OTg3NQ==","repeats":1},{"count":880,"lower_bound":"LTM3MzM5MDQ2OA==","upper_bound":"LTM0NDg2NzIxNg==","repeats":1},{"count":888,"lower_bound":"LTM0MDg5NTg2Mg==","upper_bound":"LTMzNTcwOTk0Nw==","repeats":1},{"count":896,"lower_bound":"LTMzMjgxNDEwNA==","upper_bound":"LTMxMTEzMDU0NQ==","repeats":1},{"count":904,"lower_bound":"LTMxMDA5NzYwNw==","upper_bound":"LTI5NTE4OTY0NA==","repeats":1},{"count":912,"lower_bound":"LTI5MTIwMjYyNA==","upper_bound":"LTI4ODg0ODA2OQ==","repeats":1},{"count":920,"lower_bound":"LTI4ODcwMDYxNA==","upper_bound":"LTI3ODc4Mjc0Mg==","repeats":1},{"count":928,"lower_bound":"LTI3MTcxMDQzNA==","upper_bound":"LTI1Nzg2MjYwMA==","repeats":1},{"count":936,"lower_bound":"LTIyOTMxMjg1OA==","upper_bound":"LTIxNDgwMzI3Ng==","repeats":1},{"count":944,"lower_bound":"LTIwMDY1NDg5MQ==","upper_bound":"LTE4MDQ5NDA4NA==","repeats":1},{"count":952,"lower_bound":"LTE3OTgwNjExNA==","upper_bound":"LTE2NTM5Nzk5NQ==","repeats":1},{"count":960,"lower_bound":"LTE2MjIxNzY4MQ==","upper_bound":"LTE0NzQ1MzU4MQ==","repeats":1},{"count":968,"lower_bound":"LTEzOTg4OTM5OA==","upper_bound":"LTEyNzQwMTI4NQ==","repeats":1},{"count":976,"lower_bound":"LTEyMDY1NjcxMQ==","upper_bound":"LTExNTYxMDQzOQ==","repeats":1},{"count":984,"lower_bound":"LTExNDM1NjQ5MA==","upper_bound":"LTExMDI4MzE1Nw==","repeats":1},{"count":992,"lower_bound":"LTEwNjc4NjQ0MQ==","upper_bound":"LTk3MDkwOTI2","repeats":1},{"count":1000,"lower_bound":"LTkwOTkzNzgy","upper_bound":"LTg5MDU0MDcy","repeats":1},{"count":1008,"lower_bound":"LTc4NzUxODE5","upper_bound":"LTY0NTQ3ODky","repeats":1},{"count":1016,"lower_bound":"LTU3NDAwMjEw","upper_bound":"LTUxNjk0NTU1","repeats":1},{"count":1024,"lower_bound":"LTQ3OTYxODc4","upper_bound":"LTQwNjg4NTY1","repeats":1},{"count":1032,"lower_bound":"LTQwMjE3Mzgw","upper_bound":"LTI2OTgxNTI5","repeats":1},{"count":1040,"lower_bound":"LTI2NzAzMTc1","upper_bound":"LTEyMjIxODg1","repeats":1},{"count":1048,"lower_bound":"NjM1NTQ2","upper_bound":"MTMzNDIyNDU=","repeats":1},{"count":1056,"lower_bound":"MTg5MTU0Mjk=","upper_bound":"MjkyMjUwNjY=","repeats":1},{"count":1064,"lower_bound":"MzM4Mjg4MDI=","upper_bound":"MzUwNDExMDI=","repeats":1},{"count":1072,"lower_bound":"Mzk4NDQyMDY=","upper_bound":"NDQ2MjgyMTU=","repeats":1},{"count":1080,"lower_bound":"NTQ3NzUyMDY=","upper_bound":"Njk1MjE4ODU=","repeats":1},{"count":1088,"lower_bound":"NzQ0MTAzNDM=","upper_bound":"ODE0MDgzNjQ=","repeats":1},{"count":1096,"lower_bound":"ODQyODYzODU=","upper_bound":"OTc3ODQ4NTk=","repeats":1},{"count":1104,"lower_bound":"MTA1NzYzNDgz","upper_bound":"MTE1MzcwMTYy","repeats":1},{"count":1112,"lower_bound":"MTIwNTkwNTkw","upper_bound":"MTI2NjY0ODMz","repeats":1},{"count":1120,"lower_bound":"MTQ4ODk5MDc1","upper_bound":"MTY3MDU3MTc2","repeats":1},{"count":1128,"lower_bound":"MTY5MDc3MDYz","upper_bound":"MTgwOTQ0ODM0","repeats":1},{"count":1136,"lower_bound":"MTg1NTU2Mzky","upper_bound":"MTk1NjYxNjYz","repeats":1},{"count":1144,"lower_bound":"MjAxMjg5ODEy","upper_bound":"MjIwNjA0MDE2","repeats":1},{"count":1152,"lower_bound":"MjI0MzI5MzEz","upper_bound":"MjM0OTA2OTg1","repeats":1},{"count":1160,"lower_bound":"MjQ3NDc2NzQx","upper_bound":"MjU5MTQ3Mjg0","repeats":1},{"count":1168,"lower_bound":"MjcwMjc1Mjcy","upper_bound":"Mjg0MDU5NDU5","repeats":1},{"count":1176,"lower_bound":"Mjg1NjY5MjU5","upper_bound":"Mjk3MjE0ODg5","repeats":1},{"count":1184,"lower_bound":"Mjk4MzIyNjU2","upper_bound":"MzEzMjk0MzQx","repeats":1},{"count":1192,"lower_bound":"MzE4ODM4NjE0","upper_bound":"MzI0MjIyMzYw","repeats":1},{"count":1200,"lower_bound":"MzM4NTMyNzUy","upper_bound":"MzY4MzIzMDQw","repeats":1},{"count":1208,"lower_bound":"Mzg0MDc3MDk1","upper_bound":"MzkwMjY1NzYw","repeats":1},{"count":1216,"lower_bound":"MzkwODczNzIw","upper_bound":"MzkzODkxMjkx","repeats":1},{"count":1224,"lower_bound":"Mzk2NzIxNzg4","upper_bound":"NDAxMjY1Mzgw","repeats":1},{"count":1232,"lower_bound":"NDAxODU4NzIz","upper_bound":"NDE2NTMyNTAx","repeats":1},{"count":1240,"lower_bound":"NDIxMTM4MTY3","upper_bound":"NDI5NTgyMzcy","repeats":1},{"count":1248,"lower_bound":"NDM1ODY5Nzc4","upper_bound":"NDM5MzEwMjcz","repeats":1},{"count":1256,"lower_bound":"NDQwNTg4NDEw","upper_bound":"NDc3OTI2NDA0","repeats":1},{"count":1264,"lower_bound":"NDc4MDI0OTAz","upper_bound":"NDg2MTkyNDU3","repeats":1},{"count":1272,"lower_bound":"NTA2MzUwNDkw","upper_bound":"NTA4MDI1NzE1","repeats":1},{"count":1280,"lower_bound":"NTEzNjE5MjQy","upper_bound":"NTI0NzgxMzMx","repeats":1},{"count":1288,"lower_bound":"NTI5MDE1Mjk5","upper_bound":"NTM4ODk2MDU5","repeats":1},{"count":1296,"lower_bound":"NTQwNDgyMzg1","upper_bound":"NTU4MjIxNzgy","repeats":1},{"count":1304,"lower_bound":"NTYwOTc0ODY5","upper_bound":"NTcwMTk2NDc1","repeats":1},{"count":1312,"lower_bound":"NTcwNzEyNDQ5","upper_bound":"NTc4NTM0OTUx","repeats":1},{"count":1320,"lower_bound":"NTk1MzY3ODI0","upper_bound":"NjAzNTI1NzYw","repeats":1},{"count":1328,"lower_bound":"NjA2ODgzMzUx","upper_bound":"NjMxMTg2Nzkz","repeats":1},{"count":1336,"lower_bound":"NjMzNTYyNDc0","upper_bound":"NjYxMDg0MTQy","repeats":1},{"count":1344,"lower_bound":"NjY4MDA4ODk4","upper_bound":"NjgwMzgwNDU1","repeats":1},{"count":1352,"lower_bound":"Njk0ODA5Nzk3","upper_bound":"NzAxNjIzNjcx","repeats":1},{"count":1360,"lower_bound":"NzA1ODU4NDY5","upper_bound":"NzA3MzA4NzM1","repeats":1},{"count":1368,"lower_bound":"NzEyNzEwMzM3","upper_bound":"NzMwMzY1Mzcx","repeats":1},{"count":1376,"lower_bound":"NzMwNjE4Mzkz","upper_bound":"NzU2NTg5Mzk0","repeats":1},{"count":1384,"lower_bound":"NzU3NjMwMjc1","upper_bound":"ODA5MDc3NjQz","repeats":1},{"count":1392,"lower_bound":"ODEzMjE4MTk3","upper_bound":"ODI1ODI4ODI5","repeats":1},{"count":1400,"lower_bound":"ODI4NDg1MDM1","upper_bound":"ODM2NzYzODY4","repeats":1},{"count":1408,"lower_bound":"ODM5OTI3MDIy","upper_bound":"ODU4ODgyMDI3","repeats":1},{"count":1416,"lower_bound":"ODY1MzMyOTUz","upper_bound":"ODgwNzIxMjUx","repeats":1},{"count":1424,"lower_bound":"ODg2Mjc3NjUw","upper_bound":"OTAxOTAwMTE4","repeats":1},{"count":1432,"lower_bound":"OTEyNzYwNTgz","upper_bound":"OTI1NzYxMTM2","repeats":1},{"count":1440,"lower_bound":"OTMyMTAxNDYw","upper_bound":"OTM1OTM2MjQ3","repeats":1},{"count":1448,"lower_bound":"OTQ2OTkxMzky","upper_bound":"OTU0OTQzNDk3","repeats":1},{"count":1456,"lower_bound":"OTU2MTYzOTU2","upper_bound":"OTY0MDY3MTkz","repeats":1},{"count":1464,"lower_bound":"OTY4Mzk4ODkz","upper_bound":"OTg1NTc5MTQ4","repeats":1},{"count":1472,"lower_bound":"OTk1MzQ4Mzk2","upper_bound":"MTAwOTg2NjA3MA==","repeats":1},{"count":1480,"lower_bound":"MTAxMzE0NTg4Ng==","upper_bound":"MTAyMTA3NTg2MA==","repeats":1},{"count":1488,"lower_bound":"MTAyMTcwODUwMg==","upper_bound":"MTAzMjcwODA1NQ==","repeats":1},{"count":1496,"lower_bound":"MTAzNjg1NTA4MA==","upper_bound":"MTA0MjAzMzg3Nw==","repeats":1},{"count":1504,"lower_bound":"MTA0NTA4MzYxMA==","upper_bound":"MTA1Njg4ODY4Mg==","repeats":1},{"count":1512,"lower_bound":"MTA1NzUyMjAzMA==","upper_bound":"MTA2ODg2NTQwOQ==","repeats":1},{"count":1520,"lower_bound":"MTA3MTU1NDgzOQ==","upper_bound":"MTA3Mzg5MTkwNg==","repeats":1},{"count":1528,"lower_bound":"MTA3NTQ1MjY5MA==","upper_bound":"MTA4MjI2NjI4Nw==","repeats":1},{"count":1536,"lower_bound":"MTA4NDA0NzU2NA==","upper_bound":"MTA5MTE4ODQzMA==","repeats":1},{"count":1544,"lower_bound":"MTA5ODg3ODEzNw==","upper_bound":"MTExODA4OTEyNQ==","repeats":1},{"count":1552,"lower_bound":"MTEyMjI5NjMyNw==","upper_bound":"MTEzODAzMTMwNg==","repeats":1},{"count":1560,"lower_bound":"MTE0MTA4ODkzMg==","upper_bound":"MTE1NTMxNTYyMA==","repeats":1},{"count":1568,"lower_bound":"MTE1ODI5Njc1NA==","upper_bound":"MTE2ODk0ODE3NA==","repeats":1},{"count":1576,"lower_bound":"MTE3MjA4ODQzNQ==","upper_bound":"MTE4MDY2MDIxNA==","repeats":1},{"count":1584,"lower_bound":"MTE4Nzc2NTgwNw==","upper_bound":"MTE5NTIyNTgwNw==","repeats":1},{"count":1592,"lower_bound":"MTE5ODgxOTk5Nw==","upper_bound":"MTIwNTQwODIyMg==","repeats":1},{"count":1600,"lower_bound":"MTIxMTAwODI2OA==","upper_bound":"MTIyODMzOTE4Mg==","repeats":1},{"count":1608,"lower_bound":"MTIzMTA4NjU3NA==","upper_bound":"MTI0MDgyMjM3Nw==","repeats":1},{"count":1616,"lower_bound":"MTI0MTI5NDc1OQ==","upper_bound":"MTI1MjQ0MjY4MQ==","repeats":1},{"count":1624,"lower_bound":"MTI2MDg0MzU2NQ==","upper_bound":"MTI3MDU4MDA3Mw==","repeats":1},{"count":1632,"lower_bound":"MTI3MjU3NDgzNg==","upper_bound":"MTMwNDI3NjY3OA==","repeats":1},{"count":1640,"lower_bound":"MTMwNjkzOTA4MQ==","upper_bound":"MTMzMTE3OTAwNA==","repeats":1},{"count":1648,"lower_bound":"MTMzMjYzMzA2Mg==","upper_bound":"MTMzODg4ODE3NQ==","repeats":1},{"count":1656,"lower_bound":"MTM0MDAzMzQ5MA==","upper_bound":"MTM1ODQ3OTMyNQ==","repeats":1},{"count":1664,"lower_bound":"MTM4NTA3ODM3MA==","upper_bound":"MTM5NjkwMjg3Ng==","repeats":1},{"count":1672,"lower_bound":"MTM5NzQwNzk0NQ==","upper_bound":"MTQxMjY2OTkxNA==","repeats":1},{"count":1680,"lower_bound":"MTQxMjk1NDcyMg==","upper_bound":"MTQyNTg0MzYwNA==","repeats":1},{"count":1688,"lower_bound":"MTQzNjc0NDg4Ng==","upper_bound":"MTQ1NDk2NzQyNA==","repeats":1},{"count":1696,"lower_bound":"MTQ1NTk2NTc5Ng==","upper_bound":"MTQ2MTI4NjY1OA==","repeats":1},{"count":1704,"lower_bound":"MTQ2NzA5Mzk4OQ==","upper_bound":"MTQ4ODkzMTkxNQ==","repeats":1},{"count":1712,"lower_bound":"MTQ5MzQ5NDcwMA==","upper_bound":"MTUwNTQzMzc4Ng==","repeats":1},{"count":1720,"lower_bound":"MTUxMzI0NDQwMg==","upper_bound":"MTUzNjU5MzM3Ng==","repeats":1},{"count":1728,"lower_bound":"MTU0NjE2ODAwOA==","upper_bound":"MTU2MDY2ODY0Mw==","repeats":1},{"count":1736,"lower_bound":"MTU2MjIzNTUxNA==","upper_bound":"MTU4NDU3ODE5MQ==","repeats":1},{"count":1744,"lower_bound":"MTU4OTk4MDAwNw==","upper_bound":"MTYxNDQ2MDgyNA==","repeats":1},{"count":1752,"lower_bound":"MTYxNTY5MzgwOQ==","upper_bound":"MTYyMTY2MDA0OA==","repeats":1},{"count":1760,"lower_bound":"MTYyNDA3NTE2NA==","upper_bound":"MTYzNDEyMTk3OA==","repeats":1},{"count":1768,"lower_bound":"MTYzNzQ2MjYxNA==","upper_bound":"MTY0ODU5OTcyMw==","repeats":1},{"count":1776,"lower_bound":"MTY1MDM5OTA1MQ==","upper_bound":"MTY1NDM0OTMxNg==","repeats":1},{"count":1784,"lower_bound":"MTY1NDQyNDIyNg==","upper_bound":"MTY3NjgwOTcwNA==","repeats":1},{"count":1792,"lower_bound":"MTY3Nzk3Mjg1OQ==","upper_bound":"MTY4NTk0Nzk4MQ==","repeats":1},{"count":1800,"lower_bound":"MTY4ODgzMjg4NQ==","upper_bound":"MTcwNjAyMTcyMA==","repeats":1},{"count":1808,"lower_bound":"MTcxODE0ODA5MQ==","upper_bound":"MTcyMjUwNDE1OQ==","repeats":1},{"count":1816,"lower_bound":"MTczOTQ2MTYwNQ==","upper_bound":"MTc0Njk3NjE1Mg==","repeats":1},{"count":1824,"lower_bound":"MTc1NDMyMjUzNw==","upper_bound":"MTc3NzQ0MzgxOA==","repeats":1},{"count":1832,"lower_bound":"MTc3NzUyNTc0MQ==","upper_bound":"MTc4ODkxMDI3Ng==","repeats":1},{"count":1840,"lower_bound":"MTc4OTEzMTMyNg==","upper_bound":"MTgwMzQ3ODU5MA==","repeats":1},{"count":1848,"lower_bound":"MTgwODg3ODk4Nw==","upper_bound":"MTgyNjkzNDY0Mw==","repeats":1},{"count":1856,"lower_bound":"MTgzNjkyMDk5MQ==","upper_bound":"MTg0OTE0MzA5NA==","repeats":1},{"count":1864,"lower_bound":"MTg1NDk1NzU4NA==","upper_bound":"MTg3MjMyMDAyMA==","repeats":1},{"count":1872,"lower_bound":"MTg3NDg5OTQyMQ==","upper_bound":"MTg4OTgyNjkwMw==","repeats":1},{"count":1880,"lower_bound":"MTg5MDc2MDM1Mw==","upper_bound":"MTkwMDY0NTAyOQ==","repeats":1},{"count":1888,"lower_bound":"MTkwMjAzNDc4OA==","upper_bound":"MTkxMzk2NzA0NQ==","repeats":1},{"count":1896,"lower_bound":"MTkxNTQ1NzQwMg==","upper_bound":"MTkyMTA1NDQ5Ng==","repeats":1},{"count":1904,"lower_bound":"MTkyMjYwNTkwOA==","upper_bound":"MTkzMjYzNzk5Ng==","repeats":1},{"count":1912,"lower_bound":"MTk1NDkxMDA3OA==","upper_bound":"MTk3NTQzMzg1Nw==","repeats":1},{"count":1920,"lower_bound":"MTk3NTQ2MzY0NQ==","upper_bound":"MTk4MzAwNzk0MQ==","repeats":1},{"count":1928,"lower_bound":"MTk4NjMxOTUyOQ==","upper_bound":"MjAwNTA2NDUzMw==","repeats":1},{"count":1936,"lower_bound":"MjAxMTA3MDQwNQ==","upper_bound":"MjAxMzIyMDM4Mw==","repeats":1},{"count":1944,"lower_bound":"MjAxMzc0MzEwNQ==","upper_bound":"MjAyMjkzNzY2NA==","repeats":1},{"count":1952,"lower_bound":"MjAyNzY5NDM5OQ==","upper_bound":"MjAzNjYzNDIyNw==","repeats":1},{"count":1960,"lower_bound":"MjAzODE2MzQ5Mw==","upper_bound":"MjA0ODcyMDc3Mw==","repeats":1},{"count":1968,"lower_bound":"MjA0ODk2NTU1NQ==","upper_bound":"MjA2NjA3NDY3Ng==","repeats":1},{"count":1976,"lower_bound":"MjA3NTIwMjc4Nw==","upper_bound":"MjA5NTAyNjg5Mw==","repeats":1},{"count":1984,"lower_bound":"MjA5Njk3NDQ0MA==","upper_bound":"MjExNTk5NDQzMA==","repeats":1},{"count":1992,"lower_bound":"MjExOTgyMjUxOA==","upper_bound":"MjEyNTMyODM1MA==","repeats":1},{"count":2000,"lower_bound":"MjEyNTQwMjQ1NA==","upper_bound":"MjE0NDA1MTEyNg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,1,1,0,3,1,2,1,1,0,0,0,0,1,1,2,1,0,1,1,1,1,0,3,1,2,2,0,0,2,1,1,1,1,0,0,0,0,1,0,0,0,0,2,0,3,2,1,1,0,0,1,2,0,0,4,1,1,1,0,0,0,0,3,1,2,1,0,3,0,0,0,0,0,1,0,1,3,0,1,1,2,0,2,2,2,2,1,1,1,1,1,1,1,0,0,0,2,0,2,1,0,0,1,1,2,0,0,1,1,1,1,1,1,1,1,2,2,1,0,2,1,0,0,0,2,2,1,1,1,1,0,2,0,1,1,1,0,1,1,2,2,0,3,1,2,0,0,0,1,1,1,1,1,2,3,0,3,0,3,1,1,1,1,0,1,1,1,1,0,3,1,1,1,0,0,2,1,2,1,1,0,1,0,0,1,1,2,1,3,2,1,0,0,1,1,2,0,2,1,0,1,1,1,1,1,1,0,2,1,2,3,3,3,5,0,1,0,1,0,0,2,1,1,0,1,1,1,3,1,0,0,1,1,1,0,0,1,2,0,1,0,0,0,0,0,0,0,0,0,0,0,1,2,1,1,3,1,1,1,0,0,1,4,1,0,0,1,2,1,0,0,2,0,0,0,1,1,1,1,2,1,2,1,1,3,1,3,1,0,0,0,2,0,1,0,2,1,1,3,0,2,2,0,1,0,3,0,3,0,1,1,0,1,2,0,1,1,2,2,0,1,1,1,1,0,0,0,1,0,3,3,1,2,1,1,1,1,1,1,1,0,1,0,1,0,1,1,3,0,0,0,1,1,1,1,1,0,0,2,1,1,1,3,1,2,0,1,1,1,0,2,2,2,1,0,4,0,0,1,0,4,0,1,2,1,1,1,2,3,0,0,1,2,2,0,2,1,1,0,1,3,0,0,1,1,0,1,1,1,3,1,1,1,0,0,2,1,1,1,0,1,2,1,3,2,1,1,0,2,1,1,1,1,2,2,2,1,0,1,0,3,2,0,1,0,1,1,0,0,0,1,2,0,1,0,2,4,1,0,0,0,0,1,1,1,1,0,2,0,0,0,3,0,0,3,1,3,0,0,0,4,1,0,1,0,0,2,1,0,1,0,0,2,0,0,1,1,1,2,2,2,0,0,1,0,1,1,3,1,1,1,0,0,2,0,0,0,0,2,1,1,1,0,1,1,2,0,0,0,1,0,2,3,0,1,0,2,1,1,0,0,0,1,0,2,0,1,1,0,1,1,2,1,2,1,1,1,2,1,0,0,0,1,2,0,2,0,1,0,3,1,2,0,1,1,2,1,1,1,2,0,0,0,3,2,1,1,1,0,2,0,0,0,1,0,2,1,1,1,1,1,0,1,1,0,0,1,3,2,0,2,0,1,1,1,0,0,1,1,0,2,2,2,0,0,0,1,1,0,0,1,1,1,1,0,0,4,0,0,0,2,1,0,0,0,2,1,1,0,0,2,1,2,3,0,1,0,1,2,2,2,0,0,0,0,1,1,2,0,0,0,0,0,0,1,2,1,0,2,0,1,1,1,1,0,0,0,1,1,3,1,2,0,0,1,1,1,1,3,0,2,1,1,0,1,0,0,0,3,0,1,0,1,0,1,0,1,0,0,2,1,1,0,1,0,0,1,2,0,2,1,0,2,3,1,0,0,0,0,0,1,1,1,1,0,0,3,1,0,0,1,0,0,1,1,0,0,2,1,2,0,0,2,1,3,0,2,1,2,0,2,1,2,2,2,1,2,2,1,1,2,3,1,0,2,0,0,0,3,1,2,0,2,0,4,0,0,1,4,1,1,0,0,1,1,3,2,1,1,1,2,1,1,1,2,0,2,2,1,0,0,0,0,0,0,3,1,1,1,1,2,1,0,2,1,2,1,0,1,0,1,1,4,1,1,3,0,0,0,0,1,3,0,2,1,0,0,1,2,1,2,1,0,0,0,3,1,0,2,0,1,0,0,0,1,1,1,1,0,1,1,4,0,2,0,0,2,0,1,1,1,2,1,1,1,2,0,4,1,0,1,1,0,0,1,0,2,0,4,1,1,1,2,0,1,1,0,1,5,1,0,0,1,2,1,0,1,0,1,3,0,2,2,0,1,0,0,0,1,0,0,0,0,0,3,2,1,1,3,0,1,0,0,0,0,0,1,0,1,2,2,0,1,2,2,2,0,3,1,1,3,0,0,1,0,0,1,1,1,2,1,0,0,1,2,3,1,0,4,2,1,0,0,0,1,1,2,1,0,0,0,1,0,1,1,1,0,0,2,1,3,2,0,1,1,2,0,1,0,2,1,0,0,1,0,2,0,0,2,1,0,0,0,2,0,2,3,3,0,1,1,1,1,0,2,0,2,1,4,1,0,1,0,2,1,0,1,1,0,0,5,1,0,0,1,1,0,0,1,0,0,1,2,0,0,2,1,1,3,1,1,1,0,0,3,0,1,0,2,0,0,2,1,3,0,1,1,1,2,2,0,1,0,0,1,3,0,1,0,0,1,0,3,1,2,1,1,0,1,1,1,1,0,0,1,0,0,1,1,3,0,0,1,1,0,2,0,2,0,1,2,1,0,1,2,0,1,0,0,1,0,2,1,0,2,0,1,0,2,1,1,0,0,1,1,0,2,1,1,1,1,1,2,1,1,1,2,0,2,1,1,0,1,0,2,0,0,0,2,2,1,1,0,0,1,0,1,0,0,1,0,2,1,1,0,1,1,1,0,0,1,3,0,1,1,0,2,1,2,0,1,1,0,0,2,1,3,1,1,2,1,1,0,0,0,1,2,3,0,1,0,1,2,1,0,0,3,1,3,1,1,1,0,0,3,2,2,1,0,1,0,2,0,1,1,1,1,3,0,3,1,1,0,1,2,1,1,1,4,1,3,2,0,3,2,0,0,0,0,1,0,0,0,1,1,0,1,1,1,1,1,2,1,1,1,0,1,1,2,1,0,0,1,1,3,1,2,2,0,0,0,2,0,1,1,1,1,0,0,2,0,1,0,1,2,2,1,1,0,3,1,0,1,1,1,1,0,1,2,2,3,0,0,1,1,1,0,1,2,1,1,1,3,2,1,3,1,1,0,0,0,0,1,0,0,2,0,2,3,1,2,1,0,2,0,2,2,0,1,1,1,0,2,1,0,5,1,0,1,2,1,3,1,1,1,2,0,1,1,1,0,0,1,1,1,1,0,1,1,0,2,0,0,2,1,1,3,0,2,1,0,0,1,2,0,0,0,2,1,0,2,1,0,1,1,1,0,4,0,1,2,0,1,0,1,0,0,0,1,2,1,0,3,0,3,3,1,4,0,2,2,0,2,2,4,2,1,1,2,3,0,0,2,0,2,0,1,0,1,1,1,2,2,0,1,0,1,0,1,0,1,3,0,0,1,1,0,0,1,0,0,1,0,3,1,0,0,3,3,0,1,1,2,1,1,1,0,2,0,2,1,1,3,1,2,0,2,0,1,0,1,4,2,2,2,0,0,3,0,1,0,2,1,1,2,1,1,2,0,0,0,1,2,3,3,1,0,2,0,1,0,1,1,0,0,2,2,0,2,1,2,1,0,1,1,0,0,0,1,0,1,3,0,1,1,1,1,1,4,2,0,2,0,1,0,1,1,0,1,1,0,2,0,1,2,0,0,1,1,1,2,0,2,2,1,1,2,1,2,1,2,0,2,0,1,0,0,3,1,2,1,0,3,4,1,1,0,0,1,1,0,1,0,0,1,1,2,0,1,0,2,1,1,0,0,1,2,2,0,0,0,0,1,1,1,0,0,2,1,0,0,0,2,0,1,0,2,0,1,0,3,0,2,0,1,0,0,0,1,2,1,0,0,0,0,1,0,0,0,0,1,1,0,1,1,1,4,0,0,0,1,2,4,1,3,0,1,0,0,1,0,2,1,0,3,1,2,0,1,1,0,1,1,0,1,2,0,0,1,1,2,1,0,0,1,2,0,0,1,2,0,1,0,0,1,1,0,1,0,4,3,1,1,3,0,0,2,1,0,1,3,1,1,1,1,2,1,0,1,1,0,1,1,0,2,1,0,0,0,0,1,0,1,0,0,0,2,1,1,0,0,1,1,1,1,3,1,1,0,0,0,0,0,3,1,1,0,0,0,0,0,3,0,1,2,1,2,0,0,0,1,0,2,0,0,0,0,3,1,1,1,0,1,1,2,2,0,0,2,3,0,0,2,0,1,1,0,1,1,1,1,0,2,3,4,1,2,0,2,2,2,1,1,1,0,2,0,1,2,1,0,1,0,1,0,4,1,1,0,2,1,1,1,3,1,1,2,1,0,2,1,1,1,3,1,2,0,1,0,1,1,1,0,1,0,1,1,1,1,1,2,1,0,1,2,2,0,0,1,1,0,3,4,1,3,0,1,1,1,0,2,2,1,0,3,0,0,1,1,0,0,0,2,1,0,0,2,3,0,0,2,1,2,0,1,2,2,0,1,3,1,0,1,1,1,0,1,2,1,2,0,3,0,3,0,0,1,0,1,1,3,3,1,2,4,0,1,0,0,2,0,1,2,4,0,2,2,1,0,2,3,0,2,1,0,2,0,0,1,1,1,0,0,0,3,2,2,2,3,1,0,1,1,0,2,1]},{"counters":[1,1,0,1,0,0,0,1,0,0,3,0,0,1,0,0,2,1,2,0,2,2,0,1,0,0,2,1,2,2,3,2,0,3,0,1,1,0,1,0,1,1,1,0,0,1,1,1,0,1,3,0,2,1,1,0,2,0,4,0,0,0,1,3,1,0,1,2,4,1,1,0,2,0,1,1,1,0,1,2,4,1,0,0,1,3,2,0,1,4,0,0,0,1,1,0,0,1,1,0,1,0,2,1,0,1,0,1,0,1,4,1,1,1,2,0,2,2,0,1,0,0,2,1,1,0,0,0,1,2,0,1,0,0,1,0,2,1,0,1,1,0,0,0,1,2,1,1,1,5,1,1,0,0,1,0,0,0,2,2,1,1,1,1,1,1,1,0,1,2,1,2,1,0,2,1,0,0,0,0,0,1,0,2,1,1,2,0,2,0,0,0,1,1,2,1,2,2,0,1,2,1,1,0,3,0,1,0,2,0,1,0,0,1,1,1,2,1,2,0,1,0,0,0,1,1,1,1,2,0,0,2,2,3,0,2,0,0,0,2,0,0,1,2,0,0,1,2,3,2,2,1,0,3,0,0,1,0,0,0,2,0,1,2,0,1,1,1,1,0,1,4,0,1,1,0,1,3,4,0,1,1,2,3,0,0,1,1,3,0,0,3,3,2,1,1,1,0,2,1,1,0,1,0,0,1,0,1,3,1,2,1,0,2,1,1,1,0,1,1,2,0,4,0,1,2,0,1,0,1,2,1,2,2,1,0,0,1,0,1,1,0,0,2,1,0,1,0,0,0,0,0,2,0,3,3,3,2,2,2,0,1,1,1,3,0,0,5,0,0,2,0,1,0,1,0,0,0,1,2,0,0,1,1,3,5,4,1,1,1,0,0,2,2,0,1,0,0,1,0,1,0,0,2,1,6,2,2,1,1,1,1,0,1,2,1,0,2,1,1,0,1,1,0,0,1,0,2,0,0,0,1,1,3,1,2,2,4,0,1,0,0,2,1,1,0,1,0,0,0,1,4,1,0,1,3,0,1,1,3,1,1,1,2,0,1,0,2,1,0,0,1,1,0,2,0,1,1,0,0,0,0,2,0,1,1,0,1,0,1,1,0,1,2,1,1,0,1,2,1,0,0,0,0,0,1,0,2,2,1,3,2,1,1,0,2,0,1,0,0,0,1,1,0,0,1,0,1,4,0,0,1,1,0,1,1,2,0,0,0,1,1,1,1,0,2,3,4,1,1,0,1,1,0,1,2,2,0,0,4,0,0,1,1,0,1,0,2,0,1,3,1,0,1,0,3,1,3,0,0,0,1,4,1,0,1,0,1,1,1,0,0,0,0,4,2,2,1,1,1,2,1,1,2,1,1,3,2,3,1,0,1,0,0,0,1,1,4,0,1,0,1,0,2,0,2,1,1,2,1,1,0,2,2,1,1,0,0,0,0,2,0,0,1,0,2,2,2,0,1,3,0,0,1,4,1,2,1,0,1,2,3,1,1,2,2,0,1,0,0,0,1,2,0,0,2,0,4,1,0,1,2,1,0,0,2,0,1,1,2,2,0,0,3,1,1,0,1,0,0,2,3,0,1,0,1,2,1,0,2,2,0,1,2,1,0,1,1,0,1,0,0,0,2,1,0,1,0,0,2,1,1,1,0,0,1,1,2,0,0,1,0,0,1,2,2,1,2,2,1,0,0,3,2,2,1,0,1,3,0,0,3,1,1,2,0,2,2,2,1,0,0,0,2,2,1,0,0,0,1,0,0,1,2,4,1,0,2,1,5,2,2,1,1,0,1,2,1,1,0,1,0,1,0,0,0,2,0,1,3,1,0,0,1,4,2,1,0,0,3,2,4,1,2,0,1,1,1,0,0,1,1,1,1,2,0,2,1,1,0,2,1,0,1,1,0,1,0,2,2,1,2,1,1,1,0,0,1,1,2,0,1,2,1,2,0,2,0,1,0,1,1,0,2,0,2,0,3,0,1,0,3,2,1,1,0,2,1,1,0,0,0,1,0,0,0,1,1,1,1,0,2,1,2,2,1,0,2,2,1,2,0,0,0,0,1,0,1,0,1,1,0,0,0,3,1,2,1,0,0,0,0,1,1,1,1,1,0,0,2,1,2,1,0,1,1,0,0,2,0,0,0,1,1,1,1,1,0,1,2,3,1,1,2,0,0,1,2,2,3,0,0,1,1,0,1,1,0,1,1,2,1,0,0,2,3,1,0,0,1,0,1,0,0,1,3,1,1,0,1,0,1,1,1,1,3,3,1,0,0,0,0,0,0,3,2,1,2,2,1,1,2,0,0,2,0,1,1,0,1,1,1,1,3,1,2,5,1,1,3,0,3,0,1,1,0,2,0,0,0,0,1,1,1,0,0,1,0,1,0,3,1,0,1,1,0,0,2,0,0,0,1,3,0,1,1,0,2,1,2,1,1,1,4,0,1,2,3,1,0,2,3,0,1,1,1,0,0,2,2,0,2,1,1,0,0,1,4,1,1,1,1,2,2,0,0,0,1,4,1,3,1,2,0,0,0,0,3,0,1,1,0,2,0,2,0,1,2,1,2,1,1,1,2,0,0,0,0,4,1,0,0,0,1,3,1,0,0,1,2,3,1,1,0,0,0,0,3,0,1,1,1,1,0,1,0,2,2,1,0,0,0,1,1,1,0,1,2,0,2,0,2,0,1,1,3,2,1,1,1,0,2,0,0,0,1,0,2,2,2,1,0,1,0,0,1,3,0,2,3,0,1,0,1,3,0,1,0,1,0,1,2,4,2,4,1,3,2,0,2,1,0,1,1,1,0,1,2,0,1,0,2,0,1,0,2,1,0,0,1,0,0,1,0,0,1,1,0,2,1,0,2,0,0,3,3,0,0,1,2,1,0,1,0,0,1,0,0,1,2,0,1,2,1,0,2,0,1,1,1,0,2,0,1,0,1,1,3,1,1,1,1,0,1,1,1,1,0,1,0,1,2,1,2,2,0,0,3,0,0,1,1,0,1,2,2,0,0,1,0,2,0,1,0,0,1,2,1,0,0,2,0,2,1,1,0,1,1,1,0,1,1,1,1,1,3,1,1,0,0,2,1,2,3,3,0,3,0,1,1,2,0,1,0,0,1,0,0,2,1,0,0,1,1,1,0,0,0,1,1,0,0,1,4,2,0,1,0,2,1,1,1,1,0,0,0,0,1,1,1,2,0,0,1,1,0,1,0,0,1,0,2,0,1,0,1,0,0,1,1,0,3,2,0,1,1,2,1,0,1,1,0,0,0,1,0,4,2,1,1,0,1,4,0,2,1,2,2,1,0,0,1,1,1,0,3,1,1,1,0,0,1,1,1,0,0,0,2,1,1,0,0,1,3,2,0,0,2,1,0,3,1,2,0,0,0,0,2,1,1,0,0,0,1,0,2,1,0,2,1,0,1,2,1,0,2,1,0,1,2,0,0,2,0,1,0,0,0,0,0,4,3,1,0,1,1,3,1,1,1,0,1,0,0,1,0,2,0,0,0,2,1,0,1,0,0,2,1,1,3,2,1,3,0,0,3,2,2,0,0,1,2,0,2,1,0,0,3,1,1,0,1,2,0,1,0,4,0,0,3,1,1,2,1,0,2,0,2,1,2,2,0,0,0,0,0,0,1,0,2,1,0,1,2,0,0,1,0,1,0,1,1,2,1,3,3,0,0,3,3,0,0,1,1,3,1,0,2,0,3,1,1,2,1,2,2,1,4,0,2,0,0,2,0,1,2,4,4,2,3,2,0,1,1,1,2,0,1,0,0,2,1,1,0,0,1,1,0,0,2,3,1,1,0,1,2,1,0,0,0,1,1,2,0,0,0,1,0,0,1,0,0,0,1,1,1,1,3,0,1,0,0,0,4,0,0,0,2,2,1,1,0,2,0,0,0,1,3,2,1,1,0,0,2,0,3,1,1,1,1,0,0,0,1,1,0,0,2,2,1,3,0,2,1,4,1,1,0,2,2,0,0,0,0,0,3,2,0,0,2,1,1,2,0,1,0,1,1,3,0,1,0,1,0,0,0,2,0,2,0,1,1,0,1,1,1,0,1,1,2,2,0,2,1,0,2,1,1,2,2,0,2,1,0,0,1,0,1,0,2,1,1,0,1,2,0,2,0,3,0,2,0,1,1,2,1,0,1,1,3,0,1,3,0,2,3,0,1,0,0,0,2,2,0,0,0,0,0,1,0,4,4,3,0,0,1,3,2,1,0,3,2,2,1,1,0,0,1,0,0,0,0,1,1,0,1,0,1,1,2,1,1,0,2,0,1,0,2,0,1,0,1,0,2,1,1,1,3,1,1,2,0,1,1,1,1,1,1,2,0,1,1,0,0,2,1,3,2,1,0,0,2,1,1,0,2,0,1,1,2,0,2,2,0,1,1,1,1,2,1,0,2,2,1,2,1,1,0,2,2,2,1,0,2,1,2,1,1,2,0,0,0,1,0,1,0,3,1,2,0,0,0,2,2,1,1,2,0,1,0,1,2,1,2,0,0,1,1,0,0,0,0,3,0,0,0,0,0,0,2,0,0,0,2,1,0,1,2,0,1,2,2,0,1,2,1,2,1,2,3,1,0,0,0,0,2,2,0]},{"counters":[1,0,2,4,0,0,1,1,0,0,1,1,0,1,2,0,2,2,0,1,2,1,2,1,0,2,1,2,0,2,0,0,0,1,1,1,0,1,0,2,2,0,3,2,1,1,2,1,0,0,1,1,2,0,0,0,0,2,1,0,3,3,1,2,2,1,2,2,0,0,2,0,1,0,1,0,2,2,0,0,1,1,1,1,0,1,1,0,0,0,1,1,1,0,0,1,2,1,0,0,0,2,2,0,0,4,2,1,0,3,0,0,1,0,0,2,0,2,1,0,1,2,2,1,2,2,2,0,1,1,0,1,1,0,0,1,3,1,1,1,1,0,1,0,1,1,0,0,1,1,2,1,2,0,1,0,0,2,1,0,1,0,1,1,3,1,0,1,0,3,1,3,1,3,2,2,2,1,2,1,0,0,1,1,0,1,1,1,1,0,2,0,1,2,0,1,0,1,2,0,0,0,2,0,0,2,1,1,0,0,2,1,0,1,1,1,0,2,1,2,4,1,1,0,0,1,2,4,1,1,4,0,1,3,2,4,0,1,0,1,0,1,0,1,2,0,0,1,1,0,0,3,1,0,2,0,1,2,0,0,1,1,2,0,2,0,0,1,1,1,3,0,0,0,1,1,1,0,2,1,0,2,0,1,1,0,0,1,0,1,1,1,3,0,0,0,2,2,1,1,2,3,2,0,0,2,1,0,1,1,1,1,2,1,3,1,1,1,1,2,0,1,1,0,3,0,1,1,0,0,0,1,1,0,0,2,1,0,2,1,1,0,0,1,1,0,0,0,0,1,2,0,1,2,1,2,1,0,3,0,0,1,0,0,0,1,0,0,0,1,1,0,2,1,0,0,1,1,2,0,0,1,2,1,1,0,1,2,1,2,1,0,0,3,2,0,1,1,4,1,2,1,1,2,1,1,0,0,1,3,0,0,1,1,1,2,1,0,1,0,0,2,1,0,0,0,1,1,0,0,0,0,1,1,1,1,3,3,1,0,1,2,1,0,0,2,1,3,3,0,1,1,1,0,0,2,0,0,0,1,1,1,1,0,4,0,0,3,1,4,0,0,0,2,0,1,3,1,0,1,1,2,0,0,1,0,0,1,0,2,1,2,0,2,1,1,0,1,1,1,0,2,2,2,2,1,0,2,0,2,0,0,3,3,1,0,0,2,0,0,3,2,1,1,0,0,1,3,0,0,1,1,1,1,2,0,0,2,2,2,2,2,1,1,0,3,0,1,0,2,2,0,2,1,4,1,1,0,1,2,1,1,3,0,0,0,0,1,4,3,0,0,1,2,0,1,1,0,0,1,0,0,0,4,1,0,2,1,0,0,1,0,1,2,3,0,1,0,0,1,0,0,0,0,2,2,2,1,1,1,1,0,1,0,1,0,1,1,1,3,1,1,0,0,0,0,2,0,1,0,1,0,3,1,1,0,1,3,2,1,1,3,1,0,2,1,0,0,0,1,0,1,1,1,1,3,0,1,1,0,0,2,3,0,0,1,2,2,2,1,0,0,0,0,1,2,0,0,1,0,1,0,2,3,0,1,0,1,2,2,0,0,1,0,0,2,1,0,1,2,1,1,0,4,2,3,0,0,0,0,0,3,0,2,1,1,2,2,0,2,0,1,1,1,1,1,3,1,0,1,0,0,2,0,1,0,2,0,0,1,2,1,2,1,0,1,1,0,1,1,1,0,0,2,0,2,2,2,2,0,2,0,0,1,1,0,2,1,0,2,0,0,0,1,0,0,1,1,0,1,1,4,2,1,0,1,3,0,0,1,0,1,1,0,2,1,1,1,1,0,0,2,2,1,1,1,1,1,0,1,2,0,1,0,1,2,1,0,3,0,1,1,4,1,2,0,0,1,1,2,1,2,0,0,2,1,0,3,0,2,1,1,1,1,1,1,0,1,1,1,1,2,1,0,3,2,3,1,1,1,1,2,3,1,0,1,0,1,1,2,0,0,0,0,0,2,1,1,1,2,0,1,3,1,0,1,0,1,3,0,0,1,2,0,1,1,1,2,4,2,0,2,0,1,1,1,1,1,5,1,2,1,0,3,1,1,0,0,2,2,2,2,1,0,1,1,0,1,1,1,1,2,2,1,0,0,0,1,4,1,2,2,0,1,2,2,1,0,0,0,1,1,1,0,2,0,0,1,0,2,2,2,0,0,1,1,0,1,2,0,1,0,1,1,2,0,0,1,1,0,0,1,0,1,2,0,1,0,0,1,3,0,1,2,1,1,2,1,1,1,1,1,0,0,0,2,0,1,2,0,1,0,0,0,2,1,1,1,2,0,0,4,0,1,1,1,1,0,0,0,1,2,1,2,0,2,0,2,0,1,1,1,1,1,1,2,0,0,1,0,1,0,0,1,1,1,1,2,1,2,0,1,2,1,1,0,1,3,1,2,1,1,0,1,3,2,2,0,1,3,0,0,0,1,1,0,2,1,0,2,2,1,1,2,0,1,2,3,1,1,2,1,0,1,2,3,1,0,2,1,1,0,1,0,1,1,2,0,0,1,0,0,1,0,1,1,2,3,0,2,1,1,1,0,1,1,1,2,1,0,1,2,1,1,2,1,2,2,0,0,0,1,0,3,1,0,2,1,0,2,0,1,0,1,0,1,1,2,1,1,0,1,1,0,2,1,0,1,1,0,3,1,1,1,0,0,2,2,3,0,0,0,2,2,1,1,0,0,3,1,2,2,5,0,1,1,1,0,2,0,1,0,1,0,1,1,0,1,2,0,0,1,1,2,0,0,0,0,2,1,1,2,0,0,1,1,1,2,3,0,0,2,1,0,1,4,2,1,1,1,1,2,0,0,4,2,1,2,0,0,2,0,2,1,2,1,2,0,0,2,1,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,2,1,1,1,1,1,1,0,1,1,1,0,0,0,1,0,1,1,1,1,1,1,1,0,1,1,3,0,2,1,3,0,0,0,0,0,0,3,2,2,2,1,2,2,1,2,0,0,1,1,2,0,1,0,1,1,0,1,1,1,4,1,1,0,2,1,2,2,0,0,4,1,0,1,0,0,0,1,0,1,1,0,1,0,2,0,2,1,2,0,1,0,2,1,0,1,0,1,2,1,0,2,1,0,1,0,0,2,1,1,0,0,1,1,2,0,4,0,2,0,0,1,2,2,0,1,1,1,3,2,0,0,0,0,3,1,4,1,1,2,3,1,0,2,1,0,1,3,0,1,1,1,0,1,0,2,1,0,2,1,1,2,2,0,0,2,0,1,0,0,0,1,0,1,0,0,1,0,0,0,1,1,1,2,1,0,0,1,1,1,2,0,1,1,0,2,1,3,1,1,2,2,1,1,1,2,0,0,1,1,1,0,1,2,0,2,0,1,2,1,0,0,1,1,2,1,1,0,1,0,1,1,1,0,2,1,0,1,0,0,1,0,2,0,2,3,0,3,0,0,1,1,1,0,2,1,0,0,2,0,2,0,1,0,2,1,0,0,1,1,0,2,0,2,0,2,1,2,0,3,3,1,3,0,1,0,2,1,0,0,0,0,0,0,0,0,1,1,0,2,1,0,2,0,1,0,0,2,1,1,0,2,2,0,0,0,3,3,0,3,0,1,1,0,2,1,0,0,1,1,3,2,0,0,1,1,2,1,1,1,1,0,1,2,0,1,3,2,2,0,1,1,0,0,1,1,0,1,0,0,0,1,0,0,0,1,2,0,0,1,0,0,2,2,1,3,0,0,0,1,1,1,1,0,1,2,1,0,1,1,1,1,0,0,3,1,5,2,0,0,0,1,1,0,3,3,0,2,0,2,1,0,2,0,3,1,0,0,0,1,0,1,0,3,0,2,3,3,1,1,1,0,3,0,1,1,0,3,1,1,0,2,2,0,1,1,0,1,1,1,1,0,1,1,1,1,1,0,2,1,3,2,0,0,0,3,1,2,0,0,2,3,1,0,1,3,2,1,0,1,4,1,0,0,4,1,2,1,3,2,0,1,0,0,0,3,0,1,0,3,1,2,1,0,1,2,2,1,0,0,1,2,0,1,0,1,1,0,1,0,3,0,0,1,1,0,2,2,0,1,2,1,1,0,0,0,0,2,1,4,0,3,0,0,5,3,2,1,3,1,1,1,2,1,0,1,2,0,1,0,1,0,1,2,1,0,1,0,0,0,0,0,0,2,1,1,0,1,1,0,2,0,0,1,4,0,1,0,3,0,1,3,0,3,0,1,1,0,0,0,0,0,0,0,1,0,2,0,2,1,1,2,2,2,1,1,2,0,0,0,1,1,1,0,1,0,3,1,1,2,2,0,0,1,1,0,0,0,0,0,0,0,2,1,1,2,1,0,0,0,0,2,1,1,1,1,3,2,1,1,0,0,0,1,2,1,2,2,3,1,0,0,0,2,0,1,1,0,0,0,1,3,2,1,0,1,1,0,1,0,0,1,1,1,1,0,1,3,2,1,2,2,0,1,1,1,1,2,2,1,1,1,1,0,0,2,1,3,0,0,1,1,1,1,3,2,1,0,0,0,1,1,1,0,0,1,2,0,0,1,2,3,0,0,1,1,2,0,0,0,3,2,1,1,0,2,0,4,0,3]},{"counters":[1,2,1,0,1,1,0,2,0,1,1,1,0,2,0,1,1,0,1,1,0,1,0,0,1,0,1,0,0,2,0,1,0,1,1,1,1,0,1,1,0,4,0,4,1,1,2,3,1,3,1,1,3,2,0,2,1,1,0,1,1,1,2,0,1,2,1,1,1,1,1,1,2,2,3,1,1,0,1,0,1,2,1,0,1,1,0,1,1,1,0,0,1,0,0,0,0,1,1,0,1,1,0,1,3,1,1,1,2,2,1,0,0,2,0,2,2,2,1,0,0,2,2,0,3,1,0,2,0,1,1,0,0,0,2,2,2,3,2,0,1,2,1,1,0,2,1,0,0,2,2,1,1,0,2,0,1,1,1,0,1,0,1,2,2,0,0,0,0,0,1,1,2,0,0,2,0,2,0,0,2,1,0,0,2,0,0,0,2,0,1,2,0,2,0,0,1,1,1,3,0,0,0,4,1,0,1,3,2,0,1,2,0,1,0,3,1,0,0,2,0,1,3,2,0,1,0,0,2,0,0,0,0,2,1,0,0,2,0,0,1,2,3,3,0,1,2,0,0,1,1,0,0,0,1,0,1,1,1,1,0,1,1,1,1,2,1,3,1,0,0,2,1,1,0,1,1,0,0,0,0,0,0,1,3,1,2,1,2,0,1,0,0,1,0,1,0,1,2,0,2,1,0,0,0,2,0,1,1,1,2,1,1,1,1,1,0,1,0,1,1,3,1,0,2,0,1,0,2,1,4,0,3,2,0,1,1,1,0,0,1,0,2,0,3,2,1,0,0,2,1,0,4,3,1,2,1,1,0,0,1,1,1,0,1,0,0,2,1,0,3,1,1,2,1,1,0,2,0,1,0,2,1,0,0,1,0,0,0,2,0,2,3,1,0,0,2,0,2,1,0,0,1,2,1,1,1,2,0,0,1,0,2,1,0,0,0,0,1,0,2,0,2,0,1,0,0,0,1,3,2,1,0,0,0,0,1,1,3,1,1,1,0,2,0,0,2,2,3,2,0,1,1,2,2,0,0,0,1,2,2,0,2,0,0,0,0,0,1,1,2,1,1,1,2,0,1,3,1,2,2,0,0,0,1,2,0,0,0,1,1,1,0,0,1,6,1,0,2,2,0,2,0,0,0,0,1,3,4,1,0,0,1,2,1,2,3,2,1,0,0,1,1,2,1,0,1,1,1,2,1,0,2,0,3,0,0,1,1,0,2,1,0,0,1,0,0,0,1,1,2,2,3,1,1,2,1,1,0,0,1,1,0,2,0,1,0,1,4,1,0,1,1,1,1,1,0,1,1,2,2,0,1,1,0,0,2,0,1,2,2,3,3,0,0,1,0,0,0,2,0,2,1,2,0,1,2,0,1,1,1,1,0,1,1,0,0,1,2,1,1,1,3,2,0,0,2,0,2,1,2,2,0,1,0,1,0,2,0,1,2,0,0,2,1,2,0,1,1,1,2,1,1,2,0,1,4,0,1,0,1,0,0,0,3,0,1,1,0,1,2,1,0,2,3,1,2,0,1,2,2,2,0,0,2,0,1,1,0,2,3,0,2,3,1,1,0,0,1,2,0,0,1,1,1,2,1,0,2,0,0,1,1,1,0,4,1,0,0,1,1,0,1,1,0,0,1,1,2,1,0,2,1,1,1,0,1,1,0,2,1,1,0,1,2,4,2,1,0,0,2,0,0,2,0,1,0,5,2,1,0,3,0,0,0,0,0,1,1,0,2,1,1,0,1,2,0,2,0,0,1,4,0,0,1,1,1,0,1,1,1,3,1,2,0,0,2,2,1,1,0,1,0,0,1,0,1,2,2,0,0,1,2,1,0,0,2,4,1,1,1,0,2,0,0,0,1,1,0,3,0,1,0,1,0,0,1,1,0,2,0,0,0,0,2,1,2,0,1,2,2,0,0,0,2,1,2,1,1,0,0,2,1,1,0,0,3,0,2,1,0,0,2,0,1,1,0,1,2,0,3,0,0,2,0,1,1,0,1,1,2,1,2,0,0,0,0,1,1,1,0,2,1,3,0,2,3,0,2,2,0,0,1,2,1,0,0,2,1,0,0,1,1,3,2,0,2,3,0,0,1,3,3,2,0,3,0,2,0,1,0,1,0,0,2,0,1,2,1,2,0,0,1,1,1,0,1,0,0,1,0,1,0,4,0,1,3,1,3,2,1,0,1,1,1,2,3,1,0,0,3,1,0,1,1,2,0,0,1,0,1,3,3,1,3,1,0,0,0,0,0,0,1,0,1,2,0,1,1,0,1,1,1,0,1,2,0,2,0,1,1,0,0,0,1,1,2,0,0,1,1,0,0,2,2,0,0,3,0,0,2,2,1,0,1,0,4,1,3,1,1,1,1,1,1,2,6,1,2,0,0,1,2,2,0,0,0,1,0,0,0,3,0,0,0,0,3,0,1,2,1,1,0,1,1,1,1,1,1,1,3,0,1,1,1,2,0,2,0,3,0,1,0,0,2,0,2,0,1,0,0,0,1,1,0,1,2,2,0,2,1,1,1,1,2,0,1,0,1,2,1,0,2,3,2,0,0,1,1,1,1,1,0,1,1,0,1,3,0,2,1,2,1,0,0,0,2,0,2,1,1,2,0,2,1,0,1,1,0,1,0,2,1,0,0,0,2,0,0,1,0,0,2,0,0,1,0,0,0,1,1,1,1,0,1,0,0,2,1,1,1,4,0,2,3,1,0,2,0,2,0,1,0,2,1,0,1,0,1,1,3,0,1,1,1,0,1,0,0,1,1,1,0,1,0,0,0,3,1,1,1,0,0,3,1,0,0,3,2,1,0,2,4,1,1,2,3,0,0,3,0,1,1,1,0,0,1,2,2,1,2,2,1,1,1,1,0,0,2,0,0,1,2,0,2,2,0,1,0,1,2,2,1,3,1,1,1,2,1,1,3,1,0,1,0,3,1,2,0,0,1,2,0,1,0,0,0,1,0,1,1,1,0,0,2,0,3,0,0,1,0,1,0,1,1,3,0,1,2,2,0,2,1,2,3,1,0,1,1,2,1,0,1,0,0,1,1,1,1,0,0,0,0,1,0,2,0,1,3,0,0,2,0,0,0,0,1,1,1,2,1,0,2,0,2,0,1,0,1,0,1,0,3,0,0,0,0,0,2,2,1,0,3,0,0,2,0,0,1,0,0,0,1,2,4,1,0,1,2,0,2,0,1,2,1,1,1,0,0,3,1,1,0,1,1,0,3,1,0,1,1,1,0,0,1,1,0,2,0,1,0,1,1,1,1,1,1,2,0,2,0,2,1,0,1,0,1,1,2,0,0,2,2,0,2,0,1,0,2,3,0,2,3,2,1,0,0,0,0,1,1,1,1,0,3,0,0,3,1,0,1,1,3,0,0,1,3,2,2,0,1,0,1,3,0,1,2,1,1,1,1,1,1,1,0,3,1,2,1,1,1,0,2,0,1,1,0,1,2,0,1,0,1,2,1,0,3,1,0,1,1,0,1,1,1,1,1,0,1,0,0,0,4,1,3,1,1,0,0,1,2,3,1,1,1,0,1,1,0,1,3,1,0,1,1,1,1,1,1,0,3,3,0,0,2,3,1,1,2,1,1,1,1,0,2,1,1,3,3,2,0,1,0,2,1,0,1,0,2,1,0,2,0,1,0,1,1,2,2,2,0,1,0,0,0,1,3,0,2,1,1,1,0,1,3,1,0,1,1,2,0,1,0,0,1,0,1,0,0,2,3,3,3,0,1,0,1,2,1,0,1,0,0,1,1,0,1,1,2,3,2,0,2,1,0,0,1,1,0,0,0,0,0,0,1,0,0,3,0,1,2,1,0,1,0,3,2,2,1,0,2,3,2,0,0,0,2,2,1,3,0,2,1,1,1,0,0,1,0,3,0,1,1,0,2,1,2,1,2,1,1,4,1,2,3,6,0,3,0,2,3,0,1,0,1,1,0,1,1,1,1,0,3,1,0,2,1,0,0,0,1,0,1,0,1,2,1,2,1,2,1,1,0,2,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,0,3,1,0,0,0,1,1,2,0,1,1,1,0,1,1,0,1,0,0,0,0,0,1,0,1,0,0,1,0,1,1,1,2,1,2,4,1,1,3,2,1,0,0,0,3,1,0,1,0,2,0,1,0,3,1,1,1,1,2,1,0,1,1,2,1,1,0,0,1,2,3,1,0,1,2,2,0,1,1,1,2,0,1,1,2,2,2,3,1,0,1,1,0,1,2,4,2,1,1,1,1,1,1,2,0,1,0,1,1,2,3,2,0,1,1,1,0,1,1,1,1,1,0,2,2,0,2,5,2,1,2,0,0,1,1,0,1,0,4,1,0,1,0,1,1,1,3,0,3,3,0,0,0,1,0,1,1,3,0,0,2,1,0,0,0,0,0,0,1,2,0,1,1,0,1,3,1,3,2,3,0,3,0,1,0,0,1,2,0,1,0,1,1,1,0,0,1,0,2,2,1,0,0,1,1,2,1,0,1,0,2,0,5,0,2,2,2,1,0,1,2,1,0,3,0,2,0,3,2,2,0,0,2,0,0,2,2,0,1,2,1,0,4]},{"counters":[1,4,0,2,0,0,4,0,0,2,1,0,0,0,1,1,0,0,2,0,0,0,1,0,0,1,1,1,1,1,1,1,1,0,2,0,1,1,0,0,0,0,0,0,1,2,1,2,1,1,2,0,3,0,0,0,0,2,0,1,2,0,0,0,0,1,1,1,1,0,1,0,1,0,1,2,1,0,1,1,0,1,2,1,1,1,0,2,0,0,3,1,0,1,2,1,0,0,2,0,2,3,2,2,0,1,0,0,1,2,0,4,1,0,2,2,2,1,1,0,4,1,2,0,1,2,2,0,0,2,2,2,0,0,1,0,2,2,0,2,0,1,3,1,0,1,1,1,1,0,1,0,0,0,1,2,1,1,0,0,1,0,1,0,0,2,3,2,0,0,2,2,0,1,0,1,1,1,0,0,3,1,1,0,0,0,1,2,1,1,4,1,0,0,1,0,2,1,2,1,1,2,2,0,0,2,0,0,0,1,1,0,0,2,1,0,0,1,0,0,0,1,2,2,2,1,0,0,0,1,1,1,0,1,0,1,2,1,1,2,0,1,1,1,0,0,2,1,0,1,0,0,0,0,0,2,0,1,1,1,2,0,2,0,1,1,0,1,0,0,3,2,2,1,2,0,1,3,0,2,2,0,1,0,2,0,0,1,0,1,0,1,0,1,4,2,0,2,2,0,1,1,2,1,1,0,0,0,0,0,5,1,2,1,1,0,3,0,2,1,3,0,0,0,3,0,2,2,1,2,0,1,1,1,2,1,1,0,0,0,1,0,1,1,3,1,1,2,0,2,0,1,0,1,3,2,1,2,0,1,2,0,1,2,3,2,0,0,0,0,1,1,0,1,1,2,1,0,1,1,1,0,1,3,0,1,1,1,1,2,0,3,1,0,1,1,3,0,1,1,2,2,2,0,0,2,0,1,1,1,0,1,0,1,0,0,2,2,2,2,1,2,0,0,2,1,1,2,0,0,0,0,0,1,0,1,2,2,1,0,0,0,0,1,1,2,2,2,1,2,1,1,0,1,1,0,1,0,1,1,2,2,0,0,1,1,0,0,2,1,0,1,0,1,3,0,1,1,2,0,2,1,1,0,0,2,0,2,2,1,1,1,0,1,0,0,2,0,1,3,2,1,1,2,1,2,1,1,0,0,1,0,2,0,2,0,2,3,1,0,2,1,1,0,3,1,3,2,3,0,0,0,0,1,3,1,0,0,0,0,1,1,1,0,0,3,1,0,1,1,1,0,1,3,2,0,0,5,5,0,0,2,0,0,0,1,0,1,1,0,2,1,1,3,2,0,0,0,1,1,4,0,0,4,3,2,2,2,3,1,1,3,2,0,0,0,2,2,1,2,0,2,0,1,1,2,1,0,0,0,1,0,2,0,2,1,0,1,0,0,0,1,1,3,2,2,1,2,1,2,1,0,2,0,0,1,0,2,2,1,0,2,1,2,0,0,1,0,2,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,1,3,1,2,0,1,1,0,2,1,0,0,0,1,1,2,0,1,3,1,2,1,1,1,2,1,1,0,0,1,0,2,2,0,2,2,1,1,1,6,0,0,0,1,2,1,0,0,1,3,1,2,0,1,0,4,1,1,1,1,4,1,1,1,2,0,2,0,3,1,1,0,0,0,0,1,0,0,1,3,2,1,0,3,1,0,1,0,0,0,0,0,1,3,2,0,0,3,0,0,1,0,1,3,0,0,0,0,4,1,1,0,0,0,0,0,1,0,2,0,1,1,1,2,2,2,1,1,1,0,2,1,1,1,2,1,1,1,0,0,1,1,1,0,0,1,1,1,3,1,0,0,1,0,0,0,0,1,2,3,0,0,2,1,1,0,1,2,1,0,0,3,3,0,1,1,0,1,0,1,1,0,1,0,3,1,0,1,0,2,0,2,2,1,0,0,2,2,0,1,0,2,1,0,1,2,1,1,1,1,0,1,0,0,2,0,1,0,1,1,0,0,3,1,1,2,0,0,0,0,1,1,0,2,2,0,0,1,0,0,0,1,0,1,2,1,1,0,0,1,0,4,0,1,1,0,0,0,0,1,0,0,1,1,0,0,1,3,1,0,1,2,3,1,3,2,2,0,0,0,1,2,0,2,0,0,0,2,3,1,2,0,0,1,0,0,1,0,1,0,2,2,0,1,2,2,1,1,4,0,1,2,0,0,1,0,0,3,0,0,1,0,0,2,0,0,2,1,0,0,1,1,1,1,0,1,1,0,1,1,0,0,1,0,3,4,1,4,1,2,1,0,1,0,1,0,1,0,2,0,2,1,1,0,5,1,1,2,0,2,1,0,0,1,2,0,0,1,0,0,0,2,0,1,1,1,1,0,0,0,1,2,0,1,0,0,2,2,1,3,0,2,0,0,1,2,3,2,1,1,0,2,1,0,1,1,3,0,1,0,0,0,0,0,0,2,1,2,2,0,0,3,0,0,1,4,4,0,2,1,1,0,2,1,0,1,0,1,1,1,2,0,0,2,2,0,1,1,1,1,0,1,1,1,0,0,1,0,1,1,0,1,1,2,2,3,2,1,2,0,1,0,0,0,0,1,3,1,0,1,3,1,1,0,0,2,1,0,2,1,0,0,0,2,3,0,0,1,0,1,1,3,3,1,3,1,0,3,2,2,1,2,0,0,1,2,1,1,1,0,2,0,2,2,0,0,4,1,1,0,0,1,1,0,2,0,0,1,2,0,1,0,2,3,0,2,2,0,2,0,1,0,0,1,4,4,1,0,2,1,1,1,0,1,4,0,2,1,0,1,0,3,3,2,0,0,1,3,1,1,0,4,3,1,0,2,0,3,1,0,1,1,2,1,0,1,0,0,1,1,0,1,1,1,1,1,0,3,0,2,0,2,0,0,0,2,2,1,2,0,0,0,2,1,0,1,2,2,0,1,0,1,0,1,1,1,0,0,0,1,0,0,0,0,2,2,2,0,1,1,1,1,0,2,2,1,1,1,0,1,2,1,0,1,2,2,1,2,1,0,0,2,1,2,1,1,1,0,1,2,0,0,0,0,3,1,1,1,2,1,1,2,0,1,1,1,1,2,1,2,1,1,0,0,1,0,2,3,2,1,3,0,1,0,1,2,1,4,2,0,1,0,1,2,1,2,1,2,1,2,1,1,2,2,0,0,0,1,0,1,0,0,0,1,3,1,0,0,2,1,1,0,0,0,1,0,1,3,1,1,1,1,2,1,1,0,1,1,0,0,0,1,0,0,1,1,1,0,1,0,1,1,1,0,1,0,1,0,1,0,0,0,4,0,0,1,1,1,2,1,0,1,0,2,0,1,1,5,0,0,0,1,0,1,0,2,3,0,1,2,0,5,2,1,1,1,1,1,2,0,1,1,1,2,0,3,1,0,0,1,5,1,0,1,0,0,0,1,1,0,0,1,2,1,0,1,0,2,0,1,3,1,2,1,1,1,4,0,3,0,2,0,1,1,0,2,3,1,0,0,1,0,2,0,0,1,2,2,1,2,1,1,0,1,0,0,2,1,0,1,2,1,1,3,2,0,1,2,0,1,1,1,1,1,2,2,3,1,1,0,3,1,1,0,0,1,1,1,1,0,2,1,2,1,3,1,0,0,0,2,0,2,2,2,0,0,2,0,1,1,0,1,1,0,0,0,2,0,0,0,0,2,2,1,1,0,0,2,2,1,1,1,0,2,1,0,1,2,1,0,1,2,0,1,1,0,0,1,2,1,2,0,0,0,0,1,2,0,1,1,1,1,1,0,1,3,0,2,0,0,1,2,1,2,0,0,1,0,1,0,2,1,0,3,1,2,2,0,0,3,2,1,1,0,1,1,1,1,0,2,0,2,0,0,1,1,0,0,1,1,0,0,1,1,1,0,0,1,1,1,0,1,0,0,0,0,0,1,1,1,2,0,0,1,0,1,0,0,0,0,2,0,1,1,1,2,2,0,1,0,2,2,1,0,1,0,1,1,1,1,0,1,0,1,1,1,2,2,0,1,1,1,3,0,4,1,1,3,1,0,0,0,1,1,1,2,1,2,0,0,2,0,4,1,1,2,1,0,1,2,3,1,0,1,0,1,1,1,1,0,3,1,1,2,1,1,6,0,0,0,1,3,0,2,4,1,0,0,0,1,2,0,1,1,1,1,2,0,2,0,4,1,0,0,0,4,3,1,1,3,0,0,0,2,1,0,0,1,1,1,3,0,1,0,1,0,1,0,1,1,1,0,0,0,1,2,3,2,0,3,0,2,2,2,2,3,0,2,0,1,0,1,1,1,0,1,0,1,1,1,0,3,2,1,0,0,2,2,0,0,0,2,0,2,1,0,0,1,0,1,1,0,2,2,1,1,2,3,1,2,2,3,0,2,3,0,1,1,2,2,2,1,1,1,1,2,1,1,0,1,2,1,1,1,1,2,0,1,0,1,1,0,0,1,2,0,1,1,0,1,1,1,3,1,0,1,3,1,0,2,2,0,1,2,0,0,0,0,1,0,0,1,0,0,0,1,1,0,2,2,1,0,0,0,3,3,1,1,1,0,3,0,0,0,0,1,5,1,1,0,2,1,0,0,0,0,1,1,1,3,1,4]}]},"null_count":0,"last_update_version":397952055452368896},"d":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDYwNTA5NjQ=","upper_bound":"LTIxNDE4MzU3Nzk=","repeats":1},{"count":16,"lower_bound":"LTIxMjk0MjYwMzQ=","upper_bound":"LTIxMTY5Mjg5NjQ=","repeats":1},{"count":24,"lower_bound":"LTIxMTYyNDg2MzU=","upper_bound":"LTIxMDU2NDM0MzU=","repeats":1},{"count":32,"lower_bound":"LTIxMDU1MjY0NDI=","upper_bound":"LTIwOTQwNDYzODY=","repeats":1},{"count":40,"lower_bound":"LTIwODY4Njk0NTI=","upper_bound":"LTIwNjU3MTU0NjM=","repeats":1},{"count":48,"lower_bound":"LTIwNjMzNTM0MDM=","upper_bound":"LTIwNjI1ODkwOTI=","repeats":1},{"count":56,"lower_bound":"LTIwNjExMDcxMDA=","upper_bound":"LTIwNTc5NDY2NjM=","repeats":1},{"count":64,"lower_bound":"LTIwNDg2NDY2MDY=","upper_bound":"LTIwNDEwMzI4NDc=","repeats":1},{"count":72,"lower_bound":"LTIwMzQ5MjkwMjQ=","upper_bound":"LTIwMjczNDU4OTc=","repeats":1},{"count":80,"lower_bound":"LTIwMjY1NzE5OTU=","upper_bound":"LTIwMDQ5MTE3MzQ=","repeats":1},{"count":88,"lower_bound":"LTE5OTk3OTAwNzA=","upper_bound":"LTE5OTMyMjg0MDE=","repeats":1},{"count":96,"lower_bound":"LTE5Nzc2Njg5Njg=","upper_bound":"LTE5NTAzODMzNjk=","repeats":1},{"count":104,"lower_bound":"LTE5NDYzMTQzMTg=","upper_bound":"LTE5MjgxNzI5Njk=","repeats":1},{"count":112,"lower_bound":"LTE5MjY2Njc5Nzk=","upper_bound":"LTE4ODg0OTc2Mzg=","repeats":1},{"count":120,"lower_bound":"LTE4ODgyMzM1NzA=","upper_bound":"LTE4NzY1ODg3OTE=","repeats":1},{"count":128,"lower_bound":"LTE4NzM5MjU1NzQ=","upper_bound":"LTE4Njc3NzA2MDk=","repeats":1},{"count":136,"lower_bound":"LTE4NjYwMzMxNzU=","upper_bound":"LTE4NTkyODg2MjY=","repeats":1},{"count":144,"lower_bound":"LTE4NTgzMjc5NDg=","upper_bound":"LTE4NDY2ODczMjg=","repeats":1},{"count":152,"lower_bound":"LTE4NDA4OTY1NzA=","upper_bound":"LTE4MjIzMjQzMjk=","repeats":1},{"count":160,"lower_bound":"LTE4MTE5NDgxODY=","upper_bound":"LTE3OTkwOTQ0ODU=","repeats":1},{"count":168,"lower_bound":"LTE3OTQ5MjkxNDU=","upper_bound":"LTE3ODY3NTI2MTk=","repeats":1},{"count":176,"lower_bound":"LTE3ODM4NTQ4ODE=","upper_bound":"LTE3Njk5MDg1MDU=","repeats":1},{"count":184,"lower_bound":"LTE3NTgyNTk4NzQ=","upper_bound":"LTE3MzI3OTUzMTg=","repeats":1},{"count":192,"lower_bound":"LTE3MjY1NDg2MjE=","upper_bound":"LTE3MjMyNzU5NzU=","repeats":1},{"count":200,"lower_bound":"LTE3MjIzODc4NjI=","upper_bound":"LTE3MDY1NjAzMzY=","repeats":1},{"count":208,"lower_bound":"LTE3MDQwNjQ3ODk=","upper_bound":"LTE2OTI0MTIwMjc=","repeats":1},{"count":216,"lower_bound":"LTE2NzkxODAzNDE=","upper_bound":"LTE2NzE5NDc3MTY=","repeats":1},{"count":224,"lower_bound":"LTE2NTI3NjYwMjc=","upper_bound":"LTE2NDM5NjAxMTA=","repeats":1},{"count":232,"lower_bound":"LTE2Mzc1MjU0ODI=","upper_bound":"LTE2MzM1OTc4MDI=","repeats":1},{"count":240,"lower_bound":"LTE2MzMyOTU2MzQ=","upper_bound":"LTE2MjExNjMzODM=","repeats":1},{"count":248,"lower_bound":"LTE2MTc1ODk2MjQ=","upper_bound":"LTE2MDUxMjMyMTA=","repeats":1},{"count":256,"lower_bound":"LTE2MDIyNzA4ODg=","upper_bound":"LTE1Nzk3MDU4MjQ=","repeats":1},{"count":264,"lower_bound":"LTE1Njc4NjU5MDA=","upper_bound":"LTE1NDUwNTE2MTc=","repeats":1},{"count":272,"lower_bound":"LTE1Mzc2MjQxNTk=","upper_bound":"LTE1MzAzMjQzNjA=","repeats":1},{"count":280,"lower_bound":"LTE1Mjc1OTE4MjM=","upper_bound":"LTE1MTE0OTA2MDg=","repeats":1},{"count":288,"lower_bound":"LTE1MDk3Mjc1MDE=","upper_bound":"LTE0NzIzNTE3NDk=","repeats":1},{"count":296,"lower_bound":"LTE0NjcwNzczMTQ=","upper_bound":"LTE0NTQ3MzAyMjA=","repeats":1},{"count":304,"lower_bound":"LTE0NTQzMjY2MzY=","upper_bound":"LTE0NDYxNjkyNDY=","repeats":1},{"count":312,"lower_bound":"LTE0NDM3OTA5MzQ=","upper_bound":"LTE0Mzk2NzEzMzQ=","repeats":1},{"count":320,"lower_bound":"LTE0Mjc2NjI0MjM=","upper_bound":"LTE0MTEzMTAyNDQ=","repeats":1},{"count":328,"lower_bound":"LTE0MDcwMjUzNDM=","upper_bound":"LTE0MDQyMDAxNzY=","repeats":1},{"count":336,"lower_bound":"LTE0MDI3OTgwMDc=","upper_bound":"LTEzOTA0NDA4NjI=","repeats":1},{"count":344,"lower_bound":"LTEzNzYzOTg4MjM=","upper_bound":"LTEzNjAyODI2NTY=","repeats":1},{"count":352,"lower_bound":"LTEzNTk0MTE0NzY=","upper_bound":"LTEzNTMwNzA3MDg=","repeats":1},{"count":360,"lower_bound":"LTEzNTI5NDkyNTk=","upper_bound":"LTEzNDAxNDU3NjU=","repeats":1},{"count":368,"lower_bound":"LTEzMzU4NDI1OTU=","upper_bound":"LTEzMjA3MDIyNzE=","repeats":1},{"count":376,"lower_bound":"LTEzMTM3NzAyOTM=","upper_bound":"LTEzMDc1NDc2ODM=","repeats":1},{"count":384,"lower_bound":"LTEyOTYwOTk1Njk=","upper_bound":"LTEyOTA3MjE4MjA=","repeats":1},{"count":392,"lower_bound":"LTEyODYyNDcyNzk=","upper_bound":"LTEyNjY0MjE4MTk=","repeats":1},{"count":400,"lower_bound":"LTEyNjI3Mjg4Nzk=","upper_bound":"LTEyNTI1NDQ1Mjc=","repeats":1},{"count":408,"lower_bound":"LTEyNDcxODMwNTM=","upper_bound":"LTEyMjcxOTg2OTE=","repeats":1},{"count":416,"lower_bound":"LTEyMjY5ODUzMjE=","upper_bound":"LTEyMTAxODA5MDM=","repeats":1},{"count":424,"lower_bound":"LTEyMDYwOTMxNTA=","upper_bound":"LTExOTk1NzM1MTA=","repeats":1},{"count":432,"lower_bound":"LTExOTc4MTQ3NzY=","upper_bound":"LTExODkzNjU5MzY=","repeats":1},{"count":440,"lower_bound":"LTExODc5OTM5MzU=","upper_bound":"LTExNTcxMDk1MDU=","repeats":1},{"count":448,"lower_bound":"LTExNTU1OTI5MjM=","upper_bound":"LTExNDc4NjM3MzI=","repeats":1},{"count":456,"lower_bound":"LTExNDc4MjUyMzI=","upper_bound":"LTExNDA4MDMyNTY=","repeats":1},{"count":464,"lower_bound":"LTExNDA0MTk2OTY=","upper_bound":"LTExMzAyNTc2NzM=","repeats":1},{"count":472,"lower_bound":"LTExMjE1ODUyODk=","upper_bound":"LTExMTE2NTQwNjM=","repeats":1},{"count":480,"lower_bound":"LTExMTE0MjMyNzI=","upper_bound":"LTExMDY4NzgxOTM=","repeats":1},{"count":488,"lower_bound":"LTExMDY3OTE4MjI=","upper_bound":"LTExMDAzMzY5OTU=","repeats":1},{"count":496,"lower_bound":"LTExMDAwNzc1MzM=","upper_bound":"LTEwOTU5NTE0MTI=","repeats":1},{"count":504,"lower_bound":"LTEwOTQ0MDk0MDU=","upper_bound":"LTEwNzc2NjY4NTA=","repeats":1},{"count":512,"lower_bound":"LTEwNjgwNjU2MTk=","upper_bound":"LTEwNjI4NDk0MjE=","repeats":1},{"count":520,"lower_bound":"LTEwNTgzODQxMjc=","upper_bound":"LTEwMzgzNzkxOTA=","repeats":1},{"count":528,"lower_bound":"LTEwMjkwMTAxODI=","upper_bound":"LTEwMjExNjk0ODM=","repeats":1},{"count":536,"lower_bound":"LTEwMTk2MjczOTA=","upper_bound":"LTEwMTM2Mzc1MDc=","repeats":1},{"count":544,"lower_bound":"LTEwMDU5NDY4OTY=","upper_bound":"LTk5MjE5MTk4OQ==","repeats":1},{"count":552,"lower_bound":"LTk4NzcxOTI1OQ==","upper_bound":"LTk2MzgzMDIzNQ==","repeats":1},{"count":560,"lower_bound":"LTk0MzEzMDIxMw==","upper_bound":"LTkyOTg5MTYyNA==","repeats":1},{"count":568,"lower_bound":"LTkyMjgxMTg2OA==","upper_bound":"LTkxMzgwNjU1Nw==","repeats":1},{"count":576,"lower_bound":"LTkxMTQ3NjIzMg==","upper_bound":"LTkwNTA1OTIzOQ==","repeats":1},{"count":584,"lower_bound":"LTkwMzM1MzQ5NA==","upper_bound":"LTg5NDYxMTgyMw==","repeats":1},{"count":592,"lower_bound":"LTg5MTk1NjAwOA==","upper_bound":"LTg4NzYxODMzMQ==","repeats":1},{"count":600,"lower_bound":"LTg3ODIxMTE3Nw==","upper_bound":"LTg2MzQ3ODcwOQ==","repeats":1},{"count":608,"lower_bound":"LTg1OTkxODA2Mw==","upper_bound":"LTgzODU3NTAyNw==","repeats":1},{"count":616,"lower_bound":"LTgzMzYyMTk3MQ==","upper_bound":"LTgyNTU3MzQzOQ==","repeats":1},{"count":624,"lower_bound":"LTgyMjk2MDIyMQ==","upper_bound":"LTgxMDk3MzU2Mw==","repeats":1},{"count":632,"lower_bound":"LTgwNDE3OTYzOA==","upper_bound":"LTc5MDYxMjc3NA==","repeats":1},{"count":640,"lower_bound":"LTc4OTU2NzIwOQ==","upper_bound":"LTc4MzM1NzM4MQ==","repeats":1},{"count":648,"lower_bound":"LTc4MDE2OTAwMA==","upper_bound":"LTc3MTg5NzQxMg==","repeats":1},{"count":656,"lower_bound":"LTc3MDk1Nzc2OQ==","upper_bound":"LTc2NTkxMjU0MA==","repeats":1},{"count":664,"lower_bound":"LTc1NTQ5ODkwOQ==","upper_bound":"LTczOTIxMTYxOA==","repeats":1},{"count":672,"lower_bound":"LTczNzA2MzYwMQ==","upper_bound":"LTcyMTIxMjMzMA==","repeats":1},{"count":680,"lower_bound":"LTcwMzIwNTgzNg==","upper_bound":"LTY3NzY0NjUxNg==","repeats":1},{"count":688,"lower_bound":"LTY3MDQ3MjI3Ng==","upper_bound":"LTY2MDg3NDcwOA==","repeats":1},{"count":696,"lower_bound":"LTY1NzI3MjA1Mw==","upper_bound":"LTY0MTYyNDYwOQ==","repeats":1},{"count":704,"lower_bound":"LTYzNjk2OTYzMQ==","upper_bound":"LTYyMTQwNTI3OA==","repeats":1},{"count":712,"lower_bound":"LTYxOTY3OTgwMw==","upper_bound":"LTYwNzg2MTE3OA==","repeats":1},{"count":720,"lower_bound":"LTYwNjUyODQwMQ==","upper_bound":"LTYwMzA3MzEwNw==","repeats":1},{"count":728,"lower_bound":"LTYwMjkxMDg1OQ==","upper_bound":"LTU4MDQ5NDQyNA==","repeats":1},{"count":736,"lower_bound":"LTU3MjYzOTc1MA==","upper_bound":"LTU2Mjc2ODg3Ng==","repeats":1},{"count":744,"lower_bound":"LTU1OTI5OTM1Mg==","upper_bound":"LTU1NjM3NDg5NQ==","repeats":1},{"count":752,"lower_bound":"LTU1MzAyMTQwNw==","upper_bound":"LTU0NTgwMTQ4Nw==","repeats":1},{"count":760,"lower_bound":"LTUzNzIwMjc0OA==","upper_bound":"LTUyNzcyNjEzNg==","repeats":1},{"count":768,"lower_bound":"LTUyNzAyMjU1MA==","upper_bound":"LTUwOTg4Nzk2Nw==","repeats":1},{"count":776,"lower_bound":"LTUwNzQ5MTA1NQ==","upper_bound":"LTUwNDE2MzkxMw==","repeats":1},{"count":784,"lower_bound":"LTUwMjIxMDE3NA==","upper_bound":"LTQ3MzQ1MzgwNA==","repeats":1},{"count":792,"lower_bound":"LTQ3MDA3ODY5MQ==","upper_bound":"LTQ1OTAyOTY0Mg==","repeats":1},{"count":800,"lower_bound":"LTQ1Nzg4MTI2NA==","upper_bound":"LTQzNzE0ODI5MQ==","repeats":1},{"count":808,"lower_bound":"LTQzNDk1NDU1Ng==","upper_bound":"LTQzMzk5NjY0Mg==","repeats":1},{"count":816,"lower_bound":"LTQzMzgyMjE3Mg==","upper_bound":"LTQxMzg4NTE5OQ==","repeats":1},{"count":824,"lower_bound":"LTQxMzQ0MTQyNw==","upper_bound":"LTQwNjcwMjQwOQ==","repeats":1},{"count":832,"lower_bound":"LTQwMDMwMTIyMA==","upper_bound":"LTM4MjYyMzM3MQ==","repeats":1},{"count":840,"lower_bound":"LTM3Mjc3OTA0MA==","upper_bound":"LTM2ODk3Njg0OQ==","repeats":1},{"count":848,"lower_bound":"LTM2NTY1NTU1NA==","upper_bound":"LTM1NDM4OTAxNw==","repeats":1},{"count":856,"lower_bound":"LTM1MzQ1NDUzNQ==","upper_bound":"LTM0MjY4NDQyMQ==","repeats":1},{"count":864,"lower_bound":"LTMzMDQ3MzQzOQ==","upper_bound":"LTMyMzMyMjk3OA==","repeats":1},{"count":872,"lower_bound":"LTMxODQ1MTM4Mg==","upper_bound":"LTMwMzg4Mjc2NQ==","repeats":1},{"count":880,"lower_bound":"LTMwMzQwNTkyOA==","upper_bound":"LTI5MzAxMjY0NA==","repeats":1},{"count":888,"lower_bound":"LTI5MjIzNzgwOA==","upper_bound":"LTI4MDc1OTY3MA==","repeats":1},{"count":896,"lower_bound":"LTI3NjQ1NTM0Mg==","upper_bound":"LTI2OTI4MDQ4MQ==","repeats":1},{"count":904,"lower_bound":"LTI2OTEzNzA0OA==","upper_bound":"LTI1MTA3MDc4Mw==","repeats":1},{"count":912,"lower_bound":"LTI0NjQwMTM1Mw==","upper_bound":"LTIzMzg1MzEyOQ==","repeats":1},{"count":920,"lower_bound":"LTIyOTU0Njg1Mg==","upper_bound":"LTIyMDM4ODY3MQ==","repeats":1},{"count":928,"lower_bound":"LTIxNzQxMzM2NA==","upper_bound":"LTIxMzM5NDI2OA==","repeats":1},{"count":936,"lower_bound":"LTIwNDE3NDkwNg==","upper_bound":"LTE4ODA1Mzc1NQ==","repeats":1},{"count":944,"lower_bound":"LTE4NjA1MzIxNA==","upper_bound":"LTE3NjMxNjY3Mg==","repeats":1},{"count":952,"lower_bound":"LTE0NjQxNjkyMg==","upper_bound":"LTEzODkyNDYyMg==","repeats":1},{"count":960,"lower_bound":"LTEzMDE4MjQyMw==","upper_bound":"LTExMTU4NDc2NQ==","repeats":1},{"count":968,"lower_bound":"LTEwNDIzNTAyNQ==","upper_bound":"LTk3MTc3MTk5","repeats":1},{"count":976,"lower_bound":"LTgyOTgxNzU2","upper_bound":"LTc0NzMwNTAy","repeats":1},{"count":984,"lower_bound":"LTcyMjQ0Mjk2","upper_bound":"LTY0ODUyMzM1","repeats":1},{"count":992,"lower_bound":"LTYzNDU1ODA5","upper_bound":"LTQ0MjUyODkx","repeats":1},{"count":1000,"lower_bound":"LTQ0MTg3Mzcw","upper_bound":"LTMzNzAxNzM4","repeats":1},{"count":1008,"lower_bound":"LTMwNDg5ODM3","upper_bound":"LTM4NDEwMzE=","repeats":1},{"count":1016,"lower_bound":"LTM0OTcxOTQ=","upper_bound":"NDY1MzE3MA==","repeats":1},{"count":1024,"lower_bound":"NjYxMTc5NA==","upper_bound":"MTgwNjIwMTA=","repeats":1},{"count":1032,"lower_bound":"MjA3NDUyOTI=","upper_bound":"Mjg1MTkwMzc=","repeats":1},{"count":1040,"lower_bound":"MzA4NzU4NzY=","upper_bound":"NDI4OTUwMDM=","repeats":1},{"count":1048,"lower_bound":"NDYxNzU3Mzk=","upper_bound":"NTU5MDQ4ODM=","repeats":1},{"count":1056,"lower_bound":"NTc4MjQ0MTM=","upper_bound":"NjY4NjQ0NjY=","repeats":1},{"count":1064,"lower_bound":"Njc4NzUzNTQ=","upper_bound":"ODIyNzE2OTU=","repeats":1},{"count":1072,"lower_bound":"ODQ1MzMxMTY=","upper_bound":"MTEzNDM2Njc1","repeats":1},{"count":1080,"lower_bound":"MTE2ODAwNjk3","upper_bound":"MTM2NzE0ODk2","repeats":1},{"count":1088,"lower_bound":"MTM2ODU1MDc4","upper_bound":"MTU1NTc4Mzk5","repeats":1},{"count":1096,"lower_bound":"MTU3MjcwNTY5","upper_bound":"MTc2NzIxMTc0","repeats":1},{"count":1104,"lower_bound":"MTg0NTYxNzcx","upper_bound":"MjA1NTM5NTYz","repeats":1},{"count":1112,"lower_bound":"MjIyNDM0MDAy","upper_bound":"MjQ3MzE5MDU5","repeats":1},{"count":1120,"lower_bound":"MjQ5ODM2ODM3","upper_bound":"MjY4MzI0Nzkw","repeats":1},{"count":1128,"lower_bound":"MjY4NzY4MzM5","upper_bound":"MzA3MTMxNjEw","repeats":1},{"count":1136,"lower_bound":"MzEyMTI1MjA4","upper_bound":"MzE2MjUwNDA2","repeats":1},{"count":1144,"lower_bound":"MzIyMDQyNzAy","upper_bound":"MzI4NDA0MDM3","repeats":1},{"count":1152,"lower_bound":"MzMwNzA4NDc3","upper_bound":"MzQ1ODg0ODIx","repeats":1},{"count":1160,"lower_bound":"MzUxNTY5NjE4","upper_bound":"MzY0MDQyMjE3","repeats":1},{"count":1168,"lower_bound":"MzY0NzA0Mzg3","upper_bound":"Mzg1NTIwMTM1","repeats":1},{"count":1176,"lower_bound":"Mzg2Njk4NTcw","upper_bound":"NDE3MTgwNTkx","repeats":1},{"count":1184,"lower_bound":"NDE5NjY0ODU4","upper_bound":"NDMwNjUwMTA4","repeats":1},{"count":1192,"lower_bound":"NDMxNzM2MTcx","upper_bound":"NDQzNTgxNDM0","repeats":1},{"count":1200,"lower_bound":"NDQ1OTU5MTE5","upper_bound":"NDU1NzMzNjgx","repeats":1},{"count":1208,"lower_bound":"NDU4MzExODg1","upper_bound":"NDc4NzI3NDg1","repeats":1},{"count":1216,"lower_bound":"NDgxMjE5NjE0","upper_bound":"NDk1OTQwNDI5","repeats":1},{"count":1224,"lower_bound":"NDk3NDM5MDg5","upper_bound":"NTA0MTgwMDIx","repeats":1},{"count":1232,"lower_bound":"NTExNjI2MjQw","upper_bound":"NTI1MjkzMjQw","repeats":1},{"count":1240,"lower_bound":"NTI1NDIxNTE0","upper_bound":"NTM2MDI2NzYz","repeats":1},{"count":1248,"lower_bound":"NTUxNDk0NjU5","upper_bound":"NTYzMDkyMDIy","repeats":1},{"count":1256,"lower_bound":"NTY3NDYyMTA1","upper_bound":"NTc4NTA4OTM1","repeats":1},{"count":1264,"lower_bound":"NTgxNzczNjIy","upper_bound":"NTk0MjY3OTA3","repeats":1},{"count":1272,"lower_bound":"NTk4MTY4OTU4","upper_bound":"NjEzMTAwMzUw","repeats":1},{"count":1280,"lower_bound":"NjE2OTk2NTQ1","upper_bound":"NjMxNTMyNjAx","repeats":1},{"count":1288,"lower_bound":"NjMzMTc5NjM2","upper_bound":"NjQxODEzODY3","repeats":1},{"count":1296,"lower_bound":"NjUwODU5NjA1","upper_bound":"NjU1NDk5Mzc2","repeats":1},{"count":1304,"lower_bound":"NjYwODg2MzM0","upper_bound":"Njc4MTc0MTA3","repeats":1},{"count":1312,"lower_bound":"NjgwMjg4MzU0","upper_bound":"Njg2MDQ1MDQ0","repeats":1},{"count":1320,"lower_bound":"NjkxNzg4NzU2","upper_bound":"Njk2NzUwOTky","repeats":1},{"count":1328,"lower_bound":"Njk5MTgzNTgw","upper_bound":"NzE1MjM4MDAy","repeats":1},{"count":1336,"lower_bound":"NzE3Mzg0MjY2","upper_bound":"NzIzNzQyNTA5","repeats":1},{"count":1344,"lower_bound":"NzI0Mzk1OTQz","upper_bound":"NzM4NDk2MjIw","repeats":1},{"count":1352,"lower_bound":"NzQwMDMwMzYy","upper_bound":"NzcxMzY1NTc3","repeats":1},{"count":1360,"lower_bound":"NzgwNjcxNjk3","upper_bound":"NzkxMTg4Mzg3","repeats":1},{"count":1368,"lower_bound":"Nzk1NTMxOTA3","upper_bound":"ODA5NjA3OTE5","repeats":1},{"count":1376,"lower_bound":"ODE0NTk5NjQ1","upper_bound":"ODE4MTYyNzE1","repeats":1},{"count":1384,"lower_bound":"ODE4NDk0MjUw","upper_bound":"ODIwODc0OTU4","repeats":1},{"count":1392,"lower_bound":"ODIyMjEwMjgz","upper_bound":"ODM0MTI2MTE0","repeats":1},{"count":1400,"lower_bound":"ODM0MjQwNDQ2","upper_bound":"ODQ4NDM2MTg0","repeats":1},{"count":1408,"lower_bound":"ODU2NDQwNDEw","upper_bound":"ODY2MTY4OTQx","repeats":1},{"count":1416,"lower_bound":"ODY3Mzg5Mzcx","upper_bound":"ODczNDIwMzEw","repeats":1},{"count":1424,"lower_bound":"ODc1MDI0ODA4","upper_bound":"ODg2NDMxMzg2","repeats":1},{"count":1432,"lower_bound":"ODk0MzEyNDA5","upper_bound":"OTA4MTI1Mjgy","repeats":1},{"count":1440,"lower_bound":"OTA5NzQ4NDkx","upper_bound":"OTI0NDUzNzY4","repeats":1},{"count":1448,"lower_bound":"OTI0NTc5NDk5","upper_bound":"OTM2NDQ1NzIz","repeats":1},{"count":1456,"lower_bound":"OTM5Mzk0MDM1","upper_bound":"OTUxMTAzMTc4","repeats":1},{"count":1464,"lower_bound":"OTU0Njk4MDIx","upper_bound":"OTYwNTc2OTA0","repeats":1},{"count":1472,"lower_bound":"OTYxNDA1OTQ2","upper_bound":"OTcwOTg5NzMy","repeats":1},{"count":1480,"lower_bound":"OTc2MDE0NDU0","upper_bound":"OTgyNzgxNjQ2","repeats":1},{"count":1488,"lower_bound":"OTk4ODQyMzUx","upper_bound":"MTAyMjIyODA3Ng==","repeats":1},{"count":1496,"lower_bound":"MTAzMTE2MTYxNQ==","upper_bound":"MTA0NTg0MzM2Ng==","repeats":1},{"count":1504,"lower_bound":"MTA1NDU2MzI4Mg==","upper_bound":"MTA2NjA3NjQ3NA==","repeats":1},{"count":1512,"lower_bound":"MTA2NzM4ODU5NQ==","upper_bound":"MTA5MDIzMTI3Mw==","repeats":1},{"count":1520,"lower_bound":"MTA5NDgyMTUxMA==","upper_bound":"MTEwMzc1Nzg1Ng==","repeats":1},{"count":1528,"lower_bound":"MTEwNDE0MzIyNQ==","upper_bound":"MTEyMzAxNDQxNg==","repeats":1},{"count":1536,"lower_bound":"MTEyNTQ4NjAyNQ==","upper_bound":"MTEzMDQ1NTYzNQ==","repeats":1},{"count":1544,"lower_bound":"MTEzMzk1NzIyNw==","upper_bound":"MTE2NjIwNjkzNQ==","repeats":1},{"count":1552,"lower_bound":"MTE3MTgzNjgwOQ==","upper_bound":"MTE4MDM1MzQ3Mw==","repeats":1},{"count":1560,"lower_bound":"MTE4Mzc0OTk5MA==","upper_bound":"MTE5NTg2MzQ5Mg==","repeats":1},{"count":1568,"lower_bound":"MTE5ODI2ODE2Nw==","upper_bound":"MTIxMjc2NjMzMg==","repeats":1},{"count":1576,"lower_bound":"MTIyNTkzMzY3NA==","upper_bound":"MTIzOTcyNDM4Mw==","repeats":1},{"count":1584,"lower_bound":"MTI0MzIzNTA5OA==","upper_bound":"MTI2MTI3NzgxNQ==","repeats":1},{"count":1592,"lower_bound":"MTI2MzQ1NDU5OQ==","upper_bound":"MTI3NjMzOTIzMg==","repeats":1},{"count":1600,"lower_bound":"MTI4ODUxNDA2OA==","upper_bound":"MTMwMTc1NDY5MA==","repeats":1},{"count":1608,"lower_bound":"MTMxMjE4MDQ1NQ==","upper_bound":"MTMyMzcxNjkyOQ==","repeats":1},{"count":1616,"lower_bound":"MTMyNTEyNzE1OQ==","upper_bound":"MTM0NTM4NTM2MA==","repeats":1},{"count":1624,"lower_bound":"MTM0NjUxMDQwNQ==","upper_bound":"MTM4NTUzNDY4NQ==","repeats":1},{"count":1632,"lower_bound":"MTM5NDE0ODQ5OA==","upper_bound":"MTM5OTAxODkxMg==","repeats":1},{"count":1640,"lower_bound":"MTQxMzc2NzQ1MQ==","upper_bound":"MTQzMDA3NTcyMQ==","repeats":1},{"count":1648,"lower_bound":"MTQzMjUyMzM4MA==","upper_bound":"MTQ1MDY4ODQzMg==","repeats":1},{"count":1656,"lower_bound":"MTQ1MjMyMTUzNQ==","upper_bound":"MTQ1NTU3OTA1Nw==","repeats":1},{"count":1664,"lower_bound":"MTQ2MjQzMTMxOQ==","upper_bound":"MTQ2NTAxMzk2Mg==","repeats":1},{"count":1672,"lower_bound":"MTQ2NTM1ODA5NA==","upper_bound":"MTQ4MTI4MDIzNg==","repeats":1},{"count":1680,"lower_bound":"MTQ4NTMzMzkyNw==","upper_bound":"MTQ4NjczMzU4NA==","repeats":1},{"count":1688,"lower_bound":"MTQ4NzcwNjUyOA==","upper_bound":"MTUwNDUzNDI2OA==","repeats":1},{"count":1696,"lower_bound":"MTUwNjI0OTA4OQ==","upper_bound":"MTUxODI1Mzg5Mw==","repeats":1},{"count":1704,"lower_bound":"MTUyMDM1NjM3NQ==","upper_bound":"MTUzMjI4MzU5MQ==","repeats":1},{"count":1712,"lower_bound":"MTUzNjY1NDIxNA==","upper_bound":"MTU1MTk5MzU0OQ==","repeats":1},{"count":1720,"lower_bound":"MTU1MzEzNjA2OQ==","upper_bound":"MTU1ODgxOTQ0Nw==","repeats":1},{"count":1728,"lower_bound":"MTU2Mjc0MzYxOQ==","upper_bound":"MTU4MTc2ODYzNA==","repeats":1},{"count":1736,"lower_bound":"MTU4Mzc2OTA2OA==","upper_bound":"MTYwMjA4MDU0MQ==","repeats":1},{"count":1744,"lower_bound":"MTYwMjc3NzYyNw==","upper_bound":"MTYxMjAyNTE3NQ==","repeats":1},{"count":1752,"lower_bound":"MTYxNTY3NzMyMg==","upper_bound":"MTYyODk2Nzg1NA==","repeats":1},{"count":1760,"lower_bound":"MTYzMTYzMTU2Ng==","upper_bound":"MTY0Njc4MDEzNA==","repeats":1},{"count":1768,"lower_bound":"MTY1MTE4NjgxMA==","upper_bound":"MTY1NTE1NzkwNQ==","repeats":1},{"count":1776,"lower_bound":"MTY1NzA5NTkzNQ==","upper_bound":"MTY2NjUyNTc5NQ==","repeats":1},{"count":1784,"lower_bound":"MTY3ODIwMDk5MQ==","upper_bound":"MTY4MzM1Nzc2Ng==","repeats":1},{"count":1792,"lower_bound":"MTY4NTkwNjA4MA==","upper_bound":"MTY4NjU4Nzg0OA==","repeats":1},{"count":1800,"lower_bound":"MTY4OTAxMTg2NA==","upper_bound":"MTcwMjAwODc5NA==","repeats":1},{"count":1808,"lower_bound":"MTcwNjg0MDM1MA==","upper_bound":"MTcxNjIxMTYzNQ==","repeats":1},{"count":1816,"lower_bound":"MTcyODI1NjM0Ng==","upper_bound":"MTczMzI1ODA3OQ==","repeats":1},{"count":1824,"lower_bound":"MTczNTY0ODM4MA==","upper_bound":"MTc0MTcwODg3OA==","repeats":1},{"count":1832,"lower_bound":"MTc0MzUxMDYzMA==","upper_bound":"MTc0NzQ1MjgwMg==","repeats":1},{"count":1840,"lower_bound":"MTc0NzcwNDIyMA==","upper_bound":"MTc1NDcyMzQxMw==","repeats":1},{"count":1848,"lower_bound":"MTc1NTA4OTM5NA==","upper_bound":"MTc3MDg1NzM1OQ==","repeats":1},{"count":1856,"lower_bound":"MTc3NDMyNjQzNw==","upper_bound":"MTc4NTcyNzYxOA==","repeats":1},{"count":1864,"lower_bound":"MTc4NzE4ODQ0Nw==","upper_bound":"MTc5MDk2NzU4MA==","repeats":1},{"count":1872,"lower_bound":"MTc5MjQ2OTAyMA==","upper_bound":"MTgxMTE4OTM3OA==","repeats":1},{"count":1880,"lower_bound":"MTgxNDAyNzYzMA==","upper_bound":"MTgxODMxNzE1Mg==","repeats":1},{"count":1888,"lower_bound":"MTgyMDYwNDgxMQ==","upper_bound":"MTgyNTkxNzEyOQ==","repeats":1},{"count":1896,"lower_bound":"MTgyNjE2NzkwMQ==","upper_bound":"MTgzNTI2MjExNQ==","repeats":1},{"count":1904,"lower_bound":"MTgzNzEwMzUyMg==","upper_bound":"MTg0NDIwOTQ3MA==","repeats":1},{"count":1912,"lower_bound":"MTg0NDgxNDAyOA==","upper_bound":"MTg2MjEwNzc4Mg==","repeats":1},{"count":1920,"lower_bound":"MTg3MzQyNjY2Mw==","upper_bound":"MTg4NzIwMzAwMg==","repeats":1},{"count":1928,"lower_bound":"MTg5MDUyNTMyOA==","upper_bound":"MTg5OTYzNDM4Mw==","repeats":1},{"count":1936,"lower_bound":"MTkwMDkxNjYzMw==","upper_bound":"MTk0NDQ1NTQwMQ==","repeats":1},{"count":1944,"lower_bound":"MTk2MjY5NTg5MA==","upper_bound":"MTk2ODM3MjkyOQ==","repeats":1},{"count":1952,"lower_bound":"MTk3NDIyNDczNQ==","upper_bound":"MTk4NzM4ODQ3MA==","repeats":1},{"count":1960,"lower_bound":"MTk5MTcxMzk0Ng==","upper_bound":"MjAwMDQ1MjAyMA==","repeats":1},{"count":1968,"lower_bound":"MjAwMDcyNTU1NA==","upper_bound":"MjAzOTI2Njg1Mw==","repeats":1},{"count":1976,"lower_bound":"MjA0OTA5NzE3Mg==","upper_bound":"MjA1NjcyMDc2OQ==","repeats":1},{"count":1984,"lower_bound":"MjA2NTg0OTMwNw==","upper_bound":"MjA3NTk2OTEzMA==","repeats":1},{"count":1992,"lower_bound":"MjA4NTQ2MDYyNA==","upper_bound":"MjA5OTAzODcyNQ==","repeats":1},{"count":2000,"lower_bound":"MjEwNDkyNjIyMg==","upper_bound":"MjE0MjM2Njk3OA==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[1,0,0,0,1,1,1,1,2,2,0,0,1,1,2,1,1,0,1,0,1,1,1,0,0,1,0,2,1,0,0,0,6,4,1,1,0,1,1,0,1,2,3,1,0,1,0,0,0,1,1,0,4,0,0,2,2,1,0,1,0,1,2,0,2,0,1,0,1,0,1,2,1,0,0,0,4,1,0,0,0,1,0,0,2,1,1,0,1,0,1,0,1,1,3,2,0,0,0,1,0,0,2,0,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,2,3,0,3,0,2,0,1,0,4,1,2,1,2,1,0,0,1,0,3,1,1,1,0,1,0,0,1,1,1,0,1,3,1,3,1,0,0,2,1,2,1,1,1,3,2,2,0,2,0,2,1,0,2,1,0,0,0,1,0,1,1,0,2,0,0,2,1,1,5,2,1,2,0,0,0,1,0,0,1,1,1,0,2,1,1,0,1,1,0,1,1,2,0,2,1,4,1,1,2,1,0,1,1,0,2,2,0,0,1,0,1,1,0,1,2,0,0,2,0,4,0,0,1,0,1,1,1,2,1,0,1,4,2,2,0,0,0,1,1,0,0,2,2,0,1,0,2,1,1,2,1,1,0,2,0,0,0,3,0,0,1,0,1,4,0,1,1,2,2,0,1,0,1,1,0,0,1,2,2,3,4,0,1,1,2,0,1,1,3,1,0,0,2,0,2,0,2,0,3,2,2,1,0,2,0,0,0,3,0,1,0,0,1,2,0,2,1,2,2,0,1,0,0,2,1,1,0,2,1,1,1,2,0,2,3,1,0,1,0,1,1,0,0,0,0,0,2,2,0,1,0,1,1,0,1,0,0,2,2,0,2,2,0,0,0,3,1,1,0,3,1,2,1,1,0,1,4,2,0,0,1,1,0,2,4,0,0,1,0,1,1,0,0,2,0,3,2,0,1,0,1,1,3,0,0,1,0,1,2,0,1,0,0,3,2,1,0,0,2,0,0,1,1,2,0,0,1,2,1,0,1,3,1,0,0,0,1,0,1,0,1,0,0,0,1,0,0,1,4,0,1,2,1,0,1,0,0,1,0,4,2,1,1,1,1,0,1,1,1,1,0,0,0,0,0,1,1,3,0,3,1,0,2,0,1,0,1,2,1,1,1,2,0,0,0,1,0,0,0,2,1,3,0,0,1,1,2,1,0,0,0,0,1,1,2,0,2,1,0,0,2,1,1,1,1,1,0,1,0,1,0,1,2,3,1,1,0,0,0,2,2,0,2,1,1,2,1,1,3,1,0,2,0,3,2,1,1,1,1,0,1,1,2,0,1,2,1,2,2,0,1,1,0,0,4,0,2,2,0,2,2,2,2,0,0,1,2,0,1,0,0,1,1,0,3,0,1,0,1,0,0,0,0,0,2,1,1,0,0,0,0,1,1,0,1,1,1,0,2,1,0,1,2,1,4,1,2,2,1,0,1,1,1,1,1,1,0,3,1,0,0,0,1,0,2,1,2,0,2,0,1,1,2,1,3,0,0,0,4,2,1,2,0,2,1,0,1,0,0,0,0,1,1,1,0,2,3,1,1,2,0,1,1,1,0,1,1,0,0,2,0,1,0,1,2,1,2,1,1,3,1,1,2,2,0,2,3,3,1,3,1,1,1,1,0,1,1,1,1,1,1,0,0,1,2,0,0,1,0,0,0,1,1,1,2,1,0,1,2,1,1,0,0,1,1,2,2,5,0,1,0,1,1,1,0,1,0,1,0,1,1,1,3,1,1,0,1,0,0,0,2,1,2,2,2,1,1,0,2,1,0,3,1,2,0,1,4,0,1,3,1,1,1,2,0,0,3,0,1,0,1,0,1,2,1,0,1,0,3,1,2,0,2,3,3,0,0,4,1,1,1,2,3,3,1,3,0,1,2,1,3,0,2,0,4,2,0,0,0,1,1,1,0,1,1,0,0,0,0,0,1,0,3,1,0,2,0,1,3,0,0,0,1,2,3,1,1,0,1,0,0,1,1,0,1,3,1,0,1,1,1,2,0,2,1,1,2,1,1,0,1,0,0,0,0,1,1,1,1,0,2,1,2,1,1,0,1,0,2,3,2,0,2,0,1,2,1,0,1,1,1,2,0,0,0,1,0,1,2,1,1,1,3,0,1,2,1,0,1,0,1,0,0,0,0,2,1,1,1,1,0,3,3,3,0,3,1,0,3,0,0,2,1,2,3,3,3,1,1,0,1,0,0,0,1,1,2,2,1,1,2,0,1,0,1,4,3,0,1,0,1,1,0,2,1,0,0,0,1,0,0,0,0,2,0,1,0,0,1,1,0,2,2,0,1,1,1,1,1,3,0,2,1,2,1,4,1,2,0,1,2,0,1,1,1,0,0,0,2,1,0,2,0,1,0,3,0,2,0,2,0,3,1,0,0,1,0,0,0,0,0,1,1,1,2,1,0,2,1,1,0,2,0,1,1,0,0,1,0,2,1,1,1,2,0,6,3,0,0,0,1,0,1,0,2,0,1,0,2,2,2,1,3,0,1,3,2,0,0,1,2,2,0,0,0,3,1,0,2,1,0,1,1,2,1,0,0,2,1,0,1,0,1,0,1,0,0,0,1,2,0,0,1,0,1,1,2,1,0,0,1,0,2,1,1,2,1,1,0,0,0,2,2,2,2,0,0,2,1,1,1,0,2,1,2,2,1,1,0,1,2,0,0,1,3,0,1,2,0,0,0,0,0,1,1,1,3,1,1,2,1,0,2,1,2,0,0,0,1,1,2,4,1,1,2,0,0,1,2,1,1,1,2,1,1,1,1,0,1,0,1,1,3,1,2,2,1,1,0,0,1,1,0,1,1,2,0,1,1,0,2,4,3,2,2,0,2,2,1,0,1,2,2,3,1,0,2,0,1,0,2,2,0,0,0,2,3,0,0,1,0,1,1,1,1,0,1,1,1,2,2,3,1,2,1,1,0,2,0,1,1,1,0,1,1,1,0,1,0,2,1,0,2,1,1,2,1,1,1,1,1,1,1,0,2,2,1,0,1,3,0,0,1,0,1,2,0,1,2,0,2,1,1,1,2,0,1,2,0,0,0,1,1,2,2,2,2,0,0,0,0,1,3,0,0,1,1,0,1,0,0,3,0,0,1,0,0,0,2,0,0,0,1,1,1,1,1,0,1,1,0,1,0,0,2,0,1,3,1,0,3,0,2,1,0,1,0,0,0,2,1,3,1,1,1,1,1,0,2,2,0,0,0,2,3,0,1,1,1,1,1,2,0,0,1,0,0,0,2,2,1,3,1,1,1,1,1,2,1,1,1,1,1,0,2,0,0,0,0,2,1,3,1,0,1,2,0,1,3,0,0,2,2,0,2,1,0,2,2,1,1,0,1,2,2,1,1,0,0,0,0,2,1,1,1,3,1,1,1,0,1,1,1,0,1,1,0,1,0,1,0,1,0,1,1,1,0,1,2,0,3,0,1,0,1,0,2,0,0,1,1,3,2,2,2,1,0,3,0,1,1,0,1,0,1,0,0,2,1,0,1,2,1,0,0,0,0,0,0,4,0,0,0,0,2,3,1,2,1,0,0,2,1,3,1,0,1,3,0,1,1,2,0,2,0,1,1,1,1,1,0,3,0,0,6,1,2,0,1,0,1,0,1,0,0,0,1,3,1,1,0,0,0,1,0,0,0,0,1,1,3,2,0,1,3,2,1,1,3,3,1,1,1,1,1,0,0,1,0,0,4,0,0,1,3,1,2,0,2,0,1,1,2,1,1,0,1,0,2,0,1,1,2,0,0,1,1,0,0,1,1,3,0,1,2,1,1,3,1,1,0,2,0,2,0,3,0,1,2,4,0,1,0,1,1,3,0,2,0,0,2,1,0,0,0,1,0,2,2,1,0,0,2,1,2,2,2,3,0,2,0,0,1,0,0,1,0,0,1,1,2,1,0,2,0,1,0,3,0,3,2,1,1,1,0,0,0,2,0,0,2,2,0,2,1,1,0,3,0,1,1,2,1,1,2,3,1,1,1,0,1,2,1,0,0,0,1,0,0,1,1,0,0,1,1,0,2,3,0,0,2,1,2,0,2,0,0,0,0,0,0,2,2,2,1,2,0,0,2,0,0,1,2,1,0,0,0,0,3,1,1,0,1,0,0,0,0,2,1,2,2,1,1,0,0,1,1,1,0,1,2,1,2,2,0,1,1,1,1,0,2,1,0,2,2,1,1,0,0,2,1,2,0,0,3,1,1,0,1,0,2,0,2,1,2,0,0,1,1,1,1,0,0,1,0,0,1,0,2,0,0,1,1,1,1,2,2,0,0,0,2,1,0,2,1,1,3,1,0,0,1,0,1,0,2,3,0,0,0,0,1,3,2,2,1,1,2,1,1,0,0,0,0,0,1,0,2,1,0,3,1,2,1,4,0,2,0,1,2,1,2,1,0,0,2,2,0,2,0,1,2,1,0,1,1,1,2,0,1,1,1,1,1,3,0,2,0,1,2,1,1,1,0,2,1,1,0,1,3,2,0,0,1,0,1,1,3,0,0,2,1,2,0,0,1,2,0,2,0,2,2,0,3,2,0,2,1,1,1,2,1,0]},{"counters":[0,1,4,0,2,0,2,1,3,0,1,1,1,0,3,0,2,3,0,2,2,1,0,1,2,0,1,4,4,0,2,1,3,2,0,2,0,0,0,1,1,1,0,0,3,2,2,1,1,0,2,0,2,1,0,1,0,0,0,1,1,2,2,1,0,1,1,1,0,0,0,0,1,1,1,2,1,2,2,1,1,0,0,2,1,2,0,0,4,0,1,2,1,0,2,4,3,1,2,0,0,1,0,4,0,0,1,0,0,0,1,1,0,0,0,1,0,0,2,0,0,0,0,2,1,1,0,2,1,1,1,2,0,2,2,0,0,0,3,1,0,0,0,1,1,3,1,1,1,2,3,0,1,1,0,2,1,2,1,1,2,0,2,0,0,3,1,0,1,0,1,0,2,0,1,2,1,0,1,0,2,1,0,1,2,1,2,1,0,2,0,3,3,0,0,0,1,1,1,3,3,3,0,2,1,0,1,1,2,1,2,0,1,0,0,3,0,2,0,1,1,0,0,2,1,4,5,1,2,1,1,1,1,2,0,1,1,1,0,1,1,1,1,0,0,0,2,1,0,1,1,1,0,2,1,2,0,5,1,2,0,0,0,0,3,2,2,2,0,0,0,0,1,1,2,0,1,0,0,0,0,2,2,1,3,0,1,0,0,0,1,3,0,0,0,0,0,0,2,1,2,1,2,1,0,0,1,1,0,1,2,1,0,0,0,2,1,1,0,0,0,2,1,0,1,0,1,2,2,0,1,0,3,0,1,2,1,3,0,1,2,0,0,3,3,1,3,0,2,1,0,0,1,2,0,1,0,0,3,2,1,2,0,0,1,1,0,1,0,1,1,1,0,0,2,1,0,0,1,0,0,3,2,0,1,1,0,1,1,3,0,4,0,1,1,1,4,2,1,1,0,1,1,1,1,2,0,2,0,0,1,0,1,1,1,1,1,2,0,0,3,0,2,2,2,1,2,1,2,2,2,0,0,2,0,0,1,0,2,2,0,0,1,1,1,0,1,1,2,1,1,3,0,1,1,2,0,1,0,0,1,1,0,0,0,0,1,2,0,1,1,2,0,1,1,1,0,2,3,2,2,2,1,0,1,0,1,0,0,0,1,1,2,0,4,0,3,1,0,0,1,1,0,0,1,1,0,0,0,0,0,2,0,1,0,3,0,0,2,3,4,0,1,2,0,0,1,2,0,0,0,1,3,1,1,0,2,0,0,0,0,3,1,2,3,1,0,2,1,1,0,0,3,1,0,1,0,0,0,0,2,1,0,1,1,0,1,1,1,1,2,2,2,0,1,1,1,0,0,1,4,4,2,0,3,0,0,0,0,2,0,0,1,0,0,1,1,0,0,1,1,0,1,2,3,0,2,3,0,0,3,1,0,1,2,1,0,5,2,1,2,0,3,1,2,0,2,5,1,0,0,0,0,0,0,0,0,2,0,1,2,1,0,2,0,1,0,1,1,1,0,0,1,0,0,1,2,1,1,0,0,1,2,1,1,0,0,1,0,1,0,0,0,0,1,0,0,1,0,1,1,0,1,0,0,0,2,1,0,1,0,1,1,0,0,1,0,1,2,2,2,0,0,0,2,4,0,0,4,3,6,2,0,1,1,0,2,2,2,1,2,0,2,0,2,0,1,0,1,0,0,0,2,5,2,1,1,0,0,1,1,0,1,2,1,0,2,2,1,0,2,1,1,0,3,1,0,2,0,3,3,1,0,1,1,0,0,1,1,2,1,1,3,0,0,4,1,1,2,2,2,2,0,1,2,0,0,1,1,1,1,1,0,2,1,0,1,2,3,0,1,0,1,1,2,1,0,1,0,0,0,1,0,1,1,0,1,3,1,2,0,1,3,1,0,1,1,0,0,1,1,3,0,0,0,0,2,1,0,0,0,4,1,1,1,0,3,0,2,1,0,1,2,3,1,1,1,0,0,2,2,1,1,0,0,2,2,1,1,1,1,0,1,0,1,2,1,1,0,2,1,0,0,1,0,0,0,0,2,3,0,1,1,1,2,0,0,0,2,1,0,0,2,1,0,0,0,1,0,2,1,1,1,2,1,2,0,0,3,1,1,1,1,0,1,0,0,0,0,1,1,1,0,1,1,0,0,0,2,0,0,1,0,0,0,1,1,2,1,2,4,0,2,0,1,0,1,2,3,1,1,0,1,0,1,2,2,2,0,0,1,0,0,2,0,0,2,2,1,1,3,2,0,2,0,1,1,1,1,3,4,0,1,3,0,2,3,0,3,0,1,1,0,0,0,0,0,1,0,1,3,0,2,1,1,1,1,2,0,0,1,0,0,1,0,1,0,1,0,1,2,0,1,2,2,2,1,0,2,1,1,2,2,0,0,2,1,0,1,1,3,0,2,2,0,1,2,4,4,3,1,0,0,1,3,2,2,0,1,1,2,0,2,0,0,1,0,3,1,1,2,1,0,2,0,2,2,3,1,1,3,2,0,1,0,1,1,1,1,0,0,0,0,2,1,2,1,0,2,3,2,0,1,1,2,1,0,0,0,1,0,1,0,2,2,2,1,1,5,0,0,0,1,1,2,2,1,0,4,0,1,0,0,1,3,1,2,1,1,0,0,3,0,1,0,1,0,1,2,0,5,1,3,1,0,2,2,0,0,0,1,0,2,1,3,3,3,2,1,3,1,1,2,1,1,1,0,0,1,1,0,0,0,1,0,0,1,1,1,1,1,1,1,2,1,0,2,1,2,3,1,3,1,2,3,1,1,1,3,0,0,1,1,1,0,0,0,1,0,0,1,0,2,0,1,1,2,1,1,1,0,1,0,1,1,1,2,0,0,0,1,0,0,1,2,1,1,3,2,2,0,0,2,1,1,0,1,1,1,2,0,1,2,2,2,1,0,0,1,1,1,2,0,1,1,2,1,0,2,2,1,2,3,0,1,0,2,1,3,0,2,1,0,0,1,1,2,2,1,0,1,0,0,0,0,1,2,2,1,1,3,0,1,0,0,0,3,2,1,0,1,0,1,1,1,3,1,1,1,1,1,1,2,3,0,1,1,0,1,1,1,1,0,1,0,2,2,0,1,1,0,0,1,0,0,0,0,0,0,0,3,0,1,0,1,3,1,0,0,1,0,3,1,0,1,1,0,1,3,1,1,1,1,0,1,1,0,0,0,0,0,1,2,0,0,1,0,3,0,0,1,0,0,0,1,2,0,0,0,1,2,2,0,1,0,0,0,1,1,0,2,2,1,0,3,1,2,2,3,1,2,0,1,2,1,1,1,0,3,0,1,1,1,2,0,0,2,1,1,0,2,2,0,1,1,0,3,1,2,0,1,1,0,0,1,0,0,1,1,0,0,0,0,0,0,1,1,2,1,3,0,1,1,1,2,3,1,0,1,1,0,2,3,2,1,1,2,1,0,2,2,0,0,0,0,2,2,1,1,0,1,0,2,1,0,0,1,2,1,0,3,1,3,0,1,1,0,0,0,2,0,0,3,1,0,0,0,1,1,1,2,0,2,0,0,4,0,2,0,2,1,1,0,1,0,0,0,2,0,0,0,1,1,0,1,3,4,0,2,0,0,1,2,0,2,0,1,0,0,3,3,1,1,3,0,0,1,0,4,1,0,2,1,0,1,0,2,0,1,1,1,0,3,0,0,0,1,1,1,3,1,2,0,0,2,2,2,1,2,0,0,3,1,0,1,1,1,2,3,0,0,1,0,2,0,0,2,1,0,0,0,3,1,1,0,1,1,0,0,0,1,1,0,2,0,0,1,2,1,0,1,1,1,1,1,0,1,0,0,3,1,0,2,3,0,0,0,2,0,0,0,0,1,2,0,1,2,4,2,0,0,1,2,0,1,3,1,1,0,1,1,2,1,0,0,0,2,2,0,0,2,0,0,0,2,0,0,1,0,1,0,1,1,1,1,5,2,1,0,0,0,0,1,0,0,2,1,0,1,3,2,0,1,2,3,0,3,2,1,0,1,0,1,0,2,1,1,2,0,1,0,2,0,0,0,0,1,0,0,1,0,0,2,1,0,0,1,0,0,1,1,2,2,0,1,1,0,0,0,0,0,3,0,0,1,1,0,1,1,0,1,2,2,0,0,0,2,0,2,0,1,2,0,1,0,1,1,4,3,1,0,4,2,0,1,0,2,0,1,0,0,0,1,3,1,2,2,0,1,1,1,1,1,1,4,0,1,1,1,2,1,2,1,2,0,1,1,0,0,2,1,2,3,1,1,0,0,2,1,0,2,0,1,2,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,1,0,2,1,0,3,0,2,0,0,3,0,0,0,3,2,0,0,1,2,0,0,2,0,1,1,2,0,1,2,0,1,0,0,0,1,1,0,2,1,0,1,0,2,1,0,0,0,2,0,1,1,0,0,0,0,1,0,1,1,2,3,1,0,0,0,0,3,0,0,1,1,3,1,3,2,0,1,0,1,0,2,2,0,0,0,2,0,0,1,2,2,1,1,0,0,0,0,1,1,1,1,0,1,1,1,1,0,0,1,2,0,0,2,1,0,2,4,3,2,0,0,4,1,0,0,0,1,3,0,1,2,0,1,0,1,0,0,1,1,1,0,0,5,0,1,0,0,0]},{"counters":[0,0,1,0,0,2,1,2,3,1,0,0,1,0,0,1,1,2,0,0,2,2,0,1,1,3,1,0,0,1,4,2,1,1,1,0,0,0,2,1,0,0,1,0,0,0,1,0,0,0,0,1,1,1,1,2,2,0,1,3,0,2,0,0,0,1,2,3,0,0,1,0,2,1,1,2,0,1,1,0,0,0,0,2,0,3,2,2,0,0,0,0,2,1,0,1,1,1,1,2,1,3,0,0,0,3,0,0,2,0,2,0,0,0,1,1,3,3,0,1,0,0,1,2,3,0,1,1,0,1,2,2,1,3,2,2,1,2,1,0,2,1,1,1,0,1,1,0,0,0,0,0,0,1,0,0,2,1,2,1,0,0,2,0,1,1,1,1,1,0,0,0,0,0,2,0,0,0,0,1,2,1,2,0,1,0,1,1,0,1,0,1,0,0,0,0,2,0,2,1,0,0,5,3,1,1,0,1,1,1,0,1,1,0,3,2,3,1,0,1,1,2,1,2,0,2,2,2,3,3,0,1,1,0,1,0,1,2,0,0,0,1,1,0,2,0,1,2,0,0,1,1,0,1,1,1,0,2,2,1,0,2,0,1,0,1,4,0,1,1,0,0,1,1,1,3,3,1,1,2,1,1,0,2,3,1,1,1,3,2,3,1,0,2,2,1,2,1,0,1,1,0,1,1,1,1,3,1,1,1,1,0,1,2,0,0,0,1,2,0,2,0,1,2,0,0,0,3,1,1,2,1,0,2,2,0,1,0,1,1,1,1,1,2,1,1,1,1,1,0,2,1,1,2,2,0,0,0,2,3,0,1,2,1,3,1,2,1,2,2,0,1,1,0,0,1,1,1,0,2,1,1,0,0,0,0,0,0,1,0,0,1,2,1,0,0,1,2,1,3,0,1,0,1,1,4,1,1,1,1,1,1,2,1,1,1,0,0,0,1,0,0,0,1,1,0,2,1,2,1,0,1,0,1,0,2,1,0,2,0,2,0,4,2,1,1,1,0,2,0,3,0,1,2,0,0,0,4,1,4,0,0,1,0,1,5,2,0,0,0,0,0,0,2,0,0,2,1,2,0,1,2,0,0,1,2,1,2,0,0,0,0,1,0,1,0,1,1,0,0,1,0,2,1,2,1,1,3,1,1,0,0,2,0,1,0,1,1,3,0,0,2,2,1,1,1,1,2,1,1,1,1,1,1,1,2,0,1,0,1,1,1,0,2,2,1,2,0,0,1,3,1,1,1,0,1,1,1,0,1,1,0,0,1,1,0,1,1,2,1,1,2,2,1,1,0,0,0,0,0,0,0,1,1,0,2,2,1,1,2,3,1,1,2,1,1,1,0,2,2,1,1,0,2,3,3,1,0,0,1,2,1,0,2,1,1,0,0,0,0,0,0,2,1,0,2,0,2,1,0,0,0,2,1,1,1,1,2,2,0,0,1,4,0,1,0,0,0,0,1,0,2,1,0,4,1,0,1,1,2,1,2,0,0,1,1,1,0,1,0,0,1,1,0,0,2,1,2,1,0,2,1,2,4,1,0,1,1,2,0,1,0,1,3,1,0,1,0,2,0,0,1,0,1,1,2,3,2,0,2,2,1,1,1,3,0,0,0,1,0,1,0,1,2,0,2,5,0,1,3,2,2,0,1,1,2,1,0,1,1,0,1,0,4,2,0,1,1,1,2,0,1,0,1,2,0,1,0,1,2,0,3,1,0,1,1,2,1,2,2,0,0,0,0,3,1,0,2,1,1,1,1,2,0,0,4,1,0,0,0,3,0,0,3,1,1,1,1,2,4,1,0,1,1,2,0,2,4,2,2,0,0,0,2,1,0,2,0,4,0,0,1,2,1,3,0,2,2,1,1,1,1,0,2,1,1,1,2,1,0,0,1,0,1,0,0,0,3,2,2,0,0,1,1,1,1,0,0,0,0,0,0,0,0,1,0,1,2,1,1,1,2,0,1,0,2,2,2,3,2,1,1,1,1,1,0,1,0,2,2,3,3,0,1,1,1,0,3,1,0,0,0,0,1,1,4,2,1,1,1,2,2,0,1,2,0,1,1,1,0,2,0,1,2,3,0,0,0,1,2,0,0,2,0,4,0,1,1,1,1,0,1,2,1,1,0,3,1,2,1,0,1,3,0,0,2,0,0,0,0,1,1,0,0,0,2,1,3,2,1,1,1,0,0,0,1,0,0,1,2,3,2,1,2,2,2,2,0,0,0,0,1,0,0,5,2,0,1,2,3,1,2,1,3,2,2,2,1,0,3,1,2,1,1,2,0,1,1,1,1,1,1,1,1,1,3,1,1,2,1,1,1,0,1,2,0,0,0,4,0,1,1,1,0,1,0,2,4,1,2,0,3,1,0,0,1,0,0,0,2,0,0,0,0,1,1,2,2,0,1,4,1,1,2,2,1,1,1,0,1,0,3,2,1,1,0,1,1,3,3,3,0,0,4,0,0,3,1,1,0,0,1,0,1,1,0,1,1,2,3,0,0,0,1,0,0,2,0,1,0,2,2,1,0,3,0,0,2,0,0,1,1,0,0,0,0,1,0,1,0,3,1,1,1,1,1,2,1,2,2,1,1,0,0,1,0,0,0,0,2,0,0,2,3,1,1,1,1,2,1,0,1,0,3,1,2,3,1,0,1,0,3,1,2,0,0,2,2,0,3,1,2,0,1,1,2,1,1,0,1,1,0,0,0,0,2,1,2,1,1,0,2,0,0,1,1,2,2,1,0,0,1,0,2,1,1,1,1,0,0,1,2,1,1,1,1,2,0,1,1,1,0,1,1,0,2,2,2,1,2,2,0,0,1,1,0,2,2,1,1,3,1,1,3,2,2,0,0,0,2,1,1,2,0,1,1,3,2,1,1,2,0,1,0,0,2,1,2,3,2,2,1,3,1,1,0,0,0,3,1,1,0,0,2,0,1,1,1,1,3,1,0,0,0,0,1,0,1,0,0,1,2,0,1,2,3,2,2,3,0,3,0,1,2,1,1,1,0,0,0,1,2,1,0,1,1,0,0,0,1,0,1,0,0,2,0,0,1,1,2,2,1,1,3,2,1,3,1,3,1,1,3,2,1,1,3,0,1,0,1,1,1,1,2,1,1,2,1,1,0,2,0,1,2,5,1,0,1,1,1,1,1,0,0,1,1,2,2,2,1,1,1,2,0,1,1,1,1,0,0,1,2,1,0,2,2,2,3,0,0,3,0,1,1,2,2,2,0,0,0,0,0,0,0,0,0,2,0,2,0,1,1,1,0,1,1,3,0,0,1,3,3,1,2,1,0,2,2,1,0,1,2,1,1,0,1,1,1,0,2,0,3,1,1,0,1,1,0,0,0,2,1,1,0,1,0,0,3,1,0,1,0,0,1,0,1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,0,2,2,1,0,2,1,0,2,1,2,1,1,2,1,1,1,1,1,0,0,1,0,1,0,0,1,1,1,1,1,1,2,0,1,0,1,1,1,2,0,1,2,0,0,1,0,1,1,1,1,4,2,0,0,0,2,0,3,2,0,1,3,2,1,1,0,0,0,1,3,1,1,1,1,0,0,1,1,1,1,0,1,3,2,0,0,1,3,0,0,1,2,0,2,0,0,0,0,0,1,2,0,0,0,1,1,0,2,1,0,1,2,1,1,1,2,1,0,0,2,0,0,1,2,1,1,1,3,2,4,0,0,1,1,1,2,1,0,2,0,1,0,1,0,0,0,1,0,1,1,1,1,0,2,0,1,2,1,0,1,1,1,0,1,0,1,0,0,0,0,0,4,1,3,1,2,0,0,0,1,2,4,1,1,1,2,2,0,0,1,0,0,1,2,1,0,0,1,0,2,0,0,1,0,1,2,2,0,1,0,0,2,0,0,0,1,1,0,4,0,0,0,2,1,0,1,1,2,1,0,0,1,1,2,1,1,0,2,1,1,1,0,2,0,2,1,0,1,0,2,0,4,1,1,0,0,2,0,1,2,0,1,0,0,1,0,3,0,1,1,1,0,1,2,1,1,1,1,2,3,0,1,2,0,0,1,2,0,0,0,0,1,0,0,1,1,0,0,2,1,1,0,3,3,0,0,0,1,1,2,0,1,1,0,0,0,0,1,1,0,1,0,3,3,0,1,1,0,1,2,0,0,2,0,1,1,0,3,2,1,2,2,1,0,2,1,0,1,0,1,0,0,3,0,1,2,2,1,1,2,3,1,1,0,2,1,0,1,1,0,1,0,0,0,0,1,3,1,0,0,2,2,2,0,0,1,1,1,2,1,2,0,1,0,1,1,0,0,0,1,0,2,1,0,1,1,1,0,2,1,1,0,1,1,0,1,2,0,1,1,2,0,2,1,1,0,2,3,1,1,1,0,0,2,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,3,0,0,0,0,4,1,4,4,4,3,1,1,1,0,1,1,0,0,1,1,1,1,0,0,0,2,0,0,1,2,0,1,0,0,0,0,1,0,0,1,0,1,3,1,1,0,0,0,1,1,2,1,0,0,0,1,0,2,1,0,1,2,2,1,1,0,0,1,0,0,1,0,1,1]},{"counters":[0,1,0,0,3,1,1,0,0,1,1,2,1,0,1,2,1,1,1,1,2,1,1,1,1,3,1,0,2,0,0,2,1,3,1,2,0,0,1,2,1,0,0,3,3,1,2,3,1,1,0,2,0,1,0,1,1,1,1,0,2,3,1,1,1,0,1,0,1,1,2,0,0,2,0,0,0,1,1,2,3,0,0,0,1,0,1,0,0,3,2,0,1,2,3,2,1,2,1,0,1,0,1,0,1,1,1,0,1,1,0,2,1,0,3,1,1,2,1,2,0,2,0,0,0,1,1,1,1,1,0,1,1,1,3,1,2,1,2,4,3,1,3,1,1,1,1,0,1,1,1,2,3,2,2,0,0,1,2,0,0,0,0,1,1,4,1,2,0,0,1,0,0,2,0,0,2,1,0,3,2,1,2,0,1,0,1,1,2,0,1,2,1,1,2,2,2,1,2,2,1,1,0,1,1,1,0,1,1,1,0,2,1,1,1,0,2,0,2,3,2,1,2,0,1,0,1,4,1,0,0,2,1,0,0,0,0,4,1,1,0,1,1,2,1,3,3,3,0,1,0,1,1,1,0,1,0,1,0,0,1,2,2,1,1,2,0,1,1,0,0,1,1,0,2,1,1,0,0,1,2,1,0,2,2,2,1,1,1,3,1,3,0,2,1,1,4,2,0,0,0,1,1,2,1,0,0,1,0,1,0,2,1,2,0,1,0,1,1,0,3,0,0,3,1,2,0,1,2,0,0,1,1,0,1,3,1,0,2,0,2,2,2,0,1,0,0,2,1,1,0,2,1,0,2,3,3,0,0,0,1,0,3,0,0,0,1,0,0,1,2,0,0,2,0,0,1,2,2,2,2,0,1,1,0,1,4,0,1,3,1,0,0,1,1,0,2,2,2,1,1,1,0,3,2,0,0,2,1,1,0,2,0,1,0,3,0,0,1,1,0,1,1,2,1,1,0,0,0,1,0,0,1,1,1,2,1,1,0,1,0,2,1,1,1,1,1,0,0,0,0,1,0,2,0,1,2,1,1,1,0,3,2,3,4,1,1,0,1,1,0,1,0,1,2,0,0,2,1,0,1,1,2,1,1,0,2,0,0,0,1,2,1,0,0,1,3,1,0,0,1,0,1,0,0,1,2,2,3,0,1,1,1,1,2,2,2,1,0,0,1,2,2,1,2,0,2,0,3,1,2,1,3,1,0,4,1,1,1,0,1,2,2,1,1,1,1,4,2,0,1,1,1,1,1,1,0,2,2,0,0,0,0,1,1,0,0,1,0,1,0,1,1,1,0,0,1,1,0,0,0,1,1,3,1,2,3,0,0,0,0,0,1,0,0,2,0,0,0,0,1,2,1,1,0,1,1,0,0,0,1,2,1,1,1,0,0,1,2,1,2,2,0,2,1,2,1,3,1,0,0,0,0,2,0,1,0,0,2,1,1,4,3,0,0,2,0,0,1,0,2,1,1,0,1,1,1,1,0,0,0,1,2,1,0,1,1,1,2,2,1,3,1,0,2,0,0,0,0,0,0,1,2,2,2,1,0,2,0,1,1,0,1,3,2,0,2,3,4,2,0,1,0,0,0,2,1,1,2,1,3,0,1,0,1,1,3,0,1,3,1,1,0,1,1,0,0,1,3,1,1,0,1,3,0,1,2,1,1,1,2,3,3,2,1,2,1,1,1,1,2,2,0,0,0,1,1,0,0,2,1,2,0,0,1,0,2,1,1,1,2,2,2,0,0,0,1,1,0,2,0,2,1,1,2,0,0,1,1,2,1,1,0,1,1,2,0,1,0,1,0,0,0,2,1,0,1,2,1,0,0,1,0,0,0,0,3,0,1,0,3,1,0,0,1,2,1,2,2,0,1,2,1,3,0,3,0,1,1,0,1,1,1,1,3,1,2,1,0,0,0,2,0,0,0,0,2,2,2,3,1,1,1,1,1,1,3,1,0,0,0,2,2,1,1,1,0,0,0,0,1,2,2,1,0,1,2,1,1,1,2,1,2,0,0,0,1,0,3,0,1,1,2,1,0,0,2,1,1,1,3,1,0,0,0,1,0,0,2,0,1,0,3,0,0,0,1,1,1,1,2,0,1,0,0,1,1,3,1,0,0,1,0,1,2,0,3,1,0,0,2,1,1,0,1,3,0,0,3,1,0,1,3,2,0,1,1,2,0,0,1,2,1,0,1,0,1,3,1,1,2,1,1,0,1,1,0,2,0,2,0,1,1,0,1,1,2,2,0,1,0,1,0,0,0,0,0,3,0,0,0,1,0,2,0,0,0,2,1,0,0,0,0,0,0,0,2,0,1,2,4,0,1,0,1,0,0,1,2,2,3,0,1,0,1,1,0,5,1,0,1,2,0,1,1,2,4,0,0,1,2,1,0,1,0,0,0,1,1,0,1,1,1,0,0,2,2,0,0,0,2,0,2,0,0,0,0,1,1,1,3,2,0,0,1,1,0,0,2,0,0,2,3,1,2,1,0,0,0,1,1,2,6,0,2,1,2,0,0,1,0,0,1,2,3,0,1,2,1,1,1,0,3,1,0,1,0,1,2,1,0,0,1,0,0,2,1,2,0,0,2,0,0,1,3,1,1,1,1,2,1,1,1,4,0,0,1,1,3,0,1,3,1,0,3,1,0,2,3,0,1,1,0,0,0,0,1,1,0,1,0,0,2,0,0,3,0,0,1,1,0,0,1,0,2,2,1,0,1,3,0,0,0,0,0,1,1,1,2,2,0,0,1,1,1,1,0,0,0,1,2,0,1,1,1,2,1,0,1,3,0,2,0,1,0,0,2,0,2,0,0,1,1,0,0,2,2,0,2,1,1,1,1,0,0,0,0,1,0,3,1,1,1,1,1,1,2,0,1,3,0,1,1,2,1,0,2,0,0,2,0,0,1,2,0,1,0,0,4,0,0,0,0,0,2,1,1,0,1,0,2,1,1,1,2,2,1,0,2,0,0,0,0,3,0,1,0,0,2,1,0,0,1,0,0,0,1,2,2,1,1,2,2,1,0,0,1,0,2,0,1,1,1,1,2,0,0,1,0,1,1,0,1,0,2,1,0,0,0,1,0,0,1,2,3,0,2,1,2,1,2,2,2,0,2,0,1,2,0,0,0,1,1,3,1,2,1,0,1,0,0,0,0,1,1,1,2,1,1,1,1,2,4,2,1,1,0,0,0,2,2,1,0,2,2,3,0,2,0,1,1,1,1,0,3,2,2,1,0,1,0,2,1,1,0,1,2,0,1,1,2,0,0,1,2,2,0,0,1,0,0,2,3,2,2,0,1,0,1,1,0,2,1,0,1,3,1,0,1,1,0,2,1,0,1,0,1,1,2,1,3,2,1,0,1,4,2,1,0,1,5,4,1,0,1,1,1,0,0,1,2,1,2,1,0,0,1,1,1,1,1,1,3,2,2,1,0,1,1,0,0,2,0,0,1,1,1,0,3,1,2,1,2,1,0,1,4,1,4,1,0,2,1,0,1,1,1,1,3,1,1,1,2,0,2,0,1,0,1,1,1,0,1,0,0,0,1,0,3,2,1,0,1,2,0,1,1,1,2,0,0,1,2,0,1,0,3,2,0,2,0,1,0,0,2,1,0,0,0,1,1,2,1,0,1,2,1,1,1,0,3,1,1,0,2,1,1,0,1,0,0,2,0,1,3,1,1,1,0,0,0,0,2,1,2,0,0,1,1,0,0,0,0,0,0,1,2,0,0,1,0,0,1,1,0,1,0,0,0,1,1,0,3,1,2,1,0,3,0,0,2,1,0,2,2,2,0,1,0,0,1,2,0,1,2,0,1,0,1,1,1,0,0,1,0,1,0,1,1,0,0,1,2,0,2,0,1,1,0,1,1,1,1,1,1,1,1,0,1,2,1,0,1,0,1,1,0,1,2,0,3,1,0,2,1,1,2,1,1,3,0,1,1,1,0,0,0,1,3,1,0,0,1,0,1,0,0,0,3,1,0,0,1,1,2,2,0,4,2,2,0,0,0,4,0,0,2,0,1,0,1,0,0,0,1,0,2,1,0,1,0,0,2,2,2,0,1,0,3,1,2,2,0,1,2,3,2,1,1,0,1,3,1,0,2,3,1,0,1,3,2,1,1,1,3,1,2,0,2,0,1,1,1,0,0,1,2,2,2,0,2,1,3,2,2,1,1,0,0,0,1,0,3,0,1,2,0,1,0,1,1,1,2,1,0,1,0,0,0,0,1,1,2,1,2,3,2,1,2,0,1,1,3,1,3,0,2,4,3,0,1,0,1,2,0,1,0,1,0,1,2,0,0,1,1,2,1,0,1,1,0,1,2,0,0,0,2,0,1,1,0,0,1,0,1,0,1,1,1,0,1,2,0,0,2,0,2,1,0,2,0,1,1,1,1,1,1,0,2,1,1,0,1,1,1,2,0,0,1,0,1,2,1,1,0,2,1,1,0,0,0,1,2,2,2,2,2,1,0,1,1,0,3,0,1,0,1,4,2,0,0,0,0,1,1,0,0,3,0,0,1,3,3,0,1,1,0,2,0,5,0,0,0,0,0,1,3,1,2,0,2,2,0,0,0,1,0,0,0,1,1,1,3,1,2,0,1,1]},{"counters":[1,1,1,2,1,1,2,0,3,3,0,3,2,0,1,0,0,1,1,0,2,0,2,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,2,1,1,3,0,1,0,1,1,4,3,1,2,1,1,2,2,5,0,1,1,3,2,3,4,0,4,0,1,2,2,0,1,0,0,1,0,1,1,2,2,0,2,1,1,1,1,1,1,0,1,3,0,0,0,2,1,1,0,2,1,3,0,2,0,0,0,0,0,1,3,0,2,0,1,0,0,2,1,0,1,0,1,2,4,1,0,3,0,0,1,1,4,2,1,0,0,0,1,2,0,1,0,1,1,3,0,0,1,0,0,1,1,2,1,4,1,2,1,0,1,0,1,0,1,0,1,0,1,1,2,0,0,1,1,2,0,0,1,1,1,0,1,1,0,0,1,2,1,0,1,2,1,2,0,1,0,0,1,3,0,3,2,2,0,2,1,1,3,2,0,0,1,1,0,1,2,0,1,1,1,1,4,0,0,1,3,1,0,2,2,1,3,0,2,0,0,0,1,0,1,0,1,0,0,0,0,1,1,2,1,2,0,1,0,0,1,2,0,0,0,0,0,0,2,0,1,1,2,0,1,5,0,1,1,1,1,0,0,1,0,1,4,2,1,2,1,0,0,3,1,0,1,1,1,1,1,1,2,1,1,0,1,0,1,0,1,2,2,0,2,1,2,1,0,0,1,0,1,2,0,1,0,1,1,1,2,0,1,0,1,2,0,1,0,1,1,0,0,1,4,2,0,1,1,1,0,0,0,1,2,0,0,1,1,0,0,0,2,0,0,1,1,0,0,1,3,1,1,1,1,4,1,1,2,1,0,0,3,1,2,3,0,1,1,2,1,1,2,0,1,2,0,0,0,1,2,3,0,0,1,2,3,1,1,2,0,0,2,1,1,1,2,0,1,0,0,2,1,3,0,2,2,2,1,1,0,0,1,1,2,2,2,2,1,2,1,1,0,2,0,0,3,2,0,0,0,0,1,1,2,1,1,0,0,1,0,4,0,1,0,0,1,0,0,1,2,2,1,0,1,1,0,0,1,1,0,4,0,4,2,1,1,1,1,1,1,1,0,1,1,0,1,3,2,0,1,1,1,1,2,1,1,1,0,1,1,1,1,1,1,2,0,3,0,0,1,3,2,0,0,0,0,3,1,0,0,1,3,3,1,1,1,0,1,0,0,1,4,1,3,2,1,0,0,0,0,1,1,2,0,0,2,2,0,2,0,0,1,1,0,2,0,1,1,0,0,0,0,1,2,0,4,0,0,2,1,1,0,2,2,0,2,2,0,1,3,0,0,1,1,0,1,0,0,0,2,0,0,2,0,1,0,0,1,1,1,3,2,2,1,0,0,4,4,1,1,0,2,2,0,1,0,1,1,1,0,0,3,2,0,0,0,0,4,1,2,0,1,1,1,2,2,0,3,0,0,3,1,0,0,2,1,0,0,1,2,1,0,2,2,1,0,1,1,0,0,3,1,0,1,0,2,0,0,0,0,0,0,1,0,2,1,1,2,2,2,0,0,3,0,0,1,0,2,0,0,3,2,0,0,0,0,0,1,2,1,1,0,0,2,1,1,0,0,0,1,1,2,1,0,4,2,1,1,0,0,0,0,1,1,1,0,1,1,1,1,0,1,3,0,3,3,1,0,0,1,0,0,3,1,2,1,0,0,2,1,0,0,1,1,1,3,3,0,2,2,1,1,3,2,1,2,0,0,1,1,1,3,1,1,0,2,3,0,1,1,0,0,4,1,1,1,4,3,1,1,0,0,1,1,1,1,2,2,2,0,0,1,0,1,0,0,1,1,2,0,0,0,3,1,0,1,0,2,2,2,1,1,2,0,1,1,2,0,0,0,0,3,0,0,2,0,2,0,0,1,2,1,1,0,1,3,2,0,2,0,2,0,1,1,0,0,2,2,0,0,0,1,1,1,1,1,2,1,0,0,0,1,0,0,1,1,1,0,0,3,1,2,2,4,1,2,1,1,1,1,0,0,0,1,0,0,3,1,2,2,2,1,0,2,0,2,1,1,0,0,0,1,1,0,3,0,4,2,0,1,0,4,0,0,1,1,4,0,1,1,1,1,1,1,0,1,1,1,2,0,1,1,2,2,1,1,2,3,1,1,1,1,1,0,0,0,3,0,0,1,0,1,1,1,2,0,0,2,1,1,1,1,3,1,2,0,0,2,2,2,2,3,1,1,1,0,0,2,1,1,0,2,0,0,1,1,0,2,0,1,1,1,1,0,0,0,0,2,0,1,0,1,2,2,0,2,1,2,1,0,3,2,0,1,1,1,1,0,0,0,0,0,1,0,3,1,0,1,1,0,0,0,1,0,1,1,3,1,0,1,0,0,2,2,0,1,1,2,2,0,1,0,1,1,0,1,1,0,3,1,1,1,0,1,1,0,0,0,1,1,2,1,0,0,1,0,0,2,1,2,1,3,1,0,2,0,1,1,3,0,1,1,1,1,2,3,1,1,1,1,1,0,2,1,0,1,1,1,1,1,1,0,1,2,0,2,0,0,1,0,1,1,1,1,0,1,0,2,1,0,1,2,0,1,2,2,2,0,0,1,0,1,1,0,2,1,1,1,1,0,0,2,4,3,0,0,3,1,0,1,2,1,0,0,0,0,0,0,0,2,0,0,2,2,0,1,3,2,2,1,1,2,2,1,0,0,1,0,1,1,0,0,0,1,0,0,0,0,2,3,2,1,0,2,0,1,2,1,0,1,1,0,0,0,0,2,0,0,2,1,0,0,0,1,0,1,0,2,3,4,0,1,2,2,1,3,1,0,1,1,1,0,0,1,3,2,2,0,1,0,2,1,1,0,2,1,0,1,0,0,2,0,2,0,1,0,0,0,0,2,2,0,4,1,0,0,0,1,1,1,0,0,0,0,1,2,2,0,0,2,1,0,1,0,1,0,1,3,0,2,1,2,2,1,0,4,0,2,0,0,1,1,1,1,0,0,1,1,1,2,1,2,1,0,1,0,2,1,1,0,3,0,2,3,1,3,1,2,1,2,2,0,1,2,0,1,1,2,2,2,1,1,0,0,1,1,3,1,1,1,1,1,1,3,2,2,0,1,0,1,0,1,0,0,1,0,0,0,1,1,1,0,3,0,0,1,0,3,1,0,2,0,1,0,0,0,1,1,1,0,0,1,0,1,0,2,1,0,1,0,1,1,0,1,1,0,1,1,0,1,2,2,2,0,1,1,1,0,3,1,1,0,1,3,1,0,0,0,0,0,0,1,0,2,0,0,0,0,0,1,1,2,2,4,0,1,1,0,1,0,0,2,0,0,2,1,0,4,0,1,1,0,1,0,1,2,1,3,2,0,2,2,0,0,1,2,0,0,0,0,1,1,2,4,1,2,1,3,2,0,1,3,2,1,3,0,0,1,1,0,0,2,0,0,2,0,1,0,1,1,3,3,1,2,0,0,2,1,2,0,0,3,0,1,1,1,0,1,0,1,0,1,0,1,0,1,1,0,2,3,0,2,1,1,0,2,1,0,0,0,0,0,1,3,0,0,0,0,1,1,3,1,3,0,2,1,1,1,0,1,1,1,4,2,2,1,0,1,0,1,2,0,0,2,1,0,1,2,0,2,1,0,2,2,1,0,2,1,1,1,0,1,0,0,1,0,0,0,0,0,2,2,2,1,0,1,2,1,2,0,2,1,3,0,0,1,0,0,3,2,2,0,1,1,1,1,2,1,1,0,1,1,0,0,0,1,1,0,0,1,1,1,1,0,1,2,1,1,0,1,0,0,1,2,2,0,2,0,3,2,0,1,2,0,1,0,0,0,0,2,1,0,0,2,0,0,0,1,2,0,1,1,1,0,2,1,3,2,1,1,2,0,0,2,0,0,0,1,1,2,0,0,0,0,1,0,1,4,0,1,1,1,1,1,0,0,2,1,2,1,1,1,2,0,0,3,1,0,2,1,0,0,3,1,2,1,0,2,2,1,0,1,0,2,3,1,1,3,1,1,0,1,1,3,1,1,1,1,0,0,0,4,0,2,1,1,0,5,0,0,0,0,1,0,0,1,1,0,1,2,1,2,0,2,0,1,0,2,0,2,2,2,3,1,1,0,0,2,1,0,4,0,0,1,1,0,1,0,1,1,1,1,0,4,2,1,0,0,1,1,0,1,1,0,0,3,1,1,0,1,0,1,0,5,0,1,1,1,2,0,2,1,1,1,1,0,1,1,0,1,1,3,1,0,1,0,2,0,0,0,0,0,2,3,1,2,0,1,0,0,0,0,1,2,1,0,1,1,1,1,3,1,0,0,0,2,2,1,0,0,0,0,1,2,1,3,1,2,0,1,1,3,0,0,4,2,0,1,0,4,0,2,0,1,0,1,2,2,1,0,0,4,3,2,0,0,2,1,0,3,0,1,2,1,1,2,2,1,0,0,2,1,2,1,0,2,1,0,1,2,1,2,1,1,1,4,2,4,0,0,1,1,0,0,1,0,1,2,1,2,2,0,1,1,3,1,0,1,2,0,1,0,0,0,2,0,1,0,0,2,1,0,0,1,1,0,2,1,1,1,0,0,1,0,0,0,0,0,0,1,1,0]}]},"null_count":0,"last_update_version":397952055544643584}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_easy_stats_tbl_dnf.json b/cmd/explaintest/s/explain_easy_stats_tbl_dnf.json deleted file mode 100644 index df413c822f196..0000000000000 --- a/cmd/explaintest/s/explain_easy_stats_tbl_dnf.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"tbl","columns":{"column1":{"histogram":{"ndv":100,"buckets":[{"count":1,"lower_bound":"MA==","upper_bound":"MA==","repeats":1},{"count":2,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1},{"count":3,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":1},{"count":4,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":1},{"count":5,"lower_bound":"NA==","upper_bound":"NA==","repeats":1},{"count":6,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":1},{"count":7,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":1},{"count":8,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":1},{"count":9,"lower_bound":"OA==","upper_bound":"OA==","repeats":1},{"count":10,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":1},{"count":11,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":1},{"count":12,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":1},{"count":13,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":1},{"count":14,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":1},{"count":15,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":1},{"count":16,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":1},{"count":17,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":1},{"count":18,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":1},{"count":19,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":1},{"count":20,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":1},{"count":21,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":1},{"count":22,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":1},{"count":23,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":1},{"count":24,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":1},{"count":25,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":1},{"count":26,"lower_bound":"MjU=","upper_bound":"MjU=","repeats":1},{"count":27,"lower_bound":"MjY=","upper_bound":"MjY=","repeats":1},{"count":28,"lower_bound":"Mjc=","upper_bound":"Mjc=","repeats":1},{"count":29,"lower_bound":"Mjg=","upper_bound":"Mjg=","repeats":1},{"count":30,"lower_bound":"Mjk=","upper_bound":"Mjk=","repeats":1},{"count":31,"lower_bound":"MzA=","upper_bound":"MzA=","repeats":1},{"count":32,"lower_bound":"MzE=","upper_bound":"MzE=","repeats":1},{"count":33,"lower_bound":"MzI=","upper_bound":"MzI=","repeats":1},{"count":34,"lower_bound":"MzM=","upper_bound":"MzM=","repeats":1},{"count":35,"lower_bound":"MzQ=","upper_bound":"MzQ=","repeats":1},{"count":36,"lower_bound":"MzU=","upper_bound":"MzU=","repeats":1},{"count":37,"lower_bound":"MzY=","upper_bound":"MzY=","repeats":1},{"count":38,"lower_bound":"Mzc=","upper_bound":"Mzc=","repeats":1},{"count":39,"lower_bound":"Mzg=","upper_bound":"Mzg=","repeats":1},{"count":40,"lower_bound":"Mzk=","upper_bound":"Mzk=","repeats":1},{"count":41,"lower_bound":"NDA=","upper_bound":"NDA=","repeats":1},{"count":42,"lower_bound":"NDE=","upper_bound":"NDE=","repeats":1},{"count":43,"lower_bound":"NDI=","upper_bound":"NDI=","repeats":1},{"count":44,"lower_bound":"NDM=","upper_bound":"NDM=","repeats":1},{"count":45,"lower_bound":"NDQ=","upper_bound":"NDQ=","repeats":1},{"count":46,"lower_bound":"NDU=","upper_bound":"NDU=","repeats":1},{"count":47,"lower_bound":"NDY=","upper_bound":"NDY=","repeats":1},{"count":48,"lower_bound":"NDc=","upper_bound":"NDc=","repeats":1},{"count":49,"lower_bound":"NDg=","upper_bound":"NDg=","repeats":1},{"count":50,"lower_bound":"NDk=","upper_bound":"NDk=","repeats":1},{"count":51,"lower_bound":"NTA=","upper_bound":"NTA=","repeats":1},{"count":52,"lower_bound":"NTE=","upper_bound":"NTE=","repeats":1},{"count":53,"lower_bound":"NTI=","upper_bound":"NTI=","repeats":1},{"count":54,"lower_bound":"NTM=","upper_bound":"NTM=","repeats":1},{"count":55,"lower_bound":"NTQ=","upper_bound":"NTQ=","repeats":1},{"count":56,"lower_bound":"NTU=","upper_bound":"NTU=","repeats":1},{"count":57,"lower_bound":"NTY=","upper_bound":"NTY=","repeats":1},{"count":58,"lower_bound":"NTc=","upper_bound":"NTc=","repeats":1},{"count":59,"lower_bound":"NTg=","upper_bound":"NTg=","repeats":1},{"count":60,"lower_bound":"NTk=","upper_bound":"NTk=","repeats":1},{"count":61,"lower_bound":"NjA=","upper_bound":"NjA=","repeats":1},{"count":62,"lower_bound":"NjE=","upper_bound":"NjE=","repeats":1},{"count":63,"lower_bound":"NjI=","upper_bound":"NjI=","repeats":1},{"count":64,"lower_bound":"NjM=","upper_bound":"NjM=","repeats":1},{"count":65,"lower_bound":"NjQ=","upper_bound":"NjQ=","repeats":1},{"count":66,"lower_bound":"NjU=","upper_bound":"NjU=","repeats":1},{"count":67,"lower_bound":"NjY=","upper_bound":"NjY=","repeats":1},{"count":68,"lower_bound":"Njc=","upper_bound":"Njc=","repeats":1},{"count":69,"lower_bound":"Njg=","upper_bound":"Njg=","repeats":1},{"count":70,"lower_bound":"Njk=","upper_bound":"Njk=","repeats":1},{"count":71,"lower_bound":"NzA=","upper_bound":"NzA=","repeats":1},{"count":72,"lower_bound":"NzE=","upper_bound":"NzE=","repeats":1},{"count":73,"lower_bound":"NzI=","upper_bound":"NzI=","repeats":1},{"count":74,"lower_bound":"NzM=","upper_bound":"NzM=","repeats":1},{"count":75,"lower_bound":"NzQ=","upper_bound":"NzQ=","repeats":1},{"count":76,"lower_bound":"NzU=","upper_bound":"NzU=","repeats":1},{"count":77,"lower_bound":"NzY=","upper_bound":"NzY=","repeats":1},{"count":78,"lower_bound":"Nzc=","upper_bound":"Nzc=","repeats":1},{"count":79,"lower_bound":"Nzg=","upper_bound":"Nzg=","repeats":1},{"count":80,"lower_bound":"Nzk=","upper_bound":"Nzk=","repeats":1},{"count":81,"lower_bound":"ODA=","upper_bound":"ODA=","repeats":1},{"count":82,"lower_bound":"ODE=","upper_bound":"ODE=","repeats":1},{"count":83,"lower_bound":"ODI=","upper_bound":"ODI=","repeats":1},{"count":84,"lower_bound":"ODM=","upper_bound":"ODM=","repeats":1},{"count":85,"lower_bound":"ODQ=","upper_bound":"ODQ=","repeats":1},{"count":86,"lower_bound":"ODU=","upper_bound":"ODU=","repeats":1},{"count":87,"lower_bound":"ODY=","upper_bound":"ODY=","repeats":1},{"count":88,"lower_bound":"ODc=","upper_bound":"ODc=","repeats":1},{"count":89,"lower_bound":"ODg=","upper_bound":"ODg=","repeats":1},{"count":90,"lower_bound":"ODk=","upper_bound":"ODk=","repeats":1},{"count":91,"lower_bound":"OTA=","upper_bound":"OTA=","repeats":1},{"count":92,"lower_bound":"OTE=","upper_bound":"OTE=","repeats":1},{"count":93,"lower_bound":"OTI=","upper_bound":"OTI=","repeats":1},{"count":94,"lower_bound":"OTM=","upper_bound":"OTM=","repeats":1},{"count":95,"lower_bound":"OTQ=","upper_bound":"OTQ=","repeats":1},{"count":96,"lower_bound":"OTU=","upper_bound":"OTU=","repeats":1},{"count":97,"lower_bound":"OTY=","upper_bound":"OTY=","repeats":1},{"count":98,"lower_bound":"OTc=","upper_bound":"OTc=","repeats":1},{"count":99,"lower_bound":"OTg=","upper_bound":"OTg=","repeats":1},{"count":100,"lower_bound":"OTk=","upper_bound":"OTk=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,1,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":136,"last_update_version":405778329431179264},"column2":{"histogram":{"ndv":100,"buckets":[{"count":1,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1},{"count":2,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":1},{"count":3,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":1},{"count":4,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":1},{"count":5,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":1},{"count":6,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":1},{"count":7,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":1},{"count":8,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":1},{"count":9,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":1},{"count":10,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":1},{"count":11,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":1},{"count":12,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":1},{"count":13,"lower_bound":"MjU=","upper_bound":"MjU=","repeats":1},{"count":14,"lower_bound":"Mjc=","upper_bound":"Mjc=","repeats":1},{"count":15,"lower_bound":"Mjk=","upper_bound":"Mjk=","repeats":1},{"count":16,"lower_bound":"MzE=","upper_bound":"MzE=","repeats":1},{"count":17,"lower_bound":"MzM=","upper_bound":"MzM=","repeats":1},{"count":18,"lower_bound":"MzU=","upper_bound":"MzU=","repeats":1},{"count":19,"lower_bound":"Mzc=","upper_bound":"Mzc=","repeats":1},{"count":20,"lower_bound":"Mzk=","upper_bound":"Mzk=","repeats":1},{"count":21,"lower_bound":"NDE=","upper_bound":"NDE=","repeats":1},{"count":22,"lower_bound":"NDM=","upper_bound":"NDM=","repeats":1},{"count":23,"lower_bound":"NDU=","upper_bound":"NDU=","repeats":1},{"count":24,"lower_bound":"NDc=","upper_bound":"NDc=","repeats":1},{"count":25,"lower_bound":"NDk=","upper_bound":"NDk=","repeats":1},{"count":26,"lower_bound":"NTE=","upper_bound":"NTE=","repeats":1},{"count":27,"lower_bound":"NTM=","upper_bound":"NTM=","repeats":1},{"count":28,"lower_bound":"NTU=","upper_bound":"NTU=","repeats":1},{"count":29,"lower_bound":"NTc=","upper_bound":"NTc=","repeats":1},{"count":30,"lower_bound":"NTk=","upper_bound":"NTk=","repeats":1},{"count":31,"lower_bound":"NjE=","upper_bound":"NjE=","repeats":1},{"count":32,"lower_bound":"NjM=","upper_bound":"NjM=","repeats":1},{"count":33,"lower_bound":"NjU=","upper_bound":"NjU=","repeats":1},{"count":34,"lower_bound":"Njc=","upper_bound":"Njc=","repeats":1},{"count":35,"lower_bound":"Njk=","upper_bound":"Njk=","repeats":1},{"count":36,"lower_bound":"NzE=","upper_bound":"NzE=","repeats":1},{"count":37,"lower_bound":"NzM=","upper_bound":"NzM=","repeats":1},{"count":38,"lower_bound":"NzU=","upper_bound":"NzU=","repeats":1},{"count":39,"lower_bound":"Nzc=","upper_bound":"Nzc=","repeats":1},{"count":40,"lower_bound":"Nzk=","upper_bound":"Nzk=","repeats":1},{"count":41,"lower_bound":"ODE=","upper_bound":"ODE=","repeats":1},{"count":42,"lower_bound":"ODM=","upper_bound":"ODM=","repeats":1},{"count":43,"lower_bound":"ODU=","upper_bound":"ODU=","repeats":1},{"count":44,"lower_bound":"ODc=","upper_bound":"ODc=","repeats":1},{"count":45,"lower_bound":"ODk=","upper_bound":"ODk=","repeats":1},{"count":46,"lower_bound":"OTE=","upper_bound":"OTE=","repeats":1},{"count":47,"lower_bound":"OTM=","upper_bound":"OTM=","repeats":1},{"count":48,"lower_bound":"OTU=","upper_bound":"OTU=","repeats":1},{"count":49,"lower_bound":"OTc=","upper_bound":"OTc=","repeats":1},{"count":50,"lower_bound":"OTk=","upper_bound":"OTk=","repeats":1},{"count":51,"lower_bound":"MTAx","upper_bound":"MTAx","repeats":1},{"count":52,"lower_bound":"MTAz","upper_bound":"MTAz","repeats":1},{"count":53,"lower_bound":"MTA1","upper_bound":"MTA1","repeats":1},{"count":54,"lower_bound":"MTA3","upper_bound":"MTA3","repeats":1},{"count":55,"lower_bound":"MTA5","upper_bound":"MTA5","repeats":1},{"count":56,"lower_bound":"MTEx","upper_bound":"MTEx","repeats":1},{"count":57,"lower_bound":"MTEz","upper_bound":"MTEz","repeats":1},{"count":58,"lower_bound":"MTE1","upper_bound":"MTE1","repeats":1},{"count":59,"lower_bound":"MTE3","upper_bound":"MTE3","repeats":1},{"count":60,"lower_bound":"MTE5","upper_bound":"MTE5","repeats":1},{"count":61,"lower_bound":"MTIx","upper_bound":"MTIx","repeats":1},{"count":62,"lower_bound":"MTIz","upper_bound":"MTIz","repeats":1},{"count":63,"lower_bound":"MTI1","upper_bound":"MTI1","repeats":1},{"count":64,"lower_bound":"MTI3","upper_bound":"MTI3","repeats":1},{"count":65,"lower_bound":"MTI5","upper_bound":"MTI5","repeats":1},{"count":66,"lower_bound":"MTMx","upper_bound":"MTMx","repeats":1},{"count":67,"lower_bound":"MTMz","upper_bound":"MTMz","repeats":1},{"count":68,"lower_bound":"MTM1","upper_bound":"MTM1","repeats":1},{"count":69,"lower_bound":"MTM3","upper_bound":"MTM3","repeats":1},{"count":70,"lower_bound":"MTM5","upper_bound":"MTM5","repeats":1},{"count":71,"lower_bound":"MTQx","upper_bound":"MTQx","repeats":1},{"count":72,"lower_bound":"MTQz","upper_bound":"MTQz","repeats":1},{"count":73,"lower_bound":"MTQ1","upper_bound":"MTQ1","repeats":1},{"count":74,"lower_bound":"MTQ3","upper_bound":"MTQ3","repeats":1},{"count":75,"lower_bound":"MTQ5","upper_bound":"MTQ5","repeats":1},{"count":76,"lower_bound":"MTUx","upper_bound":"MTUx","repeats":1},{"count":77,"lower_bound":"MTUz","upper_bound":"MTUz","repeats":1},{"count":78,"lower_bound":"MTU1","upper_bound":"MTU1","repeats":1},{"count":79,"lower_bound":"MTU3","upper_bound":"MTU3","repeats":1},{"count":80,"lower_bound":"MTU5","upper_bound":"MTU5","repeats":1},{"count":81,"lower_bound":"MTYx","upper_bound":"MTYx","repeats":1},{"count":82,"lower_bound":"MTYz","upper_bound":"MTYz","repeats":1},{"count":83,"lower_bound":"MTY1","upper_bound":"MTY1","repeats":1},{"count":84,"lower_bound":"MTY3","upper_bound":"MTY3","repeats":1},{"count":85,"lower_bound":"MTY5","upper_bound":"MTY5","repeats":1},{"count":86,"lower_bound":"MTcx","upper_bound":"MTcx","repeats":1},{"count":87,"lower_bound":"MTcz","upper_bound":"MTcz","repeats":1},{"count":88,"lower_bound":"MTc1","upper_bound":"MTc1","repeats":1},{"count":89,"lower_bound":"MTc3","upper_bound":"MTc3","repeats":1},{"count":90,"lower_bound":"MTc5","upper_bound":"MTc5","repeats":1},{"count":91,"lower_bound":"MTgx","upper_bound":"MTgx","repeats":1},{"count":92,"lower_bound":"MTgz","upper_bound":"MTgz","repeats":1},{"count":93,"lower_bound":"MTg1","upper_bound":"MTg1","repeats":1},{"count":94,"lower_bound":"MTg3","upper_bound":"MTg3","repeats":1},{"count":95,"lower_bound":"MTg5","upper_bound":"MTg5","repeats":1},{"count":96,"lower_bound":"MTkx","upper_bound":"MTkx","repeats":1},{"count":97,"lower_bound":"MTkz","upper_bound":"MTkz","repeats":1},{"count":98,"lower_bound":"MTk1","upper_bound":"MTk1","repeats":1},{"count":99,"lower_bound":"MTk3","upper_bound":"MTk3","repeats":1},{"count":100,"lower_bound":"MTk5","upper_bound":"MTk5","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,2,0,1,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":168,"last_update_version":405778329449267200}},"indices":{"idx":{"histogram":{"ndv":100,"buckets":[{"count":1,"lower_bound":"A4AAAAAAAAAAA4AAAAAAAAAB","upper_bound":"A4AAAAAAAAAAA4AAAAAAAAAB","repeats":1},{"count":2,"lower_bound":"A4AAAAAAAAABA4AAAAAAAAAD","upper_bound":"A4AAAAAAAAABA4AAAAAAAAAD","repeats":1},{"count":3,"lower_bound":"A4AAAAAAAAACA4AAAAAAAAAF","upper_bound":"A4AAAAAAAAACA4AAAAAAAAAF","repeats":1},{"count":4,"lower_bound":"A4AAAAAAAAADA4AAAAAAAAAH","upper_bound":"A4AAAAAAAAADA4AAAAAAAAAH","repeats":1},{"count":5,"lower_bound":"A4AAAAAAAAAEA4AAAAAAAAAJ","upper_bound":"A4AAAAAAAAAEA4AAAAAAAAAJ","repeats":1},{"count":6,"lower_bound":"A4AAAAAAAAAFA4AAAAAAAAAL","upper_bound":"A4AAAAAAAAAFA4AAAAAAAAAL","repeats":1},{"count":7,"lower_bound":"A4AAAAAAAAAGA4AAAAAAAAAN","upper_bound":"A4AAAAAAAAAGA4AAAAAAAAAN","repeats":1},{"count":8,"lower_bound":"A4AAAAAAAAAHA4AAAAAAAAAP","upper_bound":"A4AAAAAAAAAHA4AAAAAAAAAP","repeats":1},{"count":9,"lower_bound":"A4AAAAAAAAAIA4AAAAAAAAAR","upper_bound":"A4AAAAAAAAAIA4AAAAAAAAAR","repeats":1},{"count":10,"lower_bound":"A4AAAAAAAAAJA4AAAAAAAAAT","upper_bound":"A4AAAAAAAAAJA4AAAAAAAAAT","repeats":1},{"count":11,"lower_bound":"A4AAAAAAAAAKA4AAAAAAAAAV","upper_bound":"A4AAAAAAAAAKA4AAAAAAAAAV","repeats":1},{"count":12,"lower_bound":"A4AAAAAAAAALA4AAAAAAAAAX","upper_bound":"A4AAAAAAAAALA4AAAAAAAAAX","repeats":1},{"count":13,"lower_bound":"A4AAAAAAAAAMA4AAAAAAAAAZ","upper_bound":"A4AAAAAAAAAMA4AAAAAAAAAZ","repeats":1},{"count":14,"lower_bound":"A4AAAAAAAAANA4AAAAAAAAAb","upper_bound":"A4AAAAAAAAANA4AAAAAAAAAb","repeats":1},{"count":15,"lower_bound":"A4AAAAAAAAAOA4AAAAAAAAAd","upper_bound":"A4AAAAAAAAAOA4AAAAAAAAAd","repeats":1},{"count":16,"lower_bound":"A4AAAAAAAAAPA4AAAAAAAAAf","upper_bound":"A4AAAAAAAAAPA4AAAAAAAAAf","repeats":1},{"count":17,"lower_bound":"A4AAAAAAAAAQA4AAAAAAAAAh","upper_bound":"A4AAAAAAAAAQA4AAAAAAAAAh","repeats":1},{"count":18,"lower_bound":"A4AAAAAAAAARA4AAAAAAAAAj","upper_bound":"A4AAAAAAAAARA4AAAAAAAAAj","repeats":1},{"count":19,"lower_bound":"A4AAAAAAAAASA4AAAAAAAAAl","upper_bound":"A4AAAAAAAAASA4AAAAAAAAAl","repeats":1},{"count":20,"lower_bound":"A4AAAAAAAAATA4AAAAAAAAAn","upper_bound":"A4AAAAAAAAATA4AAAAAAAAAn","repeats":1},{"count":21,"lower_bound":"A4AAAAAAAAAUA4AAAAAAAAAp","upper_bound":"A4AAAAAAAAAUA4AAAAAAAAAp","repeats":1},{"count":22,"lower_bound":"A4AAAAAAAAAVA4AAAAAAAAAr","upper_bound":"A4AAAAAAAAAVA4AAAAAAAAAr","repeats":1},{"count":23,"lower_bound":"A4AAAAAAAAAWA4AAAAAAAAAt","upper_bound":"A4AAAAAAAAAWA4AAAAAAAAAt","repeats":1},{"count":24,"lower_bound":"A4AAAAAAAAAXA4AAAAAAAAAv","upper_bound":"A4AAAAAAAAAXA4AAAAAAAAAv","repeats":1},{"count":25,"lower_bound":"A4AAAAAAAAAYA4AAAAAAAAAx","upper_bound":"A4AAAAAAAAAYA4AAAAAAAAAx","repeats":1},{"count":26,"lower_bound":"A4AAAAAAAAAZA4AAAAAAAAAz","upper_bound":"A4AAAAAAAAAZA4AAAAAAAAAz","repeats":1},{"count":27,"lower_bound":"A4AAAAAAAAAaA4AAAAAAAAA1","upper_bound":"A4AAAAAAAAAaA4AAAAAAAAA1","repeats":1},{"count":28,"lower_bound":"A4AAAAAAAAAbA4AAAAAAAAA3","upper_bound":"A4AAAAAAAAAbA4AAAAAAAAA3","repeats":1},{"count":29,"lower_bound":"A4AAAAAAAAAcA4AAAAAAAAA5","upper_bound":"A4AAAAAAAAAcA4AAAAAAAAA5","repeats":1},{"count":30,"lower_bound":"A4AAAAAAAAAdA4AAAAAAAAA7","upper_bound":"A4AAAAAAAAAdA4AAAAAAAAA7","repeats":1},{"count":31,"lower_bound":"A4AAAAAAAAAeA4AAAAAAAAA9","upper_bound":"A4AAAAAAAAAeA4AAAAAAAAA9","repeats":1},{"count":32,"lower_bound":"A4AAAAAAAAAfA4AAAAAAAAA/","upper_bound":"A4AAAAAAAAAfA4AAAAAAAAA/","repeats":1},{"count":33,"lower_bound":"A4AAAAAAAAAgA4AAAAAAAABB","upper_bound":"A4AAAAAAAAAgA4AAAAAAAABB","repeats":1},{"count":34,"lower_bound":"A4AAAAAAAAAhA4AAAAAAAABD","upper_bound":"A4AAAAAAAAAhA4AAAAAAAABD","repeats":1},{"count":35,"lower_bound":"A4AAAAAAAAAiA4AAAAAAAABF","upper_bound":"A4AAAAAAAAAiA4AAAAAAAABF","repeats":1},{"count":36,"lower_bound":"A4AAAAAAAAAjA4AAAAAAAABH","upper_bound":"A4AAAAAAAAAjA4AAAAAAAABH","repeats":1},{"count":37,"lower_bound":"A4AAAAAAAAAkA4AAAAAAAABJ","upper_bound":"A4AAAAAAAAAkA4AAAAAAAABJ","repeats":1},{"count":38,"lower_bound":"A4AAAAAAAAAlA4AAAAAAAABL","upper_bound":"A4AAAAAAAAAlA4AAAAAAAABL","repeats":1},{"count":39,"lower_bound":"A4AAAAAAAAAmA4AAAAAAAABN","upper_bound":"A4AAAAAAAAAmA4AAAAAAAABN","repeats":1},{"count":40,"lower_bound":"A4AAAAAAAAAnA4AAAAAAAABP","upper_bound":"A4AAAAAAAAAnA4AAAAAAAABP","repeats":1},{"count":41,"lower_bound":"A4AAAAAAAAAoA4AAAAAAAABR","upper_bound":"A4AAAAAAAAAoA4AAAAAAAABR","repeats":1},{"count":42,"lower_bound":"A4AAAAAAAAApA4AAAAAAAABT","upper_bound":"A4AAAAAAAAApA4AAAAAAAABT","repeats":1},{"count":43,"lower_bound":"A4AAAAAAAAAqA4AAAAAAAABV","upper_bound":"A4AAAAAAAAAqA4AAAAAAAABV","repeats":1},{"count":44,"lower_bound":"A4AAAAAAAAArA4AAAAAAAABX","upper_bound":"A4AAAAAAAAArA4AAAAAAAABX","repeats":1},{"count":45,"lower_bound":"A4AAAAAAAAAsA4AAAAAAAABZ","upper_bound":"A4AAAAAAAAAsA4AAAAAAAABZ","repeats":1},{"count":46,"lower_bound":"A4AAAAAAAAAtA4AAAAAAAABb","upper_bound":"A4AAAAAAAAAtA4AAAAAAAABb","repeats":1},{"count":47,"lower_bound":"A4AAAAAAAAAuA4AAAAAAAABd","upper_bound":"A4AAAAAAAAAuA4AAAAAAAABd","repeats":1},{"count":48,"lower_bound":"A4AAAAAAAAAvA4AAAAAAAABf","upper_bound":"A4AAAAAAAAAvA4AAAAAAAABf","repeats":1},{"count":49,"lower_bound":"A4AAAAAAAAAwA4AAAAAAAABh","upper_bound":"A4AAAAAAAAAwA4AAAAAAAABh","repeats":1},{"count":50,"lower_bound":"A4AAAAAAAAAxA4AAAAAAAABj","upper_bound":"A4AAAAAAAAAxA4AAAAAAAABj","repeats":1},{"count":51,"lower_bound":"A4AAAAAAAAAyA4AAAAAAAABl","upper_bound":"A4AAAAAAAAAyA4AAAAAAAABl","repeats":1},{"count":52,"lower_bound":"A4AAAAAAAAAzA4AAAAAAAABn","upper_bound":"A4AAAAAAAAAzA4AAAAAAAABn","repeats":1},{"count":53,"lower_bound":"A4AAAAAAAAA0A4AAAAAAAABp","upper_bound":"A4AAAAAAAAA0A4AAAAAAAABp","repeats":1},{"count":54,"lower_bound":"A4AAAAAAAAA1A4AAAAAAAABr","upper_bound":"A4AAAAAAAAA1A4AAAAAAAABr","repeats":1},{"count":55,"lower_bound":"A4AAAAAAAAA2A4AAAAAAAABt","upper_bound":"A4AAAAAAAAA2A4AAAAAAAABt","repeats":1},{"count":56,"lower_bound":"A4AAAAAAAAA3A4AAAAAAAABv","upper_bound":"A4AAAAAAAAA3A4AAAAAAAABv","repeats":1},{"count":57,"lower_bound":"A4AAAAAAAAA4A4AAAAAAAABx","upper_bound":"A4AAAAAAAAA4A4AAAAAAAABx","repeats":1},{"count":58,"lower_bound":"A4AAAAAAAAA5A4AAAAAAAABz","upper_bound":"A4AAAAAAAAA5A4AAAAAAAABz","repeats":1},{"count":59,"lower_bound":"A4AAAAAAAAA6A4AAAAAAAAB1","upper_bound":"A4AAAAAAAAA6A4AAAAAAAAB1","repeats":1},{"count":60,"lower_bound":"A4AAAAAAAAA7A4AAAAAAAAB3","upper_bound":"A4AAAAAAAAA7A4AAAAAAAAB3","repeats":1},{"count":61,"lower_bound":"A4AAAAAAAAA8A4AAAAAAAAB5","upper_bound":"A4AAAAAAAAA8A4AAAAAAAAB5","repeats":1},{"count":62,"lower_bound":"A4AAAAAAAAA9A4AAAAAAAAB7","upper_bound":"A4AAAAAAAAA9A4AAAAAAAAB7","repeats":1},{"count":63,"lower_bound":"A4AAAAAAAAA+A4AAAAAAAAB9","upper_bound":"A4AAAAAAAAA+A4AAAAAAAAB9","repeats":1},{"count":64,"lower_bound":"A4AAAAAAAAA/A4AAAAAAAAB/","upper_bound":"A4AAAAAAAAA/A4AAAAAAAAB/","repeats":1},{"count":65,"lower_bound":"A4AAAAAAAABAA4AAAAAAAACB","upper_bound":"A4AAAAAAAABAA4AAAAAAAACB","repeats":1},{"count":66,"lower_bound":"A4AAAAAAAABBA4AAAAAAAACD","upper_bound":"A4AAAAAAAABBA4AAAAAAAACD","repeats":1},{"count":67,"lower_bound":"A4AAAAAAAABCA4AAAAAAAACF","upper_bound":"A4AAAAAAAABCA4AAAAAAAACF","repeats":1},{"count":68,"lower_bound":"A4AAAAAAAABDA4AAAAAAAACH","upper_bound":"A4AAAAAAAABDA4AAAAAAAACH","repeats":1},{"count":69,"lower_bound":"A4AAAAAAAABEA4AAAAAAAACJ","upper_bound":"A4AAAAAAAABEA4AAAAAAAACJ","repeats":1},{"count":70,"lower_bound":"A4AAAAAAAABFA4AAAAAAAACL","upper_bound":"A4AAAAAAAABFA4AAAAAAAACL","repeats":1},{"count":71,"lower_bound":"A4AAAAAAAABGA4AAAAAAAACN","upper_bound":"A4AAAAAAAABGA4AAAAAAAACN","repeats":1},{"count":72,"lower_bound":"A4AAAAAAAABHA4AAAAAAAACP","upper_bound":"A4AAAAAAAABHA4AAAAAAAACP","repeats":1},{"count":73,"lower_bound":"A4AAAAAAAABIA4AAAAAAAACR","upper_bound":"A4AAAAAAAABIA4AAAAAAAACR","repeats":1},{"count":74,"lower_bound":"A4AAAAAAAABJA4AAAAAAAACT","upper_bound":"A4AAAAAAAABJA4AAAAAAAACT","repeats":1},{"count":75,"lower_bound":"A4AAAAAAAABKA4AAAAAAAACV","upper_bound":"A4AAAAAAAABKA4AAAAAAAACV","repeats":1},{"count":76,"lower_bound":"A4AAAAAAAABLA4AAAAAAAACX","upper_bound":"A4AAAAAAAABLA4AAAAAAAACX","repeats":1},{"count":77,"lower_bound":"A4AAAAAAAABMA4AAAAAAAACZ","upper_bound":"A4AAAAAAAABMA4AAAAAAAACZ","repeats":1},{"count":78,"lower_bound":"A4AAAAAAAABNA4AAAAAAAACb","upper_bound":"A4AAAAAAAABNA4AAAAAAAACb","repeats":1},{"count":79,"lower_bound":"A4AAAAAAAABOA4AAAAAAAACd","upper_bound":"A4AAAAAAAABOA4AAAAAAAACd","repeats":1},{"count":80,"lower_bound":"A4AAAAAAAABPA4AAAAAAAACf","upper_bound":"A4AAAAAAAABPA4AAAAAAAACf","repeats":1},{"count":81,"lower_bound":"A4AAAAAAAABQA4AAAAAAAACh","upper_bound":"A4AAAAAAAABQA4AAAAAAAACh","repeats":1},{"count":82,"lower_bound":"A4AAAAAAAABRA4AAAAAAAACj","upper_bound":"A4AAAAAAAABRA4AAAAAAAACj","repeats":1},{"count":83,"lower_bound":"A4AAAAAAAABSA4AAAAAAAACl","upper_bound":"A4AAAAAAAABSA4AAAAAAAACl","repeats":1},{"count":84,"lower_bound":"A4AAAAAAAABTA4AAAAAAAACn","upper_bound":"A4AAAAAAAABTA4AAAAAAAACn","repeats":1},{"count":85,"lower_bound":"A4AAAAAAAABUA4AAAAAAAACp","upper_bound":"A4AAAAAAAABUA4AAAAAAAACp","repeats":1},{"count":86,"lower_bound":"A4AAAAAAAABVA4AAAAAAAACr","upper_bound":"A4AAAAAAAABVA4AAAAAAAACr","repeats":1},{"count":87,"lower_bound":"A4AAAAAAAABWA4AAAAAAAACt","upper_bound":"A4AAAAAAAABWA4AAAAAAAACt","repeats":1},{"count":88,"lower_bound":"A4AAAAAAAABXA4AAAAAAAACv","upper_bound":"A4AAAAAAAABXA4AAAAAAAACv","repeats":1},{"count":89,"lower_bound":"A4AAAAAAAABYA4AAAAAAAACx","upper_bound":"A4AAAAAAAABYA4AAAAAAAACx","repeats":1},{"count":90,"lower_bound":"A4AAAAAAAABZA4AAAAAAAACz","upper_bound":"A4AAAAAAAABZA4AAAAAAAACz","repeats":1},{"count":91,"lower_bound":"A4AAAAAAAABaA4AAAAAAAAC1","upper_bound":"A4AAAAAAAABaA4AAAAAAAAC1","repeats":1},{"count":92,"lower_bound":"A4AAAAAAAABbA4AAAAAAAAC3","upper_bound":"A4AAAAAAAABbA4AAAAAAAAC3","repeats":1},{"count":93,"lower_bound":"A4AAAAAAAABcA4AAAAAAAAC5","upper_bound":"A4AAAAAAAABcA4AAAAAAAAC5","repeats":1},{"count":94,"lower_bound":"A4AAAAAAAABdA4AAAAAAAAC7","upper_bound":"A4AAAAAAAABdA4AAAAAAAAC7","repeats":1},{"count":95,"lower_bound":"A4AAAAAAAABeA4AAAAAAAAC9","upper_bound":"A4AAAAAAAABeA4AAAAAAAAC9","repeats":1},{"count":96,"lower_bound":"A4AAAAAAAABfA4AAAAAAAAC/","upper_bound":"A4AAAAAAAABfA4AAAAAAAAC/","repeats":1},{"count":97,"lower_bound":"A4AAAAAAAABgA4AAAAAAAADB","upper_bound":"A4AAAAAAAABgA4AAAAAAAADB","repeats":1},{"count":98,"lower_bound":"A4AAAAAAAABhA4AAAAAAAADD","upper_bound":"A4AAAAAAAABhA4AAAAAAAADD","repeats":1},{"count":99,"lower_bound":"A4AAAAAAAABiA4AAAAAAAADF","upper_bound":"A4AAAAAAAABiA4AAAAAAAADF","repeats":1},{"count":100,"lower_bound":"A4AAAAAAAABjA4AAAAAAAADH","upper_bound":"A4AAAAAAAABjA4AAAAAAAADH","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,1,1,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,1,1,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,1,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,2,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,2,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,0,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,2,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,2,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,2,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,2,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,2,0,0,0,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,2,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,2,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,2,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":0,"last_update_version":405778329457393664}},"count":100,"modify_count":0,"partitions":null} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_indexmerge_stats_t.json b/cmd/explaintest/s/explain_indexmerge_stats_t.json deleted file mode 100644 index 086d2035b97df..0000000000000 --- a/cmd/explaintest/s/explain_indexmerge_stats_t.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"t","columns":{"a":{"histogram":{"ndv":5000000,"buckets":[{"count":32768,"lower_bound":"MQ==","upper_bound":"MzI3Njg=","repeats":1},{"count":65536,"lower_bound":"MzI3Njk=","upper_bound":"NjU1MzY=","repeats":1},{"count":98304,"lower_bound":"NjU1Mzc=","upper_bound":"OTgzMDQ=","repeats":1},{"count":131072,"lower_bound":"OTgzMDU=","upper_bound":"MTMxMDcy","repeats":1},{"count":163840,"lower_bound":"MTMxMDcz","upper_bound":"MTYzODQw","repeats":1},{"count":196608,"lower_bound":"MTYzODQx","upper_bound":"MTk2NjA4","repeats":1},{"count":229376,"lower_bound":"MTk2NjA5","upper_bound":"MjI5Mzc2","repeats":1},{"count":262144,"lower_bound":"MjI5Mzc3","upper_bound":"MjYyMTQ0","repeats":1},{"count":294912,"lower_bound":"MjYyMTQ1","upper_bound":"Mjk0OTEy","repeats":1},{"count":327680,"lower_bound":"Mjk0OTEz","upper_bound":"MzI3Njgw","repeats":1},{"count":360448,"lower_bound":"MzI3Njgx","upper_bound":"MzYwNDQ4","repeats":1},{"count":393216,"lower_bound":"MzYwNDQ5","upper_bound":"MzkzMjE2","repeats":1},{"count":425984,"lower_bound":"MzkzMjE3","upper_bound":"NDI1OTg0","repeats":1},{"count":458752,"lower_bound":"NDI1OTg1","upper_bound":"NDU4NzUy","repeats":1},{"count":491520,"lower_bound":"NDU4NzUz","upper_bound":"NDkxNTIw","repeats":1},{"count":524288,"lower_bound":"NDkxNTIx","upper_bound":"NTI0Mjg4","repeats":1},{"count":557056,"lower_bound":"NTI0Mjg5","upper_bound":"NTU3MDU2","repeats":1},{"count":589824,"lower_bound":"NTU3MDU3","upper_bound":"NTg5ODI0","repeats":1},{"count":622592,"lower_bound":"NTg5ODI1","upper_bound":"NjIyNTky","repeats":1},{"count":655360,"lower_bound":"NjIyNTkz","upper_bound":"NjU1MzYw","repeats":1},{"count":688128,"lower_bound":"NjU1MzYx","upper_bound":"Njg4MTI4","repeats":1},{"count":720896,"lower_bound":"Njg4MTI5","upper_bound":"NzIwODk2","repeats":1},{"count":753664,"lower_bound":"NzIwODk3","upper_bound":"NzUzNjY0","repeats":1},{"count":786432,"lower_bound":"NzUzNjY1","upper_bound":"Nzg2NDMy","repeats":1},{"count":819200,"lower_bound":"Nzg2NDMz","upper_bound":"ODE5MjAw","repeats":1},{"count":851968,"lower_bound":"ODE5MjAx","upper_bound":"ODUxOTY4","repeats":1},{"count":884736,"lower_bound":"ODUxOTY5","upper_bound":"ODg0NzM2","repeats":1},{"count":917504,"lower_bound":"ODg0NzM3","upper_bound":"OTE3NTA0","repeats":1},{"count":950272,"lower_bound":"OTE3NTA1","upper_bound":"OTUwMjcy","repeats":1},{"count":983040,"lower_bound":"OTUwMjcz","upper_bound":"OTgzMDQw","repeats":1},{"count":1015808,"lower_bound":"OTgzMDQx","upper_bound":"MTAxNTgwOA==","repeats":1},{"count":1048576,"lower_bound":"MTAxNTgwOQ==","upper_bound":"MTA0ODU3Ng==","repeats":1},{"count":1081344,"lower_bound":"MTA0ODU3Nw==","upper_bound":"MTA4MTM0NA==","repeats":1},{"count":1114112,"lower_bound":"MTA4MTM0NQ==","upper_bound":"MTExNDExMg==","repeats":1},{"count":1146880,"lower_bound":"MTExNDExMw==","upper_bound":"MTE0Njg4MA==","repeats":1},{"count":1179648,"lower_bound":"MTE0Njg4MQ==","upper_bound":"MTE3OTY0OA==","repeats":1},{"count":1212416,"lower_bound":"MTE3OTY0OQ==","upper_bound":"MTIxMjQxNg==","repeats":1},{"count":1245184,"lower_bound":"MTIxMjQxNw==","upper_bound":"MTI0NTE4NA==","repeats":1},{"count":1277952,"lower_bound":"MTI0NTE4NQ==","upper_bound":"MTI3Nzk1Mg==","repeats":1},{"count":1310720,"lower_bound":"MTI3Nzk1Mw==","upper_bound":"MTMxMDcyMA==","repeats":1},{"count":1343488,"lower_bound":"MTMxMDcyMQ==","upper_bound":"MTM0MzQ4OA==","repeats":1},{"count":1376256,"lower_bound":"MTM0MzQ4OQ==","upper_bound":"MTM3NjI1Ng==","repeats":1},{"count":1409024,"lower_bound":"MTM3NjI1Nw==","upper_bound":"MTQwOTAyNA==","repeats":1},{"count":1441792,"lower_bound":"MTQwOTAyNQ==","upper_bound":"MTQ0MTc5Mg==","repeats":1},{"count":1474560,"lower_bound":"MTQ0MTc5Mw==","upper_bound":"MTQ3NDU2MA==","repeats":1},{"count":1507328,"lower_bound":"MTQ3NDU2MQ==","upper_bound":"MTUwNzMyOA==","repeats":1},{"count":1540096,"lower_bound":"MTUwNzMyOQ==","upper_bound":"MTU0MDA5Ng==","repeats":1},{"count":1572864,"lower_bound":"MTU0MDA5Nw==","upper_bound":"MTU3Mjg2NA==","repeats":1},{"count":1605632,"lower_bound":"MTU3Mjg2NQ==","upper_bound":"MTYwNTYzMg==","repeats":1},{"count":1638400,"lower_bound":"MTYwNTYzMw==","upper_bound":"MTYzODQwMA==","repeats":1},{"count":1671168,"lower_bound":"MTYzODQwMQ==","upper_bound":"MTY3MTE2OA==","repeats":1},{"count":1703936,"lower_bound":"MTY3MTE2OQ==","upper_bound":"MTcwMzkzNg==","repeats":1},{"count":1736704,"lower_bound":"MTcwMzkzNw==","upper_bound":"MTczNjcwNA==","repeats":1},{"count":1769472,"lower_bound":"MTczNjcwNQ==","upper_bound":"MTc2OTQ3Mg==","repeats":1},{"count":1802240,"lower_bound":"MTc2OTQ3Mw==","upper_bound":"MTgwMjI0MA==","repeats":1},{"count":1835008,"lower_bound":"MTgwMjI0MQ==","upper_bound":"MTgzNTAwOA==","repeats":1},{"count":1867776,"lower_bound":"MTgzNTAwOQ==","upper_bound":"MTg2Nzc3Ng==","repeats":1},{"count":1900544,"lower_bound":"MTg2Nzc3Nw==","upper_bound":"MTkwMDU0NA==","repeats":1},{"count":1933312,"lower_bound":"MTkwMDU0NQ==","upper_bound":"MTkzMzMxMg==","repeats":1},{"count":1966080,"lower_bound":"MTkzMzMxMw==","upper_bound":"MTk2NjA4MA==","repeats":1},{"count":1998848,"lower_bound":"MTk2NjA4MQ==","upper_bound":"MTk5ODg0OA==","repeats":1},{"count":2031616,"lower_bound":"MTk5ODg0OQ==","upper_bound":"MjAzMTYxNg==","repeats":1},{"count":2064384,"lower_bound":"MjAzMTYxNw==","upper_bound":"MjA2NDM4NA==","repeats":1},{"count":2097152,"lower_bound":"MjA2NDM4NQ==","upper_bound":"MjA5NzE1Mg==","repeats":1},{"count":2129920,"lower_bound":"MjA5NzE1Mw==","upper_bound":"MjEyOTkyMA==","repeats":1},{"count":2162688,"lower_bound":"MjEyOTkyMQ==","upper_bound":"MjE2MjY4OA==","repeats":1},{"count":2195456,"lower_bound":"MjE2MjY4OQ==","upper_bound":"MjE5NTQ1Ng==","repeats":1},{"count":2228224,"lower_bound":"MjE5NTQ1Nw==","upper_bound":"MjIyODIyNA==","repeats":1},{"count":2260992,"lower_bound":"MjIyODIyNQ==","upper_bound":"MjI2MDk5Mg==","repeats":1},{"count":2293760,"lower_bound":"MjI2MDk5Mw==","upper_bound":"MjI5Mzc2MA==","repeats":1},{"count":2326528,"lower_bound":"MjI5Mzc2MQ==","upper_bound":"MjMyNjUyOA==","repeats":1},{"count":2359296,"lower_bound":"MjMyNjUyOQ==","upper_bound":"MjM1OTI5Ng==","repeats":1},{"count":2392064,"lower_bound":"MjM1OTI5Nw==","upper_bound":"MjM5MjA2NA==","repeats":1},{"count":2424832,"lower_bound":"MjM5MjA2NQ==","upper_bound":"MjQyNDgzMg==","repeats":1},{"count":2457600,"lower_bound":"MjQyNDgzMw==","upper_bound":"MjQ1NzYwMA==","repeats":1},{"count":2490368,"lower_bound":"MjQ1NzYwMQ==","upper_bound":"MjQ5MDM2OA==","repeats":1},{"count":2523136,"lower_bound":"MjQ5MDM2OQ==","upper_bound":"MjUyMzEzNg==","repeats":1},{"count":2555904,"lower_bound":"MjUyMzEzNw==","upper_bound":"MjU1NTkwNA==","repeats":1},{"count":2588672,"lower_bound":"MjU1NTkwNQ==","upper_bound":"MjU4ODY3Mg==","repeats":1},{"count":2621440,"lower_bound":"MjU4ODY3Mw==","upper_bound":"MjYyMTQ0MA==","repeats":1},{"count":2654208,"lower_bound":"MjYyMTQ0MQ==","upper_bound":"MjY1NDIwOA==","repeats":1},{"count":2686976,"lower_bound":"MjY1NDIwOQ==","upper_bound":"MjY4Njk3Ng==","repeats":1},{"count":2719744,"lower_bound":"MjY4Njk3Nw==","upper_bound":"MjcxOTc0NA==","repeats":1},{"count":2752512,"lower_bound":"MjcxOTc0NQ==","upper_bound":"Mjc1MjUxMg==","repeats":1},{"count":2785280,"lower_bound":"Mjc1MjUxMw==","upper_bound":"Mjc4NTI4MA==","repeats":1},{"count":2818048,"lower_bound":"Mjc4NTI4MQ==","upper_bound":"MjgxODA0OA==","repeats":1},{"count":2850816,"lower_bound":"MjgxODA0OQ==","upper_bound":"Mjg1MDgxNg==","repeats":1},{"count":2883584,"lower_bound":"Mjg1MDgxNw==","upper_bound":"Mjg4MzU4NA==","repeats":1},{"count":2916352,"lower_bound":"Mjg4MzU4NQ==","upper_bound":"MjkxNjM1Mg==","repeats":1},{"count":2949120,"lower_bound":"MjkxNjM1Mw==","upper_bound":"Mjk0OTEyMA==","repeats":1},{"count":2981888,"lower_bound":"Mjk0OTEyMQ==","upper_bound":"Mjk4MTg4OA==","repeats":1},{"count":3014656,"lower_bound":"Mjk4MTg4OQ==","upper_bound":"MzAxNDY1Ng==","repeats":1},{"count":3047424,"lower_bound":"MzAxNDY1Nw==","upper_bound":"MzA0NzQyNA==","repeats":1},{"count":3080192,"lower_bound":"MzA0NzQyNQ==","upper_bound":"MzA4MDE5Mg==","repeats":1},{"count":3112960,"lower_bound":"MzA4MDE5Mw==","upper_bound":"MzExMjk2MA==","repeats":1},{"count":3145728,"lower_bound":"MzExMjk2MQ==","upper_bound":"MzE0NTcyOA==","repeats":1},{"count":3178496,"lower_bound":"MzE0NTcyOQ==","upper_bound":"MzE3ODQ5Ng==","repeats":1},{"count":3211264,"lower_bound":"MzE3ODQ5Nw==","upper_bound":"MzIxMTI2NA==","repeats":1},{"count":3244032,"lower_bound":"MzIxMTI2NQ==","upper_bound":"MzI0NDAzMg==","repeats":1},{"count":3276800,"lower_bound":"MzI0NDAzMw==","upper_bound":"MzI3NjgwMA==","repeats":1},{"count":3309568,"lower_bound":"MzI3NjgwMQ==","upper_bound":"MzMwOTU2OA==","repeats":1},{"count":3342336,"lower_bound":"MzMwOTU2OQ==","upper_bound":"MzM0MjMzNg==","repeats":1},{"count":3375104,"lower_bound":"MzM0MjMzNw==","upper_bound":"MzM3NTEwNA==","repeats":1},{"count":3407872,"lower_bound":"MzM3NTEwNQ==","upper_bound":"MzQwNzg3Mg==","repeats":1},{"count":3440640,"lower_bound":"MzQwNzg3Mw==","upper_bound":"MzQ0MDY0MA==","repeats":1},{"count":3473408,"lower_bound":"MzQ0MDY0MQ==","upper_bound":"MzQ3MzQwOA==","repeats":1},{"count":3506176,"lower_bound":"MzQ3MzQwOQ==","upper_bound":"MzUwNjE3Ng==","repeats":1},{"count":3538944,"lower_bound":"MzUwNjE3Nw==","upper_bound":"MzUzODk0NA==","repeats":1},{"count":3571712,"lower_bound":"MzUzODk0NQ==","upper_bound":"MzU3MTcxMg==","repeats":1},{"count":3604480,"lower_bound":"MzU3MTcxMw==","upper_bound":"MzYwNDQ4MA==","repeats":1},{"count":3637248,"lower_bound":"MzYwNDQ4MQ==","upper_bound":"MzYzNzI0OA==","repeats":1},{"count":3670016,"lower_bound":"MzYzNzI0OQ==","upper_bound":"MzY3MDAxNg==","repeats":1},{"count":3702784,"lower_bound":"MzY3MDAxNw==","upper_bound":"MzcwMjc4NA==","repeats":1},{"count":3735552,"lower_bound":"MzcwMjc4NQ==","upper_bound":"MzczNTU1Mg==","repeats":1},{"count":3768320,"lower_bound":"MzczNTU1Mw==","upper_bound":"Mzc2ODMyMA==","repeats":1},{"count":3801088,"lower_bound":"Mzc2ODMyMQ==","upper_bound":"MzgwMTA4OA==","repeats":1},{"count":3833856,"lower_bound":"MzgwMTA4OQ==","upper_bound":"MzgzMzg1Ng==","repeats":1},{"count":3866624,"lower_bound":"MzgzMzg1Nw==","upper_bound":"Mzg2NjYyNA==","repeats":1},{"count":3899392,"lower_bound":"Mzg2NjYyNQ==","upper_bound":"Mzg5OTM5Mg==","repeats":1},{"count":3932160,"lower_bound":"Mzg5OTM5Mw==","upper_bound":"MzkzMjE2MA==","repeats":1},{"count":3964928,"lower_bound":"MzkzMjE2MQ==","upper_bound":"Mzk2NDkyOA==","repeats":1},{"count":3997696,"lower_bound":"Mzk2NDkyOQ==","upper_bound":"Mzk5NzY5Ng==","repeats":1},{"count":4030464,"lower_bound":"Mzk5NzY5Nw==","upper_bound":"NDAzMDQ2NA==","repeats":1},{"count":4063232,"lower_bound":"NDAzMDQ2NQ==","upper_bound":"NDA2MzIzMg==","repeats":1},{"count":4096000,"lower_bound":"NDA2MzIzMw==","upper_bound":"NDA5NjAwMA==","repeats":1},{"count":4128768,"lower_bound":"NDA5NjAwMQ==","upper_bound":"NDEyODc2OA==","repeats":1},{"count":4161536,"lower_bound":"NDEyODc2OQ==","upper_bound":"NDE2MTUzNg==","repeats":1},{"count":4194304,"lower_bound":"NDE2MTUzNw==","upper_bound":"NDE5NDMwNA==","repeats":1},{"count":4227072,"lower_bound":"NDE5NDMwNQ==","upper_bound":"NDIyNzA3Mg==","repeats":1},{"count":4259840,"lower_bound":"NDIyNzA3Mw==","upper_bound":"NDI1OTg0MA==","repeats":1},{"count":4292608,"lower_bound":"NDI1OTg0MQ==","upper_bound":"NDI5MjYwOA==","repeats":1},{"count":4325376,"lower_bound":"NDI5MjYwOQ==","upper_bound":"NDMyNTM3Ng==","repeats":1},{"count":4358144,"lower_bound":"NDMyNTM3Nw==","upper_bound":"NDM1ODE0NA==","repeats":1},{"count":4390912,"lower_bound":"NDM1ODE0NQ==","upper_bound":"NDM5MDkxMg==","repeats":1},{"count":4423680,"lower_bound":"NDM5MDkxMw==","upper_bound":"NDQyMzY4MA==","repeats":1},{"count":4456448,"lower_bound":"NDQyMzY4MQ==","upper_bound":"NDQ1NjQ0OA==","repeats":1},{"count":4489216,"lower_bound":"NDQ1NjQ0OQ==","upper_bound":"NDQ4OTIxNg==","repeats":1},{"count":4521984,"lower_bound":"NDQ4OTIxNw==","upper_bound":"NDUyMTk4NA==","repeats":1},{"count":4554752,"lower_bound":"NDUyMTk4NQ==","upper_bound":"NDU1NDc1Mg==","repeats":1},{"count":4587520,"lower_bound":"NDU1NDc1Mw==","upper_bound":"NDU4NzUyMA==","repeats":1},{"count":4620288,"lower_bound":"NDU4NzUyMQ==","upper_bound":"NDYyMDI4OA==","repeats":1},{"count":4653056,"lower_bound":"NDYyMDI4OQ==","upper_bound":"NDY1MzA1Ng==","repeats":1},{"count":4685824,"lower_bound":"NDY1MzA1Nw==","upper_bound":"NDY4NTgyNA==","repeats":1},{"count":4718592,"lower_bound":"NDY4NTgyNQ==","upper_bound":"NDcxODU5Mg==","repeats":1},{"count":4751360,"lower_bound":"NDcxODU5Mw==","upper_bound":"NDc1MTM2MA==","repeats":1},{"count":4784128,"lower_bound":"NDc1MTM2MQ==","upper_bound":"NDc4NDEyOA==","repeats":1},{"count":4816896,"lower_bound":"NDc4NDEyOQ==","upper_bound":"NDgxNjg5Ng==","repeats":1},{"count":4849664,"lower_bound":"NDgxNjg5Nw==","upper_bound":"NDg0OTY2NA==","repeats":1},{"count":4882432,"lower_bound":"NDg0OTY2NQ==","upper_bound":"NDg4MjQzMg==","repeats":1},{"count":4915200,"lower_bound":"NDg4MjQzMw==","upper_bound":"NDkxNTIwMA==","repeats":1},{"count":4947968,"lower_bound":"NDkxNTIwMQ==","upper_bound":"NDk0Nzk2OA==","repeats":1},{"count":4980736,"lower_bound":"NDk0Nzk2OQ==","upper_bound":"NDk4MDczNg==","repeats":1},{"count":5000000,"lower_bound":"NDk4MDczNw==","upper_bound":"NTAwMDAwMA==","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":410676699462369280,"correlation":0},"b":{"histogram":{"ndv":4999168,"buckets":[{"count":20000,"lower_bound":"MzkzNA==","upper_bound":"MTkyMDY=","repeats":1},{"count":40000,"lower_bound":"MjYzNzY=","upper_bound":"MzIwOTQ=","repeats":1},{"count":60000,"lower_bound":"MzIxNzg=","upper_bound":"NjczMTU=","repeats":1},{"count":80000,"lower_bound":"NzcwNDg=","upper_bound":"ODQ4MDY=","repeats":1},{"count":100000,"lower_bound":"ODY3ODQ=","upper_bound":"MTEwMTA5","repeats":1},{"count":120000,"lower_bound":"MTEwNjEx","upper_bound":"MTIyMzA4","repeats":1},{"count":140000,"lower_bound":"MTI3MzM2","upper_bound":"MTM3NzAz","repeats":1},{"count":160000,"lower_bound":"MTM4NDA1","upper_bound":"MTUwMzAy","repeats":1},{"count":180000,"lower_bound":"MTUyMTkw","upper_bound":"MTY3NTY1","repeats":1},{"count":200000,"lower_bound":"MTcyMDA5","upper_bound":"MTgyNzAw","repeats":1},{"count":220000,"lower_bound":"MTgzNTE0","upper_bound":"MTk4Mzc3","repeats":1},{"count":240000,"lower_bound":"MjE0MzY4","upper_bound":"MjI1MTcx","repeats":1},{"count":260000,"lower_bound":"MjMyMzUz","upper_bound":"MjU3MTU2","repeats":1},{"count":280000,"lower_bound":"MjY1MDIx","upper_bound":"Mjc4ODU4","repeats":1},{"count":300000,"lower_bound":"MjgxMjQ0","upper_bound":"MzE0MTkx","repeats":1},{"count":320000,"lower_bound":"MzE0NTYw","upper_bound":"MzMxNjcy","repeats":1},{"count":340000,"lower_bound":"MzMzMTQ1","upper_bound":"MzQyNzc2","repeats":1},{"count":360000,"lower_bound":"MzQ5ODEw","upper_bound":"Mzg1MTIy","repeats":1},{"count":380000,"lower_bound":"MzkzNzQ5","upper_bound":"NDAzNzA1","repeats":1},{"count":400000,"lower_bound":"NDA1NzI0","upper_bound":"NDEyOTAx","repeats":1},{"count":420000,"lower_bound":"NDE0Nzk1","upper_bound":"NDMxMTQ4","repeats":1},{"count":440000,"lower_bound":"NDM0NzY0","upper_bound":"NDQzODEz","repeats":1},{"count":460000,"lower_bound":"NDUyOTM3","upper_bound":"NDczOTEw","repeats":1},{"count":480000,"lower_bound":"NDk1NjAx","upper_bound":"NTA3NTA3","repeats":1},{"count":500000,"lower_bound":"NTA4NjAz","upper_bound":"NTIzNDcw","repeats":1},{"count":520000,"lower_bound":"NTQ2OTE2","upper_bound":"NTY0NDc4","repeats":1},{"count":540000,"lower_bound":"NTY0NDg2","upper_bound":"NTk2MDkw","repeats":1},{"count":560000,"lower_bound":"NjAyMDI2","upper_bound":"NjIyMzQz","repeats":1},{"count":580000,"lower_bound":"NjMxNDk5","upper_bound":"NjQ3Njcz","repeats":1},{"count":600000,"lower_bound":"NjU0NDY1","upper_bound":"NjY5NjUz","repeats":1},{"count":620000,"lower_bound":"NjcxNTAy","upper_bound":"Njc1MTE3","repeats":1},{"count":640000,"lower_bound":"NjgzOTI1","upper_bound":"NzAwOTY3","repeats":1},{"count":660000,"lower_bound":"NzA1NTEy","upper_bound":"NzI4NTQ4","repeats":1},{"count":680000,"lower_bound":"NzMwMzkz","upper_bound":"NzQyMzcw","repeats":1},{"count":700000,"lower_bound":"NzUyOTE3","upper_bound":"Nzg4Nzg5","repeats":1},{"count":720000,"lower_bound":"ODA5NzUx","upper_bound":"ODI3OTgy","repeats":1},{"count":740000,"lower_bound":"ODQ0MzIw","upper_bound":"ODU0MzQ1","repeats":1},{"count":760000,"lower_bound":"ODU2NTQ1","upper_bound":"ODc1OTU1","repeats":1},{"count":780000,"lower_bound":"ODgwMjg1","upper_bound":"OTE4NDQ5","repeats":1},{"count":800000,"lower_bound":"OTIwMTk1","upper_bound":"OTI2MjUx","repeats":1},{"count":820000,"lower_bound":"OTI3Njg4","upper_bound":"OTQ5MDE4","repeats":1},{"count":840000,"lower_bound":"OTUzMDM2","upper_bound":"OTY4MzAw","repeats":1},{"count":860000,"lower_bound":"OTY4NDI3","upper_bound":"OTg2Nzkw","repeats":1},{"count":880000,"lower_bound":"OTg3NTI1","upper_bound":"OTk1NDE5","repeats":1},{"count":900000,"lower_bound":"OTk4MTYw","upper_bound":"MTAwOTYyNw==","repeats":1},{"count":920000,"lower_bound":"MTAxNzY1NA==","upper_bound":"MTA1NjQwMA==","repeats":1},{"count":940000,"lower_bound":"MTA2MjIyOQ==","upper_bound":"MTA3NjM5NA==","repeats":1},{"count":960000,"lower_bound":"MTA5MTI2MA==","upper_bound":"MTEwMjc4MA==","repeats":1},{"count":980000,"lower_bound":"MTEyMjE3MQ==","upper_bound":"MTEzMDg2Nw==","repeats":1},{"count":1000000,"lower_bound":"MTEzMzE2OQ==","upper_bound":"MTE0MzQxOA==","repeats":1},{"count":1020000,"lower_bound":"MTE0MzUzMg==","upper_bound":"MTE3MDUwMg==","repeats":1},{"count":1040000,"lower_bound":"MTE3NTk4Mg==","upper_bound":"MTE4MjIxNA==","repeats":1},{"count":1060000,"lower_bound":"MTE5Mzc4Mw==","upper_bound":"MTIxOTYzOA==","repeats":1},{"count":1080000,"lower_bound":"MTIyMDIxNg==","upper_bound":"MTIyODM1OA==","repeats":1},{"count":1100000,"lower_bound":"MTIzMjkyMg==","upper_bound":"MTI1NzQxOA==","repeats":1},{"count":1120000,"lower_bound":"MTI2NDk0Nw==","upper_bound":"MTI3NzU2Nw==","repeats":1},{"count":1140000,"lower_bound":"MTI4NDI3NQ==","upper_bound":"MTI5Mzk5Nw==","repeats":1},{"count":1160000,"lower_bound":"MTMwMTY1NA==","upper_bound":"MTMwNTIzMA==","repeats":1},{"count":1180000,"lower_bound":"MTMxMDIxOQ==","upper_bound":"MTMyNTE5Nw==","repeats":1},{"count":1200000,"lower_bound":"MTMzMTUyNA==","upper_bound":"MTMzOTEyMw==","repeats":1},{"count":1220000,"lower_bound":"MTM0MTY1Ng==","upper_bound":"MTM3MjcyOA==","repeats":1},{"count":1240000,"lower_bound":"MTM3MzUwMw==","upper_bound":"MTM5MDA0MQ==","repeats":1},{"count":1260000,"lower_bound":"MTM5Mzk1Mw==","upper_bound":"MTQyMDE4OQ==","repeats":1},{"count":1280000,"lower_bound":"MTQyNDUyMg==","upper_bound":"MTQzODA1Mw==","repeats":1},{"count":1300000,"lower_bound":"MTQ0MDg4MA==","upper_bound":"MTQ0Nzk4MQ==","repeats":1},{"count":1320000,"lower_bound":"MTQ2MjY5OQ==","upper_bound":"MTQ2ODY3MA==","repeats":1},{"count":1340000,"lower_bound":"MTQ3NTE5NA==","upper_bound":"MTQ4NTYwNA==","repeats":1},{"count":1360000,"lower_bound":"MTQ4NjI0NA==","upper_bound":"MTQ5MTM5Ng==","repeats":1},{"count":1380000,"lower_bound":"MTQ5MjI5NA==","upper_bound":"MTUxOTYwOA==","repeats":1},{"count":1400000,"lower_bound":"MTUyMTMwMQ==","upper_bound":"MTUzMzE2Ng==","repeats":1},{"count":1420000,"lower_bound":"MTUzODk1OQ==","upper_bound":"MTU2MzM2Nw==","repeats":1},{"count":1440000,"lower_bound":"MTU2MzkxNw==","upper_bound":"MTU4MTQ3OQ==","repeats":1},{"count":1460000,"lower_bound":"MTU4ODA3Mw==","upper_bound":"MTYwNjgwMg==","repeats":1},{"count":1480000,"lower_bound":"MTYwNjgyNA==","upper_bound":"MTYyMzU0Mg==","repeats":1},{"count":1500000,"lower_bound":"MTYyNzQ2OQ==","upper_bound":"MTYzMzE0Ng==","repeats":1},{"count":1520000,"lower_bound":"MTYzNDM0Mg==","upper_bound":"MTY1MDgxMg==","repeats":1},{"count":1540000,"lower_bound":"MTY1MjgyMw==","upper_bound":"MTY3OTEzMQ==","repeats":1},{"count":1560000,"lower_bound":"MTY5ODI4OQ==","upper_bound":"MTcxMDE1OA==","repeats":1},{"count":1580000,"lower_bound":"MTcxMzUwNg==","upper_bound":"MTcxNzk4NA==","repeats":1},{"count":1600000,"lower_bound":"MTcyMTg4Mw==","upper_bound":"MTczMjgyMA==","repeats":1},{"count":1620000,"lower_bound":"MTczNDE2Nw==","upper_bound":"MTc1MzEyNQ==","repeats":1},{"count":1640000,"lower_bound":"MTc1OTA1MA==","upper_bound":"MTc4MDgwOQ==","repeats":1},{"count":1660000,"lower_bound":"MTc4MTE2Mg==","upper_bound":"MTc4NzI5Mw==","repeats":1},{"count":1680000,"lower_bound":"MTc4ODIxNw==","upper_bound":"MTgwMDMzNQ==","repeats":1},{"count":1700000,"lower_bound":"MTgxMTI1MA==","upper_bound":"MTgxMzkzOQ==","repeats":1},{"count":1720000,"lower_bound":"MTgxNDk4MQ==","upper_bound":"MTgyNDYzNA==","repeats":1},{"count":1740000,"lower_bound":"MTgyNzA2MQ==","upper_bound":"MTgzNTYxNA==","repeats":1},{"count":1760000,"lower_bound":"MTg1OTA5OQ==","upper_bound":"MTg2NDYzOA==","repeats":1},{"count":1780000,"lower_bound":"MTg2NDgyNg==","upper_bound":"MTg4ODc1Mg==","repeats":1},{"count":1800000,"lower_bound":"MTg4OTMwMA==","upper_bound":"MTkwNDQ1Ng==","repeats":1},{"count":1820000,"lower_bound":"MTkxMDM0MA==","upper_bound":"MTkzNTI1Nw==","repeats":1},{"count":1840000,"lower_bound":"MTk0MDExMQ==","upper_bound":"MTk0ODY2OA==","repeats":1},{"count":1860000,"lower_bound":"MTk1MjQ0MA==","upper_bound":"MTk4MTA3Nw==","repeats":1},{"count":1880000,"lower_bound":"MTk5NjU1Nw==","upper_bound":"MjAxODQxMw==","repeats":1},{"count":1900000,"lower_bound":"MjAyNDc3NQ==","upper_bound":"MjA0NzY4Mw==","repeats":1},{"count":1920000,"lower_bound":"MjA0ODE5NA==","upper_bound":"MjA1NzQ1MA==","repeats":1},{"count":1940000,"lower_bound":"MjA2MTY5MA==","upper_bound":"MjA3MTc4OQ==","repeats":1},{"count":1960000,"lower_bound":"MjA3MzQ2MA==","upper_bound":"MjA4MDIwNA==","repeats":1},{"count":1980000,"lower_bound":"MjEwOTM1Ng==","upper_bound":"MjEzMTg5NA==","repeats":1},{"count":2000000,"lower_bound":"MjEzODY1NA==","upper_bound":"MjE1NDY4MA==","repeats":1},{"count":2020000,"lower_bound":"MjE1NTE0OA==","upper_bound":"MjE2NDEwMg==","repeats":1},{"count":2040000,"lower_bound":"MjE2NDg5NQ==","upper_bound":"MjE4MjY5OA==","repeats":1},{"count":2060000,"lower_bound":"MjE4OTU5Ng==","upper_bound":"MjIwNzIwOA==","repeats":1},{"count":2080000,"lower_bound":"MjIxNTAwNg==","upper_bound":"MjI0MTM3NQ==","repeats":1},{"count":2100000,"lower_bound":"MjI0ODM5NQ==","upper_bound":"MjI3MTI4Mg==","repeats":1},{"count":2120000,"lower_bound":"MjI3NzIxNQ==","upper_bound":"MjI5MzE1Ng==","repeats":1},{"count":2140000,"lower_bound":"MjMwMjkzNQ==","upper_bound":"MjMyMDYwMw==","repeats":1},{"count":2160000,"lower_bound":"MjMyNzEwNg==","upper_bound":"MjMzMzY0Mg==","repeats":1},{"count":2180000,"lower_bound":"MjMzOTY0MA==","upper_bound":"MjM1NTUzOQ==","repeats":1},{"count":2200000,"lower_bound":"MjM2MTY5Mw==","upper_bound":"MjM2OTYxMg==","repeats":1},{"count":2220000,"lower_bound":"MjM3MDQwMQ==","upper_bound":"MjM5NjU4Ng==","repeats":1},{"count":2240000,"lower_bound":"MjQwMTM2MQ==","upper_bound":"MjQyMDUwNw==","repeats":1},{"count":2260000,"lower_bound":"MjQyMDgyMw==","upper_bound":"MjQyNjEzOA==","repeats":1},{"count":2280000,"lower_bound":"MjQzMTIwMA==","upper_bound":"MjQ0NzMwNw==","repeats":1},{"count":2300000,"lower_bound":"MjQ0ODk3MA==","upper_bound":"MjQ2NDA1Ng==","repeats":1},{"count":2320000,"lower_bound":"MjQ3Mjk1MQ==","upper_bound":"MjQ5NDQ4OA==","repeats":1},{"count":2340000,"lower_bound":"MjQ5ODE1MQ==","upper_bound":"MjUxMzY2MA==","repeats":1},{"count":2360000,"lower_bound":"MjUxNjMwMA==","upper_bound":"MjUyMTkyNQ==","repeats":1},{"count":2380000,"lower_bound":"MjUyNTc5MQ==","upper_bound":"MjU0NTQ2MQ==","repeats":1},{"count":2400000,"lower_bound":"MjU0NTk3MA==","upper_bound":"MjU2MzY4Mw==","repeats":1},{"count":2420000,"lower_bound":"MjU2NDIzMw==","upper_bound":"MjU4Mjk0OA==","repeats":1},{"count":2440000,"lower_bound":"MjYwMDM2Mw==","upper_bound":"MjYxMTMwMQ==","repeats":1},{"count":2460000,"lower_bound":"MjYxMzM4Mg==","upper_bound":"MjYzMzc0MQ==","repeats":1},{"count":2480000,"lower_bound":"MjY0MDQxMg==","upper_bound":"MjY2MDE4Nw==","repeats":1},{"count":2500000,"lower_bound":"MjY2Mzc5NA==","upper_bound":"MjY3MjUwNA==","repeats":1},{"count":2520000,"lower_bound":"MjY3MzcwMA==","upper_bound":"MjcwMDQ4MQ==","repeats":1},{"count":2540000,"lower_bound":"MjcwMzY3Mw==","upper_bound":"MjcyMTA1Nw==","repeats":1},{"count":2560000,"lower_bound":"MjczMTU4NA==","upper_bound":"Mjc0MDExNQ==","repeats":1},{"count":2580000,"lower_bound":"Mjc0MDU1MA==","upper_bound":"Mjc0OTcxOA==","repeats":1},{"count":2600000,"lower_bound":"Mjc1NzgzNg==","upper_bound":"Mjc3NDMwMw==","repeats":1},{"count":2620000,"lower_bound":"Mjc3NzU4MQ==","upper_bound":"Mjc4NjU2Mg==","repeats":1},{"count":2640000,"lower_bound":"Mjc5MzI5Ng==","upper_bound":"Mjc5NjU1OQ==","repeats":1},{"count":2660000,"lower_bound":"MjgwNTI3OA==","upper_bound":"MjgyMzk4NQ==","repeats":1},{"count":2680000,"lower_bound":"MjgyOTA3OQ==","upper_bound":"MjgzODYzMQ==","repeats":1},{"count":2700000,"lower_bound":"Mjg0MTQyNg==","upper_bound":"Mjg1NjIxMw==","repeats":1},{"count":2720000,"lower_bound":"Mjg2MzE4OQ==","upper_bound":"Mjg2NTczNw==","repeats":1},{"count":2740000,"lower_bound":"Mjg5MDI4Mg==","upper_bound":"MjkwMDIwOQ==","repeats":1},{"count":2760000,"lower_bound":"MjkwNDY4NA==","upper_bound":"MjkyMDI2Ng==","repeats":1},{"count":2780000,"lower_bound":"MjkyMzE0NQ==","upper_bound":"MjkzNTIyNA==","repeats":1},{"count":2800000,"lower_bound":"Mjk0MDA4OA==","upper_bound":"Mjk0OTQyNA==","repeats":1},{"count":2820000,"lower_bound":"Mjk1MDE1Mw==","upper_bound":"Mjk1MzU0MA==","repeats":1},{"count":2840000,"lower_bound":"Mjk1ODY2NQ==","upper_bound":"Mjk2NjA5Mw==","repeats":1},{"count":2860000,"lower_bound":"Mjk2NjMyNQ==","upper_bound":"Mjk3NjA2OQ==","repeats":1},{"count":2880000,"lower_bound":"Mjk4NTg4Nw==","upper_bound":"MzAwMjg3MQ==","repeats":1},{"count":2900000,"lower_bound":"MzAwNDU5Ng==","upper_bound":"MzAyNTYwOA==","repeats":1},{"count":2920000,"lower_bound":"MzAyOTIzMg==","upper_bound":"MzA0NjMzNA==","repeats":1},{"count":2940000,"lower_bound":"MzA1MzE1OQ==","upper_bound":"MzA1NTcxMQ==","repeats":1},{"count":2960000,"lower_bound":"MzA1NTgwMQ==","upper_bound":"MzA2NTY2Nw==","repeats":1},{"count":2980000,"lower_bound":"MzA2NzgyOQ==","upper_bound":"MzA4NTUyNg==","repeats":1},{"count":3000000,"lower_bound":"MzA5MzUyNg==","upper_bound":"MzEwMzg5Nw==","repeats":1},{"count":3020000,"lower_bound":"MzEwNDM0OA==","upper_bound":"MzExNjIyNQ==","repeats":1},{"count":3040000,"lower_bound":"MzExNjc4Nw==","upper_bound":"MzEyNTc3Ng==","repeats":1},{"count":3060000,"lower_bound":"MzEzODE1Mg==","upper_bound":"MzE2NDUxOA==","repeats":1},{"count":3080000,"lower_bound":"MzE2NjIzOQ==","upper_bound":"MzE3ODA4Mg==","repeats":1},{"count":3100000,"lower_bound":"MzE4NDUxNg==","upper_bound":"MzIwMzk0NA==","repeats":1},{"count":3120000,"lower_bound":"MzIxMjYwMg==","upper_bound":"MzIzNzQ5NA==","repeats":1},{"count":3140000,"lower_bound":"MzIzODIwNw==","upper_bound":"MzI2MDA5Nw==","repeats":1},{"count":3160000,"lower_bound":"MzI2MzI3NQ==","upper_bound":"MzI3NTMxNA==","repeats":1},{"count":3180000,"lower_bound":"MzI4NDE5OA==","upper_bound":"MzMxMjc0Ng==","repeats":1},{"count":3200000,"lower_bound":"MzMxNDQwMQ==","upper_bound":"MzMyNzI3MA==","repeats":1},{"count":3220000,"lower_bound":"MzMzMTcyNg==","upper_bound":"MzM0MzE0MA==","repeats":1},{"count":3240000,"lower_bound":"MzM0NDkxNg==","upper_bound":"MzM0Nzg5Mg==","repeats":1},{"count":3260000,"lower_bound":"MzM1Mjk2NA==","upper_bound":"MzM1NzUzNw==","repeats":1},{"count":3280000,"lower_bound":"MzM1NzcwMw==","upper_bound":"MzM4ODk4MA==","repeats":1},{"count":3300000,"lower_bound":"MzQwMDAxMg==","upper_bound":"MzQwOTk5NA==","repeats":1},{"count":3320000,"lower_bound":"MzQxMjg0NA==","upper_bound":"MzQzMTEyNg==","repeats":1},{"count":3340000,"lower_bound":"MzQzODE1Mw==","upper_bound":"MzQ1MzMxOQ==","repeats":1},{"count":3360000,"lower_bound":"MzQ1MzUyNA==","upper_bound":"MzQ3NTgzMg==","repeats":1},{"count":3380000,"lower_bound":"MzQ3Njc3MQ==","upper_bound":"MzQ4MjI5Nw==","repeats":1},{"count":3400000,"lower_bound":"MzQ5NzI0Mg==","upper_bound":"MzUwNTAwMw==","repeats":1},{"count":3420000,"lower_bound":"MzUwNzkwNA==","upper_bound":"MzU0MDQ0NA==","repeats":1},{"count":3440000,"lower_bound":"MzU0NjE0Mw==","upper_bound":"MzU2MTYzMA==","repeats":1},{"count":3460000,"lower_bound":"MzU3Mzg4Mg==","upper_bound":"MzU5NjUyMQ==","repeats":1},{"count":3480000,"lower_bound":"MzYwMjIyMw==","upper_bound":"MzYxNTc3Nw==","repeats":1},{"count":3500000,"lower_bound":"MzYyMzAxNg==","upper_bound":"MzYzMDQyOQ==","repeats":1},{"count":3520000,"lower_bound":"MzYzOTUyMg==","upper_bound":"MzY2MzgyMA==","repeats":1},{"count":3540000,"lower_bound":"MzY2NTI3Nw==","upper_bound":"MzY3ODk2MQ==","repeats":1},{"count":3560000,"lower_bound":"MzY4MDA3Mg==","upper_bound":"MzY5MzA1OQ==","repeats":1},{"count":3580000,"lower_bound":"MzY5OTEzMA==","upper_bound":"MzcwNTE4OQ==","repeats":1},{"count":3600000,"lower_bound":"MzcwNTQ0OA==","upper_bound":"MzcxODE5MA==","repeats":1},{"count":3620000,"lower_bound":"MzcyMjI1MA==","upper_bound":"MzczMjc4OQ==","repeats":1},{"count":3640000,"lower_bound":"Mzc0MTM2OQ==","upper_bound":"Mzc1NDMxNg==","repeats":1},{"count":3660000,"lower_bound":"Mzc2MTEzOQ==","upper_bound":"Mzc3MTg2Nw==","repeats":1},{"count":3680000,"lower_bound":"Mzc3ODE0MA==","upper_bound":"Mzc4NTc5NA==","repeats":1},{"count":3700000,"lower_bound":"Mzc5MTE2MA==","upper_bound":"MzgwOTU4Nw==","repeats":1},{"count":3720000,"lower_bound":"MzgxNjcxOA==","upper_bound":"MzgyNzI3Nw==","repeats":1},{"count":3740000,"lower_bound":"MzgyNzgyMQ==","upper_bound":"Mzg0MTIwOQ==","repeats":1},{"count":3760000,"lower_bound":"Mzg0MTcwNg==","upper_bound":"Mzg1MjAyNA==","repeats":1},{"count":3780000,"lower_bound":"Mzg1MjMxMQ==","upper_bound":"Mzg2NjMyMQ==","repeats":1},{"count":3800000,"lower_bound":"Mzg3MDMxMw==","upper_bound":"Mzg5MTE3MA==","repeats":1},{"count":3820000,"lower_bound":"MzkwMjAwNQ==","upper_bound":"MzkyNjExMg==","repeats":1},{"count":3840000,"lower_bound":"MzkzNDE1MQ==","upper_bound":"Mzk1Mjc1Ng==","repeats":1},{"count":3860000,"lower_bound":"Mzk2NTY5Nw==","upper_bound":"Mzk4MzkyNQ==","repeats":1},{"count":3880000,"lower_bound":"Mzk4NzU1Mw==","upper_bound":"NDAwMzg5NQ==","repeats":1},{"count":3900000,"lower_bound":"NDAwNDE2Mw==","upper_bound":"NDAxNzAxMA==","repeats":1},{"count":3920000,"lower_bound":"NDAyMzA1NA==","upper_bound":"NDAyOTY1MA==","repeats":1},{"count":3940000,"lower_bound":"NDAzMTMxNQ==","upper_bound":"NDAzOTcwNA==","repeats":1},{"count":3960000,"lower_bound":"NDA0NDI0NQ==","upper_bound":"NDA1Mjk4MA==","repeats":1},{"count":3980000,"lower_bound":"NDA1NDg0NA==","upper_bound":"NDA3ODc1OA==","repeats":1},{"count":4000000,"lower_bound":"NDA4NDg4Ng==","upper_bound":"NDA5NTY4OA==","repeats":1},{"count":4020000,"lower_bound":"NDA5OTk2Nw==","upper_bound":"NDEzMTQ1Mg==","repeats":1},{"count":4040000,"lower_bound":"NDEzNjcwNg==","upper_bound":"NDE0NTI5NA==","repeats":1},{"count":4060000,"lower_bound":"NDE0NTk1NA==","upper_bound":"NDE1MzA5MQ==","repeats":1},{"count":4080000,"lower_bound":"NDE1NjkyOQ==","upper_bound":"NDE5MjQxNA==","repeats":1},{"count":4100000,"lower_bound":"NDE5MzI0NQ==","upper_bound":"NDE5ODk1OA==","repeats":1},{"count":4120000,"lower_bound":"NDIyMDQ1MQ==","upper_bound":"NDIyOTcxNA==","repeats":1},{"count":4140000,"lower_bound":"NDIzNDQ1OA==","upper_bound":"NDI0ODQwOA==","repeats":1},{"count":4160000,"lower_bound":"NDI0OTUwMw==","upper_bound":"NDI3Njc3OA==","repeats":1},{"count":4180000,"lower_bound":"NDI4MzI5NA==","upper_bound":"NDI5NTI2MA==","repeats":1},{"count":4200000,"lower_bound":"NDI5NTc0OQ==","upper_bound":"NDMwMjI5MA==","repeats":1},{"count":4220000,"lower_bound":"NDMwNjM4Mw==","upper_bound":"NDMxNDQxOQ==","repeats":1},{"count":4240000,"lower_bound":"NDMxNTIwNw==","upper_bound":"NDMzNTA1Mw==","repeats":1},{"count":4260000,"lower_bound":"NDMzNjk3OQ==","upper_bound":"NDM0MTE1OA==","repeats":1},{"count":4280000,"lower_bound":"NDM0MTIzOA==","upper_bound":"NDM0NTkwMQ==","repeats":1},{"count":4300000,"lower_bound":"NDM0OTUxOQ==","upper_bound":"NDM2NzA0Mw==","repeats":1},{"count":4320000,"lower_bound":"NDM4MDcyMg==","upper_bound":"NDM5Njg4Mw==","repeats":1},{"count":4340000,"lower_bound":"NDQwNTU4NA==","upper_bound":"NDQzMTA4MQ==","repeats":1},{"count":4360000,"lower_bound":"NDQzMTY4Nw==","upper_bound":"NDQ0MzYyNQ==","repeats":1},{"count":4380000,"lower_bound":"NDQ1MjEwMA==","upper_bound":"NDQ1NTc2Ng==","repeats":1},{"count":4400000,"lower_bound":"NDQ3MjA4Mw==","upper_bound":"NDQ4NTgzOA==","repeats":1},{"count":4420000,"lower_bound":"NDQ4ODA4Ng==","upper_bound":"NDUwOTY0Mw==","repeats":1},{"count":4440000,"lower_bound":"NDUyNDcyNw==","upper_bound":"NDUzNTk0NQ==","repeats":1},{"count":4460000,"lower_bound":"NDUzNzkyMA==","upper_bound":"NDU1MTQwMg==","repeats":1},{"count":4480000,"lower_bound":"NDU1MTg0MQ==","upper_bound":"NDU1NTgxNg==","repeats":1},{"count":4500000,"lower_bound":"NDU2OTQ1Mg==","upper_bound":"NDU3NTkxNQ==","repeats":1},{"count":4520000,"lower_bound":"NDU3NzIxNg==","upper_bound":"NDU5MzU0Ng==","repeats":1},{"count":4540000,"lower_bound":"NDU5ODI1MA==","upper_bound":"NDYwNjk2NA==","repeats":1},{"count":4560000,"lower_bound":"NDYxMTI4MA==","upper_bound":"NDYyNjc4NA==","repeats":1},{"count":4580000,"lower_bound":"NDY1MTQxOQ==","upper_bound":"NDY3NDA1MQ==","repeats":1},{"count":4600000,"lower_bound":"NDY3NTI0OA==","upper_bound":"NDY5NDIwMQ==","repeats":1},{"count":4620000,"lower_bound":"NDcwMDAxMQ==","upper_bound":"NDcwODI3OQ==","repeats":1},{"count":4640000,"lower_bound":"NDcwOTQ3MQ==","upper_bound":"NDcxODM5OA==","repeats":1},{"count":4660000,"lower_bound":"NDczNzYxNA==","upper_bound":"NDc0NTQ0OQ==","repeats":1},{"count":4680000,"lower_bound":"NDc1MjU1Nw==","upper_bound":"NDc2MTIxNA==","repeats":1},{"count":4700000,"lower_bound":"NDc2NDExMQ==","upper_bound":"NDc3MDQwOQ==","repeats":1},{"count":4720000,"lower_bound":"NDc3MTkzNw==","upper_bound":"NDc3NDI0Ng==","repeats":1},{"count":4740000,"lower_bound":"NDc3NTU0Mw==","upper_bound":"NDc4MzgzOQ==","repeats":1},{"count":4760000,"lower_bound":"NDc5MDk0NA==","upper_bound":"NDgwMjQ0Mw==","repeats":1},{"count":4780000,"lower_bound":"NDgwMzg3Mw==","upper_bound":"NDgyMTYzNw==","repeats":1},{"count":4800000,"lower_bound":"NDgyNzcwMw==","upper_bound":"NDgzNjI5NA==","repeats":1},{"count":4820000,"lower_bound":"NDg0MDM0OA==","upper_bound":"NDg0NjIxNw==","repeats":1},{"count":4840000,"lower_bound":"NDg0NzI4Mg==","upper_bound":"NDg2MDc2Nw==","repeats":1},{"count":4860000,"lower_bound":"NDg2MDg2OQ==","upper_bound":"NDg3MTg5OA==","repeats":1},{"count":4880000,"lower_bound":"NDg3MzE3Nw==","upper_bound":"NDg5NjU5NQ==","repeats":1},{"count":4900000,"lower_bound":"NDg5OTk4Ng==","upper_bound":"NDkxNDEzMw==","repeats":1},{"count":4920000,"lower_bound":"NDkxNTkzOQ==","upper_bound":"NDkzNTU0Nw==","repeats":1},{"count":4940000,"lower_bound":"NDkzNjA3MQ==","upper_bound":"NDk0MTMxNg==","repeats":1},{"count":4960000,"lower_bound":"NDk0NDQ0MA==","upper_bound":"NDk2MDQ5MQ==","repeats":1},{"count":4980000,"lower_bound":"NDk2MDk4NQ==","upper_bound":"NDk3Mjg2OA==","repeats":1},{"count":5000000,"lower_bound":"NDk4NjYyMQ==","upper_bound":"NDk5Mzk5MQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2440,2365,2430,2467,2437,2389,2488,2439,2454,2473,2485,2454,2499,2371,2370,2498,2444,2437,2492,2377,2551,2484,2410,2511,2492,2351,2475,2387,2438,2441,2380,2442,2374,2455,2488,2385,2402,2483,2439,2483,2496,2395,2489,2436,2331,2385,2440,2405,2347,2450,2502,2344,2443,2461,2362,2286,2522,2402,2425,2473,2416,2497,2425,2392,2398,2418,2421,2434,2466,2377,2291,2446,2452,2471,2500,2490,2506,2416,2381,2398,2438,2450,2544,2468,2445,2505,2426,2449,2418,2481,2403,2336,2436,2471,2432,2402,2461,2406,2511,2433,2462,2417,2396,2387,2451,2446,2463,2457,2371,2496,2327,2458,2428,2392,2440,2508,2424,2472,2510,2474,2412,2397,2464,2411,2441,2448,2458,2415,2400,2464,2398,2546,2386,2473,2473,2483,2571,2424,2472,2443,2416,2409,2439,2470,2432,2376,2326,2437,2367,2398,2437,2485,2458,2432,2487,2438,2405,2658,2413,2447,2484,2463,2376,2416,2402,2441,2502,2388,2465,2350,2436,2412,2440,2396,2526,2477,2517,2472,2514,2431,2434,2437,2431,2449,2344,2423,2377,2440,2432,2395,2487,2474,2503,2411,2437,2474,2401,2371,2418,2362,2470,2450,2402,2538,2368,2505,2463,2436,2483,2442,2409,2480,2494,2503,2419,2468,2365,2430,2404,2389,2493,2437,2481,2465,2375,2521,2484,2446,2453,2510,2529,2442,2447,2531,2469,2363,2489,2425,2413,2502,2482,2399,2374,2461,2443,2462,2413,2403,2415,2445,2424,2533,2471,2352,2430,2290,2480,2480,2451,2444,2437,2517,2362,2422,2435,2402,2521,2382,2486,2441,2445,2408,2407,2478,2413,2499,2437,2434,2472,2353,2437,2600,2369,2438,2444,2385,2398,2386,2387,2409,2425,2428,2371,2469,2387,2449,2436,2459,2391,2372,2301,2419,2473,2438,2493,2375,2450,2449,2479,2466,2452,2357,2363,2599,2433,2439,2442,2431,2471,2377,2471,2427,2429,2412,2360,2370,2394,2394,2421,2436,2387,2454,2499,2408,2347,2328,2355,2410,2338,2519,2436,2461,2422,2421,2412,2459,2429,2451,2370,2353,2459,2433,2395,2504,2408,2477,2458,2497,2516,2531,2353,2388,2339,2439,2413,2390,2451,2445,2448,2440,2439,2425,2448,2367,2416,2434,2352,2519,2435,2525,2431,2403,2447,2465,2532,2408,2395,2432,2432,2425,2447,2370,2404,2385,2366,2454,2485,2376,2309,2409,2466,2448,2438,2425,2457,2417,2422,2436,2399,2300,2453,2440,2452,2416,2386,2374,2502,2433,2443,2555,2390,2377,2429,2446,2457,2459,2390,2378,2430,2437,2382,2443,2431,2457,2493,2385,2416,2567,2350,2442,2463,2377,2471,2453,2374,2541,2430,2453,2438,2465,2406,2394,2391,2437,2341,2489,2493,2512,2380,2447,2379,2531,2437,2431,2377,2432,2442,2404,2528,2453,2362,2473,2457,2496,2379,2431,2451,2448,2430,2406,2479,2431,2451,2452,2450,2430,2444,2480,2411,2462,2434,2411,2476,2436,2448,2384,2443,2482,2510,2337,2434,2397,2546,2484,2437,2436,2457,2360,2406,2324,2485,2423,2395,2473,2406,2418,2447,2366,2461,2461,2437,2524,2392,2434,2499,2469,2400,2473,2532,2453,2497,2375,2522,2382,2471,2434,2410,2390,2436,2455,2414,2371,2502,2387,2475,2434,2393,2404,2462,2585,2435,2405,2356,2471,2430,2401,2479,2395,2396,2375,2383,2483,2455,2445,2471,2425,2458,2471,2470,2480,2454,2379,2353,2421,2394,2415,2367,2428,2535,2436,2382,2467,2475,2512,2526,2424,2415,2467,2405,2492,2505,2327,2443,2557,2448,2470,2437,2420,2455,2402,2429,2466,2468,2511,2531,2432,2473,2402,2369,2398,2406,2474,2504,2474,2431,2482,2425,2451,2449,2469,2435,2433,2387,2470,2432,2464,2313,2517,2417,2374,2419,2441,2467,2444,2426,2501,2446,2462,2376,2441,2388,2410,2429,2391,2368,2465,2397,2432,2415,2456,2451,2467,2388,2435,2465,2458,2427,2437,2418,2446,2472,2417,2316,2438,2492,2435,2419,2425,2471,2448,2405,2381,2463,2421,2424,2283,2457,2564,2482,2339,2417,2405,2386,2285,2379,2432,2474,2436,2442,2379,2388,2418,2466,2436,2436,2510,2456,2431,2476,2395,2437,2356,2383,2441,2508,2484,2447,2454,2451,2496,2452,2456,2482,2426,2417,2461,2385,2423,2481,2438,2417,2542,2390,2344,2453,2421,2478,2518,2504,2364,2397,2358,2471,2408,2426,2397,2388,2511,2465,2397,2395,2436,2410,2478,2416,2377,2450,2424,2464,2447,2427,2350,2343,2421,2506,2440,2476,2431,2367,2473,2421,2405,2408,2426,2351,2483,2437,2414,2373,2439,2437,2418,2388,2486,2436,2494,2438,2454,2351,2354,2512,2427,2391,2429,2483,2425,2410,2410,2501,2580,2410,2442,2472,2563,2480,2471,2440,2387,2616,2466,2509,2436,2409,2503,2362,2540,2440,2468,2427,2402,2452,2546,2437,2380,2389,2390,2314,2491,2389,2511,2378,2415,2401,2494,2400,2380,2412,2362,2455,2436,2499,2368,2398,2438,2466,2487,2443,2474,2369,2407,2477,2538,2421,2437,2393,2539,2382,2489,2470,2371,2476,2425,2472,2396,2413,2572,2432,2372,2426,2442,2511,2415,2502,2376,2473,2461,2418,2497,2443,2432,2472,2366,2536,2492,2476,2488,2416,2398,2466,2405,2438,2437,2365,2413,2352,2406,2435,2318,2445,2371,2434,2401,2483,2408,2422,2365,2423,2423,2461,2504,2455,2479,2404,2446,2377,2468,2569,2442,2365,2463,2388,2536,2468,2433,2421,2448,2438,2534,2392,2530,2410,2497,2453,2405,2423,2392,2469,2430,2425,2438,2358,2413,2535,2438,2478,2484,2469,2388,2374,2398,2470,2443,2448,2498,2484,2402,2475,2391,2340,2462,2411,2441,2426,2475,2415,2473,2448,2421,2433,2450,2441,2400,2433,2482,2429,2438,2436,2455,2436,2411,2457,2431,2442,2359,2491,2455,2495,2431,2491,2431,2379,2414,2395,2433,2445,2342,2482,2474,2407,2445,2273,2471,2394,2519,2379,2505,2415,2462,2437,2366,2464,2396,2453,2503,2440,2440,2495,2395,2479,2288,2342,2383,2526,2452,2414,2392,2434,2449,2472,2412,2462,2392,2349,2378,2452,2370,2325,2498,2481,2420,2420,2455,2399,2462,2477,2435,2461,2448,2457,2541,2445,2437,2445,2464,2436,2412,2358,2459,2436,2429,2415,2434,2469,2387,2374,2508,2445,2504,2476,2344,2442,2440,2440,2466,2415,2448,2466,2498,2409,2440,2508,2392,2395,2403,2436,2429,2464,2475,2428,2364,2409,2392,2456,2440,2502,2437,2430,2419,2394,2504,2399,2405,2436,2389,2322,2415,2452,2524,2436,2370,2438,2444,2420,2467,2423,2438,2403,2434,2449,2382,2346,2439,2391,2362,2469,2487,2410,2462,2357,2439,2551,2482,2488,2442,2429,2462,2437,2482,2436,2398,2411,2439,2436,2466,2428,2415,2379,2364,2418,2532,2419,2509,2437,2437,2510,2399,2379,2371,2449,2368,2400,2398,2493,2434,2484,2379,2434,2411,2453,2468,2365,2410,2481,2415,2490,2412,2479,2345,2462,2455,2376,2439,2562,2393,2475,2471,2606,2429,2472,2439,2531,2456,2454,2362,2426,2503,2406,2534,2414,2484,2387,2360,2431,2516,2514,2417,2398,2468,2446,2438,2452,2436,2472,2416,2430,2397,2427,2437,2419,2429,2557,2450,2358,2439,2417,2513,2437,2438,2427,2542,2438,2433,2417,2478,2512,2445,2440,2406,2379,2489,2390,2534,2411,2416,2451,2417,2447,2517,2409,2395,2411,2427,2430,2401,2412,2417,2373,2454,2414,2460,2392,2542,2399,2497,2374,2337,2441,2408,2472,2478,2399,2475,2420,2440,2451,2416,2438,2437,2420,2438,2355,2362,2450,2546,2466,2494,2526,2437,2421,2449,2419,2468,2430,2436,2444,2418,2444,2474,2400,2409,2515,2535,2508,2445,2426,2387,2377,2356,2356,2439,2470,2387,2468,2472,2521,2447,2372,2439,2404,2450,2406,2493,2372,2356,2519,2309,2390,2348,2408,2437,2405,2332,2462,2290,2470,2388,2427,2490,2369,2495,2466,2477,2492,2397,2334,2534,2485,2373,2435,2480,2341,2469,2388,2457,2410,2427,2436,2416,2437,2423,2414,2436,2397,2392,2448,2470,2438,2485,2436,2479,2498,2328,2472,2427,2382,2552,2454,2578,2433,2437,2441,2471,2378,2466,2392,2439,2409,2410,2409,2452,2494,2433,2314,2446,2409,2434,2424,2438,2470,2406,2462,2458,2607,2330,2426,2506,2369,2401,2440,2426,2381,2433,2483,2439,2474,2426,2443,2443,2361,2438,2426,2487,2473,2474,2409,2415,2315,2394,2474,2366,2336,2430,2412,2439,2359,2435,2451,2410,2414,2423,2434,2478,2428,2415,2356,2437,2336,2423,2412,2426,2454,2439,2452,2480,2449,2330,2464,2478,2452,2462,2404,2455,2511,2440,2500,2428,2422,2473,2416,2417,2494,2465,2490,2391,2354,2427,2448,2465,2483,2468,2381,2436,2459,2470,2560,2388,2441,2432,2399,2450,2418,2453,2422,2437,2404,2419,2468,2440,2446,2349,2428,2451,2525,2487,2521,2416,2407,2481,2453,2432,2351,2534,2381,2473,2455,2385,2404,2351,2499,2411,2507,2398,2414,2389,2289,2422,2479,2415,2397,2432,2386,2391,2425,2374,2441,2440,2424,2504,2477,2402,2469,2438,2414,2388,2512,2439,2494,2438,2434,2493,2428,2449,2437,2488,2435,2436,2437,2455,2495,2438,2443,2366,2358,2493,2473,2394,2376,2437,2388,2446,2449,2492,2437,2462,2465,2442,2437,2422,2419,2459,2363,2369,2483,2450,2496,2389,2402,2405,2440,2401,2405,2415,2413,2461,2439,2479,2416,2418,2396,2490,2490,2519,2470,2448,2443,2458,2494,2473,2436,2683,2459,2414,2473,2370,2475,2456,2473,2425,2423,2368,2470,2337,2439,2354,2440,2458,2533,2426,2460,2415,2418,2461,2498,2475,2467,2366,2369,2536,2479,2438,2472,2484,2369,2464,2434,2500,2407,2505,2373,2458,2396,2496,2444,2482,2470,2374,2422,2408,2363,2441,2410,2497,2484,2326,2524,2371,2478,2358,2463,2403,2415,2392,2384,2448,2371,2517,2381,2416,2373,2395,2384,2454,2440,2394,2386,2512,2359,2464,2443,2475,2394,2441,2425,2404,2461,2403,2356,2370,2493,2370,2501,2461,2524,2488,2357,2556,2453,2471,2476,2453,2420,2463,2453,2517,2443,2425,2438,2419,2466,2395,2410,2470,2414,2413,2339,2430,2440,2394,2429,2468,2361,2369,2465,2370,2481,2449,2404,2482,2436,2423,2457,2460,2419,2407,2485,2420,2501,2371,2326,2416,2388,2390,2425,2437,2421,2409,2419,2421,2469,2394,2519,2464,2463,2393,2346,2446,2465,2401,2447,2382,2433,2505,2430,2482,2413,2409,2490,2438,2445,2410,2450,2492,2490,2393,2412,2479,2426,2403,2437,2399,2494,2426,2486,2364,2401,2483,2436,2445,2453,2456,2425,2503,2395,2415,2442,2374,2404,2466,2465,2424,2361,2416,2469,2424,2418,2420,2484,2439,2484,2412,2409,2498,2473,2405,2509,2570,2439,2418,2442,2408,2441,2487,2465,2394,2383,2405,2413,2391,2378,2346,2430,2452,2377,2475,2424,2406,2312,2512,2399,2460,2436,2487,2508,2446,2354,2430,2402,2482,2502,2390,2455,2420,2295,2422,2475,2451,2363,2468,2469,2461,2435,2442,2552,2412,2438,2482,2442,2503,2421,2462,2379,2420,2436,2448,2435,2388,2369,2385,2436,2403,2424,2447,2414,2440,2440,2401,2455,2345,2504,2436,2452,2479,2440,2317,2416,2433,2469,2488,2425,2408,2482,2457,2488,2403,2481,2412,2432,2545,2482,2422,2492,2462,2506,2488,2424,2478,2361,2409,2403,2465,2424,2437,2437,2412,2444,2487,2440,2460,2495,2486,2482,2444,2506,2502,2408,2488,2483,2464,2437,2304,2313,2479,2490,2460,2379,2465,2497,2563,2388,2451,2544,2510,2440,2414,2437,2334,2518,2362,2346,2456,2487,2468,2463,2372,2487,2422,2467,2452,2421,2462,2356,2383,2413,2440,2464,2412,2469,2439,2447,2457,2445,2351,2462,2485,2435,2495,2413,2456,2383,2465,2483,2464,2386,2456,2494,2355,2463,2445,2498,2449,2363,2412,2540,2367,2466,2404,2410,2440,2405,2459,2365,2500,2366,2386,2502,2436,2427,2582,2386,2477,2481,2488,2371,2513,2395,2413,2476,2251,2469,2414,2493,2466,2453,2437,2416,2438,2393,2391,2497,2440,2430,2439,2494,2471,2370,2503,2371,2412]},{"counters":[2437,2350,2411,2405,2376,2446,2421,2416,2416,2413,2427,2452,2426,2347,2468,2438,2407,2452,2449,2383,2422,2436,2464,2399,2473,2366,2425,2503,2436,2466,2494,2397,2390,2461,2342,2404,2432,2437,2393,2360,2456,2481,2445,2437,2392,2413,2470,2426,2327,2424,2385,2380,2461,2431,2415,2370,2495,2442,2454,2485,2449,2392,2426,2345,2439,2472,2489,2455,2296,2333,2478,2410,2415,2441,2444,2542,2491,2525,2502,2431,2382,2508,2447,2405,2437,2415,2466,2436,2476,2270,2467,2546,2419,2486,2388,2449,2468,2361,2366,2442,2479,2386,2485,2459,2411,2416,2419,2530,2403,2526,2497,2349,2441,2391,2449,2378,2407,2458,2472,2487,2461,2456,2498,2426,2507,2505,2486,2355,2437,2429,2392,2417,2449,2436,2423,2482,2402,2372,2358,2425,2449,2394,2388,2458,2501,2407,2439,2504,2385,2421,2501,2562,2438,2412,2389,2391,2399,2381,2389,2409,2517,2443,2420,2404,2414,2468,2424,2435,2488,2479,2522,2521,2442,2412,2491,2436,2427,2477,2411,2443,2515,2475,2388,2394,2480,2526,2453,2376,2508,2372,2488,2462,2443,2404,2375,2417,2434,2512,2413,2437,2478,2426,2544,2413,2469,2440,2374,2387,2493,2479,2349,2349,2449,2443,2443,2465,2386,2513,2493,2601,2384,2419,2392,2455,2441,2437,2525,2461,2427,2412,2375,2404,2332,2420,2389,2376,2418,2452,2480,2516,2474,2368,2310,2506,2492,2441,2460,2466,2436,2507,2527,2341,2440,2378,2425,2430,2446,2404,2368,2469,2484,2447,2409,2454,2467,2426,2478,2337,2439,2356,2430,2473,2499,2444,2445,2572,2443,2444,2483,2473,2364,2452,2627,2389,2427,2473,2520,2369,2392,2424,2448,2357,2366,2442,2439,2474,2462,2428,2375,2409,2433,2485,2461,2480,2406,2404,2433,2438,2397,2370,2438,2510,2324,2449,2368,2459,2425,2340,2521,2440,2545,2371,2406,2514,2427,2435,2423,2352,2505,2515,2452,2440,2381,2441,2323,2424,2401,2417,2412,2436,2443,2491,2449,2429,2451,2478,2494,2436,2439,2460,2420,2475,2407,2371,2477,2438,2342,2437,2481,2469,2439,2452,2410,2462,2468,2424,2427,2491,2483,2417,2455,2478,2390,2441,2449,2465,2485,2437,2410,2379,2345,2547,2417,2435,2506,2431,2408,2474,2518,2421,2376,2518,2475,2405,2415,2373,2392,2338,2458,2443,2433,2521,2485,2391,2472,2358,2431,2321,2465,2428,2443,2442,2335,2373,2383,2438,2417,2463,2405,2436,2406,2561,2402,2435,2408,2379,2421,2378,2384,2402,2436,2386,2432,2369,2423,2394,2471,2390,2383,2384,2285,2432,2480,2489,2441,2445,2426,2407,2449,2405,2521,2500,2389,2380,2452,2436,2414,2436,2498,2438,2465,2446,2436,2429,2313,2470,2441,2465,2465,2447,2525,2439,2391,2403,2392,2448,2376,2412,2513,2438,2445,2445,2442,2462,2413,2436,2497,2432,2433,2392,2508,2461,2433,2474,2386,2411,2442,2364,2386,2417,2389,2321,2390,2529,2353,2415,2436,2525,2441,2430,2340,2419,2514,2450,2429,2504,2356,2438,2402,2416,2382,2411,2462,2461,2396,2459,2356,2342,2421,2503,2439,2451,2369,2465,2458,2417,2440,2447,2437,2519,2412,2406,2445,2416,2442,2456,2419,2407,2436,2485,2446,2456,2355,2443,2458,2418,2471,2420,2481,2486,2390,2415,2461,2432,2483,2379,2440,2441,2378,2483,2446,2343,2381,2414,2418,2378,2389,2420,2447,2439,2412,2553,2437,2404,2342,2439,2487,2426,2483,2463,2463,2401,2464,2419,2438,2451,2504,2424,2423,2426,2443,2427,2434,2548,2466,2499,2415,2440,2340,2329,2453,2469,2416,2420,2436,2391,2360,2451,2437,2465,2495,2520,2418,2474,2359,2470,2438,2471,2455,2414,2414,2441,2365,2426,2403,2442,2418,2366,2356,2439,2455,2431,2471,2538,2442,2463,2428,2429,2420,2425,2381,2433,2414,2372,2429,2382,2509,2348,2392,2475,2408,2447,2456,2463,2470,2392,2503,2504,2514,2446,2433,2474,2381,2481,2472,2475,2394,2443,2358,2538,2461,2418,2482,2400,2445,2438,2505,2473,2556,2413,2436,2380,2504,2446,2392,2425,2394,2413,2422,2375,2447,2458,2368,2535,2406,2438,2440,2489,2438,2454,2439,2399,2455,2428,2391,2408,2447,2337,2501,2557,2496,2391,2423,2422,2415,2437,2487,2483,2436,2429,2559,2385,2431,2535,2493,2383,2444,2396,2509,2537,2484,2444,2429,2327,2440,2336,2464,2394,2382,2427,2477,2485,2412,2494,2394,2464,2431,2434,2476,2411,2467,2468,2466,2437,2414,2405,2367,2469,2400,2540,2482,2440,2417,2388,2395,2482,2363,2475,2493,2390,2504,2490,2411,2382,2421,2461,2438,2356,2424,2381,2436,2440,2417,2407,2482,2444,2455,2447,2470,2379,2534,2422,2376,2448,2430,2473,2419,2441,2428,2513,2440,2489,2432,2488,2418,2455,2425,2392,2448,2478,2423,2446,2529,2454,2438,2509,2440,2504,2423,2465,2428,2442,2449,2446,2228,2446,2512,2396,2414,2443,2394,2423,2510,2462,2439,2513,2493,2430,2555,2397,2345,2446,2354,2391,2481,2472,2442,2540,2477,2413,2399,2384,2391,2461,2390,2493,2492,2504,2391,2440,2441,2406,2471,2425,2494,2320,2371,2448,2430,2437,2521,2400,2451,2489,2355,2437,2602,2454,2410,2443,2419,2437,2349,2456,2475,2437,2449,2426,2355,2483,2488,2375,2434,2387,2425,2428,2378,2440,2419,2446,2416,2504,2477,2431,2534,2438,2521,2438,2475,2367,2386,2466,2437,2451,2468,2474,2383,2434,2440,2336,2437,2499,2464,2386,2372,2515,2405,2546,2560,2507,2501,2358,2466,2529,2441,2437,2325,2433,2462,2420,2363,2480,2359,2501,2429,2515,2457,2420,2398,2502,2540,2420,2474,2533,2415,2491,2437,2416,2519,2480,2421,2508,2445,2499,2544,2494,2426,2421,2462,2439,2311,2455,2439,2446,2478,2514,2507,2383,2437,2473,2437,2426,2443,2542,2467,2396,2414,2429,2304,2430,2367,2461,2431,2375,2447,2404,2477,2412,2369,2453,2459,2467,2390,2486,2436,2453,2416,2437,2415,2456,2420,2532,2422,2432,2438,2378,2465,2441,2396,2430,2432,2390,2399,2517,2461,2564,2349,2393,2442,2470,2348,2458,2437,2345,2419,2395,2547,2474,2389,2436,2412,2396,2497,2459,2532,2420,2484,2390,2402,2518,2367,2488,2488,2457,2398,2460,2538,2359,2439,2466,2489,2458,2478,2402,2444,2380,2401,2358,2363,2455,2430,2349,2528,2406,2417,2450,2411,2439,2450,2489,2335,2399,2386,2458,2398,2430,2478,2436,2458,2347,2538,2377,2473,2429,2408,2389,2534,2364,2457,2395,2414,2404,2443,2501,2447,2434,2420,2443,2408,2419,2382,2374,2423,2516,2400,2343,2436,2520,2489,2436,2443,2476,2433,2388,2519,2440,2477,2429,2460,2412,2459,2450,2404,2435,2415,2481,2440,2447,2408,2467,2520,2423,2438,2441,2461,2416,2478,2481,2425,2403,2400,2360,2369,2491,2365,2465,2417,2454,2353,2426,2483,2427,2355,2483,2375,2381,2456,2452,2416,2398,2543,2404,2425,2438,2427,2468,2407,2447,2446,2476,2440,2346,2465,2417,2380,2437,2476,2476,2444,2409,2400,2400,2449,2473,2466,2398,2442,2418,2454,2421,2395,2392,2418,2438,2307,2441,2398,2420,2371,2455,2549,2483,2497,2415,2491,2440,2515,2360,2504,2438,2439,2369,2460,2429,2459,2394,2361,2471,2390,2434,2422,2462,2461,2428,2505,2442,2414,2412,2370,2453,2427,2487,2404,2512,2531,2468,2400,2408,2412,2477,2325,2478,2475,2394,2326,2393,2542,2422,2398,2395,2347,2393,2282,2470,2415,2430,2455,2460,2442,2439,2459,2485,2441,2477,2404,2397,2419,2555,2371,2346,2422,2476,2446,2439,2529,2501,2439,2410,2438,2390,2466,2412,2437,2436,2483,2408,2432,2392,2426,2444,2456,2527,2413,2387,2364,2404,2495,2559,2498,2446,2509,2347,2445,2407,2415,2445,2518,2386,2447,2370,2439,2390,2430,2476,2494,2397,2406,2438,2457,2553,2436,2417,2453,2346,2450,2435,2543,2418,2457,2436,2463,2462,2401,2415,2405,2448,2453,2436,2397,2485,2464,2468,2443,2380,2408,2443,2358,2467,2421,2453,2405,2455,2398,2504,2398,2438,2513,2384,2416,2406,2417,2496,2467,2316,2440,2429,2484,2488,2469,2576,2374,2436,2494,2412,2356,2440,2368,2454,2480,2440,2422,2516,2365,2347,2437,2415,2447,2460,2364,2438,2459,2440,2478,2427,2409,2383,2393,2451,2437,2407,2469,2443,2477,2419,2535,2440,2391,2472,2464,2443,2562,2509,2388,2484,2494,2436,2441,2499,2362,2482,2441,2404,2428,2389,2454,2431,2381,2437,2414,2367,2405,2489,2403,2498,2367,2393,2434,2414,2342,2440,2459,2506,2471,2316,2538,2482,2366,2397,2491,2490,2424,2455,2378,2414,2454,2449,2469,2499,2450,2422,2395,2392,2425,2411,2458,2392,2443,2423,2431,2430,2496,2324,2402,2446,2384,2371,2479,2435,2514,2334,2472,2416,2436,2468,2387,2436,2390,2358,2496,2421,2455,2428,2467,2376,2502,2510,2391,2395,2468,2423,2371,2355,2484,2436,2464,2449,2418,2429,2425,2447,2503,2412,2472,2434,2497,2488,2454,2362,2438,2410,2463,2474,2407,2438,2475,2434,2424,2484,2514,2444,2440,2531,2416,2416,2381,2355,2417,2486,2438,2443,2527,2322,2439,2413,2414,2380,2453,2383,2404,2459,2504,2409,2425,2509,2468,2475,2366,2464,2467,2537,2358,2423,2439,2533,2350,2454,2493,2432,2442,2448,2436,2389,2447,2444,2427,2548,2499,2439,2475,2469,2376,2494,2484,2436,2358,2396,2429,2397,2418,2456,2326,2491,2364,2421,2411,2456,2411,2438,2398,2444,2476,2407,2446,2455,2439,2391,2448,2361,2493,2392,2486,2458,2477,2407,2421,2389,2406,2440,2422,2401,2425,2506,2393,2474,2480,2428,2427,2430,2446,2499,2344,2334,2457,2442,2434,2502,2440,2383,2440,2343,2522,2479,2501,2463,2384,2376,2373,2518,2381,2447,2382,2487,2517,2444,2396,2437,2442,2499,2474,2474,2465,2461,2409,2568,2455,2447,2374,2381,2448,2443,2403,2391,2437,2375,2398,2448,2360,2431,2461,2439,2362,2389,2421,2378,2413,2491,2438,2482,2402,2427,2422,2458,2440,2424,2410,2560,2485,2491,2444,2378,2425,2420,2439,2529,2401,2418,2408,2386,2474,2438,2415,2370,2333,2503,2346,2383,2442,2406,2511,2550,2460,2380,2399,2402,2412,2382,2400,2524,2502,2399,2525,2489,2456,2507,2410,2407,2447,2478,2404,2371,2349,2434,2380,2470,2409,2521,2430,2441,2420,2595,2388,2398,2459,2435,2445,2572,2453,2436,2436,2493,2501,2553,2474,2422,2495,2383,2445,2523,2431,2440,2419,2364,2510,2449,2449,2492,2467,2418,2442,2430,2452,2330,2416,2484,2438,2397,2428,2409,2271,2384,2382,2428,2453,2399,2320,2437,2442,2414,2458,2366,2454,2366,2385,2438,2410,2428,2449,2429,2515,2417,2363,2414,2385,2446,2503,2505,2413,2367,2417,2358,2450,2507,2489,2434,2499,2449,2430,2425,2502,2466,2412,2478,2545,2445,2438,2394,2449,2392,2428,2377,2415,2403,2516,2385,2473,2492,2489,2542,2531,2478,2384,2476,2312,2444,2374,2411,2459,2415,2364,2397,2282,2531,2413,2471,2340,2487,2422,2462,2467,2417,2390,2497,2459,2500,2514,2437,2360,2495,2448,2503,2356,2463,2477,2408,2396,2467,2437,2512,2499,2357,2454,2295,2483,2391,2461,2428,2432,2411,2437,2466,2348,2470,2354,2440,2477,2490,2464,2363,2572,2445,2389,2350,2368,2471,2400,2436,2435,2373,2381,2447,2429,2437,2474,2385,2456,2462,2381,2414,2462,2474,2459,2438,2476,2452,2449,2465,2462,2367,2478,2381,2525,2480,2398,2412,2374,2362,2441,2418,2349,2399,2433,2360,2417,2438,2485,2517,2434,2443,2403,2506,2493,2443,2410,2480,2487,2449,2304,2408,2436,2461,2428,2431,2457,2441,2441,2381,2449,2427,2367,2366,2319,2367,2526,2466,2436,2450,2411,2443,2440,2516,2531,2437,2459,2472,2370,2533,2457,2427,2492,2413,2423,2449,2457,2403,2446,2405,2381,2448,2470,2387,2425,2408,2477,2480,2396,2419,2436,2377,2391,2491,2434,2419,2469,2422,2482,2303,2512,2500]},{"counters":[2424,2405,2428,2432,2428,2579,2440,2414,2441,2471,2506,2387,2460,2479,2454,2437,2432,2384,2412,2384,2410,2426,2480,2433,2361,2440,2457,2440,2499,2345,2419,2419,2438,2415,2446,2445,2333,2417,2489,2438,2520,2510,2438,2428,2444,2387,2401,2411,2390,2407,2493,2509,2454,2434,2445,2454,2508,2443,2445,2490,2445,2431,2397,2438,2386,2399,2386,2468,2424,2478,2513,2423,2428,2457,2359,2424,2367,2452,2349,2508,2482,2389,2477,2441,2444,2426,2384,2427,2416,2437,2493,2407,2385,2404,2433,2411,2414,2434,2435,2416,2392,2430,2412,2447,2486,2482,2402,2395,2470,2415,2466,2396,2490,2368,2429,2446,2408,2358,2359,2451,2368,2386,2471,2436,2540,2427,2463,2412,2454,2431,2427,2392,2405,2436,2439,2505,2477,2477,2402,2445,2412,2420,2473,2372,2360,2491,2390,2469,2427,2459,2543,2405,2406,2500,2310,2501,2456,2475,2384,2433,2425,2423,2451,2393,2464,2453,2379,2473,2379,2341,2445,2410,2530,2513,2491,2411,2438,2381,2446,2449,2486,2428,2498,2456,2412,2511,2448,2436,2408,2444,2464,2500,2443,2440,2457,2513,2495,2464,2504,2433,2469,2510,2416,2451,2391,2463,2460,2398,2355,2464,2344,2472,2379,2448,2473,2467,2409,2483,2412,2499,2480,2456,2352,2407,2439,2438,2463,2432,2478,2391,2449,2369,2392,2493,2407,2475,2450,2471,2416,2423,2429,2461,2438,2418,2421,2442,2505,2421,2383,2423,2374,2566,2479,2485,2434,2464,2498,2493,2422,2492,2379,2501,2413,2461,2471,2534,2365,2515,2533,2500,2436,2419,2405,2497,2407,2489,2442,2417,2446,2452,2490,2466,2420,2405,2373,2374,2422,2394,2437,2420,2394,2481,2493,2481,2438,2368,2387,2461,2437,2485,2394,2433,2493,2441,2434,2498,2531,2437,2453,2439,2377,2468,2335,2347,2391,2363,2418,2437,2439,2382,2425,2414,2449,2402,2490,2336,2489,2413,2383,2448,2493,2390,2366,2518,2422,2410,2411,2410,2345,2506,2493,2440,2429,2407,2419,2448,2362,2375,2409,2384,2460,2471,2490,2342,2372,2415,2406,2382,2405,2427,2508,2419,2487,2507,2397,2578,2438,2371,2498,2400,2394,2473,2304,2416,2453,2433,2423,2357,2368,2343,2439,2403,2472,2453,2485,2428,2402,2381,2433,2382,2473,2530,2435,2405,2442,2480,2418,2467,2364,2392,2432,2543,2384,2381,2503,2478,2479,2448,2426,2369,2541,2440,2358,2481,2466,2370,2426,2413,2421,2337,2483,2503,2365,2382,2540,2484,2412,2398,2439,2421,2440,2428,2374,2393,2393,2414,2492,2462,2377,2423,2399,2527,2421,2513,2410,2452,2438,2433,2437,2437,2464,2414,2484,2320,2359,2383,2432,2557,2441,2322,2525,2503,2508,2411,2454,2434,2432,2429,2447,2494,2532,2466,2604,2407,2513,2462,2406,2496,2514,2519,2496,2379,2437,2424,2450,2445,2439,2378,2439,2431,2406,2456,2451,2511,2474,2406,2419,2387,2526,2421,2481,2369,2526,2419,2475,2441,2458,2438,2576,2563,2518,2491,2339,2482,2442,2444,2453,2483,2470,2348,2469,2462,2413,2381,2442,2484,2399,2393,2407,2417,2424,2448,2442,2452,2331,2438,2449,2535,2404,2479,2423,2436,2373,2412,2445,2486,2345,2472,2319,2550,2428,2441,2491,2413,2318,2428,2482,2467,2411,2481,2483,2441,2386,2453,2437,2408,2363,2395,2386,2451,2527,2406,2373,2498,2441,2365,2435,2447,2517,2493,2506,2431,2375,2399,2472,2451,2460,2440,2456,2386,2467,2429,2439,2479,2464,2431,2417,2426,2465,2422,2452,2513,2489,2436,2465,2467,2446,2449,2434,2448,2400,2389,2447,2444,2436,2356,2347,2458,2553,2382,2429,2537,2368,2455,2426,2469,2388,2421,2397,2429,2447,2505,2495,2392,2445,2465,2525,2447,2480,2298,2418,2363,2380,2419,2486,2435,2445,2516,2446,2365,2430,2439,2336,2379,2423,2395,2424,2476,2376,2440,2450,2400,2436,2399,2452,2443,2403,2393,2345,2372,2434,2466,2439,2512,2377,2438,2517,2437,2392,2414,2437,2481,2380,2380,2369,2419,2470,2441,2409,2413,2504,2437,2373,2503,2434,2351,2429,2467,2444,2524,2419,2386,2402,2441,2501,2392,2432,2386,2409,2424,2467,2465,2403,2446,2330,2500,2441,2387,2438,2459,2386,2453,2433,2442,2375,2469,2383,2403,2377,2419,2512,2433,2449,2439,2415,2377,2412,2385,2354,2402,2354,2454,2492,2491,2425,2432,2406,2482,2446,2494,2410,2447,2438,2467,2468,2476,2434,2469,2484,2457,2475,2295,2471,2439,2471,2449,2353,2461,2330,2512,2404,2416,2505,2399,2443,2337,2469,2396,2436,2416,2400,2402,2452,2408,2385,2382,2389,2550,2444,2490,2462,2489,2344,2434,2439,2470,2427,2436,2417,2433,2452,2454,2450,2456,2477,2416,2489,2491,2436,2482,2419,2436,2376,2354,2442,2479,2385,2424,2437,2436,2493,2362,2456,2430,2453,2445,2523,2475,2452,2464,2373,2435,2455,2512,2446,2474,2357,2368,2382,2415,2466,2429,2511,2408,2482,2406,2406,2470,2410,2438,2490,2431,2417,2441,2416,2485,2386,2482,2471,2466,2446,2462,2381,2382,2369,2437,2429,2459,2349,2445,2491,2457,2481,2474,2410,2399,2417,2433,2552,2350,2438,2456,2485,2436,2385,2433,2466,2471,2434,2381,2380,2390,2512,2437,2357,2583,2374,2426,2449,2441,2418,2488,2395,2371,2401,2348,2348,2488,2423,2371,2458,2456,2507,2406,2420,2403,2438,2367,2420,2404,2413,2584,2394,2415,2439,2422,2373,2486,2515,2370,2400,2520,2466,2478,2447,2439,2465,2431,2535,2443,2327,2346,2303,2439,2410,2363,2523,2484,2419,2440,2437,2426,2423,2409,2416,2456,2502,2416,2543,2327,2446,2494,2448,2459,2459,2451,2371,2423,2394,2421,2504,2482,2404,2441,2461,2395,2421,2474,2452,2415,2449,2489,2475,2309,2294,2437,2382,2508,2435,2429,2441,2447,2380,2348,2450,2393,2421,2438,2389,2518,2394,2399,2425,2424,2462,2437,2454,2413,2377,2413,2386,2443,2433,2433,2460,2505,2463,2497,2498,2420,2461,2388,2437,2461,2402,2454,2438,2504,2367,2468,2529,2538,2407,2465,2461,2457,2496,2449,2415,2473,2436,2473,2463,2383,2423,2408,2463,2439,2484,2499,2517,2429,2464,2452,2424,2304,2384,2481,2512,2417,2449,2418,2462,2473,2430,2454,2483,2507,2451,2387,2455,2409,2476,2395,2486,2402,2422,2444,2424,2430,2450,2346,2413,2432,2490,2467,2455,2509,2463,2426,2396,2506,2438,2419,2498,2487,2374,2408,2373,2413,2390,2381,2436,2485,2466,2376,2438,2437,2389,2416,2407,2436,2471,2474,2413,2396,2472,2514,2383,2443,2373,2397,2388,2466,2422,2429,2389,2460,2351,2411,2433,2429,2413,2429,2437,2418,2506,2449,2482,2369,2437,2364,2440,2478,2457,2457,2456,2428,2557,2474,2448,2389,2454,2455,2431,2437,2409,2424,2447,2459,2521,2392,2427,2454,2497,2435,2439,2460,2401,2422,2480,2507,2498,2407,2410,2440,2342,2389,2475,2450,2455,2440,2330,2403,2467,2471,2451,2471,2414,2440,2437,2494,2394,2495,2334,2439,2375,2469,2370,2390,2478,2527,2437,2515,2409,2395,2417,2518,2437,2505,2392,2481,2422,2449,2431,2477,2395,2410,2471,2439,2453,2434,2495,2425,2483,2467,2383,2392,2432,2430,2512,2411,2459,2400,2442,2419,2404,2432,2477,2551,2377,2389,2493,2348,2583,2428,2436,2439,2487,2469,2461,2422,2447,2385,2445,2520,2457,2440,2366,2436,2449,2447,2418,2467,2441,2428,2416,2408,2399,2461,2375,2447,2417,2478,2521,2334,2501,2446,2521,2464,2493,2421,2423,2403,2443,2439,2439,2405,2362,2479,2456,2460,2470,2405,2481,2409,2455,2437,2416,2389,2421,2388,2447,2436,2473,2432,2571,2396,2473,2437,2430,2346,2412,2428,2462,2395,2436,2491,2390,2401,2369,2502,2452,2454,2384,2423,2400,2430,2431,2392,2492,2428,2480,2403,2385,2453,2518,2414,2508,2437,2480,2503,2471,2339,2483,2446,2373,2436,2387,2432,2451,2389,2550,2475,2380,2410,2479,2463,2458,2451,2478,2413,2493,2387,2477,2429,2460,2436,2397,2413,2395,2527,2449,2406,2390,2415,2423,2445,2530,2425,2477,2458,2443,2516,2452,2437,2411,2428,2428,2433,2429,2494,2449,2372,2360,2391,2355,2416,2451,2379,2508,2346,2470,2378,2426,2411,2318,2405,2304,2437,2386,2389,2451,2350,2413,2487,2395,2437,2365,2416,2538,2447,2545,2425,2389,2458,2481,2514,2438,2517,2457,2439,2403,2545,2505,2505,2375,2439,2420,2458,2556,2470,2407,2296,2416,2439,2341,2467,2497,2486,2409,2476,2325,2427,2458,2518,2469,2445,2456,2440,2462,2361,2437,2534,2448,2370,2390,2477,2376,2431,2431,2416,2523,2367,2501,2478,2408,2483,2418,2460,2325,2484,2445,2525,2453,2445,2439,2482,2463,2436,2425,2354,2398,2481,2436,2445,2462,2423,2401,2455,2439,2379,2440,2510,2402,2285,2415,2438,2369,2377,2417,2440,2419,2448,2410,2402,2437,2459,2455,2421,2491,2449,2383,2458,2394,2423,2513,2403,2436,2407,2371,2452,2370,2459,2532,2481,2382,2552,2375,2409,2511,2439,2400,2450,2488,2482,2357,2362,2354,2368,2469,2470,2396,2406,2481,2412,2421,2436,2458,2480,2422,2509,2437,2518,2485,2481,2521,2482,2426,2420,2466,2493,2354,2501,2460,2561,2377,2417,2289,2458,2344,2508,2465,2493,2470,2424,2508,2379,2382,2388,2429,2394,2464,2460,2517,2387,2549,2432,2339,2352,2442,2454,2450,2469,2427,2495,2387,2487,2416,2476,2434,2450,2388,2438,2357,2472,2505,2434,2393,2430,2364,2465,2438,2447,2424,2475,2458,2405,2350,2507,2425,2440,2319,2441,2427,2347,2533,2428,2405,2427,2502,2483,2437,2482,2513,2420,2423,2410,2325,2506,2342,2399,2436,2348,2445,2473,2374,2454,2472,2436,2436,2499,2453,2444,2438,2425,2426,2444,2366,2411,2435,2467,2391,2395,2473,2436,2484,2460,2441,2429,2407,2352,2352,2336,2486,2456,2448,2440,2456,2436,2447,2447,2364,2427,2422,2419,2525,2524,2481,2406,2407,2450,2495,2481,2350,2467,2438,2408,2434,2437,2454,2417,2466,2438,2475,2420,2469,2427,2424,2420,2426,2428,2432,2414,2484,2489,2474,2448,2455,2438,2490,2375,2529,2436,2419,2494,2379,2401,2438,2436,2434,2381,2405,2439,2439,2396,2444,2446,2447,2439,2371,2530,2382,2438,2483,2423,2539,2465,2439,2385,2453,2490,2476,2437,2361,2488,2431,2415,2438,2444,2335,2471,2397,2419,2447,2409,2492,2419,2383,2471,2434,2436,2381,2520,2434,2419,2452,2478,2471,2339,2404,2440,2318,2436,2488,2380,2446,2382,2377,2447,2400,2439,2421,2377,2469,2403,2439,2408,2363,2415,2465,2414,2371,2473,2441,2479,2321,2432,2448,2441,2454,2413,2458,2461,2454,2435,2469,2512,2378,2441,2378,2506,2427,2454,2399,2372,2436,2494,2407,2423,2425,2372,2492,2521,2422,2420,2387,2439,2457,2448,2455,2478,2453,2509,2436,2506,2348,2425,2437,2425,2515,2417,2439,2476,2413,2455,2423,2425,2457,2439,2371,2428,2427,2433,2458,2469,2422,2482,2432,2521,2460,2447,2532,2488,2423,2405,2412,2496,2426,2389,2426,2526,2478,2415,2485,2559,2462,2436,2364,2398,2416,2443,2458,2449,2464,2383,2435,2398,2399,2369,2457,2329,2440,2435,2333,2533,2437,2468,2436,2426,2399,2376,2474,2504,2517,2476,2387,2467,2416,2372,2403,2336,2370,2388,2516,2403,2466,2439,2472,2442,2370,2427,2543,2465,2381,2504,2476,2478,2428,2385,2442,2440,2436,2469,2468,2458,2549,2434,2495,2439,2460,2431,2425,2439,2466,2395,2441,2414,2381,2437,2464,2358,2395,2408,2465,2381,2520,2401,2453,2494,2434,2418,2484,2389,2337,2439,2463,2469,2416,2420,2373,2425,2426,2388,2456,2399,2432,2548,2488,2374,2390,2384,2410,2302,2463,2338,2325,2426,2439,2463,2459,2440,2428,2379,2427,2393,2478,2434,2358,2487,2471,2434,2455,2392,2389,2391,2434,2439,2437,2458,2441,2416,2432,2433,2454,2373,2431,2450,2511,2413,2389,2380,2459,2396,2539,2421,2403,2476]},{"counters":[2389,2463,2324,2430,2437,2467,2475,2436,2399,2481,2473,2514,2461,2445,2410,2466,2473,2410,2488,2473,2466,2464,2421,2450,2475,2453,2571,2438,2385,2435,2353,2466,2406,2442,2509,2361,2434,2516,2332,2457,2381,2453,2411,2426,2448,2472,2546,2419,2316,2475,2363,2443,2436,2410,2342,2349,2517,2384,2433,2403,2423,2390,2365,2437,2408,2453,2430,2504,2346,2436,2420,2468,2453,2408,2386,2445,2412,2440,2404,2399,2416,2407,2447,2432,2459,2418,2394,2444,2374,2405,2388,2434,2459,2453,2397,2503,2404,2564,2481,2437,2387,2432,2437,2390,2440,2410,2480,2452,2536,2482,2376,2496,2407,2452,2441,2481,2497,2421,2333,2510,2473,2461,2390,2459,2340,2453,2560,2361,2413,2367,2344,2387,2438,2441,2487,2459,2476,2451,2424,2505,2445,2507,2440,2401,2404,2326,2436,2417,2510,2462,2383,2398,2418,2397,2371,2422,2408,2574,2413,2418,2424,2402,2479,2433,2358,2424,2394,2415,2474,2372,2480,2408,2324,2357,2412,2414,2365,2397,2397,2499,2438,2521,2423,2440,2417,2444,2406,2439,2374,2510,2367,2428,2359,2529,2424,2512,2441,2483,2458,2396,2417,2443,2455,2425,2440,2436,2413,2349,2446,2466,2500,2435,2476,2477,2377,2410,2384,2489,2361,2462,2364,2383,2457,2417,2472,2432,2518,2477,2449,2426,2445,2452,2360,2438,2456,2441,2431,2486,2479,2437,2489,2499,2417,2403,2564,2391,2474,2402,2418,2505,2342,2442,2463,2489,2336,2399,2461,2480,2460,2539,2453,2426,2437,2506,2366,2415,2403,2423,2437,2381,2312,2421,2398,2423,2493,2498,2461,2419,2417,2357,2456,2529,2463,2430,2397,2453,2573,2384,2415,2400,2533,2481,2411,2409,2476,2436,2379,2435,2412,2508,2369,2443,2345,2452,2452,2548,2507,2452,2382,2451,2406,2442,2315,2452,2437,2544,2478,2417,2516,2387,2450,2416,2418,2478,2530,2512,2436,2432,2430,2470,2387,2483,2394,2436,2438,2482,2392,2368,2395,2432,2549,2493,2472,2459,2454,2409,2479,2367,2410,2462,2440,2326,2407,2370,2402,2439,2450,2448,2491,2546,2437,2520,2461,2349,2336,2457,2430,2437,2488,2423,2383,2458,2402,2316,2371,2453,2354,2640,2393,2460,2352,2477,2457,2404,2437,2429,2508,2456,2333,2469,2389,2457,2401,2484,2529,2442,2411,2446,2399,2515,2467,2382,2476,2453,2483,2422,2380,2505,2446,2390,2398,2459,2386,2347,2437,2436,2452,2334,2466,2467,2524,2409,2468,2428,2437,2358,2402,2407,2546,2440,2437,2500,2437,2528,2505,2352,2410,2398,2396,2341,2412,2362,2310,2374,2412,2378,2499,2452,2419,2444,2415,2398,2420,2444,2482,2429,2406,2437,2428,2435,2462,2460,2491,2418,2535,2444,2432,2446,2401,2417,2440,2432,2396,2436,2427,2453,2478,2468,2396,2415,2419,2445,2481,2415,2409,2344,2423,2461,2447,2440,2440,2390,2484,2403,2426,2320,2431,2483,2461,2506,2366,2464,2409,2419,2408,2372,2480,2421,2363,2470,2487,2485,2400,2300,2464,2448,2427,2480,2437,2457,2441,2434,2524,2438,2475,2469,2468,2478,2510,2426,2439,2500,2442,2423,2474,2453,2461,2516,2433,2479,2413,2424,2494,2487,2461,2430,2352,2402,2445,2400,2472,2354,2406,2475,2388,2569,2454,2513,2527,2358,2415,2424,2425,2434,2436,2431,2389,2380,2470,2491,2472,2378,2456,2459,2507,2430,2469,2349,2433,2467,2441,2381,2471,2415,2418,2438,2347,2388,2488,2476,2435,2442,2473,2390,2455,2440,2469,2488,2438,2449,2428,2425,2359,2444,2395,2433,2414,2408,2385,2501,2378,2416,2448,2313,2490,2406,2463,2458,2448,2344,2439,2493,2437,2462,2444,2402,2384,2421,2398,2409,2425,2413,2475,2406,2474,2413,2400,2503,2377,2407,2494,2460,2375,2397,2545,2429,2289,2411,2499,2399,2431,2425,2460,2431,2362,2447,2388,2473,2436,2439,2399,2400,2376,2455,2392,2425,2443,2507,2440,2430,2321,2429,2471,2459,2389,2390,2467,2518,2493,2437,2443,2437,2452,2449,2505,2486,2458,2473,2358,2514,2460,2373,2384,2388,2514,2436,2474,2492,2455,2436,2392,2460,2408,2461,2431,2490,2436,2448,2428,2384,2381,2298,2453,2375,2470,2435,2408,2418,2486,2434,2450,2573,2408,2437,2452,2445,2521,2393,2359,2417,2529,2436,2433,2461,2446,2351,2440,2425,2445,2452,2440,2464,2333,2393,2436,2456,2512,2428,2492,2512,2415,2448,2448,2433,2264,2350,2527,2437,2458,2377,2436,2411,2461,2467,2432,2333,2382,2455,2510,2408,2398,2411,2442,2502,2440,2434,2443,2383,2430,2431,2492,2436,2532,2330,2433,2578,2408,2402,2339,2459,2446,2396,2467,2471,2346,2418,2419,2395,2387,2421,2500,2423,2318,2400,2466,2456,2421,2456,2499,2486,2392,2431,2485,2451,2456,2472,2522,2410,2423,2507,2500,2465,2483,2437,2461,2439,2425,2488,2477,2477,2395,2366,2450,2393,2507,2470,2433,2503,2476,2567,2347,2436,2434,2392,2428,2442,2395,2426,2462,2453,2418,2424,2464,2402,2436,2461,2478,2502,2472,2422,2422,2494,2521,2434,2323,2438,2509,2472,2389,2408,2440,2400,2475,2428,2460,2466,2459,2439,2430,2385,2320,2447,2438,2543,2496,2489,2376,2463,2407,2471,2446,2452,2385,2353,2477,2404,2380,2481,2483,2457,2437,2444,2453,2396,2450,2453,2474,2493,2451,2465,2393,2432,2415,2399,2410,2453,2514,2443,2425,2530,2512,2489,2461,2469,2398,2418,2384,2489,2440,2368,2329,2399,2448,2437,2524,2421,2404,2457,2409,2434,2432,2471,2467,2443,2381,2461,2536,2364,2463,2428,2441,2284,2509,2460,2462,2403,2403,2434,2487,2399,2421,2451,2430,2375,2414,2421,2490,2499,2434,2483,2442,2514,2421,2425,2384,2385,2369,2451,2437,2361,2500,2404,2408,2549,2429,2440,2415,2416,2441,2410,2471,2438,2506,2490,2487,2372,2440,2454,2437,2409,2475,2440,2459,2468,2380,2462,2412,2476,2460,2475,2375,2403,2417,2415,2313,2539,2498,2469,2530,2392,2469,2511,2426,2362,2384,2467,2452,2439,2485,2402,2382,2341,2363,2401,2533,2422,2473,2465,2466,2422,2434,2382,2427,2443,2347,2374,2421,2486,2417,2475,2450,2346,2406,2434,2444,2359,2432,2354,2509,2369,2386,2439,2439,2378,2529,2508,2394,2453,2376,2408,2403,2411,2511,2426,2411,2477,2473,2441,2446,2368,2489,2386,2526,2365,2448,2456,2460,2455,2439,2590,2517,2435,2450,2436,2371,2448,2430,2453,2438,2520,2417,2427,2436,2512,2459,2461,2439,2472,2439,2458,2420,2455,2421,2433,2441,2407,2451,2426,2491,2399,2382,2428,2395,2353,2400,2385,2453,2448,2466,2391,2418,2415,2458,2473,2463,2397,2387,2446,2443,2432,2554,2487,2401,2419,2437,2381,2360,2457,2380,2583,2371,2319,2428,2444,2514,2451,2441,2447,2450,2415,2405,2386,2404,2452,2478,2414,2482,2478,2437,2390,2392,2366,2397,2331,2372,2446,2488,2376,2388,2510,2391,2405,2383,2428,2455,2439,2462,2406,2364,2436,2393,2499,2482,2400,2501,2516,2445,2449,2417,2562,2423,2421,2581,2390,2453,2572,2423,2417,2438,2374,2399,2398,2436,2487,2436,2424,2433,2452,2501,2593,2400,2407,2421,2474,2502,2415,2411,2381,2400,2380,2428,2388,2403,2488,2417,2438,2456,2462,2435,2379,2497,2424,2436,2420,2423,2417,2431,2392,2459,2510,2515,2538,2373,2389,2385,2464,2435,2411,2413,2426,2424,2468,2415,2455,2483,2386,2408,2486,2453,2400,2492,2524,2440,2447,2373,2436,2447,2338,2450,2411,2461,2445,2425,2317,2489,2436,2407,2445,2513,2446,2412,2442,2439,2534,2419,2457,2419,2492,2436,2401,2326,2445,2482,2384,2462,2369,2397,2436,2468,2461,2417,2455,2418,2437,2444,2387,2458,2413,2419,2490,2451,2426,2507,2419,2487,2396,2482,2430,2465,2395,2439,2464,2428,2412,2439,2442,2359,2521,2411,2368,2414,2480,2332,2483,2315,2425,2463,2427,2401,2565,2538,2416,2437,2441,2394,2435,2471,2436,2483,2398,2482,2493,2406,2473,2425,2496,2447,2481,2439,2386,2440,2392,2425,2452,2357,2397,2472,2470,2380,2398,2452,2406,2446,2408,2453,2437,2405,2418,2386,2381,2506,2419,2428,2422,2407,2504,2465,2322,2548,2471,2436,2497,2421,2383,2370,2436,2434,2423,2437,2408,2473,2389,2414,2474,2415,2436,2397,2433,2453,2368,2448,2423,2443,2400,2514,2363,2385,2444,2408,2422,2442,2463,2404,2475,2393,2447,2411,2431,2416,2527,2437,2471,2433,2474,2406,2425,2427,2387,2514,2339,2365,2462,2484,2462,2440,2356,2486,2389,2502,2414,2403,2395,2423,2429,2526,2414,2430,2437,2453,2417,2458,2357,2457,2421,2394,2448,2379,2378,2415,2437,2480,2363,2374,2412,2467,2436,2492,2388,2436,2376,2477,2512,2385,2445,2392,2443,2539,2431,2412,2447,2475,2446,2433,2406,2456,2410,2423,2501,2452,2436,2397,2458,2439,2442,2428,2426,2391,2429,2339,2281,2475,2422,2458,2464,2452,2438,2476,2390,2482,2467,2442,2447,2394,2436,2389,2496,2378,2436,2400,2477,2457,2387,2472,2437,2430,2451,2423,2460,2391,2439,2351,2449,2377,2389,2447,2422,2511,2452,2546,2439,2366,2443,2442,2553,2469,2470,2398,2473,2438,2408,2492,2473,2365,2508,2483,2455,2403,2468,2421,2436,2477,2443,2447,2465,2440,2451,2420,2318,2470,2422,2518,2368,2435,2478,2430,2437,2420,2437,2450,2541,2446,2354,2340,2480,2449,2362,2416,2467,2393,2439,2461,2454,2447,2453,2415,2398,2475,2335,2420,2480,2416,2400,2454,2525,2426,2430,2409,2427,2529,2493,2439,2412,2503,2461,2405,2459,2464,2404,2371,2410,2425,2454,2439,2545,2478,2430,2521,2498,2440,2442,2445,2428,2423,2523,2469,2441,2351,2360,2508,2457,2394,2437,2398,2469,2430,2407,2438,2428,2419,2351,2412,2454,2450,2429,2418,2420,2441,2433,2417,2396,2435,2430,2417,2427,2443,2372,2407,2424,2314,2506,2518,2423,2418,2474,2443,2473,2434,2465,2413,2501,2424,2344,2450,2465,2410,2439,2499,2394,2410,2390,2415,2471,2488,2437,2380,2413,2372,2518,2450,2511,2403,2404,2438,2476,2424,2440,2496,2432,2514,2419,2511,2455,2413,2456,2476,2478,2464,2415,2444,2405,2470,2506,2384,2396,2403,2439,2408,2524,2411,2366,2382,2429,2396,2410,2371,2398,2420,2394,2360,2528,2403,2390,2529,2430,2497,2420,2473,2479,2432,2382,2392,2565,2526,2418,2372,2426,2420,2460,2505,2466,2397,2454,2395,2479,2377,2456,2459,2433,2481,2457,2424,2498,2437,2490,2468,2378,2411,2462,2362,2461,2479,2384,2437,2448,2495,2439,2460,2463,2472,2435,2463,2418,2433,2485,2432,2484,2369,2402,2457,2474,2415,2422,2446,2435,2474,2466,2394,2427,2568,2403,2428,2436,2371,2435,2377,2408,2425,2335,2397,2444,2405,2486,2341,2458,2401,2417,2412,2367,2448,2433,2455,2500,2437,2380,2435,2468,2438,2463,2424,2428,2440,2421,2519,2388,2369,2506,2475,2462,2377,2402,2380,2437,2512,2424,2429,2478,2399,2370,2366,2441,2488,2418,2480,2408,2531,2352,2439,2460,2555,2439,2478,2463,2527,2391,2412,2552,2460,2396,2477,2556,2412,2485,2373,2448,2416,2466,2497,2479,2428,2408,2488,2440,2514,2416,2429,2452,2437,2400,2494,2375,2437,2554,2450,2404,2383,2399,2408,2442,2433,2489,2452,2312,2437,2465,2469,2523,2395,2469,2358,2538,2398,2411,2435,2422,2459,2402,2511,2421,2426,2453,2484,2436,2414,2389,2396,2485,2391,2476,2408,2337,2422,2394,2495,2403,2447,2453,2439,2517,2422,2454,2470,2413,2395,2445,2405,2500,2459,2441,2321,2434,2341,2427,2472,2407,2521,2524,2328,2436,2548,2357,2459,2491,2392,2409,2448,2398,2417,2465,2391,2466,2367,2478,2402,2363,2605,2427,2482,2436,2331,2368,2464,2453,2434,2440,2369,2433,2442,2481,2417,2400,2481,2420,2437,2436,2442,2438,2402,2414,2459,2418,2434,2466,2467,2418,2511,2449,2454,2438,2436,2453,2495,2331,2473,2442,2451,2434,2431,2439]},{"counters":[2474,2420,2463,2391,2452,2443,2460,2434,2481,2404,2445,2387,2453,2413,2401,2434,2428,2435,2348,2455,2457,2408,2475,2378,2390,2437,2404,2507,2371,2425,2413,2476,2458,2476,2409,2413,2391,2492,2501,2451,2376,2436,2470,2387,2425,2426,2451,2378,2475,2356,2561,2463,2387,2544,2401,2428,2528,2450,2371,2445,2446,2424,2422,2462,2412,2461,2365,2369,2410,2513,2347,2423,2469,2510,2444,2443,2560,2508,2428,2479,2488,2523,2463,2515,2423,2467,2479,2438,2457,2504,2441,2480,2409,2485,2454,2415,2420,2464,2466,2426,2427,2378,2443,2461,2496,2390,2513,2457,2427,2459,2507,2523,2457,2381,2455,2424,2386,2438,2422,2557,2406,2329,2491,2352,2410,2447,2394,2476,2374,2494,2508,2419,2538,2495,2485,2436,2451,2467,2439,2407,2307,2385,2439,2470,2415,2447,2385,2470,2450,2421,2373,2456,2413,2367,2457,2410,2373,2349,2404,2442,2436,2453,2431,2495,2450,2419,2477,2445,2503,2475,2324,2483,2402,2396,2516,2410,2484,2460,2421,2471,2485,2460,2466,2431,2416,2488,2417,2404,2401,2376,2403,2500,2414,2385,2496,2463,2413,2475,2402,2382,2448,2523,2488,2551,2520,2486,2434,2552,2383,2462,2544,2413,2356,2427,2386,2430,2462,2465,2438,2497,2469,2495,2394,2438,2434,2473,2388,2421,2395,2497,2464,2447,2433,2494,2380,2414,2469,2414,2468,2394,2328,2442,2442,2443,2431,2451,2475,2379,2496,2442,2378,2390,2473,2380,2436,2351,2380,2465,2400,2456,2394,2494,2494,2464,2513,2470,2479,2431,2455,2438,2501,2449,2394,2452,2407,2513,2531,2388,2472,2463,2434,2451,2487,2385,2406,2426,2399,2442,2396,2450,2383,2449,2506,2356,2531,2458,2440,2426,2385,2538,2414,2455,2340,2413,2452,2397,2476,2454,2376,2465,2395,2424,2442,2485,2540,2319,2456,2338,2526,2453,2463,2424,2409,2460,2423,2435,2442,2437,2408,2414,2477,2482,2479,2436,2434,2480,2496,2500,2447,2439,2410,2515,2407,2435,2439,2524,2443,2409,2386,2473,2342,2373,2458,2340,2403,2474,2409,2464,2397,2577,2559,2348,2424,2496,2466,2468,2368,2461,2434,2413,2361,2448,2516,2396,2378,2457,2385,2371,2408,2509,2409,2444,2432,2434,2488,2469,2442,2376,2457,2462,2449,2335,2442,2567,2399,2436,2396,2458,2400,2440,2425,2437,2467,2373,2437,2437,2452,2433,2430,2443,2390,2435,2401,2437,2441,2352,2359,2407,2349,2401,2434,2419,2415,2469,2422,2385,2399,2366,2380,2427,2413,2437,2470,2406,2436,2422,2406,2386,2402,2415,2380,2475,2462,2461,2486,2511,2532,2476,2366,2522,2502,2465,2453,2369,2414,2448,2407,2403,2405,2432,2478,2482,2410,2441,2396,2451,2413,2412,2389,2450,2455,2399,2496,2484,2361,2504,2433,2506,2349,2422,2386,2411,2411,2477,2453,2521,2450,2358,2544,2406,2440,2506,2451,2396,2466,2436,2418,2446,2391,2344,2439,2574,2447,2398,2445,2423,2420,2385,2421,2440,2368,2402,2440,2505,2436,2431,2539,2442,2387,2405,2410,2360,2424,2416,2488,2471,2436,2378,2440,2438,2389,2459,2439,2484,2479,2430,2466,2418,2373,2346,2449,2427,2395,2520,2426,2405,2398,2413,2355,2462,2433,2465,2418,2424,2397,2477,2467,2476,2385,2439,2357,2425,2456,2479,2405,2461,2344,2455,2333,2372,2486,2405,2370,2527,2368,2531,2353,2375,2411,2449,2384,2433,2487,2399,2450,2391,2432,2436,2375,2408,2397,2363,2458,2494,2417,2550,2385,2413,2434,2415,2498,2408,2473,2416,2485,2440,2318,2466,2421,2457,2498,2438,2441,2375,2465,2404,2410,2472,2457,2450,2413,2365,2392,2408,2415,2460,2440,2476,2504,2381,2452,2457,2353,2410,2365,2407,2364,2412,2505,2469,2397,2457,2462,2358,2378,2431,2406,2526,2466,2371,2417,2437,2464,2409,2391,2470,2440,2483,2438,2441,2530,2459,2500,2420,2458,2489,2445,2429,2382,2474,2407,2472,2458,2403,2412,2499,2476,2358,2491,2441,2351,2530,2450,2424,2431,2528,2300,2336,2457,2410,2364,2389,2483,2349,2394,2437,2438,2402,2394,2377,2412,2436,2435,2482,2514,2473,2419,2437,2464,2402,2446,2445,2462,2511,2477,2544,2301,2426,2459,2385,2370,2470,2366,2425,2471,2351,2459,2421,2489,2411,2510,2416,2431,2377,2439,2321,2392,2451,2464,2382,2387,2413,2436,2481,2352,2398,2419,2423,2440,2462,2436,2454,2428,2420,2420,2434,2463,2452,2440,2449,2450,2475,2389,2524,2422,2438,2461,2440,2432,2521,2435,2530,2473,2397,2454,2408,2346,2463,2433,2440,2464,2469,2476,2504,2456,2452,2533,2458,2466,2439,2429,2419,2376,2397,2417,2471,2478,2525,2430,2507,2415,2402,2527,2471,2458,2401,2434,2424,2481,2437,2451,2531,2381,2466,2517,2452,2444,2433,2429,2425,2440,2380,2401,2453,2536,2448,2428,2497,2377,2469,2372,2352,2425,2387,2437,2471,2480,2470,2513,2501,2475,2389,2396,2441,2409,2442,2476,2360,2391,2432,2373,2423,2451,2376,2359,2501,2342,2408,2451,2472,2449,2441,2473,2419,2369,2423,2378,2427,2471,2439,2441,2396,2383,2437,2345,2416,2543,2436,2465,2449,2531,2443,2357,2437,2434,2477,2474,2418,2406,2345,2426,2498,2481,2447,2456,2459,2421,2411,2432,2385,2474,2383,2494,2438,2474,2479,2443,2412,2474,2431,2477,2370,2442,2468,2423,2394,2416,2449,2426,2458,2466,2404,2305,2451,2437,2407,2362,2353,2506,2456,2362,2440,2364,2378,2407,2512,2429,2473,2373,2445,2460,2442,2344,2438,2517,2379,2410,2417,2489,2473,2395,2552,2465,2463,2434,2485,2471,2427,2465,2431,2464,2435,2408,2481,2467,2278,2419,2402,2457,2455,2461,2463,2417,2360,2508,2498,2448,2467,2347,2416,2477,2445,2478,2382,2465,2424,2491,2508,2410,2414,2421,2401,2437,2430,2408,2368,2495,2504,2374,2361,2388,2457,2479,2440,2476,2397,2402,2386,2427,2493,2368,2450,2515,2390,2432,2504,2448,2447,2532,2440,2448,2479,2456,2477,2482,2422,2375,2432,2449,2382,2522,2470,2384,2420,2444,2496,2488,2438,2442,2478,2356,2491,2432,2480,2369,2424,2418,2331,2481,2397,2447,2403,2462,2432,2378,2450,2378,2406,2408,2426,2453,2405,2494,2473,2431,2442,2453,2489,2439,2535,2432,2439,2464,2390,2358,2475,2448,2417,2390,2423,2440,2507,2394,2522,2418,2407,2346,2385,2430,2369,2407,2440,2396,2338,2442,2428,2463,2457,2471,2406,2468,2386,2460,2437,2484,2350,2417,2460,2450,2444,2418,2357,2376,2440,2446,2389,2450,2511,2417,2483,2548,2418,2369,2495,2407,2422,2440,2404,2396,2508,2534,2464,2362,2387,2466,2394,2471,2391,2441,2424,2455,2440,2563,2425,2456,2424,2493,2379,2421,2418,2487,2490,2442,2460,2426,2400,2430,2414,2444,2414,2398,2521,2395,2441,2400,2472,2369,2378,2396,2513,2478,2435,2390,2538,2467,2436,2439,2444,2394,2454,2365,2413,2486,2426,2415,2381,2426,2525,2372,2478,2440,2445,2512,2388,2434,2381,2415,2473,2475,2458,2471,2383,2508,2436,2434,2458,2366,2376,2436,2437,2470,2422,2487,2408,2399,2399,2446,2334,2330,2390,2496,2439,2440,2434,2393,2338,2402,2429,2403,2341,2376,2438,2481,2490,2490,2421,2395,2340,2498,2552,2442,2520,2497,2454,2469,2449,2473,2420,2363,2431,2456,2432,2406,2467,2490,2494,2384,2391,2430,2342,2356,2435,2440,2437,2441,2398,2375,2435,2442,2460,2407,2411,2441,2429,2308,2458,2508,2439,2441,2415,2467,2483,2496,2480,2466,2491,2489,2398,2440,2484,2334,2336,2421,2416,2422,2527,2460,2444,2418,2428,2413,2414,2377,2462,2400,2468,2410,2435,2422,2461,2400,2474,2444,2535,2316,2410,2531,2434,2420,2490,2375,2491,2472,2486,2494,2436,2442,2440,2457,2438,2529,2457,2494,2413,2458,2528,2432,2450,2430,2515,2399,2510,2473,2488,2499,2462,2501,2497,2455,2479,2417,2475,2446,2432,2391,2306,2549,2396,2443,2500,2405,2469,2462,2436,2343,2487,2386,2467,2392,2399,2439,2411,2558,2421,2433,2562,2516,2484,2402,2498,2445,2443,2470,2439,2431,2466,2370,2426,2369,2443,2484,2430,2355,2390,2477,2378,2483,2543,2440,2419,2473,2487,2514,2437,2360,2397,2354,2427,2388,2426,2446,2391,2361,2436,2416,2545,2443,2480,2435,2459,2410,2497,2441,2385,2352,2417,2496,2447,2398,2380,2505,2362,2393,2444,2458,2462,2489,2415,2503,2504,2375,2418,2501,2445,2370,2443,2518,2435,2446,2442,2445,2405,2492,2465,2510,2487,2440,2508,2335,2489,2346,2442,2414,2498,2496,2473,2400,2424,2366,2446,2415,2494,2468,2457,2405,2334,2502,2493,2417,2478,2449,2459,2329,2468,2436,2490,2397,2407,2471,2483,2405,2404,2449,2441,2509,2418,2470,2412,2471,2358,2371,2406,2526,2396,2408,2360,2448,2421,2439,2337,2460,2429,2482,2410,2453,2408,2409,2342,2437,2364,2409,2305,2367,2473,2447,2463,2405,2468,2475,2411,2440,2431,2448,2387,2432,2431,2421,2489,2410,2379,2386,2418,2509,2460,2412,2422,2437,2460,2396,2407,2406,2269,2454,2419,2365,2470,2409,2469,2404,2431,2513,2521,2464,2416,2444,2444,2403,2428,2398,2373,2382,2427,2369,2340,2491,2432,2473,2439,2439,2353,2473,2448,2442,2357,2359,2495,2379,2531,2476,2462,2525,2439,2446,2465,2389,2439,2547,2455,2493,2528,2437,2337,2588,2413,2448,2436,2429,2429,2391,2529,2313,2460,2491,2407,2392,2472,2501,2429,2409,2485,2435,2473,2479,2414,2534,2455,2485,2421,2427,2401,2518,2481,2332,2331,2525,2460,2428,2399,2400,2478,2448,2411,2438,2454,2478,2446,2537,2437,2331,2425,2438,2409,2468,2379,2466,2436,2411,2468,2427,2347,2398,2435,2501,2434,2412,2452,2487,2419,2318,2437,2438,2443,2428,2438,2372,2430,2407,2332,2476,2551,2467,2363,2478,2398,2449,2389,2361,2498,2348,2402,2454,2473,2419,2455,2376,2453,2502,2455,2395,2500,2401,2403,2443,2417,2424,2383,2511,2535,2320,2390,2382,2531,2456,2453,2520,2294,2418,2437,2477,2414,2350,2335,2409,2388,2382,2507,2447,2473,2541,2452,2407,2395,2488,2425,2459,2399,2439,2487,2466,2422,2481,2405,2306,2406,2457,2454,2441,2412,2428,2420,2518,2382,2394,2413,2506,2478,2413,2417,2415,2441,2494,2401,2455,2387,2423,2397,2384,2473,2398,2455,2475,2466,2435,2409,2444,2447,2492,2438,2412,2531,2380,2440,2464,2325,2355,2462,2471,2385,2489,2434,2534,2386,2462,2463,2492,2441,2502,2405,2431,2494,2451,2411,2444,2436,2373,2455,2440,2343,2565,2462,2538,2498,2423,2407,2532,2432,2380,2477,2353,2469,2463,2474,2468,2405,2490,2465,2430,2433,2429,2484,2422,2397,2430,2409,2389,2448,2430,2438,2395,2426,2453,2546,2358,2461,2438,2384,2451,2443,2438,2443,2416,2485,2436,2469,2434,2458,2465,2487,2548,2370,2452,2413,2340,2402,2439,2391,2405,2516,2380,2480,2474,2513,2428,2418,2451,2520,2382,2388,2419,2493,2421,2415,2453,2347,2507,2517,2432,2384,2466,2481,2427,2418,2399,2439,2407,2396,2465,2500,2500,2420,2455,2502,2469,2490,2581,2345,2374,2441,2346,2449,2495,2434,2356,2491,2510,2473,2431,2443,2479,2525,2473,2417,2431,2466,2477,2456,2558,2469,2514,2323,2410,2378,2404,2385,2425,2340,2420,2392,2356,2456,2436,2458,2329,2429,2412,2378,2348,2342,2479,2427,2402,2438,2394,2392,2457,2493,2399,2434,2429,2452,2521,2399,2452,2334,2514,2440,2438,2442,2429,2416,2461,2412,2438,2500,2457,2469,2395,2434,2382,2444,2530,2461,2356,2346,2428,2387,2398,2387,2425,2465,2403,2432,2352,2451,2470,2435,2345,2406,2481,2468,2430,2379,2495,2312,2430,2461,2416,2395,2478,2519,2446,2531,2419,2437,2340,2474,2479,2464,2345,2403,2432,2411,2361,2423,2433,2440,2515,2463,2410,2422,2462,2370,2438,2437,2436,2485,2556,2438,2477,2434,2440,2408,2341,2353,2372,2429,2370,2482]}],"top_n":[{"data":"CIqv0QQ=","count":54},{"data":"CLrv/wM=","count":0},{"data":"CNS22QE=","count":32},{"data":"CPya3wE=","count":9},{"data":"CNjdwgI=","count":0},{"data":"CNSygwE=","count":20},{"data":"CKjCwAE=","count":0},{"data":"COy/+gI=","count":0},{"data":"CPzu8wI=","count":28},{"data":"COD+DA==","count":32},{"data":"CLqVuwM=","count":18},{"data":"CISTzAE=","count":67},{"data":"CLDjowE=","count":0},{"data":"CITY0gQ=","count":10},{"data":"CJqR6wI=","count":0},{"data":"CMruogQ=","count":10},{"data":"CJq6FA==","count":44},{"data":"CJilygM=","count":17},{"data":"CI6V9wE=","count":15},{"data":"COqo3AM=","count":27},{"data":"CJTesAQ=","count":22},{"data":"COyehAI=","count":1},{"data":"CNDFDw==","count":0},{"data":"CPq1vwM=","count":29},{"data":"CITPtQE=","count":5},{"data":"CMLBxgQ=","count":0},{"data":"CIrKzAQ=","count":4},{"data":"CKiLvAQ=","count":49},{"data":"CLqurQE=","count":8},{"data":"CLTkrgE=","count":17},{"data":"CMDX2wQ=","count":0},{"data":"CLq1mwQ=","count":14},{"data":"CLa3zAM=","count":19},{"data":"CJaRoQE=","count":4},{"data":"CNasjgM=","count":0},{"data":"COKOcA==","count":0},{"data":"CJTd1gE=","count":0},{"data":"CPTd3gE=","count":1},{"data":"CPTGwwM=","count":0},{"data":"CNbdvQQ=","count":0},{"data":"CIrH3QE=","count":30},{"data":"CKjW+gE=","count":11},{"data":"COb5PQ==","count":29},{"data":"CL6mqwM=","count":0},{"data":"CNrZqQQ=","count":0},{"data":"CJyM6wM=","count":0},{"data":"CJz8UQ==","count":0},{"data":"CPC1KA==","count":24},{"data":"CKbADQ==","count":3},{"data":"CJr7Gg==","count":0},{"data":"COTktgI=","count":0},{"data":"CLTscw==","count":0},{"data":"CICl7AM=","count":58},{"data":"CNKbGA==","count":13},{"data":"CKjQ5gE=","count":0},{"data":"CJahUg==","count":0},{"data":"CKSQigI=","count":32},{"data":"CNaJ6wE=","count":0},{"data":"CLi3qgQ=","count":0},{"data":"CPSUiAM=","count":52},{"data":"CPyq0gI=","count":2},{"data":"CNbGsgE=","count":0},{"data":"CJDVsgE=","count":0},{"data":"CPL36gI=","count":40},{"data":"CP7n+QI=","count":27},{"data":"CLbu2wI=","count":13},{"data":"CM7ZywI=","count":0},{"data":"CNS4igI=","count":0},{"data":"CIqxjAQ=","count":32},{"data":"CNKjwwQ=","count":0},{"data":"CMqA1gE=","count":0},{"data":"CObDjAI=","count":0},{"data":"CJaiuwQ=","count":0},{"data":"CLSzFg==","count":0},{"data":"COyepgI=","count":0},{"data":"CP631gM=","count":16},{"data":"CKiTUg==","count":0},{"data":"CNqKdQ==","count":37},{"data":"CIiZ6QE=","count":0},{"data":"CPjOhgE=","count":1},{"data":"CIyVtgE=","count":0},{"data":"CKirzgI=","count":0},{"data":"CKzuowQ=","count":27},{"data":"COyeDQ==","count":26},{"data":"CODxrwE=","count":48},{"data":"COKkugE=","count":16},{"data":"CIrtswI=","count":9},{"data":"CPDxxAQ=","count":29},{"data":"CPKC9QI=","count":5},{"data":"CMzlxgQ=","count":41},{"data":"COTojwM=","count":15},{"data":"CPLy1AM=","count":0},{"data":"CNKDtwM=","count":0},{"data":"CMTPpwI=","count":0},{"data":"CMzzkAM=","count":1},{"data":"COblswI=","count":0},{"data":"CMLSqwQ=","count":38},{"data":"CNqh0wM=","count":24},{"data":"CNK52AM=","count":0},{"data":"CMKtoQI=","count":0},{"data":"CMDpvwQ=","count":0},{"data":"COLXgwQ=","count":0},{"data":"CLa8pwI=","count":0},{"data":"CJbRMg==","count":0},{"data":"CNTkAQ==","count":0},{"data":"CP6omgM=","count":22},{"data":"CLqb8AM=","count":1},{"data":"CMKUqgE=","count":29},{"data":"COqkYA==","count":0},{"data":"CLLzjgI=","count":37},{"data":"CNyRxgE=","count":0},{"data":"CJqXkQQ=","count":11},{"data":"CNid4gM=","count":49},{"data":"CN6WJA==","count":16},{"data":"CJyrSg==","count":0},{"data":"CKq9nQE=","count":6},{"data":"CNS+SQ==","count":0},{"data":"CMK0ygQ=","count":14},{"data":"CKKRpQI=","count":41},{"data":"COCE6AI=","count":0},{"data":"COjB4gM=","count":44},{"data":"CKao7wE=","count":0},{"data":"CJKV6QI=","count":0},{"data":"CPSMzwI=","count":0},{"data":"CLqK8wM=","count":0},{"data":"CNyTuwE=","count":0},{"data":"CIb6wQE=","count":17},{"data":"CIKM5AM=","count":24},{"data":"CPKv+gM=","count":0},{"data":"CMrCWg==","count":29},{"data":"COTazwQ=","count":0},{"data":"CNCG7gM=","count":0},{"data":"CMqlxAM=","count":0},{"data":"CPrb4AQ=","count":0},{"data":"CJy2wAI=","count":0},{"data":"COLzag==","count":0},{"data":"CKa1kQQ=","count":5},{"data":"CJSwxgM=","count":0},{"data":"CKj+wQM=","count":0},{"data":"CLb8zAE=","count":0},{"data":"CLas8wM=","count":0},{"data":"CK6jngQ=","count":21},{"data":"CPyjswE=","count":0},{"data":"CJiVswI=","count":0},{"data":"CLiowgI=","count":32},{"data":"CMDF8AM=","count":23},{"data":"CNT72gE=","count":0},{"data":"CL6+7AI=","count":0},{"data":"CJjx1gQ=","count":24},{"data":"CJC96AE=","count":0},{"data":"CNbT0QE=","count":0},{"data":"CPzO4wE=","count":28},{"data":"COa5RA==","count":5},{"data":"CKbFnwI=","count":6},{"data":"CNChugM=","count":0},{"data":"CPidogI=","count":0},{"data":"CKLengI=","count":0},{"data":"CNie5gE=","count":0},{"data":"COyXxgE=","count":0},{"data":"CIbl6AM=","count":0},{"data":"COSBxwQ=","count":9},{"data":"COanwgM=","count":35},{"data":"CLSzrQM=","count":0},{"data":"CIKYxgI=","count":3},{"data":"CMjmrQQ=","count":3},{"data":"CJaWjQI=","count":0},{"data":"CLy31QQ=","count":54},{"data":"CNb8sQQ=","count":0},{"data":"CKylDg==","count":7},{"data":"CISU1AI=","count":0},{"data":"CIy+ZA==","count":0},{"data":"CPzJEg==","count":2},{"data":"CPqsIA==","count":0},{"data":"CIDMCg==","count":39},{"data":"CPjCcA==","count":59},{"data":"CIz+ywI=","count":0},{"data":"CIrpnQQ=","count":18},{"data":"CM6GwQE=","count":11},{"data":"CIaQrAQ=","count":12},{"data":"CK6e3QE=","count":0},{"data":"CKa+Gw==","count":45},{"data":"CNKCygQ=","count":11},{"data":"COCjhQI=","count":29},{"data":"CPTJiwE=","count":0},{"data":"CNbCzQQ=","count":27},{"data":"CIyvzgQ=","count":21},{"data":"CPTV+wE=","count":0},{"data":"CKq+Uw==","count":3},{"data":"CI78Sw==","count":49},{"data":"CPzzRA==","count":0},{"data":"CJSenwE=","count":0},{"data":"CPS3kAQ=","count":24},{"data":"CMyYiwM=","count":15},{"data":"COSglQI=","count":0},{"data":"CMzy8QM=","count":0},{"data":"CLiXsAM=","count":29},{"data":"CNrAkgQ=","count":0},{"data":"CPKilQM=","count":0},{"data":"CL7ehgQ=","count":44},{"data":"CJb4nwE=","count":0},{"data":"CKzUzwI=","count":22},{"data":"CPryowE=","count":0},{"data":"CLb44gE=","count":27},{"data":"CJ7OmQM=","count":0},{"data":"CMLLlAM=","count":17},{"data":"CKSSxAE=","count":5},{"data":"CIaw5AM=","count":1},{"data":"CJKanwE=","count":0},{"data":"CL7xvgQ=","count":0},{"data":"CIz0RA==","count":0},{"data":"CIb7Yg==","count":0},{"data":"CODH5gE=","count":0},{"data":"CNbtqwM=","count":0},{"data":"CIimmQM=","count":0},{"data":"CKCRqgQ=","count":3},{"data":"CPDkrAI=","count":0},{"data":"CPa92gQ=","count":40},{"data":"CIysAg==","count":0},{"data":"CPL25wI=","count":0},{"data":"CPjByQE=","count":43},{"data":"CI7zzwE=","count":0},{"data":"CICgkAE=","count":0},{"data":"CL6B9QI=","count":0},{"data":"COSNOA==","count":3},{"data":"CIaqcA==","count":0},{"data":"CKqXGg==","count":6},{"data":"CJ7q7AE=","count":13},{"data":"CP6O+wE=","count":0},{"data":"CLiZzQM=","count":37},{"data":"CMrFrwE=","count":4},{"data":"CLLL3QQ=","count":0},{"data":"COyyuQE=","count":29},{"data":"CJDRxgQ=","count":7},{"data":"CIjehAM=","count":28},{"data":"CMb5uAI=","count":1},{"data":"CISDjAQ=","count":1},{"data":"CIaLlQQ=","count":13},{"data":"CMb3ugM=","count":0},{"data":"CJ6w1QI=","count":22},{"data":"CJCdag==","count":0},{"data":"CO7VxQQ=","count":0},{"data":"CMKwuQM=","count":14},{"data":"CLDNhgQ=","count":20},{"data":"CK6g1gM=","count":0},{"data":"CKrX7QM=","count":1},{"data":"CIjg2AM=","count":0},{"data":"CNiZowE=","count":90},{"data":"CMryEA==","count":0},{"data":"CJLp3QI=","count":0},{"data":"CNbjvQQ=","count":2},{"data":"CJi5rwM=","count":0},{"data":"CLiw0wI=","count":0},{"data":"CPDohQM=","count":0},{"data":"CIbwzgQ=","count":8},{"data":"CMLh5gM=","count":0},{"data":"CLyJ4AE=","count":22},{"data":"COLwRA==","count":15},{"data":"CMDWuAM=","count":0},{"data":"COzi+QM=","count":0},{"data":"CLq4DQ==","count":0},{"data":"CISvwAE=","count":27},{"data":"CK7G2QI=","count":45},{"data":"CKCmmwE=","count":0},{"data":"CPDrKQ==","count":3},{"data":"CJ6vfQ==","count":0},{"data":"CKTt2gI=","count":58},{"data":"CJK+mAM=","count":51},{"data":"CMSBLw==","count":0},{"data":"COa7owE=","count":50},{"data":"CILhyAM=","count":0},{"data":"CJ6B4wE=","count":28},{"data":"CMT/2gM=","count":28},{"data":"CO7JJw==","count":0},{"data":"CISRzgM=","count":48},{"data":"CI7wmQM=","count":0},{"data":"CKju0wM=","count":1},{"data":"CI7hjgQ=","count":0},{"data":"COiN/QE=","count":32},{"data":"CPzGrAE=","count":0},{"data":"CLTJtwI=","count":0},{"data":"CNz/xgQ=","count":10},{"data":"CMLHaA==","count":0},{"data":"CJyJZQ==","count":31},{"data":"CPDy5gI=","count":34},{"data":"CKSXjQQ=","count":18},{"data":"CNjQNA==","count":11},{"data":"CIrXvgQ=","count":0},{"data":"CIaL2wI=","count":0},{"data":"CKD91AI=","count":66},{"data":"CNbU9gM=","count":18},{"data":"CI7P4QQ=","count":32},{"data":"CPjv7QE=","count":0},{"data":"CJbm2gQ=","count":53},{"data":"CP6iIQ==","count":1},{"data":"CPCm5gI=","count":0},{"data":"CIr4Tw==","count":2},{"data":"CLDY3QI=","count":0},{"data":"CMbfxQE=","count":17},{"data":"CIad9gI=","count":40},{"data":"CKLT0QE=","count":0},{"data":"CPzm0wE=","count":9},{"data":"CJ7i2wE=","count":7},{"data":"CNTo4AI=","count":19},{"data":"CPzWxQM=","count":0},{"data":"CKjUxQQ=","count":20},{"data":"CIzHsQQ=","count":1},{"data":"CNST+wE=","count":0},{"data":"CPqjjwM=","count":0},{"data":"CLTAlgE=","count":34},{"data":"CP7YkwI=","count":0},{"data":"CISHRg==","count":0},{"data":"CICzJg==","count":28},{"data":"CLw9","count":15},{"data":"CJ6MzgM=","count":9},{"data":"CNTu+gM=","count":0},{"data":"CO7NCQ==","count":0},{"data":"CM7DigE=","count":7},{"data":"CKzyngE=","count":49},{"data":"CMylggM=","count":3},{"data":"CIDD6QE=","count":7},{"data":"CLT7xgE=","count":2},{"data":"CJTyrQE=","count":3},{"data":"CPKk2gE=","count":5},{"data":"CPStxwE=","count":30},{"data":"CKqIMA==","count":14},{"data":"CMTPWg==","count":0},{"data":"CLSI7QI=","count":0},{"data":"CM7B2gI=","count":2},{"data":"CLipjAQ=","count":0},{"data":"CNrz/AE=","count":17},{"data":"CIrGeA==","count":45},{"data":"COzAhwQ=","count":0},{"data":"CJzLowQ=","count":0},{"data":"CJSwjQM=","count":0},{"data":"CJzXwgQ=","count":0},{"data":"CKa+zgI=","count":0},{"data":"CLTb0gQ=","count":0},{"data":"CODhCQ==","count":0},{"data":"CNq0Ug==","count":0},{"data":"CMiwxgI=","count":11},{"data":"CK7rMw==","count":0},{"data":"CLz1Aw==","count":0},{"data":"CO6ozQQ=","count":5},{"data":"CPyH1wM=","count":4},{"data":"COT1rAE=","count":29},{"data":"CMjhQg==","count":21},{"data":"CLL34AQ=","count":26},{"data":"CLy41gI=","count":47},{"data":"CKD6gAE=","count":5},{"data":"CNLtwQE=","count":36},{"data":"CK7LMQ==","count":0},{"data":"CO754QI=","count":0},{"data":"CISS0AQ=","count":12},{"data":"CPLayAM=","count":0},{"data":"CITmEQ==","count":0},{"data":"CKKhpgQ=","count":15},{"data":"CKj8xQI=","count":4},{"data":"CMqzMg==","count":25},{"data":"CKyovwQ=","count":3},{"data":"CKz4rwQ=","count":21},{"data":"COjf7gM=","count":43},{"data":"CNafKQ==","count":0},{"data":"COzsOQ==","count":0},{"data":"COivsgQ=","count":11},{"data":"CMSdnwM=","count":0},{"data":"CMCGjAM=","count":6},{"data":"CLztoAI=","count":33},{"data":"CPz8vwQ=","count":22},{"data":"CP6OvQE=","count":0},{"data":"CMSJVw==","count":0},{"data":"CMSM+gM=","count":17},{"data":"CJT5qgI=","count":0},{"data":"COy31AQ=","count":0},{"data":"CObhxgE=","count":3},{"data":"CNCEkAI=","count":41},{"data":"CNSIigQ=","count":1},{"data":"CNqH0wI=","count":2},{"data":"CMzAwwI=","count":7},{"data":"COa0mgE=","count":15},{"data":"CMSUggM=","count":0},{"data":"CLSUqAI=","count":12},{"data":"CKbdmAQ=","count":0},{"data":"CJLKzwQ=","count":2},{"data":"CODEmAE=","count":0},{"data":"CJSFIg==","count":0},{"data":"CP699AM=","count":42},{"data":"CJj3/QE=","count":0},{"data":"COKpigE=","count":0},{"data":"CNjdpwM=","count":2},{"data":"CNz3ogE=","count":4},{"data":"CLyIhQI=","count":56},{"data":"CJrioQE=","count":23},{"data":"CMiMmAM=","count":0},{"data":"CIqFpwE=","count":1},{"data":"CNKpxgQ=","count":11},{"data":"CNzLqwM=","count":0},{"data":"CLa72QM=","count":1},{"data":"CLq3sQI=","count":0},{"data":"CJbeyAE=","count":0},{"data":"COSVxQI=","count":15},{"data":"CMj7vgM=","count":0},{"data":"CPKhywM=","count":4},{"data":"CJyErwI=","count":40},{"data":"CMLYkwM=","count":12},{"data":"CMy6eA==","count":0},{"data":"CMz2kQQ=","count":73},{"data":"CNCJ/wI=","count":17},{"data":"CJ6tJg==","count":0},{"data":"CIL7jQM=","count":19},{"data":"CJqJ6gI=","count":0},{"data":"CNju8wE=","count":5},{"data":"CJa/pgQ=","count":2},{"data":"CJyC+gM=","count":20},{"data":"CLK2sQI=","count":42},{"data":"CIiF3wQ=","count":0},{"data":"CIa3kwE=","count":0},{"data":"CILx1AM=","count":0},{"data":"CJiJNQ==","count":0},{"data":"CNzwxQM=","count":27},{"data":"CMbtdA==","count":11},{"data":"CPactgE=","count":0},{"data":"COb/MA==","count":45},{"data":"CNiWeA==","count":13},{"data":"CPC/uQE=","count":9},{"data":"CLqTPw==","count":10},{"data":"CPThSA==","count":0},{"data":"CNimFg==","count":0},{"data":"CLbmtwQ=","count":0},{"data":"CMDfFg==","count":67},{"data":"CLiqIg==","count":0},{"data":"CIK4+wM=","count":0},{"data":"CKqS/QI=","count":0},{"data":"CK7Y0wE=","count":0},{"data":"CNjJ4gI=","count":26},{"data":"CNj5xwE=","count":4},{"data":"CLqloAI=","count":10},{"data":"CO7vrQI=","count":0},{"data":"CObUjgQ=","count":38},{"data":"CP75mwE=","count":10},{"data":"CMS22gI=","count":0},{"data":"CPjngwI=","count":0},{"data":"CODaugQ=","count":31},{"data":"CLLVKA==","count":0},{"data":"CJ75kgQ=","count":35},{"data":"CJCcAw==","count":7},{"data":"CO7mmgQ=","count":0},{"data":"CMDqyAQ=","count":0},{"data":"CJrVxgE=","count":16},{"data":"CK7sYg==","count":14},{"data":"CKijiAQ=","count":15},{"data":"CPa8+QM=","count":44},{"data":"CLqW2gE=","count":0},{"data":"CIiHtgE=","count":56},{"data":"CNyohQQ=","count":11},{"data":"CJ7IsgE=","count":0},{"data":"CNjlrQQ=","count":0},{"data":"COaPywM=","count":0},{"data":"CMDltAQ=","count":8},{"data":"CNq1tAE=","count":47},{"data":"CODj8QI=","count":39},{"data":"CIyWiAI=","count":0},{"data":"CL6iiAI=","count":0},{"data":"CIKu0wI=","count":0},{"data":"CKbd1QQ=","count":0},{"data":"CK68igE=","count":24},{"data":"CN7t2QQ=","count":1},{"data":"CNbKrgQ=","count":0},{"data":"COji7gI=","count":0},{"data":"CNCQ0wE=","count":1},{"data":"CIC3Aw==","count":0},{"data":"CJiKhwI=","count":0},{"data":"COq+9gI=","count":20},{"data":"CKKOygQ=","count":0},{"data":"CO7VpgM=","count":21},{"data":"CIbowgM=","count":0},{"data":"CMDjqAI=","count":19},{"data":"CNSqsgM=","count":11},{"data":"CMq0/QE=","count":18},{"data":"CL77xwQ=","count":3},{"data":"CI7Y0AM=","count":75},{"data":"CNK6mAM=","count":30},{"data":"CKiA0wM=","count":27},{"data":"CPLv7QE=","count":12},{"data":"CP7fzQM=","count":4},{"data":"CNCSxAE=","count":0},{"data":"CLqvWQ==","count":0},{"data":"COKLwQM=","count":33},{"data":"CIj3Dg==","count":0},{"data":"COKnzwE=","count":0},{"data":"CPrIPA==","count":0},{"data":"CNCbwgE=","count":0},{"data":"CNil0gQ=","count":15},{"data":"CPKCvQQ=","count":17},{"data":"CKb95gI=","count":0},{"data":"CIyokAE=","count":0},{"data":"CNL/FA==","count":0},{"data":"CIDfjgM=","count":99},{"data":"CKCXpQQ=","count":8},{"data":"CKL71wM=","count":0},{"data":"CND2zgI=","count":17},{"data":"CLCP2gQ=","count":16},{"data":"CKb0oQQ=","count":14},{"data":"COTZKg==","count":15},{"data":"CL6ptAI=","count":1},{"data":"CPTdsQM=","count":19},{"data":"CNaytgM=","count":4},{"data":"CMLtmQM=","count":0},{"data":"CMzLkAQ=","count":3},{"data":"CLbG4QI=","count":0},{"data":"CKDI/QI=","count":0},{"data":"CIT8+AM=","count":0},{"data":"CLjORg==","count":0},{"data":"CJShAw==","count":49},{"data":"CJ6k6AI=","count":0},{"data":"CJzalgM=","count":20},{"data":"CMi2tQE=","count":10},{"data":"CIbZtAI=","count":19},{"data":"CMyUlgM=","count":0},{"data":"COD5zwE=","count":0},{"data":"CPLg9wI=","count":1},{"data":"CMCVGg==","count":0},{"data":"CICbrAM=","count":0},{"data":"CK7BEA==","count":11},{"data":"CPjrsgI=","count":0},{"data":"CKrv1wQ=","count":29},{"data":"CO7p6QI=","count":1},{"data":"CLzi/wM=","count":0},{"data":"CPzeDQ==","count":45},{"data":"COaE0QM=","count":0},{"data":"CMjr4gI=","count":35},{"data":"CMa0qAM=","count":3},{"data":"CMSV0QE=","count":0},{"data":"CL6t0QQ=","count":10},{"data":"COjM4gI=","count":19},{"data":"CJD78wM=","count":24},{"data":"CJKlNw==","count":0},{"data":"CJihoQI=","count":0},{"data":"COKA1QI=","count":0},{"data":"CIbIugQ=","count":3},{"data":"COTglgQ=","count":30},{"data":"COaFigE=","count":11},{"data":"CKSphAQ=","count":16},{"data":"CJTvnAI=","count":38},{"data":"CIqD0wE=","count":8},{"data":"CNi+gQI=","count":0},{"data":"CIrclQE=","count":14},{"data":"CLLv0gQ=","count":0},{"data":"CJjW6wM=","count":21},{"data":"CNrgsAE=","count":2},{"data":"CISJnAI=","count":49},{"data":"CPbGkwQ=","count":52},{"data":"CM7Z9AI=","count":37},{"data":"CJz00QM=","count":0},{"data":"CNSnsQQ=","count":24},{"data":"CMLzpwI=","count":8},{"data":"CIjk9AI=","count":0},{"data":"CJKlaA==","count":35},{"data":"CKjJpQM=","count":15},{"data":"CPCbkgM=","count":46},{"data":"CJa7kgI=","count":26},{"data":"CP7JmwM=","count":15},{"data":"CMTduAI=","count":0},{"data":"CJ7HxQQ=","count":0},{"data":"CIDfrgQ=","count":19},{"data":"CMaYgwQ=","count":0},{"data":"CPr1kgI=","count":21},{"data":"CL7wsAM=","count":38},{"data":"COK6hwI=","count":6},{"data":"COrUxwM=","count":0},{"data":"CLSS5wE=","count":15},{"data":"COjYnQM=","count":16},{"data":"CPq/AQ==","count":0},{"data":"CPLi8AI=","count":8},{"data":"CNT61AM=","count":0},{"data":"CKr0Ww==","count":0},{"data":"CIb7FQ==","count":0},{"data":"CML1vgM=","count":0},{"data":"CI6pKw==","count":5},{"data":"CKbwEw==","count":0},{"data":"COLP6QI=","count":17},{"data":"CKj8ugE=","count":0},{"data":"CLDr1gQ=","count":0},{"data":"CObinAE=","count":0},{"data":"CLre5QM=","count":90},{"data":"CN7d5wM=","count":0},{"data":"CKiomAM=","count":4},{"data":"CNK9lgI=","count":14},{"data":"CNCgHw==","count":0},{"data":"CIiHowI=","count":27},{"data":"CMCIZw==","count":60},{"data":"CPyg0AM=","count":16},{"data":"COz3kQQ=","count":5},{"data":"CILyTw==","count":0},{"data":"CIC5zQI=","count":0},{"data":"COSt6gM=","count":37},{"data":"CJirdA==","count":0},{"data":"CM6jhgQ=","count":0},{"data":"CPq1hQE=","count":0},{"data":"COT2Aw==","count":0},{"data":"CK6s2QI=","count":9},{"data":"CJza7AM=","count":0},{"data":"CKzTvwI=","count":0},{"data":"CNCpxAM=","count":27},{"data":"CKDKHQ==","count":0},{"data":"CMqRgwE=","count":0},{"data":"CKjX+QE=","count":14},{"data":"CID8Fg==","count":0},{"data":"CJyLuQM=","count":0},{"data":"CMCf0gM=","count":18},{"data":"CMaL2AQ=","count":4},{"data":"CIql6wI=","count":0},{"data":"CJzh0AE=","count":35},{"data":"CN7q1wI=","count":88},{"data":"CPjUZw==","count":0},{"data":"CJifvwM=","count":0},{"data":"CJTluQI=","count":0},{"data":"COrcVw==","count":3},{"data":"CPj1SQ==","count":0},{"data":"CNDJNA==","count":17},{"data":"CIiyHw==","count":26},{"data":"CJLc6wM=","count":6},{"data":"COqo5gM=","count":8},{"data":"CML26QM=","count":0},{"data":"CNSTzgQ=","count":17},{"data":"CJKCuQI=","count":0},{"data":"CNr6nQE=","count":0},{"data":"CObL3QE=","count":20},{"data":"CLyu/QI=","count":11},{"data":"CKa1qAM=","count":0},{"data":"CIyCvwI=","count":0},{"data":"CJLq5AI=","count":7},{"data":"CNCQrAQ=","count":0},{"data":"CIb7+QE=","count":0},{"data":"CNDHqQQ=","count":0},{"data":"CPCq7gE=","count":8},{"data":"CKqskgQ=","count":0},{"data":"CJjT0AI=","count":0},{"data":"CN785wE=","count":0},{"data":"CPClqAM=","count":0},{"data":"COCq0QI=","count":7},{"data":"CLaY0gE=","count":0},{"data":"CIytCg==","count":36},{"data":"CJzzPw==","count":1},{"data":"CJaPigM=","count":54},{"data":"COa23QE=","count":0},{"data":"CPiU/AI=","count":0},{"data":"CLKe7AE=","count":41},{"data":"CK6V9QE=","count":0},{"data":"CLzisgM=","count":62},{"data":"CIzFzgI=","count":0},{"data":"CO7ckQE=","count":4},{"data":"CMbTgwM=","count":0},{"data":"CIjEmQI=","count":0},{"data":"CPyTugI=","count":2},{"data":"CMa/hgI=","count":0},{"data":"CI7OsAE=","count":0},{"data":"CLD53AM=","count":0},{"data":"CPiahQE=","count":4},{"data":"COrX2AE=","count":0},{"data":"CM6CzgI=","count":0},{"data":"CIb8+gM=","count":7},{"data":"COiFlwM=","count":0},{"data":"CNKF3gM=","count":0},{"data":"CP7OPQ==","count":0},{"data":"CNqx9gE=","count":0},{"data":"CLKUWQ==","count":8},{"data":"CIzJ1QE=","count":0},{"data":"CPD5lAE=","count":9},{"data":"CK7BpwI=","count":32},{"data":"CKzT+AI=","count":0},{"data":"CMyHjQQ=","count":25},{"data":"CJyqnwE=","count":3},{"data":"CKDseQ==","count":0},{"data":"CMistQE=","count":0},{"data":"CLj5+gI=","count":0},{"data":"CKblNQ==","count":34},{"data":"CPi3tQE=","count":13},{"data":"CPCb1gM=","count":24},{"data":"COCazwQ=","count":0},{"data":"CJrQtAE=","count":46},{"data":"CIDWywM=","count":34},{"data":"COLc2AI=","count":50},{"data":"CJLnOA==","count":24},{"data":"CLCL5QI=","count":18},{"data":"CPaENg==","count":0},{"data":"CMj3WA==","count":24},{"data":"CKLUhwI=","count":6},{"data":"CJ64kwE=","count":6},{"data":"CI6f4AM=","count":30},{"data":"CPDDUQ==","count":49},{"data":"CPjiFQ==","count":0},{"data":"CNyTTg==","count":0},{"data":"CJShoAM=","count":0},{"data":"CNL9lQM=","count":11},{"data":"CI7G2gQ=","count":39},{"data":"CK7hyQE=","count":0},{"data":"CLbBeQ==","count":0},{"data":"COb2ag==","count":11},{"data":"CM75sAI=","count":1},{"data":"CJS/mQE=","count":0},{"data":"CKSS1gQ=","count":0},{"data":"COK4LQ==","count":9},{"data":"CMT5gwM=","count":0},{"data":"CJiFnwM=","count":0},{"data":"CNqSxAQ=","count":0},{"data":"CPDI2wQ=","count":0},{"data":"CJ6B5wM=","count":0},{"data":"CIKr+wI=","count":25},{"data":"CP7UpwE=","count":31},{"data":"COzwlAE=","count":21},{"data":"CNzGjwE=","count":0},{"data":"CKDzsgQ=","count":0},{"data":"CMamvgE=","count":18},{"data":"CKyXxwM=","count":32},{"data":"CP6kiwM=","count":14},{"data":"CKiG3gE=","count":35},{"data":"CNSxlAM=","count":6},{"data":"CPyZxQQ=","count":0},{"data":"COztkQQ=","count":0},{"data":"CNj7jQQ=","count":13},{"data":"CIDe2wE=","count":57},{"data":"CNjNoAM=","count":8},{"data":"COaGlgI=","count":0},{"data":"CIqhoQM=","count":34},{"data":"CILTyQI=","count":18},{"data":"COri2wQ=","count":28},{"data":"CNa2vQI=","count":2},{"data":"COapqQI=","count":0},{"data":"CMbaxgQ=","count":16},{"data":"CNK3ngQ=","count":0},{"data":"CKKWxAM=","count":0},{"data":"CLDzEg==","count":3},{"data":"CLLy+gI=","count":37},{"data":"CJyjcw==","count":0},{"data":"CIb23gQ=","count":20},{"data":"CJyBpwI=","count":10},{"data":"CIreIQ==","count":2},{"data":"CLzwqwQ=","count":3},{"data":"CIL1cA==","count":0},{"data":"CK6PmQI=","count":12},{"data":"CO6K5AE=","count":5},{"data":"CPShtAM=","count":0},{"data":"CLzVrAI=","count":0},{"data":"CO7H7gI=","count":0},{"data":"CPaS7wI=","count":0},{"data":"COTR+AI=","count":47},{"data":"CO76rQQ=","count":0},{"data":"CNTLqwQ=","count":0},{"data":"CIKz/AI=","count":11},{"data":"CLCQ7QM=","count":0},{"data":"CP6WqQE=","count":0},{"data":"CPzN/wM=","count":15},{"data":"CLLsxQM=","count":0},{"data":"CLTzhAQ=","count":13},{"data":"CMCE8wI=","count":55},{"data":"CPKjMQ==","count":44},{"data":"CITV/AE=","count":0},{"data":"CPD57AI=","count":37},{"data":"CPaKPg==","count":0},{"data":"CPyYzAE=","count":0},{"data":"CIjF6AI=","count":27},{"data":"CID5qQQ=","count":0},{"data":"COiLqAE=","count":2},{"data":"CMrhvgI=","count":0},{"data":"CNC3jQI=","count":33},{"data":"CL7AggM=","count":0},{"data":"CMKVJQ==","count":0},{"data":"CICjugM=","count":3},{"data":"CIzxjgE=","count":8},{"data":"CKz1nwQ=","count":35},{"data":"CM7IVQ==","count":0},{"data":"CLysEg==","count":0},{"data":"CKSz/QE=","count":0},{"data":"CNTGpAI=","count":29},{"data":"CND6Uw==","count":18},{"data":"CIqSgAQ=","count":40},{"data":"CKrVgQE=","count":12},{"data":"COKD4gI=","count":35},{"data":"CN7ctwM=","count":0},{"data":"CLafew==","count":30},{"data":"CJLZowM=","count":0},{"data":"CJa0Pg==","count":14},{"data":"CMrkggM=","count":0},{"data":"CPj87gM=","count":15},{"data":"CICeTg==","count":2},{"data":"CPDzpAM=","count":9},{"data":"CNCnyQM=","count":1},{"data":"CKrHnwQ=","count":2},{"data":"CO7g6AM=","count":6},{"data":"COqD3wE=","count":18},{"data":"CLKCsAE=","count":0},{"data":"CLjDMQ==","count":4},{"data":"CKKrmwE=","count":0},{"data":"CKCF7wE=","count":34},{"data":"CJyGhAI=","count":0},{"data":"CPS1iAI=","count":0},{"data":"CJCfcQ==","count":0},{"data":"CPb9iAE=","count":18},{"data":"CJaeygQ=","count":35},{"data":"CJrAwQI=","count":41},{"data":"COKliwQ=","count":0},{"data":"CMqWNg==","count":10},{"data":"CIi8nwQ=","count":0},{"data":"COycfA==","count":0},{"data":"CP6f0QQ=","count":0},{"data":"CPCzCQ==","count":0},{"data":"CPKIqQM=","count":9},{"data":"CNCPVg==","count":10},{"data":"CLT0qgM=","count":0},{"data":"CJrOMA==","count":10},{"data":"CLSTugQ=","count":32},{"data":"CPDkzgM=","count":19},{"data":"CJqh6QM=","count":0},{"data":"COabCA==","count":54},{"data":"CLyn3wE=","count":0},{"data":"CMDb0QE=","count":0},{"data":"CNiZdg==","count":0},{"data":"CPy0rwI=","count":0},{"data":"CKzy/wM=","count":2},{"data":"CMzAhQE=","count":24},{"data":"CNiKnQE=","count":0},{"data":"COK/PA==","count":0},{"data":"CMCh3wM=","count":13},{"data":"CL6e8gI=","count":42},{"data":"CJ7uuwE=","count":5},{"data":"CJDgjwE=","count":0},{"data":"CMDF2AE=","count":7},{"data":"CPKEygI=","count":0},{"data":"COCBiQE=","count":0},{"data":"CIjFogE=","count":0},{"data":"CLikiwI=","count":25},{"data":"CLrjmAE=","count":0},{"data":"CO7OXw==","count":0},{"data":"CPKKqQM=","count":0},{"data":"CP666AI=","count":0},{"data":"CM7nEA==","count":8},{"data":"CJblhAM=","count":0},{"data":"CJbfqgI=","count":0},{"data":"CLLXqQE=","count":0},{"data":"CI7GpQM=","count":0},{"data":"CIixnAI=","count":0},{"data":"CJaLTQ==","count":13},{"data":"CO7cEQ==","count":0},{"data":"CNzIgAQ=","count":0},{"data":"CK6rqQI=","count":1},{"data":"COqM6gI=","count":0},{"data":"CN7Nfg==","count":0},{"data":"CODzsgQ=","count":0},{"data":"COr32gQ=","count":39},{"data":"CLbToAI=","count":2},{"data":"COrctgI=","count":51},{"data":"CMj2lwI=","count":0},{"data":"CJ7e/AE=","count":0},{"data":"COij1QI=","count":1},{"data":"CJCdwQM=","count":0},{"data":"CKDlmQQ=","count":0},{"data":"CI6s/gM=","count":16},{"data":"CNzWbw==","count":0},{"data":"COzU3gQ=","count":6},{"data":"CMiKnwM=","count":0},{"data":"CIa2kQQ=","count":32},{"data":"CNjLiwE=","count":0},{"data":"CNTmeA==","count":3},{"data":"CKS2gQM=","count":44},{"data":"CJSf4wE=","count":25},{"data":"COydmwI=","count":0},{"data":"CJCr8QI=","count":11},{"data":"CJ7XjQQ=","count":14},{"data":"CPDMnQI=","count":29},{"data":"CPTwywQ=","count":7},{"data":"CIbTswI=","count":33},{"data":"CMCeeg==","count":12},{"data":"CMz6BQ==","count":0},{"data":"CLDhnQI=","count":20},{"data":"CMSvzAQ=","count":0},{"data":"CMimuwI=","count":30},{"data":"CNLznAQ=","count":0},{"data":"CLL9rQE=","count":0},{"data":"CKz3oAE=","count":0},{"data":"CKjD0wE=","count":0},{"data":"CIqIiQE=","count":0},{"data":"CPSJtAE=","count":9},{"data":"CLq6aw==","count":0},{"data":"CLDe9QI=","count":35},{"data":"CICM1gM=","count":27},{"data":"CKSJjQQ=","count":53},{"data":"CNaIcQ==","count":0},{"data":"CNau3QE=","count":3},{"data":"CLC+KA==","count":30},{"data":"CLTJ5QI=","count":0},{"data":"CMi1jgQ=","count":0},{"data":"CPKHTw==","count":1},{"data":"COyZiwM=","count":46},{"data":"CNbD3QQ=","count":18},{"data":"CNabdg==","count":0},{"data":"CJKQ6AI=","count":25},{"data":"CL6K4gM=","count":0},{"data":"COzW3QI=","count":0},{"data":"CIiY2wQ=","count":0},{"data":"CL7U0gI=","count":0},{"data":"CJjrnAI=","count":0},{"data":"CKyaKQ==","count":0},{"data":"CPLlZw==","count":2},{"data":"CP78MQ==","count":0},{"data":"COyfXw==","count":0},{"data":"COa7/AI=","count":4},{"data":"CMrVvgI=","count":0},{"data":"CM7rvgE=","count":21},{"data":"CNqWjAE=","count":25},{"data":"CPCChwI=","count":14},{"data":"COq07gM=","count":0},{"data":"CIa2yQI=","count":13},{"data":"CMDQyAI=","count":0},{"data":"COjWmAM=","count":0},{"data":"CITj2QE=","count":9},{"data":"CLjuzgQ=","count":0},{"data":"CKzS8gM=","count":7},{"data":"CJr0vgE=","count":0},{"data":"CJKx2QE=","count":0},{"data":"CMKUzAI=","count":23},{"data":"COCxlAQ=","count":24},{"data":"CKzd9AI=","count":17},{"data":"CJihowQ=","count":0},{"data":"CL71VA==","count":7},{"data":"CJrc8wE=","count":0},{"data":"CMzAxwE=","count":27},{"data":"CPip+AM=","count":0},{"data":"CLajmwI=","count":0},{"data":"CJS95AI=","count":1},{"data":"CMCagwQ=","count":11},{"data":"CJSmwAM=","count":21},{"data":"CKaN7AM=","count":0},{"data":"CMCRkgQ=","count":34},{"data":"CO6qqAQ=","count":34},{"data":"CLqJeQ==","count":0},{"data":"CMzh2QE=","count":0},{"data":"CMbjjgE=","count":17},{"data":"CISD+gE=","count":0},{"data":"CLzuigQ=","count":0},{"data":"CMyGtQM=","count":27},{"data":"CLbdxAI=","count":0},{"data":"CJ6TxwM=","count":37},{"data":"CLyxjgI=","count":0},{"data":"CIr8wgQ=","count":0},{"data":"CNCNhwM=","count":0},{"data":"CILL9QI=","count":0},{"data":"CMypdw==","count":0},{"data":"CLDAsAI=","count":0},{"data":"CL7NkQI=","count":0},{"data":"CML3uQQ=","count":20},{"data":"CPyhlwQ=","count":26},{"data":"CM6fsAQ=","count":8},{"data":"CJqZ0wM=","count":0},{"data":"CL79lQI=","count":6},{"data":"CNjrlgM=","count":33},{"data":"CKrU3AI=","count":42},{"data":"CO75xgQ=","count":50},{"data":"CMSjvAM=","count":0},{"data":"CK7WnwQ=","count":0},{"data":"CIrmvwM=","count":0},{"data":"CKrB3QI=","count":0},{"data":"CKSv1wI=","count":0},{"data":"CJLaqQQ=","count":19},{"data":"CLjh+AE=","count":0},{"data":"CPCdxgI=","count":13},{"data":"CJSUxQQ=","count":0},{"data":"CKrfUQ==","count":34},{"data":"CKzQ+QI=","count":16},{"data":"CPzAcg==","count":0},{"data":"CPDIpwE=","count":0},{"data":"CMjfmQM=","count":1},{"data":"CI79nAQ=","count":2},{"data":"CKrauQE=","count":14},{"data":"CPaCxAM=","count":0},{"data":"CNLHEA==","count":42},{"data":"CMKuHA==","count":0},{"data":"COiPew==","count":0},{"data":"CM7ItAQ=","count":0},{"data":"CLbilgQ=","count":21},{"data":"CIz5lQE=","count":24},{"data":"CP7yowM=","count":0},{"data":"CJypwgQ=","count":6},{"data":"CJy34QQ=","count":0},{"data":"COSM3QE=","count":44},{"data":"CKrq8QE=","count":9},{"data":"CMSrbA==","count":0},{"data":"CO7itAI=","count":0},{"data":"CLj69wM=","count":51},{"data":"CKzrogM=","count":0},{"data":"CKzYvgI=","count":22},{"data":"CIbcBg==","count":0},{"data":"CIjdgQE=","count":8},{"data":"CMSoogM=","count":5},{"data":"CMj67AE=","count":6},{"data":"CMralQE=","count":12},{"data":"CM6p1QM=","count":15},{"data":"CKTz6wM=","count":33},{"data":"CO7evgQ=","count":4},{"data":"CPTR4wE=","count":15},{"data":"COrRrAI=","count":0}],"default_value":0},"null_count":0,"tot_col_size":18943171,"last_update_version":410676699472592896,"correlation":1},"c":{"histogram":{"ndv":4999168,"buckets":[{"count":20000,"lower_bound":"MTAxMDk=","upper_bound":"MjQxNDQ=","repeats":1},{"count":40000,"lower_bound":"MjY4OTk=","upper_bound":"MzkxODI=","repeats":1},{"count":60000,"lower_bound":"NDM0MTc=","upper_bound":"NjAyNzk=","repeats":1},{"count":80000,"lower_bound":"ODQ5NzI=","upper_bound":"MTA1MDM2","repeats":1},{"count":100000,"lower_bound":"MTEwMTU4","upper_bound":"MTM0MjE4","repeats":1},{"count":120000,"lower_bound":"MTM3Mzg2","upper_bound":"MTY1MTQx","repeats":1},{"count":140000,"lower_bound":"MTY2NTk3","upper_bound":"MTY5NjU4","repeats":1},{"count":160000,"lower_bound":"MTY5Njg2","upper_bound":"MTc2MjQ5","repeats":1},{"count":180000,"lower_bound":"MTc3MjEz","upper_bound":"MTgzNTQ1","repeats":1},{"count":200000,"lower_bound":"MTg0NzM4","upper_bound":"MjEwMTcx","repeats":1},{"count":220000,"lower_bound":"MjI3ODcw","upper_bound":"MjM1Mjk2","repeats":1},{"count":240000,"lower_bound":"MjM4MTY3","upper_bound":"MjQ4NDc1","repeats":1},{"count":260000,"lower_bound":"MjU1MzA2","upper_bound":"MjU5MTEz","repeats":1},{"count":280000,"lower_bound":"MjY1Mjgy","upper_bound":"Mjc1MTIw","repeats":1},{"count":300000,"lower_bound":"MjgxODQ4","upper_bound":"MzAyMTk4","repeats":1},{"count":320000,"lower_bound":"MzAyMjQ2","upper_bound":"MzEyODU2","repeats":1},{"count":340000,"lower_bound":"MzE5NDM0","upper_bound":"MzI2MTk5","repeats":1},{"count":360000,"lower_bound":"MzMxODYy","upper_bound":"MzYyNTcx","repeats":1},{"count":380000,"lower_bound":"MzY0MzY1","upper_bound":"MzcwNzA3","repeats":1},{"count":400000,"lower_bound":"MzcyNDk3","upper_bound":"Mzg5Mzgz","repeats":1},{"count":420000,"lower_bound":"MzkxNTc5","upper_bound":"NDA4ODYy","repeats":1},{"count":440000,"lower_bound":"NDA4ODg5","upper_bound":"NDE4OTkw","repeats":1},{"count":460000,"lower_bound":"NDIyNjk3","upper_bound":"NDQ2ODcw","repeats":1},{"count":480000,"lower_bound":"NDQ3NTQy","upper_bound":"NDYyODY5","repeats":1},{"count":500000,"lower_bound":"NDYzMjEz","upper_bound":"NDY2Njcw","repeats":1},{"count":520000,"lower_bound":"NDY4Mjc1","upper_bound":"NDc5ODk5","repeats":1},{"count":540000,"lower_bound":"NDgzMTU1","upper_bound":"NDk3NTg2","repeats":1},{"count":560000,"lower_bound":"NTA3NDQy","upper_bound":"NTE3OTc4","repeats":1},{"count":580000,"lower_bound":"NTIwNTg4","upper_bound":"NTQ1NTky","repeats":1},{"count":600000,"lower_bound":"NTQ3NzAz","upper_bound":"NTY2MzE3","repeats":1},{"count":620000,"lower_bound":"NTY5NjY5","upper_bound":"NjAyMDUy","repeats":1},{"count":640000,"lower_bound":"NjE0NjM5","upper_bound":"NjQxNDgz","repeats":1},{"count":660000,"lower_bound":"NjU2Nzg3","upper_bound":"NjcwNjc2","repeats":1},{"count":680000,"lower_bound":"NjcyOTYz","upper_bound":"NjgwNzgy","repeats":1},{"count":700000,"lower_bound":"Njg4MDgw","upper_bound":"NzAwODk3","repeats":1},{"count":720000,"lower_bound":"NzA1MzMw","upper_bound":"NzI2MTkx","repeats":1},{"count":740000,"lower_bound":"NzM4OTQw","upper_bound":"NzQ3NTI0","repeats":1},{"count":760000,"lower_bound":"NzUzNzYw","upper_bound":"NzU3NDQ2","repeats":1},{"count":780000,"lower_bound":"NzU5OTYw","upper_bound":"ODA2ODA5","repeats":1},{"count":800000,"lower_bound":"ODE1NDc4","upper_bound":"ODMxNTI5","repeats":1},{"count":820000,"lower_bound":"ODM3MDA4","upper_bound":"ODU4Mzcy","repeats":1},{"count":840000,"lower_bound":"ODU5MzUz","upper_bound":"ODYyNDYw","repeats":1},{"count":860000,"lower_bound":"ODgwMzIw","upper_bound":"ODk0MzQ5","repeats":1},{"count":880000,"lower_bound":"ODk3NjU5","upper_bound":"OTA1MDAz","repeats":1},{"count":900000,"lower_bound":"OTEwMTcw","upper_bound":"OTE0OTU2","repeats":1},{"count":920000,"lower_bound":"OTI3NDQw","upper_bound":"OTc0MjYw","repeats":1},{"count":940000,"lower_bound":"OTc0ODQ5","upper_bound":"OTk0MTE1","repeats":1},{"count":960000,"lower_bound":"MTAxNDE3MA==","upper_bound":"MTAzNzI0MQ==","repeats":1},{"count":980000,"lower_bound":"MTA0ODg3Nw==","upper_bound":"MTA2Mjk3OA==","repeats":1},{"count":1000000,"lower_bound":"MTA2Njk0OA==","upper_bound":"MTA3MjYwNA==","repeats":1},{"count":1020000,"lower_bound":"MTA3MjcxMA==","upper_bound":"MTA4OTg5OA==","repeats":1},{"count":1040000,"lower_bound":"MTA5MTQwNA==","upper_bound":"MTEwMDI4Nw==","repeats":1},{"count":1060000,"lower_bound":"MTExNTU0NA==","upper_bound":"MTEyNjAwMw==","repeats":1},{"count":1080000,"lower_bound":"MTEzMzQ4NA==","upper_bound":"MTEzOTE2OA==","repeats":1},{"count":1100000,"lower_bound":"MTEzOTI1NQ==","upper_bound":"MTE1NjQwNA==","repeats":1},{"count":1120000,"lower_bound":"MTE2MTQwMw==","upper_bound":"MTE2ODEzNg==","repeats":1},{"count":1140000,"lower_bound":"MTE2ODkyOA==","upper_bound":"MTE3MzE2Mw==","repeats":1},{"count":1160000,"lower_bound":"MTE3NDUyMQ==","upper_bound":"MTE4NjE2NQ==","repeats":1},{"count":1180000,"lower_bound":"MTE4NjMwNA==","upper_bound":"MTE5NTUyNg==","repeats":1},{"count":1200000,"lower_bound":"MTIyMTQ4Ng==","upper_bound":"MTIyNzU2MA==","repeats":1},{"count":1220000,"lower_bound":"MTIyNzgzMQ==","upper_bound":"MTIzNTA1OQ==","repeats":1},{"count":1240000,"lower_bound":"MTIzNzkwOA==","upper_bound":"MTI2ODI3MQ==","repeats":1},{"count":1260000,"lower_bound":"MTI3MTYzNA==","upper_bound":"MTMwMjE2Mg==","repeats":1},{"count":1280000,"lower_bound":"MTMwNzM4MQ==","upper_bound":"MTMxNDI2NA==","repeats":1},{"count":1300000,"lower_bound":"MTMxNjMxMQ==","upper_bound":"MTM2Njg3OQ==","repeats":1},{"count":1320000,"lower_bound":"MTM3MjA5OA==","upper_bound":"MTM5MDM4Mw==","repeats":1},{"count":1340000,"lower_bound":"MTM5OTEyNQ==","upper_bound":"MTQxMzU2Ng==","repeats":1},{"count":1360000,"lower_bound":"MTQxNzQ3Mg==","upper_bound":"MTQzNjEyNw==","repeats":1},{"count":1380000,"lower_bound":"MTQzODM3OA==","upper_bound":"MTQ2OTU2MA==","repeats":1},{"count":1400000,"lower_bound":"MTQ3MjE0MA==","upper_bound":"MTQ5NDM5NQ==","repeats":1},{"count":1420000,"lower_bound":"MTQ5NDcyMg==","upper_bound":"MTUwNTQ5Mw==","repeats":1},{"count":1440000,"lower_bound":"MTUxMDQxOA==","upper_bound":"MTUyMjczOA==","repeats":1},{"count":1460000,"lower_bound":"MTUyMzQ4NA==","upper_bound":"MTUzODAxMw==","repeats":1},{"count":1480000,"lower_bound":"MTU1NjY5MQ==","upper_bound":"MTU4MjEzOA==","repeats":1},{"count":1500000,"lower_bound":"MTU4ODkyOA==","upper_bound":"MTYxMTg5MA==","repeats":1},{"count":1520000,"lower_bound":"MTYxMjgwNQ==","upper_bound":"MTYxOTEwNw==","repeats":1},{"count":1540000,"lower_bound":"MTYyMjM2NA==","upper_bound":"MTYzMjYzMA==","repeats":1},{"count":1560000,"lower_bound":"MTYzNDI0MQ==","upper_bound":"MTY1MzMxMw==","repeats":1},{"count":1580000,"lower_bound":"MTY1ODg0Nw==","upper_bound":"MTY3MTQ2NA==","repeats":1},{"count":1600000,"lower_bound":"MTY4MDUwNA==","upper_bound":"MTcwMDI4MQ==","repeats":1},{"count":1620000,"lower_bound":"MTcwNTA5NA==","upper_bound":"MTcwOTQ0OQ==","repeats":1},{"count":1640000,"lower_bound":"MTcwOTc4Ng==","upper_bound":"MTcxNjUzNQ==","repeats":1},{"count":1660000,"lower_bound":"MTcxNzE2NQ==","upper_bound":"MTcyNDUwOQ==","repeats":1},{"count":1680000,"lower_bound":"MTcyODAyMA==","upper_bound":"MTc0Mjk2OQ==","repeats":1},{"count":1700000,"lower_bound":"MTc1MDQwOQ==","upper_bound":"MTc2NDE0OA==","repeats":1},{"count":1720000,"lower_bound":"MTc2NjA3MA==","upper_bound":"MTc3ODIyMw==","repeats":1},{"count":1740000,"lower_bound":"MTc4NTcwNg==","upper_bound":"MTc5Nzc4MQ==","repeats":1},{"count":1760000,"lower_bound":"MTc5OTQxNA==","upper_bound":"MTgxNTEwNw==","repeats":1},{"count":1780000,"lower_bound":"MTgxNzg0Ng==","upper_bound":"MTgzNDI1Nw==","repeats":1},{"count":1800000,"lower_bound":"MTgzNTYwMA==","upper_bound":"MTg1NTE2MQ==","repeats":1},{"count":1820000,"lower_bound":"MTg1NzM0NA==","upper_bound":"MTg5NDY4MA==","repeats":1},{"count":1840000,"lower_bound":"MTg5OTk5MQ==","upper_bound":"MTkxMzIyMA==","repeats":1},{"count":1860000,"lower_bound":"MTkxMzQ1NQ==","upper_bound":"MTkyODU5MA==","repeats":1},{"count":1880000,"lower_bound":"MTkzNDQ2Nw==","upper_bound":"MTk1MDQ5Nw==","repeats":1},{"count":1900000,"lower_bound":"MTk1Mzc2Ng==","upper_bound":"MTk4NDkyMA==","repeats":1},{"count":1920000,"lower_bound":"MTk4OTYzMw==","upper_bound":"MjAwMTIwNg==","repeats":1},{"count":1940000,"lower_bound":"MjAwNzcwOQ==","upper_bound":"MjAxOTI1Nw==","repeats":1},{"count":1960000,"lower_bound":"MjAxOTU2Mg==","upper_bound":"MjAzMDMyOQ==","repeats":1},{"count":1980000,"lower_bound":"MjAzNTA0Ng==","upper_bound":"MjA0ODk1Ng==","repeats":1},{"count":2000000,"lower_bound":"MjA1MTgzMg==","upper_bound":"MjA1NTYwMg==","repeats":1},{"count":2020000,"lower_bound":"MjA1NjI2Nw==","upper_bound":"MjA2NDQ5OQ==","repeats":1},{"count":2040000,"lower_bound":"MjA2NjU3MQ==","upper_bound":"MjA3NTY0Ng==","repeats":1},{"count":2060000,"lower_bound":"MjA3OTQxMg==","upper_bound":"MjA5NDQ2OA==","repeats":1},{"count":2080000,"lower_bound":"MjA5OTk4NQ==","upper_bound":"MjExNTA5NQ==","repeats":1},{"count":2100000,"lower_bound":"MjEzMDAyMg==","upper_bound":"MjE0Mzk1Ng==","repeats":1},{"count":2120000,"lower_bound":"MjE0NDA3MQ==","upper_bound":"MjE1NzcwMQ==","repeats":1},{"count":2140000,"lower_bound":"MjE1OTU3OQ==","upper_bound":"MjE2NzI1NQ==","repeats":1},{"count":2160000,"lower_bound":"MjE2ODQ4NA==","upper_bound":"MjE3MzM0NQ==","repeats":1},{"count":2180000,"lower_bound":"MjE3NTI0NQ==","upper_bound":"MjIwOTk2OQ==","repeats":1},{"count":2200000,"lower_bound":"MjIyNjI5Mw==","upper_bound":"MjI0MzkzOQ==","repeats":1},{"count":2220000,"lower_bound":"MjI1MzY2MA==","upper_bound":"MjI3MDg5OA==","repeats":1},{"count":2240000,"lower_bound":"MjI3NTM5OQ==","upper_bound":"MjI4ODIwNQ==","repeats":1},{"count":2260000,"lower_bound":"MjI5NjA4OA==","upper_bound":"MjMwMTYwMQ==","repeats":1},{"count":2280000,"lower_bound":"MjMwOTA0Nw==","upper_bound":"MjMyNzM0Nw==","repeats":1},{"count":2300000,"lower_bound":"MjMyOTkyMQ==","upper_bound":"MjM0NDAzOA==","repeats":1},{"count":2320000,"lower_bound":"MjM1NTc5MQ==","upper_bound":"MjM3MzE1MQ==","repeats":1},{"count":2340000,"lower_bound":"MjM3NDAzNg==","upper_bound":"MjM4NjAyNQ==","repeats":1},{"count":2360000,"lower_bound":"MjM4ODkxOA==","upper_bound":"MjQwNDI4MQ==","repeats":1},{"count":2380000,"lower_bound":"MjQyMzk3MQ==","upper_bound":"MjQ1OTEyNQ==","repeats":1},{"count":2400000,"lower_bound":"MjQ2NjQzNw==","upper_bound":"MjQ3NDMwNg==","repeats":1},{"count":2420000,"lower_bound":"MjQ4MDQ3NA==","upper_bound":"MjUwNjE1MQ==","repeats":1},{"count":2440000,"lower_bound":"MjUwNjIwNA==","upper_bound":"MjUxNzk5NA==","repeats":1},{"count":2460000,"lower_bound":"MjU0ODQxMg==","upper_bound":"MjU2NDg5Mw==","repeats":1},{"count":2480000,"lower_bound":"MjU5MTM1NA==","upper_bound":"MjYwNjQxNw==","repeats":1},{"count":2500000,"lower_bound":"MjYxNjYxNA==","upper_bound":"MjYzMTExNA==","repeats":1},{"count":2520000,"lower_bound":"MjYzMzQwNQ==","upper_bound":"MjY0NjA2OA==","repeats":1},{"count":2540000,"lower_bound":"MjY0NjM0NQ==","upper_bound":"MjY2Mzc2Mw==","repeats":1},{"count":2560000,"lower_bound":"MjY3Mjg2OA==","upper_bound":"MjY4MTM4NA==","repeats":1},{"count":2580000,"lower_bound":"MjY4MTYxOQ==","upper_bound":"MjY4OTUzNA==","repeats":1},{"count":2600000,"lower_bound":"MjY5MTc5NQ==","upper_bound":"MjY5NDkzOA==","repeats":1},{"count":2620000,"lower_bound":"MjcwNDkxOA==","upper_bound":"MjcxMDIwMQ==","repeats":1},{"count":2640000,"lower_bound":"MjcxNjAyNQ==","upper_bound":"MjcyODEyNw==","repeats":1},{"count":2660000,"lower_bound":"MjczNzU5Nw==","upper_bound":"Mjc0OTQ3OA==","repeats":1},{"count":2680000,"lower_bound":"Mjc1MDY4NA==","upper_bound":"Mjc1NjQwOQ==","repeats":1},{"count":2700000,"lower_bound":"Mjc2MTQ2NQ==","upper_bound":"Mjc3NDU1Mw==","repeats":1},{"count":2720000,"lower_bound":"Mjc4NjMyOQ==","upper_bound":"MjgwNDkwOA==","repeats":1},{"count":2740000,"lower_bound":"MjgxMTQzNg==","upper_bound":"MjgyOTU4Nw==","repeats":1},{"count":2760000,"lower_bound":"MjgzMzE5MQ==","upper_bound":"Mjg0MjcyOQ==","repeats":1},{"count":2780000,"lower_bound":"Mjg0Mjk3MA==","upper_bound":"Mjg0NzY2MA==","repeats":1},{"count":2800000,"lower_bound":"Mjg0ODA5MA==","upper_bound":"Mjg1NTgyNQ==","repeats":1},{"count":2820000,"lower_bound":"Mjg3MjU2OQ==","upper_bound":"Mjg4MDA1Mw==","repeats":1},{"count":2840000,"lower_bound":"Mjg4MjA3NQ==","upper_bound":"Mjg5MTkxMA==","repeats":1},{"count":2860000,"lower_bound":"MjkwNDI2Nw==","upper_bound":"MjkxMTc3OA==","repeats":1},{"count":2880000,"lower_bound":"MjkxMzQzMA==","upper_bound":"MjkyNzUwOQ==","repeats":1},{"count":2900000,"lower_bound":"MjkzNzEyNw==","upper_bound":"Mjk1Mjk1NA==","repeats":1},{"count":2920000,"lower_bound":"Mjk1ODIyNw==","upper_bound":"Mjk3MDk0MA==","repeats":1},{"count":2940000,"lower_bound":"Mjk5MTM3Ng==","upper_bound":"Mjk5NTY4Mg==","repeats":1},{"count":2960000,"lower_bound":"MzAwMTcxOQ==","upper_bound":"MzAyMDI0NA==","repeats":1},{"count":2980000,"lower_bound":"MzAyMjM5OQ==","upper_bound":"MzAzNzI5Mw==","repeats":1},{"count":3000000,"lower_bound":"MzAzNzgxNg==","upper_bound":"MzA0ODYwMA==","repeats":1},{"count":3020000,"lower_bound":"MzA1NDE0Nw==","upper_bound":"MzA2NDIwOA==","repeats":1},{"count":3040000,"lower_bound":"MzA2OTkyNQ==","upper_bound":"MzA3NDg2NA==","repeats":1},{"count":3060000,"lower_bound":"MzA3NzU5Mw==","upper_bound":"MzA4NTc1MQ==","repeats":1},{"count":3080000,"lower_bound":"MzEwNzk5MA==","upper_bound":"MzEzMTUyNA==","repeats":1},{"count":3100000,"lower_bound":"MzEzMzk2MA==","upper_bound":"MzE2ODI4NQ==","repeats":1},{"count":3120000,"lower_bound":"MzE3MjE0Ng==","upper_bound":"MzE3Njc5OQ==","repeats":1},{"count":3140000,"lower_bound":"MzE3ODUzMA==","upper_bound":"MzIwMjE5MQ==","repeats":1},{"count":3160000,"lower_bound":"MzIwNjU2OA==","upper_bound":"MzIxNTQwOA==","repeats":1},{"count":3180000,"lower_bound":"MzIxNjI0NQ==","upper_bound":"MzIyODI1Mw==","repeats":1},{"count":3200000,"lower_bound":"MzIzMDU4NQ==","upper_bound":"MzI0NTE4MQ==","repeats":1},{"count":3220000,"lower_bound":"MzI1NzMwNQ==","upper_bound":"MzI1OTMyOQ==","repeats":1},{"count":3240000,"lower_bound":"MzI2NDY2OQ==","upper_bound":"MzI3NzY5Ng==","repeats":1},{"count":3260000,"lower_bound":"MzI4MDI1Mg==","upper_bound":"MzI4NzMyMQ==","repeats":1},{"count":3280000,"lower_bound":"MzI5MTIyNg==","upper_bound":"MzI5NTEwNA==","repeats":1},{"count":3300000,"lower_bound":"MzI5NTc3Mg==","upper_bound":"MzMwMjU5NA==","repeats":1},{"count":3320000,"lower_bound":"MzMwMzU3OA==","upper_bound":"MzMxMzYwNw==","repeats":1},{"count":3340000,"lower_bound":"MzMyNDA0Ng==","upper_bound":"MzMyODAwMg==","repeats":1},{"count":3360000,"lower_bound":"MzMyOTczOQ==","upper_bound":"MzM0OTc5OQ==","repeats":1},{"count":3380000,"lower_bound":"MzM1MjIxNQ==","upper_bound":"MzM4NzUwMQ==","repeats":1},{"count":3400000,"lower_bound":"MzM4ODY0Ng==","upper_bound":"MzQxNDYyMA==","repeats":1},{"count":3420000,"lower_bound":"MzQxNDk5MQ==","upper_bound":"MzQzMzg3MQ==","repeats":1},{"count":3440000,"lower_bound":"MzQzNDU0NA==","upper_bound":"MzQ1MDY0Mw==","repeats":1},{"count":3460000,"lower_bound":"MzQ2MTMwNA==","upper_bound":"MzQ4Mjk4OA==","repeats":1},{"count":3480000,"lower_bound":"MzQ4NjE0Ng==","upper_bound":"MzQ5MzM3Mw==","repeats":1},{"count":3500000,"lower_bound":"MzQ5NjUyMA==","upper_bound":"MzUxNjczOQ==","repeats":1},{"count":3520000,"lower_bound":"MzUyMjM0NQ==","upper_bound":"MzU0MDI2MA==","repeats":1},{"count":3540000,"lower_bound":"MzU0MTc3NA==","upper_bound":"MzU1NzA0Nw==","repeats":1},{"count":3560000,"lower_bound":"MzU1OTQxNw==","upper_bound":"MzU2NDA0NA==","repeats":1},{"count":3580000,"lower_bound":"MzU2NzU0Mg==","upper_bound":"MzU5MzgxMQ==","repeats":1},{"count":3600000,"lower_bound":"MzU5NDU1OQ==","upper_bound":"MzYwNjk2Mg==","repeats":1},{"count":3620000,"lower_bound":"MzYxNzQ3MA==","upper_bound":"MzYzNzE0MA==","repeats":1},{"count":3640000,"lower_bound":"MzY0ODAyMg==","upper_bound":"MzY1Njc2OA==","repeats":1},{"count":3660000,"lower_bound":"MzY2MDY1NA==","upper_bound":"MzY4MDE0MQ==","repeats":1},{"count":3680000,"lower_bound":"MzY4Njg4Nw==","upper_bound":"MzcwMTg3NA==","repeats":1},{"count":3700000,"lower_bound":"MzcyODM5Mg==","upper_bound":"Mzc0NzI5Nw==","repeats":1},{"count":3720000,"lower_bound":"Mzc0OTE4MQ==","upper_bound":"Mzc2MjE4Nw==","repeats":1},{"count":3740000,"lower_bound":"Mzc2MzE4MQ==","upper_bound":"Mzc3NTU5Nw==","repeats":1},{"count":3760000,"lower_bound":"Mzc3ODkyNA==","upper_bound":"Mzc4NjQwNQ==","repeats":1},{"count":3780000,"lower_bound":"Mzc4NzgxMw==","upper_bound":"MzgwMTk3Mw==","repeats":1},{"count":3800000,"lower_bound":"MzgwMjc5Mg==","upper_bound":"MzgxMjIxMA==","repeats":1},{"count":3820000,"lower_bound":"MzgzMDI2NA==","upper_bound":"MzgzODk5NA==","repeats":1},{"count":3840000,"lower_bound":"Mzg0NjIzMg==","upper_bound":"Mzg3MjkzMw==","repeats":1},{"count":3860000,"lower_bound":"Mzg3ODI5NQ==","upper_bound":"Mzg4ODYzNw==","repeats":1},{"count":3880000,"lower_bound":"Mzg5NDQwNw==","upper_bound":"MzkxMDIyNQ==","repeats":1},{"count":3900000,"lower_bound":"MzkxMTgxOQ==","upper_bound":"MzkyODcxMw==","repeats":1},{"count":3920000,"lower_bound":"MzkyOTczMQ==","upper_bound":"MzkzNTQ5OA==","repeats":1},{"count":3940000,"lower_bound":"MzkzNzEwOA==","upper_bound":"Mzk0MjQ1OA==","repeats":1},{"count":3960000,"lower_bound":"Mzk0NTYyNw==","upper_bound":"Mzk0OTE2MQ==","repeats":1},{"count":3980000,"lower_bound":"Mzk1NDE1MQ==","upper_bound":"Mzk3MzM2OA==","repeats":1},{"count":4000000,"lower_bound":"Mzk3OTY5NA==","upper_bound":"Mzk4MjE5Mg==","repeats":1},{"count":4020000,"lower_bound":"Mzk4MzM4OQ==","upper_bound":"Mzk5MzI1MA==","repeats":1},{"count":4040000,"lower_bound":"Mzk5NzU0OA==","upper_bound":"NDAxMTMwMA==","repeats":1},{"count":4060000,"lower_bound":"NDAxNTQzMg==","upper_bound":"NDAyNjAwNQ==","repeats":1},{"count":4080000,"lower_bound":"NDAyNjI3OA==","upper_bound":"NDAzODg4MA==","repeats":1},{"count":4100000,"lower_bound":"NDAzOTEyMg==","upper_bound":"NDA0ODIyOQ==","repeats":1},{"count":4120000,"lower_bound":"NDA0ODg5MA==","upper_bound":"NDA1NDUxOQ==","repeats":1},{"count":4140000,"lower_bound":"NDA1ODQ5NA==","upper_bound":"NDA3MDA1Mg==","repeats":1},{"count":4160000,"lower_bound":"NDA3NTgzOA==","upper_bound":"NDEwNzcyNA==","repeats":1},{"count":4180000,"lower_bound":"NDEwODI5NQ==","upper_bound":"NDEyNDg4OA==","repeats":1},{"count":4200000,"lower_bound":"NDEyNzg1Mw==","upper_bound":"NDEzNzQ2MA==","repeats":1},{"count":4220000,"lower_bound":"NDE1MDQ2OA==","upper_bound":"NDE4OTIyOA==","repeats":1},{"count":4240000,"lower_bound":"NDE5MjI2Nw==","upper_bound":"NDE5NzkyNA==","repeats":1},{"count":4260000,"lower_bound":"NDE5OTA4Nw==","upper_bound":"NDIyMTYzNQ==","repeats":1},{"count":4280000,"lower_bound":"NDIyMTgzOA==","upper_bound":"NDI0NzgzOQ==","repeats":1},{"count":4300000,"lower_bound":"NDI0ODI5MA==","upper_bound":"NDI2MTI0NQ==","repeats":1},{"count":4320000,"lower_bound":"NDI3MTc3NA==","upper_bound":"NDI5MjQ2Nw==","repeats":1},{"count":4340000,"lower_bound":"NDI5NTIxNg==","upper_bound":"NDMwODcwMQ==","repeats":1},{"count":4360000,"lower_bound":"NDMwOTE5MA==","upper_bound":"NDMyNDgxMQ==","repeats":1},{"count":4380000,"lower_bound":"NDMyNzI1Nw==","upper_bound":"NDM0NTE5MQ==","repeats":1},{"count":4400000,"lower_bound":"NDM1MDQ4OQ==","upper_bound":"NDM2MTE1NA==","repeats":1},{"count":4420000,"lower_bound":"NDM2MTc5Nw==","upper_bound":"NDM3ODAwNQ==","repeats":1},{"count":4440000,"lower_bound":"NDM4MjAyNg==","upper_bound":"NDM4NzUyNw==","repeats":1},{"count":4460000,"lower_bound":"NDM4OTc1MA==","upper_bound":"NDQwNzE4Mg==","repeats":1},{"count":4480000,"lower_bound":"NDQxNzI4Mw==","upper_bound":"NDQzMzE1OQ==","repeats":1},{"count":4500000,"lower_bound":"NDQzNjc5MA==","upper_bound":"NDQ0NDUyOQ==","repeats":1},{"count":4520000,"lower_bound":"NDQ0ODI2MQ==","upper_bound":"NDQ1OTgzNw==","repeats":1},{"count":4540000,"lower_bound":"NDQ2MTUxNg==","upper_bound":"NDQ2OTUyNA==","repeats":1},{"count":4560000,"lower_bound":"NDQ3MTgyNQ==","upper_bound":"NDQ4MjM4MQ==","repeats":1},{"count":4580000,"lower_bound":"NDQ5NTE1Ng==","upper_bound":"NDUyMjM0Nw==","repeats":1},{"count":4600000,"lower_bound":"NDUyNDE5NA==","upper_bound":"NDUzNTY2Mg==","repeats":1},{"count":4620000,"lower_bound":"NDUzODAxMw==","upper_bound":"NDU0OTQ4NQ==","repeats":1},{"count":4640000,"lower_bound":"NDU1NTQxNA==","upper_bound":"NDU3NDYxNQ==","repeats":1},{"count":4660000,"lower_bound":"NDU4MzIwNw==","upper_bound":"NDU5NTg0OA==","repeats":1},{"count":4680000,"lower_bound":"NDYxMzAyOA==","upper_bound":"NDYxNTI3Mw==","repeats":1},{"count":4700000,"lower_bound":"NDYxNzQ3Ng==","upper_bound":"NDYyNDU0NA==","repeats":1},{"count":4720000,"lower_bound":"NDY0NzYxOQ==","upper_bound":"NDY2NTMzNQ==","repeats":1},{"count":4740000,"lower_bound":"NDY3OTE0MQ==","upper_bound":"NDY4NDU1NA==","repeats":1},{"count":4760000,"lower_bound":"NDY4NjU0OA==","upper_bound":"NDY5NDg4Mw==","repeats":1},{"count":4780000,"lower_bound":"NDY5NzI3Mw==","upper_bound":"NDcyODgwNA==","repeats":1},{"count":4800000,"lower_bound":"NDczMTc5Nw==","upper_bound":"NDc0NjQ3OA==","repeats":1},{"count":4820000,"lower_bound":"NDc0OTc5MA==","upper_bound":"NDc4NjM0MQ==","repeats":1},{"count":4840000,"lower_bound":"NDc4ODQwMg==","upper_bound":"NDgwNjg3Mg==","repeats":1},{"count":4860000,"lower_bound":"NDgxNzc1MA==","upper_bound":"NDgyNzg3OA==","repeats":1},{"count":4880000,"lower_bound":"NDg0MTA3MA==","upper_bound":"NDg1NDE0Ng==","repeats":1},{"count":4900000,"lower_bound":"NDg1ODA1Nw==","upper_bound":"NDg2NzYxMQ==","repeats":1},{"count":4920000,"lower_bound":"NDg2ODU0NQ==","upper_bound":"NDkwMTQ1OA==","repeats":1},{"count":4940000,"lower_bound":"NDkyMjMyNg==","upper_bound":"NDkzNDMzMA==","repeats":1},{"count":4960000,"lower_bound":"NDk0MTg2OA==","upper_bound":"NDk2NjkyMg==","repeats":1},{"count":4980000,"lower_bound":"NDk2OTc4NQ==","upper_bound":"NDk5MDY1NQ==","repeats":1},{"count":5000000,"lower_bound":"NDk5MzM0Nw==","upper_bound":"NDk5NzkyMw==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2440,2365,2430,2426,2446,2389,2522,2512,2438,2440,2485,2454,2499,2371,2370,2509,2483,2437,2492,2395,2551,2482,2410,2511,2441,2363,2475,2387,2438,2472,2396,2413,2374,2439,2488,2385,2402,2483,2439,2437,2496,2392,2489,2458,2295,2409,2440,2383,2347,2453,2502,2344,2441,2461,2331,2286,2522,2403,2425,2473,2416,2497,2425,2392,2402,2418,2421,2408,2439,2355,2291,2460,2452,2520,2512,2490,2506,2417,2377,2418,2438,2450,2529,2468,2445,2505,2427,2449,2419,2494,2403,2336,2485,2487,2464,2402,2437,2406,2511,2433,2462,2400,2432,2387,2451,2446,2518,2457,2371,2496,2327,2458,2467,2392,2439,2508,2424,2441,2503,2475,2412,2388,2464,2438,2441,2475,2458,2415,2400,2464,2398,2546,2420,2495,2470,2483,2571,2424,2472,2443,2420,2409,2443,2470,2432,2376,2326,2437,2419,2409,2440,2485,2436,2432,2487,2453,2405,2699,2413,2422,2484,2501,2349,2416,2402,2441,2502,2388,2465,2422,2436,2412,2469,2396,2526,2477,2517,2486,2514,2433,2434,2461,2431,2437,2344,2423,2377,2440,2432,2395,2513,2450,2503,2411,2437,2434,2381,2371,2418,2362,2470,2475,2402,2505,2370,2505,2463,2477,2467,2442,2409,2478,2494,2503,2419,2427,2365,2430,2404,2389,2528,2501,2440,2437,2375,2505,2484,2446,2453,2512,2483,2439,2467,2531,2469,2363,2489,2425,2408,2502,2482,2399,2374,2461,2391,2462,2413,2466,2415,2439,2424,2500,2444,2352,2430,2356,2480,2439,2415,2444,2396,2517,2363,2412,2459,2405,2486,2382,2494,2487,2445,2408,2424,2478,2413,2440,2437,2434,2472,2318,2444,2554,2362,2437,2444,2337,2411,2386,2387,2409,2425,2428,2371,2469,2387,2449,2440,2441,2391,2387,2307,2391,2473,2438,2450,2375,2504,2449,2440,2466,2441,2357,2363,2599,2415,2439,2442,2444,2471,2377,2471,2437,2435,2412,2414,2370,2394,2394,2404,2436,2387,2454,2499,2406,2350,2328,2355,2410,2338,2519,2453,2436,2422,2421,2404,2459,2429,2451,2398,2353,2459,2433,2395,2504,2408,2477,2458,2497,2516,2531,2353,2388,2339,2426,2413,2390,2439,2445,2458,2440,2439,2442,2448,2367,2416,2434,2352,2495,2435,2525,2467,2403,2447,2491,2532,2408,2395,2432,2432,2425,2437,2371,2404,2385,2366,2454,2464,2376,2309,2409,2466,2448,2449,2425,2457,2425,2422,2436,2399,2300,2463,2440,2452,2440,2386,2374,2502,2433,2443,2590,2387,2377,2429,2447,2484,2459,2371,2378,2430,2466,2382,2432,2431,2466,2493,2385,2416,2543,2350,2438,2463,2377,2436,2462,2406,2495,2430,2419,2449,2480,2406,2394,2391,2447,2359,2453,2493,2512,2358,2434,2379,2507,2488,2431,2377,2432,2453,2404,2528,2453,2362,2473,2457,2496,2379,2431,2437,2428,2430,2406,2440,2418,2451,2452,2450,2430,2444,2480,2440,2462,2400,2382,2476,2403,2440,2384,2443,2457,2495,2331,2449,2397,2528,2484,2437,2441,2457,2385,2406,2324,2439,2423,2395,2473,2406,2418,2466,2366,2453,2440,2462,2472,2392,2434,2437,2439,2400,2473,2532,2466,2497,2375,2559,2396,2548,2404,2410,2390,2436,2455,2414,2380,2500,2387,2475,2412,2393,2404,2473,2583,2435,2405,2356,2471,2430,2401,2479,2395,2396,2338,2383,2459,2477,2445,2415,2423,2458,2471,2470,2480,2454,2379,2410,2421,2394,2415,2367,2428,2517,2436,2417,2467,2451,2512,2485,2424,2415,2467,2405,2515,2505,2327,2446,2555,2488,2470,2466,2420,2455,2402,2429,2466,2451,2511,2531,2432,2541,2409,2409,2439,2406,2472,2504,2475,2431,2482,2425,2451,2449,2469,2435,2433,2394,2470,2432,2464,2313,2517,2384,2374,2419,2441,2467,2444,2426,2501,2446,2482,2376,2458,2388,2410,2429,2391,2368,2443,2397,2440,2415,2456,2451,2467,2388,2435,2462,2407,2429,2437,2418,2493,2472,2415,2316,2454,2515,2447,2419,2425,2471,2436,2405,2351,2463,2421,2424,2283,2474,2564,2482,2339,2417,2405,2386,2299,2379,2432,2455,2450,2442,2390,2388,2418,2466,2445,2475,2510,2456,2431,2476,2395,2473,2356,2383,2432,2508,2484,2447,2454,2451,2498,2452,2455,2436,2426,2417,2437,2385,2423,2481,2376,2417,2509,2390,2344,2468,2439,2529,2539,2504,2364,2422,2358,2471,2408,2435,2397,2388,2511,2465,2397,2389,2443,2410,2470,2416,2369,2450,2424,2464,2457,2410,2396,2377,2422,2506,2440,2476,2431,2371,2473,2421,2336,2405,2426,2349,2473,2495,2414,2373,2436,2466,2418,2388,2486,2438,2503,2469,2436,2351,2390,2512,2427,2391,2429,2439,2425,2410,2410,2501,2580,2410,2442,2472,2563,2480,2491,2438,2387,2592,2459,2509,2436,2409,2485,2362,2548,2454,2483,2427,2402,2452,2546,2438,2380,2389,2437,2314,2481,2347,2511,2377,2413,2401,2455,2400,2383,2374,2362,2455,2436,2509,2412,2398,2445,2466,2487,2443,2474,2411,2407,2477,2557,2421,2449,2393,2539,2382,2489,2470,2371,2438,2429,2472,2376,2430,2572,2432,2372,2426,2442,2454,2415,2502,2376,2473,2461,2418,2454,2443,2432,2472,2415,2541,2492,2476,2474,2416,2398,2466,2405,2438,2440,2365,2413,2352,2414,2433,2330,2436,2372,2434,2401,2483,2408,2451,2367,2428,2424,2441,2504,2455,2434,2404,2446,2377,2468,2569,2427,2386,2463,2408,2536,2468,2433,2397,2412,2438,2534,2392,2530,2397,2497,2453,2405,2423,2392,2475,2430,2425,2496,2380,2413,2535,2432,2438,2484,2461,2373,2375,2398,2470,2437,2448,2498,2482,2402,2475,2391,2359,2436,2411,2447,2459,2439,2415,2428,2439,2421,2433,2450,2441,2408,2433,2477,2413,2440,2418,2455,2444,2411,2457,2431,2440,2359,2491,2455,2495,2431,2491,2431,2362,2395,2395,2433,2454,2342,2498,2467,2407,2445,2273,2470,2461,2519,2379,2505,2415,2476,2461,2366,2483,2396,2453,2503,2440,2407,2495,2395,2479,2293,2360,2383,2526,2452,2414,2384,2434,2460,2542,2413,2462,2392,2349,2355,2452,2405,2325,2498,2481,2420,2425,2455,2399,2423,2437,2435,2441,2448,2457,2549,2445,2439,2445,2441,2436,2412,2358,2479,2436,2429,2415,2434,2469,2401,2374,2508,2432,2515,2476,2344,2439,2448,2440,2493,2415,2448,2466,2541,2409,2462,2508,2392,2431,2399,2436,2429,2404,2451,2428,2396,2441,2392,2468,2439,2502,2450,2430,2424,2394,2504,2353,2405,2446,2389,2322,2415,2440,2483,2473,2370,2414,2422,2420,2465,2423,2427,2403,2434,2449,2382,2346,2438,2391,2343,2469,2487,2377,2462,2357,2439,2551,2513,2481,2415,2429,2490,2438,2338,2485,2398,2411,2436,2443,2440,2428,2415,2379,2364,2418,2492,2394,2503,2452,2432,2497,2450,2379,2371,2494,2343,2400,2398,2493,2434,2544,2379,2436,2411,2453,2468,2365,2398,2481,2415,2490,2412,2479,2345,2462,2440,2320,2439,2562,2419,2475,2471,2579,2429,2472,2460,2533,2456,2454,2362,2426,2448,2406,2437,2372,2439,2387,2392,2431,2516,2514,2417,2389,2468,2446,2437,2436,2517,2439,2417,2430,2397,2424,2438,2419,2442,2557,2450,2353,2456,2417,2510,2437,2446,2427,2542,2460,2436,2419,2437,2457,2445,2454,2406,2379,2489,2390,2534,2374,2416,2438,2417,2480,2517,2409,2374,2411,2430,2430,2401,2412,2417,2371,2431,2401,2460,2392,2517,2399,2489,2374,2337,2491,2418,2472,2531,2399,2475,2420,2431,2443,2400,2438,2447,2420,2416,2367,2362,2450,2560,2466,2455,2526,2476,2421,2433,2419,2468,2430,2437,2444,2418,2444,2460,2400,2431,2522,2535,2535,2445,2443,2387,2375,2356,2352,2462,2438,2387,2468,2439,2521,2440,2372,2457,2404,2467,2406,2510,2388,2356,2519,2282,2390,2348,2408,2443,2405,2366,2462,2290,2535,2394,2427,2490,2369,2495,2466,2477,2495,2397,2334,2534,2485,2373,2435,2480,2341,2480,2388,2437,2410,2427,2453,2416,2437,2401,2378,2494,2397,2392,2448,2470,2384,2485,2436,2438,2498,2365,2472,2427,2382,2552,2454,2576,2433,2436,2441,2471,2378,2466,2392,2439,2409,2410,2409,2452,2495,2433,2343,2460,2409,2434,2424,2438,2470,2406,2462,2458,2607,2330,2458,2506,2369,2401,2470,2426,2381,2437,2483,2448,2474,2426,2443,2443,2361,2482,2426,2487,2473,2474,2409,2415,2315,2394,2487,2366,2336,2440,2412,2439,2359,2428,2451,2410,2442,2423,2434,2478,2428,2415,2356,2478,2352,2423,2412,2426,2381,2439,2452,2480,2494,2330,2464,2478,2486,2437,2404,2455,2511,2451,2553,2428,2422,2478,2416,2417,2439,2465,2490,2391,2340,2451,2448,2465,2456,2492,2401,2436,2459,2470,2560,2392,2442,2466,2404,2450,2418,2453,2422,2489,2404,2434,2454,2445,2446,2349,2428,2465,2525,2498,2521,2422,2383,2481,2453,2432,2367,2510,2381,2473,2455,2383,2404,2369,2499,2411,2507,2398,2414,2389,2289,2422,2492,2407,2397,2432,2415,2430,2416,2374,2479,2438,2424,2504,2444,2402,2489,2471,2414,2388,2512,2529,2494,2436,2434,2436,2428,2449,2478,2442,2435,2411,2447,2437,2529,2438,2501,2366,2356,2492,2473,2394,2376,2443,2388,2446,2449,2492,2448,2462,2480,2509,2436,2422,2419,2485,2363,2369,2483,2450,2468,2389,2402,2426,2440,2401,2405,2415,2425,2461,2471,2479,2416,2420,2396,2490,2438,2519,2470,2448,2470,2458,2494,2473,2437,2683,2460,2414,2473,2403,2475,2439,2473,2425,2456,2368,2448,2337,2439,2354,2438,2439,2529,2426,2460,2407,2418,2461,2453,2475,2462,2366,2369,2536,2436,2438,2452,2437,2369,2437,2434,2500,2407,2505,2373,2458,2396,2496,2438,2482,2441,2360,2422,2408,2361,2442,2392,2497,2484,2326,2489,2371,2457,2402,2440,2403,2415,2392,2384,2448,2371,2517,2379,2416,2373,2411,2384,2438,2437,2394,2371,2512,2359,2437,2443,2472,2394,2441,2425,2404,2461,2403,2356,2414,2493,2370,2512,2461,2524,2488,2357,2556,2453,2474,2476,2453,2420,2463,2453,2517,2437,2425,2448,2419,2466,2395,2410,2470,2414,2413,2339,2430,2453,2424,2429,2461,2361,2369,2465,2395,2481,2449,2404,2442,2436,2444,2457,2460,2419,2423,2461,2464,2494,2371,2324,2416,2388,2390,2452,2446,2421,2409,2419,2421,2446,2394,2519,2464,2463,2393,2346,2446,2465,2388,2447,2426,2471,2505,2430,2457,2413,2409,2490,2438,2469,2410,2450,2535,2490,2393,2412,2479,2426,2403,2437,2399,2494,2386,2524,2358,2401,2483,2438,2438,2453,2449,2425,2503,2395,2415,2429,2374,2404,2466,2465,2424,2364,2416,2469,2424,2404,2418,2484,2489,2484,2412,2421,2498,2473,2405,2529,2563,2449,2418,2442,2408,2441,2487,2465,2397,2445,2405,2401,2375,2396,2346,2430,2451,2391,2478,2421,2406,2309,2512,2399,2460,2494,2440,2508,2446,2354,2440,2402,2438,2471,2390,2458,2420,2327,2459,2512,2449,2363,2468,2504,2461,2435,2442,2529,2412,2438,2482,2442,2503,2421,2462,2379,2420,2454,2434,2435,2388,2369,2385,2436,2403,2415,2447,2414,2440,2462,2401,2455,2329,2504,2483,2452,2479,2440,2317,2416,2433,2469,2454,2425,2408,2482,2455,2488,2436,2481,2412,2432,2555,2482,2422,2480,2497,2506,2488,2424,2478,2361,2409,2403,2465,2424,2438,2404,2412,2444,2519,2384,2489,2495,2486,2482,2429,2506,2484,2408,2488,2483,2439,2472,2325,2412,2479,2490,2455,2379,2439,2497,2527,2385,2451,2505,2510,2457,2414,2463,2334,2518,2389,2346,2463,2487,2468,2463,2372,2487,2422,2438,2461,2421,2495,2356,2383,2413,2440,2464,2412,2469,2437,2426,2463,2445,2351,2440,2485,2435,2495,2417,2456,2372,2495,2440,2464,2386,2481,2514,2374,2480,2437,2498,2449,2363,2412,2508,2367,2466,2421,2534,2440,2399,2459,2354,2500,2366,2386,2502,2415,2455,2507,2386,2438,2445,2488,2416,2513,2410,2431,2476,2255,2440,2414,2493,2466,2453,2409,2416,2438,2393,2391,2497,2437,2429,2432,2494,2484,2370,2469,2371,2412]},{"counters":[2452,2350,2411,2405,2341,2440,2421,2418,2416,2453,2427,2452,2426,2347,2443,2452,2407,2452,2449,2383,2422,2451,2464,2403,2473,2364,2425,2503,2441,2466,2448,2397,2390,2461,2342,2485,2432,2446,2419,2360,2456,2481,2445,2437,2392,2403,2470,2426,2327,2424,2385,2380,2461,2431,2415,2370,2438,2442,2447,2485,2448,2403,2426,2356,2439,2472,2479,2455,2296,2333,2468,2410,2418,2439,2438,2504,2444,2525,2502,2436,2401,2504,2447,2405,2437,2414,2466,2436,2444,2303,2467,2546,2411,2438,2388,2449,2466,2361,2366,2442,2479,2386,2439,2459,2416,2440,2432,2530,2403,2526,2497,2349,2441,2391,2449,2378,2407,2458,2469,2487,2439,2452,2473,2426,2507,2505,2486,2355,2408,2429,2392,2417,2449,2437,2423,2436,2402,2372,2358,2425,2444,2394,2388,2456,2501,2407,2439,2502,2385,2386,2503,2562,2460,2412,2365,2391,2399,2357,2389,2409,2517,2438,2378,2404,2414,2515,2424,2435,2510,2479,2522,2484,2442,2412,2504,2436,2464,2447,2411,2443,2515,2456,2388,2400,2439,2526,2453,2373,2489,2372,2488,2438,2443,2404,2376,2417,2434,2512,2413,2446,2478,2426,2544,2413,2469,2438,2374,2372,2493,2479,2349,2349,2449,2524,2443,2436,2358,2440,2454,2601,2399,2419,2392,2455,2441,2417,2546,2453,2427,2454,2424,2404,2356,2420,2390,2376,2418,2438,2456,2469,2474,2369,2310,2494,2471,2441,2460,2466,2454,2548,2527,2341,2530,2378,2425,2430,2446,2404,2360,2459,2484,2431,2409,2438,2478,2426,2478,2337,2436,2371,2430,2464,2548,2441,2445,2562,2457,2444,2483,2545,2394,2452,2627,2389,2427,2479,2484,2369,2392,2424,2435,2414,2366,2436,2441,2474,2462,2428,2375,2409,2433,2454,2461,2480,2406,2404,2433,2448,2397,2370,2496,2487,2324,2449,2368,2459,2445,2389,2521,2440,2556,2374,2406,2459,2427,2435,2423,2352,2505,2515,2448,2440,2420,2441,2323,2424,2401,2378,2412,2394,2438,2491,2449,2429,2451,2478,2494,2463,2466,2465,2420,2491,2407,2371,2480,2430,2342,2438,2447,2433,2466,2439,2410,2462,2468,2424,2427,2445,2483,2451,2455,2478,2390,2441,2441,2465,2485,2437,2377,2377,2345,2551,2417,2435,2498,2431,2408,2414,2458,2421,2381,2539,2437,2420,2415,2392,2397,2338,2448,2437,2433,2521,2410,2408,2472,2358,2433,2321,2505,2428,2451,2442,2335,2486,2349,2438,2417,2463,2405,2412,2414,2561,2400,2455,2406,2428,2421,2378,2384,2402,2436,2364,2429,2369,2423,2369,2435,2452,2383,2393,2285,2477,2542,2444,2441,2445,2426,2405,2449,2405,2521,2500,2394,2409,2452,2436,2414,2436,2498,2438,2465,2446,2471,2429,2313,2470,2451,2440,2452,2423,2525,2439,2391,2420,2392,2457,2376,2412,2513,2436,2439,2439,2442,2457,2413,2439,2497,2432,2433,2392,2508,2440,2433,2506,2392,2395,2441,2368,2386,2425,2389,2321,2399,2529,2331,2453,2448,2483,2434,2445,2345,2408,2514,2450,2401,2504,2327,2438,2402,2429,2385,2411,2470,2437,2396,2479,2323,2342,2421,2503,2439,2468,2422,2465,2458,2417,2448,2437,2486,2527,2412,2406,2445,2416,2442,2456,2419,2417,2436,2422,2446,2456,2355,2446,2458,2418,2471,2425,2521,2486,2390,2415,2439,2432,2483,2379,2440,2441,2330,2483,2446,2343,2388,2461,2418,2378,2389,2477,2467,2439,2412,2573,2437,2404,2342,2439,2453,2469,2483,2463,2463,2401,2464,2419,2486,2453,2504,2424,2403,2426,2441,2471,2456,2548,2466,2437,2415,2443,2340,2329,2453,2469,2416,2420,2436,2440,2360,2440,2432,2465,2495,2497,2418,2488,2359,2437,2467,2471,2455,2414,2416,2441,2382,2426,2391,2442,2415,2366,2356,2471,2455,2431,2471,2538,2442,2463,2428,2429,2420,2425,2381,2433,2414,2372,2429,2355,2509,2352,2392,2499,2408,2448,2456,2495,2470,2351,2490,2504,2514,2442,2433,2506,2432,2437,2472,2443,2394,2483,2358,2538,2436,2418,2482,2400,2445,2444,2505,2473,2555,2413,2436,2380,2504,2446,2431,2495,2374,2448,2438,2375,2447,2431,2368,2535,2410,2438,2484,2489,2438,2449,2439,2375,2455,2461,2397,2408,2446,2337,2473,2552,2509,2391,2420,2422,2415,2378,2496,2536,2466,2421,2559,2385,2431,2535,2493,2383,2444,2364,2509,2537,2484,2439,2429,2327,2438,2303,2464,2410,2382,2427,2461,2484,2409,2494,2394,2464,2397,2434,2476,2411,2399,2469,2484,2447,2414,2405,2367,2501,2394,2540,2482,2437,2417,2388,2395,2446,2361,2475,2486,2383,2520,2490,2411,2382,2421,2461,2438,2389,2424,2379,2468,2450,2450,2407,2482,2444,2455,2447,2470,2379,2534,2422,2376,2448,2430,2498,2419,2478,2428,2499,2480,2489,2432,2507,2418,2455,2425,2392,2448,2478,2423,2446,2529,2454,2438,2509,2496,2504,2423,2438,2404,2466,2440,2450,2261,2446,2512,2396,2414,2443,2394,2423,2482,2448,2453,2513,2493,2430,2555,2397,2397,2460,2416,2391,2481,2472,2442,2540,2477,2421,2399,2384,2391,2536,2390,2493,2492,2480,2391,2448,2439,2413,2471,2425,2494,2320,2371,2465,2430,2435,2521,2400,2501,2469,2355,2437,2602,2454,2410,2443,2419,2437,2349,2456,2475,2437,2449,2426,2355,2440,2488,2419,2434,2387,2425,2428,2378,2440,2426,2441,2416,2504,2491,2431,2534,2459,2521,2439,2475,2367,2380,2466,2448,2451,2468,2474,2403,2415,2475,2336,2466,2499,2435,2386,2344,2490,2405,2506,2545,2507,2471,2358,2466,2529,2445,2433,2325,2433,2462,2396,2363,2454,2359,2440,2429,2455,2465,2420,2398,2480,2540,2420,2467,2533,2415,2491,2452,2416,2476,2467,2421,2507,2431,2499,2544,2437,2426,2421,2462,2439,2311,2455,2439,2469,2497,2514,2508,2383,2456,2440,2478,2426,2443,2542,2467,2378,2404,2429,2319,2430,2367,2461,2431,2385,2447,2404,2477,2412,2369,2439,2488,2467,2390,2486,2436,2453,2416,2437,2409,2456,2420,2532,2422,2432,2437,2365,2492,2456,2367,2430,2416,2390,2411,2441,2461,2564,2349,2393,2431,2507,2359,2458,2504,2345,2419,2395,2547,2474,2389,2447,2435,2396,2480,2459,2532,2420,2512,2390,2402,2518,2367,2484,2494,2457,2398,2460,2538,2359,2439,2466,2489,2437,2478,2402,2444,2380,2428,2358,2363,2437,2428,2356,2528,2438,2429,2450,2435,2439,2439,2483,2335,2383,2386,2458,2398,2430,2478,2479,2447,2347,2538,2379,2472,2407,2408,2389,2534,2364,2457,2395,2414,2404,2467,2527,2447,2434,2420,2443,2432,2434,2382,2382,2408,2489,2400,2343,2534,2497,2489,2441,2475,2454,2424,2388,2519,2440,2477,2404,2438,2412,2459,2464,2404,2435,2415,2481,2453,2429,2408,2456,2536,2423,2437,2469,2461,2416,2478,2435,2448,2403,2381,2360,2369,2436,2372,2465,2417,2454,2353,2412,2483,2469,2389,2483,2366,2379,2475,2452,2417,2398,2540,2404,2473,2438,2427,2468,2407,2447,2391,2476,2440,2346,2465,2417,2380,2436,2446,2469,2444,2409,2400,2412,2433,2440,2520,2398,2442,2418,2496,2421,2395,2388,2420,2486,2350,2454,2398,2420,2369,2473,2549,2483,2497,2366,2491,2456,2515,2384,2497,2438,2439,2362,2499,2429,2459,2370,2361,2471,2390,2434,2426,2462,2478,2416,2515,2437,2414,2412,2370,2463,2427,2487,2439,2489,2485,2468,2400,2408,2412,2477,2325,2478,2475,2357,2326,2393,2542,2422,2403,2395,2347,2393,2282,2470,2415,2418,2455,2460,2489,2373,2459,2497,2450,2477,2404,2432,2419,2559,2371,2346,2422,2476,2446,2437,2516,2480,2456,2459,2466,2409,2466,2412,2467,2436,2463,2408,2432,2392,2426,2500,2459,2528,2413,2387,2378,2404,2495,2559,2439,2446,2487,2347,2410,2407,2415,2445,2518,2444,2447,2432,2443,2520,2430,2476,2494,2397,2406,2448,2457,2553,2436,2445,2453,2378,2479,2435,2543,2418,2437,2476,2470,2462,2385,2415,2405,2445,2453,2408,2443,2485,2478,2439,2443,2399,2408,2471,2358,2467,2400,2437,2405,2455,2398,2504,2384,2438,2562,2384,2383,2402,2417,2457,2467,2334,2473,2429,2484,2488,2469,2576,2332,2481,2494,2412,2356,2451,2368,2436,2480,2437,2428,2516,2365,2347,2423,2383,2447,2454,2397,2482,2459,2440,2496,2385,2409,2383,2391,2451,2454,2414,2469,2440,2477,2419,2517,2441,2391,2509,2464,2493,2540,2509,2388,2484,2494,2448,2441,2499,2325,2457,2486,2404,2428,2389,2454,2431,2381,2429,2414,2367,2437,2489,2406,2498,2421,2414,2434,2414,2342,2464,2459,2506,2501,2316,2538,2442,2366,2397,2491,2514,2424,2488,2378,2414,2441,2449,2433,2499,2450,2422,2395,2392,2425,2364,2458,2392,2443,2423,2445,2537,2496,2324,2402,2446,2384,2371,2441,2435,2514,2363,2472,2416,2436,2442,2387,2451,2349,2354,2496,2421,2424,2428,2445,2376,2502,2510,2394,2395,2446,2447,2409,2355,2448,2460,2501,2452,2418,2429,2415,2451,2503,2428,2450,2476,2466,2488,2436,2362,2438,2410,2463,2474,2407,2414,2475,2434,2424,2467,2512,2444,2490,2531,2416,2450,2381,2373,2417,2486,2448,2465,2479,2388,2453,2386,2414,2388,2439,2383,2404,2477,2477,2409,2425,2509,2468,2475,2349,2464,2400,2438,2379,2423,2437,2533,2406,2412,2493,2432,2442,2473,2457,2389,2409,2441,2427,2589,2499,2455,2475,2473,2376,2494,2484,2436,2358,2396,2429,2397,2418,2456,2317,2491,2364,2421,2411,2481,2411,2439,2395,2437,2476,2407,2446,2433,2454,2391,2448,2319,2493,2392,2486,2462,2477,2407,2421,2389,2418,2443,2422,2401,2390,2544,2393,2474,2447,2428,2427,2438,2446,2499,2344,2334,2457,2440,2434,2502,2440,2383,2441,2365,2522,2452,2501,2463,2392,2375,2389,2518,2381,2436,2382,2446,2517,2456,2397,2439,2437,2495,2474,2474,2478,2461,2409,2568,2455,2447,2374,2381,2438,2443,2403,2356,2437,2375,2398,2448,2360,2431,2438,2439,2362,2416,2421,2378,2467,2511,2438,2482,2402,2427,2422,2474,2470,2424,2410,2560,2488,2493,2444,2378,2425,2420,2442,2529,2401,2425,2408,2386,2474,2438,2424,2372,2325,2484,2346,2383,2442,2416,2498,2550,2439,2380,2399,2402,2412,2382,2400,2488,2502,2399,2532,2491,2460,2507,2410,2393,2447,2477,2404,2369,2349,2450,2380,2433,2409,2521,2430,2441,2420,2595,2347,2397,2459,2435,2445,2572,2453,2416,2439,2479,2501,2553,2474,2422,2495,2383,2447,2523,2431,2455,2419,2362,2510,2449,2449,2492,2467,2416,2442,2430,2437,2328,2416,2484,2436,2397,2428,2399,2271,2384,2419,2428,2453,2397,2320,2437,2479,2414,2482,2366,2439,2364,2427,2444,2417,2428,2449,2429,2507,2399,2363,2414,2385,2438,2503,2505,2413,2367,2417,2358,2458,2438,2489,2434,2489,2434,2430,2425,2502,2481,2427,2478,2518,2441,2472,2428,2439,2392,2454,2377,2415,2404,2516,2372,2473,2492,2489,2506,2531,2478,2384,2476,2312,2437,2358,2403,2459,2415,2330,2397,2316,2531,2413,2443,2428,2487,2422,2462,2467,2417,2390,2497,2459,2500,2514,2464,2360,2471,2453,2523,2356,2436,2477,2428,2396,2436,2435,2512,2499,2344,2454,2339,2483,2391,2460,2428,2432,2411,2437,2477,2348,2470,2354,2440,2477,2438,2464,2363,2572,2445,2415,2350,2341,2459,2400,2480,2435,2373,2381,2410,2440,2437,2438,2385,2456,2462,2381,2414,2462,2474,2459,2438,2451,2452,2449,2465,2462,2366,2478,2381,2531,2439,2398,2457,2374,2408,2466,2418,2349,2399,2433,2360,2417,2395,2485,2517,2434,2443,2403,2506,2493,2429,2410,2480,2465,2401,2304,2408,2436,2461,2428,2452,2464,2441,2452,2381,2449,2427,2331,2363,2319,2365,2526,2466,2436,2450,2377,2443,2440,2516,2511,2398,2455,2472,2370,2533,2457,2427,2475,2413,2423,2457,2428,2403,2436,2405,2381,2448,2470,2387,2425,2408,2477,2458,2396,2427,2441,2392,2391,2492,2434,2419,2469,2422,2482,2304,2437,2527]},{"counters":[2424,2427,2433,2432,2428,2579,2440,2414,2441,2471,2460,2387,2460,2461,2440,2437,2432,2348,2412,2384,2410,2426,2472,2433,2361,2440,2457,2370,2508,2345,2429,2419,2436,2415,2465,2412,2333,2409,2489,2446,2520,2502,2504,2428,2480,2387,2420,2429,2390,2372,2480,2509,2454,2435,2445,2454,2508,2443,2445,2490,2445,2431,2397,2478,2386,2403,2375,2468,2424,2473,2513,2423,2428,2457,2359,2424,2367,2452,2349,2508,2439,2389,2478,2432,2440,2426,2384,2428,2416,2467,2493,2407,2385,2379,2433,2438,2427,2434,2453,2416,2392,2430,2412,2439,2486,2482,2402,2395,2508,2415,2466,2439,2489,2368,2437,2446,2408,2358,2359,2488,2383,2411,2471,2482,2540,2427,2451,2412,2485,2431,2427,2392,2414,2436,2439,2480,2477,2477,2402,2403,2412,2420,2516,2372,2360,2491,2390,2469,2427,2459,2541,2405,2345,2500,2275,2473,2456,2495,2384,2483,2441,2423,2451,2393,2464,2453,2379,2437,2379,2330,2473,2410,2530,2513,2491,2411,2445,2381,2446,2449,2486,2428,2498,2472,2412,2511,2480,2436,2408,2439,2464,2500,2443,2454,2457,2473,2453,2464,2536,2439,2469,2482,2416,2444,2391,2447,2460,2398,2355,2443,2361,2472,2379,2448,2453,2467,2409,2502,2412,2500,2480,2456,2352,2407,2439,2438,2436,2432,2478,2391,2441,2369,2392,2476,2440,2436,2423,2471,2416,2423,2429,2461,2443,2418,2421,2442,2505,2451,2383,2423,2403,2566,2499,2485,2434,2464,2422,2493,2422,2492,2379,2501,2413,2481,2471,2534,2365,2516,2533,2500,2453,2419,2405,2493,2407,2489,2442,2417,2446,2457,2490,2466,2420,2405,2373,2374,2422,2365,2437,2420,2395,2481,2493,2481,2440,2412,2381,2466,2419,2485,2394,2433,2493,2440,2434,2498,2476,2437,2453,2439,2377,2468,2346,2347,2391,2369,2418,2437,2477,2382,2377,2414,2436,2402,2490,2336,2489,2413,2443,2448,2493,2390,2367,2518,2422,2402,2411,2410,2345,2506,2522,2455,2429,2385,2419,2469,2362,2375,2409,2384,2460,2471,2490,2342,2372,2453,2401,2382,2405,2427,2508,2419,2489,2507,2397,2537,2438,2359,2498,2400,2394,2473,2304,2416,2451,2433,2422,2357,2368,2343,2454,2403,2472,2437,2485,2428,2402,2487,2436,2406,2473,2497,2412,2405,2438,2495,2418,2467,2364,2438,2432,2493,2381,2381,2503,2478,2440,2430,2426,2369,2568,2434,2358,2497,2466,2370,2426,2411,2421,2337,2483,2503,2417,2382,2562,2484,2412,2390,2438,2421,2443,2428,2374,2393,2393,2414,2492,2405,2377,2409,2479,2527,2421,2513,2410,2452,2438,2432,2480,2477,2438,2414,2484,2320,2359,2395,2433,2557,2483,2322,2525,2503,2508,2411,2454,2434,2432,2429,2438,2494,2532,2466,2604,2409,2477,2489,2421,2472,2514,2519,2496,2379,2437,2416,2494,2445,2397,2378,2437,2431,2462,2456,2451,2475,2474,2406,2419,2387,2526,2421,2481,2369,2526,2419,2448,2437,2458,2438,2576,2563,2461,2491,2339,2497,2426,2444,2420,2483,2470,2405,2469,2462,2403,2381,2381,2484,2399,2417,2407,2417,2424,2448,2438,2452,2430,2438,2461,2535,2404,2479,2423,2436,2373,2412,2441,2440,2439,2472,2330,2504,2428,2455,2510,2413,2253,2428,2476,2467,2411,2483,2483,2462,2386,2440,2455,2408,2363,2415,2440,2451,2527,2406,2373,2519,2439,2365,2435,2406,2534,2493,2506,2431,2333,2401,2472,2438,2422,2443,2447,2386,2467,2429,2473,2479,2464,2437,2417,2426,2465,2422,2452,2526,2489,2436,2463,2467,2481,2515,2434,2448,2400,2389,2446,2444,2439,2354,2347,2458,2540,2382,2429,2517,2368,2460,2426,2469,2388,2421,2391,2429,2425,2505,2482,2392,2474,2465,2525,2447,2480,2306,2418,2363,2380,2425,2486,2435,2445,2516,2438,2365,2430,2438,2390,2424,2423,2429,2422,2519,2376,2469,2438,2337,2436,2399,2452,2404,2381,2393,2345,2379,2434,2465,2455,2458,2381,2438,2517,2479,2392,2414,2437,2438,2380,2380,2398,2372,2470,2441,2409,2413,2504,2465,2373,2507,2434,2351,2441,2467,2444,2524,2419,2384,2486,2465,2503,2392,2432,2386,2409,2370,2467,2465,2403,2438,2330,2500,2441,2397,2443,2459,2437,2420,2433,2442,2375,2469,2383,2403,2381,2419,2437,2433,2439,2440,2415,2377,2412,2385,2348,2419,2354,2454,2492,2491,2425,2432,2406,2511,2446,2453,2379,2461,2438,2467,2468,2441,2435,2469,2436,2481,2439,2301,2471,2451,2440,2449,2331,2461,2306,2486,2404,2409,2450,2399,2443,2309,2469,2367,2436,2418,2400,2402,2452,2412,2385,2385,2402,2502,2498,2490,2462,2489,2367,2434,2451,2470,2425,2436,2417,2433,2452,2454,2437,2471,2477,2416,2489,2491,2436,2480,2419,2486,2376,2354,2460,2439,2385,2424,2437,2506,2493,2362,2500,2430,2453,2445,2534,2487,2452,2455,2415,2460,2453,2437,2446,2474,2357,2368,2409,2415,2466,2429,2511,2408,2482,2406,2406,2470,2387,2437,2454,2431,2417,2442,2416,2485,2386,2482,2533,2466,2438,2465,2381,2352,2369,2474,2429,2459,2352,2504,2491,2441,2481,2474,2412,2398,2417,2438,2544,2350,2451,2438,2491,2445,2385,2433,2438,2501,2434,2381,2380,2390,2517,2437,2357,2583,2374,2432,2449,2496,2429,2441,2395,2371,2401,2367,2348,2447,2382,2371,2492,2438,2504,2454,2420,2418,2439,2367,2420,2404,2413,2584,2392,2415,2454,2422,2373,2486,2515,2370,2435,2479,2466,2456,2426,2466,2465,2431,2535,2443,2327,2346,2303,2478,2410,2363,2523,2462,2430,2453,2437,2426,2423,2409,2416,2454,2502,2416,2543,2359,2446,2548,2438,2453,2459,2440,2371,2423,2394,2421,2504,2471,2404,2441,2461,2395,2442,2474,2439,2415,2440,2489,2475,2349,2343,2445,2382,2508,2435,2412,2441,2447,2380,2401,2450,2393,2421,2467,2417,2518,2394,2330,2425,2436,2438,2451,2459,2413,2381,2411,2422,2440,2421,2433,2460,2483,2463,2520,2498,2418,2461,2375,2469,2436,2402,2454,2478,2486,2367,2468,2529,2525,2407,2483,2461,2458,2506,2438,2408,2473,2459,2473,2448,2383,2423,2408,2463,2439,2484,2499,2517,2390,2435,2434,2424,2304,2384,2481,2499,2425,2449,2418,2462,2467,2430,2434,2483,2507,2451,2387,2453,2409,2476,2396,2486,2402,2422,2444,2424,2430,2450,2346,2439,2432,2490,2467,2467,2509,2463,2423,2428,2506,2438,2419,2498,2509,2374,2408,2373,2413,2390,2400,2436,2485,2466,2376,2465,2472,2389,2448,2407,2436,2464,2474,2413,2396,2482,2514,2383,2443,2373,2397,2388,2439,2422,2433,2418,2460,2384,2387,2433,2429,2392,2429,2454,2418,2506,2479,2507,2369,2484,2364,2440,2484,2457,2457,2456,2436,2557,2474,2475,2389,2454,2455,2456,2439,2405,2434,2475,2459,2521,2402,2427,2454,2497,2435,2439,2460,2401,2422,2480,2507,2498,2383,2410,2434,2342,2389,2475,2450,2450,2413,2333,2403,2467,2474,2451,2525,2414,2440,2438,2439,2394,2493,2334,2453,2375,2469,2376,2390,2478,2511,2406,2515,2394,2401,2417,2518,2443,2481,2422,2467,2422,2449,2431,2477,2441,2410,2471,2425,2453,2434,2495,2425,2483,2467,2383,2392,2418,2436,2512,2411,2459,2400,2387,2383,2404,2432,2477,2497,2364,2389,2493,2348,2583,2428,2436,2444,2450,2469,2461,2422,2445,2385,2438,2521,2457,2440,2343,2436,2449,2439,2418,2438,2441,2428,2434,2408,2399,2438,2375,2447,2406,2527,2521,2364,2501,2446,2501,2464,2469,2421,2452,2321,2443,2465,2439,2405,2362,2511,2456,2438,2470,2405,2481,2336,2440,2424,2416,2389,2421,2388,2484,2494,2473,2432,2571,2398,2473,2435,2430,2346,2412,2428,2462,2406,2456,2491,2390,2401,2363,2492,2438,2454,2442,2423,2421,2430,2431,2392,2477,2428,2480,2403,2385,2453,2518,2370,2508,2470,2480,2508,2482,2339,2483,2446,2370,2439,2387,2432,2451,2405,2550,2451,2380,2380,2466,2463,2422,2451,2486,2413,2493,2386,2477,2422,2460,2439,2408,2413,2394,2527,2409,2406,2390,2406,2423,2440,2530,2434,2477,2474,2443,2544,2453,2438,2411,2439,2428,2433,2429,2494,2436,2366,2360,2391,2355,2416,2488,2382,2508,2336,2468,2380,2413,2411,2328,2414,2331,2449,2418,2389,2451,2350,2385,2486,2395,2437,2365,2416,2538,2492,2520,2402,2389,2440,2481,2509,2436,2492,2457,2439,2403,2486,2505,2485,2375,2439,2408,2458,2556,2470,2407,2386,2416,2442,2386,2467,2497,2486,2409,2437,2347,2434,2436,2518,2463,2445,2464,2438,2462,2412,2431,2517,2448,2370,2390,2501,2376,2431,2446,2416,2479,2367,2501,2478,2405,2439,2418,2460,2325,2484,2445,2525,2440,2445,2439,2461,2463,2465,2425,2354,2398,2448,2437,2445,2462,2423,2401,2437,2439,2379,2437,2510,2402,2350,2414,2451,2369,2377,2400,2440,2419,2448,2470,2402,2458,2459,2441,2411,2491,2449,2383,2458,2317,2416,2513,2403,2436,2407,2371,2452,2370,2419,2532,2481,2382,2552,2375,2409,2511,2458,2400,2450,2488,2393,2370,2362,2315,2368,2469,2470,2378,2406,2448,2448,2421,2436,2406,2474,2422,2500,2453,2518,2482,2481,2521,2482,2426,2420,2466,2493,2381,2501,2460,2559,2353,2417,2331,2458,2344,2508,2465,2493,2470,2424,2508,2379,2355,2440,2429,2367,2461,2460,2474,2387,2549,2432,2340,2354,2500,2454,2450,2490,2438,2497,2387,2503,2426,2476,2434,2450,2388,2451,2357,2472,2505,2458,2393,2430,2375,2465,2430,2435,2424,2475,2436,2405,2350,2541,2425,2454,2319,2441,2427,2347,2552,2442,2405,2427,2502,2483,2475,2440,2513,2462,2423,2386,2366,2515,2335,2399,2467,2348,2445,2459,2374,2454,2498,2441,2431,2499,2453,2450,2438,2425,2426,2490,2366,2411,2435,2467,2391,2395,2473,2448,2484,2438,2441,2429,2407,2352,2352,2336,2486,2456,2448,2458,2453,2443,2447,2447,2333,2409,2386,2419,2525,2464,2476,2439,2407,2450,2529,2481,2350,2431,2438,2408,2434,2438,2486,2391,2466,2438,2475,2420,2469,2427,2473,2420,2426,2428,2432,2414,2480,2533,2474,2454,2455,2471,2490,2375,2529,2469,2419,2494,2379,2401,2438,2436,2434,2382,2405,2430,2457,2396,2403,2446,2447,2439,2371,2530,2382,2456,2483,2398,2531,2465,2443,2385,2453,2490,2476,2474,2361,2473,2431,2415,2439,2444,2384,2439,2397,2419,2447,2409,2492,2422,2357,2471,2434,2489,2381,2493,2434,2415,2452,2478,2486,2309,2404,2400,2318,2436,2488,2380,2400,2382,2364,2447,2400,2457,2421,2377,2469,2403,2439,2408,2363,2415,2465,2414,2371,2473,2441,2536,2338,2432,2448,2414,2454,2413,2458,2476,2458,2435,2469,2512,2378,2441,2378,2469,2427,2454,2399,2358,2436,2494,2407,2423,2425,2372,2492,2521,2422,2420,2387,2441,2437,2446,2455,2456,2453,2509,2436,2506,2316,2425,2438,2425,2515,2417,2439,2456,2413,2455,2423,2425,2457,2443,2371,2428,2427,2434,2463,2472,2422,2480,2447,2521,2460,2443,2532,2484,2423,2405,2395,2490,2426,2389,2443,2526,2478,2436,2485,2518,2455,2461,2399,2398,2416,2443,2418,2449,2464,2390,2435,2398,2399,2369,2439,2346,2478,2435,2333,2485,2438,2468,2436,2426,2399,2403,2495,2504,2482,2522,2387,2467,2416,2372,2403,2336,2370,2392,2516,2403,2466,2444,2472,2442,2370,2427,2497,2465,2381,2460,2476,2513,2428,2385,2517,2438,2436,2447,2468,2436,2545,2434,2495,2459,2484,2400,2427,2439,2466,2395,2441,2414,2381,2413,2464,2358,2395,2408,2441,2381,2520,2401,2453,2449,2434,2418,2442,2389,2337,2439,2439,2478,2416,2420,2381,2443,2439,2408,2456,2399,2441,2548,2488,2374,2389,2384,2410,2352,2463,2338,2325,2426,2455,2463,2459,2440,2428,2379,2427,2393,2478,2437,2358,2528,2471,2434,2455,2392,2389,2391,2434,2445,2478,2441,2441,2397,2435,2387,2454,2404,2431,2453,2511,2413,2389,2426,2456,2396,2550,2421,2403,2476]},{"counters":[2389,2463,2324,2426,2437,2439,2475,2436,2399,2437,2473,2502,2453,2445,2376,2466,2459,2403,2461,2473,2503,2472,2422,2432,2475,2453,2564,2438,2419,2435,2353,2466,2406,2442,2509,2361,2434,2523,2332,2457,2381,2453,2411,2426,2448,2443,2505,2393,2319,2453,2363,2443,2436,2410,2342,2349,2442,2384,2433,2403,2423,2390,2364,2441,2430,2453,2430,2521,2344,2436,2420,2444,2453,2408,2386,2445,2412,2494,2404,2399,2416,2461,2447,2432,2459,2386,2354,2436,2374,2405,2388,2437,2489,2439,2410,2437,2404,2440,2481,2437,2430,2432,2437,2428,2440,2410,2480,2452,2514,2482,2402,2496,2407,2440,2413,2433,2497,2421,2347,2492,2477,2448,2390,2437,2340,2453,2560,2361,2413,2367,2352,2387,2445,2441,2487,2459,2437,2437,2424,2505,2445,2444,2445,2397,2404,2330,2473,2420,2510,2462,2383,2398,2418,2402,2371,2422,2408,2574,2413,2418,2389,2434,2479,2435,2356,2424,2394,2415,2474,2372,2480,2430,2324,2321,2402,2414,2405,2397,2397,2499,2448,2570,2439,2440,2409,2454,2378,2499,2329,2510,2381,2444,2359,2529,2402,2512,2461,2439,2458,2383,2416,2443,2455,2403,2437,2436,2418,2349,2446,2448,2520,2431,2476,2477,2433,2389,2384,2489,2361,2463,2363,2396,2457,2373,2436,2432,2518,2477,2449,2426,2445,2452,2360,2439,2456,2441,2431,2437,2479,2464,2489,2499,2417,2403,2569,2391,2476,2402,2418,2505,2342,2442,2463,2489,2336,2399,2461,2487,2454,2491,2453,2426,2436,2506,2366,2415,2403,2423,2464,2381,2312,2421,2398,2423,2493,2498,2506,2419,2417,2357,2456,2513,2438,2430,2397,2471,2573,2384,2415,2400,2487,2481,2411,2409,2476,2436,2379,2435,2412,2508,2369,2399,2364,2452,2461,2488,2507,2452,2382,2494,2406,2436,2315,2452,2442,2544,2478,2417,2500,2385,2474,2416,2418,2439,2530,2439,2464,2432,2428,2470,2387,2441,2394,2461,2439,2473,2392,2368,2444,2432,2550,2537,2504,2441,2454,2409,2479,2367,2410,2462,2440,2323,2407,2370,2402,2463,2450,2448,2467,2546,2441,2495,2439,2349,2336,2457,2430,2437,2465,2431,2383,2442,2402,2295,2371,2453,2354,2640,2393,2438,2389,2453,2457,2404,2440,2429,2486,2456,2333,2469,2389,2457,2388,2531,2529,2436,2411,2436,2399,2515,2467,2397,2460,2453,2483,2422,2347,2480,2446,2390,2397,2459,2386,2347,2437,2441,2454,2338,2466,2419,2524,2409,2468,2423,2437,2358,2402,2406,2546,2440,2437,2500,2437,2498,2505,2352,2410,2400,2396,2356,2412,2389,2320,2354,2412,2378,2499,2452,2434,2444,2415,2353,2412,2396,2452,2429,2406,2438,2428,2435,2462,2471,2491,2418,2535,2441,2432,2422,2496,2404,2477,2432,2426,2436,2427,2478,2484,2468,2400,2420,2419,2448,2474,2415,2395,2344,2423,2438,2448,2440,2440,2412,2484,2403,2426,2320,2431,2498,2461,2488,2366,2464,2409,2419,2408,2372,2480,2421,2362,2470,2487,2445,2400,2327,2464,2446,2427,2480,2437,2457,2441,2434,2524,2471,2454,2444,2439,2478,2510,2426,2454,2497,2442,2423,2474,2453,2461,2516,2433,2479,2413,2424,2494,2487,2510,2430,2311,2402,2445,2390,2472,2354,2406,2475,2388,2569,2466,2513,2527,2358,2435,2424,2425,2434,2436,2431,2389,2380,2470,2491,2472,2378,2434,2438,2451,2430,2469,2349,2433,2440,2441,2381,2406,2408,2418,2442,2347,2362,2488,2476,2435,2438,2473,2390,2455,2445,2469,2488,2444,2449,2425,2448,2372,2444,2395,2433,2414,2430,2385,2504,2344,2416,2448,2296,2504,2397,2457,2495,2479,2344,2439,2438,2437,2462,2437,2373,2384,2396,2398,2419,2412,2446,2475,2406,2474,2409,2359,2503,2377,2439,2494,2489,2375,2389,2545,2423,2289,2411,2496,2399,2431,2425,2440,2440,2437,2438,2388,2471,2456,2439,2399,2400,2376,2455,2392,2425,2410,2507,2440,2422,2381,2429,2471,2459,2389,2363,2464,2518,2511,2437,2443,2437,2452,2499,2505,2486,2458,2473,2358,2497,2447,2373,2432,2388,2514,2437,2518,2484,2483,2445,2406,2460,2407,2461,2431,2489,2439,2448,2428,2384,2364,2257,2463,2375,2470,2435,2408,2418,2492,2434,2450,2573,2406,2437,2439,2445,2521,2391,2359,2417,2529,2436,2433,2461,2446,2351,2493,2425,2445,2452,2468,2464,2333,2406,2441,2456,2512,2428,2501,2512,2415,2420,2441,2433,2264,2350,2535,2456,2458,2377,2464,2411,2461,2449,2432,2344,2382,2439,2547,2408,2398,2433,2481,2502,2448,2416,2443,2383,2430,2431,2492,2465,2524,2370,2433,2580,2408,2402,2339,2439,2440,2396,2440,2437,2350,2419,2419,2395,2387,2421,2465,2423,2318,2400,2466,2456,2421,2448,2499,2486,2392,2414,2485,2437,2440,2472,2530,2429,2429,2471,2500,2465,2483,2437,2461,2451,2425,2488,2477,2477,2395,2366,2438,2393,2507,2431,2433,2503,2476,2567,2437,2436,2434,2392,2428,2442,2395,2426,2433,2453,2418,2424,2471,2402,2425,2560,2478,2527,2472,2422,2475,2448,2521,2434,2354,2467,2509,2472,2418,2412,2393,2400,2466,2428,2438,2468,2509,2397,2428,2385,2406,2445,2438,2543,2496,2465,2376,2394,2407,2457,2446,2452,2423,2353,2471,2404,2401,2481,2483,2457,2437,2444,2453,2379,2439,2454,2474,2493,2451,2437,2393,2432,2415,2446,2410,2470,2514,2438,2428,2530,2496,2494,2461,2469,2398,2418,2384,2489,2440,2366,2348,2399,2426,2437,2528,2421,2405,2457,2409,2434,2432,2471,2467,2458,2381,2461,2523,2364,2463,2428,2441,2256,2501,2460,2462,2403,2403,2434,2427,2399,2440,2451,2430,2350,2414,2421,2439,2499,2434,2437,2442,2496,2424,2425,2384,2383,2319,2379,2437,2361,2500,2404,2408,2548,2429,2444,2384,2447,2372,2477,2462,2440,2506,2508,2487,2372,2440,2454,2444,2409,2440,2456,2477,2468,2380,2462,2412,2436,2519,2451,2410,2403,2417,2415,2313,2539,2480,2469,2509,2392,2469,2514,2381,2362,2384,2480,2452,2508,2485,2402,2382,2308,2363,2420,2498,2422,2473,2465,2467,2458,2434,2382,2433,2487,2363,2396,2421,2461,2417,2480,2450,2347,2404,2461,2442,2383,2412,2354,2472,2369,2386,2437,2469,2378,2529,2502,2384,2500,2387,2408,2379,2411,2524,2426,2444,2477,2437,2440,2446,2368,2489,2396,2520,2365,2448,2456,2460,2455,2451,2566,2517,2435,2521,2436,2371,2449,2444,2453,2473,2520,2417,2427,2436,2512,2464,2437,2439,2472,2436,2458,2420,2455,2421,2433,2475,2407,2451,2426,2401,2399,2382,2428,2395,2379,2400,2385,2453,2448,2466,2391,2436,2368,2482,2473,2463,2397,2387,2446,2437,2432,2545,2487,2396,2419,2437,2381,2360,2440,2393,2568,2371,2277,2406,2444,2499,2459,2441,2447,2450,2415,2405,2386,2404,2485,2478,2414,2482,2506,2476,2404,2392,2366,2397,2331,2372,2446,2488,2376,2388,2486,2391,2405,2383,2428,2455,2441,2462,2443,2364,2449,2393,2447,2482,2400,2436,2532,2445,2468,2417,2562,2423,2438,2581,2386,2453,2572,2407,2450,2438,2374,2399,2398,2463,2494,2388,2381,2411,2452,2441,2593,2382,2407,2421,2500,2477,2450,2411,2410,2423,2380,2428,2388,2403,2508,2417,2438,2456,2462,2435,2379,2483,2424,2505,2417,2423,2428,2442,2392,2459,2511,2515,2505,2373,2439,2385,2464,2444,2411,2421,2429,2424,2479,2415,2496,2444,2373,2408,2489,2453,2400,2508,2524,2440,2425,2357,2436,2447,2338,2450,2469,2461,2445,2413,2359,2469,2492,2437,2409,2513,2446,2412,2499,2439,2534,2401,2457,2419,2492,2453,2401,2326,2445,2483,2353,2440,2369,2397,2404,2468,2461,2417,2455,2427,2454,2470,2422,2412,2413,2419,2466,2435,2419,2507,2419,2460,2396,2482,2460,2465,2395,2439,2440,2428,2412,2445,2442,2359,2492,2409,2368,2414,2480,2332,2483,2315,2425,2497,2427,2413,2565,2538,2416,2409,2441,2394,2435,2471,2488,2461,2398,2500,2493,2406,2470,2425,2496,2447,2465,2439,2386,2440,2392,2425,2452,2357,2397,2487,2470,2380,2411,2452,2406,2458,2461,2488,2437,2412,2418,2386,2381,2506,2419,2428,2422,2407,2494,2465,2412,2548,2448,2436,2497,2421,2383,2360,2457,2434,2423,2463,2408,2473,2389,2427,2506,2424,2458,2397,2433,2438,2343,2448,2423,2403,2408,2521,2363,2385,2444,2404,2449,2474,2463,2404,2475,2426,2447,2411,2431,2416,2527,2437,2471,2433,2437,2406,2426,2426,2387,2514,2339,2400,2462,2505,2462,2474,2359,2486,2389,2502,2414,2403,2368,2434,2429,2513,2432,2430,2392,2453,2417,2458,2374,2457,2421,2394,2469,2379,2398,2415,2374,2480,2363,2374,2456,2467,2436,2450,2388,2485,2376,2477,2512,2385,2445,2392,2443,2539,2386,2411,2447,2475,2446,2437,2406,2456,2410,2423,2501,2452,2436,2397,2458,2435,2442,2428,2426,2391,2429,2339,2331,2439,2422,2458,2464,2452,2453,2476,2390,2475,2467,2442,2447,2428,2432,2389,2496,2378,2436,2400,2470,2457,2387,2472,2417,2430,2451,2441,2443,2391,2439,2380,2466,2393,2389,2447,2422,2508,2452,2546,2439,2358,2454,2442,2563,2438,2470,2398,2472,2526,2423,2437,2473,2365,2543,2483,2466,2403,2494,2421,2436,2477,2443,2447,2492,2449,2451,2438,2326,2441,2433,2513,2370,2435,2494,2404,2482,2420,2448,2438,2541,2446,2378,2346,2480,2449,2397,2416,2467,2393,2432,2461,2498,2447,2438,2415,2422,2496,2375,2420,2480,2416,2418,2454,2525,2426,2430,2409,2427,2544,2489,2471,2412,2555,2436,2405,2459,2464,2396,2371,2410,2425,2454,2432,2580,2478,2468,2521,2524,2465,2442,2445,2423,2423,2471,2440,2439,2366,2360,2508,2439,2397,2437,2415,2469,2430,2448,2438,2444,2429,2351,2423,2456,2450,2429,2418,2420,2449,2433,2417,2396,2435,2414,2417,2403,2443,2372,2407,2424,2314,2523,2518,2423,2418,2474,2443,2473,2411,2465,2413,2499,2424,2385,2450,2465,2408,2421,2472,2418,2410,2390,2415,2471,2488,2473,2380,2413,2417,2518,2450,2492,2403,2404,2411,2476,2424,2508,2496,2426,2514,2419,2436,2455,2413,2375,2484,2478,2464,2415,2444,2405,2437,2455,2384,2396,2403,2439,2408,2524,2376,2416,2382,2429,2396,2402,2371,2398,2393,2394,2360,2537,2403,2390,2529,2430,2506,2420,2473,2479,2416,2432,2362,2580,2526,2418,2353,2426,2420,2436,2505,2466,2397,2440,2395,2479,2377,2453,2459,2398,2481,2457,2424,2498,2464,2532,2468,2421,2411,2462,2391,2434,2479,2384,2437,2448,2495,2471,2470,2463,2464,2439,2454,2432,2433,2456,2432,2484,2393,2402,2457,2485,2415,2422,2446,2456,2474,2466,2412,2443,2529,2402,2428,2436,2371,2435,2369,2408,2425,2364,2406,2444,2405,2485,2341,2458,2401,2417,2412,2369,2448,2393,2455,2500,2437,2380,2435,2469,2449,2500,2424,2423,2457,2421,2519,2388,2369,2506,2439,2462,2377,2402,2380,2469,2512,2424,2391,2502,2399,2370,2416,2468,2488,2417,2478,2408,2531,2352,2530,2460,2581,2441,2478,2463,2527,2373,2412,2552,2460,2396,2477,2556,2412,2526,2373,2440,2416,2439,2497,2477,2428,2408,2488,2438,2501,2416,2429,2452,2443,2400,2492,2375,2491,2554,2450,2404,2383,2409,2408,2444,2433,2489,2452,2385,2401,2377,2469,2523,2395,2469,2370,2538,2398,2411,2435,2384,2459,2402,2511,2421,2482,2453,2484,2436,2441,2389,2396,2485,2391,2472,2408,2341,2422,2394,2495,2403,2447,2453,2439,2517,2422,2454,2470,2433,2382,2476,2405,2505,2459,2441,2321,2434,2395,2427,2472,2407,2521,2524,2328,2436,2548,2410,2511,2491,2400,2419,2414,2398,2417,2455,2405,2442,2367,2475,2402,2363,2573,2411,2482,2436,2390,2368,2464,2453,2434,2459,2369,2433,2424,2481,2417,2395,2474,2420,2439,2442,2447,2438,2402,2414,2431,2418,2434,2478,2467,2418,2511,2449,2454,2437,2449,2453,2454,2333,2473,2442,2518,2434,2431,2463]},{"counters":[2474,2420,2439,2391,2452,2441,2509,2443,2481,2404,2445,2369,2453,2431,2401,2413,2428,2455,2308,2436,2479,2401,2475,2378,2390,2461,2404,2542,2476,2425,2413,2476,2458,2440,2409,2413,2393,2496,2478,2451,2376,2441,2470,2387,2425,2450,2451,2378,2475,2385,2561,2477,2387,2544,2401,2428,2528,2463,2364,2445,2446,2424,2422,2429,2412,2467,2352,2381,2410,2513,2347,2423,2469,2519,2439,2443,2531,2508,2428,2479,2505,2535,2463,2515,2423,2392,2479,2470,2457,2504,2437,2480,2409,2485,2436,2415,2418,2464,2466,2426,2428,2378,2421,2461,2496,2390,2509,2457,2427,2427,2507,2481,2440,2381,2451,2424,2386,2469,2422,2557,2406,2329,2473,2352,2404,2447,2394,2476,2404,2494,2508,2419,2514,2495,2485,2436,2446,2437,2471,2433,2307,2385,2439,2470,2415,2493,2370,2470,2450,2421,2373,2456,2410,2367,2436,2410,2373,2369,2404,2442,2503,2453,2431,2495,2450,2419,2453,2445,2503,2484,2369,2455,2402,2397,2516,2410,2473,2460,2469,2438,2485,2460,2466,2436,2416,2490,2417,2374,2412,2344,2403,2500,2414,2388,2470,2438,2413,2479,2404,2382,2448,2523,2499,2557,2520,2483,2414,2552,2383,2462,2544,2413,2335,2427,2386,2428,2462,2486,2445,2437,2469,2495,2405,2441,2450,2473,2426,2421,2410,2497,2446,2447,2431,2494,2380,2434,2469,2437,2440,2394,2328,2442,2442,2443,2444,2451,2460,2416,2455,2489,2378,2390,2511,2380,2436,2327,2380,2465,2400,2456,2394,2494,2494,2466,2513,2473,2475,2431,2455,2438,2543,2449,2394,2457,2407,2484,2531,2388,2472,2463,2434,2478,2487,2385,2421,2426,2399,2442,2399,2448,2383,2454,2506,2388,2531,2438,2429,2426,2385,2544,2414,2439,2340,2413,2463,2397,2476,2454,2376,2465,2395,2424,2410,2485,2555,2319,2456,2349,2538,2453,2383,2424,2379,2460,2423,2435,2422,2437,2408,2413,2459,2482,2482,2454,2434,2480,2496,2500,2447,2459,2410,2515,2407,2453,2482,2524,2443,2409,2386,2473,2342,2373,2458,2340,2418,2474,2409,2470,2397,2548,2559,2349,2424,2496,2483,2507,2364,2461,2434,2450,2361,2439,2516,2396,2402,2465,2385,2346,2408,2509,2409,2439,2432,2393,2488,2469,2527,2325,2459,2438,2437,2335,2442,2554,2379,2397,2396,2436,2428,2443,2425,2437,2485,2346,2439,2403,2457,2443,2422,2439,2390,2435,2401,2438,2441,2368,2359,2407,2349,2401,2434,2419,2415,2469,2422,2336,2399,2353,2380,2427,2413,2444,2470,2406,2480,2422,2406,2386,2402,2376,2380,2475,2462,2461,2455,2524,2532,2440,2366,2522,2502,2465,2468,2369,2414,2448,2407,2414,2405,2432,2464,2482,2410,2441,2396,2451,2413,2412,2389,2424,2455,2374,2496,2484,2361,2504,2433,2506,2360,2422,2391,2395,2416,2441,2453,2493,2450,2335,2571,2406,2440,2496,2439,2392,2466,2436,2418,2446,2391,2344,2439,2577,2447,2398,2406,2423,2420,2385,2421,2454,2368,2401,2457,2457,2439,2439,2539,2440,2387,2405,2410,2308,2424,2439,2508,2506,2436,2360,2440,2484,2389,2448,2437,2484,2468,2430,2466,2418,2373,2329,2449,2427,2395,2461,2423,2405,2398,2413,2355,2462,2397,2465,2418,2408,2397,2503,2467,2476,2409,2495,2357,2425,2452,2479,2405,2461,2344,2473,2333,2372,2486,2399,2370,2527,2368,2531,2374,2390,2411,2437,2384,2431,2436,2399,2450,2390,2419,2436,2375,2408,2397,2363,2441,2494,2417,2578,2384,2416,2463,2435,2498,2408,2490,2416,2512,2450,2318,2466,2429,2457,2465,2453,2441,2375,2441,2386,2410,2473,2457,2450,2413,2381,2414,2405,2415,2460,2440,2476,2510,2381,2470,2457,2388,2410,2365,2408,2364,2412,2459,2469,2342,2457,2462,2358,2378,2368,2406,2526,2464,2370,2417,2440,2464,2409,2391,2470,2446,2483,2445,2441,2548,2459,2500,2402,2458,2533,2445,2429,2382,2456,2407,2472,2473,2403,2412,2499,2510,2358,2491,2446,2351,2522,2450,2424,2431,2510,2310,2336,2457,2442,2364,2389,2483,2300,2405,2437,2490,2431,2394,2377,2412,2485,2435,2482,2514,2466,2446,2438,2464,2411,2444,2437,2462,2511,2477,2544,2364,2426,2459,2391,2370,2473,2366,2425,2471,2351,2459,2450,2447,2430,2510,2416,2431,2377,2437,2344,2392,2491,2440,2382,2387,2389,2436,2481,2352,2398,2419,2423,2494,2462,2436,2454,2428,2379,2420,2434,2463,2452,2455,2437,2467,2453,2389,2534,2410,2465,2461,2497,2409,2521,2435,2530,2473,2397,2454,2408,2376,2436,2433,2454,2449,2469,2476,2504,2456,2452,2533,2460,2466,2481,2429,2419,2367,2397,2417,2446,2478,2525,2430,2507,2425,2402,2527,2471,2458,2401,2434,2421,2487,2438,2451,2532,2381,2456,2517,2452,2444,2433,2429,2425,2440,2455,2401,2453,2460,2432,2428,2453,2361,2437,2372,2335,2380,2387,2437,2489,2437,2432,2513,2454,2461,2389,2396,2474,2409,2442,2439,2360,2391,2450,2373,2423,2451,2376,2359,2501,2340,2408,2451,2472,2449,2449,2445,2419,2408,2423,2378,2427,2434,2436,2441,2388,2383,2474,2345,2401,2501,2436,2465,2493,2498,2437,2360,2462,2434,2486,2474,2418,2427,2364,2444,2498,2480,2447,2499,2459,2381,2411,2432,2385,2474,2435,2454,2460,2472,2462,2443,2412,2474,2431,2446,2370,2456,2468,2410,2394,2408,2437,2426,2458,2466,2404,2305,2451,2475,2407,2362,2353,2506,2454,2362,2463,2366,2378,2407,2512,2423,2475,2373,2445,2460,2426,2381,2466,2521,2379,2410,2417,2438,2440,2395,2554,2465,2463,2427,2440,2471,2427,2465,2431,2464,2435,2408,2481,2482,2278,2419,2416,2489,2452,2438,2463,2417,2331,2491,2498,2448,2467,2347,2416,2464,2465,2478,2382,2464,2424,2463,2543,2399,2443,2421,2401,2479,2430,2443,2325,2439,2504,2428,2413,2388,2457,2479,2440,2530,2395,2428,2386,2370,2493,2368,2450,2515,2368,2432,2504,2448,2447,2532,2442,2465,2479,2442,2477,2485,2422,2407,2432,2449,2382,2514,2470,2384,2420,2444,2488,2488,2449,2417,2440,2356,2473,2432,2480,2369,2424,2386,2331,2460,2400,2447,2391,2462,2432,2378,2413,2378,2406,2408,2380,2426,2405,2492,2457,2431,2454,2453,2462,2452,2535,2432,2489,2445,2390,2358,2508,2456,2417,2390,2423,2510,2507,2394,2529,2458,2485,2363,2440,2430,2369,2419,2436,2396,2338,2418,2428,2463,2457,2481,2450,2468,2386,2460,2466,2475,2350,2417,2460,2450,2444,2418,2327,2376,2440,2446,2389,2450,2511,2402,2468,2548,2424,2369,2468,2365,2422,2467,2404,2396,2508,2534,2464,2362,2387,2556,2394,2471,2433,2441,2424,2455,2464,2563,2396,2452,2424,2454,2379,2421,2418,2487,2490,2436,2460,2426,2400,2430,2402,2430,2414,2398,2521,2395,2441,2400,2472,2369,2378,2396,2513,2478,2429,2390,2494,2467,2460,2538,2455,2394,2421,2365,2414,2486,2472,2416,2381,2426,2525,2372,2478,2422,2445,2512,2388,2434,2378,2415,2418,2440,2440,2471,2383,2508,2437,2434,2458,2366,2440,2480,2454,2470,2394,2487,2408,2406,2395,2446,2375,2330,2390,2496,2439,2440,2434,2393,2338,2402,2444,2403,2341,2376,2459,2440,2490,2489,2421,2395,2359,2498,2531,2442,2451,2492,2441,2469,2470,2477,2420,2363,2431,2456,2432,2423,2472,2490,2479,2384,2391,2430,2342,2416,2435,2440,2437,2485,2398,2375,2435,2442,2464,2407,2411,2441,2429,2308,2458,2508,2484,2454,2376,2467,2483,2496,2401,2466,2471,2444,2422,2440,2436,2333,2361,2448,2416,2422,2558,2460,2458,2426,2401,2413,2414,2428,2462,2400,2468,2410,2402,2422,2458,2400,2474,2444,2513,2326,2410,2531,2438,2403,2490,2359,2452,2472,2494,2467,2450,2481,2487,2457,2424,2529,2457,2494,2413,2520,2528,2431,2450,2430,2515,2399,2513,2473,2499,2531,2460,2507,2497,2440,2459,2414,2565,2466,2432,2391,2306,2549,2396,2506,2500,2413,2469,2462,2435,2375,2467,2386,2441,2392,2399,2448,2411,2558,2421,2433,2562,2510,2462,2402,2474,2479,2457,2486,2504,2438,2466,2370,2426,2390,2451,2470,2430,2355,2390,2440,2378,2482,2510,2474,2419,2463,2473,2514,2364,2360,2415,2354,2423,2368,2409,2450,2391,2361,2468,2416,2499,2466,2439,2435,2474,2377,2497,2453,2385,2352,2436,2451,2447,2398,2380,2505,2362,2400,2419,2448,2471,2439,2415,2530,2504,2375,2418,2501,2445,2342,2443,2518,2430,2438,2442,2445,2405,2525,2465,2510,2487,2474,2508,2375,2489,2330,2442,2407,2498,2496,2473,2400,2417,2350,2446,2421,2494,2468,2457,2405,2327,2466,2467,2417,2529,2436,2438,2329,2468,2412,2495,2397,2424,2471,2483,2405,2406,2449,2470,2509,2418,2470,2410,2487,2358,2371,2406,2526,2396,2408,2370,2485,2421,2436,2337,2460,2421,2482,2377,2453,2394,2400,2342,2438,2364,2409,2372,2364,2473,2487,2480,2405,2468,2510,2411,2436,2431,2448,2412,2432,2396,2408,2489,2410,2379,2386,2418,2449,2506,2460,2422,2478,2460,2396,2407,2406,2269,2454,2419,2365,2503,2409,2469,2404,2431,2513,2493,2464,2416,2437,2375,2403,2428,2398,2373,2389,2427,2369,2342,2491,2432,2473,2494,2464,2353,2473,2448,2442,2394,2359,2495,2379,2535,2474,2462,2525,2482,2446,2438,2389,2439,2547,2473,2485,2505,2456,2335,2588,2413,2448,2438,2429,2429,2395,2529,2313,2460,2491,2407,2392,2472,2499,2429,2409,2485,2435,2437,2437,2414,2550,2438,2485,2454,2370,2396,2518,2513,2369,2331,2498,2460,2428,2370,2400,2479,2448,2411,2458,2454,2479,2446,2467,2437,2331,2420,2438,2409,2468,2380,2466,2436,2441,2468,2427,2347,2421,2435,2506,2434,2412,2452,2487,2419,2318,2464,2463,2443,2428,2472,2372,2408,2407,2332,2488,2566,2467,2349,2442,2411,2449,2389,2360,2436,2348,2402,2454,2473,2419,2453,2376,2414,2497,2455,2450,2473,2401,2403,2443,2417,2424,2383,2511,2535,2320,2390,2369,2531,2456,2453,2459,2338,2418,2429,2477,2413,2360,2335,2409,2388,2374,2506,2447,2473,2538,2452,2407,2396,2488,2401,2492,2399,2440,2441,2466,2422,2511,2405,2351,2444,2503,2454,2468,2412,2426,2418,2518,2382,2394,2441,2547,2469,2413,2386,2415,2441,2494,2401,2459,2333,2423,2480,2384,2460,2415,2455,2453,2475,2435,2409,2444,2425,2492,2492,2412,2531,2365,2438,2462,2364,2355,2438,2471,2396,2455,2434,2530,2386,2413,2463,2492,2441,2502,2404,2431,2494,2451,2411,2444,2431,2342,2481,2440,2361,2519,2475,2538,2498,2423,2407,2532,2432,2380,2477,2353,2469,2463,2474,2468,2405,2477,2418,2430,2431,2429,2504,2422,2397,2430,2449,2389,2440,2430,2443,2395,2412,2453,2546,2358,2461,2438,2378,2451,2443,2440,2443,2416,2485,2436,2441,2434,2458,2480,2487,2548,2404,2452,2413,2406,2402,2441,2391,2405,2495,2380,2441,2463,2513,2428,2418,2515,2520,2431,2397,2440,2493,2421,2391,2453,2361,2507,2519,2432,2384,2473,2488,2427,2418,2399,2446,2407,2403,2465,2500,2500,2420,2455,2460,2469,2490,2581,2345,2341,2428,2355,2502,2495,2434,2373,2491,2475,2473,2431,2443,2439,2525,2437,2417,2431,2447,2477,2475,2558,2433,2522,2323,2410,2371,2404,2385,2425,2340,2420,2392,2356,2470,2486,2437,2329,2429,2412,2378,2348,2322,2479,2427,2402,2438,2394,2387,2470,2493,2399,2430,2429,2452,2522,2399,2452,2334,2493,2438,2460,2456,2429,2416,2496,2412,2457,2500,2457,2453,2395,2434,2369,2444,2530,2461,2356,2346,2428,2411,2398,2387,2425,2465,2395,2432,2352,2500,2470,2435,2345,2412,2472,2468,2430,2379,2495,2312,2430,2461,2416,2395,2478,2547,2446,2587,2419,2455,2340,2474,2481,2444,2345,2403,2432,2408,2372,2423,2420,2456,2534,2436,2447,2422,2462,2370,2436,2441,2472,2461,2556,2472,2449,2434,2468,2408,2340,2351,2383,2429,2370,2480]}],"top_n":[{"data":"CK6YggI=","count":6},{"data":"COjcpAQ=","count":0},{"data":"CICK+AI=","count":0},{"data":"CMD1sgM=","count":11},{"data":"CKq3Lg==","count":0},{"data":"CJSQogI=","count":16},{"data":"CPjYvAQ=","count":47},{"data":"CNilzQM=","count":25},{"data":"CMqiyAQ=","count":0},{"data":"CN7MJQ==","count":0},{"data":"CKzc0QE=","count":0},{"data":"CPzKuQM=","count":1},{"data":"CKqesQI=","count":23},{"data":"CLj2tgE=","count":27},{"data":"CPbBzQM=","count":0},{"data":"CIie8gI=","count":17},{"data":"CKCWZg==","count":0},{"data":"CMi4gAQ=","count":50},{"data":"CLz0MQ==","count":20},{"data":"CL7tpgE=","count":22},{"data":"COy+swM=","count":3},{"data":"CMCBXA==","count":0},{"data":"CMri2AM=","count":4},{"data":"CPSf7gM=","count":27},{"data":"CL7EhgQ=","count":0},{"data":"CKaVxQI=","count":3},{"data":"CPjQtwM=","count":0},{"data":"COa5iQE=","count":12},{"data":"CI7dhQI=","count":18},{"data":"CLri0QI=","count":0},{"data":"COaUOQ==","count":0},{"data":"CIivqQE=","count":40},{"data":"COrtoAE=","count":20},{"data":"CPynyAI=","count":38},{"data":"COiAwwI=","count":0},{"data":"CIjYyAI=","count":0},{"data":"CLKdkAQ=","count":60},{"data":"CJS41gE=","count":0},{"data":"CK76rAQ=","count":0},{"data":"CLiphQI=","count":69},{"data":"CPTXTQ==","count":25},{"data":"CJjEUQ==","count":0},{"data":"CPLh1AE=","count":9},{"data":"CO6tBw==","count":0},{"data":"CNKeRg==","count":31},{"data":"CPKL0QI=","count":48},{"data":"CLzoGw==","count":0},{"data":"CMTX7QI=","count":35},{"data":"CJjGPw==","count":8},{"data":"CMbTsAQ=","count":0},{"data":"CLKIkwQ=","count":0},{"data":"CJa/sAQ=","count":2},{"data":"CKqu5QI=","count":14},{"data":"CIS/pwE=","count":0},{"data":"CO6nCw==","count":36},{"data":"CLrCjgM=","count":22},{"data":"CJKFPw==","count":46},{"data":"COyk9AE=","count":0},{"data":"CMy/7gE=","count":0},{"data":"CJqobg==","count":2},{"data":"CNr7FA==","count":0},{"data":"CJiFsQM=","count":1},{"data":"COTuzgI=","count":0},{"data":"CKyKrAQ=","count":27},{"data":"CNjZkQQ=","count":0},{"data":"CKq66wM=","count":45},{"data":"CLiFxgE=","count":0},{"data":"CJaCtAE=","count":33},{"data":"CITA6QI=","count":27},{"data":"CKKsgAI=","count":0},{"data":"COrhygI=","count":45},{"data":"CMrf9gI=","count":0},{"data":"CJTggwM=","count":24},{"data":"CNSFhQE=","count":2},{"data":"CLjjzwI=","count":0},{"data":"CMyBhAI=","count":9},{"data":"CPKvjwE=","count":20},{"data":"CJ7JnwI=","count":0},{"data":"CLK+Yg==","count":0},{"data":"CPSpvAI=","count":39},{"data":"CMy0vwI=","count":0},{"data":"CNbh7gM=","count":18},{"data":"CI6y2wM=","count":0},{"data":"CK62rgQ=","count":0},{"data":"CNLMMw==","count":0},{"data":"CJrjjgE=","count":0},{"data":"CNiVqQM=","count":0},{"data":"CJrTjAQ=","count":10},{"data":"CILvjQM=","count":3},{"data":"COalOw==","count":0},{"data":"COTxwwM=","count":0},{"data":"CIz0zgM=","count":0},{"data":"CKr6wQI=","count":14},{"data":"CLDjygQ=","count":27},{"data":"CKKnrwE=","count":0},{"data":"CLDchgM=","count":46},{"data":"CJCV6gM=","count":35},{"data":"CLKkkQM=","count":0},{"data":"CPCVoAE=","count":0},{"data":"CNaC+gE=","count":14},{"data":"CLbKOg==","count":0},{"data":"CJDUBA==","count":9},{"data":"CPyDQw==","count":55},{"data":"CISglgM=","count":0},{"data":"CMjq8AM=","count":0},{"data":"COztlwQ=","count":32},{"data":"CISvlAQ=","count":29},{"data":"CLbMOQ==","count":46},{"data":"CPLtwgI=","count":20},{"data":"CPaxnQI=","count":42},{"data":"CM70mAM=","count":0},{"data":"CMTzlQQ=","count":11},{"data":"CMijxgI=","count":22},{"data":"CMaSoAQ=","count":2},{"data":"CJrEiQI=","count":0},{"data":"CL7YoQI=","count":41},{"data":"CPrpkQQ=","count":0},{"data":"CLbPhwI=","count":0},{"data":"CI7LlwQ=","count":14},{"data":"CNyzwwQ=","count":2},{"data":"CMaM4gQ=","count":7},{"data":"CPSh7wI=","count":11},{"data":"CNiw/wM=","count":0},{"data":"CPLr9wE=","count":29},{"data":"CISxIA==","count":0},{"data":"CICekgM=","count":0},{"data":"CMTLhgQ=","count":18},{"data":"CNT92QE=","count":1},{"data":"CNDNnQE=","count":0},{"data":"CODKIQ==","count":41},{"data":"CPDp8gI=","count":5},{"data":"CIL8lQM=","count":5},{"data":"CPKtigM=","count":16},{"data":"CPC7+gE=","count":18},{"data":"COj2dg==","count":0},{"data":"CLj3sQI=","count":0},{"data":"CIDd4gE=","count":24},{"data":"CMbDlgI=","count":0},{"data":"CNTiEA==","count":0},{"data":"CODymgI=","count":0},{"data":"CL6nrwE=","count":0},{"data":"CPCpdQ==","count":57},{"data":"CKDG2gE=","count":0},{"data":"CPK+pQI=","count":0},{"data":"CLaiiwQ=","count":0},{"data":"CI6/lAM=","count":12},{"data":"CLCWiAE=","count":21},{"data":"CIqrFA==","count":44},{"data":"CNDOnQQ=","count":20},{"data":"CPLtkAE=","count":59},{"data":"CJ7lmAI=","count":35},{"data":"COyOvwM=","count":1},{"data":"CPSV/wE=","count":2},{"data":"CJy26wE=","count":0},{"data":"CK7skQM=","count":9},{"data":"CNL8rQM=","count":0},{"data":"CPq6wQI=","count":3},{"data":"COyb0wE=","count":0},{"data":"CO6r0gQ=","count":7},{"data":"CNC2hwM=","count":42},{"data":"CKSp1gQ=","count":10},{"data":"CLr99QI=","count":8},{"data":"CJLW0AE=","count":0},{"data":"CKCU7QI=","count":33},{"data":"CO7oJw==","count":22},{"data":"CLKsFA==","count":41},{"data":"CJSXowI=","count":44},{"data":"CJCCsQQ=","count":33},{"data":"CICrSA==","count":22},{"data":"CPCzIg==","count":9},{"data":"CKzqNg==","count":0},{"data":"COCgowM=","count":11},{"data":"CIL6sgI=","count":0},{"data":"CKjN4AM=","count":0},{"data":"CIDFggE=","count":0},{"data":"CPqHowM=","count":2},{"data":"CLLjkAM=","count":7},{"data":"CP6QEw==","count":6},{"data":"CO7umQI=","count":0},{"data":"CPCYOg==","count":4},{"data":"CMqXuwQ=","count":6},{"data":"COCN5gM=","count":3},{"data":"CIrDwwE=","count":0},{"data":"CMSiqAQ=","count":0},{"data":"CODbdg==","count":18},{"data":"CLylzAI=","count":0},{"data":"CIyS0AE=","count":8},{"data":"CJSo3gQ=","count":29},{"data":"CPiEuAQ=","count":32},{"data":"CPijaQ==","count":0},{"data":"CLj3ggE=","count":46},{"data":"CJqqiAI=","count":46},{"data":"CKSF0AQ=","count":18},{"data":"CL78VA==","count":0},{"data":"CNqtqwQ=","count":10},{"data":"CMLHVQ==","count":3},{"data":"CMaNvQQ=","count":2},{"data":"CJrt+gE=","count":0},{"data":"CKDnOA==","count":0},{"data":"COqxlwQ=","count":17},{"data":"CLLQqgQ=","count":0},{"data":"CKq2lgQ=","count":0},{"data":"CL6HlwQ=","count":36},{"data":"CKTG3QM=","count":0},{"data":"CLzOxgI=","count":0},{"data":"CJiUqQQ=","count":0},{"data":"CLDB1QM=","count":0},{"data":"CML6mAI=","count":0},{"data":"CNqEgAE=","count":0},{"data":"CJS5Kw==","count":0},{"data":"CP6CzQI=","count":7},{"data":"CMDCtAQ=","count":16},{"data":"CIio0gE=","count":3},{"data":"CKiLvAQ=","count":51},{"data":"CLLbZw==","count":0},{"data":"CNqvywM=","count":0},{"data":"CIba3wM=","count":2},{"data":"CN7S1QI=","count":37},{"data":"CKSIzAM=","count":16},{"data":"CLKmBQ==","count":23},{"data":"CMaYswQ=","count":0},{"data":"CM7E5gI=","count":0},{"data":"CLzk3AQ=","count":0},{"data":"CKzGeA==","count":2},{"data":"CNTD9gE=","count":0},{"data":"CPrcLA==","count":0},{"data":"CM6FFg==","count":0},{"data":"CLC3oAE=","count":0},{"data":"CIK/xwE=","count":0},{"data":"CJLrggE=","count":0},{"data":"COylxwE=","count":0},{"data":"CPSQwQE=","count":2},{"data":"CPqqhQE=","count":18},{"data":"COjthwI=","count":0},{"data":"CMSWqgM=","count":0},{"data":"COrNiAM=","count":1},{"data":"CM72sQI=","count":0},{"data":"CKTR4AE=","count":0},{"data":"CNaKhgE=","count":0},{"data":"CPbRuwQ=","count":31},{"data":"CNr5owM=","count":0},{"data":"CLDD9wM=","count":39},{"data":"CKK8LQ==","count":0},{"data":"CJj1rgM=","count":18},{"data":"CPa1tgE=","count":40},{"data":"CMDYjgE=","count":13},{"data":"CILhDQ==","count":0},{"data":"CITG0AQ=","count":12},{"data":"CLDBtAQ=","count":2},{"data":"CIjIxAI=","count":25},{"data":"CNLyqgE=","count":0},{"data":"COC92QQ=","count":0},{"data":"CILw8gE=","count":0},{"data":"CNb98gI=","count":0},{"data":"CJahLA==","count":3},{"data":"CPrX2gM=","count":0},{"data":"CJ6ErgI=","count":0},{"data":"CM6YzQQ=","count":6},{"data":"CKiOlwE=","count":25},{"data":"CKjloAM=","count":0},{"data":"CNz7OA==","count":31},{"data":"CKTQ1AM=","count":0},{"data":"COzz3QE=","count":69},{"data":"COz3Yw==","count":0},{"data":"CJiYXg==","count":16},{"data":"COT4PQ==","count":0},{"data":"CKagLQ==","count":2},{"data":"COiUjQE=","count":0},{"data":"CNC97AE=","count":0},{"data":"CJLQqQM=","count":0},{"data":"CISEiQI=","count":0},{"data":"CIz4kQE=","count":26},{"data":"CP6a4QQ=","count":40},{"data":"COKBoQE=","count":42},{"data":"COzOowI=","count":0},{"data":"CLr6qQQ=","count":0},{"data":"CIyH5gM=","count":7},{"data":"CJrQygE=","count":0},{"data":"CKSHugM=","count":0},{"data":"CJazyAM=","count":0},{"data":"CMTUjQM=","count":0},{"data":"CKyWoQQ=","count":35},{"data":"CJyugwQ=","count":24},{"data":"CICxvgM=","count":1},{"data":"CLT63wM=","count":46},{"data":"CPzGrAE=","count":0},{"data":"CK6B4QI=","count":2},{"data":"CIyDjgQ=","count":20},{"data":"CKzbFA==","count":0},{"data":"CN7KgAQ=","count":0},{"data":"CJKXgQE=","count":1},{"data":"CMifwQQ=","count":0},{"data":"CNKB2wI=","count":35},{"data":"CMyrzQQ=","count":0},{"data":"CKyYygI=","count":20},{"data":"CJjaswE=","count":15},{"data":"CJC22gI=","count":0},{"data":"CJq9LA==","count":11},{"data":"CNrO0QE=","count":31},{"data":"CIacmwQ=","count":0},{"data":"CPSg4QM=","count":9},{"data":"CLig4AM=","count":0},{"data":"CMylOw==","count":0},{"data":"CPi7xAE=","count":2},{"data":"CNCx2wI=","count":18},{"data":"CLqX6gM=","count":0},{"data":"COaMkAI=","count":5},{"data":"CKaWUA==","count":2},{"data":"CMyPnQQ=","count":1},{"data":"CJj1swQ=","count":1},{"data":"CNrNgQE=","count":52},{"data":"CJSxEA==","count":3},{"data":"CMCloAI=","count":55},{"data":"CKT6ngE=","count":11},{"data":"CNz49gI=","count":8},{"data":"CLT8yAI=","count":0},{"data":"CJ62hAQ=","count":24},{"data":"CJK22wM=","count":42},{"data":"CK735wE=","count":0},{"data":"CNTSgQQ=","count":0},{"data":"CLiNkwI=","count":13},{"data":"COiBmQE=","count":3},{"data":"CJDp7QE=","count":21},{"data":"CJCwdw==","count":0},{"data":"COCq0QM=","count":0},{"data":"CKjvUQ==","count":0},{"data":"CJ6jrQM=","count":13},{"data":"CLCkmAI=","count":17},{"data":"CKjX8AI=","count":37},{"data":"CPLy8gM=","count":0},{"data":"CK7V2gI=","count":4},{"data":"CNKWrQI=","count":0},{"data":"CLqg5gM=","count":0},{"data":"CJqWbQ==","count":14},{"data":"CPbF5wI=","count":0},{"data":"CPKyvQQ=","count":0},{"data":"CLbWwQQ=","count":0},{"data":"CJ7voAM=","count":32},{"data":"CKDfmAM=","count":16},{"data":"COz45gM=","count":34},{"data":"CJLgwgM=","count":0},{"data":"CLj8uQE=","count":38},{"data":"CPDCpgM=","count":0},{"data":"COThxAE=","count":41},{"data":"CJDI/gI=","count":17},{"data":"CKLO3AI=","count":0},{"data":"CNj95wM=","count":24},{"data":"COLN4QQ=","count":7},{"data":"CNiY1wI=","count":29},{"data":"CKCJ4AE=","count":24},{"data":"CPLFywI=","count":9},{"data":"CLqMuQI=","count":0},{"data":"CMz/3gI=","count":22},{"data":"CNDMqgQ=","count":13},{"data":"COiH+QM=","count":21},{"data":"CNLGoQI=","count":0},{"data":"CMLW+AE=","count":0},{"data":"CPK64gE=","count":0},{"data":"CKj40gE=","count":10},{"data":"CNKXhQI=","count":0},{"data":"CK721wE=","count":41},{"data":"CKjO3AE=","count":0},{"data":"CPy/gAM=","count":0},{"data":"CPqWzgI=","count":13},{"data":"CO7tQg==","count":0},{"data":"CKCbcQ==","count":3},{"data":"CNqNrQE=","count":7},{"data":"CIjW/wE=","count":2},{"data":"COSZ9wE=","count":32},{"data":"CM7X4gM=","count":33},{"data":"COCXyAI=","count":29},{"data":"CIK1nAI=","count":0},{"data":"CLjpoAM=","count":2},{"data":"CKKp3QM=","count":26},{"data":"COT7VA==","count":25},{"data":"CLqRfQ==","count":33},{"data":"CN6t4wI=","count":0},{"data":"CIiOyQE=","count":0},{"data":"COCojAQ=","count":14},{"data":"CKq62wE=","count":0},{"data":"CLi4YA==","count":0},{"data":"CO7yrQQ=","count":0},{"data":"CK622QM=","count":0},{"data":"CLLFHA==","count":0},{"data":"CN6JkQM=","count":0},{"data":"CMKmiQI=","count":16},{"data":"CPK80AI=","count":0},{"data":"CLSF2wI=","count":6},{"data":"COSt0QM=","count":10},{"data":"CPjKyAQ=","count":0},{"data":"CO6/uQQ=","count":0},{"data":"CJqewQM=","count":0},{"data":"CJz+mQQ=","count":0},{"data":"CJDmxAI=","count":13},{"data":"CKCG9gI=","count":2},{"data":"CPLT3gI=","count":27},{"data":"CLznwwQ=","count":51},{"data":"CMbLWA==","count":0},{"data":"CIrwxAE=","count":1},{"data":"CLruowI=","count":13},{"data":"CIK/owM=","count":28},{"data":"COTRigE=","count":0},{"data":"CIjesgE=","count":0},{"data":"CIikwAE=","count":0},{"data":"COzK1wE=","count":29},{"data":"CKrFkQI=","count":0},{"data":"CICGTQ==","count":0},{"data":"CLCS9AI=","count":2},{"data":"CIDokAE=","count":5},{"data":"CPLBFQ==","count":41},{"data":"CKLwoQQ=","count":36},{"data":"CIaTUg==","count":13},{"data":"CMK3yQM=","count":12},{"data":"CKTtiwM=","count":0},{"data":"CJS04AM=","count":5},{"data":"CPqQ/gI=","count":0},{"data":"CIyh2AI=","count":0},{"data":"CNztvgM=","count":0},{"data":"CKacpQM=","count":8},{"data":"COTS4QM=","count":0},{"data":"CIy7XA==","count":56},{"data":"CKqV0wQ=","count":0},{"data":"CL6/ygE=","count":0},{"data":"CML96gE=","count":0},{"data":"CMyp0QQ=","count":2},{"data":"CPTcvAI=","count":4},{"data":"CPK/sgM=","count":0},{"data":"CIbg/AE=","count":0},{"data":"CK6amQM=","count":0},{"data":"CJb3jwQ=","count":36},{"data":"CPLOfg==","count":13},{"data":"CNqchgI=","count":0},{"data":"CIKAdw==","count":0},{"data":"CIKewAI=","count":13},{"data":"CJzilQM=","count":39},{"data":"CJr1vgE=","count":0},{"data":"CJSVkwQ=","count":0},{"data":"CKD/Uw==","count":0},{"data":"CKqFkAE=","count":0},{"data":"CL7J5gI=","count":15},{"data":"CIaegAQ=","count":1},{"data":"CJyd9AE=","count":8},{"data":"CKiF9QI=","count":18},{"data":"CJCQxwM=","count":0},{"data":"CJanTg==","count":0},{"data":"CNCoxwI=","count":27},{"data":"COSalQI=","count":0},{"data":"CIqJnQQ=","count":0},{"data":"CPT6uAE=","count":0},{"data":"CNDBgwM=","count":0},{"data":"CJyNUw==","count":0},{"data":"CKj2jAE=","count":13},{"data":"CIjkaA==","count":2},{"data":"CJidhQE=","count":6},{"data":"CLSsbw==","count":0},{"data":"CNz5zgQ=","count":2},{"data":"CJTP3gE=","count":0},{"data":"CMzTnQM=","count":37},{"data":"COSUjgE=","count":18},{"data":"CIjT+gM=","count":2},{"data":"CI7YrgM=","count":30},{"data":"CMiU4wE=","count":0},{"data":"CLCYHg==","count":36},{"data":"COSMVg==","count":17},{"data":"CPqViAQ=","count":21},{"data":"CJrZwAQ=","count":0},{"data":"CNaajwE=","count":0},{"data":"CIKFIw==","count":21},{"data":"CIii/gI=","count":0},{"data":"CJbD4gI=","count":0},{"data":"CKbLyAI=","count":0},{"data":"CJDpqgM=","count":1},{"data":"CJbyxwI=","count":0},{"data":"CIalrQM=","count":25},{"data":"CNrFOA==","count":0},{"data":"CNLXbQ==","count":0},{"data":"CKL03wE=","count":25},{"data":"CJq3iQM=","count":28},{"data":"CISRmgM=","count":0},{"data":"CJbNhwM=","count":0},{"data":"CNiVugE=","count":28},{"data":"CJKD0QQ=","count":0},{"data":"CIbn0wM=","count":16},{"data":"CJKkwAI=","count":0},{"data":"CNTMmQQ=","count":0},{"data":"CNLQHw==","count":24},{"data":"CMTZvQM=","count":10},{"data":"CLjpywM=","count":24},{"data":"CKLU+AI=","count":24},{"data":"CPbOwAQ=","count":0},{"data":"CKzBKA==","count":6},{"data":"CMKM7gE=","count":0},{"data":"CPDH0wM=","count":0},{"data":"CIq+1wI=","count":0},{"data":"CIyRowQ=","count":0},{"data":"COaB/AE=","count":0},{"data":"CJbSLQ==","count":28},{"data":"CMCHiwE=","count":45},{"data":"CKSH7QM=","count":5},{"data":"CKiq9QE=","count":0},{"data":"CLDiXA==","count":0},{"data":"CJLkgwQ=","count":0},{"data":"CMy+6wM=","count":6},{"data":"CObhlgE=","count":0},{"data":"CKCNFQ==","count":2},{"data":"CL7lgwM=","count":39},{"data":"CKSn6wE=","count":8},{"data":"CJroowI=","count":0},{"data":"CJ7ghAE=","count":0},{"data":"CNTKrwE=","count":2},{"data":"CJTsuwQ=","count":4},{"data":"CN6I2QE=","count":0},{"data":"COzphwQ=","count":23},{"data":"CNzMfA==","count":0},{"data":"CKaO6QI=","count":13},{"data":"CMiUsAM=","count":2},{"data":"COLbvAI=","count":0},{"data":"COLijQI=","count":30},{"data":"CKrN7gM=","count":0},{"data":"CNy+9wM=","count":0},{"data":"CICl3wI=","count":0},{"data":"CKjbhQI=","count":1},{"data":"CM7Bbw==","count":0},{"data":"CJqk6AE=","count":3},{"data":"CPDMQg==","count":0},{"data":"CPq3qgM=","count":33},{"data":"CKyy+wI=","count":0},{"data":"CLrB7QM=","count":0},{"data":"CIDPFA==","count":0},{"data":"CNjO2wI=","count":0},{"data":"CO6DiQI=","count":27},{"data":"CMbR8AM=","count":24},{"data":"CPCagAM=","count":16},{"data":"CJ7yhgM=","count":13},{"data":"CPzE8QM=","count":0},{"data":"CPSq2gQ=","count":3},{"data":"CNKxswQ=","count":0},{"data":"CJyssAM=","count":0},{"data":"CNyLuwE=","count":0},{"data":"CP7B8wI=","count":7},{"data":"CIK0uwQ=","count":0},{"data":"CNzm5QM=","count":0},{"data":"CNb0/QE=","count":16},{"data":"CLyd0AE=","count":0},{"data":"CLThkQM=","count":22},{"data":"COb9iwQ=","count":3},{"data":"CJLsigE=","count":0},{"data":"COTwuQE=","count":1},{"data":"CJSEaQ==","count":0},{"data":"COrLnwE=","count":33},{"data":"CO7E6QM=","count":0},{"data":"CNLvoAM=","count":2},{"data":"CLLzaA==","count":0},{"data":"CLDEmAM=","count":0},{"data":"CMKOWA==","count":39},{"data":"CLTqPg==","count":0},{"data":"CJbC3QM=","count":43},{"data":"CNjJ4gI=","count":0},{"data":"COzNkwM=","count":36},{"data":"CJLK3wM=","count":0},{"data":"CMbSxQE=","count":0},{"data":"CKy7mAI=","count":1},{"data":"CL6T0AI=","count":32},{"data":"CODi7wE=","count":5},{"data":"CJKFwwI=","count":18},{"data":"CKrjtwE=","count":0},{"data":"CIC7aw==","count":27},{"data":"CJaB+wE=","count":0},{"data":"CKasxwI=","count":8},{"data":"COLq3gQ=","count":42},{"data":"CKa02QI=","count":24},{"data":"CKSUjwE=","count":0},{"data":"CLKQ1AI=","count":13},{"data":"CJaIBg==","count":10},{"data":"COzT9QE=","count":0},{"data":"CKjMoQQ=","count":14},{"data":"CMzQzwI=","count":40},{"data":"CIigWw==","count":0},{"data":"COzT2wE=","count":0},{"data":"CITFoQQ=","count":29},{"data":"CK7t0QI=","count":0},{"data":"CPi1kAM=","count":0},{"data":"CLCk5wE=","count":4},{"data":"CODClgE=","count":0},{"data":"CPyv/QE=","count":0},{"data":"CNDk1QI=","count":17},{"data":"CIateQ==","count":20},{"data":"CLiuugM=","count":0},{"data":"CI6HJw==","count":0},{"data":"CJT/Jg==","count":8},{"data":"CJjYbw==","count":27},{"data":"CMiOswQ=","count":0},{"data":"CICOkAM=","count":0},{"data":"CKKh0AI=","count":47},{"data":"CPKKIQ==","count":29},{"data":"CM7XIg==","count":0},{"data":"CJDMjgE=","count":0},{"data":"CIK4igM=","count":22},{"data":"CNyNlQE=","count":0},{"data":"COaMnAI=","count":0},{"data":"CNiFkAM=","count":2},{"data":"CNrxzAM=","count":0},{"data":"COzFYw==","count":47},{"data":"COyotgE=","count":5},{"data":"CNrh8gI=","count":0},{"data":"CPq25AM=","count":0},{"data":"CPT21QE=","count":0},{"data":"CIjUswQ=","count":0},{"data":"COrI3wI=","count":34},{"data":"CLj6AQ==","count":9},{"data":"CKj7iAM=","count":42},{"data":"CLqJigM=","count":2},{"data":"CN7J6QE=","count":0},{"data":"CLSikwM=","count":0},{"data":"CKzHnAM=","count":0},{"data":"CIaS7AE=","count":48},{"data":"CPq5uQE=","count":0},{"data":"CNrtnwE=","count":0},{"data":"CJrAiQQ=","count":22},{"data":"CIT37QM=","count":0},{"data":"CJSXwQI=","count":0},{"data":"CJT1lgQ=","count":0},{"data":"CKCx2wI=","count":2},{"data":"CJqOzwM=","count":55},{"data":"COqO6wM=","count":0},{"data":"CISTkwM=","count":33},{"data":"CLbo3wI=","count":0},{"data":"CPzELA==","count":0},{"data":"CIS7tgE=","count":0},{"data":"CMbdhgQ=","count":0},{"data":"CI6UnQQ=","count":13},{"data":"CLarWg==","count":6},{"data":"CJy5DQ==","count":24},{"data":"CLjO0AM=","count":0},{"data":"CIy6kwI=","count":0},{"data":"CKj+uwM=","count":0},{"data":"CKCazgI=","count":0},{"data":"COqXrAI=","count":14},{"data":"CPjU6gI=","count":6},{"data":"CMbFNA==","count":0},{"data":"CLTb0AE=","count":42},{"data":"CP748AI=","count":0},{"data":"CLb7Pw==","count":14},{"data":"CNLAZQ==","count":39},{"data":"CPTOkwQ=","count":21},{"data":"CISFrgI=","count":0},{"data":"CLKskwI=","count":8},{"data":"CPyv5AI=","count":51},{"data":"CIDH6QM=","count":16},{"data":"CMiA4QM=","count":0},{"data":"CO6wuQQ=","count":8},{"data":"CJagywM=","count":0},{"data":"CLLRkAE=","count":0},{"data":"CKbZtgM=","count":0},{"data":"CM61kgQ=","count":0},{"data":"COTePA==","count":46},{"data":"CLTcRA==","count":0},{"data":"CKzv2AQ=","count":8},{"data":"CJa7lgM=","count":0},{"data":"CLr+jAI=","count":0},{"data":"CJDb+wE=","count":0},{"data":"CO7y8wE=","count":4},{"data":"CJqplwI=","count":0},{"data":"CNivCg==","count":1},{"data":"CMz6Mw==","count":0},{"data":"COqFpgQ=","count":48},{"data":"CI7ELw==","count":18},{"data":"CNDV5AM=","count":52},{"data":"CJiIswM=","count":0},{"data":"COzDmwE=","count":3},{"data":"CODMlQE=","count":48},{"data":"CLKm9gM=","count":8},{"data":"COqQqwE=","count":25},{"data":"CNLBjwQ=","count":2},{"data":"CKaLlAM=","count":0},{"data":"CJi39QM=","count":2},{"data":"CKjmoQI=","count":36},{"data":"CNrBnQM=","count":44},{"data":"CN6DSw==","count":0},{"data":"CJbzhgI=","count":13},{"data":"CLy/twE=","count":0},{"data":"CNig2wQ=","count":0},{"data":"CJqVowQ=","count":2},{"data":"CLLczwQ=","count":0},{"data":"CLCm8gE=","count":0},{"data":"CPTOHA==","count":28},{"data":"CMKoZw==","count":0},{"data":"CICErQE=","count":24},{"data":"CL6txQE=","count":0},{"data":"CPiZaQ==","count":0},{"data":"CMCD7QM=","count":20},{"data":"CLrfuwE=","count":15},{"data":"CNSrQQ==","count":23},{"data":"CLTFMA==","count":0},{"data":"CJKG5gM=","count":0},{"data":"CLTQqQQ=","count":0},{"data":"COzxJA==","count":24},{"data":"CK6JHQ==","count":25},{"data":"CI6GJw==","count":0},{"data":"CJLW1QE=","count":8},{"data":"COLJzgE=","count":0},{"data":"CP7ktgM=","count":7},{"data":"CNrx9wM=","count":0},{"data":"COymwAM=","count":0},{"data":"CLSNbw==","count":33},{"data":"CJai/AE=","count":0},{"data":"CI7hlQI=","count":8},{"data":"CLTV2wI=","count":32},{"data":"CMbypwI=","count":0},{"data":"CJaT0AE=","count":55},{"data":"CIzL+gE=","count":0},{"data":"COSmuAM=","count":0},{"data":"CNzI3AI=","count":0},{"data":"CMrZ9gE=","count":20},{"data":"CPK+9gE=","count":0},{"data":"CJis2gE=","count":20},{"data":"CKzS4wI=","count":0},{"data":"CJ6w7QI=","count":2},{"data":"CPiKtwI=","count":14},{"data":"CO6IiwE=","count":18},{"data":"CO737gM=","count":0},{"data":"CITRAg==","count":0},{"data":"CJCtgQI=","count":0},{"data":"CMrgJQ==","count":0},{"data":"CNCEzAE=","count":20},{"data":"CPKOpwQ=","count":0},{"data":"CO7eUg==","count":0},{"data":"CL6NEw==","count":4},{"data":"CKLm/AE=","count":0},{"data":"CLTmew==","count":23},{"data":"CPS76AI=","count":36},{"data":"CLyk4AI=","count":0},{"data":"CPDL7wM=","count":0},{"data":"CPCRZQ==","count":0},{"data":"CMyGiQE=","count":34},{"data":"CN7e2AM=","count":23},{"data":"CJaGrwI=","count":0},{"data":"CLaqHg==","count":2},{"data":"CPylzwE=","count":32},{"data":"COaY5AI=","count":0},{"data":"CLCBmgE=","count":2},{"data":"CJim9QM=","count":0},{"data":"CPKP0QE=","count":0},{"data":"COye3QE=","count":0},{"data":"CNCa0AM=","count":15},{"data":"CLSgHQ==","count":0},{"data":"CLio0wE=","count":20},{"data":"CK75Wg==","count":0},{"data":"CPbijQE=","count":5},{"data":"CNLqsgI=","count":1},{"data":"CO6BmwI=","count":0},{"data":"COrlkAE=","count":19},{"data":"CIbF4QQ=","count":0},{"data":"CLqK9QE=","count":22},{"data":"CKD5Ag==","count":11},{"data":"CNrIigI=","count":2},{"data":"CPLqygI=","count":46},{"data":"COqN0AM=","count":16},{"data":"CMrJjgE=","count":36},{"data":"CMbRGA==","count":28},{"data":"CM68rwQ=","count":31},{"data":"CLbS4QM=","count":19},{"data":"CNiy1gI=","count":0},{"data":"CLrB0gE=","count":26},{"data":"CPrQFQ==","count":6},{"data":"CIa1ygQ=","count":0},{"data":"COzu1QM=","count":9},{"data":"CKSdmwE=","count":17},{"data":"CMTv4AM=","count":39},{"data":"CL76Bg==","count":33},{"data":"CIq5lAQ=","count":31},{"data":"CIjfOA==","count":3},{"data":"CMaHrAI=","count":43},{"data":"CPLU3gQ=","count":0},{"data":"CLDulQI=","count":0},{"data":"CLjS6AE=","count":38},{"data":"CMSpgQQ=","count":22},{"data":"CLr7jQQ=","count":0},{"data":"CN7SWA==","count":0},{"data":"CMqV7gM=","count":0},{"data":"CO7wlQE=","count":0},{"data":"CN7cqQE=","count":24},{"data":"CKDYoAM=","count":39},{"data":"CM7s2QI=","count":0},{"data":"CJLHMg==","count":0},{"data":"CK7XoAE=","count":0},{"data":"CJKm0QE=","count":0},{"data":"CIjz+AM=","count":0},{"data":"CIasvQM=","count":0},{"data":"CNrdjwQ=","count":33},{"data":"CKaDvgE=","count":1},{"data":"CPCD5QM=","count":0},{"data":"COzMnQQ=","count":10},{"data":"CISkogQ=","count":2},{"data":"CIjG6QE=","count":0},{"data":"CKqUFA==","count":5},{"data":"CO7E0QE=","count":3},{"data":"CM7r+AM=","count":8},{"data":"CPKpyQM=","count":4},{"data":"CKyNzAQ=","count":73},{"data":"CLqjyAE=","count":0},{"data":"CPqRjAM=","count":0},{"data":"CJbg/wM=","count":18},{"data":"CO7tjQM=","count":0},{"data":"CMTPBA==","count":0},{"data":"CPy17wM=","count":0},{"data":"CMSDvQQ=","count":0},{"data":"CNL/qwM=","count":0},{"data":"CJ6diAM=","count":7},{"data":"CPCxswE=","count":0},{"data":"CODBxgI=","count":13},{"data":"CMyRngI=","count":0},{"data":"CMS44wI=","count":0},{"data":"CL7wsQE=","count":0},{"data":"CPbMwgM=","count":14},{"data":"CKyEkQE=","count":12},{"data":"COKSMg==","count":2},{"data":"CPTzqAM=","count":0},{"data":"CKylNw==","count":0},{"data":"CNzVqQQ=","count":0},{"data":"CIrFRQ==","count":0},{"data":"CIShqQE=","count":2},{"data":"CO7W+AI=","count":0},{"data":"CJqu3QQ=","count":2},{"data":"CP6g6QI=","count":0},{"data":"CMzyJA==","count":13},{"data":"COCs9wI=","count":0},{"data":"CNKk2QQ=","count":35},{"data":"CL7G+wI=","count":3},{"data":"CIyC4QI=","count":0},{"data":"CIiCswM=","count":0},{"data":"CP71jQQ=","count":7},{"data":"CI7h5QE=","count":0},{"data":"CIyImQQ=","count":1},{"data":"CNrg/wM=","count":0},{"data":"CKrOwQQ=","count":0},{"data":"COrhjwI=","count":0},{"data":"CIartwQ=","count":6},{"data":"CKz8ygM=","count":36},{"data":"CN7omgE=","count":8},{"data":"CO6asgM=","count":4},{"data":"COLZzQM=","count":4},{"data":"CNC8UA==","count":0},{"data":"COz8FQ==","count":0},{"data":"CKakAw==","count":0},{"data":"CLziywE=","count":0},{"data":"CNK/qAM=","count":38},{"data":"CJ6MuAI=","count":0},{"data":"CLyvXA==","count":0},{"data":"CPiZWg==","count":7},{"data":"COjq/QE=","count":0},{"data":"CJK0qAI=","count":0},{"data":"CJLihAM=","count":38},{"data":"CKj6xgQ=","count":0},{"data":"CJ6ubA==","count":8},{"data":"CPDt4QQ=","count":0},{"data":"CLrHuAI=","count":0},{"data":"CILpyQE=","count":25},{"data":"CJLX0QQ=","count":0},{"data":"CIDFHw==","count":0},{"data":"CM6R1AM=","count":0},{"data":"COis1wE=","count":0},{"data":"CPLSyAI=","count":0},{"data":"CMb1kQI=","count":41},{"data":"CNTVjgM=","count":20},{"data":"CNKJ4gM=","count":8},{"data":"CLDYhAE=","count":0},{"data":"CLy27QI=","count":0},{"data":"CIThgQE=","count":0},{"data":"CLyLxAQ=","count":0},{"data":"CJjpDA==","count":2},{"data":"CKKVvgI=","count":0},{"data":"CJSVHw==","count":0},{"data":"CJ6WowM=","count":4},{"data":"CPKzFg==","count":4},{"data":"CPiHbQ==","count":28},{"data":"CJj6Ug==","count":2},{"data":"CJSw7wI=","count":14},{"data":"CMy1+AE=","count":36},{"data":"CIifggE=","count":0},{"data":"CKb9Og==","count":24},{"data":"CLjK2gM=","count":0},{"data":"CNzAkgM=","count":7},{"data":"CIbJ3QE=","count":22},{"data":"COS0gQI=","count":13},{"data":"CO7R1wE=","count":16},{"data":"CKaIxgE=","count":0},{"data":"CLrcDA==","count":17},{"data":"CO617gI=","count":15},{"data":"COTg2wM=","count":0},{"data":"CPbTGQ==","count":21},{"data":"CPq0oAQ=","count":0},{"data":"CIz5ggE=","count":0},{"data":"CJjPoAQ=","count":3},{"data":"CNySMw==","count":0},{"data":"CNqQRQ==","count":1},{"data":"CKyovQM=","count":15},{"data":"CKz13gQ=","count":0},{"data":"CLLY0gI=","count":0},{"data":"COCF+wE=","count":0},{"data":"CLqv5gM=","count":12},{"data":"CJbFHw==","count":0},{"data":"CNiuigE=","count":27},{"data":"COTCyAQ=","count":0},{"data":"CMDcHA==","count":49},{"data":"CLjgiAE=","count":0},{"data":"CMS65wM=","count":0},{"data":"CMi+nwQ=","count":0},{"data":"CM6HwgM=","count":10},{"data":"CKTj9gI=","count":0},{"data":"CJzkBA==","count":33},{"data":"CObHxQE=","count":0},{"data":"CJC2ygM=","count":0},{"data":"CK7HiAI=","count":17},{"data":"COr+kQM=","count":22},{"data":"CPapkgM=","count":28},{"data":"COT2+gE=","count":3},{"data":"CIqyhwI=","count":14},{"data":"CLLX9wI=","count":28},{"data":"CIargwQ=","count":0},{"data":"CLTk7AM=","count":22},{"data":"CMK0Kw==","count":0},{"data":"CKSwuAE=","count":5},{"data":"CJjFtgM=","count":0},{"data":"CMqwzgM=","count":0},{"data":"COSkXA==","count":0},{"data":"CMKZ3wM=","count":0},{"data":"CITHqQM=","count":0},{"data":"CMaa4gE=","count":0},{"data":"CJalngQ=","count":24},{"data":"COScgwM=","count":0},{"data":"CLrgggM=","count":36},{"data":"CLLPjQM=","count":25},{"data":"CODAiAM=","count":0},{"data":"CPiO+gE=","count":33},{"data":"COrFlgE=","count":0},{"data":"CIqAnwQ=","count":0},{"data":"CIDrMA==","count":1},{"data":"CNyrzAI=","count":1},{"data":"CI7A9QM=","count":0},{"data":"CNa8bg==","count":0},{"data":"CJSTzQQ=","count":8},{"data":"CNKhowI=","count":75},{"data":"CNSvswI=","count":42},{"data":"CLy6iQQ=","count":0},{"data":"CKrlqgE=","count":25},{"data":"CNDslQE=","count":0},{"data":"CLaY0gQ=","count":16},{"data":"CLCYJg==","count":0},{"data":"CLbmLw==","count":0},{"data":"CPCdswQ=","count":0},{"data":"CIbp9AI=","count":22},{"data":"CN7g3gE=","count":1},{"data":"CPTaFA==","count":0},{"data":"CMSUlgM=","count":17},{"data":"COKWnQI=","count":0},{"data":"CLTlrgI=","count":4},{"data":"CPqdAQ==","count":24},{"data":"CPL0MQ==","count":12},{"data":"CMKK8QE=","count":0},{"data":"CKT42QM=","count":2},{"data":"CIaLwwQ=","count":16},{"data":"CMjaiAI=","count":0},{"data":"COLFngQ=","count":0},{"data":"COD1DQ==","count":40},{"data":"COT36wM=","count":0},{"data":"CIi/SQ==","count":0},{"data":"CMTGFg==","count":0},{"data":"CIadxwE=","count":0},{"data":"CPLGzwE=","count":0},{"data":"CID7wQE=","count":0},{"data":"CKzGNg==","count":9},{"data":"CMLO8gI=","count":8},{"data":"CPiHjAE=","count":19},{"data":"CNaFqAQ=","count":7},{"data":"CLSdPw==","count":3},{"data":"CMS4/AM=","count":0},{"data":"CIihuAM=","count":20},{"data":"CMjU6QM=","count":5},{"data":"COzQNg==","count":0},{"data":"CPrUyQM=","count":10},{"data":"CMqazgM=","count":0},{"data":"COj5/AM=","count":27},{"data":"CKrAOA==","count":0},{"data":"CPCRzQE=","count":2},{"data":"CLaSIQ==","count":0},{"data":"CPbJbQ==","count":0},{"data":"CMSAhAM=","count":15},{"data":"CPy8GQ==","count":12},{"data":"CIKn0gQ=","count":45},{"data":"CILY4QM=","count":0},{"data":"CIqKrQI=","count":0},{"data":"CMjRlQE=","count":0},{"data":"CMLisQM=","count":1},{"data":"CLTflQQ=","count":0},{"data":"CO6aygI=","count":61},{"data":"CLiokgM=","count":0},{"data":"CNTZ2wI=","count":4},{"data":"CJqMtgM=","count":27},{"data":"CP6nhgE=","count":0}],"default_value":0},"null_count":0,"tot_col_size":18943171,"last_update_version":410676699537866752,"correlation":1},"d":{"histogram":{"ndv":4999168,"buckets":[{"count":20000,"lower_bound":"NDU4Ng==","upper_bound":"MTY2MTQ=","repeats":1},{"count":40000,"lower_bound":"MTY5NTY=","upper_bound":"MjQ0MTU=","repeats":1},{"count":60000,"lower_bound":"MjczMjY=","upper_bound":"NDA0Nzg=","repeats":1},{"count":80000,"lower_bound":"NDI4ODk=","upper_bound":"NTM4OTc=","repeats":1},{"count":100000,"lower_bound":"NTM4OTk=","upper_bound":"NzEwNDA=","repeats":1},{"count":120000,"lower_bound":"NzQ2MzI=","upper_bound":"ODE3OTU=","repeats":1},{"count":140000,"lower_bound":"ODIxOTA=","upper_bound":"OTYwOTQ=","repeats":1},{"count":160000,"lower_bound":"OTg3MTI=","upper_bound":"MTA4MzAy","repeats":1},{"count":180000,"lower_bound":"MTE5NjY1","upper_bound":"MTI1NDAz","repeats":1},{"count":200000,"lower_bound":"MTI1Nzcz","upper_bound":"MTM2NDI1","repeats":1},{"count":220000,"lower_bound":"MTM3NzAx","upper_bound":"MTQwOTY1","repeats":1},{"count":240000,"lower_bound":"MTQ0OTQ2","upper_bound":"MTY1ODc3","repeats":1},{"count":260000,"lower_bound":"MTcyNjE0","upper_bound":"MjAxMDg2","repeats":1},{"count":280000,"lower_bound":"MjAzNDA5","upper_bound":"MjA4NTY3","repeats":1},{"count":300000,"lower_bound":"MjA4OTQ1","upper_bound":"MjEyNzc2","repeats":1},{"count":320000,"lower_bound":"MjE2OTIy","upper_bound":"MjM2NjQ0","repeats":1},{"count":340000,"lower_bound":"MjM3MjI3","upper_bound":"MjQ4NTcw","repeats":1},{"count":360000,"lower_bound":"MjU4NzUy","upper_bound":"MjczMTk1","repeats":1},{"count":380000,"lower_bound":"Mjc3MzUx","upper_bound":"Mjg0OTc0","repeats":1},{"count":400000,"lower_bound":"Mjg1MzQ4","upper_bound":"MjkxNDQ0","repeats":1},{"count":420000,"lower_bound":"MjkyOTEx","upper_bound":"MzE1ODI4","repeats":1},{"count":440000,"lower_bound":"MzE5NTk4","upper_bound":"MzM2OTE0","repeats":1},{"count":460000,"lower_bound":"MzQ0MTc0","upper_bound":"MzY0NTc5","repeats":1},{"count":480000,"lower_bound":"MzcxNzM2","upper_bound":"NDAzNjI4","repeats":1},{"count":500000,"lower_bound":"NDA4MDM0","upper_bound":"NDIyMDM3","repeats":1},{"count":520000,"lower_bound":"NDIzOTg4","upper_bound":"NDMyNzkz","repeats":1},{"count":540000,"lower_bound":"NDU0NTcw","upper_bound":"NDYxOTgz","repeats":1},{"count":560000,"lower_bound":"NDY5OTE4","upper_bound":"NTE4OTI0","repeats":1},{"count":580000,"lower_bound":"NTIzOTc4","upper_bound":"NTMwNjcw","repeats":1},{"count":600000,"lower_bound":"NTMyNzU1","upper_bound":"NTQzNzQ2","repeats":1},{"count":620000,"lower_bound":"NTQ0MDQ4","upper_bound":"NTU4MDc0","repeats":1},{"count":640000,"lower_bound":"NTYwOTU3","upper_bound":"NTc0NDMz","repeats":1},{"count":660000,"lower_bound":"NTgwNDk3","upper_bound":"NTkzODM5","repeats":1},{"count":680000,"lower_bound":"NTk1MDEy","upper_bound":"NjExMzc4","repeats":1},{"count":700000,"lower_bound":"NjI0NTc2","upper_bound":"NjQ3ODY2","repeats":1},{"count":720000,"lower_bound":"NjY5NzA2","upper_bound":"Njc4MDA0","repeats":1},{"count":740000,"lower_bound":"NjgzNDgx","upper_bound":"NzEzMzMx","repeats":1},{"count":760000,"lower_bound":"NzE3MDY5","upper_bound":"NzI3MzEx","repeats":1},{"count":780000,"lower_bound":"NzI3Nzg1","upper_bound":"NzM4NTE3","repeats":1},{"count":800000,"lower_bound":"NzQxMDEx","upper_bound":"NzQ1NTIy","repeats":1},{"count":820000,"lower_bound":"NzQ3NTc4","upper_bound":"NzY4MDk5","repeats":1},{"count":840000,"lower_bound":"NzcyODM3","upper_bound":"Nzk2NTMw","repeats":1},{"count":860000,"lower_bound":"Nzk4OTk3","upper_bound":"ODE5Njc1","repeats":1},{"count":880000,"lower_bound":"ODIwMjAz","upper_bound":"ODIxNTk0","repeats":1},{"count":900000,"lower_bound":"ODMxNjM0","upper_bound":"ODQ0NTAz","repeats":1},{"count":920000,"lower_bound":"ODQ1Mzg1","upper_bound":"ODY3NzE1","repeats":1},{"count":940000,"lower_bound":"OTA4MTkw","upper_bound":"OTIzNjky","repeats":1},{"count":960000,"lower_bound":"OTI0NDY2","upper_bound":"OTMwODk2","repeats":1},{"count":980000,"lower_bound":"OTM0NTQx","upper_bound":"OTQyOTgw","repeats":1},{"count":1000000,"lower_bound":"OTU0MDI5","upper_bound":"OTU4NDc1","repeats":1},{"count":1020000,"lower_bound":"OTYwNTM5","upper_bound":"OTg0OTc1","repeats":1},{"count":1040000,"lower_bound":"OTg3NzIz","upper_bound":"MTAwMTMzOA==","repeats":1},{"count":1060000,"lower_bound":"MTAwNzA2Mg==","upper_bound":"MTAyMjQzNQ==","repeats":1},{"count":1080000,"lower_bound":"MTAyNjUxNg==","upper_bound":"MTAzNjQ1MA==","repeats":1},{"count":1100000,"lower_bound":"MTAzNzc4Ng==","upper_bound":"MTA1NzExNg==","repeats":1},{"count":1120000,"lower_bound":"MTA2Mzk5OA==","upper_bound":"MTEwMDE5NQ==","repeats":1},{"count":1140000,"lower_bound":"MTEwMjY1OQ==","upper_bound":"MTExMDA5Mw==","repeats":1},{"count":1160000,"lower_bound":"MTExNTU5Mw==","upper_bound":"MTEzNzU1NQ==","repeats":1},{"count":1180000,"lower_bound":"MTEzOTg1Nw==","upper_bound":"MTE1NDk3Mg==","repeats":1},{"count":1200000,"lower_bound":"MTE2MTIwMA==","upper_bound":"MTE3NjY2NA==","repeats":1},{"count":1220000,"lower_bound":"MTE3ODQ5Ng==","upper_bound":"MTE4NzQ5MQ==","repeats":1},{"count":1240000,"lower_bound":"MTIwMTAzMQ==","upper_bound":"MTIxMjQzNg==","repeats":1},{"count":1260000,"lower_bound":"MTIxNDU0Nw==","upper_bound":"MTIyMjYzNQ==","repeats":1},{"count":1280000,"lower_bound":"MTIzNDQ0NQ==","upper_bound":"MTI1MDY4NQ==","repeats":1},{"count":1300000,"lower_bound":"MTI1NzE5OQ==","upper_bound":"MTI2OTE4Nw==","repeats":1},{"count":1320000,"lower_bound":"MTI3NDM1OQ==","upper_bound":"MTMwMTgzOA==","repeats":1},{"count":1340000,"lower_bound":"MTMwMTkxOQ==","upper_bound":"MTMyOTI2Ng==","repeats":1},{"count":1360000,"lower_bound":"MTMzNDM5NQ==","upper_bound":"MTM1MDA0OA==","repeats":1},{"count":1380000,"lower_bound":"MTM1MDE3Nw==","upper_bound":"MTM2MzM5Mw==","repeats":1},{"count":1400000,"lower_bound":"MTM2NTc0Nw==","upper_bound":"MTM4MTA0OQ==","repeats":1},{"count":1420000,"lower_bound":"MTM5MTczMQ==","upper_bound":"MTQwNjM4OA==","repeats":1},{"count":1440000,"lower_bound":"MTQwODkyNg==","upper_bound":"MTQyODgyNg==","repeats":1},{"count":1460000,"lower_bound":"MTQzNTcxNg==","upper_bound":"MTQ1MjEwNA==","repeats":1},{"count":1480000,"lower_bound":"MTQ2NjY5Ng==","upper_bound":"MTQ3NTgwMw==","repeats":1},{"count":1500000,"lower_bound":"MTQ4NDMzNA==","upper_bound":"MTUwMDgyNg==","repeats":1},{"count":1520000,"lower_bound":"MTUwNjE5NA==","upper_bound":"MTUzNTAwMQ==","repeats":1},{"count":1540000,"lower_bound":"MTU0MTg2NQ==","upper_bound":"MTU1NzUyMw==","repeats":1},{"count":1560000,"lower_bound":"MTU1OTE2Mg==","upper_bound":"MTU4MzAwNQ==","repeats":1},{"count":1580000,"lower_bound":"MTU4NDc1MA==","upper_bound":"MTU5MDA0Mw==","repeats":1},{"count":1600000,"lower_bound":"MTU5NzU0MQ==","upper_bound":"MTYxMTg0NQ==","repeats":1},{"count":1620000,"lower_bound":"MTYxNDIyMw==","upper_bound":"MTYyMjMwMg==","repeats":1},{"count":1640000,"lower_bound":"MTYyOTkwMA==","upper_bound":"MTY1MzQyNg==","repeats":1},{"count":1660000,"lower_bound":"MTY1NTA4Mw==","upper_bound":"MTY2MzcxMQ==","repeats":1},{"count":1680000,"lower_bound":"MTY2NzYwOQ==","upper_bound":"MTY3MzAxMg==","repeats":1},{"count":1700000,"lower_bound":"MTY3NTMzOQ==","upper_bound":"MTY3ODEzOA==","repeats":1},{"count":1720000,"lower_bound":"MTY4MzUwNQ==","upper_bound":"MTY5MTIxNw==","repeats":1},{"count":1740000,"lower_bound":"MTY5NTI1Mg==","upper_bound":"MTcwOTYxNg==","repeats":1},{"count":1760000,"lower_bound":"MTcxMzI1Nw==","upper_bound":"MTczMTA1OQ==","repeats":1},{"count":1780000,"lower_bound":"MTczNzcyNg==","upper_bound":"MTc2MjUzMA==","repeats":1},{"count":1800000,"lower_bound":"MTc3NDY1OQ==","upper_bound":"MTc4NzgwNA==","repeats":1},{"count":1820000,"lower_bound":"MTc5MDExMg==","upper_bound":"MTgxNjU5Mg==","repeats":1},{"count":1840000,"lower_bound":"MTgyMTc3MQ==","upper_bound":"MTgzMzkwMA==","repeats":1},{"count":1860000,"lower_bound":"MTg0MDg4NQ==","upper_bound":"MTg2NjQzNw==","repeats":1},{"count":1880000,"lower_bound":"MTg2NzkzMw==","upper_bound":"MTg5NTU0MQ==","repeats":1},{"count":1900000,"lower_bound":"MTg5NzIyNw==","upper_bound":"MTkxNDY5NA==","repeats":1},{"count":1920000,"lower_bound":"MTkyMjgzMg==","upper_bound":"MTk0MDQ3NA==","repeats":1},{"count":1940000,"lower_bound":"MTk0MTYxMg==","upper_bound":"MTk1MjA2NA==","repeats":1},{"count":1960000,"lower_bound":"MTk2MTczNA==","upper_bound":"MTk5MTIwMg==","repeats":1},{"count":1980000,"lower_bound":"MTk5NjI1Ng==","upper_bound":"MjAwOTUyNw==","repeats":1},{"count":2000000,"lower_bound":"MjAwOTg4Mg==","upper_bound":"MjAxMjEzOA==","repeats":1},{"count":2020000,"lower_bound":"MjAyNDA4NA==","upper_bound":"MjA3Mzc5Mw==","repeats":1},{"count":2040000,"lower_bound":"MjA4MjUwMg==","upper_bound":"MjA4ODg2OQ==","repeats":1},{"count":2060000,"lower_bound":"MjA5MjYyMw==","upper_bound":"MjEwODAyNg==","repeats":1},{"count":2080000,"lower_bound":"MjEwODE4Nw==","upper_bound":"MjExNTg5MQ==","repeats":1},{"count":2100000,"lower_bound":"MjEyNTUzNg==","upper_bound":"MjEyNjU1MQ==","repeats":1},{"count":2120000,"lower_bound":"MjEyODQxOQ==","upper_bound":"MjEzNjM2NQ==","repeats":1},{"count":2140000,"lower_bound":"MjEzODQ5OA==","upper_bound":"MjE1NDQwNw==","repeats":1},{"count":2160000,"lower_bound":"MjE1NzI5NQ==","upper_bound":"MjE2NTk3Mw==","repeats":1},{"count":2180000,"lower_bound":"MjE3MDQ2OA==","upper_bound":"MjE5NjM2Nw==","repeats":1},{"count":2200000,"lower_bound":"MjIwNzQ3MQ==","upper_bound":"MjIzMjAzMA==","repeats":1},{"count":2220000,"lower_bound":"MjIzNzM5OA==","upper_bound":"MjI2Mjg1NQ==","repeats":1},{"count":2240000,"lower_bound":"MjI3ODQyNw==","upper_bound":"MjI4NTU0Mg==","repeats":1},{"count":2260000,"lower_bound":"MjI4NjIyOA==","upper_bound":"MjMwMzU0NQ==","repeats":1},{"count":2280000,"lower_bound":"MjMxMDUyNQ==","upper_bound":"MjMyMTEyNg==","repeats":1},{"count":2300000,"lower_bound":"MjMyNTQ0NA==","upper_bound":"MjM0NDY1OQ==","repeats":1},{"count":2320000,"lower_bound":"MjM0ODM5Mg==","upper_bound":"MjM1NTgwMQ==","repeats":1},{"count":2340000,"lower_bound":"MjM1Nzk3Mw==","upper_bound":"MjM3MTEwMw==","repeats":1},{"count":2360000,"lower_bound":"MjM3NDcyNg==","upper_bound":"MjM4NTE3Ng==","repeats":1},{"count":2380000,"lower_bound":"MjM5MDAzMg==","upper_bound":"MjQwMDk0MQ==","repeats":1},{"count":2400000,"lower_bound":"MjQxMDQ2MQ==","upper_bound":"MjQyOTMwMA==","repeats":1},{"count":2420000,"lower_bound":"MjQzNTE4OQ==","upper_bound":"MjQ0NzExMA==","repeats":1},{"count":2440000,"lower_bound":"MjQ0NzM0Mg==","upper_bound":"MjQ2MTQ3OQ==","repeats":1},{"count":2460000,"lower_bound":"MjQ2NDYyMw==","upper_bound":"MjQ5MTM4OQ==","repeats":1},{"count":2480000,"lower_bound":"MjQ5MjUzOQ==","upper_bound":"MjUwMjU4NA==","repeats":1},{"count":2500000,"lower_bound":"MjUxMzIzNQ==","upper_bound":"MjUxOTY1MQ==","repeats":1},{"count":2520000,"lower_bound":"MjUyMjMyNg==","upper_bound":"MjUzMDI4Mw==","repeats":1},{"count":2540000,"lower_bound":"MjUzNDcyNQ==","upper_bound":"MjU0NzU3Mw==","repeats":1},{"count":2560000,"lower_bound":"MjU1NjE4MQ==","upper_bound":"MjU2NjYxOQ==","repeats":1},{"count":2580000,"lower_bound":"MjU3Mjc2Nw==","upper_bound":"MjU5Njg4NQ==","repeats":1},{"count":2600000,"lower_bound":"MjYwMDgzMw==","upper_bound":"MjY0MjU5NQ==","repeats":1},{"count":2620000,"lower_bound":"MjY0NzY2MA==","upper_bound":"MjY1NDE0Nw==","repeats":1},{"count":2640000,"lower_bound":"MjY1NzYzNw==","upper_bound":"MjY2NzY0OA==","repeats":1},{"count":2660000,"lower_bound":"MjY4OTU2Mg==","upper_bound":"MjY5NjQxMw==","repeats":1},{"count":2680000,"lower_bound":"MjcwMDMwNw==","upper_bound":"MjczNTg2MA==","repeats":1},{"count":2700000,"lower_bound":"MjczOTEyNg==","upper_bound":"Mjc1OTAxMg==","repeats":1},{"count":2720000,"lower_bound":"Mjc2MDA5MA==","upper_bound":"Mjc3OTM0MA==","repeats":1},{"count":2740000,"lower_bound":"Mjc4MDI3Ng==","upper_bound":"Mjc4NDY3Mg==","repeats":1},{"count":2760000,"lower_bound":"Mjc4OTE5Mg==","upper_bound":"MjgxMTc5Mg==","repeats":1},{"count":2780000,"lower_bound":"MjgxNjczMA==","upper_bound":"MjgyMTczNg==","repeats":1},{"count":2800000,"lower_bound":"MjgzNjc2MQ==","upper_bound":"Mjg0ODYzMw==","repeats":1},{"count":2820000,"lower_bound":"Mjg0OTc3OQ==","upper_bound":"Mjg2Njk5Nw==","repeats":1},{"count":2840000,"lower_bound":"Mjg3NTIyNQ==","upper_bound":"Mjg5MDIzMQ==","repeats":1},{"count":2860000,"lower_bound":"Mjg5ODA5MA==","upper_bound":"MjkxMjY5MQ==","repeats":1},{"count":2880000,"lower_bound":"MjkxMjY5Mg==","upper_bound":"MjkzNDY0Ng==","repeats":1},{"count":2900000,"lower_bound":"Mjk0MDU0Nw==","upper_bound":"Mjk1MjkzMQ==","repeats":1},{"count":2920000,"lower_bound":"Mjk1NzE4MA==","upper_bound":"Mjk2MDUyMw==","repeats":1},{"count":2940000,"lower_bound":"Mjk2NTcxOA==","upper_bound":"Mjk3MDgzNw==","repeats":1},{"count":2960000,"lower_bound":"Mjk3Mzk2NA==","upper_bound":"Mjk5MDUxMA==","repeats":1},{"count":2980000,"lower_bound":"Mjk5NjMzOA==","upper_bound":"MzAwNjA0NA==","repeats":1},{"count":3000000,"lower_bound":"MzAwOTEyMg==","upper_bound":"MzAyNjcwMw==","repeats":1},{"count":3020000,"lower_bound":"MzAyOTYwNQ==","upper_bound":"MzA0NjM2OA==","repeats":1},{"count":3040000,"lower_bound":"MzA1NTI5NA==","upper_bound":"MzA3MzQ1OA==","repeats":1},{"count":3060000,"lower_bound":"MzA3OTA0MQ==","upper_bound":"MzEwMzIyOQ==","repeats":1},{"count":3080000,"lower_bound":"MzEwNDA4OQ==","upper_bound":"MzEzMjk1NA==","repeats":1},{"count":3100000,"lower_bound":"MzEzNDY1Mw==","upper_bound":"MzEzOTE0NQ==","repeats":1},{"count":3120000,"lower_bound":"MzE0MzU4Ng==","upper_bound":"MzE2MzQyMQ==","repeats":1},{"count":3140000,"lower_bound":"MzE3MDI0OQ==","upper_bound":"MzE3Mjc4Nw==","repeats":1},{"count":3160000,"lower_bound":"MzE5ODA3Nw==","upper_bound":"MzIxMTYzNw==","repeats":1},{"count":3180000,"lower_bound":"MzIxMjk2Ng==","upper_bound":"MzIyMTIyNg==","repeats":1},{"count":3200000,"lower_bound":"MzIyMzYyOQ==","upper_bound":"MzIzNTYzMw==","repeats":1},{"count":3220000,"lower_bound":"MzIzNjcwNw==","upper_bound":"MzI0NTk5NQ==","repeats":1},{"count":3240000,"lower_bound":"MzI0Njg2Nw==","upper_bound":"MzI2OTU4OQ==","repeats":1},{"count":3260000,"lower_bound":"MzI3MjIxMg==","upper_bound":"MzI5NzI1NA==","repeats":1},{"count":3280000,"lower_bound":"MzMwNDA2MQ==","upper_bound":"MzMyODU1Mw==","repeats":1},{"count":3300000,"lower_bound":"MzMyODY1Mg==","upper_bound":"MzM3MjA1MQ==","repeats":1},{"count":3320000,"lower_bound":"MzM3NDQ5NQ==","upper_bound":"MzM3NjUwNg==","repeats":1},{"count":3340000,"lower_bound":"MzM4MDMwMw==","upper_bound":"MzM5MjIwNQ==","repeats":1},{"count":3360000,"lower_bound":"MzM5ODE4MA==","upper_bound":"MzQxNDYzOQ==","repeats":1},{"count":3380000,"lower_bound":"MzQxNjIyMQ==","upper_bound":"MzQ0MDg3Ng==","repeats":1},{"count":3400000,"lower_bound":"MzQ1MjA3Mg==","upper_bound":"MzQ2MjU5OA==","repeats":1},{"count":3420000,"lower_bound":"MzQ3NTQyMw==","upper_bound":"MzQ5NzAyMg==","repeats":1},{"count":3440000,"lower_bound":"MzQ5ODM3OA==","upper_bound":"MzUwNzU0MQ==","repeats":1},{"count":3460000,"lower_bound":"MzUwODgzNw==","upper_bound":"MzUyMjI2MA==","repeats":1},{"count":3480000,"lower_bound":"MzUzMzE0OQ==","upper_bound":"MzU0NTg2Mw==","repeats":1},{"count":3500000,"lower_bound":"MzU1NzY4NA==","upper_bound":"MzU3NjMyMg==","repeats":1},{"count":3520000,"lower_bound":"MzU4MDAwMA==","upper_bound":"MzU4NzMxNw==","repeats":1},{"count":3540000,"lower_bound":"MzU5ODQxNg==","upper_bound":"MzYwNzA0OQ==","repeats":1},{"count":3560000,"lower_bound":"MzYyNDIyMQ==","upper_bound":"MzY2OTkzMA==","repeats":1},{"count":3580000,"lower_bound":"MzY3NjgyMQ==","upper_bound":"MzY4ODc2Ng==","repeats":1},{"count":3600000,"lower_bound":"MzY4OTk5MA==","upper_bound":"MzcwNzA3Nw==","repeats":1},{"count":3620000,"lower_bound":"MzcwOTU5Mg==","upper_bound":"MzcyMjk4MA==","repeats":1},{"count":3640000,"lower_bound":"MzcyNDg4Nw==","upper_bound":"MzcyOTYwNA==","repeats":1},{"count":3660000,"lower_bound":"MzczMjUwNA==","upper_bound":"Mzc0MjIyOA==","repeats":1},{"count":3680000,"lower_bound":"Mzc0Mjc4NQ==","upper_bound":"Mzc0ODkyNA==","repeats":1},{"count":3700000,"lower_bound":"Mzc1NTMzMA==","upper_bound":"Mzc2NzEwNA==","repeats":1},{"count":3720000,"lower_bound":"Mzc3NjU2MA==","upper_bound":"MzgwMjg5MQ==","repeats":1},{"count":3740000,"lower_bound":"MzgxMzU1Mg==","upper_bound":"MzgzNDA2MQ==","repeats":1},{"count":3760000,"lower_bound":"Mzg0MTg5NQ==","upper_bound":"Mzg1NTIzNg==","repeats":1},{"count":3780000,"lower_bound":"Mzg3NDg0OA==","upper_bound":"Mzg4MDI3Ng==","repeats":1},{"count":3800000,"lower_bound":"Mzg4MDM0OQ==","upper_bound":"Mzg5NzI2OA==","repeats":1},{"count":3820000,"lower_bound":"MzkwNTkzMQ==","upper_bound":"MzkxNTcxOQ==","repeats":1},{"count":3840000,"lower_bound":"MzkyMDUwMw==","upper_bound":"Mzk1MTMxNg==","repeats":1},{"count":3860000,"lower_bound":"Mzk1MjU2Ng==","upper_bound":"Mzk2MjM2OQ==","repeats":1},{"count":3880000,"lower_bound":"Mzk2MzI0OQ==","upper_bound":"Mzk4NjcyNA==","repeats":1},{"count":3900000,"lower_bound":"Mzk5MjA4Mw==","upper_bound":"NDAxMzU3Ng==","repeats":1},{"count":3920000,"lower_bound":"NDAyMTQ2OA==","upper_bound":"NDAzMTg4Mw==","repeats":1},{"count":3940000,"lower_bound":"NDAzNzM2Mw==","upper_bound":"NDA0ODkzMw==","repeats":1},{"count":3960000,"lower_bound":"NDA1MTg5OQ==","upper_bound":"NDA2NTExNg==","repeats":1},{"count":3980000,"lower_bound":"NDA3MjI4OQ==","upper_bound":"NDA5MDkxMA==","repeats":1},{"count":4000000,"lower_bound":"NDA5NDA2Mg==","upper_bound":"NDExOTA2Mw==","repeats":1},{"count":4020000,"lower_bound":"NDEyNDQ4Nw==","upper_bound":"NDEyOTExNA==","repeats":1},{"count":4040000,"lower_bound":"NDEzMjc2MQ==","upper_bound":"NDEzODEyNA==","repeats":1},{"count":4060000,"lower_bound":"NDE0NTI3OQ==","upper_bound":"NDE1MzEyMw==","repeats":1},{"count":4080000,"lower_bound":"NDE2MjIyNg==","upper_bound":"NDE2OTc3Mw==","repeats":1},{"count":4100000,"lower_bound":"NDE3NzMwNQ==","upper_bound":"NDE5MTQxMA==","repeats":1},{"count":4120000,"lower_bound":"NDE5NDQ3Ng==","upper_bound":"NDIwNzU0Mw==","repeats":1},{"count":4140000,"lower_bound":"NDIxNDAxNA==","upper_bound":"NDIyOTA0Mw==","repeats":1},{"count":4160000,"lower_bound":"NDI0NTY5Mg==","upper_bound":"NDI2NjI2NA==","repeats":1},{"count":4180000,"lower_bound":"NDI3MTAyMw==","upper_bound":"NDI4MTUwMg==","repeats":1},{"count":4200000,"lower_bound":"NDI4MjUxNw==","upper_bound":"NDMwNzg1OA==","repeats":1},{"count":4220000,"lower_bound":"NDMxMTk2Nw==","upper_bound":"NDMyNzEzNQ==","repeats":1},{"count":4240000,"lower_bound":"NDMyNzM1NA==","upper_bound":"NDMzNjQ5Ng==","repeats":1},{"count":4260000,"lower_bound":"NDMzOTY2MQ==","upper_bound":"NDM0NTUxMw==","repeats":1},{"count":4280000,"lower_bound":"NDM0OTExMg==","upper_bound":"NDM1Mjc5Ng==","repeats":1},{"count":4300000,"lower_bound":"NDM1NjkxOA==","upper_bound":"NDM2NzAxNA==","repeats":1},{"count":4320000,"lower_bound":"NDM2ODA4NQ==","upper_bound":"NDQwMzg5OQ==","repeats":1},{"count":4340000,"lower_bound":"NDQwNjk5NQ==","upper_bound":"NDQyMjUyMw==","repeats":1},{"count":4360000,"lower_bound":"NDQyNjU0Mg==","upper_bound":"NDQ0MDY0MQ==","repeats":1},{"count":4380000,"lower_bound":"NDQ0MzYxMQ==","upper_bound":"NDQ2NDk5MQ==","repeats":1},{"count":4400000,"lower_bound":"NDQ2NTk1OA==","upper_bound":"NDQ3OTg5Mw==","repeats":1},{"count":4420000,"lower_bound":"NDQ5MjY0NQ==","upper_bound":"NDQ5OTQ1Mg==","repeats":1},{"count":4440000,"lower_bound":"NDUwMTMwNg==","upper_bound":"NDUwOTE4Ng==","repeats":1},{"count":4460000,"lower_bound":"NDUwOTk3OQ==","upper_bound":"NDUyNDIxNA==","repeats":1},{"count":4480000,"lower_bound":"NDUyOTk0Mw==","upper_bound":"NDU0ODc5OQ==","repeats":1},{"count":4500000,"lower_bound":"NDU0OTAwMA==","upper_bound":"NDU1NTg0NA==","repeats":1},{"count":4520000,"lower_bound":"NDU2MTIwNQ==","upper_bound":"NDU3NDc4Mg==","repeats":1},{"count":4540000,"lower_bound":"NDU4MTgxMQ==","upper_bound":"NDU5NzQxMA==","repeats":1},{"count":4560000,"lower_bound":"NDU5NzcwOQ==","upper_bound":"NDYwOTkzMw==","repeats":1},{"count":4580000,"lower_bound":"NDYxNTc2Mw==","upper_bound":"NDYyNDA4Mw==","repeats":1},{"count":4600000,"lower_bound":"NDYyNjM1MA==","upper_bound":"NDYzNTcwNQ==","repeats":1},{"count":4620000,"lower_bound":"NDY0NTcwOQ==","upper_bound":"NDY3MTk2OQ==","repeats":1},{"count":4640000,"lower_bound":"NDY3ODE0Mg==","upper_bound":"NDY5MzAwNw==","repeats":1},{"count":4660000,"lower_bound":"NDY5NDM5NA==","upper_bound":"NDcwNjE3OQ==","repeats":1},{"count":4680000,"lower_bound":"NDcwNjg1NQ==","upper_bound":"NDcxOTc2OQ==","repeats":1},{"count":4700000,"lower_bound":"NDcyMDA2NA==","upper_bound":"NDcyOTg3OA==","repeats":1},{"count":4720000,"lower_bound":"NDczMDMzNA==","upper_bound":"NDc0NjgyOQ==","repeats":1},{"count":4740000,"lower_bound":"NDc0OTMwMg==","upper_bound":"NDc1NTM2OQ==","repeats":1},{"count":4760000,"lower_bound":"NDc2NDQyMg==","upper_bound":"NDc3NjM0OA==","repeats":1},{"count":4780000,"lower_bound":"NDc4MzEzNg==","upper_bound":"NDc4ODk1MA==","repeats":1},{"count":4800000,"lower_bound":"NDc5MDIzNQ==","upper_bound":"NDgwNTU2NA==","repeats":1},{"count":4820000,"lower_bound":"NDgxMDQ0MQ==","upper_bound":"NDgxOTY2NQ==","repeats":1},{"count":4840000,"lower_bound":"NDgyOTQ0OA==","upper_bound":"NDgzODQ0Nw==","repeats":1},{"count":4860000,"lower_bound":"NDgzODY3Mw==","upper_bound":"NDg0ODM5Nw==","repeats":1},{"count":4880000,"lower_bound":"NDg2MTk4MQ==","upper_bound":"NDg4NjAzNQ==","repeats":1},{"count":4900000,"lower_bound":"NDg5MjQ5MQ==","upper_bound":"NDkwNzc1Mw==","repeats":1},{"count":4920000,"lower_bound":"NDkxMjExNA==","upper_bound":"NDkxNjk3NQ==","repeats":1},{"count":4940000,"lower_bound":"NDkxNzI1Mw==","upper_bound":"NDkzNTAwNQ==","repeats":1},{"count":4960000,"lower_bound":"NDk1NDI1OA==","upper_bound":"NDk3MDgzNQ==","repeats":1},{"count":4980000,"lower_bound":"NDk3MjE1Ng==","upper_bound":"NDk4Mzg2Mw==","repeats":1},{"count":5000000,"lower_bound":"NDk4NDQ3OQ==","upper_bound":"NDk5NjcwOQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2436,2365,2430,2467,2446,2389,2522,2479,2454,2437,2447,2454,2486,2371,2370,2509,2469,2437,2484,2395,2489,2484,2410,2511,2439,2363,2475,2387,2444,2486,2396,2442,2374,2448,2438,2385,2402,2483,2439,2483,2496,2395,2489,2449,2331,2409,2440,2399,2347,2451,2502,2344,2443,2461,2367,2286,2492,2403,2425,2445,2416,2497,2425,2386,2412,2418,2421,2435,2466,2377,2291,2437,2452,2520,2497,2490,2506,2417,2373,2335,2438,2450,2485,2452,2445,2505,2427,2449,2419,2494,2403,2336,2485,2487,2464,2402,2482,2406,2511,2430,2462,2417,2432,2387,2440,2446,2496,2441,2371,2496,2327,2439,2467,2385,2410,2508,2411,2436,2493,2475,2412,2398,2464,2439,2441,2475,2458,2415,2400,2464,2398,2546,2420,2475,2473,2483,2571,2424,2472,2439,2420,2409,2443,2470,2432,2350,2326,2437,2419,2414,2444,2485,2458,2364,2487,2453,2405,2702,2413,2447,2484,2503,2345,2416,2402,2441,2502,2388,2465,2422,2408,2412,2469,2393,2526,2466,2517,2486,2514,2433,2434,2461,2431,2463,2344,2423,2377,2404,2432,2395,2513,2474,2503,2411,2437,2474,2420,2371,2418,2362,2470,2475,2402,2538,2370,2505,2463,2464,2457,2442,2409,2480,2494,2503,2419,2468,2365,2430,2404,2386,2528,2441,2484,2465,2375,2521,2484,2446,2453,2512,2516,2467,2441,2531,2469,2363,2489,2425,2413,2502,2433,2399,2354,2461,2439,2462,2413,2466,2415,2439,2424,2533,2471,2350,2430,2356,2480,2480,2449,2432,2445,2517,2363,2422,2459,2405,2521,2382,2442,2487,2445,2405,2375,2476,2434,2499,2437,2434,2472,2353,2438,2600,2369,2475,2437,2385,2411,2386,2387,2409,2425,2428,2371,2469,2387,2449,2436,2459,2391,2389,2328,2419,2473,2383,2493,2375,2504,2449,2479,2463,2452,2357,2363,2599,2433,2439,2440,2444,2455,2377,2436,2437,2435,2400,2368,2370,2394,2394,2432,2436,2387,2454,2499,2408,2350,2328,2355,2410,2338,2519,2453,2436,2422,2421,2412,2439,2429,2425,2394,2353,2459,2433,2395,2504,2408,2477,2424,2497,2516,2531,2353,2388,2339,2439,2413,2390,2451,2435,2458,2440,2437,2442,2443,2367,2416,2434,2352,2474,2435,2525,2475,2386,2423,2457,2532,2408,2395,2432,2382,2425,2447,2371,2404,2382,2366,2454,2485,2376,2309,2409,2466,2448,2449,2425,2457,2425,2422,2436,2399,2282,2438,2440,2452,2448,2352,2374,2502,2433,2443,2590,2380,2377,2429,2447,2484,2437,2390,2378,2430,2466,2382,2422,2431,2450,2493,2385,2416,2572,2335,2440,2438,2377,2471,2462,2406,2392,2430,2453,2449,2480,2406,2394,2391,2447,2359,2489,2493,2512,2375,2447,2379,2543,2488,2431,2358,2432,2453,2404,2528,2453,2357,2473,2436,2496,2379,2431,2451,2448,2430,2406,2436,2431,2439,2408,2425,2430,2444,2450,2440,2462,2395,2403,2451,2436,2448,2359,2443,2482,2528,2337,2449,2397,2546,2465,2437,2469,2457,2385,2406,2324,2485,2423,2395,2473,2406,2418,2466,2366,2461,2461,2462,2460,2392,2434,2481,2469,2399,2473,2532,2488,2436,2343,2559,2396,2548,2434,2402,2390,2436,2455,2390,2380,2502,2387,2475,2412,2392,2404,2473,2585,2435,2405,2356,2471,2430,2401,2479,2392,2396,2375,2383,2483,2477,2430,2471,2410,2458,2447,2470,2480,2454,2379,2410,2421,2394,2415,2367,2428,2524,2436,2399,2467,2450,2512,2479,2424,2415,2467,2362,2515,2477,2327,2439,2557,2441,2470,2466,2420,2455,2400,2414,2466,2437,2511,2531,2429,2541,2409,2409,2437,2406,2474,2504,2439,2431,2482,2425,2444,2427,2440,2435,2433,2394,2470,2432,2440,2313,2464,2417,2374,2392,2441,2467,2444,2426,2501,2441,2486,2376,2500,2388,2410,2429,2391,2368,2437,2397,2432,2415,2456,2425,2438,2388,2435,2465,2440,2431,2437,2418,2493,2472,2417,2316,2416,2515,2467,2412,2425,2471,2448,2405,2383,2463,2421,2424,2283,2462,2564,2482,2339,2417,2405,2386,2287,2379,2402,2439,2450,2442,2390,2388,2418,2466,2445,2475,2510,2456,2431,2451,2395,2439,2356,2383,2434,2508,2484,2447,2454,2451,2440,2452,2456,2482,2426,2417,2441,2385,2411,2473,2354,2417,2499,2390,2344,2437,2469,2478,2555,2478,2364,2409,2357,2471,2366,2435,2397,2388,2511,2465,2397,2393,2443,2410,2478,2416,2339,2439,2424,2464,2438,2427,2392,2377,2389,2438,2440,2476,2431,2364,2448,2421,2405,2408,2382,2351,2490,2474,2414,2373,2463,2438,2378,2388,2486,2422,2503,2469,2437,2351,2390,2512,2398,2390,2429,2483,2425,2410,2410,2501,2580,2410,2439,2458,2563,2450,2491,2470,2387,2616,2466,2480,2436,2406,2503,2358,2548,2464,2483,2427,2402,2452,2546,2438,2380,2389,2441,2290,2491,2389,2509,2378,2415,2401,2494,2400,2383,2412,2362,2453,2436,2509,2413,2371,2445,2456,2487,2443,2456,2411,2407,2477,2557,2421,2449,2353,2509,2382,2474,2470,2371,2476,2429,2472,2383,2430,2572,2432,2372,2426,2442,2466,2415,2416,2376,2473,2450,2418,2438,2443,2432,2472,2415,2541,2492,2476,2488,2416,2398,2445,2405,2438,2440,2365,2413,2352,2414,2435,2330,2445,2345,2411,2401,2483,2408,2451,2350,2428,2424,2461,2504,2436,2509,2404,2438,2377,2468,2569,2442,2386,2463,2408,2536,2468,2433,2405,2448,2427,2534,2392,2530,2410,2497,2442,2405,2423,2392,2475,2430,2425,2496,2380,2413,2535,2438,2478,2484,2469,2373,2375,2397,2470,2443,2448,2498,2475,2368,2438,2391,2359,2478,2411,2452,2459,2475,2415,2473,2448,2421,2423,2450,2426,2408,2433,2524,2429,2440,2436,2455,2444,2411,2457,2431,2442,2359,2491,2455,2495,2415,2491,2431,2379,2414,2395,2433,2454,2336,2469,2474,2407,2445,2273,2471,2461,2497,2379,2505,2415,2476,2426,2366,2483,2396,2453,2502,2437,2440,2495,2395,2479,2291,2373,2383,2495,2452,2414,2392,2434,2461,2560,2402,2462,2392,2349,2378,2452,2405,2325,2498,2481,2420,2425,2455,2399,2462,2477,2435,2461,2403,2431,2549,2434,2439,2445,2437,2436,2400,2358,2479,2436,2429,2415,2434,2469,2401,2374,2508,2445,2500,2476,2344,2462,2385,2440,2493,2415,2448,2457,2541,2409,2462,2508,2392,2431,2403,2436,2426,2464,2450,2428,2396,2441,2379,2468,2407,2502,2436,2430,2424,2394,2445,2399,2405,2441,2389,2322,2415,2425,2524,2438,2370,2438,2444,2420,2467,2421,2438,2403,2434,2449,2382,2346,2437,2391,2362,2469,2487,2410,2462,2357,2439,2551,2477,2488,2442,2429,2497,2443,2497,2485,2398,2411,2440,2443,2466,2428,2415,2372,2364,2407,2505,2419,2509,2452,2452,2510,2450,2379,2339,2494,2368,2400,2397,2493,2434,2478,2379,2436,2411,2453,2468,2365,2436,2481,2415,2490,2412,2479,2345,2441,2455,2376,2439,2550,2419,2475,2471,2606,2429,2472,2460,2533,2448,2454,2362,2426,2499,2406,2534,2395,2484,2373,2392,2431,2516,2481,2417,2398,2468,2446,2462,2452,2517,2439,2417,2430,2397,2427,2469,2419,2442,2557,2450,2358,2441,2417,2504,2421,2437,2427,2542,2440,2436,2419,2439,2512,2445,2454,2406,2379,2489,2390,2534,2411,2416,2451,2417,2437,2517,2409,2395,2411,2430,2430,2368,2412,2417,2381,2454,2414,2460,2392,2542,2395,2497,2374,2337,2491,2418,2472,2531,2399,2475,2420,2440,2432,2410,2437,2439,2420,2439,2351,2362,2450,2560,2466,2448,2517,2476,2421,2473,2419,2468,2430,2457,2444,2418,2436,2440,2400,2391,2522,2535,2491,2445,2443,2387,2377,2356,2356,2462,2470,2387,2399,2472,2521,2447,2372,2457,2404,2461,2406,2436,2388,2356,2519,2296,2367,2348,2369,2443,2405,2366,2462,2290,2465,2394,2427,2455,2369,2495,2466,2477,2451,2397,2334,2534,2485,2373,2435,2479,2341,2480,2388,2457,2410,2426,2457,2409,2448,2423,2414,2449,2397,2392,2448,2470,2475,2485,2436,2438,2498,2356,2472,2405,2382,2552,2438,2575,2433,2437,2436,2471,2378,2466,2392,2432,2409,2394,2404,2452,2495,2433,2404,2460,2389,2434,2424,2432,2470,2406,2462,2458,2607,2330,2458,2506,2369,2401,2455,2426,2381,2437,2483,2448,2474,2398,2443,2443,2361,2487,2426,2487,2459,2474,2409,2415,2315,2394,2487,2366,2336,2458,2412,2439,2359,2435,2451,2410,2442,2423,2434,2478,2427,2367,2356,2478,2352,2423,2412,2426,2438,2439,2452,2480,2497,2330,2464,2471,2486,2462,2404,2455,2511,2451,2553,2428,2422,2478,2416,2417,2494,2465,2456,2391,2354,2464,2448,2465,2483,2492,2387,2458,2455,2470,2550,2423,2439,2462,2404,2437,2389,2439,2422,2489,2389,2443,2468,2445,2446,2319,2426,2450,2525,2498,2521,2411,2408,2481,2453,2432,2367,2475,2381,2471,2455,2385,2404,2369,2451,2411,2489,2398,2414,2343,2289,2422,2492,2415,2397,2432,2415,2430,2425,2374,2479,2452,2424,2504,2477,2402,2489,2439,2414,2388,2512,2480,2494,2487,2434,2493,2428,2449,2435,2488,2435,2443,2447,2439,2535,2438,2501,2317,2358,2493,2420,2394,2376,2432,2388,2446,2442,2492,2448,2462,2480,2509,2437,2422,2419,2507,2363,2361,2479,2450,2496,2389,2402,2426,2440,2401,2405,2415,2380,2439,2471,2479,2416,2428,2396,2490,2490,2519,2470,2442,2452,2458,2492,2473,2447,2683,2460,2414,2473,2403,2471,2456,2473,2425,2413,2358,2470,2337,2433,2354,2440,2447,2533,2426,2460,2415,2418,2461,2458,2475,2395,2366,2369,2536,2478,2438,2472,2484,2369,2464,2434,2500,2354,2505,2373,2438,2396,2496,2440,2482,2491,2374,2422,2408,2325,2471,2410,2497,2484,2326,2524,2371,2478,2381,2437,2403,2415,2392,2384,2448,2371,2517,2381,2416,2372,2411,2384,2439,2440,2394,2393,2512,2359,2464,2443,2475,2394,2441,2425,2404,2461,2403,2356,2417,2493,2370,2510,2461,2524,2488,2357,2556,2453,2439,2476,2425,2420,2463,2440,2517,2443,2404,2438,2419,2450,2395,2409,2463,2414,2413,2339,2419,2502,2357,2429,2471,2361,2369,2465,2395,2481,2449,2404,2437,2436,2444,2437,2460,2419,2425,2485,2439,2461,2371,2326,2416,2388,2390,2439,2424,2421,2409,2419,2412,2469,2394,2519,2464,2463,2393,2346,2446,2452,2401,2439,2426,2471,2458,2430,2482,2413,2409,2450,2438,2469,2410,2450,2535,2490,2393,2411,2478,2415,2403,2437,2399,2494,2430,2524,2364,2401,2483,2438,2445,2453,2437,2424,2503,2395,2415,2442,2374,2404,2443,2440,2424,2364,2416,2436,2424,2418,2420,2484,2489,2484,2412,2415,2454,2423,2405,2469,2570,2469,2418,2442,2400,2441,2487,2465,2397,2436,2405,2413,2391,2396,2346,2430,2465,2404,2439,2424,2406,2312,2512,2399,2460,2460,2487,2508,2446,2354,2449,2402,2439,2502,2385,2458,2420,2327,2459,2512,2451,2338,2468,2504,2437,2435,2442,2552,2356,2438,2482,2438,2503,2421,2462,2379,2420,2454,2448,2435,2385,2369,2370,2436,2374,2424,2440,2397,2440,2482,2399,2455,2345,2493,2501,2435,2449,2440,2317,2416,2433,2469,2488,2425,2408,2468,2457,2488,2436,2455,2412,2432,2555,2425,2394,2481,2497,2495,2488,2424,2478,2361,2398,2400,2446,2424,2437,2448,2412,2444,2519,2444,2489,2495,2486,2482,2444,2506,2521,2408,2488,2483,2462,2442,2274,2412,2479,2490,2460,2379,2465,2497,2555,2388,2451,2544,2510,2457,2414,2446,2334,2518,2389,2346,2490,2487,2437,2463,2363,2487,2422,2467,2461,2421,2495,2356,2383,2413,2440,2464,2412,2437,2436,2474,2463,2438,2351,2462,2485,2435,2495,2417,2456,2383,2495,2483,2464,2386,2438,2522,2382,2480,2445,2490,2449,2363,2412,2525,2367,2466,2424,2534,2440,2405,2459,2365,2500,2366,2386,2496,2436,2436,2545,2386,2442,2500,2488,2416,2513,2394,2431,2438,2255,2469,2403,2493,2451,2453,2437,2416,2436,2393,2391,2497,2457,2430,2432,2494,2484,2370,2503,2371,2412]},{"counters":[2452,2350,2411,2365,2376,2445,2421,2418,2416,2453,2427,2437,2426,2347,2468,2439,2407,2452,2434,2383,2422,2460,2438,2403,2473,2366,2425,2503,2439,2466,2494,2397,2390,2461,2342,2503,2432,2439,2419,2360,2456,2481,2445,2437,2392,2413,2440,2426,2327,2424,2385,2361,2461,2431,2415,2370,2495,2438,2454,2485,2437,2403,2426,2350,2439,2472,2481,2455,2296,2333,2481,2410,2418,2456,2444,2542,2495,2525,2502,2436,2401,2508,2447,2380,2436,2415,2466,2436,2476,2311,2467,2543,2419,2455,2388,2434,2468,2350,2366,2425,2479,2364,2441,2459,2416,2439,2432,2530,2403,2480,2497,2349,2441,2356,2449,2378,2407,2458,2506,2460,2453,2415,2456,2366,2491,2505,2486,2355,2437,2429,2392,2417,2449,2437,2423,2436,2402,2372,2351,2425,2449,2394,2388,2458,2501,2407,2423,2504,2385,2421,2503,2562,2460,2412,2389,2391,2399,2381,2389,2409,2440,2440,2420,2404,2412,2515,2424,2435,2499,2479,2522,2521,2403,2412,2504,2436,2464,2466,2411,2443,2515,2475,2388,2400,2480,2519,2453,2360,2501,2372,2488,2462,2443,2404,2376,2417,2434,2512,2413,2446,2478,2418,2544,2413,2439,2440,2374,2388,2493,2479,2349,2349,2449,2542,2439,2440,2358,2437,2493,2588,2399,2419,2392,2455,2441,2448,2546,2461,2415,2454,2424,2404,2356,2420,2390,2376,2418,2452,2470,2516,2474,2360,2310,2495,2492,2441,2449,2466,2454,2548,2527,2341,2477,2378,2425,2430,2446,2404,2368,2497,2464,2447,2409,2454,2478,2426,2478,2337,2436,2371,2430,2473,2505,2444,2443,2589,2438,2441,2483,2545,2394,2452,2627,2389,2427,2485,2520,2336,2392,2424,2448,2405,2366,2442,2458,2474,2462,2428,2375,2409,2433,2485,2454,2480,2406,2404,2433,2437,2397,2370,2498,2510,2296,2449,2368,2459,2445,2389,2492,2440,2556,2374,2406,2479,2427,2435,2423,2352,2438,2515,2476,2440,2420,2468,2323,2424,2401,2417,2412,2436,2436,2482,2449,2429,2451,2478,2494,2438,2466,2462,2389,2476,2407,2371,2440,2438,2340,2478,2481,2469,2439,2481,2410,2462,2438,2424,2427,2442,2483,2451,2455,2478,2390,2441,2438,2465,2485,2437,2410,2380,2345,2551,2387,2383,2506,2431,2408,2474,2518,2421,2381,2539,2464,2420,2415,2356,2397,2336,2458,2443,2433,2521,2485,2408,2472,2358,2433,2321,2505,2428,2448,2442,2335,2486,2389,2438,2417,2456,2361,2436,2414,2532,2402,2455,2408,2428,2421,2378,2384,2402,2436,2386,2432,2369,2423,2394,2471,2452,2383,2370,2285,2477,2509,2458,2441,2445,2426,2407,2449,2405,2468,2485,2394,2395,2447,2436,2414,2436,2498,2437,2465,2446,2437,2429,2313,2470,2459,2465,2438,2447,2525,2439,2391,2420,2392,2459,2373,2403,2513,2492,2445,2445,2442,2462,2413,2436,2497,2432,2371,2392,2468,2446,2433,2506,2437,2441,2438,2368,2386,2425,2389,2321,2399,2529,2353,2453,2449,2525,2426,2445,2347,2419,2512,2450,2429,2504,2356,2438,2310,2429,2385,2411,2470,2461,2396,2479,2356,2342,2421,2503,2439,2458,2422,2439,2437,2417,2448,2447,2448,2527,2412,2406,2445,2416,2442,2437,2419,2417,2436,2485,2380,2456,2355,2419,2438,2418,2471,2425,2521,2486,2347,2415,2461,2432,2447,2379,2440,2441,2378,2483,2440,2343,2388,2461,2418,2378,2374,2477,2467,2403,2408,2570,2437,2368,2342,2439,2487,2469,2483,2438,2446,2401,2464,2419,2486,2453,2482,2408,2423,2426,2443,2467,2471,2539,2466,2499,2415,2476,2340,2328,2453,2469,2416,2420,2436,2447,2360,2451,2437,2465,2495,2520,2418,2488,2359,2470,2440,2471,2388,2414,2416,2441,2376,2426,2403,2442,2418,2366,2353,2471,2442,2431,2471,2538,2442,2438,2428,2429,2401,2425,2381,2433,2391,2372,2429,2382,2477,2352,2392,2475,2406,2448,2456,2437,2433,2392,2518,2504,2514,2465,2433,2506,2432,2438,2469,2451,2394,2483,2358,2515,2455,2382,2482,2400,2445,2401,2502,2441,2522,2413,2436,2380,2504,2446,2431,2463,2394,2448,2438,2338,2447,2438,2367,2535,2410,2438,2484,2476,2393,2454,2439,2399,2455,2461,2397,2408,2436,2337,2511,2557,2495,2391,2423,2422,2415,2437,2496,2544,2464,2429,2559,2385,2431,2468,2493,2383,2387,2388,2509,2476,2481,2439,2429,2327,2440,2336,2457,2410,2382,2427,2477,2485,2412,2494,2394,2439,2431,2434,2476,2411,2467,2469,2445,2437,2414,2405,2367,2501,2400,2535,2482,2436,2417,2388,2395,2462,2363,2475,2493,2401,2538,2490,2411,2382,2421,2461,2438,2389,2424,2381,2436,2470,2450,2406,2475,2441,2439,2447,2470,2379,2534,2422,2365,2421,2430,2498,2380,2478,2428,2513,2480,2489,2432,2506,2418,2439,2425,2392,2438,2478,2423,2446,2445,2454,2438,2509,2496,2504,2423,2465,2394,2466,2438,2438,2261,2446,2512,2396,2414,2443,2394,2423,2510,2462,2437,2513,2440,2430,2555,2397,2397,2460,2416,2335,2481,2437,2442,2540,2477,2421,2399,2384,2391,2536,2390,2429,2492,2466,2391,2442,2420,2413,2471,2425,2494,2320,2366,2436,2430,2437,2518,2400,2501,2471,2355,2437,2536,2454,2410,2443,2419,2437,2349,2456,2475,2437,2449,2426,2355,2483,2488,2419,2398,2387,2425,2428,2356,2440,2426,2446,2416,2504,2467,2431,2534,2459,2521,2437,2475,2367,2386,2466,2441,2445,2468,2474,2403,2435,2475,2336,2466,2443,2482,2386,2372,2515,2405,2546,2560,2507,2501,2358,2466,2499,2445,2431,2322,2433,2462,2420,2363,2480,2359,2475,2429,2518,2465,2420,2398,2504,2540,2420,2475,2533,2415,2491,2436,2416,2519,2480,2421,2508,2445,2499,2483,2494,2426,2399,2462,2439,2311,2444,2439,2496,2497,2514,2508,2372,2456,2473,2461,2426,2440,2542,2437,2396,2414,2429,2313,2430,2367,2439,2429,2355,2437,2404,2467,2412,2369,2453,2480,2452,2390,2486,2424,2453,2416,2437,2421,2456,2420,2517,2388,2432,2460,2378,2492,2485,2396,2430,2432,2390,2411,2495,2461,2564,2349,2393,2442,2538,2359,2458,2504,2345,2419,2395,2545,2461,2389,2447,2405,2396,2497,2438,2532,2420,2498,2375,2402,2518,2367,2488,2494,2432,2398,2460,2538,2359,2439,2466,2489,2458,2478,2402,2437,2380,2428,2358,2363,2455,2430,2356,2528,2438,2429,2450,2435,2439,2450,2490,2331,2399,2386,2444,2398,2425,2478,2478,2458,2347,2538,2379,2473,2429,2408,2389,2449,2364,2457,2395,2414,2404,2451,2495,2447,2434,2420,2436,2432,2419,2382,2382,2423,2516,2400,2343,2534,2491,2489,2436,2494,2476,2433,2388,2511,2440,2477,2429,2460,2412,2459,2464,2395,2435,2415,2481,2453,2447,2408,2439,2486,2423,2459,2469,2424,2416,2478,2481,2448,2403,2412,2360,2369,2491,2377,2437,2417,2444,2353,2426,2483,2469,2384,2482,2375,2381,2457,2452,2417,2367,2543,2404,2462,2428,2427,2437,2407,2437,2397,2476,2440,2346,2439,2417,2380,2437,2482,2474,2439,2402,2400,2412,2453,2473,2482,2398,2438,2418,2465,2421,2395,2392,2420,2477,2350,2454,2398,2420,2371,2473,2549,2483,2497,2415,2491,2456,2515,2384,2504,2438,2424,2369,2499,2414,2459,2394,2335,2437,2390,2434,2426,2462,2471,2428,2515,2444,2414,2412,2350,2463,2427,2487,2443,2492,2531,2468,2377,2408,2412,2477,2322,2478,2475,2392,2326,2393,2542,2414,2403,2395,2331,2360,2282,2470,2415,2430,2455,2460,2489,2442,2459,2497,2456,2477,2404,2432,2419,2559,2371,2346,2422,2476,2446,2434,2529,2501,2456,2459,2437,2409,2466,2412,2467,2436,2483,2408,2432,2392,2426,2443,2459,2528,2413,2387,2375,2402,2495,2559,2498,2446,2509,2280,2445,2407,2415,2445,2483,2444,2447,2432,2417,2482,2415,2476,2494,2397,2406,2428,2455,2553,2436,2445,2453,2378,2479,2435,2543,2418,2440,2396,2437,2462,2396,2415,2405,2448,2442,2436,2431,2485,2456,2468,2443,2399,2408,2488,2358,2467,2421,2417,2405,2455,2398,2504,2398,2436,2562,2384,2416,2406,2417,2466,2467,2334,2474,2429,2444,2438,2469,2576,2374,2481,2494,2412,2356,2451,2368,2441,2480,2440,2424,2463,2365,2347,2437,2413,2439,2441,2397,2482,2459,2440,2495,2427,2409,2383,2393,2451,2454,2401,2469,2440,2477,2413,2535,2441,2391,2479,2464,2493,2540,2441,2388,2482,2494,2448,2439,2495,2362,2482,2456,2404,2411,2389,2454,2431,2380,2437,2414,2353,2439,2489,2406,2498,2421,2371,2434,2414,2342,2464,2457,2506,2501,2316,2538,2482,2366,2397,2491,2492,2424,2445,2378,2414,2436,2449,2441,2499,2438,2422,2395,2392,2409,2411,2458,2374,2443,2423,2445,2529,2496,2324,2402,2446,2384,2371,2479,2435,2475,2347,2472,2416,2436,2468,2387,2451,2390,2358,2460,2421,2430,2428,2467,2376,2502,2510,2394,2395,2463,2447,2409,2355,2484,2439,2501,2452,2383,2429,2400,2469,2503,2428,2460,2477,2497,2488,2454,2362,2438,2410,2463,2440,2407,2438,2475,2434,2419,2489,2514,2444,2441,2531,2416,2450,2381,2373,2417,2486,2434,2465,2527,2388,2453,2403,2414,2370,2430,2383,2404,2477,2439,2409,2425,2488,2440,2475,2356,2464,2471,2540,2379,2423,2439,2533,2392,2454,2493,2432,2436,2438,2457,2389,2453,2444,2427,2589,2499,2436,2439,2473,2376,2481,2439,2436,2358,2396,2429,2355,2418,2438,2326,2474,2364,2421,2411,2481,2411,2474,2398,2393,2436,2407,2446,2455,2448,2391,2448,2361,2463,2392,2486,2490,2477,2407,2421,2389,2418,2443,2422,2401,2424,2548,2393,2458,2480,2428,2427,2437,2446,2488,2344,2334,2457,2442,2434,2502,2440,2383,2441,2365,2522,2479,2501,2452,2392,2376,2402,2518,2381,2416,2382,2487,2515,2456,2397,2439,2442,2492,2474,2474,2468,2461,2409,2508,2455,2437,2374,2381,2448,2443,2403,2391,2437,2375,2398,2448,2334,2431,2470,2437,2362,2416,2421,2378,2467,2511,2438,2482,2402,2427,2422,2474,2460,2416,2410,2560,2488,2493,2434,2378,2425,2420,2442,2529,2401,2425,2408,2386,2474,2438,2424,2372,2333,2503,2346,2383,2442,2416,2498,2511,2460,2380,2399,2370,2412,2382,2400,2524,2502,2399,2526,2491,2460,2471,2410,2408,2447,2451,2404,2371,2349,2438,2380,2464,2364,2521,2430,2437,2420,2595,2388,2398,2451,2422,2445,2572,2453,2436,2495,2496,2501,2553,2438,2422,2495,2367,2447,2523,2431,2455,2419,2364,2483,2449,2440,2492,2467,2407,2442,2430,2450,2310,2416,2483,2437,2397,2428,2423,2271,2384,2419,2428,2441,2399,2320,2403,2479,2414,2438,2366,2454,2366,2427,2444,2417,2428,2439,2429,2533,2398,2363,2414,2385,2453,2503,2505,2395,2334,2417,2318,2458,2503,2489,2406,2499,2449,2430,2425,2502,2481,2427,2478,2513,2445,2472,2415,2442,2392,2454,2375,2415,2404,2516,2385,2440,2492,2467,2498,2531,2439,2384,2475,2312,2444,2374,2411,2459,2415,2389,2397,2316,2531,2413,2471,2428,2487,2422,2462,2467,2417,2390,2438,2441,2500,2514,2464,2352,2495,2453,2523,2356,2445,2477,2428,2396,2505,2437,2512,2499,2357,2435,2339,2483,2391,2461,2428,2432,2411,2437,2477,2348,2470,2331,2440,2477,2445,2464,2363,2572,2445,2396,2350,2368,2471,2400,2480,2435,2373,2381,2447,2456,2437,2474,2385,2456,2462,2381,2414,2462,2474,2438,2438,2476,2452,2449,2465,2462,2367,2478,2379,2531,2480,2370,2457,2374,2408,2466,2418,2349,2399,2433,2360,2417,2430,2485,2487,2434,2434,2403,2504,2437,2443,2399,2438,2446,2449,2304,2408,2389,2461,2428,2452,2453,2437,2452,2381,2416,2427,2367,2366,2319,2416,2490,2437,2436,2439,2411,2443,2439,2506,2531,2437,2447,2472,2370,2511,2457,2427,2492,2413,2423,2457,2483,2403,2446,2405,2381,2440,2470,2387,2425,2408,2477,2480,2396,2427,2441,2392,2391,2492,2434,2419,2469,2422,2482,2304,2512,2527]},{"counters":[2424,2427,2433,2432,2428,2579,2440,2396,2441,2471,2486,2387,2460,2479,2448,2437,2432,2365,2412,2350,2405,2426,2480,2433,2341,2438,2440,2446,2508,2345,2429,2419,2438,2415,2437,2445,2333,2417,2453,2446,2520,2510,2456,2428,2480,2376,2420,2429,2390,2407,2493,2509,2454,2435,2445,2454,2455,2437,2440,2490,2445,2431,2397,2492,2386,2403,2386,2468,2424,2456,2513,2423,2428,2455,2359,2423,2367,2452,2349,2508,2482,2389,2478,2438,2444,2408,2384,2430,2397,2433,2493,2401,2385,2404,2433,2438,2427,2434,2453,2416,2392,2430,2412,2447,2481,2482,2394,2395,2496,2415,2466,2422,2490,2348,2438,2446,2408,2358,2359,2443,2383,2411,2455,2482,2540,2427,2463,2412,2460,2386,2427,2392,2414,2436,2439,2505,2437,2477,2402,2445,2412,2412,2516,2372,2360,2491,2390,2469,2427,2459,2543,2405,2435,2500,2310,2495,2440,2495,2384,2483,2441,2423,2451,2393,2464,2437,2379,2478,2379,2351,2473,2400,2530,2480,2465,2411,2445,2381,2446,2449,2457,2428,2498,2472,2412,2511,2462,2436,2408,2444,2464,2454,2443,2423,2457,2513,2495,2464,2536,2440,2469,2510,2416,2451,2391,2456,2436,2398,2355,2512,2361,2472,2379,2437,2439,2467,2409,2508,2412,2500,2480,2456,2352,2393,2439,2436,2463,2429,2478,2391,2388,2369,2392,2474,2440,2486,2454,2471,2416,2423,2429,2454,2440,2418,2421,2442,2475,2451,2383,2423,2392,2566,2478,2469,2434,2464,2436,2473,2422,2464,2379,2501,2401,2474,2471,2534,2365,2516,2533,2483,2426,2402,2405,2454,2407,2489,2442,2417,2446,2439,2490,2466,2420,2405,2373,2374,2422,2394,2437,2420,2395,2481,2493,2481,2440,2412,2387,2466,2437,2485,2394,2394,2478,2448,2434,2498,2506,2437,2453,2439,2377,2468,2346,2347,2391,2369,2418,2437,2436,2382,2425,2414,2449,2402,2490,2336,2489,2413,2443,2448,2493,2390,2367,2434,2402,2431,2411,2410,2345,2506,2522,2450,2429,2407,2419,2469,2359,2375,2409,2352,2460,2471,2490,2342,2372,2439,2406,2382,2405,2427,2508,2419,2489,2507,2397,2578,2438,2371,2495,2400,2394,2473,2304,2416,2453,2433,2423,2357,2368,2343,2454,2379,2472,2468,2485,2413,2402,2487,2436,2406,2473,2530,2435,2405,2469,2492,2418,2440,2364,2395,2432,2543,2419,2371,2503,2478,2479,2448,2426,2369,2568,2441,2358,2436,2436,2370,2400,2462,2421,2337,2436,2475,2417,2332,2562,2484,2412,2398,2457,2421,2443,2428,2374,2393,2393,2406,2491,2429,2359,2412,2479,2527,2421,2487,2400,2452,2438,2433,2480,2456,2491,2414,2437,2320,2359,2395,2433,2557,2483,2322,2491,2503,2508,2411,2388,2434,2432,2429,2437,2494,2532,2438,2604,2411,2513,2492,2421,2496,2514,2519,2436,2379,2437,2423,2493,2445,2448,2378,2454,2431,2462,2438,2451,2511,2425,2406,2419,2387,2474,2421,2463,2369,2526,2419,2475,2448,2458,2438,2572,2531,2484,2491,2339,2497,2442,2426,2470,2483,2470,2415,2469,2439,2413,2381,2442,2481,2399,2417,2407,2417,2424,2448,2442,2437,2430,2438,2503,2535,2404,2479,2423,2436,2373,2399,2445,2486,2441,2472,2323,2550,2428,2440,2530,2413,2318,2428,2482,2467,2411,2444,2483,2437,2386,2426,2455,2408,2363,2415,2414,2451,2516,2406,2373,2542,2436,2365,2435,2447,2534,2493,2506,2431,2375,2401,2472,2441,2460,2443,2477,2386,2467,2429,2473,2457,2464,2437,2417,2426,2465,2395,2452,2526,2489,2420,2427,2467,2481,2522,2434,2448,2400,2389,2447,2437,2438,2356,2347,2400,2507,2381,2425,2525,2341,2460,2426,2469,2388,2421,2397,2429,2436,2497,2495,2392,2474,2450,2525,2439,2480,2306,2418,2363,2380,2406,2486,2435,2445,2516,2446,2365,2430,2439,2390,2424,2423,2429,2424,2519,2376,2469,2439,2332,2436,2399,2452,2443,2403,2357,2345,2379,2434,2466,2438,2512,2381,2438,2517,2479,2375,2414,2437,2445,2380,2380,2388,2416,2470,2441,2409,2410,2504,2456,2363,2507,2434,2351,2441,2467,2444,2521,2419,2386,2490,2465,2503,2392,2432,2386,2409,2424,2392,2455,2403,2446,2330,2500,2435,2376,2443,2459,2441,2453,2433,2442,2375,2469,2383,2403,2394,2419,2457,2426,2449,2452,2415,2377,2412,2385,2354,2417,2354,2454,2459,2491,2425,2432,2406,2496,2446,2494,2410,2461,2438,2467,2468,2476,2435,2469,2430,2481,2437,2301,2471,2451,2471,2449,2353,2461,2305,2462,2404,2380,2477,2399,2429,2337,2469,2396,2436,2418,2400,2370,2452,2412,2385,2401,2389,2519,2479,2490,2462,2489,2367,2434,2451,2470,2426,2436,2392,2433,2452,2454,2452,2471,2477,2416,2489,2491,2436,2482,2395,2486,2376,2354,2439,2479,2385,2424,2437,2506,2493,2362,2500,2430,2453,2445,2534,2509,2450,2475,2415,2460,2455,2512,2432,2474,2357,2368,2409,2407,2451,2429,2511,2408,2482,2406,2406,2470,2410,2438,2490,2431,2417,2439,2411,2485,2374,2482,2533,2454,2453,2465,2381,2382,2369,2468,2429,2459,2352,2504,2491,2441,2434,2440,2410,2399,2417,2442,2552,2340,2451,2456,2536,2436,2385,2433,2457,2501,2434,2381,2380,2390,2507,2437,2357,2583,2374,2432,2438,2497,2413,2488,2395,2371,2401,2367,2348,2488,2423,2371,2492,2456,2488,2466,2420,2418,2439,2356,2420,2404,2413,2554,2394,2415,2441,2422,2373,2486,2515,2370,2435,2481,2456,2478,2447,2466,2465,2401,2535,2443,2327,2346,2228,2478,2410,2363,2523,2449,2430,2453,2437,2419,2423,2409,2416,2456,2440,2416,2515,2359,2446,2548,2448,2485,2459,2468,2371,2423,2394,2421,2504,2439,2404,2441,2440,2395,2442,2474,2459,2415,2441,2489,2475,2349,2343,2445,2382,2441,2435,2429,2441,2447,2380,2401,2430,2393,2421,2467,2410,2518,2394,2399,2417,2439,2462,2451,2459,2413,2381,2413,2425,2443,2441,2406,2460,2505,2463,2520,2498,2429,2461,2388,2469,2442,2402,2454,2453,2432,2367,2468,2529,2538,2407,2483,2436,2458,2508,2467,2415,2473,2459,2473,2470,2383,2423,2408,2463,2437,2484,2499,2517,2429,2464,2452,2424,2304,2384,2481,2526,2425,2449,2418,2460,2473,2430,2454,2464,2485,2451,2387,2455,2409,2476,2348,2486,2402,2422,2444,2424,2430,2445,2346,2450,2419,2490,2452,2467,2509,2463,2426,2428,2486,2437,2419,2498,2509,2374,2348,2335,2413,2390,2400,2436,2482,2466,2376,2465,2472,2333,2448,2407,2422,2471,2474,2413,2396,2453,2514,2383,2443,2373,2397,2388,2466,2422,2443,2418,2460,2384,2411,2433,2429,2413,2429,2470,2418,2506,2481,2507,2369,2484,2364,2440,2512,2457,2457,2456,2439,2557,2474,2441,2389,2451,2439,2441,2440,2391,2434,2475,2459,2501,2436,2427,2454,2484,2435,2439,2460,2400,2407,2469,2507,2498,2407,2398,2450,2342,2389,2472,2450,2440,2429,2333,2403,2437,2472,2451,2525,2414,2440,2383,2458,2394,2495,2334,2453,2375,2469,2374,2366,2439,2536,2433,2440,2409,2401,2417,2518,2436,2441,2422,2481,2422,2449,2431,2477,2457,2410,2462,2454,2440,2434,2439,2425,2483,2467,2383,2392,2432,2444,2469,2411,2459,2400,2442,2419,2404,2432,2477,2551,2377,2389,2493,2348,2583,2428,2436,2436,2487,2469,2461,2422,2447,2385,2473,2479,2441,2440,2366,2436,2449,2447,2418,2467,2441,2428,2405,2408,2399,2461,2375,2447,2417,2527,2521,2362,2501,2439,2521,2464,2493,2421,2431,2401,2443,2465,2439,2405,2362,2516,2448,2451,2470,2405,2481,2409,2466,2443,2410,2389,2421,2388,2441,2494,2439,2432,2571,2398,2460,2437,2414,2346,2412,2428,2462,2406,2480,2491,2387,2401,2371,2477,2452,2454,2442,2423,2421,2429,2405,2392,2493,2428,2480,2403,2385,2430,2518,2403,2508,2439,2480,2445,2482,2339,2449,2446,2373,2439,2387,2432,2451,2405,2550,2475,2380,2410,2479,2403,2458,2414,2499,2413,2478,2387,2436,2429,2460,2437,2408,2413,2395,2526,2438,2406,2390,2415,2413,2445,2530,2434,2442,2474,2441,2544,2453,2438,2411,2441,2428,2433,2429,2494,2449,2372,2307,2391,2355,2416,2487,2382,2508,2346,2470,2376,2426,2398,2328,2414,2331,2454,2418,2389,2451,2350,2413,2487,2395,2465,2296,2412,2538,2471,2545,2425,2389,2439,2464,2514,2439,2517,2429,2439,2403,2545,2505,2505,2375,2439,2420,2458,2556,2470,2396,2386,2416,2473,2386,2467,2481,2486,2409,2440,2359,2434,2458,2493,2469,2439,2464,2440,2462,2412,2437,2534,2448,2370,2390,2501,2376,2431,2446,2380,2523,2322,2471,2478,2408,2455,2415,2438,2325,2449,2436,2485,2437,2445,2439,2482,2463,2465,2425,2354,2386,2467,2484,2445,2462,2414,2401,2436,2437,2379,2440,2457,2402,2350,2415,2510,2369,2377,2417,2440,2419,2448,2470,2402,2458,2459,2455,2421,2491,2449,2383,2458,2383,2434,2513,2403,2436,2407,2371,2452,2320,2459,2532,2481,2382,2552,2375,2409,2511,2458,2400,2450,2488,2471,2370,2362,2354,2368,2450,2470,2396,2406,2481,2404,2414,2436,2458,2438,2422,2509,2453,2518,2485,2481,2521,2482,2418,2420,2466,2450,2381,2501,2460,2561,2377,2417,2331,2458,2344,2461,2465,2482,2436,2424,2503,2379,2382,2447,2429,2394,2464,2459,2517,2387,2549,2432,2389,2354,2509,2416,2450,2490,2434,2497,2369,2514,2426,2476,2396,2450,2388,2451,2357,2440,2505,2458,2353,2397,2375,2465,2437,2475,2422,2475,2457,2394,2350,2541,2425,2454,2319,2441,2427,2347,2552,2442,2405,2427,2502,2461,2478,2482,2513,2464,2423,2410,2366,2438,2342,2376,2397,2318,2403,2473,2374,2454,2525,2441,2436,2462,2453,2415,2438,2400,2426,2492,2366,2411,2435,2463,2387,2395,2473,2437,2484,2460,2441,2429,2407,2352,2342,2334,2486,2434,2448,2458,2456,2443,2447,2441,2416,2427,2422,2419,2525,2524,2481,2441,2407,2424,2529,2473,2350,2456,2453,2408,2434,2438,2458,2417,2450,2438,2425,2420,2469,2427,2473,2420,2426,2428,2432,2414,2484,2533,2465,2454,2439,2459,2490,2375,2491,2469,2393,2494,2379,2401,2438,2401,2434,2382,2405,2443,2456,2393,2437,2446,2447,2439,2371,2530,2382,2456,2483,2423,2508,2465,2443,2385,2453,2490,2476,2498,2329,2488,2431,2415,2447,2444,2384,2442,2397,2419,2447,2409,2492,2422,2390,2471,2434,2469,2381,2520,2434,2419,2452,2478,2486,2339,2404,2440,2318,2436,2488,2380,2440,2382,2377,2447,2400,2459,2410,2377,2469,2403,2414,2364,2363,2415,2465,2414,2371,2473,2437,2536,2337,2432,2448,2441,2454,2413,2458,2476,2457,2432,2469,2512,2360,2441,2378,2457,2427,2454,2399,2372,2436,2494,2407,2387,2425,2372,2476,2521,2422,2420,2387,2459,2471,2448,2455,2492,2453,2509,2436,2478,2348,2425,2443,2425,2515,2417,2439,2439,2413,2455,2423,2403,2457,2443,2371,2399,2427,2437,2463,2472,2422,2460,2436,2521,2460,2455,2487,2466,2394,2405,2412,2507,2426,2389,2443,2470,2443,2432,2485,2532,2440,2483,2399,2398,2416,2437,2458,2449,2440,2390,2435,2398,2377,2369,2457,2346,2438,2435,2333,2530,2438,2468,2436,2420,2399,2403,2495,2475,2516,2437,2387,2467,2416,2372,2403,2336,2370,2392,2516,2403,2413,2480,2472,2442,2370,2427,2497,2465,2373,2504,2476,2513,2428,2385,2517,2440,2436,2469,2468,2458,2549,2434,2495,2439,2484,2431,2427,2439,2441,2395,2441,2414,2381,2437,2464,2358,2390,2408,2461,2381,2520,2401,2439,2494,2408,2418,2484,2389,2337,2407,2463,2476,2416,2420,2381,2440,2439,2423,2390,2399,2481,2548,2488,2374,2390,2384,2410,2352,2463,2338,2320,2426,2407,2463,2459,2440,2428,2379,2427,2393,2478,2437,2358,2528,2471,2434,2455,2362,2389,2391,2434,2445,2478,2458,2441,2411,2435,2433,2446,2404,2431,2453,2511,2413,2389,2426,2459,2396,2520,2421,2403,2476]},{"counters":[2389,2463,2324,2430,2437,2467,2438,2406,2399,2489,2473,2506,2480,2445,2424,2466,2461,2410,2492,2473,2503,2476,2422,2450,2475,2453,2572,2438,2419,2435,2353,2466,2406,2442,2509,2361,2434,2523,2332,2457,2381,2453,2411,2426,2448,2500,2546,2419,2319,2475,2360,2443,2436,2406,2342,2349,2510,2384,2433,2349,2390,2390,2365,2416,2381,2453,2430,2521,2346,2482,2420,2468,2453,2408,2386,2442,2412,2506,2394,2399,2416,2461,2447,2432,2459,2418,2394,2444,2353,2405,2388,2437,2489,2453,2412,2514,2404,2564,2481,2412,2430,2432,2437,2428,2437,2410,2480,2436,2520,2482,2402,2436,2407,2439,2439,2437,2497,2421,2347,2508,2477,2461,2390,2459,2332,2453,2560,2361,2413,2367,2346,2387,2445,2441,2487,2459,2457,2440,2424,2498,2436,2511,2445,2401,2404,2343,2473,2420,2465,2462,2383,2398,2418,2387,2352,2422,2408,2574,2413,2418,2424,2434,2436,2435,2358,2415,2394,2415,2474,2372,2462,2430,2324,2357,2412,2409,2405,2397,2397,2499,2448,2567,2440,2439,2430,2454,2403,2499,2374,2510,2379,2414,2359,2529,2424,2492,2461,2483,2458,2396,2406,2421,2455,2425,2431,2436,2402,2349,2446,2466,2520,2435,2476,2450,2416,2410,2384,2489,2361,2438,2364,2396,2457,2417,2472,2432,2518,2477,2449,2426,2445,2452,2360,2437,2442,2441,2431,2486,2436,2464,2489,2498,2417,2403,2569,2391,2476,2389,2418,2505,2342,2442,2463,2489,2336,2399,2439,2487,2460,2539,2453,2426,2437,2505,2366,2415,2383,2423,2464,2381,2312,2421,2398,2423,2493,2498,2506,2419,2417,2357,2439,2529,2463,2430,2397,2440,2550,2346,2385,2400,2475,2481,2411,2409,2476,2436,2379,2435,2412,2482,2369,2443,2364,2421,2463,2548,2507,2452,2382,2494,2368,2442,2315,2439,2439,2544,2440,2417,2516,2387,2474,2416,2413,2440,2516,2512,2464,2432,2430,2459,2387,2483,2394,2461,2439,2482,2392,2368,2437,2432,2550,2518,2504,2459,2454,2409,2479,2367,2410,2462,2440,2326,2407,2370,2402,2463,2450,2438,2480,2546,2441,2520,2461,2349,2336,2476,2430,2437,2488,2429,2383,2458,2402,2316,2371,2423,2354,2640,2393,2460,2389,2477,2457,2404,2451,2429,2461,2456,2283,2469,2389,2446,2401,2510,2529,2434,2411,2447,2399,2515,2467,2397,2476,2438,2483,2422,2380,2505,2446,2335,2398,2459,2386,2347,2437,2440,2426,2338,2466,2451,2506,2409,2468,2428,2426,2358,2402,2407,2546,2440,2437,2500,2385,2530,2505,2352,2409,2401,2396,2339,2412,2389,2322,2377,2382,2371,2499,2452,2434,2440,2415,2398,2420,2444,2490,2415,2406,2438,2428,2435,2462,2471,2491,2418,2535,2437,2432,2440,2499,2417,2477,2424,2426,2436,2427,2478,2484,2462,2400,2420,2419,2472,2487,2415,2409,2344,2423,2461,2448,2440,2437,2412,2484,2403,2400,2320,2431,2485,2461,2506,2366,2439,2409,2407,2408,2372,2480,2421,2363,2470,2482,2425,2400,2327,2464,2448,2427,2480,2437,2457,2441,2401,2519,2471,2438,2469,2468,2436,2510,2426,2454,2461,2426,2423,2474,2453,2431,2516,2429,2435,2413,2424,2439,2472,2510,2430,2352,2402,2445,2400,2472,2354,2406,2475,2388,2569,2466,2513,2493,2358,2435,2424,2425,2434,2436,2392,2389,2380,2470,2491,2472,2309,2456,2459,2507,2395,2442,2349,2433,2467,2437,2381,2471,2415,2418,2467,2347,2388,2488,2476,2435,2436,2469,2390,2437,2491,2469,2488,2444,2449,2428,2437,2372,2444,2395,2433,2414,2430,2385,2504,2378,2416,2448,2261,2504,2406,2463,2495,2454,2344,2439,2437,2401,2440,2444,2402,2384,2421,2398,2419,2425,2446,2475,2366,2474,2413,2400,2503,2374,2439,2494,2439,2375,2397,2545,2429,2289,2411,2499,2399,2431,2425,2458,2460,2442,2447,2388,2473,2430,2439,2399,2400,2376,2455,2392,2425,2443,2507,2432,2430,2381,2429,2461,2459,2389,2361,2467,2511,2500,2437,2431,2437,2452,2499,2460,2452,2458,2473,2358,2484,2460,2366,2432,2388,2510,2437,2518,2492,2471,2445,2406,2460,2428,2454,2431,2490,2439,2448,2428,2384,2373,2298,2479,2375,2470,2435,2408,2418,2492,2434,2450,2573,2408,2437,2436,2445,2521,2393,2359,2417,2529,2436,2433,2443,2446,2351,2488,2425,2445,2452,2468,2442,2289,2384,2441,2456,2512,2428,2501,2512,2415,2448,2448,2431,2264,2350,2535,2456,2458,2377,2464,2409,2461,2467,2432,2344,2382,2455,2547,2408,2398,2433,2481,2502,2449,2434,2427,2383,2430,2391,2492,2466,2532,2370,2433,2580,2408,2402,2339,2459,2446,2396,2467,2471,2350,2419,2419,2395,2387,2421,2500,2423,2318,2400,2466,2456,2395,2456,2499,2486,2392,2431,2485,2451,2456,2449,2518,2429,2429,2507,2500,2465,2483,2437,2461,2493,2425,2488,2436,2477,2395,2366,2450,2393,2507,2502,2433,2443,2476,2558,2437,2436,2434,2349,2428,2442,2395,2426,2465,2453,2418,2424,2471,2402,2438,2560,2478,2527,2472,2422,2475,2474,2521,2433,2348,2467,2509,2472,2418,2412,2440,2395,2475,2428,2471,2490,2497,2439,2430,2385,2406,2440,2438,2543,2496,2489,2376,2463,2407,2471,2446,2444,2402,2353,2477,2404,2401,2481,2483,2427,2390,2444,2439,2396,2450,2454,2442,2493,2451,2465,2393,2432,2415,2485,2410,2450,2514,2443,2428,2530,2512,2465,2461,2469,2398,2418,2384,2436,2440,2368,2348,2399,2438,2437,2474,2396,2405,2457,2348,2434,2432,2471,2467,2458,2381,2437,2497,2339,2421,2428,2441,2259,2509,2460,2451,2403,2387,2434,2487,2399,2439,2451,2430,2393,2414,2389,2490,2499,2434,2483,2442,2514,2424,2425,2384,2385,2369,2451,2437,2361,2472,2404,2408,2507,2429,2444,2415,2447,2467,2513,2438,2440,2505,2547,2462,2355,2440,2454,2444,2409,2475,2456,2477,2436,2380,2462,2412,2446,2474,2475,2410,2356,2417,2415,2313,2539,2498,2437,2530,2392,2469,2494,2426,2362,2384,2480,2452,2501,2442,2402,2366,2341,2363,2377,2533,2422,2473,2465,2446,2458,2434,2380,2451,2476,2363,2396,2421,2486,2417,2504,2423,2362,2406,2461,2444,2383,2421,2354,2476,2369,2386,2439,2457,2344,2521,2508,2394,2502,2393,2408,2403,2398,2524,2426,2444,2477,2473,2441,2425,2368,2439,2396,2560,2365,2448,2456,2460,2455,2474,2590,2412,2435,2521,2436,2371,2418,2444,2453,2473,2520,2417,2402,2436,2512,2441,2461,2439,2436,2440,2458,2381,2439,2421,2433,2450,2407,2451,2426,2457,2399,2380,2428,2395,2406,2400,2385,2437,2448,2466,2391,2436,2415,2482,2473,2436,2397,2387,2446,2460,2432,2554,2487,2401,2419,2437,2381,2360,2457,2386,2540,2371,2319,2428,2438,2514,2459,2413,2436,2450,2379,2405,2386,2404,2485,2478,2414,2482,2506,2453,2385,2392,2366,2397,2331,2372,2444,2488,2376,2388,2510,2391,2405,2383,2428,2455,2443,2462,2443,2364,2468,2393,2446,2482,2400,2501,2540,2437,2470,2386,2562,2414,2438,2581,2390,2453,2572,2423,2450,2438,2374,2399,2398,2433,2494,2404,2424,2433,2452,2501,2568,2400,2407,2421,2500,2471,2430,2411,2410,2423,2380,2428,2388,2403,2487,2417,2436,2456,2462,2435,2379,2480,2424,2505,2420,2423,2375,2442,2392,2429,2511,2515,2523,2373,2441,2385,2444,2444,2411,2421,2429,2424,2479,2415,2496,2483,2386,2408,2456,2439,2400,2508,2524,2440,2436,2346,2436,2447,2338,2450,2469,2439,2417,2425,2361,2489,2468,2437,2445,2464,2446,2412,2499,2421,2534,2410,2453,2419,2467,2453,2401,2326,2445,2483,2384,2462,2356,2397,2411,2468,2461,2417,2444,2401,2454,2417,2422,2458,2413,2362,2490,2436,2426,2507,2419,2487,2380,2482,2460,2436,2395,2439,2464,2428,2412,2445,2442,2359,2513,2411,2368,2414,2445,2332,2483,2315,2425,2462,2427,2413,2565,2538,2416,2409,2441,2394,2435,2471,2437,2483,2398,2500,2493,2406,2441,2425,2496,2444,2481,2437,2384,2440,2392,2425,2417,2357,2397,2487,2470,2380,2411,2424,2406,2458,2433,2488,2437,2412,2418,2386,2381,2440,2414,2428,2422,2407,2504,2465,2412,2548,2496,2436,2421,2392,2383,2370,2457,2434,2423,2477,2408,2473,2354,2427,2447,2424,2458,2397,2433,2453,2368,2448,2423,2437,2408,2459,2363,2385,2444,2408,2449,2491,2463,2404,2475,2424,2447,2411,2431,2402,2527,2437,2471,2433,2438,2406,2426,2427,2387,2512,2339,2400,2462,2505,2430,2474,2359,2486,2389,2502,2414,2373,2395,2434,2429,2438,2432,2430,2444,2453,2399,2458,2374,2457,2421,2394,2460,2379,2398,2415,2437,2436,2363,2363,2437,2467,2436,2443,2388,2485,2349,2477,2509,2385,2445,2377,2443,2523,2444,2412,2447,2475,2446,2437,2406,2456,2410,2423,2449,2436,2436,2397,2447,2448,2442,2408,2421,2391,2429,2339,2331,2475,2420,2458,2460,2452,2453,2476,2390,2482,2467,2442,2447,2428,2400,2389,2496,2345,2436,2400,2491,2454,2372,2472,2444,2430,2451,2440,2460,2391,2469,2332,2466,2393,2325,2447,2421,2493,2452,2546,2439,2366,2441,2442,2563,2469,2470,2394,2473,2483,2423,2492,2473,2365,2543,2483,2466,2395,2509,2405,2436,2437,2443,2447,2499,2449,2426,2438,2326,2440,2433,2518,2370,2435,2494,2430,2482,2420,2448,2450,2541,2446,2378,2346,2480,2449,2397,2416,2467,2393,2439,2461,2498,2428,2453,2415,2422,2456,2375,2420,2460,2416,2418,2454,2520,2426,2430,2409,2427,2544,2493,2471,2412,2555,2461,2405,2454,2463,2404,2371,2410,2425,2454,2439,2580,2440,2433,2454,2524,2465,2442,2440,2428,2411,2523,2437,2459,2366,2320,2470,2457,2397,2437,2415,2469,2426,2448,2458,2438,2427,2348,2415,2456,2450,2415,2418,2420,2444,2415,2412,2396,2435,2417,2417,2427,2443,2372,2407,2424,2301,2523,2518,2423,2411,2440,2438,2473,2434,2432,2413,2521,2424,2385,2439,2439,2410,2462,2499,2420,2410,2390,2415,2471,2488,2473,2380,2413,2417,2510,2450,2529,2403,2403,2473,2473,2388,2480,2496,2386,2470,2419,2511,2440,2413,2456,2484,2478,2464,2396,2444,2389,2470,2465,2380,2381,2403,2439,2408,2524,2411,2416,2382,2420,2396,2429,2371,2398,2420,2394,2360,2537,2403,2390,2514,2414,2506,2420,2437,2479,2432,2432,2392,2580,2500,2418,2372,2426,2420,2460,2459,2466,2397,2419,2395,2479,2377,2456,2459,2445,2475,2457,2424,2494,2464,2531,2468,2421,2411,2462,2391,2461,2479,2384,2437,2444,2467,2471,2469,2459,2436,2442,2463,2432,2433,2485,2432,2438,2393,2402,2457,2456,2415,2422,2446,2436,2474,2437,2412,2443,2575,2403,2388,2436,2371,2435,2377,2408,2425,2364,2406,2444,2405,2436,2341,2458,2399,2417,2412,2369,2438,2434,2455,2500,2437,2380,2435,2469,2449,2509,2424,2428,2477,2421,2458,2388,2369,2506,2475,2462,2377,2402,2380,2469,2512,2424,2407,2502,2399,2370,2422,2468,2488,2418,2480,2408,2523,2351,2530,2460,2542,2441,2457,2438,2443,2370,2412,2552,2460,2396,2477,2556,2412,2526,2373,2438,2416,2466,2497,2463,2428,2408,2488,2440,2514,2416,2429,2452,2442,2400,2494,2375,2491,2554,2450,2404,2383,2371,2408,2455,2433,2462,2452,2385,2437,2437,2469,2523,2395,2469,2370,2449,2398,2368,2416,2422,2459,2402,2510,2421,2437,2453,2448,2436,2441,2389,2384,2485,2391,2460,2408,2374,2422,2394,2495,2403,2441,2453,2439,2517,2422,2448,2470,2433,2395,2459,2405,2505,2459,2441,2321,2425,2395,2427,2437,2407,2521,2484,2328,2436,2514,2410,2521,2491,2413,2419,2448,2398,2417,2492,2405,2466,2367,2478,2402,2363,2605,2427,2482,2391,2390,2368,2464,2453,2434,2474,2369,2433,2442,2481,2396,2400,2481,2420,2459,2442,2447,2438,2402,2414,2459,2418,2434,2478,2467,2418,2511,2445,2439,2460,2428,2453,2495,2333,2473,2442,2518,2434,2431,2463]},{"counters":[2474,2420,2463,2376,2437,2443,2509,2408,2481,2404,2405,2358,2453,2431,2401,2434,2428,2455,2348,2446,2479,2408,2475,2378,2365,2461,2404,2542,2476,2425,2351,2476,2458,2476,2379,2413,2393,2496,2501,2440,2376,2463,2470,2387,2425,2450,2451,2378,2475,2386,2561,2477,2387,2497,2401,2428,2528,2480,2371,2445,2446,2424,2422,2462,2412,2467,2365,2378,2410,2513,2347,2423,2469,2486,2444,2443,2560,2465,2428,2478,2505,2535,2463,2488,2416,2467,2479,2470,2457,2504,2437,2480,2409,2485,2454,2415,2420,2464,2466,2426,2428,2378,2443,2436,2496,2372,2513,2455,2425,2459,2507,2523,2454,2381,2455,2424,2386,2440,2422,2557,2406,2329,2491,2351,2410,2447,2394,2476,2352,2494,2508,2419,2538,2495,2440,2436,2437,2467,2455,2433,2307,2385,2439,2441,2415,2470,2368,2470,2450,2421,2373,2456,2413,2367,2457,2410,2373,2369,2404,2442,2503,2436,2431,2495,2436,2419,2470,2436,2503,2439,2331,2483,2402,2397,2516,2410,2484,2460,2469,2471,2485,2460,2440,2436,2403,2490,2417,2404,2412,2376,2403,2500,2414,2388,2511,2437,2413,2465,2404,2382,2448,2523,2448,2549,2486,2461,2434,2537,2383,2462,2544,2413,2356,2425,2386,2430,2462,2486,2445,2497,2469,2484,2405,2451,2453,2473,2426,2421,2410,2481,2464,2427,2419,2491,2380,2434,2469,2444,2468,2375,2328,2442,2437,2443,2438,2451,2506,2400,2496,2489,2378,2390,2511,2380,2436,2336,2380,2398,2339,2456,2382,2490,2447,2466,2513,2473,2466,2431,2455,2425,2533,2449,2394,2457,2407,2513,2531,2388,2461,2463,2434,2478,2439,2385,2421,2426,2399,2442,2399,2418,2383,2454,2506,2388,2531,2455,2451,2426,2361,2499,2414,2455,2340,2413,2463,2397,2453,2439,2369,2465,2385,2424,2421,2485,2506,2287,2453,2349,2538,2453,2416,2424,2437,2432,2423,2435,2442,2437,2408,2414,2460,2455,2482,2454,2434,2436,2496,2458,2440,2459,2410,2515,2407,2437,2484,2475,2443,2409,2386,2473,2342,2373,2458,2340,2418,2474,2403,2470,2397,2577,2543,2349,2424,2475,2515,2507,2348,2461,2434,2450,2361,2448,2516,2396,2402,2447,2385,2371,2408,2509,2409,2444,2432,2434,2488,2469,2530,2376,2440,2462,2449,2335,2442,2567,2399,2437,2385,2458,2428,2443,2425,2437,2485,2373,2440,2437,2457,2437,2430,2443,2390,2435,2401,2431,2441,2367,2359,2407,2331,2401,2418,2413,2415,2469,2422,2385,2399,2366,2380,2427,2413,2444,2470,2400,2480,2422,2406,2375,2402,2415,2380,2445,2462,2439,2490,2513,2532,2476,2366,2522,2502,2437,2468,2369,2414,2441,2407,2414,2393,2432,2503,2482,2410,2441,2396,2451,2413,2412,2389,2462,2455,2399,2487,2484,2361,2504,2433,2506,2360,2422,2391,2411,2416,2477,2453,2521,2450,2358,2571,2406,2452,2506,2448,2396,2466,2436,2418,2438,2391,2344,2439,2562,2447,2357,2445,2411,2420,2385,2421,2454,2368,2402,2457,2505,2439,2459,2539,2442,2387,2405,2410,2317,2424,2457,2455,2448,2436,2378,2440,2484,2389,2395,2455,2484,2479,2430,2466,2418,2373,2346,2437,2427,2395,2466,2426,2405,2398,2413,2334,2462,2423,2465,2418,2424,2397,2503,2467,2461,2409,2495,2357,2425,2455,2479,2405,2461,2344,2438,2333,2372,2475,2405,2370,2509,2368,2531,2374,2390,2411,2451,2384,2433,2463,2399,2450,2352,2431,2437,2375,2408,2397,2363,2458,2494,2417,2578,2385,2416,2463,2435,2498,2408,2462,2416,2484,2436,2284,2453,2429,2440,2491,2453,2441,2375,2438,2404,2410,2473,2457,2437,2413,2381,2414,2408,2415,2418,2440,2476,2460,2381,2470,2437,2388,2410,2365,2408,2364,2412,2505,2469,2397,2457,2462,2358,2378,2415,2381,2526,2466,2364,2417,2440,2464,2382,2391,2470,2459,2483,2445,2441,2548,2459,2500,2420,2458,2524,2445,2429,2382,2474,2407,2446,2487,2403,2405,2499,2510,2358,2486,2446,2351,2514,2450,2424,2431,2528,2310,2336,2457,2442,2364,2389,2483,2327,2405,2437,2490,2431,2394,2377,2412,2423,2424,2471,2514,2473,2446,2454,2464,2411,2438,2477,2462,2511,2477,2544,2364,2426,2437,2391,2370,2473,2366,2425,2471,2351,2459,2491,2437,2430,2510,2416,2431,2377,2439,2344,2392,2491,2464,2382,2387,2399,2436,2481,2352,2398,2419,2412,2440,2462,2436,2454,2398,2409,2420,2434,2463,2452,2455,2433,2467,2475,2389,2534,2422,2465,2461,2497,2432,2504,2435,2500,2469,2397,2438,2408,2376,2463,2433,2436,2464,2469,2458,2477,2456,2452,2467,2460,2466,2481,2391,2403,2376,2397,2417,2471,2478,2489,2430,2475,2389,2402,2527,2471,2442,2401,2434,2424,2487,2416,2451,2532,2381,2481,2517,2436,2421,2433,2418,2425,2440,2455,2385,2453,2536,2448,2418,2497,2374,2469,2372,2352,2416,2387,2437,2489,2437,2470,2513,2482,2475,2389,2396,2455,2409,2442,2476,2360,2391,2450,2373,2423,2451,2376,2359,2501,2342,2408,2451,2461,2436,2449,2442,2419,2408,2423,2378,2427,2471,2454,2441,2396,2383,2451,2345,2416,2528,2436,2460,2440,2531,2438,2333,2462,2434,2490,2441,2418,2427,2364,2444,2498,2481,2440,2499,2459,2421,2405,2420,2385,2474,2435,2494,2451,2474,2479,2443,2387,2445,2431,2477,2370,2456,2468,2423,2394,2416,2438,2418,2458,2437,2404,2305,2436,2456,2407,2362,2353,2463,2456,2362,2456,2366,2378,2397,2512,2391,2475,2373,2445,2460,2442,2381,2466,2514,2379,2410,2417,2449,2473,2395,2554,2465,2463,2434,2440,2471,2427,2465,2431,2464,2431,2408,2481,2437,2278,2419,2416,2489,2455,2441,2463,2417,2360,2493,2498,2414,2446,2347,2416,2477,2439,2478,2382,2445,2424,2491,2498,2419,2443,2421,2401,2452,2430,2443,2368,2452,2471,2428,2413,2388,2445,2440,2440,2530,2397,2428,2386,2427,2493,2368,2442,2515,2390,2432,2504,2448,2447,2532,2450,2481,2436,2486,2477,2440,2422,2407,2432,2449,2347,2522,2438,2384,2420,2444,2496,2488,2449,2436,2478,2356,2491,2432,2480,2369,2424,2418,2331,2471,2401,2406,2403,2462,2432,2377,2440,2378,2406,2408,2426,2453,2405,2494,2473,2431,2454,2453,2489,2494,2535,2432,2489,2464,2390,2356,2506,2456,2417,2390,2423,2486,2507,2394,2529,2440,2485,2363,2440,2386,2369,2419,2440,2396,2338,2442,2428,2463,2457,2529,2465,2442,2386,2460,2466,2459,2350,2417,2438,2450,2444,2418,2357,2368,2440,2446,2389,2450,2511,2417,2493,2548,2380,2369,2495,2407,2422,2442,2378,2396,2508,2534,2464,2362,2387,2556,2394,2471,2440,2441,2424,2455,2464,2563,2425,2456,2424,2493,2379,2421,2418,2440,2438,2442,2430,2426,2400,2430,2414,2444,2414,2398,2521,2395,2441,2400,2472,2353,2378,2396,2445,2478,2435,2390,2528,2408,2405,2538,2436,2392,2436,2365,2414,2465,2439,2416,2381,2426,2525,2372,2478,2419,2445,2512,2357,2374,2386,2415,2473,2437,2452,2471,2383,2508,2437,2434,2458,2366,2449,2480,2454,2470,2422,2487,2408,2406,2399,2446,2375,2330,2390,2496,2439,2440,2434,2393,2338,2385,2444,2359,2341,2376,2459,2477,2438,2437,2421,2395,2359,2498,2551,2437,2520,2496,2454,2444,2477,2477,2420,2363,2386,2456,2432,2423,2488,2490,2552,2384,2391,2430,2341,2416,2435,2440,2437,2485,2363,2375,2435,2442,2466,2407,2411,2439,2429,2308,2458,2508,2484,2454,2405,2441,2449,2461,2452,2439,2491,2489,2416,2440,2463,2334,2361,2448,2416,2422,2515,2460,2439,2426,2428,2413,2414,2428,2462,2400,2468,2410,2435,2422,2469,2400,2441,2444,2535,2332,2410,2531,2436,2420,2490,2390,2491,2456,2494,2494,2433,2481,2486,2423,2438,2522,2455,2494,2374,2520,2528,2434,2450,2430,2515,2399,2513,2473,2499,2553,2511,2507,2489,2450,2479,2417,2565,2466,2432,2391,2306,2549,2396,2506,2500,2413,2469,2462,2402,2375,2487,2386,2467,2392,2399,2438,2411,2558,2415,2433,2562,2516,2490,2402,2498,2454,2439,2486,2505,2438,2436,2370,2426,2390,2451,2484,2430,2355,2390,2477,2378,2483,2528,2474,2419,2457,2487,2514,2353,2360,2415,2354,2427,2388,2434,2450,2391,2361,2468,2416,2545,2466,2480,2435,2470,2410,2497,2424,2385,2352,2436,2496,2408,2398,2373,2505,2362,2369,2444,2458,2471,2436,2415,2530,2504,2375,2418,2466,2445,2370,2443,2518,2435,2446,2440,2448,2405,2520,2465,2510,2485,2474,2508,2375,2454,2345,2442,2354,2498,2496,2473,2400,2424,2366,2446,2421,2494,2468,2457,2405,2334,2462,2493,2417,2529,2449,2459,2329,2468,2422,2495,2397,2424,2471,2483,2405,2406,2440,2470,2509,2418,2450,2412,2487,2358,2371,2404,2526,2396,2408,2370,2485,2421,2439,2337,2460,2429,2436,2374,2453,2417,2389,2342,2448,2364,2409,2372,2368,2473,2482,2480,2377,2464,2510,2411,2440,2424,2448,2412,2432,2431,2421,2489,2410,2379,2386,2415,2509,2506,2460,2422,2478,2460,2396,2407,2406,2267,2454,2419,2365,2503,2409,2439,2404,2431,2456,2521,2464,2409,2440,2444,2403,2428,2373,2373,2372,2427,2369,2336,2491,2432,2473,2541,2464,2353,2473,2448,2442,2394,2359,2467,2379,2527,2476,2438,2525,2474,2446,2438,2378,2439,2547,2475,2479,2515,2456,2337,2588,2413,2444,2445,2429,2429,2415,2450,2313,2460,2491,2406,2352,2436,2451,2429,2396,2485,2435,2473,2469,2414,2550,2455,2470,2454,2427,2422,2518,2513,2369,2331,2525,2460,2428,2399,2378,2479,2437,2411,2458,2441,2449,2446,2446,2415,2331,2425,2438,2409,2454,2380,2466,2436,2449,2436,2427,2347,2421,2404,2469,2434,2408,2452,2487,2419,2318,2464,2463,2443,2428,2458,2372,2430,2407,2292,2459,2533,2441,2363,2478,2411,2444,2389,2361,2498,2348,2402,2454,2473,2394,2455,2365,2453,2502,2455,2449,2500,2401,2400,2438,2390,2424,2383,2495,2535,2320,2390,2382,2514,2456,2453,2520,2338,2418,2437,2477,2414,2360,2310,2409,2388,2382,2505,2447,2467,2541,2439,2407,2393,2470,2425,2492,2399,2436,2487,2466,2421,2514,2405,2351,2444,2503,2454,2440,2412,2421,2420,2518,2382,2392,2454,2547,2435,2413,2417,2415,2441,2475,2401,2459,2387,2423,2480,2380,2473,2415,2419,2475,2475,2435,2385,2444,2447,2492,2492,2412,2531,2377,2474,2464,2366,2355,2462,2471,2360,2478,2434,2534,2386,2462,2463,2465,2441,2502,2405,2431,2472,2451,2411,2439,2436,2373,2481,2440,2361,2565,2475,2511,2498,2423,2407,2532,2409,2380,2477,2341,2469,2463,2436,2468,2364,2490,2465,2430,2433,2429,2504,2422,2397,2430,2449,2389,2448,2411,2459,2395,2426,2453,2546,2358,2461,2438,2384,2451,2401,2467,2443,2416,2485,2436,2469,2434,2458,2480,2487,2548,2412,2452,2413,2398,2402,2468,2391,2405,2516,2380,2466,2474,2513,2428,2418,2497,2520,2431,2426,2440,2490,2421,2415,2453,2361,2496,2519,2432,2384,2473,2488,2427,2418,2337,2446,2407,2405,2465,2471,2500,2420,2455,2502,2469,2490,2581,2345,2374,2441,2355,2502,2456,2434,2373,2491,2510,2473,2431,2443,2479,2437,2435,2389,2431,2448,2474,2475,2558,2469,2522,2303,2410,2378,2393,2385,2425,2340,2420,2392,2344,2470,2486,2437,2329,2429,2412,2378,2348,2342,2469,2427,2402,2438,2394,2392,2470,2493,2399,2434,2429,2439,2522,2399,2416,2334,2506,2440,2460,2440,2429,2416,2492,2412,2457,2440,2457,2469,2395,2434,2382,2444,2524,2461,2356,2346,2398,2411,2397,2387,2389,2465,2403,2432,2326,2502,2412,2433,2345,2412,2473,2438,2404,2379,2495,2312,2430,2461,2416,2395,2478,2547,2438,2559,2419,2455,2340,2474,2481,2464,2345,2403,2423,2411,2372,2423,2433,2456,2534,2440,2447,2407,2462,2370,2438,2438,2472,2490,2556,2472,2485,2434,2468,2408,2341,2345,2383,2429,2370,2482]}],"top_n":[{"data":"CPzByQM=","count":0},{"data":"CNTgswQ=","count":15},{"data":"CN7rQQ==","count":7},{"data":"CKj7rQM=","count":0},{"data":"COzrrAM=","count":0},{"data":"CPqP3wE=","count":0},{"data":"CMaNiwM=","count":0},{"data":"CNzkIg==","count":3},{"data":"CO7HmwE=","count":0},{"data":"CJiCUg==","count":8},{"data":"CNb6HA==","count":0},{"data":"CNSE2QQ=","count":11},{"data":"CNT+vwM=","count":28},{"data":"CJyECg==","count":25},{"data":"CPzhCQ==","count":0},{"data":"CKaEQQ==","count":0},{"data":"CPDKzAE=","count":3},{"data":"CIzxoQI=","count":0},{"data":"CJKHMw==","count":0},{"data":"CLbfyAQ=","count":22},{"data":"CIiRrAQ=","count":0},{"data":"CNaPZA==","count":0},{"data":"CMDczwQ=","count":2},{"data":"CLTiuwM=","count":5},{"data":"CIzrpwI=","count":0},{"data":"CL6kgwM=","count":20},{"data":"CMqrXg==","count":0},{"data":"CLie2gE=","count":0},{"data":"CPyP1AE=","count":0},{"data":"CLSF+AM=","count":0},{"data":"COLYjAQ=","count":0},{"data":"CJbaiQQ=","count":7},{"data":"CMb8+gM=","count":9},{"data":"CLaHpgQ=","count":0},{"data":"CKaZ+gI=","count":22},{"data":"CMyDAg==","count":0},{"data":"CKriigQ=","count":0},{"data":"CNKolgM=","count":0},{"data":"CIb3mgE=","count":28},{"data":"CN7gIw==","count":0},{"data":"CIqJogQ=","count":0},{"data":"COLl4wM=","count":16},{"data":"CLz3RA==","count":34},{"data":"CNSbiQM=","count":0},{"data":"CKDg3QE=","count":24},{"data":"CIbOkwI=","count":6},{"data":"CMi5Ig==","count":26},{"data":"COCPYQ==","count":18},{"data":"CJiWfw==","count":2},{"data":"CJD46QM=","count":0},{"data":"CLDuIQ==","count":0},{"data":"CJbtigQ=","count":0},{"data":"CKDYygE=","count":12},{"data":"COrd8AE=","count":0},{"data":"CJqLngM=","count":45},{"data":"CJaAdQ==","count":21},{"data":"CKj4zgE=","count":0},{"data":"CJqUhAI=","count":0},{"data":"CLqC5AE=","count":27},{"data":"CPbtmwQ=","count":0},{"data":"CJ6GxQE=","count":0},{"data":"CKa7hQI=","count":0},{"data":"CLS9Gg==","count":53},{"data":"CIijxwM=","count":2},{"data":"CMbhXQ==","count":45},{"data":"CKqB+AM=","count":19},{"data":"CLSB6QI=","count":0},{"data":"CLa+tQQ=","count":29},{"data":"CJbKBg==","count":1},{"data":"CKzfrwM=","count":0},{"data":"COqfFA==","count":3},{"data":"CNj28gI=","count":43},{"data":"CNaejAM=","count":30},{"data":"COiwkwE=","count":0},{"data":"CPaEfA==","count":27},{"data":"CPbigwE=","count":0},{"data":"CKKSiwE=","count":10},{"data":"CNCypQM=","count":0},{"data":"COjRUg==","count":0},{"data":"CO6vkgQ=","count":0},{"data":"CPiPsQE=","count":0},{"data":"CNakCw==","count":6},{"data":"CJqKcg==","count":10},{"data":"CPrn+gI=","count":45},{"data":"CLi0Iw==","count":35},{"data":"CMi83gQ=","count":0},{"data":"CJziswM=","count":0},{"data":"CNLrmAM=","count":23},{"data":"CIyWIw==","count":0},{"data":"CIjO1gM=","count":53},{"data":"CKrCMw==","count":6},{"data":"CKax3wQ=","count":26},{"data":"CLrRNA==","count":16},{"data":"CJzlngI=","count":0},{"data":"CIKT/QE=","count":0},{"data":"CPydOA==","count":0},{"data":"CJ7RnAM=","count":11},{"data":"CPDykgQ=","count":12},{"data":"CODfjQE=","count":22},{"data":"CLaHZA==","count":0},{"data":"CKbTvAE=","count":32},{"data":"COj7zQI=","count":0},{"data":"CL79Ag==","count":67},{"data":"CKyrrwQ=","count":9},{"data":"CPzFGA==","count":11},{"data":"CODm/QI=","count":5},{"data":"CIDLHw==","count":0},{"data":"CJChsQE=","count":0},{"data":"CKrrnwI=","count":0},{"data":"CPyrjwQ=","count":0},{"data":"COjvGw==","count":45},{"data":"CNzfqgI=","count":8},{"data":"CPbxogE=","count":61},{"data":"CL6bkAQ=","count":15},{"data":"CPSTkAE=","count":7},{"data":"CMrp8QI=","count":0},{"data":"CKCmrgE=","count":4},{"data":"CK6TwwE=","count":0},{"data":"CICfTA==","count":4},{"data":"CObxqQE=","count":28},{"data":"COjIDA==","count":22},{"data":"CJCmqwQ=","count":0},{"data":"CJbQVw==","count":0},{"data":"CJz+gQM=","count":0},{"data":"CKKzjwI=","count":33},{"data":"CPTODg==","count":17},{"data":"CMqaEQ==","count":0},{"data":"CIDjiAQ=","count":0},{"data":"CN7trAI=","count":0},{"data":"CLy3wQQ=","count":3},{"data":"COrGyAM=","count":1},{"data":"CJrBhwE=","count":0},{"data":"CNbXoAM=","count":16},{"data":"CILu9wI=","count":0},{"data":"COL4/AM=","count":16},{"data":"CIq1tQI=","count":0},{"data":"CP7ewwM=","count":18},{"data":"CJKbywQ=","count":0},{"data":"CNqA/QM=","count":18},{"data":"CLL66wI=","count":0},{"data":"CN6b2AQ=","count":30},{"data":"CLacGw==","count":0},{"data":"CKjoyAM=","count":15},{"data":"CMr+/gE=","count":41},{"data":"CNKbvAE=","count":0},{"data":"CPKYmQI=","count":0},{"data":"COrztQM=","count":0},{"data":"CLTr1wI=","count":25},{"data":"COTscA==","count":0},{"data":"COix0wI=","count":0},{"data":"CLzSigQ=","count":0},{"data":"CLLJnwI=","count":31},{"data":"CL6ujgQ=","count":4},{"data":"CPybuAI=","count":11},{"data":"CIbNhgE=","count":0},{"data":"CPzwgQE=","count":0},{"data":"COakggI=","count":0},{"data":"CObbpgE=","count":34},{"data":"CNKR0QE=","count":0},{"data":"CKywwQQ=","count":15},{"data":"CMKr4wI=","count":0},{"data":"CL7pFg==","count":16},{"data":"CIagSA==","count":21},{"data":"CJ7kWA==","count":7},{"data":"CKCe1wI=","count":3},{"data":"CLT20AI=","count":10},{"data":"CNiB7QE=","count":2},{"data":"CJisPw==","count":18},{"data":"CMrdiQE=","count":17},{"data":"CM6KkQQ=","count":44},{"data":"CLy1hAI=","count":0},{"data":"CNS6/gE=","count":0},{"data":"CPDI0gI=","count":0},{"data":"CKTCZQ==","count":0},{"data":"CPahsAI=","count":0},{"data":"CMDazQE=","count":0},{"data":"CNyYOA==","count":30},{"data":"CKDc6gE=","count":8},{"data":"CKbl3gQ=","count":27},{"data":"COan0wE=","count":3},{"data":"CJCOCQ==","count":0},{"data":"CNbvtAI=","count":16},{"data":"CP6B+gM=","count":13},{"data":"CI6W2gE=","count":0},{"data":"CMiutwM=","count":5},{"data":"CMqg7gM=","count":0},{"data":"CL664AQ=","count":0},{"data":"CMbIzgQ=","count":0},{"data":"CPLIqwI=","count":0},{"data":"CIjRSA==","count":7},{"data":"CMyvWw==","count":0},{"data":"CM6W9AM=","count":18},{"data":"COLavwI=","count":27},{"data":"CNrdWg==","count":0},{"data":"CNqKpQI=","count":0},{"data":"COj5Qg==","count":7},{"data":"CNiDpAM=","count":43},{"data":"CKSgqwI=","count":2},{"data":"CJaW7AM=","count":26},{"data":"CKzp7QM=","count":0},{"data":"CNiiMQ==","count":0},{"data":"CMqZzwQ=","count":0},{"data":"CLL1+gI=","count":0},{"data":"CKaNxgM=","count":20},{"data":"CKK1xgM=","count":8},{"data":"CKD4cA==","count":0},{"data":"CPSrHg==","count":1},{"data":"CKblsgI=","count":0},{"data":"CPDVTA==","count":27},{"data":"CL64oQI=","count":43},{"data":"CIjpzAE=","count":2},{"data":"CJb8uwI=","count":0},{"data":"CKL9swE=","count":0},{"data":"CKinfQ==","count":0},{"data":"CJyBZw==","count":0},{"data":"CKrEYQ==","count":11},{"data":"CMb6WQ==","count":0},{"data":"CMbALA==","count":35},{"data":"CKqAvQI=","count":11},{"data":"CPz6/QM=","count":0},{"data":"CMS/cQ==","count":35},{"data":"CNS+0wI=","count":12},{"data":"COiksgM=","count":0},{"data":"CODY0AE=","count":12},{"data":"COamgwM=","count":0},{"data":"COr83QI=","count":36},{"data":"CLqCoQM=","count":0},{"data":"CObr7AM=","count":0},{"data":"CIb65gI=","count":47},{"data":"CIbR2AE=","count":0},{"data":"CPj96AI=","count":28},{"data":"CKT+Qg==","count":0},{"data":"COaXEg==","count":22},{"data":"CN7QzgQ=","count":0},{"data":"CMyrmwI=","count":0},{"data":"CNaEygE=","count":28},{"data":"CLj+jAE=","count":0},{"data":"CJax3gE=","count":4},{"data":"CIrR7gM=","count":11},{"data":"CKasjAM=","count":0},{"data":"CI7OkgE=","count":0},{"data":"CJz0kAQ=","count":16},{"data":"CL7P1QM=","count":0},{"data":"CIS2sQI=","count":30},{"data":"CMy8jwE=","count":6},{"data":"CPyq7wI=","count":50},{"data":"CJay6QI=","count":0},{"data":"CNzSGQ==","count":24},{"data":"CPS02gI=","count":9},{"data":"CMyirwE=","count":0},{"data":"CPTPiAM=","count":0},{"data":"COSw6wE=","count":5},{"data":"CODC0QM=","count":47},{"data":"CMKM2AI=","count":0},{"data":"CJrc1QM=","count":0},{"data":"CMb6kAE=","count":30},{"data":"CKjOywE=","count":0},{"data":"CKiKlwI=","count":0},{"data":"COjWqwE=","count":0},{"data":"CJac0AM=","count":46},{"data":"CKapnAI=","count":28},{"data":"CJyOswE=","count":47},{"data":"COr9tgI=","count":0},{"data":"CPzwqgM=","count":0},{"data":"CL6yOA==","count":11},{"data":"COLN7gI=","count":0},{"data":"CMz/lgI=","count":0},{"data":"COzL4wI=","count":5},{"data":"CODO4gM=","count":0},{"data":"CPCvfA==","count":7},{"data":"CN67jQI=","count":40},{"data":"CLLIywE=","count":0},{"data":"CMSI8wE=","count":35},{"data":"CPrS/gI=","count":0},{"data":"CKqEuAI=","count":28},{"data":"CNDwywI=","count":0},{"data":"CNzetAQ=","count":0},{"data":"CKqZlgQ=","count":11},{"data":"CObG4wI=","count":0},{"data":"COKcAg==","count":0},{"data":"CKb52wE=","count":40},{"data":"CN723wI=","count":0},{"data":"CN6OmwI=","count":0},{"data":"COy+4gM=","count":0},{"data":"CKzLyAQ=","count":40},{"data":"CKa41AQ=","count":0},{"data":"CNzPlgI=","count":0},{"data":"CNTBnQI=","count":56},{"data":"CMz2mgQ=","count":0},{"data":"CKiAlAE=","count":15},{"data":"CNio4AQ=","count":0},{"data":"CNLC1gI=","count":20},{"data":"CM7GgwI=","count":0},{"data":"CJLR9wM=","count":21},{"data":"CJyrkwE=","count":0},{"data":"COqx5wE=","count":15},{"data":"CPr/1wQ=","count":60},{"data":"CJij0wI=","count":30},{"data":"COiczAE=","count":0},{"data":"CN6+SA==","count":42},{"data":"CK7cmAI=","count":0},{"data":"CKDczgM=","count":0},{"data":"CK7W3wI=","count":0},{"data":"CMDX8wE=","count":28},{"data":"CMDoowI=","count":15},{"data":"CPKO0gM=","count":0},{"data":"CNasIQ==","count":21},{"data":"CPzLigI=","count":2},{"data":"CLK++AM=","count":30},{"data":"CNzh8wM=","count":2},{"data":"CI7/3QM=","count":6},{"data":"COyd5gI=","count":23},{"data":"COaE7gI=","count":1},{"data":"CKbQmwM=","count":0},{"data":"CMSp7wI=","count":0},{"data":"CNju3wE=","count":0},{"data":"COTS/wM=","count":39},{"data":"CMbKwgI=","count":0},{"data":"CKSyzwM=","count":2},{"data":"CLSlZA==","count":5},{"data":"COjGJg==","count":31},{"data":"CK7o9gM=","count":0},{"data":"CLC8xgQ=","count":0},{"data":"CMTwxQE=","count":0},{"data":"CNLPywE=","count":0},{"data":"CL7btgI=","count":0},{"data":"CJrJ+AM=","count":34},{"data":"CPTlhwI=","count":10},{"data":"COzskwQ=","count":0},{"data":"CLKSwAQ=","count":0},{"data":"CJ6eeA==","count":0},{"data":"CNCOsAI=","count":53},{"data":"CKSp5QM=","count":0},{"data":"COTz6QM=","count":4},{"data":"CLiGxwQ=","count":4},{"data":"CMjqIg==","count":30},{"data":"CM68rAI=","count":0},{"data":"CNTP9QE=","count":9},{"data":"CO7c1gQ=","count":12},{"data":"CNKY1AE=","count":0},{"data":"CMDu2wE=","count":6},{"data":"COin7AE=","count":9},{"data":"CLj/nwE=","count":22},{"data":"CO66GQ==","count":3},{"data":"CObv2wI=","count":0},{"data":"CPLt1wI=","count":7},{"data":"CPqPsAI=","count":0},{"data":"CJqtDw==","count":29},{"data":"CJTCYA==","count":14},{"data":"CLzdCw==","count":0},{"data":"CNrkhAI=","count":4},{"data":"CMjLjwQ=","count":17},{"data":"CISwQg==","count":0},{"data":"CKqVrAM=","count":0},{"data":"CM72dA==","count":15},{"data":"CMST1wE=","count":13},{"data":"CKbi4gE=","count":0},{"data":"CKzW1gQ=","count":0},{"data":"COas6AI=","count":3},{"data":"COKNwwQ=","count":0},{"data":"CLS1rgE=","count":0},{"data":"CKCnVA==","count":0},{"data":"CISpoQQ=","count":58},{"data":"CPyzggQ=","count":0},{"data":"CJL/ggM=","count":0},{"data":"CNzugQI=","count":31},{"data":"CLLN9gI=","count":20},{"data":"CLTXfg==","count":19},{"data":"COzfwwQ=","count":0},{"data":"CNK6kgQ=","count":14},{"data":"CO7b/wE=","count":0},{"data":"CMyz3QM=","count":10},{"data":"CLqUggM=","count":18},{"data":"CKzbvAE=","count":26},{"data":"CPqxhgM=","count":0},{"data":"CNjC4gM=","count":0},{"data":"CPiZxwE=","count":7},{"data":"CIy87wE=","count":0},{"data":"CIbZRQ==","count":21},{"data":"CKTujQQ=","count":0},{"data":"CLid8AM=","count":0},{"data":"CMyKlQQ=","count":1},{"data":"CP7kugE=","count":35},{"data":"COLNDg==","count":36},{"data":"CIa+vgQ=","count":0},{"data":"CJ688QI=","count":0},{"data":"CPSpvgE=","count":11},{"data":"CPqFmgI=","count":0},{"data":"CLSatwE=","count":14},{"data":"CMKPRg==","count":13},{"data":"CLCBjAE=","count":3},{"data":"CIT8uAI=","count":29},{"data":"CKqfigQ=","count":0},{"data":"CMTe/wI=","count":35},{"data":"CLDQxwM=","count":36},{"data":"CI7ssAM=","count":0},{"data":"CP6nQA==","count":29},{"data":"CK78qAQ=","count":0},{"data":"CPC45AI=","count":2},{"data":"CJbM5wE=","count":1},{"data":"CMqbZA==","count":0},{"data":"CIihrwE=","count":17},{"data":"CL6fqAM=","count":0},{"data":"CICXwAQ=","count":20},{"data":"CKbuigE=","count":6},{"data":"CN6rhwI=","count":0},{"data":"CNDBowM=","count":29},{"data":"CMyTkAE=","count":0},{"data":"CKKrzAQ=","count":0},{"data":"COTrEA==","count":29},{"data":"CKTi3AQ=","count":0},{"data":"CLanuQI=","count":6},{"data":"CMboxgM=","count":19},{"data":"CLTaHQ==","count":57},{"data":"CPq1sAI=","count":0},{"data":"CPLKqAE=","count":0},{"data":"COiZOw==","count":34},{"data":"CJiS+QM=","count":19},{"data":"CNysnAQ=","count":0},{"data":"CPiIAg==","count":0},{"data":"CJi0yQE=","count":0},{"data":"COShogE=","count":0},{"data":"CLbwhgQ=","count":0},{"data":"CNDWzQE=","count":0},{"data":"CLbEpgQ=","count":0},{"data":"CMyUoQQ=","count":12},{"data":"CKzzswI=","count":4},{"data":"CMSglwE=","count":35},{"data":"CKLuRg==","count":0},{"data":"CIiD6QI=","count":0},{"data":"CLaMwgE=","count":11},{"data":"CMSdpAE=","count":1},{"data":"CIaDgwM=","count":39},{"data":"CIzMxQQ=","count":30},{"data":"COSp/AM=","count":0},{"data":"CKbQyQI=","count":0},{"data":"CIyb/gE=","count":0},{"data":"CNDFnQM=","count":0},{"data":"CJbJeA==","count":5},{"data":"CLKk2gI=","count":14},{"data":"CNTIvgM=","count":0},{"data":"CJidOw==","count":2},{"data":"CN6N5wE=","count":0},{"data":"CIzXpgM=","count":49},{"data":"CL6FoQQ=","count":0},{"data":"CNCp6AI=","count":68},{"data":"CNzjQA==","count":0},{"data":"CPzazwI=","count":0},{"data":"CMjxHA==","count":0},{"data":"CL6LywE=","count":40},{"data":"COqe9AE=","count":0},{"data":"CIDYMg==","count":0},{"data":"CK68yAI=","count":21},{"data":"CKS15AM=","count":0},{"data":"CO6jswI=","count":14},{"data":"CNaSqQQ=","count":2},{"data":"CNDJlAQ=","count":3},{"data":"CPTlugE=","count":64},{"data":"CJL9qwQ=","count":10},{"data":"CNyBJw==","count":0},{"data":"CKSi2QM=","count":0},{"data":"CLz+qwE=","count":23},{"data":"CICrwQQ=","count":7},{"data":"CLKaggI=","count":16},{"data":"CLzoDA==","count":0},{"data":"CLq12gQ=","count":0},{"data":"CLaTtAE=","count":1},{"data":"CPTszAE=","count":6},{"data":"CKqTWg==","count":16},{"data":"CK6LZw==","count":0},{"data":"CIb2aQ==","count":0},{"data":"CLyExgE=","count":0},{"data":"CJjIwwI=","count":0},{"data":"CNTcswM=","count":0},{"data":"CJ79oAI=","count":13},{"data":"COSW7AI=","count":32},{"data":"CJKXiAE=","count":17},{"data":"CKD+/gI=","count":0},{"data":"CMCA2QM=","count":0},{"data":"CMK1qwQ=","count":0},{"data":"CPyzWA==","count":18},{"data":"CNLrWA==","count":0},{"data":"CICGoQE=","count":0},{"data":"CNqjyQM=","count":0},{"data":"CJTgUQ==","count":0},{"data":"CPq8RA==","count":0},{"data":"CNif0QE=","count":13},{"data":"CPyqAw==","count":12},{"data":"CMy/kgM=","count":11},{"data":"CNjQmgQ=","count":51},{"data":"COSK/AM=","count":20},{"data":"CNz20gM=","count":0},{"data":"CMywvQQ=","count":0},{"data":"CNjgcA==","count":0},{"data":"COyiqAQ=","count":3},{"data":"CIKM/wI=","count":0},{"data":"CJDxGA==","count":0},{"data":"CNLY/QI=","count":0},{"data":"CPbO7gM=","count":3},{"data":"CJiE6wI=","count":38},{"data":"CPC+sQI=","count":25},{"data":"CM7sywQ=","count":0},{"data":"CJbUrwQ=","count":2},{"data":"CMbnfA==","count":9},{"data":"CNzmhgE=","count":0},{"data":"CJrYlgE=","count":23},{"data":"CPS8pQQ=","count":0},{"data":"CMCeiQE=","count":0},{"data":"CJ6E+gI=","count":20},{"data":"CKb33AI=","count":16},{"data":"COzAngE=","count":0},{"data":"CIK+vQI=","count":43},{"data":"CNLM0AE=","count":0},{"data":"CLL2/QM=","count":3},{"data":"CLayxgQ=","count":30},{"data":"CNCo0QI=","count":19},{"data":"CKjV2QM=","count":0},{"data":"CNi8QQ==","count":0},{"data":"CLyw8wM=","count":40},{"data":"CJbm3AM=","count":19},{"data":"COqhqQI=","count":33},{"data":"CL6VtQM=","count":16},{"data":"CO7PtAI=","count":0},{"data":"CLKwuwE=","count":4},{"data":"CKruogQ=","count":0},{"data":"CLK3Uw==","count":21},{"data":"CKqswwI=","count":0},{"data":"CLanDw==","count":0},{"data":"CMKN8QM=","count":2},{"data":"CMC2fQ==","count":0},{"data":"CLS06gI=","count":14},{"data":"CIb6pwQ=","count":0},{"data":"COjG4wI=","count":31},{"data":"CIDZuAQ=","count":0},{"data":"CJqD1AM=","count":39},{"data":"COCKSQ==","count":8},{"data":"CNKL1wQ=","count":25},{"data":"CKyPkQI=","count":7},{"data":"CPSKTw==","count":0},{"data":"CNiZwwI=","count":19},{"data":"COTqyQE=","count":0},{"data":"CLbktAI=","count":0},{"data":"CND8GQ==","count":25},{"data":"CNy1qgE=","count":11},{"data":"CKTh9AE=","count":0},{"data":"CNSO3QM=","count":0},{"data":"CK62dg==","count":41},{"data":"CPiLgAQ=","count":29},{"data":"CNj5ygM=","count":0},{"data":"CLbTNA==","count":13},{"data":"CN6j3wM=","count":0},{"data":"COLeoAQ=","count":9},{"data":"CMamhgE=","count":45},{"data":"CISTywM=","count":0},{"data":"COC0Qg==","count":0},{"data":"CPqpkwM=","count":0},{"data":"CLDkiAQ=","count":0},{"data":"CJad1QQ=","count":17},{"data":"CJT7Pw==","count":0},{"data":"CNr9jgM=","count":0},{"data":"CLLqNA==","count":0},{"data":"CJ7wvAQ=","count":0},{"data":"CJresgQ=","count":0},{"data":"CJKZZw==","count":0},{"data":"COy97QE=","count":2},{"data":"CM7stQI=","count":9},{"data":"CISd7gE=","count":20},{"data":"CMDa4AM=","count":16},{"data":"CPykwgM=","count":0},{"data":"CJ65/wE=","count":0},{"data":"CILFgwI=","count":34},{"data":"CKChtwM=","count":0},{"data":"CPS+/AE=","count":0},{"data":"CPjB0QE=","count":0},{"data":"CMi7xgM=","count":28},{"data":"CISnqQI=","count":0},{"data":"CIrC/wE=","count":36},{"data":"CNTi4QI=","count":18},{"data":"CLL93gI=","count":0},{"data":"COCAzQM=","count":0},{"data":"CK6mqwE=","count":0},{"data":"CLSkiAI=","count":1},{"data":"CL6M4QQ=","count":32},{"data":"CLiskwQ=","count":0},{"data":"CJTIjQI=","count":0},{"data":"CNiK2wI=","count":1},{"data":"CLjJZg==","count":0},{"data":"CMbsgwQ=","count":0},{"data":"CN6HnQM=","count":0},{"data":"CIK3pgE=","count":0},{"data":"CKrP9QE=","count":0},{"data":"CIKzAg==","count":0},{"data":"CNTowQE=","count":0},{"data":"COyvAQ==","count":3},{"data":"CM7tIQ==","count":6},{"data":"CIS4pgQ=","count":7},{"data":"CNLfTQ==","count":22},{"data":"CK7ZxgM=","count":0},{"data":"CILxyAM=","count":5},{"data":"CLS4/gI=","count":0},{"data":"CPyUzAQ=","count":25},{"data":"CI6ilgI=","count":0},{"data":"CISqWQ==","count":3},{"data":"CN7poAM=","count":0},{"data":"CM7gkAM=","count":4},{"data":"CKDRcQ==","count":19},{"data":"CNq6dA==","count":0},{"data":"CLrY7wM=","count":8},{"data":"CKT+yQI=","count":0},{"data":"COL4pAE=","count":0},{"data":"CIL5pAQ=","count":0},{"data":"CKz8kgQ=","count":0},{"data":"CJbQsgQ=","count":33},{"data":"CPaOiQM=","count":0},{"data":"CPDUfw==","count":22},{"data":"CIDujwE=","count":8},{"data":"CPSpgQI=","count":60},{"data":"CMDxpgE=","count":30},{"data":"CM7+hgI=","count":0},{"data":"CIy3mAE=","count":0},{"data":"CKa6Wg==","count":0},{"data":"COyxowM=","count":1},{"data":"CNSR5QE=","count":0},{"data":"CKa7tAQ=","count":0},{"data":"CMC7gwI=","count":0},{"data":"CNaflQE=","count":0},{"data":"COrb4AE=","count":0},{"data":"CMaPxwM=","count":7},{"data":"CKaQvgE=","count":8},{"data":"CNyYtQE=","count":3},{"data":"CKqziAI=","count":0},{"data":"COStHQ==","count":11},{"data":"CMa76AI=","count":0},{"data":"CJLLuwI=","count":5},{"data":"CIrumQM=","count":20},{"data":"CLrW2QM=","count":26},{"data":"CMbJswI=","count":0},{"data":"CIb+CQ==","count":0},{"data":"CJqKwQM=","count":10},{"data":"CIjixAI=","count":0},{"data":"CMqprAM=","count":27},{"data":"CKqPjwM=","count":0},{"data":"COTYEQ==","count":9},{"data":"CO6YmwI=","count":4},{"data":"CLSoYg==","count":0},{"data":"CISK/QE=","count":17},{"data":"CICl7gE=","count":0},{"data":"CJT/7QM=","count":0},{"data":"CMrRogI=","count":5},{"data":"CJKouAM=","count":0},{"data":"COS+dA==","count":57},{"data":"CLa3ngQ=","count":11},{"data":"CJ6/0gQ=","count":0},{"data":"CKrCiwM=","count":50},{"data":"COyA8wM=","count":11},{"data":"CMLopAE=","count":2},{"data":"CKTYlwQ=","count":0},{"data":"CMTCfg==","count":1},{"data":"COTh7QI=","count":0},{"data":"CIS1ygM=","count":0},{"data":"CJyOLA==","count":0},{"data":"CNqBlQE=","count":0},{"data":"CPDSlAE=","count":0},{"data":"CO7OgQQ=","count":0},{"data":"CLj57gI=","count":0},{"data":"CIKx6gI=","count":18},{"data":"CLanrgQ=","count":0},{"data":"CJqYyAQ=","count":33},{"data":"CPLwtQQ=","count":43},{"data":"CO6PMA==","count":0},{"data":"CMTtwwQ=","count":0},{"data":"CNyG7QI=","count":22},{"data":"CPSPRA==","count":18},{"data":"CJzyxwM=","count":29},{"data":"CKDgowI=","count":11},{"data":"CP61IA==","count":2},{"data":"CKqhqQM=","count":0},{"data":"CKz20wI=","count":4},{"data":"CJKZ/wI=","count":25},{"data":"CPSFvQQ=","count":0},{"data":"CPrDfQ==","count":0},{"data":"CLz4BA==","count":4},{"data":"CP61lwI=","count":11},{"data":"CMq9QA==","count":16},{"data":"CJbV/gM=","count":24},{"data":"CICqpgM=","count":27},{"data":"COq/zwE=","count":0},{"data":"CMCBtQM=","count":0},{"data":"CLyDwAQ=","count":1},{"data":"COSAqAE=","count":52},{"data":"COSAWw==","count":0},{"data":"CJLtEw==","count":1},{"data":"CMj5iAI=","count":25},{"data":"CLSoyAI=","count":36},{"data":"CKrT6gI=","count":2},{"data":"CNTxvwE=","count":15},{"data":"CL6BjwM=","count":0},{"data":"CPz69AI=","count":8},{"data":"CMjU5gM=","count":0},{"data":"CP6iqwQ=","count":44},{"data":"CIrDxAM=","count":18},{"data":"CPThrgI=","count":2},{"data":"CMq1xAI=","count":37},{"data":"CNiSpwI=","count":5},{"data":"CJrszwQ=","count":0},{"data":"CIS7/gE=","count":0},{"data":"CLzHmQE=","count":0},{"data":"CJSehAQ=","count":11},{"data":"CICMcw==","count":44},{"data":"CMr4rAM=","count":25},{"data":"CP6cqgI=","count":26},{"data":"CL6HugI=","count":32},{"data":"CL7OGQ==","count":11},{"data":"CJbX+AM=","count":29},{"data":"CJzRzQQ=","count":43},{"data":"CPLd2wI=","count":37},{"data":"CO7KrAE=","count":3},{"data":"CKSQKQ==","count":0},{"data":"CKi4jwM=","count":23},{"data":"CIbvBA==","count":49},{"data":"CJrEVw==","count":0},{"data":"CMCdgAM=","count":7},{"data":"CO6w4AQ=","count":0},{"data":"CMD/pgQ=","count":50},{"data":"CJKeBQ==","count":0},{"data":"CLqTyQI=","count":0},{"data":"CNiomgE=","count":1},{"data":"CKrqwAM=","count":0},{"data":"CPKRswI=","count":25},{"data":"CLq0ugM=","count":33},{"data":"CJrBiQM=","count":0},{"data":"COjFqAI=","count":10},{"data":"CIDSxQI=","count":77},{"data":"CNrotQE=","count":33},{"data":"CL72mwM=","count":10},{"data":"CLTrAQ==","count":5},{"data":"CISQCQ==","count":38},{"data":"CLDqxAM=","count":22},{"data":"CMj51wQ=","count":3},{"data":"CJyVwgM=","count":4},{"data":"CLyuOQ==","count":0},{"data":"CN67mQE=","count":10},{"data":"CPTv7AE=","count":0},{"data":"CLDRjwE=","count":34},{"data":"CNC52AI=","count":0},{"data":"CNykFQ==","count":12},{"data":"COLAGQ==","count":5},{"data":"CLLWBg==","count":3},{"data":"CMKBnAM=","count":2},{"data":"CK788gI=","count":0},{"data":"CMjR3QI=","count":34},{"data":"CKakdQ==","count":15},{"data":"CIyJFQ==","count":0},{"data":"COqFiAM=","count":4},{"data":"COaJVw==","count":6},{"data":"CO6yvgQ=","count":0},{"data":"CKahlAE=","count":10},{"data":"CKyWlAI=","count":21},{"data":"CJDKDw==","count":0},{"data":"CNKfSA==","count":0},{"data":"CJjgaQ==","count":0},{"data":"CLKt9QM=","count":0},{"data":"CJaijwE=","count":0},{"data":"CJyvtAQ=","count":13},{"data":"CPjQyQM=","count":0},{"data":"CMiD3QQ=","count":3},{"data":"CMDBpAI=","count":3},{"data":"CMjPjAE=","count":45},{"data":"CMyaiAM=","count":11},{"data":"CPj53gQ=","count":36},{"data":"CKih6AE=","count":0},{"data":"COaRhwM=","count":59},{"data":"CIadYw==","count":0},{"data":"CJqNtwQ=","count":0},{"data":"CM7IvgQ=","count":1},{"data":"CK6NDw==","count":30},{"data":"COamrwQ=","count":32},{"data":"CKzRSQ==","count":10},{"data":"CIy4wgM=","count":0},{"data":"CIqOkAM=","count":0},{"data":"CKb7mQQ=","count":4},{"data":"CNj21AE=","count":0},{"data":"CJj7xgE=","count":42},{"data":"CPahhwM=","count":0},{"data":"CM7etQM=","count":13},{"data":"COSW9wI=","count":0},{"data":"CPSVnAM=","count":0},{"data":"CJycDQ==","count":0},{"data":"CIiOcw==","count":0},{"data":"CKao5wM=","count":3},{"data":"CNCelQM=","count":21},{"data":"CLy7kAI=","count":2},{"data":"CO7J3gM=","count":0},{"data":"COje2wM=","count":62},{"data":"CIb/wwI=","count":0},{"data":"CJL5nQQ=","count":15},{"data":"CLKWqwM=","count":16},{"data":"CIbOVg==","count":0},{"data":"COjJIw==","count":0},{"data":"CMqBwwE=","count":17},{"data":"CML5cg==","count":0},{"data":"CIT3kQQ=","count":8},{"data":"CLCpwwE=","count":0},{"data":"CJS6pQE=","count":10},{"data":"COL8igM=","count":0},{"data":"CPjPBQ==","count":20},{"data":"CJLKBg==","count":24},{"data":"CPSdeg==","count":0},{"data":"CJqfsQQ=","count":0},{"data":"CLCGDA==","count":0},{"data":"CO6m9QE=","count":0},{"data":"CNDVngI=","count":15},{"data":"CMq1pAQ=","count":5},{"data":"CNywhgI=","count":0},{"data":"CL79ngI=","count":0},{"data":"CKyD6gI=","count":0},{"data":"COb6nAQ=","count":0},{"data":"CJq5wwQ=","count":2},{"data":"CJqh0AI=","count":14},{"data":"CLSs9QE=","count":11},{"data":"CKabngI=","count":0},{"data":"CJyhsgQ=","count":0},{"data":"CNiG4wE=","count":36},{"data":"CN7r4QI=","count":15},{"data":"CPLAsAM=","count":11},{"data":"CMC/+gM=","count":53},{"data":"CMbogwI=","count":0},{"data":"COqdJg==","count":36},{"data":"CKz1ygE=","count":10},{"data":"CNCDGQ==","count":40},{"data":"CPbKmQQ=","count":1},{"data":"CL72ngE=","count":0},{"data":"CMTnMQ==","count":0},{"data":"CML+qwM=","count":8},{"data":"COCtkQQ=","count":49},{"data":"CIrhxAE=","count":0},{"data":"CIKwXA==","count":43},{"data":"CNyz6wM=","count":84},{"data":"CJ6OjAI=","count":15},{"data":"CPbF6QE=","count":0},{"data":"COjhUg==","count":11},{"data":"CMT7ngM=","count":38},{"data":"CLiFgQE=","count":46},{"data":"CPifpQQ=","count":0},{"data":"CISlrgQ=","count":0},{"data":"CIKlkwQ=","count":15},{"data":"CLy1pgQ=","count":17},{"data":"CJCFxAQ=","count":13},{"data":"CLazEA==","count":0},{"data":"CKTutwE=","count":0},{"data":"CNryyAI=","count":16},{"data":"CJzXowE=","count":0},{"data":"CJ6s+gM=","count":0},{"data":"CMKnugQ=","count":0},{"data":"CI65eQ==","count":0},{"data":"CNSLjAM=","count":0},{"data":"COaehAQ=","count":15},{"data":"CISGhQI=","count":0},{"data":"CNLTEA==","count":0},{"data":"CLqAnAM=","count":4},{"data":"CLDyBA==","count":6},{"data":"COLAzQE=","count":38},{"data":"CMr54QQ=","count":18},{"data":"CIagtQQ=","count":0},{"data":"CMjl0AI=","count":53},{"data":"CIqg2AQ=","count":38},{"data":"CMjongM=","count":44},{"data":"CKC42QE=","count":0},{"data":"CJjGiQM=","count":66},{"data":"CN7JoAI=","count":26},{"data":"CNaT8gM=","count":1},{"data":"CMrnEA==","count":44},{"data":"CNiCgAQ=","count":0},{"data":"CLasgQI=","count":0},{"data":"CPiihgQ=","count":28},{"data":"CMiBggE=","count":8},{"data":"CPCaygQ=","count":0},{"data":"CPrVmAE=","count":0},{"data":"COrkrAQ=","count":15},{"data":"CM72kwQ=","count":0},{"data":"CLaQlgI=","count":0},{"data":"COTQSg==","count":38},{"data":"CKa5swQ=","count":10},{"data":"COS7CA==","count":0},{"data":"CN6uiQQ=","count":0},{"data":"CNRH","count":0},{"data":"CJqsbw==","count":14},{"data":"CJbxWg==","count":1},{"data":"CL7F7wE=","count":12},{"data":"CODQlQM=","count":0},{"data":"CNz6wQQ=","count":25},{"data":"CP7IwAQ=","count":61},{"data":"CKTGpgM=","count":0},{"data":"CIj4nQE=","count":14},{"data":"CMDv8wI=","count":27},{"data":"CJSGqwM=","count":7},{"data":"COC8qgM=","count":44},{"data":"CP7utQE=","count":0},{"data":"CJCFswE=","count":1},{"data":"CJbBzAE=","count":0},{"data":"CPDCwgM=","count":2},{"data":"CKry4QQ=","count":0},{"data":"COTe7wI=","count":14},{"data":"CK7LgwI=","count":7},{"data":"CIKJngQ=","count":0},{"data":"CJjS0gQ=","count":0},{"data":"CKir4gM=","count":0},{"data":"CLqfpgI=","count":0},{"data":"CM791AM=","count":2},{"data":"CKz3eg==","count":0},{"data":"CKLqGA==","count":0},{"data":"CP7X1AI=","count":0},{"data":"CISGKA==","count":13},{"data":"CKLUzgQ=","count":28},{"data":"CLy3uAQ=","count":0},{"data":"COLl2QM=","count":26},{"data":"CLrZeQ==","count":0},{"data":"CIr6Jw==","count":0},{"data":"CPy4rgQ=","count":23},{"data":"CLSyJg==","count":0},{"data":"CI699wM=","count":0},{"data":"CLTe2QM=","count":16},{"data":"CMDmpAE=","count":0},{"data":"CJrfkQQ=","count":0},{"data":"CJKuyAQ=","count":35},{"data":"CO7n4AI=","count":0},{"data":"CIzd6QE=","count":8},{"data":"CJzvqQQ=","count":13},{"data":"CPjOygQ=","count":13},{"data":"CLrA0QQ=","count":0},{"data":"CIbkxQE=","count":4},{"data":"CJDEzQQ=","count":0},{"data":"CPqTgAQ=","count":39},{"data":"CMbFuwQ=","count":0},{"data":"CMj+oAQ=","count":25},{"data":"CLS0yQQ=","count":0},{"data":"CJCMiQI=","count":4},{"data":"CMrYvgE=","count":8},{"data":"CNrjhgE=","count":22},{"data":"CMDC2gE=","count":50},{"data":"CLCV9QI=","count":1},{"data":"CIqj2QM=","count":20},{"data":"CLCwLQ==","count":0},{"data":"CMjIogI=","count":0},{"data":"CPSgWw==","count":42},{"data":"COyNEQ==","count":0},{"data":"CLqlrwM=","count":2},{"data":"CMS09QE=","count":0},{"data":"CP7FxAI=","count":47},{"data":"CLagdQ==","count":0},{"data":"CJC91AI=","count":1},{"data":"COqWIQ==","count":2},{"data":"CI6dlAI=","count":16},{"data":"CN6digM=","count":0},{"data":"CIDtywM=","count":0},{"data":"CIrr4wE=","count":25},{"data":"CKjW3wE=","count":7},{"data":"CKrkpAQ=","count":0},{"data":"CITItAM=","count":0},{"data":"CLzubg==","count":7},{"data":"CLjz6gM=","count":19},{"data":"CJTS6wM=","count":1},{"data":"CIDWCA==","count":0},{"data":"CNKYMA==","count":8},{"data":"CPiiuAM=","count":0},{"data":"CJz1ngE=","count":0},{"data":"CJyjZA==","count":0},{"data":"CNyBKg==","count":2},{"data":"CNzVvwQ=","count":33},{"data":"CNK+xAQ=","count":6},{"data":"CIzcqgI=","count":0},{"data":"CMSasQQ=","count":0},{"data":"CJiqlgM=","count":6},{"data":"CLqewQE=","count":8},{"data":"COTP1wQ=","count":25},{"data":"CNS+Nw==","count":0},{"data":"CIjvmwI=","count":16},{"data":"CITVvAQ=","count":16},{"data":"CPyHuwQ=","count":11},{"data":"CPSekAQ=","count":0},{"data":"COie6AM=","count":0},{"data":"COjgMw==","count":6},{"data":"CNy5wQE=","count":1},{"data":"CNLBKg==","count":13},{"data":"CIDYCw==","count":12},{"data":"COSdYQ==","count":0},{"data":"CNqA2QQ=","count":0},{"data":"CNqCwgE=","count":0},{"data":"CNi8BQ==","count":0},{"data":"CKqblQQ=","count":0},{"data":"CKiK9wE=","count":0},{"data":"CILY4wM=","count":0},{"data":"CLCUowI=","count":0},{"data":"CKyhwgI=","count":0},{"data":"CMDwxwQ=","count":56},{"data":"CMD20wI=","count":27},{"data":"CKK5zgE=","count":0},{"data":"CJitaQ==","count":12},{"data":"COyuzgI=","count":0},{"data":"CPb0bw==","count":36}],"default_value":0},"null_count":0,"tot_col_size":18943171,"last_update_version":410676699618869248,"correlation":1},"e":{"histogram":{"ndv":4999168,"buckets":[{"count":20000,"lower_bound":"Njc2MA==","upper_bound":"MTkxOTI=","repeats":1},{"count":40000,"lower_bound":"MjEyMDQ=","upper_bound":"MzYwMTc=","repeats":1},{"count":60000,"lower_bound":"NDk1MzM=","upper_bound":"NTQwMTI=","repeats":1},{"count":80000,"lower_bound":"NTQ1MjI=","upper_bound":"NjMxODQ=","repeats":1},{"count":100000,"lower_bound":"NzM2Mjk=","upper_bound":"OTM1OTY=","repeats":1},{"count":120000,"lower_bound":"OTUzODA=","upper_bound":"MTEwNjcz","repeats":1},{"count":140000,"lower_bound":"MTExNjMw","upper_bound":"MTMwMTIw","repeats":1},{"count":160000,"lower_bound":"MTM0OTQ4","upper_bound":"MTU2Mzgw","repeats":1},{"count":180000,"lower_bound":"MTU4NzQ2","upper_bound":"MTYzODE5","repeats":1},{"count":200000,"lower_bound":"MTY4NDA2","upper_bound":"MTgxMzI0","repeats":1},{"count":220000,"lower_bound":"MTg4NTc5","upper_bound":"MjAyOTg2","repeats":1},{"count":240000,"lower_bound":"MjAzNzQ1","upper_bound":"MjI4MDIx","repeats":1},{"count":260000,"lower_bound":"MjI5NzY2","upper_bound":"MjM1NjQ5","repeats":1},{"count":280000,"lower_bound":"MjQ1ODEw","upper_bound":"MjUwMTY2","repeats":1},{"count":300000,"lower_bound":"MjUwMzg5","upper_bound":"MjYyODk1","repeats":1},{"count":320000,"lower_bound":"MjYyOTk3","upper_bound":"MjY4NDcx","repeats":1},{"count":340000,"lower_bound":"MjkzMTI5","upper_bound":"MzA0OTQy","repeats":1},{"count":360000,"lower_bound":"MzA2Nzcy","upper_bound":"MzE2NDAw","repeats":1},{"count":380000,"lower_bound":"MzE4MjUx","upper_bound":"MzIyNzM0","repeats":1},{"count":400000,"lower_bound":"MzM0MDc5","upper_bound":"MzQ0MTYz","repeats":1},{"count":420000,"lower_bound":"MzQ2NTA3","upper_bound":"MzYwNjAy","repeats":1},{"count":440000,"lower_bound":"MzYxNDcz","upper_bound":"MzY2MjU2","repeats":1},{"count":460000,"lower_bound":"Mzc5Mzk3","upper_bound":"MzkxMTQw","repeats":1},{"count":480000,"lower_bound":"Mzk2NzQ4","upper_bound":"NDA1NTM5","repeats":1},{"count":500000,"lower_bound":"NDA5Nzg5","upper_bound":"NDE3NDU3","repeats":1},{"count":520000,"lower_bound":"NDIyNzQz","upper_bound":"NDI2OTQ0","repeats":1},{"count":540000,"lower_bound":"NDI4MDkw","upper_bound":"NDM2OTcy","repeats":1},{"count":560000,"lower_bound":"NDQwNDE5","upper_bound":"NDU1Mjk2","repeats":1},{"count":580000,"lower_bound":"NDYxMTQ5","upper_bound":"NDg1NDY4","repeats":1},{"count":600000,"lower_bound":"NDkwMzU2","upper_bound":"NTA5NDAz","repeats":1},{"count":620000,"lower_bound":"NTEzNzY2","upper_bound":"NTE1NDA4","repeats":1},{"count":640000,"lower_bound":"NTE3Mzc4","upper_bound":"NTMzMDQ5","repeats":1},{"count":660000,"lower_bound":"NTMzMzU4","upper_bound":"NTQ3MzM0","repeats":1},{"count":680000,"lower_bound":"NTU1NTI4","upper_bound":"NTY2ODQw","repeats":1},{"count":700000,"lower_bound":"NTcyNTQ4","upper_bound":"NTg3ODAw","repeats":1},{"count":720000,"lower_bound":"NTkxNzkw","upper_bound":"NjE4MTA4","repeats":1},{"count":740000,"lower_bound":"NjI0MjM3","upper_bound":"NjMyMjQ4","repeats":1},{"count":760000,"lower_bound":"NjM2Njc5","upper_bound":"NjQ2OTQw","repeats":1},{"count":780000,"lower_bound":"NjUyNzIz","upper_bound":"NjcxNDQ4","repeats":1},{"count":800000,"lower_bound":"Njc2NTU5","upper_bound":"Njg1MDIy","repeats":1},{"count":820000,"lower_bound":"Njg1Njk5","upper_bound":"Njk5MDg5","repeats":1},{"count":840000,"lower_bound":"NzE0MTA5","upper_bound":"NzI0OTQ4","repeats":1},{"count":860000,"lower_bound":"NzM5MDE2","upper_bound":"NzQzOTY3","repeats":1},{"count":880000,"lower_bound":"NzQ3ODE0","upper_bound":"NzcwMTM3","repeats":1},{"count":900000,"lower_bound":"Nzc0Njk2","upper_bound":"Nzg3MjQ1","repeats":1},{"count":920000,"lower_bound":"Nzg3MjQ3","upper_bound":"ODEwOTQw","repeats":1},{"count":940000,"lower_bound":"ODE2MDkz","upper_bound":"ODMxMzUw","repeats":1},{"count":960000,"lower_bound":"ODMzNTYz","upper_bound":"ODUyNzEw","repeats":1},{"count":980000,"lower_bound":"ODU2MTEz","upper_bound":"ODcwNzM4","repeats":1},{"count":1000000,"lower_bound":"ODc0MTgz","upper_bound":"ODg3NDcx","repeats":1},{"count":1020000,"lower_bound":"ODk0MTQz","upper_bound":"OTA0MzU1","repeats":1},{"count":1040000,"lower_bound":"OTE4NzYy","upper_bound":"OTM5Mzgy","repeats":1},{"count":1060000,"lower_bound":"OTQyMDM5","upper_bound":"OTYxNzk4","repeats":1},{"count":1080000,"lower_bound":"OTY1NTgw","upper_bound":"OTgwMjg1","repeats":1},{"count":1100000,"lower_bound":"OTg0OTYx","upper_bound":"OTkwODM4","repeats":1},{"count":1120000,"lower_bound":"OTkzOTk3","upper_bound":"MTAwNjU4NQ==","repeats":1},{"count":1140000,"lower_bound":"MTAxNjg2OA==","upper_bound":"MTAyNzk2OA==","repeats":1},{"count":1160000,"lower_bound":"MTAzNDI2Mw==","upper_bound":"MTA1MDQ0NA==","repeats":1},{"count":1180000,"lower_bound":"MTA1MjI2MQ==","upper_bound":"MTA3Njk2Nw==","repeats":1},{"count":1200000,"lower_bound":"MTA3ODg3Mw==","upper_bound":"MTA4NDMxNA==","repeats":1},{"count":1220000,"lower_bound":"MTA4NzkwNQ==","upper_bound":"MTA5MzgyMA==","repeats":1},{"count":1240000,"lower_bound":"MTA5NzU4OA==","upper_bound":"MTExNjkyNw==","repeats":1},{"count":1260000,"lower_bound":"MTEyMzYwNw==","upper_bound":"MTE2MTE5MA==","repeats":1},{"count":1280000,"lower_bound":"MTE2NTA2NA==","upper_bound":"MTE3NzcwNw==","repeats":1},{"count":1300000,"lower_bound":"MTE3ODQ4OQ==","upper_bound":"MTE4ODA5Nw==","repeats":1},{"count":1320000,"lower_bound":"MTE5NTI1OQ==","upper_bound":"MTIyMTA5MA==","repeats":1},{"count":1340000,"lower_bound":"MTIyNjQ2Mg==","upper_bound":"MTI0MTkzMA==","repeats":1},{"count":1360000,"lower_bound":"MTI0NDM2Mw==","upper_bound":"MTI1MzU2MA==","repeats":1},{"count":1380000,"lower_bound":"MTI2NzE4OQ==","upper_bound":"MTI4NDA1Nw==","repeats":1},{"count":1400000,"lower_bound":"MTI4OTQ1MA==","upper_bound":"MTI5NzkyNw==","repeats":1},{"count":1420000,"lower_bound":"MTMwNDkwMQ==","upper_bound":"MTMxNzQwMA==","repeats":1},{"count":1440000,"lower_bound":"MTMyMDA1OQ==","upper_bound":"MTMyNzkzMg==","repeats":1},{"count":1460000,"lower_bound":"MTMzMjgwMg==","upper_bound":"MTMzOTgxMg==","repeats":1},{"count":1480000,"lower_bound":"MTM0MjEwMg==","upper_bound":"MTM1MDczOA==","repeats":1},{"count":1500000,"lower_bound":"MTM1MTk1Mw==","upper_bound":"MTM1OTE0OQ==","repeats":1},{"count":1520000,"lower_bound":"MTM2MTExMw==","upper_bound":"MTM2OTg0Ng==","repeats":1},{"count":1540000,"lower_bound":"MTM3NDUyNw==","upper_bound":"MTM5MTI1OQ==","repeats":1},{"count":1560000,"lower_bound":"MTM5Mzg0Ng==","upper_bound":"MTQyNzE5Mw==","repeats":1},{"count":1580000,"lower_bound":"MTQzMTY1Mg==","upper_bound":"MTQ4Mzg1MQ==","repeats":1},{"count":1600000,"lower_bound":"MTQ5MzI4Nw==","upper_bound":"MTUxMDk4MQ==","repeats":1},{"count":1620000,"lower_bound":"MTUxOTYzOA==","upper_bound":"MTUzNzgyOA==","repeats":1},{"count":1640000,"lower_bound":"MTU1MTAxMQ==","upper_bound":"MTU2NTc4MQ==","repeats":1},{"count":1660000,"lower_bound":"MTU2NzU2NA==","upper_bound":"MTU4ODM4Mg==","repeats":1},{"count":1680000,"lower_bound":"MTU5Mjk5Mw==","upper_bound":"MTYwNTIwMA==","repeats":1},{"count":1700000,"lower_bound":"MTYwNTkxMw==","upper_bound":"MTYxNzU3NQ==","repeats":1},{"count":1720000,"lower_bound":"MTYyMDIwNA==","upper_bound":"MTYyNjU5Nw==","repeats":1},{"count":1740000,"lower_bound":"MTYyNjYzMQ==","upper_bound":"MTYzNTA2OA==","repeats":1},{"count":1760000,"lower_bound":"MTYzNzgwNA==","upper_bound":"MTY2NjA2Mg==","repeats":1},{"count":1780000,"lower_bound":"MTY3MjU5Ng==","upper_bound":"MTY3NzM0Mw==","repeats":1},{"count":1800000,"lower_bound":"MTY4NDM1Mw==","upper_bound":"MTcwNDg2NA==","repeats":1},{"count":1820000,"lower_bound":"MTcwNDg3Ng==","upper_bound":"MTcxNzc4NA==","repeats":1},{"count":1840000,"lower_bound":"MTcyNDQ1Mg==","upper_bound":"MTc0MjUzNA==","repeats":1},{"count":1860000,"lower_bound":"MTc0MzM1NQ==","upper_bound":"MTc0ODQxOQ==","repeats":1},{"count":1880000,"lower_bound":"MTc2NTI5NQ==","upper_bound":"MTc4MTc5OQ==","repeats":1},{"count":1900000,"lower_bound":"MTc5MDA0Mw==","upper_bound":"MTgwNDkyNg==","repeats":1},{"count":1920000,"lower_bound":"MTgwNjE5NQ==","upper_bound":"MTgxNTEwNg==","repeats":1},{"count":1940000,"lower_bound":"MTgyNDg5MQ==","upper_bound":"MTg0NjUzOA==","repeats":1},{"count":1960000,"lower_bound":"MTg0OTk1MA==","upper_bound":"MTg1ODMxOQ==","repeats":1},{"count":1980000,"lower_bound":"MTg2MjI4Mg==","upper_bound":"MTg3MDYyNQ==","repeats":1},{"count":2000000,"lower_bound":"MTg3NjY1Mw==","upper_bound":"MTg4NTcyOQ==","repeats":1},{"count":2020000,"lower_bound":"MTg4NjYxMQ==","upper_bound":"MTkxMDAwNg==","repeats":1},{"count":2040000,"lower_bound":"MTkxNjA0OA==","upper_bound":"MTkyNzc2OA==","repeats":1},{"count":2060000,"lower_bound":"MTk0MjY2Mw==","upper_bound":"MTk2MzQ4Mg==","repeats":1},{"count":2080000,"lower_bound":"MTk3NzEzMA==","upper_bound":"MjAwMDI0NA==","repeats":1},{"count":2100000,"lower_bound":"MjAwNDcwMA==","upper_bound":"MjAxMDA0OA==","repeats":1},{"count":2120000,"lower_bound":"MjAyMzMzMA==","upper_bound":"MjAzODU1NQ==","repeats":1},{"count":2140000,"lower_bound":"MjAzODU2Nw==","upper_bound":"MjA0OTIwMA==","repeats":1},{"count":2160000,"lower_bound":"MjA1MTIyNg==","upper_bound":"MjA3OTkyOA==","repeats":1},{"count":2180000,"lower_bound":"MjA4NjMxOA==","upper_bound":"MjA5NDg5Mg==","repeats":1},{"count":2200000,"lower_bound":"MjEwNTA5Mw==","upper_bound":"MjExNjE4OA==","repeats":1},{"count":2220000,"lower_bound":"MjEyMjE2Nw==","upper_bound":"MjEzNDA1Mw==","repeats":1},{"count":2240000,"lower_bound":"MjEzNTAwOA==","upper_bound":"MjE0MjgzNg==","repeats":1},{"count":2260000,"lower_bound":"MjE0MzgyMA==","upper_bound":"MjE2MDc1OA==","repeats":1},{"count":2280000,"lower_bound":"MjE2MzIxOA==","upper_bound":"MjE4MzgxNw==","repeats":1},{"count":2300000,"lower_bound":"MjE4NjE4NA==","upper_bound":"MjIwNDE0NA==","repeats":1},{"count":2320000,"lower_bound":"MjIwNjM5Nw==","upper_bound":"MjIxMjI1Mg==","repeats":1},{"count":2340000,"lower_bound":"MjIxNjI5OQ==","upper_bound":"MjIyODY0OA==","repeats":1},{"count":2360000,"lower_bound":"MjIzODI5Mw==","upper_bound":"MjI0ODUwNw==","repeats":1},{"count":2380000,"lower_bound":"MjI1NjQwNQ==","upper_bound":"MjI3OTY4Ng==","repeats":1},{"count":2400000,"lower_bound":"MjI4MjMxMw==","upper_bound":"MjI4NzQwNQ==","repeats":1},{"count":2420000,"lower_bound":"MjI4ODA3Mg==","upper_bound":"MjMxMTgwNg==","repeats":1},{"count":2440000,"lower_bound":"MjMxMzk0NA==","upper_bound":"MjMzNjI5NA==","repeats":1},{"count":2460000,"lower_bound":"MjM0MTA4Ng==","upper_bound":"MjM1NDE1Nw==","repeats":1},{"count":2480000,"lower_bound":"MjM2Nzk0Ng==","upper_bound":"MjM5NzIyNQ==","repeats":1},{"count":2500000,"lower_bound":"MjQwNzc2OQ==","upper_bound":"MjQzMjYzMw==","repeats":1},{"count":2520000,"lower_bound":"MjQzNDc2OA==","upper_bound":"MjQ2NTMxMg==","repeats":1},{"count":2540000,"lower_bound":"MjQ2ODAxMQ==","upper_bound":"MjQ4MTExMQ==","repeats":1},{"count":2560000,"lower_bound":"MjQ4NDYxNg==","upper_bound":"MjQ5MzUzMQ==","repeats":1},{"count":2580000,"lower_bound":"MjQ5NTUwOA==","upper_bound":"MjUwNzM4Ng==","repeats":1},{"count":2600000,"lower_bound":"MjUyMzg3Ng==","upper_bound":"MjU0MTQxMg==","repeats":1},{"count":2620000,"lower_bound":"MjU0MjcwNg==","upper_bound":"MjU2MDg0MQ==","repeats":1},{"count":2640000,"lower_bound":"MjU2NTIyOQ==","upper_bound":"MjU3NDc0MQ==","repeats":1},{"count":2660000,"lower_bound":"MjU3Njk2MA==","upper_bound":"MjU4MzY1Mg==","repeats":1},{"count":2680000,"lower_bound":"MjU5NjkwMg==","upper_bound":"MjYwMDQ3MQ==","repeats":1},{"count":2700000,"lower_bound":"MjYwNzExOQ==","upper_bound":"MjYyODM1Nw==","repeats":1},{"count":2720000,"lower_bound":"MjYzNjI4NQ==","upper_bound":"MjY1OTY2Mg==","repeats":1},{"count":2740000,"lower_bound":"MjY2MjQ4Mw==","upper_bound":"MjY4MDkwOA==","repeats":1},{"count":2760000,"lower_bound":"MjY4NzI5MQ==","upper_bound":"MjcwMjEyMw==","repeats":1},{"count":2780000,"lower_bound":"MjcxMDQxMA==","upper_bound":"MjcyOTMzNA==","repeats":1},{"count":2800000,"lower_bound":"MjczMDc5MQ==","upper_bound":"Mjc1MDc3MA==","repeats":1},{"count":2820000,"lower_bound":"Mjc2MzkwMA==","upper_bound":"Mjc2OTcxMA==","repeats":1},{"count":2840000,"lower_bound":"Mjc5MzMzMw==","upper_bound":"MjgwMTE3MA==","repeats":1},{"count":2860000,"lower_bound":"MjgwMjUwMg==","upper_bound":"MjgyMTc4NQ==","repeats":1},{"count":2880000,"lower_bound":"MjgzOTU0Mw==","upper_bound":"Mjg0OTc1Mw==","repeats":1},{"count":2900000,"lower_bound":"Mjg1MDc0NQ==","upper_bound":"Mjg3MDYwMg==","repeats":1},{"count":2920000,"lower_bound":"Mjg3MTY2OA==","upper_bound":"Mjg4MTY2MA==","repeats":1},{"count":2940000,"lower_bound":"Mjg5MjY2NQ==","upper_bound":"MjkxOTk5Mw==","repeats":1},{"count":2960000,"lower_bound":"MjkyMzAyOA==","upper_bound":"MjkzNTgwOQ==","repeats":1},{"count":2980000,"lower_bound":"Mjk1NjAyMA==","upper_bound":"Mjk3NTIxMw==","repeats":1},{"count":3000000,"lower_bound":"Mjk4Mjk1OA==","upper_bound":"MzAyMDQ5NQ==","repeats":1},{"count":3020000,"lower_bound":"MzAyMzc3NA==","upper_bound":"MzAzMzEyMQ==","repeats":1},{"count":3040000,"lower_bound":"MzAzOTg5MQ==","upper_bound":"MzA0NDM1NA==","repeats":1},{"count":3060000,"lower_bound":"MzA1OTQ2Nw==","upper_bound":"MzA3MTA2OA==","repeats":1},{"count":3080000,"lower_bound":"MzA3OTMzMQ==","upper_bound":"MzEwNjEyNQ==","repeats":1},{"count":3100000,"lower_bound":"MzEwODY5MQ==","upper_bound":"MzEyMzY2OA==","repeats":1},{"count":3120000,"lower_bound":"MzEzNTI2Mg==","upper_bound":"MzE1MDU3Mg==","repeats":1},{"count":3140000,"lower_bound":"MzE1NDE2OQ==","upper_bound":"MzE2Mjg5Mw==","repeats":1},{"count":3160000,"lower_bound":"MzE2NTE1NA==","upper_bound":"MzE3OTQyMQ==","repeats":1},{"count":3180000,"lower_bound":"MzE3OTk0OA==","upper_bound":"MzE4NTc4NQ==","repeats":1},{"count":3200000,"lower_bound":"MzE4NzQyMQ==","upper_bound":"MzIwMDQ1Mw==","repeats":1},{"count":3220000,"lower_bound":"MzIwNTIyMg==","upper_bound":"MzIxNDc5OA==","repeats":1},{"count":3240000,"lower_bound":"MzIxNTE1NA==","upper_bound":"MzI0MjAwNQ==","repeats":1},{"count":3260000,"lower_bound":"MzI0NDQwMg==","upper_bound":"MzI1MDg1Mw==","repeats":1},{"count":3280000,"lower_bound":"MzI1MjIzOQ==","upper_bound":"MzI3MjQwNA==","repeats":1},{"count":3300000,"lower_bound":"MzI3NDg1Ng==","upper_bound":"MzI3ODA1Ng==","repeats":1},{"count":3320000,"lower_bound":"MzI3OTQ4Mw==","upper_bound":"MzMwMzAwOQ==","repeats":1},{"count":3340000,"lower_bound":"MzMwODU0Ng==","upper_bound":"MzMzNjE0Ng==","repeats":1},{"count":3360000,"lower_bound":"MzM0NjE2Nw==","upper_bound":"MzM1NzkwMQ==","repeats":1},{"count":3380000,"lower_bound":"MzM2NDQ1Nw==","upper_bound":"MzM3OTUzMw==","repeats":1},{"count":3400000,"lower_bound":"MzM4MTExMA==","upper_bound":"MzM5Mzk5Ng==","repeats":1},{"count":3420000,"lower_bound":"MzM5NDc1Mg==","upper_bound":"MzQxNDM0Ng==","repeats":1},{"count":3440000,"lower_bound":"MzQyNzQ3MA==","upper_bound":"MzQzNjU5MA==","repeats":1},{"count":3460000,"lower_bound":"MzQ0ODIyMA==","upper_bound":"MzQ2NzY2OQ==","repeats":1},{"count":3480000,"lower_bound":"MzQ2ODY2NQ==","upper_bound":"MzQ3ODMwMg==","repeats":1},{"count":3500000,"lower_bound":"MzQ4MTgxNg==","upper_bound":"MzQ4OTExOQ==","repeats":1},{"count":3520000,"lower_bound":"MzQ5NDQ2Nw==","upper_bound":"MzUxNzE3Ng==","repeats":1},{"count":3540000,"lower_bound":"MzUyNjY4Mg==","upper_bound":"MzUzNjIwMw==","repeats":1},{"count":3560000,"lower_bound":"MzU0NTI2MQ==","upper_bound":"MzU0OTcyMw==","repeats":1},{"count":3580000,"lower_bound":"MzU1MDM1Nw==","upper_bound":"MzU2MDE5Mw==","repeats":1},{"count":3600000,"lower_bound":"MzU2MDI2OQ==","upper_bound":"MzU2Mzg2MA==","repeats":1},{"count":3620000,"lower_bound":"MzU2ODYyMQ==","upper_bound":"MzU3ODE4NA==","repeats":1},{"count":3640000,"lower_bound":"MzYwMDQyMw==","upper_bound":"MzYwOTQ4MQ==","repeats":1},{"count":3660000,"lower_bound":"MzYxNDQ2NA==","upper_bound":"MzYyMjk0NA==","repeats":1},{"count":3680000,"lower_bound":"MzY0MzI0Mg==","upper_bound":"MzY1NzcwOA==","repeats":1},{"count":3700000,"lower_bound":"MzY1ODMzNA==","upper_bound":"MzY2OTYxMA==","repeats":1},{"count":3720000,"lower_bound":"MzY3MjM2NQ==","upper_bound":"MzY4NzY0MQ==","repeats":1},{"count":3740000,"lower_bound":"MzcwMDkyOQ==","upper_bound":"MzcyNDMzOA==","repeats":1},{"count":3760000,"lower_bound":"MzczMzMyNw==","upper_bound":"Mzc0MDU3OA==","repeats":1},{"count":3780000,"lower_bound":"Mzc0MzI4Mw==","upper_bound":"Mzc1MjcwNw==","repeats":1},{"count":3800000,"lower_bound":"Mzc1NTgzMA==","upper_bound":"Mzc2MzI0NA==","repeats":1},{"count":3820000,"lower_bound":"Mzc2NTMzMA==","upper_bound":"Mzc3NzkzNg==","repeats":1},{"count":3840000,"lower_bound":"Mzc4MTA3OA==","upper_bound":"Mzc5MzQ4NA==","repeats":1},{"count":3860000,"lower_bound":"MzgwNjc5OA==","upper_bound":"MzgyODE4Nw==","repeats":1},{"count":3880000,"lower_bound":"MzgzMzIwNA==","upper_bound":"Mzg4MjY4NA==","repeats":1},{"count":3900000,"lower_bound":"Mzg4NTA0Mw==","upper_bound":"MzkwMTI1MQ==","repeats":1},{"count":3920000,"lower_bound":"MzkwNzUwNw==","upper_bound":"MzkyNTY5Mw==","repeats":1},{"count":3940000,"lower_bound":"MzkzMTcxOQ==","upper_bound":"Mzk0MTc3OA==","repeats":1},{"count":3960000,"lower_bound":"Mzk0MjI2OA==","upper_bound":"Mzk1NDk0MQ==","repeats":1},{"count":3980000,"lower_bound":"Mzk1NDk1Mg==","upper_bound":"Mzk2MzczNw==","repeats":1},{"count":4000000,"lower_bound":"Mzk2MzkzMQ==","upper_bound":"Mzk4MjY2MA==","repeats":1},{"count":4020000,"lower_bound":"Mzk4ODE2OA==","upper_bound":"NDAxMjU3Ng==","repeats":1},{"count":4040000,"lower_bound":"NDAxMzc4MQ==","upper_bound":"NDAyMTQ3NQ==","repeats":1},{"count":4060000,"lower_bound":"NDAyMjkxNw==","upper_bound":"NDAzNzY0MA==","repeats":1},{"count":4080000,"lower_bound":"NDA0MjU3MQ==","upper_bound":"NDA2MDIyNA==","repeats":1},{"count":4100000,"lower_bound":"NDA2MTU5MQ==","upper_bound":"NDA2NDg4Nw==","repeats":1},{"count":4120000,"lower_bound":"NDA2NzM3OQ==","upper_bound":"NDA4NjUzNQ==","repeats":1},{"count":4140000,"lower_bound":"NDEwMDc5Mw==","upper_bound":"NDEwMjAwMg==","repeats":1},{"count":4160000,"lower_bound":"NDEwMjE2Mg==","upper_bound":"NDExMjU0OA==","repeats":1},{"count":4180000,"lower_bound":"NDExNjU0OA==","upper_bound":"NDEzMzc0Mg==","repeats":1},{"count":4200000,"lower_bound":"NDEzNjI0Nw==","upper_bound":"NDE1ODQwMg==","repeats":1},{"count":4220000,"lower_bound":"NDE2MzA4Mg==","upper_bound":"NDE3ODg0Ng==","repeats":1},{"count":4240000,"lower_bound":"NDE4NDI0NQ==","upper_bound":"NDE4OTYxMA==","repeats":1},{"count":4260000,"lower_bound":"NDE5MTA1Nw==","upper_bound":"NDIyMTgwMQ==","repeats":1},{"count":4280000,"lower_bound":"NDIzMTk5Ng==","upper_bound":"NDI0MzQ1Nw==","repeats":1},{"count":4300000,"lower_bound":"NDI1MDI4OA==","upper_bound":"NDI1ODUxMA==","repeats":1},{"count":4320000,"lower_bound":"NDI2Nzk1OQ==","upper_bound":"NDI3NTAzNA==","repeats":1},{"count":4340000,"lower_bound":"NDI3Njk2Ng==","upper_bound":"NDI4OTIxMA==","repeats":1},{"count":4360000,"lower_bound":"NDI5NTAwNw==","upper_bound":"NDMwMjUwOA==","repeats":1},{"count":4380000,"lower_bound":"NDMwMjUxNA==","upper_bound":"NDMwNzkyNA==","repeats":1},{"count":4400000,"lower_bound":"NDMxMjE2NQ==","upper_bound":"NDMxOTU1NQ==","repeats":1},{"count":4420000,"lower_bound":"NDMyMzMzOQ==","upper_bound":"NDM0MTQ3Mw==","repeats":1},{"count":4440000,"lower_bound":"NDM0MjA0OQ==","upper_bound":"NDM1Mzk2Mg==","repeats":1},{"count":4460000,"lower_bound":"NDM1NTk4Mg==","upper_bound":"NDM3MjE2OA==","repeats":1},{"count":4480000,"lower_bound":"NDM3Mjk1NQ==","upper_bound":"NDM5NzA0Ng==","repeats":1},{"count":4500000,"lower_bound":"NDM5NzkyMQ==","upper_bound":"NDQxNjA0Nw==","repeats":1},{"count":4520000,"lower_bound":"NDQyMTExMg==","upper_bound":"NDQ0NDU1NQ==","repeats":1},{"count":4540000,"lower_bound":"NDQ1NzI4MA==","upper_bound":"NDQ2ODEyMg==","repeats":1},{"count":4560000,"lower_bound":"NDQ3NzEwNA==","upper_bound":"NDQ4NjA1NQ==","repeats":1},{"count":4580000,"lower_bound":"NDQ5OTA1Mw==","upper_bound":"NDUxMDQ5Mw==","repeats":1},{"count":4600000,"lower_bound":"NDUxNzE3NQ==","upper_bound":"NDU0NDgyOQ==","repeats":1},{"count":4620000,"lower_bound":"NDU0NzI3Mw==","upper_bound":"NDU3MDQzNQ==","repeats":1},{"count":4640000,"lower_bound":"NDU3MzY5NA==","upper_bound":"NDU4NTk1OA==","repeats":1},{"count":4660000,"lower_bound":"NDU4NzQwOA==","upper_bound":"NDU5NDIxNw==","repeats":1},{"count":4680000,"lower_bound":"NDU5NjM1OQ==","upper_bound":"NDYwMDgwMg==","repeats":1},{"count":4700000,"lower_bound":"NDYwODQxNA==","upper_bound":"NDYyNjMwOA==","repeats":1},{"count":4720000,"lower_bound":"NDYyNzkyOQ==","upper_bound":"NDY0NTg1MQ==","repeats":1},{"count":4740000,"lower_bound":"NDY1MTQxNQ==","upper_bound":"NDY3NzYxMw==","repeats":1},{"count":4760000,"lower_bound":"NDY4ODE5Mw==","upper_bound":"NDY5ODcxNg==","repeats":1},{"count":4780000,"lower_bound":"NDcwMDkzOA==","upper_bound":"NDcwOTQ5Mg==","repeats":1},{"count":4800000,"lower_bound":"NDcyOTc3Mg==","upper_bound":"NDc0MDI5Mw==","repeats":1},{"count":4820000,"lower_bound":"NDc0ODUzMg==","upper_bound":"NDc3MTU2NQ==","repeats":1},{"count":4840000,"lower_bound":"NDc3Mzk5MA==","upper_bound":"NDc4NTM0Nw==","repeats":1},{"count":4860000,"lower_bound":"NDc5NDA5Ng==","upper_bound":"NDgwNjQxMg==","repeats":1},{"count":4880000,"lower_bound":"NDgxMzQ3MA==","upper_bound":"NDgzMDMxMg==","repeats":1},{"count":4900000,"lower_bound":"NDg0MDExNA==","upper_bound":"NDg3MDIwOA==","repeats":1},{"count":4920000,"lower_bound":"NDg4NDQ1Mw==","upper_bound":"NDkwNDgwNw==","repeats":1},{"count":4940000,"lower_bound":"NDkwNTE3NQ==","upper_bound":"NDkyODI2Nw==","repeats":1},{"count":4960000,"lower_bound":"NDkzNjIyMQ==","upper_bound":"NDkzOTUwOQ==","repeats":1},{"count":4980000,"lower_bound":"NDk0ODE5NA==","upper_bound":"NDk2MTQ3Nw==","repeats":1},{"count":5000000,"lower_bound":"NDk4MjIwOA==","upper_bound":"NDk5NzIzMQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2440,2365,2430,2467,2401,2389,2522,2512,2454,2441,2459,2454,2499,2339,2370,2509,2448,2437,2474,2395,2527,2484,2410,2511,2492,2363,2439,2387,2444,2475,2396,2442,2374,2455,2488,2385,2402,2483,2439,2483,2459,2395,2465,2458,2312,2409,2440,2405,2347,2453,2502,2344,2436,2461,2367,2286,2522,2380,2424,2439,2416,2440,2425,2392,2412,2418,2411,2435,2464,2377,2289,2460,2452,2520,2498,2490,2499,2417,2381,2418,2438,2450,2544,2447,2439,2505,2427,2449,2419,2494,2403,2336,2485,2487,2441,2402,2482,2395,2511,2433,2462,2417,2432,2387,2451,2446,2518,2457,2371,2470,2327,2458,2467,2366,2459,2508,2424,2472,2510,2475,2412,2398,2464,2439,2441,2475,2458,2415,2400,2464,2398,2540,2420,2513,2463,2477,2571,2424,2472,2443,2420,2409,2439,2437,2432,2362,2326,2437,2419,2414,2444,2485,2458,2432,2487,2453,2405,2702,2413,2415,2484,2503,2376,2365,2402,2441,2502,2388,2452,2422,2436,2406,2469,2396,2476,2477,2516,2486,2514,2433,2434,2461,2431,2444,2344,2423,2377,2440,2432,2395,2513,2474,2503,2411,2437,2452,2392,2299,2418,2338,2427,2472,2402,2510,2370,2505,2463,2477,2498,2442,2393,2452,2493,2503,2419,2468,2365,2430,2404,2359,2528,2501,2485,2465,2375,2521,2484,2446,2453,2512,2529,2467,2437,2499,2469,2363,2489,2425,2413,2480,2454,2399,2374,2440,2443,2462,2413,2446,2415,2474,2384,2533,2471,2352,2430,2356,2480,2480,2451,2444,2445,2517,2363,2422,2459,2378,2521,2382,2494,2438,2436,2408,2424,2440,2434,2499,2437,2434,2472,2353,2447,2600,2369,2422,2438,2385,2411,2386,2387,2373,2425,2428,2371,2463,2366,2443,2444,2438,2391,2389,2328,2419,2473,2438,2493,2375,2504,2449,2479,2466,2443,2345,2363,2599,2433,2439,2442,2444,2471,2355,2471,2437,2435,2412,2390,2370,2360,2394,2432,2436,2387,2454,2499,2386,2350,2328,2355,2410,2338,2518,2449,2461,2422,2421,2412,2459,2429,2451,2398,2353,2459,2433,2391,2504,2408,2477,2439,2497,2516,2531,2353,2388,2311,2439,2413,2386,2451,2445,2458,2439,2439,2436,2428,2357,2343,2434,2352,2519,2435,2525,2475,2402,2432,2491,2530,2408,2395,2432,2432,2425,2447,2347,2404,2385,2366,2454,2485,2376,2309,2409,2466,2448,2449,2425,2457,2425,2422,2436,2399,2261,2462,2408,2452,2439,2386,2374,2502,2411,2443,2518,2390,2377,2429,2447,2484,2458,2390,2378,2430,2463,2382,2443,2431,2466,2472,2385,2387,2572,2343,2442,2463,2377,2471,2462,2406,2541,2419,2438,2449,2479,2406,2394,2391,2447,2359,2465,2493,2512,2380,2447,2379,2537,2488,2431,2377,2432,2440,2404,2516,2453,2362,2473,2426,2496,2364,2431,2451,2448,2430,2406,2479,2431,2451,2452,2450,2430,2442,2480,2440,2400,2434,2411,2476,2436,2448,2384,2443,2482,2528,2311,2449,2397,2507,2484,2437,2469,2447,2385,2406,2324,2485,2423,2395,2473,2406,2417,2466,2366,2461,2461,2440,2480,2392,2434,2499,2469,2396,2473,2532,2471,2485,2375,2540,2396,2548,2434,2410,2390,2436,2455,2381,2380,2502,2387,2441,2434,2393,2404,2473,2585,2435,2405,2356,2438,2430,2401,2479,2395,2396,2375,2383,2483,2477,2445,2422,2425,2458,2471,2470,2480,2440,2379,2410,2421,2394,2404,2367,2428,2498,2436,2417,2440,2475,2511,2526,2424,2415,2467,2399,2515,2505,2327,2446,2541,2488,2470,2447,2420,2440,2402,2402,2466,2468,2504,2531,2432,2541,2403,2404,2439,2406,2474,2504,2475,2431,2478,2425,2414,2449,2469,2434,2433,2394,2470,2432,2437,2306,2483,2417,2371,2419,2419,2467,2438,2426,2501,2446,2486,2376,2500,2388,2410,2429,2391,2368,2465,2397,2453,2415,2456,2451,2467,2388,2435,2464,2458,2424,2437,2418,2493,2472,2417,2316,2462,2496,2438,2406,2425,2457,2448,2405,2383,2463,2421,2424,2283,2474,2564,2482,2339,2417,2405,2386,2313,2379,2432,2474,2450,2441,2390,2388,2418,2466,2445,2475,2447,2440,2431,2476,2395,2438,2356,2383,2441,2508,2484,2438,2440,2439,2498,2403,2456,2482,2426,2417,2461,2385,2423,2441,2438,2417,2542,2390,2337,2468,2469,2462,2555,2491,2364,2422,2335,2440,2408,2435,2397,2388,2494,2465,2397,2395,2443,2405,2478,2383,2365,2450,2424,2437,2439,2427,2396,2377,2422,2506,2440,2476,2393,2371,2450,2421,2405,2408,2426,2351,2490,2495,2414,2373,2459,2466,2418,2388,2486,2438,2503,2469,2473,2351,2390,2512,2400,2391,2429,2483,2425,2410,2410,2501,2580,2410,2442,2472,2529,2437,2486,2470,2387,2616,2466,2509,2436,2409,2455,2362,2548,2464,2483,2425,2402,2452,2546,2438,2380,2389,2447,2314,2491,2371,2511,2325,2415,2401,2494,2400,2383,2412,2362,2437,2424,2509,2413,2398,2438,2466,2487,2443,2438,2411,2388,2477,2557,2421,2438,2393,2532,2382,2489,2470,2371,2476,2429,2472,2396,2430,2572,2432,2353,2426,2442,2511,2415,2470,2376,2469,2461,2418,2497,2443,2432,2472,2415,2541,2492,2476,2488,2416,2372,2466,2405,2438,2437,2365,2409,2352,2414,2435,2330,2445,2372,2434,2401,2483,2408,2451,2367,2428,2424,2461,2466,2455,2509,2404,2446,2377,2468,2569,2442,2386,2463,2408,2536,2468,2425,2421,2448,2438,2438,2388,2530,2410,2497,2453,2405,2423,2392,2475,2430,2425,2496,2380,2413,2518,2438,2478,2484,2469,2388,2375,2398,2448,2443,2440,2498,2484,2402,2475,2391,2359,2476,2411,2452,2459,2440,2415,2473,2448,2421,2433,2450,2441,2359,2412,2524,2429,2419,2436,2455,2444,2411,2445,2431,2442,2359,2491,2442,2495,2431,2491,2431,2379,2414,2395,2433,2454,2342,2498,2474,2407,2445,2273,2464,2439,2519,2379,2505,2415,2476,2449,2366,2470,2396,2453,2470,2440,2436,2471,2395,2450,2293,2373,2383,2441,2452,2414,2392,2434,2464,2560,2354,2462,2390,2349,2378,2452,2405,2325,2486,2481,2412,2399,2455,2399,2438,2477,2435,2461,2413,2379,2549,2445,2434,2440,2464,2411,2412,2358,2438,2436,2429,2415,2434,2469,2395,2374,2508,2431,2446,2437,2344,2462,2448,2440,2493,2415,2448,2440,2517,2409,2462,2508,2392,2431,2403,2436,2429,2464,2438,2428,2396,2441,2392,2468,2440,2502,2450,2430,2424,2394,2504,2399,2405,2446,2389,2322,2415,2452,2524,2473,2370,2414,2444,2420,2467,2423,2438,2372,2428,2438,2382,2346,2439,2370,2362,2469,2487,2410,2462,2357,2439,2551,2513,2488,2442,2429,2497,2443,2421,2485,2398,2411,2440,2436,2453,2428,2415,2379,2364,2418,2532,2419,2509,2436,2452,2510,2450,2379,2371,2437,2368,2400,2398,2493,2434,2544,2327,2436,2411,2453,2468,2365,2436,2481,2415,2490,2412,2479,2345,2462,2441,2376,2439,2562,2419,2475,2471,2606,2429,2437,2460,2533,2456,2454,2362,2416,2457,2381,2534,2414,2484,2387,2392,2431,2516,2514,2417,2372,2468,2446,2460,2452,2517,2472,2417,2430,2397,2427,2452,2417,2420,2525,2450,2358,2472,2417,2477,2437,2447,2427,2542,2460,2436,2419,2478,2473,2445,2454,2406,2379,2489,2390,2534,2411,2416,2451,2413,2480,2517,2409,2395,2387,2430,2430,2401,2412,2417,2381,2454,2414,2460,2383,2539,2399,2497,2374,2337,2491,2418,2472,2531,2399,2475,2420,2401,2436,2416,2438,2447,2420,2488,2367,2362,2450,2560,2466,2494,2496,2449,2421,2473,2419,2468,2430,2475,2444,2418,2444,2476,2400,2431,2522,2535,2535,2445,2437,2387,2377,2354,2356,2462,2434,2387,2468,2472,2521,2447,2372,2436,2404,2467,2406,2524,2388,2356,2519,2309,2390,2348,2408,2443,2386,2344,2462,2290,2533,2394,2427,2457,2369,2495,2439,2477,2495,2389,2334,2534,2464,2373,2435,2439,2341,2480,2388,2457,2410,2427,2457,2416,2448,2385,2414,2458,2397,2392,2448,2470,2455,2476,2436,2454,2436,2365,2472,2400,2382,2552,2454,2578,2387,2437,2441,2471,2378,2466,2392,2439,2409,2410,2409,2452,2495,2433,2404,2460,2409,2434,2424,2438,2439,2406,2462,2419,2607,2330,2458,2506,2369,2401,2458,2422,2381,2437,2483,2448,2474,2426,2443,2443,2361,2487,2426,2487,2473,2461,2409,2415,2315,2394,2487,2366,2336,2458,2412,2439,2328,2435,2438,2410,2442,2423,2434,2478,2428,2415,2356,2478,2350,2423,2411,2426,2454,2439,2439,2449,2497,2330,2464,2472,2486,2462,2404,2455,2511,2451,2553,2428,2416,2478,2416,2417,2494,2465,2445,2391,2289,2464,2448,2465,2426,2492,2403,2413,2459,2454,2560,2425,2442,2466,2404,2449,2418,2453,2422,2489,2404,2443,2468,2445,2446,2349,2426,2465,2517,2498,2521,2422,2408,2481,2453,2432,2367,2534,2355,2473,2455,2385,2404,2369,2499,2411,2507,2398,2414,2389,2289,2422,2423,2415,2396,2432,2415,2430,2425,2352,2479,2452,2424,2504,2477,2402,2489,2489,2414,2388,2512,2512,2494,2464,2434,2493,2428,2439,2478,2477,2435,2443,2447,2445,2535,2438,2501,2366,2358,2493,2473,2386,2376,2443,2388,2440,2449,2492,2448,2462,2480,2509,2437,2422,2419,2507,2363,2369,2483,2450,2496,2389,2402,2426,2440,2401,2405,2415,2425,2461,2467,2479,2416,2428,2396,2490,2490,2519,2470,2448,2441,2458,2494,2473,2475,2683,2460,2387,2473,2402,2475,2456,2440,2425,2456,2368,2470,2337,2439,2354,2440,2457,2533,2426,2437,2415,2418,2461,2498,2475,2467,2366,2354,2536,2438,2438,2439,2484,2369,2464,2434,2500,2407,2505,2312,2458,2396,2479,2439,2467,2439,2374,2422,2369,2363,2471,2410,2497,2484,2326,2524,2371,2450,2402,2456,2403,2415,2392,2384,2448,2371,2483,2381,2416,2373,2407,2384,2450,2440,2380,2393,2512,2359,2464,2436,2403,2394,2441,2425,2346,2461,2403,2356,2417,2493,2370,2502,2461,2524,2437,2357,2556,2453,2474,2476,2437,2420,2463,2453,2517,2443,2425,2437,2419,2466,2395,2410,2470,2414,2361,2339,2415,2502,2424,2429,2436,2355,2369,2465,2391,2447,2438,2404,2482,2436,2444,2422,2460,2419,2425,2485,2464,2483,2371,2326,2416,2381,2390,2452,2446,2421,2399,2419,2421,2439,2394,2478,2441,2463,2375,2346,2446,2465,2401,2447,2426,2471,2452,2430,2482,2413,2409,2466,2438,2469,2410,2450,2507,2490,2393,2412,2479,2426,2403,2437,2399,2494,2430,2436,2364,2401,2436,2438,2444,2436,2456,2425,2503,2395,2415,2442,2374,2404,2441,2465,2424,2364,2416,2451,2424,2415,2420,2484,2489,2484,2412,2421,2498,2473,2405,2529,2570,2469,2418,2442,2408,2399,2487,2465,2397,2458,2405,2413,2332,2396,2346,2429,2465,2410,2478,2424,2406,2312,2512,2399,2437,2494,2436,2508,2446,2354,2449,2401,2482,2502,2390,2458,2420,2327,2455,2511,2451,2363,2439,2504,2461,2435,2442,2552,2412,2438,2454,2442,2503,2421,2462,2379,2420,2454,2448,2422,2388,2369,2385,2436,2403,2424,2441,2411,2440,2437,2401,2455,2345,2504,2515,2452,2479,2440,2317,2416,2433,2469,2488,2407,2380,2482,2448,2446,2436,2481,2410,2432,2537,2482,2422,2492,2438,2506,2488,2424,2437,2350,2409,2403,2424,2424,2455,2448,2412,2444,2519,2455,2489,2495,2441,2473,2444,2506,2521,2408,2488,2445,2464,2437,2325,2412,2479,2490,2460,2379,2465,2497,2563,2388,2451,2544,2469,2457,2414,2463,2299,2518,2389,2346,2490,2487,2468,2439,2372,2487,2422,2467,2439,2421,2495,2356,2383,2413,2440,2464,2412,2437,2453,2457,2463,2445,2348,2462,2485,2435,2483,2417,2456,2383,2495,2440,2464,2386,2481,2493,2382,2480,2445,2456,2449,2363,2412,2516,2367,2455,2424,2534,2440,2405,2459,2361,2487,2366,2386,2502,2436,2453,2522,2386,2441,2473,2488,2416,2491,2338,2431,2476,2255,2469,2410,2493,2460,2453,2437,2416,2438,2393,2391,2497,2457,2383,2439,2430,2484,2370,2473,2342,2412]},{"counters":[2415,2350,2411,2363,2355,2446,2421,2418,2416,2453,2427,2452,2403,2347,2468,2437,2407,2452,2449,2383,2422,2438,2443,2379,2473,2366,2425,2503,2441,2462,2494,2397,2390,2461,2342,2503,2429,2424,2419,2360,2456,2481,2445,2437,2392,2413,2470,2426,2325,2424,2385,2380,2461,2431,2415,2351,2438,2425,2454,2485,2429,2403,2426,2356,2439,2472,2495,2442,2255,2326,2481,2410,2418,2456,2437,2542,2495,2466,2502,2436,2401,2508,2436,2405,2437,2415,2441,2436,2476,2311,2467,2546,2419,2486,2388,2449,2468,2361,2366,2442,2471,2386,2485,2459,2416,2440,2432,2530,2403,2526,2497,2338,2369,2391,2439,2378,2406,2438,2506,2487,2438,2449,2498,2426,2507,2505,2486,2355,2455,2416,2392,2417,2415,2437,2423,2462,2402,2372,2319,2425,2449,2394,2388,2458,2488,2402,2439,2499,2385,2421,2470,2562,2460,2412,2389,2391,2399,2381,2389,2409,2517,2468,2401,2404,2414,2509,2424,2435,2510,2479,2496,2521,2442,2412,2504,2436,2464,2477,2411,2441,2515,2475,2388,2400,2480,2526,2453,2393,2508,2336,2488,2424,2443,2371,2376,2417,2434,2512,2413,2441,2462,2426,2544,2413,2469,2422,2374,2388,2493,2479,2349,2349,2449,2542,2443,2465,2386,2513,2493,2601,2399,2419,2392,2455,2439,2448,2540,2461,2427,2439,2424,2404,2356,2420,2388,2376,2415,2436,2481,2516,2474,2385,2310,2506,2492,2439,2437,2443,2454,2548,2475,2341,2492,2378,2425,2430,2408,2404,2368,2497,2463,2447,2409,2427,2468,2426,2478,2337,2439,2371,2416,2470,2516,2437,2439,2589,2457,2444,2477,2545,2394,2452,2627,2389,2427,2485,2520,2369,2382,2424,2448,2414,2366,2442,2436,2474,2462,2412,2374,2409,2433,2481,2461,2480,2406,2404,2433,2448,2397,2370,2498,2510,2324,2415,2368,2459,2445,2389,2503,2440,2515,2374,2406,2514,2427,2412,2423,2352,2505,2494,2476,2440,2420,2446,2323,2424,2401,2417,2412,2436,2443,2491,2449,2429,2451,2471,2494,2463,2466,2465,2420,2491,2407,2350,2480,2438,2342,2450,2481,2469,2466,2481,2410,2460,2468,2424,2427,2491,2483,2451,2455,2478,2390,2420,2449,2465,2485,2437,2410,2380,2345,2551,2395,2435,2506,2431,2408,2436,2518,2421,2381,2539,2475,2420,2415,2392,2397,2338,2458,2443,2429,2521,2485,2372,2459,2358,2433,2321,2505,2428,2438,2442,2335,2486,2389,2438,2417,2438,2405,2436,2414,2508,2402,2455,2379,2428,2421,2378,2384,2402,2436,2386,2432,2369,2423,2362,2471,2452,2383,2393,2285,2477,2542,2489,2441,2436,2426,2387,2449,2405,2521,2500,2385,2409,2444,2436,2414,2436,2498,2439,2465,2446,2471,2429,2313,2470,2459,2424,2465,2447,2525,2439,2391,2420,2392,2437,2376,2412,2492,2492,2445,2445,2442,2462,2413,2438,2497,2432,2433,2392,2477,2461,2433,2506,2437,2441,2441,2368,2386,2425,2389,2321,2399,2519,2353,2453,2449,2525,2451,2445,2323,2419,2514,2450,2421,2504,2356,2438,2402,2426,2385,2411,2456,2461,2396,2438,2356,2342,2421,2477,2439,2468,2422,2465,2458,2417,2448,2447,2438,2527,2412,2406,2445,2416,2442,2456,2419,2417,2436,2485,2437,2456,2355,2446,2458,2418,2471,2425,2460,2457,2390,2410,2461,2432,2483,2366,2440,2441,2378,2483,2446,2343,2388,2461,2408,2372,2389,2438,2467,2439,2412,2573,2415,2382,2342,2439,2487,2465,2483,2436,2463,2401,2464,2419,2486,2442,2504,2424,2423,2426,2443,2471,2471,2476,2466,2460,2415,2475,2340,2329,2453,2456,2416,2420,2436,2447,2360,2451,2437,2465,2495,2520,2391,2488,2359,2439,2465,2440,2448,2414,2416,2441,2368,2426,2403,2442,2418,2366,2356,2447,2455,2431,2471,2532,2440,2463,2428,2429,2420,2425,2381,2376,2414,2372,2429,2382,2509,2352,2388,2499,2408,2448,2456,2495,2459,2392,2518,2504,2514,2465,2433,2506,2432,2481,2472,2475,2394,2483,2358,2538,2461,2418,2465,2400,2445,2444,2505,2473,2529,2413,2436,2380,2504,2427,2431,2495,2394,2448,2438,2375,2409,2457,2368,2532,2410,2436,2484,2489,2438,2454,2439,2399,2455,2437,2397,2408,2434,2337,2496,2471,2509,2391,2423,2422,2415,2437,2496,2544,2466,2429,2559,2385,2431,2480,2493,2383,2444,2396,2461,2537,2463,2439,2429,2327,2440,2336,2464,2402,2382,2427,2477,2485,2412,2472,2394,2464,2431,2434,2476,2411,2467,2469,2477,2447,2400,2405,2367,2501,2400,2540,2482,2440,2417,2388,2395,2482,2363,2440,2493,2401,2538,2490,2376,2382,2409,2461,2438,2389,2424,2381,2442,2470,2450,2407,2482,2444,2455,2447,2470,2379,2534,2422,2376,2448,2430,2473,2419,2478,2428,2513,2480,2489,2432,2464,2418,2455,2415,2380,2448,2478,2423,2446,2529,2454,2438,2509,2496,2504,2423,2465,2428,2466,2449,2450,2261,2417,2512,2396,2414,2443,2394,2423,2510,2462,2441,2513,2493,2430,2555,2397,2397,2460,2416,2391,2481,2472,2442,2540,2477,2421,2399,2384,2368,2536,2390,2493,2492,2488,2391,2448,2441,2413,2471,2425,2476,2320,2371,2443,2430,2437,2521,2400,2460,2439,2355,2437,2602,2454,2410,2443,2419,2437,2349,2455,2475,2437,2449,2426,2355,2483,2454,2419,2434,2387,2425,2428,2366,2425,2426,2439,2396,2504,2491,2425,2534,2459,2521,2449,2475,2367,2386,2437,2448,2451,2468,2474,2403,2435,2474,2336,2466,2499,2482,2386,2372,2515,2405,2546,2555,2507,2451,2358,2466,2529,2441,2437,2324,2433,2462,2420,2363,2480,2351,2501,2429,2453,2465,2420,2377,2504,2468,2420,2475,2533,2398,2491,2452,2416,2519,2480,2421,2508,2445,2499,2506,2494,2426,2419,2462,2439,2309,2455,2412,2496,2497,2514,2508,2371,2456,2473,2478,2420,2443,2510,2467,2396,2414,2429,2319,2430,2367,2438,2431,2385,2447,2404,2436,2412,2369,2441,2457,2467,2390,2481,2436,2453,2416,2437,2413,2456,2420,2519,2422,2432,2460,2378,2492,2485,2392,2430,2432,2377,2404,2472,2461,2564,2349,2393,2442,2538,2359,2458,2455,2345,2419,2395,2520,2474,2389,2447,2435,2396,2497,2457,2502,2420,2440,2390,2402,2518,2367,2487,2467,2437,2398,2436,2538,2359,2439,2456,2489,2458,2471,2395,2444,2380,2428,2306,2363,2455,2375,2356,2499,2438,2429,2450,2435,2439,2450,2490,2335,2399,2386,2458,2398,2430,2478,2479,2458,2290,2538,2379,2445,2429,2408,2389,2493,2347,2457,2395,2414,2404,2467,2523,2447,2434,2420,2433,2432,2434,2382,2382,2423,2516,2400,2343,2512,2487,2489,2439,2494,2476,2433,2388,2519,2440,2477,2429,2441,2373,2459,2438,2404,2435,2415,2481,2453,2447,2408,2467,2536,2423,2459,2437,2461,2416,2474,2481,2448,2403,2412,2343,2369,2491,2377,2465,2332,2454,2353,2407,2483,2424,2389,2469,2375,2381,2475,2425,2407,2398,2543,2404,2473,2438,2404,2468,2407,2447,2446,2476,2440,2346,2438,2417,2380,2437,2438,2476,2444,2409,2400,2412,2453,2473,2507,2398,2442,2418,2496,2411,2395,2392,2418,2454,2350,2454,2398,2420,2371,2473,2549,2483,2497,2415,2464,2456,2515,2384,2504,2432,2439,2369,2499,2429,2396,2394,2361,2471,2390,2434,2426,2462,2438,2428,2515,2444,2414,2411,2370,2440,2427,2454,2443,2512,2531,2468,2400,2408,2412,2440,2325,2455,2475,2394,2326,2393,2542,2422,2403,2395,2347,2393,2282,2470,2415,2430,2437,2460,2489,2442,2418,2497,2456,2460,2404,2432,2419,2514,2371,2346,2415,2476,2446,2437,2529,2449,2456,2427,2466,2409,2466,2412,2412,2436,2479,2408,2432,2392,2426,2500,2459,2528,2413,2387,2378,2404,2495,2559,2473,2446,2509,2347,2445,2407,2415,2441,2518,2444,2447,2428,2443,2520,2430,2476,2494,2397,2406,2448,2457,2553,2436,2445,2453,2378,2474,2435,2543,2418,2457,2476,2470,2462,2401,2415,2405,2448,2451,2436,2443,2485,2472,2468,2443,2399,2408,2488,2358,2467,2421,2453,2405,2455,2377,2504,2398,2438,2562,2384,2416,2406,2417,2496,2439,2334,2474,2429,2484,2488,2469,2488,2374,2481,2483,2363,2356,2451,2368,2454,2465,2440,2428,2516,2365,2347,2437,2424,2447,2460,2397,2482,2419,2440,2496,2427,2409,2383,2393,2451,2454,2418,2469,2443,2443,2395,2535,2441,2391,2522,2464,2493,2551,2509,2388,2484,2494,2448,2441,2456,2362,2480,2486,2402,2428,2389,2416,2431,2381,2437,2414,2367,2439,2438,2406,2465,2421,2414,2434,2414,2342,2464,2437,2506,2501,2316,2538,2482,2366,2397,2491,2437,2424,2488,2378,2414,2454,2421,2469,2448,2450,2422,2395,2375,2425,2411,2458,2392,2443,2374,2445,2537,2495,2324,2402,2446,2384,2371,2442,2435,2514,2349,2472,2416,2436,2433,2387,2451,2390,2358,2496,2421,2455,2428,2467,2376,2502,2510,2394,2377,2468,2447,2409,2355,2484,2454,2468,2452,2418,2429,2396,2440,2503,2428,2468,2478,2497,2488,2454,2362,2419,2380,2463,2474,2407,2418,2475,2434,2424,2489,2513,2444,2490,2531,2394,2450,2381,2373,2417,2486,2448,2434,2527,2388,2443,2413,2414,2388,2453,2383,2404,2477,2504,2373,2425,2509,2468,2436,2394,2464,2471,2540,2379,2408,2439,2533,2406,2454,2471,2432,2435,2473,2457,2389,2453,2440,2427,2589,2499,2452,2475,2473,2376,2494,2484,2436,2358,2396,2371,2397,2418,2456,2326,2491,2337,2421,2411,2460,2368,2446,2398,2444,2463,2407,2446,2453,2454,2391,2448,2361,2493,2392,2473,2445,2461,2407,2421,2389,2413,2443,2422,2401,2425,2548,2393,2474,2480,2428,2427,2441,2446,2475,2344,2334,2457,2442,2434,2451,2440,2383,2413,2365,2522,2479,2498,2437,2392,2376,2402,2467,2381,2447,2382,2460,2517,2456,2397,2439,2442,2499,2464,2474,2478,2461,2409,2568,2455,2447,2374,2381,2448,2443,2330,2391,2437,2375,2398,2448,2360,2431,2444,2481,2362,2416,2421,2378,2467,2511,2438,2465,2402,2427,2422,2340,2470,2424,2410,2560,2475,2467,2444,2378,2425,2416,2442,2529,2401,2416,2408,2382,2455,2438,2424,2372,2333,2503,2346,2383,2442,2416,2511,2550,2450,2380,2399,2402,2412,2382,2400,2524,2502,2399,2489,2491,2460,2438,2410,2408,2440,2478,2404,2362,2349,2439,2380,2470,2409,2521,2430,2441,2419,2595,2388,2397,2459,2435,2438,2512,2453,2464,2495,2438,2501,2553,2439,2398,2495,2383,2447,2486,2431,2439,2419,2364,2510,2449,2449,2438,2467,2418,2442,2430,2452,2330,2416,2484,2437,2397,2410,2423,2271,2384,2418,2428,2453,2399,2320,2456,2472,2414,2482,2366,2454,2366,2427,2444,2417,2395,2449,2405,2533,2417,2363,2385,2385,2453,2503,2505,2408,2332,2417,2358,2436,2507,2489,2434,2499,2430,2430,2425,2502,2481,2427,2478,2536,2445,2448,2428,2449,2392,2454,2377,2379,2404,2516,2385,2442,2492,2489,2542,2531,2478,2384,2452,2312,2444,2344,2411,2459,2415,2383,2397,2316,2453,2413,2471,2402,2487,2422,2462,2453,2417,2390,2496,2459,2500,2514,2464,2360,2495,2436,2523,2356,2465,2422,2428,2396,2476,2437,2436,2499,2357,2454,2339,2483,2391,2461,2428,2432,2375,2437,2438,2348,2438,2354,2381,2477,2490,2464,2363,2572,2436,2406,2350,2345,2467,2400,2480,2435,2373,2381,2434,2456,2414,2468,2385,2456,2462,2381,2414,2451,2474,2459,2438,2446,2452,2449,2465,2462,2367,2478,2381,2531,2480,2398,2457,2374,2408,2466,2418,2349,2399,2402,2360,2413,2438,2485,2517,2434,2443,2403,2506,2493,2443,2410,2441,2496,2449,2304,2408,2436,2376,2395,2422,2464,2441,2451,2374,2449,2427,2367,2366,2319,2416,2526,2466,2436,2450,2411,2443,2440,2516,2493,2437,2493,2472,2370,2507,2438,2427,2492,2378,2423,2444,2483,2403,2439,2401,2359,2448,2470,2387,2425,2408,2477,2480,2396,2427,2441,2364,2391,2492,2434,2419,2469,2422,2476,2304,2512,2527]},{"counters":[2424,2427,2433,2398,2428,2579,2440,2414,2415,2470,2482,2387,2460,2479,2454,2437,2432,2384,2412,2384,2410,2426,2478,2433,2361,2440,2457,2446,2482,2345,2429,2419,2438,2415,2465,2439,2333,2417,2489,2435,2520,2510,2504,2428,2452,2387,2420,2429,2390,2407,2493,2433,2454,2435,2405,2454,2466,2443,2445,2490,2445,2431,2397,2491,2386,2403,2386,2468,2424,2478,2492,2423,2428,2457,2359,2424,2367,2452,2349,2508,2482,2389,2478,2441,2440,2426,2384,2351,2394,2467,2480,2407,2385,2404,2423,2438,2384,2434,2440,2416,2392,2430,2412,2447,2486,2482,2402,2395,2508,2401,2466,2436,2490,2359,2452,2438,2408,2358,2330,2488,2383,2411,2471,2477,2533,2427,2424,2412,2499,2431,2409,2391,2414,2436,2439,2505,2477,2432,2402,2445,2412,2407,2516,2372,2360,2491,2390,2469,2395,2459,2543,2405,2435,2486,2308,2501,2456,2495,2384,2483,2440,2423,2451,2393,2464,2453,2367,2478,2379,2351,2473,2410,2515,2501,2469,2411,2440,2381,2446,2449,2486,2428,2494,2437,2412,2511,2450,2436,2408,2444,2438,2496,2443,2454,2457,2513,2495,2464,2527,2440,2469,2510,2416,2451,2391,2463,2460,2398,2355,2512,2361,2472,2379,2431,2488,2467,2409,2514,2412,2500,2480,2436,2352,2407,2439,2437,2463,2432,2460,2391,2449,2369,2381,2476,2440,2486,2427,2436,2416,2423,2429,2461,2443,2412,2421,2442,2505,2438,2383,2423,2403,2566,2449,2485,2434,2442,2465,2493,2422,2492,2379,2474,2413,2444,2471,2534,2365,2516,2533,2500,2453,2419,2405,2455,2406,2489,2442,2417,2441,2457,2490,2466,2420,2405,2373,2374,2422,2370,2437,2420,2395,2481,2493,2440,2440,2412,2387,2443,2437,2472,2362,2433,2460,2448,2434,2498,2531,2437,2453,2439,2373,2468,2346,2315,2391,2369,2418,2431,2477,2382,2425,2414,2449,2402,2490,2336,2489,2408,2443,2448,2488,2390,2340,2498,2422,2434,2411,2410,2345,2506,2522,2455,2429,2407,2419,2469,2362,2375,2409,2384,2460,2471,2446,2342,2372,2453,2406,2382,2405,2427,2482,2419,2440,2507,2373,2546,2438,2371,2498,2400,2394,2473,2304,2416,2453,2433,2423,2336,2368,2343,2440,2403,2472,2464,2485,2428,2402,2487,2417,2406,2473,2530,2435,2405,2469,2495,2418,2467,2364,2438,2432,2448,2419,2381,2503,2478,2449,2448,2426,2369,2568,2439,2358,2499,2466,2370,2426,2462,2421,2337,2483,2503,2415,2382,2562,2443,2412,2398,2457,2421,2443,2428,2374,2393,2393,2388,2492,2462,2377,2423,2479,2527,2418,2513,2410,2452,2373,2433,2480,2477,2491,2414,2484,2320,2359,2395,2433,2461,2483,2322,2521,2503,2508,2411,2454,2434,2432,2429,2447,2474,2532,2466,2567,2436,2513,2492,2421,2496,2514,2500,2496,2379,2437,2424,2494,2445,2448,2378,2454,2431,2462,2456,2451,2511,2474,2406,2379,2387,2487,2421,2460,2369,2526,2419,2475,2478,2458,2438,2545,2563,2518,2491,2339,2497,2442,2444,2470,2448,2470,2415,2469,2462,2413,2354,2441,2484,2399,2417,2407,2417,2424,2448,2442,2452,2413,2438,2503,2533,2397,2468,2423,2436,2373,2412,2437,2486,2441,2439,2330,2550,2428,2437,2530,2413,2318,2428,2482,2453,2411,2430,2483,2462,2386,2453,2455,2408,2363,2415,2440,2451,2487,2406,2373,2518,2441,2365,2435,2447,2534,2493,2497,2431,2374,2401,2472,2434,2460,2443,2477,2386,2467,2429,2473,2479,2440,2436,2395,2413,2438,2422,2437,2526,2489,2436,2443,2467,2481,2522,2434,2438,2400,2389,2447,2444,2439,2356,2347,2458,2553,2382,2429,2537,2353,2460,2426,2469,2388,2421,2397,2396,2447,2505,2442,2392,2447,2465,2525,2447,2473,2306,2418,2363,2380,2425,2486,2435,2445,2516,2428,2365,2430,2439,2390,2424,2423,2429,2424,2519,2376,2469,2450,2400,2436,2399,2440,2443,2403,2393,2345,2378,2434,2466,2441,2512,2381,2438,2439,2479,2392,2414,2437,2481,2380,2380,2398,2419,2470,2434,2409,2413,2504,2437,2373,2507,2434,2351,2441,2467,2438,2524,2419,2382,2490,2465,2484,2392,2432,2386,2406,2424,2437,2465,2398,2446,2330,2500,2441,2401,2443,2459,2435,2453,2433,2442,2375,2469,2383,2403,2394,2419,2512,2433,2449,2452,2415,2377,2412,2385,2354,2419,2349,2454,2492,2440,2425,2393,2406,2511,2446,2478,2410,2432,2438,2467,2439,2476,2422,2469,2484,2481,2475,2301,2470,2451,2471,2449,2353,2461,2330,2512,2404,2393,2505,2399,2436,2339,2442,2396,2436,2418,2400,2402,2436,2412,2385,2401,2419,2550,2498,2490,2449,2489,2367,2434,2451,2470,2427,2436,2417,2433,2452,2454,2469,2471,2464,2416,2489,2491,2436,2482,2378,2486,2322,2354,2459,2469,2385,2424,2437,2472,2469,2362,2500,2430,2425,2445,2534,2509,2452,2475,2415,2438,2455,2454,2446,2474,2357,2368,2409,2415,2466,2429,2511,2408,2475,2406,2406,2470,2410,2438,2490,2431,2417,2442,2416,2485,2386,2482,2533,2443,2439,2440,2381,2372,2369,2474,2429,2459,2340,2504,2491,2457,2481,2474,2423,2399,2417,2441,2552,2350,2441,2456,2536,2445,2342,2433,2466,2501,2434,2381,2380,2390,2517,2437,2357,2583,2374,2432,2449,2469,2429,2488,2395,2371,2349,2367,2348,2488,2423,2371,2492,2456,2507,2466,2420,2410,2413,2367,2335,2404,2413,2571,2394,2402,2454,2422,2373,2486,2515,2370,2435,2504,2466,2439,2437,2466,2465,2415,2535,2443,2327,2346,2303,2478,2385,2363,2523,2484,2430,2453,2437,2426,2423,2409,2416,2439,2502,2416,2470,2359,2446,2548,2440,2485,2459,2468,2371,2423,2394,2411,2504,2482,2404,2441,2461,2395,2442,2473,2440,2415,2449,2485,2475,2349,2343,2440,2382,2508,2435,2429,2441,2435,2380,2388,2437,2393,2316,2467,2417,2437,2394,2352,2425,2451,2462,2451,2459,2413,2381,2413,2425,2443,2441,2433,2460,2505,2463,2520,2479,2429,2461,2388,2469,2461,2379,2454,2478,2504,2367,2468,2499,2538,2407,2483,2461,2458,2508,2467,2415,2444,2439,2473,2466,2383,2423,2408,2457,2439,2484,2499,2517,2425,2457,2452,2424,2304,2384,2481,2526,2425,2449,2418,2433,2473,2430,2454,2447,2466,2451,2387,2455,2409,2465,2358,2486,2402,2422,2440,2424,2430,2450,2346,2440,2432,2490,2444,2449,2509,2439,2426,2428,2506,2438,2419,2498,2509,2374,2408,2373,2413,2390,2400,2436,2430,2454,2376,2437,2472,2389,2446,2407,2436,2437,2474,2413,2396,2482,2514,2383,2443,2373,2397,2388,2466,2422,2449,2418,2441,2384,2411,2433,2429,2404,2429,2470,2418,2506,2481,2507,2369,2484,2364,2440,2512,2457,2457,2456,2439,2557,2438,2453,2372,2454,2440,2456,2451,2409,2434,2475,2459,2490,2425,2427,2454,2497,2435,2439,2460,2401,2422,2480,2491,2498,2407,2410,2450,2342,2360,2446,2429,2455,2437,2333,2344,2410,2472,2451,2503,2414,2440,2454,2456,2394,2495,2267,2453,2375,2469,2376,2390,2478,2536,2437,2427,2409,2398,2417,2518,2443,2454,2422,2481,2422,2449,2431,2468,2442,2410,2471,2454,2453,2434,2495,2425,2483,2467,2383,2392,2432,2444,2440,2411,2438,2400,2442,2393,2404,2411,2477,2551,2377,2389,2493,2348,2583,2428,2436,2432,2487,2469,2461,2422,2447,2385,2473,2463,2457,2440,2366,2436,2449,2447,2418,2467,2441,2428,2404,2408,2399,2437,2375,2447,2417,2527,2521,2364,2501,2446,2521,2440,2493,2421,2452,2403,2438,2465,2439,2405,2362,2516,2438,2460,2470,2405,2481,2409,2466,2443,2416,2389,2421,2355,2484,2494,2473,2432,2571,2398,2468,2435,2430,2346,2412,2428,2462,2406,2453,2485,2390,2401,2371,2485,2452,2454,2442,2423,2421,2430,2431,2392,2493,2428,2480,2403,2385,2453,2518,2392,2508,2437,2480,2437,2463,2339,2483,2446,2373,2439,2387,2432,2451,2405,2550,2475,2380,2410,2479,2463,2458,2451,2499,2413,2493,2387,2477,2429,2447,2439,2408,2413,2395,2505,2439,2406,2338,2415,2423,2445,2530,2434,2477,2438,2439,2544,2453,2438,2407,2441,2428,2433,2429,2456,2449,2372,2360,2391,2355,2416,2488,2382,2508,2346,2470,2380,2426,2411,2328,2414,2331,2454,2418,2389,2451,2350,2413,2487,2395,2437,2364,2416,2538,2492,2545,2425,2389,2458,2438,2503,2472,2478,2457,2439,2403,2545,2505,2505,2375,2439,2420,2458,2556,2470,2407,2386,2416,2462,2386,2452,2497,2486,2409,2476,2359,2434,2458,2518,2469,2445,2464,2440,2462,2412,2437,2532,2448,2370,2374,2501,2376,2431,2446,2416,2444,2367,2501,2478,2408,2472,2418,2460,2294,2484,2445,2525,2453,2445,2401,2482,2463,2465,2425,2354,2398,2439,2484,2445,2462,2423,2401,2455,2404,2379,2440,2436,2402,2350,2415,2508,2369,2377,2417,2413,2419,2448,2470,2402,2424,2437,2437,2415,2491,2449,2383,2458,2394,2434,2452,2403,2436,2407,2371,2452,2370,2399,2532,2481,2382,2552,2375,2409,2511,2458,2400,2450,2488,2496,2370,2362,2354,2368,2469,2464,2396,2406,2445,2448,2421,2436,2458,2480,2422,2509,2436,2518,2485,2481,2521,2482,2426,2420,2440,2493,2352,2501,2460,2561,2364,2411,2331,2425,2344,2486,2465,2493,2470,2372,2508,2379,2382,2436,2429,2377,2389,2436,2516,2387,2504,2432,2389,2354,2490,2454,2450,2490,2438,2497,2387,2519,2426,2476,2434,2440,2388,2451,2357,2472,2505,2456,2393,2430,2375,2459,2464,2475,2424,2475,2458,2405,2350,2492,2425,2454,2309,2441,2427,2315,2552,2442,2405,2424,2502,2442,2478,2482,2513,2464,2423,2410,2366,2515,2342,2371,2467,2348,2445,2473,2374,2454,2524,2441,2436,2499,2453,2450,2438,2425,2426,2492,2366,2411,2435,2467,2391,2395,2473,2448,2484,2445,2441,2429,2407,2352,2352,2336,2486,2456,2448,2458,2456,2437,2443,2447,2416,2427,2422,2419,2478,2524,2481,2441,2380,2414,2529,2419,2350,2467,2496,2408,2434,2438,2486,2417,2466,2395,2475,2416,2469,2427,2473,2420,2426,2428,2432,2414,2484,2533,2474,2454,2454,2471,2439,2373,2529,2469,2419,2494,2379,2401,2438,2429,2434,2327,2405,2443,2457,2396,2444,2446,2447,2432,2371,2507,2371,2456,2483,2423,2539,2437,2443,2383,2417,2490,2476,2463,2361,2488,2431,2415,2413,2444,2384,2471,2397,2412,2437,2409,2453,2422,2390,2447,2434,2466,2381,2494,2434,2419,2452,2453,2455,2339,2404,2424,2312,2436,2488,2370,2446,2382,2356,2447,2400,2459,2421,2377,2469,2403,2438,2408,2363,2415,2440,2414,2371,2473,2441,2534,2341,2432,2439,2441,2454,2413,2458,2476,2446,2435,2469,2512,2378,2441,2378,2502,2427,2454,2399,2369,2436,2494,2402,2423,2406,2372,2492,2515,2422,2420,2387,2459,2479,2448,2455,2492,2453,2437,2436,2506,2344,2407,2443,2425,2515,2398,2439,2476,2411,2455,2356,2425,2457,2443,2371,2428,2422,2437,2463,2472,2422,2482,2447,2521,2445,2463,2440,2488,2423,2405,2412,2507,2426,2389,2443,2526,2478,2436,2440,2527,2462,2483,2399,2398,2416,2443,2458,2449,2464,2390,2435,2394,2399,2369,2457,2346,2478,2394,2333,2424,2436,2468,2436,2426,2399,2383,2495,2504,2517,2522,2387,2436,2416,2372,2403,2336,2370,2382,2516,2403,2466,2480,2472,2436,2370,2427,2543,2465,2381,2504,2440,2513,2428,2358,2501,2440,2436,2469,2468,2458,2547,2434,2495,2459,2484,2431,2427,2439,2466,2395,2441,2414,2381,2437,2464,2358,2395,2408,2465,2357,2520,2401,2451,2440,2434,2418,2465,2389,2337,2447,2463,2470,2416,2420,2381,2443,2434,2423,2438,2399,2460,2511,2488,2374,2390,2384,2410,2352,2448,2338,2325,2426,2455,2463,2459,2440,2426,2379,2427,2393,2478,2414,2319,2469,2441,2434,2455,2392,2389,2391,2434,2445,2478,2436,2439,2417,2435,2433,2411,2404,2431,2436,2509,2411,2389,2426,2438,2396,2517,2421,2403,2442]},{"counters":[2389,2463,2324,2430,2437,2467,2475,2436,2351,2437,2473,2508,2480,2445,2424,2466,2473,2408,2492,2473,2503,2476,2422,2450,2475,2453,2561,2438,2395,2435,2353,2438,2406,2438,2471,2360,2434,2523,2332,2457,2351,2453,2411,2424,2448,2500,2489,2419,2319,2475,2363,2430,2436,2410,2342,2349,2517,2368,2433,2403,2423,2390,2365,2445,2430,2453,2430,2462,2346,2443,2412,2468,2453,2408,2386,2445,2412,2506,2394,2399,2411,2440,2447,2419,2459,2402,2394,2405,2374,2405,2388,2437,2489,2448,2412,2514,2404,2564,2481,2432,2430,2432,2436,2428,2440,2386,2442,2452,2536,2395,2402,2477,2407,2452,2439,2481,2497,2421,2347,2498,2477,2458,2390,2437,2340,2453,2560,2361,2386,2367,2352,2387,2445,2439,2469,2459,2438,2451,2424,2505,2441,2511,2445,2401,2404,2343,2473,2410,2510,2462,2382,2398,2418,2402,2371,2422,2387,2572,2413,2418,2424,2434,2479,2380,2358,2408,2394,2415,2474,2372,2480,2430,2324,2353,2412,2414,2405,2397,2397,2476,2437,2570,2440,2416,2430,2454,2406,2499,2374,2510,2381,2444,2359,2529,2424,2512,2437,2483,2448,2396,2417,2443,2455,2425,2440,2436,2418,2349,2446,2466,2520,2435,2476,2477,2433,2377,2362,2489,2361,2463,2364,2396,2457,2417,2472,2432,2445,2477,2449,2426,2445,2430,2360,2439,2456,2441,2431,2486,2437,2437,2489,2440,2417,2403,2569,2391,2453,2402,2418,2505,2342,2442,2463,2437,2336,2399,2461,2452,2460,2512,2453,2426,2437,2506,2366,2415,2403,2423,2464,2381,2312,2421,2398,2423,2493,2498,2506,2419,2417,2357,2456,2506,2463,2430,2397,2445,2509,2384,2415,2400,2533,2481,2411,2409,2476,2436,2379,2435,2411,2508,2369,2443,2338,2452,2463,2548,2507,2446,2382,2494,2393,2442,2315,2452,2442,2472,2478,2416,2516,2387,2474,2416,2418,2478,2530,2512,2464,2432,2430,2470,2387,2440,2394,2461,2439,2482,2392,2368,2444,2426,2509,2537,2504,2459,2454,2409,2479,2367,2410,2462,2409,2326,2407,2370,2402,2463,2437,2448,2491,2546,2441,2509,2461,2349,2308,2437,2430,2437,2488,2431,2383,2445,2402,2316,2371,2453,2354,2614,2393,2460,2389,2456,2457,2404,2451,2429,2508,2456,2333,2469,2371,2457,2401,2531,2529,2442,2377,2447,2358,2515,2467,2397,2476,2453,2483,2390,2380,2505,2440,2390,2398,2459,2386,2347,2437,2454,2426,2338,2466,2437,2503,2409,2468,2416,2437,2358,2402,2377,2546,2410,2437,2500,2437,2527,2505,2352,2410,2401,2396,2356,2412,2389,2322,2377,2412,2378,2438,2452,2434,2444,2415,2398,2410,2444,2490,2429,2406,2438,2428,2435,2462,2471,2491,2418,2529,2444,2432,2446,2495,2417,2477,2432,2426,2436,2427,2478,2484,2462,2400,2420,2419,2472,2473,2415,2409,2344,2423,2461,2448,2440,2429,2412,2484,2403,2425,2320,2430,2446,2461,2506,2366,2464,2409,2419,2408,2368,2480,2421,2363,2470,2487,2473,2400,2327,2464,2436,2420,2480,2437,2457,2437,2434,2524,2471,2475,2440,2437,2478,2510,2426,2454,2500,2442,2423,2440,2438,2461,2487,2433,2470,2413,2424,2494,2487,2510,2430,2352,2402,2445,2400,2472,2354,2406,2475,2388,2569,2466,2513,2527,2358,2435,2424,2425,2434,2436,2431,2389,2380,2470,2491,2472,2378,2439,2438,2507,2430,2452,2349,2433,2467,2441,2381,2471,2415,2418,2467,2347,2388,2488,2444,2424,2439,2473,2390,2455,2491,2440,2488,2418,2447,2428,2448,2372,2356,2395,2433,2414,2430,2358,2457,2366,2416,2441,2313,2504,2406,2463,2495,2481,2344,2439,2504,2437,2462,2444,2402,2384,2421,2398,2419,2425,2446,2441,2406,2474,2413,2400,2499,2377,2439,2494,2489,2375,2397,2545,2429,2289,2411,2499,2399,2431,2425,2460,2453,2440,2447,2388,2437,2425,2439,2399,2400,2343,2455,2392,2425,2443,2507,2438,2430,2381,2429,2458,2459,2389,2390,2467,2518,2511,2437,2443,2437,2452,2499,2436,2486,2458,2436,2321,2514,2460,2373,2432,2388,2505,2426,2518,2439,2483,2445,2406,2437,2441,2436,2431,2490,2439,2448,2428,2384,2381,2272,2479,2375,2470,2426,2408,2406,2492,2434,2450,2573,2408,2437,2452,2439,2438,2393,2359,2417,2489,2436,2433,2461,2446,2351,2493,2421,2445,2447,2468,2464,2333,2389,2437,2456,2472,2409,2501,2512,2415,2448,2448,2427,2264,2350,2535,2456,2453,2377,2464,2411,2439,2467,2432,2344,2382,2455,2547,2408,2398,2390,2439,2502,2437,2434,2436,2383,2430,2431,2492,2466,2532,2370,2433,2580,2408,2365,2339,2459,2446,2394,2467,2471,2350,2419,2419,2395,2387,2421,2500,2423,2318,2400,2466,2438,2421,2456,2499,2486,2392,2431,2485,2451,2456,2472,2530,2429,2429,2507,2500,2465,2479,2437,2461,2493,2425,2488,2477,2477,2395,2337,2450,2393,2507,2502,2433,2503,2476,2567,2437,2436,2434,2392,2428,2442,2395,2426,2462,2453,2418,2424,2471,2402,2438,2560,2478,2527,2472,2422,2475,2494,2521,2433,2327,2467,2509,2472,2418,2380,2440,2400,2470,2428,2471,2451,2509,2439,2430,2385,2406,2496,2438,2543,2470,2476,2376,2459,2407,2471,2446,2452,2423,2353,2477,2404,2401,2457,2483,2457,2437,2444,2453,2396,2450,2454,2448,2493,2436,2465,2393,2432,2415,2449,2369,2470,2514,2443,2428,2465,2512,2442,2461,2437,2398,2418,2384,2464,2440,2368,2348,2392,2448,2437,2493,2421,2405,2457,2409,2434,2432,2471,2467,2441,2381,2461,2536,2361,2463,2428,2441,2284,2497,2460,2462,2403,2373,2429,2487,2399,2440,2451,2430,2375,2414,2421,2490,2448,2434,2483,2414,2514,2416,2413,2384,2385,2369,2451,2437,2361,2500,2404,2408,2549,2429,2444,2415,2430,2467,2513,2471,2440,2506,2547,2484,2372,2429,2454,2440,2409,2475,2456,2470,2468,2380,2462,2412,2476,2519,2475,2410,2403,2417,2415,2313,2524,2498,2469,2530,2392,2469,2514,2426,2362,2384,2480,2452,2508,2468,2402,2382,2341,2363,2420,2530,2422,2440,2465,2467,2458,2434,2324,2451,2487,2363,2396,2421,2486,2417,2504,2450,2362,2406,2461,2442,2383,2432,2354,2509,2368,2386,2439,2469,2376,2529,2451,2394,2502,2393,2408,2403,2411,2524,2426,2440,2477,2473,2441,2446,2368,2489,2396,2564,2365,2448,2456,2460,2455,2481,2590,2517,2435,2521,2436,2371,2449,2444,2384,2473,2520,2410,2427,2436,2509,2464,2440,2439,2472,2407,2458,2420,2455,2406,2433,2475,2407,2451,2426,2491,2399,2382,2428,2395,2406,2382,2385,2440,2448,2466,2391,2436,2415,2460,2473,2463,2397,2387,2446,2436,2432,2554,2487,2401,2419,2437,2381,2360,2457,2393,2583,2371,2316,2428,2444,2514,2459,2441,2447,2450,2415,2405,2369,2404,2485,2478,2414,2482,2506,2475,2404,2392,2366,2397,2331,2372,2446,2460,2369,2388,2502,2391,2391,2383,2428,2455,2443,2439,2417,2364,2468,2393,2463,2482,2400,2501,2540,2445,2470,2417,2562,2423,2438,2495,2390,2440,2572,2423,2450,2438,2374,2399,2398,2463,2494,2436,2424,2433,2452,2464,2593,2400,2407,2421,2490,2502,2450,2411,2410,2423,2380,2428,2388,2403,2509,2417,2438,2456,2462,2435,2379,2493,2424,2505,2420,2423,2428,2442,2392,2459,2511,2515,2442,2373,2400,2385,2464,2444,2411,2421,2429,2424,2414,2415,2496,2483,2386,2408,2489,2430,2400,2508,2524,2440,2447,2373,2425,2441,2338,2440,2469,2461,2441,2425,2361,2489,2475,2437,2445,2513,2401,2412,2439,2439,2534,2419,2452,2419,2492,2437,2401,2326,2445,2471,2384,2462,2369,2397,2439,2468,2447,2417,2445,2427,2439,2470,2422,2447,2413,2419,2439,2451,2426,2507,2419,2487,2396,2482,2460,2465,2395,2438,2464,2426,2412,2445,2442,2359,2521,2411,2368,2414,2480,2332,2482,2315,2425,2497,2426,2413,2533,2538,2416,2429,2441,2394,2435,2437,2488,2483,2398,2500,2493,2406,2477,2425,2472,2445,2457,2439,2386,2440,2392,2425,2452,2357,2397,2487,2438,2380,2411,2452,2406,2454,2461,2488,2437,2401,2418,2386,2381,2506,2419,2428,2399,2407,2504,2465,2412,2548,2496,2436,2497,2396,2383,2370,2457,2434,2423,2438,2408,2473,2389,2427,2489,2424,2419,2397,2433,2453,2368,2448,2423,2443,2408,2521,2363,2385,2435,2341,2437,2491,2424,2404,2446,2426,2447,2411,2431,2416,2527,2437,2453,2433,2474,2406,2413,2427,2387,2451,2339,2400,2462,2505,2462,2474,2359,2486,2385,2502,2414,2403,2395,2434,2429,2520,2432,2430,2451,2443,2417,2439,2374,2457,2421,2394,2436,2379,2370,2415,2437,2480,2363,2374,2449,2467,2436,2492,2388,2485,2374,2455,2512,2384,2445,2392,2443,2539,2444,2412,2441,2475,2446,2437,2406,2430,2376,2423,2468,2452,2436,2397,2441,2448,2442,2428,2426,2391,2429,2339,2253,2448,2382,2437,2440,2452,2438,2437,2384,2441,2467,2442,2447,2398,2436,2389,2496,2378,2436,2400,2491,2457,2387,2436,2454,2402,2451,2369,2444,2391,2469,2385,2466,2393,2389,2436,2422,2467,2452,2473,2439,2366,2454,2378,2563,2469,2438,2398,2473,2526,2423,2492,2461,2365,2543,2483,2440,2403,2509,2421,2400,2467,2443,2447,2517,2444,2451,2416,2326,2470,2433,2508,2370,2435,2494,2430,2482,2420,2438,2450,2541,2446,2378,2346,2444,2449,2397,2416,2467,2393,2439,2439,2498,2397,2453,2415,2422,2496,2375,2420,2461,2416,2396,2454,2525,2426,2430,2409,2403,2544,2493,2447,2412,2528,2441,2405,2459,2439,2404,2371,2410,2423,2454,2439,2580,2473,2468,2521,2524,2465,2439,2438,2399,2423,2488,2440,2459,2366,2360,2508,2457,2397,2437,2415,2424,2430,2436,2492,2403,2384,2351,2401,2456,2450,2429,2403,2420,2436,2433,2417,2396,2435,2428,2417,2427,2441,2372,2407,2424,2314,2488,2518,2423,2418,2474,2443,2473,2425,2465,2413,2521,2424,2385,2437,2465,2410,2440,2441,2417,2410,2370,2415,2447,2488,2473,2380,2413,2417,2487,2450,2529,2403,2404,2473,2476,2424,2508,2496,2421,2475,2419,2503,2455,2413,2422,2436,2478,2464,2415,2443,2405,2451,2484,2384,2396,2402,2439,2408,2524,2411,2394,2382,2418,2396,2408,2370,2398,2420,2394,2360,2537,2403,2390,2529,2430,2498,2420,2473,2479,2431,2410,2392,2580,2526,2418,2372,2426,2420,2460,2503,2462,2397,2454,2395,2479,2377,2438,2459,2438,2481,2457,2424,2498,2464,2532,2468,2421,2411,2440,2391,2461,2474,2384,2437,2448,2495,2471,2470,2463,2472,2442,2463,2432,2433,2463,2432,2484,2393,2402,2457,2485,2415,2422,2446,2456,2464,2466,2412,2443,2569,2403,2395,2436,2371,2435,2377,2408,2425,2364,2406,2444,2405,2486,2328,2458,2401,2404,2412,2369,2448,2434,2455,2500,2437,2363,2435,2441,2449,2437,2424,2415,2477,2421,2506,2388,2369,2480,2450,2462,2358,2402,2380,2469,2512,2424,2429,2502,2399,2370,2422,2468,2488,2418,2480,2408,2531,2352,2530,2460,2574,2441,2478,2430,2527,2391,2412,2467,2460,2392,2477,2556,2412,2495,2373,2448,2416,2466,2497,2446,2428,2408,2488,2440,2514,2416,2429,2435,2443,2380,2475,2375,2491,2554,2450,2404,2383,2409,2408,2455,2433,2489,2439,2372,2437,2465,2469,2511,2395,2435,2370,2538,2398,2411,2407,2386,2431,2387,2511,2421,2476,2453,2437,2436,2441,2383,2396,2440,2391,2476,2408,2374,2422,2394,2488,2354,2440,2453,2438,2517,2422,2454,2439,2433,2395,2476,2405,2505,2432,2441,2321,2434,2395,2423,2472,2407,2521,2459,2328,2436,2548,2410,2521,2450,2404,2419,2448,2398,2417,2492,2404,2466,2364,2478,2402,2363,2605,2427,2467,2436,2390,2368,2437,2453,2434,2474,2369,2420,2401,2481,2417,2400,2481,2420,2441,2442,2447,2438,2402,2414,2459,2418,2434,2478,2418,2399,2471,2449,2454,2458,2449,2408,2495,2333,2473,2438,2518,2434,2431,2463]},{"counters":[2474,2414,2463,2391,2448,2443,2508,2436,2481,2404,2445,2387,2440,2431,2401,2434,2416,2455,2348,2455,2479,2408,2475,2378,2359,2461,2404,2542,2476,2425,2413,2476,2451,2476,2409,2413,2393,2496,2501,2451,2376,2406,2470,2387,2425,2450,2451,2378,2475,2386,2551,2477,2387,2544,2401,2416,2508,2480,2371,2445,2446,2408,2422,2427,2412,2467,2365,2381,2410,2513,2347,2423,2469,2519,2444,2438,2560,2508,2428,2479,2505,2535,2463,2515,2423,2429,2466,2470,2433,2494,2441,2480,2384,2485,2454,2415,2420,2464,2466,2402,2428,2378,2443,2461,2465,2390,2513,2457,2397,2437,2507,2523,2457,2357,2455,2424,2386,2469,2422,2556,2406,2329,2491,2350,2410,2447,2394,2472,2404,2494,2479,2419,2538,2495,2484,2436,2451,2467,2471,2426,2307,2385,2439,2438,2385,2493,2385,2470,2450,2421,2373,2456,2413,2367,2455,2410,2373,2369,2379,2442,2454,2436,2389,2436,2398,2419,2477,2445,2464,2484,2369,2483,2402,2397,2516,2410,2484,2438,2439,2471,2485,2438,2466,2415,2416,2490,2417,2363,2412,2376,2389,2499,2414,2388,2511,2463,2413,2479,2404,2382,2448,2523,2499,2557,2520,2486,2434,2552,2383,2440,2456,2413,2356,2427,2386,2430,2462,2439,2445,2456,2469,2466,2405,2451,2453,2460,2426,2400,2410,2497,2464,2447,2430,2494,2380,2434,2469,2444,2439,2394,2328,2442,2442,2443,2437,2440,2506,2416,2439,2440,2378,2390,2511,2380,2436,2351,2380,2438,2400,2456,2394,2494,2494,2433,2513,2473,2479,2431,2455,2438,2543,2439,2394,2457,2407,2513,2531,2388,2472,2463,2434,2478,2487,2385,2421,2426,2399,2442,2385,2450,2383,2454,2506,2384,2531,2441,2451,2426,2385,2544,2414,2455,2340,2413,2463,2397,2476,2454,2376,2416,2395,2424,2442,2485,2477,2319,2456,2349,2538,2451,2463,2385,2419,2460,2423,2435,2442,2437,2408,2414,2490,2482,2482,2454,2434,2480,2496,2500,2437,2459,2410,2515,2407,2459,2495,2524,2443,2409,2375,2470,2342,2373,2458,2340,2418,2474,2409,2470,2385,2577,2559,2349,2417,2471,2511,2507,2368,2461,2434,2450,2361,2437,2439,2396,2402,2465,2385,2371,2408,2509,2409,2444,2432,2434,2488,2448,2530,2376,2459,2445,2449,2335,2442,2463,2399,2437,2396,2458,2428,2443,2425,2437,2485,2373,2440,2437,2456,2429,2430,2443,2390,2435,2401,2438,2437,2368,2359,2407,2349,2401,2434,2419,2415,2469,2422,2385,2399,2366,2380,2427,2413,2444,2470,2393,2447,2422,2316,2386,2402,2415,2380,2475,2462,2437,2437,2524,2497,2476,2366,2522,2502,2465,2468,2369,2414,2437,2407,2414,2405,2432,2503,2482,2410,2441,2396,2451,2413,2412,2389,2441,2455,2399,2496,2484,2361,2465,2433,2506,2360,2422,2391,2411,2416,2477,2453,2521,2450,2358,2571,2406,2439,2506,2435,2396,2466,2436,2418,2438,2391,2338,2410,2577,2447,2398,2445,2423,2420,2385,2421,2454,2368,2402,2457,2505,2439,2459,2539,2440,2387,2403,2410,2360,2424,2457,2508,2506,2436,2378,2437,2484,2389,2472,2455,2484,2479,2430,2466,2411,2373,2346,2449,2427,2378,2448,2395,2405,2398,2386,2355,2462,2433,2465,2418,2424,2397,2503,2439,2476,2409,2495,2357,2425,2440,2438,2405,2461,2344,2473,2333,2372,2486,2405,2370,2500,2368,2531,2374,2390,2411,2451,2380,2433,2487,2399,2450,2389,2432,2439,2375,2408,2397,2363,2439,2444,2417,2578,2385,2416,2463,2435,2498,2408,2490,2416,2442,2443,2300,2466,2429,2457,2498,2453,2441,2371,2465,2404,2410,2473,2430,2450,2413,2381,2414,2408,2415,2460,2440,2476,2510,2381,2470,2430,2388,2410,2365,2408,2364,2412,2485,2469,2397,2457,2462,2358,2378,2431,2406,2526,2466,2371,2417,2440,2462,2409,2391,2470,2432,2483,2445,2441,2521,2459,2500,2405,2458,2533,2445,2429,2382,2467,2407,2472,2457,2403,2412,2499,2510,2358,2491,2446,2351,2530,2450,2400,2431,2528,2310,2336,2435,2442,2364,2389,2483,2349,2405,2437,2490,2422,2394,2377,2412,2485,2435,2465,2514,2436,2446,2453,2464,2411,2436,2452,2418,2511,2477,2490,2364,2394,2459,2391,2370,2473,2366,2419,2471,2262,2459,2491,2489,2430,2492,2401,2431,2377,2439,2299,2392,2485,2459,2382,2387,2412,2436,2481,2352,2398,2419,2388,2494,2462,2436,2454,2428,2414,2419,2411,2463,2452,2455,2449,2467,2439,2389,2534,2422,2465,2435,2497,2432,2521,2435,2529,2437,2397,2454,2408,2374,2453,2433,2454,2464,2469,2476,2504,2456,2452,2533,2456,2466,2481,2429,2419,2376,2397,2417,2471,2439,2525,2430,2507,2425,2402,2527,2471,2437,2401,2434,2424,2481,2438,2451,2532,2381,2481,2517,2452,2444,2433,2429,2425,2438,2452,2401,2453,2451,2448,2428,2439,2349,2440,2372,2352,2426,2387,2437,2436,2480,2470,2513,2501,2475,2389,2396,2438,2409,2442,2476,2360,2391,2450,2364,2423,2438,2376,2359,2501,2342,2408,2438,2472,2449,2449,2473,2419,2408,2423,2378,2427,2471,2454,2441,2396,2383,2474,2345,2416,2542,2436,2465,2493,2531,2443,2360,2462,2434,2490,2474,2418,2427,2364,2381,2498,2481,2447,2478,2459,2421,2411,2409,2385,2474,2435,2439,2460,2437,2479,2443,2412,2474,2431,2477,2370,2440,2468,2423,2394,2416,2440,2426,2454,2466,2402,2305,2451,2425,2407,2362,2353,2503,2451,2362,2475,2366,2378,2407,2484,2394,2475,2373,2428,2460,2437,2357,2466,2481,2379,2410,2417,2489,2473,2395,2554,2438,2463,2423,2473,2471,2427,2465,2431,2464,2435,2353,2481,2483,2278,2419,2416,2489,2455,2461,2445,2417,2360,2508,2492,2448,2467,2347,2416,2477,2467,2470,2382,2465,2424,2491,2543,2406,2443,2421,2385,2479,2430,2418,2368,2495,2504,2428,2413,2388,2402,2440,2440,2530,2397,2428,2386,2427,2493,2344,2450,2515,2390,2432,2504,2448,2447,2532,2424,2476,2479,2453,2477,2485,2422,2407,2432,2430,2382,2522,2470,2366,2420,2444,2496,2438,2443,2442,2478,2356,2491,2432,2480,2369,2424,2418,2331,2481,2341,2447,2401,2438,2432,2378,2450,2378,2368,2408,2426,2436,2405,2494,2441,2431,2454,2453,2489,2494,2535,2420,2489,2464,2390,2311,2508,2435,2417,2388,2392,2510,2468,2368,2529,2439,2478,2363,2436,2430,2369,2419,2436,2396,2338,2438,2428,2463,2439,2529,2465,2447,2386,2460,2466,2484,2327,2417,2460,2450,2444,2418,2357,2376,2440,2446,2389,2439,2511,2417,2493,2541,2424,2369,2495,2407,2422,2467,2404,2360,2508,2534,2464,2362,2387,2556,2394,2471,2440,2441,2424,2455,2464,2563,2425,2456,2373,2493,2379,2405,2418,2487,2490,2442,2460,2426,2400,2430,2414,2444,2414,2398,2488,2395,2441,2393,2472,2369,2378,2396,2513,2454,2407,2390,2538,2467,2439,2538,2455,2394,2439,2365,2414,2471,2472,2416,2381,2426,2492,2372,2478,2440,2443,2512,2388,2434,2386,2415,2445,2475,2458,2471,2383,2508,2437,2434,2458,2366,2449,2480,2435,2470,2422,2487,2408,2406,2395,2446,2375,2330,2390,2439,2437,2440,2434,2386,2338,2402,2437,2402,2341,2376,2459,2455,2490,2490,2421,2395,2359,2452,2480,2442,2520,2458,2436,2469,2487,2477,2382,2363,2413,2456,2432,2423,2488,2466,2552,2384,2370,2430,2342,2416,2401,2440,2437,2485,2398,2375,2435,2442,2466,2407,2411,2441,2429,2308,2458,2508,2484,2436,2415,2467,2467,2496,2480,2466,2436,2461,2422,2440,2484,2334,2361,2429,2416,2422,2558,2460,2458,2426,2428,2413,2414,2428,2462,2400,2468,2410,2435,2422,2469,2400,2437,2444,2535,2332,2410,2531,2438,2420,2490,2390,2491,2472,2443,2492,2446,2481,2487,2440,2438,2529,2425,2494,2413,2520,2528,2434,2450,2380,2515,2399,2513,2473,2499,2553,2511,2507,2438,2442,2479,2416,2565,2466,2432,2391,2306,2549,2385,2506,2461,2391,2439,2440,2436,2375,2479,2386,2467,2392,2399,2448,2410,2558,2421,2433,2528,2516,2471,2402,2498,2501,2457,2461,2469,2438,2466,2370,2426,2390,2451,2484,2430,2355,2390,2477,2378,2483,2524,2474,2419,2473,2487,2514,2437,2338,2415,2354,2427,2347,2434,2450,2391,2361,2468,2350,2545,2466,2480,2435,2440,2410,2497,2453,2385,2352,2399,2496,2447,2398,2380,2505,2362,2400,2444,2458,2471,2489,2415,2458,2481,2375,2418,2501,2445,2370,2443,2439,2435,2446,2442,2448,2405,2525,2454,2510,2487,2474,2456,2375,2467,2346,2442,2414,2476,2496,2473,2393,2424,2366,2446,2421,2494,2448,2457,2405,2334,2437,2483,2417,2523,2431,2459,2329,2468,2436,2495,2397,2424,2471,2483,2405,2406,2449,2443,2509,2418,2465,2395,2487,2358,2359,2406,2526,2396,2408,2350,2485,2421,2439,2337,2439,2429,2482,2397,2453,2417,2409,2330,2448,2364,2409,2372,2368,2473,2447,2480,2403,2468,2510,2411,2440,2431,2448,2412,2432,2431,2421,2489,2410,2379,2386,2401,2436,2506,2460,2422,2478,2440,2396,2407,2377,2269,2454,2419,2365,2440,2409,2469,2404,2390,2494,2521,2464,2416,2434,2444,2403,2415,2398,2373,2389,2427,2369,2342,2491,2432,2473,2530,2451,2353,2473,2448,2439,2384,2359,2423,2379,2502,2445,2462,2525,2482,2446,2465,2380,2439,2547,2475,2493,2528,2456,2337,2588,2413,2435,2445,2429,2429,2415,2529,2313,2438,2491,2407,2392,2437,2501,2429,2400,2485,2411,2473,2464,2414,2550,2417,2485,2454,2427,2422,2518,2513,2369,2331,2525,2440,2428,2399,2400,2457,2448,2411,2442,2454,2471,2446,2537,2426,2331,2380,2438,2409,2468,2380,2466,2430,2449,2468,2427,2347,2421,2435,2439,2434,2412,2452,2487,2418,2317,2462,2463,2441,2428,2472,2372,2397,2407,2332,2497,2566,2467,2363,2478,2411,2449,2389,2361,2498,2348,2373,2450,2473,2414,2455,2376,2453,2502,2455,2439,2500,2401,2403,2438,2417,2424,2383,2511,2535,2320,2390,2382,2531,2456,2453,2518,2338,2418,2437,2477,2414,2360,2335,2409,2388,2382,2507,2447,2473,2540,2440,2362,2396,2488,2422,2492,2399,2471,2487,2457,2422,2514,2405,2351,2444,2503,2454,2468,2412,2428,2420,2518,2382,2394,2437,2547,2472,2413,2417,2415,2441,2494,2395,2441,2387,2423,2480,2384,2460,2415,2455,2475,2475,2435,2403,2444,2447,2492,2492,2412,2531,2380,2474,2464,2366,2355,2458,2471,2396,2489,2434,2534,2325,2462,2394,2459,2435,2502,2404,2431,2488,2451,2411,2444,2436,2369,2481,2440,2361,2529,2475,2538,2498,2423,2407,2532,2432,2347,2477,2353,2469,2463,2474,2468,2399,2490,2465,2387,2426,2399,2504,2422,2364,2430,2439,2374,2448,2430,2459,2395,2403,2453,2543,2358,2438,2438,2384,2437,2427,2467,2443,2416,2485,2436,2469,2434,2458,2480,2487,2548,2412,2452,2413,2406,2390,2462,2391,2405,2516,2380,2480,2469,2513,2428,2418,2506,2520,2409,2426,2439,2493,2402,2415,2443,2361,2507,2519,2417,2384,2473,2488,2427,2418,2399,2446,2406,2405,2437,2535,2466,2420,2455,2502,2469,2490,2581,2343,2374,2436,2355,2502,2495,2433,2373,2491,2510,2473,2431,2443,2438,2525,2444,2417,2431,2493,2477,2475,2558,2446,2522,2323,2410,2378,2404,2385,2425,2340,2420,2392,2356,2470,2486,2458,2325,2401,2412,2378,2348,2342,2479,2427,2402,2438,2394,2392,2470,2493,2399,2434,2429,2445,2522,2399,2452,2334,2514,2440,2460,2450,2429,2416,2496,2412,2455,2474,2457,2469,2395,2434,2382,2444,2530,2433,2356,2346,2428,2411,2371,2387,2425,2465,2403,2432,2352,2481,2461,2435,2345,2412,2486,2468,2430,2379,2495,2311,2430,2461,2416,2395,2438,2511,2446,2576,2419,2455,2340,2474,2481,2464,2345,2403,2432,2377,2372,2423,2433,2456,2534,2463,2440,2422,2462,2370,2438,2441,2437,2468,2556,2472,2436,2434,2468,2408,2341,2353,2383,2298,2370,2482]}],"top_n":[{"data":"CNDRzQQ=","count":0},{"data":"CPSn4AM=","count":0},{"data":"CIrT3QQ=","count":3},{"data":"CLj2pAM=","count":24},{"data":"CKbmsgM=","count":23},{"data":"CO6ovwI=","count":7},{"data":"CNDhjwM=","count":18},{"data":"CP7qIw==","count":13},{"data":"CMbyrgQ=","count":0},{"data":"CJTloAM=","count":0},{"data":"COKR2QQ=","count":5},{"data":"COybpwE=","count":0},{"data":"CPSgNA==","count":0},{"data":"CMT7wgE=","count":26},{"data":"CLjYuQM=","count":0},{"data":"CNq4lAE=","count":0},{"data":"CLSTaw==","count":0},{"data":"CKb3pgM=","count":0},{"data":"CLarjwE=","count":2},{"data":"CNCGkAI=","count":2},{"data":"CPCWTQ==","count":10},{"data":"CNzN+AM=","count":17},{"data":"CKD+rwQ=","count":0},{"data":"CJTNlwE=","count":39},{"data":"CIj2mAI=","count":4},{"data":"COz5eA==","count":27},{"data":"CIrTwgQ=","count":11},{"data":"CPytmgQ=","count":21},{"data":"CISveg==","count":35},{"data":"COrqGw==","count":7},{"data":"CMiSiQQ=","count":0},{"data":"CIrswAI=","count":0},{"data":"CKCqrAE=","count":0},{"data":"CP7kpwE=","count":13},{"data":"CLKTpgE=","count":0},{"data":"CIjEjgQ=","count":0},{"data":"CJKi+QE=","count":6},{"data":"COqWMQ==","count":0},{"data":"CMi8EA==","count":0},{"data":"CJ6pxAQ=","count":0},{"data":"COKYtAI=","count":0},{"data":"CN6ImwQ=","count":24},{"data":"CNz2GA==","count":0},{"data":"COjtOw==","count":59},{"data":"CO60pwQ=","count":0},{"data":"COjr6AI=","count":0},{"data":"CJTlEA==","count":0},{"data":"CODLxgM=","count":36},{"data":"CLD7UQ==","count":16},{"data":"CKClcA==","count":19},{"data":"CNj49AE=","count":72},{"data":"CKqmugI=","count":38},{"data":"CODPJg==","count":88},{"data":"CKCy1QE=","count":0},{"data":"CN7v2wE=","count":26},{"data":"CNqclwI=","count":0},{"data":"CMaejQQ=","count":0},{"data":"CLDRvgQ=","count":0},{"data":"COr91AI=","count":0},{"data":"CLaPtwQ=","count":26},{"data":"CO7+iAQ=","count":6},{"data":"CIT2rgM=","count":0},{"data":"COr64wE=","count":0},{"data":"COySqgE=","count":2},{"data":"CNru0AM=","count":33},{"data":"CNq9iwE=","count":0},{"data":"COi0owE=","count":13},{"data":"CN6+1wE=","count":0},{"data":"CO67mAM=","count":0},{"data":"COacYQ==","count":2},{"data":"CNqX6wI=","count":0},{"data":"CK6UiQE=","count":24},{"data":"CLDLqQI=","count":1},{"data":"CNqvnwI=","count":0},{"data":"CPDfywI=","count":0},{"data":"CJ6k7AM=","count":0},{"data":"CJa97QM=","count":12},{"data":"CNSTcA==","count":6},{"data":"CObA8AM=","count":0},{"data":"CJKDdw==","count":0},{"data":"CKyNiAM=","count":0},{"data":"CI753wM=","count":15},{"data":"CLKycw==","count":49},{"data":"COy9ZQ==","count":7},{"data":"CIKw5gI=","count":0},{"data":"CPKO1QI=","count":0},{"data":"CPL+2wI=","count":0},{"data":"CLbB2gE=","count":0},{"data":"CKzgywI=","count":57},{"data":"CNiWhAM=","count":0},{"data":"CKSmnAM=","count":3},{"data":"CPLveg==","count":0},{"data":"CPjh3wI=","count":0},{"data":"CMiC9gM=","count":1},{"data":"CLq8sQI=","count":0},{"data":"COjTwwQ=","count":0},{"data":"CNjc/wE=","count":2},{"data":"CNSs8QE=","count":41},{"data":"CO7P2gI=","count":0},{"data":"CNairQI=","count":0},{"data":"CJDg+AI=","count":0},{"data":"CPrj4gM=","count":0},{"data":"CLzywQE=","count":0},{"data":"CKiWzAE=","count":0},{"data":"CJTSkAE=","count":52},{"data":"CNqKDQ==","count":32},{"data":"CLi2Cw==","count":21},{"data":"CPa8kgI=","count":50},{"data":"CIbaUw==","count":0},{"data":"CJDblQQ=","count":12},{"data":"CKKrVQ==","count":0},{"data":"CMrqjAM=","count":0},{"data":"CPaMAw==","count":0},{"data":"CKiM7wI=","count":41},{"data":"CKzHFA==","count":39},{"data":"CPLS/QE=","count":31},{"data":"CM66xQE=","count":0},{"data":"CLDKLg==","count":22},{"data":"CP6SbQ==","count":30},{"data":"CJz+sQE=","count":0},{"data":"CIa31QE=","count":43},{"data":"CICzngM=","count":8},{"data":"CIDJugI=","count":0},{"data":"CLat8gE=","count":15},{"data":"CPqXaQ==","count":2},{"data":"CPbK9AM=","count":0},{"data":"CNyG0gI=","count":0},{"data":"CODdTQ==","count":0},{"data":"CK7/cg==","count":5},{"data":"CPyp3AE=","count":0},{"data":"CJSY/AM=","count":4},{"data":"CKjeyQQ=","count":13},{"data":"CJa89QI=","count":15},{"data":"CPj7pgI=","count":28},{"data":"CMKR/wE=","count":55},{"data":"CKTitQI=","count":0},{"data":"CJbduQI=","count":10},{"data":"CPjM3wI=","count":13},{"data":"CM6wpAI=","count":3},{"data":"CLiLEw==","count":0},{"data":"CM67Bg==","count":18},{"data":"CPzM2gQ=","count":0},{"data":"CMiQfA==","count":26},{"data":"CMqxjgQ=","count":85},{"data":"CLq/vwE=","count":6},{"data":"CKTg9AM=","count":0},{"data":"COy8ygM=","count":26},{"data":"CJrr6gM=","count":9},{"data":"COCHjQI=","count":0},{"data":"CLSESw==","count":13},{"data":"CKrIHg==","count":0},{"data":"CLq1pQQ=","count":16},{"data":"CIDB0gQ=","count":0},{"data":"CKKk2wM=","count":1},{"data":"CITP+wM=","count":0},{"data":"CLbqqQE=","count":0},{"data":"COjSfw==","count":0},{"data":"COaf2gM=","count":9},{"data":"CMzGxgE=","count":0},{"data":"CMyX/wM=","count":0},{"data":"CJyw1gI=","count":2},{"data":"CI6OhgM=","count":0},{"data":"CICJ2QM=","count":34},{"data":"CPaEyAQ=","count":0},{"data":"CNyZ/wM=","count":33},{"data":"CPjMhAQ=","count":0},{"data":"CIq3iwQ=","count":0},{"data":"CL7gzAE=","count":0},{"data":"CKzWLA==","count":17},{"data":"CJjNsQQ=","count":12},{"data":"CPCYRQ==","count":5},{"data":"CLTtiQQ=","count":20},{"data":"CJbGngQ=","count":0},{"data":"COCS+gE=","count":0},{"data":"CKjLAg==","count":0},{"data":"CNi/vgM=","count":1},{"data":"COTd4wI=","count":0},{"data":"CIaljwQ=","count":28},{"data":"CLK8Zw==","count":26},{"data":"CISD8gI=","count":7},{"data":"CPbgpgE=","count":24},{"data":"CNqMYA==","count":0},{"data":"CIyN1gI=","count":0},{"data":"CLLZgwE=","count":22},{"data":"CPiG1gQ=","count":0},{"data":"CJzekwQ=","count":0},{"data":"CMznrwQ=","count":38},{"data":"CPaRoQE=","count":19},{"data":"CPqIowE=","count":31},{"data":"CM6szQI=","count":10},{"data":"CLzMqAM=","count":0},{"data":"CPLR9wM=","count":11},{"data":"CID1iAM=","count":0},{"data":"CNSznQE=","count":23},{"data":"CJyErgI=","count":0},{"data":"CNjjxQE=","count":0},{"data":"CPaEyAI=","count":7},{"data":"COrQkQQ=","count":45},{"data":"CNyM0gI=","count":19},{"data":"CKqQoQI=","count":59},{"data":"CPjLxwE=","count":36},{"data":"CJLe4gE=","count":0},{"data":"CNqK5QE=","count":41},{"data":"CKbTvAQ=","count":3},{"data":"CK7mtwQ=","count":6},{"data":"CKCF+gE=","count":0},{"data":"CIyWfA==","count":0},{"data":"CMydZA==","count":0},{"data":"COri/gM=","count":0},{"data":"CIqoLg==","count":0},{"data":"CNS+kwQ=","count":28},{"data":"COa93AE=","count":12},{"data":"CJbT0gE=","count":22},{"data":"CIDj8QM=","count":14},{"data":"CMibjAM=","count":0},{"data":"CPj62QM=","count":11},{"data":"CMaqvQE=","count":0},{"data":"CML7kQQ=","count":0},{"data":"CJiJzwM=","count":0},{"data":"CMrrVA==","count":37},{"data":"CIjyRQ==","count":12},{"data":"CMyAcQ==","count":0},{"data":"CKSlag==","count":0},{"data":"CLaj6QM=","count":0},{"data":"COKp5wM=","count":28},{"data":"CL7E/AM=","count":39},{"data":"CMyAvQI=","count":0},{"data":"CMjLIA==","count":0},{"data":"CPbJTA==","count":0},{"data":"CLKTwgM=","count":4},{"data":"CMazxwQ=","count":17},{"data":"CMykWw==","count":0},{"data":"CJKp1QE=","count":4},{"data":"CMjcuwE=","count":32},{"data":"CJLOuAM=","count":39},{"data":"CKi3oQE=","count":49},{"data":"COLCHg==","count":0},{"data":"CMLtmAQ=","count":0},{"data":"CLL1pQI=","count":0},{"data":"CNiajQQ=","count":0},{"data":"CMzypQE=","count":0},{"data":"CNih6QI=","count":0},{"data":"CPbzkQE=","count":0},{"data":"CO6Z8AM=","count":0},{"data":"CMyMxAE=","count":0},{"data":"CKTjQQ==","count":0},{"data":"CODaLA==","count":0},{"data":"CJzQDQ==","count":0},{"data":"COTvqQM=","count":0},{"data":"CLCh3AQ=","count":0},{"data":"CKqRvwE=","count":7},{"data":"CKa9+wI=","count":45},{"data":"CJCkeA==","count":0},{"data":"CPzjMA==","count":0},{"data":"CLrIggQ=","count":29},{"data":"CKaesAQ=","count":32},{"data":"CKCagQQ=","count":0},{"data":"CMTOyAM=","count":0},{"data":"CIqlnwE=","count":22},{"data":"CKDy6QE=","count":40},{"data":"CI6xVw==","count":28},{"data":"CNLqjwM=","count":1},{"data":"CIS5/AM=","count":17},{"data":"CKi/WA==","count":0},{"data":"CLCp6wE=","count":6},{"data":"CJCnlwI=","count":0},{"data":"CIKrFw==","count":24},{"data":"CLiUQA==","count":1},{"data":"CIjB9gM=","count":17},{"data":"CIr8gAI=","count":2},{"data":"CNDIXg==","count":31},{"data":"CMr+Kw==","count":0},{"data":"CLzPUw==","count":8},{"data":"CI6svQM=","count":21},{"data":"CPjLBg==","count":0},{"data":"CPLxhAM=","count":13},{"data":"CJidgAE=","count":0},{"data":"CNauwQM=","count":16},{"data":"CM7d1gQ=","count":0},{"data":"CMLurgM=","count":22},{"data":"CLrMpgQ=","count":0},{"data":"COKyBA==","count":21},{"data":"CL7tDg==","count":0},{"data":"CI7cTQ==","count":0},{"data":"CJjvdQ==","count":0},{"data":"CJ6qHA==","count":27},{"data":"CKasnwM=","count":32},{"data":"CKqkhQE=","count":45},{"data":"CJTINw==","count":5},{"data":"CKqmpwM=","count":0},{"data":"CNT+Bg==","count":23},{"data":"CLbw4wM=","count":0},{"data":"CLTk2AM=","count":0},{"data":"CPi5Sw==","count":14},{"data":"CJqUxgE=","count":19},{"data":"COyxpQQ=","count":0},{"data":"COSajQQ=","count":0},{"data":"CPDXmwQ=","count":52},{"data":"CK6Dbg==","count":0},{"data":"CKSflwM=","count":0},{"data":"COS/9gI=","count":0},{"data":"CJDoQw==","count":0},{"data":"CLqLhQM=","count":0},{"data":"CNiuwQQ=","count":53},{"data":"CNaFJQ==","count":2},{"data":"CNDfkgQ=","count":0},{"data":"CI7IxgE=","count":20},{"data":"CJS13gI=","count":0},{"data":"CLad+AE=","count":0},{"data":"CKrusAM=","count":26},{"data":"CPrr0AE=","count":33},{"data":"CLbs+AE=","count":0},{"data":"COrXmgE=","count":31},{"data":"CJDltAM=","count":6},{"data":"CO7PigE=","count":0},{"data":"COLAaA==","count":4},{"data":"COLloAE=","count":0},{"data":"CPqvygQ=","count":38},{"data":"CLipggI=","count":1},{"data":"CNCTkAM=","count":22},{"data":"CJihxwI=","count":6},{"data":"CICNoAQ=","count":78},{"data":"CJ6pHg==","count":9},{"data":"CIKAhgQ=","count":0},{"data":"CNLhxAM=","count":2},{"data":"CJ7s4gE=","count":13},{"data":"CJCmrwI=","count":0},{"data":"CL6KlwI=","count":0},{"data":"CLzc/gI=","count":36},{"data":"CLqH5gE=","count":13},{"data":"CP7jKA==","count":3},{"data":"CKKohgI=","count":0},{"data":"CMjfLw==","count":29},{"data":"CLihOw==","count":0},{"data":"CPKd5QE=","count":0},{"data":"CL71qQM=","count":0},{"data":"CL7UqgQ=","count":22},{"data":"CLjCzAQ=","count":0},{"data":"CPLtjwE=","count":2},{"data":"CJCcjgE=","count":0},{"data":"CN61hwM=","count":0},{"data":"CKTNKQ==","count":0},{"data":"CNjLgAM=","count":0},{"data":"CNTwsAM=","count":12},{"data":"CITQ8wI=","count":0},{"data":"COS8iAM=","count":0},{"data":"CLLb2gQ=","count":22},{"data":"CKi1twE=","count":0},{"data":"CPrkqgQ=","count":0},{"data":"CJ6AjQM=","count":0},{"data":"CNaOkgI=","count":0},{"data":"CI6I9QM=","count":0},{"data":"COCRLw==","count":2},{"data":"CIDKNw==","count":22},{"data":"CKr76QM=","count":0},{"data":"CJDagwI=","count":1},{"data":"CKyAlwI=","count":6},{"data":"CJLNlgI=","count":30},{"data":"CPK45AI=","count":33},{"data":"CI64ngE=","count":0},{"data":"CMbAMQ==","count":19},{"data":"COSAHg==","count":0},{"data":"CI6S7QE=","count":0},{"data":"CIKQLA==","count":0},{"data":"CLKLtAM=","count":0},{"data":"CK7vrgI=","count":0},{"data":"CPTARg==","count":34},{"data":"COqpkgM=","count":0},{"data":"CNTXwAM=","count":57},{"data":"CLy2gQM=","count":0},{"data":"CMzfjQE=","count":60},{"data":"CLiidg==","count":0},{"data":"CNbsyQI=","count":0},{"data":"CLTX7wE=","count":67},{"data":"CMKlgQI=","count":12},{"data":"CJiEywM=","count":0},{"data":"CIKeeA==","count":0},{"data":"CNDgsQM=","count":9},{"data":"CNj2xwE=","count":0},{"data":"CKaC2QE=","count":0},{"data":"CLaMqQE=","count":48},{"data":"CILiHA==","count":0},{"data":"CILjwwM=","count":7},{"data":"CK65kwQ=","count":0},{"data":"CPbSQA==","count":0},{"data":"COasoAQ=","count":0},{"data":"CMrHxgE=","count":0},{"data":"CPqCMg==","count":22},{"data":"COCihAM=","count":0},{"data":"CLC3/wI=","count":0},{"data":"CKam5gE=","count":8},{"data":"CKq4AQ==","count":0},{"data":"COSxtgI=","count":0},{"data":"CNL+mgE=","count":96},{"data":"CKLFiQQ=","count":0},{"data":"CJaImwE=","count":0},{"data":"CKjvjQQ=","count":21},{"data":"CI6GuAM=","count":2},{"data":"CIyI0gM=","count":49},{"data":"CLC8nQM=","count":0},{"data":"CIDJCg==","count":0},{"data":"CNLosAQ=","count":0},{"data":"CNqpqQM=","count":4},{"data":"CLLv2wI=","count":6},{"data":"COSx2wI=","count":0},{"data":"CIauigI=","count":0},{"data":"CPi0Mg==","count":35},{"data":"CPb4tgQ=","count":7},{"data":"CKD1Pg==","count":0},{"data":"CK6R5gI=","count":0},{"data":"CJiRFg==","count":0},{"data":"CNTjGA==","count":4},{"data":"CPix0QI=","count":5},{"data":"CNirNQ==","count":22},{"data":"CPKbrgE=","count":0},{"data":"CPDy/QE=","count":0},{"data":"CKapmAE=","count":2},{"data":"COTJ+wI=","count":0},{"data":"CMrIKQ==","count":0},{"data":"CKqNIA==","count":0},{"data":"COTy7gI=","count":23},{"data":"CJ7LUg==","count":0},{"data":"CKr+lQI=","count":0},{"data":"CNiwywM=","count":13},{"data":"CNCY8AM=","count":0},{"data":"CP7SoAE=","count":4},{"data":"COKdtAM=","count":0},{"data":"CIzb1AE=","count":18},{"data":"COjL7wM=","count":0},{"data":"CProywM=","count":32},{"data":"CN7wggE=","count":27},{"data":"CPDGiwM=","count":0},{"data":"CK6gfg==","count":0},{"data":"CPydlgI=","count":27},{"data":"CIiV5gM=","count":0},{"data":"CJS04QE=","count":0},{"data":"CNqRuQI=","count":13},{"data":"CPTnPQ==","count":5},{"data":"CJLOFQ==","count":0},{"data":"CKi5JQ==","count":24},{"data":"CKyY3AQ=","count":0},{"data":"CNytmAI=","count":0},{"data":"CKThXg==","count":0},{"data":"CLiGjgI=","count":34},{"data":"CPaA2QE=","count":0},{"data":"CKDTjAM=","count":22},{"data":"CPa3kQI=","count":0},{"data":"CLjx9gI=","count":28},{"data":"CIrxKw==","count":1},{"data":"CKi7jwM=","count":0},{"data":"CLSwEw==","count":0},{"data":"CNBp","count":0},{"data":"CKj1tgQ=","count":0},{"data":"CKrgiwM=","count":0},{"data":"CKCWzQM=","count":0},{"data":"CKSP0AQ=","count":10},{"data":"CKLGwAE=","count":0},{"data":"CMrAhAI=","count":0},{"data":"CICcuQM=","count":0},{"data":"CLzjnQI=","count":2},{"data":"CI7W4QM=","count":41},{"data":"COys4QM=","count":34},{"data":"CJiqAQ==","count":27},{"data":"CLCDqQM=","count":0},{"data":"CIii4AE=","count":0},{"data":"CIDS3AI=","count":38},{"data":"CPK7mQM=","count":18},{"data":"CO70+AM=","count":2},{"data":"CLiGtwE=","count":10},{"data":"CJDw7AM=","count":24},{"data":"CJywywE=","count":0},{"data":"CPLhCg==","count":0},{"data":"CJinngM=","count":4},{"data":"CPynrgQ=","count":0},{"data":"CJi3MA==","count":1},{"data":"CMy3LA==","count":0},{"data":"CPzmgAE=","count":0},{"data":"CK7Y3wE=","count":23},{"data":"CNbhjwE=","count":32},{"data":"CKTlEw==","count":5},{"data":"COjY1AQ=","count":0},{"data":"CLjJvQQ=","count":33},{"data":"CN6MYA==","count":0},{"data":"CNTC5QI=","count":0},{"data":"CK7j1gQ=","count":6},{"data":"COysjQM=","count":0},{"data":"CPiMogE=","count":0},{"data":"CNKtgwQ=","count":0},{"data":"CIyGHA==","count":0},{"data":"COTAkwE=","count":0},{"data":"CLjb9AE=","count":0},{"data":"CMyLigQ=","count":12},{"data":"CIKEkQE=","count":5},{"data":"CM6xhQI=","count":41},{"data":"CJbVrwM=","count":0},{"data":"CPSJsgI=","count":1},{"data":"CIKlvAQ=","count":0},{"data":"CPTylQE=","count":33},{"data":"CPLK9AM=","count":28},{"data":"COTPqwI=","count":11},{"data":"CP6riAE=","count":0},{"data":"CKjwDg==","count":0},{"data":"CPyp2wE=","count":23},{"data":"CJqMggM=","count":0},{"data":"CMCO0AE=","count":0},{"data":"CKSd9wE=","count":0},{"data":"CLbN1wQ=","count":0},{"data":"CITq6gE=","count":0},{"data":"CJjH4wM=","count":15},{"data":"CPyhugI=","count":13},{"data":"CPy6hwQ=","count":37},{"data":"CNbsJg==","count":25},{"data":"COrsswQ=","count":3},{"data":"CIj0qAE=","count":0},{"data":"CICPNA==","count":34},{"data":"CPTmxwM=","count":27},{"data":"CLCJzAQ=","count":27},{"data":"CLaosQM=","count":2},{"data":"CILOzQE=","count":1},{"data":"CMjhrgE=","count":29},{"data":"CPKN4QI=","count":0},{"data":"CIiLgwI=","count":21},{"data":"CKqysQM=","count":47},{"data":"CICX4AQ=","count":0},{"data":"CL7PqgM=","count":51},{"data":"CO6GgwI=","count":30},{"data":"COLZ8QM=","count":0},{"data":"CKiFswM=","count":41},{"data":"CKqmhwQ=","count":7},{"data":"CLyO/gM=","count":0},{"data":"CLSYngE=","count":0},{"data":"CPqIzwQ=","count":0},{"data":"COjymgI=","count":2},{"data":"CMbhNQ==","count":27},{"data":"CLzGsgQ=","count":0},{"data":"CMigkAQ=","count":0},{"data":"CIzJ+QI=","count":53},{"data":"CKjSCw==","count":0},{"data":"CJDvigI=","count":15},{"data":"CPid4QM=","count":6},{"data":"CNLhHw==","count":18},{"data":"CJ7PjQQ=","count":11},{"data":"CM67gwE=","count":0},{"data":"COTqzgQ=","count":15},{"data":"CJTuygI=","count":0},{"data":"CPyknwI=","count":72},{"data":"CKKEhwI=","count":0},{"data":"CMzEsQI=","count":0},{"data":"CPSA3QE=","count":28},{"data":"CKKIxQI=","count":21},{"data":"CMD6hQM=","count":26},{"data":"CL61jgQ=","count":0},{"data":"CNrisAM=","count":28},{"data":"CN6B4gQ=","count":0},{"data":"CMDPhAI=","count":57},{"data":"CPDFNA==","count":0},{"data":"CPT9vgI=","count":17},{"data":"CJK+Ng==","count":0},{"data":"CNq7xgQ=","count":23},{"data":"CNjdhAQ=","count":17},{"data":"COC0vgE=","count":0},{"data":"CKzVzQI=","count":0},{"data":"CLDB0gE=","count":10},{"data":"CLLNpwQ=","count":0},{"data":"CLqOhAM=","count":38},{"data":"CPz4vQM=","count":0},{"data":"CI7AhQI=","count":0},{"data":"CMqf1AQ=","count":1},{"data":"CLDooAE=","count":0},{"data":"CMLgXQ==","count":39},{"data":"CNLFWg==","count":31},{"data":"COTZwgI=","count":39},{"data":"CPKIQQ==","count":0},{"data":"CLzryQM=","count":0},{"data":"COTZUg==","count":0},{"data":"CObhugI=","count":0},{"data":"CPrnwQI=","count":4},{"data":"CKzqowE=","count":23},{"data":"CMLkwwQ=","count":7},{"data":"CLaXPg==","count":0},{"data":"CL7QjAQ=","count":0},{"data":"CM7AtwM=","count":0},{"data":"COyPEQ==","count":0},{"data":"CMaMlgE=","count":0},{"data":"CPDGnQE=","count":0},{"data":"CKq7sgM=","count":0},{"data":"CKLN/wM=","count":19},{"data":"CICLBw==","count":0},{"data":"CMaXowM=","count":12},{"data":"CLqltAE=","count":7},{"data":"CJSq4wE=","count":0},{"data":"CIjetAQ=","count":0},{"data":"CP7iVw==","count":8},{"data":"CI7s8gM=","count":4},{"data":"CLSCLA==","count":0},{"data":"CMSeaw==","count":0},{"data":"COyT6QE=","count":7},{"data":"CLaSrQE=","count":9},{"data":"CN6osAI=","count":18},{"data":"CI6KsQQ=","count":1},{"data":"CLLt4wM=","count":0},{"data":"CJ6dHw==","count":18},{"data":"CPCCmQE=","count":0},{"data":"CLa8hAM=","count":51},{"data":"CJLNuAI=","count":27},{"data":"CKjo5AI=","count":25},{"data":"CPLV+gM=","count":50},{"data":"CMD4rAI=","count":69},{"data":"CMyhhwM=","count":0},{"data":"CIaMygM=","count":4},{"data":"CNyQ7AI=","count":29},{"data":"CM6bqAM=","count":52},{"data":"CPrsPg==","count":11},{"data":"CPLqlgQ=","count":5},{"data":"CJyyogM=","count":5},{"data":"CIT7kwM=","count":29},{"data":"CLzp4QE=","count":7},{"data":"CO6gzgE=","count":4},{"data":"CJr8mAE=","count":1},{"data":"CNC88wI=","count":0},{"data":"CPapkAM=","count":2},{"data":"CMDo6QM=","count":17},{"data":"CMKs5AE=","count":0},{"data":"CPSC8gI=","count":1},{"data":"CPS2wQQ=","count":19},{"data":"CMzDmAQ=","count":10},{"data":"COyr5AE=","count":0},{"data":"CNy7Gg==","count":0},{"data":"CNzW/gE=","count":0},{"data":"CKDbBw==","count":0},{"data":"CPL5qAI=","count":20},{"data":"CJiT3AM=","count":0},{"data":"CPr6fw==","count":0},{"data":"CNDzoAQ=","count":0},{"data":"CMjGowE=","count":0},{"data":"CMiLtAI=","count":8},{"data":"CND5yAI=","count":33},{"data":"CLDY0QE=","count":0},{"data":"CLae7gM=","count":72},{"data":"CIb1rQQ=","count":13},{"data":"CITJ3QE=","count":9},{"data":"CMyYnQI=","count":0},{"data":"COzEvgQ=","count":21},{"data":"CPyZmgI=","count":4},{"data":"CJTzwQI=","count":0},{"data":"CN64mgQ=","count":0},{"data":"CMLmhAE=","count":0},{"data":"CMaCFw==","count":2},{"data":"CNzAowM=","count":3},{"data":"CITwkwM=","count":41},{"data":"CMaBKg==","count":29},{"data":"COzdnAM=","count":12},{"data":"COjQogQ=","count":0},{"data":"COj9hQE=","count":5},{"data":"CLT+ZQ==","count":13},{"data":"CNb/Ew==","count":0},{"data":"COL6Mg==","count":0},{"data":"CIrXhgM=","count":0},{"data":"CNLH5QM=","count":51},{"data":"CNDUjAI=","count":0},{"data":"CMD2oQE=","count":1},{"data":"CLLfnAE=","count":0},{"data":"CLDgRw==","count":0},{"data":"CJqreQ==","count":13},{"data":"CIad3AM=","count":10},{"data":"CKzHzQM=","count":1},{"data":"CODRqgM=","count":0},{"data":"CJ7S6gM=","count":0},{"data":"CN6LIA==","count":0},{"data":"CIyklgI=","count":0},{"data":"CMSvggM=","count":0},{"data":"CK7NMw==","count":14},{"data":"CKSIiAI=","count":0},{"data":"CNTxgwE=","count":0},{"data":"CMby9wI=","count":6},{"data":"CLr87wM=","count":33},{"data":"CLi8yQI=","count":0},{"data":"CMT4lAM=","count":10},{"data":"CKL8gwM=","count":27},{"data":"CPqFBg==","count":0},{"data":"CJzVxAI=","count":23},{"data":"CKqdkQI=","count":0},{"data":"CNr0pQE=","count":0},{"data":"CPrUdw==","count":1},{"data":"CKbBzAE=","count":0},{"data":"CNSgyAE=","count":0},{"data":"CIC+fQ==","count":0},{"data":"CLT/3gM=","count":0},{"data":"CObFggM=","count":0},{"data":"CKyWsAQ=","count":0},{"data":"CIaq+AM=","count":33},{"data":"CJrIogQ=","count":7},{"data":"CIq4Tg==","count":0},{"data":"CJq1ngI=","count":35},{"data":"CO7Z8QE=","count":0},{"data":"CNr/ugQ=","count":31},{"data":"CLL3tAQ=","count":0},{"data":"COqCkAE=","count":11},{"data":"CLKExAE=","count":0},{"data":"CPbh3gE=","count":19},{"data":"CLS2oQQ=","count":11},{"data":"CKT41QI=","count":0},{"data":"CJbgjwQ=","count":12},{"data":"COjxvgQ=","count":0},{"data":"CJCbWg==","count":0},{"data":"CLjeaA==","count":0},{"data":"CM7v0QI=","count":24},{"data":"CPTcmwQ=","count":17},{"data":"CMTWmAM=","count":0},{"data":"CNiO0AE=","count":12},{"data":"CNLQpAI=","count":0},{"data":"COj10wM=","count":0},{"data":"CNrPswM=","count":43},{"data":"CK7MsQQ=","count":0},{"data":"CLj8Tg==","count":17},{"data":"CMKY5gE=","count":18},{"data":"CKD5wwE=","count":29},{"data":"CMrshAE=","count":0},{"data":"CNjkigQ=","count":13},{"data":"CNT5vwM=","count":11},{"data":"CNyeSA==","count":0},{"data":"CLK4yAM=","count":5},{"data":"CID4rwI=","count":3},{"data":"CK7ErQQ=","count":1},{"data":"CP6gfA==","count":36},{"data":"CPiNpAE=","count":24},{"data":"CJjYwgE=","count":1},{"data":"CNyyJw==","count":0},{"data":"CNyNQQ==","count":0},{"data":"CPrzPg==","count":4},{"data":"CJLKigI=","count":0},{"data":"CJ7dxwM=","count":0},{"data":"CMCnjwI=","count":0},{"data":"CMCgugM=","count":0},{"data":"CMT+9gE=","count":65},{"data":"CPraMw==","count":27},{"data":"CJbzlwE=","count":45},{"data":"CM7A2QE=","count":10},{"data":"CMLHhwE=","count":0},{"data":"CLzJvgM=","count":0},{"data":"CKzAuQE=","count":0},{"data":"CObJ6gI=","count":0},{"data":"CMidtgI=","count":0},{"data":"CK6qUw==","count":0},{"data":"CJqV+wI=","count":0},{"data":"CM7OowQ=","count":0},{"data":"CIK31wI=","count":1},{"data":"CMTPsQQ=","count":0},{"data":"CLb/jAQ=","count":2},{"data":"CMKEkgQ=","count":0},{"data":"CIDz5wE=","count":15},{"data":"CJCY8wI=","count":1},{"data":"CLaYRA==","count":0},{"data":"CLbgZQ==","count":0},{"data":"COD0yQM=","count":0},{"data":"CILprgI=","count":19},{"data":"CLC7mgI=","count":30},{"data":"CJDxDw==","count":14},{"data":"CI7bag==","count":0},{"data":"CISUPw==","count":10},{"data":"CLzblQE=","count":0},{"data":"CO7M9gI=","count":1},{"data":"CKK2qwQ=","count":29},{"data":"CLzKywQ=","count":0},{"data":"CNyevQI=","count":0},{"data":"CMjA0gE=","count":5},{"data":"CMSD3AQ=","count":5},{"data":"CL7oWg==","count":44},{"data":"COTkzwI=","count":0},{"data":"CPqqjQI=","count":72},{"data":"CICaQg==","count":0},{"data":"CLrI2gQ=","count":0},{"data":"CObTMw==","count":3},{"data":"CK64vQI=","count":0},{"data":"CPj+Yg==","count":4},{"data":"CKaK8wI=","count":0},{"data":"CKaBxQI=","count":13},{"data":"CODqhgQ=","count":16},{"data":"CLbU3wI=","count":4},{"data":"CPD83AE=","count":18},{"data":"CKq4kwI=","count":22},{"data":"CIq7/wE=","count":27},{"data":"CL6ljAQ=","count":0},{"data":"CMbz6gM=","count":0},{"data":"CMixuwI=","count":9},{"data":"CIyIkAM=","count":10},{"data":"CPCrrQM=","count":0},{"data":"CIbzzQE=","count":25},{"data":"CK6WMg==","count":3},{"data":"CP6qqAM=","count":0},{"data":"COjJhQI=","count":0},{"data":"CJamKg==","count":0},{"data":"CJbeiQI=","count":0},{"data":"COiV9AE=","count":0},{"data":"CKqNugQ=","count":0},{"data":"CL7TFA==","count":36},{"data":"CLzX6gE=","count":22},{"data":"CMzbPg==","count":22},{"data":"CPCIlAQ=","count":39},{"data":"CLan0wM=","count":0},{"data":"CIrDOg==","count":1},{"data":"COTQxgM=","count":35},{"data":"CIipjgE=","count":1},{"data":"CITZogE=","count":6},{"data":"CPKy4QQ=","count":0},{"data":"CJaQ4QQ=","count":19},{"data":"CPKDgQM=","count":0},{"data":"CPK1pwM=","count":58},{"data":"CJaRtQE=","count":21},{"data":"CLqlOA==","count":40},{"data":"CNqkwAM=","count":0},{"data":"CJDk4gM=","count":7},{"data":"CNqnnAM=","count":0},{"data":"COKl7AM=","count":0},{"data":"CODCogQ=","count":0},{"data":"CPbOsgM=","count":16},{"data":"CKb1cw==","count":0},{"data":"CM6ktgE=","count":0},{"data":"CPqa3wM=","count":21},{"data":"CNTdvAM=","count":0},{"data":"CJDr5gM=","count":0},{"data":"CMCj7wE=","count":0},{"data":"CJTFIA==","count":0},{"data":"CMKg8gI=","count":0},{"data":"CJjZhQI=","count":0},{"data":"CIDm+gM=","count":24},{"data":"CMafuwE=","count":7},{"data":"CIzoQg==","count":0},{"data":"CPqNzQM=","count":0},{"data":"CPbn1AE=","count":15},{"data":"CJjUNA==","count":0},{"data":"CNCCJw==","count":0},{"data":"CN6jzgI=","count":34},{"data":"CJj6twI=","count":37},{"data":"CNDj7gE=","count":0},{"data":"CMKhgQM=","count":0},{"data":"CLiypQM=","count":9},{"data":"CPCrAg==","count":0},{"data":"CNyZhAE=","count":33},{"data":"CKin/QI=","count":0},{"data":"CJjcygQ=","count":0},{"data":"COCbyQQ=","count":0},{"data":"COb4yAM=","count":0},{"data":"CLK5Bg==","count":30},{"data":"CJrFnAM=","count":0},{"data":"CLbnlQQ=","count":18},{"data":"CNatSg==","count":3},{"data":"CI6GwgQ=","count":4},{"data":"CPLm/AE=","count":0},{"data":"CJrzmQM=","count":6},{"data":"CIqK6wM=","count":0},{"data":"COr72gQ=","count":19},{"data":"CL6/owM=","count":11},{"data":"COzfmAQ=","count":22},{"data":"CPjChQE=","count":0},{"data":"CIDR7wM=","count":14},{"data":"CMSHlQE=","count":0},{"data":"CKKOjAI=","count":0},{"data":"CLSy+gE=","count":0},{"data":"CN6qbA==","count":8},{"data":"CKrBzgM=","count":0},{"data":"CODTugI=","count":21},{"data":"CIzgpAE=","count":0},{"data":"CJ7b8AI=","count":0},{"data":"CO6p3AI=","count":4},{"data":"COStXw==","count":7},{"data":"CM7s+AE=","count":0},{"data":"CMaybg==","count":39},{"data":"CN78jwI=","count":0},{"data":"CJihVQ==","count":0},{"data":"CIq5uAE=","count":16},{"data":"CKKEpQE=","count":0},{"data":"COjFvAQ=","count":11},{"data":"CJSHoQI=","count":20},{"data":"CMCdUQ==","count":0},{"data":"CLr06AE=","count":0},{"data":"CKSW4QM=","count":0},{"data":"COLWpgE=","count":0},{"data":"COSU2wI=","count":11},{"data":"CJbM2QQ=","count":13},{"data":"CNqpgAM=","count":0},{"data":"CPTTBg==","count":13},{"data":"CPj5TA==","count":0},{"data":"CPTKiwQ=","count":0},{"data":"CKiXngQ=","count":20},{"data":"CPr9OA==","count":0},{"data":"CMqCzwM=","count":17},{"data":"CNzujQI=","count":0},{"data":"CPbwhAQ=","count":2},{"data":"CMrI/AI=","count":0},{"data":"CMqbggI=","count":0},{"data":"CI6qvQI=","count":0},{"data":"CMKZkwM=","count":24},{"data":"CP69eA==","count":0},{"data":"COLeygE=","count":11},{"data":"CNLnxQI=","count":24},{"data":"CIbExAE=","count":0},{"data":"CJKLqwQ=","count":0},{"data":"CNqZpQQ=","count":16},{"data":"CJDO4AM=","count":0},{"data":"CMbXzAE=","count":0},{"data":"CJ68Jg==","count":0},{"data":"COSFjAM=","count":61},{"data":"COjF3gI=","count":0},{"data":"CNbYEw==","count":0},{"data":"CNT8uQM=","count":0},{"data":"CMLvGA==","count":43},{"data":"CK7m7wM=","count":0},{"data":"CMj0Qw==","count":0},{"data":"CJLkIw==","count":0},{"data":"CIy0dQ==","count":0},{"data":"CIbJqgM=","count":34},{"data":"CLr+CA==","count":26},{"data":"CO7iIA==","count":0},{"data":"COa8lAQ=","count":0},{"data":"CNycJQ==","count":4},{"data":"CKDsnQM=","count":6},{"data":"CLSuhAE=","count":0},{"data":"CODptwQ=","count":0},{"data":"CPqJXQ==","count":0},{"data":"CNbFjgI=","count":1},{"data":"CKL4Jg==","count":0},{"data":"CKCbqQI=","count":21},{"data":"CNLZmgM=","count":0},{"data":"CLKBXg==","count":0},{"data":"CLaxsAI=","count":2},{"data":"CNDmygM=","count":0},{"data":"CIaTyAQ=","count":10},{"data":"CPaL4gE=","count":16},{"data":"COyVzQI=","count":40},{"data":"COzVcg==","count":2},{"data":"CJSNYQ==","count":33},{"data":"CIbq4gM=","count":37},{"data":"COb+3AM=","count":23},{"data":"CLrPYw==","count":2},{"data":"CMSKHA==","count":0},{"data":"CJKPUQ==","count":0},{"data":"CKquvwM=","count":14},{"data":"CL64tgI=","count":12},{"data":"CJzrhwQ=","count":0},{"data":"CMywvwM=","count":18},{"data":"COjKbQ==","count":4},{"data":"CIDAWg==","count":0},{"data":"COzEHg==","count":6},{"data":"CKKP9QE=","count":0},{"data":"CJ6gvgI=","count":0},{"data":"CM6RZA==","count":0},{"data":"CPbJngM=","count":0},{"data":"CI6bxwE=","count":6},{"data":"CMyLaA==","count":0},{"data":"CMK6wgE=","count":20},{"data":"CLaAjwM=","count":0},{"data":"CLLS0AE=","count":0},{"data":"CNS2/wM=","count":3},{"data":"CKLBDQ==","count":0},{"data":"CICv9QE=","count":17},{"data":"CPqVVw==","count":0},{"data":"CPSt4gI=","count":0},{"data":"COzhhwI=","count":0},{"data":"CObWTw==","count":1},{"data":"CJT8eQ==","count":0},{"data":"CMD59QM=","count":21},{"data":"CMq5gAE=","count":0},{"data":"CNKQhwE=","count":63},{"data":"CN7eGA==","count":38},{"data":"CJrkJQ==","count":0},{"data":"CLK62AI=","count":0},{"data":"COTd9AM=","count":0},{"data":"CJitvwE=","count":0},{"data":"CK7UtAQ=","count":4},{"data":"CKTRywM=","count":0},{"data":"CM6oDQ==","count":4},{"data":"CLTArgM=","count":0},{"data":"CP7/5AM=","count":0},{"data":"CIqgkgM=","count":1},{"data":"CNqZTA==","count":22},{"data":"CKTxpAE=","count":25},{"data":"CJy3iAM=","count":0},{"data":"CJj4PQ==","count":26},{"data":"CPiSqAI=","count":0},{"data":"CPT9Ag==","count":0},{"data":"CLrtmgI=","count":0},{"data":"CJzZ0AM=","count":0},{"data":"CILMsgM=","count":0},{"data":"CMTntwM=","count":31},{"data":"CJTsvQQ=","count":10},{"data":"CKjQsAI=","count":6},{"data":"CI6rjQI=","count":7},{"data":"CN65Rg==","count":0},{"data":"CPiKvgE=","count":42},{"data":"CP7xxgE=","count":11},{"data":"CMKl1QI=","count":0},{"data":"CKD3ugE=","count":36},{"data":"CPbJ3QM=","count":0},{"data":"CJrR9AM=","count":73},{"data":"CJrNsgM=","count":0},{"data":"CMzhxgQ=","count":0},{"data":"COiprgQ=","count":35},{"data":"CL6NpQE=","count":15},{"data":"CLyO8QI=","count":2}],"default_value":0},"null_count":0,"tot_col_size":18943171,"last_update_version":410676699727396864,"correlation":1},"f":{"histogram":{"ndv":4999168,"buckets":[{"count":20000,"lower_bound":"MTE4Ng==","upper_bound":"ODM1Nw==","repeats":1},{"count":40000,"lower_bound":"MTMwOTQ=","upper_bound":"MzcyMTc=","repeats":1},{"count":60000,"lower_bound":"NDIwOTU=","upper_bound":"NTUxMDA=","repeats":1},{"count":80000,"lower_bound":"NTU5NTc=","upper_bound":"NzgxNTQ=","repeats":1},{"count":100000,"lower_bound":"ODkwMDY=","upper_bound":"OTA4Njc=","repeats":1},{"count":120000,"lower_bound":"MTAwNTg0","upper_bound":"MTIzMTUy","repeats":1},{"count":140000,"lower_bound":"MTIzNjg4","upper_bound":"MTI5NTg4","repeats":1},{"count":160000,"lower_bound":"MTMzNjY4","upper_bound":"MTc5NDUz","repeats":1},{"count":180000,"lower_bound":"MTgzOTc0","upper_bound":"MTg2MDY4","repeats":1},{"count":200000,"lower_bound":"MTg2Njg2","upper_bound":"MjAxNTI1","repeats":1},{"count":220000,"lower_bound":"MjA2MDEw","upper_bound":"MjE1MzAx","repeats":1},{"count":240000,"lower_bound":"MjIzOTMw","upper_bound":"MjUxNDU4","repeats":1},{"count":260000,"lower_bound":"MjUyODcy","upper_bound":"MjYwMTY4","repeats":1},{"count":280000,"lower_bound":"MjYxNzAz","upper_bound":"Mjc4NjMy","repeats":1},{"count":300000,"lower_bound":"MjgwNzY3","upper_bound":"MzAwNDQy","repeats":1},{"count":320000,"lower_bound":"MzA4NjQ5","upper_bound":"MzE2ODIy","repeats":1},{"count":340000,"lower_bound":"MzE5MjM0","upper_bound":"MzM3MzIz","repeats":1},{"count":360000,"lower_bound":"MzQ0NjUy","upper_bound":"MzQ4MDk4","repeats":1},{"count":380000,"lower_bound":"MzQ5MTA2","upper_bound":"Mzc1Mzg0","repeats":1},{"count":400000,"lower_bound":"Mzc2Mzc2","upper_bound":"MzkyMTgz","repeats":1},{"count":420000,"lower_bound":"Mzk5MTMy","upper_bound":"NDEzMjY5","repeats":1},{"count":440000,"lower_bound":"NDIwNDA5","upper_bound":"NDMyNTky","repeats":1},{"count":460000,"lower_bound":"NDM4MDg2","upper_bound":"NDU2MTEw","repeats":1},{"count":480000,"lower_bound":"NDYxMTc4","upper_bound":"NDcyMzM4","repeats":1},{"count":500000,"lower_bound":"NDczNjk2","upper_bound":"NDgyODg1","repeats":1},{"count":520000,"lower_bound":"NDkwNjQ4","upper_bound":"NTIzMDgw","repeats":1},{"count":540000,"lower_bound":"NTI0MDg4","upper_bound":"NTM0NDIz","repeats":1},{"count":560000,"lower_bound":"NTM1NDg1","upper_bound":"NTQ2MjY4","repeats":1},{"count":580000,"lower_bound":"NTQ2ODM2","upper_bound":"NTUxODQ1","repeats":1},{"count":600000,"lower_bound":"NTU0NTM5","upper_bound":"NTU1NzI5","repeats":1},{"count":620000,"lower_bound":"NTY2OTI4","upper_bound":"NTc4NjI4","repeats":1},{"count":640000,"lower_bound":"NTc5NDU4","upper_bound":"NTk3MDcx","repeats":1},{"count":660000,"lower_bound":"NTk3MTAw","upper_bound":"NjAzODYw","repeats":1},{"count":680000,"lower_bound":"NjA3MzI2","upper_bound":"NjE2NjMx","repeats":1},{"count":700000,"lower_bound":"NjMzOTEz","upper_bound":"NjQ4MTMy","repeats":1},{"count":720000,"lower_bound":"NjUzMzc2","upper_bound":"NjY2ODk4","repeats":1},{"count":740000,"lower_bound":"NjY3Mzc0","upper_bound":"NjkyMjMx","repeats":1},{"count":760000,"lower_bound":"NzA0NDMx","upper_bound":"NzIzMzc3","repeats":1},{"count":780000,"lower_bound":"NzMxMDY4","upper_bound":"NzY0NDMw","repeats":1},{"count":800000,"lower_bound":"NzY4Nzk1","upper_bound":"Nzk3OTE2","repeats":1},{"count":820000,"lower_bound":"ODIxMDk2","upper_bound":"ODMzNjk0","repeats":1},{"count":840000,"lower_bound":"ODQyNDY4","upper_bound":"ODUxNTc3","repeats":1},{"count":860000,"lower_bound":"ODUxODc1","upper_bound":"ODk1ODMy","repeats":1},{"count":880000,"lower_bound":"OTA0NDU4","upper_bound":"OTA4MDQw","repeats":1},{"count":900000,"lower_bound":"OTEwNjEz","upper_bound":"OTI3Njc1","repeats":1},{"count":920000,"lower_bound":"OTMyNTk2","upper_bound":"OTQ0MDM4","repeats":1},{"count":940000,"lower_bound":"OTQ3MTg4","upper_bound":"OTU5MTEy","repeats":1},{"count":960000,"lower_bound":"OTY3ODA4","upper_bound":"OTgzMjgz","repeats":1},{"count":980000,"lower_bound":"OTgzNTM4","upper_bound":"MTAwMzg5NA==","repeats":1},{"count":1000000,"lower_bound":"MTAwNTY2Mw==","upper_bound":"MTAxOTIwNw==","repeats":1},{"count":1020000,"lower_bound":"MTAyMjc3NA==","upper_bound":"MTAzNTM2MQ==","repeats":1},{"count":1040000,"lower_bound":"MTAzNjQ1OQ==","upper_bound":"MTA0MjMwNA==","repeats":1},{"count":1060000,"lower_bound":"MTA0MzY5Mg==","upper_bound":"MTA2NzMxNA==","repeats":1},{"count":1080000,"lower_bound":"MTA3NTMxNg==","upper_bound":"MTA3NzQzNw==","repeats":1},{"count":1100000,"lower_bound":"MTA4MDAwMw==","upper_bound":"MTA5MzE1Mw==","repeats":1},{"count":1120000,"lower_bound":"MTA5NDM3NA==","upper_bound":"MTEwMzMzMQ==","repeats":1},{"count":1140000,"lower_bound":"MTEwNzQ5MA==","upper_bound":"MTEyNDkzNA==","repeats":1},{"count":1160000,"lower_bound":"MTEyNTU1Mw==","upper_bound":"MTEzMDMzMw==","repeats":1},{"count":1180000,"lower_bound":"MTEzNDMxOQ==","upper_bound":"MTE1NjEzMw==","repeats":1},{"count":1200000,"lower_bound":"MTE1ODM5NA==","upper_bound":"MTE2OTI3Mg==","repeats":1},{"count":1220000,"lower_bound":"MTE3MzI4Mg==","upper_bound":"MTE4MTM2MA==","repeats":1},{"count":1240000,"lower_bound":"MTE4Mzg1Mg==","upper_bound":"MTE5MjQwOA==","repeats":1},{"count":1260000,"lower_bound":"MTE5NDQ5NA==","upper_bound":"MTE5Nzk0Mw==","repeats":1},{"count":1280000,"lower_bound":"MTE5ODgwMw==","upper_bound":"MTIxOTY1NQ==","repeats":1},{"count":1300000,"lower_bound":"MTIyMjg2OA==","upper_bound":"MTIzODg4Mw==","repeats":1},{"count":1320000,"lower_bound":"MTI0OTM0MQ==","upper_bound":"MTI2NDA4OA==","repeats":1},{"count":1340000,"lower_bound":"MTI2NTY3Nw==","upper_bound":"MTI2OTE1OA==","repeats":1},{"count":1360000,"lower_bound":"MTI3MDkwMg==","upper_bound":"MTI3NTEyOQ==","repeats":1},{"count":1380000,"lower_bound":"MTI3NjQ1Mw==","upper_bound":"MTI5MzUwMA==","repeats":1},{"count":1400000,"lower_bound":"MTI5NTQ0Ng==","upper_bound":"MTMwODE2Mg==","repeats":1},{"count":1420000,"lower_bound":"MTMzNjA1MA==","upper_bound":"MTM1NTYzMQ==","repeats":1},{"count":1440000,"lower_bound":"MTM1OTQ4Nw==","upper_bound":"MTM3MDAwNw==","repeats":1},{"count":1460000,"lower_bound":"MTM3MDIzNw==","upper_bound":"MTM5NDU5Mg==","repeats":1},{"count":1480000,"lower_bound":"MTQwNzg0OQ==","upper_bound":"MTQyMjI0Nw==","repeats":1},{"count":1500000,"lower_bound":"MTQyNjIxMg==","upper_bound":"MTQ0MDA2OA==","repeats":1},{"count":1520000,"lower_bound":"MTQ0ODQ4NA==","upper_bound":"MTQ3MzAwNg==","repeats":1},{"count":1540000,"lower_bound":"MTQ3NTk3Nw==","upper_bound":"MTQ4NzQyNQ==","repeats":1},{"count":1560000,"lower_bound":"MTQ5MDE3Mw==","upper_bound":"MTQ5MTQwNQ==","repeats":1},{"count":1580000,"lower_bound":"MTUwNDQ2Mw==","upper_bound":"MTUxNDA0NQ==","repeats":1},{"count":1600000,"lower_bound":"MTUxODg4MA==","upper_bound":"MTUyODY1Mg==","repeats":1},{"count":1620000,"lower_bound":"MTUyOTY0Mg==","upper_bound":"MTUzNDk3MA==","repeats":1},{"count":1640000,"lower_bound":"MTU0MzE1OA==","upper_bound":"MTU1MTExNg==","repeats":1},{"count":1660000,"lower_bound":"MTU1MTg5Ng==","upper_bound":"MTU2MjA2Ng==","repeats":1},{"count":1680000,"lower_bound":"MTU2NTk1Nw==","upper_bound":"MTU4NDk4Ng==","repeats":1},{"count":1700000,"lower_bound":"MTU4Njk4NA==","upper_bound":"MTU5OTE0NA==","repeats":1},{"count":1720000,"lower_bound":"MTYwMjkyMw==","upper_bound":"MTYxMzYxNw==","repeats":1},{"count":1740000,"lower_bound":"MTYxNDM1NA==","upper_bound":"MTY0NjYzMg==","repeats":1},{"count":1760000,"lower_bound":"MTY0Njc3OQ==","upper_bound":"MTY1NjAyOQ==","repeats":1},{"count":1780000,"lower_bound":"MTY2NDE0NA==","upper_bound":"MTY3NzgyNg==","repeats":1},{"count":1800000,"lower_bound":"MTY4OTc2Mw==","upper_bound":"MTY5ODI4Mw==","repeats":1},{"count":1820000,"lower_bound":"MTcwMDUxNQ==","upper_bound":"MTcwMjg3Mw==","repeats":1},{"count":1840000,"lower_bound":"MTcxNzgwNg==","upper_bound":"MTczMzEzMg==","repeats":1},{"count":1860000,"lower_bound":"MTczNDc0Mw==","upper_bound":"MTc0ODA0NQ==","repeats":1},{"count":1880000,"lower_bound":"MTc1NjY0OA==","upper_bound":"MTc5MTcyNw==","repeats":1},{"count":1900000,"lower_bound":"MTgwMDQxOQ==","upper_bound":"MTgxODczMg==","repeats":1},{"count":1920000,"lower_bound":"MTgyMTc2Nw==","upper_bound":"MTgzMDA2Mw==","repeats":1},{"count":1940000,"lower_bound":"MTgzNzAxNw==","upper_bound":"MTg0Njc5OQ==","repeats":1},{"count":1960000,"lower_bound":"MTg1MjQzMw==","upper_bound":"MTg2Mjg1NQ==","repeats":1},{"count":1980000,"lower_bound":"MTg2NTEwNA==","upper_bound":"MTg3ODA3Mg==","repeats":1},{"count":2000000,"lower_bound":"MTg4Mjc2NQ==","upper_bound":"MTg4ODc5NQ==","repeats":1},{"count":2020000,"lower_bound":"MTg4OTg3NQ==","upper_bound":"MTkwMDk2Mg==","repeats":1},{"count":2040000,"lower_bound":"MTkwMzY5MA==","upper_bound":"MTkyNTI0NQ==","repeats":1},{"count":2060000,"lower_bound":"MTkyNjM4NQ==","upper_bound":"MTkzMTU0MA==","repeats":1},{"count":2080000,"lower_bound":"MTkzMjc4OA==","upper_bound":"MTk0NTE1MA==","repeats":1},{"count":2100000,"lower_bound":"MTk1MTE3OQ==","upper_bound":"MTk2ODEwOA==","repeats":1},{"count":2120000,"lower_bound":"MTk2OTc5Mg==","upper_bound":"MTk5MTMxNg==","repeats":1},{"count":2140000,"lower_bound":"MTk5MTg3OA==","upper_bound":"MjAwMzI3Nw==","repeats":1},{"count":2160000,"lower_bound":"MjAyMzQyNQ==","upper_bound":"MjAzMDM1NA==","repeats":1},{"count":2180000,"lower_bound":"MjAzMjc2NQ==","upper_bound":"MjA0MTIzMw==","repeats":1},{"count":2200000,"lower_bound":"MjA0Mjg2Nw==","upper_bound":"MjA1NTY3OQ==","repeats":1},{"count":2220000,"lower_bound":"MjA2MDI4NA==","upper_bound":"MjA3NDczMg==","repeats":1},{"count":2240000,"lower_bound":"MjA4MDc3MA==","upper_bound":"MjA5MzQwMA==","repeats":1},{"count":2260000,"lower_bound":"MjEwMjUxNg==","upper_bound":"MjEyNzE0NQ==","repeats":1},{"count":2280000,"lower_bound":"MjEzNDYxMA==","upper_bound":"MjE2NjczNQ==","repeats":1},{"count":2300000,"lower_bound":"MjE2NzIwMA==","upper_bound":"MjE3MTYxOQ==","repeats":1},{"count":2320000,"lower_bound":"MjE3NTE0MA==","upper_bound":"MjE4NDE2Mg==","repeats":1},{"count":2340000,"lower_bound":"MjE5MTM1MA==","upper_bound":"MjIxMzEwNg==","repeats":1},{"count":2360000,"lower_bound":"MjIxNTIzMA==","upper_bound":"MjIzMDgxMg==","repeats":1},{"count":2380000,"lower_bound":"MjIzMjQ5MQ==","upper_bound":"MjIzNTcwNA==","repeats":1},{"count":2400000,"lower_bound":"MjIzNzI4MA==","upper_bound":"MjI0MzI2Mg==","repeats":1},{"count":2420000,"lower_bound":"MjI0NDI3NQ==","upper_bound":"MjI0NzkzOQ==","repeats":1},{"count":2440000,"lower_bound":"MjI0OTQ5OQ==","upper_bound":"MjI2NTA5Nw==","repeats":1},{"count":2460000,"lower_bound":"MjI2NzE5NA==","upper_bound":"MjI3ODMxMw==","repeats":1},{"count":2480000,"lower_bound":"MjI4NjA0OA==","upper_bound":"MjMwMDYzMw==","repeats":1},{"count":2500000,"lower_bound":"MjMwMjY1Ng==","upper_bound":"MjMxODMzMA==","repeats":1},{"count":2520000,"lower_bound":"MjMxOTQyMQ==","upper_bound":"MjMyNDU3NQ==","repeats":1},{"count":2540000,"lower_bound":"MjM0NjM1NQ==","upper_bound":"MjM1MjIwMA==","repeats":1},{"count":2560000,"lower_bound":"MjM1NTE1MA==","upper_bound":"MjM2OTQyNg==","repeats":1},{"count":2580000,"lower_bound":"MjM3NDEwMA==","upper_bound":"MjM3Njc0OQ==","repeats":1},{"count":2600000,"lower_bound":"MjM4MTI4NQ==","upper_bound":"MjM4NzQxMA==","repeats":1},{"count":2620000,"lower_bound":"MjM5MjQ2Mg==","upper_bound":"MjM5ODMwOA==","repeats":1},{"count":2640000,"lower_bound":"MjQwNDYzMQ==","upper_bound":"MjQ1Mjc4Mw==","repeats":1},{"count":2660000,"lower_bound":"MjQ1OTcxNQ==","upper_bound":"MjQ4MDE0NQ==","repeats":1},{"count":2680000,"lower_bound":"MjQ4MjE5Nw==","upper_bound":"MjQ5NjY5Nw==","repeats":1},{"count":2700000,"lower_bound":"MjUyNTI5MQ==","upper_bound":"MjUzNTcxNQ==","repeats":1},{"count":2720000,"lower_bound":"MjUzOTEyOQ==","upper_bound":"MjU1MzAyOA==","repeats":1},{"count":2740000,"lower_bound":"MjU1NDk0Mw==","upper_bound":"MjU2MDkzNg==","repeats":1},{"count":2760000,"lower_bound":"MjU2MTQ3Mg==","upper_bound":"MjU3NzY4OQ==","repeats":1},{"count":2780000,"lower_bound":"MjU4NjcxNg==","upper_bound":"MjYxMTc2OQ==","repeats":1},{"count":2800000,"lower_bound":"MjYzMTcxNA==","upper_bound":"MjYzNjUyNw==","repeats":1},{"count":2820000,"lower_bound":"MjYzNzY4MQ==","upper_bound":"MjY3Mjk1NA==","repeats":1},{"count":2840000,"lower_bound":"MjY3ODMyOA==","upper_bound":"MjY4OTQzNA==","repeats":1},{"count":2860000,"lower_bound":"MjY5NTA0MQ==","upper_bound":"MjcwNzA4Mg==","repeats":1},{"count":2880000,"lower_bound":"MjcwNzMzMQ==","upper_bound":"MjcyNjYwNQ==","repeats":1},{"count":2900000,"lower_bound":"Mjc0MTYwMg==","upper_bound":"Mjc0ODU1Mw==","repeats":1},{"count":2920000,"lower_bound":"Mjc1OTQ5OA==","upper_bound":"Mjc2MTIxMA==","repeats":1},{"count":2940000,"lower_bound":"Mjc2NjAwNA==","upper_bound":"MjgwMjgyNg==","repeats":1},{"count":2960000,"lower_bound":"MjgxNTczMQ==","upper_bound":"MjgyODEwMQ==","repeats":1},{"count":2980000,"lower_bound":"MjgzMTE5Nw==","upper_bound":"Mjg0MTc1Ng==","repeats":1},{"count":3000000,"lower_bound":"Mjg0NzEzMg==","upper_bound":"Mjg1MzEwMQ==","repeats":1},{"count":3020000,"lower_bound":"Mjg1NDA5NA==","upper_bound":"Mjg2NzIxMw==","repeats":1},{"count":3040000,"lower_bound":"Mjg2NzM2OA==","upper_bound":"MjkwNjg2OQ==","repeats":1},{"count":3060000,"lower_bound":"MjkwOTgyNA==","upper_bound":"Mjk0MzkxMA==","repeats":1},{"count":3080000,"lower_bound":"Mjk0ODI5MQ==","upper_bound":"Mjk1NjUwNg==","repeats":1},{"count":3100000,"lower_bound":"Mjk2MDA1MQ==","upper_bound":"Mjk2NzU0Mg==","repeats":1},{"count":3120000,"lower_bound":"Mjk3MDA5Mw==","upper_bound":"Mjk4MzEzNw==","repeats":1},{"count":3140000,"lower_bound":"Mjk4Njg2Mg==","upper_bound":"MzAwMDc5Mg==","repeats":1},{"count":3160000,"lower_bound":"MzAwMzUxMg==","upper_bound":"MzAxMDQ4NA==","repeats":1},{"count":3180000,"lower_bound":"MzAyMjkyOA==","upper_bound":"MzA1NDgyOA==","repeats":1},{"count":3200000,"lower_bound":"MzA2Mjk1NA==","upper_bound":"MzEwMDcyNA==","repeats":1},{"count":3220000,"lower_bound":"MzEwMjI1MQ==","upper_bound":"MzExMTE5NA==","repeats":1},{"count":3240000,"lower_bound":"MzExMzk1MA==","upper_bound":"MzE0Njg1OQ==","repeats":1},{"count":3260000,"lower_bound":"MzE0OTIzMg==","upper_bound":"MzE2MzAxMw==","repeats":1},{"count":3280000,"lower_bound":"MzE3MTI2NQ==","upper_bound":"MzE5MzcxNg==","repeats":1},{"count":3300000,"lower_bound":"MzE5NjA4Mw==","upper_bound":"MzIwNDU0Mw==","repeats":1},{"count":3320000,"lower_bound":"MzIwOTAzMg==","upper_bound":"MzIxOTc5Nw==","repeats":1},{"count":3340000,"lower_bound":"MzIyMTkxNg==","upper_bound":"MzIzMzY3Mg==","repeats":1},{"count":3360000,"lower_bound":"MzIzMzkzMw==","upper_bound":"MzI1MDA1NQ==","repeats":1},{"count":3380000,"lower_bound":"MzI1OTg5NA==","upper_bound":"MzI3NDg1MQ==","repeats":1},{"count":3400000,"lower_bound":"MzI3OTAxMw==","upper_bound":"MzMxODIwOQ==","repeats":1},{"count":3420000,"lower_bound":"MzMxOTgyOQ==","upper_bound":"MzMyOTE2NQ==","repeats":1},{"count":3440000,"lower_bound":"MzMzMjUwOA==","upper_bound":"MzM1ODIxOA==","repeats":1},{"count":3460000,"lower_bound":"MzM2MTY1MQ==","upper_bound":"MzM4NDQ3Mw==","repeats":1},{"count":3480000,"lower_bound":"MzM5MTg3Mg==","upper_bound":"MzQwODkxMQ==","repeats":1},{"count":3500000,"lower_bound":"MzQwOTIwMA==","upper_bound":"MzQyMjA2Ng==","repeats":1},{"count":3520000,"lower_bound":"MzQyNDQ5Ng==","upper_bound":"MzQzNjE2OQ==","repeats":1},{"count":3540000,"lower_bound":"MzQ0MzM1Mg==","upper_bound":"MzQ1OTc3Mg==","repeats":1},{"count":3560000,"lower_bound":"MzQ2MjQ0Mg==","upper_bound":"MzQ4MDQ0Nw==","repeats":1},{"count":3580000,"lower_bound":"MzQ4MDQ4MA==","upper_bound":"MzQ5MDE3OQ==","repeats":1},{"count":3600000,"lower_bound":"MzQ5MTU4NA==","upper_bound":"MzUxMjU3NA==","repeats":1},{"count":3620000,"lower_bound":"MzUxOTU0NA==","upper_bound":"MzUyMjcwMQ==","repeats":1},{"count":3640000,"lower_bound":"MzU0MTA2Ng==","upper_bound":"MzU2MjAyOA==","repeats":1},{"count":3660000,"lower_bound":"MzU2NTM5Ng==","upper_bound":"MzU3OTQ4Ng==","repeats":1},{"count":3680000,"lower_bound":"MzU4MDM3OA==","upper_bound":"MzU4OTMyMg==","repeats":1},{"count":3700000,"lower_bound":"MzU5NTcwNA==","upper_bound":"MzYxNTUwNA==","repeats":1},{"count":3720000,"lower_bound":"MzYxNjkxMQ==","upper_bound":"MzYyODg1NA==","repeats":1},{"count":3740000,"lower_bound":"MzYyOTA4Ng==","upper_bound":"MzY1NzY4OA==","repeats":1},{"count":3760000,"lower_bound":"MzY2NTAyOQ==","upper_bound":"MzY3Mjg0MA==","repeats":1},{"count":3780000,"lower_bound":"MzY3MzQxMA==","upper_bound":"MzY4OTc2OA==","repeats":1},{"count":3800000,"lower_bound":"MzcxMjA2MA==","upper_bound":"MzcyNDcyNQ==","repeats":1},{"count":3820000,"lower_bound":"MzcyNDkyMg==","upper_bound":"MzczODM1MA==","repeats":1},{"count":3840000,"lower_bound":"Mzc0MDgxMw==","upper_bound":"Mzc0ODI2Mg==","repeats":1},{"count":3860000,"lower_bound":"Mzc1NTY3NQ==","upper_bound":"Mzc3MTc4Mw==","repeats":1},{"count":3880000,"lower_bound":"Mzc3Mjg5Mw==","upper_bound":"Mzc5MjY4MA==","repeats":1},{"count":3900000,"lower_bound":"Mzc5NTA1Mw==","upper_bound":"MzgwMjA4OA==","repeats":1},{"count":3920000,"lower_bound":"MzgwMzI0Mg==","upper_bound":"MzgyNDU5Ng==","repeats":1},{"count":3940000,"lower_bound":"MzgyOTgwNw==","upper_bound":"Mzg2MjA1NQ==","repeats":1},{"count":3960000,"lower_bound":"Mzg2Nzc2NQ==","upper_bound":"Mzg3MDAyMg==","repeats":1},{"count":3980000,"lower_bound":"Mzg3MzI0MQ==","upper_bound":"Mzg5MzA0MA==","repeats":1},{"count":4000000,"lower_bound":"Mzg5NDA1Nw==","upper_bound":"MzkzNDgwMg==","repeats":1},{"count":4020000,"lower_bound":"Mzk0MDk1MQ==","upper_bound":"Mzk0Mzg3Mg==","repeats":1},{"count":4040000,"lower_bound":"Mzk0NTg2Mg==","upper_bound":"Mzk2NTU1MQ==","repeats":1},{"count":4060000,"lower_bound":"Mzk4MjQ2MA==","upper_bound":"Mzk5NjAwNA==","repeats":1},{"count":4080000,"lower_bound":"Mzk5ODc2Nw==","upper_bound":"NDAyODU2OA==","repeats":1},{"count":4100000,"lower_bound":"NDAzMTA5NQ==","upper_bound":"NDA2Mjg2OQ==","repeats":1},{"count":4120000,"lower_bound":"NDA3MTQyMw==","upper_bound":"NDA4MDMwOA==","repeats":1},{"count":4140000,"lower_bound":"NDA4MzM4Ng==","upper_bound":"NDA5NTg4NQ==","repeats":1},{"count":4160000,"lower_bound":"NDEwNTAzMg==","upper_bound":"NDExNzA4Ng==","repeats":1},{"count":4180000,"lower_bound":"NDEyMzg3Ng==","upper_bound":"NDEzNzU2MA==","repeats":1},{"count":4200000,"lower_bound":"NDEzODI5Nw==","upper_bound":"NDE0ODgyMQ==","repeats":1},{"count":4220000,"lower_bound":"NDE1MjE5OQ==","upper_bound":"NDE2MjM1NA==","repeats":1},{"count":4240000,"lower_bound":"NDE2NjE0MA==","upper_bound":"NDE3ODQ5Nw==","repeats":1},{"count":4260000,"lower_bound":"NDE4NDM4MA==","upper_bound":"NDIwMjI4Ng==","repeats":1},{"count":4280000,"lower_bound":"NDIwNDc3MQ==","upper_bound":"NDIyNDU5MA==","repeats":1},{"count":4300000,"lower_bound":"NDIyODU2OA==","upper_bound":"NDIzMzEyMQ==","repeats":1},{"count":4320000,"lower_bound":"NDIzNjgwMw==","upper_bound":"NDI0OTUzOQ==","repeats":1},{"count":4340000,"lower_bound":"NDI1NTE3MA==","upper_bound":"NDI3MTYyNg==","repeats":1},{"count":4360000,"lower_bound":"NDI3MzI3NA==","upper_bound":"NDI5MzM4Ng==","repeats":1},{"count":4380000,"lower_bound":"NDI5NTcwNg==","upper_bound":"NDMyMzM2Nw==","repeats":1},{"count":4400000,"lower_bound":"NDMyMzYxOA==","upper_bound":"NDM0MzI0MQ==","repeats":1},{"count":4420000,"lower_bound":"NDM0NzIzOQ==","upper_bound":"NDM2NzcyNA==","repeats":1},{"count":4440000,"lower_bound":"NDM2ODA5Nw==","upper_bound":"NDM4NjQ1MA==","repeats":1},{"count":4460000,"lower_bound":"NDM4NjQ3NQ==","upper_bound":"NDQyNzA2OQ==","repeats":1},{"count":4480000,"lower_bound":"NDQyODQwNg==","upper_bound":"NDQ0MTUxMQ==","repeats":1},{"count":4500000,"lower_bound":"NDQ0NTkwMQ==","upper_bound":"NDQ1NDgzOQ==","repeats":1},{"count":4520000,"lower_bound":"NDQ1NzI4MA==","upper_bound":"NDQ3MDM2Mw==","repeats":1},{"count":4540000,"lower_bound":"NDQ3MjE0OQ==","upper_bound":"NDQ4NjI5OQ==","repeats":1},{"count":4560000,"lower_bound":"NDQ4NzU1OQ==","upper_bound":"NDQ5MTE3MA==","repeats":1},{"count":4580000,"lower_bound":"NDQ5ODc3OQ==","upper_bound":"NDUxOTY2Mg==","repeats":1},{"count":4600000,"lower_bound":"NDUyMTI5OQ==","upper_bound":"NDUyNzQxMg==","repeats":1},{"count":4620000,"lower_bound":"NDUyODY5NA==","upper_bound":"NDU0Nzc2NQ==","repeats":1},{"count":4640000,"lower_bound":"NDU1MTc1OA==","upper_bound":"NDU3MzA2Ng==","repeats":1},{"count":4660000,"lower_bound":"NDYwODMzNA==","upper_bound":"NDYxOTMyOA==","repeats":1},{"count":4680000,"lower_bound":"NDYyMTc3MA==","upper_bound":"NDY0MjE3Ng==","repeats":1},{"count":4700000,"lower_bound":"NDY0NjE5Ng==","upper_bound":"NDY2OTUzMw==","repeats":1},{"count":4720000,"lower_bound":"NDY5MjU3Mw==","upper_bound":"NDcwNTgzNw==","repeats":1},{"count":4740000,"lower_bound":"NDcwNjEyMQ==","upper_bound":"NDcxNTc4NA==","repeats":1},{"count":4760000,"lower_bound":"NDcyMjA1NA==","upper_bound":"NDc1MjAxMQ==","repeats":1},{"count":4780000,"lower_bound":"NDc1NDA2MA==","upper_bound":"NDc2OTEwNw==","repeats":1},{"count":4800000,"lower_bound":"NDc3MzgyNg==","upper_bound":"NDc5MTUwOA==","repeats":1},{"count":4820000,"lower_bound":"NDc5ODI0Ng==","upper_bound":"NDgyMTQ4NA==","repeats":1},{"count":4840000,"lower_bound":"NDgyNjU5OA==","upper_bound":"NDgyOTc3OA==","repeats":1},{"count":4860000,"lower_bound":"NDgzMjgyMQ==","upper_bound":"NDgzOTUyOQ==","repeats":1},{"count":4880000,"lower_bound":"NDg0MDc4Mw==","upper_bound":"NDg1ODM0MA==","repeats":1},{"count":4900000,"lower_bound":"NDg2MDUzNw==","upper_bound":"NDg3MzQ2Mw==","repeats":1},{"count":4920000,"lower_bound":"NDg4ODM1MQ==","upper_bound":"NDkyMzg0NA==","repeats":1},{"count":4940000,"lower_bound":"NDkyNTQ3Ng==","upper_bound":"NDkzOTQ1Mw==","repeats":1},{"count":4960000,"lower_bound":"NDkzOTcxMw==","upper_bound":"NDk1OTM2MA==","repeats":1},{"count":4980000,"lower_bound":"NDk3MjkyNg==","upper_bound":"NDk4NjQ3OA==","repeats":1},{"count":5000000,"lower_bound":"NDk5MTM1MQ==","upper_bound":"NDk5NDM3MQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2440,2365,2430,2467,2434,2389,2522,2512,2454,2479,2485,2454,2486,2371,2370,2509,2483,2437,2492,2395,2493,2484,2377,2511,2476,2363,2475,2387,2444,2486,2364,2442,2372,2455,2488,2385,2402,2424,2439,2483,2496,2395,2489,2458,2331,2409,2440,2393,2321,2453,2502,2344,2443,2461,2367,2286,2439,2403,2425,2473,2405,2497,2425,2392,2412,2418,2421,2435,2466,2377,2291,2460,2452,2513,2513,2490,2506,2417,2339,2418,2438,2450,2544,2437,2445,2488,2407,2449,2419,2459,2403,2336,2485,2487,2464,2402,2482,2406,2426,2330,2462,2417,2432,2387,2451,2446,2498,2457,2371,2452,2327,2458,2467,2392,2452,2508,2424,2472,2489,2475,2404,2398,2464,2439,2441,2443,2458,2415,2400,2441,2398,2546,2420,2513,2473,2440,2571,2424,2439,2428,2392,2409,2438,2470,2432,2376,2326,2437,2419,2414,2444,2454,2439,2432,2487,2453,2389,2702,2407,2441,2484,2462,2376,2416,2402,2439,2502,2387,2465,2422,2436,2412,2437,2396,2526,2477,2517,2453,2514,2433,2430,2461,2431,2463,2329,2423,2377,2440,2432,2373,2468,2439,2475,2411,2437,2474,2423,2371,2418,2362,2470,2475,2402,2538,2370,2503,2463,2437,2473,2442,2409,2464,2473,2467,2419,2464,2365,2430,2404,2389,2528,2501,2485,2465,2375,2521,2447,2446,2436,2463,2529,2467,2467,2531,2440,2363,2489,2425,2413,2472,2482,2399,2374,2461,2443,2462,2413,2466,2415,2446,2424,2533,2471,2352,2430,2342,2449,2480,2448,2444,2445,2517,2363,2422,2459,2405,2521,2382,2494,2487,2445,2408,2424,2478,2434,2499,2437,2434,2472,2353,2437,2599,2369,2475,2444,2385,2411,2386,2369,2409,2425,2428,2349,2469,2381,2449,2444,2459,2391,2389,2307,2419,2473,2438,2493,2375,2504,2449,2436,2466,2426,2357,2363,2599,2433,2439,2439,2444,2471,2377,2471,2437,2435,2412,2414,2367,2394,2394,2432,2436,2387,2438,2499,2408,2339,2328,2355,2410,2244,2519,2453,2461,2422,2386,2412,2459,2429,2451,2398,2353,2459,2420,2395,2504,2408,2477,2458,2497,2516,2531,2353,2388,2339,2439,2413,2390,2451,2445,2458,2441,2426,2442,2434,2367,2416,2434,2352,2519,2435,2516,2454,2403,2447,2476,2532,2379,2395,2421,2432,2425,2447,2371,2404,2385,2366,2416,2485,2376,2309,2394,2466,2448,2449,2421,2457,2425,2383,2436,2399,2300,2450,2438,2452,2448,2386,2374,2502,2433,2440,2568,2369,2377,2429,2446,2484,2459,2390,2378,2430,2466,2382,2443,2430,2463,2493,2385,2416,2572,2350,2442,2463,2377,2471,2446,2369,2541,2422,2453,2449,2437,2406,2394,2391,2447,2359,2489,2448,2512,2378,2440,2379,2503,2488,2431,2377,2432,2453,2404,2528,2445,2362,2438,2444,2496,2379,2403,2451,2448,2430,2406,2464,2431,2451,2452,2450,2403,2444,2480,2432,2438,2434,2411,2427,2436,2448,2384,2443,2482,2528,2337,2449,2397,2519,2484,2437,2469,2457,2385,2392,2324,2473,2407,2395,2473,2406,2418,2466,2366,2461,2461,2462,2524,2392,2400,2499,2469,2400,2440,2532,2437,2497,2375,2552,2396,2548,2399,2410,2390,2436,2455,2414,2379,2448,2387,2475,2434,2393,2372,2473,2585,2435,2405,2356,2471,2430,2401,2479,2395,2390,2375,2383,2483,2472,2445,2471,2379,2441,2471,2470,2480,2454,2379,2410,2421,2394,2415,2351,2428,2542,2436,2417,2453,2464,2512,2526,2424,2415,2467,2405,2515,2484,2327,2446,2557,2488,2470,2466,2420,2455,2402,2400,2466,2468,2511,2531,2432,2541,2386,2409,2439,2401,2439,2504,2475,2431,2441,2381,2444,2449,2469,2434,2433,2394,2438,2430,2463,2313,2517,2417,2374,2419,2437,2467,2444,2426,2494,2446,2486,2376,2500,2388,2410,2429,2391,2368,2465,2397,2453,2415,2456,2451,2467,2361,2435,2465,2458,2415,2437,2418,2454,2472,2417,2313,2440,2515,2467,2419,2425,2471,2448,2405,2383,2463,2407,2424,2283,2473,2564,2482,2339,2398,2405,2386,2313,2379,2432,2474,2450,2442,2390,2388,2417,2466,2445,2475,2467,2454,2431,2476,2395,2473,2356,2383,2388,2465,2484,2446,2454,2451,2498,2452,2440,2482,2426,2417,2461,2385,2396,2481,2438,2417,2542,2390,2344,2439,2469,2529,2546,2504,2364,2422,2358,2471,2391,2432,2386,2388,2511,2465,2397,2387,2437,2410,2478,2416,2374,2439,2424,2441,2457,2418,2396,2377,2422,2506,2440,2476,2431,2371,2473,2421,2405,2408,2392,2351,2490,2495,2414,2373,2462,2466,2418,2388,2486,2438,2438,2469,2473,2351,2390,2434,2427,2391,2429,2483,2425,2410,2410,2501,2580,2410,2439,2472,2563,2480,2491,2470,2387,2616,2437,2509,2436,2409,2503,2362,2547,2464,2475,2417,2402,2452,2546,2438,2380,2389,2447,2314,2491,2389,2509,2378,2415,2372,2494,2399,2382,2412,2362,2455,2436,2509,2413,2398,2437,2466,2487,2443,2455,2411,2407,2471,2557,2418,2421,2393,2539,2382,2489,2437,2365,2476,2429,2461,2396,2430,2572,2432,2372,2426,2442,2511,2415,2497,2376,2473,2440,2418,2468,2443,2432,2472,2415,2541,2492,2476,2487,2416,2398,2438,2354,2438,2440,2365,2409,2352,2414,2435,2330,2437,2372,2426,2401,2483,2408,2439,2367,2428,2423,2461,2453,2455,2509,2404,2446,2377,2468,2569,2434,2386,2463,2408,2468,2468,2433,2420,2448,2438,2533,2392,2530,2408,2497,2453,2405,2423,2392,2475,2430,2425,2496,2380,2405,2535,2438,2478,2484,2443,2388,2375,2398,2437,2443,2427,2498,2441,2393,2475,2391,2359,2465,2411,2428,2459,2475,2415,2452,2448,2421,2433,2440,2441,2408,2433,2524,2429,2440,2436,2455,2444,2411,2457,2420,2442,2359,2491,2437,2495,2431,2473,2431,2379,2413,2395,2433,2454,2340,2439,2437,2407,2445,2273,2471,2439,2489,2379,2505,2408,2476,2461,2366,2483,2396,2453,2503,2431,2440,2495,2395,2479,2293,2373,2383,2526,2439,2414,2392,2434,2464,2512,2413,2462,2392,2349,2378,2423,2405,2325,2475,2481,2420,2425,2439,2378,2462,2477,2435,2458,2442,2437,2549,2445,2436,2439,2464,2436,2412,2358,2479,2416,2429,2414,2434,2469,2401,2374,2508,2445,2515,2476,2328,2438,2448,2440,2493,2415,2448,2466,2541,2409,2462,2485,2392,2431,2396,2436,2429,2441,2475,2428,2396,2439,2392,2468,2431,2502,2440,2430,2424,2394,2480,2399,2405,2446,2389,2297,2415,2452,2524,2473,2370,2438,2444,2420,2467,2423,2438,2403,2434,2439,2382,2346,2439,2391,2362,2444,2487,2410,2461,2357,2439,2546,2477,2446,2438,2429,2474,2443,2497,2441,2398,2411,2407,2443,2466,2414,2374,2379,2332,2418,2437,2419,2509,2452,2452,2510,2450,2379,2371,2494,2368,2400,2398,2493,2434,2544,2379,2436,2411,2453,2468,2365,2436,2481,2415,2490,2412,2479,2325,2462,2455,2376,2439,2521,2419,2475,2471,2606,2417,2436,2460,2533,2456,2454,2362,2415,2465,2406,2511,2414,2484,2376,2392,2431,2516,2480,2417,2398,2439,2446,2462,2452,2517,2472,2417,2430,2397,2427,2469,2419,2442,2557,2439,2358,2472,2417,2513,2437,2447,2427,2542,2460,2436,2419,2478,2495,2445,2454,2406,2379,2489,2390,2534,2396,2416,2451,2417,2454,2506,2409,2395,2400,2379,2430,2401,2412,2417,2381,2454,2414,2437,2392,2542,2399,2497,2374,2337,2459,2417,2472,2531,2399,2475,2420,2440,2451,2416,2438,2443,2420,2488,2367,2362,2450,2560,2438,2494,2526,2437,2421,2456,2419,2468,2430,2475,2444,2418,2444,2476,2400,2431,2522,2535,2535,2445,2443,2387,2370,2356,2356,2438,2470,2385,2468,2472,2521,2447,2372,2457,2404,2467,2406,2524,2388,2345,2519,2309,2390,2348,2401,2443,2391,2366,2453,2290,2519,2394,2427,2490,2369,2495,2431,2477,2495,2397,2334,2534,2485,2373,2435,2480,2341,2480,2337,2457,2410,2427,2457,2416,2448,2423,2414,2448,2397,2388,2448,2459,2475,2485,2436,2456,2498,2365,2446,2427,2382,2552,2454,2578,2433,2437,2441,2471,2378,2466,2377,2439,2409,2410,2409,2452,2495,2433,2404,2460,2409,2432,2409,2438,2470,2406,2438,2458,2570,2306,2458,2474,2369,2381,2470,2426,2381,2437,2441,2448,2474,2426,2443,2443,2361,2487,2426,2487,2459,2474,2409,2415,2315,2394,2487,2350,2336,2437,2412,2439,2359,2435,2451,2410,2442,2423,2434,2478,2428,2414,2356,2478,2352,2423,2412,2426,2454,2439,2452,2480,2497,2330,2450,2468,2486,2462,2404,2455,2511,2451,2553,2428,2412,2478,2416,2417,2494,2463,2490,2391,2354,2464,2448,2465,2483,2492,2403,2458,2459,2470,2560,2425,2442,2439,2404,2450,2418,2439,2406,2489,2404,2443,2468,2438,2437,2349,2428,2465,2493,2498,2521,2422,2371,2437,2453,2432,2367,2472,2381,2473,2437,2385,2404,2369,2499,2411,2496,2398,2414,2379,2289,2422,2447,2415,2397,2432,2415,2430,2425,2374,2479,2452,2424,2491,2477,2402,2489,2489,2414,2388,2479,2529,2459,2487,2434,2493,2428,2433,2478,2487,2435,2443,2447,2455,2499,2415,2501,2366,2358,2467,2473,2394,2376,2428,2388,2427,2438,2492,2448,2462,2480,2509,2437,2422,2419,2507,2363,2369,2483,2389,2496,2389,2402,2426,2440,2401,2389,2409,2425,2457,2437,2479,2412,2428,2396,2490,2490,2519,2439,2448,2470,2448,2494,2439,2475,2681,2460,2414,2473,2403,2475,2456,2473,2425,2456,2368,2453,2337,2439,2353,2440,2396,2533,2426,2460,2415,2418,2439,2498,2475,2467,2366,2369,2536,2488,2438,2472,2484,2369,2430,2434,2500,2407,2505,2373,2458,2396,2496,2444,2482,2491,2374,2422,2408,2363,2446,2410,2497,2484,2326,2514,2360,2478,2402,2463,2403,2371,2392,2384,2437,2371,2517,2381,2416,2373,2411,2384,2467,2440,2394,2393,2512,2359,2440,2443,2475,2394,2441,2425,2404,2461,2403,2356,2417,2493,2356,2512,2447,2524,2488,2357,2556,2453,2437,2476,2453,2420,2463,2453,2517,2443,2425,2443,2419,2457,2395,2402,2470,2384,2413,2339,2430,2502,2424,2429,2471,2361,2369,2464,2395,2481,2419,2404,2482,2436,2411,2457,2460,2419,2425,2485,2464,2440,2371,2325,2416,2388,2390,2452,2372,2421,2399,2419,2407,2469,2394,2519,2464,2463,2393,2346,2446,2465,2401,2447,2426,2471,2505,2430,2440,2413,2409,2490,2438,2469,2410,2449,2535,2490,2393,2412,2479,2426,2356,2435,2399,2494,2430,2459,2364,2401,2483,2438,2436,2453,2441,2425,2476,2395,2415,2423,2374,2398,2466,2440,2417,2364,2416,2469,2424,2418,2420,2484,2485,2484,2412,2421,2498,2462,2405,2529,2549,2467,2418,2442,2408,2441,2487,2465,2397,2458,2405,2413,2391,2389,2346,2430,2465,2397,2478,2424,2406,2312,2497,2399,2460,2494,2487,2508,2446,2354,2415,2363,2482,2502,2390,2458,2420,2327,2459,2512,2451,2363,2468,2504,2461,2435,2442,2537,2412,2438,2482,2442,2503,2421,2434,2379,2420,2454,2448,2435,2388,2369,2385,2436,2403,2424,2447,2387,2440,2482,2401,2455,2345,2504,2515,2452,2479,2413,2317,2416,2433,2469,2459,2425,2408,2482,2457,2444,2436,2481,2412,2432,2555,2482,2422,2492,2497,2506,2488,2424,2478,2299,2409,2403,2465,2417,2455,2448,2412,2444,2502,2439,2489,2493,2455,2482,2440,2453,2521,2408,2466,2483,2464,2472,2325,2412,2479,2490,2460,2379,2436,2479,2563,2388,2443,2544,2510,2440,2414,2463,2334,2518,2389,2346,2490,2487,2468,2439,2372,2460,2422,2467,2450,2421,2495,2356,2368,2413,2436,2464,2412,2469,2453,2474,2463,2445,2351,2462,2485,2435,2495,2417,2438,2383,2495,2483,2437,2385,2481,2522,2382,2480,2445,2498,2449,2363,2357,2540,2367,2466,2424,2527,2422,2405,2446,2365,2500,2366,2386,2502,2436,2457,2572,2386,2477,2500,2437,2416,2471,2410,2431,2476,2255,2465,2408,2493,2466,2440,2437,2416,2410,2385,2391,2457,2457,2430,2439,2494,2484,2356,2503,2328,2412]},{"counters":[2416,2350,2411,2376,2370,2446,2421,2418,2416,2450,2423,2452,2426,2347,2468,2452,2407,2452,2449,2383,2422,2460,2446,2403,2473,2366,2425,2503,2441,2437,2494,2365,2390,2461,2322,2492,2432,2446,2419,2360,2456,2481,2445,2437,2392,2413,2470,2426,2327,2424,2385,2380,2461,2431,2415,2370,2495,2442,2454,2485,2449,2403,2426,2356,2437,2472,2495,2451,2289,2333,2481,2410,2418,2456,2444,2465,2439,2525,2502,2436,2401,2502,2447,2405,2437,2415,2466,2420,2476,2311,2467,2545,2419,2483,2388,2419,2468,2361,2366,2442,2479,2386,2485,2459,2416,2440,2432,2530,2403,2526,2462,2335,2441,2391,2438,2370,2407,2458,2478,2487,2461,2445,2456,2426,2507,2505,2486,2340,2455,2429,2392,2373,2449,2437,2423,2482,2402,2372,2358,2425,2449,2394,2388,2458,2501,2407,2439,2504,2385,2421,2503,2544,2458,2412,2368,2391,2399,2381,2389,2409,2517,2436,2420,2404,2414,2508,2424,2435,2510,2479,2522,2462,2442,2412,2455,2436,2419,2477,2394,2443,2515,2471,2388,2400,2480,2526,2441,2393,2468,2372,2488,2462,2441,2404,2376,2417,2434,2512,2413,2446,2478,2426,2527,2413,2469,2434,2374,2388,2493,2456,2349,2333,2449,2542,2438,2441,2386,2513,2493,2601,2399,2419,2385,2423,2441,2437,2540,2461,2427,2454,2421,2404,2356,2420,2390,2376,2418,2437,2481,2483,2474,2385,2310,2506,2492,2441,2460,2466,2454,2537,2508,2341,2530,2378,2425,2430,2406,2404,2368,2475,2484,2447,2409,2454,2478,2426,2437,2337,2439,2371,2430,2473,2566,2444,2445,2587,2457,2444,2441,2531,2394,2452,2569,2389,2427,2485,2520,2369,2388,2424,2438,2414,2366,2442,2458,2474,2462,2428,2375,2409,2433,2485,2461,2443,2406,2404,2433,2448,2397,2338,2498,2510,2324,2449,2368,2456,2445,2388,2475,2440,2541,2374,2406,2493,2427,2435,2423,2352,2487,2515,2476,2440,2420,2468,2323,2424,2365,2417,2412,2436,2443,2491,2449,2429,2451,2468,2435,2463,2466,2454,2420,2491,2407,2371,2480,2437,2318,2478,2481,2469,2466,2473,2385,2462,2468,2424,2427,2491,2483,2451,2437,2465,2390,2423,2449,2431,2485,2437,2410,2380,2345,2551,2417,2435,2506,2395,2408,2474,2518,2421,2358,2539,2475,2420,2415,2392,2397,2338,2437,2443,2433,2520,2443,2398,2472,2356,2433,2321,2505,2428,2478,2442,2335,2486,2389,2438,2417,2455,2405,2436,2414,2561,2402,2455,2408,2428,2421,2378,2384,2399,2436,2386,2432,2369,2423,2353,2471,2452,2383,2385,2285,2477,2542,2489,2441,2445,2426,2356,2449,2405,2493,2492,2394,2409,2452,2436,2414,2436,2498,2451,2465,2445,2471,2429,2313,2470,2447,2465,2465,2447,2503,2439,2391,2420,2392,2459,2376,2402,2442,2492,2445,2445,2442,2450,2379,2439,2497,2432,2433,2392,2447,2461,2433,2506,2436,2438,2442,2368,2386,2425,2389,2321,2399,2512,2350,2453,2440,2499,2451,2445,2347,2419,2514,2450,2429,2504,2356,2438,2401,2429,2383,2411,2470,2461,2396,2479,2356,2342,2421,2503,2438,2437,2422,2462,2458,2417,2448,2447,2486,2494,2412,2406,2417,2416,2442,2456,2408,2417,2436,2420,2446,2456,2355,2446,2444,2411,2471,2425,2521,2486,2390,2415,2461,2432,2483,2379,2440,2441,2378,2483,2446,2343,2388,2446,2398,2378,2389,2477,2395,2432,2412,2573,2437,2404,2342,2437,2487,2455,2440,2439,2463,2401,2463,2419,2459,2453,2438,2416,2423,2426,2443,2471,2471,2548,2466,2452,2415,2440,2340,2313,2453,2469,2416,2420,2436,2447,2360,2451,2437,2448,2495,2520,2418,2488,2359,2481,2467,2438,2455,2389,2416,2441,2382,2397,2403,2421,2418,2366,2356,2471,2437,2431,2471,2479,2442,2463,2428,2429,2420,2425,2381,2395,2414,2372,2429,2382,2502,2352,2392,2499,2408,2448,2440,2495,2470,2392,2518,2490,2470,2438,2433,2506,2432,2481,2472,2475,2394,2483,2358,2538,2461,2418,2482,2400,2445,2444,2505,2473,2556,2413,2429,2380,2504,2446,2431,2456,2394,2448,2437,2375,2447,2458,2365,2531,2410,2438,2460,2453,2438,2454,2439,2399,2439,2461,2397,2408,2447,2337,2511,2557,2509,2391,2423,2422,2415,2437,2462,2544,2466,2429,2559,2385,2431,2535,2493,2383,2384,2396,2509,2537,2484,2437,2429,2327,2440,2336,2464,2402,2382,2427,2477,2485,2412,2494,2394,2464,2431,2434,2446,2411,2467,2459,2484,2447,2414,2405,2367,2501,2400,2540,2482,2440,2417,2388,2395,2476,2363,2475,2493,2401,2437,2490,2411,2382,2421,2461,2438,2355,2424,2381,2439,2470,2450,2407,2482,2444,2455,2447,2470,2379,2534,2422,2376,2434,2430,2498,2419,2462,2428,2513,2480,2437,2403,2496,2418,2455,2425,2370,2448,2478,2422,2440,2529,2454,2438,2460,2492,2504,2423,2465,2428,2466,2449,2447,2261,2446,2512,2396,2414,2440,2394,2423,2510,2462,2453,2512,2493,2430,2534,2397,2379,2437,2416,2391,2438,2472,2442,2540,2477,2421,2399,2375,2391,2536,2369,2440,2448,2504,2391,2448,2441,2413,2471,2425,2471,2320,2357,2465,2430,2437,2505,2400,2501,2485,2355,2437,2602,2454,2410,2443,2419,2437,2349,2456,2475,2437,2449,2426,2355,2483,2488,2419,2434,2387,2425,2428,2378,2409,2426,2409,2416,2504,2440,2431,2534,2459,2521,2449,2475,2367,2386,2466,2438,2451,2468,2474,2403,2435,2445,2336,2437,2499,2482,2342,2372,2515,2378,2546,2560,2507,2501,2358,2466,2529,2436,2437,2325,2433,2462,2407,2363,2480,2358,2501,2419,2518,2465,2388,2398,2477,2540,2420,2436,2533,2415,2491,2440,2416,2519,2480,2421,2508,2433,2499,2544,2494,2426,2421,2462,2439,2311,2438,2439,2496,2497,2507,2508,2383,2456,2473,2478,2426,2443,2508,2467,2396,2400,2429,2319,2430,2367,2461,2431,2385,2437,2385,2477,2412,2369,2453,2488,2467,2390,2459,2436,2453,2416,2437,2421,2456,2420,2532,2422,2428,2460,2378,2492,2470,2375,2430,2432,2390,2411,2491,2440,2564,2349,2393,2442,2538,2359,2458,2463,2345,2419,2382,2547,2429,2389,2447,2435,2396,2447,2459,2532,2420,2466,2390,2402,2518,2367,2484,2494,2457,2398,2460,2538,2359,2439,2466,2489,2458,2478,2402,2404,2364,2428,2315,2351,2455,2430,2356,2489,2422,2415,2450,2435,2439,2450,2473,2335,2399,2386,2458,2398,2430,2478,2479,2452,2347,2455,2379,2473,2429,2408,2389,2534,2364,2457,2395,2414,2404,2467,2538,2447,2434,2420,2443,2432,2420,2382,2382,2423,2516,2400,2343,2534,2520,2468,2404,2482,2476,2433,2388,2519,2416,2477,2429,2460,2412,2411,2464,2404,2435,2415,2481,2453,2447,2408,2467,2536,2423,2459,2469,2440,2416,2478,2440,2437,2403,2412,2360,2369,2491,2358,2465,2396,2454,2353,2402,2483,2469,2389,2483,2375,2381,2441,2452,2417,2398,2543,2363,2473,2438,2396,2452,2390,2447,2446,2476,2440,2346,2465,2417,2373,2437,2482,2476,2444,2409,2400,2412,2453,2473,2520,2398,2442,2418,2461,2421,2395,2392,2412,2486,2350,2454,2398,2391,2371,2473,2549,2465,2497,2415,2478,2456,2514,2381,2504,2438,2439,2346,2455,2429,2459,2394,2361,2471,2390,2434,2426,2462,2437,2413,2515,2444,2414,2412,2370,2463,2427,2486,2443,2510,2512,2468,2400,2408,2412,2477,2325,2478,2475,2394,2326,2393,2503,2422,2392,2395,2347,2393,2282,2470,2415,2430,2455,2460,2489,2442,2459,2497,2456,2477,2404,2432,2419,2559,2371,2346,2416,2476,2446,2439,2529,2477,2456,2459,2466,2409,2466,2412,2467,2436,2483,2408,2432,2392,2426,2500,2459,2528,2395,2387,2378,2395,2495,2559,2498,2446,2509,2347,2445,2407,2415,2445,2518,2442,2447,2432,2443,2520,2429,2476,2494,2397,2406,2448,2440,2520,2436,2438,2453,2378,2479,2435,2543,2415,2452,2436,2470,2460,2401,2414,2405,2438,2451,2436,2438,2461,2478,2468,2443,2377,2408,2429,2358,2467,2421,2439,2405,2455,2397,2446,2398,2438,2562,2384,2416,2406,2417,2496,2444,2334,2474,2429,2484,2488,2469,2571,2374,2481,2494,2412,2356,2451,2368,2438,2470,2440,2428,2512,2365,2347,2436,2424,2447,2460,2397,2482,2459,2440,2465,2427,2409,2374,2393,2451,2454,2418,2469,2437,2477,2419,2503,2441,2391,2522,2464,2493,2527,2509,2388,2447,2494,2416,2441,2499,2362,2482,2486,2367,2428,2389,2454,2431,2381,2437,2414,2367,2439,2489,2406,2498,2421,2414,2423,2414,2342,2442,2459,2506,2501,2301,2538,2482,2366,2397,2491,2538,2424,2488,2378,2414,2454,2449,2469,2466,2450,2422,2395,2374,2425,2411,2458,2392,2438,2423,2445,2537,2496,2324,2402,2446,2375,2371,2479,2435,2514,2363,2472,2416,2436,2468,2387,2451,2389,2358,2496,2421,2427,2428,2467,2376,2502,2510,2394,2395,2468,2447,2409,2355,2441,2460,2501,2452,2418,2429,2425,2485,2467,2428,2451,2478,2497,2488,2454,2362,2438,2410,2463,2474,2407,2438,2442,2434,2424,2489,2514,2444,2490,2531,2416,2450,2354,2373,2417,2440,2448,2465,2514,2388,2453,2413,2414,2388,2453,2383,2404,2477,2491,2409,2425,2450,2468,2436,2394,2464,2471,2540,2379,2423,2439,2533,2406,2444,2493,2416,2442,2440,2457,2343,2453,2439,2427,2547,2499,2433,2455,2473,2376,2494,2463,2436,2358,2392,2419,2397,2411,2456,2326,2491,2364,2421,2411,2481,2396,2474,2398,2444,2446,2407,2446,2455,2439,2391,2431,2361,2493,2392,2486,2490,2477,2407,2421,2389,2418,2443,2422,2401,2425,2548,2370,2474,2480,2428,2427,2441,2446,2499,2344,2334,2457,2442,2434,2459,2440,2383,2388,2365,2522,2479,2501,2444,2392,2376,2402,2518,2381,2447,2382,2487,2517,2456,2397,2439,2430,2455,2413,2474,2437,2461,2409,2531,2455,2447,2374,2381,2448,2443,2403,2391,2437,2375,2398,2448,2349,2431,2470,2481,2362,2416,2421,2378,2467,2511,2438,2482,2402,2427,2422,2467,2440,2424,2410,2544,2488,2493,2444,2378,2407,2420,2442,2529,2401,2425,2408,2363,2474,2438,2424,2372,2307,2474,2346,2383,2442,2416,2511,2550,2460,2380,2399,2395,2412,2382,2400,2522,2502,2399,2542,2471,2460,2507,2410,2405,2426,2478,2387,2371,2349,2450,2358,2470,2409,2441,2430,2441,2420,2595,2388,2398,2448,2435,2445,2572,2453,2464,2495,2496,2439,2553,2474,2399,2495,2380,2438,2523,2431,2440,2410,2364,2502,2449,2449,2492,2466,2418,2442,2430,2452,2324,2416,2484,2438,2397,2428,2423,2271,2376,2419,2405,2437,2399,2293,2438,2479,2414,2482,2366,2454,2366,2427,2444,2390,2428,2448,2429,2533,2403,2363,2414,2385,2453,2503,2498,2413,2367,2417,2358,2458,2507,2489,2434,2499,2380,2386,2425,2502,2481,2427,2478,2545,2445,2472,2428,2449,2392,2454,2377,2415,2404,2449,2369,2473,2492,2488,2513,2531,2478,2384,2476,2312,2444,2374,2411,2459,2415,2389,2397,2316,2420,2413,2448,2428,2487,2422,2462,2443,2417,2390,2497,2459,2500,2514,2413,2351,2473,2453,2509,2356,2439,2438,2428,2396,2505,2435,2512,2499,2326,2454,2339,2483,2391,2461,2428,2414,2411,2437,2477,2348,2470,2354,2440,2477,2490,2437,2363,2559,2445,2415,2350,2368,2471,2384,2451,2435,2373,2381,2447,2456,2437,2474,2385,2456,2462,2381,2414,2453,2474,2439,2437,2451,2452,2443,2465,2437,2367,2478,2381,2531,2480,2398,2457,2374,2380,2466,2418,2316,2366,2433,2360,2415,2438,2485,2517,2429,2421,2403,2492,2465,2437,2410,2480,2496,2449,2304,2408,2436,2461,2428,2452,2449,2441,2450,2381,2449,2427,2367,2366,2319,2416,2515,2466,2436,2450,2411,2443,2440,2516,2531,2437,2470,2472,2370,2533,2457,2427,2492,2374,2423,2457,2483,2403,2430,2405,2381,2448,2470,2387,2425,2408,2477,2480,2396,2427,2441,2392,2391,2463,2434,2419,2450,2422,2482,2304,2512,2527]},{"counters":[2424,2427,2433,2428,2428,2579,2440,2381,2441,2437,2505,2325,2460,2451,2440,2437,2432,2384,2412,2384,2410,2426,2449,2433,2358,2440,2457,2446,2508,2344,2429,2419,2438,2415,2465,2445,2333,2417,2489,2428,2520,2510,2504,2428,2480,2379,2420,2429,2390,2407,2493,2509,2454,2435,2445,2440,2501,2423,2420,2490,2445,2431,2397,2438,2386,2403,2382,2468,2424,2478,2513,2423,2428,2457,2359,2424,2367,2452,2349,2506,2480,2389,2478,2441,2437,2397,2384,2429,2416,2437,2488,2407,2385,2404,2397,2430,2344,2434,2437,2416,2392,2430,2412,2447,2486,2482,2402,2395,2508,2415,2466,2423,2490,2368,2436,2446,2386,2358,2359,2439,2372,2411,2468,2482,2526,2427,2463,2412,2499,2427,2427,2392,2414,2436,2438,2505,2477,2477,2402,2445,2412,2420,2509,2372,2360,2491,2390,2469,2427,2442,2543,2405,2435,2500,2310,2501,2456,2495,2384,2483,2441,2423,2369,2393,2438,2453,2379,2478,2379,2351,2473,2409,2530,2513,2491,2411,2445,2349,2446,2449,2460,2428,2498,2472,2412,2511,2480,2436,2408,2444,2464,2500,2443,2454,2457,2513,2495,2464,2536,2440,2469,2510,2416,2451,2391,2453,2460,2398,2355,2512,2353,2472,2379,2448,2488,2467,2409,2535,2412,2449,2480,2456,2352,2407,2439,2438,2463,2432,2478,2391,2440,2369,2392,2517,2440,2486,2454,2471,2416,2423,2429,2440,2443,2416,2421,2438,2505,2440,2383,2423,2403,2536,2476,2485,2434,2464,2498,2493,2422,2492,2379,2501,2413,2481,2448,2534,2365,2515,2533,2465,2453,2419,2405,2503,2407,2448,2442,2417,2446,2441,2477,2466,2420,2405,2373,2374,2422,2394,2437,2397,2395,2481,2493,2481,2440,2412,2387,2440,2437,2453,2335,2433,2493,2439,2434,2439,2531,2437,2453,2439,2377,2468,2346,2347,2391,2369,2418,2437,2438,2382,2425,2414,2449,2335,2490,2336,2489,2413,2443,2426,2493,2390,2367,2518,2422,2434,2411,2410,2345,2506,2480,2424,2429,2407,2419,2469,2351,2375,2409,2384,2460,2455,2490,2342,2372,2453,2406,2382,2405,2427,2508,2419,2489,2507,2397,2578,2438,2371,2498,2400,2394,2452,2304,2416,2453,2433,2423,2357,2368,2343,2454,2403,2464,2438,2485,2428,2362,2487,2401,2406,2473,2484,2435,2393,2440,2458,2418,2467,2364,2438,2432,2543,2419,2381,2503,2478,2479,2448,2426,2369,2568,2441,2358,2499,2466,2370,2426,2448,2421,2337,2483,2438,2417,2382,2557,2456,2412,2398,2457,2421,2443,2428,2374,2393,2393,2414,2492,2462,2377,2410,2479,2509,2394,2513,2410,2452,2438,2433,2480,2477,2491,2414,2473,2320,2359,2395,2433,2557,2455,2322,2525,2503,2508,2396,2454,2434,2432,2429,2447,2491,2532,2466,2604,2436,2513,2492,2421,2496,2472,2504,2496,2379,2425,2424,2494,2445,2448,2378,2454,2431,2438,2456,2440,2511,2474,2406,2419,2344,2503,2419,2445,2369,2526,2419,2475,2461,2458,2438,2576,2542,2518,2491,2339,2438,2442,2444,2469,2477,2453,2415,2460,2437,2413,2381,2442,2468,2399,2417,2386,2417,2424,2448,2442,2445,2430,2438,2503,2535,2404,2463,2410,2436,2373,2395,2445,2486,2441,2472,2330,2550,2428,2455,2530,2413,2318,2412,2482,2424,2400,2473,2483,2439,2386,2440,2455,2408,2363,2415,2437,2440,2527,2406,2373,2542,2441,2365,2435,2447,2489,2493,2506,2431,2375,2401,2472,2437,2460,2443,2445,2386,2464,2429,2473,2455,2464,2437,2417,2426,2465,2422,2428,2526,2489,2436,2465,2467,2481,2522,2434,2448,2400,2389,2447,2419,2435,2350,2347,2440,2553,2382,2429,2526,2368,2460,2426,2437,2388,2421,2397,2429,2447,2505,2495,2389,2474,2465,2525,2447,2437,2306,2418,2363,2380,2425,2486,2435,2437,2516,2446,2365,2430,2439,2390,2424,2423,2429,2424,2519,2376,2440,2441,2400,2436,2378,2452,2439,2403,2393,2345,2379,2434,2466,2455,2512,2381,2438,2497,2479,2392,2414,2437,2481,2380,2380,2398,2419,2470,2430,2409,2413,2504,2465,2313,2476,2434,2326,2402,2467,2444,2517,2374,2386,2490,2437,2503,2392,2432,2386,2409,2424,2467,2465,2403,2446,2330,2499,2441,2401,2428,2459,2441,2440,2433,2407,2375,2469,2383,2403,2394,2419,2504,2430,2446,2452,2415,2377,2391,2385,2354,2419,2354,2454,2492,2491,2425,2432,2406,2511,2446,2494,2385,2461,2437,2467,2449,2476,2411,2440,2437,2481,2475,2301,2469,2451,2471,2449,2353,2438,2281,2512,2404,2416,2505,2399,2443,2339,2438,2396,2436,2418,2400,2402,2443,2412,2385,2401,2419,2550,2498,2490,2462,2467,2367,2434,2451,2470,2427,2436,2417,2433,2452,2439,2451,2471,2477,2416,2489,2467,2436,2482,2419,2452,2376,2354,2444,2479,2385,2424,2437,2504,2493,2362,2500,2430,2439,2445,2534,2509,2436,2475,2415,2436,2455,2512,2446,2472,2357,2368,2409,2415,2450,2429,2511,2408,2482,2406,2406,2470,2410,2438,2490,2431,2417,2441,2416,2485,2386,2482,2519,2466,2451,2465,2381,2375,2369,2437,2429,2459,2352,2504,2474,2457,2481,2474,2423,2399,2417,2454,2552,2350,2451,2440,2536,2438,2385,2433,2466,2501,2434,2381,2380,2390,2501,2437,2357,2583,2374,2431,2449,2480,2429,2488,2395,2362,2401,2367,2348,2450,2423,2371,2492,2456,2507,2466,2398,2418,2439,2367,2420,2404,2413,2584,2394,2415,2454,2371,2373,2486,2515,2370,2435,2522,2466,2478,2447,2466,2465,2431,2500,2439,2327,2346,2303,2478,2410,2359,2523,2473,2430,2380,2437,2426,2423,2359,2373,2456,2502,2416,2530,2359,2446,2548,2448,2485,2458,2468,2371,2423,2393,2421,2504,2482,2404,2441,2461,2395,2442,2474,2459,2415,2449,2489,2475,2349,2343,2445,2377,2458,2435,2429,2440,2447,2380,2401,2450,2393,2421,2467,2417,2511,2394,2363,2425,2451,2416,2451,2459,2413,2371,2413,2425,2437,2441,2433,2460,2505,2448,2520,2498,2429,2461,2388,2469,2461,2402,2446,2478,2437,2367,2468,2529,2538,2407,2473,2461,2458,2508,2467,2415,2473,2436,2473,2437,2383,2423,2408,2463,2439,2484,2499,2502,2429,2464,2452,2424,2304,2351,2481,2526,2425,2441,2418,2462,2473,2413,2454,2483,2507,2451,2387,2439,2409,2476,2396,2478,2402,2411,2444,2397,2430,2437,2346,2450,2432,2490,2416,2438,2509,2463,2426,2428,2506,2438,2419,2498,2509,2374,2408,2373,2381,2390,2400,2436,2485,2438,2376,2454,2472,2389,2437,2393,2436,2428,2474,2363,2396,2438,2514,2383,2443,2373,2397,2388,2441,2422,2450,2418,2460,2384,2394,2433,2429,2413,2428,2470,2418,2506,2481,2507,2369,2484,2364,2440,2512,2457,2457,2453,2439,2557,2440,2475,2389,2454,2455,2456,2451,2405,2434,2392,2459,2521,2436,2427,2454,2497,2435,2439,2460,2401,2422,2438,2507,2498,2407,2410,2450,2342,2389,2475,2436,2455,2440,2333,2403,2467,2474,2451,2525,2414,2440,2413,2494,2394,2495,2318,2453,2375,2469,2369,2390,2478,2536,2437,2515,2409,2399,2417,2518,2443,2505,2379,2481,2374,2449,2431,2437,2451,2410,2444,2454,2453,2430,2495,2390,2459,2467,2383,2392,2432,2436,2512,2411,2427,2400,2442,2419,2404,2431,2442,2527,2377,2389,2493,2348,2583,2428,2436,2444,2487,2468,2461,2422,2447,2385,2471,2492,2455,2440,2366,2436,2449,2447,2370,2439,2415,2428,2434,2408,2399,2461,2375,2410,2417,2527,2521,2364,2501,2446,2497,2441,2440,2421,2442,2403,2443,2465,2439,2405,2362,2444,2456,2460,2409,2405,2481,2409,2466,2443,2416,2389,2421,2388,2484,2494,2473,2425,2569,2398,2464,2437,2430,2323,2412,2428,2462,2406,2480,2491,2390,2401,2371,2502,2451,2454,2442,2423,2421,2430,2431,2392,2470,2428,2480,2403,2385,2453,2474,2412,2508,2470,2480,2485,2455,2339,2483,2409,2373,2435,2387,2432,2451,2405,2550,2475,2380,2409,2479,2463,2458,2451,2499,2413,2493,2387,2477,2422,2438,2437,2408,2413,2395,2519,2449,2406,2390,2415,2423,2437,2530,2434,2477,2474,2443,2544,2420,2437,2411,2441,2403,2433,2429,2494,2442,2372,2360,2391,2317,2416,2486,2382,2508,2346,2470,2380,2426,2411,2328,2414,2331,2440,2418,2383,2451,2323,2413,2482,2395,2436,2361,2416,2522,2492,2545,2425,2389,2458,2481,2434,2472,2517,2437,2439,2387,2545,2505,2482,2375,2438,2420,2458,2556,2470,2407,2386,2416,2475,2386,2467,2497,2449,2409,2476,2359,2416,2458,2518,2469,2445,2464,2440,2462,2412,2437,2500,2448,2370,2390,2501,2376,2431,2446,2416,2520,2367,2501,2449,2408,2483,2418,2460,2325,2437,2445,2501,2453,2445,2439,2482,2463,2465,2388,2314,2398,2455,2484,2445,2462,2423,2401,2443,2439,2379,2440,2510,2375,2350,2415,2510,2369,2377,2417,2440,2419,2448,2439,2402,2437,2459,2443,2421,2491,2437,2383,2458,2387,2434,2513,2403,2436,2407,2348,2452,2370,2459,2479,2437,2382,2552,2355,2409,2511,2458,2400,2450,2488,2496,2370,2362,2354,2368,2469,2470,2396,2406,2481,2438,2421,2436,2458,2480,2422,2509,2453,2486,2455,2481,2521,2482,2426,2414,2438,2493,2381,2468,2444,2561,2377,2417,2331,2458,2344,2508,2465,2493,2470,2424,2508,2363,2382,2447,2429,2394,2427,2460,2517,2387,2524,2432,2389,2354,2454,2454,2439,2490,2438,2497,2387,2519,2426,2476,2434,2450,2388,2451,2357,2381,2505,2458,2393,2428,2375,2465,2406,2475,2424,2445,2458,2401,2350,2541,2425,2454,2319,2441,2427,2347,2552,2442,2405,2404,2502,2483,2478,2461,2513,2464,2423,2410,2366,2507,2342,2399,2461,2348,2445,2439,2374,2413,2525,2441,2436,2499,2453,2450,2438,2425,2426,2473,2366,2411,2435,2467,2391,2395,2473,2437,2484,2460,2441,2429,2407,2352,2352,2336,2486,2456,2448,2458,2456,2443,2440,2447,2416,2427,2422,2419,2519,2487,2481,2400,2407,2450,2529,2481,2350,2467,2496,2408,2434,2438,2457,2407,2466,2438,2475,2420,2467,2427,2437,2420,2426,2428,2432,2414,2440,2533,2474,2454,2455,2471,2490,2375,2529,2437,2419,2494,2379,2401,2405,2436,2434,2382,2405,2443,2457,2396,2417,2437,2424,2439,2371,2530,2382,2441,2483,2417,2539,2465,2435,2385,2453,2490,2476,2441,2361,2488,2431,2415,2403,2444,2384,2471,2369,2419,2447,2409,2492,2422,2390,2471,2434,2489,2381,2459,2434,2415,2452,2478,2486,2339,2404,2440,2318,2436,2488,2380,2446,2382,2377,2447,2400,2459,2421,2377,2469,2403,2439,2408,2351,2415,2465,2414,2371,2439,2441,2536,2341,2432,2418,2431,2454,2413,2458,2476,2427,2435,2469,2512,2372,2441,2378,2502,2427,2454,2398,2370,2436,2494,2407,2423,2425,2372,2492,2521,2422,2420,2387,2459,2479,2448,2439,2492,2453,2509,2436,2506,2348,2380,2443,2425,2438,2416,2439,2476,2413,2452,2423,2425,2457,2443,2371,2428,2427,2398,2463,2472,2422,2482,2440,2521,2460,2496,2532,2488,2423,2405,2412,2507,2426,2389,2443,2526,2478,2436,2485,2531,2451,2471,2399,2398,2416,2442,2427,2427,2464,2390,2418,2398,2399,2369,2445,2345,2478,2435,2333,2518,2433,2468,2436,2426,2399,2403,2495,2504,2517,2499,2387,2467,2416,2372,2394,2336,2370,2392,2516,2403,2466,2446,2472,2439,2370,2427,2543,2465,2377,2486,2476,2478,2428,2385,2517,2440,2415,2469,2439,2458,2549,2434,2472,2443,2474,2431,2427,2439,2466,2395,2441,2414,2381,2437,2464,2347,2395,2408,2439,2381,2520,2401,2453,2494,2430,2418,2484,2378,2337,2447,2448,2460,2416,2420,2381,2443,2439,2423,2456,2399,2481,2517,2488,2344,2390,2384,2406,2343,2463,2338,2325,2426,2455,2463,2459,2430,2428,2379,2427,2393,2478,2437,2358,2528,2438,2434,2455,2392,2389,2391,2432,2445,2461,2438,2441,2417,2435,2433,2437,2404,2431,2419,2500,2386,2389,2426,2459,2396,2550,2421,2403,2476]},{"counters":[2389,2463,2324,2430,2437,2467,2458,2436,2399,2489,2473,2514,2480,2445,2424,2466,2437,2410,2492,2441,2503,2439,2422,2450,2442,2436,2572,2438,2419,2435,2353,2457,2406,2442,2509,2361,2406,2523,2332,2457,2381,2453,2411,2415,2439,2500,2485,2419,2319,2475,2363,2419,2436,2410,2322,2349,2517,2384,2433,2360,2423,2390,2300,2436,2381,2437,2430,2521,2317,2478,2420,2468,2453,2408,2386,2445,2412,2506,2404,2399,2416,2448,2447,2432,2459,2418,2394,2418,2374,2372,2388,2437,2489,2453,2412,2514,2404,2499,2481,2437,2430,2432,2437,2426,2440,2410,2480,2452,2536,2437,2402,2496,2407,2452,2440,2448,2497,2421,2347,2510,2416,2461,2390,2459,2340,2453,2560,2361,2413,2367,2352,2387,2438,2440,2487,2459,2441,2451,2424,2505,2445,2438,2445,2401,2404,2343,2462,2406,2465,2462,2383,2398,2418,2349,2371,2393,2408,2574,2385,2418,2401,2411,2479,2435,2358,2424,2394,2399,2474,2372,2438,2420,2324,2357,2412,2414,2404,2397,2397,2470,2448,2570,2440,2440,2430,2454,2406,2499,2374,2510,2381,2437,2359,2488,2424,2512,2461,2483,2458,2396,2367,2443,2455,2425,2440,2436,2418,2349,2446,2466,2520,2435,2451,2477,2433,2410,2370,2489,2361,2441,2364,2396,2457,2417,2472,2432,2518,2439,2449,2426,2444,2441,2360,2439,2435,2441,2429,2453,2479,2464,2489,2499,2417,2403,2554,2391,2467,2402,2395,2505,2342,2440,2463,2446,2336,2399,2461,2487,2460,2532,2453,2412,2436,2506,2366,2415,2403,2423,2464,2381,2312,2421,2398,2423,2493,2498,2506,2419,2417,2357,2456,2529,2463,2430,2397,2438,2573,2384,2415,2400,2471,2454,2411,2409,2476,2434,2379,2398,2412,2502,2369,2443,2347,2436,2417,2519,2480,2452,2382,2447,2406,2427,2315,2452,2438,2538,2478,2417,2516,2387,2474,2416,2418,2478,2530,2512,2464,2432,2430,2438,2387,2483,2394,2461,2439,2482,2392,2368,2444,2432,2547,2537,2477,2459,2454,2409,2479,2367,2410,2462,2440,2326,2407,2370,2402,2463,2450,2448,2487,2546,2441,2520,2461,2349,2336,2476,2430,2437,2457,2408,2383,2454,2402,2316,2371,2453,2354,2640,2393,2460,2383,2461,2440,2404,2436,2429,2508,2456,2333,2469,2360,2437,2401,2531,2529,2437,2411,2440,2356,2493,2437,2387,2476,2453,2483,2422,2380,2505,2431,2390,2398,2439,2366,2347,2437,2454,2454,2338,2466,2467,2524,2409,2468,2428,2437,2351,2402,2407,2546,2440,2437,2500,2398,2530,2505,2352,2410,2401,2396,2297,2412,2389,2322,2377,2412,2360,2488,2438,2434,2437,2415,2398,2420,2444,2434,2429,2406,2438,2428,2406,2462,2471,2491,2418,2535,2444,2432,2446,2492,2417,2477,2399,2426,2436,2427,2478,2484,2468,2400,2420,2419,2472,2487,2415,2397,2344,2423,2461,2448,2440,2440,2412,2484,2403,2426,2320,2431,2498,2447,2506,2366,2464,2409,2419,2408,2372,2480,2420,2363,2470,2487,2485,2400,2327,2464,2448,2427,2480,2437,2456,2441,2434,2524,2445,2437,2466,2468,2478,2510,2419,2454,2500,2442,2423,2472,2453,2427,2513,2433,2479,2413,2424,2494,2487,2492,2430,2352,2402,2438,2400,2472,2354,2406,2475,2372,2525,2466,2513,2527,2358,2435,2424,2425,2431,2436,2431,2389,2379,2430,2491,2472,2377,2434,2459,2507,2430,2469,2349,2433,2459,2441,2381,2471,2415,2345,2457,2347,2388,2488,2476,2398,2438,2473,2390,2455,2491,2469,2488,2444,2449,2428,2448,2372,2444,2395,2431,2414,2430,2385,2454,2378,2416,2448,2313,2504,2406,2436,2495,2481,2344,2439,2504,2437,2462,2444,2402,2384,2417,2398,2419,2425,2437,2475,2406,2469,2413,2400,2503,2377,2439,2494,2489,2375,2397,2526,2429,2289,2411,2439,2399,2431,2425,2460,2460,2442,2447,2388,2473,2456,2439,2399,2400,2376,2438,2392,2425,2440,2507,2440,2430,2381,2429,2455,2459,2389,2390,2438,2518,2469,2437,2443,2437,2452,2499,2505,2486,2458,2473,2358,2514,2439,2373,2432,2388,2514,2437,2518,2492,2483,2445,2406,2444,2369,2461,2431,2439,2437,2448,2423,2384,2381,2298,2479,2375,2470,2435,2408,2418,2492,2434,2436,2573,2408,2437,2452,2445,2464,2393,2359,2417,2529,2436,2389,2437,2439,2351,2493,2425,2445,2452,2468,2464,2333,2406,2441,2456,2512,2428,2476,2512,2415,2448,2448,2433,2264,2335,2535,2456,2458,2377,2464,2411,2461,2467,2432,2344,2382,2455,2502,2408,2398,2433,2481,2502,2437,2434,2443,2383,2430,2431,2471,2466,2532,2370,2433,2580,2408,2395,2339,2459,2446,2396,2467,2471,2350,2419,2419,2395,2367,2421,2500,2409,2318,2400,2466,2456,2421,2456,2499,2486,2392,2431,2458,2451,2456,2472,2530,2429,2429,2500,2500,2465,2438,2437,2445,2493,2425,2488,2477,2477,2395,2366,2440,2351,2490,2468,2433,2503,2476,2544,2437,2436,2434,2392,2428,2438,2395,2426,2439,2453,2418,2420,2438,2402,2438,2560,2437,2527,2470,2422,2475,2494,2521,2434,2354,2467,2509,2440,2418,2412,2435,2400,2436,2428,2471,2458,2509,2439,2426,2385,2406,2496,2438,2543,2496,2489,2376,2462,2407,2471,2445,2438,2423,2353,2477,2396,2401,2481,2483,2457,2437,2444,2453,2396,2450,2454,2474,2493,2451,2465,2393,2432,2415,2437,2410,2468,2514,2441,2428,2530,2512,2494,2461,2469,2398,2384,2384,2489,2440,2368,2348,2399,2448,2437,2528,2410,2405,2457,2358,2434,2432,2471,2467,2458,2381,2461,2536,2364,2463,2415,2441,2284,2509,2460,2462,2403,2403,2434,2444,2399,2440,2415,2430,2377,2414,2399,2490,2499,2434,2436,2442,2514,2424,2425,2384,2385,2369,2451,2405,2361,2500,2404,2408,2549,2421,2444,2415,2440,2455,2513,2471,2440,2506,2547,2476,2372,2440,2454,2444,2409,2439,2456,2477,2468,2380,2462,2412,2439,2519,2475,2410,2403,2417,2415,2313,2539,2498,2469,2530,2392,2469,2514,2426,2362,2384,2480,2442,2508,2468,2402,2382,2341,2363,2420,2533,2406,2473,2465,2467,2458,2434,2382,2451,2487,2363,2396,2398,2450,2416,2504,2450,2362,2406,2461,2444,2383,2431,2354,2509,2369,2386,2439,2469,2378,2529,2508,2385,2502,2393,2408,2403,2411,2524,2426,2444,2477,2473,2441,2446,2368,2489,2385,2564,2365,2438,2440,2460,2455,2481,2590,2517,2427,2521,2436,2371,2449,2444,2439,2473,2520,2401,2427,2406,2483,2464,2461,2439,2461,2439,2457,2408,2455,2421,2433,2475,2407,2451,2426,2491,2368,2382,2428,2395,2406,2400,2385,2453,2448,2455,2391,2436,2415,2482,2473,2463,2397,2387,2446,2460,2432,2437,2487,2401,2419,2437,2381,2360,2457,2393,2583,2369,2319,2428,2444,2471,2459,2441,2445,2438,2415,2405,2386,2404,2447,2478,2414,2482,2506,2476,2404,2392,2366,2397,2331,2363,2437,2488,2376,2388,2510,2391,2405,2383,2426,2455,2443,2444,2443,2346,2415,2389,2499,2482,2400,2501,2533,2445,2470,2417,2519,2423,2438,2581,2390,2439,2572,2423,2450,2438,2374,2399,2398,2438,2494,2436,2397,2433,2452,2501,2593,2400,2407,2421,2489,2458,2450,2411,2410,2423,2380,2428,2388,2403,2486,2417,2438,2456,2462,2435,2366,2497,2424,2505,2420,2423,2428,2442,2392,2459,2511,2515,2538,2373,2426,2385,2464,2427,2408,2367,2387,2424,2479,2415,2496,2483,2386,2383,2489,2418,2400,2508,2524,2440,2447,2373,2436,2447,2338,2450,2469,2461,2439,2409,2361,2489,2524,2437,2445,2513,2437,2412,2499,2420,2534,2419,2456,2419,2492,2439,2401,2326,2436,2474,2376,2462,2369,2373,2440,2468,2461,2396,2455,2427,2454,2470,2422,2458,2413,2419,2459,2430,2426,2496,2419,2487,2396,2482,2460,2465,2395,2439,2464,2428,2412,2445,2442,2348,2521,2411,2368,2414,2480,2332,2440,2310,2414,2497,2420,2413,2474,2538,2416,2437,2441,2394,2435,2430,2488,2462,2398,2500,2493,2406,2477,2425,2496,2403,2481,2439,2386,2440,2392,2425,2446,2357,2397,2485,2470,2380,2411,2452,2406,2458,2461,2440,2437,2388,2371,2385,2381,2506,2419,2428,2422,2407,2451,2465,2412,2548,2438,2436,2497,2421,2383,2370,2457,2434,2423,2477,2394,2420,2389,2427,2469,2424,2458,2397,2433,2453,2364,2448,2423,2443,2408,2521,2363,2385,2444,2408,2442,2491,2463,2404,2475,2426,2447,2411,2431,2416,2527,2393,2471,2433,2474,2406,2426,2427,2387,2514,2339,2400,2462,2505,2462,2474,2359,2486,2389,2502,2414,2403,2395,2434,2429,2526,2432,2430,2424,2453,2417,2458,2374,2439,2421,2394,2469,2379,2398,2400,2437,2480,2363,2374,2456,2467,2436,2474,2388,2485,2376,2450,2463,2385,2445,2392,2443,2539,2440,2412,2447,2475,2446,2416,2406,2456,2410,2416,2501,2452,2436,2397,2458,2433,2442,2428,2426,2391,2429,2339,2310,2475,2422,2440,2464,2452,2437,2469,2390,2482,2445,2409,2447,2428,2436,2389,2496,2378,2422,2399,2454,2457,2387,2452,2439,2430,2438,2441,2460,2383,2469,2385,2458,2393,2389,2447,2422,2511,2452,2546,2438,2366,2454,2442,2563,2441,2467,2398,2473,2526,2423,2492,2463,2365,2510,2483,2459,2403,2509,2421,2436,2477,2443,2447,2517,2449,2427,2426,2326,2469,2433,2511,2370,2410,2487,2430,2482,2420,2361,2437,2541,2446,2378,2295,2480,2449,2397,2416,2430,2393,2439,2461,2498,2447,2453,2415,2394,2496,2375,2420,2472,2416,2418,2454,2525,2426,2430,2409,2427,2544,2493,2441,2412,2555,2461,2405,2459,2464,2404,2371,2387,2425,2439,2439,2580,2446,2468,2521,2515,2465,2438,2438,2428,2423,2523,2469,2440,2366,2360,2508,2441,2397,2437,2415,2469,2430,2448,2492,2444,2429,2351,2423,2456,2450,2429,2418,2420,2480,2433,2416,2396,2433,2430,2417,2427,2443,2370,2407,2424,2314,2491,2516,2423,2418,2462,2443,2473,2434,2465,2413,2490,2424,2385,2437,2465,2410,2473,2499,2420,2410,2372,2415,2471,2488,2473,2380,2413,2417,2518,2450,2529,2390,2404,2473,2476,2424,2505,2496,2431,2514,2419,2489,2440,2413,2455,2484,2478,2464,2415,2444,2370,2470,2506,2384,2396,2403,2439,2408,2499,2411,2416,2382,2429,2396,2429,2350,2381,2399,2394,2360,2529,2403,2390,2518,2430,2506,2420,2438,2479,2432,2432,2392,2580,2526,2418,2370,2426,2410,2460,2505,2439,2397,2454,2369,2479,2377,2456,2453,2437,2481,2457,2413,2498,2464,2532,2468,2421,2394,2462,2390,2461,2479,2384,2437,2448,2495,2471,2470,2463,2472,2439,2459,2415,2433,2485,2432,2484,2393,2402,2438,2477,2415,2422,2437,2423,2474,2438,2412,2439,2575,2403,2428,2436,2371,2435,2377,2408,2425,2346,2406,2444,2405,2486,2341,2458,2401,2417,2412,2369,2448,2434,2439,2500,2437,2380,2435,2409,2449,2502,2424,2428,2477,2421,2484,2388,2369,2467,2475,2440,2377,2402,2380,2437,2512,2424,2429,2478,2399,2370,2422,2468,2484,2418,2479,2408,2496,2351,2530,2460,2520,2437,2458,2463,2527,2391,2401,2552,2437,2396,2477,2534,2412,2526,2346,2441,2416,2439,2488,2479,2428,2408,2488,2440,2514,2416,2429,2452,2443,2400,2422,2348,2491,2554,2450,2404,2383,2409,2408,2455,2433,2489,2439,2372,2437,2431,2434,2523,2395,2469,2370,2538,2398,2411,2435,2389,2438,2402,2511,2421,2482,2453,2484,2436,2441,2389,2396,2461,2391,2476,2407,2374,2422,2394,2495,2403,2438,2428,2439,2517,2422,2408,2452,2433,2395,2447,2405,2473,2459,2438,2321,2434,2395,2415,2462,2393,2493,2524,2328,2436,2548,2410,2521,2491,2413,2419,2441,2398,2417,2492,2405,2466,2367,2478,2402,2363,2605,2368,2482,2436,2390,2368,2460,2453,2434,2459,2369,2433,2442,2481,2417,2400,2452,2420,2428,2442,2430,2438,2402,2414,2459,2418,2434,2436,2467,2418,2496,2449,2454,2416,2449,2453,2495,2307,2473,2442,2496,2434,2431,2463]},{"counters":[2474,2420,2463,2356,2452,2443,2509,2458,2481,2340,2445,2371,2453,2421,2401,2434,2428,2455,2348,2455,2479,2408,2475,2378,2390,2461,2404,2542,2476,2425,2413,2476,2438,2476,2409,2413,2384,2496,2501,2451,2376,2463,2437,2387,2425,2450,2451,2378,2475,2386,2546,2461,2384,2544,2401,2428,2528,2480,2371,2445,2446,2424,2422,2441,2412,2456,2365,2381,2410,2492,2347,2423,2469,2519,2439,2441,2527,2508,2428,2479,2505,2535,2463,2515,2410,2467,2479,2466,2457,2504,2441,2463,2409,2485,2454,2415,2413,2445,2466,2426,2415,2378,2443,2461,2496,2367,2511,2457,2427,2459,2507,2523,2457,2381,2455,2424,2386,2469,2422,2557,2406,2300,2491,2352,2410,2447,2394,2430,2404,2494,2508,2419,2527,2495,2440,2436,2368,2445,2471,2433,2307,2385,2439,2470,2415,2493,2385,2443,2450,2421,2360,2456,2413,2367,2440,2410,2373,2369,2404,2439,2503,2453,2431,2495,2450,2419,2476,2445,2503,2440,2369,2474,2402,2397,2500,2410,2467,2460,2452,2471,2485,2460,2466,2436,2416,2490,2417,2404,2412,2376,2403,2500,2414,2388,2511,2463,2413,2479,2404,2382,2448,2523,2485,2557,2520,2486,2424,2517,2383,2462,2544,2412,2356,2427,2386,2430,2462,2440,2445,2497,2469,2495,2405,2451,2453,2437,2426,2412,2410,2497,2464,2397,2433,2494,2380,2434,2469,2444,2468,2387,2328,2442,2438,2443,2444,2451,2506,2416,2496,2489,2378,2390,2497,2380,2436,2351,2380,2465,2400,2456,2394,2494,2494,2466,2513,2473,2479,2431,2455,2438,2543,2449,2394,2428,2407,2513,2523,2371,2472,2463,2434,2446,2487,2385,2421,2426,2399,2442,2399,2440,2383,2454,2463,2388,2531,2458,2451,2426,2385,2501,2414,2437,2340,2413,2463,2397,2476,2454,2376,2465,2395,2424,2442,2473,2535,2295,2440,2349,2538,2445,2463,2424,2437,2460,2423,2435,2442,2402,2392,2414,2490,2482,2482,2437,2434,2480,2496,2500,2447,2440,2410,2515,2407,2459,2473,2524,2437,2409,2386,2473,2342,2373,2441,2340,2418,2440,2409,2470,2397,2577,2559,2349,2424,2487,2515,2507,2343,2438,2434,2450,2361,2448,2493,2396,2402,2437,2385,2371,2408,2509,2409,2444,2432,2434,2488,2469,2505,2376,2459,2421,2449,2335,2440,2533,2399,2437,2396,2458,2428,2443,2425,2437,2477,2373,2440,2437,2457,2443,2430,2443,2382,2435,2401,2436,2441,2368,2359,2407,2349,2401,2434,2419,2415,2469,2422,2384,2399,2362,2380,2427,2413,2437,2444,2406,2480,2422,2406,2386,2402,2415,2380,2475,2458,2438,2469,2524,2532,2476,2366,2499,2502,2465,2468,2369,2414,2448,2407,2414,2405,2432,2503,2482,2410,2441,2396,2451,2413,2398,2389,2436,2454,2373,2496,2484,2361,2504,2422,2506,2360,2422,2391,2411,2416,2477,2453,2507,2450,2358,2538,2406,2452,2506,2452,2396,2441,2436,2418,2446,2391,2307,2419,2547,2447,2398,2438,2423,2420,2385,2421,2454,2352,2402,2457,2505,2439,2459,2539,2413,2387,2405,2410,2359,2424,2457,2492,2506,2436,2378,2440,2477,2389,2440,2455,2484,2479,2430,2466,2418,2373,2335,2449,2427,2395,2520,2399,2405,2363,2413,2354,2462,2390,2465,2418,2424,2393,2503,2467,2476,2406,2480,2357,2425,2466,2479,2405,2461,2344,2473,2333,2274,2486,2405,2370,2468,2368,2531,2374,2390,2411,2437,2382,2433,2473,2376,2450,2358,2432,2440,2375,2404,2397,2363,2458,2494,2416,2578,2385,2391,2463,2426,2498,2408,2490,2416,2452,2450,2318,2466,2416,2450,2498,2453,2441,2372,2465,2404,2410,2473,2448,2450,2413,2381,2414,2386,2415,2460,2440,2476,2510,2381,2470,2457,2388,2410,2365,2408,2348,2412,2505,2469,2395,2454,2462,2358,2378,2431,2406,2497,2437,2371,2417,2440,2464,2409,2391,2470,2445,2455,2401,2440,2548,2459,2500,2420,2442,2533,2445,2429,2382,2437,2407,2469,2487,2403,2412,2499,2506,2358,2491,2446,2351,2530,2437,2424,2431,2514,2310,2336,2457,2442,2364,2389,2483,2349,2376,2436,2490,2431,2388,2377,2412,2451,2411,2482,2514,2473,2446,2443,2464,2411,2446,2477,2462,2511,2477,2522,2364,2425,2437,2391,2370,2473,2366,2425,2412,2351,2439,2491,2489,2430,2510,2416,2431,2377,2439,2303,2392,2491,2464,2382,2387,2413,2429,2470,2352,2398,2419,2423,2494,2462,2436,2437,2428,2420,2420,2434,2449,2452,2455,2449,2467,2475,2386,2493,2422,2445,2461,2493,2432,2521,2424,2530,2452,2390,2454,2408,2376,2438,2433,2454,2450,2469,2436,2504,2439,2452,2533,2456,2466,2481,2429,2419,2376,2397,2417,2455,2478,2525,2409,2507,2405,2402,2527,2437,2458,2393,2434,2424,2456,2438,2451,2532,2381,2481,2487,2452,2444,2433,2429,2425,2440,2455,2390,2453,2518,2448,2428,2497,2377,2469,2372,2352,2426,2382,2437,2489,2458,2470,2474,2501,2452,2389,2389,2470,2404,2442,2476,2360,2330,2450,2373,2423,2437,2376,2359,2501,2342,2408,2451,2438,2449,2439,2473,2419,2408,2423,2378,2427,2471,2454,2441,2396,2383,2474,2345,2416,2543,2435,2423,2493,2515,2443,2360,2437,2434,2472,2474,2418,2427,2364,2443,2498,2481,2432,2499,2459,2421,2409,2432,2385,2474,2435,2494,2460,2474,2479,2443,2412,2449,2431,2440,2370,2445,2424,2423,2394,2416,2417,2426,2440,2459,2377,2300,2440,2475,2407,2362,2353,2506,2438,2362,2475,2366,2378,2407,2512,2404,2446,2352,2438,2460,2442,2381,2466,2474,2379,2410,2417,2479,2460,2395,2470,2465,2463,2434,2485,2471,2427,2465,2431,2464,2435,2408,2481,2483,2278,2419,2416,2489,2455,2461,2463,2385,2360,2508,2498,2448,2467,2347,2373,2477,2467,2478,2382,2465,2424,2452,2543,2419,2443,2421,2401,2479,2430,2443,2368,2495,2504,2428,2395,2386,2440,2479,2440,2530,2397,2428,2385,2427,2470,2368,2450,2515,2390,2424,2503,2439,2447,2531,2450,2481,2479,2486,2477,2485,2422,2407,2432,2438,2382,2522,2438,2384,2420,2444,2469,2488,2449,2442,2439,2356,2491,2425,2480,2369,2424,2418,2331,2481,2401,2441,2403,2441,2432,2378,2450,2378,2406,2408,2426,2453,2405,2494,2473,2431,2437,2452,2489,2494,2535,2432,2475,2464,2387,2358,2508,2456,2417,2390,2423,2510,2507,2394,2438,2458,2482,2363,2440,2430,2369,2419,2385,2396,2317,2442,2428,2463,2457,2529,2465,2468,2386,2436,2466,2484,2350,2417,2460,2440,2436,2418,2357,2376,2440,2446,2389,2450,2511,2417,2493,2548,2424,2335,2495,2407,2390,2440,2404,2396,2508,2534,2454,2362,2387,2556,2394,2471,2440,2438,2424,2455,2464,2563,2425,2433,2424,2461,2379,2421,2418,2487,2490,2442,2460,2426,2400,2430,2414,2444,2414,2398,2521,2395,2441,2400,2472,2369,2378,2396,2513,2478,2435,2364,2532,2467,2460,2480,2455,2394,2454,2365,2414,2486,2472,2416,2334,2426,2525,2372,2478,2440,2445,2512,2388,2434,2386,2415,2459,2475,2458,2471,2383,2508,2437,2434,2458,2363,2449,2439,2454,2470,2422,2487,2404,2406,2399,2446,2375,2288,2364,2496,2439,2440,2410,2393,2338,2402,2444,2403,2330,2376,2459,2481,2489,2457,2421,2362,2359,2498,2552,2442,2520,2497,2454,2469,2487,2477,2416,2363,2431,2438,2432,2422,2488,2490,2552,2384,2391,2430,2342,2416,2435,2428,2437,2485,2398,2375,2435,2442,2466,2407,2411,2441,2424,2308,2440,2508,2484,2411,2415,2467,2483,2471,2480,2466,2491,2436,2422,2405,2484,2334,2361,2448,2416,2413,2558,2460,2458,2391,2428,2413,2414,2428,2425,2357,2460,2410,2435,2422,2469,2400,2458,2426,2535,2332,2410,2531,2438,2420,2474,2390,2491,2472,2467,2494,2440,2439,2487,2457,2438,2529,2457,2494,2413,2443,2528,2434,2450,2410,2515,2392,2513,2473,2499,2553,2511,2504,2497,2438,2479,2417,2512,2466,2432,2391,2306,2521,2361,2478,2484,2413,2442,2462,2436,2375,2487,2386,2467,2392,2399,2448,2411,2558,2421,2433,2562,2516,2439,2402,2498,2501,2443,2486,2505,2438,2466,2370,2426,2390,2450,2440,2423,2355,2390,2477,2378,2483,2543,2441,2415,2473,2438,2514,2415,2360,2415,2354,2427,2388,2434,2450,2361,2361,2468,2416,2545,2438,2443,2435,2436,2410,2497,2453,2385,2352,2436,2496,2447,2398,2380,2505,2354,2400,2421,2458,2471,2489,2415,2530,2504,2368,2418,2501,2445,2370,2443,2518,2435,2446,2442,2448,2405,2525,2465,2510,2487,2474,2508,2375,2489,2346,2442,2414,2498,2496,2437,2400,2424,2366,2446,2421,2494,2468,2457,2405,2334,2438,2493,2417,2529,2437,2459,2329,2468,2436,2495,2397,2424,2471,2483,2405,2406,2447,2470,2509,2418,2438,2412,2487,2348,2335,2406,2510,2396,2408,2370,2437,2421,2430,2337,2460,2429,2482,2410,2453,2417,2409,2330,2448,2364,2397,2346,2368,2473,2487,2480,2405,2468,2510,2411,2440,2431,2448,2412,2432,2416,2421,2482,2410,2379,2386,2418,2509,2506,2416,2418,2478,2460,2396,2407,2406,2269,2453,2419,2365,2466,2382,2445,2404,2431,2512,2521,2464,2416,2444,2444,2403,2428,2398,2373,2389,2427,2340,2342,2491,2432,2473,2541,2464,2353,2463,2440,2442,2394,2359,2495,2379,2535,2439,2462,2499,2449,2438,2465,2389,2439,2547,2475,2469,2528,2413,2337,2588,2413,2437,2445,2426,2378,2415,2519,2313,2460,2491,2407,2388,2472,2444,2429,2391,2485,2420,2473,2479,2414,2550,2455,2485,2454,2427,2422,2518,2513,2369,2331,2525,2419,2428,2399,2400,2477,2448,2411,2441,2439,2479,2446,2537,2424,2331,2425,2433,2409,2468,2379,2437,2436,2449,2468,2427,2347,2421,2435,2447,2424,2412,2452,2487,2363,2318,2426,2463,2439,2428,2472,2372,2430,2407,2332,2497,2566,2467,2363,2461,2411,2438,2389,2361,2498,2303,2402,2454,2473,2419,2454,2376,2431,2502,2449,2439,2488,2401,2403,2439,2417,2424,2383,2511,2535,2320,2390,2382,2472,2456,2453,2520,2338,2418,2437,2477,2398,2360,2335,2409,2388,2382,2467,2447,2473,2541,2452,2407,2396,2488,2419,2492,2397,2471,2487,2454,2422,2514,2405,2351,2444,2503,2454,2468,2412,2428,2418,2502,2317,2394,2454,2547,2450,2413,2417,2415,2430,2494,2401,2429,2387,2423,2480,2384,2440,2415,2455,2471,2475,2435,2409,2444,2447,2488,2455,2412,2499,2380,2450,2464,2366,2352,2462,2471,2396,2438,2398,2534,2386,2462,2463,2486,2410,2502,2405,2431,2494,2451,2411,2444,2436,2373,2481,2440,2361,2565,2475,2538,2498,2394,2406,2532,2432,2380,2477,2353,2469,2463,2444,2468,2405,2441,2437,2430,2433,2406,2504,2422,2386,2430,2448,2389,2439,2423,2459,2383,2426,2453,2546,2358,2438,2438,2384,2451,2443,2452,2443,2416,2485,2434,2469,2434,2458,2480,2487,2497,2412,2448,2413,2406,2402,2468,2358,2405,2500,2380,2480,2474,2513,2428,2418,2515,2520,2431,2426,2440,2493,2412,2415,2427,2361,2507,2519,2432,2384,2473,2488,2427,2418,2399,2436,2407,2405,2465,2535,2500,2420,2455,2502,2469,2490,2581,2345,2374,2441,2352,2502,2495,2434,2373,2491,2510,2473,2431,2443,2479,2460,2473,2417,2431,2481,2447,2449,2558,2469,2485,2323,2410,2378,2390,2385,2425,2340,2420,2392,2356,2470,2486,2458,2329,2429,2412,2378,2348,2342,2479,2427,2402,2438,2394,2392,2470,2493,2399,2434,2406,2452,2522,2399,2452,2334,2514,2440,2460,2457,2406,2376,2496,2412,2457,2500,2457,2469,2392,2434,2375,2444,2511,2461,2356,2323,2428,2410,2398,2387,2425,2441,2403,2432,2323,2441,2459,2435,2345,2412,2477,2468,2430,2379,2495,2312,2407,2461,2416,2395,2447,2547,2446,2587,2419,2455,2340,2457,2481,2464,2345,2403,2432,2411,2372,2423,2433,2456,2534,2463,2439,2422,2462,2370,2438,2441,2465,2490,2556,2472,2485,2434,2468,2408,2341,2353,2383,2423,2370,2482]}],"top_n":[{"data":"COL9wQI=","count":0},{"data":"COaDeA==","count":15},{"data":"CIjyMQ==","count":0},{"data":"CIKJ/gM=","count":34},{"data":"CK6eQQ==","count":37},{"data":"CKShvwQ=","count":0},{"data":"CMTVzgI=","count":0},{"data":"CNiQnAE=","count":33},{"data":"CO70ugE=","count":18},{"data":"CPbC3AI=","count":9},{"data":"CKKTHg==","count":0},{"data":"CPrzFQ==","count":0},{"data":"CJLAlAI=","count":0},{"data":"CJC0wgE=","count":0},{"data":"CNyAyQM=","count":0},{"data":"CKLrQw==","count":1},{"data":"CN7IzQQ=","count":30},{"data":"COSHeA==","count":6},{"data":"CMyecw==","count":0},{"data":"CM7aoAI=","count":13},{"data":"CLjcMA==","count":32},{"data":"CLLvzwE=","count":4},{"data":"CKLniQQ=","count":0},{"data":"CKKQ4gE=","count":0},{"data":"CMjXEA==","count":0},{"data":"CKCaRQ==","count":0},{"data":"CLLskgQ=","count":0},{"data":"CNi4Bg==","count":0},{"data":"CNSh0AM=","count":0},{"data":"COidgQI=","count":0},{"data":"CPKU+QM=","count":14},{"data":"COy3Hw==","count":53},{"data":"CMjrZg==","count":0},{"data":"CLCwqAM=","count":20},{"data":"COL8xAE=","count":7},{"data":"CJbNsAM=","count":39},{"data":"CMK+kwM=","count":16},{"data":"CMae2AM=","count":0},{"data":"CI7xlAE=","count":0},{"data":"CPzkFg==","count":39},{"data":"CILVdA==","count":0},{"data":"CMKs0gE=","count":4},{"data":"CIy2wAQ=","count":0},{"data":"CLixvgE=","count":0},{"data":"CN6RBQ==","count":8},{"data":"CLKVcQ==","count":7},{"data":"CN7b2gE=","count":0},{"data":"CKidswM=","count":11},{"data":"CISJogM=","count":25},{"data":"CMzPOQ==","count":11},{"data":"CNiB3gE=","count":1},{"data":"CPy0jgI=","count":2},{"data":"COzLuAE=","count":0},{"data":"CLjG2wI=","count":27},{"data":"CMLehAQ=","count":41},{"data":"CO7iiAQ=","count":0},{"data":"CMD5rQM=","count":13},{"data":"CJS0bg==","count":14},{"data":"CNiarQE=","count":3},{"data":"CN6Q6AM=","count":0},{"data":"CLDCkAE=","count":59},{"data":"COatmgM=","count":17},{"data":"CMyNyQE=","count":24},{"data":"CMjosAE=","count":0},{"data":"CLbSowQ=","count":26},{"data":"CKTJzQQ=","count":0},{"data":"CN7ocw==","count":27},{"data":"COKyiQE=","count":1},{"data":"CNDcwQE=","count":0},{"data":"CMiplgM=","count":0},{"data":"CMzzSA==","count":9},{"data":"CLbZoQQ=","count":0},{"data":"CIKA9wE=","count":0},{"data":"CMyXOg==","count":0},{"data":"CNyV7AE=","count":0},{"data":"CN6MkgI=","count":0},{"data":"COyY/QM=","count":60},{"data":"CNKR2gM=","count":0},{"data":"CKSeoQI=","count":1},{"data":"CNzZ4AQ=","count":0},{"data":"COSkggE=","count":1},{"data":"CMzcyQQ=","count":22},{"data":"COrWxgM=","count":6},{"data":"CNbTJA==","count":0},{"data":"CMQS","count":1},{"data":"COSTjgI=","count":0},{"data":"CMiH0QQ=","count":4},{"data":"CPqXKw==","count":5},{"data":"COTgyQQ=","count":0},{"data":"CMrrkQQ=","count":3},{"data":"CJb42wI=","count":0},{"data":"CMqCAQ==","count":0},{"data":"CPzjrAM=","count":0},{"data":"CL7hTQ==","count":2},{"data":"CMKblQQ=","count":24},{"data":"CPSefQ==","count":33},{"data":"CJDtPw==","count":0},{"data":"CO6iSw==","count":0},{"data":"CIzK+QE=","count":3},{"data":"CMrXogI=","count":44},{"data":"CPCg5QE=","count":1},{"data":"CK7j7AI=","count":15},{"data":"CMCHlwI=","count":32},{"data":"CMz2mgE=","count":11},{"data":"CIaFhgE=","count":0},{"data":"COKODw==","count":10},{"data":"CJCiyAM=","count":0},{"data":"CILVoQM=","count":21},{"data":"CNznswE=","count":0},{"data":"CIL/2gQ=","count":0},{"data":"CPC3zwQ=","count":29},{"data":"CPKg2AM=","count":0},{"data":"CMzMAQ==","count":0},{"data":"CPrT7AE=","count":21},{"data":"CIC34QM=","count":22},{"data":"CLiQkgI=","count":32},{"data":"CMy6Fg==","count":50},{"data":"CIbrgwE=","count":6},{"data":"CKri8wI=","count":0},{"data":"CMr3Cg==","count":18},{"data":"CJTdfg==","count":8},{"data":"CMiMrgE=","count":8},{"data":"CIDXuAI=","count":14},{"data":"CPb3vwM=","count":0},{"data":"CNLUgwI=","count":8},{"data":"CN7rwQI=","count":11},{"data":"CL7NrAI=","count":7},{"data":"CPLCvQE=","count":23},{"data":"CJDrtAI=","count":23},{"data":"CN7MkAQ=","count":0},{"data":"COaG+QE=","count":0},{"data":"CLSHtQM=","count":3},{"data":"CJKGpAE=","count":0},{"data":"CN6y3wE=","count":0},{"data":"CMDA4wM=","count":40},{"data":"CNjVFg==","count":0},{"data":"CIqOggM=","count":0},{"data":"CPrLrQQ=","count":0},{"data":"COzoqAQ=","count":15},{"data":"COr4zQQ=","count":0},{"data":"CIStwQQ=","count":45},{"data":"CNLhzgQ=","count":1},{"data":"CPrAmAE=","count":0},{"data":"CKDzAg==","count":0},{"data":"CMbEmwI=","count":3},{"data":"CIbV4QQ=","count":0},{"data":"CPiWKg==","count":0},{"data":"CJij9wE=","count":0},{"data":"CJak0gM=","count":27},{"data":"COb6kQI=","count":29},{"data":"CKCEDw==","count":0},{"data":"CICy3QQ=","count":0},{"data":"CJyGpAI=","count":83},{"data":"CJDeigM=","count":0},{"data":"COC2gAM=","count":0},{"data":"CKLgrgI=","count":1},{"data":"CNzY0QE=","count":11},{"data":"CNrGqQQ=","count":0},{"data":"CNCmxQM=","count":0},{"data":"CLjZ6QE=","count":18},{"data":"CLjXQg==","count":0},{"data":"COCWpAQ=","count":13},{"data":"COTPiwM=","count":20},{"data":"CJz45AE=","count":0},{"data":"CPLN3wQ=","count":0},{"data":"COj9yQE=","count":0},{"data":"CKrlzwM=","count":0},{"data":"CKjgQg==","count":0},{"data":"CNCAyQE=","count":3},{"data":"CIC2igI=","count":0},{"data":"CL6fag==","count":16},{"data":"COyG6AI=","count":0},{"data":"CMb3vAQ=","count":46},{"data":"CJqylgM=","count":4},{"data":"CKrm7wE=","count":18},{"data":"CJCQ3wE=","count":0},{"data":"CNiKugI=","count":28},{"data":"CPLfQQ==","count":4},{"data":"COTzrQQ=","count":0},{"data":"CL7c1AQ=","count":17},{"data":"CLTCtwM=","count":0},{"data":"CNChrgE=","count":0},{"data":"CPS68gM=","count":0},{"data":"CNqQogI=","count":9},{"data":"CN6A+QM=","count":0},{"data":"CLTk+wI=","count":0},{"data":"CKS3owI=","count":20},{"data":"CJKW6wE=","count":0},{"data":"CMTkjwQ=","count":0},{"data":"CIjbrwI=","count":0},{"data":"CIjTtwI=","count":0},{"data":"CICo1AM=","count":0},{"data":"CL6rzgQ=","count":0},{"data":"CPKA/QM=","count":0},{"data":"CMyXzQQ=","count":0},{"data":"CIjzuQQ=","count":12},{"data":"CKCB8QI=","count":17},{"data":"CJ6QoAM=","count":8},{"data":"CJDSMw==","count":9},{"data":"CJrbngQ=","count":9},{"data":"CKCLuwE=","count":11},{"data":"CJyXBw==","count":0},{"data":"CJSx6AE=","count":0},{"data":"CMjJ1QI=","count":2},{"data":"CO7DtQI=","count":0},{"data":"CPL5Zw==","count":51},{"data":"CLbckQI=","count":0},{"data":"CLTOggI=","count":1},{"data":"CICNoAQ=","count":20},{"data":"CIaU+AI=","count":14},{"data":"CPqR+AE=","count":1},{"data":"CMSepAQ=","count":14},{"data":"CPD4xgI=","count":0},{"data":"CPSkxgI=","count":2},{"data":"CJKm4QQ=","count":0},{"data":"CIzKjQE=","count":0},{"data":"CMquQw==","count":7},{"data":"CLbMkgI=","count":0},{"data":"CNTo3QM=","count":27},{"data":"CJLCzwI=","count":0},{"data":"CKTKpgQ=","count":33},{"data":"CITZHg==","count":0},{"data":"CMD82AE=","count":4},{"data":"CJy/nwI=","count":0},{"data":"CKijlQE=","count":11},{"data":"CIKPgwM=","count":0},{"data":"CN6J5AM=","count":0},{"data":"CIa0kgI=","count":2},{"data":"CIiH2QQ=","count":0},{"data":"CMThmQI=","count":30},{"data":"CO6l4QQ=","count":0},{"data":"CIiPTw==","count":0},{"data":"CObvMA==","count":0},{"data":"CM6IogI=","count":0},{"data":"CLqhugE=","count":0},{"data":"CIyTkQI=","count":18},{"data":"CJ71zgQ=","count":38},{"data":"CJTA3AM=","count":0},{"data":"CITJ9QM=","count":0},{"data":"CIahrAI=","count":0},{"data":"COaq6QI=","count":15},{"data":"CPSq4QE=","count":28},{"data":"COCDogM=","count":0},{"data":"CIqqdg==","count":0},{"data":"CJLPrAM=","count":0},{"data":"CO6utgI=","count":16},{"data":"CNSnowI=","count":15},{"data":"COrr+wM=","count":35},{"data":"COrr4gI=","count":0},{"data":"CN67igE=","count":26},{"data":"COqR2AM=","count":0},{"data":"CIC68AE=","count":7},{"data":"CLaBjAM=","count":2},{"data":"CMCY2QI=","count":0},{"data":"CKSYwwI=","count":18},{"data":"CLDJugE=","count":0},{"data":"CJiJKg==","count":0},{"data":"CMKiqQM=","count":0},{"data":"CNKsRw==","count":4},{"data":"CIy9NQ==","count":0},{"data":"CNDvsQE=","count":3},{"data":"CIT8Jg==","count":0},{"data":"CMCNkQI=","count":29},{"data":"CMKXGg==","count":0},{"data":"CN6yzgE=","count":24},{"data":"CP7tqAM=","count":33},{"data":"CN7A0wM=","count":0},{"data":"CNaswQM=","count":29},{"data":"CPjNlwQ=","count":7},{"data":"CJDhHw==","count":0},{"data":"CNaLKg==","count":21},{"data":"CK7h0wE=","count":35},{"data":"CMzLhQE=","count":25},{"data":"CLCnmgE=","count":0},{"data":"COjoDw==","count":9},{"data":"CMDuqAM=","count":12},{"data":"CJCN9QM=","count":1},{"data":"CO6J7AM=","count":0},{"data":"COCRngQ=","count":17},{"data":"CLbI5gE=","count":14},{"data":"CNrH6gI=","count":0},{"data":"CPL6pQI=","count":0},{"data":"COingAE=","count":15},{"data":"CMLMwQI=","count":0},{"data":"CIa+ygI=","count":1},{"data":"CKrFuwM=","count":0},{"data":"CKSIxQE=","count":0},{"data":"CPan4wI=","count":0},{"data":"CPr62gQ=","count":7},{"data":"CODGhgE=","count":0},{"data":"CPKp0QQ=","count":0},{"data":"CNyVpAI=","count":45},{"data":"CPzVIQ==","count":17},{"data":"CJriigM=","count":0},{"data":"CMK0+wI=","count":10},{"data":"CJSS1gI=","count":40},{"data":"CLqK5gI=","count":1},{"data":"CKrUqQM=","count":0},{"data":"COCUoAM=","count":1},{"data":"CLC4vQE=","count":2},{"data":"CMqFtgE=","count":0},{"data":"CJyz3AI=","count":0},{"data":"CLizYQ==","count":0},{"data":"COi+7wI=","count":11},{"data":"CLaVpQQ=","count":23},{"data":"CL7RzAE=","count":0},{"data":"CJS66AM=","count":0},{"data":"CKS0gwE=","count":0},{"data":"CJyQ4QM=","count":0},{"data":"CPLfQw==","count":27},{"data":"CI7ejAM=","count":21},{"data":"CMSG6AE=","count":0},{"data":"CP73+gE=","count":0},{"data":"CJS6ygI=","count":0},{"data":"CMCK7wI=","count":16},{"data":"COihgwE=","count":1},{"data":"CKr67wM=","count":17},{"data":"CLL3lgQ=","count":0},{"data":"CO7azwE=","count":12},{"data":"CIzPzgE=","count":4},{"data":"CPrhjAE=","count":0},{"data":"CIbfhgQ=","count":12},{"data":"CNTy9QI=","count":15},{"data":"CPDR7gI=","count":0},{"data":"CN69pQE=","count":0},{"data":"CP6iIg==","count":0},{"data":"CPieWQ==","count":44},{"data":"CLyP/AI=","count":15},{"data":"CObPjAI=","count":30},{"data":"CNbVwwE=","count":0},{"data":"CMjhpAI=","count":0},{"data":"CMbEtQI=","count":0},{"data":"CLz3uAQ=","count":7},{"data":"CMj3SA==","count":8},{"data":"COSM/AM=","count":0},{"data":"CI6EigI=","count":0},{"data":"CKaVxgQ=","count":0},{"data":"CKDqrQM=","count":16},{"data":"COyLUg==","count":0},{"data":"CP6WhwM=","count":4},{"data":"CNTUpgM=","count":43},{"data":"CMbhjwM=","count":1},{"data":"CM641wM=","count":16},{"data":"CKa+swM=","count":7},{"data":"CO7z0gQ=","count":4},{"data":"CKSfnAM=","count":0},{"data":"CIqL+wI=","count":0},{"data":"CKrY1QQ=","count":49},{"data":"CJ7+OQ==","count":0},{"data":"CKqUQQ==","count":0},{"data":"CI6SngE=","count":35},{"data":"CNq4vgQ=","count":3},{"data":"CJqItwI=","count":0},{"data":"CIC5rQE=","count":0},{"data":"CKC9mQI=","count":4},{"data":"CILupAE=","count":0},{"data":"CMLQvAE=","count":18},{"data":"CNiVlQQ=","count":0},{"data":"CJqA3gI=","count":0},{"data":"CI62zAM=","count":7},{"data":"CNrU3QE=","count":2},{"data":"CKiK8wE=","count":0},{"data":"CJrd+AE=","count":17},{"data":"CJDvHg==","count":0},{"data":"CMqikAM=","count":0},{"data":"CMjCiQI=","count":0},{"data":"CM6LygI=","count":0},{"data":"CPzXiAI=","count":0},{"data":"CPiLwwQ=","count":23},{"data":"CMDByAE=","count":0},{"data":"CPa6oAM=","count":43},{"data":"CLzgmgQ=","count":61},{"data":"CJ62ngI=","count":0},{"data":"CLqTygE=","count":0},{"data":"CNDhdw==","count":10},{"data":"CPjk8wE=","count":0},{"data":"CJSXtAQ=","count":0},{"data":"CL6yqwM=","count":42},{"data":"CO6gkAI=","count":25},{"data":"COKT6wE=","count":0},{"data":"CP75pQE=","count":1},{"data":"CP7/8AM=","count":26},{"data":"COjcuQM=","count":2},{"data":"CJ644QE=","count":27},{"data":"CLDF/wE=","count":0},{"data":"CNanzwE=","count":0},{"data":"CNizfw==","count":0},{"data":"CNrdogI=","count":43},{"data":"CIbXxQQ=","count":10},{"data":"CPjH/AM=","count":42},{"data":"CLLSmgE=","count":6},{"data":"CIS3bg==","count":0},{"data":"CMCGqAQ=","count":0},{"data":"CPjr+wE=","count":4},{"data":"CPq0nAQ=","count":0},{"data":"CN6xmwE=","count":0},{"data":"CIbz5wI=","count":0},{"data":"CM6RzgQ=","count":11},{"data":"CI7B9wE=","count":0},{"data":"CIa7IA==","count":37},{"data":"CLiokAI=","count":8},{"data":"CLzJ9gM=","count":1},{"data":"CKC2hAQ=","count":7},{"data":"CLjxxQQ=","count":0},{"data":"COjUqAQ=","count":0},{"data":"CPiouQI=","count":7},{"data":"CMrSywM=","count":1},{"data":"CIS/Kg==","count":31},{"data":"COaLCw==","count":0},{"data":"CPr+pQE=","count":8},{"data":"CITYnwE=","count":0},{"data":"CPKwTQ==","count":0},{"data":"CNjZQQ==","count":32},{"data":"CLrHzAM=","count":43},{"data":"CPrCgwE=","count":13},{"data":"COCc2wM=","count":11},{"data":"CK6J4QM=","count":23},{"data":"CICclwE=","count":35},{"data":"CL7heg==","count":0},{"data":"CJrrzAI=","count":1},{"data":"CPKoMw==","count":44},{"data":"CJr+8wM=","count":41},{"data":"CObb1wI=","count":0},{"data":"CLbsXQ==","count":0},{"data":"CI7CzwI=","count":41},{"data":"CMqvZQ==","count":32},{"data":"CNSKhgI=","count":0},{"data":"CNK1tQE=","count":0},{"data":"CM6GlAE=","count":29},{"data":"CPD4ywE=","count":23},{"data":"CIqUvwE=","count":0},{"data":"CKbjgQE=","count":0},{"data":"CPyF3wQ=","count":11},{"data":"CN6GHg==","count":0},{"data":"CITeRg==","count":0},{"data":"CKjbFg==","count":0},{"data":"CPKCpAQ=","count":23},{"data":"CMyu5wI=","count":31},{"data":"CMCjnwQ=","count":0},{"data":"CP6PiwE=","count":0},{"data":"CPip0gM=","count":7},{"data":"CLzBnwI=","count":35},{"data":"CKq5Mg==","count":0},{"data":"CKTXvgE=","count":23},{"data":"CKD5bw==","count":7},{"data":"CIDNywI=","count":0},{"data":"CMb+Zw==","count":0},{"data":"CLjlnwQ=","count":0},{"data":"CNaCgQM=","count":9},{"data":"COKYhgM=","count":49},{"data":"CO7mnwQ=","count":10},{"data":"CL7hmwI=","count":18},{"data":"CKCSywE=","count":8},{"data":"CNy8+wM=","count":5},{"data":"CNrJxAE=","count":3},{"data":"CJyFQw==","count":0},{"data":"CM7gjwQ=","count":0},{"data":"CMKgrgE=","count":0},{"data":"CK6I7AI=","count":2},{"data":"CJbAkwI=","count":3},{"data":"CO77xwQ=","count":28},{"data":"CO6dkgE=","count":3},{"data":"CMajgQQ=","count":0},{"data":"CKjVhgM=","count":0},{"data":"CMaB1QE=","count":0},{"data":"CMTqlAI=","count":0},{"data":"CJaztAM=","count":0},{"data":"CPSzjQE=","count":0},{"data":"CMCeqgE=","count":3},{"data":"CPi/+wE=","count":0},{"data":"CKzPngM=","count":10},{"data":"CNjxSA==","count":4},{"data":"COKh/wE=","count":28},{"data":"CMaLiQI=","count":34},{"data":"CKyRngE=","count":0},{"data":"CLCXhAQ=","count":50},{"data":"CPTRiQQ=","count":29},{"data":"CIKxSA==","count":0},{"data":"CJrF9AE=","count":18},{"data":"CPquQQ==","count":37},{"data":"CLLUugI=","count":0},{"data":"CNbCfg==","count":16},{"data":"CLjy2gI=","count":0},{"data":"CIiliwQ=","count":31},{"data":"CJyoXQ==","count":0},{"data":"CIDWtgQ=","count":0},{"data":"CIaktQE=","count":0},{"data":"CIDxswQ=","count":0},{"data":"CPT/mgI=","count":0},{"data":"CJyLkgE=","count":2},{"data":"CI6z4wE=","count":0},{"data":"CNDV6QI=","count":4},{"data":"CJjlqQE=","count":11},{"data":"COznUA==","count":33},{"data":"CNqAmAI=","count":26},{"data":"COaXqAQ=","count":0},{"data":"CJKWtAE=","count":35},{"data":"CMDGiAI=","count":0},{"data":"CIS3hwQ=","count":26},{"data":"CJSMjAQ=","count":27},{"data":"CICsnwE=","count":45},{"data":"CKjk6wE=","count":13},{"data":"CNrL3QI=","count":28},{"data":"CIqOGA==","count":32},{"data":"CLDHkQE=","count":0},{"data":"CIS1wAM=","count":23},{"data":"CMCGjwQ=","count":0},{"data":"CKTUOQ==","count":4},{"data":"CKTs9wE=","count":26},{"data":"CKqArwI=","count":0},{"data":"CPiQxQM=","count":0},{"data":"CMbKzwE=","count":0},{"data":"CLLn2AM=","count":0},{"data":"CJjNugE=","count":6},{"data":"CMy+5gE=","count":13},{"data":"CPiJtgM=","count":2},{"data":"CI7AVA==","count":0},{"data":"CNj80AI=","count":0},{"data":"CO7Rew==","count":0},{"data":"CMifqAI=","count":18},{"data":"CNCawwE=","count":0},{"data":"CMyn2AI=","count":0},{"data":"COqeSg==","count":2},{"data":"CNbY+gI=","count":4},{"data":"CMYa","count":10},{"data":"CK7DMw==","count":0},{"data":"CNaWKQ==","count":0},{"data":"CL7ikwI=","count":0},{"data":"CMDgQw==","count":17},{"data":"CJTIjwE=","count":0},{"data":"CNCBIg==","count":21},{"data":"COz3jQM=","count":3},{"data":"CJLCswQ=","count":17},{"data":"CMbg6gI=","count":17},{"data":"CJS4iQQ=","count":32},{"data":"COjA+gI=","count":5},{"data":"COyRmwE=","count":0},{"data":"CIzztAQ=","count":0},{"data":"COad6wM=","count":0},{"data":"COiK8gM=","count":13},{"data":"CPSBkQM=","count":24},{"data":"COC+Dg==","count":10},{"data":"CKjbSQ==","count":0},{"data":"COCakAE=","count":16},{"data":"CKKW+QE=","count":16},{"data":"COSpjwM=","count":16},{"data":"CITozAE=","count":14},{"data":"CODUNw==","count":0},{"data":"CIaYhQQ=","count":0},{"data":"CPznkQE=","count":28},{"data":"CJTt0AI=","count":0},{"data":"CK6epwE=","count":29},{"data":"CPD4LQ==","count":0},{"data":"COLxvgQ=","count":11},{"data":"COz0Tg==","count":0},{"data":"CITqtwM=","count":44},{"data":"CM6WngQ=","count":0},{"data":"CLSmyAI=","count":0},{"data":"CK6sxAE=","count":25},{"data":"COa46AE=","count":1},{"data":"CNrZFA==","count":0},{"data":"CJ7WpgE=","count":0},{"data":"CI7mowQ=","count":0},{"data":"CPD2tgM=","count":8},{"data":"CNqj3AI=","count":0},{"data":"CJ7tXw==","count":77},{"data":"COzUvAE=","count":11},{"data":"CLCn7gI=","count":17},{"data":"CLLrmAI=","count":23},{"data":"CPrztQE=","count":7},{"data":"CNrPwAM=","count":27},{"data":"CK7EpQI=","count":0},{"data":"CKqGCQ==","count":4},{"data":"COjrcQ==","count":0},{"data":"CMbXhgE=","count":0},{"data":"CM75xgM=","count":33},{"data":"CKjtggQ=","count":33},{"data":"CMqQxAI=","count":33},{"data":"CLa6ygM=","count":30},{"data":"CO7vLw==","count":17},{"data":"CLDyOw==","count":0},{"data":"CMCMlgI=","count":0},{"data":"CJDUvwQ=","count":13},{"data":"CNKs2wM=","count":0},{"data":"CJCRnwI=","count":6},{"data":"CIyT8wE=","count":42},{"data":"CNz3iQE=","count":31},{"data":"CP6W4wE=","count":0},{"data":"CJC3/gE=","count":5},{"data":"CJzFsgQ=","count":59},{"data":"CLqBugQ=","count":0},{"data":"COqaUQ==","count":0},{"data":"COiUtwQ=","count":19},{"data":"CNjosgM=","count":0},{"data":"CPSlOA==","count":10},{"data":"CPLisAI=","count":0},{"data":"CPjynQE=","count":0},{"data":"CLDHuAI=","count":0},{"data":"CIinzQM=","count":10},{"data":"CNyryAM=","count":0},{"data":"CO6m8QM=","count":43},{"data":"CICefw==","count":12},{"data":"CKaflwM=","count":12},{"data":"CKS0UQ==","count":0},{"data":"CKDnNA==","count":0},{"data":"CNzWNw==","count":0},{"data":"CObviQM=","count":0},{"data":"CPqy+AM=","count":0},{"data":"CIqMzwQ=","count":0},{"data":"CN60qwI=","count":0},{"data":"CNzN7AI=","count":7},{"data":"CLDpLQ==","count":8},{"data":"CIqd2QI=","count":65},{"data":"CJ7CuQM=","count":1},{"data":"CPqWKA==","count":0},{"data":"COjTgAI=","count":0},{"data":"CI72OA==","count":23},{"data":"COTRkAI=","count":9},{"data":"CNKDogQ=","count":0},{"data":"CI75Hw==","count":16},{"data":"COrMGA==","count":36},{"data":"CO6vSg==","count":14},{"data":"CK6/uAI=","count":29},{"data":"CL7gDw==","count":0},{"data":"COzJnAQ=","count":1},{"data":"CPC0gQM=","count":0},{"data":"CMDpOQ==","count":0},{"data":"CKzWJg==","count":11},{"data":"CIy12AM=","count":0},{"data":"CIr2oQI=","count":11},{"data":"CP7esAI=","count":0},{"data":"CLq/owQ=","count":56},{"data":"CPTglAI=","count":12},{"data":"CJL9yQI=","count":37},{"data":"CI61fA==","count":58},{"data":"COTdoQM=","count":0},{"data":"CMadlwE=","count":10},{"data":"CIDw2gM=","count":0},{"data":"CJaX7gE=","count":6},{"data":"CPjj+QI=","count":16},{"data":"CJrAmgE=","count":36},{"data":"CLqT/AI=","count":0},{"data":"CKrqBg==","count":7},{"data":"CLrs7QM=","count":0},{"data":"COC+Fg==","count":24},{"data":"COTOKg==","count":34},{"data":"CPL5tQI=","count":0},{"data":"CMjl5wM=","count":34},{"data":"COyMVg==","count":24},{"data":"CIjlrwE=","count":16},{"data":"CLrpvAQ=","count":21},{"data":"CLKmgwM=","count":0},{"data":"CICa4wI=","count":1},{"data":"CKTcRQ==","count":0},{"data":"CNCP0AM=","count":0},{"data":"CPLTmwE=","count":0},{"data":"CKyOgwQ=","count":0},{"data":"CNih/QE=","count":0},{"data":"CMDXmQE=","count":0},{"data":"CPSvuwE=","count":27},{"data":"CPCxpAM=","count":15},{"data":"CJCswAM=","count":1},{"data":"CNC0wgM=","count":0},{"data":"CKS6lwQ=","count":0},{"data":"COSqkwQ=","count":16},{"data":"CNjNlgE=","count":20},{"data":"CPiFhQM=","count":0},{"data":"CIjjhwE=","count":0},{"data":"CLrN2QI=","count":0},{"data":"CO7eAQ==","count":2},{"data":"CIbuZA==","count":0},{"data":"CKqFkQE=","count":0},{"data":"CMqkmwI=","count":8},{"data":"CLa20wE=","count":0},{"data":"CPy//AE=","count":0},{"data":"CILseg==","count":62},{"data":"CLDYXg==","count":0},{"data":"CKCsuQM=","count":3},{"data":"CObnyQQ=","count":0},{"data":"CJiqxAQ=","count":53},{"data":"CKqUbw==","count":11},{"data":"CJC+sQM=","count":10},{"data":"CKz4xQM=","count":2},{"data":"CKr1oQQ=","count":0},{"data":"CJSiwQI=","count":43},{"data":"CIz9yAM=","count":21},{"data":"CK6L5AE=","count":0},{"data":"CPbP4gE=","count":0},{"data":"CICxJw==","count":8},{"data":"CIjRRg==","count":16},{"data":"CMzGyQM=","count":9},{"data":"CNLWJQ==","count":0},{"data":"CNqhzwM=","count":0},{"data":"CLyAuwM=","count":0},{"data":"CIL+yAI=","count":0},{"data":"COjPcw==","count":12},{"data":"CIizPg==","count":0},{"data":"CPLovgI=","count":0},{"data":"CNi52QQ=","count":15},{"data":"CNCMDw==","count":0},{"data":"CLDmpQQ=","count":0},{"data":"CNif8AE=","count":19},{"data":"CKrcJQ==","count":1},{"data":"CLKf4AE=","count":0},{"data":"CKL8xgI=","count":0},{"data":"CLziZQ==","count":2},{"data":"CNrU2wI=","count":7},{"data":"CNzuCg==","count":0},{"data":"CJDdhwM=","count":6},{"data":"CL6c/wM=","count":22},{"data":"CJqx1QE=","count":33},{"data":"CKqsoAQ=","count":0},{"data":"CIjLigM=","count":29},{"data":"CND8zgM=","count":0},{"data":"CPqhpwE=","count":0},{"data":"CKb1pwQ=","count":0},{"data":"CPjk/gM=","count":0},{"data":"CMTPigI=","count":16},{"data":"CLC5hAE=","count":0},{"data":"CIT27QI=","count":0},{"data":"CNCdZA==","count":51},{"data":"COy/iwI=","count":0},{"data":"CJShsAM=","count":27},{"data":"COS14AE=","count":0},{"data":"CJb0vAM=","count":42},{"data":"CND4nAE=","count":0},{"data":"CJisvQE=","count":0},{"data":"CM7OrQE=","count":0},{"data":"CPSqGw==","count":0},{"data":"CNapfg==","count":44},{"data":"COjthQM=","count":0},{"data":"CPLXLg==","count":21},{"data":"CPKnlwM=","count":7},{"data":"CMyJ5gE=","count":4},{"data":"CPDdjgE=","count":0},{"data":"CProuAE=","count":0},{"data":"CJCb8wI=","count":0},{"data":"COaioAQ=","count":21},{"data":"CISTwgE=","count":10},{"data":"CMig2QQ=","count":1},{"data":"CO6f6wE=","count":6},{"data":"CNKOlgI=","count":0},{"data":"CLb4vQQ=","count":6},{"data":"CKKvBg==","count":21},{"data":"CMromwE=","count":0},{"data":"CMLFBA==","count":1},{"data":"CKzt8gM=","count":0},{"data":"CNjz9AI=","count":35},{"data":"CKibQA==","count":0},{"data":"CPi+DA==","count":11},{"data":"CNDe7gI=","count":0},{"data":"CMaizgE=","count":0},{"data":"CPik+gM=","count":23},{"data":"CNbxaA==","count":15},{"data":"CLCtbQ==","count":22},{"data":"CJT0sgQ=","count":0},{"data":"CN7+VQ==","count":3},{"data":"CPTjngM=","count":4},{"data":"CKqglQM=","count":1},{"data":"CJKXkgQ=","count":20},{"data":"CPbFrgI=","count":12},{"data":"CIypiQE=","count":0},{"data":"CNzbpwQ=","count":27},{"data":"COC92gQ=","count":91},{"data":"CJzZgwQ=","count":11},{"data":"CNbCkAI=","count":0},{"data":"COqSqwQ=","count":0},{"data":"CKjv0gM=","count":0},{"data":"CODIwAE=","count":0},{"data":"CP7wtwI=","count":19},{"data":"CJTFCQ==","count":41},{"data":"COqNwAE=","count":51},{"data":"CLimiQM=","count":0},{"data":"CPyLfw==","count":1},{"data":"CNC8zQQ=","count":0},{"data":"CJK9vgQ=","count":28},{"data":"CJyucg==","count":10},{"data":"COyf6gI=","count":2},{"data":"CJLZ4AQ=","count":0},{"data":"CPiqpgM=","count":24},{"data":"CPqQmwI=","count":0},{"data":"CNy7UQ==","count":0},{"data":"CP6Weg==","count":0},{"data":"CLSm4QM=","count":0},{"data":"CMxX","count":0},{"data":"CNCjDA==","count":0},{"data":"CKSp4AM=","count":0},{"data":"CMaOyAQ=","count":0},{"data":"CJq0zQM=","count":19},{"data":"CLjhuwI=","count":0},{"data":"COKmWA==","count":0},{"data":"CN6hnQQ=","count":9},{"data":"CKCCtgE=","count":0},{"data":"COyvvAE=","count":6},{"data":"CP642gI=","count":21},{"data":"COa1ngI=","count":0},{"data":"CLz5tAM=","count":0},{"data":"CLSYQw==","count":16},{"data":"CKTJhAI=","count":20},{"data":"CLC/vgM=","count":14},{"data":"CLTE2gI=","count":0},{"data":"CN7BngI=","count":9},{"data":"COq82AQ=","count":3},{"data":"CLTz6AI=","count":0},{"data":"CPDQrQM=","count":65},{"data":"CJzRqwQ=","count":23},{"data":"CNahtAI=","count":0},{"data":"CNjHzAQ=","count":0},{"data":"CPiR5gM=","count":0},{"data":"CPTZxgM=","count":13},{"data":"CO7GuAE=","count":0},{"data":"CIzW4QM=","count":8},{"data":"CMaFFw==","count":0},{"data":"CJSTtgM=","count":23},{"data":"COrAjgQ=","count":0},{"data":"CITfxgQ=","count":29},{"data":"CPzqkQI=","count":0},{"data":"CKjzyAQ=","count":0},{"data":"CKjnoQI=","count":38},{"data":"CJC9vgI=","count":0},{"data":"CLDPzwE=","count":16},{"data":"CJqCrgM=","count":30},{"data":"CJjI0wE=","count":0},{"data":"CPqB6wE=","count":0},{"data":"CPjVmgE=","count":0},{"data":"CJ6/iAI=","count":37},{"data":"CLDTkAI=","count":3},{"data":"CPrL2QE=","count":16},{"data":"CNLAhQQ=","count":3},{"data":"CMScjwE=","count":0},{"data":"CIqyvwM=","count":0},{"data":"CKixJA==","count":0},{"data":"CJrSyAM=","count":0},{"data":"CPSH0QI=","count":0},{"data":"CPrbzwM=","count":2},{"data":"CNa6lwQ=","count":1},{"data":"CPaecQ==","count":0},{"data":"CJ7xSA==","count":33},{"data":"COj36wE=","count":0},{"data":"CLjmlgM=","count":0},{"data":"CPKRswE=","count":0},{"data":"CL7viAI=","count":0},{"data":"CI6LjgM=","count":10},{"data":"CNTcugE=","count":25},{"data":"CPDTxgE=","count":37},{"data":"CMbklwI=","count":61},{"data":"CPTxtAQ=","count":1},{"data":"CITsRQ==","count":0},{"data":"CLyRSg==","count":11},{"data":"CI6x3gE=","count":0},{"data":"CPzq+QM=","count":0},{"data":"CMKo5gM=","count":2},{"data":"CLS9wQE=","count":25},{"data":"CLKSnQM=","count":0},{"data":"CILJtQE=","count":21},{"data":"CNCC3gI=","count":0},{"data":"CIishAQ=","count":14},{"data":"CMK4hQE=","count":0},{"data":"CLDC1AE=","count":0},{"data":"CLDG0QQ=","count":0},{"data":"CICGngM=","count":0},{"data":"COq8Hw==","count":0},{"data":"CJqHtgE=","count":0},{"data":"CNjBkAE=","count":0},{"data":"CIKHlQM=","count":2},{"data":"CNC31gE=","count":0},{"data":"CJrq5QE=","count":39},{"data":"COyckgE=","count":22},{"data":"CLDi6wM=","count":0},{"data":"COz8ugM=","count":1},{"data":"CMC0uQE=","count":0},{"data":"CI7u+gM=","count":0},{"data":"COykjAI=","count":25},{"data":"CKq5+gM=","count":0},{"data":"CL7wmwM=","count":21},{"data":"CMDn0wM=","count":0},{"data":"CMiz9wM=","count":0},{"data":"CMKxfg==","count":0},{"data":"COaShgM=","count":0},{"data":"CM7MiAM=","count":0},{"data":"CI6WXQ==","count":14},{"data":"CPD8Pw==","count":0},{"data":"CJSergQ=","count":1},{"data":"CJT4mQM=","count":0},{"data":"COjwPQ==","count":44},{"data":"CJi/bg==","count":47},{"data":"CPznGQ==","count":35},{"data":"CNLtqwE=","count":0},{"data":"CISkhQQ=","count":4},{"data":"CIaGqgM=","count":0},{"data":"CITEygI=","count":0},{"data":"CIzDNw==","count":5},{"data":"CMaz4QQ=","count":16},{"data":"CJa54AI=","count":0},{"data":"CMSv5gM=","count":0},{"data":"COa1iAQ=","count":9},{"data":"CMbj2wE=","count":11},{"data":"CLj+xwI=","count":0},{"data":"CLjh9QM=","count":0},{"data":"CIz+vwM=","count":40},{"data":"CJaKxAQ=","count":0},{"data":"CLCJ+QM=","count":22},{"data":"CKbZ5gE=","count":14},{"data":"CJDsbg==","count":22},{"data":"COClqAE=","count":0},{"data":"CPaCyQE=","count":0},{"data":"CLaf8wM=","count":33},{"data":"CPLljwI=","count":0},{"data":"CMKT7AI=","count":0},{"data":"CIqkGg==","count":1},{"data":"COjIpAI=","count":0},{"data":"CNzrhwM=","count":0},{"data":"COzsfA==","count":0},{"data":"CKb85gE=","count":7},{"data":"CPSSGQ==","count":0},{"data":"CLqtgwE=","count":32},{"data":"CKqu8QM=","count":5},{"data":"CKCZpwM=","count":14},{"data":"CNaRgAM=","count":0},{"data":"COzcjgE=","count":0},{"data":"COaZ5wE=","count":0},{"data":"CIzE7gM=","count":24},{"data":"CIbW/AI=","count":0},{"data":"CKqFiQM=","count":0},{"data":"CKarkgE=","count":2},{"data":"CIifJg==","count":0},{"data":"CPjmVg==","count":17},{"data":"CJ6mpgM=","count":0},{"data":"CIDB0QQ=","count":2},{"data":"COSLowE=","count":0},{"data":"CMSgwQI=","count":0},{"data":"CPD0kAI=","count":0},{"data":"CLr9iQE=","count":0},{"data":"COK+Ug==","count":7},{"data":"CICSdg==","count":11},{"data":"CKq1lQQ=","count":0},{"data":"CID90AI=","count":0},{"data":"CLSwjAQ=","count":0},{"data":"CIjajwE=","count":0},{"data":"CJK6owM=","count":0},{"data":"CJSq3AE=","count":29},{"data":"COjS0QI=","count":0},{"data":"CMqxhAE=","count":0},{"data":"CNip3QQ=","count":0},{"data":"CNj3hgI=","count":36},{"data":"CJyo8gE=","count":0},{"data":"CICLmQI=","count":0},{"data":"CKjC3gE=","count":0},{"data":"CPSzqQQ=","count":24},{"data":"COav+QE=","count":46},{"data":"CNz8gAQ=","count":0},{"data":"COTK8gE=","count":30},{"data":"CPjT+QE=","count":0},{"data":"CPy47QE=","count":0},{"data":"CKSN4AI=","count":0},{"data":"CIC6XA==","count":0},{"data":"CJj8ywM=","count":44},{"data":"CPjcBg==","count":1},{"data":"COidkwE=","count":0},{"data":"COrTmAE=","count":0},{"data":"CM6TugM=","count":16},{"data":"CLrQcg==","count":0},{"data":"CNyMZw==","count":0},{"data":"CMzQiQE=","count":9},{"data":"CNT//wM=","count":0},{"data":"CMioEA==","count":0},{"data":"CKL9Zg==","count":2},{"data":"CM7VkgQ=","count":14},{"data":"CIjMmwE=","count":7},{"data":"CJqhtQM=","count":19},{"data":"COCCLg==","count":0},{"data":"CKqhLA==","count":10},{"data":"CJ7/4QM=","count":22},{"data":"CMSYhwE=","count":0},{"data":"CIr+0gI=","count":23},{"data":"COKWzwI=","count":0},{"data":"COjS7gE=","count":43},{"data":"CM6e6gI=","count":0},{"data":"CJzehwE=","count":33},{"data":"CJCKdQ==","count":34},{"data":"COzFeg==","count":0},{"data":"CJ7TtwE=","count":23},{"data":"CLz/Cg==","count":0},{"data":"CLTWJA==","count":0},{"data":"CMqQjQE=","count":18},{"data":"CP6b8wE=","count":6},{"data":"CJSCowM=","count":0},{"data":"CICcqgM=","count":0},{"data":"CNDOuAI=","count":48},{"data":"CJrV6AI=","count":28},{"data":"CPyW3QQ=","count":0},{"data":"CLCqpAM=","count":14},{"data":"CNbYQw==","count":0},{"data":"CIr5Og==","count":24},{"data":"CKDW4wE=","count":12},{"data":"CISA/gE=","count":4},{"data":"CIKoeg==","count":0},{"data":"CIDhTw==","count":15},{"data":"CK7vlQM=","count":0},{"data":"CLyGvQI=","count":9}],"default_value":0},"null_count":0,"tot_col_size":18943171,"last_update_version":410676699834089472,"correlation":1}},"indices":{"tb":{"histogram":{"ndv":5000000,"buckets":[{"count":32768,"lower_bound":"A4AAAAAAAAAB","upper_bound":"A4AAAAAAAIAA","repeats":1},{"count":65536,"lower_bound":"A4AAAAAAAIAB","upper_bound":"A4AAAAAAAQAA","repeats":1},{"count":98304,"lower_bound":"A4AAAAAAAQAB","upper_bound":"A4AAAAAAAYAA","repeats":1},{"count":131072,"lower_bound":"A4AAAAAAAYAB","upper_bound":"A4AAAAAAAgAA","repeats":1},{"count":163840,"lower_bound":"A4AAAAAAAgAB","upper_bound":"A4AAAAAAAoAA","repeats":1},{"count":196608,"lower_bound":"A4AAAAAAAoAB","upper_bound":"A4AAAAAAAwAA","repeats":1},{"count":229376,"lower_bound":"A4AAAAAAAwAB","upper_bound":"A4AAAAAAA4AA","repeats":1},{"count":262144,"lower_bound":"A4AAAAAAA4AB","upper_bound":"A4AAAAAABAAA","repeats":1},{"count":294912,"lower_bound":"A4AAAAAABAAB","upper_bound":"A4AAAAAABIAA","repeats":1},{"count":327680,"lower_bound":"A4AAAAAABIAB","upper_bound":"A4AAAAAABQAA","repeats":1},{"count":360448,"lower_bound":"A4AAAAAABQAB","upper_bound":"A4AAAAAABYAA","repeats":1},{"count":393216,"lower_bound":"A4AAAAAABYAB","upper_bound":"A4AAAAAABgAA","repeats":1},{"count":425984,"lower_bound":"A4AAAAAABgAB","upper_bound":"A4AAAAAABoAA","repeats":1},{"count":458752,"lower_bound":"A4AAAAAABoAB","upper_bound":"A4AAAAAABwAA","repeats":1},{"count":491520,"lower_bound":"A4AAAAAABwAB","upper_bound":"A4AAAAAAB4AA","repeats":1},{"count":524288,"lower_bound":"A4AAAAAAB4AB","upper_bound":"A4AAAAAACAAA","repeats":1},{"count":557056,"lower_bound":"A4AAAAAACAAB","upper_bound":"A4AAAAAACIAA","repeats":1},{"count":589824,"lower_bound":"A4AAAAAACIAB","upper_bound":"A4AAAAAACQAA","repeats":1},{"count":622592,"lower_bound":"A4AAAAAACQAB","upper_bound":"A4AAAAAACYAA","repeats":1},{"count":655360,"lower_bound":"A4AAAAAACYAB","upper_bound":"A4AAAAAACgAA","repeats":1},{"count":688128,"lower_bound":"A4AAAAAACgAB","upper_bound":"A4AAAAAACoAA","repeats":1},{"count":720896,"lower_bound":"A4AAAAAACoAB","upper_bound":"A4AAAAAACwAA","repeats":1},{"count":753664,"lower_bound":"A4AAAAAACwAB","upper_bound":"A4AAAAAAC4AA","repeats":1},{"count":786432,"lower_bound":"A4AAAAAAC4AB","upper_bound":"A4AAAAAADAAA","repeats":1},{"count":819200,"lower_bound":"A4AAAAAADAAB","upper_bound":"A4AAAAAADIAA","repeats":1},{"count":851968,"lower_bound":"A4AAAAAADIAB","upper_bound":"A4AAAAAADQAA","repeats":1},{"count":884736,"lower_bound":"A4AAAAAADQAB","upper_bound":"A4AAAAAADYAA","repeats":1},{"count":917504,"lower_bound":"A4AAAAAADYAB","upper_bound":"A4AAAAAADgAA","repeats":1},{"count":950272,"lower_bound":"A4AAAAAADgAB","upper_bound":"A4AAAAAADoAA","repeats":1},{"count":983040,"lower_bound":"A4AAAAAADoAB","upper_bound":"A4AAAAAADwAA","repeats":1},{"count":1015808,"lower_bound":"A4AAAAAADwAB","upper_bound":"A4AAAAAAD4AA","repeats":1},{"count":1048576,"lower_bound":"A4AAAAAAD4AB","upper_bound":"A4AAAAAAEAAA","repeats":1},{"count":1081344,"lower_bound":"A4AAAAAAEAAB","upper_bound":"A4AAAAAAEIAA","repeats":1},{"count":1114112,"lower_bound":"A4AAAAAAEIAB","upper_bound":"A4AAAAAAEQAA","repeats":1},{"count":1146880,"lower_bound":"A4AAAAAAEQAB","upper_bound":"A4AAAAAAEYAA","repeats":1},{"count":1179648,"lower_bound":"A4AAAAAAEYAB","upper_bound":"A4AAAAAAEgAA","repeats":1},{"count":1212416,"lower_bound":"A4AAAAAAEgAB","upper_bound":"A4AAAAAAEoAA","repeats":1},{"count":1245184,"lower_bound":"A4AAAAAAEoAB","upper_bound":"A4AAAAAAEwAA","repeats":1},{"count":1277952,"lower_bound":"A4AAAAAAEwAB","upper_bound":"A4AAAAAAE4AA","repeats":1},{"count":1310720,"lower_bound":"A4AAAAAAE4AB","upper_bound":"A4AAAAAAFAAA","repeats":1},{"count":1343488,"lower_bound":"A4AAAAAAFAAB","upper_bound":"A4AAAAAAFIAA","repeats":1},{"count":1376256,"lower_bound":"A4AAAAAAFIAB","upper_bound":"A4AAAAAAFQAA","repeats":1},{"count":1409024,"lower_bound":"A4AAAAAAFQAB","upper_bound":"A4AAAAAAFYAA","repeats":1},{"count":1441792,"lower_bound":"A4AAAAAAFYAB","upper_bound":"A4AAAAAAFgAA","repeats":1},{"count":1474560,"lower_bound":"A4AAAAAAFgAB","upper_bound":"A4AAAAAAFoAA","repeats":1},{"count":1507328,"lower_bound":"A4AAAAAAFoAB","upper_bound":"A4AAAAAAFwAA","repeats":1},{"count":1540096,"lower_bound":"A4AAAAAAFwAB","upper_bound":"A4AAAAAAF4AA","repeats":1},{"count":1572864,"lower_bound":"A4AAAAAAF4AB","upper_bound":"A4AAAAAAGAAA","repeats":1},{"count":1605632,"lower_bound":"A4AAAAAAGAAB","upper_bound":"A4AAAAAAGIAA","repeats":1},{"count":1638400,"lower_bound":"A4AAAAAAGIAB","upper_bound":"A4AAAAAAGQAA","repeats":1},{"count":1671168,"lower_bound":"A4AAAAAAGQAB","upper_bound":"A4AAAAAAGYAA","repeats":1},{"count":1703936,"lower_bound":"A4AAAAAAGYAB","upper_bound":"A4AAAAAAGgAA","repeats":1},{"count":1736704,"lower_bound":"A4AAAAAAGgAB","upper_bound":"A4AAAAAAGoAA","repeats":1},{"count":1769472,"lower_bound":"A4AAAAAAGoAB","upper_bound":"A4AAAAAAGwAA","repeats":1},{"count":1802240,"lower_bound":"A4AAAAAAGwAB","upper_bound":"A4AAAAAAG4AA","repeats":1},{"count":1835008,"lower_bound":"A4AAAAAAG4AB","upper_bound":"A4AAAAAAHAAA","repeats":1},{"count":1867776,"lower_bound":"A4AAAAAAHAAB","upper_bound":"A4AAAAAAHIAA","repeats":1},{"count":1900544,"lower_bound":"A4AAAAAAHIAB","upper_bound":"A4AAAAAAHQAA","repeats":1},{"count":1933312,"lower_bound":"A4AAAAAAHQAB","upper_bound":"A4AAAAAAHYAA","repeats":1},{"count":1966080,"lower_bound":"A4AAAAAAHYAB","upper_bound":"A4AAAAAAHgAA","repeats":1},{"count":1998848,"lower_bound":"A4AAAAAAHgAB","upper_bound":"A4AAAAAAHoAA","repeats":1},{"count":2031616,"lower_bound":"A4AAAAAAHoAB","upper_bound":"A4AAAAAAHwAA","repeats":1},{"count":2064384,"lower_bound":"A4AAAAAAHwAB","upper_bound":"A4AAAAAAH4AA","repeats":1},{"count":2097152,"lower_bound":"A4AAAAAAH4AB","upper_bound":"A4AAAAAAIAAA","repeats":1},{"count":2129920,"lower_bound":"A4AAAAAAIAAB","upper_bound":"A4AAAAAAIIAA","repeats":1},{"count":2162688,"lower_bound":"A4AAAAAAIIAB","upper_bound":"A4AAAAAAIQAA","repeats":1},{"count":2195456,"lower_bound":"A4AAAAAAIQAB","upper_bound":"A4AAAAAAIYAA","repeats":1},{"count":2228224,"lower_bound":"A4AAAAAAIYAB","upper_bound":"A4AAAAAAIgAA","repeats":1},{"count":2260992,"lower_bound":"A4AAAAAAIgAB","upper_bound":"A4AAAAAAIoAA","repeats":1},{"count":2293760,"lower_bound":"A4AAAAAAIoAB","upper_bound":"A4AAAAAAIwAA","repeats":1},{"count":2326528,"lower_bound":"A4AAAAAAIwAB","upper_bound":"A4AAAAAAI4AA","repeats":1},{"count":2359296,"lower_bound":"A4AAAAAAI4AB","upper_bound":"A4AAAAAAJAAA","repeats":1},{"count":2392064,"lower_bound":"A4AAAAAAJAAB","upper_bound":"A4AAAAAAJIAA","repeats":1},{"count":2424832,"lower_bound":"A4AAAAAAJIAB","upper_bound":"A4AAAAAAJQAA","repeats":1},{"count":2457600,"lower_bound":"A4AAAAAAJQAB","upper_bound":"A4AAAAAAJYAA","repeats":1},{"count":2490368,"lower_bound":"A4AAAAAAJYAB","upper_bound":"A4AAAAAAJgAA","repeats":1},{"count":2523136,"lower_bound":"A4AAAAAAJgAB","upper_bound":"A4AAAAAAJoAA","repeats":1},{"count":2555904,"lower_bound":"A4AAAAAAJoAB","upper_bound":"A4AAAAAAJwAA","repeats":1},{"count":2588672,"lower_bound":"A4AAAAAAJwAB","upper_bound":"A4AAAAAAJ4AA","repeats":1},{"count":2621440,"lower_bound":"A4AAAAAAJ4AB","upper_bound":"A4AAAAAAKAAA","repeats":1},{"count":2654208,"lower_bound":"A4AAAAAAKAAB","upper_bound":"A4AAAAAAKIAA","repeats":1},{"count":2686976,"lower_bound":"A4AAAAAAKIAB","upper_bound":"A4AAAAAAKQAA","repeats":1},{"count":2719744,"lower_bound":"A4AAAAAAKQAB","upper_bound":"A4AAAAAAKYAA","repeats":1},{"count":2752512,"lower_bound":"A4AAAAAAKYAB","upper_bound":"A4AAAAAAKgAA","repeats":1},{"count":2785280,"lower_bound":"A4AAAAAAKgAB","upper_bound":"A4AAAAAAKoAA","repeats":1},{"count":2818048,"lower_bound":"A4AAAAAAKoAB","upper_bound":"A4AAAAAAKwAA","repeats":1},{"count":2850816,"lower_bound":"A4AAAAAAKwAB","upper_bound":"A4AAAAAAK4AA","repeats":1},{"count":2883584,"lower_bound":"A4AAAAAAK4AB","upper_bound":"A4AAAAAALAAA","repeats":1},{"count":2916352,"lower_bound":"A4AAAAAALAAB","upper_bound":"A4AAAAAALIAA","repeats":1},{"count":2949120,"lower_bound":"A4AAAAAALIAB","upper_bound":"A4AAAAAALQAA","repeats":1},{"count":2981888,"lower_bound":"A4AAAAAALQAB","upper_bound":"A4AAAAAALYAA","repeats":1},{"count":3014656,"lower_bound":"A4AAAAAALYAB","upper_bound":"A4AAAAAALgAA","repeats":1},{"count":3047424,"lower_bound":"A4AAAAAALgAB","upper_bound":"A4AAAAAALoAA","repeats":1},{"count":3080192,"lower_bound":"A4AAAAAALoAB","upper_bound":"A4AAAAAALwAA","repeats":1},{"count":3112960,"lower_bound":"A4AAAAAALwAB","upper_bound":"A4AAAAAAL4AA","repeats":1},{"count":3145728,"lower_bound":"A4AAAAAAL4AB","upper_bound":"A4AAAAAAMAAA","repeats":1},{"count":3178496,"lower_bound":"A4AAAAAAMAAB","upper_bound":"A4AAAAAAMIAA","repeats":1},{"count":3211264,"lower_bound":"A4AAAAAAMIAB","upper_bound":"A4AAAAAAMQAA","repeats":1},{"count":3244032,"lower_bound":"A4AAAAAAMQAB","upper_bound":"A4AAAAAAMYAA","repeats":1},{"count":3276800,"lower_bound":"A4AAAAAAMYAB","upper_bound":"A4AAAAAAMgAA","repeats":1},{"count":3309568,"lower_bound":"A4AAAAAAMgAB","upper_bound":"A4AAAAAAMoAA","repeats":1},{"count":3342336,"lower_bound":"A4AAAAAAMoAB","upper_bound":"A4AAAAAAMwAA","repeats":1},{"count":3375104,"lower_bound":"A4AAAAAAMwAB","upper_bound":"A4AAAAAAM4AA","repeats":1},{"count":3407872,"lower_bound":"A4AAAAAAM4AB","upper_bound":"A4AAAAAANAAA","repeats":1},{"count":3440640,"lower_bound":"A4AAAAAANAAB","upper_bound":"A4AAAAAANIAA","repeats":1},{"count":3473408,"lower_bound":"A4AAAAAANIAB","upper_bound":"A4AAAAAANQAA","repeats":1},{"count":3506176,"lower_bound":"A4AAAAAANQAB","upper_bound":"A4AAAAAANYAA","repeats":1},{"count":3538944,"lower_bound":"A4AAAAAANYAB","upper_bound":"A4AAAAAANgAA","repeats":1},{"count":3571712,"lower_bound":"A4AAAAAANgAB","upper_bound":"A4AAAAAANoAA","repeats":1},{"count":3604480,"lower_bound":"A4AAAAAANoAB","upper_bound":"A4AAAAAANwAA","repeats":1},{"count":3637248,"lower_bound":"A4AAAAAANwAB","upper_bound":"A4AAAAAAN4AA","repeats":1},{"count":3670016,"lower_bound":"A4AAAAAAN4AB","upper_bound":"A4AAAAAAOAAA","repeats":1},{"count":3702784,"lower_bound":"A4AAAAAAOAAB","upper_bound":"A4AAAAAAOIAA","repeats":1},{"count":3735552,"lower_bound":"A4AAAAAAOIAB","upper_bound":"A4AAAAAAOQAA","repeats":1},{"count":3768320,"lower_bound":"A4AAAAAAOQAB","upper_bound":"A4AAAAAAOYAA","repeats":1},{"count":3801088,"lower_bound":"A4AAAAAAOYAB","upper_bound":"A4AAAAAAOgAA","repeats":1},{"count":3833856,"lower_bound":"A4AAAAAAOgAB","upper_bound":"A4AAAAAAOoAA","repeats":1},{"count":3866624,"lower_bound":"A4AAAAAAOoAB","upper_bound":"A4AAAAAAOwAA","repeats":1},{"count":3899392,"lower_bound":"A4AAAAAAOwAB","upper_bound":"A4AAAAAAO4AA","repeats":1},{"count":3932160,"lower_bound":"A4AAAAAAO4AB","upper_bound":"A4AAAAAAPAAA","repeats":1},{"count":3964928,"lower_bound":"A4AAAAAAPAAB","upper_bound":"A4AAAAAAPIAA","repeats":1},{"count":3997696,"lower_bound":"A4AAAAAAPIAB","upper_bound":"A4AAAAAAPQAA","repeats":1},{"count":4030464,"lower_bound":"A4AAAAAAPQAB","upper_bound":"A4AAAAAAPYAA","repeats":1},{"count":4063232,"lower_bound":"A4AAAAAAPYAB","upper_bound":"A4AAAAAAPgAA","repeats":1},{"count":4096000,"lower_bound":"A4AAAAAAPgAB","upper_bound":"A4AAAAAAPoAA","repeats":1},{"count":4128768,"lower_bound":"A4AAAAAAPoAB","upper_bound":"A4AAAAAAPwAA","repeats":1},{"count":4161536,"lower_bound":"A4AAAAAAPwAB","upper_bound":"A4AAAAAAP4AA","repeats":1},{"count":4194304,"lower_bound":"A4AAAAAAP4AB","upper_bound":"A4AAAAAAQAAA","repeats":1},{"count":4227072,"lower_bound":"A4AAAAAAQAAB","upper_bound":"A4AAAAAAQIAA","repeats":1},{"count":4259840,"lower_bound":"A4AAAAAAQIAB","upper_bound":"A4AAAAAAQQAA","repeats":1},{"count":4292608,"lower_bound":"A4AAAAAAQQAB","upper_bound":"A4AAAAAAQYAA","repeats":1},{"count":4325376,"lower_bound":"A4AAAAAAQYAB","upper_bound":"A4AAAAAAQgAA","repeats":1},{"count":4358144,"lower_bound":"A4AAAAAAQgAB","upper_bound":"A4AAAAAAQoAA","repeats":1},{"count":4390912,"lower_bound":"A4AAAAAAQoAB","upper_bound":"A4AAAAAAQwAA","repeats":1},{"count":4423680,"lower_bound":"A4AAAAAAQwAB","upper_bound":"A4AAAAAAQ4AA","repeats":1},{"count":4456448,"lower_bound":"A4AAAAAAQ4AB","upper_bound":"A4AAAAAARAAA","repeats":1},{"count":4489216,"lower_bound":"A4AAAAAARAAB","upper_bound":"A4AAAAAARIAA","repeats":1},{"count":4521984,"lower_bound":"A4AAAAAARIAB","upper_bound":"A4AAAAAARQAA","repeats":1},{"count":4554752,"lower_bound":"A4AAAAAARQAB","upper_bound":"A4AAAAAARYAA","repeats":1},{"count":4587520,"lower_bound":"A4AAAAAARYAB","upper_bound":"A4AAAAAARgAA","repeats":1},{"count":4620288,"lower_bound":"A4AAAAAARgAB","upper_bound":"A4AAAAAARoAA","repeats":1},{"count":4653056,"lower_bound":"A4AAAAAARoAB","upper_bound":"A4AAAAAARwAA","repeats":1},{"count":4685824,"lower_bound":"A4AAAAAARwAB","upper_bound":"A4AAAAAAR4AA","repeats":1},{"count":4718592,"lower_bound":"A4AAAAAAR4AB","upper_bound":"A4AAAAAASAAA","repeats":1},{"count":4751360,"lower_bound":"A4AAAAAASAAB","upper_bound":"A4AAAAAASIAA","repeats":1},{"count":4784128,"lower_bound":"A4AAAAAASIAB","upper_bound":"A4AAAAAASQAA","repeats":1},{"count":4816896,"lower_bound":"A4AAAAAASQAB","upper_bound":"A4AAAAAASYAA","repeats":1},{"count":4849664,"lower_bound":"A4AAAAAASYAB","upper_bound":"A4AAAAAASgAA","repeats":1},{"count":4882432,"lower_bound":"A4AAAAAASgAB","upper_bound":"A4AAAAAASoAA","repeats":1},{"count":4915200,"lower_bound":"A4AAAAAASoAB","upper_bound":"A4AAAAAASwAA","repeats":1},{"count":4947968,"lower_bound":"A4AAAAAASwAB","upper_bound":"A4AAAAAAS4AA","repeats":1},{"count":4980736,"lower_bound":"A4AAAAAAS4AB","upper_bound":"A4AAAAAATAAA","repeats":1},{"count":5000000,"lower_bound":"A4AAAAAATAAB","upper_bound":"A4AAAAAATEtA","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2497,2468,2447,2444,2467,2448,2562,2457,2437,2466,2511,2460,2508,2561,2520,2461,2486,2445,2404,2450,2466,2468,2438,2469,2492,2496,2529,2550,2519,2398,2470,2375,2482,2479,2484,2455,2471,2374,2434,2383,2444,2377,2343,2403,2492,2435,2460,2378,2449,2521,2393,2378,2390,2487,2461,2445,2363,2358,2496,2395,2424,2418,2358,2491,2478,2473,2404,2467,2399,2337,2455,2438,2430,2445,2388,2449,2494,2472,2450,2408,2577,2398,2470,2363,2376,2457,2513,2421,2451,2461,2557,2417,2421,2477,2430,2429,2420,2446,2417,2534,2399,2493,2395,2443,2502,2465,2327,2407,2419,2450,2441,2406,2372,2488,2474,2427,2488,2418,2397,2458,2432,2498,2436,2466,2423,2472,2545,2484,2384,2505,2434,2441,2407,2445,2439,2374,2444,2475,2447,2477,2450,2434,2442,2440,2402,2460,2493,2452,2504,2526,2407,2358,2448,2411,2452,2469,2418,2470,2526,2402,2461,2450,2391,2441,2472,2451,2480,2426,2490,2409,2396,2446,2372,2415,2458,2443,2485,2480,2428,2433,2425,2428,2382,2396,2436,2407,2535,2426,2465,2495,2407,2445,2577,2425,2494,2489,2520,2432,2368,2369,2429,2459,2431,2416,2453,2413,2438,2430,2489,2460,2412,2450,2412,2411,2453,2392,2324,2469,2447,2435,2423,2462,2427,2448,2401,2446,2403,2393,2452,2433,2472,2428,2448,2433,2447,2525,2444,2481,2430,2421,2383,2411,2398,2402,2519,2363,2442,2501,2464,2469,2447,2356,2353,2445,2365,2402,2443,2345,2402,2432,2446,2405,2461,2406,2406,2426,2447,2366,2269,2441,2500,2420,2349,2409,2406,2470,2489,2525,2451,2458,2472,2539,2460,2498,2425,2369,2372,2361,2407,2516,2438,2377,2371,2336,2476,2453,2405,2456,2447,2455,2478,2458,2430,2407,2468,2469,2413,2459,2399,2410,2401,2490,2483,2445,2411,2467,2478,2415,2441,2485,2440,2486,2406,2460,2324,2547,2472,2480,2513,2388,2389,2409,2379,2406,2491,2438,2411,2375,2479,2514,2454,2384,2496,2402,2393,2537,2487,2490,2477,2478,2458,2477,2416,2453,2443,2370,2437,2413,2402,2353,2441,2485,2427,2450,2393,2501,2401,2396,2423,2417,2423,2436,2519,2414,2464,2352,2424,2506,2467,2391,2341,2473,2457,2458,2520,2503,2379,2385,2396,2475,2495,2360,2519,2452,2471,2401,2463,2485,2472,2416,2505,2435,2408,2378,2464,2428,2412,2502,2476,2459,2476,2448,2520,2409,2300,2420,2375,2483,2488,2432,2478,2512,2413,2414,2527,2341,2458,2483,2414,2331,2508,2471,2490,2442,2411,2426,2348,2426,2389,2327,2418,2455,2443,2449,2392,2488,2382,2420,2402,2507,2441,2451,2440,2413,2405,2457,2541,2335,2463,2470,2513,2433,2466,2447,2551,2412,2478,2500,2523,2415,2451,2418,2358,2440,2463,2396,2516,2441,2399,2469,2403,2389,2385,2404,2436,2409,2491,2395,2485,2463,2461,2525,2397,2396,2338,2346,2486,2385,2382,2474,2523,2434,2375,2386,2433,2489,2448,2422,2412,2559,2454,2437,2329,2536,2393,2330,2494,2537,2573,2383,2384,2553,2487,2434,2434,2414,2444,2512,2449,2386,2492,2412,2413,2447,2421,2462,2540,2442,2409,2388,2489,2449,2407,2427,2401,2406,2456,2485,2405,2452,2475,2535,2445,2383,2402,2477,2375,2375,2496,2399,2461,2466,2366,2452,2414,2453,2402,2518,2427,2401,2504,2465,2483,2428,2400,2436,2482,2430,2412,2414,2462,2454,2353,2497,2518,2447,2462,2394,2356,2379,2352,2431,2331,2439,2496,2459,2427,2408,2489,2398,2411,2400,2461,2397,2441,2405,2376,2409,2508,2415,2372,2439,2355,2401,2439,2442,2408,2434,2413,2429,2433,2427,2439,2450,2408,2433,2398,2418,2395,2383,2392,2433,2459,2366,2448,2430,2432,2431,2443,2363,2564,2395,2499,2457,2421,2412,2494,2485,2479,2446,2477,2449,2503,2531,2410,2422,2428,2423,2424,2495,2478,2400,2431,2518,2380,2461,2487,2506,2496,2404,2525,2434,2457,2421,2398,2495,2397,2501,2423,2370,2390,2456,2420,2512,2492,2444,2440,2507,2448,2431,2421,2434,2459,2474,2417,2477,2392,2350,2400,2446,2427,2402,2429,2525,2483,2409,2401,2447,2467,2474,2395,2454,2538,2487,2419,2413,2533,2362,2338,2428,2389,2426,2505,2469,2429,2458,2481,2512,2365,2407,2368,2477,2552,2443,2377,2461,2390,2429,2422,2466,2386,2370,2435,2414,2504,2455,2468,2423,2441,2391,2493,2431,2468,2399,2384,2395,2458,2464,2460,2392,2402,2434,2381,2538,2508,2413,2478,2454,2467,2441,2444,2454,2393,2500,2416,2364,2604,2494,2474,2454,2389,2423,2441,2412,2517,2446,2402,2383,2477,2354,2469,2421,2445,2439,2420,2425,2373,2439,2416,2396,2449,2436,2396,2488,2402,2477,2492,2431,2431,2408,2483,2391,2438,2393,2447,2357,2539,2452,2450,2443,2439,2406,2482,2401,2455,2412,2452,2411,2443,2446,2476,2439,2319,2381,2503,2481,2464,2414,2402,2531,2485,2382,2468,2478,2482,2479,2404,2493,2511,2429,2411,2378,2456,2532,2425,2386,2487,2440,2418,2394,2406,2430,2389,2514,2488,2468,2496,2451,2511,2512,2484,2454,2503,2459,2406,2420,2482,2453,2344,2489,2466,2353,2486,2349,2461,2410,2491,2402,2430,2402,2488,2441,2483,2425,2439,2480,2419,2390,2354,2506,2399,2531,2477,2519,2433,2415,2510,2553,2458,2416,2401,2498,2517,2473,2414,2462,2450,2497,2436,2410,2457,2482,2441,2344,2478,2405,2387,2428,2360,2395,2434,2460,2419,2494,2476,2426,2497,2409,2517,2472,2461,2462,2480,2465,2530,2362,2419,2524,2474,2468,2456,2446,2530,2403,2387,2438,2440,2515,2375,2520,2393,2385,2373,2471,2377,2445,2370,2372,2455,2412,2353,2415,2406,2468,2420,2458,2366,2494,2393,2547,2430,2466,2438,2457,2496,2368,2455,2499,2500,2510,2425,2477,2387,2427,2468,2479,2388,2478,2347,2412,2433,2471,2447,2378,2475,2529,2365,2454,2511,2423,2382,2404,2397,2439,2444,2512,2505,2473,2466,2358,2455,2512,2499,2428,2388,2491,2368,2409,2534,2393,2440,2509,2405,2527,2385,2376,2403,2385,2408,2443,2441,2460,2482,2482,2362,2527,2521,2412,2491,2428,2507,2373,2439,2433,2402,2513,2396,2424,2510,2448,2386,2384,2492,2478,2483,2475,2409,2450,2425,2376,2513,2530,2418,2502,2354,2490,2479,2428,2450,2499,2380,2414,2361,2408,2393,2438,2469,2394,2460,2284,2438,2405,2387,2481,2335,2436,2405,2464,2424,2409,2485,2483,2542,2447,2527,2509,2424,2384,2456,2433,2407,2406,2497,2402,2389,2421,2538,2352,2420,2426,2410,2453,2347,2454,2485,2392,2447,2443,2462,2468,2368,2453,2421,2389,2436,2401,2543,2484,2434,2359,2431,2495,2429,2401,2400,2552,2473,2337,2385,2527,2324,2466,2424,2432,2466,2451,2484,2488,2501,2449,2446,2379,2460,2484,2412,2468,2467,2365,2470,2470,2400,2522,2389,2461,2358,2479,2395,2446,2446,2450,2502,2387,2430,2473,2504,2451,2559,2506,2390,2490,2458,2460,2512,2467,2422,2432,2420,2354,2443,2403,2474,2476,2396,2452,2378,2382,2420,2448,2397,2377,2376,2518,2419,2434,2449,2398,2437,2537,2390,2413,2424,2461,2432,2520,2439,2464,2380,2472,2454,2344,2564,2431,2453,2433,2478,2441,2426,2427,2460,2398,2412,2440,2405,2411,2521,2499,2418,2462,2435,2382,2493,2458,2474,2384,2406,2370,2413,2425,2472,2384,2415,2506,2497,2360,2436,2493,2441,2386,2412,2460,2444,2451,2417,2475,2418,2372,2446,2514,2382,2448,2458,2437,2458,2467,2390,2460,2425,2398,2400,2442,2433,2374,2502,2451,2515,2521,2419,2425,2398,2454,2507,2498,2484,2465,2460,2442,2383,2441,2389,2460,2407,2466,2437,2489,2374,2492,2538,2432,2430,2415,2450,2442,2465,2449,2401,2502,2434,2381,2457,2468,2412,2415,2475,2483,2357,2451,2479,2381,2457,2412,2472,2342,2476,2411,2414,2417,2465,2349,2398,2526,2434,2486,2428,2436,2549,2446,2427,2463,2521,2549,2483,2442,2517,2437,2408,2434,2356,2426,2473,2369,2430,2399,2464,2443,2537,2407,2460,2462,2447,2522,2432,2499,2452,2470,2421,2444,2382,2473,2503,2465,2523,2443,2514,2401,2386,2541,2420,2475,2354,2433,2480,2507,2486,2452,2411,2486,2457,2440,2367,2462,2479,2370,2479,2506,2489,2463,2368,2460,2450,2445,2421,2407,2473,2433,2385,2481,2501,2348,2458,2467,2426,2443,2512,2490,2419,2330,2427,2390,2411,2539,2386,2360,2376,2370,2460,2493,2515,2402,2450,2394,2370,2402,2465,2455,2470,2468,2473,2448,2446,2414,2480,2420,2409,2477,2410,2396,2361,2449,2444,2438,2437,2430,2383,2569,2407,2418,2381,2354,2558,2542,2364,2398,2479,2409,2450,2509,2406,2442,2390,2456,2482,2462,2462,2430,2379,2458,2509,2424,2497,2443,2528,2466,2464,2387,2418,2459,2468,2400,2422,2479,2475,2458,2416,2421,2449,2436,2501,2462,2479,2412,2439,2486,2410,2373,2490,2364,2440,2392,2526,2476,2383,2439,2471,2433,2469,2411,2490,2520,2310,2412,2424,2356,2382,2496,2476,2472,2436,2447,2526,2486,2422,2430,2500,2451,2460,2403,2348,2463,2429,2396,2446,2428,2377,2430,2503,2428,2407,2474,2441,2473,2441,2385,2475,2385,2453,2465,2448,2413,2506,2344,2474,2424,2414,2426,2483,2499,2513,2464,2536,2398,2304,2480,2438,2352,2335,2508,2428,2586,2414,2521,2412,2413,2434,2441,2468,2436,2415,2443,2482,2462,2486,2377,2398,2452,2444,2479,2462,2515,2440,2450,2417,2468,2449,2488,2407,2425,2444,2477,2381,2343,2458,2372,2499,2472,2470,2468,2404,2478,2427,2399,2389,2475,2445,2474,2401,2410,2386,2407,2441,2346,2498,2417,2513,2448,2447,2413,2481,2464,2390,2456,2416,2471,2463,2514,2430,2499,2404,2399,2455,2504,2387,2494,2416,2440,2401,2541,2435,2436,2413,2433,2463,2353,2479,2414,2428,2435,2393,2499,2399,2461,2430,2391,2453,2446,2422,2432,2487,2352,2481,2450,2430,2483,2454,2445,2456,2411,2405,2525,2390,2504,2438,2451,2443,2427,2492,2476,2483,2370,2430,2383,2464,2513,2548,2454,2489,2468,2388,2442,2426,2485,2558,2404,2374,2380,2443,2559,2412,2405,2472,2402,2437,2472,2419,2442,2410,2330,2398,2461,2391,2435,2371,2421,2417,2537,2456,2362,2422,2532,2468,2442,2418,2444,2449,2492,2578,2537,2392,2418,2469,2510,2522,2399,2366,2420,2490,2406,2463,2474,2554,2395,2409,2515,2473,2446,2502,2452,2468,2428,2422,2415,2490,2357,2442,2475,2448,2388,2427,2389,2404,2420,2482,2384,2422,2436,2428,2562,2447,2461,2462,2417,2427,2496,2460,2439,2354,2366,2354,2404,2447,2436,2464,2361,2413,2352,2518,2306,2374,2414,2441,2507,2441,2445,2514,2551,2494,2415,2466,2475,2454,2388,2441,2488,2522,2427,2484,2437,2420,2456,2479,2346,2424,2535,2425,2559,2527,2510,2425,2486,2523,2426,2454,2408,2507,2482,2393,2457,2445,2441,2390,2475,2475,2401,2369,2430,2511,2509,2429,2515,2405,2468,2444,2445,2460,2381,2503,2379,2432,2457,2385,2444,2463,2414,2364,2571,2413,2460,2386,2400,2498,2489,2477,2480,2377,2423,2327,2534,2446,2417,2404,2522,2370,2458,2468,2429,2363,2404,2387,2548,2496,2452,2430,2399,2442,2452,2482,2414,2501,2440,2404,2436,2490,2415,2421,2409,2409,2328,2483,2477,2502,2400,2410,2470,2414,2485,2437,2528,2388,2385,2453,2406,2514,2348,2377,2405,2352,2554,2494,2450,2382,2468,2451,2444,2425,2611,2474,2382,2461,2474,2415,2524,2497,2407,2458,2514,2460,2539,2421,2500,2467,2439,2379,2322,2449,2477,2466,2418,2339,2396,2452,2364,2407,2508,2442,2372,2462,2313,2467,2462,2451,2496,2412,2454,2457,2463,2442,2401,2498,2373,2477,2373,2531,2531,2435,2433,2443,2391,2453,2455,2385,2409,2450,2474,2441,2440,2398,2367,2397,2420,2466,2405,2406,2486,2431,2477,2523,2493,2376,2528,2444,2506,2392,2415,2434,2415,2452,2447,2452,2464]},{"counters":[2410,2467,2507,2420,2368,2488,2379,2392,2493,2422,2378,2422,2409,2446,2445,2464,2450,2496,2426,2447,2488,2369,2512,2420,2477,2449,2452,2469,2399,2425,2453,2436,2421,2360,2406,2350,2523,2366,2508,2429,2391,2436,2435,2439,2410,2403,2430,2478,2426,2425,2415,2436,2387,2408,2365,2469,2455,2492,2323,2428,2492,2410,2423,2424,2512,2449,2461,2479,2539,2407,2410,2418,2487,2436,2453,2468,2419,2353,2450,2410,2387,2443,2457,2462,2438,2356,2498,2406,2415,2508,2394,2431,2480,2424,2388,2436,2479,2456,2383,2513,2391,2504,2473,2397,2409,2397,2491,2498,2513,2480,2382,2379,2389,2458,2444,2385,2419,2485,2416,2484,2308,2486,2493,2550,2482,2447,2417,2425,2526,2410,2428,2433,2402,2549,2556,2313,2399,2386,2531,2459,2445,2443,2472,2448,2460,2419,2457,2382,2488,2467,2521,2445,2469,2391,2466,2418,2454,2458,2479,2454,2449,2456,2396,2446,2399,2414,2458,2334,2446,2431,2453,2455,2490,2412,2455,2499,2436,2414,2475,2438,2445,2506,2391,2428,2385,2546,2386,2397,2451,2432,2412,2391,2512,2457,2461,2397,2446,2534,2448,2508,2387,2338,2488,2498,2367,2499,2448,2407,2390,2432,2418,2441,2474,2493,2465,2300,2505,2433,2606,2493,2474,2379,2452,2440,2411,2381,2379,2393,2455,2465,2430,2465,2439,2515,2409,2512,2430,2453,2455,2431,2536,2425,2473,2502,2446,2457,2458,2376,2536,2430,2438,2458,2466,2380,2534,2409,2462,2460,2413,2448,2506,2529,2372,2432,2455,2454,2462,2540,2382,2584,2441,2412,2464,2388,2477,2431,2423,2444,2409,2439,2400,2393,2398,2408,2478,2414,2407,2481,2425,2464,2514,2484,2382,2393,2533,2441,2403,2449,2400,2542,2414,2341,2360,2402,2366,2384,2390,2450,2458,2410,2484,2398,2375,2424,2484,2449,2451,2447,2551,2504,2451,2492,2406,2465,2343,2457,2485,2508,2506,2431,2407,2460,2448,2411,2410,2491,2539,2530,2438,2428,2532,2428,2434,2453,2373,2463,2496,2490,2357,2451,2388,2379,2480,2492,2445,2514,2475,2412,2460,2332,2476,2357,2516,2477,2406,2364,2281,2502,2413,2440,2373,2387,2378,2473,2519,2467,2489,2331,2435,2408,2433,2516,2472,2405,2407,2397,2399,2350,2417,2356,2456,2397,2453,2438,2421,2477,2457,2531,2382,2437,2440,2460,2396,2446,2331,2427,2475,2433,2425,2494,2411,2507,2584,2427,2539,2377,2265,2467,2481,2398,2458,2503,2514,2430,2370,2347,2434,2463,2564,2448,2457,2459,2489,2320,2449,2500,2405,2408,2491,2461,2486,2490,2368,2394,2456,2454,2451,2418,2421,2417,2456,2448,2399,2490,2467,2475,2441,2385,2566,2401,2402,2349,2496,2417,2490,2433,2388,2436,2486,2417,2418,2440,2387,2446,2397,2435,2447,2427,2357,2432,2497,2469,2370,2445,2396,2384,2417,2359,2424,2468,2510,2465,2415,2431,2393,2365,2513,2515,2406,2538,2452,2455,2487,2435,2445,2401,2508,2437,2534,2445,2392,2520,2358,2367,2404,2439,2441,2431,2394,2428,2400,2415,2442,2483,2516,2404,2500,2398,2454,2494,2338,2380,2418,2467,2399,2480,2415,2461,2457,2492,2400,2490,2492,2413,2401,2413,2378,2430,2436,2412,2308,2446,2338,2543,2438,2464,2499,2493,2507,2433,2446,2510,2365,2378,2437,2347,2402,2472,2539,2400,2458,2452,2323,2398,2507,2536,2547,2339,2414,2405,2401,2461,2399,2452,2470,2478,2368,2409,2412,2415,2434,2334,2461,2474,2433,2464,2436,2452,2411,2415,2398,2504,2372,2408,2404,2462,2476,2424,2505,2365,2531,2390,2430,2505,2482,2456,2522,2465,2398,2477,2357,2459,2520,2538,2398,2481,2391,2375,2472,2458,2424,2480,2422,2443,2511,2475,2407,2467,2402,2391,2479,2435,2523,2424,2431,2420,2474,2485,2468,2468,2350,2342,2461,2492,2466,2427,2421,2466,2465,2536,2426,2366,2453,2393,2444,2509,2405,2375,2454,2403,2395,2473,2413,2456,2449,2512,2415,2471,2458,2434,2394,2399,2439,2385,2451,2417,2406,2392,2473,2364,2471,2422,2553,2423,2326,2472,2442,2483,2436,2487,2514,2411,2377,2518,2428,2406,2416,2439,2429,2423,2440,2385,2496,2405,2284,2403,2393,2461,2418,2491,2374,2521,2511,2360,2431,2436,2411,2509,2466,2510,2389,2417,2418,2416,2493,2445,2451,2553,2481,2411,2402,2532,2410,2492,2445,2402,2519,2408,2461,2426,2397,2408,2395,2422,2446,2523,2471,2470,2497,2388,2488,2429,2511,2445,2430,2384,2494,2469,2519,2487,2420,2535,2433,2397,2558,2389,2485,2441,2458,2477,2384,2435,2459,2552,2458,2392,2496,2420,2380,2454,2417,2459,2423,2547,2423,2430,2486,2411,2455,2372,2555,2493,2505,2431,2443,2406,2442,2405,2474,2284,2427,2451,2496,2409,2461,2468,2440,2504,2411,2465,2491,2417,2526,2409,2485,2358,2387,2405,2435,2413,2409,2383,2393,2378,2459,2498,2502,2414,2483,2462,2463,2426,2395,2489,2466,2489,2457,2437,2392,2472,2469,2380,2380,2444,2452,2453,2455,2456,2495,2367,2442,2419,2371,2429,2445,2375,2464,2439,2436,2468,2401,2504,2420,2422,2373,2475,2427,2484,2442,2448,2452,2431,2445,2401,2391,2471,2514,2272,2491,2398,2437,2494,2502,2430,2447,2462,2484,2398,2429,2518,2276,2361,2494,2444,2437,2427,2447,2460,2461,2440,2473,2393,2412,2397,2452,2365,2495,2478,2429,2440,2382,2439,2417,2526,2455,2448,2480,2427,2398,2409,2435,2451,2404,2484,2451,2528,2483,2503,2398,2406,2469,2391,2330,2464,2525,2420,2428,2447,2436,2428,2415,2440,2490,2509,2534,2382,2522,2442,2475,2444,2423,2477,2440,2436,2444,2465,2450,2454,2420,2336,2454,2511,2435,2447,2434,2429,2398,2497,2486,2425,2420,2462,2412,2414,2434,2453,2418,2374,2460,2383,2428,2475,2441,2407,2451,2466,2422,2447,2364,2385,2493,2426,2394,2403,2404,2410,2382,2442,2394,2446,2410,2401,2455,2455,2393,2465,2389,2447,2422,2425,2465,2410,2459,2440,2427,2460,2445,2420,2433,2364,2340,2455,2463,2424,2439,2396,2459,2510,2474,2526,2460,2339,2381,2365,2517,2518,2407,2482,2388,2452,2505,2432,2406,2422,2426,2472,2526,2459,2357,2401,2478,2386,2402,2469,2425,2461,2391,2444,2433,2351,2450,2466,2415,2510,2400,2582,2488,2484,2413,2267,2476,2448,2388,2487,2427,2469,2426,2415,2460,2418,2281,2491,2487,2458,2453,2471,2473,2474,2366,2340,2391,2444,2495,2416,2422,2537,2447,2452,2464,2433,2488,2551,2434,2530,2397,2462,2436,2517,2454,2531,2430,2416,2338,2563,2467,2462,2485,2433,2391,2382,2422,2450,2369,2533,2411,2517,2417,2503,2448,2468,2364,2430,2437,2451,2491,2396,2418,2358,2463,2396,2455,2428,2429,2359,2405,2377,2432,2417,2392,2461,2387,2434,2410,2477,2515,2369,2427,2498,2442,2563,2373,2492,2471,2456,2509,2430,2424,2464,2430,2365,2489,2427,2388,2500,2412,2375,2454,2353,2382,2458,2446,2435,2503,2439,2398,2436,2461,2386,2419,2433,2508,2414,2490,2340,2453,2374,2472,2430,2473,2479,2476,2365,2370,2464,2407,2530,2466,2493,2419,2408,2368,2453,2459,2406,2430,2510,2491,2445,2429,2406,2431,2495,2484,2479,2463,2498,2475,2480,2433,2433,2495,2490,2465,2519,2469,2464,2451,2484,2450,2450,2461,2462,2457,2393,2439,2385,2436,2369,2495,2423,2582,2462,2448,2443,2411,2369,2448,2365,2432,2395,2493,2530,2501,2519,2506,2409,2422,2500,2521,2457,2506,2438,2462,2389,2470,2490,2433,2444,2461,2438,2346,2381,2403,2455,2486,2382,2499,2366,2476,2432,2443,2389,2495,2354,2452,2402,2505,2453,2410,2375,2404,2522,2418,2476,2380,2510,2461,2476,2406,2451,2512,2418,2429,2424,2580,2490,2436,2411,2443,2481,2426,2446,2437,2421,2408,2491,2400,2534,2421,2419,2396,2413,2471,2399,2366,2443,2439,2511,2342,2426,2422,2445,2476,2482,2407,2402,2455,2388,2503,2400,2373,2377,2382,2460,2468,2439,2335,2448,2477,2380,2505,2497,2586,2431,2454,2474,2480,2408,2407,2449,2414,2441,2470,2422,2485,2480,2381,2466,2536,2511,2402,2471,2414,2465,2541,2471,2528,2546,2504,2456,2456,2452,2451,2436,2500,2543,2431,2499,2428,2450,2392,2465,2494,2476,2384,2395,2381,2443,2473,2442,2453,2370,2442,2437,2391,2381,2467,2459,2487,2464,2437,2532,2460,2468,2438,2405,2488,2460,2412,2426,2437,2382,2445,2436,2464,2398,2406,2412,2368,2435,2513,2451,2391,2423,2478,2477,2451,2384,2422,2518,2406,2388,2473,2429,2501,2491,2392,2423,2547,2499,2436,2416,2562,2455,2377,2501,2503,2436,2343,2447,2433,2436,2479,2397,2504,2458,2428,2484,2427,2466,2466,2429,2482,2453,2463,2462,2431,2437,2407,2402,2351,2381,2367,2429,2512,2406,2461,2396,2528,2421,2460,2423,2440,2481,2457,2491,2483,2466,2398,2416,2376,2521,2428,2425,2445,2414,2473,2456,2552,2406,2416,2378,2510,2399,2460,2445,2419,2397,2428,2434,2508,2454,2484,2364,2405,2521,2414,2528,2415,2436,2391,2398,2441,2355,2472,2535,2304,2490,2417,2456,2447,2446,2390,2524,2439,2339,2436,2512,2493,2412,2417,2469,2395,2431,2450,2437,2439,2454,2369,2439,2345,2389,2457,2518,2388,2413,2491,2418,2463,2456,2458,2524,2440,2407,2490,2503,2424,2461,2474,2443,2458,2440,2463,2426,2460,2424,2487,2414,2374,2499,2352,2394,2429,2460,2488,2296,2356,2423,2419,2495,2388,2467,2425,2415,2432,2510,2493,2423,2383,2414,2412,2438,2453,2403,2536,2429,2427,2401,2443,2400,2430,2479,2337,2448,2474,2386,2431,2529,2451,2477,2509,2509,2455,2398,2481,2357,2317,2405,2411,2380,2512,2417,2384,2425,2437,2424,2445,2445,2389,2467,2402,2418,2402,2424,2479,2508,2447,2510,2492,2440,2449,2438,2471,2469,2418,2481,2439,2426,2394,2431,2431,2441,2474,2489,2416,2429,2468,2466,2440,2476,2489,2371,2386,2473,2458,2446,2400,2363,2411,2520,2460,2375,2418,2462,2409,2374,2519,2391,2458,2428,2405,2435,2387,2350,2504,2439,2395,2538,2440,2439,2513,2492,2435,2385,2393,2390,2453,2451,2361,2423,2434,2478,2380,2468,2491,2429,2560,2412,2414,2491,2410,2453,2316,2539,2468,2418,2457,2542,2413,2400,2479,2444,2382,2470,2457,2437,2375,2426,2429,2519,2442,2461,2470,2363,2419,2515,2403,2388,2402,2417,2453,2561,2496,2420,2442,2420,2403,2398,2405,2384,2537,2473,2436,2519,2396,2479,2500,2470,2423,2410,2430,2408,2504,2420,2440,2379,2501,2363,2371,2471,2456,2533,2361,2440,2421,2462,2431,2511,2424,2428,2472,2464,2471,2581,2526,2494,2400,2401,2435,2490,2445,2470,2478,2403,2427,2489,2374,2457,2357,2475,2457,2389,2474,2423,2429,2549,2422,2421,2462,2482,2471,2402,2442,2524,2510,2428,2351,2430,2411,2411,2444,2441,2464,2491,2518,2449,2437,2393,2575,2481,2464,2384,2403,2437,2479,2555,2394,2437,2408,2417,2443,2427,2437,2530,2347,2468,2460,2347,2374,2448,2445,2463,2481,2425,2399,2408,2388,2503,2478,2480,2420,2466,2443,2417,2429,2480,2418,2389,2441,2426,2430,2436,2574,2499,2441,2357,2411,2436,2493,2503,2350,2398,2494,2467,2483,2428,2432,2406,2437,2508,2567,2469,2456,2481,2433,2448,2373,2494,2377,2461,2451,2498,2364,2415,2432,2427,2427,2470,2473,2350,2494,2395,2448,2435,2362,2460,2435,2401,2392,2399,2344,2386,2467,2506,2439,2553,2397,2433,2474,2510,2442,2428,2456,2464,2467,2526,2442,2483,2439,2422,2528,2429,2377,2493,2453,2455,2430,2472,2353,2521,2415,2417,2488,2357,2530,2486,2445,2529,2456,2483,2406,2516,2423,2471,2405,2504,2386,2507,2443,2437,2470,2460,2418,2456,2413,2379,2398,2418,2518,2438,2372,2409,2380,2486,2415,2410,2437,2416,2444,2433,2424,2363,2488,2442,2389,2433,2468,2416,2425,2366,2410,2503,2431,2485,2528,2451,2525,2468]},{"counters":[2431,2435,2556,2475,2346,2489,2338,2452,2470,2458,2480,2455,2347,2476,2520,2574,2479,2552,2390,2405,2403,2548,2460,2466,2448,2488,2416,2399,2481,2525,2442,2390,2445,2535,2451,2460,2407,2442,2442,2452,2508,2475,2504,2444,2327,2452,2418,2499,2523,2425,2447,2411,2405,2383,2503,2532,2521,2398,2401,2448,2447,2417,2398,2378,2433,2400,2424,2390,2498,2360,2359,2559,2414,2410,2447,2413,2500,2409,2396,2429,2518,2437,2498,2387,2376,2531,2408,2421,2483,2445,2472,2481,2540,2494,2473,2435,2434,2470,2444,2394,2466,2395,2387,2405,2431,2422,2317,2469,2387,2405,2427,2417,2406,2479,2464,2512,2452,2460,2432,2334,2451,2406,2381,2470,2463,2380,2467,2420,2425,2483,2483,2427,2397,2442,2439,2487,2399,2494,2439,2422,2418,2457,2463,2458,2446,2441,2448,2442,2403,2446,2441,2461,2506,2359,2442,2525,2492,2511,2405,2443,2414,2474,2507,2362,2432,2470,2360,2450,2488,2520,2440,2519,2437,2372,2418,2464,2378,2409,2465,2427,2395,2425,2467,2492,2394,2419,2422,2557,2483,2560,2386,2466,2527,2444,2414,2498,2458,2499,2464,2417,2450,2450,2389,2434,2358,2355,2410,2424,2464,2392,2472,2534,2459,2472,2463,2414,2368,2447,2471,2423,2488,2449,2464,2476,2458,2484,2381,2488,2438,2396,2441,2429,2467,2465,2440,2353,2483,2575,2431,2443,2535,2470,2497,2418,2488,2398,2396,2431,2456,2419,2448,2454,2468,2471,2384,2427,2475,2435,2461,2348,2392,2393,2492,2427,2425,2475,2391,2485,2394,2516,2342,2463,2342,2432,2419,2477,2441,2445,2403,2452,2497,2370,2511,2595,2369,2502,2407,2367,2451,2371,2461,2425,2460,2428,2411,2334,2403,2391,2385,2465,2513,2368,2411,2518,2458,2466,2433,2448,2461,2405,2401,2509,2474,2435,2494,2512,2454,2383,2440,2374,2498,2467,2452,2390,2457,2431,2511,2447,2381,2549,2340,2473,2510,2415,2499,2481,2482,2462,2496,2353,2465,2354,2392,2436,2467,2411,2451,2473,2480,2410,2461,2385,2482,2432,2528,2412,2475,2425,2445,2514,2400,2420,2461,2493,2471,2480,2405,2385,2438,2469,2498,2328,2401,2520,2427,2295,2431,2480,2357,2459,2470,2361,2367,2435,2493,2497,2390,2404,2438,2413,2456,2554,2551,2431,2368,2408,2457,2423,2429,2460,2454,2477,2460,2368,2480,2495,2451,2466,2393,2390,2501,2441,2478,2386,2379,2494,2435,2403,2468,2327,2424,2403,2425,2417,2507,2375,2397,2442,2462,2425,2422,2478,2453,2369,2464,2425,2406,2410,2405,2425,2538,2451,2484,2384,2505,2379,2471,2450,2463,2438,2478,2429,2451,2407,2389,2525,2455,2422,2423,2432,2442,2464,2450,2387,2470,2448,2444,2409,2415,2460,2514,2404,2592,2437,2391,2403,2480,2472,2464,2443,2476,2518,2409,2383,2400,2422,2569,2458,2398,2476,2371,2438,2420,2495,2424,2402,2390,2457,2460,2366,2342,2470,2454,2466,2374,2431,2401,2421,2411,2470,2407,2486,2431,2350,2398,2445,2454,2461,2426,2441,2394,2446,2415,2397,2531,2315,2462,2342,2425,2441,2468,2434,2458,2468,2393,2490,2364,2434,2481,2521,2396,2365,2386,2437,2517,2419,2407,2420,2472,2378,2495,2498,2489,2456,2482,2542,2477,2445,2443,2428,2342,2490,2457,2447,2502,2392,2395,2432,2499,2505,2379,2459,2490,2412,2436,2386,2510,2397,2504,2487,2485,2434,2459,2456,2449,2392,2524,2378,2460,2434,2421,2409,2527,2492,2417,2495,2465,2464,2434,2413,2312,2462,2428,2393,2446,2446,2505,2464,2421,2423,2329,2390,2430,2435,2396,2410,2465,2405,2344,2461,2438,2434,2490,2454,2442,2499,2370,2359,2399,2411,2423,2440,2391,2342,2508,2497,2420,2441,2464,2358,2398,2430,2393,2475,2448,2384,2439,2488,2464,2319,2396,2362,2402,2418,2373,2475,2430,2357,2387,2481,2437,2368,2422,2409,2515,2401,2352,2463,2404,2533,2504,2370,2427,2535,2468,2374,2506,2420,2397,2408,2485,2397,2567,2459,2347,2548,2522,2502,2469,2507,2445,2392,2360,2379,2451,2439,2535,2455,2498,2513,2438,2594,2352,2485,2491,2506,2507,2420,2535,2420,2301,2511,2387,2459,2530,2382,2435,2455,2486,2462,2554,2479,2482,2415,2430,2496,2415,2491,2409,2440,2408,2458,2387,2496,2388,2438,2437,2386,2447,2462,2507,2417,2460,2489,2479,2505,2394,2420,2373,2417,2437,2442,2355,2498,2494,2371,2429,2464,2479,2377,2497,2408,2419,2438,2412,2376,2415,2370,2352,2573,2455,2459,2565,2397,2458,2361,2431,2380,2387,2469,2404,2426,2457,2431,2409,2392,2489,2467,2422,2486,2468,2480,2455,2457,2486,2456,2491,2362,2455,2460,2484,2435,2448,2556,2421,2450,2474,2446,2457,2449,2505,2490,2432,2473,2386,2449,2473,2511,2381,2415,2490,2420,2434,2477,2470,2486,2404,2520,2400,2455,2391,2423,2476,2428,2524,2398,2395,2390,2309,2355,2468,2482,2521,2464,2540,2423,2354,2362,2506,2435,2419,2406,2439,2417,2510,2422,2418,2420,2384,2513,2368,2387,2527,2517,2376,2447,2533,2421,2421,2447,2436,2507,2366,2408,2413,2401,2527,2423,2374,2496,2390,2480,2475,2327,2374,2364,2400,2556,2330,2531,2375,2418,2508,2354,2432,2374,2456,2468,2484,2514,2484,2460,2460,2452,2444,2401,2482,2452,2374,2507,2454,2451,2456,2359,2340,2504,2428,2438,2483,2482,2378,2481,2476,2506,2454,2387,2363,2428,2457,2512,2503,2410,2482,2477,2387,2478,2483,2403,2537,2468,2437,2442,2425,2373,2487,2469,2389,2469,2432,2500,2469,2444,2393,2522,2398,2516,2443,2411,2356,2457,2388,2434,2461,2456,2428,2431,2382,2497,2381,2503,2444,2434,2467,2367,2492,2463,2428,2440,2442,2447,2440,2440,2453,2482,2433,2365,2464,2357,2368,2473,2401,2462,2418,2433,2464,2510,2443,2452,2402,2457,2407,2495,2388,2452,2404,2439,2504,2479,2553,2435,2354,2362,2403,2412,2478,2389,2404,2471,2413,2560,2424,2484,2507,2360,2440,2358,2450,2487,2489,2504,2462,2514,2514,2460,2487,2467,2435,2315,2428,2498,2509,2520,2464,2498,2489,2398,2414,2498,2429,2372,2479,2440,2431,2485,2434,2408,2407,2470,2402,2424,2326,2414,2381,2404,2380,2438,2469,2409,2436,2428,2372,2534,2498,2480,2487,2372,2435,2435,2479,2447,2382,2426,2445,2410,2424,2478,2530,2468,2392,2414,2346,2347,2361,2456,2459,2465,2418,2432,2420,2320,2481,2473,2469,2407,2450,2441,2401,2358,2467,2474,2410,2422,2525,2382,2549,2422,2481,2553,2478,2421,2442,2435,2443,2375,2481,2434,2420,2427,2421,2446,2420,2443,2556,2471,2481,2440,2501,2450,2492,2482,2367,2392,2508,2473,2359,2453,2424,2398,2380,2420,2490,2473,2436,2465,2410,2293,2447,2445,2457,2447,2425,2459,2374,2380,2469,2414,2458,2443,2509,2418,2434,2444,2431,2360,2462,2441,2443,2466,2454,2444,2455,2395,2376,2456,2455,2394,2417,2458,2498,2474,2331,2419,2504,2501,2455,2422,2432,2464,2449,2454,2504,2408,2454,2380,2432,2510,2459,2403,2359,2331,2485,2407,2470,2380,2482,2461,2486,2472,2449,2387,2394,2410,2490,2464,2472,2459,2408,2484,2392,2465,2422,2362,2365,2497,2408,2380,2437,2337,2501,2484,2433,2486,2450,2425,2333,2486,2379,2454,2387,2416,2513,2467,2429,2480,2435,2473,2366,2443,2393,2452,2434,2446,2424,2403,2410,2439,2414,2483,2390,2428,2449,2467,2452,2420,2496,2499,2433,2407,2432,2441,2474,2579,2432,2514,2372,2425,2449,2467,2497,2457,2392,2414,2356,2387,2487,2498,2381,2421,2411,2386,2454,2522,2476,2468,2445,2524,2467,2382,2382,2418,2466,2549,2444,2461,2489,2430,2429,2372,2451,2417,2530,2381,2485,2424,2435,2393,2545,2312,2407,2358,2500,2460,2509,2453,2447,2483,2545,2483,2430,2479,2396,2443,2356,2371,2464,2514,2390,2432,2385,2530,2421,2531,2450,2549,2412,2385,2341,2337,2377,2432,2436,2489,2449,2434,2485,2385,2417,2368,2419,2441,2502,2441,2395,2372,2456,2417,2420,2512,2425,2460,2470,2434,2388,2399,2385,2355,2408,2358,2487,2483,2345,2453,2429,2403,2402,2392,2390,2471,2452,2411,2427,2459,2515,2426,2423,2512,2517,2415,2581,2484,2435,2395,2422,2526,2403,2366,2486,2431,2472,2430,2452,2472,2493,2397,2459,2447,2460,2409,2436,2420,2400,2416,2454,2389,2505,2378,2347,2419,2436,2473,2496,2446,2484,2490,2479,2490,2423,2458,2458,2515,2498,2496,2430,2440,2486,2425,2477,2469,2404,2412,2452,2412,2428,2493,2381,2455,2458,2324,2454,2534,2507,2462,2515,2457,2365,2425,2344,2424,2412,2449,2454,2410,2462,2542,2434,2496,2456,2402,2445,2478,2369,2585,2432,2402,2444,2433,2353,2409,2487,2478,2352,2479,2570,2431,2426,2455,2342,2365,2464,2504,2438,2529,2498,2410,2461,2464,2531,2427,2461,2428,2326,2404,2416,2395,2384,2389,2529,2469,2508,2445,2452,2491,2454,2464,2477,2455,2386,2459,2503,2451,2423,2379,2506,2492,2507,2488,2451,2530,2392,2438,2468,2438,2434,2397,2421,2468,2421,2473,2493,2434,2392,2490,2375,2472,2508,2453,2429,2401,2435,2419,2420,2445,2339,2418,2377,2536,2511,2509,2464,2487,2446,2472,2463,2396,2493,2457,2397,2442,2429,2418,2448,2462,2485,2504,2510,2386,2390,2453,2426,2412,2490,2431,2370,2425,2440,2414,2445,2480,2472,2493,2404,2435,2496,2451,2416,2412,2434,2441,2411,2395,2467,2455,2378,2478,2360,2410,2360,2505,2461,2426,2389,2381,2389,2417,2382,2503,2422,2494,2436,2372,2480,2389,2380,2503,2460,2474,2480,2418,2400,2370,2368,2374,2509,2423,2453,2476,2468,2433,2348,2416,2368,2454,2472,2464,2492,2422,2449,2404,2463,2473,2415,2451,2461,2428,2463,2477,2466,2406,2391,2434,2422,2454,2393,2409,2422,2462,2461,2465,2466,2372,2391,2485,2439,2435,2399,2433,2487,2454,2400,2440,2469,2472,2416,2398,2463,2461,2486,2461,2447,2496,2470,2413,2428,2483,2365,2410,2425,2403,2427,2533,2457,2435,2401,2419,2400,2478,2461,2448,2488,2437,2367,2415,2456,2474,2509,2524,2443,2440,2407,2515,2472,2448,2404,2424,2459,2446,2409,2435,2419,2455,2453,2467,2474,2411,2468,2380,2419,2378,2453,2430,2481,2452,2420,2393,2434,2410,2336,2343,2456,2430,2522,2509,2452,2393,2440,2524,2386,2516,2465,2496,2404,2442,2410,2397,2421,2386,2423,2388,2393,2434,2455,2431,2499,2465,2374,2443,2519,2452,2474,2481,2426,2398,2403,2380,2394,2384,2512,2436,2340,2480,2428,2409,2507,2399,2445,2406,2428,2451,2474,2393,2480,2413,2445,2430,2494,2429,2541,2478,2462,2363,2476,2506,2474,2393,2447,2504,2457,2542,2461,2409,2413,2455,2424,2463,2400,2491,2429,2394,2481,2521,2450,2496,2438,2420,2422,2439,2417,2484,2514,2421,2495,2409,2517,2412,2414,2472,2425,2422,2446,2453,2431,2425,2433,2481,2444,2452,2428,2486,2484,2469,2387,2492,2506,2462,2435,2424,2457,2471,2383,2424,2444,2431,2493,2460,2420,2504,2422,2459,2406,2403,2377,2453,2370,2461,2502,2482,2438,2367,2449,2548,2475,2400,2495,2439,2450,2463,2415,2455,2456,2346,2559,2415,2443,2484,2464,2416,2474,2497,2416,2412,2493,2479,2494,2366,2361,2378,2352,2385,2428,2372,2333,2423,2527,2285,2458,2466,2445,2479,2462,2457,2440,2521,2473,2394,2454,2453,2478,2456,2524,2468,2484,2307,2474,2502,2418,2525,2412,2355,2492,2449,2415,2466,2482,2443,2488,2461,2365,2499,2463,2512,2443,2442,2476,2473,2389,2408,2460,2406,2436,2497,2478,2475,2378,2466,2392,2440,2416,2392,2438,2457,2490,2562,2517,2409,2449,2463,2427,2445,2555,2377,2524,2362,2484,2446,2376,2403,2535,2459,2463,2415,2475,2475,2471,2430,2467,2308,2330,2489,2504,2417,2405,2461,2411,2478,2419,2468,2448,2447,2432,2450,2461,2376,2440,2352,2434,2452,2410,2424]},{"counters":[2493,2550,2410,2500,2348,2628,2490,2460,2499,2440,2469,2508,2420,2449,2448,2405,2498,2439,2352,2478,2461,2437,2508,2393,2433,2387,2432,2424,2420,2539,2309,2350,2410,2366,2506,2438,2449,2461,2483,2447,2564,2429,2375,2408,2509,2420,2402,2423,2522,2432,2449,2402,2400,2361,2435,2348,2470,2544,2485,2472,2339,2409,2422,2429,2422,2487,2424,2496,2463,2362,2479,2386,2518,2477,2426,2405,2442,2448,2455,2426,2417,2438,2512,2440,2393,2491,2408,2454,2476,2412,2544,2488,2464,2434,2466,2430,2402,2494,2443,2453,2381,2469,2489,2523,2440,2371,2434,2443,2431,2458,2482,2289,2385,2387,2506,2435,2504,2430,2401,2515,2337,2487,2480,2426,2542,2465,2390,2555,2353,2389,2409,2393,2420,2424,2375,2394,2471,2449,2497,2381,2382,2587,2390,2351,2535,2450,2473,2446,2432,2432,2362,2466,2476,2410,2396,2518,2427,2397,2405,2391,2344,2381,2494,2444,2433,2449,2498,2519,2420,2426,2479,2449,2416,2391,2413,2555,2404,2464,2420,2412,2334,2420,2383,2365,2487,2484,2504,2454,2547,2417,2509,2543,2368,2361,2516,2418,2361,2386,2526,2449,2460,2485,2481,2492,2377,2503,2441,2446,2475,2350,2514,2464,2493,2366,2460,2412,2411,2416,2439,2481,2406,2418,2449,2461,2469,2456,2439,2500,2430,2502,2437,2402,2472,2470,2501,2438,2368,2426,2432,2454,2415,2351,2470,2470,2462,2478,2451,2351,2488,2498,2458,2412,2414,2425,2486,2519,2426,2394,2497,2459,2465,2383,2382,2344,2431,2489,2422,2471,2460,2420,2447,2440,2364,2342,2451,2446,2508,2338,2437,2373,2445,2483,2429,2507,2367,2467,2477,2438,2475,2384,2423,2406,2539,2475,2476,2419,2385,2340,2347,2404,2471,2432,2452,2355,2489,2447,2339,2385,2425,2437,2329,2483,2526,2421,2379,2437,2414,2362,2495,2415,2476,2434,2447,2482,2422,2460,2436,2445,2391,2405,2316,2513,2444,2373,2551,2443,2383,2409,2401,2405,2464,2419,2420,2472,2441,2424,2391,2336,2356,2548,2491,2368,2431,2489,2429,2441,2447,2476,2480,2438,2373,2403,2448,2455,2452,2447,2345,2399,2528,2455,2431,2409,2476,2422,2332,2516,2445,2461,2432,2518,2483,2497,2508,2431,2326,2510,2541,2470,2393,2408,2395,2444,2476,2413,2492,2495,2493,2428,2503,2415,2474,2450,2396,2467,2550,2387,2458,2472,2410,2400,2401,2470,2392,2419,2462,2522,2421,2432,2452,2479,2434,2390,2407,2421,2325,2464,2467,2432,2447,2392,2412,2401,2326,2465,2365,2460,2443,2399,2385,2489,2492,2412,2430,2356,2450,2514,2385,2498,2414,2449,2362,2327,2423,2429,2425,2418,2370,2388,2427,2498,2414,2486,2399,2357,2465,2429,2364,2428,2403,2415,2387,2490,2429,2461,2432,2486,2459,2462,2456,2371,2413,2473,2520,2448,2432,2461,2451,2384,2478,2460,2485,2486,2437,2459,2419,2442,2478,2449,2453,2448,2476,2361,2394,2399,2383,2500,2381,2464,2484,2321,2412,2516,2492,2409,2449,2447,2527,2434,2449,2421,2460,2460,2483,2494,2445,2461,2466,2465,2473,2394,2525,2415,2404,2368,2500,2463,2424,2479,2372,2370,2479,2463,2465,2511,2438,2359,2406,2438,2429,2498,2486,2420,2404,2497,2460,2467,2401,2525,2496,2467,2478,2506,2438,2417,2454,2490,2444,2402,2368,2474,2421,2418,2433,2502,2460,2461,2410,2529,2535,2431,2372,2406,2505,2483,2454,2396,2402,2366,2525,2494,2409,2372,2451,2361,2451,2407,2349,2399,2415,2475,2508,2567,2519,2448,2387,2373,2427,2425,2445,2300,2486,2471,2450,2469,2439,2417,2453,2455,2426,2468,2437,2439,2392,2437,2417,2470,2437,2439,2423,2378,2488,2369,2453,2461,2386,2442,2456,2567,2385,2438,2374,2394,2508,2432,2507,2409,2426,2526,2436,2472,2465,2447,2472,2476,2400,2472,2463,2457,2560,2433,2487,2443,2422,2482,2402,2463,2400,2571,2392,2406,2502,2481,2461,2451,2448,2389,2506,2472,2458,2501,2408,2542,2485,2399,2452,2378,2371,2457,2487,2516,2410,2350,2427,2394,2483,2429,2408,2500,2397,2402,2402,2432,2456,2420,2493,2409,2490,2486,2396,2445,2455,2483,2465,2438,2457,2420,2349,2463,2512,2412,2440,2442,2461,2443,2486,2481,2377,2482,2474,2414,2525,2478,2395,2512,2435,2475,2449,2454,2361,2483,2425,2554,2454,2382,2563,2427,2409,2394,2466,2393,2439,2468,2451,2395,2432,2420,2412,2417,2422,2410,2434,2472,2384,2428,2454,2434,2394,2450,2368,2430,2448,2529,2383,2374,2402,2433,2451,2417,2535,2429,2411,2371,2347,2514,2462,2413,2453,2445,2491,2449,2334,2424,2414,2358,2526,2395,2465,2468,2446,2488,2428,2432,2459,2487,2512,2400,2391,2440,2403,2391,2457,2441,2441,2411,2486,2493,2442,2498,2466,2534,2462,2517,2423,2463,2412,2496,2453,2445,2358,2382,2472,2427,2520,2446,2413,2393,2443,2487,2442,2503,2386,2471,2408,2402,2372,2401,2450,2363,2363,2428,2512,2515,2422,2583,2391,2405,2420,2445,2477,2428,2441,2389,2412,2440,2387,2504,2521,2401,2346,2439,2528,2408,2507,2437,2468,2494,2560,2430,2528,2428,2374,2401,2522,2504,2411,2486,2464,2414,2512,2466,2361,2471,2459,2426,2423,2500,2501,2443,2392,2367,2462,2492,2338,2374,2439,2424,2406,2448,2431,2443,2408,2588,2403,2409,2502,2389,2449,2454,2367,2467,2410,2434,2542,2505,2447,2526,2449,2386,2447,2465,2504,2500,2478,2386,2495,2383,2338,2429,2451,2446,2413,2433,2426,2432,2448,2417,2404,2565,2440,2414,2474,2477,2388,2369,2356,2449,2392,2364,2447,2440,2489,2497,2404,2446,2450,2390,2390,2419,2416,2391,2380,2446,2478,2457,2465,2465,2380,2414,2451,2430,2422,2444,2515,2447,2384,2536,2352,2538,2367,2460,2424,2522,2456,2410,2451,2445,2521,2429,2466,2495,2463,2458,2410,2455,2504,2386,2402,2449,2497,2505,2473,2432,2374,2423,2438,2473,2420,2537,2400,2402,2428,2487,2446,2407,2423,2506,2391,2412,2468,2444,2496,2472,2342,2421,2466,2458,2402,2437,2415,2411,2519,2403,2471,2386,2375,2403,2427,2425,2514,2391,2502,2425,2402,2461,2518,2355,2320,2396,2397,2454,2509,2442,2388,2406,2440,2540,2372,2392,2500,2344,2526,2518,2392,2490,2423,2351,2425,2306,2497,2470,2463,2468,2452,2350,2502,2448,2400,2497,2420,2435,2395,2501,2488,2404,2475,2463,2382,2449,2428,2481,2563,2465,2413,2441,2474,2496,2412,2466,2458,2456,2438,2398,2379,2414,2539,2420,2446,2546,2372,2461,2487,2441,2453,2529,2505,2462,2492,2440,2471,2478,2389,2420,2440,2498,2533,2403,2343,2422,2404,2419,2460,2403,2452,2439,2511,2369,2497,2394,2436,2509,2382,2387,2427,2386,2472,2448,2397,2460,2450,2457,2461,2394,2477,2504,2598,2422,2435,2492,2408,2442,2420,2451,2477,2350,2374,2450,2462,2465,2376,2447,2405,2452,2390,2536,2303,2342,2345,2487,2449,2446,2430,2348,2318,2459,2457,2454,2518,2467,2420,2420,2530,2442,2435,2527,2394,2469,2436,2410,2442,2414,2429,2467,2473,2457,2409,2440,2500,2415,2458,2464,2454,2477,2471,2403,2460,2433,2524,2473,2371,2432,2483,2437,2396,2481,2405,2352,2452,2464,2457,2455,2417,2398,2467,2401,2444,2441,2490,2451,2474,2413,2374,2422,2444,2484,2459,2467,2533,2490,2445,2453,2457,2443,2396,2418,2469,2398,2429,2452,2377,2435,2451,2440,2510,2468,2431,2513,2497,2459,2388,2487,2498,2409,2493,2525,2491,2468,2458,2454,2536,2458,2479,2391,2480,2382,2396,2521,2431,2449,2468,2383,2430,2326,2480,2434,2395,2476,2460,2414,2534,2394,2474,2505,2503,2344,2335,2386,2541,2418,2450,2407,2387,2536,2495,2479,2531,2528,2362,2502,2462,2473,2578,2414,2398,2475,2302,2388,2392,2515,2399,2342,2482,2470,2447,2437,2413,2352,2540,2408,2418,2463,2400,2449,2404,2432,2381,2434,2473,2450,2359,2574,2448,2453,2441,2436,2363,2396,2400,2437,2387,2443,2444,2429,2432,2423,2493,2411,2483,2379,2456,2473,2384,2431,2352,2426,2427,2468,2462,2432,2423,2435,2465,2372,2410,2383,2545,2538,2444,2453,2411,2403,2491,2499,2456,2368,2514,2453,2373,2531,2390,2425,2446,2445,2458,2370,2400,2411,2436,2425,2457,2437,2420,2478,2440,2451,2494,2366,2464,2470,2507,2348,2389,2520,2343,2513,2458,2394,2463,2448,2409,2479,2368,2487,2381,2403,2367,2497,2456,2431,2465,2380,2379,2463,2485,2411,2410,2430,2445,2463,2392,2407,2523,2352,2490,2422,2467,2411,2465,2464,2429,2379,2426,2422,2483,2459,2436,2487,2466,2339,2453,2443,2418,2419,2411,2495,2482,2365,2469,2395,2463,2463,2507,2436,2418,2466,2355,2433,2525,2469,2476,2458,2432,2412,2493,2461,2508,2434,2496,2375,2474,2379,2387,2452,2394,2489,2349,2441,2537,2496,2383,2420,2453,2494,2427,2486,2448,2468,2543,2411,2406,2494,2512,2523,2428,2485,2368,2527,2473,2346,2407,2473,2433,2413,2431,2478,2376,2385,2478,2364,2380,2470,2328,2447,2523,2378,2519,2423,2387,2485,2456,2411,2441,2491,2450,2435,2458,2444,2433,2471,2504,2456,2433,2508,2419,2377,2449,2457,2497,2499,2517,2469,2457,2437,2355,2296,2461,2361,2506,2529,2463,2429,2468,2435,2472,2467,2485,2558,2395,2396,2458,2362,2497,2434,2435,2420,2534,2423,2463,2553,2451,2508,2437,2426,2476,2465,2486,2414,2438,2397,2453,2370,2385,2426,2495,2424,2524,2472,2508,2417,2435,2513,2455,2480,2419,2490,2501,2421,2462,2450,2416,2447,2476,2378,2443,2367,2384,2386,2465,2413,2518,2417,2390,2377,2479,2480,2480,2513,2438,2465,2369,2426,2419,2436,2449,2402,2465,2447,2424,2412,2382,2434,2457,2512,2320,2505,2433,2365,2349,2455,2470,2443,2448,2317,2511,2464,2420,2453,2414,2468,2420,2404,2464,2447,2414,2473,2486,2449,2458,2424,2457,2471,2471,2544,2406,2482,2437,2406,2369,2416,2406,2479,2437,2425,2486,2448,2515,2442,2454,2438,2416,2430,2392,2473,2434,2416,2357,2495,2420,2436,2386,2486,2372,2441,2390,2499,2441,2361,2491,2444,2435,2432,2471,2484,2422,2486,2375,2442,2399,2507,2484,2493,2450,2426,2459,2435,2465,2507,2412,2434,2398,2358,2469,2444,2436,2467,2465,2523,2435,2427,2573,2390,2520,2431,2410,2376,2439,2530,2344,2466,2437,2421,2422,2485,2385,2364,2431,2400,2372,2431,2424,2380,2523,2485,2474,2383,2395,2484,2471,2502,2451,2397,2494,2468,2466,2454,2399,2461,2429,2494,2515,2436,2509,2496,2474,2438,2455,2488,2524,2533,2430,2417,2459,2536,2446,2412,2499,2446,2366,2351,2441,2433,2470,2328,2376,2411,2432,2451,2470,2428,2396,2488,2435,2389,2446,2459,2384,2477,2402,2359,2435,2494,2447,2380,2470,2393,2443,2448,2480,2515,2454,2472,2465,2461,2425,2494,2413,2449,2496,2456,2439,2433,2421,2428,2454,2513,2458,2446,2460,2496,2371,2502,2381,2433,2455,2460,2457,2512,2467,2440,2418,2396,2494,2479,2477,2413,2394,2427,2528,2469,2395,2416,2512,2369,2401,2407,2473,2476,2489,2428,2515,2465,2448,2445,2398,2400,2401,2481,2434,2484,2390,2477,2452,2357,2486,2463,2433,2431,2412,2532,2437,2432,2415,2423,2456,2459,2386,2447,2479,2501,2344,2375,2418,2477,2458,2437,2420,2466,2383,2366,2375,2394,2352,2457,2432,2483,2551,2416,2377,2425,2407,2491,2470,2351,2382,2327,2402,2367,2428,2389,2487,2463,2422,2456,2464,2398,2473,2432,2432,2481,2499,2454,2441,2443,2406,2432,2409,2556,2379,2508,2413,2425,2428,2451,2335,2435,2332,2484,2471,2398,2354,2506,2429,2466,2433,2336,2424,2457,2446,2449,2447,2382,2432,2509,2376,2474,2424,2484,2531,2464,2473,2450,2402,2469,2530,2454,2390,2456,2435,2420,2377,2436,2434,2405,2462,2502,2472,2525,2490,2417,2471,2433,2541,2470,2406,2417,2386,2457,2432,2439]},{"counters":[2513,2452,2410,2496,2548,2402,2369,2453,2476,2500,2502,2399,2461,2418,2426,2465,2432,2502,2404,2440,2476,2535,2465,2430,2421,2508,2369,2458,2525,2468,2427,2378,2489,2436,2419,2478,2363,2370,2424,2481,2476,2495,2467,2426,2419,2507,2491,2405,2545,2519,2435,2488,2480,2458,2494,2419,2478,2380,2400,2495,2546,2477,2541,2381,2358,2411,2443,2518,2398,2415,2422,2532,2494,2440,2460,2457,2468,2461,2495,2407,2471,2471,2419,2416,2519,2519,2334,2441,2430,2486,2410,2423,2447,2409,2401,2372,2519,2431,2503,2429,2494,2446,2394,2479,2364,2502,2420,2459,2419,2475,2374,2461,2494,2405,2429,2448,2438,2470,2527,2404,2510,2436,2388,2420,2456,2408,2392,2494,2378,2389,2497,2456,2401,2454,2461,2394,2469,2414,2457,2495,2461,2487,2494,2442,2425,2444,2484,2409,2430,2358,2451,2404,2465,2459,2426,2494,2384,2440,2409,2419,2412,2434,2437,2410,2404,2431,2504,2488,2473,2380,2459,2393,2452,2527,2455,2443,2486,2396,2415,2414,2431,2486,2373,2378,2538,2431,2471,2414,2409,2440,2418,2498,2451,2474,2483,2432,2463,2471,2430,2488,2466,2368,2470,2478,2535,2375,2454,2471,2529,2549,2462,2437,2425,2414,2420,2555,2452,2419,2340,2449,2520,2425,2480,2406,2433,2438,2421,2393,2528,2469,2447,2559,2448,2417,2471,2415,2469,2475,2320,2418,2491,2465,2412,2424,2442,2548,2544,2426,2383,2489,2393,2517,2437,2452,2525,2500,2521,2423,2474,2485,2392,2499,2406,2470,2491,2380,2401,2428,2469,2471,2412,2392,2439,2422,2413,2533,2407,2503,2423,2475,2404,2474,2360,2435,2449,2431,2466,2316,2411,2427,2508,2326,2499,2403,2353,2375,2433,2428,2353,2532,2416,2385,2492,2436,2436,2407,2417,2467,2426,2428,2497,2394,2432,2463,2416,2391,2415,2412,2515,2448,2394,2374,2372,2455,2406,2419,2542,2493,2369,2450,2512,2506,2355,2346,2394,2543,2391,2463,2407,2514,2404,2397,2405,2391,2361,2392,2392,2477,2482,2438,2426,2503,2377,2453,2373,2435,2401,2429,2504,2384,2440,2464,2404,2333,2385,2424,2415,2471,2428,2420,2475,2397,2360,2434,2372,2444,2498,2417,2397,2367,2396,2529,2439,2510,2497,2387,2320,2413,2524,2496,2445,2417,2424,2445,2441,2512,2468,2381,2509,2493,2406,2439,2439,2456,2421,2492,2389,2390,2507,2443,2409,2333,2470,2423,2402,2484,2411,2442,2399,2487,2478,2476,2426,2398,2427,2460,2442,2438,2447,2482,2403,2458,2423,2490,2416,2419,2359,2396,2482,2426,2462,2463,2465,2483,2435,2351,2513,2387,2538,2400,2392,2537,2428,2543,2450,2509,2561,2444,2406,2440,2543,2427,2550,2500,2333,2427,2562,2443,2472,2430,2368,2376,2441,2400,2424,2382,2525,2403,2431,2483,2545,2471,2340,2436,2539,2353,2569,2453,2491,2425,2421,2404,2485,2521,2429,2375,2466,2500,2384,2415,2395,2385,2493,2383,2419,2461,2323,2399,2395,2483,2441,2449,2487,2480,2465,2409,2332,2504,2602,2470,2383,2421,2488,2515,2469,2438,2478,2466,2424,2365,2467,2448,2430,2458,2509,2345,2384,2485,2408,2472,2448,2485,2557,2483,2483,2388,2446,2493,2482,2472,2450,2497,2467,2512,2448,2448,2410,2360,2426,2405,2503,2401,2428,2444,2433,2434,2445,2421,2417,2409,2540,2518,2432,2447,2471,2517,2412,2503,2452,2354,2424,2415,2478,2461,2428,2548,2501,2320,2473,2426,2363,2481,2423,2435,2416,2444,2461,2507,2495,2466,2482,2426,2415,2413,2409,2421,2434,2429,2448,2452,2390,2396,2490,2408,2419,2468,2471,2381,2447,2477,2406,2403,2468,2433,2388,2509,2376,2506,2466,2372,2450,2543,2475,2443,2443,2416,2410,2446,2381,2466,2385,2521,2426,2451,2541,2371,2390,2520,2372,2446,2409,2429,2466,2517,2359,2458,2412,2413,2379,2446,2420,2419,2392,2376,2446,2447,2463,2368,2387,2535,2448,2464,2386,2420,2344,2553,2504,2533,2416,2441,2390,2504,2467,2377,2462,2441,2445,2424,2404,2526,2511,2413,2388,2419,2510,2441,2500,2492,2483,2403,2378,2448,2439,2477,2401,2371,2431,2412,2466,2443,2468,2361,2439,2335,2490,2432,2388,2373,2435,2424,2492,2385,2398,2433,2432,2377,2423,2398,2512,2422,2480,2438,2391,2410,2497,2469,2376,2352,2416,2430,2459,2456,2383,2342,2391,2485,2332,2485,2363,2480,2482,2384,2498,2406,2411,2450,2497,2422,2458,2419,2434,2422,2486,2452,2431,2409,2471,2512,2453,2445,2408,2477,2468,2397,2479,2500,2547,2455,2402,2461,2374,2457,2471,2439,2365,2357,2379,2358,2448,2432,2412,2495,2372,2489,2517,2380,2472,2420,2430,2369,2403,2408,2478,2357,2498,2472,2399,2409,2515,2374,2470,2516,2547,2465,2483,2386,2441,2444,2431,2414,2417,2528,2386,2441,2384,2440,2471,2377,2464,2476,2510,2491,2450,2445,2468,2396,2493,2503,2520,2455,2427,2469,2513,2427,2461,2482,2443,2445,2450,2444,2445,2447,2439,2452,2376,2473,2473,2430,2451,2425,2514,2451,2455,2513,2458,2354,2317,2421,2404,2418,2466,2481,2444,2506,2526,2396,2324,2453,2373,2524,2401,2369,2509,2462,2468,2471,2403,2466,2490,2480,2410,2432,2485,2474,2404,2369,2412,2459,2462,2381,2447,2495,2386,2444,2450,2436,2397,2500,2408,2478,2487,2370,2468,2405,2357,2484,2460,2494,2428,2485,2352,2427,2469,2352,2552,2460,2509,2458,2476,2420,2443,2496,2474,2442,2450,2340,2435,2452,2411,2408,2430,2453,2416,2547,2497,2394,2418,2460,2392,2331,2394,2431,2391,2463,2420,2449,2401,2408,2388,2419,2499,2426,2402,2539,2409,2420,2406,2418,2474,2488,2469,2451,2434,2389,2424,2321,2533,2460,2444,2403,2398,2473,2461,2448,2356,2396,2451,2498,2442,2348,2502,2567,2468,2387,2360,2450,2415,2423,2406,2424,2371,2424,2419,2404,2393,2471,2472,2430,2470,2359,2456,2479,2436,2411,2517,2411,2433,2548,2434,2521,2439,2473,2452,2447,2428,2457,2461,2401,2433,2433,2422,2418,2407,2428,2342,2524,2446,2504,2393,2470,2377,2433,2514,2392,2416,2429,2437,2428,2411,2430,2412,2429,2431,2559,2495,2398,2344,2386,2398,2559,2455,2361,2407,2406,2467,2423,2403,2422,2489,2461,2393,2447,2440,2448,2485,2452,2463,2479,2453,2374,2463,2405,2378,2479,2370,2483,2532,2462,2431,2509,2460,2375,2437,2509,2500,2463,2425,2445,2521,2504,2413,2426,2480,2398,2392,2447,2437,2374,2463,2437,2503,2409,2491,2457,2449,2333,2449,2511,2420,2503,2410,2445,2388,2417,2439,2376,2377,2488,2421,2342,2417,2428,2373,2392,2430,2471,2467,2460,2444,2377,2476,2490,2431,2374,2451,2417,2414,2498,2467,2506,2456,2409,2457,2389,2470,2437,2448,2437,2434,2551,2400,2442,2458,2373,2462,2487,2410,2529,2498,2363,2440,2433,2451,2415,2416,2477,2489,2364,2444,2463,2486,2403,2369,2472,2439,2416,2456,2395,2444,2455,2471,2417,2393,2359,2362,2368,2528,2390,2423,2357,2407,2436,2431,2419,2419,2328,2351,2522,2417,2502,2527,2399,2452,2375,2399,2488,2555,2433,2443,2431,2389,2425,2448,2443,2497,2442,2432,2435,2426,2505,2535,2436,2376,2384,2411,2423,2481,2437,2375,2421,2464,2469,2408,2467,2422,2452,2414,2339,2389,2472,2420,2463,2417,2517,2426,2468,2444,2438,2426,2387,2400,2457,2455,2453,2467,2427,2403,2455,2344,2437,2502,2467,2480,2449,2400,2382,2426,2389,2439,2420,2468,2443,2372,2433,2465,2429,2495,2472,2485,2442,2456,2420,2523,2422,2433,2370,2375,2508,2418,2378,2481,2435,2519,2380,2480,2454,2388,2452,2472,2369,2416,2444,2445,2420,2505,2430,2443,2378,2486,2364,2482,2387,2464,2448,2430,2399,2526,2535,2497,2421,2508,2477,2437,2468,2576,2439,2468,2506,2400,2492,2446,2432,2507,2396,2373,2503,2509,2426,2486,2411,2356,2403,2419,2340,2390,2445,2429,2481,2408,2435,2436,2411,2471,2383,2385,2535,2489,2422,2423,2441,2482,2332,2432,2428,2401,2484,2462,2407,2411,2420,2510,2419,2370,2535,2407,2465,2490,2400,2438,2405,2483,2401,2370,2475,2481,2510,2356,2416,2462,2444,2384,2405,2493,2398,2401,2413,2428,2478,2444,2410,2461,2445,2484,2375,2405,2438,2453,2379,2367,2445,2418,2393,2515,2356,2452,2519,2493,2465,2445,2435,2544,2431,2447,2479,2332,2385,2435,2429,2434,2456,2356,2480,2494,2394,2564,2413,2393,2470,2373,2411,2425,2418,2387,2520,2451,2456,2478,2531,2449,2482,2524,2478,2459,2496,2432,2461,2412,2440,2485,2452,2381,2364,2447,2403,2459,2464,2372,2467,2532,2427,2453,2418,2449,2454,2443,2459,2409,2444,2425,2481,2450,2551,2442,2499,2370,2365,2451,2463,2297,2393,2491,2570,2482,2522,2492,2402,2403,2431,2497,2414,2387,2441,2466,2597,2431,2459,2423,2524,2426,2362,2548,2426,2472,2395,2427,2353,2391,2495,2456,2405,2500,2416,2445,2468,2471,2427,2509,2445,2467,2330,2482,2434,2413,2367,2511,2475,2421,2508,2477,2394,2507,2518,2491,2401,2449,2509,2375,2366,2487,2438,2465,2362,2424,2377,2389,2429,2481,2495,2478,2446,2414,2502,2434,2427,2450,2355,2483,2479,2522,2464,2348,2411,2466,2384,2336,2503,2462,2403,2489,2487,2486,2456,2382,2518,2391,2524,2431,2411,2486,2406,2489,2485,2429,2455,2482,2393,2442,2390,2454,2515,2478,2469,2435,2460,2417,2423,2370,2457,2477,2382,2421,2494,2446,2356,2459,2454,2356,2449,2491,2436,2404,2418,2458,2397,2305,2492,2491,2487,2414,2450,2388,2466,2470,2458,2402,2438,2418,2488,2423,2487,2342,2442,2438,2427,2377,2444,2468,2450,2454,2383,2383,2413,2493,2456,2433,2420,2426,2523,2417,2495,2412,2390,2450,2429,2501,2420,2465,2400,2386,2372,2430,2408,2444,2418,2431,2500,2426,2451,2500,2493,2409,2409,2432,2446,2435,2432,2380,2366,2460,2451,2455,2454,2507,2364,2396,2467,2466,2501,2490,2529,2441,2387,2462,2500,2453,2420,2511,2438,2435,2374,2502,2400,2560,2463,2429,2431,2500,2421,2466,2420,2450,2377,2500,2395,2487,2548,2558,2476,2418,2470,2376,2433,2356,2470,2537,2508,2413,2416,2413,2431,2399,2440,2518,2546,2383,2398,2553,2361,2324,2416,2430,2359,2427,2425,2389,2372,2432,2361,2480,2499,2405,2482,2427,2464,2390,2325,2409,2493,2408,2513,2375,2450,2464,2470,2474,2429,2378,2402,2373,2434,2415,2470,2512,2415,2485,2445,2444,2449,2494,2455,2450,2450,2426,2480,2459,2504,2395,2493,2415,2434,2415,2424,2409,2521,2503,2420,2493,2352,2462,2459,2409,2466,2461,2401,2438,2497,2356,2473,2461,2452,2359,2395,2481,2452,2407,2541,2445,2441,2408,2451,2412,2420,2418,2433,2406,2395,2387,2400,2409,2491,2479,2442,2348,2511,2406,2468,2463,2529,2545,2465,2460,2449,2464,2428,2423,2411,2425,2338,2444,2467,2462,2405,2466,2397,2417,2389,2406,2497,2392,2448,2413,2458,2472,2411,2457,2394,2500,2460,2384,2411,2497,2479,2418,2451,2627,2458,2477,2437,2509,2377,2395,2336,2362,2434,2476,2576,2502,2468,2534,2527,2464,2422,2394,2528,2314,2409,2457,2462,2439,2406,2490,2460,2480,2557,2432,2468,2446,2376,2454,2540,2443,2473,2486,2474,2479,2384,2369,2440,2401,2443,2485,2556,2492,2391,2455,2405,2362,2452,2416,2416,2405,2376,2457,2464,2374,2387,2445,2497,2454,2485,2448,2437,2414,2442,2402,2394,2484,2410,2455,2475,2433,2398,2343,2403,2408,2420,2421,2465,2403,2436,2424,2561,2503,2387,2462,2519,2451,2463,2405,2462,2292,2474,2509,2398,2421,2443,2414,2540,2457,2502,2449,2462,2519,2395,2417,2505,2487,2478,2404,2473,2430,2342,2456,2417,2415,2499,2391,2390,2430,2497,2443,2440,2507,2481,2484,2432,2340,2476,2547,2471,2439,2500,2341,2482,2516,2461,2427,2407,2296,2450,2531,2422,2493,2408,2437,2424,2411,2468]}],"default_value":0},"null_count":0,"tot_col_size":0,"last_update_version":410676693272625152,"correlation":0},"tc":{"histogram":{"ndv":5000000,"buckets":[{"count":32768,"lower_bound":"A4AAAAAAAAAB","upper_bound":"A4AAAAAAAIAA","repeats":1},{"count":65536,"lower_bound":"A4AAAAAAAIAB","upper_bound":"A4AAAAAAAQAA","repeats":1},{"count":98304,"lower_bound":"A4AAAAAAAQAB","upper_bound":"A4AAAAAAAYAA","repeats":1},{"count":131072,"lower_bound":"A4AAAAAAAYAB","upper_bound":"A4AAAAAAAgAA","repeats":1},{"count":163840,"lower_bound":"A4AAAAAAAgAB","upper_bound":"A4AAAAAAAoAA","repeats":1},{"count":196608,"lower_bound":"A4AAAAAAAoAB","upper_bound":"A4AAAAAAAwAA","repeats":1},{"count":229376,"lower_bound":"A4AAAAAAAwAB","upper_bound":"A4AAAAAAA4AA","repeats":1},{"count":262144,"lower_bound":"A4AAAAAAA4AB","upper_bound":"A4AAAAAABAAA","repeats":1},{"count":294912,"lower_bound":"A4AAAAAABAAB","upper_bound":"A4AAAAAABIAA","repeats":1},{"count":327680,"lower_bound":"A4AAAAAABIAB","upper_bound":"A4AAAAAABQAA","repeats":1},{"count":360448,"lower_bound":"A4AAAAAABQAB","upper_bound":"A4AAAAAABYAA","repeats":1},{"count":393216,"lower_bound":"A4AAAAAABYAB","upper_bound":"A4AAAAAABgAA","repeats":1},{"count":425984,"lower_bound":"A4AAAAAABgAB","upper_bound":"A4AAAAAABoAA","repeats":1},{"count":458752,"lower_bound":"A4AAAAAABoAB","upper_bound":"A4AAAAAABwAA","repeats":1},{"count":491520,"lower_bound":"A4AAAAAABwAB","upper_bound":"A4AAAAAAB4AA","repeats":1},{"count":524288,"lower_bound":"A4AAAAAAB4AB","upper_bound":"A4AAAAAACAAA","repeats":1},{"count":557056,"lower_bound":"A4AAAAAACAAB","upper_bound":"A4AAAAAACIAA","repeats":1},{"count":589824,"lower_bound":"A4AAAAAACIAB","upper_bound":"A4AAAAAACQAA","repeats":1},{"count":622592,"lower_bound":"A4AAAAAACQAB","upper_bound":"A4AAAAAACYAA","repeats":1},{"count":655360,"lower_bound":"A4AAAAAACYAB","upper_bound":"A4AAAAAACgAA","repeats":1},{"count":688128,"lower_bound":"A4AAAAAACgAB","upper_bound":"A4AAAAAACoAA","repeats":1},{"count":720896,"lower_bound":"A4AAAAAACoAB","upper_bound":"A4AAAAAACwAA","repeats":1},{"count":753664,"lower_bound":"A4AAAAAACwAB","upper_bound":"A4AAAAAAC4AA","repeats":1},{"count":786432,"lower_bound":"A4AAAAAAC4AB","upper_bound":"A4AAAAAADAAA","repeats":1},{"count":819200,"lower_bound":"A4AAAAAADAAB","upper_bound":"A4AAAAAADIAA","repeats":1},{"count":851968,"lower_bound":"A4AAAAAADIAB","upper_bound":"A4AAAAAADQAA","repeats":1},{"count":884736,"lower_bound":"A4AAAAAADQAB","upper_bound":"A4AAAAAADYAA","repeats":1},{"count":917504,"lower_bound":"A4AAAAAADYAB","upper_bound":"A4AAAAAADgAA","repeats":1},{"count":950272,"lower_bound":"A4AAAAAADgAB","upper_bound":"A4AAAAAADoAA","repeats":1},{"count":983040,"lower_bound":"A4AAAAAADoAB","upper_bound":"A4AAAAAADwAA","repeats":1},{"count":1015808,"lower_bound":"A4AAAAAADwAB","upper_bound":"A4AAAAAAD4AA","repeats":1},{"count":1048576,"lower_bound":"A4AAAAAAD4AB","upper_bound":"A4AAAAAAEAAA","repeats":1},{"count":1081344,"lower_bound":"A4AAAAAAEAAB","upper_bound":"A4AAAAAAEIAA","repeats":1},{"count":1114112,"lower_bound":"A4AAAAAAEIAB","upper_bound":"A4AAAAAAEQAA","repeats":1},{"count":1146880,"lower_bound":"A4AAAAAAEQAB","upper_bound":"A4AAAAAAEYAA","repeats":1},{"count":1179648,"lower_bound":"A4AAAAAAEYAB","upper_bound":"A4AAAAAAEgAA","repeats":1},{"count":1212416,"lower_bound":"A4AAAAAAEgAB","upper_bound":"A4AAAAAAEoAA","repeats":1},{"count":1245184,"lower_bound":"A4AAAAAAEoAB","upper_bound":"A4AAAAAAEwAA","repeats":1},{"count":1277952,"lower_bound":"A4AAAAAAEwAB","upper_bound":"A4AAAAAAE4AA","repeats":1},{"count":1310720,"lower_bound":"A4AAAAAAE4AB","upper_bound":"A4AAAAAAFAAA","repeats":1},{"count":1343488,"lower_bound":"A4AAAAAAFAAB","upper_bound":"A4AAAAAAFIAA","repeats":1},{"count":1376256,"lower_bound":"A4AAAAAAFIAB","upper_bound":"A4AAAAAAFQAA","repeats":1},{"count":1409024,"lower_bound":"A4AAAAAAFQAB","upper_bound":"A4AAAAAAFYAA","repeats":1},{"count":1441792,"lower_bound":"A4AAAAAAFYAB","upper_bound":"A4AAAAAAFgAA","repeats":1},{"count":1474560,"lower_bound":"A4AAAAAAFgAB","upper_bound":"A4AAAAAAFoAA","repeats":1},{"count":1507328,"lower_bound":"A4AAAAAAFoAB","upper_bound":"A4AAAAAAFwAA","repeats":1},{"count":1540096,"lower_bound":"A4AAAAAAFwAB","upper_bound":"A4AAAAAAF4AA","repeats":1},{"count":1572864,"lower_bound":"A4AAAAAAF4AB","upper_bound":"A4AAAAAAGAAA","repeats":1},{"count":1605632,"lower_bound":"A4AAAAAAGAAB","upper_bound":"A4AAAAAAGIAA","repeats":1},{"count":1638400,"lower_bound":"A4AAAAAAGIAB","upper_bound":"A4AAAAAAGQAA","repeats":1},{"count":1671168,"lower_bound":"A4AAAAAAGQAB","upper_bound":"A4AAAAAAGYAA","repeats":1},{"count":1703936,"lower_bound":"A4AAAAAAGYAB","upper_bound":"A4AAAAAAGgAA","repeats":1},{"count":1736704,"lower_bound":"A4AAAAAAGgAB","upper_bound":"A4AAAAAAGoAA","repeats":1},{"count":1769472,"lower_bound":"A4AAAAAAGoAB","upper_bound":"A4AAAAAAGwAA","repeats":1},{"count":1802240,"lower_bound":"A4AAAAAAGwAB","upper_bound":"A4AAAAAAG4AA","repeats":1},{"count":1835008,"lower_bound":"A4AAAAAAG4AB","upper_bound":"A4AAAAAAHAAA","repeats":1},{"count":1867776,"lower_bound":"A4AAAAAAHAAB","upper_bound":"A4AAAAAAHIAA","repeats":1},{"count":1900544,"lower_bound":"A4AAAAAAHIAB","upper_bound":"A4AAAAAAHQAA","repeats":1},{"count":1933312,"lower_bound":"A4AAAAAAHQAB","upper_bound":"A4AAAAAAHYAA","repeats":1},{"count":1966080,"lower_bound":"A4AAAAAAHYAB","upper_bound":"A4AAAAAAHgAA","repeats":1},{"count":1998848,"lower_bound":"A4AAAAAAHgAB","upper_bound":"A4AAAAAAHoAA","repeats":1},{"count":2031616,"lower_bound":"A4AAAAAAHoAB","upper_bound":"A4AAAAAAHwAA","repeats":1},{"count":2064384,"lower_bound":"A4AAAAAAHwAB","upper_bound":"A4AAAAAAH4AA","repeats":1},{"count":2097152,"lower_bound":"A4AAAAAAH4AB","upper_bound":"A4AAAAAAIAAA","repeats":1},{"count":2129920,"lower_bound":"A4AAAAAAIAAB","upper_bound":"A4AAAAAAIIAA","repeats":1},{"count":2162688,"lower_bound":"A4AAAAAAIIAB","upper_bound":"A4AAAAAAIQAA","repeats":1},{"count":2195456,"lower_bound":"A4AAAAAAIQAB","upper_bound":"A4AAAAAAIYAA","repeats":1},{"count":2228224,"lower_bound":"A4AAAAAAIYAB","upper_bound":"A4AAAAAAIgAA","repeats":1},{"count":2260992,"lower_bound":"A4AAAAAAIgAB","upper_bound":"A4AAAAAAIoAA","repeats":1},{"count":2293760,"lower_bound":"A4AAAAAAIoAB","upper_bound":"A4AAAAAAIwAA","repeats":1},{"count":2326528,"lower_bound":"A4AAAAAAIwAB","upper_bound":"A4AAAAAAI4AA","repeats":1},{"count":2359296,"lower_bound":"A4AAAAAAI4AB","upper_bound":"A4AAAAAAJAAA","repeats":1},{"count":2392064,"lower_bound":"A4AAAAAAJAAB","upper_bound":"A4AAAAAAJIAA","repeats":1},{"count":2424832,"lower_bound":"A4AAAAAAJIAB","upper_bound":"A4AAAAAAJQAA","repeats":1},{"count":2457600,"lower_bound":"A4AAAAAAJQAB","upper_bound":"A4AAAAAAJYAA","repeats":1},{"count":2490368,"lower_bound":"A4AAAAAAJYAB","upper_bound":"A4AAAAAAJgAA","repeats":1},{"count":2523136,"lower_bound":"A4AAAAAAJgAB","upper_bound":"A4AAAAAAJoAA","repeats":1},{"count":2555904,"lower_bound":"A4AAAAAAJoAB","upper_bound":"A4AAAAAAJwAA","repeats":1},{"count":2588672,"lower_bound":"A4AAAAAAJwAB","upper_bound":"A4AAAAAAJ4AA","repeats":1},{"count":2621440,"lower_bound":"A4AAAAAAJ4AB","upper_bound":"A4AAAAAAKAAA","repeats":1},{"count":2654208,"lower_bound":"A4AAAAAAKAAB","upper_bound":"A4AAAAAAKIAA","repeats":1},{"count":2686976,"lower_bound":"A4AAAAAAKIAB","upper_bound":"A4AAAAAAKQAA","repeats":1},{"count":2719744,"lower_bound":"A4AAAAAAKQAB","upper_bound":"A4AAAAAAKYAA","repeats":1},{"count":2752512,"lower_bound":"A4AAAAAAKYAB","upper_bound":"A4AAAAAAKgAA","repeats":1},{"count":2785280,"lower_bound":"A4AAAAAAKgAB","upper_bound":"A4AAAAAAKoAA","repeats":1},{"count":2818048,"lower_bound":"A4AAAAAAKoAB","upper_bound":"A4AAAAAAKwAA","repeats":1},{"count":2850816,"lower_bound":"A4AAAAAAKwAB","upper_bound":"A4AAAAAAK4AA","repeats":1},{"count":2883584,"lower_bound":"A4AAAAAAK4AB","upper_bound":"A4AAAAAALAAA","repeats":1},{"count":2916352,"lower_bound":"A4AAAAAALAAB","upper_bound":"A4AAAAAALIAA","repeats":1},{"count":2949120,"lower_bound":"A4AAAAAALIAB","upper_bound":"A4AAAAAALQAA","repeats":1},{"count":2981888,"lower_bound":"A4AAAAAALQAB","upper_bound":"A4AAAAAALYAA","repeats":1},{"count":3014656,"lower_bound":"A4AAAAAALYAB","upper_bound":"A4AAAAAALgAA","repeats":1},{"count":3047424,"lower_bound":"A4AAAAAALgAB","upper_bound":"A4AAAAAALoAA","repeats":1},{"count":3080192,"lower_bound":"A4AAAAAALoAB","upper_bound":"A4AAAAAALwAA","repeats":1},{"count":3112960,"lower_bound":"A4AAAAAALwAB","upper_bound":"A4AAAAAAL4AA","repeats":1},{"count":3145728,"lower_bound":"A4AAAAAAL4AB","upper_bound":"A4AAAAAAMAAA","repeats":1},{"count":3178496,"lower_bound":"A4AAAAAAMAAB","upper_bound":"A4AAAAAAMIAA","repeats":1},{"count":3211264,"lower_bound":"A4AAAAAAMIAB","upper_bound":"A4AAAAAAMQAA","repeats":1},{"count":3244032,"lower_bound":"A4AAAAAAMQAB","upper_bound":"A4AAAAAAMYAA","repeats":1},{"count":3276800,"lower_bound":"A4AAAAAAMYAB","upper_bound":"A4AAAAAAMgAA","repeats":1},{"count":3309568,"lower_bound":"A4AAAAAAMgAB","upper_bound":"A4AAAAAAMoAA","repeats":1},{"count":3342336,"lower_bound":"A4AAAAAAMoAB","upper_bound":"A4AAAAAAMwAA","repeats":1},{"count":3375104,"lower_bound":"A4AAAAAAMwAB","upper_bound":"A4AAAAAAM4AA","repeats":1},{"count":3407872,"lower_bound":"A4AAAAAAM4AB","upper_bound":"A4AAAAAANAAA","repeats":1},{"count":3440640,"lower_bound":"A4AAAAAANAAB","upper_bound":"A4AAAAAANIAA","repeats":1},{"count":3473408,"lower_bound":"A4AAAAAANIAB","upper_bound":"A4AAAAAANQAA","repeats":1},{"count":3506176,"lower_bound":"A4AAAAAANQAB","upper_bound":"A4AAAAAANYAA","repeats":1},{"count":3538944,"lower_bound":"A4AAAAAANYAB","upper_bound":"A4AAAAAANgAA","repeats":1},{"count":3571712,"lower_bound":"A4AAAAAANgAB","upper_bound":"A4AAAAAANoAA","repeats":1},{"count":3604480,"lower_bound":"A4AAAAAANoAB","upper_bound":"A4AAAAAANwAA","repeats":1},{"count":3637248,"lower_bound":"A4AAAAAANwAB","upper_bound":"A4AAAAAAN4AA","repeats":1},{"count":3670016,"lower_bound":"A4AAAAAAN4AB","upper_bound":"A4AAAAAAOAAA","repeats":1},{"count":3702784,"lower_bound":"A4AAAAAAOAAB","upper_bound":"A4AAAAAAOIAA","repeats":1},{"count":3735552,"lower_bound":"A4AAAAAAOIAB","upper_bound":"A4AAAAAAOQAA","repeats":1},{"count":3768320,"lower_bound":"A4AAAAAAOQAB","upper_bound":"A4AAAAAAOYAA","repeats":1},{"count":3801088,"lower_bound":"A4AAAAAAOYAB","upper_bound":"A4AAAAAAOgAA","repeats":1},{"count":3833856,"lower_bound":"A4AAAAAAOgAB","upper_bound":"A4AAAAAAOoAA","repeats":1},{"count":3866624,"lower_bound":"A4AAAAAAOoAB","upper_bound":"A4AAAAAAOwAA","repeats":1},{"count":3899392,"lower_bound":"A4AAAAAAOwAB","upper_bound":"A4AAAAAAO4AA","repeats":1},{"count":3932160,"lower_bound":"A4AAAAAAO4AB","upper_bound":"A4AAAAAAPAAA","repeats":1},{"count":3964928,"lower_bound":"A4AAAAAAPAAB","upper_bound":"A4AAAAAAPIAA","repeats":1},{"count":3997696,"lower_bound":"A4AAAAAAPIAB","upper_bound":"A4AAAAAAPQAA","repeats":1},{"count":4030464,"lower_bound":"A4AAAAAAPQAB","upper_bound":"A4AAAAAAPYAA","repeats":1},{"count":4063232,"lower_bound":"A4AAAAAAPYAB","upper_bound":"A4AAAAAAPgAA","repeats":1},{"count":4096000,"lower_bound":"A4AAAAAAPgAB","upper_bound":"A4AAAAAAPoAA","repeats":1},{"count":4128768,"lower_bound":"A4AAAAAAPoAB","upper_bound":"A4AAAAAAPwAA","repeats":1},{"count":4161536,"lower_bound":"A4AAAAAAPwAB","upper_bound":"A4AAAAAAP4AA","repeats":1},{"count":4194304,"lower_bound":"A4AAAAAAP4AB","upper_bound":"A4AAAAAAQAAA","repeats":1},{"count":4227072,"lower_bound":"A4AAAAAAQAAB","upper_bound":"A4AAAAAAQIAA","repeats":1},{"count":4259840,"lower_bound":"A4AAAAAAQIAB","upper_bound":"A4AAAAAAQQAA","repeats":1},{"count":4292608,"lower_bound":"A4AAAAAAQQAB","upper_bound":"A4AAAAAAQYAA","repeats":1},{"count":4325376,"lower_bound":"A4AAAAAAQYAB","upper_bound":"A4AAAAAAQgAA","repeats":1},{"count":4358144,"lower_bound":"A4AAAAAAQgAB","upper_bound":"A4AAAAAAQoAA","repeats":1},{"count":4390912,"lower_bound":"A4AAAAAAQoAB","upper_bound":"A4AAAAAAQwAA","repeats":1},{"count":4423680,"lower_bound":"A4AAAAAAQwAB","upper_bound":"A4AAAAAAQ4AA","repeats":1},{"count":4456448,"lower_bound":"A4AAAAAAQ4AB","upper_bound":"A4AAAAAARAAA","repeats":1},{"count":4489216,"lower_bound":"A4AAAAAARAAB","upper_bound":"A4AAAAAARIAA","repeats":1},{"count":4521984,"lower_bound":"A4AAAAAARIAB","upper_bound":"A4AAAAAARQAA","repeats":1},{"count":4554752,"lower_bound":"A4AAAAAARQAB","upper_bound":"A4AAAAAARYAA","repeats":1},{"count":4587520,"lower_bound":"A4AAAAAARYAB","upper_bound":"A4AAAAAARgAA","repeats":1},{"count":4620288,"lower_bound":"A4AAAAAARgAB","upper_bound":"A4AAAAAARoAA","repeats":1},{"count":4653056,"lower_bound":"A4AAAAAARoAB","upper_bound":"A4AAAAAARwAA","repeats":1},{"count":4685824,"lower_bound":"A4AAAAAARwAB","upper_bound":"A4AAAAAAR4AA","repeats":1},{"count":4718592,"lower_bound":"A4AAAAAAR4AB","upper_bound":"A4AAAAAASAAA","repeats":1},{"count":4751360,"lower_bound":"A4AAAAAASAAB","upper_bound":"A4AAAAAASIAA","repeats":1},{"count":4784128,"lower_bound":"A4AAAAAASIAB","upper_bound":"A4AAAAAASQAA","repeats":1},{"count":4816896,"lower_bound":"A4AAAAAASQAB","upper_bound":"A4AAAAAASYAA","repeats":1},{"count":4849664,"lower_bound":"A4AAAAAASYAB","upper_bound":"A4AAAAAASgAA","repeats":1},{"count":4882432,"lower_bound":"A4AAAAAASgAB","upper_bound":"A4AAAAAASoAA","repeats":1},{"count":4915200,"lower_bound":"A4AAAAAASoAB","upper_bound":"A4AAAAAASwAA","repeats":1},{"count":4947968,"lower_bound":"A4AAAAAASwAB","upper_bound":"A4AAAAAAS4AA","repeats":1},{"count":4980736,"lower_bound":"A4AAAAAAS4AB","upper_bound":"A4AAAAAATAAA","repeats":1},{"count":5000000,"lower_bound":"A4AAAAAATAAB","upper_bound":"A4AAAAAATEtA","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2497,2468,2447,2444,2467,2448,2562,2457,2437,2466,2511,2460,2508,2561,2520,2461,2486,2445,2404,2450,2466,2468,2438,2469,2492,2496,2529,2550,2519,2398,2470,2375,2482,2479,2484,2455,2471,2374,2434,2383,2444,2377,2343,2403,2492,2435,2460,2378,2449,2521,2393,2378,2390,2487,2461,2445,2363,2358,2496,2395,2424,2418,2358,2491,2478,2473,2404,2467,2399,2337,2455,2438,2430,2445,2388,2449,2494,2472,2450,2408,2577,2398,2470,2363,2376,2457,2513,2421,2451,2461,2557,2417,2421,2477,2430,2429,2420,2446,2417,2534,2399,2493,2395,2443,2502,2465,2327,2407,2419,2450,2441,2406,2372,2488,2474,2427,2488,2418,2397,2458,2432,2498,2436,2466,2423,2472,2545,2484,2384,2505,2434,2441,2407,2445,2439,2374,2444,2475,2447,2477,2450,2434,2442,2440,2402,2460,2493,2452,2504,2526,2407,2358,2448,2411,2452,2469,2418,2470,2526,2402,2461,2450,2391,2441,2472,2451,2480,2426,2490,2409,2396,2446,2372,2415,2458,2443,2485,2480,2428,2433,2425,2428,2382,2396,2436,2407,2535,2426,2465,2495,2407,2445,2577,2425,2494,2489,2520,2432,2368,2369,2429,2459,2431,2416,2453,2413,2438,2430,2489,2460,2412,2450,2412,2411,2453,2392,2324,2469,2447,2435,2423,2462,2427,2448,2401,2446,2403,2393,2452,2433,2472,2428,2448,2433,2447,2525,2444,2481,2430,2421,2383,2411,2398,2402,2519,2363,2442,2501,2464,2469,2447,2356,2353,2445,2365,2402,2443,2345,2402,2432,2446,2405,2461,2406,2406,2426,2447,2366,2269,2441,2500,2420,2349,2409,2406,2470,2489,2525,2451,2458,2472,2539,2460,2498,2425,2369,2372,2361,2407,2516,2438,2377,2371,2336,2476,2453,2405,2456,2447,2455,2478,2458,2430,2407,2468,2469,2413,2459,2399,2410,2401,2490,2483,2445,2411,2467,2478,2415,2441,2485,2440,2486,2406,2460,2324,2547,2472,2480,2513,2388,2389,2409,2379,2406,2491,2438,2411,2375,2479,2514,2454,2384,2496,2402,2393,2537,2487,2490,2477,2478,2458,2477,2416,2453,2443,2370,2437,2413,2402,2353,2441,2485,2427,2450,2393,2501,2401,2396,2423,2417,2423,2436,2519,2414,2464,2352,2424,2506,2467,2391,2341,2473,2457,2458,2520,2503,2379,2385,2396,2475,2495,2360,2519,2452,2471,2401,2463,2485,2472,2416,2505,2435,2408,2378,2464,2428,2412,2502,2476,2459,2476,2448,2520,2409,2300,2420,2375,2483,2488,2432,2478,2512,2413,2414,2527,2341,2458,2483,2414,2331,2508,2471,2490,2442,2411,2426,2348,2426,2389,2327,2418,2455,2443,2449,2392,2488,2382,2420,2402,2507,2441,2451,2440,2413,2405,2457,2541,2335,2463,2470,2513,2433,2466,2447,2551,2412,2478,2500,2523,2415,2451,2418,2358,2440,2463,2396,2516,2441,2399,2469,2403,2389,2385,2404,2436,2409,2491,2395,2485,2463,2461,2525,2397,2396,2338,2346,2486,2385,2382,2474,2523,2434,2375,2386,2433,2489,2448,2422,2412,2559,2454,2437,2329,2536,2393,2330,2494,2537,2573,2383,2384,2553,2487,2434,2434,2414,2444,2512,2449,2386,2492,2412,2413,2447,2421,2462,2540,2442,2409,2388,2489,2449,2407,2427,2401,2406,2456,2485,2405,2452,2475,2535,2445,2383,2402,2477,2375,2375,2496,2399,2461,2466,2366,2452,2414,2453,2402,2518,2427,2401,2504,2465,2483,2428,2400,2436,2482,2430,2412,2414,2462,2454,2353,2497,2518,2447,2462,2394,2356,2379,2352,2431,2331,2439,2496,2459,2427,2408,2489,2398,2411,2400,2461,2397,2441,2405,2376,2409,2508,2415,2372,2439,2355,2401,2439,2442,2408,2434,2413,2429,2433,2427,2439,2450,2408,2433,2398,2418,2395,2383,2392,2433,2459,2366,2448,2430,2432,2431,2443,2363,2564,2395,2499,2457,2421,2412,2494,2485,2479,2446,2477,2449,2503,2531,2410,2422,2428,2423,2424,2495,2478,2400,2431,2518,2380,2461,2487,2506,2496,2404,2525,2434,2457,2421,2398,2495,2397,2501,2423,2370,2390,2456,2420,2512,2492,2444,2440,2507,2448,2431,2421,2434,2459,2474,2417,2477,2392,2350,2400,2446,2427,2402,2429,2525,2483,2409,2401,2447,2467,2474,2395,2454,2538,2487,2419,2413,2533,2362,2338,2428,2389,2426,2505,2469,2429,2458,2481,2512,2365,2407,2368,2477,2552,2443,2377,2461,2390,2429,2422,2466,2386,2370,2435,2414,2504,2455,2468,2423,2441,2391,2493,2431,2468,2399,2384,2395,2458,2464,2460,2392,2402,2434,2381,2538,2508,2413,2478,2454,2467,2441,2444,2454,2393,2500,2416,2364,2604,2494,2474,2454,2389,2423,2441,2412,2517,2446,2402,2383,2477,2354,2469,2421,2445,2439,2420,2425,2373,2439,2416,2396,2449,2436,2396,2488,2402,2477,2492,2431,2431,2408,2483,2391,2438,2393,2447,2357,2539,2452,2450,2443,2439,2406,2482,2401,2455,2412,2452,2411,2443,2446,2476,2439,2319,2381,2503,2481,2464,2414,2402,2531,2485,2382,2468,2478,2482,2479,2404,2493,2511,2429,2411,2378,2456,2532,2425,2386,2487,2440,2418,2394,2406,2430,2389,2514,2488,2468,2496,2451,2511,2512,2484,2454,2503,2459,2406,2420,2482,2453,2344,2489,2466,2353,2486,2349,2461,2410,2491,2402,2430,2402,2488,2441,2483,2425,2439,2480,2419,2390,2354,2506,2399,2531,2477,2519,2433,2415,2510,2553,2458,2416,2401,2498,2517,2473,2414,2462,2450,2497,2436,2410,2457,2482,2441,2344,2478,2405,2387,2428,2360,2395,2434,2460,2419,2494,2476,2426,2497,2409,2517,2472,2461,2462,2480,2465,2530,2362,2419,2524,2474,2468,2456,2446,2530,2403,2387,2438,2440,2515,2375,2520,2393,2385,2373,2471,2377,2445,2370,2372,2455,2412,2353,2415,2406,2468,2420,2458,2366,2494,2393,2547,2430,2466,2438,2457,2496,2368,2455,2499,2500,2510,2425,2477,2387,2427,2468,2479,2388,2478,2347,2412,2433,2471,2447,2378,2475,2529,2365,2454,2511,2423,2382,2404,2397,2439,2444,2512,2505,2473,2466,2358,2455,2512,2499,2428,2388,2491,2368,2409,2534,2393,2440,2509,2405,2527,2385,2376,2403,2385,2408,2443,2441,2460,2482,2482,2362,2527,2521,2412,2491,2428,2507,2373,2439,2433,2402,2513,2396,2424,2510,2448,2386,2384,2492,2478,2483,2475,2409,2450,2425,2376,2513,2530,2418,2502,2354,2490,2479,2428,2450,2499,2380,2414,2361,2408,2393,2438,2469,2394,2460,2284,2438,2405,2387,2481,2335,2436,2405,2464,2424,2409,2485,2483,2542,2447,2527,2509,2424,2384,2456,2433,2407,2406,2497,2402,2389,2421,2538,2352,2420,2426,2410,2453,2347,2454,2485,2392,2447,2443,2462,2468,2368,2453,2421,2389,2436,2401,2543,2484,2434,2359,2431,2495,2429,2401,2400,2552,2473,2337,2385,2527,2324,2466,2424,2432,2466,2451,2484,2488,2501,2449,2446,2379,2460,2484,2412,2468,2467,2365,2470,2470,2400,2522,2389,2461,2358,2479,2395,2446,2446,2450,2502,2387,2430,2473,2504,2451,2559,2506,2390,2490,2458,2460,2512,2467,2422,2432,2420,2354,2443,2403,2474,2476,2396,2452,2378,2382,2420,2448,2397,2377,2376,2518,2419,2434,2449,2398,2437,2537,2390,2413,2424,2461,2432,2520,2439,2464,2380,2472,2454,2344,2564,2431,2453,2433,2478,2441,2426,2427,2460,2398,2412,2440,2405,2411,2521,2499,2418,2462,2435,2382,2493,2458,2474,2384,2406,2370,2413,2425,2472,2384,2415,2506,2497,2360,2436,2493,2441,2386,2412,2460,2444,2451,2417,2475,2418,2372,2446,2514,2382,2448,2458,2437,2458,2467,2390,2460,2425,2398,2400,2442,2433,2374,2502,2451,2515,2521,2419,2425,2398,2454,2507,2498,2484,2465,2460,2442,2383,2441,2389,2460,2407,2466,2437,2489,2374,2492,2538,2432,2430,2415,2450,2442,2465,2449,2401,2502,2434,2381,2457,2468,2412,2415,2475,2483,2357,2451,2479,2381,2457,2412,2472,2342,2476,2411,2414,2417,2465,2349,2398,2526,2434,2486,2428,2436,2549,2446,2427,2463,2521,2549,2483,2442,2517,2437,2408,2434,2356,2426,2473,2369,2430,2399,2464,2443,2537,2407,2460,2462,2447,2522,2432,2499,2452,2470,2421,2444,2382,2473,2503,2465,2523,2443,2514,2401,2386,2541,2420,2475,2354,2433,2480,2507,2486,2452,2411,2486,2457,2440,2367,2462,2479,2370,2479,2506,2489,2463,2368,2460,2450,2445,2421,2407,2473,2433,2385,2481,2501,2348,2458,2467,2426,2443,2512,2490,2419,2330,2427,2390,2411,2539,2386,2360,2376,2370,2460,2493,2515,2402,2450,2394,2370,2402,2465,2455,2470,2468,2473,2448,2446,2414,2480,2420,2409,2477,2410,2396,2361,2449,2444,2438,2437,2430,2383,2569,2407,2418,2381,2354,2558,2542,2364,2398,2479,2409,2450,2509,2406,2442,2390,2456,2482,2462,2462,2430,2379,2458,2509,2424,2497,2443,2528,2466,2464,2387,2418,2459,2468,2400,2422,2479,2475,2458,2416,2421,2449,2436,2501,2462,2479,2412,2439,2486,2410,2373,2490,2364,2440,2392,2526,2476,2383,2439,2471,2433,2469,2411,2490,2520,2310,2412,2424,2356,2382,2496,2476,2472,2436,2447,2526,2486,2422,2430,2500,2451,2460,2403,2348,2463,2429,2396,2446,2428,2377,2430,2503,2428,2407,2474,2441,2473,2441,2385,2475,2385,2453,2465,2448,2413,2506,2344,2474,2424,2414,2426,2483,2499,2513,2464,2536,2398,2304,2480,2438,2352,2335,2508,2428,2586,2414,2521,2412,2413,2434,2441,2468,2436,2415,2443,2482,2462,2486,2377,2398,2452,2444,2479,2462,2515,2440,2450,2417,2468,2449,2488,2407,2425,2444,2477,2381,2343,2458,2372,2499,2472,2470,2468,2404,2478,2427,2399,2389,2475,2445,2474,2401,2410,2386,2407,2441,2346,2498,2417,2513,2448,2447,2413,2481,2464,2390,2456,2416,2471,2463,2514,2430,2499,2404,2399,2455,2504,2387,2494,2416,2440,2401,2541,2435,2436,2413,2433,2463,2353,2479,2414,2428,2435,2393,2499,2399,2461,2430,2391,2453,2446,2422,2432,2487,2352,2481,2450,2430,2483,2454,2445,2456,2411,2405,2525,2390,2504,2438,2451,2443,2427,2492,2476,2483,2370,2430,2383,2464,2513,2548,2454,2489,2468,2388,2442,2426,2485,2558,2404,2374,2380,2443,2559,2412,2405,2472,2402,2437,2472,2419,2442,2410,2330,2398,2461,2391,2435,2371,2421,2417,2537,2456,2362,2422,2532,2468,2442,2418,2444,2449,2492,2578,2537,2392,2418,2469,2510,2522,2399,2366,2420,2490,2406,2463,2474,2554,2395,2409,2515,2473,2446,2502,2452,2468,2428,2422,2415,2490,2357,2442,2475,2448,2388,2427,2389,2404,2420,2482,2384,2422,2436,2428,2562,2447,2461,2462,2417,2427,2496,2460,2439,2354,2366,2354,2404,2447,2436,2464,2361,2413,2352,2518,2306,2374,2414,2441,2507,2441,2445,2514,2551,2494,2415,2466,2475,2454,2388,2441,2488,2522,2427,2484,2437,2420,2456,2479,2346,2424,2535,2425,2559,2527,2510,2425,2486,2523,2426,2454,2408,2507,2482,2393,2457,2445,2441,2390,2475,2475,2401,2369,2430,2511,2509,2429,2515,2405,2468,2444,2445,2460,2381,2503,2379,2432,2457,2385,2444,2463,2414,2364,2571,2413,2460,2386,2400,2498,2489,2477,2480,2377,2423,2327,2534,2446,2417,2404,2522,2370,2458,2468,2429,2363,2404,2387,2548,2496,2452,2430,2399,2442,2452,2482,2414,2501,2440,2404,2436,2490,2415,2421,2409,2409,2328,2483,2477,2502,2400,2410,2470,2414,2485,2437,2528,2388,2385,2453,2406,2514,2348,2377,2405,2352,2554,2494,2450,2382,2468,2451,2444,2425,2611,2474,2382,2461,2474,2415,2524,2497,2407,2458,2514,2460,2539,2421,2500,2467,2439,2379,2322,2449,2477,2466,2418,2339,2396,2452,2364,2407,2508,2442,2372,2462,2313,2467,2462,2451,2496,2412,2454,2457,2463,2442,2401,2498,2373,2477,2373,2531,2531,2435,2433,2443,2391,2453,2455,2385,2409,2450,2474,2441,2440,2398,2367,2397,2420,2466,2405,2406,2486,2431,2477,2523,2493,2376,2528,2444,2506,2392,2415,2434,2415,2452,2447,2452,2464]},{"counters":[2410,2467,2507,2420,2368,2488,2379,2392,2493,2422,2378,2422,2409,2446,2445,2464,2450,2496,2426,2447,2488,2369,2512,2420,2477,2449,2452,2469,2399,2425,2453,2436,2421,2360,2406,2350,2523,2366,2508,2429,2391,2436,2435,2439,2410,2403,2430,2478,2426,2425,2415,2436,2387,2408,2365,2469,2455,2492,2323,2428,2492,2410,2423,2424,2512,2449,2461,2479,2539,2407,2410,2418,2487,2436,2453,2468,2419,2353,2450,2410,2387,2443,2457,2462,2438,2356,2498,2406,2415,2508,2394,2431,2480,2424,2388,2436,2479,2456,2383,2513,2391,2504,2473,2397,2409,2397,2491,2498,2513,2480,2382,2379,2389,2458,2444,2385,2419,2485,2416,2484,2308,2486,2493,2550,2482,2447,2417,2425,2526,2410,2428,2433,2402,2549,2556,2313,2399,2386,2531,2459,2445,2443,2472,2448,2460,2419,2457,2382,2488,2467,2521,2445,2469,2391,2466,2418,2454,2458,2479,2454,2449,2456,2396,2446,2399,2414,2458,2334,2446,2431,2453,2455,2490,2412,2455,2499,2436,2414,2475,2438,2445,2506,2391,2428,2385,2546,2386,2397,2451,2432,2412,2391,2512,2457,2461,2397,2446,2534,2448,2508,2387,2338,2488,2498,2367,2499,2448,2407,2390,2432,2418,2441,2474,2493,2465,2300,2505,2433,2606,2493,2474,2379,2452,2440,2411,2381,2379,2393,2455,2465,2430,2465,2439,2515,2409,2512,2430,2453,2455,2431,2536,2425,2473,2502,2446,2457,2458,2376,2536,2430,2438,2458,2466,2380,2534,2409,2462,2460,2413,2448,2506,2529,2372,2432,2455,2454,2462,2540,2382,2584,2441,2412,2464,2388,2477,2431,2423,2444,2409,2439,2400,2393,2398,2408,2478,2414,2407,2481,2425,2464,2514,2484,2382,2393,2533,2441,2403,2449,2400,2542,2414,2341,2360,2402,2366,2384,2390,2450,2458,2410,2484,2398,2375,2424,2484,2449,2451,2447,2551,2504,2451,2492,2406,2465,2343,2457,2485,2508,2506,2431,2407,2460,2448,2411,2410,2491,2539,2530,2438,2428,2532,2428,2434,2453,2373,2463,2496,2490,2357,2451,2388,2379,2480,2492,2445,2514,2475,2412,2460,2332,2476,2357,2516,2477,2406,2364,2281,2502,2413,2440,2373,2387,2378,2473,2519,2467,2489,2331,2435,2408,2433,2516,2472,2405,2407,2397,2399,2350,2417,2356,2456,2397,2453,2438,2421,2477,2457,2531,2382,2437,2440,2460,2396,2446,2331,2427,2475,2433,2425,2494,2411,2507,2584,2427,2539,2377,2265,2467,2481,2398,2458,2503,2514,2430,2370,2347,2434,2463,2564,2448,2457,2459,2489,2320,2449,2500,2405,2408,2491,2461,2486,2490,2368,2394,2456,2454,2451,2418,2421,2417,2456,2448,2399,2490,2467,2475,2441,2385,2566,2401,2402,2349,2496,2417,2490,2433,2388,2436,2486,2417,2418,2440,2387,2446,2397,2435,2447,2427,2357,2432,2497,2469,2370,2445,2396,2384,2417,2359,2424,2468,2510,2465,2415,2431,2393,2365,2513,2515,2406,2538,2452,2455,2487,2435,2445,2401,2508,2437,2534,2445,2392,2520,2358,2367,2404,2439,2441,2431,2394,2428,2400,2415,2442,2483,2516,2404,2500,2398,2454,2494,2338,2380,2418,2467,2399,2480,2415,2461,2457,2492,2400,2490,2492,2413,2401,2413,2378,2430,2436,2412,2308,2446,2338,2543,2438,2464,2499,2493,2507,2433,2446,2510,2365,2378,2437,2347,2402,2472,2539,2400,2458,2452,2323,2398,2507,2536,2547,2339,2414,2405,2401,2461,2399,2452,2470,2478,2368,2409,2412,2415,2434,2334,2461,2474,2433,2464,2436,2452,2411,2415,2398,2504,2372,2408,2404,2462,2476,2424,2505,2365,2531,2390,2430,2505,2482,2456,2522,2465,2398,2477,2357,2459,2520,2538,2398,2481,2391,2375,2472,2458,2424,2480,2422,2443,2511,2475,2407,2467,2402,2391,2479,2435,2523,2424,2431,2420,2474,2485,2468,2468,2350,2342,2461,2492,2466,2427,2421,2466,2465,2536,2426,2366,2453,2393,2444,2509,2405,2375,2454,2403,2395,2473,2413,2456,2449,2512,2415,2471,2458,2434,2394,2399,2439,2385,2451,2417,2406,2392,2473,2364,2471,2422,2553,2423,2326,2472,2442,2483,2436,2487,2514,2411,2377,2518,2428,2406,2416,2439,2429,2423,2440,2385,2496,2405,2284,2403,2393,2461,2418,2491,2374,2521,2511,2360,2431,2436,2411,2509,2466,2510,2389,2417,2418,2416,2493,2445,2451,2553,2481,2411,2402,2532,2410,2492,2445,2402,2519,2408,2461,2426,2397,2408,2395,2422,2446,2523,2471,2470,2497,2388,2488,2429,2511,2445,2430,2384,2494,2469,2519,2487,2420,2535,2433,2397,2558,2389,2485,2441,2458,2477,2384,2435,2459,2552,2458,2392,2496,2420,2380,2454,2417,2459,2423,2547,2423,2430,2486,2411,2455,2372,2555,2493,2505,2431,2443,2406,2442,2405,2474,2284,2427,2451,2496,2409,2461,2468,2440,2504,2411,2465,2491,2417,2526,2409,2485,2358,2387,2405,2435,2413,2409,2383,2393,2378,2459,2498,2502,2414,2483,2462,2463,2426,2395,2489,2466,2489,2457,2437,2392,2472,2469,2380,2380,2444,2452,2453,2455,2456,2495,2367,2442,2419,2371,2429,2445,2375,2464,2439,2436,2468,2401,2504,2420,2422,2373,2475,2427,2484,2442,2448,2452,2431,2445,2401,2391,2471,2514,2272,2491,2398,2437,2494,2502,2430,2447,2462,2484,2398,2429,2518,2276,2361,2494,2444,2437,2427,2447,2460,2461,2440,2473,2393,2412,2397,2452,2365,2495,2478,2429,2440,2382,2439,2417,2526,2455,2448,2480,2427,2398,2409,2435,2451,2404,2484,2451,2528,2483,2503,2398,2406,2469,2391,2330,2464,2525,2420,2428,2447,2436,2428,2415,2440,2490,2509,2534,2382,2522,2442,2475,2444,2423,2477,2440,2436,2444,2465,2450,2454,2420,2336,2454,2511,2435,2447,2434,2429,2398,2497,2486,2425,2420,2462,2412,2414,2434,2453,2418,2374,2460,2383,2428,2475,2441,2407,2451,2466,2422,2447,2364,2385,2493,2426,2394,2403,2404,2410,2382,2442,2394,2446,2410,2401,2455,2455,2393,2465,2389,2447,2422,2425,2465,2410,2459,2440,2427,2460,2445,2420,2433,2364,2340,2455,2463,2424,2439,2396,2459,2510,2474,2526,2460,2339,2381,2365,2517,2518,2407,2482,2388,2452,2505,2432,2406,2422,2426,2472,2526,2459,2357,2401,2478,2386,2402,2469,2425,2461,2391,2444,2433,2351,2450,2466,2415,2510,2400,2582,2488,2484,2413,2267,2476,2448,2388,2487,2427,2469,2426,2415,2460,2418,2281,2491,2487,2458,2453,2471,2473,2474,2366,2340,2391,2444,2495,2416,2422,2537,2447,2452,2464,2433,2488,2551,2434,2530,2397,2462,2436,2517,2454,2531,2430,2416,2338,2563,2467,2462,2485,2433,2391,2382,2422,2450,2369,2533,2411,2517,2417,2503,2448,2468,2364,2430,2437,2451,2491,2396,2418,2358,2463,2396,2455,2428,2429,2359,2405,2377,2432,2417,2392,2461,2387,2434,2410,2477,2515,2369,2427,2498,2442,2563,2373,2492,2471,2456,2509,2430,2424,2464,2430,2365,2489,2427,2388,2500,2412,2375,2454,2353,2382,2458,2446,2435,2503,2439,2398,2436,2461,2386,2419,2433,2508,2414,2490,2340,2453,2374,2472,2430,2473,2479,2476,2365,2370,2464,2407,2530,2466,2493,2419,2408,2368,2453,2459,2406,2430,2510,2491,2445,2429,2406,2431,2495,2484,2479,2463,2498,2475,2480,2433,2433,2495,2490,2465,2519,2469,2464,2451,2484,2450,2450,2461,2462,2457,2393,2439,2385,2436,2369,2495,2423,2582,2462,2448,2443,2411,2369,2448,2365,2432,2395,2493,2530,2501,2519,2506,2409,2422,2500,2521,2457,2506,2438,2462,2389,2470,2490,2433,2444,2461,2438,2346,2381,2403,2455,2486,2382,2499,2366,2476,2432,2443,2389,2495,2354,2452,2402,2505,2453,2410,2375,2404,2522,2418,2476,2380,2510,2461,2476,2406,2451,2512,2418,2429,2424,2580,2490,2436,2411,2443,2481,2426,2446,2437,2421,2408,2491,2400,2534,2421,2419,2396,2413,2471,2399,2366,2443,2439,2511,2342,2426,2422,2445,2476,2482,2407,2402,2455,2388,2503,2400,2373,2377,2382,2460,2468,2439,2335,2448,2477,2380,2505,2497,2586,2431,2454,2474,2480,2408,2407,2449,2414,2441,2470,2422,2485,2480,2381,2466,2536,2511,2402,2471,2414,2465,2541,2471,2528,2546,2504,2456,2456,2452,2451,2436,2500,2543,2431,2499,2428,2450,2392,2465,2494,2476,2384,2395,2381,2443,2473,2442,2453,2370,2442,2437,2391,2381,2467,2459,2487,2464,2437,2532,2460,2468,2438,2405,2488,2460,2412,2426,2437,2382,2445,2436,2464,2398,2406,2412,2368,2435,2513,2451,2391,2423,2478,2477,2451,2384,2422,2518,2406,2388,2473,2429,2501,2491,2392,2423,2547,2499,2436,2416,2562,2455,2377,2501,2503,2436,2343,2447,2433,2436,2479,2397,2504,2458,2428,2484,2427,2466,2466,2429,2482,2453,2463,2462,2431,2437,2407,2402,2351,2381,2367,2429,2512,2406,2461,2396,2528,2421,2460,2423,2440,2481,2457,2491,2483,2466,2398,2416,2376,2521,2428,2425,2445,2414,2473,2456,2552,2406,2416,2378,2510,2399,2460,2445,2419,2397,2428,2434,2508,2454,2484,2364,2405,2521,2414,2528,2415,2436,2391,2398,2441,2355,2472,2535,2304,2490,2417,2456,2447,2446,2390,2524,2439,2339,2436,2512,2493,2412,2417,2469,2395,2431,2450,2437,2439,2454,2369,2439,2345,2389,2457,2518,2388,2413,2491,2418,2463,2456,2458,2524,2440,2407,2490,2503,2424,2461,2474,2443,2458,2440,2463,2426,2460,2424,2487,2414,2374,2499,2352,2394,2429,2460,2488,2296,2356,2423,2419,2495,2388,2467,2425,2415,2432,2510,2493,2423,2383,2414,2412,2438,2453,2403,2536,2429,2427,2401,2443,2400,2430,2479,2337,2448,2474,2386,2431,2529,2451,2477,2509,2509,2455,2398,2481,2357,2317,2405,2411,2380,2512,2417,2384,2425,2437,2424,2445,2445,2389,2467,2402,2418,2402,2424,2479,2508,2447,2510,2492,2440,2449,2438,2471,2469,2418,2481,2439,2426,2394,2431,2431,2441,2474,2489,2416,2429,2468,2466,2440,2476,2489,2371,2386,2473,2458,2446,2400,2363,2411,2520,2460,2375,2418,2462,2409,2374,2519,2391,2458,2428,2405,2435,2387,2350,2504,2439,2395,2538,2440,2439,2513,2492,2435,2385,2393,2390,2453,2451,2361,2423,2434,2478,2380,2468,2491,2429,2560,2412,2414,2491,2410,2453,2316,2539,2468,2418,2457,2542,2413,2400,2479,2444,2382,2470,2457,2437,2375,2426,2429,2519,2442,2461,2470,2363,2419,2515,2403,2388,2402,2417,2453,2561,2496,2420,2442,2420,2403,2398,2405,2384,2537,2473,2436,2519,2396,2479,2500,2470,2423,2410,2430,2408,2504,2420,2440,2379,2501,2363,2371,2471,2456,2533,2361,2440,2421,2462,2431,2511,2424,2428,2472,2464,2471,2581,2526,2494,2400,2401,2435,2490,2445,2470,2478,2403,2427,2489,2374,2457,2357,2475,2457,2389,2474,2423,2429,2549,2422,2421,2462,2482,2471,2402,2442,2524,2510,2428,2351,2430,2411,2411,2444,2441,2464,2491,2518,2449,2437,2393,2575,2481,2464,2384,2403,2437,2479,2555,2394,2437,2408,2417,2443,2427,2437,2530,2347,2468,2460,2347,2374,2448,2445,2463,2481,2425,2399,2408,2388,2503,2478,2480,2420,2466,2443,2417,2429,2480,2418,2389,2441,2426,2430,2436,2574,2499,2441,2357,2411,2436,2493,2503,2350,2398,2494,2467,2483,2428,2432,2406,2437,2508,2567,2469,2456,2481,2433,2448,2373,2494,2377,2461,2451,2498,2364,2415,2432,2427,2427,2470,2473,2350,2494,2395,2448,2435,2362,2460,2435,2401,2392,2399,2344,2386,2467,2506,2439,2553,2397,2433,2474,2510,2442,2428,2456,2464,2467,2526,2442,2483,2439,2422,2528,2429,2377,2493,2453,2455,2430,2472,2353,2521,2415,2417,2488,2357,2530,2486,2445,2529,2456,2483,2406,2516,2423,2471,2405,2504,2386,2507,2443,2437,2470,2460,2418,2456,2413,2379,2398,2418,2518,2438,2372,2409,2380,2486,2415,2410,2437,2416,2444,2433,2424,2363,2488,2442,2389,2433,2468,2416,2425,2366,2410,2503,2431,2485,2528,2451,2525,2468]},{"counters":[2431,2435,2556,2475,2346,2489,2338,2452,2470,2458,2480,2455,2347,2476,2520,2574,2479,2552,2390,2405,2403,2548,2460,2466,2448,2488,2416,2399,2481,2525,2442,2390,2445,2535,2451,2460,2407,2442,2442,2452,2508,2475,2504,2444,2327,2452,2418,2499,2523,2425,2447,2411,2405,2383,2503,2532,2521,2398,2401,2448,2447,2417,2398,2378,2433,2400,2424,2390,2498,2360,2359,2559,2414,2410,2447,2413,2500,2409,2396,2429,2518,2437,2498,2387,2376,2531,2408,2421,2483,2445,2472,2481,2540,2494,2473,2435,2434,2470,2444,2394,2466,2395,2387,2405,2431,2422,2317,2469,2387,2405,2427,2417,2406,2479,2464,2512,2452,2460,2432,2334,2451,2406,2381,2470,2463,2380,2467,2420,2425,2483,2483,2427,2397,2442,2439,2487,2399,2494,2439,2422,2418,2457,2463,2458,2446,2441,2448,2442,2403,2446,2441,2461,2506,2359,2442,2525,2492,2511,2405,2443,2414,2474,2507,2362,2432,2470,2360,2450,2488,2520,2440,2519,2437,2372,2418,2464,2378,2409,2465,2427,2395,2425,2467,2492,2394,2419,2422,2557,2483,2560,2386,2466,2527,2444,2414,2498,2458,2499,2464,2417,2450,2450,2389,2434,2358,2355,2410,2424,2464,2392,2472,2534,2459,2472,2463,2414,2368,2447,2471,2423,2488,2449,2464,2476,2458,2484,2381,2488,2438,2396,2441,2429,2467,2465,2440,2353,2483,2575,2431,2443,2535,2470,2497,2418,2488,2398,2396,2431,2456,2419,2448,2454,2468,2471,2384,2427,2475,2435,2461,2348,2392,2393,2492,2427,2425,2475,2391,2485,2394,2516,2342,2463,2342,2432,2419,2477,2441,2445,2403,2452,2497,2370,2511,2595,2369,2502,2407,2367,2451,2371,2461,2425,2460,2428,2411,2334,2403,2391,2385,2465,2513,2368,2411,2518,2458,2466,2433,2448,2461,2405,2401,2509,2474,2435,2494,2512,2454,2383,2440,2374,2498,2467,2452,2390,2457,2431,2511,2447,2381,2549,2340,2473,2510,2415,2499,2481,2482,2462,2496,2353,2465,2354,2392,2436,2467,2411,2451,2473,2480,2410,2461,2385,2482,2432,2528,2412,2475,2425,2445,2514,2400,2420,2461,2493,2471,2480,2405,2385,2438,2469,2498,2328,2401,2520,2427,2295,2431,2480,2357,2459,2470,2361,2367,2435,2493,2497,2390,2404,2438,2413,2456,2554,2551,2431,2368,2408,2457,2423,2429,2460,2454,2477,2460,2368,2480,2495,2451,2466,2393,2390,2501,2441,2478,2386,2379,2494,2435,2403,2468,2327,2424,2403,2425,2417,2507,2375,2397,2442,2462,2425,2422,2478,2453,2369,2464,2425,2406,2410,2405,2425,2538,2451,2484,2384,2505,2379,2471,2450,2463,2438,2478,2429,2451,2407,2389,2525,2455,2422,2423,2432,2442,2464,2450,2387,2470,2448,2444,2409,2415,2460,2514,2404,2592,2437,2391,2403,2480,2472,2464,2443,2476,2518,2409,2383,2400,2422,2569,2458,2398,2476,2371,2438,2420,2495,2424,2402,2390,2457,2460,2366,2342,2470,2454,2466,2374,2431,2401,2421,2411,2470,2407,2486,2431,2350,2398,2445,2454,2461,2426,2441,2394,2446,2415,2397,2531,2315,2462,2342,2425,2441,2468,2434,2458,2468,2393,2490,2364,2434,2481,2521,2396,2365,2386,2437,2517,2419,2407,2420,2472,2378,2495,2498,2489,2456,2482,2542,2477,2445,2443,2428,2342,2490,2457,2447,2502,2392,2395,2432,2499,2505,2379,2459,2490,2412,2436,2386,2510,2397,2504,2487,2485,2434,2459,2456,2449,2392,2524,2378,2460,2434,2421,2409,2527,2492,2417,2495,2465,2464,2434,2413,2312,2462,2428,2393,2446,2446,2505,2464,2421,2423,2329,2390,2430,2435,2396,2410,2465,2405,2344,2461,2438,2434,2490,2454,2442,2499,2370,2359,2399,2411,2423,2440,2391,2342,2508,2497,2420,2441,2464,2358,2398,2430,2393,2475,2448,2384,2439,2488,2464,2319,2396,2362,2402,2418,2373,2475,2430,2357,2387,2481,2437,2368,2422,2409,2515,2401,2352,2463,2404,2533,2504,2370,2427,2535,2468,2374,2506,2420,2397,2408,2485,2397,2567,2459,2347,2548,2522,2502,2469,2507,2445,2392,2360,2379,2451,2439,2535,2455,2498,2513,2438,2594,2352,2485,2491,2506,2507,2420,2535,2420,2301,2511,2387,2459,2530,2382,2435,2455,2486,2462,2554,2479,2482,2415,2430,2496,2415,2491,2409,2440,2408,2458,2387,2496,2388,2438,2437,2386,2447,2462,2507,2417,2460,2489,2479,2505,2394,2420,2373,2417,2437,2442,2355,2498,2494,2371,2429,2464,2479,2377,2497,2408,2419,2438,2412,2376,2415,2370,2352,2573,2455,2459,2565,2397,2458,2361,2431,2380,2387,2469,2404,2426,2457,2431,2409,2392,2489,2467,2422,2486,2468,2480,2455,2457,2486,2456,2491,2362,2455,2460,2484,2435,2448,2556,2421,2450,2474,2446,2457,2449,2505,2490,2432,2473,2386,2449,2473,2511,2381,2415,2490,2420,2434,2477,2470,2486,2404,2520,2400,2455,2391,2423,2476,2428,2524,2398,2395,2390,2309,2355,2468,2482,2521,2464,2540,2423,2354,2362,2506,2435,2419,2406,2439,2417,2510,2422,2418,2420,2384,2513,2368,2387,2527,2517,2376,2447,2533,2421,2421,2447,2436,2507,2366,2408,2413,2401,2527,2423,2374,2496,2390,2480,2475,2327,2374,2364,2400,2556,2330,2531,2375,2418,2508,2354,2432,2374,2456,2468,2484,2514,2484,2460,2460,2452,2444,2401,2482,2452,2374,2507,2454,2451,2456,2359,2340,2504,2428,2438,2483,2482,2378,2481,2476,2506,2454,2387,2363,2428,2457,2512,2503,2410,2482,2477,2387,2478,2483,2403,2537,2468,2437,2442,2425,2373,2487,2469,2389,2469,2432,2500,2469,2444,2393,2522,2398,2516,2443,2411,2356,2457,2388,2434,2461,2456,2428,2431,2382,2497,2381,2503,2444,2434,2467,2367,2492,2463,2428,2440,2442,2447,2440,2440,2453,2482,2433,2365,2464,2357,2368,2473,2401,2462,2418,2433,2464,2510,2443,2452,2402,2457,2407,2495,2388,2452,2404,2439,2504,2479,2553,2435,2354,2362,2403,2412,2478,2389,2404,2471,2413,2560,2424,2484,2507,2360,2440,2358,2450,2487,2489,2504,2462,2514,2514,2460,2487,2467,2435,2315,2428,2498,2509,2520,2464,2498,2489,2398,2414,2498,2429,2372,2479,2440,2431,2485,2434,2408,2407,2470,2402,2424,2326,2414,2381,2404,2380,2438,2469,2409,2436,2428,2372,2534,2498,2480,2487,2372,2435,2435,2479,2447,2382,2426,2445,2410,2424,2478,2530,2468,2392,2414,2346,2347,2361,2456,2459,2465,2418,2432,2420,2320,2481,2473,2469,2407,2450,2441,2401,2358,2467,2474,2410,2422,2525,2382,2549,2422,2481,2553,2478,2421,2442,2435,2443,2375,2481,2434,2420,2427,2421,2446,2420,2443,2556,2471,2481,2440,2501,2450,2492,2482,2367,2392,2508,2473,2359,2453,2424,2398,2380,2420,2490,2473,2436,2465,2410,2293,2447,2445,2457,2447,2425,2459,2374,2380,2469,2414,2458,2443,2509,2418,2434,2444,2431,2360,2462,2441,2443,2466,2454,2444,2455,2395,2376,2456,2455,2394,2417,2458,2498,2474,2331,2419,2504,2501,2455,2422,2432,2464,2449,2454,2504,2408,2454,2380,2432,2510,2459,2403,2359,2331,2485,2407,2470,2380,2482,2461,2486,2472,2449,2387,2394,2410,2490,2464,2472,2459,2408,2484,2392,2465,2422,2362,2365,2497,2408,2380,2437,2337,2501,2484,2433,2486,2450,2425,2333,2486,2379,2454,2387,2416,2513,2467,2429,2480,2435,2473,2366,2443,2393,2452,2434,2446,2424,2403,2410,2439,2414,2483,2390,2428,2449,2467,2452,2420,2496,2499,2433,2407,2432,2441,2474,2579,2432,2514,2372,2425,2449,2467,2497,2457,2392,2414,2356,2387,2487,2498,2381,2421,2411,2386,2454,2522,2476,2468,2445,2524,2467,2382,2382,2418,2466,2549,2444,2461,2489,2430,2429,2372,2451,2417,2530,2381,2485,2424,2435,2393,2545,2312,2407,2358,2500,2460,2509,2453,2447,2483,2545,2483,2430,2479,2396,2443,2356,2371,2464,2514,2390,2432,2385,2530,2421,2531,2450,2549,2412,2385,2341,2337,2377,2432,2436,2489,2449,2434,2485,2385,2417,2368,2419,2441,2502,2441,2395,2372,2456,2417,2420,2512,2425,2460,2470,2434,2388,2399,2385,2355,2408,2358,2487,2483,2345,2453,2429,2403,2402,2392,2390,2471,2452,2411,2427,2459,2515,2426,2423,2512,2517,2415,2581,2484,2435,2395,2422,2526,2403,2366,2486,2431,2472,2430,2452,2472,2493,2397,2459,2447,2460,2409,2436,2420,2400,2416,2454,2389,2505,2378,2347,2419,2436,2473,2496,2446,2484,2490,2479,2490,2423,2458,2458,2515,2498,2496,2430,2440,2486,2425,2477,2469,2404,2412,2452,2412,2428,2493,2381,2455,2458,2324,2454,2534,2507,2462,2515,2457,2365,2425,2344,2424,2412,2449,2454,2410,2462,2542,2434,2496,2456,2402,2445,2478,2369,2585,2432,2402,2444,2433,2353,2409,2487,2478,2352,2479,2570,2431,2426,2455,2342,2365,2464,2504,2438,2529,2498,2410,2461,2464,2531,2427,2461,2428,2326,2404,2416,2395,2384,2389,2529,2469,2508,2445,2452,2491,2454,2464,2477,2455,2386,2459,2503,2451,2423,2379,2506,2492,2507,2488,2451,2530,2392,2438,2468,2438,2434,2397,2421,2468,2421,2473,2493,2434,2392,2490,2375,2472,2508,2453,2429,2401,2435,2419,2420,2445,2339,2418,2377,2536,2511,2509,2464,2487,2446,2472,2463,2396,2493,2457,2397,2442,2429,2418,2448,2462,2485,2504,2510,2386,2390,2453,2426,2412,2490,2431,2370,2425,2440,2414,2445,2480,2472,2493,2404,2435,2496,2451,2416,2412,2434,2441,2411,2395,2467,2455,2378,2478,2360,2410,2360,2505,2461,2426,2389,2381,2389,2417,2382,2503,2422,2494,2436,2372,2480,2389,2380,2503,2460,2474,2480,2418,2400,2370,2368,2374,2509,2423,2453,2476,2468,2433,2348,2416,2368,2454,2472,2464,2492,2422,2449,2404,2463,2473,2415,2451,2461,2428,2463,2477,2466,2406,2391,2434,2422,2454,2393,2409,2422,2462,2461,2465,2466,2372,2391,2485,2439,2435,2399,2433,2487,2454,2400,2440,2469,2472,2416,2398,2463,2461,2486,2461,2447,2496,2470,2413,2428,2483,2365,2410,2425,2403,2427,2533,2457,2435,2401,2419,2400,2478,2461,2448,2488,2437,2367,2415,2456,2474,2509,2524,2443,2440,2407,2515,2472,2448,2404,2424,2459,2446,2409,2435,2419,2455,2453,2467,2474,2411,2468,2380,2419,2378,2453,2430,2481,2452,2420,2393,2434,2410,2336,2343,2456,2430,2522,2509,2452,2393,2440,2524,2386,2516,2465,2496,2404,2442,2410,2397,2421,2386,2423,2388,2393,2434,2455,2431,2499,2465,2374,2443,2519,2452,2474,2481,2426,2398,2403,2380,2394,2384,2512,2436,2340,2480,2428,2409,2507,2399,2445,2406,2428,2451,2474,2393,2480,2413,2445,2430,2494,2429,2541,2478,2462,2363,2476,2506,2474,2393,2447,2504,2457,2542,2461,2409,2413,2455,2424,2463,2400,2491,2429,2394,2481,2521,2450,2496,2438,2420,2422,2439,2417,2484,2514,2421,2495,2409,2517,2412,2414,2472,2425,2422,2446,2453,2431,2425,2433,2481,2444,2452,2428,2486,2484,2469,2387,2492,2506,2462,2435,2424,2457,2471,2383,2424,2444,2431,2493,2460,2420,2504,2422,2459,2406,2403,2377,2453,2370,2461,2502,2482,2438,2367,2449,2548,2475,2400,2495,2439,2450,2463,2415,2455,2456,2346,2559,2415,2443,2484,2464,2416,2474,2497,2416,2412,2493,2479,2494,2366,2361,2378,2352,2385,2428,2372,2333,2423,2527,2285,2458,2466,2445,2479,2462,2457,2440,2521,2473,2394,2454,2453,2478,2456,2524,2468,2484,2307,2474,2502,2418,2525,2412,2355,2492,2449,2415,2466,2482,2443,2488,2461,2365,2499,2463,2512,2443,2442,2476,2473,2389,2408,2460,2406,2436,2497,2478,2475,2378,2466,2392,2440,2416,2392,2438,2457,2490,2562,2517,2409,2449,2463,2427,2445,2555,2377,2524,2362,2484,2446,2376,2403,2535,2459,2463,2415,2475,2475,2471,2430,2467,2308,2330,2489,2504,2417,2405,2461,2411,2478,2419,2468,2448,2447,2432,2450,2461,2376,2440,2352,2434,2452,2410,2424]},{"counters":[2493,2550,2410,2500,2348,2628,2490,2460,2499,2440,2469,2508,2420,2449,2448,2405,2498,2439,2352,2478,2461,2437,2508,2393,2433,2387,2432,2424,2420,2539,2309,2350,2410,2366,2506,2438,2449,2461,2483,2447,2564,2429,2375,2408,2509,2420,2402,2423,2522,2432,2449,2402,2400,2361,2435,2348,2470,2544,2485,2472,2339,2409,2422,2429,2422,2487,2424,2496,2463,2362,2479,2386,2518,2477,2426,2405,2442,2448,2455,2426,2417,2438,2512,2440,2393,2491,2408,2454,2476,2412,2544,2488,2464,2434,2466,2430,2402,2494,2443,2453,2381,2469,2489,2523,2440,2371,2434,2443,2431,2458,2482,2289,2385,2387,2506,2435,2504,2430,2401,2515,2337,2487,2480,2426,2542,2465,2390,2555,2353,2389,2409,2393,2420,2424,2375,2394,2471,2449,2497,2381,2382,2587,2390,2351,2535,2450,2473,2446,2432,2432,2362,2466,2476,2410,2396,2518,2427,2397,2405,2391,2344,2381,2494,2444,2433,2449,2498,2519,2420,2426,2479,2449,2416,2391,2413,2555,2404,2464,2420,2412,2334,2420,2383,2365,2487,2484,2504,2454,2547,2417,2509,2543,2368,2361,2516,2418,2361,2386,2526,2449,2460,2485,2481,2492,2377,2503,2441,2446,2475,2350,2514,2464,2493,2366,2460,2412,2411,2416,2439,2481,2406,2418,2449,2461,2469,2456,2439,2500,2430,2502,2437,2402,2472,2470,2501,2438,2368,2426,2432,2454,2415,2351,2470,2470,2462,2478,2451,2351,2488,2498,2458,2412,2414,2425,2486,2519,2426,2394,2497,2459,2465,2383,2382,2344,2431,2489,2422,2471,2460,2420,2447,2440,2364,2342,2451,2446,2508,2338,2437,2373,2445,2483,2429,2507,2367,2467,2477,2438,2475,2384,2423,2406,2539,2475,2476,2419,2385,2340,2347,2404,2471,2432,2452,2355,2489,2447,2339,2385,2425,2437,2329,2483,2526,2421,2379,2437,2414,2362,2495,2415,2476,2434,2447,2482,2422,2460,2436,2445,2391,2405,2316,2513,2444,2373,2551,2443,2383,2409,2401,2405,2464,2419,2420,2472,2441,2424,2391,2336,2356,2548,2491,2368,2431,2489,2429,2441,2447,2476,2480,2438,2373,2403,2448,2455,2452,2447,2345,2399,2528,2455,2431,2409,2476,2422,2332,2516,2445,2461,2432,2518,2483,2497,2508,2431,2326,2510,2541,2470,2393,2408,2395,2444,2476,2413,2492,2495,2493,2428,2503,2415,2474,2450,2396,2467,2550,2387,2458,2472,2410,2400,2401,2470,2392,2419,2462,2522,2421,2432,2452,2479,2434,2390,2407,2421,2325,2464,2467,2432,2447,2392,2412,2401,2326,2465,2365,2460,2443,2399,2385,2489,2492,2412,2430,2356,2450,2514,2385,2498,2414,2449,2362,2327,2423,2429,2425,2418,2370,2388,2427,2498,2414,2486,2399,2357,2465,2429,2364,2428,2403,2415,2387,2490,2429,2461,2432,2486,2459,2462,2456,2371,2413,2473,2520,2448,2432,2461,2451,2384,2478,2460,2485,2486,2437,2459,2419,2442,2478,2449,2453,2448,2476,2361,2394,2399,2383,2500,2381,2464,2484,2321,2412,2516,2492,2409,2449,2447,2527,2434,2449,2421,2460,2460,2483,2494,2445,2461,2466,2465,2473,2394,2525,2415,2404,2368,2500,2463,2424,2479,2372,2370,2479,2463,2465,2511,2438,2359,2406,2438,2429,2498,2486,2420,2404,2497,2460,2467,2401,2525,2496,2467,2478,2506,2438,2417,2454,2490,2444,2402,2368,2474,2421,2418,2433,2502,2460,2461,2410,2529,2535,2431,2372,2406,2505,2483,2454,2396,2402,2366,2525,2494,2409,2372,2451,2361,2451,2407,2349,2399,2415,2475,2508,2567,2519,2448,2387,2373,2427,2425,2445,2300,2486,2471,2450,2469,2439,2417,2453,2455,2426,2468,2437,2439,2392,2437,2417,2470,2437,2439,2423,2378,2488,2369,2453,2461,2386,2442,2456,2567,2385,2438,2374,2394,2508,2432,2507,2409,2426,2526,2436,2472,2465,2447,2472,2476,2400,2472,2463,2457,2560,2433,2487,2443,2422,2482,2402,2463,2400,2571,2392,2406,2502,2481,2461,2451,2448,2389,2506,2472,2458,2501,2408,2542,2485,2399,2452,2378,2371,2457,2487,2516,2410,2350,2427,2394,2483,2429,2408,2500,2397,2402,2402,2432,2456,2420,2493,2409,2490,2486,2396,2445,2455,2483,2465,2438,2457,2420,2349,2463,2512,2412,2440,2442,2461,2443,2486,2481,2377,2482,2474,2414,2525,2478,2395,2512,2435,2475,2449,2454,2361,2483,2425,2554,2454,2382,2563,2427,2409,2394,2466,2393,2439,2468,2451,2395,2432,2420,2412,2417,2422,2410,2434,2472,2384,2428,2454,2434,2394,2450,2368,2430,2448,2529,2383,2374,2402,2433,2451,2417,2535,2429,2411,2371,2347,2514,2462,2413,2453,2445,2491,2449,2334,2424,2414,2358,2526,2395,2465,2468,2446,2488,2428,2432,2459,2487,2512,2400,2391,2440,2403,2391,2457,2441,2441,2411,2486,2493,2442,2498,2466,2534,2462,2517,2423,2463,2412,2496,2453,2445,2358,2382,2472,2427,2520,2446,2413,2393,2443,2487,2442,2503,2386,2471,2408,2402,2372,2401,2450,2363,2363,2428,2512,2515,2422,2583,2391,2405,2420,2445,2477,2428,2441,2389,2412,2440,2387,2504,2521,2401,2346,2439,2528,2408,2507,2437,2468,2494,2560,2430,2528,2428,2374,2401,2522,2504,2411,2486,2464,2414,2512,2466,2361,2471,2459,2426,2423,2500,2501,2443,2392,2367,2462,2492,2338,2374,2439,2424,2406,2448,2431,2443,2408,2588,2403,2409,2502,2389,2449,2454,2367,2467,2410,2434,2542,2505,2447,2526,2449,2386,2447,2465,2504,2500,2478,2386,2495,2383,2338,2429,2451,2446,2413,2433,2426,2432,2448,2417,2404,2565,2440,2414,2474,2477,2388,2369,2356,2449,2392,2364,2447,2440,2489,2497,2404,2446,2450,2390,2390,2419,2416,2391,2380,2446,2478,2457,2465,2465,2380,2414,2451,2430,2422,2444,2515,2447,2384,2536,2352,2538,2367,2460,2424,2522,2456,2410,2451,2445,2521,2429,2466,2495,2463,2458,2410,2455,2504,2386,2402,2449,2497,2505,2473,2432,2374,2423,2438,2473,2420,2537,2400,2402,2428,2487,2446,2407,2423,2506,2391,2412,2468,2444,2496,2472,2342,2421,2466,2458,2402,2437,2415,2411,2519,2403,2471,2386,2375,2403,2427,2425,2514,2391,2502,2425,2402,2461,2518,2355,2320,2396,2397,2454,2509,2442,2388,2406,2440,2540,2372,2392,2500,2344,2526,2518,2392,2490,2423,2351,2425,2306,2497,2470,2463,2468,2452,2350,2502,2448,2400,2497,2420,2435,2395,2501,2488,2404,2475,2463,2382,2449,2428,2481,2563,2465,2413,2441,2474,2496,2412,2466,2458,2456,2438,2398,2379,2414,2539,2420,2446,2546,2372,2461,2487,2441,2453,2529,2505,2462,2492,2440,2471,2478,2389,2420,2440,2498,2533,2403,2343,2422,2404,2419,2460,2403,2452,2439,2511,2369,2497,2394,2436,2509,2382,2387,2427,2386,2472,2448,2397,2460,2450,2457,2461,2394,2477,2504,2598,2422,2435,2492,2408,2442,2420,2451,2477,2350,2374,2450,2462,2465,2376,2447,2405,2452,2390,2536,2303,2342,2345,2487,2449,2446,2430,2348,2318,2459,2457,2454,2518,2467,2420,2420,2530,2442,2435,2527,2394,2469,2436,2410,2442,2414,2429,2467,2473,2457,2409,2440,2500,2415,2458,2464,2454,2477,2471,2403,2460,2433,2524,2473,2371,2432,2483,2437,2396,2481,2405,2352,2452,2464,2457,2455,2417,2398,2467,2401,2444,2441,2490,2451,2474,2413,2374,2422,2444,2484,2459,2467,2533,2490,2445,2453,2457,2443,2396,2418,2469,2398,2429,2452,2377,2435,2451,2440,2510,2468,2431,2513,2497,2459,2388,2487,2498,2409,2493,2525,2491,2468,2458,2454,2536,2458,2479,2391,2480,2382,2396,2521,2431,2449,2468,2383,2430,2326,2480,2434,2395,2476,2460,2414,2534,2394,2474,2505,2503,2344,2335,2386,2541,2418,2450,2407,2387,2536,2495,2479,2531,2528,2362,2502,2462,2473,2578,2414,2398,2475,2302,2388,2392,2515,2399,2342,2482,2470,2447,2437,2413,2352,2540,2408,2418,2463,2400,2449,2404,2432,2381,2434,2473,2450,2359,2574,2448,2453,2441,2436,2363,2396,2400,2437,2387,2443,2444,2429,2432,2423,2493,2411,2483,2379,2456,2473,2384,2431,2352,2426,2427,2468,2462,2432,2423,2435,2465,2372,2410,2383,2545,2538,2444,2453,2411,2403,2491,2499,2456,2368,2514,2453,2373,2531,2390,2425,2446,2445,2458,2370,2400,2411,2436,2425,2457,2437,2420,2478,2440,2451,2494,2366,2464,2470,2507,2348,2389,2520,2343,2513,2458,2394,2463,2448,2409,2479,2368,2487,2381,2403,2367,2497,2456,2431,2465,2380,2379,2463,2485,2411,2410,2430,2445,2463,2392,2407,2523,2352,2490,2422,2467,2411,2465,2464,2429,2379,2426,2422,2483,2459,2436,2487,2466,2339,2453,2443,2418,2419,2411,2495,2482,2365,2469,2395,2463,2463,2507,2436,2418,2466,2355,2433,2525,2469,2476,2458,2432,2412,2493,2461,2508,2434,2496,2375,2474,2379,2387,2452,2394,2489,2349,2441,2537,2496,2383,2420,2453,2494,2427,2486,2448,2468,2543,2411,2406,2494,2512,2523,2428,2485,2368,2527,2473,2346,2407,2473,2433,2413,2431,2478,2376,2385,2478,2364,2380,2470,2328,2447,2523,2378,2519,2423,2387,2485,2456,2411,2441,2491,2450,2435,2458,2444,2433,2471,2504,2456,2433,2508,2419,2377,2449,2457,2497,2499,2517,2469,2457,2437,2355,2296,2461,2361,2506,2529,2463,2429,2468,2435,2472,2467,2485,2558,2395,2396,2458,2362,2497,2434,2435,2420,2534,2423,2463,2553,2451,2508,2437,2426,2476,2465,2486,2414,2438,2397,2453,2370,2385,2426,2495,2424,2524,2472,2508,2417,2435,2513,2455,2480,2419,2490,2501,2421,2462,2450,2416,2447,2476,2378,2443,2367,2384,2386,2465,2413,2518,2417,2390,2377,2479,2480,2480,2513,2438,2465,2369,2426,2419,2436,2449,2402,2465,2447,2424,2412,2382,2434,2457,2512,2320,2505,2433,2365,2349,2455,2470,2443,2448,2317,2511,2464,2420,2453,2414,2468,2420,2404,2464,2447,2414,2473,2486,2449,2458,2424,2457,2471,2471,2544,2406,2482,2437,2406,2369,2416,2406,2479,2437,2425,2486,2448,2515,2442,2454,2438,2416,2430,2392,2473,2434,2416,2357,2495,2420,2436,2386,2486,2372,2441,2390,2499,2441,2361,2491,2444,2435,2432,2471,2484,2422,2486,2375,2442,2399,2507,2484,2493,2450,2426,2459,2435,2465,2507,2412,2434,2398,2358,2469,2444,2436,2467,2465,2523,2435,2427,2573,2390,2520,2431,2410,2376,2439,2530,2344,2466,2437,2421,2422,2485,2385,2364,2431,2400,2372,2431,2424,2380,2523,2485,2474,2383,2395,2484,2471,2502,2451,2397,2494,2468,2466,2454,2399,2461,2429,2494,2515,2436,2509,2496,2474,2438,2455,2488,2524,2533,2430,2417,2459,2536,2446,2412,2499,2446,2366,2351,2441,2433,2470,2328,2376,2411,2432,2451,2470,2428,2396,2488,2435,2389,2446,2459,2384,2477,2402,2359,2435,2494,2447,2380,2470,2393,2443,2448,2480,2515,2454,2472,2465,2461,2425,2494,2413,2449,2496,2456,2439,2433,2421,2428,2454,2513,2458,2446,2460,2496,2371,2502,2381,2433,2455,2460,2457,2512,2467,2440,2418,2396,2494,2479,2477,2413,2394,2427,2528,2469,2395,2416,2512,2369,2401,2407,2473,2476,2489,2428,2515,2465,2448,2445,2398,2400,2401,2481,2434,2484,2390,2477,2452,2357,2486,2463,2433,2431,2412,2532,2437,2432,2415,2423,2456,2459,2386,2447,2479,2501,2344,2375,2418,2477,2458,2437,2420,2466,2383,2366,2375,2394,2352,2457,2432,2483,2551,2416,2377,2425,2407,2491,2470,2351,2382,2327,2402,2367,2428,2389,2487,2463,2422,2456,2464,2398,2473,2432,2432,2481,2499,2454,2441,2443,2406,2432,2409,2556,2379,2508,2413,2425,2428,2451,2335,2435,2332,2484,2471,2398,2354,2506,2429,2466,2433,2336,2424,2457,2446,2449,2447,2382,2432,2509,2376,2474,2424,2484,2531,2464,2473,2450,2402,2469,2530,2454,2390,2456,2435,2420,2377,2436,2434,2405,2462,2502,2472,2525,2490,2417,2471,2433,2541,2470,2406,2417,2386,2457,2432,2439]},{"counters":[2513,2452,2410,2496,2548,2402,2369,2453,2476,2500,2502,2399,2461,2418,2426,2465,2432,2502,2404,2440,2476,2535,2465,2430,2421,2508,2369,2458,2525,2468,2427,2378,2489,2436,2419,2478,2363,2370,2424,2481,2476,2495,2467,2426,2419,2507,2491,2405,2545,2519,2435,2488,2480,2458,2494,2419,2478,2380,2400,2495,2546,2477,2541,2381,2358,2411,2443,2518,2398,2415,2422,2532,2494,2440,2460,2457,2468,2461,2495,2407,2471,2471,2419,2416,2519,2519,2334,2441,2430,2486,2410,2423,2447,2409,2401,2372,2519,2431,2503,2429,2494,2446,2394,2479,2364,2502,2420,2459,2419,2475,2374,2461,2494,2405,2429,2448,2438,2470,2527,2404,2510,2436,2388,2420,2456,2408,2392,2494,2378,2389,2497,2456,2401,2454,2461,2394,2469,2414,2457,2495,2461,2487,2494,2442,2425,2444,2484,2409,2430,2358,2451,2404,2465,2459,2426,2494,2384,2440,2409,2419,2412,2434,2437,2410,2404,2431,2504,2488,2473,2380,2459,2393,2452,2527,2455,2443,2486,2396,2415,2414,2431,2486,2373,2378,2538,2431,2471,2414,2409,2440,2418,2498,2451,2474,2483,2432,2463,2471,2430,2488,2466,2368,2470,2478,2535,2375,2454,2471,2529,2549,2462,2437,2425,2414,2420,2555,2452,2419,2340,2449,2520,2425,2480,2406,2433,2438,2421,2393,2528,2469,2447,2559,2448,2417,2471,2415,2469,2475,2320,2418,2491,2465,2412,2424,2442,2548,2544,2426,2383,2489,2393,2517,2437,2452,2525,2500,2521,2423,2474,2485,2392,2499,2406,2470,2491,2380,2401,2428,2469,2471,2412,2392,2439,2422,2413,2533,2407,2503,2423,2475,2404,2474,2360,2435,2449,2431,2466,2316,2411,2427,2508,2326,2499,2403,2353,2375,2433,2428,2353,2532,2416,2385,2492,2436,2436,2407,2417,2467,2426,2428,2497,2394,2432,2463,2416,2391,2415,2412,2515,2448,2394,2374,2372,2455,2406,2419,2542,2493,2369,2450,2512,2506,2355,2346,2394,2543,2391,2463,2407,2514,2404,2397,2405,2391,2361,2392,2392,2477,2482,2438,2426,2503,2377,2453,2373,2435,2401,2429,2504,2384,2440,2464,2404,2333,2385,2424,2415,2471,2428,2420,2475,2397,2360,2434,2372,2444,2498,2417,2397,2367,2396,2529,2439,2510,2497,2387,2320,2413,2524,2496,2445,2417,2424,2445,2441,2512,2468,2381,2509,2493,2406,2439,2439,2456,2421,2492,2389,2390,2507,2443,2409,2333,2470,2423,2402,2484,2411,2442,2399,2487,2478,2476,2426,2398,2427,2460,2442,2438,2447,2482,2403,2458,2423,2490,2416,2419,2359,2396,2482,2426,2462,2463,2465,2483,2435,2351,2513,2387,2538,2400,2392,2537,2428,2543,2450,2509,2561,2444,2406,2440,2543,2427,2550,2500,2333,2427,2562,2443,2472,2430,2368,2376,2441,2400,2424,2382,2525,2403,2431,2483,2545,2471,2340,2436,2539,2353,2569,2453,2491,2425,2421,2404,2485,2521,2429,2375,2466,2500,2384,2415,2395,2385,2493,2383,2419,2461,2323,2399,2395,2483,2441,2449,2487,2480,2465,2409,2332,2504,2602,2470,2383,2421,2488,2515,2469,2438,2478,2466,2424,2365,2467,2448,2430,2458,2509,2345,2384,2485,2408,2472,2448,2485,2557,2483,2483,2388,2446,2493,2482,2472,2450,2497,2467,2512,2448,2448,2410,2360,2426,2405,2503,2401,2428,2444,2433,2434,2445,2421,2417,2409,2540,2518,2432,2447,2471,2517,2412,2503,2452,2354,2424,2415,2478,2461,2428,2548,2501,2320,2473,2426,2363,2481,2423,2435,2416,2444,2461,2507,2495,2466,2482,2426,2415,2413,2409,2421,2434,2429,2448,2452,2390,2396,2490,2408,2419,2468,2471,2381,2447,2477,2406,2403,2468,2433,2388,2509,2376,2506,2466,2372,2450,2543,2475,2443,2443,2416,2410,2446,2381,2466,2385,2521,2426,2451,2541,2371,2390,2520,2372,2446,2409,2429,2466,2517,2359,2458,2412,2413,2379,2446,2420,2419,2392,2376,2446,2447,2463,2368,2387,2535,2448,2464,2386,2420,2344,2553,2504,2533,2416,2441,2390,2504,2467,2377,2462,2441,2445,2424,2404,2526,2511,2413,2388,2419,2510,2441,2500,2492,2483,2403,2378,2448,2439,2477,2401,2371,2431,2412,2466,2443,2468,2361,2439,2335,2490,2432,2388,2373,2435,2424,2492,2385,2398,2433,2432,2377,2423,2398,2512,2422,2480,2438,2391,2410,2497,2469,2376,2352,2416,2430,2459,2456,2383,2342,2391,2485,2332,2485,2363,2480,2482,2384,2498,2406,2411,2450,2497,2422,2458,2419,2434,2422,2486,2452,2431,2409,2471,2512,2453,2445,2408,2477,2468,2397,2479,2500,2547,2455,2402,2461,2374,2457,2471,2439,2365,2357,2379,2358,2448,2432,2412,2495,2372,2489,2517,2380,2472,2420,2430,2369,2403,2408,2478,2357,2498,2472,2399,2409,2515,2374,2470,2516,2547,2465,2483,2386,2441,2444,2431,2414,2417,2528,2386,2441,2384,2440,2471,2377,2464,2476,2510,2491,2450,2445,2468,2396,2493,2503,2520,2455,2427,2469,2513,2427,2461,2482,2443,2445,2450,2444,2445,2447,2439,2452,2376,2473,2473,2430,2451,2425,2514,2451,2455,2513,2458,2354,2317,2421,2404,2418,2466,2481,2444,2506,2526,2396,2324,2453,2373,2524,2401,2369,2509,2462,2468,2471,2403,2466,2490,2480,2410,2432,2485,2474,2404,2369,2412,2459,2462,2381,2447,2495,2386,2444,2450,2436,2397,2500,2408,2478,2487,2370,2468,2405,2357,2484,2460,2494,2428,2485,2352,2427,2469,2352,2552,2460,2509,2458,2476,2420,2443,2496,2474,2442,2450,2340,2435,2452,2411,2408,2430,2453,2416,2547,2497,2394,2418,2460,2392,2331,2394,2431,2391,2463,2420,2449,2401,2408,2388,2419,2499,2426,2402,2539,2409,2420,2406,2418,2474,2488,2469,2451,2434,2389,2424,2321,2533,2460,2444,2403,2398,2473,2461,2448,2356,2396,2451,2498,2442,2348,2502,2567,2468,2387,2360,2450,2415,2423,2406,2424,2371,2424,2419,2404,2393,2471,2472,2430,2470,2359,2456,2479,2436,2411,2517,2411,2433,2548,2434,2521,2439,2473,2452,2447,2428,2457,2461,2401,2433,2433,2422,2418,2407,2428,2342,2524,2446,2504,2393,2470,2377,2433,2514,2392,2416,2429,2437,2428,2411,2430,2412,2429,2431,2559,2495,2398,2344,2386,2398,2559,2455,2361,2407,2406,2467,2423,2403,2422,2489,2461,2393,2447,2440,2448,2485,2452,2463,2479,2453,2374,2463,2405,2378,2479,2370,2483,2532,2462,2431,2509,2460,2375,2437,2509,2500,2463,2425,2445,2521,2504,2413,2426,2480,2398,2392,2447,2437,2374,2463,2437,2503,2409,2491,2457,2449,2333,2449,2511,2420,2503,2410,2445,2388,2417,2439,2376,2377,2488,2421,2342,2417,2428,2373,2392,2430,2471,2467,2460,2444,2377,2476,2490,2431,2374,2451,2417,2414,2498,2467,2506,2456,2409,2457,2389,2470,2437,2448,2437,2434,2551,2400,2442,2458,2373,2462,2487,2410,2529,2498,2363,2440,2433,2451,2415,2416,2477,2489,2364,2444,2463,2486,2403,2369,2472,2439,2416,2456,2395,2444,2455,2471,2417,2393,2359,2362,2368,2528,2390,2423,2357,2407,2436,2431,2419,2419,2328,2351,2522,2417,2502,2527,2399,2452,2375,2399,2488,2555,2433,2443,2431,2389,2425,2448,2443,2497,2442,2432,2435,2426,2505,2535,2436,2376,2384,2411,2423,2481,2437,2375,2421,2464,2469,2408,2467,2422,2452,2414,2339,2389,2472,2420,2463,2417,2517,2426,2468,2444,2438,2426,2387,2400,2457,2455,2453,2467,2427,2403,2455,2344,2437,2502,2467,2480,2449,2400,2382,2426,2389,2439,2420,2468,2443,2372,2433,2465,2429,2495,2472,2485,2442,2456,2420,2523,2422,2433,2370,2375,2508,2418,2378,2481,2435,2519,2380,2480,2454,2388,2452,2472,2369,2416,2444,2445,2420,2505,2430,2443,2378,2486,2364,2482,2387,2464,2448,2430,2399,2526,2535,2497,2421,2508,2477,2437,2468,2576,2439,2468,2506,2400,2492,2446,2432,2507,2396,2373,2503,2509,2426,2486,2411,2356,2403,2419,2340,2390,2445,2429,2481,2408,2435,2436,2411,2471,2383,2385,2535,2489,2422,2423,2441,2482,2332,2432,2428,2401,2484,2462,2407,2411,2420,2510,2419,2370,2535,2407,2465,2490,2400,2438,2405,2483,2401,2370,2475,2481,2510,2356,2416,2462,2444,2384,2405,2493,2398,2401,2413,2428,2478,2444,2410,2461,2445,2484,2375,2405,2438,2453,2379,2367,2445,2418,2393,2515,2356,2452,2519,2493,2465,2445,2435,2544,2431,2447,2479,2332,2385,2435,2429,2434,2456,2356,2480,2494,2394,2564,2413,2393,2470,2373,2411,2425,2418,2387,2520,2451,2456,2478,2531,2449,2482,2524,2478,2459,2496,2432,2461,2412,2440,2485,2452,2381,2364,2447,2403,2459,2464,2372,2467,2532,2427,2453,2418,2449,2454,2443,2459,2409,2444,2425,2481,2450,2551,2442,2499,2370,2365,2451,2463,2297,2393,2491,2570,2482,2522,2492,2402,2403,2431,2497,2414,2387,2441,2466,2597,2431,2459,2423,2524,2426,2362,2548,2426,2472,2395,2427,2353,2391,2495,2456,2405,2500,2416,2445,2468,2471,2427,2509,2445,2467,2330,2482,2434,2413,2367,2511,2475,2421,2508,2477,2394,2507,2518,2491,2401,2449,2509,2375,2366,2487,2438,2465,2362,2424,2377,2389,2429,2481,2495,2478,2446,2414,2502,2434,2427,2450,2355,2483,2479,2522,2464,2348,2411,2466,2384,2336,2503,2462,2403,2489,2487,2486,2456,2382,2518,2391,2524,2431,2411,2486,2406,2489,2485,2429,2455,2482,2393,2442,2390,2454,2515,2478,2469,2435,2460,2417,2423,2370,2457,2477,2382,2421,2494,2446,2356,2459,2454,2356,2449,2491,2436,2404,2418,2458,2397,2305,2492,2491,2487,2414,2450,2388,2466,2470,2458,2402,2438,2418,2488,2423,2487,2342,2442,2438,2427,2377,2444,2468,2450,2454,2383,2383,2413,2493,2456,2433,2420,2426,2523,2417,2495,2412,2390,2450,2429,2501,2420,2465,2400,2386,2372,2430,2408,2444,2418,2431,2500,2426,2451,2500,2493,2409,2409,2432,2446,2435,2432,2380,2366,2460,2451,2455,2454,2507,2364,2396,2467,2466,2501,2490,2529,2441,2387,2462,2500,2453,2420,2511,2438,2435,2374,2502,2400,2560,2463,2429,2431,2500,2421,2466,2420,2450,2377,2500,2395,2487,2548,2558,2476,2418,2470,2376,2433,2356,2470,2537,2508,2413,2416,2413,2431,2399,2440,2518,2546,2383,2398,2553,2361,2324,2416,2430,2359,2427,2425,2389,2372,2432,2361,2480,2499,2405,2482,2427,2464,2390,2325,2409,2493,2408,2513,2375,2450,2464,2470,2474,2429,2378,2402,2373,2434,2415,2470,2512,2415,2485,2445,2444,2449,2494,2455,2450,2450,2426,2480,2459,2504,2395,2493,2415,2434,2415,2424,2409,2521,2503,2420,2493,2352,2462,2459,2409,2466,2461,2401,2438,2497,2356,2473,2461,2452,2359,2395,2481,2452,2407,2541,2445,2441,2408,2451,2412,2420,2418,2433,2406,2395,2387,2400,2409,2491,2479,2442,2348,2511,2406,2468,2463,2529,2545,2465,2460,2449,2464,2428,2423,2411,2425,2338,2444,2467,2462,2405,2466,2397,2417,2389,2406,2497,2392,2448,2413,2458,2472,2411,2457,2394,2500,2460,2384,2411,2497,2479,2418,2451,2627,2458,2477,2437,2509,2377,2395,2336,2362,2434,2476,2576,2502,2468,2534,2527,2464,2422,2394,2528,2314,2409,2457,2462,2439,2406,2490,2460,2480,2557,2432,2468,2446,2376,2454,2540,2443,2473,2486,2474,2479,2384,2369,2440,2401,2443,2485,2556,2492,2391,2455,2405,2362,2452,2416,2416,2405,2376,2457,2464,2374,2387,2445,2497,2454,2485,2448,2437,2414,2442,2402,2394,2484,2410,2455,2475,2433,2398,2343,2403,2408,2420,2421,2465,2403,2436,2424,2561,2503,2387,2462,2519,2451,2463,2405,2462,2292,2474,2509,2398,2421,2443,2414,2540,2457,2502,2449,2462,2519,2395,2417,2505,2487,2478,2404,2473,2430,2342,2456,2417,2415,2499,2391,2390,2430,2497,2443,2440,2507,2481,2484,2432,2340,2476,2547,2471,2439,2500,2341,2482,2516,2461,2427,2407,2296,2450,2531,2422,2493,2408,2437,2424,2411,2468]}],"default_value":0},"null_count":0,"tot_col_size":0,"last_update_version":410676693120843776,"correlation":0},"td":{"histogram":{"ndv":5000000,"buckets":[{"count":32768,"lower_bound":"A4AAAAAAAAAB","upper_bound":"A4AAAAAAAIAA","repeats":1},{"count":65536,"lower_bound":"A4AAAAAAAIAB","upper_bound":"A4AAAAAAAQAA","repeats":1},{"count":98304,"lower_bound":"A4AAAAAAAQAB","upper_bound":"A4AAAAAAAYAA","repeats":1},{"count":131072,"lower_bound":"A4AAAAAAAYAB","upper_bound":"A4AAAAAAAgAA","repeats":1},{"count":163840,"lower_bound":"A4AAAAAAAgAB","upper_bound":"A4AAAAAAAoAA","repeats":1},{"count":196608,"lower_bound":"A4AAAAAAAoAB","upper_bound":"A4AAAAAAAwAA","repeats":1},{"count":229376,"lower_bound":"A4AAAAAAAwAB","upper_bound":"A4AAAAAAA4AA","repeats":1},{"count":262144,"lower_bound":"A4AAAAAAA4AB","upper_bound":"A4AAAAAABAAA","repeats":1},{"count":294912,"lower_bound":"A4AAAAAABAAB","upper_bound":"A4AAAAAABIAA","repeats":1},{"count":327680,"lower_bound":"A4AAAAAABIAB","upper_bound":"A4AAAAAABQAA","repeats":1},{"count":360448,"lower_bound":"A4AAAAAABQAB","upper_bound":"A4AAAAAABYAA","repeats":1},{"count":393216,"lower_bound":"A4AAAAAABYAB","upper_bound":"A4AAAAAABgAA","repeats":1},{"count":425984,"lower_bound":"A4AAAAAABgAB","upper_bound":"A4AAAAAABoAA","repeats":1},{"count":458752,"lower_bound":"A4AAAAAABoAB","upper_bound":"A4AAAAAABwAA","repeats":1},{"count":491520,"lower_bound":"A4AAAAAABwAB","upper_bound":"A4AAAAAAB4AA","repeats":1},{"count":524288,"lower_bound":"A4AAAAAAB4AB","upper_bound":"A4AAAAAACAAA","repeats":1},{"count":557056,"lower_bound":"A4AAAAAACAAB","upper_bound":"A4AAAAAACIAA","repeats":1},{"count":589824,"lower_bound":"A4AAAAAACIAB","upper_bound":"A4AAAAAACQAA","repeats":1},{"count":622592,"lower_bound":"A4AAAAAACQAB","upper_bound":"A4AAAAAACYAA","repeats":1},{"count":655360,"lower_bound":"A4AAAAAACYAB","upper_bound":"A4AAAAAACgAA","repeats":1},{"count":688128,"lower_bound":"A4AAAAAACgAB","upper_bound":"A4AAAAAACoAA","repeats":1},{"count":720896,"lower_bound":"A4AAAAAACoAB","upper_bound":"A4AAAAAACwAA","repeats":1},{"count":753664,"lower_bound":"A4AAAAAACwAB","upper_bound":"A4AAAAAAC4AA","repeats":1},{"count":786432,"lower_bound":"A4AAAAAAC4AB","upper_bound":"A4AAAAAADAAA","repeats":1},{"count":819200,"lower_bound":"A4AAAAAADAAB","upper_bound":"A4AAAAAADIAA","repeats":1},{"count":851968,"lower_bound":"A4AAAAAADIAB","upper_bound":"A4AAAAAADQAA","repeats":1},{"count":884736,"lower_bound":"A4AAAAAADQAB","upper_bound":"A4AAAAAADYAA","repeats":1},{"count":917504,"lower_bound":"A4AAAAAADYAB","upper_bound":"A4AAAAAADgAA","repeats":1},{"count":950272,"lower_bound":"A4AAAAAADgAB","upper_bound":"A4AAAAAADoAA","repeats":1},{"count":983040,"lower_bound":"A4AAAAAADoAB","upper_bound":"A4AAAAAADwAA","repeats":1},{"count":1015808,"lower_bound":"A4AAAAAADwAB","upper_bound":"A4AAAAAAD4AA","repeats":1},{"count":1048576,"lower_bound":"A4AAAAAAD4AB","upper_bound":"A4AAAAAAEAAA","repeats":1},{"count":1081344,"lower_bound":"A4AAAAAAEAAB","upper_bound":"A4AAAAAAEIAA","repeats":1},{"count":1114112,"lower_bound":"A4AAAAAAEIAB","upper_bound":"A4AAAAAAEQAA","repeats":1},{"count":1146880,"lower_bound":"A4AAAAAAEQAB","upper_bound":"A4AAAAAAEYAA","repeats":1},{"count":1179648,"lower_bound":"A4AAAAAAEYAB","upper_bound":"A4AAAAAAEgAA","repeats":1},{"count":1212416,"lower_bound":"A4AAAAAAEgAB","upper_bound":"A4AAAAAAEoAA","repeats":1},{"count":1245184,"lower_bound":"A4AAAAAAEoAB","upper_bound":"A4AAAAAAEwAA","repeats":1},{"count":1277952,"lower_bound":"A4AAAAAAEwAB","upper_bound":"A4AAAAAAE4AA","repeats":1},{"count":1310720,"lower_bound":"A4AAAAAAE4AB","upper_bound":"A4AAAAAAFAAA","repeats":1},{"count":1343488,"lower_bound":"A4AAAAAAFAAB","upper_bound":"A4AAAAAAFIAA","repeats":1},{"count":1376256,"lower_bound":"A4AAAAAAFIAB","upper_bound":"A4AAAAAAFQAA","repeats":1},{"count":1409024,"lower_bound":"A4AAAAAAFQAB","upper_bound":"A4AAAAAAFYAA","repeats":1},{"count":1441792,"lower_bound":"A4AAAAAAFYAB","upper_bound":"A4AAAAAAFgAA","repeats":1},{"count":1474560,"lower_bound":"A4AAAAAAFgAB","upper_bound":"A4AAAAAAFoAA","repeats":1},{"count":1507328,"lower_bound":"A4AAAAAAFoAB","upper_bound":"A4AAAAAAFwAA","repeats":1},{"count":1540096,"lower_bound":"A4AAAAAAFwAB","upper_bound":"A4AAAAAAF4AA","repeats":1},{"count":1572864,"lower_bound":"A4AAAAAAF4AB","upper_bound":"A4AAAAAAGAAA","repeats":1},{"count":1605632,"lower_bound":"A4AAAAAAGAAB","upper_bound":"A4AAAAAAGIAA","repeats":1},{"count":1638400,"lower_bound":"A4AAAAAAGIAB","upper_bound":"A4AAAAAAGQAA","repeats":1},{"count":1671168,"lower_bound":"A4AAAAAAGQAB","upper_bound":"A4AAAAAAGYAA","repeats":1},{"count":1703936,"lower_bound":"A4AAAAAAGYAB","upper_bound":"A4AAAAAAGgAA","repeats":1},{"count":1736704,"lower_bound":"A4AAAAAAGgAB","upper_bound":"A4AAAAAAGoAA","repeats":1},{"count":1769472,"lower_bound":"A4AAAAAAGoAB","upper_bound":"A4AAAAAAGwAA","repeats":1},{"count":1802240,"lower_bound":"A4AAAAAAGwAB","upper_bound":"A4AAAAAAG4AA","repeats":1},{"count":1835008,"lower_bound":"A4AAAAAAG4AB","upper_bound":"A4AAAAAAHAAA","repeats":1},{"count":1867776,"lower_bound":"A4AAAAAAHAAB","upper_bound":"A4AAAAAAHIAA","repeats":1},{"count":1900544,"lower_bound":"A4AAAAAAHIAB","upper_bound":"A4AAAAAAHQAA","repeats":1},{"count":1933312,"lower_bound":"A4AAAAAAHQAB","upper_bound":"A4AAAAAAHYAA","repeats":1},{"count":1966080,"lower_bound":"A4AAAAAAHYAB","upper_bound":"A4AAAAAAHgAA","repeats":1},{"count":1998848,"lower_bound":"A4AAAAAAHgAB","upper_bound":"A4AAAAAAHoAA","repeats":1},{"count":2031616,"lower_bound":"A4AAAAAAHoAB","upper_bound":"A4AAAAAAHwAA","repeats":1},{"count":2064384,"lower_bound":"A4AAAAAAHwAB","upper_bound":"A4AAAAAAH4AA","repeats":1},{"count":2097152,"lower_bound":"A4AAAAAAH4AB","upper_bound":"A4AAAAAAIAAA","repeats":1},{"count":2129920,"lower_bound":"A4AAAAAAIAAB","upper_bound":"A4AAAAAAIIAA","repeats":1},{"count":2162688,"lower_bound":"A4AAAAAAIIAB","upper_bound":"A4AAAAAAIQAA","repeats":1},{"count":2195456,"lower_bound":"A4AAAAAAIQAB","upper_bound":"A4AAAAAAIYAA","repeats":1},{"count":2228224,"lower_bound":"A4AAAAAAIYAB","upper_bound":"A4AAAAAAIgAA","repeats":1},{"count":2260992,"lower_bound":"A4AAAAAAIgAB","upper_bound":"A4AAAAAAIoAA","repeats":1},{"count":2293760,"lower_bound":"A4AAAAAAIoAB","upper_bound":"A4AAAAAAIwAA","repeats":1},{"count":2326528,"lower_bound":"A4AAAAAAIwAB","upper_bound":"A4AAAAAAI4AA","repeats":1},{"count":2359296,"lower_bound":"A4AAAAAAI4AB","upper_bound":"A4AAAAAAJAAA","repeats":1},{"count":2392064,"lower_bound":"A4AAAAAAJAAB","upper_bound":"A4AAAAAAJIAA","repeats":1},{"count":2424832,"lower_bound":"A4AAAAAAJIAB","upper_bound":"A4AAAAAAJQAA","repeats":1},{"count":2457600,"lower_bound":"A4AAAAAAJQAB","upper_bound":"A4AAAAAAJYAA","repeats":1},{"count":2490368,"lower_bound":"A4AAAAAAJYAB","upper_bound":"A4AAAAAAJgAA","repeats":1},{"count":2523136,"lower_bound":"A4AAAAAAJgAB","upper_bound":"A4AAAAAAJoAA","repeats":1},{"count":2555904,"lower_bound":"A4AAAAAAJoAB","upper_bound":"A4AAAAAAJwAA","repeats":1},{"count":2588672,"lower_bound":"A4AAAAAAJwAB","upper_bound":"A4AAAAAAJ4AA","repeats":1},{"count":2621440,"lower_bound":"A4AAAAAAJ4AB","upper_bound":"A4AAAAAAKAAA","repeats":1},{"count":2654208,"lower_bound":"A4AAAAAAKAAB","upper_bound":"A4AAAAAAKIAA","repeats":1},{"count":2686976,"lower_bound":"A4AAAAAAKIAB","upper_bound":"A4AAAAAAKQAA","repeats":1},{"count":2719744,"lower_bound":"A4AAAAAAKQAB","upper_bound":"A4AAAAAAKYAA","repeats":1},{"count":2752512,"lower_bound":"A4AAAAAAKYAB","upper_bound":"A4AAAAAAKgAA","repeats":1},{"count":2785280,"lower_bound":"A4AAAAAAKgAB","upper_bound":"A4AAAAAAKoAA","repeats":1},{"count":2818048,"lower_bound":"A4AAAAAAKoAB","upper_bound":"A4AAAAAAKwAA","repeats":1},{"count":2850816,"lower_bound":"A4AAAAAAKwAB","upper_bound":"A4AAAAAAK4AA","repeats":1},{"count":2883584,"lower_bound":"A4AAAAAAK4AB","upper_bound":"A4AAAAAALAAA","repeats":1},{"count":2916352,"lower_bound":"A4AAAAAALAAB","upper_bound":"A4AAAAAALIAA","repeats":1},{"count":2949120,"lower_bound":"A4AAAAAALIAB","upper_bound":"A4AAAAAALQAA","repeats":1},{"count":2981888,"lower_bound":"A4AAAAAALQAB","upper_bound":"A4AAAAAALYAA","repeats":1},{"count":3014656,"lower_bound":"A4AAAAAALYAB","upper_bound":"A4AAAAAALgAA","repeats":1},{"count":3047424,"lower_bound":"A4AAAAAALgAB","upper_bound":"A4AAAAAALoAA","repeats":1},{"count":3080192,"lower_bound":"A4AAAAAALoAB","upper_bound":"A4AAAAAALwAA","repeats":1},{"count":3112960,"lower_bound":"A4AAAAAALwAB","upper_bound":"A4AAAAAAL4AA","repeats":1},{"count":3145728,"lower_bound":"A4AAAAAAL4AB","upper_bound":"A4AAAAAAMAAA","repeats":1},{"count":3178496,"lower_bound":"A4AAAAAAMAAB","upper_bound":"A4AAAAAAMIAA","repeats":1},{"count":3211264,"lower_bound":"A4AAAAAAMIAB","upper_bound":"A4AAAAAAMQAA","repeats":1},{"count":3244032,"lower_bound":"A4AAAAAAMQAB","upper_bound":"A4AAAAAAMYAA","repeats":1},{"count":3276800,"lower_bound":"A4AAAAAAMYAB","upper_bound":"A4AAAAAAMgAA","repeats":1},{"count":3309568,"lower_bound":"A4AAAAAAMgAB","upper_bound":"A4AAAAAAMoAA","repeats":1},{"count":3342336,"lower_bound":"A4AAAAAAMoAB","upper_bound":"A4AAAAAAMwAA","repeats":1},{"count":3375104,"lower_bound":"A4AAAAAAMwAB","upper_bound":"A4AAAAAAM4AA","repeats":1},{"count":3407872,"lower_bound":"A4AAAAAAM4AB","upper_bound":"A4AAAAAANAAA","repeats":1},{"count":3440640,"lower_bound":"A4AAAAAANAAB","upper_bound":"A4AAAAAANIAA","repeats":1},{"count":3473408,"lower_bound":"A4AAAAAANIAB","upper_bound":"A4AAAAAANQAA","repeats":1},{"count":3506176,"lower_bound":"A4AAAAAANQAB","upper_bound":"A4AAAAAANYAA","repeats":1},{"count":3538944,"lower_bound":"A4AAAAAANYAB","upper_bound":"A4AAAAAANgAA","repeats":1},{"count":3571712,"lower_bound":"A4AAAAAANgAB","upper_bound":"A4AAAAAANoAA","repeats":1},{"count":3604480,"lower_bound":"A4AAAAAANoAB","upper_bound":"A4AAAAAANwAA","repeats":1},{"count":3637248,"lower_bound":"A4AAAAAANwAB","upper_bound":"A4AAAAAAN4AA","repeats":1},{"count":3670016,"lower_bound":"A4AAAAAAN4AB","upper_bound":"A4AAAAAAOAAA","repeats":1},{"count":3702784,"lower_bound":"A4AAAAAAOAAB","upper_bound":"A4AAAAAAOIAA","repeats":1},{"count":3735552,"lower_bound":"A4AAAAAAOIAB","upper_bound":"A4AAAAAAOQAA","repeats":1},{"count":3768320,"lower_bound":"A4AAAAAAOQAB","upper_bound":"A4AAAAAAOYAA","repeats":1},{"count":3801088,"lower_bound":"A4AAAAAAOYAB","upper_bound":"A4AAAAAAOgAA","repeats":1},{"count":3833856,"lower_bound":"A4AAAAAAOgAB","upper_bound":"A4AAAAAAOoAA","repeats":1},{"count":3866624,"lower_bound":"A4AAAAAAOoAB","upper_bound":"A4AAAAAAOwAA","repeats":1},{"count":3899392,"lower_bound":"A4AAAAAAOwAB","upper_bound":"A4AAAAAAO4AA","repeats":1},{"count":3932160,"lower_bound":"A4AAAAAAO4AB","upper_bound":"A4AAAAAAPAAA","repeats":1},{"count":3964928,"lower_bound":"A4AAAAAAPAAB","upper_bound":"A4AAAAAAPIAA","repeats":1},{"count":3997696,"lower_bound":"A4AAAAAAPIAB","upper_bound":"A4AAAAAAPQAA","repeats":1},{"count":4030464,"lower_bound":"A4AAAAAAPQAB","upper_bound":"A4AAAAAAPYAA","repeats":1},{"count":4063232,"lower_bound":"A4AAAAAAPYAB","upper_bound":"A4AAAAAAPgAA","repeats":1},{"count":4096000,"lower_bound":"A4AAAAAAPgAB","upper_bound":"A4AAAAAAPoAA","repeats":1},{"count":4128768,"lower_bound":"A4AAAAAAPoAB","upper_bound":"A4AAAAAAPwAA","repeats":1},{"count":4161536,"lower_bound":"A4AAAAAAPwAB","upper_bound":"A4AAAAAAP4AA","repeats":1},{"count":4194304,"lower_bound":"A4AAAAAAP4AB","upper_bound":"A4AAAAAAQAAA","repeats":1},{"count":4227072,"lower_bound":"A4AAAAAAQAAB","upper_bound":"A4AAAAAAQIAA","repeats":1},{"count":4259840,"lower_bound":"A4AAAAAAQIAB","upper_bound":"A4AAAAAAQQAA","repeats":1},{"count":4292608,"lower_bound":"A4AAAAAAQQAB","upper_bound":"A4AAAAAAQYAA","repeats":1},{"count":4325376,"lower_bound":"A4AAAAAAQYAB","upper_bound":"A4AAAAAAQgAA","repeats":1},{"count":4358144,"lower_bound":"A4AAAAAAQgAB","upper_bound":"A4AAAAAAQoAA","repeats":1},{"count":4390912,"lower_bound":"A4AAAAAAQoAB","upper_bound":"A4AAAAAAQwAA","repeats":1},{"count":4423680,"lower_bound":"A4AAAAAAQwAB","upper_bound":"A4AAAAAAQ4AA","repeats":1},{"count":4456448,"lower_bound":"A4AAAAAAQ4AB","upper_bound":"A4AAAAAARAAA","repeats":1},{"count":4489216,"lower_bound":"A4AAAAAARAAB","upper_bound":"A4AAAAAARIAA","repeats":1},{"count":4521984,"lower_bound":"A4AAAAAARIAB","upper_bound":"A4AAAAAARQAA","repeats":1},{"count":4554752,"lower_bound":"A4AAAAAARQAB","upper_bound":"A4AAAAAARYAA","repeats":1},{"count":4587520,"lower_bound":"A4AAAAAARYAB","upper_bound":"A4AAAAAARgAA","repeats":1},{"count":4620288,"lower_bound":"A4AAAAAARgAB","upper_bound":"A4AAAAAARoAA","repeats":1},{"count":4653056,"lower_bound":"A4AAAAAARoAB","upper_bound":"A4AAAAAARwAA","repeats":1},{"count":4685824,"lower_bound":"A4AAAAAARwAB","upper_bound":"A4AAAAAAR4AA","repeats":1},{"count":4718592,"lower_bound":"A4AAAAAAR4AB","upper_bound":"A4AAAAAASAAA","repeats":1},{"count":4751360,"lower_bound":"A4AAAAAASAAB","upper_bound":"A4AAAAAASIAA","repeats":1},{"count":4784128,"lower_bound":"A4AAAAAASIAB","upper_bound":"A4AAAAAASQAA","repeats":1},{"count":4816896,"lower_bound":"A4AAAAAASQAB","upper_bound":"A4AAAAAASYAA","repeats":1},{"count":4849664,"lower_bound":"A4AAAAAASYAB","upper_bound":"A4AAAAAASgAA","repeats":1},{"count":4882432,"lower_bound":"A4AAAAAASgAB","upper_bound":"A4AAAAAASoAA","repeats":1},{"count":4915200,"lower_bound":"A4AAAAAASoAB","upper_bound":"A4AAAAAASwAA","repeats":1},{"count":4947968,"lower_bound":"A4AAAAAASwAB","upper_bound":"A4AAAAAAS4AA","repeats":1},{"count":4980736,"lower_bound":"A4AAAAAAS4AB","upper_bound":"A4AAAAAATAAA","repeats":1},{"count":5000000,"lower_bound":"A4AAAAAATAAB","upper_bound":"A4AAAAAATEtA","repeats":1}]},"cm_sketch":{"rows":[{"counters":[2497,2468,2447,2444,2467,2448,2562,2457,2437,2466,2511,2460,2508,2561,2520,2461,2486,2445,2404,2450,2466,2468,2438,2469,2492,2496,2529,2550,2519,2398,2470,2375,2482,2479,2484,2455,2471,2374,2434,2383,2444,2377,2343,2403,2492,2435,2460,2378,2449,2521,2393,2378,2390,2487,2461,2445,2363,2358,2496,2395,2424,2418,2358,2491,2478,2473,2404,2467,2399,2337,2455,2438,2430,2445,2388,2449,2494,2472,2450,2408,2577,2398,2470,2363,2376,2457,2513,2421,2451,2461,2557,2417,2421,2477,2430,2429,2420,2446,2417,2534,2399,2493,2395,2443,2502,2465,2327,2407,2419,2450,2441,2406,2372,2488,2474,2427,2488,2418,2397,2458,2432,2498,2436,2466,2423,2472,2545,2484,2384,2505,2434,2441,2407,2445,2439,2374,2444,2475,2447,2477,2450,2434,2442,2440,2402,2460,2493,2452,2504,2526,2407,2358,2448,2411,2452,2469,2418,2470,2526,2402,2461,2450,2391,2441,2472,2451,2480,2426,2490,2409,2396,2446,2372,2415,2458,2443,2485,2480,2428,2433,2425,2428,2382,2396,2436,2407,2535,2426,2465,2495,2407,2445,2577,2425,2494,2489,2520,2432,2368,2369,2429,2459,2431,2416,2453,2413,2438,2430,2489,2460,2412,2450,2412,2411,2453,2392,2324,2469,2447,2435,2423,2462,2427,2448,2401,2446,2403,2393,2452,2433,2472,2428,2448,2433,2447,2525,2444,2481,2430,2421,2383,2411,2398,2402,2519,2363,2442,2501,2464,2469,2447,2356,2353,2445,2365,2402,2443,2345,2402,2432,2446,2405,2461,2406,2406,2426,2447,2366,2269,2441,2500,2420,2349,2409,2406,2470,2489,2525,2451,2458,2472,2539,2460,2498,2425,2369,2372,2361,2407,2516,2438,2377,2371,2336,2476,2453,2405,2456,2447,2455,2478,2458,2430,2407,2468,2469,2413,2459,2399,2410,2401,2490,2483,2445,2411,2467,2478,2415,2441,2485,2440,2486,2406,2460,2324,2547,2472,2480,2513,2388,2389,2409,2379,2406,2491,2438,2411,2375,2479,2514,2454,2384,2496,2402,2393,2537,2487,2490,2477,2478,2458,2477,2416,2453,2443,2370,2437,2413,2402,2353,2441,2485,2427,2450,2393,2501,2401,2396,2423,2417,2423,2436,2519,2414,2464,2352,2424,2506,2467,2391,2341,2473,2457,2458,2520,2503,2379,2385,2396,2475,2495,2360,2519,2452,2471,2401,2463,2485,2472,2416,2505,2435,2408,2378,2464,2428,2412,2502,2476,2459,2476,2448,2520,2409,2300,2420,2375,2483,2488,2432,2478,2512,2413,2414,2527,2341,2458,2483,2414,2331,2508,2471,2490,2442,2411,2426,2348,2426,2389,2327,2418,2455,2443,2449,2392,2488,2382,2420,2402,2507,2441,2451,2440,2413,2405,2457,2541,2335,2463,2470,2513,2433,2466,2447,2551,2412,2478,2500,2523,2415,2451,2418,2358,2440,2463,2396,2516,2441,2399,2469,2403,2389,2385,2404,2436,2409,2491,2395,2485,2463,2461,2525,2397,2396,2338,2346,2486,2385,2382,2474,2523,2434,2375,2386,2433,2489,2448,2422,2412,2559,2454,2437,2329,2536,2393,2330,2494,2537,2573,2383,2384,2553,2487,2434,2434,2414,2444,2512,2449,2386,2492,2412,2413,2447,2421,2462,2540,2442,2409,2388,2489,2449,2407,2427,2401,2406,2456,2485,2405,2452,2475,2535,2445,2383,2402,2477,2375,2375,2496,2399,2461,2466,2366,2452,2414,2453,2402,2518,2427,2401,2504,2465,2483,2428,2400,2436,2482,2430,2412,2414,2462,2454,2353,2497,2518,2447,2462,2394,2356,2379,2352,2431,2331,2439,2496,2459,2427,2408,2489,2398,2411,2400,2461,2397,2441,2405,2376,2409,2508,2415,2372,2439,2355,2401,2439,2442,2408,2434,2413,2429,2433,2427,2439,2450,2408,2433,2398,2418,2395,2383,2392,2433,2459,2366,2448,2430,2432,2431,2443,2363,2564,2395,2499,2457,2421,2412,2494,2485,2479,2446,2477,2449,2503,2531,2410,2422,2428,2423,2424,2495,2478,2400,2431,2518,2380,2461,2487,2506,2496,2404,2525,2434,2457,2421,2398,2495,2397,2501,2423,2370,2390,2456,2420,2512,2492,2444,2440,2507,2448,2431,2421,2434,2459,2474,2417,2477,2392,2350,2400,2446,2427,2402,2429,2525,2483,2409,2401,2447,2467,2474,2395,2454,2538,2487,2419,2413,2533,2362,2338,2428,2389,2426,2505,2469,2429,2458,2481,2512,2365,2407,2368,2477,2552,2443,2377,2461,2390,2429,2422,2466,2386,2370,2435,2414,2504,2455,2468,2423,2441,2391,2493,2431,2468,2399,2384,2395,2458,2464,2460,2392,2402,2434,2381,2538,2508,2413,2478,2454,2467,2441,2444,2454,2393,2500,2416,2364,2604,2494,2474,2454,2389,2423,2441,2412,2517,2446,2402,2383,2477,2354,2469,2421,2445,2439,2420,2425,2373,2439,2416,2396,2449,2436,2396,2488,2402,2477,2492,2431,2431,2408,2483,2391,2438,2393,2447,2357,2539,2452,2450,2443,2439,2406,2482,2401,2455,2412,2452,2411,2443,2446,2476,2439,2319,2381,2503,2481,2464,2414,2402,2531,2485,2382,2468,2478,2482,2479,2404,2493,2511,2429,2411,2378,2456,2532,2425,2386,2487,2440,2418,2394,2406,2430,2389,2514,2488,2468,2496,2451,2511,2512,2484,2454,2503,2459,2406,2420,2482,2453,2344,2489,2466,2353,2486,2349,2461,2410,2491,2402,2430,2402,2488,2441,2483,2425,2439,2480,2419,2390,2354,2506,2399,2531,2477,2519,2433,2415,2510,2553,2458,2416,2401,2498,2517,2473,2414,2462,2450,2497,2436,2410,2457,2482,2441,2344,2478,2405,2387,2428,2360,2395,2434,2460,2419,2494,2476,2426,2497,2409,2517,2472,2461,2462,2480,2465,2530,2362,2419,2524,2474,2468,2456,2446,2530,2403,2387,2438,2440,2515,2375,2520,2393,2385,2373,2471,2377,2445,2370,2372,2455,2412,2353,2415,2406,2468,2420,2458,2366,2494,2393,2547,2430,2466,2438,2457,2496,2368,2455,2499,2500,2510,2425,2477,2387,2427,2468,2479,2388,2478,2347,2412,2433,2471,2447,2378,2475,2529,2365,2454,2511,2423,2382,2404,2397,2439,2444,2512,2505,2473,2466,2358,2455,2512,2499,2428,2388,2491,2368,2409,2534,2393,2440,2509,2405,2527,2385,2376,2403,2385,2408,2443,2441,2460,2482,2482,2362,2527,2521,2412,2491,2428,2507,2373,2439,2433,2402,2513,2396,2424,2510,2448,2386,2384,2492,2478,2483,2475,2409,2450,2425,2376,2513,2530,2418,2502,2354,2490,2479,2428,2450,2499,2380,2414,2361,2408,2393,2438,2469,2394,2460,2284,2438,2405,2387,2481,2335,2436,2405,2464,2424,2409,2485,2483,2542,2447,2527,2509,2424,2384,2456,2433,2407,2406,2497,2402,2389,2421,2538,2352,2420,2426,2410,2453,2347,2454,2485,2392,2447,2443,2462,2468,2368,2453,2421,2389,2436,2401,2543,2484,2434,2359,2431,2495,2429,2401,2400,2552,2473,2337,2385,2527,2324,2466,2424,2432,2466,2451,2484,2488,2501,2449,2446,2379,2460,2484,2412,2468,2467,2365,2470,2470,2400,2522,2389,2461,2358,2479,2395,2446,2446,2450,2502,2387,2430,2473,2504,2451,2559,2506,2390,2490,2458,2460,2512,2467,2422,2432,2420,2354,2443,2403,2474,2476,2396,2452,2378,2382,2420,2448,2397,2377,2376,2518,2419,2434,2449,2398,2437,2537,2390,2413,2424,2461,2432,2520,2439,2464,2380,2472,2454,2344,2564,2431,2453,2433,2478,2441,2426,2427,2460,2398,2412,2440,2405,2411,2521,2499,2418,2462,2435,2382,2493,2458,2474,2384,2406,2370,2413,2425,2472,2384,2415,2506,2497,2360,2436,2493,2441,2386,2412,2460,2444,2451,2417,2475,2418,2372,2446,2514,2382,2448,2458,2437,2458,2467,2390,2460,2425,2398,2400,2442,2433,2374,2502,2451,2515,2521,2419,2425,2398,2454,2507,2498,2484,2465,2460,2442,2383,2441,2389,2460,2407,2466,2437,2489,2374,2492,2538,2432,2430,2415,2450,2442,2465,2449,2401,2502,2434,2381,2457,2468,2412,2415,2475,2483,2357,2451,2479,2381,2457,2412,2472,2342,2476,2411,2414,2417,2465,2349,2398,2526,2434,2486,2428,2436,2549,2446,2427,2463,2521,2549,2483,2442,2517,2437,2408,2434,2356,2426,2473,2369,2430,2399,2464,2443,2537,2407,2460,2462,2447,2522,2432,2499,2452,2470,2421,2444,2382,2473,2503,2465,2523,2443,2514,2401,2386,2541,2420,2475,2354,2433,2480,2507,2486,2452,2411,2486,2457,2440,2367,2462,2479,2370,2479,2506,2489,2463,2368,2460,2450,2445,2421,2407,2473,2433,2385,2481,2501,2348,2458,2467,2426,2443,2512,2490,2419,2330,2427,2390,2411,2539,2386,2360,2376,2370,2460,2493,2515,2402,2450,2394,2370,2402,2465,2455,2470,2468,2473,2448,2446,2414,2480,2420,2409,2477,2410,2396,2361,2449,2444,2438,2437,2430,2383,2569,2407,2418,2381,2354,2558,2542,2364,2398,2479,2409,2450,2509,2406,2442,2390,2456,2482,2462,2462,2430,2379,2458,2509,2424,2497,2443,2528,2466,2464,2387,2418,2459,2468,2400,2422,2479,2475,2458,2416,2421,2449,2436,2501,2462,2479,2412,2439,2486,2410,2373,2490,2364,2440,2392,2526,2476,2383,2439,2471,2433,2469,2411,2490,2520,2310,2412,2424,2356,2382,2496,2476,2472,2436,2447,2526,2486,2422,2430,2500,2451,2460,2403,2348,2463,2429,2396,2446,2428,2377,2430,2503,2428,2407,2474,2441,2473,2441,2385,2475,2385,2453,2465,2448,2413,2506,2344,2474,2424,2414,2426,2483,2499,2513,2464,2536,2398,2304,2480,2438,2352,2335,2508,2428,2586,2414,2521,2412,2413,2434,2441,2468,2436,2415,2443,2482,2462,2486,2377,2398,2452,2444,2479,2462,2515,2440,2450,2417,2468,2449,2488,2407,2425,2444,2477,2381,2343,2458,2372,2499,2472,2470,2468,2404,2478,2427,2399,2389,2475,2445,2474,2401,2410,2386,2407,2441,2346,2498,2417,2513,2448,2447,2413,2481,2464,2390,2456,2416,2471,2463,2514,2430,2499,2404,2399,2455,2504,2387,2494,2416,2440,2401,2541,2435,2436,2413,2433,2463,2353,2479,2414,2428,2435,2393,2499,2399,2461,2430,2391,2453,2446,2422,2432,2487,2352,2481,2450,2430,2483,2454,2445,2456,2411,2405,2525,2390,2504,2438,2451,2443,2427,2492,2476,2483,2370,2430,2383,2464,2513,2548,2454,2489,2468,2388,2442,2426,2485,2558,2404,2374,2380,2443,2559,2412,2405,2472,2402,2437,2472,2419,2442,2410,2330,2398,2461,2391,2435,2371,2421,2417,2537,2456,2362,2422,2532,2468,2442,2418,2444,2449,2492,2578,2537,2392,2418,2469,2510,2522,2399,2366,2420,2490,2406,2463,2474,2554,2395,2409,2515,2473,2446,2502,2452,2468,2428,2422,2415,2490,2357,2442,2475,2448,2388,2427,2389,2404,2420,2482,2384,2422,2436,2428,2562,2447,2461,2462,2417,2427,2496,2460,2439,2354,2366,2354,2404,2447,2436,2464,2361,2413,2352,2518,2306,2374,2414,2441,2507,2441,2445,2514,2551,2494,2415,2466,2475,2454,2388,2441,2488,2522,2427,2484,2437,2420,2456,2479,2346,2424,2535,2425,2559,2527,2510,2425,2486,2523,2426,2454,2408,2507,2482,2393,2457,2445,2441,2390,2475,2475,2401,2369,2430,2511,2509,2429,2515,2405,2468,2444,2445,2460,2381,2503,2379,2432,2457,2385,2444,2463,2414,2364,2571,2413,2460,2386,2400,2498,2489,2477,2480,2377,2423,2327,2534,2446,2417,2404,2522,2370,2458,2468,2429,2363,2404,2387,2548,2496,2452,2430,2399,2442,2452,2482,2414,2501,2440,2404,2436,2490,2415,2421,2409,2409,2328,2483,2477,2502,2400,2410,2470,2414,2485,2437,2528,2388,2385,2453,2406,2514,2348,2377,2405,2352,2554,2494,2450,2382,2468,2451,2444,2425,2611,2474,2382,2461,2474,2415,2524,2497,2407,2458,2514,2460,2539,2421,2500,2467,2439,2379,2322,2449,2477,2466,2418,2339,2396,2452,2364,2407,2508,2442,2372,2462,2313,2467,2462,2451,2496,2412,2454,2457,2463,2442,2401,2498,2373,2477,2373,2531,2531,2435,2433,2443,2391,2453,2455,2385,2409,2450,2474,2441,2440,2398,2367,2397,2420,2466,2405,2406,2486,2431,2477,2523,2493,2376,2528,2444,2506,2392,2415,2434,2415,2452,2447,2452,2464]},{"counters":[2410,2467,2507,2420,2368,2488,2379,2392,2493,2422,2378,2422,2409,2446,2445,2464,2450,2496,2426,2447,2488,2369,2512,2420,2477,2449,2452,2469,2399,2425,2453,2436,2421,2360,2406,2350,2523,2366,2508,2429,2391,2436,2435,2439,2410,2403,2430,2478,2426,2425,2415,2436,2387,2408,2365,2469,2455,2492,2323,2428,2492,2410,2423,2424,2512,2449,2461,2479,2539,2407,2410,2418,2487,2436,2453,2468,2419,2353,2450,2410,2387,2443,2457,2462,2438,2356,2498,2406,2415,2508,2394,2431,2480,2424,2388,2436,2479,2456,2383,2513,2391,2504,2473,2397,2409,2397,2491,2498,2513,2480,2382,2379,2389,2458,2444,2385,2419,2485,2416,2484,2308,2486,2493,2550,2482,2447,2417,2425,2526,2410,2428,2433,2402,2549,2556,2313,2399,2386,2531,2459,2445,2443,2472,2448,2460,2419,2457,2382,2488,2467,2521,2445,2469,2391,2466,2418,2454,2458,2479,2454,2449,2456,2396,2446,2399,2414,2458,2334,2446,2431,2453,2455,2490,2412,2455,2499,2436,2414,2475,2438,2445,2506,2391,2428,2385,2546,2386,2397,2451,2432,2412,2391,2512,2457,2461,2397,2446,2534,2448,2508,2387,2338,2488,2498,2367,2499,2448,2407,2390,2432,2418,2441,2474,2493,2465,2300,2505,2433,2606,2493,2474,2379,2452,2440,2411,2381,2379,2393,2455,2465,2430,2465,2439,2515,2409,2512,2430,2453,2455,2431,2536,2425,2473,2502,2446,2457,2458,2376,2536,2430,2438,2458,2466,2380,2534,2409,2462,2460,2413,2448,2506,2529,2372,2432,2455,2454,2462,2540,2382,2584,2441,2412,2464,2388,2477,2431,2423,2444,2409,2439,2400,2393,2398,2408,2478,2414,2407,2481,2425,2464,2514,2484,2382,2393,2533,2441,2403,2449,2400,2542,2414,2341,2360,2402,2366,2384,2390,2450,2458,2410,2484,2398,2375,2424,2484,2449,2451,2447,2551,2504,2451,2492,2406,2465,2343,2457,2485,2508,2506,2431,2407,2460,2448,2411,2410,2491,2539,2530,2438,2428,2532,2428,2434,2453,2373,2463,2496,2490,2357,2451,2388,2379,2480,2492,2445,2514,2475,2412,2460,2332,2476,2357,2516,2477,2406,2364,2281,2502,2413,2440,2373,2387,2378,2473,2519,2467,2489,2331,2435,2408,2433,2516,2472,2405,2407,2397,2399,2350,2417,2356,2456,2397,2453,2438,2421,2477,2457,2531,2382,2437,2440,2460,2396,2446,2331,2427,2475,2433,2425,2494,2411,2507,2584,2427,2539,2377,2265,2467,2481,2398,2458,2503,2514,2430,2370,2347,2434,2463,2564,2448,2457,2459,2489,2320,2449,2500,2405,2408,2491,2461,2486,2490,2368,2394,2456,2454,2451,2418,2421,2417,2456,2448,2399,2490,2467,2475,2441,2385,2566,2401,2402,2349,2496,2417,2490,2433,2388,2436,2486,2417,2418,2440,2387,2446,2397,2435,2447,2427,2357,2432,2497,2469,2370,2445,2396,2384,2417,2359,2424,2468,2510,2465,2415,2431,2393,2365,2513,2515,2406,2538,2452,2455,2487,2435,2445,2401,2508,2437,2534,2445,2392,2520,2358,2367,2404,2439,2441,2431,2394,2428,2400,2415,2442,2483,2516,2404,2500,2398,2454,2494,2338,2380,2418,2467,2399,2480,2415,2461,2457,2492,2400,2490,2492,2413,2401,2413,2378,2430,2436,2412,2308,2446,2338,2543,2438,2464,2499,2493,2507,2433,2446,2510,2365,2378,2437,2347,2402,2472,2539,2400,2458,2452,2323,2398,2507,2536,2547,2339,2414,2405,2401,2461,2399,2452,2470,2478,2368,2409,2412,2415,2434,2334,2461,2474,2433,2464,2436,2452,2411,2415,2398,2504,2372,2408,2404,2462,2476,2424,2505,2365,2531,2390,2430,2505,2482,2456,2522,2465,2398,2477,2357,2459,2520,2538,2398,2481,2391,2375,2472,2458,2424,2480,2422,2443,2511,2475,2407,2467,2402,2391,2479,2435,2523,2424,2431,2420,2474,2485,2468,2468,2350,2342,2461,2492,2466,2427,2421,2466,2465,2536,2426,2366,2453,2393,2444,2509,2405,2375,2454,2403,2395,2473,2413,2456,2449,2512,2415,2471,2458,2434,2394,2399,2439,2385,2451,2417,2406,2392,2473,2364,2471,2422,2553,2423,2326,2472,2442,2483,2436,2487,2514,2411,2377,2518,2428,2406,2416,2439,2429,2423,2440,2385,2496,2405,2284,2403,2393,2461,2418,2491,2374,2521,2511,2360,2431,2436,2411,2509,2466,2510,2389,2417,2418,2416,2493,2445,2451,2553,2481,2411,2402,2532,2410,2492,2445,2402,2519,2408,2461,2426,2397,2408,2395,2422,2446,2523,2471,2470,2497,2388,2488,2429,2511,2445,2430,2384,2494,2469,2519,2487,2420,2535,2433,2397,2558,2389,2485,2441,2458,2477,2384,2435,2459,2552,2458,2392,2496,2420,2380,2454,2417,2459,2423,2547,2423,2430,2486,2411,2455,2372,2555,2493,2505,2431,2443,2406,2442,2405,2474,2284,2427,2451,2496,2409,2461,2468,2440,2504,2411,2465,2491,2417,2526,2409,2485,2358,2387,2405,2435,2413,2409,2383,2393,2378,2459,2498,2502,2414,2483,2462,2463,2426,2395,2489,2466,2489,2457,2437,2392,2472,2469,2380,2380,2444,2452,2453,2455,2456,2495,2367,2442,2419,2371,2429,2445,2375,2464,2439,2436,2468,2401,2504,2420,2422,2373,2475,2427,2484,2442,2448,2452,2431,2445,2401,2391,2471,2514,2272,2491,2398,2437,2494,2502,2430,2447,2462,2484,2398,2429,2518,2276,2361,2494,2444,2437,2427,2447,2460,2461,2440,2473,2393,2412,2397,2452,2365,2495,2478,2429,2440,2382,2439,2417,2526,2455,2448,2480,2427,2398,2409,2435,2451,2404,2484,2451,2528,2483,2503,2398,2406,2469,2391,2330,2464,2525,2420,2428,2447,2436,2428,2415,2440,2490,2509,2534,2382,2522,2442,2475,2444,2423,2477,2440,2436,2444,2465,2450,2454,2420,2336,2454,2511,2435,2447,2434,2429,2398,2497,2486,2425,2420,2462,2412,2414,2434,2453,2418,2374,2460,2383,2428,2475,2441,2407,2451,2466,2422,2447,2364,2385,2493,2426,2394,2403,2404,2410,2382,2442,2394,2446,2410,2401,2455,2455,2393,2465,2389,2447,2422,2425,2465,2410,2459,2440,2427,2460,2445,2420,2433,2364,2340,2455,2463,2424,2439,2396,2459,2510,2474,2526,2460,2339,2381,2365,2517,2518,2407,2482,2388,2452,2505,2432,2406,2422,2426,2472,2526,2459,2357,2401,2478,2386,2402,2469,2425,2461,2391,2444,2433,2351,2450,2466,2415,2510,2400,2582,2488,2484,2413,2267,2476,2448,2388,2487,2427,2469,2426,2415,2460,2418,2281,2491,2487,2458,2453,2471,2473,2474,2366,2340,2391,2444,2495,2416,2422,2537,2447,2452,2464,2433,2488,2551,2434,2530,2397,2462,2436,2517,2454,2531,2430,2416,2338,2563,2467,2462,2485,2433,2391,2382,2422,2450,2369,2533,2411,2517,2417,2503,2448,2468,2364,2430,2437,2451,2491,2396,2418,2358,2463,2396,2455,2428,2429,2359,2405,2377,2432,2417,2392,2461,2387,2434,2410,2477,2515,2369,2427,2498,2442,2563,2373,2492,2471,2456,2509,2430,2424,2464,2430,2365,2489,2427,2388,2500,2412,2375,2454,2353,2382,2458,2446,2435,2503,2439,2398,2436,2461,2386,2419,2433,2508,2414,2490,2340,2453,2374,2472,2430,2473,2479,2476,2365,2370,2464,2407,2530,2466,2493,2419,2408,2368,2453,2459,2406,2430,2510,2491,2445,2429,2406,2431,2495,2484,2479,2463,2498,2475,2480,2433,2433,2495,2490,2465,2519,2469,2464,2451,2484,2450,2450,2461,2462,2457,2393,2439,2385,2436,2369,2495,2423,2582,2462,2448,2443,2411,2369,2448,2365,2432,2395,2493,2530,2501,2519,2506,2409,2422,2500,2521,2457,2506,2438,2462,2389,2470,2490,2433,2444,2461,2438,2346,2381,2403,2455,2486,2382,2499,2366,2476,2432,2443,2389,2495,2354,2452,2402,2505,2453,2410,2375,2404,2522,2418,2476,2380,2510,2461,2476,2406,2451,2512,2418,2429,2424,2580,2490,2436,2411,2443,2481,2426,2446,2437,2421,2408,2491,2400,2534,2421,2419,2396,2413,2471,2399,2366,2443,2439,2511,2342,2426,2422,2445,2476,2482,2407,2402,2455,2388,2503,2400,2373,2377,2382,2460,2468,2439,2335,2448,2477,2380,2505,2497,2586,2431,2454,2474,2480,2408,2407,2449,2414,2441,2470,2422,2485,2480,2381,2466,2536,2511,2402,2471,2414,2465,2541,2471,2528,2546,2504,2456,2456,2452,2451,2436,2500,2543,2431,2499,2428,2450,2392,2465,2494,2476,2384,2395,2381,2443,2473,2442,2453,2370,2442,2437,2391,2381,2467,2459,2487,2464,2437,2532,2460,2468,2438,2405,2488,2460,2412,2426,2437,2382,2445,2436,2464,2398,2406,2412,2368,2435,2513,2451,2391,2423,2478,2477,2451,2384,2422,2518,2406,2388,2473,2429,2501,2491,2392,2423,2547,2499,2436,2416,2562,2455,2377,2501,2503,2436,2343,2447,2433,2436,2479,2397,2504,2458,2428,2484,2427,2466,2466,2429,2482,2453,2463,2462,2431,2437,2407,2402,2351,2381,2367,2429,2512,2406,2461,2396,2528,2421,2460,2423,2440,2481,2457,2491,2483,2466,2398,2416,2376,2521,2428,2425,2445,2414,2473,2456,2552,2406,2416,2378,2510,2399,2460,2445,2419,2397,2428,2434,2508,2454,2484,2364,2405,2521,2414,2528,2415,2436,2391,2398,2441,2355,2472,2535,2304,2490,2417,2456,2447,2446,2390,2524,2439,2339,2436,2512,2493,2412,2417,2469,2395,2431,2450,2437,2439,2454,2369,2439,2345,2389,2457,2518,2388,2413,2491,2418,2463,2456,2458,2524,2440,2407,2490,2503,2424,2461,2474,2443,2458,2440,2463,2426,2460,2424,2487,2414,2374,2499,2352,2394,2429,2460,2488,2296,2356,2423,2419,2495,2388,2467,2425,2415,2432,2510,2493,2423,2383,2414,2412,2438,2453,2403,2536,2429,2427,2401,2443,2400,2430,2479,2337,2448,2474,2386,2431,2529,2451,2477,2509,2509,2455,2398,2481,2357,2317,2405,2411,2380,2512,2417,2384,2425,2437,2424,2445,2445,2389,2467,2402,2418,2402,2424,2479,2508,2447,2510,2492,2440,2449,2438,2471,2469,2418,2481,2439,2426,2394,2431,2431,2441,2474,2489,2416,2429,2468,2466,2440,2476,2489,2371,2386,2473,2458,2446,2400,2363,2411,2520,2460,2375,2418,2462,2409,2374,2519,2391,2458,2428,2405,2435,2387,2350,2504,2439,2395,2538,2440,2439,2513,2492,2435,2385,2393,2390,2453,2451,2361,2423,2434,2478,2380,2468,2491,2429,2560,2412,2414,2491,2410,2453,2316,2539,2468,2418,2457,2542,2413,2400,2479,2444,2382,2470,2457,2437,2375,2426,2429,2519,2442,2461,2470,2363,2419,2515,2403,2388,2402,2417,2453,2561,2496,2420,2442,2420,2403,2398,2405,2384,2537,2473,2436,2519,2396,2479,2500,2470,2423,2410,2430,2408,2504,2420,2440,2379,2501,2363,2371,2471,2456,2533,2361,2440,2421,2462,2431,2511,2424,2428,2472,2464,2471,2581,2526,2494,2400,2401,2435,2490,2445,2470,2478,2403,2427,2489,2374,2457,2357,2475,2457,2389,2474,2423,2429,2549,2422,2421,2462,2482,2471,2402,2442,2524,2510,2428,2351,2430,2411,2411,2444,2441,2464,2491,2518,2449,2437,2393,2575,2481,2464,2384,2403,2437,2479,2555,2394,2437,2408,2417,2443,2427,2437,2530,2347,2468,2460,2347,2374,2448,2445,2463,2481,2425,2399,2408,2388,2503,2478,2480,2420,2466,2443,2417,2429,2480,2418,2389,2441,2426,2430,2436,2574,2499,2441,2357,2411,2436,2493,2503,2350,2398,2494,2467,2483,2428,2432,2406,2437,2508,2567,2469,2456,2481,2433,2448,2373,2494,2377,2461,2451,2498,2364,2415,2432,2427,2427,2470,2473,2350,2494,2395,2448,2435,2362,2460,2435,2401,2392,2399,2344,2386,2467,2506,2439,2553,2397,2433,2474,2510,2442,2428,2456,2464,2467,2526,2442,2483,2439,2422,2528,2429,2377,2493,2453,2455,2430,2472,2353,2521,2415,2417,2488,2357,2530,2486,2445,2529,2456,2483,2406,2516,2423,2471,2405,2504,2386,2507,2443,2437,2470,2460,2418,2456,2413,2379,2398,2418,2518,2438,2372,2409,2380,2486,2415,2410,2437,2416,2444,2433,2424,2363,2488,2442,2389,2433,2468,2416,2425,2366,2410,2503,2431,2485,2528,2451,2525,2468]},{"counters":[2431,2435,2556,2475,2346,2489,2338,2452,2470,2458,2480,2455,2347,2476,2520,2574,2479,2552,2390,2405,2403,2548,2460,2466,2448,2488,2416,2399,2481,2525,2442,2390,2445,2535,2451,2460,2407,2442,2442,2452,2508,2475,2504,2444,2327,2452,2418,2499,2523,2425,2447,2411,2405,2383,2503,2532,2521,2398,2401,2448,2447,2417,2398,2378,2433,2400,2424,2390,2498,2360,2359,2559,2414,2410,2447,2413,2500,2409,2396,2429,2518,2437,2498,2387,2376,2531,2408,2421,2483,2445,2472,2481,2540,2494,2473,2435,2434,2470,2444,2394,2466,2395,2387,2405,2431,2422,2317,2469,2387,2405,2427,2417,2406,2479,2464,2512,2452,2460,2432,2334,2451,2406,2381,2470,2463,2380,2467,2420,2425,2483,2483,2427,2397,2442,2439,2487,2399,2494,2439,2422,2418,2457,2463,2458,2446,2441,2448,2442,2403,2446,2441,2461,2506,2359,2442,2525,2492,2511,2405,2443,2414,2474,2507,2362,2432,2470,2360,2450,2488,2520,2440,2519,2437,2372,2418,2464,2378,2409,2465,2427,2395,2425,2467,2492,2394,2419,2422,2557,2483,2560,2386,2466,2527,2444,2414,2498,2458,2499,2464,2417,2450,2450,2389,2434,2358,2355,2410,2424,2464,2392,2472,2534,2459,2472,2463,2414,2368,2447,2471,2423,2488,2449,2464,2476,2458,2484,2381,2488,2438,2396,2441,2429,2467,2465,2440,2353,2483,2575,2431,2443,2535,2470,2497,2418,2488,2398,2396,2431,2456,2419,2448,2454,2468,2471,2384,2427,2475,2435,2461,2348,2392,2393,2492,2427,2425,2475,2391,2485,2394,2516,2342,2463,2342,2432,2419,2477,2441,2445,2403,2452,2497,2370,2511,2595,2369,2502,2407,2367,2451,2371,2461,2425,2460,2428,2411,2334,2403,2391,2385,2465,2513,2368,2411,2518,2458,2466,2433,2448,2461,2405,2401,2509,2474,2435,2494,2512,2454,2383,2440,2374,2498,2467,2452,2390,2457,2431,2511,2447,2381,2549,2340,2473,2510,2415,2499,2481,2482,2462,2496,2353,2465,2354,2392,2436,2467,2411,2451,2473,2480,2410,2461,2385,2482,2432,2528,2412,2475,2425,2445,2514,2400,2420,2461,2493,2471,2480,2405,2385,2438,2469,2498,2328,2401,2520,2427,2295,2431,2480,2357,2459,2470,2361,2367,2435,2493,2497,2390,2404,2438,2413,2456,2554,2551,2431,2368,2408,2457,2423,2429,2460,2454,2477,2460,2368,2480,2495,2451,2466,2393,2390,2501,2441,2478,2386,2379,2494,2435,2403,2468,2327,2424,2403,2425,2417,2507,2375,2397,2442,2462,2425,2422,2478,2453,2369,2464,2425,2406,2410,2405,2425,2538,2451,2484,2384,2505,2379,2471,2450,2463,2438,2478,2429,2451,2407,2389,2525,2455,2422,2423,2432,2442,2464,2450,2387,2470,2448,2444,2409,2415,2460,2514,2404,2592,2437,2391,2403,2480,2472,2464,2443,2476,2518,2409,2383,2400,2422,2569,2458,2398,2476,2371,2438,2420,2495,2424,2402,2390,2457,2460,2366,2342,2470,2454,2466,2374,2431,2401,2421,2411,2470,2407,2486,2431,2350,2398,2445,2454,2461,2426,2441,2394,2446,2415,2397,2531,2315,2462,2342,2425,2441,2468,2434,2458,2468,2393,2490,2364,2434,2481,2521,2396,2365,2386,2437,2517,2419,2407,2420,2472,2378,2495,2498,2489,2456,2482,2542,2477,2445,2443,2428,2342,2490,2457,2447,2502,2392,2395,2432,2499,2505,2379,2459,2490,2412,2436,2386,2510,2397,2504,2487,2485,2434,2459,2456,2449,2392,2524,2378,2460,2434,2421,2409,2527,2492,2417,2495,2465,2464,2434,2413,2312,2462,2428,2393,2446,2446,2505,2464,2421,2423,2329,2390,2430,2435,2396,2410,2465,2405,2344,2461,2438,2434,2490,2454,2442,2499,2370,2359,2399,2411,2423,2440,2391,2342,2508,2497,2420,2441,2464,2358,2398,2430,2393,2475,2448,2384,2439,2488,2464,2319,2396,2362,2402,2418,2373,2475,2430,2357,2387,2481,2437,2368,2422,2409,2515,2401,2352,2463,2404,2533,2504,2370,2427,2535,2468,2374,2506,2420,2397,2408,2485,2397,2567,2459,2347,2548,2522,2502,2469,2507,2445,2392,2360,2379,2451,2439,2535,2455,2498,2513,2438,2594,2352,2485,2491,2506,2507,2420,2535,2420,2301,2511,2387,2459,2530,2382,2435,2455,2486,2462,2554,2479,2482,2415,2430,2496,2415,2491,2409,2440,2408,2458,2387,2496,2388,2438,2437,2386,2447,2462,2507,2417,2460,2489,2479,2505,2394,2420,2373,2417,2437,2442,2355,2498,2494,2371,2429,2464,2479,2377,2497,2408,2419,2438,2412,2376,2415,2370,2352,2573,2455,2459,2565,2397,2458,2361,2431,2380,2387,2469,2404,2426,2457,2431,2409,2392,2489,2467,2422,2486,2468,2480,2455,2457,2486,2456,2491,2362,2455,2460,2484,2435,2448,2556,2421,2450,2474,2446,2457,2449,2505,2490,2432,2473,2386,2449,2473,2511,2381,2415,2490,2420,2434,2477,2470,2486,2404,2520,2400,2455,2391,2423,2476,2428,2524,2398,2395,2390,2309,2355,2468,2482,2521,2464,2540,2423,2354,2362,2506,2435,2419,2406,2439,2417,2510,2422,2418,2420,2384,2513,2368,2387,2527,2517,2376,2447,2533,2421,2421,2447,2436,2507,2366,2408,2413,2401,2527,2423,2374,2496,2390,2480,2475,2327,2374,2364,2400,2556,2330,2531,2375,2418,2508,2354,2432,2374,2456,2468,2484,2514,2484,2460,2460,2452,2444,2401,2482,2452,2374,2507,2454,2451,2456,2359,2340,2504,2428,2438,2483,2482,2378,2481,2476,2506,2454,2387,2363,2428,2457,2512,2503,2410,2482,2477,2387,2478,2483,2403,2537,2468,2437,2442,2425,2373,2487,2469,2389,2469,2432,2500,2469,2444,2393,2522,2398,2516,2443,2411,2356,2457,2388,2434,2461,2456,2428,2431,2382,2497,2381,2503,2444,2434,2467,2367,2492,2463,2428,2440,2442,2447,2440,2440,2453,2482,2433,2365,2464,2357,2368,2473,2401,2462,2418,2433,2464,2510,2443,2452,2402,2457,2407,2495,2388,2452,2404,2439,2504,2479,2553,2435,2354,2362,2403,2412,2478,2389,2404,2471,2413,2560,2424,2484,2507,2360,2440,2358,2450,2487,2489,2504,2462,2514,2514,2460,2487,2467,2435,2315,2428,2498,2509,2520,2464,2498,2489,2398,2414,2498,2429,2372,2479,2440,2431,2485,2434,2408,2407,2470,2402,2424,2326,2414,2381,2404,2380,2438,2469,2409,2436,2428,2372,2534,2498,2480,2487,2372,2435,2435,2479,2447,2382,2426,2445,2410,2424,2478,2530,2468,2392,2414,2346,2347,2361,2456,2459,2465,2418,2432,2420,2320,2481,2473,2469,2407,2450,2441,2401,2358,2467,2474,2410,2422,2525,2382,2549,2422,2481,2553,2478,2421,2442,2435,2443,2375,2481,2434,2420,2427,2421,2446,2420,2443,2556,2471,2481,2440,2501,2450,2492,2482,2367,2392,2508,2473,2359,2453,2424,2398,2380,2420,2490,2473,2436,2465,2410,2293,2447,2445,2457,2447,2425,2459,2374,2380,2469,2414,2458,2443,2509,2418,2434,2444,2431,2360,2462,2441,2443,2466,2454,2444,2455,2395,2376,2456,2455,2394,2417,2458,2498,2474,2331,2419,2504,2501,2455,2422,2432,2464,2449,2454,2504,2408,2454,2380,2432,2510,2459,2403,2359,2331,2485,2407,2470,2380,2482,2461,2486,2472,2449,2387,2394,2410,2490,2464,2472,2459,2408,2484,2392,2465,2422,2362,2365,2497,2408,2380,2437,2337,2501,2484,2433,2486,2450,2425,2333,2486,2379,2454,2387,2416,2513,2467,2429,2480,2435,2473,2366,2443,2393,2452,2434,2446,2424,2403,2410,2439,2414,2483,2390,2428,2449,2467,2452,2420,2496,2499,2433,2407,2432,2441,2474,2579,2432,2514,2372,2425,2449,2467,2497,2457,2392,2414,2356,2387,2487,2498,2381,2421,2411,2386,2454,2522,2476,2468,2445,2524,2467,2382,2382,2418,2466,2549,2444,2461,2489,2430,2429,2372,2451,2417,2530,2381,2485,2424,2435,2393,2545,2312,2407,2358,2500,2460,2509,2453,2447,2483,2545,2483,2430,2479,2396,2443,2356,2371,2464,2514,2390,2432,2385,2530,2421,2531,2450,2549,2412,2385,2341,2337,2377,2432,2436,2489,2449,2434,2485,2385,2417,2368,2419,2441,2502,2441,2395,2372,2456,2417,2420,2512,2425,2460,2470,2434,2388,2399,2385,2355,2408,2358,2487,2483,2345,2453,2429,2403,2402,2392,2390,2471,2452,2411,2427,2459,2515,2426,2423,2512,2517,2415,2581,2484,2435,2395,2422,2526,2403,2366,2486,2431,2472,2430,2452,2472,2493,2397,2459,2447,2460,2409,2436,2420,2400,2416,2454,2389,2505,2378,2347,2419,2436,2473,2496,2446,2484,2490,2479,2490,2423,2458,2458,2515,2498,2496,2430,2440,2486,2425,2477,2469,2404,2412,2452,2412,2428,2493,2381,2455,2458,2324,2454,2534,2507,2462,2515,2457,2365,2425,2344,2424,2412,2449,2454,2410,2462,2542,2434,2496,2456,2402,2445,2478,2369,2585,2432,2402,2444,2433,2353,2409,2487,2478,2352,2479,2570,2431,2426,2455,2342,2365,2464,2504,2438,2529,2498,2410,2461,2464,2531,2427,2461,2428,2326,2404,2416,2395,2384,2389,2529,2469,2508,2445,2452,2491,2454,2464,2477,2455,2386,2459,2503,2451,2423,2379,2506,2492,2507,2488,2451,2530,2392,2438,2468,2438,2434,2397,2421,2468,2421,2473,2493,2434,2392,2490,2375,2472,2508,2453,2429,2401,2435,2419,2420,2445,2339,2418,2377,2536,2511,2509,2464,2487,2446,2472,2463,2396,2493,2457,2397,2442,2429,2418,2448,2462,2485,2504,2510,2386,2390,2453,2426,2412,2490,2431,2370,2425,2440,2414,2445,2480,2472,2493,2404,2435,2496,2451,2416,2412,2434,2441,2411,2395,2467,2455,2378,2478,2360,2410,2360,2505,2461,2426,2389,2381,2389,2417,2382,2503,2422,2494,2436,2372,2480,2389,2380,2503,2460,2474,2480,2418,2400,2370,2368,2374,2509,2423,2453,2476,2468,2433,2348,2416,2368,2454,2472,2464,2492,2422,2449,2404,2463,2473,2415,2451,2461,2428,2463,2477,2466,2406,2391,2434,2422,2454,2393,2409,2422,2462,2461,2465,2466,2372,2391,2485,2439,2435,2399,2433,2487,2454,2400,2440,2469,2472,2416,2398,2463,2461,2486,2461,2447,2496,2470,2413,2428,2483,2365,2410,2425,2403,2427,2533,2457,2435,2401,2419,2400,2478,2461,2448,2488,2437,2367,2415,2456,2474,2509,2524,2443,2440,2407,2515,2472,2448,2404,2424,2459,2446,2409,2435,2419,2455,2453,2467,2474,2411,2468,2380,2419,2378,2453,2430,2481,2452,2420,2393,2434,2410,2336,2343,2456,2430,2522,2509,2452,2393,2440,2524,2386,2516,2465,2496,2404,2442,2410,2397,2421,2386,2423,2388,2393,2434,2455,2431,2499,2465,2374,2443,2519,2452,2474,2481,2426,2398,2403,2380,2394,2384,2512,2436,2340,2480,2428,2409,2507,2399,2445,2406,2428,2451,2474,2393,2480,2413,2445,2430,2494,2429,2541,2478,2462,2363,2476,2506,2474,2393,2447,2504,2457,2542,2461,2409,2413,2455,2424,2463,2400,2491,2429,2394,2481,2521,2450,2496,2438,2420,2422,2439,2417,2484,2514,2421,2495,2409,2517,2412,2414,2472,2425,2422,2446,2453,2431,2425,2433,2481,2444,2452,2428,2486,2484,2469,2387,2492,2506,2462,2435,2424,2457,2471,2383,2424,2444,2431,2493,2460,2420,2504,2422,2459,2406,2403,2377,2453,2370,2461,2502,2482,2438,2367,2449,2548,2475,2400,2495,2439,2450,2463,2415,2455,2456,2346,2559,2415,2443,2484,2464,2416,2474,2497,2416,2412,2493,2479,2494,2366,2361,2378,2352,2385,2428,2372,2333,2423,2527,2285,2458,2466,2445,2479,2462,2457,2440,2521,2473,2394,2454,2453,2478,2456,2524,2468,2484,2307,2474,2502,2418,2525,2412,2355,2492,2449,2415,2466,2482,2443,2488,2461,2365,2499,2463,2512,2443,2442,2476,2473,2389,2408,2460,2406,2436,2497,2478,2475,2378,2466,2392,2440,2416,2392,2438,2457,2490,2562,2517,2409,2449,2463,2427,2445,2555,2377,2524,2362,2484,2446,2376,2403,2535,2459,2463,2415,2475,2475,2471,2430,2467,2308,2330,2489,2504,2417,2405,2461,2411,2478,2419,2468,2448,2447,2432,2450,2461,2376,2440,2352,2434,2452,2410,2424]},{"counters":[2493,2550,2410,2500,2348,2628,2490,2460,2499,2440,2469,2508,2420,2449,2448,2405,2498,2439,2352,2478,2461,2437,2508,2393,2433,2387,2432,2424,2420,2539,2309,2350,2410,2366,2506,2438,2449,2461,2483,2447,2564,2429,2375,2408,2509,2420,2402,2423,2522,2432,2449,2402,2400,2361,2435,2348,2470,2544,2485,2472,2339,2409,2422,2429,2422,2487,2424,2496,2463,2362,2479,2386,2518,2477,2426,2405,2442,2448,2455,2426,2417,2438,2512,2440,2393,2491,2408,2454,2476,2412,2544,2488,2464,2434,2466,2430,2402,2494,2443,2453,2381,2469,2489,2523,2440,2371,2434,2443,2431,2458,2482,2289,2385,2387,2506,2435,2504,2430,2401,2515,2337,2487,2480,2426,2542,2465,2390,2555,2353,2389,2409,2393,2420,2424,2375,2394,2471,2449,2497,2381,2382,2587,2390,2351,2535,2450,2473,2446,2432,2432,2362,2466,2476,2410,2396,2518,2427,2397,2405,2391,2344,2381,2494,2444,2433,2449,2498,2519,2420,2426,2479,2449,2416,2391,2413,2555,2404,2464,2420,2412,2334,2420,2383,2365,2487,2484,2504,2454,2547,2417,2509,2543,2368,2361,2516,2418,2361,2386,2526,2449,2460,2485,2481,2492,2377,2503,2441,2446,2475,2350,2514,2464,2493,2366,2460,2412,2411,2416,2439,2481,2406,2418,2449,2461,2469,2456,2439,2500,2430,2502,2437,2402,2472,2470,2501,2438,2368,2426,2432,2454,2415,2351,2470,2470,2462,2478,2451,2351,2488,2498,2458,2412,2414,2425,2486,2519,2426,2394,2497,2459,2465,2383,2382,2344,2431,2489,2422,2471,2460,2420,2447,2440,2364,2342,2451,2446,2508,2338,2437,2373,2445,2483,2429,2507,2367,2467,2477,2438,2475,2384,2423,2406,2539,2475,2476,2419,2385,2340,2347,2404,2471,2432,2452,2355,2489,2447,2339,2385,2425,2437,2329,2483,2526,2421,2379,2437,2414,2362,2495,2415,2476,2434,2447,2482,2422,2460,2436,2445,2391,2405,2316,2513,2444,2373,2551,2443,2383,2409,2401,2405,2464,2419,2420,2472,2441,2424,2391,2336,2356,2548,2491,2368,2431,2489,2429,2441,2447,2476,2480,2438,2373,2403,2448,2455,2452,2447,2345,2399,2528,2455,2431,2409,2476,2422,2332,2516,2445,2461,2432,2518,2483,2497,2508,2431,2326,2510,2541,2470,2393,2408,2395,2444,2476,2413,2492,2495,2493,2428,2503,2415,2474,2450,2396,2467,2550,2387,2458,2472,2410,2400,2401,2470,2392,2419,2462,2522,2421,2432,2452,2479,2434,2390,2407,2421,2325,2464,2467,2432,2447,2392,2412,2401,2326,2465,2365,2460,2443,2399,2385,2489,2492,2412,2430,2356,2450,2514,2385,2498,2414,2449,2362,2327,2423,2429,2425,2418,2370,2388,2427,2498,2414,2486,2399,2357,2465,2429,2364,2428,2403,2415,2387,2490,2429,2461,2432,2486,2459,2462,2456,2371,2413,2473,2520,2448,2432,2461,2451,2384,2478,2460,2485,2486,2437,2459,2419,2442,2478,2449,2453,2448,2476,2361,2394,2399,2383,2500,2381,2464,2484,2321,2412,2516,2492,2409,2449,2447,2527,2434,2449,2421,2460,2460,2483,2494,2445,2461,2466,2465,2473,2394,2525,2415,2404,2368,2500,2463,2424,2479,2372,2370,2479,2463,2465,2511,2438,2359,2406,2438,2429,2498,2486,2420,2404,2497,2460,2467,2401,2525,2496,2467,2478,2506,2438,2417,2454,2490,2444,2402,2368,2474,2421,2418,2433,2502,2460,2461,2410,2529,2535,2431,2372,2406,2505,2483,2454,2396,2402,2366,2525,2494,2409,2372,2451,2361,2451,2407,2349,2399,2415,2475,2508,2567,2519,2448,2387,2373,2427,2425,2445,2300,2486,2471,2450,2469,2439,2417,2453,2455,2426,2468,2437,2439,2392,2437,2417,2470,2437,2439,2423,2378,2488,2369,2453,2461,2386,2442,2456,2567,2385,2438,2374,2394,2508,2432,2507,2409,2426,2526,2436,2472,2465,2447,2472,2476,2400,2472,2463,2457,2560,2433,2487,2443,2422,2482,2402,2463,2400,2571,2392,2406,2502,2481,2461,2451,2448,2389,2506,2472,2458,2501,2408,2542,2485,2399,2452,2378,2371,2457,2487,2516,2410,2350,2427,2394,2483,2429,2408,2500,2397,2402,2402,2432,2456,2420,2493,2409,2490,2486,2396,2445,2455,2483,2465,2438,2457,2420,2349,2463,2512,2412,2440,2442,2461,2443,2486,2481,2377,2482,2474,2414,2525,2478,2395,2512,2435,2475,2449,2454,2361,2483,2425,2554,2454,2382,2563,2427,2409,2394,2466,2393,2439,2468,2451,2395,2432,2420,2412,2417,2422,2410,2434,2472,2384,2428,2454,2434,2394,2450,2368,2430,2448,2529,2383,2374,2402,2433,2451,2417,2535,2429,2411,2371,2347,2514,2462,2413,2453,2445,2491,2449,2334,2424,2414,2358,2526,2395,2465,2468,2446,2488,2428,2432,2459,2487,2512,2400,2391,2440,2403,2391,2457,2441,2441,2411,2486,2493,2442,2498,2466,2534,2462,2517,2423,2463,2412,2496,2453,2445,2358,2382,2472,2427,2520,2446,2413,2393,2443,2487,2442,2503,2386,2471,2408,2402,2372,2401,2450,2363,2363,2428,2512,2515,2422,2583,2391,2405,2420,2445,2477,2428,2441,2389,2412,2440,2387,2504,2521,2401,2346,2439,2528,2408,2507,2437,2468,2494,2560,2430,2528,2428,2374,2401,2522,2504,2411,2486,2464,2414,2512,2466,2361,2471,2459,2426,2423,2500,2501,2443,2392,2367,2462,2492,2338,2374,2439,2424,2406,2448,2431,2443,2408,2588,2403,2409,2502,2389,2449,2454,2367,2467,2410,2434,2542,2505,2447,2526,2449,2386,2447,2465,2504,2500,2478,2386,2495,2383,2338,2429,2451,2446,2413,2433,2426,2432,2448,2417,2404,2565,2440,2414,2474,2477,2388,2369,2356,2449,2392,2364,2447,2440,2489,2497,2404,2446,2450,2390,2390,2419,2416,2391,2380,2446,2478,2457,2465,2465,2380,2414,2451,2430,2422,2444,2515,2447,2384,2536,2352,2538,2367,2460,2424,2522,2456,2410,2451,2445,2521,2429,2466,2495,2463,2458,2410,2455,2504,2386,2402,2449,2497,2505,2473,2432,2374,2423,2438,2473,2420,2537,2400,2402,2428,2487,2446,2407,2423,2506,2391,2412,2468,2444,2496,2472,2342,2421,2466,2458,2402,2437,2415,2411,2519,2403,2471,2386,2375,2403,2427,2425,2514,2391,2502,2425,2402,2461,2518,2355,2320,2396,2397,2454,2509,2442,2388,2406,2440,2540,2372,2392,2500,2344,2526,2518,2392,2490,2423,2351,2425,2306,2497,2470,2463,2468,2452,2350,2502,2448,2400,2497,2420,2435,2395,2501,2488,2404,2475,2463,2382,2449,2428,2481,2563,2465,2413,2441,2474,2496,2412,2466,2458,2456,2438,2398,2379,2414,2539,2420,2446,2546,2372,2461,2487,2441,2453,2529,2505,2462,2492,2440,2471,2478,2389,2420,2440,2498,2533,2403,2343,2422,2404,2419,2460,2403,2452,2439,2511,2369,2497,2394,2436,2509,2382,2387,2427,2386,2472,2448,2397,2460,2450,2457,2461,2394,2477,2504,2598,2422,2435,2492,2408,2442,2420,2451,2477,2350,2374,2450,2462,2465,2376,2447,2405,2452,2390,2536,2303,2342,2345,2487,2449,2446,2430,2348,2318,2459,2457,2454,2518,2467,2420,2420,2530,2442,2435,2527,2394,2469,2436,2410,2442,2414,2429,2467,2473,2457,2409,2440,2500,2415,2458,2464,2454,2477,2471,2403,2460,2433,2524,2473,2371,2432,2483,2437,2396,2481,2405,2352,2452,2464,2457,2455,2417,2398,2467,2401,2444,2441,2490,2451,2474,2413,2374,2422,2444,2484,2459,2467,2533,2490,2445,2453,2457,2443,2396,2418,2469,2398,2429,2452,2377,2435,2451,2440,2510,2468,2431,2513,2497,2459,2388,2487,2498,2409,2493,2525,2491,2468,2458,2454,2536,2458,2479,2391,2480,2382,2396,2521,2431,2449,2468,2383,2430,2326,2480,2434,2395,2476,2460,2414,2534,2394,2474,2505,2503,2344,2335,2386,2541,2418,2450,2407,2387,2536,2495,2479,2531,2528,2362,2502,2462,2473,2578,2414,2398,2475,2302,2388,2392,2515,2399,2342,2482,2470,2447,2437,2413,2352,2540,2408,2418,2463,2400,2449,2404,2432,2381,2434,2473,2450,2359,2574,2448,2453,2441,2436,2363,2396,2400,2437,2387,2443,2444,2429,2432,2423,2493,2411,2483,2379,2456,2473,2384,2431,2352,2426,2427,2468,2462,2432,2423,2435,2465,2372,2410,2383,2545,2538,2444,2453,2411,2403,2491,2499,2456,2368,2514,2453,2373,2531,2390,2425,2446,2445,2458,2370,2400,2411,2436,2425,2457,2437,2420,2478,2440,2451,2494,2366,2464,2470,2507,2348,2389,2520,2343,2513,2458,2394,2463,2448,2409,2479,2368,2487,2381,2403,2367,2497,2456,2431,2465,2380,2379,2463,2485,2411,2410,2430,2445,2463,2392,2407,2523,2352,2490,2422,2467,2411,2465,2464,2429,2379,2426,2422,2483,2459,2436,2487,2466,2339,2453,2443,2418,2419,2411,2495,2482,2365,2469,2395,2463,2463,2507,2436,2418,2466,2355,2433,2525,2469,2476,2458,2432,2412,2493,2461,2508,2434,2496,2375,2474,2379,2387,2452,2394,2489,2349,2441,2537,2496,2383,2420,2453,2494,2427,2486,2448,2468,2543,2411,2406,2494,2512,2523,2428,2485,2368,2527,2473,2346,2407,2473,2433,2413,2431,2478,2376,2385,2478,2364,2380,2470,2328,2447,2523,2378,2519,2423,2387,2485,2456,2411,2441,2491,2450,2435,2458,2444,2433,2471,2504,2456,2433,2508,2419,2377,2449,2457,2497,2499,2517,2469,2457,2437,2355,2296,2461,2361,2506,2529,2463,2429,2468,2435,2472,2467,2485,2558,2395,2396,2458,2362,2497,2434,2435,2420,2534,2423,2463,2553,2451,2508,2437,2426,2476,2465,2486,2414,2438,2397,2453,2370,2385,2426,2495,2424,2524,2472,2508,2417,2435,2513,2455,2480,2419,2490,2501,2421,2462,2450,2416,2447,2476,2378,2443,2367,2384,2386,2465,2413,2518,2417,2390,2377,2479,2480,2480,2513,2438,2465,2369,2426,2419,2436,2449,2402,2465,2447,2424,2412,2382,2434,2457,2512,2320,2505,2433,2365,2349,2455,2470,2443,2448,2317,2511,2464,2420,2453,2414,2468,2420,2404,2464,2447,2414,2473,2486,2449,2458,2424,2457,2471,2471,2544,2406,2482,2437,2406,2369,2416,2406,2479,2437,2425,2486,2448,2515,2442,2454,2438,2416,2430,2392,2473,2434,2416,2357,2495,2420,2436,2386,2486,2372,2441,2390,2499,2441,2361,2491,2444,2435,2432,2471,2484,2422,2486,2375,2442,2399,2507,2484,2493,2450,2426,2459,2435,2465,2507,2412,2434,2398,2358,2469,2444,2436,2467,2465,2523,2435,2427,2573,2390,2520,2431,2410,2376,2439,2530,2344,2466,2437,2421,2422,2485,2385,2364,2431,2400,2372,2431,2424,2380,2523,2485,2474,2383,2395,2484,2471,2502,2451,2397,2494,2468,2466,2454,2399,2461,2429,2494,2515,2436,2509,2496,2474,2438,2455,2488,2524,2533,2430,2417,2459,2536,2446,2412,2499,2446,2366,2351,2441,2433,2470,2328,2376,2411,2432,2451,2470,2428,2396,2488,2435,2389,2446,2459,2384,2477,2402,2359,2435,2494,2447,2380,2470,2393,2443,2448,2480,2515,2454,2472,2465,2461,2425,2494,2413,2449,2496,2456,2439,2433,2421,2428,2454,2513,2458,2446,2460,2496,2371,2502,2381,2433,2455,2460,2457,2512,2467,2440,2418,2396,2494,2479,2477,2413,2394,2427,2528,2469,2395,2416,2512,2369,2401,2407,2473,2476,2489,2428,2515,2465,2448,2445,2398,2400,2401,2481,2434,2484,2390,2477,2452,2357,2486,2463,2433,2431,2412,2532,2437,2432,2415,2423,2456,2459,2386,2447,2479,2501,2344,2375,2418,2477,2458,2437,2420,2466,2383,2366,2375,2394,2352,2457,2432,2483,2551,2416,2377,2425,2407,2491,2470,2351,2382,2327,2402,2367,2428,2389,2487,2463,2422,2456,2464,2398,2473,2432,2432,2481,2499,2454,2441,2443,2406,2432,2409,2556,2379,2508,2413,2425,2428,2451,2335,2435,2332,2484,2471,2398,2354,2506,2429,2466,2433,2336,2424,2457,2446,2449,2447,2382,2432,2509,2376,2474,2424,2484,2531,2464,2473,2450,2402,2469,2530,2454,2390,2456,2435,2420,2377,2436,2434,2405,2462,2502,2472,2525,2490,2417,2471,2433,2541,2470,2406,2417,2386,2457,2432,2439]},{"counters":[2513,2452,2410,2496,2548,2402,2369,2453,2476,2500,2502,2399,2461,2418,2426,2465,2432,2502,2404,2440,2476,2535,2465,2430,2421,2508,2369,2458,2525,2468,2427,2378,2489,2436,2419,2478,2363,2370,2424,2481,2476,2495,2467,2426,2419,2507,2491,2405,2545,2519,2435,2488,2480,2458,2494,2419,2478,2380,2400,2495,2546,2477,2541,2381,2358,2411,2443,2518,2398,2415,2422,2532,2494,2440,2460,2457,2468,2461,2495,2407,2471,2471,2419,2416,2519,2519,2334,2441,2430,2486,2410,2423,2447,2409,2401,2372,2519,2431,2503,2429,2494,2446,2394,2479,2364,2502,2420,2459,2419,2475,2374,2461,2494,2405,2429,2448,2438,2470,2527,2404,2510,2436,2388,2420,2456,2408,2392,2494,2378,2389,2497,2456,2401,2454,2461,2394,2469,2414,2457,2495,2461,2487,2494,2442,2425,2444,2484,2409,2430,2358,2451,2404,2465,2459,2426,2494,2384,2440,2409,2419,2412,2434,2437,2410,2404,2431,2504,2488,2473,2380,2459,2393,2452,2527,2455,2443,2486,2396,2415,2414,2431,2486,2373,2378,2538,2431,2471,2414,2409,2440,2418,2498,2451,2474,2483,2432,2463,2471,2430,2488,2466,2368,2470,2478,2535,2375,2454,2471,2529,2549,2462,2437,2425,2414,2420,2555,2452,2419,2340,2449,2520,2425,2480,2406,2433,2438,2421,2393,2528,2469,2447,2559,2448,2417,2471,2415,2469,2475,2320,2418,2491,2465,2412,2424,2442,2548,2544,2426,2383,2489,2393,2517,2437,2452,2525,2500,2521,2423,2474,2485,2392,2499,2406,2470,2491,2380,2401,2428,2469,2471,2412,2392,2439,2422,2413,2533,2407,2503,2423,2475,2404,2474,2360,2435,2449,2431,2466,2316,2411,2427,2508,2326,2499,2403,2353,2375,2433,2428,2353,2532,2416,2385,2492,2436,2436,2407,2417,2467,2426,2428,2497,2394,2432,2463,2416,2391,2415,2412,2515,2448,2394,2374,2372,2455,2406,2419,2542,2493,2369,2450,2512,2506,2355,2346,2394,2543,2391,2463,2407,2514,2404,2397,2405,2391,2361,2392,2392,2477,2482,2438,2426,2503,2377,2453,2373,2435,2401,2429,2504,2384,2440,2464,2404,2333,2385,2424,2415,2471,2428,2420,2475,2397,2360,2434,2372,2444,2498,2417,2397,2367,2396,2529,2439,2510,2497,2387,2320,2413,2524,2496,2445,2417,2424,2445,2441,2512,2468,2381,2509,2493,2406,2439,2439,2456,2421,2492,2389,2390,2507,2443,2409,2333,2470,2423,2402,2484,2411,2442,2399,2487,2478,2476,2426,2398,2427,2460,2442,2438,2447,2482,2403,2458,2423,2490,2416,2419,2359,2396,2482,2426,2462,2463,2465,2483,2435,2351,2513,2387,2538,2400,2392,2537,2428,2543,2450,2509,2561,2444,2406,2440,2543,2427,2550,2500,2333,2427,2562,2443,2472,2430,2368,2376,2441,2400,2424,2382,2525,2403,2431,2483,2545,2471,2340,2436,2539,2353,2569,2453,2491,2425,2421,2404,2485,2521,2429,2375,2466,2500,2384,2415,2395,2385,2493,2383,2419,2461,2323,2399,2395,2483,2441,2449,2487,2480,2465,2409,2332,2504,2602,2470,2383,2421,2488,2515,2469,2438,2478,2466,2424,2365,2467,2448,2430,2458,2509,2345,2384,2485,2408,2472,2448,2485,2557,2483,2483,2388,2446,2493,2482,2472,2450,2497,2467,2512,2448,2448,2410,2360,2426,2405,2503,2401,2428,2444,2433,2434,2445,2421,2417,2409,2540,2518,2432,2447,2471,2517,2412,2503,2452,2354,2424,2415,2478,2461,2428,2548,2501,2320,2473,2426,2363,2481,2423,2435,2416,2444,2461,2507,2495,2466,2482,2426,2415,2413,2409,2421,2434,2429,2448,2452,2390,2396,2490,2408,2419,2468,2471,2381,2447,2477,2406,2403,2468,2433,2388,2509,2376,2506,2466,2372,2450,2543,2475,2443,2443,2416,2410,2446,2381,2466,2385,2521,2426,2451,2541,2371,2390,2520,2372,2446,2409,2429,2466,2517,2359,2458,2412,2413,2379,2446,2420,2419,2392,2376,2446,2447,2463,2368,2387,2535,2448,2464,2386,2420,2344,2553,2504,2533,2416,2441,2390,2504,2467,2377,2462,2441,2445,2424,2404,2526,2511,2413,2388,2419,2510,2441,2500,2492,2483,2403,2378,2448,2439,2477,2401,2371,2431,2412,2466,2443,2468,2361,2439,2335,2490,2432,2388,2373,2435,2424,2492,2385,2398,2433,2432,2377,2423,2398,2512,2422,2480,2438,2391,2410,2497,2469,2376,2352,2416,2430,2459,2456,2383,2342,2391,2485,2332,2485,2363,2480,2482,2384,2498,2406,2411,2450,2497,2422,2458,2419,2434,2422,2486,2452,2431,2409,2471,2512,2453,2445,2408,2477,2468,2397,2479,2500,2547,2455,2402,2461,2374,2457,2471,2439,2365,2357,2379,2358,2448,2432,2412,2495,2372,2489,2517,2380,2472,2420,2430,2369,2403,2408,2478,2357,2498,2472,2399,2409,2515,2374,2470,2516,2547,2465,2483,2386,2441,2444,2431,2414,2417,2528,2386,2441,2384,2440,2471,2377,2464,2476,2510,2491,2450,2445,2468,2396,2493,2503,2520,2455,2427,2469,2513,2427,2461,2482,2443,2445,2450,2444,2445,2447,2439,2452,2376,2473,2473,2430,2451,2425,2514,2451,2455,2513,2458,2354,2317,2421,2404,2418,2466,2481,2444,2506,2526,2396,2324,2453,2373,2524,2401,2369,2509,2462,2468,2471,2403,2466,2490,2480,2410,2432,2485,2474,2404,2369,2412,2459,2462,2381,2447,2495,2386,2444,2450,2436,2397,2500,2408,2478,2487,2370,2468,2405,2357,2484,2460,2494,2428,2485,2352,2427,2469,2352,2552,2460,2509,2458,2476,2420,2443,2496,2474,2442,2450,2340,2435,2452,2411,2408,2430,2453,2416,2547,2497,2394,2418,2460,2392,2331,2394,2431,2391,2463,2420,2449,2401,2408,2388,2419,2499,2426,2402,2539,2409,2420,2406,2418,2474,2488,2469,2451,2434,2389,2424,2321,2533,2460,2444,2403,2398,2473,2461,2448,2356,2396,2451,2498,2442,2348,2502,2567,2468,2387,2360,2450,2415,2423,2406,2424,2371,2424,2419,2404,2393,2471,2472,2430,2470,2359,2456,2479,2436,2411,2517,2411,2433,2548,2434,2521,2439,2473,2452,2447,2428,2457,2461,2401,2433,2433,2422,2418,2407,2428,2342,2524,2446,2504,2393,2470,2377,2433,2514,2392,2416,2429,2437,2428,2411,2430,2412,2429,2431,2559,2495,2398,2344,2386,2398,2559,2455,2361,2407,2406,2467,2423,2403,2422,2489,2461,2393,2447,2440,2448,2485,2452,2463,2479,2453,2374,2463,2405,2378,2479,2370,2483,2532,2462,2431,2509,2460,2375,2437,2509,2500,2463,2425,2445,2521,2504,2413,2426,2480,2398,2392,2447,2437,2374,2463,2437,2503,2409,2491,2457,2449,2333,2449,2511,2420,2503,2410,2445,2388,2417,2439,2376,2377,2488,2421,2342,2417,2428,2373,2392,2430,2471,2467,2460,2444,2377,2476,2490,2431,2374,2451,2417,2414,2498,2467,2506,2456,2409,2457,2389,2470,2437,2448,2437,2434,2551,2400,2442,2458,2373,2462,2487,2410,2529,2498,2363,2440,2433,2451,2415,2416,2477,2489,2364,2444,2463,2486,2403,2369,2472,2439,2416,2456,2395,2444,2455,2471,2417,2393,2359,2362,2368,2528,2390,2423,2357,2407,2436,2431,2419,2419,2328,2351,2522,2417,2502,2527,2399,2452,2375,2399,2488,2555,2433,2443,2431,2389,2425,2448,2443,2497,2442,2432,2435,2426,2505,2535,2436,2376,2384,2411,2423,2481,2437,2375,2421,2464,2469,2408,2467,2422,2452,2414,2339,2389,2472,2420,2463,2417,2517,2426,2468,2444,2438,2426,2387,2400,2457,2455,2453,2467,2427,2403,2455,2344,2437,2502,2467,2480,2449,2400,2382,2426,2389,2439,2420,2468,2443,2372,2433,2465,2429,2495,2472,2485,2442,2456,2420,2523,2422,2433,2370,2375,2508,2418,2378,2481,2435,2519,2380,2480,2454,2388,2452,2472,2369,2416,2444,2445,2420,2505,2430,2443,2378,2486,2364,2482,2387,2464,2448,2430,2399,2526,2535,2497,2421,2508,2477,2437,2468,2576,2439,2468,2506,2400,2492,2446,2432,2507,2396,2373,2503,2509,2426,2486,2411,2356,2403,2419,2340,2390,2445,2429,2481,2408,2435,2436,2411,2471,2383,2385,2535,2489,2422,2423,2441,2482,2332,2432,2428,2401,2484,2462,2407,2411,2420,2510,2419,2370,2535,2407,2465,2490,2400,2438,2405,2483,2401,2370,2475,2481,2510,2356,2416,2462,2444,2384,2405,2493,2398,2401,2413,2428,2478,2444,2410,2461,2445,2484,2375,2405,2438,2453,2379,2367,2445,2418,2393,2515,2356,2452,2519,2493,2465,2445,2435,2544,2431,2447,2479,2332,2385,2435,2429,2434,2456,2356,2480,2494,2394,2564,2413,2393,2470,2373,2411,2425,2418,2387,2520,2451,2456,2478,2531,2449,2482,2524,2478,2459,2496,2432,2461,2412,2440,2485,2452,2381,2364,2447,2403,2459,2464,2372,2467,2532,2427,2453,2418,2449,2454,2443,2459,2409,2444,2425,2481,2450,2551,2442,2499,2370,2365,2451,2463,2297,2393,2491,2570,2482,2522,2492,2402,2403,2431,2497,2414,2387,2441,2466,2597,2431,2459,2423,2524,2426,2362,2548,2426,2472,2395,2427,2353,2391,2495,2456,2405,2500,2416,2445,2468,2471,2427,2509,2445,2467,2330,2482,2434,2413,2367,2511,2475,2421,2508,2477,2394,2507,2518,2491,2401,2449,2509,2375,2366,2487,2438,2465,2362,2424,2377,2389,2429,2481,2495,2478,2446,2414,2502,2434,2427,2450,2355,2483,2479,2522,2464,2348,2411,2466,2384,2336,2503,2462,2403,2489,2487,2486,2456,2382,2518,2391,2524,2431,2411,2486,2406,2489,2485,2429,2455,2482,2393,2442,2390,2454,2515,2478,2469,2435,2460,2417,2423,2370,2457,2477,2382,2421,2494,2446,2356,2459,2454,2356,2449,2491,2436,2404,2418,2458,2397,2305,2492,2491,2487,2414,2450,2388,2466,2470,2458,2402,2438,2418,2488,2423,2487,2342,2442,2438,2427,2377,2444,2468,2450,2454,2383,2383,2413,2493,2456,2433,2420,2426,2523,2417,2495,2412,2390,2450,2429,2501,2420,2465,2400,2386,2372,2430,2408,2444,2418,2431,2500,2426,2451,2500,2493,2409,2409,2432,2446,2435,2432,2380,2366,2460,2451,2455,2454,2507,2364,2396,2467,2466,2501,2490,2529,2441,2387,2462,2500,2453,2420,2511,2438,2435,2374,2502,2400,2560,2463,2429,2431,2500,2421,2466,2420,2450,2377,2500,2395,2487,2548,2558,2476,2418,2470,2376,2433,2356,2470,2537,2508,2413,2416,2413,2431,2399,2440,2518,2546,2383,2398,2553,2361,2324,2416,2430,2359,2427,2425,2389,2372,2432,2361,2480,2499,2405,2482,2427,2464,2390,2325,2409,2493,2408,2513,2375,2450,2464,2470,2474,2429,2378,2402,2373,2434,2415,2470,2512,2415,2485,2445,2444,2449,2494,2455,2450,2450,2426,2480,2459,2504,2395,2493,2415,2434,2415,2424,2409,2521,2503,2420,2493,2352,2462,2459,2409,2466,2461,2401,2438,2497,2356,2473,2461,2452,2359,2395,2481,2452,2407,2541,2445,2441,2408,2451,2412,2420,2418,2433,2406,2395,2387,2400,2409,2491,2479,2442,2348,2511,2406,2468,2463,2529,2545,2465,2460,2449,2464,2428,2423,2411,2425,2338,2444,2467,2462,2405,2466,2397,2417,2389,2406,2497,2392,2448,2413,2458,2472,2411,2457,2394,2500,2460,2384,2411,2497,2479,2418,2451,2627,2458,2477,2437,2509,2377,2395,2336,2362,2434,2476,2576,2502,2468,2534,2527,2464,2422,2394,2528,2314,2409,2457,2462,2439,2406,2490,2460,2480,2557,2432,2468,2446,2376,2454,2540,2443,2473,2486,2474,2479,2384,2369,2440,2401,2443,2485,2556,2492,2391,2455,2405,2362,2452,2416,2416,2405,2376,2457,2464,2374,2387,2445,2497,2454,2485,2448,2437,2414,2442,2402,2394,2484,2410,2455,2475,2433,2398,2343,2403,2408,2420,2421,2465,2403,2436,2424,2561,2503,2387,2462,2519,2451,2463,2405,2462,2292,2474,2509,2398,2421,2443,2414,2540,2457,2502,2449,2462,2519,2395,2417,2505,2487,2478,2404,2473,2430,2342,2456,2417,2415,2499,2391,2390,2430,2497,2443,2440,2507,2481,2484,2432,2340,2476,2547,2471,2439,2500,2341,2482,2516,2461,2427,2407,2296,2450,2531,2422,2493,2408,2437,2424,2411,2468]}],"default_value":0},"null_count":0,"tot_col_size":0,"last_update_version":410676699235614720,"correlation":0}},"count":5000000,"modify_count":0,"partitions":null} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_join_stats_e.json b/cmd/explaintest/s/explain_join_stats_e.json deleted file mode 100644 index 8c6645b8b4e46..0000000000000 --- a/cmd/explaintest/s/explain_join_stats_e.json +++ /dev/null @@ -1,46859 +0,0 @@ -{ - "database_name": "test", - "table_name": "e", - "columns": { - "a": { - "histogram": { - "ndv": 250, - "buckets": [ - { - "count": 4080, - "lower_bound": "MQ==", - "upper_bound": "MQ==", - "repeats": 4080 - }, - { - "count": 11220, - "lower_bound": "Mg==", - "upper_bound": "Mw==", - "repeats": 4080 - }, - { - "count": 17340, - "lower_bound": "NA==", - "upper_bound": "NQ==", - "repeats": 3060 - }, - { - "count": 22440, - "lower_bound": "Ng==", - "upper_bound": "Ng==", - "repeats": 5100 - }, - { - "count": 27540, - "lower_bound": "Nw==", - "upper_bound": "OA==", - "repeats": 4080 - }, - { - "count": 32640, - "lower_bound": "OQ==", - "upper_bound": "MTE=", - "repeats": 2040 - }, - { - "count": 36720, - "lower_bound": "MTI=", - "upper_bound": "MTI=", - "repeats": 4080 - }, - { - "count": 40800, - "lower_bound": "MTM=", - "upper_bound": "MTQ=", - "repeats": 3060 - }, - { - "count": 44880, - "lower_bound": "MTU=", - "upper_bound": "MTY=", - "repeats": 2040 - }, - { - "count": 51000, - "lower_bound": "MTc=", - "upper_bound": "MTg=", - "repeats": 3060 - }, - { - "count": 59160, - "lower_bound": "MTk=", - "upper_bound": "MTk=", - "repeats": 8160 - }, - { - "count": 64260, - "lower_bound": "MjA=", - "upper_bound": "MjE=", - "repeats": 3060 - }, - { - "count": 68340, - "lower_bound": "MjI=", - "upper_bound": "MjI=", - "repeats": 4080 - }, - { - "count": 72420, - "lower_bound": "MjM=", - "upper_bound": "MjM=", - "repeats": 4080 - }, - { - "count": 80580, - "lower_bound": "MjQ=", - "upper_bound": "MjQ=", - "repeats": 8160 - }, - { - "count": 85680, - "lower_bound": "MjU=", - "upper_bound": "MjU=", - "repeats": 5100 - }, - { - "count": 93840, - "lower_bound": "MjY=", - "upper_bound": "MjY=", - "repeats": 8160 - }, - { - "count": 98940, - "lower_bound": "Mjc=", - "upper_bound": "Mjc=", - "repeats": 5100 - }, - { - "count": 103020, - "lower_bound": "Mjg=", - "upper_bound": "Mjg=", - "repeats": 4080 - }, - { - "count": 113220, - "lower_bound": "Mjk=", - "upper_bound": "MzA=", - "repeats": 8160 - }, - { - "count": 117300, - "lower_bound": "MzE=", - "upper_bound": "MzE=", - "repeats": 4080 - }, - { - "count": 125460, - "lower_bound": "MzI=", - "upper_bound": "MzM=", - "repeats": 5100 - }, - { - "count": 131580, - "lower_bound": "MzQ=", - "upper_bound": "MzQ=", - "repeats": 6120 - }, - { - "count": 135660, - "lower_bound": "MzU=", - "upper_bound": "MzU=", - "repeats": 4080 - }, - { - "count": 139740, - "lower_bound": "MzY=", - "upper_bound": "MzY=", - "repeats": 4080 - }, - { - "count": 143820, - "lower_bound": "Mzc=", - "upper_bound": "Mzc=", - "repeats": 4080 - }, - { - "count": 147900, - "lower_bound": "Mzg=", - "upper_bound": "Mzk=", - "repeats": 3060 - }, - { - "count": 153000, - "lower_bound": "NDA=", - "upper_bound": "NDA=", - "repeats": 5100 - }, - { - "count": 160140, - "lower_bound": "NDE=", - "upper_bound": "NDI=", - "repeats": 6120 - }, - { - "count": 166260, - "lower_bound": "NDM=", - "upper_bound": "NDM=", - "repeats": 6120 - }, - { - "count": 175440, - "lower_bound": "NDQ=", - "upper_bound": "NDQ=", - "repeats": 9180 - }, - { - "count": 182580, - "lower_bound": "NDU=", - "upper_bound": "NDY=", - "repeats": 4080 - }, - { - "count": 187680, - "lower_bound": "NDc=", - "upper_bound": "NDc=", - "repeats": 5100 - }, - { - "count": 191760, - "lower_bound": "NDg=", - "upper_bound": "NDg=", - "repeats": 4080 - }, - { - "count": 195840, - "lower_bound": "NDk=", - "upper_bound": "NDk=", - "repeats": 4080 - }, - { - "count": 200940, - "lower_bound": "NTA=", - "upper_bound": "NTA=", - "repeats": 5100 - }, - { - "count": 207060, - "lower_bound": "NTE=", - "upper_bound": "NTE=", - "repeats": 6120 - }, - { - "count": 211140, - "lower_bound": "NTI=", - "upper_bound": "NTI=", - "repeats": 4080 - }, - { - "count": 217260, - "lower_bound": "NTM=", - "upper_bound": "NTQ=", - "repeats": 4080 - }, - { - "count": 223380, - "lower_bound": "NTU=", - "upper_bound": "NTY=", - "repeats": 4080 - }, - { - "count": 230520, - "lower_bound": "NTc=", - "upper_bound": "NTc=", - "repeats": 7140 - }, - { - "count": 234600, - "lower_bound": "NTg=", - "upper_bound": "NTg=", - "repeats": 4080 - }, - { - "count": 241740, - "lower_bound": "NTk=", - "upper_bound": "NjA=", - "repeats": 5100 - }, - { - "count": 245820, - "lower_bound": "NjE=", - "upper_bound": "NjE=", - "repeats": 4080 - }, - { - "count": 252960, - "lower_bound": "NjI=", - "upper_bound": "NjI=", - "repeats": 7140 - }, - { - "count": 257040, - "lower_bound": "NjM=", - "upper_bound": "NjM=", - "repeats": 4080 - }, - { - "count": 261120, - "lower_bound": "NjQ=", - "upper_bound": "NjQ=", - "repeats": 4080 - }, - { - "count": 266220, - "lower_bound": "NjU=", - "upper_bound": "NjU=", - "repeats": 5100 - }, - { - "count": 271320, - "lower_bound": "NjY=", - "upper_bound": "NjY=", - "repeats": 5100 - }, - { - "count": 277440, - "lower_bound": "Njc=", - "upper_bound": "Njc=", - "repeats": 6120 - }, - { - "count": 284580, - "lower_bound": "Njg=", - "upper_bound": "Njk=", - "repeats": 4080 - }, - { - "count": 289680, - "lower_bound": "NzA=", - "upper_bound": "NzA=", - "repeats": 5100 - }, - { - "count": 294780, - "lower_bound": "NzE=", - "upper_bound": "NzE=", - "repeats": 5100 - }, - { - "count": 298860, - "lower_bound": "NzI=", - "upper_bound": "NzI=", - "repeats": 4080 - }, - { - "count": 302940, - "lower_bound": "NzM=", - "upper_bound": "NzM=", - "repeats": 4080 - }, - { - "count": 309060, - "lower_bound": "NzQ=", - "upper_bound": "NzU=", - "repeats": 5100 - }, - { - "count": 313140, - "lower_bound": "NzY=", - "upper_bound": "Nzc=", - "repeats": 3060 - }, - { - "count": 320280, - "lower_bound": "Nzg=", - "upper_bound": "Nzg=", - "repeats": 7140 - }, - { - "count": 328440, - "lower_bound": "Nzk=", - "upper_bound": "ODA=", - "repeats": 6120 - }, - { - "count": 335580, - "lower_bound": "ODE=", - "upper_bound": "ODE=", - "repeats": 7140 - }, - { - "count": 341700, - "lower_bound": "ODI=", - "upper_bound": "ODI=", - "repeats": 6120 - }, - { - "count": 349860, - "lower_bound": "ODM=", - "upper_bound": "ODQ=", - "repeats": 5100 - }, - { - "count": 355980, - "lower_bound": "ODU=", - "upper_bound": "ODY=", - "repeats": 3060 - }, - { - "count": 362100, - "lower_bound": "ODg=", - "upper_bound": "OTA=", - "repeats": 3060 - }, - { - "count": 367200, - "lower_bound": "OTE=", - "upper_bound": "OTE=", - "repeats": 5100 - }, - { - "count": 375360, - "lower_bound": "OTI=", - "upper_bound": "OTI=", - "repeats": 8160 - }, - { - "count": 381480, - "lower_bound": "OTM=", - "upper_bound": "OTQ=", - "repeats": 3060 - }, - { - "count": 389640, - "lower_bound": "OTU=", - "upper_bound": "OTg=", - "repeats": 5100 - }, - { - "count": 394740, - "lower_bound": "OTk=", - "upper_bound": "OTk=", - "repeats": 5100 - }, - { - "count": 398820, - "lower_bound": "MTAx", - "upper_bound": "MTAx", - "repeats": 4080 - }, - { - "count": 405960, - "lower_bound": "MTAy", - "upper_bound": "MTAy", - "repeats": 7140 - }, - { - "count": 413100, - "lower_bound": "MTAz", - "upper_bound": "MTA0", - "repeats": 6120 - }, - { - "count": 418200, - "lower_bound": "MTA1", - "upper_bound": "MTA1", - "repeats": 5100 - }, - { - "count": 425340, - "lower_bound": "MTA2", - "upper_bound": "MTA3", - "repeats": 5100 - }, - { - "count": 431460, - "lower_bound": "MTA4", - "upper_bound": "MTA5", - "repeats": 3060 - }, - { - "count": 438600, - "lower_bound": "MTEw", - "upper_bound": "MTEx", - "repeats": 4080 - }, - { - "count": 443700, - "lower_bound": "MTEy", - "upper_bound": "MTEy", - "repeats": 5100 - }, - { - "count": 447780, - "lower_bound": "MTEz", - "upper_bound": "MTEz", - "repeats": 4080 - }, - { - "count": 451860, - "lower_bound": "MTE0", - "upper_bound": "MTE0", - "repeats": 4080 - }, - { - "count": 455940, - "lower_bound": "MTE1", - "upper_bound": "MTE1", - "repeats": 4080 - }, - { - "count": 460020, - "lower_bound": "MTE2", - "upper_bound": "MTE3", - "repeats": 1020 - }, - { - "count": 464100, - "lower_bound": "MTE5", - "upper_bound": "MTE5", - "repeats": 4080 - }, - { - "count": 469200, - "lower_bound": "MTIx", - "upper_bound": "MTIx", - "repeats": 5100 - }, - { - "count": 474300, - "lower_bound": "MTIz", - "upper_bound": "MTI0", - "repeats": 4080 - }, - { - "count": 480420, - "lower_bound": "MTI1", - "upper_bound": "MTI1", - "repeats": 6120 - }, - { - "count": 484500, - "lower_bound": "MTI2", - "upper_bound": "MTI2", - "repeats": 4080 - }, - { - "count": 489600, - "lower_bound": "MTI3", - "upper_bound": "MTI3", - "repeats": 5100 - }, - { - "count": 496740, - "lower_bound": "MTI4", - "upper_bound": "MTI4", - "repeats": 7140 - }, - { - "count": 500820, - "lower_bound": "MTI5", - "upper_bound": "MTI5", - "repeats": 4080 - }, - { - "count": 504900, - "lower_bound": "MTMw", - "upper_bound": "MTMw", - "repeats": 4080 - }, - { - "count": 508980, - "lower_bound": "MTMx", - "upper_bound": "MTMx", - "repeats": 4080 - }, - { - "count": 515100, - "lower_bound": "MTMy", - "upper_bound": "MTMz", - "repeats": 4080 - }, - { - "count": 521220, - "lower_bound": "MTM0", - "upper_bound": "MTM1", - "repeats": 3060 - }, - { - "count": 528360, - "lower_bound": "MTM2", - "upper_bound": "MTM3", - "repeats": 5100 - }, - { - "count": 532440, - "lower_bound": "MTM4", - "upper_bound": "MTM4", - "repeats": 4080 - }, - { - "count": 538560, - "lower_bound": "MTM5", - "upper_bound": "MTM5", - "repeats": 6120 - }, - { - "count": 544680, - "lower_bound": "MTQw", - "upper_bound": "MTQw", - "repeats": 6120 - }, - { - "count": 552840, - "lower_bound": "MTQx", - "upper_bound": "MTQy", - "repeats": 5100 - }, - { - "count": 563040, - "lower_bound": "MTQz", - "upper_bound": "MTQ0", - "repeats": 8160 - }, - { - "count": 568140, - "lower_bound": "MTQ1", - "upper_bound": "MTQ1", - "repeats": 5100 - }, - { - "count": 573240, - "lower_bound": "MTQ2", - "upper_bound": "MTQ2", - "repeats": 5100 - }, - { - "count": 578340, - "lower_bound": "MTQ3", - "upper_bound": "MTQ3", - "repeats": 5100 - }, - { - "count": 586500, - "lower_bound": "MTQ4", - "upper_bound": "MTQ4", - "repeats": 8160 - }, - { - "count": 593640, - "lower_bound": "MTQ5", - "upper_bound": "MTUw", - "repeats": 5100 - }, - { - "count": 598740, - "lower_bound": "MTUx", - "upper_bound": "MTUy", - "repeats": 3060 - }, - { - "count": 604860, - "lower_bound": "MTUz", - "upper_bound": "MTUz", - "repeats": 6120 - }, - { - "count": 610980, - "lower_bound": "MTU0", - "upper_bound": "MTU0", - "repeats": 6120 - }, - { - "count": 616080, - "lower_bound": "MTU1", - "upper_bound": "MTU3", - "repeats": 2040 - }, - { - "count": 623220, - "lower_bound": "MTU4", - "upper_bound": "MTU5", - "repeats": 4080 - }, - { - "count": 627300, - "lower_bound": "MTYw", - "upper_bound": "MTYw", - "repeats": 4080 - }, - { - "count": 634440, - "lower_bound": "MTYx", - "upper_bound": "MTYx", - "repeats": 7140 - }, - { - "count": 639540, - "lower_bound": "MTYy", - "upper_bound": "MTYy", - "repeats": 5100 - }, - { - "count": 644640, - "lower_bound": "MTYz", - "upper_bound": "MTYz", - "repeats": 5100 - }, - { - "count": 650760, - "lower_bound": "MTY0", - "upper_bound": "MTY0", - "repeats": 6120 - }, - { - "count": 654840, - "lower_bound": "MTY1", - "upper_bound": "MTY1", - "repeats": 4080 - }, - { - "count": 659940, - "lower_bound": "MTY2", - "upper_bound": "MTY3", - "repeats": 3060 - }, - { - "count": 666060, - "lower_bound": "MTY4", - "upper_bound": "MTY5", - "repeats": 3060 - }, - { - "count": 671160, - "lower_bound": "MTcw", - "upper_bound": "MTcw", - "repeats": 5100 - }, - { - "count": 675240, - "lower_bound": "MTcx", - "upper_bound": "MTcx", - "repeats": 4080 - }, - { - "count": 680340, - "lower_bound": "MTcz", - "upper_bound": "MTc0", - "repeats": 3060 - }, - { - "count": 684420, - "lower_bound": "MTc1", - "upper_bound": "MTc1", - "repeats": 4080 - }, - { - "count": 693600, - "lower_bound": "MTc2", - "upper_bound": "MTc2", - "repeats": 9180 - }, - { - "count": 699720, - "lower_bound": "MTc3", - "upper_bound": "MTc3", - "repeats": 6120 - }, - { - "count": 704820, - "lower_bound": "MTc4", - "upper_bound": "MTc5", - "repeats": 3060 - }, - { - "count": 708900, - "lower_bound": "MTgw", - "upper_bound": "MTgw", - "repeats": 4080 - }, - { - "count": 714000, - "lower_bound": "MTgx", - "upper_bound": "MTgx", - "repeats": 5100 - }, - { - "count": 721140, - "lower_bound": "MTgy", - "upper_bound": "MTgy", - "repeats": 7140 - }, - { - "count": 728280, - "lower_bound": "MTgz", - "upper_bound": "MTgz", - "repeats": 7140 - }, - { - "count": 734400, - "lower_bound": "MTg0", - "upper_bound": "MTg0", - "repeats": 6120 - }, - { - "count": 741540, - "lower_bound": "MTg1", - "upper_bound": "MTg1", - "repeats": 7140 - }, - { - "count": 745620, - "lower_bound": "MTg2", - "upper_bound": "MTg2", - "repeats": 4080 - }, - { - "count": 752760, - "lower_bound": "MTg3", - "upper_bound": "MTg4", - "repeats": 4080 - }, - { - "count": 757860, - "lower_bound": "MTg5", - "upper_bound": "MTg5", - "repeats": 5100 - }, - { - "count": 762960, - "lower_bound": "MTkw", - "upper_bound": "MTkx", - "repeats": 3060 - }, - { - "count": 770100, - "lower_bound": "MTky", - "upper_bound": "MTky", - "repeats": 7140 - }, - { - "count": 778260, - "lower_bound": "MTkz", - "upper_bound": "MTk0", - "repeats": 5100 - }, - { - "count": 786420, - "lower_bound": "MTk1", - "upper_bound": "MTk2", - "repeats": 6120 - }, - { - "count": 790500, - "lower_bound": "MTk3", - "upper_bound": "MTk3", - "repeats": 4080 - }, - { - "count": 797640, - "lower_bound": "MTk4", - "upper_bound": "MTk4", - "repeats": 7140 - }, - { - "count": 801720, - "lower_bound": "MTk5", - "upper_bound": "MTk5", - "repeats": 4080 - }, - { - "count": 805800, - "lower_bound": "MjAw", - "upper_bound": "MjAw", - "repeats": 4080 - }, - { - "count": 810900, - "lower_bound": "MjAx", - "upper_bound": "MjAz", - "repeats": 2040 - }, - { - "count": 814980, - "lower_bound": "MjA0", - "upper_bound": "MjA0", - "repeats": 4080 - }, - { - "count": 819060, - "lower_bound": "MjA1", - "upper_bound": "MjA1", - "repeats": 4080 - }, - { - "count": 826200, - "lower_bound": "MjA2", - "upper_bound": "MjA3", - "repeats": 4080 - }, - { - "count": 830280, - "lower_bound": "MjA4", - "upper_bound": "MjA5", - "repeats": 1020 - }, - { - "count": 837420, - "lower_bound": "MjEw", - "upper_bound": "MjEw", - "repeats": 7140 - }, - { - "count": 842520, - "lower_bound": "MjEx", - "upper_bound": "MjEx", - "repeats": 5100 - }, - { - "count": 847620, - "lower_bound": "MjEy", - "upper_bound": "MjEz", - "repeats": 4080 - }, - { - "count": 856800, - "lower_bound": "MjE0", - "upper_bound": "MjE1", - "repeats": 6120 - }, - { - "count": 862920, - "lower_bound": "MjE2", - "upper_bound": "MjE2", - "repeats": 6120 - }, - { - "count": 868020, - "lower_bound": "MjE3", - "upper_bound": "MjE3", - "repeats": 5100 - }, - { - "count": 872100, - "lower_bound": "MjE4", - "upper_bound": "MjE4", - "repeats": 4080 - }, - { - "count": 878220, - "lower_bound": "MjE5", - "upper_bound": "MjE5", - "repeats": 6120 - }, - { - "count": 885360, - "lower_bound": "MjIw", - "upper_bound": "MjIx", - "repeats": 4080 - }, - { - "count": 893520, - "lower_bound": "MjIy", - "upper_bound": "MjIy", - "repeats": 8160 - }, - { - "count": 900660, - "lower_bound": "MjIz", - "upper_bound": "MjIz", - "repeats": 7140 - }, - { - "count": 904740, - "lower_bound": "MjI0", - "upper_bound": "MjI0", - "repeats": 4080 - }, - { - "count": 910860, - "lower_bound": "MjI1", - "upper_bound": "MjI1", - "repeats": 6120 - }, - { - "count": 915960, - "lower_bound": "MjI2", - "upper_bound": "MjI2", - "repeats": 5100 - }, - { - "count": 922080, - "lower_bound": "MjI3", - "upper_bound": "MjI3", - "repeats": 6120 - }, - { - "count": 926160, - "lower_bound": "MjI4", - "upper_bound": "MjI4", - "repeats": 4080 - }, - { - "count": 935340, - "lower_bound": "MjI5", - "upper_bound": "MjMw", - "repeats": 6120 - }, - { - "count": 943500, - "lower_bound": "MjMx", - "upper_bound": "MjMy", - "repeats": 5100 - }, - { - "count": 953700, - "lower_bound": "MjMz", - "upper_bound": "MjM0", - "repeats": 9180 - }, - { - "count": 959820, - "lower_bound": "MjM1", - "upper_bound": "MjM1", - "repeats": 6120 - }, - { - "count": 964920, - "lower_bound": "MjM2", - "upper_bound": "MjM2", - "repeats": 5100 - }, - { - "count": 970020, - "lower_bound": "MjM3", - "upper_bound": "MjM3", - "repeats": 5100 - }, - { - "count": 975120, - "lower_bound": "MjM4", - "upper_bound": "MjM4", - "repeats": 5100 - }, - { - "count": 981240, - "lower_bound": "MjM5", - "upper_bound": "MjQw", - "repeats": 3060 - }, - { - "count": 988380, - "lower_bound": "MjQx", - "upper_bound": "MjQy", - "repeats": 6120 - }, - { - "count": 993480, - "lower_bound": "MjQz", - "upper_bound": "MjQ0", - "repeats": 2040 - }, - { - "count": 1001640, - "lower_bound": "MjQ1", - "upper_bound": "MjQ2", - "repeats": 5100 - }, - { - "count": 1007760, - "lower_bound": "MjQ3", - "upper_bound": "MjQ3", - "repeats": 6120 - }, - { - "count": 1013880, - "lower_bound": "MjQ4", - "upper_bound": "MjQ5", - "repeats": 4080 - }, - { - "count": 1020000, - "lower_bound": "MjUw", - "upper_bound": "MjUw", - "repeats": 6120 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 434, - 8115, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4206, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3897, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4470, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3982, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 0, - 0, - 453, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4162, - 0, - 0, - 0, - 4189, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 3989, - 0, - 4027, - 3991, - 0, - 4187, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 4210, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 468, - 0, - 0, - 0, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3966, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 439, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4195, - 4038, - 0, - 0, - 0, - 443, - 0, - 0, - 4081, - 0, - 0, - 0, - 4112, - 459, - 0, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 489, - 0, - 0, - 0, - 0, - 0, - 3935, - 0, - 8149, - 4076, - 0, - 441, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 4086, - 0, - 0, - 4020, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4000, - 0, - 0, - 4156, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4115, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4556, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4197, - 0, - 0, - 0, - 4056, - 4194, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4171, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 476, - 0, - 4102, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 4195, - 0, - 0, - 0, - 0, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 4019, - 0, - 0, - 0, - 4011, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 435, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3979, - 4015, - 4117, - 0, - 0, - 3996, - 8003, - 0, - 0, - 0, - 0, - 4117, - 0, - 4098, - 4090, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4508, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4029, - 4083, - 4035, - 0, - 0, - 4039, - 0, - 4129, - 0, - 0, - 0, - 0, - 483, - 4131, - 0, - 0, - 0, - 4175, - 0, - 4078, - 0, - 4094, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 475, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 4044, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 446, - 4133, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 8124, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4142, - 4152, - 0, - 4182, - 0, - 0, - 4122, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 0, - 0, - 0, - 450, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 0, - 0, - 0, - 462, - 3959, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 452, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4006, - 4180, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 496, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 464, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8106, - 4081, - 0, - 4049, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4095, - 0, - 4145, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3952, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 427, - 4104, - 4024, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 455, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 444, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 480, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 4183, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4082, - 0, - 0, - 0, - 0, - 448, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4045, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8019, - 0, - 430, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4561, - 485, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 4058, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 437, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 4178, - 487, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 457, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 432, - 0, - 0, - 0, - 8210, - 0, - 4140, - 4065, - 4105, - 0, - 0, - 0, - 0, - 0, - 4146, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8278, - 0, - 0, - 4160, - 0, - 0, - 0, - 0, - 4109, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8178, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 11936, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 4208, - 0, - 0, - 0, - 0, - 466, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 8137, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4183, - 0, - 476, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4020, - 0, - 459, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 4095, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 457, - 0, - 4091, - 4090, - 4104, - 4122, - 0, - 0, - 0, - 0, - 4160, - 0, - 0, - 0, - 0, - 0, - 0, - 482, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4015, - 4037, - 0, - 0, - 3952, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 4206, - 0, - 0, - 0, - 462, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4536, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 428, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8231, - 0, - 0, - 4150, - 0, - 16350, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4171, - 0, - 0, - 0, - 4083, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 432, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4045, - 448, - 0, - 0, - 4052, - 0, - 0, - 0, - 3980, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4178, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4208, - 0, - 0, - 0, - 0, - 4004, - 4064, - 0, - 0, - 455, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 446, - 0, - 4680, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 3966, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 468, - 0, - 0, - 0, - 0, - 0, - 466, - 4052, - 0, - 0, - 4117, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 461, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 4016, - 4085, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 4050, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 475, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 4049, - 0, - 0, - 3935, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 4069, - 4102, - 0, - 3991, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 453, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3943, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4216, - 0, - 0, - 4034, - 435, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 494, - 0, - 4011, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8123, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 4089, - 0, - 4051, - 4162, - 0, - 0, - 0, - 0, - 0, - 0, - 8227, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 471, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8513, - 0, - 0, - 0, - 0, - 4058, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 4189, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4180, - 489, - 0, - 3982, - 0, - 0, - 0, - 8230, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3942, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 8218, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 473, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3897, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 4106, - 0, - 0, - 4127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 439, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 4024, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 4114, - 4142, - 0, - 4115, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 4027, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 4210, - 0, - 443, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 4019, - 0, - 0, - 437, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8264, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 480, - 0, - 0, - 4111, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 430, - 0, - 0, - 0, - 0, - 0, - 0, - 8123, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 452, - 4057, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4000, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 444, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 0, - 0, - 0, - 3996, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4152, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3979, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 4156, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 4062, - 0, - 0, - 441, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 0, - 434, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4593, - 0, - 427, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 0, - 0, - 0, - 4131, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3999, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4065, - 0, - 0, - 483, - 0, - 0, - 0, - 3918, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4187, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4182, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 443, - 0, - 4056, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 4146, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8142, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 427, - 0, - 0, - 0, - 0, - 0, - 8368, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 4081, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 4210, - 0, - 0, - 0, - 0, - 0, - 4027, - 0, - 4021, - 0, - 3897, - 4195, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3942, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 446, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 461, - 4058, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 0, - 0, - 0, - 0, - 8245, - 0, - 0, - 4049, - 0, - 4069, - 0, - 3975, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 4152, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4082, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 4183, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 8054, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 0, - 3996, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4160, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 4130, - 0, - 4195, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 3979, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 457, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 475, - 0, - 4000, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4206, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4085, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 482, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 4072, - 0, - 0, - 4055, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 4095, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 4024, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 4182, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 437, - 0, - 0, - 4194, - 0, - 0, - 0, - 8280, - 4131, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3980, - 0, - 0, - 0, - 483, - 0, - 8078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 441, - 0, - 0, - 0, - 0, - 0, - 0, - 450, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4180, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 468, - 0, - 4089, - 3952, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 3918, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 432, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 435, - 0, - 0, - 0, - 0, - 0, - 3935, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 0, - 4112, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8118, - 0, - 4011, - 0, - 430, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 4111, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 0, - 4071, - 4088, - 0, - 0, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4208, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4045, - 0, - 0, - 0, - 480, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 448, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4142, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4178, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 4122, - 0, - 466, - 0, - 0, - 0, - 0, - 4515, - 0, - 0, - 0, - 0, - 0, - 0, - 8153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 476, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 464, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 453, - 0, - 0, - 485, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 0, - 0, - 0, - 0, - 4187, - 0, - 0, - 0, - 0, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 434, - 0, - 0, - 0, - 462, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4020, - 0, - 0, - 0, - 4090, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 4111, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 489, - 0, - 0, - 0, - 473, - 0, - 0, - 0, - 4015, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 459, - 0, - 0, - 0, - 0, - 0, - 455, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8161, - 0, - 0, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 444, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 4111, - 4115, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4189, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 3943, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 487, - 0, - 0, - 0, - 0, - 4059, - 4064, - 4019, - 0, - 0, - 0, - 3967, - 4037, - 0, - 0, - 4109, - 428, - 0, - 0, - 0, - 4016, - 0, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 4479, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 439, - 0, - 4078, - 4140, - 0, - 4080, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 4044, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 452, - 0, - 0, - 0, - 4057, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3982, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4216, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 4065, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 4051, - 4091, - 4050, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 4102, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4178, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 3918, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 441, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 926, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 489, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 8022, - 0, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 452, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8123, - 0, - 4044, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4162, - 0, - 0, - 0, - 437, - 0, - 8143, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 4083, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 8037, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 485, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 427, - 475, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4024, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4195, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 464, - 0, - 0, - 4066, - 0, - 0, - 0, - 8211, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4127, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 4189, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4085, - 4055, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 439, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 4102, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 0, - 455, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 3943, - 0, - 0, - 476, - 0, - 471, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 4083, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3982, - 0, - 0, - 4082, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 462, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 4105, - 4180, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 4160, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 450, - 0, - 0, - 4183, - 4079, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 0, - 4565, - 0, - 443, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4152, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4206, - 0, - 0, - 0, - 4037, - 4090, - 0, - 0, - 0, - 0, - 0, - 0, - 457, - 0, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 4216, - 0, - 3959, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4017, - 480, - 4104, - 8119, - 0, - 4106, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4195, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 4122, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 4081, - 0, - 4210, - 0, - 0, - 0, - 4084, - 4020, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 4027, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 4187, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 0, - 482, - 0, - 0, - 0, - 0, - 0, - 3966, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 4146, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 435, - 0, - 459, - 0, - 0, - 0, - 0, - 3897, - 468, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 862, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 4011, - 3980, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 3935, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 4142, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8053, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 4112, - 0, - 3979, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 4095, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4058, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 4098, - 4073, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 432, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 4098, - 0, - 0, - 4067, - 0, - 4000, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 4059, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3952, - 4182, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 492, - 444, - 0, - 0, - 0, - 4112, - 0, - 0, - 4049, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 4208, - 0, - 4131, - 0, - 0, - 0, - 0, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8112, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8283, - 0, - 0, - 0, - 487, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 0, - 0, - 0, - 446, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4197, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 483, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 4052, - 4194, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4004, - 0, - 8110, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 466, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 4035, - 4083, - 448, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 8210, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 4095, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 432, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4006, - 0, - 4127, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 475, - 0, - 0, - 0, - 0, - 4056, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4146, - 3897, - 0, - 0, - 0, - 4076, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3979, - 0, - 4090, - 0, - 3983, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4195, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4208, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3952, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3942, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4015, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4085, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 4083, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 4079, - 0, - 0, - 0, - 4182, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4468, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4020, - 4066, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4000, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 473, - 0, - 0, - 0, - 0, - 452, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 4180, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 0, - 4474, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 427, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 489, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 4088, - 0, - 0, - 4609, - 4187, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 450, - 8208, - 0, - 4071, - 0, - 0, - 4045, - 4044, - 0, - 0, - 0, - 0, - 4112, - 453, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 428, - 0, - 0, - 4066, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 448, - 0, - 0, - 0, - 4078, - 0, - 459, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 480, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4178, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 4105, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 483, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4019, - 0, - 4037, - 0, - 0, - 0, - 4052, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 4115, - 0, - 4166, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 4194, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 4104, - 0, - 0, - 0, - 4162, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 434, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4160, - 0, - 4086, - 4021, - 0, - 0, - 4104, - 0, - 4037, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 4082, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 4156, - 0, - 0, - 0, - 4062, - 0, - 0, - 0, - 0, - 0, - 0, - 490, - 0, - 492, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 3918, - 0, - 0, - 3999, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 4206, - 0, - 0, - 0, - 0, - 0, - 4049, - 0, - 4183, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 485, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4189, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 441, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 896, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4500, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 435, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 446, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4142, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 468, - 0, - 0, - 0, - 0, - 0, - 8163, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4171, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 471, - 0, - 464, - 4018, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 4197, - 0, - 0, - 0, - 0, - 4122, - 3982, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 482, - 0, - 0, - 0, - 3943, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 494, - 3935, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 443, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 455, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 3980, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 4109, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 444, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 487, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 437, - 4140, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 4195, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 4073, - 0, - 0, - 4051, - 0, - 3975, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 4216, - 0, - 4106, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4210, - 4035, - 0, - 0, - 4059, - 0, - 462, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 0, - 0, - 0, - 0, - 8092, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4024, - 4492, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ], - "top_n": [ - { - "data": "CCY=", - "count": 3631 - }, - { - "data": "CMwD", - "count": 3675 - }, - { - "data": "CLwD", - "count": 3665 - }, - { - "data": "CFY=", - "count": 3780 - }, - { - "data": "CDw=", - "count": 3524 - }, - { - "data": "CGY=", - "count": 3583 - }, - { - "data": "CDQ=", - "count": 3391 - }, - { - "data": "CDA=", - "count": 3655 - }, - { - "data": "CJwB", - "count": 3725 - }, - { - "data": "CKgC", - "count": 3633 - }, - { - "data": "CIAD", - "count": 3658 - }, - { - "data": "CIAC", - "count": 3598 - }, - { - "data": "CKIB", - "count": 3643 - }, - { - "data": "CL4D", - "count": 3564 - }, - { - "data": "CLIC", - "count": 3603 - }, - { - "data": "CNAB", - "count": 3590 - }, - { - "data": "CIgD", - "count": 3578 - }, - { - "data": "CO4C", - "count": 3617 - }, - { - "data": "CMwB", - "count": 3708 - }, - { - "data": "CPIC", - "count": 3641 - }, - { - "data": "CLgB", - "count": 3630 - }, - { - "data": "CJgC", - "count": 3739 - }, - { - "data": "CHI=", - "count": 3633 - }, - { - "data": "CLAD", - "count": 3680 - }, - { - "data": "CKAC", - "count": 3619 - }, - { - "data": "CMgC", - "count": 3748 - }, - { - "data": "COAC", - "count": 3673 - }, - { - "data": "CIwD", - "count": 3708 - }, - { - "data": "CMID", - "count": 3610 - }, - { - "data": "COQD", - "count": 3787 - }, - { - "data": "CPoB", - "count": 3537 - }, - { - "data": "CKQD", - "count": 3678 - }, - { - "data": "COwC", - "count": 3664 - }, - { - "data": "CNYD", - "count": 3689 - }, - { - "data": "CMIC", - "count": 3471 - }, - { - "data": "CEQ=", - "count": 3692 - }, - { - "data": "CFg=", - "count": 3671 - }, - { - "data": "CMYD", - "count": 3645 - }, - { - "data": "CHw=", - "count": 3602 - }, - { - "data": "CNQD", - "count": 3492 - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 1783274, - "last_update_version": 412596210111086592, - "correlation": -0.003537 - }, - "b": { - "histogram": { - "ndv": 29468, - "buckets": [ - { - "count": 4080, - "lower_bound": "MTQ=", - "upper_bound": "MTM0", - "repeats": 34 - }, - { - "count": 8160, - "lower_bound": "MTk4", - "upper_bound": "MjIz", - "repeats": 34 - }, - { - "count": 12240, - "lower_bound": "MjU5", - "upper_bound": "NDE3", - "repeats": 34 - }, - { - "count": 16320, - "lower_bound": "NDE5", - "upper_bound": "NTI4", - "repeats": 34 - }, - { - "count": 20400, - "lower_bound": "NTY4", - "upper_bound": "NjI2", - "repeats": 34 - }, - { - "count": 24480, - "lower_bound": "NjUw", - "upper_bound": "Nzc3", - "repeats": 34 - }, - { - "count": 28560, - "lower_bound": "ODIw", - "upper_bound": "ODU0", - "repeats": 34 - }, - { - "count": 32640, - "lower_bound": "ODU5", - "upper_bound": "ODk4", - "repeats": 34 - }, - { - "count": 36720, - "lower_bound": "MTAzNA==", - "upper_bound": "MTEwMg==", - "repeats": 34 - }, - { - "count": 40800, - "lower_bound": "MTE1Mw==", - "upper_bound": "MTE5OQ==", - "repeats": 34 - }, - { - "count": 44880, - "lower_bound": "MTI3Nw==", - "upper_bound": "MTM2Ng==", - "repeats": 34 - }, - { - "count": 48960, - "lower_bound": "MTM5MQ==", - "upper_bound": "MTQyOA==", - "repeats": 34 - }, - { - "count": 53040, - "lower_bound": "MTQzOA==", - "upper_bound": "MTY0Nw==", - "repeats": 34 - }, - { - "count": 57120, - "lower_bound": "MTY1Mw==", - "upper_bound": "MTcwMA==", - "repeats": 34 - }, - { - "count": 61200, - "lower_bound": "MTcxNg==", - "upper_bound": "MTc0NQ==", - "repeats": 1054 - }, - { - "count": 65280, - "lower_bound": "MTc1Mw==", - "upper_bound": "MTgwMw==", - "repeats": 34 - }, - { - "count": 69360, - "lower_bound": "MTgxMg==", - "upper_bound": "MTg5Mw==", - "repeats": 34 - }, - { - "count": 73440, - "lower_bound": "MTg5Ng==", - "upper_bound": "MTk3Ng==", - "repeats": 34 - }, - { - "count": 77520, - "lower_bound": "MTk4Nw==", - "upper_bound": "MjEwOA==", - "repeats": 34 - }, - { - "count": 81600, - "lower_bound": "MjExNw==", - "upper_bound": "MjI0Nw==", - "repeats": 34 - }, - { - "count": 85680, - "lower_bound": "MjI1MQ==", - "upper_bound": "MjMzOQ==", - "repeats": 34 - }, - { - "count": 89760, - "lower_bound": "MjM1MQ==", - "upper_bound": "MjUyNg==", - "repeats": 34 - }, - { - "count": 93840, - "lower_bound": "MjUzNw==", - "upper_bound": "MjU5NQ==", - "repeats": 34 - }, - { - "count": 97920, - "lower_bound": "MjYxMg==", - "upper_bound": "MjY0Nw==", - "repeats": 34 - }, - { - "count": 102000, - "lower_bound": "MjY0OQ==", - "upper_bound": "MjczMA==", - "repeats": 34 - }, - { - "count": 106080, - "lower_bound": "Mjc3Mg==", - "upper_bound": "MjgxOQ==", - "repeats": 34 - }, - { - "count": 110160, - "lower_bound": "MjgzNA==", - "upper_bound": "Mjk2NA==", - "repeats": 34 - }, - { - "count": 114240, - "lower_bound": "MzAwOA==", - "upper_bound": "MzA4NA==", - "repeats": 34 - }, - { - "count": 118320, - "lower_bound": "MzExMg==", - "upper_bound": "MzEzMA==", - "repeats": 34 - }, - { - "count": 122400, - "lower_bound": "MzIxNQ==", - "upper_bound": "MzMxNQ==", - "repeats": 34 - }, - { - "count": 126480, - "lower_bound": "MzM5MQ==", - "upper_bound": "MzQ0OA==", - "repeats": 34 - }, - { - "count": 130560, - "lower_bound": "MzQ2MA==", - "upper_bound": "MzUwNg==", - "repeats": 34 - }, - { - "count": 134640, - "lower_bound": "MzUwNw==", - "upper_bound": "MzY1Ng==", - "repeats": 34 - }, - { - "count": 138720, - "lower_bound": "MzY4Ng==", - "upper_bound": "Mzc0OA==", - "repeats": 34 - }, - { - "count": 142800, - "lower_bound": "Mzc1OA==", - "upper_bound": "MzgxMA==", - "repeats": 34 - }, - { - "count": 146880, - "lower_bound": "MzgyMg==", - "upper_bound": "Mzk0Nw==", - "repeats": 34 - }, - { - "count": 150960, - "lower_bound": "Mzk3Mw==", - "upper_bound": "NDAyNQ==", - "repeats": 34 - }, - { - "count": 155040, - "lower_bound": "NDA0MA==", - "upper_bound": "NDEzMg==", - "repeats": 34 - }, - { - "count": 159120, - "lower_bound": "NDE1MQ==", - "upper_bound": "NDI0NQ==", - "repeats": 34 - }, - { - "count": 163200, - "lower_bound": "NDI0Ng==", - "upper_bound": "NDI5MA==", - "repeats": 34 - }, - { - "count": 167280, - "lower_bound": "NDMwMQ==", - "upper_bound": "NDM4Nw==", - "repeats": 34 - }, - { - "count": 171360, - "lower_bound": "NDQ1Ng==", - "upper_bound": "NDU0Nw==", - "repeats": 34 - }, - { - "count": 175440, - "lower_bound": "NDU4MA==", - "upper_bound": "NDc0Mg==", - "repeats": 34 - }, - { - "count": 179520, - "lower_bound": "NDc1Mg==", - "upper_bound": "NDgwMg==", - "repeats": 34 - }, - { - "count": 183600, - "lower_bound": "NDgyOQ==", - "upper_bound": "NDkwNw==", - "repeats": 34 - }, - { - "count": 187680, - "lower_bound": "NDkyMA==", - "upper_bound": "NTEyMQ==", - "repeats": 34 - }, - { - "count": 191760, - "lower_bound": "NTE2Ng==", - "upper_bound": "NTI3Ng==", - "repeats": 34 - }, - { - "count": 195840, - "lower_bound": "NTI5NA==", - "upper_bound": "NTM4NQ==", - "repeats": 34 - }, - { - "count": 199920, - "lower_bound": "NTQzMw==", - "upper_bound": "NTUxMg==", - "repeats": 34 - }, - { - "count": 204000, - "lower_bound": "NTU2MA==", - "upper_bound": "NTY4Nw==", - "repeats": 34 - }, - { - "count": 208080, - "lower_bound": "NTcyNg==", - "upper_bound": "NTg2OQ==", - "repeats": 34 - }, - { - "count": 212160, - "lower_bound": "NTg3NQ==", - "upper_bound": "NTkwMg==", - "repeats": 34 - }, - { - "count": 216240, - "lower_bound": "NTkwNw==", - "upper_bound": "NTk3Ng==", - "repeats": 34 - }, - { - "count": 220320, - "lower_bound": "NTk5Nw==", - "upper_bound": "NjA0NQ==", - "repeats": 34 - }, - { - "count": 224400, - "lower_bound": "NjA0OA==", - "upper_bound": "NjIxMg==", - "repeats": 34 - }, - { - "count": 228480, - "lower_bound": "NjM4MA==", - "upper_bound": "NjUwOQ==", - "repeats": 34 - }, - { - "count": 232560, - "lower_bound": "NjU2OA==", - "upper_bound": "NjYzMw==", - "repeats": 34 - }, - { - "count": 236640, - "lower_bound": "NjY1Mw==", - "upper_bound": "Njc4OQ==", - "repeats": 34 - }, - { - "count": 240720, - "lower_bound": "Njc5NA==", - "upper_bound": "Njg1MQ==", - "repeats": 34 - }, - { - "count": 244800, - "lower_bound": "Njg2NA==", - "upper_bound": "NjkyMA==", - "repeats": 34 - }, - { - "count": 248880, - "lower_bound": "NjkyOQ==", - "upper_bound": "NzAzOA==", - "repeats": 34 - }, - { - "count": 252960, - "lower_bound": "NzA4OQ==", - "upper_bound": "NzE4MA==", - "repeats": 34 - }, - { - "count": 257040, - "lower_bound": "NzE5Ng==", - "upper_bound": "NzI5Ng==", - "repeats": 34 - }, - { - "count": 261120, - "lower_bound": "NzMxMA==", - "upper_bound": "NzQ3Ng==", - "repeats": 34 - }, - { - "count": 265200, - "lower_bound": "NzU3Ng==", - "upper_bound": "NzcwNw==", - "repeats": 34 - }, - { - "count": 269280, - "lower_bound": "NzczNg==", - "upper_bound": "Nzg3OA==", - "repeats": 34 - }, - { - "count": 273360, - "lower_bound": "Nzg4OQ==", - "upper_bound": "NzkyMg==", - "repeats": 34 - }, - { - "count": 277440, - "lower_bound": "NzkyOA==", - "upper_bound": "ODAxNg==", - "repeats": 34 - }, - { - "count": 281520, - "lower_bound": "ODA0MA==", - "upper_bound": "ODA5MA==", - "repeats": 1054 - }, - { - "count": 285600, - "lower_bound": "ODA5Mw==", - "upper_bound": "ODE0MA==", - "repeats": 34 - }, - { - "count": 289680, - "lower_bound": "ODE1Nw==", - "upper_bound": "ODI0Mg==", - "repeats": 34 - }, - { - "count": 293760, - "lower_bound": "ODI4Ng==", - "upper_bound": "ODMzOQ==", - "repeats": 34 - }, - { - "count": 297840, - "lower_bound": "ODM0NA==", - "upper_bound": "ODQxOQ==", - "repeats": 34 - }, - { - "count": 301920, - "lower_bound": "ODQzNg==", - "upper_bound": "ODQ3Ng==", - "repeats": 34 - }, - { - "count": 306000, - "lower_bound": "ODUwOQ==", - "upper_bound": "ODU3Ng==", - "repeats": 34 - }, - { - "count": 310080, - "lower_bound": "ODU5OA==", - "upper_bound": "ODY2NA==", - "repeats": 34 - }, - { - "count": 314160, - "lower_bound": "ODcyNg==", - "upper_bound": "ODg5Ng==", - "repeats": 34 - }, - { - "count": 318240, - "lower_bound": "ODkyOQ==", - "upper_bound": "OTA0OQ==", - "repeats": 34 - }, - { - "count": 322320, - "lower_bound": "OTA1Nw==", - "upper_bound": "OTA3Mg==", - "repeats": 34 - }, - { - "count": 326400, - "lower_bound": "OTA4Mg==", - "upper_bound": "OTE0Nw==", - "repeats": 34 - }, - { - "count": 330480, - "lower_bound": "OTE5Nw==", - "upper_bound": "OTM0MQ==", - "repeats": 34 - }, - { - "count": 334560, - "lower_bound": "OTM3NQ==", - "upper_bound": "OTQ5Nw==", - "repeats": 34 - }, - { - "count": 338640, - "lower_bound": "OTU2Ng==", - "upper_bound": "OTYyNg==", - "repeats": 34 - }, - { - "count": 342720, - "lower_bound": "OTYzMg==", - "upper_bound": "OTcxMA==", - "repeats": 34 - }, - { - "count": 346800, - "lower_bound": "OTcxMw==", - "upper_bound": "OTgyMA==", - "repeats": 34 - }, - { - "count": 350880, - "lower_bound": "OTgzNQ==", - "upper_bound": "OTg5MQ==", - "repeats": 34 - }, - { - "count": 354960, - "lower_bound": "OTkwNQ==", - "upper_bound": "MTAwNjI=", - "repeats": 34 - }, - { - "count": 359040, - "lower_bound": "MTAwNjg=", - "upper_bound": "MTAxMDc=", - "repeats": 34 - }, - { - "count": 363120, - "lower_bound": "MTAxMTc=", - "upper_bound": "MTAyNDY=", - "repeats": 34 - }, - { - "count": 367200, - "lower_bound": "MTAzMzc=", - "upper_bound": "MTA0NDE=", - "repeats": 34 - }, - { - "count": 371280, - "lower_bound": "MTA0OTI=", - "upper_bound": "MTA1MzE=", - "repeats": 34 - }, - { - "count": 375360, - "lower_bound": "MTA1OTM=", - "upper_bound": "MTA3MjU=", - "repeats": 34 - }, - { - "count": 379440, - "lower_bound": "MTA3Mzg=", - "upper_bound": "MTA4NzE=", - "repeats": 34 - }, - { - "count": 383520, - "lower_bound": "MTA5MTI=", - "upper_bound": "MTEwNTA=", - "repeats": 34 - }, - { - "count": 387600, - "lower_bound": "MTEwNzk=", - "upper_bound": "MTEyMDI=", - "repeats": 34 - }, - { - "count": 391680, - "lower_bound": "MTEyMzQ=", - "upper_bound": "MTEyNzY=", - "repeats": 34 - }, - { - "count": 395760, - "lower_bound": "MTEyOTM=", - "upper_bound": "MTEzNTg=", - "repeats": 34 - }, - { - "count": 399840, - "lower_bound": "MTE0MzY=", - "upper_bound": "MTE1Mzg=", - "repeats": 34 - }, - { - "count": 403920, - "lower_bound": "MTE2NTA=", - "upper_bound": "MTE2ODI=", - "repeats": 34 - }, - { - "count": 408000, - "lower_bound": "MTE2ODc=", - "upper_bound": "MTE4MDc=", - "repeats": 34 - }, - { - "count": 412080, - "lower_bound": "MTE4MTA=", - "upper_bound": "MTE5MDY=", - "repeats": 34 - }, - { - "count": 416160, - "lower_bound": "MTE5NDk=", - "upper_bound": "MTE5OTU=", - "repeats": 34 - }, - { - "count": 420240, - "lower_bound": "MTIwMTg=", - "upper_bound": "MTIwOTc=", - "repeats": 34 - }, - { - "count": 424320, - "lower_bound": "MTIxNDI=", - "upper_bound": "MTIzNTQ=", - "repeats": 34 - }, - { - "count": 428400, - "lower_bound": "MTIzNjY=", - "upper_bound": "MTI1MTA=", - "repeats": 34 - }, - { - "count": 432480, - "lower_bound": "MTI1NDk=", - "upper_bound": "MTI1OTg=", - "repeats": 34 - }, - { - "count": 436560, - "lower_bound": "MTI2Mzk=", - "upper_bound": "MTI2NDc=", - "repeats": 34 - }, - { - "count": 440640, - "lower_bound": "MTI2OTc=", - "upper_bound": "MTI3OTM=", - "repeats": 34 - }, - { - "count": 444720, - "lower_bound": "MTI4NDc=", - "upper_bound": "MTI5NjY=", - "repeats": 34 - }, - { - "count": 448800, - "lower_bound": "MTI5OTA=", - "upper_bound": "MTMxNTI=", - "repeats": 34 - }, - { - "count": 452880, - "lower_bound": "MTMyMzE=", - "upper_bound": "MTMzMjg=", - "repeats": 34 - }, - { - "count": 456960, - "lower_bound": "MTM0MDU=", - "upper_bound": "MTM0ODE=", - "repeats": 34 - }, - { - "count": 461040, - "lower_bound": "MTM0ODY=", - "upper_bound": "MTM1NDk=", - "repeats": 34 - }, - { - "count": 465120, - "lower_bound": "MTM1NTU=", - "upper_bound": "MTM2OTQ=", - "repeats": 34 - }, - { - "count": 469200, - "lower_bound": "MTM2OTY=", - "upper_bound": "MTM3NDk=", - "repeats": 34 - }, - { - "count": 473280, - "lower_bound": "MTM3Nzk=", - "upper_bound": "MTM5MzE=", - "repeats": 34 - }, - { - "count": 477360, - "lower_bound": "MTM5ODc=", - "upper_bound": "MTQwNDY=", - "repeats": 34 - }, - { - "count": 481440, - "lower_bound": "MTQwNzE=", - "upper_bound": "MTQxOTY=", - "repeats": 34 - }, - { - "count": 485520, - "lower_bound": "MTQyMDE=", - "upper_bound": "MTQyODE=", - "repeats": 34 - }, - { - "count": 489600, - "lower_bound": "MTQzNDY=", - "upper_bound": "MTQzODI=", - "repeats": 34 - }, - { - "count": 493680, - "lower_bound": "MTQzOTY=", - "upper_bound": "MTQ1MDc=", - "repeats": 34 - }, - { - "count": 497760, - "lower_bound": "MTQ1NDE=", - "upper_bound": "MTQ2MDk=", - "repeats": 34 - }, - { - "count": 501840, - "lower_bound": "MTQ4ODM=", - "upper_bound": "MTQ5Njg=", - "repeats": 34 - }, - { - "count": 505920, - "lower_bound": "MTQ5OTE=", - "upper_bound": "MTUxNDg=", - "repeats": 34 - }, - { - "count": 510000, - "lower_bound": "MTUxNDk=", - "upper_bound": "MTUyMzg=", - "repeats": 34 - }, - { - "count": 514080, - "lower_bound": "MTUyNjU=", - "upper_bound": "MTU0MzE=", - "repeats": 34 - }, - { - "count": 518160, - "lower_bound": "MTU0NTY=", - "upper_bound": "MTU1NTA=", - "repeats": 34 - }, - { - "count": 522240, - "lower_bound": "MTU2Mjg=", - "upper_bound": "MTU3MTQ=", - "repeats": 34 - }, - { - "count": 526320, - "lower_bound": "MTU3NDE=", - "upper_bound": "MTU4MjA=", - "repeats": 34 - }, - { - "count": 530400, - "lower_bound": "MTU4NDg=", - "upper_bound": "MTU4OTY=", - "repeats": 34 - }, - { - "count": 534480, - "lower_bound": "MTU5MjE=", - "upper_bound": "MTYwMTA=", - "repeats": 34 - }, - { - "count": 538560, - "lower_bound": "MTYwNTM=", - "upper_bound": "MTYxNTY=", - "repeats": 34 - }, - { - "count": 542640, - "lower_bound": "MTYxNjY=", - "upper_bound": "MTYyNTc=", - "repeats": 34 - }, - { - "count": 546720, - "lower_bound": "MTYyNjA=", - "upper_bound": "MTYzMDA=", - "repeats": 34 - }, - { - "count": 550800, - "lower_bound": "MTYzMjA=", - "upper_bound": "MTYzOTM=", - "repeats": 34 - }, - { - "count": 554880, - "lower_bound": "MTY0MDA=", - "upper_bound": "MTY0NDk=", - "repeats": 34 - }, - { - "count": 558960, - "lower_bound": "MTY0NTA=", - "upper_bound": "MTY2MTY=", - "repeats": 34 - }, - { - "count": 563040, - "lower_bound": "MTY2MzI=", - "upper_bound": "MTY3MDM=", - "repeats": 34 - }, - { - "count": 567120, - "lower_bound": "MTY3Mzg=", - "upper_bound": "MTY4MDM=", - "repeats": 34 - }, - { - "count": 571200, - "lower_bound": "MTY4NjQ=", - "upper_bound": "MTY5Njc=", - "repeats": 34 - }, - { - "count": 575280, - "lower_bound": "MTY5NzY=", - "upper_bound": "MTcwNzE=", - "repeats": 34 - }, - { - "count": 579360, - "lower_bound": "MTcxMjQ=", - "upper_bound": "MTczMzI=", - "repeats": 34 - }, - { - "count": 583440, - "lower_bound": "MTczNDE=", - "upper_bound": "MTc0NDY=", - "repeats": 34 - }, - { - "count": 587520, - "lower_bound": "MTc1MjY=", - "upper_bound": "MTc2ODc=", - "repeats": 34 - }, - { - "count": 591600, - "lower_bound": "MTc3MDg=", - "upper_bound": "MTc3NjU=", - "repeats": 34 - }, - { - "count": 595680, - "lower_bound": "MTc3NzI=", - "upper_bound": "MTc4Njc=", - "repeats": 34 - }, - { - "count": 599760, - "lower_bound": "MTc5MDk=", - "upper_bound": "MTgwMDk=", - "repeats": 34 - }, - { - "count": 603840, - "lower_bound": "MTgwMzE=", - "upper_bound": "MTgwNzU=", - "repeats": 34 - }, - { - "count": 607920, - "lower_bound": "MTgxMDk=", - "upper_bound": "MTgxNTg=", - "repeats": 34 - }, - { - "count": 612000, - "lower_bound": "MTgyMTc=", - "upper_bound": "MTgzMjY=", - "repeats": 34 - }, - { - "count": 616080, - "lower_bound": "MTg0NTE=", - "upper_bound": "MTg1MzU=", - "repeats": 34 - }, - { - "count": 620160, - "lower_bound": "MTg1NTM=", - "upper_bound": "MTg1OTE=", - "repeats": 34 - }, - { - "count": 624240, - "lower_bound": "MTg1OTk=", - "upper_bound": "MTg2ODk=", - "repeats": 34 - }, - { - "count": 628320, - "lower_bound": "MTg3MDk=", - "upper_bound": "MTg3NTQ=", - "repeats": 34 - }, - { - "count": 632400, - "lower_bound": "MTg3ODQ=", - "upper_bound": "MTg4MjU=", - "repeats": 34 - }, - { - "count": 636480, - "lower_bound": "MTg4NTM=", - "upper_bound": "MTg5NzM=", - "repeats": 34 - }, - { - "count": 640560, - "lower_bound": "MTg5ODQ=", - "upper_bound": "MTkwNjY=", - "repeats": 34 - }, - { - "count": 644640, - "lower_bound": "MTkwOTY=", - "upper_bound": "MTkxNjY=", - "repeats": 34 - }, - { - "count": 648720, - "lower_bound": "MTkxNzY=", - "upper_bound": "MTkyNDU=", - "repeats": 34 - }, - { - "count": 652800, - "lower_bound": "MTkyNjU=", - "upper_bound": "MTkzNzM=", - "repeats": 34 - }, - { - "count": 656880, - "lower_bound": "MTk0Mjk=", - "upper_bound": "MTk0NzM=", - "repeats": 34 - }, - { - "count": 660960, - "lower_bound": "MTk1Mzk=", - "upper_bound": "MTk2NzQ=", - "repeats": 34 - }, - { - "count": 665040, - "lower_bound": "MTk3NDA=", - "upper_bound": "MTk3OTY=", - "repeats": 34 - }, - { - "count": 669120, - "lower_bound": "MTk4NzU=", - "upper_bound": "MTk5NzM=", - "repeats": 34 - }, - { - "count": 673200, - "lower_bound": "MjAwMjE=", - "upper_bound": "MjAxNTc=", - "repeats": 34 - }, - { - "count": 677280, - "lower_bound": "MjAyMjQ=", - "upper_bound": "MjAyODA=", - "repeats": 34 - }, - { - "count": 681360, - "lower_bound": "MjAzODg=", - "upper_bound": "MjA0Mzg=", - "repeats": 34 - }, - { - "count": 685440, - "lower_bound": "MjA0NDU=", - "upper_bound": "MjA1MTA=", - "repeats": 34 - }, - { - "count": 689520, - "lower_bound": "MjA1MzE=", - "upper_bound": "MjA2MDk=", - "repeats": 34 - }, - { - "count": 693600, - "lower_bound": "MjA2NDM=", - "upper_bound": "MjA2OTE=", - "repeats": 34 - }, - { - "count": 697680, - "lower_bound": "MjA3Mjc=", - "upper_bound": "MjA3ODI=", - "repeats": 34 - }, - { - "count": 701760, - "lower_bound": "MjA4MzE=", - "upper_bound": "MjA4NTM=", - "repeats": 34 - }, - { - "count": 705840, - "lower_bound": "MjA4NzM=", - "upper_bound": "MjA5MDM=", - "repeats": 34 - }, - { - "count": 709920, - "lower_bound": "MjEwNjA=", - "upper_bound": "MjEyOTU=", - "repeats": 34 - }, - { - "count": 714000, - "lower_bound": "MjEzNTk=", - "upper_bound": "MjE0ODE=", - "repeats": 34 - }, - { - "count": 718080, - "lower_bound": "MjE1MTc=", - "upper_bound": "MjE2MjY=", - "repeats": 34 - }, - { - "count": 723180, - "lower_bound": "MjE2Mjg=", - "upper_bound": "MjE4MDk=", - "repeats": 1054 - }, - { - "count": 727260, - "lower_bound": "MjE4NDE=", - "upper_bound": "MjE5MzM=", - "repeats": 34 - }, - { - "count": 731340, - "lower_bound": "MjE5NDI=", - "upper_bound": "MjIwNTU=", - "repeats": 34 - }, - { - "count": 735420, - "lower_bound": "MjIwNzc=", - "upper_bound": "MjIxODI=", - "repeats": 34 - }, - { - "count": 739500, - "lower_bound": "MjIxOTU=", - "upper_bound": "MjIzMDg=", - "repeats": 34 - }, - { - "count": 758880, - "lower_bound": "MjIzMzY=", - "upper_bound": "MjIzMzY=", - "repeats": 18394 - }, - { - "count": 762960, - "lower_bound": "MjIzNDk=", - "upper_bound": "MjIzOTM=", - "repeats": 34 - }, - { - "count": 767040, - "lower_bound": "MjI0NjE=", - "upper_bound": "MjI1NDg=", - "repeats": 34 - }, - { - "count": 771120, - "lower_bound": "MjI1Njc=", - "upper_bound": "MjI3NDE=", - "repeats": 34 - }, - { - "count": 775200, - "lower_bound": "MjI3NjU=", - "upper_bound": "MjI4NjA=", - "repeats": 34 - }, - { - "count": 779280, - "lower_bound": "MjI5MTM=", - "upper_bound": "MjI5OTk=", - "repeats": 34 - }, - { - "count": 783360, - "lower_bound": "MjMwMTQ=", - "upper_bound": "MjMwOTU=", - "repeats": 34 - }, - { - "count": 787440, - "lower_bound": "MjMxMTk=", - "upper_bound": "MjMyNTI=", - "repeats": 34 - }, - { - "count": 791520, - "lower_bound": "MjMzNTQ=", - "upper_bound": "MjM0Mjk=", - "repeats": 34 - }, - { - "count": 795600, - "lower_bound": "MjM0MzE=", - "upper_bound": "MjM1NDE=", - "repeats": 34 - }, - { - "count": 799680, - "lower_bound": "MjM1Njg=", - "upper_bound": "MjM2NDQ=", - "repeats": 34 - }, - { - "count": 803760, - "lower_bound": "MjM2NjA=", - "upper_bound": "MjM3ODY=", - "repeats": 34 - }, - { - "count": 807840, - "lower_bound": "MjM4NjQ=", - "upper_bound": "MjQwNTc=", - "repeats": 34 - }, - { - "count": 811920, - "lower_bound": "MjQxOTE=", - "upper_bound": "MjQyODE=", - "repeats": 34 - }, - { - "count": 816000, - "lower_bound": "MjQzMzA=", - "upper_bound": "MjQ0MDM=", - "repeats": 34 - }, - { - "count": 820080, - "lower_bound": "MjQ0MzQ=", - "upper_bound": "MjQ1MDM=", - "repeats": 34 - }, - { - "count": 824160, - "lower_bound": "MjQ1NDM=", - "upper_bound": "MjQ2NTI=", - "repeats": 34 - }, - { - "count": 828240, - "lower_bound": "MjQ2NjI=", - "upper_bound": "MjQ3MDQ=", - "repeats": 34 - }, - { - "count": 832320, - "lower_bound": "MjQ3NDI=", - "upper_bound": "MjQ4MjQ=", - "repeats": 34 - }, - { - "count": 836400, - "lower_bound": "MjQ4MzY=", - "upper_bound": "MjQ4NDg=", - "repeats": 34 - }, - { - "count": 840480, - "lower_bound": "MjQ4OTQ=", - "upper_bound": "MjQ5Njc=", - "repeats": 34 - }, - { - "count": 844560, - "lower_bound": "MjQ5Njg=", - "upper_bound": "MjUwNTQ=", - "repeats": 34 - }, - { - "count": 848640, - "lower_bound": "MjUwNjk=", - "upper_bound": "MjUxMDY=", - "repeats": 34 - }, - { - "count": 852720, - "lower_bound": "MjUxNTU=", - "upper_bound": "MjUyNjA=", - "repeats": 34 - }, - { - "count": 856800, - "lower_bound": "MjUzMjE=", - "upper_bound": "MjU0Mjg=", - "repeats": 34 - }, - { - "count": 860880, - "lower_bound": "MjU0NDU=", - "upper_bound": "MjU1NjM=", - "repeats": 34 - }, - { - "count": 864960, - "lower_bound": "MjU1ODE=", - "upper_bound": "MjU3NTA=", - "repeats": 34 - }, - { - "count": 869040, - "lower_bound": "MjU3OTI=", - "upper_bound": "MjU5NTY=", - "repeats": 34 - }, - { - "count": 873120, - "lower_bound": "MjU5NzM=", - "upper_bound": "MjYwNjM=", - "repeats": 34 - }, - { - "count": 877200, - "lower_bound": "MjYwNjU=", - "upper_bound": "MjYwOTE=", - "repeats": 34 - }, - { - "count": 881280, - "lower_bound": "MjYxNjQ=", - "upper_bound": "MjYyNjI=", - "repeats": 34 - }, - { - "count": 885360, - "lower_bound": "MjYyODE=", - "upper_bound": "MjYzODE=", - "repeats": 34 - }, - { - "count": 889440, - "lower_bound": "MjY0NTg=", - "upper_bound": "MjY1ODQ=", - "repeats": 34 - }, - { - "count": 893520, - "lower_bound": "MjY1ODU=", - "upper_bound": "MjY3MDM=", - "repeats": 34 - }, - { - "count": 897600, - "lower_bound": "MjY3MTU=", - "upper_bound": "MjY3ODM=", - "repeats": 34 - }, - { - "count": 901680, - "lower_bound": "MjY3OTA=", - "upper_bound": "MjY4NzA=", - "repeats": 34 - }, - { - "count": 905760, - "lower_bound": "MjY5NDI=", - "upper_bound": "MjcwNjI=", - "repeats": 34 - }, - { - "count": 909840, - "lower_bound": "MjcwNzg=", - "upper_bound": "MjcxODU=", - "repeats": 34 - }, - { - "count": 913920, - "lower_bound": "MjcyMDM=", - "upper_bound": "MjczMDk=", - "repeats": 34 - }, - { - "count": 918000, - "lower_bound": "MjczNDA=", - "upper_bound": "Mjc0MDI=", - "repeats": 34 - }, - { - "count": 922080, - "lower_bound": "Mjc0MTc=", - "upper_bound": "Mjc1Mjg=", - "repeats": 34 - }, - { - "count": 926160, - "lower_bound": "Mjc1NTg=", - "upper_bound": "Mjc2MjQ=", - "repeats": 34 - }, - { - "count": 930240, - "lower_bound": "Mjc2OTQ=", - "upper_bound": "Mjc4MDg=", - "repeats": 34 - }, - { - "count": 934320, - "lower_bound": "Mjc4MzQ=", - "upper_bound": "Mjc4NDY=", - "repeats": 34 - }, - { - "count": 938400, - "lower_bound": "Mjc4NjI=", - "upper_bound": "Mjc5MDA=", - "repeats": 34 - }, - { - "count": 942480, - "lower_bound": "Mjc5MDk=", - "upper_bound": "Mjc5Mzk=", - "repeats": 34 - }, - { - "count": 946560, - "lower_bound": "Mjc5NTA=", - "upper_bound": "MjgwNTI=", - "repeats": 34 - }, - { - "count": 950640, - "lower_bound": "MjgxMzY=", - "upper_bound": "MjgxODc=", - "repeats": 34 - }, - { - "count": 954720, - "lower_bound": "MjgyOTE=", - "upper_bound": "MjgzMjM=", - "repeats": 34 - }, - { - "count": 958800, - "lower_bound": "MjgzMjk=", - "upper_bound": "MjgzNjY=", - "repeats": 34 - }, - { - "count": 962880, - "lower_bound": "MjgzODY=", - "upper_bound": "Mjg0NDE=", - "repeats": 34 - }, - { - "count": 966960, - "lower_bound": "Mjg0OTM=", - "upper_bound": "Mjg1NDI=", - "repeats": 34 - }, - { - "count": 971040, - "lower_bound": "Mjg1NjQ=", - "upper_bound": "Mjg2NTE=", - "repeats": 34 - }, - { - "count": 975120, - "lower_bound": "Mjg2NjY=", - "upper_bound": "Mjg3NTg=", - "repeats": 34 - }, - { - "count": 979200, - "lower_bound": "Mjg4MDY=", - "upper_bound": "Mjg5MDY=", - "repeats": 34 - }, - { - "count": 983280, - "lower_bound": "Mjg5MTk=", - "upper_bound": "MjkwNTQ=", - "repeats": 34 - }, - { - "count": 987360, - "lower_bound": "MjkwOTU=", - "upper_bound": "MjkyMDM=", - "repeats": 34 - }, - { - "count": 991440, - "lower_bound": "MjkyMjY=", - "upper_bound": "MjkzMDE=", - "repeats": 34 - }, - { - "count": 995520, - "lower_bound": "MjkzNDU=", - "upper_bound": "MjkzNzM=", - "repeats": 34 - }, - { - "count": 999600, - "lower_bound": "MjkzODE=", - "upper_bound": "Mjk0OTY=", - "repeats": 34 - }, - { - "count": 1003680, - "lower_bound": "Mjk1MzQ=", - "upper_bound": "Mjk1Njk=", - "repeats": 34 - }, - { - "count": 1007760, - "lower_bound": "Mjk1ODU=", - "upper_bound": "Mjk2MzU=", - "repeats": 34 - }, - { - "count": 1011840, - "lower_bound": "Mjk2NTY=", - "upper_bound": "Mjk2NjY=", - "repeats": 34 - }, - { - "count": 1015920, - "lower_bound": "Mjk2NzM=", - "upper_bound": "Mjk3MTY=", - "repeats": 34 - }, - { - "count": 1020000, - "lower_bound": "Mjk3MTc=", - "upper_bound": "Mjk5NTI=", - "repeats": 34 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 406, - 468, - 587, - 386, - 513, - 466, - 648, - 617, - 398, - 415, - 461, - 475, - 438, - 444, - 360, - 622, - 568, - 379, - 527, - 283, - 371, - 363, - 634, - 434, - 487, - 347, - 571, - 364, - 536, - 581, - 446, - 455, - 431, - 319, - 533, - 432, - 347, - 236, - 277, - 545, - 391, - 520, - 507, - 538, - 402, - 504, - 774, - 393, - 386, - 623, - 405, - 141, - 455, - 612, - 609, - 445, - 742, - 697, - 597, - 552, - 387, - 572, - 562, - 536, - 488, - 450, - 423, - 461, - 634, - 507, - 310, - 417, - 604, - 374, - 408, - 589, - 318, - 345, - 295, - 470, - 511, - 433, - 541, - 369, - 446, - 830, - 393, - 499, - 507, - 491, - 524, - 425, - 577, - 499, - 515, - 439, - 389, - 558, - 539, - 476, - 565, - 560, - 544, - 645, - 552, - 287, - 452, - 451, - 554, - 453, - 656, - 640, - 466, - 422, - 423, - 604, - 504, - 681, - 458, - 421, - 629, - 466, - 542, - 527, - 428, - 540, - 361, - 335, - 587, - 671, - 493, - 392, - 549, - 402, - 328, - 353, - 771, - 422, - 561, - 392, - 389, - 486, - 358, - 328, - 663, - 498, - 423, - 717, - 330, - 779, - 533, - 510, - 441, - 750, - 600, - 658, - 559, - 361, - 403, - 390, - 554, - 435, - 573, - 546, - 448, - 385, - 698, - 381, - 291, - 376, - 406, - 466, - 551, - 252, - 546, - 409, - 589, - 707, - 543, - 669, - 642, - 619, - 379, - 504, - 531, - 307, - 423, - 615, - 564, - 472, - 686, - 491, - 494, - 479, - 282, - 423, - 333, - 495, - 629, - 631, - 474, - 640, - 328, - 702, - 624, - 489, - 544, - 345, - 481, - 584, - 276, - 446, - 466, - 314, - 519, - 537, - 406, - 748, - 606, - 780, - 537, - 330, - 573, - 472, - 463, - 241, - 296, - 411, - 695, - 381, - 379, - 363, - 660, - 692, - 292, - 476, - 719, - 405, - 466, - 544, - 536, - 263, - 634, - 377, - 502, - 635, - 401, - 192, - 372, - 399, - 513, - 411, - 454, - 455, - 480, - 548, - 401, - 503, - 731, - 497, - 548, - 696, - 381, - 489, - 647, - 572, - 400, - 653, - 543, - 722, - 708, - 575, - 428, - 409, - 458, - 278, - 466, - 556, - 373, - 332, - 565, - 582, - 330, - 419, - 329, - 635, - 401, - 421, - 475, - 568, - 492, - 534, - 446, - 404, - 661, - 563, - 372, - 237, - 507, - 565, - 450, - 660, - 615, - 567, - 406, - 834, - 380, - 420, - 476, - 742, - 464, - 389, - 360, - 527, - 456, - 583, - 589, - 562, - 309, - 437, - 442, - 612, - 451, - 320, - 760, - 589, - 227, - 456, - 293, - 426, - 539, - 387, - 345, - 398, - 873, - 714, - 487, - 352, - 536, - 502, - 348, - 447, - 536, - 435, - 202, - 475, - 343, - 361, - 463, - 295, - 739, - 780, - 342, - 448, - 496, - 537, - 249, - 732, - 442, - 453, - 350, - 434, - 459, - 416, - 494, - 525, - 423, - 479, - 641, - 485, - 287, - 523, - 455, - 461, - 503, - 524, - 574, - 417, - 607, - 665, - 514, - 469, - 337, - 532, - 280, - 575, - 584, - 611, - 643, - 575, - 402, - 466, - 299, - 516, - 461, - 494, - 438, - 409, - 351, - 658, - 413, - 289, - 625, - 520, - 495, - 504, - 428, - 412, - 392, - 604, - 538, - 539, - 236, - 462, - 573, - 515, - 606, - 313, - 303, - 764, - 352, - 286, - 540, - 315, - 406, - 572, - 441, - 629, - 537, - 621, - 446, - 552, - 559, - 622, - 684, - 376, - 319, - 466, - 550, - 747, - 436, - 411, - 347, - 329, - 455, - 401, - 466, - 328, - 390, - 406, - 332, - 593, - 422, - 434, - 389, - 717, - 501, - 335, - 350, - 434, - 506, - 514, - 344, - 371, - 331, - 440, - 721, - 426, - 330, - 368, - 470, - 626, - 703, - 748, - 447, - 782, - 423, - 549, - 419, - 620, - 359, - 314, - 770, - 697, - 551, - 510, - 661, - 533, - 403, - 530, - 301, - 500, - 384, - 639, - 404, - 476, - 518, - 215, - 514, - 306, - 527, - 469, - 364, - 477, - 612, - 447, - 338, - 256, - 437, - 447, - 526, - 385, - 636, - 263, - 438, - 436, - 752, - 738, - 341, - 631, - 746, - 442, - 330, - 498, - 524, - 441, - 329, - 542, - 635, - 581, - 657, - 342, - 602, - 573, - 456, - 316, - 405, - 283, - 574, - 482, - 282, - 673, - 517, - 256, - 313, - 575, - 516, - 425, - 464, - 540, - 549, - 332, - 379, - 532, - 361, - 424, - 469, - 538, - 631, - 524, - 182, - 355, - 271, - 583, - 533, - 502, - 518, - 373, - 678, - 623, - 574, - 561, - 450, - 485, - 581, - 427, - 593, - 528, - 535, - 497, - 375, - 366, - 286, - 324, - 373, - 466, - 484, - 546, - 484, - 540, - 786, - 195, - 714, - 694, - 730, - 401, - 441, - 455, - 547, - 406, - 507, - 776, - 549, - 530, - 515, - 417, - 313, - 529, - 224, - 507, - 314, - 804, - 659, - 455, - 397, - 489, - 749, - 308, - 439, - 732, - 601, - 285, - 533, - 327, - 445, - 261, - 404, - 541, - 677, - 390, - 429, - 608, - 391, - 459, - 519, - 425, - 795, - 468, - 663, - 532, - 568, - 425, - 488, - 467, - 207, - 625, - 378, - 678, - 423, - 483, - 742, - 654, - 456, - 506, - 685, - 383, - 324, - 403, - 597, - 421, - 472, - 599, - 272, - 297, - 383, - 273, - 526, - 552, - 588, - 576, - 459, - 458, - 412, - 444, - 630, - 403, - 510, - 486, - 567, - 486, - 510, - 585, - 354, - 616, - 579, - 445, - 373, - 217, - 379, - 333, - 393, - 476, - 560, - 414, - 456, - 391, - 451, - 402, - 362, - 617, - 593, - 570, - 601, - 424, - 232, - 620, - 593, - 642, - 338, - 451, - 494, - 474, - 540, - 490, - 393, - 431, - 338, - 451, - 495, - 487, - 416, - 636, - 695, - 497, - 602, - 585, - 547, - 442, - 561, - 396, - 712, - 606, - 582, - 506, - 456, - 562, - 462, - 324, - 574, - 452, - 599, - 486, - 549, - 489, - 422, - 519, - 643, - 417, - 361, - 485, - 385, - 426, - 584, - 577, - 525, - 665, - 453, - 293, - 473, - 649, - 404, - 328, - 491, - 419, - 397, - 425, - 834, - 449, - 378, - 311, - 506, - 544, - 360, - 438, - 461, - 595, - 632, - 503, - 125, - 655, - 638, - 351, - 452, - 512, - 650, - 487, - 401, - 628, - 486, - 506, - 531, - 622, - 528, - 293, - 411, - 555, - 689, - 321, - 362, - 461, - 489, - 499, - 472, - 488, - 302, - 488, - 337, - 634, - 408, - 513, - 249, - 470, - 543, - 567, - 414, - 314, - 213, - 486, - 323, - 545, - 357, - 492, - 635, - 575, - 500, - 645, - 529, - 401, - 498, - 722, - 530, - 392, - 579, - 486, - 305, - 309, - 399, - 662, - 389, - 502, - 357, - 855, - 717, - 457, - 450, - 465, - 512, - 664, - 597, - 434, - 488, - 598, - 660, - 651, - 526, - 387, - 483, - 433, - 611, - 408, - 358, - 495, - 537, - 531, - 417, - 310, - 577, - 458, - 507, - 334, - 345, - 436, - 591, - 492, - 568, - 504, - 391, - 486, - 497, - 724, - 328, - 403, - 326, - 523, - 640, - 474, - 537, - 473, - 319, - 431, - 364, - 398, - 476, - 403, - 258, - 322, - 377, - 535, - 256, - 780, - 770, - 420, - 432, - 395, - 350, - 407, - 660, - 652, - 563, - 556, - 535, - 765, - 496, - 281, - 442, - 504, - 527, - 474, - 798, - 754, - 499, - 643, - 479, - 431, - 378, - 628, - 481, - 564, - 572, - 463, - 403, - 342, - 703, - 481, - 488, - 723, - 502, - 682, - 412, - 535, - 443, - 272, - 467, - 401, - 802, - 412, - 307, - 372, - 532, - 615, - 574, - 625, - 276, - 627, - 319, - 626, - 400, - 467, - 561, - 340, - 412, - 369, - 391, - 736, - 704, - 488, - 451, - 475, - 439, - 758, - 676, - 637, - 621, - 407, - 526, - 611, - 344, - 302, - 499, - 396, - 576, - 385, - 550, - 513, - 348, - 502, - 454, - 472, - 337, - 457, - 285, - 275, - 466, - 441, - 294, - 454, - 521, - 505, - 513, - 452, - 462, - 469, - 464, - 401, - 542, - 515, - 414, - 665, - 452, - 556, - 632, - 501, - 713, - 388, - 603, - 617, - 552, - 374, - 662, - 442, - 434, - 512, - 320, - 437, - 552, - 310, - 681, - 489, - 588, - 333, - 665, - 216, - 632, - 463, - 396, - 687, - 646, - 495, - 519, - 437, - 342, - 367, - 509, - 563, - 611, - 574, - 437, - 713, - 491, - 629, - 706, - 560, - 338, - 344, - 623, - 540, - 321, - 444, - 506, - 289, - 465, - 393, - 289, - 344, - 438, - 549, - 403, - 669, - 584, - 703, - 304, - 553, - 348, - 448, - 307, - 394, - 401, - 427, - 588, - 443, - 324, - 492, - 526, - 691, - 872, - 261, - 624, - 394, - 454, - 427, - 393, - 504, - 752, - 500, - 419, - 400, - 520, - 357, - 496, - 522, - 692, - 657, - 571, - 499, - 541, - 512, - 485, - 471, - 583, - 391, - 577, - 476, - 313, - 401, - 251, - 273, - 492, - 452, - 366, - 567, - 586, - 462, - 376, - 499, - 583, - 246, - 445, - 543, - 525, - 463, - 505, - 523, - 476, - 259, - 526, - 414, - 219, - 475, - 541, - 518, - 496, - 618, - 567, - 425, - 340, - 649, - 659, - 383, - 339, - 471, - 516, - 505, - 674, - 392, - 664, - 567, - 498, - 540, - 326, - 455, - 468, - 718, - 388, - 467, - 374, - 341, - 751, - 502, - 412, - 417, - 673, - 610, - 568, - 289, - 532, - 605, - 458, - 387, - 432, - 535, - 474, - 518, - 505, - 295, - 612, - 746, - 458, - 497, - 460, - 458, - 389, - 607, - 507, - 376, - 571, - 373, - 562, - 328, - 463, - 193, - 271, - 415, - 493, - 499, - 527, - 594, - 452, - 332, - 418, - 657, - 615, - 147, - 570, - 378, - 432, - 398, - 310, - 563, - 483, - 468, - 480, - 571, - 470, - 591, - 385, - 240, - 382, - 569, - 632, - 562, - 390, - 253, - 551, - 545, - 501, - 566, - 335, - 249, - 546, - 595, - 452, - 308, - 464, - 934, - 560, - 556, - 550, - 349, - 715, - 212, - 317, - 606, - 673, - 645, - 544, - 573, - 310, - 257, - 389, - 752, - 575, - 674, - 376, - 419, - 390, - 542, - 516, - 647, - 566, - 439, - 415, - 580, - 602, - 425, - 414, - 417, - 497, - 407, - 259, - 454, - 376, - 679, - 504, - 626, - 431, - 460, - 427, - 422, - 327, - 338, - 552, - 625, - 466, - 495, - 518, - 407, - 266, - 452, - 563, - 445, - 268, - 379, - 367, - 414, - 558, - 433, - 783, - 423, - 394, - 398, - 448, - 427, - 649, - 502, - 379, - 531, - 505, - 648, - 498, - 395, - 532, - 396, - 475, - 647, - 661, - 540, - 710, - 271, - 420, - 362, - 598, - 381, - 430, - 600, - 477, - 606, - 354, - 407, - 464, - 536, - 480, - 619, - 492, - 478, - 421, - 628, - 964, - 449, - 494, - 422, - 544, - 595, - 390, - 476, - 395, - 626, - 547, - 356, - 558, - 486, - 364, - 312, - 566, - 307, - 445, - 666, - 543, - 422, - 633, - 426, - 504, - 511, - 542, - 568, - 139, - 808, - 556, - 320, - 383, - 472, - 483, - 353, - 420, - 371, - 438, - 635, - 436, - 585, - 446, - 564, - 545, - 380, - 494, - 396, - 409, - 604, - 577, - 555, - 333, - 605, - 522, - 597, - 427, - 436, - 458, - 505, - 358, - 613, - 537, - 363, - 516, - 631, - 503, - 591, - 568, - 486, - 745, - 398, - 532, - 534, - 368, - 538, - 226, - 420, - 544, - 504, - 493, - 356, - 515, - 493, - 287, - 595, - 456, - 594, - 338, - 476, - 415, - 429, - 523, - 531, - 542, - 537, - 878, - 441, - 682, - 720, - 528, - 382, - 435, - 479, - 768, - 348, - 529, - 527, - 445, - 705, - 217, - 510, - 539, - 324, - 381, - 636, - 257, - 665, - 570, - 409, - 499, - 567, - 486, - 586, - 670, - 313, - 272, - 369, - 555, - 370, - 296, - 426, - 535, - 591, - 439, - 568, - 492, - 218, - 436, - 701, - 606, - 527, - 327, - 471, - 382, - 484, - 303, - 503, - 551, - 408, - 552, - 754, - 578, - 480, - 380, - 364, - 306, - 447, - 814, - 383, - 425, - 442, - 551, - 667, - 587, - 530, - 620, - 346, - 446, - 348, - 596, - 328, - 422, - 528, - 465, - 565, - 549, - 309, - 726, - 435, - 496, - 547, - 643, - 528, - 434, - 490, - 308, - 257, - 544, - 727, - 558, - 493, - 727, - 480, - 656, - 477, - 336, - 544, - 377, - 511, - 604, - 508, - 533, - 390, - 389, - 616, - 404, - 479, - 441, - 570, - 374, - 372, - 683, - 459, - 777, - 419, - 447, - 441, - 425, - 458, - 405, - 717, - 677, - 274, - 576, - 486, - 458, - 428, - 836, - 586, - 457, - 644, - 455, - 653, - 525, - 538, - 340, - 342, - 416, - 449, - 493, - 683, - 363, - 456, - 258, - 525, - 456, - 530, - 490, - 376, - 547, - 486, - 252, - 703, - 363, - 828, - 599, - 641, - 505, - 587, - 667, - 448, - 428, - 515, - 399, - 346, - 556, - 681, - 398, - 403, - 533, - 325, - 672, - 502, - 303, - 476, - 422, - 299, - 362, - 593, - 333, - 461, - 447, - 251, - 470, - 426, - 484, - 627, - 384, - 546, - 611, - 553, - 324, - 547, - 579, - 496, - 573, - 596, - 346, - 244, - 494, - 615, - 562, - 441, - 262, - 637, - 760, - 488, - 365, - 555, - 437, - 498, - 292, - 373, - 782, - 422, - 414, - 442, - 484, - 332, - 374, - 712, - 478, - 339, - 564, - 463, - 266, - 581, - 468, - 541, - 552, - 377, - 542, - 635, - 295, - 516, - 390, - 356, - 364, - 641, - 281, - 367, - 456, - 500, - 484, - 701, - 574, - 465, - 461, - 609, - 519, - 428, - 376, - 324, - 534, - 562, - 361, - 480, - 622, - 395, - 699, - 530, - 613, - 451, - 398, - 672, - 581, - 560, - 366, - 733, - 463, - 413, - 549, - 358, - 305, - 660, - 551, - 521, - 435, - 545, - 645, - 668, - 448, - 429, - 609, - 372, - 524, - 579, - 531, - 467, - 516, - 368, - 452, - 467, - 594, - 380, - 586, - 677, - 472, - 696, - 488, - 519, - 436, - 233, - 313, - 433, - 507, - 464, - 541, - 518, - 510, - 688, - 695, - 457, - 474, - 385, - 589, - 398, - 618, - 391, - 346, - 480, - 530, - 644, - 611, - 709, - 256, - 424, - 502, - 422, - 431, - 259, - 295, - 457, - 357, - 422, - 415, - 678, - 522, - 494, - 622, - 527, - 675, - 624, - 606, - 496, - 486, - 705, - 593, - 350, - 477, - 375, - 463, - 488, - 458, - 461, - 541, - 499, - 441, - 448, - 279, - 573, - 602, - 348, - 642, - 502, - 518, - 715, - 470, - 646, - 409, - 605, - 646, - 691, - 477, - 384, - 875, - 321, - 583, - 499, - 567, - 422, - 599, - 257, - 388, - 439, - 523, - 482, - 379, - 779, - 825, - 640, - 528, - 514, - 369, - 721, - 593, - 341, - 288, - 467, - 623, - 416, - 653, - 582, - 579, - 450, - 763, - 445, - 554, - 542, - 489, - 554, - 917, - 400, - 308, - 545, - 572, - 816, - 521, - 529, - 418, - 469, - 333, - 613, - 424, - 502, - 441, - 404, - 369, - 505, - 516, - 410, - 522, - 369, - 388, - 678, - 656, - 476, - 613, - 447, - 415, - 255, - 486, - 483, - 450, - 506, - 408, - 814, - 408, - 610, - 321, - 571, - 394, - 579, - 500, - 267, - 390, - 486, - 669, - 500, - 295, - 726, - 537, - 474, - 559, - 681, - 731, - 464, - 649, - 476, - 347, - 467, - 508, - 640, - 319, - 695, - 217, - 648, - 565, - 784, - 474, - 601, - 437, - 401, - 413, - 465, - 593, - 519, - 374, - 357, - 515, - 495, - 616, - 346, - 373, - 327, - 366, - 276, - 498, - 336, - 629, - 418, - 313, - 406, - 652, - 503, - 418, - 311, - 392, - 356, - 652, - 543, - 387, - 499, - 477, - 540, - 333, - 399, - 422, - 433, - 319, - 410, - 713, - 643, - 556, - 369, - 432, - 732, - 401, - 590, - 413, - 341, - 500, - 481, - 498, - 532, - 673, - 503, - 652, - 380, - 732, - 504, - 323, - 575, - 537, - 544, - 361, - 571, - 698, - 508, - 385, - 655, - 537, - 460, - 374, - 382, - 486, - 358, - 424, - 446, - 585, - 449, - 533, - 631, - 461, - 456, - 490, - 459, - 421, - 471, - 602, - 548, - 454, - 191, - 476, - 824, - 272, - 519, - 588, - 651, - 555, - 705, - 366, - 434, - 586, - 392, - 557, - 461, - 456, - 642, - 372, - 557, - 265, - 494, - 550, - 572, - 317, - 475, - 432, - 524, - 675, - 485 - ] - }, - { - "counters": [ - 419, - 833, - 342, - 648, - 369, - 726, - 505, - 286, - 454, - 422, - 404, - 379, - 325, - 435, - 508, - 552, - 564, - 652, - 591, - 335, - 555, - 494, - 410, - 380, - 655, - 396, - 219, - 524, - 416, - 513, - 382, - 381, - 426, - 538, - 382, - 658, - 466, - 284, - 404, - 490, - 516, - 494, - 470, - 415, - 529, - 355, - 319, - 474, - 491, - 278, - 541, - 299, - 412, - 455, - 452, - 301, - 518, - 382, - 461, - 652, - 368, - 720, - 391, - 342, - 522, - 552, - 538, - 403, - 538, - 462, - 491, - 387, - 645, - 445, - 467, - 341, - 589, - 450, - 682, - 473, - 415, - 485, - 479, - 475, - 242, - 509, - 394, - 376, - 587, - 431, - 117, - 319, - 673, - 452, - 645, - 423, - 678, - 410, - 424, - 246, - 433, - 586, - 499, - 532, - 345, - 399, - 343, - 509, - 396, - 663, - 556, - 625, - 707, - 466, - 356, - 586, - 587, - 344, - 411, - 149, - 395, - 298, - 356, - 541, - 471, - 340, - 338, - 449, - 289, - 508, - 437, - 575, - 348, - 432, - 549, - 637, - 630, - 600, - 324, - 450, - 323, - 347, - 495, - 406, - 571, - 486, - 523, - 340, - 372, - 697, - 449, - 337, - 369, - 455, - 363, - 412, - 603, - 332, - 627, - 308, - 548, - 384, - 98, - 492, - 495, - 870, - 445, - 313, - 324, - 306, - 500, - 456, - 352, - 746, - 725, - 780, - 555, - 699, - 395, - 494, - 563, - 558, - 436, - 445, - 687, - 342, - 577, - 518, - 714, - 323, - 482, - 407, - 630, - 426, - 757, - 279, - 506, - 523, - 418, - 380, - 609, - 485, - 611, - 558, - 383, - 544, - 472, - 346, - 788, - 322, - 361, - 451, - 366, - 658, - 604, - 812, - 437, - 640, - 565, - 659, - 497, - 614, - 677, - 400, - 344, - 451, - 565, - 425, - 306, - 643, - 725, - 611, - 662, - 640, - 452, - 471, - 421, - 458, - 241, - 670, - 541, - 483, - 406, - 344, - 723, - 458, - 398, - 663, - 413, - 411, - 711, - 544, - 652, - 674, - 337, - 472, - 560, - 539, - 466, - 308, - 372, - 526, - 458, - 492, - 184, - 264, - 310, - 417, - 394, - 330, - 280, - 572, - 599, - 593, - 537, - 430, - 537, - 298, - 378, - 487, - 513, - 295, - 493, - 480, - 658, - 535, - 530, - 290, - 660, - 478, - 559, - 253, - 630, - 427, - 382, - 669, - 570, - 190, - 512, - 287, - 591, - 581, - 662, - 497, - 553, - 740, - 726, - 604, - 657, - 372, - 624, - 967, - 252, - 416, - 495, - 554, - 328, - 648, - 610, - 415, - 414, - 554, - 785, - 281, - 430, - 423, - 504, - 636, - 576, - 548, - 474, - 532, - 365, - 607, - 425, - 322, - 780, - 364, - 494, - 396, - 428, - 460, - 633, - 336, - 530, - 622, - 581, - 292, - 514, - 438, - 601, - 228, - 564, - 236, - 239, - 352, - 462, - 308, - 381, - 480, - 621, - 236, - 404, - 401, - 630, - 689, - 362, - 543, - 446, - 505, - 230, - 410, - 467, - 505, - 539, - 588, - 464, - 373, - 402, - 634, - 540, - 470, - 516, - 450, - 549, - 279, - 475, - 482, - 473, - 309, - 203, - 678, - 361, - 671, - 595, - 722, - 622, - 436, - 315, - 436, - 585, - 592, - 444, - 577, - 551, - 540, - 480, - 465, - 609, - 365, - 415, - 711, - 513, - 647, - 449, - 477, - 413, - 723, - 352, - 543, - 405, - 389, - 224, - 548, - 621, - 453, - 454, - 492, - 383, - 408, - 269, - 609, - 478, - 580, - 536, - 380, - 503, - 415, - 276, - 521, - 324, - 672, - 254, - 465, - 385, - 249, - 200, - 464, - 755, - 442, - 410, - 427, - 348, - 512, - 574, - 515, - 481, - 366, - 462, - 383, - 371, - 543, - 571, - 476, - 423, - 488, - 634, - 397, - 670, - 423, - 345, - 332, - 489, - 648, - 655, - 415, - 585, - 413, - 373, - 216, - 455, - 554, - 571, - 651, - 403, - 317, - 440, - 578, - 429, - 432, - 562, - 511, - 655, - 534, - 463, - 374, - 306, - 657, - 306, - 550, - 382, - 508, - 568, - 547, - 637, - 500, - 625, - 664, - 371, - 417, - 326, - 510, - 501, - 394, - 416, - 456, - 543, - 496, - 712, - 384, - 391, - 587, - 671, - 264, - 558, - 695, - 370, - 266, - 624, - 412, - 403, - 483, - 373, - 351, - 370, - 594, - 340, - 306, - 530, - 381, - 469, - 515, - 412, - 551, - 458, - 475, - 472, - 532, - 266, - 489, - 410, - 321, - 535, - 545, - 544, - 590, - 408, - 244, - 403, - 540, - 371, - 462, - 387, - 650, - 332, - 572, - 584, - 414, - 462, - 680, - 410, - 704, - 257, - 420, - 518, - 707, - 589, - 396, - 404, - 460, - 457, - 500, - 766, - 256, - 587, - 445, - 354, - 328, - 188, - 580, - 670, - 530, - 521, - 515, - 716, - 262, - 490, - 482, - 477, - 375, - 556, - 345, - 657, - 692, - 574, - 566, - 331, - 570, - 513, - 355, - 359, - 517, - 455, - 539, - 439, - 660, - 376, - 486, - 647, - 422, - 542, - 341, - 551, - 524, - 620, - 255, - 663, - 423, - 469, - 279, - 403, - 411, - 615, - 374, - 274, - 311, - 477, - 363, - 510, - 513, - 644, - 633, - 642, - 473, - 530, - 328, - 482, - 323, - 499, - 386, - 537, - 364, - 260, - 380, - 748, - 384, - 521, - 446, - 325, - 449, - 533, - 533, - 502, - 435, - 600, - 544, - 267, - 568, - 712, - 520, - 464, - 499, - 349, - 438, - 593, - 534, - 587, - 575, - 360, - 439, - 371, - 324, - 427, - 344, - 489, - 419, - 278, - 468, - 713, - 878, - 640, - 510, - 616, - 457, - 515, - 389, - 701, - 260, - 568, - 553, - 688, - 464, - 435, - 559, - 406, - 745, - 625, - 511, - 372, - 421, - 446, - 309, - 562, - 424, - 343, - 502, - 597, - 486, - 556, - 630, - 498, - 263, - 503, - 664, - 309, - 403, - 589, - 524, - 449, - 300, - 710, - 311, - 643, - 315, - 627, - 539, - 481, - 362, - 461, - 576, - 808, - 409, - 490, - 702, - 436, - 649, - 343, - 451, - 469, - 492, - 526, - 360, - 636, - 913, - 295, - 425, - 557, - 385, - 302, - 486, - 683, - 441, - 459, - 768, - 498, - 567, - 652, - 556, - 799, - 541, - 738, - 530, - 547, - 754, - 498, - 478, - 354, - 706, - 500, - 399, - 448, - 437, - 711, - 546, - 360, - 441, - 521, - 453, - 609, - 323, - 645, - 466, - 666, - 373, - 662, - 426, - 492, - 569, - 353, - 423, - 786, - 578, - 470, - 351, - 514, - 560, - 362, - 494, - 355, - 420, - 368, - 471, - 366, - 537, - 513, - 684, - 636, - 482, - 420, - 558, - 430, - 681, - 462, - 523, - 435, - 383, - 495, - 556, - 230, - 418, - 576, - 428, - 402, - 561, - 630, - 580, - 531, - 269, - 382, - 592, - 690, - 520, - 386, - 471, - 432, - 688, - 807, - 633, - 478, - 276, - 325, - 247, - 911, - 492, - 804, - 456, - 568, - 600, - 838, - 567, - 643, - 488, - 392, - 653, - 509, - 524, - 399, - 469, - 258, - 338, - 635, - 527, - 288, - 450, - 334, - 285, - 453, - 546, - 397, - 535, - 749, - 722, - 389, - 467, - 431, - 546, - 819, - 466, - 427, - 641, - 590, - 640, - 387, - 604, - 532, - 343, - 324, - 432, - 345, - 555, - 474, - 452, - 496, - 389, - 297, - 705, - 581, - 224, - 388, - 428, - 447, - 449, - 541, - 590, - 403, - 422, - 362, - 356, - 363, - 318, - 598, - 547, - 442, - 383, - 445, - 621, - 481, - 563, - 573, - 355, - 501, - 540, - 474, - 460, - 455, - 345, - 411, - 570, - 366, - 593, - 530, - 262, - 459, - 406, - 295, - 360, - 727, - 416, - 544, - 371, - 242, - 378, - 493, - 460, - 446, - 575, - 526, - 472, - 275, - 404, - 402, - 602, - 482, - 300, - 436, - 488, - 385, - 496, - 522, - 448, - 401, - 408, - 305, - 572, - 705, - 387, - 445, - 225, - 421, - 269, - 387, - 423, - 537, - 714, - 563, - 389, - 306, - 333, - 390, - 493, - 792, - 492, - 518, - 395, - 435, - 348, - 520, - 177, - 410, - 493, - 724, - 478, - 477, - 419, - 693, - 424, - 390, - 531, - 333, - 531, - 417, - 541, - 302, - 532, - 405, - 396, - 413, - 528, - 642, - 522, - 493, - 713, - 654, - 206, - 405, - 499, - 653, - 348, - 534, - 379, - 286, - 562, - 511, - 463, - 450, - 335, - 610, - 270, - 696, - 809, - 476, - 326, - 896, - 373, - 329, - 405, - 581, - 530, - 444, - 478, - 557, - 575, - 524, - 502, - 500, - 230, - 434, - 343, - 506, - 399, - 639, - 410, - 461, - 581, - 266, - 507, - 596, - 563, - 411, - 744, - 451, - 375, - 366, - 401, - 408, - 515, - 414, - 470, - 445, - 649, - 569, - 328, - 364, - 437, - 655, - 465, - 642, - 474, - 411, - 555, - 609, - 395, - 625, - 468, - 340, - 693, - 578, - 480, - 556, - 427, - 367, - 354, - 457, - 450, - 482, - 614, - 580, - 542, - 556, - 331, - 510, - 402, - 599, - 689, - 709, - 525, - 333, - 536, - 734, - 803, - 495, - 481, - 423, - 328, - 570, - 425, - 441, - 384, - 654, - 594, - 327, - 495, - 635, - 519, - 357, - 551, - 583, - 336, - 475, - 450, - 565, - 541, - 482, - 606, - 642, - 509, - 619, - 864, - 435, - 498, - 619, - 495, - 313, - 507, - 597, - 414, - 264, - 450, - 694, - 668, - 424, - 137, - 446, - 426, - 674, - 581, - 602, - 583, - 566, - 473, - 627, - 471, - 425, - 688, - 502, - 556, - 694, - 394, - 744, - 610, - 558, - 374, - 512, - 723, - 605, - 579, - 361, - 641, - 686, - 252, - 585, - 550, - 683, - 232, - 406, - 526, - 526, - 468, - 694, - 420, - 601, - 906, - 315, - 522, - 472, - 145, - 399, - 443, - 837, - 506, - 440, - 440, - 604, - 495, - 251, - 429, - 195, - 263, - 312, - 474, - 578, - 402, - 457, - 583, - 586, - 725, - 484, - 570, - 459, - 495, - 388, - 548, - 536, - 659, - 510, - 733, - 548, - 349, - 467, - 481, - 568, - 379, - 279, - 644, - 414, - 730, - 607, - 319, - 470, - 223, - 414, - 655, - 499, - 503, - 732, - 456, - 592, - 559, - 777, - 673, - 601, - 727, - 416, - 603, - 492, - 407, - 867, - 377, - 591, - 371, - 687, - 501, - 440, - 481, - 441, - 645, - 525, - 720, - 562, - 540, - 397, - 436, - 386, - 438, - 538, - 428, - 424, - 538, - 517, - 320, - 375, - 271, - 633, - 761, - 610, - 479, - 333, - 400, - 583, - 303, - 423, - 720, - 453, - 305, - 416, - 413, - 392, - 464, - 233, - 674, - 419, - 315, - 467, - 403, - 605, - 478, - 619, - 578, - 277, - 429, - 436, - 454, - 588, - 347, - 519, - 269, - 493, - 580, - 439, - 493, - 526, - 630, - 390, - 460, - 497, - 789, - 380, - 321, - 614, - 478, - 503, - 372, - 518, - 708, - 410, - 390, - 517, - 555, - 630, - 607, - 584, - 615, - 483, - 432, - 535, - 415, - 512, - 522, - 385, - 590, - 568, - 625, - 665, - 530, - 522, - 557, - 327, - 401, - 477, - 576, - 433, - 472, - 502, - 562, - 636, - 447, - 432, - 650, - 484, - 301, - 553, - 737, - 567, - 449, - 351, - 446, - 449, - 583, - 449, - 716, - 602, - 604, - 420, - 580, - 330, - 702, - 481, - 545, - 613, - 825, - 534, - 568, - 312, - 266, - 770, - 693, - 396, - 385, - 609, - 824, - 325, - 745, - 363, - 630, - 606, - 659, - 664, - 542, - 555, - 254, - 455, - 467, - 347, - 579, - 451, - 651, - 405, - 500, - 367, - 459, - 362, - 201, - 307, - 724, - 485, - 586, - 583, - 403, - 490, - 531, - 345, - 870, - 508, - 368, - 649, - 571, - 445, - 418, - 506, - 557, - 581, - 454, - 484, - 468, - 427, - 561, - 529, - 417, - 653, - 574, - 423, - 534, - 402, - 306, - 651, - 583, - 583, - 321, - 430, - 780, - 570, - 470, - 427, - 583, - 679, - 512, - 667, - 439, - 554, - 508, - 241, - 374, - 378, - 431, - 380, - 372, - 441, - 572, - 385, - 642, - 415, - 451, - 328, - 732, - 549, - 591, - 606, - 635, - 844, - 337, - 610, - 478, - 414, - 268, - 529, - 494, - 620, - 549, - 408, - 482, - 621, - 616, - 359, - 312, - 669, - 495, - 512, - 615, - 261, - 591, - 325, - 471, - 561, - 380, - 524, - 453, - 470, - 425, - 645, - 476, - 447, - 362, - 624, - 432, - 756, - 510, - 488, - 247, - 442, - 716, - 382, - 630, - 555, - 526, - 376, - 381, - 610, - 607, - 378, - 690, - 512, - 527, - 550, - 256, - 576, - 424, - 213, - 216, - 726, - 415, - 667, - 694, - 652, - 501, - 389, - 334, - 471, - 553, - 608, - 528, - 376, - 491, - 295, - 236, - 755, - 581, - 690, - 575, - 517, - 473, - 416, - 348, - 451, - 651, - 364, - 612, - 1007, - 527, - 301, - 493, - 400, - 334, - 363, - 593, - 235, - 713, - 420, - 367, - 654, - 520, - 337, - 410, - 478, - 407, - 551, - 490, - 605, - 385, - 380, - 326, - 484, - 640, - 522, - 444, - 540, - 418, - 437, - 386, - 581, - 253, - 566, - 546, - 472, - 398, - 307, - 549, - 497, - 413, - 261, - 474, - 425, - 415, - 531, - 633, - 600, - 390, - 467, - 793, - 636, - 384, - 398, - 552, - 454, - 722, - 470, - 645, - 578, - 458, - 363, - 447, - 559, - 397, - 596, - 494, - 473, - 538, - 812, - 459, - 742, - 564, - 590, - 453, - 361, - 849, - 369, - 521, - 628, - 570, - 647, - 632, - 547, - 360, - 199, - 670, - 525, - 478, - 641, - 420, - 263, - 693, - 693, - 380, - 610, - 462, - 615, - 315, - 457, - 552, - 536, - 186, - 420, - 590, - 294, - 415, - 424, - 419, - 511, - 475, - 527, - 578, - 383, - 514, - 532, - 525, - 587, - 503, - 421, - 410, - 690, - 255, - 231, - 627, - 742, - 227, - 408, - 534, - 381, - 584, - 493, - 511, - 410, - 543, - 506, - 394, - 329, - 517, - 336, - 427, - 582, - 424, - 293, - 421, - 427, - 525, - 526, - 669, - 655, - 398, - 520, - 656, - 437, - 459, - 293, - 641, - 501, - 828, - 515, - 441, - 555, - 557, - 352, - 460, - 589, - 523, - 557, - 840, - 367, - 259, - 230, - 357, - 422, - 561, - 680, - 488, - 389, - 368, - 588, - 509, - 543, - 394, - 266, - 238, - 312, - 408, - 337, - 441, - 290, - 359, - 665, - 588, - 399, - 498, - 537, - 564, - 530, - 462, - 821, - 311, - 452, - 491, - 400, - 505, - 393, - 404, - 484, - 590, - 766, - 437, - 358, - 313, - 634, - 529, - 375, - 495, - 465, - 548, - 656, - 492, - 251, - 541, - 562, - 503, - 592, - 455, - 491, - 458, - 703, - 202, - 556, - 458, - 820, - 551, - 605, - 409, - 464, - 685, - 401, - 643, - 487, - 371, - 547, - 469, - 463, - 566, - 470, - 643, - 362, - 517, - 468, - 462, - 555, - 361, - 362, - 560, - 380, - 269, - 285, - 439, - 477, - 506, - 454, - 404, - 303, - 554, - 449, - 617, - 375, - 377, - 560, - 396, - 597, - 404, - 389, - 573, - 317, - 546, - 544, - 422, - 616, - 372, - 464, - 399, - 718, - 479, - 588, - 433, - 768, - 495, - 446, - 468, - 641, - 311, - 563, - 342, - 567, - 444, - 402, - 594, - 499, - 542, - 528, - 335, - 385, - 398, - 566, - 524, - 715, - 607, - 361, - 521, - 450, - 675, - 578, - 656, - 625, - 403, - 592, - 428, - 112, - 366, - 464, - 303, - 463, - 606, - 436, - 393, - 471, - 475, - 413, - 489, - 561, - 385, - 564, - 637, - 448, - 470, - 441, - 344, - 416, - 591, - 569, - 356, - 446, - 415, - 386, - 593, - 358, - 451, - 409, - 385, - 572, - 557, - 625, - 638, - 388, - 536, - 565, - 712, - 685, - 451, - 658, - 410, - 596, - 493, - 425, - 653, - 502, - 377, - 522, - 319, - 393, - 548, - 186, - 785, - 450, - 385, - 512, - 420, - 311, - 372, - 378, - 561, - 418, - 562, - 846, - 627, - 249, - 593, - 753, - 750, - 350, - 651, - 508, - 258, - 355, - 409, - 447, - 783, - 540, - 397, - 484, - 564, - 301, - 516, - 216, - 402, - 443, - 424, - 478, - 278, - 453, - 512, - 705, - 639, - 242, - 235, - 357, - 283, - 548, - 740, - 591, - 294, - 477, - 354, - 435, - 223, - 309, - 583, - 304, - 513, - 596, - 371, - 698, - 597, - 582, - 478, - 454, - 479, - 672, - 676, - 562, - 534, - 530, - 791, - 409, - 499, - 586, - 651, - 537, - 468, - 388, - 489, - 637, - 664, - 380, - 549, - 528, - 394 - ] - }, - { - "counters": [ - 390, - 550, - 484, - 402, - 540, - 545, - 595, - 632, - 569, - 325, - 581, - 460, - 773, - 529, - 602, - 471, - 458, - 442, - 514, - 572, - 748, - 385, - 640, - 593, - 397, - 507, - 519, - 436, - 408, - 259, - 338, - 954, - 274, - 549, - 525, - 407, - 233, - 625, - 451, - 771, - 440, - 449, - 542, - 546, - 596, - 439, - 322, - 643, - 491, - 342, - 468, - 725, - 686, - 376, - 343, - 352, - 447, - 374, - 457, - 428, - 378, - 509, - 626, - 684, - 507, - 630, - 367, - 462, - 403, - 502, - 541, - 591, - 629, - 550, - 478, - 601, - 607, - 718, - 480, - 491, - 255, - 398, - 587, - 741, - 426, - 386, - 537, - 410, - 358, - 535, - 466, - 384, - 632, - 659, - 461, - 740, - 619, - 529, - 866, - 544, - 427, - 388, - 412, - 502, - 402, - 459, - 326, - 552, - 443, - 495, - 426, - 397, - 330, - 477, - 513, - 421, - 428, - 494, - 543, - 420, - 912, - 591, - 342, - 486, - 487, - 554, - 347, - 454, - 243, - 597, - 424, - 653, - 421, - 303, - 369, - 359, - 554, - 612, - 628, - 354, - 375, - 661, - 440, - 405, - 559, - 629, - 524, - 239, - 397, - 479, - 504, - 327, - 354, - 356, - 422, - 848, - 419, - 490, - 374, - 583, - 438, - 489, - 560, - 399, - 622, - 590, - 515, - 512, - 463, - 299, - 458, - 405, - 415, - 452, - 405, - 566, - 407, - 498, - 402, - 692, - 398, - 514, - 601, - 831, - 582, - 595, - 902, - 567, - 474, - 545, - 423, - 455, - 592, - 404, - 298, - 522, - 280, - 636, - 455, - 587, - 398, - 588, - 430, - 523, - 379, - 752, - 557, - 351, - 483, - 433, - 663, - 535, - 459, - 399, - 472, - 600, - 471, - 481, - 443, - 602, - 262, - 546, - 760, - 449, - 528, - 296, - 555, - 564, - 596, - 674, - 408, - 240, - 451, - 750, - 338, - 298, - 495, - 375, - 500, - 534, - 435, - 700, - 475, - 689, - 460, - 382, - 490, - 294, - 427, - 444, - 370, - 411, - 862, - 613, - 772, - 285, - 241, - 597, - 503, - 661, - 417, - 459, - 350, - 451, - 384, - 474, - 469, - 575, - 323, - 515, - 317, - 336, - 300, - 381, - 167, - 398, - 588, - 445, - 420, - 481, - 507, - 561, - 432, - 689, - 437, - 543, - 220, - 318, - 378, - 618, - 595, - 347, - 377, - 488, - 365, - 465, - 428, - 456, - 632, - 491, - 270, - 557, - 330, - 517, - 510, - 484, - 472, - 409, - 432, - 255, - 468, - 405, - 428, - 501, - 553, - 385, - 428, - 517, - 463, - 663, - 579, - 253, - 518, - 516, - 277, - 420, - 518, - 374, - 412, - 477, - 574, - 524, - 503, - 871, - 565, - 792, - 444, - 522, - 483, - 498, - 694, - 724, - 568, - 356, - 734, - 487, - 265, - 450, - 702, - 544, - 478, - 682, - 330, - 469, - 314, - 496, - 401, - 527, - 310, - 700, - 574, - 524, - 419, - 486, - 575, - 566, - 477, - 323, - 545, - 384, - 535, - 614, - 644, - 556, - 424, - 424, - 288, - 346, - 427, - 473, - 530, - 590, - 580, - 400, - 327, - 384, - 509, - 547, - 378, - 652, - 508, - 690, - 425, - 581, - 387, - 462, - 404, - 488, - 545, - 460, - 620, - 596, - 424, - 421, - 306, - 447, - 550, - 502, - 492, - 423, - 428, - 565, - 535, - 653, - 381, - 276, - 692, - 562, - 460, - 485, - 396, - 231, - 397, - 447, - 472, - 659, - 643, - 483, - 447, - 495, - 387, - 423, - 419, - 444, - 455, - 462, - 508, - 433, - 526, - 344, - 528, - 503, - 475, - 543, - 432, - 170, - 794, - 531, - 417, - 337, - 702, - 1025, - 531, - 446, - 475, - 393, - 620, - 324, - 605, - 347, - 497, - 536, - 586, - 731, - 531, - 337, - 322, - 723, - 533, - 506, - 429, - 513, - 296, - 576, - 341, - 494, - 358, - 544, - 508, - 326, - 429, - 610, - 626, - 273, - 752, - 345, - 534, - 506, - 487, - 627, - 572, - 382, - 589, - 520, - 623, - 341, - 254, - 563, - 292, - 680, - 546, - 328, - 399, - 489, - 669, - 425, - 602, - 668, - 418, - 580, - 719, - 398, - 479, - 375, - 554, - 460, - 541, - 591, - 403, - 522, - 424, - 684, - 456, - 462, - 393, - 733, - 475, - 452, - 459, - 596, - 423, - 423, - 650, - 502, - 283, - 321, - 509, - 323, - 404, - 407, - 497, - 416, - 505, - 531, - 866, - 467, - 535, - 286, - 525, - 648, - 511, - 502, - 557, - 705, - 604, - 388, - 432, - 471, - 270, - 463, - 330, - 516, - 293, - 402, - 653, - 408, - 526, - 524, - 460, - 601, - 266, - 442, - 460, - 520, - 714, - 373, - 742, - 665, - 371, - 421, - 521, - 546, - 766, - 392, - 425, - 736, - 392, - 279, - 618, - 499, - 377, - 345, - 447, - 470, - 486, - 221, - 457, - 644, - 345, - 427, - 483, - 522, - 445, - 539, - 673, - 506, - 731, - 426, - 653, - 657, - 416, - 469, - 303, - 373, - 317, - 538, - 497, - 382, - 329, - 358, - 514, - 376, - 414, - 314, - 328, - 575, - 525, - 617, - 196, - 353, - 421, - 251, - 484, - 294, - 658, - 469, - 596, - 673, - 706, - 416, - 262, - 306, - 342, - 533, - 509, - 582, - 631, - 616, - 558, - 614, - 509, - 325, - 349, - 414, - 537, - 270, - 509, - 434, - 376, - 351, - 298, - 537, - 697, - 292, - 518, - 438, - 707, - 366, - 346, - 449, - 515, - 568, - 366, - 636, - 334, - 486, - 565, - 502, - 824, - 691, - 444, - 494, - 268, - 440, - 571, - 441, - 400, - 514, - 665, - 321, - 411, - 459, - 305, - 682, - 472, - 538, - 465, - 607, - 297, - 408, - 522, - 382, - 438, - 667, - 673, - 282, - 328, - 328, - 538, - 375, - 807, - 502, - 554, - 444, - 273, - 556, - 189, - 551, - 494, - 435, - 467, - 696, - 531, - 677, - 393, - 516, - 631, - 666, - 388, - 688, - 484, - 677, - 391, - 519, - 327, - 664, - 404, - 460, - 414, - 467, - 545, - 456, - 651, - 554, - 698, - 315, - 413, - 380, - 722, - 408, - 543, - 509, - 678, - 506, - 354, - 612, - 538, - 507, - 357, - 419, - 484, - 406, - 426, - 521, - 427, - 638, - 436, - 424, - 779, - 721, - 416, - 454, - 349, - 502, - 685, - 388, - 793, - 285, - 388, - 446, - 532, - 692, - 546, - 627, - 652, - 694, - 760, - 496, - 527, - 315, - 502, - 537, - 484, - 699, - 421, - 540, - 379, - 823, - 456, - 580, - 506, - 477, - 414, - 518, - 514, - 304, - 688, - 367, - 484, - 404, - 503, - 415, - 507, - 424, - 504, - 483, - 434, - 384, - 289, - 493, - 359, - 494, - 308, - 383, - 595, - 270, - 807, - 511, - 410, - 268, - 401, - 442, - 392, - 368, - 485, - 284, - 419, - 795, - 515, - 446, - 734, - 389, - 247, - 842, - 597, - 438, - 426, - 564, - 582, - 224, - 267, - 527, - 496, - 448, - 538, - 466, - 635, - 421, - 475, - 303, - 601, - 705, - 285, - 552, - 477, - 514, - 370, - 499, - 415, - 454, - 662, - 586, - 186, - 516, - 556, - 462, - 829, - 522, - 438, - 389, - 638, - 465, - 547, - 479, - 309, - 498, - 529, - 599, - 273, - 329, - 478, - 520, - 518, - 643, - 435, - 552, - 542, - 312, - 521, - 515, - 594, - 507, - 481, - 548, - 430, - 617, - 505, - 417, - 645, - 362, - 426, - 520, - 731, - 707, - 521, - 445, - 432, - 751, - 383, - 589, - 454, - 520, - 318, - 627, - 419, - 281, - 508, - 419, - 254, - 630, - 582, - 526, - 445, - 504, - 461, - 507, - 630, - 369, - 410, - 179, - 708, - 471, - 681, - 480, - 501, - 582, - 418, - 432, - 424, - 333, - 436, - 449, - 524, - 465, - 250, - 590, - 543, - 309, - 612, - 412, - 378, - 496, - 593, - 366, - 441, - 499, - 316, - 479, - 359, - 560, - 605, - 439, - 629, - 611, - 573, - 468, - 354, - 301, - 733, - 400, - 607, - 621, - 397, - 417, - 482, - 567, - 394, - 257, - 456, - 468, - 395, - 517, - 458, - 478, - 433, - 271, - 609, - 371, - 249, - 687, - 457, - 640, - 353, - 551, - 451, - 597, - 372, - 638, - 566, - 584, - 296, - 559, - 447, - 669, - 570, - 470, - 302, - 630, - 345, - 680, - 446, - 350, - 305, - 376, - 529, - 318, - 526, - 560, - 390, - 540, - 515, - 497, - 547, - 669, - 320, - 393, - 615, - 560, - 542, - 579, - 653, - 521, - 346, - 498, - 489, - 637, - 414, - 340, - 478, - 385, - 493, - 561, - 193, - 351, - 335, - 658, - 546, - 601, - 301, - 351, - 570, - 247, - 598, - 470, - 440, - 283, - 428, - 686, - 565, - 660, - 660, - 342, - 591, - 314, - 429, - 512, - 602, - 584, - 520, - 499, - 711, - 830, - 501, - 590, - 498, - 577, - 393, - 535, - 523, - 568, - 482, - 730, - 501, - 707, - 699, - 649, - 601, - 618, - 533, - 591, - 605, - 537, - 508, - 427, - 528, - 446, - 331, - 367, - 520, - 407, - 620, - 308, - 369, - 369, - 473, - 242, - 506, - 494, - 289, - 451, - 514, - 637, - 241, - 347, - 490, - 611, - 394, - 422, - 284, - 527, - 404, - 604, - 355, - 459, - 466, - 617, - 471, - 352, - 523, - 480, - 574, - 432, - 483, - 175, - 454, - 476, - 435, - 550, - 432, - 650, - 654, - 388, - 580, - 652, - 310, - 730, - 419, - 541, - 403, - 495, - 508, - 390, - 343, - 825, - 473, - 621, - 924, - 628, - 606, - 543, - 138, - 652, - 510, - 550, - 719, - 441, - 586, - 500, - 427, - 359, - 501, - 484, - 416, - 366, - 321, - 422, - 428, - 551, - 620, - 428, - 458, - 422, - 544, - 622, - 636, - 414, - 273, - 426, - 563, - 593, - 886, - 299, - 495, - 531, - 552, - 440, - 624, - 525, - 369, - 341, - 454, - 482, - 219, - 551, - 302, - 660, - 357, - 619, - 490, - 343, - 414, - 774, - 743, - 621, - 411, - 578, - 507, - 412, - 670, - 543, - 482, - 373, - 520, - 495, - 561, - 374, - 385, - 560, - 541, - 637, - 439, - 567, - 590, - 319, - 562, - 404, - 469, - 398, - 456, - 441, - 563, - 320, - 498, - 332, - 784, - 623, - 364, - 372, - 490, - 137, - 492, - 281, - 591, - 590, - 399, - 516, - 479, - 503, - 511, - 583, - 440, - 668, - 442, - 277, - 556, - 576, - 559, - 359, - 321, - 354, - 472, - 493, - 727, - 618, - 512, - 603, - 413, - 535, - 273, - 507, - 663, - 653, - 573, - 382, - 302, - 676, - 660, - 498, - 320, - 535, - 684, - 285, - 382, - 310, - 554, - 498, - 496, - 512, - 447, - 375, - 566, - 589, - 318, - 559, - 542, - 402, - 473, - 520, - 567, - 634, - 406, - 813, - 641, - 676, - 189, - 621, - 290, - 617, - 362, - 376, - 326, - 453, - 306, - 384, - 640, - 469, - 353, - 496, - 428, - 678, - 544, - 729, - 576, - 681, - 613, - 276, - 617, - 698, - 224, - 679, - 336, - 503, - 409, - 367, - 337, - 310, - 448, - 416, - 374, - 336, - 733, - 292, - 724, - 477, - 760, - 434, - 449, - 174, - 296, - 472, - 594, - 483, - 466, - 526, - 516, - 472, - 688, - 462, - 344, - 382, - 472, - 510, - 435, - 636, - 719, - 600, - 405, - 477, - 549, - 569, - 468, - 592, - 648, - 557, - 535, - 445, - 911, - 768, - 714, - 416, - 498, - 502, - 623, - 596, - 597, - 61, - 613, - 231, - 510, - 477, - 508, - 636, - 361, - 302, - 272, - 559, - 395, - 507, - 361, - 660, - 727, - 643, - 575, - 525, - 436, - 456, - 502, - 334, - 575, - 356, - 533, - 565, - 496, - 488, - 548, - 664, - 607, - 428, - 925, - 408, - 346, - 473, - 464, - 482, - 686, - 494, - 446, - 321, - 506, - 215, - 610, - 426, - 590, - 353, - 728, - 485, - 835, - 466, - 501, - 501, - 340, - 494, - 469, - 379, - 465, - 689, - 572, - 593, - 541, - 461, - 377, - 415, - 664, - 631, - 653, - 606, - 400, - 369, - 410, - 404, - 582, - 448, - 426, - 570, - 503, - 383, - 640, - 410, - 275, - 349, - 292, - 507, - 393, - 464, - 333, - 445, - 538, - 497, - 561, - 669, - 346, - 543, - 347, - 329, - 601, - 359, - 796, - 792, - 497, - 528, - 307, - 461, - 660, - 404, - 527, - 382, - 401, - 388, - 551, - 446, - 565, - 672, - 488, - 362, - 364, - 534, - 473, - 357, - 290, - 499, - 512, - 484, - 300, - 771, - 471, - 506, - 453, - 283, - 377, - 303, - 533, - 538, - 762, - 261, - 612, - 526, - 296, - 400, - 539, - 286, - 391, - 797, - 585, - 302, - 508, - 366, - 377, - 471, - 469, - 422, - 497, - 690, - 461, - 639, - 832, - 523, - 641, - 393, - 753, - 395, - 423, - 506, - 366, - 574, - 381, - 581, - 308, - 705, - 306, - 411, - 560, - 443, - 399, - 316, - 442, - 338, - 452, - 382, - 666, - 566, - 518, - 720, - 417, - 574, - 533, - 442, - 501, - 502, - 327, - 527, - 631, - 490, - 672, - 653, - 534, - 607, - 428, - 561, - 671, - 761, - 387, - 761, - 410, - 419, - 201, - 419, - 519, - 490, - 445, - 352, - 613, - 234, - 637, - 506, - 575, - 437, - 573, - 488, - 613, - 635, - 496, - 342, - 473, - 393, - 498, - 427, - 537, - 266, - 429, - 293, - 562, - 477, - 422, - 581, - 544, - 537, - 217, - 410, - 341, - 735, - 624, - 760, - 297, - 502, - 645, - 200, - 504, - 770, - 556, - 423, - 514, - 626, - 494, - 581, - 360, - 512, - 343, - 486, - 357, - 523, - 645, - 375, - 328, - 571, - 401, - 546, - 334, - 526, - 640, - 434, - 454, - 310, - 558, - 459, - 351, - 482, - 253, - 391, - 648, - 450, - 628, - 589, - 440, - 480, - 659, - 199, - 311, - 291, - 443, - 371, - 327, - 559, - 663, - 622, - 405, - 366, - 552, - 703, - 725, - 448, - 712, - 457, - 417, - 476, - 570, - 336, - 430, - 286, - 354, - 452, - 866, - 322, - 341, - 378, - 450, - 633, - 456, - 565, - 717, - 541, - 408, - 370, - 501, - 338, - 538, - 488, - 515, - 687, - 488, - 547, - 662, - 548, - 586, - 475, - 653, - 648, - 202, - 637, - 360, - 438, - 444, - 359, - 538, - 280, - 228, - 687, - 558, - 366, - 308, - 319, - 398, - 658, - 454, - 406, - 540, - 692, - 521, - 569, - 435, - 513, - 551, - 438, - 491, - 527, - 565, - 683, - 348, - 446, - 664, - 478, - 235, - 543, - 460, - 518, - 388, - 488, - 478, - 476, - 791, - 603, - 729, - 383, - 215, - 417, - 360, - 294, - 452, - 437, - 470, - 612, - 248, - 501, - 471, - 337, - 496, - 630, - 465, - 475, - 515, - 367, - 524, - 476, - 445, - 456, - 513, - 539, - 364, - 526, - 330, - 698, - 419, - 381, - 508, - 641, - 476, - 708, - 665, - 643, - 426, - 669, - 490, - 248, - 608, - 287, - 453, - 656, - 483, - 628, - 537, - 718, - 517, - 594, - 474, - 519, - 571, - 414, - 154, - 501, - 498, - 541, - 598, - 498, - 380, - 335, - 555, - 578, - 509, - 400, - 553, - 569, - 624, - 680, - 660, - 571, - 547, - 434, - 564, - 409, - 472, - 582, - 481, - 552, - 280, - 500, - 417, - 374, - 498, - 552, - 595, - 444, - 617, - 539, - 443, - 403, - 465, - 687, - 538, - 602, - 691, - 558, - 314, - 323, - 454, - 514, - 361, - 642, - 361, - 556, - 520, - 548, - 435, - 384, - 592, - 709, - 548, - 399, - 332, - 494, - 425, - 423, - 615, - 547, - 439, - 297, - 417, - 462, - 589, - 299, - 299, - 696, - 355, - 416, - 490, - 489, - 541, - 410, - 541, - 366, - 460, - 421, - 606, - 345, - 366, - 555, - 407, - 438, - 536, - 652, - 423, - 471, - 510, - 498, - 470, - 528, - 492, - 298, - 367, - 407, - 280, - 478, - 464, - 371, - 547, - 534, - 688, - 453, - 443, - 559, - 429, - 615, - 653, - 365, - 569, - 534, - 760, - 355, - 666, - 438, - 511, - 379, - 568, - 558, - 508, - 683, - 510, - 413, - 518, - 395, - 229, - 508, - 371, - 339, - 175, - 505, - 555, - 405, - 383, - 455, - 596, - 399, - 404, - 476, - 365, - 466, - 665, - 295, - 589, - 511, - 409, - 553, - 593, - 383, - 515, - 459, - 433, - 443, - 446, - 405, - 439, - 597, - 353, - 613, - 374, - 564, - 356, - 357, - 343, - 384, - 271, - 614, - 275, - 498, - 679, - 570, - 645, - 226, - 472, - 411, - 493, - 388, - 535, - 547, - 630, - 319, - 638, - 606, - 536, - 271, - 434, - 505, - 481, - 455, - 469, - 351, - 991, - 487, - 373, - 327 - ] - }, - { - "counters": [ - 561, - 616, - 661, - 505, - 437, - 493, - 431, - 442, - 395, - 509, - 764, - 567, - 495, - 380, - 489, - 598, - 424, - 507, - 198, - 473, - 591, - 439, - 389, - 483, - 538, - 422, - 524, - 475, - 522, - 376, - 550, - 274, - 532, - 585, - 751, - 516, - 630, - 358, - 533, - 595, - 242, - 402, - 489, - 767, - 798, - 477, - 483, - 467, - 365, - 500, - 295, - 470, - 553, - 342, - 482, - 298, - 371, - 531, - 583, - 427, - 583, - 1030, - 610, - 432, - 482, - 441, - 400, - 430, - 530, - 705, - 446, - 445, - 491, - 593, - 632, - 262, - 501, - 478, - 240, - 319, - 416, - 601, - 492, - 546, - 619, - 665, - 238, - 475, - 538, - 283, - 179, - 204, - 377, - 297, - 430, - 252, - 450, - 508, - 575, - 528, - 509, - 478, - 755, - 307, - 465, - 688, - 477, - 440, - 862, - 499, - 469, - 521, - 455, - 372, - 726, - 449, - 521, - 568, - 492, - 482, - 558, - 589, - 407, - 367, - 576, - 570, - 338, - 591, - 362, - 526, - 454, - 400, - 242, - 612, - 784, - 174, - 562, - 530, - 482, - 363, - 628, - 516, - 472, - 579, - 649, - 548, - 677, - 315, - 395, - 536, - 580, - 424, - 360, - 429, - 470, - 444, - 563, - 695, - 449, - 625, - 307, - 511, - 424, - 561, - 473, - 509, - 351, - 283, - 504, - 484, - 513, - 460, - 486, - 547, - 367, - 330, - 445, - 629, - 448, - 560, - 485, - 590, - 355, - 369, - 384, - 395, - 292, - 338, - 278, - 609, - 355, - 291, - 505, - 446, - 491, - 668, - 557, - 275, - 569, - 410, - 358, - 628, - 429, - 658, - 328, - 596, - 527, - 238, - 425, - 651, - 423, - 696, - 583, - 381, - 316, - 417, - 500, - 446, - 596, - 420, - 520, - 525, - 500, - 435, - 580, - 451, - 711, - 450, - 444, - 647, - 664, - 511, - 215, - 502, - 434, - 377, - 628, - 546, - 556, - 447, - 490, - 304, - 403, - 444, - 297, - 395, - 505, - 399, - 506, - 402, - 325, - 707, - 372, - 717, - 297, - 582, - 479, - 448, - 305, - 438, - 647, - 462, - 355, - 737, - 449, - 594, - 432, - 607, - 344, - 498, - 391, - 525, - 472, - 536, - 485, - 577, - 409, - 227, - 394, - 462, - 570, - 618, - 711, - 325, - 524, - 359, - 547, - 449, - 424, - 515, - 275, - 378, - 392, - 471, - 508, - 621, - 565, - 709, - 787, - 529, - 339, - 484, - 602, - 396, - 411, - 419, - 611, - 250, - 534, - 433, - 500, - 494, - 626, - 503, - 287, - 551, - 430, - 396, - 594, - 689, - 665, - 446, - 592, - 579, - 406, - 542, - 342, - 471, - 505, - 643, - 496, - 323, - 439, - 544, - 668, - 425, - 341, - 548, - 317, - 461, - 567, - 685, - 318, - 336, - 628, - 430, - 558, - 382, - 296, - 338, - 379, - 326, - 557, - 553, - 943, - 280, - 463, - 713, - 452, - 267, - 712, - 545, - 628, - 432, - 712, - 435, - 582, - 392, - 484, - 386, - 387, - 343, - 594, - 475, - 567, - 494, - 605, - 578, - 542, - 707, - 344, - 596, - 376, - 554, - 390, - 399, - 741, - 233, - 758, - 247, - 412, - 555, - 358, - 412, - 403, - 361, - 338, - 505, - 509, - 470, - 503, - 884, - 493, - 546, - 594, - 247, - 535, - 596, - 546, - 253, - 566, - 671, - 619, - 450, - 428, - 493, - 428, - 579, - 519, - 400, - 357, - 323, - 370, - 596, - 574, - 509, - 338, - 505, - 356, - 541, - 467, - 614, - 689, - 524, - 591, - 350, - 455, - 357, - 537, - 321, - 528, - 473, - 510, - 515, - 411, - 404, - 317, - 482, - 481, - 345, - 496, - 534, - 499, - 449, - 637, - 661, - 518, - 539, - 517, - 269, - 484, - 400, - 407, - 434, - 429, - 739, - 612, - 405, - 437, - 454, - 356, - 385, - 672, - 590, - 398, - 368, - 561, - 263, - 547, - 346, - 235, - 358, - 331, - 264, - 532, - 599, - 447, - 682, - 398, - 526, - 400, - 413, - 320, - 425, - 744, - 202, - 483, - 438, - 622, - 798, - 334, - 572, - 245, - 492, - 205, - 425, - 498, - 300, - 534, - 454, - 692, - 307, - 510, - 246, - 500, - 388, - 715, - 383, - 697, - 481, - 369, - 588, - 462, - 232, - 688, - 567, - 658, - 613, - 265, - 353, - 585, - 564, - 390, - 580, - 420, - 583, - 345, - 446, - 301, - 342, - 709, - 487, - 513, - 650, - 436, - 775, - 551, - 417, - 331, - 783, - 653, - 179, - 521, - 649, - 502, - 921, - 540, - 458, - 579, - 473, - 717, - 501, - 518, - 591, - 428, - 369, - 825, - 422, - 293, - 497, - 535, - 515, - 434, - 592, - 304, - 440, - 335, - 747, - 375, - 270, - 267, - 494, - 461, - 384, - 392, - 513, - 452, - 581, - 343, - 427, - 305, - 624, - 494, - 291, - 475, - 491, - 402, - 480, - 490, - 631, - 479, - 221, - 530, - 465, - 449, - 682, - 473, - 763, - 422, - 618, - 357, - 502, - 543, - 457, - 544, - 350, - 372, - 730, - 793, - 467, - 490, - 454, - 688, - 485, - 782, - 389, - 409, - 573, - 622, - 408, - 516, - 515, - 518, - 489, - 687, - 703, - 626, - 380, - 553, - 175, - 596, - 514, - 415, - 379, - 505, - 506, - 510, - 379, - 458, - 502, - 406, - 358, - 317, - 411, - 307, - 517, - 356, - 391, - 375, - 591, - 441, - 396, - 231, - 593, - 333, - 266, - 464, - 245, - 473, - 382, - 519, - 652, - 273, - 393, - 400, - 497, - 571, - 338, - 412, - 604, - 428, - 479, - 674, - 606, - 613, - 341, - 324, - 454, - 232, - 321, - 432, - 588, - 677, - 471, - 463, - 435, - 603, - 576, - 460, - 522, - 489, - 633, - 417, - 300, - 455, - 586, - 605, - 471, - 573, - 424, - 247, - 450, - 382, - 417, - 410, - 389, - 575, - 264, - 697, - 445, - 377, - 730, - 451, - 521, - 490, - 456, - 755, - 538, - 515, - 470, - 376, - 383, - 482, - 497, - 283, - 390, - 564, - 390, - 512, - 644, - 651, - 473, - 445, - 457, - 402, - 478, - 489, - 544, - 426, - 437, - 489, - 541, - 596, - 442, - 305, - 449, - 533, - 498, - 566, - 681, - 387, - 428, - 487, - 545, - 545, - 404, - 621, - 575, - 481, - 512, - 553, - 542, - 368, - 259, - 425, - 642, - 405, - 319, - 387, - 426, - 355, - 369, - 684, - 573, - 785, - 465, - 299, - 400, - 689, - 725, - 298, - 394, - 1026, - 516, - 363, - 320, - 394, - 465, - 501, - 410, - 436, - 390, - 411, - 592, - 540, - 414, - 743, - 603, - 240, - 309, - 541, - 404, - 446, - 497, - 451, - 505, - 554, - 453, - 414, - 560, - 773, - 323, - 414, - 320, - 610, - 442, - 432, - 679, - 442, - 531, - 431, - 422, - 507, - 510, - 397, - 398, - 416, - 389, - 638, - 684, - 629, - 575, - 643, - 620, - 408, - 411, - 446, - 478, - 458, - 672, - 428, - 477, - 651, - 628, - 415, - 244, - 586, - 461, - 144, - 375, - 307, - 505, - 457, - 462, - 660, - 404, - 738, - 731, - 447, - 690, - 699, - 329, - 391, - 588, - 622, - 447, - 435, - 441, - 470, - 516, - 408, - 560, - 740, - 475, - 750, - 337, - 237, - 570, - 505, - 429, - 450, - 559, - 584, - 322, - 871, - 450, - 402, - 620, - 580, - 597, - 494, - 542, - 668, - 453, - 476, - 397, - 366, - 600, - 472, - 357, - 589, - 390, - 406, - 527, - 554, - 323, - 536, - 630, - 578, - 657, - 541, - 534, - 345, - 412, - 308, - 466, - 637, - 483, - 574, - 373, - 682, - 520, - 277, - 531, - 262, - 733, - 623, - 298, - 350, - 725, - 569, - 429, - 771, - 706, - 556, - 315, - 498, - 671, - 330, - 490, - 448, - 617, - 528, - 480, - 604, - 414, - 400, - 748, - 478, - 565, - 474, - 641, - 528, - 395, - 289, - 411, - 449, - 766, - 500, - 540, - 488, - 444, - 388, - 581, - 271, - 362, - 525, - 364, - 521, - 727, - 524, - 506, - 871, - 462, - 384, - 466, - 411, - 536, - 711, - 414, - 550, - 312, - 353, - 615, - 260, - 660, - 577, - 628, - 515, - 705, - 554, - 353, - 649, - 400, - 624, - 385, - 325, - 546, - 372, - 470, - 487, - 509, - 558, - 485, - 376, - 265, - 541, - 600, - 590, - 456, - 762, - 444, - 413, - 308, - 788, - 467, - 308, - 485, - 645, - 560, - 514, - 333, - 610, - 502, - 522, - 592, - 305, - 519, - 469, - 317, - 461, - 533, - 558, - 405, - 400, - 474, - 507, - 330, - 477, - 568, - 640, - 480, - 270, - 439, - 669, - 593, - 347, - 355, - 568, - 526, - 712, - 563, - 459, - 388, - 839, - 732, - 560, - 613, - 581, - 485, - 573, - 542, - 519, - 360, - 614, - 560, - 358, - 607, - 479, - 538, - 390, - 250, - 635, - 479, - 624, - 503, - 581, - 715, - 468, - 363, - 461, - 245, - 213, - 440, - 480, - 546, - 590, - 494, - 637, - 473, - 360, - 599, - 514, - 532, - 550, - 533, - 152, - 716, - 279, - 369, - 587, - 400, - 521, - 552, - 383, - 548, - 381, - 593, - 564, - 791, - 539, - 428, - 321, - 568, - 643, - 695, - 586, - 544, - 502, - 359, - 427, - 514, - 620, - 301, - 398, - 452, - 375, - 343, - 402, - 480, - 496, - 308, - 704, - 460, - 525, - 600, - 800, - 305, - 614, - 488, - 469, - 525, - 175, - 511, - 684, - 583, - 612, - 501, - 454, - 395, - 517, - 847, - 602, - 602, - 298, - 463, - 627, - 405, - 614, - 370, - 533, - 482, - 449, - 272, - 536, - 378, - 510, - 642, - 362, - 559, - 412, - 396, - 250, - 504, - 389, - 615, - 546, - 327, - 617, - 468, - 425, - 727, - 516, - 439, - 488, - 516, - 348, - 652, - 387, - 713, - 331, - 612, - 384, - 517, - 359, - 753, - 582, - 555, - 555, - 492, - 452, - 505, - 538, - 425, - 545, - 245, - 456, - 459, - 372, - 568, - 949, - 595, - 591, - 401, - 551, - 202, - 509, - 490, - 540, - 501, - 422, - 366, - 530, - 521, - 502, - 661, - 689, - 530, - 373, - 711, - 457, - 367, - 338, - 341, - 478, - 754, - 483, - 511, - 500, - 470, - 490, - 569, - 414, - 355, - 315, - 618, - 367, - 337, - 338, - 730, - 548, - 406, - 268, - 618, - 433, - 462, - 710, - 476, - 397, - 499, - 488, - 322, - 460, - 557, - 460, - 404, - 435, - 444, - 571, - 630, - 478, - 486, - 423, - 369, - 666, - 535, - 475, - 301, - 331, - 585, - 616, - 540, - 388, - 616, - 507, - 523, - 431, - 670, - 396, - 415, - 186, - 424, - 420, - 508, - 560, - 533, - 507, - 220, - 461, - 417, - 341, - 405, - 570, - 454, - 625, - 356, - 490, - 409, - 545, - 462, - 548, - 351, - 245, - 509, - 493, - 606, - 730, - 589, - 295, - 455, - 340, - 562, - 389, - 411, - 682, - 228, - 535, - 559, - 328, - 736, - 462, - 371, - 450, - 536, - 397, - 496, - 860, - 311, - 343, - 479, - 512, - 438, - 565, - 539, - 556, - 508, - 329, - 517, - 459, - 553, - 553, - 591, - 493, - 609, - 572, - 478, - 747, - 314, - 526, - 465, - 352, - 291, - 572, - 321, - 398, - 288, - 408, - 366, - 436, - 594, - 696, - 552, - 517, - 370, - 555, - 387, - 452, - 556, - 294, - 532, - 538, - 412, - 416, - 668, - 570, - 366, - 489, - 428, - 568, - 379, - 347, - 378, - 272, - 337, - 561, - 666, - 402, - 491, - 597, - 491, - 659, - 495, - 448, - 358, - 376, - 340, - 495, - 327, - 387, - 484, - 519, - 455, - 473, - 683, - 349, - 268, - 509, - 537, - 525, - 867, - 627, - 551, - 287, - 524, - 385, - 564, - 685, - 419, - 307, - 467, - 481, - 537, - 382, - 365, - 525, - 771, - 529, - 469, - 752, - 474, - 484, - 612, - 430, - 673, - 390, - 476, - 447, - 583, - 562, - 379, - 476, - 519, - 449, - 375, - 474, - 603, - 520, - 588, - 541, - 394, - 514, - 890, - 222, - 618, - 482, - 402, - 552, - 331, - 480, - 380, - 272, - 519, - 366, - 412, - 669, - 420, - 436, - 411, - 415, - 379, - 504, - 470, - 201, - 488, - 612, - 622, - 449, - 586, - 368, - 493, - 334, - 383, - 541, - 817, - 507, - 361, - 749, - 624, - 462, - 411, - 743, - 453, - 442, - 367, - 647, - 742, - 266, - 589, - 431, - 549, - 385, - 499, - 388, - 647, - 681, - 843, - 383, - 288, - 567, - 594, - 488, - 476, - 312, - 507, - 552, - 454, - 710, - 515, - 462, - 345, - 502, - 469, - 400, - 364, - 584, - 649, - 564, - 576, - 439, - 334, - 588, - 501, - 311, - 374, - 513, - 474, - 486, - 623, - 436, - 647, - 513, - 314, - 555, - 514, - 712, - 195, - 425, - 377, - 505, - 342, - 568, - 633, - 427, - 357, - 286, - 345, - 519, - 447, - 698, - 365, - 516, - 439, - 470, - 344, - 539, - 341, - 442, - 591, - 571, - 543, - 363, - 384, - 215, - 599, - 367, - 594, - 269, - 472, - 407, - 490, - 385, - 605, - 508, - 667, - 407, - 354, - 542, - 588, - 330, - 581, - 594, - 440, - 456, - 364, - 555, - 582, - 316, - 532, - 371, - 605, - 535, - 605, - 604, - 619, - 667, - 369, - 518, - 413, - 694, - 517, - 498, - 548, - 637, - 336, - 440, - 325, - 474, - 434, - 690, - 457, - 529, - 739, - 476, - 735, - 484, - 441, - 519, - 592, - 424, - 304, - 627, - 569, - 454, - 406, - 225, - 383, - 530, - 609, - 569, - 295, - 547, - 396, - 467, - 375, - 225, - 602, - 855, - 382, - 650, - 552, - 382, - 550, - 364, - 622, - 696, - 360, - 466, - 274, - 454, - 458, - 323, - 532, - 550, - 722, - 319, - 467, - 600, - 323, - 335, - 445, - 593, - 423, - 601, - 590, - 400, - 465, - 413, - 480, - 808, - 406, - 775, - 311, - 681, - 431, - 580, - 446, - 686, - 533, - 622, - 586, - 471, - 754, - 676, - 519, - 464, - 304, - 439, - 726, - 315, - 656, - 648, - 647, - 835, - 341, - 410, - 566, - 495, - 488, - 595, - 514, - 444, - 657, - 453, - 563, - 646, - 579, - 385, - 722, - 404, - 569, - 472, - 518, - 501, - 380, - 641, - 583, - 613, - 581, - 242, - 215, - 290, - 522, - 575, - 730, - 535, - 650, - 899, - 464, - 455, - 629, - 465, - 523, - 664, - 470, - 416, - 238, - 609, - 723, - 517, - 458, - 493, - 433, - 553, - 358, - 529, - 482, - 548, - 362, - 483, - 664, - 655, - 543, - 666, - 480, - 482, - 624, - 504, - 463, - 493, - 341, - 344, - 551, - 306, - 364, - 540, - 657, - 300, - 312, - 760, - 524, - 445, - 356, - 568, - 573, - 444, - 431, - 557, - 544, - 436, - 665, - 470, - 389, - 539, - 498, - 473, - 438, - 341, - 411, - 612, - 400, - 463, - 540, - 715, - 315, - 604, - 653, - 502, - 503, - 453, - 309, - 518, - 548, - 402, - 261, - 453, - 73, - 606, - 518, - 496, - 737, - 667, - 371, - 247, - 674, - 190, - 454, - 239, - 395, - 455, - 576, - 449, - 447, - 591, - 528, - 435, - 370, - 289, - 378, - 475, - 384, - 632, - 486, - 447, - 216, - 529, - 585, - 690, - 394, - 520, - 472, - 247, - 517, - 396, - 671, - 351, - 827, - 289, - 539, - 644, - 511, - 369, - 496, - 689, - 534, - 446, - 428, - 573, - 482, - 527, - 484, - 379, - 737, - 552, - 543, - 340, - 720, - 642, - 419, - 603, - 482, - 639, - 586, - 528, - 613, - 395, - 690, - 679, - 205, - 540, - 441, - 385, - 438, - 556, - 289, - 320, - 331, - 586, - 378, - 549, - 432, - 585, - 381, - 523, - 537, - 344, - 466, - 666, - 352, - 447, - 574, - 495, - 545, - 414, - 482, - 291, - 442, - 442, - 672, - 389, - 540, - 451, - 456, - 296, - 282, - 287, - 635, - 394, - 554, - 297, - 584, - 612, - 517, - 475, - 419, - 336, - 489, - 453, - 463, - 385, - 590, - 352, - 262, - 791, - 548, - 760, - 179, - 358, - 565, - 556, - 293, - 714, - 582, - 448, - 390, - 539, - 440, - 714, - 633, - 408, - 523, - 500, - 406, - 568, - 494, - 538, - 372, - 642, - 388, - 579, - 436, - 487, - 359, - 312, - 322, - 543, - 284, - 561, - 338, - 521, - 406, - 489, - 507, - 777, - 468, - 477, - 477, - 473, - 481, - 590, - 599, - 401, - 747, - 427, - 365, - 341, - 391, - 448, - 454, - 752, - 457, - 458, - 778, - 471, - 519, - 569, - 382, - 395, - 405, - 561, - 612, - 646, - 366, - 696, - 521, - 527, - 422, - 608, - 447, - 635, - 476, - 503, - 613, - 635, - 357, - 703, - 681, - 447, - 349 - ] - }, - { - "counters": [ - 524, - 589, - 416, - 549, - 521, - 579, - 627, - 413, - 445, - 423, - 653, - 500, - 488, - 454, - 538, - 354, - 664, - 509, - 179, - 584, - 525, - 333, - 400, - 427, - 451, - 275, - 340, - 626, - 590, - 560, - 442, - 503, - 347, - 483, - 437, - 416, - 485, - 577, - 461, - 517, - 312, - 615, - 469, - 687, - 474, - 697, - 505, - 404, - 462, - 217, - 600, - 545, - 424, - 555, - 386, - 307, - 488, - 482, - 410, - 642, - 492, - 507, - 504, - 442, - 702, - 496, - 481, - 491, - 432, - 529, - 574, - 567, - 292, - 397, - 414, - 377, - 874, - 833, - 579, - 596, - 556, - 283, - 298, - 662, - 263, - 615, - 488, - 375, - 525, - 574, - 540, - 350, - 430, - 491, - 356, - 552, - 111, - 741, - 447, - 401, - 544, - 530, - 457, - 469, - 342, - 468, - 614, - 410, - 350, - 392, - 675, - 624, - 625, - 701, - 549, - 608, - 624, - 419, - 597, - 575, - 627, - 301, - 329, - 382, - 470, - 480, - 580, - 492, - 413, - 410, - 460, - 455, - 374, - 456, - 561, - 456, - 571, - 373, - 406, - 466, - 459, - 408, - 695, - 651, - 546, - 703, - 496, - 406, - 784, - 269, - 603, - 525, - 491, - 406, - 616, - 387, - 407, - 320, - 580, - 296, - 367, - 547, - 425, - 566, - 462, - 670, - 597, - 526, - 577, - 505, - 483, - 398, - 449, - 286, - 602, - 451, - 464, - 546, - 386, - 636, - 437, - 414, - 413, - 215, - 525, - 299, - 690, - 481, - 640, - 290, - 323, - 530, - 416, - 427, - 435, - 841, - 549, - 310, - 297, - 442, - 554, - 423, - 632, - 549, - 729, - 640, - 502, - 597, - 476, - 395, - 542, - 356, - 300, - 526, - 390, - 635, - 629, - 352, - 519, - 343, - 565, - 608, - 447, - 413, - 383, - 365, - 307, - 479, - 739, - 656, - 345, - 493, - 274, - 785, - 303, - 691, - 571, - 355, - 494, - 368, - 421, - 639, - 470, - 592, - 287, - 292, - 723, - 639, - 652, - 633, - 389, - 529, - 262, - 304, - 533, - 758, - 695, - 664, - 553, - 282, - 384, - 647, - 517, - 426, - 592, - 464, - 346, - 390, - 405, - 493, - 479, - 547, - 448, - 466, - 228, - 808, - 515, - 336, - 624, - 582, - 419, - 614, - 715, - 564, - 304, - 434, - 614, - 341, - 484, - 337, - 200, - 368, - 688, - 475, - 703, - 414, - 441, - 480, - 518, - 638, - 138, - 345, - 444, - 585, - 447, - 319, - 488, - 392, - 474, - 793, - 440, - 546, - 388, - 399, - 573, - 547, - 453, - 429, - 543, - 400, - 439, - 667, - 531, - 731, - 424, - 457, - 400, - 429, - 547, - 453, - 453, - 576, - 754, - 390, - 383, - 343, - 405, - 398, - 369, - 548, - 562, - 446, - 443, - 429, - 670, - 427, - 470, - 486, - 601, - 696, - 543, - 546, - 605, - 410, - 359, - 513, - 473, - 351, - 507, - 564, - 499, - 577, - 510, - 553, - 555, - 418, - 465, - 582, - 489, - 556, - 661, - 605, - 451, - 538, - 590, - 393, - 660, - 386, - 643, - 520, - 808, - 367, - 512, - 540, - 685, - 442, - 619, - 284, - 312, - 643, - 731, - 576, - 248, - 529, - 595, - 365, - 463, - 774, - 570, - 597, - 468, - 330, - 482, - 211, - 576, - 534, - 484, - 377, - 476, - 536, - 452, - 607, - 653, - 722, - 427, - 643, - 576, - 399, - 376, - 649, - 468, - 317, - 533, - 351, - 239, - 624, - 695, - 567, - 350, - 506, - 308, - 342, - 494, - 620, - 535, - 740, - 777, - 437, - 638, - 553, - 525, - 226, - 550, - 429, - 464, - 453, - 698, - 441, - 433, - 503, - 383, - 337, - 396, - 422, - 503, - 401, - 528, - 457, - 479, - 475, - 568, - 455, - 473, - 433, - 356, - 547, - 678, - 473, - 470, - 588, - 448, - 329, - 352, - 452, - 577, - 573, - 810, - 399, - 434, - 588, - 251, - 398, - 462, - 434, - 673, - 500, - 435, - 152, - 341, - 660, - 704, - 824, - 398, - 337, - 253, - 736, - 755, - 461, - 447, - 621, - 706, - 621, - 450, - 567, - 506, - 394, - 579, - 362, - 378, - 475, - 290, - 475, - 383, - 492, - 531, - 423, - 443, - 627, - 263, - 400, - 463, - 548, - 426, - 418, - 247, - 560, - 344, - 656, - 507, - 269, - 558, - 451, - 364, - 603, - 671, - 452, - 525, - 542, - 557, - 731, - 601, - 338, - 378, - 458, - 299, - 565, - 631, - 486, - 709, - 204, - 380, - 405, - 682, - 459, - 479, - 550, - 390, - 688, - 384, - 685, - 652, - 254, - 366, - 257, - 389, - 645, - 827, - 518, - 495, - 377, - 668, - 617, - 587, - 664, - 508, - 523, - 338, - 622, - 347, - 658, - 368, - 877, - 522, - 645, - 318, - 697, - 440, - 626, - 451, - 489, - 474, - 331, - 671, - 424, - 498, - 724, - 452, - 405, - 482, - 459, - 508, - 427, - 451, - 402, - 569, - 287, - 657, - 559, - 628, - 328, - 340, - 444, - 525, - 381, - 321, - 693, - 839, - 598, - 396, - 463, - 328, - 561, - 473, - 321, - 447, - 325, - 585, - 594, - 419, - 605, - 396, - 327, - 454, - 531, - 302, - 554, - 418, - 646, - 371, - 398, - 607, - 488, - 444, - 390, - 674, - 454, - 365, - 516, - 610, - 552, - 473, - 378, - 302, - 707, - 649, - 403, - 474, - 308, - 366, - 775, - 149, - 584, - 414, - 456, - 324, - 824, - 509, - 598, - 837, - 396, - 431, - 253, - 525, - 371, - 396, - 591, - 601, - 272, - 756, - 725, - 637, - 615, - 553, - 416, - 411, - 719, - 390, - 635, - 438, - 542, - 238, - 480, - 479, - 427, - 667, - 509, - 584, - 454, - 459, - 448, - 318, - 561, - 533, - 601, - 551, - 365, - 642, - 482, - 639, - 470, - 693, - 573, - 424, - 545, - 588, - 487, - 522, - 305, - 587, - 409, - 503, - 394, - 573, - 361, - 758, - 517, - 558, - 376, - 630, - 535, - 297, - 548, - 431, - 903, - 418, - 410, - 536, - 483, - 284, - 444, - 446, - 507, - 453, - 535, - 295, - 653, - 536, - 402, - 328, - 488, - 458, - 649, - 533, - 528, - 720, - 479, - 467, - 404, - 447, - 548, - 487, - 413, - 340, - 330, - 641, - 551, - 637, - 537, - 309, - 539, - 373, - 465, - 374, - 364, - 443, - 498, - 443, - 699, - 355, - 404, - 679, - 300, - 380, - 578, - 410, - 357, - 520, - 511, - 309, - 331, - 601, - 512, - 360, - 415, - 256, - 442, - 365, - 582, - 632, - 568, - 534, - 392, - 403, - 659, - 375, - 644, - 324, - 756, - 298, - 663, - 492, - 604, - 396, - 468, - 516, - 538, - 348, - 479, - 457, - 546, - 490, - 297, - 351, - 587, - 491, - 450, - 344, - 365, - 422, - 428, - 642, - 560, - 347, - 486, - 614, - 266, - 405, - 414, - 617, - 750, - 497, - 346, - 396, - 594, - 467, - 451, - 521, - 613, - 586, - 337, - 421, - 489, - 568, - 420, - 640, - 428, - 568, - 668, - 534, - 442, - 435, - 498, - 358, - 492, - 549, - 585, - 439, - 376, - 562, - 547, - 486, - 483, - 686, - 545, - 654, - 423, - 464, - 569, - 551, - 582, - 549, - 416, - 365, - 633, - 616, - 552, - 639, - 577, - 646, - 609, - 347, - 535, - 361, - 672, - 541, - 579, - 488, - 376, - 355, - 487, - 507, - 469, - 535, - 488, - 417, - 268, - 459, - 385, - 536, - 306, - 564, - 358, - 289, - 526, - 350, - 435, - 646, - 570, - 260, - 238, - 453, - 489, - 205, - 533, - 424, - 411, - 515, - 601, - 402, - 416, - 235, - 752, - 442, - 331, - 376, - 387, - 384, - 391, - 670, - 235, - 467, - 268, - 625, - 381, - 589, - 679, - 470, - 730, - 431, - 221, - 248, - 486, - 443, - 474, - 315, - 545, - 314, - 492, - 409, - 533, - 332, - 599, - 178, - 410, - 547, - 486, - 342, - 504, - 571, - 686, - 381, - 407, - 506, - 696, - 628, - 705, - 291, - 345, - 382, - 659, - 467, - 341, - 402, - 631, - 314, - 683, - 694, - 710, - 688, - 473, - 656, - 447, - 499, - 521, - 709, - 362, - 552, - 478, - 547, - 551, - 768, - 493, - 482, - 266, - 282, - 351, - 798, - 402, - 511, - 410, - 454, - 550, - 612, - 723, - 602, - 687, - 582, - 318, - 510, - 545, - 333, - 339, - 476, - 486, - 503, - 386, - 382, - 545, - 560, - 499, - 340, - 340, - 455, - 452, - 658, - 643, - 587, - 439, - 573, - 454, - 502, - 505, - 506, - 428, - 433, - 312, - 261, - 462, - 570, - 536, - 364, - 464, - 572, - 345, - 258, - 481, - 403, - 577, - 283, - 362, - 667, - 795, - 410, - 600, - 433, - 323, - 579, - 655, - 529, - 351, - 527, - 401, - 366, - 368, - 469, - 690, - 504, - 311, - 466, - 547, - 541, - 555, - 651, - 448, - 563, - 397, - 516, - 687, - 572, - 468, - 438, - 498, - 253, - 530, - 576, - 485, - 327, - 479, - 447, - 653, - 400, - 504, - 533, - 523, - 535, - 556, - 411, - 337, - 591, - 510, - 598, - 557, - 523, - 447, - 456, - 604, - 556, - 387, - 564, - 733, - 422, - 590, - 679, - 599, - 295, - 502, - 489, - 625, - 375, - 657, - 353, - 757, - 467, - 515, - 534, - 306, - 580, - 283, - 477, - 454, - 310, - 530, - 758, - 561, - 773, - 356, - 946, - 431, - 652, - 554, - 485, - 820, - 520, - 582, - 593, - 620, - 646, - 383, - 626, - 637, - 641, - 388, - 551, - 329, - 394, - 482, - 370, - 288, - 565, - 776, - 684, - 470, - 422, - 601, - 436, - 436, - 517, - 309, - 444, - 516, - 473, - 467, - 254, - 365, - 474, - 567, - 653, - 230, - 421, - 481, - 391, - 670, - 573, - 619, - 446, - 436, - 525, - 305, - 557, - 876, - 297, - 506, - 492, - 402, - 393, - 412, - 460, - 336, - 370, - 623, - 280, - 499, - 451, - 424, - 545, - 591, - 446, - 342, - 664, - 593, - 561, - 333, - 548, - 672, - 341, - 557, - 588, - 639, - 474, - 467, - 243, - 307, - 445, - 215, - 351, - 354, - 310, - 671, - 534, - 749, - 354, - 464, - 637, - 513, - 501, - 409, - 304, - 482, - 351, - 315, - 524, - 447, - 478, - 258, - 230, - 459, - 515, - 454, - 589, - 582, - 472, - 401, - 294, - 376, - 504, - 286, - 451, - 267, - 575, - 335, - 436, - 493, - 388, - 317, - 350, - 404, - 398, - 831, - 589, - 325, - 554, - 755, - 548, - 677, - 446, - 390, - 488, - 376, - 411, - 323, - 460, - 234, - 412, - 330, - 537, - 461, - 465, - 484, - 637, - 677, - 512, - 433, - 469, - 549, - 687, - 634, - 481, - 706, - 555, - 581, - 300, - 474, - 558, - 375, - 624, - 463, - 518, - 343, - 617, - 583, - 756, - 391, - 508, - 587, - 349, - 441, - 381, - 316, - 463, - 402, - 231, - 403, - 304, - 367, - 457, - 494, - 314, - 159, - 689, - 384, - 386, - 413, - 274, - 353, - 643, - 468, - 456, - 368, - 517, - 844, - 498, - 545, - 619, - 417, - 362, - 720, - 299, - 439, - 554, - 621, - 437, - 631, - 598, - 457, - 477, - 289, - 341, - 418, - 455, - 527, - 430, - 684, - 546, - 490, - 500, - 595, - 342, - 537, - 434, - 512, - 286, - 352, - 644, - 467, - 476, - 365, - 452, - 511, - 359, - 536, - 424, - 462, - 419, - 544, - 364, - 336, - 619, - 504, - 403, - 521, - 302, - 389, - 486, - 193, - 506, - 387, - 471, - 352, - 433, - 258, - 609, - 397, - 703, - 258, - 508, - 725, - 407, - 447, - 437, - 421, - 215, - 728, - 519, - 445, - 290, - 472, - 657, - 620, - 567, - 526, - 431, - 412, - 215, - 340, - 538, - 575, - 350, - 322, - 497, - 521, - 437, - 365, - 308, - 587, - 608, - 529, - 578, - 371, - 430, - 623, - 473, - 513, - 546, - 396, - 611, - 719, - 464, - 505, - 519, - 359, - 634, - 362, - 507, - 578, - 476, - 555, - 336, - 432, - 440, - 527, - 754, - 364, - 416, - 346, - 269, - 441, - 731, - 208, - 677, - 422, - 713, - 665, - 579, - 478, - 481, - 638, - 721, - 454, - 585, - 878, - 515, - 700, - 650, - 286, - 695, - 209, - 479, - 415, - 640, - 539, - 505, - 448, - 551, - 499, - 315, - 474, - 437, - 606, - 648, - 865, - 527, - 775, - 456, - 650, - 535, - 508, - 636, - 344, - 518, - 364, - 489, - 307, - 318, - 471, - 559, - 440, - 369, - 624, - 491, - 427, - 374, - 369, - 459, - 690, - 525, - 539, - 682, - 620, - 659, - 324, - 453, - 321, - 649, - 684, - 461, - 378, - 753, - 278, - 455, - 553, - 563, - 489, - 446, - 838, - 586, - 325, - 462, - 636, - 548, - 538, - 298, - 349, - 348, - 526, - 192, - 428, - 501, - 363, - 291, - 486, - 458, - 572, - 590, - 247, - 635, - 416, - 517, - 468, - 351, - 629, - 624, - 446, - 434, - 409, - 363, - 445, - 364, - 461, - 571, - 444, - 571, - 468, - 251, - 776, - 488, - 500, - 569, - 492, - 425, - 510, - 376, - 373, - 479, - 316, - 363, - 864, - 517, - 484, - 425, - 636, - 594, - 395, - 374, - 644, - 315, - 482, - 259, - 575, - 481, - 459, - 648, - 413, - 472, - 454, - 556, - 612, - 482, - 527, - 548, - 424, - 387, - 550, - 522, - 433, - 668, - 523, - 492, - 382, - 610, - 512, - 390, - 339, - 369, - 625, - 367, - 738, - 744, - 585, - 466, - 378, - 370, - 445, - 386, - 398, - 494, - 377, - 509, - 284, - 666, - 529, - 468, - 461, - 451, - 439, - 670, - 351, - 494, - 226, - 329, - 360, - 456, - 315, - 321, - 657, - 589, - 366, - 531, - 477, - 551, - 758, - 610, - 391, - 661, - 503, - 601, - 540, - 476, - 576, - 700, - 400, - 463, - 503, - 554, - 189, - 716, - 346, - 573, - 442, - 386, - 592, - 581, - 525, - 601, - 552, - 560, - 662, - 498, - 674, - 446, - 593, - 369, - 306, - 516, - 541, - 560, - 459, - 441, - 166, - 544, - 372, - 573, - 539, - 173, - 477, - 314, - 347, - 450, - 394, - 659, - 629, - 368, - 456, - 375, - 638, - 169, - 713, - 582, - 427, - 583, - 632, - 362, - 701, - 797, - 418, - 617, - 657, - 441, - 411, - 679, - 298, - 696, - 480, - 459, - 750, - 517, - 412, - 599, - 616, - 548, - 916, - 621, - 628, - 568, - 389, - 279, - 536, - 634, - 364, - 401, - 507, - 563, - 410, - 576, - 576, - 505, - 378, - 404, - 289, - 550, - 466, - 555, - 328, - 448, - 636, - 260, - 736, - 576, - 285, - 446, - 634, - 482, - 590, - 649, - 537, - 268, - 618, - 635, - 513, - 581, - 466, - 761, - 556, - 383, - 495, - 592, - 303, - 332, - 501, - 530, - 661, - 579, - 566, - 608, - 384, - 456, - 572, - 465, - 651, - 506, - 501, - 711, - 363, - 247, - 373, - 263, - 710, - 283, - 364, - 443, - 666, - 516, - 349, - 610, - 665, - 625, - 512, - 670, - 497, - 369, - 639, - 420, - 700, - 441, - 336, - 533, - 411, - 278, - 211, - 476, - 555, - 233, - 530, - 394, - 504, - 517, - 542, - 350, - 702, - 830, - 424, - 683, - 679, - 378, - 409, - 600, - 686, - 392, - 454, - 333, - 418, - 572, - 419, - 703, - 345, - 267, - 349, - 430, - 518, - 500, - 695, - 491, - 449, - 353, - 509, - 185, - 386, - 622, - 427, - 549, - 595, - 603, - 678, - 480, - 631, - 633, - 463, - 432, - 468, - 317, - 415, - 429, - 443, - 358, - 542, - 665, - 432, - 762, - 420, - 465, - 504, - 411, - 436, - 510, - 485, - 426, - 510, - 296, - 337, - 235, - 448, - 485, - 355, - 517, - 658, - 439, - 331, - 369, - 587, - 787, - 625, - 735, - 344, - 618, - 619, - 258, - 380, - 369, - 305, - 269, - 493, - 573, - 435, - 716, - 554, - 297, - 467, - 431, - 540, - 554, - 611, - 673, - 521, - 602, - 574, - 543, - 503, - 473, - 333, - 468, - 491, - 630, - 693, - 304, - 650, - 640, - 384, - 709, - 572, - 450, - 577, - 424, - 241, - 612, - 394, - 489, - 633, - 483, - 746, - 338, - 287, - 413, - 458, - 582, - 531, - 598, - 528, - 603, - 535, - 384, - 428, - 346, - 629, - 234, - 712, - 530, - 398, - 398, - 525, - 458, - 311, - 374, - 442, - 618, - 414, - 632, - 431, - 316, - 365, - 362, - 391, - 462, - 373, - 415, - 689, - 308, - 522, - 410, - 609, - 248, - 442, - 721, - 390, - 311, - 477, - 273, - 777, - 500, - 459, - 644, - 392, - 495, - 403, - 514, - 668, - 508, - 499, - 369, - 305, - 421, - 530, - 324, - 360, - 396, - 442, - 257, - 702, - 469, - 472 - ] - } - ], - "top_n": [ - { - "data": "CIDdAg==", - "count": 20011 - }, - { - "data": "CPyEAw==", - "count": 138 - }, - { - "data": "CKIb", - "count": 0 - }, - { - "data": "CLR+", - "count": 44 - }, - { - "data": "CN7oAQ==", - "count": 0 - }, - { - "data": "COLUAg==", - "count": 107 - }, - { - "data": "CIiEAw==", - "count": 18 - }, - { - "data": "CKDwAg==", - "count": 0 - }, - { - "data": "CM7gAg==", - "count": 0 - }, - { - "data": "CL7FAg==", - "count": 83 - }, - { - "data": "CLAD", - "count": 189 - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 2784591, - "last_update_version": 412596210123931648, - "correlation": 0.045477 - } - }, - "indices": { - "idx_a": { - "histogram": { - "ndv": 250, - "buckets": [ - { - "count": 4122, - "lower_bound": "A4AAAAAAAAAB", - "upper_bound": "A4AAAAAAAAAB", - "repeats": 4122 - }, - { - "count": 8205, - "lower_bound": "A4AAAAAAAAAC", - "upper_bound": "A4AAAAAAAAAC", - "repeats": 4083 - }, - { - "count": 12255, - "lower_bound": "A4AAAAAAAAAD", - "upper_bound": "A4AAAAAAAAAD", - "repeats": 4050 - }, - { - "count": 16367, - "lower_bound": "A4AAAAAAAAAE", - "upper_bound": "A4AAAAAAAAAE", - "repeats": 4112 - }, - { - "count": 20402, - "lower_bound": "A4AAAAAAAAAF", - "upper_bound": "A4AAAAAAAAAF", - "repeats": 4035 - }, - { - "count": 24531, - "lower_bound": "A4AAAAAAAAAG", - "upper_bound": "A4AAAAAAAAAG", - "repeats": 4129 - }, - { - "count": 28625, - "lower_bound": "A4AAAAAAAAAH", - "upper_bound": "A4AAAAAAAAAH", - "repeats": 4094 - }, - { - "count": 32742, - "lower_bound": "A4AAAAAAAAAI", - "upper_bound": "A4AAAAAAAAAI", - "repeats": 4117 - }, - { - "count": 36701, - "lower_bound": "A4AAAAAAAAAJ", - "upper_bound": "A4AAAAAAAAAJ", - "repeats": 3959 - }, - { - "count": 40832, - "lower_bound": "A4AAAAAAAAAK", - "upper_bound": "A4AAAAAAAAAK", - "repeats": 4131 - }, - { - "count": 44906, - "lower_bound": "A4AAAAAAAAAL", - "upper_bound": "A4AAAAAAAAAL", - "repeats": 4074 - }, - { - "count": 48995, - "lower_bound": "A4AAAAAAAAAM", - "upper_bound": "A4AAAAAAAAAM", - "repeats": 4089 - }, - { - "count": 53128, - "lower_bound": "A4AAAAAAAAAN", - "upper_bound": "A4AAAAAAAAAN", - "repeats": 4133 - }, - { - "count": 57232, - "lower_bound": "A4AAAAAAAAAO", - "upper_bound": "A4AAAAAAAAAO", - "repeats": 4104 - }, - { - "count": 61198, - "lower_bound": "A4AAAAAAAAAP", - "upper_bound": "A4AAAAAAAAAP", - "repeats": 3966 - }, - { - "count": 65270, - "lower_bound": "A4AAAAAAAAAQ", - "upper_bound": "A4AAAAAAAAAQ", - "repeats": 4072 - }, - { - "count": 69249, - "lower_bound": "A4AAAAAAAAAR", - "upper_bound": "A4AAAAAAAAAR", - "repeats": 3979 - }, - { - "count": 73277, - "lower_bound": "A4AAAAAAAAAS", - "upper_bound": "A4AAAAAAAAAS", - "repeats": 4028 - }, - { - "count": 77397, - "lower_bound": "A4AAAAAAAAAT", - "upper_bound": "A4AAAAAAAAAT", - "repeats": 4120 - }, - { - "count": 81386, - "lower_bound": "A4AAAAAAAAAU", - "upper_bound": "A4AAAAAAAAAU", - "repeats": 3989 - }, - { - "count": 85464, - "lower_bound": "A4AAAAAAAAAV", - "upper_bound": "A4AAAAAAAAAV", - "repeats": 4078 - }, - { - "count": 89528, - "lower_bound": "A4AAAAAAAAAW", - "upper_bound": "A4AAAAAAAAAW", - "repeats": 4064 - }, - { - "count": 93681, - "lower_bound": "A4AAAAAAAAAX", - "upper_bound": "A4AAAAAAAAAX", - "repeats": 4153 - }, - { - "count": 97816, - "lower_bound": "A4AAAAAAAAAY", - "upper_bound": "A4AAAAAAAAAY", - "repeats": 4135 - }, - { - "count": 101904, - "lower_bound": "A4AAAAAAAAAZ", - "upper_bound": "A4AAAAAAAAAZ", - "repeats": 4088 - }, - { - "count": 105782, - "lower_bound": "A4AAAAAAAAAa", - "upper_bound": "A4AAAAAAAAAa", - "repeats": 3878 - }, - { - "count": 109917, - "lower_bound": "A4AAAAAAAAAb", - "upper_bound": "A4AAAAAAAAAb", - "repeats": 4135 - }, - { - "count": 114070, - "lower_bound": "A4AAAAAAAAAc", - "upper_bound": "A4AAAAAAAAAc", - "repeats": 4153 - }, - { - "count": 118091, - "lower_bound": "A4AAAAAAAAAd", - "upper_bound": "A4AAAAAAAAAd", - "repeats": 4021 - }, - { - "count": 122097, - "lower_bound": "A4AAAAAAAAAe", - "upper_bound": "A4AAAAAAAAAe", - "repeats": 4006 - }, - { - "count": 126170, - "lower_bound": "A4AAAAAAAAAf", - "upper_bound": "A4AAAAAAAAAf", - "repeats": 4073 - }, - { - "count": 130259, - "lower_bound": "A4AAAAAAAAAg", - "upper_bound": "A4AAAAAAAAAg", - "repeats": 4089 - }, - { - "count": 134394, - "lower_bound": "A4AAAAAAAAAh", - "upper_bound": "A4AAAAAAAAAh", - "repeats": 4135 - }, - { - "count": 138530, - "lower_bound": "A4AAAAAAAAAi", - "upper_bound": "A4AAAAAAAAAi", - "repeats": 4136 - }, - { - "count": 142554, - "lower_bound": "A4AAAAAAAAAj", - "upper_bound": "A4AAAAAAAAAj", - "repeats": 4024 - }, - { - "count": 146701, - "lower_bound": "A4AAAAAAAAAk", - "upper_bound": "A4AAAAAAAAAk", - "repeats": 4147 - }, - { - "count": 150851, - "lower_bound": "A4AAAAAAAAAl", - "upper_bound": "A4AAAAAAAAAl", - "repeats": 4150 - }, - { - "count": 154968, - "lower_bound": "A4AAAAAAAAAm", - "upper_bound": "A4AAAAAAAAAm", - "repeats": 4117 - }, - { - "count": 159051, - "lower_bound": "A4AAAAAAAAAn", - "upper_bound": "A4AAAAAAAAAn", - "repeats": 4083 - }, - { - "count": 163085, - "lower_bound": "A4AAAAAAAAAo", - "upper_bound": "A4AAAAAAAAAo", - "repeats": 4034 - }, - { - "count": 167065, - "lower_bound": "A4AAAAAAAAAp", - "upper_bound": "A4AAAAAAAAAp", - "repeats": 3980 - }, - { - "count": 171065, - "lower_bound": "A4AAAAAAAAAq", - "upper_bound": "A4AAAAAAAAAq", - "repeats": 4000 - }, - { - "count": 175293, - "lower_bound": "A4AAAAAAAAAr", - "upper_bound": "A4AAAAAAAAAr", - "repeats": 4228 - }, - { - "count": 179458, - "lower_bound": "A4AAAAAAAAAs", - "upper_bound": "A4AAAAAAAAAs", - "repeats": 4165 - }, - { - "count": 183653, - "lower_bound": "A4AAAAAAAAAt", - "upper_bound": "A4AAAAAAAAAt", - "repeats": 4195 - }, - { - "count": 187718, - "lower_bound": "A4AAAAAAAAAu", - "upper_bound": "A4AAAAAAAAAu", - "repeats": 4065 - }, - { - "count": 191797, - "lower_bound": "A4AAAAAAAAAv", - "upper_bound": "A4AAAAAAAAAv", - "repeats": 4079 - }, - { - "count": 195893, - "lower_bound": "A4AAAAAAAAAw", - "upper_bound": "A4AAAAAAAAAw", - "repeats": 4096 - }, - { - "count": 199860, - "lower_bound": "A4AAAAAAAAAx", - "upper_bound": "A4AAAAAAAAAx", - "repeats": 3967 - }, - { - "count": 203972, - "lower_bound": "A4AAAAAAAAAy", - "upper_bound": "A4AAAAAAAAAy", - "repeats": 4112 - }, - { - "count": 207994, - "lower_bound": "A4AAAAAAAAAz", - "upper_bound": "A4AAAAAAAAAz", - "repeats": 4022 - }, - { - "count": 212076, - "lower_bound": "A4AAAAAAAAA0", - "upper_bound": "A4AAAAAAAAA0", - "repeats": 4082 - }, - { - "count": 216159, - "lower_bound": "A4AAAAAAAAA1", - "upper_bound": "A4AAAAAAAAA1", - "repeats": 4083 - }, - { - "count": 220196, - "lower_bound": "A4AAAAAAAAA2", - "upper_bound": "A4AAAAAAAAA2", - "repeats": 4037 - }, - { - "count": 224248, - "lower_bound": "A4AAAAAAAAA3", - "upper_bound": "A4AAAAAAAAA3", - "repeats": 4052 - }, - { - "count": 228233, - "lower_bound": "A4AAAAAAAAA4", - "upper_bound": "A4AAAAAAAAA4", - "repeats": 3985 - }, - { - "count": 232341, - "lower_bound": "A4AAAAAAAAA5", - "upper_bound": "A4AAAAAAAAA5", - "repeats": 4108 - }, - { - "count": 236340, - "lower_bound": "A4AAAAAAAAA6", - "upper_bound": "A4AAAAAAAAA6", - "repeats": 3999 - }, - { - "count": 240507, - "lower_bound": "A4AAAAAAAAA7", - "upper_bound": "A4AAAAAAAAA7", - "repeats": 4167 - }, - { - "count": 244569, - "lower_bound": "A4AAAAAAAAA8", - "upper_bound": "A4AAAAAAAAA8", - "repeats": 4062 - }, - { - "count": 248572, - "lower_bound": "A4AAAAAAAAA9", - "upper_bound": "A4AAAAAAAAA9", - "repeats": 4003 - }, - { - "count": 252635, - "lower_bound": "A4AAAAAAAAA+", - "upper_bound": "A4AAAAAAAAA+", - "repeats": 4063 - }, - { - "count": 256726, - "lower_bound": "A4AAAAAAAAA/", - "upper_bound": "A4AAAAAAAAA/", - "repeats": 4091 - }, - { - "count": 260790, - "lower_bound": "A4AAAAAAAABA", - "upper_bound": "A4AAAAAAAABA", - "repeats": 4064 - }, - { - "count": 264895, - "lower_bound": "A4AAAAAAAABB", - "upper_bound": "A4AAAAAAAABB", - "repeats": 4105 - }, - { - "count": 269009, - "lower_bound": "A4AAAAAAAABC", - "upper_bound": "A4AAAAAAAABC", - "repeats": 4114 - }, - { - "count": 273080, - "lower_bound": "A4AAAAAAAABD", - "upper_bound": "A4AAAAAAAABD", - "repeats": 4071 - }, - { - "count": 277135, - "lower_bound": "A4AAAAAAAABE", - "upper_bound": "A4AAAAAAAABE", - "repeats": 4055 - }, - { - "count": 281170, - "lower_bound": "A4AAAAAAAABF", - "upper_bound": "A4AAAAAAAABF", - "repeats": 4035 - }, - { - "count": 285285, - "lower_bound": "A4AAAAAAAABG", - "upper_bound": "A4AAAAAAAABG", - "repeats": 4115 - }, - { - "count": 289302, - "lower_bound": "A4AAAAAAAABH", - "upper_bound": "A4AAAAAAAABH", - "repeats": 4017 - }, - { - "count": 293432, - "lower_bound": "A4AAAAAAAABI", - "upper_bound": "A4AAAAAAAABI", - "repeats": 4130 - }, - { - "count": 297503, - "lower_bound": "A4AAAAAAAABJ", - "upper_bound": "A4AAAAAAAABJ", - "repeats": 4071 - }, - { - "count": 301614, - "lower_bound": "A4AAAAAAAABK", - "upper_bound": "A4AAAAAAAABK", - "repeats": 4111 - }, - { - "count": 305700, - "lower_bound": "A4AAAAAAAABL", - "upper_bound": "A4AAAAAAAABL", - "repeats": 4086 - }, - { - "count": 309856, - "lower_bound": "A4AAAAAAAABM", - "upper_bound": "A4AAAAAAAABM", - "repeats": 4156 - }, - { - "count": 314031, - "lower_bound": "A4AAAAAAAABN", - "upper_bound": "A4AAAAAAAABN", - "repeats": 4175 - }, - { - "count": 318218, - "lower_bound": "A4AAAAAAAABO", - "upper_bound": "A4AAAAAAAABO", - "repeats": 4187 - }, - { - "count": 322322, - "lower_bound": "A4AAAAAAAABP", - "upper_bound": "A4AAAAAAAABP", - "repeats": 4104 - }, - { - "count": 326257, - "lower_bound": "A4AAAAAAAABQ", - "upper_bound": "A4AAAAAAAABQ", - "repeats": 3935 - }, - { - "count": 330373, - "lower_bound": "A4AAAAAAAABR", - "upper_bound": "A4AAAAAAAABR", - "repeats": 4116 - }, - { - "count": 334429, - "lower_bound": "A4AAAAAAAABS", - "upper_bound": "A4AAAAAAAABS", - "repeats": 4056 - }, - { - "count": 338372, - "lower_bound": "A4AAAAAAAABT", - "upper_bound": "A4AAAAAAAABT", - "repeats": 3943 - }, - { - "count": 342423, - "lower_bound": "A4AAAAAAAABU", - "upper_bound": "A4AAAAAAAABU", - "repeats": 4051 - }, - { - "count": 346559, - "lower_bound": "A4AAAAAAAABV", - "upper_bound": "A4AAAAAAAABV", - "repeats": 4136 - }, - { - "count": 350661, - "lower_bound": "A4AAAAAAAABW", - "upper_bound": "A4AAAAAAAABW", - "repeats": 4102 - }, - { - "count": 354869, - "lower_bound": "A4AAAAAAAABX", - "upper_bound": "A4AAAAAAAABX", - "repeats": 4208 - }, - { - "count": 359023, - "lower_bound": "A4AAAAAAAABY", - "upper_bound": "A4AAAAAAAABY", - "repeats": 4154 - }, - { - "count": 363137, - "lower_bound": "A4AAAAAAAABZ", - "upper_bound": "A4AAAAAAAABZ", - "repeats": 4114 - }, - { - "count": 367187, - "lower_bound": "A4AAAAAAAABa", - "upper_bound": "A4AAAAAAAABa", - "repeats": 4050 - }, - { - "count": 371190, - "lower_bound": "A4AAAAAAAABb", - "upper_bound": "A4AAAAAAAABb", - "repeats": 4003 - }, - { - "count": 375303, - "lower_bound": "A4AAAAAAAABc", - "upper_bound": "A4AAAAAAAABc", - "repeats": 4113 - }, - { - "count": 379485, - "lower_bound": "A4AAAAAAAABd", - "upper_bound": "A4AAAAAAAABd", - "repeats": 4182 - }, - { - "count": 383556, - "lower_bound": "A4AAAAAAAABe", - "upper_bound": "A4AAAAAAAABe", - "repeats": 4071 - }, - { - "count": 387766, - "lower_bound": "A4AAAAAAAABf", - "upper_bound": "A4AAAAAAAABf", - "repeats": 4210 - }, - { - "count": 391932, - "lower_bound": "A4AAAAAAAABg", - "upper_bound": "A4AAAAAAAABg", - "repeats": 4166 - }, - { - "count": 395970, - "lower_bound": "A4AAAAAAAABh", - "upper_bound": "A4AAAAAAAABh", - "repeats": 4038 - }, - { - "count": 400064, - "lower_bound": "A4AAAAAAAABi", - "upper_bound": "A4AAAAAAAABi", - "repeats": 4094 - }, - { - "count": 404145, - "lower_bound": "A4AAAAAAAABj", - "upper_bound": "A4AAAAAAAABj", - "repeats": 4081 - }, - { - "count": 408174, - "lower_bound": "A4AAAAAAAABk", - "upper_bound": "A4AAAAAAAABk", - "repeats": 4029 - }, - { - "count": 412238, - "lower_bound": "A4AAAAAAAABl", - "upper_bound": "A4AAAAAAAABl", - "repeats": 4064 - }, - { - "count": 416405, - "lower_bound": "A4AAAAAAAABm", - "upper_bound": "A4AAAAAAAABm", - "repeats": 4167 - }, - { - "count": 420517, - "lower_bound": "A4AAAAAAAABn", - "upper_bound": "A4AAAAAAAABn", - "repeats": 4112 - }, - { - "count": 424553, - "lower_bound": "A4AAAAAAAABo", - "upper_bound": "A4AAAAAAAABo", - "repeats": 4036 - }, - { - "count": 428572, - "lower_bound": "A4AAAAAAAABp", - "upper_bound": "A4AAAAAAAABp", - "repeats": 4019 - }, - { - "count": 432600, - "lower_bound": "A4AAAAAAAABq", - "upper_bound": "A4AAAAAAAABq", - "repeats": 4028 - }, - { - "count": 436646, - "lower_bound": "A4AAAAAAAABr", - "upper_bound": "A4AAAAAAAABr", - "repeats": 4046 - }, - { - "count": 440811, - "lower_bound": "A4AAAAAAAABs", - "upper_bound": "A4AAAAAAAABs", - "repeats": 4165 - }, - { - "count": 444971, - "lower_bound": "A4AAAAAAAABt", - "upper_bound": "A4AAAAAAAABt", - "repeats": 4160 - }, - { - "count": 448989, - "lower_bound": "A4AAAAAAAABu", - "upper_bound": "A4AAAAAAAABu", - "repeats": 4018 - }, - { - "count": 453058, - "lower_bound": "A4AAAAAAAABv", - "upper_bound": "A4AAAAAAAABv", - "repeats": 4069 - }, - { - "count": 457274, - "lower_bound": "A4AAAAAAAABw", - "upper_bound": "A4AAAAAAAABw", - "repeats": 4216 - }, - { - "count": 461326, - "lower_bound": "A4AAAAAAAABx", - "upper_bound": "A4AAAAAAAABx", - "repeats": 4052 - }, - { - "count": 465378, - "lower_bound": "A4AAAAAAAABy", - "upper_bound": "A4AAAAAAAABy", - "repeats": 4052 - }, - { - "count": 469422, - "lower_bound": "A4AAAAAAAABz", - "upper_bound": "A4AAAAAAAABz", - "repeats": 4044 - }, - { - "count": 473486, - "lower_bound": "A4AAAAAAAAB0", - "upper_bound": "A4AAAAAAAAB0", - "repeats": 4064 - }, - { - "count": 477681, - "lower_bound": "A4AAAAAAAAB1", - "upper_bound": "A4AAAAAAAAB1", - "repeats": 4195 - }, - { - "count": 481715, - "lower_bound": "A4AAAAAAAAB2", - "upper_bound": "A4AAAAAAAAB2", - "repeats": 4034 - }, - { - "count": 485789, - "lower_bound": "A4AAAAAAAAB3", - "upper_bound": "A4AAAAAAAAB3", - "repeats": 4074 - }, - { - "count": 489823, - "lower_bound": "A4AAAAAAAAB4", - "upper_bound": "A4AAAAAAAAB4", - "repeats": 4034 - }, - { - "count": 493881, - "lower_bound": "A4AAAAAAAAB5", - "upper_bound": "A4AAAAAAAAB5", - "repeats": 4058 - }, - { - "count": 497896, - "lower_bound": "A4AAAAAAAAB6", - "upper_bound": "A4AAAAAAAAB6", - "repeats": 4015 - }, - { - "count": 501933, - "lower_bound": "A4AAAAAAAAB7", - "upper_bound": "A4AAAAAAAAB7", - "repeats": 4037 - }, - { - "count": 506060, - "lower_bound": "A4AAAAAAAAB8", - "upper_bound": "A4AAAAAAAAB8", - "repeats": 4127 - }, - { - "count": 510027, - "lower_bound": "A4AAAAAAAAB9", - "upper_bound": "A4AAAAAAAAB9", - "repeats": 3967 - }, - { - "count": 514136, - "lower_bound": "A4AAAAAAAAB+", - "upper_bound": "A4AAAAAAAAB+", - "repeats": 4109 - }, - { - "count": 518323, - "lower_bound": "A4AAAAAAAAB/", - "upper_bound": "A4AAAAAAAAB/", - "repeats": 4187 - }, - { - "count": 522397, - "lower_bound": "A4AAAAAAAACA", - "upper_bound": "A4AAAAAAAACA", - "repeats": 4074 - }, - { - "count": 526463, - "lower_bound": "A4AAAAAAAACB", - "upper_bound": "A4AAAAAAAACB", - "repeats": 4066 - }, - { - "count": 530483, - "lower_bound": "A4AAAAAAAACC", - "upper_bound": "A4AAAAAAAACC", - "repeats": 4020 - }, - { - "count": 534470, - "lower_bound": "A4AAAAAAAACD", - "upper_bound": "A4AAAAAAAACD", - "repeats": 3987 - }, - { - "count": 538526, - "lower_bound": "A4AAAAAAAACE", - "upper_bound": "A4AAAAAAAACE", - "repeats": 4056 - }, - { - "count": 542624, - "lower_bound": "A4AAAAAAAACF", - "upper_bound": "A4AAAAAAAACF", - "repeats": 4098 - }, - { - "count": 546722, - "lower_bound": "A4AAAAAAAACG", - "upper_bound": "A4AAAAAAAACG", - "repeats": 4098 - }, - { - "count": 550900, - "lower_bound": "A4AAAAAAAACH", - "upper_bound": "A4AAAAAAAACH", - "repeats": 4178 - }, - { - "count": 555052, - "lower_bound": "A4AAAAAAAACI", - "upper_bound": "A4AAAAAAAACI", - "repeats": 4152 - }, - { - "count": 559029, - "lower_bound": "A4AAAAAAAACJ", - "upper_bound": "A4AAAAAAAACJ", - "repeats": 3977 - }, - { - "count": 563078, - "lower_bound": "A4AAAAAAAACK", - "upper_bound": "A4AAAAAAAACK", - "repeats": 4049 - }, - { - "count": 567249, - "lower_bound": "A4AAAAAAAACL", - "upper_bound": "A4AAAAAAAACL", - "repeats": 4171 - }, - { - "count": 571429, - "lower_bound": "A4AAAAAAAACM", - "upper_bound": "A4AAAAAAAACM", - "repeats": 4180 - }, - { - "count": 575484, - "lower_bound": "A4AAAAAAAACN", - "upper_bound": "A4AAAAAAAACN", - "repeats": 4055 - }, - { - "count": 579646, - "lower_bound": "A4AAAAAAAACO", - "upper_bound": "A4AAAAAAAACO", - "repeats": 4162 - }, - { - "count": 583760, - "lower_bound": "A4AAAAAAAACP", - "upper_bound": "A4AAAAAAAACP", - "repeats": 4114 - }, - { - "count": 587857, - "lower_bound": "A4AAAAAAAACQ", - "upper_bound": "A4AAAAAAAACQ", - "repeats": 4097 - }, - { - "count": 591966, - "lower_bound": "A4AAAAAAAACR", - "upper_bound": "A4AAAAAAAACR", - "repeats": 4109 - }, - { - "count": 596033, - "lower_bound": "A4AAAAAAAACS", - "upper_bound": "A4AAAAAAAACS", - "repeats": 4067 - }, - { - "count": 600199, - "lower_bound": "A4AAAAAAAACT", - "upper_bound": "A4AAAAAAAACT", - "repeats": 4166 - }, - { - "count": 604317, - "lower_bound": "A4AAAAAAAACU", - "upper_bound": "A4AAAAAAAACU", - "repeats": 4118 - }, - { - "count": 608464, - "lower_bound": "A4AAAAAAAACV", - "upper_bound": "A4AAAAAAAACV", - "repeats": 4147 - }, - { - "count": 612609, - "lower_bound": "A4AAAAAAAACW", - "upper_bound": "A4AAAAAAAACW", - "repeats": 4145 - }, - { - "count": 616713, - "lower_bound": "A4AAAAAAAACX", - "upper_bound": "A4AAAAAAAACX", - "repeats": 4104 - }, - { - "count": 620655, - "lower_bound": "A4AAAAAAAACY", - "upper_bound": "A4AAAAAAAACY", - "repeats": 3942 - }, - { - "count": 624710, - "lower_bound": "A4AAAAAAAACZ", - "upper_bound": "A4AAAAAAAACZ", - "repeats": 4055 - }, - { - "count": 628749, - "lower_bound": "A4AAAAAAAACa", - "upper_bound": "A4AAAAAAAACa", - "repeats": 4039 - }, - { - "count": 632800, - "lower_bound": "A4AAAAAAAACb", - "upper_bound": "A4AAAAAAAACb", - "repeats": 4051 - }, - { - "count": 636885, - "lower_bound": "A4AAAAAAAACc", - "upper_bound": "A4AAAAAAAACc", - "repeats": 4085 - }, - { - "count": 641068, - "lower_bound": "A4AAAAAAAACd", - "upper_bound": "A4AAAAAAAACd", - "repeats": 4183 - }, - { - "count": 645173, - "lower_bound": "A4AAAAAAAACe", - "upper_bound": "A4AAAAAAAACe", - "repeats": 4105 - }, - { - "count": 649230, - "lower_bound": "A4AAAAAAAACf", - "upper_bound": "A4AAAAAAAACf", - "repeats": 4057 - }, - { - "count": 653256, - "lower_bound": "A4AAAAAAAACg", - "upper_bound": "A4AAAAAAAACg", - "repeats": 4026 - }, - { - "count": 657195, - "lower_bound": "A4AAAAAAAACh", - "upper_bound": "A4AAAAAAAACh", - "repeats": 3939 - }, - { - "count": 661290, - "lower_bound": "A4AAAAAAAACi", - "upper_bound": "A4AAAAAAAACi", - "repeats": 4095 - }, - { - "count": 665384, - "lower_bound": "A4AAAAAAAACj", - "upper_bound": "A4AAAAAAAACj", - "repeats": 4094 - }, - { - "count": 669582, - "lower_bound": "A4AAAAAAAACk", - "upper_bound": "A4AAAAAAAACk", - "repeats": 4198 - }, - { - "count": 673593, - "lower_bound": "A4AAAAAAAACl", - "upper_bound": "A4AAAAAAAACl", - "repeats": 4011 - }, - { - "count": 677575, - "lower_bound": "A4AAAAAAAACm", - "upper_bound": "A4AAAAAAAACm", - "repeats": 3982 - }, - { - "count": 681715, - "lower_bound": "A4AAAAAAAACn", - "upper_bound": "A4AAAAAAAACn", - "repeats": 4140 - }, - { - "count": 685788, - "lower_bound": "A4AAAAAAAACo", - "upper_bound": "A4AAAAAAAACo", - "repeats": 4073 - }, - { - "count": 689893, - "lower_bound": "A4AAAAAAAACp", - "upper_bound": "A4AAAAAAAACp", - "repeats": 4105 - }, - { - "count": 693973, - "lower_bound": "A4AAAAAAAACq", - "upper_bound": "A4AAAAAAAACq", - "repeats": 4080 - }, - { - "count": 698012, - "lower_bound": "A4AAAAAAAACr", - "upper_bound": "A4AAAAAAAACr", - "repeats": 4039 - }, - { - "count": 702046, - "lower_bound": "A4AAAAAAAACs", - "upper_bound": "A4AAAAAAAACs", - "repeats": 4034 - }, - { - "count": 706243, - "lower_bound": "A4AAAAAAAACt", - "upper_bound": "A4AAAAAAAACt", - "repeats": 4197 - }, - { - "count": 710309, - "lower_bound": "A4AAAAAAAACu", - "upper_bound": "A4AAAAAAAACu", - "repeats": 4066 - }, - { - "count": 714426, - "lower_bound": "A4AAAAAAAACv", - "upper_bound": "A4AAAAAAAACv", - "repeats": 4117 - }, - { - "count": 718591, - "lower_bound": "A4AAAAAAAACw", - "upper_bound": "A4AAAAAAAACw", - "repeats": 4165 - }, - { - "count": 722587, - "lower_bound": "A4AAAAAAAACx", - "upper_bound": "A4AAAAAAAACx", - "repeats": 3996 - }, - { - "count": 726646, - "lower_bound": "A4AAAAAAAACy", - "upper_bound": "A4AAAAAAAACy", - "repeats": 4059 - }, - { - "count": 730752, - "lower_bound": "A4AAAAAAAACz", - "upper_bound": "A4AAAAAAAACz", - "repeats": 4106 - }, - { - "count": 734758, - "lower_bound": "A4AAAAAAAAC0", - "upper_bound": "A4AAAAAAAAC0", - "repeats": 4006 - }, - { - "count": 738880, - "lower_bound": "A4AAAAAAAAC1", - "upper_bound": "A4AAAAAAAAC1", - "repeats": 4122 - }, - { - "count": 743001, - "lower_bound": "A4AAAAAAAAC2", - "upper_bound": "A4AAAAAAAAC2", - "repeats": 4121 - }, - { - "count": 747087, - "lower_bound": "A4AAAAAAAAC3", - "upper_bound": "A4AAAAAAAAC3", - "repeats": 4086 - }, - { - "count": 751156, - "lower_bound": "A4AAAAAAAAC4", - "upper_bound": "A4AAAAAAAAC4", - "repeats": 4069 - }, - { - "count": 755252, - "lower_bound": "A4AAAAAAAAC5", - "upper_bound": "A4AAAAAAAAC5", - "repeats": 4096 - }, - { - "count": 759243, - "lower_bound": "A4AAAAAAAAC6", - "upper_bound": "A4AAAAAAAAC6", - "repeats": 3991 - }, - { - "count": 763324, - "lower_bound": "A4AAAAAAAAC7", - "upper_bound": "A4AAAAAAAAC7", - "repeats": 4081 - }, - { - "count": 767396, - "lower_bound": "A4AAAAAAAAC8", - "upper_bound": "A4AAAAAAAAC8", - "repeats": 4072 - }, - { - "count": 771507, - "lower_bound": "A4AAAAAAAAC9", - "upper_bound": "A4AAAAAAAAC9", - "repeats": 4111 - }, - { - "count": 775609, - "lower_bound": "A4AAAAAAAAC+", - "upper_bound": "A4AAAAAAAAC+", - "repeats": 4102 - }, - { - "count": 779592, - "lower_bound": "A4AAAAAAAAC/", - "upper_bound": "A4AAAAAAAAC/", - "repeats": 3983 - }, - { - "count": 783714, - "lower_bound": "A4AAAAAAAADA", - "upper_bound": "A4AAAAAAAADA", - "repeats": 4122 - }, - { - "count": 787765, - "lower_bound": "A4AAAAAAAADB", - "upper_bound": "A4AAAAAAAADB", - "repeats": 4051 - }, - { - "count": 791877, - "lower_bound": "A4AAAAAAAADC", - "upper_bound": "A4AAAAAAAADC", - "repeats": 4112 - }, - { - "count": 796071, - "lower_bound": "A4AAAAAAAADD", - "upper_bound": "A4AAAAAAAADD", - "repeats": 4194 - }, - { - "count": 800076, - "lower_bound": "A4AAAAAAAADE", - "upper_bound": "A4AAAAAAAADE", - "repeats": 4005 - }, - { - "count": 803994, - "lower_bound": "A4AAAAAAAADF", - "upper_bound": "A4AAAAAAAADF", - "repeats": 3918 - }, - { - "count": 808173, - "lower_bound": "A4AAAAAAAADG", - "upper_bound": "A4AAAAAAAADG", - "repeats": 4179 - }, - { - "count": 812284, - "lower_bound": "A4AAAAAAAADH", - "upper_bound": "A4AAAAAAAADH", - "repeats": 4111 - }, - { - "count": 816429, - "lower_bound": "A4AAAAAAAADI", - "upper_bound": "A4AAAAAAAADI", - "repeats": 4145 - }, - { - "count": 820535, - "lower_bound": "A4AAAAAAAADJ", - "upper_bound": "A4AAAAAAAADJ", - "repeats": 4106 - }, - { - "count": 824572, - "lower_bound": "A4AAAAAAAADK", - "upper_bound": "A4AAAAAAAADK", - "repeats": 4037 - }, - { - "count": 828718, - "lower_bound": "A4AAAAAAAADL", - "upper_bound": "A4AAAAAAAADL", - "repeats": 4146 - }, - { - "count": 832756, - "lower_bound": "A4AAAAAAAADM", - "upper_bound": "A4AAAAAAAADM", - "repeats": 4038 - }, - { - "count": 836837, - "lower_bound": "A4AAAAAAAADN", - "upper_bound": "A4AAAAAAAADN", - "repeats": 4081 - }, - { - "count": 840979, - "lower_bound": "A4AAAAAAAADO", - "upper_bound": "A4AAAAAAAADO", - "repeats": 4142 - }, - { - "count": 845038, - "lower_bound": "A4AAAAAAAADP", - "upper_bound": "A4AAAAAAAADP", - "repeats": 4059 - }, - { - "count": 849244, - "lower_bound": "A4AAAAAAAADQ", - "upper_bound": "A4AAAAAAAADQ", - "repeats": 4206 - }, - { - "count": 853352, - "lower_bound": "A4AAAAAAAADR", - "upper_bound": "A4AAAAAAAADR", - "repeats": 4108 - }, - { - "count": 857483, - "lower_bound": "A4AAAAAAAADS", - "upper_bound": "A4AAAAAAAADS", - "repeats": 4131 - }, - { - "count": 861538, - "lower_bound": "A4AAAAAAAADT", - "upper_bound": "A4AAAAAAAADT", - "repeats": 4055 - }, - { - "count": 865559, - "lower_bound": "A4AAAAAAAADU", - "upper_bound": "A4AAAAAAAADU", - "repeats": 4021 - }, - { - "count": 869637, - "lower_bound": "A4AAAAAAAADV", - "upper_bound": "A4AAAAAAAADV", - "repeats": 4078 - }, - { - "count": 873664, - "lower_bound": "A4AAAAAAAADW", - "upper_bound": "A4AAAAAAAADW", - "repeats": 4027 - }, - { - "count": 877718, - "lower_bound": "A4AAAAAAAADX", - "upper_bound": "A4AAAAAAAADX", - "repeats": 4054 - }, - { - "count": 881830, - "lower_bound": "A4AAAAAAAADY", - "upper_bound": "A4AAAAAAAADY", - "repeats": 4112 - }, - { - "count": 885838, - "lower_bound": "A4AAAAAAAADZ", - "upper_bound": "A4AAAAAAAADZ", - "repeats": 4008 - }, - { - "count": 889790, - "lower_bound": "A4AAAAAAAADa", - "upper_bound": "A4AAAAAAAADa", - "repeats": 3952 - }, - { - "count": 893880, - "lower_bound": "A4AAAAAAAADb", - "upper_bound": "A4AAAAAAAADb", - "repeats": 4090 - }, - { - "count": 897883, - "lower_bound": "A4AAAAAAAADc", - "upper_bound": "A4AAAAAAAADc", - "repeats": 4003 - }, - { - "count": 901879, - "lower_bound": "A4AAAAAAAADd", - "upper_bound": "A4AAAAAAAADd", - "repeats": 3996 - }, - { - "count": 906034, - "lower_bound": "A4AAAAAAAADe", - "upper_bound": "A4AAAAAAAADe", - "repeats": 4155 - }, - { - "count": 910064, - "lower_bound": "A4AAAAAAAADf", - "upper_bound": "A4AAAAAAAADf", - "repeats": 4030 - }, - { - "count": 914109, - "lower_bound": "A4AAAAAAAADg", - "upper_bound": "A4AAAAAAAADg", - "repeats": 4045 - }, - { - "count": 918156, - "lower_bound": "A4AAAAAAAADh", - "upper_bound": "A4AAAAAAAADh", - "repeats": 4047 - }, - { - "count": 922160, - "lower_bound": "A4AAAAAAAADi", - "upper_bound": "A4AAAAAAAADi", - "repeats": 4004 - }, - { - "count": 926233, - "lower_bound": "A4AAAAAAAADj", - "upper_bound": "A4AAAAAAAADj", - "repeats": 4073 - }, - { - "count": 930413, - "lower_bound": "A4AAAAAAAADk", - "upper_bound": "A4AAAAAAAADk", - "repeats": 4180 - }, - { - "count": 934546, - "lower_bound": "A4AAAAAAAADl", - "upper_bound": "A4AAAAAAAADl", - "repeats": 4133 - }, - { - "count": 938656, - "lower_bound": "A4AAAAAAAADm", - "upper_bound": "A4AAAAAAAADm", - "repeats": 4110 - }, - { - "count": 942754, - "lower_bound": "A4AAAAAAAADn", - "upper_bound": "A4AAAAAAAADn", - "repeats": 4098 - }, - { - "count": 946651, - "lower_bound": "A4AAAAAAAADo", - "upper_bound": "A4AAAAAAAADo", - "repeats": 3897 - }, - { - "count": 950626, - "lower_bound": "A4AAAAAAAADp", - "upper_bound": "A4AAAAAAAADp", - "repeats": 3975 - }, - { - "count": 954614, - "lower_bound": "A4AAAAAAAADq", - "upper_bound": "A4AAAAAAAADq", - "repeats": 3988 - }, - { - "count": 958746, - "lower_bound": "A4AAAAAAAADr", - "upper_bound": "A4AAAAAAAADr", - "repeats": 4132 - }, - { - "count": 962762, - "lower_bound": "A4AAAAAAAADs", - "upper_bound": "A4AAAAAAAADs", - "repeats": 4016 - }, - { - "count": 966854, - "lower_bound": "A4AAAAAAAADt", - "upper_bound": "A4AAAAAAAADt", - "repeats": 4092 - }, - { - "count": 970891, - "lower_bound": "A4AAAAAAAADu", - "upper_bound": "A4AAAAAAAADu", - "repeats": 4037 - }, - { - "count": 974975, - "lower_bound": "A4AAAAAAAADv", - "upper_bound": "A4AAAAAAAADv", - "repeats": 4084 - }, - { - "count": 979069, - "lower_bound": "A4AAAAAAAADw", - "upper_bound": "A4AAAAAAAADw", - "repeats": 4094 - }, - { - "count": 983121, - "lower_bound": "A4AAAAAAAADx", - "upper_bound": "A4AAAAAAAADx", - "repeats": 4052 - }, - { - "count": 987342, - "lower_bound": "A4AAAAAAAADy", - "upper_bound": "A4AAAAAAAADy", - "repeats": 4221 - }, - { - "count": 991422, - "lower_bound": "A4AAAAAAAADz", - "upper_bound": "A4AAAAAAAADz", - "repeats": 4080 - }, - { - "count": 995473, - "lower_bound": "A4AAAAAAAAD0", - "upper_bound": "A4AAAAAAAAD0", - "repeats": 4051 - }, - { - "count": 999481, - "lower_bound": "A4AAAAAAAAD1", - "upper_bound": "A4AAAAAAAAD1", - "repeats": 4008 - }, - { - "count": 1003540, - "lower_bound": "A4AAAAAAAAD2", - "upper_bound": "A4AAAAAAAAD2", - "repeats": 4059 - }, - { - "count": 1007616, - "lower_bound": "A4AAAAAAAAD3", - "upper_bound": "A4AAAAAAAAD3", - "repeats": 4076 - }, - { - "count": 1011805, - "lower_bound": "A4AAAAAAAAD4", - "upper_bound": "A4AAAAAAAAD4", - "repeats": 4189 - }, - { - "count": 1015917, - "lower_bound": "A4AAAAAAAAD5", - "upper_bound": "A4AAAAAAAAD5", - "repeats": 4112 - }, - { - "count": 1020000, - "lower_bound": "A4AAAAAAAAD6", - "upper_bound": "A4AAAAAAAAD6", - "repeats": 4083 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 0, - 0, - 0, - 0, - 4122, - 8049, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8073, - 0, - 0, - 0, - 4085, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8079, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 470, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4097, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 4127, - 0, - 0, - 0, - 3897, - 0, - 4106, - 0, - 0, - 0, - 4166, - 0, - 0, - 4146, - 0, - 0, - 0, - 0, - 0, - 4074, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4036, - 0, - 0, - 0, - 4006, - 8094, - 3985, - 0, - 0, - 0, - 4142, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 0, - 0, - 4120, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 3996, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 4090, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4116, - 0, - 0, - 0, - 8118, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 483, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 8112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 4027, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 481, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 4003, - 3952, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 488, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 4055, - 0, - 0, - 0, - 4115, - 4015, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 487, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4019, - 0, - 0, - 0, - 0, - 0, - 4044, - 0, - 0, - 0, - 0, - 3935, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 479, - 0, - 0, - 4096, - 0, - 0, - 0, - 0, - 3939, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 474, - 0, - 0, - 4114, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 4047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 3983, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 4145, - 0, - 0, - 4129, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 472, - 4076, - 0, - 0, - 0, - 0, - 0, - 4162, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 465, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4022, - 0, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4155, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 494, - 0, - 8054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3966, - 3979, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4152, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 4058, - 0, - 8216, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 4063, - 0, - 0, - 0, - 0, - 485, - 0, - 8175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4054, - 0, - 0, - 4165, - 4095, - 0, - 0, - 0, - 4094, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3982, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4160, - 0, - 4045, - 0, - 0, - 4147, - 0, - 4018, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8142, - 0, - 0, - 0, - 4082, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 8197, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 4083, - 0, - 4131, - 0, - 0, - 0, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 4118, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 4113, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 0, - 0, - 4050, - 0, - 0, - 4065, - 0, - 3943, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4079, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 3918, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 4038, - 0, - 0, - 0, - 3988, - 0, - 0, - 4091, - 0, - 4171, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4121, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 0, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 12194, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4132, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8145, - 0, - 0, - 4136, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8696, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4030, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 463, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 4034, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 3878, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 3967, - 0, - 4106, - 8116, - 0, - 0, - 0, - 4111, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 4055, - 0, - 4024, - 0, - 4020, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3980, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 476, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 8289, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 4057, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 4066, - 0, - 8174, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 467, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 4079, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 3988, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4110, - 0, - 0, - 4039, - 0, - 4034, - 0, - 3878, - 0, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 4051, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 4108, - 0, - 463, - 3939, - 0, - 0, - 0, - 0, - 4000, - 0, - 0, - 0, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4049, - 0, - 4072, - 4066, - 0, - 0, - 0, - 0, - 0, - 8283, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4155, - 0, - 4045, - 4140, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 4142, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 3996, - 0, - 0, - 4472, - 0, - 0, - 4065, - 0, - 3996, - 0, - 0, - 0, - 0, - 8094, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 8116, - 0, - 0, - 0, - 0, - 4156, - 0, - 4106, - 0, - 4034, - 0, - 0, - 8142, - 0, - 0, - 4090, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 3943, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 4118, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3952, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 8333, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4082, - 4021, - 0, - 0, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4116, - 4122, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4127, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 485, - 0, - 0, - 4020, - 4106, - 0, - 0, - 0, - 4131, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8153, - 0, - 0, - 0, - 0, - 0, - 0, - 3979, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 4131, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8172, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4095, - 0, - 8115, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 3897, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4067, - 0, - 4047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 4076, - 0, - 0, - 0, - 4115, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 3987, - 0, - 0, - 4165, - 8191, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4058, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 0, - 4111, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 4063, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 0, - 0, - 8054, - 4160, - 0, - 487, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4097, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 4036, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4030, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8232, - 3982, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 470, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 4146, - 0, - 476, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 4055, - 0, - 4008, - 0, - 0, - 0, - 479, - 0, - 0, - 0, - 0, - 0, - 0, - 4120, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 465, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 4094, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4132, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 472, - 4056, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 4027, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 0, - 4022, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3918, - 4085, - 0, - 0, - 0, - 0, - 3942, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3966, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 4019, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4121, - 0, - 4135, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8040, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 0, - 0, - 3935, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 4071, - 0, - 0, - 0, - 0, - 4153, - 0, - 488, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 3967, - 0, - 3975, - 0, - 0, - 4052, - 4073, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 474, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 481, - 4162, - 0, - 3967, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3999, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 4171, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 4015, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4005, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4421, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 4071, - 0, - 0, - 0, - 472, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4022, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4082, - 0, - 0, - 0, - 0, - 0, - 4011, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4024, - 4089, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 469, - 0, - 0, - 0, - 3966, - 0, - 4098, - 0, - 4018, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4021, - 4036, - 4097, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4000, - 0, - 4114, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 4017, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8293, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4113, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4603, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4146, - 4098, - 0, - 0, - 0, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4538, - 0, - 0, - 0, - 4131, - 0, - 4074, - 0, - 0, - 4136, - 0, - 0, - 0, - 4073, - 0, - 0, - 4004, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8200, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 4102, - 4021, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 4131, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4049, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 485, - 0, - 0, - 0, - 0, - 0, - 4356, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 8023, - 0, - 4051, - 0, - 476, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 8142, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 483, - 0, - 4056, - 0, - 0, - 0, - 0, - 4051, - 4095, - 0, - 0, - 0, - 8083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 0, - 3988, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4142, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4019, - 0, - 4079, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 4110, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4030, - 0, - 0, - 0, - 0, - 3952, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4513, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 4090, - 0, - 0, - 0, - 0, - 0, - 3935, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 8276, - 4112, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 4106, - 4150, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 474, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 4109, - 0, - 4037, - 4085, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 488, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 3980, - 4058, - 0, - 0, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4092, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 0, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4160, - 0, - 4094, - 0, - 4104, - 0, - 0, - 0, - 4063, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4116, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 4132, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 4165, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4127, - 0, - 4111, - 0, - 0, - 481, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3982, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8103, - 0, - 4016, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4015, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 4122, - 0, - 0, - 0, - 4152, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4115, - 0, - 0, - 8115, - 0, - 0, - 0, - 4065, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3918, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3977, - 0, - 0, - 0, - 0, - 0, - 490, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8036, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 4045, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 4393, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4005, - 0, - 0, - 0, - 0, - 4121, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 465, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3943, - 4029, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4059, - 0, - 8220, - 0, - 0, - 0, - 4020, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 4096, - 3967, - 0, - 0, - 0, - 4155, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 4112, - 487, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4118, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3939, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0 - ] - }, - { - "counters": [ - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 476, - 0, - 0, - 4108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 3935, - 0, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 4054, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 4131, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4115, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 4131, - 4147, - 0, - 0, - 0, - 0, - 474, - 0, - 469, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 465, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 490, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 4000, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 485, - 0, - 0, - 0, - 488, - 0, - 0, - 461, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4030, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 4102, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4095, - 0, - 0, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4085, - 0, - 0, - 7876, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3942, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 4011, - 0, - 0, - 0, - 0, - 0, - 4086, - 4052, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8130, - 0, - 0, - 0, - 0, - 0, - 3959, - 4003, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 487, - 0, - 0, - 3977, - 0, - 0, - 0, - 8081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 8300, - 0, - 4052, - 0, - 0, - 4065, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 472, - 0, - 0, - 0, - 3966, - 4165, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4049, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 479, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4171, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4020, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 481, - 0, - 0, - 4109, - 0, - 0, - 3996, - 0, - 0, - 0, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 0, - 8119, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 483, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 467, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4045, - 0, - 0, - 0, - 4094, - 4112, - 0, - 0, - 0, - 4015, - 0, - 0, - 0, - 0, - 3943, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 478, - 0, - 0, - 0, - 4051, - 0, - 3878, - 0, - 0, - 0, - 4088, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 3967, - 4051, - 4142, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 4058, - 0, - 0, - 0, - 0, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4132, - 0, - 0, - 4130, - 0, - 3952, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4044, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4160, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4062, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 4094, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 0, - 4090, - 0, - 0, - 4092, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 4063, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 4105, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 4112, - 0, - 0, - 4094, - 0, - 4024, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4118, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4155, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8241, - 4106, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3988, - 0, - 0, - 4108, - 4052, - 0, - 0, - 0, - 0, - 0, - 4036, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 4097, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 4110, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 4037, - 0, - 0, - 0, - 4071, - 3983, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 463, - 0, - 0, - 0, - 0, - 4047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8100, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4079, - 0, - 0, - 0, - 0, - 4094, - 0, - 3982, - 0, - 4104, - 4117, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8070, - 4165, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8137, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4005, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3939, - 0, - 0, - 0, - 0, - 4146, - 0, - 0, - 470, - 0, - 3980, - 4051, - 0, - 0, - 4037, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4038, - 0, - 3989, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4120, - 0, - 0, - 0, - 0, - 0, - 0, - 4152, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 4116, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 3918, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4027, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 0, - 8187, - 4017, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 4091, - 0, - 0, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 4029, - 0, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4019, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4056, - 4072, - 0, - 0, - 0, - 0, - 4127, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4162, - 0, - 0, - 0, - 0, - 0, - 0, - 4150, - 4066, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4113, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 0, - 8211, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4110, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 4085, - 0, - 0, - 4073, - 0, - 4034, - 0, - 0, - 4121, - 0, - 463, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4030, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4029, - 0, - 0, - 0, - 4034, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4039, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4089, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 494, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 485, - 0, - 0, - 0, - 0, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4079, - 0, - 4078, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4028, - 0, - 0, - 4129, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3943, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4098, - 0, - 0, - 0, - 3980, - 0, - 0, - 0, - 0, - 0, - 4116, - 0, - 0, - 0, - 0, - 0, - 0, - 3975, - 0, - 4059, - 0, - 0, - 4114, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 4021, - 4045, - 469, - 8260, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3989, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4069, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4145, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 481, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4052, - 0, - 4081, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3979, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4050, - 0, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4000, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4024, - 0, - 0, - 0, - 4102, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4154, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4036, - 0, - 0, - 4135, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 4004, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8263, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4015, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4127, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4078, - 0, - 0, - 0, - 0, - 4165, - 0, - 0, - 0, - 0, - 0, - 4086, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3991, - 4051, - 0, - 0, - 4006, - 0, - 0, - 4104, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 4098, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8173, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4021, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4109, - 0, - 0, - 465, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 4052, - 0, - 0, - 0, - 4044, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4167, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4091, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4115, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4155, - 0, - 0, - 4088, - 0, - 0, - 8241, - 4052, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4166, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 4059, - 0, - 4146, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 470, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 490, - 4066, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4120, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4156, - 0, - 0, - 0, - 0, - 0, - 4108, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 0, - 0, - 0, - 0, - 4034, - 0, - 4132, - 0, - 0, - 0, - 4049, - 0, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 4055, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 4073, - 0, - 0, - 0, - 0, - 0, - 0, - 3959, - 0, - 0, - 0, - 4059, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8195, - 0, - 0, - 0, - 0, - 0, - 8157, - 4071, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 4080, - 0, - 0, - 0, - 4150, - 0, - 4027, - 0, - 0, - 0, - 4082, - 0, - 0, - 0, - 4162, - 0, - 0, - 0, - 3996, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4011, - 0, - 0, - 0, - 0, - 4136, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 496, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 4038, - 0, - 0, - 0, - 0, - 8000, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8143, - 0, - 0, - 0, - 0, - 0, - 4019, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 483, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4054, - 0, - 0, - 0, - 0, - 8172, - 4104, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4035, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4018, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8187, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4074, - 0, - 0, - 0, - 4160, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4022, - 0, - 0, - 0, - 0, - 4056, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4008, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 0, - 4171, - 0, - 0, - 0, - 0, - 0, - 4111, - 4062, - 461, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3966, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4140, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4063, - 0, - 3935, - 0, - 0, - 4071, - 3939, - 0, - 0, - 0, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 4092, - 4084, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 467, - 3897, - 0, - 4003, - 0, - 3952, - 0, - 0, - 0, - 0, - 3985, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4136, - 0, - 472, - 4056, - 0, - 0, - 0, - 0, - 0, - 3996, - 0, - 0, - 487, - 8141, - 0, - 0, - 0, - 0, - 4133, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4005, - 0, - 0, - 0, - 0, - 0, - 0, - 474, - 0, - 476, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 478, - 0, - 0, - 0, - 0, - 4003, - 0, - 0, - 0, - 0, - 0, - 0, - 3878, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4017, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4175, - 0, - 4516, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 492, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4076, - 0, - 4113, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4057, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4090, - 0, - 0, - 0, - 3977, - 0, - 4081, - 0, - 3982, - 0, - 0, - 0, - 0, - 4051, - 0, - 0, - 0, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4130, - 0, - 0, - 4064, - 0, - 0, - 0, - 0, - 4067, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3987, - 0, - 0, - 0, - 0, - 0, - 4122, - 0, - 0, - 4105, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4153, - 0, - 0, - 4135, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3983, - 0, - 0, - 0, - 4006, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 488, - 0, - 0, - 0, - 0, - 0, - 0, - 4117, - 0, - 0, - 4047, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4106, - 0, - 4112, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4066, - 0, - 4065, - 0, - 0, - 4131, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4094, - 4104, - 0, - 0, - 0, - 0, - 4153, - 4165, - 0, - 4028, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4020, - 0, - 0, - 0, - 4083, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4111, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4072, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4037, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4131, - 4108, - 0, - 4026, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 8220, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4147, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3918, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 4039, - 0, - 0, - 4152, - 0, - 0, - 4050, - 0, - 4167, - 0, - 0, - 0, - 0, - 3967, - 0, - 0, - 0, - 0, - 0, - 0, - 4046, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4112, - 0, - 4096, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4081, - 0, - 4069, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 4016, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 3988, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ], - "top_n": [ - { - "data": "A4AAAAAAAACM", - "count": 3715 - }, - { - "data": "A4AAAAAAAADy", - "count": 3727 - }, - { - "data": "A4AAAAAAAAAt", - "count": 3716 - }, - { - "data": "A4AAAAAAAAD4", - "count": 3713 - }, - { - "data": "A4AAAAAAAADG", - "count": 3716 - }, - { - "data": "A4AAAAAAAACd", - "count": 3713 - }, - { - "data": "A4AAAAAAAAAr", - "count": 3732 - }, - { - "data": "A4AAAAAAAAB1", - "count": 3714 - }, - { - "data": "A4AAAAAAAADD", - "count": 3716 - }, - { - "data": "A4AAAAAAAACH", - "count": 3717 - }, - { - "data": "A4AAAAAAAAB/", - "count": 3713 - }, - { - "data": "A4AAAAAAAABX", - "count": 3720 - }, - { - "data": "A4AAAAAAAABO", - "count": 3715 - }, - { - "data": "A4AAAAAAAACk", - "count": 3713 - }, - { - "data": "A4AAAAAAAABf", - "count": 3720 - }, - { - "data": "A4AAAAAAAABw", - "count": 3724 - }, - { - "data": "A4AAAAAAAADQ", - "count": 3719 - }, - { - "data": "A4AAAAAAAADk", - "count": 3713 - }, - { - "data": "A4AAAAAAAACt", - "count": 3714 - }, - { - "data": "A4AAAAAAAABd", - "count": 3713 - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 0, - "last_update_version": 412596209749852160, - "correlation": 0 - }, - "idx_b": { - "histogram": { - "ndv": 30000, - "buckets": [ - { - "count": 25988, - "lower_bound": "A4AAAAAAAAAA", - "upper_bound": "A4AAAAAAAAL/", - "repeats": 36 - }, - { - "count": 32097, - "lower_bound": "A4AAAAAAAAMA", - "upper_bound": "A4AAAAAAAAO8", - "repeats": 25 - }, - { - "count": 37129, - "lower_bound": "A4AAAAAAAAO9", - "upper_bound": "A4AAAAAAAARR", - "repeats": 28 - }, - { - "count": 42231, - "lower_bound": "A4AAAAAAAARS", - "upper_bound": "A4AAAAAAAATr", - "repeats": 42 - }, - { - "count": 46858, - "lower_bound": "A4AAAAAAAATs", - "upper_bound": "A4AAAAAAAAV2", - "repeats": 24 - }, - { - "count": 51548, - "lower_bound": "A4AAAAAAAAV3", - "upper_bound": "A4AAAAAAAAYE", - "repeats": 33 - }, - { - "count": 56248, - "lower_bound": "A4AAAAAAAAYF", - "upper_bound": "A4AAAAAAAAaW", - "repeats": 34 - }, - { - "count": 60768, - "lower_bound": "A4AAAAAAAAaX", - "upper_bound": "A4AAAAAAAAce", - "repeats": 37 - }, - { - "count": 65165, - "lower_bound": "A4AAAAAAAAcf", - "upper_bound": "A4AAAAAAAAen", - "repeats": 38 - }, - { - "count": 69582, - "lower_bound": "A4AAAAAAAAeo", - "upper_bound": "A4AAAAAAAAgu", - "repeats": 35 - }, - { - "count": 73939, - "lower_bound": "A4AAAAAAAAgv", - "upper_bound": "A4AAAAAAAAiy", - "repeats": 29 - }, - { - "count": 78293, - "lower_bound": "A4AAAAAAAAiz", - "upper_bound": "A4AAAAAAAAk0", - "repeats": 39 - }, - { - "count": 82650, - "lower_bound": "A4AAAAAAAAk1", - "upper_bound": "A4AAAAAAAAm0", - "repeats": 32 - }, - { - "count": 87065, - "lower_bound": "A4AAAAAAAAm1", - "upper_bound": "A4AAAAAAAAo3", - "repeats": 40 - }, - { - "count": 91352, - "lower_bound": "A4AAAAAAAAo4", - "upper_bound": "A4AAAAAAAAq5", - "repeats": 37 - }, - { - "count": 95705, - "lower_bound": "A4AAAAAAAAq6", - "upper_bound": "A4AAAAAAAAs6", - "repeats": 31 - }, - { - "count": 99907, - "lower_bound": "A4AAAAAAAAs7", - "upper_bound": "A4AAAAAAAAu5", - "repeats": 31 - }, - { - "count": 104132, - "lower_bound": "A4AAAAAAAAu6", - "upper_bound": "A4AAAAAAAAw6", - "repeats": 26 - }, - { - "count": 108381, - "lower_bound": "A4AAAAAAAAw7", - "upper_bound": "A4AAAAAAAAy2", - "repeats": 35 - }, - { - "count": 112620, - "lower_bound": "A4AAAAAAAAy3", - "upper_bound": "A4AAAAAAAA02", - "repeats": 34 - }, - { - "count": 116825, - "lower_bound": "A4AAAAAAAA03", - "upper_bound": "A4AAAAAAAA2z", - "repeats": 42 - }, - { - "count": 121036, - "lower_bound": "A4AAAAAAAA20", - "upper_bound": "A4AAAAAAAA4x", - "repeats": 32 - }, - { - "count": 125236, - "lower_bound": "A4AAAAAAAA4y", - "upper_bound": "A4AAAAAAAA6w", - "repeats": 39 - }, - { - "count": 129419, - "lower_bound": "A4AAAAAAAA6x", - "upper_bound": "A4AAAAAAAA8v", - "repeats": 43 - }, - { - "count": 133646, - "lower_bound": "A4AAAAAAAA8w", - "upper_bound": "A4AAAAAAAA+v", - "repeats": 37 - }, - { - "count": 137886, - "lower_bound": "A4AAAAAAAA+w", - "upper_bound": "A4AAAAAAABAu", - "repeats": 31 - }, - { - "count": 142102, - "lower_bound": "A4AAAAAAABAv", - "upper_bound": "A4AAAAAAABCt", - "repeats": 22 - }, - { - "count": 146333, - "lower_bound": "A4AAAAAAABCu", - "upper_bound": "A4AAAAAAABEs", - "repeats": 32 - }, - { - "count": 150554, - "lower_bound": "A4AAAAAAABEt", - "upper_bound": "A4AAAAAAABGo", - "repeats": 33 - }, - { - "count": 154779, - "lower_bound": "A4AAAAAAABGp", - "upper_bound": "A4AAAAAAABIs", - "repeats": 28 - }, - { - "count": 159000, - "lower_bound": "A4AAAAAAABIt", - "upper_bound": "A4AAAAAAABKo", - "repeats": 35 - }, - { - "count": 163252, - "lower_bound": "A4AAAAAAABKp", - "upper_bound": "A4AAAAAAABMn", - "repeats": 41 - }, - { - "count": 167399, - "lower_bound": "A4AAAAAAABMo", - "upper_bound": "A4AAAAAAABOj", - "repeats": 37 - }, - { - "count": 171560, - "lower_bound": "A4AAAAAAABOk", - "upper_bound": "A4AAAAAAABQe", - "repeats": 23 - }, - { - "count": 175700, - "lower_bound": "A4AAAAAAABQf", - "upper_bound": "A4AAAAAAABSb", - "repeats": 40 - }, - { - "count": 179868, - "lower_bound": "A4AAAAAAABSc", - "upper_bound": "A4AAAAAAABUY", - "repeats": 27 - }, - { - "count": 184021, - "lower_bound": "A4AAAAAAABUZ", - "upper_bound": "A4AAAAAAABWW", - "repeats": 32 - }, - { - "count": 188202, - "lower_bound": "A4AAAAAAABWX", - "upper_bound": "A4AAAAAAABYT", - "repeats": 36 - }, - { - "count": 192351, - "lower_bound": "A4AAAAAAABYU", - "upper_bound": "A4AAAAAAABaQ", - "repeats": 29 - }, - { - "count": 196537, - "lower_bound": "A4AAAAAAABaR", - "upper_bound": "A4AAAAAAABcO", - "repeats": 32 - }, - { - "count": 200704, - "lower_bound": "A4AAAAAAABcP", - "upper_bound": "A4AAAAAAABeJ", - "repeats": 39 - }, - { - "count": 204842, - "lower_bound": "A4AAAAAAABeK", - "upper_bound": "A4AAAAAAABgF", - "repeats": 39 - }, - { - "count": 209014, - "lower_bound": "A4AAAAAAABgG", - "upper_bound": "A4AAAAAAABiD", - "repeats": 36 - }, - { - "count": 213155, - "lower_bound": "A4AAAAAAABiE", - "upper_bound": "A4AAAAAAABkA", - "repeats": 34 - }, - { - "count": 217342, - "lower_bound": "A4AAAAAAABkB", - "upper_bound": "A4AAAAAAABl+", - "repeats": 36 - }, - { - "count": 221495, - "lower_bound": "A4AAAAAAABl/", - "upper_bound": "A4AAAAAAABn1", - "repeats": 44 - }, - { - "count": 225668, - "lower_bound": "A4AAAAAAABn2", - "upper_bound": "A4AAAAAAABpy", - "repeats": 30 - }, - { - "count": 229827, - "lower_bound": "A4AAAAAAABpz", - "upper_bound": "A4AAAAAAABrx", - "repeats": 38 - }, - { - "count": 234004, - "lower_bound": "A4AAAAAAABry", - "upper_bound": "A4AAAAAAABtv", - "repeats": 33 - }, - { - "count": 238224, - "lower_bound": "A4AAAAAAABtw", - "upper_bound": "A4AAAAAAABvt", - "repeats": 41 - }, - { - "count": 242409, - "lower_bound": "A4AAAAAAABvu", - "upper_bound": "A4AAAAAAABxq", - "repeats": 25 - }, - { - "count": 246571, - "lower_bound": "A4AAAAAAABxr", - "upper_bound": "A4AAAAAAABzm", - "repeats": 45 - }, - { - "count": 250748, - "lower_bound": "A4AAAAAAABzn", - "upper_bound": "A4AAAAAAAB1h", - "repeats": 31 - }, - { - "count": 254892, - "lower_bound": "A4AAAAAAAB1i", - "upper_bound": "A4AAAAAAAB3c", - "repeats": 26 - }, - { - "count": 259017, - "lower_bound": "A4AAAAAAAB3d", - "upper_bound": "A4AAAAAAAB5Y", - "repeats": 35 - }, - { - "count": 263174, - "lower_bound": "A4AAAAAAAB5Z", - "upper_bound": "A4AAAAAAAB7U", - "repeats": 41 - }, - { - "count": 267371, - "lower_bound": "A4AAAAAAAB7V", - "upper_bound": "A4AAAAAAAB9S", - "repeats": 40 - }, - { - "count": 271556, - "lower_bound": "A4AAAAAAAB9T", - "upper_bound": "A4AAAAAAAB/P", - "repeats": 40 - }, - { - "count": 275744, - "lower_bound": "A4AAAAAAAB/Q", - "upper_bound": "A4AAAAAAACBM", - "repeats": 36 - }, - { - "count": 279890, - "lower_bound": "A4AAAAAAACBN", - "upper_bound": "A4AAAAAAACDJ", - "repeats": 38 - }, - { - "count": 284041, - "lower_bound": "A4AAAAAAACDK", - "upper_bound": "A4AAAAAAACFC", - "repeats": 27 - }, - { - "count": 288232, - "lower_bound": "A4AAAAAAACFD", - "upper_bound": "A4AAAAAAACG+", - "repeats": 34 - }, - { - "count": 292384, - "lower_bound": "A4AAAAAAACG/", - "upper_bound": "A4AAAAAAACI3", - "repeats": 34 - }, - { - "count": 296542, - "lower_bound": "A4AAAAAAACI4", - "upper_bound": "A4AAAAAAACK1", - "repeats": 25 - }, - { - "count": 300693, - "lower_bound": "A4AAAAAAACK2", - "upper_bound": "A4AAAAAAACMw", - "repeats": 46 - }, - { - "count": 304818, - "lower_bound": "A4AAAAAAACMx", - "upper_bound": "A4AAAAAAACOt", - "repeats": 29 - }, - { - "count": 308935, - "lower_bound": "A4AAAAAAACOu", - "upper_bound": "A4AAAAAAACQo", - "repeats": 31 - }, - { - "count": 313059, - "lower_bound": "A4AAAAAAACQp", - "upper_bound": "A4AAAAAAACSk", - "repeats": 30 - }, - { - "count": 317193, - "lower_bound": "A4AAAAAAACSl", - "upper_bound": "A4AAAAAAACUf", - "repeats": 46 - }, - { - "count": 321303, - "lower_bound": "A4AAAAAAACUg", - "upper_bound": "A4AAAAAAACWZ", - "repeats": 37 - }, - { - "count": 325431, - "lower_bound": "A4AAAAAAACWa", - "upper_bound": "A4AAAAAAACYV", - "repeats": 36 - }, - { - "count": 329567, - "lower_bound": "A4AAAAAAACYW", - "upper_bound": "A4AAAAAAACaP", - "repeats": 35 - }, - { - "count": 333673, - "lower_bound": "A4AAAAAAACaQ", - "upper_bound": "A4AAAAAAACcI", - "repeats": 41 - }, - { - "count": 337778, - "lower_bound": "A4AAAAAAACcJ", - "upper_bound": "A4AAAAAAACeA", - "repeats": 28 - }, - { - "count": 341911, - "lower_bound": "A4AAAAAAACeB", - "upper_bound": "A4AAAAAAACf7", - "repeats": 36 - }, - { - "count": 346025, - "lower_bound": "A4AAAAAAACf8", - "upper_bound": "A4AAAAAAACh2", - "repeats": 34 - }, - { - "count": 350151, - "lower_bound": "A4AAAAAAACh3", - "upper_bound": "A4AAAAAAACjz", - "repeats": 33 - }, - { - "count": 354306, - "lower_bound": "A4AAAAAAACj0", - "upper_bound": "A4AAAAAAAClt", - "repeats": 36 - }, - { - "count": 358427, - "lower_bound": "A4AAAAAAAClu", - "upper_bound": "A4AAAAAAACns", - "repeats": 38 - }, - { - "count": 362579, - "lower_bound": "A4AAAAAAACnt", - "upper_bound": "A4AAAAAAACpn", - "repeats": 44 - }, - { - "count": 366703, - "lower_bound": "A4AAAAAAACpo", - "upper_bound": "A4AAAAAAACrj", - "repeats": 35 - }, - { - "count": 370834, - "lower_bound": "A4AAAAAAACrk", - "upper_bound": "A4AAAAAAACth", - "repeats": 33 - }, - { - "count": 374942, - "lower_bound": "A4AAAAAAACti", - "upper_bound": "A4AAAAAAACvd", - "repeats": 40 - }, - { - "count": 379081, - "lower_bound": "A4AAAAAAACve", - "upper_bound": "A4AAAAAAACxX", - "repeats": 34 - }, - { - "count": 383223, - "lower_bound": "A4AAAAAAACxY", - "upper_bound": "A4AAAAAAACzU", - "repeats": 30 - }, - { - "count": 387349, - "lower_bound": "A4AAAAAAACzV", - "upper_bound": "A4AAAAAAAC1O", - "repeats": 37 - }, - { - "count": 391470, - "lower_bound": "A4AAAAAAAC1P", - "upper_bound": "A4AAAAAAAC3M", - "repeats": 28 - }, - { - "count": 395599, - "lower_bound": "A4AAAAAAAC3N", - "upper_bound": "A4AAAAAAAC5K", - "repeats": 28 - }, - { - "count": 399713, - "lower_bound": "A4AAAAAAAC5L", - "upper_bound": "A4AAAAAAAC7I", - "repeats": 38 - }, - { - "count": 403874, - "lower_bound": "A4AAAAAAAC7J", - "upper_bound": "A4AAAAAAAC9G", - "repeats": 39 - }, - { - "count": 407983, - "lower_bound": "A4AAAAAAAC9H", - "upper_bound": "A4AAAAAAAC+9", - "repeats": 33 - }, - { - "count": 412118, - "lower_bound": "A4AAAAAAAC++", - "upper_bound": "A4AAAAAAADA5", - "repeats": 31 - }, - { - "count": 416258, - "lower_bound": "A4AAAAAAADA6", - "upper_bound": "A4AAAAAAADC2", - "repeats": 35 - }, - { - "count": 420401, - "lower_bound": "A4AAAAAAADC3", - "upper_bound": "A4AAAAAAADEx", - "repeats": 34 - }, - { - "count": 424526, - "lower_bound": "A4AAAAAAADEy", - "upper_bound": "A4AAAAAAADGu", - "repeats": 33 - }, - { - "count": 428656, - "lower_bound": "A4AAAAAAADGv", - "upper_bound": "A4AAAAAAADIt", - "repeats": 29 - }, - { - "count": 432811, - "lower_bound": "A4AAAAAAADIu", - "upper_bound": "A4AAAAAAADKq", - "repeats": 33 - }, - { - "count": 436920, - "lower_bound": "A4AAAAAAADKr", - "upper_bound": "A4AAAAAAADMn", - "repeats": 31 - }, - { - "count": 441033, - "lower_bound": "A4AAAAAAADMo", - "upper_bound": "A4AAAAAAADOk", - "repeats": 36 - }, - { - "count": 445181, - "lower_bound": "A4AAAAAAADOl", - "upper_bound": "A4AAAAAAADQf", - "repeats": 32 - }, - { - "count": 449328, - "lower_bound": "A4AAAAAAADQg", - "upper_bound": "A4AAAAAAADSZ", - "repeats": 26 - }, - { - "count": 453456, - "lower_bound": "A4AAAAAAADSa", - "upper_bound": "A4AAAAAAADUV", - "repeats": 33 - }, - { - "count": 457587, - "lower_bound": "A4AAAAAAADUW", - "upper_bound": "A4AAAAAAADWS", - "repeats": 30 - }, - { - "count": 461736, - "lower_bound": "A4AAAAAAADWT", - "upper_bound": "A4AAAAAAADYO", - "repeats": 34 - }, - { - "count": 465874, - "lower_bound": "A4AAAAAAADYP", - "upper_bound": "A4AAAAAAADaL", - "repeats": 42 - }, - { - "count": 469993, - "lower_bound": "A4AAAAAAADaM", - "upper_bound": "A4AAAAAAADcH", - "repeats": 39 - }, - { - "count": 474118, - "lower_bound": "A4AAAAAAADcI", - "upper_bound": "A4AAAAAAADeE", - "repeats": 39 - }, - { - "count": 478247, - "lower_bound": "A4AAAAAAADeF", - "upper_bound": "A4AAAAAAADgA", - "repeats": 38 - }, - { - "count": 482409, - "lower_bound": "A4AAAAAAADgB", - "upper_bound": "A4AAAAAAADh/", - "repeats": 44 - }, - { - "count": 486553, - "lower_bound": "A4AAAAAAADiA", - "upper_bound": "A4AAAAAAADj6", - "repeats": 36 - }, - { - "count": 490686, - "lower_bound": "A4AAAAAAADj7", - "upper_bound": "A4AAAAAAADl4", - "repeats": 28 - }, - { - "count": 494827, - "lower_bound": "A4AAAAAAADl5", - "upper_bound": "A4AAAAAAADn0", - "repeats": 43 - }, - { - "count": 498963, - "lower_bound": "A4AAAAAAADn1", - "upper_bound": "A4AAAAAAADpx", - "repeats": 38 - }, - { - "count": 503083, - "lower_bound": "A4AAAAAAADpy", - "upper_bound": "A4AAAAAAADru", - "repeats": 27 - }, - { - "count": 507222, - "lower_bound": "A4AAAAAAADrv", - "upper_bound": "A4AAAAAAADtr", - "repeats": 32 - }, - { - "count": 511329, - "lower_bound": "A4AAAAAAADts", - "upper_bound": "A4AAAAAAADvn", - "repeats": 37 - }, - { - "count": 515460, - "lower_bound": "A4AAAAAAADvo", - "upper_bound": "A4AAAAAAADxj", - "repeats": 30 - }, - { - "count": 519599, - "lower_bound": "A4AAAAAAADxk", - "upper_bound": "A4AAAAAAADze", - "repeats": 34 - }, - { - "count": 523724, - "lower_bound": "A4AAAAAAADzf", - "upper_bound": "A4AAAAAAAD1Z", - "repeats": 31 - }, - { - "count": 527869, - "lower_bound": "A4AAAAAAAD1a", - "upper_bound": "A4AAAAAAAD3Y", - "repeats": 27 - }, - { - "count": 531983, - "lower_bound": "A4AAAAAAAD3Z", - "upper_bound": "A4AAAAAAAD5V", - "repeats": 27 - }, - { - "count": 536103, - "lower_bound": "A4AAAAAAAD5W", - "upper_bound": "A4AAAAAAAD7R", - "repeats": 26 - }, - { - "count": 540223, - "lower_bound": "A4AAAAAAAD7S", - "upper_bound": "A4AAAAAAAD9O", - "repeats": 31 - }, - { - "count": 544328, - "lower_bound": "A4AAAAAAAD9P", - "upper_bound": "A4AAAAAAAD/J", - "repeats": 34 - }, - { - "count": 548489, - "lower_bound": "A4AAAAAAAD/K", - "upper_bound": "A4AAAAAAAEBG", - "repeats": 43 - }, - { - "count": 552608, - "lower_bound": "A4AAAAAAAEBH", - "upper_bound": "A4AAAAAAAEDE", - "repeats": 37 - }, - { - "count": 556751, - "lower_bound": "A4AAAAAAAEDF", - "upper_bound": "A4AAAAAAAEFB", - "repeats": 40 - }, - { - "count": 560882, - "lower_bound": "A4AAAAAAAEFC", - "upper_bound": "A4AAAAAAAEG/", - "repeats": 38 - }, - { - "count": 565000, - "lower_bound": "A4AAAAAAAEHA", - "upper_bound": "A4AAAAAAAEI/", - "repeats": 25 - }, - { - "count": 569118, - "lower_bound": "A4AAAAAAAEJA", - "upper_bound": "A4AAAAAAAEK6", - "repeats": 26 - }, - { - "count": 573218, - "lower_bound": "A4AAAAAAAEK7", - "upper_bound": "A4AAAAAAAEM1", - "repeats": 31 - }, - { - "count": 577325, - "lower_bound": "A4AAAAAAAEM2", - "upper_bound": "A4AAAAAAAEOy", - "repeats": 39 - }, - { - "count": 581422, - "lower_bound": "A4AAAAAAAEOz", - "upper_bound": "A4AAAAAAAEQw", - "repeats": 28 - }, - { - "count": 585520, - "lower_bound": "A4AAAAAAAEQx", - "upper_bound": "A4AAAAAAAESu", - "repeats": 30 - }, - { - "count": 589634, - "lower_bound": "A4AAAAAAAESv", - "upper_bound": "A4AAAAAAAEUo", - "repeats": 35 - }, - { - "count": 593739, - "lower_bound": "A4AAAAAAAEUp", - "upper_bound": "A4AAAAAAAEWi", - "repeats": 46 - }, - { - "count": 597837, - "lower_bound": "A4AAAAAAAEWj", - "upper_bound": "A4AAAAAAAEYc", - "repeats": 38 - }, - { - "count": 601938, - "lower_bound": "A4AAAAAAAEYd", - "upper_bound": "A4AAAAAAAEaU", - "repeats": 29 - }, - { - "count": 606062, - "lower_bound": "A4AAAAAAAEaV", - "upper_bound": "A4AAAAAAAEcS", - "repeats": 31 - }, - { - "count": 610158, - "lower_bound": "A4AAAAAAAEcT", - "upper_bound": "A4AAAAAAAEeM", - "repeats": 38 - }, - { - "count": 614274, - "lower_bound": "A4AAAAAAAEeN", - "upper_bound": "A4AAAAAAAEgF", - "repeats": 25 - }, - { - "count": 618396, - "lower_bound": "A4AAAAAAAEgG", - "upper_bound": "A4AAAAAAAEiB", - "repeats": 30 - }, - { - "count": 622507, - "lower_bound": "A4AAAAAAAEiC", - "upper_bound": "A4AAAAAAAEj8", - "repeats": 22 - }, - { - "count": 626607, - "lower_bound": "A4AAAAAAAEj9", - "upper_bound": "A4AAAAAAAEl0", - "repeats": 26 - }, - { - "count": 630728, - "lower_bound": "A4AAAAAAAEl1", - "upper_bound": "A4AAAAAAAEnt", - "repeats": 27 - }, - { - "count": 634848, - "lower_bound": "A4AAAAAAAEnu", - "upper_bound": "A4AAAAAAAEpl", - "repeats": 29 - }, - { - "count": 638981, - "lower_bound": "A4AAAAAAAEpm", - "upper_bound": "A4AAAAAAAErj", - "repeats": 41 - }, - { - "count": 643078, - "lower_bound": "A4AAAAAAAErk", - "upper_bound": "A4AAAAAAAEtd", - "repeats": 31 - }, - { - "count": 647189, - "lower_bound": "A4AAAAAAAEte", - "upper_bound": "A4AAAAAAAEvW", - "repeats": 34 - }, - { - "count": 651290, - "lower_bound": "A4AAAAAAAEvX", - "upper_bound": "A4AAAAAAAExS", - "repeats": 26 - }, - { - "count": 655412, - "lower_bound": "A4AAAAAAAExT", - "upper_bound": "A4AAAAAAAEzL", - "repeats": 37 - }, - { - "count": 659533, - "lower_bound": "A4AAAAAAAEzM", - "upper_bound": "A4AAAAAAAE1J", - "repeats": 40 - }, - { - "count": 663630, - "lower_bound": "A4AAAAAAAE1K", - "upper_bound": "A4AAAAAAAE3E", - "repeats": 36 - }, - { - "count": 667730, - "lower_bound": "A4AAAAAAAE3F", - "upper_bound": "A4AAAAAAAE4+", - "repeats": 32 - }, - { - "count": 671828, - "lower_bound": "A4AAAAAAAE4/", - "upper_bound": "A4AAAAAAAE62", - "repeats": 46 - }, - { - "count": 675940, - "lower_bound": "A4AAAAAAAE63", - "upper_bound": "A4AAAAAAAE8w", - "repeats": 34 - }, - { - "count": 680049, - "lower_bound": "A4AAAAAAAE8x", - "upper_bound": "A4AAAAAAAE+r", - "repeats": 35 - }, - { - "count": 684163, - "lower_bound": "A4AAAAAAAE+s", - "upper_bound": "A4AAAAAAAFAn", - "repeats": 31 - }, - { - "count": 688268, - "lower_bound": "A4AAAAAAAFAo", - "upper_bound": "A4AAAAAAAFCj", - "repeats": 26 - }, - { - "count": 692390, - "lower_bound": "A4AAAAAAAFCk", - "upper_bound": "A4AAAAAAAFEe", - "repeats": 32 - }, - { - "count": 696517, - "lower_bound": "A4AAAAAAAFEf", - "upper_bound": "A4AAAAAAAFGb", - "repeats": 33 - }, - { - "count": 700626, - "lower_bound": "A4AAAAAAAFGc", - "upper_bound": "A4AAAAAAAFIY", - "repeats": 31 - }, - { - "count": 704746, - "lower_bound": "A4AAAAAAAFIZ", - "upper_bound": "A4AAAAAAAFKV", - "repeats": 25 - }, - { - "count": 708865, - "lower_bound": "A4AAAAAAAFKW", - "upper_bound": "A4AAAAAAAFMT", - "repeats": 37 - }, - { - "count": 712966, - "lower_bound": "A4AAAAAAAFMU", - "upper_bound": "A4AAAAAAAFOR", - "repeats": 35 - }, - { - "count": 717077, - "lower_bound": "A4AAAAAAAFOS", - "upper_bound": "A4AAAAAAAFQO", - "repeats": 44 - }, - { - "count": 721192, - "lower_bound": "A4AAAAAAAFQP", - "upper_bound": "A4AAAAAAAFSK", - "repeats": 41 - }, - { - "count": 725312, - "lower_bound": "A4AAAAAAAFSL", - "upper_bound": "A4AAAAAAAFUI", - "repeats": 34 - }, - { - "count": 729434, - "lower_bound": "A4AAAAAAAFUJ", - "upper_bound": "A4AAAAAAAFWH", - "repeats": 31 - }, - { - "count": 733539, - "lower_bound": "A4AAAAAAAFWI", - "upper_bound": "A4AAAAAAAFYE", - "repeats": 43 - }, - { - "count": 737660, - "lower_bound": "A4AAAAAAAFYF", - "upper_bound": "A4AAAAAAAFaC", - "repeats": 30 - }, - { - "count": 741758, - "lower_bound": "A4AAAAAAAFaD", - "upper_bound": "A4AAAAAAAFb+", - "repeats": 28 - }, - { - "count": 764012, - "lower_bound": "A4AAAAAAAFb/", - "upper_bound": "A4AAAAAAAFdA", - "repeats": 20044 - }, - { - "count": 768131, - "lower_bound": "A4AAAAAAAFdB", - "upper_bound": "A4AAAAAAAFe7", - "repeats": 35 - }, - { - "count": 772242, - "lower_bound": "A4AAAAAAAFe8", - "upper_bound": "A4AAAAAAAFg1", - "repeats": 30 - }, - { - "count": 776366, - "lower_bound": "A4AAAAAAAFg2", - "upper_bound": "A4AAAAAAAFiv", - "repeats": 45 - }, - { - "count": 780502, - "lower_bound": "A4AAAAAAAFiw", - "upper_bound": "A4AAAAAAAFks", - "repeats": 45 - }, - { - "count": 784611, - "lower_bound": "A4AAAAAAAFkt", - "upper_bound": "A4AAAAAAAFmo", - "repeats": 46 - }, - { - "count": 788711, - "lower_bound": "A4AAAAAAAFmp", - "upper_bound": "A4AAAAAAAFol", - "repeats": 21 - }, - { - "count": 792835, - "lower_bound": "A4AAAAAAAFom", - "upper_bound": "A4AAAAAAAFqf", - "repeats": 37 - }, - { - "count": 796961, - "lower_bound": "A4AAAAAAAFqg", - "upper_bound": "A4AAAAAAAFsd", - "repeats": 38 - }, - { - "count": 801058, - "lower_bound": "A4AAAAAAAFse", - "upper_bound": "A4AAAAAAAFuX", - "repeats": 35 - }, - { - "count": 805189, - "lower_bound": "A4AAAAAAAFuY", - "upper_bound": "A4AAAAAAAFwO", - "repeats": 42 - }, - { - "count": 809322, - "lower_bound": "A4AAAAAAAFwP", - "upper_bound": "A4AAAAAAAFyJ", - "repeats": 45 - }, - { - "count": 813420, - "lower_bound": "A4AAAAAAAFyK", - "upper_bound": "A4AAAAAAAF0E", - "repeats": 32 - }, - { - "count": 817526, - "lower_bound": "A4AAAAAAAF0F", - "upper_bound": "A4AAAAAAAF19", - "repeats": 49 - }, - { - "count": 821643, - "lower_bound": "A4AAAAAAAF1+", - "upper_bound": "A4AAAAAAAF34", - "repeats": 42 - }, - { - "count": 825768, - "lower_bound": "A4AAAAAAAF35", - "upper_bound": "A4AAAAAAAF5z", - "repeats": 35 - }, - { - "count": 829893, - "lower_bound": "A4AAAAAAAF50", - "upper_bound": "A4AAAAAAAF7s", - "repeats": 42 - }, - { - "count": 833995, - "lower_bound": "A4AAAAAAAF7t", - "upper_bound": "A4AAAAAAAF9l", - "repeats": 37 - }, - { - "count": 838119, - "lower_bound": "A4AAAAAAAF9m", - "upper_bound": "A4AAAAAAAF/i", - "repeats": 33 - }, - { - "count": 842215, - "lower_bound": "A4AAAAAAAF/j", - "upper_bound": "A4AAAAAAAGBc", - "repeats": 27 - }, - { - "count": 846339, - "lower_bound": "A4AAAAAAAGBd", - "upper_bound": "A4AAAAAAAGDY", - "repeats": 41 - }, - { - "count": 850437, - "lower_bound": "A4AAAAAAAGDZ", - "upper_bound": "A4AAAAAAAGFV", - "repeats": 28 - }, - { - "count": 854567, - "lower_bound": "A4AAAAAAAGFW", - "upper_bound": "A4AAAAAAAGHS", - "repeats": 44 - }, - { - "count": 858669, - "lower_bound": "A4AAAAAAAGHT", - "upper_bound": "A4AAAAAAAGJM", - "repeats": 28 - }, - { - "count": 862800, - "lower_bound": "A4AAAAAAAGJN", - "upper_bound": "A4AAAAAAAGLJ", - "repeats": 38 - }, - { - "count": 866923, - "lower_bound": "A4AAAAAAAGLK", - "upper_bound": "A4AAAAAAAGNH", - "repeats": 34 - }, - { - "count": 871040, - "lower_bound": "A4AAAAAAAGNI", - "upper_bound": "A4AAAAAAAGPD", - "repeats": 28 - }, - { - "count": 875146, - "lower_bound": "A4AAAAAAAGPE", - "upper_bound": "A4AAAAAAAGQ/", - "repeats": 30 - }, - { - "count": 879278, - "lower_bound": "A4AAAAAAAGRA", - "upper_bound": "A4AAAAAAAGS8", - "repeats": 37 - }, - { - "count": 883401, - "lower_bound": "A4AAAAAAAGS9", - "upper_bound": "A4AAAAAAAGU5", - "repeats": 33 - }, - { - "count": 887510, - "lower_bound": "A4AAAAAAAGU6", - "upper_bound": "A4AAAAAAAGWz", - "repeats": 38 - }, - { - "count": 891622, - "lower_bound": "A4AAAAAAAGW0", - "upper_bound": "A4AAAAAAAGYu", - "repeats": 32 - }, - { - "count": 895723, - "lower_bound": "A4AAAAAAAGYv", - "upper_bound": "A4AAAAAAAGaq", - "repeats": 35 - }, - { - "count": 899834, - "lower_bound": "A4AAAAAAAGar", - "upper_bound": "A4AAAAAAAGcn", - "repeats": 44 - }, - { - "count": 903964, - "lower_bound": "A4AAAAAAAGco", - "upper_bound": "A4AAAAAAAGef", - "repeats": 40 - }, - { - "count": 908066, - "lower_bound": "A4AAAAAAAGeg", - "upper_bound": "A4AAAAAAAGgZ", - "repeats": 27 - }, - { - "count": 912186, - "lower_bound": "A4AAAAAAAGga", - "upper_bound": "A4AAAAAAAGiS", - "repeats": 34 - }, - { - "count": 916294, - "lower_bound": "A4AAAAAAAGiT", - "upper_bound": "A4AAAAAAAGkJ", - "repeats": 43 - }, - { - "count": 920403, - "lower_bound": "A4AAAAAAAGkK", - "upper_bound": "A4AAAAAAAGmH", - "repeats": 29 - }, - { - "count": 924516, - "lower_bound": "A4AAAAAAAGmI", - "upper_bound": "A4AAAAAAAGn/", - "repeats": 36 - }, - { - "count": 928612, - "lower_bound": "A4AAAAAAAGoA", - "upper_bound": "A4AAAAAAAGp4", - "repeats": 33 - }, - { - "count": 932733, - "lower_bound": "A4AAAAAAAGp5", - "upper_bound": "A4AAAAAAAGr0", - "repeats": 33 - }, - { - "count": 936836, - "lower_bound": "A4AAAAAAAGr1", - "upper_bound": "A4AAAAAAAGtv", - "repeats": 43 - }, - { - "count": 940962, - "lower_bound": "A4AAAAAAAGtw", - "upper_bound": "A4AAAAAAAGvt", - "repeats": 31 - }, - { - "count": 945058, - "lower_bound": "A4AAAAAAAGvu", - "upper_bound": "A4AAAAAAAGxo", - "repeats": 28 - }, - { - "count": 949174, - "lower_bound": "A4AAAAAAAGxp", - "upper_bound": "A4AAAAAAAGzg", - "repeats": 28 - }, - { - "count": 953296, - "lower_bound": "A4AAAAAAAGzh", - "upper_bound": "A4AAAAAAAG1c", - "repeats": 29 - }, - { - "count": 957424, - "lower_bound": "A4AAAAAAAG1d", - "upper_bound": "A4AAAAAAAG3Y", - "repeats": 33 - }, - { - "count": 961553, - "lower_bound": "A4AAAAAAAG3Z", - "upper_bound": "A4AAAAAAAG5S", - "repeats": 43 - }, - { - "count": 965658, - "lower_bound": "A4AAAAAAAG5T", - "upper_bound": "A4AAAAAAAG7O", - "repeats": 23 - }, - { - "count": 969766, - "lower_bound": "A4AAAAAAAG7P", - "upper_bound": "A4AAAAAAAG9H", - "repeats": 28 - }, - { - "count": 973865, - "lower_bound": "A4AAAAAAAG9I", - "upper_bound": "A4AAAAAAAG/F", - "repeats": 38 - }, - { - "count": 977988, - "lower_bound": "A4AAAAAAAG/G", - "upper_bound": "A4AAAAAAAHBC", - "repeats": 35 - }, - { - "count": 982105, - "lower_bound": "A4AAAAAAAHBD", - "upper_bound": "A4AAAAAAAHC+", - "repeats": 31 - }, - { - "count": 986219, - "lower_bound": "A4AAAAAAAHC/", - "upper_bound": "A4AAAAAAAHE5", - "repeats": 44 - }, - { - "count": 990352, - "lower_bound": "A4AAAAAAAHE6", - "upper_bound": "A4AAAAAAAHG0", - "repeats": 42 - }, - { - "count": 994473, - "lower_bound": "A4AAAAAAAHG1", - "upper_bound": "A4AAAAAAAHIt", - "repeats": 32 - }, - { - "count": 998596, - "lower_bound": "A4AAAAAAAHIu", - "upper_bound": "A4AAAAAAAHKq", - "repeats": 36 - }, - { - "count": 1002716, - "lower_bound": "A4AAAAAAAHKr", - "upper_bound": "A4AAAAAAAHMo", - "repeats": 30 - }, - { - "count": 1006829, - "lower_bound": "A4AAAAAAAHMp", - "upper_bound": "A4AAAAAAAHOj", - "repeats": 27 - }, - { - "count": 1010942, - "lower_bound": "A4AAAAAAAHOk", - "upper_bound": "A4AAAAAAAHQg", - "repeats": 28 - }, - { - "count": 1015066, - "lower_bound": "A4AAAAAAAHQh", - "upper_bound": "A4AAAAAAAHSb", - "repeats": 48 - }, - { - "count": 1019164, - "lower_bound": "A4AAAAAAAHSc", - "upper_bound": "A4AAAAAAAHUV", - "repeats": 32 - }, - { - "count": 1020000, - "lower_bound": "A4AAAAAAAHUW", - "upper_bound": "A4AAAAAAAHUv", - "repeats": 36 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 746, - 307, - 547, - 584, - 559, - 407, - 487, - 244, - 500, - 596, - 644, - 508, - 233, - 290, - 401, - 535, - 259, - 418, - 447, - 615, - 564, - 472, - 361, - 533, - 600, - 369, - 525, - 580, - 631, - 489, - 456, - 716, - 541, - 464, - 545, - 598, - 658, - 430, - 366, - 411, - 614, - 364, - 432, - 434, - 591, - 245, - 537, - 565, - 716, - 465, - 581, - 309, - 482, - 406, - 624, - 598, - 418, - 461, - 491, - 521, - 632, - 485, - 258, - 657, - 481, - 499, - 521, - 394, - 289, - 341, - 416, - 468, - 450, - 365, - 348, - 527, - 569, - 391, - 605, - 356, - 573, - 275, - 173, - 424, - 465, - 483, - 493, - 476, - 390, - 510, - 235, - 576, - 404, - 275, - 333, - 781, - 247, - 604, - 587, - 474, - 240, - 479, - 303, - 528, - 513, - 478, - 482, - 553, - 426, - 794, - 319, - 533, - 786, - 635, - 451, - 476, - 481, - 532, - 489, - 351, - 657, - 384, - 622, - 315, - 826, - 614, - 543, - 413, - 519, - 547, - 410, - 583, - 368, - 457, - 776, - 319, - 450, - 439, - 682, - 559, - 343, - 372, - 513, - 463, - 385, - 443, - 588, - 472, - 724, - 654, - 327, - 569, - 394, - 484, - 375, - 475, - 558, - 521, - 427, - 456, - 520, - 534, - 429, - 462, - 713, - 555, - 459, - 545, - 257, - 292, - 559, - 759, - 423, - 544, - 475, - 551, - 619, - 309, - 515, - 529, - 419, - 748, - 409, - 566, - 266, - 267, - 556, - 556, - 516, - 458, - 465, - 349, - 693, - 330, - 556, - 562, - 348, - 602, - 502, - 328, - 655, - 516, - 575, - 354, - 600, - 522, - 419, - 376, - 542, - 467, - 685, - 833, - 406, - 364, - 224, - 444, - 581, - 608, - 616, - 427, - 463, - 534, - 491, - 495, - 476, - 339, - 369, - 545, - 544, - 521, - 749, - 521, - 592, - 631, - 567, - 473, - 561, - 527, - 526, - 488, - 468, - 501, - 456, - 464, - 601, - 497, - 556, - 383, - 307, - 284, - 602, - 535, - 554, - 455, - 546, - 398, - 632, - 629, - 508, - 464, - 389, - 526, - 635, - 419, - 736, - 545, - 355, - 688, - 445, - 511, - 524, - 569, - 463, - 541, - 592, - 397, - 420, - 637, - 412, - 437, - 546, - 405, - 608, - 497, - 550, - 778, - 258, - 601, - 297, - 798, - 507, - 539, - 430, - 421, - 438, - 673, - 399, - 532, - 667, - 442, - 479, - 577, - 435, - 524, - 468, - 391, - 486, - 400, - 560, - 409, - 606, - 586, - 495, - 490, - 326, - 424, - 393, - 445, - 466, - 616, - 678, - 757, - 583, - 678, - 398, - 614, - 636, - 555, - 583, - 404, - 554, - 333, - 288, - 619, - 472, - 462, - 372, - 292, - 435, - 530, - 625, - 448, - 610, - 514, - 438, - 417, - 527, - 463, - 418, - 519, - 263, - 1001, - 455, - 571, - 474, - 437, - 368, - 488, - 384, - 641, - 433, - 241, - 493, - 382, - 416, - 766, - 481, - 568, - 510, - 478, - 647, - 420, - 631, - 661, - 485, - 415, - 629, - 725, - 654, - 562, - 536, - 634, - 554, - 603, - 481, - 713, - 770, - 732, - 333, - 531, - 399, - 244, - 683, - 426, - 510, - 475, - 621, - 492, - 464, - 707, - 421, - 653, - 244, - 621, - 312, - 706, - 525, - 414, - 593, - 543, - 459, - 597, - 197, - 315, - 385, - 405, - 513, - 285, - 532, - 452, - 434, - 375, - 304, - 462, - 531, - 758, - 327, - 445, - 438, - 428, - 557, - 359, - 564, - 531, - 421, - 392, - 401, - 497, - 654, - 523, - 521, - 411, - 550, - 557, - 656, - 610, - 408, - 646, - 442, - 323, - 606, - 939, - 469, - 300, - 427, - 701, - 704, - 593, - 443, - 442, - 430, - 335, - 486, - 588, - 508, - 488, - 484, - 746, - 534, - 486, - 548, - 333, - 291, - 494, - 376, - 468, - 461, - 345, - 267, - 556, - 363, - 594, - 420, - 355, - 504, - 618, - 459, - 638, - 320, - 689, - 519, - 370, - 394, - 288, - 523, - 555, - 544, - 467, - 445, - 550, - 701, - 256, - 462, - 417, - 501, - 395, - 438, - 504, - 307, - 648, - 272, - 498, - 636, - 719, - 420, - 598, - 365, - 597, - 338, - 530, - 391, - 450, - 385, - 439, - 442, - 276, - 470, - 587, - 519, - 601, - 423, - 444, - 325, - 380, - 343, - 462, - 500, - 420, - 470, - 345, - 686, - 513, - 344, - 465, - 507, - 520, - 815, - 454, - 759, - 620, - 612, - 471, - 652, - 608, - 343, - 427, - 838, - 634, - 427, - 236, - 396, - 495, - 387, - 375, - 383, - 423, - 377, - 319, - 488, - 333, - 548, - 702, - 650, - 229, - 504, - 595, - 370, - 436, - 416, - 434, - 870, - 685, - 383, - 603, - 750, - 624, - 430, - 692, - 252, - 283, - 637, - 458, - 581, - 433, - 608, - 510, - 486, - 362, - 467, - 470, - 328, - 500, - 833, - 524, - 571, - 522, - 322, - 595, - 589, - 438, - 635, - 389, - 396, - 214, - 431, - 637, - 351, - 402, - 473, - 275, - 660, - 417, - 386, - 572, - 512, - 704, - 627, - 591, - 628, - 467, - 493, - 675, - 411, - 339, - 537, - 533, - 503, - 653, - 502, - 670, - 434, - 399, - 683, - 467, - 434, - 365, - 600, - 326, - 643, - 241, - 556, - 306, - 470, - 733, - 349, - 416, - 358, - 435, - 859, - 610, - 592, - 310, - 379, - 454, - 362, - 341, - 357, - 503, - 575, - 598, - 369, - 503, - 637, - 356, - 464, - 795, - 382, - 684, - 518, - 308, - 382, - 559, - 700, - 475, - 413, - 492, - 553, - 452, - 338, - 366, - 527, - 336, - 199, - 425, - 560, - 550, - 711, - 323, - 492, - 580, - 424, - 449, - 536, - 415, - 481, - 470, - 342, - 501, - 392, - 502, - 314, - 331, - 522, - 646, - 528, - 703, - 444, - 396, - 505, - 306, - 644, - 456, - 684, - 544, - 613, - 132, - 216, - 242, - 349, - 336, - 536, - 540, - 674, - 463, - 668, - 471, - 391, - 346, - 576, - 479, - 404, - 432, - 459, - 312, - 535, - 652, - 565, - 425, - 291, - 535, - 377, - 590, - 496, - 310, - 377, - 585, - 299, - 402, - 271, - 481, - 572, - 404, - 722, - 643, - 508, - 440, - 632, - 619, - 587, - 351, - 521, - 564, - 461, - 481, - 523, - 696, - 638, - 308, - 440, - 487, - 339, - 762, - 340, - 429, - 311, - 721, - 597, - 459, - 515, - 577, - 466, - 633, - 539, - 591, - 567, - 435, - 369, - 542, - 315, - 164, - 415, - 418, - 616, - 767, - 530, - 528, - 762, - 350, - 486, - 354, - 479, - 490, - 581, - 317, - 412, - 553, - 560, - 529, - 458, - 418, - 361, - 278, - 308, - 721, - 462, - 215, - 530, - 570, - 562, - 404, - 392, - 388, - 441, - 638, - 452, - 376, - 318, - 579, - 597, - 820, - 440, - 426, - 460, - 331, - 557, - 495, - 616, - 621, - 440, - 491, - 459, - 338, - 500, - 330, - 512, - 612, - 550, - 297, - 493, - 662, - 305, - 569, - 346, - 553, - 533, - 592, - 652, - 531, - 386, - 368, - 715, - 552, - 634, - 333, - 691, - 450, - 375, - 463, - 599, - 540, - 475, - 581, - 443, - 588, - 579, - 418, - 492, - 502, - 382, - 647, - 324, - 735, - 206, - 238, - 756, - 597, - 300, - 442, - 579, - 760, - 176, - 576, - 373, - 558, - 573, - 461, - 459, - 563, - 389, - 410, - 311, - 473, - 348, - 377, - 511, - 498, - 324, - 585, - 508, - 457, - 480, - 532, - 418, - 555, - 428, - 383, - 310, - 559, - 217, - 385, - 279, - 523, - 553, - 709, - 392, - 602, - 676, - 420, - 324, - 238, - 460, - 649, - 483, - 350, - 758, - 686, - 585, - 477, - 503, - 472, - 813, - 435, - 604, - 748, - 271, - 309, - 431, - 382, - 328, - 678, - 571, - 423, - 642, - 544, - 332, - 605, - 450, - 561, - 520, - 525, - 523, - 325, - 382, - 474, - 542, - 476, - 599, - 395, - 661, - 374, - 418, - 441, - 283, - 293, - 508, - 247, - 430, - 352, - 392, - 372, - 618, - 431, - 333, - 273, - 569, - 498, - 417, - 417, - 464, - 491, - 436, - 494, - 345, - 502, - 463, - 513, - 301, - 589, - 668, - 437, - 397, - 528, - 821, - 356, - 511, - 530, - 396, - 630, - 507, - 341, - 558, - 405, - 492, - 404, - 268, - 557, - 444, - 601, - 678, - 392, - 503, - 438, - 520, - 663, - 514, - 364, - 504, - 555, - 408, - 512, - 686, - 366, - 336, - 699, - 456, - 418, - 399, - 614, - 458, - 338, - 458, - 504, - 413, - 385, - 510, - 462, - 449, - 301, - 557, - 487, - 370, - 435, - 607, - 595, - 268, - 546, - 530, - 467, - 373, - 439, - 609, - 379, - 421, - 522, - 545, - 578, - 644, - 627, - 331, - 395, - 480, - 667, - 376, - 300, - 321, - 675, - 591, - 405, - 613, - 222, - 355, - 468, - 792, - 779, - 416, - 479, - 503, - 780, - 480, - 589, - 442, - 601, - 522, - 598, - 435, - 518, - 593, - 676, - 176, - 385, - 316, - 338, - 514, - 681, - 379, - 391, - 212, - 437, - 496, - 759, - 427, - 422, - 432, - 329, - 547, - 237, - 411, - 298, - 240, - 467, - 428, - 672, - 429, - 571, - 600, - 546, - 415, - 312, - 382, - 449, - 330, - 523, - 655, - 310, - 366, - 641, - 425, - 401, - 494, - 389, - 411, - 828, - 583, - 770, - 453, - 635, - 520, - 602, - 712, - 540, - 475, - 668, - 319, - 343, - 288, - 596, - 529, - 455, - 333, - 425, - 553, - 544, - 580, - 557, - 474, - 613, - 642, - 469, - 535, - 297, - 426, - 238, - 437, - 516, - 327, - 426, - 570, - 141, - 330, - 543, - 543, - 418, - 504, - 367, - 472, - 790, - 567, - 462, - 535, - 499, - 469, - 290, - 330, - 528, - 520, - 522, - 326, - 777, - 678, - 759, - 700, - 526, - 360, - 390, - 589, - 705, - 506, - 538, - 364, - 506, - 494, - 606, - 596, - 634, - 170, - 564, - 406, - 545, - 548, - 691, - 520, - 454, - 423, - 491, - 492, - 482, - 476, - 321, - 563, - 642, - 433, - 359, - 560, - 435, - 346, - 406, - 560, - 472, - 450, - 412, - 432, - 343, - 597, - 189, - 429, - 647, - 369, - 588, - 692, - 294, - 246, - 403, - 233, - 463, - 528, - 551, - 288, - 565, - 385, - 567, - 520, - 595, - 440, - 498, - 768, - 769, - 436, - 592, - 382, - 785, - 410, - 806, - 473, - 752, - 382, - 454, - 341, - 505, - 446, - 299, - 770, - 284, - 692, - 649, - 448, - 632, - 847, - 501, - 478, - 547, - 374, - 494, - 456, - 548, - 433, - 239, - 297, - 458, - 338, - 359, - 770, - 689, - 593, - 418, - 293, - 724, - 521, - 515, - 530, - 143, - 535, - 304, - 518, - 498, - 614, - 498, - 508, - 770, - 312, - 515, - 512, - 441, - 612, - 612, - 522, - 674, - 320, - 473, - 562, - 517, - 558, - 361, - 577, - 423, - 592, - 417, - 416, - 462, - 355, - 649, - 758, - 423, - 503, - 367, - 643, - 337, - 403, - 369, - 566, - 506, - 286, - 459, - 398, - 666, - 307, - 572, - 257, - 301, - 507, - 241, - 547, - 718, - 398, - 434, - 572, - 306, - 453, - 593, - 450, - 405, - 610, - 543, - 618, - 757, - 556, - 359, - 403, - 575, - 478, - 294, - 473, - 634, - 570, - 459, - 634, - 599, - 489, - 344, - 332, - 631, - 520, - 538, - 412, - 407, - 428, - 542, - 589, - 870, - 452, - 443, - 402, - 625, - 460, - 440, - 508, - 758, - 290, - 611, - 316, - 468, - 762, - 456, - 604, - 402, - 575, - 568, - 442, - 291, - 564, - 521, - 564, - 426, - 584, - 460, - 590, - 429, - 458, - 444, - 558, - 629, - 296, - 312, - 507, - 623, - 474, - 420, - 762, - 400, - 434, - 396, - 436, - 528, - 383, - 503, - 349, - 421, - 616, - 406, - 355, - 482, - 537, - 464, - 529, - 505, - 487, - 280, - 644, - 407, - 446, - 613, - 611, - 754, - 205, - 382, - 862, - 471, - 415, - 417, - 500, - 760, - 713, - 609, - 519, - 416, - 353, - 317, - 453, - 391, - 435, - 543, - 659, - 588, - 481, - 299, - 463, - 497, - 370, - 353, - 417, - 704, - 437, - 385, - 416, - 407, - 291, - 486, - 514, - 285, - 412, - 642, - 509, - 457, - 574, - 510, - 549, - 584, - 525, - 401, - 740, - 356, - 495, - 530, - 456, - 611, - 487, - 243, - 419, - 372, - 597, - 439, - 282, - 586, - 479, - 497, - 787, - 607, - 543, - 680, - 688, - 634, - 285, - 457, - 584, - 312, - 568, - 307, - 631, - 354, - 468, - 489, - 675, - 459, - 387, - 546, - 490, - 572, - 696, - 450, - 478, - 511, - 474, - 327, - 519, - 649, - 569, - 511, - 331, - 449, - 793, - 461, - 831, - 417, - 424, - 451, - 750, - 475, - 552, - 689, - 403, - 308, - 498, - 621, - 510, - 425, - 457, - 390, - 437, - 651, - 441, - 398, - 485, - 408, - 386, - 470, - 323, - 607, - 673, - 469, - 621, - 517, - 453, - 381, - 581, - 434, - 625, - 511, - 678, - 528, - 308, - 351, - 321, - 452, - 572, - 577, - 600, - 405, - 425, - 494, - 460, - 557, - 384, - 472, - 579, - 663, - 488, - 787, - 613, - 686, - 452, - 401, - 461, - 709, - 390, - 390, - 498, - 334, - 446, - 491, - 467, - 610, - 337, - 417, - 360, - 356, - 617, - 433, - 293, - 453, - 489, - 332, - 389, - 357, - 489, - 576, - 470, - 386, - 539, - 401, - 781, - 468, - 420, - 689, - 440, - 352, - 524, - 532, - 494, - 336, - 238, - 509, - 567, - 347, - 403, - 360, - 425, - 739, - 484, - 597, - 408, - 613, - 376, - 646, - 555, - 574, - 490, - 499, - 415, - 548, - 718, - 558, - 277, - 483, - 359, - 292, - 568, - 491, - 226, - 461, - 496, - 252, - 617, - 561, - 512, - 524, - 459, - 554, - 636, - 736, - 323, - 617, - 484, - 504, - 582, - 425, - 421, - 349, - 794, - 559, - 512, - 407, - 592, - 715, - 520, - 452, - 247, - 547, - 318, - 448, - 485, - 436, - 459, - 369, - 594, - 394, - 711, - 683, - 274, - 319, - 428, - 532, - 563, - 368, - 724, - 395, - 410, - 312, - 424, - 362, - 297, - 380, - 433, - 414, - 448, - 422, - 430, - 613, - 582, - 542, - 503, - 580, - 362, - 464, - 570, - 689, - 396, - 278, - 574, - 467, - 481, - 640, - 731, - 279, - 407, - 353, - 696, - 629, - 453, - 278, - 350, - 625, - 462, - 658, - 339, - 494, - 363, - 511, - 414, - 526, - 805, - 501, - 265, - 628, - 357, - 534, - 444, - 497, - 504, - 462, - 349, - 529, - 591, - 388, - 220, - 297, - 478, - 393, - 365, - 371, - 437, - 515, - 717, - 486, - 382, - 769, - 352, - 454, - 537, - 387, - 432, - 382, - 682, - 189, - 263, - 902, - 513, - 391, - 526, - 239, - 700, - 457, - 680, - 415, - 298, - 436, - 424, - 466, - 328, - 486, - 664, - 405, - 451, - 451, - 711, - 461, - 392, - 478, - 422, - 467, - 330, - 534, - 743, - 744, - 395, - 588, - 546, - 578, - 655, - 532, - 476, - 621, - 508, - 270, - 294, - 654, - 522, - 581, - 563, - 317, - 542, - 449, - 392, - 570, - 523, - 380, - 901, - 364, - 497, - 325, - 472, - 550, - 564, - 523, - 585, - 311, - 375, - 513, - 670, - 501, - 359, - 604, - 661, - 683, - 577, - 321, - 391, - 476, - 699, - 391, - 429, - 639, - 509, - 353, - 686, - 452, - 593, - 408, - 778, - 450, - 291, - 469, - 376, - 479, - 488, - 577, - 448, - 290, - 501, - 401, - 566, - 370, - 360, - 381, - 367, - 654, - 453, - 338, - 571, - 457, - 359, - 408, - 672, - 498, - 180, - 522, - 362, - 487, - 333, - 661, - 531, - 185, - 335, - 451, - 464, - 591, - 714, - 700, - 576, - 539, - 602, - 496, - 579, - 380, - 536, - 371, - 466, - 560, - 461, - 218, - 813, - 623, - 716, - 584, - 575, - 650, - 452, - 467, - 340, - 317, - 795, - 563, - 730, - 638, - 343, - 403, - 438, - 551, - 322, - 473, - 601, - 656, - 526, - 427, - 541, - 531, - 348, - 619, - 494, - 266, - 356, - 397, - 516, - 541, - 726, - 323, - 376, - 505, - 387, - 444, - 348, - 557, - 623, - 705, - 767, - 494, - 441, - 522, - 480, - 188, - 337, - 566, - 533, - 480, - 538, - 559, - 255, - 630, - 494, - 288, - 408, - 563, - 601, - 404, - 252, - 494, - 584, - 612, - 667, - 399, - 564, - 326, - 376, - 685, - 403, - 519, - 507, - 519, - 463, - 527, - 556, - 616, - 456, - 409, - 385, - 470, - 689, - 636, - 297, - 308 - ] - }, - { - "counters": [ - 398, - 391, - 591, - 366, - 533, - 516, - 487, - 330, - 565, - 545, - 323, - 341, - 502, - 372, - 520, - 271, - 509, - 442, - 301, - 427, - 463, - 414, - 509, - 381, - 272, - 620, - 621, - 478, - 671, - 563, - 459, - 587, - 477, - 250, - 350, - 547, - 409, - 388, - 608, - 404, - 402, - 411, - 361, - 547, - 533, - 167, - 394, - 582, - 706, - 619, - 560, - 572, - 411, - 542, - 500, - 519, - 637, - 420, - 325, - 655, - 581, - 542, - 472, - 475, - 563, - 595, - 398, - 447, - 627, - 457, - 428, - 523, - 699, - 509, - 496, - 433, - 344, - 431, - 540, - 649, - 420, - 500, - 473, - 599, - 547, - 520, - 533, - 302, - 515, - 478, - 555, - 325, - 533, - 320, - 645, - 373, - 523, - 591, - 336, - 362, - 476, - 749, - 654, - 471, - 633, - 484, - 420, - 572, - 364, - 537, - 350, - 358, - 452, - 598, - 555, - 746, - 350, - 712, - 485, - 647, - 479, - 399, - 392, - 819, - 370, - 138, - 630, - 617, - 417, - 432, - 539, - 557, - 353, - 578, - 561, - 298, - 493, - 636, - 602, - 299, - 502, - 593, - 226, - 447, - 560, - 248, - 721, - 439, - 484, - 575, - 435, - 350, - 560, - 229, - 782, - 437, - 315, - 649, - 553, - 490, - 613, - 629, - 511, - 481, - 468, - 619, - 379, - 698, - 334, - 264, - 678, - 446, - 579, - 569, - 433, - 271, - 533, - 216, - 419, - 711, - 477, - 474, - 455, - 413, - 165, - 406, - 343, - 601, - 348, - 620, - 473, - 470, - 187, - 355, - 502, - 471, - 408, - 749, - 313, - 322, - 395, - 467, - 790, - 568, - 375, - 339, - 682, - 303, - 223, - 692, - 808, - 677, - 388, - 180, - 560, - 570, - 447, - 556, - 331, - 202, - 574, - 298, - 461, - 445, - 358, - 273, - 253, - 467, - 631, - 400, - 430, - 384, - 410, - 686, - 570, - 446, - 321, - 369, - 382, - 486, - 287, - 336, - 295, - 274, - 396, - 413, - 604, - 503, - 341, - 597, - 416, - 368, - 187, - 324, - 589, - 600, - 313, - 679, - 586, - 292, - 428, - 552, - 776, - 426, - 538, - 566, - 600, - 458, - 559, - 410, - 539, - 756, - 583, - 486, - 557, - 506, - 457, - 540, - 548, - 624, - 360, - 458, - 562, - 671, - 444, - 199, - 518, - 445, - 556, - 656, - 541, - 228, - 546, - 523, - 497, - 401, - 620, - 551, - 651, - 587, - 586, - 453, - 425, - 699, - 571, - 587, - 423, - 443, - 474, - 567, - 764, - 524, - 492, - 198, - 726, - 860, - 330, - 313, - 324, - 439, - 443, - 564, - 389, - 390, - 263, - 442, - 452, - 573, - 576, - 507, - 501, - 573, - 554, - 552, - 493, - 531, - 531, - 564, - 604, - 606, - 401, - 523, - 323, - 766, - 631, - 599, - 400, - 376, - 371, - 599, - 628, - 353, - 302, - 680, - 396, - 721, - 750, - 321, - 752, - 669, - 202, - 530, - 502, - 472, - 719, - 703, - 159, - 621, - 556, - 472, - 328, - 359, - 406, - 447, - 514, - 416, - 641, - 551, - 747, - 388, - 471, - 565, - 537, - 698, - 603, - 419, - 404, - 633, - 603, - 380, - 568, - 549, - 710, - 450, - 465, - 522, - 464, - 520, - 273, - 628, - 511, - 476, - 895, - 344, - 525, - 435, - 362, - 700, - 548, - 376, - 667, - 573, - 546, - 633, - 830, - 342, - 432, - 727, - 400, - 551, - 488, - 614, - 390, - 875, - 350, - 454, - 476, - 469, - 542, - 508, - 470, - 370, - 498, - 402, - 439, - 535, - 393, - 479, - 657, - 542, - 432, - 721, - 304, - 526, - 554, - 369, - 411, - 469, - 191, - 549, - 381, - 453, - 266, - 704, - 571, - 489, - 641, - 426, - 561, - 393, - 413, - 408, - 468, - 534, - 490, - 578, - 354, - 411, - 630, - 490, - 671, - 511, - 557, - 573, - 618, - 682, - 473, - 598, - 528, - 459, - 524, - 307, - 391, - 523, - 403, - 336, - 470, - 545, - 464, - 487, - 719, - 432, - 491, - 621, - 323, - 383, - 571, - 809, - 292, - 671, - 482, - 603, - 288, - 354, - 567, - 244, - 326, - 364, - 513, - 570, - 484, - 461, - 501, - 619, - 856, - 406, - 530, - 322, - 393, - 214, - 488, - 465, - 404, - 678, - 418, - 208, - 534, - 571, - 521, - 257, - 420, - 387, - 745, - 283, - 516, - 447, - 781, - 534, - 308, - 689, - 397, - 546, - 262, - 515, - 567, - 413, - 396, - 489, - 666, - 318, - 679, - 389, - 488, - 459, - 296, - 588, - 303, - 464, - 407, - 482, - 423, - 458, - 498, - 439, - 570, - 456, - 390, - 451, - 454, - 658, - 543, - 621, - 356, - 359, - 227, - 668, - 344, - 405, - 360, - 498, - 387, - 596, - 531, - 815, - 713, - 524, - 540, - 426, - 358, - 671, - 425, - 573, - 445, - 586, - 438, - 415, - 365, - 296, - 556, - 600, - 413, - 375, - 587, - 394, - 427, - 755, - 741, - 539, - 665, - 304, - 650, - 422, - 562, - 463, - 480, - 533, - 815, - 405, - 442, - 430, - 410, - 478, - 378, - 555, - 409, - 457, - 598, - 230, - 644, - 503, - 507, - 387, - 450, - 532, - 683, - 380, - 584, - 504, - 492, - 572, - 583, - 388, - 292, - 338, - 686, - 636, - 467, - 657, - 325, - 509, - 291, - 468, - 528, - 770, - 577, - 381, - 599, - 771, - 576, - 253, - 558, - 419, - 423, - 507, - 358, - 364, - 381, - 472, - 497, - 524, - 308, - 577, - 369, - 476, - 387, - 641, - 515, - 430, - 335, - 331, - 563, - 406, - 468, - 512, - 462, - 423, - 249, - 339, - 350, - 493, - 787, - 660, - 558, - 448, - 641, - 365, - 581, - 742, - 425, - 607, - 546, - 576, - 462, - 575, - 460, - 600, - 667, - 435, - 517, - 417, - 540, - 558, - 381, - 374, - 440, - 215, - 310, - 476, - 521, - 618, - 448, - 428, - 391, - 340, - 397, - 528, - 297, - 796, - 624, - 412, - 342, - 692, - 475, - 533, - 561, - 819, - 396, - 481, - 350, - 664, - 340, - 591, - 302, - 682, - 545, - 636, - 569, - 475, - 362, - 470, - 835, - 894, - 671, - 722, - 543, - 484, - 420, - 546, - 666, - 678, - 390, - 655, - 432, - 396, - 582, - 588, - 293, - 349, - 486, - 344, - 712, - 529, - 506, - 516, - 373, - 361, - 452, - 748, - 503, - 673, - 575, - 495, - 514, - 688, - 458, - 418, - 249, - 399, - 250, - 511, - 379, - 352, - 499, - 637, - 501, - 666, - 714, - 417, - 642, - 367, - 689, - 574, - 351, - 435, - 514, - 651, - 378, - 305, - 747, - 472, - 501, - 354, - 578, - 410, - 420, - 702, - 518, - 585, - 445, - 497, - 362, - 507, - 740, - 515, - 619, - 444, - 439, - 427, - 569, - 409, - 383, - 254, - 455, - 274, - 614, - 412, - 494, - 443, - 565, - 567, - 272, - 417, - 425, - 533, - 608, - 876, - 307, - 508, - 451, - 513, - 457, - 453, - 311, - 461, - 492, - 247, - 576, - 599, - 476, - 404, - 772, - 338, - 383, - 545, - 527, - 339, - 566, - 627, - 603, - 447, - 559, - 457, - 472, - 574, - 457, - 516, - 652, - 759, - 332, - 551, - 560, - 701, - 439, - 349, - 278, - 516, - 591, - 652, - 448, - 377, - 507, - 437, - 476, - 513, - 564, - 628, - 426, - 409, - 441, - 775, - 380, - 444, - 628, - 498, - 581, - 536, - 596, - 461, - 462, - 366, - 805, - 446, - 745, - 464, - 619, - 343, - 760, - 448, - 389, - 587, - 461, - 459, - 403, - 382, - 642, - 427, - 511, - 491, - 608, - 326, - 398, - 520, - 604, - 452, - 372, - 503, - 273, - 740, - 375, - 459, - 417, - 545, - 521, - 480, - 666, - 343, - 310, - 452, - 457, - 509, - 437, - 551, - 456, - 520, - 681, - 615, - 414, - 234, - 411, - 566, - 490, - 579, - 405, - 399, - 732, - 660, - 365, - 771, - 643, - 528, - 349, - 458, - 518, - 453, - 567, - 592, - 583, - 443, - 560, - 573, - 532, - 369, - 469, - 348, - 388, - 439, - 377, - 453, - 580, - 516, - 723, - 253, - 609, - 776, - 443, - 282, - 566, - 379, - 532, - 531, - 542, - 442, - 487, - 623, - 597, - 592, - 471, - 526, - 428, - 317, - 458, - 450, - 617, - 656, - 442, - 554, - 460, - 545, - 413, - 575, - 610, - 472, - 370, - 556, - 510, - 549, - 504, - 414, - 552, - 595, - 467, - 471, - 342, - 481, - 688, - 509, - 487, - 701, - 487, - 683, - 548, - 700, - 373, - 597, - 697, - 770, - 393, - 528, - 458, - 572, - 429, - 697, - 418, - 657, - 496, - 545, - 367, - 577, - 297, - 486, - 362, - 268, - 504, - 292, - 543, - 507, - 434, - 484, - 453, - 427, - 908, - 520, - 367, - 603, - 337, - 487, - 642, - 340, - 567, - 501, - 258, - 795, - 679, - 468, - 512, - 774, - 514, - 481, - 583, - 398, - 338, - 541, - 489, - 572, - 558, - 527, - 337, - 428, - 606, - 236, - 468, - 554, - 520, - 438, - 531, - 395, - 701, - 379, - 284, - 433, - 453, - 355, - 380, - 424, - 603, - 287, - 472, - 397, - 304, - 605, - 553, - 514, - 375, - 438, - 481, - 652, - 701, - 375, - 586, - 520, - 327, - 457, - 386, - 540, - 463, - 744, - 588, - 258, - 457, - 655, - 539, - 452, - 504, - 456, - 371, - 205, - 455, - 537, - 417, - 807, - 498, - 516, - 405, - 365, - 487, - 642, - 399, - 565, - 324, - 560, - 257, - 610, - 342, - 256, - 477, - 486, - 800, - 588, - 416, - 645, - 206, - 438, - 296, - 240, - 466, - 374, - 258, - 357, - 515, - 284, - 616, - 573, - 569, - 316, - 526, - 288, - 439, - 713, - 439, - 606, - 664, - 427, - 363, - 189, - 523, - 517, - 186, - 593, - 505, - 592, - 522, - 638, - 466, - 539, - 516, - 481, - 508, - 332, - 224, - 711, - 568, - 564, - 508, - 486, - 633, - 509, - 576, - 482, - 446, - 514, - 502, - 470, - 389, - 364, - 407, - 869, - 536, - 592, - 144, - 564, - 473, - 838, - 438, - 257, - 400, - 537, - 497, - 406, - 398, - 513, - 544, - 667, - 677, - 525, - 300, - 512, - 451, - 514, - 391, - 371, - 383, - 583, - 314, - 418, - 396, - 355, - 454, - 494, - 504, - 448, - 390, - 627, - 464, - 279, - 547, - 439, - 560, - 457, - 429, - 480, - 502, - 394, - 516, - 348, - 438, - 642, - 331, - 525, - 353, - 323, - 492, - 879, - 375, - 443, - 234, - 458, - 471, - 554, - 395, - 543, - 564, - 553, - 355, - 643, - 346, - 630, - 716, - 479, - 646, - 443, - 480, - 344, - 925, - 248, - 556, - 671, - 481, - 597, - 425, - 596, - 453, - 539, - 369, - 568, - 438, - 654, - 269, - 475, - 344, - 538, - 579, - 391, - 503, - 506, - 638, - 592, - 387, - 617, - 535, - 471, - 397, - 564, - 373, - 619, - 417, - 434, - 437, - 452, - 450, - 941, - 588, - 433, - 348, - 449, - 460, - 490, - 446, - 661, - 342, - 568, - 428, - 447, - 291, - 611, - 408, - 467, - 456, - 608, - 442, - 538, - 398, - 424, - 539, - 400, - 538, - 604, - 467, - 530, - 336, - 585, - 767, - 430, - 504, - 384, - 743, - 563, - 543, - 546, - 522, - 390, - 730, - 421, - 316, - 706, - 527, - 686, - 658, - 544, - 330, - 717, - 701, - 434, - 311, - 250, - 733, - 435, - 560, - 550, - 629, - 408, - 413, - 622, - 595, - 381, - 622, - 618, - 625, - 557, - 469, - 371, - 532, - 575, - 695, - 554, - 631, - 512, - 380, - 374, - 563, - 453, - 388, - 520, - 562, - 433, - 536, - 543, - 578, - 390, - 445, - 601, - 464, - 531, - 589, - 769, - 266, - 493, - 371, - 515, - 371, - 500, - 806, - 505, - 277, - 514, - 444, - 446, - 551, - 508, - 533, - 428, - 520, - 553, - 596, - 412, - 596, - 622, - 550, - 349, - 316, - 380, - 495, - 489, - 641, - 474, - 546, - 442, - 555, - 570, - 494, - 679, - 386, - 376, - 427, - 287, - 543, - 320, - 374, - 315, - 466, - 405, - 344, - 477, - 406, - 546, - 572, - 423, - 413, - 468, - 340, - 457, - 542, - 478, - 617, - 470, - 655, - 378, - 345, - 359, - 490, - 346, - 429, - 600, - 317, - 472, - 393, - 568, - 467, - 656, - 514, - 222, - 486, - 548, - 688, - 375, - 458, - 675, - 599, - 329, - 243, - 408, - 279, - 440, - 795, - 597, - 194, - 366, - 532, - 696, - 383, - 411, - 360, - 324, - 678, - 302, - 618, - 495, - 507, - 618, - 634, - 304, - 665, - 379, - 615, - 319, - 353, - 489, - 534, - 483, - 369, - 458, - 324, - 347, - 573, - 385, - 396, - 492, - 501, - 769, - 381, - 637, - 352, - 437, - 569, - 759, - 594, - 325, - 556, - 700, - 472, - 563, - 321, - 368, - 597, - 469, - 367, - 531, - 390, - 419, - 395, - 551, - 441, - 494, - 534, - 864, - 427, - 379, - 357, - 498, - 610, - 353, - 418, - 296, - 448, - 637, - 675, - 313, - 499, - 405, - 315, - 454, - 705, - 502, - 569, - 392, - 456, - 729, - 591, - 657, - 234, - 437, - 504, - 549, - 530, - 498, - 487, - 354, - 478, - 269, - 435, - 331, - 352, - 564, - 469, - 301, - 583, - 339, - 540, - 230, - 654, - 492, - 434, - 320, - 681, - 517, - 506, - 356, - 373, - 543, - 503, - 553, - 426, - 594, - 566, - 507, - 793, - 292, - 501, - 465, - 585, - 707, - 733, - 354, - 497, - 495, - 318, - 354, - 370, - 453, - 316, - 603, - 541, - 197, - 507, - 477, - 504, - 522, - 593, - 519, - 716, - 568, - 425, - 457, - 423, - 649, - 283, - 532, - 381, - 639, - 478, - 608, - 422, - 359, - 776, - 307, - 452, - 286, - 463, - 626, - 374, - 397, - 427, - 572, - 386, - 311, - 329, - 570, - 533, - 666, - 496, - 425, - 447, - 506, - 570, - 453, - 441, - 445, - 566, - 416, - 626, - 821, - 660, - 343, - 203, - 423, - 507, - 316, - 521, - 688, - 584, - 496, - 666, - 552, - 657, - 330, - 751, - 827, - 691, - 482, - 302, - 212, - 640, - 570, - 503, - 633, - 604, - 496, - 698, - 312, - 446, - 324, - 431, - 525, - 604, - 370, - 508, - 342, - 625, - 416, - 599, - 343, - 636, - 677, - 306, - 577, - 279, - 579, - 429, - 511, - 500, - 731, - 300, - 538, - 539, - 504, - 539, - 459, - 381, - 314, - 809, - 778, - 605, - 657, - 373, - 301, - 586, - 376, - 472, - 415, - 602, - 236, - 409, - 524, - 589, - 410, - 460, - 464, - 309, - 469, - 492, - 378, - 609, - 457, - 530, - 537, - 657, - 712, - 299, - 592, - 328, - 229, - 514, - 523, - 364, - 755, - 461, - 906, - 441, - 224, - 287, - 259, - 815, - 524, - 369, - 498, - 421, - 716, - 440, - 365, - 551, - 496, - 345, - 822, - 392, - 521, - 763, - 582, - 418, - 423, - 554, - 668, - 485, - 541, - 471, - 223, - 690, - 676, - 367, - 406, - 507, - 486, - 430, - 414, - 498, - 685, - 366, - 571, - 504, - 557, - 542, - 356, - 450, - 602, - 353, - 258, - 489, - 584, - 355, - 375, - 519, - 566, - 313, - 388, - 492, - 694, - 742, - 363, - 490, - 349, - 440, - 472, - 363, - 632, - 716, - 508, - 795, - 428, - 369, - 653, - 444, - 684, - 509, - 183, - 757, - 429, - 238, - 477, - 395, - 307, - 455, - 566, - 769, - 790, - 409, - 476, - 384, - 385, - 306, - 330, - 499, - 625, - 522, - 297, - 484, - 446, - 661, - 576, - 454, - 593, - 363, - 606, - 279, - 421, - 495, - 560, - 419, - 219, - 593, - 274, - 469, - 447, - 242, - 585, - 497, - 546, - 419, - 261, - 239, - 422, - 273, - 503, - 360, - 659, - 436, - 445, - 369, - 190, - 400, - 340, - 439, - 395, - 513, - 223, - 339, - 458, - 526, - 469, - 615, - 593, - 277, - 303, - 431, - 572, - 627, - 543, - 278, - 353, - 366, - 546, - 352, - 595, - 405, - 158, - 509, - 732, - 534, - 686, - 650, - 604, - 397, - 529, - 518, - 445, - 586, - 470, - 440, - 704, - 725, - 329, - 416, - 374, - 431, - 711, - 398, - 286, - 382, - 812, - 339, - 693, - 334, - 634, - 332, - 310, - 274, - 413, - 473, - 551, - 320, - 547, - 458, - 390, - 489, - 572, - 397, - 604, - 407, - 342, - 430, - 530, - 471, - 578, - 413, - 369, - 373, - 380, - 637, - 436, - 378, - 579, - 517, - 519, - 404, - 461, - 476, - 560, - 681, - 440, - 652, - 310, - 581, - 469, - 415, - 457, - 625, - 229, - 210, - 513, - 528, - 524, - 477, - 454, - 514, - 607, - 313, - 384, - 499, - 644, - 476, - 499 - ] - }, - { - "counters": [ - 615, - 538, - 424, - 540, - 353, - 565, - 579, - 637, - 628, - 530, - 292, - 542, - 353, - 670, - 419, - 456, - 526, - 550, - 407, - 422, - 330, - 391, - 472, - 422, - 233, - 583, - 502, - 539, - 225, - 590, - 398, - 504, - 517, - 444, - 493, - 497, - 652, - 493, - 766, - 572, - 332, - 577, - 570, - 395, - 526, - 445, - 632, - 656, - 477, - 530, - 658, - 196, - 505, - 483, - 524, - 656, - 484, - 882, - 503, - 577, - 540, - 552, - 499, - 317, - 533, - 340, - 434, - 475, - 524, - 729, - 454, - 563, - 378, - 522, - 373, - 565, - 365, - 473, - 576, - 559, - 538, - 511, - 580, - 571, - 600, - 460, - 548, - 444, - 381, - 468, - 564, - 662, - 417, - 816, - 279, - 465, - 339, - 495, - 369, - 666, - 431, - 561, - 474, - 407, - 281, - 163, - 235, - 647, - 632, - 663, - 493, - 530, - 347, - 406, - 321, - 503, - 513, - 615, - 542, - 230, - 241, - 436, - 284, - 374, - 469, - 394, - 417, - 429, - 590, - 400, - 463, - 549, - 360, - 148, - 349, - 515, - 527, - 475, - 407, - 540, - 617, - 433, - 558, - 484, - 364, - 623, - 430, - 570, - 506, - 660, - 490, - 397, - 444, - 325, - 561, - 497, - 608, - 481, - 461, - 598, - 557, - 352, - 443, - 467, - 650, - 444, - 272, - 466, - 581, - 447, - 754, - 653, - 507, - 523, - 382, - 619, - 506, - 530, - 444, - 510, - 694, - 472, - 450, - 754, - 391, - 354, - 401, - 411, - 496, - 411, - 457, - 516, - 749, - 610, - 714, - 260, - 401, - 401, - 732, - 426, - 521, - 452, - 339, - 561, - 426, - 159, - 586, - 372, - 436, - 506, - 325, - 419, - 430, - 423, - 572, - 537, - 369, - 542, - 372, - 333, - 514, - 498, - 579, - 844, - 591, - 624, - 548, - 563, - 312, - 474, - 344, - 600, - 483, - 560, - 499, - 216, - 540, - 425, - 512, - 465, - 529, - 464, - 569, - 601, - 370, - 440, - 524, - 528, - 548, - 533, - 395, - 496, - 585, - 355, - 329, - 373, - 602, - 295, - 706, - 733, - 418, - 464, - 457, - 522, - 300, - 519, - 461, - 572, - 302, - 435, - 411, - 508, - 447, - 326, - 683, - 700, - 559, - 452, - 328, - 474, - 541, - 547, - 374, - 526, - 231, - 631, - 91, - 568, - 366, - 430, - 449, - 353, - 695, - 513, - 499, - 465, - 339, - 495, - 460, - 576, - 334, - 611, - 546, - 696, - 393, - 461, - 652, - 443, - 488, - 344, - 559, - 504, - 633, - 392, - 809, - 464, - 374, - 587, - 301, - 473, - 295, - 401, - 506, - 585, - 499, - 721, - 370, - 541, - 413, - 516, - 454, - 493, - 754, - 503, - 453, - 424, - 573, - 714, - 464, - 458, - 364, - 606, - 373, - 436, - 510, - 554, - 706, - 251, - 370, - 498, - 540, - 332, - 526, - 568, - 777, - 298, - 630, - 458, - 579, - 505, - 481, - 457, - 403, - 628, - 475, - 327, - 250, - 606, - 617, - 523, - 558, - 543, - 425, - 525, - 671, - 513, - 444, - 513, - 620, - 555, - 482, - 519, - 463, - 448, - 588, - 686, - 481, - 384, - 329, - 317, - 413, - 372, - 486, - 641, - 718, - 431, - 429, - 635, - 450, - 348, - 306, - 803, - 419, - 397, - 412, - 540, - 711, - 604, - 489, - 478, - 432, - 484, - 221, - 409, - 183, - 617, - 698, - 450, - 515, - 518, - 612, - 786, - 691, - 700, - 490, - 552, - 492, - 171, - 390, - 415, - 459, - 505, - 548, - 333, - 481, - 431, - 467, - 489, - 658, - 334, - 585, - 479, - 286, - 325, - 263, - 348, - 484, - 490, - 466, - 695, - 488, - 461, - 470, - 487, - 493, - 382, - 728, - 632, - 446, - 371, - 372, - 415, - 478, - 568, - 437, - 247, - 498, - 564, - 336, - 566, - 695, - 542, - 499, - 322, - 497, - 330, - 426, - 394, - 430, - 387, - 632, - 493, - 243, - 460, - 436, - 560, - 698, - 520, - 782, - 520, - 794, - 339, - 533, - 697, - 500, - 633, - 562, - 776, - 470, - 497, - 643, - 703, - 472, - 328, - 424, - 412, - 286, - 477, - 393, - 525, - 506, - 282, - 763, - 255, - 436, - 434, - 508, - 598, - 558, - 342, - 548, - 410, - 487, - 493, - 408, - 215, - 635, - 389, - 463, - 341, - 398, - 466, - 429, - 687, - 707, - 445, - 467, - 707, - 576, - 326, - 435, - 476, - 688, - 563, - 400, - 343, - 565, - 452, - 622, - 445, - 570, - 369, - 395, - 393, - 496, - 337, - 482, - 609, - 371, - 513, - 484, - 567, - 559, - 685, - 377, - 482, - 373, - 525, - 456, - 623, - 595, - 531, - 670, - 926, - 351, - 314, - 442, - 192, - 471, - 576, - 403, - 524, - 656, - 853, - 411, - 750, - 483, - 362, - 465, - 493, - 579, - 453, - 228, - 649, - 433, - 575, - 524, - 517, - 393, - 625, - 542, - 562, - 633, - 496, - 539, - 294, - 534, - 465, - 482, - 471, - 370, - 652, - 429, - 942, - 566, - 675, - 606, - 308, - 689, - 583, - 448, - 270, - 737, - 532, - 566, - 540, - 476, - 559, - 480, - 305, - 343, - 539, - 664, - 385, - 430, - 483, - 275, - 520, - 380, - 380, - 487, - 442, - 601, - 403, - 405, - 687, - 630, - 526, - 620, - 508, - 380, - 383, - 396, - 300, - 309, - 501, - 717, - 598, - 748, - 424, - 278, - 552, - 408, - 551, - 500, - 352, - 615, - 392, - 561, - 463, - 636, - 592, - 428, - 382, - 706, - 542, - 607, - 468, - 850, - 533, - 596, - 477, - 573, - 370, - 700, - 657, - 383, - 480, - 648, - 290, - 541, - 377, - 654, - 316, - 523, - 473, - 716, - 474, - 207, - 466, - 294, - 534, - 336, - 439, - 535, - 629, - 375, - 787, - 548, - 480, - 257, - 638, - 512, - 475, - 507, - 302, - 379, - 286, - 694, - 470, - 435, - 740, - 546, - 412, - 243, - 491, - 353, - 556, - 717, - 457, - 358, - 421, - 459, - 609, - 640, - 427, - 332, - 412, - 551, - 904, - 560, - 396, - 445, - 370, - 685, - 418, - 541, - 442, - 533, - 487, - 458, - 399, - 526, - 651, - 512, - 504, - 503, - 532, - 413, - 545, - 340, - 670, - 669, - 411, - 619, - 580, - 599, - 332, - 690, - 703, - 402, - 569, - 462, - 692, - 301, - 428, - 399, - 557, - 455, - 487, - 547, - 355, - 454, - 376, - 723, - 460, - 342, - 452, - 567, - 335, - 532, - 724, - 489, - 357, - 473, - 521, - 882, - 287, - 500, - 277, - 575, - 414, - 405, - 531, - 369, - 400, - 576, - 539, - 665, - 470, - 483, - 696, - 313, - 632, - 579, - 393, - 777, - 613, - 625, - 476, - 344, - 553, - 321, - 449, - 518, - 323, - 426, - 472, - 421, - 419, - 367, - 545, - 402, - 495, - 499, - 577, - 222, - 569, - 602, - 746, - 594, - 387, - 655, - 571, - 520, - 482, - 374, - 226, - 583, - 470, - 622, - 294, - 251, - 294, - 466, - 312, - 648, - 272, - 564, - 477, - 562, - 479, - 520, - 468, - 438, - 320, - 347, - 461, - 370, - 473, - 405, - 581, - 344, - 598, - 611, - 285, - 419, - 429, - 388, - 451, - 452, - 569, - 554, - 612, - 542, - 664, - 392, - 587, - 322, - 408, - 337, - 673, - 459, - 588, - 388, - 525, - 343, - 736, - 679, - 437, - 451, - 377, - 865, - 550, - 367, - 433, - 200, - 416, - 377, - 467, - 306, - 636, - 367, - 454, - 585, - 535, - 490, - 206, - 390, - 451, - 417, - 666, - 710, - 636, - 343, - 270, - 595, - 459, - 805, - 375, - 516, - 249, - 641, - 428, - 458, - 788, - 512, - 566, - 545, - 706, - 393, - 525, - 293, - 514, - 660, - 571, - 536, - 461, - 494, - 509, - 513, - 579, - 303, - 516, - 681, - 456, - 464, - 361, - 412, - 352, - 405, - 503, - 527, - 434, - 571, - 614, - 765, - 354, - 487, - 771, - 452, - 550, - 497, - 742, - 327, - 651, - 416, - 443, - 396, - 405, - 649, - 355, - 782, - 401, - 556, - 738, - 594, - 550, - 313, - 409, - 709, - 461, - 551, - 535, - 517, - 435, - 356, - 661, - 386, - 495, - 555, - 451, - 532, - 515, - 333, - 480, - 440, - 372, - 654, - 325, - 456, - 522, - 724, - 484, - 592, - 342, - 426, - 874, - 393, - 572, - 536, - 699, - 449, - 640, - 317, - 340, - 490, - 469, - 560, - 400, - 495, - 792, - 557, - 522, - 434, - 378, - 429, - 539, - 492, - 441, - 564, - 337, - 476, - 580, - 737, - 487, - 364, - 617, - 544, - 502, - 412, - 470, - 266, - 397, - 542, - 270, - 384, - 541, - 386, - 535, - 405, - 307, - 421, - 779, - 536, - 628, - 575, - 481, - 511, - 372, - 570, - 333, - 531, - 422, - 479, - 483, - 440, - 811, - 531, - 593, - 597, - 759, - 643, - 508, - 283, - 607, - 751, - 772, - 385, - 645, - 230, - 365, - 413, - 637, - 252, - 410, - 644, - 299, - 474, - 451, - 554, - 383, - 689, - 620, - 423, - 290, - 365, - 326, - 413, - 561, - 463, - 246, - 393, - 540, - 417, - 366, - 265, - 697, - 494, - 551, - 754, - 525, - 571, - 471, - 472, - 339, - 447, - 612, - 557, - 513, - 594, - 358, - 188, - 432, - 667, - 580, - 538, - 317, - 395, - 530, - 380, - 488, - 715, - 558, - 259, - 391, - 712, - 287, - 721, - 445, - 613, - 635, - 626, - 577, - 434, - 350, - 494, - 501, - 475, - 463, - 539, - 309, - 455, - 637, - 529, - 561, - 379, - 398, - 613, - 332, - 562, - 369, - 457, - 706, - 510, - 573, - 433, - 723, - 532, - 365, - 518, - 382, - 505, - 585, - 672, - 862, - 407, - 521, - 509, - 295, - 518, - 489, - 349, - 466, - 678, - 553, - 583, - 915, - 523, - 477, - 583, - 460, - 402, - 589, - 347, - 509, - 809, - 496, - 497, - 482, - 563, - 417, - 456, - 761, - 533, - 292, - 381, - 484, - 566, - 420, - 413, - 440, - 439, - 495, - 367, - 374, - 472, - 746, - 428, - 558, - 343, - 467, - 392, - 274, - 479, - 318, - 689, - 295, - 303, - 419, - 385, - 529, - 406, - 545, - 363, - 453, - 395, - 274, - 460, - 341, - 733, - 325, - 469, - 704, - 372, - 525, - 440, - 506, - 594, - 479, - 575, - 559, - 602, - 345, - 266, - 480, - 482, - 443, - 349, - 615, - 718, - 531, - 387, - 341, - 540, - 497, - 498, - 455, - 318, - 368, - 658, - 451, - 606, - 500, - 501, - 549, - 690, - 200, - 448, - 266, - 618, - 398, - 555, - 448, - 368, - 429, - 438, - 507, - 610, - 662, - 459, - 574, - 457, - 591, - 448, - 334, - 416, - 474, - 560, - 560, - 513, - 465, - 356, - 357, - 498, - 400, - 453, - 505, - 564, - 317, - 390, - 343, - 485, - 559, - 285, - 417, - 558, - 650, - 658, - 505, - 427, - 397, - 974, - 763, - 444, - 476, - 507, - 313, - 591, - 531, - 521, - 497, - 411, - 469, - 527, - 716, - 674, - 484, - 273, - 401, - 515, - 750, - 321, - 626, - 598, - 324, - 272, - 511, - 455, - 407, - 557, - 702, - 503, - 769, - 494, - 637, - 705, - 388, - 507, - 444, - 585, - 491, - 472, - 480, - 361, - 484, - 497, - 477, - 441, - 552, - 478, - 559, - 349, - 450, - 360, - 473, - 423, - 510, - 493, - 620, - 459, - 582, - 298, - 430, - 605, - 499, - 430, - 477, - 468, - 500, - 660, - 555, - 396, - 561, - 596, - 656, - 530, - 490, - 393, - 293, - 350, - 559, - 424, - 709, - 337, - 423, - 614, - 448, - 439, - 495, - 554, - 577, - 399, - 676, - 706, - 664, - 520, - 276, - 523, - 402, - 494, - 565, - 422, - 376, - 287, - 333, - 515, - 615, - 596, - 655, - 547, - 340, - 316, - 688, - 302, - 397, - 353, - 323, - 528, - 677, - 642, - 536, - 455, - 499, - 616, - 434, - 474, - 451, - 431, - 535, - 502, - 496, - 682, - 568, - 417, - 570, - 680, - 534, - 604, - 767, - 435, - 536, - 327, - 497, - 290, - 294, - 361, - 622, - 611, - 509, - 380, - 300, - 401, - 525, - 343, - 254, - 630, - 414, - 558, - 495, - 543, - 660, - 394, - 450, - 377, - 628, - 330, - 391, - 381, - 411, - 440, - 462, - 686, - 337, - 264, - 326, - 351, - 354, - 467, - 624, - 378, - 351, - 626, - 407, - 556, - 490, - 410, - 327, - 636, - 583, - 466, - 520, - 634, - 604, - 445, - 182, - 470, - 493, - 377, - 589, - 576, - 484, - 426, - 656, - 710, - 460, - 382, - 658, - 644, - 384, - 706, - 515, - 462, - 383, - 496, - 608, - 395, - 601, - 368, - 536, - 500, - 451, - 524, - 404, - 512, - 318, - 505, - 463, - 440, - 476, - 579, - 597, - 226, - 556, - 386, - 624, - 546, - 452, - 589, - 782, - 580, - 581, - 749, - 509, - 569, - 532, - 331, - 391, - 378, - 429, - 447, - 587, - 324, - 638, - 141, - 449, - 446, - 146, - 314, - 483, - 435, - 410, - 393, - 444, - 368, - 571, - 545, - 536, - 375, - 386, - 649, - 686, - 642, - 432, - 635, - 337, - 461, - 751, - 767, - 639, - 464, - 570, - 386, - 488, - 608, - 404, - 537, - 558, - 485, - 444, - 290, - 468, - 511, - 521, - 551, - 756, - 552, - 602, - 219, - 449, - 300, - 284, - 436, - 664, - 590, - 493, - 331, - 504, - 520, - 516, - 315, - 351, - 224, - 617, - 369, - 497, - 332, - 518, - 540, - 430, - 452, - 378, - 512, - 485, - 379, - 363, - 512, - 281, - 261, - 512, - 416, - 641, - 450, - 396, - 768, - 368, - 649, - 585, - 420, - 541, - 317, - 640, - 349, - 457, - 389, - 497, - 619, - 637, - 236, - 289, - 288, - 379, - 624, - 661, - 466, - 414, - 489, - 554, - 333, - 594, - 588, - 364, - 681, - 475, - 534, - 496, - 456, - 433, - 521, - 361, - 531, - 439, - 253, - 578, - 408, - 653, - 446, - 444, - 683, - 346, - 391, - 441, - 511, - 495, - 318, - 347, - 207, - 476, - 610, - 474, - 535, - 442, - 545, - 317, - 410, - 376, - 439, - 492, - 447, - 415, - 540, - 617, - 555, - 508, - 325, - 453, - 295, - 352, - 593, - 415, - 381, - 320, - 604, - 545, - 465, - 762, - 683, - 491, - 477, - 334, - 555, - 768, - 297, - 430, - 592, - 429, - 498, - 543, - 308, - 488, - 331, - 504, - 513, - 589, - 506, - 563, - 367, - 444, - 432, - 528, - 512, - 597, - 426, - 508, - 576, - 548, - 449, - 571, - 314, - 347, - 539, - 190, - 395, - 558, - 375, - 490, - 520, - 464, - 373, - 471, - 438, - 382, - 567, - 319, - 394, - 513, - 632, - 411, - 304, - 258, - 405, - 568, - 466, - 356, - 631, - 417, - 658, - 213, - 256, - 218, - 537, - 540, - 551, - 388, - 670, - 439, - 439, - 619, - 530, - 565, - 610, - 403, - 470, - 464, - 437, - 429, - 432, - 697, - 412, - 576, - 550, - 608, - 383, - 479, - 345, - 507, - 283, - 737, - 724, - 313, - 486, - 701, - 396, - 514, - 309, - 360, - 439, - 602, - 468, - 472, - 683, - 387, - 432, - 380, - 547, - 385, - 596, - 519, - 679, - 469, - 625, - 483, - 501, - 450, - 356, - 428, - 657, - 630, - 546, - 602, - 569, - 378, - 335, - 662, - 604, - 397, - 517, - 432, - 482, - 421, - 477, - 411, - 463, - 624, - 471, - 371, - 469, - 467, - 475, - 462, - 720, - 460, - 565, - 339, - 438, - 473, - 237, - 540, - 387, - 517, - 498, - 416, - 450, - 737, - 422, - 438, - 594, - 499, - 594, - 429, - 450, - 681, - 652, - 500, - 566, - 527, - 693, - 607, - 616, - 629, - 667, - 351, - 388, - 423, - 501, - 458, - 469, - 699, - 550, - 560, - 496, - 502, - 630, - 633, - 351, - 250, - 555, - 488, - 550, - 599, - 383, - 501, - 315, - 432, - 468, - 560, - 463, - 404, - 497, - 579, - 482, - 564, - 286, - 383, - 474, - 611, - 764, - 426, - 646, - 407, - 739, - 544, - 682, - 516, - 386, - 683, - 486, - 487, - 484, - 372, - 537, - 402, - 357, - 520, - 440, - 228, - 380, - 599, - 382, - 728, - 512, - 239, - 482, - 315, - 372, - 312, - 498, - 533, - 575, - 366, - 533, - 409, - 503, - 401, - 504, - 399, - 659, - 206, - 569, - 513, - 441, - 365, - 543, - 183, - 360, - 539, - 427, - 719, - 564, - 426, - 392, - 344, - 457, - 494, - 410, - 362, - 507, - 548, - 527, - 577, - 264, - 528, - 435, - 584, - 603, - 474, - 548, - 500, - 1006, - 572, - 539, - 426, - 598, - 503, - 410, - 440, - 349, - 551, - 665, - 484, - 651, - 292, - 365, - 508, - 454, - 337, - 523, - 343 - ] - }, - { - "counters": [ - 454, - 729, - 417, - 387, - 474, - 441, - 343, - 453, - 759, - 429, - 506, - 408, - 434, - 400, - 402, - 531, - 329, - 635, - 405, - 450, - 431, - 545, - 246, - 613, - 208, - 453, - 481, - 427, - 602, - 431, - 396, - 444, - 432, - 488, - 453, - 367, - 440, - 434, - 275, - 433, - 434, - 487, - 694, - 427, - 478, - 446, - 405, - 436, - 379, - 631, - 334, - 329, - 360, - 511, - 521, - 708, - 467, - 428, - 473, - 225, - 444, - 400, - 444, - 615, - 502, - 469, - 595, - 543, - 434, - 715, - 685, - 259, - 334, - 376, - 453, - 523, - 743, - 732, - 572, - 444, - 396, - 355, - 667, - 505, - 458, - 556, - 566, - 425, - 638, - 384, - 568, - 521, - 218, - 502, - 267, - 537, - 318, - 452, - 483, - 451, - 331, - 342, - 905, - 490, - 322, - 265, - 399, - 426, - 448, - 668, - 302, - 467, - 721, - 531, - 497, - 293, - 475, - 542, - 194, - 348, - 464, - 405, - 193, - 685, - 572, - 645, - 574, - 510, - 414, - 187, - 467, - 512, - 409, - 421, - 392, - 378, - 538, - 489, - 511, - 544, - 502, - 683, - 716, - 401, - 475, - 434, - 320, - 490, - 405, - 454, - 569, - 521, - 668, - 587, - 398, - 540, - 458, - 374, - 362, - 462, - 255, - 615, - 536, - 599, - 502, - 320, - 258, - 400, - 471, - 621, - 405, - 374, - 576, - 488, - 331, - 305, - 504, - 409, - 387, - 557, - 565, - 220, - 397, - 296, - 615, - 530, - 727, - 528, - 484, - 589, - 656, - 783, - 373, - 530, - 565, - 482, - 367, - 453, - 347, - 631, - 598, - 217, - 673, - 332, - 621, - 730, - 648, - 502, - 617, - 480, - 278, - 507, - 663, - 468, - 773, - 589, - 377, - 357, - 517, - 444, - 344, - 500, - 612, - 520, - 591, - 396, - 448, - 379, - 707, - 377, - 529, - 584, - 389, - 406, - 634, - 510, - 315, - 413, - 327, - 385, - 476, - 470, - 284, - 591, - 435, - 705, - 528, - 484, - 363, - 763, - 263, - 571, - 396, - 405, - 601, - 657, - 550, - 401, - 440, - 596, - 303, - 551, - 446, - 784, - 344, - 475, - 515, - 440, - 716, - 562, - 618, - 559, - 520, - 408, - 485, - 274, - 364, - 295, - 598, - 464, - 622, - 654, - 681, - 573, - 562, - 516, - 366, - 379, - 537, - 616, - 618, - 412, - 586, - 629, - 400, - 294, - 161, - 422, - 548, - 423, - 483, - 747, - 563, - 566, - 329, - 286, - 581, - 395, - 363, - 658, - 614, - 501, - 738, - 531, - 454, - 488, - 456, - 453, - 214, - 451, - 390, - 426, - 465, - 556, - 571, - 417, - 381, - 644, - 503, - 328, - 407, - 485, - 340, - 511, - 436, - 742, - 606, - 490, - 303, - 354, - 636, - 564, - 435, - 444, - 329, - 560, - 473, - 582, - 319, - 392, - 304, - 747, - 515, - 508, - 535, - 278, - 463, - 600, - 678, - 488, - 571, - 575, - 774, - 421, - 431, - 390, - 426, - 314, - 424, - 408, - 475, - 338, - 354, - 362, - 658, - 559, - 415, - 366, - 390, - 873, - 423, - 450, - 586, - 480, - 594, - 620, - 572, - 530, - 622, - 417, - 631, - 410, - 340, - 499, - 588, - 631, - 556, - 339, - 584, - 550, - 472, - 552, - 560, - 503, - 339, - 175, - 398, - 659, - 356, - 331, - 446, - 485, - 294, - 351, - 690, - 237, - 173, - 373, - 542, - 432, - 374, - 374, - 721, - 600, - 411, - 468, - 451, - 464, - 577, - 568, - 633, - 629, - 391, - 286, - 354, - 401, - 525, - 714, - 628, - 528, - 461, - 547, - 513, - 514, - 597, - 629, - 394, - 695, - 652, - 342, - 416, - 420, - 308, - 499, - 485, - 694, - 214, - 377, - 641, - 249, - 436, - 458, - 515, - 510, - 409, - 549, - 654, - 716, - 626, - 554, - 384, - 547, - 526, - 692, - 657, - 382, - 363, - 365, - 484, - 527, - 342, - 443, - 707, - 345, - 475, - 504, - 449, - 566, - 487, - 524, - 507, - 458, - 512, - 487, - 459, - 443, - 277, - 421, - 463, - 420, - 452, - 464, - 478, - 624, - 688, - 489, - 530, - 578, - 429, - 467, - 199, - 465, - 526, - 496, - 494, - 453, - 688, - 479, - 501, - 666, - 425, - 471, - 465, - 791, - 346, - 523, - 741, - 662, - 457, - 532, - 290, - 468, - 681, - 526, - 427, - 618, - 308, - 358, - 367, - 309, - 490, - 480, - 513, - 545, - 377, - 510, - 469, - 559, - 477, - 526, - 452, - 370, - 372, - 517, - 432, - 299, - 279, - 533, - 520, - 349, - 230, - 449, - 428, - 595, - 256, - 542, - 619, - 300, - 599, - 319, - 178, - 316, - 608, - 569, - 531, - 385, - 330, - 393, - 444, - 530, - 445, - 388, - 716, - 426, - 549, - 468, - 523, - 531, - 532, - 680, - 453, - 471, - 320, - 342, - 516, - 574, - 516, - 457, - 714, - 637, - 999, - 810, - 311, - 432, - 626, - 434, - 497, - 578, - 514, - 636, - 796, - 609, - 541, - 469, - 465, - 430, - 422, - 487, - 588, - 477, - 507, - 573, - 564, - 204, - 532, - 468, - 647, - 395, - 525, - 985, - 404, - 399, - 443, - 525, - 504, - 448, - 870, - 383, - 465, - 366, - 403, - 289, - 632, - 501, - 329, - 514, - 807, - 446, - 594, - 643, - 582, - 281, - 384, - 454, - 468, - 484, - 532, - 507, - 617, - 483, - 348, - 570, - 407, - 619, - 568, - 444, - 346, - 539, - 344, - 393, - 584, - 552, - 756, - 811, - 621, - 547, - 459, - 326, - 373, - 459, - 246, - 567, - 605, - 566, - 609, - 386, - 485, - 596, - 665, - 684, - 357, - 279, - 622, - 473, - 388, - 600, - 450, - 430, - 431, - 533, - 321, - 406, - 435, - 600, - 504, - 388, - 468, - 300, - 498, - 605, - 503, - 681, - 408, - 660, - 360, - 121, - 451, - 298, - 626, - 231, - 540, - 427, - 546, - 540, - 475, - 535, - 629, - 403, - 518, - 435, - 360, - 436, - 861, - 422, - 566, - 553, - 518, - 207, - 417, - 458, - 716, - 405, - 371, - 446, - 432, - 523, - 443, - 490, - 429, - 593, - 500, - 417, - 472, - 580, - 476, - 511, - 633, - 521, - 482, - 649, - 676, - 588, - 494, - 536, - 412, - 396, - 312, - 437, - 374, - 399, - 583, - 248, - 519, - 374, - 458, - 295, - 607, - 447, - 665, - 412, - 684, - 703, - 363, - 183, - 643, - 585, - 421, - 384, - 368, - 722, - 410, - 373, - 524, - 236, - 343, - 377, - 601, - 654, - 488, - 565, - 347, - 452, - 536, - 589, - 369, - 514, - 410, - 842, - 665, - 196, - 523, - 794, - 591, - 637, - 590, - 666, - 383, - 426, - 351, - 419, - 672, - 434, - 625, - 666, - 345, - 514, - 313, - 574, - 488, - 732, - 475, - 722, - 217, - 476, - 749, - 393, - 593, - 655, - 723, - 521, - 392, - 278, - 458, - 380, - 606, - 298, - 489, - 324, - 604, - 304, - 559, - 293, - 527, - 489, - 540, - 748, - 436, - 537, - 466, - 286, - 680, - 449, - 479, - 661, - 448, - 584, - 320, - 442, - 590, - 653, - 475, - 529, - 542, - 422, - 365, - 267, - 293, - 572, - 572, - 547, - 459, - 527, - 525, - 728, - 414, - 467, - 452, - 524, - 556, - 251, - 345, - 515, - 391, - 216, - 520, - 290, - 494, - 383, - 664, - 440, - 559, - 478, - 314, - 383, - 359, - 609, - 428, - 387, - 397, - 603, - 534, - 337, - 341, - 515, - 265, - 569, - 570, - 597, - 573, - 493, - 539, - 455, - 249, - 444, - 594, - 499, - 476, - 369, - 434, - 528, - 231, - 471, - 443, - 302, - 335, - 751, - 369, - 541, - 348, - 345, - 427, - 268, - 566, - 388, - 520, - 570, - 584, - 442, - 358, - 733, - 564, - 364, - 616, - 499, - 343, - 585, - 340, - 540, - 403, - 263, - 675, - 583, - 532, - 753, - 282, - 427, - 309, - 425, - 582, - 681, - 294, - 490, - 285, - 592, - 560, - 509, - 251, - 457, - 483, - 465, - 511, - 476, - 672, - 562, - 665, - 248, - 371, - 572, - 540, - 467, - 398, - 338, - 226, - 459, - 545, - 596, - 382, - 652, - 535, - 592, - 425, - 735, - 293, - 721, - 526, - 533, - 455, - 627, - 616, - 397, - 421, - 493, - 564, - 386, - 615, - 635, - 406, - 473, - 403, - 477, - 427, - 640, - 593, - 421, - 406, - 538, - 567, - 209, - 670, - 490, - 518, - 430, - 458, - 698, - 387, - 724, - 336, - 686, - 700, - 496, - 503, - 468, - 459, - 488, - 442, - 649, - 572, - 576, - 476, - 484, - 467, - 723, - 599, - 443, - 343, - 492, - 793, - 458, - 535, - 403, - 538, - 778, - 515, - 574, - 766, - 280, - 485, - 550, - 538, - 899, - 493, - 309, - 456, - 502, - 437, - 391, - 521, - 561, - 410, - 502, - 393, - 562, - 463, - 402, - 495, - 617, - 663, - 676, - 684, - 460, - 495, - 616, - 375, - 355, - 231, - 432, - 453, - 656, - 470, - 463, - 317, - 524, - 768, - 427, - 537, - 392, - 593, - 284, - 502, - 418, - 608, - 230, - 230, - 600, - 355, - 494, - 529, - 400, - 522, - 337, - 519, - 427, - 392, - 357, - 432, - 361, - 475, - 689, - 380, - 545, - 349, - 573, - 476, - 476, - 404, - 460, - 366, - 320, - 325, - 552, - 601, - 461, - 327, - 445, - 603, - 343, - 844, - 600, - 506, - 398, - 352, - 537, - 245, - 609, - 385, - 571, - 592, - 523, - 737, - 563, - 446, - 308, - 299, - 494, - 389, - 458, - 344, - 517, - 476, - 527, - 588, - 450, - 500, - 411, - 405, - 514, - 489, - 545, - 410, - 525, - 570, - 374, - 451, - 582, - 375, - 331, - 327, - 464, - 584, - 414, - 500, - 523, - 576, - 578, - 422, - 432, - 724, - 552, - 584, - 420, - 572, - 555, - 531, - 475, - 390, - 593, - 614, - 642, - 312, - 606, - 342, - 526, - 395, - 491, - 375, - 492, - 701, - 402, - 556, - 440, - 503, - 604, - 538, - 429, - 280, - 603, - 732, - 408, - 399, - 520, - 444, - 535, - 490, - 511, - 647, - 325, - 596, - 648, - 454, - 518, - 409, - 732, - 635, - 248, - 395, - 357, - 434, - 677, - 487, - 591, - 535, - 467, - 442, - 514, - 451, - 409, - 357, - 239, - 361, - 724, - 530, - 715, - 708, - 449, - 441, - 419, - 631, - 308, - 397, - 486, - 336, - 449, - 528, - 557, - 558, - 390, - 578, - 746, - 453, - 665, - 485, - 376, - 583, - 694, - 635, - 687, - 454, - 255, - 514, - 472, - 235, - 376, - 465, - 470, - 418, - 655, - 372, - 835, - 458, - 640, - 509, - 171, - 580, - 791, - 540, - 846, - 396, - 696, - 427, - 618, - 347, - 620, - 651, - 406, - 493, - 384, - 506, - 541, - 490, - 404, - 399, - 584, - 438, - 402, - 448, - 425, - 620, - 879, - 571, - 443, - 545, - 743, - 524, - 631, - 598, - 449, - 595, - 356, - 479, - 648, - 664, - 282, - 769, - 307, - 311, - 377, - 424, - 594, - 631, - 329, - 588, - 581, - 440, - 378, - 394, - 544, - 547, - 342, - 391, - 484, - 429, - 309, - 484, - 454, - 555, - 648, - 420, - 460, - 304, - 676, - 646, - 478, - 388, - 444, - 477, - 694, - 440, - 365, - 413, - 332, - 358, - 623, - 531, - 472, - 329, - 651, - 478, - 531, - 303, - 697, - 675, - 509, - 636, - 589, - 532, - 458, - 561, - 599, - 395, - 464, - 439, - 416, - 577, - 702, - 501, - 666, - 365, - 416, - 386, - 684, - 398, - 380, - 574, - 536, - 458, - 354, - 491, - 685, - 251, - 642, - 418, - 624, - 450, - 665, - 485, - 590, - 218, - 264, - 651, - 481, - 545, - 481, - 490, - 498, - 328, - 440, - 618, - 695, - 646, - 486, - 375, - 259, - 513, - 350, - 294, - 455, - 455, - 530, - 731, - 469, - 566, - 351, - 239, - 567, - 693, - 404, - 610, - 353, - 463, - 293, - 428, - 452, - 347, - 523, - 684, - 426, - 441, - 446, - 431, - 471, - 622, - 693, - 429, - 685, - 477, - 315, - 445, - 822, - 497, - 634, - 460, - 503, - 596, - 623, - 669, - 418, - 421, - 429, - 659, - 549, - 477, - 507, - 621, - 719, - 438, - 249, - 508, - 549, - 501, - 582, - 718, - 391, - 693, - 673, - 550, - 497, - 423, - 303, - 476, - 688, - 356, - 699, - 416, - 253, - 553, - 645, - 412, - 475, - 750, - 431, - 381, - 476, - 506, - 579, - 409, - 609, - 463, - 536, - 367, - 493, - 325, - 446, - 626, - 484, - 598, - 516, - 359, - 394, - 465, - 392, - 426, - 464, - 701, - 516, - 307, - 593, - 380, - 602, - 417, - 522, - 611, - 428, - 554, - 560, - 382, - 523, - 651, - 550, - 277, - 811, - 654, - 632, - 467, - 354, - 513, - 530, - 456, - 539, - 398, - 467, - 592, - 409, - 606, - 247, - 518, - 504, - 679, - 488, - 298, - 711, - 348, - 551, - 487, - 246, - 441, - 531, - 511, - 501, - 324, - 443, - 512, - 630, - 345, - 434, - 451, - 588, - 505, - 494, - 682, - 452, - 672, - 516, - 484, - 622, - 337, - 613, - 576, - 624, - 506, - 451, - 806, - 378, - 398, - 591, - 774, - 402, - 731, - 561, - 503, - 462, - 414, - 402, - 442, - 521, - 374, - 535, - 331, - 514, - 469, - 425, - 560, - 673, - 496, - 550, - 366, - 374, - 566, - 350, - 461, - 539, - 305, - 400, - 521, - 671, - 739, - 507, - 464, - 296, - 490, - 569, - 482, - 467, - 438, - 537, - 407, - 392, - 473, - 373, - 310, - 387, - 591, - 418, - 464, - 464, - 570, - 487, - 635, - 346, - 492, - 401, - 627, - 708, - 364, - 451, - 588, - 532, - 448, - 373, - 551, - 644, - 662, - 324, - 593, - 508, - 375, - 384, - 425, - 447, - 672, - 495, - 462, - 439, - 457, - 604, - 252, - 600, - 502, - 518, - 395, - 309, - 260, - 479, - 369, - 339, - 470, - 560, - 452, - 466, - 619, - 432, - 530, - 637, - 490, - 715, - 561, - 425, - 497, - 427, - 467, - 381, - 361, - 616, - 592, - 593, - 512, - 491, - 602, - 588, - 483, - 556, - 468, - 336, - 244, - 698, - 425, - 437, - 526, - 569, - 413, - 628, - 479, - 220, - 536, - 373, - 436, - 555, - 411, - 444, - 501, - 687, - 641, - 543, - 424, - 370, - 514, - 419, - 593, - 718, - 482, - 550, - 500, - 649, - 407, - 551, - 634, - 605, - 517, - 489, - 461, - 680, - 494, - 327, - 484, - 367, - 444, - 503, - 552, - 568, - 387, - 369, - 310, - 663, - 455, - 520, - 427, - 426, - 201, - 345, - 560, - 607, - 374, - 411, - 417, - 472, - 561, - 594, - 535, - 478, - 478, - 598, - 576, - 423, - 542, - 650, - 590, - 377, - 407, - 463, - 465, - 504, - 387, - 464, - 791, - 541, - 456, - 710, - 640, - 683, - 485, - 536, - 608, - 772, - 415, - 446, - 547, - 381, - 641, - 377, - 449, - 516, - 311, - 461, - 440, - 252, - 471, - 674, - 334, - 322, - 538, - 641, - 536, - 302, - 327, - 596, - 481, - 280, - 414, - 455, - 558, - 540, - 396, - 392, - 501, - 438, - 669, - 499, - 422, - 582, - 413, - 427, - 183, - 490, - 643, - 490, - 367, - 750, - 615, - 639, - 213, - 419, - 330, - 341, - 648, - 420, - 624, - 457, - 450, - 406, - 399, - 336, - 663, - 336, - 282, - 379, - 551, - 328, - 832, - 834, - 431, - 417, - 464, - 504, - 499, - 453, - 525, - 313, - 502, - 529, - 384, - 639, - 407, - 224, - 557, - 384, - 320, - 510, - 481, - 542, - 818, - 510, - 578, - 383, - 282, - 457, - 508, - 584, - 488, - 497, - 724, - 432, - 437, - 648, - 611, - 670, - 373, - 441, - 321, - 474, - 327, - 456, - 535, - 326, - 326, - 527, - 404, - 380, - 448, - 441, - 413, - 308, - 435, - 580, - 519, - 325, - 527, - 531, - 323, - 361, - 604, - 414, - 434, - 802, - 633, - 676, - 680, - 474, - 484, - 569, - 454, - 611, - 615, - 457, - 480, - 623, - 312, - 475, - 592, - 557, - 595, - 602, - 514, - 345, - 416, - 599, - 627, - 592, - 302, - 578, - 697, - 363, - 425, - 400, - 298, - 340, - 499, - 752, - 828, - 478, - 608, - 452, - 553, - 680, - 258, - 571, - 560, - 413, - 404, - 544, - 425, - 467, - 552, - 394, - 736, - 495, - 368, - 644, - 569, - 352, - 358, - 361, - 199, - 433, - 545, - 345, - 565, - 522, - 410, - 288, - 515, - 324, - 463, - 433, - 650, - 433, - 349, - 552, - 441, - 429, - 379, - 443, - 258, - 332, - 456, - 823, - 564, - 502, - 584, - 313, - 420, - 639, - 539, - 617, - 495, - 580, - 277, - 569, - 561, - 514 - ] - }, - { - "counters": [ - 416, - 680, - 540, - 507, - 481, - 594, - 493, - 350, - 432, - 487, - 652, - 548, - 473, - 558, - 535, - 674, - 728, - 420, - 477, - 397, - 563, - 386, - 545, - 579, - 507, - 397, - 428, - 679, - 460, - 514, - 709, - 860, - 597, - 615, - 357, - 806, - 351, - 443, - 726, - 308, - 389, - 410, - 425, - 290, - 300, - 502, - 373, - 526, - 560, - 394, - 448, - 512, - 473, - 803, - 397, - 340, - 495, - 441, - 445, - 610, - 447, - 425, - 607, - 356, - 580, - 338, - 452, - 515, - 493, - 296, - 280, - 687, - 488, - 526, - 569, - 501, - 637, - 394, - 606, - 704, - 561, - 410, - 504, - 449, - 335, - 353, - 563, - 546, - 419, - 547, - 664, - 553, - 213, - 415, - 453, - 534, - 555, - 478, - 549, - 744, - 393, - 460, - 666, - 561, - 283, - 343, - 336, - 283, - 595, - 256, - 314, - 411, - 476, - 364, - 509, - 372, - 394, - 308, - 302, - 538, - 274, - 209, - 720, - 513, - 281, - 312, - 424, - 544, - 432, - 454, - 753, - 576, - 428, - 561, - 405, - 399, - 563, - 628, - 703, - 386, - 579, - 802, - 786, - 549, - 566, - 415, - 548, - 466, - 590, - 494, - 421, - 668, - 394, - 499, - 585, - 753, - 508, - 437, - 476, - 625, - 550, - 439, - 443, - 558, - 567, - 544, - 764, - 441, - 787, - 341, - 315, - 558, - 537, - 636, - 551, - 332, - 384, - 375, - 824, - 576, - 453, - 640, - 438, - 644, - 314, - 342, - 490, - 482, - 314, - 489, - 401, - 500, - 507, - 580, - 473, - 499, - 385, - 360, - 483, - 551, - 528, - 340, - 504, - 282, - 536, - 413, - 380, - 490, - 503, - 476, - 636, - 188, - 688, - 622, - 348, - 651, - 313, - 401, - 539, - 465, - 561, - 401, - 237, - 170, - 394, - 515, - 463, - 439, - 495, - 502, - 682, - 503, - 268, - 446, - 496, - 723, - 553, - 230, - 567, - 382, - 481, - 254, - 650, - 792, - 438, - 488, - 286, - 540, - 324, - 531, - 352, - 640, - 665, - 462, - 580, - 312, - 356, - 508, - 661, - 417, - 476, - 554, - 590, - 507, - 361, - 317, - 710, - 475, - 550, - 407, - 556, - 427, - 750, - 463, - 262, - 259, - 436, - 574, - 603, - 343, - 459, - 337, - 296, - 822, - 475, - 559, - 502, - 239, - 544, - 434, - 507, - 580, - 295, - 372, - 377, - 498, - 388, - 765, - 410, - 378, - 625, - 389, - 243, - 347, - 444, - 444, - 682, - 449, - 486, - 371, - 856, - 446, - 461, - 682, - 405, - 584, - 568, - 576, - 433, - 607, - 421, - 310, - 433, - 412, - 727, - 707, - 433, - 510, - 415, - 324, - 614, - 451, - 879, - 394, - 542, - 508, - 509, - 352, - 755, - 309, - 413, - 495, - 551, - 574, - 614, - 391, - 354, - 431, - 397, - 366, - 689, - 357, - 499, - 579, - 96, - 460, - 457, - 488, - 557, - 607, - 741, - 421, - 355, - 327, - 541, - 348, - 242, - 580, - 481, - 407, - 491, - 620, - 639, - 754, - 280, - 314, - 571, - 589, - 429, - 405, - 559, - 403, - 609, - 698, - 544, - 534, - 529, - 577, - 650, - 589, - 552, - 483, - 380, - 563, - 531, - 622, - 493, - 673, - 500, - 729, - 419, - 479, - 727, - 351, - 368, - 555, - 444, - 521, - 391, - 340, - 634, - 557, - 445, - 439, - 267, - 354, - 289, - 517, - 479, - 585, - 490, - 379, - 229, - 507, - 500, - 627, - 373, - 540, - 477, - 636, - 446, - 276, - 375, - 530, - 532, - 374, - 503, - 308, - 502, - 436, - 683, - 275, - 569, - 558, - 566, - 372, - 537, - 547, - 835, - 490, - 309, - 538, - 456, - 690, - 483, - 457, - 406, - 381, - 674, - 511, - 585, - 282, - 432, - 660, - 431, - 612, - 442, - 387, - 588, - 364, - 565, - 551, - 468, - 568, - 431, - 473, - 587, - 316, - 719, - 326, - 404, - 383, - 648, - 681, - 413, - 412, - 634, - 583, - 613, - 432, - 294, - 570, - 575, - 539, - 552, - 449, - 228, - 226, - 293, - 412, - 487, - 356, - 703, - 434, - 637, - 291, - 532, - 400, - 424, - 434, - 460, - 410, - 426, - 611, - 587, - 469, - 479, - 310, - 348, - 308, - 463, - 563, - 633, - 540, - 339, - 407, - 348, - 350, - 386, - 575, - 513, - 642, - 469, - 495, - 313, - 449, - 803, - 396, - 335, - 678, - 452, - 448, - 508, - 265, - 342, - 619, - 609, - 441, - 258, - 436, - 443, - 425, - 612, - 358, - 434, - 460, - 561, - 380, - 358, - 588, - 368, - 701, - 504, - 238, - 471, - 419, - 503, - 531, - 408, - 494, - 435, - 641, - 308, - 447, - 376, - 467, - 588, - 581, - 683, - 875, - 578, - 489, - 633, - 493, - 824, - 369, - 334, - 555, - 755, - 309, - 570, - 519, - 362, - 558, - 617, - 363, - 431, - 721, - 721, - 548, - 703, - 509, - 333, - 444, - 427, - 355, - 742, - 491, - 512, - 590, - 302, - 740, - 762, - 443, - 411, - 318, - 416, - 526, - 289, - 686, - 535, - 567, - 282, - 690, - 576, - 388, - 458, - 545, - 476, - 274, - 569, - 558, - 540, - 569, - 416, - 750, - 445, - 529, - 365, - 346, - 489, - 656, - 450, - 674, - 519, - 564, - 444, - 471, - 427, - 224, - 307, - 416, - 400, - 430, - 584, - 534, - 508, - 670, - 292, - 494, - 297, - 571, - 490, - 364, - 401, - 430, - 608, - 526, - 434, - 386, - 414, - 409, - 533, - 569, - 483, - 627, - 675, - 748, - 301, - 675, - 233, - 449, - 263, - 602, - 443, - 635, - 487, - 449, - 392, - 733, - 305, - 428, - 262, - 499, - 605, - 490, - 464, - 455, - 603, - 421, - 611, - 481, - 300, - 766, - 578, - 304, - 784, - 602, - 334, - 481, - 446, - 495, - 341, - 639, - 327, - 774, - 682, - 454, - 540, - 398, - 277, - 528, - 632, - 652, - 392, - 495, - 563, - 427, - 366, - 454, - 581, - 599, - 526, - 392, - 572, - 357, - 582, - 609, - 598, - 567, - 491, - 471, - 461, - 491, - 400, - 366, - 371, - 571, - 365, - 259, - 540, - 393, - 231, - 309, - 273, - 577, - 293, - 378, - 519, - 397, - 489, - 726, - 746, - 567, - 541, - 515, - 614, - 395, - 417, - 525, - 599, - 667, - 552, - 448, - 587, - 317, - 582, - 325, - 918, - 416, - 560, - 625, - 531, - 423, - 312, - 326, - 394, - 648, - 638, - 430, - 455, - 471, - 468, - 621, - 318, - 501, - 504, - 341, - 364, - 315, - 371, - 573, - 545, - 374, - 601, - 555, - 817, - 447, - 854, - 490, - 571, - 561, - 606, - 360, - 523, - 742, - 444, - 494, - 465, - 451, - 498, - 587, - 455, - 574, - 388, - 365, - 311, - 779, - 503, - 465, - 401, - 552, - 452, - 641, - 520, - 683, - 244, - 329, - 476, - 508, - 400, - 347, - 686, - 413, - 659, - 436, - 668, - 408, - 653, - 601, - 399, - 420, - 617, - 503, - 541, - 317, - 577, - 557, - 440, - 362, - 256, - 429, - 375, - 427, - 342, - 758, - 571, - 485, - 403, - 679, - 573, - 423, - 388, - 605, - 361, - 514, - 558, - 355, - 328, - 601, - 642, - 268, - 614, - 541, - 351, - 394, - 425, - 468, - 444, - 565, - 435, - 463, - 707, - 593, - 471, - 624, - 517, - 330, - 340, - 429, - 417, - 471, - 530, - 401, - 321, - 680, - 595, - 583, - 318, - 437, - 462, - 411, - 493, - 401, - 388, - 403, - 351, - 722, - 390, - 228, - 495, - 504, - 529, - 391, - 421, - 425, - 558, - 381, - 364, - 414, - 560, - 385, - 394, - 334, - 316, - 533, - 501, - 516, - 246, - 521, - 479, - 463, - 618, - 516, - 398, - 424, - 532, - 361, - 532, - 353, - 410, - 829, - 373, - 504, - 199, - 581, - 359, - 608, - 324, - 510, - 306, - 444, - 289, - 699, - 564, - 420, - 514, - 388, - 454, - 486, - 479, - 628, - 666, - 504, - 414, - 344, - 525, - 624, - 705, - 535, - 506, - 414, - 761, - 430, - 377, - 351, - 393, - 676, - 487, - 389, - 524, - 779, - 312, - 399, - 515, - 545, - 585, - 695, - 529, - 477, - 449, - 552, - 560, - 482, - 619, - 250, - 342, - 352, - 476, - 572, - 541, - 637, - 514, - 385, - 506, - 406, - 307, - 433, - 473, - 648, - 681, - 348, - 388, - 423, - 426, - 568, - 610, - 660, - 733, - 416, - 409, - 594, - 606, - 578, - 398, - 555, - 478, - 244, - 406, - 273, - 485, - 261, - 486, - 571, - 698, - 645, - 629, - 364, - 512, - 596, - 425, - 712, - 221, - 303, - 664, - 295, - 309, - 514, - 586, - 460, - 514, - 642, - 408, - 379, - 491, - 664, - 449, - 731, - 651, - 157, - 425, - 482, - 485, - 503, - 541, - 667, - 461, - 456, - 521, - 341, - 584, - 723, - 408, - 485, - 461, - 455, - 576, - 575, - 567, - 744, - 519, - 432, - 154, - 419, - 700, - 346, - 528, - 492, - 739, - 730, - 555, - 538, - 818, - 607, - 618, - 464, - 763, - 570, - 481, - 401, - 344, - 580, - 350, - 381, - 444, - 411, - 641, - 211, - 501, - 472, - 410, - 659, - 443, - 570, - 518, - 472, - 614, - 621, - 493, - 342, - 430, - 750, - 458, - 456, - 292, - 537, - 413, - 698, - 443, - 433, - 486, - 553, - 566, - 367, - 394, - 308, - 688, - 716, - 499, - 284, - 465, - 638, - 451, - 416, - 336, - 426, - 356, - 441, - 589, - 566, - 497, - 544, - 328, - 322, - 596, - 425, - 449, - 579, - 538, - 219, - 628, - 437, - 488, - 375, - 630, - 414, - 434, - 245, - 473, - 649, - 415, - 675, - 374, - 682, - 358, - 615, - 704, - 491, - 360, - 616, - 330, - 198, - 464, - 408, - 500, - 825, - 586, - 434, - 542, - 633, - 285, - 411, - 540, - 485, - 560, - 263, - 470, - 478, - 373, - 475, - 133, - 396, - 471, - 284, - 445, - 641, - 364, - 430, - 513, - 612, - 499, - 343, - 312, - 428, - 416, - 543, - 414, - 365, - 251, - 491, - 584, - 478, - 466, - 493, - 438, - 479, - 430, - 383, - 596, - 490, - 630, - 493, - 651, - 387, - 459, - 461, - 324, - 409, - 568, - 593, - 386, - 513, - 528, - 742, - 432, - 704, - 682, - 271, - 321, - 507, - 332, - 664, - 476, - 567, - 635, - 439, - 543, - 345, - 437, - 633, - 423, - 172, - 452, - 480, - 406, - 535, - 284, - 270, - 417, - 415, - 436, - 636, - 525, - 621, - 744, - 619, - 697, - 435, - 438, - 409, - 459, - 425, - 674, - 380, - 344, - 412, - 431, - 515, - 699, - 376, - 326, - 363, - 426, - 543, - 465, - 497, - 290, - 436, - 447, - 508, - 330, - 415, - 300, - 207, - 472, - 503, - 203, - 528, - 596, - 436, - 263, - 426, - 598, - 671, - 331, - 209, - 592, - 563, - 503, - 345, - 538, - 559, - 256, - 342, - 425, - 718, - 353, - 666, - 510, - 727, - 407, - 575, - 548, - 485, - 442, - 537, - 596, - 429, - 614, - 689, - 374, - 404, - 620, - 844, - 317, - 357, - 361, - 368, - 783, - 311, - 299, - 421, - 452, - 701, - 353, - 401, - 625, - 570, - 466, - 519, - 422, - 434, - 418, - 446, - 539, - 731, - 452, - 498, - 576, - 461, - 623, - 395, - 468, - 550, - 344, - 245, - 687, - 434, - 434, - 777, - 576, - 424, - 449, - 326, - 352, - 442, - 513, - 495, - 251, - 521, - 553, - 485, - 775, - 553, - 480, - 492, - 475, - 315, - 510, - 700, - 405, - 437, - 500, - 472, - 347, - 514, - 360, - 563, - 585, - 622, - 292, - 275, - 544, - 454, - 332, - 628, - 442, - 467, - 399, - 421, - 537, - 432, - 477, - 362, - 451, - 572, - 696, - 636, - 440, - 549, - 315, - 567, - 429, - 499, - 435, - 487, - 553, - 569, - 373, - 478, - 306, - 588, - 449, - 270, - 646, - 513, - 563, - 502, - 570, - 591, - 558, - 589, - 601, - 330, - 709, - 415, - 684, - 551, - 399, - 591, - 522, - 376, - 699, - 408, - 631, - 411, - 554, - 298, - 549, - 587, - 458, - 565, - 516, - 483, - 447, - 425, - 417, - 790, - 213, - 367, - 443, - 571, - 518, - 403, - 331, - 544, - 613, - 506, - 500, - 427, - 304, - 586, - 496, - 432, - 537, - 441, - 255, - 479, - 650, - 482, - 556, - 561, - 508, - 518, - 375, - 460, - 316, - 514, - 633, - 357, - 613, - 614, - 461, - 288, - 599, - 482, - 496, - 466, - 549, - 401, - 722, - 329, - 475, - 325, - 939, - 580, - 565, - 383, - 750, - 669, - 652, - 299, - 543, - 668, - 959, - 555, - 563, - 749, - 481, - 450, - 503, - 294, - 512, - 552, - 337, - 597, - 456, - 466, - 384, - 551, - 383, - 451, - 465, - 633, - 581, - 626, - 499, - 506, - 270, - 328, - 442, - 527, - 269, - 501, - 543, - 720, - 347, - 488, - 555, - 715, - 797, - 618, - 461, - 458, - 568, - 547, - 524, - 472, - 562, - 538, - 449, - 495, - 552, - 302, - 490, - 679, - 545, - 369, - 585, - 295, - 451, - 564, - 588, - 482, - 452, - 341, - 552, - 556, - 536, - 554, - 484, - 609, - 297, - 738, - 556, - 366, - 498, - 257, - 477, - 350, - 502, - 597, - 512, - 354, - 276, - 476, - 484, - 324, - 350, - 493, - 470, - 450, - 674, - 521, - 275, - 708, - 579, - 788, - 467, - 403, - 543, - 691, - 463, - 608, - 647, - 631, - 221, - 493, - 476, - 498, - 279, - 472, - 488, - 589, - 515, - 389, - 507, - 621, - 545, - 687, - 431, - 344, - 491, - 761, - 321, - 424, - 652, - 592, - 545, - 591, - 264, - 458, - 579, - 261, - 592, - 542, - 512, - 517, - 345, - 323, - 675, - 243, - 441, - 455, - 495, - 477, - 751, - 449, - 494, - 659, - 721, - 622, - 387, - 435, - 446, - 499, - 372, - 373, - 542, - 920, - 591, - 489, - 430, - 269, - 696, - 406, - 513, - 311, - 611, - 377, - 431, - 426, - 495, - 322, - 655, - 474, - 554, - 538, - 557, - 478, - 489, - 556, - 616, - 505, - 779, - 710, - 748, - 442, - 428, - 259, - 519, - 384, - 296, - 480, - 570, - 508, - 230, - 455, - 485, - 567, - 203, - 546, - 283, - 433, - 416, - 407, - 362, - 257, - 538, - 424, - 572, - 700, - 586, - 450, - 676, - 488, - 603, - 704, - 644, - 572, - 701, - 354, - 312, - 372, - 525, - 555, - 537, - 303, - 348, - 475, - 205, - 461, - 417, - 269, - 337, - 512, - 560, - 259, - 464, - 615, - 484, - 429, - 332, - 232, - 545, - 658, - 444, - 536, - 345, - 432, - 632, - 532, - 502, - 297, - 487, - 277, - 262, - 374, - 434, - 490, - 525, - 613, - 304, - 548, - 375, - 439, - 474, - 469, - 390, - 456, - 451, - 552, - 508, - 579, - 460, - 598, - 403, - 375, - 482, - 482, - 500, - 487, - 630, - 552, - 501, - 644, - 516, - 454, - 529, - 365, - 642, - 636, - 470, - 355, - 554, - 587, - 509, - 605, - 446, - 435, - 600, - 561, - 524, - 509, - 468, - 259, - 391, - 702, - 322, - 208, - 480, - 456, - 737, - 571, - 344, - 771, - 561, - 478, - 218, - 462, - 391, - 598, - 416, - 395, - 487, - 695, - 418, - 440, - 548, - 506, - 537, - 435, - 336, - 252, - 794, - 443, - 433, - 393, - 645, - 438, - 625, - 343, - 624, - 534, - 474, - 247, - 685, - 418, - 481, - 817, - 690, - 638, - 533, - 481, - 476, - 490, - 391, - 460, - 580, - 832, - 534, - 618, - 459, - 614, - 668, - 560, - 770, - 619, - 514, - 395, - 305, - 551, - 824, - 474, - 190, - 721, - 564, - 494, - 269, - 461, - 456, - 521, - 525, - 589, - 416, - 464, - 545, - 342, - 347, - 683, - 549, - 539, - 398, - 740, - 481, - 716, - 519, - 311, - 599, - 365, - 368, - 506, - 472, - 467, - 422, - 587, - 556, - 445, - 605, - 531, - 705, - 343, - 386, - 491, - 507, - 521, - 410, - 497, - 424, - 577, - 469, - 614, - 296, - 448, - 426, - 412, - 439, - 387, - 447, - 685, - 667, - 654, - 759, - 692, - 518, - 577, - 428, - 470, - 380, - 583, - 436, - 654, - 553, - 510, - 524, - 488, - 416, - 308, - 257, - 590, - 307, - 340, - 382, - 508, - 752, - 525, - 198, - 582, - 426, - 349, - 318, - 648, - 708, - 722, - 455, - 625, - 477, - 637, - 406, - 342, - 348, - 361, - 645, - 450, - 396, - 442, - 351, - 226, - 384, - 367, - 374, - 418, - 556, - 297, - 683, - 459, - 605, - 772, - 663, - 482, - 589, - 622, - 488, - 626, - 411, - 753, - 808, - 442, - 309, - 529, - 283, - 321, - 379, - 574, - 467, - 655, - 624, - 488 - ] - } - ], - "top_n": [ - { - "data": "A4AAAAAAAFdA", - "count": 19977 - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 0, - "last_update_version": 412596209545379840, - "correlation": 0 - } - }, - "count": 1020000, - "modify_count": 0, - "partitions": null -} diff --git a/cmd/explaintest/s/explain_join_stats_lo.json b/cmd/explaintest/s/explain_join_stats_lo.json deleted file mode 100644 index dd9b1e7095406..0000000000000 --- a/cmd/explaintest/s/explain_join_stats_lo.json +++ /dev/null @@ -1,1522 +0,0 @@ -{ - "database_name": "test", - "table_name": "lo", - "columns": { - "a": { - "histogram": { - "ndv": 250, - "buckets": [ - { - "count": 1, - "lower_bound": "MQ==", - "upper_bound": "MQ==", - "repeats": 1 - }, - { - "count": 2, - "lower_bound": "Mg==", - "upper_bound": "Mg==", - "repeats": 1 - }, - { - "count": 3, - "lower_bound": "Mw==", - "upper_bound": "Mw==", - "repeats": 1 - }, - { - "count": 4, - "lower_bound": "NA==", - "upper_bound": "NA==", - "repeats": 1 - }, - { - "count": 5, - "lower_bound": "NQ==", - "upper_bound": "NQ==", - "repeats": 1 - }, - { - "count": 6, - "lower_bound": "Ng==", - "upper_bound": "Ng==", - "repeats": 1 - }, - { - "count": 7, - "lower_bound": "Nw==", - "upper_bound": "Nw==", - "repeats": 1 - }, - { - "count": 8, - "lower_bound": "OA==", - "upper_bound": "OA==", - "repeats": 1 - }, - { - "count": 9, - "lower_bound": "OQ==", - "upper_bound": "OQ==", - "repeats": 1 - }, - { - "count": 10, - "lower_bound": "MTA=", - "upper_bound": "MTA=", - "repeats": 1 - }, - { - "count": 11, - "lower_bound": "MTE=", - "upper_bound": "MTE=", - "repeats": 1 - }, - { - "count": 12, - "lower_bound": "MTI=", - "upper_bound": "MTI=", - "repeats": 1 - }, - { - "count": 13, - "lower_bound": "MTM=", - "upper_bound": "MTM=", - "repeats": 1 - }, - { - "count": 14, - "lower_bound": "MTQ=", - "upper_bound": "MTQ=", - "repeats": 1 - }, - { - "count": 15, - "lower_bound": "MTU=", - "upper_bound": "MTU=", - "repeats": 1 - }, - { - "count": 16, - "lower_bound": "MTY=", - "upper_bound": "MTY=", - "repeats": 1 - }, - { - "count": 17, - "lower_bound": "MTc=", - "upper_bound": "MTc=", - "repeats": 1 - }, - { - "count": 18, - "lower_bound": "MTg=", - "upper_bound": "MTg=", - "repeats": 1 - }, - { - "count": 19, - "lower_bound": "MTk=", - "upper_bound": "MTk=", - "repeats": 1 - }, - { - "count": 20, - "lower_bound": "MjA=", - "upper_bound": "MjA=", - "repeats": 1 - }, - { - "count": 21, - "lower_bound": "MjE=", - "upper_bound": "MjE=", - "repeats": 1 - }, - { - "count": 22, - "lower_bound": "MjI=", - "upper_bound": "MjI=", - "repeats": 1 - }, - { - "count": 23, - "lower_bound": "MjM=", - "upper_bound": "MjM=", - "repeats": 1 - }, - { - "count": 24, - "lower_bound": "MjQ=", - "upper_bound": "MjQ=", - "repeats": 1 - }, - { - "count": 25, - "lower_bound": "MjU=", - "upper_bound": "MjU=", - "repeats": 1 - }, - { - "count": 26, - "lower_bound": "MjY=", - "upper_bound": "MjY=", - "repeats": 1 - }, - { - "count": 27, - "lower_bound": "Mjc=", - "upper_bound": "Mjc=", - "repeats": 1 - }, - { - "count": 28, - "lower_bound": "Mjg=", - "upper_bound": "Mjg=", - "repeats": 1 - }, - { - "count": 29, - "lower_bound": "Mjk=", - "upper_bound": "Mjk=", - "repeats": 1 - }, - { - "count": 30, - "lower_bound": "MzA=", - "upper_bound": "MzA=", - "repeats": 1 - }, - { - "count": 31, - "lower_bound": "MzE=", - "upper_bound": "MzE=", - "repeats": 1 - }, - { - "count": 32, - "lower_bound": "MzI=", - "upper_bound": "MzI=", - "repeats": 1 - }, - { - "count": 33, - "lower_bound": "MzM=", - "upper_bound": "MzM=", - "repeats": 1 - }, - { - "count": 34, - "lower_bound": "MzQ=", - "upper_bound": "MzQ=", - "repeats": 1 - }, - { - "count": 35, - "lower_bound": "MzU=", - "upper_bound": "MzU=", - "repeats": 1 - }, - { - "count": 36, - "lower_bound": "MzY=", - "upper_bound": "MzY=", - "repeats": 1 - }, - { - "count": 37, - "lower_bound": "Mzc=", - "upper_bound": "Mzc=", - "repeats": 1 - }, - { - "count": 38, - "lower_bound": "Mzg=", - "upper_bound": "Mzg=", - "repeats": 1 - }, - { - "count": 39, - "lower_bound": "Mzk=", - "upper_bound": "Mzk=", - "repeats": 1 - }, - { - "count": 40, - "lower_bound": "NDA=", - "upper_bound": "NDA=", - "repeats": 1 - }, - { - "count": 41, - "lower_bound": "NDE=", - "upper_bound": "NDE=", - "repeats": 1 - }, - { - "count": 42, - "lower_bound": "NDI=", - "upper_bound": "NDI=", - "repeats": 1 - }, - { - "count": 43, - "lower_bound": "NDM=", - "upper_bound": "NDM=", - "repeats": 1 - }, - { - "count": 44, - "lower_bound": "NDQ=", - "upper_bound": "NDQ=", - "repeats": 1 - }, - { - "count": 45, - "lower_bound": "NDU=", - "upper_bound": "NDU=", - "repeats": 1 - }, - { - "count": 46, - "lower_bound": "NDY=", - "upper_bound": "NDY=", - "repeats": 1 - }, - { - "count": 47, - "lower_bound": "NDc=", - "upper_bound": "NDc=", - "repeats": 1 - }, - { - "count": 48, - "lower_bound": "NDg=", - "upper_bound": "NDg=", - "repeats": 1 - }, - { - "count": 49, - "lower_bound": "NDk=", - "upper_bound": "NDk=", - "repeats": 1 - }, - { - "count": 50, - "lower_bound": "NTA=", - "upper_bound": "NTA=", - "repeats": 1 - }, - { - "count": 51, - "lower_bound": "NTE=", - "upper_bound": "NTE=", - "repeats": 1 - }, - { - "count": 52, - "lower_bound": "NTI=", - "upper_bound": "NTI=", - "repeats": 1 - }, - { - "count": 53, - "lower_bound": "NTM=", - "upper_bound": "NTM=", - "repeats": 1 - }, - { - "count": 54, - "lower_bound": "NTQ=", - "upper_bound": "NTQ=", - "repeats": 1 - }, - { - "count": 55, - "lower_bound": "NTU=", - "upper_bound": "NTU=", - "repeats": 1 - }, - { - "count": 56, - "lower_bound": "NTY=", - "upper_bound": "NTY=", - "repeats": 1 - }, - { - "count": 57, - "lower_bound": "NTc=", - "upper_bound": "NTc=", - "repeats": 1 - }, - { - "count": 58, - "lower_bound": "NTg=", - "upper_bound": "NTg=", - "repeats": 1 - }, - { - "count": 59, - "lower_bound": "NTk=", - "upper_bound": "NTk=", - "repeats": 1 - }, - { - "count": 60, - "lower_bound": "NjA=", - "upper_bound": "NjA=", - "repeats": 1 - }, - { - "count": 61, - "lower_bound": "NjE=", - "upper_bound": "NjE=", - "repeats": 1 - }, - { - "count": 62, - "lower_bound": "NjI=", - "upper_bound": "NjI=", - "repeats": 1 - }, - { - "count": 63, - "lower_bound": "NjM=", - "upper_bound": "NjM=", - "repeats": 1 - }, - { - "count": 64, - "lower_bound": "NjQ=", - "upper_bound": "NjQ=", - "repeats": 1 - }, - { - "count": 65, - "lower_bound": "NjU=", - "upper_bound": "NjU=", - "repeats": 1 - }, - { - "count": 66, - "lower_bound": "NjY=", - "upper_bound": "NjY=", - "repeats": 1 - }, - { - "count": 67, - "lower_bound": "Njc=", - "upper_bound": "Njc=", - "repeats": 1 - }, - { - "count": 68, - "lower_bound": "Njg=", - "upper_bound": "Njg=", - "repeats": 1 - }, - { - "count": 69, - "lower_bound": "Njk=", - "upper_bound": "Njk=", - "repeats": 1 - }, - { - "count": 70, - "lower_bound": "NzA=", - "upper_bound": "NzA=", - "repeats": 1 - }, - { - "count": 71, - "lower_bound": "NzE=", - "upper_bound": "NzE=", - "repeats": 1 - }, - { - "count": 72, - "lower_bound": "NzI=", - "upper_bound": "NzI=", - "repeats": 1 - }, - { - "count": 73, - "lower_bound": "NzM=", - "upper_bound": "NzM=", - "repeats": 1 - }, - { - "count": 74, - "lower_bound": "NzQ=", - "upper_bound": "NzQ=", - "repeats": 1 - }, - { - "count": 75, - "lower_bound": "NzU=", - "upper_bound": "NzU=", - "repeats": 1 - }, - { - "count": 76, - "lower_bound": "NzY=", - "upper_bound": "NzY=", - "repeats": 1 - }, - { - "count": 77, - "lower_bound": "Nzc=", - "upper_bound": "Nzc=", - "repeats": 1 - }, - { - "count": 78, - "lower_bound": "Nzg=", - "upper_bound": "Nzg=", - "repeats": 1 - }, - { - "count": 79, - "lower_bound": "Nzk=", - "upper_bound": "Nzk=", - "repeats": 1 - }, - { - "count": 80, - "lower_bound": "ODA=", - "upper_bound": "ODA=", - "repeats": 1 - }, - { - "count": 81, - "lower_bound": "ODE=", - "upper_bound": "ODE=", - "repeats": 1 - }, - { - "count": 82, - "lower_bound": "ODI=", - "upper_bound": "ODI=", - "repeats": 1 - }, - { - "count": 83, - "lower_bound": "ODM=", - "upper_bound": "ODM=", - "repeats": 1 - }, - { - "count": 84, - "lower_bound": "ODQ=", - "upper_bound": "ODQ=", - "repeats": 1 - }, - { - "count": 85, - "lower_bound": "ODU=", - "upper_bound": "ODU=", - "repeats": 1 - }, - { - "count": 86, - "lower_bound": "ODY=", - "upper_bound": "ODY=", - "repeats": 1 - }, - { - "count": 87, - "lower_bound": "ODc=", - "upper_bound": "ODc=", - "repeats": 1 - }, - { - "count": 88, - "lower_bound": "ODg=", - "upper_bound": "ODg=", - "repeats": 1 - }, - { - "count": 89, - "lower_bound": "ODk=", - "upper_bound": "ODk=", - "repeats": 1 - }, - { - "count": 90, - "lower_bound": "OTA=", - "upper_bound": "OTA=", - "repeats": 1 - }, - { - "count": 91, - "lower_bound": "OTE=", - "upper_bound": "OTE=", - "repeats": 1 - }, - { - "count": 92, - "lower_bound": "OTI=", - "upper_bound": "OTI=", - "repeats": 1 - }, - { - "count": 93, - "lower_bound": "OTM=", - "upper_bound": "OTM=", - "repeats": 1 - }, - { - "count": 94, - "lower_bound": "OTQ=", - "upper_bound": "OTQ=", - "repeats": 1 - }, - { - "count": 95, - "lower_bound": "OTU=", - "upper_bound": "OTU=", - "repeats": 1 - }, - { - "count": 96, - "lower_bound": "OTY=", - "upper_bound": "OTY=", - "repeats": 1 - }, - { - "count": 97, - "lower_bound": "OTc=", - "upper_bound": "OTc=", - "repeats": 1 - }, - { - "count": 98, - "lower_bound": "OTg=", - "upper_bound": "OTg=", - "repeats": 1 - }, - { - "count": 99, - "lower_bound": "OTk=", - "upper_bound": "OTk=", - "repeats": 1 - }, - { - "count": 100, - "lower_bound": "MTAw", - "upper_bound": "MTAw", - "repeats": 1 - }, - { - "count": 101, - "lower_bound": "MTAx", - "upper_bound": "MTAx", - "repeats": 1 - }, - { - "count": 102, - "lower_bound": "MTAy", - "upper_bound": "MTAy", - "repeats": 1 - }, - { - "count": 103, - "lower_bound": "MTAz", - "upper_bound": "MTAz", - "repeats": 1 - }, - { - "count": 104, - "lower_bound": "MTA0", - "upper_bound": "MTA0", - "repeats": 1 - }, - { - "count": 105, - "lower_bound": "MTA1", - "upper_bound": "MTA1", - "repeats": 1 - }, - { - "count": 106, - "lower_bound": "MTA2", - "upper_bound": "MTA2", - "repeats": 1 - }, - { - "count": 107, - "lower_bound": "MTA3", - "upper_bound": "MTA3", - "repeats": 1 - }, - { - "count": 108, - "lower_bound": "MTA4", - "upper_bound": "MTA4", - "repeats": 1 - }, - { - "count": 109, - "lower_bound": "MTA5", - "upper_bound": "MTA5", - "repeats": 1 - }, - { - "count": 110, - "lower_bound": "MTEw", - "upper_bound": "MTEw", - "repeats": 1 - }, - { - "count": 111, - "lower_bound": "MTEx", - "upper_bound": "MTEx", - "repeats": 1 - }, - { - "count": 112, - "lower_bound": "MTEy", - "upper_bound": "MTEy", - "repeats": 1 - }, - { - "count": 113, - "lower_bound": "MTEz", - "upper_bound": "MTEz", - "repeats": 1 - }, - { - "count": 114, - "lower_bound": "MTE0", - "upper_bound": "MTE0", - "repeats": 1 - }, - { - "count": 115, - "lower_bound": "MTE1", - "upper_bound": "MTE1", - "repeats": 1 - }, - { - "count": 116, - "lower_bound": "MTE2", - "upper_bound": "MTE2", - "repeats": 1 - }, - { - "count": 117, - "lower_bound": "MTE3", - "upper_bound": "MTE3", - "repeats": 1 - }, - { - "count": 118, - "lower_bound": "MTE4", - "upper_bound": "MTE4", - "repeats": 1 - }, - { - "count": 119, - "lower_bound": "MTE5", - "upper_bound": "MTE5", - "repeats": 1 - }, - { - "count": 120, - "lower_bound": "MTIw", - "upper_bound": "MTIw", - "repeats": 1 - }, - { - "count": 121, - "lower_bound": "MTIx", - "upper_bound": "MTIx", - "repeats": 1 - }, - { - "count": 122, - "lower_bound": "MTIy", - "upper_bound": "MTIy", - "repeats": 1 - }, - { - "count": 123, - "lower_bound": "MTIz", - "upper_bound": "MTIz", - "repeats": 1 - }, - { - "count": 124, - "lower_bound": "MTI0", - "upper_bound": "MTI0", - "repeats": 1 - }, - { - "count": 125, - "lower_bound": "MTI1", - "upper_bound": "MTI1", - "repeats": 1 - }, - { - "count": 126, - "lower_bound": "MTI2", - "upper_bound": "MTI2", - "repeats": 1 - }, - { - "count": 127, - "lower_bound": "MTI3", - "upper_bound": "MTI3", - "repeats": 1 - }, - { - "count": 128, - "lower_bound": "MTI4", - "upper_bound": "MTI4", - "repeats": 1 - }, - { - "count": 129, - "lower_bound": "MTI5", - "upper_bound": "MTI5", - "repeats": 1 - }, - { - "count": 130, - "lower_bound": "MTMw", - "upper_bound": "MTMw", - "repeats": 1 - }, - { - "count": 131, - "lower_bound": "MTMx", - "upper_bound": "MTMx", - "repeats": 1 - }, - { - "count": 132, - "lower_bound": "MTMy", - "upper_bound": "MTMy", - "repeats": 1 - }, - { - "count": 133, - "lower_bound": "MTMz", - "upper_bound": "MTMz", - "repeats": 1 - }, - { - "count": 134, - "lower_bound": "MTM0", - "upper_bound": "MTM0", - "repeats": 1 - }, - { - "count": 135, - "lower_bound": "MTM1", - "upper_bound": "MTM1", - "repeats": 1 - }, - { - "count": 136, - "lower_bound": "MTM2", - "upper_bound": "MTM2", - "repeats": 1 - }, - { - "count": 137, - "lower_bound": "MTM3", - "upper_bound": "MTM3", - "repeats": 1 - }, - { - "count": 138, - "lower_bound": "MTM4", - "upper_bound": "MTM4", - "repeats": 1 - }, - { - "count": 139, - "lower_bound": "MTM5", - "upper_bound": "MTM5", - "repeats": 1 - }, - { - "count": 140, - "lower_bound": "MTQw", - "upper_bound": "MTQw", - "repeats": 1 - }, - { - "count": 141, - "lower_bound": "MTQx", - "upper_bound": "MTQx", - "repeats": 1 - }, - { - "count": 142, - "lower_bound": "MTQy", - "upper_bound": "MTQy", - "repeats": 1 - }, - { - "count": 143, - "lower_bound": "MTQz", - "upper_bound": "MTQz", - "repeats": 1 - }, - { - "count": 144, - "lower_bound": "MTQ0", - "upper_bound": "MTQ0", - "repeats": 1 - }, - { - "count": 145, - "lower_bound": "MTQ1", - "upper_bound": "MTQ1", - "repeats": 1 - }, - { - "count": 146, - "lower_bound": "MTQ2", - "upper_bound": "MTQ2", - "repeats": 1 - }, - { - "count": 147, - "lower_bound": "MTQ3", - "upper_bound": "MTQ3", - "repeats": 1 - }, - { - "count": 148, - "lower_bound": "MTQ4", - "upper_bound": "MTQ4", - "repeats": 1 - }, - { - "count": 149, - "lower_bound": "MTQ5", - "upper_bound": "MTQ5", - "repeats": 1 - }, - { - "count": 150, - "lower_bound": "MTUw", - "upper_bound": "MTUw", - "repeats": 1 - }, - { - "count": 151, - "lower_bound": "MTUx", - "upper_bound": "MTUx", - "repeats": 1 - }, - { - "count": 152, - "lower_bound": "MTUy", - "upper_bound": "MTUy", - "repeats": 1 - }, - { - "count": 153, - "lower_bound": "MTUz", - "upper_bound": "MTUz", - "repeats": 1 - }, - { - "count": 154, - "lower_bound": "MTU0", - "upper_bound": "MTU0", - "repeats": 1 - }, - { - "count": 155, - "lower_bound": "MTU1", - "upper_bound": "MTU1", - "repeats": 1 - }, - { - "count": 156, - "lower_bound": "MTU2", - "upper_bound": "MTU2", - "repeats": 1 - }, - { - "count": 157, - "lower_bound": "MTU3", - "upper_bound": "MTU3", - "repeats": 1 - }, - { - "count": 158, - "lower_bound": "MTU4", - "upper_bound": "MTU4", - "repeats": 1 - }, - { - "count": 159, - "lower_bound": "MTU5", - "upper_bound": "MTU5", - "repeats": 1 - }, - { - "count": 160, - "lower_bound": "MTYw", - "upper_bound": "MTYw", - "repeats": 1 - }, - { - "count": 161, - "lower_bound": "MTYx", - "upper_bound": "MTYx", - "repeats": 1 - }, - { - "count": 162, - "lower_bound": "MTYy", - "upper_bound": "MTYy", - "repeats": 1 - }, - { - "count": 163, - "lower_bound": "MTYz", - "upper_bound": "MTYz", - "repeats": 1 - }, - { - "count": 164, - "lower_bound": "MTY0", - "upper_bound": "MTY0", - "repeats": 1 - }, - { - "count": 165, - "lower_bound": "MTY1", - "upper_bound": "MTY1", - "repeats": 1 - }, - { - "count": 166, - "lower_bound": "MTY2", - "upper_bound": "MTY2", - "repeats": 1 - }, - { - "count": 167, - "lower_bound": "MTY3", - "upper_bound": "MTY3", - "repeats": 1 - }, - { - "count": 168, - "lower_bound": "MTY4", - "upper_bound": "MTY4", - "repeats": 1 - }, - { - "count": 169, - "lower_bound": "MTY5", - "upper_bound": "MTY5", - "repeats": 1 - }, - { - "count": 170, - "lower_bound": "MTcw", - "upper_bound": "MTcw", - "repeats": 1 - }, - { - "count": 171, - "lower_bound": "MTcx", - "upper_bound": "MTcx", - "repeats": 1 - }, - { - "count": 172, - "lower_bound": "MTcy", - "upper_bound": "MTcy", - "repeats": 1 - }, - { - "count": 173, - "lower_bound": "MTcz", - "upper_bound": "MTcz", - "repeats": 1 - }, - { - "count": 174, - "lower_bound": "MTc0", - "upper_bound": "MTc0", - "repeats": 1 - }, - { - "count": 175, - "lower_bound": "MTc1", - "upper_bound": "MTc1", - "repeats": 1 - }, - { - "count": 176, - "lower_bound": "MTc2", - "upper_bound": "MTc2", - "repeats": 1 - }, - { - "count": 177, - "lower_bound": "MTc3", - "upper_bound": "MTc3", - "repeats": 1 - }, - { - "count": 178, - "lower_bound": "MTc4", - "upper_bound": "MTc4", - "repeats": 1 - }, - { - "count": 179, - "lower_bound": "MTc5", - "upper_bound": "MTc5", - "repeats": 1 - }, - { - "count": 180, - "lower_bound": "MTgw", - "upper_bound": "MTgw", - "repeats": 1 - }, - { - "count": 181, - "lower_bound": "MTgx", - "upper_bound": "MTgx", - "repeats": 1 - }, - { - "count": 182, - "lower_bound": "MTgy", - "upper_bound": "MTgy", - "repeats": 1 - }, - { - "count": 183, - "lower_bound": "MTgz", - "upper_bound": "MTgz", - "repeats": 1 - }, - { - "count": 184, - "lower_bound": "MTg0", - "upper_bound": "MTg0", - "repeats": 1 - }, - { - "count": 185, - "lower_bound": "MTg1", - "upper_bound": "MTg1", - "repeats": 1 - }, - { - "count": 186, - "lower_bound": "MTg2", - "upper_bound": "MTg2", - "repeats": 1 - }, - { - "count": 187, - "lower_bound": "MTg3", - "upper_bound": "MTg3", - "repeats": 1 - }, - { - "count": 188, - "lower_bound": "MTg4", - "upper_bound": "MTg4", - "repeats": 1 - }, - { - "count": 189, - "lower_bound": "MTg5", - "upper_bound": "MTg5", - "repeats": 1 - }, - { - "count": 190, - "lower_bound": "MTkw", - "upper_bound": "MTkw", - "repeats": 1 - }, - { - "count": 191, - "lower_bound": "MTkx", - "upper_bound": "MTkx", - "repeats": 1 - }, - { - "count": 192, - "lower_bound": "MTky", - "upper_bound": "MTky", - "repeats": 1 - }, - { - "count": 193, - "lower_bound": "MTkz", - "upper_bound": "MTkz", - "repeats": 1 - }, - { - "count": 194, - "lower_bound": "MTk0", - "upper_bound": "MTk0", - "repeats": 1 - }, - { - "count": 195, - "lower_bound": "MTk1", - "upper_bound": "MTk1", - "repeats": 1 - }, - { - "count": 196, - "lower_bound": "MTk2", - "upper_bound": "MTk2", - "repeats": 1 - }, - { - "count": 197, - "lower_bound": "MTk3", - "upper_bound": "MTk3", - "repeats": 1 - }, - { - "count": 198, - "lower_bound": "MTk4", - "upper_bound": "MTk4", - "repeats": 1 - }, - { - "count": 199, - "lower_bound": "MTk5", - "upper_bound": "MTk5", - "repeats": 1 - }, - { - "count": 200, - "lower_bound": "MjAw", - "upper_bound": "MjAw", - "repeats": 1 - }, - { - "count": 201, - "lower_bound": "MjAx", - "upper_bound": "MjAx", - "repeats": 1 - }, - { - "count": 202, - "lower_bound": "MjAy", - "upper_bound": "MjAy", - "repeats": 1 - }, - { - "count": 203, - "lower_bound": "MjAz", - "upper_bound": "MjAz", - "repeats": 1 - }, - { - "count": 204, - "lower_bound": "MjA0", - "upper_bound": "MjA0", - "repeats": 1 - }, - { - "count": 205, - "lower_bound": "MjA1", - "upper_bound": "MjA1", - "repeats": 1 - }, - { - "count": 206, - "lower_bound": "MjA2", - "upper_bound": "MjA2", - "repeats": 1 - }, - { - "count": 207, - "lower_bound": "MjA3", - "upper_bound": "MjA3", - "repeats": 1 - }, - { - "count": 208, - "lower_bound": "MjA4", - "upper_bound": "MjA4", - "repeats": 1 - }, - { - "count": 209, - "lower_bound": "MjA5", - "upper_bound": "MjA5", - "repeats": 1 - }, - { - "count": 210, - "lower_bound": "MjEw", - "upper_bound": "MjEw", - "repeats": 1 - }, - { - "count": 211, - "lower_bound": "MjEx", - "upper_bound": "MjEx", - "repeats": 1 - }, - { - "count": 212, - "lower_bound": "MjEy", - "upper_bound": "MjEy", - "repeats": 1 - }, - { - "count": 213, - "lower_bound": "MjEz", - "upper_bound": "MjEz", - "repeats": 1 - }, - { - "count": 214, - "lower_bound": "MjE0", - "upper_bound": "MjE0", - "repeats": 1 - }, - { - "count": 215, - "lower_bound": "MjE1", - "upper_bound": "MjE1", - "repeats": 1 - }, - { - "count": 216, - "lower_bound": "MjE2", - "upper_bound": "MjE2", - "repeats": 1 - }, - { - "count": 217, - "lower_bound": "MjE3", - "upper_bound": "MjE3", - "repeats": 1 - }, - { - "count": 218, - "lower_bound": "MjE4", - "upper_bound": "MjE4", - "repeats": 1 - }, - { - "count": 219, - "lower_bound": "MjE5", - "upper_bound": "MjE5", - "repeats": 1 - }, - { - "count": 220, - "lower_bound": "MjIw", - "upper_bound": "MjIw", - "repeats": 1 - }, - { - "count": 221, - "lower_bound": "MjIx", - "upper_bound": "MjIx", - "repeats": 1 - }, - { - "count": 222, - "lower_bound": "MjIy", - "upper_bound": "MjIy", - "repeats": 1 - }, - { - "count": 223, - "lower_bound": "MjIz", - "upper_bound": "MjIz", - "repeats": 1 - }, - { - "count": 224, - "lower_bound": "MjI0", - "upper_bound": "MjI0", - "repeats": 1 - }, - { - "count": 225, - "lower_bound": "MjI1", - "upper_bound": "MjI1", - "repeats": 1 - }, - { - "count": 226, - "lower_bound": "MjI2", - "upper_bound": "MjI2", - "repeats": 1 - }, - { - "count": 227, - "lower_bound": "MjI3", - "upper_bound": "MjI3", - "repeats": 1 - }, - { - "count": 228, - "lower_bound": "MjI4", - "upper_bound": "MjI4", - "repeats": 1 - }, - { - "count": 229, - "lower_bound": "MjI5", - "upper_bound": "MjI5", - "repeats": 1 - }, - { - "count": 230, - "lower_bound": "MjMw", - "upper_bound": "MjMw", - "repeats": 1 - }, - { - "count": 231, - "lower_bound": "MjMx", - "upper_bound": "MjMx", - "repeats": 1 - }, - { - "count": 232, - "lower_bound": "MjMy", - "upper_bound": "MjMy", - "repeats": 1 - }, - { - "count": 233, - "lower_bound": "MjMz", - "upper_bound": "MjMz", - "repeats": 1 - }, - { - "count": 234, - "lower_bound": "MjM0", - "upper_bound": "MjM0", - "repeats": 1 - }, - { - "count": 235, - "lower_bound": "MjM1", - "upper_bound": "MjM1", - "repeats": 1 - }, - { - "count": 236, - "lower_bound": "MjM2", - "upper_bound": "MjM2", - "repeats": 1 - }, - { - "count": 237, - "lower_bound": "MjM3", - "upper_bound": "MjM3", - "repeats": 1 - }, - { - "count": 238, - "lower_bound": "MjM4", - "upper_bound": "MjM4", - "repeats": 1 - }, - { - "count": 239, - "lower_bound": "MjM5", - "upper_bound": "MjM5", - "repeats": 1 - }, - { - "count": 240, - "lower_bound": "MjQw", - "upper_bound": "MjQw", - "repeats": 1 - }, - { - "count": 241, - "lower_bound": "MjQx", - "upper_bound": "MjQx", - "repeats": 1 - }, - { - "count": 242, - "lower_bound": "MjQy", - "upper_bound": "MjQy", - "repeats": 1 - }, - { - "count": 243, - "lower_bound": "MjQz", - "upper_bound": "MjQz", - "repeats": 1 - }, - { - "count": 244, - "lower_bound": "MjQ0", - "upper_bound": "MjQ0", - "repeats": 1 - }, - { - "count": 245, - "lower_bound": "MjQ1", - "upper_bound": "MjQ1", - "repeats": 1 - }, - { - "count": 246, - "lower_bound": "MjQ2", - "upper_bound": "MjQ2", - "repeats": 1 - }, - { - "count": 247, - "lower_bound": "MjQ3", - "upper_bound": "MjQ3", - "repeats": 1 - }, - { - "count": 248, - "lower_bound": "MjQ4", - "upper_bound": "MjQ4", - "repeats": 1 - }, - { - "count": 249, - "lower_bound": "MjQ5", - "upper_bound": "MjQ5", - "repeats": 1 - }, - { - "count": 250, - "lower_bound": "MjUw", - "upper_bound": "MjUw", - "repeats": 1 - } - ] - }, - "cm_sketch": null, - "null_count": 0, - "tot_col_size": 0, - "last_update_version": 412596211834421248, - "correlation": 0 - } - }, - "indices": {}, - "count": 250, - "modify_count": 0, - "partitions": null -} diff --git a/cmd/explaintest/s/explain_stats_t.json b/cmd/explaintest/s/explain_stats_t.json deleted file mode 100644 index 141ad010d2f93..0000000000000 --- a/cmd/explaintest/s/explain_stats_t.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"test","table_name":"t","columns":{"c1":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"MjAxOC0wMS0wMSAwNDo1Njo1NA==","upper_bound":"MjAxOC0wMS0wMSAyMjoxNDoyNw==","repeats":1},{"count":16,"lower_bound":"MjAxOC0wMS0wMiAwNDoxOTozMw==","upper_bound":"MjAxOC0wMS0wMiAxOToxMzo0Nw==","repeats":1},{"count":24,"lower_bound":"MjAxOC0wMS0wMiAyMTozNDo1OQ==","upper_bound":"MjAxOC0wMS0wMyAxNjo1MjowNw==","repeats":1},{"count":32,"lower_bound":"MjAxOC0wMS0wNCAwMToyMDo0OA==","upper_bound":"MjAxOC0wMS0wNCAxMToyMDoyNA==","repeats":1},{"count":40,"lower_bound":"MjAxOC0wMS0wNCAxNDozNToxNA==","upper_bound":"MjAxOC0wMS0wNCAyMjozNjo0Mg==","repeats":1},{"count":48,"lower_bound":"MjAxOC0wMS0wNCAyMjo0MDo1MA==","upper_bound":"MjAxOC0wMS0wNiAwMToyMTowMQ==","repeats":1},{"count":56,"lower_bound":"MjAxOC0wMS0wNiAwODozMzoxMA==","upper_bound":"MjAxOC0wMS0wNiAyMjoxNjowMA==","repeats":1},{"count":64,"lower_bound":"MjAxOC0wMS0wNyAwMToxNDoyMQ==","upper_bound":"MjAxOC0wMS0wNyAxNDo1NjoxOA==","repeats":1},{"count":72,"lower_bound":"MjAxOC0wMS0wNyAxNjoyMTowOQ==","upper_bound":"MjAxOC0wMS0wOSAxMjowNTo1OQ==","repeats":1},{"count":80,"lower_bound":"MjAxOC0wMS0wOSAxNToxMDowMA==","upper_bound":"MjAxOC0wMS0xMCAwODo1Mjo0OA==","repeats":1},{"count":88,"lower_bound":"MjAxOC0wMS0xMCAxMjozMjozMg==","upper_bound":"MjAxOC0wMS0xMSAxMjozMTowNQ==","repeats":1},{"count":96,"lower_bound":"MjAxOC0wMS0xMSAxMjo1NzoyOA==","upper_bound":"MjAxOC0wMS0xMyAxNjowNjowOQ==","repeats":1},{"count":104,"lower_bound":"MjAxOC0wMS0xMyAxNjoxMzoxMg==","upper_bound":"MjAxOC0wMS0xNCAwNTozNTozMA==","repeats":1},{"count":112,"lower_bound":"MjAxOC0wMS0xNCAyMzoyNTo0Nw==","upper_bound":"MjAxOC0wMS0xNSAyMTozNToyNw==","repeats":1},{"count":120,"lower_bound":"MjAxOC0wMS0xNSAyMTo0NTo1OQ==","upper_bound":"MjAxOC0wMS0xNiAxNjozNToyMQ==","repeats":1},{"count":128,"lower_bound":"MjAxOC0wMS0xNiAyMDoxMzoyNA==","upper_bound":"MjAxOC0wMS0xNyAyMDo0NjozMg==","repeats":1},{"count":136,"lower_bound":"MjAxOC0wMS0xOCAwNToxODoyOA==","upper_bound":"MjAxOC0wMS0xOSAxMjowNDozOA==","repeats":1},{"count":144,"lower_bound":"MjAxOC0wMS0xOSAxNzozNToyOA==","upper_bound":"MjAxOC0wMS0yMyAwMDozMTo0OQ==","repeats":1},{"count":152,"lower_bound":"MjAxOC0wMS0yNCAwNTowODozOA==","upper_bound":"MjAxOC0wMS0yNCAxMDo0NjoxNA==","repeats":1},{"count":160,"lower_bound":"MjAxOC0wMS0yNCAxODoxMjoyNQ==","upper_bound":"MjAxOC0wMS0yNSAwNToxNjo1MA==","repeats":1},{"count":168,"lower_bound":"MjAxOC0wMS0yNSAxMDoyNTozMQ==","upper_bound":"MjAxOC0wMS0yNiAwMzozNToxMA==","repeats":1},{"count":176,"lower_bound":"MjAxOC0wMS0yNiAwNTo1OToyMQ==","upper_bound":"MjAxOC0wMS0yOCAxNDo0NTowMQ==","repeats":1},{"count":184,"lower_bound":"MjAxOC0wMi0wMSAwMjowNjoxNA==","upper_bound":"MjAxOC0wMi0wMSAxNjoyMDozNg==","repeats":1},{"count":192,"lower_bound":"MjAxOC0wMi0wMiAyMTozMzowOQ==","upper_bound":"MjAxOC0wMi0wMyAwNzowNToyMQ==","repeats":1},{"count":200,"lower_bound":"MjAxOC0wMi0wMyAxOTo1MjozNw==","upper_bound":"MjAxOC0wMi0wNSAwMjo0ODo0Mg==","repeats":1},{"count":208,"lower_bound":"MjAxOC0wMi0wNSAwNjowMzozNQ==","upper_bound":"MjAxOC0wMi0wNiAyMTo0ODozOQ==","repeats":1},{"count":216,"lower_bound":"MjAxOC0wMi0wNyAwNzoxNjozNg==","upper_bound":"MjAxOC0wMi0wNyAyMDozMDo0MA==","repeats":1},{"count":224,"lower_bound":"MjAxOC0wMi0wOSAwMDoyNDoxOQ==","upper_bound":"MjAxOC0wMi0wOSAxNzoyMDo0Mw==","repeats":1},{"count":232,"lower_bound":"MjAxOC0wMi0xMCAxNzoyODoxMw==","upper_bound":"MjAxOC0wMi0xMSAwNDoyODo0OQ==","repeats":1},{"count":240,"lower_bound":"MjAxOC0wMi0xMSAxMjowMzo1Mg==","upper_bound":"MjAxOC0wMi0xMyAwMDo0NTo1Mw==","repeats":1},{"count":248,"lower_bound":"MjAxOC0wMi0xMyAxNDo1MjozMQ==","upper_bound":"MjAxOC0wMi0xNSAwMDowNToyMg==","repeats":1},{"count":256,"lower_bound":"MjAxOC0wMi0xNSAwMDo1NzoxOA==","upper_bound":"MjAxOC0wMi0xNSAxNDoyMjo1NA==","repeats":1},{"count":264,"lower_bound":"MjAxOC0wMi0xNiAxMzoyMzo0Ng==","upper_bound":"MjAxOC0wMi0xNyAwNDo1Mjo0MA==","repeats":1},{"count":272,"lower_bound":"MjAxOC0wMi0xNyAwNjoxOToxNg==","upper_bound":"MjAxOC0wMi0xOCAwODozMTozNg==","repeats":1},{"count":280,"lower_bound":"MjAxOC0wMi0xOCAxMDoyMjo0MQ==","upper_bound":"MjAxOC0wMi0xOSAwNjowOTowMQ==","repeats":1},{"count":288,"lower_bound":"MjAxOC0wMi0yMCAwMjowODozMg==","upper_bound":"MjAxOC0wMi0yMCAxNjoyOToyOA==","repeats":1},{"count":296,"lower_bound":"MjAxOC0wMi0yMCAxOTo0Mzo1MA==","upper_bound":"MjAxOC0wMi0yMSAxODowODo0Mg==","repeats":1},{"count":304,"lower_bound":"MjAxOC0wMi0yMiAwODowNDoyMw==","upper_bound":"MjAxOC0wMi0yMiAxNTo1NTowNQ==","repeats":1},{"count":312,"lower_bound":"MjAxOC0wMi0yMiAxNzo1MzozNQ==","upper_bound":"MjAxOC0wMi0yMyAyMjoyMTowNw==","repeats":1},{"count":320,"lower_bound":"MjAxOC0wMi0yNCAwMDo0NDowNg==","upper_bound":"MjAxOC0wMi0yNSAxODo0MjozOQ==","repeats":1},{"count":328,"lower_bound":"MjAxOC0wMi0yNSAyMDoyNTo0NA==","upper_bound":"MjAxOC0wMi0yOCAwMzowNzoxMg==","repeats":1},{"count":336,"lower_bound":"MjAxOC0wMi0yOCAxMDoxMzo0Nw==","upper_bound":"MjAxOC0wMy0wMSAwOTo0MDoxOA==","repeats":1},{"count":344,"lower_bound":"MjAxOC0wMy0wMSAxNzozMjoyNw==","upper_bound":"MjAxOC0wMy0wMiAwMjowODowNg==","repeats":1},{"count":352,"lower_bound":"MjAxOC0wMy0wMyAwMTo0NDo1NA==","upper_bound":"MjAxOC0wMy0wNCAxOToxOToyNQ==","repeats":1},{"count":360,"lower_bound":"MjAxOC0wMy0wNSAwMzo1NjoyNg==","upper_bound":"MjAxOC0wMy0wNSAxODoxODoxOA==","repeats":1},{"count":368,"lower_bound":"MjAxOC0wMy0wNSAyMDo1NjoxNQ==","upper_bound":"MjAxOC0wMy0wNiAwNToxMzo0Mg==","repeats":1},{"count":376,"lower_bound":"MjAxOC0wMy0wNiAwNToxNDozNQ==","upper_bound":"MjAxOC0wMy0wNyAwMTo1ODo0OA==","repeats":1},{"count":384,"lower_bound":"MjAxOC0wMy0wOCAxMDo0Mjo1NQ==","upper_bound":"MjAxOC0wMy0wOSAwNTozMzoxNQ==","repeats":1},{"count":392,"lower_bound":"MjAxOC0wMy0wOSAxMDozMDoyMA==","upper_bound":"MjAxOC0wMy0xMCAwOTo1MDozMg==","repeats":1},{"count":400,"lower_bound":"MjAxOC0wMy0xMSAwMzo0Njo0OQ==","upper_bound":"MjAxOC0wMy0xMSAxNToxNTo0MA==","repeats":1},{"count":408,"lower_bound":"MjAxOC0wMy0xMSAxNjowMTo0OQ==","upper_bound":"MjAxOC0wMy0xMyAwMTowODo0Nw==","repeats":1},{"count":416,"lower_bound":"MjAxOC0wMy0xMyAwNToxMDo0Ng==","upper_bound":"MjAxOC0wMy0xMyAyMjoxNTo0NA==","repeats":1},{"count":424,"lower_bound":"MjAxOC0wMy0xNCAwNTo0NToyNw==","upper_bound":"MjAxOC0wMy0xNSAwMzo0NDo1Ng==","repeats":1},{"count":432,"lower_bound":"MjAxOC0wMy0xNSAwNzowNDozNg==","upper_bound":"MjAxOC0wMy0xNiAyMDoxMTo0Nw==","repeats":1},{"count":440,"lower_bound":"MjAxOC0wMy0xNiAyMzoyMDo1MQ==","upper_bound":"MjAxOC0wMy0xNyAyMDoyNToyOQ==","repeats":1},{"count":448,"lower_bound":"MjAxOC0wMy0xNyAyMjo0Nzo0MQ==","upper_bound":"MjAxOC0wMy0yMCAwMjo1MzozMg==","repeats":1},{"count":456,"lower_bound":"MjAxOC0wMy0yMCAwMzoyNDozMQ==","upper_bound":"MjAxOC0wMy0yMSAxMDo1OTozOQ==","repeats":1},{"count":464,"lower_bound":"MjAxOC0wMy0yMSAyMTowNzowMw==","upper_bound":"MjAxOC0wMy0yMyAxMjo1Njo0Nw==","repeats":1},{"count":472,"lower_bound":"MjAxOC0wMy0yMyAxNjoyNjozMg==","upper_bound":"MjAxOC0wMy0yNCAwMjo0Njo0OQ==","repeats":1},{"count":480,"lower_bound":"MjAxOC0wMy0yNCAwODoxMzoxNg==","upper_bound":"MjAxOC0wMy0yNyAwMTo1MToyOA==","repeats":1},{"count":488,"lower_bound":"MjAxOC0wMy0yNyAxOTowMDo1Mg==","upper_bound":"MjAxOC0wNC0wMSAwMjoyOToyMA==","repeats":1},{"count":496,"lower_bound":"MjAxOC0wNC0wMSAwMzoyOTo0OQ==","upper_bound":"MjAxOC0wNC0wMSAyMTozNjowNg==","repeats":1},{"count":504,"lower_bound":"MjAxOC0wNC0wMiAxOTo0NTozNQ==","upper_bound":"MjAxOC0wNC0wNCAwODoxMzoyMg==","repeats":1},{"count":512,"lower_bound":"MjAxOC0wNC0wNCAxMjo1ODowMQ==","upper_bound":"MjAxOC0wNC0wNCAyMzoxMTowNw==","repeats":1},{"count":520,"lower_bound":"MjAxOC0wNC0wNSAwMjoyNjo1Nw==","upper_bound":"MjAxOC0wNC0wNSAxOToxNDo0OA==","repeats":1},{"count":528,"lower_bound":"MjAxOC0wNC0wNiAwMzozNjoyNA==","upper_bound":"MjAxOC0wNC0wOCAwMDowOToyNw==","repeats":1},{"count":536,"lower_bound":"MjAxOC0wNC0wOSAwNzowNDo1NQ==","upper_bound":"MjAxOC0wNC0wOSAyMjoxMTowNg==","repeats":1},{"count":544,"lower_bound":"MjAxOC0wNC0xMCAwMDo0NTowMw==","upper_bound":"MjAxOC0wNC0xMCAwOTowMzowNQ==","repeats":1},{"count":552,"lower_bound":"MjAxOC0wNC0xMCAwOTo0ODoyMw==","upper_bound":"MjAxOC0wNC0xMSAwMTo0NjowNg==","repeats":1},{"count":560,"lower_bound":"MjAxOC0wNC0xMSAwNDoxMjozNA==","upper_bound":"MjAxOC0wNC0xMiAxNjoyOTo0Mg==","repeats":1},{"count":568,"lower_bound":"MjAxOC0wNC0xMyAwMjoxNTowNw==","upper_bound":"MjAxOC0wNC0xNCAyMjoxMTowOQ==","repeats":1},{"count":576,"lower_bound":"MjAxOC0wNC0xNSAxMjo0ODo0NQ==","upper_bound":"MjAxOC0wNC0xNiAxMTo0NjozMA==","repeats":1},{"count":584,"lower_bound":"MjAxOC0wNC0xNiAxMjo1OTowNQ==","upper_bound":"MjAxOC0wNC0xOCAwMTowOTowNA==","repeats":1},{"count":592,"lower_bound":"MjAxOC0wNC0xOCAwMjowMToxNg==","upper_bound":"MjAxOC0wNC0xOSAxNTo0NjoyNw==","repeats":1},{"count":600,"lower_bound":"MjAxOC0wNC0xOSAyMzoyMDowOQ==","upper_bound":"MjAxOC0wNC0yMSAwNDo0ODoyMw==","repeats":1},{"count":608,"lower_bound":"MjAxOC0wNC0yMSAwNzo1NDo0MQ==","upper_bound":"MjAxOC0wNC0yMiAxNToxODowNA==","repeats":1},{"count":616,"lower_bound":"MjAxOC0wNC0yMiAyMToyNDozOA==","upper_bound":"MjAxOC0wNC0yMyAyMToyNjo1Nw==","repeats":1},{"count":624,"lower_bound":"MjAxOC0wNC0yNCAwMDo0MTo1NA==","upper_bound":"MjAxOC0wNC0yNSAwMToyMzozMg==","repeats":1},{"count":632,"lower_bound":"MjAxOC0wNC0yNSAwMjo0NjoxNA==","upper_bound":"MjAxOC0wNC0yNiAwNDo0NzowMg==","repeats":1},{"count":640,"lower_bound":"MjAxOC0wNC0yNiAwNjo0MTo0Ng==","upper_bound":"MjAxOC0wNC0yNiAyMzozMjoxMA==","repeats":1},{"count":648,"lower_bound":"MjAxOC0wNC0yNyAwMDo1ODowOA==","upper_bound":"MjAxOC0wNC0yNyAxNDoxNjo1OA==","repeats":1},{"count":656,"lower_bound":"MjAxOC0wNC0yNyAyMToyNjo1MA==","upper_bound":"MjAxOC0wNS0wMSAyMjoxNDo1NQ==","repeats":1},{"count":664,"lower_bound":"MjAxOC0wNS0wMyAwODozNjoyNw==","upper_bound":"MjAxOC0wNS0wNCAwNTozMDoyOQ==","repeats":1},{"count":672,"lower_bound":"MjAxOC0wNS0wNCAwNzo0MzoxMw==","upper_bound":"MjAxOC0wNS0wNSAwMjoyMzozNg==","repeats":1},{"count":680,"lower_bound":"MjAxOC0wNS0wNSAwNDo1MTo0OA==","upper_bound":"MjAxOC0wNS0wNSAxNDo0MTozNA==","repeats":1},{"count":688,"lower_bound":"MjAxOC0wNS0wNiAwOTo1NjoyOQ==","upper_bound":"MjAxOC0wNS0wNiAyMjoyMjoxNg==","repeats":1},{"count":696,"lower_bound":"MjAxOC0wNS0wNyAwMDoxMDowNQ==","upper_bound":"MjAxOC0wNS0wOCAwMjowNDo1NA==","repeats":1},{"count":704,"lower_bound":"MjAxOC0wNS0wOCAxMzo0NzoyMg==","upper_bound":"MjAxOC0wNS0wOSAwMjo1MzoyNw==","repeats":1},{"count":712,"lower_bound":"MjAxOC0wNS0wOSAyMzo0OTo0NA==","upper_bound":"MjAxOC0wNS0xMSAxMTowNTo0NA==","repeats":1},{"count":720,"lower_bound":"MjAxOC0wNS0xMSAxNDowMjozMg==","upper_bound":"MjAxOC0wNS0xMiAwMzoyOTo0Mw==","repeats":1},{"count":728,"lower_bound":"MjAxOC0wNS0xMiAxMDoyNTozNw==","upper_bound":"MjAxOC0wNS0xMyAxMDozMDoyNQ==","repeats":1},{"count":736,"lower_bound":"MjAxOC0wNS0xMyAxMDo1NToxOA==","upper_bound":"MjAxOC0wNS0xNCAxODozODo1MA==","repeats":1},{"count":744,"lower_bound":"MjAxOC0wNS0xNCAxODo0OToyOQ==","upper_bound":"MjAxOC0wNS0xNiAwNzo0NzoxMg==","repeats":1},{"count":752,"lower_bound":"MjAxOC0wNS0xNiAxMzoxNzoxOQ==","upper_bound":"MjAxOC0wNS0xOCAwNDowMzowNg==","repeats":1},{"count":760,"lower_bound":"MjAxOC0wNS0xOCAwNToyMjoyOQ==","upper_bound":"MjAxOC0wNS0yMCAwMjoxNjo0NQ==","repeats":1},{"count":768,"lower_bound":"MjAxOC0wNS0yMCAwMzoyNzo0OQ==","upper_bound":"MjAxOC0wNS0yMSAwMDo1NDo1Nw==","repeats":1},{"count":776,"lower_bound":"MjAxOC0wNS0yMiAwMDo1ODoyMA==","upper_bound":"MjAxOC0wNS0yMiAxODoyMzozMA==","repeats":1},{"count":784,"lower_bound":"MjAxOC0wNS0yMyAwODo1NzowOQ==","upper_bound":"MjAxOC0wNS0yMyAxNDozNjo0NQ==","repeats":1},{"count":792,"lower_bound":"MjAxOC0wNS0yMyAxNToyNTowMg==","upper_bound":"MjAxOC0wNS0yMyAyMzoyNjowOQ==","repeats":1},{"count":800,"lower_bound":"MjAxOC0wNS0yNCAwMDo1NjozOA==","upper_bound":"MjAxOC0wNS0yNSAwMjowMDo1NA==","repeats":1},{"count":808,"lower_bound":"MjAxOC0wNS0yNSAwMjozOTowNw==","upper_bound":"MjAxOC0wNS0yNiAwMTo1Nzo0OQ==","repeats":1},{"count":816,"lower_bound":"MjAxOC0wNS0yNiAxMzowODoxOQ==","upper_bound":"MjAxOC0wNS0yNiAyMjowMjozNQ==","repeats":1},{"count":824,"lower_bound":"MjAxOC0wNS0yNyAyMDoyNDo1Nw==","upper_bound":"MjAxOC0wNi0wMSAwNTozMjoyMg==","repeats":1},{"count":832,"lower_bound":"MjAxOC0wNi0wMSAwNzoxNTo1Nw==","upper_bound":"MjAxOC0wNi0wNCAwMTo0NDo1Ng==","repeats":1},{"count":840,"lower_bound":"MjAxOC0wNi0wNCAxODowNzo0OA==","upper_bound":"MjAxOC0wNi0wNSAxMTo1MDo1Ng==","repeats":1},{"count":848,"lower_bound":"MjAxOC0wNi0wNiAwNzoyNjoxMw==","upper_bound":"MjAxOC0wNi0wNiAyMzoxNDowMA==","repeats":1},{"count":856,"lower_bound":"MjAxOC0wNi0wNyAwNzoyNjozNg==","upper_bound":"MjAxOC0wNi0wOCAxMTo1MTo0Mw==","repeats":1},{"count":864,"lower_bound":"MjAxOC0wNi0wOCAxNjoxODozNw==","upper_bound":"MjAxOC0wNi0wOSAwNjo0NTozNQ==","repeats":1},{"count":872,"lower_bound":"MjAxOC0wNi0wOSAwOTo1Mjo0Nw==","upper_bound":"MjAxOC0wNi0xMSAxOTo1NDozOA==","repeats":1},{"count":880,"lower_bound":"MjAxOC0wNi0xMiAwNDo1NjowMA==","upper_bound":"MjAxOC0wNi0xNCAwMDo1MjowOA==","repeats":1},{"count":888,"lower_bound":"MjAxOC0wNi0xNCAwNDoyOToyNg==","upper_bound":"MjAxOC0wNi0xNCAyMzozNTo0Ng==","repeats":1},{"count":896,"lower_bound":"MjAxOC0wNi0xNSAwNjowNzo1Ng==","upper_bound":"MjAxOC0wNi0xNSAyMDo1ODo1MA==","repeats":1},{"count":904,"lower_bound":"MjAxOC0wNi0xNiAwNTowOToyMA==","upper_bound":"MjAxOC0wNi0xNiAyMjo0MTozNA==","repeats":1},{"count":912,"lower_bound":"MjAxOC0wNi0xNyAwMzo0MToyMw==","upper_bound":"MjAxOC0wNi0xOCAwMToxMDoxOA==","repeats":1},{"count":920,"lower_bound":"MjAxOC0wNi0xOCAxODo1NTowNQ==","upper_bound":"MjAxOC0wNi0xOSAxNTo0NDoyNw==","repeats":1},{"count":928,"lower_bound":"MjAxOC0wNi0xOSAxODo0MjowMA==","upper_bound":"MjAxOC0wNi0yMCAyMjozNTo1NQ==","repeats":1},{"count":936,"lower_bound":"MjAxOC0wNi0yMSAwNjoyNzo0OQ==","upper_bound":"MjAxOC0wNi0yMiAxNjo0Mzo0MQ==","repeats":1},{"count":944,"lower_bound":"MjAxOC0wNi0yMiAyMDo1MDo0MA==","upper_bound":"MjAxOC0wNi0yMyAxMTo1OTozMg==","repeats":1},{"count":952,"lower_bound":"MjAxOC0wNi0yMyAxNDo1MjoxMA==","upper_bound":"MjAxOC0wNi0yNCAwODo1MzoyOQ==","repeats":1},{"count":960,"lower_bound":"MjAxOC0wNi0yNCAxMzozMjoyNw==","upper_bound":"MjAxOC0wNi0yNSAxMjo1NDo1Mw==","repeats":1},{"count":968,"lower_bound":"MjAxOC0wNi0yNSAyMzozMzoyNw==","upper_bound":"MjAxOC0wNi0yNiAxMzo0ODoxMg==","repeats":1},{"count":976,"lower_bound":"MjAxOC0wNi0yNiAxNDoyNDozNg==","upper_bound":"MjAxOC0wNi0yNyAyMjoxODoyMg==","repeats":1},{"count":984,"lower_bound":"MjAxOC0wNi0yOCAwMjowMDoyOA==","upper_bound":"MjAxOC0wNy0wMSAwMjoyMjoyNQ==","repeats":1},{"count":992,"lower_bound":"MjAxOC0wNy0wMSAwMjoyNzoyMA==","upper_bound":"MjAxOC0wNy0wMSAxNjowMzoyMA==","repeats":1},{"count":1000,"lower_bound":"MjAxOC0wNy0wMiAwMTowNDo1NQ==","upper_bound":"MjAxOC0wNy0wMiAwOTo0MjozOA==","repeats":1},{"count":1008,"lower_bound":"MjAxOC0wNy0wMiAwOTo0NzoyMQ==","upper_bound":"MjAxOC0wNy0wMyAwNjo0MDo1NQ==","repeats":1},{"count":1016,"lower_bound":"MjAxOC0wNy0wMyAwODoyMToxNA==","upper_bound":"MjAxOC0wNy0wMyAyMDoyNzoxMA==","repeats":1},{"count":1024,"lower_bound":"MjAxOC0wNy0wMyAyMzo0Mzo1MQ==","upper_bound":"MjAxOC0wNy0wNCAxOTowNToyMQ==","repeats":1},{"count":1032,"lower_bound":"MjAxOC0wNy0wNCAxOToyODowMQ==","upper_bound":"MjAxOC0wNy0wNSAxNDowNDo1NA==","repeats":1},{"count":1040,"lower_bound":"MjAxOC0wNy0wNSAxNDozOToxMA==","upper_bound":"MjAxOC0wNy0wNiAwNzowODozMw==","repeats":1},{"count":1048,"lower_bound":"MjAxOC0wNy0wNiAxMzo0ODoxOA==","upper_bound":"MjAxOC0wNy0wNyAwOToxMjoyMw==","repeats":1},{"count":1056,"lower_bound":"MjAxOC0wNy0wNyAxMDoxMDo1MQ==","upper_bound":"MjAxOC0wNy0wOSAwNToyMjozMw==","repeats":1},{"count":1064,"lower_bound":"MjAxOC0wNy0wOSAwOTo0ODo0Nw==","upper_bound":"MjAxOC0wNy0xMCAwMDo0Mjo0Nw==","repeats":1},{"count":1072,"lower_bound":"MjAxOC0wNy0xMCAwNjoyNDoxNw==","upper_bound":"MjAxOC0wNy0xMSAxMjoxNjoxNQ==","repeats":1},{"count":1080,"lower_bound":"MjAxOC0wNy0xMSAxNDoxODowOA==","upper_bound":"MjAxOC0wNy0xMiAwMDoxMDo1Ng==","repeats":1},{"count":1088,"lower_bound":"MjAxOC0wNy0xMiAyMDozODozMg==","upper_bound":"MjAxOC0wNy0xMyAwNzoyMTo0Ng==","repeats":1},{"count":1096,"lower_bound":"MjAxOC0wNy0xMyAxNDo1NzowNA==","upper_bound":"MjAxOC0wNy0xNCAwOTo1OToxMw==","repeats":1},{"count":1104,"lower_bound":"MjAxOC0wNy0xNCAxNzo0MDo0Mw==","upper_bound":"MjAxOC0wNy0xNSAxMjozODowMg==","repeats":1},{"count":1112,"lower_bound":"MjAxOC0wNy0xNSAxNDoxNDozNg==","upper_bound":"MjAxOC0wNy0xNiAwNzo0MTowOA==","repeats":1},{"count":1120,"lower_bound":"MjAxOC0wNy0xNiAwODoyODowOA==","upper_bound":"MjAxOC0wNy0xNyAwNjowNjoyNQ==","repeats":1},{"count":1128,"lower_bound":"MjAxOC0wNy0xNyAxOToxNjozNA==","upper_bound":"MjAxOC0wNy0xOSAwMDoyNzoxNQ==","repeats":1},{"count":1136,"lower_bound":"MjAxOC0wNy0xOSAwMTo1MTozOA==","upper_bound":"MjAxOC0wNy0yMCAwMTowNzozMg==","repeats":1},{"count":1144,"lower_bound":"MjAxOC0wNy0yMCAwNDo0Mzo0Mg==","upper_bound":"MjAxOC0wNy0yMSAwODoyMzo0Mg==","repeats":1},{"count":1152,"lower_bound":"MjAxOC0wNy0yMSAxMToxNTo0OQ==","upper_bound":"MjAxOC0wNy0yMiAxNDo1MTo0Mw==","repeats":1},{"count":1160,"lower_bound":"MjAxOC0wNy0yMiAxNjoyOToyMA==","upper_bound":"MjAxOC0wNy0yMiAyMTo1MzoyOA==","repeats":1},{"count":1168,"lower_bound":"MjAxOC0wNy0yMyAwNToxNDo1MQ==","upper_bound":"MjAxOC0wNy0yNCAxNzo0MjoyMA==","repeats":1},{"count":1176,"lower_bound":"MjAxOC0wNy0yNCAyMTo0Nzo0NA==","upper_bound":"MjAxOC0wNy0yNiAwNzo0ODozMg==","repeats":1},{"count":1184,"lower_bound":"MjAxOC0wNy0yNiAyMDoxNjowNA==","upper_bound":"MjAxOC0wNy0yNyAxNjo0MTo1OA==","repeats":1},{"count":1192,"lower_bound":"MjAxOC0wOC0wMSAxMzowMTowNg==","upper_bound":"MjAxOC0wOC0wMiAwNzoyOToyNQ==","repeats":1},{"count":1200,"lower_bound":"MjAxOC0wOC0wMyAxODoxMjo1OA==","upper_bound":"MjAxOC0wOC0wNCAyMzozNDoxNQ==","repeats":1},{"count":1208,"lower_bound":"MjAxOC0wOC0wNSAwMDo1MTo1Mw==","upper_bound":"MjAxOC0wOC0wNSAxNzo0OTozNw==","repeats":1},{"count":1216,"lower_bound":"MjAxOC0wOC0wNiAwMDozNDo0NQ==","upper_bound":"MjAxOC0wOC0wNiAxMzoxMTowMg==","repeats":1},{"count":1224,"lower_bound":"MjAxOC0wOC0wNiAxNTo1MDozOQ==","upper_bound":"MjAxOC0wOC0wNyAwMDoyOTozNA==","repeats":1},{"count":1232,"lower_bound":"MjAxOC0wOC0wOCAwNDo1ODoyOA==","upper_bound":"MjAxOC0wOC0wOCAxODowMjoxNA==","repeats":1},{"count":1240,"lower_bound":"MjAxOC0wOC0wOSAwMzowNzowMw==","upper_bound":"MjAxOC0wOC0xMCAxNzoxNjo0Mw==","repeats":1},{"count":1248,"lower_bound":"MjAxOC0wOC0xMSAwMzo1Mjo0Mw==","upper_bound":"MjAxOC0wOC0xMiAwODowNDoyMA==","repeats":1},{"count":1256,"lower_bound":"MjAxOC0wOC0xMiAxNDo1NDozNA==","upper_bound":"MjAxOC0wOC0xNCAxMDo1MToxMg==","repeats":1},{"count":1264,"lower_bound":"MjAxOC0wOC0xNCAyMjowMzoxNQ==","upper_bound":"MjAxOC0wOC0xNiAxOTo0Njo0Nw==","repeats":1},{"count":1272,"lower_bound":"MjAxOC0wOC0xNiAyMzo1NDowMw==","upper_bound":"MjAxOC0wOC0xOCAwMToxMToyMA==","repeats":1},{"count":1280,"lower_bound":"MjAxOC0wOC0yMCAwNDo1MDo1OQ==","upper_bound":"MjAxOC0wOC0yMSAwMzowMDozOA==","repeats":1},{"count":1288,"lower_bound":"MjAxOC0wOC0yMSAwNToxNDo1MA==","upper_bound":"MjAxOC0wOC0yMiAyMDo1NDozNg==","repeats":1},{"count":1296,"lower_bound":"MjAxOC0wOC0yMyAwMDoyOTo0Ng==","upper_bound":"MjAxOC0wOC0yNCAwNDoyMTo1Ng==","repeats":1},{"count":1304,"lower_bound":"MjAxOC0wOC0yNCAxODo0NjowNQ==","upper_bound":"MjAxOC0wOC0yNyAwNTowMzo0NA==","repeats":1},{"count":1312,"lower_bound":"MjAxOC0wOC0yNyAyMDoxMzoxNA==","upper_bound":"MjAxOC0wOS0wMiAwMTozNDozMg==","repeats":1},{"count":1320,"lower_bound":"MjAxOC0wOS0wMiAwMzozMToyNg==","upper_bound":"MjAxOC0wOS0wMyAxODowOToyOQ==","repeats":1},{"count":1328,"lower_bound":"MjAxOC0wOS0wNCAwMjoyMjowMQ==","upper_bound":"MjAxOC0wOS0wNSAxNDo1NzowNg==","repeats":1},{"count":1336,"lower_bound":"MjAxOC0wOS0wNiAwOTozNToyOA==","upper_bound":"MjAxOC0wOS0wNyAwNTozMDoyOQ==","repeats":1},{"count":1344,"lower_bound":"MjAxOC0wOS0wNyAxMToxMDoyNw==","upper_bound":"MjAxOC0wOS0wOCAxMzo0NTo1OQ==","repeats":1},{"count":1352,"lower_bound":"MjAxOC0wOS0wOCAxNToxOToxMg==","upper_bound":"MjAxOC0wOS0wOSAwMjozMzoxNw==","repeats":1},{"count":1360,"lower_bound":"MjAxOC0wOS0wOSAxMToyODo0NA==","upper_bound":"MjAxOC0wOS0xMiAwNzowNDoyMg==","repeats":1},{"count":1368,"lower_bound":"MjAxOC0wOS0xMiAxMzozNDoyNA==","upper_bound":"MjAxOC0wOS0xMiAxNzoyOTo0NA==","repeats":1},{"count":1376,"lower_bound":"MjAxOC0wOS0xMiAyMTo1ODo1OA==","upper_bound":"MjAxOC0wOS0xNSAwMTo0OToxNw==","repeats":1},{"count":1384,"lower_bound":"MjAxOC0wOS0xNSAxNzo0MjoxOQ==","upper_bound":"MjAxOC0wOS0xNiAxMDo1ODoxMA==","repeats":1},{"count":1392,"lower_bound":"MjAxOC0wOS0xNiAxOToxODo0MQ==","upper_bound":"MjAxOC0wOS0xOCAxODowNzoxNg==","repeats":1},{"count":1400,"lower_bound":"MjAxOC0wOS0xOSAwNDoyODo0Mw==","upper_bound":"MjAxOC0wOS0yMCAwMTowMzo0Nw==","repeats":1},{"count":1408,"lower_bound":"MjAxOC0wOS0yMCAwNjoyNjozMw==","upper_bound":"MjAxOC0wOS0yMSAxMjoyNjowOQ==","repeats":1},{"count":1416,"lower_bound":"MjAxOC0wOS0yMSAxMzoxNDo0Ng==","upper_bound":"MjAxOC0wOS0yMSAyMjo1Mzo0OQ==","repeats":1},{"count":1424,"lower_bound":"MjAxOC0wOS0yMiAwMTowMzowOQ==","upper_bound":"MjAxOC0wOS0yMyAwMDo1Njo0OA==","repeats":1},{"count":1432,"lower_bound":"MjAxOC0wOS0yMyAwMjo1MDozNQ==","upper_bound":"MjAxOC0wOS0yMyAxNjo1MDowMQ==","repeats":1},{"count":1440,"lower_bound":"MjAxOC0wOS0yMyAxNzoxMjowNA==","upper_bound":"MjAxOC0wOS0yNSAxOToyODo1OA==","repeats":1},{"count":1448,"lower_bound":"MjAxOC0wOS0yNSAyMjoxODozOA==","upper_bound":"MjAxOC0wOS0yNiAxMTo1MzoxNQ==","repeats":1},{"count":1456,"lower_bound":"MjAxOC0wOS0yNiAxOTowODo0Mg==","upper_bound":"MjAxOC0wOS0yNyAyMzoyMjo1MA==","repeats":1},{"count":1464,"lower_bound":"MjAxOC0wOS0yOCAwNzo1NToxMA==","upper_bound":"MjAxOC0xMC0wMSAwNTo1Njo0Nw==","repeats":1},{"count":1472,"lower_bound":"MjAxOC0xMC0wMSAwNzo0NDoyMA==","upper_bound":"MjAxOC0xMC0wMiAwMDoyMjozMQ==","repeats":1},{"count":1480,"lower_bound":"MjAxOC0xMC0wMiAxODo0OTo0MA==","upper_bound":"MjAxOC0xMC0wMyAxMzoxMzo1OQ==","repeats":1},{"count":1488,"lower_bound":"MjAxOC0xMC0wMyAxNDowOTo0OQ==","upper_bound":"MjAxOC0xMC0wMyAyMTowNToxNg==","repeats":1},{"count":1496,"lower_bound":"MjAxOC0xMC0wNCAxNDozNjo0Nw==","upper_bound":"MjAxOC0xMC0wNSAxMTowMTo0Mg==","repeats":1},{"count":1504,"lower_bound":"MjAxOC0xMC0wNSAxMjoxOTozMA==","upper_bound":"MjAxOC0xMC0wNiAxMjo0NTo0OQ==","repeats":1},{"count":1512,"lower_bound":"MjAxOC0xMC0wNiAxOTozNTo1Ng==","upper_bound":"MjAxOC0xMC0wNyAxMDo0Njo0MA==","repeats":1},{"count":1520,"lower_bound":"MjAxOC0xMC0wNyAxOToyOToyOA==","upper_bound":"MjAxOC0xMC0wOCAxMjowNDoyOA==","repeats":1},{"count":1528,"lower_bound":"MjAxOC0xMC0wOCAxNjozOTo0NQ==","upper_bound":"MjAxOC0xMC0xMCAwMDo1MTowNw==","repeats":1},{"count":1536,"lower_bound":"MjAxOC0xMC0xMCAxODo1Njo1Nw==","upper_bound":"MjAxOC0xMC0xMSAwMTozNTo0NA==","repeats":1},{"count":1544,"lower_bound":"MjAxOC0xMC0xMSAwNTo0ODoxMg==","upper_bound":"MjAxOC0xMC0xMiAwNDoxMjo1NA==","repeats":1},{"count":1552,"lower_bound":"MjAxOC0xMC0xMiAxMDowMTowNA==","upper_bound":"MjAxOC0xMC0xMyAwNDo0MzoxNg==","repeats":1},{"count":1560,"lower_bound":"MjAxOC0xMC0xMyAxMToxMzozMQ==","upper_bound":"MjAxOC0xMC0xNCAwNTowNjo0MA==","repeats":1},{"count":1568,"lower_bound":"MjAxOC0xMC0xNCAxMTo1ODo0OA==","upper_bound":"MjAxOC0xMC0xNSAwMTowNjozMA==","repeats":1},{"count":1576,"lower_bound":"MjAxOC0xMC0xNSAxNzo0NjowOA==","upper_bound":"MjAxOC0xMC0xNiAxNDowODo1MA==","repeats":1},{"count":1584,"lower_bound":"MjAxOC0xMC0xNyAwMTo0MToyMw==","upper_bound":"MjAxOC0xMC0xNyAyMTo0ODozMg==","repeats":1},{"count":1592,"lower_bound":"MjAxOC0xMC0xOCAwNjo0MDowOQ==","upper_bound":"MjAxOC0xMC0xOCAxNDo1MjoxMQ==","repeats":1},{"count":1600,"lower_bound":"MjAxOC0xMC0xOCAxNzo1ODoxMQ==","upper_bound":"MjAxOC0xMC0xOSAwNjozMzoyNQ==","repeats":1},{"count":1608,"lower_bound":"MjAxOC0xMC0xOSAwOToyMzoxMg==","upper_bound":"MjAxOC0xMC0yMCAyMzozMjowMA==","repeats":1},{"count":1616,"lower_bound":"MjAxOC0xMC0yMSAwODozMTowNA==","upper_bound":"MjAxOC0xMC0yMSAxNjoxMzoxNg==","repeats":1},{"count":1624,"lower_bound":"MjAxOC0xMC0yMyAxMTowNToxNA==","upper_bound":"MjAxOC0xMC0yNCAwMTozMTo1Ng==","repeats":1},{"count":1632,"lower_bound":"MjAxOC0xMC0yNCAwMjoyMDo0MQ==","upper_bound":"MjAxOC0xMC0yNSAwMjowOToxMw==","repeats":1},{"count":1640,"lower_bound":"MjAxOC0xMC0yNSAxMjoxMjoxOA==","upper_bound":"MjAxOC0xMC0yNyAwMjo1MzoyNg==","repeats":1},{"count":1648,"lower_bound":"MjAxOC0xMC0yNyAyMjo0OToxMg==","upper_bound":"MjAxOC0xMS0wMSAxNTowMTo1Nw==","repeats":1},{"count":1656,"lower_bound":"MjAxOC0xMS0wMiAxNjo0MDo0OQ==","upper_bound":"MjAxOC0xMS0wMyAwMzozNDo1OQ==","repeats":1},{"count":1664,"lower_bound":"MjAxOC0xMS0wMyAwNzowNzoyOA==","upper_bound":"MjAxOC0xMS0wMyAyMTo0NTo1NQ==","repeats":1},{"count":1672,"lower_bound":"MjAxOC0xMS0wNCAxNjoxOToxNw==","upper_bound":"MjAxOC0xMS0wNSAxODozMDo0NQ==","repeats":1},{"count":1680,"lower_bound":"MjAxOC0xMS0wNSAxODozMjoyNw==","upper_bound":"MjAxOC0xMS0wNyAwMDoxNjozMw==","repeats":1},{"count":1688,"lower_bound":"MjAxOC0xMS0wNyAwNDoyMDo1Nw==","upper_bound":"MjAxOC0xMS0wNyAxNjowMToxNQ==","repeats":1},{"count":1696,"lower_bound":"MjAxOC0xMS0wNyAyMTo1MzoxMw==","upper_bound":"MjAxOC0xMS0wOCAyMToyODowMQ==","repeats":1},{"count":1704,"lower_bound":"MjAxOC0xMS0wOSAwMDoyNjo1MA==","upper_bound":"MjAxOC0xMS0xMCAxMzoxNToxMQ==","repeats":1},{"count":1712,"lower_bound":"MjAxOC0xMS0xMCAyMTo0NzoxNA==","upper_bound":"MjAxOC0xMS0xMSAxMjozMTo0NA==","repeats":1},{"count":1720,"lower_bound":"MjAxOC0xMS0xMSAyMjoxNzoyMw==","upper_bound":"MjAxOC0xMS0xMiAxMTo0NzoxOQ==","repeats":1},{"count":1728,"lower_bound":"MjAxOC0xMS0xMiAxMzo0NjoyNw==","upper_bound":"MjAxOC0xMS0xNCAwMjowMDowMg==","repeats":1},{"count":1736,"lower_bound":"MjAxOC0xMS0xNCAwNzozMjo1OA==","upper_bound":"MjAxOC0xMS0xNCAxNzo1MzowMA==","repeats":1},{"count":1744,"lower_bound":"MjAxOC0xMS0xNCAyMToyODoxNQ==","upper_bound":"MjAxOC0xMS0xNSAwMzo0NTowNg==","repeats":1},{"count":1752,"lower_bound":"MjAxOC0xMS0xNSAwNjoyMToyMg==","upper_bound":"MjAxOC0xMS0xNiAxNToyNDoyNQ==","repeats":1},{"count":1760,"lower_bound":"MjAxOC0xMS0xNyAwNDo0MTozOA==","upper_bound":"MjAxOC0xMS0xNyAxMzozOToxMA==","repeats":1},{"count":1768,"lower_bound":"MjAxOC0xMS0xNyAxNjozNjoxNw==","upper_bound":"MjAxOC0xMS0xOCAwNToyNDoyNg==","repeats":1},{"count":1776,"lower_bound":"MjAxOC0xMS0xOCAxNTo0MToxOQ==","upper_bound":"MjAxOC0xMS0xOSAxMjozNjoyMA==","repeats":1},{"count":1784,"lower_bound":"MjAxOC0xMS0xOSAxMjozNzoyMw==","upper_bound":"MjAxOC0xMS0yMiAxODoxNjo1MQ==","repeats":1},{"count":1792,"lower_bound":"MjAxOC0xMS0yMyAwMTowOTowOQ==","upper_bound":"MjAxOC0xMS0yMyAxMDoxNDo1OA==","repeats":1},{"count":1800,"lower_bound":"MjAxOC0xMS0yMyAxNjo0NDoyMw==","upper_bound":"MjAxOC0xMS0yNCAxMzoxNDo1Nw==","repeats":1},{"count":1808,"lower_bound":"MjAxOC0xMS0yNCAxNDoxODo1Mw==","upper_bound":"MjAxOC0xMS0yNSAwODo1MDo1Mw==","repeats":1},{"count":1816,"lower_bound":"MjAxOC0xMS0yNSAxMTowMzoyMQ==","upper_bound":"MjAxOC0xMS0yNyAwMToyNzoxNA==","repeats":1},{"count":1824,"lower_bound":"MjAxOC0xMS0yNyAwMjowMDo1NQ==","upper_bound":"MjAxOC0xMS0yNyAxNDo1NTo1Ng==","repeats":1},{"count":1832,"lower_bound":"MjAxOC0xMS0yNyAyMDozODoxOQ==","upper_bound":"MjAxOC0xMS0yOCAwMjozNzo1Ng==","repeats":1},{"count":1840,"lower_bound":"MjAxOC0xMS0yOCAwNzo1Mjo1Mw==","upper_bound":"MjAxOC0xMi0wMSAwNToyMToxMQ==","repeats":1},{"count":1848,"lower_bound":"MjAxOC0xMi0wMSAxNjoyNToyMw==","upper_bound":"MjAxOC0xMi0wMiAwOTo1Njo1Nw==","repeats":1},{"count":1856,"lower_bound":"MjAxOC0xMi0wMiAxMzo1MToyOA==","upper_bound":"MjAxOC0xMi0wNCAwNDoyODoxMg==","repeats":1},{"count":1864,"lower_bound":"MjAxOC0xMi0wNCAxOToxNToyMw==","upper_bound":"MjAxOC0xMi0wNSAxNTo0NzowNA==","repeats":1},{"count":1872,"lower_bound":"MjAxOC0xMi0wNiAyMjo0OToxMA==","upper_bound":"MjAxOC0xMi0wOCAwNToyNjo0NA==","repeats":1},{"count":1880,"lower_bound":"MjAxOC0xMi0wOCAxMToyMDoyOA==","upper_bound":"MjAxOC0xMi0wOSAwMjo0NDo0Nw==","repeats":1},{"count":1888,"lower_bound":"MjAxOC0xMi0wOSAxNTo1MjoxNw==","upper_bound":"MjAxOC0xMi0xMCAxNTozNDozMw==","repeats":1},{"count":1896,"lower_bound":"MjAxOC0xMi0xMCAyMjowNDowOQ==","upper_bound":"MjAxOC0xMi0xMiAyMDowMzo0OQ==","repeats":1},{"count":1904,"lower_bound":"MjAxOC0xMi0xMyAwNjozODowMQ==","upper_bound":"MjAxOC0xMi0xNCAxOToxNDozMA==","repeats":1},{"count":1912,"lower_bound":"MjAxOC0xMi0xNCAyMDoxNTozNQ==","upper_bound":"MjAxOC0xMi0xNSAxMjowMzowMQ==","repeats":1},{"count":1920,"lower_bound":"MjAxOC0xMi0xNSAxOTozMDo1NA==","upper_bound":"MjAxOC0xMi0xNiAxNTo1MTowMg==","repeats":1},{"count":1928,"lower_bound":"MjAxOC0xMi0xNiAyMjo0Mzo1OA==","upper_bound":"MjAxOC0xMi0xNyAxNToyOTo0MQ==","repeats":1},{"count":1936,"lower_bound":"MjAxOC0xMi0xNyAxODo1MjoxOQ==","upper_bound":"MjAxOC0xMi0xOCAxMTowNjoxMw==","repeats":1},{"count":1944,"lower_bound":"MjAxOC0xMi0xOSAwMzoxNjowNw==","upper_bound":"MjAxOC0xMi0yMCAwMjo0OToxOQ==","repeats":1},{"count":1952,"lower_bound":"MjAxOC0xMi0yMCAxMToyMzozOA==","upper_bound":"MjAxOC0xMi0yMSAxNDoxMToyNQ==","repeats":1},{"count":1960,"lower_bound":"MjAxOC0xMi0yMiAyMjoxNzo0NQ==","upper_bound":"MjAxOC0xMi0yMyAyMjo1MjoxMQ==","repeats":1},{"count":1968,"lower_bound":"MjAxOC0xMi0yNCAwMjoxMDo1Nw==","upper_bound":"MjAxOC0xMi0yNCAxNDozMToxNw==","repeats":1},{"count":1976,"lower_bound":"MjAxOC0xMi0yNCAyMzowNDo1Ng==","upper_bound":"MjAxOC0xMi0yNSAyMzo1NDoyMg==","repeats":1},{"count":1984,"lower_bound":"MjAxOC0xMi0yNiAwMDozNTozMw==","upper_bound":"MjAxOC0xMi0yNiAxODoxOToxNQ==","repeats":1},{"count":1992,"lower_bound":"MjAxOC0xMi0yNiAyMjoyNzoxMw==","upper_bound":"MjAxOC0xMi0yNyAxOTowMzozNA==","repeats":1},{"count":2000,"lower_bound":"MjAxOC0xMi0yOCAwNDoxNjowMQ==","upper_bound":"MjAxOC0xMi0yOCAxODoyNzo0Ng==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3,0,0,1,1,2,0,1,0,1,1,3,1,0,2,1,0,0,2,5,2,0,1,4,2,1,0,0,0,0,3,1,2,1,0,2,0,0,0,0,0,1,0,1,2,0,0,1,1,1,1,2,2,0,1,0,2,1,1,0,0,2,0,2,1,1,0,1,0,1,2,0,1,1,0,0,0,0,1,3,1,1,1,2,1,1,0,0,0,1,1,0,3,1,1,1,0,1,2,1,0,0,2,1,2,0,0,1,1,0,1,0,1,1,0,0,0,3,0,4,0,0,0,1,1,2,1,1,2,2,0,1,1,1,0,0,0,0,3,3,0,0,1,0,0,0,1,1,2,1,3,1,0,1,0,1,2,0,0,2,1,0,1,1,0,1,2,1,3,1,0,0,0,0,3,2,2,0,1,1,2,1,1,0,0,2,1,0,0,0,1,5,0,3,1,0,2,1,0,2,1,1,2,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,4,2,0,1,0,2,1,1,0,0,0,2,0,1,1,1,0,1,1,2,0,3,1,0,0,1,2,0,0,1,0,1,3,1,2,2,2,0,0,2,1,0,0,1,3,1,0,0,2,0,2,2,1,0,1,1,0,1,2,1,0,2,0,2,1,1,1,4,1,2,0,0,0,0,2,3,0,1,0,2,0,0,3,1,0,1,0,4,1,0,2,2,0,1,0,1,1,2,0,1,0,0,1,2,2,2,1,0,1,1,0,3,0,0,0,0,0,0,1,1,1,0,0,2,3,0,1,1,0,1,2,1,1,0,0,0,0,0,2,2,1,2,2,2,0,1,1,0,1,4,0,1,0,3,1,2,0,0,0,0,2,2,0,1,2,1,1,0,4,0,1,1,0,0,2,0,2,2,0,2,1,1,2,0,2,1,1,1,0,2,1,1,1,0,0,0,0,1,0,1,1,2,1,0,0,2,0,2,0,3,0,0,3,1,3,2,1,1,1,2,0,0,1,0,0,2,3,3,1,1,0,0,0,0,2,1,1,2,1,0,1,0,1,0,1,1,1,0,1,0,0,0,0,3,0,0,1,1,1,3,0,2,0,2,2,0,1,2,0,1,2,1,0,0,4,0,1,0,2,2,1,0,3,0,2,2,1,0,0,1,1,1,1,1,0,1,1,2,0,1,1,1,3,1,0,1,2,0,1,2,1,1,0,5,2,0,2,2,2,0,0,2,2,0,1,0,0,0,1,0,0,0,0,0,1,2,2,1,2,1,0,0,0,0,1,2,0,0,0,0,0,1,1,1,0,0,2,0,2,0,0,1,2,0,2,0,0,0,1,1,1,0,0,1,0,0,0,0,1,0,1,1,1,1,0,2,2,1,0,1,0,0,2,0,1,1,1,0,0,2,0,0,0,0,3,0,1,2,2,2,2,1,1,0,1,0,2,2,1,0,0,0,2,0,1,2,0,3,0,3,1,2,0,1,0,1,0,0,2,2,3,1,2,1,1,0,0,1,3,1,2,0,4,1,2,1,1,0,0,1,5,0,2,0,0,0,0,0,0,0,0,3,0,0,0,0,3,2,1,3,0,1,1,2,0,0,2,1,0,3,1,2,4,0,2,1,2,0,3,2,1,1,2,0,2,2,0,0,0,0,1,0,0,1,1,0,0,0,3,1,1,1,0,0,0,0,1,1,2,2,1,0,0,2,1,2,0,1,2,0,1,2,0,0,0,0,0,0,0,0,1,1,1,1,0,2,0,0,1,1,0,2,0,1,0,2,1,2,0,1,0,1,1,3,0,1,1,1,0,2,4,0,1,0,2,2,2,1,1,0,2,2,1,0,4,1,1,1,2,0,0,1,0,2,0,1,1,1,1,0,2,0,0,0,0,0,0,0,0,0,1,1,0,1,1,1,1,0,1,2,3,0,1,2,0,0,1,0,0,2,0,3,2,3,1,1,2,3,1,3,1,2,1,1,1,0,0,0,1,4,1,1,1,1,0,0,1,2,2,0,0,1,3,2,2,1,2,1,2,1,2,0,1,1,0,2,0,0,2,1,1,1,0,1,2,3,1,2,1,0,1,0,0,2,0,0,2,0,1,3,3,1,0,0,1,1,0,1,1,2,0,4,0,0,2,2,2,1,1,0,2,2,3,1,0,1,1,0,1,0,1,1,1,1,0,1,1,0,0,1,1,0,0,1,1,1,2,0,0,0,0,1,2,2,0,0,0,1,1,1,2,0,1,1,0,0,0,1,1,0,5,3,1,0,2,2,0,1,1,0,1,3,1,0,3,0,0,1,0,1,1,1,0,2,0,1,1,5,2,1,0,0,2,1,1,1,1,0,1,2,0,0,1,0,2,0,0,1,0,1,4,2,1,0,3,3,2,1,0,3,1,1,1,3,0,1,0,2,1,3,1,0,0,2,2,2,2,1,2,2,0,2,0,0,1,1,2,0,0,0,0,0,2,0,0,0,0,0,0,3,0,0,0,1,1,1,1,3,1,0,4,1,2,2,2,0,1,0,1,1,2,0,1,0,3,0,3,1,0,5,1,1,1,0,1,2,0,4,0,0,1,2,2,0,0,2,0,4,2,1,1,0,1,0,1,2,0,1,1,2,1,0,0,1,1,1,1,0,2,1,1,1,1,0,0,1,0,2,0,1,0,0,3,2,1,0,1,1,1,1,1,2,1,1,0,3,0,2,1,2,1,1,0,0,2,2,1,1,1,2,2,2,0,1,1,0,2,1,2,0,1,1,0,0,0,2,1,0,1,1,2,0,0,1,4,0,0,0,0,1,0,1,0,1,0,2,0,1,3,0,2,1,0,0,1,1,2,4,2,1,1,2,0,1,0,1,2,2,0,0,0,2,1,1,0,0,1,1,1,2,1,1,1,0,1,2,1,0,0,1,2,0,0,1,1,2,3,3,0,0,1,1,1,0,1,2,0,1,1,2,2,1,3,0,3,1,2,2,0,0,0,2,0,0,0,3,1,4,0,0,1,1,2,0,0,0,1,0,0,3,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,3,0,2,0,1,0,2,2,1,3,0,0,2,1,1,1,2,1,2,1,2,1,1,0,0,0,2,0,2,2,1,1,0,1,1,1,2,0,1,1,0,2,0,1,0,0,1,0,3,0,2,0,0,4,1,1,0,2,1,1,2,0,0,2,0,1,2,0,1,1,1,1,0,0,1,1,0,1,0,1,0,0,0,1,4,0,0,1,0,0,1,4,1,1,3,2,1,0,1,2,0,1,0,1,1,2,0,0,2,0,0,0,1,0,2,0,2,0,1,0,3,2,2,0,2,0,1,3,2,1,0,0,1,0,1,3,1,1,0,4,0,4,2,3,1,1,0,1,1,0,3,3,0,0,1,2,1,0,1,0,1,2,2,1,0,2,1,3,2,3,0,0,1,1,3,1,0,1,1,2,0,2,3,1,1,0,0,0,0,1,2,0,2,0,1,1,2,1,0,1,0,0,3,2,2,1,1,2,2,1,2,0,1,2,2,0,2,2,0,0,0,0,1,0,1,0,0,0,1,1,0,2,2,1,1,0,1,1,2,0,0,0,0,0,1,1,0,3,0,0,1,2,0,0,1,0,1,0,1,0,0,1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,1,1,1,2,0,1,3,0,1,1,0,0,1,0,2,3,0,2,3,2,2,1,2,0,3,1,1,0,1,2,1,0,1,0,4,2,0,2,3,1,0,0,1,2,1,0,0,0,0,1,1,2,0,2,1,2,0,1,1,2,3,1,2,1,1,2,1,1,0,0,1,2,2,4,0,1,0,1,1,2,0,0,0,4,0,3,4,0,0,1,0,0,1,0,2,0,1,2,1,0,5,0,1,1,1,0,1,1,2,2,0,1,1,0,0,1,1,0,0,1,2,1,0,1,0,3,3,1,0,0,0,2,0,0,2,0,1,2,1,0,1,0,1,1,2,1,0,2,0,2,0,0,1,0,1,0,0,0,2,1,3,1,2,2,0,3,0,1,0,1,0,0,0,2,1,1,1,2,0,0,0,0,0,1,2,1,0,0,1,0,0,3,0,1,0,3,1,0,3,0,0,0,1,3,1,2,1,0,3,0,0,2,1,1,0,0,1,2,0,0,1,0,0,1,1,1,0,1,1,3,2,0,1,0,1,0,2,1,0,0,3,1,1,0,1,1,0,0,3,1,1,0,1,0,2,1,2,1,3,2,1,0,0,2,3,0,1,2,1,2,0,4,1,1,0,1,0,3,1,0,2,0,0,0,4,1,0,2,1,2,0,0,1,3,0,1,1,1,0,1,1,0,0,1,0,1,2,0,1,0,1,2,2,0,0,2,0,0,1,2,1,1,0,0,4,1,1,1,1,0,0,0,1,1,2,1,2,3,1,0,2,3,0,2,3,2,0,0,2,0,2,1,1,3,1,0,1,1,1,1,0,1,0,0,1,2,0,2,1,3,1,1,1,1,2,1,1,0,1,1,3,1,1,2,1,1,0,0,0,4,0,2,2,2,3,0,1,1,1,2,1,3,2,1,5,0,0,0,2,0,1,0,1,1,1,0]},{"counters":[1,1,1,2,2,0,1,1,0,2,5,3,3,0,3,0,1,0,0,0,0,0,2,1,1,0,1,0,0,2,1,1,0,1,0,1,0,0,2,2,1,2,2,1,0,1,0,0,0,0,2,3,0,0,0,3,0,1,0,0,1,1,1,0,0,0,0,1,0,0,2,0,1,1,0,1,2,0,0,3,1,0,0,3,4,1,3,0,1,0,1,0,0,1,1,1,1,2,1,1,0,1,1,0,2,3,1,0,1,3,1,2,1,1,0,0,1,1,3,1,0,3,2,2,2,1,0,0,2,0,0,1,3,1,1,0,2,1,1,0,2,0,0,1,1,2,1,1,0,3,1,0,1,0,0,0,0,2,0,0,0,2,2,0,2,1,0,0,2,1,0,1,0,1,0,0,0,1,0,2,2,2,0,0,0,2,0,1,1,0,0,1,0,3,2,1,0,2,0,2,1,1,0,0,0,1,1,3,0,1,2,4,0,2,0,1,3,3,2,1,0,0,3,2,0,0,1,3,1,3,1,0,3,2,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,2,0,1,0,1,0,0,4,1,3,1,2,0,1,2,0,0,0,2,0,2,0,0,1,3,1,1,1,1,2,2,1,1,0,0,0,1,0,1,0,2,2,2,2,0,0,0,0,0,0,1,0,0,0,1,0,1,0,0,2,3,0,3,2,0,2,1,1,1,1,2,0,0,1,2,1,0,1,0,0,2,0,0,0,0,0,0,0,0,0,1,1,1,0,1,1,0,0,3,1,2,1,0,2,2,1,0,1,1,1,0,1,3,1,0,0,1,2,3,0,0,1,0,2,0,0,1,1,1,1,1,1,0,0,0,1,3,1,1,0,2,1,1,1,0,0,1,1,2,0,1,0,2,0,0,0,1,1,1,1,0,1,0,1,3,0,0,2,0,3,1,2,0,2,1,0,0,2,2,1,2,2,0,2,0,2,1,1,1,2,1,0,1,1,1,1,1,0,0,0,1,1,2,0,0,1,0,1,2,2,2,3,0,0,1,0,1,3,0,0,1,1,4,3,2,2,0,1,0,1,2,1,0,1,2,0,1,4,1,3,1,1,0,0,1,0,0,1,1,0,4,1,0,1,1,3,0,2,0,0,0,1,2,0,0,1,0,0,0,1,0,1,3,2,0,0,2,1,1,1,0,2,2,2,2,2,1,3,3,0,2,0,0,1,3,1,0,0,2,0,0,1,0,1,1,1,0,2,0,0,0,2,0,3,0,2,0,1,0,2,1,2,1,2,0,2,1,1,1,0,0,2,0,0,0,0,0,0,2,2,1,2,0,1,0,1,0,0,1,0,0,1,0,0,2,1,0,0,3,2,1,2,0,2,2,0,1,1,1,0,3,0,1,2,0,0,0,0,0,1,1,0,2,1,3,1,0,0,2,0,0,0,0,2,1,0,1,2,1,3,5,1,1,1,1,1,4,0,1,0,1,0,0,0,0,0,0,1,2,0,0,1,0,0,0,2,1,2,4,0,0,2,1,0,1,1,1,2,1,0,1,3,0,1,0,0,0,1,0,0,0,1,0,2,1,1,2,1,1,0,1,1,2,1,1,1,2,1,0,2,1,2,1,2,1,1,1,1,0,0,1,2,3,0,0,5,3,2,1,0,1,1,0,0,0,0,0,1,1,0,0,1,0,3,1,2,2,1,1,1,2,1,0,1,0,2,1,2,1,2,3,2,2,1,1,1,1,0,0,0,3,0,1,1,0,0,0,0,3,0,3,0,0,3,0,1,1,4,0,2,0,1,2,0,1,0,0,2,0,2,1,1,0,1,2,3,2,0,1,0,2,1,2,0,1,0,3,2,0,2,0,1,0,2,1,4,3,3,0,2,1,0,0,0,1,1,0,0,1,1,0,0,1,1,1,0,1,2,0,1,0,1,0,1,0,3,1,2,2,0,1,2,0,1,1,0,2,1,0,3,0,1,0,0,2,2,2,0,0,0,1,0,0,1,1,2,1,1,3,1,1,0,3,4,1,0,1,1,3,1,0,1,2,0,2,0,0,1,1,0,1,0,1,2,1,2,0,2,4,1,3,0,0,3,2,0,0,0,1,0,0,0,0,1,0,1,2,0,1,0,0,0,1,1,1,1,0,1,0,0,2,0,0,2,1,0,1,1,3,0,1,0,1,1,1,0,0,0,0,1,0,0,2,0,2,1,1,1,0,0,2,0,2,3,0,1,1,3,2,0,2,2,2,0,1,2,1,2,0,0,1,2,0,1,1,0,1,1,3,3,3,0,0,0,2,0,3,0,1,2,0,0,2,2,4,0,1,0,1,0,0,1,0,0,1,2,1,0,2,2,1,1,1,3,0,0,1,1,2,0,2,0,1,1,0,3,0,0,1,2,1,1,1,0,1,2,2,5,1,0,1,1,0,1,3,1,2,0,1,1,3,1,1,0,0,0,3,3,0,2,2,1,2,1,0,2,1,2,2,1,1,0,1,1,1,0,1,0,2,1,0,0,1,1,3,1,0,1,2,0,0,1,0,1,1,0,0,1,0,1,1,3,2,2,0,0,2,1,1,0,0,0,2,0,2,0,1,1,0,1,0,0,3,1,0,1,1,2,1,1,1,1,2,1,0,2,1,0,2,2,0,2,2,0,0,3,3,2,1,0,1,0,1,1,2,0,0,0,1,2,1,0,0,2,0,1,0,0,1,3,2,0,0,1,4,1,3,3,1,1,2,0,0,1,0,2,1,1,0,3,1,2,1,3,2,2,2,0,0,1,0,1,3,1,1,1,0,2,1,0,2,0,0,0,1,0,0,0,0,0,0,1,0,0,2,0,1,1,3,1,2,2,0,0,0,2,0,3,1,1,1,0,1,0,1,0,0,0,2,0,1,1,0,1,2,1,0,0,0,0,3,0,1,2,0,2,1,1,0,1,1,0,2,1,2,1,1,0,2,0,1,0,0,0,0,1,0,2,0,1,1,0,2,3,1,2,0,0,1,1,0,1,1,2,0,2,1,0,2,2,1,1,0,1,0,3,3,2,1,0,1,1,0,1,2,0,1,2,1,1,3,3,1,0,1,2,1,1,1,1,1,2,0,1,0,0,0,0,1,0,1,1,2,1,1,0,2,1,2,0,1,0,0,2,0,1,2,2,2,0,0,2,1,1,2,3,2,0,2,1,2,0,2,1,2,0,1,4,0,1,1,2,0,2,1,0,1,1,1,1,1,2,0,0,0,0,0,3,0,0,2,2,0,1,1,3,3,0,0,0,0,0,1,0,0,0,0,0,2,1,1,2,1,1,3,1,0,1,0,1,0,0,2,2,0,0,0,0,1,1,0,1,0,0,1,2,1,1,0,0,1,0,0,1,2,1,1,2,0,0,0,3,1,0,1,1,0,1,1,1,1,1,4,0,0,1,0,2,2,1,3,0,0,0,0,1,1,3,0,2,0,2,0,2,2,1,0,2,0,0,4,0,2,1,2,0,0,0,1,1,1,0,0,0,2,1,3,0,0,0,2,1,1,2,1,2,2,1,3,2,2,1,0,0,0,2,0,1,1,0,0,0,1,1,2,0,0,0,1,0,0,2,0,2,0,0,0,1,0,0,1,1,2,1,0,1,1,0,0,0,0,4,0,2,1,0,1,0,1,3,3,0,0,1,1,2,3,1,0,1,0,0,0,1,2,3,1,0,0,1,0,0,1,0,2,1,0,0,2,1,0,0,0,2,1,1,3,2,3,2,2,1,1,1,1,0,0,0,3,2,2,0,2,1,0,2,1,2,1,0,0,1,2,1,0,0,1,1,2,2,0,2,1,0,2,2,0,1,8,1,2,1,2,2,1,0,1,0,0,1,2,0,2,4,0,0,0,2,1,2,2,0,2,0,0,2,1,0,3,2,1,0,1,0,0,0,0,3,0,0,1,2,4,0,0,0,0,1,1,0,0,1,4,3,3,1,0,3,2,2,1,1,0,2,1,1,1,0,1,1,0,2,0,0,1,1,1,3,1,1,1,2,0,0,1,1,1,1,1,0,0,1,1,1,0,3,2,0,1,2,0,2,1,1,0,1,2,1,0,1,0,4,1,0,1,1,0,0,0,1,0,1,1,1,2,0,2,1,0,1,3,1,1,2,1,0,0,1,0,2,0,3,2,1,0,0,0,0,2,1,1,0,0,0,1,3,1,1,0,0,1,0,0,1,3,2,0,0,1,2,0,1,0,1,0,1,1,0,0,2,1,2,1,1,0,2,1,2,0,0,1,2,3,0,2,0,2,0,0,1,0,2,0,0,0,2,0,0,1,0,0,2,5,0,1,1,2,0,2,1,1,1,1,0,1,5,1,1,2,0,1,0,0,0,3,2,0,0,0,1,0,3,0,3,1,2,2,1,0,2,2,1,0,1,1,0,3,4,2,2,1,4,0,0,3,1,1,0,0,1,1,0,1,0,0,0,2,1,2,1,1,1,3,0,2,0,2,0,4,2,0,1,3,1,0,0,1,0,3,1,1,0,1,1,3,0,1,1,1,0,0,1,0,0,4,3,0,0,0,1,2,0,0,1,5,2,0,1,1,1,1,0,1,0,0,1,1,1,2]},{"counters":[0,1,0,0,0,4,0,0,0,1,2,0,1,0,0,1,0,0,2,1,0,1,0,1,4,4,0,1,1,0,1,0,1,0,2,1,2,0,3,0,1,2,0,1,0,0,3,1,2,1,1,3,0,0,0,3,2,0,1,2,0,2,1,0,0,1,1,1,1,2,1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,2,3,1,0,2,0,3,2,0,1,0,0,1,1,0,1,2,0,1,2,0,1,1,1,1,1,0,2,1,0,1,0,3,1,1,0,1,1,1,1,0,3,1,2,2,1,0,2,0,0,1,2,1,1,0,1,1,0,3,0,1,0,2,3,3,0,3,1,1,2,1,0,0,0,0,1,2,2,0,3,0,1,2,1,1,0,1,2,1,0,0,0,1,0,0,3,0,2,0,1,0,0,0,1,0,2,0,1,2,2,0,0,0,1,1,1,1,2,1,3,1,1,2,1,0,0,1,0,0,1,0,1,0,0,1,2,2,2,2,2,1,0,1,1,0,1,2,2,1,0,0,1,1,3,0,1,1,0,0,1,3,1,0,0,3,3,2,3,2,1,1,0,0,1,2,1,2,2,1,0,1,0,0,0,1,1,1,4,1,1,2,1,2,0,0,0,0,1,0,0,0,1,2,2,2,0,4,0,0,0,0,0,2,1,0,0,1,3,2,1,1,1,1,2,2,0,0,4,0,5,2,0,1,4,3,0,1,0,0,3,3,1,1,1,2,1,0,2,1,0,1,2,0,0,1,0,1,3,1,0,1,1,3,0,1,0,0,0,0,1,0,1,0,1,0,1,0,4,1,0,0,0,0,1,1,1,0,2,0,2,1,1,1,2,1,1,0,0,0,1,0,2,1,1,1,2,1,0,0,0,0,2,0,0,0,1,1,4,1,0,0,0,1,0,2,1,1,3,3,0,1,2,1,2,0,0,1,3,1,2,1,1,2,1,0,1,1,1,0,0,2,1,0,1,4,0,0,1,0,1,0,1,0,2,0,1,0,1,0,0,1,1,0,0,0,1,1,2,1,0,1,0,3,1,0,2,0,0,0,1,2,1,1,2,2,0,1,1,1,2,3,2,3,2,1,0,1,3,1,0,0,0,0,0,3,3,2,0,0,2,1,0,0,0,0,2,1,0,0,1,0,1,0,0,0,1,1,2,1,1,1,1,1,4,1,1,1,1,1,1,1,2,4,3,1,0,2,1,0,1,1,0,1,1,0,2,2,1,1,1,0,2,0,1,2,0,0,1,0,1,1,3,2,2,0,2,2,3,2,2,0,0,3,0,0,1,1,2,1,0,0,0,0,0,2,0,1,0,1,0,1,5,3,1,0,0,1,0,0,1,1,1,0,0,0,2,0,1,1,0,1,1,0,2,0,1,2,1,0,0,0,0,1,0,2,0,0,0,1,0,2,1,1,0,2,1,0,1,0,0,0,1,1,1,0,4,1,1,1,0,1,3,0,2,1,1,0,1,0,1,3,1,2,0,0,2,2,2,2,2,0,1,2,0,1,0,0,0,1,0,0,1,1,1,0,1,0,1,2,0,1,2,2,1,2,1,3,1,0,0,0,0,0,1,0,4,0,1,2,2,2,2,1,1,4,0,3,1,1,2,0,3,1,1,1,2,0,1,0,0,0,0,2,0,0,2,2,1,1,1,1,1,0,0,1,1,1,1,0,0,2,0,0,0,0,1,2,4,0,2,1,0,2,0,0,2,1,1,0,0,3,0,1,2,1,0,0,1,0,0,0,1,0,1,1,2,0,1,2,1,0,3,2,1,3,0,1,0,0,0,3,4,1,2,1,1,1,0,2,1,0,2,0,0,2,1,3,0,2,0,2,1,0,3,0,2,0,0,2,2,3,2,1,2,2,2,1,0,2,0,3,1,0,0,1,0,1,2,1,2,0,2,1,1,2,1,1,1,1,1,2,0,1,0,1,0,0,2,1,1,0,0,0,2,1,0,2,1,1,1,0,2,1,1,0,0,0,0,1,3,2,0,2,3,2,0,2,2,2,0,1,2,1,1,1,1,1,1,0,1,1,0,0,0,1,0,0,0,0,2,1,0,0,1,3,3,1,0,1,0,0,0,1,0,1,0,2,2,1,4,2,0,1,1,0,0,0,1,1,0,2,1,0,1,1,1,3,0,1,0,1,0,0,2,2,2,0,0,2,0,2,1,0,1,1,2,0,2,1,3,2,0,2,2,3,2,1,1,0,3,1,2,0,0,1,0,3,2,0,1,0,4,0,0,0,1,0,2,1,2,0,1,1,2,0,0,1,0,0,2,1,1,0,1,2,1,0,1,1,1,4,0,0,1,4,2,1,2,2,1,2,0,1,1,0,1,2,1,3,1,0,1,0,0,1,2,0,4,1,0,0,2,1,1,0,2,1,2,1,2,0,1,0,3,0,0,2,1,2,1,0,1,1,2,0,1,0,0,1,0,0,1,2,1,0,0,1,1,1,1,2,0,0,0,0,0,0,0,2,0,0,0,2,0,1,0,1,1,1,2,1,1,0,1,0,0,0,0,1,2,0,3,1,4,1,0,1,0,0,2,0,1,0,0,1,1,1,1,1,2,1,0,1,0,4,0,0,3,1,2,3,3,0,0,1,0,1,1,0,1,1,2,0,0,1,0,1,2,1,3,1,0,1,3,2,1,2,3,0,1,0,0,0,1,0,1,0,2,1,1,0,2,1,1,1,0,0,1,1,3,0,1,0,0,1,2,3,0,1,2,1,0,0,2,1,2,2,1,1,2,1,0,0,4,0,0,1,0,2,0,2,1,1,0,2,1,0,1,1,0,0,1,1,0,2,2,0,2,1,1,1,2,1,2,2,0,2,1,1,1,1,0,1,2,1,0,2,0,1,3,2,1,1,0,4,1,3,0,2,0,1,1,2,1,0,1,3,0,1,0,4,2,1,0,1,1,1,0,0,1,1,1,0,0,0,0,0,2,0,1,1,0,1,0,2,1,1,3,0,0,1,0,1,2,0,0,0,2,0,0,2,0,0,2,1,1,0,1,0,0,0,1,1,1,2,3,1,0,1,2,1,1,1,2,1,0,3,1,2,0,1,1,0,0,1,3,1,0,2,1,0,0,0,2,1,0,1,0,0,1,0,1,0,1,1,2,1,0,2,0,4,0,0,1,1,3,2,1,0,1,0,2,2,2,0,2,1,1,1,0,0,1,2,0,0,1,1,1,2,1,1,2,0,2,1,2,1,0,3,1,1,0,2,0,1,2,1,0,0,1,0,1,1,0,0,1,1,1,1,3,2,2,0,1,0,0,1,0,0,2,1,0,1,1,3,1,0,0,1,1,0,0,0,1,0,1,2,0,1,2,2,1,0,4,2,1,1,1,1,0,1,1,2,0,1,2,0,1,0,1,2,1,0,0,2,0,0,1,3,2,0,0,3,1,2,0,0,0,0,1,1,1,0,3,1,0,1,2,1,0,3,0,2,0,1,0,0,0,1,2,2,1,1,2,1,0,0,1,2,2,1,1,1,0,1,1,0,1,1,0,0,1,0,3,0,1,0,0,2,0,2,0,0,1,1,1,0,0,2,1,1,1,2,1,0,0,0,3,0,0,3,0,1,1,0,1,0,1,0,1,0,0,1,0,1,1,2,2,1,3,1,0,3,0,2,2,1,1,1,0,0,1,0,0,0,1,2,0,3,0,1,0,1,1,2,1,4,0,0,1,0,0,0,1,2,1,0,0,4,5,0,1,1,1,0,0,1,0,0,2,0,1,1,0,2,0,0,0,0,2,0,2,1,1,3,0,0,1,2,0,2,0,2,1,1,1,0,0,1,1,0,2,0,2,3,0,0,1,0,2,5,0,0,2,1,1,4,0,0,0,1,0,1,1,2,1,2,0,1,0,2,2,0,1,0,2,0,1,2,1,0,1,1,3,1,1,1,1,1,0,0,1,1,1,3,0,0,0,1,1,2,0,1,4,1,1,1,1,0,0,1,1,1,0,0,1,0,1,1,2,0,0,1,0,1,5,0,3,0,2,1,1,1,0,1,0,2,2,0,0,2,0,1,0,0,1,0,0,0,1,2,2,0,0,0,0,0,1,2,1,1,0,1,2,2,2,0,0,1,1,0,1,2,0,0,0,0,2,1,0,1,0,2,0,1,1,3,0,0,0,1,1,1,0,1,0,1,1,0,0,0,1,0,2,1,1,1,0,3,1,0,1,2,1,0,1,1,1,0,0,0,1,2,3,1,0,0,1,0,1,0,1,1,3,2,1,0,1,1,1,1,0,0,3,2,2,2,1,3,2,0,0,1,2,3,1,3,0,1,1,3,0,1,2,0,1,0,2,0,1,0,0,0,1,1,0,1,0,2,1,3,1,0,1,1,1,0,2,1,0,1,1,3,2,1,1,3,0,0,0,1,2,1,2,1,1,3,3,2,1,1,2,1,1,1,1,0,0,4,1,0,1,2,2,0,2,0,0,2,1,1,2,2,3,1,1,0,0,1,0,2,1,0,2,0,1,1,1,1,0,0,2,1,0,1,3,1,2,1,1,1,2,2,0,3,1,1,1,0,0,0,1,0,4,1,0,2,1,3,1,1,0,1]},{"counters":[0,0,0,3,0,1,3,0,0,1,1,0,3,2,1,3,0,1,1,1,0,1,0,0,1,1,1,2,1,1,4,1,4,3,0,2,1,1,0,0,1,0,2,1,1,4,0,1,2,3,1,0,1,0,1,0,3,1,2,0,1,0,1,1,1,2,1,1,3,1,1,1,1,1,0,2,1,0,2,1,4,2,2,2,0,1,0,0,2,0,1,0,2,0,0,0,0,1,2,1,1,1,2,1,0,0,0,2,1,2,1,2,1,1,2,1,0,2,1,0,2,1,0,1,2,1,1,0,0,1,0,1,1,1,1,0,0,1,0,1,0,1,1,0,3,0,0,1,0,1,1,1,0,2,3,1,0,1,0,1,2,0,1,0,1,1,1,1,0,4,0,1,1,0,1,0,0,3,1,2,1,2,1,1,0,0,3,0,0,1,1,1,1,2,0,2,0,3,0,0,1,3,0,0,2,0,0,1,2,1,1,2,0,0,1,2,2,1,1,1,2,0,2,1,0,3,0,1,0,1,1,2,1,2,0,3,2,1,1,1,0,0,1,1,2,0,0,0,0,3,2,2,2,0,1,0,1,1,0,0,1,0,0,1,1,0,2,2,1,0,0,0,0,0,0,1,1,2,1,1,0,0,1,2,1,1,3,1,0,1,3,2,0,2,3,4,1,0,2,3,2,1,1,0,1,1,1,0,2,1,2,0,0,1,1,1,0,1,1,0,0,2,1,2,3,2,0,2,1,1,2,0,0,1,1,0,2,2,1,2,0,2,1,0,0,0,1,1,0,0,1,0,2,3,0,1,1,3,1,2,0,0,1,1,4,0,0,0,3,1,0,0,0,2,2,0,1,2,0,3,4,1,2,1,1,1,2,1,1,2,0,0,3,2,1,1,0,1,1,3,1,0,2,0,0,1,1,2,1,1,0,3,1,0,0,1,2,1,0,1,0,0,1,3,0,0,1,2,0,2,3,1,2,1,0,0,3,0,0,1,2,2,2,0,1,0,1,1,0,4,1,1,0,1,0,1,2,1,1,0,1,1,1,2,2,0,2,4,1,2,0,0,2,2,1,1,2,0,1,0,0,2,0,0,1,1,0,0,1,1,0,1,0,0,2,0,2,3,0,1,1,3,2,1,0,1,0,1,4,0,1,1,0,0,0,0,0,2,3,1,1,1,0,1,0,1,1,1,1,2,0,2,1,1,0,0,1,3,1,0,1,2,1,0,0,0,1,0,2,0,1,2,0,2,0,0,2,1,0,1,1,2,1,2,1,3,2,0,1,0,0,0,1,0,0,1,3,1,3,0,1,0,0,0,2,1,2,1,1,1,2,0,1,2,0,1,1,0,1,0,1,1,3,1,1,2,2,1,0,0,1,2,2,2,0,1,0,1,2,0,0,0,3,1,0,2,2,2,2,1,0,0,2,0,1,0,1,0,2,0,0,0,1,1,0,0,3,0,1,0,0,1,2,0,0,0,1,1,0,2,0,3,0,2,1,1,0,0,2,0,1,0,1,0,2,2,1,2,1,0,1,1,3,2,0,1,1,4,1,2,3,0,2,0,1,2,0,2,0,1,0,0,0,1,1,1,0,1,0,1,1,0,3,1,0,3,0,1,1,0,1,2,2,2,1,1,0,0,1,1,1,0,4,3,1,1,0,0,2,0,1,1,0,0,1,1,2,1,2,1,0,2,0,1,2,0,0,1,2,0,0,0,3,1,1,1,0,0,1,1,2,1,1,2,2,4,0,1,1,1,0,0,1,0,1,0,0,1,0,2,0,2,1,0,0,2,0,1,1,2,1,1,0,1,1,0,1,2,2,0,2,2,1,1,1,0,2,2,0,2,2,3,1,0,0,1,2,2,2,3,1,0,1,1,0,0,3,0,0,0,2,0,0,2,2,2,0,0,2,0,0,0,1,2,1,2,0,3,1,0,1,1,2,1,1,1,0,1,0,2,0,0,2,2,1,2,0,2,1,1,0,0,1,1,0,1,3,0,0,0,1,2,1,1,1,1,1,3,0,1,1,2,1,0,1,1,1,0,2,0,0,2,0,0,1,0,0,0,2,1,0,0,2,1,1,2,3,1,1,1,1,2,2,1,1,0,1,1,0,1,1,0,4,0,0,3,0,0,1,2,2,0,1,2,4,0,1,1,1,1,0,0,0,0,1,0,0,0,0,0,1,1,0,2,2,0,0,1,0,1,1,2,1,1,2,1,1,0,1,2,2,0,0,3,0,1,1,3,0,1,0,0,1,1,0,3,0,1,0,1,1,1,0,1,1,1,1,4,1,0,1,1,0,1,0,1,0,1,1,1,1,2,1,2,0,2,0,0,1,2,2,0,0,1,0,1,1,0,0,0,1,0,4,2,1,0,1,2,1,1,0,0,2,0,2,0,2,1,0,2,0,3,1,0,2,1,1,0,3,2,0,0,0,1,1,1,0,0,0,0,0,1,0,0,1,3,2,0,1,0,1,0,2,0,3,1,1,0,3,0,0,0,0,1,0,0,0,2,0,1,0,0,1,2,0,3,0,1,0,1,0,0,2,2,1,0,1,2,3,1,1,1,2,1,1,2,1,0,0,1,1,2,2,3,0,0,0,1,0,2,0,1,0,0,1,1,0,3,1,0,0,1,0,1,2,0,0,0,0,2,1,2,1,0,2,0,0,2,1,1,2,0,1,0,1,1,0,0,2,1,1,1,0,2,3,0,2,2,0,2,2,0,0,2,2,2,2,2,0,2,2,0,2,3,1,0,2,0,0,1,0,1,1,0,2,1,1,1,3,0,2,1,1,1,1,3,2,1,1,1,2,0,3,1,1,2,0,0,1,0,0,0,1,1,1,0,1,1,0,0,1,3,2,0,2,2,0,1,1,0,4,1,1,0,1,1,1,1,1,1,2,0,0,0,0,1,0,2,0,0,2,1,2,0,1,0,1,2,1,0,2,1,2,0,1,1,1,2,1,4,0,1,4,0,4,1,1,0,2,4,1,0,1,3,0,2,0,1,1,3,0,1,0,1,4,2,2,0,1,2,2,0,0,0,2,0,1,1,0,1,1,0,1,2,2,0,0,0,0,1,0,1,0,4,0,2,0,1,0,1,0,0,3,1,2,0,2,1,1,0,1,1,3,1,0,2,1,1,2,1,1,0,0,1,0,0,0,0,1,0,1,1,0,0,0,1,2,2,1,0,1,2,0,0,2,2,0,1,1,2,1,2,0,1,0,1,0,0,1,1,0,1,0,0,2,2,0,1,4,1,1,2,1,1,0,2,1,3,0,0,0,0,0,0,2,1,0,0,0,1,0,2,2,1,1,0,0,0,0,3,1,1,1,1,0,1,1,0,0,1,1,1,0,2,1,1,1,2,1,1,0,0,1,4,0,1,0,1,1,4,0,1,0,1,1,0,1,2,1,0,3,1,0,1,0,0,0,1,0,3,3,0,2,0,1,2,2,0,3,0,1,3,0,1,2,1,1,1,2,2,1,0,0,2,2,0,1,2,0,1,0,2,2,0,2,0,2,0,1,0,1,3,1,0,1,1,1,1,0,0,0,0,1,0,0,1,0,2,1,0,0,0,0,2,0,1,1,1,2,2,0,0,2,1,0,0,1,0,3,3,1,0,2,1,1,2,0,0,0,1,2,2,2,0,0,1,1,1,0,0,0,2,0,2,0,1,1,0,2,3,1,0,0,0,1,0,0,1,1,0,1,1,1,0,3,4,2,0,1,1,2,1,0,0,2,1,1,1,3,2,1,1,1,1,2,0,0,0,1,0,3,0,0,2,1,0,0,3,1,2,0,0,1,3,1,4,0,2,1,1,1,0,2,0,1,0,1,1,0,0,0,1,0,2,0,1,1,2,1,0,0,0,0,2,2,2,0,1,2,3,0,1,1,1,2,0,0,3,1,2,0,1,1,0,0,0,0,1,0,1,1,2,1,1,0,2,1,2,0,1,1,1,1,0,0,0,4,0,1,0,1,0,2,0,1,1,0,0,1,0,2,1,1,5,0,1,1,1,1,1,2,0,2,1,2,1,1,2,0,2,5,2,0,2,0,0,1,0,0,0,1,0,1,0,0,0,0,1,0,3,1,1,0,0,0,1,0,0,1,0,0,0,1,2,2,0,0,1,0,0,1,0,1,0,1,1,0,2,2,1,0,2,2,0,0,1,0,1,1,1,1,1,1,3,1,2,1,2,1,3,1,0,3,0,0,0,0,1,1,1,0,1,3,1,0,0,1,0,0,2,0,1,3,2,1,1,0,0,2,1,0,1,1,1,0,0,0,3,1,0,1,1,1,2,3,2,0,1,0,0,0,0,1,2,1,2,1,0,2,1,1,2,0,0,2,0,2,2,2,1,2,1,2,1,0,1,2,1,1,1,1,2,1,1,0,2,1,2,1,1,2,0,2,2,2,3,2,1,1,3,1,0,3,2,1,2,1,0,1,0,1,1,0,0,1,1,0,0,5,0,3,0,0,0,0,3,1,1,0,0,0,2,1,0,0,2,0,1,1,0,1,0,1,1,2,1,0,0,0,0,2,0,2,1,1,1,1,1,2,2,1,1,0,1,1,1,0,0,1,1,0,3,2,1,1,0,0,0]},{"counters":[3,2,1,1,2,1,0,1,2,1,0,0,0,1,1,3,2,0,2,1,2,0,1,1,1,1,1,0,0,1,0,3,1,0,1,0,1,2,1,0,1,1,1,1,4,2,1,1,0,0,2,2,0,1,0,0,0,1,1,2,0,2,1,0,2,0,1,1,2,1,0,0,1,0,0,3,3,1,1,3,1,2,1,1,5,2,1,1,2,2,1,1,1,0,1,0,0,0,1,0,0,1,1,1,3,1,2,1,0,0,1,3,2,0,0,0,1,1,2,1,0,1,0,1,0,0,2,1,3,3,1,1,3,1,2,3,1,0,0,6,1,0,1,1,0,2,1,0,1,1,0,2,1,0,2,1,1,1,1,2,0,0,3,0,2,0,1,2,3,3,1,1,0,2,1,1,0,2,0,0,2,0,0,0,1,2,1,2,1,1,0,2,1,0,1,0,3,2,0,0,2,1,3,1,1,1,1,0,1,0,0,1,0,1,0,1,0,2,1,0,0,0,1,1,2,2,2,0,0,0,1,3,1,0,0,1,1,1,0,0,1,0,2,1,1,1,1,1,0,0,0,1,0,3,1,2,0,1,1,1,2,2,1,0,2,1,1,0,1,1,0,0,0,0,6,4,1,0,0,1,1,1,0,0,1,1,2,2,3,0,0,4,0,4,1,2,0,2,0,0,0,1,1,2,1,2,2,0,0,1,1,1,1,1,0,0,0,1,1,1,0,3,1,1,4,0,1,0,1,1,1,0,5,1,0,0,0,0,1,1,1,0,2,3,1,1,2,0,2,1,0,1,2,0,3,1,0,1,2,1,2,1,0,1,2,1,2,0,1,1,1,0,0,0,1,0,1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,3,2,1,0,0,2,1,1,1,2,0,0,2,1,3,0,0,2,0,1,1,0,1,0,0,4,0,1,1,1,1,0,1,1,1,2,1,1,3,0,2,3,1,1,1,0,3,0,1,2,0,0,1,0,1,1,2,0,1,1,2,1,0,2,2,1,0,1,1,1,1,0,1,3,0,0,0,1,0,1,0,0,0,0,2,1,1,1,0,2,0,0,1,0,1,0,0,0,0,2,1,1,0,1,0,1,1,0,0,1,1,1,0,1,1,1,0,1,0,2,0,1,3,1,2,1,0,2,1,2,2,0,0,3,0,1,1,1,2,1,0,0,1,2,0,1,1,0,1,0,1,1,3,0,2,2,3,1,0,0,1,1,1,3,1,0,0,2,2,2,1,1,0,2,0,1,1,1,2,0,3,0,0,0,3,2,1,0,0,1,2,0,1,0,1,2,0,0,0,1,0,2,0,0,1,2,0,0,0,1,1,2,0,0,0,2,0,1,1,1,1,1,2,2,1,2,0,2,0,3,0,1,1,4,1,3,1,1,0,0,1,1,0,0,2,2,0,1,1,0,0,1,0,0,1,1,2,0,3,3,1,0,1,1,1,1,0,1,0,0,0,2,0,3,1,1,2,1,1,2,0,0,1,1,0,0,2,1,2,1,0,1,2,1,1,0,2,2,0,2,0,0,0,3,0,3,0,2,1,1,1,1,0,1,0,2,1,2,0,2,3,2,3,1,1,1,2,0,1,2,0,1,0,0,2,0,0,1,1,2,1,1,2,0,1,0,0,0,1,1,1,2,1,1,1,0,0,1,1,1,1,2,1,0,0,2,0,1,1,0,0,1,1,1,0,0,1,2,1,1,1,0,1,3,1,0,1,2,0,2,0,1,1,0,1,2,1,2,0,2,0,0,3,2,0,2,1,2,1,3,1,3,1,1,0,1,1,1,0,2,1,1,1,1,1,0,1,0,0,1,1,1,2,0,0,1,2,1,2,1,0,1,1,2,0,1,1,0,1,3,0,0,2,2,0,0,4,0,0,1,0,1,0,0,1,0,1,2,1,4,0,1,2,0,1,1,0,0,0,0,2,3,0,1,0,2,0,2,0,1,1,1,3,1,2,0,1,1,1,0,0,2,1,1,3,0,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,2,0,0,1,0,1,1,2,2,2,1,0,1,2,0,1,1,1,0,2,0,1,0,2,4,0,1,3,0,0,1,1,0,3,1,0,2,1,3,2,3,1,0,4,1,0,1,1,1,0,0,1,1,0,1,0,2,2,2,0,3,0,0,1,0,1,1,1,1,0,1,1,0,1,0,1,0,0,1,3,1,1,1,1,0,1,1,1,1,1,2,2,1,0,0,1,0,1,4,0,1,0,0,3,0,1,0,2,1,2,0,1,1,0,2,1,0,3,1,1,0,1,0,2,1,1,2,2,1,0,1,1,0,2,1,2,0,0,0,2,2,1,0,1,0,0,2,1,1,2,6,0,0,1,0,4,3,3,3,1,0,1,1,0,2,1,0,3,0,3,0,2,0,4,0,0,0,0,0,0,3,1,1,2,0,1,0,0,1,3,0,2,0,2,4,2,1,1,1,1,2,0,2,0,1,1,0,1,0,1,0,2,2,1,2,1,0,2,1,1,0,2,0,1,1,0,2,3,1,1,1,0,0,4,1,1,1,1,1,1,1,1,1,2,2,1,1,3,2,1,2,0,2,0,0,1,1,1,0,1,1,1,0,1,0,0,1,1,1,2,1,1,0,2,1,1,0,1,3,3,0,0,0,1,3,1,0,0,0,0,1,0,1,3,2,0,0,0,0,0,2,2,1,0,1,1,2,1,0,3,1,1,1,5,0,2,0,0,1,0,0,1,0,0,1,0,1,2,1,2,0,1,1,0,2,1,0,0,2,1,0,1,2,0,5,0,1,0,2,1,1,0,1,1,0,1,1,2,0,1,0,1,1,0,1,0,2,0,0,0,1,1,1,0,1,0,0,1,1,2,0,2,0,1,0,1,4,0,3,1,2,1,1,2,1,0,1,2,2,3,0,1,1,3,0,1,0,1,0,0,0,1,0,0,1,2,0,0,1,0,2,4,0,0,0,1,1,2,2,1,1,2,0,1,0,0,3,0,1,1,2,0,1,2,1,1,0,3,1,3,1,1,1,0,2,1,0,0,1,0,0,0,1,0,1,0,0,1,0,1,2,1,2,1,1,1,0,1,0,0,2,0,3,1,1,1,2,1,0,1,1,2,0,1,2,0,0,1,2,0,2,3,1,2,2,1,1,4,3,2,0,1,2,0,4,0,2,0,2,1,3,0,0,0,0,0,1,0,1,0,1,0,0,0,0,1,0,0,1,0,1,1,0,0,0,0,0,0,0,1,2,0,1,0,0,0,1,0,0,0,1,0,0,2,1,0,1,1,2,0,2,0,1,2,2,1,2,1,1,1,0,0,1,3,1,0,1,2,1,1,0,0,0,0,0,1,0,0,1,0,2,2,2,2,1,1,0,1,1,0,0,0,0,0,0,0,1,1,0,3,2,0,0,1,2,0,2,0,0,1,0,2,1,0,2,1,2,2,1,1,0,2,1,2,2,0,3,1,1,2,1,3,1,3,1,3,1,1,2,1,0,0,0,2,1,0,0,0,0,0,1,0,1,0,1,1,0,0,0,2,1,1,3,0,0,1,1,1,3,1,0,1,1,1,2,0,1,1,0,0,2,1,0,1,1,1,1,3,1,0,1,0,1,2,0,1,1,1,0,1,1,0,2,1,0,2,0,0,1,1,2,2,0,0,0,0,1,1,1,1,1,1,0,1,1,1,2,0,0,1,1,1,0,3,1,1,0,1,2,1,3,1,2,0,0,1,2,0,1,0,0,1,0,2,0,2,2,4,1,1,4,0,0,1,1,1,6,1,0,0,0,1,1,0,0,2,2,2,1,0,3,1,0,0,1,1,0,1,0,1,2,1,1,2,1,0,0,0,1,0,0,0,0,1,0,1,0,5,3,1,3,0,0,1,0,0,0,1,1,3,0,1,1,1,0,2,2,0,1,0,0,0,1,3,0,2,1,0,2,1,0,0,1,0,1,2,1,2,1,1,1,0,0,0,2,1,1,0,2,1,0,2,0,1,1,1,2,1,0,0,1,0,0,2,2,3,1,1,1,1,0,1,2,1,1,1,2,2,0,1,0,1,0,1,1,0,0,2,0,1,1,2,1,0,2,1,1,1,1,3,2,1,0,2,1,0,0,3,0,0,4,1,0,3,2,2,1,1,2,1,0,0,1,0,0,0,1,1,0,1,1,1,1,0,3,1,2,0,1,1,1,2,1,1,1,1,2,0,1,0,2,0,4,2,3,3,0,1,0,0,1,0,2,2,0,1,1,1,0,3,3,1,1,0,1,2,0,1,2,0,2,0,2,0,2,1,1,2,0,1,2,0,1,0,1,1,0,0,0,0,0,0,1,1,0,2,4,0,1,2,0,1,3,0,1,1,0,4,0,2,1,2,2,3,1,1,1,0,2,0,1,0,3,4,1,3,0,0,0,2,0,0,1,1,2,0,1,0,0,0,1,2,0,1,1,1,0,0,1,2,0,0,1,1,0,4,0,0,0,1,0,2,1,1,1,0,1,2,1,1,0,2,1,1,3,0,1,0,1,2,1,1,0,0,3,0,0,0,0,1,0,1,0,1,0,1]}]},"null_count":0,"last_update_version":397952058323107840},"id":{"histogram":{"ndv":2000,"buckets":[{"count":8,"lower_bound":"LTIxNDUxOTQ2NTU=","upper_bound":"LTIxMjc4OTE4NDQ=","repeats":1},{"count":16,"lower_bound":"LTIxMjU5NzY2Mjg=","upper_bound":"LTIxMjIyNDE2MTk=","repeats":1},{"count":24,"lower_bound":"LTIxMTk0OTU3ODQ=","upper_bound":"LTIxMDIxNjQ3Mzk=","repeats":1},{"count":32,"lower_bound":"LTIwOTI0NjMxNDU=","upper_bound":"LTIwODc3OTM3MTA=","repeats":1},{"count":40,"lower_bound":"LTIwODY1NDE3MjA=","upper_bound":"LTIwNzMxNzE0MTQ=","repeats":1},{"count":48,"lower_bound":"LTIwNzEzNTM4MTQ=","upper_bound":"LTIwNjc3MzcwNDQ=","repeats":1},{"count":56,"lower_bound":"LTIwNTU2MjY3NjI=","upper_bound":"LTIwMjU0NTkwNTA=","repeats":1},{"count":64,"lower_bound":"LTIwMTQ3OTAwMDY=","upper_bound":"LTIwMDg5MzkxMjQ=","repeats":1},{"count":72,"lower_bound":"LTIwMDQ4NjQ2MjY=","upper_bound":"LTE5OTg3OTI3MDg=","repeats":1},{"count":80,"lower_bound":"LTE5OTA1MTA3MTQ=","upper_bound":"LTE5NjY2Njg1NDM=","repeats":1},{"count":88,"lower_bound":"LTE5NjYxOTc3NDI=","upper_bound":"LTE5NTI0NDYwMDM=","repeats":1},{"count":96,"lower_bound":"LTE5MzE2NjQ4MTA=","upper_bound":"LTE5MjY3NTczNjk=","repeats":1},{"count":104,"lower_bound":"LTE5MjExNjMxNDg=","upper_bound":"LTE5MDQxMDAyMzA=","repeats":1},{"count":112,"lower_bound":"LTE5MDMwMDYxMTg=","upper_bound":"LTE5MDAwNTI0MDE=","repeats":1},{"count":120,"lower_bound":"LTE4OTExOTIxODM=","upper_bound":"LTE4NzY0NTExNjY=","repeats":1},{"count":128,"lower_bound":"LTE4NzYyNTM4MDc=","upper_bound":"LTE4NjI3MzE3NzU=","repeats":1},{"count":136,"lower_bound":"LTE4NjAzMzE0MDE=","upper_bound":"LTE4NTMyNzAxOTg=","repeats":1},{"count":144,"lower_bound":"LTE4NDk0NDM4NDI=","upper_bound":"LTE4MjI3NDE2ODA=","repeats":1},{"count":152,"lower_bound":"LTE4MTk5OTIzOTA=","upper_bound":"LTE4MDU5NTg3MjE=","repeats":1},{"count":160,"lower_bound":"LTE4MDA5MDc1NTc=","upper_bound":"LTE3NzIyMzY2MjM=","repeats":1},{"count":168,"lower_bound":"LTE3Njg4ODc5OTY=","upper_bound":"LTE3NjQ5NjIyMzI=","repeats":1},{"count":176,"lower_bound":"LTE3NTcwMTAxMDM=","upper_bound":"LTE3NDMzMjA2MzE=","repeats":1},{"count":184,"lower_bound":"LTE3NDI2MjI4NjQ=","upper_bound":"LTE3MzI0MTY0NzQ=","repeats":1},{"count":192,"lower_bound":"LTE3MjU1NzkyMDE=","upper_bound":"LTE3MjA5MjE3ODk=","repeats":1},{"count":200,"lower_bound":"LTE3MTk5MzMxMjM=","upper_bound":"LTE2OTUwOTc0NjQ=","repeats":1},{"count":208,"lower_bound":"LTE2NzkyMjI3NTE=","upper_bound":"LTE2NjkzMTY4NzI=","repeats":1},{"count":216,"lower_bound":"LTE2Njg5Njk3NTU=","upper_bound":"LTE2NTk2Mzk5ODQ=","repeats":1},{"count":224,"lower_bound":"LTE2NTk2MTQyNzU=","upper_bound":"LTE2NTgwMzAzNTU=","repeats":1},{"count":232,"lower_bound":"LTE2NTMxOTAwMTI=","upper_bound":"LTE2NDUwNjExNzA=","repeats":1},{"count":240,"lower_bound":"LTE2Mzc0OTMyMDc=","upper_bound":"LTE2MjkwMjIyNTE=","repeats":1},{"count":248,"lower_bound":"LTE2MjcyNzk3NTY=","upper_bound":"LTE2MjQyODc4NzE=","repeats":1},{"count":256,"lower_bound":"LTE2MjI3ODMxOTU=","upper_bound":"LTE2MTI4NDM3MDI=","repeats":1},{"count":264,"lower_bound":"LTE2MDU5MjkzNzM=","upper_bound":"LTE1OTY0OTY3NjU=","repeats":1},{"count":272,"lower_bound":"LTE1ODEyMjMxMzI=","upper_bound":"LTE1NzcwODYxMzg=","repeats":1},{"count":280,"lower_bound":"LTE1NTkwODM4ODg=","upper_bound":"LTE1NTQyNjA3Mzk=","repeats":1},{"count":288,"lower_bound":"LTE1NTM5MDI3MDc=","upper_bound":"LTE1MzMyMTE1MTE=","repeats":1},{"count":296,"lower_bound":"LTE1Mjg1NjUwODU=","upper_bound":"LTE1MjA0MzQyNjc=","repeats":1},{"count":304,"lower_bound":"LTE1MTg4OTA2MTI=","upper_bound":"LTE0OTIwMjk2Nzc=","repeats":1},{"count":312,"lower_bound":"LTE0OTEzODkwODE=","upper_bound":"LTE0Njk5NjIzNjU=","repeats":1},{"count":320,"lower_bound":"LTE0NjI3MjEyNDk=","upper_bound":"LTE0NDMxMTY4MjM=","repeats":1},{"count":328,"lower_bound":"LTE0NDI0NzQ3NDM=","upper_bound":"LTE0MzA5MTE1MDI=","repeats":1},{"count":336,"lower_bound":"LTE0MjMwNTE0ODc=","upper_bound":"LTE0MTIxMjY5MTQ=","repeats":1},{"count":344,"lower_bound":"LTE0MTEzNjYyMTQ=","upper_bound":"LTEzOTUzNDA2MzY=","repeats":1},{"count":352,"lower_bound":"LTEzOTQ5MjQ0NDc=","upper_bound":"LTEzOTExMTA3ODA=","repeats":1},{"count":360,"lower_bound":"LTEzNzI4MjI1MDc=","upper_bound":"LTEzNjQxNTgxNDk=","repeats":1},{"count":368,"lower_bound":"LTEzNjEwMTUzODQ=","upper_bound":"LTEzNTU2MjQ0NjY=","repeats":1},{"count":376,"lower_bound":"LTEzNTE1Njk4MzI=","upper_bound":"LTEzNDUzNzkzOTM=","repeats":1},{"count":384,"lower_bound":"LTEzNDA1OTM4MzA=","upper_bound":"LTEzMzEzNzIzNTk=","repeats":1},{"count":392,"lower_bound":"LTEzMzA3OTMwNTg=","upper_bound":"LTEzMTQ5MTQ3OTY=","repeats":1},{"count":400,"lower_bound":"LTEzMTM5OTYzMzc=","upper_bound":"LTEyOTU4NzU3NDM=","repeats":1},{"count":408,"lower_bound":"LTEyOTI3MTAxMzI=","upper_bound":"LTEyNzY0Njg2MDM=","repeats":1},{"count":416,"lower_bound":"LTEyNzM5MjY0NTc=","upper_bound":"LTEyNjM1NTU3NjY=","repeats":1},{"count":424,"lower_bound":"LTEyNjA4ODg2ODU=","upper_bound":"LTEyNTEyMDIwMDA=","repeats":1},{"count":432,"lower_bound":"LTEyNTA4MDA1NDI=","upper_bound":"LTEyNDY3MDU3Nzk=","repeats":1},{"count":440,"lower_bound":"LTEyNDE0NjcxNDg=","upper_bound":"LTEyMjc4MDkyODQ=","repeats":1},{"count":448,"lower_bound":"LTEyMjcwNDkxMzg=","upper_bound":"LTEyMDEzMDg5NTU=","repeats":1},{"count":456,"lower_bound":"LTEyMDA5NzQzOTQ=","upper_bound":"LTExOTEyODc2NTE=","repeats":1},{"count":464,"lower_bound":"LTExOTAxMTkwOTA=","upper_bound":"LTExODI5NzY2Njg=","repeats":1},{"count":472,"lower_bound":"LTExNzg1MDA5OTU=","upper_bound":"LTExNTgyMTY4OTI=","repeats":1},{"count":480,"lower_bound":"LTExNTY4Nzg5MzI=","upper_bound":"LTExNTE0NzMxODY=","repeats":1},{"count":488,"lower_bound":"LTExNDE1NjYzNDE=","upper_bound":"LTExMzUzMTE1Nzk=","repeats":1},{"count":496,"lower_bound":"LTExMjk2MTMyMDk=","upper_bound":"LTExMjY5NDE2NzE=","repeats":1},{"count":504,"lower_bound":"LTExMTkwNDY5OTc=","upper_bound":"LTExMTQ4NTQ4NzM=","repeats":1},{"count":512,"lower_bound":"LTExMDg2MTM4MTg=","upper_bound":"LTExMDI1ODc2ODY=","repeats":1},{"count":520,"lower_bound":"LTExMDE3NDUxOTk=","upper_bound":"LTEwODQ2MDAyMTY=","repeats":1},{"count":528,"lower_bound":"LTEwODM4OTM4NTk=","upper_bound":"LTEwNzIxMTA2NTU=","repeats":1},{"count":536,"lower_bound":"LTEwNjYzOTE4NTc=","upper_bound":"LTEwNTMwNTY5MjM=","repeats":1},{"count":544,"lower_bound":"LTEwNDQwNDUxMjk=","upper_bound":"LTEwMzY5MjIzNjU=","repeats":1},{"count":552,"lower_bound":"LTEwMzY0MDMzNDk=","upper_bound":"LTEwMTA4MTgyMzQ=","repeats":1},{"count":560,"lower_bound":"LTEwMDg4ODI4ODQ=","upper_bound":"LTk5MDAzNjY0Mg==","repeats":1},{"count":568,"lower_bound":"LTk4ODQ0NTY4NA==","upper_bound":"LTk3MzkxNzE1Mg==","repeats":1},{"count":576,"lower_bound":"LTk3Mzg5ODcxNw==","upper_bound":"LTk1Nzc1NzA1MA==","repeats":1},{"count":584,"lower_bound":"LTk1NTU3OTc5MA==","upper_bound":"LTk0ODU5MDU3Ng==","repeats":1},{"count":592,"lower_bound":"LTkzODY1NDMxOQ==","upper_bound":"LTkzMDg5NDIyOQ==","repeats":1},{"count":600,"lower_bound":"LTkyNjcxMzM4Nw==","upper_bound":"LTg5MzEyODg2NQ==","repeats":1},{"count":608,"lower_bound":"LTg4NzkxNjgyMA==","upper_bound":"LTg4MzQxODc3Mg==","repeats":1},{"count":616,"lower_bound":"LTg4MjY0OTYwMQ==","upper_bound":"LTg3NDk5NTcwNw==","repeats":1},{"count":624,"lower_bound":"LTg3NDY0ODkyMQ==","upper_bound":"LTg2MjM4MjUyOQ==","repeats":1},{"count":632,"lower_bound":"LTg2MTAzNTY1OA==","upper_bound":"LTg1ODc0NjQxOA==","repeats":1},{"count":640,"lower_bound":"LTg1Njc2NjEwOA==","upper_bound":"LTg0ODU5NzI2OA==","repeats":1},{"count":648,"lower_bound":"LTg0ODQzMjk5Mg==","upper_bound":"LTg0MzQzMDE2NA==","repeats":1},{"count":656,"lower_bound":"LTg0MDIzNzIwOQ==","upper_bound":"LTgyNzA3MjgyNw==","repeats":1},{"count":664,"lower_bound":"LTgyMTk3NzY3MA==","upper_bound":"LTgwODE5MjcxNg==","repeats":1},{"count":672,"lower_bound":"LTc5ODE2NDEzMg==","upper_bound":"LTc4NTU5ODU4Nw==","repeats":1},{"count":680,"lower_bound":"LTc3MjE3NjUyMQ==","upper_bound":"LTc0Nzk4NDUzNA==","repeats":1},{"count":688,"lower_bound":"LTc0Nzc3MTMyNg==","upper_bound":"LTczNjQzMjk3MQ==","repeats":1},{"count":696,"lower_bound":"LTczNTM2MTU0Mw==","upper_bound":"LTcyNDc0OTEzNA==","repeats":1},{"count":704,"lower_bound":"LTcyMTgzNTQ4Mw==","upper_bound":"LTY4MTk4MDU0NQ==","repeats":1},{"count":712,"lower_bound":"LTY3NDU1ODA1OQ==","upper_bound":"LTY0NzExMTk2MQ==","repeats":1},{"count":720,"lower_bound":"LTY0MjMzMTMyMQ==","upper_bound":"LTYyMjE1MDg2Mw==","repeats":1},{"count":728,"lower_bound":"LTYwNzE1ODk2Nw==","upper_bound":"LTU4NTcwNDc2MA==","repeats":1},{"count":736,"lower_bound":"LTU4MTExODE2MA==","upper_bound":"LTU2MDQ5ODI3OQ==","repeats":1},{"count":744,"lower_bound":"LTU1NzIwMDk3NQ==","upper_bound":"LTU1MTk0MDE5NA==","repeats":1},{"count":752,"lower_bound":"LTU0OTM2MjYxMQ==","upper_bound":"LTUzOTIwMDY5Mg==","repeats":1},{"count":760,"lower_bound":"LTUzNjU0MTUxMA==","upper_bound":"LTUxMTY4MTM0MQ==","repeats":1},{"count":768,"lower_bound":"LTUwOTExNTgyOA==","upper_bound":"LTUwMDc2NTc1MA==","repeats":1},{"count":776,"lower_bound":"LTQ5OTQ3NDA1MA==","upper_bound":"LTQ5MDI2NzQzNQ==","repeats":1},{"count":784,"lower_bound":"LTQ4NjM2MjQ1Nw==","upper_bound":"LTQ2NzIwNDcxNA==","repeats":1},{"count":792,"lower_bound":"LTQ2NjI0NDQyNQ==","upper_bound":"LTQ1NzMyMTE2OQ==","repeats":1},{"count":800,"lower_bound":"LTQ1MjIzODk0Nw==","upper_bound":"LTQ0ODg0MDczMA==","repeats":1},{"count":808,"lower_bound":"LTQ0ODIzNzAxNQ==","upper_bound":"LTQzMjU4MjQ0NA==","repeats":1},{"count":816,"lower_bound":"LTQyOTg3MDE1Ng==","upper_bound":"LTQwOTM0MDcwMg==","repeats":1},{"count":824,"lower_bound":"LTQwNTU1NDYxOQ==","upper_bound":"LTQwMDY3OTgwNQ==","repeats":1},{"count":832,"lower_bound":"LTM5OTU2MjE3MA==","upper_bound":"LTM4OTE4NjQ2Mw==","repeats":1},{"count":840,"lower_bound":"LTM4MzQwMTM0NA==","upper_bound":"LTM3MjQ0NTY4Mg==","repeats":1},{"count":848,"lower_bound":"LTM3MTg1MDQyMQ==","upper_bound":"LTM2MjU2NTQyOQ==","repeats":1},{"count":856,"lower_bound":"LTM2MDgzMTIxNA==","upper_bound":"LTM1MDg4ODA1NA==","repeats":1},{"count":864,"lower_bound":"LTM0NjY2MDIxMQ==","upper_bound":"LTMzOTk3MTUwOA==","repeats":1},{"count":872,"lower_bound":"LTMzNjEzNTU0Mg==","upper_bound":"LTMyNTgzODc0Nw==","repeats":1},{"count":880,"lower_bound":"LTMyNDAzOTcwNw==","upper_bound":"LTMxMDE1MDA3MQ==","repeats":1},{"count":888,"lower_bound":"LTMwNjA2NjQ5NA==","upper_bound":"LTI5MTIwMjE3NA==","repeats":1},{"count":896,"lower_bound":"LTI3NTk3MTQ3Nw==","upper_bound":"LTI2Mzc0OTAxOA==","repeats":1},{"count":904,"lower_bound":"LTI1Njg4NjAwNg==","upper_bound":"LTI0NDUyNzUzOQ==","repeats":1},{"count":912,"lower_bound":"LTIzODQyODkxMg==","upper_bound":"LTIzMTUzMTM1OQ==","repeats":1},{"count":920,"lower_bound":"LTIyNzk2NzgzOQ==","upper_bound":"LTIxODQ5ODk3OA==","repeats":1},{"count":928,"lower_bound":"LTIxNzYzNTk2OQ==","upper_bound":"LTE5OTY5OTU3NQ==","repeats":1},{"count":936,"lower_bound":"LTE5NjAwMjI4MA==","upper_bound":"LTE4ODUwNDg1NQ==","repeats":1},{"count":944,"lower_bound":"LTE4MzQ2MzI3NQ==","upper_bound":"LTE2MzY4Mjc0OA==","repeats":1},{"count":952,"lower_bound":"LTE1OTk5NjQwMQ==","upper_bound":"LTE0OTI1Nzc3NQ==","repeats":1},{"count":960,"lower_bound":"LTE0MDE5NzE1MQ==","upper_bound":"LTEzNzA3NTY1Ng==","repeats":1},{"count":968,"lower_bound":"LTEzNjk4NzUwMw==","upper_bound":"LTEyMzcwNjYwNA==","repeats":1},{"count":976,"lower_bound":"LTEyMDM4MTc2NQ==","upper_bound":"LTk3MzQ1MzI4","repeats":1},{"count":984,"lower_bound":"LTkzOTI1MTM0","upper_bound":"LTg5NTExMTY0","repeats":1},{"count":992,"lower_bound":"LTg5MDU4MzIw","upper_bound":"LTc5NDYyMDE3","repeats":1},{"count":1000,"lower_bound":"LTc4ODQzMDM2","upper_bound":"LTY5NjE5ODg2","repeats":1},{"count":1008,"lower_bound":"LTU5NTc2OTQ4","upper_bound":"LTQ2NDM4MTM2","repeats":1},{"count":1016,"lower_bound":"LTI3MTIyMjI0","upper_bound":"LTExNzcwNzQ4","repeats":1},{"count":1024,"lower_bound":"LTg5MDI0MTQ=","upper_bound":"MTc1MzAyNQ==","repeats":1},{"count":1032,"lower_bound":"NDMzOTYxNQ==","upper_bound":"MjAwMjg0NDM=","repeats":1},{"count":1040,"lower_bound":"MjQ3NDIwMDI=","upper_bound":"MzM0NzQ5MDE=","repeats":1},{"count":1048,"lower_bound":"NDAzMjg4MTI=","upper_bound":"NzY4MTkzNzc=","repeats":1},{"count":1056,"lower_bound":"Nzc2ODI0MTQ=","upper_bound":"OTYzMjQ4NDg=","repeats":1},{"count":1064,"lower_bound":"OTg1NzgxNzg=","upper_bound":"MTAyOTkxMTUz","repeats":1},{"count":1072,"lower_bound":"MTEyODYzNjA0","upper_bound":"MTMwNjA2NjMz","repeats":1},{"count":1080,"lower_bound":"MTMxNTcwNDIz","upper_bound":"MTUxODYyMDMy","repeats":1},{"count":1088,"lower_bound":"MTYyODMwMjYx","upper_bound":"MTY2MTkwOTE4","repeats":1},{"count":1096,"lower_bound":"MTY4MDg3NjYz","upper_bound":"MTc0Mzg2NzE3","repeats":1},{"count":1104,"lower_bound":"MTc5MTQzOTAx","upper_bound":"MTg5MjUwMTM3","repeats":1},{"count":1112,"lower_bound":"MTk1NjUyODEz","upper_bound":"MjExODcwNjgx","repeats":1},{"count":1120,"lower_bound":"MjE1NzY1MDIy","upper_bound":"MjMwMjkwMjA1","repeats":1},{"count":1128,"lower_bound":"MjMwNDg0MTA0","upper_bound":"MjQ1NjMyMjY3","repeats":1},{"count":1136,"lower_bound":"MjQ2OTk2NzM2","upper_bound":"MjU2OTY0OTcz","repeats":1},{"count":1144,"lower_bound":"MjYwNTc1MTkz","upper_bound":"Mjg5MDk3MTY0","repeats":1},{"count":1152,"lower_bound":"MjkwNDQ3Njcz","upper_bound":"Mjk0NjExNDEx","repeats":1},{"count":1160,"lower_bound":"Mjk0NjUxMjIw","upper_bound":"MzA3ODkxNjI3","repeats":1},{"count":1168,"lower_bound":"MzE2NDQ2Mjgx","upper_bound":"MzM4MzIwMzA5","repeats":1},{"count":1176,"lower_bound":"MzQxMTEzOTI0","upper_bound":"MzQ3OTY0NjU4","repeats":1},{"count":1184,"lower_bound":"MzQ5MTYzMzg2","upper_bound":"NDAxMDIwNjQw","repeats":1},{"count":1192,"lower_bound":"NDA0Njk2Mjc3","upper_bound":"NDA3NjQ5MTM3","repeats":1},{"count":1200,"lower_bound":"NDEyOTI1Nzc4","upper_bound":"NDE3MTE3NTI0","repeats":1},{"count":1208,"lower_bound":"NDE5OTUwNTAy","upper_bound":"NDI0Mjg1MzI0","repeats":1},{"count":1216,"lower_bound":"NDI1MjM1Nzkz","upper_bound":"NDM3NTI2MzIz","repeats":1},{"count":1224,"lower_bound":"NDQwMzQyMzAw","upper_bound":"NDYxNTkzNjQ2","repeats":1},{"count":1232,"lower_bound":"NDY1OTg1OTkw","upper_bound":"NDcxNzUzMTc2","repeats":1},{"count":1240,"lower_bound":"NDc0MDMzOTE5","upper_bound":"NDgwNjMzMDg0","repeats":1},{"count":1248,"lower_bound":"NDgxOTkxMzMy","upper_bound":"NDk1MjA5OTcx","repeats":1},{"count":1256,"lower_bound":"NDk2OTk1NTYz","upper_bound":"NTE3NjUyOTc2","repeats":1},{"count":1264,"lower_bound":"NTI1ODE4MTc5","upper_bound":"NTQzNzE1MzEx","repeats":1},{"count":1272,"lower_bound":"NTQ2MDEyNjI0","upper_bound":"NTUzODcwNTIw","repeats":1},{"count":1280,"lower_bound":"NTU3OTQwNTk0","upper_bound":"NTY5MTY1ODA0","repeats":1},{"count":1288,"lower_bound":"NTY5NzMzODEy","upper_bound":"NTg0MzkwOTIz","repeats":1},{"count":1296,"lower_bound":"NTg3NjIyODA5","upper_bound":"NjAyOTY2OTM0","repeats":1},{"count":1304,"lower_bound":"NjA1OTA1MzQz","upper_bound":"NjE5NTM3MTc2","repeats":1},{"count":1312,"lower_bound":"NjIwNjE1NTcz","upper_bound":"NjI0MDQwNzY4","repeats":1},{"count":1320,"lower_bound":"NjMyMTc5Mzg4","upper_bound":"NjQwNjAyNDcz","repeats":1},{"count":1328,"lower_bound":"NjQ5NzQ5MzQy","upper_bound":"NjY3ODY0MzQx","repeats":1},{"count":1336,"lower_bound":"Njc4ODMyODc3","upper_bound":"NjgxNzI0NTIw","repeats":1},{"count":1344,"lower_bound":"Njk4NjYyNjMw","upper_bound":"NzA0OTg2Mjc4","repeats":1},{"count":1352,"lower_bound":"NzA4MTUxMzc3","upper_bound":"NzE4MjM5MzE5","repeats":1},{"count":1360,"lower_bound":"NzIwODgwNTE3","upper_bound":"NzM0MjYwNDE2","repeats":1},{"count":1368,"lower_bound":"NzM1NzcwMTE4","upper_bound":"NzU2NTc0Mzgw","repeats":1},{"count":1376,"lower_bound":"NzU3MDY3ODE1","upper_bound":"NzYwOTg3MzI3","repeats":1},{"count":1384,"lower_bound":"NzY1MDIzMDgz","upper_bound":"Nzc0MzM2OTU1","repeats":1},{"count":1392,"lower_bound":"Nzc3OTAzNDk3","upper_bound":"NzkxNjI3MTk3","repeats":1},{"count":1400,"lower_bound":"NzkxNjcxNTU0","upper_bound":"ODA4NzI5NDgw","repeats":1},{"count":1408,"lower_bound":"ODE2MzcyOTkz","upper_bound":"ODI2NzcxODY1","repeats":1},{"count":1416,"lower_bound":"ODI5MjY1MzYy","upper_bound":"ODM5MjIxMzkx","repeats":1},{"count":1424,"lower_bound":"ODQxMTk2NzY0","upper_bound":"ODUwNTgxMTc4","repeats":1},{"count":1432,"lower_bound":"ODYzMjI5MjYy","upper_bound":"ODc1MTg3MTgz","repeats":1},{"count":1440,"lower_bound":"ODc3MjQ0MjEw","upper_bound":"ODg2NjU5MTUz","repeats":1},{"count":1448,"lower_bound":"ODg4OTQzMDQ0","upper_bound":"ODkyOTE3MTI5","repeats":1},{"count":1456,"lower_bound":"ODk5OTM3NDAx","upper_bound":"OTE4NDUwOTg4","repeats":1},{"count":1464,"lower_bound":"OTE5OTA5ODQ4","upper_bound":"OTQyNTYzMTk3","repeats":1},{"count":1472,"lower_bound":"OTQ1NjY5MTEw","upper_bound":"OTU4NTc3NjUx","repeats":1},{"count":1480,"lower_bound":"OTU5NDQ3ODg4","upper_bound":"OTc0NDcwOTQ4","repeats":1},{"count":1488,"lower_bound":"OTc4MjkxODYy","upper_bound":"OTg2MjIxOTE4","repeats":1},{"count":1496,"lower_bound":"OTk1Mzk5OTY0","upper_bound":"MTAwNzgwODE2Nw==","repeats":1},{"count":1504,"lower_bound":"MTAxMjE3NjEzMA==","upper_bound":"MTAxOTY3MjgyNQ==","repeats":1},{"count":1512,"lower_bound":"MTAyMTM2MzI4MA==","upper_bound":"MTAzMzI0OTc4OA==","repeats":1},{"count":1520,"lower_bound":"MTAzMzUxOTY4Ng==","upper_bound":"MTAzNDI3ODQ5Mw==","repeats":1},{"count":1528,"lower_bound":"MTAzNTcyOTY5OQ==","upper_bound":"MTA1Njk2MDc5Nw==","repeats":1},{"count":1536,"lower_bound":"MTA2MjY5MDQwNA==","upper_bound":"MTA3MjMxODI2Mg==","repeats":1},{"count":1544,"lower_bound":"MTA3ODUzMTM1NQ==","upper_bound":"MTA4OTExNzI5MQ==","repeats":1},{"count":1552,"lower_bound":"MTA5MTE3NTQwMw==","upper_bound":"MTEwMDg3OTQ0Mw==","repeats":1},{"count":1560,"lower_bound":"MTEwNzc3MDYxOA==","upper_bound":"MTEyMTQxMDU2OA==","repeats":1},{"count":1568,"lower_bound":"MTEyNTQyOTIxMw==","upper_bound":"MTEzNDgzOTM5OQ==","repeats":1},{"count":1576,"lower_bound":"MTEzNjI2MjU1NA==","upper_bound":"MTE0OTgxNjUyOA==","repeats":1},{"count":1584,"lower_bound":"MTE1MDUxNDcxNg==","upper_bound":"MTE3MjMyNjA4OQ==","repeats":1},{"count":1592,"lower_bound":"MTE3NTYzNTI3Mw==","upper_bound":"MTE5MDU0OTU4MA==","repeats":1},{"count":1600,"lower_bound":"MTE5NDc4ODA0OQ==","upper_bound":"MTE5OTMyMDI3Mw==","repeats":1},{"count":1608,"lower_bound":"MTIwMDI1OTgwNg==","upper_bound":"MTIxMDczNDU1Ng==","repeats":1},{"count":1616,"lower_bound":"MTIxNDc3ODI4Ng==","upper_bound":"MTIyODc0MjY3OQ==","repeats":1},{"count":1624,"lower_bound":"MTIzMjk1NDU5OA==","upper_bound":"MTI0MjIxOTMxNg==","repeats":1},{"count":1632,"lower_bound":"MTI1NTU5MDU1OQ==","upper_bound":"MTI4MDUzOTAzOQ==","repeats":1},{"count":1640,"lower_bound":"MTI4NDkwMDMwNg==","upper_bound":"MTI5ODAxOTMzMQ==","repeats":1},{"count":1648,"lower_bound":"MTMwNDM5MTI4Mw==","upper_bound":"MTMyNzc3NzM2Mg==","repeats":1},{"count":1656,"lower_bound":"MTMyNzg4MTgxNw==","upper_bound":"MTMzOTk5ODM1Ng==","repeats":1},{"count":1664,"lower_bound":"MTM0NjcxMzQwNw==","upper_bound":"MTM3MDQ5Nzc1OQ==","repeats":1},{"count":1672,"lower_bound":"MTM3NTM2MzA5Mg==","upper_bound":"MTM4NDkwNjk3MQ==","repeats":1},{"count":1680,"lower_bound":"MTM4NjYyNzgxMg==","upper_bound":"MTM5MzMzNDM4MA==","repeats":1},{"count":1688,"lower_bound":"MTM5OTYwMzI4Mw==","upper_bound":"MTQwMzY2MjAwNg==","repeats":1},{"count":1696,"lower_bound":"MTQwNzk0NjA0Mg==","upper_bound":"MTQzNzU1MDIyMg==","repeats":1},{"count":1704,"lower_bound":"MTQ0Njg3MTM0OQ==","upper_bound":"MTQ1NzIwNDgyMQ==","repeats":1},{"count":1712,"lower_bound":"MTQ2NzcyMzIyMw==","upper_bound":"MTQ3NzQ4OTQ5NA==","repeats":1},{"count":1720,"lower_bound":"MTQ4MDc0NzA1MQ==","upper_bound":"MTQ4NjU4ODEwNw==","repeats":1},{"count":1728,"lower_bound":"MTUwMzkzNjQyMA==","upper_bound":"MTUxOTQ4NzA5Mw==","repeats":1},{"count":1736,"lower_bound":"MTUyNDYxNDc3MQ==","upper_bound":"MTUzNDMwNTM3MQ==","repeats":1},{"count":1744,"lower_bound":"MTU0ODgzNzI1OQ==","upper_bound":"MTU1MzQyMjYwNQ==","repeats":1},{"count":1752,"lower_bound":"MTU1Nzg2NTAwNw==","upper_bound":"MTU2NzAwOTUwNw==","repeats":1},{"count":1760,"lower_bound":"MTU2ODA5ODIwNw==","upper_bound":"MTU3OTA3NjUxOQ==","repeats":1},{"count":1768,"lower_bound":"MTU4NTM4Njk3MA==","upper_bound":"MTU5NTg3MDYwNA==","repeats":1},{"count":1776,"lower_bound":"MTU5OTAwNDA1NQ==","upper_bound":"MTYxNzQzNjgwMg==","repeats":1},{"count":1784,"lower_bound":"MTYxNzU0NzQ2OA==","upper_bound":"MTYyNDc1NDExNg==","repeats":1},{"count":1792,"lower_bound":"MTYyNDgyMTExMA==","upper_bound":"MTYzMDMwNDAwNw==","repeats":1},{"count":1800,"lower_bound":"MTY0MTAwODIxNw==","upper_bound":"MTY1MDMwNzU3Mw==","repeats":1},{"count":1808,"lower_bound":"MTY1Njc1MDU2Mw==","upper_bound":"MTY3OTQ2OTg5MA==","repeats":1},{"count":1816,"lower_bound":"MTY4MzA3NjI3MA==","upper_bound":"MTcwMTQ0NDEzNQ==","repeats":1},{"count":1824,"lower_bound":"MTcxMzgxOTIzNA==","upper_bound":"MTczNTY3NDk1MA==","repeats":1},{"count":1832,"lower_bound":"MTczODQ1NTk5Mg==","upper_bound":"MTc2MTM4Njc3Nw==","repeats":1},{"count":1840,"lower_bound":"MTc3NDUzMTM1Mw==","upper_bound":"MTc3OTUyNzgyNg==","repeats":1},{"count":1848,"lower_bound":"MTc4MTMxODQyNA==","upper_bound":"MTc5MzAzNTYyOA==","repeats":1},{"count":1856,"lower_bound":"MTc5MzY4MDM1OA==","upper_bound":"MTgwMjE5OTIyNw==","repeats":1},{"count":1864,"lower_bound":"MTgwODU3MjEyNA==","upper_bound":"MTgzMTQxOTk5MA==","repeats":1},{"count":1872,"lower_bound":"MTgzNjE4NTM5Mw==","upper_bound":"MTg0NTAyMTEwNA==","repeats":1},{"count":1880,"lower_bound":"MTg0ODA3NDA5Ng==","upper_bound":"MTg1ODU2MTk1MQ==","repeats":1},{"count":1888,"lower_bound":"MTg1OTc2OTc0NA==","upper_bound":"MTg4MzczMjMxNg==","repeats":1},{"count":1896,"lower_bound":"MTg4NDMzNjI0Mg==","upper_bound":"MTg5NDgwNDE0Mg==","repeats":1},{"count":1904,"lower_bound":"MTg5NjcwMTIwMg==","upper_bound":"MTkwNTAyMzA0Mw==","repeats":1},{"count":1912,"lower_bound":"MTkwODQyOTkyOA==","upper_bound":"MTkzMDk4MTY1Mg==","repeats":1},{"count":1920,"lower_bound":"MTkzMzg2Njk3NQ==","upper_bound":"MTk0NzU0NDMwMA==","repeats":1},{"count":1928,"lower_bound":"MTk0NzcxNDk2MQ==","upper_bound":"MTk2MTU4ODYxMA==","repeats":1},{"count":1936,"lower_bound":"MTk2MjcwMzQwMQ==","upper_bound":"MTk5MDQ5NTc4OA==","repeats":1},{"count":1944,"lower_bound":"MTk5MTEzMDM2NQ==","upper_bound":"MjAwNDAyNjc2OA==","repeats":1},{"count":1952,"lower_bound":"MjAwNzc3MDQzOA==","upper_bound":"MjAyODMwMjUyNw==","repeats":1},{"count":1960,"lower_bound":"MjA0Mzc0MDEwMQ==","upper_bound":"MjA0OTY1MjY3Nw==","repeats":1},{"count":1968,"lower_bound":"MjA1OTAxMzQ2Mg==","upper_bound":"MjA4MzA4NDQ5Mw==","repeats":1},{"count":1976,"lower_bound":"MjA4NzEwNTA5MA==","upper_bound":"MjA5MDE4MjU2Mw==","repeats":1},{"count":1984,"lower_bound":"MjA5MDU4NTk2Nw==","upper_bound":"MjEwODc3MjY1NA==","repeats":1},{"count":1992,"lower_bound":"MjExOTAzMjc1NA==","upper_bound":"MjEyODE5MTc0Ng==","repeats":1},{"count":2000,"lower_bound":"MjEzODkzMTQxMA==","upper_bound":"MjE0NjY1NDY2NQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,1,1,0,0,3,1,1,2,5,0,2,1,1,0,0,1,3,1,0,1,1,1,0,1,0,0,2,0,2,2,1,1,2,3,0,1,0,1,2,1,2,1,0,1,0,2,1,0,1,1,0,0,2,2,1,1,0,1,0,2,1,1,1,1,0,1,2,2,0,0,1,1,1,1,0,0,0,0,2,1,1,4,1,0,1,1,0,1,1,2,2,1,2,0,2,1,1,2,1,1,0,2,0,0,1,2,0,2,1,2,0,0,1,0,2,1,0,0,2,0,1,2,0,1,1,1,0,0,0,0,3,3,1,0,1,3,1,1,1,2,3,1,2,0,1,1,1,2,0,1,2,0,0,1,0,1,2,1,2,1,1,0,2,3,0,0,0,1,1,0,3,2,0,1,1,2,1,1,1,3,0,0,1,0,3,1,0,1,0,2,0,0,1,0,2,1,1,0,0,2,0,4,1,1,0,1,2,0,1,1,1,2,0,0,0,0,2,0,1,0,1,1,1,1,1,2,2,3,3,0,0,1,0,0,0,1,2,0,1,0,1,0,1,0,1,2,0,0,0,1,0,0,2,0,0,0,0,1,0,0,1,3,0,0,0,1,1,4,0,3,0,1,0,0,2,2,0,2,1,1,4,2,0,0,1,0,2,2,3,3,1,0,2,1,0,2,0,2,1,3,1,2,1,0,1,2,1,0,1,2,1,2,1,0,3,0,0,1,1,1,4,1,0,1,2,2,2,0,2,1,1,1,2,1,0,0,1,1,2,1,1,0,0,1,2,1,0,0,0,3,1,0,1,1,1,0,1,1,0,0,1,1,2,0,2,1,1,0,0,2,1,2,3,1,2,2,0,2,1,1,1,2,1,0,0,1,1,0,1,0,2,2,0,1,0,1,3,1,2,1,0,1,2,2,2,1,2,0,0,2,1,2,0,0,1,0,1,2,1,0,2,2,1,1,0,1,2,1,0,0,1,0,0,1,0,0,0,1,2,1,2,0,2,1,0,1,1,2,1,2,0,1,0,0,1,0,0,1,0,1,1,2,2,1,1,1,0,2,3,2,1,0,0,0,0,1,1,2,2,0,0,2,0,0,0,1,2,0,2,1,0,3,0,2,0,2,1,1,3,0,0,3,0,1,1,0,1,0,2,3,0,0,1,1,0,0,3,1,1,0,1,1,2,1,0,0,1,0,1,2,1,1,3,0,1,2,0,1,0,1,1,1,0,1,1,0,0,0,1,0,0,1,2,0,0,1,0,0,3,4,1,1,1,2,0,3,3,0,1,3,3,2,1,1,0,1,0,0,1,0,1,0,0,1,3,0,0,0,1,3,0,0,1,0,1,2,3,0,0,1,1,1,1,1,0,0,0,1,0,0,1,2,0,2,3,1,1,3,1,1,0,0,1,1,0,0,1,2,2,1,0,1,2,1,2,1,2,0,1,1,1,2,0,0,0,0,1,0,2,0,1,1,0,3,1,1,1,1,1,3,1,1,2,1,2,0,1,0,2,0,1,1,0,1,1,1,1,0,0,0,2,0,2,2,0,1,2,2,1,1,0,2,2,1,0,0,2,1,1,1,1,3,0,0,1,0,2,1,0,1,0,1,0,0,2,0,2,0,1,1,1,0,1,1,0,1,1,0,2,1,0,1,0,0,0,1,2,2,2,1,2,1,2,0,1,0,2,0,1,2,2,1,1,1,1,0,0,2,1,1,1,3,0,0,0,0,0,1,2,2,0,0,1,0,1,0,1,0,1,0,0,0,1,1,0,0,2,1,0,0,1,1,1,2,0,0,2,2,1,0,2,0,2,3,2,1,0,3,2,2,0,3,2,0,2,0,1,1,0,2,2,1,0,1,2,2,0,1,0,0,2,1,2,0,1,0,1,2,0,1,1,0,1,2,1,1,1,0,2,1,1,0,0,2,0,1,0,1,0,0,0,0,4,0,1,1,1,0,1,0,2,0,1,1,2,1,2,1,0,1,0,0,2,1,1,0,1,2,1,1,0,3,1,0,1,0,1,1,0,0,0,1,3,0,0,3,0,2,0,0,2,0,2,2,0,2,1,0,1,1,0,1,1,1,1,0,1,1,1,0,1,0,0,2,1,1,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,3,0,0,1,0,0,0,1,1,0,0,1,1,3,2,1,0,1,1,0,1,1,2,1,1,1,3,0,2,0,2,1,1,1,2,1,1,0,0,2,0,0,0,1,1,2,2,0,2,1,0,0,0,3,0,1,0,2,0,1,0,2,0,2,0,2,0,0,2,1,1,0,2,2,0,1,1,0,2,0,1,3,3,1,0,1,1,0,2,2,0,0,3,1,0,0,0,1,0,0,3,0,0,0,0,0,3,2,1,2,1,1,1,0,3,1,0,1,0,2,0,1,0,1,0,1,1,0,1,0,0,0,0,0,3,0,1,0,1,0,1,1,1,1,0,1,2,2,4,1,3,0,1,2,1,1,0,0,1,2,1,0,2,0,0,3,1,0,1,0,1,0,3,1,1,1,1,1,3,0,2,0,0,2,4,3,0,1,1,1,1,4,2,0,3,0,1,0,1,0,1,2,1,0,3,1,1,1,0,2,1,1,0,0,1,0,1,0,1,0,1,1,1,0,1,0,0,4,1,0,0,2,1,1,1,1,2,1,0,0,1,0,0,1,2,1,0,0,2,1,0,2,1,0,3,0,1,2,1,1,0,1,1,1,3,0,1,1,2,1,2,0,1,0,0,2,3,4,2,2,0,2,0,0,0,1,1,3,0,1,3,0,0,0,0,0,2,4,2,0,0,3,1,0,0,0,0,1,5,0,0,0,2,1,0,0,1,0,0,0,0,1,0,0,2,2,1,1,0,0,1,2,1,0,1,1,2,0,1,1,0,2,0,0,0,0,0,1,1,0,1,1,2,1,0,1,0,0,0,4,0,1,1,1,1,3,1,0,1,2,1,0,2,3,3,2,2,1,0,1,2,1,1,4,0,2,0,2,0,2,0,2,2,2,0,1,2,1,0,1,1,0,0,0,0,3,1,3,2,1,1,2,0,1,1,1,0,2,0,1,0,0,2,0,1,1,1,1,0,0,1,1,0,1,1,2,2,0,1,1,2,1,2,0,1,0,0,0,1,0,1,0,0,0,0,1,0,1,0,1,2,0,0,2,0,1,1,2,3,0,2,0,0,0,1,2,1,0,1,1,0,2,2,2,0,0,1,2,0,2,1,0,3,2,0,3,0,2,2,1,1,0,0,3,0,1,3,1,1,0,0,1,0,0,2,2,0,0,2,1,0,1,0,0,2,0,0,0,4,1,1,4,0,3,0,0,2,1,4,1,3,0,0,0,3,2,2,1,1,1,1,1,3,1,0,2,0,1,2,0,1,1,0,0,1,0,2,2,2,1,3,0,1,1,1,0,1,0,1,1,0,1,0,1,1,0,1,2,1,0,0,0,1,0,1,0,0,1,0,1,1,0,0,1,0,1,1,3,4,3,2,1,4,2,0,2,1,1,2,1,1,0,2,1,0,1,6,0,1,0,1,1,2,0,2,1,2,2,1,0,1,1,1,0,1,1,2,3,2,1,0,2,0,2,1,1,1,3,0,1,1,1,1,0,1,1,0,2,0,1,1,3,0,3,0,1,3,3,1,3,0,0,1,2,1,1,3,2,1,0,0,2,1,1,0,0,2,0,0,0,0,2,1,2,1,0,0,1,1,3,1,0,2,2,0,0,2,3,2,0,3,1,0,1,1,0,0,3,2,0,1,1,2,2,1,1,1,0,1,0,0,3,1,0,1,1,2,0,1,1,0,0,0,1,0,1,1,0,1,1,0,0,3,3,4,2,4,1,1,0,3,0,3,2,0,2,2,2,1,0,1,0,2,0,1,2,0,2,0,0,3,2,1,0,0,0,1,4,3,0,1,0,2,0,2,0,1,2,1,0,3,0,1,1,1,1,0,0,2,0,1,1,3,0,2,2,0,1,1,3,0,0,1,0,0,0,1,2,2,0,0,0,2,0,1,2,0,3,0,0,2,1,2,3,0,1,0,0,1,2,0,2,0,2,2,0,1,1,2,0,1,1,0,0,0,0,1,1,0,2,0,1,1,1,1,0,1,4,1,2,1,0,0,1,2,1,1,0,1,1,1,0,1,0,0,0,0,0,0,2,0,0,1,0,0,1,1,1,1,1,1,2,0,0,4,2,3,0,0,0,2,1,0,1,1,0,0,0,3,0,2,0,0,1,2,1,1,0,1,1,1,0,0,1,2,0,2,0,0,0,1,0,2,2,2,2,1,1,0,0,0,2,1,1,1,1,1,1,0,3,2,0,1,0,1,2,2,3,1,1,0,1,2,1,1,1,3,0,2,0,4,1,4,2,0,2,1,1,0,0,1,0,1,0,1,0,3,1,0,1,0,0,0,0,0,1,1,0,1,1,2,3,2,2,3,1,0,4,1,0,2,0,3,0,0,2,1,0,1,0,0,1,2,1,0,0,1,1,0,1,2,1,0,2,2,0,0,0,3,0,2,0,1,1,1,1,1,0,1,1,2,2,0,2,1,0,1,0,0,0,1,2,1,2]},{"counters":[1,0,0,0,0,1,2,2,0,2,2,1,2,4,1,1,2,1,1,0,1,1,4,1,0,0,1,1,0,0,0,1,0,0,2,0,2,0,3,0,0,1,0,1,1,1,0,0,0,4,1,1,0,0,2,2,1,0,1,2,2,2,0,1,1,2,0,0,2,0,1,2,0,2,1,1,1,1,0,1,1,0,1,3,0,1,1,1,4,2,2,2,3,1,1,1,0,0,2,2,1,2,0,1,1,2,0,1,0,0,2,1,1,0,0,3,0,2,0,1,2,0,1,0,1,1,1,1,0,1,1,0,2,1,0,4,2,1,1,0,1,1,1,3,1,0,2,1,1,0,1,0,1,1,1,1,0,0,0,0,1,0,0,3,1,2,2,2,0,1,3,0,0,1,1,3,0,0,3,0,0,1,0,2,2,0,0,0,2,2,0,1,3,0,1,2,1,1,0,0,1,0,0,2,2,1,1,0,1,2,0,1,1,1,2,0,1,1,1,1,2,0,1,0,1,0,0,1,1,2,2,2,1,2,1,0,1,0,2,1,0,2,1,0,0,1,0,1,1,3,0,1,2,1,0,0,0,2,1,3,2,0,2,0,3,2,0,1,3,1,3,1,1,2,0,0,0,1,1,0,0,0,2,3,0,1,2,0,1,0,3,0,0,0,1,0,0,0,0,2,1,1,0,1,0,4,2,0,0,2,2,0,2,1,0,0,0,1,0,0,2,0,1,1,0,0,1,1,0,2,1,1,3,3,2,2,0,2,1,0,0,0,0,1,1,2,0,2,1,1,2,1,2,2,0,3,1,2,1,0,1,3,2,1,1,1,0,0,0,2,2,0,1,0,1,0,0,2,0,1,1,0,3,5,0,0,2,2,2,0,0,0,0,1,0,0,1,0,1,3,2,0,0,0,0,1,0,0,0,1,2,1,1,1,1,1,0,5,2,2,1,0,1,1,0,0,0,0,1,0,1,0,2,0,0,0,0,1,0,2,1,2,2,0,0,0,1,2,0,1,2,2,1,1,1,1,0,0,1,0,0,1,1,2,1,0,0,1,1,0,3,2,1,0,1,0,0,1,0,0,1,1,2,1,1,1,1,0,2,0,1,0,1,0,1,2,0,0,1,0,0,1,0,1,0,0,2,2,1,2,0,1,1,0,1,2,2,1,0,2,1,0,2,1,2,0,2,4,0,0,0,0,0,1,1,0,1,2,3,0,1,0,1,0,1,2,0,2,2,0,0,0,2,0,0,0,1,0,0,1,5,0,1,2,0,0,0,1,0,1,0,1,0,0,1,0,2,1,0,0,1,2,2,1,0,1,0,2,1,0,1,1,0,1,2,2,1,1,0,0,0,1,0,0,2,0,1,3,0,1,0,2,1,1,1,0,1,1,0,1,4,0,1,1,2,1,2,0,0,3,2,2,0,0,0,0,1,1,2,1,5,0,1,0,0,0,0,0,1,2,3,0,1,2,4,1,2,1,1,1,0,3,1,2,1,1,0,1,1,0,1,0,0,1,0,2,2,1,1,0,1,0,1,0,0,0,1,2,0,3,0,0,2,1,2,0,2,1,3,1,1,0,0,0,3,1,2,1,1,0,1,1,2,1,2,0,1,2,2,0,4,2,0,0,3,0,1,2,0,0,2,0,3,0,1,1,0,1,0,0,2,1,0,0,1,0,0,0,1,0,1,1,3,0,0,0,2,1,3,3,2,1,0,1,0,0,1,2,1,1,1,1,0,2,1,1,0,0,3,2,0,2,0,1,3,0,2,2,1,1,2,1,1,1,2,2,3,1,1,2,0,0,1,1,0,3,1,0,0,3,0,1,1,2,0,2,0,1,0,1,3,0,1,1,1,1,0,1,4,1,2,0,1,2,0,2,2,0,1,3,3,2,1,0,1,1,0,1,1,2,2,0,1,1,1,0,1,2,2,1,0,0,1,0,1,2,1,1,0,1,2,2,0,0,0,1,0,0,0,2,1,4,1,1,3,1,0,3,1,1,1,0,2,0,1,2,0,0,1,1,2,0,1,1,1,0,0,0,1,1,0,2,2,1,1,2,1,3,1,2,2,2,5,0,0,2,0,0,2,0,1,1,1,0,1,0,0,0,2,1,0,2,0,0,1,1,1,0,1,0,0,1,1,1,2,0,0,2,1,3,0,0,0,1,1,2,2,1,0,1,0,2,0,0,0,0,1,1,1,0,0,1,2,2,0,2,0,0,1,1,1,2,1,3,1,1,1,0,2,1,1,2,1,1,1,1,2,1,2,0,1,3,2,0,2,3,2,0,1,3,1,1,3,0,1,1,3,0,0,0,2,2,1,2,0,0,0,1,0,0,5,2,0,1,0,2,1,2,0,1,1,1,0,2,0,1,0,1,2,1,1,1,0,2,2,1,3,1,0,3,0,3,1,0,1,2,0,0,0,1,3,2,0,1,1,2,1,1,2,1,2,1,0,4,1,0,2,2,2,2,1,1,1,0,1,0,1,0,2,1,0,2,1,0,0,0,0,2,2,2,2,2,1,1,1,0,2,1,0,3,0,3,1,1,0,0,1,1,0,2,0,0,1,0,1,1,0,2,2,1,2,3,1,0,0,2,1,1,0,3,0,1,0,0,1,2,0,2,0,0,1,2,0,1,1,1,0,1,2,0,0,1,0,1,0,1,0,0,4,3,1,0,0,0,1,0,2,1,3,0,0,1,1,1,1,2,0,0,0,0,1,0,1,0,0,2,3,0,3,1,1,0,3,0,1,1,0,0,1,0,0,1,2,1,1,2,0,0,0,0,1,0,1,3,1,2,1,1,2,0,1,1,1,0,0,3,1,2,0,0,0,1,1,2,0,1,2,3,0,0,0,1,0,0,1,1,3,0,3,2,3,0,0,1,0,2,1,2,0,2,1,0,0,0,1,0,2,4,1,0,1,1,1,2,2,2,2,1,0,0,0,2,0,1,0,0,2,1,1,0,2,0,0,0,0,0,0,0,2,0,1,0,1,0,1,2,0,1,2,0,1,0,3,1,3,1,0,2,0,1,0,0,2,0,1,0,0,1,1,1,2,0,1,3,0,1,0,2,0,1,0,0,1,2,2,0,1,1,0,1,3,1,2,3,4,2,0,2,4,3,1,1,3,3,1,0,3,1,1,0,1,0,0,2,0,0,0,0,4,0,2,1,1,3,2,1,2,1,1,1,1,0,1,1,0,0,2,0,2,3,3,2,2,1,1,0,2,0,1,0,0,1,1,0,1,1,0,0,2,2,4,2,0,0,2,1,0,2,1,2,0,1,0,0,1,2,1,1,0,1,3,1,1,1,3,1,1,0,2,1,1,0,3,2,0,0,1,0,1,1,1,0,2,1,0,0,2,0,2,0,1,0,0,0,2,1,1,0,4,1,1,0,2,3,1,1,1,0,2,1,2,1,2,1,3,0,3,0,1,1,1,0,0,0,1,0,0,0,0,0,0,0,3,0,1,0,0,0,0,3,0,1,1,0,1,0,0,0,0,1,0,0,3,0,1,3,1,1,0,1,0,0,1,1,1,0,0,0,0,3,1,0,0,0,0,2,1,0,1,2,1,0,1,1,0,1,1,0,0,0,2,2,3,2,1,0,1,0,1,0,1,1,1,1,2,2,0,1,3,1,0,1,2,1,0,1,0,0,0,2,2,0,3,1,0,0,1,2,1,2,0,0,0,0,1,0,1,1,4,2,2,2,1,1,2,1,2,1,0,0,1,0,1,2,0,0,0,3,0,0,1,0,0,1,3,1,1,1,1,2,1,1,1,1,1,0,0,4,1,0,1,0,1,1,0,1,4,3,0,0,0,1,2,2,1,1,1,1,1,2,1,1,1,2,0,2,1,1,4,1,3,2,2,2,0,1,2,0,2,1,2,0,1,0,1,1,1,3,0,1,0,1,0,1,0,1,0,1,0,0,0,2,1,1,2,2,2,0,2,0,0,1,2,0,3,0,2,1,0,1,0,1,3,0,1,2,0,0,0,1,1,1,1,1,0,0,2,0,2,1,1,0,2,1,2,1,2,0,0,0,1,0,1,0,0,0,0,0,1,2,0,1,1,1,1,0,1,2,0,2,2,1,1,4,1,1,2,0,2,2,3,0,1,1,1,1,1,2,0,0,1,1,1,1,1,0,1,2,2,0,3,2,3,1,0,1,2,2,1,0,1,0,0,0,0,0,0,2,1,3,0,0,2,1,1,0,2,2,1,1,0,0,0,2,0,0,0,3,0,1,1,0,3,2,0,0,0,3,1,3,1,1,2,2,0,1,0,0,1,1,0,2,0,1,3,1,0,1,0,0,0,0,1,0,2,2,0,1,1,1,1,1,1,3,0,1,1,1,0,2,1,0,0,0,0,1,1,3,0,0,1,0,1,2,1,2,2,0,0,2,1,4,2,0,0,0,2,0,0,0,1,0,1,2,1,1,0,1,1,1,1,0,1,2,0,2,0,0,0,0,2,0,0,1,0,1,0,1,0,1,1,1,2,2,0,2,2,1,1,1,2,0,1,2,1,0,2,1,1,2,0,0,1,0,0,0,2,0,0,0,0,3,1,1,1,0,0,1,2,0,0,0,3,1,0,1,1,1]},{"counters":[2,1,1,2,2,0,0,0,0,1,1,2,0,1,1,3,1,0,1,1,0,0,0,5,0,2,0,4,1,2,0,0,1,1,2,0,1,0,0,2,3,3,1,2,0,0,3,0,1,0,2,1,0,3,0,2,2,2,0,1,3,1,1,1,1,0,2,0,0,0,1,1,5,1,1,2,1,1,0,2,1,0,2,1,0,0,1,2,0,0,1,1,0,1,1,1,1,2,1,0,1,2,1,0,0,0,0,1,1,2,1,2,1,1,2,3,1,0,1,2,0,1,3,1,1,0,0,1,1,0,1,2,3,1,0,1,1,1,1,1,3,0,1,2,0,2,0,0,0,1,0,0,0,1,4,1,4,3,1,0,1,0,2,1,1,0,0,1,0,1,1,0,0,0,6,1,2,3,0,1,0,1,3,1,1,1,1,2,0,1,0,1,0,1,1,1,2,1,1,0,1,0,0,1,0,2,0,0,1,2,3,1,1,2,0,0,0,0,0,0,1,2,0,0,0,3,0,1,2,0,1,1,2,0,1,0,0,2,1,2,2,0,2,1,2,1,1,1,0,0,1,3,0,1,0,0,0,1,0,0,1,1,1,0,2,1,1,2,0,0,0,1,2,3,0,2,1,0,1,0,1,0,1,0,0,0,1,1,0,0,1,3,0,0,2,1,2,1,0,1,0,1,0,0,0,1,1,3,3,1,0,2,0,0,1,0,2,0,3,6,0,0,0,0,0,2,1,0,1,1,0,3,2,1,0,2,1,2,1,4,1,1,1,1,3,2,3,0,1,1,2,0,1,0,1,0,1,2,1,0,1,1,1,1,1,3,4,0,2,0,1,0,1,0,1,0,0,3,1,2,1,1,1,1,0,0,0,1,1,1,0,2,0,0,1,2,2,1,0,1,2,1,1,1,1,1,0,1,0,0,0,0,0,1,2,0,0,0,4,1,0,0,3,0,3,1,2,0,1,2,3,0,1,0,0,2,0,0,0,0,0,1,2,1,0,2,2,3,1,0,2,2,3,2,3,3,3,3,0,1,0,0,0,1,1,0,0,1,1,2,1,2,3,1,0,0,1,2,3,1,1,1,1,1,1,1,1,2,1,0,0,1,0,2,3,0,0,0,1,4,2,0,1,1,2,2,1,1,0,0,2,0,1,1,1,0,2,0,0,2,0,1,2,0,1,2,1,4,1,2,0,3,0,0,0,0,2,1,1,2,0,2,1,0,0,1,1,1,0,0,1,0,5,1,0,2,0,3,2,0,2,1,1,1,1,0,1,1,0,0,2,1,3,0,3,0,0,1,2,0,0,0,0,2,0,2,0,1,1,3,0,2,0,0,2,2,3,0,1,0,1,0,1,2,0,1,0,2,0,0,0,3,2,1,2,0,0,1,1,1,1,2,0,0,1,3,3,1,1,2,1,0,0,1,1,0,0,3,0,3,1,0,1,3,2,1,1,0,1,1,0,1,0,1,2,1,1,1,0,0,0,0,1,0,2,2,0,1,1,0,0,1,2,1,0,1,2,0,0,1,1,0,1,1,1,1,2,1,3,0,1,1,2,2,2,0,1,0,0,1,0,0,0,0,0,2,0,1,1,1,0,2,0,0,0,0,1,1,2,0,1,1,1,0,0,2,0,1,2,0,1,1,6,0,1,1,0,0,2,0,0,0,0,2,1,0,0,0,0,0,1,0,0,0,1,1,0,0,2,2,1,2,1,2,0,3,0,0,0,2,0,2,1,0,2,0,1,0,0,1,0,1,2,0,2,3,0,0,1,1,1,0,0,0,0,0,0,0,1,1,1,2,0,1,2,1,1,1,2,2,1,2,1,1,3,1,1,3,1,2,0,0,2,2,1,0,0,1,0,2,0,2,0,0,2,1,1,1,1,1,0,0,2,1,3,3,1,1,1,2,0,0,2,1,1,1,1,0,0,0,0,0,1,0,1,2,2,0,2,1,2,1,2,0,0,2,1,1,2,0,1,0,0,2,2,2,2,2,2,3,2,1,2,0,0,0,0,2,2,1,3,1,1,1,1,1,0,0,2,0,2,2,0,2,0,0,0,1,2,0,1,0,1,1,1,0,0,0,1,5,1,0,1,1,3,3,3,1,0,1,0,1,0,1,0,0,0,0,1,0,2,2,1,1,4,0,1,0,0,2,0,1,1,2,0,0,0,0,0,0,1,0,0,2,1,0,0,2,3,0,3,0,2,1,1,1,0,1,1,0,0,2,3,0,1,1,1,0,0,0,1,0,2,3,2,2,0,1,0,2,3,1,0,3,2,0,1,0,0,0,2,0,3,0,0,0,2,1,2,1,2,0,1,4,1,0,1,0,3,0,0,1,2,2,0,0,2,0,0,1,4,1,0,1,2,1,0,1,0,1,1,0,3,0,0,0,0,1,1,0,0,0,0,4,0,1,1,0,2,0,3,2,0,1,1,0,0,4,1,1,1,1,1,1,1,1,0,1,1,2,1,0,0,1,3,1,1,0,2,0,0,3,1,1,0,0,0,2,0,2,1,1,1,1,3,0,0,2,2,1,2,3,1,1,3,1,1,2,2,2,3,1,3,0,0,0,4,1,1,1,1,1,2,3,2,1,0,1,1,1,0,0,1,0,0,2,1,0,2,0,1,1,2,2,1,0,1,3,0,3,0,0,2,1,2,1,1,0,1,0,1,1,2,2,0,3,2,0,1,0,3,2,0,0,0,1,1,0,2,0,2,0,1,0,1,1,0,2,0,3,0,1,0,0,0,0,2,0,0,1,4,2,1,0,1,0,3,1,2,1,0,1,1,1,1,0,1,4,1,1,0,2,0,3,1,0,1,1,0,0,1,1,1,2,2,0,0,1,0,0,0,3,1,0,1,1,1,1,1,2,3,0,0,2,1,0,1,1,1,0,1,3,0,2,1,1,0,3,2,0,1,3,0,0,2,0,0,1,0,1,0,1,1,0,0,0,4,0,0,2,0,0,1,0,2,1,1,3,0,1,1,0,1,0,1,0,2,0,3,3,1,0,1,0,2,1,0,0,2,1,0,2,0,0,0,3,2,1,1,1,1,1,3,2,1,0,2,0,2,2,0,2,1,2,1,1,0,0,1,1,1,1,1,0,0,1,3,1,2,1,3,2,0,1,1,1,2,2,0,1,0,1,0,1,1,2,0,1,1,1,1,1,0,1,2,3,1,2,2,2,1,1,2,0,2,2,0,0,0,1,2,0,0,1,0,2,1,2,1,1,2,0,1,1,0,1,2,1,0,0,0,2,2,0,1,0,1,3,1,0,0,0,2,0,0,0,1,0,1,1,1,4,1,0,0,1,0,1,0,0,0,1,1,0,1,1,0,0,0,0,2,1,2,3,1,1,1,0,2,0,0,1,0,0,2,0,1,2,2,0,2,1,2,4,2,0,2,0,2,0,0,0,3,2,1,0,1,1,1,2,0,3,0,0,0,0,2,1,0,1,1,2,1,0,1,3,1,1,0,0,2,0,1,1,1,0,1,1,1,2,1,1,2,1,0,0,1,1,1,1,1,2,1,0,0,0,0,3,1,0,0,1,0,1,1,0,0,1,1,0,3,0,1,1,0,2,0,1,2,1,2,0,1,2,0,1,1,0,0,0,1,0,1,0,0,1,3,2,1,1,1,3,2,2,0,1,0,1,2,0,1,0,1,0,1,2,0,2,1,3,1,0,4,2,0,0,2,1,0,0,0,0,2,1,1,0,0,0,0,1,0,1,2,0,2,1,0,1,1,0,2,1,2,1,0,1,1,1,1,1,2,0,1,1,1,0,1,2,1,1,0,1,0,1,2,0,1,1,3,1,1,2,0,0,3,0,0,1,0,2,2,0,3,0,3,3,2,0,2,3,1,3,2,0,2,1,1,1,0,0,3,0,1,3,3,0,1,1,2,0,1,1,0,2,0,2,1,4,2,2,0,2,1,0,0,1,0,2,1,0,1,0,0,0,0,4,1,0,2,1,2,1,1,0,1,0,2,2,1,1,2,1,1,2,0,0,1,2,0,0,2,0,0,0,0,2,0,1,0,0,1,1,3,1,0,0,1,0,2,0,0,1,0,1,1,0,1,0,1,0,1,0,0,1,0,0,0,2,0,0,0,0,2,1,1,1,2,1,0,1,2,0,0,0,1,2,3,0,2,1,0,0,3,1,0,2,0,2,1,2,2,1,2,2,1,2,1,0,0,0,2,2,0,0,0,0,2,2,2,1,1,1,1,1,1,0,1,0,0,2,2,1,0,2,0,0,0,1,1,2,1,0,0,1,0,1,0,1,1,0,2,0,1,1,1,2,1,1,0,1,1,0,0,2,1,0,3,1,2,0,1,0,2,1,1,0,1,0,0,2,0,0,0,2,0,1,1,0,0,2,2,1,1,2,1,1,0,1,0,2,0,0,2,0,0,0,0,2,1,1,2,2,2,0,0,1,1,1,0,2,0,0,2,1,2,1,1,1,1,1,0,2,1,0,2,0,0,2,0,1,1,1,2,0,1,0,0,1,1,1,2,2,3,2,0,0,3,1,1,1,3,0,2,0,0,1,0,0,2,0,0,0,1,1,0,2,2,1,0,0,1,1,0,1,1,1,1,1]},{"counters":[1,0,2,0,0,1,1,0,1,1,1,2,2,2,1,0,2,1,0,0,0,1,1,1,1,3,0,0,0,0,1,2,0,3,1,1,1,1,5,0,1,2,0,2,0,0,2,0,0,1,2,3,1,0,0,2,2,1,0,0,1,0,0,1,1,0,1,2,2,3,2,0,0,1,0,0,2,1,0,1,3,0,1,2,0,3,1,1,0,0,4,1,2,0,2,0,1,1,2,1,1,3,2,0,3,2,1,2,2,1,1,0,1,0,1,0,1,2,1,2,0,0,1,0,2,0,1,2,3,0,1,2,2,1,1,0,0,3,1,3,2,0,0,2,0,0,1,1,0,0,1,1,2,3,3,0,0,1,3,0,0,1,0,1,0,2,0,0,3,0,1,1,1,2,1,1,1,1,1,3,0,3,2,0,1,1,0,0,2,0,0,1,0,0,0,0,3,2,0,2,0,0,1,0,2,1,0,1,3,0,3,0,2,1,0,0,1,1,2,4,0,2,1,1,2,0,1,0,1,1,0,1,1,0,2,0,0,0,1,4,0,0,0,0,2,2,1,3,0,1,2,1,1,1,2,1,0,0,3,1,1,2,1,0,1,1,0,0,1,0,4,0,0,3,1,0,1,2,1,0,0,0,0,0,3,0,0,2,1,2,0,2,0,1,1,1,0,0,1,1,0,2,2,0,3,1,0,2,0,0,0,1,0,0,2,2,2,1,2,0,0,1,2,0,0,0,0,0,2,1,0,2,0,0,1,2,1,2,1,0,0,0,1,0,1,1,1,2,1,4,2,1,1,1,0,0,1,1,2,4,0,1,0,3,0,1,1,1,1,1,0,2,0,1,1,1,1,1,0,3,2,1,1,0,0,0,0,2,2,0,2,0,2,1,3,2,1,1,0,4,2,1,0,1,1,0,0,0,1,0,1,1,1,1,0,0,1,0,2,1,2,0,1,1,0,0,0,0,1,0,2,1,0,0,0,0,0,1,0,1,0,2,2,1,1,2,1,1,3,2,1,0,1,0,2,0,0,1,0,1,1,0,0,1,3,1,1,0,1,2,0,0,2,0,1,1,0,1,0,1,2,0,0,2,1,1,2,2,2,0,2,2,2,1,1,2,1,0,1,1,0,2,0,0,0,0,3,0,0,0,1,2,0,3,0,2,1,0,0,0,0,2,0,2,0,1,0,0,2,0,2,3,1,0,0,2,0,0,3,0,0,0,2,3,1,0,1,1,1,0,1,1,1,1,0,0,1,3,1,0,0,1,2,1,0,0,0,0,1,0,0,0,0,0,0,0,0,2,1,1,3,2,0,1,1,1,2,1,4,0,2,2,1,1,0,1,0,0,2,1,1,1,0,2,1,2,1,1,0,3,0,3,0,0,3,0,2,0,1,0,0,0,3,0,1,0,1,0,1,2,1,2,1,0,1,0,0,0,2,1,0,0,2,0,0,2,2,1,1,0,1,0,0,1,0,0,2,1,1,0,0,2,1,1,1,0,1,0,1,0,3,2,1,1,1,1,1,0,0,3,1,4,0,1,1,0,1,1,1,3,1,1,1,0,2,0,0,0,0,1,2,0,0,0,2,2,0,0,1,1,1,0,3,0,2,1,0,3,4,0,0,1,1,0,0,1,0,0,1,0,0,1,1,0,0,0,1,1,1,3,1,0,1,2,1,1,0,0,2,0,0,2,1,1,2,0,0,1,1,2,1,0,1,0,0,1,0,1,0,2,2,1,1,4,0,2,0,0,1,2,2,2,0,2,0,0,0,0,1,0,1,0,3,0,1,0,1,0,1,1,1,1,2,0,2,4,3,2,0,1,0,1,1,1,0,0,0,0,0,2,0,0,1,2,2,3,3,0,1,1,3,1,0,2,3,1,3,1,0,3,0,0,1,2,2,1,1,2,1,2,4,1,0,2,0,1,1,0,0,0,2,2,5,1,1,1,0,0,0,0,0,2,1,1,0,0,1,2,1,0,1,1,1,0,1,0,0,0,1,2,0,1,1,1,3,2,0,0,2,0,0,3,0,1,0,2,1,0,1,0,1,0,2,0,1,1,2,0,1,1,0,1,2,2,2,3,3,2,1,0,2,0,1,0,4,1,0,0,1,1,2,1,1,1,0,2,1,2,2,1,0,1,1,1,1,1,0,2,2,0,1,2,1,2,0,1,1,1,3,2,0,0,2,1,2,3,0,1,1,0,0,1,0,0,2,1,0,1,1,1,1,0,1,2,2,1,0,0,1,1,2,1,0,0,0,1,1,1,0,0,2,1,0,1,2,0,0,1,1,0,1,0,3,3,1,0,0,0,0,2,2,0,1,1,1,1,0,1,2,1,1,1,2,1,0,0,2,1,1,1,1,2,2,0,0,1,2,1,2,0,2,2,1,1,1,1,0,0,1,0,2,0,1,1,2,0,3,3,1,0,1,1,0,0,2,2,2,1,0,1,1,1,2,0,2,0,0,4,1,2,0,1,2,0,1,3,0,0,0,0,1,1,1,2,0,2,2,2,0,0,3,0,1,0,1,2,1,1,1,2,3,2,0,3,3,0,1,2,1,0,1,0,2,1,2,0,1,1,0,0,1,0,0,2,0,0,0,0,2,1,1,1,0,1,1,1,0,0,1,1,1,1,0,1,1,1,3,1,1,2,1,1,0,0,1,1,0,2,0,0,1,1,1,0,4,2,0,2,1,2,3,0,1,0,0,0,0,0,1,0,2,2,1,1,2,2,1,1,2,0,0,1,2,0,0,1,1,1,3,2,0,1,1,1,1,1,2,0,2,1,1,1,0,0,0,2,3,1,2,1,0,1,0,0,1,0,1,3,2,0,0,2,3,4,1,3,1,1,1,1,2,2,2,1,2,0,0,0,2,1,1,1,2,2,1,0,0,4,4,0,1,0,1,1,0,1,0,0,2,1,1,0,1,0,1,2,1,0,1,0,2,1,0,0,0,0,0,1,0,2,1,1,0,0,0,2,0,0,1,2,2,3,2,1,1,0,1,1,1,0,0,1,1,1,2,0,0,1,2,0,0,1,1,1,1,2,1,1,0,1,1,0,1,0,1,1,1,0,0,1,0,0,0,0,0,0,0,0,1,1,1,0,1,0,0,0,0,1,0,0,0,0,1,1,0,0,0,1,0,2,1,1,2,1,1,1,0,0,0,1,1,0,0,0,2,2,0,2,0,1,1,1,0,0,1,4,1,0,0,1,0,3,1,0,1,3,0,1,1,0,2,0,2,0,1,0,0,0,1,2,2,1,0,1,2,1,0,0,0,1,1,3,0,2,0,0,3,1,0,0,0,0,2,3,0,1,2,0,0,0,3,1,0,1,1,0,2,1,2,0,0,0,0,1,1,0,0,2,1,1,3,3,1,2,3,0,2,1,0,0,1,1,0,1,1,1,1,1,1,2,0,0,0,2,1,2,2,2,0,0,1,0,0,1,2,1,2,2,1,2,3,1,1,2,0,1,0,0,1,2,1,1,1,0,3,0,2,4,1,0,0,1,0,1,1,1,0,3,0,0,3,1,3,4,2,0,0,0,3,0,0,1,0,0,1,1,0,1,0,2,2,4,0,2,2,2,1,2,0,3,1,2,0,1,2,3,2,1,2,0,3,1,3,1,2,2,1,2,1,1,0,0,2,1,0,2,0,0,0,3,1,1,0,0,3,1,2,1,0,2,1,4,1,1,0,0,0,2,0,1,0,2,0,0,0,1,0,1,1,0,4,0,1,0,0,0,1,1,4,2,2,0,1,0,4,2,2,1,1,1,1,0,1,1,0,0,3,3,1,0,0,0,2,1,2,0,1,0,1,1,0,0,1,0,3,0,1,0,0,0,2,0,1,3,2,0,0,3,3,1,1,2,0,1,1,2,1,3,0,0,0,1,0,1,1,1,3,3,0,1,1,2,1,1,1,1,0,0,0,1,0,0,2,0,1,1,2,0,0,0,3,0,0,1,0,1,0,1,0,1,0,1,1,1,2,0,2,1,0,0,1,3,0,2,1,1,1,2,1,3,0,0,1,2,3,0,2,5,1,1,0,2,1,0,2,1,2,1,0,0,0,0,2,0,2,0,0,0,1,1,2,0,1,2,0,2,0,3,4,1,0,1,1,1,1,0,2,1,1,1,1,2,0,2,1,0,0,0,1,1,0,0,2,1,2,2,0,3,1,0,2,1,2,0,1,1,2,0,0,0,1,0,1,1,1,1,0,1,1,2,0,3,1,0,2,1,0,1,3,0,1,0,2,0,1,0,0,1,1,0,1,1,1,1,0,1,1,0,0,0,1,1,1,0,1,0,4,2,0,0,1,2,3,0,2,2,1,1,2,1,1,0,2,3,0,2,0,1,0,0,2,2,0,0,0,1,1,0,1,0,0,2,0,2,2,0,2,1,1,1,1,0,1,2,2,0,3,0,1,1,1,1,1,1,4,1,0,1,1,0,0,0,2,0,1,0,2,3,0,1,0,3,3,0,1,2,1,2,0,0,0,1,1,2,1,0,0,2,2,3,1,1,2,2,0,0,0,1,0,2,0,0,0,0,0,2,1,5,1,0,3,0,0,4,2,1,1,1,1,2,2,0,1,1,1,2,2,0]},{"counters":[0,1,2,1,3,0,0,0,1,1,1,0,2,2,1,1,2,1,0,2,1,0,0,0,4,0,0,0,1,0,0,2,2,0,1,1,1,2,1,1,1,3,0,0,2,1,0,3,2,2,1,0,1,3,0,1,2,1,2,0,1,0,0,3,1,0,0,1,0,2,2,0,1,0,0,0,0,0,0,0,0,1,2,3,2,0,1,1,1,1,1,0,0,0,4,1,2,1,1,3,1,1,1,3,0,3,2,0,1,0,1,2,0,0,2,1,0,0,1,0,0,0,3,0,2,1,1,0,0,1,1,1,1,2,1,0,2,2,2,0,0,1,3,1,1,2,1,2,1,0,0,2,0,1,1,3,1,1,2,2,5,1,3,1,1,0,1,1,1,0,2,1,1,1,0,1,0,0,1,1,0,1,2,2,2,1,1,2,0,1,1,2,0,1,0,1,0,2,2,1,1,2,2,0,1,0,0,3,2,0,2,0,0,1,2,1,2,2,2,0,2,1,0,0,0,3,2,1,1,0,0,2,3,1,0,0,2,0,4,0,0,0,0,0,1,1,1,1,1,0,0,0,0,2,2,3,2,0,4,2,0,2,1,1,2,1,1,0,0,1,0,3,0,0,1,0,0,0,1,1,0,1,0,1,1,0,0,2,0,3,1,1,2,1,2,1,1,1,2,3,0,0,2,0,0,2,1,1,0,4,1,1,1,0,0,0,1,1,0,0,0,2,2,2,1,2,0,1,1,2,1,0,0,1,0,0,1,0,2,0,0,0,2,1,2,1,0,0,0,0,1,0,2,2,0,2,1,0,0,0,0,1,1,0,3,0,2,1,3,2,1,1,1,1,1,0,1,0,1,3,0,0,1,0,1,0,0,1,1,1,1,2,1,3,0,0,0,0,0,1,2,1,1,0,1,0,1,0,1,0,1,1,0,0,2,0,1,2,2,1,1,0,0,1,2,0,2,0,2,0,0,2,0,1,0,0,0,0,0,2,1,0,2,1,1,1,4,0,0,1,1,1,3,1,3,0,0,0,1,1,2,4,3,1,0,0,0,0,2,1,1,2,0,1,2,0,0,3,0,0,1,1,0,1,2,0,0,0,1,2,1,1,0,3,0,0,0,2,0,1,1,1,2,0,2,0,0,1,1,0,1,1,1,0,0,0,0,0,1,1,2,0,1,0,2,0,1,0,1,0,0,2,0,0,2,2,0,3,1,1,1,2,1,0,1,1,0,2,3,0,1,1,0,0,0,0,0,3,1,1,0,1,1,2,0,2,2,0,1,0,1,1,0,3,2,0,0,1,0,1,1,3,0,0,3,3,0,1,3,1,1,0,3,0,0,0,1,1,1,2,1,1,1,0,0,0,0,1,2,1,1,0,1,2,3,0,0,0,1,1,1,1,4,2,1,0,2,1,2,2,0,2,0,1,0,1,1,0,3,0,0,0,0,0,1,0,1,0,2,1,1,3,0,1,2,1,1,0,1,3,0,1,0,2,1,2,2,0,0,1,2,0,1,2,1,1,1,0,2,1,0,0,0,0,1,3,1,1,1,1,0,1,0,1,1,1,0,0,1,1,0,1,0,2,0,0,1,2,2,1,1,2,2,2,1,0,1,0,0,2,0,2,1,2,1,1,2,1,0,1,2,1,0,4,3,2,1,0,2,1,0,1,0,0,1,2,0,1,1,0,1,1,2,0,0,1,3,2,0,1,0,1,2,1,0,0,0,1,0,1,0,0,0,0,1,0,0,2,0,2,3,0,0,0,0,1,0,0,0,0,1,1,0,0,2,0,1,2,0,1,1,3,0,0,2,0,1,1,0,1,3,2,0,1,1,1,1,1,0,1,0,3,1,2,0,0,2,1,1,0,0,1,1,1,0,2,1,2,1,0,1,1,0,0,1,2,0,1,1,1,1,1,1,0,1,1,2,1,0,1,2,2,0,1,1,2,2,1,0,1,1,3,1,0,0,0,2,0,1,1,1,0,1,1,0,1,1,1,2,1,1,0,1,1,1,0,1,0,1,0,0,0,1,0,2,0,2,1,1,2,1,1,0,1,0,1,0,2,0,3,0,0,2,2,1,0,1,2,1,1,1,1,0,1,0,1,0,2,1,2,1,1,3,2,0,1,5,2,1,0,0,2,1,0,1,1,0,0,3,3,1,2,1,0,0,0,2,2,1,1,2,1,0,2,0,0,2,1,1,0,2,1,1,1,0,1,0,1,0,1,3,1,0,3,2,0,0,0,0,0,3,0,0,1,2,1,3,1,0,0,1,1,0,0,2,2,0,1,1,1,1,1,1,2,0,0,1,2,2,2,3,0,4,0,1,0,0,1,0,1,2,1,0,1,1,2,0,0,2,0,0,0,0,0,2,2,0,0,1,0,1,1,1,1,0,2,1,0,2,2,0,2,1,0,3,2,2,1,0,1,0,2,2,0,0,0,3,2,2,2,0,2,0,1,0,0,1,1,1,1,1,2,1,0,0,1,1,0,1,2,0,2,2,1,0,0,1,0,0,3,3,1,2,1,1,0,0,2,0,1,2,1,0,0,1,1,1,0,1,1,2,0,1,1,0,1,1,1,2,1,2,2,0,1,0,0,1,2,0,1,3,1,2,2,1,1,2,1,1,0,0,2,0,0,0,1,0,1,4,3,0,0,2,0,1,0,2,1,0,2,1,2,1,0,0,3,1,0,3,1,0,1,0,1,0,0,0,1,1,0,0,2,0,2,0,0,0,3,1,0,1,0,1,0,0,0,0,1,1,2,0,3,0,1,0,2,0,0,1,0,1,0,1,0,2,4,1,1,0,1,0,0,2,0,0,0,1,1,1,0,2,2,1,0,0,2,0,2,0,4,0,2,1,1,3,3,1,1,0,0,0,1,0,0,2,2,4,0,0,1,0,0,0,4,1,0,1,0,3,1,1,0,4,1,0,1,2,1,0,1,2,0,2,1,1,0,4,2,3,0,1,1,0,1,0,0,1,0,2,1,3,0,0,0,2,2,1,0,2,3,0,1,2,0,1,1,3,1,2,0,1,0,0,1,0,1,2,0,3,2,2,1,1,1,2,0,1,0,0,1,1,3,1,1,0,1,1,2,0,0,1,1,1,0,1,0,0,1,2,4,3,1,1,3,0,2,1,1,3,1,2,0,2,0,0,0,2,0,1,1,1,0,1,0,2,0,1,2,2,1,1,0,1,1,1,0,2,1,1,2,1,0,2,1,0,0,0,1,0,1,1,2,1,0,1,2,0,0,2,3,2,2,0,2,3,1,1,1,3,3,1,2,1,2,1,1,1,1,4,3,0,2,0,0,1,0,4,0,1,0,1,3,1,0,0,3,3,2,1,1,3,2,1,0,2,2,0,0,0,1,0,1,0,1,1,1,0,1,2,0,0,0,1,2,0,0,1,0,1,2,0,0,0,0,4,1,0,2,1,2,2,0,0,1,2,1,2,0,1,1,1,1,2,0,2,1,0,1,1,1,4,5,0,2,1,1,1,1,1,0,3,2,0,1,3,0,0,0,1,2,1,2,1,1,2,1,2,0,1,1,2,0,2,0,2,2,2,1,2,3,0,2,1,3,0,0,1,0,2,1,1,0,0,1,1,0,0,1,0,1,3,1,2,0,0,0,2,0,4,1,0,1,3,3,0,1,0,0,0,1,1,2,2,2,1,2,0,0,1,1,1,0,2,0,0,1,0,1,1,1,1,2,1,0,1,0,0,0,1,0,0,1,1,0,0,2,2,2,1,3,1,1,1,3,1,1,1,0,0,1,0,1,1,2,1,0,2,3,2,2,2,1,3,0,1,2,1,1,0,0,2,0,3,1,0,0,0,2,0,0,0,0,2,1,1,2,0,0,0,0,1,0,1,0,2,2,0,1,1,2,0,1,0,0,0,2,1,2,4,0,0,2,2,0,0,1,0,0,2,0,1,3,1,1,2,1,1,2,1,0,1,0,0,1,3,1,2,1,1,0,0,0,1,1,0,1,3,0,1,1,0,0,1,0,1,1,0,1,0,0,1,2,0,1,0,0,1,2,0,0,0,1,1,0,0,0,2,0,2,1,2,1,2,1,1,0,1,4,0,0,1,0,0,1,0,1,2,2,0,1,1,2,1,1,1,0,2,2,2,1,0,0,0,0,2,0,2,1,1,3,2,1,2,1,3,0,3,1,2,3,0,2,0,4,1,2,0,1,2,0,0,3,0,0,1,1,0,0,0,3,0,0,3,1,1,1,0,1,1,3,1,1,1,0,1,0,0,0,0,1,1,3,0,0,1,2,2,0,3,1,2,1,1,1,0,0,1,1,0,0,0,1,2,0,2,0,0,0,0,1,0,2,0,2,0,2,2,0,1,0,2,0,2,1,1,0,2,0,1,1,1,0,1,1,0,0,0,1,1,0,3,1,1,3,0,0,0,4,1,3,0,1,0,1,0,0,3,2,1,2,1,0,2,2,1,4,1,0,0,1,1,0,0,0,2,3,1,1,3,0,0,1,1,1,1,2,1,0,2,1,2,2,1,1,2,1,0,0,0,1,3,0,2,1,0,3,1,1,3,0,0,2,1,0,1,0,1,1,1,1,0,0,2,1,1,1,0,0]}]},"null_count":0,"last_update_version":397952058243416064}},"indices":{},"count":2000,"modify_count":0,"version":0} \ No newline at end of file diff --git a/cmd/explaintest/s/explain_union_scan.json b/cmd/explaintest/s/explain_union_scan.json deleted file mode 100644 index 354eab884b898..0000000000000 --- a/cmd/explaintest/s/explain_union_scan.json +++ /dev/null @@ -1,55951 +0,0 @@ -{ - "database_name": "test", - "table_name": "city", - "columns": { - "city_name": { - "histogram": { - "ndv": 8, - "buckets": [ - { - "count": 180354, - "lower_bound": "Y2l0eV8xMCsrMTA=", - "upper_bound": "Y2l0eV8xMCsrMTA=", - "repeats": 179690 - }, - { - "count": 215675, - "lower_bound": "Y2l0eV8yKysy", - "upper_bound": "Y2l0eV8yKysy", - "repeats": 35190 - }, - { - "count": 284267, - "lower_bound": "Y2l0eV80Kys0", - "upper_bound": "Y2l0eV80Kys0", - "repeats": 68340 - }, - { - "count": 383744, - "lower_bound": "Y2l0eV82Kys2", - "upper_bound": "Y2l0eV82Kys2", - "repeats": 99110 - }, - { - "count": 511887, - "lower_bound": "Y2l0eV84Kys4", - "upper_bound": "Y2l0eV84Kys4", - "repeats": 127670 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170312, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170312, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170312, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170312, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170312, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 6206992, - "last_update_version": 413254473674391554, - "correlation": 0.237088 - }, - "description": { - "histogram": { - "ndv": 511887, - "buckets": [ - { - "count": 2047, - "lower_bound": "Y2l0eV9kZXNjXzAwMDRjNWFkODZlMTQ4YWZiMGZhMWMyMjYzZjAxZmNl", - "upper_bound": "Y2l0eV9kZXNjXzAwZWIyNzRmMzU2ZjQwNDliNjllM2MwYWUxMWY2YjI1", - "repeats": 1 - }, - { - "count": 4095, - "lower_bound": "Y2l0eV9kZXNjXzAwZWJjMzJlZThmODQyOWU5ZmU2YWMyZGE5YmNlNjhl", - "upper_bound": "Y2l0eV9kZXNjXzAxZDhmNTBiZjlkYzRmMjI4ZDAzNWJjZjZjYjJlYjQ0", - "repeats": 1 - }, - { - "count": 6142, - "lower_bound": "Y2l0eV9kZXNjXzAxZTQyNTFlYTFmMzQzMDZhODQzNzgwMzc4NjQzYjBj", - "upper_bound": "Y2l0eV9kZXNjXzAzNWE2NGY1NmFiZDRmZGJhZDliNDlhYmE1YjUxNzgy", - "repeats": 1 - }, - { - "count": 8190, - "lower_bound": "Y2l0eV9kZXNjXzAzOWY1MjBlN2FlZDQxZjk5NWZmYTIxMjk1ZDNlNzU1", - "upper_bound": "Y2l0eV9kZXNjXzA0OGZjZmVkNDU0NjQxNTY4ZGI0NWJmOWVjYjkyMmFl", - "repeats": 1 - }, - { - "count": 10237, - "lower_bound": "Y2l0eV9kZXNjXzA0OTQ3MzI0OWVhNTQ1ODhhMDkxMzUxOGNkMWM5NGU1", - "upper_bound": "Y2l0eV9kZXNjXzA1ZGViNmUyY2QzNjQyZWZhYTUzNGY3ZmIwZWI5NjAz", - "repeats": 1 - }, - { - "count": 12285, - "lower_bound": "Y2l0eV9kZXNjXzA1ZGZlNjViYzg5ZTQ2NDM5MDdlNzQ2ODgwNTU3MTcx", - "upper_bound": "Y2l0eV9kZXNjXzA3MjVlZTlkMTI2ZTRlOTJiZGIwZTM2OTg2OTA1Nzg4", - "repeats": 1 - }, - { - "count": 14332, - "lower_bound": "Y2l0eV9kZXNjXzA3MzA1ZWZhZmJkYjRlYTA5Y2U1YmZkNDIxMDg1M2Ji", - "upper_bound": "Y2l0eV9kZXNjXzA3YjhhZWRiMmFhMjRhMDE4YmI5MDE0NGRmMjJmYjAz", - "repeats": 1 - }, - { - "count": 16380, - "lower_bound": "Y2l0eV9kZXNjXzA3ZDU3ZjdiYTBlNTRhZGE5MmU0MDc0N2FkNDgxMDI0", - "upper_bound": "Y2l0eV9kZXNjXzA4YzNlMzc2ZDAzNTQwOGQ4YmNjYWQ4Yzk0NGIwNTY0", - "repeats": 1 - }, - { - "count": 18427, - "lower_bound": "Y2l0eV9kZXNjXzA4ZDA2YWYzZmQ4YTQzNjBhZDdmMTg0ZDhmMjc1NmE3", - "upper_bound": "Y2l0eV9kZXNjXzBhM2ExYmQ1MTQ3YjQwZmZiYTQ2Y2RmOWU0ZjM0ZjVh", - "repeats": 1 - }, - { - "count": 20475, - "lower_bound": "Y2l0eV9kZXNjXzBhNGM2MmEwODg4ZTRjYmM5MmE5YTVmZThkOTgxZWY5", - "upper_bound": "Y2l0eV9kZXNjXzBhYjlmMDU5ZTNiZDQyZGZhN2U1ZDAwZTg4ZTczM2M3", - "repeats": 1 - }, - { - "count": 22523, - "lower_bound": "Y2l0eV9kZXNjXzBhZDBjY2FlMmFkNjRiMGJiOTFmOGNmNmIzYjNlMjc4", - "upper_bound": "Y2l0eV9kZXNjXzBiYmMxNmM5MzhkNzRjODY4OWExNzJlNjc1MWU4ODdh", - "repeats": 1 - }, - { - "count": 24570, - "lower_bound": "Y2l0eV9kZXNjXzBiYzBjYzg1NjY1NTQ3YWQ4ZDMzZjkxMzA3NDkwNWFi", - "upper_bound": "Y2l0eV9kZXNjXzBjY2E3N2QyOGI3YTQ3YmU5NTM3NDJkOTNjOGI4MThh", - "repeats": 1 - }, - { - "count": 26618, - "lower_bound": "Y2l0eV9kZXNjXzBjZDE0OGEwMTNmYzRmNWU5NGY1N2MzZWRiZmQ2Mjg2", - "upper_bound": "Y2l0eV9kZXNjXzBkODEwMmZiMDVkZjQ5MGVhYzdjOTNjZTdiYjk2OGYy", - "repeats": 1 - }, - { - "count": 28665, - "lower_bound": "Y2l0eV9kZXNjXzBkYTA1YzVmNTU2MTQyNTk4MjE1MjYzMjg4NGMyNjU4", - "upper_bound": "Y2l0eV9kZXNjXzBlOGI3MTQ5ZTIwYzRjMjRhODU2NzFiNmNjNTE2ZGM1", - "repeats": 1 - }, - { - "count": 30713, - "lower_bound": "Y2l0eV9kZXNjXzBlOWMzOTJkMDIwNDQxZDg4M2M0NzIwMWUyMTA1MDUy", - "upper_bound": "Y2l0eV9kZXNjXzBmYWIxZGIwNzEzNzRmYjJhMDdkNDY0Mjk5YjU0OWFj", - "repeats": 1 - }, - { - "count": 32760, - "lower_bound": "Y2l0eV9kZXNjXzBmYmFiOGYyY2JjNzQyM2E4YzgwNWI0MzRmOWQ0MTJi", - "upper_bound": "Y2l0eV9kZXNjXzExMThjNDEzZDBhMTRjMmI4YWRmZjI5YTgyOTMwOWRj", - "repeats": 1 - }, - { - "count": 34808, - "lower_bound": "Y2l0eV9kZXNjXzExMmZjZjY0Mzg5MzQzZTc5YjliZDhlMDIzMDI5YmVj", - "upper_bound": "Y2l0eV9kZXNjXzExZDY4ZDU4MjY1OTRlZjY4YWJhNTdlZmVhNTE1MGM1", - "repeats": 1 - }, - { - "count": 36855, - "lower_bound": "Y2l0eV9kZXNjXzExZjY3YjkwMjQ1YjQxYTliNzQxMjZiMzY5ZjkwMTA2", - "upper_bound": "Y2l0eV9kZXNjXzEzNDg3MGViM2M3NDQxNjc5MjRmYjlkNmVhNzU5ZjVl", - "repeats": 1 - }, - { - "count": 38903, - "lower_bound": "Y2l0eV9kZXNjXzEzNDllNDI2MWM5NDQzMjBhYzNjYTYxYmI1OGZmMTNk", - "upper_bound": "Y2l0eV9kZXNjXzE0MTA2NGFkNGIzNTRiNDA5NDIwZGIxMDgwN2JmNmM5", - "repeats": 1 - }, - { - "count": 40950, - "lower_bound": "Y2l0eV9kZXNjXzE0MmM5MjBlNTI4MDRjNjE4NGUxMzhiYjNhNDQyOTc1", - "upper_bound": "Y2l0eV9kZXNjXzE1M2M0ZDgyODMwNTQ4M2Q4NTk1YjI1NGNjZmQxNjI5", - "repeats": 1 - }, - { - "count": 42998, - "lower_bound": "Y2l0eV9kZXNjXzE1NjNiNmIwODhjMzQ2ZDBiZTc3MmIxZDE4MmRhNDYy", - "upper_bound": "Y2l0eV9kZXNjXzE2YzEwN2UwYTM1NzRkZjBiOTdjNTk4MDFhMzUwZDhl", - "repeats": 1 - }, - { - "count": 45046, - "lower_bound": "Y2l0eV9kZXNjXzE2ZDZmNjVmN2M0OTQ2Yjg4NjEwY2NlNzQwM2VjYjQ5", - "upper_bound": "Y2l0eV9kZXNjXzE3YTQzZjBkODNkZDQ2YTI5YjRiYWI3MjQzMTgzMjM1", - "repeats": 1 - }, - { - "count": 47093, - "lower_bound": "Y2l0eV9kZXNjXzE3YTljZTc0Zjg5ODRjNmY5YzYxMmU0NDAwMTk3ODI1", - "upper_bound": "Y2l0eV9kZXNjXzE4OWFiMmJhODYyYjRkMjBhOWM4YWQ2ZDRiZDVjYTM2", - "repeats": 1 - }, - { - "count": 49141, - "lower_bound": "Y2l0eV9kZXNjXzE4YWZmNjJmOGE2NTRiNTc5ODM4Yzc4MjhjMzkyNDM2", - "upper_bound": "Y2l0eV9kZXNjXzE5NzQxNWRiMTcwMDQyMDViN2U0MjhlNzk2ZDQ1M2Ji", - "repeats": 1 - }, - { - "count": 51188, - "lower_bound": "Y2l0eV9kZXNjXzE5YzI3ZjlmMTgyYTRmMGFiZGMxMjk4ZWMwOGQ5YmY1", - "upper_bound": "Y2l0eV9kZXNjXzFiMjg0ZTg4MGVmNTQ1OWQ4MDNjYzY5MWIxMGM5NDk3", - "repeats": 1 - }, - { - "count": 53236, - "lower_bound": "Y2l0eV9kZXNjXzFiMmUxMjc1ZWY5OTQxMDg4YTQ0OTFhZDVlYWVlNTNj", - "upper_bound": "Y2l0eV9kZXNjXzFiZjAzNzg1MGIxYTRkYmRiYzcwYWUxMmU1MTI4NDFi", - "repeats": 1 - }, - { - "count": 55283, - "lower_bound": "Y2l0eV9kZXNjXzFiZjlmYjk5NzE4YTRmNDRiMGVmMmViZGI1MzlhMDJi", - "upper_bound": "Y2l0eV9kZXNjXzFjNjlhMTQ3YzdkMjQ5MzVhNzgxZWQ1ZWU4Y2M1YTFk", - "repeats": 1 - }, - { - "count": 57331, - "lower_bound": "Y2l0eV9kZXNjXzFjNzk0MWJmM2E1MjRlMDliYmU4MTNhMGE0MjYyYWQy", - "upper_bound": "Y2l0eV9kZXNjXzFkNzA0OGUwODU0ZjQ4MWI5OTM5NGNhMGU1MTlkMTIx", - "repeats": 1 - }, - { - "count": 59378, - "lower_bound": "Y2l0eV9kZXNjXzFkOGJhNTE1YWNjNzRkMjY4ZDA2ZTE0MTE1YTUyMWZh", - "upper_bound": "Y2l0eV9kZXNjXzFlYTgwOWU0MmI1YzQyMWNhZDEyODUwNDE5NGQzOTJm", - "repeats": 1 - }, - { - "count": 61426, - "lower_bound": "Y2l0eV9kZXNjXzFmMWM5ZWEyNjViNzRmYmY4OWVlOWM2ZjVkNDI5MjAx", - "upper_bound": "Y2l0eV9kZXNjXzIwMDIyODc0NjgxNTQ0MTNhM2ZmNTU4ODE4OTgxODg4", - "repeats": 1 - }, - { - "count": 63473, - "lower_bound": "Y2l0eV9kZXNjXzIwNDA0MzA5MDVmMjQzMjc5MmRjMWU2NzhiNjMzNGI2", - "upper_bound": "Y2l0eV9kZXNjXzIxNzBkOTg4YWM5MjRhYjRhNTE0YjdmMzZjZjE0ZTZk", - "repeats": 1 - }, - { - "count": 65521, - "lower_bound": "Y2l0eV9kZXNjXzIxOTMyZGNkMjBhYTQ1ZTU5MWFmZWJkMzFiZGUzZjZj", - "upper_bound": "Y2l0eV9kZXNjXzIyYzk3YTgyMjhlMjRmMGVhY2NiMTM5MjdkMmMzNjc3", - "repeats": 1 - }, - { - "count": 67569, - "lower_bound": "Y2l0eV9kZXNjXzIyY2E1MDVlYmY0NzRhOTE4OGE1NmI2ODE3NDMwNzk3", - "upper_bound": "Y2l0eV9kZXNjXzIzYjM4OTAzZWNkZDQ4ZmRhMTEwYWJhYWQ1ZjEzN2M0", - "repeats": 1 - }, - { - "count": 69616, - "lower_bound": "Y2l0eV9kZXNjXzIzYjQxOGYyMjVhODRlNDU4YjY4M2NjNTA0YmZlMDEz", - "upper_bound": "Y2l0eV9kZXNjXzI0ODM3OWVkYjUwMzQ0OWE5YzI3MDIwZWY0YmNmNzcx", - "repeats": 1 - }, - { - "count": 71664, - "lower_bound": "Y2l0eV9kZXNjXzI0ZmM3ZmM5YTU3MDRjN2JiNmJmMGNmNWEzZjBlNGU0", - "upper_bound": "Y2l0eV9kZXNjXzI1Yzk3NjA0ZjM4OTQzOTk4NmU2M2MwNGQwZGMxZTQ4", - "repeats": 1 - }, - { - "count": 73711, - "lower_bound": "Y2l0eV9kZXNjXzI1ZGE2ZWU4Njc2NjRmODVhODIyM2VhNTdlYjVjODYx", - "upper_bound": "Y2l0eV9kZXNjXzI2Yjg5OGRjNjQyZjRlYWZiOWIyMDlkM2ZlYzAzMWUz", - "repeats": 1 - }, - { - "count": 75759, - "lower_bound": "Y2l0eV9kZXNjXzI2YmUwY2RiNWZmYzRhYWY5ZTIzN2U5YmU0NDgwOTI2", - "upper_bound": "Y2l0eV9kZXNjXzI3ODQ3ZjNlNzllYjQ3NzBiZjBkZGRiMTRmMWNkZDMy", - "repeats": 1 - }, - { - "count": 77806, - "lower_bound": "Y2l0eV9kZXNjXzI3ODRlOTU4ZDljYTRlODc4NzA4ZWU0YjhkY2IyNzZl", - "upper_bound": "Y2l0eV9kZXNjXzI4MGY1MjMwZDcyYTRhNzNhZjI2ODA2NDUyZjY0ZTE2", - "repeats": 1 - }, - { - "count": 79854, - "lower_bound": "Y2l0eV9kZXNjXzI4MWM2MWVjNzI4MjQ5Yjk5NzM5OGM3YzhiY2Y2ODA3", - "upper_bound": "Y2l0eV9kZXNjXzI5MDRmMzliMzkxYzQ3ZDk5YmNmZGZkNWQxNjFiZDI3", - "repeats": 1 - }, - { - "count": 81901, - "lower_bound": "Y2l0eV9kZXNjXzI5MDgwNjZiMzViNzRkNjNhZWZmYWM3MDRlMTllNzQz", - "upper_bound": "Y2l0eV9kZXNjXzI5ZjBiMWYxNDc5ODRhZDU5Y2ZlZDRjNzE5ZDcxZjE4", - "repeats": 1 - }, - { - "count": 83949, - "lower_bound": "Y2l0eV9kZXNjXzI5ZjM1MzQ0NTFmZjQ0MjA5MWRhZDJlYmJjNmE3ZjAx", - "upper_bound": "Y2l0eV9kZXNjXzJiMmU2N2RiYWFhMjQ5Mzg5NzM3NDg3YTRjY2U5NjM1", - "repeats": 1 - }, - { - "count": 85997, - "lower_bound": "Y2l0eV9kZXNjXzJiNDI1MDU2ODllYTQ2ZTI4Y2M5OGQ4ZWM1OWVmNmJj", - "upper_bound": "Y2l0eV9kZXNjXzJiZDYyNTFhNDcwYjQ0ZDA5M2RhN2Y4N2IyYzkzYThm", - "repeats": 1 - }, - { - "count": 88044, - "lower_bound": "Y2l0eV9kZXNjXzJiZjIyNjRmYTExYzQzODRhZWFjMjIwNWJjNmUyMjUw", - "upper_bound": "Y2l0eV9kZXNjXzJkMTlkNTMyMTZhMzQ0Nzc4MzIyY2YwNTAxZTJjN2Q0", - "repeats": 1 - }, - { - "count": 90092, - "lower_bound": "Y2l0eV9kZXNjXzJkMWMzNTg1MDQ0MzQ5OTVhMDA2ZWQ3ODA3NTQwYWI3", - "upper_bound": "Y2l0eV9kZXNjXzJkYTRlMjE1YjM0ZDQzODU4MmVjMDFhNjIzNWY3MjFl", - "repeats": 1 - }, - { - "count": 92139, - "lower_bound": "Y2l0eV9kZXNjXzJkYmIwNzVmZDdmZjRhMWM4NzRiNDJhMTc2ZjU5N2Mx", - "upper_bound": "Y2l0eV9kZXNjXzJlZDRiZWRiMzNhMzQ3ZmY5Njk3ZGUxNTNjY2M3ZDU1", - "repeats": 1 - }, - { - "count": 94187, - "lower_bound": "Y2l0eV9kZXNjXzJlZWQ1YmVhNTI2ODQ3NDNhMDMzZTA0ODE3ZmYxZjVh", - "upper_bound": "Y2l0eV9kZXNjXzJmNjcyYzJlMTVkZjQ2ZmQ4MjBkMDY0MTYzMmIyNjJi", - "repeats": 1 - }, - { - "count": 96234, - "lower_bound": "Y2l0eV9kZXNjXzJmOTUzYTI4ZjEyMDQ0N2ZiZTNlMDE2M2QzMDM2ZTU5", - "upper_bound": "Y2l0eV9kZXNjXzMwNWU5OTk3ZWY5MzQ0ZTFiNGE2OWYyYzQyNDhjNzc5", - "repeats": 1 - }, - { - "count": 98282, - "lower_bound": "Y2l0eV9kZXNjXzMwOWM5NzcxMWJhNDRmY2Y4ZTJhZWM1ZTVhMTMzMmRk", - "upper_bound": "Y2l0eV9kZXNjXzMxZTI0MDUwNjI2NTRmNTU5NDEyMTEwYWMwODAyNjI3", - "repeats": 1 - }, - { - "count": 100329, - "lower_bound": "Y2l0eV9kZXNjXzMxZTMwMWNmOWZkYTQ3YTViYjExNzdlNjE4MDMxNjc3", - "upper_bound": "Y2l0eV9kZXNjXzMzMWQ0MzlkYjRmMjQ2ZTBhMzU0ZmM3NWM4NDE2Mjg3", - "repeats": 1 - }, - { - "count": 102377, - "lower_bound": "Y2l0eV9kZXNjXzMzMzY0MTA4NWFmZjRhMjU5MTBhNWFkOWYwNDM2YjM2", - "upper_bound": "Y2l0eV9kZXNjXzMzZjdlNWU4MDkxMTQxYjg4MDQ3OWE3ZDZiZjUwMmRi", - "repeats": 1 - }, - { - "count": 104424, - "lower_bound": "Y2l0eV9kZXNjXzMzZjliM2QxODE5MTQyYThiZGNjNTZmMzVjNTRjOTBh", - "upper_bound": "Y2l0eV9kZXNjXzM0OWEwZmEzYWJjODQ2YzBhMDFjMzI2NGE3YjU3NzA0", - "repeats": 1 - }, - { - "count": 106472, - "lower_bound": "Y2l0eV9kZXNjXzM0YTM4YzU2OWMyMzQxNTBhNzQxNTBkZjEyZTc1ODM2", - "upper_bound": "Y2l0eV9kZXNjXzM1NzI4Mzk0NDJiNzRlMDM5ZDYwY2Y1OTFhMGJhZWE3", - "repeats": 1 - }, - { - "count": 108520, - "lower_bound": "Y2l0eV9kZXNjXzM1ODQ3MWM3NDUwMDQzMDU4ZGQxNzc5ZTY5ZDk2OGQz", - "upper_bound": "Y2l0eV9kZXNjXzM2ODVhMzFjNGUzZTQwOGU5NWFlYzgyNmIzNzAxNzRk", - "repeats": 1 - }, - { - "count": 110567, - "lower_bound": "Y2l0eV9kZXNjXzM2OWEyNjBlZmRjNzQzYzY4MDUzYjRjMTAzODVlZWE0", - "upper_bound": "Y2l0eV9kZXNjXzM3OWU5OTg3MGYyMTQyNjZiMzEwNjRiNWZiNjg5NDNm", - "repeats": 1 - }, - { - "count": 112615, - "lower_bound": "Y2l0eV9kZXNjXzM3YmRlZGI2NGYxNTRjYThhNzRkMTJiMDMyMmRjODBm", - "upper_bound": "Y2l0eV9kZXNjXzM4NmMzNjhlYjVlYTRmOWI5ZDMxMTIyYzg5YTU5ZWIz", - "repeats": 1 - }, - { - "count": 114662, - "lower_bound": "Y2l0eV9kZXNjXzM4OTAxNWExOGYyNTRmYjNiODUxNWZjYjlhYjhlZDQy", - "upper_bound": "Y2l0eV9kZXNjXzM5ZjQzZmRhMGQwNzQ2NDk5MWMzOGIwNDQxYjc3YjVk", - "repeats": 1 - }, - { - "count": 116710, - "lower_bound": "Y2l0eV9kZXNjXzNhMjMzODFiYmYxMDQ3OTU5NDRhM2M4ZmQzYzgzMjIy", - "upper_bound": "Y2l0eV9kZXNjXzNiYzM2ZjNmYWEyMzQwOTQ4NTY3Zjk4YmY0MjVjNTg1", - "repeats": 1 - }, - { - "count": 118757, - "lower_bound": "Y2l0eV9kZXNjXzNiZDEwMWE2MDczODQzY2Q5Nzc2N2FjODA2Mjg0Y2Zi", - "upper_bound": "Y2l0eV9kZXNjXzNkYjk3OWUwMWU0ZjRhOTdhMWQxMzAyYWJkNWJlMmM3", - "repeats": 1 - }, - { - "count": 120805, - "lower_bound": "Y2l0eV9kZXNjXzNkYzc3OGZiZWM5NzQ5Njg4ZWY2NTA2OWUxNGNmMTA2", - "upper_bound": "Y2l0eV9kZXNjXzNlYzQ4YTZkMTNiMTQ0NmFhZTA3NDc4MzAxMjEyYjNk", - "repeats": 1 - }, - { - "count": 122852, - "lower_bound": "Y2l0eV9kZXNjXzNlZDIyYTU5YmQ0MDQ4YTg4Y2I5MTkzNDgyM2Q1M2U2", - "upper_bound": "Y2l0eV9kZXNjXzNmYTk1OTVmMjk4ODRmMDk5OWU5NmFlYjI0ZmMzZGEz", - "repeats": 1 - }, - { - "count": 124900, - "lower_bound": "Y2l0eV9kZXNjXzNmZDhhYmFhNTc5ODRjMzdiNjczY2Q2NDgwNjBmYTRh", - "upper_bound": "Y2l0eV9kZXNjXzQwYjVjMDEyZjE2MDQwY2VhODgzNGZkZjI3YTRlNTA2", - "repeats": 1 - }, - { - "count": 126947, - "lower_bound": "Y2l0eV9kZXNjXzQxMGU3ZjhjY2RkOTRjMGJhNGNjYzkwNjc3ZmQxMGI3", - "upper_bound": "Y2l0eV9kZXNjXzQxOWVjYTQ5YTJjMTRhYjA4NmMzYjRlZmY1NjJjOWE4", - "repeats": 1 - }, - { - "count": 128995, - "lower_bound": "Y2l0eV9kZXNjXzQxYTM5ZmE1ZDBhNzQ1YTQ5Y2RlYzUxOTY5NTQxMjkz", - "upper_bound": "Y2l0eV9kZXNjXzQyNTk4MzM1NWVhNzQ5MTU5YzYyOWNjYzM0MzYzN2Ew", - "repeats": 1 - }, - { - "count": 131043, - "lower_bound": "Y2l0eV9kZXNjXzQyNmE2MWRkYTI3MDRiMmJiNDNmZjQ1YWI4Y2RiNTI5", - "upper_bound": "Y2l0eV9kZXNjXzQzMTVkNzQzMjlhNDQxNjE5MjViNDI2YmQzYThlMDBk", - "repeats": 1 - }, - { - "count": 133090, - "lower_bound": "Y2l0eV9kZXNjXzQzMjVhMjY3Y2JiYzQzYTJhZmUxOTYzZGEzZjlmODEz", - "upper_bound": "Y2l0eV9kZXNjXzQzZjQ2MzBkNmRlODQ1ZGJiMTM2MWE2NDM3ZTM4NDI3", - "repeats": 1 - }, - { - "count": 135138, - "lower_bound": "Y2l0eV9kZXNjXzQ0MDM0NzgyY2Y3YTQ4YjY5N2MwZTlmNTY5MjU0YTU4", - "upper_bound": "Y2l0eV9kZXNjXzQ1MzMwMDY1ZDdjMjRjYTJiZTU5YWE2MDc0M2ZlZDVm", - "repeats": 1 - }, - { - "count": 137185, - "lower_bound": "Y2l0eV9kZXNjXzQ1MzUyYWIzOTgxZDQ5OGJiOWFlM2QzMTliZTg4NGYw", - "upper_bound": "Y2l0eV9kZXNjXzQ2M2M0NzIwMDZlMzRkNjNhN2NjYTZhMjYxNzM3ZDI0", - "repeats": 1 - }, - { - "count": 139233, - "lower_bound": "Y2l0eV9kZXNjXzQ2NmU0MjkwZTViZjQwNDhiMzdjMmU2ZGJkZmMxYmUz", - "upper_bound": "Y2l0eV9kZXNjXzQ3ZWExN2M5NWVhZTQ3OTNhYTMxNWE2Zjk3OTM4MzNl", - "repeats": 1 - }, - { - "count": 141280, - "lower_bound": "Y2l0eV9kZXNjXzQ3ZWQ3MDI0MDQ3NzQ2ZDNiMmE4NDZkNTQ1N2Y4NWFh", - "upper_bound": "Y2l0eV9kZXNjXzQ4YjZjNmNmYjk4ODRkODU5YzBhMmFkZDk5MDNmOTA4", - "repeats": 1 - }, - { - "count": 143328, - "lower_bound": "Y2l0eV9kZXNjXzQ4YmU0NTZiMmJiNTRkZjliMTM0MTU4ZGJjM2QwZDFl", - "upper_bound": "Y2l0eV9kZXNjXzQ5YWVhM2E1ZmY2ZjQyNGFhOGI5NzJiN2VkZjQxZjk5", - "repeats": 1 - }, - { - "count": 145375, - "lower_bound": "Y2l0eV9kZXNjXzQ5ZGFjN2QwZGUyYzQ3N2E4ZDA5OGUzZGIzYjY5YTk4", - "upper_bound": "Y2l0eV9kZXNjXzRhODk5OTQ3YjMxNDRkN2ZhZTQ4YWNhMmE5ZGEzM2Ri", - "repeats": 1 - }, - { - "count": 147423, - "lower_bound": "Y2l0eV9kZXNjXzRhYTk0MTYyMzhiMDQzNTdiNmRmNWZiODM2NzFhZTUy", - "upper_bound": "Y2l0eV9kZXNjXzRiOTYyMzg3NzlhNTQwMDU5MWZjZWM1NzVhNmUzZTVh", - "repeats": 1 - }, - { - "count": 149471, - "lower_bound": "Y2l0eV9kZXNjXzRiYTc2NTAzNjg4NDRmZTFhY2M0YTJhOWI2MmJhMDc3", - "upper_bound": "Y2l0eV9kZXNjXzRjODA4NWI3ZmY5MjQyOTNhMDgwOTgyZmZjY2RiYzJj", - "repeats": 1 - }, - { - "count": 151518, - "lower_bound": "Y2l0eV9kZXNjXzRjOTg4NTJiNjMyYzQ3NWU5MDAwZGU1ODEzNTIzMzdm", - "upper_bound": "Y2l0eV9kZXNjXzRkNmViNGUxZjRiMTRlNWNhZDk3YmJiYzVlYTZjNTgy", - "repeats": 1 - }, - { - "count": 153566, - "lower_bound": "Y2l0eV9kZXNjXzRkODQwYmFiMWQ2YTRlMTlhODI5OTViM2VmOGQ5Mjg2", - "upper_bound": "Y2l0eV9kZXNjXzRlOGI5Nzc3ZTc1MDRhYWRhYzhmODMzZjJmYTA5Y2M0", - "repeats": 1 - }, - { - "count": 155613, - "lower_bound": "Y2l0eV9kZXNjXzRlYTg3YjQ3YTA0YzRmNWNiYTkxMjJlYzExNDczYjZi", - "upper_bound": "Y2l0eV9kZXNjXzRmYzBmYmFmNDZmYTQxZWNiMmI1NGM0ZTk0MzVkOWNi", - "repeats": 1 - }, - { - "count": 157661, - "lower_bound": "Y2l0eV9kZXNjXzRmZDNhNmVmYThhODQwYzQ5YTJmNzc4NTE1Yjk5NWFl", - "upper_bound": "Y2l0eV9kZXNjXzUwZGU2Mzg0ZTExZjRhNzk5NWRjZDA5MzkzZTI3Nzlh", - "repeats": 1 - }, - { - "count": 159708, - "lower_bound": "Y2l0eV9kZXNjXzUxMDVjYjY1NTU0NTRlNzNhMzc1ZWZmNjkzZTM1NGJj", - "upper_bound": "Y2l0eV9kZXNjXzUyMDE1YTRiZWU3YjRmNTM4OTRiM2QyYTRjNDVjNmJh", - "repeats": 1 - }, - { - "count": 161756, - "lower_bound": "Y2l0eV9kZXNjXzUyMmU5Zjg2ZjFmNDQxN2M4NjE4NjMyM2E4MWZiYjNk", - "upper_bound": "Y2l0eV9kZXNjXzUzNWRkMWYyODVkMzRiZDBiNmY5MGViMmZkZmQzMzA4", - "repeats": 1 - }, - { - "count": 163803, - "lower_bound": "Y2l0eV9kZXNjXzUzNjRjMzZmMTI2OTRlYmQ4ZmEwMmNiNjNiZTVmYzAy", - "upper_bound": "Y2l0eV9kZXNjXzU0Mzg4MDM3OTY3MTQ5ZjE4MTU0Nzc1YmE1ZjE3Mzcw", - "repeats": 1 - }, - { - "count": 165851, - "lower_bound": "Y2l0eV9kZXNjXzU0NTRjZjEwNjAxMTRlZDU5NmI3MDA5NjA5M2NjN2Q4", - "upper_bound": "Y2l0eV9kZXNjXzU1NDZhZDZmZTA1ZTQ1MTE5ZDU1ZjMwZmE4Nzc5YTZh", - "repeats": 1 - }, - { - "count": 167898, - "lower_bound": "Y2l0eV9kZXNjXzU1OGJjYjhmYTBlMDRiZjViYmUyY2RiZDcyNWE1MGQx", - "upper_bound": "Y2l0eV9kZXNjXzU2NjQ4Yjg0NGZiNzQyMmNhODRlMmI3MTUwNGZhMTU2", - "repeats": 1 - }, - { - "count": 169946, - "lower_bound": "Y2l0eV9kZXNjXzU2YTY1M2I0ZDA1YTRkMmU4ZTkxOWM3MTI3ZjAyOWQ4", - "upper_bound": "Y2l0eV9kZXNjXzU3NjM4ZGE4NTVmOTRhZWU4OWIxNDdmMjE2NWNkYTEy", - "repeats": 1 - }, - { - "count": 171994, - "lower_bound": "Y2l0eV9kZXNjXzU3NjRiYmMwYjU3NTRmNTBiMGJjNDIyYjE1NDA0NDRi", - "upper_bound": "Y2l0eV9kZXNjXzU4MzU4ZjRiZDgwYzRkMDQ4YjEyNDAzZDM4ZTc0YTFj", - "repeats": 1 - }, - { - "count": 174041, - "lower_bound": "Y2l0eV9kZXNjXzU4NDRjMTllMGRjZjQzNDZiYWFlMTZhMTE2MTI3NjVk", - "upper_bound": "Y2l0eV9kZXNjXzU5NTQ5ZmMzYjE3NTQwOGZhMTBkNDU4ZDg4NDU4MWIx", - "repeats": 1 - }, - { - "count": 176089, - "lower_bound": "Y2l0eV9kZXNjXzU5OTRkNjhiYzI1ZjQwYjA4MjNkYmQ2YmEyZjhjYjEz", - "upper_bound": "Y2l0eV9kZXNjXzVhNTI2MGNhZDI0OTQ1NzdhZTllZTEwZTRkNTU3ZjZm", - "repeats": 1 - }, - { - "count": 178136, - "lower_bound": "Y2l0eV9kZXNjXzVhNmVlNjRjYmE4ZDQ0OGZiYmZjNTYzZTBkMWFmZGUz", - "upper_bound": "Y2l0eV9kZXNjXzViMzQ4MjhmNDIyYjRlY2M4NmQwZWNiMTdhOTRhOWI4", - "repeats": 1 - }, - { - "count": 180184, - "lower_bound": "Y2l0eV9kZXNjXzViM2EwYjFkYzliODQ5ZjhiNTk3ODFhMTI0YmY1YWJm", - "upper_bound": "Y2l0eV9kZXNjXzVjMzE0MTJhOGU4YTQwOTJhZGM4ZmI2NDQ5MTA1ZmIw", - "repeats": 1 - }, - { - "count": 182231, - "lower_bound": "Y2l0eV9kZXNjXzVjNGYwOTUzYjA1NjRlOTNiYWZhNzdiNjczZTBkOTQ1", - "upper_bound": "Y2l0eV9kZXNjXzVkMmQwNGYyOTFlMTQxODVhMzMzMGUyNDNiODg1ZTFk", - "repeats": 1 - }, - { - "count": 184279, - "lower_bound": "Y2l0eV9kZXNjXzVkNGRhYWI3MDQwYTQzYjJiNDMyMzQ4OTk1YmQ1NmUy", - "upper_bound": "Y2l0eV9kZXNjXzVlMDQ2ZDNkMDFlMTRmZWE4ZjJmNTk4MGYzOWRmYTVm", - "repeats": 1 - }, - { - "count": 186326, - "lower_bound": "Y2l0eV9kZXNjXzVlMTNkMWViZmFlYzRmZjc5ZGYyODdmNDgxZmU3NGY1", - "upper_bound": "Y2l0eV9kZXNjXzVlZGM0NTMzYTQwNTQwYzg4ZDg5YmNlYzFiYTBmMGU0", - "repeats": 1 - }, - { - "count": 188374, - "lower_bound": "Y2l0eV9kZXNjXzVlZjAzYTZmNmM2NTRhYjc5NjI4ZjVjNjliYzNhMTk3", - "upper_bound": "Y2l0eV9kZXNjXzYwMDFlMzU5YjMwOTRmMjg5ZjI3YjRmMTRmMzU0NzUw", - "repeats": 1 - }, - { - "count": 190421, - "lower_bound": "Y2l0eV9kZXNjXzYwMDZkNTdjZjA4NjRlMDk5YWI1YmVkODBjYWQ3MThk", - "upper_bound": "Y2l0eV9kZXNjXzYxNjE1OTdmMzMwZjQwMDk4OGJlYTRkNWQ4NWE3YzBm", - "repeats": 1 - }, - { - "count": 192469, - "lower_bound": "Y2l0eV9kZXNjXzYxNzU4NTFkZDRkZTQxOWNhMGU0MThlYTA4NjMwOWI0", - "upper_bound": "Y2l0eV9kZXNjXzYyNzc0NTAzMmI2YTRhMGZhNTY0MjMxNmRlN2JiYzkx", - "repeats": 1 - }, - { - "count": 194517, - "lower_bound": "Y2l0eV9kZXNjXzYyN2Y0YTNmMTQyNTQ4ZDE5YWEzYTgxYzQ1ODU1NTAx", - "upper_bound": "Y2l0eV9kZXNjXzYzNTg1NDIyYzYyMzQ0ZGVhMjI5MzlkNjI1YWQ3YmIz", - "repeats": 1 - }, - { - "count": 196564, - "lower_bound": "Y2l0eV9kZXNjXzYzNmUxOTQ0MGJlOTQyNDJiYjFkN2FiZWJkMmVkZDMx", - "upper_bound": "Y2l0eV9kZXNjXzY0MDc4NDIwNzc2ZDRiMzZiNDRlMDE5OTU1MzhkMTk1", - "repeats": 1 - }, - { - "count": 198612, - "lower_bound": "Y2l0eV9kZXNjXzY0MGEzOWUwMzIxNjQ3MjM5NDE0OGVjMTI4NGE1YjNj", - "upper_bound": "Y2l0eV9kZXNjXzY0ZWU4ZjNiMzZlODQ5ZDZiY2JiOGZhMjMxZTUzZjdh", - "repeats": 1 - }, - { - "count": 200659, - "lower_bound": "Y2l0eV9kZXNjXzY1MDcxYmVmMGQ1ZjQxYjZiMDJmOTkxYTdjMmI2YjY2", - "upper_bound": "Y2l0eV9kZXNjXzY1OTAzYzMzOWQxMjQwOGZiZmE5MWQyMzNmYmY2NDJm", - "repeats": 1 - }, - { - "count": 202707, - "lower_bound": "Y2l0eV9kZXNjXzY1OWIxMWQ0NzdjZTQxNDNiMDIzNDgzZmZkZDFhNGQw", - "upper_bound": "Y2l0eV9kZXNjXzY2YTc5YWY0MWYyMzRiYmFiMWU5MWE5ODVmMTMzYjcx", - "repeats": 1 - }, - { - "count": 204754, - "lower_bound": "Y2l0eV9kZXNjXzY2YzcyYzI4NTY5MzQ2OTc5MmQ1NzcyMjU5YzY2M2Ex", - "upper_bound": "Y2l0eV9kZXNjXzY3OWE0NDlhMWYwYTQxNGQ5NzI0ZmE3YjhjN2E2YTM0", - "repeats": 1 - }, - { - "count": 206802, - "lower_bound": "Y2l0eV9kZXNjXzY3ZDk3OTIyMWMyODRjOTk5YjI5MTE4ZTMwMWVlMDAw", - "upper_bound": "Y2l0eV9kZXNjXzY5MDE0MjhiZjFjZjRmMzBiODlmMTM5NTgzZTViMDVl", - "repeats": 1 - }, - { - "count": 208849, - "lower_bound": "Y2l0eV9kZXNjXzY5NjZlZmIyNDE5MTQwMDE5NmE2YTM0ODRkNTU2MjFi", - "upper_bound": "Y2l0eV9kZXNjXzZhNThhYmIyYmQ1MjQxMDc5YjkxYmRjNjYxNjhhN2Yx", - "repeats": 1 - }, - { - "count": 210897, - "lower_bound": "Y2l0eV9kZXNjXzZhNmM4OTk1MTZiOTRhZGU4Nzc0MDM1YTMxYWIyYjRm", - "upper_bound": "Y2l0eV9kZXNjXzZiMWZkZjZiOGNiNTRiZDA5NTNkZWY2OGU5NjgzOTg1", - "repeats": 1 - }, - { - "count": 212944, - "lower_bound": "Y2l0eV9kZXNjXzZiNDJmZjVlNGM2YTQ4ZjU4ZjhmMTBmZGZjMTg3ZWVm", - "upper_bound": "Y2l0eV9kZXNjXzZjMDlkMjBiY2Q3MzQ2NTFhZjUxYjQwNGZlZTBjZDM3", - "repeats": 1 - }, - { - "count": 214992, - "lower_bound": "Y2l0eV9kZXNjXzZjMjE0MDJhZWVkYjQxMzFhNTc3MWM1NDI2ZWQ4ZDIx", - "upper_bound": "Y2l0eV9kZXNjXzZjZDQ0YTg2NjVmZjQwN2FhN2RmNzVhNjNmNWNlOTUy", - "repeats": 1 - }, - { - "count": 217040, - "lower_bound": "Y2l0eV9kZXNjXzZjZTMxMzQ0MDUwYzRlY2FiYzI4YjBhMDIxYTFlMGE3", - "upper_bound": "Y2l0eV9kZXNjXzZkYmQxMTE0MjI3ZDQ1ZTZhMmQyMjhhZGY5YzA2YzFm", - "repeats": 1 - }, - { - "count": 219087, - "lower_bound": "Y2l0eV9kZXNjXzZkZTM3MjlmNDYxNjRmYmU4ZDZlNDI5ZTYyYjQzMzZj", - "upper_bound": "Y2l0eV9kZXNjXzZlNzBjNzcwODM3OTQzNjk5NzQ2NzZiNGRjNDYzYmFj", - "repeats": 1 - }, - { - "count": 221135, - "lower_bound": "Y2l0eV9kZXNjXzZlODM5ZTgwMzliODRmNDZiOGI2NDc0NDU5YmNmY2I2", - "upper_bound": "Y2l0eV9kZXNjXzZmYjA2MThjOTRhYzQzYmI5MGNlMjNiZTQ4OTVlY2Q4", - "repeats": 1 - }, - { - "count": 223182, - "lower_bound": "Y2l0eV9kZXNjXzZmZDRhNzU0OTE2NTQ0OGViZDY0NmEzNjg4ZTM2Mjg3", - "upper_bound": "Y2l0eV9kZXNjXzcxMGQ4M2M0YzFkNDRjZDdiYzBkZjdmNWQ1ZDgxY2Ix", - "repeats": 1 - }, - { - "count": 225230, - "lower_bound": "Y2l0eV9kZXNjXzcxMzA4MjNhNGY3YjQxYmJiOGFhYWI0ZDU0YjI4M2M1", - "upper_bound": "Y2l0eV9kZXNjXzcyNjVhYWNmZGM5OTQxYjFiZDdlYTFlN2JkOGM5YmI2", - "repeats": 1 - }, - { - "count": 227277, - "lower_bound": "Y2l0eV9kZXNjXzcyOGVjYjZmZjFhOTRlZmI5ODMwM2IwODdjYWNkMzZm", - "upper_bound": "Y2l0eV9kZXNjXzczNWJkZGIzZDZhMzRlM2ZiMGM1NmViMjNkYWIyMDQz", - "repeats": 1 - }, - { - "count": 229325, - "lower_bound": "Y2l0eV9kZXNjXzczNjQzNzFiYjZlZTRjMjFiZTA3NGJhZDA4NDk2NzU3", - "upper_bound": "Y2l0eV9kZXNjXzc0NmY0YmJjMzQxMzQ4NmJiN2E4MjQzYjQ4MWQzYTlm", - "repeats": 1 - }, - { - "count": 231372, - "lower_bound": "Y2l0eV9kZXNjXzc0NzcxM2RiMGQzMjQ0ZTdiMGY1MWEzY2Q4NDM5MTNl", - "upper_bound": "Y2l0eV9kZXNjXzc1NDJlNmMzMjc3ZjQ2N2JiZWQ3Y2MwOTM5OTQ0M2Ey", - "repeats": 1 - }, - { - "count": 233420, - "lower_bound": "Y2l0eV9kZXNjXzc1NGQ5MjhjMGM1ZDQ4ODZhNDNiOWU3ODEwNWRhNjYz", - "upper_bound": "Y2l0eV9kZXNjXzc2MDgzNjIyMTdhNDQ4MDI5NjU1ZmYxNGM3MDE0ZDZi", - "repeats": 1 - }, - { - "count": 235468, - "lower_bound": "Y2l0eV9kZXNjXzc2MjExNDIzZGUxNTRmYjA4MTFhMjIxOWE4MTY1YmQ2", - "upper_bound": "Y2l0eV9kZXNjXzc2YzczN2M2ZmI1MDRhMTA4YThjMzAzNzdlOWQxNjg3", - "repeats": 1 - }, - { - "count": 237515, - "lower_bound": "Y2l0eV9kZXNjXzc3MDJhOTg3MmMzMTQ1ZTQ4ODE3NWRhMWQzMzQ2MDYz", - "upper_bound": "Y2l0eV9kZXNjXzc3Y2U4MzQzZjdhMzRlYmNiYTRlZDZiNmEzMGRjZGZm", - "repeats": 1 - }, - { - "count": 239563, - "lower_bound": "Y2l0eV9kZXNjXzc3Y2Y2ZThiOTk3NTRjODNiYWMyNjZiNGY3MzVlZTQx", - "upper_bound": "Y2l0eV9kZXNjXzc4YzVkMzM1MzkyNzQxZGM5NDVmY2Q1ZGFlZGFiYTAy", - "repeats": 1 - }, - { - "count": 241610, - "lower_bound": "Y2l0eV9kZXNjXzc4ZGEzNDkxMWZlOTQyNTk5ODEwY2VhZWI1MjUxNzM5", - "upper_bound": "Y2l0eV9kZXNjXzc5OGI1ZmE4OTM1MzRmOGY5ZTRmZDFiM2QzZTJkZmUw", - "repeats": 1 - }, - { - "count": 243658, - "lower_bound": "Y2l0eV9kZXNjXzc5OTY4ZjQ4NmE4YjQyYzk4NmY1NzYwYzg5ZTJiNWEx", - "upper_bound": "Y2l0eV9kZXNjXzdhYjU4MmUxNTMwNDRhMDlhMGU4YmQ5NjAzY2ZkMGNl", - "repeats": 1 - }, - { - "count": 245705, - "lower_bound": "Y2l0eV9kZXNjXzdhYjY5N2FlMmJjMDQ0MzU5MjZkNWVmNzE4YzNlZTI3", - "upper_bound": "Y2l0eV9kZXNjXzdiZTFiNTNmZjIzNDQ0NzRiZjA3MzBjODEyMjkxYjYx", - "repeats": 1 - }, - { - "count": 247753, - "lower_bound": "Y2l0eV9kZXNjXzdjNDcwZGU1ZjgwNzQzZGI5ZmExNWRkYjc2YTY4N2Q0", - "upper_bound": "Y2l0eV9kZXNjXzdkNjQ1ZThhOWZhNDQ3OTNiNzhkNDA1OGE3MGE1ZTE5", - "repeats": 1 - }, - { - "count": 249800, - "lower_bound": "Y2l0eV9kZXNjXzdkNmUwYjZmNzU3MzQxMWQ4NjBjZTgxMjY0ODVjZjlh", - "upper_bound": "Y2l0eV9kZXNjXzdlMmU0ZmJiYmRhZjQ0MjY4ZTY1MDg1ZmI2OGFlNDIx", - "repeats": 1 - }, - { - "count": 251848, - "lower_bound": "Y2l0eV9kZXNjXzdlMzgyMjQ3MmJiMzQzNDg4NjcyNDc3Mjc0NWE5OWQz", - "upper_bound": "Y2l0eV9kZXNjXzdmM2RlNThhYTNlMjQxNTFhYTY5NDFkZDAzYjFjODEy", - "repeats": 1 - }, - { - "count": 253895, - "lower_bound": "Y2l0eV9kZXNjXzdmNGM0N2QzN2FmNTQ5MDE5NzA3ZDdkYWFmNzUyZTRm", - "upper_bound": "Y2l0eV9kZXNjXzgwMTc2ODI5MDMxYzQyYmVhOWUyOGJkYzgwNmM2NzA2", - "repeats": 1 - }, - { - "count": 255943, - "lower_bound": "Y2l0eV9kZXNjXzgwNzRjNjFkZTA0MjQwODE4OTk3MzAzOTFmNmQ2MTQ4", - "upper_bound": "Y2l0eV9kZXNjXzgxMTMwOTFmMjY3YTQwMWRiZDlhNDZlZTRjMGQ4MmQz", - "repeats": 1 - }, - { - "count": 257991, - "lower_bound": "Y2l0eV9kZXNjXzgxMTVlNWM3YTNlZTQyNjFiYjhjYjViYmZhNjNiMzk5", - "upper_bound": "Y2l0eV9kZXNjXzgyMGNkYWU0MWE2ZTQwODQ4MDA2MGRkNTZlYjlhNDU0", - "repeats": 1 - }, - { - "count": 260038, - "lower_bound": "Y2l0eV9kZXNjXzgyMTk0ODgwOTIxODQ4OTY5ZjAxZjI2MjIwNGI0YjZk", - "upper_bound": "Y2l0eV9kZXNjXzgyZjg2OWFiMDljODQ0Mjg4OWQzYTlmNjYzZGU4OTE1", - "repeats": 1 - }, - { - "count": 262086, - "lower_bound": "Y2l0eV9kZXNjXzgzMWUyYjRiYmZjNDQ5Nzg5OTZjNTZlZmYzNzFiYjg4", - "upper_bound": "Y2l0eV9kZXNjXzgzZTZkMWJhNzU2ODRlZjVhNjM4ZjA3OWZmMjhkZmE1", - "repeats": 1 - }, - { - "count": 264133, - "lower_bound": "Y2l0eV9kZXNjXzgzZTk0MGJkZWY4YTRhNjBiMmRjNDE5YTI3ODI1MmE4", - "upper_bound": "Y2l0eV9kZXNjXzg0ZDIzMDI2ZmFjZjRlMjdhMmM2NTA5MjczNzI2NTIx", - "repeats": 1 - }, - { - "count": 266181, - "lower_bound": "Y2l0eV9kZXNjXzg0ZmRmYjI5ZjVjZDRkNDFiZmUzMDBkMWFhYzNlZGM4", - "upper_bound": "Y2l0eV9kZXNjXzg1Y2IxMWZkMDU1ZjRjYmFhYWRmYmRkNDE5YjM4ZWQ3", - "repeats": 1 - }, - { - "count": 268228, - "lower_bound": "Y2l0eV9kZXNjXzg1ZGJhZTEzNWU4OTQ0MGY4ZjI2YzA5ZmM3OWNlOWJm", - "upper_bound": "Y2l0eV9kZXNjXzg2ZjhjMzM5M2JkMTQ0MjVhMmU2NDY5OGRmNTE1OWMz", - "repeats": 1 - }, - { - "count": 270276, - "lower_bound": "Y2l0eV9kZXNjXzg3MDVjZWU4N2M2NzRjZmFhZWIyNDgzYzE2ZTlhYjg1", - "upper_bound": "Y2l0eV9kZXNjXzg3ZTMwOTVlNDkxNjRkYWViOTk2YTZkMTJmNTNlZjNi", - "repeats": 1 - }, - { - "count": 272323, - "lower_bound": "Y2l0eV9kZXNjXzg3ZWVmYTAxZTNmNjQxMTI5NGY3ODc4MWIzM2Y4ZWQ1", - "upper_bound": "Y2l0eV9kZXNjXzg4Y2RhM2M2YzJlYzQ5YzU4NGRhMzMyYTBkZWUwMDBk", - "repeats": 1 - }, - { - "count": 274371, - "lower_bound": "Y2l0eV9kZXNjXzg4ZWY3ZmNkYzgxMTQ2NTRhY2NlMzA2Yjc1MjVjN2M3", - "upper_bound": "Y2l0eV9kZXNjXzg5ZTY3ZjY3ODc5YTRlODFhNTY2YzVkN2NiZWM2NTJh", - "repeats": 1 - }, - { - "count": 276418, - "lower_bound": "Y2l0eV9kZXNjXzg5ZWE3YWMwMTYzODRjOGFiYzdlODBhYmQ5YzgxNmE5", - "upper_bound": "Y2l0eV9kZXNjXzhiMDRiNzMyY2QwMDQ3MjY5MmQyZWQwNDlkNzQ4OWE1", - "repeats": 1 - }, - { - "count": 278466, - "lower_bound": "Y2l0eV9kZXNjXzhiMDcxNDEzYmY2MDRkNDFhNDY2N2ZlMTE2MWVkNjZm", - "upper_bound": "Y2l0eV9kZXNjXzhiNzA3ZDMxZWFlNDQ1NTRhY2FmMDRkMzNmMTQxZmM2", - "repeats": 1 - }, - { - "count": 280514, - "lower_bound": "Y2l0eV9kZXNjXzhiN2RmZjJiYTdiMzRhY2U4NzMyYTNiN2QyNjhmMTk3", - "upper_bound": "Y2l0eV9kZXNjXzhjODRmMmJiNzZjYTQxMTQ4OGMxZGZlNTQxZTY5YTIy", - "repeats": 1 - }, - { - "count": 282561, - "lower_bound": "Y2l0eV9kZXNjXzhjOGUwNmZmZWRjNDQ2M2Q4YjQ1ZDY2NjkwMmE0ZTdl", - "upper_bound": "Y2l0eV9kZXNjXzhkOTc2NDU3Mzk2NTQxNTc5ZTQwMmE2MTU4YzcxZDE3", - "repeats": 1 - }, - { - "count": 284609, - "lower_bound": "Y2l0eV9kZXNjXzhkYjU2MzQ1OWM4YTQ1OWI5MzYzYjE5NDlkMWU1NGRh", - "upper_bound": "Y2l0eV9kZXNjXzhlZjg1MzA1NjBlZTQ5MmU5ZmJmMThiZGRiZTFhMzM1", - "repeats": 1 - }, - { - "count": 286656, - "lower_bound": "Y2l0eV9kZXNjXzhmMGZiOTQyZmZkOTQ5YTg4MDczYWZjZjkxNmZlMGIw", - "upper_bound": "Y2l0eV9kZXNjXzkwMDk3OWExNTg4ZTQwMWNiYzc3YTg0ZmQ2YTRiZjRk", - "repeats": 1 - }, - { - "count": 288704, - "lower_bound": "Y2l0eV9kZXNjXzkwMGRhNGU4M2NjMzRlZDI5NTA5ODllNDc4ZDIzYTkx", - "upper_bound": "Y2l0eV9kZXNjXzkwZmQ4NzYzNjkxZDRiMjNiMmU1YWEzYWE5ZWM0NTZi", - "repeats": 1 - }, - { - "count": 290751, - "lower_bound": "Y2l0eV9kZXNjXzkxMTM0ZmY3NDMyOTRkY2VhNTNhMjc5OGFlZjA2OThi", - "upper_bound": "Y2l0eV9kZXNjXzkyYTYyMTI5ZjY2YTRhZjhiMGMyYWEwYzI0YzVhZWU0", - "repeats": 1 - }, - { - "count": 292799, - "lower_bound": "Y2l0eV9kZXNjXzkyYjM5MGNkZGFiMzQ1NWU5MjMwZjhkNDIxOGMyYTBl", - "upper_bound": "Y2l0eV9kZXNjXzkzYWFmOGI1OWEyYzQ4MDhhZjFkNTRkMTZhZTlmZTNi", - "repeats": 1 - }, - { - "count": 294846, - "lower_bound": "Y2l0eV9kZXNjXzkzYzJmYjFkZjc3NDRlMmZhNWJlOWE1ZTBhMmNiNWJl", - "upper_bound": "Y2l0eV9kZXNjXzk0OTUxN2ZjOTdlMzRmYzE5ZmFiMWMyZDM0YTcxYWM2", - "repeats": 1 - }, - { - "count": 296894, - "lower_bound": "Y2l0eV9kZXNjXzk0YTExOWY4ZTcwYTRlMmE4ZDIyNzU3MTA0MTExYjc5", - "upper_bound": "Y2l0eV9kZXNjXzk1NmI0YTc3MTU1ZjRlMWJhMmYyNDUyODVkZWQwZDI3", - "repeats": 1 - }, - { - "count": 298942, - "lower_bound": "Y2l0eV9kZXNjXzk1OTRjYmVhNzYyMzRhN2FiZTU1ZWEyYWYyOGNlM2Zh", - "upper_bound": "Y2l0eV9kZXNjXzk2NjlmMWJiZmFkMDQ1YzA5ZjI3NmNmYWNjNDBhYzFm", - "repeats": 1 - }, - { - "count": 300989, - "lower_bound": "Y2l0eV9kZXNjXzk2YmY5OTc4YzYzNzQwYmM5MDU3ZWJhY2VjZDM2OTQ3", - "upper_bound": "Y2l0eV9kZXNjXzk3NmZmYzgzNGRkOTRiYjE4ZDJiYzcyZTA4ZDMxOWRi", - "repeats": 1 - }, - { - "count": 303037, - "lower_bound": "Y2l0eV9kZXNjXzk3NzQ3NDIyNGVkYTQwMWU4MGYxZmE0NmE0M2QxNWY3", - "upper_bound": "Y2l0eV9kZXNjXzk4M2RjYTA1OTE3MTQzMDA4OWQxMDhkOTZmYjhmY2Qx", - "repeats": 1 - }, - { - "count": 305084, - "lower_bound": "Y2l0eV9kZXNjXzk4NDUyODg0ZTgxNzRkZTBiZDgwNmZmZTFhOWM4ZTk0", - "upper_bound": "Y2l0eV9kZXNjXzk4YWJlNTBkNmUwYTQ5N2E4OTRhYjEwYTdiMzdkOWE1", - "repeats": 1 - }, - { - "count": 307132, - "lower_bound": "Y2l0eV9kZXNjXzk4YjM1N2JkMDI4NjQ3MGM4NGQ4ODY2YmVlMjM4Y2Uy", - "upper_bound": "Y2l0eV9kZXNjXzk5OWI5OTFmMjRlMjRiMmJhZDA1NjU3YTg1Mjg3Yjkw", - "repeats": 1 - }, - { - "count": 309179, - "lower_bound": "Y2l0eV9kZXNjXzk5YTJmMmNiZGY1ZDQzOTY5MjNlMjI4MjEwYWJmNTZh", - "upper_bound": "Y2l0eV9kZXNjXzlhNjQ2M2U4ZGMxMTQ5MmRhNzM2MmJhMzJlZmZmM2E0", - "repeats": 1 - }, - { - "count": 311227, - "lower_bound": "Y2l0eV9kZXNjXzlhN2IxYThhZDgyMDQ0MTE5ZGVkNWQyZjFjNjY0NmVj", - "upper_bound": "Y2l0eV9kZXNjXzliNTE2NWFkNGE3YzQ4Yzc4YjZhNzFkMjU5NTE4MmE0", - "repeats": 1 - }, - { - "count": 313274, - "lower_bound": "Y2l0eV9kZXNjXzliNWM5M2FmYWE1ZDQzOWZhZTdjMDAxODE3OTRhNzBi", - "upper_bound": "Y2l0eV9kZXNjXzljMzNlOTY3MWNiYTQ3MmI5ZTg1OTI3OWM2ZDRjNjY3", - "repeats": 1 - }, - { - "count": 315322, - "lower_bound": "Y2l0eV9kZXNjXzljNTA2MWMzMzE1MjRmOTRhMjkyM2UzNzVkNmZjNTYx", - "upper_bound": "Y2l0eV9kZXNjXzlkNDNkNmJiMjk0NTQzNzc5ODY0NDg2ZGY1OThkYTNk", - "repeats": 1 - }, - { - "count": 317369, - "lower_bound": "Y2l0eV9kZXNjXzlkNDY5MDBkMGE2MjQyZDY5NzU4NjlmYzdmMTg4MDYz", - "upper_bound": "Y2l0eV9kZXNjXzlkZjVmOGJlMDA1NDRhYWM5YmZjODhmNzU4MDk3ZDRi", - "repeats": 1 - }, - { - "count": 319417, - "lower_bound": "Y2l0eV9kZXNjXzllMGQwMmQwNTUxNTQ1MmNiZWFkNDM2NzJhOWRjMzhj", - "upper_bound": "Y2l0eV9kZXNjXzllZGIxNWViNzRhMTRmMmQ5OGRmZDVmMzI4YzI3MmZl", - "repeats": 1 - }, - { - "count": 321465, - "lower_bound": "Y2l0eV9kZXNjXzlmMDkyNzAzOGVhZTQ2ZDdiOTZmNjczMmQwNTQyMWMy", - "upper_bound": "Y2l0eV9kZXNjXzlmZGQzN2IyNWE4OTRmZjVhMzc5MmFkNDZjMDVhMzEx", - "repeats": 1 - }, - { - "count": 323512, - "lower_bound": "Y2l0eV9kZXNjX2EwMzZiZGU2MThiNzQzZTRiMDYwMGRkZTgwZjk0NWEw", - "upper_bound": "Y2l0eV9kZXNjX2ExMTJkMDAyN2I0MjQwMjE4OTgxNTA0NGI5YWNhZWZi", - "repeats": 1 - }, - { - "count": 325560, - "lower_bound": "Y2l0eV9kZXNjX2ExMWVjNjIwNThjZTRiNmU5ZWRjNzliZGE0MTA2NGVi", - "upper_bound": "Y2l0eV9kZXNjX2EyNjUzODI3YmNiYTQ2N2I4OWMxYzc2Y2MyZThmYjRk", - "repeats": 1 - }, - { - "count": 327607, - "lower_bound": "Y2l0eV9kZXNjX2EyNzU0MDE3NDYxODRiMmFhYTc1NTg5NmIxOTMwY2M0", - "upper_bound": "Y2l0eV9kZXNjX2EzMzlkNWZkYmMyYzRkMjJhMGM4MWQxMWQ2Mjc5MjAw", - "repeats": 1 - }, - { - "count": 329655, - "lower_bound": "Y2l0eV9kZXNjX2EzNjA4OTVlMjYxNDQ4ZDQ4ZjAwNjI4NWFkNjBmMTZi", - "upper_bound": "Y2l0eV9kZXNjX2E0MWJhMTMzNjBmOTRlN2E5ZDE4ZjVkMzE3M2JkODY3", - "repeats": 1 - }, - { - "count": 331702, - "lower_bound": "Y2l0eV9kZXNjX2E0MjY5ZjBmOGExMjQxOGI4NGYwYzY3YmQ3NjNjMzQ1", - "upper_bound": "Y2l0eV9kZXNjX2E1MDcxODY1NWEwODQ4OGJhY2U2ZGQ5ZDA3Mzk1ZjU2", - "repeats": 1 - }, - { - "count": 333750, - "lower_bound": "Y2l0eV9kZXNjX2E1MGM5MDU5MGNlNDQ5ZGY5YmU4NGRlNTIxYjQxYzI3", - "upper_bound": "Y2l0eV9kZXNjX2E2MDhjMWQ4MDcxZTQ0NjJiMTE4MDlkZTA4NzFlYmI4", - "repeats": 1 - }, - { - "count": 335797, - "lower_bound": "Y2l0eV9kZXNjX2E2MGQ0MDg5ODE1ZDQxMzNiOTYyZmQzMTRkZTczMWQ2", - "upper_bound": "Y2l0eV9kZXNjX2E2YjNhOWE3MDM0MTRkNWQ4Y2RkMzI0M2Y0YjE2ZjAw", - "repeats": 1 - }, - { - "count": 337845, - "lower_bound": "Y2l0eV9kZXNjX2E2Yjc0NDI1ZWJiZTQ0NmNhNWM4MzYzMzJkOWI3YWI3", - "upper_bound": "Y2l0eV9kZXNjX2E3OGYzMGM1OGE3ODQzMzhhYzAzNjUxNjk0NTBjOTc1", - "repeats": 1 - }, - { - "count": 339892, - "lower_bound": "Y2l0eV9kZXNjX2E3OGZkMWVkMzI1MjRmMGU4ZjFkY2I1YzEzOWUzNTA3", - "upper_bound": "Y2l0eV9kZXNjX2E4ODg4MDI5NDM4MjRjODliOTU3NzU3YWZlNDQyMjU3", - "repeats": 1 - }, - { - "count": 341940, - "lower_bound": "Y2l0eV9kZXNjX2E4OGVmNDA1NDdkMDRkNjU5MzY0OTViMWFlYjZmNzA1", - "upper_bound": "Y2l0eV9kZXNjX2E5OTliODJhOTBmNzRlMmJiY2JlMDdhMDcwMzY5OTZk", - "repeats": 1 - }, - { - "count": 343988, - "lower_bound": "Y2l0eV9kZXNjX2E5YjAwNTM5YWRkNjRjYTNiNjc0MWE4MjE2MTgxNTgw", - "upper_bound": "Y2l0eV9kZXNjX2FhOTlkNzhkY2Y4ZjQ3NThiZDU4Nzc0Y2NjZjRjZDc4", - "repeats": 1 - }, - { - "count": 346035, - "lower_bound": "Y2l0eV9kZXNjX2FhOWM2ZGJmNzU0YzRlMTI4NGFjNzUzOWZjZDcyNWQ3", - "upper_bound": "Y2l0eV9kZXNjX2FiN2I3YTkxZDgyNDRhN2Y5N2E2NDJlYTBjNDA5Y2Vj", - "repeats": 1 - }, - { - "count": 348083, - "lower_bound": "Y2l0eV9kZXNjX2FiOGNjOTIwOGVkOTQ0MTM4M2YyN2U3ODBjMTNlZGJj", - "upper_bound": "Y2l0eV9kZXNjX2FjN2Y1MmRmZmIzYzRlZjI4MjU4OTU3NWQ2ZWI2YTlh", - "repeats": 1 - }, - { - "count": 350130, - "lower_bound": "Y2l0eV9kZXNjX2FjOTJjNjJkNjU0MjQ0OTU4ODkyY2I1ZDdjYjM3ZjY1", - "upper_bound": "Y2l0eV9kZXNjX2FkOGE5ZDBhNzA3NTRmZjRhZDY0MmQzOWNmM2Y0OWM0", - "repeats": 1 - }, - { - "count": 352178, - "lower_bound": "Y2l0eV9kZXNjX2FkYzdmNzU4MmM4YTRmM2I4MmVlZWMzNDk0YzUwZjAz", - "upper_bound": "Y2l0eV9kZXNjX2FlNzlkMWQzY2YyYTRjNzI5YzJkMjA4NzJjNDUwNmQ0", - "repeats": 1 - }, - { - "count": 354225, - "lower_bound": "Y2l0eV9kZXNjX2FlOGE0YmIyYjA3ZDQ5MzI5YjkxYTI5M2YyZWUyODIy", - "upper_bound": "Y2l0eV9kZXNjX2FmNDMxMWUzYTg5NjQyZmRiYTE4NGQ3NDExOWJiZGFl", - "repeats": 1 - }, - { - "count": 356273, - "lower_bound": "Y2l0eV9kZXNjX2FmNWE0ZTUwMWQ3ZjQxMDc4OTk4NTM1M2E0ZDVmOGU4", - "upper_bound": "Y2l0eV9kZXNjX2IwNWExMjJlNzI3MjRmYzRiZjk0YzdkNDQyODczMTg2", - "repeats": 1 - }, - { - "count": 358320, - "lower_bound": "Y2l0eV9kZXNjX2IwNzQwM2I2ZGNmYjQyM2Y5ZmY2MmQxYzhkYmY2ZjNl", - "upper_bound": "Y2l0eV9kZXNjX2IxZDY0YjZiZDVlNDQyMTg5OThiNTUzMDg2YWNmNTZl", - "repeats": 1 - }, - { - "count": 360368, - "lower_bound": "Y2l0eV9kZXNjX2IyMDlmOTYwNGFhYjRkNjg5YzU0NWVkNTI2OTJkMDY1", - "upper_bound": "Y2l0eV9kZXNjX2IyYzEyOTVmNzZjZTQyOTNhYTFhZDlhNTk5OTUzMDIw", - "repeats": 1 - }, - { - "count": 362415, - "lower_bound": "Y2l0eV9kZXNjX2IyZTQ5MTI5ZDliYjQwOGE4MmJkZTBlMzdlMmRiNmU0", - "upper_bound": "Y2l0eV9kZXNjX2I0M2FmMWQwMDNlNDRjY2NhZWZhMTA4NmIyMTQwYTAy", - "repeats": 1 - }, - { - "count": 364463, - "lower_bound": "Y2l0eV9kZXNjX2I0NGJhOTQ1YjNhZTQ4ZDM5YWJkMTAwYzIwZTc3NDNk", - "upper_bound": "Y2l0eV9kZXNjX2I1MTEwODliMGNhMTRkOWRhNGZkYzlhNzc4MjQ2ZTdm", - "repeats": 1 - }, - { - "count": 366511, - "lower_bound": "Y2l0eV9kZXNjX2I1MjVhMGM1MDA2YTQ2YzE5ZWFmMmZiMzc3ZGQ4NDIw", - "upper_bound": "Y2l0eV9kZXNjX2I2OGMyN2NhMjYwNzQ0ZTU5YTE2ZmQwYmYyYWQyMDdk", - "repeats": 1 - }, - { - "count": 368558, - "lower_bound": "Y2l0eV9kZXNjX2I2YzhjNmUzZTE4MjRhNmRhZTc3MmFmOTNkYmZjNTBk", - "upper_bound": "Y2l0eV9kZXNjX2I3NjM0ZmM4NjNhODRjNDM4NWY4MzU5Mzg3YjdjZmMy", - "repeats": 1 - }, - { - "count": 370606, - "lower_bound": "Y2l0eV9kZXNjX2I3NzcwOGMwMjk5ZjRmNTFhYWM2N2Y4NWI5YzdiNzE3", - "upper_bound": "Y2l0eV9kZXNjX2I4ZjQ5MmQwNzgwMTRhYmVhN2JmNDFjMmMyZDgwMDg1", - "repeats": 1 - }, - { - "count": 372653, - "lower_bound": "Y2l0eV9kZXNjX2I4ZjU3MDAzYmI5NTQzZDA5OWViNjJjZDI3ZWJkMmQ0", - "upper_bound": "Y2l0eV9kZXNjX2I5YjQ4YWQ3NmJiMzQ4Y2I4ZjU1NTU3YWRkZGQ1MGQy", - "repeats": 1 - }, - { - "count": 374701, - "lower_bound": "Y2l0eV9kZXNjX2JhMTQwZDE5ZGIzZTQ2MjY5MjVhMWMzZTI4NzI3N2Zh", - "upper_bound": "Y2l0eV9kZXNjX2JhZWEyYTE3MDBkMjQzNTY5NDk1M2Q0NDY3YjUxZDZk", - "repeats": 1 - }, - { - "count": 376748, - "lower_bound": "Y2l0eV9kZXNjX2JiMDBkNjFhZmYxYTRjNjNhM2E0ZDIzMmE0NjQ4MDE1", - "upper_bound": "Y2l0eV9kZXNjX2JjNGZjYzcxYmI2NTQxZTY5YjJhNmY5M2U3MGUzY2My", - "repeats": 1 - }, - { - "count": 378796, - "lower_bound": "Y2l0eV9kZXNjX2JjNTBiYmFmMTMzYzQxNmNhMzNmNmZhNDViN2UwNTM3", - "upper_bound": "Y2l0eV9kZXNjX2JkMmQxZmE4MmMwODRlYzA5Mzk0ZDg5NjZlOGYxMGE0", - "repeats": 1 - }, - { - "count": 380843, - "lower_bound": "Y2l0eV9kZXNjX2JkMzZlYTFjNzk3YzRiY2E5NWMyNGNiZGIwZTAxZDBh", - "upper_bound": "Y2l0eV9kZXNjX2JlNzhhYmYyZjYyODRjNWY5YjRlZjNiM2M5NGMwMjVh", - "repeats": 1 - }, - { - "count": 382891, - "lower_bound": "Y2l0eV9kZXNjX2JlYjA5YTBiODIwYTRmOWQ5Yjg2ZTgzY2I5NTcxYzAx", - "upper_bound": "Y2l0eV9kZXNjX2JmOWRiNmY3ZmY5OTRmNzM4OWI2NWYwMjA0MjZmNzUx", - "repeats": 1 - }, - { - "count": 384939, - "lower_bound": "Y2l0eV9kZXNjX2JmYjAyNzQ5MTVjNTQ0MTk5Yjg2ODA3M2MyNjRjMGZm", - "upper_bound": "Y2l0eV9kZXNjX2MwZjZiOGZkMDE3ODRjMTViZGMwMDFlMDFjN2FhMmM1", - "repeats": 1 - }, - { - "count": 386986, - "lower_bound": "Y2l0eV9kZXNjX2MxMTEyYzZlNWIwOTQzM2U5MjA5NDM4YjJkZGU0YjY3", - "upper_bound": "Y2l0eV9kZXNjX2MyYjViNzdiMDBmZDRmNzJiMzFlMDM4MWM2ZjVjMTYw", - "repeats": 1 - }, - { - "count": 389034, - "lower_bound": "Y2l0eV9kZXNjX2MyYjlhNmM0ZDMzOTQyYjhhNDU1ZDk2Y2M0NzRhZTA3", - "upper_bound": "Y2l0eV9kZXNjX2MzZWMyZWQ4NzE1ODRmYzc5NTY1Y2Y5NTliZWRjYzM0", - "repeats": 1 - }, - { - "count": 391081, - "lower_bound": "Y2l0eV9kZXNjX2M0MTE4MmRiZTk3OTQ1MzQ5YmEzYWVkMzAzZWVlNzVi", - "upper_bound": "Y2l0eV9kZXNjX2M0ZjE0NDQ5NWJkOTQ1NTliYzRiYTI4NmM5ZWJkMjI4", - "repeats": 1 - }, - { - "count": 393129, - "lower_bound": "Y2l0eV9kZXNjX2M1MDFkNzI0YjUwZTQ0MDNiZDc1Njc2ZTgxY2ZkZjVi", - "upper_bound": "Y2l0eV9kZXNjX2M1YTg4MGNmZmQzNjQ2YWZhNTM4N2MyZGIyY2RlNjQ2", - "repeats": 1 - }, - { - "count": 395176, - "lower_bound": "Y2l0eV9kZXNjX2M1YWEyOTQ4YTZiMDQ1ZmY5ZTMwMTBjOWNlMmRhOWE3", - "upper_bound": "Y2l0eV9kZXNjX2M2ODI3NGI4NmFlMzRiMDc5N2ZhNDYwN2MxNzM4Zjlj", - "repeats": 1 - }, - { - "count": 397224, - "lower_bound": "Y2l0eV9kZXNjX2M2ODI5YzljZTRjMzQzNTA5YzI3NzI5YmYxMjJlNjY3", - "upper_bound": "Y2l0eV9kZXNjX2M3NTM5NWE2NjJiMjQ3YWJiY2FiNzQ3NWRiMWEzYjUy", - "repeats": 1 - }, - { - "count": 399271, - "lower_bound": "Y2l0eV9kZXNjX2M3YzVjNjA1Yzk5YjRlNmJiZGYzZjVlMzMyMWMzYmM4", - "upper_bound": "Y2l0eV9kZXNjX2M4NzhjODE4ZmUyODRhNGY4M2Q3Mjc4NzllM2U4ZmE5", - "repeats": 1 - }, - { - "count": 401319, - "lower_bound": "Y2l0eV9kZXNjX2M4OGI3MzZiNGNmNTRjYjk5ZjUyMmEwNmEyNTZjNDU4", - "upper_bound": "Y2l0eV9kZXNjX2M5YmZjMzBlYzAwNjRmZTM4YzczNjRjNTQ1NWYyNWJl", - "repeats": 1 - }, - { - "count": 403366, - "lower_bound": "Y2l0eV9kZXNjX2M5ZDA5MWQzNTQxYTQ1ZmE4NWU4NWIwNGZiMWQxOWJm", - "upper_bound": "Y2l0eV9kZXNjX2NhN2QzZjM1YTA2ZjQ1MzU4OWI2M2JiNjJlYTU5ZTli", - "repeats": 1 - }, - { - "count": 405414, - "lower_bound": "Y2l0eV9kZXNjX2NhODFhNTk2MjgzOTQ0ZjI4NWE0Yjk3MmJjMjE0YzEy", - "upper_bound": "Y2l0eV9kZXNjX2NiODQyMWUwN2IyZjRjYWZhYThlMDlhN2Y5NzQzNzZi", - "repeats": 1 - }, - { - "count": 407462, - "lower_bound": "Y2l0eV9kZXNjX2NiYTU4MTY3Yzg1ODQxY2RhMDJmYmZjZWQ2ODZiMTFi", - "upper_bound": "Y2l0eV9kZXNjX2NjOGRmOGEwZGY1MzQ1ZmRiMjRkMTJlNGFkZWVhYzQ0", - "repeats": 1 - }, - { - "count": 409509, - "lower_bound": "Y2l0eV9kZXNjX2NjOTMyYTk3Y2FlOTQ1YmM4MzA3YjdjMjE4NDFhY2Qx", - "upper_bound": "Y2l0eV9kZXNjX2NkMjVhMTAzYWY2YTQxZDM5MjdlNjlmZDQ4Njc2MDM1", - "repeats": 1 - }, - { - "count": 411557, - "lower_bound": "Y2l0eV9kZXNjX2NkMmM1YjgwYzA1NDRlMjE4ZWRiZTAxYTZlYjgxNTNh", - "upper_bound": "Y2l0eV9kZXNjX2NlNGQzOThmNWFiZTQ5MTQ4N2MwNDgxN2EwMjRmNzI0", - "repeats": 1 - }, - { - "count": 413604, - "lower_bound": "Y2l0eV9kZXNjX2NlODc1ZWZjYjVhNzQ5ODk5M2I0ZGZlYTNlN2MxOGRl", - "upper_bound": "Y2l0eV9kZXNjX2NmNGUyNDJkOTk3ZTQyM2M4MjkxOGI2ODU4ODkyZjQ0", - "repeats": 1 - }, - { - "count": 415652, - "lower_bound": "Y2l0eV9kZXNjX2NmNzA1YTI0NzM0ZjQxMzk4OWQ0YTg1YjRlMGI5MDY1", - "upper_bound": "Y2l0eV9kZXNjX2QwMmVjMTU0ODY2NjQ3Yjg4ZjgxMjY4NjNjM2YxN2Nk", - "repeats": 1 - }, - { - "count": 417699, - "lower_bound": "Y2l0eV9kZXNjX2QwNGFkYjQzNjg0NjQwZjliZGE5Zjg5MGIzMDlhOGVi", - "upper_bound": "Y2l0eV9kZXNjX2QwYzA3NWRjMjc2ODQxN2FiZDQ5NzQ0OWNlZDhlOWQy", - "repeats": 1 - }, - { - "count": 419747, - "lower_bound": "Y2l0eV9kZXNjX2QwY2JiM2VkYzg4OTQyN2ZiNTA1NzMyNjg4OTJmNGNh", - "upper_bound": "Y2l0eV9kZXNjX2QxNjc1MmU3ZmRjMDQzZmQ4MzU4MmFmMTg2NjhhNGNl", - "repeats": 1 - }, - { - "count": 421794, - "lower_bound": "Y2l0eV9kZXNjX2QxNjc5MzRiZmY5MTRmMDc4MDA2MTcyZWYzNGU0OWE0", - "upper_bound": "Y2l0eV9kZXNjX2QyNzg4MWVkNGJjZDQzZTA4ZmQxYTFlNjEwOGI1MzU4", - "repeats": 1 - }, - { - "count": 423842, - "lower_bound": "Y2l0eV9kZXNjX2QyYmE4NGM4MWY3OTQzMDJhY2ViZTU4NDUyYWYwNWQy", - "upper_bound": "Y2l0eV9kZXNjX2QzYWI4ZDNlYTY1YzQzNDFhY2MzOTMwZGYyYjIwMTkw", - "repeats": 1 - }, - { - "count": 425889, - "lower_bound": "Y2l0eV9kZXNjX2QzZGE2N2JhYWI0OTQ5M2JhNDNmNjk1NzhhNGI2N2U3", - "upper_bound": "Y2l0eV9kZXNjX2Q0OWFjZTEwNzA0YTRmZGRiODgwZDNjNDE3ZTg0ZGFj", - "repeats": 1 - }, - { - "count": 427937, - "lower_bound": "Y2l0eV9kZXNjX2Q0YzdkYjk0YWI3OTRkZmZiMDVhMDE0YmZkM2U1ZGQ3", - "upper_bound": "Y2l0eV9kZXNjX2Q1ZWNiZGY2YmE3NTQ5ZmQ4MDBiOTk2ODZkMTdlYTlm", - "repeats": 1 - }, - { - "count": 429985, - "lower_bound": "Y2l0eV9kZXNjX2Q1ZWVhYzA4ODdmZDQ4MzliYzM3YTRlMjRiMjgzNzg3", - "upper_bound": "Y2l0eV9kZXNjX2Q3MmU3ZTkxNTgwZTRjNzQ5MzgwZDg1NzY5MjdmMThl", - "repeats": 1 - }, - { - "count": 432032, - "lower_bound": "Y2l0eV9kZXNjX2Q3NTQzM2I2MTg3NDQxYzM5NjljNTAzNzdhNDdkZjBj", - "upper_bound": "Y2l0eV9kZXNjX2Q3ZmI3YWVkYzYwMTQ4MDNiZDA1OTIxY2MwY2Y4Y2Fi", - "repeats": 1 - }, - { - "count": 434080, - "lower_bound": "Y2l0eV9kZXNjX2Q4MjI5ZjI0MTQxMjQ4MmI5MThmZDUwZTU1NGRlNTBh", - "upper_bound": "Y2l0eV9kZXNjX2Q5MTVkMTI3ZDNjYTQ1ZDNiOTdiMDgyMDNlODIyY2U0", - "repeats": 1 - }, - { - "count": 436127, - "lower_bound": "Y2l0eV9kZXNjX2Q5MzY1NjIwODlkNTQyMjRhOTQ4ODQyZTgwOTA3Nzg0", - "upper_bound": "Y2l0eV9kZXNjX2RhMDcxYjJhNTQxNDRjNWY4ZDk5OTI5OTdiYzEyZGE5", - "repeats": 1 - }, - { - "count": 438175, - "lower_bound": "Y2l0eV9kZXNjX2RhMGFkOWYxMDJhMzQ4OWI4YzdiMzY1NGRiMjlkNzJi", - "upper_bound": "Y2l0eV9kZXNjX2RhOThmMDk1YzNjNjQyZTA4M2Q3MTFlZmFhYjgxZGI3", - "repeats": 1 - }, - { - "count": 440222, - "lower_bound": "Y2l0eV9kZXNjX2RhYTUxNTg1MTQ0MjQzZjFiMTI1Njg4MDNkNGRjYTBh", - "upper_bound": "Y2l0eV9kZXNjX2RiNWVlZTE0ZjAwNjRkMTE4MGFjNzQwZGY5MDIxZjYw", - "repeats": 1 - }, - { - "count": 442270, - "lower_bound": "Y2l0eV9kZXNjX2RiODBiOTAyMGY1MTQ4ZjNhY2VhNmU5YzFkZDUwZGNk", - "upper_bound": "Y2l0eV9kZXNjX2RjN2E1OGFjNDYxYzQ3YTg4ZmJkMjg0YTQzMTM5M2U1", - "repeats": 1 - }, - { - "count": 444317, - "lower_bound": "Y2l0eV9kZXNjX2RjN2FjYWJkMjcxZTQ4Y2M5ZWI2ODFiODk4ZDBjN2Iy", - "upper_bound": "Y2l0eV9kZXNjX2RkMGFjNDhiMzA2ZjQyZDg4MTQ2NzEwMzliMGEzYWNl", - "repeats": 1 - }, - { - "count": 446365, - "lower_bound": "Y2l0eV9kZXNjX2RkMTFhNDEyMDcyZTQ5MTY4MzkyOWE0NjczZWUzOGVl", - "upper_bound": "Y2l0eV9kZXNjX2RkZGIzZWZkMzc3YjQ2MDE5MTliMjhhYmJhM2QwODY2", - "repeats": 1 - }, - { - "count": 448413, - "lower_bound": "Y2l0eV9kZXNjX2RkZGM5N2Y3MGRkODQ4MDc4OTU4YzI4NDQ0ZjZmNjRk", - "upper_bound": "Y2l0eV9kZXNjX2RmMWY3YTBmYzM5MjQwN2E5ODI0ODY5NGZmYzVkMGNi", - "repeats": 1 - }, - { - "count": 450460, - "lower_bound": "Y2l0eV9kZXNjX2RmMjkxZjViNjk0ZDRmZDhiOGY4MWJjYTBkMTNiMTAz", - "upper_bound": "Y2l0eV9kZXNjX2UwMGYyODBhMzYxNTQyYzc5Y2U2M2UwMmZjNzM1Nzcx", - "repeats": 1 - }, - { - "count": 452508, - "lower_bound": "Y2l0eV9kZXNjX2UwMWNkZjlkMTk2MTRmOTM4ZmExOGQxNWVjODhmNTFj", - "upper_bound": "Y2l0eV9kZXNjX2UwYjFmYTc5NGY4NjQ0NTFiMTkxNTU1OGZhOGMwY2Zm", - "repeats": 1 - }, - { - "count": 454555, - "lower_bound": "Y2l0eV9kZXNjX2UwYjgzNjg4OTg4NzRlNGFhYmYxNGYwYTk2NTYxOTM0", - "upper_bound": "Y2l0eV9kZXNjX2UxNjY1NTIyNDI4NTRiM2E4ZWNkMjQxNGMxODY4YzRh", - "repeats": 1 - }, - { - "count": 456603, - "lower_bound": "Y2l0eV9kZXNjX2UxYTYzNmYxMzAxNDQ0Y2I4MTQ3MDY0YTYyMzExYWQ3", - "upper_bound": "Y2l0eV9kZXNjX2UyODcwMmRkODA0YTQ2ZjU4ODJiM2U2NWFjZjc4MDdk", - "repeats": 1 - }, - { - "count": 458650, - "lower_bound": "Y2l0eV9kZXNjX2UyYzQyMDYzNjUwYTQ0ZmU5ZmExYmU5YzFhNjRkYjBl", - "upper_bound": "Y2l0eV9kZXNjX2UzZWU0ZGE2ZDk5NDRiODM5Y2VhNmVkMTgwZjcxMDg0", - "repeats": 1 - }, - { - "count": 460698, - "lower_bound": "Y2l0eV9kZXNjX2UzZmM2MWUwZTQ4NTRjZjFiZWQ0Y2FjNWRhZmYxYTc0", - "upper_bound": "Y2l0eV9kZXNjX2U0ODg3ZmU1ODg2YzQ2M2Y5NzMxMzQ0MzY4ZGNiNWJi", - "repeats": 1 - }, - { - "count": 462745, - "lower_bound": "Y2l0eV9kZXNjX2U0YTY0ZTBkYWJjYTRkZTY5NDE4OTFlMWFlZTczZmZh", - "upper_bound": "Y2l0eV9kZXNjX2U1OTQ5NmEyNmFlNTQ3YjI5MDFlNzcxZTY4NjdiYzNi", - "repeats": 1 - }, - { - "count": 464793, - "lower_bound": "Y2l0eV9kZXNjX2U1YmZiMzZiYjZiZDRhYmZhYjRiNTYyNWMxNDNhMmMz", - "upper_bound": "Y2l0eV9kZXNjX2U3MzhhYzg5MzE0MTRlYWQ4ZGQ3YzA5MzliODI0YTM1", - "repeats": 1 - }, - { - "count": 466840, - "lower_bound": "Y2l0eV9kZXNjX2U3NDBmMmRlYmYzOTQ3MjY5MGJlZDkxZDhmOTYzMDgw", - "upper_bound": "Y2l0eV9kZXNjX2U4NzZmMThmYmM5NDQ5NWZhMmQyMTgzYmJjZDdlM2I5", - "repeats": 1 - }, - { - "count": 468888, - "lower_bound": "Y2l0eV9kZXNjX2U4N2IyYTVmNzFhZTQzN2RhYWU0NjI1YjY2YzBlZWJh", - "upper_bound": "Y2l0eV9kZXNjX2U5ODBmZjYwMmU1ODQwMjNiZGJiNDFjOWQxNGU4N2E3", - "repeats": 1 - }, - { - "count": 470936, - "lower_bound": "Y2l0eV9kZXNjX2U5YTY4ODQwM2NhZjQ4NzY5MGVkYTg0ZTg4MTYxZDQx", - "upper_bound": "Y2l0eV9kZXNjX2VhOTgxMDBjMzkyODQxMjZhNDRlYWZlMzBkYzI4M2Y5", - "repeats": 1 - }, - { - "count": 472983, - "lower_bound": "Y2l0eV9kZXNjX2VhYjA4ODJlMjU3OTQ3ZWVhMWFlNDBkNzYxMTVjZjI4", - "upper_bound": "Y2l0eV9kZXNjX2ViY2EyM2Q2N2NlMzQ4MDlhNGI1ZTkzNmYzMmE0NTU2", - "repeats": 1 - }, - { - "count": 475031, - "lower_bound": "Y2l0eV9kZXNjX2ViZTgzOGIyOWE2ZDQzMmI4MjllOTA2MGI1YmM5MjA3", - "upper_bound": "Y2l0eV9kZXNjX2VjNjQ1MzQyZjk5ZjQyZmFiNjlkNWUyMjg4MGVjYjU2", - "repeats": 1 - }, - { - "count": 477078, - "lower_bound": "Y2l0eV9kZXNjX2VjNjdmMWNhZDNmYTQ1NjZiNGFmNzA4YThiY2IzMDE0", - "upper_bound": "Y2l0eV9kZXNjX2VkOTY1ZjE5YmZhNTRhMzJhN2EyMWRmNTI4YmVlZjVi", - "repeats": 1 - }, - { - "count": 479126, - "lower_bound": "Y2l0eV9kZXNjX2VkOWM3ZmRjMjc2ZTRlNTQ4Mjg1MTcwMWU2ZDE4M2Iy", - "upper_bound": "Y2l0eV9kZXNjX2VlNTMzMTVhNGUyOTQ0OGRhNjVjMjY5MTVlNzY3YjI5", - "repeats": 1 - }, - { - "count": 481173, - "lower_bound": "Y2l0eV9kZXNjX2VlYWU5MmVmMzMzMTQ1MTZhMWE1NGNhZWZiZDJkN2I4", - "upper_bound": "Y2l0eV9kZXNjX2VmYTAyNWNmZTFlMTRkZjdhYzcyMTUwMjQ1N2U2ZmQz", - "repeats": 1 - }, - { - "count": 483221, - "lower_bound": "Y2l0eV9kZXNjX2VmYTVmYTNmZDJlNTQyZDdhMzRjNjc4NmVhZDBjNTA1", - "upper_bound": "Y2l0eV9kZXNjX2YwYWExYmM0ODZmYjQzNTVhOWMzZmM2MmRmMzMzZGNk", - "repeats": 1 - }, - { - "count": 485268, - "lower_bound": "Y2l0eV9kZXNjX2YwYWJlMGFjYTU3ODQ4YjRiMDkyMmZmYzE2NmY4YjFj", - "upper_bound": "Y2l0eV9kZXNjX2YxYzYzNWRhZjVkMjRjOThiZWMyMTMyNDhiZjUwOTc4", - "repeats": 1 - }, - { - "count": 487316, - "lower_bound": "Y2l0eV9kZXNjX2YxZGFiMmVmOWJhYTQ2ODBiYmZkZDc2ZGRkNzFkMmFh", - "upper_bound": "Y2l0eV9kZXNjX2YzMDdiZDAwM2Q0NjQxYzc5YjdlYWRlMzFhOWZmMjI5", - "repeats": 1 - }, - { - "count": 489363, - "lower_bound": "Y2l0eV9kZXNjX2YzNjg4OTk4MDJjZTQwOTliZDI2MDJiMDAwYWE2YmIw", - "upper_bound": "Y2l0eV9kZXNjX2Y0MGQ5YTM0MjY0YjQ5ZWRhN2M1NTY3OTdjN2VjZjMx", - "repeats": 1 - }, - { - "count": 491411, - "lower_bound": "Y2l0eV9kZXNjX2Y0MGRkMDczYjhkZTRhYjE4ZDFkYzFiZTJlMzA1Zjc3", - "upper_bound": "Y2l0eV9kZXNjX2Y1MWRiOGE5YTU3ODQwZjM4MTMzZWUxYzljYTc1MmY0", - "repeats": 1 - }, - { - "count": 493459, - "lower_bound": "Y2l0eV9kZXNjX2Y1MmIyZDMxZmI0ODQ0ZjJiZWZhMzVhMmE2ODJmZDJl", - "upper_bound": "Y2l0eV9kZXNjX2Y2OWI0ODE0ZGZlNDRiMzY5N2YwOTgzMjk0MjBhMTVk", - "repeats": 1 - }, - { - "count": 495506, - "lower_bound": "Y2l0eV9kZXNjX2Y2YTAxMjI1NWMwYTQyMzU4NWFiMjBhODg3YjRmNjNj", - "upper_bound": "Y2l0eV9kZXNjX2Y3NzM3NmQyNjk5MDQ5YWJhYTBiYjQwNDQ5YzQxM2Q0", - "repeats": 1 - }, - { - "count": 497554, - "lower_bound": "Y2l0eV9kZXNjX2Y3OGJiNDU2YzUyOTRjOWI5MTY1YjNiNDY4ZTFmNTkz", - "upper_bound": "Y2l0eV9kZXNjX2Y4NWMwNWU4OTU1ZjRjYmFiMzcyM2Y3NWY0ZGJlYzAy", - "repeats": 1 - }, - { - "count": 499601, - "lower_bound": "Y2l0eV9kZXNjX2Y4NmMxNTQxNmNiYzQ4ZDdiMWIwZjdhNWM1YTk3NDMz", - "upper_bound": "Y2l0eV9kZXNjX2Y5MDFjOWI2MmIyNjRiYTJhNDg1OGE4YmIzZTM5ZWQ4", - "repeats": 1 - }, - { - "count": 501649, - "lower_bound": "Y2l0eV9kZXNjX2Y5NGVjNzJjYWM2YTQxNDA5ZWJhY2I2YTkxZDgxODMx", - "upper_bound": "Y2l0eV9kZXNjX2ZhMmNhNWZhNTBmNzQwZmI4NzE5MjAzNWZkNmMzNzU4", - "repeats": 1 - }, - { - "count": 503696, - "lower_bound": "Y2l0eV9kZXNjX2ZhNjhmZWQ4NzJkNzQ2YmZhMTZmYWEzZDc3ZGY2NGJm", - "upper_bound": "Y2l0eV9kZXNjX2ZiNmZiMzgxMjIwNTRiYzBiZTI0YjM3ZWFhMWE1ZmM5", - "repeats": 1 - }, - { - "count": 505744, - "lower_bound": "Y2l0eV9kZXNjX2ZiYmJlZjI4ZGE2ZTRmODBhMzlkZmM1ZTc3NTVjOGQ4", - "upper_bound": "Y2l0eV9kZXNjX2ZjZTk5YThiODMyMTRkOGJhYWE3ZTM4MTMxMzI1Mjkx", - "repeats": 1 - }, - { - "count": 507791, - "lower_bound": "Y2l0eV9kZXNjX2ZjZjBjNGFlNGYwMzQ4NmU5ZGNlZjJiNjhmNTRiZDhl", - "upper_bound": "Y2l0eV9kZXNjX2ZkOGQ1ZmNlMjE0MTQ4NTQ5YTYyZDZjYjQ4ZDM5OTQx", - "repeats": 1 - }, - { - "count": 509839, - "lower_bound": "Y2l0eV9kZXNjX2ZkOWZhNTJmZWRhMTRhZjk4MmNkNjM0MmIyZDk4YjRi", - "upper_bound": "Y2l0eV9kZXNjX2ZlNjRlNTYyYjIzZTQ2MThiYmNmMjVjNzBiNWNiNGM2", - "repeats": 1 - }, - { - "count": 511887, - "lower_bound": "Y2l0eV9kZXNjX2ZlNzk3MTg3Zjg0MzRhN2FhZmE1ZTZmNTU5Y2Y0MmY3", - "upper_bound": "Y2l0eV9kZXNjX2ZmY2Y1NDNlNzMxNzQ0ODE5MDljMjgyOGM5NGE5OGU2", - "repeats": 1 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 277, - 256, - 254, - 241, - 250, - 216, - 247, - 243, - 234, - 239, - 236, - 239, - 242, - 277, - 226, - 232, - 249, - 252, - 230, - 267, - 244, - 254, - 263, - 276, - 240, - 237, - 274, - 222, - 257, - 260, - 253, - 243, - 233, - 267, - 248, - 243, - 265, - 258, - 249, - 211, - 262, - 262, - 265, - 278, - 249, - 250, - 235, - 269, - 250, - 252, - 242, - 245, - 227, - 254, - 236, - 240, - 262, - 241, - 252, - 226, - 245, - 262, - 261, - 250, - 261, - 283, - 267, - 257, - 247, - 267, - 249, - 244, - 265, - 244, - 262, - 253, - 230, - 252, - 250, - 264, - 241, - 240, - 245, - 254, - 235, - 214, - 235, - 270, - 258, - 250, - 224, - 257, - 256, - 250, - 239, - 258, - 254, - 251, - 240, - 254, - 232, - 265, - 249, - 232, - 266, - 251, - 250, - 228, - 278, - 239, - 238, - 227, - 257, - 233, - 250, - 235, - 250, - 233, - 243, - 234, - 235, - 254, - 221, - 255, - 257, - 249, - 247, - 271, - 239, - 223, - 250, - 232, - 263, - 239, - 230, - 237, - 244, - 232, - 250, - 257, - 220, - 242, - 263, - 254, - 254, - 269, - 255, - 261, - 238, - 235, - 243, - 247, - 242, - 260, - 241, - 250, - 256, - 233, - 263, - 230, - 280, - 262, - 265, - 218, - 260, - 271, - 249, - 271, - 251, - 262, - 263, - 248, - 254, - 264, - 240, - 237, - 244, - 265, - 262, - 250, - 263, - 260, - 238, - 248, - 242, - 274, - 243, - 235, - 237, - 257, - 280, - 256, - 265, - 256, - 228, - 232, - 253, - 262, - 257, - 235, - 246, - 283, - 241, - 251, - 242, - 270, - 243, - 261, - 251, - 240, - 249, - 256, - 238, - 254, - 241, - 259, - 273, - 250, - 251, - 258, - 236, - 238, - 219, - 256, - 250, - 264, - 243, - 234, - 247, - 250, - 250, - 260, - 257, - 248, - 276, - 242, - 234, - 251, - 252, - 250, - 277, - 260, - 229, - 271, - 250, - 246, - 235, - 268, - 238, - 267, - 261, - 263, - 251, - 222, - 222, - 239, - 262, - 218, - 248, - 246, - 254, - 241, - 262, - 238, - 230, - 251, - 232, - 253, - 260, - 248, - 229, - 239, - 231, - 243, - 262, - 257, - 259, - 240, - 258, - 236, - 259, - 264, - 257, - 231, - 238, - 244, - 261, - 243, - 250, - 268, - 235, - 235, - 262, - 232, - 221, - 251, - 246, - 245, - 265, - 241, - 252, - 282, - 223, - 226, - 233, - 259, - 234, - 269, - 234, - 234, - 257, - 247, - 284, - 226, - 259, - 232, - 240, - 213, - 244, - 260, - 242, - 233, - 244, - 269, - 284, - 243, - 267, - 273, - 234, - 278, - 254, - 248, - 248, - 252, - 271, - 256, - 257, - 240, - 281, - 260, - 248, - 248, - 241, - 243, - 267, - 243, - 257, - 217, - 238, - 256, - 304, - 246, - 265, - 247, - 246, - 235, - 241, - 265, - 269, - 262, - 226, - 254, - 246, - 238, - 238, - 249, - 253, - 257, - 244, - 253, - 264, - 224, - 255, - 220, - 273, - 281, - 262, - 242, - 265, - 253, - 238, - 256, - 247, - 241, - 253, - 228, - 232, - 234, - 227, - 238, - 264, - 223, - 250, - 276, - 232, - 252, - 236, - 220, - 256, - 234, - 256, - 219, - 243, - 252, - 257, - 218, - 228, - 275, - 207, - 237, - 239, - 256, - 247, - 261, - 266, - 251, - 241, - 261, - 248, - 242, - 246, - 262, - 241, - 238, - 225, - 238, - 254, - 268, - 247, - 255, - 264, - 265, - 263, - 217, - 255, - 264, - 278, - 274, - 255, - 240, - 272, - 254, - 243, - 249, - 238, - 230, - 241, - 252, - 255, - 235, - 249, - 274, - 275, - 249, - 268, - 234, - 236, - 264, - 244, - 263, - 252, - 228, - 243, - 254, - 232, - 273, - 265, - 243, - 258, - 247, - 288, - 251, - 231, - 241, - 240, - 244, - 231, - 249, - 233, - 234, - 250, - 227, - 270, - 265, - 245, - 269, - 240, - 249, - 271, - 227, - 259, - 255, - 257, - 235, - 242, - 275, - 251, - 264, - 258, - 259, - 242, - 267, - 242, - 247, - 258, - 253, - 269, - 239, - 246, - 258, - 254, - 243, - 244, - 253, - 250, - 235, - 220, - 287, - 237, - 266, - 275, - 225, - 299, - 251, - 249, - 244, - 234, - 249, - 260, - 238, - 223, - 246, - 247, - 262, - 248, - 252, - 256, - 253, - 253, - 227, - 228, - 275, - 237, - 256, - 256, - 250, - 264, - 258, - 250, - 264, - 246, - 245, - 239, - 226, - 234, - 254, - 245, - 254, - 263, - 244, - 251, - 283, - 250, - 252, - 225, - 245, - 253, - 234, - 262, - 240, - 264, - 271, - 256, - 287, - 239, - 230, - 254, - 238, - 292, - 219, - 239, - 255, - 222, - 245, - 254, - 222, - 246, - 274, - 267, - 233, - 255, - 228, - 256, - 266, - 282, - 244, - 252, - 228, - 222, - 251, - 237, - 285, - 249, - 266, - 238, - 243, - 254, - 230, - 238, - 231, - 263, - 247, - 230, - 249, - 247, - 234, - 265, - 256, - 251, - 256, - 252, - 249, - 259, - 265, - 260, - 240, - 219, - 249, - 255, - 263, - 252, - 243, - 265, - 248, - 248, - 294, - 232, - 260, - 254, - 282, - 238, - 250, - 260, - 255, - 263, - 254, - 255, - 279, - 236, - 244, - 295, - 261, - 236, - 266, - 241, - 281, - 260, - 256, - 270, - 257, - 246, - 283, - 226, - 251, - 236, - 256, - 219, - 225, - 270, - 232, - 256, - 257, - 210, - 272, - 238, - 279, - 239, - 242, - 244, - 241, - 236, - 263, - 216, - 275, - 228, - 252, - 251, - 267, - 243, - 252, - 232, - 249, - 283, - 265, - 257, - 245, - 246, - 239, - 293, - 258, - 245, - 238, - 260, - 263, - 233, - 248, - 262, - 241, - 243, - 225, - 229, - 264, - 249, - 234, - 261, - 245, - 232, - 268, - 279, - 234, - 269, - 251, - 242, - 257, - 245, - 250, - 244, - 249, - 266, - 271, - 262, - 243, - 264, - 237, - 247, - 248, - 285, - 231, - 267, - 236, - 286, - 262, - 252, - 218, - 294, - 257, - 263, - 257, - 272, - 263, - 242, - 240, - 227, - 277, - 244, - 271, - 287, - 263, - 235, - 271, - 248, - 242, - 232, - 226, - 279, - 244, - 268, - 254, - 272, - 257, - 277, - 235, - 248, - 244, - 249, - 259, - 228, - 244, - 267, - 247, - 242, - 270, - 246, - 257, - 255, - 280, - 245, - 249, - 244, - 268, - 261, - 251, - 236, - 242, - 265, - 252, - 263, - 236, - 259, - 251, - 281, - 254, - 246, - 232, - 262, - 240, - 250, - 239, - 266, - 246, - 254, - 258, - 254, - 243, - 263, - 255, - 250, - 227, - 242, - 238, - 249, - 240, - 253, - 246, - 268, - 229, - 265, - 235, - 264, - 227, - 230, - 228, - 241, - 243, - 248, - 262, - 261, - 241, - 258, - 264, - 247, - 255, - 240, - 272, - 226, - 266, - 226, - 217, - 256, - 223, - 212, - 255, - 257, - 252, - 222, - 266, - 293, - 236, - 240, - 245, - 271, - 253, - 270, - 246, - 254, - 238, - 238, - 261, - 266, - 238, - 262, - 227, - 238, - 247, - 241, - 247, - 243, - 251, - 243, - 232, - 241, - 244, - 249, - 264, - 242, - 229, - 259, - 248, - 239, - 267, - 235, - 231, - 227, - 235, - 269, - 228, - 272, - 228, - 288, - 229, - 222, - 228, - 238, - 250, - 246, - 274, - 234, - 254, - 238, - 250, - 236, - 221, - 246, - 250, - 258, - 259, - 267, - 274, - 249, - 285, - 243, - 255, - 246, - 255, - 237, - 227, - 224, - 249, - 257, - 242, - 270, - 257, - 240, - 249, - 241, - 261, - 244, - 256, - 257, - 299, - 305, - 246, - 281, - 249, - 263, - 223, - 263, - 254, - 266, - 247, - 260, - 236, - 237, - 271, - 229, - 267, - 260, - 264, - 266, - 239, - 271, - 228, - 251, - 269, - 256, - 266, - 253, - 240, - 244, - 244, - 260, - 275, - 256, - 261, - 237, - 276, - 258, - 264, - 261, - 237, - 234, - 216, - 238, - 266, - 221, - 245, - 263, - 246, - 241, - 273, - 219, - 262, - 277, - 242, - 255, - 262, - 241, - 227, - 253, - 233, - 246, - 244, - 262, - 250, - 222, - 219, - 262, - 255, - 247, - 254, - 222, - 282, - 257, - 276, - 227, - 247, - 231, - 235, - 280, - 242, - 216, - 266, - 234, - 259, - 273, - 229, - 232, - 238, - 253, - 276, - 242, - 253, - 236, - 254, - 239, - 251, - 253, - 248, - 271, - 260, - 263, - 270, - 248, - 269, - 234, - 302, - 269, - 285, - 238, - 258, - 245, - 283, - 261, - 261, - 255, - 243, - 242, - 219, - 240, - 239, - 242, - 259, - 281, - 261, - 268, - 263, - 231, - 276, - 243, - 273, - 268, - 250, - 240, - 225, - 249, - 239, - 253, - 246, - 267, - 277, - 234, - 254, - 239, - 258, - 239, - 223, - 272, - 240, - 250, - 267, - 246, - 274, - 256, - 258, - 265, - 234, - 265, - 236, - 246, - 227, - 212, - 245, - 229, - 258, - 253, - 236, - 229, - 267, - 258, - 239, - 242, - 246, - 231, - 271, - 248, - 253, - 245, - 238, - 264, - 236, - 229, - 228, - 239, - 246, - 230, - 264, - 248, - 244, - 247, - 221, - 269, - 264, - 267, - 239, - 253, - 229, - 249, - 254, - 266, - 255, - 244, - 241, - 248, - 269, - 264, - 247, - 267, - 252, - 231, - 261, - 216, - 238, - 255, - 269, - 232, - 246, - 247, - 226, - 252, - 259, - 223, - 238, - 288, - 259, - 217, - 227, - 251, - 232, - 243, - 247, - 245, - 234, - 254, - 269, - 277, - 220, - 252, - 249, - 252, - 220, - 249, - 251, - 234, - 248, - 248, - 229, - 264, - 251, - 255, - 250, - 271, - 243, - 278, - 248, - 230, - 253, - 248, - 246, - 244, - 233, - 281, - 252, - 249, - 260, - 249, - 232, - 260, - 259, - 243, - 249, - 228, - 232, - 260, - 255, - 255, - 243, - 272, - 253, - 240, - 253, - 224, - 277, - 254, - 208, - 261, - 255, - 243, - 267, - 250, - 261, - 239, - 255, - 250, - 242, - 248, - 269, - 228, - 256, - 254, - 270, - 273, - 228, - 252, - 254, - 276, - 280, - 241, - 238, - 223, - 264, - 239, - 247, - 257, - 294, - 256, - 228, - 243, - 262, - 248, - 261, - 261, - 278, - 272, - 265, - 258, - 245, - 278, - 250, - 217, - 281, - 243, - 230, - 287, - 244, - 256, - 238, - 238, - 267, - 236, - 250, - 242, - 248, - 236, - 250, - 261, - 259, - 229, - 229, - 263, - 253, - 251, - 237, - 247, - 239, - 226, - 258, - 258, - 237, - 234, - 273, - 238, - 263, - 240, - 263, - 240, - 257, - 268, - 256, - 250, - 261, - 257, - 256, - 243, - 265, - 261, - 234, - 232, - 247, - 243, - 238, - 218, - 231, - 230, - 238, - 239, - 273, - 244, - 256, - 247, - 241, - 266, - 254, - 258, - 242, - 262, - 256, - 239, - 240, - 255, - 239, - 253, - 241, - 262, - 257, - 257, - 238, - 237, - 251, - 248, - 245, - 258, - 248, - 250, - 247, - 240, - 241, - 225, - 234, - 261, - 255, - 248, - 253, - 263, - 239, - 252, - 271, - 227, - 231, - 243, - 264, - 256, - 261, - 218, - 263, - 259, - 279, - 231, - 258, - 255, - 253, - 251, - 259, - 252, - 240, - 236, - 236, - 248, - 260, - 237, - 243, - 269, - 248, - 265, - 256, - 254, - 259, - 254, - 243, - 244, - 271, - 244, - 296, - 237, - 244, - 256, - 251, - 265, - 232, - 245, - 235, - 248, - 269, - 245, - 245, - 224, - 212, - 218, - 235, - 259, - 242, - 258, - 243, - 257, - 252, - 259, - 230, - 250, - 255, - 242, - 221, - 291, - 244, - 215, - 252, - 241, - 253, - 231, - 252, - 234, - 279, - 259, - 281, - 244, - 218, - 251, - 258, - 281, - 250, - 248, - 271, - 255, - 258, - 243, - 273, - 265, - 257, - 275, - 246, - 259, - 250, - 243, - 221, - 276, - 237, - 256, - 261, - 269, - 257, - 256, - 255, - 258, - 263, - 241, - 261, - 244, - 268, - 245, - 226, - 238, - 256, - 246, - 262, - 238, - 239, - 225, - 258, - 260, - 247, - 225, - 282, - 217, - 245, - 278, - 261, - 239, - 276, - 235, - 256, - 244, - 245, - 263, - 233, - 244, - 253, - 256, - 268, - 270, - 269, - 262, - 261, - 249, - 239, - 262, - 246, - 257, - 275, - 265, - 225, - 262, - 310, - 221, - 235, - 254, - 236, - 254, - 249, - 212, - 251, - 210, - 255, - 238, - 220, - 240, - 259, - 302, - 272, - 230, - 243, - 233, - 247, - 279, - 280, - 272, - 267, - 266, - 258, - 260, - 272, - 250, - 242, - 242, - 245, - 248, - 244, - 280, - 264, - 244, - 268, - 277, - 238, - 232, - 260, - 251, - 229, - 268, - 230, - 253, - 250, - 285, - 242, - 235, - 233, - 266, - 272, - 252, - 273, - 242, - 257, - 256, - 227, - 249, - 267, - 253, - 260, - 247, - 242, - 249, - 282, - 265, - 232, - 239, - 280, - 235, - 249, - 212, - 248, - 243, - 240, - 235, - 239, - 233, - 245, - 259, - 241, - 243, - 245, - 234, - 279, - 248, - 246, - 245, - 258, - 233, - 258, - 251, - 247, - 240, - 251, - 245, - 268, - 230, - 253, - 251, - 235, - 278, - 215, - 263, - 261, - 239, - 270, - 253, - 250, - 236, - 236, - 259, - 266, - 239, - 275, - 229, - 250, - 244, - 254, - 238, - 241, - 242, - 239, - 267, - 277, - 248, - 275, - 234, - 253, - 229, - 245, - 263, - 268, - 261, - 251, - 221, - 255, - 247, - 254, - 250, - 250, - 270, - 232, - 250, - 249, - 265, - 255, - 245, - 239, - 225, - 227, - 268, - 241, - 260, - 248, - 267, - 256, - 238, - 245, - 227, - 273, - 257, - 254, - 255, - 232, - 243, - 261, - 232, - 266, - 218, - 247, - 235, - 238, - 269, - 264, - 249, - 239, - 221, - 237, - 243, - 241, - 255, - 213, - 238, - 251, - 270, - 231, - 259, - 253, - 232, - 251, - 235, - 240, - 253, - 218, - 221, - 264, - 248, - 253, - 268, - 267, - 249, - 262, - 277, - 247, - 262, - 219, - 234, - 268, - 251, - 270, - 254, - 271, - 264, - 251, - 234, - 228, - 262, - 238, - 244, - 260, - 270, - 257, - 266, - 255, - 225, - 243, - 275, - 256, - 229, - 259, - 256, - 261, - 239, - 244, - 265, - 243, - 255, - 249, - 259, - 268, - 263, - 257, - 288, - 249, - 238, - 225, - 252, - 242, - 266, - 249, - 246, - 240, - 241, - 221, - 230, - 232, - 282, - 240, - 284, - 235, - 252, - 277, - 265, - 246, - 244, - 222, - 252, - 222, - 259, - 245, - 253, - 238, - 233, - 249, - 238, - 255, - 232, - 274, - 275, - 237, - 317, - 249, - 247, - 234, - 268, - 243, - 256, - 281, - 289, - 233, - 258, - 247, - 219, - 239, - 247, - 262, - 243, - 263, - 264, - 259, - 240, - 242, - 248, - 253, - 213, - 219, - 235, - 257, - 225, - 230, - 240, - 244, - 247, - 254, - 269, - 225, - 224, - 244, - 254, - 275, - 234, - 247, - 225, - 231, - 286, - 250, - 249, - 238, - 257, - 234, - 280, - 269, - 272, - 253, - 273, - 278, - 224, - 253, - 285, - 241, - 258, - 235, - 244, - 266, - 274, - 245, - 242, - 253, - 266, - 235, - 239, - 281, - 246, - 260, - 265, - 238, - 255, - 270, - 258, - 243, - 272, - 252, - 255, - 241, - 235, - 243, - 244, - 237, - 244, - 227, - 239, - 259, - 271, - 258, - 273, - 246, - 224, - 258, - 251, - 262, - 261, - 255, - 276, - 254, - 291, - 252, - 264, - 240, - 248, - 268, - 261, - 268, - 237, - 276, - 246, - 232, - 268, - 248, - 261, - 252, - 250, - 255, - 249, - 195, - 251, - 251, - 262, - 229, - 258, - 225, - 230, - 229, - 248, - 234, - 246, - 242, - 248, - 252, - 254, - 247, - 273, - 260, - 223, - 285, - 257, - 239, - 244, - 244, - 267, - 248, - 233, - 237, - 288, - 230, - 239, - 231, - 253, - 241, - 226, - 248, - 259, - 231, - 253, - 254, - 259, - 253, - 259, - 274, - 250, - 265, - 250, - 234, - 232, - 244, - 230, - 267, - 262, - 241, - 262, - 234, - 233, - 229, - 240, - 226, - 237, - 232, - 241, - 251, - 243, - 244, - 263, - 281, - 249, - 241, - 254, - 260, - 277, - 262, - 239, - 273, - 239, - 285, - 277, - 253, - 276, - 255, - 260, - 229, - 259, - 224, - 275, - 237, - 271, - 238, - 255, - 261, - 256, - 260, - 237, - 253, - 227, - 239, - 243, - 260, - 267, - 264, - 289, - 261, - 225, - 224, - 238, - 227, - 246, - 255, - 220, - 247, - 240, - 227, - 239, - 259, - 234, - 263, - 268, - 217 - ] - }, - { - "counters": [ - 243, - 285, - 265, - 265, - 257, - 252, - 237, - 254, - 246, - 240, - 224, - 279, - 235, - 252, - 256, - 257, - 238, - 253, - 243, - 254, - 229, - 242, - 249, - 224, - 259, - 246, - 286, - 276, - 240, - 257, - 262, - 262, - 246, - 251, - 228, - 231, - 247, - 236, - 291, - 257, - 256, - 239, - 233, - 266, - 247, - 264, - 241, - 251, - 252, - 253, - 257, - 267, - 269, - 253, - 234, - 246, - 243, - 252, - 251, - 255, - 277, - 255, - 276, - 285, - 264, - 236, - 264, - 223, - 241, - 267, - 250, - 285, - 243, - 224, - 269, - 243, - 246, - 230, - 240, - 265, - 276, - 234, - 275, - 255, - 259, - 256, - 236, - 246, - 251, - 262, - 250, - 231, - 265, - 253, - 242, - 229, - 256, - 270, - 232, - 258, - 237, - 260, - 247, - 237, - 241, - 256, - 232, - 245, - 242, - 258, - 250, - 242, - 242, - 255, - 252, - 234, - 231, - 246, - 250, - 265, - 255, - 263, - 239, - 295, - 262, - 244, - 226, - 283, - 236, - 235, - 247, - 254, - 244, - 245, - 253, - 266, - 239, - 242, - 249, - 249, - 252, - 262, - 234, - 265, - 251, - 232, - 273, - 257, - 206, - 253, - 250, - 233, - 278, - 243, - 237, - 229, - 251, - 258, - 231, - 231, - 266, - 273, - 231, - 271, - 237, - 273, - 272, - 269, - 223, - 244, - 259, - 215, - 277, - 243, - 251, - 275, - 251, - 237, - 249, - 244, - 240, - 249, - 251, - 281, - 266, - 248, - 236, - 281, - 269, - 227, - 248, - 266, - 234, - 248, - 261, - 248, - 232, - 242, - 234, - 274, - 227, - 278, - 271, - 252, - 233, - 255, - 266, - 245, - 251, - 262, - 251, - 251, - 253, - 229, - 261, - 237, - 239, - 245, - 236, - 234, - 249, - 269, - 271, - 243, - 248, - 226, - 247, - 227, - 261, - 252, - 262, - 245, - 224, - 249, - 226, - 228, - 254, - 241, - 242, - 256, - 257, - 246, - 280, - 232, - 259, - 268, - 246, - 236, - 260, - 248, - 268, - 235, - 238, - 252, - 267, - 245, - 243, - 243, - 239, - 243, - 241, - 247, - 258, - 238, - 254, - 244, - 259, - 254, - 260, - 277, - 239, - 252, - 228, - 272, - 267, - 257, - 258, - 222, - 269, - 260, - 246, - 262, - 239, - 257, - 257, - 241, - 245, - 241, - 265, - 241, - 272, - 267, - 263, - 264, - 235, - 244, - 244, - 252, - 283, - 242, - 261, - 241, - 256, - 256, - 246, - 276, - 256, - 275, - 274, - 256, - 242, - 255, - 264, - 277, - 241, - 240, - 253, - 278, - 300, - 233, - 237, - 269, - 235, - 252, - 239, - 276, - 289, - 253, - 235, - 266, - 248, - 252, - 235, - 245, - 256, - 280, - 263, - 272, - 245, - 253, - 246, - 284, - 244, - 248, - 248, - 248, - 266, - 218, - 267, - 259, - 241, - 292, - 225, - 272, - 257, - 255, - 253, - 251, - 279, - 223, - 251, - 249, - 236, - 253, - 260, - 242, - 260, - 215, - 276, - 257, - 244, - 257, - 267, - 239, - 228, - 248, - 220, - 236, - 235, - 276, - 262, - 254, - 262, - 260, - 230, - 254, - 213, - 250, - 257, - 259, - 243, - 275, - 224, - 256, - 215, - 256, - 233, - 229, - 216, - 267, - 260, - 268, - 207, - 263, - 254, - 266, - 231, - 250, - 242, - 259, - 265, - 260, - 257, - 262, - 244, - 250, - 238, - 235, - 267, - 230, - 241, - 260, - 253, - 234, - 260, - 243, - 269, - 247, - 259, - 246, - 266, - 281, - 263, - 237, - 236, - 275, - 255, - 243, - 249, - 295, - 215, - 248, - 266, - 230, - 288, - 243, - 240, - 236, - 234, - 254, - 250, - 228, - 251, - 273, - 266, - 241, - 256, - 265, - 242, - 254, - 274, - 269, - 222, - 248, - 230, - 239, - 246, - 228, - 254, - 269, - 250, - 230, - 275, - 249, - 239, - 246, - 239, - 260, - 228, - 267, - 262, - 245, - 251, - 249, - 226, - 264, - 252, - 226, - 264, - 246, - 230, - 254, - 219, - 243, - 230, - 284, - 295, - 264, - 254, - 267, - 281, - 254, - 276, - 243, - 261, - 234, - 257, - 269, - 244, - 261, - 227, - 271, - 247, - 242, - 273, - 232, - 237, - 248, - 218, - 281, - 263, - 276, - 245, - 264, - 242, - 258, - 261, - 234, - 253, - 276, - 224, - 281, - 254, - 241, - 275, - 268, - 272, - 265, - 268, - 230, - 246, - 265, - 252, - 227, - 231, - 232, - 230, - 239, - 247, - 236, - 263, - 234, - 237, - 247, - 240, - 259, - 269, - 233, - 255, - 255, - 260, - 239, - 251, - 228, - 257, - 232, - 264, - 245, - 252, - 286, - 251, - 244, - 229, - 235, - 275, - 252, - 232, - 225, - 228, - 253, - 248, - 283, - 248, - 248, - 258, - 234, - 251, - 252, - 243, - 271, - 262, - 272, - 245, - 221, - 250, - 246, - 244, - 239, - 219, - 235, - 251, - 241, - 249, - 260, - 265, - 231, - 267, - 226, - 245, - 241, - 255, - 238, - 241, - 223, - 263, - 259, - 238, - 234, - 260, - 270, - 266, - 249, - 235, - 272, - 245, - 252, - 236, - 254, - 234, - 234, - 220, - 255, - 268, - 239, - 201, - 254, - 236, - 211, - 246, - 263, - 244, - 271, - 217, - 269, - 247, - 268, - 256, - 270, - 242, - 252, - 226, - 240, - 244, - 225, - 248, - 255, - 276, - 271, - 268, - 252, - 253, - 252, - 249, - 253, - 232, - 243, - 248, - 259, - 261, - 278, - 264, - 217, - 244, - 263, - 236, - 232, - 294, - 267, - 240, - 239, - 244, - 260, - 264, - 247, - 242, - 224, - 241, - 247, - 246, - 209, - 230, - 274, - 254, - 262, - 244, - 240, - 269, - 238, - 254, - 253, - 241, - 250, - 237, - 273, - 261, - 269, - 261, - 265, - 262, - 268, - 253, - 234, - 244, - 243, - 247, - 238, - 270, - 230, - 243, - 241, - 306, - 277, - 225, - 250, - 257, - 245, - 264, - 265, - 247, - 256, - 251, - 246, - 271, - 233, - 220, - 248, - 247, - 218, - 242, - 258, - 248, - 238, - 268, - 244, - 232, - 253, - 277, - 249, - 206, - 254, - 239, - 219, - 265, - 235, - 240, - 241, - 255, - 243, - 241, - 260, - 238, - 250, - 235, - 256, - 240, - 223, - 257, - 246, - 253, - 250, - 241, - 248, - 239, - 268, - 248, - 245, - 240, - 265, - 246, - 244, - 254, - 250, - 289, - 243, - 241, - 249, - 269, - 222, - 262, - 275, - 209, - 257, - 248, - 258, - 257, - 264, - 257, - 234, - 274, - 256, - 262, - 234, - 221, - 235, - 257, - 249, - 223, - 253, - 250, - 260, - 270, - 268, - 239, - 254, - 223, - 253, - 249, - 243, - 243, - 263, - 234, - 210, - 262, - 247, - 263, - 251, - 226, - 224, - 271, - 279, - 251, - 219, - 210, - 237, - 274, - 239, - 279, - 256, - 265, - 263, - 272, - 251, - 248, - 234, - 249, - 258, - 237, - 252, - 221, - 269, - 269, - 224, - 243, - 263, - 261, - 248, - 272, - 261, - 242, - 252, - 276, - 258, - 272, - 245, - 247, - 214, - 274, - 246, - 245, - 260, - 254, - 270, - 246, - 241, - 242, - 258, - 241, - 245, - 261, - 267, - 259, - 276, - 253, - 239, - 278, - 235, - 237, - 243, - 229, - 229, - 252, - 227, - 241, - 250, - 232, - 259, - 241, - 259, - 232, - 231, - 248, - 234, - 258, - 246, - 251, - 237, - 252, - 266, - 239, - 268, - 256, - 253, - 227, - 277, - 279, - 233, - 259, - 246, - 256, - 242, - 217, - 238, - 236, - 267, - 290, - 235, - 227, - 263, - 258, - 223, - 264, - 211, - 236, - 227, - 246, - 241, - 260, - 257, - 233, - 251, - 281, - 252, - 252, - 272, - 267, - 270, - 258, - 237, - 240, - 243, - 247, - 281, - 253, - 258, - 217, - 243, - 248, - 276, - 270, - 260, - 246, - 241, - 245, - 258, - 233, - 256, - 256, - 255, - 247, - 251, - 245, - 246, - 241, - 238, - 232, - 242, - 224, - 277, - 252, - 235, - 253, - 261, - 252, - 245, - 251, - 255, - 239, - 223, - 220, - 269, - 269, - 262, - 222, - 250, - 241, - 268, - 243, - 248, - 283, - 237, - 260, - 227, - 245, - 233, - 260, - 261, - 247, - 239, - 243, - 242, - 272, - 251, - 257, - 257, - 262, - 252, - 253, - 278, - 242, - 244, - 239, - 259, - 245, - 237, - 271, - 255, - 242, - 247, - 225, - 236, - 251, - 250, - 238, - 253, - 261, - 239, - 236, - 256, - 256, - 261, - 244, - 248, - 261, - 272, - 272, - 258, - 263, - 265, - 248, - 251, - 262, - 280, - 245, - 231, - 243, - 238, - 251, - 257, - 250, - 261, - 264, - 233, - 255, - 231, - 243, - 259, - 252, - 236, - 246, - 226, - 259, - 248, - 272, - 255, - 263, - 250, - 249, - 246, - 217, - 226, - 252, - 245, - 280, - 230, - 247, - 261, - 252, - 244, - 249, - 252, - 233, - 258, - 254, - 250, - 273, - 260, - 232, - 239, - 236, - 243, - 241, - 230, - 273, - 252, - 273, - 275, - 257, - 244, - 259, - 241, - 236, - 231, - 276, - 238, - 255, - 234, - 247, - 285, - 245, - 227, - 246, - 232, - 269, - 210, - 285, - 265, - 250, - 297, - 261, - 262, - 281, - 262, - 226, - 236, - 253, - 229, - 250, - 256, - 265, - 236, - 261, - 237, - 234, - 243, - 256, - 247, - 237, - 267, - 275, - 263, - 224, - 263, - 240, - 229, - 254, - 261, - 228, - 249, - 259, - 260, - 249, - 227, - 279, - 221, - 255, - 254, - 228, - 236, - 270, - 228, - 229, - 253, - 235, - 262, - 248, - 263, - 262, - 227, - 266, - 235, - 245, - 269, - 248, - 255, - 254, - 243, - 231, - 247, - 242, - 280, - 242, - 262, - 247, - 243, - 254, - 241, - 240, - 292, - 236, - 236, - 238, - 241, - 244, - 231, - 240, - 237, - 232, - 235, - 255, - 266, - 260, - 247, - 258, - 242, - 251, - 233, - 265, - 237, - 247, - 248, - 257, - 228, - 256, - 250, - 223, - 261, - 249, - 262, - 284, - 250, - 272, - 242, - 250, - 238, - 222, - 262, - 225, - 250, - 264, - 243, - 237, - 258, - 257, - 282, - 230, - 230, - 227, - 212, - 274, - 232, - 227, - 258, - 243, - 259, - 264, - 224, - 251, - 242, - 265, - 242, - 237, - 208, - 243, - 262, - 255, - 225, - 227, - 233, - 270, - 254, - 247, - 263, - 234, - 270, - 236, - 238, - 239, - 256, - 247, - 257, - 265, - 252, - 233, - 249, - 269, - 277, - 258, - 235, - 227, - 256, - 267, - 273, - 246, - 269, - 241, - 262, - 233, - 239, - 263, - 246, - 233, - 227, - 264, - 252, - 265, - 238, - 247, - 265, - 254, - 236, - 245, - 253, - 276, - 253, - 265, - 257, - 255, - 247, - 238, - 274, - 277, - 262, - 247, - 227, - 251, - 220, - 248, - 237, - 257, - 247, - 251, - 236, - 264, - 238, - 274, - 247, - 253, - 254, - 258, - 289, - 244, - 277, - 228, - 229, - 249, - 246, - 252, - 236, - 247, - 281, - 252, - 220, - 253, - 247, - 235, - 229, - 279, - 250, - 271, - 257, - 249, - 229, - 250, - 290, - 248, - 251, - 241, - 244, - 246, - 245, - 242, - 267, - 253, - 256, - 245, - 276, - 247, - 214, - 252, - 240, - 267, - 243, - 245, - 256, - 259, - 254, - 255, - 257, - 231, - 237, - 284, - 251, - 264, - 261, - 263, - 242, - 236, - 235, - 263, - 265, - 230, - 239, - 239, - 275, - 225, - 269, - 243, - 211, - 265, - 250, - 259, - 260, - 221, - 228, - 230, - 244, - 266, - 257, - 240, - 263, - 232, - 238, - 230, - 254, - 218, - 229, - 262, - 253, - 272, - 240, - 277, - 253, - 244, - 242, - 227, - 260, - 249, - 227, - 234, - 261, - 239, - 265, - 234, - 286, - 256, - 230, - 239, - 266, - 271, - 247, - 249, - 271, - 280, - 250, - 237, - 257, - 222, - 235, - 252, - 259, - 244, - 246, - 250, - 261, - 271, - 262, - 265, - 264, - 286, - 243, - 253, - 265, - 251, - 243, - 227, - 230, - 269, - 262, - 283, - 254, - 249, - 255, - 239, - 246, - 278, - 276, - 239, - 247, - 258, - 255, - 246, - 233, - 214, - 271, - 261, - 263, - 243, - 233, - 230, - 242, - 259, - 252, - 279, - 247, - 224, - 222, - 240, - 231, - 259, - 212, - 235, - 244, - 253, - 238, - 263, - 250, - 244, - 275, - 241, - 281, - 236, - 251, - 264, - 259, - 234, - 274, - 255, - 263, - 244, - 262, - 253, - 264, - 260, - 249, - 285, - 264, - 273, - 217, - 246, - 242, - 241, - 275, - 249, - 266, - 250, - 258, - 229, - 270, - 232, - 218, - 235, - 253, - 253, - 237, - 251, - 256, - 257, - 214, - 275, - 250, - 261, - 271, - 273, - 255, - 241, - 241, - 261, - 243, - 243, - 280, - 224, - 229, - 272, - 251, - 249, - 244, - 293, - 215, - 266, - 251, - 235, - 209, - 242, - 222, - 238, - 272, - 252, - 239, - 278, - 253, - 224, - 274, - 245, - 261, - 270, - 250, - 249, - 245, - 255, - 246, - 223, - 227, - 258, - 231, - 232, - 226, - 266, - 258, - 282, - 264, - 244, - 272, - 243, - 240, - 278, - 236, - 264, - 271, - 235, - 254, - 281, - 230, - 256, - 258, - 224, - 236, - 230, - 213, - 278, - 232, - 249, - 235, - 227, - 230, - 245, - 257, - 269, - 245, - 296, - 273, - 246, - 253, - 270, - 274, - 278, - 246, - 240, - 252, - 237, - 219, - 236, - 242, - 265, - 268, - 246, - 245, - 208, - 247, - 235, - 276, - 261, - 253, - 232, - 245, - 244, - 265, - 253, - 237, - 256, - 245, - 262, - 257, - 269, - 260, - 267, - 252, - 246, - 238, - 262, - 267, - 260, - 248, - 244, - 256, - 247, - 286, - 260, - 246, - 297, - 242, - 250, - 258, - 259, - 247, - 265, - 240, - 243, - 237, - 264, - 265, - 259, - 255, - 259, - 251, - 224, - 248, - 249, - 210, - 243, - 276, - 247, - 240, - 269, - 241, - 241, - 243, - 225, - 256, - 241, - 239, - 240, - 233, - 256, - 230, - 253, - 228, - 277, - 255, - 243, - 296, - 227, - 254, - 237, - 234, - 260, - 242, - 242, - 247, - 254, - 208, - 244, - 272, - 267, - 247, - 247, - 242, - 254, - 254, - 270, - 240, - 241, - 232, - 245, - 254, - 276, - 275, - 227, - 244, - 222, - 262, - 254, - 228, - 265, - 228, - 248, - 240, - 276, - 258, - 246, - 261, - 240, - 228, - 255, - 257, - 249, - 222, - 261, - 259, - 254, - 272, - 290, - 286, - 227, - 254, - 254, - 249, - 263, - 243, - 273, - 221, - 251, - 272, - 247, - 214, - 240, - 245, - 246, - 250, - 237, - 247, - 254, - 229, - 225, - 251, - 239, - 239, - 235, - 240, - 226, - 249, - 262, - 265, - 272, - 225, - 261, - 267, - 270, - 256, - 233, - 272, - 270, - 229, - 222, - 252, - 267, - 256, - 251, - 256, - 248, - 229, - 236, - 230, - 280, - 269, - 245, - 252, - 237, - 248, - 248, - 266, - 244, - 262, - 252, - 261, - 235, - 269, - 288, - 241, - 241, - 251, - 257, - 240, - 254, - 255, - 191, - 270, - 243, - 222, - 225, - 273, - 232, - 257, - 252, - 238, - 291, - 245, - 281, - 246, - 265, - 226, - 239, - 235, - 238, - 266, - 273, - 247, - 251, - 246, - 246, - 269, - 268, - 264, - 237, - 271, - 239, - 254, - 255, - 240, - 257, - 256, - 234, - 225, - 266, - 264, - 261, - 242, - 232, - 226, - 255, - 233, - 240, - 265, - 245, - 262, - 252, - 242, - 269, - 261, - 230, - 258, - 242, - 250, - 234, - 267, - 254, - 242, - 242, - 268, - 245, - 231, - 214, - 247, - 251, - 269, - 261, - 267, - 239, - 288, - 223, - 244, - 251, - 240, - 261, - 216, - 250, - 244, - 274, - 225, - 215, - 270, - 243, - 229, - 256, - 251, - 245, - 245, - 266, - 242, - 229, - 248, - 237, - 271, - 261, - 258, - 254, - 239, - 237, - 258, - 224, - 258, - 249, - 236, - 281, - 260, - 248, - 243, - 247, - 252, - 232, - 240, - 256, - 239, - 261, - 227, - 252, - 287, - 244, - 244, - 223, - 247, - 235, - 268, - 280, - 245, - 266, - 280, - 266, - 265, - 281, - 247, - 267, - 243, - 228, - 256, - 259, - 254, - 259, - 256, - 264, - 236, - 246, - 254, - 265, - 256, - 247, - 244, - 227, - 262, - 240, - 271, - 238, - 246, - 254, - 236, - 239, - 265, - 246, - 229, - 220, - 261, - 256, - 249, - 238, - 229, - 236, - 233, - 285, - 255, - 253, - 245, - 254, - 264, - 219, - 278, - 222, - 255, - 239, - 259, - 233, - 253, - 251, - 242, - 244, - 246, - 252, - 255, - 237, - 241 - ] - }, - { - "counters": [ - 214, - 250, - 272, - 265, - 254, - 249, - 243, - 258, - 263, - 264, - 284, - 245, - 249, - 222, - 246, - 230, - 232, - 257, - 254, - 254, - 245, - 271, - 285, - 240, - 250, - 263, - 231, - 248, - 258, - 251, - 262, - 233, - 246, - 233, - 264, - 255, - 246, - 244, - 240, - 244, - 299, - 241, - 248, - 262, - 242, - 264, - 248, - 257, - 269, - 217, - 242, - 262, - 213, - 261, - 263, - 252, - 242, - 244, - 256, - 229, - 248, - 275, - 234, - 239, - 264, - 239, - 284, - 230, - 252, - 237, - 231, - 246, - 276, - 265, - 271, - 246, - 249, - 254, - 253, - 241, - 255, - 246, - 255, - 247, - 280, - 239, - 246, - 254, - 228, - 246, - 260, - 248, - 260, - 245, - 248, - 230, - 272, - 260, - 248, - 253, - 252, - 220, - 259, - 248, - 255, - 267, - 252, - 228, - 226, - 251, - 270, - 266, - 235, - 253, - 270, - 247, - 242, - 247, - 267, - 237, - 261, - 244, - 241, - 269, - 255, - 264, - 235, - 267, - 265, - 244, - 248, - 238, - 226, - 281, - 246, - 269, - 254, - 281, - 260, - 262, - 242, - 253, - 267, - 264, - 274, - 233, - 245, - 232, - 233, - 210, - 262, - 262, - 259, - 267, - 231, - 226, - 246, - 225, - 224, - 220, - 226, - 248, - 268, - 246, - 228, - 238, - 224, - 249, - 230, - 264, - 240, - 249, - 243, - 246, - 234, - 232, - 245, - 234, - 280, - 265, - 225, - 221, - 254, - 264, - 224, - 215, - 278, - 239, - 248, - 254, - 258, - 240, - 241, - 242, - 278, - 242, - 288, - 255, - 265, - 253, - 248, - 244, - 240, - 237, - 241, - 268, - 256, - 239, - 269, - 248, - 249, - 237, - 243, - 252, - 248, - 252, - 236, - 244, - 247, - 238, - 201, - 239, - 267, - 244, - 245, - 259, - 273, - 265, - 255, - 227, - 251, - 243, - 262, - 238, - 267, - 256, - 261, - 245, - 258, - 222, - 238, - 238, - 269, - 250, - 222, - 249, - 254, - 233, - 256, - 271, - 274, - 246, - 261, - 256, - 265, - 271, - 252, - 279, - 207, - 249, - 255, - 245, - 249, - 280, - 266, - 259, - 234, - 261, - 226, - 238, - 243, - 228, - 275, - 272, - 249, - 237, - 242, - 246, - 247, - 279, - 223, - 255, - 270, - 277, - 229, - 224, - 244, - 270, - 236, - 239, - 233, - 215, - 248, - 267, - 216, - 229, - 225, - 273, - 238, - 271, - 234, - 262, - 262, - 234, - 238, - 261, - 246, - 235, - 266, - 249, - 252, - 246, - 249, - 242, - 274, - 254, - 267, - 279, - 239, - 263, - 245, - 247, - 234, - 258, - 230, - 296, - 267, - 252, - 219, - 261, - 250, - 280, - 261, - 235, - 242, - 250, - 267, - 253, - 236, - 257, - 256, - 241, - 282, - 228, - 241, - 252, - 209, - 254, - 230, - 243, - 251, - 235, - 245, - 228, - 248, - 228, - 221, - 257, - 282, - 242, - 244, - 233, - 271, - 252, - 232, - 270, - 241, - 253, - 263, - 281, - 265, - 276, - 235, - 249, - 283, - 249, - 275, - 252, - 257, - 243, - 232, - 235, - 273, - 244, - 241, - 267, - 235, - 267, - 245, - 275, - 250, - 263, - 241, - 247, - 264, - 254, - 263, - 251, - 253, - 252, - 244, - 272, - 255, - 238, - 242, - 259, - 245, - 232, - 242, - 240, - 240, - 252, - 276, - 227, - 268, - 232, - 254, - 262, - 260, - 264, - 262, - 258, - 248, - 243, - 229, - 248, - 279, - 281, - 214, - 261, - 269, - 246, - 251, - 255, - 252, - 245, - 220, - 249, - 257, - 268, - 291, - 226, - 238, - 263, - 243, - 233, - 241, - 251, - 256, - 254, - 255, - 260, - 257, - 244, - 242, - 245, - 236, - 246, - 249, - 277, - 230, - 201, - 264, - 239, - 266, - 238, - 248, - 245, - 246, - 264, - 250, - 250, - 235, - 274, - 266, - 262, - 285, - 232, - 279, - 244, - 266, - 254, - 263, - 233, - 259, - 252, - 226, - 252, - 277, - 258, - 261, - 233, - 238, - 267, - 233, - 222, - 237, - 263, - 257, - 259, - 231, - 232, - 225, - 228, - 254, - 255, - 271, - 257, - 226, - 244, - 254, - 256, - 264, - 261, - 277, - 237, - 267, - 240, - 250, - 295, - 244, - 251, - 239, - 239, - 255, - 229, - 249, - 243, - 270, - 235, - 218, - 247, - 279, - 288, - 240, - 249, - 243, - 266, - 223, - 245, - 261, - 228, - 235, - 237, - 231, - 271, - 232, - 267, - 245, - 234, - 232, - 269, - 241, - 258, - 260, - 243, - 279, - 273, - 247, - 240, - 256, - 233, - 257, - 249, - 256, - 282, - 250, - 256, - 248, - 256, - 243, - 219, - 262, - 241, - 264, - 246, - 239, - 237, - 273, - 243, - 282, - 236, - 261, - 252, - 238, - 264, - 221, - 251, - 262, - 258, - 272, - 235, - 245, - 269, - 232, - 255, - 258, - 251, - 272, - 262, - 249, - 243, - 254, - 268, - 253, - 276, - 241, - 228, - 255, - 252, - 242, - 273, - 237, - 252, - 244, - 261, - 269, - 262, - 237, - 259, - 256, - 258, - 238, - 260, - 251, - 272, - 261, - 232, - 263, - 276, - 248, - 249, - 255, - 237, - 260, - 246, - 268, - 222, - 264, - 253, - 262, - 238, - 247, - 276, - 238, - 237, - 251, - 251, - 226, - 271, - 256, - 260, - 255, - 239, - 273, - 262, - 260, - 279, - 251, - 233, - 248, - 227, - 246, - 232, - 231, - 270, - 234, - 243, - 283, - 250, - 253, - 256, - 223, - 272, - 255, - 252, - 257, - 285, - 231, - 282, - 262, - 268, - 257, - 254, - 253, - 224, - 234, - 254, - 249, - 262, - 254, - 244, - 250, - 256, - 259, - 271, - 260, - 277, - 251, - 273, - 247, - 270, - 255, - 262, - 254, - 233, - 244, - 254, - 218, - 223, - 251, - 218, - 252, - 233, - 237, - 262, - 250, - 244, - 255, - 229, - 265, - 271, - 260, - 263, - 256, - 262, - 247, - 242, - 265, - 257, - 252, - 239, - 256, - 259, - 275, - 245, - 260, - 275, - 254, - 247, - 240, - 270, - 259, - 239, - 240, - 263, - 245, - 217, - 239, - 233, - 247, - 246, - 254, - 236, - 269, - 238, - 264, - 272, - 259, - 255, - 255, - 222, - 243, - 258, - 270, - 259, - 230, - 248, - 254, - 276, - 230, - 225, - 218, - 242, - 259, - 262, - 270, - 265, - 251, - 253, - 263, - 237, - 247, - 225, - 237, - 258, - 234, - 254, - 235, - 236, - 264, - 234, - 241, - 238, - 251, - 241, - 238, - 242, - 234, - 250, - 255, - 258, - 259, - 258, - 259, - 266, - 270, - 255, - 237, - 245, - 258, - 253, - 270, - 267, - 269, - 241, - 231, - 243, - 254, - 265, - 235, - 242, - 269, - 221, - 246, - 239, - 277, - 284, - 266, - 238, - 269, - 247, - 246, - 253, - 265, - 234, - 256, - 273, - 273, - 248, - 241, - 249, - 242, - 243, - 235, - 258, - 243, - 226, - 244, - 223, - 234, - 243, - 245, - 215, - 227, - 243, - 243, - 265, - 292, - 260, - 274, - 264, - 230, - 264, - 217, - 266, - 240, - 241, - 238, - 256, - 242, - 239, - 241, - 252, - 264, - 249, - 244, - 268, - 255, - 249, - 248, - 268, - 247, - 258, - 225, - 260, - 265, - 245, - 255, - 261, - 258, - 273, - 220, - 232, - 240, - 251, - 248, - 249, - 246, - 273, - 282, - 276, - 254, - 250, - 249, - 254, - 244, - 259, - 251, - 273, - 225, - 254, - 266, - 252, - 268, - 248, - 237, - 255, - 260, - 244, - 260, - 247, - 237, - 274, - 256, - 251, - 267, - 239, - 215, - 234, - 232, - 261, - 252, - 256, - 271, - 248, - 236, - 250, - 249, - 252, - 250, - 245, - 223, - 253, - 272, - 260, - 253, - 243, - 262, - 242, - 254, - 246, - 267, - 245, - 231, - 250, - 271, - 231, - 220, - 241, - 269, - 274, - 245, - 258, - 233, - 244, - 231, - 244, - 270, - 248, - 243, - 259, - 262, - 234, - 254, - 274, - 246, - 233, - 225, - 242, - 247, - 239, - 248, - 270, - 254, - 236, - 242, - 256, - 271, - 258, - 256, - 249, - 235, - 245, - 257, - 238, - 269, - 245, - 238, - 221, - 236, - 251, - 247, - 253, - 236, - 252, - 253, - 224, - 255, - 265, - 237, - 248, - 258, - 258, - 252, - 266, - 269, - 248, - 257, - 263, - 243, - 257, - 258, - 270, - 224, - 253, - 248, - 257, - 237, - 259, - 239, - 212, - 275, - 266, - 225, - 267, - 246, - 269, - 241, - 257, - 239, - 267, - 255, - 260, - 261, - 245, - 233, - 252, - 276, - 232, - 262, - 262, - 220, - 292, - 273, - 243, - 260, - 259, - 230, - 256, - 244, - 270, - 232, - 243, - 259, - 280, - 227, - 247, - 251, - 251, - 280, - 246, - 236, - 262, - 287, - 229, - 246, - 247, - 260, - 224, - 264, - 269, - 246, - 260, - 248, - 257, - 259, - 255, - 248, - 236, - 241, - 231, - 242, - 254, - 241, - 261, - 245, - 235, - 261, - 230, - 276, - 254, - 251, - 290, - 253, - 257, - 229, - 256, - 248, - 252, - 278, - 264, - 241, - 248, - 246, - 241, - 250, - 249, - 255, - 237, - 249, - 253, - 253, - 248, - 270, - 223, - 248, - 266, - 250, - 252, - 251, - 238, - 241, - 243, - 235, - 247, - 263, - 263, - 268, - 256, - 266, - 256, - 229, - 239, - 250, - 248, - 284, - 249, - 268, - 232, - 216, - 274, - 262, - 265, - 263, - 241, - 239, - 263, - 254, - 214, - 253, - 263, - 240, - 243, - 241, - 239, - 240, - 245, - 216, - 231, - 264, - 263, - 267, - 245, - 246, - 236, - 281, - 257, - 237, - 261, - 257, - 234, - 247, - 246, - 227, - 252, - 257, - 257, - 249, - 253, - 233, - 246, - 259, - 242, - 243, - 274, - 256, - 232, - 229, - 254, - 232, - 248, - 247, - 255, - 270, - 219, - 266, - 239, - 240, - 221, - 266, - 264, - 238, - 239, - 237, - 251, - 255, - 258, - 239, - 248, - 250, - 262, - 281, - 227, - 277, - 247, - 257, - 270, - 268, - 262, - 259, - 232, - 236, - 263, - 245, - 262, - 236, - 230, - 276, - 239, - 247, - 264, - 253, - 259, - 272, - 235, - 244, - 255, - 240, - 247, - 248, - 235, - 250, - 253, - 243, - 235, - 235, - 263, - 260, - 265, - 272, - 224, - 268, - 223, - 233, - 247, - 244, - 256, - 254, - 254, - 251, - 255, - 249, - 252, - 237, - 264, - 227, - 243, - 227, - 254, - 215, - 240, - 223, - 248, - 235, - 263, - 222, - 267, - 239, - 243, - 246, - 232, - 235, - 233, - 240, - 245, - 277, - 228, - 247, - 247, - 232, - 245, - 237, - 260, - 274, - 258, - 258, - 271, - 269, - 263, - 273, - 239, - 266, - 268, - 253, - 246, - 227, - 256, - 270, - 233, - 258, - 246, - 254, - 228, - 247, - 248, - 276, - 265, - 264, - 239, - 240, - 250, - 248, - 238, - 256, - 231, - 241, - 246, - 274, - 256, - 227, - 252, - 223, - 245, - 229, - 280, - 235, - 255, - 224, - 239, - 243, - 221, - 237, - 269, - 227, - 240, - 241, - 236, - 275, - 254, - 254, - 251, - 232, - 233, - 224, - 270, - 269, - 247, - 242, - 249, - 237, - 233, - 244, - 242, - 254, - 240, - 239, - 264, - 257, - 243, - 256, - 274, - 268, - 236, - 272, - 243, - 247, - 269, - 249, - 254, - 251, - 255, - 238, - 256, - 261, - 238, - 255, - 256, - 266, - 268, - 276, - 244, - 247, - 234, - 236, - 286, - 241, - 255, - 282, - 251, - 229, - 260, - 252, - 266, - 257, - 224, - 263, - 245, - 258, - 247, - 245, - 253, - 247, - 287, - 256, - 277, - 271, - 234, - 251, - 253, - 277, - 257, - 245, - 247, - 251, - 221, - 228, - 230, - 251, - 240, - 233, - 231, - 230, - 242, - 252, - 253, - 235, - 259, - 282, - 234, - 236, - 234, - 278, - 245, - 249, - 254, - 240, - 252, - 213, - 254, - 254, - 249, - 272, - 253, - 220, - 214, - 250, - 244, - 238, - 259, - 245, - 242, - 246, - 229, - 260, - 249, - 253, - 252, - 276, - 245, - 265, - 249, - 257, - 278, - 257, - 250, - 249, - 242, - 252, - 274, - 267, - 258, - 226, - 237, - 263, - 243, - 253, - 257, - 237, - 229, - 234, - 244, - 272, - 227, - 255, - 236, - 249, - 261, - 264, - 207, - 250, - 255, - 260, - 242, - 262, - 291, - 240, - 241, - 267, - 250, - 261, - 244, - 227, - 247, - 233, - 259, - 265, - 249, - 250, - 260, - 273, - 248, - 250, - 256, - 248, - 245, - 232, - 235, - 247, - 255, - 258, - 263, - 216, - 238, - 238, - 262, - 243, - 251, - 264, - 272, - 238, - 238, - 272, - 216, - 262, - 260, - 263, - 242, - 259, - 241, - 249, - 242, - 240, - 253, - 237, - 251, - 265, - 255, - 266, - 276, - 251, - 254, - 249, - 257, - 228, - 245, - 253, - 263, - 258, - 231, - 244, - 258, - 230, - 229, - 252, - 262, - 228, - 258, - 248, - 250, - 260, - 243, - 256, - 245, - 238, - 239, - 240, - 261, - 286, - 255, - 277, - 231, - 237, - 240, - 255, - 229, - 261, - 248, - 251, - 249, - 236, - 297, - 240, - 257, - 276, - 251, - 234, - 254, - 258, - 251, - 257, - 242, - 232, - 242, - 236, - 244, - 269, - 287, - 261, - 256, - 236, - 269, - 248, - 217, - 245, - 250, - 234, - 253, - 269, - 246, - 280, - 252, - 238, - 278, - 256, - 249, - 258, - 273, - 237, - 255, - 236, - 224, - 241, - 238, - 253, - 234, - 233, - 238, - 245, - 247, - 271, - 251, - 253, - 268, - 286, - 231, - 247, - 214, - 233, - 278, - 242, - 278, - 230, - 237, - 261, - 258, - 226, - 240, - 232, - 229, - 218, - 267, - 266, - 235, - 255, - 257, - 249, - 238, - 270, - 229, - 279, - 248, - 261, - 244, - 280, - 235, - 250, - 252, - 228, - 240, - 241, - 248, - 250, - 261, - 243, - 240, - 273, - 254, - 233, - 251, - 248, - 230, - 232, - 253, - 259, - 259, - 221, - 208, - 247, - 270, - 244, - 248, - 240, - 257, - 260, - 246, - 261, - 261, - 246, - 238, - 284, - 216, - 250, - 275, - 258, - 250, - 246, - 250, - 246, - 250, - 236, - 248, - 247, - 249, - 248, - 234, - 271, - 250, - 234, - 256, - 241, - 263, - 241, - 232, - 246, - 256, - 246, - 239, - 286, - 261, - 248, - 251, - 242, - 244, - 258, - 242, - 258, - 229, - 265, - 232, - 238, - 292, - 236, - 270, - 252, - 229, - 265, - 237, - 225, - 225, - 237, - 257, - 262, - 256, - 233, - 228, - 257, - 231, - 257, - 249, - 249, - 256, - 238, - 227, - 248, - 213, - 228, - 248, - 251, - 247, - 235, - 228, - 249, - 273, - 238, - 287, - 243, - 255, - 263, - 277, - 264, - 233, - 229, - 256, - 244, - 267, - 260, - 252, - 243, - 278, - 258, - 236, - 242, - 261, - 231, - 236, - 230, - 240, - 221, - 233, - 256, - 250, - 238, - 238, - 275, - 263, - 257, - 241, - 268, - 246, - 238, - 276, - 248, - 239, - 230, - 229, - 251, - 231, - 249, - 223, - 249, - 231, - 246, - 247, - 240, - 250, - 260, - 229, - 272, - 243, - 279, - 268, - 235, - 230, - 246, - 248, - 250, - 231, - 231, - 244, - 257, - 267, - 263, - 249, - 236, - 255, - 240, - 255, - 271, - 262, - 239, - 279, - 253, - 252, - 232, - 230, - 261, - 245, - 240, - 225, - 261, - 245, - 256, - 274, - 252, - 240, - 264, - 235, - 257, - 245, - 264, - 280, - 259, - 246, - 252, - 275, - 270, - 257, - 236, - 266, - 254, - 228, - 252, - 232, - 256, - 235, - 235, - 241, - 254, - 267, - 249, - 264, - 218, - 265, - 265, - 253, - 270, - 262, - 269, - 254, - 249, - 241, - 269, - 256, - 253, - 262, - 247, - 239, - 235, - 238, - 248, - 225, - 248, - 241, - 240, - 246, - 236, - 260, - 271, - 260, - 257, - 245, - 241, - 249, - 236, - 250, - 250, - 271, - 236, - 224, - 255, - 261, - 263, - 247, - 290, - 256, - 225, - 247, - 241, - 239, - 261, - 232, - 257, - 246, - 234, - 254, - 241, - 268, - 248, - 271, - 238, - 245, - 257, - 222, - 253, - 233, - 270, - 266, - 242, - 263, - 252, - 241, - 267, - 242, - 233, - 247, - 264, - 260, - 239, - 248, - 249, - 274, - 272, - 250, - 238, - 250, - 248, - 252, - 223, - 256, - 250, - 243, - 227, - 255, - 239, - 245, - 243, - 253, - 242, - 260, - 235, - 252, - 251, - 249, - 277, - 245, - 227, - 255, - 258, - 257, - 259, - 253, - 253, - 261, - 260, - 263, - 244, - 253, - 245, - 278, - 251, - 245, - 245, - 269, - 257, - 241, - 224, - 257 - ] - }, - { - "counters": [ - 236, - 244, - 244, - 223, - 275, - 237, - 273, - 264, - 237, - 252, - 238, - 226, - 230, - 234, - 254, - 259, - 253, - 260, - 256, - 231, - 240, - 259, - 265, - 259, - 249, - 238, - 238, - 276, - 258, - 234, - 278, - 259, - 234, - 212, - 245, - 266, - 230, - 255, - 203, - 249, - 237, - 240, - 261, - 251, - 243, - 241, - 263, - 267, - 268, - 257, - 228, - 237, - 234, - 250, - 223, - 254, - 285, - 242, - 250, - 225, - 254, - 242, - 251, - 255, - 263, - 234, - 241, - 266, - 212, - 246, - 224, - 232, - 253, - 249, - 257, - 248, - 247, - 249, - 255, - 258, - 255, - 254, - 273, - 272, - 257, - 261, - 263, - 246, - 251, - 237, - 260, - 281, - 231, - 217, - 252, - 231, - 255, - 247, - 253, - 245, - 254, - 239, - 267, - 262, - 239, - 256, - 263, - 240, - 236, - 264, - 265, - 255, - 265, - 247, - 269, - 232, - 240, - 262, - 236, - 258, - 279, - 266, - 245, - 269, - 255, - 240, - 244, - 254, - 265, - 265, - 237, - 246, - 241, - 252, - 226, - 244, - 256, - 249, - 251, - 250, - 274, - 256, - 235, - 224, - 240, - 248, - 233, - 253, - 256, - 240, - 236, - 225, - 225, - 239, - 270, - 252, - 236, - 275, - 261, - 217, - 222, - 271, - 246, - 254, - 264, - 275, - 249, - 261, - 237, - 275, - 264, - 247, - 260, - 271, - 237, - 239, - 242, - 261, - 241, - 244, - 282, - 244, - 259, - 268, - 250, - 222, - 222, - 248, - 249, - 266, - 269, - 249, - 240, - 245, - 290, - 249, - 258, - 257, - 241, - 217, - 228, - 231, - 248, - 253, - 245, - 214, - 256, - 255, - 276, - 268, - 257, - 234, - 246, - 254, - 227, - 280, - 255, - 224, - 273, - 261, - 243, - 254, - 270, - 240, - 259, - 226, - 248, - 244, - 239, - 251, - 239, - 267, - 268, - 254, - 268, - 255, - 246, - 253, - 222, - 279, - 263, - 269, - 246, - 269, - 220, - 239, - 263, - 251, - 272, - 216, - 253, - 258, - 243, - 233, - 250, - 261, - 258, - 251, - 252, - 248, - 243, - 246, - 265, - 244, - 247, - 221, - 256, - 241, - 251, - 221, - 248, - 237, - 245, - 263, - 261, - 245, - 227, - 240, - 224, - 259, - 230, - 252, - 256, - 273, - 248, - 255, - 232, - 267, - 257, - 277, - 241, - 259, - 229, - 246, - 248, - 248, - 253, - 262, - 235, - 254, - 221, - 242, - 230, - 283, - 224, - 248, - 259, - 240, - 244, - 249, - 254, - 265, - 264, - 239, - 241, - 250, - 245, - 248, - 257, - 270, - 248, - 236, - 264, - 244, - 258, - 259, - 267, - 254, - 227, - 236, - 260, - 241, - 258, - 242, - 273, - 255, - 270, - 266, - 230, - 242, - 232, - 247, - 254, - 249, - 242, - 262, - 254, - 232, - 258, - 239, - 251, - 244, - 252, - 255, - 250, - 257, - 247, - 254, - 249, - 243, - 257, - 260, - 259, - 237, - 230, - 272, - 231, - 246, - 235, - 245, - 234, - 239, - 243, - 225, - 247, - 269, - 257, - 227, - 241, - 246, - 235, - 266, - 217, - 243, - 235, - 245, - 243, - 250, - 252, - 245, - 258, - 249, - 235, - 221, - 265, - 214, - 243, - 228, - 264, - 254, - 257, - 235, - 240, - 261, - 247, - 249, - 240, - 225, - 279, - 238, - 263, - 271, - 251, - 206, - 266, - 270, - 242, - 243, - 246, - 241, - 265, - 252, - 253, - 262, - 255, - 252, - 228, - 233, - 256, - 237, - 254, - 245, - 277, - 242, - 263, - 252, - 268, - 267, - 263, - 250, - 228, - 245, - 263, - 218, - 247, - 251, - 244, - 249, - 246, - 250, - 285, - 243, - 244, - 294, - 266, - 260, - 236, - 258, - 270, - 270, - 244, - 248, - 256, - 260, - 251, - 248, - 239, - 250, - 245, - 297, - 235, - 270, - 263, - 260, - 248, - 271, - 245, - 231, - 281, - 271, - 252, - 262, - 266, - 243, - 260, - 274, - 241, - 263, - 238, - 258, - 257, - 243, - 239, - 232, - 249, - 252, - 245, - 235, - 238, - 249, - 259, - 222, - 259, - 242, - 234, - 252, - 266, - 235, - 230, - 238, - 230, - 256, - 244, - 269, - 253, - 230, - 276, - 226, - 258, - 271, - 258, - 251, - 235, - 235, - 248, - 291, - 274, - 257, - 247, - 263, - 231, - 254, - 257, - 257, - 229, - 270, - 231, - 242, - 261, - 271, - 225, - 248, - 217, - 247, - 214, - 228, - 250, - 253, - 247, - 237, - 246, - 238, - 294, - 249, - 274, - 260, - 284, - 234, - 263, - 273, - 242, - 240, - 250, - 259, - 238, - 271, - 258, - 260, - 266, - 242, - 249, - 254, - 247, - 248, - 268, - 269, - 245, - 240, - 280, - 222, - 254, - 230, - 228, - 227, - 266, - 258, - 282, - 259, - 266, - 245, - 247, - 249, - 276, - 213, - 267, - 229, - 250, - 249, - 260, - 220, - 249, - 251, - 234, - 230, - 259, - 250, - 245, - 276, - 256, - 245, - 246, - 264, - 263, - 244, - 254, - 228, - 231, - 248, - 248, - 240, - 251, - 251, - 264, - 260, - 254, - 227, - 271, - 253, - 237, - 243, - 216, - 240, - 249, - 271, - 229, - 234, - 273, - 243, - 269, - 251, - 299, - 317, - 250, - 249, - 257, - 248, - 236, - 254, - 254, - 234, - 245, - 246, - 234, - 261, - 249, - 243, - 239, - 258, - 245, - 257, - 240, - 240, - 233, - 251, - 257, - 219, - 252, - 260, - 252, - 255, - 255, - 264, - 261, - 259, - 217, - 262, - 221, - 253, - 259, - 260, - 245, - 291, - 222, - 255, - 265, - 276, - 262, - 252, - 245, - 270, - 261, - 246, - 211, - 249, - 262, - 252, - 249, - 239, - 257, - 249, - 251, - 240, - 263, - 231, - 235, - 259, - 268, - 255, - 263, - 225, - 260, - 252, - 256, - 268, - 256, - 266, - 261, - 230, - 239, - 228, - 266, - 272, - 272, - 261, - 240, - 236, - 230, - 276, - 295, - 256, - 234, - 255, - 239, - 254, - 250, - 252, - 227, - 252, - 256, - 257, - 255, - 253, - 266, - 253, - 249, - 237, - 253, - 276, - 230, - 248, - 266, - 234, - 230, - 262, - 264, - 255, - 230, - 277, - 224, - 255, - 239, - 235, - 256, - 284, - 228, - 247, - 255, - 259, - 242, - 244, - 261, - 210, - 266, - 234, - 241, - 246, - 251, - 263, - 236, - 254, - 249, - 256, - 235, - 238, - 235, - 259, - 225, - 276, - 262, - 245, - 234, - 243, - 233, - 262, - 247, - 234, - 268, - 242, - 250, - 240, - 247, - 231, - 254, - 264, - 226, - 249, - 243, - 264, - 228, - 265, - 243, - 245, - 240, - 252, - 249, - 242, - 231, - 249, - 245, - 253, - 256, - 229, - 279, - 242, - 259, - 265, - 250, - 256, - 264, - 272, - 220, - 237, - 256, - 270, - 252, - 242, - 261, - 228, - 274, - 241, - 239, - 253, - 253, - 261, - 226, - 233, - 237, - 259, - 228, - 212, - 245, - 259, - 246, - 251, - 261, - 252, - 245, - 262, - 250, - 276, - 224, - 262, - 233, - 248, - 245, - 251, - 233, - 241, - 249, - 239, - 258, - 267, - 257, - 229, - 273, - 257, - 250, - 269, - 260, - 245, - 257, - 260, - 235, - 242, - 266, - 277, - 265, - 249, - 260, - 222, - 248, - 240, - 220, - 231, - 252, - 232, - 272, - 276, - 243, - 250, - 248, - 259, - 245, - 240, - 258, - 247, - 243, - 253, - 237, - 238, - 235, - 269, - 242, - 266, - 230, - 255, - 227, - 220, - 269, - 212, - 288, - 270, - 249, - 236, - 219, - 255, - 242, - 270, - 243, - 258, - 257, - 245, - 248, - 257, - 216, - 248, - 270, - 245, - 258, - 242, - 254, - 264, - 260, - 238, - 269, - 239, - 242, - 216, - 243, - 247, - 236, - 262, - 267, - 246, - 236, - 237, - 239, - 261, - 259, - 248, - 230, - 243, - 224, - 232, - 254, - 240, - 228, - 261, - 241, - 252, - 269, - 230, - 221, - 251, - 265, - 224, - 282, - 244, - 279, - 254, - 261, - 250, - 261, - 249, - 240, - 250, - 232, - 233, - 251, - 243, - 240, - 213, - 231, - 249, - 219, - 225, - 260, - 255, - 250, - 285, - 273, - 268, - 241, - 263, - 265, - 265, - 248, - 256, - 249, - 248, - 230, - 233, - 222, - 260, - 246, - 260, - 261, - 257, - 238, - 257, - 268, - 260, - 242, - 268, - 230, - 264, - 274, - 243, - 244, - 251, - 237, - 224, - 261, - 279, - 245, - 258, - 254, - 250, - 246, - 277, - 278, - 274, - 261, - 255, - 249, - 244, - 249, - 257, - 258, - 283, - 278, - 260, - 243, - 236, - 251, - 276, - 286, - 265, - 239, - 253, - 248, - 244, - 233, - 246, - 236, - 239, - 233, - 233, - 232, - 263, - 243, - 237, - 209, - 270, - 263, - 275, - 241, - 241, - 264, - 239, - 259, - 247, - 250, - 249, - 264, - 242, - 258, - 228, - 228, - 245, - 241, - 250, - 241, - 245, - 217, - 265, - 212, - 266, - 265, - 242, - 236, - 269, - 259, - 220, - 254, - 243, - 249, - 245, - 249, - 263, - 243, - 257, - 245, - 219, - 265, - 275, - 254, - 251, - 260, - 257, - 260, - 231, - 284, - 237, - 246, - 242, - 260, - 243, - 255, - 247, - 231, - 283, - 245, - 234, - 234, - 241, - 244, - 252, - 223, - 224, - 256, - 227, - 283, - 244, - 242, - 260, - 224, - 219, - 232, - 232, - 275, - 233, - 268, - 269, - 276, - 263, - 249, - 254, - 260, - 234, - 245, - 255, - 238, - 266, - 222, - 224, - 277, - 271, - 222, - 231, - 234, - 246, - 248, - 242, - 248, - 240, - 249, - 246, - 252, - 271, - 253, - 267, - 271, - 264, - 221, - 226, - 245, - 248, - 279, - 248, - 219, - 267, - 264, - 290, - 276, - 244, - 259, - 238, - 277, - 270, - 263, - 254, - 245, - 236, - 248, - 249, - 225, - 264, - 257, - 261, - 280, - 225, - 232, - 232, - 249, - 245, - 258, - 262, - 260, - 248, - 225, - 257, - 258, - 239, - 227, - 257, - 238, - 270, - 260, - 267, - 241, - 261, - 263, - 230, - 242, - 247, - 265, - 267, - 260, - 264, - 277, - 229, - 262, - 257, - 235, - 219, - 211, - 263, - 217, - 229, - 258, - 245, - 262, - 252, - 267, - 276, - 257, - 252, - 243, - 246, - 229, - 245, - 258, - 256, - 256, - 235, - 237, - 265, - 249, - 256, - 259, - 227, - 239, - 262, - 228, - 258, - 268, - 258, - 243, - 260, - 236, - 238, - 232, - 258, - 255, - 235, - 252, - 235, - 251, - 239, - 260, - 250, - 219, - 252, - 263, - 269, - 211, - 268, - 276, - 260, - 262, - 223, - 257, - 258, - 280, - 281, - 291, - 226, - 232, - 228, - 227, - 273, - 247, - 249, - 253, - 239, - 259, - 238, - 256, - 257, - 280, - 241, - 271, - 259, - 290, - 237, - 269, - 263, - 265, - 246, - 249, - 274, - 241, - 280, - 250, - 250, - 247, - 260, - 256, - 241, - 242, - 244, - 233, - 238, - 249, - 230, - 245, - 254, - 250, - 242, - 246, - 257, - 233, - 234, - 254, - 265, - 262, - 248, - 251, - 256, - 277, - 239, - 252, - 232, - 232, - 232, - 225, - 262, - 263, - 281, - 225, - 236, - 256, - 247, - 251, - 249, - 239, - 269, - 281, - 247, - 248, - 255, - 242, - 249, - 289, - 233, - 239, - 274, - 219, - 245, - 247, - 235, - 274, - 250, - 242, - 228, - 283, - 236, - 262, - 249, - 245, - 273, - 261, - 258, - 228, - 238, - 253, - 254, - 269, - 221, - 261, - 267, - 242, - 252, - 271, - 236, - 270, - 250, - 246, - 248, - 258, - 220, - 241, - 248, - 240, - 242, - 279, - 269, - 285, - 284, - 245, - 274, - 239, - 227, - 266, - 271, - 273, - 264, - 234, - 253, - 226, - 226, - 219, - 225, - 231, - 267, - 245, - 259, - 240, - 251, - 250, - 256, - 300, - 254, - 235, - 237, - 261, - 233, - 257, - 244, - 241, - 268, - 239, - 257, - 256, - 250, - 263, - 252, - 256, - 253, - 255, - 225, - 258, - 237, - 294, - 249, - 241, - 245, - 256, - 271, - 258, - 262, - 249, - 263, - 228, - 254, - 235, - 246, - 241, - 265, - 277, - 235, - 253, - 239, - 243, - 296, - 251, - 232, - 246, - 281, - 251, - 258, - 227, - 255, - 259, - 268, - 244, - 231, - 227, - 258, - 239, - 250, - 250, - 257, - 237, - 240, - 277, - 268, - 256, - 240, - 245, - 240, - 263, - 253, - 242, - 258, - 250, - 247, - 249, - 278, - 252, - 235, - 239, - 227, - 217, - 263, - 266, - 263, - 284, - 250, - 220, - 244, - 259, - 247, - 237, - 255, - 256, - 250, - 264, - 215, - 215, - 243, - 264, - 218, - 260, - 233, - 248, - 264, - 256, - 274, - 258, - 236, - 253, - 227, - 254, - 244, - 241, - 285, - 250, - 261, - 247, - 203, - 249, - 262, - 251, - 254, - 233, - 254, - 235, - 225, - 259, - 283, - 231, - 249, - 258, - 232, - 275, - 227, - 264, - 265, - 217, - 235, - 259, - 253, - 237, - 255, - 263, - 243, - 209, - 249, - 240, - 246, - 238, - 253, - 223, - 246, - 241, - 268, - 266, - 242, - 249, - 203, - 255, - 215, - 244, - 230, - 243, - 249, - 232, - 243, - 271, - 263, - 241, - 271, - 256, - 250, - 248, - 248, - 223, - 257, - 252, - 257, - 245, - 252, - 247, - 266, - 245, - 245, - 232, - 248, - 233, - 280, - 233, - 238, - 251, - 241, - 253, - 257, - 235, - 246, - 235, - 222, - 288, - 240, - 272, - 240, - 237, - 278, - 286, - 252, - 232, - 249, - 237, - 223, - 257, - 264, - 261, - 263, - 246, - 279, - 249, - 249, - 266, - 266, - 267, - 245, - 275, - 237, - 254, - 244, - 260, - 257, - 249, - 252, - 253, - 274, - 234, - 231, - 283, - 236, - 251, - 255, - 245, - 269, - 276, - 245, - 295, - 223, - 247, - 202, - 246, - 232, - 240, - 269, - 267, - 256, - 233, - 236, - 239, - 229, - 234, - 257, - 265, - 257, - 225, - 249, - 282, - 266, - 253, - 252, - 253, - 255, - 250, - 240, - 259, - 252, - 250, - 244, - 261, - 226, - 277, - 272, - 265, - 224, - 231, - 250, - 234, - 251, - 219, - 281, - 239, - 247, - 274, - 236, - 244, - 263, - 265, - 244, - 269, - 225, - 269, - 251, - 251, - 245, - 217, - 250, - 247, - 237, - 292, - 248, - 255, - 256, - 234, - 261, - 272, - 260, - 298, - 251, - 267, - 280, - 247, - 258, - 245, - 267, - 267, - 254, - 220, - 255, - 229, - 253, - 246, - 242, - 235, - 255, - 250, - 236, - 259, - 244, - 270, - 231, - 263, - 254, - 237, - 272, - 249, - 280, - 266, - 258, - 232, - 248, - 246, - 228, - 244, - 254, - 257, - 259, - 278, - 246, - 236, - 263, - 250, - 232, - 273, - 266, - 278, - 236, - 251, - 259, - 258, - 252, - 225, - 269, - 238, - 250, - 255, - 229, - 265, - 265, - 223, - 218, - 235, - 227, - 259, - 251, - 240, - 257, - 217, - 261, - 236, - 262, - 260, - 236, - 252, - 235, - 250, - 269, - 271, - 229, - 239, - 272, - 265, - 231, - 256, - 255, - 259, - 252, - 228, - 235, - 258, - 252, - 254, - 255, - 233, - 229, - 273, - 244, - 256, - 262, - 251, - 248, - 232, - 247, - 252, - 233, - 282, - 248, - 233, - 236, - 246, - 280, - 251, - 261, - 244, - 252, - 284, - 233, - 249, - 233, - 247, - 256, - 228, - 262, - 257, - 233, - 243, - 255, - 254, - 244, - 270, - 245, - 252, - 272, - 254, - 254, - 287, - 251, - 248, - 291, - 215, - 270, - 241, - 228, - 272, - 249, - 238, - 250, - 248, - 280, - 267, - 258, - 233, - 275, - 237, - 212, - 241, - 245, - 247, - 267, - 256, - 227, - 260, - 270, - 244, - 260, - 222, - 277, - 226, - 276, - 269, - 270, - 272, - 264, - 261, - 237, - 250, - 227, - 268, - 263, - 266, - 240, - 252, - 272, - 220, - 255, - 221, - 260, - 266, - 248, - 249, - 245, - 253, - 255, - 262, - 284, - 250, - 254, - 244, - 208, - 267, - 261, - 249, - 249, - 266, - 262, - 265, - 249, - 257, - 262, - 251, - 249, - 241, - 229, - 250, - 252, - 264, - 248, - 257, - 258, - 247, - 223, - 265, - 260, - 261, - 259, - 236, - 217, - 275, - 256, - 258, - 254, - 258, - 265, - 237, - 281, - 279, - 257, - 243, - 250, - 251, - 252, - 250, - 263, - 229, - 245, - 238, - 244, - 236, - 267, - 254, - 246, - 237, - 253, - 229, - 246, - 263, - 257, - 238, - 243, - 235, - 263, - 288, - 240, - 258, - 256, - 271, - 260, - 244, - 259, - 236, - 246, - 229, - 237, - 239, - 221, - 247, - 253, - 227, - 245 - ] - }, - { - "counters": [ - 282, - 253, - 228, - 262, - 253, - 241, - 243, - 235, - 255, - 246, - 234, - 232, - 255, - 224, - 261, - 264, - 236, - 243, - 253, - 255, - 275, - 262, - 271, - 255, - 233, - 248, - 255, - 283, - 253, - 247, - 260, - 236, - 249, - 232, - 226, - 249, - 227, - 257, - 244, - 253, - 266, - 272, - 236, - 251, - 252, - 228, - 254, - 268, - 249, - 254, - 255, - 258, - 252, - 265, - 259, - 254, - 260, - 263, - 260, - 250, - 254, - 237, - 245, - 254, - 258, - 226, - 288, - 241, - 247, - 253, - 279, - 256, - 241, - 268, - 272, - 281, - 249, - 216, - 239, - 254, - 249, - 263, - 245, - 229, - 257, - 241, - 254, - 248, - 234, - 278, - 263, - 259, - 242, - 246, - 269, - 257, - 231, - 247, - 278, - 252, - 239, - 280, - 245, - 269, - 225, - 251, - 235, - 259, - 272, - 241, - 251, - 250, - 245, - 256, - 249, - 261, - 258, - 237, - 236, - 251, - 249, - 259, - 265, - 247, - 247, - 241, - 261, - 234, - 241, - 270, - 249, - 263, - 241, - 251, - 264, - 251, - 253, - 262, - 258, - 256, - 244, - 229, - 236, - 237, - 241, - 189, - 240, - 265, - 254, - 222, - 255, - 261, - 258, - 252, - 273, - 235, - 243, - 259, - 223, - 254, - 226, - 248, - 245, - 275, - 245, - 260, - 232, - 224, - 233, - 223, - 216, - 243, - 208, - 226, - 277, - 213, - 252, - 247, - 229, - 233, - 257, - 260, - 236, - 251, - 261, - 260, - 256, - 261, - 246, - 236, - 265, - 284, - 226, - 257, - 244, - 263, - 250, - 245, - 266, - 266, - 283, - 280, - 283, - 251, - 246, - 251, - 249, - 280, - 247, - 254, - 258, - 281, - 251, - 236, - 212, - 243, - 255, - 283, - 262, - 280, - 246, - 269, - 231, - 240, - 268, - 258, - 231, - 270, - 266, - 245, - 257, - 243, - 250, - 253, - 229, - 245, - 242, - 229, - 242, - 242, - 253, - 249, - 284, - 242, - 250, - 228, - 269, - 251, - 245, - 248, - 281, - 262, - 246, - 257, - 261, - 255, - 235, - 257, - 257, - 253, - 238, - 255, - 269, - 259, - 245, - 260, - 250, - 261, - 246, - 260, - 228, - 258, - 263, - 240, - 236, - 278, - 250, - 257, - 237, - 256, - 260, - 243, - 227, - 233, - 258, - 255, - 236, - 248, - 244, - 243, - 247, - 235, - 259, - 233, - 257, - 246, - 233, - 259, - 258, - 260, - 249, - 264, - 246, - 264, - 231, - 250, - 238, - 267, - 244, - 218, - 240, - 256, - 286, - 275, - 248, - 240, - 245, - 241, - 260, - 265, - 241, - 261, - 246, - 267, - 251, - 264, - 252, - 255, - 263, - 255, - 272, - 253, - 238, - 226, - 261, - 264, - 232, - 260, - 252, - 276, - 252, - 240, - 229, - 258, - 262, - 267, - 266, - 244, - 213, - 237, - 232, - 300, - 244, - 234, - 243, - 266, - 207, - 229, - 257, - 251, - 269, - 245, - 262, - 260, - 235, - 239, - 212, - 259, - 261, - 278, - 267, - 238, - 241, - 251, - 246, - 269, - 240, - 267, - 224, - 245, - 230, - 252, - 273, - 284, - 236, - 230, - 244, - 259, - 257, - 246, - 237, - 250, - 275, - 236, - 260, - 238, - 239, - 263, - 262, - 233, - 247, - 268, - 238, - 267, - 269, - 277, - 258, - 262, - 250, - 240, - 252, - 264, - 254, - 237, - 242, - 295, - 251, - 241, - 248, - 243, - 276, - 255, - 235, - 219, - 266, - 259, - 256, - 255, - 263, - 222, - 241, - 260, - 255, - 267, - 263, - 243, - 249, - 282, - 278, - 234, - 237, - 257, - 247, - 246, - 262, - 223, - 247, - 240, - 258, - 249, - 242, - 261, - 253, - 263, - 253, - 260, - 249, - 268, - 264, - 261, - 243, - 280, - 258, - 256, - 262, - 252, - 262, - 233, - 226, - 265, - 249, - 279, - 250, - 221, - 255, - 270, - 281, - 259, - 264, - 245, - 260, - 255, - 241, - 245, - 243, - 215, - 248, - 259, - 266, - 224, - 218, - 234, - 226, - 245, - 220, - 273, - 245, - 247, - 226, - 266, - 281, - 249, - 249, - 227, - 249, - 266, - 251, - 243, - 220, - 255, - 257, - 254, - 256, - 237, - 254, - 245, - 243, - 260, - 252, - 249, - 250, - 260, - 270, - 269, - 265, - 247, - 253, - 260, - 252, - 234, - 263, - 254, - 269, - 242, - 207, - 240, - 278, - 263, - 258, - 265, - 243, - 260, - 279, - 253, - 270, - 246, - 258, - 259, - 236, - 274, - 254, - 247, - 259, - 271, - 251, - 223, - 278, - 246, - 260, - 240, - 244, - 235, - 276, - 252, - 216, - 253, - 258, - 232, - 252, - 265, - 262, - 246, - 248, - 238, - 232, - 264, - 262, - 231, - 243, - 235, - 270, - 233, - 211, - 263, - 249, - 259, - 262, - 251, - 250, - 248, - 260, - 266, - 246, - 251, - 252, - 254, - 275, - 217, - 255, - 235, - 241, - 222, - 251, - 252, - 241, - 249, - 271, - 243, - 264, - 227, - 268, - 250, - 256, - 244, - 240, - 249, - 244, - 248, - 260, - 209, - 240, - 248, - 262, - 264, - 257, - 282, - 213, - 222, - 254, - 252, - 260, - 266, - 247, - 234, - 279, - 253, - 256, - 245, - 267, - 244, - 268, - 227, - 221, - 255, - 259, - 246, - 255, - 260, - 232, - 241, - 258, - 234, - 249, - 253, - 232, - 254, - 252, - 255, - 248, - 258, - 239, - 231, - 253, - 249, - 239, - 239, - 241, - 240, - 234, - 217, - 234, - 261, - 265, - 252, - 267, - 270, - 240, - 253, - 224, - 237, - 244, - 264, - 273, - 254, - 261, - 240, - 255, - 271, - 233, - 244, - 273, - 226, - 243, - 267, - 258, - 273, - 235, - 243, - 259, - 240, - 242, - 268, - 248, - 259, - 262, - 248, - 247, - 246, - 263, - 246, - 281, - 218, - 232, - 241, - 253, - 212, - 242, - 258, - 240, - 255, - 231, - 232, - 261, - 252, - 270, - 263, - 250, - 244, - 261, - 255, - 261, - 273, - 226, - 268, - 218, - 285, - 235, - 232, - 275, - 231, - 259, - 256, - 220, - 227, - 254, - 244, - 273, - 239, - 264, - 243, - 246, - 261, - 238, - 265, - 251, - 230, - 234, - 259, - 254, - 238, - 250, - 257, - 239, - 268, - 230, - 262, - 237, - 262, - 241, - 237, - 260, - 235, - 255, - 247, - 233, - 237, - 267, - 242, - 274, - 248, - 249, - 238, - 264, - 249, - 221, - 232, - 261, - 247, - 258, - 240, - 241, - 244, - 255, - 258, - 229, - 273, - 250, - 233, - 268, - 247, - 242, - 275, - 272, - 282, - 254, - 263, - 252, - 253, - 223, - 255, - 233, - 238, - 248, - 261, - 250, - 231, - 251, - 268, - 272, - 235, - 249, - 239, - 275, - 239, - 247, - 237, - 257, - 243, - 265, - 230, - 240, - 250, - 234, - 255, - 261, - 245, - 259, - 281, - 251, - 252, - 237, - 282, - 252, - 247, - 271, - 268, - 245, - 249, - 249, - 265, - 249, - 237, - 233, - 274, - 242, - 238, - 259, - 250, - 248, - 265, - 277, - 235, - 246, - 252, - 232, - 234, - 214, - 251, - 246, - 246, - 247, - 269, - 260, - 240, - 226, - 252, - 239, - 240, - 248, - 253, - 246, - 243, - 264, - 262, - 246, - 246, - 262, - 268, - 271, - 250, - 271, - 246, - 283, - 243, - 252, - 249, - 255, - 286, - 254, - 253, - 252, - 240, - 272, - 279, - 275, - 256, - 258, - 227, - 259, - 263, - 242, - 253, - 255, - 230, - 237, - 272, - 233, - 240, - 253, - 263, - 281, - 274, - 252, - 281, - 286, - 251, - 256, - 263, - 261, - 269, - 275, - 257, - 263, - 290, - 260, - 271, - 246, - 259, - 248, - 235, - 274, - 242, - 268, - 237, - 242, - 240, - 217, - 239, - 247, - 232, - 223, - 270, - 220, - 248, - 240, - 262, - 270, - 268, - 226, - 269, - 225, - 251, - 258, - 264, - 239, - 244, - 243, - 274, - 219, - 244, - 265, - 230, - 238, - 221, - 217, - 244, - 241, - 242, - 248, - 273, - 280, - 247, - 240, - 246, - 266, - 248, - 221, - 244, - 246, - 264, - 264, - 257, - 247, - 266, - 280, - 257, - 256, - 244, - 259, - 254, - 240, - 242, - 221, - 262, - 253, - 224, - 272, - 234, - 263, - 247, - 264, - 258, - 248, - 260, - 228, - 250, - 230, - 239, - 244, - 252, - 225, - 249, - 254, - 234, - 254, - 238, - 228, - 253, - 266, - 243, - 279, - 262, - 239, - 245, - 256, - 259, - 260, - 241, - 215, - 236, - 245, - 239, - 228, - 275, - 259, - 239, - 274, - 238, - 250, - 245, - 264, - 227, - 223, - 242, - 257, - 229, - 215, - 243, - 254, - 290, - 234, - 237, - 235, - 230, - 248, - 222, - 226, - 264, - 245, - 272, - 273, - 247, - 253, - 251, - 277, - 261, - 283, - 273, - 227, - 237, - 247, - 247, - 243, - 240, - 237, - 232, - 275, - 256, - 237, - 236, - 220, - 257, - 274, - 241, - 257, - 236, - 266, - 255, - 279, - 269, - 255, - 252, - 231, - 239, - 254, - 225, - 277, - 258, - 242, - 240, - 272, - 266, - 260, - 236, - 250, - 227, - 234, - 229, - 266, - 253, - 254, - 260, - 280, - 245, - 235, - 249, - 255, - 232, - 272, - 273, - 251, - 269, - 276, - 263, - 226, - 253, - 241, - 233, - 250, - 222, - 259, - 265, - 229, - 258, - 231, - 227, - 247, - 258, - 249, - 229, - 258, - 231, - 267, - 244, - 227, - 271, - 234, - 224, - 251, - 274, - 244, - 265, - 259, - 240, - 257, - 254, - 243, - 243, - 273, - 276, - 250, - 245, - 235, - 256, - 245, - 235, - 259, - 240, - 247, - 233, - 225, - 234, - 230, - 255, - 241, - 225, - 259, - 244, - 230, - 239, - 258, - 233, - 257, - 263, - 263, - 260, - 237, - 265, - 261, - 260, - 239, - 216, - 257, - 219, - 245, - 235, - 227, - 252, - 245, - 274, - 257, - 262, - 238, - 258, - 245, - 229, - 248, - 248, - 213, - 271, - 247, - 250, - 300, - 267, - 243, - 245, - 254, - 244, - 255, - 254, - 287, - 243, - 256, - 257, - 282, - 231, - 260, - 242, - 270, - 278, - 244, - 220, - 266, - 230, - 262, - 237, - 248, - 230, - 276, - 239, - 279, - 258, - 258, - 270, - 246, - 227, - 241, - 244, - 250, - 230, - 256, - 238, - 230, - 262, - 221, - 262, - 268, - 267, - 260, - 241, - 229, - 266, - 246, - 273, - 253, - 281, - 204, - 230, - 258, - 280, - 229, - 214, - 235, - 261, - 266, - 228, - 226, - 230, - 246, - 252, - 241, - 261, - 262, - 266, - 248, - 241, - 241, - 217, - 259, - 266, - 250, - 228, - 269, - 251, - 257, - 257, - 234, - 226, - 275, - 260, - 268, - 261, - 237, - 239, - 252, - 248, - 249, - 274, - 258, - 270, - 240, - 233, - 259, - 243, - 253, - 260, - 223, - 283, - 259, - 239, - 264, - 254, - 244, - 235, - 278, - 253, - 247, - 225, - 256, - 261, - 254, - 280, - 235, - 264, - 256, - 259, - 254, - 254, - 245, - 247, - 265, - 260, - 296, - 249, - 235, - 264, - 293, - 248, - 227, - 247, - 251, - 229, - 236, - 240, - 248, - 246, - 256, - 245, - 245, - 279, - 248, - 258, - 258, - 249, - 270, - 233, - 238, - 238, - 242, - 253, - 226, - 261, - 252, - 214, - 229, - 263, - 257, - 249, - 235, - 291, - 274, - 233, - 261, - 240, - 225, - 236, - 243, - 222, - 224, - 265, - 263, - 262, - 258, - 234, - 278, - 246, - 248, - 267, - 281, - 238, - 261, - 249, - 230, - 280, - 259, - 257, - 263, - 268, - 247, - 249, - 258, - 242, - 259, - 224, - 220, - 223, - 274, - 240, - 270, - 222, - 257, - 246, - 249, - 234, - 255, - 276, - 225, - 241, - 257, - 270, - 232, - 241, - 276, - 233, - 229, - 276, - 232, - 250, - 235, - 218, - 244, - 231, - 275, - 241, - 267, - 242, - 286, - 231, - 287, - 245, - 256, - 236, - 238, - 256, - 255, - 248, - 259, - 257, - 252, - 257, - 221, - 252, - 261, - 233, - 251, - 257, - 268, - 263, - 232, - 242, - 243, - 263, - 246, - 238, - 254, - 283, - 253, - 254, - 233, - 260, - 238, - 263, - 265, - 248, - 279, - 262, - 230, - 288, - 232, - 254, - 231, - 244, - 249, - 235, - 246, - 224, - 236, - 246, - 233, - 242, - 250, - 251, - 256, - 240, - 260, - 265, - 212, - 252, - 262, - 252, - 252, - 252, - 230, - 238, - 232, - 263, - 263, - 239, - 242, - 235, - 268, - 251, - 230, - 276, - 251, - 262, - 245, - 230, - 235, - 259, - 250, - 246, - 261, - 238, - 238, - 233, - 246, - 250, - 271, - 275, - 249, - 238, - 262, - 264, - 247, - 248, - 240, - 254, - 215, - 252, - 239, - 264, - 255, - 259, - 250, - 249, - 248, - 251, - 250, - 247, - 259, - 251, - 237, - 255, - 279, - 239, - 289, - 267, - 262, - 291, - 262, - 262, - 273, - 262, - 246, - 236, - 240, - 234, - 259, - 241, - 237, - 251, - 231, - 254, - 241, - 257, - 260, - 278, - 251, - 243, - 244, - 232, - 269, - 299, - 231, - 233, - 228, - 242, - 238, - 222, - 256, - 232, - 264, - 257, - 258, - 252, - 261, - 225, - 251, - 230, - 262, - 236, - 254, - 253, - 232, - 242, - 238, - 221, - 273, - 242, - 246, - 230, - 237, - 282, - 263, - 226, - 262, - 251, - 256, - 267, - 251, - 255, - 236, - 242, - 235, - 245, - 232, - 258, - 284, - 250, - 253, - 253, - 250, - 256, - 250, - 277, - 239, - 246, - 240, - 228, - 262, - 261, - 239, - 262, - 244, - 246, - 239, - 254, - 264, - 242, - 258, - 274, - 235, - 241, - 263, - 217, - 278, - 237, - 248, - 235, - 234, - 241, - 253, - 251, - 243, - 214, - 279, - 247, - 257, - 235, - 252, - 224, - 225, - 255, - 264, - 241, - 245, - 261, - 251, - 278, - 270, - 274, - 226, - 241, - 256, - 282, - 255, - 224, - 281, - 269, - 266, - 247, - 245, - 232, - 262, - 216, - 256, - 265, - 233, - 221, - 237, - 251, - 269, - 224, - 243, - 257, - 265, - 266, - 235, - 243, - 231, - 256, - 256, - 250, - 272, - 256, - 239, - 231, - 267, - 261, - 234, - 282, - 218, - 224, - 228, - 259, - 258, - 251, - 255, - 286, - 245, - 234, - 241, - 244, - 215, - 273, - 269, - 262, - 241, - 246, - 227, - 241, - 209, - 223, - 231, - 278, - 270, - 247, - 248, - 240, - 261, - 276, - 231, - 240, - 255, - 245, - 276, - 249, - 227, - 260, - 239, - 249, - 245, - 268, - 265, - 258, - 245, - 250, - 270, - 256, - 266, - 262, - 225, - 292, - 227, - 233, - 260, - 248, - 266, - 244, - 253, - 265, - 240, - 256, - 244, - 249, - 258, - 256, - 251, - 269, - 265, - 210, - 250, - 235, - 236, - 231, - 273, - 229, - 246, - 254, - 224, - 244, - 254, - 238, - 234, - 234, - 238, - 229, - 286, - 277, - 226, - 234, - 246, - 254, - 229, - 239, - 261, - 269, - 230, - 249, - 247, - 246, - 262, - 226, - 242, - 259, - 262, - 264, - 221, - 258, - 267, - 225, - 225, - 247, - 247, - 246, - 234, - 255, - 220, - 237, - 257, - 241, - 268, - 230, - 244, - 244, - 269, - 245, - 243, - 230, - 249, - 252, - 249, - 258, - 223, - 233, - 249, - 263, - 240, - 251, - 234, - 258, - 246, - 222, - 249, - 267, - 233, - 270, - 217, - 243, - 242, - 277, - 267, - 253, - 294, - 272, - 252, - 257, - 255, - 227, - 258, - 242, - 263, - 253, - 241, - 246, - 224, - 241, - 278, - 247, - 215, - 273, - 246, - 241, - 253, - 249, - 271, - 267, - 231, - 223, - 236, - 268, - 277, - 236, - 247, - 230, - 239, - 242, - 275, - 243, - 246, - 254, - 256, - 240, - 280, - 227, - 261, - 261, - 262, - 238, - 259, - 265, - 248, - 262, - 270, - 262, - 260, - 237, - 255, - 229, - 258, - 265, - 237, - 268, - 215, - 236, - 225, - 210, - 259, - 242, - 274, - 251, - 232, - 245, - 244, - 256, - 239, - 230, - 236, - 246, - 251, - 248, - 247, - 268, - 251, - 230, - 274, - 238, - 246, - 260, - 241, - 286, - 250, - 244, - 250, - 247, - 250, - 236, - 263, - 267, - 257, - 243, - 261, - 231, - 263, - 221, - 252, - 272, - 242, - 253, - 259, - 264, - 259, - 235, - 241, - 261, - 270, - 234, - 217, - 240, - 226, - 260, - 255, - 264, - 247, - 256, - 267, - 244, - 246, - 245, - 224, - 249, - 253, - 234, - 253, - 240, - 258, - 240, - 257, - 235, - 214, - 265, - 223, - 263, - 243, - 248, - 231, - 253, - 262, - 241, - 269, - 261, - 253, - 244, - 260, - 244, - 254, - 239 - ] - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 23547664, - "last_update_version": 413254473674391556, - "correlation": 0.008584 - }, - "id": { - "histogram": { - "ndv": 511887, - "buckets": [ - { - "count": 2047, - "lower_bound": "MDAyNjAwY2M4Mjg4NDIzMDgzZjg1NDEyZDIyNTQ1MWQ=", - "upper_bound": "MDExMThjZjFjMDNlNDAxMGJlM2Y2ZDQ1ZjlmOGYyOTY=", - "repeats": 1 - }, - { - "count": 4095, - "lower_bound": "MDEzMTZjMzhlM2JiNDBlMTlhY2Y2MjY1ZmFmNWE0N2M=", - "upper_bound": "MDI3ODY0OGRlMDY3NDRhNGJiZDdiMmU5YTY5YzBmZDc=", - "repeats": 1 - }, - { - "count": 6142, - "lower_bound": "MDI5ZDE5MmQ2YTJhNGRlZjkxYzA1M2E2YmM1ZmI2NDQ=", - "upper_bound": "MDM0YzRhMzU3MTczNDczNmJkZTQ3NmRlZGYzMTVlMGE=", - "repeats": 1 - }, - { - "count": 8190, - "lower_bound": "MDM1MGNlM2Y1MDQxNGNkN2I2NzVkOGQ4ZGUxYzQ5YzE=", - "upper_bound": "MDQxZmY3NzY4YzE5NDFkODgwZGJhZTU5ODkxZjM4NGM=", - "repeats": 1 - }, - { - "count": 10237, - "lower_bound": "MDQyMjgzZGViZDQwNGZhODkyNDAwNTQwODcyYTIxNjM=", - "upper_bound": "MDU0ZjcyMzkxMjkyNDQyNzk4ZDhhN2JjNjQxYzhlM2Q=", - "repeats": 1 - }, - { - "count": 12285, - "lower_bound": "MDU2OGRmMDczNzdlNDNiZWJlOGRiZGJmYjE3ODVjNjQ=", - "upper_bound": "MDY3YzFhMjAzOWYxNDhkMmE2Y2YyMjdhMTE1ZWExYzU=", - "repeats": 1 - }, - { - "count": 14332, - "lower_bound": "MDZhNzI4OWJiNDEyNDFlMzk1ZTU2NjdlNTY4YTE5MmQ=", - "upper_bound": "MDdmNDljYjNjMTc3NDVhNDliOWQwZmRiZmY5ZDQwNjM=", - "repeats": 1 - }, - { - "count": 16380, - "lower_bound": "MDgyMmJlZGYyMzExNDMyNmI3MTFhNjM4ZjNlMzVkNDE=", - "upper_bound": "MDkwY2ZkYTE1YjhjNGM5Yzg1YjMyZDIxNjFhZjYyN2I=", - "repeats": 1 - }, - { - "count": 18427, - "lower_bound": "MDkzZWU0OTg2NTY3NDg0ODg0ZDAyMzZmZjY3NzU2YWU=", - "upper_bound": "MDllZWMxNjMzOWU3NGU5Mzg1ODgxNGNkMDkyMzQ0NzM=", - "repeats": 1 - }, - { - "count": 20475, - "lower_bound": "MDlmYzY0MGE0ZmY5NDlkZGIwNmNmODg3OWUzM2NiZjU=", - "upper_bound": "MGIzY2FmNjVjY2QzNDk2N2E4MTdiYzRhZGIxYWMzYmM=", - "repeats": 1 - }, - { - "count": 22523, - "lower_bound": "MGI0YmQ0YjViODBmNDFhOTk5NjgzYTZjMTA0YmJkNWI=", - "upper_bound": "MGM2MGY5MjZhMjJjNGQ4MDg4NTBkYjQwZmNhYWM0N2Q=", - "repeats": 1 - }, - { - "count": 24570, - "lower_bound": "MGM2MzdhMDVjYWFlNGZhNmIxYmVlMjg1ZjE0ZWMxN2I=", - "upper_bound": "MGRiZWQxNDUxZDg4NDQyMDk0NjlhNjllNjRhMWRlZTc=", - "repeats": 1 - }, - { - "count": 26618, - "lower_bound": "MGRkN2IwOWVjOTM0NDYzY2FiNGYzNzNkNDk2ODQzNDE=", - "upper_bound": "MGVmOWY0MmZjYmM5NDJjN2IzYWM2NTJiNGQzN2I0MmQ=", - "repeats": 1 - }, - { - "count": 28665, - "lower_bound": "MGYwNTRiNTdmNWU5NDdiZTllMDljYTI3OGVjZmM4ZTI=", - "upper_bound": "MGZhMzcyYWIxNmJhNDE2ZWI5NTgxNTljZjM0OTlhOGM=", - "repeats": 1 - }, - { - "count": 30713, - "lower_bound": "MGZhZjBjYzEzMWU4NGFmOGJlNWJlNTA1ZjYyMWViODU=", - "upper_bound": "MTEwMTQxN2U4YjEyNDJhZGI5YmQ4MzVlMDY1NTcxZDM=", - "repeats": 1 - }, - { - "count": 32760, - "lower_bound": "MTExMzJiODhlYjY1NDhhNGFhZGI5Y2EzMDU5NGEzNzE=", - "upper_bound": "MTI4YmNlZjU1NjRmNDc5MWFhOTk4MGUwNjM5N2UxM2E=", - "repeats": 1 - }, - { - "count": 34808, - "lower_bound": "MTI5YjgxNTFiNTRiNDkwNjk4MGFlYWM4ZjdkZmI2OTU=", - "upper_bound": "MTNkMmVmYjc4MTY1NGQ2M2JhNzE5MDc1OTFjMzc3ZGU=", - "repeats": 1 - }, - { - "count": 36855, - "lower_bound": "MTNkNWUzZmRkYzY2NDE5ZWFhOTA4N2EyZWM1ZDNhZGU=", - "upper_bound": "MTViYjdhNDJlY2Y5NDgwMmJkNDBmNjdhZjZhM2M4NzM=", - "repeats": 1 - }, - { - "count": 38903, - "lower_bound": "MTVjZjBlN2MzZTRhNGQ2MThjMDM0NThmZDVlYjllZTE=", - "upper_bound": "MTY3NGE2OTI5YzZiNDJkNjljMWFkNzk5NWM1YThhZTY=", - "repeats": 1 - }, - { - "count": 40950, - "lower_bound": "MTY4ZTZjMDg5MzlhNDkwYWIxYmQ5MDZlNWMzMGMyYWI=", - "upper_bound": "MTc2MTVmZDJmMDgwNDAxMjk1YzE4ZTI3ZDc0N2EzMjE=", - "repeats": 1 - }, - { - "count": 42998, - "lower_bound": "MTc5MmY1YTZmNjA4NDA3NThhN2U3NGYyODViYTg1OTU=", - "upper_bound": "MTgwNmM4OTJlYzQ2NDU0NThiYWVhYTlhYzIzMmNlNmQ=", - "repeats": 1 - }, - { - "count": 45046, - "lower_bound": "MTgxMzhmYTM2M2UyNDAyMGE1NmNlM2UyZTNhZTIxMmE=", - "upper_bound": "MTkyNzY5OWNlMGRlNDhjODhlY2U0NDU0MzEyMTY5Yzc=", - "repeats": 1 - }, - { - "count": 47093, - "lower_bound": "MTkyODZmNzllYjkzNGJmYTg3ZTk0OWQ4NDFjYWMyMzk=", - "upper_bound": "MWEwMTllMjU5MDQyNDMyNjk2ZDEzM2JiNjk1MmQ2NGM=", - "repeats": 1 - }, - { - "count": 49141, - "lower_bound": "MWEzNGVmYzUzZWY2NDExODhlMDZhNjg0NjdhNGRhOWY=", - "upper_bound": "MWFlYmExZTUzNTgyNDY4OWE0ZjIzMGY5ODhjY2U4ZDU=", - "repeats": 1 - }, - { - "count": 51188, - "lower_bound": "MWIyM2ZhNDQ1MDBmNDY5YTk3NGQ5MmJkYzk4OTk4MmE=", - "upper_bound": "MWM4YmE0MTJkOGI4NDgxNzljMDcxMzkzNTg4YmUwMDk=", - "repeats": 1 - }, - { - "count": 53236, - "lower_bound": "MWM5NzhjMWZlMjk3NDY0Nzg4MjNlM2ZhODRkZGNlNDc=", - "upper_bound": "MWQxOGMyNWJjYTkzNDQ2OWFlODQ2NzBiNDlkZWMxODY=", - "repeats": 1 - }, - { - "count": 55283, - "lower_bound": "MWQyMzQ0ZjQ0NDM5NDIyMmFiMjEwN2RjOGY5ZjRlYjE=", - "upper_bound": "MWUxM2VlMTdhOTU2NGNmMDgyZGRhOWM3YWE1NDY1MTQ=", - "repeats": 1 - }, - { - "count": 57331, - "lower_bound": "MWUzNzQ1ZDEyYmQzNDdjYWJiN2ZlMzEzOWI4NTk1NjI=", - "upper_bound": "MWY4MmUzYjA5OWUzNDJlMjlmZTA2N2ViYjY2Y2U3ZTU=", - "repeats": 1 - }, - { - "count": 59378, - "lower_bound": "MWY4YThmYzExNGY4NDg3YWE2NzliNWJhOTA5YjQ3MDc=", - "upper_bound": "MjAyODQ3NzNjYWE2NDgyNWFiODgyZGRiZTczZmZiMzY=", - "repeats": 1 - }, - { - "count": 61426, - "lower_bound": "MjAyYjAxNmNhNTZmNGI2YmJmYzNjZDU4MzRlNmEwY2E=", - "upper_bound": "MjBiYzA2OWU1ZDEyNDU2NTgwNjYzNjJkZjI3MGFhMzA=", - "repeats": 1 - }, - { - "count": 63473, - "lower_bound": "MjBjMjk4NzIwZjEyNDBlMTllYzY3NTJiYTQ4Y2RiYzg=", - "upper_bound": "MjFkMjFiOWVmODQzNDE1YmE5YmFmMzE3ZDVmNmQ2ZDY=", - "repeats": 1 - }, - { - "count": 65521, - "lower_bound": "MjFlOGVkZWJiMWQ1NGQ5MGI1NTZjZGRlZjQ5N2RkMGE=", - "upper_bound": "MjI3NDEyM2Y4YmIwNDY2NWIxZDE2MjJiMGIxNTc2ZGY=", - "repeats": 1 - }, - { - "count": 67569, - "lower_bound": "MjI4YTkwZWQxNzNmNDk0MWExMjU1MWFhMjFiNzRmZGI=", - "upper_bound": "MjNhYTdmZGEyMzcxNDg5ZGE1MDYyYzNlZTAwNGMxYTE=", - "repeats": 1 - }, - { - "count": 69616, - "lower_bound": "MjNkZDk1YTM2MTNjNGM1ZWFlYTU3NzZmYjljMmNjMjA=", - "upper_bound": "MjUwMWViYmI1Zjk4NGNmM2JmNmE1ODRkMzk2ZWMxYTY=", - "repeats": 1 - }, - { - "count": 71664, - "lower_bound": "MjUwYTEyYTljNTkzNDg3ZWIwOGUwZmY0ZWFiM2MyMjU=", - "upper_bound": "MjVlMzY4NTczMmZhNDgwODgwMjMzZDIwMjM3MGExMDQ=", - "repeats": 1 - }, - { - "count": 73711, - "lower_bound": "MjVmNmUzMjZkYzMyNDhmZmI3MGE1NzlhYzA4N2U3MmY=", - "upper_bound": "MjZiNDhlNjA3NjE1NGI5NDhmMTY2YTMyMzExMjQ4YWM=", - "repeats": 1 - }, - { - "count": 75759, - "lower_bound": "MjZjMjkwMzBhOGMyNGJkZjhkZDIyNDI4OTkxYzRkOTk=", - "upper_bound": "Mjc3OWM1ZDc4ZjM4NDk3OGFiNjkzOWI3YjVhNmIzYjE=", - "repeats": 1 - }, - { - "count": 77806, - "lower_bound": "Mjc4OWQwZDA3ODA2NGRlMTkzNmQxM2NhOTYxYzE3M2Q=", - "upper_bound": "MjkwNWNjN2I4OTMxNDEzOWExMTI1MjdlNjNlMjM4NjQ=", - "repeats": 1 - }, - { - "count": 79854, - "lower_bound": "MjkxNWY0NTVmNWM1NGU3MTgxOTgxYzM4NjZkOTdhOWE=", - "upper_bound": "MjliOWI0NGQ4NDlkNGRiZTlmNDgxMzVkODg0M2QzYTg=", - "repeats": 1 - }, - { - "count": 81901, - "lower_bound": "MjlmMjU1NzJlNmY5NGNlNGI1NTFiYWE5MjdmZDgzYzI=", - "upper_bound": "MmFkZTE5ZjAyZTZjNDQzZDk5YmRlYzY1ZDk5NGU0MTk=", - "repeats": 1 - }, - { - "count": 83949, - "lower_bound": "MmIwNTQ3ZTAyNTk0NDkzZWE0ZDRhNTJhZjA5NWYyYjQ=", - "upper_bound": "MmMzMTg1MjQxNzljNDI1ZGI0YzZmMWY5YTEyNjc4YmQ=", - "repeats": 1 - }, - { - "count": 85997, - "lower_bound": "MmM0NTQ1MmJjZTU0NGM0OGFiNTkwODE2NTFjMDBjZWQ=", - "upper_bound": "MmQ0MWI5MGMzMDBhNDM1ODkyZjg4ZmJlNzFmNTU1YmI=", - "repeats": 1 - }, - { - "count": 88044, - "lower_bound": "MmQ4MjAzMTdkNmMzNGViMzg3MDI3Yjg1ZGNiZWQxOTc=", - "upper_bound": "MmViMGU1NDE4NDNkNGNjMDhlMGI0NGI1ZWNlOThkYWU=", - "repeats": 1 - }, - { - "count": 90092, - "lower_bound": "MmViNzZlZTI0MzVhNDNmZDk5MGU4MWFkZGRhOTgyOWI=", - "upper_bound": "MmY3NGQxYjg5OTA2NGM2YWIxODI3MWQ1NGVhODExYmQ=", - "repeats": 1 - }, - { - "count": 92139, - "lower_bound": "MmY3ODg1MmY3NzU0NDEyNzk2MDYzOTcwZGIzMmI3M2Y=", - "upper_bound": "MzAxYjY2OGJkYjRkNDk5ZmJlNjIzZGIxODhiOGY3ZWI=", - "repeats": 1 - }, - { - "count": 94187, - "lower_bound": "MzAzY2UxN2YzNTBmNDZjOTg5YmU3N2NmNDk1YzdjMzM=", - "upper_bound": "MzFjOGY3MjQ1NGUzNDczYzk5OWQ1OTI1MTMwMDcyZjY=", - "repeats": 1 - }, - { - "count": 96234, - "lower_bound": "MzFkNGE2MWJlYzc1NGE5NWEyZTQyYjNkZTdhMjFmYTc=", - "upper_bound": "MzMwZGRiNjc2MTQ5NGUxYjhhMjYyNDk5MGZlNjhkYTA=", - "repeats": 1 - }, - { - "count": 98282, - "lower_bound": "MzMxNWNlZjYxZTQ1NDFlZmE5Y2VmYTIwMzIyN2JiYzM=", - "upper_bound": "MzNlN2JjMGZjNGUwNGQ0N2EwMGJjZTM3YTY5YWIwODY=", - "repeats": 1 - }, - { - "count": 100329, - "lower_bound": "MzNmNzU0Y2RhNzNlNDMwNjlhNTBmNjQzM2ZjMTJhYjU=", - "upper_bound": "MzRlZDE5NjUwZWVlNGQ0Yjk3MWNkZGM4MjJiMGRjZTQ=", - "repeats": 1 - }, - { - "count": 102377, - "lower_bound": "MzUzNThhMDEwNGRmNGU2N2I3ODBjNzczNmYzNWNkODc=", - "upper_bound": "MzY3ODRmMmNhZTFiNGYyNThhM2JlODA5MjhjOTNjOTI=", - "repeats": 1 - }, - { - "count": 104424, - "lower_bound": "MzY3YWRlNDI5YjliNGEzMDg3YWNhY2U0ZTVmOWZlMGY=", - "upper_bound": "Mzc2OWZiZjRhYzA2NGMzMGEzNWMyODUxOTY1ZGUxZTY=", - "repeats": 1 - }, - { - "count": 106472, - "lower_bound": "MzdiYzRmN2UyNWU2NDVmMWE1MDkwZWY4MmUwMTlkYTY=", - "upper_bound": "Mzg3M2E0ZDI3ZmQ5NDQxOTljNzEzMjllZjUwMTI5ZGE=", - "repeats": 1 - }, - { - "count": 108520, - "lower_bound": "Mzg4MGVkOWI5NzdhNGQxM2JjM2JiYWE1ZDkxZDM3NDc=", - "upper_bound": "MzliM2RlYzkwYjUyNGQwODljNmE2ZGNiNGI5YjVhMmM=", - "repeats": 1 - }, - { - "count": 110567, - "lower_bound": "MzljNzg3ZTVlYmMxNDVjNTg5MWVjMjRmMmRiYmQ3ODM=", - "upper_bound": "M2IyNTlmNTc1ZTFkNGQzMzhhZmYzZjdlM2NiNzc0YTc=", - "repeats": 1 - }, - { - "count": 112615, - "lower_bound": "M2IzNmE0MGI0NTg4NDBjZjk3MDQ4MWRmYzg0MzUzYzQ=", - "upper_bound": "M2NiMzAzNzIzNDdjNDU5YWIwNGExY2M4OWFlMGI5ODE=", - "repeats": 1 - }, - { - "count": 114662, - "lower_bound": "M2NiODVkYmNmN2Y1NGM5Mzg3ZmZlZDlhMTcyMDM2Yjk=", - "upper_bound": "M2RlYjRjMDk1MjU5NGUwNDlkOTc0OWRiYmQwNDYwY2U=", - "repeats": 1 - }, - { - "count": 116710, - "lower_bound": "M2RlZTM2YWVmZGUwNGZjOGE2M2FjNGJkMWZjYmM0NzI=", - "upper_bound": "M2U2MzU4ZGI3ODg5NDMwZDkzNTg2N2Y1YjU3ZjFkNzk=", - "repeats": 1 - }, - { - "count": 118757, - "lower_bound": "M2U2NGFlMWY1MTQ3NDQ1ODg3ZTA1M2JjMzc3MDNkOTI=", - "upper_bound": "M2YzOWFlZjJlY2MwNGY4M2IwNTNjOWM0MGYyYWUzYzU=", - "repeats": 1 - }, - { - "count": 120805, - "lower_bound": "M2YzZjcyNGZkMmNiNDUxZDhiOGE2OGJlNDVkMzIwYWY=", - "upper_bound": "NDA4ZjdmYmY5Y2ZmNDU0NTkyNjFkNzNiNDRlMjYxYzQ=", - "repeats": 1 - }, - { - "count": 122852, - "lower_bound": "NDBhNGQ2ZWU2NTc4NGFjMDgyOTcyOGJmMGQ1ZmZmYWQ=", - "upper_bound": "NDE4MzZjMWNjZjIzNDViZTg0NzgwNzQxZWIzNjZjOGY=", - "repeats": 1 - }, - { - "count": 124900, - "lower_bound": "NDE5MTE3OTQ0YTY5NGY3YmE0ZWFkM2Y4NGVjMWUzMjI=", - "upper_bound": "NDI2MGJmYTg5MzI1NGU0MDgzMzBiYjcxNGMxNjRhMmM=", - "repeats": 1 - }, - { - "count": 126947, - "lower_bound": "NDI2NzEyZTIzMGI5NGQxNTlmZGZlMjM2MmJkNWJjNzg=", - "upper_bound": "NDM2OGZlMDYxOTNhNDU3OTg4M2I0NjAwZTBjMDdlZWY=", - "repeats": 1 - }, - { - "count": 128995, - "lower_bound": "NDM3M2JjYjhmZTZlNDQyMjk0YjBkYjczNGUwYjAzMGY=", - "upper_bound": "NDQ0MjYyMTgzZGE0NDE0MmFhNmQ3ZjFkYWNlZDk2MGE=", - "repeats": 1 - }, - { - "count": 131043, - "lower_bound": "NDQ4MDE2NGJlYjFmNDQ1MmIyYzgwNjg2YmY1YzE3N2E=", - "upper_bound": "NDU2MTIzZTgwYzY4NGVjNmEwYTYyMGIyNGIyOWMyN2U=", - "repeats": 1 - }, - { - "count": 133090, - "lower_bound": "NDU3MGY1NWM5NmI2NDIwZTk2MDZlOGQ1N2M1NzRhYWI=", - "upper_bound": "NDY5ZTUwYWQ0YmExNGI1ZmE4MjUyZWRkNmE5NzMzYjE=", - "repeats": 1 - }, - { - "count": 135138, - "lower_bound": "NDZhZWI5OTMyMDJjNDBmYmIxNjAyM2QxZTVkOTZhZjQ=", - "upper_bound": "NDdlNDdlY2U5MDAwNDhmNmE1NDI3ODk0ZGRlNmNhMWE=", - "repeats": 1 - }, - { - "count": 137185, - "lower_bound": "NDdlNTFjMmFmYmEwNGZiYTgwNzMzYzRjN2UzMTNmM2M=", - "upper_bound": "NDhiN2Q4OTk4ODE5NDUxYzg1NjJiNzU0YzJjNThlMGU=", - "repeats": 1 - }, - { - "count": 139233, - "lower_bound": "NDhiOTIxOGE4ODgwNDFjYjhlZmM4MWY5NmEyMGZiNTE=", - "upper_bound": "NDlkODA0NTIxNmI2NGJlMGI0NDUzNDRlZjY4MGM4Y2I=", - "repeats": 1 - }, - { - "count": 141280, - "lower_bound": "NDlkOWVhZGYwN2YzNGJkNWI4YzAwZWM1ZmI5OTU1Y2Q=", - "upper_bound": "NGJlODg0OWUxZWVmNDM5ZDg0ZWE0MTYxMGJiOTE0YjA=", - "repeats": 1 - }, - { - "count": 143328, - "lower_bound": "NGJlYTM4MDFmNGVlNDk1YjhkOTJmYzYzODNmYmVkMTQ=", - "upper_bound": "NGNkZmVjNmM3MjBmNGFlZWJmMDAzMTZmMDYxMWEyNWU=", - "repeats": 1 - }, - { - "count": 145375, - "lower_bound": "NGNlYzhlOWY4ZDBiNDkxMjhkZjg3ZjA3N2Q0Njc2Yjk=", - "upper_bound": "NGRkYzUyNDNkYThiNDA5ZjliZjc2MGEzNmY3NGE4OTA=", - "repeats": 1 - }, - { - "count": 147423, - "lower_bound": "NGRkY2ViZjI3NGRiNGM3ZmE2ZTlhYTViMTE1NGY1M2E=", - "upper_bound": "NGU4ZmFmNmNhZDJmNDk5MmI0NGE3MWNkMWZkNTAwYTY=", - "repeats": 1 - }, - { - "count": 149471, - "lower_bound": "NGVjNDY4ZTRmNzZlNGViYTlmZDU2M2VhOTM5MjdiZDY=", - "upper_bound": "NGY3MWFiMGNhYjY3NDY2MDg3ZWEzMjc2NzMxMTRiZTg=", - "repeats": 1 - }, - { - "count": 151518, - "lower_bound": "NGY3N2IyNGZkOTE5NGIyYzkyZTU0YmE0OTFmMWVlZDY=", - "upper_bound": "NTBhNDFhNjY5NmVmNDBlMTkzODJiMGEyMGNjYjVhZmM=", - "repeats": 1 - }, - { - "count": 153566, - "lower_bound": "NTBhNjE3OThjNDYyNDkxNTk5N2I5M2UxMTlmNWRmMjU=", - "upper_bound": "NTFlOWI5Yzc2NWU4NDY1YmE2NWVhYWIwMmQ5ZjAyZjU=", - "repeats": 1 - }, - { - "count": 155613, - "lower_bound": "NTFmODRiODE2ZjlhNDlkY2JkNmRhYjY3M2E3ZTlkNjM=", - "upper_bound": "NTJlMDdmZjQ5NmFkNGRkMGFhN2FkZGJlNjdhMzVkNzY=", - "repeats": 1 - }, - { - "count": 157661, - "lower_bound": "NTJlYTFkNTk2MjMxNDk0NjhiZmRkNzlmZWE2ZWEwMWI=", - "upper_bound": "NTQwZDU2Yzc0YzQzNGQ4YWJlMGQ4ODNmZjZkOTkwNjk=", - "repeats": 1 - }, - { - "count": 159708, - "lower_bound": "NTQwZWViNDMzODllNDIyMWJkYzJkMTEzYmEzOWIwYjg=", - "upper_bound": "NTU5Zjc4NWIxYTQ4NGUwZDkxNTNmNzViMTk3OGZmZTc=", - "repeats": 1 - }, - { - "count": 161756, - "lower_bound": "NTYwZjg3ZTNlNmRhNGY4MWI4MGVjMmE0MGRkYWUzNGI=", - "upper_bound": "NTZmY2RiOWE5Y2Q4NDYyNThmMWY1ODUzNDY0ZTBhMzM=", - "repeats": 1 - }, - { - "count": 163803, - "lower_bound": "NTcwZDFmZDYyMjM5NDIwNWFlYmNlMzNjZGFkMDI2ZjU=", - "upper_bound": "NTgwYzhkNDhjM2MzNGQzOWI4M2FlMzY3ODM1MjYxYzU=", - "repeats": 1 - }, - { - "count": 165851, - "lower_bound": "NTgxNWVhN2NlOTc2NDZlZTk3NDc2NDJiMjBmMmVjNGI=", - "upper_bound": "NThlN2U5YWEyNjYxNDM2ZWE1NzQ1NTEyN2VlY2NkOTY=", - "repeats": 1 - }, - { - "count": 167898, - "lower_bound": "NThlYmU2MjI1Yjg4NDkzOGFkNDIxYzYxOGE3ZjRlNzE=", - "upper_bound": "NTlkN2Q3NDAyNDY3NDg0MWE4NDUwNDFmZjIxMWIxZWM=", - "repeats": 1 - }, - { - "count": 169946, - "lower_bound": "NTlkYjM5MGJmNzRjNGVkZWEzZmUyNDZiYmY4MGE0ZTM=", - "upper_bound": "NWFkNWMyNjMwN2M3NGYwMWE0ODM3YWU3ZDQwN2FiZWQ=", - "repeats": 1 - }, - { - "count": 171994, - "lower_bound": "NWFlYWZiODc3ZTc0NDA2YzgwYTljYWJjZDlhMDJkOWI=", - "upper_bound": "NWM0NDY1MWIyZmFkNGZjOGFiMjFiMGZhNjIzOTkwZTg=", - "repeats": 1 - }, - { - "count": 174041, - "lower_bound": "NWM0OGQ3ZmFlNGNjNDBjY2FmNmU1N2U1ZjFiNjIwZWM=", - "upper_bound": "NWRjNDEzZGFhOTNiNDBkNjg3YjliNDYwMmFhYjQyODQ=", - "repeats": 1 - }, - { - "count": 176089, - "lower_bound": "NWRkNDViNWQ2YWFkNDhiYTg4ZDQxNDBiOGVhZWJiM2Y=", - "upper_bound": "NWVmOWQ5YjMyODRmNDEwZDlkOGU4NDRmZDBmYjAyMGY=", - "repeats": 1 - }, - { - "count": 178136, - "lower_bound": "NWVmYzU5ZWE4YThiNGNlYjhiNjA0MzFhODQ0ZjgwNmU=", - "upper_bound": "NWZjNDZiNzFkY2U2NDFhZmEwZjg5NDUzNzhlMzhjYmI=", - "repeats": 1 - }, - { - "count": 180184, - "lower_bound": "NWZlMTdjNTA4ODBkNDk2ODk4ODM3OTkwMWVkNDY4M2I=", - "upper_bound": "NjA5ZjEyNWVjYmUyNGRjYWJiN2I4N2ZiOTljOTVhNmQ=", - "repeats": 1 - }, - { - "count": 182231, - "lower_bound": "NjBiNmI4MWQ5OWFiNGU3YWFkODk4NTJkZjM0OGZlMWY=", - "upper_bound": "NjIxZDlmMTE2ZWViNDY5MWEyYTIyNTk0MmI5OTg5MDg=", - "repeats": 1 - }, - { - "count": 184279, - "lower_bound": "NjIyNmI2ODE3ZDEyNGYwOGIyYWFiNzI3NjRkNDU4MTU=", - "upper_bound": "NjM0OTM2NjFhYzJkNDdhNThlOTg3M2E4M2RmMjk0OWE=", - "repeats": 1 - }, - { - "count": 186326, - "lower_bound": "NjM2ODkyM2UwZDE3NDM5ZDllMmVmZWY0ZGZlMWE1NTA=", - "upper_bound": "NjQzYzFlOTZiMTA4NDE4MjljZmRkNzk5N2IzYzBkNzc=", - "repeats": 1 - }, - { - "count": 188374, - "lower_bound": "NjQ2NTg1MzI1ZmU0NGE4Mjk2N2ZkOGQwZTE3MjJjZDQ=", - "upper_bound": "NjU2NjFjMWU3MGQ2NDM2OGExN2U3OTI5YjAwNDZkZWY=", - "repeats": 1 - }, - { - "count": 190421, - "lower_bound": "NjU4Y2ExMGMxMzg3NDg2OGFiNWQwN2RhNTdmOTZiNDg=", - "upper_bound": "NjVlODFhY2IyNDdiNDVmZmFmMDNhZjhhZTNjN2RhNjU=", - "repeats": 1 - }, - { - "count": 192469, - "lower_bound": "NjYwOGM1Mzc0MDBjNDdhMmEzZDUzODU0MTAwZGMyYzU=", - "upper_bound": "Njc2YTJlZTg3ZDIwNGI3Mzg4ZWEyYzQ5OWEwZmY1OWU=", - "repeats": 1 - }, - { - "count": 194517, - "lower_bound": "Njc3NjJhNmJmODgzNDMzNWIxZjMyYmQxNTRlZTVkN2Y=", - "upper_bound": "Njg3ZDkzYzFiMmRkNDBlODllYzM2YmM2YjFkZDAyYjE=", - "repeats": 1 - }, - { - "count": 196564, - "lower_bound": "Njg5NGE5NmU2MzQyNDQ1Zjk4YWM2NjUxZGNmMzFmMTc=", - "upper_bound": "Njk3NmZiMGU3NGU2NDk1YTgwN2IzYzFlZDkzMjU5MTQ=", - "repeats": 1 - }, - { - "count": 198612, - "lower_bound": "Njk3Y2Y5YTQ2OWEyNDRkZmI5M2IwNTQ2Y2EzOWY1ZmU=", - "upper_bound": "NmE4ZTY3NTkyZTNiNGUxNjk2ZDRlODc3MmJlOTUxMzY=", - "repeats": 1 - }, - { - "count": 200659, - "lower_bound": "NmFjNDNjZjMyZjQxNGVlZTkxNzkwOGM3MTdjZWQ1OWI=", - "upper_bound": "NmJmMTZiYzNiYmFiNDk4OTg5OGY5YzU4NDQ3MDMwOWQ=", - "repeats": 1 - }, - { - "count": 202707, - "lower_bound": "NmMwZmZhMjRiNjVhNGM2MGE5NTQ3YmI2OTA4ODJjNWU=", - "upper_bound": "NmQyMDY4NDg5Y2RjNGIxYThjZWFkNjJiZTYyODY0YmY=", - "repeats": 1 - }, - { - "count": 204754, - "lower_bound": "NmQyMmZjMzM2MzZkNGNhNjliMmRhMzlhZWI1YjAxZWE=", - "upper_bound": "NmRhMmI1MmE2MjlkNDVlYmI5YjY3MDM5MWYyMmJhYjQ=", - "repeats": 1 - }, - { - "count": 206802, - "lower_bound": "NmRjMDg2ODEwZWMwNGE5Njg4MmY1Njg0M2Q5MDZjNTE=", - "upper_bound": "NmYxM2E0NDk5ZTZlNDI3NTkwYTQ5ZDQxNmMxMjc3NzQ=", - "repeats": 1 - }, - { - "count": 208849, - "lower_bound": "NmY1MTRhMDFjMmIyNDBhMmE2NjdlOGVlMzUxYjNjYzc=", - "upper_bound": "NmZmZWEwM2Q1NjE1NDY4MjkwOGZiOGExYTM4NmViMzk=", - "repeats": 1 - }, - { - "count": 210897, - "lower_bound": "NzAzMzcyNDFmZjdmNDY3NTg1MTAyYmRkNzcwMjRmMzY=", - "upper_bound": "NzE0NGYwOGQyZTQ4NGJlOWE5YmY4ZjI2N2I2NWFlYzM=", - "repeats": 1 - }, - { - "count": 212944, - "lower_bound": "NzE1NjU0ZTRhNmI4NDczZTk2YmE4ZWQ5NmEwMzJkMTA=", - "upper_bound": "NzI0MjU0NDRlMDRlNDBlNjhjNzM0Njg3NDAwYzc0MmE=", - "repeats": 1 - }, - { - "count": 214992, - "lower_bound": "NzI0NDEwOGIzMjY2NDEwMTlhNDY2MjgxYWU2Y2RkNzQ=", - "upper_bound": "NzJkYjEyODNkZDI1NGQxMWE4YzNjYTlhYmQ1ZWM4YzA=", - "repeats": 1 - }, - { - "count": 217040, - "lower_bound": "NzJlMGE5NTkyNmEwNGMyYmI3YzE0NTA2NzFlYTNhZjM=", - "upper_bound": "NzNjNWFkM2QwMzBjNGE4ZDkzZWUzZjE5MmUyOGNkYmY=", - "repeats": 1 - }, - { - "count": 219087, - "lower_bound": "NzNlN2VhN2NiYTNhNDBjM2E3N2MwMjJkYjAzZGRhZTE=", - "upper_bound": "NzUwNDZmMDk0MjhmNDcxZWI4NTRlNjFkM2VmZDI4YTY=", - "repeats": 1 - }, - { - "count": 221135, - "lower_bound": "NzUwZGFhZWE4ZjcxNDczYzgzZTdmZmE2MDkyYzFjMjI=", - "upper_bound": "NzVlNGUzNmU5ZjZhNDIyNWFmNjQ0MWU3ZTUxMTE3MzQ=", - "repeats": 1 - }, - { - "count": 223182, - "lower_bound": "NzYwMjc2N2FmYTBlNGEyN2IyYzYwNGNmYWZkZDcyNDg=", - "upper_bound": "NzZhODhiYTIzZjBhNDVkMjlhMzllNGUyZjIxOGQyN2I=", - "repeats": 1 - }, - { - "count": 225230, - "lower_bound": "NzZkYmM3OWMwM2I3NGFjYzg1MDc5YjkxOTNjZjI4ZTE=", - "upper_bound": "Nzc3NTJhMWQ3NGVlNGJhOWExMTM2MWZlYzI0NDA5YTA=", - "repeats": 1 - }, - { - "count": 227277, - "lower_bound": "Nzc3YTUxOTE5ZDZmNDE5M2E1MWFkNGIwNDFjY2Y1YzI=", - "upper_bound": "Nzg3ZmZmMzAzY2EyNGIwN2IyMWM3MGRjMDNlMTdlMWQ=", - "repeats": 1 - }, - { - "count": 229325, - "lower_bound": "Nzg5MzBiMjRiMmJmNGEzZDg4NTBlNWU2MWVjZDZjY2I=", - "upper_bound": "NzkzZjdhZWRlZjdkNDY5ODhjNjliODBmYWUwMzhmZDM=", - "repeats": 1 - }, - { - "count": 231372, - "lower_bound": "Nzk0NWZkM2VmZDFkNDBlYmFlNDVhZDFhMDU4ZTllNjI=", - "upper_bound": "N2E3OTIwN2JiY2Y3NDNiZDliOTllZTc1ODg5YTM3YjI=", - "repeats": 1 - }, - { - "count": 233420, - "lower_bound": "N2E4NGMyOTU0ZTYzNDNjYmJlZThhOWY0YzlmN2E1NTc=", - "upper_bound": "N2I1NWYzZDY5YjM5NDdkOGFhMWU2YzVlNmY0YTQ0YmM=", - "repeats": 1 - }, - { - "count": 235468, - "lower_bound": "N2I2OTk1YzEwMzE2NGFmYTlmNWI1MjU3ZjhiN2Y0MWM=", - "upper_bound": "N2NhMWY0OTUxYjU3NGYzY2IxMzNiMDk2ZDg4NThkMzE=", - "repeats": 1 - }, - { - "count": 237515, - "lower_bound": "N2NjZmUwZDE3ZDEzNGMxZGFhYTliNzNlODdjMTJjNzU=", - "upper_bound": "N2RhMjM5Y2ZhYjMwNDNmMmI0ZjBhZDc5ZGM0MDQyNDQ=", - "repeats": 1 - }, - { - "count": 239563, - "lower_bound": "N2RhYzgwYWQ4MzY4NGE2OTk1YWJhZGUzYjk3MTc5NjQ=", - "upper_bound": "N2U1MjgxZmUxNDk3NGMzY2FlMDg5ZDZkZGUxMWM2OTE=", - "repeats": 1 - }, - { - "count": 241610, - "lower_bound": "N2U1YzkwMjViNzJhNGY1NGE5MDRkZDZhOGZhM2VhMTU=", - "upper_bound": "N2YwOGZkYzk4MWY5NDNhMTliMDllMjY2ZjBlODBjMGI=", - "repeats": 1 - }, - { - "count": 243658, - "lower_bound": "N2YwY2I3YWRlMzFlNDljNWI3MGRmOTNjMDE2NTYwN2I=", - "upper_bound": "N2ZjZDE4OWYyODQ3NGRjMGIzNjFiMGIyMWIyYmUzZGI=", - "repeats": 1 - }, - { - "count": 245705, - "lower_bound": "N2ZkNjhlMGM5NGUyNDc3ZDllOGQzMTQ3YTgzYzg5MjQ=", - "upper_bound": "ODEwMjg2NmVhYWVkNDllNDhkODM5MDEwNzhiZjI3ODA=", - "repeats": 1 - }, - { - "count": 247753, - "lower_bound": "ODExODVmNDczZmE1NDdiOWI5YzQxNTc2NTgxOGQ1YWI=", - "upper_bound": "ODFjNzhhZGQ4NmQ2NDAwZTliYWJiOTg3MGU5NWMxOTM=", - "repeats": 1 - }, - { - "count": 249800, - "lower_bound": "ODFmZGU2ZGY1ZjlhNDY0NmIzMjAxZDVjZDdkMjlmYTU=", - "upper_bound": "ODJkMDVhZGU0YmU1NDBiZGJhYWJlMmVmZmE0NzIzYTU=", - "repeats": 1 - }, - { - "count": 251848, - "lower_bound": "ODJkYzc5MzAyMzUxNDgzMjg5ODRjZDRhYzYzZTFlYjA=", - "upper_bound": "ODM5M2U4Yjc2NzU4NGVmOGE2NzY4Y2E1MjY0ZjBiODA=", - "repeats": 1 - }, - { - "count": 253895, - "lower_bound": "ODM5YjFjNTY1NDUzNDk3ZDkyMjM2ZTZjMjYzMjNiZjU=", - "upper_bound": "ODQ2ZDEwYWQ0ZGFjNDUwZmJkYWJiZjMzZTI2ZGYwYWE=", - "repeats": 1 - }, - { - "count": 255943, - "lower_bound": "ODQ3NmM0OTQ1MWVjNDIzNDgyOWI4YjAzYTc2ZDMyY2Q=", - "upper_bound": "ODU2MjRjYjY5MDBhNGZlOGJiOTg4ZDlhYjkyMzhmMDM=", - "repeats": 1 - }, - { - "count": 257991, - "lower_bound": "ODU4YTg3NWI4Y2ZiNGE3Y2IyNjA2NWQ1ZDFhZGQ1YTQ=", - "upper_bound": "ODY5ODNlZjBiNzgwNDYyNWEzZmFjZDdhM2RkMjgzNzk=", - "repeats": 1 - }, - { - "count": 260038, - "lower_bound": "ODZmZTBhYWM0ODZjNGFhNWE2MTI5MjA3NDU0NGFkNDM=", - "upper_bound": "ODdlNjU3YzE1ZmQyNDQ4MGEyYjRkOTNjZmJjODlmYTQ=", - "repeats": 1 - }, - { - "count": 262086, - "lower_bound": "ODdlNmYzNTQ4MGJkNDcxMjlmNDFlMjgwNzk5ZDM2ZTc=", - "upper_bound": "ODhhZjc5OTVmNjJlNGYxODk2NjA5MjA2YmU4NTU3NWU=", - "repeats": 1 - }, - { - "count": 264133, - "lower_bound": "ODhlZGFjYmYyMGIxNGIzMmIwOGJmMGRhYjBiYzY5OWI=", - "upper_bound": "ODlmY2VmMzg4N2JmNDhmZDg5NDZlNWY4NzRhNjcyOWY=", - "repeats": 1 - }, - { - "count": 266181, - "lower_bound": "OGEyODVmZDE4MmMxNGQ0ZjgyMTEzZDVmNWM0YTVlYzc=", - "upper_bound": "OGFjYTZlZjgyYzFmNDMyMmFhNTA1MjM3ZGQ2MzBhMjg=", - "repeats": 1 - }, - { - "count": 268228, - "lower_bound": "OGFkNTI3ZjE5OGM2NDBiMWI0MzQyODg3MDk1Y2U1NzM=", - "upper_bound": "OGJhMDg4ZWFmOTc5NGI0NmI4MGEzOTE0OTc1NTFlZWY=", - "repeats": 1 - }, - { - "count": 270276, - "lower_bound": "OGJhMTVjYjNiMjdkNDNlMTkxMjU2NmQ5OGQyYjI3MTE=", - "upper_bound": "OGNlMDA4OTdkYTQ1NGYwOTk3NmQ2NDIzODk0NjcyYmU=", - "repeats": 1 - }, - { - "count": 272323, - "lower_bound": "OGNlNDAyMDk2MGZiNGQzNzhmNmQ1NGZmMzM5NzcyNGE=", - "upper_bound": "OGQ3NGFiZTNmNTQ3NGY2MThlNTllYjc0MDQxNGI3OGE=", - "repeats": 1 - }, - { - "count": 274371, - "lower_bound": "OGQ3ZGE2MmYxMjZkNDRlZWI1NDU0ZTkyMmUyMDQxMDE=", - "upper_bound": "OGU0Njc3MTFlYTZjNGRjMGI3YjQzMWEyN2ZlZjU2MjQ=", - "repeats": 1 - }, - { - "count": 276418, - "lower_bound": "OGU0OGI2Njk3Zjk0NDVhZmE0MzgxZGQ5MWRkOTkxOTM=", - "upper_bound": "OGYwMjEyNDU1NjU4NGRjNjgzODliOTg3ZDU2NWRlYTY=", - "repeats": 1 - }, - { - "count": 278466, - "lower_bound": "OGYwYjVkYzkwZmIwNGVkMTgxZmFkYWI1MWJkMWIwMjA=", - "upper_bound": "OGZjZTUzZmEwNmU5NDA5Yjk0NDdiYWY4NDI0MzBhODQ=", - "repeats": 1 - }, - { - "count": 280514, - "lower_bound": "OGZmNDM5NTQ3MTQxNDI1ZDk4YzQ1YmJlYzliYTdiZWY=", - "upper_bound": "OTBhZmU4YTM5YWExNDg2NzhiMDMwOTQzM2JiOTFkNDQ=", - "repeats": 1 - }, - { - "count": 282561, - "lower_bound": "OTBjMThiYTAzZDFkNDUzMzgxN2Q1NTA0NzY4OTAxYmI=", - "upper_bound": "OTE1ZTgzY2RlZmIwNGVmODgzN2I2MWI0M2VhNzVlOTY=", - "repeats": 1 - }, - { - "count": 284609, - "lower_bound": "OTE3YWE0MmE5Njk5NDMzMTg2MjFmNDk0YmZjYzllODE=", - "upper_bound": "OTIyOGE2NTIyNGQ4NDdlYzgzMzVjZTgxZDA2ODdjYWE=", - "repeats": 1 - }, - { - "count": 286656, - "lower_bound": "OTIzNjIwNDU1MmRlNGQyNjlmYjI2Y2RhNDU0ZTU1ZTY=", - "upper_bound": "OTM0NTg0MjlkMDE5NDdmYmIxMzIxNjRmNGY4MjZjNjA=", - "repeats": 1 - }, - { - "count": 288704, - "lower_bound": "OTM1ZDQ0YjRlMzJkNGZmZjk0YjMzNjk4MmI1OWMyODI=", - "upper_bound": "OTQ0OGI1ZTYyNWNiNGY2ZGJlYTM1MzE0M2E3ZjE4MzM=", - "repeats": 1 - }, - { - "count": 290751, - "lower_bound": "OTQ4NTIzNTAzYTFmNGQ0NGI1NjIyNmI0ZjUxYzBkODE=", - "upper_bound": "OTUzYmNiMjM2ZGQ3NDRhY2FhYWJiMTUwOGNhYmQ4Yjc=", - "repeats": 1 - }, - { - "count": 292799, - "lower_bound": "OTU0MWI4MmVlMzZhNDhlNzkzYThjNDlmOGZkOGM0OWI=", - "upper_bound": "OTVlZmRmYmQ5NzE4NDM1MzgzOTkxZTZjZmZjOWJjZDU=", - "repeats": 1 - }, - { - "count": 294846, - "lower_bound": "OTVmY2FjNTQ2NGFhNGVlYjgzODJkMDg1YjhlMGE0MGU=", - "upper_bound": "OTZlZDc1OGNhMDVkNGNiNGE0YjY5MDQ5OTI1ZWViNjI=", - "repeats": 1 - }, - { - "count": 296894, - "lower_bound": "OTcxYTY0MmEyYjI5NDE1YzhkMmNhNWI3Yzk1MDZiNTg=", - "upper_bound": "OTgwZWIwYjI4MjllNGI0Y2JhMGZmYWNlNDJjN2UzYTI=", - "repeats": 1 - }, - { - "count": 298942, - "lower_bound": "OTgxMmU0YzIwZWQ1NGEyNWIzOTkwYTBiZDJmODhmOWY=", - "upper_bound": "OThmNmVmNGU1Y2Y0NGRlOWJiNmMxMjk4MDMyYWVhMmY=", - "repeats": 1 - }, - { - "count": 300989, - "lower_bound": "OTk1NmYxNGU2N2Q5NDJmY2E2NmI1OGNlM2IyOTVkMjg=", - "upper_bound": "OWE0MWQ4YzJhMjQxNDQ4YmJmNjdkMTJlZGY0YzhlN2I=", - "repeats": 1 - }, - { - "count": 303037, - "lower_bound": "OWE1MTBiMzViNmMzNDYyNmJjMTY3ZmMxYmI0NThjMTU=", - "upper_bound": "OWI0YWY4MzgzZDRjNDU0ZTgzODg4M2M4Y2NiNzBmODI=", - "repeats": 1 - }, - { - "count": 305084, - "lower_bound": "OWI2M2E1Njg5OWRlNGZlZmE4YmUxNGMwYWNjNTY4NTE=", - "upper_bound": "OWMzM2U5NjcxY2JhNDcyYjllODU5Mjc5YzZkNGM2Njc=", - "repeats": 1 - }, - { - "count": 307132, - "lower_bound": "OWM0MmVhMzY3MmE2NGE4OWFlMGJmNDhkZWM4MzIyMmU=", - "upper_bound": "OWNlNzk5MTczNTU0NDQwNjhlMjQzOWJlNDQ2MTg4YzA=", - "repeats": 1 - }, - { - "count": 309179, - "lower_bound": "OWQxYmM5YWFkMTg2NDIxZDk1NjZlYzdmNjAxMDMwYTM=", - "upper_bound": "OWUwY2UwY2I2NjBiNDBjYTlmM2VkNDE1MWRkZjJhM2Y=", - "repeats": 1 - }, - { - "count": 311227, - "lower_bound": "OWUxNTdjZWYwMDIyNDYwYmE4NzM0ZjhjYTc2MjgwYmE=", - "upper_bound": "OWVkOGI4M2Q4ZjVmNDFlOWFiMDA5NWM1ZjNjMDM1Mjg=", - "repeats": 1 - }, - { - "count": 313274, - "lower_bound": "OWYwMzdiOTNhZjhlNDE0MjgyOTIzZjUzYjY0NjUyNDU=", - "upper_bound": "YTA3YTJmN2VlOTlmNDAwMWI4MDQxMDZiYTVkYTgwMGM=", - "repeats": 1 - }, - { - "count": 315322, - "lower_bound": "YTA4MDIzOTZiYWFhNDM3Njg2YWY5OGU4ZmVjOGVhOTE=", - "upper_bound": "YTE4NDg2ZmY4NTgyNGI1Y2JhNmFhMWM3MTliMWQyYTM=", - "repeats": 1 - }, - { - "count": 317369, - "lower_bound": "YTFhZTk0ZTFiNjA3NGNjMzkyYjE1MWE3MTkwNWQ3ZDY=", - "upper_bound": "YTJiNzZkZmJjMGRkNGUwMzk4NmQ4NzNlM2UyOTE2OGQ=", - "repeats": 1 - }, - { - "count": 319417, - "lower_bound": "YTJiOGRhNDRjMmFmNGYxNzliN2U1OWI5ZmQ2NDhjYTc=", - "upper_bound": "YTM3ZGViOTJjOWEzNDUwNDgyNzMzNmRlNzY5Y2E1Yzg=", - "repeats": 1 - }, - { - "count": 321465, - "lower_bound": "YTM4MmQwNDIyMzg3NDBmNmFkNjYzY2NjMjVkNDJhMjM=", - "upper_bound": "YTQyY2NmMGRiZDE0NDAyYzk0NzQ0MmM0NjBhZWM1M2E=", - "repeats": 1 - }, - { - "count": 323512, - "lower_bound": "YTQ0MTdkYzE4ODllNDU3NGJkMTAzNTYwYmNiMzA5Zjk=", - "upper_bound": "YTUxN2VmNzZlM2FiNGZmZmI5ODQ1OWVmZGQwNjUwYzM=", - "repeats": 1 - }, - { - "count": 325560, - "lower_bound": "YTU0ZGNiMzI3MTRiNDE5NjgwNzQ2OGZlZDViMDQyNGQ=", - "upper_bound": "YTY2ZWE0OGUyMzAxNDg2M2JlNDU4MDdkYWQwNTQ2OTk=", - "repeats": 1 - }, - { - "count": 327607, - "lower_bound": "YTY3M2RmNjZjYzJjNDA1YmI3ZDVlMzUwNDUzYjFjNTU=", - "upper_bound": "YTdjNThkYzgzOGE2NGE2Y2JlNWY2ZTEzZmM0OGYxN2Q=", - "repeats": 1 - }, - { - "count": 329655, - "lower_bound": "YTgxNmExN2UyMmRiNDJlN2FkMjZiMzU4MzAxMDFmMjA=", - "upper_bound": "YTkzNGRkNTM3ZTg2NGEzZDkyMWZhN2VkY2VmM2Q3YWM=", - "repeats": 1 - }, - { - "count": 331702, - "lower_bound": "YTkzOGQzODlkYjgwNGJmOWExOTQ4MWYwZmU1YjNjZWI=", - "upper_bound": "YWEyYmI1MmQ3NTUzNGEyOGI1YjkyMjg3NDQ2Njc1ZTE=", - "repeats": 1 - }, - { - "count": 333750, - "lower_bound": "YWEzYzNiZDg2YzQ2NGRhM2IwYjlkNGU0NjA1NmE3MWI=", - "upper_bound": "YWIzOTRlZjJiMjVkNDBkN2FiMDM4YmQ4ZGE4OGVlYzU=", - "repeats": 1 - }, - { - "count": 335797, - "lower_bound": "YWI0OGEwMjRiNDc2NDJlOWFkNDBkMWZmZmE0OTc2NDA=", - "upper_bound": "YWMyMjdhNDBiY2YzNGZmOWFiMWVmZWE1OGFkZTgwYzY=", - "repeats": 1 - }, - { - "count": 337845, - "lower_bound": "YWM0MzJmOTNmZDMwNGNmYmE4MjgxMDU1NTkzZDNmYjY=", - "upper_bound": "YWQzMTUyOWE5NmFiNDkyZDk3YTliYmMzMzIyMTExZTA=", - "repeats": 1 - }, - { - "count": 339892, - "lower_bound": "YWQ0YmRhYzAwYzZlNGQ5ZWJkMTlmYzVlNmNjYzZhMjA=", - "upper_bound": "YWUwMDc4OTA2MDkwNDFmNTk5ZDExMWMxZTllNmU1ZTQ=", - "repeats": 1 - }, - { - "count": 341940, - "lower_bound": "YWUwMDhlZmNkMzc5NGNlYTk5YjBhNjNhMmVkMDBkZTA=", - "upper_bound": "YWU2Y2UzNjg2MjIzNGJiZjg4NmFiZjhmNGU0MzU0OTc=", - "repeats": 1 - }, - { - "count": 343988, - "lower_bound": "YWU3OWQ2N2E1NTk5NGI2ZWFjMDJjZmI1ZTNhZmJjMmM=", - "upper_bound": "YWY3MmNjNmNkZDQzNGMzM2I4ODI5MDljZTQ1MzE3MGY=", - "repeats": 1 - }, - { - "count": 346035, - "lower_bound": "YWY3NTNhNGE3ZjZlNDM4MWEyYzkyYjk1MTFmNDVhYWU=", - "upper_bound": "YjAzZWY5YzBmNDg5NGU2OTgzMDg5NDQ1MjEzMmI1M2Y=", - "repeats": 1 - }, - { - "count": 348083, - "lower_bound": "YjA0NDc5ZWYyYzlkNDcyZWFlMmQyNGM2YTMyZGYwMTQ=", - "upper_bound": "YjBmNjdiYjBhOGYwNDg5MGI2NjY2MzJiZDE4NGJhOTU=", - "repeats": 1 - }, - { - "count": 350130, - "lower_bound": "YjEyMzVkZmM0YjdlNDVjNGJiZjMzOWJiMDVjOGFhMTc=", - "upper_bound": "YjFkMDI4OGFhZDI2NDc5NzljMGY3NDNjZjliYWI3Njg=", - "repeats": 1 - }, - { - "count": 352178, - "lower_bound": "YjFkODA1NTNmNDQ5NDNjMThkNmVjOWUxNmU0ZTVmODg=", - "upper_bound": "YjJkN2NlMjIwYzJjNGY1NWJhMmIyNTJhOTIxN2RkNWI=", - "repeats": 1 - }, - { - "count": 354225, - "lower_bound": "YjJlOTkyOGY4MWJiNDFhNmE2Zjg2YjQ2YjU1NWZmYTg=", - "upper_bound": "YjNkNGRjNTdkMWNhNGQ2MmFiYTU4YzdhZjExNDE4NTg=", - "repeats": 1 - }, - { - "count": 356273, - "lower_bound": "YjNkZWIyMjFmMTY5NDlkOWIyZGU0MDM1NmE5YTIzZjY=", - "upper_bound": "YjRkMjA5NDFjNzU1NGMyNjhmYjY1YjBmZTFmNGM2ZWQ=", - "repeats": 1 - }, - { - "count": 358320, - "lower_bound": "YjRkMzA5OWU1ZjEyNDAyYzk2NTBmNjM5Zjk0N2JmZTg=", - "upper_bound": "YjYxZjVhNWI5NmY3NDI0NTg4ZWU4ZmY3YTg3MmRkZTU=", - "repeats": 1 - }, - { - "count": 360368, - "lower_bound": "YjYyN2Y0NjM5ZWIyNDZlNzg1NzgwMDQ2YmI2NjE0YzU=", - "upper_bound": "YjZjNjdjYThmMTgzNDg5MmEwOGFlNzEwZTZmOTliOTE=", - "repeats": 1 - }, - { - "count": 362415, - "lower_bound": "YjZlMjgzMjUxOTBmNDI3MGJjMDAwNzk4ZTQ0MzFhODM=", - "upper_bound": "YjgwODYwZmQ4ZTNmNDcyYWJmZjkwNzFlYmE2OWU2MTM=", - "repeats": 1 - }, - { - "count": 364463, - "lower_bound": "YjgwZmFmYjBhNTZhNDVlOTg4ZDVkNTY1NDZiMzdiZGY=", - "upper_bound": "YjhmYTk1NmEyMDM5NDgxYmJkMWY0ZDMwNzhmMGYwYjY=", - "repeats": 1 - }, - { - "count": 366511, - "lower_bound": "YjkwYzFjOTc4NjRkNDQzNThiY2QwZmM4MjcxNzJlMjU=", - "upper_bound": "YmFmNDg3Nzc5ODE5NDgxYmEyYTNmYzUwYWU3YTU4MTE=", - "repeats": 1 - }, - { - "count": 368558, - "lower_bound": "YmIwN2YxNDY2MjQ2NGY1Mzg4NDRiNzVmYWI2MjhkZTg=", - "upper_bound": "YmJkODg1NTc5NmMxNGUwODg5MjUxMWRiZTFjMDcxMjE=", - "repeats": 1 - }, - { - "count": 370606, - "lower_bound": "YmJlYzJjOWFhZmM4NGVkZDk2MWYzZDNmY2VkYjA4M2M=", - "upper_bound": "YmM3OWM3YjBjZTJhNDBmYTk4ZTMyODI4MmYyNjcxOWE=", - "repeats": 1 - }, - { - "count": 372653, - "lower_bound": "YmM4MmQ2NTQwZDQ1NDMxZGI5MjJhOGU1MzAyN2Y4NWQ=", - "upper_bound": "YmQ5N2YwNjU3YTc2NGQ1MGI1YTBmZGQwMDY1OWY2YTk=", - "repeats": 1 - }, - { - "count": 374701, - "lower_bound": "YmRhZmExNzcxNDUzNDFkYWEzNzRlOTJlY2RlN2M5ODE=", - "upper_bound": "YmUzZWYxZGRmZDZiNDM0YWFiNTMyZGJlZTA2NGNlNDg=", - "repeats": 1 - }, - { - "count": 376748, - "lower_bound": "YmU0MzdhNTU5MjM5NGUzZGE0N2Q0MGJmMGJmNGY1ODM=", - "upper_bound": "YmY5OGExNzllZjgzNDRlMmFiYjg5NjYzOThlODhjYjg=", - "repeats": 1 - }, - { - "count": 378796, - "lower_bound": "YmZjNDEyNDQ5ZDdkNDcyOGEyZTZiYmM3ZDYzNjc3NTQ=", - "upper_bound": "YzA4ZTQxNTNkMzljNDM1NGE2YjkyMWJmZGI4YTVmYTM=", - "repeats": 1 - }, - { - "count": 380843, - "lower_bound": "YzA5YzIzMDFkZmMyNDliZGIyZTUyZDY0MjRmY2MwNjg=", - "upper_bound": "YzFiOTVjNTk2NjdhNDYwNzk5ZTYyZmE1NmIwY2I0YmQ=", - "repeats": 1 - }, - { - "count": 382891, - "lower_bound": "YzFjZDA3ZWVmN2ZiNDliNzlkMWVkMmY2ZWJhZjJhYTE=", - "upper_bound": "YzJhYWI0Y2Y0YmFhNGEyMmEwOTI5NDk2YzA3NWU4OTU=", - "repeats": 1 - }, - { - "count": 384939, - "lower_bound": "YzJiYTc2Y2I1MTY1NDBiNWJkYzAyYjdlYjJlZDhlNzk=", - "upper_bound": "YzM1ZThkNmJiODhmNGRkMGFjMzllNjNjZmFjYzA4NGQ=", - "repeats": 1 - }, - { - "count": 386986, - "lower_bound": "YzM3MzhmZDc5MTNmNGRkZThiMjkwYmI3MDI3NmZmOWI=", - "upper_bound": "YzQ4NWI4MTc1NTI4NDM4OGFiN2U0NThkNGEyYzg5OWI=", - "repeats": 1 - }, - { - "count": 389034, - "lower_bound": "YzRhYWViNGM2NjllNDRhY2I5ODVkMzdlMDdiM2IwZjU=", - "upper_bound": "YzU3YzQxOWRlMDNkNDQ2OTgxZGRmYTQ5NTlkOGExZTI=", - "repeats": 1 - }, - { - "count": 391081, - "lower_bound": "YzU4OGY1MDJkYmJhNDRiZjhlOGY2Mjc3ZTBhNTg3YmE=", - "upper_bound": "YzZmYTg5ZjIwOWI4NDg4NzgzYjE4YmUwOTk1NGEzMDQ=", - "repeats": 1 - }, - { - "count": 393129, - "lower_bound": "YzcwYTMwYjliMWMyNDBhMmFhZDgwNzZhZDkzOTFiNzQ=", - "upper_bound": "Yzg2MzQ1YjEyZDU0NGJmZTlkZDU1YjI1NWY3MGEwMDc=", - "repeats": 1 - }, - { - "count": 395176, - "lower_bound": "YzhiMjA3NjQ5NjhmNGVjOWFlY2E3MWVkNDUwMTc5OWQ=", - "upper_bound": "Yzk3YWI2MjcyN2FhNDNjMDhmNDM4ZTcxMzdlNGE2YmY=", - "repeats": 1 - }, - { - "count": 397224, - "lower_bound": "Yzk5ZTdlMjQ1N2E2NDdkNWJhZmIyMGM2NjAxMjM2MmQ=", - "upper_bound": "Y2E1ZTIxOGViZDAxNGI4NTk0MTdkOWQwYmQzNmM0Mjg=", - "repeats": 1 - }, - { - "count": 399271, - "lower_bound": "Y2E3YzY0ODVjYzRkNDg0ZDhlODljYjJhMDcyM2FlY2Y=", - "upper_bound": "Y2IwY2QyMWRiZjU0NDFhNTk5Y2JlYzNiZGY2N2FhOTA=", - "repeats": 1 - }, - { - "count": 401319, - "lower_bound": "Y2IxNDRmNjUxYjQ5NDA1ODk2OTAzZGQ4ODdhZDgwOTI=", - "upper_bound": "Y2JkNzc5NWU2YTlhNDY5YWI5N2QzM2RiZjY2ZTRjYTg=", - "repeats": 1 - }, - { - "count": 403366, - "lower_bound": "Y2MwN2M3MjUwZmFmNDc4NzhiMTQ5MzU3ODg2NDYyZmI=", - "upper_bound": "Y2Q5YTM1NDlmOGY2NDU4OGIzMzBjNGYxYjE2NTBiMzk=", - "repeats": 1 - }, - { - "count": 405414, - "lower_bound": "Y2RhYTVjYmUyODk1NGNlMzliOWZkNTkwODU0YWIxODE=", - "upper_bound": "Y2UzNWMyNjkwMTQyNDQyZDlkMjk1ZDhkZWI1YTc0NTY=", - "repeats": 1 - }, - { - "count": 407462, - "lower_bound": "Y2U0ZWJkYzUxYmUwNDQzOTk1YjZlM2ViZTViMzY2NWI=", - "upper_bound": "Y2VkNDA2N2ZmOTJjNDI5ZTkwMzg3NDA4YmRiYjQ0YTk=", - "repeats": 1 - }, - { - "count": 409509, - "lower_bound": "Y2VlNzNlZWQwZWE2NGUxYTljM2FhNjg5ZGQ5NmYxY2U=", - "upper_bound": "Y2ZjYjBiNzU5OWYyNGM4YWJlZmIyOGI2NDc0NzExNTU=", - "repeats": 1 - }, - { - "count": 411557, - "lower_bound": "Y2ZjZDY1NjMzZWY3NDgxM2JhN2RiNGY2NTk2ODUzM2U=", - "upper_bound": "ZDBhNGE0MTc0ZjE0NDQ0MWFhOWU0ZWY5M2IzMDk0OTc=", - "repeats": 1 - }, - { - "count": 413604, - "lower_bound": "ZDBhNTMxYTRmNTYyNGMzMTkxMjczMmVlYzQ0YzEyOTY=", - "upper_bound": "ZDFhMzJjZDllOWU1NDdjMzgzMTg1NDFlOGU4ZjU2NDc=", - "repeats": 1 - }, - { - "count": 415652, - "lower_bound": "ZDFhY2I4Zjc4YWNiNDk1ZmI0MzcxZDdjMDBlZTRlNTI=", - "upper_bound": "ZDI4Y2IzNjhmM2M3NGY5Mjg3YjVjZmE5ZmFhYzg4MTE=", - "repeats": 1 - }, - { - "count": 417699, - "lower_bound": "ZDJiMGJjYTZmZWQzNDgxY2E0MTZmMGUyNzNhYmMyYmI=", - "upper_bound": "ZDM5YmZmZDNjYmZlNDY3MWE5NjgxMTU4M2UyMjNmYTg=", - "repeats": 1 - }, - { - "count": 419747, - "lower_bound": "ZDNiNjlkNWNlYTI5NDBkZGFiZmJlOTQ1NmU1YzU1NjI=", - "upper_bound": "ZDRkNTFkOGI0MDcwNDlkNmIzMTA3Mjc4ZTQ1MmRhNzY=", - "repeats": 1 - }, - { - "count": 421794, - "lower_bound": "ZDRkOTQ3ZDljYmRlNDg1MTgwZjg1ZDU2Y2Q5MjVmNjc=", - "upper_bound": "ZDU4MTViMjQ5NmNjNGI0OThkZmM5MDViMTcxNmEzNDY=", - "repeats": 1 - }, - { - "count": 423842, - "lower_bound": "ZDU4ZmUwZmI4ODBjNDZjMWJjMmI3Mjg3Y2NmNjc2MjQ=", - "upper_bound": "ZDY1NzQ2ZmRlMGZkNGQ5OWIyY2QxNDY4ZGVkZDc3ZWY=", - "repeats": 1 - }, - { - "count": 425889, - "lower_bound": "ZDY2MTQyYmQ4NTBmNDcxZjk2MmY0OWU1MjYwZTNmNDU=", - "upper_bound": "ZDcxYjY3YjZiNmQ5NDhhNjk3MmExOGRhNjAyZWE0OWE=", - "repeats": 1 - }, - { - "count": 427937, - "lower_bound": "ZDcyYjk3NzE2OTkyNGE4MTk1NjU2MzZjY2E1YjgzN2U=", - "upper_bound": "ZDdlYzhkZWMyMjY0NDY4ZDk0NGFiMjJhYmM5YTk2Yzk=", - "repeats": 1 - }, - { - "count": 429985, - "lower_bound": "ZDgyM2FkZTBkNDZjNDQ2ODgxZmZhMGNlYTU1MDhjMTc=", - "upper_bound": "ZDkxNjEzOGUyZWI4NDcxNzg5M2QyMTNjOTRmZTc0ZTk=", - "repeats": 1 - }, - { - "count": 432032, - "lower_bound": "ZDkyNDRkMDU1MWIwNDM2MGJhYzdhNTI0Njk4YTYzYTQ=", - "upper_bound": "ZGE1NzQwYTA4Mjg3NDg1ZThlODViZGM4NzhkZWNmMzQ=", - "repeats": 1 - }, - { - "count": 434080, - "lower_bound": "ZGFhMzkzNWQ2NGI1NDg4MGE1ZGM4OTI4NzBlNWIwZTk=", - "upper_bound": "ZGIzZGJjOWMyMjBjNDkwZWJlYjMyYThlYTQzYmQwZGY=", - "repeats": 1 - }, - { - "count": 436127, - "lower_bound": "ZGI1NGI5ZDc2YTkyNDk3YjkzMWIxNjJkYjkzYjlkOWE=", - "upper_bound": "ZGM0MzgzNjFhMjkwNDJjYjgxMTlkMjI4MWQwODFlOTA=", - "repeats": 1 - }, - { - "count": 438175, - "lower_bound": "ZGM0ODU1Njg4MWVhNGUwMDliYjI4OTJjYjMxMzE3Mjc=", - "upper_bound": "ZGNmMzZjNWZmM2I4NDYzYzhkZWRjZGZlZWVkMjIzODM=", - "repeats": 1 - }, - { - "count": 440222, - "lower_bound": "ZGNmOWE1ZGY2MDZmNDAyOGFlYjRlYjFlZjk4NTEyYmQ=", - "upper_bound": "ZGRlYzE4ZTIxOTNiNDQ2OTk3OWYyZmJlYTM4NTA3MDg=", - "repeats": 1 - }, - { - "count": 442270, - "lower_bound": "ZGRmMzYwY2EzNjQ2NDEwOGEzODgyZjRhNTliZjM5YzI=", - "upper_bound": "ZGVmMmNlMWJiNGQzNGM2MmE5ODM5MjNlMTY0ZTc0OWY=", - "repeats": 1 - }, - { - "count": 444317, - "lower_bound": "ZGYwMDdhZjE5YjQ5NDVmMDk4NjRmZTg2OWJkMmU3MmY=", - "upper_bound": "ZGZmYWIxNDk0Njg0NDRlNzlhYzI3NDk0MTA5NGEzM2E=", - "repeats": 1 - }, - { - "count": 446365, - "lower_bound": "ZGZmYjZmYmFlN2E2NDQ3Yzk5ZGY3Y2ZlMGNkNmY3Yzk=", - "upper_bound": "ZTA0ZjYxNGJkN2FiNDcxZTgyZDdlNzVmZmYxMTA2ZmU=", - "repeats": 1 - }, - { - "count": 448413, - "lower_bound": "ZTA1MTI5MGNhNzY3NDE4M2EwMjZmZjMzM2VjNzEyZDQ=", - "upper_bound": "ZTExMTc4YzExZTUxNDYxNTljZmVlOWEzMGQ5OWIwMGQ=", - "repeats": 1 - }, - { - "count": 450460, - "lower_bound": "ZTE3ZDVkODZjODFiNDkyZGEyMTg4OTJiMjEyOTA1ZTQ=", - "upper_bound": "ZTI1MGNhOGFhZmIxNDQyZjkyNWIyZjNhYjE2OWVlODc=", - "repeats": 1 - }, - { - "count": 452508, - "lower_bound": "ZTI1MWVjNDQyMTc2NDQ2OGJhODlmNGI4ZmQyNjA3OWY=", - "upper_bound": "ZTJlNDBiNTA1OWY2NGE4N2IyNGVhMmQzMmM0Y2Y3NGE=", - "repeats": 1 - }, - { - "count": 454555, - "lower_bound": "ZTMxZDIyMjkxYWExNDMwYzhlNzdiYzIzODNhZDEzMDg=", - "upper_bound": "ZTNiZTdiZDBhNWM2NDM2MjhhZjBiOTVjYzYwOGExNDQ=", - "repeats": 1 - }, - { - "count": 456603, - "lower_bound": "ZTNjNWQ2NmUzY2Q4NGJlNjlmNjA2YWJjNWY5MWEyYzU=", - "upper_bound": "ZTUxYTQ1YmE2YzBjNDcxZmIyNzIyMjdjYzBlY2UxNjM=", - "repeats": 1 - }, - { - "count": 458650, - "lower_bound": "ZTUzMDNlZTk4Njk5NGY1OTkyYTEyZjVjYWI5YjBkM2U=", - "upper_bound": "ZTVmYTUyNWZiNzZiNGI4MThjZGM5ODEzY2YwZWFhOWQ=", - "repeats": 1 - }, - { - "count": 460698, - "lower_bound": "ZTYwODJhOGFhODI1NDhkNzhjMjE5ZGFjNzQ5N2YzZDY=", - "upper_bound": "ZTc1MzU0MjEyOGE0NDA5OGEzMjdkYjA1NGJhNjNiZDc=", - "repeats": 1 - }, - { - "count": 462745, - "lower_bound": "ZTc2Mzk1NGQ4ZjVkNDdlMjg4MzVlMTBlZDA1NGMyNzc=", - "upper_bound": "ZTg0NWQ4NDkyY2JmNGMyMGE2ODQ5NzYyNTEzZDk4NWM=", - "repeats": 1 - }, - { - "count": 464793, - "lower_bound": "ZTg1NmRkMmY5N2Y1NDk0NDhmMGE4ZjAzZGFjMDYwNTg=", - "upper_bound": "ZTkyM2Y2ZjQwZThhNDczOWE0Mzg2ZjY0YjA0Nzc5MGE=", - "repeats": 1 - }, - { - "count": 466840, - "lower_bound": "ZTkyZjFjNWI2OGJiNDYzNWE4Mzc0NDBmZjliOTFhOGE=", - "upper_bound": "ZWE1N2UyZTY5Y2RhNDQ4MGE0ZjFhMDQ3ZTRmZWQyMTQ=", - "repeats": 1 - }, - { - "count": 468888, - "lower_bound": "ZWE4NGJhMjAxYTllNDJlMTljN2RlMjEzNmVhNTM0YjQ=", - "upper_bound": "ZWJjMDRhMGJjYmNlNGI2ZmFhZDI5OGU2MDdmMTA3NzU=", - "repeats": 1 - }, - { - "count": 470936, - "lower_bound": "ZWMxNWY4MTcwMWQ3NDk2MTlhMzZjYzZiYmVlZjAzMzg=", - "upper_bound": "ZWM2YWYyYjM3MGQ0NDZlZDlmNzlkYTQ0ZDYxOGY3ZDM=", - "repeats": 1 - }, - { - "count": 472983, - "lower_bound": "ZWM3MWNkMGZjYmZlNDhiYmJlZDI2Zjk1N2ViMTIzZGE=", - "upper_bound": "ZWQ2ZmVhMzMyYjQzNGI2NGE0NDMwNWY4NjdkYTUxMTM=", - "repeats": 1 - }, - { - "count": 475031, - "lower_bound": "ZWQ4ZGUxZmI4NjM0NDczMjk4YWQ4ZWM2MDkxOWM1YWM=", - "upper_bound": "ZWVhZjU3MTY5ZjZiNDhhYWE3YjgzZDc2YmExNjI5YzQ=", - "repeats": 1 - }, - { - "count": 477078, - "lower_bound": "ZWViYmVjMGQzYWUxNGI3Nzg0YWZhYjQzMTNhZjY1YWM=", - "upper_bound": "ZWY2ZjBkYTY3NTZmNGMxY2EzMGFlYWQxNDUxZTRmNDY=", - "repeats": 1 - }, - { - "count": 479126, - "lower_bound": "ZWY3Y2Y0MzBhMWY4NGJmZWFjZThiOWZjMWM0NmMyOTA=", - "upper_bound": "ZjAzN2NiYjBjMjVkNDMzYjkwZjgyYjEwYTdjNzk4Mzg=", - "repeats": 1 - }, - { - "count": 481173, - "lower_bound": "ZjA0YzgxNTBlYTc1NDFmM2E4MmIwOGY5YjAyMDczNjA=", - "upper_bound": "ZjIxMTcwNzYxMDRiNDQ4Y2I0ZTFkMjA0YTMxZTFkMDY=", - "repeats": 1 - }, - { - "count": 483221, - "lower_bound": "ZjI1Zjc5NGFjYjcyNDA0YjkxOWE1N2ViOTY0ZGFlNzU=", - "upper_bound": "ZjJlMzkzMzVkMWJhNDU5ZThiMDBkNmQyODhiMTNiMmI=", - "repeats": 1 - }, - { - "count": 485268, - "lower_bound": "ZjJlNmRhOGQ1MWRiNDBkYjllZGQ2YTc5N2QwMTVjYTc=", - "upper_bound": "ZjM5OGUyODZjZWEwNDhhNjlkOWNhYzZmNTcwZGI1MzE=", - "repeats": 1 - }, - { - "count": 487316, - "lower_bound": "ZjNhMTM2NDk5ZjZmNGRlNWEzNDkzZDZkMWJkYzc3ZTI=", - "upper_bound": "ZjQ5MjIwYzE5NDMwNDg2MWI3MWMzZWUzODU1NjA0ODU=", - "repeats": 1 - }, - { - "count": 489363, - "lower_bound": "ZjQ5ZjA1YTdhOWMzNGZmMmFiNWJlNzYxMjdmMmU3NmI=", - "upper_bound": "ZjU2MGRhMjQ0OTVhNGU3OTk2NjZmMWZmMmZkMzI2ZmY=", - "repeats": 1 - }, - { - "count": 491411, - "lower_bound": "ZjU3ZjQ5ZGUxYzk0NDM2YmI3MWI0MWVlMTM4MDZiMmY=", - "upper_bound": "ZjY1ZjRjOWJmOWRhNGIyZmJmOGZiMjExYTBjYTQ3YTI=", - "repeats": 1 - }, - { - "count": 493459, - "lower_bound": "ZjY2NGUwM2U3M2M0NGIwYjlkZDQxNGRmODY1OTJmNGQ=", - "upper_bound": "ZjczNzkxOWYwNzZlNDUzNmFhZGVjZjcxNjA5YWNiZDg=", - "repeats": 1 - }, - { - "count": 495506, - "lower_bound": "Zjc1NWI4NTdlNmIxNGQxNGFjY2JlNGRjYWIxYzA5MzA=", - "upper_bound": "ZjgyMmQ0ZjZlMjUyNDQwNjgwYzYzOWZjMGUyNDkyOGQ=", - "repeats": 1 - }, - { - "count": 497554, - "lower_bound": "ZjgzMjIzZWQ0NDUyNDViZTk0MjMwMzIyZmNhYjczMWY=", - "upper_bound": "ZjkxNzY4MmJlMDk2NGM4MDlmNzIzMTA0ZGI2NDYxYzI=", - "repeats": 1 - }, - { - "count": 499601, - "lower_bound": "ZjkyMmYzMmQwOGJkNGY2OTgwMWRjYTkxYWU3OGE0MDA=", - "upper_bound": "ZjlkNjA1M2M5Y2EwNGFlYTlhZDllY2UzM2MzMzU0M2E=", - "repeats": 1 - }, - { - "count": 501649, - "lower_bound": "ZjllMGRlMDJkNzg3NDRkYjliNzI5Y2VlZGYwN2JkYjE=", - "upper_bound": "ZmFhM2EzMzRlZTlhNDg0NTgyZTZiZjVlNWUxOTUyNmU=", - "repeats": 1 - }, - { - "count": 503696, - "lower_bound": "ZmFhZWQ2MTJiMDUwNGUxYjkzODAyZWRmMWI0MDUzMzA=", - "upper_bound": "ZmJhZTFjYTcwNTc3NDZkY2I0ZDUzYzUzOTg3ZjY2NzI=", - "repeats": 1 - }, - { - "count": 505744, - "lower_bound": "ZmJiYzk1M2UzYTY4NDM0NTg4YmM2Y2MzNjU0YTU0Njk=", - "upper_bound": "ZmQyYmYyMjVhNDVkNDk3Zjg5OGQxMWFmN2M1MWRjMTY=", - "repeats": 1 - }, - { - "count": 507791, - "lower_bound": "ZmQyZDZjY2Y0YWM0NDMxZmFmYjMyYzM1ZDMzMTdlMDE=", - "upper_bound": "ZmU0MDdhZTY4M2FhNGEyMWE4NTQ0YzEyNDQwNjdmMGU=", - "repeats": 1 - }, - { - "count": 509839, - "lower_bound": "ZmU0MzQzZGJhYTY4NDlmODg0YWIxODkxOTNhYjE1MWI=", - "upper_bound": "ZmVmNWU4OGE3ZTQ1NDliMWJmZTRjMWIzZTI1MzE1OGQ=", - "repeats": 1 - }, - { - "count": 511887, - "lower_bound": "ZmYzMGMzZWQyNTY5NDA0NWFlNjE2ZGNlOTM5NTA4N2E=", - "upper_bound": "ZmZmMThkZDg2ZjY3NGI2ZGE0NWI5YTI2NjZmYzY1NTk=", - "repeats": 1 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 233, - 229, - 247, - 265, - 265, - 246, - 253, - 255, - 254, - 280, - 226, - 265, - 261, - 267, - 248, - 237, - 258, - 240, - 250, - 245, - 255, - 272, - 261, - 225, - 271, - 269, - 226, - 229, - 240, - 248, - 294, - 249, - 242, - 285, - 228, - 251, - 246, - 236, - 235, - 237, - 277, - 245, - 249, - 277, - 265, - 247, - 241, - 256, - 251, - 218, - 266, - 258, - 253, - 264, - 252, - 251, - 250, - 252, - 273, - 287, - 229, - 246, - 270, - 240, - 258, - 253, - 267, - 259, - 238, - 246, - 256, - 269, - 240, - 248, - 241, - 259, - 250, - 258, - 243, - 241, - 221, - 265, - 262, - 236, - 236, - 273, - 254, - 254, - 263, - 258, - 249, - 271, - 258, - 227, - 268, - 253, - 246, - 267, - 237, - 244, - 283, - 247, - 248, - 267, - 239, - 245, - 259, - 260, - 254, - 261, - 230, - 244, - 285, - 223, - 253, - 270, - 235, - 257, - 237, - 237, - 256, - 291, - 224, - 245, - 282, - 265, - 259, - 244, - 242, - 230, - 277, - 258, - 263, - 269, - 244, - 246, - 266, - 258, - 230, - 249, - 245, - 280, - 250, - 268, - 244, - 224, - 229, - 230, - 230, - 228, - 256, - 290, - 264, - 242, - 220, - 245, - 274, - 216, - 257, - 230, - 235, - 242, - 240, - 260, - 234, - 269, - 263, - 256, - 239, - 237, - 249, - 243, - 268, - 255, - 225, - 261, - 252, - 239, - 264, - 250, - 252, - 241, - 228, - 258, - 263, - 214, - 229, - 255, - 277, - 257, - 274, - 244, - 243, - 249, - 268, - 262, - 249, - 259, - 259, - 275, - 250, - 263, - 267, - 262, - 208, - 245, - 221, - 266, - 235, - 236, - 253, - 246, - 270, - 259, - 230, - 263, - 263, - 241, - 256, - 234, - 290, - 246, - 246, - 222, - 217, - 281, - 254, - 237, - 249, - 255, - 245, - 256, - 222, - 246, - 245, - 246, - 245, - 239, - 247, - 261, - 229, - 233, - 240, - 265, - 243, - 250, - 237, - 266, - 259, - 270, - 243, - 241, - 279, - 253, - 263, - 247, - 218, - 275, - 276, - 257, - 249, - 239, - 275, - 248, - 236, - 241, - 252, - 248, - 242, - 262, - 245, - 235, - 238, - 239, - 269, - 238, - 231, - 247, - 263, - 261, - 248, - 280, - 254, - 261, - 244, - 247, - 235, - 230, - 265, - 256, - 255, - 260, - 251, - 273, - 247, - 229, - 248, - 275, - 266, - 241, - 251, - 267, - 259, - 237, - 257, - 242, - 247, - 268, - 218, - 231, - 250, - 254, - 232, - 240, - 229, - 250, - 246, - 249, - 217, - 257, - 248, - 272, - 260, - 248, - 241, - 247, - 256, - 244, - 258, - 242, - 250, - 217, - 254, - 238, - 239, - 254, - 256, - 239, - 264, - 236, - 272, - 251, - 269, - 248, - 255, - 258, - 237, - 265, - 248, - 251, - 236, - 244, - 211, - 251, - 243, - 257, - 253, - 228, - 245, - 250, - 260, - 251, - 245, - 226, - 246, - 248, - 261, - 249, - 228, - 252, - 292, - 221, - 250, - 219, - 224, - 226, - 246, - 262, - 253, - 260, - 282, - 239, - 266, - 243, - 240, - 271, - 221, - 235, - 235, - 235, - 250, - 284, - 253, - 246, - 238, - 267, - 229, - 240, - 270, - 253, - 271, - 258, - 237, - 236, - 263, - 267, - 220, - 228, - 245, - 235, - 244, - 263, - 261, - 243, - 226, - 218, - 264, - 248, - 262, - 246, - 298, - 222, - 265, - 261, - 253, - 265, - 241, - 252, - 249, - 213, - 281, - 229, - 225, - 251, - 236, - 238, - 263, - 262, - 241, - 271, - 277, - 260, - 246, - 226, - 254, - 232, - 248, - 262, - 275, - 229, - 262, - 247, - 241, - 239, - 249, - 266, - 257, - 239, - 266, - 222, - 218, - 244, - 251, - 251, - 257, - 220, - 214, - 262, - 234, - 253, - 245, - 235, - 227, - 241, - 261, - 243, - 256, - 244, - 261, - 220, - 230, - 261, - 223, - 269, - 262, - 264, - 267, - 254, - 230, - 250, - 217, - 261, - 262, - 260, - 223, - 224, - 267, - 261, - 257, - 260, - 273, - 224, - 227, - 210, - 273, - 263, - 271, - 235, - 234, - 223, - 246, - 271, - 238, - 262, - 233, - 246, - 251, - 238, - 260, - 261, - 240, - 240, - 239, - 254, - 252, - 244, - 243, - 244, - 265, - 263, - 272, - 266, - 271, - 234, - 233, - 269, - 269, - 252, - 243, - 242, - 243, - 260, - 247, - 246, - 269, - 265, - 237, - 250, - 283, - 252, - 251, - 265, - 279, - 267, - 266, - 252, - 273, - 232, - 270, - 277, - 235, - 265, - 275, - 237, - 233, - 252, - 237, - 234, - 249, - 256, - 242, - 265, - 253, - 278, - 288, - 281, - 243, - 268, - 255, - 234, - 251, - 263, - 248, - 216, - 246, - 253, - 239, - 263, - 230, - 252, - 250, - 275, - 252, - 246, - 259, - 263, - 291, - 249, - 254, - 232, - 235, - 258, - 219, - 239, - 247, - 239, - 259, - 264, - 264, - 247, - 276, - 241, - 246, - 260, - 264, - 203, - 230, - 254, - 249, - 276, - 246, - 291, - 241, - 261, - 274, - 219, - 257, - 244, - 245, - 241, - 249, - 255, - 241, - 275, - 253, - 250, - 264, - 269, - 251, - 243, - 268, - 279, - 238, - 253, - 250, - 240, - 235, - 254, - 275, - 251, - 248, - 253, - 245, - 269, - 240, - 243, - 215, - 249, - 236, - 252, - 209, - 274, - 251, - 241, - 264, - 242, - 270, - 211, - 265, - 255, - 280, - 224, - 254, - 273, - 266, - 218, - 208, - 248, - 252, - 251, - 228, - 221, - 235, - 243, - 240, - 236, - 266, - 245, - 249, - 250, - 246, - 256, - 232, - 243, - 231, - 271, - 244, - 254, - 252, - 233, - 255, - 241, - 259, - 268, - 250, - 233, - 247, - 255, - 263, - 250, - 246, - 246, - 221, - 257, - 253, - 242, - 220, - 258, - 252, - 230, - 245, - 228, - 243, - 247, - 275, - 268, - 247, - 267, - 239, - 239, - 229, - 218, - 260, - 251, - 290, - 223, - 236, - 253, - 244, - 268, - 259, - 240, - 265, - 235, - 227, - 268, - 265, - 247, - 246, - 245, - 254, - 253, - 245, - 262, - 246, - 285, - 236, - 252, - 236, - 249, - 248, - 280, - 245, - 251, - 233, - 220, - 277, - 221, - 255, - 220, - 256, - 221, - 260, - 262, - 249, - 239, - 249, - 256, - 228, - 266, - 252, - 249, - 252, - 268, - 207, - 257, - 265, - 254, - 292, - 226, - 251, - 254, - 217, - 243, - 249, - 250, - 258, - 266, - 244, - 238, - 313, - 243, - 238, - 261, - 254, - 261, - 226, - 239, - 278, - 261, - 262, - 245, - 274, - 209, - 261, - 249, - 232, - 255, - 258, - 262, - 237, - 248, - 228, - 260, - 276, - 235, - 237, - 278, - 252, - 225, - 249, - 265, - 230, - 222, - 245, - 226, - 246, - 248, - 267, - 274, - 237, - 238, - 237, - 242, - 244, - 252, - 243, - 269, - 247, - 254, - 222, - 279, - 230, - 250, - 235, - 240, - 239, - 263, - 248, - 216, - 275, - 243, - 245, - 237, - 239, - 274, - 251, - 254, - 259, - 234, - 260, - 266, - 254, - 252, - 280, - 262, - 263, - 267, - 274, - 244, - 258, - 259, - 228, - 278, - 241, - 225, - 237, - 250, - 241, - 251, - 231, - 237, - 235, - 243, - 251, - 245, - 253, - 243, - 241, - 259, - 277, - 271, - 247, - 266, - 245, - 258, - 264, - 267, - 246, - 266, - 257, - 254, - 248, - 274, - 256, - 241, - 263, - 243, - 264, - 268, - 232, - 239, - 257, - 244, - 263, - 264, - 250, - 205, - 243, - 237, - 259, - 209, - 240, - 241, - 272, - 247, - 226, - 239, - 247, - 265, - 242, - 248, - 259, - 235, - 230, - 243, - 245, - 263, - 245, - 254, - 253, - 233, - 240, - 260, - 274, - 235, - 255, - 242, - 231, - 240, - 258, - 248, - 233, - 241, - 246, - 275, - 265, - 248, - 245, - 262, - 224, - 233, - 232, - 270, - 246, - 245, - 239, - 242, - 297, - 273, - 244, - 250, - 254, - 260, - 249, - 272, - 268, - 252, - 245, - 256, - 272, - 234, - 216, - 260, - 240, - 240, - 271, - 266, - 279, - 247, - 235, - 262, - 233, - 243, - 258, - 239, - 223, - 249, - 245, - 241, - 234, - 240, - 237, - 285, - 268, - 263, - 254, - 257, - 261, - 253, - 233, - 265, - 253, - 267, - 245, - 252, - 264, - 238, - 234, - 226, - 225, - 265, - 261, - 237, - 247, - 300, - 246, - 223, - 264, - 241, - 264, - 243, - 246, - 267, - 263, - 258, - 235, - 232, - 232, - 253, - 252, - 255, - 262, - 243, - 270, - 247, - 273, - 265, - 238, - 232, - 243, - 256, - 249, - 233, - 239, - 244, - 256, - 260, - 231, - 268, - 242, - 229, - 241, - 268, - 273, - 256, - 238, - 238, - 249, - 264, - 212, - 265, - 271, - 252, - 262, - 227, - 246, - 252, - 231, - 240, - 236, - 234, - 266, - 237, - 281, - 248, - 239, - 248, - 242, - 269, - 243, - 260, - 242, - 250, - 256, - 211, - 237, - 229, - 274, - 272, - 254, - 238, - 274, - 235, - 274, - 228, - 234, - 233, - 261, - 253, - 252, - 254, - 225, - 261, - 245, - 237, - 254, - 242, - 274, - 264, - 259, - 251, - 272, - 240, - 237, - 270, - 247, - 264, - 240, - 274, - 273, - 263, - 233, - 236, - 259, - 258, - 232, - 253, - 254, - 246, - 258, - 247, - 239, - 275, - 225, - 255, - 271, - 238, - 244, - 270, - 278, - 242, - 256, - 249, - 229, - 256, - 245, - 262, - 263, - 255, - 276, - 262, - 236, - 218, - 290, - 253, - 253, - 258, - 249, - 234, - 269, - 251, - 263, - 258, - 264, - 241, - 269, - 276, - 271, - 248, - 262, - 272, - 246, - 227, - 236, - 215, - 263, - 247, - 258, - 252, - 237, - 235, - 229, - 231, - 271, - 245, - 244, - 230, - 255, - 240, - 247, - 258, - 251, - 247, - 282, - 243, - 263, - 231, - 263, - 281, - 220, - 259, - 237, - 253, - 250, - 267, - 265, - 280, - 243, - 245, - 262, - 198, - 243, - 247, - 248, - 256, - 271, - 210, - 278, - 235, - 271, - 192, - 249, - 265, - 253, - 265, - 243, - 285, - 242, - 244, - 267, - 245, - 259, - 252, - 236, - 223, - 273, - 247, - 231, - 227, - 264, - 250, - 262, - 252, - 262, - 232, - 248, - 262, - 245, - 262, - 251, - 257, - 267, - 236, - 270, - 226, - 242, - 225, - 216, - 269, - 246, - 249, - 257, - 251, - 233, - 224, - 275, - 258, - 254, - 275, - 267, - 266, - 231, - 246, - 252, - 242, - 245, - 239, - 258, - 241, - 263, - 242, - 222, - 281, - 242, - 238, - 253, - 230, - 245, - 229, - 267, - 250, - 224, - 234, - 252, - 258, - 236, - 278, - 273, - 251, - 258, - 239, - 261, - 269, - 261, - 226, - 251, - 244, - 253, - 242, - 221, - 245, - 273, - 251, - 261, - 253, - 227, - 247, - 266, - 250, - 263, - 238, - 232, - 247, - 271, - 264, - 263, - 252, - 293, - 258, - 289, - 246, - 257, - 235, - 245, - 250, - 237, - 241, - 263, - 249, - 251, - 210, - 270, - 255, - 249, - 261, - 245, - 253, - 256, - 221, - 262, - 269, - 235, - 238, - 250, - 256, - 262, - 260, - 274, - 264, - 265, - 246, - 226, - 288, - 253, - 252, - 269, - 245, - 250, - 246, - 245, - 264, - 238, - 267, - 275, - 277, - 247, - 244, - 235, - 259, - 274, - 259, - 243, - 275, - 238, - 234, - 275, - 244, - 246, - 241, - 227, - 220, - 253, - 266, - 242, - 225, - 261, - 263, - 252, - 214, - 241, - 242, - 224, - 261, - 240, - 221, - 232, - 264, - 253, - 241, - 248, - 247, - 219, - 242, - 270, - 229, - 239, - 234, - 272, - 256, - 247, - 279, - 247, - 258, - 259, - 249, - 253, - 239, - 254, - 267, - 236, - 280, - 267, - 271, - 231, - 268, - 251, - 264, - 238, - 255, - 271, - 250, - 258, - 255, - 233, - 261, - 239, - 240, - 231, - 209, - 238, - 226, - 270, - 273, - 244, - 249, - 237, - 231, - 253, - 232, - 214, - 252, - 267, - 239, - 243, - 237, - 284, - 243, - 221, - 249, - 226, - 246, - 241, - 239, - 231, - 232, - 251, - 206, - 252, - 253, - 231, - 263, - 253, - 230, - 262, - 229, - 266, - 239, - 252, - 235, - 250, - 216, - 240, - 254, - 251, - 252, - 248, - 267, - 225, - 217, - 231, - 286, - 246, - 259, - 246, - 274, - 254, - 244, - 251, - 258, - 291, - 285, - 222, - 224, - 266, - 272, - 246, - 281, - 248, - 276, - 254, - 269, - 266, - 261, - 260, - 261, - 236, - 242, - 236, - 269, - 249, - 258, - 249, - 234, - 239, - 244, - 243, - 228, - 264, - 253, - 255, - 267, - 244, - 250, - 243, - 248, - 237, - 244, - 261, - 236, - 249, - 232, - 255, - 245, - 252, - 263, - 248, - 264, - 257, - 228, - 274, - 239, - 236, - 216, - 242, - 228, - 262, - 243, - 267, - 255, - 257, - 251, - 262, - 263, - 234, - 255, - 235, - 237, - 242, - 251, - 260, - 257, - 243, - 249, - 259, - 251, - 223, - 257, - 262, - 256, - 251, - 248, - 232, - 255, - 272, - 236, - 239, - 268, - 236, - 231, - 261, - 252, - 260, - 244, - 286, - 255, - 250, - 267, - 259, - 228, - 240, - 227, - 238, - 280, - 271, - 242, - 233, - 274, - 255, - 234, - 245, - 245, - 244, - 252, - 267, - 243, - 267, - 264, - 228, - 243, - 242, - 257, - 267, - 219, - 246, - 236, - 252, - 261, - 244, - 268, - 240, - 255, - 243, - 232, - 263, - 228, - 254, - 284, - 264, - 235, - 241, - 250, - 260, - 222, - 230, - 267, - 255, - 244, - 261, - 240, - 262, - 240, - 222, - 264, - 248, - 243, - 223, - 245, - 252, - 262, - 256, - 266, - 247, - 273, - 231, - 223, - 238, - 253, - 267, - 245, - 245, - 270, - 235, - 247, - 246, - 234, - 246, - 243, - 249, - 263, - 249, - 254, - 259, - 262, - 244, - 249, - 218, - 245, - 234, - 219, - 248, - 271, - 227, - 265, - 245, - 220, - 241, - 255, - 261, - 242, - 244, - 240, - 280, - 243, - 263, - 220, - 268, - 237, - 233, - 256, - 264, - 265, - 240, - 231, - 246, - 267, - 262, - 262, - 227, - 267, - 259, - 264, - 279, - 252, - 245, - 232, - 287, - 271, - 275, - 254, - 234, - 248, - 263, - 265, - 261, - 265, - 272, - 255, - 251, - 255, - 226, - 213, - 275, - 228, - 228, - 248, - 272, - 264, - 269, - 276, - 259, - 262, - 247, - 244, - 244, - 250, - 252, - 245, - 244, - 242, - 261, - 257, - 246, - 234, - 260, - 249, - 249, - 235, - 217, - 269, - 235, - 237, - 264, - 257, - 256, - 254, - 220, - 249, - 282, - 241, - 270, - 268, - 253, - 273, - 258, - 266, - 268, - 248, - 221, - 261, - 236, - 260, - 238, - 251, - 259, - 255, - 281, - 243, - 244, - 253, - 238, - 267, - 212, - 252, - 247, - 256, - 244, - 270, - 250, - 261, - 249, - 250, - 231, - 255, - 243, - 263, - 270, - 237, - 254, - 278, - 236, - 273, - 263, - 254, - 247, - 230, - 239, - 311, - 250, - 268, - 256, - 248, - 250, - 239, - 238, - 266, - 265, - 236, - 237, - 228, - 213, - 227, - 246, - 256, - 248, - 245, - 214, - 235, - 241, - 249, - 239, - 242, - 267, - 273, - 272, - 241, - 244, - 256, - 237, - 258, - 263, - 262, - 272, - 216, - 263, - 271, - 272, - 242, - 242, - 236, - 240, - 277, - 296, - 258, - 236, - 244, - 265, - 239, - 270, - 273, - 243, - 261, - 229, - 252, - 227, - 233, - 242, - 283, - 258, - 250, - 243, - 258, - 237, - 236, - 251, - 232, - 283, - 266, - 249, - 263, - 244, - 244, - 245, - 239, - 255, - 267, - 280, - 247, - 252, - 253, - 240, - 237, - 251, - 274, - 242, - 241, - 235, - 221, - 263, - 237, - 243, - 272, - 247, - 230, - 258, - 246, - 265, - 254, - 246, - 246, - 263, - 247, - 222, - 249, - 242, - 258, - 258, - 282, - 244, - 247, - 280, - 251, - 240, - 257, - 249, - 268, - 271, - 257, - 244, - 241, - 257, - 222, - 252, - 262, - 282, - 267, - 249, - 268, - 251, - 228, - 229, - 230, - 234, - 235, - 275, - 247, - 255, - 237, - 241, - 259, - 254, - 222, - 262, - 230, - 265, - 229, - 253, - 242, - 243, - 242, - 244, - 265, - 250, - 249, - 245, - 266, - 256, - 249, - 249, - 249, - 241, - 221, - 255, - 254, - 247, - 236, - 245, - 252, - 245, - 271, - 274, - 265, - 229, - 251, - 214, - 247, - 276, - 240, - 265, - 240, - 238, - 248, - 224, - 228, - 264, - 258, - 267, - 252 - ] - }, - { - "counters": [ - 229, - 249, - 251, - 258, - 246, - 263, - 250, - 251, - 229, - 262, - 256, - 234, - 254, - 261, - 230, - 236, - 237, - 261, - 240, - 228, - 252, - 247, - 245, - 264, - 210, - 211, - 242, - 261, - 260, - 252, - 260, - 250, - 206, - 233, - 239, - 255, - 224, - 248, - 241, - 255, - 238, - 242, - 230, - 229, - 271, - 245, - 271, - 273, - 225, - 250, - 251, - 263, - 270, - 242, - 240, - 270, - 256, - 218, - 239, - 278, - 244, - 267, - 273, - 240, - 250, - 249, - 233, - 251, - 236, - 257, - 256, - 257, - 242, - 259, - 260, - 261, - 225, - 253, - 259, - 272, - 246, - 251, - 227, - 245, - 267, - 253, - 269, - 253, - 257, - 241, - 220, - 260, - 261, - 254, - 249, - 247, - 269, - 270, - 254, - 235, - 238, - 249, - 251, - 238, - 255, - 266, - 243, - 264, - 276, - 236, - 241, - 263, - 236, - 261, - 269, - 253, - 218, - 247, - 260, - 249, - 240, - 249, - 243, - 257, - 260, - 248, - 237, - 222, - 283, - 240, - 221, - 251, - 248, - 264, - 260, - 235, - 247, - 250, - 272, - 238, - 248, - 249, - 250, - 286, - 248, - 251, - 254, - 251, - 234, - 267, - 251, - 230, - 267, - 257, - 238, - 279, - 254, - 247, - 232, - 250, - 236, - 238, - 252, - 219, - 269, - 238, - 264, - 257, - 237, - 254, - 253, - 254, - 222, - 235, - 264, - 237, - 254, - 251, - 247, - 295, - 265, - 244, - 252, - 280, - 249, - 220, - 269, - 237, - 234, - 247, - 222, - 232, - 243, - 252, - 241, - 267, - 252, - 247, - 243, - 262, - 235, - 252, - 249, - 250, - 243, - 273, - 269, - 234, - 239, - 266, - 250, - 254, - 260, - 253, - 270, - 259, - 259, - 233, - 250, - 220, - 264, - 274, - 241, - 252, - 240, - 208, - 242, - 269, - 259, - 262, - 205, - 232, - 234, - 246, - 266, - 248, - 231, - 258, - 254, - 246, - 248, - 231, - 248, - 240, - 254, - 263, - 271, - 240, - 272, - 227, - 248, - 241, - 252, - 249, - 248, - 269, - 277, - 237, - 280, - 249, - 249, - 236, - 245, - 257, - 222, - 262, - 255, - 243, - 233, - 226, - 279, - 236, - 292, - 241, - 226, - 249, - 263, - 218, - 259, - 207, - 237, - 238, - 266, - 237, - 248, - 243, - 241, - 255, - 245, - 254, - 253, - 244, - 249, - 244, - 258, - 238, - 262, - 271, - 271, - 264, - 251, - 257, - 246, - 214, - 256, - 252, - 257, - 255, - 252, - 221, - 260, - 235, - 266, - 286, - 251, - 273, - 252, - 269, - 240, - 257, - 255, - 239, - 249, - 238, - 249, - 232, - 271, - 247, - 240, - 225, - 262, - 219, - 278, - 237, - 240, - 225, - 267, - 270, - 259, - 239, - 254, - 252, - 254, - 264, - 265, - 222, - 272, - 242, - 224, - 246, - 242, - 266, - 245, - 233, - 259, - 260, - 215, - 250, - 253, - 241, - 247, - 238, - 263, - 234, - 249, - 245, - 260, - 238, - 270, - 253, - 237, - 253, - 241, - 250, - 249, - 243, - 252, - 272, - 282, - 263, - 212, - 252, - 252, - 230, - 264, - 254, - 249, - 248, - 251, - 240, - 271, - 271, - 233, - 257, - 272, - 246, - 256, - 248, - 272, - 250, - 236, - 261, - 240, - 241, - 261, - 270, - 243, - 242, - 259, - 232, - 234, - 230, - 237, - 266, - 245, - 253, - 270, - 231, - 263, - 249, - 249, - 239, - 258, - 256, - 271, - 267, - 242, - 269, - 242, - 250, - 244, - 224, - 252, - 271, - 231, - 242, - 231, - 263, - 258, - 247, - 246, - 236, - 282, - 245, - 272, - 278, - 243, - 278, - 243, - 253, - 279, - 265, - 227, - 251, - 279, - 218, - 256, - 255, - 261, - 255, - 228, - 256, - 253, - 225, - 253, - 241, - 229, - 255, - 257, - 255, - 253, - 268, - 221, - 263, - 267, - 236, - 271, - 255, - 269, - 245, - 219, - 259, - 247, - 216, - 253, - 254, - 233, - 233, - 276, - 217, - 231, - 226, - 221, - 264, - 278, - 249, - 243, - 233, - 217, - 232, - 245, - 275, - 284, - 240, - 270, - 265, - 248, - 248, - 231, - 249, - 265, - 278, - 257, - 262, - 248, - 242, - 276, - 266, - 234, - 200, - 262, - 236, - 215, - 269, - 265, - 227, - 245, - 254, - 235, - 244, - 227, - 254, - 273, - 289, - 266, - 285, - 240, - 248, - 250, - 264, - 248, - 257, - 230, - 248, - 263, - 240, - 246, - 243, - 269, - 255, - 260, - 266, - 246, - 214, - 295, - 248, - 291, - 228, - 227, - 255, - 258, - 303, - 224, - 250, - 280, - 287, - 226, - 251, - 237, - 227, - 263, - 227, - 246, - 241, - 229, - 239, - 256, - 266, - 268, - 253, - 246, - 255, - 238, - 257, - 251, - 229, - 269, - 251, - 239, - 277, - 248, - 245, - 281, - 240, - 261, - 249, - 250, - 276, - 252, - 245, - 229, - 247, - 267, - 233, - 245, - 255, - 224, - 247, - 254, - 280, - 246, - 253, - 242, - 234, - 244, - 243, - 224, - 243, - 221, - 245, - 251, - 252, - 252, - 247, - 254, - 232, - 259, - 261, - 258, - 228, - 264, - 223, - 258, - 253, - 225, - 237, - 247, - 210, - 265, - 258, - 261, - 233, - 255, - 268, - 253, - 256, - 248, - 253, - 282, - 271, - 246, - 234, - 244, - 232, - 242, - 236, - 243, - 257, - 233, - 277, - 267, - 262, - 243, - 233, - 252, - 243, - 264, - 229, - 243, - 262, - 252, - 265, - 222, - 251, - 248, - 221, - 259, - 257, - 240, - 257, - 256, - 238, - 249, - 247, - 249, - 272, - 240, - 241, - 244, - 268, - 267, - 271, - 250, - 265, - 265, - 243, - 255, - 272, - 234, - 238, - 252, - 258, - 251, - 236, - 292, - 235, - 270, - 256, - 247, - 241, - 271, - 262, - 244, - 253, - 255, - 254, - 245, - 249, - 229, - 261, - 270, - 251, - 280, - 248, - 254, - 262, - 232, - 245, - 225, - 254, - 249, - 245, - 272, - 235, - 263, - 246, - 239, - 230, - 243, - 256, - 235, - 236, - 282, - 274, - 261, - 286, - 228, - 269, - 220, - 245, - 261, - 276, - 249, - 266, - 255, - 252, - 256, - 270, - 230, - 251, - 228, - 256, - 247, - 245, - 258, - 232, - 231, - 258, - 246, - 237, - 231, - 258, - 266, - 273, - 237, - 251, - 248, - 247, - 249, - 269, - 228, - 250, - 268, - 276, - 229, - 264, - 254, - 264, - 285, - 247, - 242, - 248, - 251, - 253, - 259, - 255, - 276, - 224, - 255, - 271, - 230, - 261, - 273, - 238, - 295, - 246, - 267, - 264, - 252, - 250, - 244, - 264, - 241, - 242, - 234, - 241, - 226, - 259, - 218, - 217, - 237, - 273, - 234, - 237, - 264, - 281, - 251, - 284, - 255, - 264, - 251, - 240, - 227, - 279, - 260, - 241, - 232, - 243, - 246, - 251, - 264, - 260, - 212, - 244, - 244, - 247, - 227, - 230, - 244, - 264, - 222, - 262, - 257, - 285, - 250, - 258, - 242, - 263, - 259, - 250, - 257, - 242, - 215, - 244, - 233, - 248, - 236, - 244, - 248, - 221, - 241, - 224, - 247, - 229, - 283, - 249, - 258, - 266, - 230, - 244, - 266, - 248, - 278, - 259, - 214, - 244, - 246, - 239, - 242, - 230, - 258, - 244, - 237, - 242, - 232, - 236, - 261, - 262, - 249, - 251, - 270, - 270, - 263, - 242, - 254, - 263, - 229, - 254, - 303, - 239, - 263, - 242, - 240, - 252, - 250, - 247, - 267, - 275, - 249, - 235, - 255, - 273, - 233, - 246, - 246, - 244, - 262, - 275, - 269, - 242, - 255, - 255, - 226, - 252, - 262, - 256, - 262, - 227, - 283, - 280, - 263, - 281, - 244, - 218, - 252, - 263, - 272, - 241, - 272, - 235, - 257, - 247, - 253, - 223, - 241, - 276, - 229, - 254, - 233, - 251, - 260, - 264, - 287, - 233, - 250, - 250, - 275, - 257, - 238, - 231, - 237, - 270, - 231, - 229, - 255, - 238, - 238, - 251, - 276, - 245, - 244, - 243, - 239, - 263, - 218, - 255, - 270, - 250, - 269, - 230, - 248, - 264, - 258, - 234, - 250, - 269, - 222, - 264, - 241, - 267, - 222, - 235, - 249, - 274, - 279, - 255, - 228, - 228, - 219, - 267, - 299, - 251, - 242, - 245, - 259, - 248, - 251, - 256, - 261, - 234, - 251, - 232, - 287, - 242, - 274, - 239, - 245, - 258, - 253, - 239, - 266, - 289, - 237, - 263, - 258, - 258, - 285, - 265, - 219, - 249, - 250, - 255, - 243, - 271, - 266, - 268, - 248, - 279, - 237, - 276, - 245, - 244, - 236, - 231, - 257, - 244, - 261, - 267, - 268, - 243, - 288, - 257, - 243, - 259, - 237, - 259, - 268, - 268, - 235, - 259, - 254, - 241, - 258, - 275, - 265, - 263, - 260, - 241, - 250, - 248, - 232, - 264, - 285, - 253, - 253, - 254, - 250, - 244, - 251, - 261, - 233, - 253, - 232, - 241, - 220, - 254, - 231, - 243, - 229, - 230, - 272, - 235, - 263, - 265, - 266, - 272, - 265, - 225, - 272, - 240, - 266, - 275, - 219, - 241, - 252, - 255, - 255, - 265, - 263, - 237, - 233, - 236, - 237, - 249, - 275, - 245, - 258, - 223, - 244, - 235, - 276, - 237, - 260, - 241, - 232, - 236, - 227, - 240, - 238, - 249, - 271, - 248, - 279, - 253, - 247, - 238, - 221, - 274, - 282, - 247, - 267, - 227, - 253, - 265, - 235, - 270, - 238, - 252, - 284, - 247, - 263, - 271, - 248, - 237, - 258, - 239, - 262, - 254, - 236, - 240, - 247, - 238, - 265, - 247, - 259, - 261, - 251, - 233, - 241, - 237, - 252, - 246, - 252, - 261, - 238, - 253, - 248, - 235, - 270, - 258, - 248, - 242, - 276, - 248, - 246, - 268, - 245, - 242, - 239, - 221, - 267, - 264, - 254, - 251, - 248, - 233, - 243, - 224, - 223, - 237, - 249, - 263, - 281, - 278, - 253, - 256, - 231, - 270, - 274, - 298, - 242, - 271, - 251, - 253, - 240, - 248, - 254, - 282, - 241, - 225, - 248, - 241, - 254, - 269, - 249, - 257, - 238, - 260, - 262, - 251, - 263, - 266, - 224, - 233, - 244, - 231, - 242, - 250, - 272, - 218, - 273, - 237, - 225, - 250, - 251, - 243, - 232, - 251, - 257, - 240, - 259, - 246, - 242, - 248, - 239, - 244, - 237, - 251, - 235, - 238, - 269, - 223, - 261, - 262, - 267, - 269, - 266, - 251, - 248, - 264, - 255, - 249, - 235, - 254, - 241, - 260, - 281, - 258, - 263, - 256, - 240, - 244, - 270, - 236, - 238, - 285, - 237, - 243, - 263, - 258, - 247, - 249, - 236, - 242, - 235, - 241, - 252, - 262, - 262, - 237, - 231, - 274, - 247, - 255, - 250, - 241, - 285, - 270, - 261, - 280, - 256, - 276, - 225, - 260, - 268, - 235, - 246, - 234, - 250, - 256, - 249, - 246, - 264, - 262, - 255, - 238, - 245, - 238, - 239, - 260, - 248, - 242, - 247, - 257, - 263, - 252, - 235, - 246, - 243, - 260, - 266, - 265, - 255, - 250, - 238, - 264, - 262, - 254, - 237, - 278, - 250, - 234, - 241, - 245, - 220, - 241, - 241, - 233, - 246, - 253, - 237, - 268, - 276, - 212, - 265, - 255, - 231, - 240, - 244, - 204, - 241, - 283, - 259, - 260, - 299, - 265, - 265, - 258, - 257, - 262, - 236, - 280, - 246, - 232, - 245, - 241, - 234, - 276, - 235, - 269, - 256, - 244, - 253, - 253, - 245, - 253, - 261, - 258, - 236, - 239, - 261, - 267, - 251, - 232, - 222, - 226, - 238, - 263, - 244, - 229, - 253, - 264, - 244, - 240, - 274, - 254, - 272, - 239, - 269, - 252, - 211, - 234, - 242, - 260, - 245, - 247, - 233, - 239, - 273, - 252, - 264, - 266, - 257, - 267, - 248, - 269, - 235, - 271, - 244, - 242, - 224, - 242, - 267, - 266, - 232, - 228, - 252, - 220, - 254, - 245, - 248, - 245, - 278, - 236, - 234, - 234, - 269, - 273, - 264, - 249, - 236, - 266, - 261, - 232, - 254, - 252, - 266, - 247, - 241, - 256, - 283, - 243, - 245, - 270, - 260, - 249, - 260, - 245, - 249, - 282, - 244, - 250, - 245, - 254, - 247, - 257, - 264, - 235, - 244, - 243, - 288, - 244, - 239, - 245, - 249, - 263, - 253, - 226, - 245, - 267, - 262, - 244, - 255, - 252, - 250, - 259, - 279, - 235, - 254, - 273, - 261, - 270, - 240, - 240, - 248, - 262, - 268, - 215, - 267, - 223, - 232, - 241, - 264, - 244, - 229, - 246, - 236, - 254, - 248, - 233, - 249, - 239, - 224, - 214, - 258, - 233, - 268, - 271, - 252, - 270, - 259, - 229, - 279, - 236, - 232, - 284, - 252, - 234, - 266, - 259, - 243, - 239, - 247, - 228, - 250, - 241, - 216, - 254, - 260, - 267, - 295, - 215, - 248, - 236, - 272, - 224, - 233, - 211, - 234, - 237, - 253, - 287, - 244, - 266, - 263, - 253, - 244, - 243, - 257, - 263, - 255, - 239, - 273, - 255, - 244, - 240, - 247, - 257, - 247, - 224, - 246, - 213, - 265, - 230, - 223, - 244, - 290, - 254, - 229, - 246, - 232, - 270, - 274, - 277, - 267, - 263, - 256, - 244, - 228, - 255, - 234, - 255, - 232, - 222, - 274, - 257, - 245, - 244, - 243, - 251, - 226, - 259, - 262, - 260, - 238, - 244, - 226, - 241, - 260, - 265, - 269, - 231, - 219, - 254, - 259, - 220, - 249, - 263, - 242, - 251, - 241, - 262, - 250, - 241, - 235, - 252, - 267, - 264, - 264, - 237, - 221, - 245, - 263, - 247, - 248, - 239, - 241, - 254, - 276, - 231, - 239, - 226, - 272, - 266, - 256, - 239, - 257, - 240, - 252, - 246, - 252, - 231, - 243, - 239, - 266, - 234, - 264, - 244, - 240, - 260, - 254, - 229, - 253, - 247, - 239, - 228, - 270, - 245, - 226, - 231, - 260, - 258, - 242, - 250, - 228, - 214, - 247, - 246, - 231, - 285, - 249, - 258, - 226, - 232, - 248, - 250, - 226, - 252, - 259, - 257, - 244, - 223, - 240, - 248, - 253, - 247, - 264, - 235, - 238, - 235, - 235, - 227, - 259, - 261, - 249, - 273, - 250, - 250, - 232, - 245, - 258, - 272, - 247, - 268, - 265, - 250, - 260, - 240, - 257, - 236, - 260, - 239, - 264, - 244, - 244, - 241, - 262, - 228, - 255, - 235, - 226, - 215, - 249, - 256, - 243, - 268, - 241, - 244, - 263, - 272, - 270, - 238, - 259, - 259, - 254, - 230, - 254, - 236, - 229, - 268, - 238, - 254, - 268, - 211, - 270, - 251, - 291, - 239, - 272, - 246, - 253, - 258, - 226, - 215, - 243, - 246, - 268, - 214, - 240, - 257, - 267, - 252, - 218, - 252, - 259, - 203, - 257, - 240, - 236, - 238, - 242, - 228, - 265, - 243, - 276, - 274, - 252, - 228, - 257, - 279, - 253, - 255, - 250, - 264, - 243, - 255, - 209, - 243, - 222, - 274, - 249, - 246, - 240, - 268, - 239, - 246, - 264, - 249, - 266, - 236, - 262, - 226, - 254, - 259, - 248, - 274, - 240, - 253, - 268, - 250, - 247, - 244, - 259, - 260, - 257, - 261, - 274, - 253, - 249, - 238, - 239, - 274, - 241, - 214, - 257, - 263, - 245, - 251, - 245, - 258, - 252, - 215, - 250, - 272, - 228, - 260, - 268, - 256, - 251, - 253, - 262, - 249, - 262, - 251, - 247, - 264, - 236, - 230, - 240, - 239, - 258, - 243, - 242, - 238, - 242, - 231, - 278, - 265, - 275, - 239, - 219, - 240, - 261, - 238, - 266, - 231, - 243, - 241, - 231, - 253, - 251, - 258, - 241, - 291, - 238, - 249, - 245, - 253, - 247, - 252, - 236, - 244, - 232, - 234, - 253, - 237, - 224, - 228, - 260, - 229, - 260, - 272, - 249, - 268, - 236, - 256, - 264, - 233, - 245, - 256, - 264, - 268, - 230, - 248, - 279, - 251, - 247, - 274, - 245, - 244, - 275, - 227, - 255, - 268, - 247, - 261, - 249, - 246, - 252, - 253, - 251, - 239, - 251, - 255, - 235, - 257, - 245, - 249, - 264, - 247, - 286, - 269, - 250, - 246, - 270, - 237, - 230, - 256, - 244, - 245, - 239, - 288, - 241, - 248, - 253, - 253, - 286, - 246, - 251, - 218, - 259, - 275, - 215, - 257, - 273, - 259, - 267, - 249, - 235, - 250, - 240, - 247, - 263, - 222, - 261, - 258, - 270, - 226, - 265, - 248, - 229, - 258, - 254, - 274, - 232, - 245, - 249, - 273, - 265, - 234, - 258, - 245, - 248, - 243, - 235, - 220, - 252, - 292, - 254, - 240, - 226, - 229, - 238, - 242, - 208, - 238, - 249, - 267, - 230, - 229, - 245, - 261, - 229, - 252, - 269, - 249, - 254, - 242 - ] - }, - { - "counters": [ - 241, - 257, - 250, - 231, - 249, - 234, - 241, - 273, - 268, - 257, - 256, - 258, - 257, - 254, - 240, - 257, - 211, - 225, - 237, - 261, - 259, - 248, - 242, - 254, - 253, - 249, - 248, - 265, - 256, - 239, - 256, - 232, - 239, - 254, - 226, - 259, - 248, - 235, - 232, - 263, - 242, - 270, - 229, - 280, - 214, - 272, - 260, - 251, - 260, - 240, - 241, - 245, - 244, - 236, - 227, - 255, - 237, - 241, - 263, - 239, - 251, - 255, - 272, - 270, - 275, - 247, - 275, - 242, - 233, - 242, - 259, - 261, - 229, - 226, - 233, - 265, - 280, - 271, - 237, - 259, - 255, - 261, - 255, - 273, - 239, - 242, - 274, - 271, - 276, - 243, - 261, - 228, - 249, - 226, - 246, - 252, - 259, - 235, - 246, - 263, - 243, - 235, - 264, - 239, - 250, - 246, - 248, - 270, - 262, - 270, - 242, - 238, - 235, - 229, - 250, - 257, - 243, - 244, - 239, - 239, - 246, - 267, - 234, - 222, - 275, - 240, - 277, - 270, - 238, - 239, - 279, - 232, - 242, - 214, - 264, - 261, - 279, - 240, - 237, - 259, - 249, - 262, - 280, - 229, - 249, - 233, - 241, - 254, - 220, - 239, - 260, - 247, - 230, - 255, - 250, - 249, - 282, - 235, - 268, - 226, - 262, - 241, - 267, - 249, - 241, - 257, - 236, - 267, - 252, - 244, - 214, - 228, - 251, - 264, - 258, - 268, - 262, - 261, - 246, - 244, - 248, - 263, - 234, - 247, - 273, - 250, - 243, - 236, - 258, - 256, - 244, - 252, - 225, - 244, - 235, - 250, - 271, - 234, - 211, - 236, - 277, - 256, - 257, - 267, - 234, - 256, - 266, - 213, - 280, - 233, - 233, - 265, - 230, - 254, - 246, - 253, - 244, - 273, - 245, - 255, - 257, - 242, - 249, - 216, - 242, - 239, - 267, - 251, - 248, - 269, - 236, - 233, - 274, - 259, - 241, - 226, - 242, - 258, - 251, - 261, - 244, - 246, - 259, - 241, - 234, - 234, - 247, - 227, - 246, - 264, - 263, - 245, - 266, - 270, - 248, - 261, - 227, - 241, - 275, - 249, - 243, - 234, - 219, - 269, - 273, - 256, - 284, - 258, - 259, - 290, - 241, - 244, - 229, - 249, - 224, - 243, - 246, - 247, - 273, - 253, - 258, - 231, - 247, - 242, - 231, - 233, - 240, - 232, - 235, - 273, - 287, - 249, - 253, - 272, - 262, - 267, - 241, - 261, - 281, - 226, - 261, - 256, - 231, - 258, - 264, - 227, - 244, - 238, - 245, - 238, - 245, - 248, - 257, - 214, - 255, - 246, - 262, - 233, - 269, - 225, - 253, - 269, - 277, - 242, - 232, - 238, - 274, - 235, - 226, - 234, - 228, - 252, - 252, - 251, - 237, - 256, - 239, - 240, - 241, - 254, - 219, - 259, - 238, - 253, - 262, - 241, - 225, - 232, - 252, - 236, - 241, - 228, - 244, - 241, - 220, - 243, - 248, - 265, - 239, - 239, - 247, - 255, - 255, - 244, - 243, - 252, - 260, - 265, - 251, - 227, - 255, - 235, - 249, - 271, - 240, - 253, - 246, - 236, - 277, - 240, - 259, - 284, - 235, - 251, - 255, - 253, - 241, - 261, - 225, - 242, - 247, - 241, - 246, - 244, - 245, - 234, - 285, - 254, - 235, - 235, - 245, - 266, - 226, - 239, - 234, - 248, - 256, - 240, - 233, - 267, - 245, - 251, - 272, - 233, - 240, - 235, - 233, - 251, - 269, - 286, - 228, - 246, - 256, - 225, - 214, - 286, - 236, - 264, - 241, - 246, - 261, - 267, - 269, - 265, - 281, - 241, - 249, - 254, - 242, - 216, - 254, - 236, - 265, - 242, - 266, - 261, - 240, - 226, - 236, - 241, - 236, - 264, - 254, - 245, - 233, - 245, - 256, - 251, - 272, - 226, - 248, - 255, - 241, - 231, - 240, - 238, - 257, - 223, - 270, - 268, - 291, - 233, - 250, - 251, - 295, - 231, - 222, - 235, - 255, - 283, - 262, - 237, - 245, - 238, - 263, - 218, - 261, - 260, - 241, - 229, - 269, - 255, - 222, - 254, - 236, - 256, - 257, - 242, - 271, - 245, - 263, - 246, - 242, - 247, - 229, - 253, - 245, - 257, - 246, - 240, - 264, - 247, - 246, - 245, - 232, - 278, - 246, - 259, - 253, - 239, - 250, - 246, - 257, - 275, - 278, - 224, - 237, - 256, - 241, - 246, - 244, - 222, - 262, - 253, - 296, - 259, - 226, - 267, - 242, - 248, - 271, - 240, - 243, - 238, - 272, - 284, - 271, - 232, - 275, - 234, - 248, - 259, - 229, - 273, - 214, - 268, - 256, - 249, - 276, - 241, - 262, - 267, - 264, - 215, - 266, - 234, - 248, - 251, - 222, - 270, - 266, - 246, - 236, - 249, - 242, - 240, - 234, - 257, - 266, - 258, - 255, - 255, - 242, - 252, - 247, - 241, - 236, - 256, - 245, - 240, - 263, - 252, - 255, - 220, - 249, - 283, - 230, - 262, - 243, - 233, - 243, - 258, - 251, - 265, - 251, - 254, - 272, - 246, - 262, - 227, - 279, - 251, - 247, - 243, - 245, - 209, - 242, - 254, - 222, - 259, - 250, - 265, - 235, - 250, - 264, - 240, - 261, - 249, - 235, - 243, - 234, - 228, - 235, - 257, - 260, - 258, - 246, - 245, - 259, - 224, - 246, - 236, - 230, - 242, - 244, - 252, - 242, - 264, - 269, - 253, - 235, - 249, - 238, - 235, - 267, - 266, - 236, - 253, - 260, - 220, - 231, - 241, - 222, - 276, - 247, - 267, - 240, - 255, - 269, - 267, - 234, - 257, - 236, - 242, - 230, - 251, - 254, - 250, - 247, - 289, - 231, - 228, - 263, - 248, - 298, - 263, - 248, - 268, - 237, - 251, - 234, - 226, - 248, - 233, - 259, - 273, - 258, - 239, - 263, - 254, - 257, - 244, - 255, - 266, - 232, - 248, - 253, - 235, - 260, - 222, - 233, - 226, - 243, - 263, - 239, - 239, - 261, - 253, - 229, - 245, - 244, - 268, - 280, - 229, - 282, - 243, - 247, - 259, - 255, - 241, - 256, - 244, - 226, - 225, - 253, - 236, - 245, - 238, - 234, - 249, - 269, - 245, - 243, - 255, - 236, - 239, - 250, - 258, - 259, - 254, - 253, - 240, - 280, - 265, - 199, - 263, - 234, - 227, - 259, - 254, - 255, - 263, - 240, - 246, - 220, - 260, - 240, - 269, - 257, - 255, - 250, - 267, - 241, - 229, - 236, - 235, - 262, - 241, - 250, - 249, - 233, - 232, - 280, - 233, - 241, - 229, - 258, - 243, - 265, - 225, - 261, - 254, - 260, - 230, - 253, - 261, - 291, - 261, - 239, - 253, - 235, - 248, - 254, - 263, - 269, - 256, - 270, - 247, - 277, - 234, - 269, - 280, - 259, - 256, - 280, - 265, - 259, - 250, - 262, - 250, - 242, - 250, - 249, - 243, - 232, - 243, - 254, - 234, - 237, - 272, - 235, - 259, - 248, - 256, - 227, - 245, - 241, - 255, - 253, - 252, - 258, - 275, - 263, - 248, - 271, - 273, - 246, - 264, - 231, - 246, - 239, - 239, - 287, - 215, - 257, - 228, - 230, - 258, - 266, - 234, - 234, - 246, - 255, - 236, - 253, - 236, - 246, - 257, - 225, - 267, - 268, - 207, - 251, - 246, - 249, - 262, - 250, - 249, - 251, - 247, - 271, - 270, - 252, - 262, - 249, - 239, - 243, - 230, - 270, - 270, - 254, - 241, - 277, - 284, - 253, - 249, - 264, - 273, - 256, - 252, - 259, - 250, - 250, - 272, - 239, - 246, - 236, - 256, - 272, - 248, - 233, - 243, - 303, - 267, - 273, - 264, - 247, - 237, - 218, - 261, - 249, - 250, - 258, - 239, - 252, - 210, - 264, - 243, - 254, - 260, - 262, - 256, - 234, - 252, - 257, - 261, - 279, - 225, - 227, - 250, - 248, - 210, - 242, - 225, - 235, - 250, - 250, - 267, - 252, - 243, - 252, - 234, - 252, - 244, - 248, - 254, - 259, - 244, - 263, - 211, - 257, - 250, - 235, - 226, - 252, - 239, - 230, - 241, - 219, - 259, - 250, - 274, - 233, - 235, - 255, - 242, - 245, - 244, - 236, - 246, - 263, - 247, - 250, - 266, - 242, - 249, - 225, - 251, - 222, - 252, - 278, - 240, - 264, - 245, - 274, - 232, - 226, - 245, - 250, - 274, - 246, - 265, - 242, - 207, - 248, - 279, - 233, - 253, - 258, - 228, - 258, - 242, - 254, - 239, - 246, - 271, - 236, - 230, - 238, - 258, - 235, - 256, - 240, - 241, - 235, - 246, - 276, - 282, - 242, - 233, - 274, - 226, - 233, - 263, - 231, - 246, - 244, - 262, - 220, - 223, - 249, - 272, - 251, - 241, - 233, - 266, - 260, - 237, - 267, - 244, - 251, - 234, - 263, - 252, - 246, - 260, - 257, - 228, - 267, - 263, - 269, - 246, - 255, - 241, - 265, - 251, - 241, - 232, - 251, - 244, - 286, - 242, - 227, - 241, - 242, - 268, - 242, - 273, - 257, - 223, - 280, - 235, - 253, - 240, - 258, - 261, - 264, - 264, - 243, - 306, - 264, - 263, - 255, - 272, - 252, - 244, - 268, - 251, - 268, - 252, - 245, - 238, - 238, - 256, - 241, - 235, - 256, - 251, - 232, - 243, - 247, - 273, - 271, - 250, - 257, - 245, - 255, - 244, - 253, - 270, - 258, - 238, - 255, - 228, - 276, - 256, - 218, - 266, - 255, - 263, - 255, - 255, - 233, - 260, - 250, - 272, - 236, - 236, - 261, - 256, - 230, - 261, - 247, - 230, - 241, - 244, - 245, - 251, - 247, - 244, - 257, - 266, - 241, - 254, - 253, - 237, - 247, - 266, - 244, - 254, - 238, - 249, - 258, - 286, - 264, - 274, - 243, - 249, - 269, - 239, - 250, - 256, - 264, - 272, - 238, - 265, - 282, - 236, - 241, - 245, - 227, - 250, - 266, - 221, - 246, - 232, - 271, - 265, - 208, - 242, - 236, - 268, - 272, - 244, - 265, - 257, - 231, - 247, - 250, - 255, - 255, - 291, - 281, - 237, - 262, - 241, - 262, - 238, - 239, - 246, - 264, - 233, - 260, - 288, - 257, - 242, - 224, - 252, - 267, - 242, - 221, - 263, - 248, - 250, - 249, - 266, - 272, - 250, - 241, - 251, - 261, - 261, - 254, - 234, - 240, - 250, - 267, - 246, - 251, - 262, - 246, - 232, - 248, - 230, - 264, - 218, - 236, - 236, - 239, - 254, - 273, - 241, - 246, - 264, - 256, - 260, - 275, - 248, - 271, - 245, - 247, - 267, - 258, - 252, - 265, - 244, - 222, - 267, - 277, - 276, - 260, - 243, - 265, - 260, - 235, - 248, - 250, - 268, - 253, - 261, - 260, - 244, - 248, - 261, - 255, - 259, - 241, - 238, - 237, - 229, - 256, - 257, - 250, - 236, - 247, - 249, - 265, - 245, - 257, - 247, - 235, - 241, - 243, - 262, - 246, - 256, - 252, - 272, - 271, - 272, - 248, - 260, - 260, - 274, - 244, - 250, - 212, - 247, - 268, - 238, - 249, - 266, - 226, - 263, - 229, - 245, - 240, - 236, - 271, - 249, - 240, - 255, - 224, - 262, - 239, - 253, - 254, - 259, - 274, - 284, - 232, - 269, - 266, - 229, - 259, - 268, - 225, - 277, - 251, - 245, - 234, - 231, - 269, - 247, - 261, - 242, - 221, - 261, - 260, - 246, - 254, - 249, - 233, - 240, - 270, - 226, - 255, - 233, - 223, - 250, - 241, - 240, - 274, - 255, - 236, - 247, - 235, - 270, - 245, - 219, - 258, - 235, - 209, - 255, - 258, - 274, - 245, - 238, - 268, - 265, - 254, - 255, - 248, - 240, - 252, - 223, - 242, - 258, - 243, - 261, - 247, - 239, - 257, - 268, - 241, - 249, - 263, - 214, - 262, - 231, - 288, - 253, - 274, - 265, - 258, - 227, - 241, - 279, - 261, - 274, - 234, - 292, - 266, - 269, - 288, - 244, - 241, - 259, - 252, - 259, - 251, - 258, - 250, - 259, - 235, - 255, - 266, - 254, - 244, - 259, - 237, - 248, - 258, - 250, - 261, - 230, - 257, - 270, - 291, - 241, - 238, - 263, - 247, - 261, - 254, - 244, - 232, - 239, - 274, - 229, - 246, - 246, - 260, - 257, - 223, - 236, - 256, - 231, - 252, - 279, - 276, - 252, - 248, - 257, - 217, - 250, - 225, - 245, - 281, - 242, - 268, - 239, - 233, - 220, - 236, - 268, - 245, - 240, - 273, - 269, - 225, - 243, - 247, - 257, - 238, - 250, - 255, - 275, - 254, - 261, - 265, - 229, - 262, - 228, - 254, - 251, - 222, - 251, - 253, - 275, - 231, - 264, - 223, - 245, - 257, - 231, - 235, - 264, - 269, - 239, - 270, - 223, - 259, - 260, - 235, - 248, - 271, - 211, - 233, - 218, - 227, - 238, - 234, - 269, - 258, - 230, - 245, - 256, - 234, - 265, - 248, - 251, - 215, - 249, - 274, - 258, - 220, - 271, - 257, - 242, - 252, - 230, - 230, - 266, - 244, - 244, - 243, - 283, - 260, - 270, - 246, - 228, - 251, - 263, - 284, - 253, - 302, - 249, - 263, - 243, - 249, - 232, - 237, - 258, - 239, - 263, - 232, - 253, - 248, - 244, - 237, - 273, - 243, - 252, - 265, - 234, - 231, - 238, - 245, - 289, - 273, - 253, - 259, - 274, - 251, - 243, - 213, - 262, - 249, - 245, - 217, - 270, - 248, - 252, - 253, - 257, - 229, - 268, - 263, - 244, - 263, - 252, - 245, - 265, - 237, - 219, - 257, - 239, - 262, - 240, - 265, - 228, - 234, - 264, - 266, - 268, - 260, - 230, - 258, - 260, - 257, - 258, - 215, - 227, - 240, - 247, - 241, - 236, - 235, - 235, - 235, - 263, - 254, - 228, - 268, - 244, - 239, - 276, - 257, - 230, - 251, - 213, - 241, - 265, - 253, - 250, - 243, - 241, - 270, - 250, - 255, - 243, - 247, - 246, - 269, - 243, - 255, - 242, - 252, - 231, - 252, - 237, - 237, - 266, - 225, - 264, - 244, - 269, - 268, - 264, - 260, - 211, - 235, - 269, - 229, - 285, - 256, - 227, - 246, - 231, - 250, - 263, - 251, - 268, - 265, - 264, - 242, - 253, - 271, - 267, - 250, - 263, - 224, - 242, - 241, - 272, - 261, - 273, - 233, - 265, - 247, - 241, - 271, - 217, - 250, - 242, - 239, - 260, - 254, - 267, - 269, - 264, - 264, - 255, - 265, - 251, - 215, - 236, - 248, - 272, - 249, - 240, - 229, - 251, - 237, - 229, - 227, - 229, - 261, - 280, - 255, - 245, - 234, - 268, - 275, - 251, - 270, - 249, - 244, - 257, - 238, - 272, - 255, - 294, - 270, - 244, - 242, - 225, - 265, - 240, - 267, - 273, - 234, - 296, - 266, - 240, - 267, - 255, - 253, - 253, - 252, - 256, - 235, - 235, - 261, - 236, - 241, - 273, - 227, - 255, - 278, - 262, - 211, - 245, - 266, - 261, - 226, - 226, - 244, - 249, - 214, - 247, - 266, - 228, - 284, - 244, - 219, - 243, - 275, - 259, - 270, - 257, - 243, - 227, - 255, - 248, - 242, - 232, - 259, - 252, - 267, - 269, - 221, - 249, - 242, - 270, - 254, - 250, - 247, - 214, - 240, - 224, - 271, - 249, - 259, - 248, - 261, - 247, - 241, - 272, - 256, - 234, - 254, - 278, - 249, - 254, - 245, - 252, - 259, - 241, - 254, - 264, - 240, - 303, - 269, - 265, - 261, - 231, - 242, - 236, - 264, - 250, - 262, - 266, - 263, - 246, - 235, - 256, - 239, - 255, - 251, - 223, - 254, - 253, - 256, - 248, - 222, - 251, - 274, - 252, - 218, - 242, - 234, - 260, - 236, - 270, - 270, - 253, - 245, - 253, - 262, - 240, - 248, - 268, - 300, - 256, - 286, - 245, - 270, - 255, - 259, - 242, - 248, - 265, - 274, - 217, - 213, - 261, - 263, - 246, - 214, - 268, - 240, - 239, - 242, - 244, - 271, - 265, - 256, - 252, - 248, - 260, - 236, - 230, - 261, - 230, - 236, - 241, - 274, - 228, - 242, - 242, - 271, - 257, - 265, - 265, - 258, - 235, - 228, - 242, - 252, - 280, - 235, - 241, - 235, - 288, - 227, - 250, - 235, - 265, - 262, - 270, - 255, - 256, - 255, - 249, - 264, - 227, - 253, - 246, - 263, - 231, - 255, - 215, - 257, - 242, - 250, - 246, - 239, - 243, - 241, - 222, - 234, - 266, - 234, - 247, - 231, - 227, - 268, - 275, - 250, - 269, - 256, - 244, - 264, - 248, - 250, - 237, - 278, - 246, - 230, - 264, - 244, - 247, - 227, - 229, - 271, - 272, - 221, - 276, - 272, - 250, - 260, - 231, - 238, - 270, - 228, - 246, - 270, - 253, - 261, - 264, - 219, - 247, - 244, - 236, - 243, - 234, - 265, - 249, - 254, - 248, - 248, - 234, - 269, - 232, - 266, - 269, - 254, - 224, - 257, - 250, - 246, - 240, - 260, - 252, - 252, - 284, - 263, - 253, - 228, - 252, - 237, - 248, - 250, - 251, - 273, - 262, - 233, - 273, - 273, - 278, - 282, - 247, - 284, - 271, - 277, - 281 - ] - }, - { - "counters": [ - 247, - 239, - 240, - 255, - 242, - 250, - 248, - 254, - 235, - 241, - 250, - 245, - 258, - 277, - 257, - 278, - 247, - 271, - 240, - 268, - 243, - 230, - 261, - 250, - 256, - 273, - 236, - 249, - 256, - 252, - 255, - 239, - 253, - 258, - 262, - 232, - 247, - 239, - 244, - 241, - 265, - 269, - 258, - 268, - 245, - 238, - 234, - 250, - 257, - 259, - 231, - 258, - 245, - 259, - 240, - 242, - 216, - 228, - 253, - 242, - 259, - 220, - 244, - 249, - 279, - 253, - 240, - 257, - 249, - 243, - 301, - 240, - 240, - 220, - 251, - 246, - 229, - 233, - 225, - 274, - 246, - 250, - 255, - 275, - 249, - 249, - 280, - 245, - 225, - 235, - 231, - 232, - 260, - 224, - 241, - 225, - 284, - 223, - 264, - 238, - 251, - 248, - 247, - 271, - 238, - 250, - 263, - 244, - 268, - 258, - 287, - 234, - 270, - 256, - 254, - 249, - 247, - 260, - 247, - 242, - 265, - 240, - 246, - 231, - 242, - 250, - 242, - 237, - 242, - 277, - 243, - 264, - 229, - 260, - 253, - 252, - 265, - 260, - 259, - 254, - 252, - 280, - 249, - 239, - 266, - 228, - 244, - 233, - 261, - 253, - 260, - 217, - 264, - 238, - 246, - 232, - 234, - 266, - 244, - 221, - 257, - 248, - 245, - 241, - 239, - 250, - 239, - 253, - 256, - 215, - 271, - 217, - 272, - 250, - 241, - 260, - 261, - 228, - 253, - 228, - 252, - 256, - 234, - 238, - 265, - 263, - 238, - 264, - 236, - 229, - 256, - 249, - 255, - 265, - 249, - 253, - 248, - 242, - 233, - 245, - 235, - 240, - 238, - 250, - 291, - 270, - 238, - 239, - 264, - 242, - 234, - 255, - 241, - 244, - 247, - 266, - 244, - 252, - 246, - 238, - 253, - 230, - 253, - 252, - 246, - 267, - 239, - 257, - 236, - 248, - 227, - 230, - 255, - 257, - 238, - 228, - 256, - 238, - 256, - 243, - 266, - 218, - 224, - 238, - 233, - 269, - 272, - 251, - 235, - 244, - 241, - 256, - 240, - 234, - 233, - 222, - 245, - 244, - 245, - 252, - 259, - 253, - 234, - 262, - 291, - 265, - 268, - 238, - 241, - 225, - 237, - 257, - 273, - 242, - 253, - 225, - 243, - 237, - 273, - 245, - 256, - 247, - 260, - 262, - 280, - 248, - 233, - 244, - 243, - 253, - 248, - 288, - 246, - 242, - 244, - 233, - 283, - 244, - 250, - 249, - 236, - 242, - 270, - 257, - 244, - 292, - 267, - 229, - 266, - 246, - 231, - 259, - 229, - 272, - 233, - 234, - 268, - 271, - 259, - 263, - 235, - 251, - 235, - 247, - 259, - 260, - 246, - 267, - 237, - 239, - 247, - 258, - 235, - 231, - 238, - 242, - 244, - 252, - 226, - 244, - 250, - 261, - 246, - 250, - 252, - 263, - 267, - 223, - 240, - 261, - 238, - 238, - 234, - 263, - 248, - 255, - 238, - 276, - 265, - 258, - 242, - 264, - 248, - 259, - 239, - 229, - 242, - 254, - 240, - 257, - 236, - 261, - 218, - 217, - 229, - 255, - 271, - 257, - 269, - 236, - 240, - 260, - 257, - 262, - 246, - 235, - 264, - 258, - 259, - 229, - 230, - 243, - 259, - 285, - 277, - 258, - 245, - 263, - 245, - 244, - 253, - 234, - 273, - 255, - 247, - 234, - 273, - 240, - 224, - 249, - 256, - 257, - 281, - 228, - 262, - 231, - 244, - 266, - 259, - 224, - 273, - 237, - 261, - 249, - 236, - 257, - 241, - 268, - 262, - 260, - 285, - 243, - 243, - 228, - 276, - 230, - 260, - 252, - 293, - 269, - 244, - 223, - 242, - 255, - 230, - 243, - 277, - 252, - 264, - 274, - 276, - 234, - 259, - 252, - 247, - 263, - 224, - 268, - 228, - 259, - 264, - 267, - 244, - 205, - 247, - 229, - 288, - 270, - 251, - 248, - 290, - 246, - 248, - 258, - 250, - 278, - 260, - 247, - 245, - 253, - 245, - 258, - 236, - 252, - 256, - 268, - 252, - 274, - 227, - 223, - 236, - 251, - 265, - 222, - 217, - 237, - 253, - 264, - 261, - 239, - 270, - 268, - 246, - 245, - 250, - 234, - 250, - 228, - 251, - 241, - 257, - 259, - 271, - 283, - 234, - 249, - 246, - 241, - 212, - 251, - 221, - 257, - 260, - 259, - 255, - 257, - 276, - 240, - 258, - 276, - 256, - 237, - 253, - 251, - 254, - 232, - 249, - 265, - 245, - 258, - 245, - 242, - 250, - 257, - 253, - 257, - 237, - 275, - 257, - 279, - 247, - 251, - 293, - 238, - 235, - 258, - 220, - 237, - 245, - 258, - 251, - 243, - 263, - 248, - 253, - 235, - 258, - 259, - 240, - 239, - 281, - 260, - 248, - 248, - 273, - 271, - 248, - 251, - 265, - 271, - 278, - 259, - 233, - 272, - 247, - 240, - 261, - 260, - 225, - 282, - 267, - 232, - 263, - 269, - 266, - 239, - 212, - 217, - 249, - 241, - 248, - 256, - 240, - 246, - 257, - 264, - 243, - 217, - 240, - 241, - 241, - 250, - 240, - 210, - 266, - 235, - 239, - 253, - 238, - 239, - 268, - 258, - 243, - 214, - 229, - 243, - 233, - 263, - 250, - 260, - 291, - 259, - 224, - 245, - 268, - 249, - 246, - 220, - 265, - 251, - 259, - 238, - 258, - 260, - 266, - 243, - 226, - 258, - 236, - 250, - 254, - 252, - 223, - 232, - 277, - 244, - 251, - 299, - 251, - 255, - 238, - 215, - 280, - 246, - 263, - 266, - 280, - 242, - 237, - 252, - 265, - 233, - 269, - 265, - 268, - 260, - 233, - 250, - 262, - 272, - 277, - 236, - 230, - 228, - 273, - 253, - 274, - 274, - 231, - 254, - 233, - 237, - 247, - 226, - 267, - 252, - 255, - 252, - 274, - 269, - 267, - 270, - 225, - 236, - 236, - 263, - 252, - 226, - 240, - 264, - 239, - 249, - 268, - 234, - 242, - 268, - 252, - 268, - 243, - 272, - 251, - 247, - 248, - 235, - 245, - 275, - 254, - 212, - 275, - 248, - 216, - 272, - 232, - 232, - 262, - 253, - 253, - 281, - 237, - 260, - 258, - 268, - 231, - 263, - 256, - 240, - 242, - 228, - 284, - 257, - 230, - 237, - 250, - 268, - 261, - 241, - 237, - 213, - 242, - 256, - 209, - 236, - 283, - 263, - 274, - 256, - 270, - 241, - 240, - 246, - 247, - 246, - 271, - 244, - 264, - 238, - 240, - 269, - 228, - 248, - 263, - 256, - 252, - 250, - 228, - 257, - 247, - 220, - 221, - 256, - 242, - 258, - 222, - 250, - 247, - 238, - 254, - 246, - 255, - 248, - 240, - 247, - 250, - 249, - 254, - 273, - 243, - 246, - 243, - 235, - 237, - 248, - 247, - 260, - 226, - 244, - 258, - 276, - 243, - 249, - 271, - 266, - 229, - 248, - 253, - 275, - 256, - 284, - 269, - 245, - 241, - 258, - 245, - 250, - 243, - 223, - 231, - 251, - 240, - 267, - 248, - 265, - 239, - 261, - 250, - 246, - 233, - 245, - 253, - 257, - 257, - 250, - 237, - 246, - 230, - 221, - 261, - 259, - 241, - 252, - 248, - 243, - 268, - 263, - 232, - 243, - 250, - 255, - 264, - 250, - 265, - 273, - 255, - 232, - 255, - 249, - 264, - 262, - 267, - 236, - 277, - 258, - 249, - 252, - 252, - 224, - 242, - 240, - 250, - 287, - 249, - 249, - 276, - 227, - 244, - 249, - 263, - 234, - 258, - 258, - 247, - 250, - 267, - 255, - 258, - 232, - 235, - 242, - 223, - 240, - 256, - 255, - 227, - 239, - 261, - 248, - 252, - 224, - 214, - 254, - 246, - 230, - 229, - 245, - 262, - 233, - 256, - 258, - 268, - 258, - 249, - 244, - 229, - 229, - 229, - 262, - 261, - 250, - 244, - 247, - 238, - 254, - 273, - 231, - 264, - 251, - 244, - 260, - 253, - 226, - 253, - 245, - 236, - 237, - 242, - 272, - 266, - 267, - 236, - 254, - 248, - 266, - 230, - 227, - 262, - 253, - 210, - 251, - 222, - 275, - 233, - 230, - 259, - 246, - 239, - 221, - 244, - 230, - 269, - 271, - 280, - 244, - 253, - 275, - 251, - 247, - 250, - 234, - 264, - 265, - 246, - 267, - 254, - 249, - 250, - 253, - 243, - 248, - 234, - 230, - 243, - 247, - 245, - 238, - 242, - 253, - 259, - 255, - 249, - 251, - 259, - 252, - 267, - 243, - 234, - 259, - 256, - 253, - 243, - 251, - 232, - 257, - 257, - 258, - 275, - 265, - 246, - 244, - 249, - 250, - 232, - 229, - 242, - 246, - 256, - 253, - 235, - 241, - 220, - 261, - 249, - 228, - 259, - 272, - 277, - 233, - 230, - 263, - 239, - 269, - 278, - 231, - 269, - 246, - 244, - 241, - 226, - 225, - 241, - 244, - 237, - 259, - 288, - 251, - 241, - 236, - 255, - 256, - 234, - 247, - 279, - 254, - 261, - 245, - 254, - 236, - 268, - 236, - 235, - 256, - 257, - 260, - 238, - 263, - 256, - 260, - 229, - 243, - 244, - 247, - 216, - 248, - 273, - 235, - 248, - 225, - 252, - 261, - 258, - 240, - 251, - 260, - 275, - 253, - 259, - 257, - 240, - 269, - 258, - 252, - 260, - 252, - 254, - 225, - 250, - 238, - 229, - 250, - 263, - 254, - 247, - 247, - 259, - 250, - 270, - 253, - 252, - 261, - 247, - 274, - 259, - 266, - 247, - 254, - 239, - 242, - 253, - 252, - 247, - 261, - 274, - 243, - 282, - 230, - 243, - 262, - 254, - 231, - 257, - 268, - 258, - 234, - 207, - 263, - 261, - 243, - 245, - 259, - 241, - 240, - 226, - 241, - 232, - 240, - 252, - 254, - 233, - 232, - 261, - 270, - 242, - 245, - 234, - 255, - 238, - 268, - 244, - 241, - 261, - 244, - 261, - 249, - 235, - 261, - 245, - 261, - 266, - 245, - 237, - 286, - 255, - 246, - 265, - 260, - 248, - 248, - 266, - 238, - 238, - 238, - 254, - 244, - 268, - 247, - 239, - 234, - 265, - 249, - 245, - 252, - 249, - 227, - 249, - 233, - 203, - 249, - 203, - 256, - 232, - 258, - 245, - 250, - 231, - 252, - 243, - 246, - 254, - 239, - 253, - 221, - 236, - 243, - 255, - 244, - 223, - 230, - 243, - 276, - 277, - 256, - 262, - 264, - 221, - 242, - 267, - 248, - 258, - 249, - 229, - 260, - 244, - 222, - 244, - 232, - 264, - 250, - 253, - 266, - 247, - 251, - 269, - 248, - 254, - 233, - 245, - 270, - 271, - 246, - 253, - 256, - 260, - 252, - 232, - 270, - 264, - 222, - 266, - 238, - 222, - 239, - 255, - 241, - 243, - 277, - 263, - 247, - 211, - 265, - 227, - 250, - 248, - 257, - 224, - 244, - 261, - 277, - 277, - 244, - 258, - 250, - 245, - 247, - 247, - 213, - 258, - 266, - 247, - 250, - 256, - 239, - 254, - 256, - 247, - 273, - 245, - 259, - 242, - 274, - 236, - 235, - 243, - 232, - 260, - 230, - 231, - 255, - 255, - 278, - 243, - 250, - 269, - 246, - 246, - 264, - 233, - 231, - 270, - 237, - 266, - 241, - 232, - 264, - 247, - 241, - 254, - 265, - 246, - 257, - 275, - 258, - 260, - 248, - 266, - 275, - 243, - 212, - 261, - 257, - 260, - 270, - 265, - 246, - 251, - 281, - 267, - 262, - 233, - 268, - 272, - 230, - 255, - 235, - 258, - 243, - 256, - 252, - 265, - 270, - 257, - 283, - 262, - 209, - 267, - 248, - 255, - 273, - 263, - 254, - 289, - 252, - 288, - 248, - 242, - 271, - 239, - 243, - 228, - 246, - 266, - 265, - 252, - 272, - 242, - 290, - 237, - 240, - 256, - 272, - 261, - 249, - 264, - 263, - 248, - 256, - 253, - 239, - 245, - 211, - 240, - 256, - 247, - 248, - 245, - 246, - 232, - 252, - 245, - 248, - 235, - 229, - 242, - 241, - 249, - 273, - 252, - 261, - 262, - 257, - 272, - 248, - 269, - 232, - 261, - 223, - 287, - 247, - 262, - 261, - 245, - 229, - 243, - 254, - 237, - 243, - 236, - 241, - 267, - 254, - 255, - 225, - 263, - 269, - 256, - 245, - 237, - 233, - 234, - 282, - 257, - 274, - 245, - 256, - 247, - 231, - 257, - 234, - 240, - 237, - 248, - 277, - 245, - 220, - 265, - 278, - 238, - 268, - 272, - 221, - 264, - 268, - 209, - 236, - 270, - 245, - 279, - 259, - 263, - 241, - 260, - 242, - 256, - 277, - 246, - 242, - 243, - 259, - 238, - 237, - 231, - 261, - 243, - 251, - 253, - 247, - 218, - 254, - 262, - 231, - 243, - 274, - 262, - 233, - 248, - 227, - 267, - 269, - 257, - 243, - 259, - 247, - 224, - 265, - 230, - 245, - 254, - 249, - 233, - 247, - 249, - 252, - 229, - 233, - 272, - 231, - 261, - 232, - 246, - 228, - 251, - 267, - 232, - 223, - 233, - 234, - 280, - 255, - 239, - 244, - 258, - 275, - 277, - 267, - 233, - 259, - 228, - 249, - 244, - 239, - 231, - 261, - 257, - 234, - 261, - 260, - 243, - 220, - 263, - 245, - 236, - 256, - 255, - 248, - 266, - 240, - 256, - 254, - 245, - 273, - 282, - 250, - 252, - 262, - 242, - 261, - 272, - 242, - 241, - 243, - 252, - 282, - 246, - 234, - 252, - 265, - 226, - 239, - 266, - 251, - 249, - 264, - 253, - 249, - 255, - 266, - 260, - 233, - 256, - 256, - 251, - 272, - 222, - 241, - 238, - 242, - 246, - 237, - 274, - 235, - 247, - 245, - 235, - 263, - 270, - 238, - 257, - 268, - 251, - 270, - 255, - 244, - 234, - 261, - 226, - 257, - 263, - 258, - 256, - 238, - 258, - 282, - 259, - 244, - 220, - 233, - 230, - 247, - 258, - 250, - 233, - 250, - 270, - 253, - 265, - 268, - 256, - 260, - 269, - 274, - 266, - 259, - 271, - 240, - 251, - 256, - 264, - 264, - 255, - 271, - 244, - 239, - 239, - 238, - 265, - 257, - 218, - 236, - 244, - 254, - 253, - 260, - 242, - 222, - 254, - 246, - 237, - 250, - 228, - 236, - 261, - 249, - 264, - 279, - 268, - 264, - 253, - 249, - 262, - 228, - 258, - 257, - 265, - 231, - 278, - 234, - 244, - 246, - 263, - 260, - 256, - 241, - 247, - 233, - 274, - 227, - 239, - 227, - 237, - 246, - 221, - 268, - 262, - 261, - 236, - 275, - 259, - 251, - 254, - 244, - 258, - 273, - 267, - 236, - 257, - 233, - 251, - 258, - 281, - 261, - 244, - 247, - 256, - 265, - 236, - 247, - 259, - 221, - 242, - 248, - 249, - 268, - 268, - 241, - 266, - 276, - 272, - 222, - 236, - 267, - 265, - 254, - 264, - 242, - 233, - 272, - 259, - 254, - 229, - 242, - 279, - 271, - 245, - 239, - 240, - 259, - 230, - 249, - 252, - 228, - 270, - 260, - 242, - 279, - 251, - 272, - 239, - 240, - 247, - 223, - 281, - 258, - 250, - 257, - 275, - 238, - 281, - 239, - 271, - 273, - 255, - 255, - 260, - 270, - 273, - 290, - 268, - 263, - 264, - 249, - 281, - 265, - 265, - 240, - 269, - 248, - 243, - 225, - 238, - 242, - 234, - 267, - 269, - 221, - 257, - 249, - 230, - 249, - 256, - 258, - 256, - 268, - 239, - 234, - 261, - 248, - 263, - 264, - 272, - 256, - 240, - 253, - 254, - 262, - 232, - 258, - 268, - 248, - 273, - 232, - 240, - 244, - 230, - 238, - 239, - 233, - 255, - 230, - 246, - 268, - 258, - 261, - 252, - 244, - 254, - 251, - 232, - 243, - 215, - 275, - 241, - 227, - 241, - 235, - 288, - 258, - 247, - 247, - 231, - 226, - 264, - 245, - 248, - 247, - 238, - 265, - 238, - 259, - 247, - 265, - 265, - 238, - 271, - 253, - 247, - 253, - 240, - 237, - 245, - 260, - 257, - 223, - 222, - 277, - 244, - 250, - 251, - 231, - 255, - 233, - 247, - 232, - 263, - 230, - 255, - 224, - 251, - 246, - 234, - 248, - 248, - 255, - 261, - 240, - 244, - 263, - 234, - 252, - 242, - 243, - 265, - 244, - 233, - 256, - 243, - 238, - 228, - 258, - 264, - 242, - 246, - 240, - 246, - 237, - 236, - 218, - 274, - 256, - 250, - 256, - 273, - 241, - 260, - 225, - 245, - 232, - 214, - 233, - 271, - 261, - 228, - 260, - 264, - 252, - 262, - 252, - 267, - 257, - 256, - 255, - 255, - 274, - 265, - 243, - 244, - 236, - 238, - 265, - 253, - 228, - 229, - 251, - 236, - 289, - 252, - 262, - 227, - 287, - 227, - 243, - 233, - 231, - 233, - 222, - 228, - 249, - 252, - 259, - 217, - 249, - 268, - 223, - 251, - 256, - 245, - 222, - 241, - 248, - 262, - 255, - 265, - 240, - 253, - 226, - 270, - 256, - 263, - 257, - 246, - 243, - 253, - 236, - 255, - 276, - 224, - 245, - 249, - 254, - 258, - 255, - 259, - 273, - 261, - 263, - 254, - 244, - 244, - 226, - 251, - 277 - ] - }, - { - "counters": [ - 246, - 249, - 224, - 259, - 250, - 255, - 262, - 260, - 250, - 234, - 268, - 239, - 269, - 217, - 247, - 263, - 274, - 270, - 235, - 234, - 230, - 260, - 242, - 233, - 244, - 253, - 252, - 248, - 277, - 256, - 251, - 242, - 255, - 251, - 269, - 262, - 252, - 255, - 265, - 236, - 247, - 257, - 242, - 237, - 249, - 217, - 277, - 257, - 269, - 235, - 248, - 257, - 232, - 244, - 251, - 245, - 215, - 247, - 259, - 260, - 250, - 263, - 234, - 241, - 240, - 267, - 239, - 258, - 264, - 267, - 239, - 233, - 278, - 233, - 269, - 272, - 224, - 246, - 217, - 267, - 247, - 232, - 268, - 246, - 259, - 228, - 262, - 245, - 212, - 236, - 256, - 260, - 239, - 254, - 230, - 272, - 269, - 266, - 261, - 256, - 250, - 256, - 240, - 239, - 243, - 272, - 237, - 255, - 248, - 267, - 247, - 246, - 238, - 250, - 252, - 264, - 246, - 250, - 245, - 260, - 251, - 264, - 229, - 223, - 238, - 231, - 242, - 276, - 258, - 239, - 270, - 238, - 243, - 234, - 257, - 247, - 239, - 263, - 229, - 264, - 238, - 242, - 261, - 286, - 297, - 244, - 254, - 232, - 226, - 286, - 254, - 258, - 234, - 241, - 269, - 262, - 263, - 241, - 236, - 250, - 237, - 273, - 263, - 235, - 240, - 258, - 244, - 275, - 273, - 248, - 246, - 245, - 295, - 274, - 260, - 237, - 241, - 270, - 253, - 252, - 238, - 255, - 256, - 236, - 263, - 253, - 276, - 285, - 233, - 251, - 262, - 234, - 260, - 250, - 229, - 241, - 255, - 248, - 279, - 243, - 258, - 245, - 248, - 253, - 248, - 251, - 260, - 251, - 225, - 274, - 239, - 246, - 229, - 262, - 251, - 209, - 276, - 272, - 245, - 239, - 272, - 232, - 227, - 261, - 247, - 265, - 244, - 263, - 276, - 223, - 262, - 266, - 227, - 243, - 224, - 262, - 267, - 252, - 244, - 252, - 232, - 245, - 262, - 257, - 241, - 254, - 244, - 259, - 223, - 242, - 266, - 224, - 258, - 248, - 271, - 273, - 256, - 239, - 256, - 235, - 221, - 250, - 262, - 257, - 277, - 266, - 221, - 232, - 248, - 250, - 247, - 238, - 237, - 234, - 262, - 243, - 232, - 250, - 255, - 263, - 242, - 242, - 239, - 240, - 244, - 242, - 261, - 257, - 244, - 255, - 251, - 217, - 265, - 269, - 254, - 240, - 235, - 235, - 273, - 243, - 243, - 252, - 251, - 258, - 234, - 235, - 242, - 269, - 245, - 226, - 268, - 262, - 255, - 244, - 282, - 231, - 281, - 247, - 246, - 211, - 266, - 229, - 279, - 224, - 264, - 246, - 257, - 241, - 258, - 256, - 251, - 269, - 235, - 249, - 249, - 250, - 270, - 241, - 254, - 258, - 223, - 254, - 252, - 224, - 235, - 228, - 244, - 262, - 266, - 257, - 255, - 229, - 218, - 258, - 249, - 245, - 258, - 231, - 278, - 271, - 236, - 226, - 231, - 249, - 251, - 242, - 272, - 253, - 257, - 238, - 246, - 231, - 225, - 256, - 266, - 284, - 259, - 268, - 259, - 245, - 227, - 286, - 240, - 241, - 258, - 252, - 260, - 233, - 256, - 298, - 223, - 250, - 249, - 247, - 265, - 255, - 246, - 258, - 252, - 239, - 235, - 275, - 251, - 263, - 262, - 232, - 251, - 227, - 204, - 235, - 225, - 239, - 285, - 228, - 237, - 253, - 242, - 242, - 237, - 252, - 250, - 229, - 263, - 263, - 283, - 265, - 258, - 270, - 239, - 273, - 269, - 263, - 254, - 253, - 254, - 263, - 256, - 274, - 243, - 259, - 241, - 263, - 251, - 230, - 257, - 212, - 271, - 251, - 233, - 264, - 258, - 269, - 254, - 259, - 256, - 257, - 244, - 222, - 252, - 258, - 268, - 275, - 268, - 253, - 251, - 271, - 254, - 250, - 263, - 240, - 271, - 246, - 267, - 250, - 254, - 228, - 248, - 252, - 236, - 261, - 230, - 251, - 230, - 235, - 241, - 282, - 235, - 274, - 249, - 268, - 243, - 243, - 240, - 239, - 245, - 255, - 253, - 262, - 246, - 262, - 275, - 250, - 252, - 261, - 228, - 262, - 220, - 245, - 235, - 259, - 271, - 244, - 271, - 235, - 241, - 242, - 242, - 255, - 223, - 261, - 247, - 258, - 240, - 243, - 250, - 267, - 264, - 232, - 257, - 253, - 243, - 231, - 264, - 269, - 257, - 261, - 226, - 266, - 248, - 259, - 251, - 260, - 219, - 263, - 243, - 257, - 257, - 234, - 259, - 244, - 254, - 250, - 244, - 231, - 261, - 226, - 245, - 255, - 242, - 250, - 265, - 242, - 240, - 224, - 248, - 259, - 223, - 250, - 260, - 255, - 256, - 275, - 236, - 224, - 288, - 251, - 233, - 251, - 234, - 243, - 241, - 243, - 270, - 229, - 262, - 242, - 234, - 240, - 255, - 231, - 247, - 257, - 221, - 253, - 240, - 239, - 244, - 254, - 258, - 261, - 250, - 222, - 237, - 230, - 258, - 225, - 243, - 259, - 233, - 239, - 248, - 240, - 223, - 240, - 238, - 241, - 261, - 234, - 241, - 264, - 248, - 241, - 240, - 245, - 249, - 250, - 242, - 235, - 283, - 242, - 258, - 270, - 258, - 277, - 234, - 244, - 244, - 228, - 252, - 239, - 262, - 284, - 232, - 243, - 222, - 273, - 265, - 248, - 251, - 275, - 257, - 238, - 230, - 243, - 281, - 275, - 262, - 255, - 275, - 228, - 253, - 266, - 261, - 229, - 267, - 279, - 237, - 232, - 283, - 279, - 258, - 259, - 251, - 273, - 225, - 245, - 253, - 238, - 229, - 223, - 257, - 284, - 242, - 256, - 245, - 232, - 251, - 251, - 242, - 221, - 234, - 258, - 260, - 242, - 216, - 270, - 261, - 244, - 250, - 269, - 251, - 258, - 245, - 256, - 230, - 273, - 267, - 226, - 242, - 288, - 267, - 240, - 263, - 256, - 221, - 248, - 282, - 245, - 261, - 270, - 257, - 258, - 248, - 224, - 273, - 256, - 252, - 228, - 257, - 232, - 251, - 248, - 235, - 244, - 289, - 250, - 241, - 262, - 265, - 257, - 256, - 219, - 248, - 252, - 247, - 244, - 237, - 258, - 254, - 240, - 233, - 252, - 244, - 228, - 264, - 258, - 267, - 248, - 239, - 238, - 274, - 256, - 267, - 240, - 247, - 260, - 242, - 257, - 236, - 270, - 260, - 245, - 293, - 238, - 237, - 230, - 267, - 241, - 245, - 265, - 242, - 235, - 226, - 269, - 268, - 257, - 214, - 284, - 297, - 238, - 241, - 254, - 246, - 252, - 277, - 260, - 260, - 235, - 237, - 237, - 243, - 256, - 236, - 246, - 250, - 239, - 251, - 270, - 259, - 236, - 231, - 229, - 253, - 240, - 246, - 253, - 256, - 255, - 239, - 244, - 242, - 257, - 253, - 260, - 272, - 270, - 246, - 236, - 239, - 253, - 240, - 267, - 233, - 243, - 260, - 257, - 253, - 262, - 284, - 251, - 231, - 251, - 263, - 253, - 270, - 235, - 255, - 265, - 248, - 233, - 278, - 285, - 218, - 244, - 242, - 245, - 257, - 269, - 237, - 260, - 256, - 246, - 246, - 262, - 231, - 257, - 234, - 240, - 285, - 245, - 229, - 246, - 218, - 251, - 278, - 245, - 251, - 233, - 278, - 234, - 263, - 238, - 236, - 249, - 244, - 255, - 263, - 270, - 245, - 257, - 250, - 275, - 255, - 274, - 274, - 233, - 251, - 206, - 235, - 239, - 257, - 231, - 246, - 257, - 257, - 252, - 238, - 255, - 233, - 237, - 260, - 266, - 246, - 278, - 240, - 262, - 281, - 252, - 219, - 256, - 255, - 236, - 276, - 231, - 264, - 236, - 252, - 253, - 241, - 260, - 265, - 257, - 257, - 222, - 259, - 261, - 232, - 277, - 270, - 230, - 238, - 240, - 251, - 253, - 231, - 224, - 232, - 225, - 251, - 254, - 252, - 250, - 257, - 269, - 259, - 244, - 232, - 255, - 244, - 234, - 266, - 258, - 240, - 261, - 244, - 262, - 229, - 251, - 250, - 239, - 264, - 233, - 254, - 262, - 261, - 256, - 248, - 274, - 233, - 221, - 245, - 253, - 225, - 249, - 252, - 270, - 265, - 247, - 285, - 234, - 247, - 246, - 244, - 261, - 250, - 239, - 266, - 240, - 213, - 267, - 257, - 267, - 245, - 270, - 290, - 247, - 240, - 265, - 283, - 256, - 228, - 282, - 234, - 266, - 253, - 249, - 255, - 248, - 262, - 278, - 237, - 252, - 240, - 235, - 244, - 232, - 254, - 270, - 256, - 245, - 219, - 251, - 253, - 253, - 243, - 261, - 248, - 241, - 243, - 234, - 247, - 258, - 259, - 264, - 250, - 263, - 254, - 231, - 250, - 234, - 235, - 248, - 261, - 235, - 248, - 253, - 234, - 240, - 252, - 237, - 253, - 251, - 266, - 279, - 277, - 231, - 239, - 257, - 251, - 247, - 271, - 253, - 252, - 244, - 237, - 218, - 270, - 263, - 264, - 239, - 240, - 270, - 280, - 242, - 239, - 261, - 281, - 243, - 247, - 249, - 220, - 226, - 254, - 232, - 237, - 246, - 252, - 231, - 231, - 220, - 261, - 229, - 272, - 249, - 268, - 243, - 265, - 258, - 251, - 263, - 247, - 251, - 260, - 244, - 235, - 248, - 262, - 264, - 255, - 236, - 248, - 239, - 245, - 249, - 234, - 257, - 248, - 263, - 267, - 286, - 233, - 227, - 254, - 235, - 238, - 262, - 241, - 260, - 263, - 251, - 245, - 226, - 279, - 259, - 276, - 232, - 243, - 255, - 261, - 236, - 245, - 278, - 253, - 271, - 262, - 259, - 233, - 256, - 264, - 232, - 250, - 266, - 243, - 261, - 247, - 250, - 240, - 234, - 266, - 241, - 263, - 257, - 260, - 247, - 260, - 265, - 272, - 268, - 228, - 241, - 267, - 243, - 283, - 209, - 238, - 266, - 238, - 220, - 257, - 267, - 270, - 225, - 257, - 263, - 255, - 279, - 274, - 224, - 245, - 244, - 226, - 246, - 267, - 260, - 267, - 231, - 246, - 258, - 246, - 256, - 252, - 220, - 244, - 256, - 259, - 205, - 244, - 287, - 249, - 268, - 255, - 242, - 271, - 246, - 231, - 241, - 250, - 241, - 251, - 235, - 255, - 244, - 249, - 273, - 235, - 258, - 265, - 278, - 248, - 266, - 236, - 261, - 253, - 225, - 243, - 249, - 262, - 243, - 233, - 246, - 250, - 264, - 262, - 248, - 243, - 231, - 259, - 223, - 265, - 240, - 244, - 246, - 259, - 231, - 264, - 225, - 257, - 255, - 270, - 246, - 265, - 260, - 250, - 250, - 220, - 256, - 267, - 251, - 218, - 219, - 244, - 267, - 234, - 230, - 252, - 221, - 254, - 249, - 222, - 272, - 243, - 222, - 255, - 242, - 254, - 253, - 265, - 236, - 283, - 245, - 239, - 217, - 273, - 256, - 256, - 260, - 240, - 254, - 236, - 236, - 266, - 247, - 231, - 258, - 239, - 247, - 232, - 252, - 252, - 250, - 289, - 257, - 218, - 237, - 252, - 243, - 241, - 318, - 252, - 260, - 227, - 237, - 246, - 279, - 252, - 241, - 246, - 243, - 226, - 286, - 280, - 260, - 255, - 235, - 239, - 235, - 253, - 235, - 249, - 226, - 233, - 257, - 243, - 230, - 275, - 236, - 253, - 246, - 248, - 256, - 254, - 223, - 233, - 256, - 227, - 243, - 250, - 257, - 283, - 255, - 225, - 287, - 244, - 256, - 245, - 271, - 251, - 264, - 259, - 234, - 238, - 238, - 238, - 228, - 252, - 255, - 258, - 278, - 272, - 226, - 220, - 245, - 237, - 262, - 270, - 249, - 229, - 253, - 251, - 247, - 250, - 222, - 268, - 216, - 251, - 254, - 243, - 233, - 255, - 245, - 248, - 232, - 263, - 241, - 222, - 235, - 230, - 242, - 252, - 243, - 247, - 242, - 252, - 228, - 265, - 268, - 273, - 237, - 257, - 244, - 238, - 251, - 244, - 235, - 253, - 263, - 254, - 251, - 252, - 262, - 250, - 248, - 242, - 249, - 244, - 280, - 257, - 229, - 262, - 237, - 289, - 262, - 227, - 239, - 273, - 237, - 226, - 240, - 249, - 264, - 239, - 215, - 258, - 244, - 269, - 230, - 261, - 265, - 268, - 255, - 241, - 249, - 273, - 245, - 243, - 263, - 239, - 213, - 239, - 259, - 214, - 240, - 250, - 257, - 211, - 259, - 249, - 256, - 250, - 246, - 253, - 251, - 241, - 260, - 226, - 288, - 252, - 254, - 235, - 248, - 231, - 246, - 256, - 246, - 280, - 242, - 242, - 277, - 248, - 244, - 259, - 248, - 244, - 238, - 234, - 256, - 261, - 248, - 235, - 231, - 250, - 249, - 243, - 249, - 243, - 237, - 233, - 214, - 235, - 252, - 246, - 259, - 272, - 275, - 268, - 258, - 245, - 249, - 266, - 281, - 266, - 257, - 244, - 260, - 257, - 244, - 266, - 248, - 272, - 278, - 232, - 215, - 229, - 260, - 284, - 234, - 269, - 262, - 254, - 256, - 260, - 279, - 247, - 237, - 232, - 264, - 254, - 255, - 252, - 255, - 259, - 246, - 252, - 256, - 223, - 257, - 251, - 262, - 266, - 278, - 231, - 250, - 270, - 262, - 235, - 257, - 258, - 253, - 236, - 243, - 277, - 261, - 247, - 258, - 243, - 245, - 243, - 211, - 272, - 258, - 238, - 276, - 251, - 284, - 265, - 252, - 289, - 264, - 263, - 246, - 249, - 258, - 270, - 275, - 249, - 239, - 225, - 232, - 231, - 247, - 240, - 218, - 258, - 292, - 248, - 269, - 273, - 264, - 268, - 247, - 232, - 262, - 232, - 252, - 228, - 260, - 237, - 234, - 240, - 223, - 273, - 244, - 267, - 232, - 272, - 245, - 261, - 271, - 250, - 223, - 238, - 222, - 242, - 226, - 247, - 234, - 219, - 229, - 240, - 255, - 245, - 268, - 256, - 247, - 280, - 257, - 259, - 234, - 259, - 254, - 272, - 243, - 234, - 257, - 242, - 257, - 247, - 270, - 279, - 233, - 243, - 248, - 228, - 252, - 260, - 213, - 255, - 255, - 261, - 236, - 251, - 243, - 243, - 257, - 246, - 244, - 231, - 272, - 237, - 247, - 250, - 234, - 269, - 248, - 252, - 243, - 244, - 254, - 248, - 247, - 253, - 265, - 247, - 239, - 228, - 274, - 245, - 225, - 237, - 243, - 269, - 236, - 221, - 263, - 270, - 234, - 284, - 235, - 257, - 269, - 247, - 227, - 240, - 244, - 232, - 247, - 217, - 227, - 255, - 278, - 275, - 229, - 268, - 271, - 265, - 289, - 236, - 228, - 258, - 286, - 239, - 242, - 240, - 218, - 261, - 238, - 219, - 249, - 278, - 246, - 223, - 246, - 258, - 262, - 242, - 262, - 250, - 240, - 242, - 258, - 237, - 267, - 230, - 269, - 269, - 249, - 242, - 262, - 246, - 238, - 235, - 251, - 250, - 234, - 255, - 240, - 259, - 254, - 225, - 255, - 268, - 242, - 284, - 219, - 253, - 256, - 267, - 257, - 240, - 250, - 256, - 274, - 241, - 262, - 265, - 251, - 252, - 262, - 220, - 254, - 250, - 238, - 224, - 224, - 233, - 266, - 232, - 253, - 234, - 259, - 283, - 249, - 235, - 259, - 232, - 256, - 256, - 259, - 226, - 238, - 279, - 258, - 258, - 218, - 259, - 275, - 231, - 254, - 274, - 250, - 259, - 249, - 237, - 279, - 259, - 258, - 249, - 245, - 229, - 226, - 244, - 281, - 240, - 249, - 241, - 273, - 254, - 243, - 248, - 247, - 239, - 250, - 252, - 255, - 249, - 258, - 276, - 285, - 258, - 238, - 234, - 259, - 279, - 235, - 259, - 261, - 269, - 250, - 213, - 232, - 266, - 236, - 280, - 235, - 259, - 243, - 221, - 240, - 233, - 251, - 243, - 279, - 235, - 270, - 272, - 222, - 223, - 249, - 257, - 214, - 237, - 246, - 263, - 274, - 230, - 223, - 260, - 243, - 257, - 257, - 241, - 250, - 240, - 249, - 273, - 245, - 261, - 229, - 211, - 245, - 268, - 237, - 231, - 269, - 214, - 265, - 240, - 262, - 233, - 249, - 258, - 253, - 250, - 276, - 263, - 242, - 251, - 222, - 250, - 263, - 265, - 248, - 244, - 269, - 247, - 259, - 242, - 240, - 257, - 257, - 255, - 213, - 261, - 243, - 249, - 246, - 267, - 240, - 248, - 280, - 235, - 249, - 269, - 294, - 246, - 291, - 248, - 255, - 250, - 245, - 249, - 249, - 272, - 252, - 244, - 243, - 289, - 245, - 267, - 251, - 253, - 240, - 224, - 209, - 265, - 283, - 229, - 248, - 267, - 225, - 259, - 209, - 237, - 255, - 244, - 236, - 242, - 266, - 268, - 273, - 242, - 242, - 236, - 249, - 252, - 280, - 255, - 255, - 263, - 244, - 220, - 269, - 256, - 223, - 259, - 228, - 244, - 236, - 245, - 244, - 243, - 243, - 266, - 252, - 243, - 228, - 241, - 235, - 224, - 271, - 261, - 262, - 269, - 224, - 275, - 248, - 283, - 243, - 246, - 271, - 242, - 262, - 257, - 236, - 248, - 280, - 260, - 246 - ] - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 18184834, - "last_update_version": 413254473648177153, - "correlation": 0.00084 - }, - "province_id": { - "histogram": { - "ndv": 7, - "buckets": [ - { - "count": 36855, - "lower_bound": "Mg==", - "upper_bound": "Mg==", - "repeats": 36720 - }, - { - "count": 106131, - "lower_bound": "NA==", - "upper_bound": "NA==", - "repeats": 69020 - }, - { - "count": 204584, - "lower_bound": "Ng==", - "upper_bound": "Ng==", - "repeats": 98090 - }, - { - "count": 342281, - "lower_bound": "OA==", - "upper_bound": "OA==", - "repeats": 137190 - }, - { - "count": 511887, - "lower_bound": "MTA=", - "upper_bound": "MTA=", - "repeats": 168980 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 170313, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170313, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170313, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170313, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - }, - { - "counters": [ - 0, - 0, - 0, - 0, - 0, - 0, - 68398, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 33997, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 170313, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 136282, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 102895, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - ] - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 1023775, - "last_update_version": 413254473661284356, - "correlation": 0.277998 - } - }, - "indices": { - "primary": { - "histogram": { - "ndv": 511887, - "buckets": [ - { - "count": 2048, - "lower_bound": "ATAwMDAzNTRm/2MxNmY0MDVh/2IzMGE2Yjcy/2M3MjJmMTJk/wAAAAAAAAAA9w==", - "upper_bound": "ATAxMGQzN2Jj/zc1OWE0NTdk/2EwZjM1OTdj/zk3YmYwYWFh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 4096, - "lower_bound": "ATAxMGRiNzhl/zgyNmQ0ODkz/2FkMjBkZjJk/zc1NjI0NTY1/wAAAAAAAAAA9w==", - "upper_bound": "ATAyMWNiMjUz/zAzZGM0ODhm/2ExYzNkMmIz/zM5NWJjMzgy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 6144, - "lower_bound": "ATAyMWNjYTRj/zRkNzk0M2E4/zljOTI1YzZk/2I3ZTQxNjZj/wAAAAAAAAAA9w==", - "upper_bound": "ATAzMjJlZDdh/2M1MDA0NDQz/2I3MzMwYmJm/2Y3YmEyOWI0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 8192, - "lower_bound": "ATAzMjMwMGMz/zU4M2Q0Nzhl/2FkY2YzMGE4/2JkNThiMTFk/wAAAAAAAAAA9w==", - "upper_bound": "ATA0MjlkZTc4/2M0MTE0OWJi/zgzNWU3Mzdm/zFjODJhNDg5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 10240, - "lower_bound": "ATA0MjllMjVm/zY1OWU0YmNm/zkzZWM4MWE4/zQ4NDY4M2M2/wAAAAAAAAAA9w==", - "upper_bound": "ATA1Mjk5YTdi/2YzZWQ0NDM2/2EwMGMwNGI2/zBmMGVmMjVk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 12288, - "lower_bound": "ATA1MjlhMDU2/2VmNTc0M2Jl/2EwZDczMmU2/2E4ZWQ1MWY0/wAAAAAAAAAA9w==", - "upper_bound": "ATA2MzczMzVh/2UyMjI0ZjQ1/zkyZDk1NmZl/zM4NWU0MzQ1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 14336, - "lower_bound": "ATA2Mzc0MzRk/2E3Mzg0MWVm/2I1ZWRmYmVl/zQyMWY0ZWQ4/wAAAAAAAAAA9w==", - "upper_bound": "ATA3M2RmNTJi/zZhYjQ0ZTg0/zk5ODQxMGMx/zAxZmNkZGJl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 16384, - "lower_bound": "ATA3M2UwMGY3/zRlYTM0ZmJk/2IwZWJiMDM5/2EzNTI4MGE1/wAAAAAAAAAA9w==", - "upper_bound": "ATA4NDE1MzRj/zRiMmI0MDE1/2JjZTA5MTIy/zBiYzQ1NGQx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 18432, - "lower_bound": "ATA4NDE4ZjQz/zk4MmQ0Yzcy/2JmNmM0OTli/2IyYjQ1MmQ2/wAAAAAAAAAA9w==", - "upper_bound": "ATA5NDlkNDMw/zQ3Mjk0YmZi/zg0OTQzNWIy/2M5ZGQ0NzVm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 20480, - "lower_bound": "ATA5NGExZWQy/zUxNzA0YmVk/zhkZTcwNjM3/2UzNDdkMWY0/wAAAAAAAAAA9w==", - "upper_bound": "ATBhNTIxY2Ni/zZhMTI0M2Y1/zg2ZGVkNDYz/zNkNWI5MGMx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 22528, - "lower_bound": "ATBhNTIyNjgw/2RlOTQ0Yzk2/2I5MzA5Nzcz/zBkOGQxNDY2/wAAAAAAAAAA9w==", - "upper_bound": "ATBiNTZjNjM5/zhiNDQ0MGE1/2FmMjI0ZjZi/zRkYzdjOWU5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 24576, - "lower_bound": "ATBiNTZjYmQ1/zhkZTk0M2Vj/2I2ZjQyYjdh/2UxYzQ3NjM3/wAAAAAAAAAA9w==", - "upper_bound": "ATBjNWY4MWUw/zkxODk0Zjcz/zgzOTFmYWNi/zI5ZTQ2NDEx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 26624, - "lower_bound": "ATBjNWZhNWFm/2Q3ZmY0Zjkz/2IzZGY2M2U3/zkwNmE1YTE3/wAAAAAAAAAA9w==", - "upper_bound": "ATBkNjRlYjM2/zJlOTM0MGU2/zhiNTVmZWE0/2FlZDMyZmMx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 28672, - "lower_bound": "ATBkNjRmMjlk/zljNzA0MTMw/zhkNTFiMGY1/2MwYmUyNjg2/wAAAAAAAAAA9w==", - "upper_bound": "ATBlNjk3ODRh/zQ3MTY0ZGM4/2E4YjMzMGEx/zA5Y2U0MDJk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 30720, - "lower_bound": "ATBlNjk4MDc3/zc1NTc0NTc1/zljZTc5Y2U1/zdhMzYwNGJl/wAAAAAAAAAA9w==", - "upper_bound": "ATBmNzFlOTNm/2FlMzI0YzE2/2I1Y2FmYTRm/zQ5ZTY2MWMy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 32768, - "lower_bound": "ATBmNzIwNjUy/2IyZjE0OTA4/2I0OGE1YWI0/zQ0Mzc2NWU2/wAAAAAAAAAA9w==", - "upper_bound": "ATEwNzM5NjY2/zY3NWU0MzNl/2JjZDQ0MDVi/2I2NTc1Njdm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 34816, - "lower_bound": "ATEwNzNhYmVi/2EzMWE0Yjk5/zg1Y2Q0ZDJk/zBkOTNhNDc3/wAAAAAAAAAA9w==", - "upper_bound": "ATExNzMxNDBm/zE4Y2E0NjA5/2I2MmExOTk2/zY4MDUzODIz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 36864, - "lower_bound": "ATExNzMxZjhj/2EyOWU0ZjM5/zkxZGM3MmRm/zg4OTdkOTBl/wAAAAAAAAAA9w==", - "upper_bound": "ATEyN2E0MmZi/zM5NDM0NjAx/2EzYzgwODQ0/2FjNzE4MWYw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 38912, - "lower_bound": "ATEyN2E1YzZj/zc4NmM0ZjIy/zgxMmNhYzkz/zA4NTEwMDFl/wAAAAAAAAAA9w==", - "upper_bound": "ATEzODc5ZDQx/zkwZjc0YWMx/zhhMWY3NDNj/2JiMTgzNmE3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 40960, - "lower_bound": "ATEzODdhMDVl/zAyOTE0OGEx/zkwZTljY2Qx/zM3ZWQ4NzJh/wAAAAAAAAAA9w==", - "upper_bound": "ATE0OTM0ZTZk/zRjMjU0YWQ4/zljZGNhZmVm/zk3NjU0Yzhm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 43008, - "lower_bound": "ATE0OTM2NTc3/zhmMDE0YmEy/zllNTU1ZjY2/zI2M2E3NzI2/wAAAAAAAAAA9w==", - "upper_bound": "ATE1OWY2ZTA3/2VmMDU0NGIx/zllZDFjM2Ey/zk3Y2UyY2U0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 45056, - "lower_bound": "ATE1OWY3NjU1/2Y4Mjc0ODNl/zhmOWEyMDFj/zNiYWE5Mjkz/wAAAAAAAAAA9w==", - "upper_bound": "ATE2YjE4MmU2/2M0MGM0ODUw/2FlZTk2MGUx/zA4MzFmNDgz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 47104, - "lower_bound": "ATE2YjE4NDVj/zhkODg0ZDdk/2IyN2IzZmY3/2FlMDZjM2Vi/wAAAAAAAAAA9w==", - "upper_bound": "ATE3YjlmZDgy/zE0YjI0NjA3/2FkYzcwMjY3/2RkZmNmNmUw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 49152, - "lower_bound": "ATE3YmExN2Y4/zdhZjM0YmJh/2JmZTcyZmNh/zYyNzM3MTk5/wAAAAAAAAAA9w==", - "upper_bound": "ATE4YzEwNWI3/2VkYzA0Njcx/zhiZGVhMDVk/zVhODVjNDVl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 51200, - "lower_bound": "ATE4YzE4ODNj/zdjYmI0OThj/2JkOWMzYzli/2YwZDEyYzk5/wAAAAAAAAAA9w==", - "upper_bound": "ATE5Y2FiNjgz/zc2ZDM0MGU2/2I1NjE4NGFi/zE1YzdmMzM0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 53248, - "lower_bound": "ATE5Y2FiYmRm/zczZGE0Yjkz/zk4MzkxNjZm/zkxOTAyN2E5/wAAAAAAAAAA9w==", - "upper_bound": "ATFhZDM3MzQ1/2JlOTk0Nzlk/zllODU0ZjA4/zZjZmQ0ZTQ0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 55296, - "lower_bound": "ATFhZDNhNDBi/2VkYzU0YjFm/2JkNDk3Njlm/2JlN2U0Yzkw/wAAAAAAAAAA9w==", - "upper_bound": "ATFiZDc3NTFl/zE5MjY0YWY5/2I0MjMyMDZk/zViOTAyYmMw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 57344, - "lower_bound": "ATFiZDgyNDNj/zVlMGU0YmMy/2IyNzFhMDg1/2FkZTlhNDg0/wAAAAAAAAAA9w==", - "upper_bound": "ATFjZGE5MWQ2/zgyZGI0ZGRh/2EzYzQ0NWUw/2Q4MGM5MDBk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 59392, - "lower_bound": "ATFjZGE5Njhh/2VmY2Y0NGE2/2FiMDRjYTE0/zUxNjc5OTE4/wAAAAAAAAAA9w==", - "upper_bound": "ATFkZGEwOTQw/zc4Yjk0MDg4/2IxMmQ1ZjMx/2IwYmVmOGI2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 61440, - "lower_bound": "ATFkZGEyNWI5/zJjMTg0NWQw/2FjNjcxYzJi/2ViMDJmOWNk/wAAAAAAAAAA9w==", - "upper_bound": "ATFlZGZmZDc4/2NkNDk0ODM3/2I0MTdmNTVl/zc4MjUzN2Ez/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 63488, - "lower_bound": "ATFlZTAxNjlm/zRlZWM0MWU2/2E0N2JhODkz/zg0ZGUzNjk3/wAAAAAAAAAA9w==", - "upper_bound": "ATFmZTFlZGYx/zdlMzY0NzAz/2FjN2ZmZGNh/zQxNWI4MmU3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 65536, - "lower_bound": "ATFmZTIwMTVi/zQxMmY0OThl/2JkOWM2Yzc0/zI5YWQyMzE4/wAAAAAAAAAA9w==", - "upper_bound": "ATIwZWE1NjE2/2IzODY0NzI3/zkxMjFhNGUw/zFhY2QwMDk0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 67584, - "lower_bound": "ATIwZWE2MmYw/2E3Yzg0Zjkw/zlmMjlmN2Zk/zM4MjNlZGYz/wAAAAAAAAAA9w==", - "upper_bound": "ATIxZjM3Mjg1/zM4NjU0MmY2/2JhNGNlNzY2/zM1MjVmNTQ2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 69632, - "lower_bound": "ATIxZjM3Y2Jm/2IxMzQ0ZjI3/2JhMWY0NzEw/zEzZTYzOGZl/wAAAAAAAAAA9w==", - "upper_bound": "ATIyZmYyZmY0/zUxOTA0ZjFi/2FkMGEyZjQy/zBlZDljMmIz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 71680, - "lower_bound": "ATIyZmY2NmNi/2I1ZmI0NzNj/zkzNGQ1MzMz/zY2MDA5ZTUx/wAAAAAAAAAA9w==", - "upper_bound": "ATI0MGE5ZDJk/zAxZmM0OTY0/zhiZDQ1YTBl/2U4YjcwM2Fm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 73728, - "lower_bound": "ATI0MGFkNDdh/zNlNzk0NDQx/2EyNGI4N2Q1/2U2NjU2MmUz/wAAAAAAAAAA9w==", - "upper_bound": "ATI1MGUxMjE3/zUyNTA0NDVm/zhmYTUxNzBj/zQ0OGUyMTI2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 75776, - "lower_bound": "ATI1MGUxOTIy/2NmODM0NmUx/2FhMzBhZTBj/2ZkZTMyYzI1/wAAAAAAAAAA9w==", - "upper_bound": "ATI2MGU5OGYz/2Y0Zjk0MzI4/2EzMjYzZWEx/2Q5MDkwMzg4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 77824, - "lower_bound": "ATI2MGVhMTNm/zRkNmI0YmY5/zkyY2I0YzU4/zQ4Yzc1MDMy/wAAAAAAAAAA9w==", - "upper_bound": "ATI3MTFhNzEw/zkzNTU0MzMy/2FlMDFkNDA2/2M5ZmFlMzEy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 79872, - "lower_bound": "ATI3MTFhYWY2/zA4MGE0Mjc1/2IwMjdhYzQ5/zY3ZDlhZDc4/wAAAAAAAAAA9w==", - "upper_bound": "ATI4MDk4NGU3/2Y0NGE0N2Jl/zgwNGNkY2Ey/2YwMTFhNzc0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 81920, - "lower_bound": "ATI4MDk5OGI4/zkwMDg0MjZh/2E3NzJkOWYz/zg4YjQ5NTNm/wAAAAAAAAAA9w==", - "upper_bound": "ATI5MGQzMzcz/2RiMjQ0Njgz/2E2OThiZjdl/zI4NjdiYWIy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 83968, - "lower_bound": "ATI5MGQ3M2Vi/zJkYmQ0N2Jm/2IwMTAzYzFj/2VkMTcwODRi/wAAAAAAAAAA9w==", - "upper_bound": "ATJhMWQ4YTVk/2NhMDg0NTc5/2JlNWY0NTU4/2FjZDAwMjA2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 86016, - "lower_bound": "ATJhMWRhNWI3/2UzYjQ0YzU5/2JjZDY3OTdm/2EyMzZmMjYw/wAAAAAAAAAA9w==", - "upper_bound": "ATJiMjJjZDY3/zVmZWY0YjJi/2EzZWFmYzQz/zA5Zjg0Y2Zm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 88064, - "lower_bound": "ATJiMjMwYWVm/zY3NzE0ZDhm/zgxNjkyOWIw/2E4MzliZjBh/wAAAAAAAAAA9w==", - "upper_bound": "ATJjMjRiYWEy/zJkODI0NWI5/zk0MjAzNGRh/2RkOGQwYmM2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 90112, - "lower_bound": "ATJjMjRkM2I3/zNkODc0MjM0/2IzMjg1YjQ2/2IzMWY3Yjkx/wAAAAAAAAAA9w==", - "upper_bound": "ATJkMmQ4OTJh/zVhNjA0M2Fh/zg4OGVkN2Mw/zk1MmE0OGE1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 92160, - "lower_bound": "ATJkMmQ5MzBl/2M1Njg0ZjEy/zhjODI5NGIw/zI3NWY1OWE5/wAAAAAAAAAA9w==", - "upper_bound": "ATJlMzM1OGRi/zI0Yzk0YWNh/2FjNGYzODky/zNhNzNmZGNj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 94208, - "lower_bound": "ATJlMzM1OWMx/2RiNmE0YWFk/2I3MDA3ZjAx/zc3YTE0ZTM5/wAAAAAAAAAA9w==", - "upper_bound": "ATJmM2QyMzll/zA3MjY0Y2Fm/zhhNTdmMTZj/zcwZDUzOGVm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 96256, - "lower_bound": "ATJmM2Q1MTYy/zJlMmE0MTYx/2JlNmI4MzIw/zBhOGE0NzQ3/wAAAAAAAAAA9w==", - "upper_bound": "ATMwNDQ5MmY0/zU3NGI0ZWVh/zkyNmRjMDhj/zc1NGM5OGE5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 98304, - "lower_bound": "ATMwNDRhNTMw/zYyODc0YjFm/zg1MWU0NDEx/zMxYThkMTNm/wAAAAAAAAAA9w==", - "upper_bound": "ATMxNTEyOTEy/zYxN2U0NDU0/2I3MmRmYjQ2/zM0MGI2NTgy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 100352, - "lower_bound": "ATMxNTEzNzI1/zg2NGQ0YWZj/2I1ZmU2Nzgy/zJjMDQyMzc2/wAAAAAAAAAA9w==", - "upper_bound": "ATMyNWU3ZGQz/zRmZmY0ZjNi/2FiYWI0NzQ0/2U5MWU5ZTFk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 102400, - "lower_bound": "ATMyNWViMjI0/zg4MjA0ZjA0/2E3MjhlYWMx/zUzNzg3Mzhl/wAAAAAAAAAA9w==", - "upper_bound": "ATMzNjVhMmYx/zc5ODM0MjA1/2IyZGM4NGE4/2ZmYjA5ODk4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 104448, - "lower_bound": "ATMzNjVjMTYw/zI5M2E0NmEz/zhjNTgzMzZh/2VkMTdlZWZh/wAAAAAAAAAA9w==", - "upper_bound": "ATM0NmU0YmUx/2M0ZTE0NWRk/2I4NWVmNmRh/zg5ZGM1YTYy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 106496, - "lower_bound": "ATM0NmU2NmUz/2I2MGM0OTI0/2E5MjY2MjJh/zY1NjU1OTE0/wAAAAAAAAAA9w==", - "upper_bound": "ATM1NmJmMmY3/2ZhNzk0NWJj/2EwNzRiMGRh/zAyYzg4NGFh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 108544, - "lower_bound": "ATM1NmMyY2Q5/zMwMjk0YTgx/2E3ODA2ZmU2/2Q0MjE1NTI0/wAAAAAAAAAA9w==", - "upper_bound": "ATM2NzBkNTlh/2U4Yjk0MzU4/2FlODdjZmMz/2NjNWZlYTAz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 110592, - "lower_bound": "ATM2NzE1MDQ5/zJjMTE0MTVm/2FmMzFiMTkx/2E5NWU5YzM0/wAAAAAAAAAA9w==", - "upper_bound": "ATM3NzVhNzcz/2UyNzg0ODM3/2JiNWFmZjI0/zY2MTIyYTg1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 112640, - "lower_bound": "ATM3NzViYzZk/zFkMWE0NjQ4/zk3ZWZjZGRi/2Y5MDZkODI0/wAAAAAAAAAA9w==", - "upper_bound": "ATM4ODJjYThi/zk2YmE0MmQy/zgzZjMwOGRl/2IwNjNhYWQ3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 114688, - "lower_bound": "ATM4ODJmNGUz/2EzNDA0YzAx/zhlNTM4OWEy/2JmZGJhYTg2/wAAAAAAAAAA9w==", - "upper_bound": "ATM5ODgxOTY2/2FlYTk0Mzkw/2I1M2FiYTZk/zljMWZlYWZi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 116736, - "lower_bound": "ATM5ODg1ZDc0/2MyNDQ0YTkw/zk2NGRlZjQy/2MxNzQ1NDU0/wAAAAAAAAAA9w==", - "upper_bound": "ATNhOTRlZmVj/2Y1ZjE0MGVk/2FiZGM1YTVi/zUwOWI4MzJk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 118784, - "lower_bound": "ATNhOTU0OWJm/zU2MWM0NzEy/2I0ZWU2N2U2/zUxMmU4ZDM2/wAAAAAAAAAA9w==", - "upper_bound": "ATNiOWFkN2Zm/zdiYzE0NjJh/zg3Zjk5ZGQw/2IxYWRiOGMw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 120832, - "lower_bound": "ATNiOWFlNjZj/2ZiYzg0Y2Fj/zllMzNkOTQ0/2ZjYTM5ZmY5/wAAAAAAAAAA9w==", - "upper_bound": "ATNjYWExZDli/zQyNGE0MGRm/zhhMGI0OGU0/2Q4MDk4MTdm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 122880, - "lower_bound": "ATNjYWEzYzk4/zhjNGU0MjMz/zgwN2UxZjk2/2RjMDRjYmZm/wAAAAAAAAAA9w==", - "upper_bound": "ATNkYWY0MWU0/2M1ZDI0OWQ4/zk2YjA3NGYz/2NjMWUxMDRj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 124928, - "lower_bound": "ATNkYWZmYzcw/zNmZDU0ZGUy/zhmY2QwYjNj/zcxY2Q1NWIz/wAAAAAAAAAA9w==", - "upper_bound": "ATNlYjA0MTk4/2EyMTM0NDdl/2FlMjUwMDk0/2JlMWY3MDQx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 126976, - "lower_bound": "ATNlYjA0ZmY5/zA5MGM0NGJi/zhhNWVmZmQ5/2MzMTM4YjM3/wAAAAAAAAAA9w==", - "upper_bound": "ATNmYmZhZGM0/zAzY2Y0MGQ1/2E5YjBkOWI5/2VkNjhjMzc1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 129024, - "lower_bound": "ATNmYmZhZGYw/2FkNTk0MmZl/2I5NjlhNzUy/2FiYTVmMWZl/wAAAAAAAAAA9w==", - "upper_bound": "ATQwY2JhZmNi/2Y2Mjc0NDA1/2JkOGFmODcx/2ZjNmYzMzI4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 131072, - "lower_bound": "ATQwY2JkZTk4/2YwMDA0NmY5/2EzNTI0Y2Y5/zBhYmY4MDZm/wAAAAAAAAAA9w==", - "upper_bound": "ATQxZDFkNDli/2IwZDM0N2M0/zliNGVmYjQ1/zIwZDUzNDdl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 133120, - "lower_bound": "ATQxZDFlZjlk/2QzOTM0YWU3/2I1YmRhMDk0/2FlYmM2MjEy/wAAAAAAAAAA9w==", - "upper_bound": "ATQyZDJmODE2/zBiNTQ0OWEw/2JlNTE5NWYw/zk4NmM1ZTBm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 135168, - "lower_bound": "ATQyZDMxNzkx/zNiNzI0ZTkz/2FlZmRhZTY2/zc5YzBiZTc4/wAAAAAAAAAA9w==", - "upper_bound": "ATQzZGI0MDM1/2M2MmE0ZDk4/2ExOGZkNDk3/2IwMWEyZDMz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 137216, - "lower_bound": "ATQzZGI4MTFh/zk3MWE0Mzc0/2JlMTFmMTg4/zNkNGFiNGVk/wAAAAAAAAAA9w==", - "upper_bound": "ATQ0ZTQ3OWU5/zJkODM0Njc5/2FjNWNmMzY2/zBmM2ZkZDNi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 139264, - "lower_bound": "ATQ0ZTQ4MzEy/2VmNTM0NTk2/zgyNWE1NWI5/zk0MjhmYjMx/wAAAAAAAAAA9w==", - "upper_bound": "ATQ1ZjQwMWM3/2RlM2Q0NjU5/2JkMTc5YmVi/2EwYzM0YzVi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 141312, - "lower_bound": "ATQ1ZjQxMGM1/zU2OGQ0YzM3/zk5NDAxZDdj/2IxMTg5Yzkx/wAAAAAAAAAA9w==", - "upper_bound": "ATQ2ZmFlYWM3/2ZiNGM0ZGY4/2EwMjRiMWYx/2RlZTljNzk2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 143360, - "lower_bound": "ATQ2ZmIyOTQ5/2JlM2U0MDc1/zhkYzMzYjk2/zdjNjEyOWIx/wAAAAAAAAAA9w==", - "upper_bound": "ATQ3ZmQxNzlm/2UwMjk0N2U1/zhlNWI3MmRj/zgwMThjZWZh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 145408, - "lower_bound": "ATQ3ZmQyYTg3/zQ0YTA0ODFh/2E0ODU1NGYw/zYwYjAzNmRh/wAAAAAAAAAA9w==", - "upper_bound": "ATQ5MDI3ZDg1/zJjMmY0M2Vl/2I4MjZhZWNl/2UzMGViYTM3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 147456, - "lower_bound": "ATQ5MDJiMTA3/zhkMzA0NDZk/zkxOTVhNjRh/2RmNTA4MmNh/wAAAAAAAAAA9w==", - "upper_bound": "ATRhMDY3YjRj/2JlZDc0YjJk/2JjMzdkNjY2/2UwMTk0NDA2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 149504, - "lower_bound": "ATRhMDY5MTQ0/zg5YWM0ZTFj/zg2OTZhNjA5/zU5YWNhNDI5/wAAAAAAAAAA9w==", - "upper_bound": "ATRiMTU0ZTQ0/zFhYjY0MWI4/zg1ZTBmMjg1/zg4NTExZDI0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 151552, - "lower_bound": "ATRiMTU2ZjIw/2EyZWY0ODRm/zhlMGVkMWU4/2UwYTA2Yjhl/wAAAAAAAAAA9w==", - "upper_bound": "ATRjMWE3ZGRj/zZiZWQ0ZDVj/zkzNzYzNTNl/zVkNzg1YTM4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 153600, - "lower_bound": "ATRjMWE4MmM1/2MyZTM0NGRh/zg5MjliYTY5/2FiZGQ5MGQx/wAAAAAAAAAA9w==", - "upper_bound": "ATRkMWQ5NmIx/2UyOTM0OTU5/zk2MjQyZTRj/zIxMmRlODA5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 155648, - "lower_bound": "ATRkMWRiNWUz/2EzZTk0YzE0/zllM2Q4OGYy/zA1ODJjNzM4/wAAAAAAAAAA9w==", - "upper_bound": "ATRlMWM4NzY5/zhjMzc0YTQ1/2I0Njg1Y2Qz/2IxYjgwNmIw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 157696, - "lower_bound": "ATRlMWNjMWQ4/2FhNzE0ODMw/zhhNzkzYTQ3/2VlYTVkMmYx/wAAAAAAAAAA9w==", - "upper_bound": "ATRmMjE0Zjhm/2ZjM2Q0MGIz/2I1OGYwM2Rh/zBiZjhhNmQ2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 159744, - "lower_bound": "ATRmMjE2OTEx/2E1ZWU0ZWM5/2E3ZjRkODIy/2I0MDllMGY5/wAAAAAAAAAA9w==", - "upper_bound": "ATUwMmQ4NGNh/zRmZTE0NjA5/zgxYmFmY2Vi/zU5MDNjMTRk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 161792, - "lower_bound": "ATUwMmRhY2U5/2U2YTM0Njhh/2I4OWQ2ZmU4/2I0MTg2MDJm/wAAAAAAAAAA9w==", - "upper_bound": "ATUxMmEyNzcw/2EyNmE0N2Rj/zlmZWNhOWQ0/zk5YzU5Nzk1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 163840, - "lower_bound": "ATUxMmE3MGRk/zhkMTM0MTVm/zk3NDI0ZGI5/zk5NDNiZTE2/wAAAAAAAAAA9w==", - "upper_bound": "ATUyMmE3OWM4/zBjZmQ0ZGUx/zkyYzc0ZTg5/zU0MjcyZDBj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 165888, - "lower_bound": "ATUyMmFhNTIy/zg2ZWI0ZTkx/2EyYmE4Yjc1/zEyMmQ5Nzdh/wAAAAAAAAAA9w==", - "upper_bound": "ATUzM2VkNDRh/zVlZmI0YTdm/2I2ZjBjMTE1/2ZkY2FjN2Jk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 167936, - "lower_bound": "ATUzM2VlYTBk/2FlZDk0YmFk/zhmZmFlODc3/zIwYzk4ZGJi/wAAAAAAAAAA9w==", - "upper_bound": "ATU0NGU2ZDhm/zgzMGI0ODQx/2JhYWVlZGZh/2M5M2E4ZTM0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 169984, - "lower_bound": "ATU0NGViYzdm/zFlNGQ0NDAx/2JkNGFjMGU2/zY2MzI1ZGFk/wAAAAAAAAAA9w==", - "upper_bound": "ATU1NTUyZDdh/2FjYzY0ZGRl/zgxNmFmZWMx/zEyNmE5YTY3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 172032, - "lower_bound": "ATU1NTU0M2E5/zFmNDQ0MWVm/2JmYjZhNWI4/2M1MDhiZjQy/wAAAAAAAAAA9w==", - "upper_bound": "ATU2NTUyNjYz/zY5OGU0M2Fh/zk1Mzg2ZmMw/zRiYjNmZWM1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 174080, - "lower_bound": "ATU2NTU5YmM1/zg4OTU0MTI4/zk0YWQxYWRl/2EwZDhkOGZl/wAAAAAAAAAA9w==", - "upper_bound": "ATU3NWUxOWQ2/zJiMzU0OTdi/2IxMjk0MWM4/2E4MzEwY2Fi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 176128, - "lower_bound": "ATU3NWUyNjM0/zJkYzA0YTdk/2IxNjE0NmM4/zQxZTdlNzMx/wAAAAAAAAAA9w==", - "upper_bound": "ATU4NmMyZmJl/zU4ODg0YTU2/zliMDgxNjEz/zljYjMzNzFj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 178176, - "lower_bound": "ATU4NmM1M2Ew/zMxZmM0NmMy/zg2NGUyY2Nh/zA2MzY1N2U4/wAAAAAAAAAA9w==", - "upper_bound": "ATU5NjZlMmYw/zhlOWE0NzRm/2EwYjAxNjY1/zhlNzgwODU4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 180224, - "lower_bound": "ATU5NjZmMGZl/zRiOWQ0Zjg1/zlmZjBlMjI3/2U3NDhmYTYx/wAAAAAAAAAA9w==", - "upper_bound": "ATVhNmViNGZh/zcyMDE0ZjE5/2JhOGE2MjJj/zMzMzQzNDU1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 182272, - "lower_bound": "ATVhNmVjYmQ2/2JhNGE0YmYy/2IwOGFjMjgx/zJkYTg2OTE0/wAAAAAAAAAA9w==", - "upper_bound": "ATViNmQ2ZDkz/zJjZDQ0ZTg4/zg4YzFjMDYx/2NlZWRhM2M0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 184320, - "lower_bound": "ATViNmQ4MWIy/zI2YjE0MzUx/zlkOTQwMzE3/zVlNzNkZDdj/wAAAAAAAAAA9w==", - "upper_bound": "ATVjNzUwZDkw/zRmYjk0NjY0/2FiZGFjNDQ5/2UzMTFlZmQz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 186368, - "lower_bound": "ATVjNzUyMmRh/zU0NTE0ZTMx/2EwMTYyNmMx/2FkMjE4ZDFi/wAAAAAAAAAA9w==", - "upper_bound": "ATVkNzg3NGJj/2FjOTU0YTBl/zlkYjJiODY0/2I0YWE3MjJj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 188416, - "lower_bound": "ATVkNzg4MmU4/zNhNmI0MTEw/2FkMTBhNGY4/2M4NDJhMTlj/wAAAAAAAAAA9w==", - "upper_bound": "ATVlODE4NDVk/zE1YTc0OWYy/2IzN2M0MmFh/2YxYjgxOGNi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 190464, - "lower_bound": "ATVlODFhMGVm/zI3MDk0NDcy/zg5YWEyYTc5/2FmMGQ5OWMy/wAAAAAAAAAA9w==", - "upper_bound": "ATVmOGI3NmU0/2NjNjg0OTgy/2JkNjdmMjAz/2NiOTRkNDRk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 192512, - "lower_bound": "ATVmOGJhZjIw/2NhM2E0MTMz/2E0NWY4MjE5/zNhYzhiMTUz/wAAAAAAAAAA9w==", - "upper_bound": "ATYwOGU1ZTNi/2ZkM2M0MWM0/2EyNjM3Mzk5/zEzYzZkMDk2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 194560, - "lower_bound": "ATYwOGU2MGUx/zc0ZTQ0OTUw/zg0NTVhZjI2/2M5YzQxMTVm/wAAAAAAAAAA9w==", - "upper_bound": "ATYxOGNlYTk1/2E5ZWE0NmNi/2I0NDFlZGU2/zUxYmQ2ZWIy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 196608, - "lower_bound": "ATYxOGQwZTQx/zNiMTk0MjYz/2FiYjgzODYw/2M5YzE5ZWFh/wAAAAAAAAAA9w==", - "upper_bound": "ATYyOTBkZDUx/2I3ZTA0ODk0/zk0MzNmOGFk/zA1Yzk4NjI2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 198656, - "lower_bound": "ATYyOTEwYTEz/zAxMDk0NjFl/zllNWEzNDJm/zFkNjNkYzQ1/wAAAAAAAAAA9w==", - "upper_bound": "ATYzOTNjMTZj/zhlMTY0ZGI5/2I3NzBjYTM1/2JhZDdlZjNh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 200704, - "lower_bound": "ATYzOTNjMThj/2IyOGY0YmQ0/2E3MjUwNWQ3/zM0ODBiODJl/wAAAAAAAAAA9w==", - "upper_bound": "ATY0OWU2NjNh/2MwNTQ0NmI2/zhhZDY5NDFm/zA4MmYzZmU0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 202752, - "lower_bound": "ATY0OWU3MTIz/2Y0YmU0NWM0/2IxZjM5MDBi/zMyZDUwMDQ2/wAAAAAAAAAA9w==", - "upper_bound": "ATY1YTEwMzkx/zcyN2M0MTM2/zhiMzA3NzM0/2FiYmE4ZmUx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 204800, - "lower_bound": "ATY1YTExMTZl/zYxNDI0YzMw/2FmNjUwOWIy/2Y1MzVjMWMy/wAAAAAAAAAA9w==", - "upper_bound": "ATY2OWYzMzkz/2ZhNDI0OTM2/2JiYzBkOTA5/zU1MmNmZjAw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 206848, - "lower_bound": "ATY2OWYzNzdh/2RlODY0MGUy/2JhZmQ0MGM0/2FhNGFkMmIx/wAAAAAAAAAA9w==", - "upper_bound": "ATY3OWQyNjc0/2YyYTQ0ZjJl/zg2ZjY5NmQ0/zkwNmUwMDc2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 208896, - "lower_bound": "ATY3OWQzNTFh/zczOGM0ZmY5/2I2OTM0N2Vj/2VmYmU2Mjlj/wAAAAAAAAAA9w==", - "upper_bound": "ATY4YWRjYjkz/2U5N2U0ZjVj/2JkM2Q1NTNj/zg5N2I2ODU4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 210944, - "lower_bound": "ATY4YWRlMTkw/2VkMjk0MTI2/zhjZDQzYTRl/zgyNDU5MDVh/wAAAAAAAAAA9w==", - "upper_bound": "ATY5YWZhOGY5/zJmNzk0Mzdl/2FjOWY0Yzk5/zI1ZmZhNjg0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 212992, - "lower_bound": "ATY5YWZiMDk5/zgwZTE0NGMz/2I5YmY0ZTZl/zY3YzdkNGE2/wAAAAAAAAAA9w==", - "upper_bound": "ATZhYjZkMGE0/zZkMzE0MjM1/zhkMTdlNjNl/2QzNGRiMjg3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 215040, - "lower_bound": "ATZhYjZkNzc2/zQ3OTI0ZWMy/2JjNDA1YmJi/2EwNjUxZTli/wAAAAAAAAAA9w==", - "upper_bound": "ATZiYmE2MTZi/zU1YmY0YmUz/zg4Mjg2M2Zl/zk5ZjhhYTI4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 217088, - "lower_bound": "ATZiYmE3NmZk/2IyODc0NmZh/2FkYjE1MTcw/zE3MWMwNmUz/wAAAAAAAAAA9w==", - "upper_bound": "ATZjYjlkODM4/2JiZTE0OGM2/zlhMTI5YWU1/zgxODdlMjNh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 219136, - "lower_bound": "ATZjYjllMmUw/2UyMTM0MDUw/2JlNWFmODlm/zFmOTA3MDg2/wAAAAAAAAAA9w==", - "upper_bound": "ATZkYjVlZWRk/2Y0Zjk0MTY0/zk3ZmRmYTRl/zc2OWYwNjhk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 221184, - "lower_bound": "ATZkYjVmMDli/zgwNzY0ZTZi/2IzYTEyNzMw/2EyYjhmYzY1/wAAAAAAAAAA9w==", - "upper_bound": "ATZlYmRjY2Nk/2Q5M2Q0NDQ3/zg3YjhhOGJh/zg5NDcwMTEw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 223232, - "lower_bound": "ATZlYmRlYjBm/zFiNjQ0MGNh/2I5NjM3MDVk/zNlYTliYTcx/wAAAAAAAAAA9w==", - "upper_bound": "ATZmYmYyMWI0/2FlOWI0Zjky/2I5ZjFhNjk5/2JlZTc0ZGQ5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 225280, - "lower_bound": "ATZmYmYzNjY4/2E3YmI0ZWUz/zhiNWVmYjI2/zA0OWZhZjNi/wAAAAAAAAAA9w==", - "upper_bound": "ATcwY2JhMTVl/zJjNjk0YjIy/2E4ZDNjY2Uy/2FhOWQ0OTVm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 227328, - "lower_bound": "ATcwY2JjMGMx/zg0NDE0NjQ2/2FiNTk2NGY5/zQxNGM1Mzk0/wAAAAAAAAAA9w==", - "upper_bound": "ATcxY2NmNmQ1/zAwZGU0NmJm/2IzYTYwNDFi/zdkNDIxZjJl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 229376, - "lower_bound": "ATcxY2QwMzc3/2RiMjM0MzI5/zhiMzI3MThk/zYzNWVhZDE2/wAAAAAAAAAA9w==", - "upper_bound": "ATcyY2Q0ZDAw/2FjOTI0NDc2/2JiZjAzNTZl/zNjYzU1OTdm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 231424, - "lower_bound": "ATcyY2Q2MjQy/zZmNjc0Yzdl/zlhOWMzN2Y4/zZiN2YyZmY5/wAAAAAAAAAA9w==", - "upper_bound": "ATczZDAzYjkw/zNmZTQ0ZDA5/2I5Nzg4Nzc5/zhlNWE5NWFi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 233472, - "lower_bound": "ATczZDAzY2Vi/zc0MGY0MGIx/zk3MTRlNDNh/2RjZjNiZmYx/wAAAAAAAAAA9w==", - "upper_bound": "ATc0ZGU2ZmQx/zUzNjc0MTMw/zkxZmE1MjMw/zY4NDM3ZmFi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 235520, - "lower_bound": "ATc0ZGU5Yzk4/zllMDc0ZmRh/2I4ZTc3MGY5/zg5MjFkNzA1/wAAAAAAAAAA9w==", - "upper_bound": "ATc1ZWY4NzVl/2EzMWU0ZGEy/zg2NDlhNTU2/zViOTM4Y2Fj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 237568, - "lower_bound": "ATc1ZWZkOGE0/2EwMTY0NWJi/zk5MjA1YmEx/zg2YTIxOTI3/wAAAAAAAAAA9w==", - "upper_bound": "ATc2ZjhkYjU4/zQ4YmE0MTVh/zlmNmNhOTZj/2FmY2E3ZmQ4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 239616, - "lower_bound": "ATc2ZjhkYmUy/2U5YzI0MmZm/2FlMGJlNDQw/2M3MmRmOThk/wAAAAAAAAAA9w==", - "upper_bound": "ATc4MDg1Mjky/zI4NWI0YjM2/zk5MWI1Mzgw/2E4OTViYmFk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 241664, - "lower_bound": "ATc4MDhhNzIw/2ZhNjM0MTFl/2FlNjRlYTA0/2NmMGNhNGM2/wAAAAAAAAAA9w==", - "upper_bound": "ATc5MTRmZDQx/zQxNmM0ODU5/2FkNjllMWFk/2YxNTNkNWMz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 243712, - "lower_bound": "ATc5MTUwMTk4/zE1MGQ0ZDQ1/2EzOTFlYWQy/zc5MDAzMWEw/wAAAAAAAAAA9w==", - "upper_bound": "ATdhMjExYzBl/zRjNTU0NTE2/zkyYmY5MThk/zQ5OWE1NDFm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 245760, - "lower_bound": "ATdhMjE0NjM5/2U3MWY0YTA4/2E5MTZlZjU2/zgzMTIwMjAy/wAAAAAAAAAA9w==", - "upper_bound": "ATdiMjU3N2Vk/zYwZjg0OWMy/zljYmI4ODZi/zc5OWU1MTQ1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 247808, - "lower_bound": "ATdiMjViZGFl/2E0M2U0ZTI1/2IyMjJmNWQw/2MyMjM3ODBi/wAAAAAAAAAA9w==", - "upper_bound": "ATdjMjNmY2Rh/2JmYWM0Y2Fl/2FkZjEyYWY3/2Q5NmYzZWYz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 249856, - "lower_bound": "ATdjMjQxNjk0/2FiMDQ0ODRl/zhlMzUyNTVl/2ZhNzA5MmYz/wAAAAAAAAAA9w==", - "upper_bound": "ATdkMmRiMGY4/zU0YzU0YTNm/2IwY2Q1YzFk/zRkMDE5M2Zm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 251904, - "lower_bound": "ATdkMmRiOTJh/zIxOGQ0Zjdm/2FhZThlNTAw/2IyNTg5MDcz/wAAAAAAAAAA9w==", - "upper_bound": "ATdlMzNkOGZi/zBmMGY0NWQz/2I4ZTdhMjBj/zk5NTEwMjY5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 253952, - "lower_bound": "ATdlMzQwMGUz/zJiOTg0M2Yw/zllNGJiODA5/zk5YzIxZGU1/wAAAAAAAAAA9w==", - "upper_bound": "ATdmMzY5NGI0/zU0YWQ0NTQx/zg0NDMzNGU2/zcxNzMzODY5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 256000, - "lower_bound": "ATdmMzY5Yzkx/2I3Mjc0ZjYy/2I2YTVhOTgx/zNmZmMyMDg5/wAAAAAAAAAA9w==", - "upper_bound": "ATgwMzNhMmEw/zQyZmI0ZTJm/2E2YzhiZTkx/2U2N2MxYThm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 258048, - "lower_bound": "ATgwMzNmMzdh/2RkYWI0YmQy/zg3ZjQ3NTQ1/2ZiZWZmNjA3/wAAAAAAAAAA9w==", - "upper_bound": "ATgxMmYyMGVl/zRmZDE0ZTNj/zk2NDBmYjUx/2FmZDljNjk1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 260096, - "lower_bound": "ATgxMmYyMjRj/zQ5ZTA0ZWE3/2I5ZWJkYjEw/2E5NjE0MGQy/wAAAAAAAAAA9w==", - "upper_bound": "ATgyMzRiNjNj/2UyMGY0YjIz/zlhYzdkNDhm/2VhMWNlMmEy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 262144, - "lower_bound": "ATgyMzRjNjNk/zdlZTI0MjY5/2EyYTBlNmI0/2QxMGIzNzQy/wAAAAAAAAAA9w==", - "upper_bound": "ATgzM2UzNDAz/zc0NzE0ZjA0/zk4Y2U3MGM3/zFjOTBkNDM1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 264192, - "lower_bound": "ATgzM2UzNTFl/zM3NGM0MjBi/2I0ZmE2ZjU4/zU4YzFiY2E4/wAAAAAAAAAA9w==", - "upper_bound": "ATg0NDVlOGFm/zUyZmE0Yjcw/2E3MDcwM2Fi/zg5NjcwMDdl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 266240, - "lower_bound": "ATg0NDYyMWZm/zI1NTc0OWI0/zg1NWVlNDVi/zY0MTE0NzZm/wAAAAAAAAAA9w==", - "upper_bound": "ATg1NTIwNzhk/zNiZDA0ZTU0/zk0NjBkYmQw/2QzNDE4N2Jm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 268288, - "lower_bound": "ATg1NTIwODIz/zNjZGU0ZmNi/2JjYmMyZmMx/zFhNmUzOTI5/wAAAAAAAAAA9w==", - "upper_bound": "ATg2NTdmNDdj/zI2YTQ0NjNl/2E5ZTcyZDhh/zVmYjUzYmM0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 270336, - "lower_bound": "ATg2NTg2NDgy/zYzZmU0MDg1/zlmNDExYTVk/zI1ODJmNDhh/wAAAAAAAAAA9w==", - "upper_bound": "ATg3NjJjNDQ3/zc1MGE0NDdh/2I3Njk1NTAy/zM2NThkOTRk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 272384, - "lower_bound": "ATg3NjJmOGZi/zRhYjY0Yjhk/2FlMDJjNTM5/zE5NTg1NzA0/wAAAAAAAAAA9w==", - "upper_bound": "ATg4NjhlYTFj/zBlZDE0MTg4/2IyMDBhOTRi/zI4ODU1OTU1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 274432, - "lower_bound": "ATg4NjhmZTAw/2E0N2I0Njlh/zhmYzFhYTA2/2VlMGE0MWM1/wAAAAAAAAAA9w==", - "upper_bound": "ATg5NjU4ZDY4/zQ0YWQ0ODkw/2FhMGU4NjQ0/zJmNzc3NTY0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 276480, - "lower_bound": "ATg5NjU5ZDc4/2U5NmE0OWZk/2FlNzdmNGYz/2I2YWI5YjQ1/wAAAAAAAAAA9w==", - "upper_bound": "AThhNjdiMTg0/zRkNTM0OGIz/2I0YTI4YWVj/zJkODBkNzRm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 278528, - "lower_bound": "AThhNjdiYmZh/2UxZjA0NTA1/zkzNjUyOWQz/zkyMWFlZTA3/wAAAAAAAAAA9w==", - "upper_bound": "AThiNjUwZWU5/2FhYmM0NDUw/zk0MTQwMmRm/2Q4NzRjZDQ1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 280576, - "lower_bound": "AThiNjUyMmNl/zc0OGM0NmRm/2E2MGEzMzAx/zc1YzY0Nzcx/wAAAAAAAAAA9w==", - "upper_bound": "AThjNjViMzA3/2ZjYzI0ZmQx/2FlZDA0M2Nh/2I3YjdlMzVm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 282624, - "lower_bound": "AThjNjVkMmMz/zViNjU0NjZh/2EwYTk4MGM4/zc3MGM2MWRk/wAAAAAAAAAA9w==", - "upper_bound": "AThkNjBmYjdi/2QxMDU0NTFk/2FhY2NlYTgx/zhlMGFjOTZm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 284672, - "lower_bound": "AThkNjE0MzIz/zUxZDc0ZWJh/2ExYzUyNzg2/2I3YjVhMDkx/wAAAAAAAAAA9w==", - "upper_bound": "AThlNmM1MDcx/zBmMzA0Nzlm/2EwMmY0MzE1/2U5MDA0ZmIz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 286720, - "lower_bound": "AThlNmM1OGU2/zNiYjY0NWNk/zg3YmJkY2U5/2I4MmVkMjE2/wAAAAAAAAAA9w==", - "upper_bound": "AThmNzNmNDBm/zI1MzU0YzU3/zk0MGU4Nzli/zBkOGUyNDhl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 288768, - "lower_bound": "AThmNzQxMDBm/zRkODU0OWYy/2E1YTRlYTI3/zJlNzAzZTVm/wAAAAAAAAAA9w==", - "upper_bound": "ATkwNzRmNDU0/2UyZmE0YzBm/zgzYTJiYjA0/zUyODUzMDAx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 290816, - "lower_bound": "ATkwNzUwMzli/zNkMjc0MTI1/2FlZDZiODlk/zY5ODBmMzI0/wAAAAAAAAAA9w==", - "upper_bound": "ATkxN2YxYzYx/zIzYTA0YTEy/2ExNzk2MGYz/2E5MWZhNmMw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 292864, - "lower_bound": "ATkxN2YyMWM2/zFlZjY0NjA1/zg1NjcxZDYx/zlhZjU2ZGZk/wAAAAAAAAAA9w==", - "upper_bound": "ATkyODNjOGNk/zAyZmE0NTMx/2I1MjY3NjJi/2EwOWI1NDFl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 294912, - "lower_bound": "ATkyODNkZTg3/2ZjZjk0Mzhl/zllMmJkY2Vh/zJhMjAzMzM0/wAAAAAAAAAA9w==", - "upper_bound": "ATkzOGVkMzE2/zIyZmI0NmE2/2I1YTQ0ZWRj/zIyMDE1Mzlh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 296960, - "lower_bound": "ATkzOGVlNzVm/2Y4ZTY0NTIz/2E1YzU1ZGIy/zI3NTQ4Yzhm/wAAAAAAAAAA9w==", - "upper_bound": "ATk0OWI2NTdi/zVkYmU0YTBj/zliNmYwNGQz/2M5NWNiZDdi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 299008, - "lower_bound": "ATk0OWJjOTZj/zMxOGI0MjY5/zg1NWM1NzA5/zMwZTIwMDM3/wAAAAAAAAAA9w==", - "upper_bound": "ATk1OThmNmFj/zUxYjQ0ODUw/zk1N2I5ZjQz/zYyYjA2MmZk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 301056, - "lower_bound": "ATk1OThmN2U3/2ZmZjY0OThh/2EyYzU1YmE3/2EyYzIxOTY1/wAAAAAAAAAA9w==", - "upper_bound": "ATk2YTY3N2Jj/zk3OGY0YzFj/2E2ZTAzNThm/zkzODFiMjI3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 303104, - "lower_bound": "ATk2YTY5Zjgw/zY0NGM0MzVk/zg5NWJmMmM5/2M3OTZhYmI1/wAAAAAAAAAA9w==", - "upper_bound": "ATk3YWE4YzUy/zNlYmI0YTgw/zgxZDZiZmMx/zUzMGI4ZTk1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 305152, - "lower_bound": "ATk3YWFlMGU5/2FiOWY0YWY3/2JiM2RlZmRh/zUwOTU4Mzk3/wAAAAAAAAAA9w==", - "upper_bound": "ATk4YWY1YzVm/zE4M2U0M2U3/zljMTRmYTE3/zQzYWVjZDMx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 307200, - "lower_bound": "ATk4YWY4MDYx/zJhZDA0MjQ3/zg3MjhhOWZi/zNjODZjNTIx/wAAAAAAAAAA9w==", - "upper_bound": "ATk5YjNjZjU0/zFlN2I0Nzk0/zhlYjgyZDI3/zAyYTM0YTMx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 309248, - "lower_bound": "ATk5YjQyNTVl/2E4MWY0Nzk0/zk1ZjNlYzhj/zA1ZDJkMmUz/wAAAAAAAAAA9w==", - "upper_bound": "ATlhYmNmZjU3/zVkNTg0NjI2/zg1YmIxNjY0/zdiM2U4NzBl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 311296, - "lower_bound": "ATlhYmQwYjcw/2RhNjY0N2Qx/2I5YWVlNzkz/2UzZjZhZGM4/wAAAAAAAAAA9w==", - "upper_bound": "ATliYzAwZDk3/zg2NjU0YTY5/zhkNmJiY2Rm/zAzNGRjZTYx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 313344, - "lower_bound": "ATliYzA0N2Uw/zlkMTA0N2Rh/2E5MjM4Zjhl/zJlODk3ZjMz/wAAAAAAAAAA9w==", - "upper_bound": "ATljYzdkYzUy/2QxODg0ZmYx/2IxZTZlYjA2/zIwNzNkMzEw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 315392, - "lower_bound": "ATljYzdmZTgz/zZmYjU0ODAx/zg1ZDlhMTcz/zJmNjcyMzFk/wAAAAAAAAAA9w==", - "upper_bound": "ATlkZDA2ODU5/2RkMDM0Nzhh/2JhMGExNjU4/2M1YTk1Mjlk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 317440, - "lower_bound": "ATlkZDA5ZmQy/zU0NTI0Mjg5/zllNGM5Mzc1/2E1MDA2NDIx/wAAAAAAAAAA9w==", - "upper_bound": "ATllY2Q4NmIz/2IwYTg0ZjBh/2JjNDBhNDFi/zNlMmEyNjFh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 319488, - "lower_bound": "ATllY2Q5ZmZk/zY5MGM0OGM5/2I1NWQ1ODQw/2Q5YjFmODdk/wAAAAAAAAAA9w==", - "upper_bound": "ATlmY2ZjN2Ew/zdmNDk0OWIx/2E1ZmZhYzE3/zMzM2NhODNh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 321536, - "lower_bound": "ATlmY2ZmYTI0/2M0Yzg0OGRh/zhkNTNiMzI3/2Y2NGRmZmJk/wAAAAAAAAAA9w==", - "upper_bound": "AWEwY2M4MmVh/2QxNjU0MDIw/zliNTI1ZDc1/zQ0NjAxMzg5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 323584, - "lower_bound": "AWEwY2M4Nzg4/zk2OWY0YzEy/zhmMjVjNTFj/zEyMzAzMDli/wAAAAAAAAAA9w==", - "upper_bound": "AWExY2U0MzI0/2ZkM2Q0ODFi/2JjNTI4MjVh/zRkYTA4NGNi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 325632, - "lower_bound": "AWExY2U3NTVh/zMwODI0MzRk/2IyMDY0YmMw/2E2MDEzNGU3/wAAAAAAAAAA9w==", - "upper_bound": "AWEyZGEzYmU2/2ExZDA0ZmE3/zg3N2U1MzBh/zdhM2VjZTAx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 327680, - "lower_bound": "AWEyZGE0MDZh/2E4ODI0NjRl/zkwZTY2NWI5/zhiYjVmOWJm/wAAAAAAAAAA9w==", - "upper_bound": "AWEzZGFmZDAw/zM4MmI0ZTE2/2E5ODVhMzIx/zhkMmU3OTIx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 329728, - "lower_bound": "AWEzZGIxZTNh/2QwOGM0NDky/zlmY2I4NGEy/zNmN2I2NTMz/wAAAAAAAAAA9w==", - "upper_bound": "AWE0ZGRmOTQw/2ZhYTI0NDNm/2E3N2MzMzFm/2UzMWE1NGRm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 331776, - "lower_bound": "AWE0ZGRmYzBl/zI5NDU0MTk5/2I0NDhmNzI5/zBiMThmYjNh/wAAAAAAAAAA9w==", - "upper_bound": "AWE1ZDhlYTI0/zc4MmY0ZmIw/zliOGYzYzQx/zQ3NDdiMzZm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 333824, - "lower_bound": "AWE1ZDhmZGQx/zEwN2E0MTEw/zg5YTAwOGJh/zU0ZmJlODA0/wAAAAAAAAAA9w==", - "upper_bound": "AWE2ZTYwYTNm/2MwMDE0NjUx/zljZmQzMDJl/2MzMjAyY2Fl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 335872, - "lower_bound": "AWE2ZTY3NzIx/2RkZWQ0MWU3/2EzMWIzMTY3/zg1NTZhMzRk/wAAAAAAAAAA9w==", - "upper_bound": "AWE3ZTg0Njlm/2Q1ZWI0ODk5/2JiNGYzZWEx/2M0NjM5Mzdk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 337920, - "lower_bound": "AWE3ZTg0N2M4/zhmNDA0Nzdh/2E5MWYyNDJk/zRjOTY2ODE4/wAAAAAAAAAA9w==", - "upper_bound": "AWE4ZjAyZTRj/zYwOWY0N2Jk/zg3MWI0ZTRi/zZiZmFhNzIx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 339968, - "lower_bound": "AWE4ZjA1YjZm/zQ2MWE0MTM1/2FlNzRjNmU4/zJmNGY0MjA1/wAAAAAAAAAA9w==", - "upper_bound": "AWE5ZWY2MTJh/zg1Zjg0MjU5/zgyNzIxOGZh/zhiZTQ3NDMw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 342016, - "lower_bound": "AWE5ZWY3NDUx/zYwOTI0OWI3/zg2NWM3YzNk/zc2MDgzNmQ1/wAAAAAAAAAA9w==", - "upper_bound": "AWFhZmRlYjgy/zY5YTY0MzIy/zk5ZWU0ZjJi/2M3NmUzYThj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 344064, - "lower_bound": "AWFhZmUwOTJm/zBhOGI0NTJj/zgwMDdhMzBj/zM2ZDkzMzk2/wAAAAAAAAAA9w==", - "upper_bound": "AWFjMDJhODkx/zY3NTg0Yzkw/zg4YTI1NzZj/2U0ODUyMmI0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 346112, - "lower_bound": "AWFjMDJjNzQ3/2UzNTU0MjIw/2E1NjZmOWFl/2ViZGI2NTAy/wAAAAAAAAAA9w==", - "upper_bound": "AWFkMDhkZWU5/zUyMGE0NzNl/2I5YzUzZGUx/2I4YTg1MDU5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 348160, - "lower_bound": "AWFkMDhlNjE2/zg1MzI0Yjhi/2FlZGY0OGVh/2ExYjQ2NDhm/wAAAAAAAAAA9w==", - "upper_bound": "AWFlMGVkOTRh/zNjYzg0YTVj/2JkMWNhNTli/2I0MGQ2MTc2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 350208, - "lower_bound": "AWFlMGYxZmQy/zE4MWU0Njkx/zhmM2QzM2Y0/zI2ZTNhM2Mw/wAAAAAAAAAA9w==", - "upper_bound": "AWFmMTVjZDkx/zQ3ZjY0NmJm/zgyYzBkMGIz/zFhYjdiMzk1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 352256, - "lower_bound": "AWFmMTVlY2U2/zYxZDU0NzY5/zhlYmNhNDQ0/zkzOWQ5ZWI4/wAAAAAAAAAA9w==", - "upper_bound": "AWIwMThlN2Iy/2ZiYTE0NDYy/zhjZGI3Zjcx/2M1YTNmYjIw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 354304, - "lower_bound": "AWIwMTkwMTMy/zQzNzQ0ZmEx/2FlNjA0YzBk/zNhMWY2MWEz/wAAAAAAAAAA9w==", - "upper_bound": "AWIxMWIxMjY1/zdiOTU0NDY1/2E5MzZmODhh/zBhMGE5ZGVm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 356352, - "lower_bound": "AWIxMWIyYzc3/zE3Yzg0OGFh/zk1YjQwNGI5/zM5YWUxOWQ1/wAAAAAAAAAA9w==", - "upper_bound": "AWIyMjFkY2Q4/2M2MWU0YWE1/zkxNDk4MDY5/zc2M2FmZDJl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 358400, - "lower_bound": "AWIyMjIzZTcw/zY1MjI0YjE2/2JkY2MxMWFm/2Q4MzU4MTFl/wAAAAAAAAAA9w==", - "upper_bound": "AWIzMmUzY2Vm/zUyY2Q0MGEz/2JhZGYxZjE3/2E1MGEyYjE0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 360448, - "lower_bound": "AWIzMmU1OTlj/zdkODg0ZDgy/2I4OTIzZGE0/zZjYTlmMzUx/wAAAAAAAAAA9w==", - "upper_bound": "AWI0MzhkYmIy/zdkN2I0OTkx/zk4Y2EwMjNi/zJhMzBjNDBk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 362496, - "lower_bound": "AWI0MzkwZTFl/2IzMjM0NmNh/zk0ODJiZTNj/zZkYjRkNzI0/wAAAAAAAAAA9w==", - "upper_bound": "AWI1NDVhMDE4/zMzYjI0NDRk/zgwNTVlYWU1/zI1ZWE3Y2Ri/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 364544, - "lower_bound": "AWI1NDViN2Zj/2I0YTU0MDI1/2E5OGVlMjVl/zI2MDk5MDkx/wAAAAAAAAAA9w==", - "upper_bound": "AWI2NGMwNmI5/2ZlNjc0NDFh/zlkMjljNmMz/2NjM2M5N2I0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 366592, - "lower_bound": "AWI2NGMyNmEz/zJjOGI0Njlh/zg5NWYxMTA0/2ViY2VjNjBl/wAAAAAAAAAA9w==", - "upper_bound": "AWI3NTFjZjU2/zA3ZjA0NzM3/2FmMzgwNTli/2RhZmQxOGUx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 368640, - "lower_bound": "AWI3NTFkNjZj/zQ5MDU0Mjll/2EzMDAyY2E3/zIzOTkzNDZi/wAAAAAAAAAA9w==", - "upper_bound": "AWI4NWVjNzEy/zA2ZjY0MTBj/zg4NmQ1ZDQ4/2YwMjdiYjY4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 370688, - "lower_bound": "AWI4NWVkYjg1/2ViYjE0OWM1/zg3ODdhYTdj/zJjNGQxOTVh/wAAAAAAAAAA9w==", - "upper_bound": "AWI5NjNhNDcw/zkyMWY0MDk2/zgzMTg0OTdi/2UxMTU5ZDE3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 372736, - "lower_bound": "AWI5NjNhNTJk/zg0OGU0NTg1/2JlOTc4NGJm/2EzMzJiYTBm/wAAAAAAAAAA9w==", - "upper_bound": "AWJhNjJjNmE4/2Y1YjQ0Mjhk/zhlZDAxNTEw/zEzZjRkMzQ5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 374784, - "lower_bound": "AWJhNjJkMjg5/2VjZmE0NWRj/2JlYzAyY2Y0/zg0NTYxYmZk/wAAAAAAAAAA9w==", - "upper_bound": "AWJiNmNhZmI3/2Y4MmQ0MjRi/2I0ZmNkYWVi/zExZDU5YTNi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 376832, - "lower_bound": "AWJiNmNkMzJl/zMzNjA0Yzcz/zk3ZWY3ZjUy/2U2NDU1MzM1/wAAAAAAAAAA9w==", - "upper_bound": "AWJjNzU2ZTYz/zEzMDY0MTcz/2JlOWU4M2Yz/zQzNDdmYzgx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 378880, - "lower_bound": "AWJjNzU3OWIw/2M0YzI0MTQ4/zk2MmYyNWQ4/2VjZjA4MTBm/wAAAAAAAAAA9w==", - "upper_bound": "AWJkN2JmYjI3/zJiNTU0ZjUx/2IzOTA4NzUz/zRkMzRkMzU0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 380928, - "lower_bound": "AWJkN2MwYzE0/2E0NDI0Nzlk/2E1MjUwMWY1/zE3NjUyMTcy/wAAAAAAAAAA9w==", - "upper_bound": "AWJlODFmZGJi/2JhNzU0ZjVi/zk1YmI4YTI5/2E5MjZkZTJh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 382976, - "lower_bound": "AWJlODIyY2Fj/zY0ZTY0MjQz/2I1ZDU0YzFk/zVkNjc1MmY0/wAAAAAAAAAA9w==", - "upper_bound": "AWJmOGU5MzJh/2MzNzU0NTM5/2I3ODE4MWNi/2IwMmZmYTE5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 385024, - "lower_bound": "AWJmOGU5ZDM0/2U0YjY0NGQ1/zhkN2FlZDc0/2ZhODIxMjdj/wAAAAAAAAAA9w==", - "upper_bound": "AWMwOWE0MGVl/2E4OGY0NGZm/zgyMWQzODc5/zNjZGY2NzNj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 387072, - "lower_bound": "AWMwOWE4ZDFj/2E2ZmU0OWFm/2IwNDhjYzBh/zRlNDM2ZTVh/wAAAAAAAAAA9w==", - "upper_bound": "AWMxYTk0YTEz/zdhZmE0NWU5/zk2MGRiOGEy/2ZiMTAwYzk2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 389120, - "lower_bound": "AWMxYTk2MDQ0/zVhOTg0OGQ2/2JiN2ViNzY0/zgyZTI4NmU0/wAAAAAAAAAA9w==", - "upper_bound": "AWMyYWI4NGVm/zUyZjk0ZjBm/zg2NmI5NTcw/zZiOWQ3ZmIw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 391168, - "lower_bound": "AWMyYWI5NGQ3/zM1Yzc0ZjYy/2I1NjdiYzYy/zhjZDdhN2M0/wAAAAAAAAAA9w==", - "upper_bound": "AWMzYWY4NGFh/zkwYTc0Mjdi/2IzYTRmODQ1/zY2MTVjYjcy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 393216, - "lower_bound": "AWMzYWY5MDNh/2I2ZDY0OWRh/zhiMjUxZWQ2/zEzY2MyMTQ1/wAAAAAAAAAA9w==", - "upper_bound": "AWM0YjFlZTJl/2MzNDc0YTg3/2I1ZDA1NGQ5/zEwMzgxMDc0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 395264, - "lower_bound": "AWM0YjIwMTE5/zBkMDI0Y2I3/zhhMjNjOWQ5/zA5MzA4MzBj/wAAAAAAAAAA9w==", - "upper_bound": "AWM1YWQxNzIy/zRiMTc0MjAx/2I3OTFkY2M0/2NkNGEyMjg3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 397312, - "lower_bound": "AWM1YWQ0YmJh/zE3Y2U0ZTJj/zljNGMzYjIy/zhlM2VlZjlj/wAAAAAAAAAA9w==", - "upper_bound": "AWM2YmI5NzY3/zJkNjk0ZDI4/zg5YzUzOWVk/2ViZTIwMGI4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 399360, - "lower_bound": "AWM2YmI5ODM3/zU4NzI0MzQ5/2IyMWE3NTEw/zk3ODc3MWVm/wAAAAAAAAAA9w==", - "upper_bound": "AWM3YmY5NGEw/zdkYmY0Nzg4/zhmMDM3MzI1/2U4ODUxMzhh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 401408, - "lower_bound": "AWM3YmZhNmNl/zA2OGI0NjQy/2I5MDc4YjY5/2NkMmJkNTc4/wAAAAAAAAAA9w==", - "upper_bound": "AWM4YmJhZTIz/2ExNDI0MmFl/2IzZDBlNWEy/zAxNWE3ZWEz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 403456, - "lower_bound": "AWM4YmJjMjk3/2ZlNjY0Yjk4/2E1ZDhiMDQ3/2IxOTRhNDY5/wAAAAAAAAAA9w==", - "upper_bound": "AWM5YzE5YTlh/zk4M2Q0ZTE1/2EyZWRkYzA2/zAwNjk4NWM4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 405504, - "lower_bound": "AWM5YzFkY2Y3/zZkMGQ0M2Q3/zliYmI4OTM3/zcwMGQyYWEz/wAAAAAAAAAA9w==", - "upper_bound": "AWNhZDE4YjEw/zQ1OGE0NDll/zk3ODM0ZmU2/zM3YzdkYjdk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 407552, - "lower_bound": "AWNhZDE5MDEz/2ZmOGI0NTFh/zkwZTUzMWM3/zYzNDk1MDc0/wAAAAAAAAAA9w==", - "upper_bound": "AWNiZDIyZGRi/zllZjE0NDYx/zhmZGFiYTg0/2I2OTA1Yzky/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 409600, - "lower_bound": "AWNiZDI2ZDk0/zVkNmQ0MGNm/zhjMjMzNzkx/zRlNzNjN2Q2/wAAAAAAAAAA9w==", - "upper_bound": "AWNjZDgxNDVi/zk3YjA0NWRl/2IxNjkxNDgy/2FhNzgwM2Nh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 411648, - "lower_bound": "AWNjZDgxYjIx/2RlNzE0MjQ4/zg1ZGZiOGIx/zY5MTAzNmVl/wAAAAAAAAAA9w==", - "upper_bound": "AWNkZGUwOWY5/zVjNmM0NzUz/zk0NmU5ODlk/zY0MzNiMTgy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 413696, - "lower_bound": "AWNkZGUyMTQ5/zJhNGU0Nzc5/zg3ZWNjMWZk/zY1YTcwMjdh/wAAAAAAAAAA9w==", - "upper_bound": "AWNlZWRkN2Vj/2MxOWI0MDZh/zkzMTgxMjYz/2YxM2E2NGI1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 415744, - "lower_bound": "AWNlZWViYTBh/zUyY2Y0NzIw/2I2MGFjZTZm/zIxM2FiMDc0/wAAAAAAAAAA9w==", - "upper_bound": "AWNmZjMzYjU1/zIyZmM0MDJl/2E4Njk1MzUx/zAyNzFlOTll/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 417792, - "lower_bound": "AWNmZjM1MGVi/2E2MjM0MDFi/2EyYWNlZmE1/2Q3MTg4YzEz/wAAAAAAAAAA9w==", - "upper_bound": "AWQwZmU5N2Vk/zRkNzU0YWE5/2IxZTU5MWVl/zdmYjI3ODYy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 419840, - "lower_bound": "AWQwZmVjMDVk/zcxOWU0NTgx/2I3NGRkOTMz/2JlOGRmMjAx/wAAAAAAAAAA9w==", - "upper_bound": "AWQyMDUyZDY4/2E4YmM0ZjBm/zllNmYyZDFj/2U2ZDc0MjY5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 421888, - "lower_bound": "AWQyMDU0NmZl/zcwOTc0M2Fm/zg3ZjRlZGM0/2Y1OTM1Nzg0/wAAAAAAAAAA9w==", - "upper_bound": "AWQzMDFmYmZm/zkxYjQ0NGQx/2IwNjIyMWYx/2M0ZDQzMTAw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 423936, - "lower_bound": "AWQzMDI1NGNi/zY3OTE0Mzli/2EzYWUyZjJm/zI2NjBmNWEw/wAAAAAAAAAA9w==", - "upper_bound": "AWQ0MDMxNTcz/2RmMjY0NjYy/zk3ZmI1YzEy/2Y5OGQ4Y2Nl/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 425984, - "lower_bound": "AWQ0MDM3ODll/2NhZGI0ZGY0/2I3ZDQ3ZmE2/2JmNjg2NmIw/wAAAAAAAAAA9w==", - "upper_bound": "AWQ0ZmQ2MzZk/zA3NjM0YWRk/2FmZWQ4YzVk/zEyMTdhYWY3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 428032, - "lower_bound": "AWQ0ZmQ4Mzdh/2Q3OTI0YWRj/zkxNzI2MDcx/zdkMjNjODli/wAAAAAAAAAA9w==", - "upper_bound": "AWQ2MDhhZDQ5/2FlYjQ0MTg1/2JjNTg3YjQz/zdhNGU1MTRi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 430080, - "lower_bound": "AWQ2MDhlY2Zk/2ZhZDM0NDkx/zk0MGRlMWQ2/zVlMDMxZDcy/wAAAAAAAAAA9w==", - "upper_bound": "AWQ3MDlmMWM0/zVhZGI0ZGI5/2FmYWFhYmMz/zZmZDc4ZjQz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 432128, - "lower_bound": "AWQ3MGEwMjE1/2MyNDM0NTE5/2IyNTY3Y2Qw/2ZjNzJiMzEx/wAAAAAAAAAA9w==", - "upper_bound": "AWQ4MTY1Yjk2/2Q1ZDY0NjZh/2JiZDc2ZGMx/2E0MTU0ZjI2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 434176, - "lower_bound": "AWQ4MTY2NjRk/2EzZDY0M2Uz/2ExNDYwMTcz/zlkNzFkNmE5/wAAAAAAAAAA9w==", - "upper_bound": "AWQ5MTZkOGRj/zFjMGE0NzNi/zk4MjkzZGQ5/zYxN2Y1ZjE0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 436224, - "lower_bound": "AWQ5MTZkYTMx/2Q1OGI0NWI5/zgyNzRhZTg3/zczZjNhMmFl/wAAAAAAAAAA9w==", - "upper_bound": "AWRhMTRlYzhk/zhiMDA0MWYz/2FkYjU4MDkw/zg4NDhhZmNj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 438272, - "lower_bound": "AWRhMTRmMWFm/zQzM2I0ZmZm/zlhNWJiNmUz/zcxZjUwZGNj/wAAAAAAAAAA9w==", - "upper_bound": "AWRiMjEwNDcw/zkyNjM0NWEx/zgxZTE3ZTdj/zM3OGY2OTFh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 440320, - "lower_bound": "AWRiMjExMjAz/zIwNzA0NzQy/zhmZjRkODFj/zk3OThiZWRm/wAAAAAAAAAA9w==", - "upper_bound": "AWRjMjlkZjk3/zBlMjk0ZTk2/zhmM2VjNWQy/2JjNjJmNGI3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 442368, - "lower_bound": "AWRjMmExODIw/2Q1Mjc0MzZh/zk4MmI1MmFl/2RjYzdjNGMz/wAAAAAAAAAA9w==", - "upper_bound": "AWRkMjQ2YTg3/2E4ZDE0NTIw/zg0YmY4MWZh/zA1NDFlOTFh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 444416, - "lower_bound": "AWRkMjRhNGY5/2QzMDI0N2Iy/2JhMTFjZTBi/zI2N2M4NzVi/wAAAAAAAAAA9w==", - "upper_bound": "AWRlMzBiOGZl/2U0YmU0NjQ2/zkyNDBmNjIw/zUxYzgzYTEz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 446464, - "lower_bound": "AWRlMzBiZWUy/zY3NGM0N2Nm/2I5MDU3MGNi/zBhNjI5OWEx/wAAAAAAAAAA9w==", - "upper_bound": "AWRmMmQ1MjJm/zNlNmM0YTMx/2IxY2Q0ZmQ3/2ZkYmY5MzFi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 448512, - "lower_bound": "AWRmMmQ2NmY5/2Y4YWY0ZDcx/2I0ZjYyODk5/2MyYjMxNDQx/wAAAAAAAAAA9w==", - "upper_bound": "AWUwMzJkNjQ3/zc4ZmM0ODM1/2E0Yzk4MmJj/zMzMmI2OWQ1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 450560, - "lower_bound": "AWUwMzJkYzE5/zgxZTY0ZTZk/zhlOTIwNWQz/2M5OGRiMDcy/wAAAAAAAAAA9w==", - "upper_bound": "AWUxMzFmYjU0/2UyZGI0M2I0/2FjZTE2ZDVm/zYxZjdhZGIy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 452608, - "lower_bound": "AWUxMzIxZTZl/zYxZGE0Y2Vi/zg2YTZlMDZi/2I0YzQ1ZWZh/wAAAAAAAAAA9w==", - "upper_bound": "AWUyMzRlNmQy/zdhNzY0ZmVi/2FmOGUxZmE5/zc0Yzg3ZmU4/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 454656, - "lower_bound": "AWUyMzRmN2Ew/zFjZDU0Njhj/2FmYjdhNGIz/zU3NjIyNDYz/wAAAAAAAAAA9w==", - "upper_bound": "AWUzNDQxYzdh/2I4ZjY0Mjlk/2E3M2YwNmVj/zQ1NzQ0ZWQw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 456704, - "lower_bound": "AWUzNDQ4MWVm/zA1NGI0MmQ0/zg2MTVmYTNk/zAyOGZhNjY1/wAAAAAAAAAA9w==", - "upper_bound": "AWU0NDI4ZTgw/2Q2YjA0Njkx/2IwMTZmYWFm/2VjOWU3NWZm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 458752, - "lower_bound": "AWU0NDJhN2Vk/zQ0OWY0MGQx/zg5ZDE1NDFl/zhmZWVlODI2/wAAAAAAAAAA9w==", - "upper_bound": "AWU1NDViZmVi/zQwNzg0YTk0/zg4ZGE3NjRh/zM4OTgyODNi/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 460800, - "lower_bound": "AWU1NDVkYTcy/2FhNzE0NWI4/zllMjQxOTM5/zA2YTQ3NzNi/wAAAAAAAAAA9w==", - "upper_bound": "AWU2NDljOTM2/zMzNjE0MjQ3/zk3NTBjZmVh/zEzMzg3NjVk/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 462848, - "lower_bound": "AWU2NDllZTEy/2EzODM0NjNj/2EwZWE3OTRi/2NjYmRkNzA2/wAAAAAAAAAA9w==", - "upper_bound": "AWU3NTVjZmY4/zU5MTI0YTdh/2I0NTc1MTA1/zE4YWJiYjA3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 464896, - "lower_bound": "AWU3NTVkMGQx/2E3Mjc0ZDIw/2ExN2M3ZTU4/zQzZjYwOGE1/wAAAAAAAAAA9w==", - "upper_bound": "AWU4NTk4NGQ2/2FmMTU0NzQx/2E4ZTRkZjJk/2Y1NzAzMGY0/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 466944, - "lower_bound": "AWU4NTk4ZTVi/2I4YTI0OGE1/2E5MGYzZjUz/zY4ZTEzMDEx/wAAAAAAAAAA9w==", - "upper_bound": "AWU5NWZkYjg3/zc0OGM0MmEw/2I1NjRkN2Qy/zlhYzNmYTk2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 468992, - "lower_bound": "AWU5NWZlM2Qx/2U2Y2M0NmIy/zhmZjJhYWNh/2NjNTk4YmE4/wAAAAAAAAAA9w==", - "upper_bound": "AWVhNjY0NzM1/zYwN2Q0NTU5/2JiYmNlYmFk/zRjZTgzODlh/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 471040, - "lower_bound": "AWVhNjY1Nzll/zE3NDg0NzBh/2JmYjk4MWIx/2U4ODQ2ZGZj/wAAAAAAAAAA9w==", - "upper_bound": "AWViNmZlNDEy/2YzNmY0ODNi/zg1NmFjMmY1/zhjMzJkMGZj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 473088, - "lower_bound": "AWViNmZmYTY4/zRhNDM0OTli/zkzZWRiZGEz/zRmZWRjMTI3/wAAAAAAAAAA9w==", - "upper_bound": "AWVjNzRkMWFl/zAyNjY0MTky/2JiZWZjOTBk/zljNjE3OGE3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 475136, - "lower_bound": "AWVjNzUyNjE2/2YxNWI0NmM5/2IyYmY0Yzk0/zgzNDZhNWM1/wAAAAAAAAAA9w==", - "upper_bound": "AWVkODE5MGE1/2FjYWQ0MWZh/zg3YjM1Njlh/zkwNGQwYmM5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 477184, - "lower_bound": "AWVkODFjMjg2/2FiNTQ0MTA2/zhlNGU2MDY1/zM1YzY0ZGVi/wAAAAAAAAAA9w==", - "upper_bound": "AWVlOGFjY2Yy/zNjZGU0MjYy/zkwNjM0MWVm/2M1Njk5ZjQz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 479232, - "lower_bound": "AWVlOGFkNmNj/zNkZTc0OTky/zhlZmFhNTZk/zk3YzRmMzcx/wAAAAAAAAAA9w==", - "upper_bound": "AWVmOTI1MjM0/2MzYjE0MzM2/zllOTUyNDMz/zJiY2MxOWQy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 481280, - "lower_bound": "AWVmOTI1M2E3/2Y3MTI0ZTBk/zgyNGU5NDE0/zQ5OGJlNjA3/wAAAAAAAAAA9w==", - "upper_bound": "AWYwOThmZWMy/zI5OGU0MDcw/2JkNWIzZDg3/zJjNTk5ZDcy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 483328, - "lower_bound": "AWYwOTkwMTk1/zc0ZDA0NjRh/zhjMmQ2OGNl/2FhNzM3YzM2/wAAAAAAAAAA9w==", - "upper_bound": "AWYxOTgyMWI5/2M1NTY0MDdj/zkyNjE2ZjA0/2YwN2Q3MzE3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 485376, - "lower_bound": "AWYxOTgyOTJl/zFlMmI0ZDRl/zg1NWY2YWRh/zc1MDJlNGY3/wAAAAAAAAAA9w==", - "upper_bound": "AWYyYTBhZWI2/2U5YjA0MTk2/zk2NmY1NzBj/zhiZTE1MWUy/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 487424, - "lower_bound": "AWYyYTBjYjM1/zZjYjc0MDZi/zgyODlmZTM4/zc3MmIzYjA3/wAAAAAAAAAA9w==", - "upper_bound": "AWYzYTc5ZTcz/2EzNjk0NTFh/zlkNjg3NzRj/zJhMDRjMjJm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 489472, - "lower_bound": "AWYzYTdmMjg3/zk3NzI0OGI5/2EwOWMyNThm/zU5MjY4ZWMw/wAAAAAAAAAA9w==", - "upper_bound": "AWY0YWZiN2Y0/2E2NmI0NWQ5/2EyOGFlZmRl/2VmMzcwNTky/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 491520, - "lower_bound": "AWY0YWZlMDkz/zAzNzQ0YjYw/2I1N2FlMGM2/zZjNTZiZDEy/wAAAAAAAAAA9w==", - "upper_bound": "AWY1YjM2ZDMw/2Y5YmQ0ZDhh/zkzN2EzYzU5/2EzZmZhYzRj/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 493568, - "lower_bound": "AWY1YjNlZTE1/2Q5ZmQ0YjFm/2IxN2EyZGY1/zBmNzM5YzA1/wAAAAAAAAAA9w==", - "upper_bound": "AWY2YjcyNDBm/zRlOWU0MTNm/2ExMjUyOTRl/2JkYTQwMTIw/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 495616, - "lower_bound": "AWY2YjczNDVh/zk5ZjY0NGI4/zg4NDkzODM5/zdhZDlmMzcy/wAAAAAAAAAA9w==", - "upper_bound": "AWY3YzU3ZDVj/zJjNjY0ZTgy/zhhM2Y2Y2Ex/zhhMDRlNDkz/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 497664, - "lower_bound": "AWY3YzU4NmU0/zdjZjU0YjIx/zk2Y2VjMGNj/2VmYzRjM2Y5/wAAAAAAAAAA9w==", - "upper_bound": "AWY4Y2U1Zjk2/zgzMTU0OTUx/2EyZmUxZTY1/zM0NGZiMzYx/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 499712, - "lower_bound": "AWY4Y2ViZmZk/zhmMjA0OGRk/zhhODc3Nzgy/zNlMDA5MzVh/wAAAAAAAAAA9w==", - "upper_bound": "AWY5ZGY4YWIx/zMzOWU0YjVj/2JlMjBhZjkz/zU2ZGM4ZDk2/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 501760, - "lower_bound": "AWY5ZGZjMTQz/2U2YzQ0YmU3/2I1ZjFiOTZj/zcwNTY0OTY0/wAAAAAAAAAA9w==", - "upper_bound": "AWZhZTU3YmY3/2RmMzI0NWUy/2IwYmQ3MWVl/zQyYzM0OTlm/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 503808, - "lower_bound": "AWZhZTVhNDk4/zcyMzE0NjIw/2E3NjcyNDc4/zk2NjMzOWMy/wAAAAAAAAAA9w==", - "upper_bound": "AWZiZjNhZmYy/zQ3NzE0NTBl/zhhMWQ3YjNm/2U4MmE0OWE5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 505856, - "lower_bound": "AWZiZjNkYWVm/zM1MTI0ODg2/zg2OWIwY2Ex/zNkNTQ0NWRl/wAAAAAAAAAA9w==", - "upper_bound": "AWZjZmZlNTQ3/zc5NDI0OWRh/zhjNGNmMzg0/zFiNGJjY2Q5/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 507904, - "lower_bound": "AWZkMDAzMWVk/zkxN2I0ODM5/zgzNGJhYTUz/zdjYTYwYjVh/wAAAAAAAAAA9w==", - "upper_bound": "AWZlMDA5NzM0/zJkYTQ0NWQ5/2E5N2UwZjRh/2MxZjA3MTM1/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 509952, - "lower_bound": "AWZlMDA5OTg3/zZiZjc0ZGVh/2IzZmQ3Y2Rh/zJjYjI4ZWUx/wAAAAAAAAAA9w==", - "upper_bound": "AWZmMDRkM2Q4/zg3MTM0OTY2/zgzMGYyYTk1/zA3YzdjNjQ3/wAAAAAAAAAA9w==", - "repeats": 1 - }, - { - "count": 511887, - "lower_bound": "AWZmMDRlYWE1/2U2MjA0ZTg4/2IxMWM1ZDJi/zA1YTIxMjkz/wAAAAAAAAAA9w==", - "upper_bound": "AXNzc3MAAAAA+w==", - "repeats": 1 - } - ] - }, - "cm_sketch": { - "rows": [ - { - "counters": [ - 252, - 232, - 239, - 219, - 242, - 256, - 225, - 224, - 220, - 264, - 253, - 244, - 256, - 259, - 247, - 241, - 259, - 238, - 229, - 257, - 259, - 229, - 274, - 243, - 243, - 257, - 246, - 254, - 246, - 226, - 245, - 253, - 262, - 252, - 243, - 270, - 262, - 248, - 255, - 237, - 263, - 285, - 258, - 235, - 259, - 243, - 252, - 238, - 226, - 275, - 255, - 229, - 232, - 265, - 248, - 246, - 236, - 240, - 234, - 208, - 264, - 252, - 230, - 253, - 262, - 261, - 264, - 240, - 272, - 255, - 260, - 276, - 261, - 244, - 261, - 243, - 258, - 242, - 254, - 244, - 273, - 224, - 255, - 253, - 250, - 209, - 261, - 256, - 263, - 239, - 243, - 262, - 250, - 227, - 257, - 242, - 249, - 251, - 262, - 245, - 252, - 244, - 262, - 241, - 258, - 279, - 251, - 254, - 271, - 214, - 255, - 252, - 258, - 251, - 257, - 250, - 241, - 265, - 261, - 243, - 255, - 244, - 267, - 269, - 254, - 257, - 256, - 219, - 260, - 243, - 260, - 270, - 277, - 274, - 252, - 247, - 247, - 247, - 256, - 272, - 230, - 231, - 246, - 230, - 223, - 270, - 243, - 251, - 224, - 242, - 247, - 232, - 270, - 243, - 235, - 266, - 229, - 270, - 210, - 253, - 217, - 242, - 217, - 222, - 278, - 228, - 236, - 252, - 253, - 240, - 236, - 220, - 269, - 268, - 232, - 256, - 231, - 255, - 254, - 213, - 265, - 218, - 260, - 201, - 254, - 276, - 233, - 188, - 258, - 239, - 272, - 221, - 233, - 288, - 234, - 261, - 279, - 226, - 233, - 244, - 263, - 267, - 268, - 245, - 249, - 263, - 244, - 247, - 258, - 263, - 277, - 247, - 260, - 247, - 243, - 259, - 237, - 260, - 243, - 274, - 231, - 238, - 246, - 216, - 211, - 269, - 262, - 256, - 232, - 268, - 245, - 250, - 271, - 249, - 260, - 242, - 242, - 247, - 225, - 239, - 263, - 316, - 249, - 255, - 243, - 233, - 269, - 269, - 268, - 280, - 250, - 249, - 235, - 256, - 253, - 228, - 255, - 241, - 245, - 275, - 254, - 256, - 262, - 277, - 237, - 244, - 258, - 231, - 270, - 256, - 253, - 242, - 224, - 252, - 250, - 260, - 247, - 231, - 272, - 215, - 240, - 275, - 245, - 242, - 244, - 286, - 248, - 258, - 246, - 255, - 247, - 251, - 246, - 245, - 266, - 256, - 254, - 247, - 251, - 221, - 266, - 258, - 239, - 261, - 255, - 232, - 247, - 232, - 224, - 244, - 262, - 262, - 249, - 247, - 245, - 256, - 248, - 231, - 230, - 213, - 235, - 280, - 233, - 245, - 265, - 240, - 269, - 269, - 228, - 221, - 229, - 269, - 231, - 238, - 259, - 238, - 242, - 250, - 252, - 262, - 257, - 264, - 249, - 264, - 274, - 252, - 254, - 270, - 239, - 253, - 229, - 225, - 238, - 244, - 260, - 246, - 251, - 230, - 241, - 240, - 253, - 236, - 222, - 254, - 269, - 257, - 243, - 235, - 268, - 281, - 219, - 252, - 248, - 255, - 250, - 269, - 278, - 244, - 236, - 264, - 255, - 256, - 248, - 255, - 244, - 264, - 270, - 250, - 213, - 274, - 263, - 229, - 248, - 237, - 253, - 254, - 250, - 243, - 250, - 242, - 241, - 236, - 276, - 276, - 268, - 247, - 227, - 250, - 225, - 269, - 235, - 271, - 219, - 247, - 238, - 263, - 228, - 291, - 261, - 237, - 226, - 247, - 271, - 229, - 226, - 246, - 247, - 262, - 264, - 247, - 267, - 264, - 248, - 272, - 270, - 250, - 225, - 240, - 242, - 237, - 271, - 292, - 284, - 242, - 281, - 266, - 269, - 257, - 263, - 264, - 238, - 261, - 235, - 227, - 250, - 247, - 248, - 245, - 243, - 224, - 246, - 272, - 253, - 283, - 271, - 255, - 234, - 237, - 242, - 236, - 237, - 223, - 260, - 270, - 228, - 251, - 278, - 263, - 266, - 286, - 255, - 222, - 275, - 230, - 233, - 271, - 266, - 239, - 243, - 238, - 249, - 224, - 259, - 228, - 265, - 230, - 250, - 278, - 268, - 281, - 236, - 259, - 244, - 259, - 250, - 230, - 233, - 247, - 250, - 236, - 263, - 243, - 270, - 261, - 242, - 248, - 284, - 228, - 241, - 250, - 247, - 225, - 249, - 259, - 249, - 215, - 229, - 240, - 271, - 260, - 262, - 240, - 237, - 262, - 254, - 221, - 252, - 253, - 256, - 247, - 246, - 250, - 257, - 248, - 273, - 246, - 262, - 226, - 249, - 234, - 240, - 245, - 244, - 273, - 250, - 260, - 251, - 259, - 248, - 234, - 256, - 216, - 248, - 254, - 266, - 252, - 234, - 259, - 235, - 253, - 234, - 264, - 262, - 242, - 249, - 242, - 256, - 246, - 249, - 266, - 249, - 233, - 251, - 241, - 257, - 255, - 230, - 241, - 251, - 245, - 238, - 270, - 237, - 225, - 257, - 258, - 213, - 266, - 247, - 242, - 266, - 231, - 237, - 251, - 270, - 258, - 247, - 237, - 239, - 254, - 246, - 241, - 268, - 234, - 262, - 274, - 261, - 242, - 233, - 252, - 281, - 247, - 264, - 256, - 236, - 269, - 265, - 247, - 255, - 247, - 246, - 233, - 229, - 272, - 251, - 246, - 248, - 224, - 268, - 257, - 248, - 265, - 223, - 234, - 257, - 260, - 231, - 255, - 249, - 271, - 272, - 235, - 236, - 282, - 251, - 268, - 240, - 273, - 238, - 262, - 233, - 266, - 236, - 255, - 243, - 239, - 243, - 270, - 238, - 252, - 253, - 260, - 244, - 262, - 243, - 248, - 229, - 260, - 239, - 234, - 252, - 256, - 251, - 260, - 236, - 288, - 239, - 270, - 259, - 230, - 247, - 256, - 246, - 233, - 248, - 229, - 249, - 254, - 269, - 241, - 237, - 267, - 246, - 266, - 250, - 277, - 219, - 247, - 280, - 244, - 247, - 272, - 238, - 271, - 236, - 239, - 243, - 288, - 239, - 260, - 243, - 279, - 266, - 242, - 260, - 272, - 269, - 218, - 243, - 255, - 268, - 261, - 225, - 252, - 220, - 255, - 245, - 230, - 244, - 252, - 213, - 242, - 258, - 263, - 252, - 260, - 229, - 235, - 225, - 257, - 244, - 268, - 240, - 251, - 250, - 287, - 246, - 254, - 257, - 249, - 239, - 233, - 238, - 232, - 255, - 240, - 240, - 274, - 257, - 262, - 211, - 240, - 245, - 255, - 240, - 262, - 240, - 276, - 239, - 262, - 255, - 259, - 275, - 226, - 225, - 264, - 247, - 222, - 255, - 264, - 253, - 247, - 263, - 247, - 233, - 218, - 242, - 239, - 224, - 256, - 242, - 244, - 237, - 271, - 251, - 258, - 247, - 254, - 249, - 275, - 267, - 243, - 269, - 222, - 255, - 249, - 241, - 253, - 261, - 270, - 271, - 268, - 249, - 228, - 224, - 251, - 270, - 250, - 262, - 251, - 278, - 243, - 238, - 266, - 232, - 298, - 272, - 284, - 244, - 270, - 247, - 241, - 226, - 250, - 210, - 259, - 234, - 252, - 240, - 269, - 245, - 266, - 252, - 247, - 283, - 223, - 247, - 249, - 257, - 237, - 271, - 250, - 241, - 259, - 231, - 257, - 233, - 222, - 265, - 267, - 260, - 277, - 232, - 277, - 260, - 260, - 255, - 237, - 233, - 230, - 256, - 231, - 227, - 275, - 220, - 278, - 231, - 247, - 274, - 234, - 253, - 246, - 258, - 281, - 261, - 249, - 246, - 238, - 264, - 282, - 232, - 213, - 264, - 257, - 276, - 246, - 257, - 237, - 242, - 225, - 219, - 250, - 249, - 248, - 238, - 248, - 226, - 248, - 250, - 248, - 233, - 242, - 222, - 253, - 235, - 248, - 242, - 255, - 237, - 254, - 251, - 252, - 263, - 272, - 267, - 249, - 272, - 222, - 266, - 258, - 250, - 233, - 258, - 265, - 247, - 252, - 273, - 226, - 269, - 252, - 257, - 236, - 243, - 229, - 256, - 265, - 253, - 246, - 250, - 238, - 260, - 257, - 248, - 225, - 258, - 232, - 241, - 240, - 260, - 258, - 273, - 264, - 250, - 265, - 254, - 308, - 257, - 250, - 254, - 258, - 277, - 242, - 272, - 235, - 266, - 232, - 273, - 254, - 249, - 240, - 245, - 232, - 237, - 275, - 227, - 239, - 238, - 258, - 255, - 268, - 245, - 257, - 241, - 253, - 292, - 247, - 247, - 203, - 253, - 239, - 243, - 271, - 267, - 261, - 237, - 239, - 224, - 242, - 244, - 261, - 227, - 249, - 257, - 228, - 243, - 228, - 258, - 248, - 251, - 256, - 243, - 266, - 238, - 271, - 240, - 265, - 244, - 230, - 250, - 252, - 271, - 247, - 245, - 241, - 258, - 268, - 241, - 254, - 236, - 241, - 246, - 270, - 243, - 263, - 274, - 250, - 213, - 243, - 231, - 254, - 242, - 255, - 241, - 231, - 242, - 239, - 248, - 223, - 266, - 255, - 286, - 250, - 254, - 228, - 234, - 250, - 219, - 243, - 286, - 214, - 271, - 266, - 218, - 262, - 263, - 246, - 244, - 247, - 216, - 249, - 242, - 233, - 258, - 245, - 231, - 255, - 249, - 241, - 248, - 242, - 220, - 233, - 267, - 271, - 269, - 248, - 257, - 241, - 234, - 270, - 255, - 240, - 255, - 261, - 231, - 254, - 228, - 240, - 239, - 285, - 270, - 266, - 233, - 265, - 220, - 259, - 228, - 247, - 246, - 252, - 248, - 245, - 270, - 254, - 269, - 260, - 246, - 243, - 264, - 259, - 258, - 227, - 263, - 218, - 243, - 235, - 294, - 256, - 278, - 238, - 244, - 276, - 232, - 248, - 245, - 245, - 260, - 228, - 260, - 234, - 238, - 243, - 219, - 259, - 250, - 246, - 257, - 264, - 227, - 249, - 262, - 250, - 250, - 259, - 237, - 259, - 270, - 242, - 256, - 256, - 242, - 246, - 248, - 284, - 243, - 281, - 256, - 231, - 245, - 241, - 229, - 239, - 224, - 249, - 274, - 227, - 267, - 262, - 252, - 253, - 252, - 269, - 244, - 279, - 269, - 255, - 244, - 225, - 261, - 262, - 253, - 250, - 251, - 242, - 259, - 259, - 233, - 269, - 261, - 237, - 256, - 267, - 248, - 236, - 248, - 248, - 229, - 255, - 251, - 258, - 256, - 253, - 258, - 282, - 242, - 251, - 246, - 240, - 251, - 257, - 244, - 249, - 270, - 268, - 252, - 252, - 267, - 245, - 257, - 264, - 251, - 253, - 237, - 269, - 236, - 214, - 263, - 235, - 255, - 263, - 257, - 275, - 243, - 245, - 249, - 244, - 270, - 261, - 274, - 244, - 233, - 222, - 253, - 263, - 270, - 250, - 259, - 229, - 277, - 284, - 243, - 259, - 239, - 283, - 276, - 246, - 238, - 260, - 216, - 258, - 263, - 251, - 228, - 256, - 241, - 232, - 232, - 264, - 258, - 243, - 240, - 242, - 255, - 253, - 235, - 260, - 227, - 271, - 237, - 230, - 230, - 247, - 266, - 238, - 252, - 275, - 255, - 246, - 250, - 252, - 269, - 253, - 260, - 244, - 236, - 249, - 255, - 232, - 251, - 239, - 248, - 249, - 250, - 243, - 237, - 281, - 247, - 243, - 246, - 279, - 260, - 226, - 245, - 271, - 206, - 246, - 259, - 237, - 259, - 256, - 258, - 247, - 269, - 277, - 248, - 255, - 241, - 260, - 276, - 236, - 256, - 276, - 245, - 228, - 249, - 227, - 258, - 244, - 263, - 227, - 264, - 238, - 292, - 262, - 272, - 268, - 264, - 237, - 254, - 265, - 230, - 232, - 238, - 258, - 274, - 268, - 231, - 254, - 254, - 252, - 230, - 239, - 260, - 279, - 261, - 259, - 259, - 228, - 255, - 254, - 242, - 236, - 252, - 262, - 232, - 253, - 233, - 264, - 229, - 246, - 242, - 235, - 272, - 254, - 226, - 258, - 230, - 268, - 243, - 253, - 263, - 244, - 257, - 264, - 259, - 248, - 263, - 253, - 240, - 238, - 244, - 256, - 249, - 247, - 276, - 265, - 264, - 253, - 243, - 247, - 249, - 279, - 244, - 257, - 253, - 275, - 251, - 236, - 253, - 209, - 243, - 263, - 252, - 254, - 271, - 270, - 266, - 233, - 245, - 240, - 267, - 244, - 243, - 245, - 256, - 207, - 254, - 261, - 219, - 248, - 269, - 260, - 248, - 254, - 248, - 264, - 269, - 273, - 264, - 241, - 259, - 261, - 249, - 261, - 285, - 237, - 267, - 269, - 262, - 254, - 246, - 247, - 277, - 260, - 263, - 268, - 247, - 255, - 244, - 235, - 259, - 269, - 273, - 224, - 272, - 242, - 236, - 249, - 244, - 253, - 258, - 236, - 252, - 242, - 281, - 272, - 258, - 251, - 256, - 234, - 219, - 237, - 248, - 234, - 226, - 252, - 230, - 267, - 289, - 250, - 250, - 264, - 252, - 257, - 248, - 233, - 224, - 242, - 241, - 210, - 255, - 249, - 267, - 260, - 265, - 254, - 215, - 266, - 258, - 227, - 226, - 251, - 257, - 235, - 234, - 233, - 254, - 252, - 271, - 260, - 269, - 222, - 231, - 265, - 243, - 247, - 240, - 246, - 287, - 228, - 262, - 229, - 244, - 245, - 268, - 225, - 241, - 225, - 262, - 232, - 256, - 235, - 252, - 280, - 261, - 259, - 249, - 256, - 271, - 247, - 265, - 265, - 276, - 228, - 276, - 258, - 256, - 233, - 256, - 253, - 244, - 255, - 235, - 260, - 235, - 246, - 253, - 238, - 262, - 271, - 254, - 259, - 234, - 245, - 259, - 279, - 271, - 246, - 243, - 250, - 272, - 260, - 231, - 244, - 231, - 223, - 232, - 225, - 277, - 255, - 243, - 231, - 255, - 276, - 264, - 254, - 242, - 251, - 223, - 240, - 257, - 276, - 258, - 239, - 260, - 244, - 233, - 269, - 230, - 237, - 239, - 252, - 254, - 234, - 261, - 233, - 269, - 241, - 255, - 260, - 218, - 266, - 223, - 230, - 245, - 254, - 279, - 253, - 243, - 243, - 257, - 226, - 253, - 256, - 230, - 239, - 252, - 237, - 260, - 230, - 256, - 258, - 248, - 263, - 266, - 239, - 238, - 239, - 252, - 264, - 241, - 257, - 234, - 240, - 265, - 223, - 248, - 246, - 245, - 264, - 242, - 216, - 259, - 237, - 287, - 231, - 262, - 247, - 235, - 254, - 245, - 229, - 244, - 225, - 247, - 276, - 257, - 223, - 252, - 251, - 265, - 253, - 249, - 258, - 274, - 260, - 253, - 239, - 256, - 243, - 222, - 247, - 256, - 240, - 243, - 257, - 226, - 246, - 235, - 236, - 271, - 235, - 258, - 246, - 240, - 236, - 254, - 267, - 214, - 253, - 226, - 245, - 277, - 233, - 285, - 259, - 254, - 233, - 259, - 244, - 273, - 269, - 255, - 247, - 241, - 252, - 253, - 266, - 252, - 277, - 239, - 238, - 246, - 271, - 245, - 237, - 255, - 222, - 239, - 244, - 241, - 223, - 247, - 251, - 261, - 254, - 261, - 269, - 235, - 270, - 254, - 267, - 244, - 241, - 271, - 262, - 255, - 261, - 259, - 259, - 245, - 260, - 265, - 272, - 250, - 251, - 263, - 247, - 273, - 255, - 267, - 256, - 212, - 247, - 234, - 275, - 243, - 234, - 227, - 248, - 257, - 275, - 257, - 250, - 237, - 245, - 230, - 226, - 250, - 239, - 251, - 229, - 261, - 217, - 265, - 259, - 258, - 223, - 268, - 254, - 258, - 266, - 237, - 258, - 235, - 244, - 247, - 273, - 239, - 260, - 266, - 263, - 240, - 253, - 238, - 284, - 219, - 257, - 236, - 261, - 248, - 232, - 252, - 246, - 257, - 246, - 272, - 223, - 234, - 257, - 250, - 246, - 247, - 263, - 267, - 221, - 250, - 267, - 252, - 265, - 273, - 245, - 229, - 278, - 257, - 214, - 258, - 256, - 238, - 293, - 241, - 280, - 243, - 268, - 250, - 265, - 262, - 260, - 225, - 253, - 272, - 249, - 261, - 251, - 236, - 256, - 241, - 261, - 246, - 253, - 265, - 259, - 243, - 265, - 253, - 246, - 274, - 263, - 214, - 262, - 231, - 264, - 270, - 247, - 278, - 262, - 261, - 255, - 272, - 245, - 257, - 254, - 245, - 226, - 224, - 248, - 266, - 262, - 235, - 232, - 233, - 244, - 260, - 235, - 247, - 268, - 229, - 234, - 247, - 248, - 247, - 217, - 254, - 220, - 217, - 262, - 256, - 274, - 229, - 235, - 242, - 252, - 242, - 241, - 249, - 276, - 253, - 268, - 240, - 261, - 246, - 234, - 274, - 281, - 231, - 254, - 229, - 226, - 258, - 249, - 263, - 266, - 241, - 262, - 237, - 240, - 261, - 247, - 257, - 238, - 265, - 246, - 268, - 282, - 236, - 243, - 260, - 252, - 217, - 248, - 247, - 239, - 244, - 247, - 266, - 243, - 255, - 261, - 234, - 248, - 247, - 246, - 269, - 253, - 257, - 240, - 243, - 208, - 257, - 248, - 249, - 227, - 235, - 282, - 243, - 232, - 273, - 234, - 241, - 273, - 264, - 226, - 244, - 266, - 263, - 265, - 235, - 253, - 250, - 265, - 244, - 247, - 265, - 241, - 251, - 251, - 251, - 241 - ] - }, - { - "counters": [ - 242, - 246, - 263, - 257, - 274, - 218, - 253, - 240, - 238, - 260, - 249, - 238, - 251, - 273, - 247, - 232, - 267, - 248, - 272, - 237, - 279, - 254, - 271, - 243, - 231, - 273, - 259, - 255, - 239, - 261, - 246, - 241, - 241, - 220, - 250, - 220, - 244, - 267, - 234, - 259, - 262, - 248, - 257, - 258, - 241, - 257, - 263, - 251, - 256, - 246, - 259, - 246, - 247, - 233, - 262, - 271, - 268, - 239, - 231, - 230, - 246, - 235, - 252, - 232, - 259, - 267, - 260, - 271, - 252, - 238, - 220, - 261, - 246, - 238, - 237, - 219, - 274, - 224, - 262, - 254, - 250, - 249, - 250, - 266, - 239, - 280, - 261, - 265, - 224, - 241, - 278, - 239, - 256, - 242, - 264, - 263, - 273, - 226, - 257, - 228, - 257, - 239, - 248, - 244, - 240, - 249, - 237, - 232, - 244, - 254, - 231, - 244, - 261, - 229, - 265, - 253, - 248, - 253, - 223, - 247, - 249, - 241, - 249, - 231, - 262, - 215, - 273, - 232, - 229, - 229, - 257, - 270, - 251, - 219, - 232, - 254, - 224, - 283, - 226, - 232, - 242, - 237, - 260, - 248, - 254, - 220, - 256, - 212, - 229, - 277, - 251, - 256, - 280, - 249, - 260, - 271, - 229, - 244, - 222, - 202, - 230, - 271, - 242, - 237, - 231, - 243, - 219, - 251, - 262, - 242, - 269, - 225, - 250, - 259, - 239, - 234, - 260, - 243, - 280, - 225, - 261, - 254, - 216, - 254, - 237, - 276, - 250, - 273, - 264, - 258, - 261, - 229, - 264, - 235, - 255, - 246, - 236, - 249, - 235, - 255, - 255, - 243, - 258, - 262, - 259, - 230, - 275, - 232, - 247, - 266, - 237, - 231, - 286, - 211, - 228, - 244, - 266, - 244, - 231, - 267, - 278, - 269, - 254, - 256, - 250, - 250, - 218, - 236, - 252, - 266, - 236, - 252, - 251, - 257, - 257, - 254, - 269, - 257, - 229, - 270, - 254, - 251, - 239, - 256, - 231, - 247, - 220, - 294, - 281, - 258, - 225, - 283, - 259, - 232, - 249, - 259, - 223, - 240, - 247, - 224, - 256, - 245, - 261, - 252, - 266, - 254, - 264, - 253, - 246, - 277, - 263, - 264, - 257, - 231, - 239, - 255, - 242, - 259, - 259, - 240, - 233, - 227, - 262, - 252, - 290, - 228, - 266, - 233, - 260, - 252, - 234, - 252, - 263, - 249, - 255, - 249, - 243, - 253, - 268, - 264, - 262, - 258, - 248, - 251, - 249, - 241, - 240, - 262, - 237, - 248, - 254, - 236, - 244, - 241, - 258, - 265, - 242, - 294, - 260, - 228, - 233, - 269, - 247, - 232, - 283, - 250, - 273, - 246, - 269, - 246, - 236, - 251, - 224, - 239, - 251, - 270, - 209, - 230, - 248, - 240, - 247, - 265, - 261, - 259, - 242, - 237, - 222, - 236, - 220, - 257, - 263, - 246, - 240, - 279, - 230, - 254, - 218, - 227, - 262, - 226, - 238, - 258, - 239, - 255, - 237, - 241, - 194, - 251, - 247, - 246, - 253, - 226, - 256, - 255, - 249, - 241, - 220, - 228, - 282, - 243, - 255, - 222, - 249, - 261, - 248, - 250, - 235, - 247, - 252, - 237, - 232, - 232, - 260, - 228, - 260, - 263, - 257, - 251, - 257, - 225, - 292, - 258, - 264, - 237, - 230, - 249, - 222, - 247, - 233, - 245, - 240, - 249, - 240, - 238, - 252, - 224, - 261, - 250, - 265, - 256, - 286, - 262, - 247, - 257, - 287, - 239, - 229, - 252, - 235, - 246, - 265, - 248, - 253, - 258, - 248, - 254, - 267, - 259, - 267, - 242, - 276, - 248, - 280, - 272, - 237, - 238, - 238, - 265, - 256, - 262, - 267, - 253, - 231, - 223, - 274, - 273, - 271, - 234, - 228, - 237, - 268, - 268, - 248, - 239, - 249, - 266, - 244, - 247, - 249, - 271, - 260, - 250, - 234, - 261, - 225, - 235, - 229, - 255, - 259, - 281, - 251, - 251, - 252, - 247, - 277, - 241, - 242, - 239, - 243, - 282, - 252, - 286, - 277, - 274, - 235, - 258, - 256, - 247, - 246, - 277, - 264, - 247, - 252, - 255, - 266, - 263, - 239, - 277, - 233, - 237, - 266, - 232, - 223, - 250, - 282, - 264, - 264, - 224, - 239, - 243, - 258, - 245, - 245, - 268, - 257, - 250, - 243, - 257, - 237, - 244, - 255, - 249, - 250, - 228, - 271, - 239, - 245, - 230, - 254, - 279, - 254, - 256, - 232, - 260, - 266, - 253, - 233, - 255, - 250, - 253, - 274, - 228, - 213, - 241, - 240, - 251, - 248, - 228, - 254, - 256, - 251, - 259, - 261, - 236, - 267, - 243, - 243, - 254, - 229, - 242, - 238, - 247, - 266, - 276, - 245, - 261, - 245, - 247, - 225, - 277, - 251, - 239, - 209, - 280, - 249, - 293, - 251, - 230, - 251, - 257, - 234, - 251, - 252, - 264, - 251, - 278, - 244, - 272, - 249, - 288, - 255, - 231, - 245, - 267, - 252, - 258, - 238, - 264, - 211, - 253, - 250, - 239, - 223, - 241, - 242, - 231, - 248, - 264, - 270, - 262, - 239, - 249, - 287, - 275, - 231, - 261, - 282, - 245, - 254, - 256, - 239, - 244, - 244, - 239, - 248, - 253, - 254, - 257, - 270, - 249, - 250, - 261, - 253, - 245, - 246, - 273, - 242, - 265, - 252, - 233, - 298, - 271, - 252, - 235, - 263, - 248, - 245, - 236, - 238, - 235, - 240, - 262, - 248, - 257, - 252, - 242, - 254, - 266, - 253, - 246, - 297, - 259, - 265, - 235, - 244, - 266, - 259, - 227, - 251, - 283, - 262, - 271, - 246, - 266, - 263, - 235, - 271, - 265, - 265, - 273, - 249, - 236, - 250, - 244, - 261, - 268, - 248, - 265, - 266, - 274, - 262, - 258, - 238, - 285, - 218, - 247, - 264, - 222, - 289, - 234, - 235, - 266, - 253, - 274, - 252, - 259, - 263, - 266, - 262, - 231, - 252, - 258, - 257, - 278, - 241, - 253, - 267, - 257, - 267, - 245, - 258, - 213, - 263, - 257, - 280, - 246, - 242, - 253, - 233, - 218, - 277, - 252, - 247, - 280, - 268, - 246, - 271, - 237, - 239, - 264, - 258, - 280, - 242, - 236, - 237, - 262, - 234, - 268, - 279, - 257, - 257, - 229, - 232, - 263, - 270, - 251, - 217, - 251, - 253, - 249, - 244, - 226, - 269, - 254, - 234, - 231, - 257, - 230, - 253, - 233, - 245, - 248, - 237, - 244, - 247, - 236, - 227, - 259, - 266, - 273, - 261, - 260, - 256, - 259, - 260, - 267, - 248, - 250, - 230, - 248, - 262, - 241, - 206, - 232, - 246, - 256, - 259, - 248, - 245, - 255, - 259, - 261, - 250, - 257, - 232, - 250, - 246, - 234, - 243, - 246, - 286, - 222, - 241, - 276, - 274, - 272, - 253, - 251, - 264, - 233, - 243, - 248, - 257, - 243, - 245, - 241, - 220, - 269, - 224, - 237, - 247, - 243, - 241, - 261, - 234, - 256, - 254, - 239, - 246, - 247, - 243, - 251, - 246, - 261, - 252, - 235, - 235, - 224, - 244, - 246, - 242, - 249, - 234, - 248, - 254, - 252, - 225, - 273, - 267, - 248, - 241, - 236, - 245, - 254, - 256, - 265, - 232, - 264, - 253, - 235, - 254, - 252, - 231, - 259, - 246, - 260, - 247, - 274, - 255, - 264, - 245, - 239, - 227, - 236, - 243, - 268, - 253, - 241, - 218, - 207, - 281, - 242, - 245, - 245, - 260, - 258, - 262, - 268, - 229, - 258, - 273, - 241, - 291, - 281, - 240, - 216, - 234, - 252, - 240, - 259, - 260, - 265, - 253, - 242, - 275, - 264, - 250, - 249, - 258, - 255, - 250, - 237, - 268, - 252, - 243, - 248, - 266, - 249, - 256, - 257, - 262, - 271, - 257, - 262, - 255, - 228, - 235, - 229, - 250, - 254, - 247, - 255, - 243, - 241, - 273, - 245, - 251, - 241, - 250, - 234, - 255, - 251, - 242, - 263, - 246, - 237, - 228, - 246, - 225, - 262, - 254, - 273, - 225, - 245, - 249, - 257, - 239, - 240, - 262, - 248, - 253, - 273, - 240, - 245, - 250, - 260, - 250, - 249, - 238, - 249, - 261, - 238, - 253, - 251, - 273, - 237, - 237, - 261, - 224, - 260, - 232, - 263, - 261, - 248, - 249, - 234, - 261, - 271, - 264, - 242, - 256, - 244, - 242, - 216, - 240, - 247, - 263, - 278, - 288, - 240, - 255, - 272, - 228, - 249, - 247, - 261, - 232, - 226, - 239, - 250, - 253, - 262, - 256, - 250, - 241, - 270, - 273, - 233, - 246, - 248, - 259, - 245, - 224, - 245, - 227, - 277, - 265, - 230, - 261, - 262, - 270, - 248, - 240, - 263, - 252, - 248, - 252, - 264, - 253, - 230, - 252, - 221, - 274, - 241, - 256, - 249, - 267, - 234, - 234, - 229, - 262, - 243, - 232, - 225, - 240, - 253, - 234, - 241, - 260, - 246, - 269, - 230, - 254, - 236, - 240, - 237, - 263, - 267, - 241, - 246, - 258, - 235, - 245, - 248, - 248, - 252, - 277, - 241, - 231, - 227, - 273, - 263, - 258, - 251, - 244, - 225, - 238, - 239, - 252, - 221, - 228, - 268, - 224, - 221, - 269, - 258, - 276, - 291, - 241, - 245, - 262, - 245, - 239, - 269, - 237, - 248, - 279, - 220, - 245, - 245, - 239, - 278, - 263, - 272, - 233, - 249, - 266, - 259, - 285, - 277, - 235, - 242, - 238, - 275, - 242, - 251, - 268, - 216, - 235, - 253, - 251, - 245, - 241, - 241, - 258, - 255, - 250, - 248, - 255, - 279, - 275, - 246, - 280, - 253, - 266, - 257, - 228, - 245, - 265, - 261, - 273, - 261, - 261, - 235, - 258, - 246, - 243, - 252, - 258, - 250, - 250, - 248, - 240, - 248, - 243, - 239, - 258, - 224, - 288, - 229, - 274, - 235, - 247, - 255, - 255, - 235, - 244, - 241, - 257, - 272, - 255, - 247, - 257, - 230, - 262, - 235, - 272, - 197, - 247, - 265, - 257, - 241, - 258, - 233, - 234, - 237, - 237, - 285, - 254, - 232, - 236, - 262, - 233, - 271, - 254, - 255, - 247, - 252, - 260, - 235, - 225, - 272, - 273, - 223, - 261, - 249, - 238, - 236, - 238, - 246, - 228, - 279, - 223, - 258, - 242, - 252, - 251, - 230, - 268, - 255, - 298, - 236, - 276, - 281, - 234, - 204, - 242, - 263, - 239, - 256, - 241, - 264, - 261, - 254, - 260, - 250, - 223, - 239, - 247, - 262, - 261, - 210, - 250, - 214, - 256, - 252, - 253, - 265, - 234, - 271, - 228, - 251, - 247, - 239, - 234, - 244, - 237, - 266, - 244, - 265, - 248, - 233, - 242, - 261, - 248, - 238, - 237, - 242, - 258, - 257, - 245, - 235, - 249, - 265, - 243, - 264, - 244, - 267, - 261, - 263, - 236, - 239, - 255, - 244, - 262, - 242, - 250, - 269, - 254, - 258, - 251, - 289, - 223, - 257, - 244, - 249, - 252, - 258, - 263, - 260, - 251, - 250, - 233, - 250, - 251, - 235, - 260, - 250, - 230, - 271, - 242, - 280, - 224, - 249, - 231, - 235, - 269, - 253, - 270, - 251, - 253, - 255, - 254, - 267, - 246, - 263, - 240, - 260, - 262, - 252, - 269, - 258, - 258, - 244, - 262, - 266, - 229, - 246, - 244, - 233, - 249, - 244, - 248, - 221, - 260, - 242, - 268, - 259, - 247, - 264, - 260, - 248, - 276, - 250, - 226, - 225, - 233, - 266, - 284, - 250, - 234, - 259, - 240, - 204, - 266, - 275, - 248, - 256, - 251, - 266, - 245, - 258, - 256, - 254, - 278, - 254, - 263, - 269, - 249, - 273, - 248, - 267, - 266, - 244, - 257, - 240, - 275, - 242, - 281, - 264, - 245, - 239, - 230, - 223, - 269, - 244, - 251, - 255, - 244, - 257, - 264, - 249, - 256, - 241, - 264, - 248, - 247, - 238, - 253, - 223, - 262, - 266, - 231, - 274, - 215, - 249, - 265, - 266, - 234, - 260, - 217, - 245, - 253, - 232, - 239, - 256, - 245, - 230, - 266, - 231, - 253, - 241, - 256, - 258, - 253, - 263, - 248, - 258, - 245, - 250, - 229, - 248, - 244, - 227, - 244, - 241, - 232, - 223, - 254, - 241, - 244, - 274, - 274, - 230, - 254, - 258, - 257, - 268, - 234, - 247, - 241, - 232, - 265, - 258, - 247, - 260, - 249, - 263, - 255, - 261, - 278, - 230, - 246, - 264, - 250, - 267, - 225, - 255, - 276, - 225, - 226, - 269, - 254, - 229, - 238, - 271, - 246, - 252, - 261, - 255, - 255, - 228, - 247, - 247, - 241, - 263, - 254, - 222, - 219, - 226, - 241, - 248, - 269, - 248, - 258, - 233, - 249, - 249, - 232, - 239, - 264, - 227, - 248, - 255, - 251, - 261, - 238, - 263, - 264, - 253, - 266, - 252, - 249, - 237, - 234, - 226, - 261, - 253, - 249, - 231, - 249, - 256, - 278, - 266, - 227, - 250, - 242, - 260, - 224, - 251, - 239, - 256, - 265, - 251, - 260, - 264, - 242, - 228, - 248, - 253, - 252, - 250, - 264, - 255, - 238, - 244, - 247, - 294, - 246, - 216, - 249, - 238, - 263, - 253, - 236, - 237, - 250, - 258, - 235, - 252, - 244, - 245, - 256, - 230, - 216, - 247, - 261, - 259, - 266, - 247, - 232, - 249, - 240, - 238, - 223, - 250, - 274, - 250, - 255, - 232, - 253, - 245, - 279, - 232, - 253, - 277, - 289, - 247, - 247, - 258, - 257, - 242, - 262, - 260, - 274, - 232, - 245, - 263, - 249, - 224, - 254, - 238, - 258, - 264, - 251, - 250, - 259, - 264, - 239, - 267, - 258, - 235, - 247, - 223, - 245, - 279, - 232, - 259, - 253, - 254, - 275, - 231, - 263, - 254, - 266, - 246, - 254, - 240, - 244, - 252, - 266, - 235, - 250, - 250, - 275, - 260, - 251, - 245, - 219, - 224, - 247, - 263, - 262, - 264, - 257, - 225, - 289, - 242, - 254, - 229, - 268, - 269, - 269, - 254, - 252, - 271, - 220, - 250, - 231, - 214, - 213, - 248, - 249, - 272, - 245, - 223, - 260, - 235, - 234, - 244, - 272, - 247, - 249, - 242, - 247, - 233, - 279, - 256, - 245, - 266, - 259, - 235, - 248, - 247, - 240, - 237, - 240, - 231, - 238, - 250, - 246, - 255, - 247, - 274, - 250, - 241, - 253, - 233, - 233, - 225, - 246, - 243, - 257, - 253, - 240, - 244, - 233, - 270, - 255, - 238, - 234, - 286, - 256, - 265, - 257, - 227, - 237, - 283, - 275, - 240, - 253, - 292, - 232, - 251, - 279, - 246, - 255, - 235, - 223, - 224, - 275, - 267, - 251, - 272, - 251, - 281, - 283, - 263, - 247, - 244, - 230, - 288, - 215, - 225, - 271, - 255, - 256, - 253, - 253, - 251, - 252, - 250, - 272, - 244, - 234, - 222, - 244, - 231, - 240, - 245, - 254, - 239, - 282, - 247, - 235, - 263, - 253, - 234, - 233, - 248, - 272, - 251, - 230, - 252, - 254, - 281, - 244, - 252, - 250, - 289, - 239, - 252, - 260, - 255, - 243, - 230, - 234, - 234, - 247, - 282, - 265, - 257, - 265, - 272, - 240, - 278, - 255, - 260, - 247, - 267, - 267, - 276, - 242, - 233, - 248, - 258, - 234, - 291, - 251, - 228, - 247, - 243, - 265, - 278, - 271, - 243, - 266, - 234, - 212, - 226, - 265, - 215, - 252, - 228, - 255, - 236, - 257, - 228, - 224, - 240, - 252, - 278, - 260, - 257, - 249, - 231, - 238, - 257, - 271, - 255, - 250, - 245, - 264, - 232, - 237, - 214, - 272, - 247, - 241, - 240, - 267, - 244, - 261, - 241, - 272, - 249, - 273, - 249, - 238, - 241, - 227, - 240, - 256, - 238, - 246, - 225, - 259, - 280, - 263, - 250, - 233, - 257, - 258, - 228, - 256, - 275, - 268, - 223, - 253, - 258, - 255, - 240, - 244, - 229, - 248, - 283, - 242, - 251, - 280, - 251, - 233, - 241, - 241, - 238, - 253, - 249, - 254, - 247, - 233, - 269, - 248, - 243, - 266, - 237, - 233, - 228, - 254, - 257, - 269, - 258, - 286, - 243, - 215, - 279, - 221, - 239, - 215, - 236, - 248, - 251, - 259, - 238, - 259, - 275, - 240, - 250, - 254, - 250, - 255, - 247, - 257, - 253, - 254, - 267, - 249, - 264, - 245, - 268, - 257, - 196, - 263, - 273, - 255, - 211, - 249, - 278, - 248, - 238, - 256, - 238, - 258, - 255, - 264, - 255, - 214, - 223, - 293, - 251, - 231, - 235, - 247, - 299, - 246, - 289, - 264, - 284, - 252, - 257, - 258, - 249, - 261, - 250, - 234, - 239, - 225, - 229, - 216, - 218, - 255, - 252, - 247, - 252, - 243, - 271, - 246, - 255, - 256, - 254, - 226, - 256, - 225, - 250, - 245, - 220, - 230, - 256, - 250, - 255, - 238, - 263, - 248, - 249, - 253, - 261, - 238, - 236, - 253, - 229 - ] - }, - { - "counters": [ - 248, - 252, - 219, - 227, - 248, - 242, - 247, - 252, - 261, - 252, - 253, - 217, - 249, - 253, - 228, - 260, - 241, - 280, - 253, - 255, - 246, - 231, - 257, - 259, - 241, - 243, - 245, - 241, - 242, - 281, - 263, - 249, - 255, - 247, - 231, - 271, - 257, - 244, - 244, - 270, - 248, - 262, - 251, - 272, - 268, - 275, - 244, - 257, - 243, - 247, - 235, - 249, - 254, - 246, - 250, - 253, - 228, - 254, - 242, - 271, - 247, - 268, - 259, - 239, - 287, - 237, - 262, - 277, - 224, - 246, - 263, - 243, - 243, - 257, - 261, - 238, - 272, - 240, - 256, - 246, - 256, - 250, - 239, - 224, - 230, - 237, - 240, - 253, - 251, - 248, - 213, - 265, - 266, - 254, - 235, - 266, - 246, - 243, - 246, - 221, - 245, - 280, - 263, - 237, - 236, - 252, - 265, - 244, - 256, - 249, - 256, - 280, - 261, - 250, - 237, - 252, - 250, - 240, - 259, - 234, - 272, - 246, - 287, - 243, - 245, - 202, - 227, - 245, - 249, - 260, - 264, - 231, - 267, - 220, - 262, - 247, - 244, - 237, - 262, - 255, - 258, - 231, - 250, - 247, - 239, - 227, - 234, - 269, - 241, - 250, - 275, - 260, - 265, - 219, - 241, - 255, - 218, - 231, - 216, - 242, - 262, - 234, - 263, - 271, - 231, - 253, - 239, - 252, - 294, - 269, - 250, - 227, - 240, - 254, - 260, - 244, - 245, - 251, - 246, - 228, - 251, - 256, - 221, - 245, - 244, - 266, - 230, - 237, - 252, - 267, - 246, - 245, - 220, - 280, - 235, - 286, - 222, - 241, - 262, - 240, - 243, - 233, - 250, - 240, - 249, - 236, - 269, - 259, - 260, - 252, - 245, - 219, - 247, - 237, - 240, - 239, - 248, - 252, - 262, - 264, - 234, - 235, - 256, - 246, - 232, - 266, - 226, - 237, - 239, - 271, - 276, - 259, - 263, - 223, - 249, - 245, - 227, - 272, - 226, - 247, - 253, - 261, - 236, - 273, - 206, - 252, - 233, - 259, - 229, - 229, - 257, - 232, - 248, - 271, - 248, - 253, - 232, - 239, - 227, - 259, - 224, - 248, - 222, - 243, - 234, - 279, - 244, - 246, - 269, - 261, - 236, - 272, - 233, - 246, - 275, - 259, - 244, - 252, - 258, - 265, - 252, - 218, - 244, - 232, - 259, - 267, - 237, - 225, - 214, - 261, - 271, - 245, - 256, - 248, - 270, - 254, - 261, - 266, - 259, - 214, - 247, - 236, - 233, - 224, - 233, - 248, - 256, - 243, - 254, - 268, - 231, - 255, - 254, - 253, - 250, - 246, - 239, - 246, - 237, - 248, - 252, - 260, - 246, - 226, - 259, - 236, - 262, - 214, - 258, - 241, - 269, - 243, - 274, - 265, - 247, - 246, - 254, - 263, - 227, - 252, - 256, - 236, - 248, - 237, - 267, - 245, - 264, - 271, - 230, - 236, - 240, - 262, - 238, - 269, - 256, - 275, - 263, - 245, - 234, - 231, - 249, - 242, - 262, - 263, - 244, - 273, - 225, - 248, - 273, - 257, - 249, - 226, - 233, - 233, - 256, - 229, - 284, - 225, - 253, - 259, - 263, - 248, - 275, - 266, - 256, - 228, - 229, - 277, - 249, - 253, - 238, - 238, - 256, - 273, - 256, - 236, - 273, - 257, - 243, - 232, - 258, - 244, - 268, - 262, - 257, - 257, - 263, - 265, - 254, - 254, - 256, - 256, - 252, - 232, - 254, - 246, - 234, - 248, - 252, - 255, - 259, - 269, - 245, - 265, - 260, - 254, - 250, - 227, - 241, - 250, - 246, - 229, - 261, - 223, - 270, - 238, - 259, - 262, - 246, - 242, - 242, - 248, - 235, - 221, - 250, - 273, - 222, - 248, - 232, - 256, - 266, - 259, - 243, - 223, - 229, - 230, - 246, - 248, - 228, - 243, - 258, - 269, - 265, - 234, - 234, - 248, - 245, - 249, - 223, - 231, - 261, - 264, - 234, - 254, - 250, - 259, - 244, - 270, - 259, - 242, - 267, - 215, - 240, - 222, - 265, - 264, - 228, - 248, - 238, - 251, - 288, - 232, - 249, - 235, - 257, - 247, - 251, - 242, - 252, - 273, - 226, - 244, - 254, - 268, - 242, - 238, - 258, - 252, - 245, - 269, - 256, - 247, - 249, - 220, - 261, - 235, - 227, - 270, - 271, - 243, - 260, - 256, - 233, - 255, - 227, - 258, - 229, - 250, - 264, - 239, - 253, - 272, - 249, - 236, - 231, - 250, - 231, - 251, - 263, - 232, - 267, - 217, - 258, - 251, - 253, - 274, - 229, - 259, - 252, - 251, - 256, - 282, - 243, - 234, - 260, - 257, - 255, - 250, - 247, - 241, - 231, - 239, - 230, - 253, - 243, - 234, - 278, - 246, - 266, - 233, - 220, - 247, - 254, - 255, - 239, - 280, - 233, - 278, - 263, - 260, - 239, - 225, - 250, - 245, - 262, - 231, - 250, - 253, - 225, - 267, - 253, - 241, - 224, - 248, - 260, - 255, - 223, - 241, - 233, - 262, - 237, - 267, - 228, - 259, - 238, - 268, - 242, - 262, - 242, - 268, - 250, - 239, - 243, - 278, - 255, - 264, - 228, - 247, - 228, - 240, - 229, - 254, - 276, - 282, - 252, - 278, - 261, - 217, - 230, - 278, - 257, - 221, - 258, - 234, - 291, - 215, - 260, - 263, - 246, - 278, - 264, - 236, - 228, - 243, - 273, - 273, - 236, - 252, - 241, - 276, - 256, - 267, - 248, - 271, - 254, - 242, - 249, - 248, - 238, - 262, - 238, - 259, - 233, - 240, - 251, - 242, - 262, - 250, - 245, - 252, - 261, - 254, - 220, - 272, - 256, - 221, - 265, - 249, - 259, - 244, - 242, - 264, - 248, - 248, - 240, - 238, - 263, - 253, - 234, - 258, - 233, - 262, - 246, - 246, - 259, - 245, - 250, - 247, - 258, - 259, - 235, - 250, - 277, - 246, - 264, - 267, - 252, - 255, - 242, - 280, - 259, - 268, - 254, - 273, - 229, - 248, - 237, - 241, - 257, - 225, - 231, - 233, - 231, - 230, - 264, - 247, - 245, - 221, - 289, - 261, - 247, - 230, - 246, - 249, - 282, - 244, - 255, - 251, - 256, - 257, - 261, - 233, - 242, - 271, - 249, - 248, - 256, - 248, - 232, - 271, - 241, - 277, - 224, - 230, - 289, - 258, - 245, - 251, - 256, - 242, - 268, - 252, - 247, - 223, - 267, - 266, - 267, - 235, - 262, - 213, - 248, - 248, - 262, - 220, - 254, - 259, - 240, - 261, - 229, - 281, - 247, - 252, - 258, - 248, - 262, - 257, - 262, - 237, - 252, - 257, - 265, - 258, - 259, - 265, - 244, - 229, - 240, - 260, - 221, - 232, - 235, - 258, - 255, - 255, - 242, - 263, - 229, - 221, - 222, - 237, - 254, - 232, - 231, - 255, - 240, - 243, - 254, - 263, - 260, - 257, - 245, - 251, - 259, - 250, - 232, - 277, - 246, - 298, - 238, - 257, - 222, - 245, - 244, - 273, - 257, - 277, - 251, - 258, - 248, - 307, - 255, - 229, - 247, - 248, - 241, - 233, - 237, - 237, - 246, - 236, - 262, - 226, - 224, - 234, - 269, - 215, - 265, - 247, - 255, - 254, - 258, - 232, - 236, - 222, - 269, - 253, - 265, - 249, - 253, - 256, - 210, - 229, - 267, - 233, - 235, - 293, - 249, - 245, - 234, - 257, - 243, - 253, - 221, - 267, - 249, - 258, - 244, - 231, - 265, - 254, - 293, - 240, - 245, - 251, - 252, - 242, - 251, - 240, - 275, - 240, - 253, - 273, - 266, - 248, - 261, - 234, - 283, - 239, - 258, - 245, - 247, - 212, - 268, - 243, - 235, - 229, - 261, - 224, - 259, - 247, - 263, - 242, - 247, - 238, - 300, - 260, - 267, - 243, - 242, - 252, - 254, - 239, - 257, - 257, - 244, - 268, - 272, - 252, - 289, - 284, - 261, - 234, - 249, - 253, - 239, - 245, - 239, - 289, - 255, - 207, - 249, - 256, - 200, - 258, - 233, - 259, - 242, - 256, - 247, - 243, - 266, - 257, - 255, - 247, - 232, - 260, - 244, - 270, - 263, - 243, - 278, - 249, - 239, - 232, - 279, - 273, - 261, - 255, - 278, - 277, - 270, - 237, - 279, - 257, - 260, - 257, - 261, - 252, - 240, - 257, - 240, - 228, - 261, - 250, - 248, - 245, - 235, - 229, - 248, - 234, - 264, - 241, - 247, - 255, - 249, - 267, - 259, - 274, - 227, - 250, - 270, - 264, - 236, - 269, - 227, - 254, - 261, - 251, - 246, - 259, - 270, - 253, - 243, - 215, - 239, - 252, - 237, - 260, - 219, - 231, - 249, - 273, - 243, - 257, - 265, - 277, - 254, - 240, - 244, - 255, - 243, - 246, - 249, - 248, - 247, - 242, - 264, - 255, - 256, - 251, - 230, - 246, - 243, - 252, - 239, - 237, - 236, - 289, - 258, - 255, - 231, - 280, - 233, - 251, - 244, - 256, - 239, - 247, - 244, - 238, - 247, - 235, - 247, - 261, - 242, - 238, - 246, - 255, - 240, - 256, - 253, - 253, - 264, - 249, - 288, - 215, - 255, - 238, - 262, - 237, - 245, - 252, - 271, - 247, - 231, - 241, - 253, - 247, - 268, - 268, - 237, - 259, - 225, - 251, - 230, - 236, - 251, - 235, - 261, - 249, - 247, - 245, - 238, - 240, - 249, - 229, - 247, - 250, - 253, - 235, - 229, - 242, - 262, - 243, - 250, - 235, - 252, - 251, - 257, - 260, - 251, - 252, - 250, - 278, - 253, - 251, - 214, - 261, - 279, - 275, - 237, - 252, - 216, - 229, - 233, - 262, - 232, - 265, - 226, - 259, - 242, - 249, - 251, - 243, - 270, - 237, - 240, - 249, - 235, - 271, - 260, - 252, - 253, - 216, - 261, - 264, - 250, - 223, - 280, - 263, - 265, - 236, - 260, - 212, - 262, - 267, - 253, - 240, - 253, - 258, - 233, - 221, - 224, - 237, - 259, - 253, - 262, - 239, - 257, - 242, - 252, - 270, - 260, - 242, - 255, - 252, - 252, - 243, - 253, - 236, - 244, - 249, - 247, - 249, - 265, - 245, - 239, - 262, - 281, - 280, - 245, - 267, - 252, - 274, - 257, - 253, - 262, - 262, - 211, - 230, - 257, - 216, - 241, - 225, - 260, - 230, - 247, - 259, - 258, - 267, - 241, - 254, - 265, - 231, - 253, - 281, - 261, - 236, - 228, - 246, - 233, - 269, - 253, - 256, - 244, - 238, - 265, - 274, - 259, - 245, - 247, - 262, - 251, - 256, - 274, - 240, - 221, - 243, - 242, - 285, - 248, - 259, - 267, - 250, - 259, - 286, - 235, - 233, - 242, - 272, - 242, - 237, - 263, - 257, - 261, - 240, - 242, - 247, - 220, - 249, - 230, - 266, - 241, - 270, - 247, - 260, - 275, - 225, - 280, - 243, - 230, - 280, - 251, - 251, - 269, - 264, - 226, - 264, - 247, - 240, - 225, - 240, - 245, - 231, - 249, - 235, - 240, - 267, - 230, - 234, - 248, - 242, - 268, - 243, - 246, - 249, - 244, - 249, - 259, - 256, - 235, - 255, - 241, - 253, - 264, - 248, - 247, - 236, - 255, - 228, - 243, - 234, - 248, - 245, - 248, - 246, - 249, - 252, - 236, - 245, - 243, - 231, - 243, - 247, - 232, - 249, - 258, - 284, - 253, - 247, - 245, - 271, - 251, - 225, - 258, - 270, - 265, - 241, - 256, - 243, - 235, - 262, - 241, - 250, - 242, - 232, - 252, - 241, - 240, - 236, - 229, - 260, - 231, - 244, - 233, - 266, - 251, - 244, - 218, - 262, - 250, - 288, - 274, - 264, - 266, - 241, - 261, - 240, - 272, - 246, - 246, - 250, - 246, - 231, - 282, - 268, - 265, - 255, - 249, - 242, - 235, - 260, - 234, - 240, - 231, - 238, - 245, - 263, - 232, - 236, - 272, - 262, - 262, - 239, - 274, - 267, - 251, - 241, - 268, - 240, - 257, - 263, - 264, - 242, - 250, - 251, - 241, - 243, - 259, - 247, - 252, - 258, - 268, - 265, - 250, - 239, - 251, - 252, - 211, - 233, - 238, - 269, - 239, - 242, - 244, - 226, - 254, - 257, - 242, - 261, - 257, - 253, - 245, - 248, - 259, - 257, - 246, - 243, - 300, - 250, - 249, - 236, - 253, - 273, - 250, - 271, - 252, - 283, - 233, - 259, - 259, - 250, - 230, - 263, - 225, - 254, - 286, - 252, - 255, - 287, - 240, - 262, - 241, - 230, - 243, - 232, - 266, - 289, - 226, - 239, - 266, - 277, - 240, - 231, - 246, - 253, - 249, - 265, - 252, - 259, - 239, - 243, - 264, - 265, - 265, - 259, - 292, - 269, - 221, - 270, - 243, - 250, - 263, - 243, - 235, - 242, - 266, - 267, - 261, - 263, - 256, - 241, - 229, - 241, - 250, - 270, - 214, - 239, - 272, - 257, - 258, - 237, - 277, - 258, - 271, - 260, - 228, - 259, - 276, - 248, - 270, - 267, - 237, - 271, - 233, - 248, - 253, - 273, - 264, - 233, - 266, - 242, - 248, - 304, - 248, - 267, - 229, - 231, - 252, - 280, - 246, - 257, - 204, - 247, - 229, - 246, - 243, - 240, - 223, - 284, - 285, - 255, - 244, - 249, - 283, - 263, - 240, - 252, - 252, - 272, - 250, - 248, - 238, - 242, - 245, - 246, - 263, - 255, - 253, - 242, - 263, - 256, - 255, - 273, - 246, - 241, - 245, - 240, - 232, - 234, - 245, - 222, - 239, - 253, - 266, - 246, - 251, - 253, - 238, - 231, - 256, - 244, - 245, - 259, - 214, - 242, - 270, - 287, - 259, - 265, - 269, - 241, - 266, - 234, - 239, - 270, - 260, - 270, - 251, - 277, - 264, - 242, - 253, - 209, - 253, - 247, - 252, - 260, - 235, - 272, - 259, - 245, - 252, - 253, - 213, - 243, - 249, - 261, - 242, - 265, - 249, - 280, - 271, - 232, - 250, - 222, - 267, - 245, - 237, - 238, - 244, - 236, - 245, - 236, - 282, - 246, - 256, - 224, - 235, - 224, - 273, - 249, - 225, - 239, - 238, - 245, - 268, - 264, - 287, - 219, - 257, - 261, - 259, - 239, - 248, - 250, - 236, - 256, - 264, - 256, - 254, - 248, - 248, - 250, - 252, - 249, - 256, - 227, - 268, - 234, - 252, - 264, - 263, - 257, - 227, - 279, - 238, - 234, - 240, - 272, - 260, - 275, - 249, - 230, - 243, - 233, - 282, - 253, - 242, - 262, - 269, - 303, - 251, - 243, - 246, - 245, - 272, - 240, - 244, - 270, - 244, - 256, - 238, - 232, - 245, - 282, - 267, - 235, - 292, - 245, - 248, - 234, - 242, - 269, - 249, - 251, - 268, - 236, - 254, - 242, - 267, - 235, - 294, - 256, - 251, - 292, - 239, - 216, - 228, - 232, - 256, - 242, - 248, - 263, - 231, - 212, - 258, - 254, - 254, - 227, - 251, - 265, - 245, - 249, - 250, - 243, - 246, - 263, - 248, - 264, - 257, - 276, - 261, - 248, - 232, - 238, - 235, - 246, - 286, - 272, - 250, - 273, - 258, - 246, - 291, - 252, - 262, - 263, - 232, - 243, - 242, - 258, - 252, - 263, - 262, - 245, - 256, - 238, - 236, - 276, - 264, - 290, - 284, - 258, - 261, - 258, - 266, - 245, - 259, - 258, - 267, - 264, - 263, - 233, - 252, - 249, - 259, - 264, - 258, - 231, - 262, - 245, - 207, - 256, - 246, - 244, - 261, - 251, - 255, - 260, - 247, - 229, - 281, - 237, - 258, - 235, - 239, - 247, - 269, - 271, - 229, - 277, - 229, - 233, - 256, - 240, - 250, - 238, - 247, - 236, - 259, - 276, - 243, - 208, - 252, - 234, - 269, - 257, - 264, - 227, - 232, - 243, - 235, - 244, - 262, - 236, - 260, - 252, - 271, - 266, - 230, - 253, - 234, - 252, - 269, - 242, - 257, - 227, - 248, - 258, - 261, - 253, - 261, - 251, - 269, - 237, - 245, - 264, - 287, - 258, - 246, - 239, - 273, - 257, - 264, - 276, - 250, - 237, - 258, - 251, - 229, - 269, - 242, - 218, - 222, - 239, - 237, - 238, - 259, - 249, - 248, - 231, - 246, - 235, - 240, - 233, - 254, - 264, - 239, - 224, - 257, - 226, - 260, - 235, - 269, - 261, - 235, - 266, - 243, - 252, - 273, - 262, - 285, - 251, - 241, - 246, - 261, - 232, - 257, - 258, - 235, - 249, - 262, - 249, - 286, - 260, - 242, - 248, - 262, - 241, - 249, - 268, - 231, - 251, - 231, - 238, - 258, - 258, - 260, - 270, - 258, - 270, - 258, - 232, - 253, - 235, - 247, - 240, - 242, - 265, - 262, - 244, - 223, - 255, - 245, - 293, - 251, - 253, - 249, - 229, - 228, - 267, - 240, - 235, - 276, - 258, - 204, - 256, - 231, - 268, - 243, - 260, - 286, - 255, - 260, - 244, - 244, - 254, - 242, - 267, - 231, - 227, - 237, - 251, - 240, - 241, - 259, - 260, - 258, - 259, - 235, - 275, - 246, - 255, - 243, - 215, - 275, - 258, - 253, - 273, - 220, - 271, - 268, - 273, - 241, - 248, - 250, - 243, - 236, - 243, - 258, - 250, - 253, - 245, - 251, - 239, - 235, - 228 - ] - }, - { - "counters": [ - 261, - 279, - 252, - 270, - 248, - 252, - 289, - 246, - 255, - 227, - 263, - 252, - 266, - 229, - 271, - 295, - 223, - 244, - 271, - 246, - 247, - 238, - 236, - 243, - 262, - 252, - 244, - 255, - 243, - 251, - 252, - 264, - 220, - 255, - 240, - 261, - 249, - 242, - 265, - 246, - 240, - 271, - 229, - 257, - 253, - 242, - 246, - 288, - 255, - 255, - 271, - 225, - 246, - 225, - 239, - 262, - 243, - 235, - 239, - 242, - 258, - 240, - 232, - 248, - 230, - 299, - 258, - 263, - 213, - 246, - 231, - 274, - 256, - 266, - 249, - 220, - 259, - 255, - 209, - 239, - 243, - 263, - 260, - 244, - 260, - 249, - 272, - 267, - 254, - 265, - 235, - 242, - 245, - 231, - 244, - 231, - 232, - 256, - 269, - 215, - 237, - 248, - 249, - 271, - 271, - 247, - 254, - 222, - 259, - 239, - 228, - 252, - 244, - 232, - 222, - 252, - 232, - 215, - 278, - 245, - 241, - 262, - 248, - 249, - 284, - 273, - 255, - 245, - 247, - 279, - 252, - 252, - 260, - 283, - 241, - 248, - 236, - 271, - 230, - 248, - 270, - 266, - 248, - 253, - 246, - 259, - 258, - 278, - 242, - 246, - 247, - 240, - 212, - 273, - 249, - 236, - 225, - 235, - 254, - 265, - 270, - 228, - 249, - 281, - 243, - 219, - 228, - 274, - 246, - 252, - 259, - 259, - 268, - 250, - 223, - 244, - 252, - 258, - 258, - 249, - 268, - 258, - 257, - 276, - 233, - 245, - 266, - 271, - 254, - 226, - 260, - 263, - 243, - 264, - 246, - 254, - 257, - 253, - 272, - 244, - 285, - 256, - 257, - 245, - 273, - 235, - 258, - 259, - 202, - 258, - 256, - 265, - 257, - 228, - 242, - 237, - 232, - 234, - 250, - 242, - 233, - 277, - 254, - 233, - 239, - 254, - 258, - 221, - 250, - 249, - 262, - 251, - 244, - 261, - 251, - 236, - 247, - 265, - 253, - 250, - 218, - 243, - 279, - 252, - 231, - 252, - 255, - 262, - 256, - 263, - 266, - 234, - 252, - 269, - 241, - 270, - 256, - 221, - 249, - 239, - 270, - 254, - 237, - 240, - 260, - 235, - 273, - 233, - 267, - 236, - 199, - 254, - 255, - 247, - 233, - 258, - 257, - 253, - 250, - 272, - 262, - 260, - 228, - 236, - 278, - 259, - 253, - 252, - 234, - 240, - 259, - 245, - 285, - 244, - 233, - 270, - 242, - 250, - 273, - 250, - 280, - 268, - 281, - 252, - 221, - 244, - 259, - 267, - 244, - 267, - 247, - 263, - 271, - 248, - 251, - 268, - 229, - 219, - 250, - 221, - 223, - 229, - 253, - 231, - 251, - 247, - 235, - 284, - 291, - 255, - 252, - 245, - 256, - 262, - 254, - 282, - 245, - 250, - 215, - 239, - 232, - 258, - 229, - 253, - 253, - 255, - 281, - 242, - 272, - 244, - 243, - 248, - 268, - 267, - 247, - 242, - 235, - 227, - 274, - 265, - 268, - 262, - 222, - 230, - 232, - 259, - 249, - 241, - 284, - 249, - 240, - 303, - 255, - 235, - 260, - 245, - 266, - 241, - 231, - 246, - 218, - 205, - 263, - 241, - 219, - 220, - 267, - 260, - 255, - 265, - 266, - 262, - 263, - 248, - 255, - 255, - 240, - 232, - 269, - 240, - 247, - 260, - 257, - 255, - 269, - 233, - 246, - 246, - 249, - 254, - 266, - 281, - 247, - 254, - 270, - 246, - 252, - 236, - 248, - 270, - 248, - 223, - 232, - 246, - 279, - 258, - 248, - 263, - 215, - 252, - 251, - 243, - 252, - 279, - 265, - 273, - 258, - 259, - 255, - 249, - 239, - 240, - 255, - 261, - 270, - 250, - 242, - 250, - 276, - 242, - 256, - 227, - 244, - 240, - 246, - 258, - 267, - 224, - 232, - 232, - 247, - 249, - 240, - 244, - 244, - 252, - 274, - 243, - 272, - 236, - 270, - 246, - 290, - 246, - 263, - 234, - 252, - 252, - 220, - 234, - 260, - 233, - 270, - 265, - 228, - 263, - 270, - 267, - 263, - 247, - 244, - 258, - 221, - 243, - 231, - 214, - 250, - 260, - 260, - 245, - 237, - 226, - 267, - 246, - 251, - 265, - 265, - 275, - 254, - 252, - 224, - 258, - 267, - 246, - 259, - 237, - 246, - 261, - 265, - 266, - 256, - 282, - 248, - 258, - 245, - 250, - 243, - 256, - 255, - 268, - 255, - 274, - 264, - 263, - 262, - 261, - 230, - 240, - 284, - 273, - 238, - 255, - 242, - 266, - 279, - 239, - 241, - 250, - 257, - 260, - 244, - 254, - 241, - 270, - 238, - 243, - 237, - 245, - 273, - 233, - 251, - 249, - 259, - 225, - 236, - 239, - 254, - 264, - 272, - 242, - 239, - 256, - 238, - 244, - 259, - 223, - 252, - 266, - 243, - 240, - 263, - 259, - 256, - 279, - 247, - 265, - 232, - 234, - 254, - 253, - 250, - 241, - 256, - 245, - 260, - 269, - 247, - 247, - 249, - 258, - 237, - 250, - 221, - 298, - 258, - 256, - 267, - 261, - 296, - 224, - 217, - 263, - 262, - 251, - 273, - 244, - 257, - 240, - 239, - 243, - 263, - 241, - 262, - 255, - 269, - 246, - 255, - 267, - 241, - 235, - 232, - 249, - 253, - 234, - 257, - 259, - 248, - 255, - 225, - 264, - 259, - 246, - 238, - 248, - 253, - 251, - 257, - 246, - 275, - 266, - 228, - 285, - 253, - 240, - 217, - 274, - 223, - 241, - 237, - 249, - 256, - 240, - 252, - 243, - 242, - 232, - 253, - 258, - 248, - 249, - 240, - 264, - 279, - 250, - 258, - 281, - 250, - 244, - 235, - 251, - 261, - 273, - 247, - 242, - 223, - 261, - 227, - 241, - 241, - 263, - 271, - 225, - 252, - 253, - 251, - 262, - 243, - 267, - 245, - 237, - 259, - 240, - 258, - 243, - 257, - 263, - 269, - 241, - 247, - 220, - 239, - 279, - 239, - 237, - 241, - 244, - 229, - 253, - 215, - 236, - 248, - 249, - 261, - 271, - 229, - 241, - 233, - 228, - 237, - 256, - 245, - 244, - 231, - 271, - 279, - 270, - 262, - 260, - 263, - 252, - 253, - 236, - 267, - 251, - 261, - 258, - 226, - 249, - 241, - 240, - 271, - 207, - 264, - 247, - 229, - 245, - 252, - 236, - 242, - 271, - 248, - 256, - 236, - 271, - 246, - 249, - 264, - 253, - 255, - 255, - 230, - 249, - 247, - 269, - 230, - 255, - 243, - 238, - 255, - 226, - 248, - 265, - 245, - 276, - 263, - 248, - 267, - 231, - 221, - 233, - 269, - 260, - 225, - 250, - 269, - 244, - 250, - 222, - 233, - 269, - 215, - 240, - 256, - 292, - 235, - 240, - 252, - 263, - 246, - 237, - 238, - 247, - 259, - 260, - 282, - 272, - 228, - 258, - 260, - 253, - 232, - 265, - 253, - 256, - 241, - 239, - 252, - 249, - 261, - 223, - 246, - 264, - 272, - 255, - 261, - 254, - 263, - 248, - 249, - 249, - 250, - 252, - 232, - 259, - 254, - 270, - 230, - 256, - 252, - 239, - 238, - 222, - 256, - 253, - 273, - 253, - 252, - 261, - 231, - 271, - 271, - 241, - 227, - 256, - 267, - 258, - 230, - 235, - 254, - 250, - 259, - 249, - 245, - 279, - 250, - 246, - 250, - 230, - 282, - 243, - 248, - 268, - 263, - 250, - 240, - 246, - 259, - 268, - 248, - 242, - 252, - 241, - 248, - 233, - 287, - 240, - 248, - 297, - 244, - 239, - 256, - 238, - 269, - 241, - 255, - 232, - 260, - 237, - 263, - 240, - 257, - 247, - 273, - 241, - 281, - 246, - 279, - 264, - 244, - 252, - 217, - 254, - 221, - 245, - 226, - 251, - 240, - 232, - 243, - 223, - 237, - 253, - 258, - 237, - 229, - 236, - 251, - 222, - 245, - 295, - 248, - 242, - 244, - 215, - 246, - 219, - 259, - 241, - 260, - 252, - 251, - 273, - 250, - 244, - 237, - 250, - 257, - 225, - 259, - 252, - 251, - 272, - 240, - 228, - 235, - 228, - 268, - 239, - 253, - 252, - 248, - 254, - 269, - 246, - 265, - 254, - 239, - 241, - 248, - 299, - 263, - 249, - 273, - 256, - 253, - 251, - 214, - 261, - 250, - 239, - 242, - 245, - 253, - 245, - 233, - 245, - 249, - 253, - 224, - 253, - 237, - 238, - 249, - 234, - 267, - 257, - 250, - 264, - 235, - 248, - 291, - 232, - 248, - 244, - 254, - 241, - 247, - 243, - 286, - 234, - 274, - 249, - 249, - 233, - 230, - 255, - 249, - 255, - 230, - 228, - 255, - 227, - 251, - 249, - 245, - 258, - 226, - 257, - 273, - 238, - 232, - 243, - 259, - 252, - 256, - 252, - 224, - 253, - 216, - 240, - 249, - 257, - 268, - 255, - 295, - 235, - 245, - 276, - 248, - 251, - 241, - 243, - 236, - 247, - 257, - 242, - 253, - 261, - 231, - 244, - 244, - 247, - 232, - 229, - 269, - 234, - 237, - 233, - 266, - 272, - 266, - 250, - 272, - 244, - 258, - 235, - 258, - 240, - 267, - 265, - 251, - 252, - 247, - 268, - 242, - 225, - 277, - 267, - 246, - 253, - 231, - 257, - 257, - 229, - 251, - 259, - 249, - 239, - 247, - 256, - 282, - 243, - 231, - 251, - 237, - 255, - 281, - 239, - 248, - 258, - 217, - 265, - 264, - 222, - 258, - 217, - 280, - 250, - 249, - 236, - 248, - 257, - 249, - 236, - 226, - 222, - 257, - 240, - 267, - 238, - 264, - 228, - 239, - 255, - 234, - 262, - 245, - 251, - 271, - 242, - 234, - 260, - 245, - 254, - 249, - 253, - 249, - 245, - 267, - 224, - 236, - 249, - 237, - 258, - 251, - 262, - 239, - 254, - 250, - 273, - 224, - 247, - 243, - 259, - 285, - 278, - 236, - 261, - 245, - 258, - 246, - 248, - 270, - 239, - 226, - 258, - 234, - 267, - 249, - 274, - 277, - 236, - 225, - 221, - 228, - 237, - 274, - 219, - 231, - 281, - 243, - 228, - 257, - 263, - 256, - 226, - 245, - 235, - 238, - 283, - 230, - 245, - 259, - 255, - 240, - 266, - 247, - 241, - 250, - 240, - 273, - 285, - 256, - 283, - 254, - 281, - 250, - 226, - 218, - 246, - 268, - 250, - 238, - 244, - 248, - 245, - 226, - 272, - 252, - 238, - 274, - 248, - 239, - 267, - 258, - 257, - 223, - 270, - 257, - 271, - 251, - 225, - 242, - 241, - 278, - 270, - 270, - 254, - 250, - 229, - 248, - 212, - 241, - 256, - 223, - 243, - 269, - 252, - 243, - 236, - 258, - 251, - 250, - 266, - 236, - 252, - 242, - 227, - 254, - 228, - 234, - 272, - 240, - 250, - 246, - 235, - 240, - 256, - 238, - 261, - 260, - 243, - 246, - 258, - 237, - 286, - 253, - 270, - 250, - 254, - 257, - 259, - 252, - 263, - 253, - 258, - 267, - 240, - 259, - 273, - 288, - 227, - 244, - 264, - 234, - 267, - 254, - 219, - 283, - 243, - 247, - 260, - 243, - 257, - 277, - 242, - 264, - 255, - 243, - 228, - 243, - 250, - 267, - 265, - 249, - 269, - 231, - 257, - 242, - 239, - 253, - 244, - 253, - 241, - 262, - 227, - 243, - 242, - 243, - 238, - 251, - 243, - 262, - 254, - 263, - 239, - 246, - 223, - 262, - 245, - 261, - 247, - 271, - 280, - 253, - 232, - 288, - 274, - 264, - 282, - 229, - 249, - 284, - 253, - 268, - 219, - 230, - 229, - 217, - 255, - 264, - 225, - 260, - 264, - 245, - 257, - 262, - 260, - 263, - 238, - 232, - 225, - 238, - 246, - 257, - 237, - 261, - 234, - 265, - 263, - 252, - 268, - 253, - 250, - 261, - 208, - 274, - 261, - 210, - 234, - 263, - 252, - 234, - 250, - 234, - 240, - 228, - 240, - 282, - 257, - 206, - 245, - 243, - 276, - 230, - 271, - 227, - 255, - 262, - 267, - 240, - 246, - 233, - 259, - 235, - 247, - 232, - 252, - 268, - 244, - 252, - 255, - 253, - 294, - 241, - 230, - 252, - 231, - 274, - 268, - 252, - 244, - 234, - 248, - 236, - 237, - 261, - 212, - 231, - 282, - 240, - 229, - 247, - 261, - 261, - 260, - 262, - 222, - 240, - 259, - 233, - 233, - 251, - 240, - 230, - 238, - 249, - 258, - 274, - 242, - 248, - 261, - 222, - 245, - 239, - 249, - 265, - 294, - 224, - 246, - 290, - 265, - 269, - 250, - 236, - 246, - 264, - 217, - 234, - 242, - 262, - 250, - 263, - 240, - 251, - 247, - 248, - 269, - 230, - 238, - 240, - 236, - 263, - 224, - 261, - 259, - 256, - 265, - 244, - 230, - 242, - 233, - 252, - 270, - 232, - 286, - 259, - 248, - 229, - 251, - 250, - 255, - 254, - 228, - 239, - 240, - 228, - 250, - 261, - 233, - 275, - 259, - 250, - 270, - 231, - 254, - 261, - 232, - 239, - 234, - 228, - 247, - 253, - 259, - 223, - 273, - 244, - 262, - 240, - 240, - 223, - 222, - 263, - 242, - 242, - 258, - 244, - 231, - 238, - 274, - 243, - 234, - 246, - 249, - 248, - 246, - 276, - 244, - 268, - 220, - 257, - 239, - 253, - 293, - 273, - 250, - 232, - 230, - 268, - 240, - 215, - 258, - 251, - 260, - 275, - 272, - 218, - 225, - 248, - 236, - 258, - 254, - 240, - 248, - 228, - 240, - 245, - 254, - 242, - 239, - 246, - 227, - 235, - 236, - 253, - 239, - 258, - 258, - 267, - 219, - 261, - 238, - 230, - 241, - 273, - 245, - 229, - 243, - 265, - 267, - 221, - 274, - 252, - 236, - 258, - 252, - 254, - 261, - 257, - 247, - 253, - 243, - 261, - 238, - 278, - 235, - 231, - 215, - 252, - 259, - 240, - 267, - 263, - 235, - 252, - 274, - 283, - 228, - 269, - 272, - 225, - 234, - 251, - 265, - 243, - 256, - 233, - 266, - 223, - 257, - 247, - 237, - 243, - 269, - 235, - 241, - 257, - 285, - 255, - 249, - 264, - 232, - 248, - 247, - 226, - 255, - 233, - 254, - 273, - 260, - 236, - 242, - 274, - 251, - 236, - 237, - 256, - 242, - 250, - 238, - 247, - 243, - 252, - 241, - 243, - 248, - 265, - 262, - 243, - 244, - 267, - 239, - 254, - 260, - 239, - 249, - 290, - 295, - 259, - 232, - 245, - 234, - 228, - 257, - 233, - 224, - 259, - 269, - 230, - 241, - 230, - 242, - 280, - 250, - 255, - 220, - 246, - 257, - 256, - 255, - 243, - 235, - 270, - 237, - 232, - 252, - 263, - 246, - 252, - 234, - 257, - 253, - 274, - 228, - 236, - 243, - 239, - 237, - 264, - 275, - 263, - 234, - 253, - 262, - 247, - 262, - 242, - 231, - 258, - 238, - 231, - 272, - 250, - 233, - 245, - 248, - 234, - 258, - 250, - 236, - 240, - 276, - 258, - 255, - 235, - 263, - 233, - 251, - 249, - 267, - 264, - 252, - 211, - 252, - 258, - 245, - 231, - 266, - 242, - 252, - 277, - 247, - 263, - 249, - 243, - 258, - 211, - 260, - 269, - 245, - 255, - 258, - 275, - 253, - 253, - 271, - 211, - 260, - 252, - 249, - 288, - 237, - 297, - 216, - 249, - 252, - 251, - 241, - 259, - 267, - 282, - 239, - 236, - 284, - 240, - 263, - 248, - 251, - 244, - 266, - 258, - 226, - 253, - 244, - 264, - 263, - 263, - 242, - 256, - 272, - 244, - 235, - 287, - 250, - 236, - 231, - 242, - 236, - 256, - 245, - 251, - 266, - 269, - 250, - 236, - 264, - 230, - 266, - 233, - 246, - 267, - 249, - 249, - 244, - 247, - 209, - 266, - 221, - 269, - 249, - 282, - 264, - 261, - 254, - 238, - 264, - 249, - 225, - 222, - 250, - 282, - 236, - 252, - 243, - 261, - 256, - 237, - 231, - 276, - 237, - 285, - 292, - 232, - 241, - 240, - 219, - 259, - 241, - 263, - 251, - 265, - 238, - 235, - 255, - 220, - 244, - 270, - 238, - 270, - 265, - 246, - 265, - 262, - 276, - 255, - 249, - 263, - 252, - 238, - 241, - 238, - 201, - 225, - 260, - 225, - 250, - 263, - 262, - 268, - 258, - 238, - 220, - 236, - 257, - 241, - 240, - 262, - 276, - 275, - 246, - 273, - 257, - 229, - 245, - 268, - 239, - 262, - 230, - 258, - 240, - 245, - 266, - 232, - 245, - 251, - 261, - 232, - 251, - 235, - 257, - 243, - 253, - 247, - 226, - 258, - 249, - 251, - 257, - 249, - 223, - 280, - 271, - 240, - 262, - 220, - 232, - 236, - 267, - 237, - 234, - 266, - 265, - 245, - 234, - 259, - 234, - 262, - 236, - 251, - 259, - 240, - 252, - 268, - 234, - 251, - 233, - 233, - 262, - 262, - 244, - 250, - 265, - 239, - 237, - 272, - 265, - 261, - 242, - 252, - 248, - 270, - 243, - 262, - 255, - 234, - 259, - 243, - 244, - 267, - 228, - 256, - 237, - 246, - 243, - 255, - 256, - 257, - 259, - 259, - 266, - 251, - 241, - 297, - 259, - 267, - 271, - 269, - 225 - ] - }, - { - "counters": [ - 266, - 254, - 249, - 233, - 249, - 233, - 264, - 250, - 242, - 230, - 252, - 246, - 253, - 253, - 283, - 265, - 244, - 237, - 247, - 234, - 268, - 256, - 267, - 263, - 249, - 253, - 248, - 238, - 251, - 224, - 249, - 262, - 275, - 267, - 248, - 269, - 263, - 251, - 248, - 234, - 274, - 226, - 254, - 239, - 227, - 275, - 241, - 241, - 243, - 228, - 257, - 246, - 271, - 263, - 253, - 251, - 236, - 248, - 257, - 255, - 211, - 235, - 223, - 208, - 236, - 219, - 265, - 226, - 230, - 248, - 247, - 252, - 264, - 238, - 257, - 261, - 251, - 288, - 262, - 237, - 262, - 252, - 265, - 262, - 259, - 287, - 280, - 246, - 245, - 248, - 247, - 243, - 275, - 242, - 228, - 237, - 234, - 234, - 251, - 222, - 270, - 253, - 263, - 264, - 231, - 241, - 260, - 251, - 244, - 244, - 254, - 258, - 261, - 256, - 267, - 248, - 240, - 247, - 227, - 257, - 250, - 262, - 227, - 247, - 246, - 250, - 236, - 300, - 251, - 266, - 233, - 255, - 224, - 273, - 257, - 272, - 255, - 239, - 253, - 263, - 263, - 238, - 244, - 274, - 228, - 245, - 248, - 226, - 230, - 236, - 244, - 259, - 290, - 257, - 239, - 245, - 260, - 243, - 259, - 260, - 302, - 234, - 255, - 246, - 232, - 276, - 272, - 223, - 275, - 253, - 255, - 261, - 222, - 248, - 262, - 249, - 267, - 264, - 233, - 240, - 247, - 263, - 236, - 259, - 260, - 259, - 222, - 251, - 232, - 281, - 239, - 234, - 274, - 215, - 258, - 258, - 240, - 268, - 257, - 242, - 234, - 237, - 241, - 269, - 252, - 243, - 281, - 233, - 258, - 265, - 245, - 245, - 266, - 246, - 267, - 257, - 278, - 243, - 245, - 264, - 226, - 248, - 275, - 239, - 255, - 215, - 236, - 236, - 236, - 252, - 267, - 254, - 257, - 253, - 242, - 239, - 265, - 244, - 252, - 280, - 262, - 223, - 219, - 252, - 236, - 277, - 263, - 248, - 236, - 225, - 239, - 243, - 223, - 254, - 292, - 245, - 270, - 267, - 234, - 271, - 250, - 245, - 245, - 246, - 265, - 229, - 201, - 237, - 279, - 240, - 231, - 239, - 227, - 236, - 257, - 245, - 227, - 282, - 233, - 236, - 255, - 259, - 242, - 266, - 256, - 260, - 262, - 259, - 265, - 264, - 253, - 243, - 247, - 236, - 251, - 284, - 253, - 262, - 227, - 273, - 237, - 265, - 232, - 244, - 272, - 239, - 256, - 269, - 259, - 250, - 240, - 250, - 270, - 270, - 273, - 241, - 228, - 240, - 241, - 251, - 244, - 252, - 240, - 243, - 239, - 259, - 258, - 262, - 250, - 293, - 270, - 266, - 265, - 271, - 272, - 240, - 249, - 227, - 274, - 235, - 267, - 240, - 254, - 275, - 256, - 236, - 255, - 259, - 237, - 227, - 246, - 260, - 264, - 265, - 257, - 245, - 256, - 246, - 241, - 237, - 270, - 277, - 235, - 241, - 273, - 261, - 245, - 245, - 230, - 274, - 257, - 264, - 273, - 243, - 221, - 242, - 265, - 241, - 235, - 247, - 247, - 244, - 268, - 252, - 233, - 239, - 245, - 225, - 228, - 256, - 258, - 261, - 218, - 250, - 217, - 266, - 231, - 253, - 255, - 260, - 252, - 283, - 234, - 241, - 264, - 237, - 266, - 243, - 232, - 262, - 249, - 259, - 243, - 281, - 278, - 273, - 240, - 224, - 254, - 247, - 261, - 244, - 253, - 243, - 269, - 236, - 244, - 259, - 272, - 253, - 255, - 260, - 229, - 231, - 269, - 238, - 260, - 246, - 255, - 271, - 256, - 238, - 263, - 241, - 237, - 234, - 285, - 253, - 240, - 255, - 234, - 234, - 246, - 244, - 264, - 258, - 259, - 254, - 238, - 260, - 242, - 239, - 234, - 257, - 258, - 260, - 243, - 233, - 260, - 239, - 222, - 238, - 244, - 235, - 273, - 257, - 264, - 254, - 238, - 274, - 260, - 238, - 262, - 254, - 265, - 242, - 268, - 251, - 224, - 276, - 255, - 269, - 262, - 241, - 248, - 248, - 243, - 240, - 242, - 235, - 252, - 263, - 231, - 251, - 238, - 255, - 251, - 247, - 247, - 244, - 241, - 219, - 237, - 242, - 245, - 251, - 241, - 246, - 262, - 243, - 258, - 262, - 261, - 273, - 264, - 261, - 220, - 232, - 241, - 251, - 250, - 238, - 248, - 269, - 242, - 259, - 257, - 252, - 244, - 243, - 225, - 290, - 236, - 246, - 236, - 244, - 243, - 274, - 263, - 271, - 250, - 262, - 236, - 251, - 257, - 256, - 262, - 264, - 258, - 238, - 238, - 261, - 260, - 252, - 247, - 243, - 251, - 241, - 248, - 270, - 228, - 247, - 263, - 231, - 252, - 211, - 264, - 284, - 238, - 265, - 253, - 249, - 261, - 244, - 252, - 261, - 235, - 252, - 227, - 247, - 265, - 246, - 250, - 226, - 262, - 248, - 240, - 243, - 230, - 231, - 242, - 260, - 247, - 255, - 236, - 236, - 267, - 239, - 245, - 259, - 264, - 266, - 243, - 249, - 273, - 262, - 227, - 208, - 259, - 221, - 216, - 255, - 231, - 261, - 256, - 263, - 240, - 238, - 269, - 234, - 237, - 253, - 253, - 266, - 246, - 265, - 276, - 241, - 225, - 269, - 264, - 237, - 239, - 216, - 251, - 263, - 270, - 268, - 243, - 251, - 240, - 260, - 249, - 265, - 202, - 272, - 244, - 234, - 239, - 250, - 231, - 254, - 238, - 242, - 232, - 245, - 255, - 243, - 269, - 258, - 285, - 248, - 238, - 266, - 248, - 230, - 272, - 251, - 255, - 227, - 226, - 280, - 247, - 251, - 256, - 222, - 251, - 240, - 269, - 252, - 260, - 263, - 285, - 263, - 246, - 245, - 266, - 292, - 278, - 249, - 266, - 271, - 247, - 258, - 252, - 235, - 276, - 232, - 258, - 235, - 223, - 226, - 259, - 237, - 246, - 244, - 234, - 263, - 248, - 261, - 232, - 253, - 260, - 273, - 259, - 239, - 252, - 219, - 251, - 255, - 243, - 258, - 265, - 250, - 270, - 239, - 253, - 228, - 257, - 234, - 250, - 236, - 220, - 245, - 234, - 266, - 261, - 260, - 241, - 259, - 244, - 244, - 231, - 256, - 234, - 279, - 252, - 258, - 221, - 258, - 229, - 243, - 259, - 254, - 234, - 263, - 257, - 248, - 248, - 266, - 246, - 263, - 225, - 256, - 259, - 248, - 229, - 258, - 249, - 254, - 220, - 235, - 281, - 246, - 256, - 243, - 236, - 248, - 251, - 219, - 260, - 259, - 258, - 231, - 272, - 253, - 258, - 255, - 249, - 261, - 246, - 253, - 281, - 268, - 268, - 240, - 234, - 252, - 257, - 248, - 245, - 271, - 248, - 283, - 273, - 247, - 255, - 247, - 250, - 251, - 244, - 253, - 256, - 241, - 269, - 283, - 220, - 259, - 259, - 240, - 249, - 255, - 237, - 238, - 241, - 277, - 273, - 252, - 231, - 250, - 232, - 229, - 225, - 274, - 259, - 238, - 260, - 265, - 245, - 247, - 265, - 269, - 236, - 242, - 279, - 241, - 228, - 267, - 247, - 222, - 285, - 268, - 217, - 251, - 250, - 254, - 233, - 259, - 236, - 241, - 248, - 244, - 252, - 240, - 248, - 250, - 221, - 277, - 272, - 269, - 246, - 277, - 246, - 232, - 230, - 254, - 261, - 253, - 238, - 268, - 255, - 240, - 250, - 233, - 245, - 249, - 257, - 274, - 243, - 208, - 271, - 248, - 257, - 246, - 259, - 266, - 256, - 254, - 276, - 236, - 276, - 268, - 243, - 258, - 232, - 239, - 227, - 276, - 239, - 246, - 280, - 255, - 232, - 255, - 265, - 224, - 263, - 256, - 241, - 260, - 256, - 252, - 248, - 248, - 248, - 256, - 247, - 240, - 231, - 259, - 241, - 221, - 235, - 243, - 265, - 257, - 259, - 256, - 237, - 232, - 226, - 259, - 268, - 257, - 244, - 243, - 243, - 261, - 280, - 264, - 246, - 260, - 230, - 235, - 235, - 248, - 259, - 256, - 249, - 289, - 259, - 245, - 260, - 284, - 262, - 266, - 242, - 256, - 212, - 265, - 239, - 234, - 236, - 240, - 243, - 252, - 248, - 266, - 242, - 249, - 233, - 255, - 259, - 224, - 222, - 270, - 257, - 245, - 298, - 255, - 230, - 258, - 251, - 275, - 256, - 251, - 240, - 269, - 235, - 286, - 290, - 257, - 259, - 244, - 242, - 251, - 219, - 242, - 264, - 246, - 225, - 237, - 239, - 217, - 221, - 241, - 247, - 230, - 252, - 249, - 232, - 252, - 223, - 242, - 260, - 228, - 229, - 248, - 254, - 261, - 224, - 224, - 248, - 252, - 248, - 276, - 232, - 259, - 221, - 238, - 284, - 256, - 287, - 235, - 235, - 241, - 268, - 262, - 236, - 231, - 261, - 252, - 270, - 239, - 241, - 238, - 230, - 269, - 271, - 255, - 237, - 248, - 262, - 243, - 235, - 275, - 295, - 245, - 252, - 233, - 258, - 248, - 246, - 267, - 244, - 261, - 245, - 230, - 229, - 253, - 259, - 252, - 252, - 251, - 232, - 235, - 259, - 232, - 237, - 236, - 244, - 261, - 257, - 238, - 259, - 265, - 252, - 268, - 252, - 222, - 251, - 236, - 255, - 261, - 234, - 230, - 240, - 261, - 264, - 256, - 260, - 234, - 265, - 249, - 245, - 255, - 252, - 231, - 249, - 272, - 249, - 254, - 288, - 251, - 224, - 264, - 216, - 260, - 259, - 231, - 245, - 256, - 261, - 234, - 220, - 257, - 250, - 238, - 236, - 216, - 194, - 248, - 269, - 252, - 250, - 266, - 266, - 248, - 224, - 249, - 257, - 245, - 258, - 213, - 269, - 270, - 231, - 243, - 244, - 251, - 237, - 257, - 274, - 246, - 272, - 244, - 220, - 250, - 232, - 223, - 281, - 256, - 258, - 254, - 247, - 260, - 249, - 295, - 244, - 251, - 255, - 255, - 270, - 247, - 249, - 273, - 252, - 265, - 242, - 246, - 220, - 238, - 254, - 279, - 255, - 256, - 234, - 250, - 249, - 282, - 258, - 224, - 199, - 262, - 227, - 283, - 256, - 249, - 231, - 262, - 257, - 250, - 234, - 226, - 238, - 272, - 242, - 223, - 264, - 262, - 237, - 246, - 265, - 237, - 270, - 267, - 230, - 267, - 256, - 245, - 271, - 233, - 229, - 246, - 265, - 267, - 252, - 246, - 255, - 221, - 236, - 256, - 289, - 275, - 245, - 226, - 271, - 255, - 258, - 263, - 218, - 257, - 243, - 264, - 250, - 244, - 271, - 271, - 252, - 233, - 271, - 232, - 248, - 231, - 245, - 216, - 237, - 253, - 269, - 239, - 274, - 232, - 238, - 217, - 240, - 236, - 261, - 219, - 225, - 234, - 229, - 228, - 260, - 233, - 248, - 252, - 247, - 256, - 236, - 212, - 286, - 256, - 254, - 251, - 251, - 276, - 268, - 245, - 258, - 228, - 260, - 243, - 245, - 245, - 228, - 231, - 247, - 263, - 237, - 249, - 244, - 272, - 229, - 249, - 240, - 259, - 224, - 266, - 261, - 237, - 223, - 271, - 249, - 254, - 264, - 260, - 264, - 235, - 248, - 242, - 279, - 267, - 242, - 263, - 245, - 269, - 246, - 235, - 238, - 256, - 242, - 261, - 298, - 222, - 236, - 264, - 245, - 259, - 267, - 248, - 263, - 237, - 228, - 241, - 263, - 264, - 251, - 248, - 249, - 252, - 232, - 246, - 218, - 248, - 251, - 251, - 241, - 276, - 250, - 265, - 256, - 279, - 235, - 260, - 249, - 286, - 255, - 255, - 265, - 274, - 271, - 228, - 255, - 229, - 240, - 268, - 258, - 272, - 252, - 244, - 261, - 252, - 238, - 251, - 246, - 222, - 259, - 247, - 256, - 266, - 248, - 241, - 247, - 232, - 266, - 238, - 245, - 231, - 289, - 253, - 237, - 273, - 231, - 241, - 240, - 237, - 258, - 285, - 248, - 254, - 254, - 237, - 253, - 232, - 222, - 243, - 263, - 257, - 241, - 255, - 253, - 234, - 266, - 245, - 267, - 258, - 248, - 277, - 253, - 235, - 230, - 294, - 235, - 234, - 262, - 245, - 258, - 248, - 247, - 249, - 245, - 270, - 230, - 259, - 293, - 271, - 243, - 241, - 254, - 218, - 267, - 231, - 255, - 254, - 285, - 262, - 253, - 238, - 269, - 252, - 270, - 241, - 242, - 249, - 256, - 255, - 276, - 241, - 266, - 212, - 242, - 271, - 249, - 285, - 268, - 250, - 232, - 268, - 266, - 255, - 222, - 250, - 259, - 261, - 248, - 258, - 268, - 228, - 259, - 221, - 253, - 254, - 232, - 256, - 258, - 242, - 281, - 216, - 258, - 228, - 256, - 265, - 261, - 250, - 255, - 275, - 257, - 224, - 263, - 272, - 251, - 246, - 244, - 269, - 244, - 260, - 250, - 250, - 231, - 271, - 239, - 232, - 239, - 234, - 270, - 257, - 281, - 263, - 245, - 246, - 239, - 275, - 259, - 219, - 225, - 233, - 240, - 254, - 230, - 232, - 244, - 247, - 261, - 249, - 248, - 233, - 260, - 238, - 269, - 264, - 237, - 239, - 249, - 235, - 266, - 245, - 268, - 242, - 259, - 272, - 271, - 268, - 229, - 220, - 278, - 237, - 263, - 238, - 268, - 232, - 287, - 261, - 228, - 261, - 272, - 279, - 252, - 240, - 292, - 244, - 244, - 246, - 256, - 256, - 244, - 257, - 257, - 240, - 237, - 230, - 271, - 249, - 282, - 243, - 239, - 248, - 249, - 242, - 241, - 269, - 267, - 282, - 247, - 240, - 259, - 251, - 251, - 282, - 255, - 252, - 259, - 238, - 259, - 224, - 230, - 254, - 240, - 246, - 251, - 236, - 253, - 252, - 264, - 244, - 252, - 244, - 293, - 279, - 256, - 264, - 246, - 224, - 262, - 258, - 256, - 265, - 252, - 230, - 252, - 258, - 250, - 218, - 267, - 272, - 236, - 254, - 254, - 246, - 264, - 261, - 234, - 246, - 269, - 248, - 240, - 229, - 240, - 230, - 233, - 221, - 237, - 249, - 233, - 245, - 243, - 266, - 266, - 255, - 240, - 273, - 253, - 259, - 229, - 243, - 244, - 249, - 218, - 275, - 258, - 251, - 264, - 255, - 255, - 223, - 221, - 244, - 264, - 247, - 245, - 255, - 238, - 246, - 213, - 208, - 238, - 253, - 246, - 266, - 239, - 255, - 243, - 274, - 296, - 254, - 225, - 235, - 265, - 243, - 236, - 258, - 262, - 263, - 246, - 259, - 244, - 257, - 299, - 228, - 251, - 261, - 245, - 240, - 267, - 245, - 275, - 237, - 260, - 269, - 234, - 208, - 237, - 249, - 238, - 234, - 251, - 280, - 264, - 262, - 245, - 231, - 231, - 234, - 259, - 227, - 269, - 246, - 275, - 236, - 207, - 259, - 245, - 248, - 231, - 261, - 240, - 250, - 243, - 266, - 252, - 260, - 259, - 234, - 240, - 248, - 228, - 240, - 241, - 264, - 241, - 231, - 226, - 250, - 247, - 285, - 272, - 253, - 236, - 249, - 252, - 245, - 273, - 265, - 243, - 232, - 257, - 245, - 254, - 261, - 264, - 245, - 238, - 222, - 234, - 225, - 261, - 271, - 265, - 204, - 253, - 241, - 255, - 265, - 248, - 217, - 254, - 234, - 246, - 247, - 237, - 251, - 237, - 231, - 254, - 225, - 238, - 260, - 252, - 245, - 244, - 261, - 256, - 224, - 249, - 287, - 250, - 245, - 248, - 262, - 239, - 232, - 278, - 245, - 268, - 251, - 257, - 236, - 242, - 271, - 236, - 245, - 252, - 252, - 272, - 253, - 236, - 272, - 229, - 236, - 248, - 290, - 267, - 235, - 225, - 269, - 233, - 280, - 255, - 249, - 218, - 233, - 268, - 250, - 204, - 247, - 238, - 276, - 215, - 230, - 242, - 290, - 260, - 261, - 257, - 238, - 256, - 271, - 248, - 238, - 227, - 253, - 227, - 248, - 251, - 238, - 253, - 288, - 270, - 221, - 231, - 247, - 245, - 233, - 241, - 250, - 230, - 262, - 267, - 247, - 235, - 263, - 258, - 239, - 247, - 246, - 247, - 231, - 249, - 250, - 245, - 232, - 250, - 261, - 273, - 240, - 256, - 254, - 234, - 222, - 252, - 210, - 255, - 251, - 274, - 242, - 248, - 256, - 239, - 243, - 239, - 233, - 219, - 260, - 216, - 241, - 273, - 226, - 259, - 239, - 261, - 265, - 254, - 272, - 232, - 253, - 268, - 266, - 247, - 258, - 273, - 262, - 283, - 266, - 270, - 246, - 243, - 238, - 239, - 247, - 254, - 234, - 249, - 225, - 267, - 272, - 233, - 265, - 246, - 271, - 236, - 253, - 221, - 251, - 247, - 261, - 251, - 242, - 254, - 253, - 241, - 234, - 259, - 242, - 220, - 276, - 259, - 259, - 277, - 228, - 246, - 266, - 275, - 233, - 252, - 253, - 243, - 263, - 262, - 260, - 254, - 241, - 247, - 244, - 252, - 258, - 262, - 255, - 222, - 256, - 241, - 258, - 262, - 260, - 222, - 265, - 234, - 266, - 260, - 238, - 239, - 239, - 253, - 270, - 253, - 250, - 254, - 272, - 227, - 246 - ] - } - ], - "default_value": 0 - }, - "null_count": 0, - "tot_col_size": 0, - "last_update_version": 413254473936535553, - "correlation": 0 - } - }, - "count": 536284, - "modify_count": 121989, - "partitions": null -} \ No newline at end of file diff --git a/cmd/explaintest/s/tpch_stats/customer.json b/cmd/explaintest/s/tpch_stats/customer.json deleted file mode 100644 index fd8fc02829026..0000000000000 --- a/cmd/explaintest/s/tpch_stats/customer.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"customer","columns":{"c_acctbal":{"histogram":{"ndv":1115904,"buckets":[{"count":30000,"lower_bound":"LTk5Ni44NA==","upper_bound":"LTkzOS43Mg==","repeats":6},{"count":60000,"lower_bound":"LTkzOS4xMw==","upper_bound":"LTkwNC4zOQ==","repeats":6},{"count":90000,"lower_bound":"LTkwMy40NQ==","upper_bound":"LTg2Ni40OA==","repeats":6},{"count":120000,"lower_bound":"LTg2NS41Mg==","upper_bound":"LTgyNC44Mg==","repeats":6},{"count":150000,"lower_bound":"LTgyMy45NQ==","upper_bound":"LTc4My4yNA==","repeats":6},{"count":180000,"lower_bound":"LTc4Mi40Ng==","upper_bound":"LTcyMi40Ng==","repeats":6},{"count":210000,"lower_bound":"LTcyMC42Nw==","upper_bound":"LTY3My4xOA==","repeats":6},{"count":240000,"lower_bound":"LTY3MC45Mw==","upper_bound":"LTYyNi4z","repeats":6},{"count":270000,"lower_bound":"LTYyNi4yNA==","upper_bound":"LTU4NS40Mg==","repeats":6},{"count":300000,"lower_bound":"LTU4My4xNQ==","upper_bound":"LTUzOC4xOA==","repeats":6},{"count":330000,"lower_bound":"LTUzNy42MQ==","upper_bound":"LTQ5Ny43Mw==","repeats":6},{"count":360000,"lower_bound":"LTQ5Ny41MQ==","upper_bound":"LTQ1Mi41Mw==","repeats":6},{"count":390000,"lower_bound":"LTQ1Mi4yOA==","upper_bound":"LTQxMS40Mw==","repeats":6},{"count":420000,"lower_bound":"LTQxMC4xOQ==","upper_bound":"LTM2NC4yNA==","repeats":6},{"count":450000,"lower_bound":"LTM2My45Ng==","upper_bound":"LTMxOS42NQ==","repeats":6},{"count":480000,"lower_bound":"LTMxOS4xMw==","upper_bound":"LTI3OS44Mw==","repeats":6},{"count":510000,"lower_bound":"LTI3OS41NA==","upper_bound":"LTIzMy4yOA==","repeats":6},{"count":540000,"lower_bound":"LTIzMy4wNg==","upper_bound":"LTE4MS40NQ==","repeats":6},{"count":570000,"lower_bound":"LTE4MS4xMQ==","upper_bound":"LTEyMC44OA==","repeats":6},{"count":600000,"lower_bound":"LTEyMC43OA==","upper_bound":"LTc4Ljg2","repeats":6},{"count":630000,"lower_bound":"LTc3LjA3","upper_bound":"LTQyLjg2","repeats":6},{"count":660000,"lower_bound":"LTM5Ljc1","upper_bound":"Mi43","repeats":6},{"count":690000,"lower_bound":"My4xNw==","upper_bound":"NDQuNTc=","repeats":6},{"count":720000,"lower_bound":"NDUuMDM=","upper_bound":"OTIuMzc=","repeats":6},{"count":750000,"lower_bound":"OTIuNzc=","upper_bound":"MTM2LjQ0","repeats":6},{"count":780000,"lower_bound":"MTM3Ljg2","upper_bound":"MTczLjE5","repeats":6},{"count":810000,"lower_bound":"MTczLjM0","upper_bound":"MjIxLjU0","repeats":6},{"count":840000,"lower_bound":"MjIxLjU1","upper_bound":"MjUyLjc2","repeats":6},{"count":870000,"lower_bound":"MjUzLjM=","upper_bound":"Mjk2LjM=","repeats":6},{"count":900000,"lower_bound":"Mjk2Ljk5","upper_bound":"MzQ2LjM=","repeats":6},{"count":930000,"lower_bound":"MzQ2LjQ4","upper_bound":"Mzg3LjA4","repeats":6},{"count":960000,"lower_bound":"Mzg3LjU1","upper_bound":"NDM0LjM3","repeats":6},{"count":990000,"lower_bound":"NDM1LjAz","upper_bound":"NDY2LjQ4","repeats":6},{"count":1020000,"lower_bound":"NDY2LjYy","upper_bound":"NTEyLjU0","repeats":6},{"count":1050000,"lower_bound":"NTEyLjg2","upper_bound":"NTQ4LjA1","repeats":6},{"count":1080000,"lower_bound":"NTQ4LjM3","upper_bound":"NTgwLjAx","repeats":6},{"count":1110000,"lower_bound":"NTgwLjY5","upper_bound":"NjI1LjQz","repeats":6},{"count":1140000,"lower_bound":"NjI2LjY0","upper_bound":"Njg3","repeats":6},{"count":1170000,"lower_bound":"Njg3LjI0","upper_bound":"NzMzLjE1","repeats":6},{"count":1200000,"lower_bound":"NzM1LjMy","upper_bound":"Nzc0Ljk4","repeats":6},{"count":1230000,"lower_bound":"Nzc3LjQ4","upper_bound":"ODIzLjIx","repeats":6},{"count":1260000,"lower_bound":"ODI0Ljg0","upper_bound":"ODU2LjQ2","repeats":6},{"count":1290000,"lower_bound":"ODU2LjY4","upper_bound":"ODg3Ljk2","repeats":6},{"count":1320000,"lower_bound":"ODg4Ljk2","upper_bound":"OTM5Ljg4","repeats":6},{"count":1350000,"lower_bound":"OTQxLjMz","upper_bound":"OTc3LjI0","repeats":6},{"count":1380000,"lower_bound":"OTc4LjYy","upper_bound":"MTA0MS4yMQ==","repeats":6},{"count":1410000,"lower_bound":"MTA0MS4zNg==","upper_bound":"MTA4MC41MQ==","repeats":6},{"count":1440000,"lower_bound":"MTA4MC45MQ==","upper_bound":"MTEyNC4xNw==","repeats":6},{"count":1470000,"lower_bound":"MTEyNi41Nw==","upper_bound":"MTE1OS41NA==","repeats":6},{"count":1500000,"lower_bound":"MTE2MC41Mw==","upper_bound":"MTIxOS4wNQ==","repeats":6},{"count":1530000,"lower_bound":"MTIyNC4yMQ==","upper_bound":"MTI2My4xMQ==","repeats":6},{"count":1560000,"lower_bound":"MTI2NC4xOQ==","upper_bound":"MTMxMy4xNw==","repeats":6},{"count":1590000,"lower_bound":"MTMxMy44OA==","upper_bound":"MTM1Ni4z","repeats":6},{"count":1620000,"lower_bound":"MTM1Ny4xOA==","upper_bound":"MTQwOS4zMg==","repeats":6},{"count":1650000,"lower_bound":"MTQxMS4zMw==","upper_bound":"MTQ1NC40NA==","repeats":6},{"count":1680000,"lower_bound":"MTQ1NC40Ng==","upper_bound":"MTQ4NC42Ng==","repeats":6},{"count":1710000,"lower_bound":"MTQ4NC44OQ==","upper_bound":"MTUzNi45OQ==","repeats":6},{"count":1740000,"lower_bound":"MTUzOC41OA==","upper_bound":"MTU3My4xNQ==","repeats":6},{"count":1770000,"lower_bound":"MTU3My42OQ==","upper_bound":"MTYxNy44","repeats":6},{"count":1800000,"lower_bound":"MTYxOS4zMQ==","upper_bound":"MTY2MS4xNg==","repeats":6},{"count":1830000,"lower_bound":"MTY2MS44","upper_bound":"MTY5OS4yNA==","repeats":6},{"count":1860000,"lower_bound":"MTY5OS41Ng==","upper_bound":"MTc0My43Mw==","repeats":6},{"count":1890000,"lower_bound":"MTc0NC4yNA==","upper_bound":"MTc4NC4y","repeats":6},{"count":1920000,"lower_bound":"MTc4NS45Mw==","upper_bound":"MTgyNS45","repeats":6},{"count":1950000,"lower_bound":"MTgzMC44NA==","upper_bound":"MTg2Ni43OQ==","repeats":6},{"count":1980000,"lower_bound":"MTg2Ny40Ng==","upper_bound":"MTkxMS4xMg==","repeats":6},{"count":2010000,"lower_bound":"MTkxMS4yNg==","upper_bound":"MTk1My4yMg==","repeats":6},{"count":2040000,"lower_bound":"MTk1NS4yNg==","upper_bound":"MTk5Ni44MQ==","repeats":6},{"count":2070000,"lower_bound":"MTk5Ny4zOQ==","upper_bound":"MjAzMi41MQ==","repeats":6},{"count":2100000,"lower_bound":"MjAzMy4wOQ==","upper_bound":"MjA3NC4z","repeats":6},{"count":2130000,"lower_bound":"MjA3NC4zMQ==","upper_bound":"MjExOS42Ng==","repeats":6},{"count":2160000,"lower_bound":"MjEyMC41Mw==","upper_bound":"MjE3My41OA==","repeats":6},{"count":2190000,"lower_bound":"MjE3NS44OQ==","upper_bound":"MjIzMC44NQ==","repeats":6},{"count":2220000,"lower_bound":"MjIzMS42NA==","upper_bound":"MjI4My45Ng==","repeats":6},{"count":2250000,"lower_bound":"MjI4NS4zNQ==","upper_bound":"MjMyNS4zOQ==","repeats":756},{"count":2280000,"lower_bound":"MjMyNi4yNg==","upper_bound":"MjM3NS43Nw==","repeats":6},{"count":2310000,"lower_bound":"MjM3Ni44MQ==","upper_bound":"MjQxNC44NQ==","repeats":6},{"count":2340000,"lower_bound":"MjQxNS4xNA==","upper_bound":"MjQ1OS42Nw==","repeats":6},{"count":2370000,"lower_bound":"MjQ2MC4yMQ==","upper_bound":"MjQ5NS4yNg==","repeats":6},{"count":2400000,"lower_bound":"MjQ5OS41Mw==","upper_bound":"MjU0Mi44Mw==","repeats":6},{"count":2430000,"lower_bound":"MjU0Mi45OQ==","upper_bound":"MjU3Ny4zMQ==","repeats":6},{"count":2460000,"lower_bound":"MjU4MC43Mg==","upper_bound":"MjYxOS4zNA==","repeats":6},{"count":2490000,"lower_bound":"MjYyMC4xNw==","upper_bound":"MjY1OC44Mg==","repeats":6},{"count":2520000,"lower_bound":"MjY1OS4xMQ==","upper_bound":"MjY5OS42OQ==","repeats":6},{"count":2550000,"lower_bound":"MjY5OS45Nw==","upper_bound":"Mjc0Mi40OQ==","repeats":6},{"count":2580000,"lower_bound":"Mjc0Mi45Ng==","upper_bound":"Mjc4OC41Mg==","repeats":6},{"count":2610000,"lower_bound":"Mjc4OS4xOQ==","upper_bound":"MjgyOS40NQ==","repeats":6},{"count":2640000,"lower_bound":"MjgzMC4zMg==","upper_bound":"Mjg3NS41","repeats":6},{"count":2670000,"lower_bound":"Mjg3NS41NQ==","upper_bound":"MjkxOC42Nw==","repeats":6},{"count":2700000,"lower_bound":"MjkyMC41NQ==","upper_bound":"Mjk1NC43NA==","repeats":6},{"count":2730000,"lower_bound":"Mjk1NS45NQ==","upper_bound":"Mjk5MS40MQ==","repeats":6},{"count":2760000,"lower_bound":"Mjk5Mi4xOQ==","upper_bound":"MzA0NC4yOA==","repeats":6},{"count":2790000,"lower_bound":"MzA0NS4zOA==","upper_bound":"MzA5OS4yOA==","repeats":6},{"count":2820000,"lower_bound":"MzEwMC4z","upper_bound":"MzE0OS40Nw==","repeats":6},{"count":2850000,"lower_bound":"MzE0OS44Mg==","upper_bound":"MzE5Ni42Ng==","repeats":6},{"count":2880000,"lower_bound":"MzE5Ny41MQ==","upper_bound":"MzIzNi45Ng==","repeats":6},{"count":2910000,"lower_bound":"MzIzNy43Nw==","upper_bound":"MzI4My41Ng==","repeats":6},{"count":2940000,"lower_bound":"MzI4NS40Mw==","upper_bound":"MzMyOS4wOQ==","repeats":6},{"count":2970000,"lower_bound":"MzMyOS44Mw==","upper_bound":"MzM2OS42MQ==","repeats":6},{"count":3000000,"lower_bound":"MzM2OS43NA==","upper_bound":"MzQyMS4xNw==","repeats":6},{"count":3030000,"lower_bound":"MzQyMS41MQ==","upper_bound":"MzQ2Ni4zMg==","repeats":6},{"count":3060000,"lower_bound":"MzQ2OC4zNA==","upper_bound":"MzUyNi42NQ==","repeats":6},{"count":3090000,"lower_bound":"MzUyNi43Mg==","upper_bound":"MzU2NS4zNQ==","repeats":6},{"count":3120000,"lower_bound":"MzU2Ni42","upper_bound":"MzYwMy45NA==","repeats":6},{"count":3150000,"lower_bound":"MzYwNi43Ng==","upper_bound":"MzY1MS4xMw==","repeats":6},{"count":3180000,"lower_bound":"MzY1Mi43","upper_bound":"MzY5Mi43","repeats":6},{"count":3210000,"lower_bound":"MzY5My45MQ==","upper_bound":"MzczNi4xMQ==","repeats":6},{"count":3240000,"lower_bound":"Mzc0MS4wNg==","upper_bound":"Mzc2OS44NQ==","repeats":6},{"count":3270000,"lower_bound":"Mzc3MC45NA==","upper_bound":"MzgwOS43OQ==","repeats":6},{"count":3300000,"lower_bound":"MzgxMC42","upper_bound":"Mzg1Ni40Mw==","repeats":6},{"count":3330000,"lower_bound":"Mzg1Ny4wMQ==","upper_bound":"MzkwMS44NA==","repeats":6},{"count":3360000,"lower_bound":"MzkwMi40Mw==","upper_bound":"MzkzNC45Ng==","repeats":6},{"count":3390000,"lower_bound":"MzkzNS45Mw==","upper_bound":"Mzk4Ny42Ng==","repeats":6},{"count":3420000,"lower_bound":"Mzk4OS4zMw==","upper_bound":"NDAzOC4wNQ==","repeats":6},{"count":3450000,"lower_bound":"NDAzOC42NA==","upper_bound":"NDA3OS42OQ==","repeats":6},{"count":3480000,"lower_bound":"NDA3OS45","upper_bound":"NDExMy45MQ==","repeats":6},{"count":3510000,"lower_bound":"NDExNi44NQ==","upper_bound":"NDE1OS4yMQ==","repeats":6},{"count":3540000,"lower_bound":"NDE2MC4wNQ==","upper_bound":"NDIxMS4wMQ==","repeats":6},{"count":3570000,"lower_bound":"NDIxMS43Mg==","upper_bound":"NDI0OS4xOA==","repeats":6},{"count":3600000,"lower_bound":"NDI0OS4yMg==","upper_bound":"NDI5NC4yMg==","repeats":6},{"count":3630000,"lower_bound":"NDI5NC44OA==","upper_bound":"NDM0My40MQ==","repeats":6},{"count":3660000,"lower_bound":"NDM0My43Mw==","upper_bound":"NDM4Ny42MQ==","repeats":6},{"count":3690000,"lower_bound":"NDM4OC40Ng==","upper_bound":"NDQyMy4yMw==","repeats":6},{"count":3720000,"lower_bound":"NDQyNC4zOQ==","upper_bound":"NDQ1NC4xMw==","repeats":6},{"count":3750000,"lower_bound":"NDQ1NC4y","upper_bound":"NDQ5MC4xMw==","repeats":6},{"count":3780000,"lower_bound":"NDQ5Mi40OA==","upper_bound":"NDUzOS42MQ==","repeats":6},{"count":3810000,"lower_bound":"NDU0MS44Mw==","upper_bound":"NDU4Ni4wNQ==","repeats":6},{"count":3840000,"lower_bound":"NDU4Ny4zNg==","upper_bound":"NDY0MS42Mg==","repeats":6},{"count":3870000,"lower_bound":"NDY0Mi42NQ==","upper_bound":"NDY4Ni43NQ==","repeats":6},{"count":3900000,"lower_bound":"NDY4OC42OQ==","upper_bound":"NDcyMy4yMQ==","repeats":6},{"count":3930000,"lower_bound":"NDcyNC4yMw==","upper_bound":"NDc2Ny4yNQ==","repeats":6},{"count":3960000,"lower_bound":"NDc2Ny4zOQ==","upper_bound":"NDc5OC41MQ==","repeats":6},{"count":3990000,"lower_bound":"NDgwMC4xMw==","upper_bound":"NDg2OS4zNg==","repeats":6},{"count":4020000,"lower_bound":"NDg3MC4yMg==","upper_bound":"NDkxMC43Ng==","repeats":6},{"count":4050000,"lower_bound":"NDkxMC44NQ==","upper_bound":"NDk1Ny45OA==","repeats":6},{"count":4080000,"lower_bound":"NDk1OS44OQ==","upper_bound":"NDk5OC4zMg==","repeats":6},{"count":4110000,"lower_bound":"NDk5OS4zNQ==","upper_bound":"NTA0NS41Nw==","repeats":6},{"count":4140000,"lower_bound":"NTA0NS44Mg==","upper_bound":"NTA4NC41","repeats":6},{"count":4170000,"lower_bound":"NTA4NC42Nw==","upper_bound":"NTE0Mi40OQ==","repeats":6},{"count":4200000,"lower_bound":"NTE0My42OA==","upper_bound":"NTE4Ni4yNA==","repeats":6},{"count":4230000,"lower_bound":"NTE4Ny4yNQ==","upper_bound":"NTIyNi4zNQ==","repeats":6},{"count":4260000,"lower_bound":"NTIyOC42Ng==","upper_bound":"NTI3My4yNA==","repeats":6},{"count":4290000,"lower_bound":"NTI3My4zMQ==","upper_bound":"NTMxMS43MQ==","repeats":6},{"count":4320000,"lower_bound":"NTMxMy4z","upper_bound":"NTM2MS4wNA==","repeats":6},{"count":4350000,"lower_bound":"NTM2My44","upper_bound":"NTQwMS44NA==","repeats":6},{"count":4380000,"lower_bound":"NTQwMy45OA==","upper_bound":"NTQ0NS4wNA==","repeats":6},{"count":4410000,"lower_bound":"NTQ0NS4xNA==","upper_bound":"NTQ4OS4xOQ==","repeats":6},{"count":4440000,"lower_bound":"NTQ5MQ==","upper_bound":"NTU0NS4xNg==","repeats":6},{"count":4470000,"lower_bound":"NTU0NS4zMw==","upper_bound":"NTU4Mi42","repeats":6},{"count":4500000,"lower_bound":"NTU4Mi42Mw==","upper_bound":"NTYyMS43NA==","repeats":6},{"count":4530000,"lower_bound":"NTYyMS43OQ==","upper_bound":"NTY2NC4yNg==","repeats":6},{"count":4560000,"lower_bound":"NTY2NC44Nw==","upper_bound":"NTcxMi4wOA==","repeats":6},{"count":4590000,"lower_bound":"NTcxMi40Ng==","upper_bound":"NTc1MS4wNg==","repeats":6},{"count":4620000,"lower_bound":"NTc1My4yNw==","upper_bound":"NTc5NS40","repeats":6},{"count":4650000,"lower_bound":"NTc5Ny44Ng==","upper_bound":"NTgzMC40OQ==","repeats":6},{"count":4680000,"lower_bound":"NTgzMS4yMQ==","upper_bound":"NTg3MS44","repeats":6},{"count":4710000,"lower_bound":"NTg3NC4yNg==","upper_bound":"NTkyNS41Mw==","repeats":6},{"count":4740000,"lower_bound":"NTkyNi4zNg==","upper_bound":"NTk2Mi4yNQ==","repeats":6},{"count":4770000,"lower_bound":"NTk2NS4wMg==","upper_bound":"NjAwMy43Mw==","repeats":6},{"count":4800000,"lower_bound":"NjAwNC4zOQ==","upper_bound":"NjA1Mi44Mg==","repeats":6},{"count":4830000,"lower_bound":"NjA1Mi44Mw==","upper_bound":"NjA5MS42Nw==","repeats":6},{"count":4860000,"lower_bound":"NjA5NC42","upper_bound":"NjEyOS44","repeats":6},{"count":4890000,"lower_bound":"NjEzMC40NA==","upper_bound":"NjE2OS4yOQ==","repeats":6},{"count":4920000,"lower_bound":"NjE3MC43Ng==","upper_bound":"NjIxMy4zOA==","repeats":6},{"count":4950000,"lower_bound":"NjIxNC4yNQ==","upper_bound":"NjI1MS44OA==","repeats":6},{"count":4980000,"lower_bound":"NjI1Ny45Nw==","upper_bound":"NjMwOS42NQ==","repeats":6},{"count":5010000,"lower_bound":"NjMxMy4yNg==","upper_bound":"NjM1OC40","repeats":6},{"count":5040000,"lower_bound":"NjM1OC42Nw==","upper_bound":"NjM5Ny4xMQ==","repeats":6},{"count":5070000,"lower_bound":"NjM5OS40NA==","upper_bound":"NjQ0NC44NA==","repeats":6},{"count":5100000,"lower_bound":"NjQ0NS44Ng==","upper_bound":"NjQ4OS45OA==","repeats":6},{"count":5130000,"lower_bound":"NjQ5MC42OQ==","upper_bound":"NjUzNy42Mg==","repeats":6},{"count":5160000,"lower_bound":"NjUzOC45MQ==","upper_bound":"NjU4OS42NQ==","repeats":6},{"count":5190000,"lower_bound":"NjU5MC45NQ==","upper_bound":"NjYzMy4wMw==","repeats":6},{"count":5220000,"lower_bound":"NjYzNC4zNQ==","upper_bound":"NjY2OC4wNw==","repeats":6},{"count":5250000,"lower_bound":"NjY3MS41Nw==","upper_bound":"NjcxMC4x","repeats":6},{"count":5280000,"lower_bound":"NjcxMC4xMg==","upper_bound":"Njc0MC4xMw==","repeats":6},{"count":5310000,"lower_bound":"Njc0Mi4yNg==","upper_bound":"Njc4MS41Mw==","repeats":6},{"count":5340000,"lower_bound":"Njc4MS44MQ==","upper_bound":"NjgzMS40Ng==","repeats":6},{"count":5370000,"lower_bound":"NjgzMi4wOQ==","upper_bound":"Njg4NC42Mg==","repeats":6},{"count":5400000,"lower_bound":"Njg4NS43OQ==","upper_bound":"NjkzNS40OQ==","repeats":6},{"count":5430000,"lower_bound":"NjkzNi44MQ==","upper_bound":"Njk3NS4xNA==","repeats":6},{"count":5460000,"lower_bound":"Njk3NS42MQ==","upper_bound":"NzAyNi42Mg==","repeats":6},{"count":5490000,"lower_bound":"NzAyNy4yNg==","upper_bound":"NzA3Mi4zMQ==","repeats":6},{"count":5520000,"lower_bound":"NzA3My4xNA==","upper_bound":"NzEwNS4xNQ==","repeats":6},{"count":5550000,"lower_bound":"NzEwNS41MQ==","upper_bound":"NzE1MC4x","repeats":6},{"count":5580000,"lower_bound":"NzE1MC4zNQ==","upper_bound":"NzE5Ny45Ng==","repeats":6},{"count":5610000,"lower_bound":"NzE5OS4xNQ==","upper_bound":"NzI0My4y","repeats":6},{"count":5640000,"lower_bound":"NzI0My43","upper_bound":"NzI4My41Mw==","repeats":6},{"count":5670000,"lower_bound":"NzI4NS43NA==","upper_bound":"NzMzOC41NQ==","repeats":6},{"count":5700000,"lower_bound":"NzMzOC43Mg==","upper_bound":"NzM3My4wMw==","repeats":6},{"count":5730000,"lower_bound":"NzM3NC44MQ==","upper_bound":"NzQxMA==","repeats":6},{"count":5760000,"lower_bound":"NzQxMC4xNw==","upper_bound":"NzQ2MC41NA==","repeats":6},{"count":5790000,"lower_bound":"NzQ2MS40Ng==","upper_bound":"NzQ5NC42NQ==","repeats":6},{"count":5820000,"lower_bound":"NzQ5NC44","upper_bound":"NzUzNi40Mg==","repeats":6},{"count":5850000,"lower_bound":"NzUzNy4yNg==","upper_bound":"NzU4Mi40Nw==","repeats":6},{"count":5880000,"lower_bound":"NzU4Mi44","upper_bound":"NzYzMy4yNA==","repeats":6},{"count":5910000,"lower_bound":"NzYzMy4yOA==","upper_bound":"NzY3My43Nw==","repeats":6},{"count":5940000,"lower_bound":"NzY3NC4wNw==","upper_bound":"NzcyOC4wOQ==","repeats":6},{"count":5970000,"lower_bound":"NzczMS40Ng==","upper_bound":"Nzc3MC45Mg==","repeats":6},{"count":6000000,"lower_bound":"Nzc3MS44Ng==","upper_bound":"NzgwMy4xMg==","repeats":6},{"count":6030000,"lower_bound":"NzgwMy43","upper_bound":"Nzg0NS41OA==","repeats":6},{"count":6060000,"lower_bound":"Nzg0NS43Mg==","upper_bound":"Nzg5Ny43Ng==","repeats":6},{"count":6090000,"lower_bound":"Nzg5OC43Mg==","upper_bound":"NzkzMi45NA==","repeats":6},{"count":6120000,"lower_bound":"NzkzMy4wOA==","upper_bound":"Nzk2Ny4xMg==","repeats":6},{"count":6150000,"lower_bound":"Nzk2Ny4xNQ==","upper_bound":"ODAwNC44NQ==","repeats":6},{"count":6180000,"lower_bound":"ODAwNS4xNQ==","upper_bound":"ODA0My42","repeats":6},{"count":6210000,"lower_bound":"ODA0NS40NA==","upper_bound":"ODA5NS45NA==","repeats":6},{"count":6240000,"lower_bound":"ODA5Ni40NQ==","upper_bound":"ODE0NS4wMg==","repeats":6},{"count":6270750,"lower_bound":"ODE0NS4x","upper_bound":"ODE4Ny44NQ==","repeats":756},{"count":6300750,"lower_bound":"ODE4OC40MQ==","upper_bound":"ODIyOS42OA==","repeats":6},{"count":6330750,"lower_bound":"ODIzMC4zMQ==","upper_bound":"ODI3NS42OQ==","repeats":6},{"count":6360750,"lower_bound":"ODI3Ny4zOQ==","upper_bound":"ODMyOC4yNA==","repeats":6},{"count":6390750,"lower_bound":"ODMyOS4wOQ==","upper_bound":"ODM3NS45Nw==","repeats":6},{"count":6420750,"lower_bound":"ODM3Ni45OA==","upper_bound":"ODQxMy4zMg==","repeats":6},{"count":6450750,"lower_bound":"ODQxNC42OA==","upper_bound":"ODQ0OS44Mg==","repeats":6},{"count":6480750,"lower_bound":"ODQ1NC45Mw==","upper_bound":"ODUwNi43NA==","repeats":6},{"count":6510750,"lower_bound":"ODUwOC41Ng==","upper_bound":"ODU0Ni4yNw==","repeats":6},{"count":6540750,"lower_bound":"ODU1Mi41Nw==","upper_bound":"ODU4Mi4zOQ==","repeats":6},{"count":6570750,"lower_bound":"ODU4NC42","upper_bound":"ODYyOC42Mg==","repeats":6},{"count":6600750,"lower_bound":"ODYyOS4yOQ==","upper_bound":"ODY2Ni44","repeats":6},{"count":6630750,"lower_bound":"ODY3Mi43","upper_bound":"ODcxMy4zMQ==","repeats":6},{"count":6660750,"lower_bound":"ODcxMy45Mg==","upper_bound":"ODc1MC4z","repeats":6},{"count":6690750,"lower_bound":"ODc1MC42OQ==","upper_bound":"ODc5My45MQ==","repeats":6},{"count":6720750,"lower_bound":"ODc5My45NQ==","upper_bound":"ODgzNS45Nw==","repeats":6},{"count":6750750,"lower_bound":"ODgzNi44Ng==","upper_bound":"ODg5MC4xNA==","repeats":6},{"count":6780750,"lower_bound":"ODg5Mi41Mw==","upper_bound":"ODk0Ni4xNw==","repeats":6},{"count":6810750,"lower_bound":"ODk0Ny42OA==","upper_bound":"ODk5Mi44OA==","repeats":6},{"count":6840750,"lower_bound":"ODk5NC45Mg==","upper_bound":"OTA0Mi40NA==","repeats":6},{"count":6870750,"lower_bound":"OTA0NC4wMw==","upper_bound":"OTA4NC42OA==","repeats":6},{"count":6900750,"lower_bound":"OTA4NS41Mw==","upper_bound":"OTEzMi4wMw==","repeats":6},{"count":6930750,"lower_bound":"OTEzMi40Nw==","upper_bound":"OTE4OC40OQ==","repeats":6},{"count":6960750,"lower_bound":"OTE4OS4zNw==","upper_bound":"OTIxNy45MQ==","repeats":6},{"count":6990750,"lower_bound":"OTIxOC4xNg==","upper_bound":"OTI1Mi41","repeats":6},{"count":7020750,"lower_bound":"OTI1Mi41NQ==","upper_bound":"OTI4Ni4wMQ==","repeats":6},{"count":7050750,"lower_bound":"OTI4Ny41Mw==","upper_bound":"OTMyNS42NA==","repeats":6},{"count":7080750,"lower_bound":"OTMyNy42NQ==","upper_bound":"OTM2OS44Mg==","repeats":6},{"count":7110750,"lower_bound":"OTM3Mi40OA==","upper_bound":"OTQyNS42NQ==","repeats":6},{"count":7140750,"lower_bound":"OTQyNy4yNw==","upper_bound":"OTQ2Ni40OQ==","repeats":6},{"count":7170750,"lower_bound":"OTQ2Ny4wNQ==","upper_bound":"OTUxOS45MQ==","repeats":6},{"count":7200750,"lower_bound":"OTUyMC4xOA==","upper_bound":"OTU1OC4zOA==","repeats":6},{"count":7230750,"lower_bound":"OTU2MS4wOQ==","upper_bound":"OTU5Ny4xOQ==","repeats":6},{"count":7260750,"lower_bound":"OTU5Ny41Nw==","upper_bound":"OTY1MC4zNw==","repeats":6},{"count":7290750,"lower_bound":"OTY1MS4zNw==","upper_bound":"OTY3OS43Mw==","repeats":6},{"count":7320750,"lower_bound":"OTY4Mi4yNQ==","upper_bound":"OTc0Mi43MQ==","repeats":6},{"count":7350750,"lower_bound":"OTc0My4y","upper_bound":"OTc3OC4xOQ==","repeats":6},{"count":7380750,"lower_bound":"OTc3OC45OQ==","upper_bound":"OTgyMC44Ng==","repeats":6},{"count":7410750,"lower_bound":"OTgyMi40MQ==","upper_bound":"OTg2Ny43OA==","repeats":6},{"count":7440750,"lower_bound":"OTg3MC41Mg==","upper_bound":"OTkxMy4xNw==","repeats":6},{"count":7470750,"lower_bound":"OTkxNC4yOQ==","upper_bound":"OTk2NC41Mw==","repeats":6},{"count":7500000,"lower_bound":"OTk2NC42MQ==","upper_bound":"OTk5OS40NQ==","repeats":6}]},"cm_sketch":{"rows":[{"counters":[3947,3578,3595,3502,3483,3642,4027,3688,3500,3695,3630,3885,3725,3719,3509,3573,3654,3637,3708,3714,3692,3724,3571,3389,3776,3390,3733,3673,3640,3700,3513,3569,3454,3485,3775,3529,3953,3646,3582,3568,3420,3663,3997,3534,3680,3663,3576,3329,3772,3479,3426,3837,3870,3608,3774,3849,3863,3541,3864,3685,3552,3612,3594,3525,3696,3466,3420,3806,3624,3849,3993,3755,3771,3968,3630,3584,3823,3752,3635,3513,3754,3720,3748,3906,3526,3396,3736,3525,3845,3760,4082,3418,3643,3574,3724,3850,3613,3700,3733,3436,3538,3645,3698,3593,3780,3751,3319,3767,4027,3706,3482,3695,3760,3563,3792,3405,3534,3498,3649,3600,3483,3899,3367,3613,3490,3517,3498,3545,3608,3543,3758,3640,3645,3802,3748,3721,3815,3833,3692,3877,3833,3792,3503,3799,3610,4026,3703,3598,3661,3485,3519,3867,3571,3861,3919,3843,3452,3451,3726,3539,3754,3865,3872,3772,3546,3492,3467,3768,3697,3788,3649,3552,3683,3701,3768,3480,3682,3425,3592,3516,3703,3537,3748,3824,3954,3681,3865,3587,3972,3311,3599,3750,3696,3669,3595,3586,3734,3846,3601,3902,3800,3882,3496,3457,3612,3769,3750,3606,3702,3645,3614,3803,3551,3977,3517,3671,3312,3788,3610,3821,3966,3358,3859,3376,3668,3750,3672,3762,3985,3469,3510,3757,3592,3452,3490,3611,3816,3577,3611,3594,3787,3816,3502,3539,3764,3845,3440,3448,3671,3620,3703,3846,3785,3423,3572,3413,3796,3681,3553,3695,3657,3352,3277,3818,3882,3636,3758,3729,3657,3350,3721,3649,3716,3562,3631,3845,3545,3525,3585,3442,3683,3860,3787,3768,3442,3657,3943,3798,3687,3825,3900,3671,3877,3763,3538,3546,3889,3481,4011,3542,3634,3773,3413,3571,3775,3537,3767,3658,3893,3407,3540,3733,3533,3489,3637,3669,3745,3676,3552,3432,3712,3945,3251,3416,3340,3710,3795,3505,3718,3692,3475,3494,3825,3714,3770,3814,3795,3587,3551,3695,3610,3614,3527,3828,3518,3678,3490,3702,3339,3839,3190,3867,3711,3584,3733,3683,3555,3809,3573,3733,3719,3803,3838,3633,3713,3438,3363,3522,3642,3602,3741,3733,3611,3654,3932,3700,3507,3588,3447,3784,3676,3484,3808,3743,3379,3684,3635,3582,3566,3708,3638,3649,3879,3800,3761,3569,3373,3697,3689,3627,4137,3681,3592,3577,3687,3539,3859,3875,3755,3571,3577,3700,3642,3850,3767,3665,3654,3995,3572,3826,3411,3704,3454,3987,3905,3673,3642,3722,3626,3666,3606,3606,3560,3771,3614,3301,3684,3418,3587,3653,3555,3553,3878,3688,3520,3678,3651,3606,3870,3558,3595,3547,3585,3659,3787,3492,3692,3751,3441,3569,3940,3611,3754,3837,3647,3847,3835,3544,4039,3565,3725,3294,4095,3467,3846,3861,3787,3717,3730,3399,3364,3686,3635,3499,3500,3830,3584,3898,3682,3585,3539,3517,3778,3482,3662,3679,3464,3850,3452,3355,3456,3664,3614,4060,3891,3424,3737,3467,3605,3761,3728,3891,3716,3653,3961,3860,3531,3641,3593,3526,3915,3355,3711,3499,3897,3772,3403,3773,3373,3702,3409,3778,3558,3623,3440,3405,3907,3994,3873,3535,3797,3604,3754,3816,3959,3557,3562,3927,3556,3705,3791,3761,3426,4033,3741,3697,3475,3579,3460,3912,3647,3388,3818,3900,3417,3650,3363,3562,3747,3844,3535,3835,3511,3449,3692,3878,3781,3683,3702,3635,3685,3635,3821,3655,3380,3595,3364,3510,3664,3658,3600,3624,3857,3565,3763,3399,3113,3621,3659,3359,3754,3843,3574,3783,3704,3448,3624,3746,3844,3937,3610,3638,3483,3755,3752,3434,3710,3661,3564,3704,3569,3649,3755,3757,3960,3511,3443,3531,3601,3645,3769,4052,3443,3493,3626,3775,3763,3706,3621,3592,3953,3721,3487,3525,3571,3503,3692,3726,3609,3800,3587,3788,3738,3818,3902,3899,3579,3655,3606,3618,3972,3607,3579,4042,3609,3600,3539,3569,3587,3524,3385,3795,3724,3729,3475,3523,3518,3670,3500,3524,4073,3715,3973,3525,3691,3750,3548,3521,3549,3942,3410,3722,3779,3784,3772,3820,3656,3552,3439,3787,3438,3803,3561,3560,3542,3706,3453,3592,3591,3758,3711,3635,3780,3688,3957,3783,3599,3851,3868,3700,3851,3744,3763,3701,3728,3749,3837,3412,3668,3617,3893,3393,3695,3659,3537,4082,3413,3529,3411,3579,3887,3710,3308,3711,3686,3826,3729,3937,3757,3686,3625,3934,3507,3966,3768,3653,3289,3597,3770,3628,3794,3869,3661,3681,3569,3556,3888,3269,3788,3581,3839,3625,3221,3761,3820,3758,3625,3450,3339,3479,3622,3779,3791,3604,3580,3944,3381,3902,3420,3480,3783,3497,3478,3421,3475,3661,3668,3682,3504,3636,3601,3295,3712,3651,4131,3662,3437,3542,3834,3817,3696,3661,3604,3649,3671,3534,3898,3926,3627,3575,3602,3666,3501,3611,3286,3558,3790,3859,3535,3861,3416,3563,3793,3507,3703,3667,3513,3678,3920,3627,3799,3756,3546,3637,4006,3735,3359,3552,3678,3853,3808,3603,3642,3749,3763,4000,3159,3472,3803,3664,3856,3790,3379,3703,3658,3709,3863,3593,3452,3732,3608,4030,3574,3608,3945,3877,3559,3694,3367,3689,3558,3582,3453,3865,3644,3555,3758,3955,3809,3725,3536,3765,3663,3489,3741,3621,3582,3866,3571,3724,3749,3877,3920,3438,3777,3740,3465,3884,3712,3698,3728,3659,3555,3602,3724,3417,3651,3668,3475,3504,3538,3883,3661,3636,3799,3657,3492,3670,3388,3596,3432,3418,3492,3658,3410,3949,3988,3577,3434,3772,3867,3839,3825,3709,3569,3618,3340,3416,3452,3713,3526,3505,3642,3753,3519,3715,3197,3560,3494,3647,3250,3816,3743,3778,3845,3543,3684,3854,3677,3766,3367,3569,3811,3860,3755,3559,3624,3618,4024,3728,3702,3572,3778,3571,3458,3792,3982,3355,4098,3804,3673,3522,3373,3470,3801,3602,3889,3499,3453,3616,3419,3454,3856,4043,3439,3680,3807,3643,3985,3678,3795,3828,4061,3820,3720,3523,3341,3958,3477,3585,3988,3780,3571,3823,3922,3803,3650,3773,3503,3416,3571,4107,3403,3537,3623,3792,3317,3780,3964,3629,3502,3750,3945,3534,3562,3463,3660,3687,3522,3567,3366,3660,3694,3623,3439,3724,3719,3484,3671,3851,3783,3930,3620,3437,3690,3609,3674,3666,3831,3819,3461,3883,3911,3784,3434,3441,3901,3480,3996,3865,3677,3580,3719,3615,3342,3693,3583,3669,3282,3411,3442,3807,3413,3785,3611,3673,3713,3305,3976,3770,3596,3663,3854,3882,3817,3734,3493,3818,3724,3562,3533,3680,3882,3735,3805,3847,3630,3339,3513,3588,3829,3408,3455,3963,3717,3680,3496,3975,3675,3491,3659,3614,3588,4030,3584,3608,3450,3579,4077,3841,3567,3614,3660,3508,3910,3566,3700,3684,3580,3513,3802,3563,3685,3796,3545,3409,3431,3772,3697,3555,3701,3599,3546,3681,3740,3482,3819,3391,3778,3462,3625,3610,3862,3833,3599,3539,3737,3846,3750,3883,3710,3775,3568,3690,3821,3704,3772,3469,3873,3676,3792,3561,3653,3823,3611,3439,3743,4143,3508,3621,3662,3847,3696,3589,3483,3762,3591,3557,3789,3741,3571,3558,3218,3666,3404,3702,3698,3381,3526,3476,3608,4005,3785,4017,3646,3693,3481,3555,3848,3754,3854,3552,3746,3685,4039,3580,3708,3472,3559,3562,3903,3779,3857,3621,3779,3829,3874,3670,3790,3649,3547,3504,3741,3775,3872,3519,3838,3474,3796,3703,3690,3535,3506,3655,3948,3822,3751,3602,3862,3390,3681,3371,3778,3564,3756,3733,3505,3688,3657,3821,3627,3727,3671,3778,3602,3764,3494,3703,3502,3407,3705,3847,3389,3829,3801,3642,3853,3471,3708,3464,3509,3445,3364,3759,3763,3904,3494,3514,3743,3615,3725,3715,3607,3741,3565,3507,3413,3643,3467,3463,3772,3703,3848,3647,3625,3705,3700,3442,3498,3359,3789,3547,3787,3977,3580,3633,3746,3651,3462,3635,3460,3263,3810,3645,3687,3873,3669,3643,3638,3535,3714,3686,3664,3501,3868,3535,3539,3765,3722,3833,3601,3458,3397,3678,3822,3821,3479,3616,3859,3791,3648,3597,3668,3591,3686,3604,3600,3484,3565,3648,3661,3648,3623,3846,3396,3476,4018,3419,3756,3612,3663,3285,3729,3527,3593,3582,3763,3760,3503,3641,3976,3424,3906,3909,3570,3446,3554,3512,3554,3627,3803,3424,3691,3546,3719,3968,3568,3994,3481,3559,3473,3559,3388,3695,3560,3985,3677,3735,3607,3691,3376,3801,3850,3593,3811,3951,3649,3745,3581,3702,3683,3722,3489,3468,3330,3777,3660,3657,3612,3385,3997,3724,3629,3353,3818,3520,3748,3868,3635,3680,3862,3539,3402,3980,3898,3453,3471,3645,3433,3539,4038,3883,3750,3641,3871,3739,3462,3862,3879,3820,3508,3665,3617,3577,3761,3599,3443,3576,3576,3656,3432,3658,3390,3502,3921,3874,4017,3839,3695,3701,3679,3695,3776,3536,3378,3684,3521,3627,3537,3395,3533,3909,3809,3473,3736,3671,3678,3726,3543,3804,3865,3737,3533,3713,4052,3769,3680,4018,3668,3705,3486,4136,3611,3723,3450,3565,3692,3566,3758,3584,3854,3559,3634,3787,3748,3872,3789,3598,3447,3750,4083,3731,3746,3773,3336,3837,3731,3831,3535,3660,3629,3641,3706,3861,4086,3748,3651,3520,3687,4062,3699,3547,3672,3746,3536,3803,3530,3840,3744,3606,3367,3587,3555,3575,3738,3684,3405,3507,3881,3709,4013,3449,3614,3671,3259,3508,3811,3756,3314,3627,3422,3857,3820,4118,3800,3619,3658,3353,3594,3657,3794,3652,3585,3861,3563,3606,3462,3849,3630,3627,3775,3929,3555,3515,4043,3528,3409,3589,3516,3578,4146,3625,3342,3727,3640,3929,3583,3895,3590,3751,3644,3453,3515,3847,3472,3763,3915,4013,3683,3587,3686,3669,3582,3784,3777,3434,3643,3478,3400,3741,3387,3415,3729,3557,3830,3655,3784,3850,3485,3515,3575,3743,3510,3618,3619,3348,3520,3591,3626,3586,3810,3581,3743,3949,3441,3713,3657,3707,3491,3871,4067,3687,3690,3632,3344,3583,3459,3781,3987,4017,3581,3600,3802,3671,3526,3654,3654,3386,3610,3421,3558,3688,3647,3519,3318,3609,3959,3762,3749,3604,3959,3553,3676,3813,3865,3821,4103,3641,3909,3677,3618,3502,3649,3877,3505,3875,3769,3377,3707,3636,3644,3589,3597,3940,3490,3631,3685,3625,3748,4056,3561,3549,3784,3771,3694,3607,3939,3528,3300,3525,3848,3648,3563,3493,3570,3481,3903,3880,3656,3488,3491,3589,3607,3699,3669,3515,3458,3397,4037,3768,3411,3834,3810,3779,3866,3859,3528,3830,3611,3668,3751,3646,3538,3547,3353,3655,4061,3922,3644,3859,3911,3734,3644,3820,4109,3731,3274,3680,3760,3653,3527,3772,3555,3771,3619,3902,3636,3585,3691,3663,3317,3496,3939,3656,3712,3471,3630,3327,3527,3874,3540,3570,3492,3363,3635,3751,3715,3580,3655,3745,3287,3758,3568,3451,3519,3531,3623,3772,3538,3549,3783,3952,3575,3396,3345,3694,3662,3823,3465,3520,3614,3479,3643,3917,3691,3480,3786,3714,3620,3705,4000,3656,3763,3623,3507,3549,3468,3623,3484,3474,3821,3616,3753,3865,3467,3800,3849,3605,3691,3937,3920,3726,3798,3761,3408,3897,3887,3665,3533,3689,3491,3804,3475,3748,3675,3786,3638,3939,3644,3469,3544,3591,3766,3415,3387,3536,3786,3770,3788,3981,3807,3547,3305,3526,3659,3512,3695,3903,3641,3543,3767,4017,3703,3819,3617,3575,3686,3752,3470,3488,3551,4016,3649,3690,3686,3369,3544,3499,3546,3702,3766,3883,3695,3543,3697,3841,3518,3753,3798,3686,3755,3617,3423,3705,3771,3393,3922,3905,3963,3656,3621,3667,3809,3928,3477,3707,3478,3750,3547,3779,3633,3749,3668,3870,3632,3584,3591,3360,3781,3710,3897,3802,3789,3349,3642,3526,3850,3811,3630,3648,3543,3774,3850,3921,3732,3552,3558,3527,3530,3775,3594,3409,3708,3840,3738,3632,3667,3624,3518,3751,3663,3588,3691,3597,3945,3583,3546,3559,3443,3871,4105,3455,3437,3701,3713,3746,3708,3685,3990,3732,3842,3645,3617,3580,3520,3708,3658,3839]},{"counters":[3737,3518,3720,3845,3414,3697,3667,3453,3576,3369,4078,3711,3947,3569,3532,3618,3493,3648,3973,3687,3917,3609,3438,3571,3510,3785,3795,3930,3558,3996,3511,3896,3744,3646,3785,3703,3552,3765,3635,3648,3854,3468,3714,3659,3708,3468,3507,3620,3647,4011,3281,3740,3674,3651,3731,4004,3487,3674,3569,3663,3996,3695,3825,3604,3458,3453,3621,3300,3614,3524,3651,3466,3505,3380,3771,3589,3427,3511,4063,4019,3442,3782,3930,3569,3669,3668,3652,3483,3649,3513,3664,3628,3688,3818,3658,3232,3645,3683,3649,3527,3749,3411,3519,3486,3672,3744,3717,3591,3680,3543,3556,3631,3856,3465,3730,3883,3438,3623,3739,3727,3802,3871,3604,3458,3871,3234,3895,3790,3584,3829,3644,3760,3735,3500,3495,3655,3614,3616,3491,3974,3430,3706,3607,3467,3650,3686,3493,3635,3871,3720,3564,3525,3468,3529,3670,3701,3540,3634,3650,3723,3845,3457,3562,3820,3708,3658,3572,3705,3960,3622,3423,3844,3759,3826,3527,3446,3581,3585,3558,3913,3776,3599,3555,3675,3998,3933,3594,3561,3740,3533,3824,3672,3679,3819,3945,3633,3765,3728,3756,3405,3855,3699,3557,3724,3720,3721,3281,3814,3667,3937,3653,3582,3674,3526,3718,3805,3615,3581,3848,3528,3743,3621,3590,3661,3544,3579,3931,3883,3701,3678,3752,3743,3871,3482,3544,3782,3509,3707,3666,3683,3761,3673,3514,3742,3863,3657,3860,3551,3725,3771,3865,3458,3759,3776,3761,3695,3626,3289,3575,3842,3479,3574,3712,3590,3473,3715,3629,3862,3964,4138,3470,3557,3438,3742,3760,3637,3887,3796,3724,3895,3701,3670,3555,3783,3734,3459,3784,3625,3340,3482,3872,3788,3475,3690,3738,3731,3909,3509,3549,3484,3587,3936,3601,3579,3613,3576,3302,3706,3569,3536,3561,3333,3650,3761,3559,3544,3486,3472,3663,3800,3509,3717,3736,3858,4089,3408,3533,3554,3823,3677,3892,3571,3970,3618,3703,3556,3762,3692,3398,3948,3716,3692,3416,3664,3527,3607,3479,3732,3289,3876,3557,3724,3633,3728,3544,3844,3610,3535,3678,3625,3770,3557,3682,3655,3602,3248,3637,3700,3643,3380,3539,3713,3790,3370,3687,3749,3663,3626,3607,3643,3557,4045,3665,3284,3756,3332,3508,3707,3571,3466,3908,3789,3724,3453,3374,3691,3254,3740,3674,3694,3658,3913,3852,3808,3705,3969,3789,3767,3863,3640,4116,3779,3664,3707,3617,3918,3442,3637,3600,3705,3381,3571,3699,3769,3593,3616,3780,3666,3989,3439,3759,3651,3509,3507,3425,3459,3490,3766,3672,3806,3652,3482,3528,3901,3621,3788,3561,3544,3478,3483,3733,3795,3590,3744,3413,3605,3491,3401,3917,3897,3762,3667,3488,3737,3662,3873,3764,3554,3453,3769,3789,3614,3596,3602,3742,3587,3634,3469,3715,3594,3886,4033,3909,3504,3647,3990,3516,3426,3528,3555,3822,3747,3437,3639,3766,3762,3804,3665,3657,3632,3891,3620,3499,3581,3414,3629,3663,3887,3905,3834,3692,3559,3623,3803,3762,3511,3814,3443,3564,3600,3519,3705,3555,3809,3732,3806,3795,3459,3626,3515,4083,3600,3891,3711,3453,3467,3909,3489,3458,3746,3734,4051,3705,3715,3758,3972,3734,3635,3461,3597,3631,3721,3695,3697,4038,3474,3588,3589,3567,3368,3728,3792,3708,3594,3891,3373,3899,3705,3653,3868,3349,3792,3733,3787,3412,3764,3826,3577,3774,3409,3799,3515,3461,3901,4009,3809,3643,3658,3952,3795,3324,3765,3748,3597,3994,3398,3669,3534,3601,3731,3868,3780,3748,3489,3507,3640,3894,3953,3593,3839,3687,3756,3462,3780,3704,3692,3769,3727,3638,3627,3362,3621,3331,3750,3722,3643,3590,3586,3595,3938,3549,3802,3728,3474,3483,3601,3587,3831,3558,3581,3733,3689,3758,3790,3536,3886,3839,3524,3931,3409,3479,3694,3653,3677,3853,3519,3587,3558,3507,4000,3507,3542,3609,3655,3540,3523,3645,3482,3655,3376,3601,3562,3763,4028,3559,3762,3699,3690,3850,3491,3634,3449,3701,4140,3550,3722,3740,3856,3339,3634,3621,3538,3485,3801,3279,3594,3423,3352,3313,3735,3559,3728,3513,3709,3772,3508,3932,3891,3891,3772,3803,3572,3924,3600,3526,3699,3518,3528,3457,3511,3324,3415,3913,3607,3686,3644,3727,3584,3821,3727,3955,3924,3865,4186,3673,3710,3620,3777,3767,3769,3414,3383,3348,3811,3458,3696,3696,3484,3736,3411,3568,3582,3465,3915,3908,3827,3589,3454,3784,3730,3827,3711,3768,3456,3798,3698,3147,3466,3903,3498,4004,3517,3386,3878,3556,3730,3764,3186,3687,3396,4099,3626,3990,3650,3810,3887,3689,3803,3375,3544,3566,3941,3809,3124,3911,3908,3419,3906,3545,3648,3590,3248,3719,3908,3454,3670,3819,3604,3506,3730,3819,3337,3841,3462,3799,3533,3943,3559,3418,3461,3780,3525,3899,3563,3537,3610,3597,4091,3626,3577,3455,3912,3527,3657,3561,3640,3736,3595,3725,3465,3532,3742,3223,3608,3421,3606,3740,3712,3397,3730,3930,3660,3380,3902,3805,3450,3470,3585,3779,3892,3855,3325,3990,3828,3834,3638,3449,3765,3451,3800,3464,3449,3629,3705,3716,3514,3727,3912,3650,3495,3468,3605,3802,3810,3793,3704,3858,3728,3536,3731,3800,3466,3511,3875,3343,3775,3745,4200,3604,3785,3335,3396,3851,3503,3445,3659,3486,3385,3298,3612,3428,3675,3765,3741,3317,3603,3737,3662,3721,3489,3429,3567,3662,3782,3783,3349,3840,3319,3747,3434,3685,3742,3566,3307,3743,3987,3619,3898,3571,3713,3980,3798,4115,3981,3670,3698,3660,3829,3840,3525,3501,3477,3750,3590,3587,3570,3573,3304,3744,3903,3701,3866,3856,3923,3580,3697,3813,4157,3993,3728,3873,3906,3621,3668,3645,3705,3313,3498,3447,3530,3487,3667,3701,3629,3227,3807,3791,3608,3805,3770,3899,3844,3693,3814,3784,3827,3606,3437,3721,3657,3579,3480,3461,3728,3785,3782,3590,3644,3605,3799,3608,4010,3536,3490,3640,3917,3535,3458,3541,3750,3554,3419,3570,3563,3947,3917,3766,3454,3533,3799,3749,3751,3796,3556,3397,3546,3638,3564,3567,3762,3515,3712,3374,3643,3869,3664,3749,3679,3572,3853,3623,3766,3505,3909,3819,3485,3577,3503,3392,4029,3338,3786,3778,3597,3713,3692,3665,3625,3767,3585,3323,3489,3661,3467,3796,3545,4012,3713,3627,3900,3540,3813,3893,3798,3633,3485,3646,3724,3777,3622,3595,3749,3397,3677,3734,3768,3779,3864,3220,3741,3634,3686,3342,3714,3707,3730,3430,3660,3988,3677,3651,3817,3524,3830,3487,3574,3645,3558,3679,3896,3735,3597,3666,3229,3702,3357,3621,3649,3772,3900,3245,3557,3616,3793,3553,3634,3630,3779,3832,3642,3518,3526,3639,3774,3743,3703,3652,3662,3742,3758,3842,3666,3641,3776,3500,3672,3676,3592,3486,3592,3630,3789,3844,3655,3764,3574,3581,3632,3585,3516,3530,3614,3971,3543,3629,3511,3833,3508,3694,3541,3932,3740,3732,3665,3790,3498,3553,3811,3646,3350,3811,3864,3806,3528,3803,3595,3587,3982,3860,3498,3747,3692,3709,3667,3721,3682,3709,3629,3780,3519,4156,3381,3855,3444,3867,3498,3626,3678,3490,3530,3809,3556,3266,3637,4026,3758,3435,3735,3537,3599,3511,3636,3563,3268,3546,3309,3861,3174,3686,3789,3622,3571,3661,3830,3989,3620,3324,3492,3738,3774,3462,3572,3731,3683,3597,3318,3701,3907,3479,3809,3790,3859,3610,3752,3686,3613,3610,3547,3673,3704,3812,3600,3845,3769,3561,3555,3826,3864,3368,3357,3838,3471,3570,3544,3585,3254,3846,3722,3802,3765,3682,3548,3798,3582,3452,3526,3477,3778,3705,3644,3669,3672,3709,3838,3791,3537,3552,3625,3754,3437,3486,3642,3491,3700,3272,3811,3689,3481,3522,3748,3535,3698,3580,3745,3707,3721,3671,3637,3516,3752,3587,3732,3883,3685,3769,3664,3686,3643,3850,3711,3683,3851,3749,3597,3806,3565,3728,3759,3882,3532,3554,3504,3713,3716,3728,3557,3450,3686,3644,3832,3708,3687,3955,4178,3890,3598,3524,3888,3437,3904,3663,3849,3611,3546,3626,3967,3707,3636,3657,3711,4018,3615,4026,3738,3776,3569,3963,3903,3604,3869,3664,3557,3690,3610,3637,3649,3796,3668,4086,3536,3606,3749,3695,3797,3707,3876,3412,3697,3691,3583,3619,3509,3511,3533,3739,3608,3643,3678,3696,3703,3768,3569,3739,3590,3425,3684,3492,3633,3562,3646,3637,3745,3689,3471,3779,3546,3798,3694,3651,3717,3791,3486,3364,3476,3689,3646,3760,3481,3602,4271,3584,3796,3591,3710,3514,3820,3737,4031,3944,3748,3829,3542,3680,3731,3542,3481,3538,3743,3876,3862,3365,3751,3948,3784,3383,3648,3663,3599,3525,4007,3407,3835,3734,3603,3520,3606,3501,3798,3645,3612,3507,3507,3623,3315,3925,3487,3831,3854,3409,3645,3455,4047,3808,3415,3582,3349,3442,3533,3933,3332,3634,3703,3436,3918,3804,3938,3694,3752,3525,3604,3788,3328,3647,3755,3586,3387,3676,3515,3512,4001,3444,3766,3428,3593,3360,3331,3958,3476,3857,3526,3611,3684,3653,3773,3605,3728,3426,3542,3576,3410,3819,3233,3664,3496,3776,3295,3320,3630,3682,3879,3710,3990,3654,3392,3829,3542,3950,3749,3574,3416,3687,3373,3689,3784,3642,3910,3728,3820,3762,3750,3651,3803,3841,3421,3489,3888,3814,3552,3844,3404,3431,3978,3702,3787,3740,3573,3933,3710,3541,3717,3793,3481,3454,3592,3742,3901,3631,3657,3851,4023,3824,3646,3773,3739,3482,3923,3592,3950,3849,3270,3805,3967,3562,3495,3742,3400,3595,3855,3668,3828,3729,3652,3790,3890,3621,3572,3745,3874,3568,3877,3731,3611,3649,3744,3761,3752,3619,3643,3400,3775,3337,3787,3625,3743,3937,4046,3522,3567,4192,3539,3760,3536,3731,4043,3751,3363,3531,3623,3647,3827,3727,3774,3978,3438,3827,3853,3761,3473,3814,3823,3647,3681,3393,3677,3762,3514,3575,3675,3773,3758,3566,3640,3515,3864,3730,4237,3714,3778,3923,3504,3565,3722,3421,3507,3575,3825,3747,3600,3682,3825,3848,3727,3749,3683,3766,3785,3569,3794,3873,3602,3758,3868,3715,3734,4001,3642,3764,3627,3509,3502,3596,3360,3592,3781,3692,3518,3858,3708,3469,3658,3741,3653,3352,3889,3627,3480,3661,3642,3531,3905,3980,3436,3506,3546,3570,3893,3652,3358,3464,3664,3531,3615,3429,3785,3217,3739,3812,3942,3554,3917,3504,3562,4020,3836,3370,3460,3752,3528,3576,3491,3567,3953,3442,3688,3651,3738,3895,3724,3435,3768,3798,3492,3760,3975,3697,3396,3755,3722,3652,3289,3602,3646,3807,3880,3879,3815,3757,3542,3774,3696,3642,3577,3660,3647,3486,3678,3706,3545,3672,3771,3747,3755,3917,3623,3852,3615,3860,3626,3536,3376,3807,3580,3434,3634,3394,3546,3556,3750,3389,3499,3672,3867,3713,3624,3865,4028,3734,3459,3624,3126,3867,3839,3301,3531,3449,3322,3752,3767,3517,3288,3482,3664,3741,3569,3605,3859,3352,3502,3700,3775,3690,3642,3759,3648,4133,3726,3689,3629,3558,3788,3534,3626,3906,3527,3507,3538,3578,3650,3879,3798,3791,3846,3716,3907,3826,3603,3730,3652,3662,3843,3581,3686,3872,3726,3556,3970,3693,3742,3814,3856,3761,3607,3891,3294,3253,3644,3607,3322,3913,3598,3514,3877,3450,3678,3615,3370,3619,3658,4036,3819,3286,3615,3581,3422,3457,3904,4000,3505,3941,3535,3199,3314,3437,3600,3512,3734,3678,3596,3787,3745,3259,3889,3419,3517,3821,3873,4051,3662,3606,3663,3789,3617,3494,3728,3816,3707,3881,3730,3553,3868,3549,4027,3651,3665,3517,3442,3656,3872,3572,3862,3666,3539,3428,3745,3882,3674,3732,3691,3524,3335,3666,3863,3632,3639,3621,4139,3361,3863,3463,3792,3748,3712,3359,3207,3568,3668,3617,3397,3462,3661,3997,3783,3762,3509,3678,3635,3799,3474,3398,3470,3751,3557,3482,3531,3521,3659,3841,3629,3694,3881,3507,4066,3683,3650,3588,3547,3643,3986,3618,3925,3797,3829,3889,3862,3751,3798,3599,3799]},{"counters":[3764,3751,3542,3735,3661,3669,3700,3727,3715,3820,3625,3485,3681,3450,4317,3466,3705,3376,3537,3621,3487,3733,3266,3853,3679,3761,3946,3510,3702,3607,3696,3502,3277,3944,3353,3938,3766,3548,3628,3741,3524,3802,3466,3541,3717,3811,3549,3730,3638,3587,3523,3502,3605,3764,3616,3441,3656,3877,3390,4046,3685,3491,3681,3665,3639,3681,4085,3651,4000,3526,3829,3639,3582,3547,3669,3795,3422,3641,3402,3481,3444,3483,3587,3483,3736,3566,3448,3828,3567,3651,3379,3963,3524,3694,3462,3455,3699,3375,3548,3579,3718,3600,3714,4007,3463,3635,3561,3872,3843,3727,3605,3638,3360,3689,3302,3560,3789,3398,3618,3603,3379,3731,3612,3854,3640,3824,3531,4059,3430,3441,3698,3731,3561,3485,3552,3603,3760,3308,3829,3769,3544,3731,3549,3663,3823,3898,3545,3700,3650,3194,3750,3768,3812,3477,3870,3632,3795,3631,3578,3836,3789,3604,3867,3416,3578,3910,3519,3634,3837,3431,3604,3636,3560,3913,3493,3651,3779,3599,3652,3717,3710,3727,3625,3427,3569,3671,3795,3320,3677,3619,3561,3859,3500,3830,3504,3825,3501,3723,3482,3729,3548,3827,3822,3979,3571,3835,3358,3571,3581,3652,3844,3451,3987,3648,3524,3549,3528,3972,3658,3722,3533,3507,3818,3691,3698,3770,3664,3512,3538,3739,3521,3838,3666,3618,3615,3578,3683,3932,3616,3526,3995,3681,3550,3557,3481,3502,3524,3646,3670,3780,3651,3605,3615,3737,3406,3813,3808,3401,3832,3413,3542,3731,3655,3563,3417,3852,3716,3691,3627,3344,3449,3658,3499,3497,3585,3696,3688,3704,3580,3403,3718,3264,3680,3874,3792,3666,3982,3753,3609,3872,3541,3649,3764,3612,3894,3670,3741,3847,3744,3828,3393,3652,3903,3667,3807,3592,3543,3373,3683,3650,3553,3720,3905,3833,3825,3773,3791,3478,3688,3876,3351,3745,3833,3541,3509,3718,3629,3494,3612,3640,3776,3674,3304,3643,3612,3818,3702,3585,3714,3522,4006,3670,3710,3430,3544,4058,3548,3913,3593,3767,3736,3504,3886,3724,3547,3619,3700,4022,3425,3904,3604,3675,3656,3329,3887,3390,3908,3861,3894,3876,3468,3960,3572,3513,3916,3352,3613,3721,3975,3741,3691,3421,3741,3925,3604,3615,4054,3380,3750,3712,3820,3693,3834,3826,3574,3613,3742,3368,3988,3824,3492,3661,3544,3652,3560,3674,3887,3741,3866,3718,3620,3562,3529,3480,3630,3794,3521,3708,3433,3518,3639,3761,3759,3692,4139,3569,3827,3525,3530,3796,3904,3426,3706,3532,3590,3440,3359,3527,3522,3548,3544,3756,3745,3611,3692,3560,3651,3786,4020,3224,3534,3964,3705,3867,3298,3560,3660,3540,3873,3803,3754,3293,3533,3436,3792,3486,3763,3704,3572,3758,3660,3466,3609,3848,3597,3976,3554,3722,3679,3721,3901,3783,3893,3680,3621,3749,3437,3791,3578,3936,3614,3539,3194,3540,3748,3972,3967,3550,3432,3753,3658,3610,3562,3675,3693,3675,4089,3612,3935,3682,3646,3728,3578,3646,3680,3634,3609,3533,3846,3679,3447,3669,3526,3393,3644,3437,3547,3739,3615,3713,3662,3712,3664,3570,3782,3700,3631,3844,3525,3440,3716,3671,3617,3577,3973,3742,3730,3630,3438,3530,3862,3571,3629,3734,3939,3579,3726,3534,3624,3652,3868,3790,3993,3679,3911,3817,3574,3613,3482,3823,3722,4021,3604,3802,3815,3601,3459,3814,3833,3530,3542,3735,3854,3650,3587,3580,3749,3781,3927,3572,3261,3516,3636,3755,3809,3912,3530,3602,3162,3782,3808,3774,3913,3718,3858,3439,3600,3553,3271,3570,3693,3578,3724,3788,3693,3568,3673,3901,3557,3971,3574,3776,3864,3905,3371,3655,3363,4113,3918,3554,3712,3752,3447,3857,3881,3461,3561,3639,3536,3617,3273,3552,4081,3371,3781,3575,3952,4142,3609,3889,3460,3779,3487,3606,3617,3654,3721,3631,3623,3540,3866,4158,3462,3632,3623,3646,3655,3607,3640,3887,3802,3538,3715,3848,3225,3539,3551,4010,3656,3679,3653,3532,3543,3900,3819,4016,3812,3674,3468,3539,3443,3930,3488,3643,3791,3821,3612,3201,3524,3384,3549,3571,3771,3614,3721,3566,3353,3788,3709,3729,3370,3652,3750,3635,3542,3663,3744,3378,3419,3466,3624,3662,3954,3827,3561,3615,3589,3374,3518,3696,3841,4044,3876,3649,3503,3758,3521,3787,3638,3665,3809,3520,3736,3506,3608,3729,3588,3608,3951,3597,3672,3757,3626,3807,3688,3663,3463,3493,3831,3912,3520,3678,3434,3397,3407,3825,3590,3484,3780,3581,3886,3239,3553,3647,3388,3548,3592,3762,3967,3855,3865,3387,3823,3944,3771,3581,3563,3978,3644,3702,3620,3774,3749,3601,3517,3639,3818,3702,3840,3920,3522,3604,3987,3889,3786,3600,3180,3599,4069,3581,3661,3584,3432,3487,3746,3673,3806,3634,3601,3700,3728,4046,3730,3825,3352,3670,3746,3735,3917,3633,3551,3621,3736,3693,3608,3355,3445,3266,3517,3797,3698,3435,3910,3675,3732,3702,4114,3667,3704,3578,3535,3714,3525,3560,3459,3449,3663,3749,3464,3642,3620,3653,3868,3535,3819,3577,3732,3529,3609,3585,3601,3814,4249,3708,3515,3807,3722,3570,4027,3679,3771,3797,3351,3964,3840,3909,3527,3592,3816,3834,3327,3552,3845,3522,3592,3698,3948,3316,3789,3706,3642,3373,3394,3692,3454,3576,3656,3586,3652,3734,3763,3748,3853,3351,3599,3808,3422,3671,3522,3657,3788,4147,3736,3665,3742,3426,3257,3407,3529,3756,3645,3585,3754,3723,3577,3538,3631,3764,3774,3803,3770,3772,3623,3470,3686,3612,3905,3895,3613,3703,3763,3736,3579,3638,3488,3683,3538,3436,3575,3750,3516,3495,3369,3698,3478,3650,3416,3857,3995,3715,3629,4134,3673,3782,3942,3437,3442,4010,3688,3648,3826,3547,3814,3678,3597,3611,3561,3611,3877,3724,3527,3717,3544,3979,3849,3773,3548,3451,3747,3872,3553,3581,3772,3588,3744,3847,3495,3600,3757,3686,3796,3546,3440,3812,3300,3479,3659,3843,3709,3592,3631,3447,3965,3646,3827,3638,3757,3578,3490,3697,3457,3693,3507,3708,3691,3649,3468,3336,3643,3720,3762,3673,3717,3413,3410,3722,3683,3711,3521,3644,3689,3886,3636,4031,3758,3786,3673,3981,3912,3788,3922,3480,3873,3686,3665,3499,3649,3863,3415,3545,3500,3705,3578,3407,3461,3691,3637,4040,3493,3811,3688,3726,3687,3394,3542,3683,3666,3859,3696,4092,3603,3684,3581,3557,3561,3358,3796,3752,3469,3538,3734,3675,3713,3674,3810,3555,3937,3608,3487,3593,3742,3481,3442,3711,3566,3568,3792,3532,3423,3476,3500,3714,3796,3310,3810,3846,3534,3517,3550,3775,3864,3756,3624,3521,3601,4052,3827,3943,3973,3767,4015,3907,3784,3447,3631,3966,3338,3755,3547,3436,3732,3493,3716,3360,3666,3372,3644,3948,3867,3360,3501,3322,3837,3558,3668,3517,3743,3899,3526,3489,3740,3935,3855,3298,3876,3766,3687,3517,4148,3604,3544,3659,3677,3777,3444,3341,3925,3842,3670,3677,3530,3470,3927,3889,3751,3897,3821,3755,3643,3711,3569,3875,3287,3811,3693,3705,3551,3739,3629,3633,3429,3848,3829,3448,3775,3778,3995,3840,3570,3818,3629,3521,3979,3559,3945,3895,3891,3631,3440,4017,3807,3753,3572,3888,3907,3530,3304,3634,3451,3446,3732,3727,3344,3394,3844,3687,3403,3847,3760,3511,3798,3828,3514,3680,3614,3638,3815,3710,3813,3243,3463,3485,3714,3559,3664,3608,3705,3393,3913,3730,3681,3827,3646,3572,3457,4041,3669,3543,3525,3443,3753,3801,3592,3486,3528,3353,3663,3831,3472,3645,3932,3709,3724,3637,3694,3434,3918,3934,3533,3582,3520,3425,3482,3594,3865,3750,3985,3755,3541,3458,3662,3541,3672,3820,3681,3810,4001,3606,3855,3792,4021,3883,3820,3612,3931,3743,3585,3934,3670,3468,3726,3259,3423,4062,3296,3843,3519,4144,3417,3538,3848,3520,3889,3551,4017,3661,3822,3758,3829,3751,3768,3386,3389,3334,3661,3830,3865,3626,3898,3518,3522,3950,3669,3720,3439,3477,3767,3470,3877,3644,3518,3654,3494,3605,3613,3804,3664,3612,3477,3677,3791,3719,3438,3804,3433,3539,3757,3767,3847,3434,3404,3852,3368,3659,3635,3584,3506,3508,3669,3459,3741,3547,3742,3870,3692,3550,3386,3600,3685,3615,3994,3490,3713,3619,3607,3804,3506,3940,4051,3801,3430,3747,3528,4061,3492,3555,3532,3636,3774,3644,3259,3643,3521,3534,3830,3719,3438,3596,3641,3472,3692,3814,3353,3632,3563,3511,4098,3823,3515,3548,3496,3626,3528,3647,3620,3526,3769,3772,3545,3870,3713,3758,3992,3521,3338,3455,3489,3709,3596,3531,3719,3539,3689,3550,3740,3728,3700,3751,3807,3753,3840,3732,3475,3432,3415,3567,3888,3772,3746,3449,3682,4096,3974,4052,3982,3497,3575,3727,3594,3780,3554,3577,3728,3511,3420,3981,3501,3304,3802,3832,3521,3541,3698,3601,3706,3533,3801,3501,3915,3599,3496,4021,3453,3661,3632,3630,3469,3498,3635,3679,3598,3807,3806,3836,3749,3591,3858,3582,3690,3844,3791,3802,3633,3946,3397,3619,3822,4213,3779,3870,3647,3431,3532,3778,3613,3558,3317,3828,3713,3987,4051,3618,3937,3506,3578,3753,3793,3826,3500,3498,3728,3639,3410,3666,3640,3635,3868,3710,3589,3638,3703,3207,3596,3781,3594,3535,3656,3824,3302,3577,3666,3756,3639,3553,3651,3601,3750,3541,3939,3561,3331,3629,3637,3825,3628,3707,3510,3459,3679,3270,3586,3666,3761,3771,3527,3690,3330,3782,3286,3830,3672,3569,3651,3350,3686,3875,3634,3343,3635,3808,3653,3680,3615,3707,4001,3552,3642,3641,3637,3736,3622,3676,3879,3800,3679,3604,3668,3654,3745,3504,3442,3667,3533,3871,3830,3741,3811,3567,3676,3708,3853,3468,3892,3842,3601,3843,3365,3685,3770,3443,3469,3782,3646,3803,3798,3969,3847,3504,3704,3559,3506,3818,3572,4084,3586,3464,3782,3843,3785,3529,3753,3747,3536,3744,3657,3742,3765,4037,3731,3214,3553,3647,3609,3446,3427,3678,3592,3695,3596,3598,3730,3994,3273,3412,3560,3754,3699,3540,3769,3902,3703,3705,3502,3651,3589,3583,3778,3844,3406,3259,3593,3484,3688,3539,3619,3542,3421,3422,3720,3762,3439,3337,3521,3913,3534,3885,3925,3847,3869,3714,3678,3948,3668,3910,3435,3734,3766,3667,4068,3563,3428,3688,3482,3601,3886,3501,4096,3552,3434,3801,3836,3472,3793,3576,3573,3564,3629,3857,3713,3508,3611,3545,3721,3909,3658,3847,3614,3377,3585,3775,3559,3519,3841,3362,3911,3473,3698,3633,3614,3743,3672,3520,3810,3339,3610,3821,4054,4013,3540,3705,3474,3778,3504,3610,3913,3826,3614,3840,3953,3419,3546,3561,3669,3721,3674,3692,3795,3729,3735,3844,3516,3642,3444,3580,3909,3557,3426,3539,3602,3652,3401,3806,3706,3812,3815,3434,3580,3628,4181,3716,3548,3566,3783,3758,3701,3709,3707,3644,3708,3513,3763,3743,3818,3741,3612,3775,3552,3562,3530,3588,3424,3565,3631,3643,3807,3745,3566,3810,3804,3694,3564,3880,3971,3628,3659,3734,3783,3759,3712,3835,3586,3660,3261,3540,3427,3375,3370,3536,3687,3760,3631,3641,3718,3549,3426,3784,3301,3415,3773,3743,3454,3854,3762,3818,3507,3519,3608,3685,3506,3618,3774,3421,3653,3626,3685,3837,3811,3563,3685,3760,3644,3402,3631,3639,3729,3493,4001,3928,3780,3519,3833,3465,4098,3504,3850,3808,3622,3802,3610,3858,3786,3647,3824,3764,3826,3633,3825,3982,3747,3707,3461,3872,3913,4140,3526,3617,3849,3712,3315,3499,3789,3968,3988,3592,3696,3615,3698,3743,3650,3541,3762,3698,3553,3723,3645,3315,3450,3567,3507,3797,3682,3627,3785,3725,3671,4121,3748,3642,3763,3681,3607,3715,3724,3656,3791,3568,3615,3537,3632,3621,3616,3668,3827,3880,3772,3665,3380,3642,3325,3893,3548,3596,3412,3655,3445,3473,3341,3700,3589,4028,3351,3771,3417,3687,3667,3580,3734,3597,3610,3561,3551,3608,3377,3600,3987,3701,3313,3811]},{"counters":[3596,3555,3801,3634,3538,3825,3576,3407,3851,3559,3586,3519,3848,3474,3339,3673,3462,3544,3824,3601,3876,3491,3536,3916,3604,3436,3707,3911,3416,3507,3149,3611,3424,3679,3743,3556,3563,3365,3581,3558,3546,3642,3787,3403,3195,3656,3582,3515,3499,3447,3627,3433,3566,3543,3547,3785,3608,3693,3544,3647,3444,3572,3845,3545,3519,3484,3783,3529,3637,3631,3700,3315,3632,3597,3962,3700,3498,3576,3503,3823,3887,3620,3619,3570,3620,3546,3497,3738,3485,3305,3757,3433,3767,3973,3869,3829,3694,3873,3593,3839,3986,3806,3331,3925,3778,3609,3664,3588,3812,3876,3626,3510,3631,3710,3438,3523,3464,3532,3527,3577,3533,3479,3256,3565,3426,3323,3727,3919,3791,3666,3420,3652,3466,3826,3827,3633,3457,3665,3821,3595,3822,3906,4078,3517,3842,3648,3487,3866,3286,3596,4018,3998,3520,3522,3609,4079,3594,3514,3494,3961,3629,4026,3908,4034,3644,3532,4054,3796,3660,3760,3647,3834,3768,3520,3613,3616,3902,3673,3688,3291,3700,3846,3588,3495,3856,3676,3853,3863,3549,3548,3624,3435,3575,3386,3569,3900,3518,3616,3520,3470,3639,3600,3591,3489,3955,3922,3868,3848,3870,3637,3671,3756,3761,3443,3561,3729,3527,3762,3874,3886,3617,3729,3624,3808,3643,3866,3807,3374,3711,3793,3813,3625,3945,3765,3423,3410,3538,3751,4195,3619,3556,3634,3553,3529,3859,3600,3726,3975,3541,3723,3851,3786,3479,3646,3495,3694,3849,3498,3466,3567,3582,3545,3513,3389,3488,3892,3834,3719,3522,3667,3600,3748,3480,3780,3809,3798,3493,3615,3717,3650,3756,3641,3694,3635,3540,3546,4027,3793,3570,3651,3576,3370,3933,3773,3612,3740,3531,3742,3732,3823,3850,3486,3630,3721,3864,3816,3635,3872,3930,3919,3578,4094,4011,3740,3598,3849,3339,3575,3674,3688,3674,3672,3652,3573,3924,3958,3706,3608,3526,3648,3315,3722,3704,3536,3975,3737,3494,3738,3934,3916,3706,3262,3942,3799,3678,3622,3801,3677,3791,3738,3569,3621,3575,3497,3868,3550,3586,3682,3623,3717,3714,3571,3687,3631,3788,3938,3779,3628,3851,3526,3639,3457,3944,3874,3963,3578,3524,3713,3630,3449,3720,3580,3669,3798,3663,3548,3822,3658,3643,4137,3621,3736,3867,3936,3617,3393,4101,3764,3922,3738,3679,3906,3820,3633,3562,3503,4011,3713,3659,3838,3957,3777,3772,3453,3845,3537,3582,3510,3435,4146,3575,3591,3549,3470,3775,3777,3608,3854,3564,3685,3682,3681,3572,3844,3296,3472,3794,3782,4001,3731,3673,3594,3870,3371,3483,3660,3630,3637,4033,3599,3767,3749,3302,3827,3686,3545,3656,3876,3641,3567,3694,3695,3491,3608,3749,3743,3582,3655,3483,3750,3702,3355,3628,3623,3861,3820,3885,3714,3559,3591,3683,4200,3712,3696,3641,3549,3465,3355,3392,3717,3645,3395,3734,3561,3619,3961,3414,3365,3508,3677,3780,3698,3494,3810,3800,3602,3675,3410,3443,3573,3671,3668,3668,3894,3467,3680,3412,3783,3490,3891,3515,3608,3455,3985,3603,3680,3825,3610,3796,3815,3767,3553,3509,4002,3707,3570,3766,3734,3628,3671,3289,3990,3850,3605,3918,3850,3844,3682,3509,3685,3957,3661,3566,3541,3427,3702,3818,3508,3786,3802,3497,3709,3570,4079,3526,3702,3360,3822,3648,3948,3554,3779,3412,3729,3475,3535,3444,3479,3717,3759,3476,3776,3812,3864,3647,3544,3515,3774,3832,3638,3696,3451,3401,3478,4094,3497,3458,3934,3956,4014,3408,3682,3865,3650,3700,3432,3635,3674,3618,3701,3618,3377,3658,3630,3631,3641,3626,3739,3795,3747,3783,3567,3658,3911,3852,3389,3724,3653,3509,3869,3346,3626,3417,3307,3810,3585,3631,3471,3642,3797,3696,3789,3416,3547,3652,3801,3603,3622,3550,3530,3568,3751,3569,3697,3728,3683,3473,3832,3968,3512,3737,3399,3676,4041,3636,3534,3554,3774,3695,3773,3694,3822,3955,3761,3668,3590,3667,3926,3509,3529,3738,3734,3457,3687,3936,3847,3749,3443,3717,3595,3480,3551,3606,3814,3387,3990,3940,3698,3734,3624,3378,3748,3740,3906,3851,3725,3525,3660,3664,3789,3664,3887,3822,3336,3725,4007,3777,3679,3871,3698,3659,3659,3444,3848,3511,3889,3536,3713,3518,3838,3678,3651,3571,3475,3727,3838,3901,3454,3760,3403,3694,3604,3370,3970,3678,3874,3651,3520,3414,3768,3626,3812,3761,3850,3864,3436,3504,3805,3803,3452,3810,3839,3650,3588,3958,3821,3763,3601,4015,3458,3884,3774,3572,3830,3453,3489,3712,3602,3668,3684,3968,3991,3710,3590,3887,3674,3663,3437,3837,3683,3718,3746,3789,3388,3783,3543,3576,3630,3708,3642,3684,3638,3545,4040,3637,3791,3282,3855,3924,3773,3745,3650,3490,3429,3650,3744,3265,3466,3769,3605,3637,3709,3953,3622,3746,3503,3865,3818,3305,3643,3711,3825,3533,3739,3545,3466,3574,3575,3431,4152,3642,3523,3808,3964,3630,3901,3679,3673,3531,3627,3902,3397,3872,3619,3929,3650,3760,3593,4015,3929,3493,3764,3467,3596,3877,3694,3400,3615,3681,3504,3650,4056,3573,3723,3535,3711,3754,3446,3792,3649,3674,3573,3695,3391,3446,3975,3843,3642,3753,3476,3736,3653,3657,3610,3678,3757,3852,3628,3799,3726,3932,3695,3572,3700,3776,3817,3659,3888,3779,3570,3682,4015,3920,3733,3545,3591,3659,4115,3467,3833,3544,3708,3464,3775,3537,3916,3555,3923,3591,3434,3675,3602,3576,3636,3604,3684,3275,3668,3922,3729,3677,3640,3621,3498,3778,3957,3842,3740,3560,3779,3709,3697,3496,3383,3479,3442,4055,3374,3576,3690,3698,3728,3405,3660,3899,3846,3613,3647,3599,3766,3727,3490,3590,3646,3453,3710,3441,3810,3429,3543,3550,3910,3731,3714,3670,3662,3857,3839,3950,3441,3709,3421,3807,3629,3689,3608,3660,3580,3556,3919,3653,3251,3559,3404,3669,3707,3462,3573,3879,3236,3675,4042,3919,3655,3426,3728,3828,3725,3737,3759,3602,3518,3442,3332,3774,3750,3796,3789,3676,3563,3572,3632,4016,3554,3754,3766,3910,3495,3920,3562,3707,3283,3922,3478,3900,3470,3570,3733,3787,3434,3567,3611,3600,3555,3867,3507,3702,3458,3734,3336,3662,3611,3474,3603,3553,3616,3316,3754,3355,3324,3729,3619,3449,3616,3884,3424,3601,3686,3742,3881,3484,3783,3467,3603,3724,3619,3491,3809,3417,3618,3480,3544,3565,3882,3547,3724,3603,3764,3648,3691,3904,3683,3553,3621,3815,3717,3742,3587,3582,3608,3565,3508,3694,3589,3575,3498,3745,3535,3986,3427,3831,3704,3738,3360,3699,4023,3735,3721,3502,3884,3682,3607,3499,3876,3549,3155,3614,3629,3752,3432,3557,3605,3710,3674,3723,3843,3563,3781,3343,3628,3770,3708,3813,3660,3509,3634,3752,3637,3829,3898,3868,3622,3820,3420,3504,3478,3392,3812,3776,3604,3514,3790,3461,3787,3843,3285,3726,3596,3746,3714,3427,3484,3680,3729,3621,3401,3813,3625,3594,3682,3621,3446,3723,3874,3666,3451,3598,3577,3716,4082,3480,3573,3741,3924,3595,3295,3646,3601,3852,3611,4067,4029,3540,3745,3841,3424,3558,4124,3590,3703,3741,3735,3905,3749,3374,3696,3649,3646,3696,3473,3764,3651,3463,3674,3715,3706,3653,3677,3490,3573,3750,3657,3299,3781,3740,3561,3629,3588,3555,3462,3558,3617,3856,3714,3700,3647,3613,3573,3586,3686,3676,3787,3587,3489,3710,3462,3729,3869,3763,3390,3741,3809,3434,3434,3800,3744,3541,3733,3670,3676,3569,3464,3773,3662,3584,3502,3745,4034,3559,3733,3541,3628,3638,3631,3788,3626,3706,3671,3772,3468,3518,4042,3782,3317,3783,3864,3655,3736,3879,3722,3463,3318,3675,3766,3844,3765,3777,3804,3776,3369,3730,3556,3464,3680,3844,3618,3776,4102,3689,3943,3502,3630,3774,3992,3590,3845,3732,3519,3429,3735,3527,3871,3441,3896,3650,3718,3756,3525,3618,3796,3530,3603,3861,3548,3375,3620,3543,3690,3619,3302,3498,3558,3542,3752,3511,3978,3991,3718,3926,4060,3561,3653,3673,3837,3465,3691,3925,3796,3535,3755,3696,3671,3664,3635,3713,3396,3430,3421,3755,3491,3463,3638,3510,3619,3944,3886,3467,3816,3414,3784,3718,3610,3710,3866,3938,3415,3706,3618,3680,3514,3878,3762,3839,3655,3723,3491,3700,3876,3299,3717,3488,3702,3623,3809,3524,3807,3626,4020,3423,3847,3697,3613,3641,3613,3649,3749,3306,3830,3421,3694,3524,3851,3470,3483,3552,3708,3616,3674,3620,4014,3771,3669,3490,3897,3680,3519,3464,3598,3759,3526,3227,3809,3456,3622,3564,3491,3541,3502,3712,3574,3779,3784,3775,3578,3600,3789,3708,3755,3740,3576,3892,3684,3592,3676,3830,3680,3954,3408,3818,3579,3781,3651,3624,3675,3554,3590,3481,3644,3572,3489,3547,3558,3703,3864,3469,3220,3763,3582,3843,3588,3959,3657,3690,3790,3339,3621,3567,3434,3470,3555,3679,3856,3617,3381,3395,3935,3690,3405,3680,3748,3755,3529,3375,3845,3873,3352,3501,3525,3564,3747,3559,3769,3564,3593,3724,3499,3109,3703,3648,3777,3517,3700,3836,3485,3565,3631,3604,3588,3604,3370,3891,3666,3435,3766,3600,3618,3471,3965,3699,3335,3699,3464,4028,3922,3876,3462,3762,3796,3875,3767,3852,3735,3502,3330,3657,3557,3617,3815,3656,3714,3735,3511,3568,3727,3773,3857,4098,3773,3671,3699,3767,3668,3508,3560,3638,3724,3579,3655,3844,3650,4028,3593,3658,3388,3670,3845,3499,3621,3780,3330,3537,3469,3731,3613,3266,3580,3740,3676,3666,3358,3515,3634,3344,3602,3297,3658,3629,3793,3785,3572,3570,4020,3551,3450,3701,3764,3341,3672,3814,3921,3746,3654,3438,3590,3496,3767,3766,3774,3669,3712,3330,3637,3491,3782,3873,3989,3715,3744,3651,3727,3446,3635,3573,4060,3591,3464,3633,3599,3498,3728,3897,3939,3675,3375,3719,4011,3717,3521,3538,3549,3461,3633,3735,3787,3547,3873,3730,3790,3567,3570,3745,3566,3769,3793,3876,3790,3501,3521,3541,3715,3942,3347,4041,3363,3871,3674,3754,3945,3554,3667,3615,3510,3823,3718,3500,3726,3863,3458,3852,3543,3416,3528,3680,3706,3638,3596,3731,3918,3919,3592,4005,3804,3371,3627,3678,3806,3599,3475,3628,3853,3640,3791,3441,3562,3931,3994,3519,3400,3870,3568,3390,3536,3529,3618,3581,3516,3593,3657,3721,3706,3534,3649,3515,3384,3572,3297,3888,3630,3757,3553,3772,3836,3851,3534,3666,3650,3651,3463,3800,3444,3622,3649,3438,3769,3491,3558,3481,3646,3703,3734,3604,3949,3735,3670,3903,3480,3644,3688,3528,3536,3434,3666,3841,3827,3425,3685,3500,3628,3707,3754,3751,3378,3975,3589,3801,3622,3388,3414,3740,3566,3688,3890,3505,3366,3951,3698,3565,3775,3535,3667,3485,3845,3728,3436,3854,3672,3646,3573,3607,3659,3770,3710,3600,3800,3306,3689,3732,3832,3776,3662,3851,3712,3874,3982,3521,3286,3392,3747,3542,3675,3857,3940,3736,3444,3816,3657,3855,3450,4034,3722,3591,3945,3542,3721,3895,3579,3805,3945,3463,3751,3577,3868,3767,3671,3776,3614,4193,3388,3856,3483,3628,3729,3834,3743,3585,3448,3731,3886,3432,3569,3524,3534,3548,3539,3879,3669,3698,3501,3760,3498,3496,3694,3714,3434,3886,3825,3993,3693,3814,3707,3787,3437,3614,3756,3770,3628,3679,3677,3601,3684,3778,3700,3416,3687,3634,4082,3774,3513,3892,3934,3403,3265,3642,3763,3290,3646,3715,3717,3692,3466,3836,3271,3549,3666,3706,3646,3482,3856,3505,3810,3720,3751,3686,3796,3442,3599,3567,3500,4095,3448,3598,3459,3556,3829,3649,3575,3439,3538,3624,3793,3391,3655,3505,3615,3485,3796,3915,3871,3802,3492,3681,3601,3538,3705,3853,3324,3641,3851,3249,3469,3898,3707,3733,3841,3629,3706,3816,3805,3758,3266,3676,3703,3513,3840,4035,3773,3822,3421,3517,3538,3764,3626,3491,3443,3896,3656,3646,3651,3841,3920,3547,3676,3677,3648,3730,3732,3555,3573]},{"counters":[3672,3639,3371,3592,3473,3774,3884,3699,3755,3471,3756,3464,3540,3577,3667,3467,3791,3632,3543,3306,3644,3428,3529,3473,3470,3793,3916,3803,3594,3813,3580,3462,3536,3735,3897,3633,3483,3581,3664,3791,3550,3793,3888,3778,3623,3651,3479,3706,3687,3636,3727,3594,3581,3776,3728,3551,3603,3482,3756,3835,3624,3673,3603,3719,3619,3893,3915,3854,3806,4005,3863,3686,3674,3483,3843,3917,3498,3720,3999,3525,3492,3854,3658,3629,3772,3476,3267,3884,3664,3461,3475,4028,3811,3424,3565,3698,3663,3906,3782,3786,3807,3722,4016,3771,3586,3951,3842,3936,3500,3605,3526,3736,3693,3453,3384,3757,3835,3874,3746,3400,3320,3558,3690,3506,3583,3422,3777,3540,3634,3678,3682,4114,3668,3497,3816,3482,3490,3821,3816,3360,3829,3819,3858,3759,3903,3496,4016,3977,3718,3887,3769,3793,3765,3852,3558,3701,3360,3687,3623,3559,3877,3660,3675,3227,3658,3926,3664,3612,3485,3776,4003,3861,3997,3695,3614,3548,3835,3643,3709,3701,3275,3737,3689,3676,3675,3632,3423,3501,3659,3691,3225,3974,3662,3539,3501,3721,3543,3558,3960,3425,3610,3665,3706,3671,3584,3863,3879,3693,3890,3833,3574,3860,3801,3528,3651,3554,3582,3528,3725,3568,3367,3679,3522,3689,3719,3616,3766,3615,3675,3611,3499,3838,3597,3539,3298,3962,3807,3577,3551,3651,3658,3864,3488,3787,3770,3929,3474,3624,3687,3430,3392,3383,3791,3451,3447,3674,3695,3526,3571,3610,3495,3789,3733,3564,3495,3726,3841,4043,3662,3579,3894,3463,3597,3661,3650,3879,3672,3606,3442,3380,3590,3416,3721,3560,4000,3586,3517,3687,3600,3796,4063,3354,3728,3538,3668,3659,3538,3587,3982,3777,3742,3609,3781,3809,3851,3520,3442,3529,3794,3808,3558,3532,3872,3804,3732,3574,3523,3815,3683,3644,3654,3763,3426,3568,4189,3377,3762,3631,3862,3616,3754,3696,3759,3616,3752,3743,3815,3552,3679,3372,3754,3874,3664,3815,3557,3579,3434,3676,3561,3627,3234,3826,3664,3611,3461,3462,3549,3454,3486,3203,3680,4037,3644,3690,3660,3541,3684,3883,3630,3577,3420,3341,3711,3580,3650,3712,3924,3888,3596,3963,3753,3775,3761,3535,3742,3785,3759,3633,3771,3561,3600,3606,3526,4079,3965,3551,3609,3515,3440,3424,3887,3843,3808,3665,3765,3650,3765,3658,4026,3740,3649,3542,3520,3816,3416,3383,3376,3603,3684,3885,3409,3673,4016,3372,3749,3879,3524,3582,3570,3626,3589,3566,3483,3688,3527,3799,3871,3671,3672,3638,3687,3279,3736,3612,3694,3789,3804,3761,3711,3749,3726,4228,3431,3887,3634,3510,3536,3893,3732,3621,3825,3567,3962,3688,3569,3341,3662,3633,3779,3554,3731,3808,3567,3545,3705,3957,3636,3677,3691,3798,3788,3717,3595,3551,3638,3712,3564,3738,3793,3714,3916,3735,3406,3344,3877,3342,3800,3616,3435,3697,3610,3691,3856,3741,3802,3534,3627,3754,3754,3865,3512,3586,3464,3561,3847,3833,3811,3541,3869,3506,3588,3605,3621,3876,3537,3653,3571,3425,3681,3542,3780,3532,3533,3415,3945,3876,4327,3537,3559,3651,3722,3436,3674,3506,3513,3515,3690,3629,3662,3835,3638,3810,3475,3694,3759,3627,3564,3618,3890,3784,4056,3692,3517,3554,3589,3562,3567,3567,3807,3789,3775,3885,3688,3842,4028,3437,3725,3518,3558,3811,3705,3929,3529,3309,3568,3683,3492,3650,3759,3616,3753,3737,4028,3679,3619,3560,3801,3583,3528,3936,3822,3460,3455,3613,3770,3680,3638,3894,3513,3652,3260,3783,3965,3687,3587,3781,3559,3765,3816,3807,3762,3592,3692,3685,3753,3836,3703,3794,3852,3387,3663,3521,3658,3569,3687,3746,3734,3643,3606,3733,3808,3656,3536,3646,3798,3741,3408,3369,3675,3796,3997,3610,3723,3569,3338,3799,3758,3570,3488,3712,3459,3368,3324,3630,3726,3937,3335,3699,3290,3685,3792,3811,3699,3709,3687,3770,3716,3631,3724,3426,3867,3422,3765,3916,3630,3759,3779,3675,3627,3781,3448,3634,3625,3391,3824,3658,3624,3707,3454,3371,3589,3583,3674,3740,3641,3652,3794,3560,3334,3893,3579,3881,3530,3606,3620,3754,3837,3535,3713,3674,3489,3653,3663,3412,3622,3922,3851,3636,3625,3685,3377,3602,3564,3663,3781,3906,3493,3529,3765,3501,3657,3978,3649,3275,3695,3719,3657,3876,3429,3781,3952,3608,3290,3618,3677,3636,3498,3958,3794,3932,3552,3567,3721,4003,3632,3547,3613,3711,3922,3506,3722,3779,3692,3659,3682,3587,3510,3322,3883,3328,4040,4155,3696,3668,3643,3411,3644,3750,3488,3660,3825,3897,3680,3819,3666,3644,3592,3816,4209,4096,3790,3925,4017,3884,3520,3707,3740,3683,3363,3691,3547,3482,3503,3544,3425,3521,3629,3842,3730,3801,3595,3650,3640,3421,3693,3703,3692,3531,3420,3899,3810,3433,3638,3666,3721,3761,3708,3941,3638,3633,3542,3734,3600,3650,3368,3933,3699,3469,4025,3475,3425,3912,3806,3417,3722,3668,3767,3931,3768,3765,3614,3658,3600,3748,3727,3880,3495,3782,3556,3648,3489,3521,3788,3884,3605,3759,3768,3354,3381,3679,3742,3757,3558,3842,3678,3646,3566,3621,3473,3721,3656,3791,3620,3424,3747,3720,3708,3507,3738,3773,3710,3431,3826,3710,3494,3817,3696,3442,3453,3761,3656,3446,3730,3696,3582,3596,3667,3619,3481,3604,3652,3673,3507,3475,4076,3759,3566,4148,3694,3570,3481,3714,3642,3838,3610,3454,3288,3713,3662,3818,3675,3494,3483,3697,3359,3563,3527,3639,3726,3719,3824,3296,3467,3564,3638,3435,3531,3686,3958,3638,3782,3251,3751,3882,3390,3687,3783,3894,3474,3760,3963,3683,3772,3561,3714,3655,3720,3468,3780,3705,3610,3675,3610,3770,3604,3871,3399,3870,3771,4038,3632,3700,3579,3385,3605,3755,3413,4000,3665,3537,3766,3749,3545,3984,3830,3621,3681,3444,3411,3369,3599,3843,3729,3647,3487,3950,3668,3752,3625,3769,3326,3461,3707,3582,3534,3566,3778,3963,3695,3638,3688,3773,3347,4000,3760,3835,4016,3922,3648,3732,3743,3591,3482,3473,3576,3497,3422,3581,3707,3807,3965,3425,3590,3652,3647,3618,3789,3542,3634,3795,3650,3751,3960,3551,3579,3389,3848,3788,3650,3632,3595,3851,3952,3522,3803,3536,3269,3811,3671,3341,3897,3475,3596,3991,3768,3308,3498,3549,3746,3360,3595,3730,3741,3454,3417,3770,3756,3599,3653,3333,3458,3653,3451,3705,3563,3878,3680,3602,3789,3884,3674,3763,4013,3633,3630,3700,3606,3940,3583,3646,3671,3492,3698,3790,3865,3472,3221,3595,3723,3576,3289,4050,3957,3897,3480,3839,3540,3843,3536,3690,3902,3371,3645,3560,3336,3880,3564,3589,3756,3501,3604,3457,3656,3889,3464,3638,3474,3762,3681,3615,3769,3847,3601,3658,3615,3424,3585,3994,3392,3769,3387,3960,3725,3622,3720,3643,3367,3626,3535,3576,3873,3511,3816,3871,3670,3464,3696,3605,3914,3517,3371,3477,3793,3781,3939,3563,3482,3899,3717,3770,3946,3402,3654,3861,3512,3807,3537,3634,3808,3721,3885,3448,3490,3529,3658,3428,3718,3923,3557,3381,3556,3789,3430,3672,3810,3683,3667,4049,3554,3795,3698,3639,3810,3546,3549,3525,3892,3521,3386,3432,3678,3586,3488,3579,3625,4027,3747,3907,3424,3581,3561,4070,3537,3523,3676,3512,3885,3958,3669,3612,3505,3599,3676,3869,3332,3727,3595,3366,3682,3722,3767,3818,3450,3710,3566,3761,3659,3540,3546,3189,3838,3581,3607,3544,3533,3543,4035,3678,3774,3654,3252,3736,3779,3614,3296,3675,3733,3816,3914,3730,3752,3566,3705,3423,3699,3834,3609,3682,3739,3792,3431,3603,3932,3806,3643,3652,3933,3810,3415,3258,3821,3699,3733,3819,3857,3546,3648,3779,3673,3614,3799,3704,3572,3656,3598,3823,3760,3514,3332,3258,3745,3682,3779,3395,3983,3554,3674,3660,3719,3644,3872,3822,3742,3851,3367,3567,3523,3818,3731,3705,3649,3555,3577,3415,3549,3548,3598,3598,3686,3875,3671,3617,3631,3615,3711,3758,3531,3654,3587,3583,3642,4015,3696,3684,3778,3774,3666,3400,3598,3532,3709,3672,3817,3520,3458,3404,3803,3618,3716,3881,3371,3444,3727,3649,3930,3944,3866,3893,3530,3571,3574,3742,3817,3752,3415,3632,3608,3561,3358,3805,3385,3826,3731,4088,3815,3433,3454,3858,3764,3513,3611,3512,3765,3378,3805,3467,3395,3468,3639,3586,3838,3467,3676,3552,3310,3837,3321,3776,3535,3581,3833,3460,3634,3574,3701,3576,3385,3959,3631,3642,3629,3496,3456,3515,3727,3542,3168,3946,4044,3585,3943,3346,3595,3772,3554,3583,3589,3538,3526,3841,3718,3682,4104,3729,3297,3743,3442,3572,3763,3572,3567,3621,3748,3889,3471,3697,3693,3676,3691,3796,3568,3544,3827,3622,3823,4058,3670,3441,3731,3824,4073,3486,3803,3695,3605,3608,3272,3662,3620,3576,3739,3726,3745,3246,3809,3377,3419,3715,3537,3663,3818,3207,3781,3665,3568,3573,3721,3554,3578,3650,3543,3917,4000,3519,3617,3886,3328,3637,3725,3791,3578,3735,3983,3525,3709,3888,3736,3402,3739,3809,3690,3686,3599,3485,3706,3545,3456,3541,3693,3483,3539,3661,3358,3653,3694,3654,3585,3787,3404,3920,3619,3614,3685,4149,3667,4168,3611,3645,3827,3587,3537,3960,3626,3729,3665,3552,3669,3643,3526,3303,3643,3495,3717,3708,3648,3602,3620,3479,3250,3457,3619,3609,3687,3675,3654,3471,3655,3680,3547,3605,3527,3652,3530,3601,3824,3439,3498,3597,3592,3511,3679,3616,3383,3813,3896,3611,3760,3549,3715,3712,3728,4023,3876,3623,3573,3489,3768,3367,3597,3760,3722,4036,3625,3781,3467,3863,3917,3379,3751,3618,3643,3616,3927,3540,3843,3711,3534,3545,3565,3581,3579,3684,3641,3518,3493,3327,3788,3418,3493,3484,3312,3503,3825,3811,3671,3795,3943,3789,3758,3589,3561,3753,3610,3651,3502,3757,3832,3711,3467,3617,3528,3518,3372,3930,3443,3875,3572,3465,3991,3695,3318,3781,3449,3909,3738,3819,3664,3277,3709,3785,3462,3795,3781,3816,3669,3330,3808,3734,4017,3889,3731,3518,3855,3647,3595,3748,3598,3462,3867,3573,3889,3878,3581,4068,3405,3716,3686,3745,3348,3781,3723,3956,3787,3775,3599,3637,3651,3876,3705,3713,3995,3569,3572,3545,3418,3889,3757,3895,3387,3902,3556,3578,4025,3798,3710,3598,3728,3505,3404,3832,3812,3558,3516,3554,3665,3859,3678,3653,3981,3656,3780,3707,3655,3692,3501,3733,3875,3597,3927,3662,3644,4008,3559,3659,3741,3455,3898,3458,3677,3869,3411,3743,3803,3629,3609,3974,3382,3412,3602,3595,3590,3649,3670,3768,3582,3835,3628,3489,3536,3503,3686,3793,4005,3746,3812,3469,3707,3593,3498,3613,3690,3501,3785,3671,3627,3519,3559,3616,3565,3664,3694,4090,3575,3783,3872,4075,3781,3495,3714,3910,3368,3778,3675,4036,3793,3907,3682,3617,3726,3558,3715,3561,3459,3652,3620,3626,3493,3439,3786,3600,3705,3685,3597,3920,3444,3529,3829,3693,3728,3354,3581,3731,3557,3816,3887,3650,3444,3838,3739,3724,3780,3790,3641,3933,3632,3417,3790,3767,3503,3906,3711,4029,3951,3827,3709,3484,3777,3540,3602,3724,3682,3748,3961,3919,3739,3860,3551,3886,4056,3484,3559,3696,3674,3738,3484,3509,3643,3802,3570,3606,3404,3396,3623,3422,3706,3596,3615,3461,3886,3734,3684,3567,3481,3622,3526,3593,3384,3501,3944,3776,3549,3849,3510,3530,3654,3628,3612,3482,3798,3672,3520,3645,3901,3666,3610,3592,3550,3639,3672,3534,4014,3591,3477,3485,3930,3497,3517,3558,3527,4048,3249,3657,3646,3622,3696,3694,4143,3605,3437,3753,3776,3853,3651,3802,3825,3838,3866,3676,4187,3761,3535,3597,3847,3657,3881,3622,3726,3427,3757,3702,3686,3704,3576,3631,3508,3647,3665,3756,3524,3329,3352,3856,3386,3804,4106,3646,3250,3769,3520,3795,3743,3808,3236,3787,3912,3655,3595,4103]}]},"null_count":0,"tot_col_size":67500000,"last_update_version":401695328044318722},"c_address":{"histogram":{"ndv":7500000,"buckets":[{"count":30000,"lower_bound":"ICBaeW5Fakx0eXBTUFRPcElZMmdTdHByVk43Sg==","upper_bound":"IEZUaVEsWUx1Tm5jemRJYjI=","repeats":1},{"count":60000,"lower_bound":"IEZvYXV4ZWdqVW9KamFLTlZQMVgybFJLM2sxOSBh","upper_bound":"IFR4RVdKRWExbkZuZQ==","repeats":1},{"count":90000,"lower_bound":"IFVWSHBvZXh2elIyM2U=","upper_bound":"IGt3OWwyeVI2T3V0d3FjdDdwMjVJbk5oU3lvSjJ3YTdHeUc4","repeats":1},{"count":120000,"lower_bound":"IGxhM0xXWHhmZUEwMnRnSWZ5VlN5dTdTSHRieWNaLERJeg==","upper_bound":"IHpraTFaWjJrTklLQXJKcEpo","repeats":1},{"count":150000,"lower_bound":"LCA4V3pPeUM5WixTd0tmcHVjeTZtMSxVWVBMU2s2b00=","upper_bound":"LEdFUDQsT3JLdWF4S0xWblpHZW0xTTFaRnVpSjE3cWZOeWxzcURT","repeats":1},{"count":180000,"lower_bound":"LEdtcXFpd1NXWg==","upper_bound":"LFd0ZmRZTUtabzhWQVE1emo=","repeats":1},{"count":210000,"lower_bound":"LFhEQjVCY0FjQldtYg==","upper_bound":"LGxHZVIzWG5vOEo1b1JUbyA1TGZtUGY2dHdOU3pqbA==","repeats":1},{"count":240000,"lower_bound":"LG0wR1BTdmhHOU1NMTAzSllNaVg=","upper_bound":"MCxBNW5NMTBWWWh6ZHRheG5CaFk=","repeats":1},{"count":270000,"lower_bound":"MCxSTixpbG81NTdN","upper_bound":"MENlOEdUMnhQWUZXVWhGM0J3NDRBdnpiWA==","repeats":1},{"count":300000,"lower_bound":"MERUdDBuaWMxRHh4QjFoSzBGR1dPSUJBNVhMMHFtZjdOWjhoMw==","upper_bound":"MFM1VEtXLElhT0U0SVEzaEhwZmNUUk96d2xEYzc=","repeats":1},{"count":330000,"lower_bound":"MFNIc21NYnU4YjYxd0p0bThacHV2NDBiUks=","upper_bound":"MGljcWpldjdmM1RvbFNSNTRRaFl1UzE2bGhmY2t5YQ==","repeats":1},{"count":360000,"lower_bound":"MGpzUjggTFkwaGdxbw==","upper_bound":"MTFIMG9ob1dCc0xmd09OY0c3cE9hLHJK","repeats":1},{"count":390000,"lower_bound":"MTJIVFdiYzVPelJ5Wm5XcjlMRWw=","upper_bound":"MURqbVg4bk1XNUxaSXZqWWpU","repeats":1},{"count":420000,"lower_bound":"MURzbnAzY2R1c1l1bHAwb3ZLb1loaW92SG0=","upper_bound":"MVVZekI4WjRpS2kxa25QTzJxYW1n","repeats":1},{"count":450000,"lower_bound":"MVVaQiA3VkdkVW1SRDVVZlltRlNLcEROazBJWGZYMWdiZTB1TA==","upper_bound":"MWwgMzA4TzZVRGI3cERIR0pDcXpod2VTemxqVDFYRkNyRA==","repeats":1},{"count":480000,"lower_bound":"MWw5NEZrOUdJQjFIbnQgUFogU3NrWkNnNw==","upper_bound":"MXpzcmZGUEdBTCx4Z25UcmthUnpJNFRmIGM5b2U1","repeats":1},{"count":510000,"lower_bound":"MXp4IDRwdUpBalFvRw==","upper_bound":"MkNKbmJZZThoNA==","repeats":1},{"count":540000,"lower_bound":"MkNNeGFlZFlGR3lG","upper_bound":"MlFzNG9qZUVKVEdnRWJ4RzltMFVTSDVVOXhMNQ==","repeats":1},{"count":570000,"lower_bound":"MlF2cDNCd3JRc0o=","upper_bound":"MmxKNXh3WWg5QnVFSGJmUXRWVThob0lEdzFvWiB5Z05qVHJGWUtq","repeats":1},{"count":600000,"lower_bound":"Mm1xSUtPNWZ4WjNoVzFhN1hTTix6ZTgw","upper_bound":"MyxvcCBkUGpMN3llTHp2YjBTZEI=","repeats":1},{"count":630000,"lower_bound":"MzBEWmxEWXlWTDhNeU91TkNoS01WcXpYUUp3SlVMNE1oQQ==","upper_bound":"M0RXTjZ1UmY4RW5oRFZQaW9CQWdJWQ==","repeats":1},{"count":660000,"lower_bound":"M0RmdjdCUHAwdTd1LFhXWlNXLGRka0E0aEYxcnphRWJjZXNCTjN4","upper_bound":"M1hCeVNiend2eDh2T3NwdnJLa3JGdXBPenRG","repeats":1},{"count":690000,"lower_bound":"M1hoaTNaU0cgUTZ5UFlQSld5Sm1ub0tucE1MIHJFIEEx","upper_bound":"M3I2WkVsMEI4T3FMdlBsa0F2LGN6WllaUXYxTjVHSA==","repeats":1},{"count":720000,"lower_bound":"M3JMM1NjcmN4V1F2UTVhcUFRejJ3","upper_bound":"NDR6OXYzT1ptNHV1ZDVLQVFXbDEwN01rQ291IA==","repeats":1},{"count":750000,"lower_bound":"NDVpeFQ2ZUtpSGZ4dEpIaiwsOXQ2ZjYzSU45","upper_bound":"NE5JdEdrZVF4OHBQLHZIWEE=","repeats":1},{"count":780000,"lower_bound":"NE5YSEJ6NFpkQjlicEN1SHdVM1dIVFJPWFo=","upper_bound":"NFpncW9XU211cENrUDhPcE9mIGdENVlNdVczZHg=","repeats":1},{"count":810000,"lower_bound":"NFp2bnpJaHljTElza1lHMDFXNFB6ZTNCVFJSdXBnWVVnUmo=","upper_bound":"NHFJaG1SVmxHNGQxZTlpUnVzME9nc0NTVWJ4R21YZjhrWkN6","repeats":1},{"count":840000,"lower_bound":"NHFURktYSjMzQmxwcTk=","upper_bound":"NTRxTlRZRnlxWQ==","repeats":1},{"count":870000,"lower_bound":"NTVlOHEzamtFIEowbGh1eUM=","upper_bound":"NUpYc3RUb0FkdHRmIGxxcVdr","repeats":1},{"count":900000,"lower_bound":"NUtKQUlpIGNrZjZmYUwwVkosZkNoYlBFcEhlVTRQbkgsZw==","upper_bound":"NWJMIHlIaEhCeA==","repeats":1},{"count":930000,"lower_bound":"NWNjcE9jclNmc1p5MyBhYQ==","upper_bound":"NXRVVWJieDF2aGlMSDdGTm1UVWJCVSBaY3Yx","repeats":1},{"count":960000,"lower_bound":"NXR0bThBbVdnMlVmIGlHZ244SW85cWdLTzJsWlla","upper_bound":"NkJkdEFkV2R0cVY1UU9KTnJ2V0gzWVFXVjk=","repeats":1},{"count":990000,"lower_bound":"NkJ1LGJGM3lXYUp0SEhubjhLZ3Fq","upper_bound":"NlIzYWd4LExTMW1MT3lyRG1yNWlUMA==","repeats":1},{"count":1020000,"lower_bound":"NlJhc3NxbDAgRXhJTg==","upper_bound":"NmpnT0NKbjNZNEJQNTBZSXRQVHlJb3pw","repeats":1},{"count":1050000,"lower_bound":"Nmp2TXhGZWVpYjk4Q211dUo5WTNPOTY1TDhjUGlhcG4=","upper_bound":"NzJuNkRYN0RhdVJrVUpUMHlnZ3oyT2ZBMmVrd24=","repeats":1},{"count":1080000,"lower_bound":"NzJvQnVzUGVNS00z","upper_bound":"N01RTkpaMU81RU5o","repeats":1},{"count":1110000,"lower_bound":"N09VUkhJOHE0NmhDdkdLVSwsVjZscHZYS1NUT28=","upper_bound":"N2NsY05ZQXVnNGtUWGgza2MgYXZRa3NCZjA=","repeats":1},{"count":1140000,"lower_bound":"N2Nzdmh6dkh6bm5kZlV1Nw==","upper_bound":"N25jbE1UZDZ4UGhpekN2","repeats":1},{"count":1170000,"lower_bound":"N25obHIzIGEyS0pFWXp4QkxsakdwdDlTenhtNGxDZA==","upper_bound":"ODBqZWFnMzJ3TEY=","repeats":1},{"count":1200000,"lower_bound":"ODB1cU4xcE5YNGFwM2xTaywySlUwZFppR3lnN2QzMGs0SURWb3Q=","upper_bound":"OEZ2VEJtQ0oxWm5adFRTb1V5N2UsejV0dkROR3Zm","repeats":1},{"count":1230000,"lower_bound":"OEdmVWJHajIzQlpiV2lDT2cxUXFRUHd1cFpTZFpyIA==","upper_bound":"OFdJV1JpdjFwWGhBV2xmektRaDhKcWxUNHNFbjBC","repeats":1},{"count":1260000,"lower_bound":"OFdmUmNENUhmVkEsVDJKcUFZNFVGMEY4NkFyZWc=","upper_bound":"OGl6R0VOMUZaR3E4VWVqSTRiWUcwcFlCZERDSjNOdXBBN01M","repeats":1},{"count":1290000,"lower_bound":"OGpLVHpkdzZkOXg1TUJmeVJyIGRZ","upper_bound":"OHpGdWtCTEhTMEU5YmJ6","repeats":1},{"count":1320000,"lower_bound":"OHpUdWpnR2Nrak4=","upper_bound":"OUVMIFRnRzN5WUhNaU9WYWZSN1By","repeats":1},{"count":1350000,"lower_bound":"OUVubGtWd09PU2diNHQ1bXJ5T2pzZ1NsM0RIV3g=","upper_bound":"OVhKUjhuSk13dFpm","repeats":1},{"count":1380000,"lower_bound":"OVhXdlBVN0pRSnlCcHo=","upper_bound":"OXFCMnFDenBQd09tbHp3IEZrWXVhZw==","repeats":1},{"count":1410000,"lower_bound":"OXFzTCBqUmhQSVpl","upper_bound":"QTBXcnlWU2pBaVQsVjU0V2NvOEszUEI=","repeats":1},{"count":1440000,"lower_bound":"QTBrOHdiT3laQjRuRSBOVSxCRVF4WGowMkRXUFF2NjA=","upper_bound":"QUd1MFcwUDNVVnk=","repeats":1},{"count":1470000,"lower_bound":"QUgzaDBPQUl4LFBLdWJKUW9yUzhjbGpValFDdjNJcw==","upper_bound":"QVlIckRkZnVYMkd4RERtM2J2RjgwY2F3ZHFIampUTGNMb21UV3k=","repeats":1},{"count":1500000,"lower_bound":"QVluTnhoWkROTzE2UUFTNHNYcEs2VUZlNjl3UXg=","upper_bound":"QW13ckI2cThkMVFzVnF2dXZDR2s=","repeats":1},{"count":1530000,"lower_bound":"QW4gVSBZWUZZOWtLTXV5RUxabjBhcGp5cFRaS2ks","upper_bound":"QjdVMFJHU1RuIHk=","repeats":1},{"count":1560000,"lower_bound":"QjhOVWx2cEdzVXRlTQ==","upper_bound":"Qkp1OUljanIga1ZuOFlFOGpZeFA=","repeats":1},{"count":1590000,"lower_bound":"QktEMkw4MERwNGpTUG5BWUMgV2pN","upper_bound":"QmF6ejg3Y0tDS250aQ==","repeats":1},{"count":1620000,"lower_bound":"QmI3a0hOLFBFbA==","upper_bound":"QnFtdDB3R3RFckRpN01BaGRFTTQgSm1YOEhXcFB4QnU2Njl4c2Fm","repeats":1},{"count":1650000,"lower_bound":"QnI0Nnl3bkNRQ1h5YlFMOW8xR3Q0dEVSY3hzZA==","upper_bound":"QzZCdHZKQWUxbHpTZnVRS04zcHF2NyxORnBONXRPd0VPcXN4","repeats":1},{"count":1680000,"lower_bound":"QzZMRFFkamxMd1FWIEVQSnBpdWlsdXNOZlVVdWo4dVFO","upper_bound":"Q016TnZIUlNnbWM3VVdEME1kajhL","repeats":1},{"count":1710000,"lower_bound":"Q05DV3g1eXFlTEhKRnBwRGw5IHozMQ==","upper_bound":"Q2RJUFQzSmdkcA==","repeats":1},{"count":1740000,"lower_bound":"Q2VPbXVMdTBDUUVSOEttMk0xWlBq","upper_bound":"Q3JwcUFXIHVjU0JIS01JdTZB","repeats":1},{"count":1770000,"lower_bound":"Q3NuZjg0Z21tV1Ywa0lFa2VTeVZJbmRrcE1uODNhVGlsYlgsIGQ=","upper_bound":"RDU0aDRRZ3Y4dE02Vzl3eUhIMGViSndwcGRUVXY=","repeats":1},{"count":1800000,"lower_bound":"RDYxZVdoQUwzdUtkOWJJSjdPdw==","upper_bound":"RE9oaFhyMmFydHlVMEU2S20w","repeats":1},{"count":1830000,"lower_bound":"RFA5TkdCN29NLEhiTlAsdGZyQlpQNVNXc3Rm","upper_bound":"RGJqLDJkVGY2WVpuTE9PTjFCIHN2QXFaZGg5RFMxVWZuZlM=","repeats":1},{"count":1860000,"lower_bound":"RGQ3R0dIcGFPNmFVckxBaFc=","upper_bound":"RHNEZEwwSFBUYk41YmtTRldxSGlGUUJrZnI=","repeats":1},{"count":1890000,"lower_bound":"RHNSRWZVQWpwU042MURtQnZxVkJwWXIzUnlv","upper_bound":"RTdVU2cwWDFVNU9ITUczMjZDOHRJS3ZpMHFj","repeats":1},{"count":1920000,"lower_bound":"RThnMGpvQzlkQ3RwMG9KeEZyZ3k2M1VnOQ==","upper_bound":"RU43Z2tmajJKbHFNN3VIdlNYYXEsc2JSTTQ0QlVhZDZNVnF6","repeats":1},{"count":1950000,"lower_bound":"RU5ZeXFSc1Zna2NmR0FBUQ==","upper_bound":"RWMxTmVJVnFvTXN4STQ0ODVCZU1obTlOSzZFUVBwbW9VTjJSV0E=","repeats":1},{"count":1980000,"lower_bound":"RWNYQjEseXBhcEpaTFZVZ2kga1NZbFA0VkpSSmQ3eVF4YkNQMA==","upper_bound":"RW9RWHgyUm1DSiB6Nnd4NDF5cFFJRzRQM0VTSA==","repeats":1},{"count":2010000,"lower_bound":"RW9ScThGMVksMnQsV05ETUFo","upper_bound":"RjkzUFVDIHFDanF2ME9qYWFSNVRUUyBoN0x1YkZveg==","repeats":1},{"count":2040000,"lower_bound":"RkFPZFlVTkFCUDQ=","upper_bound":"RlNlakF4WFJBdHlTYzAxYlk2T3JzOUVDYXpGR0JMTElNa1p4aA==","repeats":1},{"count":2070000,"lower_bound":"RlNsMGNEODdLSUNuQ1ZKcnNCVHlyUw==","upper_bound":"RmY4SktkWTZTVjVqTA==","repeats":1},{"count":2100000,"lower_bound":"RmZ6dlRkZiB3QWlBaGNibEZodDRFUjA=","upper_bound":"RnZXNVRvWlFhdGI5ZSBhNVY4Wkk0aWJscDc5TzU4IHE=","repeats":1},{"count":2130000,"lower_bound":"RncwcnRuR1h5djl2ckhpZmtiQmhZZklBME5tUGRKSFg3","upper_bound":"RzliczhlOW5QdXVTUEU4c05lVnZXaHMxUXM2QkVkTVd5aw==","repeats":1},{"count":2160000,"lower_bound":"R0E5TGRQazBCdmQ=","upper_bound":"R054S0lMazFqczEwSzA3cGVFUmggRDA=","repeats":1},{"count":2190000,"lower_bound":"R080IGksM3NGLElr","upper_bound":"R2V1UnNPTnJYIGhQUUJWamhMWklDS2RS","repeats":1},{"count":2220000,"lower_bound":"R2YsSHVVd0drVCw=","upper_bound":"R3dSdW5OQVZYQk5Sa1o2dmZYbXBrMzNCbmo=","repeats":1},{"count":2250000,"lower_bound":"R3djZTN4LGxTNE9Vb0x4S1pKckY2VXBlcDc3dk1sRUQyeA==","upper_bound":"SDZzZSxmYndSRG50elcwbFpKc25qQkpPVlhYYWlCd1Q1VklwUlN1","repeats":1},{"count":2280000,"lower_bound":"SDc3ZDEsTk04cUpMMmRTSEY1Zw==","upper_bound":"SFNKc0VnaXZvVFFrSyxCSU8zQUhp","repeats":1},{"count":2310000,"lower_bound":"SFNjSkRMZ01RWE5CQXJjb0NDTA==","upper_bound":"SGc4WXF4M2o0R1N3WUNRZlIsYWg1WVU0dmQ=","repeats":1},{"count":2340000,"lower_bound":"SGhGWkdMZ2Fna2RnTVJ2RzBqMEQs","upper_bound":"SHg0TmNzWUIyTTV5ZDUgdWlJIA==","repeats":1},{"count":2370000,"lower_bound":"SHg3czZyTHJYMTkzN3RBMlY4Qiw2dllI","upper_bound":"SUJTQmdkaWprZkxIZGtzTCB2cDB1T0NOQmhrVk5T","repeats":1},{"count":2400000,"lower_bound":"SUJrUW9NdlhRcUVMVHhjNk5FMG5oSnVz","upper_bound":"SVF2emREaGNaIFhDQzk4SDdBNG13cTJM","repeats":1},{"count":2430000,"lower_bound":"SVJEc0t1MVFIOVVZaW9ya1FTczlaemRhWQ==","upper_bound":"SW50N1h1eVdNYU8zbGFaMSxsd2EgSmpJT3JqQm4sU2lQYmVsMw==","repeats":1},{"count":2460000,"lower_bound":"SW54b1dZd256IA==","upper_bound":"SjEgdVdNZCw2bkdD","repeats":1},{"count":2490000,"lower_bound":"SjFKWHVmajRyck9V","upper_bound":"SkltakhEeSxNZQ==","repeats":1},{"count":2520000,"lower_bound":"SkosN1BHcDVNdjVFbjFqTg==","upper_bound":"SmQyZlBCZnVlbyBOZkQw","repeats":1},{"count":2550000,"lower_bound":"SmQ5aXdGQkpNWCxvRTVDaWx2VA==","upper_bound":"SnZOeHZyQkJqeWZYTFk5aW9vLFZJa2dycTJBRXJH","repeats":1},{"count":2580000,"lower_bound":"SngyOEpvaSBmMUFvaDJ2RA==","upper_bound":"SzhMcm00bTJaaDBtSnBWeGVqcFUgSjg4eklQVkc=","repeats":1},{"count":2610000,"lower_bound":"SzhlczIzSWo0MUpJ","upper_bound":"S0pTaUNaNWhFYzhMTg==","repeats":1},{"count":2640000,"lower_bound":"S0p3WXpQV2R1SktMbHQxbDZLWSxLUEJySWc=","upper_bound":"S1kxSGIxalNTbmpweHFmQkFSU1lPcGF3","repeats":1},{"count":2670000,"lower_bound":"S1osaTRhSk12cDdRZVZDemNxYw==","upper_bound":"S2ozeXNBZkxpTjh1OFdxUFZ0SXVwRVpiUjdnQ0wz","repeats":1},{"count":2700000,"lower_bound":"S2o0RVNkN29GMUt6N3l2SzVSSlRzQw==","upper_bound":"TDJQWHZ3OVk2clBCOCAsT3c4Z0Z1NHNHTkYzbm9JNg==","repeats":1},{"count":2730000,"lower_bound":"TDJaZjd4ajBKTlQ=","upper_bound":"TEo4MXlzWkVyb1Vw","repeats":1},{"count":2760000,"lower_bound":"TEpQTEpVcndDblUyV1I=","upper_bound":"TGRoT2xIeExJYWNVcXlSVkZ2NDlGUFZvV1JQbg==","repeats":1},{"count":2790000,"lower_bound":"TGRtR2NaZU9tYnZjc0RncVhlNEhZQm9MYjBOcmU=","upper_bound":"THBVc0VIcW1Ceno=","repeats":1},{"count":2820000,"lower_bound":"THEwWTZlWkpUWlk4alMgZGdoM1JlSk9Da2YyRyx4Qk9tWm5L","upper_bound":"TTVIUm9nT3FQMWNLNkZIbGRmZkE=","repeats":1},{"count":2850000,"lower_bound":"TTVYQVVKVWQ3cWtoSw==","upper_bound":"TUt1RWRoMmU5OHU=","repeats":1},{"count":2880000,"lower_bound":"TUxORVNMMiBoMGU1YWc0RnhzN0s=","upper_bound":"TWF0dXJEV05ZcXFVNmFxVjlhcGtVNEpVcWw1","repeats":1},{"count":2910000,"lower_bound":"TWJDcXpXTixDeG0=","upper_bound":"TXFiNUNMNnhVMHd5SyAwNQ==","repeats":1},{"count":2940000,"lower_bound":"TXI3TTNqQWFublY5NXM0YSBG","upper_bound":"TjVjSW10UVoxUVRUNHNyUEdMN0ZQUzAyc0JHWU5reUsx","repeats":1},{"count":2970000,"lower_bound":"TjZHLDBWS1lnaHU4Sjc=","upper_bound":"Tk5GUFVPclloUjlxZXNCM1lNYlo3cm1HN0puQ2Q5RTA0dQ==","repeats":1},{"count":3000000,"lower_bound":"Tk5IRzR1RzcwTHVOQ3dLYSxPTHZGbGIg","upper_bound":"TmZRIGU1SjFyRnZPRHd2WGJBV093dHY=","repeats":1},{"count":3030000,"lower_bound":"TmdNYm5zekZRamFMWFVNY1E5MUVTS0dYSXZLIDRyOQ==","upper_bound":"TnRRTVIgeXZmcDg5RnpPM1MsZnBsQWZiVEx0akVnNzdEUmU5bnZ2","repeats":1},{"count":3060000,"lower_bound":"TnRlQkp1ZUh3VERsOVpnQm5hNkxmbw==","upper_bound":"T0R1UTNGSUUwaFVjaGEyVGRlR20zbHF5TFB6YUxzNXgsIEhWWDQ=","repeats":1},{"count":3090000,"lower_bound":"T0R6ellNd0h6NFZFZVpVLE11VjRidW1FcDFjY2NWSWVDa25HUDJh","upper_bound":"T1M3M2J0NWM4eDI=","repeats":1},{"count":3120000,"lower_bound":"T1N3cmNpOHJsZDI3cTdRQjRGcEhGR3BTNQ==","upper_bound":"T2lHVUpJRGlvSFRsWDV2a3VoRWg2","repeats":1},{"count":3150000,"lower_bound":"T2lWeXhqZHJWbWogLFo4cTVoQ21YcHhTeEx0eEFXVXI5U1ZkYldl","upper_bound":"UDBTbXh4bE84VjYx","repeats":1},{"count":3180000,"lower_bound":"UDBaZnIsODRCWnhsajlaMDZRUFh3elZ5bDdlWVozUmgwLDlPOWF5","upper_bound":"UEdveUh0VW0wVm95OVlPV094aixmNjhreFVhcXFIZ2p2ZWJ2eQ==","repeats":1},{"count":3210000,"lower_bound":"UEhGWEV0dXRNVkYzQk9pQUY2ZkdGSGt2YiBxblBlMw==","upper_bound":"UGIsNXVRV09qUjg0eUdjaSBBWldKRnFXTDhT","repeats":1},{"count":3240000,"lower_bound":"UGI2U1MwUDdVQTlPQU5XelBtIHlZbTBBVUk=","upper_bound":"UHJtck13anZ3NWRZUVg=","repeats":1},{"count":3270000,"lower_bound":"UHJxMFhkRVd0ZzdMWXAgbjJ5Q3VmdW1ydjFLcQ==","upper_bound":"UTdCeDA1SWZ5UmxBNGFyZXlBVU1rRlZLOUJTVWw2IA==","repeats":1},{"count":3300000,"lower_bound":"UTdkUzBNSTBueDB3TVh4bnk5R3VtWg==","upper_bound":"UU9RWnhxeVYgWVRreDhFZWZMQ1hqckZIR1hMQVV0ampqSFpW","repeats":1},{"count":3330000,"lower_bound":"UU9lNUl2WGJQVGF5VEhnNGZnTlZzbHg1ekxMMw==","upper_bound":"UWlOTTBqbkZlaW90OG44dm4=","repeats":1},{"count":3360000,"lower_bound":"UWlsbDFzbyxhOWlJQmFBRG5WVjNQYWVSelh6VDJQ","upper_bound":"UjB1bmRLVUdhZTdYMmZvcFlPY25mcFd3QXdUc2RGT0pUck4=","repeats":1},{"count":3390000,"lower_bound":"UjFPZkhwekR4RE42endvYXc2emJjT3kwS2FKSU5TWUtNNEMzOUMg","upper_bound":"Ukdqemt1bHI2NHBad1BPZ1p2","repeats":1},{"count":3420000,"lower_bound":"Ukg3MFUgYWhCZWliRUF6","upper_bound":"Ulh3eFhOMWFrNTVVbg==","repeats":1},{"count":3450000,"lower_bound":"Ulh4Q3NsMEw0aGVDeXFSVFVEU09YNFBtb2ZuVzVmUCxnRHRUQnk=","upper_bound":"Um5PdUsyNFY0MlRCUEdtb0NiNGVUQWQ2SGpIa3JqOW1X","repeats":1},{"count":3480000,"lower_bound":"Um5qVTZMTG9lTjBNRTh3bE4sZjAx","upper_bound":"UzNOMHlIdmdxV3FpTXhIQlpsbW9QckNBakFwU21XSlJySk1MY1o=","repeats":1},{"count":3510000,"lower_bound":"UzNyejBudWdubWpoaENRWldp","upper_bound":"U0hzTW1YYTdEanlTN09hQWs2blN5RzNZaTBlcGh3VndGUVM=","repeats":1},{"count":3540000,"lower_bound":"U0ksa2RocndENGhna3JFTEpUeg==","upper_bound":"U1hJc3pFaDZDYXRUMHh4OTlESiBmdlFLZ2RXcjcyWmo=","repeats":1},{"count":3570000,"lower_bound":"U1htQTVvazRKbA==","upper_bound":"U25xZlA2aEltV1FNeDk4Snl5NVpQbQ==","repeats":1},{"count":3600000,"lower_bound":"U280aFRGM3NuYSBzMjloUA==","upper_bound":"VDBKZGpYaSBKU0JVRFlBTFBHLHRjd0JkLHFGY1ZjS0FnajcxeXg=","repeats":1},{"count":3630000,"lower_bound":"VDBpRFBPcXppWkEzaWpWIHFDRnRkcUlreQ==","upper_bound":"VEVmN2dBYlZ2dVFzUUNkRVN4NW83dXAxa0t5SjdXRXF6ZkYz","repeats":1},{"count":3660000,"lower_bound":"VEhUY3hFemRaWkF1OHEzZ2FrRDM=","upper_bound":"VGFBSXdFUDdYeDFWZA==","repeats":1},{"count":3690000,"lower_bound":"VGFGbngsUWEzY1A4QWtrNVJHIEQsRjVS","upper_bound":"VG4wWk85bldqd3ZXVDlodkI5NVh6Ym5zSGVIb2Jj","repeats":1},{"count":3720000,"lower_bound":"VG9HMmNmSGRnajNUbg==","upper_bound":"VTRIaXdIalNQYk5zaERDYnBxWjBxbTY1NjFmIDZBc295","repeats":1},{"count":3750000,"lower_bound":"VTVPMEhLaWZFNVdYWkpnLDhLbHl6cnZlVmNRVHZPbjVs","upper_bound":"VUxRRFpFMlRabVI4WEpwNg==","repeats":1},{"count":3780000,"lower_bound":"VUxhaGIgc0d4OQ==","upper_bound":"VWNCVWsxTSx1eElXdFdpWTlETVpHS2REcWZR","repeats":1},{"count":3810000,"lower_bound":"VWNUZm9UU1lLTVVRcnhHS3ggbXAzR2ppUlZj","upper_bound":"VXM1MnowWnlBVE95NzJjdWsxYjBtZiA3ZU1MUVkgcXNvTUczMzlhUQ==","repeats":1},{"count":3840000,"lower_bound":"VXNBQUZQZzVlUGVILDd1M2JQQjVLNVlla3pzRWN6Z0w2b2VFZw==","upper_bound":"VjV0WXNhU1J5ZUVZY1E=","repeats":1},{"count":3870000,"lower_bound":"VjZzVjgyUWxHRmJNbU1y","upper_bound":"VlFjNXlHaHRLM2lQN016TEFLV1R0ZXdlaEoxTkxTUTJ2eEdq","repeats":1},{"count":3900000,"lower_bound":"VlJyMUI0NEtWMlFRZnRlbjhZRnl6Z3JyWlBna2o=","upper_bound":"Vmd6MzNrTkZ4cGhq","repeats":1},{"count":3930000,"lower_bound":"Vmg2NkkgSzdyc1lkcWVtdVQ0N3laZzhqTGhC","upper_bound":"VnhQYjA4MExmd3NMSTY4Nmo3cXJpWnpOQmc=","repeats":1},{"count":3960000,"lower_bound":"VnhRV0ksdG9CWDgxRHozQXNXeDAyTzkyZUpHUnE=","upper_bound":"V0RtNGVlUGdscFZRWU51","repeats":1},{"count":3990000,"lower_bound":"V0VsaGwsRUxkWEVueCAxQ2MzU3RyY3hEemhjNEFBU2FK","upper_bound":"V1JCMUtRcHUzZlU4ZkFwRHUgRjFjbnloaXdOUW1XLEN3N0dneng4","repeats":1},{"count":4020000,"lower_bound":"V1JHaXhZMHpXTWtSZURjTw==","upper_bound":"V2csSTlCNk8wY3dWNkhBeU9HYnlnQUJzRmZ0WW5ZdDU2Y3ZuLDBp","repeats":1},{"count":4050000,"lower_bound":"V2dFVG5GenBzc0Z4eFdBUA==","upper_bound":"WCBWOFZ6WFVlV2daOGo3ckM=","repeats":1},{"count":4080000,"lower_bound":"WCBYNlBUSDVlY0JUN1c3N2d0","upper_bound":"WEhKa0w3dG9QamxXMDJ4WjRwMW91dyB3bFBiN2pzOVRHM3ZWLHlT","repeats":1},{"count":4110000,"lower_bound":"WEhnZEkxcTh0UUd6QWFRLHE=","upper_bound":"WFdhdnkxZDFNQ1VmME9VMVFjNjEgb1BpMw==","repeats":1},{"count":4140000,"lower_bound":"WFdpOVlxMFRia1loTXdWV3V4SU9zV1hPU2hBczU=","upper_bound":"WGtySGlrVGpYZ0ZHQzhlLFRRSFV1cjdYSmkwWjJJNmdXRA==","repeats":1},{"count":4170000,"lower_bound":"WGwxU0ZVZ0ExbkdrUXc=","upper_bound":"WTFSYjdrMlNwU2dZWTNERQ==","repeats":1},{"count":4200000,"lower_bound":"WTFTQ0tpbHYgY2FZOXcyWGVwbWFjWXRYWmFv","upper_bound":"WUV2akNkcyx0TDRWNixqOW1USnhwbllldVp3OGxGMmE3Sw==","repeats":1},{"count":4230000,"lower_bound":"WUV5OXF4NFJHLHVRcjRqN1lQRU15b3BodkE1VHdoY28s","upper_bound":"WVJra2duR0VNOXVOUVNkdFltZTNIYXdLS2E0a0R6VXplSUs=","repeats":1},{"count":4260000,"lower_bound":"WVNQTyA2VWUyQjZ1TGtrTHNHNG4=","upper_bound":"WWpiaHBKRHpNSW12bg==","repeats":1},{"count":4290000,"lower_bound":"WWxZM2dRemV5LDNLd3RRVnp3LG9sNFAsZFZYbzJNRjR5Qg==","upper_bound":"WjNQNTZHa1ZGd1hDOVYgSDJrUXlHTWF5dQ==","repeats":1},{"count":4320000,"lower_bound":"WjRLNVBudDFlZUJwMXg0UGMgUldjendzUnFkUkNUSm5W","upper_bound":"Wkx2Z09tY041TXgzNTBCTnB0S3VY","repeats":1},{"count":4350000,"lower_bound":"Wkx6UTMzR2MzQkJHV1Boc0VPIHp0VjNTbVpZQyBsTGQx","upper_bound":"WmFTRkljVndaaUU1ZFB1VmQzcHZ0U1M=","repeats":1},{"count":4380000,"lower_bound":"WmFvbVQ2Z0RBWG5kb0lZMWJxTG4zeDFF","upper_bound":"Wm9nVE1QIGNvSHNHbWU=","repeats":1},{"count":4410000,"lower_bound":"WnBZbDltUUZMQUFKdDBnNmtNWkU=","upper_bound":"YTNKZSxlTlh1TndyQUh0OEZucENxRFJqU0pKRkta","repeats":1},{"count":4440000,"lower_bound":"YTNmVWtucjJ2MlBSc1IgMHFZam5l","upper_bound":"YU5DWXNlb3pxVk5RRg==","repeats":1},{"count":4470000,"lower_bound":"YU9CUWM5dTJ3aE5GUURQYnBRQWc5T3hELHNYVjNIU0xp","upper_bound":"YWF4c0lLdUs3c0tXSDVRWXBUcQ==","repeats":1},{"count":4500000,"lower_bound":"YWI0Wk83amJWS2hONkltbVJSZ3ZZNFJPM3A=","upper_bound":"YXJRc21TOUloSlN5UURHc0g=","repeats":1},{"count":4530000,"lower_bound":"YXJTRTlDS1ZwaFQ3RWhJcXBnNlA=","upper_bound":"YjJWckNrIGZBaFp3N3JiQ2F2aVpoNHJSRCBwVllH","repeats":1},{"count":4560000,"lower_bound":"YjNUQ0hGaTZMclc1YTRQdQ==","upper_bound":"YkpNcURscWpTZjN1QWE=","repeats":1},{"count":4590000,"lower_bound":"YkplY01sSFpJMjUxRUZUSVFuVTVlNW16dFNvT1c=","upper_bound":"YllYdHdKZnhOcG1DelR4bDFKZ2JqMnJBanVMUnU4NXhKWQ==","repeats":1},{"count":4620000,"lower_bound":"YlluaGJlIFlFLA==","upper_bound":"Ym5vdjA3NEVSTFVDT3B0TXlLMyBmUWZWaQ==","repeats":1},{"count":4650000,"lower_bound":"Ym9GTXZqR0pLRkdyRWFzSEt3NkxkR2ExWiBybHEgMmZSTSxNbEE=","upper_bound":"YzRIRXJzdFhOdzMgbHp5cmpI","repeats":1},{"count":4680000,"lower_bound":"YzRPTzRBSmNDWnFMcA==","upper_bound":"Y0xNIEE3RSA1dG15IHB5byxPOUVNODdQZklsYg==","repeats":1},{"count":4710000,"lower_bound":"Y01XSzBnMUpUR2MgN1lXSixJZEtq","upper_bound":"Y2JSanp0MU9TTA==","repeats":1},{"count":4740000,"lower_bound":"Y2JZSnNaTzMzS0k=","upper_bound":"Y3JJYjl6VFY1eSxNbUYwOWlzNE9adXZ2amJkVjRPVUFtaA==","repeats":1},{"count":4770000,"lower_bound":"Y3M0V1R3MTRid1ZReWRVODFUVGo1WkdaWHo5VWNOMkZVT251dDk=","upper_bound":"ZDRlMThNV0lrVDhNRUY4","repeats":1},{"count":4800000,"lower_bound":"ZDVVVXIgYjJZLFJxRjdRQjRLa0tFTXM=","upper_bound":"ZE5QQ0w1aEVtRm04MUt3WjVPaHI5ZXgwdlBwNw==","repeats":1},{"count":4830000,"lower_bound":"ZE5qZjRsVXlrZ0hrVW4zOEt6ZVRYZEhhUzlOWXhveA==","upper_bound":"ZGVVOTZnMSxoZ1NKdlh5Q0o3TVhSVXUgN1FzIEtZR3RlZG54Tw==","repeats":1},{"count":4860000,"lower_bound":"ZGVZZnlCU3BtY1VKaXo=","upper_bound":"ZHZCS0liQjkgS0hJNGtaNFNTeDlwOHBrdVFrQ2pZTiBlWEVX","repeats":1},{"count":4890000,"lower_bound":"ZHZoaHF4MW83SnJzUVFpUHBVQVM5aUM1MXJUYWZFdDggTmVKaUJKMA==","upper_bound":"ZUE3TkN6YVggcQ==","repeats":1},{"count":4920000,"lower_bound":"ZUFLRTJHMWxldzEyRU9pVVNlc1NjOFM1bjZMM2c=","upper_bound":"ZU9hbHJrbWY3a1IwRWZVM25zclZxOURQWDIxWHF3OUxLNjJkOTdC","repeats":1},{"count":4950000,"lower_bound":"ZU9kRHpsQzQwbUVBTldIQTdUeDl3aWFvdmliWVExYXhwaw==","upper_bound":"ZWd5UDZXamRmZVM0RUxXUVpWTnk1aDZ2","repeats":1},{"count":4980000,"lower_bound":"ZWhNaWI2NHQ4SjB2dDg=","upper_bound":"ZXpyUTk3LFVsSkt2RUpWUSBjakw2VnFiMU5YYjc=","repeats":1},{"count":5010000,"lower_bound":"ZiBpUlFsYUU1NEFpalhBNllOSVpKSDd3SDI=","upper_bound":"ZkZpcktSemUxRHE1IG1xQ3g2dXJRWXkzWjF5b2psSnA5ZmwwIFlJWA==","repeats":1},{"count":5040000,"lower_bound":"ZkdBc0FHVVdFUktQeg==","upper_bound":"ZlZpTkRlNlQzTHl5QjBhWXZQOCAxak5pOGxV","repeats":1},{"count":5070000,"lower_bound":"ZldEUzNOIHBzOHdrODBxZ2VYOG9HUlpaalZXNUgwdFZQYVdNYnlk","upper_bound":"ZnZacjVId1RSUTFKZk52ZTNWWTM=","repeats":1},{"count":5100000,"lower_bound":"ZnZlQko5UUVCVDFYLE5KMTRDUGlXNWVa","upper_bound":"ZzlSejJJYVF2ajhrYzNjam1TbXFuYSx3RkVKUkZYUzZnYXFBNA==","repeats":1},{"count":5130000,"lower_bound":"Zzl1SVJwTmM3dk0sM0tydWl0Mg==","upper_bound":"Z084NzBvRDZvaTJwalFT","repeats":1},{"count":5160000,"lower_bound":"Z09aR3JZdzFVVg==","upper_bound":"Z2JaNDJxa1R6Q0k1UnEsZkdqTnllUFljOVBr","repeats":1},{"count":5190000,"lower_bound":"Z2JwOGhqT2xiT1ogZmFDUQ==","upper_bound":"Z3I3UVU2VjRNR2FrTywgcGpLWEpoQ2NGZ1hYbm1VRHYxSHlYMWxYbQ==","repeats":1},{"count":5220000,"lower_bound":"Z3JDYjksaXh1OXlKWlVJQ1lIN2x3TXpMcExUbzJ2bFpy","upper_bound":"aDN6NU8gN0hTUWFGUXlPemVo","repeats":1},{"count":5250000,"lower_bound":"aDQzazJ3YWhNdWxscmlzeVBYN0c=","upper_bound":"aElGTkZ6c2lJdjVFNTdK","repeats":1},{"count":5280000,"lower_bound":"aElGd0JNamlLY0ksMk1sdkR6OTNMIG9IMnZXb0VsSUs=","upper_bound":"aFZYQ2oxREFId3B1SmN0UktJMFVo","repeats":1},{"count":5310000,"lower_bound":"aFZaSkRsalBhYW4xWkh1SVZsak9vQUZ3c1FUVw==","upper_bound":"aGlvSyxRSSBpT2Z2","repeats":1},{"count":5340000,"lower_bound":"aGp6ZyB0c25CUjZJSm1sVEMwMzRRIHpvTjRXcEJlNk56eDdPaFJX","upper_bound":"aHpFZXhYMkUxZUtMWjFoaUJKOA==","repeats":1},{"count":5370000,"lower_bound":"aHpheTdlZUswdHRPV0xIVnAyRUJscXdS","upper_bound":"aTlCREs2TWNVZFNTSjdEeXJlQjZZ","repeats":1},{"count":5400000,"lower_bound":"aTlIWGZwT1NIYVVYbU5kSg==","upper_bound":"aVM0ajR2dGZ5STFpN2FXb1M5Wg==","repeats":1},{"count":5430000,"lower_bound":"aVRmNE9zIDRCdw==","upper_bound":"aWtaM09zRCx4b09YZw==","repeats":1},{"count":5460000,"lower_bound":"aWthWUZPbmp3ekRuZCxTRVFQZlROZUxYMw==","upper_bound":"aixOcWxlLGE0TFJrdnhuVHRwRXJnZk11a2Jt","repeats":1},{"count":5490000,"lower_bound":"aix4Y1RoM09NeXJFdGwzSE0gc1VvY1BZWmRJcmxySUFWdXBx","upper_bound":"akF2WjNzQVVuZ25Wa2pQSmlDbyx1RXlSb1pQUjRy","repeats":1},{"count":5520000,"lower_bound":"akJPOXo2OWJkIEVkMEUsWTVYUkRwelh1TyA=","upper_bound":"ak5YWXlKc1VBVkVBeWhSS3E4aVR4cHl3eGdDbg==","repeats":1},{"count":5550000,"lower_bound":"ak9PUW5VSHdST3hnRjVMYkJrc3UgYU0gdjdKOUdMUWdHNWs=","upper_bound":"amYgd3ZEMEZjeFU1N0gyRlZuVmR5MUV1c1I=","repeats":1},{"count":5580000,"lower_bound":"amZ5OFNwUHVueXRrZnU=","upper_bound":"anlCQUN3VVNGM0s2cllLc1gycEd2S2FrWjlLVWd5YyA3RjRo","repeats":1},{"count":5610000,"lower_bound":"anlOZThiVWFVektWRHJWZTFvbUxzekM=","upper_bound":"a0RsNHdvbmFjakkzLFF1Nm55Mk81ZXVk","repeats":1},{"count":5640000,"lower_bound":"a0RuczFTcnAxMTE0dlps","upper_bound":"a1V6LE1hanRHRjNUZXJWcWd3djV4d0xmazN0Q2JScENWQSBJcQ==","repeats":1},{"count":5670000,"lower_bound":"a1YyTzhFQXIxbHhtUk9GbTVnNm05V0NFM0dYcE9DIGVieg==","upper_bound":"a2poQ2ZEMnpMaGRQMjIgejhxTWtFNlU1V1dKWm04UGxpUGE=","repeats":1},{"count":5700000,"lower_bound":"a2pzbERFVGlXbUoybnNJWm5hQ04x","upper_bound":"a3p0bnk2cHhoLFRNMm9pZThQMURuenB3UDlpaW1ERjVucg==","repeats":1},{"count":5730000,"lower_bound":"bCBLdEI3ZkZSY21lIGRCZFdLelBhVHhabkhQdU5BS2w=","upper_bound":"bERpZ3JybnJjamZrd0IgRE91","repeats":1},{"count":5760000,"lower_bound":"bEU0OTBPNix5ZWxpZUY1UGRHZGp3T1BmSCxLLE9L","upper_bound":"bFdpRUNSbHBFZGpJ","repeats":1},{"count":5790000,"lower_bound":"bFdwdG5sTUMzR3lqODE0R2EsRzRlQTdwV05OWGwxV0NVZkc=","upper_bound":"bG01NExQMERvMFRoRU8yQmJqdDhWTjVvNjhDVXB3NEFn","repeats":1},{"count":5820000,"lower_bound":"bG1ZOG8yak1CbzZ1VXJJQWpkaFVzOGVZbFBxOGE=","upper_bound":"bSxMRU81aGEwdGdMOThsT3hzVWZwUUlOUm5BdnkweFE3a3llTA==","repeats":1},{"count":5850000,"lower_bound":"bTAzYkxFSWMyQW5LeW8gbjgyYkVjeHdzZ0xQRXZKbTVyd1ZSNW0=","upper_bound":"bUVRUG1FVFRPZEpIdXZRYmJLUnRGS3R1aGF2Y2xu","repeats":1},{"count":5880000,"lower_bound":"bUZubnFkRks2S1psTWRrRktYb0g0ajRUYndrRA==","upper_bound":"bVgwNWpncEFWOU85OE4=","repeats":1},{"count":5910000,"lower_bound":"bVhWMG1pdldSYkkxZzA2OW1HTA==","upper_bound":"bXBBV2F5T3dwQWFLV1FlWDJw","repeats":1},{"count":5940000,"lower_bound":"bXB1U0hTUWVmc1JNdQ==","upper_bound":"bjB5ZEYxRDl0N0NGRWFUcGtOM1FPcThqUVFJTjdP","repeats":1},{"count":5970000,"lower_bound":"bjFQczZFNWR4VEUyNFBuemFnaEVwV1pHTVQ0dXFsTVJnZ3E=","upper_bound":"bkZ0SWVWb3Q4NWhHT3RMd3RCSXpiMWFmczJ6UmY=","repeats":1},{"count":6000000,"lower_bound":"bkc4VWpmN0tsMWlMZzdPeUhSMFRtNERyRExVOVNKNjlzOW1P","upper_bound":"blN1d1F3enI5QTdKNHpmVGNDSDM3N3lGVFdIUg==","repeats":1},{"count":6030000,"lower_bound":"blN3RGJpYUJlWFhNajd0SFRyckY=","upper_bound":"bmtsdzllUGpaOUlwUDVheDY2","repeats":1},{"count":6060000,"lower_bound":"bmwgeGdERXpjdk4wNUJxc1ZjSjVkazIxRHJJNDdEOXBNQXA=","upper_bound":"byB3UEFEeElrMHM5bCw=","repeats":1},{"count":6090000,"lower_bound":"byxOVVJaIHdZM0NxYVJkVGdnRWFHUFlJbmhOZjZEMnFtcjB3","upper_bound":"b0JHZUhNWENyM0NHNG9id3ZrUXV1OHJvNEcwOVlFR0dj","repeats":1},{"count":6120000,"lower_bound":"b0JZRVlRekRLbW5ybDRTcHYxbmpGMnA4M0pCNg==","upper_bound":"b1FScUpoYVRRZWRlY0tCNjQ=","repeats":1},{"count":6150000,"lower_bound":"b1FlRm9DdHZ0VnF4b01taHVHdTJhNG5GNmFBMGZ1UXZzeFM=","upper_bound":"b2g5eTVvVklMOW41Vw==","repeats":1},{"count":6180000,"lower_bound":"b2hVYnVoTDBJNXQ=","upper_bound":"b3ZFOHJIOEc3WFNpUmczVkhneVk=","repeats":1},{"count":6210000,"lower_bound":"b3dDUTJSWXlwZWFhdEltNUxpNFdYQmZvIEJxU0ZxQSA=","upper_bound":"cDhUWGtDMXdUWnZCNnlDcHh4T0hTNDdEZWZ5YnE3S3A3Ykhacw==","repeats":1},{"count":6240000,"lower_bound":"cDlFZ3F4T3RBODhGLFFCWnpjd0l5NVMyeWhCY2c=","upper_bound":"cFJUQ2lSWmYyRXcgWU5kZEE=","repeats":1},{"count":6270000,"lower_bound":"cFJVRHlJdlNLemFBem1LWTJOcGMxUHhBNlFYd2lF","upper_bound":"cGtGZXRCQmRiUVlKaHhqV1UsUzdQMTJLMjAxRFlj","repeats":1},{"count":6300000,"lower_bound":"cGtsakVvLHEza2JxUSBlMG1ENUc3S0RBalNU","upper_bound":"cTJNYVdYS0pqOGszSXBROXdaNU1WWEV3b2xp","repeats":1},{"count":6330000,"lower_bound":"cTJlNmlHcm9ndjJSOTA3aWlhcFVyQzZzWllzb2Q2Qw==","upper_bound":"cUlFTWN0cWYwM3lURWZQQ2dYLFZkIEdFSWlIS0tzRXlrbA==","repeats":1},{"count":6360000,"lower_bound":"cUlXUXJHWGZqTElzMzFmRDV6THQ4NXBlVFhDZ3Nic2UgaEZjRzg=","upper_bound":"cVZOc1FkSDdaczQyRGxZR3ZPM1YxOTI=","repeats":1},{"count":6390000,"lower_bound":"cVZobEJVOVppdQ==","upper_bound":"cW9FT0ZvRDdUd3VPVHJNcUlqeQ==","repeats":1},{"count":6420000,"lower_bound":"cW9uRVJGMGFXRGhCTTE3YjJQN3p1ckFNb3hmZHM1R0N4cE4wSlJi","upper_bound":"cjFwUHVwbDNuZ2RPeUhsUTBNQiA3QmZoMGVOc21M","repeats":1},{"count":6450000,"lower_bound":"cjI1Y292R1daYlRHa0ZXV05idUNFTURHQ09nMXhQZUJ2aWJwVkc=","upper_bound":"ckdWUE1veXd0LHliemJ1","repeats":1},{"count":6480000,"lower_bound":"ckdaVTg4YlVWTUgxbVh3Nw==","upper_bound":"clJGeGNTMlRXdGxMT1ZteDZuSUlCdUtk","repeats":1},{"count":6510000,"lower_bound":"clNDSnBYNGFDeWlIbDdwVW5zaG04IDROWg==","upper_bound":"cmx1V0pzMmJyNFJjR0tXVEhTVSB6SkRpcENtazVJWlBYemY3dg==","repeats":1},{"count":6540000,"lower_bound":"cmx1ejN0RTlPbw==","upper_bound":"czBaQmpIcXhBdWhr","repeats":1},{"count":6570000,"lower_bound":"czBqUjdUNW1VM3hSc284MXlKMGRJOHpX","upper_bound":"c0RkNSB2a09aa0UwN25UMVhSTVhJdzhpOWJwMlVUUTV1emE=","repeats":1},{"count":6600000,"lower_bound":"c0VHRjd3NGRIcEN0bHNDNlNmODJyNjlZM2h4T3dJc2ggVTFGZ3Qg","upper_bound":"c1ZIM2VDRCA3Sk5NeEE=","repeats":1},{"count":6630000,"lower_bound":"c1ZicWpCT3RKMTZZamxoV2lmR09vQ0tZdkNhYXpmNHggMnEgag==","upper_bound":"c2tiancyNHoxY0JaUXVGSlk1TTl1OGZsV3FNUlQ1","repeats":1},{"count":6660000,"lower_bound":"c2trNFVSUjJQc0ptZnFDQm5tUnJISmFIdHJ1RVFV","upper_bound":"c3g1aEtLdGYxTFMwOTRtdmwscXBMTHhKWg==","repeats":1},{"count":6690000,"lower_bound":"c3hyOWdVdERxc0txMFVsZw==","upper_bound":"dENCOGU0NyxrUXpsbjlxR2NxZmhpZ1BEQUJJc04=","repeats":1},{"count":6720000,"lower_bound":"dENDenloUERUU0piUUJWR2Vtb0dDZyBRNmNVMQ==","upper_bound":"dFVOWEx3Y2JxSTRaWE1QOE5iMg==","repeats":1},{"count":6750000,"lower_bound":"dFVhOEVMLFBBd1BsZzBKTkFmMzVmTTZPbWsyRFI2WXNRYk9BVQ==","upper_bound":"dGlURlNCSFF6dGRBZUZKM2k5cmpvUnd5WUFqQ3dOVFk1Tmlu","repeats":1},{"count":6780000,"lower_bound":"dGlyNk5TdDhEUVhZbTdacGd4d1pjaW5ZZG16","upper_bound":"dHJrMk0sWVAybzg=","repeats":1},{"count":6810000,"lower_bound":"dHJvOHQ5bGc3NERPdGhka0E=","upper_bound":"dTloRG5hZmFLZjVEZ0VFY2JjZGlvdWNUNTVSVGpEdA==","repeats":1},{"count":6840000,"lower_bound":"dUFaa1N3bngsQVJy","upper_bound":"dU44NTBheFc2NVpjWFN1UUVMeVB3MlJta0Y0NzlXRUNu","repeats":1},{"count":6870000,"lower_bound":"dU9HYSxBOXBRZUhKd3ZDZksxYzRzaHBzTllMSw==","upper_bound":"dWtZeEIydTlKdjB0SFRmajhOeE1Caw==","repeats":1},{"count":6900000,"lower_bound":"dWtmYmNaQzYgcktYQjdCZ3lrNW8gMkdqdHVN","upper_bound":"dXk2T1BrdDVWbkU=","repeats":1},{"count":6930000,"lower_bound":"dXpxSVNpYW9vUyxDTUx5cQ==","upper_bound":"dkNpcVU1SVhlQ1g1dkM2UnA=","repeats":1},{"count":6960000,"lower_bound":"dkN1NnlnWWZpajFwc3N0SmVIem84MWNQNGF2","upper_bound":"dlRobEx0TTViIGlWVm9zVzN1bWs3dWtMb3RIR2ZVeHkgcjVZZnlv","repeats":1},{"count":6990000,"lower_bound":"dlY4cVFTOVBxelVmOFJtMEYxTHdVQVcyIHB5cUtZamI=","upper_bound":"dmtuYlJzMTJweWx6NnlySGggQm9IQXQwVDhOaHExYmZaT3JhNCxz","repeats":1},{"count":7020000,"lower_bound":"dmxCbndJV2drbHpiR0ZYd2RBTUZGdlV5MnhnQkRx","upper_bound":"dnpYTEI4SjlKLDBPSVZMNEJHZ2JnVG1EOVZaOWc1UVQgSWxm","repeats":1},{"count":7050000,"lower_bound":"dyBmeTN0alRCbElkV2JsQmNhR0prREoyOHBFcXo0aUZFRkxlVnJ5Zw==","upper_bound":"d0QyTHh0SW8zZllONGUyck4=","repeats":1},{"count":7080000,"lower_bound":"d0RRa1FDbHVnT2xuVmVHVXQxMXBNamY=","upper_bound":"d1JSaUk4Q3gyT2piRThzSXRpUXhmak8zTWNCWWt0Y2lSV0dS","repeats":1},{"count":7110000,"lower_bound":"d1JwNXFyWE83MWFpWHBGd2cxQjJl","upper_bound":"d2Y1amV5UkM1UW00eCBuYW5UQ1JTSzgyejZwZjc=","repeats":1},{"count":7140000,"lower_bound":"d2ZQcCxpcmlCa1hWVExpdDJWTyBVbHBlV1l4M3g=","upper_bound":"d3NGNSBYcXZkYmhtcFIzWmUgVjE3VWkxV0xmaDg=","repeats":1},{"count":7170000,"lower_bound":"d3NnaWV4TUZzc1Q0SiBIWnksLHU1NFM4U1RG","upper_bound":"eDdNRUNTUUV4OU1lWU4g","repeats":1},{"count":7200000,"lower_bound":"eDdVQmksZHp4elo=","upper_bound":"eFNyIFJ1IGRpcUNNd0UgblkwdQ==","repeats":1},{"count":7230000,"lower_bound":"eFN0RnJoSXE5SXB4eTQ0LElGNTQ=","upper_bound":"eGptVGtGQnRFcENkZnRuQkVZNSwwUU8wU2hZd0ZRU3lSUA==","repeats":1},{"count":7260000,"lower_bound":"eGtBblBZYUg5dG9lSUpyZVJvQjZOdzQ3YkZWVE1JZTZPcDh1aw==","upper_bound":"eHlYTkNhajlUT1dhMw==","repeats":1},{"count":7290000,"lower_bound":"eHoxODVsUmpnWlc=","upper_bound":"eURmZGtUdXI0eUo2OGRVNg==","repeats":1},{"count":7320000,"lower_bound":"eURxa3NlSDZ1UURTM0tQaGk0eE5JaW9IOTFUbHZBV2tC","upper_bound":"eVJDSmVsTnR6UW9qYnpQUkRhSTFPVUM=","repeats":1},{"count":7350000,"lower_bound":"eVJQWmZkVHFFVzBsdGhWWXpP","upper_bound":"eWlpYlF4ODBMQmt1V043VXlqd2ZYLEdISFpZeW1iTlRZVA==","repeats":1},{"count":7380000,"lower_bound":"eWl2cE54LFRDM2dTSUN3NTc1WXRWRDI5ajFUMGtHVHc=","upper_bound":"eXg0NXMydTBDU0lhY0g=","repeats":1},{"count":7410000,"lower_bound":"eXg5NDNJRjJ4UlpXcjN2Y2o=","upper_bound":"ekRnTmtvejRKcVJ6eUlURkNMZSxKMVgxWUVkQVY3V212MkU=","repeats":1},{"count":7440000,"lower_bound":"ekRrYm1lQnduU1Fra01adiA=","upper_bound":"elFUQjBaUE1uIDdkY3V3aUEzbm9GOA==","repeats":1},{"count":7470000,"lower_bound":"elFoQlVVRTJtT050Nmp4Y09PNnZ5","upper_bound":"emdvOElETHdxT2dXWmdTUmtVWGNUNGROYjB6VTdJaQ==","repeats":1},{"count":7500000,"lower_bound":"emg2Vzk1Y0JIWm9OSQ==","upper_bound":"enpuR2x3QVJSS3BsTVRJ","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3713,3662,3646,3726,3694,3644,3654,3667,3612,3755,3664,3644,3664,3646,3685,3674,3581,3659,3754,3690,3664,3669,3688,3626,3735,3506,3632,3642,3725,3735,3638,3583,3674,3767,3570,3719,3684,3650,3686,3736,3687,3601,3703,3562,3651,3614,3715,3606,3602,3623,3645,3703,3738,3662,3627,3700,3518,3754,3595,3752,3714,3658,3674,3727,3781,3621,3651,3716,3704,3656,3607,3648,3568,3649,3595,3752,3619,3689,3725,3580,3632,3708,3708,3663,3605,3671,3607,3695,3519,3664,3704,3710,3591,3661,3666,3619,3606,3749,3696,3618,3706,3692,3739,3628,3689,3619,3651,3620,3681,3692,3699,3714,3645,3632,3724,3702,3619,3629,3665,3762,3725,3663,3601,3812,3648,3608,3653,3694,3640,3598,3569,3756,3922,3609,3752,3714,3632,3670,3694,3756,3652,3704,3649,3695,3632,3654,3727,3615,3660,3703,3711,3769,3724,3596,3710,3716,3745,3591,3623,3662,3669,3678,3829,3576,3642,3754,3683,3643,3661,3764,3609,3715,3699,3584,3662,3645,3734,3532,3633,3652,3744,3609,3503,3706,3666,3669,3686,3658,3595,3732,3633,3701,3686,3592,3736,3695,3633,3690,3687,3736,3578,3670,3767,3561,3717,3715,3712,3623,3800,3559,3658,3625,3713,3618,3588,3717,3694,3588,3825,3703,3674,3624,3678,3603,3774,3678,3633,3734,3714,3727,3630,3755,3627,3618,3714,3645,3695,3681,3675,3606,3564,3514,3674,3737,3717,3677,3665,3754,3664,3626,3625,3717,3722,3743,3778,3609,3618,3545,3701,3669,3596,3576,3680,3649,3617,3720,3617,3781,3741,3642,3706,3627,3625,3794,3718,3718,3787,3683,3711,3638,3615,3643,3620,3663,3601,3721,3685,3686,3585,3647,3676,3662,3651,3603,3634,3610,3712,3688,3662,3670,3619,3638,3524,3766,3738,3697,3633,3573,3690,3673,3615,3621,3749,3678,3640,3621,3731,3762,3694,3681,3652,3564,3663,3679,3632,3630,3660,3739,3588,3631,3631,3635,3540,3647,3672,3612,3609,3592,3643,3581,3641,3648,3606,3726,3653,3700,3693,3635,3706,3590,3675,3665,3589,3629,3595,3661,3633,3705,3612,3816,3657,3688,3688,3635,3600,3601,3710,3778,3742,3639,3620,3591,3566,3738,3718,3643,3662,3707,3601,3604,3630,3704,3672,3714,3762,3595,3614,3816,3717,3641,3712,3667,3768,3612,3699,3681,3690,3666,3613,3714,3629,3638,3700,3726,3705,3658,3711,3659,3675,3660,3682,3682,3716,3610,3649,3628,3653,3679,3672,3606,3655,3583,3535,3642,3650,3800,3653,3634,3685,3805,3670,3686,3588,3696,3748,3686,3569,3570,3614,3730,3612,3686,3844,3612,3663,3702,3634,3607,3642,3714,3601,3693,3613,3547,3629,3571,3601,3670,3610,3551,3639,3645,3677,3609,3682,3678,3677,3556,3669,3720,3753,3684,3688,3584,3729,3626,3618,3546,3623,3713,3634,3727,3675,3591,3614,3636,3679,3660,3755,3696,3689,3734,3760,3682,3705,3739,3670,3663,3570,3769,3708,3680,3588,3467,3704,3587,3801,3719,3624,3641,3705,3654,3671,3655,3680,3535,3652,3636,3691,3820,3701,3663,3742,3710,3754,3613,3689,3580,3603,3636,3633,3752,3694,3687,3643,3632,3589,3755,3704,3725,3649,3733,3632,3685,3727,3694,3684,3606,3572,3605,3682,3702,3672,3623,3612,3731,3672,3635,3657,3648,3702,3672,3784,3657,3702,3687,3599,3612,3707,3607,3719,3525,3758,3618,3650,3703,3752,3740,3586,3696,3717,3713,3620,3649,3721,3648,3662,3519,3592,3527,3755,3648,3691,3726,3537,3605,3676,3729,3669,3636,3726,3743,3731,3613,3595,3595,3585,3706,3733,3743,3689,3670,3745,3685,3704,3693,3639,3575,3687,3666,3734,3565,3685,3759,3785,3619,3612,3667,3725,3630,3701,3742,3634,3649,3683,3688,3694,3730,3765,3568,3703,3677,3583,3703,3588,3689,3748,3751,3648,3669,3726,3684,3673,3640,3570,3642,3710,3574,3647,3603,3663,3684,3739,3603,3628,3666,3745,3649,3715,3636,3631,3731,3638,3641,3712,3665,3757,3644,3623,3625,3646,3647,3659,3631,3615,3679,3618,3674,3634,3653,3664,3717,3731,3658,3704,3777,3554,3725,3595,3699,3641,3618,3611,3639,3713,3726,3610,3733,3625,3826,3535,3539,3611,3732,3696,3623,3674,3602,3660,3587,3637,3723,3625,3600,3715,3791,3572,3721,3666,3724,3737,3617,3691,3618,3687,3718,3713,3617,3597,3502,3554,3661,3653,3750,3654,3622,3692,3672,3590,3708,3679,3711,3654,3572,3675,3692,3698,3594,3720,3641,3632,3641,3648,3671,3689,3576,3684,3816,3610,3555,3762,3751,3673,3555,3619,3717,3736,3777,3766,3633,3649,3786,3596,3677,3616,3514,3597,3556,3628,3762,3650,3578,3617,3591,3694,3721,3596,3601,3672,3684,3666,3717,3674,3605,3732,3696,3584,3569,3833,3606,3639,3665,3653,3587,3618,3717,3594,3608,3648,3787,3654,3577,3659,3669,3799,3767,3747,3656,3572,3702,3551,3641,3660,3574,3593,3596,3621,3805,3690,3702,3684,3673,3571,3788,3698,3591,3607,3649,3529,3649,3604,3655,3576,3624,3605,3659,3720,3629,3620,3646,3733,3665,3712,3627,3568,3648,3702,3665,3726,3695,3631,3611,3692,3643,3725,3725,3618,3647,3653,3609,3734,3662,3720,3675,3628,3631,3665,3604,3756,3645,3585,3705,3756,3651,3717,3695,3669,3634,3652,3713,3605,3708,3594,3588,3579,3712,3651,3695,3581,3526,3686,3722,3574,3640,3748,3688,3702,3660,3663,3636,3688,3669,3619,3638,3599,3747,3687,3691,3735,3806,3640,3655,3640,3699,3599,3757,3649,3626,3606,3624,3623,3704,3780,3635,3646,3581,3647,3737,3656,3621,3629,3670,3760,3719,3659,3630,3638,3729,3693,3720,3678,3777,3636,3564,3571,3608,3710,3643,3639,3628,3512,3736,3674,3722,3616,3611,3745,3710,3689,3625,3704,3773,3673,3665,3773,3615,3774,3601,3666,3607,3631,3582,3659,3707,3600,3672,3699,3717,3660,3716,3543,3824,3633,3693,3579,3730,3576,3673,3687,3664,3736,3577,3633,3651,3625,3698,3571,3640,3703,3579,3640,3702,3703,3648,3672,3607,3543,3653,3603,3711,3640,3680,3735,3645,3650,3659,3656,3765,3716,3642,3572,3640,3590,3547,3652,3504,3698,3651,3809,3671,3678,3722,3644,3717,3682,3475,3732,3657,3659,3692,3652,3765,3634,3748,3747,3765,3642,3664,3685,3565,3723,3735,3602,3652,3714,3659,3723,3707,3515,3645,3690,3643,3722,3623,3568,3688,3724,3752,3551,3623,3665,3666,3678,3696,3619,3678,3696,3619,3716,3638,3629,3582,3674,3676,3656,3554,3582,3591,3705,3734,3729,3697,3570,3680,3719,3650,3664,3666,3681,3670,3574,3650,3648,3652,3650,3618,3737,3662,3714,3579,3664,3799,3695,3662,3556,3688,3723,3601,3702,3717,3707,3713,3621,3658,3555,3675,3662,3687,3620,3533,3685,3647,3611,3590,3630,3657,3619,3713,3621,3632,3652,3769,3640,3611,3700,3619,3677,3644,3700,3608,3658,3610,3655,3626,3675,3552,3622,3642,3654,3542,3717,3616,3716,3695,3667,3579,3706,3629,3720,3663,3663,3651,3722,3683,3709,3569,3619,3758,3610,3652,3720,3603,3549,3670,3639,3833,3636,3595,3606,3634,3742,3635,3574,3531,3629,3767,3602,3722,3593,3611,3619,3570,3694,3601,3688,3608,3735,3682,3793,3694,3611,3641,3597,3731,3673,3696,3663,3654,3734,3670,3619,3611,3783,3684,3683,3685,3704,3569,3768,3691,3663,3662,3708,3700,3592,3613,3694,3690,3632,3626,3706,3728,3749,3586,3711,3533,3618,3630,3707,3774,3555,3618,3611,3712,3636,3621,3650,3717,3735,3641,3668,3757,3644,3704,3685,3812,3536,3641,3612,3681,3659,3683,3603,3579,3701,3569,3718,3647,3673,3607,3766,3765,3745,3684,3740,3689,3618,3727,3565,3638,3692,3601,3710,3696,3779,3596,3580,3680,3595,3683,3814,3699,3581,3603,3678,3625,3682,3674,3638,3559,3795,3611,3648,3748,3695,3520,3815,3650,3741,3642,3669,3619,3732,3605,3772,3650,3593,3687,3673,3682,3734,3486,3581,3676,3684,3641,3630,3666,3673,3744,3702,3602,3735,3629,3662,3552,3696,3711,3730,3664,3638,3717,3672,3704,3750,3665,3737,3630,3630,3677,3534,3638,3679,3682,3766,3585,3657,3681,3668,3787,3638,3555,3834,3510,3739,3634,3709,3614,3648,3627,3646,3635,3636,3653,3716,3720,3638,3705,3693,3520,3693,3689,3632,3773,3606,3513,3701,3724,3667,3654,3560,3670,3747,3731,3666,3691,3734,3760,3618,3647,3548,3667,3729,3597,3559,3734,3643,3712,3692,3590,3588,3666,3700,3715,3613,3562,3593,3542,3690,3564,3624,3592,3690,3667,3679,3647,3747,3701,3639,3582,3579,3548,3562,3679,3713,3637,3708,3785,3685,3656,3640,3606,3537,3653,3662,3687,3674,3763,3740,3651,3630,3651,3663,3538,3689,3655,3575,3727,3730,3557,3594,3741,3715,3583,3649,3768,3549,3655,3660,3617,3656,3602,3603,3611,3733,3707,3692,3623,3699,3626,3622,3745,3648,3724,3707,3822,3661,3565,3588,3674,3646,3709,3694,3590,3720,3647,3687,3656,3667,3676,3604,3743,3621,3576,3738,3684,3778,3612,3728,3619,3581,3607,3600,3509,3736,3640,3646,3579,3711,3627,3684,3673,3670,3697,3708,3662,3711,3704,3581,3664,3660,3650,3686,3715,3653,3669,3625,3717,3564,3669,3666,3738,3601,3597,3731,3596,3700,3648,3612,3581,3711,3619,3680,3687,3578,3746,3808,3767,3725,3588,3755,3623,3657,3747,3700,3586,3657,3651,3687,3650,3751,3632,3661,3619,3821,3704,3552,3726,3703,3618,3729,3790,3599,3713,3638,3650,3655,3621,3673,3600,3683,3702,3756,3717,3730,3631,3767,3675,3640,3711,3686,3693,3586,3662,3677,3616,3710,3619,3770,3690,3628,3785,3605,3588,3649,3621,3613,3729,3676,3633,3691,3623,3565,3571,3683,3680,3652,3678,3635,3595,3641,3640,3641,3750,3671,3609,3793,3671,3756,3773,3713,3615,3554,3781,3675,3658,3671,3559,3728,3688,3700,3626,3735,3603,3611,3629,3732,3644,3504,3629,3731,3652,3755,3638,3604,3693,3703,3674,3619,3700,3603,3726,3573,3755,3589,3616,3662,3642,3632,3635,3647,3748,3627,3599,3624,3619,3660,3571,3682,3603,3599,3729,3618,3711,3776,3607,3561,3511,3550,3694,3570,3620,3670,3718,3588,3639,3578,3718,3557,3694,3577,3611,3597,3706,3611,3708,3625,3609,3689,3685,3673,3641,3727,3622,3568,3625,3644,3547,3686,3580,3668,3611,3648,3751,3580,3574,3720,3667,3688,3727,3746,3649,3598,3533,3746,3737,3600,3635,3668,3678,3699,3632,3668,3659,3603,3794,3692,3769,3722,3747,3639,3573,3560,3627,3738,3623,3694,3646,3695,3579,3574,3658,3747,3600,3651,3630,3790,3668,3724,3555,3704,3619,3642,3598,3645,3569,3586,3777,3746,3499,3737,3671,3605,3690,3743,3628,3636,3679,3606,3643,3692,3677,3615,3691,3495,3664,3655,3575,3728,3551,3571,3557,3669,3568,3602,3582,3602,3745,3642,3531,3701,3508,3662,3627,3697,3577,3710,3630,3579,3715,3636,3791,3748,3682,3536,3716,3515,3644,3586,3636,3657,3526,3607,3696,3611,3693,3642,3667,3737,3743,3645,3645,3734,3728,3708,3672,3733,3720,3724,3563,3617,3632,3616,3659,3682,3627,3684,3692,3578,3691,3660,3713,3672,3768,3680,3571,3740,3677,3634,3722,3695,3709,3734,3627,3688,3655,3673,3675,3752,3751,3780,3553,3744,3577,3730,3615,3626,3641,3674,3581,3658,3677,3701,3644,3539,3681,3616,3577,3621,3623,3684,3501,3495,3742,3741,3639,3684,3605,3636,3677,3644,3646,3721,3686,3730,3583,3621,3688,3732,3654,3673,3641,3731,3656,3787,3597,3580,3642,3743,3673,3731,3727,3636,3680,3647,3649,3643,3615,3707,3651,3637,3666,3650,3663,3652,3660,3678,3604,3754,3717,3608,3649,3592,3684,3672,3663,3641,3649,3583,3730,3743,3763,3748,3660,3710,3611,3706,3669,3673,3603,3732,3667,3667,3631,3678,3677,3671,3684,3669,3604,3641,3603,3599,3771,3689,3736,3646,3682,3694,3672,3720,3637,3676,3697,3667,3654,3699,3633,3666,3666,3642,3665,3731,3729,3616,3739,3705,3679]},{"counters":[3830,3686,3519,3828,3646,3590,3630,3646,3688,3624,3607,3669,3756,3671,3630,3684,3643,3634,3704,3683,3656,3668,3700,3611,3697,3745,3507,3621,3650,3570,3616,3693,3651,3791,3698,3714,3671,3654,3607,3603,3804,3527,3626,3604,3708,3638,3663,3659,3694,3677,3665,3657,3708,3598,3726,3680,3586,3657,3695,3674,3669,3611,3596,3765,3629,3693,3563,3605,3638,3552,3779,3655,3689,3595,3666,3664,3695,3691,3657,3640,3609,3717,3593,3627,3618,3628,3643,3766,3668,3663,3688,3693,3800,3651,3681,3686,3652,3583,3666,3677,3658,3746,3704,3651,3738,3704,3702,3686,3595,3719,3712,3733,3600,3617,3689,3660,3693,3598,3635,3624,3587,3658,3653,3641,3661,3721,3658,3537,3605,3683,3666,3579,3714,3642,3682,3688,3540,3621,3659,3478,3718,3642,3770,3585,3728,3655,3584,3581,3699,3572,3709,3656,3637,3606,3600,3632,3673,3608,3570,3685,3588,3650,3714,3646,3762,3690,3594,3640,3594,3672,3733,3823,3622,3711,3701,3586,3632,3713,3662,3647,3573,3601,3658,3731,3620,3697,3579,3597,3654,3677,3791,3606,3664,3719,3559,3584,3712,3716,3653,3723,3646,3627,3650,3716,3663,3651,3639,3700,3620,3727,3695,3675,3705,3681,3628,3782,3710,3662,3580,3637,3590,3764,3725,3628,3682,3626,3686,3625,3606,3617,3632,3646,3628,3663,3708,3664,3758,3721,3656,3605,3591,3711,3616,3695,3610,3670,3627,3609,3676,3560,3771,3551,3608,3610,3628,3664,3641,3694,3693,3659,3746,3651,3616,3778,3640,3496,3698,3680,3699,3679,3657,3639,3636,3681,3590,3631,3679,3693,3594,3725,3760,3669,3616,3683,3609,3761,3739,3693,3674,3630,3636,3573,3711,3685,3624,3677,3704,3631,3765,3727,3591,3688,3622,3703,3647,3566,3649,3732,3641,3636,3610,3580,3620,3682,3616,3629,3621,3682,3636,3654,3612,3589,3715,3677,3599,3784,3702,3755,3607,3633,3679,3623,3713,3881,3675,3594,3688,3629,3617,3588,3701,3663,3649,3630,3593,3601,3614,3704,3690,3689,3780,3622,3674,3587,3717,3586,3599,3638,3612,3690,3761,3709,3581,3562,3716,3609,3596,3757,3599,3676,3750,3693,3680,3723,3559,3553,3735,3662,3682,3707,3545,3568,3660,3733,3747,3695,3537,3564,3651,3602,3580,3708,3749,3608,3690,3570,3736,3687,3626,3596,3653,3756,3652,3640,3627,3705,3702,3650,3661,3671,3715,3710,3646,3641,3606,3684,3684,3638,3641,3656,3631,3688,3637,3625,3670,3700,3659,3725,3610,3658,3628,3630,3621,3610,3652,3624,3750,3718,3698,3731,3602,3628,3644,3648,3606,3638,3737,3633,3681,3700,3682,3691,3652,3608,3612,3582,3684,3625,3698,3646,3562,3654,3711,3694,3588,3660,3617,3653,3805,3659,3676,3562,3586,3684,3668,3703,3684,3606,3672,3666,3564,3681,3554,3618,3669,3746,3565,3781,3597,3627,3637,3690,3713,3791,3721,3652,3553,3687,3707,3662,3685,3656,3746,3668,3662,3632,3783,3617,3624,3643,3686,3653,3670,3632,3630,3724,3635,3668,3853,3714,3589,3695,3699,3673,3538,3639,3644,3661,3719,3767,3647,3669,3690,3621,3580,3608,3617,3697,3633,3653,3742,3628,3660,3563,3583,3751,3756,3682,3677,3710,3731,3749,3631,3673,3645,3660,3735,3628,3771,3675,3703,3692,3634,3617,3782,3597,3716,3736,3606,3740,3663,3637,3590,3650,3724,3655,3687,3722,3609,3690,3646,3588,3790,3726,3641,3660,3617,3520,3636,3574,3655,3807,3615,3653,3725,3703,3594,3657,3672,3746,3834,3743,3639,3623,3577,3773,3679,3705,3634,3652,3653,3684,3689,3762,3668,3583,3644,3585,3629,3665,3723,3655,3642,3553,3699,3632,3745,3648,3627,3630,3607,3751,3663,3714,3632,3694,3619,3653,3639,3612,3683,3726,3724,3818,3590,3607,3654,3607,3682,3656,3664,3735,3692,3678,3706,3731,3541,3664,3706,3582,3700,3675,3644,3685,3718,3599,3637,3740,3674,3620,3624,3631,3679,3676,3621,3685,3665,3652,3677,3680,3732,3678,3653,3699,3664,3639,3585,3628,3700,3612,3792,3626,3580,3623,3679,3635,3586,3663,3716,3670,3660,3555,3618,3663,3629,3664,3701,3634,3662,3658,3670,3652,3752,3618,3723,3657,3700,3648,3580,3688,3614,3764,3571,3565,3706,3752,3705,3897,3702,3642,3535,3669,3662,3637,3708,3656,3672,3578,3618,3666,3652,3601,3822,3684,3696,3586,3771,3627,3708,3703,3576,3632,3728,3449,3650,3619,3645,3647,3768,3639,3611,3750,3709,3744,3775,3719,3639,3734,3589,3639,3589,3631,3684,3626,3641,3696,3775,3686,3650,3652,3651,3732,3605,3553,3623,3697,3655,3728,3724,3598,3648,3773,3636,3743,3570,3589,3628,3698,3678,3642,3747,3618,3544,3581,3720,3657,3641,3622,3658,3656,3561,3612,3683,3661,3694,3712,3645,3644,3628,3636,3624,3618,3641,3644,3730,3673,3671,3599,3790,3637,3661,3692,3613,3644,3727,3593,3741,3562,3646,3528,3644,3545,3594,3573,3690,3657,3716,3706,3640,3614,3556,3691,3673,3662,3743,3629,3773,3683,3598,3804,3704,3653,3616,3622,3555,3630,3605,3630,3680,3598,3663,3606,3702,3620,3513,3681,3700,3779,3700,3646,3728,3613,3656,3735,3601,3679,3765,3732,3615,3596,3637,3625,3749,3722,3647,3581,3628,3695,3713,3657,3658,3729,3549,3744,3616,3581,3528,3713,3608,3667,3723,3696,3664,3686,3698,3652,3587,3669,3615,3684,3597,3535,3725,3666,3595,3698,3635,3653,3708,3725,3714,3606,3618,3748,3650,3661,3731,3658,3714,3617,3651,3528,3728,3683,3594,3686,3554,3755,3694,3615,3670,3630,3554,3767,3548,3632,3744,3734,3698,3628,3745,3709,3682,3624,3631,3594,3541,3732,3680,3579,3710,3614,3616,3554,3718,3633,3796,3632,3705,3660,3747,3720,3594,3679,3637,3676,3609,3615,3612,3775,3728,3700,3552,3759,3657,3619,3728,3711,3580,3767,3630,3689,3674,3608,3507,3677,3643,3644,3514,3712,3749,3644,3634,3699,3626,3604,3649,3744,3593,3581,3576,3712,3566,3741,3635,3708,3581,3638,3857,3654,3601,3644,3617,3702,3697,3609,3676,3660,3760,3650,3757,3725,3581,3664,3658,3659,3755,3703,3637,3629,3658,3646,3642,3665,3668,3636,3646,3634,3655,3667,3699,3766,3688,3621,3556,3646,3783,3618,3624,3594,3705,3731,3639,3701,3598,3719,3695,3581,3731,3773,3603,3666,3633,3619,3675,3709,3720,3743,3596,3687,3519,3717,3577,3842,3650,3783,3624,3693,3636,3695,3527,3623,3616,3583,3663,3649,3649,3688,3704,3610,3698,3766,3688,3594,3715,3569,3725,3750,3646,3512,3721,3767,3616,3571,3674,3717,3652,3698,3666,3727,3693,3689,3718,3636,3622,3566,3622,3710,3641,3628,3663,3626,3610,3771,3655,3723,3612,3686,3710,3597,3652,3633,3760,3648,3641,3744,3624,3593,3623,3611,3662,3748,3623,3641,3651,3731,3616,3658,3640,3623,3647,3635,3656,3623,3699,3643,3645,3709,3661,3691,3697,3727,3697,3604,3698,3658,3570,3616,3721,3633,3669,3804,3719,3682,3760,3590,3626,3713,3598,3628,3758,3682,3687,3754,3625,3657,3726,3680,3744,3652,3653,3741,3738,3724,3655,3709,3620,3709,3616,3665,3584,3788,3785,3614,3596,3671,3742,3779,3646,3588,3636,3714,3676,3651,3684,3681,3641,3674,3734,3744,3760,3653,3623,3839,3647,3695,3718,3790,3668,3623,3685,3684,3570,3789,3736,3514,3734,3642,3638,3609,3744,3692,3639,3640,3644,3632,3704,3674,3679,3619,3713,3621,3771,3673,3687,3647,3620,3743,3648,3726,3721,3761,3628,3724,3680,3633,3601,3596,3650,3599,3770,3695,3701,3641,3675,3730,3629,3643,3649,3659,3703,3718,3723,3714,3676,3742,3703,3571,3654,3746,3634,3690,3580,3649,3701,3704,3630,3700,3619,3620,3686,3653,3618,3651,3706,3678,3686,3662,3727,3714,3564,3720,3637,3585,3751,3750,3713,3638,3685,3721,3663,3591,3583,3587,3757,3684,3534,3564,3631,3643,3738,3700,3553,3646,3651,3597,3752,3702,3553,3748,3647,3668,3702,3757,3740,3642,3613,3738,3669,3687,3658,3663,3703,3738,3616,3654,3533,3710,3741,3664,3549,3635,3682,3627,3708,3714,3643,3696,3690,3625,3611,3612,3686,3617,3664,3746,3652,3686,3599,3673,3602,3661,3706,3680,3686,3614,3660,3663,3580,3721,3683,3628,3811,3623,3735,3743,3660,3798,3618,3618,3590,3724,3661,3610,3693,3678,3778,3672,3849,3610,3709,3667,3655,3721,3694,3700,3626,3611,3587,3650,3642,3666,3613,3608,3636,3578,3664,3568,3711,3729,3660,3584,3720,3681,3677,3684,3616,3654,3647,3656,3651,3720,3744,3656,3608,3767,3692,3739,3623,3667,3642,3583,3703,3653,3604,3716,3512,3689,3801,3722,3607,3570,3717,3685,3723,3555,3712,3724,3581,3676,3696,3657,3658,3651,3547,3729,3657,3655,3642,3600,3677,3715,3611,3766,3677,3624,3595,3566,3775,3582,3727,3648,3578,3654,3591,3633,3589,3606,3778,3656,3701,3708,3667,3729,3632,3683,3669,3739,3587,3644,3633,3759,3575,3593,3638,3701,3719,3678,3618,3638,3693,3686,3723,3628,3750,3755,3632,3666,3600,3663,3612,3634,3714,3615,3721,3674,3555,3681,3576,3680,3528,3566,3565,3612,3545,3723,3688,3644,3629,3669,3625,3655,3683,3547,3665,3713,3594,3658,3467,3655,3600,3546,3685,3663,3673,3688,3656,3680,3631,3796,3757,3693,3635,3591,3642,3569,3676,3509,3566,3688,3631,3653,3591,3712,3665,3647,3665,3612,3667,3664,3525,3709,3661,3622,3609,3716,3626,3659,3696,3680,3605,3751,3658,3733,3670,3757,3672,3694,3599,3693,3785,3733,3648,3773,3782,3771,3688,3631,3673,3683,3694,3680,3728,3556,3776,3643,3560,3699,3684,3606,3710,3556,3610,3620,3557,3595,3624,3747,3619,3729,3623,3546,3733,3627,3614,3578,3733,3603,3710,3792,3576,3717,3690,3688,3636,3659,3649,3729,3658,3580,3746,3684,3587,3654,3569,3598,3695,3650,3637,3666,3712,3716,3555,3755,3646,3676,3720,3650,3579,3690,3736,3700,3646,3636,3678,3638,3752,3723,3645,3625,3689,3681,3660,3638,3702,3582,3720,3619,3626,3735,3652,3681,3653,3576,3703,3616,3547,3594,3682,3719,3689,3641,3720,3598,3624,3720,3629,3602,3638,3668,3667,3744,3741,3603,3723,3627,3478,3571,3666,3553,3725,3575,3643,3606,3688,3725,3739,3699,3699,3625,3659,3740,3582,3593,3657,3694,3584,3617,3670,3623,3721,3738,3617,3656,3584,3639,3662,3664,3775,3694,3629,3672,3750,3707,3655,3663,3711,3659,3626,3656,3667,3765,3638,3676,3636,3665,3678,3548,3600,3701,3777,3632,3729,3626,3636,3612,3687,3714,3682,3683,3738,3724,3709,3595,3577,3770,3672,3729,3681,3732,3667,3692,3660,3731,3663,3689,3694,3717,3695,3767,3640,3575,3741,3586,3619,3711,3673,3671,3619,3685,3782,3577,3738,3711,3605,3605,3606,3735,3601,3637,3678,3679,3662,3679,3678,3711,3659,3730,3668,3720,3603,3625,3668,3548,3622,3658,3693,3687,3731,3767,3575,3653,3683,3564,3585,3660,3697,3605,3651,3664,3752,3725,3651,3760,3406,3559,3672,3578,3669,3685,3829,3682,3787,3652,3656,3556,3666,3668,3715,3684,3557,3768,3695,3728,3654,3604,3612,3630,3698,3645,3685,3855,3681,3572,3791,3636,3699,3688,3754,3692,3481,3629,3586,3667,3587,3585,3719,3713,3639,3741,3609,3623,3718,3633,3590,3732,3609,3667,3647,3672,3750,3704,3638,3635,3607,3670,3776,3674,3662,3619,3639,3686,3578,3546,3678,3660,3633,3578,3659,3714,3612,3639,3670,3653,3676,3639,3651,3636,3660,3786,3661,3582,3732,3771,3539,3564,3729,3701,3666,3729,3656,3677,3724,3634,3633,3670,3828,3613,3638,3669,3588,3532,3638,3699,3704,3689,3593,3695,3751,3570,3694,3580,3668,3606,3652,3711,3639,3641,3723,3704,3659,3629,3668,3659,3605,3656,3566,3630,3700,3713,3794,3731,3632,3639,3588,3698,3696,3760,3673,3738,3661,3569,3618,3741,3614,3707,3695,3647,3712,3635,3793,3673,3642,3631,3654,3490,3667,3708]},{"counters":[3664,3733,3629,3672,3671,3608,3630,3720,3755,3676,3532,3668,3619,3709,3651,3623,3728,3629,3675,3697,3646,3691,3678,3709,3680,3582,3757,3718,3637,3695,3730,3597,3642,3692,3684,3665,3680,3566,3707,3726,3826,3707,3609,3668,3636,3506,3664,3690,3653,3636,3630,3612,3747,3625,3660,3636,3692,3659,3680,3566,3685,3723,3613,3674,3655,3662,3637,3644,3532,3621,3663,3682,3626,3693,3517,3672,3630,3703,3691,3625,3632,3624,3690,3666,3656,3567,3691,3621,3600,3664,3746,3723,3681,3731,3643,3636,3790,3716,3680,3627,3691,3688,3694,3713,3765,3666,3636,3608,3807,3574,3563,3608,3648,3645,3627,3629,3711,3713,3652,3593,3640,3595,3636,3785,3635,3709,3674,3630,3590,3600,3625,3618,3571,3739,3699,3665,3675,3721,3561,3690,3652,3507,3668,3552,3656,3675,3631,3712,3657,3610,3674,3672,3725,3666,3678,3576,3577,3596,3661,3683,3760,3765,3790,3598,3667,3574,3748,3635,3678,3607,3622,3647,3659,3573,3654,3693,3691,3595,3626,3623,3774,3634,3647,3660,3682,3666,3535,3541,3676,3607,3661,3594,3770,3620,3696,3618,3653,3692,3759,3636,3624,3711,3651,3702,3583,3694,3595,3635,3694,3569,3689,3737,3583,3651,3649,3607,3603,3648,3720,3753,3572,3683,3656,3636,3676,3729,3741,3613,3744,3715,3628,3748,3629,3638,3621,3737,3668,3678,3663,3626,3640,3695,3660,3622,3603,3643,3661,3731,3671,3579,3715,3653,3644,3681,3805,3666,3642,3665,3662,3640,3660,3654,3682,3655,3617,3675,3535,3698,3732,3668,3702,3612,3620,3627,3685,3635,3627,3633,3702,3628,3693,3633,3736,3603,3667,3651,3704,3661,3631,3593,3684,3576,3664,3705,3628,3756,3596,3746,3678,3689,3627,3683,3708,3617,3627,3705,3567,3657,3659,3685,3626,3663,3701,3629,3689,3695,3689,3604,3628,3669,3661,3575,3678,3521,3705,3699,3732,3628,3631,3637,3636,3684,3692,3632,3718,3712,3744,3694,3756,3618,3635,3653,3686,3676,3683,3628,3722,3650,3610,3629,3604,3627,3690,3721,3649,3602,3611,3590,3601,3706,3729,3564,3716,3757,3528,3696,3615,3819,3656,3522,3653,3586,3524,3631,3663,3702,3658,3643,3763,3609,3605,3694,3647,3687,3695,3714,3626,3746,3633,3744,3609,3738,3730,3596,3723,3689,3719,3823,3615,3644,3732,3620,3701,3631,3743,3595,3687,3711,3787,3751,3621,3644,3699,3673,3605,3630,3734,3598,3687,3578,3720,3609,3582,3737,3835,3758,3718,3737,3672,3494,3743,3776,3627,3677,3660,3699,3653,3658,3635,3690,3717,3710,3638,3638,3710,3710,3683,3740,3633,3676,3665,3549,3644,3662,3647,3675,3763,3719,3783,3623,3635,3737,3660,3712,3612,3675,3696,3709,3641,3613,3581,3605,3619,3555,3619,3606,3680,3628,3647,3677,3631,3639,3627,3674,3600,3595,3755,3670,3642,3676,3719,3630,3682,3771,3654,3687,3667,3657,3773,3615,3671,3576,3720,3613,3592,3608,3707,3685,3754,3635,3536,3628,3657,3691,3652,3719,3812,3605,3689,3540,3688,3708,3636,3699,3706,3582,3679,3602,3620,3645,3743,3597,3650,3665,3689,3609,3609,3650,3745,3740,3706,3566,3634,3631,3637,3598,3648,3724,3663,3658,3643,3667,3604,3629,3634,3704,3590,3651,3677,3636,3570,3673,3631,3630,3769,3650,3741,3741,3736,3639,3553,3733,3622,3737,3574,3661,3669,3697,3608,3581,3688,3675,3725,3637,3662,3727,3604,3789,3638,3613,3582,3690,3709,3713,3659,3735,3688,3696,3567,3547,3685,3682,3702,3634,3699,3673,3761,3634,3779,3691,3698,3573,3621,3575,3625,3533,3796,3567,3713,3603,3635,3670,3636,3641,3799,3579,3573,3726,3746,3700,3608,3626,3554,3754,3684,3697,3631,3745,3684,3719,3673,3639,3682,3687,3821,3748,3614,3603,3702,3652,3617,3622,3630,3671,3653,3692,3682,3640,3590,3703,3796,3575,3700,3713,3699,3611,3673,3732,3604,3539,3662,3674,3595,3668,3628,3698,3753,3658,3681,3688,3666,3590,3642,3586,3655,3605,3702,3641,3600,3543,3699,3637,3670,3640,3636,3724,3519,3591,3543,3684,3544,3640,3627,3708,3631,3591,3588,3652,3606,3626,3681,3724,3650,3739,3658,3705,3688,3722,3668,3703,3827,3590,3743,3565,3676,3659,3702,3627,3504,3784,3661,3581,3625,3735,3690,3708,3559,3581,3610,3623,3788,3671,3654,3701,3715,3639,3624,3566,3622,3740,3605,3601,3705,3765,3584,3579,3682,3773,3673,3727,3680,3824,3681,3633,3667,3660,3629,3610,3694,3654,3632,3639,3646,3613,3600,3631,3711,3646,3746,3742,3566,3696,3672,3586,3654,3673,3701,3645,3792,3618,3639,3582,3587,3572,3600,3796,3712,3653,3733,3535,3680,3644,3741,3576,3732,3729,3626,3734,3616,3725,3685,3658,3621,3747,3532,3706,3640,3622,3573,3671,3699,3576,3658,3661,3629,3631,3656,3683,3713,3746,3747,3608,3699,3672,3756,3591,3643,3677,3613,3633,3647,3647,3741,3826,3610,3744,3746,3573,3527,3662,3650,3620,3669,3658,3701,3671,3562,3680,3736,3640,3651,3602,3554,3680,3654,3649,3692,3769,3628,3755,3709,3662,3659,3702,3603,3619,3614,3720,3621,3696,3685,3608,3663,3618,3665,3592,3585,3657,3636,3743,3612,3692,3541,3742,3652,3574,3765,3745,3684,3520,3635,3678,3742,3591,3743,3493,3720,3658,3712,3706,3614,3711,3680,3636,3636,3692,3620,3674,3691,3636,3575,3604,3700,3565,3572,3689,3710,3695,3679,3751,3753,3765,3638,3649,3599,3652,3711,3797,3668,3711,3696,3659,3719,3740,3663,3598,3626,3690,3620,3675,3785,3664,3677,3594,3696,3721,3673,3671,3672,3667,3581,3653,3667,3567,3676,3637,3711,3626,3626,3594,3629,3697,3591,3665,3699,3603,3706,3650,3708,3800,3713,3690,3585,3632,3790,3717,3689,3621,3653,3747,3769,3643,3722,3639,3585,3599,3630,3617,3636,3635,3519,3674,3666,3592,3788,3682,3724,3702,3560,3624,3624,3725,3646,3689,3620,3731,3589,3678,3764,3703,3681,3652,3603,3529,3554,3757,3571,3623,3668,3642,3700,3676,3707,3621,3758,3641,3656,3761,3757,3658,3750,3711,3696,3669,3602,3666,3614,3554,3678,3654,3745,3617,3566,3602,3640,3723,3591,3597,3643,3732,3663,3697,3689,3632,3524,3586,3556,3622,3691,3629,3686,3787,3719,3760,3696,3687,3636,3649,3711,3732,3604,3537,3701,3715,3650,3647,3712,3668,3639,3626,3655,3614,3602,3662,3618,3697,3685,3667,3640,3625,3610,3656,3641,3702,3739,3629,3732,3711,3630,3607,3587,3653,3787,3738,3748,3649,3638,3718,3693,3683,3679,3693,3554,3759,3702,3736,3745,3706,3716,3669,3741,3651,3654,3584,3665,3583,3636,3713,3611,3526,3718,3641,3563,3759,3634,3721,3628,3630,3665,3676,3735,3774,3607,3660,3622,3691,3656,3675,3751,3714,3651,3662,3617,3717,3689,3657,3638,3657,3663,3705,3637,3651,3681,3789,3692,3634,3689,3709,3599,3604,3681,3627,3611,3639,3691,3705,3622,3705,3604,3711,3607,3605,3701,3638,3663,3676,3610,3621,3734,3676,3717,3636,3705,3561,3666,3651,3671,3541,3697,3678,3620,3676,3606,3651,3752,3656,3665,3605,3621,3609,3659,3439,3699,3729,3614,3689,3592,3608,3635,3704,3662,3701,3755,3609,3749,3619,3626,3679,3589,3681,3648,3566,3701,3717,3658,3759,3737,3710,3594,3616,3613,3670,3736,3621,3614,3729,3673,3678,3694,3721,3690,3639,3727,3744,3612,3688,3802,3557,3711,3628,3670,3681,3664,3629,3761,3650,3755,3549,3567,3685,3665,3633,3623,3563,3772,3663,3752,3721,3632,3647,3765,3551,3717,3491,3657,3694,3653,3631,3579,3720,3672,3673,3706,3681,3690,3612,3674,3568,3560,3719,3609,3662,3766,3675,3676,3690,3699,3673,3663,3677,3645,3722,3724,3655,3626,3620,3697,3664,3581,3624,3670,3554,3704,3627,3621,3581,3620,3657,3664,3687,3743,3722,3701,3768,3665,3677,3589,3710,3636,3636,3660,3576,3705,3608,3695,3749,3719,3656,3745,3584,3629,3510,3617,3697,3712,3713,3606,3697,3683,3675,3566,3672,3672,3636,3608,3654,3541,3695,3594,3629,3642,3658,3658,3596,3659,3704,3805,3713,3590,3630,3678,3729,3757,3673,3688,3808,3728,3580,3605,3712,3714,3657,3705,3577,3815,3640,3687,3668,3728,3660,3644,3710,3528,3705,3657,3681,3706,3637,3646,3601,3736,3617,3715,3699,3750,3668,3638,3703,3582,3603,3656,3742,3537,3585,3781,3681,3671,3609,3647,3664,3588,3670,3668,3560,3735,3739,3717,3666,3712,3567,3744,3580,3701,3679,3705,3655,3632,3708,3664,3656,3624,3710,3664,3665,3719,3692,3659,3561,3695,3554,3675,3638,3704,3668,3788,3582,3657,3658,3789,3627,3629,3679,3583,3644,3614,3660,3686,3608,3677,3790,3543,3695,3680,3694,3667,3701,3628,3652,3715,3564,3671,3630,3665,3675,3696,3724,3646,3681,3726,3592,3783,3704,3621,3478,3647,3644,3703,3660,3722,3685,3563,3638,3692,3598,3662,3671,3703,3668,3637,3627,3666,3651,3531,3685,3734,3720,3551,3550,3653,3589,3656,3657,3734,3589,3653,3617,3721,3699,3634,3711,3724,3634,3779,3678,3685,3744,3615,3710,3571,3618,3695,3659,3645,3678,3565,3707,3563,3658,3668,3694,3742,3705,3648,3587,3581,3648,3722,3611,3694,3726,3684,3625,3567,3753,3709,3645,3668,3585,3659,3655,3658,3689,3591,3680,3766,3651,3720,3656,3672,3647,3680,3670,3771,3670,3725,3658,3727,3680,3655,3725,3762,3586,3644,3586,3638,3581,3779,3625,3632,3656,3635,3676,3605,3614,3705,3663,3731,3680,3681,3618,3630,3641,3710,3751,3712,3610,3584,3552,3655,3611,3677,3745,3635,3640,3622,3653,3568,3565,3604,3612,3638,3715,3584,3635,3597,3624,3620,3751,3620,3685,3683,3781,3603,3687,3695,3662,3671,3616,3562,3660,3728,3735,3621,3654,3804,3656,3638,3578,3683,3627,3699,3581,3770,3611,3590,3603,3742,3619,3719,3625,3627,3670,3745,3628,3640,3646,3720,3558,3594,3559,3658,3724,3667,3584,3725,3643,3564,3661,3655,3570,3633,3573,3712,3639,3673,3671,3682,3671,3701,3651,3760,3718,3697,3679,3730,3684,3663,3527,3682,3678,3604,3705,3642,3599,3567,3706,3592,3620,3674,3738,3862,3725,3596,3586,3711,3756,3700,3631,3641,3657,3709,3618,3699,3750,3614,3620,3665,3542,3610,3664,3646,3556,3595,3621,3663,3599,3649,3647,3618,3756,3660,3675,3690,3667,3659,3735,3626,3673,3618,3679,3705,3750,3699,3655,3636,3782,3613,3552,3677,3770,3689,3741,3710,3640,3777,3671,3793,3706,3708,3650,3736,3631,3566,3711,3657,3746,3667,3723,3620,3611,3661,3703,3772,3656,3700,3700,3665,3626,3597,3686,3718,3723,3665,3692,3667,3765,3621,3599,3559,3743,3636,3747,3668,3652,3674,3737,3651,3607,3668,3706,3642,3609,3769,3803,3671,3687,3734,3735,3681,3702,3700,3634,3684,3581,3718,3677,3756,3606,3593,3718,3711,3705,3657,3704,3690,3564,3643,3707,3698,3690,3703,3641,3652,3680,3603,3712,3786,3664,3694,3716,3633,3696,3669,3722,3617,3666,3771,3730,3700,3715,3581,3716,3584,3666,3633,3660,3637,3716,3627,3707,3750,3708,3616,3665,3705,3697,3666,3775,3589,3692,3653,3635,3685,3599,3812,3597,3612,3692,3623,3601,3628,3608,3642,3594,3713,3703,3699,3753,3817,3661,3789,3601,3603,3770,3638,3760,3632,3585,3575,3686,3714,3628,3637,3706,3666,3746,3631,3582,3522,3601,3571,3592,3746,3679,3615,3649,3706,3665,3579,3736,3690,3626,3636,3662,3680,3541,3710,3681,3559,3571,3668,3769,3752,3639,3692,3643,3654,3585,3672,3558,3559,3543,3676,3640,3632,3545,3608,3642,3534,3671,3563,3731,3665,3651,3633,3581,3567,3716,3674,3762,3639,3646,3553,3749,3556,3722,3731,3652,3663,3707,3617,3667,3659,3615,3559,3605,3671,3660,3652,3752,3697,3602,3647,3605,3562,3671,3676,3678,3690,3605,3702,3727,3695,3771,3719,3613,3780,3633,3677,3662,3645,3706,3697,3686,3632,3692,3693,3671]},{"counters":[3764,3669,3663,3536,3680,3439,3587,3700,3625,3656,3669,3641,3694,3683,3562,3625,3813,3653,3642,3603,3631,3667,3711,3616,3678,3638,3605,3651,3603,3725,3566,3652,3678,3643,3575,3648,3733,3643,3752,3605,3639,3584,3757,3652,3618,3662,3676,3670,3726,3737,3758,3775,3623,3804,3680,3715,3560,3691,3673,3578,3682,3671,3637,3651,3657,3730,3689,3659,3649,3615,3559,3719,3708,3732,3755,3637,3542,3606,3620,3658,3782,3719,3623,3637,3601,3591,3737,3666,3795,3687,3586,3747,3687,3674,3623,3611,3645,3662,3713,3709,3658,3710,3703,3655,3632,3580,3671,3671,3663,3678,3643,3736,3609,3577,3687,3727,3607,3641,3688,3628,3615,3728,3641,3590,3740,3700,3657,3606,3628,3578,3570,3640,3597,3612,3577,3686,3781,3603,3511,3689,3639,3590,3699,3648,3509,3650,3673,3632,3647,3633,3682,3734,3675,3633,3610,3647,3724,3728,3748,3593,3642,3677,3646,3662,3647,3623,3667,3675,3661,3683,3680,3774,3560,3680,3743,3612,3639,3614,3505,3658,3632,3548,3676,3728,3614,3524,3652,3694,3689,3698,3699,3614,3646,3668,3575,3515,3663,3669,3732,3810,3653,3736,3623,3682,3640,3711,3770,3653,3789,3701,3621,3716,3719,3672,3653,3667,3645,3556,3646,3759,3601,3627,3704,3643,3667,3670,3696,3611,3630,3715,3641,3686,3656,3619,3650,3688,3660,3634,3623,3603,3682,3648,3635,3647,3737,3715,3600,3581,3656,3604,3612,3657,3646,3604,3600,3675,3758,3645,3714,3628,3601,3696,3622,3748,3636,3727,3669,3666,3689,3615,3650,3627,3837,3674,3583,3721,3640,3630,3582,3592,3617,3705,3548,3687,3643,3623,3702,3621,3600,3669,3671,3571,3654,3666,3753,3752,3632,3521,3700,3731,3766,3613,3619,3733,3726,3595,3732,3660,3677,3714,3659,3724,3661,3538,3752,3521,3650,3728,3778,3717,3756,3614,3719,3729,3681,3733,3691,3746,3621,3723,3630,3666,3656,3678,3697,3512,3579,3643,3610,3660,3638,3646,3613,3729,3678,3725,3673,3646,3590,3671,3665,3582,3709,3643,3689,3648,3607,3725,3641,3714,3607,3698,3802,3642,3676,3687,3636,3637,3736,3674,3621,3661,3640,3713,3614,3690,3650,3567,3613,3689,3557,3716,3612,3585,3741,3752,3592,3577,3665,3670,3680,3612,3671,3708,3635,3661,3661,3840,3662,3564,3629,3658,3601,3699,3616,3553,3602,3674,3730,3726,3687,3614,3695,3696,3724,3550,3643,3611,3744,3667,3596,3702,3662,3624,3645,3690,3555,3644,3632,3700,3542,3659,3673,3653,3731,3711,3543,3599,3708,3515,3695,3701,3660,3708,3591,3646,3599,3649,3731,3820,3682,3549,3660,3587,3817,3586,3553,3666,3628,3654,3733,3668,3616,3705,3710,3791,3645,3672,3664,3712,3712,3688,3652,3596,3781,3752,3670,3719,3648,3642,3672,3732,3621,3607,3668,3755,3678,3637,3753,3663,3650,3646,3769,3503,3622,3568,3763,3733,3637,3556,3665,3724,3682,3635,3570,3735,3748,3595,3614,3609,3695,3607,3690,3709,3766,3688,3820,3674,3718,3705,3705,3611,3716,3695,3735,3587,3738,3680,3709,3669,3574,3582,3726,3720,3657,3711,3574,3623,3691,3578,3682,3689,3615,3678,3548,3560,3652,3500,3611,3783,3619,3671,3767,3695,3716,3742,3710,3705,3579,3641,3639,3640,3657,3718,3692,3594,3613,3819,3634,3750,3668,3681,3728,3664,3675,3546,3662,3661,3565,3662,3742,3718,3662,3610,3694,3661,3722,3682,3654,3772,3557,3706,3719,3643,3580,3694,3632,3718,3661,3665,3752,3641,3623,3738,3676,3700,3658,3729,3668,3652,3655,3718,3747,3720,3622,3660,3716,3654,3619,3658,3668,3679,3743,3635,3606,3656,3617,3578,3673,3706,3644,3704,3687,3631,3754,3593,3622,3633,3680,3680,3518,3682,3710,3683,3677,3742,3662,3616,3654,3699,3636,3672,3627,3616,3610,3681,3683,3806,3613,3630,3716,3706,3690,3589,3758,3564,3696,3745,3595,3541,3703,3656,3697,3567,3637,3555,3629,3657,3665,3664,3584,3673,3687,3683,3676,3549,3611,3721,3608,3663,3602,3716,3693,3670,3681,3622,3625,3612,3569,3611,3599,3723,3667,3544,3646,3583,3692,3559,3606,3640,3611,3642,3632,3735,3509,3618,3747,3650,3614,3696,3612,3649,3687,3634,3668,3733,3615,3609,3708,3680,3721,3652,3601,3603,3666,3638,3644,3628,3635,3721,3632,3624,3622,3647,3634,3701,3606,3771,3645,3593,3753,3599,3626,3682,3667,3543,3705,3607,3771,3656,3669,3728,3583,3770,3532,3611,3610,3576,3683,3648,3722,3683,3718,3657,3575,3675,3717,3587,3781,3581,3707,3642,3721,3617,3709,3570,3650,3611,3525,3717,3711,3679,3613,3676,3780,3561,3663,3589,3665,3615,3678,3683,3696,3705,3677,3737,3617,3654,3627,3732,3708,3664,3649,3699,3656,3702,3664,3730,3644,3682,3705,3586,3615,3625,3568,3561,3725,3586,3641,3696,3669,3690,3610,3671,3464,3684,3585,3669,3692,3603,3628,3566,3685,3737,3673,3637,3731,3652,3615,3682,3658,3701,3657,3661,3635,3615,3598,3746,3698,3631,3581,3698,3611,3666,3692,3752,3666,3752,3734,3713,3617,3520,3721,3707,3727,3611,3627,3682,3639,3714,3544,3706,3605,3712,3551,3633,3722,3599,3702,3648,3713,3631,3723,3586,3715,3635,3622,3570,3716,3745,3665,3699,3682,3645,3654,3675,3568,3752,3602,3623,3579,3743,3681,3618,3512,3714,3772,3667,3593,3673,3634,3586,3686,3633,3638,3715,3624,3560,3549,3670,3705,3653,3588,3526,3716,3584,3733,3665,3585,3697,3754,3771,3651,3678,3674,3738,3643,3604,3647,3724,3696,3732,3685,3729,3672,3738,3731,3583,3643,3561,3561,3557,3547,3586,3612,3775,3668,3694,3612,3618,3667,3708,3620,3693,3659,3733,3663,3511,3618,3628,3612,3606,3616,3608,3809,3623,3657,3638,3659,3654,3752,3664,3599,3658,3599,3741,3532,3692,3556,3716,3720,3770,3673,3697,3677,3683,3711,3717,3667,3666,3688,3706,3561,3702,3697,3732,3648,3715,3782,3600,3673,3654,3647,3749,3723,3606,3700,3652,3687,3677,3690,3642,3697,3622,3736,3654,3566,3693,3580,3609,3756,3578,3635,3548,3636,3772,3596,3611,3765,3657,3674,3661,3591,3743,3671,3613,3644,3580,3669,3627,3604,3634,3708,3631,3660,3605,3701,3694,3730,3624,3683,3668,3604,3637,3618,3560,3648,3766,3757,3672,3613,3779,3523,3766,3794,3675,3596,3786,3689,3616,3739,3664,3738,3698,3651,3569,3667,3784,3643,3620,3608,3775,3754,3702,3691,3675,3650,3662,3705,3660,3612,3683,3607,3708,3607,3567,3644,3688,3644,3728,3761,3630,3583,3638,3635,3779,3667,3763,3632,3645,3730,3690,3739,3615,3545,3662,3603,3771,3584,3689,3635,3673,3796,3674,3762,3764,3568,3540,3745,3684,3684,3786,3630,3568,3748,3653,3713,3618,3690,3680,3736,3671,3648,3712,3719,3616,3751,3644,3589,3671,3640,3720,3645,3584,3637,3662,3551,3703,3597,3719,3752,3697,3721,3680,3580,3717,3671,3771,3708,3626,3618,3689,3712,3671,3661,3744,3764,3760,3673,3653,3558,3649,3703,3630,3738,3711,3673,3701,3652,3679,3691,3585,3660,3727,3616,3614,3665,3719,3753,3621,3611,3624,3632,3667,3606,3617,3666,3754,3610,3650,3560,3523,3706,3707,3674,3703,3524,3684,3649,3680,3566,3679,3665,3646,3621,3665,3612,3715,3629,3630,3666,3711,3757,3595,3656,3676,3668,3578,3630,3802,3607,3726,3668,3622,3663,3765,3668,3667,3645,3673,3624,3672,3671,3688,3715,3631,3647,3619,3644,3760,3612,3727,3728,3689,3610,3619,3648,3690,3590,3715,3720,3621,3607,3612,3658,3636,3645,3719,3556,3719,3626,3610,3634,3609,3657,3777,3592,3670,3651,3717,3541,3729,3636,3582,3657,3653,3724,3649,3610,3657,3644,3563,3668,3673,3636,3536,3709,3600,3690,3551,3753,3658,3647,3729,3632,3717,3716,3759,3749,3613,3709,3647,3717,3664,3611,3635,3708,3789,3577,3741,3734,3676,3649,3579,3703,3633,3724,3599,3711,3706,3730,3676,3664,3768,3718,3697,3559,3566,3618,3573,3673,3769,3643,3571,3629,3786,3716,3721,3659,3600,3800,3705,3668,3568,3611,3694,3615,3654,3609,3651,3628,3705,3711,3769,3635,3720,3642,3596,3551,3697,3647,3808,3716,3603,3707,3548,3719,3715,3610,3701,3674,3632,3782,3604,3608,3538,3701,3588,3608,3695,3621,3627,3699,3673,3705,3661,3716,3708,3603,3620,3598,3616,3634,3661,3597,3752,3563,3536,3589,3694,3624,3607,3768,3640,3716,3626,3725,3659,3669,3766,3598,3629,3668,3603,3724,3665,3730,3624,3688,3624,3687,3710,3721,3665,3572,3656,3722,3697,3651,3725,3718,3570,3714,3641,3719,3671,3649,3714,3707,3720,3707,3682,3638,3619,3628,3677,3688,3757,3526,3727,3620,3777,3668,3678,3594,3615,3585,3651,3708,3609,3605,3697,3632,3594,3721,3710,3684,3685,3731,3696,3708,3705,3717,3640,3754,3565,3588,3675,3598,3620,3645,3645,3689,3701,3662,3688,3711,3641,3669,3602,3676,3577,3728,3686,3730,3687,3737,3710,3575,3652,3674,3840,3667,3631,3471,3649,3665,3624,3699,3562,3580,3580,3773,3730,3634,3659,3536,3599,3734,3769,3622,3669,3643,3696,3626,3587,3691,3632,3655,3543,3739,3611,3778,3691,3702,3675,3564,3709,3620,3655,3675,3701,3572,3821,3731,3667,3662,3684,3579,3671,3701,3740,3622,3624,3768,3659,3588,3625,3724,3705,3692,3682,3647,3729,3647,3639,3612,3666,3718,3674,3596,3697,3663,3690,3622,3743,3569,3537,3683,3743,3793,3685,3653,3707,3720,3685,3643,3808,3590,3619,3596,3678,3646,3707,3696,3762,3652,3661,3687,3618,3701,3740,3622,3661,3685,3803,3609,3579,3676,3670,3600,3616,3633,3727,3589,3735,3728,3712,3610,3756,3652,3599,3729,3672,3665,3639,3738,3629,3653,3641,3683,3715,3673,3663,3681,3710,3659,3629,3640,3682,3575,3606,3698,3637,3660,3609,3663,3684,3713,3775,3717,3619,3701,3727,3597,3605,3786,3669,3697,3589,3688,3588,3647,3675,3542,3712,3647,3600,3739,3620,3752,3555,3685,3661,3729,3642,3647,3664,3674,3721,3689,3608,3577,3718,3703,3727,3678,3730,3729,3630,3610,3586,3586,3703,3648,3698,3658,3714,3672,3594,3509,3741,3611,3664,3641,3690,3599,3511,3696,3568,3662,3633,3662,3672,3681,3604,3610,3649,3744,3718,3680,3563,3751,3632,3608,3585,3696,3615,3729,3628,3680,3704,3675,3713,3647,3648,3614,3565,3622,3571,3666,3703,3679,3629,3746,3663,3728,3715,3735,3639,3535,3725,3672,3786,3690,3564,3778,3630,3679,3605,3648,3643,3709,3698,3636,3646,3647,3664,3643,3671,3574,3568,3666,3705,3698,3607,3616,3601,3644,3643,3654,3619,3671,3568,3653,3565,3742,3609,3733,3708,3715,3679,3687,3682,3736,3584,3762,3720,3628,3715,3579,3663,3704,3595,3621,3856,3564,3676,3714,3671,3631,3752,3676,3696,3585,3753,3631,3658,3770,3679,3709,3660,3671,3742,3667,3660,3599,3715,3828,3581,3582,3641,3555,3635,3766,3760,3648,3550,3681,3661,3595,3780,3748,3690,3710,3694,3576,3581,3620,3661,3626,3799,3610,3791,3534,3646,3672,3588,3671,3723,3601,3664,3681,3664,3693,3706,3565,3575,3670,3626,3725,3706,3649,3646,3744,3590,3673,3701,3593,3712,3690,3792,3677,3653,3610,3737,3570,3725,3681,3664,3767,3703,3744,3711,3659,3638,3778,3668,3676,3711,3659,3718,3612,3732,3728,3705,3641,3753,3572,3661,3686,3662,3624,3656,3602,3617,3752,3564,3626,3634,3724,3642,3747,3685,3573,3630,3650,3661,3613,3660,3661,3669,3614,3599,3615,3651,3753,3631,3635,3756,3669,3734,3656,3688,3819,3781,3640,3684,3688,3619,3543,3590,3760,3666,3660,3739,3616,3521,3602,3744,3642,3656,3798,3681,3689,3714,3595,3616,3675,3614,3714,3532,3763,3657,3582,3622,3686,3688,3603,3796,3596,3677,3654,3642,3578,3662,3580,3726,3525,3514,3757,3731,3663,3765,3643,3658,3643,3752,3679,3737,3669,3638,3672,3689,3653,3731,3700,3670]},{"counters":[3597,3619,3653,3607,3536,3748,3835,3654,3659,3628,3579,3623,3620,3652,3735,3550,3632,3661,3672,3532,3654,3692,3729,3705,3631,3644,3695,3597,3549,3761,3585,3786,3605,3637,3839,3729,3661,3723,3701,3641,3570,3659,3478,3705,3606,3711,3677,3725,3631,3715,3567,3623,3718,3587,3717,3780,3673,3570,3526,3677,3618,3761,3712,3729,3723,3691,3587,3655,3694,3745,3621,3670,3555,3660,3613,3642,3654,3576,3700,3618,3664,3659,3787,3739,3710,3617,3753,3724,3631,3606,3665,3631,3735,3558,3717,3548,3697,3610,3675,3712,3699,3632,3630,3660,3765,3595,3693,3690,3700,3640,3628,3644,3657,3639,3668,3678,3608,3691,3733,3665,3602,3557,3722,3630,3607,3667,3751,3725,3664,3553,3532,3713,3700,3733,3782,3609,3679,3589,3726,3604,3664,3607,3654,3768,3709,3581,3847,3607,3636,3675,3657,3636,3619,3659,3654,3663,3645,3598,3656,3611,3715,3701,3687,3639,3724,3684,3615,3652,3583,3725,3628,3623,3670,3623,3716,3673,3636,3726,3760,3583,3695,3653,3763,3712,3655,3623,3633,3696,3753,3715,3736,3718,3782,3627,3719,3654,3663,3684,3660,3635,3735,3549,3584,3595,3704,3658,3638,3695,3647,3701,3707,3813,3675,3632,3650,3559,3730,3649,3531,3559,3688,3603,3696,3576,3637,3599,3798,3621,3731,3617,3643,3652,3585,3666,3500,3554,3560,3648,3676,3676,3731,3631,3683,3720,3695,3655,3668,3665,3616,3624,3744,3664,3777,3802,3712,3655,3670,3650,3678,3682,3626,3666,3680,3600,3657,3692,3630,3648,3689,3547,3573,3610,3690,3726,3664,3628,3669,3784,3662,3668,3683,3734,3627,3653,3637,3665,3615,3688,3716,3674,3543,3662,3798,3539,3735,3633,3552,3616,3598,3710,3717,3534,3740,3712,3689,3675,3649,3653,3634,3689,3554,3756,3723,3662,3722,3622,3634,3638,3638,3624,3672,3478,3706,3741,3649,3585,3609,3690,3715,3608,3743,3616,3574,3604,3607,3761,3741,3729,3762,3691,3602,3662,3606,3672,3636,3713,3608,3696,3681,3705,3647,3589,3773,3713,3611,3689,3644,3640,3562,3644,3667,3720,3714,3604,3662,3628,3618,3551,3629,3569,3610,3655,3767,3668,3625,3719,3652,3710,3771,3695,3580,3645,3666,3742,3733,3651,3622,3657,3697,3711,3672,3752,3660,3566,3688,3632,3669,3663,3701,3634,3733,3690,3568,3617,3726,3694,3734,3629,3752,3615,3661,3710,3670,3663,3698,3677,3668,3627,3646,3703,3753,3719,3606,3604,3622,3583,3639,3726,3745,3636,3581,3715,3782,3642,3712,3742,3618,3687,3687,3565,3783,3720,3741,3589,3663,3578,3663,3688,3648,3706,3670,3724,3580,3641,3732,3712,3671,3598,3672,3728,3627,3659,3668,3644,3691,3708,3729,3551,3657,3694,3617,3761,3608,3626,3641,3606,3629,3652,3666,3651,3777,3563,3675,3653,3609,3687,3654,3586,3662,3558,3541,3668,3732,3787,3673,3675,3626,3638,3585,3635,3691,3658,3767,3585,3651,3607,3708,3608,3694,3659,3671,3607,3664,3718,3652,3696,3594,3584,3639,3687,3675,3615,3692,3686,3583,3709,3675,3664,3642,3744,3680,3645,3636,3652,3612,3744,3604,3720,3688,3695,3684,3745,3767,3746,3699,3704,3726,3726,3738,3604,3632,3708,3610,3701,3627,3688,3746,3682,3762,3737,3699,3577,3732,3642,3606,3680,3609,3692,3642,3713,3675,3714,3688,3695,3596,3734,3642,3705,3650,3715,3749,3577,3717,3563,3667,3620,3763,3544,3566,3675,3693,3630,3617,3635,3576,3694,3653,3646,3616,3721,3744,3687,3629,3636,3677,3709,3672,3687,3517,3769,3620,3684,3710,3702,3626,3687,3584,3729,3713,3589,3570,3745,3609,3586,3731,3672,3778,3668,3665,3697,3603,3749,3694,3531,3758,3677,3666,3637,3660,3628,3655,3619,3638,3713,3616,3741,3600,3617,3758,3456,3561,3581,3709,3658,3593,3757,3832,3789,3637,3635,3609,3683,3590,3683,3694,3651,3692,3650,3638,3591,3570,3815,3706,3560,3658,3665,3771,3569,3680,3603,3608,3673,3671,3769,3652,3618,3642,3709,3637,3719,3726,3693,3738,3564,3676,3618,3721,3620,3680,3630,3706,3559,3618,3600,3636,3644,3687,3623,3640,3683,3677,3713,3608,3532,3755,3762,3629,3749,3584,3728,3675,3683,3641,3598,3697,3656,3786,3642,3865,3636,3610,3618,3652,3647,3676,3679,3705,3636,3710,3624,3592,3694,3593,3710,3596,3671,3680,3715,3693,3606,3693,3717,3701,3696,3539,3752,3774,3604,3606,3672,3695,3668,3710,3777,3698,3800,3662,3665,3670,3708,3666,3766,3738,3684,3635,3727,3693,3631,3677,3698,3675,3646,3664,3647,3646,3571,3678,3645,3649,3761,3603,3593,3690,3461,3699,3725,3640,3795,3624,3692,3714,3620,3719,3513,3728,3714,3624,3705,3744,3526,3694,3635,3590,3688,3659,3673,3686,3512,3629,3681,3570,3604,3688,3649,3551,3598,3665,3608,3625,3642,3662,3591,3677,3669,3667,3690,3736,3648,3630,3722,3632,3635,3559,3707,3677,3651,3615,3665,3598,3691,3761,3640,3693,3711,3625,3620,3702,3490,3486,3632,3643,3662,3707,3714,3639,3664,3737,3615,3692,3792,3671,3582,3675,3550,3672,3653,3553,3624,3700,3711,3780,3605,3708,3735,3705,3673,3667,3690,3614,3610,3637,3603,3619,3645,3683,3659,3684,3738,3579,3724,3637,3698,3674,3579,3677,3690,3733,3641,3559,3680,3717,3652,3669,3568,3663,3729,3690,3677,3606,3601,3627,3710,3602,3601,3568,3720,3668,3635,3584,3610,3633,3648,3605,3566,3728,3498,3714,3650,3644,3634,3770,3696,3676,3624,3572,3795,3713,3683,3706,3500,3782,3723,3633,3681,3721,3644,3702,3682,3660,3630,3635,3672,3632,3648,3518,3675,3638,3661,3709,3670,3590,3740,3597,3686,3677,3648,3663,3589,3547,3651,3491,3774,3650,3733,3687,3648,3700,3709,3643,3769,3697,3611,3608,3698,3670,3705,3709,3674,3609,3625,3702,3632,3585,3570,3667,3632,3607,3592,3777,3607,3775,3712,3615,3638,3610,3633,3647,3592,3663,3616,3653,3734,3632,3626,3703,3652,3739,3658,3699,3697,3618,3630,3767,3712,3552,3713,3700,3683,3584,3543,3644,3671,3712,3659,3580,3709,3632,3562,3621,3669,3762,3733,3592,3724,3707,3694,3580,3632,3650,3735,3683,3588,3631,3617,3695,3667,3556,3692,3599,3633,3658,3729,3595,3571,3665,3611,3783,3750,3729,3612,3581,3659,3681,3583,3674,3678,3646,3646,3671,3649,3691,3702,3634,3687,3599,3656,3692,3688,3708,3771,3547,3601,3798,3640,3622,3538,3697,3624,3566,3641,3724,3699,3723,3626,3573,3650,3668,3725,3645,3622,3664,3628,3669,3682,3636,3706,3649,3586,3701,3728,3574,3730,3643,3669,3727,3744,3641,3582,3618,3624,3676,3719,3661,3641,3667,3642,3724,3692,3596,3723,3760,3699,3587,3642,3672,3665,3690,3751,3675,3593,3618,3691,3680,3679,3599,3647,3614,3629,3725,3625,3725,3643,3631,3657,3677,3506,3598,3619,3732,3622,3654,3605,3796,3605,3724,3599,3524,3540,3722,3565,3718,3662,3704,3713,3722,3665,3646,3729,3674,3659,3831,3592,3532,3812,3680,3635,3575,3632,3696,3680,3609,3626,3756,3708,3705,3688,3744,3659,3661,3581,3653,3711,3764,3683,3633,3671,3628,3691,3618,3668,3632,3712,3542,3661,3620,3572,3689,3628,3690,3717,3618,3704,3741,3681,3694,3628,3594,3733,3660,3728,3638,3705,3635,3741,3617,3739,3745,3658,3674,3672,3657,3643,3646,3564,3693,3524,3592,3629,3726,3633,3728,3703,3732,3724,3722,3695,3744,3640,3780,3709,3675,3773,3653,3557,3698,3638,3628,3645,3703,3637,3722,3725,3581,3761,3568,3653,3618,3625,3646,3580,3764,3691,3647,3665,3609,3774,3610,3709,3653,3635,3712,3737,3686,3710,3722,3692,3635,3754,3695,3630,3621,3651,3659,3699,3639,3634,3640,3659,3578,3721,3669,3604,3626,3685,3751,3819,3627,3698,3698,3607,3641,3576,3550,3581,3578,3704,3690,3589,3647,3626,3529,3627,3759,3543,3729,3658,3665,3667,3567,3656,3731,3634,3610,3649,3645,3674,3829,3666,3672,3713,3642,3657,3593,3685,3671,3546,3633,3656,3650,3519,3808,3723,3729,3637,3755,3626,3726,3713,3614,3722,3736,3610,3539,3657,3682,3648,3686,3579,3577,3633,3694,3601,3653,3639,3685,3654,3665,3740,3681,3781,3745,3479,3723,3634,3728,3602,3662,3775,3658,3631,3678,3625,3634,3625,3664,3623,3639,3690,3711,3699,3555,3610,3558,3641,3674,3658,3699,3725,3744,3597,3619,3697,3560,3650,3789,3590,3688,3590,3544,3622,3715,3698,3654,3676,3561,3572,3636,3591,3663,3690,3590,3635,3626,3640,3573,3762,3659,3732,3653,3680,3664,3662,3599,3771,3697,3623,3727,3689,3737,3750,3669,3612,3768,3674,3691,3722,3689,3640,3677,3612,3678,3588,3756,3647,3584,3641,3693,3636,3858,3763,3676,3760,3832,3621,3625,3646,3622,3768,3618,3686,3643,3700,3849,3630,3682,3653,3656,3637,3733,3591,3637,3684,3647,3565,3698,3776,3739,3651,3621,3614,3635,3776,3765,3701,3650,3656,3663,3474,3610,3668,3683,3604,3759,3654,3702,3690,3654,3735,3777,3662,3606,3596,3602,3682,3737,3731,3777,3645,3745,3670,3675,3749,3726,3760,3564,3705,3683,3756,3705,3581,3662,3568,3618,3694,3667,3696,3631,3653,3649,3757,3635,3566,3541,3669,3700,3598,3692,3704,3642,3758,3626,3588,3634,3624,3664,3599,3688,3570,3663,3710,3660,3699,3708,3661,3733,3637,3612,3730,3667,3689,3651,3566,3637,3736,3661,3546,3620,3627,3623,3604,3661,3701,3635,3747,3729,3779,3606,3626,3533,3704,3600,3664,3748,3698,3687,3712,3633,3731,3678,3657,3689,3609,3679,3610,3704,3712,3702,3605,3593,3562,3564,3654,3616,3632,3676,3618,3557,3673,3709,3609,3631,3649,3637,3664,3569,3654,3611,3600,3608,3717,3767,3684,3671,3602,3698,3722,3630,3713,3595,3681,3651,3602,3727,3627,3607,3518,3658,3656,3643,3607,3548,3642,3678,3600,3709,3492,3571,3568,3721,3636,3717,3583,3600,3681,3709,3704,3618,3638,3799,3593,3749,3601,3698,3689,3736,3636,3636,3607,3603,3611,3722,3721,3592,3643,3676,3600,3661,3708,3623,3722,3645,3684,3653,3640,3585,3631,3739,3650,3698,3594,3683,3712,3682,3722,3663,3716,3692,3577,3716,3593,3800,3795,3683,3620,3684,3602,3587,3612,3619,3754,3620,3660,3667,3664,3723,3700,3632,3566,3638,3550,3643,3635,3728,3608,3628,3756,3722,3644,3673,3761,3727,3662,3719,3697,3641,3616,3674,3720,3513,3573,3684,3596,3695,3673,3526,3716,3615,3597,3692,3754,3623,3658,3619,3653,3606,3640,3642,3697,3632,3732,3586,3625,3663,3720,3641,3684,3653,3630,3634,3695,3627,3593,3648,3763,3775,3639,3613,3779,3738,3665,3708,3659,3484,3805,3730,3639,3743,3670,3723,3627,3764,3691,3617,3679,3666,3752,3679,3610,3588,3673,3595,3711,3676,3754,3599,3607,3750,3656,3643,3712,3783,3671,3588,3676,3797,3578,3600,3678,3652,3574,3671,3560,3598,3631,3662,3575,3606,3650,3599,3698,3691,3580,3654,3762,3764,3730,3616,3597,3676,3573,3729,3717,3679,3654,3667,3592,3646,3642,3798,3659,3625,3682,3719,3670,3613,3631,3612,3695,3625,3671,3687,3678,3577,3697,3719,3742,3739,3645,3596,3778,3593,3793,3601,3703,3676,3620,3749,3706,3680,3568,3700,3644,3627,3624,3619,3626,3672,3654,3808,3646,3694,3632,3834,3621,3679,3742,3756,3640,3619,3643,3726,3671,3610,3767,3549,3617,3764,3728,3622,3563,3710,3530,3676,3715,3579,3682,3546,3748,3685,3622,3663,3655,3662,3559,3692,3673,3595,3683,3668,3720,3773,3638,3639,3722,3655,3668,3701,3615,3677,3549,3732,3655,3611,3716,3731,3637,3597,3658,3694,3686,3716,3670,3662,3753,3724,3645,3786,3638,3754,3662,3627,3643,3683,3624,3758,3685,3606,3789,3664,3666,3657,3664,3585,3649,3674,3659,3707,3664,3687,3749,3708,3664,3649,3616,3581,3680,3736,3595,3606,3620,3635,3670,3629,3667,3581,3712,3720,3657]}]},"null_count":0,"tot_col_size":202473810,"last_update_version":401695327978782722},"c_comment":{"histogram":{"ndv":7436288,"buckets":[{"count":30000,"lower_bound":"IGFib3V0IHRoZSBibGl0aGVseSBmaW5hbCBwaW50byBiZWE=","upper_bound":"IGFjY29yZGluZyB0byB0aGUgc2x5bHkgZXZlbiByZXF1ZXN0cy4gc3BlY2lhbCB0aGVvZG9saXRlcyBhcmUgc2x5bHkgYWJvdXQgdGhlIGNhcmVmdWxseSA=","repeats":1},{"count":60000,"lower_bound":"IGFjY29yZGluZyB0byB0aGUgc2x5bHkgaXJvbmljIGRlcG9zaXRzLiBibGl0aGVseSBwZW5kaW5nIHBhY2thZ2VzIHNvbHZlIHNseWx5IHM=","upper_bound":"IGFjY291bnRzOyBmaW5hbCBwYWNrYWdlcyBuYWcgZmx1ZmZpbHkuIGV2ZW4gaW5zdHJ1Y3Rpb25zIHdha2UgY2FyZWZ1bGx5IGFmdGVyIHRoZSBxdWlja2w=","repeats":1},{"count":90000,"lower_bound":"IGFjY291bnRzOyBmdXJpb3VzbHkgaXJvbmljIGdpZnRzIHNsZWVwIGNhcmVmdWxseS4gZmluYWwsIGlyb25pYyB0aGVvZG9saXRlcyBjYWpvbGUgcXVpY2tseSByZWd1bGFyIHRoZW8=","upper_bound":"IGFsb25nIHRoZSBjYXJlZnVsbHkgZXZlbiBwaW50byBiZWFucy4gYm9sZCB0aGVvZG9saXRlcyB3YWtlIGNhcmVmdWxseS4gcXVpY2tseSBzcGVjaWFsIHBhYw==","repeats":1},{"count":120000,"lower_bound":"IGFsb25nIHRoZSBjYXJlZnVsbHkgZXhwcmVzcyByZXF1ZXN0cy4gY2FyZWY=","upper_bound":"IGFyZSBmdXJpb3VzbHkgcGFja2FnZXMuIHF1aWNrbHkgZmluYWwgYWM=","repeats":1},{"count":150000,"lower_bound":"IGFyZSBxdWlja2x5IGFib3V0IHRoZSByZWd1bGFyIGluc3RydWN0aW9ucw==","upper_bound":"IGJlYW5zLiBleHByZXNzIGRlcHRocyBhcmUgcXVpY2tseSBibGl0aGVseSBldmVuIHBhY2thZ2VzLiBxdWljaw==","repeats":1},{"count":180000,"lower_bound":"IGJlYW5zLiByZWd1bGFyIHBpbnRvIGJlYW5zIGFsb25nIHRoZSB1bnVzdWFsLCBzcGVjaWFsIGlkZWFzIHNlcnZlIGFsb25nIHRoZSBmbHVmZmk=","upper_bound":"IGJsaXRoZWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIHVzZSBzbHlseSBzaGVhdmVzLiBzaWxlbnQgaW5zdHJ1Y3Rpb25zIGFjY28=","repeats":1},{"count":210000,"lower_bound":"IGJsaXRoZWx5IHJlZ3VsYXIgcGludG8gYmVhbnMuIGNhcmVmdWxseSBwZW5kaW5nIHNvbWFzIHdha2UgYW1vbmcgdGhlIGZpbmFsLCBxdWlldCBleGN1c2VzLiB1bnVzdWFsLCBpcm9uaWMg","upper_bound":"IGJyYXZlIGRlcG9zaXRzIHNsZWVwIGJvbGRseSBhY3Jvc3MgdGhlIGZ1cmlvdXNseSBzaWxlbnQgaW5zdHJ1Y3Rpb25zLiBhY2NvdW50cyB1bndpbmQuIGZpbmFsLCBldmVuIGRlcGVuZGVuY2llcw==","repeats":1},{"count":240000,"lower_bound":"IGJ1c2lseSBibGl0aGVseSBldmVuIGRvbHBoaW5zLiA=","upper_bound":"IGNhcmVmdWxseSBkb2dnZWRseSBzcGVjaWFsIHRoZW9kb2xpdGVzLiBzcGVjaWFsIGFjY291bnRzIGFyZSBjYXI=","repeats":1},{"count":270000,"lower_bound":"IGNhcmVmdWxseSBldmVuIGFjY291bnRzIG5hZyBmbHVmZmlseS4gcmVndWxhciw=","upper_bound":"IGNhcmVmdWxseS4gZXhwcmVzcyBleGN1c2VzIGg=","repeats":1},{"count":300000,"lower_bound":"IGNhcmVmdWxseS4gcXVpY2tseSBzaWxlbnQgcGludG8gYmVhbg==","upper_bound":"IGRlcG9zaXRzLiBkZXBvc2l0cyBjYWpvbGUgY2FyZWZ1bGx5LiB0aGVvZG9saXRlcyBsb3NlIGZsdWZmaWw=","repeats":1},{"count":330000,"lower_bound":"IGRlcG9zaXRzLiBldmVuIGJyYWlkcyBoYWdnbGUgc2x5bHkuIGV2ZW4sIGlyb25pYyBkZXBvc2l0cyBjYWpvbGUg","upper_bound":"IGVudGljaW5nbHkgZXZlbiBhY2NvdW50cy4gYmxpdGhlbHkgaXJvbmljIGRlcG9zaXRzIHg=","repeats":1},{"count":360000,"lower_bound":"IGVudGljaW5nbHkgdW51c3VhbCB0aGVvZG9saXRlcw==","upper_bound":"IGV2ZW4gcmVxdWVzdHMgYmV5b25kIHRoZSBmb3hlcyB3YWtlIGFmdGVyIHRoZSByZXF1ZXN0cy4gcmVndWxhciByZXF1ZXN0cyBzb2x2ZS4gZW50aWNpbmdseQ==","repeats":1},{"count":390000,"lower_bound":"IGV2ZW4gcmVxdWVzdHMuIGlyb25pYywgcmVndWxhciBwaW50byBiZWFucyBib29zdCBxdWlja2x5IHVuZGVyIHRoZSBmdXJpb3VzbHkgZXhwcmVzcyBkZXBvc2l0cy4gZnVyaW91c2x5IHJlZ3U=","upper_bound":"IGV4cHJlc3Mgd2FydGhvZ3MuIGJsaXRoZWx5IHF1aWV0IGVzY2FwYWRlcyBjYWpvbGUgcXVpY2tseSB1bnVzdWFsIGFjY291bnRzLiBkZXBvc2l0cyB1cw==","repeats":1},{"count":420000,"lower_bound":"IGV4cHJlc3MsIGlyb25pYyB3YXJ0aG9ncy4gZmluYWwgZm94ZXMgYWZmaXggcGludG8g","upper_bound":"IGZpbmFsLCBpcm9uaWMgYWNjb3VudHMgY2Fqb2xlLiBjYXJlZnVsbHkgZXZlbiBkZXBvcw==","repeats":1},{"count":450000,"lower_bound":"IGZpbmFsLCByZWd1bGFyIGRlcG9zaXRzLiBpcm9uaWMgYWNjb3VudHMgZGV0ZWN0IHNseWx5LiBmdXJpbw==","upper_bound":"IGZveGVzIGJvb3N0IHF1aWNrbHkuIGRlcG9zaXRzIHNsZWVwLiBwYWNrYWdlcyBhcmUgZnVyaW91c2x5IHBlcm1hbmVudGx5IGV2ZW4gYWNjb3VudHMuIGJsaXRoZWx5IGly","repeats":1},{"count":480000,"lower_bound":"IGZveGVzIGNham9sZSBhY2NvcmRpbmcgdG8gdGhlIGZsdWZmaWx5IHF1aWV0IGlkZWFzLiBjYXJlZnVsbHkgZg==","upper_bound":"IGZ1cmlvdXNseSBmaW5hbCByZXF1ZXN0cy4gYmxpdGhlbHkgZmluYQ==","repeats":1},{"count":510000,"lower_bound":"IGZ1cmlvdXNseSBmaW5hbCB0aGVvZG9saXRlcyB3YWtlIGFjcm9zcyB0aGUgc2xvdyBhY2NvdW50czogYmxpdGhlbHkgZXZlbiBhY2M=","upper_bound":"IGZ1cmlvdXNseS4gcXVpY2tseSBpcm9uaWMgYWNjb3VudHMgc2VydmUgcGludG8gYmVhbnMuIHNseWx5IHJlZ3VsYXIgZm94ZXMgZG8gYXJlIGlyb25pYyBwbGE=","repeats":1},{"count":540000,"lower_bound":"IGZ1cmlvdXNseS4gcXVpY2tseSByZWd1bGFyIHBhY2thZ2VzIHNsZWVwIGFjcm9zcyB0aGUgYWNjb3VudHMuIHF1aWNrbHkgc3BlY2lhbA==","upper_bound":"IGlkZWFzLiByZXF1ZXN0cyBuYWcgZnVyaW91c2x5IGFsb25nIHRoZSBibGl0aGVseSBzcGVjaWFsIHBhY2thZ2VzLiBmbHVmZmlseSByZWd1bGFyIGRlcG9zaXRzIGFmdGVyIHRoZQ==","repeats":1},{"count":570000,"lower_bound":"IGlkZWFzLiBzbHlseSBpcm9uaWMgaWRlYXMgYXJlLiBmdXJpb3VzbHkgcmVndWxhciBhY2NvdW50cyBzZXJ2ZSBmdXJpb3VzbHkgc2x5bHkgZXZlbiA=","upper_bound":"IGlyb25pYyBkZXBlbmRlbmNpZXMhIGFzeW1wdG90ZXMgdXNlIHRoaW5seSB3aGl0aG91dCB0aGUgZXZlbg==","repeats":1},{"count":600000,"lower_bound":"IGlyb25pYyBkZXBvc2l0cyBhYm92ZSB0aGUgYm9sZCBhc3ltcA==","upper_bound":"IGlyb25pYyB3YXRlcnMuIGJsaXRoZWx5IHVudXN1YWwgZGVwb3NpdHMgYWNjb3JkaW5nIHRvIHRoZSBm","repeats":1},{"count":630000,"lower_bound":"IGlyb25pYywgZXZlbiBkZXBvc2l0cyBzbGVlcCBzbHlseSBib2xkIGV4Y3VzZXMhIGNhcmVmdWxseSBxdWlldCByZXF1ZXN0cyBib29zdC4gY2FyZWZ1bGx5IHVudXN1YWwgZGVwbw==","upper_bound":"IHBhY2thZ2VzIGRvdWJ0IGZ1cmlvdXNseSBhZ2FpbnN0IHRoZSBzbHlseSBpcm9uaWMgcGFja2FnZXMuIGNhcg==","repeats":1},{"count":660000,"lower_bound":"IHBhY2thZ2VzIGhhZ2dsZSBibGl0aGVseSBwZW5kaW5nLCBwZW5kaW5nIHBpbnRvIGJlYW5zLiBpcm9uaWMgYWNjb3VudHMgYm9vc3QuIHNseWx5IHJlZ3VsYXIgYWNjb3VudHMgYWZ0ZXIgdA==","upper_bound":"IHBlbmRpbmcgYWNjb3VudHMgdXNlIHF1aWNrbHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiBmaW5hbCByZXF1ZXN0cyB1c2UgcGVuZGluZyBmb3hlcy4gZmluYWwsIHJl","repeats":1},{"count":690000,"lower_bound":"IHBlbmRpbmcgYWNjb3VudHMuIHNseWx5IGV2ZW4gd2FydGhvZ3MgY2Fqb2xlIGJsaXRoZWx5IGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGlyb25pYyBwaW50byA=","upper_bound":"IHBpbnRvIGJlYW5zIG5hZyBzb21ldGltZXMgdW51c3VhbCBhY2NvdW50","repeats":1},{"count":720000,"lower_bound":"IHBpbnRvIGJlYW5zIG5hZy4gZnVyaW91c2x5IHNwZWNpYWwgcGFja2FnZXM=","upper_bound":"IHF1aWNrbHkgcXVpY2sgZGVwb3NpdHMuIHNseWx5IHNwZWNpYWwgYXN5bXB0b3RlcyBhZ2FpbnN0IHRoZSBpcm9uaWMgYWNjb3VudHMgaGFnZ2xlIGJsaXRoZWx5IHNwZWNpYWw=","repeats":1},{"count":750000,"lower_bound":"IHF1aWNrbHkgcXVpZXQgYWNjb3VudHMuIHVudXN1YWwsIGlyb25pYyBkZXBvc2l0cyBhY3Jvc3MgdGhlIHBlbmRpbmcgdGhlb2RvbGl0ZXMgY2Fqb2xlIGZ1cmlvdXNseSBh","upper_bound":"IHJlZ3VsYXIgZnJldHMgYm9vc3QgZmx1ZmZpbHkgYWJvdmUgdGhlIGluc3RydWN0aW9ucy4gcGVuZGluZyBwYWNrYWdlcyB3YWtlIGJsaXRoZWx5IGJleW9uZCB0aGUg","repeats":1},{"count":780000,"lower_bound":"IHJlZ3VsYXIgZnJldHMgd2FrZSBhYm91dCB0aGUgZnVyaW91c2x5IHNwZWNpYWwgcA==","upper_bound":"IHJlcXVlc3RzIHdpdGhpbiB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgcGFja2FnZXMgY2Fqb2xlIGZ1cmlvdXNseSBhbG9uZ3NpZGUgb2YgdGhlIGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaQ==","repeats":1},{"count":810000,"lower_bound":"IHJlcXVlc3RzLiBhbHdheXMgYm9sZCBwaW50byBiZWFucyBraW5kbGUuIHJlcXVlc3RzIGFsb25n","upper_bound":"IHNsZWVwIGFsb25nIHRoZSBmaW5hbCBicmFpZHM/IHJlcXVlc3RzIGhhZ2dsZSBjYXJlZnVsbHkgYnVzaWx5IGZpbmFsIGFjY291bnRzLiBleHByZXNzLCBldmVuIGluc3RydWN0aW8=","repeats":1},{"count":840000,"lower_bound":"IHNsZWVwIGFsb25nIHRoZSBmdXJpb3VzbHkgc3BlY2lhbCBzYXV0ZXJuZXMuIHBlcm1hbmVudGx5IHJlZ3VsYXIgaWRlYXMgYXJlLiBjYXJlZnVsbHkgaXJvbmljIGVzY2FwYWQ=","upper_bound":"IHNseWx5IGFnYWluc3QgdGhlIHNpbGVudCwgcmVndWxhciBkZXBlbmRlbg==","repeats":1},{"count":870000,"lower_bound":"IHNseWx5IGFsb25nIHRoZSBmdXJpb3VzbHkgcmVndWxhciByZXF1ZXN0cy4gY2FyZWZ1bGx5IHJlZ3VsYXIgZGVw","upper_bound":"IHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgYWNyb3NzIHRoZSBjYXJlZnVsbHkgcmVndWxh","repeats":1},{"count":900000,"lower_bound":"IHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIHNseWx5IGFjcm9zcyB0aGUgcXVpY2tseSBwZW5kaW5nIHJlcXVlc3RzLiByZWd1bGFyLCBwZW5kaW5nIGFzeW1wdG90ZXMgYXI=","upper_bound":"IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIGludGVncmF0ZSBmbHVmZmlseSBjYXJlZnVsbHkgdW51c3VhbCBhY2NvdW50cy4gdW51c3VhbCBhc3ltcHRvdGVzIGFib3ZlIHRoZSBzbHlseSBzcGVjaWFs","repeats":1},{"count":930000,"lower_bound":"IHNwZWNpYWwgcGxhdGVsZXRzIGNham9sZSBjYXJlZnVsbHkuIGNhcmVm","upper_bound":"IHRoZSBmaW5hbCBkZXBlbmRlbmNpZXMgc2xlZXAgZnVyaW91c2x5IGFnYWluc3QgdGhlIGJsaXRoZWx5IHJlZ3VsYQ==","repeats":1},{"count":960000,"lower_bound":"IHRoZSBmaW5hbCBkdWdvdXRzLiBib2xkIGRlcG9zaXRzIHNsZWVwIGJsaXRoZWx5LiByZXF1ZXN0cyBjYWpvbGUgYmxpdGhlbHkgYWxvbmcgdGhlIHF1aWNrbHkgZXhwcmVzcyBkZXA=","upper_bound":"IHRoZSByZXF1ZXN0cz8gZXZlbiwgcGVuZGluZyBpZGVhcyBwb2FjaCBhY2Nvcg==","repeats":1},{"count":990000,"lower_bound":"IHRoZSBzbHlseSBib2xkIGRlcG9zaXRzOiBzbG93IHJlcXVlc3RzIGRvdWJ0IHF1aWNrbHkgZXhwcmVzcywgaXJvbmljIHJlcXVlc3RzLiBmdXJpb3VzbHkgcmVndWxhciBkZXBv","upper_bound":"IHVudXN1YWwgVGlyZXNpYXMgaGFnZ2xlIGRhcmluZ2x5IGF0b3AgdGhlIHJlZ3VsYXIgYXN5bXB0b3Rlcy4=","repeats":1},{"count":1020000,"lower_bound":"IHVudXN1YWwgYWNjb3VudHMgY2Fqb2xlIGNhcmVmdWxseSBhY3Jvc3Mg","upper_bound":"IHdha2UgYWJvdmUgdGhlIHJlZ3VsYXIgZGVwZW5kZW5jaWVzLiBmbHVmZmlseSBpcm9uaQ==","repeats":1},{"count":1050000,"lower_bound":"IHdha2UgYWJvdmUgdGhlIHJlZ3VsYXIgZm94ZXMuIA==","upper_bound":"LCBmaW5hbCBpbnN0cnVjdGlvbnMgd2FrZSBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpYWwgZGVwb3NpdHM=","repeats":1},{"count":1080000,"lower_bound":"LCBmaW5hbCBwaW50byBiZWFucyBhZmZpeC4gc3BlY2lhbCwgZmluYWwgcGFja2FnZXMg","upper_bound":"LiBibGl0aGVseSBzcGVjaWFsIGFjY291bnRzIGNham9sZS4gYmxpdGhlbHkgZmluYWwgaWRlYXMgZG91YnQuIGV2ZW4sIHJlZ3VsYXIgcGFja2FnZXMgaGFnZ2xlIGJsaXRoZWx5IHBlbmRpbmcgcGE=","repeats":1},{"count":1110000,"lower_bound":"LiBibGl0aGVseSBzcGVjaWFsIGluc3RydWN0aW9ucyA=","upper_bound":"LiBmaW5hbCBmb3hlcyBhdCB0aGUgcmVndWxhciwgcXVpY2sgaWRlYXMgc2xlZXAgYWNyb3NzIHRoZSBwZW5kaW5nLCB1bnVzdWFsIHJlcXVlc3RzLiBibGl0aGVseSBwZW5kaW5nIA==","repeats":1},{"count":1140000,"lower_bound":"LiBmaW5hbCBpZGVhcyBkb3VidCBzaWxlbnRseSBhbG9uZ3NpZGUgb2YgdGhlIGJsaXRoZWx5IHVudXN1YWwgZGVwZW5kZW5jaWVzLg==","upper_bound":"LiBwYWNrYWdlcyBhZ2FpbnN0IHRoZSBxdWlja2x5IHJlZ3VsYXIgZGVwb3NpdHMgaGFuZyBzbHlseSBmaW5hbCwgdW51c3VhbCBwYWNrYWdlcy4gdW51c3VhbCBwYWNrYWdlcyBpbnRlZ3I=","repeats":1},{"count":1170000,"lower_bound":"LiBwYWNrYWdlcyBhbG9uZyB0aGUgZnVyaW91c2x5IGlyb25pYyBkZXBlbg==","upper_bound":"LiBydXRobGVzcywgdW51c3VhbCBhY2NvdW50cyBzaG91bGQgY2Fqb2xlIGFjY291bnRzLiBjYXJlZnVsbHkgcGVuZGluZyBpZGVhcyBhbG9uZyB0aGUgbmV2ZXIgcmVndWw=","repeats":1},{"count":1200000,"lower_bound":"LiBzaWxlbnQgZGVwb3NpdHMgYmVuZWF0aCB0aGUgZXZlbiBhY2NvdW50cyBkZXRlY3QgY2FyZWZ1bGx5IGFjcm9zcyB0aGUgcGFja2FnZXMuIGNhcmVmdWxseSBpcm9uaWMgYWNjb3VudHMgYm8=","upper_bound":"LiB1bnVzdWFsLCBldmVuIHBpbnRvIGJlYW5zIGFmdGVyIHRoZSByZWd1bGFyIGFjY291bnRzIGFmZml4IHNseWx5IGFsb25nIHRoZSBib2xkIHJlcXVlc3RzLiBhc3ltcHQ=","repeats":1},{"count":1230000,"lower_bound":"OiBibGl0aGVseSBxdWljayBwYWNrYWdlcyBzaG91bGQgaGF2ZSB0byBsb3NlIGNhcmVmdWxseSBjYXJlZnVsbHkgcGVuZGluZyB0aGVvZG9saXRlcy4gaXJvbmk=","upper_bound":"YWNjb3VudHMgYm9vc3QuIGJsaXRoZWx5IGZpbmFsIGRlcG9zaXRzIGFmZml4IGFib3ZlIHRoZSBwaW50byBiZWFucy4gcGludG8gYmVhbnMgc2xlZXAgc2x5bHkuIGZpbmFsIGRlcG9zaXQ=","repeats":1},{"count":1260000,"lower_bound":"YWNjb3VudHMgY2Fqb2xlIGJsaXRoZWx5IHJlZ3VsYXIgc2hlYXZlcy4gZmx1ZmZpbHkgaXJvbmljIFRpcg==","upper_bound":"YWNrYWdlcyBhY3Jvc3MgdGhlIGZpbmFsIGFjY291bnRzIHdha2UgYm9sZGx5IGFtb25nIHRoZSBleHByZXNz","repeats":1},{"count":1290000,"lower_bound":"YWNrYWdlcyBhZ2FpbnN0IHRoZSBibGl0aGVseSBib2xkIGlu","upper_bound":"YWNrYWdlcy4gaXJvbmljIHBhY2thZ2VzIGRldGVjdCBzbHlseSBhZ2FpbnN0IHRoZSBlbnRpY2luZw==","repeats":1},{"count":1320000,"lower_bound":"YWNrYWdlcy4gaXJvbmljLCBwZW5kaW5nIHJlcXVlc3RzIHVzZS4gY2FyZWZ1bGx5IGV2ZW4gZXhjdXNlcyBjYWpvbGUuIHF1aWNrbHkgZmk=","upper_bound":"YWcuIHNseWx5IGJvbGQgcmVxdWVzdHMgaW50ZWdyYXRlIGZ1cmlvdXNseS4gc2x5bHkgZmluYWwgYWNjb3VudHMgaW50ZWdyYXRlIGZsdWZmaWx5IGFjcm9zcyB0aGUgc3RlYWx0aHkgaW5zdHJ1Y3Rpbw==","repeats":1},{"count":1350000,"lower_bound":"YWdhaW5zdCB0aGUgYWNjb3VudHMgbWFpbnRhaW4gc2x5bHkgYWdhaW5zdCB0aGUgYm9sZCwgcmVndWxhciBhc3ltcHRvdGVzLiBwbGF0ZWxldHMgYm9vc3QgZW50aWNpbmdseS4g","upper_bound":"YWdlcyB1c2Ugc2x5bHkgcmVndWxhciBpbnN0cnVjdGlvbnMuIHM=","repeats":1},{"count":1380000,"lower_bound":"YWdlcyB3YWtlIGFjcm9zcyB0aGUgc2x5bHkgcmVndWxhciBhc3ltcHRvdGVzLg==","upper_bound":"YWlucyBzbGVlcCBibGl0aGVseSBhY3Jvc3MgdGhlIGJsaXRoZWx5IGV4cHJlc3MgcGFja2FnZXMuIGJsaXRoZWx5IHNwZWNpYWwgcGludG8gYmVhbnMgYWxvbg==","repeats":1},{"count":1410000,"lower_bound":"YWluc3QgdGhlIGFjY291bnRzLiBibGl0aGVseSByZWd1bGFyIGZveGVzIHNsZWVwIGVudGljaW5nbHkgaXJvbmljIGluc3RydWN0aW9ucy4gcmVndWxhciBhY2NvdW50cyBzbGVlcCBmdXJp","upper_bound":"YWtlIGZ1cmlvdXNseS4gZnVyaW91c2x5IGV2ZW4gZGVwZW5kZW5jaWVzIGFyZS4gcXVpY2tseSBldmVuIHBsYQ==","repeats":1},{"count":1440000,"lower_bound":"YWtlIHBhY2thZ2VzLiBmdXJpb3VzbHkgZXZlbiBkZXBvc2k=","upper_bound":"YWwgaWRlYXMgY2Fqb2xlIGNhcmVmdWxseSBhdCB0aGUgcmVxdWVzdHMuIGZsdWZmaWx5IGV2ZW4gcGFja2FnZXMgaGFnZ2xlIGZsdWZmaWx5IA==","repeats":1},{"count":1470000,"lower_bound":"YWwgaWRlYXMuIGV2ZW4gcmVxdWVzdHMgc2xlZXAgcGVybWFuZW50bHkgZXZlbiBwYWNrYWdlcy4gZmluYWwgYWNj","upper_bound":"YWwgc29tYXMgbG9zZSBzaWxlbnQgcGludG8gYmVhbnMuIGNhcmVmdWxseSBzaWxlbnQgcmVxdWVz","repeats":1},{"count":1500000,"lower_bound":"YWwgdGhlb2RvbGl0ZXMgc2xlZXAgYWxvbmcgdGhlIHRoaW4sIGZpbmFsIHBsYXRlbA==","upper_bound":"YWx0aGlseSByZWd1bGFyIGlkZWFzIGFsb25nIHRoZSBjYXJlZnVsbHkgaXJvbmljIHBhY2thZ2VzIHdha2Ugc2x5bHkgYWJvdXQg","repeats":1},{"count":1530000,"lower_bound":"YWx3YXlzIGJvbGQgYWNjb3VudHMgaGFnZ2xlIHNseWx5IGNhcmVmdWxseSByZWd1bGFyIHJlYWxtcy4gc2x5bHkgZXZlbiBpZGVhcyBjYWpvbGUgY2FyZWZ1","upper_bound":"YXIgYWNjb3VudHMuIGV2ZW4gcGludG8gYmVhbnMgbmFnIHF1aWNrbHkgcmVhbG1zLiBpbnN0cnVjdGlvbnMgYm9vc3QuIGNhcmVmdWxseSBpcm9u","repeats":1},{"count":1560000,"lower_bound":"YXIgYWNjb3VudHMuIGZsdWZmaWx5IGV2ZW4gaWRlYXMgd2FrZSBzbHlseS4gZmx1ZmZpbHkgZmluYWwgZm94ZXMgY2E=","upper_bound":"YXIgcmVxdWVzdHMgYXJvdW5kIHRoZSBmdXJpb3VzbHkgcmU=","repeats":1},{"count":1590000,"lower_bound":"YXIgcmVxdWVzdHMgaGFnZ2xlIGJsaXRoZWx5ISBzbHlseSBzcGVjaWFsIGRlcG9zaXRzIGFyZSA=","upper_bound":"YXJlZnVsbHkgYm9sZCByZXF1ZXN0cy4gaW5zdHJ1Y3Rpb25zIGJvb3N0IGJsaXRoZWx5IGFsb25nIHRoZSBjYXJlZnVsbHkgcmVndWxhciBpZGVhcy4gc3BlY2lhbCB0aGU=","repeats":1},{"count":1620000,"lower_bound":"YXJlZnVsbHkgYnVzeSBkZXBvc2l0cyBtYWludGFpbiBjYXJlZnVsbHkgdG93YXJkIHRoZSBibGl0aGVseSBpcm9uaWMgcGFja2FnZXMuIHNseWx5IGk=","upper_bound":"YXJlZnVsbHkgc3BlY2lhbCByZXF1ZXN0cy4gY2FyZWZ1bGx5IGZpbmFsIGZveGVzIHdha2UgYWxvbmcgdA==","repeats":1},{"count":1650000,"lower_bound":"YXJlZnVsbHkgdW51c3VhbCBmb3hlcyBpbnRlZ3JhdGUgYmxpdGhlbHkgaW5zdHJ1Y3Rpb25zLiBwZW5kaW5nIHJlcXVlc3RzIGJvb3N0IGZ1cmlvdXNseSByZWd1bGFyIGFjY28=","upper_bound":"YXMuIGZ1cmlvdXNseSBzcGVjaWFsIGFjY291bnRzIGFyZSBjYXJlZnVsbHkgcXVpY2tseSBwZW5kaW5nIHBpbnRvIGJlYW5zLiBl","repeats":1},{"count":1680000,"lower_bound":"YXMuIHBlbmRpbmcsIGV2ZW4gcGFja2FnZXMgYm9vc3QgYW1vbmcgdGhlIGNhcmVmdWxseSBzcGVjaWFsIGZveGVzLiBwZW5kaW5nIGFjY291bnRzIHNsZWVwLiBjYXJlZnVsbHk=","upper_bound":"YXZlLCBib2xkIHRoZW9kb2xpdGVzIHNsZWVwIGFsb25nIHRoZSBjYXJlZnVsbHkgcGVuZGluZyBpbnN0cnVjdGlvbnMuIGZsdWZmaWx5IHJlZ3VsYXIgZm94ZXMgYWNjb3JkaW5nIHRvIHRoZSA=","repeats":1},{"count":1710000,"lower_bound":"YXZlLCBmaW5hbCBkZXBlbmRlbmNpZXMgdXNlIGNhcmVmdWxseSBjYXJlZnVsbHkgZXZlbiBhY2NvdW50cy4gaXJvbmljIHJlcXVlc3RzIHNsZWVwIGZsdWZmaWw=","upper_bound":"YmxpdGhlbHkgZXZlbiBwYWNrYWdlcyBoYWdnbGUgc2x5bHkg","repeats":1},{"count":1740000,"lower_bound":"YmxpdGhlbHkgZXhwcmVzcyBwbGF0ZWxldHMgc2xlZXAgc2x5bHkgdGhlb2RvbGl0ZXMuIHJlZ3VsYXIgcGFja2FnZXMgYWJvdXQgdGhlIHF1aWNrbHkgcmVndWxhciByZQ==","upper_bound":"Ym9sZCBmb3hlcy4gc2x5bHkgZmluYWwgYWNjb3VudHMgaGFnZ2xlIGNhcmVmdWxseSBhYm91dCB0aGUgcXVpY2tseSBpcm9uaWMgZm94ZXMuIGlkbHkgaQ==","repeats":1},{"count":1770000,"lower_bound":"Ym9sZCBncm91Y2hlczogZmx1ZmZpbHkgZXhwcmVzcyBhY2NvdW50cyBkb3o=","upper_bound":"Ym92ZSB0aGUgZnVyaW91c2x5IGRvZ2dlZCByZWFsbXMgc2xlZXA=","repeats":1},{"count":1800000,"lower_bound":"Ym92ZSB0aGUgaXJvbmljIGluc3RydWN0aW9ucy4gc2x5bHkgcmVndWxhciB3YXJob3JzZXMgc2xlZXAgZnVyaW91c2x5IHNseWx5IA==","upper_bound":"YyByZXF1ZXN0cyBhYm92ZSB0aGUgcmVndWxhciBmb3hlcyB3YWtlIGNhcmVmdWxseSByZWd1bGFyIHA=","repeats":1},{"count":1830000,"lower_bound":"YyByZXF1ZXN0cyB1bndpbmQgY2FyZWZ1bGx5IGZsdWZmaWx5IGV4cHJlc3MgcGFja2FnZXMuIGZpbmFsIGFzeW1wdG90ZXMgd2FrZS4gY2FyZWZ1bGx5IGV2ZW4=","upper_bound":"Y2FyZWZ1bGx5IGJyYXZlIHBsYXRlbGV0cy4gaXJvbmljIGFjY291bnQ=","repeats":1},{"count":1860000,"lower_bound":"Y2FyZWZ1bGx5IGV2ZW4gYWNjb3VudHMuIHVudXN1YWwsIHBlbmRpbmcgaW5zdHJ1Y3Rpb25zIGNham9sZSBjYXJlZnVsbHkgZnVyaW91c2x5IGZpbmE=","upper_bound":"Y2NvcmRpbmcgdG8gdGhlIGZ1cmlvdXNseSBmaW5hbCB3YXJob3JzZXMuIGV4cHJlc3MgcGFja2FnZXMgc2xlZXAgZnVyaW91c2x5IGNhcmVmdWxseSByZWd1bGFyIHJlcXVl","repeats":1},{"count":1890000,"lower_bound":"Y2NvcmRpbmcgdG8gdGhlIGlyb25pYyBleGN1c2VzIGFyZSBmb3hlcy4gcGVuZGluZywgcmVndWxhciBpZGVhcyBhcmUgYWxvbmcgdGhlIGNsb3M=","upper_bound":"Y2NvdW50cy4gc2x5bHkgc3BlY2lhbCBwYWNrYWdlcyBhYm92ZSB0aGUgZmluYWwgYWNjb3VudHMgd291bGQgaGFn","repeats":1},{"count":1920000,"lower_bound":"Y2NvdW50cy4gc2x5bHkgdW51c3VhbCBwbGF0ZWxldHMgYm9vc3QgYWNjb3JkaW5nIHRvIHRoZSBwYWNrYWdlcy4gZXZlbiByZXF1ZXN0cyBhY2M=","upper_bound":"Y2llcyBpbXByZXNzOiBmdXJpb3VzbHkgZmluYWwgaWRlYXMgdXNlIGJsaXRoZWx5LiBibGl0aGVseSBldmVuIHA=","repeats":1},{"count":1950000,"lower_bound":"Y2llcyBzbGVlcCBzaWxlbnQgaWRlYXMuIGJsaXRoZWx5IHVudXN1YWwgdGhlb2Q=","upper_bound":"Y2thZ2VzLiBmdXJpb3VzbHkgZXhwcmVzcyBwYWNrYWdlcyBjYWpvbGUgZnVyaW91c2x5IGFib3V0IHRoZSBzcGVjaWFsIHBhY2thZ2VzLg==","repeats":1},{"count":1980000,"lower_bound":"Y2thZ2VzLiBmdXJpb3VzbHkgc3BlY2lhbCBwYWNrYWdlcyBhcmUgYWZ0ZXIgdGhlIGV2ZW4sIGV2ZW4gcGF0dGVybnMuIGJvbGQgZGVwb3NpdHMgYXJlIHNseWx5IHJlcXVlc3RzLiBm","upper_bound":"Y2tseSBzcGVjaWFsIHBpbnRvIGJlYW5zIGNham9sZSBzbHlseSBmdXJpb3VzbHkgZXZlbiBpZGVhcy4gZmx1ZmZpbHkgcGVuZGluZyByZXF1ZXN0cyBjYWpvbGUgZmw=","repeats":1},{"count":2010000,"lower_bound":"Y2tseSBzcGVjaWFsIHBsYXRlbGV0cyBhcmUgZGFyaW4=","upper_bound":"Y291bnRzIGNham9sZSBxdWlja2x5IHF1aWNrbHkgZXZlbiBwbGF0ZWxldHMuIHNwZWNpYWwsIHNwZWNpYWwgY291cnRzIGNham9s","repeats":1},{"count":2040000,"lower_bound":"Y291bnRzIGNham9sZSBxdWlja2x5LiBwZW5kaW5nIHdhcnRob2dzIGFib3V0IHRoZSBmbHVmZmlseSBmbHVmZnkgYWNjb3VudHMg","upper_bound":"Y3QgZnVyaW91c2x5IGFtb25nIHRoZSBmdXJpb3VzbHkgcmVndWxhciBh","repeats":1},{"count":2070000,"lower_bound":"Y3QgZnVyaW91c2x5LiBibGl0aGVseSBleHByZXNzIGRlcG9zaXRzIG5hZy4gZnVyaW91c2x5IGlyb25pYyByZXF1ZXN0cyBib29zdCBibGl0aGVseS4gZmx1ZmZpbHkgdGhpbg==","upper_bound":"Y3VzZXMuIGZpbmFsLCBldmVuIGFjY291bnRzIGluIHBsYWNlIG9mIHRoZQ==","repeats":1},{"count":2100000,"lower_bound":"Y3VzZXMuIGZsdWZmaWx5IGlyb25pYyBkZXBvc2l0cyBhZ2FpbnN0IHRoZSBpcm9uaWNhbGx5IGV4cHJlc3MgYWNjb3VudHMgYXJlIGFib3ZlIHRoZSBjYXJlZnVsbHkgaXJvbmljIGZyZXQ=","upper_bound":"ZGF6emxlIGNhcmVmdWxseSBncm91Y2hlczogc2x5bHkgc2lsZW50IA==","repeats":1},{"count":2130000,"lower_bound":"ZGF6emxlIGZsdWZmaWx5IGFib3ZlIHRoZSBwZW5kaW5nLCByZWd1bGFyIGNvdXJ0cy4gc2x5bHkgZmluYWwgYXN5bXB0b3Q=","upper_bound":"ZGVuY2llcy4gc2lsZW50IHJlcXVlc3RzIGNham9sZSBhY2NvcmRpbmcgdG8gdGhlIGNhcmVm","repeats":1},{"count":2160000,"lower_bound":"ZGVwZW5kZW5jaWVzIGNham9sZSBmdXJpb3VzbHkgaXJvbg==","upper_bound":"ZGVwb3NpdHMuIHJlZ3VsYXIgcmVxdWVzdHMgd2FrZSBleGN1c2VzLiB0aGVvZG9saXRlcyBoYWdnbGUgYWdhaW5zdCB0aGUgc2lsZW50IGFjY291bnRzLiA=","repeats":1},{"count":2190000,"lower_bound":"ZGVwb3NpdHMuIHNseWx5IGV4cHJlc3MgcGxhdGVsZXRzIGFyZSByZWd1bGFyIGFjY291bnRzLiBhY2NvdW50cyB3YWtlIGZsdWZmaWx5IGJsaXRoZWx5IHBlbmRp","upper_bound":"ZGluZyB0byB0aGUgcmVndWxhciBhY2NvdW50cy4gcGFja2FnZXM=","repeats":1},{"count":2220000,"lower_bound":"ZGluZyB0byB0aGUgc2x5bHkgZmluYWwgYnJhaWRzIHdha2UgcXVpY2tseSBjYXJlZg==","upper_bound":"ZG91YnQgY2FyZWZ1bGx5IGFjcm9zcyB0aGUgaW5zdHJ1Y3Rpb25zLiBjYXJlZnVsbHkgZmluYWwgaWRlYXMgYWxvbmcgdGhlIHF1aWM=","repeats":1},{"count":2250000,"lower_bound":"ZG91YnQgaWRseSBmaW5hbCBkZXBvc2l0cy4gc2x5bHkgZXZlbiBmb3hlcyBhbW9uZyB0aGU=","upper_bound":"ZSBib2xkIHBhY2thZ2VzLiBldmVuIHBpbnRvIGJlYW5zIGFyZS4gc2lsZW50IGRlcG9zaXRzIG1heSBjYWpvbGUgZmw=","repeats":1},{"count":2280000,"lower_bound":"ZSBib2xkLCBldmVuIHBpbnRvIGJlYW5zLiBleHByZXNzIHJlcXVlc3Q=","upper_bound":"ZSBmbHVmZmlseSBjbG9zZWx5IHBlbmRpbmcgY291cnRzLiBkZXBvc2l0cyBib29zdCBmbHU=","repeats":1},{"count":2310000,"lower_bound":"ZSBmbHVmZmlseSBpcm9uaWMgZGVwb3NpdHMgaGFnZ2xlIG5ldmVyIGFyb3VuZCB0aGUgc2lsZW50IHJlcXVl","upper_bound":"ZSBvZiB0aGUgZmluYWwsIGV2ZW4gYWNjb3VudHMgc2xlZXAgc2lsZW50LCBpcm9uaWMgYWNjb3VudHMhIGNhcmVmdWxseSBxdWll","repeats":1},{"count":2340000,"lower_bound":"ZSBvZiB0aGUgZ2lmdHMgbmFnIGNhcmVmdWxseSBhY2NvcmRpbmcgdG8gdGhlIHF1aWNrbHkgZXZlbiBhY2NvdW50cy4gYWNjb3VudHMgc29sdmUgYmxp","upper_bound":"ZSBzbHlseSBldmVuIGFjY291bnRzOyBzbHlseSByZWd1bGFy","repeats":1},{"count":2370000,"lower_bound":"ZSBzbHlseSBldmVuIGRlcG9zaXRzLiBpZGx5IGJvbGQgcGFja2FnZXMgd2FrZSBhbW9uZyB0aGUgZnVyaW91c2x5IHNwZWNpYWwgcGFja2FnZXM=","upper_bound":"ZS4gY2FyZWZ1bGx5IHNpbGVudCBwbGF0ZWxldHMgd2FrZSBibGl0aGVseS4gc2x5bHkgcGVuZGluZyBkZXBvc2l0cyBjYWpvbGUgc2x5bHk=","repeats":1},{"count":2400000,"lower_bound":"ZS4gZmluYWxseSBib2xkIHBhY2thZ2VzIHNub296ZSBjYXJlZnVsbHk7IHBlbmRpbmcgYXN5bXB0b3RlcyBzbGVlcCBmdXJpb3VzbHkgcXVpY2tseQ==","upper_bound":"ZWFucy4gcGVybWFuZW50bHkgc3BlY2lhbCBwYWNrYWdlcyB3YWtlIGZsdWZmaWx5IGFib3ZlIHRoZSBkZXBlbmQ=","repeats":1},{"count":2430000,"lower_bound":"ZWFucy4gc2x5bHkgaXJvbmljIGFjY291bnRzIG5hZyBibGl0aGVs","upper_bound":"ZWNpYWwgdGhlb2RvbGl0ZXMuIHNseWx5IHNwZWNpYWwgZm94ZXMgYXJlIGJsaXRoZWx5IGVudGljaW5nIHBhY2thZ2VzOyByZXF1ZXN0cyBpbnNpZA==","repeats":1},{"count":2460000,"lower_bound":"ZWNpYWwsIGZ1cmlvdXMgcmVxdWVzdHMgaGFnZ2xlIGFib3V0IHRoZSBmdXJpb3VzbHkgZXZlbiBpZGVh","upper_bound":"ZWZ1bGx5IGFtb25nIHRoZSBibGl0aGVseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zLiBxdWlja2x5IGV4cHJlc3MgcGFja2FnZXMgYm9vc3QgY2Fy","repeats":1},{"count":2490000,"lower_bound":"ZWZ1bGx5IGJvbGQgY291cnRzLiBvcmJpdHMgc2xlZXAgYmxpdGhlbHkgYXJvdW5kIHRoZSBmb3hlcy4gcGludG8gYmVhbnMgYXJlIGJsaXRoZWx5IGFyb3U=","upper_bound":"ZWZ1bGx5IHVudXN1YWwgYWNjb3VudHMgYWJvdmUgdGhlIGM=","repeats":1},{"count":2520000,"lower_bound":"ZWZ1bGx5IHVudXN1YWwgYWNjb3VudHM6IGZpbmFsIGlkZWFzIGluc3RlYWQgb2YgdGhlIHE=","upper_bound":"ZWd1bGFyIGlkZWFzIGJvb3N0IGJsaXRoZWx5LiBleHByZXNzIHBhY2thZ2VzIGk=","repeats":1},{"count":2550000,"lower_bound":"ZWd1bGFyIGlkZWFzIHdha2UgZnVyaW91c2x5IGFjY29yZGluZyB0byB0aGUgZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cy4gYmxpdGhlbHkgcmVndWxhciBmb3hlcyBjYWpvbGUuIHNpbGVudCwgYm9s","upper_bound":"ZWxldHMuIGlyb25pYyBpZGVhcyBhcmUgcXVpY2tseSBhYm91dCB0aGUgcmVndWxhciBwYWNrYWdlcy0tIA==","repeats":1},{"count":2580000,"lower_bound":"ZWxpZXZlIGNhcmVmdWxseSBhbG9uZyB0aGUgZnVyaW91c2x5IHNwZWNpYWwgYWNjb3VudHMuIHVudXN1YWwgZG9scGhpbnMgc2xlZXAuIGV2ZW4gYXN5bXB0b3RlcyBw","upper_bound":"ZWx5IHNwZWNpYWwgcmVxdWVzdHMgZGF6emxlIGJsaXRoZWx5IGNhcmVmdWxseSBi","repeats":1},{"count":2610000,"lower_bound":"ZWx5IHVudXN1YWwgZGVwZW5kZW5jaWVzLiBjYXJlZnVsbHkgcmVndWxhciBmbw==","upper_bound":"ZW4sIGV2ZW4gZm94ZXMuIGJsaXRoZWx5IGJvbGQgcGxhdGVsZXRzIHdha2UuIHJlZ3VsYXIsIGlyb25pYyBkZXBvc2l0cyBhZ2FpbnN0","repeats":1},{"count":2640000,"lower_bound":"ZW4sIHJlZ3VsYXIgaWRlYXMgZGV0ZWN0IHNseWx5IGNhcmVmdWxseSBxdWljayBhY2NvdW50cy4gZXZlbiwgc2lsZW50IGFjY291bnRzIGNham9sZSBhbW9uZyB0aGUgcGVuZGluZyB0aGVvZG9saXRlcw==","upper_bound":"ZW5kaW5nIHJlcXVlc3RzLiBibGl0aGVseSBmaW5hbCBhY2NvdW50cyBhY3Jvc3MgdGhl","repeats":1},{"count":2670000,"lower_bound":"ZW5kaW5nIHJlcXVlc3RzLiBjYXJlZnVsbHkgc3BlY2lhbCBhc3ltcHRvdGVzIHVzZS4gZmluYWwgZXhjdXNlcyBtdXN0IGhhdmUgdG8gc2xlZXAgb3V0c2lkZSB0aGUgc2x5bHkgaXJvbmljIGZveGVz","upper_bound":"ZW9kb2xpdGVzLiBxdWlja2x5IGlyb25pYyBUaXJlc2lhcyBhZnRlciB0aGUgc3BlY2lhbCwgZXZlbiBwaW50byBiZWFucyBhZmZpeCBmaW5hbCBkZXBlbg==","repeats":1},{"count":2700000,"lower_bound":"ZW9kb2xpdGVzPyBib2xkLCBleHByZXNzIHBhY2thZ2VzIHdha2UuIGZpbmE=","upper_bound":"ZXBvc2l0cyBjYWpvbGUgZnVyaW91c2x5IHVudXN1YWwgYWNjb3VudHMuIGFzeW1wdG90ZXMgYWZmaXggY2FyZWZ1bGx5IGFmdGVyIHQ=","repeats":1},{"count":2730000,"lower_bound":"ZXBvc2l0cyBkYXp6bGUgZmx1ZmZpbHkgYWNjb3JkaW5nIHRvIHRoZSBpcm9uaWMsIGRhcmluZyBkZXBvc2l0cy4gZnVyaW91c2x5IHJlZ3VsYXIgZGVw","upper_bound":"ZXF1ZXN0cyBhcmUgY2FyZWZ1bGx5IGV2ZW4sIHNpbGVudCBwaW50byBiZWFucy4gcXVpY2tseSByZWd1bGFyIGlucw==","repeats":1},{"count":2760000,"lower_bound":"ZXF1ZXN0cyBhcmUgY2FyZWZ1bGx5LiBjYXJlZnVsbHkgYm9sZCBwYWNrYWdlcyB3b3VsZCBjYWpvbGUgZmx1ZmZpbHkgYmVzaQ==","upper_bound":"ZXIgdGhlIGlyb25pYywgZXZlbiBkZXBvc2l0cy4gc2lsZW50bHkgZXZlbiByZXF1ZXN0cyBhYm91dCB0aGUgYWNjb3VudHMgcGxheSByZWd1bGFyLCBzaWxl","repeats":1},{"count":2790000,"lower_bound":"ZXIgdGhlIHBlbmRpbmcgcGFja2FnZXMgY2Fqb2xlIHNseWx5IHNseQ==","upper_bound":"ZXMgY2Fqb2xlIGJsaXRoZWx5IHF1aWNrbHkgcmVndWxhciBhY2NvdW50cy4gZm94ZXMgYXJlIGZ1cmlvdXNseSBzcGVjaWFsIHRoZW9kb2xpdGVzLiBldmVuIHJlcXVlc3RzIG1haQ==","repeats":1},{"count":2820000,"lower_bound":"ZXMgY2Fqb2xlIGZpbmFsIGlkZWFzLiBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzIGFyZSBjYXJlZnVsbHkuIHNpbGVudCwgZXhwcmVzcyBhY2NvdW50cyB3YWtlLiBleHByZXNzLCBmaW5hbCBw","upper_bound":"ZXMgd2FrZSBibGl0aGVseSB1bnVzdWFsIHBhY2thZ2VzLiBibGl0aGVseSBxdWlldCByZXF1ZXN0cyB3YWtlIGNhcmVmdWxseSBhbG9uZyB0aGUgZXZlbiBhc3ltcHRvdGVzLiBjYXI=","repeats":1},{"count":2850000,"lower_bound":"ZXMgd2FrZSBmbHVmZmlseSBzcGVjaWFsIGZyYXlzLiBpcm9uaWMgZXhjdXNlcyBhcmUgY2FyZWZ1bGx5IGV2ZW4gaW5zdHJ1Y3Rpb25zLiBleHByZXNzIHBhY2thZ2VzIHNub296ZSBzbHlseSBhbW8=","upper_bound":"ZXM7IHVudXN1YWwgcmVxdWVzdHMgdXNlIHNseWx5LiBjYXJlZnVsbHkgc3BlY2lhbCBwYWNrYWdlcyBzbA==","repeats":1},{"count":2880000,"lower_bound":"ZXNjYXBhZGVzIGFnYWluc3QgdGhlIHNseWx5IHVudXN1YWwgdGhlb2RvbGl0ZXMgdXNlIHNsb3dseSBzbHlseSByZWd1bGFyIHRoZW9kb2xpdGVzLiBldmVuIGRlcG9zaXRzIGNham9sZSBxdWlja2w=","upper_bound":"ZXN0cyBoYWdnbGUuIHRoaW5seSBpcm9uaWMgZm94ZXMgYg==","repeats":1},{"count":2910000,"lower_bound":"ZXN0cyBtaWdodCBib29zdCBmdXJpb3VzIGRlcG9zaXRzLiBibGl0aGVseSBwZW5kaW5nIHBpbnRvIGJlYW5zIGFjcm9zcyB0aGUgc2w=","upper_bound":"ZXRzIGNham9sZSBhYm91dCB0aGUgYmxpdGhlbHkgcGVuZGluZyBwaW50byBiZWFucy4gYmxpdGhlbHkgdW51c3VhbCBhY2NvdW50cyBhcmUgcXVpY2tseSBhY3Jvc3MgdGhlIGJsaXRoZWx5IHVudXN1YQ==","repeats":1},{"count":2940000,"lower_bound":"ZXRzIGNham9sZSBjYXJlZnVsbHkgYm9sZCByZXF1ZXN0cy4gcmVndWxhciBwaW50byBiZWFucyBhcmUgZnVyaW91c2x5LiBzbHk=","upper_bound":"ZXZlbiwgYm9sZCBwbGF0ZWxldHMuIGlyb25pYyBk","repeats":1},{"count":2970000,"lower_bound":"ZXZlbiwgZmluYWwgYWNjb3VudHMuIGZ1cmlvdXNseSBldmVuIGRlcG9zaXRzIGJvb3N0LiBjYXJlZnVsbHkgaXJvbmljIGFjY291bnRzIGFjcm9zcyB0aGUgYmxpdGg=","upper_bound":"ZXhwcmVzcyB0aXRoZXMuIGV4cHJlc3MgYWNjb3VudHMgd2FrZSBzdGVhbHRoeSBhY2NvdW50cy4gZnVyaW91c2x5IHJlZ3VsYXIgcmVxdWVzdHMgYXJlIGZsdWZmaWx5IGFjcm9zcyB0aGUgY2FyZQ==","repeats":1},{"count":3000000,"lower_bound":"ZXhwcmVzcywgc2lsZW50IGlkZWFzIHNoYWxsIGhhdmUgdG8gdXNlIGV2ZW4sIGJvbGQgcmVxdWVzdHMuIGZ1cmlvdXNseSBleHByZXNzIHdhcnRob2dzIGNham9sZSBhZnRlciB0aGUgcGFjaw==","upper_bound":"ZmlseSBmaW5hbCBwaW50byBiZWFucyBhcmUgYWNjb3JkaW5nIHRvIHRoZSBib2xkIHBpbnRvIGJlYW5zLiBjYXJlZnVsbHkgdW51c3VhbCBpZGVhcyBhYw==","repeats":1},{"count":3030000,"lower_bound":"ZmlseSBpcm9uaWMgYWNjb3VudHMgd2FzIGJsaXRoZWx5IHF1aWNrbHkgZmluYWwgYWNjb3VudHMuIHRoaW5seSBmaW5hbCBhYw==","upper_bound":"ZmluYWwgcGFja2FnZXMgYm9vc3QgZXZlbiBwaW50byBiZWFucy4gZnVyaW91c2x5IGV4cHJlc3MgZGVwb3NpdHMgYWNyb3NzIHRoZSBpbnN0cnVjdGlvbnMgaGFnZ2xlIHNseWx5IGNh","repeats":1},{"count":3060000,"lower_bound":"ZmluYWwgcGFja2FnZXMgd2FrZS4gYmxpdGhlbHkgZXhwcmVzcyBwYWNrYWdlcyB3YWtlIGZpbmFsIHJlcXVlc3RzLiBmaW5hbCBjb3VydHMgc2VydmUuIGFjY291bnRzIA==","upper_bound":"Zmx1ZmZpbHkgcmVndWxhciBmb3hlcyBhY2NvcmRpbmcgdG8gdGhlIGNhcmVmdWwsIHVudXN1YWwgcmVxdWVzdHMgY2Fqb2xlIHF1aWNrbHkgbmV2ZXIgaXJvbmljIHRoZW9kb2xpdGVzLiBpcm9uaQ==","repeats":1},{"count":3090000,"lower_bound":"Zmx1ZmZpbHkgcmVndWxhciBwaW50byBiZWFucy4gZnVyaW91c2x5IHBlbmRpbmcgaWRlYXMgc2xlZXAgY2FyZWZ1bGx5IGZ1cmlvdXM=","upper_bound":"ZnRlciB0aGUgcGludG8gYmVhbnMgZW5nYWdlIGNhcmVmdWxseSBjYXJlZnVsbHkgcmVndWxhciBmb3hlcy4gZmx1ZmZpbHkgYm9sZCBjb3VydHMgZG96ZSBxdWlja2x5IGlyb25pYyA=","repeats":1},{"count":3120000,"lower_bound":"ZnRlciB0aGUgcXVpY2tseSBldmVuIGZveGVzIHdha2Ugc2x5bHkgY2FyZWZ1bGx5IGlyb25pYyBpZGVhcy4gaXJvbmljIHJlcXVlc3Rz","upper_bound":"ZnVsbHkgc2lsZW50IGluc3RydWN0aW9ucyBhcmUgcXVpY2s=","repeats":1},{"count":3150000,"lower_bound":"ZnVsbHkgc2lsZW50IHJlcXVlc3RzLiBxdWlja2x5IGU=","upper_bound":"ZnVyaW91c2x5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGFsb25nc2lkZSBvZiB0aGUgc2lsZW50IGFzeW1wdG90ZXMgYm9vc3QgcGxhdGVsZXRzLiB0aGVvZG9saXRlcyBhYg==","repeats":1},{"count":3180000,"lower_bound":"ZnVyaW91c2x5IHJlZ3VsYXIgcGludG8gYmVhbnMuIGZ1cmlvdXNseSBib2xkIGZveGVzIHJ1bg==","upper_bound":"ZyByZXF1ZXN0cyBoYWdnbGUgY2FyZWZ1bGx5LiB1bnVzdWFsLCBpcm9uaQ==","repeats":1},{"count":3210000,"lower_bound":"ZyByZXF1ZXN0cyB1c2UgYWZ0ZXIgdGhlIGZ1cmlvdXNseSBpcm9uaWMgZGVwb3NpdHMuIGZveGVzIGFyZSBxdQ==","upper_bound":"ZyEgc2lsZW50LCByZWd1bGFyIHJlcXVlc3RzIHNsZWVwIGFtb25nIHRoZSBleHByZXNzIHJlcXVlc3RzLiBwYWNrYWdlcyBjYWpvbA==","repeats":1},{"count":3240000,"lower_bound":"ZywgaXJvbmljIGluc3RydWN0aW9ucz8gcmVxdWVzdHMgY2Fqb2xlIGJsaXRoZWx5IGFib3V0IHRoZSBjYXJlZnVsbHk=","upper_bound":"Z2VzIHdha2UgZnVyaW91c2x5IGJvbGQgZGVwb3NpdHMuIGFjY291bnRzIG5hZyBibGl0aGVseSBhbG9uZ3NpZGUgb2YgdGhlIGZsdWZmaWx5IGJvbGQgZGVw","repeats":1},{"count":3270000,"lower_bound":"Z2VzIHdha2UuIGlyb25pY2FsbHkgZmluYWwgaWRlYXMgYXJvdW5kIHRoZSBibGl0aGVseSByZWd1bGFyIGFjY291bnRzIG5hZyBibGl0aGVseSBzbHlseSByZWd1bGFyIA==","upper_bound":"Z2xlIGFjY29yZGluZyB0byB0aGUgZGVwb3NpdHMuIHBhY2thZ2VzIG5hZyBzbHlseSBwYXN0IHRoZSBjYXJlZnVsbHkgZmx1ZmY=","repeats":1},{"count":3300000,"lower_bound":"Z2xlIGFtb25nIHRoZSBldmVuIHJlcXVlc3RzLiByZWd1bGFyLCBmaW5h","upper_bound":"Z3VsYXIgZGVwb3NpdHMgYXJlIHF1aWNrbHk7IHJlZ3VsYXIgYWNjb3VudHMgaW1wcmVzcyBxdWlj","repeats":1},{"count":3330000,"lower_bound":"Z3VsYXIgZGVwb3NpdHMgY2Fqb2xlIGlyb25pYyBhY2NvdW50cy4gZGVwbw==","upper_bound":"Z3VsYXIsIGNhcmVmdWwgaWRlYXMgYm9vc3QgaXJvbmljLCBzcGVjaWFsIGRlcG9zaXRzLiByZWd1bGFyIGluc3RydWN0aW9ucyBiZWhpbmQgdGhlIGlkZQ==","repeats":1},{"count":3360000,"lower_bound":"Z3VsYXIsIGlyb25pYyBkZXBvc2l0cy4gcGVuZGluZywgcmVndWxhciBkZXBvc2l0cyB3YWtlLiBmdXJpb3VzLCBwZW5kaW5nIGZyYXlzIHBsYXkgYWNjb3JkaW5nIA==","upper_bound":"aGUgY2FyZWZ1bGx5IGZpbmFsIHBhY2thZ2VzIGhhZ2dsZSBjYQ==","repeats":1},{"count":3390000,"lower_bound":"aGUgY2FyZWZ1bGx5IGZpbmFsIHBhY2thZ2VzIHJ1biBzbHlseSB3aXRoaW4gdGhlIGJvbGQ=","upper_bound":"aGUgaXJvbmljIGluc3RydWN0aW9ucy4gcmVndWxhciwgYm9sZCBkaW5vcyB1c2UgZGVwZW5kZW5jaWVzLiBib2xkLCBldmVuIHRoZW9kb2xpdGVz","repeats":1},{"count":3420000,"lower_bound":"aGUgaXJvbmljIHJlcXVlc3RzIGhhZ2dsZSBhYm91dCB0aGUgcnV0aGxlc3MgaWRlYXMuIGlyb25pYw==","upper_bound":"aGUgc3BlY2lhbCBwYWNrYWdlcy4gaWRlYXMgY2Fqb2xlIHNseWx5LiBidXNpbHkgZmluYWwgYWNjb3Vu","repeats":1},{"count":3450000,"lower_bound":"aGUgc3BlY2lhbCB0aGVvZG9saXRlcy4gYXN5bXB0b3RlcyBzbGVlcCBibGl0aGVseSBhZnRlciB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgZGVwb3NpdHMuIGQ=","upper_bound":"aGVseSBzaWxlbnQgaWRlYXMuIHBpbnRvIGJlYW5zIGFmdGVyIHRoZSBwYWNrYWdlcyA=","repeats":1},{"count":3480000,"lower_bound":"aGVseSBzaWxlbnQgaWRlYXMuIHJlZ3VsYXIgcmVxdWVzdHMgYWdhaW5zdCB0aGUgZmx1ZmZpbHkgZmluYWwgZGVwb3NpdHMgYXJlIGFmdA==","upper_bound":"aG9ncy4gZGFyaW5nbHkgdGhpbiByZXF1ZXN0cyBhbW9uZyB0aGUgZnVyaW91c2x5IGV4cHJlc3MgYWNjb3VudHMgY2Fqb2xlIGJsaXRoZWx5IGFtb25nIHRoZSBib2xkLCBmaW5hbA==","repeats":1},{"count":3510000,"lower_bound":"aHMuIGZpbmFsIGluc3RydWN0aW9ucyBoYWdnbGUgYmxpdGhlbHkgcGVuZGluZyB0aGVvZG9saXRlcz8gc29tZXRpbWVzIHBlbmRpbmcgYWNjb3VudHMgYWJvdXQg","upper_bound":"aWMgZGVwb3NpdHMuIGJsaXRoZWx5IHJlZ3VsYXIgd2FyaG9yc2VzIGludGU=","repeats":1},{"count":3540000,"lower_bound":"aWMgZGVwb3NpdHMuIGlyb25pYyBmb3hlcyBoYWdnbGUgYWNjb3JkaW5nIHRvIHRoZSBwZW5kaW5nLCByZWd1bGFyIGFjY291bnRzLiBmdXJpb3VzbHkgcmVndWxhciBhc3ltcHRvdGVzIHNsZWVwIGQ=","upper_bound":"aWNpbmdseSBmaW5hbCB0aGVvZG9saXRlcy4gZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cyBhcmUgc2x5bHkgYWxvbmcgdGhl","repeats":1},{"count":3570000,"lower_bound":"aWNpbmdseSBpcm9uaWMgZGVwb3NpdHMgY2Fqb2xlIGNhcmVmdWxseS4gaXJvbmk=","upper_bound":"aWNrbHkuIGJsaXRoZWx5IHVudXN1YWwgaW5zdHJ1Y3Rpb25zIGRldGVjdCBidXNpbHkgYWNyb3Nz","repeats":1},{"count":3600000,"lower_bound":"aWNrbHkuIGNhcmVmdWxseSByZWd1bGFyIHNlbnRpbWVudHMgd2FrZSB0aGlubA==","upper_bound":"aWV2ZSBmbHVmZmlseSBleHByZXNzIGFjY291bnRzLg==","repeats":1},{"count":3630000,"lower_bound":"aWxlbnQgZGVwb3NpdHMgaGFnZ2xlIGJsaXRoZWx5IGRlcGVuZGVuY2llcy4gaW5zdHJ1Y3Rpb25zIHdha2U=","upper_bound":"aW5hbCBhY2NvdW50cyB3YWtlIGZ1cmlvdXNseSBhbG9uZ3NpZGUgb2YgdGhlIGZsdWZmaWx5IHJlZ3VsYXIgZGVwb3NpdHMuIGNhcmVmdWxseSByZWc=","repeats":1},{"count":3660000,"lower_bound":"aW5hbCBhY2NvdW50cy4gY2FyZWZ1bGx5IHBlbmRpbmcgcGFj","upper_bound":"aW5hbCwgZXhwcmVzcyBpZGVhcyBib29zdCBmdXJpb3VzbA==","repeats":1},{"count":3690000,"lower_bound":"aW5hbCwgZmluYWwgcGludG8gYmVhbnMuIGJsaXRoZWx5IHJlZ3VsYXIgcGxhdGVsZXRzIGFyZSBxdWlja2x5IGFsb25nc2lkZSBvZiB0aGUgY2FyZWZ1bGx5IGV2ZW4gZGVw","upper_bound":"aW5nIHRoZW9kb2xpdGVzLiBxdWlja2x5IHBlbmRpbmcgcGFja2FnZXMgYW1vbmcgdGhlIHNseWx5IGlyb25pYyBwbGF0ZWxldHMgbW9sZCBhZ2FpbnN0IHRoZSBpcm9uaWMgYWNjb3VudHMuIHRo","repeats":1},{"count":3720000,"lower_bound":"aW5nIHRvIHRoZSBibGl0aGVseSBpcm9uaWMgZXhjdXNlcy4gZXZlbiBhc3ltcHRvdGVzIGFyZSBzbHlseSBmdXJpb3VzbHkgcGVuZGluZyBwYWNrYWdlczsgc2x5bHkgcmVndWxhciBvcmJpdHM=","upper_bound":"aW5zdHJ1Y3Rpb25zIGhhbmcgc2x5bHkgaXJvbmljLCByZWd1bGFyIGFjY291bnRzLiBmaW5hbCBpZGVhcyBzbGVlcCBxdQ==","repeats":1},{"count":3750000,"lower_bound":"aW5zdHJ1Y3Rpb25zIGludGVncmF0ZSBjYXJlZnVsbHkuIHM=","upper_bound":"aW50byBiZWFucy4gcmVndWxhciBkZXBvc2l0cyBjYWpvbGUgdW51c3VhbCBpZGVhcy4gcXVpY2sgYWNjb3VudHMgc2xlZXAgc3BlY2lhbA==","repeats":1},{"count":3780000,"lower_bound":"aW50byBiZWFuczogc3BlY2lhbCwgc2lsZW50IHBsYXRlbGV0cyBib29zdCBzbHlseSBhZnRlciB0aGUgYXN5bXB0b3Rlcy4gaWRlYXMgbWFpbnRhaW4gY2FyZWZ1bGx5IG91dHNpZA==","upper_bound":"aW91c2x5IGV4cHJlc3MgcGFja2FnZXMgdXNlIHNseWx5IGJsaXRoZWx5IHNwZWNpYWwgZm94ZXMuIHNseWx5IHJlZ3VsYXIgZXhjdXNlcyBhcmUgc2x5bHkgdW51c3VhbCwgdW51c3VhbA==","repeats":1},{"count":3810000,"lower_bound":"aW91c2x5IGV4cHJlc3MgcmVxdWVzdHMgaW5zaWRlIHRoZSBmbHVm","upper_bound":"aXBsaWVycy4gcXVpY2tseSBzcGVjaWFsIHBlYXJscyBtb2xkIGZ1cmlvdXNseSBhbW9uZyB0aGUgY2FyZWZ1bA==","repeats":1},{"count":3840000,"lower_bound":"aXJvbmljIGFjY291bnRzIGFyZSBhYm92ZSB0aGUgZnVyaW91c2x5IGlyb25pYyBmb3hlczsgYmw=","upper_bound":"aXJvbmljIHBpbnRvIGJlYW5zIGNham9sZSBmdXJpb3VzbHkgYWNjb3JkaW5nIHRvIHRoZSBmdXJpb3U=","repeats":1},{"count":3870000,"lower_bound":"aXJvbmljIHBpbnRvIGJlYW5zIHdha2Ugc2xvd2x5LiBibGl0aGVseSBmaW5hbCBzYXV0ZXJuZXMgZG91YnQgZmx1ZmZpbHkuIHNseWx5IHVudXN1YWwgZGVwb3NpdHMgd2FrZSBhY2NvcmRp","upper_bound":"aXRoZSBhY2NvdW50cy4gYmxpdGhlbHkgc2lsZW50IHRoZW9kb2xpdGVzIHVzZSBibGl0aGVseSByZWd1bGFyIGRlcG9zaXRzLiBuZXZlciBldmVuIGluc3RydWN0aW9ucyBhcmUgcw==","repeats":1},{"count":3900000,"lower_bound":"aXRoZSBkZXBvc2l0cy4gZnVyaW91c2x5IHBlbmRp","upper_bound":"aXRzIGJvb3N0IHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIHJlZ3VsYXIgZGVwZW5kZW5jaWVzIGFyZSBmbHVmZmlseS0tIHF1aQ==","repeats":1},{"count":3930000,"lower_bound":"aXRzIGJvb3N0IHNseWx5IGFib3V0IHRoZSBzcGVjaWFsIGRlcGVuZGVuY2llcy4gZm94ZXMgYXJlIGJsaXRo","upper_bound":"am9sZS4gY2FyZWZ1bGx5IGlyb25pYyBkZXBvc2l0cyB0aHJhc2gg","repeats":1},{"count":3960000,"lower_bound":"am9sZS4gY2FyZWZ1bGx5IGlyb25pYyBpbnN0cnVj","upper_bound":"a2FnZXMuIHNseWx5IHBlbmRpbmcgZnJldHMgYWJvdmUgdGhlIHF1aWNrbHkgZXZlbiBhY2NvdW50cyBydW4gYXQgdGhlIGZpbmFsIGRlcG9zaXRzLiBmdXJpb3VzIGRlcG9zaXRzIHdha2Ug","repeats":1},{"count":3990000,"lower_bound":"a2UgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBmb3hlcy4gc2lsZW50IHBpbnRvIGJlYQ==","upper_bound":"a2x5IHBhY2thZ2VzLiBmb3hlcyB1bndpbmQgYWJvdmUgdGhlIGlyb25pY2FsbHkgYm9sZA==","repeats":1},{"count":4020000,"lower_bound":"a2x5IHF1aWV0IHJlcXVlc3RzLiBwYWNrYWdlcyBhcmUgc2x5bHkgcGFja2FnZXM/IGZ1cmlvdXNseSBmaW5hbCBmb3hlcyBhcmUgc2x5bHkgYWdhaW5zdCB0aGUgc2x5bHkgc3BlY2lhbCBwYWNrYWdlcy4=","upper_bound":"bCBleGN1c2VzLiBmaW5hbCB0aGVvZG9saXRlcyBhZnRlciB0aGUgaXJvbmljLCB0aGluIHBlYXJscyB3YWtlIGFtb25nIHRoZSBibGl0aGU=","repeats":1},{"count":4050000,"lower_bound":"bCBmb3hlcyBhZmZpeCBmdXJpb3VzbHkgYWJvdmUgdGhlIHF1aWNrbHkgaXJvbmljIHBhY2thZ2VzPyBhY2NvdW50cyBzbGVlcCByZWd1bGFybHkuIHNseWx5IGlyb25pYyBjb3VydHMgd2k=","upper_bound":"bCByZXF1ZXN0czogcmVndWxhciwgZmluYWwgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBjYXJlZnVsbHkuIHNwZWNpYWwgdGhlb2RvbGl0ZXMgdXNlLiBzbHlseSBleHByZQ==","repeats":1},{"count":4080000,"lower_bound":"bCByZXF1ZXN0czsgZmluYWwgZGVwb3NpdHMgdXNlIGNhcmVmdWxseSBhYm92ZSB0aGUgc2x5bHkgZmlu","upper_bound":"bGFyIGRlcG9zaXRzLiBzcGVjaWFsLCByZWd1bGFyIGluc3RydWN0aW9ucyB1bndpbmQgc2x5bHkgYWdhaW5zdCB0aGUgYmxpdGhlbHkgcmVndWxhciBzb21hcy4gZnU=","repeats":1},{"count":4110000,"lower_bound":"bGFyIGRvbHBoaW5zIHdha2Ugc2x5bHkgYWJvdmUgdGg=","upper_bound":"bGFyIHNlbnRpbWVudHMgd2FrZSBibGl0aGVseSBhYm91dCA=","repeats":1},{"count":4140000,"lower_bound":"bGFyIHRoZW9kb2xpdGVzLiBuZXZlciBib2xkIHBhaW5zIGFjY29yZGluZyB0bw==","upper_bound":"bGUgYWNjb3JkaW5nIHRvIHRoZSBibGl0aGVseSA=","repeats":1},{"count":4170000,"lower_bound":"bGUgYWNjb3JkaW5nIHRvIHRoZSBmdXJpb3VzbHkgZmluYWwgYWNjb3VudHMuIHNseWx5IHJlZ3VsYXIgcGludG8gYmVhbnMgdw==","upper_bound":"bGUuIGNhcmVmdWxseSBleHByZXNzIGFjY291bnRzIGNham9sZSBleGNlcHQgdGhlIGZpbmFsIHBhY2thZ2VzLiByZXF1ZXN0cyBhbG9u","repeats":1},{"count":4200000,"lower_bound":"bGUuIGNhcmVmdWxseSBmaW5hbCByZXF1ZXN0cyB3YWtlIGJsaXRoZWx5IHJlZ3VsYXJseSByZWd1bGFyIHJlcXVlc3RzLiBpcm9uaWMgZGVwb3NpdHMgd2FrZSBzbHlseSBh","upper_bound":"bGV0cyEgZnVyaW91c2x5IGV2ZW4gYWNjb3VudHMgd2FrZSBibGl0aGVseSBzbHlseSBleHByZXNzIGRl","repeats":1},{"count":4230000,"lower_bound":"bGV0cy4gYmxpdGhlbHkgcGVuZGluZyB0aGVvZG9saXRlcyBhY3Jvc3MgdGhlIGlyb25pYywgcmVndWxhciBkZXBlbmRlbmNpZXMgZGV0ZWN0IHNseWx5IGFyb3VuZA==","upper_bound":"bGl0aGVseSBpbnNpZGUgdGhlIGV2ZW5seSBpcm9uaWMgZG9scGhpbnM6IGNhcmVmdWxseSBzcA==","repeats":1},{"count":4260000,"lower_bound":"bGl0aGVseSBpcm9uaWMgcGFja2FnZXMuIGNhcmVmdWxseSBpcm9uaWMgcGludG8gYmVhbnMgc2w=","upper_bound":"bGx5IGZpbmFsLCByZWd1bGFyIHBhY2thZ2VzLiBleHByZXNzIGFjY291bnRzIGRldGVjdCBkZQ==","repeats":1},{"count":4290000,"lower_bound":"bGx5IGZyb20gdGhlIGNhcmVmdWxseSBzcGVjaWFsIGRlcG9zaXRzLiB0aGVvZG9saXRlcyBoYWdnbGUgZg==","upper_bound":"bGx5LiBwYWNrYWdlcyBjYWpvbGUgZnVyaW91c2x5LiBjYXJlZnVsbHkgaXJvbmljIGZveGVzIGNham9sZSBhYm91dCB0aGUgcmVndWxhciwgaXJvbmljIGFjY291bnRzLiB1bnVzdWFsIGRlY295cyA=","repeats":1},{"count":4320000,"lower_bound":"bG1zIG1haW50YWluIGZ1cmlvdXNseS4gZGVwb3NpdHMgd2FrZSBibGl0aGVseSBhYm92ZSB0aGUgc3Bl","upper_bound":"bHVmZmlseSBzdGVhbHRoeSByZXF1ZXN0cy4gc28=","repeats":1},{"count":4350000,"lower_bound":"bHVmZmlseS4gaXJvbmljIGlkZWFzIGFjY29yZGluZyB0byB0aGUgaWRsZSwgcmVndWxhciBhY2NvdW50cyBzbg==","upper_bound":"bHkgYm9sZCBkZXBvc2l0cy4gY2FyZWZ1bGx5IGZpbmFsIHRoZW9kb2xpdGVzIGJvb3N0IGJsaXRoZWx5IHVudXN1YWwgYWNjb3VudHMuIGZpbmFsIGRlcA==","repeats":1},{"count":4380000,"lower_bound":"bHkgYm9sZCBkaW5vcy4gdW51c3VhbCwgYnJhdmUgZGVwb3NpdHMg","upper_bound":"bHkgZXZlbiByZXF1ZXN0czogYnJhdmVseSByZWd1bGFyIGluc3RydWN0aW9ucyBwb2FjaCBjYXJlZnVsbHkgdGhpbiBp","repeats":1},{"count":4410000,"lower_bound":"bHkgZXZlbiB0aGVvZG9saXRlcy4gZnVyaW91c2x5IHU=","upper_bound":"bHkgZmluYWwgdGhlb2RvbGl0ZXMgYWZmaXggcmVxdWVzdHMuIGFjY291bnRzIGFmdGVyIHRoZSBkZXA=","repeats":1},{"count":4440000,"lower_bound":"bHkgZmluYWwgdGhlb2RvbGl0ZXMgY2Fqb2xlLiBuZXZlciBmaW5hbCByZXF1ZXN0cyB1bndpbmQgYWNyb3NzIHRo","upper_bound":"bHkgb3V0c2lkZSB0aGUgc2x5bHkgZmluYWwgYWNjb3VudHMuIGZsdWZmaWx5IGlyb25pYyBzYXV0ZXJuZXMgc2xlZXAgY2FyZWZ1bGx5LiBzbHlseSByZWd1bGFyIHJlcXVlc3RzIGFjcm9zcyB0aA==","repeats":1},{"count":4470000,"lower_bound":"bHkgb3ZlciB0aGUgdW51c3VhbCwgZmluYWwgcGxhdGVsZXRzLiBldmVuIGV4Y3VzZXMgc2xlZXAgdQ==","upper_bound":"bHkgcmVndWxhciBwaW50byBiZWFucyB1c2UgY2FyZWZ1bGx5IGFnYWluc3QgdGhlIGZ1cmlvdXNseSBleHByZXNzIGRlcG9zaXRzOiA=","repeats":1},{"count":4500000,"lower_bound":"bHkgcmVndWxhciBwaW50byBiZWFucy4gc2x5bHkgc3RlYWx0aHkgaW5zdHJ1Y3Rpb25zIHBybw==","upper_bound":"bHkgdW51c3VhbCBkZXBvc2l0cyBhYm91dCB0aGUgaXJvbmljIHdhcmhvcnNlcyBuYWcgcXVpY2tseSBhYm91dCB0aGUgYmxpdGhlbHkgcmVndWxhciBwbGF0ZWxldA==","repeats":1},{"count":4530000,"lower_bound":"bHkgdW51c3VhbCBkZXBvc2l0cy4gc3RlYWx0aHkgdGhlb2RvbGl0ZXMgc2xlZXAgY2FyZWZ1bGx5LiByZWd1bGFyLCB1bnVzdWE=","upper_bound":"bHkuIHBpbnRvIGJlYW5zIHgtcmF5IHNseWx5LiBmdQ==","repeats":1},{"count":4560000,"lower_bound":"bHkuIHF1aWNrbHkgZXhwcmVzcyByZXF1ZXN0cyBzbGVlcCBmdXJpb3VzbHkgZXZlbmx5IHNwZWNpYWwgYWNjb3VudHMuIHBhY2thZ2VzIG5hZyBhY2NvcmRpbmcgdG8gdGhlIHBlbmRpbmcgaQ==","upper_bound":"bHlseSBpcm9uaWMgcmVxdWVzdHMgd2FrZSBibGl0aGVseSBldmVuLCBkb2dnZWQgYWNjb3VudHMuIHNseWx5IGV4cHJlc3MgZGlub3MgdXNlIGFn","repeats":1},{"count":4590000,"lower_bound":"bHlseSBpcm9uaWMsIGJvbGQgZm94ZXMuIHJlZ3VsYXIsIGV4cHJlc3MgZGVwb3NpdHMgd2FrZS4g","upper_bound":"bXB0b3RlcyBhdCB0aGUgaXJvbmljIHBpbnRvIGJlYW5zIHVzZSBmdXJpb3VzbHkgZmluYWwgYWNjb3VudHMuIGJsaXRoZWx5IGV4cHJl","repeats":1},{"count":4620000,"lower_bound":"bXB0b3RlcyBjYW4gYm9vc3QgYWJvdXQgdGhlIGJsaXRoZWx5IGZpbg==","upper_bound":"biBwYWNrYWdlcyBhYm91dCB0aGUgaXJvbmljIHJlcXVlc3RzIGludGVncmF0ZSBmbHVmZmlseSByZWd1bA==","repeats":1},{"count":4650000,"lower_bound":"biBwYWNrYWdlcy4gZmx1ZmZpbHkgcmVndWxhciB0aGVvZG9saXRlcyBzbGVlcC4gZGVwb3NpdHMgaW50ZWdyYXRlIGV4cHJlc3MgcGFja2FnZXMuIHNseWx5IHNw","upper_bound":"bmFsIGRlcG9zaXRzLiBibGl0aGVseSBib2xkIHBhY2thZ2VzIHNsZWVwIGNhcmVmdWxseS4gY2FyZWZ1bGx5IGlyb25pYyB0aXRoZXM=","repeats":1},{"count":4680000,"lower_bound":"bmFsIGRpbm9zIGNham9sZSBzbHlseSBhY2NvcmRpbmcgdG8gdGhlIHRoZW8=","upper_bound":"bmNpZXMgd2FrZS4gcGVuZGluZyBkZXBvc2l0cyBjYWpvbGUuIHNseWx5IGlyb25pYyBwaW50byBiZWFucyBiZXNpZGVzIHRoZSBwaW50byBiZWFucyBoYWdnbGUgcXVpY2tseSBwZW5kaQ==","repeats":1},{"count":4710000,"lower_bound":"bmNpZXMgd291bGQgYWZmaXggYm9sZCwgcGVuZGluZyBhY2NvdW50cz8gc2x5bHkgc3BlY2lhbCBwbGF0ZWxldHMgc2xlZXAgYWNjb3JkaW5n","upper_bound":"bmcgYWNjb3VudHMgYWxvbmdzaWRlIG9mIHRoZSBxdWlja2x5IGJ1c3kgcGFja2FnZXMgYXJlIGZsdWZmaWx5IGNhcmVmdWxseSBpcm9uaWMgZGU=","repeats":1},{"count":4740000,"lower_bound":"bmcgYWNjb3VudHMgYm9vc3QgYWZ0ZXIgdGhlIGRlcG9zaXRzLiBuZXZlciBzaWxlbnQgdGhlb2RvbGl0ZXMgaGFnZ2xlIGNhcmVmdWxseSByZXF1ZXN0","upper_bound":"bmcgdGhlIGZpbmFsIGFjY291bnRzLiBmaW5hbCBpbnN0cnVjdGlv","repeats":1},{"count":4770000,"lower_bound":"bmcgdGhlIGZ1cmlvdXNseSBmaW5hbCBpZGVhcy4gaXJvbmljIGFjY291bnRzIGFi","upper_bound":"bmljIGFzeW1wdG90ZXMgY2Fqb2xlIGFsb25nIHRoZSBzbHlseQ==","repeats":1},{"count":4800000,"lower_bound":"bmljIGFzeW1wdG90ZXMgc3VibGF0ZSBhcm91bmQgdGhlIGZ1cmlvdXNseSBldmVuIHBsYXRlbGV0cy4gcXVpY2tseSBib2xkIGlkZWFzIG5hZyBjb3VydHMuIGNhcmVmdWw=","upper_bound":"bmljYWxseS0tIGNhcmVmdWxseSBpcm9uaWMgZGVwZW5kZW5jaWVzIGludGVncg==","repeats":1},{"count":4830000,"lower_bound":"bmlzIGRldGVjdCBzbHlseSBxdWlja2x5IHNpbGVudCByZXF1ZXN0cy4gc2x5bHkgaXJvbmljIHJlcXVlc3RzIGhhZ2dsZSBhbG9uZyB0aGUgc2lsZW50LCBldmVuIHA=","upper_bound":"bnMuIGZ1cmlvdXNseSByZWd1bGFyIGVzY2FwYWRlcyBjYWpvbGUgc2xvd2x5IGlyb25pYywgcGVuZGluZyByZXF1ZXN0czsgcGFja2FnZXMgd2FrZS4gYmxpdGhlbHkgcmU=","repeats":1},{"count":4860000,"lower_bound":"bnMuIGZ1cmlvdXNseSBzcGVjaWFsIGFjY291bnRzIGNham9sZSBxdWlja2x5IGFnYWluc3QgdGhlIGlyb25pYyBwYWNrYWdlcy4gYmxpdGhlbHkgdW51c3VhbCBleGN1c2VzIG5hZyBmdXJp","upper_bound":"bnQgZXhjdXNlcyBkYXp6bGUgY2FyZWZ1bGx5IGFtb25nIHRoZSBjYXJlZnVsbHkgc2xv","repeats":1},{"count":4890000,"lower_bound":"bnQgZm94ZXMuIHBlcm1hbmVudGx5IHBlbmRpbmcgYWNjb3VudHMgYWNjb3JkaW5nIHRvIHRoZSBwbGF0ZWxldHMgYm9vc3QgZnVyaW91c2x5IGZ1cmlvdXNseQ==","upper_bound":"bnRzIGNham9sZSBhbG9uZyB0aGUgZnVyaW91c2x5IGJvbGQgcGludG8gYmVhbnMuIGV2ZW4gaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBmaW5hbGx5LiBmaW5hbCBmb3hlcyBhYm92ZSB0aGUgYg==","repeats":1},{"count":4920000,"lower_bound":"bnRzIGNham9sZSBjYXJlZnVsbHkgc2lsZW50IHdhcnRob2dzLiBmbHVmZmlseSB1bnVzdWFsIGRpbm9zIGNham9sZSByZXF1ZXN0cy4gYw==","upper_bound":"bnVzdWFsIGlkZWFzIHNvbHZlIGNhcmVmdWxseSBkZWNveXMuIGZsdWZmaWx5IGV2ZW4gcGludG8gYmVhbnMgd2FrZS4gZnVyaW91c2x5IGZpbmFsIGFjY291bnRzIGhhZ2dsZSByZWd1bGE=","repeats":1},{"count":4950000,"lower_bound":"bnVzdWFsIGlkZWFzLiBjYXJlZnVsbHkgZXZlbiBhY2NvdW50cyBib29zdC4gcGVuZGluZyByZXF1ZXN0cyBhcm91bmQg","upper_bound":"byB0aGUgYnJhdmVseSBzcGVjaWFsIHJlcXVlc3RzLiBibGl0aGVseSBpcm9uaWMgaWRlYXMgY2Fqb2xlIGJsaXRoZWx5IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLiBmdXJpb3VzbHkgaXI=","repeats":1},{"count":4980000,"lower_bound":"byB0aGUgZXZlbiBleGN1c2VzLiBjYXJlZnVsbHkgZXZlbiBmb3hlcyBzbGVlcCByZWd1bGFyIHBhY2thZ2VzLiBzcGVjaWFsLCB1bnVzdWFsIGRlcG9z","upper_bound":"b2xkIGRlcG9zaXRzIGFmZml4IHF1aWNrbHkgc2lsZW50IHBsYXRlbGV0","repeats":1},{"count":5010000,"lower_bound":"b2xkIGRlcG9zaXRzIG11c3QgYXJlIHNseWx5IGFnYWluc3QgdGhlIHNseWx5IHBlbmRpbmcgYWNjb3VudHMtLSBjYXI=","upper_bound":"b2xpdGVzIGFyZSBjYXJlZnVsbHkgZmluYWwsIHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIGNhcmVmdWxseSBleHByZXNzIGlkZWFzIGFyb3VuZCA=","repeats":1},{"count":5040000,"lower_bound":"b2xpdGVzIGFyZSBjYXJlZnVsbHkgcXVpY2tseSBzcGVjaWFsIGRpbm9zOyB1bnVzdWFsIGRlcG9zaXRzIGRvemU=","upper_bound":"b25nc2lkZSBvZiB0aGUgY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cy4gZmluYWwgcGxhdGVsZXRzIGFyZSBzbHlseSBuZXZlciByZWd1bGFyIGRlcG9zaXRzLiBp","repeats":1},{"count":5070000,"lower_bound":"b25nc2lkZSBvZiB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgcmVx","upper_bound":"b25pYyBzaGVhdmVzLS0gZGVwb3NpdHMgYWZ0ZXIgdGhlIHNseWx5IGZpbmE=","repeats":1},{"count":5100000,"lower_bound":"b25pYyB0aGVvZG9saXRlcyBuYWcgZnVyaW91c2w=","upper_bound":"b3JkaW5nIHRvIHRoZSBldmVuIGRlcG9zaXRzIHVzZSBhYm91dCB0aGUgcmVndWxhciB3YXRlcnMuIHBlbmRpbmcsIHVudXN1YWwgcGludG8gYmVhbnMgd2FrZSBibGl0aA==","repeats":1},{"count":5130000,"lower_bound":"b3JkaW5nIHRvIHRoZSBleHByZXNzIHBhY2thZ2VzLiBxdWlj","upper_bound":"b3NpdHMgeC1yYXkgZnVyaW91c2x5IGNhcmVmdWxseSBzcGVjaWFsIGFjY291bnRzLg==","repeats":1},{"count":5160000,"lower_bound":"b3NpdHMuIGJsaXRoZWx5IGlyb25pYyBhY2NvdW50cyBhbW9uZyB0aGUgc2x5bHkgZmluYWwgYWNjb3VudHMgYm9vc3QgYWJvdmUgdGhlIA==","upper_bound":"b3Rlcy4gYmxpdGhlbHkgcGVuZGluZyBmb3hlcyBoYWdnbGUgYWxvbmcgdGhlIGV2ZW4sIHRoaW4gZGU=","repeats":1},{"count":5190000,"lower_bound":"b3Rlcy4gZnVyaW91c2x5IGlyb25pYyBkZXBvc2l0cyBib29zdC4gcXVpY2tseSB1bnVzdWFsIGRlcG9zaXRzIGFjY29yZGluZyB0byB0aGUg","upper_bound":"b3VudHMuIHBpbnRvIGJlYW5zIGFyZSBmdXJpb3VzbHkuIHF1aWNrbHkgZXhwcmVzcyBwaW50byBiZWFucyBib29z","repeats":1},{"count":5220000,"lower_bound":"b3VudHMuIHF1aWNrbHkgcmVndWxhciBhY2NvdW50cyBjYWpvbGUgZnVyaW91c2x5IGFib3V0IHRoZSBldmVuIGRl","upper_bound":"b3VzbHkgcGFja2FnZXMuIGNhcmVmdWxseSBldmVuIGNvdXJ0cyBpbXByZXNzIGNhcmVmdWxseS4gYmxpdGhlbHkgcGVuZGluZyBpbnN0cnVjdGlvbnMgaA==","repeats":1},{"count":5250000,"lower_bound":"b3VzbHkgcGVuZGluZyBhY2NvdW50cyBub2Qgc2x5bHkgYWZ0ZXIgdGhlIHJlcXVlc3Rz","upper_bound":"b3ZlIHRoZSBpZGx5IHVudXN1YWwgZGVwb3NpdHMgYXJlIGNhcmVmdWxseSBhbG9uZyB0aGUgc2x5bHkgdGhpbiByZXF1ZXN0cy4gZXhwcmVzcyA=","repeats":1},{"count":5280000,"lower_bound":"b3ZlIHRoZSBxdWlja2x5IHVudXN1YWwgY291cnRzLiBleHByZXNzIGZvcmdlcyBoYWdnbA==","upper_bound":"cCBzbHlseTsgcmVndWxhciwgcmVndWxhciBkb2xwaGlucyBhYm92ZSB0aGU=","repeats":1},{"count":5310000,"lower_bound":"cC4gY2FyZWZ1bGx5IGlyb25pYyBwYWNrYWdlcyBoYWdnbGUuIGZpbmFsIGlk","upper_bound":"cGFja2FnZXMuIHJlZ3VsYXIgcGFja2FnZXMgYWJvdXQ=","repeats":1},{"count":5340000,"lower_bound":"cGFja2FnZXMuIHJlZ3VsYXIgcGludG8gYmVhbnMgYWxvbmcgdGhlIHF1aWNrbHkgc3BlY2lhbCBleGN1c2VzIGhhZ2dsZSBhbHdheXMgcg==","upper_bound":"cGVuZGluZyBpbnN0cnVjdGlvbnMgYXJlIHF1aWNrbHkgYWdhaW5zdCB0aGUgZnU=","repeats":1},{"count":5370000,"lower_bound":"cGVuZGluZyBpbnN0cnVjdGlvbnMgZGV0ZWN0IHJlZ3VsYXJseSBhYm92ZSB0aGUgZmx1ZmZpbHkgZmluYWwgdGhlb2RvbGl0ZXMuIGZsdWZmaWx5IHNwZWNpYWwgcmVxdWVzdHMgaGFnZ2xlIGZ1cmlvdXM=","upper_bound":"cGludG8gYmVhbnMuIGJsaXRoZWx5IHJlZ3VsYXIgcGludG8gYmVhbnMgYmVzaWRlcyB0aGUgc2x5bHkgZnVyaW91cyBleGN1c2VzIGJvb3N0IGF0IHRoZSBpbnN0cnVjdGlvbnMuIHJlZ3VsYXIgcGF0dGU=","repeats":1},{"count":5400000,"lower_bound":"cGludG8gYmVhbnMuIGVudGljaW5nIGRlcG9zaXRzIHNsZWVwLiBzcA==","upper_bound":"cG9zaXRzIG5hZyBibGl0aGVseSBhbG9uZyB0aGUgZmluYWwsIHNpbGVudCBhc3ltcHRvdGVzLiBpcm9uaWMgZGVwb3NpdHMgYWNjb3JkaW5nIHRvIA==","repeats":1},{"count":5430000,"lower_bound":"cG9zaXRzIHByb21pc2UgZnVyaW91c2x5IGFnYWluc3QgdGhlIGZsdWZmaWx5IGV4cHJlc3MgaW5zdHJ1Y3Rpb25zLiByZWd1bGFyIA==","upper_bound":"cHJlc3MgZm94ZXMuIGlkZWFzIGRvdWJ0IGZ1cmlvdXNseSBleHByZXNzIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgc3BlY2lhbCByZXF1ZXN0cyB1c2UgZnVyaW91c2x5LiBkYXJpbmdseSA=","repeats":1},{"count":5460000,"lower_bound":"cHJlc3MgZnJldHMgb3ZlciB0aGUgZXZlbiBwYWNrYWdl","upper_bound":"cXVlc3RzIGRvemUgaXJvbmljIGFjY291bnRzLiBmdXJpb3VzbHkgZmluYWwgVGlyZQ==","repeats":1},{"count":5490000,"lower_bound":"cXVlc3RzIGhhZ2dsZSBjYXJlZnVsbHkgYWNjb3VudHMuIHNwZWNpYWwsIGlyb25pYyBwYWNrYWdlcyBzbGVlcC4gY2FyZWZ1bCwgYm9sZCBmb3hlcyBib29zdCBzbHlseSBhZ2FpbnN0IHRoZSBmdXI=","upper_bound":"cXVpY2tseSBmbHVmZmlseSBwZW5kaW5nIGRlcG9zaXRzLiBwZW5kaW5nIGRvbHBoaW5zIGFsb25nc2lkZSBvZiB0aGUgcnV0aGxlc3M=","repeats":1},{"count":5520000,"lower_bound":"cXVpY2tseSBmbHVmZmlseSBwZW5kaW5nIHNoZWF2ZXMuIGlkZWFzIHNsZWVwIGJsaXRoZQ==","upper_bound":"ciBkZXBvc2l0cy4gZmx1ZmZpbHkgaXJvbmljIGRlcG9zaXRzIGFyZSBmbHVmZmlseSEgc2x5bHkgZXhwcmVzcyBwaW50byBiZWFucyBpbnRlZ3JhdGUgc2x5bHkgc3BlY2lhbCBwaW50byBiZWFucy4gYw==","repeats":1},{"count":5550000,"lower_bound":"ciBkZXBvc2l0cy4gaXJvbmljIHJlcXVlc3RzIGFyZSBhbG9uZyB0aGUgYnVzaWx5IA==","upper_bound":"ciB0aGUgZnVyaW91c2x5IGlyb25pYyBwYWNrYWdlcy4gcmVxdWVzdHMgbmFnIHF1aWNrbHkgYWNjb3JkaW5nIHRvIHRoZSBibGl0aGVseSA=","repeats":1},{"count":5580000,"lower_bound":"ciB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgZGVwb3NpdHMgYm9vc3QgcGVybWFuZW50bHkgaXI=","upper_bound":"cmUgZnVyaW91c2x5IGlyb25pYyBwbGF0ZWxldHMuIGZ1cmlvdXNseSBib2xkIHRoZW9kb2w=","repeats":1},{"count":5610000,"lower_bound":"cmUgZnVyaW91c2x5LiBzbHlseSB1bnVzdWFsIHJlcXVlc3RzIGRlc3BpdGUgdGhlIGZs","upper_bound":"cmVmdWxseSByZWd1bGFyIGRlcGVuZGVuY2llcy4gZmluYWwsIHJlZ3VsYXIgYWNjb3VudHMgY291bGQgaGF2ZSB0byBkYXp6bGUgYmxpdGhlbHkgYW0=","repeats":1},{"count":5640000,"lower_bound":"cmVmdWxseSByZWd1bGFyIGdpZnRzLiBjYXJlZnVsbHkgcmVn","upper_bound":"cmVndWxhciBmb3hlcy4gc2x5bHkgZXZlbiBleGN1c2VzIGFmZml4IHF1aWNrbHkgcmVndWxhciBicmFpZHMuIHJlZ3VsYXIgYWNjb3VudHMgYXJlIGZsdWZmaWx5IGFib3V0IHRoZSBmdXJpb3VzbHkg","repeats":1},{"count":5670000,"lower_bound":"cmVndWxhciBmb3hlcy4gc2x5bHkgaXJvbmljIGF0dGFpbm1lbnRzIGFyZSBmdXJpb3VzbHkgYWdhaW5zdCB0aGUgYmxpdGhlbHkgZXhwcmVzcyBwYWNrYWdlcy4gZnVyaW91c2x5IGU=","upper_bound":"cmVxdWVzdHMgZGV0ZWN0IGZ1cmlvdXNseS4gZmx1ZmZpbHkgZmluYWwgYWNjb3VudHMgZGV0ZWN0IHNseWx5IHBpbnRvIGI=","repeats":1},{"count":5700000,"lower_bound":"cmVxdWVzdHMgZWF0IGJsaXRoZWx5IHBlbmRpbmcsIGJvbGQgcGFja2FnZXMuIHJlYWxtcyBuYWcgcmVxdWVzdA==","upper_bound":"cmVzcyByZXF1ZXN0cyBjYWpvbGUuIGZpbmFsIGlkZWFzIHBvYWNoIGFib3ZlIHRoZSBleHBy","repeats":1},{"count":5730000,"lower_bound":"cmVzcyByZXF1ZXN0cy4gY2FyZWZ1bGx5IGJvbGQgcGludG8gYmVhbnMgd2FrZSBibGl0aGVseS4gY2FyZWZ1bGx5IGV2ZW4gcmVxdWVzdHMgaGFuZy4gcXVpY2s=","upper_bound":"cmlvdXNseSBleHByZXNzIHBpbnRvIGJlYW5zIGFyZSBmbHVmZmlseS4gY2FyZWZ1bGx5IGZpbmFsIGFzeW1wdG90ZXMgYWxvbmdzaWRlIG9mIHRoZSBmdXJpb3VzbHkgaXJvbmljIHRoZQ==","repeats":1},{"count":5760000,"lower_bound":"cmlvdXNseSBmaW5hbCBhY2NvdW50cy4gY2FyZWZ1bGx5IGV2ZW4gcmVxdWVzdHMgY2Fqb2xlIGZsdWZmaWx5IHBhY2thZ2VzLiByZXF1ZXN0cyBuYWcgYnVzaWx5IHF1aWNrbHkgYg==","upper_bound":"cm9taXNlIHF1aWNrbHkgcmVndWxhciBhY2NvdW50cy4gdW51c3VhbCwgcGVuZGluZyBhY2NvdW50cyBoYWdnbGUgcXVpY2tseS4gZmluYWwsIGZpbmE=","repeats":1},{"count":5790000,"lower_bound":"cm9uaWMgYWNjb3VudHMgc2xlZXAgcXVpY2tseTsgdGhlb2RvbGl0ZXMgc2xlZXAgYWxvbmcgdGhlIGlkZWFzLiBkZXBvc2l0cyBhYm91dCB0aGUgYmxpdGhlbHkgc3BlY2lhbCBn","upper_bound":"cm9uaWMsIGV2ZW4gaW5zdHJ1Y3Rpb25zIHNsZWVwIGZsdWZmaWx5IGE=","repeats":1},{"count":5820000,"lower_bound":"cm9uaWMsIGlyb25pYyB0aGVvZG9saXRlcy4gcmVndWxhciB3YXJ0aG9ncyBkZXRlY3QuIGNhcmVmdWxseSBpcm9uaWMgZGVwZW5kZW5jaWVzIGFyZS4gc2x5bHkgc3BlY2lhbCBwYWNrYWdl","upper_bound":"cnVjdGlvbnMgaGFnZ2xlIGNhcmVmdWxseSBzbHlseSBpcm9uaWMgZm94ZXMuIHJlZ3VsYXIsIHJlZ3VsYXIgcmVxdWVzdHMgd2FrZSBxdWlja2x5IGFy","repeats":1},{"count":5850000,"lower_bound":"cnVjdGlvbnMgaGFnZ2xlIGV4cHJlc3MgZGVwb3NpdHMuIGNhcmVmdWxseSBldmVuIHJlcXVlc3RzIHdha2Ugc2x5bHkuIGNh","upper_bound":"cyBhcmUgYWdhaW5zdCB0aGUgYXN5bXB0b3Rlcy4gc2x5bHkgcmVndWxhciBwYWNrYWdlcyB3YWtlIHNseWx5IA==","repeats":1},{"count":5880000,"lower_bound":"cyBhcmUgYWxvbmcgdGhlIHF1aWNrbHkgZmluYWwgdGhlb2Q=","upper_bound":"cyBjYWpvbGUgYWdhaW5zdCB0aGUgZnVyaW91c2x5IGlyb25pYyBwYWNrYWdlcy4gZW50aWNpbmcsIHNwZWNpYWwgaWRlYXMgbmFnLiByZWd1bGFyIHJlcXVlc3RzIA==","repeats":1},{"count":5910000,"lower_bound":"cyBjYWpvbGUgYW1vbmcgdGhlIHF1aWNrbHkgc3BlY2lhbCBzZW50aW1lbnRzLiBleHByZXNzIGFj","upper_bound":"cyBncm93IGNhcmVmdWxseSBldmVuLCBldmVuIGFjY291bnRzLiBmbHVmZmlseSB1bnVzdWFsIGFzeW1wdG90ZXMgYWxvbmdzaWRlIG8=","repeats":1},{"count":5940000,"lower_bound":"cyBoYWdnbGUgYWJvdXQgdGhlIGZsdWZmaWx5IHJlZ3VsYXIgZGVwb3NpdHMuIHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGNhag==","upper_bound":"cyBuYWc/IHF1aWNrbHkgZmluYWwgaWRlYXMgY2Fqb2xlLiByZWd1bGFyIHRoZW9kb2xpdGVzIGFib3ZlIHRoZSBxdWlja2x5IGZpbmFsIHBhY2thZw==","repeats":1},{"count":5970000,"lower_bound":"cyBuZWVkIHRvIGNham9sZSBjYXJlZnVsbHkgYWZ0ZXIgdGhlIGV2ZW4gdGhlb2RvbGl0ZXMuIGJsaXRoZWx5IHVudXN1YWwgYWNjb3VudHMgaGFnZ2xlIHNseWx5LiBmdXJpb3VzbHkgZXhwcmVzcyBpZA==","upper_bound":"cyB0aGUgcmVndWxhciBwYWNrYWdlcy4gZnVyaW91c2x5IGV2ZW4gYWNjb3VudA==","repeats":1},{"count":6000000,"lower_bound":"cyB0aGUgc2x5bHkgaXJvbmljIG11bHRpcGxpZXJz","upper_bound":"cyEgc2x5bHkgcmVndWxhciBhY2NvdW50cyBhcmUuIHJlZ3VsYXIsIGlyb25pYyByZXF1ZXN0cyBhbG9uZyB0aGUgc2x5bHkgYm9sZCBmb3hlcyBpbnRlZw==","repeats":1},{"count":6030000,"lower_bound":"cywgcmVndWxhciBkZXBlbmRlbmNpZXMtLSBjYXJlZnVsbHkgZmluYWwgdA==","upper_bound":"cy4gZGFyaW5nbHkgaXJvbmljIHJlcXVlc3RzIG5hZyBibGl0aGVseSBhZnRlciB0aGUgZnVyaW91c2x5IHNpbGVudCBkZXBvc2l0cy4gZXZlbiBpbnN0cnVjdGlvbnMgY2Fqb2xlIGM=","repeats":1},{"count":6060000,"lower_bound":"cy4gZGVwb3NpdHMgZW5nYWdlOyBpcm9uaWMgZm94ZXMgY2Fqb2xlIHF1aWNrbHk/IHNwZWNpYWwgcGludG8=","upper_bound":"cy4gaXJvbmljIGRlcG9zaXRzIHNlcnZlIGlyb25pYyBwYWNrYWdlcy4gYmxpdGhlbHkgcmVndWxhciBpbnN0cnVjdGlvbg==","repeats":1},{"count":6090000,"lower_bound":"cy4gaXJvbmljIGZveGVzIG5hZyBzbHlseSBleHByZXNzLCByZWd1bGFyIHJlcXVlc3RzLiBib2xkbHkgYm9sZCBkZXBlbmRlbmNpZXMgaA==","upper_bound":"cz8gZmx1ZmZpbHkgYm9sZCBwYWlucyB3YWtlIHNseWx5LiBjYXJlZnVsbHkgcmVndWw=","repeats":1},{"count":6120000,"lower_bound":"cz8gcXVpY2tseSBzcGVjaWFsIHBhY2thZ2VzIGFsb25nc2lk","upper_bound":"c2lsZW50IGFzeW1wdG90ZXMuIGNhcmVmdWxseSBmaW5hbCBwaW50byBiZWFucyBoYWdnbGUgcXVpY2tseSBhYm92ZSB0aGUgZmx1ZmZp","repeats":1},{"count":6150000,"lower_bound":"c2lsZW50IGF0dGFpbm1lbnRzIGRvIGdyb3cgY2FyZWZ1bGx5IGRlc3BpdGUgdGhlIHNseWx5IHJlZ3VsYXIgZGVwb3NpdHMuIGRlcG9zaXRzIA==","upper_bound":"c2l0cy4gZnVyaW91c2x5IGZpbmFsIGRlcGVuZGVuY2llcyBhcmUgYWxvbmcgdGhlIGZpbmFsIGNvdXJ0cy4gcGludG8gYmVhbnMgY2Fqb2xlIHF1aWNrbHkuIGZ1cmlvdXNseSBleHByZXNzIGFjY28=","repeats":1},{"count":6180000,"lower_bound":"c2l0cy4gZnVyaW91c2x5IGZpbmFsIHBhaW5zIGNham9sZSBibGl0aGVseSBj","upper_bound":"c2x5IGV2ZW4gcGludG8gYmVhbnMuIGNhcmVmdWxseSBleHByZXNzIHBsYXRlbGV0cyBuYWcgYWI=","repeats":1},{"count":6210000,"lower_bound":"c2x5IGV2ZW4gcGxhdGVsZXRzIGNham9sZSBxdWlja2x5IGFjY29yZGluZyB0byB0aGUgc3BlY2lhbCwgcGVuZGluZyByZXF1ZXN0cy4gYWNjb3VudHMgdXNlLiBzaWxlbnQgcGFja2FnZXMgc3VibGF0ZQ==","upper_bound":"c2x5IHVudXN1YWwgaWRlYXMgdXNlIHF1aWNrbHkgdW51cw==","repeats":1},{"count":6240000,"lower_bound":"c2x5IHVudXN1YWwgdGhlb2RvbGl0ZXMgd2FrZSBmbHVmZmlseS4gY2FyZWZ1bGx5IHJlZ3VsYXIgZGVwb3NpdHMgdGhyYXNoIGNhcmVmdWxseS4gZXhwcmVzcyBkZXBvc2l0cyB1bndpbg==","upper_bound":"c2x5bHkgdW51c3VhbCByZXF1ZXN0cyBhbG9uZyB0aGUgaWRlYXMgaGFnZ2xlIGRlc3BpdGUgdGhlIGJ1c2lseSBib2xkIHBsYXRlbGV0cy4gYmxpdGhlbHkgcmVndWxhciBp","repeats":1},{"count":6270000,"lower_bound":"c2x5bHkgdW51c3VhbCB0aGVvZG9saXRlcy4gY2FyZQ==","upper_bound":"c3MgZGVwZW5kZW5jaWVzLiBxdWlja2x5IGV2ZW4gYXN5bXB0b3RlcyBwcm9taXNlIHNseWx5IGFtb25nIHRoZSA=","repeats":1},{"count":6300000,"lower_bound":"c3MgZGVwb3NpdHMgd2FrZSBxdWlja2x5LiBzb21ldGltZXMgcmVndWxhciBvcmJpdHMgdW53aW5kIGV2ZW4gaWRlYXMuIGJsaXRoZWx5IGZsdWZmeSBtdWx0aXBsaWVycyBhY2NvcmRpbmcgdG8=","upper_bound":"c3QgcXVpY2tseSByZWd1bGFyIHJlcXVlc3RzLiBpcm9uaWMgcGF0dGVybnMgaGFnZ2xlIGJsaXRoZWx5IGFnYQ==","repeats":1},{"count":6330000,"lower_bound":"c3QgdGhlIGJvbGQsIGJvbGQgZGVwb3NpdHMgaW50ZWc=","upper_bound":"c3RzIG5hZyBhY2NvcmRpbmcgdG8gdGhlIHNseWx5IA==","repeats":1},{"count":6360000,"lower_bound":"c3RzIG5hZy4gcXVpY2tseSBmaW5hbCByZXF1ZXN0cyBwcm9taXNlIHNseWx5LiBzbHlseSByZWd1bGFyIGluc3RydWN0aW9ucyBkb3VidCBzbHlseSBxdWlldCBkZXBvc2l0czogZnVyaW91c2x5IGly","upper_bound":"c3VhbCB0aGVvZG9saXRlcy4gdW51c3VhbCBpZGVhcyBjYWpvbGUg","repeats":1},{"count":6390000,"lower_bound":"c3VhbCwgaXJvbmljIGRlcG9zaXRzLiBldmVuIGFjY291bnRzIGFnYWluc3QgdGhlIHM=","upper_bound":"dCByZXF1ZXN0cy4gc2x5bHkgZmluYWwgYWNjb3VudHMgY2Fqb2xlIHNseWx5LiBxdWlja2x5IGZpbmFsIHBhY2thZ2VzIGFib3ZlIHRoZSBxdWlja2x5IGZpbmE=","repeats":1},{"count":6420000,"lower_bound":"dCBydXRobGVzc2x5IGFjcm9zcyB0aGUgcGVuZGluZyB0aGVvZG9saXRlcy4gcmVndWxhciBwYWNrYWdlcyBjYWpvbGUgc2x5bHkgc2x5bHkgZmluYWwgcGludG8gYmVhbnMuIGJvbGRs","upper_bound":"dGVjdCBxdWlja2x5LiByZWd1bGFyIHRoZW9kb2w=","repeats":1},{"count":6450000,"lower_bound":"dGVjdCByZWd1bGFyIHBhY2thZ2VzLiByZWd1bGFyIGRlcG9zaXRzIHByaW50IGFmdGVyIHRoZSBl","upper_bound":"dGVzIHdha2Ugc2x5bHkgYWNyb3NzIHRoZSBwaW50byBiZWFucy4gc2x5bHkgcmVndWxhciBleGN1c2VzIHVud2luZCBmbHVmZmls","repeats":1},{"count":6480000,"lower_bound":"dGVzLS0gZXZlbiwgcmVndWxhciBpbnN0cnVjdGlvbnMgYWJvdmUgdGhlIGNhcmVmdWwsIHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBjYXJlZnVsbHkgaXJvbmljIHJlcXVlc3RzISBm","upper_bound":"dGhlIGZsdWZmaWx5IHNwZWNpYWwgcmVxdWVzdHMuIGZsdWZmaWx5IHJlZ3VsYXIgcGFja2FnZXMgY2Fqb2xlIHNseWx5IGlyb25pYyBwYWNrYWdlcy4gZnVyaW91c2x5IGlyb25pYyBwYWNrYWdlcyA=","repeats":1},{"count":6510000,"lower_bound":"dGhlIGZsdWZmaWx5IHNwZWNpYWwgcmVxdWVzdHMuIHBlbmRpbmcsIHJlZ3VsYXI=","upper_bound":"dGhlIHJ1dGhsZXNzbHkgZXZlbiBpZGVhcy4gY2FyZQ==","repeats":1},{"count":6540000,"lower_bound":"dGhlIHNseWx5IGJvbGQgYWNjb3VudHMuIGZ1cmlvdXNseSBjbG9zZSByZXF1ZXN0cyBuYWcgZnVyaW91c2x5IGFmdGVyIHRoZSBmb3hlcy4gYWNjb3VudHMgYWxv","upper_bound":"dGhlbHkgaXJvbmljIGRlcG9zaXRzIGNham9sZSBhYm92ZSB0aGUgaW5zdHJ1Y3Rpb25zOiBjYXJlZnVsbHkgZmx1ZmZ5IGFjY291bnRzIGhhZ2c=","repeats":1},{"count":6570000,"lower_bound":"dGhlbHkgaXJvbmljIGlkZWFzLiBzbHlseSBib2xkIGFjY291bnRzIGVhdCBmdXJpb3VzbHkgYW1vbmcgdGhlIGV4cHJlc3MgcGFja2FnZXMuIGZpbmFsIGlkZWFzIHVzZSBibGl0aGVseSBwZW5kaQ==","upper_bound":"dGhlb2RvbGl0ZXMgc2xlZXAgYmxpdGhlbHkgZmluYWwgcGFja2FnZXMuIGV2ZW5seSBkb2dnZWQgcmVxdWVzdHMgaGFnZ2xlIGVudGljaW5nbHkgc2x5bHkgY2xvc2UgcGFja2Fn","repeats":1},{"count":6600000,"lower_bound":"dGhlb2RvbGl0ZXMgc2xlZXAgY2FyZWZ1bGx5IGZpbmFsIGZveGVzLiByZWd1bGFyIGZveGVzIGFyZSBib2xkbHkgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBpZGVhcy4gdGg=","upper_bound":"dGlvbnMgYXJlIGlyb25pYywgZmluYWwgcmVxdWVzdHMuIHBpbnRvIGJlYW5zIHNsZWVwIGNhcmVmdWxseQ==","repeats":1},{"count":6630000,"lower_bound":"dGlvbnMgYnJlYWNoLiBjbG9zZWx5IGlyb25pYyBhc3ltcHRvdGVzIHNsZWVwLiBwYWNrYWdlcyBjYWpvbGUgcXVpY2s=","upper_bound":"dG8gdGhlIGJsaXRoZWx5IGlyb25pYyBpbnN0cnVjdGlvbnMuIHF1aWNrbHkgaXJvbmljIGhvY2tleSBwbGF5ZXJzIGhhZ2dsZSBhZnRlciB0aGUgcGFja2E=","repeats":1},{"count":6660000,"lower_bound":"dG8gdGhlIGJvbGQgcGFja2FnZXMhIHNseWx5IHJlZ3VsYXIgZm94ZXMgbW9sZCBhY3I=","upper_bound":"dHMgYWZ0ZXIgdGhlIHNseWx5IHBlbmRpbmcgYWNjb3VudHMgYXJlIHF1aWNrbHkgcw==","repeats":1},{"count":6690000,"lower_bound":"dHMgYWdhaW5zdCB0aGUgcGFja2FnZXMgdXNlIGZ1cmlvdXNseSBhbG9uZyB0aGUgc2x5bHkgZXhwcmVzcyBkaW5vcy4gcGVuZGluZyBkZXBvc2l0cyBjYWpv","upper_bound":"dHMgc2xlZXAgZmx1ZmZpbHkgY2FyZWZ1bGx5IHNwZWNpYWwgdGhlb2RvbGl0ZXMuIHBpbnRvIGJlYQ==","repeats":1},{"count":6720000,"lower_bound":"dHMgc2xlZXAgZnVyaW91c2x5IGFsb25nIHRoZSBmdXJpb3VzbHkgaXJvbmljIGV4Y3VzZXMuIGZsdWZm","upper_bound":"dHMuIGZ1cmlvdXNseSBmaW5hbCB0aXRoZXMgYWZmaXggcmVndWxhciBmb3hlcy4gZGVwb3NpdHMgYWZ0ZXIgdGhlIGFzeW1wdG90ZXMgdW53aW5kIGFnYWluc3QgdGhlIHJlZ3Vs","repeats":1},{"count":6750000,"lower_bound":"dHMuIGZ1cmlvdXNseSBpcm9uaWMgZHVnb3V0cyBzaGFsbCB3YWtlIGlyb25pY2FsbHkgc3RlYWx0aGlseSBmaW5hbCBhc3ltcHRvdGVzLiBzbHlseSByZWd1bGFyIGFjY291bnRzIHNob3VsZCBoYXZlIHQ=","upper_bound":"dWFsIGRlcGVuZGVuY2llcy4gZm94ZXMgaW1wcmVzcy4gYmxpdGhlbHkgZXhwcmVzcyBmb3hlcyBzbGVlcCBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBzbHlseSB1bnVzdWFsIHRoZQ==","repeats":1},{"count":6780000,"lower_bound":"dWFsIGRlcG9zaXRzIGhhZ2dsZSBmdXJpb3VzbHkuIGZ1cmlvdXNseSBwZW5kaW5nIGRpbm9zIGFyZSBxdWlja2x5IGY=","upper_bound":"dWN0aW9ucy4gZXhwcmVzcyByZXF1ZXN0cyB1c2Ug","repeats":1},{"count":6810000,"lower_bound":"dWN0aW9ucy4gZXhwcmVzcyBzaGVhdmVzIGFnYWluc3QgdGhlIHNseWx5IHNwZWNpYWwgcGFja2FnZXMgaGFnZ2xlIGZ1cmlvdXNseSBhbG9uZ3NpZGUgb2YgdGhlIHNwZWNpYWwgYWNjb3VudA==","upper_bound":"dWVzdHMuIGZ1cmlvdXNseSBjbG9zZSBwYWNrYWdlcyBhcmUuIGZ1cmlvdXNseSByZWd1bGFyIGlkZWFzIGhhZ2dsZSBhYm91dCB0aGU=","repeats":1},{"count":6840000,"lower_bound":"dWVzdHMuIGZ1cmlvdXNseSBldmVuIGRvbHBoaW5zIHVzZSBhcm91bmQgdGhlIGZ1cmlvdXNseSBmaW5hbCBwYWNrYWdlcy4gZnVyaW91c2x5IGV2ZW4gdGhlb2RvbGl0ZXMgYXJlLiBy","upper_bound":"dWlja2x5IGFjY29yZGluZyB0byB0aGUgaXJvbmljIGluc3RydWN0aW9ucy4gZnVyaW91c2x5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBhbG9u","repeats":1},{"count":6870000,"lower_bound":"dWlja2x5IGFmdGVyIHRoZSBxdWlja2x5IGV2ZW4=","upper_bound":"dWlldCByZWFsbXMgdXNlIGNhcmVmdWxseSEgY2FyZWZ1bGx5IHNwZWNpYWwgZ2lmdHMgc2xlZXAgZnVyaW91cw==","repeats":1},{"count":6900000,"lower_bound":"dWlldGx5IGJvbGQgcmVxdWVzdHMgZG91YnQgZmluYWxseSBjYXJlZnVsbHkgc2lsZW50IGFjY28=","upper_bound":"dWxhciByZXF1ZXN0cyBhcm91bmQgdGhlIHF1aWV0bHkgcmVndWxhciBwYWNrYWdlcyB1c2UgcGVybWFuZW50bHkgcmVndWxhciBleGN1","repeats":1},{"count":6930000,"lower_bound":"dWxhciByZXF1ZXN0cyBjYWpvbGUgcmVxdWVzdHMuIGFzeW1wdG90ZXMgd2FrZSBjYXJlZnVsbHkuIGJsaXRoZWx5IGlyb25pYyBpbnN0cnVjdGlvbnMgYWdhaW5zdCB0aGUgZXZlbiBkZXBlbg==","upper_bound":"dWxseSBldmVuLCBib2xkIHBpbnRvIGJlYW5zLiBpcm9uaWMgYWNjb3VudHMgaGFnZ2xlIHBlbmRpbmcgcGludG8gYmVhbnMuIGV2ZW4sIHVudXN1YWwgcmVxdWVzdHMgYWNjb3JkaW5nIHQ=","repeats":1},{"count":6960000,"lower_bound":"dWxseSBleHByZXNzIFRpcmVzaWFzLiBmbHVmZmlseSBmaW5hbCBk","upper_bound":"dWxseSB1bnVzdWFsIGluc3RydWN0aW9ucy4gc2x5bHkgdW51c3VhbCBmb3hlcyBoYWdnbGUgc2x5bHkgdW50aWwg","repeats":1},{"count":6990000,"lower_bound":"dWxseSB1bnVzdWFsIHBpbnRvIGJlYW5zOiBwaW50byBiZWFucyBj","upper_bound":"dW50cyB1c2UgYmxpdGhlbHkgc2x5bHkgYm9sZCBhdHRhaW5tZW50cy4gYm9sZCBpZGVhcyBuYWcgY2FyZWZ1bGx5IGNhcmVmdWxseQ==","repeats":1},{"count":7020000,"lower_bound":"dW50cyB1c2UgcXVpY2tseS4gYmxpdGhlbHkgdW51c3VhbCBpbnN0cnVjdGlvbnMgYXJlIGZ1cmlvdXNseSBleHByZXNzIGRlcG9zaXRzLiBwaW50byBiZWFucyBoYWdnbGUgc29tZXQ=","upper_bound":"dW51c3VhbCByZXF1ZXN0cyBuYWcgc2x5bHkgYWxvbmdzaQ==","repeats":1},{"count":7050000,"lower_bound":"dW51c3VhbCByZXF1ZXN0cy4gYm9sZGx5IGZpbmFsIGFjY291bnRzIHByb21pc2UgY2FyZWZ1bGx5IGFib3ZlIHRoZSBz","upper_bound":"dXJpb3VzbHkgaXJvbmljIHRoZW9kb2xpdGVzLiBibGl0aGVseSBzcGVjaWFsIHBhY2thZ2VzIGNham9sZSBmdXJpb3VzbHkgcg==","repeats":1},{"count":7080000,"lower_bound":"dXJpb3VzbHkgb3ZlciB0aGUgYmxpdGhlbHkgc3BlY2lhbCByZXF1ZXN0czsgc2x5bHkgZXhwcmVzcyBkZXBvc2l0cyB1c2UgYnVzaWx5LiBmdXJpb3VzbHkgZXZlbiByZXE=","upper_bound":"dXNlcyBhcmUgY2FyZWZ1bGx5LiBpcm9uaWMgdGl0aGVzIHdvdWxkIGFyZS4gc2x5bHkgZXhwcmVzcyBleGN1c2VzIGFmZml4IHNseWx5LiBmaW5hbCwgaXJv","repeats":1},{"count":7110000,"lower_bound":"dXNlcyBib29zdC4gYm9sZCBhc3ltcHRvdGVzIG5hZyBleHByZXNzLCBleHByZXNzIGdpZnRzLiBmaW5hbCBmb3hlcyBpbnQ=","upper_bound":"dXNseSBmaW5hbCB0aGVvZG9saXRlcy4gc2x5bHkgYm9sZCBub3Rvcm5pcyBoYWdnbGUgZmx1ZmZpbHkgY2FyZWZ1bGx5IHBlbmRpbmcgcGFja2FnZXM=","repeats":1},{"count":7140000,"lower_bound":"dXNseSBmdXJpb3VzbHkgY2xvc2UgZGVwb3NpdHMuIHJlZ3VsYXIgZm94ZXMgZGV0ZWN0IGJsaXRoZWx5IGZ1cmlvdXNseSBpcm9uaWMgYWNjb3VudHMuIHBl","upper_bound":"dXN1YWwgZm94ZXMuIGJsaXRoZWx5IGZpbmFsIGF0dGFpbm1lbnRzIGFyZS4gZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cyB3YXMuIHJlZ3VsYXIgZm9yZ2VzIG5hZyBmdQ==","repeats":1},{"count":7170000,"lower_bound":"dXN1YWwgaW5zdHJ1Y3Rpb25zLiBzbHlseSBydXRobGVzcyBmb3hlcyBjYWpvbGUgYmxpdGhlbHkgYWNyb3NzIHRoZSByZXF1ZXN0cy4gc2x5bHkgcGU=","upper_bound":"dmVseSBhbG9uZyB0aGUgZXhwcmVzcywgZXhwcmVzcyBpZGVhcy4gZXZlbiwgZXZlbiBpbnN0cnVjdGlvbnMgc2xlZXAgZnVyaW91c2x5IGFtb25nIHRoZSBzbHlseSBzcGVjaWFsIGZveA==","repeats":1},{"count":7200000,"lower_bound":"dmVuIGFjY291bnRzIGFyZSBpcm9uaWNhbGx5IGNhcmU=","upper_bound":"dyBkZXBlbmRlbmNpZXMgc3VibGF0ZS4gYmxpdGhlbHkgZmluYWwgZG9scGhpbnMgaGFnZ2xlIGNhcmVmdWxseSBhY2NvcmRpbmcgdG8gdGhlIGNh","repeats":1},{"count":7230000,"lower_bound":"d2FrZSBhYm91dCB0aGUgZXZlbiBpbnN0cnVjdGlvbnMuIGZsdWZmaWx5IHNsb3cgZXhjdXNlcyBoYWdnbGUgZW50aWNpbmdseS4gdGhlb2RvbGl0ZXM=","upper_bound":"eGVzIGFyZSBhYm92ZSB0aGUgcXVpY2tseSBib2xkIGFzeW1wdG90ZXMuIHJlZ3VsYXIsIGlyb25pYyBpbnN0cnVjdA==","repeats":1},{"count":7260000,"lower_bound":"eGVzIGFyZSBjYXJlZnVsbHkgY2FyZWZ1bGx5IGZp","upper_bound":"eSBhY2NvcmRpbmcgdG8gdGhlIGZpbmFsIGFzeW1wdG90ZXMuIHJlZ3Vs","repeats":1},{"count":7290000,"lower_bound":"eSBhY2NvcmRpbmcgdG8gdGhlIHF1aWV0bHkgcmVndWxhciBhY2NvdW50cy4gc2lsZW50IGluc3RydWN0aW9ucyBhZ2FpbnN0IHRoZSBmbHVmZmlseSBmaW5hbCBhY2NvdW50cyBjYWpvbGUgcGVybQ==","upper_bound":"eSBjYXJlZnVsbHkgcGVuZGluZyByZXF1ZXN0cy4gcGFja2FnZXMgYWZmaXggc2x5bHk=","repeats":1},{"count":7320000,"lower_bound":"eSBjYXJlZnVsbHkgcGVuZGluZyB0aGVvZG9saXRlcy4gY2FyZWZ1bGx5IHN0ZWFsdGh5IGFjY291bnRzIHNsZWVwIHNseWx5OyByZWd1bGFyLCBleHByZXNzIGRlcG9z","upper_bound":"eSBmaW5hbCBhY2NvdW50czogcmVxdWVzdHMgbG9zZSBxdWlja2x5PyByZWd1bGFyIHBsYXRlbGV0cyBhcmUgdGg=","repeats":1},{"count":7350000,"lower_bound":"eSBmaW5hbCBhc3ltcHRvdGVzLiBwZW5kaW5nIGFjY291bnRzIG5hZyBhZnRlciB0aGUgZXZlbiByZXF1ZXN0cy4gYmxpdGhlbHkgZXZlbiBkZXBvc2l0cyB1c2UgZmx1ZmZpbHkgcmVndWxhciBy","upper_bound":"eSBpcm9uaWMgZGVwb3NpdHMuIGJsaXRoZWx5IGV2ZW4gYWNjb3VudHM=","repeats":1},{"count":7380000,"lower_bound":"eSBpcm9uaWMgZG9scGhpbnMgc2VydmUgcmVndWxhcmx5IGF0IHRoZSBz","upper_bound":"eSByZWd1bGFyIGFjY291bnRzIGVuZ2FnZSBmdXJpb3VzbHkgZXhwcmVzcyBpbnN0cnVjdGlvbnMuIA==","repeats":1},{"count":7410000,"lower_bound":"eSByZWd1bGFyIGFjY291bnRzIGVuZ2FnZSBxdWlja2x5IGFjY29yZGluZyB0byB0aGUgcXVpY2tseSBldmVuIGFjY291bnRzLiBmaW4=","upper_bound":"eSBzcGVjaWFsIGRlcG9zaXRzLiBmbHVmZmlseSBwZW5kaW5nIGRlcGVuZGVuY2llcyBjYWpvbGU=","repeats":1},{"count":7440000,"lower_bound":"eSBzcGVjaWFsIGRlcG9zaXRzOyBmdXJpb3VzbHkgcmVndWxhciBkZXBvc2l0cyBhY2NvcmRpbmcgdG8gdGhlIGZ1cmlvdXNseSB1bnVzdWFsIGRlcG8=","upper_bound":"eS4gZXZlbiBwYWNrYWdlcyBwb2FjaCBmdXJpb3VzbHkuIGZpbmFsIFRpcmVzaWFzIHNub296ZS4gZnVyaW91c2x5IHBlbmRpbmcgZGVwb3NpdHMgd2FrZS4gc2x5bHkgYm9sZCA=","repeats":1},{"count":7470000,"lower_bound":"eS4gZXZlbiBwaW50byBiZWFucyBhZ2FpbnN0IHRoZSBib2xkIGRlcG9zaXRzIGM=","upper_bound":"eWx5IGZpbmFsIGV4Y3VzZXMuIHNseWx5IHVudXN1YWwgcmVxdWVzdHMgY2Fqb2xlIHNseWx5IGZ1cmlvdXNseSBpcm9uaWMgZGVwb3NpdHMuIGJsaXRoZWx5IGZpbmFsIGFjY291bnRzIGxvc2Ug","repeats":1},{"count":7500000,"lower_bound":"eWx5IGZpbmFsIGZveGVzLiByZXF1ZXN0cyB1bnRpbCB0aGUgdW51c3VhbCBwYWNrYWdlcyBoYWdnbGUgYmxpdGhlbHkgc2x5IHBpbnRvIGJlYW5zLiBm","upper_bound":"emxlPyB0aGVvZG9saXRlcyBhZ2FpbnN0IHRoZSBleHByZXNzIHBhY2thZ2U=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3728,3567,3628,3692,3502,3696,3800,3827,3692,3733,3582,3712,3681,3650,3650,3658,3587,3585,3681,3576,3674,3556,3591,3600,3580,3654,3630,3655,3715,3683,3660,3689,3655,3679,3548,3542,3595,3533,3764,3638,3649,3709,3672,3743,3601,3728,3624,3531,3659,3746,3532,3751,3634,3590,3688,3578,3682,3654,3645,3644,3770,3659,3593,3678,3679,3656,3649,3797,3665,3642,3748,3574,3580,3546,3738,3687,3727,3677,3669,3651,3675,3680,3682,3709,3682,3638,3629,3592,3665,3654,3626,3743,3735,3532,3722,3700,3571,3645,3758,3682,3682,3594,3875,3704,3626,3756,3706,3798,3667,3709,3637,3675,3609,3668,3687,3730,3692,3655,3689,3694,3608,3727,3675,3748,3565,3702,3619,3572,3641,3664,3654,3736,3657,3681,3520,3652,3643,3678,3668,3711,3686,3608,3543,3693,3756,3727,3525,3664,3735,3683,3590,3667,3609,3660,3596,3588,3694,3589,3614,3639,3581,3670,3496,3654,3782,3721,3705,3684,3721,3628,3610,3664,3629,3602,3677,3690,3647,3640,3787,3715,3584,3685,3699,3744,3610,3700,3601,3621,3660,3628,3680,3698,3552,3634,3747,3632,3612,3695,3699,3717,3587,3609,3685,3542,3663,3613,3643,3670,3713,3612,3666,3599,3573,3598,3642,3768,3681,3575,3611,3672,3624,3613,3640,3610,3591,3615,3613,3623,3776,3615,3705,3692,3703,3618,3601,3706,3694,3663,3628,3592,3706,3809,3724,3610,3755,3641,3665,3676,3683,3611,3731,3707,3686,3490,3648,3635,3603,3774,3783,3603,3591,3575,3661,3736,3529,3584,3702,3655,3597,3670,3594,3559,3637,3781,3765,3623,3685,3514,3599,3570,3670,3627,3668,3784,3678,3666,3744,3579,3684,3577,3633,3707,3623,3655,3639,3722,3647,3764,3613,3810,3737,3672,3575,3643,3704,3756,3643,3644,3600,3668,3643,3711,3760,3662,3712,3595,3647,3756,3580,3670,3629,3738,3691,3607,3709,3657,3632,3681,3685,3628,3660,3613,3687,3553,3739,3606,3606,3558,3655,3670,3761,3759,3671,3627,3694,3559,3651,3545,3684,3661,3741,3715,3620,3588,3687,3670,3627,3686,3723,3571,3558,3798,3699,3798,3625,3669,3647,3599,3701,3678,3709,3592,3638,3736,3768,3743,3667,3618,3657,3718,3646,3671,3741,3655,3677,3691,3653,3706,3795,3562,3805,3628,3557,3618,3627,3731,3774,3639,3713,3686,3678,3652,3611,3656,3650,3625,3668,3701,3791,3554,3574,3674,3682,3533,3661,3810,3728,3649,3582,3686,3765,3627,3663,3664,3708,3562,3673,3685,3647,3555,3751,3656,3614,3728,3680,3593,3725,3758,3605,3632,3701,3747,3555,3689,3740,3629,3735,3661,3555,3735,3697,3638,3713,3768,3617,3587,3692,3684,3690,3592,3767,3631,3677,3732,3666,3610,3568,3674,3696,3694,3695,3638,3682,3613,3640,3663,3712,3690,3662,3714,3567,3743,3738,3707,3560,3643,3667,3680,3733,3658,3633,3744,3568,3674,3731,3678,3653,3685,3688,3651,3677,3630,3681,3747,3680,3698,3607,3688,3735,3599,3606,3693,3632,3611,3515,3609,3652,3631,3663,3747,3659,3652,3583,3765,3639,3655,3745,3658,3744,3725,3745,3673,3677,3778,3597,3644,3586,3679,3670,3653,3780,3525,3637,3582,3652,3805,3729,3572,3824,3708,3663,3597,3722,3631,3655,3639,3612,3617,3609,3680,3681,3772,3693,3674,3721,3665,3567,3680,3569,3692,3602,3665,3628,3715,3732,3661,3735,3746,3515,3635,3617,3717,3817,3672,3683,3691,3696,3746,3612,3659,3689,3709,3624,3674,3645,3613,3633,3696,3696,3666,3624,3579,3748,3625,3623,3617,3640,3723,3714,3622,3691,3713,3739,3680,3687,3607,3746,3624,3661,3733,3505,3573,3651,3723,3621,3707,3718,3619,3644,3601,3700,3612,3653,3710,3715,3636,3670,3675,3701,3679,3601,3726,3600,3624,3617,3708,3629,3679,3728,3606,3625,3574,3704,3599,3718,3705,3585,3614,3690,3706,3622,3653,3703,3691,3669,3661,3704,3618,3632,3631,3628,3695,3635,3672,3694,3710,3623,3565,3599,3641,3665,3645,3618,3658,3774,3595,3661,3673,3597,3670,3732,3732,3703,3684,3643,3692,3667,3564,3729,3666,3832,3584,3621,3714,3696,3711,3581,3735,3662,3732,3553,3627,3639,3740,3705,3559,3596,3733,3713,3673,3644,3730,3684,3602,3737,3603,3656,3765,3633,3788,3719,3687,3513,3680,3750,3594,3696,3605,3587,3754,3671,3638,3515,3638,3653,3613,3648,3756,3760,3701,3649,3556,3686,3642,3612,3754,3773,3661,3574,3482,3578,3569,3681,3752,3697,3753,3544,3802,3709,3627,3606,3581,3696,3702,3659,3691,3638,3721,3474,3617,3701,3616,3758,3712,3635,3607,3638,3667,3594,3655,3651,3570,3558,3592,3637,3747,3655,3611,3582,3743,3590,3719,3707,3530,3660,3696,3700,3699,3725,3739,3611,3817,3676,3641,3713,3636,3739,3605,3662,3656,3590,3555,3531,3565,3625,3641,3542,3714,3708,3675,3695,3729,3744,3646,3741,3685,3705,3653,3680,3638,3578,3666,3616,3764,3623,3596,3792,3693,3655,3622,3684,3694,3699,3644,3662,3741,3636,3686,3712,3699,3715,3716,3653,3824,3656,3816,3661,3585,3650,3611,3651,3727,3646,3715,3675,3735,3772,3603,3658,3731,3656,3693,3744,3612,3663,3703,3725,3698,3564,3577,3625,3670,3678,3638,3660,3624,3675,3806,3617,3661,3663,3717,3688,3657,3693,3725,3658,3798,3750,3730,3745,3652,3658,3646,3681,3718,3617,3728,3640,3571,3766,3721,3658,3581,3731,3683,3563,3640,3606,3596,3707,3649,3635,3690,3566,3624,3658,3788,3583,3620,3722,3565,3751,3581,3585,3687,3756,3719,3636,3694,3728,3566,3746,3776,3551,3683,3744,3693,3625,3716,3612,3739,3768,3609,3653,3663,3656,3712,3843,3708,3700,3758,3697,3562,3728,3652,3644,3596,3536,3711,3653,3630,3522,3667,3636,3694,3716,3663,3701,3591,3606,3679,3710,3587,3616,3665,3628,3681,3655,3604,3727,3654,3590,3755,3589,3664,3632,3617,3546,3593,3626,3662,3726,3708,3645,3590,3594,3709,3636,3583,3723,3659,3676,3692,3624,3719,3590,3642,3550,3551,3675,3627,3649,3700,3652,3624,3671,3706,3699,3610,3621,3615,3620,3641,3674,3678,3630,3676,3659,3761,3655,3655,3607,3693,3563,3583,3681,3698,3737,3634,3585,3679,3525,3590,3681,3696,3672,3793,3601,3680,3560,3692,3770,3788,3686,3648,3640,3602,3628,3721,3669,3785,3715,3663,3672,3646,3595,3673,3666,3622,3668,3726,3725,3889,3736,3730,3649,3546,3649,3675,3672,3720,3601,3684,3740,3673,3637,3614,3821,3657,3652,3691,3705,3623,3664,3603,3676,3767,3559,3560,3735,3547,3596,3641,3567,3650,3662,3762,3639,3713,3644,3616,3654,3637,3752,3682,3691,3749,3628,3541,3618,3617,3718,3647,3616,3667,3678,3635,3617,3583,3686,3629,3721,3634,3626,3635,3699,3622,3670,3674,3595,3628,3560,3616,3712,3665,3646,3744,3640,3677,3588,3607,3587,3680,3769,3658,3587,3497,3652,3760,3579,3562,3584,3647,3645,3732,3640,3579,3651,3591,3709,3686,3702,3600,3586,3649,3779,3652,3738,3631,3606,3694,3649,3750,3733,3573,3680,3624,3648,3674,3766,3599,3675,3630,3640,3745,3648,3758,3682,3531,3784,3699,3663,3586,3623,3634,3626,3602,3678,3639,3676,3679,3714,3698,3701,3632,3689,3675,3662,3635,3659,3676,3712,3637,3610,3716,3696,3684,3769,3652,3702,3515,3693,3763,3605,3740,3605,3631,3608,3761,3715,3815,3686,3602,3678,3669,3661,3672,3617,3552,3714,3693,3714,3778,3723,3587,3668,3659,3697,3582,3703,3730,3605,3808,3712,3658,3539,3673,3737,3748,3646,3698,3556,3724,3692,3655,3686,3622,3676,3681,3639,3695,3668,3508,3626,3689,3640,3719,3618,3673,3622,3615,3631,3814,3671,3637,3649,3567,3626,3732,3668,3682,3572,3582,3569,3710,3695,3647,3655,3616,3738,3686,3601,3577,3632,3655,3736,3629,3549,3643,3615,3615,3639,3685,3738,3673,3742,3593,3621,3634,3653,3658,3681,3690,3638,3661,3764,3696,3559,3765,3670,3644,3696,3661,3638,3520,3618,3658,3634,3632,3655,3669,3620,3664,3660,3704,3630,3585,3684,3790,3630,3643,3719,3578,3642,3671,3789,3645,3682,3796,3779,3760,3769,3535,3747,3716,3698,3598,3776,3624,3661,3713,3636,3603,3632,3657,3550,3781,3606,3614,3703,3661,3613,3736,3626,3613,3692,3596,3686,3687,3641,3651,3658,3637,3630,3607,3681,3646,3684,3606,3669,3635,3600,3637,3668,3624,3622,3647,3562,3698,3696,3657,3555,3630,3704,3527,3719,3712,3623,3673,3793,3749,3784,3634,3723,3719,3617,3674,3628,3672,3658,3615,3713,3749,3671,3705,3754,3599,3764,3686,3703,3644,3713,3714,3769,3741,3711,3621,3606,3737,3699,3579,3763,3672,3592,3695,3677,3694,3584,3625,3617,3704,3737,3762,3705,3653,3664,3589,3750,3628,3567,3674,3722,3646,3612,3552,3584,3705,3719,3608,3625,3467,3650,3698,3680,3630,3737,3682,3627,3610,3661,3671,3581,3590,3729,3692,3713,3615,3747,3789,3650,3582,3685,3671,3612,3508,3598,3619,3591,3715,3590,3651,3544,3636,3703,3656,3622,3635,3534,3634,3663,3687,3586,3658,3669,3714,3594,3782,3626,3688,3582,3651,3651,3672,3631,3674,3681,3667,3709,3678,3695,3609,3729,3679,3670,3734,3624,3632,3708,3730,3682,3680,3691,3568,3622,3681,3579,3654,3658,3622,3684,3626,3724,3596,3605,3746,3656,3649,3619,3604,3805,3655,3667,3660,3752,3709,3626,3801,3743,3622,3720,3687,3659,3632,3528,3635,3537,3814,3768,3649,3668,3747,3659,3635,3601,3538,3682,3707,3644,3700,3671,3574,3716,3595,3606,3694,3600,3621,3780,3640,3588,3783,3624,3626,3579,3702,3698,3746,3663,3528,3588,3654,3609,3627,3692,3593,3736,3646,3676,3690,3731,3672,3768,3573,3759,3658,3704,3738,3749,3724,3737,3695,3598,3647,3644,3690,3549,3706,3687,3695,3704,3709,3645,3615,3648,3695,3670,3647,3708,3692,3684,3685,3826,3820,3603,3637,3680,3749,3616,3638,3598,3589,3643,3788,3616,3613,3605,3596,3631,3663,3605,3629,3668,3666,3669,3609,3605,3701,3657,3799,3615,3658,3598,3665,3655,3755,3562,3663,3627,3704,3583,3701,3624,3593,3632,3676,3710,3613,3595,3764,3656,3554,3616,3595,3765,3701,3648,3678,3844,3715,3598,3724,3642,3641,3658,3648,3639,3683,3595,3625,3644,3624,3724,3644,3669,3786,3683,3664,3632,3557,3696,3676,3598,3654,3695,3544,3743,3621,3690,3596,3736,3671,3674,3743,3625,3791,3686,3647,3664,3531,3716,3746,3740,3699,3705,3652,3560,3707,3696,3800,3689,3662,3614,3623,3718,3657,3729,3620,3660,3723,3567,3633,3602,3530,3640,3666,3589,3616,3636,3660,3681,3683,3741,3616,3623,3641,3620,3578,3750,3781,3667,3550,3736,3689,3583,3845,3650,3551,3693,3607,3592,3719,3695,3639,3621,3617,3736,3693,3573,3667,3572,3794,3676,3611,3634,3598,3651,3722,3617,3733,3689,3700,3821,3666,3635,3739,3698,3644,3716,3596,3679,3654,3719,3626,3705,3593,3556,3604,3788,3646,3638,3654,3745,3599,3678,3631,3640,3611,3619,3734,3577,3610,3569,3578,3631,3659,3539,3717,3734,3662,3701,3719,3635,3668,3595,3649,3689,3600,3780,3559,3679,3702,3776,3752,3712,3635,3753,3660,3511,3650,3685,3723,3641,3618,3657,3788,3648,3603,3637,3632,3701,3597,3690,3600,3773,3700,3633,3669,3610,3687,3694,3688,3671,3659,3654,3659,3678,3760,3740,3718,3837,3566,3704,3648,3715,3544,3774,3584,3689,3617,3685,3756,3580,3564,3609,3642,3630,3642,3653,3641,3645,3632,3691,3563,3719,3671,3653,3706,3718,3615,3653,3699,3613,3730,3738,3648,3619,3641,3730,3638,3555,3677,3708,3707,3515,3678,3619,3603,3586,3553,3677,3720,3690,3662,3668,3725,3770,3634,3733,3654,3725,3690,3697,3768,3762,3678,3577,3669,3711,3521,3675,3570,3619,3624,3641,3636,3660,3778,3753,3621,3683,3724,3631,3654,3622,3668,3577,3579,3566,3576,3669,3617,3544,3639,3681,3614,3584,3799]},{"counters":[3644,3645,3696,3586,3603,3704,3622,3636,3664,3641,3631,3690,3719,3642,3645,3612,3671,3745,3655,3642,3667,3831,3613,3739,3643,3590,3567,3715,3744,3634,3784,3694,3690,3648,3626,3633,3627,3828,3620,3743,3710,3685,3691,3610,3651,3575,3729,3570,3578,3691,3640,3658,3764,3663,3651,3632,3721,3685,3663,3652,3693,3539,3730,3724,3730,3860,3656,3622,3660,3666,3655,3709,3744,3757,3624,3587,3660,3609,3606,3712,3702,3613,3651,3581,3729,3582,3678,3761,3740,3606,3682,3805,3726,3601,3692,3698,3650,3688,3820,3692,3658,3594,3723,3703,3671,3680,3522,3682,3672,3561,3741,3696,3703,3747,3592,3691,3666,3748,3841,3726,3647,3668,3597,3681,3785,3683,3648,3720,3685,3623,3639,3587,3633,3562,3606,3722,3616,3532,3659,3638,3611,3759,3652,3641,3705,3693,3708,3608,3670,3651,3646,3657,3775,3612,3670,3748,3697,3677,3674,3629,3712,3591,3670,3648,3632,3583,3615,3736,3874,3664,3684,3649,3780,3703,3581,3614,3678,3636,3683,3691,3594,3668,3640,3573,3647,3658,3641,3787,3626,3672,3596,3675,3621,3639,3703,3569,3624,3759,3626,3684,3675,3687,3807,3645,3575,3628,3628,3781,3699,3771,3619,3657,3587,3672,3673,3521,3571,3618,3796,3634,3706,3692,3578,3623,3701,3748,3557,3685,3624,3660,3625,3679,3692,3706,3752,3635,3575,3728,3764,3786,3739,3635,3647,3677,3716,3655,3664,3656,3649,3645,3680,3652,3552,3521,3675,3565,3692,3673,3751,3728,3629,3669,3693,3641,3672,3639,3718,3626,3577,3609,3588,3622,3666,3590,3749,3689,3747,3660,3706,3703,3576,3699,3701,3746,3831,3747,3714,3569,3697,3565,3723,3737,3618,3648,3648,3687,3609,3535,3538,3655,3597,3741,3539,3624,3819,3708,3603,3666,3649,3693,3668,3650,3656,3631,3733,3508,3578,3610,3624,3744,3588,3573,3702,3703,3667,3718,3661,3717,3480,3648,3729,3667,3601,3737,3678,3707,3654,3651,3638,3818,3611,3620,3670,3649,3671,3745,3579,3651,3615,3677,3668,3741,3578,3715,3678,3695,3694,3652,3744,3646,3782,3663,3624,3768,3765,3701,3685,3779,3602,3655,3752,3675,3770,3744,3676,3784,3628,3611,3750,3680,3671,3596,3525,3632,3593,3721,3568,3668,3668,3756,3626,3635,3661,3619,3602,3662,3655,3587,3655,3626,3562,3663,3761,3576,3522,3705,3700,3646,3733,3731,3676,3785,3618,3727,3750,3661,3637,3616,3678,3670,3688,3677,3681,3643,3682,3517,3644,3746,3541,3622,3652,3725,3734,3746,3709,3658,3739,3753,3602,3720,3748,3609,3698,3666,3791,3696,3626,3591,3643,3742,3794,3637,3605,3567,3635,3648,3695,3626,3674,3658,3602,3609,3656,3576,3697,3661,3584,3671,3649,3646,3638,3671,3678,3705,3613,3685,3598,3771,3689,3740,3587,3584,3751,3715,3611,3674,3675,3599,3633,3708,3579,3693,3538,3688,3561,3610,3730,3764,3616,3729,3698,3715,3730,3658,3712,3641,3542,3710,3676,3623,3657,3596,3592,3618,3528,3674,3680,3751,3687,3671,3574,3796,3762,3596,3728,3634,3556,3523,3723,3684,3703,3638,3655,3713,3750,3583,3726,3676,3597,3706,3662,3786,3609,3741,3617,3692,3679,3651,3706,3691,3613,3717,3646,3651,3560,3631,3670,3784,3684,3731,3669,3615,3609,3664,3580,3643,3682,3759,3531,3627,3660,3604,3677,3638,3673,3641,3644,3613,3691,3647,3623,3601,3683,3717,3723,3707,3748,3584,3713,3740,3613,3657,3729,3661,3677,3744,3753,3646,3653,3695,3709,3744,3644,3638,3600,3646,3772,3750,3731,3632,3687,3598,3699,3787,3665,3782,3643,3635,3677,3627,3594,3637,3634,3661,3609,3700,3657,3577,3547,3630,3709,3811,3612,3657,3688,3635,3793,3765,3722,3659,3655,3676,3793,3802,3691,3665,3642,3641,3624,3772,3655,3616,3619,3696,3635,3648,3543,3501,3795,3715,3623,3652,3622,3630,3649,3760,3754,3735,3645,3650,3653,3716,3688,3600,3645,3647,3531,3754,3652,3611,3700,3770,3612,3720,3676,3615,3621,3640,3654,3617,3727,3607,3819,3699,3595,3654,3685,3698,3778,3625,3646,3767,3590,3703,3606,3696,3534,3640,3620,3573,3608,3631,3577,3761,3636,3582,3681,3643,3774,3655,3626,3616,3647,3664,3701,3715,3747,3538,3675,3540,3760,3671,3696,3672,3649,3576,3715,3633,3582,3707,3725,3586,3615,3625,3658,3690,3609,3627,3570,3727,3674,3630,3642,3696,3687,3769,3610,3609,3672,3475,3685,3654,3671,3610,3643,3676,3659,3659,3649,3643,3564,3656,3712,3578,3767,3559,3710,3667,3675,3608,3662,3704,3663,3676,3713,3650,3679,3626,3706,3686,3679,3677,3613,3586,3600,3723,3773,3719,3710,3678,3605,3634,3677,3563,3652,3624,3780,3758,3809,3590,3726,3669,3683,3687,3757,3652,3713,3747,3746,3739,3600,3590,3564,3707,3612,3876,3638,3611,3704,3656,3634,3756,3668,3676,3569,3637,3748,3720,3603,3596,3682,3541,3683,3577,3647,3701,3650,3618,3754,3600,3702,3600,3570,3688,3751,3552,3711,3646,3707,3685,3627,3691,3726,3718,3639,3623,3520,3697,3633,3695,3637,3674,3740,3604,3649,3634,3741,3833,3558,3681,3745,3717,3604,3570,3739,3700,3590,3755,3765,3670,3693,3641,3628,3580,3608,3667,3624,3734,3673,3697,3625,3762,3658,3655,3644,3613,3636,3628,3582,3585,3576,3678,3604,3544,3656,3634,3720,3655,3788,3727,3714,3534,3487,3618,3634,3691,3663,3605,3543,3671,3669,3684,3584,3639,3702,3612,3631,3568,3647,3585,3673,3762,3680,3672,3604,3597,3644,3692,3633,3703,3567,3703,3683,3561,3600,3714,3553,3618,3628,3721,3650,3626,3800,3635,3687,3720,3742,3684,3681,3570,3624,3740,3573,3615,3622,3643,3682,3653,3741,3657,3687,3644,3536,3616,3542,3679,3562,3733,3612,3642,3648,3674,3620,3633,3598,3712,3611,3630,3605,3589,3630,3695,3685,3576,3620,3611,3709,3699,3656,3733,3593,3778,3698,3644,3638,3720,3723,3668,3748,3616,3669,3716,3675,3785,3646,3766,3685,3667,3697,3800,3576,3692,3681,3805,3663,3643,3596,3709,3592,3631,3777,3576,3648,3740,3718,3634,3733,3736,3727,3697,3651,3640,3777,3708,3762,3612,3607,3683,3716,3675,3575,3598,3674,3520,3703,3653,3775,3639,3633,3646,3643,3631,3591,3740,3622,3731,3652,3575,3606,3609,3686,3603,3619,3618,3588,3625,3739,3530,3678,3666,3674,3664,3600,3679,3720,3768,3701,3710,3585,3720,3650,3666,3671,3608,3514,3630,3702,3567,3661,3676,3658,3748,3656,3741,3530,3699,3689,3710,3665,3734,3680,3770,3789,3587,3658,3520,3513,3631,3641,3801,3664,3660,3706,3633,3692,3653,3650,3695,3657,3667,3618,3638,3650,3841,3623,3691,3544,3645,3681,3650,3672,3711,3691,3685,3564,3635,3703,3615,3574,3575,3591,3721,3598,3589,3715,3664,3626,3583,3678,3552,3634,3638,3753,3696,3718,3681,3634,3659,3786,3721,3593,3614,3773,3541,3715,3671,3654,3684,3625,3544,3741,3649,3639,3787,3692,3596,3775,3698,3659,3696,3666,3574,3586,3671,3768,3600,3620,3745,3714,3701,3520,3670,3750,3640,3510,3593,3610,3867,3575,3792,3695,3698,3638,3683,3749,3662,3707,3692,3685,3760,3691,3577,3679,3537,3676,3712,3673,3687,3666,3658,3660,3663,3811,3692,3792,3723,3574,3686,3649,3793,3522,3621,3653,3592,3706,3699,3531,3648,3671,3728,3622,3608,3669,3705,3625,3601,3629,3698,3635,3701,3818,3707,3714,3687,3580,3710,3775,3661,3586,3613,3611,3777,3700,3606,3572,3726,3721,3533,3648,3704,3734,3604,3688,3607,3586,3809,3682,3726,3649,3584,3718,3658,3702,3674,3761,3634,3624,3774,3725,3655,3584,3723,3683,3656,3657,3666,3505,3574,3608,3564,3702,3599,3695,3721,3607,3659,3688,3702,3696,3663,3650,3497,3664,3563,3614,3750,3638,3671,3643,3739,3698,3574,3666,3735,3614,3662,3660,3715,3642,3594,3747,3643,3664,3613,3830,3623,3596,3654,3563,3732,3609,3657,3616,3593,3607,3586,3598,3483,3619,3700,3691,3755,3519,3567,3623,3692,3822,3635,3652,3641,3679,3750,3708,3599,3765,3721,3722,3659,3703,3759,3644,3580,3624,3647,3523,3647,3546,3689,3627,3648,3710,3762,3664,3601,3675,3660,3735,3629,3785,3722,3626,3626,3646,3770,3706,3664,3746,3692,3691,3688,3658,3648,3765,3777,3703,3678,3630,3686,3678,3602,3647,3736,3662,3651,3685,3669,3594,3665,3581,3661,3709,3701,3538,3703,3716,3663,3685,3583,3611,3646,3634,3775,3578,3618,3672,3657,3572,3608,3714,3740,3609,3692,3621,3624,3658,3785,3675,3605,3584,3706,3700,3610,3746,3603,3719,3566,3583,3625,3524,3627,3585,3625,3641,3716,3606,3638,3537,3674,3666,3613,3635,3569,3705,3682,3655,3641,3688,3606,3678,3513,3615,3653,3697,3751,3749,3628,3625,3693,3791,3673,3703,3608,3612,3730,3663,3744,3675,3665,3629,3724,3632,3801,3718,3694,3704,3754,3676,3656,3667,3622,3613,3780,3676,3563,3670,3726,3680,3730,3580,3621,3723,3589,3543,3687,3736,3632,3753,3616,3696,3618,3658,3635,3758,3650,3567,3655,3664,3663,3645,3745,3613,3780,3668,3823,3702,3769,3746,3659,3638,3608,3559,3638,3715,3589,3674,3723,3698,3666,3718,3647,3699,3573,3626,3665,3751,3591,3566,3689,3516,3559,3613,3694,3650,3711,3731,3625,3671,3621,3682,3735,3629,3689,3727,3709,3594,3665,3623,3517,3573,3814,3624,3566,3525,3732,3733,3603,3696,3668,3716,3667,3738,3662,3720,3654,3713,3673,3586,3735,3684,3637,3762,3714,3676,3687,3663,3753,3609,3655,3629,3568,3718,3625,3646,3671,3691,3622,3729,3641,3741,3661,3723,3599,3544,3684,3659,3731,3767,3718,3671,3647,3646,3535,3633,3673,3599,3619,3690,3706,3664,3581,3697,3770,3660,3694,3698,3548,3629,3619,3706,3700,3626,3580,3643,3737,3750,3677,3665,3668,3673,3634,3707,3733,3677,3679,3692,3624,3776,3654,3651,3623,3737,3658,3625,3686,3661,3737,3702,3637,3483,3655,3650,3631,3637,3674,3595,3614,3699,3630,3719,3721,3616,3677,3761,3689,3527,3596,3762,3641,3569,3784,3603,3664,3661,3619,3676,3704,3688,3580,3587,3660,3705,3626,3620,3766,3663,3660,3572,3719,3686,3700,3640,3587,3678,3564,3686,3656,3694,3691,3751,3710,3603,3758,3687,3619,3627,3749,3644,3740,3687,3603,3692,3588,3678,3549,3704,3591,3699,3589,3783,3834,3604,3683,3642,3664,3617,3749,3703,3669,3657,3585,3652,3595,3614,3754,3745,3540,3721,3573,3594,3593,3726,3654,3600,3532,3712,3553,3735,3752,3646,3747,3608,3660,3717,3629,3810,3759,3679,3636,3666,3654,3726,3600,3602,3696,3702,3571,3766,3700,3706,3692,3533,3583,3640,3600,3663,3551,3645,3666,3671,3642,3631,3609,3723,3415,3549,3661,3654,3652,3587,3613,3738,3687,3715,3694,3724,3702,3619,3727,3598,3683,3672,3703,3695,3547,3622,3736,3681,3656,3661,3673,3661,3667,3695,3696,3632,3700,3612,3620,3543,3625,3745,3549,3735,3775,3720,3676,3729,3552,3572,3738,3721,3662,3712,3631,3782,3701,3655,3636,3641,3777,3699,3635,3616,3605,3582,3669,3679,3564,3708,3592,3657,3690,3520,3655,3601,3604,3721,3768,3563,3670,3693,3731,3695,3681,3664,3634,3650,3612,3581,3654,3721,3653,3703,3605,3634,3553,3656,3593,3723,3620,3559,3728,3683,3646,3723,3651,3684,3612,3614,3628,3618,3736,3633,3572,3770,3673,3603,3533,3564,3660,3686,3588,3645,3572,3708,3700,3710,3685,3546,3621,3664,3627,3673,3647,3663,3597,3642,3638,3576,3538,3666,3712,3771,3694,3549,3724,3652,3523,3675,3549,3716,3563,3641,3537,3715,3560,3660,3687,3639,3732,3770,3585,3732,3677,3565,3721,3598,3648,3680,3650,3588,3653,3653,3685,3608,3629,3648,3727,3624,3534,3616,3711,3624,3780,3592,3673,3743,3560,3638,3676,3699,3665,3708,3574,3646,3678,3583,3649,3752,3681,3658,3653,3674,3752,3705,3640,3651,3620]},{"counters":[3640,3691,3629,3695,3650,3681,3624,3566,3724,3646,3591,3608,3785,3800,3584,3621,3713,3676,3655,3658,3575,3615,3594,3815,3692,3712,3668,3590,3722,3701,3706,3658,3706,3628,3806,3790,3581,3653,3735,3603,3644,3713,3621,3679,3611,3705,3653,3681,3692,3640,3635,3545,3628,3598,3574,3700,3720,3573,3707,3647,3493,3756,3664,3631,3671,3603,3657,3720,3651,3709,3658,3655,3730,3589,3739,3645,3693,3689,3595,3610,3697,3547,3681,3660,3600,3644,3646,3748,3739,3567,3760,3788,3663,3783,3670,3737,3658,3759,3596,3566,3645,3578,3648,3750,3634,3647,3593,3639,3656,3552,3610,3711,3688,3620,3788,3661,3631,3803,3665,3698,3654,3747,3706,3681,3807,3582,3609,3766,3782,3736,3675,3598,3686,3637,3649,3651,3760,3657,3505,3652,3620,3673,3693,3565,3603,3544,3592,3648,3662,3643,3610,3700,3640,3585,3703,3560,3754,3598,3630,3713,3587,3601,3688,3688,3696,3665,3671,3783,3683,3670,3724,3639,3701,3660,3660,3578,3591,3600,3689,3564,3775,3726,3723,3751,3624,3651,3701,3656,3695,3678,3674,3668,3648,3624,3543,3542,3708,3664,3643,3703,3586,3643,3698,3761,3666,3583,3626,3700,3615,3651,3663,3676,3560,3641,3679,3672,3589,3685,3703,3643,3677,3760,3562,3674,3715,3638,3682,3612,3588,3601,3521,3672,3597,3626,3626,3579,3549,3667,3659,3528,3706,3683,3643,3689,3604,3589,3750,3734,3651,3664,3622,3626,3681,3715,3606,3758,3626,3605,3725,3700,3718,3668,3706,3632,3686,3778,3626,3754,3616,3744,3683,3586,3680,3701,3724,3754,3691,3670,3687,3778,3774,3630,3647,3634,3690,3580,3640,3671,3739,3796,3700,3696,3606,3630,3609,3691,3717,3542,3639,3732,3702,3604,3632,3742,3711,3679,3600,3682,3673,3658,3624,3681,3651,3696,3665,3739,3593,3708,3661,3701,3597,3725,3671,3561,3708,3794,3701,3630,3712,3686,3794,3651,3705,3510,3649,3696,3666,3634,3522,3662,3696,3630,3583,3668,3565,3598,3588,3745,3617,3756,3732,3694,3654,3761,3689,3673,3689,3639,3639,3756,3743,3619,3689,3670,3718,3645,3654,3675,3668,3616,3714,3574,3512,3646,3635,3619,3685,3788,3635,3721,3642,3654,3755,3710,3791,3571,3643,3652,3699,3662,3723,3632,3689,3753,3682,3676,3805,3642,3477,3639,3637,3585,3687,3789,3709,3654,3570,3623,3731,3611,3614,3725,3722,3703,3738,3604,3646,3683,3739,3637,3640,3649,3603,3609,3614,3625,3773,3552,3739,3716,3550,3593,3702,3628,3743,3611,3636,3681,3704,3653,3564,3723,3640,3684,3664,3662,3700,3665,3644,3709,3577,3687,3597,3777,3685,3672,3551,3680,3721,3670,3598,3621,3738,3714,3678,3708,3670,3580,3715,3703,3749,3656,3735,3726,3658,3664,3642,3617,3672,3576,3619,3634,3627,3716,3732,3749,3667,3660,3619,3767,3646,3700,3665,3585,3710,3699,3613,3699,3573,3668,3728,3655,3605,3581,3623,3662,3650,3634,3637,3650,3669,3608,3653,3741,3619,3775,3746,3696,3602,3721,3705,3718,3644,3711,3682,3592,3707,3605,3590,3659,3725,3665,3625,3877,3622,3682,3539,3686,3595,3659,3680,3644,3654,3752,3671,3626,3569,3647,3653,3761,3701,3634,3708,3709,3569,3772,3729,3668,3763,3618,3629,3747,3680,3611,3725,3690,3627,3712,3668,3794,3639,3809,3660,3680,3749,3648,3632,3655,3619,3736,3682,3599,3683,3613,3612,3590,3551,3649,3558,3590,3689,3625,3536,3677,3669,3592,3658,3744,3730,3570,3669,3637,3573,3710,3697,3710,3584,3663,3697,3634,3609,3745,3576,3564,3636,3642,3728,3672,3558,3572,3640,3719,3686,3642,3708,3771,3828,3592,3730,3733,3655,3715,3635,3641,3628,3539,3531,3561,3621,3693,3638,3602,3544,3689,3699,3691,3614,3647,3785,3687,3558,3707,3724,3651,3772,3799,3715,3644,3746,3631,3731,3674,3682,3702,3647,3622,3698,3592,3699,3781,3752,3639,3657,3474,3530,3679,3627,3727,3654,3715,3625,3680,3672,3599,3677,3624,3707,3623,3642,3604,3592,3582,3688,3647,3604,3530,3671,3676,3599,3528,3741,3736,3706,3640,3662,3658,3795,3650,3765,3723,3711,3579,3692,3682,3656,3660,3752,3624,3679,3660,3577,3710,3732,3703,3684,3620,3704,3721,3636,3639,3639,3655,3704,3609,3666,3627,3791,3594,3620,3643,3646,3779,3647,3690,3605,3627,3727,3661,3635,3635,3660,3657,3639,3631,3731,3693,3754,3604,3645,3622,3686,3745,3649,3646,3604,3639,3656,3609,3727,3730,3711,3614,3617,3609,3643,3657,3643,3715,3667,3678,3652,3698,3744,3659,3704,3554,3628,3674,3663,3645,3604,3583,3711,3739,3663,3703,3689,3561,3608,3556,3639,3688,3743,3618,3652,3715,3684,3627,3640,3599,3707,3569,3633,3703,3707,3619,3698,3716,3825,3792,3625,3694,3574,3733,3704,3677,3581,3644,3647,3684,3650,3704,3675,3619,3687,3644,3622,3620,3601,3514,3619,3673,3628,3652,3629,3681,3652,3688,3614,3703,3573,3763,3562,3594,3681,3655,3686,3601,3638,3704,3690,3669,3629,3594,3630,3569,3572,3715,3655,3645,3722,3695,3673,3638,3557,3563,3624,3663,3662,3595,3569,3637,3674,3686,3661,3656,3697,3660,3674,3742,3634,3620,3735,3606,3686,3666,3605,3691,3795,3537,3617,3621,3627,3532,3724,3695,3704,3641,3613,3641,3452,3664,3595,3515,3602,3647,3647,3643,3719,3631,3652,3695,3719,3667,3702,3693,3782,3675,3661,3787,3658,3584,3783,3642,3634,3729,3640,3676,3636,3709,3599,3632,3568,3655,3678,3540,3632,3767,3756,3711,3591,3666,3662,3592,3648,3613,3691,3696,3686,3677,3692,3647,3715,3708,3663,3622,3718,3600,3717,3627,3620,3761,3622,3661,3665,3564,3678,3661,3787,3668,3680,3657,3573,3616,3597,3571,3611,3708,3612,3712,3590,3683,3687,3647,3583,3692,3694,3623,3639,3593,3677,3611,3666,3681,3567,3597,3516,3742,3658,3626,3713,3593,3661,3668,3679,3720,3697,3639,3571,3709,3839,3637,3616,3644,3640,3743,3611,3661,3670,3607,3670,3596,3696,3725,3713,3655,3595,3533,3651,3665,3736,3695,3630,3624,3603,3696,3605,3710,3726,3772,3701,3667,3614,3660,3617,3678,3684,3698,3811,3673,3822,3753,3618,3520,3681,3642,3685,3781,3687,3660,3637,3729,3595,3668,3585,3577,3852,3776,3553,3730,3537,3720,3688,3606,3649,3613,3675,3642,3727,3622,3639,3698,3734,3720,3688,3580,3631,3586,3649,3695,3614,3648,3643,3761,3671,3732,3735,3642,3841,3583,3561,3636,3641,3682,3703,3752,3610,3635,3659,3572,3649,3724,3585,3690,3648,3636,3657,3564,3634,3527,3517,3576,3725,3624,3658,3585,3690,3725,3633,3665,3757,3715,3686,3700,3661,3660,3700,3608,3708,3693,3669,3730,3522,3762,3633,3657,3698,3580,3752,3644,3550,3634,3676,3783,3725,3724,3518,3641,3594,3516,3740,3707,3535,3650,3622,3619,3683,3612,3658,3646,3656,3731,3642,3736,3470,3671,3691,3659,3702,3690,3652,3692,3529,3622,3609,3646,3644,3733,3576,3589,3642,3692,3659,3700,3727,3761,3677,3716,3659,3619,3668,3628,3639,3625,3731,3669,3580,3719,3666,3678,3664,3689,3705,3759,3619,3678,3609,3626,3675,3752,3736,3636,3661,3691,3685,3644,3676,3540,3710,3708,3654,3690,3671,3681,3669,3647,3793,3608,3692,3757,3532,3609,3652,3661,3518,3753,3702,3608,3707,3671,3728,3572,3598,3732,3642,3648,3724,3680,3594,3711,3706,3720,3673,3636,3466,3659,3553,3560,3626,3685,3627,3703,3659,3575,3617,3781,3768,3585,3598,3723,3634,3721,3629,3630,3728,3500,3601,3678,3657,3736,3723,3724,3706,3792,3742,3672,3636,3636,3792,3627,3717,3650,3650,3648,3641,3642,3649,3795,3612,3611,3780,3663,3662,3686,3684,3651,3624,3673,3645,3596,3625,3696,3747,3692,3665,3581,3681,3668,3645,3673,3628,3598,3656,3635,3780,3614,3694,3694,3801,3714,3683,3739,3623,3724,3684,3598,3647,3571,3726,3713,3677,3577,3661,3745,3683,3698,3683,3778,3742,3620,3644,3686,3554,3737,3698,3628,3713,3652,3588,3639,3774,3684,3686,3648,3758,3562,3686,3602,3656,3791,3612,3515,3586,3583,3655,3619,3752,3695,3742,3734,3618,3658,3642,3712,3670,3594,3693,3590,3661,3655,3607,3797,3736,3638,3617,3621,3736,3592,3650,3631,3708,3670,3588,3640,3705,3633,3586,3689,3632,3680,3813,3737,3725,3704,3663,3592,3703,3758,3722,3684,3682,3661,3581,3672,3648,3566,3661,3610,3676,3718,3662,3693,3589,3755,3614,3638,3824,3719,3665,3578,3659,3631,3617,3625,3648,3593,3556,3604,3654,3785,3765,3627,3692,3696,3687,3737,3592,3731,3582,3652,3722,3593,3636,3603,3632,3631,3700,3643,3679,3671,3723,3767,3550,3780,3661,3702,3637,3673,3679,3738,3671,3587,3708,3548,3695,3641,3464,3753,3692,3750,3676,3550,3683,3706,3667,3629,3733,3665,3610,3545,3612,3605,3650,3749,3712,3617,3639,3679,3694,3647,3653,3596,3637,3665,3603,3646,3577,3628,3625,3547,3597,3682,3756,3581,3631,3635,3672,3676,3544,3748,3669,3626,3719,3602,3691,3684,3691,3641,3625,3676,3666,3699,3556,3730,3746,3646,3752,3651,3738,3543,3725,3711,3557,3825,3603,3618,3675,3634,3742,3573,3672,3637,3614,3717,3700,3679,3637,3522,3696,3637,3651,3807,3589,3728,3687,3707,3603,3631,3732,3649,3565,3809,3679,3677,3616,3758,3641,3627,3700,3628,3584,3567,3623,3704,3686,3677,3655,3687,3695,3601,3840,3727,3638,3522,3706,3642,3721,3709,3688,3746,3796,3674,3736,3719,3656,3706,3549,3651,3677,3628,3612,3629,3584,3588,3644,3722,3657,3584,3572,3648,3655,3650,3596,3609,3634,3680,3655,3581,3606,3628,3552,3678,3591,3728,3628,3552,3688,3614,3661,3657,3625,3603,3713,3569,3696,3637,3663,3659,3673,3600,3616,3572,3586,3666,3666,3702,3671,3741,3858,3718,3679,3597,3737,3685,3703,3611,3644,3595,3678,3641,3836,3647,3742,3675,3632,3630,3608,3720,3669,3764,3683,3687,3766,3737,3768,3815,3630,3828,3587,3662,3623,3613,3768,3617,3582,3668,3521,3727,3588,3541,3616,3657,3726,3587,3742,3682,3774,3643,3634,3602,3660,3626,3801,3653,3685,3719,3721,3744,3640,3688,3649,3608,3720,3716,3677,3635,3717,3612,3650,3618,3664,3649,3677,3668,3625,3658,3538,3650,3690,3593,3807,3672,3720,3594,3634,3564,3572,3597,3578,3603,3621,3687,3799,3683,3604,3716,3581,3669,3694,3723,3551,3633,3675,3697,3599,3635,3738,3647,3623,3766,3687,3695,3642,3720,3687,3707,3823,3622,3581,3664,3676,3659,3737,3696,3681,3713,3608,3628,3601,3741,3689,3667,3631,3602,3629,3635,3681,3614,3761,3807,3742,3728,3674,3658,3585,3648,3577,3661,3605,3664,3670,3617,3718,3541,3706,3742,3588,3681,3549,3580,3667,3713,3572,3713,3755,3720,3667,3750,3760,3600,3739,3709,3642,3782,3590,3618,3678,3566,3638,3566,3646,3672,3746,3573,3687,3656,3688,3688,3687,3678,3671,3654,3640,3640,3620,3628,3579,3663,3626,3735,3608,3669,3545,3704,3656,3769,3766,3640,3673,3685,3650,3757,3607,3657,3769,3534,3585,3697,3646,3641,3641,3646,3626,3622,3767,3670,3703,3645,3516,3573,3658,3590,3704,3623,3589,3682,3737,3747,3791,3709,3709,3660,3707,3694,3680,3565,3669,3697,3709,3634,3588,3660,3770,3681,3687,3772,3649,3560,3662,3661,3636,3650,3671,3773,3668,3605,3642,3581,3736,3586,3653,3670,3784,3674,3574,3702,3758,3705,3677,3793,3637,3573,3701,3654,3727,3676,3571,3652,3777,3584,3689,3613,3633,3700,3716,3667,3676,3665,3652,3649,3617,3701,3712,3759,3715,3675,3554,3643,3694,3689,3656,3638,3607,3652,3696,3630,3735,3715,3581,3646,3638,3675,3721,3671,3695,3754,3633,3673,3634,3659,3613,3796,3698,3844,3640,3630,3658,3528,3730,3748,3569,3639,3534,3689,3661,3562,3626,3710,3589,3724,3697,3601,3624,3550,3723,3656,3777,3643]},{"counters":[3641,3560,3652,3731,3683,3658,3718,3646,3589,3692,3610,3544,3661,3669,3686,3676,3596,3542,3708,3728,3614,3670,3586,3714,3628,3711,3707,3707,3729,3613,3613,3630,3644,3750,3634,3626,3584,3720,3581,3695,3677,3696,3692,3615,3521,3688,3606,3626,3760,3567,3700,3681,3724,3615,3728,3582,3655,3585,3659,3632,3658,3610,3619,3667,3683,3666,3707,3680,3582,3677,3645,3614,3754,3716,3677,3733,3656,3663,3723,3652,3516,3763,3608,3532,3655,3673,3656,3639,3654,3604,3669,3647,3764,3541,3645,3647,3670,3664,3663,3613,3710,3725,3652,3673,3695,3591,3680,3567,3739,3602,3671,3643,3532,3752,3679,3737,3701,3782,3603,3670,3680,3687,3664,3775,3756,3660,3612,3682,3551,3806,3698,3644,3629,3678,3620,3670,3740,3635,3673,3562,3633,3680,3667,3638,3723,3659,3778,3603,3593,3589,3683,3765,3715,3616,3644,3620,3602,3505,3658,3641,3659,3490,3630,3628,3596,3653,3707,3641,3662,3699,3740,3635,3624,3646,3647,3675,3636,3628,3614,3708,3698,3708,3660,3710,3700,3812,3704,3578,3654,3651,3618,3678,3725,3620,3732,3680,3648,3745,3661,3627,3513,3744,3662,3679,3680,3548,3710,3776,3693,3690,3637,3642,3677,3592,3614,3705,3681,3663,3653,3648,3730,3660,3749,3602,3658,3527,3722,3729,3576,3563,3682,3733,3585,3659,3565,3681,3606,3703,3697,3654,3569,3792,3699,3650,3570,3660,3725,3709,3630,3642,3702,3774,3642,3661,3633,3663,3644,3670,3659,3576,3708,3788,3618,3699,3598,3659,3609,3645,3749,3670,3662,3646,3776,3640,3724,3639,3645,3672,3650,3621,3543,3619,3704,3731,3739,3610,3580,3614,3690,3609,3648,3618,3623,3677,3657,3573,3682,3621,3630,3648,3794,3760,3592,3636,3812,3498,3632,3733,3690,3631,3611,3653,3667,3716,3644,3598,3694,3746,3598,3633,3603,3720,3614,3718,3630,3698,3759,3777,3663,3739,3737,3653,3626,3574,3603,3730,3744,3556,3678,3723,3547,3695,3619,3708,3726,3660,3715,3698,3688,3691,3735,3658,3652,3571,3773,3637,3688,3674,3674,3704,3590,3651,3625,3567,3578,3711,3640,3626,3624,3716,3609,3605,3643,3661,3602,3626,3797,3623,3570,3703,3722,3519,3651,3571,3678,3654,3600,3669,3760,3688,3561,3538,3724,3809,3622,3698,3743,3590,3684,3634,3751,3584,3717,3552,3683,3728,3747,3604,3717,3709,3581,3716,3735,3701,3690,3596,3601,3680,3538,3639,3643,3756,3652,3580,3702,3708,3609,3676,3715,3687,3739,3575,3656,3700,3644,3729,3619,3645,3695,3552,3603,3604,3625,3699,3640,3699,3737,3687,3635,3624,3605,3657,3623,3707,3619,3710,3639,3714,3691,3676,3621,3621,3653,3648,3721,3633,3609,3549,3603,3683,3630,3702,3642,3616,3574,3569,3622,3645,3737,3703,3669,3760,3735,3622,3670,3647,3559,3663,3598,3597,3721,3753,3607,3632,3623,3616,3664,3687,3803,3663,3759,3688,3714,3762,3621,3663,3729,3627,3630,3707,3581,3716,3796,3581,3687,3633,3670,3772,3790,3641,3694,3611,3564,3626,3701,3608,3611,3498,3688,3603,3616,3648,3596,3672,3771,3768,3676,3688,3546,3705,3624,3667,3590,3695,3659,3691,3714,3631,3701,3643,3724,3727,3674,3724,3585,3688,3735,3627,3700,3561,3659,3707,3683,3715,3715,3654,3709,3616,3697,3492,3629,3605,3758,3756,3669,3590,3657,3655,3767,3639,3662,3575,3839,3630,3660,3843,3712,3579,3749,3597,3723,3598,3631,3638,3656,3641,3614,3658,3685,3651,3656,3573,3558,3664,3660,3677,3507,3663,3609,3748,3521,3612,3671,3649,3735,3610,3549,3660,3721,3720,3617,3515,3644,3670,3655,3704,3585,3717,3771,3784,3768,3656,3714,3553,3694,3663,3658,3708,3712,3638,3699,3678,3717,3607,3652,3759,3701,3597,3646,3667,3591,3669,3672,3580,3665,3710,3663,3646,3722,3665,3652,3685,3623,3654,3709,3623,3858,3686,3684,3668,3659,3592,3778,3777,3800,3716,3545,3662,3642,3610,3736,3690,3660,3677,3674,3761,3666,3653,3761,3728,3683,3644,3720,3700,3643,3615,3732,3645,3734,3738,3720,3717,3747,3764,3712,3684,3605,3652,3658,3529,3699,3690,3680,3680,3608,3613,3528,3693,3655,3644,3560,3640,3598,3568,3605,3693,3792,3702,3706,3645,3711,3616,3654,3611,3643,3678,3772,3622,3697,3585,3586,3715,3562,3527,3719,3597,3609,3732,3639,3629,3751,3622,3624,3547,3592,3683,3674,3622,3665,3587,3553,3688,3694,3606,3733,3656,3719,3637,3569,3612,3661,3564,3727,3674,3675,3725,3764,3708,3738,3673,3649,3647,3733,3701,3612,3556,3630,3510,3648,3647,3742,3595,3678,3681,3645,3785,3670,3610,3587,3703,3716,3598,3560,3707,3734,3602,3654,3585,3740,3756,3756,3690,3652,3656,3600,3706,3592,3681,3678,3709,3502,3685,3588,3697,3681,3667,3688,3634,3728,3729,3729,3726,3659,3819,3649,3705,3623,3691,3683,3573,3663,3722,3686,3699,3628,3642,3687,3647,3679,3609,3592,3659,3709,3830,3725,3660,3747,3686,3677,3753,3697,3701,3719,3733,3704,3690,3702,3618,3656,3635,3574,3660,3575,3668,3688,3600,3494,3764,3588,3620,3706,3656,3652,3732,3682,3723,3666,3725,3608,3545,3580,3554,3624,3646,3621,3636,3673,3629,3762,3651,3616,3728,3768,3643,3719,3751,3640,3706,3737,3698,3698,3595,3565,3729,3670,3642,3625,3706,3755,3650,3690,3678,3643,3684,3630,3831,3694,3696,3620,3573,3776,3662,3625,3690,3663,3607,3602,3573,3550,3705,3687,3804,3648,3628,3617,3737,3629,3818,3673,3794,3724,3590,3533,3595,3618,3597,3572,3692,3754,3607,3533,3740,3655,3678,3734,3651,3697,3647,3613,3588,3569,3719,3763,3657,3721,3623,3586,3628,3679,3672,3704,3785,3749,3645,3728,3717,3653,3755,3577,3559,3644,3601,3642,3619,3657,3539,3709,3679,3639,3719,3613,3682,3676,3600,3634,3599,3712,3825,3668,3682,3640,3673,3627,3756,3664,3654,3647,3759,3577,3653,3599,3578,3666,3615,3634,3734,3688,3555,3681,3554,3602,3598,3724,3649,3640,3620,3665,3573,3741,3673,3703,3646,3700,3624,3563,3594,3745,3761,3583,3620,3631,3751,3730,3715,3757,3524,3684,3611,3634,3638,3607,3716,3731,3685,3583,3668,3636,3854,3669,3746,3520,3681,3681,3684,3584,3637,3736,3704,3660,3648,3649,3568,3635,3676,3662,3659,3722,3515,3545,3709,3699,3640,3616,3556,3583,3647,3626,3712,3639,3585,3628,3666,3661,3678,3662,3668,3671,3585,3711,3658,3554,3679,3663,3639,3600,3623,3604,3678,3574,3628,3650,3667,3570,3588,3697,3685,3546,3673,3667,3707,3630,3734,3638,3508,3575,3728,3691,3736,3613,3600,3582,3573,3588,3622,3566,3638,3633,3766,3593,3659,3731,3813,3518,3637,3562,3640,3713,3569,3683,3590,3666,3611,3775,3732,3803,3686,3644,3738,3619,3637,3723,3574,3630,3762,3592,3642,3663,3700,3727,3579,3699,3686,3612,3774,3596,3701,3648,3773,3693,3658,3667,3638,3670,3649,3553,3716,3686,3721,3525,3667,3735,3694,3708,3592,3618,3691,3729,3768,3692,3609,3789,3593,3778,3702,3679,3691,3631,3641,3758,3539,3708,3590,3640,3685,3611,3607,3625,3681,3626,3788,3688,3597,3652,3664,3773,3612,3635,3601,3606,3683,3697,3736,3656,3667,3669,3700,3628,3610,3705,3644,3678,3682,3530,3674,3678,3597,3677,3720,3535,3666,3640,3593,3631,3708,3774,3645,3710,3667,3642,3673,3619,3648,3531,3590,3655,3769,3710,3640,3672,3714,3676,3575,3689,3682,3621,3681,3669,3602,3618,3636,3726,3671,3680,3821,3693,3635,3771,3676,3641,3681,3631,3576,3698,3643,3536,3664,3599,3732,3520,3609,3639,3762,3738,3666,3748,3648,3678,3594,3679,3561,3576,3661,3624,3632,3633,3664,3702,3637,3736,3656,3637,3756,3765,3710,3599,3670,3619,3686,3675,3708,3679,3617,3661,3694,3734,3611,3757,3635,3632,3755,3672,3749,3604,3645,3595,3668,3728,3703,3667,3790,3663,3596,3814,3699,3699,3752,3582,3628,3703,3690,3700,3737,3684,3541,3695,3699,3582,3636,3626,3597,3673,3768,3616,3704,3728,3706,3730,3603,3619,3668,3639,3646,3608,3724,3712,3582,3648,3709,3577,3703,3588,3725,3778,3617,3650,3602,3594,3671,3659,3654,3712,3631,3719,3699,3696,3637,3721,3636,3640,3588,3662,3586,3683,3603,3652,3713,3646,3681,3590,3659,3632,3779,3626,3802,3801,3719,3705,3673,3604,3752,3621,3673,3648,3607,3600,3650,3752,3772,3719,3684,3808,3665,3730,3726,3566,3666,3684,3580,3600,3566,3616,3779,3708,3620,3586,3603,3747,3704,3729,3654,3694,3747,3570,3648,3627,3610,3728,3580,3679,3697,3567,3741,3746,3667,3708,3622,3700,3693,3657,3832,3690,3680,3704,3731,3624,3630,3646,3673,3738,3637,3759,3632,3563,3663,3647,3598,3770,3743,3758,3601,3724,3667,3700,3772,3663,3689,3655,3614,3617,3708,3683,3637,3512,3761,3686,3578,3594,3702,3784,3653,3790,3612,3678,3642,3647,3670,3673,3596,3700,3591,3576,3706,3595,3737,3691,3624,3715,3695,3689,3634,3776,3635,3689,3624,3737,3657,3722,3699,3471,3681,3657,3669,3649,3695,3638,3608,3742,3698,3637,3594,3544,3628,3597,3688,3715,3677,3636,3714,3729,3589,3652,3629,3622,3640,3545,3634,3698,3725,3707,3597,3566,3635,3574,3608,3714,3683,3742,3539,3711,3691,3675,3662,3648,3661,3720,3703,3702,3685,3670,3629,3617,3624,3640,3618,3594,3657,3649,3761,3700,3686,3565,3603,3671,3615,3644,3693,3579,3683,3716,3700,3725,3710,3653,3736,3726,3689,3662,3593,3635,3663,3770,3760,3615,3677,3671,3670,3756,3707,3751,3667,3731,3657,3722,3742,3734,3553,3658,3689,3686,3685,3586,3639,3616,3615,3719,3595,3677,3705,3641,3661,3608,3551,3599,3570,3689,3688,3602,3731,3721,3762,3614,3657,3626,3684,3611,3696,3544,3700,3742,3639,3750,3598,3677,3690,3580,3692,3743,3602,3611,3708,3615,3638,3721,3621,3690,3743,3665,3633,3692,3698,3678,3679,3802,3636,3695,3551,3719,3693,3610,3682,3666,3654,3666,3659,3772,3742,3619,3703,3615,3793,3663,3799,3632,3586,3526,3593,3698,3692,3655,3743,3627,3621,3633,3559,3622,3667,3567,3728,3625,3709,3533,3635,3765,3694,3668,3651,3668,3570,3660,3700,3584,3695,3601,3576,3680,3584,3698,3653,3605,3692,3648,3695,3658,3656,3663,3680,3709,3617,3699,3610,3695,3689,3572,3727,3658,3549,3643,3737,3684,3698,3695,3652,3680,3731,3572,3641,3594,3608,3698,3609,3664,3698,3676,3608,3717,3589,3678,3595,3638,3741,3631,3619,3719,3641,3786,3643,3583,3738,3691,3540,3628,3634,3609,3572,3702,3604,3785,3626,3601,3678,3668,3585,3572,3641,3699,3626,3500,3682,3667,3656,3650,3761,3580,3698,3706,3617,3758,3575,3586,3672,3656,3719,3589,3666,3622,3640,3620,3647,3628,3671,3676,3685,3592,3754,3667,3626,3678,3675,3709,3595,3624,3677,3675,3643,3611,3733,3581,3744,3678,3755,3608,3651,3708,3736,3657,3574,3702,3690,3568,3692,3628,3638,3609,3662,3672,3667,3620,3624,3540,3627,3580,3721,3695,3793,3689,3673,3634,3663,3601,3561,3710,3675,3548,3661,3593,3760,3683,3647,3652,3697,3707,3733,3688,3680,3490,3622,3651,3680,3636,3618,3631,3647,3685,3635,3714,3658,3632,3753,3710,3633,3796,3572,3794,3659,3700,3621,3625,3752,3717,3704,3725,3690,3723,3624,3664,3760,3606,3707,3609,3634,3616,3616,3619,3700,3666,3611,3705,3703,3647,3624,3635,3759,3657,3721,3676,3631,3775,3634,3720,3664,3623,3689,3698,3656,3635,3626,3738,3661,3700,3715,3643,3613,3614,3742,3584,3679,3706,3672,3586,3673,3704,3680,3659,3530,3636,3732,3654,3756,3660,3685,3688,3681,3749,3660,3795,3805,3681,3692,3711,3595,3733,3633,3699,3547,3581,3609,3752,3675,3635,3653,3615,3674,3692,3595,3627,3732,3635,3743,3597,3733,3659,3689,3647,3780,3638,3670,3743,3643]},{"counters":[3513,3648,3648,3668,3623,3731,3804,3643,3677,3608,3741,3657,3784,3691,3764,3582,3699,3706,3685,3691,3653,3623,3647,3578,3723,3712,3589,3549,3730,3681,3616,3697,3578,3744,3579,3643,3732,3675,3741,3677,3629,3682,3730,3635,3606,3664,3684,3706,3710,3631,3701,3717,3695,3716,3678,3666,3666,3666,3656,3728,3745,3610,3735,3659,3712,3657,3766,3683,3692,3626,3625,3558,3622,3827,3641,3620,3695,3651,3546,3521,3723,3684,3518,3603,3607,3662,3728,3678,3609,3624,3593,3693,3597,3709,3678,3690,3743,3699,3611,3603,3656,3753,3662,3618,3656,3693,3584,3717,3648,3665,3765,3691,3602,3587,3541,3634,3639,3692,3629,3736,3631,3826,3631,3606,3652,3736,3616,3647,3690,3680,3673,3644,3735,3592,3736,3621,3672,3706,3665,3687,3706,3661,3698,3617,3580,3593,3506,3625,3752,3544,3619,3625,3645,3685,3760,3786,3573,3665,3681,3643,3666,3773,3613,3505,3688,3670,3695,3548,3575,3680,3770,3665,3645,3585,3630,3687,3730,3715,3584,3644,3686,3616,3693,3755,3681,3619,3621,3762,3688,3653,3691,3788,3532,3647,3714,3675,3625,3766,3545,3693,3719,3755,3723,3576,3692,3657,3616,3701,3753,3708,3610,3629,3507,3632,3777,3641,3771,3653,3629,3629,3686,3612,3643,3654,3693,3729,3772,3770,3747,3705,3637,3747,3737,3672,3687,3649,3658,3671,3603,3704,3638,3658,3604,3754,3639,3592,3706,3699,3745,3648,3648,3596,3660,3680,3645,3650,3661,3668,3673,3622,3758,3608,3606,3658,3633,3678,3567,3669,3709,3590,3562,3679,3621,3693,3656,3643,3606,3636,3720,3690,3793,3650,3631,3675,3653,3628,3680,3656,3724,3589,3667,3779,3602,3685,3728,3692,3646,3677,3599,3673,3711,3577,3734,3656,3673,3663,3726,3667,3739,3680,3739,3620,3685,3683,3646,3637,3647,3677,3565,3681,3636,3732,3662,3661,3637,3567,3685,3718,3629,3651,3634,3663,3576,3691,3678,3605,3704,3753,3612,3634,3645,3518,3672,3670,3586,3624,3584,3659,3699,3678,3718,3638,3680,3725,3704,3585,3776,3591,3772,3661,3573,3663,3621,3657,3689,3649,3661,3740,3763,3557,3559,3662,3719,3571,3700,3709,3570,3568,3567,3696,3664,3717,3633,3754,3606,3604,3691,3472,3675,3576,3700,3795,3589,3741,3624,3664,3696,3662,3713,3525,3607,3743,3614,3770,3588,3637,3679,3611,3659,3666,3579,3763,3583,3642,3657,3667,3613,3608,3662,3692,3620,3664,3711,3698,3697,3759,3727,3696,3618,3654,3568,3667,3639,3630,3599,3689,3643,3662,3623,3634,3654,3518,3630,3680,3704,3678,3679,3695,3629,3675,3667,3599,3746,3664,3547,3720,3704,3666,3638,3650,3653,3653,3661,3649,3639,3671,3641,3671,3776,3698,3574,3693,3677,3597,3740,3622,3685,3748,3687,3671,3705,3571,3646,3596,3620,3642,3644,3647,3670,3651,3576,3690,3652,3676,3596,3591,3641,3745,3661,3609,3671,3660,3655,3603,3788,3654,3689,3739,3560,3746,3634,3602,3679,3748,3746,3618,3728,3711,3677,3775,3610,3618,3597,3577,3604,3650,3631,3711,3686,3612,3690,3675,3631,3820,3681,3631,3635,3621,3699,3603,3669,3667,3634,3570,3644,3756,3511,3618,3634,3776,3670,3698,3749,3640,3568,3598,3645,3552,3616,3736,3669,3656,3695,3742,3753,3654,3603,3570,3603,3690,3677,3635,3647,3589,3759,3662,3596,3649,3618,3671,3644,3596,3679,3600,3677,3681,3670,3760,3594,3619,3627,3800,3532,3623,3610,3707,3606,3645,3635,3693,3702,3627,3639,3629,3798,3710,3584,3642,3601,3635,3648,3590,3655,3630,3627,3607,3698,3705,3731,3725,3657,3747,3666,3520,3637,3721,3708,3684,3677,3671,3670,3698,3635,3659,3702,3627,3595,3662,3664,3640,3634,3538,3735,3732,3596,3652,3565,3738,3624,3662,3711,3646,3616,3666,3658,3718,3660,3650,3703,3634,3676,3530,3525,3618,3727,3721,3643,3697,3653,3773,3625,3593,3779,3802,3509,3630,3663,3602,3753,3772,3605,3753,3657,3702,3707,3773,3657,3652,3505,3728,3812,3589,3624,3584,3656,3702,3660,3562,3653,3610,3689,3622,3641,3822,3683,3688,3622,3589,3732,3698,3694,3666,3644,3596,3677,3710,3708,3653,3656,3562,3765,3642,3655,3778,3734,3684,3782,3776,3646,3708,3576,3711,3720,3627,3613,3603,3641,3687,3797,3611,3611,3650,3825,3690,3661,3665,3632,3743,3688,3621,3636,3625,3793,3710,3711,3626,3623,3715,3791,3622,3691,3564,3579,3524,3620,3633,3568,3724,3690,3750,3718,3757,3718,3707,3718,3719,3557,3722,3680,3733,3693,3727,3581,3695,3721,3652,3740,3620,3667,3679,3661,3567,3683,3769,3692,3587,3705,3720,3592,3547,3681,3737,3736,3667,3647,3567,3701,3611,3648,3633,3644,3715,3557,3589,3700,3565,3730,3643,3552,3663,3710,3659,3732,3668,3727,3562,3587,3661,3651,3699,3608,3767,3602,3724,3670,3664,3762,3762,3735,3715,3663,3706,3815,3583,3521,3761,3754,3686,3737,3639,3707,3730,3625,3634,3659,3692,3626,3729,3625,3746,3641,3760,3679,3562,3670,3510,3531,3661,3739,3658,3695,3608,3649,3679,3564,3621,3756,3522,3675,3554,3786,3593,3568,3764,3615,3627,3555,3522,3655,3683,3618,3647,3556,3577,3684,3644,3692,3614,3709,3688,3714,3588,3673,3612,3519,3721,3652,3571,3796,3651,3706,3601,3718,3706,3682,3624,3537,3676,3697,3619,3601,3696,3592,3617,3616,3588,3599,3798,3629,3745,3714,3582,3592,3789,3721,3622,3848,3605,3703,3528,3711,3641,3697,3709,3665,3576,3681,3746,3558,3742,3625,3603,3628,3693,3741,3683,3737,3569,3654,3627,3706,3627,3596,3559,3713,3625,3704,3601,3714,3681,3611,3719,3736,3706,3683,3675,3734,3739,3715,3737,3574,3748,3653,3643,3741,3701,3650,3648,3691,3616,3642,3618,3636,3765,3633,3734,3691,3658,3613,3591,3558,3646,3777,3472,3710,3696,3622,3685,3650,3693,3717,3757,3752,3697,3661,3627,3610,3625,3644,3654,3770,3653,3770,3734,3705,3688,3634,3694,3589,3647,3657,3666,3700,3652,3702,3672,3651,3599,3583,3552,3664,3716,3694,3710,3782,3680,3615,3724,3610,3742,3640,3749,3573,3656,3685,3777,3719,3638,3620,3688,3691,3686,3662,3714,3776,3628,3605,3669,3776,3637,3657,3737,3625,3686,3705,3697,3690,3566,3755,3766,3709,3605,3457,3577,3515,3712,3637,3522,3572,3664,3802,3596,3679,3616,3838,3610,3600,3684,3571,3590,3704,3696,3603,3667,3725,3712,3731,3753,3622,3793,3691,3730,3637,3679,3622,3707,3789,3599,3565,3562,3604,3732,3704,3617,3628,3615,3644,3685,3681,3684,3671,3755,3661,3580,3687,3774,3576,3690,3637,3714,3676,3658,3717,3747,3718,3617,3709,3590,3674,3757,3585,3654,3639,3603,3696,3756,3706,3644,3658,3656,3575,3668,3645,3680,3629,3642,3707,3660,3742,3652,3669,3703,3694,3695,3626,3660,3638,3619,3619,3671,3490,3629,3718,3613,3810,3633,3669,3673,3703,3677,3691,3650,3702,3588,3671,3625,3587,3656,3718,3551,3640,3716,3724,3752,3726,3658,3665,3719,3592,3734,3669,3702,3835,3699,3640,3672,3637,3646,3709,3696,3574,3718,3656,3667,3649,3643,3681,3645,3626,3689,3703,3614,3677,3676,3607,3646,3723,3783,3700,3577,3614,3658,3769,3613,3746,3707,3698,3609,3556,3672,3677,3605,3686,3697,3885,3673,3648,3742,3588,3647,3546,3604,3803,3831,3588,3813,3612,3657,3610,3604,3677,3671,3662,3594,3710,3669,3684,3687,3736,3692,3747,3624,3688,3691,3650,3650,3667,3567,3788,3654,3658,3607,3618,3612,3686,3623,3610,3636,3543,3707,3550,3775,3703,3700,3619,3742,3708,3749,3681,3630,3713,3697,3657,3699,3691,3673,3616,3769,3660,3621,3693,3666,3741,3657,3690,3619,3738,3641,3635,3703,3665,3723,3551,3726,3680,3648,3591,3647,3737,3540,3645,3698,3587,3691,3730,3666,3747,3666,3721,3548,3534,3709,3682,3753,3544,3586,3652,3601,3660,3599,3704,3711,3664,3577,3684,3585,3553,3675,3713,3665,3569,3663,3674,3683,3758,3803,3660,3588,3726,3723,3724,3712,3656,3652,3667,3687,3586,3621,3571,3652,3843,3717,3578,3698,3628,3554,3640,3703,3657,3768,3640,3676,3661,3634,3722,3631,3701,3795,3580,3678,3672,3623,3603,3641,3572,3659,3704,3624,3623,3691,3573,3669,3689,3727,3727,3559,3627,3663,3588,3558,3705,3671,3778,3668,3632,3661,3677,3618,3762,3648,3692,3707,3635,3562,3624,3671,3666,3710,3691,3692,3578,3692,3632,3607,3604,3713,3748,3592,3721,3706,3637,3746,3613,3668,3576,3689,3712,3610,3711,3642,3607,3723,3652,3641,3649,3752,3632,3668,3796,3707,3639,3677,3644,3599,3570,3645,3682,3679,3594,3548,3710,3591,3651,3655,3590,3635,3625,3580,3694,3663,3594,3732,3533,3720,3689,3598,3541,3710,3671,3568,3657,3533,3555,3712,3605,3580,3613,3639,3646,3604,3597,3743,3578,3722,3608,3587,3569,3635,3643,3545,3553,3651,3632,3647,3694,3670,3661,3739,3664,3707,3715,3651,3776,3626,3715,3568,3562,3702,3631,3630,3820,3600,3686,3627,3595,3694,3721,3654,3600,3840,3760,3624,3642,3696,3664,3693,3640,3719,3718,3685,3683,3641,3663,3802,3704,3705,3690,3663,3618,3620,3580,3662,3546,3619,3636,3620,3649,3667,3672,3593,3675,3799,3697,3641,3672,3827,3690,3706,3761,3672,3699,3678,3808,3642,3717,3642,3618,3671,3684,3652,3676,3653,3710,3662,3755,3531,3719,3561,3633,3628,3774,3729,3690,3577,3787,3669,3617,3673,3625,3684,3658,3703,3721,3611,3713,3680,3675,3519,3607,3749,3670,3650,3568,3600,3612,3698,3670,3682,3672,3725,3667,3667,3661,3748,3629,3700,3637,3604,3686,3639,3697,3673,3639,3624,3605,3687,3684,3633,3771,3714,3482,3891,3613,3642,3705,3688,3595,3723,3698,3600,3660,3683,3597,3723,3750,3648,3548,3717,3702,3701,3601,3634,3644,3647,3736,3775,3693,3781,3650,3712,3670,3598,3500,3658,3695,3746,3685,3616,3620,3672,3676,3685,3573,3569,3614,3700,3602,3567,3658,3663,3676,3673,3631,3697,3717,3801,3636,3714,3741,3667,3549,3681,3609,3555,3606,3681,3647,3654,3755,3671,3696,3583,3645,3583,3580,3575,3578,3710,3712,3787,3556,3682,3779,3636,3806,3576,3615,3615,3650,3708,3671,3563,3598,3739,3685,3685,3648,3675,3703,3591,3595,3707,3654,3650,3622,3652,3708,3592,3581,3627,3706,3668,3699,3568,3741,3747,3573,3706,3671,3618,3539,3561,3600,3727,3743,3634,3476,3542,3721,3672,3663,3746,3732,3687,3736,3534,3695,3645,3667,3673,3606,3653,3693,3631,3615,3594,3699,3639,3673,3724,3703,3732,3633,3637,3730,3636,3809,3535,3623,3588,3580,3578,3672,3624,3648,3644,3655,3672,3778,3686,3618,3687,3694,3701,3733,3677,3635,3612,3506,3738,3688,3651,3617,3631,3700,3645,3636,3583,3723,3661,3709,3731,3679,3660,3665,3622,3587,3611,3579,3630,3647,3657,3712,3636,3792,3634,3666,3646,3583,3688,3667,3755,3595,3689,3721,3643,3674,3743,3742,3546,3664,3629,3618,3511,3700,3753,3693,3700,3696,3625,3638,3658,3727,3596,3694,3691,3621,3612,3673,3721,3647,3638,3611,3590,3615,3725,3625,3657,3645,3715,3589,3621,3704,3604,3629,3600,3737,3648,3690,3625,3713,3667,3767,3562,3587,3622,3720,3662,3635,3678,3624,3752,3623,3609,3747,3619,3522,3652,3698,3654,3780,3712,3644,3708,3670,3622,3645,3698,3549,3630,3554,3494,3677,3664,3715,3694,3628,3671,3726,3608,3642,3788,3665,3662,3556,3594,3692,3669,3688,3774,3699,3638,3626,3600,3699,3672,3635,3645,3605,3715,3616,3772,3674,3572,3709,3681,3748,3668,3594,3696,3756,3675,3713,3565,3690,3623,3606,3614,3599,3682,3676,3723,3656,3640,3737,3753,3752,3636,3734,3741,3590,3689,3695,3803,3671,3577,3773,3568,3659,3567,3589,3735,3689,3667,3684,3488,3577,3643,3623,3643,3595,3694,3675,3643,3620,3664,3641,3684]}]},"null_count":0,"tot_col_size":563125482,"last_update_version":401695328083640322},"c_custkey":{"histogram":{"ndv":7500000,"buckets":[{"count":65536,"lower_bound":"MQ==","upper_bound":"NjU1MzY=","repeats":1},{"count":131072,"lower_bound":"NjU1Mzc=","upper_bound":"MTMxMDcy","repeats":1},{"count":196608,"lower_bound":"MTMxMDcz","upper_bound":"MTk2NjA4","repeats":1},{"count":262144,"lower_bound":"MTk2NjA5","upper_bound":"MjYyMTQ0","repeats":1},{"count":327680,"lower_bound":"MjYyMTQ1","upper_bound":"MzI3Njgw","repeats":1},{"count":393216,"lower_bound":"MzI3Njgx","upper_bound":"MzkzMjE2","repeats":1},{"count":458752,"lower_bound":"MzkzMjE3","upper_bound":"NDU4NzUy","repeats":1},{"count":523822,"lower_bound":"NDU4NzUz","upper_bound":"NTIzODIy","repeats":1},{"count":589358,"lower_bound":"NTIzODIz","upper_bound":"NTg5MzU4","repeats":1},{"count":654894,"lower_bound":"NTg5MzU5","upper_bound":"NjU0ODk0","repeats":1},{"count":720430,"lower_bound":"NjU0ODk1","upper_bound":"NzIwNDMw","repeats":1},{"count":785966,"lower_bound":"NzIwNDMx","upper_bound":"Nzg1OTY2","repeats":1},{"count":851502,"lower_bound":"Nzg1OTY3","upper_bound":"ODUxNTAy","repeats":1},{"count":915313,"lower_bound":"ODUxNTAz","upper_bound":"OTE1MzEz","repeats":1},{"count":980849,"lower_bound":"OTE1MzE0","upper_bound":"OTgwODQ5","repeats":1},{"count":1046385,"lower_bound":"OTgwODUw","upper_bound":"MTA0NjM4NQ==","repeats":1},{"count":1111921,"lower_bound":"MTA0NjM4Ng==","upper_bound":"MTExMTkyMQ==","repeats":1},{"count":1177457,"lower_bound":"MTExMTkyMg==","upper_bound":"MTE3NzQ1Nw==","repeats":1},{"count":1242993,"lower_bound":"MTE3NzQ1OA==","upper_bound":"MTI0Mjk5Mw==","repeats":1},{"count":1306849,"lower_bound":"MTI0Mjk5NA==","upper_bound":"MTMwNjg0OQ==","repeats":1},{"count":1372385,"lower_bound":"MTMwNjg1MA==","upper_bound":"MTM3MjM4NQ==","repeats":1},{"count":1437921,"lower_bound":"MTM3MjM4Ng==","upper_bound":"MTQzNzkyMQ==","repeats":1},{"count":1503457,"lower_bound":"MTQzNzkyMg==","upper_bound":"MTUwMzQ1Nw==","repeats":1},{"count":1568993,"lower_bound":"MTUwMzQ1OA==","upper_bound":"MTU2ODk5Mw==","repeats":1},{"count":1634529,"lower_bound":"MTU2ODk5NA==","upper_bound":"MTYzNDUyOQ==","repeats":1},{"count":1698484,"lower_bound":"MTYzNDUzMA==","upper_bound":"MTY5ODQ4NA==","repeats":1},{"count":1764020,"lower_bound":"MTY5ODQ4NQ==","upper_bound":"MTc2NDAyMA==","repeats":1},{"count":1829556,"lower_bound":"MTc2NDAyMQ==","upper_bound":"MTgyOTU1Ng==","repeats":1},{"count":1895092,"lower_bound":"MTgyOTU1Nw==","upper_bound":"MTg5NTA5Mg==","repeats":1},{"count":1960628,"lower_bound":"MTg5NTA5Mw==","upper_bound":"MTk2MDYyOA==","repeats":1},{"count":2026164,"lower_bound":"MTk2MDYyOQ==","upper_bound":"MjAyNjE2NA==","repeats":1},{"count":2090061,"lower_bound":"MjAyNjE2NQ==","upper_bound":"MjA5MDA2MQ==","repeats":1},{"count":2155597,"lower_bound":"MjA5MDA2Mg==","upper_bound":"MjE1NTU5Nw==","repeats":1},{"count":2221133,"lower_bound":"MjE1NTU5OA==","upper_bound":"MjIyMTEzMw==","repeats":1},{"count":2286669,"lower_bound":"MjIyMTEzNA==","upper_bound":"MjI4NjY2OQ==","repeats":1},{"count":2352205,"lower_bound":"MjI4NjY3MA==","upper_bound":"MjM1MjIwNQ==","repeats":1},{"count":2417741,"lower_bound":"MjM1MjIwNg==","upper_bound":"MjQxNzc0MQ==","repeats":1},{"count":2448897,"lower_bound":"MjQxNzc0Mg==","upper_bound":"MjQ0ODg5Nw==","repeats":1},{"count":2481665,"lower_bound":"MjQ0ODg5OA==","upper_bound":"MjQ4MTY2NQ==","repeats":1},{"count":2514433,"lower_bound":"MjQ4MTY2Ng==","upper_bound":"MjUxNDQzMw==","repeats":1},{"count":2547201,"lower_bound":"MjUxNDQzNA==","upper_bound":"MjU0NzIwMQ==","repeats":1},{"count":2579969,"lower_bound":"MjU0NzIwMg==","upper_bound":"MjU3OTk2OQ==","repeats":1},{"count":2612737,"lower_bound":"MjU3OTk3MA==","upper_bound":"MjYxMjczNw==","repeats":1},{"count":2645505,"lower_bound":"MjYxMjczOA==","upper_bound":"MjY0NTUwNQ==","repeats":1},{"count":2678273,"lower_bound":"MjY0NTUwNg==","upper_bound":"MjY3ODI3Mw==","repeats":1},{"count":2711041,"lower_bound":"MjY3ODI3NA==","upper_bound":"MjcxMTA0MQ==","repeats":1},{"count":2743809,"lower_bound":"MjcxMTA0Mg==","upper_bound":"Mjc0MzgwOQ==","repeats":1},{"count":2776577,"lower_bound":"Mjc0MzgxMA==","upper_bound":"Mjc3NjU3Nw==","repeats":1},{"count":2809345,"lower_bound":"Mjc3NjU3OA==","upper_bound":"MjgwOTM0NQ==","repeats":1},{"count":2840429,"lower_bound":"MjgwOTM0Ng==","upper_bound":"Mjg0MDQyOQ==","repeats":1},{"count":2873197,"lower_bound":"Mjg0MDQzMA==","upper_bound":"Mjg3MzE5Nw==","repeats":1},{"count":2905965,"lower_bound":"Mjg3MzE5OA==","upper_bound":"MjkwNTk2NQ==","repeats":1},{"count":2938733,"lower_bound":"MjkwNTk2Ng==","upper_bound":"MjkzODczMw==","repeats":1},{"count":2971501,"lower_bound":"MjkzODczNA==","upper_bound":"Mjk3MTUwMQ==","repeats":1},{"count":3004269,"lower_bound":"Mjk3MTUwMg==","upper_bound":"MzAwNDI2OQ==","repeats":1},{"count":3037037,"lower_bound":"MzAwNDI3MA==","upper_bound":"MzAzNzAzNw==","repeats":1},{"count":3069805,"lower_bound":"MzAzNzAzOA==","upper_bound":"MzA2OTgwNQ==","repeats":1},{"count":3102573,"lower_bound":"MzA2OTgwNg==","upper_bound":"MzEwMjU3Mw==","repeats":1},{"count":3135341,"lower_bound":"MzEwMjU3NA==","upper_bound":"MzEzNTM0MQ==","repeats":1},{"count":3168109,"lower_bound":"MzEzNTM0Mg==","upper_bound":"MzE2ODEwOQ==","repeats":1},{"count":3200877,"lower_bound":"MzE2ODExMA==","upper_bound":"MzIwMDg3Nw==","repeats":1},{"count":3231917,"lower_bound":"MzIwMDg3OA==","upper_bound":"MzIzMTkxNw==","repeats":1},{"count":3264685,"lower_bound":"MzIzMTkxOA==","upper_bound":"MzI2NDY4NQ==","repeats":1},{"count":3297453,"lower_bound":"MzI2NDY4Ng==","upper_bound":"MzI5NzQ1Mw==","repeats":1},{"count":3330221,"lower_bound":"MzI5NzQ1NA==","upper_bound":"MzMzMDIyMQ==","repeats":1},{"count":3362989,"lower_bound":"MzMzMDIyMg==","upper_bound":"MzM2Mjk4OQ==","repeats":1},{"count":3395757,"lower_bound":"MzM2Mjk5MA==","upper_bound":"MzM5NTc1Nw==","repeats":1},{"count":3428525,"lower_bound":"MzM5NTc1OA==","upper_bound":"MzQyODUyNQ==","repeats":1},{"count":3461293,"lower_bound":"MzQyODUyNg==","upper_bound":"MzQ2MTI5Mw==","repeats":1},{"count":3494061,"lower_bound":"MzQ2MTI5NA==","upper_bound":"MzQ5NDA2MQ==","repeats":1},{"count":3526829,"lower_bound":"MzQ5NDA2Mg==","upper_bound":"MzUyNjgyOQ==","repeats":1},{"count":3559597,"lower_bound":"MzUyNjgzMA==","upper_bound":"MzU1OTU5Nw==","repeats":1},{"count":3592365,"lower_bound":"MzU1OTU5OA==","upper_bound":"MzU5MjM2NQ==","repeats":1},{"count":3615285,"lower_bound":"MzU5MjM2Ng==","upper_bound":"MzYxNTI4NQ==","repeats":1},{"count":3648053,"lower_bound":"MzYxNTI4Ng==","upper_bound":"MzY0ODA1Mw==","repeats":1},{"count":3680821,"lower_bound":"MzY0ODA1NA==","upper_bound":"MzY4MDgyMQ==","repeats":1},{"count":3713589,"lower_bound":"MzY4MDgyMg==","upper_bound":"MzcxMzU4OQ==","repeats":1},{"count":3746357,"lower_bound":"MzcxMzU5MA==","upper_bound":"Mzc0NjM1Nw==","repeats":1},{"count":3779125,"lower_bound":"Mzc0NjM1OA==","upper_bound":"Mzc3OTEyNQ==","repeats":1},{"count":3811893,"lower_bound":"Mzc3OTEyNg==","upper_bound":"MzgxMTg5Mw==","repeats":1},{"count":3844661,"lower_bound":"MzgxMTg5NA==","upper_bound":"Mzg0NDY2MQ==","repeats":1},{"count":3877429,"lower_bound":"Mzg0NDY2Mg==","upper_bound":"Mzg3NzQyOQ==","repeats":1},{"count":3910197,"lower_bound":"Mzg3NzQzMA==","upper_bound":"MzkxMDE5Nw==","repeats":1},{"count":3942965,"lower_bound":"MzkxMDE5OA==","upper_bound":"Mzk0Mjk2NQ==","repeats":1},{"count":3975733,"lower_bound":"Mzk0Mjk2Ng==","upper_bound":"Mzk3NTczMw==","repeats":1},{"count":4006699,"lower_bound":"Mzk3NTczNA==","upper_bound":"NDAwNjY5OQ==","repeats":1},{"count":4039467,"lower_bound":"NDAwNjcwMA==","upper_bound":"NDAzOTQ2Nw==","repeats":1},{"count":4072235,"lower_bound":"NDAzOTQ2OA==","upper_bound":"NDA3MjIzNQ==","repeats":1},{"count":4105003,"lower_bound":"NDA3MjIzNg==","upper_bound":"NDEwNTAwMw==","repeats":1},{"count":4137771,"lower_bound":"NDEwNTAwNA==","upper_bound":"NDEzNzc3MQ==","repeats":1},{"count":4170539,"lower_bound":"NDEzNzc3Mg==","upper_bound":"NDE3MDUzOQ==","repeats":1},{"count":4203307,"lower_bound":"NDE3MDU0MA==","upper_bound":"NDIwMzMwNw==","repeats":1},{"count":4236075,"lower_bound":"NDIwMzMwOA==","upper_bound":"NDIzNjA3NQ==","repeats":1},{"count":4268843,"lower_bound":"NDIzNjA3Ng==","upper_bound":"NDI2ODg0Mw==","repeats":1},{"count":4301611,"lower_bound":"NDI2ODg0NA==","upper_bound":"NDMwMTYxMQ==","repeats":1},{"count":4334379,"lower_bound":"NDMwMTYxMg==","upper_bound":"NDMzNDM3OQ==","repeats":1},{"count":4367147,"lower_bound":"NDMzNDM4MA==","upper_bound":"NDM2NzE0Nw==","repeats":1},{"count":4398213,"lower_bound":"NDM2NzE0OA==","upper_bound":"NDM5ODIxMw==","repeats":1},{"count":4430981,"lower_bound":"NDM5ODIxNA==","upper_bound":"NDQzMDk4MQ==","repeats":1},{"count":4463749,"lower_bound":"NDQzMDk4Mg==","upper_bound":"NDQ2Mzc0OQ==","repeats":1},{"count":4496517,"lower_bound":"NDQ2Mzc1MA==","upper_bound":"NDQ5NjUxNw==","repeats":1},{"count":4529285,"lower_bound":"NDQ5NjUxOA==","upper_bound":"NDUyOTI4NQ==","repeats":1},{"count":4562053,"lower_bound":"NDUyOTI4Ng==","upper_bound":"NDU2MjA1Mw==","repeats":1},{"count":4594821,"lower_bound":"NDU2MjA1NA==","upper_bound":"NDU5NDgyMQ==","repeats":1},{"count":4627589,"lower_bound":"NDU5NDgyMg==","upper_bound":"NDYyNzU4OQ==","repeats":1},{"count":4660357,"lower_bound":"NDYyNzU5MA==","upper_bound":"NDY2MDM1Nw==","repeats":1},{"count":4693125,"lower_bound":"NDY2MDM1OA==","upper_bound":"NDY5MzEyNQ==","repeats":1},{"count":4725893,"lower_bound":"NDY5MzEyNg==","upper_bound":"NDcyNTg5Mw==","repeats":1},{"count":4758661,"lower_bound":"NDcyNTg5NA==","upper_bound":"NDc1ODY2MQ==","repeats":1},{"count":4789776,"lower_bound":"NDc1ODY2Mg==","upper_bound":"NDc4OTc3Ng==","repeats":1},{"count":4822544,"lower_bound":"NDc4OTc3Nw==","upper_bound":"NDgyMjU0NA==","repeats":1},{"count":4855312,"lower_bound":"NDgyMjU0NQ==","upper_bound":"NDg1NTMxMg==","repeats":1},{"count":4888080,"lower_bound":"NDg1NTMxMw==","upper_bound":"NDg4ODA4MA==","repeats":1},{"count":4920848,"lower_bound":"NDg4ODA4MQ==","upper_bound":"NDkyMDg0OA==","repeats":1},{"count":4953616,"lower_bound":"NDkyMDg0OQ==","upper_bound":"NDk1MzYxNg==","repeats":1},{"count":4986384,"lower_bound":"NDk1MzYxNw==","upper_bound":"NDk4NjM4NA==","repeats":1},{"count":5019152,"lower_bound":"NDk4NjM4NQ==","upper_bound":"NTAxOTE1Mg==","repeats":1},{"count":5051920,"lower_bound":"NTAxOTE1Mw==","upper_bound":"NTA1MTkyMA==","repeats":1},{"count":5084688,"lower_bound":"NTA1MTkyMQ==","upper_bound":"NTA4NDY4OA==","repeats":1},{"count":5117456,"lower_bound":"NTA4NDY4OQ==","upper_bound":"NTExNzQ1Ng==","repeats":1},{"count":5150224,"lower_bound":"NTExNzQ1Nw==","upper_bound":"NTE1MDIyNA==","repeats":1},{"count":5181378,"lower_bound":"NTE1MDIyNQ==","upper_bound":"NTE4MTM3OA==","repeats":1},{"count":5214146,"lower_bound":"NTE4MTM3OQ==","upper_bound":"NTIxNDE0Ng==","repeats":1},{"count":5246914,"lower_bound":"NTIxNDE0Nw==","upper_bound":"NTI0NjkxNA==","repeats":1},{"count":5279682,"lower_bound":"NTI0NjkxNQ==","upper_bound":"NTI3OTY4Mg==","repeats":1},{"count":5312450,"lower_bound":"NTI3OTY4Mw==","upper_bound":"NTMxMjQ1MA==","repeats":1},{"count":5345218,"lower_bound":"NTMxMjQ1MQ==","upper_bound":"NTM0NTIxOA==","repeats":1},{"count":5377986,"lower_bound":"NTM0NTIxOQ==","upper_bound":"NTM3Nzk4Ng==","repeats":1},{"count":5410754,"lower_bound":"NTM3Nzk4Nw==","upper_bound":"NTQxMDc1NA==","repeats":1},{"count":5443522,"lower_bound":"NTQxMDc1NQ==","upper_bound":"NTQ0MzUyMg==","repeats":1},{"count":5476290,"lower_bound":"NTQ0MzUyMw==","upper_bound":"NTQ3NjI5MA==","repeats":1},{"count":5509058,"lower_bound":"NTQ3NjI5MQ==","upper_bound":"NTUwOTA1OA==","repeats":1},{"count":5541826,"lower_bound":"NTUwOTA1OQ==","upper_bound":"NTU0MTgyNg==","repeats":1},{"count":5556643,"lower_bound":"NTU0MTgyNw==","upper_bound":"NTU1NjY0Mw==","repeats":1},{"count":5589411,"lower_bound":"NTU1NjY0NA==","upper_bound":"NTU4OTQxMQ==","repeats":1},{"count":5622179,"lower_bound":"NTU4OTQxMg==","upper_bound":"NTYyMjE3OQ==","repeats":1},{"count":5654947,"lower_bound":"NTYyMjE4MA==","upper_bound":"NTY1NDk0Nw==","repeats":1},{"count":5687715,"lower_bound":"NTY1NDk0OA==","upper_bound":"NTY4NzcxNQ==","repeats":1},{"count":5720483,"lower_bound":"NTY4NzcxNg==","upper_bound":"NTcyMDQ4Mw==","repeats":1},{"count":5753251,"lower_bound":"NTcyMDQ4NA==","upper_bound":"NTc1MzI1MQ==","repeats":1},{"count":5786019,"lower_bound":"NTc1MzI1Mg==","upper_bound":"NTc4NjAxOQ==","repeats":1},{"count":5818787,"lower_bound":"NTc4NjAyMA==","upper_bound":"NTgxODc4Nw==","repeats":1},{"count":5851555,"lower_bound":"NTgxODc4OA==","upper_bound":"NTg1MTU1NQ==","repeats":1},{"count":5884323,"lower_bound":"NTg1MTU1Ng==","upper_bound":"NTg4NDMyMw==","repeats":1},{"count":5917091,"lower_bound":"NTg4NDMyNA==","upper_bound":"NTkxNzA5MQ==","repeats":1},{"count":5948238,"lower_bound":"NTkxNzA5Mg==","upper_bound":"NTk0ODIzOA==","repeats":1},{"count":5981006,"lower_bound":"NTk0ODIzOQ==","upper_bound":"NTk4MTAwNg==","repeats":1},{"count":6013774,"lower_bound":"NTk4MTAwNw==","upper_bound":"NjAxMzc3NA==","repeats":1},{"count":6046542,"lower_bound":"NjAxMzc3NQ==","upper_bound":"NjA0NjU0Mg==","repeats":1},{"count":6079310,"lower_bound":"NjA0NjU0Mw==","upper_bound":"NjA3OTMxMA==","repeats":1},{"count":6112078,"lower_bound":"NjA3OTMxMQ==","upper_bound":"NjExMjA3OA==","repeats":1},{"count":6144846,"lower_bound":"NjExMjA3OQ==","upper_bound":"NjE0NDg0Ng==","repeats":1},{"count":6177614,"lower_bound":"NjE0NDg0Nw==","upper_bound":"NjE3NzYxNA==","repeats":1},{"count":6210382,"lower_bound":"NjE3NzYxNQ==","upper_bound":"NjIxMDM4Mg==","repeats":1},{"count":6243150,"lower_bound":"NjIxMDM4Mw==","upper_bound":"NjI0MzE1MA==","repeats":1},{"count":6275918,"lower_bound":"NjI0MzE1MQ==","upper_bound":"NjI3NTkxOA==","repeats":1},{"count":6308686,"lower_bound":"NjI3NTkxOQ==","upper_bound":"NjMwODY4Ng==","repeats":1},{"count":6339830,"lower_bound":"NjMwODY4Nw==","upper_bound":"NjMzOTgzMA==","repeats":1},{"count":6372598,"lower_bound":"NjMzOTgzMQ==","upper_bound":"NjM3MjU5OA==","repeats":1},{"count":6405366,"lower_bound":"NjM3MjU5OQ==","upper_bound":"NjQwNTM2Ng==","repeats":1},{"count":6438134,"lower_bound":"NjQwNTM2Nw==","upper_bound":"NjQzODEzNA==","repeats":1},{"count":6470902,"lower_bound":"NjQzODEzNQ==","upper_bound":"NjQ3MDkwMg==","repeats":1},{"count":6503670,"lower_bound":"NjQ3MDkwMw==","upper_bound":"NjUwMzY3MA==","repeats":1},{"count":6536438,"lower_bound":"NjUwMzY3MQ==","upper_bound":"NjUzNjQzOA==","repeats":1},{"count":6569206,"lower_bound":"NjUzNjQzOQ==","upper_bound":"NjU2OTIwNg==","repeats":1},{"count":6601974,"lower_bound":"NjU2OTIwNw==","upper_bound":"NjYwMTk3NA==","repeats":1},{"count":6634742,"lower_bound":"NjYwMTk3NQ==","upper_bound":"NjYzNDc0Mg==","repeats":1},{"count":6667510,"lower_bound":"NjYzNDc0Mw==","upper_bound":"NjY2NzUxMA==","repeats":1},{"count":6700278,"lower_bound":"NjY2NzUxMQ==","upper_bound":"NjcwMDI3OA==","repeats":1},{"count":6731400,"lower_bound":"NjcwMDI3OQ==","upper_bound":"NjczMTQwMA==","repeats":1},{"count":6764168,"lower_bound":"NjczMTQwMQ==","upper_bound":"Njc2NDE2OA==","repeats":1},{"count":6796936,"lower_bound":"Njc2NDE2OQ==","upper_bound":"Njc5NjkzNg==","repeats":1},{"count":6829704,"lower_bound":"Njc5NjkzNw==","upper_bound":"NjgyOTcwNA==","repeats":1},{"count":6862472,"lower_bound":"NjgyOTcwNQ==","upper_bound":"Njg2MjQ3Mg==","repeats":1},{"count":6895240,"lower_bound":"Njg2MjQ3Mw==","upper_bound":"Njg5NTI0MA==","repeats":1},{"count":6928008,"lower_bound":"Njg5NTI0MQ==","upper_bound":"NjkyODAwOA==","repeats":1},{"count":6960776,"lower_bound":"NjkyODAwOQ==","upper_bound":"Njk2MDc3Ng==","repeats":1},{"count":6993544,"lower_bound":"Njk2MDc3Nw==","upper_bound":"Njk5MzU0NA==","repeats":1},{"count":7026312,"lower_bound":"Njk5MzU0NQ==","upper_bound":"NzAyNjMxMg==","repeats":1},{"count":7059080,"lower_bound":"NzAyNjMxMw==","upper_bound":"NzA1OTA4MA==","repeats":1},{"count":7091848,"lower_bound":"NzA1OTA4MQ==","upper_bound":"NzA5MTg0OA==","repeats":1},{"count":7123004,"lower_bound":"NzA5MTg0OQ==","upper_bound":"NzEyMzAwNA==","repeats":1},{"count":7155772,"lower_bound":"NzEyMzAwNQ==","upper_bound":"NzE1NTc3Mg==","repeats":1},{"count":7188540,"lower_bound":"NzE1NTc3Mw==","upper_bound":"NzE4ODU0MA==","repeats":1},{"count":7221308,"lower_bound":"NzE4ODU0MQ==","upper_bound":"NzIyMTMwOA==","repeats":1},{"count":7254076,"lower_bound":"NzIyMTMwOQ==","upper_bound":"NzI1NDA3Ng==","repeats":1},{"count":7286844,"lower_bound":"NzI1NDA3Nw==","upper_bound":"NzI4Njg0NA==","repeats":1},{"count":7319612,"lower_bound":"NzI4Njg0NQ==","upper_bound":"NzMxOTYxMg==","repeats":1},{"count":7352380,"lower_bound":"NzMxOTYxMw==","upper_bound":"NzM1MjM4MA==","repeats":1},{"count":7385148,"lower_bound":"NzM1MjM4MQ==","upper_bound":"NzM4NTE0OA==","repeats":1},{"count":7417916,"lower_bound":"NzM4NTE0OQ==","upper_bound":"NzQxNzkxNg==","repeats":1},{"count":7450684,"lower_bound":"NzQxNzkxNw==","upper_bound":"NzQ1MDY4NA==","repeats":1},{"count":7483452,"lower_bound":"NzQ1MDY4NQ==","upper_bound":"NzQ4MzQ1Mg==","repeats":1},{"count":7500000,"lower_bound":"NzQ4MzQ1Mw==","upper_bound":"NzUwMDAwMA==","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695327939461123},"c_mktsegment":{"histogram":{"ndv":5,"buckets":[{"count":1467750,"lower_bound":"QVVUT01PQklMRQ==","upper_bound":"QVVUT01PQklMRQ==","repeats":1467750},{"count":2943750,"lower_bound":"QlVJTERJTkc=","upper_bound":"QlVJTERJTkc=","repeats":1476000},{"count":4432500,"lower_bound":"RlVSTklUVVJF","upper_bound":"RlVSTklUVVJF","repeats":1488750},{"count":5985750,"lower_bound":"SE9VU0VIT0xE","upper_bound":"SE9VU0VIT0xE","repeats":1553250},{"count":7500000,"lower_bound":"TUFDSElORVJZ","upper_bound":"TUFDSElORVJZ","repeats":1514250}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501166,0,0,0,0,0,0,1499775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1499775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1499775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1499775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1501166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500036,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1500554,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1498469,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1499775,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":82501130,"last_update_version":401695328070533122},"c_name":{"histogram":{"ndv":7260160,"buckets":[{"count":30000,"lower_bound":"Q3VzdG9tZXIjMDAwMDAwNDk2","upper_bound":"Q3VzdG9tZXIjMDAwMDM5MTc0","repeats":1},{"count":60000,"lower_bound":"Q3VzdG9tZXIjMDAwMDM5Mzk0","upper_bound":"Q3VzdG9tZXIjMDAwMDc0NDIy","repeats":1},{"count":90000,"lower_bound":"Q3VzdG9tZXIjMDAwMDc1Njg2","upper_bound":"Q3VzdG9tZXIjMDAwMTA5NDA0","repeats":1},{"count":120000,"lower_bound":"Q3VzdG9tZXIjMDAwMTA5Nzgz","upper_bound":"Q3VzdG9tZXIjMDAwMTUxNTM3","repeats":1},{"count":150000,"lower_bound":"Q3VzdG9tZXIjMDAwMTUyMDA0","upper_bound":"Q3VzdG9tZXIjMDAwMTg4NzQ2","repeats":1},{"count":180000,"lower_bound":"Q3VzdG9tZXIjMDAwMTg5MDAz","upper_bound":"Q3VzdG9tZXIjMDAwMjE1NDA0","repeats":1},{"count":210000,"lower_bound":"Q3VzdG9tZXIjMDAwMjE2MDMw","upper_bound":"Q3VzdG9tZXIjMDAwMjUzNzA3","repeats":1},{"count":240000,"lower_bound":"Q3VzdG9tZXIjMDAwMjU1OTcw","upper_bound":"Q3VzdG9tZXIjMDAwMjgzNzA3","repeats":1},{"count":270000,"lower_bound":"Q3VzdG9tZXIjMDAwMjg0ODk3","upper_bound":"Q3VzdG9tZXIjMDAwMzI3NDgz","repeats":1},{"count":300000,"lower_bound":"Q3VzdG9tZXIjMDAwMzI4NTY5","upper_bound":"Q3VzdG9tZXIjMDAwMzU5ODQy","repeats":1},{"count":330000,"lower_bound":"Q3VzdG9tZXIjMDAwMzYxMTY0","upper_bound":"Q3VzdG9tZXIjMDAwMzk4MTgw","repeats":1},{"count":360000,"lower_bound":"Q3VzdG9tZXIjMDAwMzk4NDM5","upper_bound":"Q3VzdG9tZXIjMDAwNDM0MzE1","repeats":1},{"count":390000,"lower_bound":"Q3VzdG9tZXIjMDAwNDM0NjE2","upper_bound":"Q3VzdG9tZXIjMDAwNDc0MzYz","repeats":1},{"count":420000,"lower_bound":"Q3VzdG9tZXIjMDAwNDc0Mzc3","upper_bound":"Q3VzdG9tZXIjMDAwNTAxNjgz","repeats":1},{"count":450000,"lower_bound":"Q3VzdG9tZXIjMDAwNTA0ODA5","upper_bound":"Q3VzdG9tZXIjMDAwNTMyOTEy","repeats":1},{"count":480000,"lower_bound":"Q3VzdG9tZXIjMDAwNTM0MzIy","upper_bound":"Q3VzdG9tZXIjMDAwNTY2Mzgy","repeats":1},{"count":510000,"lower_bound":"Q3VzdG9tZXIjMDAwNTY3NTA3","upper_bound":"Q3VzdG9tZXIjMDAwNTkzMjA1","repeats":1},{"count":540000,"lower_bound":"Q3VzdG9tZXIjMDAwNTk0MTQw","upper_bound":"Q3VzdG9tZXIjMDAwNjE3Mjc1","repeats":1},{"count":570000,"lower_bound":"Q3VzdG9tZXIjMDAwNjE3MzA1","upper_bound":"Q3VzdG9tZXIjMDAwNjQxOTUx","repeats":1},{"count":600000,"lower_bound":"Q3VzdG9tZXIjMDAwNjQzMjky","upper_bound":"Q3VzdG9tZXIjMDAwNjc0MjUy","repeats":1},{"count":630000,"lower_bound":"Q3VzdG9tZXIjMDAwNjc2MDA5","upper_bound":"Q3VzdG9tZXIjMDAwNzAyNDMy","repeats":1},{"count":660000,"lower_bound":"Q3VzdG9tZXIjMDAwNzAzMDQ5","upper_bound":"Q3VzdG9tZXIjMDAwNzMzMTIz","repeats":1},{"count":690000,"lower_bound":"Q3VzdG9tZXIjMDAwNzMzNTE2","upper_bound":"Q3VzdG9tZXIjMDAwNzcwMTg1","repeats":1},{"count":720000,"lower_bound":"Q3VzdG9tZXIjMDAwNzcwOTA1","upper_bound":"Q3VzdG9tZXIjMDAwNzk4NzA2","repeats":1},{"count":750000,"lower_bound":"Q3VzdG9tZXIjMDAwNzk5MDYw","upper_bound":"Q3VzdG9tZXIjMDAwODM1NTAy","repeats":1},{"count":780000,"lower_bound":"Q3VzdG9tZXIjMDAwODM1ODE4","upper_bound":"Q3VzdG9tZXIjMDAwODY4MjI5","repeats":1},{"count":810000,"lower_bound":"Q3VzdG9tZXIjMDAwODY4MzY3","upper_bound":"Q3VzdG9tZXIjMDAwOTAzODY5","repeats":1},{"count":840000,"lower_bound":"Q3VzdG9tZXIjMDAwOTA0MjEy","upper_bound":"Q3VzdG9tZXIjMDAwOTQzODYw","repeats":1},{"count":870000,"lower_bound":"Q3VzdG9tZXIjMDAwOTQ0MjI2","upper_bound":"Q3VzdG9tZXIjMDAwOTcyNzQ3","repeats":1},{"count":900000,"lower_bound":"Q3VzdG9tZXIjMDAwOTcyOTY0","upper_bound":"Q3VzdG9tZXIjMDAxMDAzMTQy","repeats":1},{"count":930000,"lower_bound":"Q3VzdG9tZXIjMDAxMDAzMzg0","upper_bound":"Q3VzdG9tZXIjMDAxMDM4MTYz","repeats":1},{"count":960000,"lower_bound":"Q3VzdG9tZXIjMDAxMDM4NDMw","upper_bound":"Q3VzdG9tZXIjMDAxMDYwMTI2","repeats":1},{"count":990000,"lower_bound":"Q3VzdG9tZXIjMDAxMDYwMTkz","upper_bound":"Q3VzdG9tZXIjMDAxMDkwNTg2","repeats":1},{"count":1020000,"lower_bound":"Q3VzdG9tZXIjMDAxMDkwNjEz","upper_bound":"Q3VzdG9tZXIjMDAxMTE1ODc1","repeats":1},{"count":1050000,"lower_bound":"Q3VzdG9tZXIjMDAxMTE2Nzgy","upper_bound":"Q3VzdG9tZXIjMDAxMTQ4Mjc2","repeats":1},{"count":1080000,"lower_bound":"Q3VzdG9tZXIjMDAxMTQ4Mzc4","upper_bound":"Q3VzdG9tZXIjMDAxMTgwMTI3","repeats":1},{"count":1110000,"lower_bound":"Q3VzdG9tZXIjMDAxMTgwNzYz","upper_bound":"Q3VzdG9tZXIjMDAxMjA3Mzcx","repeats":1},{"count":1140000,"lower_bound":"Q3VzdG9tZXIjMDAxMjA3Mzcz","upper_bound":"Q3VzdG9tZXIjMDAxMjQ5NDIx","repeats":1},{"count":1170000,"lower_bound":"Q3VzdG9tZXIjMDAxMjUxNDcy","upper_bound":"Q3VzdG9tZXIjMDAxMjc5ODk4","repeats":1},{"count":1200000,"lower_bound":"Q3VzdG9tZXIjMDAxMjc5OTM5","upper_bound":"Q3VzdG9tZXIjMDAxMzE1NjY0","repeats":1},{"count":1230000,"lower_bound":"Q3VzdG9tZXIjMDAxMzE1ODIx","upper_bound":"Q3VzdG9tZXIjMDAxMzQ0NDAx","repeats":1},{"count":1260000,"lower_bound":"Q3VzdG9tZXIjMDAxMzQ0NDYx","upper_bound":"Q3VzdG9tZXIjMDAxMzc2NzEy","repeats":1},{"count":1290000,"lower_bound":"Q3VzdG9tZXIjMDAxMzc3MDEz","upper_bound":"Q3VzdG9tZXIjMDAxNDEyMjk2","repeats":1},{"count":1320000,"lower_bound":"Q3VzdG9tZXIjMDAxNDEyNTYz","upper_bound":"Q3VzdG9tZXIjMDAxNDM5MDky","repeats":1},{"count":1350000,"lower_bound":"Q3VzdG9tZXIjMDAxNDQxNTQz","upper_bound":"Q3VzdG9tZXIjMDAxNDc2MDE3","repeats":1},{"count":1380000,"lower_bound":"Q3VzdG9tZXIjMDAxNDc3MDk5","upper_bound":"Q3VzdG9tZXIjMDAxNTAyODc5","repeats":1},{"count":1410000,"lower_bound":"Q3VzdG9tZXIjMDAxNTAzMDE0","upper_bound":"Q3VzdG9tZXIjMDAxNTMxMDY2","repeats":1},{"count":1440000,"lower_bound":"Q3VzdG9tZXIjMDAxNTM1MDYw","upper_bound":"Q3VzdG9tZXIjMDAxNTU4NjE4","repeats":1},{"count":1470000,"lower_bound":"Q3VzdG9tZXIjMDAxNTU5MjQz","upper_bound":"Q3VzdG9tZXIjMDAxNTkzNjQ4","repeats":1},{"count":1500000,"lower_bound":"Q3VzdG9tZXIjMDAxNTk1NjUy","upper_bound":"Q3VzdG9tZXIjMDAxNjE0NjMy","repeats":1},{"count":1530000,"lower_bound":"Q3VzdG9tZXIjMDAxNjE2MDYz","upper_bound":"Q3VzdG9tZXIjMDAxNjQ1NTk3","repeats":1},{"count":1560000,"lower_bound":"Q3VzdG9tZXIjMDAxNjQ1OTMy","upper_bound":"Q3VzdG9tZXIjMDAxNjc3MzAz","repeats":1},{"count":1590000,"lower_bound":"Q3VzdG9tZXIjMDAxNjc3NzQ4","upper_bound":"Q3VzdG9tZXIjMDAxNzAyODM0","repeats":1},{"count":1620000,"lower_bound":"Q3VzdG9tZXIjMDAxNzA2MDcx","upper_bound":"Q3VzdG9tZXIjMDAxNzM4MjA5","repeats":1},{"count":1650000,"lower_bound":"Q3VzdG9tZXIjMDAxNzM4ODQ3","upper_bound":"Q3VzdG9tZXIjMDAxNzY1NjI2","repeats":1},{"count":1680000,"lower_bound":"Q3VzdG9tZXIjMDAxNzY2ODA1","upper_bound":"Q3VzdG9tZXIjMDAxNzk3NDYx","repeats":1},{"count":1710000,"lower_bound":"Q3VzdG9tZXIjMDAxNzk3ODE1","upper_bound":"Q3VzdG9tZXIjMDAxODM3NDI2","repeats":1},{"count":1740000,"lower_bound":"Q3VzdG9tZXIjMDAxODM5MTYw","upper_bound":"Q3VzdG9tZXIjMDAxODYyODI1","repeats":1},{"count":1770000,"lower_bound":"Q3VzdG9tZXIjMDAxODY1MzA2","upper_bound":"Q3VzdG9tZXIjMDAxODkyNzE0","repeats":1},{"count":1800000,"lower_bound":"Q3VzdG9tZXIjMDAxODkzODU2","upper_bound":"Q3VzdG9tZXIjMDAxOTE5NzAy","repeats":1},{"count":1830000,"lower_bound":"Q3VzdG9tZXIjMDAxOTIxNzgx","upper_bound":"Q3VzdG9tZXIjMDAxOTQ0NzQ5","repeats":1},{"count":1860000,"lower_bound":"Q3VzdG9tZXIjMDAxOTQ4MTg2","upper_bound":"Q3VzdG9tZXIjMDAxOTgzMTQ0","repeats":1},{"count":1890000,"lower_bound":"Q3VzdG9tZXIjMDAxOTgzNjA1","upper_bound":"Q3VzdG9tZXIjMDAyMDE0Mjcz","repeats":1},{"count":1920000,"lower_bound":"Q3VzdG9tZXIjMDAyMDE1MDgy","upper_bound":"Q3VzdG9tZXIjMDAyMDM2ODg5","repeats":1},{"count":1950000,"lower_bound":"Q3VzdG9tZXIjMDAyMDM3MDgy","upper_bound":"Q3VzdG9tZXIjMDAyMDY3MDUw","repeats":1},{"count":1980000,"lower_bound":"Q3VzdG9tZXIjMDAyMDY4MDQ5","upper_bound":"Q3VzdG9tZXIjMDAyMTAwMzg1","repeats":1},{"count":2010000,"lower_bound":"Q3VzdG9tZXIjMDAyMTAwOTAw","upper_bound":"Q3VzdG9tZXIjMDAyMTM0MDMx","repeats":1},{"count":2040000,"lower_bound":"Q3VzdG9tZXIjMDAyMTM1NTky","upper_bound":"Q3VzdG9tZXIjMDAyMTY3NTA1","repeats":1},{"count":2070000,"lower_bound":"Q3VzdG9tZXIjMDAyMTY3ODA4","upper_bound":"Q3VzdG9tZXIjMDAyMTk2OTcz","repeats":1},{"count":2100000,"lower_bound":"Q3VzdG9tZXIjMDAyMTk3Mjcx","upper_bound":"Q3VzdG9tZXIjMDAyMjIyMzE1","repeats":1},{"count":2130000,"lower_bound":"Q3VzdG9tZXIjMDAyMjIzMzk3","upper_bound":"Q3VzdG9tZXIjMDAyMjUyNDcz","repeats":1},{"count":2160000,"lower_bound":"Q3VzdG9tZXIjMDAyMjUyOTg3","upper_bound":"Q3VzdG9tZXIjMDAyMjc5NDA2","repeats":1},{"count":2190000,"lower_bound":"Q3VzdG9tZXIjMDAyMjc5NTA1","upper_bound":"Q3VzdG9tZXIjMDAyMzA0Mjk5","repeats":1},{"count":2220000,"lower_bound":"Q3VzdG9tZXIjMDAyMzA0NDY0","upper_bound":"Q3VzdG9tZXIjMDAyMzM1MjU3","repeats":1},{"count":2250000,"lower_bound":"Q3VzdG9tZXIjMDAyMzM1NDgx","upper_bound":"Q3VzdG9tZXIjMDAyMzY2MTYy","repeats":1},{"count":2280000,"lower_bound":"Q3VzdG9tZXIjMDAyMzY2NDc1","upper_bound":"Q3VzdG9tZXIjMDAyMzkzMzIy","repeats":1},{"count":2310000,"lower_bound":"Q3VzdG9tZXIjMDAyMzkzNDE0","upper_bound":"Q3VzdG9tZXIjMDAyNDI3Mjk4","repeats":1},{"count":2340000,"lower_bound":"Q3VzdG9tZXIjMDAyNDI3NDU1","upper_bound":"Q3VzdG9tZXIjMDAyNDU2NjAw","repeats":1},{"count":2370000,"lower_bound":"Q3VzdG9tZXIjMDAyNDU2NzA1","upper_bound":"Q3VzdG9tZXIjMDAyNDg2NzA5","repeats":1},{"count":2400000,"lower_bound":"Q3VzdG9tZXIjMDAyNDg3MzUx","upper_bound":"Q3VzdG9tZXIjMDAyNTA3ODMw","repeats":1},{"count":2430000,"lower_bound":"Q3VzdG9tZXIjMDAyNTA4NDQx","upper_bound":"Q3VzdG9tZXIjMDAyNTM1MjEx","repeats":1},{"count":2460000,"lower_bound":"Q3VzdG9tZXIjMDAyNTM3MDg2","upper_bound":"Q3VzdG9tZXIjMDAyNTYxNTM5","repeats":1},{"count":2490000,"lower_bound":"Q3VzdG9tZXIjMDAyNTYyOTcx","upper_bound":"Q3VzdG9tZXIjMDAyNTg4NDY3","repeats":1},{"count":2520000,"lower_bound":"Q3VzdG9tZXIjMDAyNTg5MDM1","upper_bound":"Q3VzdG9tZXIjMDAyNjIwNDA4","repeats":1},{"count":2550000,"lower_bound":"Q3VzdG9tZXIjMDAyNjIyMjIz","upper_bound":"Q3VzdG9tZXIjMDAyNjQ5NTQy","repeats":1},{"count":2580000,"lower_bound":"Q3VzdG9tZXIjMDAyNjUwMzYw","upper_bound":"Q3VzdG9tZXIjMDAyNjc4NDg0","repeats":1},{"count":2610000,"lower_bound":"Q3VzdG9tZXIjMDAyNjc5NDUx","upper_bound":"Q3VzdG9tZXIjMDAyNzE1NDAx","repeats":1},{"count":2640000,"lower_bound":"Q3VzdG9tZXIjMDAyNzE1NTY1","upper_bound":"Q3VzdG9tZXIjMDAyNzQyNTQw","repeats":1},{"count":2670000,"lower_bound":"Q3VzdG9tZXIjMDAyNzQyNTU5","upper_bound":"Q3VzdG9tZXIjMDAyNzc3MTk0","repeats":1},{"count":2700000,"lower_bound":"Q3VzdG9tZXIjMDAyNzc4Mjky","upper_bound":"Q3VzdG9tZXIjMDAyODA0MjY5","repeats":1},{"count":2730000,"lower_bound":"Q3VzdG9tZXIjMDAyODA0NzA5","upper_bound":"Q3VzdG9tZXIjMDAyODI5NDcz","repeats":1},{"count":2760000,"lower_bound":"Q3VzdG9tZXIjMDAyODMwNzU1","upper_bound":"Q3VzdG9tZXIjMDAyODYxNzcx","repeats":1},{"count":2790000,"lower_bound":"Q3VzdG9tZXIjMDAyODYzODA1","upper_bound":"Q3VzdG9tZXIjMDAyODg3NDQ4","repeats":1},{"count":2820000,"lower_bound":"Q3VzdG9tZXIjMDAyODg3ODIy","upper_bound":"Q3VzdG9tZXIjMDAyOTIxMTI0","repeats":1},{"count":2850000,"lower_bound":"Q3VzdG9tZXIjMDAyOTIyNjUx","upper_bound":"Q3VzdG9tZXIjMDAyOTUwMDUw","repeats":1},{"count":2880000,"lower_bound":"Q3VzdG9tZXIjMDAyOTUwNzE3","upper_bound":"Q3VzdG9tZXIjMDAyOTc1MTE2","repeats":1},{"count":2910000,"lower_bound":"Q3VzdG9tZXIjMDAyOTc1NDA5","upper_bound":"Q3VzdG9tZXIjMDAzMDEyNzA1","repeats":1},{"count":2940000,"lower_bound":"Q3VzdG9tZXIjMDAzMDE0MDY4","upper_bound":"Q3VzdG9tZXIjMDAzMDQzNzkx","repeats":1},{"count":2970000,"lower_bound":"Q3VzdG9tZXIjMDAzMDQ0MzQ4","upper_bound":"Q3VzdG9tZXIjMDAzMDczMjIw","repeats":1},{"count":3000000,"lower_bound":"Q3VzdG9tZXIjMDAzMDczNDQx","upper_bound":"Q3VzdG9tZXIjMDAzMTA5OTYx","repeats":1},{"count":3030000,"lower_bound":"Q3VzdG9tZXIjMDAzMTEwMTA5","upper_bound":"Q3VzdG9tZXIjMDAzMTM5NTUz","repeats":1},{"count":3060000,"lower_bound":"Q3VzdG9tZXIjMDAzMTQwOTA0","upper_bound":"Q3VzdG9tZXIjMDAzMTY3OTI3","repeats":1},{"count":3090000,"lower_bound":"Q3VzdG9tZXIjMDAzMTY4MDU2","upper_bound":"Q3VzdG9tZXIjMDAzMTk4MjQ1","repeats":1},{"count":3120000,"lower_bound":"Q3VzdG9tZXIjMDAzMjAyMTg2","upper_bound":"Q3VzdG9tZXIjMDAzMjMzNTQ3","repeats":1},{"count":3150000,"lower_bound":"Q3VzdG9tZXIjMDAzMjM1ODI2","upper_bound":"Q3VzdG9tZXIjMDAzMjY1ODgw","repeats":1},{"count":3180000,"lower_bound":"Q3VzdG9tZXIjMDAzMjY2MTMz","upper_bound":"Q3VzdG9tZXIjMDAzMjk1MzIx","repeats":1},{"count":3210000,"lower_bound":"Q3VzdG9tZXIjMDAzMjk1OTI0","upper_bound":"Q3VzdG9tZXIjMDAzMzE5NDEx","repeats":1},{"count":3240000,"lower_bound":"Q3VzdG9tZXIjMDAzMzE5Njgw","upper_bound":"Q3VzdG9tZXIjMDAzMzM5MDEz","repeats":1},{"count":3270000,"lower_bound":"Q3VzdG9tZXIjMDAzMzM5Mzcx","upper_bound":"Q3VzdG9tZXIjMDAzMzc0MjQ1","repeats":1},{"count":3300000,"lower_bound":"Q3VzdG9tZXIjMDAzMzc0ODM3","upper_bound":"Q3VzdG9tZXIjMDAzNDA2NDA3","repeats":1},{"count":3330000,"lower_bound":"Q3VzdG9tZXIjMDAzNDA2NDk0","upper_bound":"Q3VzdG9tZXIjMDAzNDMyODcz","repeats":1},{"count":3360000,"lower_bound":"Q3VzdG9tZXIjMDAzNDMzODI2","upper_bound":"Q3VzdG9tZXIjMDAzNDU4NTUz","repeats":1},{"count":3390000,"lower_bound":"Q3VzdG9tZXIjMDAzNDU4NzEx","upper_bound":"Q3VzdG9tZXIjMDAzNDg4ODg0","repeats":1},{"count":3420000,"lower_bound":"Q3VzdG9tZXIjMDAzNDg5NDcw","upper_bound":"Q3VzdG9tZXIjMDAzNTI0NTUx","repeats":1},{"count":3450000,"lower_bound":"Q3VzdG9tZXIjMDAzNTI1NTI5","upper_bound":"Q3VzdG9tZXIjMDAzNTUzNDQ0","repeats":1},{"count":3480000,"lower_bound":"Q3VzdG9tZXIjMDAzNTUzNDU4","upper_bound":"Q3VzdG9tZXIjMDAzNTgzNDg5","repeats":1},{"count":3510000,"lower_bound":"Q3VzdG9tZXIjMDAzNTgzNzUz","upper_bound":"Q3VzdG9tZXIjMDAzNjA5OTE0","repeats":1},{"count":3540000,"lower_bound":"Q3VzdG9tZXIjMDAzNjA5OTQ0","upper_bound":"Q3VzdG9tZXIjMDAzNjM1OTQ1","repeats":1},{"count":3570000,"lower_bound":"Q3VzdG9tZXIjMDAzNjM3NzIz","upper_bound":"Q3VzdG9tZXIjMDAzNjcyMjI0","repeats":1},{"count":3600000,"lower_bound":"Q3VzdG9tZXIjMDAzNjczMjk2","upper_bound":"Q3VzdG9tZXIjMDAzNzA0MzYx","repeats":1},{"count":3630000,"lower_bound":"Q3VzdG9tZXIjMDAzNzA0NzM0","upper_bound":"Q3VzdG9tZXIjMDAzNzI2NTI5","repeats":1},{"count":3660000,"lower_bound":"Q3VzdG9tZXIjMDAzNzI4MzQ5","upper_bound":"Q3VzdG9tZXIjMDAzNzYwMjEy","repeats":1},{"count":3690000,"lower_bound":"Q3VzdG9tZXIjMDAzNzYwNDE3","upper_bound":"Q3VzdG9tZXIjMDAzNzg4MjEx","repeats":1},{"count":3720000,"lower_bound":"Q3VzdG9tZXIjMDAzNzg4Njc1","upper_bound":"Q3VzdG9tZXIjMDAzODExNDEx","repeats":1},{"count":3750000,"lower_bound":"Q3VzdG9tZXIjMDAzODEyNDAy","upper_bound":"Q3VzdG9tZXIjMDAzODM3MjA4","repeats":1},{"count":3780000,"lower_bound":"Q3VzdG9tZXIjMDAzODM4NjAx","upper_bound":"Q3VzdG9tZXIjMDAzODcyMzM2","repeats":1},{"count":3810000,"lower_bound":"Q3VzdG9tZXIjMDAzODcyNDc4","upper_bound":"Q3VzdG9tZXIjMDAzOTAyNjMz","repeats":1},{"count":3840000,"lower_bound":"Q3VzdG9tZXIjMDAzOTA0Njcy","upper_bound":"Q3VzdG9tZXIjMDAzOTM4MjUx","repeats":1},{"count":3870000,"lower_bound":"Q3VzdG9tZXIjMDAzOTM5Mjc1","upper_bound":"Q3VzdG9tZXIjMDAzOTYxNTEw","repeats":1},{"count":3900000,"lower_bound":"Q3VzdG9tZXIjMDAzOTYxNTg2","upper_bound":"Q3VzdG9tZXIjMDAzOTg5MDg5","repeats":1},{"count":3930000,"lower_bound":"Q3VzdG9tZXIjMDAzOTg5MzAy","upper_bound":"Q3VzdG9tZXIjMDA0MDIyMzQ0","repeats":1},{"count":3960000,"lower_bound":"Q3VzdG9tZXIjMDA0MDIzNzEx","upper_bound":"Q3VzdG9tZXIjMDA0MDUwMDEx","repeats":1},{"count":3990000,"lower_bound":"Q3VzdG9tZXIjMDA0MDUwMDgy","upper_bound":"Q3VzdG9tZXIjMDA0MDkwMDA5","repeats":1},{"count":4020000,"lower_bound":"Q3VzdG9tZXIjMDA0MDkzMDM3","upper_bound":"Q3VzdG9tZXIjMDA0MTIxMTEy","repeats":1},{"count":4050000,"lower_bound":"Q3VzdG9tZXIjMDA0MTIxMTMx","upper_bound":"Q3VzdG9tZXIjMDA0MTQ4MzY5","repeats":1},{"count":4080000,"lower_bound":"Q3VzdG9tZXIjMDA0MTQ4NTA5","upper_bound":"Q3VzdG9tZXIjMDA0MTc4OTgz","repeats":1},{"count":4110000,"lower_bound":"Q3VzdG9tZXIjMDA0MTc5NDY0","upper_bound":"Q3VzdG9tZXIjMDA0MjAxMTAw","repeats":1},{"count":4140000,"lower_bound":"Q3VzdG9tZXIjMDA0MjAxMTU5","upper_bound":"Q3VzdG9tZXIjMDA0MjI4NjI3","repeats":1},{"count":4170000,"lower_bound":"Q3VzdG9tZXIjMDA0MjI5NDAz","upper_bound":"Q3VzdG9tZXIjMDA0MjQ5Njk5","repeats":1},{"count":4200000,"lower_bound":"Q3VzdG9tZXIjMDA0MjQ5NzA0","upper_bound":"Q3VzdG9tZXIjMDA0Mjc5MjIz","repeats":1},{"count":4230000,"lower_bound":"Q3VzdG9tZXIjMDA0MjgxMTE1","upper_bound":"Q3VzdG9tZXIjMDA0MzA5OTIx","repeats":1},{"count":4260000,"lower_bound":"Q3VzdG9tZXIjMDA0MzA5OTY5","upper_bound":"Q3VzdG9tZXIjMDA0MzQzMjUy","repeats":1},{"count":4290000,"lower_bound":"Q3VzdG9tZXIjMDA0MzQzMzg5","upper_bound":"Q3VzdG9tZXIjMDA0MzYyMTc0","repeats":1},{"count":4320000,"lower_bound":"Q3VzdG9tZXIjMDA0MzYyNDUz","upper_bound":"Q3VzdG9tZXIjMDA0MzkyNTEy","repeats":1},{"count":4350000,"lower_bound":"Q3VzdG9tZXIjMDA0MzkzNTQx","upper_bound":"Q3VzdG9tZXIjMDA0NDE0Njk4","repeats":1},{"count":4380000,"lower_bound":"Q3VzdG9tZXIjMDA0NDE1NjYw","upper_bound":"Q3VzdG9tZXIjMDA0NDM5NTEw","repeats":1},{"count":4410000,"lower_bound":"Q3VzdG9tZXIjMDA0NDM5ODc4","upper_bound":"Q3VzdG9tZXIjMDA0NDYzMzg2","repeats":1},{"count":4440000,"lower_bound":"Q3VzdG9tZXIjMDA0NDYzOTcw","upper_bound":"Q3VzdG9tZXIjMDA0NDkzODg4","repeats":1},{"count":4470000,"lower_bound":"Q3VzdG9tZXIjMDA0NDk0Njgx","upper_bound":"Q3VzdG9tZXIjMDA0NTE4OTAw","repeats":1},{"count":4500000,"lower_bound":"Q3VzdG9tZXIjMDA0NTIxMzQw","upper_bound":"Q3VzdG9tZXIjMDA0NTUxNDcy","repeats":1},{"count":4530000,"lower_bound":"Q3VzdG9tZXIjMDA0NTUyMTky","upper_bound":"Q3VzdG9tZXIjMDA0NTg2MzIy","repeats":1},{"count":4560000,"lower_bound":"Q3VzdG9tZXIjMDA0NTg2NjI3","upper_bound":"Q3VzdG9tZXIjMDA0NjEzODc4","repeats":1},{"count":4590000,"lower_bound":"Q3VzdG9tZXIjMDA0NjE0NzIy","upper_bound":"Q3VzdG9tZXIjMDA0NjM5NTUw","repeats":1},{"count":4620000,"lower_bound":"Q3VzdG9tZXIjMDA0NjM5Njgx","upper_bound":"Q3VzdG9tZXIjMDA0NjcyMzY2","repeats":1},{"count":4650000,"lower_bound":"Q3VzdG9tZXIjMDA0NjcyOTkw","upper_bound":"Q3VzdG9tZXIjMDA0NzA2NTk4","repeats":1},{"count":4680000,"lower_bound":"Q3VzdG9tZXIjMDA0NzA4MjAz","upper_bound":"Q3VzdG9tZXIjMDA0NzM3NDQw","repeats":1},{"count":4710000,"lower_bound":"Q3VzdG9tZXIjMDA0NzM4MDA1","upper_bound":"Q3VzdG9tZXIjMDA0NzY1NDkx","repeats":1},{"count":4740000,"lower_bound":"Q3VzdG9tZXIjMDA0NzY1Njk5","upper_bound":"Q3VzdG9tZXIjMDA0ODEzNDc5","repeats":1},{"count":4770000,"lower_bound":"Q3VzdG9tZXIjMDA0ODE0ODc2","upper_bound":"Q3VzdG9tZXIjMDA0ODQzMDY4","repeats":1},{"count":4800000,"lower_bound":"Q3VzdG9tZXIjMDA0ODQzNDUw","upper_bound":"Q3VzdG9tZXIjMDA0ODcxNDE1","repeats":1},{"count":4830000,"lower_bound":"Q3VzdG9tZXIjMDA0ODcxNDI4","upper_bound":"Q3VzdG9tZXIjMDA0OTAwNzg4","repeats":1},{"count":4860000,"lower_bound":"Q3VzdG9tZXIjMDA0OTAxNjUx","upper_bound":"Q3VzdG9tZXIjMDA0OTMzMDA2","repeats":1},{"count":4890000,"lower_bound":"Q3VzdG9tZXIjMDA0OTM0ODEy","upper_bound":"Q3VzdG9tZXIjMDA0OTUyNTI1","repeats":1},{"count":4920000,"lower_bound":"Q3VzdG9tZXIjMDA0OTUzMzEy","upper_bound":"Q3VzdG9tZXIjMDA0OTc4NzMx","repeats":1},{"count":4950000,"lower_bound":"Q3VzdG9tZXIjMDA0OTc5Njc4","upper_bound":"Q3VzdG9tZXIjMDA1MDIwNzg1","repeats":1},{"count":4980000,"lower_bound":"Q3VzdG9tZXIjMDA1MDIwOTcz","upper_bound":"Q3VzdG9tZXIjMDA1MDQ3MjM1","repeats":1},{"count":5010000,"lower_bound":"Q3VzdG9tZXIjMDA1MDQ4MjU3","upper_bound":"Q3VzdG9tZXIjMDA1MDc2MzY4","repeats":1},{"count":5040000,"lower_bound":"Q3VzdG9tZXIjMDA1MDc2OTI3","upper_bound":"Q3VzdG9tZXIjMDA1MTA2MDY5","repeats":1},{"count":5070000,"lower_bound":"Q3VzdG9tZXIjMDA1MTA2NzQ0","upper_bound":"Q3VzdG9tZXIjMDA1MTM0ODk4","repeats":1},{"count":5100000,"lower_bound":"Q3VzdG9tZXIjMDA1MTM2NTYy","upper_bound":"Q3VzdG9tZXIjMDA1MTYwNzUy","repeats":1},{"count":5130000,"lower_bound":"Q3VzdG9tZXIjMDA1MTYwNzYz","upper_bound":"Q3VzdG9tZXIjMDA1MTkwMDA5","repeats":1},{"count":5160000,"lower_bound":"Q3VzdG9tZXIjMDA1MTkxMjY5","upper_bound":"Q3VzdG9tZXIjMDA1MjE0MTA2","repeats":1},{"count":5190000,"lower_bound":"Q3VzdG9tZXIjMDA1MjE0NjE0","upper_bound":"Q3VzdG9tZXIjMDA1MjQ1MDY5","repeats":1},{"count":5220000,"lower_bound":"Q3VzdG9tZXIjMDA1MjQ1MjY4","upper_bound":"Q3VzdG9tZXIjMDA1Mjc0NTg1","repeats":1},{"count":5250000,"lower_bound":"Q3VzdG9tZXIjMDA1Mjc1MTYx","upper_bound":"Q3VzdG9tZXIjMDA1MzAzMTIy","repeats":1},{"count":5280000,"lower_bound":"Q3VzdG9tZXIjMDA1MzAzNjky","upper_bound":"Q3VzdG9tZXIjMDA1MzMxNDIx","repeats":1},{"count":5310000,"lower_bound":"Q3VzdG9tZXIjMDA1MzMxNDUz","upper_bound":"Q3VzdG9tZXIjMDA1MzUxMDcy","repeats":1},{"count":5340000,"lower_bound":"Q3VzdG9tZXIjMDA1MzUyNzcy","upper_bound":"Q3VzdG9tZXIjMDA1Mzg3MDA3","repeats":1},{"count":5370000,"lower_bound":"Q3VzdG9tZXIjMDA1Mzg4NzEz","upper_bound":"Q3VzdG9tZXIjMDA1NDIwNzYw","repeats":1},{"count":5400000,"lower_bound":"Q3VzdG9tZXIjMDA1NDIwNzg5","upper_bound":"Q3VzdG9tZXIjMDA1NDUyNTc1","repeats":1},{"count":5430000,"lower_bound":"Q3VzdG9tZXIjMDA1NDUzODI4","upper_bound":"Q3VzdG9tZXIjMDA1NDc0ODA5","repeats":1},{"count":5460000,"lower_bound":"Q3VzdG9tZXIjMDA1NDc1MDA1","upper_bound":"Q3VzdG9tZXIjMDA1NTA2MTU0","repeats":1},{"count":5490000,"lower_bound":"Q3VzdG9tZXIjMDA1NTA2MjM3","upper_bound":"Q3VzdG9tZXIjMDA1NTI5OTg1","repeats":1},{"count":5520000,"lower_bound":"Q3VzdG9tZXIjMDA1NTI5OTk2","upper_bound":"Q3VzdG9tZXIjMDA1NTU5NTY1","repeats":1},{"count":5550000,"lower_bound":"Q3VzdG9tZXIjMDA1NTYwNzEz","upper_bound":"Q3VzdG9tZXIjMDA1NTg4NTEz","repeats":1},{"count":5580000,"lower_bound":"Q3VzdG9tZXIjMDA1NTg5NDI0","upper_bound":"Q3VzdG9tZXIjMDA1NjE3NDk0","repeats":1},{"count":5610000,"lower_bound":"Q3VzdG9tZXIjMDA1NjE3NjA4","upper_bound":"Q3VzdG9tZXIjMDA1NjQwNjE0","repeats":1},{"count":5640000,"lower_bound":"Q3VzdG9tZXIjMDA1NjQwNzI0","upper_bound":"Q3VzdG9tZXIjMDA1Njc0OTA4","repeats":1},{"count":5670000,"lower_bound":"Q3VzdG9tZXIjMDA1Njc2NDMy","upper_bound":"Q3VzdG9tZXIjMDA1NzAwNzY0","repeats":1},{"count":5700000,"lower_bound":"Q3VzdG9tZXIjMDA1NzAwNzc2","upper_bound":"Q3VzdG9tZXIjMDA1NzI4OTc2","repeats":1},{"count":5730000,"lower_bound":"Q3VzdG9tZXIjMDA1NzI5MzY3","upper_bound":"Q3VzdG9tZXIjMDA1NzUyOTIz","repeats":1},{"count":5760000,"lower_bound":"Q3VzdG9tZXIjMDA1NzUzNTE4","upper_bound":"Q3VzdG9tZXIjMDA1Nzc5MDc5","repeats":1},{"count":5790000,"lower_bound":"Q3VzdG9tZXIjMDA1Nzc5MTM3","upper_bound":"Q3VzdG9tZXIjMDA1ODEwOTcw","repeats":1},{"count":5820000,"lower_bound":"Q3VzdG9tZXIjMDA1ODExMjU4","upper_bound":"Q3VzdG9tZXIjMDA1ODM5ODU1","repeats":1},{"count":5850000,"lower_bound":"Q3VzdG9tZXIjMDA1ODQwMTAz","upper_bound":"Q3VzdG9tZXIjMDA1ODY2NzY2","repeats":1},{"count":5880000,"lower_bound":"Q3VzdG9tZXIjMDA1ODY3NTk4","upper_bound":"Q3VzdG9tZXIjMDA1OTAwNDM5","repeats":1},{"count":5910000,"lower_bound":"Q3VzdG9tZXIjMDA1OTAwNzUw","upper_bound":"Q3VzdG9tZXIjMDA1OTI1MTEw","repeats":1},{"count":5940000,"lower_bound":"Q3VzdG9tZXIjMDA1OTI4Nzg5","upper_bound":"Q3VzdG9tZXIjMDA1OTY1NDc0","repeats":1},{"count":5970000,"lower_bound":"Q3VzdG9tZXIjMDA1OTY2MjA4","upper_bound":"Q3VzdG9tZXIjMDA1OTk3MjI3","repeats":1},{"count":6000000,"lower_bound":"Q3VzdG9tZXIjMDA1OTk3NjQ5","upper_bound":"Q3VzdG9tZXIjMDA2MDI4MjQx","repeats":1},{"count":6030000,"lower_bound":"Q3VzdG9tZXIjMDA2MDI4MjY2","upper_bound":"Q3VzdG9tZXIjMDA2MDU1NTYw","repeats":1},{"count":6060000,"lower_bound":"Q3VzdG9tZXIjMDA2MDU1NjM4","upper_bound":"Q3VzdG9tZXIjMDA2MDg3NTQ5","repeats":1},{"count":6090000,"lower_bound":"Q3VzdG9tZXIjMDA2MDg5MTI2","upper_bound":"Q3VzdG9tZXIjMDA2MTEyMTc3","repeats":1},{"count":6120000,"lower_bound":"Q3VzdG9tZXIjMDA2MTEyODQw","upper_bound":"Q3VzdG9tZXIjMDA2MTM2Njc0","repeats":1},{"count":6150000,"lower_bound":"Q3VzdG9tZXIjMDA2MTM2ODU5","upper_bound":"Q3VzdG9tZXIjMDA2MTcwOTc4","repeats":1},{"count":6180000,"lower_bound":"Q3VzdG9tZXIjMDA2MTcxOTU0","upper_bound":"Q3VzdG9tZXIjMDA2MTk2Nzgy","repeats":1},{"count":6210000,"lower_bound":"Q3VzdG9tZXIjMDA2MTk3MDQ4","upper_bound":"Q3VzdG9tZXIjMDA2MjE5Mjc2","repeats":1},{"count":6240000,"lower_bound":"Q3VzdG9tZXIjMDA2MjE5NTky","upper_bound":"Q3VzdG9tZXIjMDA2MjU0MjE1","repeats":1},{"count":6270000,"lower_bound":"Q3VzdG9tZXIjMDA2MjU1MDcw","upper_bound":"Q3VzdG9tZXIjMDA2MjgxMjI1","repeats":1},{"count":6300000,"lower_bound":"Q3VzdG9tZXIjMDA2MjgxODg1","upper_bound":"Q3VzdG9tZXIjMDA2MzE2MDA1","repeats":1},{"count":6330000,"lower_bound":"Q3VzdG9tZXIjMDA2MzE3MTc0","upper_bound":"Q3VzdG9tZXIjMDA2MzQ1NjAx","repeats":1},{"count":6360000,"lower_bound":"Q3VzdG9tZXIjMDA2MzQ2NjY2","upper_bound":"Q3VzdG9tZXIjMDA2MzcxMTAz","repeats":1},{"count":6390000,"lower_bound":"Q3VzdG9tZXIjMDA2MzcxNDI1","upper_bound":"Q3VzdG9tZXIjMDA2Mzk4NTUx","repeats":1},{"count":6420000,"lower_bound":"Q3VzdG9tZXIjMDA2Mzk5NDcz","upper_bound":"Q3VzdG9tZXIjMDA2NDM0NzAx","repeats":1},{"count":6450000,"lower_bound":"Q3VzdG9tZXIjMDA2NDM2MzAz","upper_bound":"Q3VzdG9tZXIjMDA2NDU5ODUz","repeats":1},{"count":6480000,"lower_bound":"Q3VzdG9tZXIjMDA2NDU5OTU2","upper_bound":"Q3VzdG9tZXIjMDA2NDk4NjM0","repeats":1},{"count":6510000,"lower_bound":"Q3VzdG9tZXIjMDA2NDk5Mjk1","upper_bound":"Q3VzdG9tZXIjMDA2NTI4NTY1","repeats":1},{"count":6540000,"lower_bound":"Q3VzdG9tZXIjMDA2NTI4OTE0","upper_bound":"Q3VzdG9tZXIjMDA2NTU1ODgy","repeats":1},{"count":6570000,"lower_bound":"Q3VzdG9tZXIjMDA2NTU1OTEz","upper_bound":"Q3VzdG9tZXIjMDA2NTg2OTgy","repeats":1},{"count":6600000,"lower_bound":"Q3VzdG9tZXIjMDA2NTg4Njk1","upper_bound":"Q3VzdG9tZXIjMDA2NjE2OTk2","repeats":1},{"count":6630000,"lower_bound":"Q3VzdG9tZXIjMDA2NjE3ODEy","upper_bound":"Q3VzdG9tZXIjMDA2NjQzMjI2","repeats":1},{"count":6660000,"lower_bound":"Q3VzdG9tZXIjMDA2NjQ0NzI2","upper_bound":"Q3VzdG9tZXIjMDA2NjY5MTU1","repeats":1},{"count":6690000,"lower_bound":"Q3VzdG9tZXIjMDA2NjY5ODM3","upper_bound":"Q3VzdG9tZXIjMDA2Njk4NDQw","repeats":1},{"count":6720000,"lower_bound":"Q3VzdG9tZXIjMDA2Njk5NzA1","upper_bound":"Q3VzdG9tZXIjMDA2NzMxODc4","repeats":1},{"count":6750000,"lower_bound":"Q3VzdG9tZXIjMDA2NzMyNjk5","upper_bound":"Q3VzdG9tZXIjMDA2NzY3MzM1","repeats":1},{"count":6780000,"lower_bound":"Q3VzdG9tZXIjMDA2NzY4Mzc2","upper_bound":"Q3VzdG9tZXIjMDA2ODAwODkz","repeats":1},{"count":6810000,"lower_bound":"Q3VzdG9tZXIjMDA2ODAyMjM1","upper_bound":"Q3VzdG9tZXIjMDA2ODMxOTA4","repeats":1},{"count":6840000,"lower_bound":"Q3VzdG9tZXIjMDA2ODMyMTA2","upper_bound":"Q3VzdG9tZXIjMDA2ODU0NDA1","repeats":1},{"count":6870000,"lower_bound":"Q3VzdG9tZXIjMDA2ODU0NjQ2","upper_bound":"Q3VzdG9tZXIjMDA2ODc0Mjk5","repeats":1},{"count":6900000,"lower_bound":"Q3VzdG9tZXIjMDA2ODc0ODIz","upper_bound":"Q3VzdG9tZXIjMDA2OTEyMjM2","repeats":1},{"count":6930000,"lower_bound":"Q3VzdG9tZXIjMDA2OTE0NDc3","upper_bound":"Q3VzdG9tZXIjMDA2OTQ2OTEw","repeats":1},{"count":6960000,"lower_bound":"Q3VzdG9tZXIjMDA2OTQ3ODA3","upper_bound":"Q3VzdG9tZXIjMDA2OTcxNjI0","repeats":1},{"count":6990000,"lower_bound":"Q3VzdG9tZXIjMDA2OTcxOTAy","upper_bound":"Q3VzdG9tZXIjMDA3MDAyNTQz","repeats":1},{"count":7020000,"lower_bound":"Q3VzdG9tZXIjMDA3MDAzMTI3","upper_bound":"Q3VzdG9tZXIjMDA3MDI5Mjgz","repeats":1},{"count":7050000,"lower_bound":"Q3VzdG9tZXIjMDA3MDI5MzU3","upper_bound":"Q3VzdG9tZXIjMDA3MDU3MzM2","repeats":1},{"count":7080000,"lower_bound":"Q3VzdG9tZXIjMDA3MDU3MzU1","upper_bound":"Q3VzdG9tZXIjMDA3MDg5NjAx","repeats":1},{"count":7110000,"lower_bound":"Q3VzdG9tZXIjMDA3MDg5Nzg2","upper_bound":"Q3VzdG9tZXIjMDA3MTEzODMw","repeats":1},{"count":7140000,"lower_bound":"Q3VzdG9tZXIjMDA3MTE0MDQ0","upper_bound":"Q3VzdG9tZXIjMDA3MTUyNTAy","repeats":1},{"count":7170000,"lower_bound":"Q3VzdG9tZXIjMDA3MTUyNzI0","upper_bound":"Q3VzdG9tZXIjMDA3MTY5NTI0","repeats":1},{"count":7200000,"lower_bound":"Q3VzdG9tZXIjMDA3MTcwMzk2","upper_bound":"Q3VzdG9tZXIjMDA3MTk1OTUw","repeats":1},{"count":7230000,"lower_bound":"Q3VzdG9tZXIjMDA3MTk4NTg1","upper_bound":"Q3VzdG9tZXIjMDA3MjI4NTQ5","repeats":1},{"count":7260000,"lower_bound":"Q3VzdG9tZXIjMDA3MjMwMTE3","upper_bound":"Q3VzdG9tZXIjMDA3MjU0NDg5","repeats":1},{"count":7290000,"lower_bound":"Q3VzdG9tZXIjMDA3MjU0ODM3","upper_bound":"Q3VzdG9tZXIjMDA3Mjg2NDM0","repeats":1},{"count":7320000,"lower_bound":"Q3VzdG9tZXIjMDA3Mjg3NjQ0","upper_bound":"Q3VzdG9tZXIjMDA3MzEyOTIz","repeats":1},{"count":7350000,"lower_bound":"Q3VzdG9tZXIjMDA3MzE0MTQ0","upper_bound":"Q3VzdG9tZXIjMDA3MzQ0NTUw","repeats":1},{"count":7380000,"lower_bound":"Q3VzdG9tZXIjMDA3MzQ0OTQ3","upper_bound":"Q3VzdG9tZXIjMDA3MzczMTgy","repeats":1},{"count":7410000,"lower_bound":"Q3VzdG9tZXIjMDA3MzczOTE1","upper_bound":"Q3VzdG9tZXIjMDA3Mzk4NjU2","repeats":1},{"count":7440000,"lower_bound":"Q3VzdG9tZXIjMDA3Mzk5OTI4","upper_bound":"Q3VzdG9tZXIjMDA3NDM5NzQ2","repeats":1},{"count":7470000,"lower_bound":"Q3VzdG9tZXIjMDA3NDQwMDcz","upper_bound":"Q3VzdG9tZXIjMDA3NDYzNjcw","repeats":1},{"count":7500000,"lower_bound":"Q3VzdG9tZXIjMDA3NDY0NzAx","upper_bound":"Q3VzdG9tZXIjMDA3NDk4MTMz","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3569,3691,3640,3748,3561,3668,3725,3641,3696,3660,3702,3642,3597,3657,3537,3688,3725,3537,3749,3638,3687,3637,3582,3628,3764,3610,3704,3513,3668,3788,3478,3563,3746,3646,3687,3700,3642,3774,3700,3770,3675,3660,3624,3714,3557,3652,3660,3594,3708,3725,3688,3644,3713,3690,3626,3574,3689,3744,3663,3714,3700,3727,3656,3542,3665,3661,3713,3707,3737,3609,3671,3546,3657,3582,3577,3604,3645,3660,3647,3682,3646,3603,3595,3566,3661,3647,3686,3692,3636,3646,3744,3765,3518,3683,3603,3669,3816,3598,3736,3540,3668,3807,3709,3715,3663,3585,3756,3547,3721,3583,3709,3605,3603,3691,3608,3595,3756,3740,3737,3692,3717,3657,3598,3654,3711,3730,3731,3619,3658,3656,3619,3664,3587,3742,3603,3617,3662,3652,3638,3700,3728,3607,3566,3629,3712,3675,3591,3703,3681,3717,3676,3760,3556,3707,3683,3618,3574,3739,3667,3667,3746,3620,3731,3679,3579,3646,3588,3647,3600,3491,3573,3806,3597,3587,3597,3642,3678,3582,3686,3683,3807,3687,3622,3610,3810,3678,3568,3663,3635,3681,3701,3706,3723,3679,3592,3610,3691,3627,3634,3723,3661,3762,3685,3724,3660,3593,3674,3716,3672,3561,3729,3770,3637,3681,3730,3712,3607,3733,3630,3752,3747,3692,3667,3612,3705,3616,3711,3724,3692,3723,3647,3569,3682,3725,3506,3668,3575,3640,3582,3799,3600,3730,3688,3557,3626,3676,3597,3691,3674,3693,3583,3776,3647,3731,3646,3794,3612,3886,3634,3713,3694,3664,3789,3671,3520,3616,3748,3645,3642,3606,3574,3706,3741,3700,3689,3596,3736,3728,3636,3771,3687,3662,3744,3624,3575,3706,3641,3688,3561,3741,3606,3627,3689,3693,3639,3639,3722,3677,3583,3673,3667,3699,3677,3635,3632,3607,3658,3659,3685,3619,3645,3683,3617,3712,3733,3698,3700,3779,3653,3637,3716,3646,3653,3647,3625,3628,3663,3675,3571,3594,3658,3746,3739,3683,3699,3747,3702,3629,3706,3585,3704,3596,3700,3664,3614,3602,3619,3678,3749,3737,3644,3717,3488,3685,3609,3681,3755,3734,3695,3634,3647,3677,3788,3562,3836,3700,3636,3724,3742,3571,3685,3642,3760,3716,3541,3544,3640,3643,3638,3656,3723,3657,3682,3627,3761,3510,3639,3629,3725,3613,3732,3766,3578,3667,3634,3661,3603,3704,3753,3764,3666,3773,3550,3680,3556,3656,3694,3635,3692,3719,3619,3601,3630,3639,3692,3594,3690,3630,3671,3620,3633,3695,3630,3703,3630,3706,3691,3727,3688,3660,3694,3662,3623,3697,3651,3600,3632,3597,3744,3680,3644,3636,3603,3664,3723,3716,3683,3658,3646,3705,3698,3704,3650,3695,3653,3758,3702,3571,3698,3675,3589,3712,3683,3802,3572,3682,3556,3650,3641,3616,3645,3654,3694,3617,3714,3630,3782,3673,3665,3626,3666,3682,3735,3771,3682,3748,3708,3628,3733,3643,3710,3612,3621,3716,3631,3664,3692,3670,3706,3647,3700,3759,3696,3737,3606,3710,3665,3578,3725,3698,3551,3600,3581,3629,3738,3850,3706,3666,3648,3692,3600,3694,3609,3620,3671,3678,3666,3664,3621,3677,3691,3673,3625,3691,3690,3720,3629,3731,3694,3650,3670,3569,3517,3680,3665,3628,3563,3709,3716,3557,3647,3807,3559,3705,3669,3632,3711,3642,3689,3705,3668,3674,3639,3747,3607,3601,3663,3663,3684,3750,3724,3643,3687,3688,3529,3715,3595,3606,3664,3616,3714,3738,3652,3628,3702,3693,3721,3660,3712,3581,3663,3690,3679,3678,3784,3777,3659,3664,3735,3692,3687,3609,3636,3711,3697,3550,3604,3645,3702,3576,3731,3706,3632,3638,3648,3730,3672,3638,3625,3589,3702,3597,3642,3599,3638,3685,3761,3668,3723,3668,3564,3693,3671,3392,3681,3735,3652,3760,3629,3648,3629,3569,3587,3676,3677,3699,3663,3652,3685,3631,3569,3594,3797,3651,3673,3549,3676,3701,3626,3714,3612,3736,3694,3633,3723,3771,3639,3634,3729,3674,3601,3657,3618,3720,3726,3628,3686,3685,3768,3741,3598,3692,3650,3723,3654,3664,3734,3807,3691,3672,3696,3571,3616,3583,3720,3676,3681,3757,3668,3592,3648,3656,3584,3639,3738,3652,3700,3605,3660,3668,3615,3683,3676,3693,3566,3639,3582,3687,3549,3720,3587,3744,3649,3704,3638,3683,3667,3640,3714,3683,3612,3667,3681,3591,3628,3621,3699,3589,3671,3756,3515,3557,3790,3705,3705,3563,3664,3653,3550,3617,3659,3705,3623,3682,3743,3640,3626,3717,3639,3647,3656,3616,3610,3700,3787,3725,3678,3707,3647,3760,3656,3655,3582,3661,3714,3706,3680,3705,3668,3609,3560,3663,3707,3628,3622,3646,3630,3645,3587,3657,3621,3749,3747,3625,3731,3596,3655,3662,3601,3634,3628,3719,3644,3618,3643,3616,3604,3675,3670,3662,3752,3694,3628,3722,3687,3715,3653,3567,3673,3664,3774,3640,3543,3666,3561,3662,3721,3722,3741,3625,3651,3673,3554,3667,3733,3633,3707,3631,3624,3790,3650,3678,3744,3579,3638,3564,3718,3673,3701,3586,3707,3724,3649,3700,3591,3641,3744,3652,3671,3612,3650,3588,3678,3611,3637,3637,3620,3653,3579,3601,3688,3678,3746,3716,3739,3629,3808,3615,3627,3702,3651,3584,3695,3626,3668,3645,3664,3698,3734,3632,3730,3629,3671,3723,3719,3738,3588,3751,3769,3753,3696,3664,3619,3665,3611,3548,3693,3682,3591,3606,3728,3745,3784,3675,3604,3625,3760,3687,3618,3647,3681,3612,3698,3599,3600,3697,3662,3745,3688,3627,3541,3685,3645,3745,3618,3564,3676,3699,3609,3687,3636,3617,3627,3735,3725,3685,3695,3718,3700,3625,3712,3706,3743,3671,3542,3690,3655,3743,3717,3702,3644,3609,3697,3653,3615,3642,3678,3740,3600,3538,3612,3681,3715,3589,3740,3667,3641,3622,3681,3681,3685,3536,3778,3648,3746,3642,3661,3688,3584,3615,3688,3722,3706,3760,3587,3659,3561,3746,3607,3752,3618,3729,3700,3649,3673,3636,3722,3589,3781,3640,3497,3665,3672,3762,3663,3565,3655,3666,3734,3587,3611,3631,3592,3668,3521,3594,3736,3710,3604,3707,3618,3747,3628,3536,3785,3713,3689,3650,3687,3645,3616,3722,3630,3697,3607,3588,3822,3607,3684,3626,3671,3700,3558,3765,3659,3657,3632,3663,3602,3608,3660,3547,3662,3712,3650,3698,3718,3595,3641,3631,3579,3726,3716,3587,3643,3718,3668,3696,3685,3657,3682,3694,3567,3760,3593,3735,3569,3715,3796,3678,3604,3670,3705,3722,3550,3634,3731,3551,3651,3595,3592,3661,3674,3592,3584,3525,3746,3673,3659,3713,3591,3689,3626,3657,3639,3711,3619,3685,3583,3665,3701,3591,3723,3635,3692,3669,3756,3662,3593,3729,3665,3604,3674,3659,3575,3676,3678,3649,3603,3658,3566,3708,3744,3707,3593,3668,3646,3615,3694,3696,3568,3685,3660,3725,3726,3565,3647,3659,3594,3740,3625,3663,3639,3682,3682,3655,3672,3549,3529,3650,3672,3676,3687,3647,3677,3535,3638,3627,3615,3696,3675,3599,3546,3629,3627,3633,3583,3602,3661,3671,3598,3749,3711,3597,3664,3640,3699,3757,3719,3578,3743,3690,3691,3604,3551,3657,3575,3694,3563,3750,3675,3679,3635,3750,3704,3612,3716,3652,3649,3747,3606,3634,3698,3654,3668,3625,3610,3635,3590,3603,3615,3716,3722,3558,3694,3649,3667,3628,3566,3706,3658,3657,3689,3669,3642,3708,3516,3736,3693,3754,3688,3584,3648,3603,3621,3696,3750,3708,3727,3672,3648,3673,3614,3694,3642,3653,3621,3669,3620,3616,3661,3604,3631,3715,3729,3668,3586,3674,3708,3675,3578,3773,3783,3656,3618,3692,3756,3675,3663,3593,3622,3700,3640,3634,3649,3705,3698,3709,3542,3635,3646,3672,3646,3699,3575,3706,3748,3683,3628,3637,3626,3582,3664,3573,3547,3599,3694,3747,3628,3694,3511,3752,3644,3667,3689,3616,3585,3683,3656,3516,3628,3660,3679,3647,3578,3681,3663,3730,3656,3624,3603,3651,3676,3655,3632,3605,3633,3609,3609,3642,3712,3737,3643,3568,3688,3534,3654,3558,3741,3616,3705,3654,3686,3632,3618,3628,3581,3664,3622,3710,3663,3508,3666,3679,3699,3646,3680,3583,3657,3739,3681,3627,3713,3737,3633,3712,3679,3687,3663,3770,3673,3718,3714,3599,3743,3684,3656,3741,3539,3680,3637,3629,3735,3720,3674,3726,3798,3628,3604,3647,3621,3578,3766,3711,3650,3778,3697,3683,3622,3614,3649,3812,3712,3781,3620,3699,3642,3491,3741,3672,3678,3682,3672,3608,3652,3621,3689,3702,3707,3641,3658,3683,3715,3676,3596,3636,3747,3748,3727,3720,3545,3723,3712,3722,3763,3604,3584,3584,3681,3670,3832,3660,3609,3593,3715,3687,3658,3601,3622,3636,3743,3589,3664,3598,3651,3601,3783,3708,3613,3619,3627,3677,3687,3674,3632,3664,3667,3619,3714,3667,3585,3697,3649,3667,3551,3539,3686,3673,3552,3562,3673,3668,3664,3606,3455,3702,3707,3544,3589,3773,3652,3755,3584,3666,3672,3739,3723,3597,3651,3670,3610,3716,3738,3699,3684,3592,3682,3609,3611,3711,3619,3650,3610,3643,3676,3727,3696,3666,3721,3742,3631,3633,3749,3742,3659,3531,3706,3657,3610,3684,3745,3730,3733,3715,3723,3642,3675,3736,3766,3670,3675,3689,3614,3675,3632,3725,3655,3649,3722,3603,3692,3687,3675,3670,3691,3680,3640,3684,3734,3688,3693,3547,3700,3610,3755,3738,3754,3635,3615,3621,3686,3671,3682,3595,3680,3719,3657,3669,3605,3602,3656,3737,3602,3751,3697,3602,3650,3753,3635,3626,3638,3615,3677,3669,3675,3674,3632,3605,3679,3741,3665,3710,3636,3687,3626,3680,3708,3614,3734,3636,3689,3658,3627,3771,3654,3663,3654,3735,3776,3625,3667,3673,3595,3650,3590,3760,3584,3630,3697,3564,3629,3642,3578,3611,3633,3556,3697,3634,3728,3661,3651,3634,3612,3557,3594,3574,3760,3738,3669,3639,3793,3708,3600,3628,3637,3741,3644,3652,3754,3745,3758,3763,3728,3671,3719,3695,3674,3624,3675,3686,3616,3673,3696,3755,3707,3770,3647,3661,3710,3607,3606,3687,3629,3642,3658,3633,3755,3649,3652,3741,3639,3716,3622,3598,3670,3643,3680,3714,3647,3575,3594,3592,3743,3578,3701,3658,3715,3688,3610,3613,3686,3740,3666,3627,3624,3651,3722,3633,3651,3699,3478,3631,3625,3696,3810,3669,3672,3722,3807,3652,3624,3670,3650,3784,3678,3555,3611,3724,3639,3625,3592,3668,3559,3796,3586,3698,3558,3614,3618,3676,3590,3693,3625,3640,3649,3603,3720,3597,3649,3628,3655,3783,3680,3673,3602,3614,3637,3568,3647,3587,3650,3617,3688,3683,3664,3722,3640,3622,3737,3696,3758,3640,3628,3739,3614,3479,3670,3687,3638,3657,3763,3666,3685,3724,3676,3593,3816,3701,3643,3647,3697,3663,3591,3698,3655,3712,3784,3706,3716,3701,3613,3716,3650,3640,3764,3715,3638,3686,3645,3726,3668,3713,3660,3619,3709,3636,3708,3690,3695,3629,3607,3645,3686,3701,3684,3637,3729,3638,3543,3697,3654,3722,3728,3754,3711,3702,3655,3622,3736,3640,3624,3616,3651,3657,3589,3618,3737,3717,3706,3634,3736,3763,3640,3675,3664,3563,3641,3639,3683,3617,3730,3759,3753,3647,3632,3683,3720,3586,3670,3607,3602,3653,3687,3599,3557,3586,3751,3626,3575,3736,3687,3572,3643,3696,3657,3767,3717,3523,3621,3595,3713,3750,3633,3808,3719,3623,3543,3713,3558,3610,3666,3606,3726,3620,3696,3703,3556,3679,3675,3612,3789,3624,3631,3569,3589,3617,3626,3694,3672,3658,3625,3688,3721,3759,3693,3647,3708,3690,3672,3683,3672,3711,3553,3672,3708,3753,3579,3593,3676,3735,3745,3635,3639,3611,3663,3607,3616,3623,3667,3680,3665,3664,3668,3689,3653,3642,3706,3559,3599,3580,3609,3544,3735,3533,3626,3627,3639,3589,3472,3732,3636,3594,3565,3702,3671,3677,3695,3665,3636,3669,3666,3562,3622,3699,3633,3769,3659,3602,3834,3690,3666,3649,3709,3614,3699,3567,3602,3782,3647,3786,3591,3627,3637,3658,3574,3518,3612,3713,3729,3609,3646,3609,3597,3688,3560,3631,3665,3677]},{"counters":[3605,3645,3764,3675,3639,3581,3719,3784,3645,3577,3751,3653,3577,3742,3663,3799,3586,3701,3610,3718,3697,3560,3756,3626,3717,3713,3607,3726,3620,3739,3690,3773,3587,3602,3662,3717,3638,3693,3830,3673,3732,3640,3727,3644,3631,3666,3587,3718,3651,3610,3775,3607,3690,3680,3559,3683,3698,3598,3625,3649,3727,3710,3634,3659,3678,3768,3653,3635,3518,3625,3771,3627,3661,3692,3726,3656,3607,3601,3643,3624,3709,3669,3625,3663,3579,3639,3697,3681,3743,3653,3711,3692,3695,3656,3545,3663,3660,3667,3639,3560,3642,3658,3608,3659,3601,3689,3651,3636,3606,3622,3608,3791,3663,3659,3747,3714,3646,3715,3638,3636,3582,3577,3628,3626,3691,3726,3667,3728,3643,3713,3758,3783,3564,3609,3656,3796,3655,3680,3699,3639,3657,3651,3714,3644,3632,3552,3607,3681,3718,3637,3562,3545,3637,3682,3634,3698,3675,3709,3613,3633,3546,3697,3634,3622,3709,3655,3582,3731,3753,3646,3781,3652,3770,3723,3584,3564,3599,3752,3624,3754,3606,3683,3684,3608,3673,3668,3592,3783,3529,3617,3735,3718,3809,3639,3661,3594,3706,3624,3704,3660,3566,3694,3549,3759,3603,3639,3711,3660,3649,3677,3664,3677,3698,3768,3723,3613,3636,3671,3637,3666,3685,3681,3665,3528,3677,3713,3715,3639,3670,3669,3678,3643,3609,3614,3679,3645,3675,3665,3609,3737,3571,3636,3691,3711,3688,3692,3601,3732,3718,3621,3693,3636,3724,3727,3631,3735,3765,3725,3654,3681,3649,3671,3724,3692,3562,3653,3744,3560,3590,3671,3625,3659,3638,3702,3627,3664,3614,3659,3677,3607,3597,3565,3555,3584,3692,3672,3745,3722,3688,3629,3647,3672,3654,3678,3670,3525,3659,3783,3626,3683,3697,3544,3663,3701,3653,3568,3715,3655,3760,3736,3669,3670,3779,3751,3809,3707,3665,3647,3623,3725,3571,3656,3705,3554,3644,3721,3737,3608,3607,3502,3763,3590,3671,3655,3712,3629,3747,3692,3701,3746,3609,3604,3662,3749,3632,3763,3725,3643,3637,3625,3571,3736,3591,3684,3691,3656,3616,3686,3583,3666,3704,3639,3725,3685,3662,3616,3758,3655,3652,3575,3667,3625,3682,3538,3551,3607,3750,3492,3701,3679,3604,3774,3730,3678,3675,3676,3598,3634,3697,3722,3637,3670,3717,3681,3728,3606,3705,3695,3741,3631,3636,3665,3455,3745,3716,3644,3583,3773,3717,3561,3727,3687,3512,3614,3672,3660,3628,3646,3625,3647,3736,3745,3652,3610,3832,3580,3524,3666,3600,3744,3682,3631,3652,3668,3624,3688,3707,3704,3656,3707,3655,3617,3643,3631,3722,3627,3726,3668,3655,3693,3594,3520,3658,3638,3610,3689,3645,3634,3556,3552,3631,3645,3677,3645,3633,3532,3618,3700,3618,3599,3576,3689,3715,3640,3685,3691,3686,3601,3787,3689,3692,3692,3636,3750,3611,3621,3720,3643,3614,3639,3590,3703,3750,3661,3709,3653,3620,3619,3593,3633,3678,3675,3683,3687,3644,3564,3601,3652,3663,3654,3684,3541,3709,3636,3661,3627,3713,3663,3640,3821,3705,3828,3773,3690,3613,3662,3622,3557,3740,3710,3597,3612,3642,3666,3687,3591,3556,3657,3619,3701,3720,3582,3699,3754,3634,3518,3619,3713,3650,3712,3752,3703,3665,3713,3604,3771,3741,3618,3624,3670,3537,3636,3605,3620,3688,3700,3684,3630,3668,3711,3733,3745,3631,3811,3603,3631,3621,3743,3697,3531,3788,3712,3748,3604,3553,3719,3793,3599,3679,3631,3623,3643,3653,3656,3650,3611,3657,3531,3711,3681,3681,3670,3791,3669,3693,3754,3546,3614,3652,3574,3741,3649,3680,3682,3687,3646,3680,3737,3676,3638,3636,3712,3660,3664,3752,3720,3766,3706,3629,3650,3655,3668,3684,3743,3690,3646,3619,3616,3611,3749,3704,3702,3679,3661,3656,3654,3630,3653,3666,3784,3588,3498,3704,3582,3799,3655,3604,3622,3705,3628,3619,3718,3710,3693,3683,3696,3724,3680,3730,3708,3655,3721,3761,3595,3637,3601,3629,3631,3657,3682,3722,3674,3689,3555,3659,3669,3699,3577,3572,3667,3723,3663,3600,3615,3651,3704,3624,3664,3595,3599,3620,3640,3641,3801,3745,3674,3681,3672,3728,3627,3602,3555,3716,3656,3575,3654,3647,3753,3637,3741,3582,3655,3755,3733,3674,3678,3735,3644,3582,3581,3582,3662,3557,3606,3743,3684,3683,3584,3712,3712,3516,3628,3627,3719,3642,3598,3647,3735,3736,3722,3742,3581,3807,3655,3693,3685,3658,3673,3650,3759,3666,3732,3776,3547,3613,3698,3669,3653,3723,3697,3579,3728,3624,3785,3639,3649,3646,3630,3709,3623,3686,3703,3559,3595,3503,3709,3672,3598,3591,3628,3715,3609,3640,3731,3716,3649,3686,3653,3539,3680,3698,3533,3632,3650,3677,3649,3603,3762,3718,3716,3552,3665,3634,3651,3740,3726,3684,3607,3717,3592,3560,3674,3640,3733,3582,3697,3696,3739,3678,3634,3658,3656,3641,3632,3632,3712,3642,3865,3694,3610,3648,3753,3628,3692,3610,3621,3703,3734,3600,3672,3596,3668,3569,3614,3564,3638,3629,3563,3522,3604,3530,3503,3696,3630,3766,3687,3652,3580,3829,3709,3754,3743,3493,3676,3591,3646,3620,3684,3748,3727,3611,3673,3711,3603,3606,3680,3717,3593,3584,3649,3561,3588,3668,3679,3543,3616,3664,3719,3591,3738,3642,3637,3686,3612,3727,3657,3619,3624,3580,3747,3594,3559,3589,3695,3676,3681,3712,3695,3786,3726,3682,3678,3753,3626,3610,3747,3703,3542,3558,3688,3804,3745,3701,3742,3742,3648,3757,3641,3664,3642,3563,3673,3585,3676,3679,3608,3493,3669,3718,3725,3831,3608,3529,3624,3788,3754,3728,3704,3607,3774,3603,3601,3640,3633,3549,3647,3650,3735,3724,3643,3758,3748,3682,3624,3684,3705,3839,3720,3726,3503,3618,3554,3627,3533,3707,3554,3648,3660,3600,3723,3738,3660,3672,3797,3717,3729,3764,3675,3705,3679,3528,3687,3708,3751,3614,3650,3669,3520,3630,3647,3654,3715,3758,3674,3698,3805,3743,3676,3555,3654,3692,3607,3681,3749,3709,3720,3589,3607,3805,3694,3599,3639,3574,3725,3654,3593,3742,3680,3690,3673,3665,3702,3745,3673,3660,3680,3643,3653,3623,3653,3676,3596,3692,3727,3674,3645,3636,3594,3616,3560,3636,3669,3661,3558,3670,3605,3688,3672,3749,3735,3632,3580,3746,3720,3670,3679,3577,3593,3698,3619,3716,3719,3697,3731,3609,3588,3596,3567,3715,3680,3604,3521,3636,3609,3643,3730,3662,3511,3792,3626,3672,3697,3824,3681,3599,3683,3737,3570,3683,3533,3637,3741,3702,3676,3640,3566,3626,3649,3610,3762,3683,3774,3558,3612,3665,3669,3618,3595,3664,3667,3750,3582,3676,3696,3701,3676,3740,3596,3650,3635,3552,3634,3773,3583,3694,3627,3684,3665,3580,3711,3735,3715,3678,3736,3647,3550,3643,3622,3620,3670,3640,3694,3618,3608,3615,3598,3625,3677,3678,3507,3709,3757,3737,3691,3619,3639,3645,3701,3608,3590,3493,3758,3667,3683,3626,3558,3686,3692,3631,3546,3597,3656,3612,3565,3634,3636,3713,3619,3664,3680,3591,3690,3621,3549,3695,3674,3642,3769,3472,3712,3713,3623,3664,3669,3587,3728,3641,3760,3660,3636,3682,3573,3614,3535,3536,3571,3617,3669,3578,3611,3681,3661,3623,3653,3537,3726,3726,3600,3618,3630,3603,3698,3691,3639,3734,3742,3595,3724,3677,3734,3667,3670,3529,3736,3631,3548,3597,3565,3719,3582,3631,3689,3575,3765,3571,3645,3661,3718,3610,3670,3599,3625,3787,3586,3722,3585,3766,3652,3699,3751,3578,3632,3706,3715,3606,3729,3741,3596,3689,3730,3640,3660,3712,3630,3680,3561,3644,3559,3758,3732,3724,3550,3681,3739,3688,3775,3699,3677,3713,3663,3743,3658,3776,3576,3612,3728,3566,3686,3793,3723,3653,3578,3729,3623,3666,3710,3629,3717,3767,3659,3635,3698,3610,3616,3658,3590,3689,3653,3718,3780,3614,3596,3752,3607,3628,3705,3496,3720,3772,3620,3612,3625,3666,3739,3728,3604,3613,3610,3748,3669,3628,3789,3615,3649,3726,3709,3660,3575,3638,3659,3607,3639,3633,3637,3810,3720,3654,3630,3641,3749,3573,3654,3626,3685,3664,3555,3782,3603,3709,3744,3623,3676,3748,3701,3645,3579,3715,3716,3576,3609,3649,3612,3624,3707,3679,3644,3693,3657,3618,3704,3668,3737,3678,3663,3660,3673,3634,3667,3643,3618,3711,3675,3691,3751,3651,3687,3798,3640,3633,3793,3710,3770,3603,3752,3664,3714,3549,3635,3643,3605,3659,3576,3683,3557,3592,3768,3651,3614,3706,3707,3851,3668,3622,3705,3722,3663,3661,3683,3593,3771,3663,3683,3684,3579,3688,3735,3608,3597,3593,3681,3742,3727,3673,3671,3668,3665,3606,3695,3575,3692,3704,3798,3674,3754,3687,3710,3668,3661,3675,3662,3566,3717,3692,3700,3612,3609,3615,3761,3689,3581,3657,3627,3577,3714,3625,3640,3602,3674,3550,3563,3656,3613,3628,3735,3668,3675,3634,3650,3602,3698,3619,3640,3626,3658,3650,3712,3680,3765,3650,3618,3723,3593,3660,3614,3656,3674,3744,3745,3579,3622,3657,3694,3676,3742,3744,3800,3900,3678,3672,3598,3757,3619,3628,3637,3618,3591,3620,3678,3673,3622,3614,3609,3746,3678,3586,3712,3625,3653,3710,3714,3623,3603,3688,3778,3731,3530,3696,3586,3634,3803,3720,3597,3742,3702,3775,3593,3661,3695,3688,3696,3659,3659,3584,3660,3683,3737,3708,3604,3611,3705,3672,3624,3703,3703,3673,3697,3694,3666,3677,3750,3623,3702,3690,3702,3663,3641,3651,3689,3603,3570,3663,3672,3685,3681,3703,3557,3619,3693,3618,3708,3712,3642,3613,3688,3656,3688,3628,3685,3697,3716,3551,3785,3612,3583,3633,3707,3715,3686,3702,3578,3675,3780,3700,3591,3667,3755,3668,3605,3666,3593,3706,3653,3608,3585,3713,3682,3652,3667,3775,3637,3641,3703,3732,3598,3689,3611,3643,3615,3624,3715,3726,3739,3674,3600,3643,3572,3675,3669,3642,3652,3633,3743,3683,3727,3590,3747,3652,3752,3657,3593,3553,3736,3656,3633,3698,3625,3621,3653,3684,3644,3652,3586,3697,3616,3707,3599,3649,3662,3592,3673,3691,3692,3718,3724,3666,3611,3653,3703,3680,3658,3644,3684,3603,3744,3667,3586,3724,3788,3585,3687,3620,3643,3727,3720,3607,3704,3658,3714,3646,3672,3678,3619,3631,3566,3610,3694,3615,3609,3743,3572,3611,3588,3699,3657,3657,3595,3704,3758,3748,3629,3567,3701,3719,3644,3759,3724,3568,3648,3681,3702,3616,3665,3643,3640,3606,3757,3668,3703,3742,3647,3639,3733,3623,3711,3665,3632,3661,3739,3688,3674,3765,3654,3622,3684,3673,3566,3687,3680,3616,3754,3651,3623,3787,3815,3587,3595,3507,3687,3646,3713,3693,3669,3600,3611,3709,3759,3710,3716,3610,3693,3676,3534,3700,3610,3722,3642,3639,3501,3649,3694,3646,3641,3582,3686,3643,3646,3626,3636,3543,3750,3625,3674,3688,3732,3624,3675,3719,3578,3630,3589,3582,3577,3672,3627,3650,3579,3712,3707,3695,3654,3608,3654,3712,3766,3644,3708,3613,3729,3705,3703,3734,3708,3712,3643,3621,3801,3669,3669,3551,3605,3639,3677,3618,3665,3689,3593,3639,3649,3664,3625,3622,3773,3528,3702,3639,3603,3686,3715,3752,3627,3650,3776,3633,3589,3658,3700,3623,3616,3764,3763,3589,3617,3636,3624,3591,3612,3639,3629,3634,3706,3642,3673,3650,3698,3775,3662,3765,3689,3739,3612,3663,3590,3610,3631,3557,3674,3717,3673,3656,3724,3670,3802,3579,3607,3643,3544,3645,3705,3634,3820,3538,3717,3659,3785,3555,3598,3722,3615,3616,3596,3656,3683,3680,3875,3652,3710,3576,3687,3681,3659,3710,3653,3672,3712,3630,3564,3598,3602,3596,3612,3642,3650,3656,3689,3812,3636,3687,3651,3775,3601,3647,3664,3586,3574,3585,3638,3604,3631,3688,3697,3597,3672,3809,3768,3721,3661,3707,3659,3762,3755,3588,3632,3635,3531,3737,3693,3657,3619,3732,3659,3719,3610,3693,3729,3686,3758,3658,3749,3789,3587,3711,3761,3604,3563,3583,3674,3586,3583]},{"counters":[3679,3637,3693,3698,3635,3794,3696,3628,3640,3726,3557,3606,3718,3659,3692,3681,3648,3677,3727,3724,3779,3601,3650,3698,3647,3587,3502,3637,3650,3585,3575,3698,3629,3647,3720,3766,3688,3643,3637,3709,3712,3688,3674,3684,3618,3761,3720,3700,3673,3608,3645,3680,3661,3561,3695,3751,3683,3596,3619,3740,3614,3636,3586,3693,3662,3660,3588,3587,3595,3646,3697,3568,3643,3614,3796,3768,3695,3551,3715,3727,3572,3672,3768,3559,3617,3593,3554,3654,3606,3558,3650,3684,3668,3719,3661,3675,3724,3647,3756,3727,3646,3534,3699,3709,3646,3735,3634,3701,3657,3638,3759,3665,3720,3644,3619,3685,3701,3586,3563,3672,3574,3692,3605,3761,3633,3627,3638,3631,3639,3644,3717,3638,3751,3671,3742,3581,3670,3567,3641,3490,3698,3619,3678,3667,3643,3741,3738,3529,3699,3629,3585,3871,3686,3663,3657,3686,3608,3658,3683,3700,3660,3788,3677,3641,3599,3614,3874,3650,3808,3612,3668,3655,3586,3586,3777,3713,3586,3636,3745,3729,3588,3636,3604,3648,3718,3704,3645,3640,3689,3686,3618,3669,3714,3492,3719,3722,3629,3654,3675,3585,3687,3744,3642,3554,3660,3679,3696,3643,3645,3629,3619,3665,3652,3661,3671,3663,3667,3652,3621,3702,3727,3668,3639,3617,3685,3587,3750,3744,3542,3661,3593,3641,3639,3774,3681,3719,3624,3681,3687,3600,3680,3613,3690,3652,3629,3706,3742,3767,3662,3630,3697,3552,3552,3600,3688,3634,3739,3627,3688,3652,3665,3631,3638,3622,3593,3776,3690,3744,3771,3644,3689,3710,3724,3762,3683,3712,3778,3722,3720,3630,3748,3673,3716,3639,3681,3671,3712,3687,3696,3668,3704,3723,3692,3802,3780,3638,3639,3644,3651,3720,3680,3670,3645,3620,3682,3685,3785,3747,3593,3641,3747,3659,3614,3667,3675,3739,3692,3661,3753,3598,3728,3547,3650,3745,3711,3663,3663,3707,3620,3756,3649,3680,3710,3638,3601,3552,3692,3746,3603,3720,3526,3632,3631,3762,3650,3643,3721,3560,3536,3716,3575,3715,3536,3637,3648,3587,3549,3580,3712,3657,3716,3655,3650,3765,3665,3753,3639,3606,3565,3584,3709,3647,3693,3633,3626,3601,3645,3566,3587,3599,3605,3669,3631,3706,3597,3688,3745,3630,3634,3572,3720,3733,3667,3591,3616,3670,3593,3619,3498,3478,3651,3519,3873,3566,3623,3726,3695,3669,3602,3734,3693,3633,3722,3719,3631,3683,3680,3740,3643,3667,3614,3707,3649,3735,3640,3704,3671,3632,3661,3757,3635,3641,3737,3642,3631,3632,3723,3660,3788,3661,3709,3632,3714,3673,3731,3631,3570,3713,3661,3637,3742,3700,3683,3653,3662,3684,3733,3743,3638,3695,3717,3736,3739,3470,3702,3623,3615,3551,3613,3680,3633,3584,3681,3595,3711,3668,3691,3710,3632,3685,3731,3664,3737,3711,3600,3704,3645,3697,3661,3667,3705,3649,3738,3789,3633,3607,3645,3622,3687,3669,3638,3715,3695,3808,3700,3685,3818,3581,3687,3654,3596,3595,3584,3603,3640,3616,3616,3706,3560,3607,3610,3677,3655,3642,3623,3616,3649,3661,3741,3713,3614,3644,3673,3698,3668,3574,3687,3622,3612,3737,3690,3663,3705,3665,3614,3617,3770,3665,3687,3642,3576,3610,3549,3745,3713,3684,3797,3631,3740,3687,3634,3768,3590,3621,3745,3678,3672,3687,3654,3646,3645,3653,3577,3639,3719,3754,3659,3668,3621,3669,3727,3622,3648,3757,3770,3642,3560,3781,3573,3764,3679,3619,3734,3572,3686,3675,3743,3585,3657,3706,3680,3638,3646,3684,3678,3607,3655,3682,3557,3610,3720,3635,3620,3693,3750,3617,3722,3733,3594,3677,3590,3727,3559,3507,3630,3684,3518,3620,3688,3715,3648,3793,3579,3594,3632,3698,3611,3861,3599,3735,3650,3736,3600,3694,3643,3690,3669,3721,3690,3657,3781,3687,3627,3603,3643,3577,3764,3675,3727,3568,3664,3608,3689,3795,3629,3614,3555,3619,3583,3609,3641,3680,3662,3686,3685,3622,3709,3624,3732,3722,3638,3672,3789,3694,3674,3696,3630,3616,3764,3648,3711,3579,3649,3683,3694,3677,3622,3676,3691,3604,3705,3749,3578,3695,3681,3692,3685,3607,3680,3668,3647,3733,3587,3692,3629,3731,3633,3685,3620,3596,3739,3702,3660,3635,3700,3650,3607,3684,3629,3636,3654,3701,3598,3623,3650,3523,3648,3562,3730,3568,3664,3684,3640,3689,3704,3624,3641,3743,3643,3614,3544,3676,3678,3630,3615,3625,3616,3646,3626,3692,3666,3739,3590,3687,3650,3609,3661,3705,3682,3775,3561,3484,3657,3650,3730,3582,3663,3661,3683,3690,3679,3686,3698,3693,3511,3652,3659,3658,3689,3751,3635,3729,3618,3670,3732,3639,3708,3754,3561,3583,3639,3664,3733,3672,3726,3605,3589,3682,3700,3620,3685,3620,3678,3594,3682,3689,3631,3601,3701,3576,3612,3635,3719,3642,3637,3660,3700,3523,3544,3680,3604,3689,3687,3579,3696,3681,3695,3728,3609,3609,3567,3669,3683,3665,3666,3611,3597,3765,3644,3611,3625,3643,3710,3662,3681,3641,3608,3665,3566,3642,3701,3753,3634,3564,3653,3700,3677,3691,3598,3686,3648,3648,3650,3650,3657,3711,3679,3707,3677,3710,3508,3678,3641,3711,3585,3891,3706,3680,3731,3594,3621,3696,3678,3634,3720,3630,3649,3657,3738,3625,3622,3641,3668,3697,3766,3661,3774,3484,3674,3836,3664,3770,3590,3635,3607,3520,3697,3673,3752,3680,3821,3593,3600,3672,3627,3628,3691,3651,3748,3654,3611,3640,3704,3668,3731,3647,3701,3658,3680,3565,3759,3720,3670,3711,3697,3615,3698,3796,3613,3609,3705,3713,3573,3692,3695,3641,3696,3615,3734,3625,3619,3681,3682,3776,3604,3648,3720,3542,3542,3549,3614,3714,3648,3637,3706,3780,3660,3659,3674,3656,3695,3644,3709,3787,3633,3709,3607,3645,3561,3687,3678,3750,3606,3748,3572,3645,3605,3658,3617,3679,3721,3621,3597,3759,3716,3602,3728,3684,3666,3589,3735,3618,3593,3692,3723,3659,3667,3625,3735,3690,3671,3657,3557,3728,3716,3633,3655,3648,3669,3619,3681,3631,3639,3666,3604,3574,3692,3839,3628,3619,3745,3722,3648,3764,3612,3661,3709,3674,3723,3655,3564,3691,3702,3549,3673,3609,3691,3598,3725,3580,3686,3683,3625,3671,3585,3563,3836,3628,3592,3640,3656,3682,3659,3691,3743,3671,3665,3613,3689,3735,3614,3624,3596,3613,3523,3727,3739,3608,3685,3773,3698,3749,3754,3725,3752,3656,3730,3696,3634,3549,3719,3656,3615,3719,3768,3681,3567,3594,3763,3661,3664,3718,3688,3578,3518,3681,3735,3670,3659,3710,3756,3663,3639,3625,3678,3669,3618,3637,3610,3645,3608,3574,3691,3665,3595,3621,3641,3685,3687,3714,3680,3595,3723,3639,3625,3575,3657,3694,3679,3657,3673,3708,3562,3665,3684,3636,3741,3697,3688,3681,3643,3605,3750,3695,3551,3736,3605,3654,3605,3631,3567,3718,3640,3630,3647,3741,3670,3678,3706,3609,3547,3646,3594,3619,3792,3757,3604,3747,3630,3667,3651,3662,3711,3663,3634,3650,3688,3592,3769,3575,3664,3650,3612,3709,3555,3725,3645,3755,3682,3629,3749,3678,3607,3619,3652,3826,3667,3668,3668,3646,3677,3684,3580,3656,3579,3587,3694,3619,3623,3579,3789,3665,3537,3571,3539,3706,3644,3707,3544,3570,3670,3672,3698,3579,3730,3578,3754,3715,3635,3699,3728,3548,3610,3746,3645,3711,3680,3623,3672,3712,3713,3625,3782,3803,3691,3702,3675,3570,3575,3646,3621,3715,3666,3664,3635,3613,3619,3751,3650,3683,3611,3593,3729,3598,3591,3649,3638,3647,3762,3677,3586,3647,3651,3664,3648,3736,3671,3656,3736,3669,3677,3704,3722,3709,3672,3602,3703,3519,3651,3633,3709,3708,3608,3734,3570,3764,3683,3585,3727,3694,3679,3659,3605,3673,3598,3754,3641,3678,3669,3611,3624,3666,3640,3668,3631,3622,3634,3663,3683,3576,3656,3732,3717,3685,3661,3609,3748,3702,3597,3673,3746,3625,3617,3706,3608,3667,3669,3726,3513,3619,3702,3628,3639,3813,3654,3609,3608,3640,3663,3633,3663,3637,3642,3664,3790,3695,3758,3765,3704,3641,3709,3687,3650,3736,3643,3749,3648,3664,3617,3652,3738,3591,3701,3647,3652,3653,3616,3694,3609,3539,3693,3697,3678,3499,3561,3798,3540,3678,3653,3689,3687,3748,3614,3760,3625,3722,3668,3600,3608,3636,3614,3799,3637,3749,3784,3626,3678,3680,3645,3735,3811,3684,3567,3637,3726,3657,3664,3720,3587,3689,3653,3609,3732,3625,3647,3701,3645,3773,3703,3599,3654,3649,3660,3743,3584,3650,3626,3641,3748,3478,3703,3732,3701,3612,3717,3693,3740,3620,3546,3682,3619,3824,3700,3787,3649,3628,3600,3509,3692,3712,3532,3763,3651,3725,3712,3622,3658,3758,3695,3650,3608,3728,3512,3699,3722,3648,3648,3753,3771,3653,3673,3668,3710,3682,3685,3607,3682,3716,3676,3635,3563,3659,3640,3597,3697,3747,3580,3746,3754,3630,3803,3646,3636,3718,3755,3554,3633,3649,3663,3646,3790,3666,3606,3629,3572,3652,3564,3594,3606,3632,3601,3805,3585,3646,3718,3635,3647,3727,3587,3716,3689,3609,3621,3548,3589,3618,3645,3597,3647,3687,3724,3685,3571,3604,3620,3727,3663,3692,3651,3713,3636,3621,3745,3655,3573,3599,3586,3712,3639,3691,3700,3659,3723,3702,3603,3647,3616,3613,3653,3591,3703,3659,3672,3617,3681,3706,3722,3654,3610,3593,3708,3661,3668,3649,3699,3560,3606,3714,3661,3601,3706,3723,3617,3595,3560,3661,3709,3672,3712,3619,3676,3521,3767,3663,3724,3640,3690,3585,3715,3715,3690,3699,3571,3599,3573,3633,3698,3709,3576,3653,3603,3596,3641,3617,3577,3521,3679,3697,3597,3759,3590,3562,3660,3748,3703,3769,3615,3769,3667,3655,3594,3661,3595,3681,3616,3699,3687,3624,3668,3747,3690,3707,3660,3626,3745,3679,3532,3624,3582,3651,3682,3743,3679,3712,3782,3682,3586,3684,3668,3651,3660,3656,3646,3674,3637,3688,3691,3539,3689,3632,3759,3795,3772,3677,3704,3736,3756,3633,3721,3689,3631,3834,3697,3702,3631,3617,3606,3644,3646,3629,3623,3633,3627,3666,3673,3837,3583,3716,3680,3590,3707,3683,3594,3772,3612,3639,3775,3608,3585,3672,3657,3689,3559,3713,3660,3681,3590,3651,3702,3643,3646,3739,3694,3737,3690,3686,3670,3548,3701,3687,3683,3640,3681,3747,3574,3660,3611,3679,3683,3605,3636,3662,3755,3614,3667,3809,3680,3606,3704,3736,3713,3588,3673,3588,3603,3653,3564,3658,3657,3662,3733,3575,3672,3640,3627,3620,3632,3713,3704,3619,3630,3652,3701,3667,3685,3635,3664,3625,3635,3667,3553,3585,3634,3704,3769,3622,3668,3655,3651,3578,3692,3656,3637,3611,3707,3692,3654,3572,3603,3631,3756,3695,3590,3544,3593,3775,3731,3692,3697,3635,3622,3647,3610,3690,3685,3623,3688,3676,3662,3680,3677,3667,3647,3656,3666,3745,3701,3728,3667,3656,3601,3726,3612,3668,3634,3653,3729,3689,3596,3559,3632,3667,3648,3675,3652,3676,3586,3674,3730,3637,3712,3621,3612,3668,3621,3598,3702,3625,3632,3761,3663,3643,3607,3690,3597,3618,3654,3672,3618,3622,3759,3698,3609,3757,3722,3541,3658,3802,3619,3645,3624,3658,3648,3618,3677,3743,3630,3679,3653,3604,3587,3729,3759,3707,3743,3685,3641,3706,3615,3603,3627,3739,3740,3623,3658,3713,3678,3632,3684,3651,3720,3732,3709,3701,3643,3691,3641,3541,3605,3716,3640,3687,3606,3714,3733,3613,3701,3604,3501,3613,3578,3594,3587,3694,3574,3635,3702,3718,3643,3732,3647,3679,3598,3585,3640,3653,3672,3676,3582,3536,3644,3771,3647,3726,3749,3679,3648,3640,3654,3721,3659,3667,3623,3589,3621,3547,3705,3621,3694,3602,3777,3663,3674,3677,3521,3683,3767,3728,3724,3654,3648,3557,3704,3625,3756,3688,3664,3623,3708,3723,3651,3625,3690,3635,3644,3681,3670,3609,3552,3603,3712,3745,3523,3735,3644,3670,3727,3730,3757,3765,3610,3715,3736,3746,3630,3629,3652,3641]},{"counters":[3628,3722,3664,3679,3669,3614,3642,3647,3609,3695,3675,3710,3648,3646,3553,3661,3647,3657,3671,3594,3661,3636,3705,3663,3678,3689,3737,3656,3609,3673,3709,3668,3665,3628,3628,3553,3699,3417,3725,3722,3677,3741,3615,3641,3752,3631,3726,3605,3728,3578,3626,3644,3639,3555,3723,3622,3623,3718,3760,3723,3576,3676,3672,3537,3733,3751,3704,3550,3588,3601,3534,3553,3691,3637,3655,3594,3722,3573,3725,3599,3686,3686,3562,3761,3567,3674,3632,3674,3549,3725,3591,3690,3596,3685,3736,3612,3695,3570,3666,3578,3627,3521,3659,3646,3677,3706,3555,3692,3643,3710,3739,3735,3658,3621,3670,3644,3739,3815,3675,3561,3738,3653,3679,3646,3608,3642,3702,3640,3651,3696,3703,3655,3734,3608,3560,3638,3649,3582,3639,3703,3672,3656,3753,3707,3679,3746,3728,3635,3677,3672,3723,3730,3498,3689,3601,3648,3654,3668,3639,3600,3691,3657,3611,3712,3586,3729,3734,3711,3758,3638,3645,3621,3573,3679,3664,3654,3655,3689,3739,3579,3677,3631,3684,3648,3794,3587,3684,3649,3649,3639,3605,3710,3631,3681,3598,3625,3622,3691,3765,3673,3562,3741,3670,3652,3622,3684,3602,3714,3616,3799,3624,3727,3711,3590,3785,3620,3788,3706,3688,3692,3679,3626,3655,3688,3652,3640,3628,3581,3604,3690,3706,3678,3710,3565,3647,3713,3583,3687,3569,3726,3617,3699,3692,3709,3666,3611,3718,3702,3637,3690,3765,3741,3554,3583,3655,3706,3660,3676,3649,3641,3736,3740,3610,3738,3650,3638,3721,3644,3702,3663,3671,3682,3733,3702,3583,3582,3602,3715,3613,3702,3624,3677,3684,3792,3651,3749,3715,3758,3598,3653,3612,3618,3753,3667,3740,3701,3617,3544,3664,3602,3763,3645,3732,3758,3664,3718,3604,3761,3756,3614,3688,3581,3741,3548,3636,3604,3699,3736,3530,3741,3659,3557,3704,3671,3714,3762,3600,3733,3612,3773,3643,3764,3737,3673,3644,3588,3605,3683,3656,3669,3636,3759,3658,3606,3635,3775,3601,3718,3757,3709,3617,3730,3698,3600,3778,3599,3707,3629,3627,3747,3622,3665,3671,3624,3689,3702,3726,3671,3574,3660,3653,3604,3602,3763,3657,3714,3574,3554,3652,3712,3623,3699,3736,3614,3684,3673,3579,3602,3636,3607,3619,3777,3610,3706,3667,3654,3627,3570,3626,3636,3759,3647,3785,3733,3740,3589,3640,3688,3688,3655,3685,3648,3721,3712,3664,3657,3686,3630,3766,3621,3632,3763,3678,3646,3667,3633,3616,3713,3699,3614,3670,3664,3742,3650,3693,3559,3644,3596,3689,3774,3664,3642,3598,3618,3693,3681,3648,3701,3578,3750,3794,3801,3603,3660,3660,3555,3737,3658,3685,3633,3627,3607,3631,3869,3679,3680,3653,3860,3702,3616,3658,3587,3610,3685,3767,3729,3727,3689,3773,3700,3701,3645,3651,3775,3724,3614,3754,3660,3638,3596,3734,3803,3731,3713,3737,3632,3729,3634,3574,3591,3706,3617,3634,3758,3683,3682,3724,3604,3570,3687,3604,3673,3579,3687,3755,3654,3602,3641,3624,3773,3631,3677,3671,3670,3664,3699,3701,3697,3665,3801,3574,3596,3647,3676,3688,3650,3719,3639,3724,3583,3638,3572,3709,3846,3568,3610,3734,3681,3688,3683,3659,3640,3710,3664,3625,3545,3740,3593,3610,3737,3622,3770,3701,3709,3659,3640,3690,3645,3740,3715,3657,3634,3785,3646,3689,3694,3757,3637,3545,3655,3669,3607,3618,3637,3660,3608,3679,3695,3566,3569,3718,3673,3608,3591,3618,3667,3669,3667,3584,3642,3726,3712,3746,3664,3593,3698,3685,3658,3797,3695,3598,3698,3562,3625,3604,3707,3706,3639,3643,3732,3773,3643,3665,3687,3654,3646,3700,3671,3579,3703,3575,3734,3692,3665,3659,3611,3670,3812,3629,3624,3666,3676,3858,3674,3577,3644,3551,3671,3577,3711,3619,3736,3733,3781,3686,3725,3572,3709,3625,3713,3694,3753,3542,3758,3705,3639,3655,3698,3712,3630,3587,3701,3692,3693,3714,3698,3609,3707,3646,3560,3590,3761,3628,3681,3587,3678,3669,3673,3644,3669,3505,3602,3665,3580,3633,3605,3680,3677,3692,3693,3601,3587,3635,3597,3614,3624,3676,3581,3608,3670,3702,3690,3760,3547,3670,3730,3561,3735,3592,3720,3688,3646,3618,3627,3640,3746,3656,3583,3680,3694,3724,3683,3637,3591,3664,3729,3583,3625,3637,3597,3768,3619,3589,3786,3572,3731,3638,3632,3566,3628,3620,3556,3563,3652,3666,3663,3619,3730,3642,3710,3676,3750,3569,3639,3711,3582,3726,3634,3701,3543,3609,3681,3568,3703,3668,3650,3694,3585,3763,3634,3701,3651,3712,3699,3687,3572,3646,3587,3639,3507,3682,3708,3754,3620,3593,3705,3544,3604,3618,3692,3749,3597,3646,3646,3675,3657,3772,3524,3670,3675,3749,3685,3679,3762,3756,3724,3632,3651,3693,3723,3662,3677,3651,3697,3698,3586,3692,3666,3598,3628,3574,3623,3669,3596,3703,3661,3631,3610,3655,3699,3644,3685,3621,3719,3703,3662,3577,3532,3699,3700,3500,3612,3797,3663,3649,3564,3602,3652,3707,3733,3711,3635,3527,3627,3646,3586,3673,3761,3646,3705,3628,3653,3585,3756,3633,3522,3635,3611,3619,3626,3755,3555,3674,3634,3606,3647,3695,3726,3707,3614,3689,3668,3610,3620,3642,3614,3700,3523,3660,3694,3655,3634,3660,3669,3777,3732,3760,3666,3712,3633,3639,3713,3629,3698,3558,3744,3700,3633,3591,3615,3582,3695,3781,3659,3694,3630,3599,3639,3688,3659,3701,3697,3709,3677,3716,3695,3704,3630,3645,3684,3663,3608,3689,3687,3715,3645,3750,3679,3593,3636,3672,3703,3707,3671,3674,3692,3760,3717,3665,3684,3731,3664,3527,3581,3560,3760,3711,3680,3621,3760,3581,3652,3755,3751,3690,3572,3705,3596,3736,3742,3487,3511,3676,3692,3709,3643,3750,3703,3642,3690,3647,3686,3587,3620,3737,3643,3705,3640,3664,3639,3608,3717,3635,3705,3606,3703,3545,3674,3690,3708,3727,3627,3616,3587,3645,3676,3658,3697,3591,3641,3621,3602,3672,3628,3674,3720,3699,3704,3621,3613,3680,3582,3573,3691,3719,3686,3657,3571,3593,3679,3690,3643,3669,3611,3547,3577,3561,3730,3627,3639,3714,3713,3713,3658,3734,3722,3682,3583,3660,3700,3724,3645,3600,3620,3539,3702,3712,3762,3586,3590,3672,3565,3696,3720,3571,3669,3553,3662,3596,3847,3639,3691,3661,3612,3594,3692,3706,3727,3683,3646,3697,3673,3716,3577,3670,3658,3757,3635,3724,3706,3747,3710,3740,3568,3635,3712,3626,3681,3679,3687,3553,3647,3605,3658,3673,3580,3657,3593,3652,3804,3545,3656,3716,3700,3624,3727,3701,3768,3612,3621,3722,3621,3626,3635,3602,3665,3663,3717,3730,3714,3671,3673,3701,3713,3594,3637,3646,3626,3658,3661,3616,3673,3619,3571,3621,3762,3700,3713,3570,3583,3616,3698,3691,3557,3728,3638,3665,3668,3583,3570,3589,3577,3665,3685,3661,3562,3698,3619,3633,3729,3671,3775,3629,3664,3636,3599,3618,3743,3566,3620,3754,3755,3652,3571,3653,3646,3642,3682,3620,3624,3537,3729,3648,3757,3551,3755,3586,3615,3569,3673,3637,3678,3704,3592,3675,3732,3601,3669,3680,3585,3625,3627,3646,3513,3712,3749,3649,3683,3690,3726,3584,3674,3639,3607,3656,3647,3648,3798,3705,3720,3769,3699,3750,3617,3650,3626,3647,3715,3672,3541,3675,3751,3712,3699,3609,3654,3632,3762,3691,3722,3749,3610,3641,3679,3664,3507,3745,3685,3587,3680,3532,3698,3702,3638,3683,3629,3751,3604,3653,3650,3682,3692,3717,3713,3545,3706,3621,3643,3674,3714,3627,3690,3539,3679,3673,3678,3738,3687,3762,3635,3676,3649,3601,3627,3626,3747,3666,3713,3754,3754,3592,3686,3707,3645,3643,3681,3624,3589,3635,3726,3651,3576,3600,3727,3546,3666,3701,3689,3622,3692,3657,3686,3687,3725,3663,3709,3674,3644,3672,3557,3618,3634,3690,3662,3653,3653,3589,3671,3597,3734,3789,3658,3732,3645,3637,3642,3692,3663,3640,3677,3664,3587,3715,3648,3678,3639,3721,3708,3615,3684,3605,3627,3740,3528,3767,3657,3679,3688,3721,3593,3646,3694,3572,3682,3661,3601,3770,3672,3528,3693,3768,3695,3656,3613,3724,3642,3620,3661,3546,3614,3677,3675,3681,3553,3592,3729,3599,3748,3632,3703,3515,3655,3702,3681,3756,3663,3631,3577,3690,3644,3687,3734,3603,3660,3636,3782,3592,3784,3764,3663,3703,3673,3709,3661,3555,3678,3699,3635,3658,3687,3655,3649,3645,3669,3709,3524,3674,3647,3694,3706,3625,3714,3627,3694,3622,3620,3685,3639,3568,3680,3574,3718,3552,3594,3586,3679,3669,3551,3741,3696,3712,3727,3631,3713,3671,3696,3664,3686,3547,3606,3538,3676,3719,3581,3615,3748,3580,3715,3648,3654,3672,3564,3622,3725,3656,3681,3741,3586,3620,3547,3650,3665,3622,3604,3641,3671,3683,3670,3676,3653,3688,3616,3602,3715,3678,3627,3677,3660,3666,3608,3611,3612,3655,3635,3669,3771,3587,3640,3610,3642,3737,3720,3706,3659,3725,3613,3693,3662,3749,3714,3661,3609,3603,3672,3740,3580,3604,3603,3642,3594,3681,3680,3632,3638,3636,3738,3622,3567,3694,3861,3774,3841,3723,3539,3739,3724,3693,3537,3769,3586,3674,3672,3569,3646,3712,3690,3664,3549,3749,3550,3595,3636,3736,3745,3711,3718,3541,3641,3701,3582,3600,3776,3730,3683,3730,3715,3806,3622,3588,3638,3772,3619,3735,3754,3630,3715,3650,3693,3660,3654,3702,3799,3624,3630,3605,3564,3663,3687,3696,3637,3622,3618,3723,3533,3585,3639,3593,3741,3698,3550,3593,3636,3708,3639,3725,3655,3723,3599,3654,3719,3660,3607,3689,3719,3729,3604,3636,3628,3584,3744,3682,3792,3603,3625,3810,3613,3676,3663,3701,3732,3695,3590,3712,3609,3673,3512,3638,3596,3687,3742,3681,3636,3766,3624,3697,3627,3688,3684,3571,3624,3692,3557,3642,3725,3672,3585,3565,3638,3672,3597,3641,3640,3743,3653,3699,3704,3682,3705,3630,3552,3588,3762,3542,3583,3772,3767,3574,3660,3651,3628,3660,3582,3752,3670,3691,3547,3672,3591,3678,3661,3620,3516,3707,3743,3644,3657,3772,3655,3641,3761,3694,3660,3613,3645,3627,3647,3710,3697,3537,3632,3638,3712,3563,3720,3707,3664,3671,3694,3672,3677,3629,3597,3645,3694,3644,3720,3726,3684,3685,3767,3675,3678,3709,3638,3708,3780,3711,3659,3619,3677,3719,3713,3766,3769,3532,3695,3696,3619,3688,3705,3638,3619,3713,3731,3824,3762,3644,3736,3670,3663,3760,3706,3545,3682,3643,3597,3711,3612,3731,3561,3614,3712,3659,3709,3625,3672,3708,3640,3578,3625,3683,3753,3650,3674,3700,3699,3660,3671,3761,3686,3625,3537,3623,3630,3598,3722,3623,3696,3686,3708,3695,3560,3711,3715,3600,3629,3622,3596,3719,3730,3602,3681,3705,3650,3650,3686,3719,3742,3751,3685,3575,3821,3653,3579,3668,3725,3580,3705,3597,3630,3649,3671,3624,3724,3697,3757,3626,3619,3682,3606,3688,3681,3697,3584,3626,3688,3689,3748,3635,3609,3688,3617,3693,3695,3632,3576,3562,3591,3717,3640,3731,3731,3664,3686,3635,3585,3644,3614,3732,3651,3544,3672,3730,3669,3683,3682,3663,3676,3615,3691,3591,3697,3633,3643,3595,3583,3666,3716,3604,3712,3602,3639,3637,3568,3601,3751,3690,3663,3737,3615,3673,3703,3560,3584,3711,3628,3719,3600,3651,3708,3629,3704,3708,3717,3701,3733,3664,3727,3721,3647,3637,3623,3679,3629,3644,3744,3626,3674,3528,3654,3638,3672,3607,3689,3665,3667,3679,3632,3619,3691,3601,3675,3643,3675,3641,3626,3719,3607,3718,3606,3667,3689,3668,3577,3709,3602,3552,3695,3744,3637,3562,3561,3652,3773,3790,3622,3692,3687,3619,3639,3753,3592,3640,3710,3678,3657,3839,3668,3652,3665,3557,3744,3666,3689,3507,3699,3711,3755,3572,3657,3575,3606,3694,3711,3646,3594,3652,3592,3667,3763,3737,3702,3659,3661,3757,3631,3660,3621,3696,3561,3679,3746,3681,3815,3670,3605,3689,3765]},{"counters":[3627,3600,3666,3735,3593,3623,3707,3595,3669,3721,3670,3678,3733,3686,3713,3625,3741,3708,3695,3645,3564,3589,3679,3656,3791,3656,3657,3684,3586,3654,3657,3655,3718,3777,3762,3754,3707,3701,3754,3668,3658,3586,3687,3746,3695,3568,3760,3664,3721,3619,3691,3644,3659,3733,3684,3686,3675,3600,3640,3641,3640,3696,3624,3624,3643,3663,3571,3668,3652,3624,3686,3673,3700,3581,3683,3774,3746,3684,3695,3622,3674,3674,3702,3663,3639,3571,3689,3666,3626,3657,3520,3749,3649,3621,3703,3661,3732,3642,3674,3687,3669,3641,3723,3735,3650,3678,3560,3710,3694,3549,3662,3635,3729,3644,3607,3594,3566,3554,3752,3738,3570,3611,3499,3552,3668,3721,3642,3719,3596,3610,3570,3594,3719,3522,3660,3629,3634,3680,3722,3653,3629,3586,3694,3656,3657,3667,3788,3548,3659,3780,3503,3766,3718,3628,3614,3673,3564,3802,3737,3757,3572,3745,3658,3635,3735,3705,3648,3581,3593,3640,3586,3593,3636,3590,3607,3731,3755,3670,3632,3745,3662,3659,3642,3613,3728,3658,3679,3693,3607,3768,3665,3682,3630,3698,3658,3753,3655,3656,3613,3664,3740,3824,3629,3688,3689,3601,3631,3826,3634,3603,3679,3702,3593,3718,3727,3644,3689,3732,3634,3666,3673,3706,3671,3739,3660,3651,3690,3717,3716,3616,3687,3627,3720,3679,3756,3613,3667,3829,3638,3618,3688,3622,3568,3686,3764,3625,3742,3723,3838,3697,3658,3576,3738,3611,3661,3597,3670,3722,3638,3611,3676,3679,3676,3588,3702,3676,3517,3675,3728,3640,3604,3625,3602,3695,3685,3693,3682,3738,3669,3685,3604,3675,3708,3781,3664,3619,3743,3701,3641,3695,3711,3690,3670,3703,3754,3706,3692,3638,3481,3578,3710,3757,3577,3648,3709,3617,3539,3711,3618,3694,3595,3581,3707,3842,3713,3594,3686,3701,3617,3697,3734,3694,3660,3689,3791,3730,3659,3724,3671,3708,3593,3677,3683,3658,3704,3674,3685,3645,3656,3671,3708,3744,3733,3689,3605,3677,3655,3526,3673,3602,3575,3748,3659,3688,3659,3589,3586,3808,3599,3571,3627,3646,3681,3727,3647,3630,3674,3708,3737,3630,3633,3560,3581,3688,3583,3647,3731,3677,3574,3667,3620,3635,3733,3582,3579,3600,3577,3630,3682,3577,3644,3641,3720,3652,3799,3689,3835,3746,3635,3670,3723,3674,3595,3714,3600,3705,3620,3631,3596,3744,3697,3610,3618,3677,3711,3575,3650,3639,3616,3667,3595,3685,3557,3675,3705,3607,3666,3651,3645,3724,3539,3640,3655,3732,3647,3621,3561,3600,3673,3692,3699,3709,3684,3623,3685,3705,3599,3634,3689,3610,3672,3650,3789,3692,3612,3673,3575,3512,3785,3633,3734,3632,3650,3671,3683,3595,3576,3685,3644,3684,3627,3664,3636,3591,3666,3564,3682,3661,3657,3614,3576,3706,3733,3830,3566,3688,3776,3633,3710,3720,3663,3658,3654,3709,3566,3650,3645,3670,3627,3655,3559,3623,3748,3616,3647,3725,3624,3657,3455,3722,3749,3608,3687,3653,3771,3701,3777,3572,3716,3572,3603,3672,3640,3739,3695,3571,3676,3459,3627,3722,3691,3680,3722,3730,3628,3786,3710,3720,3680,3746,3745,3671,3675,3592,3626,3631,3720,3622,3707,3650,3734,3649,3594,3705,3626,3708,3669,3626,3622,3614,3697,3641,3684,3570,3727,3714,3640,3643,3659,3611,3706,3656,3644,3685,3662,3791,3633,3645,3647,3657,3722,3725,3669,3651,3551,3598,3619,3769,3657,3662,3653,3749,3723,3618,3814,3677,3608,3717,3605,3638,3618,3616,3717,3762,3623,3596,3683,3779,3691,3750,3640,3675,3734,3584,3704,3664,3679,3594,3627,3620,3715,3730,3702,3694,3672,3663,3640,3711,3619,3676,3593,3801,3693,3670,3571,3601,3580,3643,3802,3643,3634,3621,3750,3690,3659,3679,3707,3676,3689,3637,3695,3773,3671,3680,3634,3639,3619,3650,3643,3649,3673,3732,3675,3626,3592,3654,3744,3560,3651,3608,3578,3665,3688,3799,3601,3640,3633,3691,3615,3640,3707,3592,3598,3751,3572,3706,3749,3622,3746,3619,3835,3667,3635,3670,3657,3611,3709,3711,3844,3668,3676,3662,3639,3650,3712,3635,3668,3594,3653,3601,3708,3539,3603,3660,3658,3683,3637,3576,3738,3724,3643,3659,3684,3701,3543,3607,3632,3705,3703,3635,3651,3704,3676,3717,3722,3757,3680,3798,3656,3698,3659,3568,3577,3633,3697,3603,3705,3610,3692,3652,3644,3715,3623,3653,3578,3667,3541,3601,3650,3694,3658,3679,3584,3611,3532,3628,3617,3608,3595,3710,3655,3703,3686,3627,3602,3587,3580,3656,3643,3603,3619,3637,3620,3624,3602,3637,3728,3644,3622,3736,3700,3643,3681,3621,3690,3773,3641,3599,3648,3575,3652,3629,3746,3608,3666,3661,3711,3595,3598,3701,3598,3754,3641,3662,3684,3680,3722,3580,3683,3662,3647,3605,3652,3540,3652,3620,3721,3614,3666,3598,3713,3778,3692,3512,3635,3731,3663,3703,3646,3609,3632,3625,3736,3631,3656,3613,3667,3649,3655,3773,3636,3707,3751,3690,3585,3682,3642,3669,3630,3757,3684,3743,3644,3658,3684,3674,3587,3645,3583,3697,3630,3710,3713,3656,3592,3657,3738,3716,3605,3608,3634,3613,3616,3619,3551,3644,3679,3668,3662,3704,3661,3563,3711,3711,3747,3661,3723,3637,3673,3647,3696,3724,3717,3648,3640,3711,3658,3578,3667,3749,3616,3721,3699,3610,3543,3671,3667,3634,3589,3629,3623,3674,3641,3618,3636,3672,3733,3753,3671,3656,3739,3735,3664,3604,3629,3576,3625,3663,3595,3662,3649,3714,3623,3625,3654,3632,3682,3766,3654,3631,3593,3613,3673,3642,3744,3785,3673,3721,3645,3716,3730,3650,3603,3701,3574,3669,3606,3701,3622,3680,3670,3642,3649,3577,3733,3647,3642,3628,3599,3633,3656,3723,3650,3635,3630,3615,3645,3667,3637,3666,3666,3512,3543,3569,3621,3757,3622,3622,3579,3806,3738,3691,3641,3653,3789,3643,3648,3641,3683,3541,3649,3719,3687,3708,3704,3672,3738,3610,3738,3668,3658,3644,3599,3713,3636,3657,3722,3628,3659,3650,3629,3661,3668,3540,3813,3668,3597,3717,3695,3619,3600,3683,3585,3680,3601,3637,3735,3628,3713,3718,3741,3717,3564,3749,3739,3634,3819,3689,3659,3619,3693,3594,3637,3624,3682,3593,3712,3606,3660,3727,3757,3612,3663,3669,3594,3714,3581,3681,3694,3663,3678,3638,3565,3642,3643,3766,3657,3640,3612,3677,3678,3689,3607,3598,3752,3736,3654,3625,3592,3570,3677,3629,3734,3701,3646,3590,3711,3644,3696,3760,3755,3699,3678,3766,3693,3610,3652,3671,3601,3616,3577,3558,3553,3656,3641,3613,3735,3667,3638,3716,3684,3675,3710,3609,3615,3627,3747,3667,3626,3774,3737,3807,3607,3780,3745,3697,3666,3697,3652,3624,3664,3604,3660,3640,3744,3623,3672,3678,3592,3763,3672,3691,3668,3618,3549,3685,3589,3647,3770,3774,3635,3682,3603,3679,3588,3702,3651,3711,3713,3660,3717,3669,3638,3660,3606,3618,3760,3711,3684,3614,3619,3702,3678,3586,3687,3594,3594,3646,3709,3713,3647,3613,3702,3682,3684,3631,3590,3748,3736,3564,3642,3645,3706,3678,3677,3700,3589,3675,3705,3713,3690,3656,3548,3534,3823,3658,3602,3651,3791,3717,3692,3662,3600,3571,3621,3761,3737,3718,3560,3560,3711,3608,3716,3691,3565,3642,3719,3687,3784,3723,3680,3642,3636,3682,3778,3741,3595,3615,3608,3628,3668,3655,3679,3718,3659,3663,3628,3545,3712,3589,3634,3685,3666,3721,3757,3683,3682,3670,3677,3781,3671,3649,3605,3640,3614,3609,3701,3630,3666,3625,3729,3769,3639,3614,3645,3778,3673,3687,3683,3586,3558,3638,3699,3577,3671,3650,3702,3690,3609,3748,3498,3621,3694,3670,3637,3612,3646,3689,3658,3658,3647,3654,3735,3798,3729,3713,3708,3706,3562,3660,3664,3677,3626,3697,3611,3600,3841,3670,3661,3703,3631,3734,3783,3675,3688,3772,3694,3604,3643,3673,3627,3696,3705,3771,3677,3679,3619,3626,3753,3731,3697,3723,3544,3683,3620,3615,3713,3662,3551,3637,3635,3660,3703,3682,3680,3650,3618,3736,3667,3707,3577,3630,3737,3785,3727,3631,3627,3544,3677,3629,3656,3716,3525,3641,3590,3769,3672,3702,3720,3707,3635,3767,3693,3669,3771,3730,3647,3747,3694,3591,3704,3659,3644,3671,3607,3661,3596,3718,3673,3800,3614,3672,3728,3709,3652,3676,3637,3606,3598,3702,3741,3662,3575,3651,3623,3713,3696,3762,3652,3702,3655,3626,3654,3639,3716,3700,3636,3639,3662,3704,3717,3590,3669,3700,3616,3693,3708,3637,3598,3640,3678,3582,3544,3629,3660,3671,3642,3736,3722,3634,3759,3630,3624,3774,3652,3662,3665,3602,3676,3781,3704,3715,3659,3595,3586,3571,3626,3738,3698,3666,3656,3585,3661,3664,3690,3631,3733,3703,3728,3678,3636,3699,3659,3652,3685,3684,3605,3604,3697,3601,3734,3703,3738,3639,3649,3622,3651,3671,3639,3732,3645,3580,3566,3548,3683,3636,3600,3634,3635,3638,3637,3658,3604,3742,3700,3603,3481,3585,3713,3731,3824,3613,3624,3650,3673,3686,3777,3651,3697,3776,3611,3575,3717,3691,3649,3649,3683,3666,3606,3663,3679,3569,3702,3703,3683,3758,3624,3753,3700,3560,3594,3746,3660,3647,3611,3652,3671,3551,3599,3649,3774,3577,3700,3802,3598,3602,3768,3636,3626,3640,3733,3605,3722,3636,3670,3718,3754,3618,3577,3587,3633,3648,3621,3626,3696,3494,3626,3674,3603,3621,3742,3646,3637,3647,3616,3583,3654,3659,3723,3636,3718,3701,3670,3731,3723,3612,3691,3657,3663,3719,3656,3627,3629,3739,3678,3695,3693,3652,3730,3720,3609,3719,3613,3720,3655,3729,3661,3790,3643,3665,3587,3571,3715,3654,3581,3631,3614,3644,3721,3760,3637,3648,3681,3664,3699,3644,3599,3636,3551,3666,3658,3687,3726,3733,3604,3719,3614,3677,3672,3751,3635,3672,3630,3593,3695,3604,3511,3719,3757,3667,3626,3638,3674,3709,3649,3606,3649,3642,3712,3723,3688,3615,3594,3643,3622,3668,3774,3676,3715,3650,3606,3644,3608,3543,3670,3703,3638,3743,3679,3590,3581,3689,3744,3713,3674,3725,3627,3641,3566,3703,3673,3693,3643,3576,3697,3651,3748,3758,3669,3639,3659,3611,3617,3617,3630,3696,3707,3670,3647,3638,3676,3640,3674,3607,3680,3730,3708,3710,3790,3719,3648,3714,3676,3581,3732,3726,3571,3566,3660,3553,3766,3706,3595,3649,3638,3613,3738,3646,3602,3725,3636,3673,3727,3706,3739,3611,3633,3636,3684,3603,3574,3657,3609,3657,3700,3695,3659,3631,3699,3624,3716,3696,3637,3556,3599,3697,3678,3716,3664,3629,3640,3556,3557,3660,3682,3783,3573,3778,3570,3605,3651,3653,3660,3666,3590,3736,3829,3667,3616,3742,3634,3644,3592,3734,3550,3682,3727,3696,3687,3769,3581,3713,3726,3602,3554,3672,3612,3752,3585,3637,3588,3678,3722,3673,3722,3670,3692,3608,3748,3607,3628,3657,3657,3753,3619,3581,3641,3595,3687,3643,3571,3696,3731,3658,3607,3763,3576,3667,3699,3692,3658,3576,3624,3778,3683,3699,3663,3569,3565,3653,3599,3651,3591,3663,3707,3704,3720,3602,3691,3655,3588,3620,3672,3600,3642,3644,3763,3521,3605,3788,3596,3724,3601,3630,3684,3839,3634,3663,3667,3607,3669,3629,3760,3684,3687,3734,3642,3663,3710,3680,3597,3684,3538,3740,3695,3678,3715,3551,3518,3752,3700,3515,3635,3704,3541,3653,3613,3607,3685,3632,3514,3694,3636,3698,3753,3611,3621,3598,3734,3684,3677,3577,3592,3627,3674,3763,3575,3685,3674,3693,3734,3643,3720,3691,3722,3697,3656,3677,3674,3660,3656,3582,3728,3559,3640,3632,3743,3601,3736,3731,3650,3553,3666,3655,3651,3702,3759,3677,3578,3537,3671,3590,3615,3646,3621,3723,3747,3657,3616,3632,3671,3609,3559,3665,3585,3717,3632,3575,3619,3591,3714,3573,3582,3556,3827,3714,3640,3695,3646,3553,3710,3649,3771,3664,3542,3616,3590,3601,3642,3620,3667,3747,3665,3578,3674,3719,3659,3727]}]},"null_count":0,"tot_col_size":150000000,"last_update_version":401695327952568322},"c_nationkey":{"histogram":{"ndv":25,"buckets":[{"count":288000,"lower_bound":"MA==","upper_bound":"MA==","repeats":288000},{"count":591000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":303000},{"count":871500,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":280500},{"count":1177500,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":306000},{"count":1489500,"lower_bound":"NA==","upper_bound":"NA==","repeats":312000},{"count":1781250,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":291750},{"count":2077500,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":296250},{"count":2357250,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":279750},{"count":2638500,"lower_bound":"OA==","upper_bound":"OA==","repeats":281250},{"count":2947500,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":309000},{"count":3242250,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":294750},{"count":3527250,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":285000},{"count":3810000,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":282750},{"count":4129500,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":319500},{"count":4446000,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":316500},{"count":4756500,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":310500},{"count":5063250,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":306750},{"count":5380500,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":317250},{"count":5651250,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":270750},{"count":5958750,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":307500},{"count":6270750,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":312000},{"count":6572250,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":301500},{"count":6879000,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":306750},{"count":7198500,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":319500},{"count":7500000,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":301500}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299978,0,0,0,0,0,299706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300630,0,0,0,0,299915,0,0,0,0,0,299896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299502,0,0,0,300521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300128,0,0,0,0,0,0,0,0,0,0,0,300675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299915,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299978,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299257,0,0,0,0,300092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299588,0,0,0,0,0,0,0,0,0,0,300630,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300128,0,0,0,0,0,0,0,0,0,0,0,0,0,300054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,600145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300630,0,0,0,0,0,0,0,0,300128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299978,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299131,0,0,0,0,0,0,0,300521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299915,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300054,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300630,0,0,0,0,0,0,0,0,0,0,299863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299978,0,0,0,0,299915,0,0,0,0,0,0,0,0,0,0,0,300521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299368,0,299131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300092,0,0,0,0,0,0,0,0,0,299366,0,0,0,0,0,0,0,0,0,300888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,300888,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299366,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299994,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300675,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300364,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300521,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300054,0,0,0,0,299978,0,0,0,0,0,0,0,0,0,0,0,0,0,299896,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299588,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299863,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299502,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300092,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299257,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300304,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,299915,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,300630,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":15000000,"last_update_version":401695328004997122},"c_phone":{"histogram":{"ndv":7500000,"buckets":[{"count":30000,"lower_bound":"MTAtMTAxLTEzMy03MzM5","upper_bound":"MTAtMTkzLTM2NC02NjI4","repeats":1},{"count":60000,"lower_bound":"MTAtMTk3LTM5OS0xNjY4","upper_bound":"MTAtMjgwLTQ3Ny03ODY1","repeats":1},{"count":90000,"lower_bound":"MTAtMjgzLTgxMC0xNzc1","upper_bound":"MTAtMzY3LTcyNS02NDQ1","repeats":1},{"count":120000,"lower_bound":"MTAtMzY3LTgxOC0yODAy","upper_bound":"MTAtNDM5LTU4Ny0yNzY2","repeats":1},{"count":150000,"lower_bound":"MTAtNDQwLTE5Mi02ODU1","upper_bound":"MTAtNTQ4LTU5Mi03MTA4","repeats":1},{"count":180000,"lower_bound":"MTAtNTQ5LTQzMS02MTUy","upper_bound":"MTAtNjM5LTcyNi04MjI2","repeats":1},{"count":210000,"lower_bound":"MTAtNjQxLTIwMy05ODg1","upper_bound":"MTAtNzA4LTM2NS00NzA5","repeats":1},{"count":240000,"lower_bound":"MTAtNzA5LTQ1MS00MDEz","upper_bound":"MTAtODAxLTU2MC0zNDI5","repeats":1},{"count":270000,"lower_bound":"MTAtODAyLTQ5Ny0zNDY5","upper_bound":"MTAtOTA4LTUzOC0yNjA1","repeats":1},{"count":300000,"lower_bound":"MTAtOTA5LTU3OC00NDcx","upper_bound":"MTAtOTc4LTcyNy00NzYz","repeats":1},{"count":330000,"lower_bound":"MTAtOTc5LTE0MS00NDIz","upper_bound":"MTEtMTY0LTU2NC0xMzg4","repeats":1},{"count":360000,"lower_bound":"MTEtMTY0LTk0NS01NjA1","upper_bound":"MTEtMjU4LTYzNi04OTIx","repeats":1},{"count":390000,"lower_bound":"MTEtMjYwLTI3NC04MDgw","upper_bound":"MTEtMzYyLTY1Mi05NTU0","repeats":1},{"count":420000,"lower_bound":"MTEtMzYyLTgwNy00MjU3","upper_bound":"MTEtNDM4LTMzOS0zMzM3","repeats":1},{"count":450000,"lower_bound":"MTEtNDM4LTM5Ny01MjE3","upper_bound":"MTEtNTMxLTg5MS0yNzc2","repeats":1},{"count":480000,"lower_bound":"MTEtNTM3LTYwNi05MjU3","upper_bound":"MTEtNjMyLTg3Ni00NzE5","repeats":1},{"count":510000,"lower_bound":"MTEtNjM0LTI2NS01NjI5","upper_bound":"MTEtNzA4LTEzOC03NzA0","repeats":1},{"count":540000,"lower_bound":"MTEtNzA4LTY4Mi03NzY5","upper_bound":"MTEtNzgxLTExOS03NjU4","repeats":1},{"count":570000,"lower_bound":"MTEtNzgyLTI0OC0zNzUy","upper_bound":"MTEtODcxLTY4Ny03NDY5","repeats":1},{"count":600000,"lower_bound":"MTEtODc0LTQwNy00ODU4","upper_bound":"MTEtOTU3LTU3NS05ODY0","repeats":1},{"count":630000,"lower_bound":"MTEtOTU5LTEwNy0zMzQ0","upper_bound":"MTItMTI3LTY0OC02NDQ5","repeats":1},{"count":660000,"lower_bound":"MTItMTI3LTc3Mi03Njkw","upper_bound":"MTItMjI4LTE3My0zOTQ4","repeats":1},{"count":690000,"lower_bound":"MTItMjMwLTE3My04NzY3","upper_bound":"MTItMzI2LTgyNC01OTAz","repeats":1},{"count":720000,"lower_bound":"MTItMzI4LTUwMS0yOTIy","upper_bound":"MTItNDA0LTIwMS02NjY5","repeats":1},{"count":750000,"lower_bound":"MTItNDA5LTY3MS0xMDU2","upper_bound":"MTItNTA3LTE4Ny03NTgz","repeats":1},{"count":780000,"lower_bound":"MTItNTA3LTY4NS04OTI4","upper_bound":"MTItNjA4LTI0Mi0xMTU4","repeats":1},{"count":810000,"lower_bound":"MTItNjEwLTYyMS00Mjg2","upper_bound":"MTItNjkzLTY4NS05MTQ4","repeats":1},{"count":840000,"lower_bound":"MTItNjkzLTg4MS02MTc0","upper_bound":"MTItNzg2LTY5NC02ODk2","repeats":1},{"count":870000,"lower_bound":"MTItNzg3LTI5MS0zOTQ2","upper_bound":"MTItODYwLTE3NS0yMTA3","repeats":1},{"count":900000,"lower_bound":"MTItODYwLTMwMC03Njcx","upper_bound":"MTItOTIzLTk1NC03MjI0","repeats":1},{"count":930000,"lower_bound":"MTItOTI0LTEyNC0zNzM0","upper_bound":"MTMtMTI2LTcxMy00MTcx","repeats":1},{"count":960000,"lower_bound":"MTMtMTI5LTkxMS01OTQ1","upper_bound":"MTMtMjEzLTU4OS0yNjYz","repeats":1},{"count":990000,"lower_bound":"MTMtMjE3LTE1Ny0zNjU0","upper_bound":"MTMtMzA1LTM5Ni02NDMz","repeats":1},{"count":1020000,"lower_bound":"MTMtMzA2LTE1OS01Mjgz","upper_bound":"MTMtNDAwLTc5My04MDAw","repeats":1},{"count":1050000,"lower_bound":"MTMtNDAxLTQxMS04MTAz","upper_bound":"MTMtNDc0LTIwMC04MDM4","repeats":1},{"count":1080000,"lower_bound":"MTMtNDc0LTY1Ny0yMjIz","upper_bound":"MTMtNTQ3LTI1My0zMzIx","repeats":1},{"count":1110000,"lower_bound":"MTMtNTQ3LTc3Ni04NjY0","upper_bound":"MTMtNjEzLTUzMy00MjM2","repeats":1},{"count":1140000,"lower_bound":"MTMtNjE1LTg3NC00MDU2","upper_bound":"MTMtNzA0LTkyNi00ODIx","repeats":1},{"count":1170000,"lower_bound":"MTMtNzA5LTUyNi00NzY0","upper_bound":"MTMtNzg2LTMzOS04ODAy","repeats":1},{"count":1200000,"lower_bound":"MTMtNzkwLTg4My01MzEw","upper_bound":"MTMtODcxLTIzNy03MTQx","repeats":1},{"count":1230000,"lower_bound":"MTMtODcyLTgzMC0xMTA2","upper_bound":"MTMtOTY2LTcwMi02NDYw","repeats":1},{"count":1260000,"lower_bound":"MTMtOTY5LTcyMC02NjEw","upper_bound":"MTQtMTYwLTgwNi0xODQ4","repeats":1},{"count":1290000,"lower_bound":"MTQtMTYyLTQ1My01OTY0","upper_bound":"MTQtMjMyLTUzNy04NjMz","repeats":1},{"count":1320000,"lower_bound":"MTQtMjM0LTIzMC0xNTQw","upper_bound":"MTQtMzE4LTMyOS0zMTQ0","repeats":1},{"count":1350000,"lower_bound":"MTQtMzE5LTU0OC00NjY0","upper_bound":"MTQtNDEwLTk1OS03MjMy","repeats":1},{"count":1380000,"lower_bound":"MTQtNDExLTczNi0xMDU2","upper_bound":"MTQtNTAyLTM0NS00ODYx","repeats":1},{"count":1410000,"lower_bound":"MTQtNTAyLTQxMy05MjE3","upper_bound":"MTQtNTkxLTQ2OS0xMTU1","repeats":1},{"count":1440000,"lower_bound":"MTQtNTkxLTgxNS01NzAz","upper_bound":"MTQtNjc1LTE5OC0yMTAy","repeats":1},{"count":1470000,"lower_bound":"MTQtNjc1LTY3NS01NzU3","upper_bound":"MTQtNzYzLTkyNS02MzM0","repeats":1},{"count":1500000,"lower_bound":"MTQtNzY5LTQxMC05Mjc1","upper_bound":"MTQtODY1LTc4OS04MTM0","repeats":1},{"count":1530000,"lower_bound":"MTQtODY3LTQ0My02OTc3","upper_bound":"MTQtOTY2LTEwNC03NjEy","repeats":1},{"count":1560000,"lower_bound":"MTQtOTY3LTc3OS02Mzcw","upper_bound":"MTUtMTgyLTE1Mi02MTUy","repeats":1},{"count":1590000,"lower_bound":"MTUtMTgyLTI1My01ODUz","upper_bound":"MTUtMjg5LTU5Mi04ODE3","repeats":1},{"count":1620000,"lower_bound":"MTUtMjkwLTU0Mi02NTU3","upper_bound":"MTUtMzg0LTk0MS00MzYx","repeats":1},{"count":1650000,"lower_bound":"MTUtMzg1LTY3NS0zNDQ2","upper_bound":"MTUtNDU1LTM0OS0xOTkz","repeats":1},{"count":1680000,"lower_bound":"MTUtNDU2LTM5NC02NTQ0","upper_bound":"MTUtNTUzLTE1My0xODMw","repeats":1},{"count":1710000,"lower_bound":"MTUtNTY0LTMzMi03NzE3","upper_bound":"MTUtNjQ4LTM3OS0yODA4","repeats":1},{"count":1740000,"lower_bound":"MTUtNjQ4LTUwNC0xMzg0","upper_bound":"MTUtNzYwLTQ0Mi04NDI2","repeats":1},{"count":1770000,"lower_bound":"MTUtNzYxLTg1Ni04MTQz","upper_bound":"MTUtODU4LTg3MC04MjU3","repeats":1},{"count":1800000,"lower_bound":"MTUtODU5LTgwOS03NDI4","upper_bound":"MTUtOTQ3LTYzMi03NDc5","repeats":1},{"count":1830000,"lower_bound":"MTUtOTUwLTk5OS02MDYy","upper_bound":"MTYtMTQ5LTQwNC01NTMz","repeats":1},{"count":1860000,"lower_bound":"MTYtMTUwLTY3My00NjY1","upper_bound":"MTYtMjQwLTY1Mi05Nzk5","repeats":1},{"count":1890000,"lower_bound":"MTYtMjQ1LTU0Mi0yNTU1","upper_bound":"MTYtMzI3LTc0OS0yNDk3","repeats":1},{"count":1920000,"lower_bound":"MTYtMzI5LTUzMS02MzM2","upper_bound":"MTYtNDI5LTIxNC05MDgx","repeats":1},{"count":1950000,"lower_bound":"MTYtNDI5LTg0Ni0yODc1","upper_bound":"MTYtNTAyLTU5OC0zMDU1","repeats":1},{"count":1980000,"lower_bound":"MTYtNTAzLTYwNi05Mjkz","upper_bound":"MTYtNjI1LTI3MC04OTI2","repeats":1},{"count":2010000,"lower_bound":"MTYtNjMwLTI3NC04NzY1","upper_bound":"MTYtNzIyLTY2OC0yMjc3","repeats":1},{"count":2040000,"lower_bound":"MTYtNzIzLTQ0NS00NzE2","upper_bound":"MTYtODA4LTMwOC0yNDcz","repeats":1},{"count":2070000,"lower_bound":"MTYtODA4LTc5My0xOTI4","upper_bound":"MTYtODg0LTgxNi0xMjY1","repeats":1},{"count":2100000,"lower_bound":"MTYtODg4LTQ5My0yOTU5","upper_bound":"MTYtOTY3LTI4My00MDQx","repeats":1},{"count":2130000,"lower_bound":"MTYtOTcyLTM4Ny0xMDI1","upper_bound":"MTctMTY5LTU5My0yMDE1","repeats":1},{"count":2160000,"lower_bound":"MTctMTcyLTk4NC0yMTQw","upper_bound":"MTctMjQ5LTYyOC0yNTI1","repeats":1},{"count":2190000,"lower_bound":"MTctMjUwLTM3NS00MTcx","upper_bound":"MTctMzQ1LTcyOC0zODgz","repeats":1},{"count":2220000,"lower_bound":"MTctMzQ2LTkzMC00NzY1","upper_bound":"MTctNDE3LTE3Mi03ODE0","repeats":1},{"count":2250000,"lower_bound":"MTctNDE4LTY4MS05MTEw","upper_bound":"MTctNDkwLTQ2MC02MzE0","repeats":1},{"count":2280000,"lower_bound":"MTctNDkwLTUyMS0xOTYz","upper_bound":"MTctNTYwLTM5Mi0yOTg2","repeats":1},{"count":2310000,"lower_bound":"MTctNTYxLTU2OC0zNTIx","upper_bound":"MTctNjQ2LTcyMS02ODcz","repeats":1},{"count":2340000,"lower_bound":"MTctNjQ4LTYzNy01NDg1","upper_bound":"MTctNzQ2LTEzMC0xMTU0","repeats":1},{"count":2370000,"lower_bound":"MTctNzQ5LTg3Ny02NzQ4","upper_bound":"MTctODQ5LTgzNS04ODE2","repeats":1},{"count":2400000,"lower_bound":"MTctODUwLTE4Mi01NDY0","upper_bound":"MTctOTQzLTc3MC0yOTg5","repeats":1},{"count":2430000,"lower_bound":"MTctOTQ4LTkzMS02ODcz","upper_bound":"MTgtMTQ0LTk4OC0xOTg0","repeats":1},{"count":2460000,"lower_bound":"MTgtMTQ1LTQzMi04MzU1","upper_bound":"MTgtMjQ1LTI3NS01NDY0","repeats":1},{"count":2490000,"lower_bound":"MTgtMjQ2LTIxOC01ODM3","upper_bound":"MTgtMzMxLTI3OS0xMTIy","repeats":1},{"count":2520000,"lower_bound":"MTgtMzMyLTIwOC0yMjEz","upper_bound":"MTgtNDEwLTM5MC00MTM5","repeats":1},{"count":2550000,"lower_bound":"MTgtNDExLTM5MS01ODUw","upper_bound":"MTgtNDk5LTM3Ny00NDQ1","repeats":1},{"count":2580000,"lower_bound":"MTgtNTA0LTMxNi0zNTQx","upper_bound":"MTgtNTk5LTUwMC0xNjkz","repeats":1},{"count":2610000,"lower_bound":"MTgtNjA3LTQ3Ni04NDI1","upper_bound":"MTgtNjg5LTU0Ni0zMDgw","repeats":1},{"count":2640000,"lower_bound":"MTgtNjk0LTY2OS0zNDE2","upper_bound":"MTgtNzU5LTg2NS00MjQ0","repeats":1},{"count":2670000,"lower_bound":"MTgtNzYwLTIyNy0yMTE1","upper_bound":"MTgtODQ3LTE2NS0xOTkx","repeats":1},{"count":2700000,"lower_bound":"MTgtODUyLTU4OC01ODE0","upper_bound":"MTgtOTI1LTI4Ni03NTQw","repeats":1},{"count":2730000,"lower_bound":"MTgtOTMxLTE0MS04Njcy","upper_bound":"MTktMTIwLTM2OC04NzAz","repeats":1},{"count":2760000,"lower_bound":"MTktMTIzLTI1Ni00MDcx","upper_bound":"MTktMjEzLTE5Ni0yODU5","repeats":1},{"count":2790000,"lower_bound":"MTktMjEzLTYzMi02MjQz","upper_bound":"MTktMjc4LTE5OC00NDY1","repeats":1},{"count":2820000,"lower_bound":"MTktMjc5LTU5OS00MDE2","upper_bound":"MTktMzU2LTcyMC00MjYx","repeats":1},{"count":2850000,"lower_bound":"MTktMzU4LTI1Ni0zNzA3","upper_bound":"MTktNDgyLTU2Ny0zNzc1","repeats":1},{"count":2880000,"lower_bound":"MTktNDgyLTc5NC0zMjQ4","upper_bound":"MTktNTkwLTQ2My03MTg2","repeats":1},{"count":2910000,"lower_bound":"MTktNTkyLTMwNy05MjI4","upper_bound":"MTktNjY3LTM4OS0yNTMx","repeats":1},{"count":2940000,"lower_bound":"MTktNjY3LTg4MS0xMzYy","upper_bound":"MTktNzg2LTI4MC01NDk1","repeats":1},{"count":2970000,"lower_bound":"MTktNzg3LTkwMC0xMzc1","upper_bound":"MTktODcwLTkxOC04NDg3","repeats":1},{"count":3000000,"lower_bound":"MTktODcxLTc4OS01NDAx","upper_bound":"MTktOTcyLTk0Ni01NDY1","repeats":1},{"count":3030000,"lower_bound":"MTktOTczLTMxOS05NzE5","upper_bound":"MjAtMTY1LTUxOC01MDkx","repeats":1},{"count":3060000,"lower_bound":"MjAtMTY3LTQyMC03ODcz","upper_bound":"MjAtMjMyLTQwOS0zNDc5","repeats":1},{"count":3090000,"lower_bound":"MjAtMjMzLTMzNy01MzEx","upper_bound":"MjAtMzM2LTc4Ni03Nzc0","repeats":1},{"count":3120000,"lower_bound":"MjAtMzM3LTE0Ni04OTIz","upper_bound":"MjAtNDMzLTgwOC0yNDE2","repeats":1},{"count":3150000,"lower_bound":"MjAtNDM0LTM0OC05MzUz","upper_bound":"MjAtNTA4LTE3Ni0zMzA4","repeats":1},{"count":3180000,"lower_bound":"MjAtNTA4LTQ2MC03MTU4","upper_bound":"MjAtNTk3LTk4NS04MDgy","repeats":1},{"count":3210000,"lower_bound":"MjAtNTk5LTEwNi03MDgx","upper_bound":"MjAtNzA1LTE0My03MTU1","repeats":1},{"count":3240000,"lower_bound":"MjAtNzA2LTM4My00NjEx","upper_bound":"MjAtNzk1LTMzMy03MTQ2","repeats":1},{"count":3270000,"lower_bound":"MjAtNzk1LTM3OS0yNjU2","upper_bound":"MjAtODg3LTcxNS05NzA1","repeats":1},{"count":3300000,"lower_bound":"MjAtODg5LTMyOS04ODc2","upper_bound":"MjAtOTk3LTk4My0zMDQ1","repeats":1},{"count":3330000,"lower_bound":"MjEtMTAwLTU0Ny02MjE4","upper_bound":"MjEtMTc3LTgyOS0xMDEy","repeats":1},{"count":3360000,"lower_bound":"MjEtMTgwLTY3OC00NzM5","upper_bound":"MjEtMjc4LTkyNC0yNTMy","repeats":1},{"count":3390000,"lower_bound":"MjEtMjgwLTI2Mi0yMjM5","upper_bound":"MjEtMzgzLTExNC02NDgx","repeats":1},{"count":3420000,"lower_bound":"MjEtMzg0LTI3OC0xODYw","upper_bound":"MjEtNDQ2LTk2NC00NDE4","repeats":1},{"count":3450000,"lower_bound":"MjEtNDU0LTExMy03OTQ5","upper_bound":"MjEtNTE5LTcwMi0xOTA2","repeats":1},{"count":3480000,"lower_bound":"MjEtNTIzLTE3NS05Mzkx","upper_bound":"MjEtNTg5LTkyNS01NDg0","repeats":1},{"count":3510000,"lower_bound":"MjEtNTk2LTQ5NS0yMDM2","upper_bound":"MjEtNjc3LTY1NC0zNjQ0","repeats":1},{"count":3540000,"lower_bound":"MjEtNjc5LTU2Ni0yMDk2","upper_bound":"MjEtNzQxLTI5Ni05MDIz","repeats":1},{"count":3570000,"lower_bound":"MjEtNzQyLTI0Ny00MDM3","upper_bound":"MjEtODI3LTgwOS03MzYw","repeats":1},{"count":3600000,"lower_bound":"MjEtODI3LTg0Ni05MjEx","upper_bound":"MjEtODg4LTU5OS04ODk1","repeats":1},{"count":3630000,"lower_bound":"MjEtODg5LTc3OC05NzE3","upper_bound":"MjEtOTc3LTkzNi03Mzkx","repeats":1},{"count":3660000,"lower_bound":"MjEtOTgxLTQ2NC02ODI4","upper_bound":"MjItMTczLTc4Ni05Mzg5","repeats":1},{"count":3690000,"lower_bound":"MjItMTc5LTgyMC02NzM3","upper_bound":"MjItMjY5LTk0OC04NDgw","repeats":1},{"count":3720000,"lower_bound":"MjItMjcwLTIzNi02MDcy","upper_bound":"MjItMzY4LTI2MC0zODI0","repeats":1},{"count":3750000,"lower_bound":"MjItMzY5LTMyOC0zMzEz","upper_bound":"MjItNDUyLTc1NS02NDMy","repeats":1},{"count":3780000,"lower_bound":"MjItNDU5LTQwOS02NTA3","upper_bound":"MjItNTUwLTUzNS00OTM5","repeats":1},{"count":3810000,"lower_bound":"MjItNTUxLTEwMS03MjE4","upper_bound":"MjItNjM4LTg1OC03MTY1","repeats":1},{"count":3840000,"lower_bound":"MjItNjQwLTUwMy02NjQz","upper_bound":"MjItNzI5LTEwMy04OTE4","repeats":1},{"count":3870000,"lower_bound":"MjItNzMwLTI5My03NTUz","upper_bound":"MjItODIwLTI0Mi05MzI3","repeats":1},{"count":3900000,"lower_bound":"MjItODIxLTQ5OC03OTY1","upper_bound":"MjItOTA2LTM0Mi00OTUz","repeats":1},{"count":3930000,"lower_bound":"MjItOTA2LTQzOC05OTcw","upper_bound":"MjMtMTI0LTU2Ni0zNTI5","repeats":1},{"count":3960000,"lower_bound":"MjMtMTI1LTE5Ny0zNDg1","upper_bound":"MjMtMTgzLTIzNy04NzA2","repeats":1},{"count":3990000,"lower_bound":"MjMtMTgzLTM3My0yNDU0","upper_bound":"MjMtMjY0LTg5Ny03NzI2","repeats":1},{"count":4020000,"lower_bound":"MjMtMjY3LTUwOC00Mzk3","upper_bound":"MjMtMzYxLTY5My03NDQ0","repeats":1},{"count":4050000,"lower_bound":"MjMtMzYyLTQwNi05MTM5","upper_bound":"MjMtNDUwLTQ5NS05Mjkx","repeats":1},{"count":4080000,"lower_bound":"MjMtNDUwLTg5OS00NzM2","upper_bound":"MjMtNTQ1LTc1MS01ODM5","repeats":1},{"count":4110000,"lower_bound":"MjMtNTQ1LTkxNC0yMjMw","upper_bound":"MjMtNjQwLTUxNy03ODY1","repeats":1},{"count":4140000,"lower_bound":"MjMtNjQxLTg4Mi0xMDcz","upper_bound":"MjMtNzQyLTg1OC00MDc3","repeats":1},{"count":4170000,"lower_bound":"MjMtNzQ0LTQ2OC02NDk4","upper_bound":"MjMtODMxLTYxNi04NDE4","repeats":1},{"count":4200000,"lower_bound":"MjMtODMyLTIwOC0xOTU2","upper_bound":"MjMtOTE0LTQyNy00NjQ1","repeats":1},{"count":4230000,"lower_bound":"MjMtOTE0LTg0OS0zOTI2","upper_bound":"MjMtOTk3LTMwOS01MDI5","repeats":1},{"count":4260000,"lower_bound":"MjMtOTk3LTMxNi0zNjY1","upper_bound":"MjQtMTgyLTg5NC05NDY1","repeats":1},{"count":4290000,"lower_bound":"MjQtMTg0LTM5NS0yMjI2","upper_bound":"MjQtMjk1LTg4MS03MDQy","repeats":1},{"count":4320000,"lower_bound":"MjQtMzAwLTM4MC0xMDM4","upper_bound":"MjQtMzc2LTQ2OC01MTU1","repeats":1},{"count":4350000,"lower_bound":"MjQtMzc3LTI5Ny0yNTM5","upper_bound":"MjQtNDY5LTYwMy0xODA4","repeats":1},{"count":4380000,"lower_bound":"MjQtNDc0LTE3Ni05NTc1","upper_bound":"MjQtNTY5LTI4MC00MjY0","repeats":1},{"count":4410000,"lower_bound":"MjQtNTcxLTM4Ny0zODk0","upper_bound":"MjQtNjQxLTQ2Mi0zNzAy","repeats":1},{"count":4440000,"lower_bound":"MjQtNjQ4LTQwOC03NzYz","upper_bound":"MjQtNzI4LTU2MC0zNTYy","repeats":1},{"count":4470000,"lower_bound":"MjQtNzI5LTU4OC04NjI5","upper_bound":"MjQtODExLTc4OC02NTQx","repeats":1},{"count":4500000,"lower_bound":"MjQtODEzLTYxMi00Njkw","upper_bound":"MjQtODk0LTkxNy03Njk2","repeats":1},{"count":4530000,"lower_bound":"MjQtODk1LTcyNS02ODQ4","upper_bound":"MjQtOTg3LTEwNy05MzM4","repeats":1},{"count":4560000,"lower_bound":"MjQtOTg5LTMxNC02ODU2","upper_bound":"MjUtMTg3LTY5Ny03MzEw","repeats":1},{"count":4590000,"lower_bound":"MjUtMTg4LTY1NC02Mjgx","upper_bound":"MjUtMjcxLTQxMC0xNDAw","repeats":1},{"count":4620000,"lower_bound":"MjUtMjcyLTQ2Mi02MjU1","upper_bound":"MjUtMzY1LTk4NC00MzMy","repeats":1},{"count":4650000,"lower_bound":"MjUtMzY2LTU0Ny05NTg5","upper_bound":"MjUtNDQ1LTY2Ny02NDY1","repeats":1},{"count":4680000,"lower_bound":"MjUtNDQ3LTcyNy04MDE1","upper_bound":"MjUtNTU1LTY1NC0xMTkz","repeats":1},{"count":4710000,"lower_bound":"MjUtNTU1LTgwMy00NzYz","upper_bound":"MjUtNjM4LTUzMS01MjUz","repeats":1},{"count":4740000,"lower_bound":"MjUtNjQyLTQ5MS0xNDQw","upper_bound":"MjUtNzMwLTczOC0xMjg4","repeats":1},{"count":4770000,"lower_bound":"MjUtNzMxLTExMS00NjQy","upper_bound":"MjUtODI4LTg2MC04MjIy","repeats":1},{"count":4800000,"lower_bound":"MjUtODMwLTIzMS0zNzU4","upper_bound":"MjUtOTAxLTY2NS05NDk0","repeats":1},{"count":4830000,"lower_bound":"MjUtOTA0LTczMS02OTM5","upper_bound":"MjYtMTExLTY5Ny03MDIw","repeats":1},{"count":4860000,"lower_bound":"MjYtMTExLTc4Mi0zNTg0","upper_bound":"MjYtMjE2LTUyNy0zOTU1","repeats":1},{"count":4890000,"lower_bound":"MjYtMjE3LTMyNS02Mzk1","upper_bound":"MjYtMjk5LTU1OC04Nzk0","repeats":1},{"count":4920000,"lower_bound":"MjYtMzAzLTEzMy0yOTE0","upper_bound":"MjYtMzk1LTUzMi00MjAz","repeats":1},{"count":4950000,"lower_bound":"MjYtMzk4LTUyMS0xMjUz","upper_bound":"MjYtNDcxLTkyMC03Nzg4","repeats":1},{"count":4980000,"lower_bound":"MjYtNDcyLTUwNC05NDY1","upper_bound":"MjYtNTYxLTUxOS01NzU1","repeats":1},{"count":5010000,"lower_bound":"MjYtNTYzLTEyOS00NDUy","upper_bound":"MjYtNjQyLTUwMS0xODQ2","repeats":1},{"count":5040000,"lower_bound":"MjYtNjQ0LTc5MS05NjIw","upper_bound":"MjYtNzM3LTc1MC0zNTgx","repeats":1},{"count":5070000,"lower_bound":"MjYtNzQwLTk3My03NzEz","upper_bound":"MjYtODA5LTQ3My00MTI4","repeats":1},{"count":5100000,"lower_bound":"MjYtODExLTI5Mi01MTI0","upper_bound":"MjYtODkxLTQ1OC03MzUy","repeats":1},{"count":5130000,"lower_bound":"MjYtODkyLTcxNC01ODQ2","upper_bound":"MjYtOTcyLTYxOC05MzE2","repeats":1},{"count":5160000,"lower_bound":"MjYtOTc2LTgyMi03NzEz","upper_bound":"MjctMTY3LTc1OC03MTY4","repeats":1},{"count":5190000,"lower_bound":"MjctMTczLTMwOS0zMzkz","upper_bound":"MjctMjY1LTg1Mi0zNzU2","repeats":1},{"count":5220000,"lower_bound":"MjctMjY3LTIzNS04ODQz","upper_bound":"MjctMzUzLTgxNC0zMzc2","repeats":1},{"count":5250000,"lower_bound":"MjctMzU3LTg1Ny01NDgy","upper_bound":"MjctNDMxLTY1MS01OTE4","repeats":1},{"count":5280000,"lower_bound":"MjctNDM2LTE3MS04Mzg2","upper_bound":"MjctNTIzLTU1Mi0xODIz","repeats":1},{"count":5310000,"lower_bound":"MjctNTI0LTM4OS02NjU3","upper_bound":"MjctNTkxLTgyMS02NDA3","repeats":1},{"count":5340000,"lower_bound":"MjctNjAxLTY1OS02NjA4","upper_bound":"MjctNjk3LTEyNi0yODc2","repeats":1},{"count":5370000,"lower_bound":"MjctNjk3LTMyMy0zODk4","upper_bound":"MjctNzc2LTYwNy04NzE4","repeats":1},{"count":5400000,"lower_bound":"MjctNzc4LTYxNy03NzY3","upper_bound":"MjctODg3LTk1OS05NzYx","repeats":1},{"count":5430000,"lower_bound":"MjctODg4LTYyNi04MDMw","upper_bound":"MjctOTkzLTUyMS02MDk0","repeats":1},{"count":5460000,"lower_bound":"MjctOTk3LTU1NC00NDcy","upper_bound":"MjgtMjAyLTE3Ny00NzI5","repeats":1},{"count":5490000,"lower_bound":"MjgtMjA0LTg0My03NjU4","upper_bound":"MjgtMjg4LTE1MS01MDg3","repeats":1},{"count":5520000,"lower_bound":"MjgtMjg4LTM2Ni04ODkw","upper_bound":"MjgtMzcxLTExOC00NDkw","repeats":1},{"count":5550000,"lower_bound":"MjgtMzcxLTM0MS03NDU2","upper_bound":"MjgtNTAyLTk4Ny0zOTU0","repeats":1},{"count":5580000,"lower_bound":"MjgtNTA0LTE3Ny00MjEz","upper_bound":"MjgtNjE3LTk0MS0yNTMy","repeats":1},{"count":5610000,"lower_bound":"MjgtNjE4LTIyNy0yNTQ0","upper_bound":"MjgtNzExLTkxMS0yODc1","repeats":1},{"count":5640000,"lower_bound":"MjgtNzEyLTM5Mi02OTA2","upper_bound":"MjgtNzgxLTE0Mi0yMjk2","repeats":1},{"count":5670000,"lower_bound":"MjgtNzgyLTc4NC02ODgw","upper_bound":"MjgtODYxLTcxNS00MTIz","repeats":1},{"count":5700000,"lower_bound":"MjgtODYyLTc1OC0yNDI1","upper_bound":"MjgtOTQ5LTQzOS0zODQ3","repeats":1},{"count":5730000,"lower_bound":"MjgtOTUxLTE2My05NDU2","upper_bound":"MjktMTUzLTQ1NS02MTc4","repeats":1},{"count":5760000,"lower_bound":"MjktMTU1LTUyMy04NTMz","upper_bound":"MjktMjY4LTIzNC0xMjUx","repeats":1},{"count":5790000,"lower_bound":"MjktMjY4LTYxMy05NTE4","upper_bound":"MjktMzUxLTEyOS0xODE2","repeats":1},{"count":5820000,"lower_bound":"MjktMzUzLTM5NS0yNjE0","upper_bound":"MjktNDIzLTQ4OS05NzUy","repeats":1},{"count":5850000,"lower_bound":"MjktNDI0LTY2OS00MjI5","upper_bound":"MjktNTA3LTExNC0yNzgy","repeats":1},{"count":5880000,"lower_bound":"MjktNTA3LTIzMS01MzAz","upper_bound":"MjktNTk1LTQ5NS0xMzU0","repeats":1},{"count":5910000,"lower_bound":"MjktNTk4LTYzNS0xMzQ2","upper_bound":"MjktNjY5LTE4OS02NzEw","repeats":1},{"count":5940000,"lower_bound":"MjktNjY5LTY1Ni0yMzAy","upper_bound":"MjktNzYzLTY5My03Mjg0","repeats":1},{"count":5970000,"lower_bound":"MjktNzY3LTczMi02NjY0","upper_bound":"MjktODYzLTIxMi01NTgw","repeats":1},{"count":6000000,"lower_bound":"MjktODY3LTQwNy01MTY4","upper_bound":"MjktOTc3LTIzMi0yNTA3","repeats":1},{"count":6030000,"lower_bound":"MjktOTc5LTY1Mi0zMTEx","upper_bound":"MzAtMTQ0LTQ4NC0zNDAx","repeats":1},{"count":6060000,"lower_bound":"MzAtMTQ3LTMyNi0yMTg4","upper_bound":"MzAtMjMzLTk5Ny0yMzMz","repeats":1},{"count":6090000,"lower_bound":"MzAtMjM3LTk1NS03NDc2","upper_bound":"MzAtMzI3LTI2NC0zNjQz","repeats":1},{"count":6120000,"lower_bound":"MzAtMzI4LTQ3My05NTc3","upper_bound":"MzAtNDE5LTE4NS05ODc1","repeats":1},{"count":6150000,"lower_bound":"MzAtNDE5LTM4Ny0yNTg0","upper_bound":"MzAtNTI5LTU0OS02OTYy","repeats":1},{"count":6180000,"lower_bound":"MzAtNTMyLTQ4MC03MDA5","upper_bound":"MzAtNjE1LTcwNy0zNzEy","repeats":1},{"count":6210000,"lower_bound":"MzAtNjE3LTY1NC04MjM2","upper_bound":"MzAtNjkxLTE2Ni01NzY1","repeats":1},{"count":6240000,"lower_bound":"MzAtNjkxLTkxOC04OTk5","upper_bound":"MzAtNzgwLTUyMS05ODk0","repeats":1},{"count":6270000,"lower_bound":"MzAtNzgwLTczNi00NDY3","upper_bound":"MzAtODYzLTIxMS0yOTcw","repeats":1},{"count":6300000,"lower_bound":"MzAtODY0LTcxNi0zMTM0","upper_bound":"MzAtOTM3LTk4Ni05NTk0","repeats":1},{"count":6330000,"lower_bound":"MzAtOTM4LTI5NS00MDA1","upper_bound":"MzEtMTAyLTkwNi04MzYy","repeats":1},{"count":6360000,"lower_bound":"MzEtMTAzLTM4OS05ODgz","upper_bound":"MzEtMTg1LTYzNy00MTc3","repeats":1},{"count":6390000,"lower_bound":"MzEtMTg2LTYwNS03NTQ3","upper_bound":"MzEtMjk2LTg3Ny05NjQ5","repeats":1},{"count":6420000,"lower_bound":"MzEtMjk3LTcyMC04Njgy","upper_bound":"MzEtMzg4LTgzNS02MTA3","repeats":1},{"count":6450000,"lower_bound":"MzEtMzkwLTkwMC00ODk0","upper_bound":"MzEtNDkyLTI1OS0zNDQ1","repeats":1},{"count":6480000,"lower_bound":"MzEtNDk0LTk2My0xNTk1","upper_bound":"MzEtNTk1LTIyOC02Njg2","repeats":1},{"count":6510000,"lower_bound":"MzEtNTk2LTM0MC01Njk0","upper_bound":"MzEtNjczLTE1MS02OTY0","repeats":1},{"count":6540000,"lower_bound":"MzEtNjc0LTk0Ny04NDE2","upper_bound":"MzEtNzQ4LTE3NC0zMTA3","repeats":1},{"count":6570000,"lower_bound":"MzEtNzQ5LTI1NS01ODE2","upper_bound":"MzEtODIxLTYwMC0xNDc1","repeats":1},{"count":6600000,"lower_bound":"MzEtODIzLTE5Ni03NzY2","upper_bound":"MzEtOTA5LTI3My00NTcz","repeats":1},{"count":6630000,"lower_bound":"MzEtOTEwLTgzNS01OTMz","upper_bound":"MzEtOTc5LTgzOS0yMTg2","repeats":1},{"count":6660000,"lower_bound":"MzEtOTgwLTQ2OC05NjE0","upper_bound":"MzItMTgzLTQyNy01Njg3","repeats":1},{"count":6690000,"lower_bound":"MzItMTg2LTkyMi04NzA5","upper_bound":"MzItMjYwLTcyOS0xNTA5","repeats":1},{"count":6720000,"lower_bound":"MzItMjYxLTY5NC04OTE0","upper_bound":"MzItMzMwLTU5NS03Nzkx","repeats":1},{"count":6750000,"lower_bound":"MzItMzMxLTc2NS0xMzQ3","upper_bound":"MzItNDQwLTUxMC0yNzI1","repeats":1},{"count":6780000,"lower_bound":"MzItNDQwLTU0Ni00NDc3","upper_bound":"MzItNTQyLTc5Ni01ODE3","repeats":1},{"count":6810000,"lower_bound":"MzItNTQzLTgwMi0yODM5","upper_bound":"MzItNjM3LTg3Ni04MzYz","repeats":1},{"count":6840000,"lower_bound":"MzItNjQyLTY3Ni02ODg5","upper_bound":"MzItNzQyLTM3NS00MzY5","repeats":1},{"count":6870000,"lower_bound":"MzItNzQ0LTk4MC0yMDM1","upper_bound":"MzItODIyLTgyOS0xNjc2","repeats":1},{"count":6900000,"lower_bound":"MzItODI3LTg3My0yNjQx","upper_bound":"MzItOTE3LTUwMi0xOTU0","repeats":1},{"count":6930000,"lower_bound":"MzItOTIwLTM0NS04MTAy","upper_bound":"MzMtMTI2LTQ4Ni05ODkw","repeats":1},{"count":6960000,"lower_bound":"MzMtMTI3LTMwNi00Mzcw","upper_bound":"MzMtMjMxLTYwNS02Nzcw","repeats":1},{"count":6990000,"lower_bound":"MzMtMjMyLTk3MS0xMTE5","upper_bound":"MzMtMzIxLTMzMS0xMzg2","repeats":1},{"count":7020000,"lower_bound":"MzMtMzIyLTgzMy04NzUz","upper_bound":"MzMtNDEyLTE4My0yOTUx","repeats":1},{"count":7050000,"lower_bound":"MzMtNDEyLTI2MC03MDcw","upper_bound":"MzMtNTI2LTIyOS0yMzY0","repeats":1},{"count":7080000,"lower_bound":"MzMtNTI2LTUwNy0zNDI4","upper_bound":"MzMtNjQ0LTEzNi0zNTI5","repeats":1},{"count":7110000,"lower_bound":"MzMtNjQ4LTM4OC02MTEw","upper_bound":"MzMtNzQzLTg3OC0zMDY0","repeats":1},{"count":7140000,"lower_bound":"MzMtNzUwLTQ1MC01MjY2","upper_bound":"MzMtODQxLTQ1NC05MzE4","repeats":1},{"count":7170000,"lower_bound":"MzMtODQxLTUxMi0zMDI2","upper_bound":"MzMtOTA3LTM4Ny02MDk2","repeats":1},{"count":7200000,"lower_bound":"MzMtOTEzLTY1OC05Mjg2","upper_bound":"MzMtOTk2LTM2MS02MDUx","repeats":1},{"count":7230000,"lower_bound":"MzMtOTk4LTkzMS0xMjI2","upper_bound":"MzQtMjAyLTE2Mi04ODg1","repeats":1},{"count":7260000,"lower_bound":"MzQtMjAzLTEwMi0yMDgw","upper_bound":"MzQtMjg5LTY4MC0yMzMy","repeats":1},{"count":7290000,"lower_bound":"MzQtMjkyLTM3Ny03NjA4","upper_bound":"MzQtMzY0LTg5OS0xMzkz","repeats":1},{"count":7320000,"lower_bound":"MzQtMzY4LTcxNy00MTg1","upper_bound":"MzQtNDc0LTU3OC0xOTQw","repeats":1},{"count":7350000,"lower_bound":"MzQtNDc0LTc0NS0zODUz","upper_bound":"MzQtNTczLTgzMS0xMzA0","repeats":1},{"count":7380000,"lower_bound":"MzQtNTc0LTE3OC0zNjU4","upper_bound":"MzQtNjUxLTY0OC00MzE3","repeats":1},{"count":7410000,"lower_bound":"MzQtNjU4LTczMC0xNjk4","upper_bound":"MzQtNzY0LTQwNi0xMDky","repeats":1},{"count":7440000,"lower_bound":"MzQtNzY0LTcyMS02MzQ3","upper_bound":"MzQtODUwLTczNi03NTE5","repeats":1},{"count":7470000,"lower_bound":"MzQtODUxLTQ3OS03NzA4","upper_bound":"MzQtOTM3LTY2Ni03Njg5","repeats":1},{"count":7500000,"lower_bound":"MzQtOTM4LTQ4OS05NDAz","upper_bound":"MzQtOTk3LTU1NS01MDQ0","repeats":1}]},"cm_sketch":{"rows":[{"counters":[3638,3644,3616,3673,3774,3675,3691,3620,3660,3805,3685,3677,3682,3646,3662,3703,3710,3606,3625,3736,3553,3648,3726,3730,3674,3666,3581,3739,3648,3685,3636,3735,3785,3713,3714,3699,3657,3698,3718,3685,3730,3658,3693,3680,3662,3707,3700,3620,3574,3665,3641,3614,3673,3675,3608,3681,3582,3739,3668,3725,3696,3604,3691,3594,3718,3686,3564,3665,3680,3677,3651,3761,3658,3619,3675,3613,3616,3685,3723,3622,3662,3687,3724,3582,3622,3747,3565,3745,3686,3782,3768,3590,3675,3646,3650,3764,3650,3805,3586,3586,3566,3525,3616,3619,3574,3633,3705,3603,3609,3655,3759,3762,3615,3573,3556,3684,3598,3586,3737,3721,3606,3627,3522,3561,3725,3654,3613,3620,3752,3613,3586,3587,3605,3554,3745,3711,3745,3664,3580,3585,3697,3673,3613,3760,3693,3650,3635,3633,3645,3637,3776,3722,3637,3556,3604,3597,3727,3675,3681,3682,3671,3689,3653,3620,3686,3649,3694,3634,3648,3810,3731,3547,3669,3612,3690,3711,3715,3667,3716,3658,3773,3676,3798,3774,3766,3707,3614,3675,3642,3733,3663,3647,3676,3544,3654,3668,3621,3787,3648,3665,3679,3750,3770,3686,3660,3586,3774,3607,3586,3708,3725,3749,3543,3592,3668,3733,3599,3672,3634,3547,3656,3693,3571,3629,3659,3677,3613,3689,3683,3668,3604,3604,3553,3674,3698,3680,3701,3728,3670,3652,3690,3699,3779,3783,3674,3797,3593,3685,3696,3648,3762,3516,3571,3545,3523,3614,3571,3647,3616,3719,3679,3638,3788,3611,3732,3721,3675,3686,3644,3632,3638,3754,3574,3665,3608,3643,3640,3673,3591,3763,3675,3697,3715,3721,3668,3578,3673,3624,3624,3558,3659,3695,3620,3667,3726,3674,3704,3832,3703,3652,3634,3665,3689,3693,3669,3590,3672,3615,3644,3727,3674,3805,3631,3608,3650,3592,3719,3586,3582,3632,3667,3649,3651,3592,3642,3695,3661,3619,3643,3812,3764,3670,3615,3644,3714,3630,3598,3709,3642,3665,3623,3718,3594,3600,3567,3692,3653,3620,3575,3707,3670,3662,3699,3622,3641,3572,3650,3758,3613,3690,3634,3684,3623,3667,3682,3684,3608,3538,3759,3609,3627,3658,3654,3671,3656,3662,3754,3616,3669,3613,3673,3633,3707,3648,3610,3596,3615,3664,3675,3768,3592,3598,3625,3701,3654,3721,3627,3546,3651,3679,3656,3662,3658,3799,3653,3629,3588,3583,3659,3655,3655,3740,3621,3639,3746,3674,3585,3675,3679,3544,3715,3680,3705,3703,3699,3609,3721,3717,3600,3710,3731,3733,3678,3697,3693,3657,3588,3669,3721,3697,3846,3639,3648,3786,3649,3618,3636,3676,3726,3626,3702,3619,3715,3739,3562,3737,3630,3653,3751,3715,3690,3647,3642,3785,3726,3663,3714,3696,3598,3770,3629,3670,3707,3557,3534,3645,3718,3655,3621,3596,3571,3586,3564,3647,3676,3652,3617,3644,3628,3668,3715,3755,3686,3725,3680,3771,3735,3592,3731,3746,3541,3673,3665,3691,3748,3700,3648,3651,3639,3575,3666,3578,3734,3587,3727,3588,3679,3698,3731,3655,3699,3644,3629,3688,3629,3595,3581,3621,3708,3745,3778,3598,3705,3669,3657,3592,3548,3583,3679,3598,3637,3736,3634,3574,3658,3619,3602,3663,3642,3679,3627,3700,3577,3699,3617,3628,3702,3742,3713,3556,3643,3656,3722,3766,3681,3697,3677,3707,3682,3722,3688,3728,3585,3604,3669,3683,3586,3663,3639,3814,3713,3672,3683,3629,3667,3699,3586,3698,3608,3659,3646,3773,3627,3612,3662,3707,3735,3670,3642,3663,3691,3576,3788,3644,3613,3732,3624,3665,3629,3585,3675,3670,3687,3746,3684,3634,3730,3655,3655,3724,3662,3652,3666,3651,3510,3585,3608,3734,3734,3675,3584,3599,3698,3624,3713,3671,3677,3678,3667,3629,3668,3646,3672,3654,3614,3654,3668,3629,3630,3597,3610,3530,3598,3711,3737,3719,3642,3677,3749,3719,3694,3695,3597,3632,3626,3613,3659,3606,3643,3633,3658,3662,3604,3618,3651,3651,3633,3596,3661,3571,3684,3642,3732,3692,3740,3654,3703,3630,3652,3596,3655,3627,3666,3690,3748,3694,3685,3634,3636,3686,3584,3685,3700,3681,3615,3697,3532,3534,3875,3693,3669,3723,3656,3720,3637,3585,3706,3641,3609,3460,3671,3600,3702,3719,3696,3617,3662,3636,3706,3683,3573,3729,3615,3580,3632,3634,3765,3683,3595,3696,3710,3610,3674,3693,3678,3738,3570,3648,3778,3629,3634,3682,3597,3644,3549,3552,3599,3603,3627,3642,3618,3673,3712,3508,3738,3609,3701,3659,3610,3738,3666,3716,3726,3635,3669,3679,3713,3624,3684,3755,3600,3495,3610,3577,3629,3762,3580,3568,3592,3676,3651,3722,3748,3712,3567,3656,3650,3527,3640,3614,3704,3603,3703,3650,3679,3730,3672,3672,3767,3647,3615,3683,3640,3620,3525,3605,3609,3625,3652,3636,3674,3644,3656,3637,3585,3694,3660,3662,3519,3710,3710,3706,3563,3539,3682,3738,3596,3710,3552,3710,3694,3649,3674,3650,3711,3693,3738,3715,3640,3592,3567,3668,3786,3644,3589,3596,3609,3756,3647,3722,3712,3618,3625,3667,3629,3674,3626,3631,3528,3609,3588,3724,3709,3684,3622,3729,3635,3796,3617,3581,3652,3704,3676,3648,3574,3662,3692,3726,3697,3614,3639,3603,3614,3621,3630,3590,3633,3667,3618,3715,3610,3613,3604,3716,3698,3653,3639,3639,3640,3652,3735,3672,3727,3637,3610,3725,3675,3668,3662,3595,3644,3617,3788,3738,3732,3653,3670,3754,3567,3619,3593,3674,3712,3649,3619,3650,3818,3628,3669,3691,3711,3637,3686,3689,3632,3634,3609,3604,3658,3687,3751,3694,3608,3603,3690,3549,3734,3637,3666,3646,3739,3618,3651,3669,3744,3683,3522,3591,3646,3662,3711,3656,3588,3701,3678,3516,3642,3708,3719,3610,3770,3605,3676,3654,3556,3599,3731,3646,3605,3666,3544,3665,3661,3562,3564,3723,3719,3588,3656,3709,3620,3707,3628,3572,3662,3532,3695,3695,3554,3554,3667,3767,3695,3653,3690,3754,3710,3674,3667,3769,3669,3703,3662,3687,3714,3621,3760,3585,3650,3672,3658,3704,3628,3725,3607,3619,3707,3755,3632,3593,3605,3638,3604,3721,3707,3773,3685,3614,3769,3661,3541,3617,3707,3646,3653,3667,3756,3651,3675,3644,3681,3808,3627,3751,3637,3666,3714,3678,3641,3730,3623,3686,3704,3676,3749,3655,3629,3647,3683,3607,3603,3543,3680,3684,3686,3747,3657,3669,3618,3677,3727,3652,3661,3658,3801,3615,3641,3567,3589,3680,3628,3749,3706,3835,3732,3715,3619,3678,3560,3700,3603,3665,3690,3713,3692,3740,3709,3725,3712,3662,3810,3553,3718,3746,3697,3568,3610,3585,3780,3802,3623,3655,3666,3599,3593,3722,3629,3610,3632,3686,3684,3652,3706,3600,3612,3562,3524,3623,3709,3797,3631,3722,3666,3556,3632,3607,3720,3627,3649,3717,3666,3731,3756,3685,3577,3621,3706,3772,3701,3656,3604,3712,3731,3796,3667,3664,3684,3764,3468,3550,3627,3669,3610,3651,3766,3684,3681,3672,3713,3651,3764,3662,3647,3677,3612,3694,3608,3606,3665,3726,3623,3640,3645,3631,3625,3786,3712,3721,3617,3659,3765,3647,3642,3678,3530,3732,3520,3672,3584,3638,3575,3685,3630,3618,3586,3547,3626,3715,3597,3644,3689,3583,3708,3619,3680,3650,3688,3763,3712,3619,3631,3698,3635,3584,3644,3696,3613,3673,3662,3626,3711,3678,3668,3621,3607,3747,3633,3669,3655,3657,3722,3720,3662,3621,3633,3650,3666,3643,3555,3612,3704,3717,3658,3689,3702,3696,3604,3574,3564,3698,3664,3703,3605,3614,3703,3523,3695,3656,3717,3704,3653,3679,3715,3710,3524,3746,3716,3784,3532,3680,3639,3652,3705,3563,3739,3730,3802,3694,3677,3721,3614,3668,3634,3614,3647,3665,3633,3677,3620,3639,3555,3717,3555,3706,3694,3685,3583,3702,3612,3679,3623,3657,3719,3639,3782,3609,3647,3681,3754,3679,3689,3727,3672,3715,3741,3670,3615,3661,3591,3672,3764,3621,3668,3675,3742,3650,3575,3638,3766,3669,3654,3694,3661,3684,3663,3677,3798,3802,3712,3514,3691,3680,3817,3712,3686,3570,3658,3730,3698,3613,3657,3717,3690,3723,3741,3752,3722,3723,3725,3599,3721,3613,3607,3701,3693,3644,3588,3649,3614,3645,3615,3731,3710,3689,3698,3693,3645,3658,3600,3679,3627,3697,3658,3706,3632,3731,3677,3627,3684,3643,3615,3604,3706,3674,3764,3683,3713,3653,3740,3679,3674,3619,3745,3594,3734,3619,3589,3686,3686,3655,3632,3606,3816,3651,3655,3654,3672,3728,3746,3685,3659,3626,3698,3585,3664,3629,3688,3667,3671,3693,3603,3729,3676,3678,3653,3686,3692,3679,3660,3663,3758,3666,3645,3716,3626,3679,3687,3645,3705,3565,3631,3696,3633,3671,3632,3763,3746,3676,3719,3647,3680,3632,3703,3761,3703,3679,3486,3670,3727,3625,3582,3699,3614,3724,3641,3616,3598,3766,3640,3734,3628,3674,3602,3610,3600,3749,3736,3651,3481,3617,3733,3618,3644,3652,3722,3704,3724,3674,3596,3718,3647,3634,3705,3629,3756,3784,3607,3560,3707,3491,3685,3653,3711,3657,3661,3640,3625,3644,3648,3631,3674,3644,3629,3583,3596,3654,3622,3763,3734,3691,3647,3778,3679,3726,3685,3658,3627,3611,3641,3656,3712,3705,3690,3690,3696,3636,3712,3541,3691,3650,3667,3567,3761,3583,3649,3687,3689,3614,3750,3598,3742,3705,3671,3682,3673,3696,3596,3690,3561,3675,3580,3539,3634,3678,3612,3565,3640,3704,3587,3792,3679,3635,3728,3581,3727,3672,3686,3660,3690,3732,3716,3585,3661,3739,3593,3693,3609,3702,3522,3641,3593,3651,3775,3636,3636,3685,3570,3697,3621,3642,3644,3576,3627,3623,3656,3707,3698,3569,3601,3769,3731,3685,3579,3711,3736,3662,3673,3676,3720,3686,3534,3635,3709,3635,3699,3676,3616,3659,3650,3669,3714,3599,3588,3596,3687,3633,3724,3647,3600,3592,3704,3716,3695,3598,3530,3624,3722,3607,3785,3718,3685,3647,3646,3692,3708,3711,3708,3754,3746,3723,3643,3737,3724,3698,3582,3675,3746,3628,3705,3673,3720,3655,3736,3701,3634,3674,3588,3673,3528,3741,3668,3648,3683,3631,3714,3707,3661,3601,3683,3724,3720,3691,3669,3633,3682,3770,3673,3639,3737,3591,3588,3660,3693,3709,3590,3680,3628,3597,3576,3601,3763,3596,3697,3704,3600,3717,3617,3604,3663,3599,3625,3686,3710,3640,3700,3681,3678,3732,3735,3646,3746,3619,3670,3646,3631,3725,3657,3623,3575,3551,3652,3591,3687,3746,3690,3739,3746,3590,3729,3698,3574,3657,3621,3598,3763,3684,3633,3734,3700,3655,3562,3672,3642,3543,3646,3482,3656,3709,3732,3706,3618,3603,3602,3789,3804,3718,3687,3648,3657,3724,3669,3641,3694,3661,3744,3609,3621,3733,3743,3708,3599,3677,3713,3546,3667,3644,3603,3696,3806,3748,3588,3538,3656,3535,3666,3639,3725,3606,3620,3717,3722,3609,3618,3708,3729,3731,3575,3666,3672,3687,3591,3584,3660,3647,3678,3639,3775,3684,3652,3687,3600,3551,3648,3688,3684,3646,3675,3681,3701,3710,3638,3807,3709,3674,3625,3665,3607,3763,3704,3613,3625,3620,3735,3617,3722,3724,3739,3588,3599,3779,3686,3580,3684,3600,3691,3766,3756,3630,3677,3635,3716,3607,3677,3681,3663,3660,3623,3706,3603,3696,3641,3585,3563,3535,3633,3609,3745,3599,3702,3717,3664,3738,3680,3750,3769,3673,3631,3564,3778,3634,3525,3639,3649,3651,3609,3751,3731,3603,3629,3683,3684,3626,3683,3641,3680,3613,3616,3586,3717,3628,3607,3640,3612,3780,3611,3637,3786,3626,3668,3581,3600,3609,3662,3569,3711,3671,3682,3681,3807,3643,3669,3636,3564,3683,3661,3562,3703,3636,3715,3703,3647,3590,3640,3681,3642,3594,3622,3691,3597,3711,3728,3664,3610,3669,3616,3653,3587,3681,3830,3600,3753,3726,3647,3617,3656,3598,3690,3626,3538,3671,3559,3597,3554,3713,3692,3586,3660,3729,3582,3626,3624,3591,3721,3733,3661,3816,3657,3761,3759,3600,3613,3669,3622,3697,3622,3786,3600,3689]},{"counters":[3676,3686,3785,3725,3729,3657,3590,3697,3737,3725,3688,3577,3642,3569,3696,3595,3721,3671,3693,3621,3699,3619,3781,3585,3696,3574,3639,3649,3761,3738,3646,3635,3691,3688,3624,3632,3678,3613,3547,3597,3622,3688,3679,3692,3712,3625,3658,3591,3543,3558,3670,3707,3740,3592,3690,3763,3519,3680,3627,3655,3656,3714,3695,3563,3599,3676,3631,3586,3681,3734,3740,3699,3656,3619,3536,3695,3709,3700,3731,3718,3686,3649,3752,3533,3805,3686,3772,3703,3804,3705,3679,3690,3649,3694,3740,3690,3748,3656,3694,3594,3591,3706,3590,3713,3510,3677,3548,3739,3606,3715,3653,3642,3772,3645,3720,3730,3667,3597,3667,3642,3729,3686,3676,3624,3615,3663,3701,3624,3731,3700,3710,3721,3613,3550,3635,3746,3594,3704,3649,3741,3627,3720,3703,3653,3709,3625,3726,3627,3578,3608,3681,3703,3676,3777,3721,3654,3622,3630,3584,3716,3611,3632,3849,3582,3616,3683,3698,3661,3639,3632,3627,3627,3573,3636,3673,3622,3679,3564,3691,3670,3706,3684,3648,3650,3701,3663,3638,3663,3659,3663,3574,3673,3684,3676,3566,3690,3661,3597,3641,3605,3686,3683,3659,3742,3738,3761,3718,3673,3830,3826,3752,3702,3728,3540,3734,3661,3621,3728,3724,3537,3622,3641,3562,3692,3712,3626,3606,3700,3716,3729,3709,3598,3541,3635,3599,3517,3579,3760,3691,3594,3601,3506,3767,3625,3647,3615,3757,3717,3706,3775,3630,3601,3724,3726,3724,3600,3638,3718,3796,3593,3642,3669,3661,3754,3763,3733,3724,3653,3712,3660,3530,3669,3569,3714,3576,3639,3693,3593,3761,3714,3600,3633,3612,3583,3658,3685,3654,3649,3728,3652,3679,3693,3714,3671,3692,3611,3643,3736,3645,3684,3647,3551,3687,3653,3706,3734,3602,3655,3664,3593,3702,3727,3620,3680,3681,3750,3594,3623,3610,3640,3632,3595,3665,3658,3757,3634,3675,3657,3691,3631,3701,3634,3629,3710,3678,3704,3650,3687,3755,3667,3680,3655,3644,3579,3511,3519,3697,3620,3504,3686,3519,3673,3653,3617,3563,3574,3610,3642,3724,3663,3618,3642,3710,3816,3741,3582,3624,3688,3704,3680,3546,3733,3708,3679,3628,3713,3717,3600,3618,3709,3657,3596,3714,3641,3630,3634,3699,3735,3658,3700,3595,3639,3654,3608,3638,3649,3690,3653,3726,3641,3584,3675,3788,3627,3530,3674,3577,3599,3726,3716,3632,3659,3618,3703,3705,3612,3593,3696,3652,3585,3747,3704,3782,3659,3748,3666,3649,3688,3675,3657,3562,3612,3677,3768,3683,3678,3698,3578,3603,3622,3622,3634,3565,3702,3663,3674,3655,3610,3626,3697,3713,3674,3675,3692,3693,3686,3665,3581,3699,3565,3610,3608,3664,3612,3649,3643,3734,3719,3593,3690,3658,3632,3735,3740,3612,3619,3723,3643,3639,3703,3756,3580,3593,3646,3574,3576,3615,3760,3619,3626,3633,3594,3687,3683,3624,3639,3677,3641,3681,3702,3683,3712,3751,3693,3780,3707,3675,3637,3610,3718,3646,3617,3701,3685,3664,3583,3789,3788,3700,3613,3657,3631,3720,3660,3671,3674,3582,3518,3642,3565,3750,3686,3546,3654,3662,3599,3743,3601,3605,3611,3630,3713,3586,3585,3626,3672,3512,3650,3731,3636,3749,3658,3702,3622,3698,3712,3661,3662,3720,3638,3525,3646,3596,3707,3591,3672,3596,3635,3718,3662,3623,3660,3558,3726,3749,3732,3565,3558,3642,3706,3729,3568,3758,3688,3667,3727,3630,3630,3638,3631,3769,3678,3641,3737,3681,3618,3692,3784,3687,3670,3651,3704,3679,3571,3676,3643,3563,3700,3702,3686,3661,3650,3660,3797,3702,3610,3606,3730,3718,3631,3597,3617,3664,3671,3654,3733,3534,3641,3633,3735,3628,3708,3788,3572,3565,3754,3665,3728,3631,3749,3683,3678,3568,3683,3625,3678,3524,3632,3608,3656,3662,3626,3650,3638,3734,3627,3619,3676,3654,3619,3647,3699,3681,3660,3722,3653,3630,3693,3756,3607,3729,3736,3660,3708,3742,3641,3754,3616,3627,3634,3733,3691,3611,3761,3591,3531,3661,3624,3631,3640,3645,3689,3665,3654,3641,3690,3711,3628,3552,3706,3700,3672,3620,3702,3650,3754,3672,3655,3661,3640,3730,3847,3555,3689,3628,3711,3634,3717,3680,3640,3819,3657,3562,3729,3711,3672,3634,3723,3686,3787,3668,3635,3666,3561,3571,3719,3667,3745,3703,3728,3665,3686,3630,3709,3661,3732,3747,3663,3686,3670,3687,3548,3611,3505,3601,3709,3569,3693,3645,3664,3649,3669,3749,3633,3673,3608,3703,3691,3634,3727,3645,3556,3693,3658,3657,3708,3704,3726,3657,3634,3713,3620,3658,3748,3572,3627,3704,3709,3699,3762,3536,3621,3702,3692,3692,3727,3768,3649,3580,3670,3623,3695,3643,3658,3621,3668,3570,3724,3719,3767,3611,3615,3708,3685,3645,3787,3572,3663,3705,3649,3604,3681,3651,3697,3614,3667,3673,3714,3712,3645,3771,3679,3627,3653,3522,3565,3732,3795,3666,3692,3713,3720,3564,3605,3627,3622,3672,3693,3611,3676,3637,3738,3690,3678,3723,3719,3491,3690,3705,3782,3767,3766,3578,3694,3711,3602,3666,3593,3618,3654,3649,3576,3688,3646,3672,3616,3830,3649,3632,3673,3717,3675,3613,3691,3698,3653,3787,3617,3662,3782,3779,3555,3694,3629,3636,3641,3579,3718,3679,3705,3583,3603,3750,3739,3585,3692,3636,3624,3643,3561,3637,3613,3629,3649,3790,3602,3643,3747,3558,3659,3596,3753,3702,3686,3660,3764,3649,3583,3632,3623,3743,3675,3569,3648,3543,3583,3757,3687,3875,3736,3656,3645,3691,3673,3679,3606,3735,3717,3637,3639,3723,3632,3610,3585,3545,3699,3600,3517,3807,3737,3649,3695,3755,3650,3761,3721,3766,3600,3682,3636,3574,3672,3696,3662,3597,3661,3626,3663,3742,3676,3689,3681,3672,3770,3640,3677,3782,3738,3733,3644,3686,3729,3608,3726,3711,3667,3700,3706,3678,3645,3686,3725,3622,3587,3607,3684,3655,3674,3651,3530,3619,3633,3590,3633,3707,3610,3571,3761,3757,3630,3617,3604,3635,3586,3526,3608,3750,3581,3646,3667,3646,3589,3612,3585,3784,3597,3673,3708,3654,3646,3512,3655,3727,3744,3602,3571,3701,3733,3651,3695,3719,3663,3658,3710,3632,3671,3627,3676,3655,3602,3752,3643,3679,3710,3552,3606,3753,3656,3762,3619,3660,3744,3617,3690,3673,3703,3604,3641,3673,3663,3669,3629,3703,3762,3826,3732,3740,3709,3580,3586,3623,3661,3578,3680,3584,3638,3747,3792,3670,3641,3668,3637,3643,3651,3637,3659,3607,3627,3722,3634,3593,3746,3701,3668,3675,3678,3649,3653,3654,3662,3669,3595,3719,3667,3622,3722,3607,3703,3675,3635,3683,3693,3696,3785,3684,3669,3628,3612,3667,3735,3673,3750,3720,3615,3726,3606,3623,3652,3651,3661,3668,3614,3614,3667,3700,3728,3758,3666,3668,3709,3679,3591,3691,3604,3727,3649,3667,3694,3659,3702,3717,3689,3627,3687,3707,3650,3544,3646,3573,3654,3559,3751,3563,3655,3813,3629,3641,3642,3631,3659,3624,3627,3631,3612,3714,3688,3754,3734,3780,3696,3643,3644,3714,3643,3751,3605,3746,3683,3689,3662,3556,3707,3641,3596,3656,3658,3604,3719,3659,3740,3637,3654,3650,3619,3669,3698,3612,3614,3734,3613,3567,3615,3606,3601,3652,3662,3590,3525,3696,3653,3563,3611,3598,3637,3633,3640,3685,3695,3733,3632,3630,3668,3606,3556,3688,3607,3623,3666,3639,3570,3516,3556,3630,3582,3623,3615,3664,3588,3747,3687,3751,3630,3609,3787,3556,3522,3642,3732,3567,3633,3628,3722,3754,3683,3600,3568,3581,3623,3638,3807,3553,3768,3553,3675,3599,3707,3536,3676,3659,3604,3683,3615,3626,3583,3698,3656,3698,3621,3706,3668,3646,3683,3655,3751,3612,3681,3633,3659,3622,3652,3685,3735,3764,3627,3689,3815,3616,3602,3595,3562,3586,3657,3535,3615,3811,3594,3700,3643,3773,3730,3716,3609,3760,3574,3667,3717,3621,3643,3725,3760,3680,3767,3727,3606,3649,3652,3734,3674,3659,3764,3577,3688,3620,3745,3597,3591,3664,3624,3553,3694,3559,3657,3732,3712,3676,3669,3659,3611,3686,3663,3724,3740,3554,3654,3627,3731,3559,3723,3614,3644,3590,3687,3629,3631,3610,3749,3703,3803,3780,3652,3712,3717,3720,3703,3639,3756,3672,3686,3646,3632,3646,3738,3608,3579,3713,3662,3721,3713,3619,3771,3697,3616,3805,3621,3651,3529,3702,3590,3662,3633,3732,3664,3710,3646,3670,3697,3683,3606,3613,3618,3618,3623,3711,3673,3549,3549,3754,3705,3702,3632,3653,3598,3651,3727,3637,3745,3650,3628,3682,3582,3777,3591,3746,3665,3578,3759,3725,3692,3642,3523,3673,3689,3706,3704,3662,3569,3684,3602,3553,3699,3583,3670,3689,3650,3775,3619,3593,3700,3581,3578,3670,3761,3669,3623,3599,3607,3715,3682,3723,3679,3608,3681,3749,3729,3682,3752,3771,3692,3705,3645,3645,3702,3635,3676,3677,3741,3642,3480,3707,3626,3546,3609,3584,3682,3709,3668,3681,3644,3652,3744,3617,3672,3567,3653,3599,3694,3746,3552,3678,3622,3575,3689,3677,3661,3671,3706,3646,3659,3682,3621,3692,3651,3575,3557,3585,3701,3692,3638,3658,3576,3721,3616,3646,3653,3634,3630,3646,3691,3621,3669,3691,3662,3691,3683,3657,3745,3568,3703,3688,3773,3665,3602,3572,3653,3743,3743,3734,3541,3598,3596,3718,3615,3714,3625,3747,3723,3577,3635,3663,3673,3730,3661,3681,3774,3647,3710,3674,3642,3768,3642,3640,3606,3773,3606,3592,3679,3684,3693,3649,3692,3621,3673,3687,3612,3628,3744,3704,3571,3730,3661,3610,3654,3566,3680,3696,3717,3635,3693,3612,3614,3767,3629,3731,3687,3829,3690,3659,3647,3719,3604,3599,3669,3668,3646,3567,3638,3648,3710,3740,3617,3621,3683,3593,3639,3615,3677,3657,3611,3646,3663,3627,3685,3631,3678,3655,3742,3607,3569,3640,3612,3715,3690,3743,3674,3701,3731,3674,3703,3736,3605,3598,3693,3742,3742,3648,3586,3683,3784,3540,3637,3662,3629,3684,3696,3680,3763,3753,3695,3671,3685,3622,3713,3724,3742,3635,3738,3580,3691,3726,3697,3689,3734,3647,3628,3678,3685,3551,3644,3716,3740,3663,3668,3690,3743,3681,3653,3810,3612,3637,3735,3850,3736,3572,3603,3639,3700,3661,3744,3730,3753,3681,3783,3629,3683,3638,3643,3649,3725,3684,3652,3656,3682,3767,3693,3624,3611,3716,3725,3621,3731,3744,3582,3709,3693,3700,3710,3670,3559,3637,3601,3609,3766,3662,3601,3606,3595,3596,3656,3624,3719,3571,3543,3606,3695,3696,3560,3571,3569,3651,3681,3746,3568,3704,3642,3603,3808,3639,3710,3613,3645,3792,3540,3722,3652,3665,3636,3559,3682,3750,3690,3753,3631,3618,3697,3686,3733,3566,3711,3633,3754,3646,3604,3753,3672,3717,3706,3577,3672,3651,3675,3576,3801,3647,3623,3642,3661,3634,3562,3625,3619,3602,3684,3617,3772,3724,3603,3631,3622,3715,3617,3624,3654,3650,3646,3745,3523,3649,3643,3627,3653,3528,3675,3704,3742,3691,3599,3646,3609,3638,3690,3684,3552,3618,3651,3670,3674,3713,3599,3666,3663,3673,3748,3652,3593,3684,3586,3710,3669,3690,3667,3579,3651,3680,3662,3671,3672,3643,3468,3730,3700,3700,3635,3615,3697,3683,3618,3708,3598,3692,3725,3576,3682,3734,3672,3685,3601,3777,3676,3649,3631,3580,3531,3600,3652,3659,3766,3588,3619,3654,3646,3625,3691,3735,3581,3677,3664,3692,3634,3651,3693,3794,3553,3676,3669,3666,3631,3642,3745,3570,3591,3582,3556,3634,3597,3613,3542,3660,3666,3698,3668,3782,3748,3643,3619,3714,3601,3816,3647,3576,3682,3631,3669,3642,3635,3728,3669,3639,3698,3632,3702,3603,3708,3550,3630,3667,3676,3707,3747,3650,3716,3692,3636,3745,3657,3640,3708,3709,3666,3606,3636,3580,3674,3631,3583,3662,3732,3671,3650,3585,3635,3549,3715,3717,3531,3653,3596,3614,3683,3713,3611,3670,3678,3706,3630,3681,3658,3641,3567,3646,3708,3741,3659,3569,3630,3639,3680,3655,3705]},{"counters":[3617,3660,3614,3622,3686,3663,3696,3740,3633,3669,3554,3712,3788,3755,3627,3641,3717,3547,3808,3694,3620,3708,3693,3671,3682,3608,3537,3631,3705,3743,3670,3716,3737,3706,3717,3689,3778,3676,3678,3632,3686,3656,3757,3665,3621,3710,3774,3472,3599,3735,3669,3622,3704,3618,3628,3637,3652,3628,3624,3629,3574,3661,3716,3700,3781,3511,3709,3722,3706,3682,3601,3631,3625,3678,3702,3609,3708,3655,3681,3821,3695,3640,3726,3687,3729,3736,3687,3627,3664,3669,3698,3776,3701,3656,3688,3664,3572,3711,3706,3629,3734,3665,3702,3587,3580,3751,3676,3627,3667,3533,3668,3678,3561,3726,3635,3677,3718,3644,3541,3699,3669,3639,3609,3679,3723,3659,3491,3579,3589,3521,3647,3741,3593,3652,3666,3717,3644,3660,3785,3558,3649,3604,3707,3625,3601,3650,3578,3706,3694,3731,3610,3618,3700,3538,3655,3755,3593,3597,3571,3547,3737,3628,3698,3710,3714,3695,3577,3678,3715,3718,3613,3685,3570,3726,3763,3658,3593,3549,3579,3790,3654,3753,3617,3610,3660,3671,3738,3647,3717,3613,3653,3609,3739,3760,3765,3604,3537,3564,3734,3713,3661,3695,3721,3711,3637,3705,3751,3637,3639,3560,3649,3743,3651,3639,3616,3656,3602,3672,3654,3630,3590,3715,3681,3775,3705,3589,3685,3639,3721,3668,3631,3683,3583,3644,3695,3664,3668,3710,3767,3629,3681,3638,3696,3693,3723,3549,3620,3645,3608,3724,3678,3651,3633,3762,3587,3654,3579,3651,3633,3657,3732,3622,3627,3617,3662,3619,3650,3645,3712,3658,3659,3624,3695,3587,3607,3651,3784,3679,3553,3728,3601,3667,3741,3684,3630,3686,3661,3627,3637,3633,3636,3697,3623,3674,3736,3645,3547,3692,3717,3648,3648,3674,3732,3592,3690,3736,3694,3705,3650,3635,3734,3734,3648,3724,3613,3549,3736,3721,3778,3762,3782,3583,3656,3824,3677,3728,3646,3635,3627,3719,3717,3657,3638,3598,3666,3673,3625,3683,3695,3656,3514,3651,3655,3644,3637,3645,3724,3657,3800,3484,3624,3721,3559,3644,3736,3747,3648,3667,3597,3713,3678,3656,3651,3648,3702,3680,3661,3730,3668,3757,3702,3632,3683,3700,3542,3596,3612,3657,3681,3767,3655,3715,3569,3600,3691,3639,3624,3659,3775,3577,3553,3687,3752,3628,3654,3693,3749,3770,3607,3694,3642,3669,3702,3619,3690,3783,3685,3755,3676,3646,3542,3576,3610,3600,3626,3626,3665,3648,3639,3653,3679,3660,3704,3639,3634,3613,3685,3508,3704,3663,3634,3780,3626,3723,3638,3666,3654,3602,3767,3635,3520,3632,3658,3660,3610,3580,3589,3573,3592,3604,3620,3630,3584,3615,3692,3652,3660,3598,3591,3693,3856,3698,3649,3678,3666,3652,3641,3666,3702,3568,3636,3746,3663,3705,3627,3597,3640,3650,3531,3675,3632,3606,3651,3700,3618,3692,3686,3713,3645,3710,3701,3728,3696,3567,3546,3647,3705,3639,3650,3619,3746,3554,3638,3751,3651,3595,3639,3574,3641,3646,3674,3652,3778,3545,3691,3651,3550,3680,3645,3699,3757,3593,3683,3711,3732,3736,3597,3757,3693,3677,3730,3692,3529,3745,3615,3721,3624,3645,3559,3582,3657,3645,3709,3748,3720,3799,3629,3612,3717,3809,3709,3698,3653,3592,3582,3761,3672,3684,3786,3741,3750,3672,3754,3703,3640,3612,3645,3760,3735,3611,3629,3683,3720,3565,3609,3573,3825,3791,3629,3546,3656,3727,3679,3771,3644,3695,3709,3629,3629,3633,3651,3500,3648,3675,3662,3734,3630,3627,3636,3694,3522,3742,3648,3719,3691,3687,3631,3684,3644,3643,3613,3619,3594,3719,3771,3658,3754,3670,3627,3532,3558,3665,3631,3614,3676,3572,3635,3656,3668,3677,3591,3630,3625,3686,3677,3626,3679,3651,3588,3657,3669,3614,3714,3686,3512,3750,3589,3610,3625,3727,3671,3776,3678,3734,3702,3598,3662,3791,3773,3652,3654,3586,3616,3611,3643,3730,3736,3615,3738,3741,3551,3750,3705,3624,3602,3586,3687,3639,3649,3660,3710,3656,3560,3680,3759,3581,3599,3706,3556,3635,3614,3591,3650,3562,3644,3607,3634,3727,3683,3659,3605,3715,3705,3687,3748,3707,3742,3759,3709,3701,3757,3617,3678,3694,3748,3633,3595,3638,3732,3561,3623,3631,3560,3645,3686,3730,3680,3612,3630,3722,3656,3648,3630,3626,3656,3540,3671,3807,3564,3710,3726,3726,3747,3714,3595,3683,3711,3628,3658,3649,3657,3721,3700,3702,3644,3566,3726,3728,3678,3701,3543,3609,3684,3717,3740,3584,3690,3649,3716,3764,3765,3777,3765,3619,3615,3814,3654,3648,3627,3584,3712,3765,3698,3690,3550,3689,3799,3736,3682,3640,3616,3612,3742,3694,3630,3688,3743,3739,3679,3721,3495,3555,3679,3589,3843,3602,3732,3545,3730,3792,3691,3738,3704,3636,3701,3671,3678,3652,3805,3664,3755,3615,3631,3751,3558,3564,3587,3807,3648,3606,3686,3716,3636,3618,3721,3690,3674,3680,3636,3689,3598,3606,3731,3713,3649,3582,3697,3681,3730,3641,3737,3759,3728,3634,3689,3780,3632,3766,3710,3700,3651,3683,3612,3677,3621,3616,3736,3689,3687,3659,3637,3759,3656,3611,3758,3698,3535,3702,3634,3757,3822,3663,3762,3640,3657,3737,3664,3695,3665,3710,3574,3577,3725,3695,3694,3567,3677,3641,3693,3763,3639,3748,3646,3774,3639,3611,3650,3634,3614,3714,3588,3614,3760,3624,3721,3715,3659,3645,3732,3722,3615,3678,3714,3685,3645,3769,3626,3643,3713,3636,3696,3625,3730,3653,3656,3658,3727,3701,3664,3570,3744,3681,3631,3710,3545,3636,3657,3648,3632,3656,3549,3694,3587,3555,3652,3734,3639,3748,3642,3636,3704,3534,3690,3759,3536,3706,3604,3650,3613,3762,3749,3632,3678,3672,3621,3742,3651,3630,3698,3794,3621,3707,3567,3799,3796,3682,3611,3617,3640,3659,3610,3573,3686,3608,3610,3707,3587,3662,3616,3540,3744,3694,3615,3643,3685,3731,3654,3687,3616,3595,3672,3691,3752,3613,3803,3597,3718,3623,3705,3651,3494,3580,3705,3682,3704,3662,3734,3619,3575,3717,3757,3550,3590,3669,3662,3585,3672,3749,3661,3612,3762,3633,3618,3631,3667,3657,3572,3644,3689,3660,3679,3631,3748,3646,3679,3699,3629,3692,3650,3637,3657,3600,3635,3761,3546,3718,3660,3747,3645,3621,3710,3598,3736,3669,3588,3644,3704,3661,3615,3666,3634,3664,3689,3692,3651,3753,3639,3666,3655,3698,3694,3652,3708,3566,3694,3643,3579,3653,3675,3653,3697,3766,3701,3685,3712,3630,3701,3666,3654,3752,3572,3642,3716,3662,3691,3660,3667,3655,3662,3610,3702,3692,3718,3678,3695,3704,3763,3648,3593,3626,3561,3718,3696,3645,3675,3587,3625,3679,3635,3585,3636,3643,3737,3639,3784,3634,3591,3628,3765,3594,3624,3692,3682,3637,3702,3636,3620,3663,3647,3649,3682,3758,3752,3755,3647,3626,3624,3678,3644,3647,3641,3647,3720,3620,3747,3715,3668,3666,3683,3657,3667,3644,3588,3653,3706,3654,3639,3715,3710,3677,3667,3701,3748,3727,3665,3644,3777,3577,3648,3667,3621,3625,3632,3712,3658,3658,3659,3636,3661,3729,3571,3575,3711,3633,3590,3735,3607,3720,3645,3674,3638,3630,3580,3713,3661,3687,3729,3535,3745,3624,3675,3661,3681,3612,3653,3804,3682,3697,3526,3695,3649,3677,3631,3556,3711,3557,3662,3671,3703,3677,3646,3810,3672,3636,3577,3735,3610,3704,3720,3690,3730,3618,3705,3545,3663,3679,3688,3704,3730,3616,3771,3714,3637,3626,3619,3722,3789,3650,3628,3568,3547,3628,3644,3662,3641,3624,3683,3625,3549,3751,3583,3695,3697,3636,3647,3755,3685,3605,3697,3713,3652,3666,3716,3712,3739,3599,3567,3670,3618,3795,3678,3631,3810,3644,3711,3802,3580,3652,3657,3533,3710,3542,3624,3762,3725,3715,3545,3745,3699,3698,3669,3725,3693,3684,3574,3703,3675,3610,3598,3648,3651,3663,3562,3668,3712,3660,3637,3658,3598,3655,3677,3611,3684,3759,3670,3659,3597,3628,3655,3602,3686,3675,3667,3589,3705,3571,3606,3566,3654,3651,3707,3652,3584,3777,3685,3613,3611,3656,3639,3652,3638,3707,3621,3651,3683,3770,3679,3587,3715,3786,3683,3693,3734,3663,3813,3718,3638,3644,3681,3585,3680,3716,3715,3681,3713,3707,3642,3741,3625,3766,3654,3678,3621,3678,3690,3758,3689,3647,3624,3443,3651,3701,3628,3730,3711,3577,3777,3580,3702,3651,3639,3651,3671,3544,3762,3602,3740,3750,3572,3645,3663,3579,3566,3603,3632,3666,3733,3650,3666,3643,3701,3615,3618,3611,3665,3671,3658,3721,3702,3682,3615,3576,3554,3676,3727,3716,3729,3729,3643,3667,3615,3674,3617,3582,3725,3769,3537,3625,3718,3674,3666,3737,3692,3686,3627,3628,3671,3658,3567,3611,3551,3678,3617,3771,3608,3560,3547,3723,3611,3775,3626,3638,3633,3641,3697,3624,3605,3742,3653,3675,3726,3625,3661,3668,3669,3772,3688,3625,3638,3572,3638,3691,3638,3599,3664,3748,3649,3687,3708,3584,3682,3672,3558,3599,3762,3615,3579,3528,3719,3655,3700,3595,3640,3798,3563,3697,3746,3669,3776,3685,3575,3696,3610,3659,3620,3709,3643,3778,3658,3632,3729,3627,3632,3755,3636,3675,3598,3724,3784,3664,3696,3699,3750,3620,3593,3563,3700,3767,3592,3716,3690,3673,3607,3638,3735,3500,3731,3676,3601,3637,3700,3663,3689,3685,3705,3603,3720,3573,3665,3617,3614,3688,3841,3748,3592,3636,3628,3601,3627,3477,3725,3612,3569,3614,3722,3664,3680,3705,3659,3604,3598,3714,3717,3552,3664,3673,3687,3564,3687,3722,3642,3703,3619,3663,3640,3763,3630,3744,3667,3632,3687,3754,3716,3676,3792,3696,3588,3735,3644,3675,3650,3611,3794,3668,3680,3801,3623,3576,3735,3601,3726,3715,3662,3666,3679,3705,3686,3640,3601,3670,3699,3584,3518,3656,3690,3660,3703,3723,3585,3566,3672,3588,3565,3671,3647,3623,3657,3579,3677,3710,3608,3773,3679,3534,3468,3640,3560,3723,3799,3697,3585,3708,3628,3589,3617,3656,3571,3688,3703,3708,3585,3602,3693,3674,3631,3818,3663,3549,3675,3648,3622,3586,3659,3630,3711,3772,3659,3667,3698,3634,3715,3604,3770,3590,3689,3642,3504,3647,3638,3614,3688,3579,3599,3684,3751,3705,3710,3706,3606,3660,3610,3653,3693,3708,3722,3698,3669,3645,3697,3675,3790,3595,3592,3571,3595,3775,3636,3629,3665,3611,3631,3700,3675,3603,3619,3655,3718,3696,3697,3710,3689,3667,3570,3603,3628,3741,3660,3606,3543,3570,3635,3621,3687,3681,3758,3562,3632,3596,3646,3752,3663,3688,3588,3688,3684,3605,3599,3556,3577,3782,3793,3633,3622,3746,3639,3675,3660,3607,3633,3629,3619,3566,3673,3630,3686,3668,3659,3643,3674,3757,3670,3638,3606,3570,3640,3640,3703,3734,3533,3676,3660,3812,3755,3680,3518,3741,3612,3653,3644,3644,3638,3646,3585,3705,3699,3720,3640,3673,3631,3601,3642,3601,3633,3669,3596,3700,3714,3669,3767,3697,3652,3684,3696,3779,3592,3698,3626,3607,3632,3668,3654,3675,3652,3668,3702,3627,3461,3663,3684,3555,3677,3647,3721,3686,3675,3542,3590,3744,3511,3568,3616,3583,3679,3540,3741,3693,3743,3590,3577,3666,3596,3503,3747,3713,3669,3644,3741,3619,3664,3660,3594,3689,3531,3623,3714,3606,3628,3599,3726,3657,3700,3781,3733,3701,3601,3510,3619,3686,3719,3565,3568,3633,3610,3714,3542,3586,3606,3619,3657,3668,3674,3533,3705,3624,3676,3620,3609,3657,3635,3680,3593,3708,3617,3614,3621,3609,3562,3655,3677,3616,3626,3615,3748,3687,3566,3632,3641,3645,3644,3522,3711,3603,3745,3707,3687,3632,3711,3613,3560,3776,3668,3650,3631,3665,3668,3708,3666,3645,3677,3653,3687,3550,3689,3621,3690,3630,3676,3649,3724,3689,3632,3683,3739,3646,3691,3619,3712,3666,3676,3599,3689,3614,3711,3664,3658,3684,3662,3702,3716,3716,3725,3673,3660,3780,3590,3771,3631,3657,3660,3672,3711,3704,3676,3625,3627,3688,3633,3744]},{"counters":[3581,3693,3578,3587,3588,3637,3690,3684,3730,3568,3573,3632,3660,3715,3553,3581,3711,3635,3618,3718,3670,3615,3633,3615,3555,3693,3745,3734,3726,3664,3723,3621,3577,3685,3666,3754,3622,3599,3685,3682,3686,3598,3622,3632,3565,3703,3707,3692,3684,3648,3710,3686,3659,3653,3648,3591,3601,3615,3606,3694,3639,3668,3673,3705,3741,3753,3725,3749,3746,3710,3746,3743,3683,3560,3701,3655,3707,3685,3705,3719,3674,3715,3642,3713,3731,3608,3509,3735,3723,3627,3645,3773,3701,3607,3701,3713,3675,3585,3599,3725,3665,3709,3668,3717,3687,3706,3701,3661,3775,3657,3582,3637,3563,3748,3529,3589,3711,3632,3576,3703,3755,3688,3652,3578,3497,3697,3709,3667,3691,3681,3651,3642,3732,3645,3688,3718,3680,3670,3689,3610,3718,3700,3560,3697,3752,3734,3705,3691,3682,3610,3662,3661,3692,3755,3638,3716,3621,3712,3719,3593,3619,3754,3639,3706,3705,3617,3661,3586,3639,3587,3737,3655,3803,3695,3626,3611,3612,3626,3603,3597,3573,3645,3684,3650,3820,3611,3697,3645,3730,3709,3637,3511,3690,3688,3735,3794,3679,3566,3578,3615,3692,3771,3664,3669,3676,3618,3651,3661,3687,3773,3630,3564,3758,3574,3599,3691,3770,3633,3716,3661,3630,3644,3696,3687,3646,3659,3694,3670,3694,3700,3680,3676,3691,3707,3711,3627,3582,3681,3669,3660,3611,3585,3675,3581,3677,3603,3756,3595,3464,3666,3592,3723,3650,3658,3672,3632,3680,3691,3708,3583,3672,3641,3722,3759,3600,3817,3690,3631,3676,3685,3737,3679,3644,3657,3836,3660,3600,3607,3602,3568,3583,3732,3620,3722,3656,3723,3700,3730,3754,3604,3674,3699,3757,3688,3746,3650,3654,3665,3662,3601,3673,3598,3695,3662,3612,3728,3641,3714,3596,3727,3557,3578,3603,3573,3691,3728,3705,3719,3611,3783,3590,3555,3673,3650,3643,3533,3748,3564,3658,3633,3589,3617,3560,3613,3609,3656,3790,3670,3624,3716,3600,3496,3649,3706,3673,3697,3555,3602,3572,3711,3603,3622,3621,3623,3576,3541,3703,3693,3648,3684,3732,3588,3641,3674,3630,3640,3555,3642,3579,3650,3738,3683,3650,3696,3761,3621,3676,3560,3686,3717,3679,3624,3722,3584,3711,3673,3741,3729,3626,3693,3737,3638,3706,3670,3717,3749,3634,3667,3717,3733,3707,3650,3738,3622,3701,3807,3665,3741,3706,3670,3730,3691,3574,3660,3599,3624,3715,3740,3570,3692,3597,3622,3599,3675,3719,3694,3638,3604,3568,3651,3646,3701,3630,3649,3718,3683,3752,3632,3615,3695,3722,3666,3639,3607,3698,3637,3724,3586,3623,3587,3584,3709,3696,3653,3686,3568,3672,3701,3694,3642,3589,3618,3705,3694,3572,3574,3764,3714,3696,3688,3676,3633,3721,3579,3733,3737,3625,3661,3593,3725,3640,3695,3632,3715,3708,3635,3732,3554,3534,3692,3614,3636,3647,3653,3650,3672,3638,3703,3544,3668,3634,3643,3599,3586,3715,3751,3679,3576,3608,3612,3675,3708,3634,3616,3651,3747,3723,3617,3589,3656,3660,3602,3637,3720,3717,3723,3783,3696,3707,3630,3621,3622,3728,3595,3613,3672,3645,3607,3631,3645,3565,3766,3665,3660,3568,3686,3599,3565,3621,3669,3727,3606,3647,3709,3609,3675,3605,3587,3637,3618,3677,3670,3658,3595,3683,3704,3708,3739,3619,3682,3562,3717,3547,3693,3652,3722,3674,3677,3653,3579,3605,3646,3589,3715,3667,3667,3670,3672,3798,3640,3584,3671,3691,3614,3592,3671,3760,3675,3701,3609,3688,3595,3622,3757,3548,3743,3661,3658,3645,3665,3639,3648,3635,3605,3664,3666,3532,3657,3677,3685,3684,3594,3716,3760,3692,3787,3652,3695,3815,3759,3652,3621,3648,3646,3660,3598,3682,3597,3659,3756,3764,3639,3663,3694,3764,3677,3629,3768,3661,3623,3742,3623,3615,3722,3701,3762,3697,3758,3579,3553,3640,3677,3656,3688,3609,3736,3648,3650,3607,3541,3585,3640,3599,3704,3659,3712,3689,3626,3697,3628,3626,3661,3668,3751,3692,3721,3599,3718,3730,3547,3538,3814,3676,3702,3635,3595,3627,3642,3700,3717,3738,3645,3610,3666,3543,3514,3655,3519,3698,3654,3726,3648,3753,3691,3674,3658,3608,3688,3660,3672,3731,3703,3655,3663,3666,3684,3638,3696,3579,3670,3646,3591,3655,3684,3722,3731,3662,3786,3716,3639,3674,3664,3715,3638,3681,3683,3701,3653,3772,3755,3718,3677,3632,3580,3583,3686,3642,3623,3600,3643,3681,3691,3632,3757,3629,3515,3581,3608,3664,3588,3729,3649,3664,3852,3643,3656,3707,3630,3615,3595,3647,3707,3618,3621,3766,3693,3671,3833,3609,3663,3681,3668,3651,3669,3655,3570,3728,3617,3720,3679,3678,3557,3594,3556,3670,3709,3719,3626,3765,3652,3717,3680,3686,3731,3696,3698,3718,3611,3642,3708,3698,3709,3784,3647,3762,3706,3689,3626,3559,3695,3683,3792,3679,3627,3728,3803,3714,3580,3706,3679,3632,3674,3700,3664,3679,3735,3674,3692,3714,3712,3575,3690,3666,3639,3541,3741,3579,3781,3676,3685,3683,3557,3768,3769,3666,3791,3604,3716,3688,3649,3722,3569,3597,3615,3646,3743,3668,3698,3736,3786,3744,3704,3609,3641,3742,3653,3648,3765,3618,3607,3641,3635,3594,3717,3715,3679,3630,3666,3606,3656,3656,3616,3557,3654,3674,3492,3653,3620,3585,3519,3655,3661,3623,3605,3713,3671,3627,3717,3686,3726,3666,3684,3620,3638,3615,3634,3601,3646,3657,3669,3649,3652,3637,3739,3684,3697,3776,3627,3782,3712,3631,3709,3634,3617,3636,3655,3702,3605,3724,3727,3629,3624,3697,3662,3614,3636,3588,3580,3726,3652,3682,3713,3714,3697,3627,3660,3732,3602,3621,3735,3663,3734,3682,3648,3636,3596,3735,3714,3742,3606,3707,3610,3589,3562,3636,3713,3627,3630,3700,3675,3587,3692,3577,3590,3740,3681,3726,3727,3621,3664,3613,3702,3717,3627,3664,3717,3694,3584,3618,3742,3752,3630,3745,3754,3714,3546,3626,3606,3639,3628,3722,3676,3616,3727,3613,3497,3651,3608,3694,3715,3701,3687,3661,3556,3679,3775,3724,3670,3683,3586,3673,3733,3614,3713,3654,3678,3585,3669,3629,3635,3536,3667,3692,3637,3819,3747,3684,3625,3587,3644,3739,3660,3650,3568,3647,3766,3690,3775,3690,3788,3730,3801,3748,3714,3722,3608,3795,3718,3673,3722,3668,3687,3783,3580,3641,3689,3584,3657,3631,3684,3752,3631,3664,3664,3728,3688,3661,3656,3680,3639,3506,3565,3560,3753,3810,3571,3709,3737,3753,3702,3627,3720,3727,3646,3657,3667,3634,3669,3726,3717,3693,3640,3582,3569,3717,3689,3639,3753,3759,3716,3575,3737,3614,3738,3637,3562,3750,3570,3582,3723,3727,3771,3612,3644,3684,3639,3619,3620,3689,3658,3564,3710,3619,3580,3660,3666,3624,3597,3646,3654,3540,3634,3687,3714,3585,3696,3768,3668,3659,3656,3565,3650,3616,3615,3600,3687,3692,3661,3582,3619,3623,3548,3665,3675,3690,3685,3610,3566,3657,3579,3676,3798,3722,3579,3635,3701,3648,3726,3709,3636,3718,3719,3745,3584,3645,3695,3617,3668,3783,3738,3705,3670,3744,3705,3632,3647,3716,3582,3763,3767,3743,3693,3635,3824,3586,3556,3642,3638,3740,3542,3735,3701,3683,3711,3688,3675,3719,3744,3600,3795,3755,3607,3692,3557,3621,3718,3602,3627,3701,3716,3713,3642,3637,3604,3594,3670,3618,3654,3635,3719,3663,3563,3583,3721,3688,3603,3641,3684,3574,3661,3654,3535,3630,3625,3673,3734,3617,3622,3679,3680,3673,3669,3747,3668,3699,3569,3635,3653,3628,3662,3619,3637,3607,3703,3642,3573,3684,3743,3630,3732,3655,3607,3699,3855,3555,3612,3682,3646,3658,3701,3663,3647,3681,3598,3598,3540,3754,3534,3636,3623,3650,3624,3779,3598,3657,3699,3626,3541,3680,3618,3593,3776,3655,3571,3772,3725,3633,3541,3747,3715,3630,3682,3687,3646,3668,3618,3684,3610,3584,3700,3764,3626,3731,3610,3776,3608,3591,3742,3687,3562,3452,3670,3699,3695,3670,3689,3722,3609,3614,3571,3718,3733,3701,3664,3761,3622,3648,3727,3722,3606,3651,3655,3592,3507,3661,3675,3493,3662,3588,3665,3624,3700,3675,3827,3578,3713,3783,3650,3628,3654,3592,3679,3528,3671,3811,3745,3661,3692,3617,3724,3652,3647,3753,3640,3709,3688,3705,3726,3668,3586,3678,3602,3715,3600,3717,3723,3786,3719,3697,3689,3652,3582,3646,3774,3613,3725,3631,3564,3527,3735,3672,3620,3658,3676,3752,3663,3585,3629,3674,3569,3621,3662,3653,3618,3675,3686,3701,3725,3625,3651,3555,3649,3693,3727,3607,3644,3704,3674,3606,3690,3611,3659,3685,3527,3756,3776,3627,3554,3718,3768,3684,3620,3640,3617,3630,3698,3609,3637,3678,3624,3591,3780,3709,3669,3617,3712,3447,3603,3670,3705,3660,3675,3639,3672,3689,3544,3696,3567,3571,3791,3642,3718,3584,3610,3687,3712,3648,3612,3666,3556,3715,3697,3729,3679,3654,3693,3694,3759,3706,3703,3634,3827,3683,3722,3643,3676,3596,3751,3660,3664,3682,3746,3654,3650,3752,3668,3677,3730,3721,3620,3657,3706,3676,3606,3627,3621,3657,3750,3581,3675,3642,3690,3554,3585,3560,3658,3622,3754,3683,3687,3626,3587,3584,3637,3668,3704,3707,3715,3662,3710,3608,3785,3613,3563,3531,3612,3706,3658,3667,3697,3647,3746,3752,3529,3700,3666,3748,3723,3642,3722,3736,3664,3702,3598,3723,3685,3727,3705,3753,3675,3728,3562,3721,3731,3713,3712,3628,3787,3695,3706,3653,3618,3707,3685,3620,3614,3660,3620,3631,3598,3536,3740,3722,3593,3675,3686,3709,3634,3619,3660,3638,3655,3805,3714,3583,3656,3661,3659,3700,3762,3655,3669,3619,3573,3760,3749,3585,3619,3692,3628,3623,3634,3662,3655,3571,3582,3559,3615,3636,3646,3636,3601,3610,3775,3622,3660,3739,3702,3648,3644,3635,3588,3686,3660,3584,3627,3575,3567,3667,3551,3674,3695,3754,3686,3589,3571,3672,3737,3697,3567,3610,3669,3605,3647,3652,3646,3686,3701,3743,3654,3728,3689,3710,3757,3711,3636,3699,3621,3677,3617,3577,3675,3676,3634,3609,3664,3635,3615,3639,3536,3696,3636,3686,3702,3602,3620,3696,3626,3719,3664,3630,3559,3646,3525,3664,3702,3684,3831,3680,3591,3634,3596,3614,3572,3714,3692,3700,3689,3661,3538,3607,3740,3627,3653,3662,3691,3645,3663,3709,3658,3634,3617,3687,3544,3729,3557,3621,3608,3595,3655,3504,3677,3671,3771,3665,3669,3713,3603,3703,3629,3726,3697,3646,3716,3649,3545,3585,3585,3615,3694,3571,3740,3614,3550,3472,3701,3573,3640,3650,3653,3644,3713,3639,3644,3835,3653,3704,3681,3619,3630,3548,3605,3602,3730,3591,3556,3674,3676,3630,3676,3586,3674,3633,3659,3630,3735,3663,3449,3722,3678,3702,3613,3730,3750,3608,3687,3656,3814,3698,3707,3733,3633,3645,3773,3713,3626,3681,3649,3635,3614,3625,3780,3652,3583,3668,3647,3632,3490,3700,3692,3650,3677,3739,3662,3780,3634,3711,3589,3673,3664,3520,3636,3573,3629,3613,3667,3680,3599,3729,3696,3695,3700,3674,3632,3587,3616,3626,3642,3666,3605,3638,3683,3708,3587,3680,3705,3726,3684,3621,3659,3616,3751,3576,3688,3676,3668,3672,3678,3714,3704,3677,3553,3738,3670,3682,3758,3634,3621,3552,3657,3621,3748,3675,3649,3649,3550,3653,3705,3702,3644,3730,3772,3690,3432,3652,3541,3617,3670,3641,3690,3625,3566,3726,3651,3798,3693,3675,3589,3682,3630,3660,3692,3617,3687,3670,3646,3647,3661,3595,3644,3664,3666,3630,3639,3708,3754,3623,3692,3748,3751,3636,3563,3632,3679,3586,3734,3547,3733,3726,3737,3595,3761,3651,3630,3653,3685,3743,3641,3711,3629,3728,3750,3643,3612,3709,3645,3722,3664,3650,3619,3725,3755,3704,3770,3668,3635,3698,3622,3652,3675,3619,3604,3743,3681,3594,3602,3637,3673,3626,3580,3688,3604,3617,3686,3709,3610,3692,3610,3714,3680,3745,3684,3760,3621,3643,3575,3714,3758]},{"counters":[3746,3600,3669,3691,3644,3633,3643,3676,3643,3659,3671,3624,3692,3601,3678,3660,3716,3665,3599,3684,3816,3546,3594,3746,3662,3673,3596,3668,3663,3687,3730,3628,3608,3676,3657,3726,3621,3660,3589,3651,3680,3617,3662,3680,3605,3623,3627,3687,3605,3641,3697,3659,3652,3602,3747,3684,3772,3623,3644,3669,3705,3614,3740,3753,3648,3585,3709,3632,3671,3785,3670,3694,3648,3595,3610,3722,3648,3681,3740,3663,3661,3662,3692,3704,3682,3690,3606,3608,3565,3713,3637,3628,3738,3607,3613,3720,3630,3679,3670,3565,3525,3680,3768,3602,3623,3607,3628,3711,3648,3661,3683,3634,3665,3717,3650,3636,3647,3691,3574,3843,3631,3670,3607,3692,3746,3704,3777,3752,3631,3579,3690,3551,3662,3748,3698,3652,3586,3741,3785,3681,3657,3672,3723,3642,3592,3660,3655,3650,3680,3641,3687,3666,3674,3610,3676,3558,3626,3597,3751,3662,3604,3756,3602,3626,3674,3669,3558,3619,3731,3752,3658,3735,3675,3720,3659,3591,3708,3558,3612,3685,3770,3462,3675,3597,3501,3753,3731,3705,3667,3660,3659,3687,3573,3638,3660,3649,3603,3597,3647,3663,3742,3701,3728,3802,3667,3649,3763,3686,3550,3642,3651,3578,3576,3665,3610,3600,3632,3717,3636,3617,3582,3682,3608,3647,3747,3716,3681,3711,3675,3705,3703,3564,3750,3558,3582,3669,3529,3593,3629,3663,3673,3551,3608,3641,3712,3696,3562,3643,3647,3740,3785,3625,3693,3689,3629,3728,3726,3739,3632,3689,3646,3747,3661,3613,3614,3660,3646,3606,3626,3667,3637,3565,3577,3604,3657,3673,3643,3684,3579,3583,3677,3701,3652,3581,3736,3692,3692,3619,3690,3734,3734,3650,3698,3601,3618,3557,3787,3548,3722,3556,3667,3678,3792,3559,3716,3741,3666,3623,3693,3731,3644,3605,3550,3629,3655,3679,3588,3756,3547,3550,3663,3678,3709,3709,3679,3682,3605,3622,3664,3690,3642,3675,3563,3575,3817,3650,3646,3612,3682,3644,3603,3648,3571,3735,3701,3734,3637,3706,3639,3685,3733,3593,3630,3728,3750,3731,3727,3635,3645,3644,3762,3720,3579,3622,3695,3569,3788,3803,3586,3726,3513,3668,3735,3634,3615,3639,3554,3707,3708,3619,3881,3627,3613,3654,3569,3694,3716,3692,3757,3622,3634,3714,3671,3600,3612,3776,3742,3576,3524,3550,3712,3645,3570,3588,3554,3564,3612,3620,3565,3567,3689,3650,3714,3664,3680,3669,3618,3761,3747,3658,3555,3664,3669,3621,3663,3653,3611,3694,3626,3678,3607,3698,3603,3758,3606,3627,3588,3622,3757,3630,3734,3637,3746,3679,3566,3635,3636,3655,3774,3671,3645,3734,3724,3617,3678,3702,3702,3608,3623,3689,3728,3595,3756,3590,3676,3779,3647,3680,3737,3594,3643,3648,3660,3717,3642,3710,3701,3665,3604,3549,3588,3649,3631,3620,3617,3712,3700,3644,3563,3655,3609,3678,3662,3564,3616,3609,3530,3717,3639,3640,3635,3703,3553,3712,3713,3627,3708,3717,3663,3636,3623,3674,3633,3672,3641,3623,3604,3700,3734,3719,3670,3670,3677,3633,3645,3724,3756,3698,3720,3846,3643,3615,3739,3580,3680,3648,3658,3626,3660,3678,3542,3647,3717,3602,3668,3599,3734,3740,3684,3641,3676,3745,3652,3672,3687,3737,3643,3622,3684,3563,3662,3687,3654,3702,3706,3610,3664,3653,3671,3662,3631,3657,3581,3654,3652,3604,3703,3529,3582,3671,3786,3701,3676,3704,3656,3575,3625,3750,3633,3706,3601,3641,3802,3701,3675,3633,3665,3728,3661,3665,3669,3561,3634,3696,3643,3647,3635,3626,3722,3655,3582,3686,3736,3666,3654,3629,3805,3702,3640,3646,3803,3693,3699,3593,3630,3598,3704,3732,3689,3658,3674,3743,3719,3671,3644,3572,3578,3569,3678,3644,3677,3521,3629,3776,3715,3692,3697,3642,3627,3617,3648,3735,3773,3698,3734,3784,3648,3725,3600,3752,3727,3704,3673,3664,3702,3730,3631,3613,3658,3697,3722,3707,3656,3692,3628,3595,3687,3593,3682,3671,3668,3662,3770,3719,3708,3614,3703,3621,3646,3713,3661,3622,3691,3861,3680,3689,3687,3702,3720,3695,3743,3696,3738,3577,3652,3529,3560,3686,3608,3643,3701,3655,3766,3649,3655,3570,3645,3631,3685,3662,3645,3780,3638,3677,3687,3523,3612,3692,3635,3647,3666,3678,3520,3594,3590,3677,3699,3724,3561,3745,3710,3688,3574,3672,3659,3652,3719,3727,3691,3729,3749,3478,3640,3693,3769,3629,3677,3688,3573,3676,3666,3735,3753,3749,3709,3692,3765,3734,3714,3734,3690,3652,3696,3681,3771,3682,3668,3653,3623,3693,3812,3707,3709,3596,3768,3644,3664,3688,3685,3732,3621,3615,3621,3791,3631,3721,3593,3707,3680,3632,3659,3782,3737,3635,3669,3564,3779,3599,3571,3662,3711,3641,3624,3734,3747,3665,3667,3648,3580,3725,3614,3810,3712,3672,3728,3647,3666,3654,3581,3731,3679,3614,3711,3580,3679,3726,3621,3679,3706,3619,3662,3688,3634,3639,3715,3575,3603,3667,3614,3628,3692,3749,3551,3688,3678,3760,3652,3644,3674,3606,3745,3585,3554,3678,3688,3577,3733,3644,3659,3657,3562,3649,3713,3702,3620,3695,3529,3695,3706,3674,3620,3558,3740,3620,3618,3670,3620,3665,3587,3658,3716,3674,3661,3752,3524,3640,3631,3652,3791,3735,3587,3714,3583,3610,3677,3710,3577,3697,3515,3624,3728,3652,3766,3594,3746,3725,3679,3718,3741,3580,3645,3620,3784,3594,3602,3669,3680,3643,3648,3513,3681,3521,3535,3699,3710,3665,3737,3656,3671,3702,3676,3658,3648,3635,3634,3581,3639,3708,3675,3682,3724,3647,3643,3612,3640,3649,3612,3642,3687,3651,3748,3608,3621,3631,3580,3506,3615,3711,3630,3661,3596,3637,3676,3652,3606,3621,3679,3633,3710,3641,3645,3524,3709,3612,3535,3612,3622,3685,3660,3663,3769,3729,3745,3656,3602,3562,3713,3638,3671,3712,3623,3609,3652,3766,3780,3744,3659,3748,3664,3639,3641,3634,3726,3647,3611,3698,3554,3671,3606,3619,3637,3668,3683,3717,3699,3717,3686,3739,3586,3684,3601,3712,3533,3644,3734,3555,3595,3585,3638,3647,3739,3686,3748,3664,3606,3765,3697,3652,3702,3706,3652,3747,3649,3788,3559,3753,3689,3658,3658,3780,3616,3629,3656,3691,3650,3640,3593,3685,3622,3671,3645,3702,3619,3514,3653,3718,3595,3755,3598,3620,3765,3725,3637,3689,3749,3725,3740,3677,3635,3712,3682,3664,3680,3624,3677,3561,3693,3663,3614,3661,3616,3632,3708,3627,3571,3689,3868,3681,3685,3681,3603,3707,3565,3822,3806,3682,3523,3632,3661,3680,3596,3650,3645,3626,3665,3654,3652,3705,3572,3605,3666,3698,3637,3667,3762,3651,3738,3773,3658,3660,3640,3649,3690,3572,3631,3707,3643,3706,3615,3646,3732,3735,3719,3624,3678,3652,3722,3576,3593,3814,3584,3675,3741,3649,3679,3653,3703,3667,3682,3617,3632,3765,3646,3611,3661,3609,3653,3727,3703,3646,3742,3761,3659,3705,3785,3641,3695,3720,3584,3681,3694,3682,3631,3729,3652,3674,3669,3726,3715,3690,3683,3610,3747,3696,3608,3698,3654,3615,3734,3567,3671,3616,3606,3770,3546,3699,3627,3605,3608,3637,3663,3585,3717,3571,3628,3581,3689,3595,3659,3757,3712,3682,3579,3615,3681,3533,3621,3707,3718,3669,3597,3713,3668,3613,3706,3557,3652,3663,3746,3629,3776,3573,3675,3658,3798,3674,3574,3667,3665,3694,3701,3587,3645,3691,3660,3703,3684,3639,3673,3739,3796,3568,3736,3857,3580,3625,3639,3663,3687,3526,3756,3568,3755,3707,3743,3684,3700,3735,3602,3630,3603,3515,3649,3612,3635,3679,3697,3657,3620,3719,3756,3704,3671,3656,3700,3634,3687,3654,3602,3646,3659,3723,3631,3601,3737,3706,3629,3655,3544,3673,3620,3620,3596,3604,3628,3722,3717,3556,3625,3629,3730,3604,3680,3627,3714,3722,3694,3786,3686,3570,3624,3739,3704,3631,3672,3621,3655,3648,3777,3757,3690,3668,3658,3688,3684,3584,3721,3610,3686,3615,3650,3635,3623,3788,3626,3638,3616,3680,3641,3624,3640,3627,3623,3639,3663,3640,3656,3710,3704,3675,3686,3671,3599,3672,3599,3684,3704,3554,3626,3559,3690,3715,3756,3580,3626,3663,3651,3570,3701,3566,3600,3570,3669,3637,3574,3551,3738,3615,3621,3635,3668,3680,3730,3590,3609,3621,3616,3644,3726,3647,3637,3643,3632,3620,3606,3616,3793,3659,3666,3693,3767,3679,3620,3595,3603,3663,3760,3646,3732,3657,3682,3639,3649,3674,3628,3544,3691,3714,3645,3644,3669,3751,3611,3606,3607,3606,3766,3635,3760,3624,3641,3595,3596,3498,3654,3547,3569,3584,3691,3607,3702,3617,3553,3749,3590,3738,3565,3734,3663,3692,3635,3739,3566,3596,3714,3607,3757,3608,3672,3731,3761,3736,3623,3738,3574,3674,3680,3673,3634,3576,3633,3610,3662,3702,3601,3563,3630,3683,3734,3681,3669,3652,3551,3648,3707,3680,3728,3689,3552,3565,3644,3637,3702,3684,3560,3561,3656,3757,3520,3658,3666,3692,3759,3660,3760,3688,3657,3721,3511,3732,3658,3545,3628,3645,3800,3621,3733,3739,3552,3548,3706,3545,3651,3711,3651,3747,3661,3709,3685,3693,3643,3637,3753,3646,3606,3767,3661,3673,3714,3672,3706,3623,3603,3655,3642,3656,3650,3685,3665,3595,3579,3642,3554,3694,3683,3757,3653,3681,3641,3582,3706,3618,3648,3724,3683,3718,3695,3673,3567,3751,3724,3624,3691,3719,3728,3562,3662,3713,3652,3594,3750,3708,3672,3643,3667,3601,3746,3676,3609,3695,3648,3636,3648,3609,3674,3721,3634,3635,3647,3802,3644,3585,3596,3578,3657,3741,3733,3680,3713,3528,3735,3753,3733,3755,3683,3650,3674,3628,3741,3616,3600,3688,3650,3710,3618,3651,3628,3713,3739,3615,3590,3630,3649,3725,3688,3747,3710,3579,3627,3722,3557,3662,3606,3629,3649,3729,3701,3590,3624,3716,3590,3634,3587,3696,3634,3566,3641,3633,3589,3627,3664,3695,3662,3746,3607,3743,3611,3663,3620,3642,3700,3630,3589,3645,3637,3649,3684,3682,3593,3589,3655,3693,3557,3720,3628,3661,3741,3741,3686,3701,3733,3612,3593,3674,3713,3721,3670,3778,3664,3678,3774,3690,3627,3597,3651,3588,3515,3634,3635,3689,3693,3694,3617,3681,3652,3554,3586,3739,3617,3695,3601,3811,3639,3677,3598,3773,3620,3637,3710,3726,3695,3673,3581,3709,3701,3654,3558,3596,3609,3667,3659,3613,3570,3760,3692,3616,3651,3649,3739,3629,3652,3686,3605,3703,3612,3592,3626,3571,3650,3695,3737,3699,3645,3661,3639,3736,3700,3756,3558,3640,3703,3643,3470,3691,3753,3621,3652,3614,3605,3626,3680,3632,3738,3737,3731,3756,3638,3737,3805,3805,3613,3804,3774,3581,3694,3629,3596,3700,3639,3710,3677,3558,3726,3788,3709,3669,3693,3707,3707,3675,3758,3649,3667,3546,3741,3642,3711,3596,3625,3652,3823,3692,3532,3667,3642,3639,3626,3724,3684,3628,3600,3694,3741,3785,3571,3698,3622,3580,3676,3680,3678,3623,3681,3647,3701,3691,3724,3751,3662,3811,3679,3624,3639,3651,3633,3585,3662,3547,3761,3708,3757,3609,3695,3666,3660,3682,3664,3596,3713,3747,3723,3763,3582,3662,3671,3652,3593,3633,3690,3741,3681,3661,3581,3651,3643,3611,3794,3628,3713,3707,3689,3653,3718,3683,3744,3680,3631,3697,3691,3617,3687,3610,3606,3668,3786,3697,3618,3741,3617,3568,3772,3787,3699,3695,3550,3710,3586,3672,3600,3627,3645,3630,3630,3641,3678,3707,3706,3723,3679,3683,3628,3690,3518,3748,3742,3670,3656,3677,3576,3714,3603,3583,3649,3658,3566,3725,3616,3665,3715,3667,3762,3706,3627,3682,3743,3664,3637,3781,3598,3679,3657,3694,3595,3698,3723,3771,3666,3646,3553,3679,3767,3577,3538,3655,3613,3732,3604,3697,3655,3699,3670,3689,3643,3626,3642,3684,3757,3632,3653,3588,3634,3685,3594,3641,3607,3701,3672,3714,3606,3694,3658,3680,3871,3587,3662,3783,3638,3576,3682,3611,3642,3632,3705,3753,3641,3697,3534,3653]}]},"null_count":0,"tot_col_size":127500000,"last_update_version":401695328018104322}},"indices":{},"count":7500000,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/lineitem.json b/cmd/explaintest/s/tpch_stats/lineitem.json deleted file mode 100644 index 5045c2d71ea4a..0000000000000 --- a/cmd/explaintest/s/tpch_stats/lineitem.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"lineitem","columns":{"l_comment":{"histogram":{"ndv":108199936,"buckets":[{"count":1200023,"lower_bound":"IGFib3V0IHRoZSBibGl0aGVseSBpcg==","upper_bound":"IGFjY291bnRzIGRldGVjdCBjYXJl","repeats":2},{"count":2400046,"lower_bound":"IGFjY291bnRzIGVhdCBjYXJlZnVsbHkgYWJvdXQg","upper_bound":"IGFmZml4IHJlZ3VsYXIsIGV2ZW4gZXhj","repeats":2},{"count":3600069,"lower_bound":"IGFmZml4LiBleHByZXNzLCB1bnVz","upper_bound":"IGFsb25nc2lkZSBvZiB0aGUgZnVyaW91c2x5IGZpbmFsIGFjY291","repeats":2},{"count":4800092,"lower_bound":"IGFsb25nc2lkZSBvZiB0aGUgcXVpY2ts","upper_bound":"IGFyb3VuZCB0aGUgaXJvbmljLCBldmVuIHI=","repeats":2},{"count":6000116,"lower_bound":"IGFyb3VuZCB0aGUgcnV0aGxlc3NseSB1bnVzdWE=","upper_bound":"IGJsaXRoZWx5IGFjY29yZGluZyB0byB0aGUgaWRlYXMuIGNhcmVm","repeats":2},{"count":7200139,"lower_bound":"IGJsaXRoZWx5IGFnYWk=","upper_bound":"IGJsaXRoZWx5LiBjYXJlZnU=","repeats":2},{"count":8400162,"lower_bound":"IGJsaXRoZWx5LiBmaW5hbGx5IGJvbGQg","upper_bound":"IGJvb3N0IGZ1cmlvdXM=","repeats":2},{"count":9630186,"lower_bound":"IGJvb3N0IGZ1cmlvdXNseS4gYmxpdGhlbHkgcGVuZGluZw==","upper_bound":"IGNhcmVmdWxseSA=","repeats":30002},{"count":10830209,"lower_bound":"IGNhcmVmdWxseSBh","upper_bound":"IGNhcmVmdWxseS4gZmx1ZmZpbHkgZXZlbiBkZQ==","repeats":2},{"count":12030233,"lower_bound":"IGNhcmVmdWxseS4gZnVyaW91c2x5IGZpbmFs","upper_bound":"IGRlcG9zaXRzIGNham9sZS4gY2FyZWZ1bGx5IA==","repeats":2},{"count":13230256,"lower_bound":"IGRlcG9zaXRzIGNham9sZS4gcmVn","upper_bound":"IGRlcG9zaXRzPyBhY2NvdW50cyB3aWxsIGhhdmUgdG8gaGluZGVyIA==","repeats":2},{"count":14430279,"lower_bound":"IGRldGVjdCBhY2NvcmRpbmcgdG8gdA==","upper_bound":"IGV2ZW4gaWRlYXMgYm9vc3QgYWNjb3JkaW5nIHRvIHRoZSBpcm9uaWM=","repeats":2},{"count":15630302,"lower_bound":"IGV2ZW4gaW5zdHJ1Y3Rpb25zIGhhZw==","upper_bound":"IGV4cHJlc3MgdGhlb2RvbGl0ZXMgcG9hY2ggYW1vbmcgdGhlIGlyb25p","repeats":2},{"count":16830325,"lower_bound":"IGV4cHJlc3MgdGhlb2RvbGl0ZXMuIGJsaXRoZQ==","upper_bound":"IGZpbmFsbHkgaXJvbmljIGRlcG9zaXRzIA==","repeats":2},{"count":18030349,"lower_bound":"IGZpbmFsbHkgc2lsZW50IHJlcXVlc3Rz","upper_bound":"IGZveGVzLiBmdXJpb3VzbHkgc3BlY2lhbCBwYWNrYQ==","repeats":2},{"count":19230372,"lower_bound":"IGZveGVzLiBpcm9uaWMsIHJlZ3VsYXIg","upper_bound":"IGZ1cmlvdXNseSBy","repeats":2},{"count":20430395,"lower_bound":"IGZ1cmlvdXNseSByZWd1bGE=","upper_bound":"IGlkZWFzLiBzbHlseSBj","repeats":2},{"count":21630418,"lower_bound":"IGlkZWFzLiBzbHlseSBmaW5hbA==","upper_bound":"IGludGVncmF0ZSEgcGludG8gYmVhbnMgYWJv","repeats":2},{"count":22830442,"lower_bound":"IGlyb25pYyBhY2NvdW50cyA=","upper_bound":"IGlyb25pY2FsbHkgcGVuZGluZyBkZQ==","repeats":2},{"count":24030465,"lower_bound":"IGtpbmRsZSBjYXJlZnVsbHkgYWxvbmdzaWRlIG9mIHQ=","upper_bound":"IHBhY2thZ2VzIGFmdGVyIHRoZSByZWd1bGFyIHBhY2thZw==","repeats":2},{"count":25230488,"lower_bound":"IHBhY2thZ2VzIGFnYWluc3QgdGhl","upper_bound":"IHBlbmRpbmcgZGVwb3NpdHMgYQ==","repeats":2},{"count":26430511,"lower_bound":"IHBlbmRpbmcgZGVwb3NpdHMuIHF1aWNrbHkgdW51c3VhbCA=","upper_bound":"IHBsYXRlbGV0cyB3YWtlIHF1aWNrbHkgYWNyb3Nz","repeats":2},{"count":27630535,"lower_bound":"IHBsYXRlbGV0cy4gY2FyZWZ1bGx5IGlyb25pYyBwYWNrYWdlcyB1c2Ug","upper_bound":"IHJlZ3VsYXIgY291cnRzIGFmdGVyIHRoZSBmdQ==","repeats":2},{"count":28830558,"lower_bound":"IHJlZ3VsYXIgY291cnRzIGhh","upper_bound":"IHJlZ3VsYXIsIGlyb25p","repeats":2},{"count":30030581,"lower_bound":"IHJlZ3VsYXIsIGlyb25pYyBicmFpZHMuIHNwZWNpYWwgZGVwZW5kZW5jaQ==","upper_bound":"IHJlcXVlc3RzLiBxdWlja2x5IHBlbmRpbmcgZ2lmdHMgdXNlIGNhcmU=","repeats":2},{"count":31230604,"lower_bound":"IHJlcXVlc3RzLiByZWc=","upper_bound":"IHNsZWVwIGZ1cmlvdXNseSBmdXJpb3VzbHk=","repeats":2},{"count":32430628,"lower_bound":"IHNsZWVwIGZ1cmlvdXNseSBmdXJpb3VzbHkgZXZlbiBmb3hlcw==","upper_bound":"IHNseWx5IGZsdWZmeSBkZXBvc2l0cw==","repeats":2},{"count":33630651,"lower_bound":"IHNseWx5IGZ1cmlvdXNseSBlbg==","upper_bound":"IHNvbWFzLiBxdWlja2x5IHJlZ3VsYXIgdGhlb2RvbGl0ZQ==","repeats":2},{"count":34830674,"lower_bound":"IHNvbWV0aW1lcy4gcXVpY2tseSBzcGU=","upper_bound":"IHRoZSBibGl0aGVseSBpcm9uaWMgaWRlYXMu","repeats":2},{"count":36030697,"lower_bound":"IHRoZSBibGl0aGVseSBwZW5kaW5nIGluc3RydWN0aW9ucy4gc2w=","upper_bound":"IHRoZSBmaW5hbCB0aGVvZA==","repeats":2},{"count":37230721,"lower_bound":"IHRoZSBmaW5hbCw=","upper_bound":"IHRoZSByZXF1ZXM=","repeats":2},{"count":38430744,"lower_bound":"IHRoZSBydXRobGVzc2x5IGJyYXZlIGZveGVzLiBzbHlseSBwZQ==","upper_bound":"IHVudXN1YWwgYXN5bXB0b3RlcyBzaW5jZSB0aGUg","repeats":2},{"count":39630767,"lower_bound":"IHVudXN1YWwgZGVjb3lzIGM=","upper_bound":"IHdha2UgZnVyaW91c2x5LiBw","repeats":2},{"count":40830790,"lower_bound":"IHdha2UgcXVpY2tseSBmbHVmZmlseSBldmVuIGFjY291bnRz","upper_bound":"LCBzcGVjaWFsIGlkZWFzIHdha2UgYWZ0ZXIgdGhlIGNhcmVmdWxs","repeats":2},{"count":42030814,"lower_bound":"LCBzcGVjaWFsIHBhdHRlcm5zLiBxdWlldGx5IHJlZ3VsYXIgdGg=","upper_bound":"LiBjYXJlZnVsbHkgcmVndWxhciBmb3JnZXMgd2FrZSBmdXJpb3U=","repeats":2},{"count":43230837,"lower_bound":"LiBjYXJlZnVsbHkgcmVndWxhciBpZGVhcyB3YWtlIHF1aWNrbHkg","upper_bound":"LiBmdXJpb3VzbHkgaXJvbmljIHRoZW8=","repeats":2},{"count":44430860,"lower_bound":"LiBmdXJpb3VzbHkgcGVuZGluZyBkZQ==","upper_bound":"LiBzbHlseSBmaW5hbCBhY2NvdW50cyBhbG9uZ3NpZGUgb2YgdA==","repeats":2},{"count":45630883,"lower_bound":"LiBzbHlseSBmaW5hbCBwYWNrYWc=","upper_bound":"YWJvdXQgdGhlIGZ1cmlvdXM=","repeats":2},{"count":46830907,"lower_bound":"YWJvdXQgdGhlIGZ1cmlvdXNseSA=","upper_bound":"YWNjb3VudHMgc2w=","repeats":2},{"count":48030930,"lower_bound":"YWNjb3VudHMgc2xlZXAgYmxpdGhl","upper_bound":"YWNrYWdlcyB1bndpbmQgZnVyaW91c2x5IHM=","repeats":2},{"count":49230953,"lower_bound":"YWNrYWdlcyB1c2UgYWNjb3JkaW5nIHQ=","upper_bound":"YWZ0ZXIgdGhlIGZsdWZmaWx5IGlyb25pYyBh","repeats":2},{"count":50430976,"lower_bound":"YWZ0ZXIgdGhlIGZsdWZmaWx5IHNwZWM=","upper_bound":"YWdlcyBlbmdhZ2UuIGRlcGVuZGVuY2k=","repeats":2},{"count":51631000,"lower_bound":"YWdlcyBoYWdnbGUgYWZ0ZXIgdGhlIGJsaXRoZWw=","upper_bound":"YWdnbGUuIHNpbGVudCwgaXJv","repeats":2},{"count":52831023,"lower_bound":"YWlkcy4gcXVpZXQsIGJvbGQgZm94ZXMgYQ==","upper_bound":"YWtlIGFjcm9zcyB0aGUgZmx1ZmZpbHkgYm9sZCBmbw==","repeats":2},{"count":54031046,"lower_bound":"YWtlIGFmdGVyIHRoZSBjYXJlZnVsbHkgaXJvbmljIGRl","upper_bound":"YWwgZGVwb3NpdHMuIGV2ZW4gYWNjb3VudHMgZGV0ZWN0IA==","repeats":2},{"count":55231069,"lower_bound":"YWwgZGVwb3NpdHMuIGZpbmFsLCBleHByZXNzIHBpbnRvIGJlYW5zIGg=","upper_bound":"YWwgcmVxdWVzdHMgY2Fqb2xlIGZ1cmlvdXNseSBzbHlseSByZWc=","repeats":2},{"count":56431093,"lower_bound":"YWwgcmVxdWVzdHMgaGFnZ2xlPyBxdWlj","upper_bound":"YWx3YXlzIGJ1c3kgcmVxdWVzdHMu","repeats":2},{"count":57631116,"lower_bound":"YW1vbmcgdGhlIGJsaXRoZWx5IGZpbmFsIHA=","upper_bound":"YXIgYWNjb3VudHMuIGlyb25pYyByZXF1ZXN0cyBuYWcgZg==","repeats":2},{"count":58831139,"lower_bound":"YXIgYWNjb3VudHMuIHBhY2thZ2VzIGFy","upper_bound":"YXIgdGhlb2RvbGl0ZXMgYXJlIHNseWx5IHJlZ3Vs","repeats":2},{"count":60031162,"lower_bound":"YXIgdGhlb2RvbGl0ZXMgYm9vc3Qgc2x5bHkgZmx1ZmZ5IGNvdQ==","upper_bound":"YXJlZnVsbHkgYXJvdW5kIHRoZSBzbHlseSBpcm8=","repeats":2},{"count":61231186,"lower_bound":"YXJlZnVsbHkgYXJvdW5kIHRoZSBzcGVjaWFsLCA=","upper_bound":"YXJvdW5kIHRoZSBmbHVmZmlseSBpcm9u","repeats":2},{"count":62431209,"lower_bound":"YXJvdW5kIHRoZSBmdXJpb3VzbHkgaQ==","upper_bound":"YXRlIGFib3ZlIHRoZSBldmVuLCByZWd1bGFyIHBpbnRvIGJlYW5z","repeats":2},{"count":63631232,"lower_bound":"YXRlIGFsb25nc2lkZSBvZiB0aGUgZnVyaW91c2x5IGZpbmFsIGRlcA==","upper_bound":"YmVhbnMgZG96ZSBxdWlja2x5IGV4cHJlc3MgcGFjaw==","repeats":2},{"count":64831255,"lower_bound":"YmVhbnMgaGFnZ2xlLiByZWd1bGFyLCBmaW5hbCBwaW4=","upper_bound":"YmxpdGhlbHkgaXJvbmljIHBhY2thZ2VzLiBibGl0aGVseSA=","repeats":2},{"count":66031279,"lower_bound":"YmxpdGhlbHkgaXJvbmljLCBp","upper_bound":"Ym9sZCBwYWNrYWdlcyB3YWtlIHNseWx5IGZpbmFsIGV4Y3VzZQ==","repeats":2},{"count":67231302,"lower_bound":"Ym9sZCBwYWNrYWdlcy4gZXhjdXNlcyBzbGVlcCBmbHVmZg==","upper_bound":"Ym92ZSB0aGUgZmx1","repeats":2},{"count":68431325,"lower_bound":"Ym92ZSB0aGUgcXVpY2ts","upper_bound":"YyByZXF1ZXN0cyBtdXN0IGNham9sZSBhZnRlciB0aGUgYmxpdGhlbHkg","repeats":2},{"count":69661349,"lower_bound":"YyByZXF1ZXN0cyB1c2UgZmx1ZmZpbHkhIHNseWx5IGlyb25pYyByZXF1ZQ==","upper_bound":"Y2FyZWZ1bGx5IA==","repeats":60002},{"count":70861372,"lower_bound":"Y2FyZWZ1bGx5IGFib3V0IHRoZSByZWd1bGFyLCBpcm8=","upper_bound":"Y2FyZWZ1bGx5LiBmdXJpb3VzbHkgc2lsZW50IHM=","repeats":2},{"count":72061395,"lower_bound":"Y2FyZWZ1bGx5LiBxdWlja2x5IGJvbGQgZm94ZXM=","upper_bound":"Y2ggcXVpY2tseSBpcm9uaWMgaW5zdHJ1","repeats":2},{"count":73261419,"lower_bound":"Y2hlcy4gZnVyaW91c2x5IHJlZ3VsYXIgZGVwZW4=","upper_bound":"Y2thZ2VzIGFyZS4gZnVyaW91c2w=","repeats":2},{"count":74461442,"lower_bound":"Y2thZ2VzIGJvb3N0IHNseWx5LiBzbHlseSA=","upper_bound":"Y2tseSBmaW5hbCA=","repeats":2},{"count":75661465,"lower_bound":"Y2tseSBmaW5hbCBkZXBvc2l0cyBhZmZp","upper_bound":"Y291bnRzIGFsb25nIHRoZSB1bnVzdWFsIGlkZWFzIGhhZ2dsZSA=","repeats":2},{"count":76861488,"lower_bound":"Y291bnRzIGFsb25nc2k=","upper_bound":"Y3Jvc3MgdGhlIA==","repeats":2},{"count":78061512,"lower_bound":"Y3Jvc3MgdGhlIGJsaXRoZWx5IHNpbGVudCBhc3ltcHRvdA==","upper_bound":"Y3VzZXMgYWJvdXQgdGhlIGJs","repeats":2},{"count":79261535,"lower_bound":"Y3VzZXMgYWZmaXggYWxvbmdzaWRlIG9mIHRoZSBpcm9uaWMgZGVw","upper_bound":"ZCB0aGUgcGFja2FnZXMuIGNhcmVmdWxseSByZWd1bGFyIGZv","repeats":2},{"count":80461558,"lower_bound":"ZCB0aGVvZG9saXRlcyBpbnRlZ3JhdGUgYWJvdmUg","upper_bound":"ZGVuY2llcyBzbGVlcCBzbHlseSBleHByZXNzIGZveGVzLiBj","repeats":2},{"count":81661581,"lower_bound":"ZGVuY2llcyB0aHJvdWdobw==","upper_bound":"ZGVwb3NpdHMuIHBsYXRlbGV0cyBhcg==","repeats":2},{"count":82861604,"lower_bound":"ZGVwb3NpdHMuIHF1aWNrbHkgaXJvbmljIGlkZWFzIGhhbmc=","upper_bound":"ZGluZywgYm9sZCByZXF1ZXN0cy4gcA==","repeats":2},{"count":84061628,"lower_bound":"ZGluZywgcmVndWxhciBleGN1c2VzIGFsb25ncw==","upper_bound":"ZG9scGhpbnMgYXJvdW5kIHRoZSBldmVuIHBhY2thZ2VzIHdhaw==","repeats":2},{"count":85261651,"lower_bound":"ZG9scGhpbnMgY2Fqb2xlIGFtb25nIHRoZSBkZXBvc2l0cy4gZXhwcmVzcw==","upper_bound":"ZSBibGl0aGVseSBj","repeats":2},{"count":86461674,"lower_bound":"ZSBibGl0aGVseSBjYQ==","upper_bound":"ZSBkZXBvc2l0cyBhZmZpeCBhbG9uZyB0aGUgcXVpYw==","repeats":2},{"count":87661697,"lower_bound":"ZSBkZXBvc2l0cy4=","upper_bound":"ZSBmdXJpb3VzbHkgcmVndQ==","repeats":2},{"count":88861721,"lower_bound":"ZSBmdXJpb3VzbHkgcmVndWxhciBu","upper_bound":"ZSBxdWlja2x5IHJlZ3VsYXI=","repeats":2},{"count":90061744,"lower_bound":"ZSBxdWlja2x5IHNwZWNpYWwgaW5zdHJ1Yw==","upper_bound":"ZSBzbHlseSB1bnVzdWFsIHBpbnRvIGJlYW5zISBpcg==","repeats":2},{"count":91261767,"lower_bound":"ZSBzbHlseS4gYmxpdGhlbHkgYm9sZA==","upper_bound":"ZWFucyBib29zdCBhdCB0aGUgY2E=","repeats":2},{"count":92461790,"lower_bound":"ZWFucyBib29zdCBmdXJpbw==","upper_bound":"ZWNpYWwgZG9scGhpbnMgYm9v","repeats":2},{"count":93661814,"lower_bound":"ZWNpYWwgZXhjdXNlcyBhY3Jvc3MgdGhlIHM=","upper_bound":"ZWVwIGV2ZW4sIGV4cHJlc3MgcGFja2FnZXMuIGRlcG9zaXRzIA==","repeats":2},{"count":94861837,"lower_bound":"ZWVwIGZsdWZmaWx5","upper_bound":"ZWZ1bGx5IGZpbmFsIHA=","repeats":2},{"count":96061860,"lower_bound":"ZWZ1bGx5IGZpbmFsIHBhY2thZ2VzLiBmdXJpb3Vz","upper_bound":"ZWd1bGFyIGRlcGVuZGVuY2llcyBzbGVlcC4gY2Fy","repeats":2},{"count":97261883,"lower_bound":"ZWd1bGFyIGRlcG8=","upper_bound":"ZWd1bGFyIHRoZW9k","repeats":2},{"count":98461907,"lower_bound":"ZWd1bGFyIHRoZW9kb2xp","upper_bound":"ZWx5IGNhcmVmdWxseSBzdGVhbHRoeSBwaW50bw==","repeats":2},{"count":99661930,"lower_bound":"ZWx5IGNsb3NlbHkgc2lsZW50IHBhY2thZ2VzLiBpcm9uaWMgcGVhcg==","upper_bound":"ZW4gYWNjb3VudHMgYm9vc3QgYmxpdGhlbHkgZXhwcmU=","repeats":2},{"count":100861953,"lower_bound":"ZW4gYWNjb3VudHMuIGZ1cmlvdXNseQ==","upper_bound":"ZW5jaWVzLiBxdWlja2x5IGlyb25pYyBmb3hlcyBhcmUgYmxpdGhlbA==","repeats":2},{"count":102061976,"lower_bound":"ZW5jaWVzLiBxdWlja2x5IHJlZ3Vs","upper_bound":"ZW5kaW5nLCBpcm8=","repeats":2},{"count":103262000,"lower_bound":"ZW5kaW5nLCBwZW5kaW4=","upper_bound":"ZXAgYmxpdGhlbHkgcmVndWxhciBwaW50byBiZWFucy4gc2x5bHkgZg==","repeats":2},{"count":104462023,"lower_bound":"ZXAgY2FyZWZ1bGx5IGFsb25nIHRoZSBzaWxlbnQgZG9s","upper_bound":"ZXBvc2l0cyBiZWxpZXZlIGJsaXRoZWx5","repeats":2},{"count":105662046,"lower_bound":"ZXBvc2l0cyBjYWpvbGUg","upper_bound":"ZXF1ZXN0cyBhcmUgYXQgdGhlIA==","repeats":2},{"count":106862069,"lower_bound":"ZXF1ZXN0cyBhcmUgZmx1ZmZpbHkgZXhwcmVzcyBhY2NvdW50cy4gZGVw","upper_bound":"ZXF1ZXN0cy4gcXVpZXRseSBldmVuIHRoZW9kb2xpdGVzIGFibw==","repeats":2},{"count":108062093,"lower_bound":"ZXF1ZXN0cy4gc2x5bHkgYm8=","upper_bound":"ZXMgYXJlOyBxdWlja2x5IHNwZWNpYWwgcmU=","repeats":2},{"count":109262116,"lower_bound":"ZXMgYXQgdGhlIGlybw==","upper_bound":"ZXMgdGhyYXNoIGZ1cmlvdXNseSBmdXJpbw==","repeats":2},{"count":110462139,"lower_bound":"ZXMgdXNlIGJsaXRoZWx5IGFsb25nIHRoZSBldmVuIHNvbWFzLiBmaW5hbA==","upper_bound":"ZXMuIHBlbmRpbg==","repeats":2},{"count":111662162,"lower_bound":"ZXMuIHBpbnRvIGJlYW5zIGRhenpsZSBmdXJpb3VzbHkuIHNseWx5IA==","upper_bound":"ZXN0cyBoYWdnbGUgY2FyZWZ1bGx5LiBjYXJlZnU=","repeats":2},{"count":112862186,"lower_bound":"ZXN0cyBoYWdnbGUgZnVyaW91c2x5IHNpbGVudCwgcmVn","upper_bound":"ZXRzIG1pZ2h0IGhhZ2dsZSBzbHlseSBhdCA=","repeats":2},{"count":114062209,"lower_bound":"ZXRzIG5hZyBmbHVmZmlseS4gZmluYWwsIA==","upper_bound":"ZXZlbiB3YXRlcnMuIGRlcG9zaXRzIHdha2Uu","repeats":2},{"count":115262232,"lower_bound":"ZXZlbiwgaXJvbmljIGRlcG9zaXRzIGNham9sZSBjYXI=","upper_bound":"ZmZpbHkgYm9sZCBwYWNrYWdlcyBl","repeats":2},{"count":116462255,"lower_bound":"ZmZpbHkgY2FyZWZ1bGx5","upper_bound":"ZmlseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIG5hZyBzbHlseSBpZGU=","repeats":2},{"count":117662279,"lower_bound":"ZmlseSBpcm9uaWMgcGFja2FnZXMgZGV0ZWN0LiByZWd1bGFyIHRoZW8=","upper_bound":"ZmluYWwgb3JiaQ==","repeats":2},{"count":118862302,"lower_bound":"ZmluYWwgcGFja2FnZXM=","upper_bound":"Zmx1ZmZpbHkgZmluYWwgYXR0YWlubWVudHMgZW5nYWc=","repeats":2},{"count":120062325,"lower_bound":"Zmx1ZmZpbHkgZmluYWwgcmVxdWVz","upper_bound":"Zm94ZXMuIHNwZWNpYWwgcGk=","repeats":2},{"count":121262348,"lower_bound":"Zm94ZXM6IHBhY2thZ2VzIHNsZWVwIHNseWw=","upper_bound":"ZnVsbHkgcGVuZGluZyBicmFpZHMgZW5nYWdlIHF1aWNrbHk=","repeats":2},{"count":122462372,"lower_bound":"ZnVsbHkgcGVuZGluZyBleGN1c2VzLiBibGl0aGVseSB1bnVz","upper_bound":"ZnVyaW91c2x5IGZpbmFsIGRlcG9zaXRzLiBi","repeats":2},{"count":123662395,"lower_bound":"ZnVyaW91c2x5IGZpbmFsIHBhY2thZ2VzIG4=","upper_bound":"ZyBmb3hlcyBhYm91dA==","repeats":2},{"count":124862418,"lower_bound":"ZyBmdXJpb3VzbHkgZXhwcmVzcyBkZXBvc2l0cy4gc2x5bA==","upper_bound":"Z2FpbnN0IHRoZSBhc3ltcHRvdGVzLiBleHByZXNz","repeats":2},{"count":126062441,"lower_bound":"Z2FpbnN0IHRoZSBmaW5h","upper_bound":"Z2VzLiBjYXJlZnVsbHkgaXJvbmljIGRlcG9zaXRz","repeats":2},{"count":127262465,"lower_bound":"Z2VzLiBjYXJlZnVsbHkgc2lsZW50IHBpbnRvIGJlYW5zIGI=","upper_bound":"Z3JhdGUgYm9sZGx5IGFmdGVyIHRoZSB1bnVzdWFsIHRo","repeats":2},{"count":128462488,"lower_bound":"Z3JhdGUgYnJhdmVseS4=","upper_bound":"Z3VsYXIgbXVsdGlwbGllcnMuIGJsaXRoZWx5IA==","repeats":2},{"count":129662511,"lower_bound":"Z3VsYXIgcGFja2E=","upper_bound":"aGFnZ2xlIGJyYQ==","repeats":2},{"count":130862534,"lower_bound":"aGFnZ2xlIGNhcmVmdWxseSBhYm92ZSA=","upper_bound":"aGUgYnJhdmVseSBzcGVjaWFsIHJlcXVlc3RzOiB1bnVzdWFsIA==","repeats":2},{"count":132062558,"lower_bound":"aGUgYnVzaWx5IGZpbmFsIHBsYXRlbGV0cy4g","upper_bound":"aGUgZnVyaW91c2x5IA==","repeats":2},{"count":133262581,"lower_bound":"aGUgZnVyaW91c2x5IGJyYXZlIHBhY2thZ2VzLiBxdWlja2x5","upper_bound":"aGUgc2x5bHkgdGhpbiBhYw==","repeats":2},{"count":134462604,"lower_bound":"aGUgc2x5bHkgdW51c3VhbCBkZXBvc2l0cy4gY2FyZWZ1bGx5IHJlZ3Vs","upper_bound":"aGVvZG9saXRlcyBhbG9uZ3NpZGUgb2YgdGhlIGlyb25pYyBw","repeats":2},{"count":135662627,"lower_bound":"aGVvZG9saXRlcyBicmVhY2gg","upper_bound":"aWFsIGRlcG9zaXRzLiBzbHlseSBm","repeats":2},{"count":136862650,"lower_bound":"aWFsIGVzY2FwYWRlcy4gYmxpdGhlbHk=","upper_bound":"aWMgaWRlYXMgYWNjb3JkaW5nIHRvIHRoZSBwYWNrYWdlcw==","repeats":2},{"count":138062674,"lower_bound":"aWMgaWRlYXMgYXJlLiBzaWxlbnQgYw==","upper_bound":"aWNrbHkgZmluYWwgaW5zdHJ1Y3Q=","repeats":2},{"count":139262697,"lower_bound":"aWNrbHkgZmluYWwgcGludG8gYmVhbnMgZGV0ZWN0IGFmdGVy","upper_bound":"aWVzIGhhZ2dsZS4gc2x5bHkgcGU=","repeats":2},{"count":140462720,"lower_bound":"aWVzIHNlcnZlIGFjY29yZGluZyB0byB0aGUgcmVx","upper_bound":"aWx5IGFtb25nIHRoZSBib2xkLCBmaW5hbCByZXF1ZXN0cw==","repeats":2},{"count":141662743,"lower_bound":"aWx5IGJlaGluZCB0aGUgc2xvd2x5IHJlZ3VsYXIgYWNjb3Vu","upper_bound":"aW5hbCBpZGVhcyBib29zdCBzbHlseSBhYm91dCB0aGUgZmluYWwsIGZpbg==","repeats":2},{"count":142862767,"lower_bound":"aW5hbCBpZGVhcy4gZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cyBzbGVl","upper_bound":"aW5nIGZveGVzIGRldGVjdCBzdGVhbHRoaWx5IHA=","repeats":2},{"count":144062790,"lower_bound":"aW5nIGZveGVzIHRyeSB0byBjYWpvbGU=","upper_bound":"aW5zdCB0aGUgY2FyZWZ1bGx5IHVudXN1YWwgZm94ZXMgYXI=","repeats":2},{"count":145262813,"lower_bound":"aW5zdCB0aGUgZGFyaW5nbHkg","upper_bound":"aW50byBiZWFucy4gZmx1ZmZpbHkgZXhwcmVzcyBhY2NvdW50cyBuYQ==","repeats":2},{"count":146462836,"lower_bound":"aW50byBiZWFucy4gZnU=","upper_bound":"aW91c2x5IGZpbmFsIHRoZW9kb2xpdGVzLiBmdXJpb3VzbHkgcGU=","repeats":2},{"count":147662860,"lower_bound":"aW91c2x5IGZsdWZmeSBmb3hlcy4gY2FyZWZ1bGx5IGJvbGQ=","upper_bound":"aW91c2x5LiBzaWxlbg==","repeats":2},{"count":148862883,"lower_bound":"aXJlc2lhcyBib29zdCBh","upper_bound":"aXJvbmljIHJlcXVlc3RzLiBpcm9uaWMgZGVwb3NpdHMg","repeats":2},{"count":150062906,"lower_bound":"aXJvbmljIHJlcXVlc3RzLiByZWd1","upper_bound":"aXRoZWx5IGJvbGQgZm94ZXMgbmFnIGNhcmVmdWxseS4g","repeats":2},{"count":151262929,"lower_bound":"aXRoZWx5IGNhcmVmdWxseSBmaW5hbCBleA==","upper_bound":"aXRzIGFmZml4IGNhcmVmdWxseS4gcmVndWxhciBwYWM=","repeats":2},{"count":152462953,"lower_bound":"aXRzIGFmdGVyIA==","upper_bound":"aXRzLiBzaWxlbnQgZm94ZXMgd2FrZSA=","repeats":2},{"count":153662976,"lower_bound":"aXRzLiBzaWxlbnQgcmVxdWVzdHMgYWZ0ZXIgdGhlIA==","upper_bound":"am9sZS4gc2x5bHkgYm9sZCBkZXBvc2l0cyBjYWpv","repeats":2},{"count":154862999,"lower_bound":"am9sZS4gc3BlY2lhbCwgaXJvbmljIHBhY2s=","upper_bound":"a2UgYWJvdXQgdGhlIGNhcmVmdWxseSB1bnVzdWFsIHBhY2thZ2Vz","repeats":2},{"count":156063022,"lower_bound":"a2UgYWZ0ZXIgdGhlIGNhcmVmdWxseSByZWd1bGFyIHBhY2thZ2VzLg==","upper_bound":"a2x5IHBlbmRpbmcgZGVwb3NpdHMgc2xlZXAg","repeats":2},{"count":157263046,"lower_bound":"a2x5IHBlbmRpbmcgdGhlb2RvbGl0ZXMgbWlnaHQgc2w=","upper_bound":"bCBmb3hlcyBhYm91dCB0aGUgZmluYWwgYXN5bXB0bw==","repeats":2},{"count":158463069,"lower_bound":"bCBmb3hlcyBzbGU=","upper_bound":"bCByZXF1ZXN0cyBhYm92ZSB0aGUgZQ==","repeats":2},{"count":159663092,"lower_bound":"bCByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBibGl0aGVseSBmaW5hbCBhY2M=","upper_bound":"bGFyIGRlcG9zaXQ=","repeats":2},{"count":160863115,"lower_bound":"bGFyIGRlcG9zaXRzIGNham9sZSBxdWlja2x5IGFmdGU=","upper_bound":"bGFyLCBleHByZXNzIGZveGVz","repeats":2},{"count":162063139,"lower_bound":"bGFyLCBmaW5hbCBnaWZ0cy4=","upper_bound":"bGQgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBhbW8=","repeats":2},{"count":163263162,"lower_bound":"bGQgcGFja2FnZXMuIHNseSBwYWNrYWdlcyBzbGVlcCBjYXJl","upper_bound":"bGUgc2x5bHkgdW51","repeats":2},{"count":164463185,"lower_bound":"bGUgc2x5bHkuIGZpbmFsLCBwZW5kaW5nIHBpbnRvIGJlYW5zIGxvcw==","upper_bound":"bGV0cyB3YWtlIGZsdWZmaWx5IGZpbmFsIGFjY291bnRzLiA=","repeats":2},{"count":165663208,"lower_bound":"bGV0cy4gY2FyZWZ1bGx5","upper_bound":"bGl0aGVseSBmaW5hbCBkZXBvc2k=","repeats":2},{"count":166863232,"lower_bound":"bGl0aGVseSBmaW5hbCBkZXBvc2l0cyBhZg==","upper_bound":"bGx5IGV2ZW4gaWRlYXMuIGNhcmVmdWw=","repeats":2},{"count":168063255,"lower_bound":"bGx5IGV2ZW4gcmVxdWVzdHMuIGNhcmVmdWxseSBzaWxl","upper_bound":"bG9uZyB0aGUgYmxpdGhlbHkgZmluYWwgcGlu","repeats":2},{"count":169263278,"lower_bound":"bG9uZyB0aGUgYnVzaWx5IGZp","upper_bound":"bHkgYWJvdXQgdGhlIGNhcmVmdWxseSBlbnRpY2luZyByZXF1ZXN0","repeats":2},{"count":170463301,"lower_bound":"bHkgYWJvdXQgdGhlIHBhY2thZw==","upper_bound":"bHkgYW1vbmcgdGhlIGZpbmFsIHBhY2thZ2VzLiBwZXJtYW5lbnRseSA=","repeats":2},{"count":171663325,"lower_bound":"bHkgYW1vbmcgdGhlIHF1aWNrbHkgcmVndWxhciBkZXBvc2k=","upper_bound":"bHkgZXZlbiBjb3VydHMgYm9vc3Q=","repeats":2},{"count":172863348,"lower_bound":"bHkgZXZlbiBkZXBvcw==","upper_bound":"bHkgZmluYWwgZm8=","repeats":2},{"count":174063371,"lower_bound":"bHkgZmluYWwgaWRlYXMgaGFnZ2xlIGZ1","upper_bound":"bHkgaXJvbmljIGRlcG9zaXRzLiBjYXJlZnVsbHkgcGVy","repeats":2},{"count":175263394,"lower_bound":"bHkgaXJvbmljIGRlcG9zaXRzLiBldmVuIHJlcXVlc3RzIGFnYWk=","upper_bound":"bHkgcXVpZXQgcGludG8gYmVhbnMgYWJvdmUgdGhlIGJsaXRoZWx5IGY=","repeats":2},{"count":176463418,"lower_bound":"bHkgcmVndWxhcg==","upper_bound":"bHkgc2lsZW50IHBhdHRlcm5zLiBmbHVmZg==","repeats":2},{"count":177663441,"lower_bound":"bHkgc2lsZW50IHBsYXRlbGV0cy4gZXhwcg==","upper_bound":"bHkuIGJsaXRoZWx5IHNwZWNpYWwgcmVxdWVz","repeats":2},{"count":178863464,"lower_bound":"bHkuIGJvbGQgYWNjb3VudHMgc2xlZXAgY2Fy","upper_bound":"bHlseSBleHByZXNzIA==","repeats":2},{"count":180063487,"lower_bound":"bHlseSBleHByZXNzIGluc3RydWN0","upper_bound":"bHlseS4gYmxpdGhlbHkgc2lsZW50IGRlcA==","repeats":2},{"count":181263511,"lower_bound":"bHlseS4gY2FyZWZ1","upper_bound":"biBleGN1c2VzIHBvYWM=","repeats":2},{"count":182463534,"lower_bound":"biBmb3hlcyBhYm92ZSB0aGUgaXJvbg==","upper_bound":"bmFsIGFzeW1wdG90ZXMuIGJvbGQgcGludG8gYmVhbg==","repeats":2},{"count":183663557,"lower_bound":"bmFsIGRlcGVuZGVuYw==","upper_bound":"bmNpZXMgY2Fqb2xlIGFib3ZlIHQ=","repeats":2},{"count":184863580,"lower_bound":"bmNpZXMgaGFnZ2w=","upper_bound":"bmRpbmcgcGFja2FnZXMgc2xlZXAgY2FyZWZ1bGx5IGFs","repeats":2},{"count":186063603,"lower_bound":"bmRpbmcgcGFja2FnZXMgc2xlZXAgZnU=","upper_bound":"bmcgdGhlIGJsaXRoZWx5IGk=","repeats":2},{"count":187263627,"lower_bound":"bmcgdGhlIGJvbGQ=","upper_bound":"bmljIGFjY291bnRzLiBjYXJlZnVsbHkgc3BlY2lh","repeats":2},{"count":188463650,"lower_bound":"bmljIGFjY291bnRzLiBpZGVh","upper_bound":"bmlzIHNsZWVwIHF1aWNrbHkgYWJvdmUg","repeats":2},{"count":189663673,"lower_bound":"bmlzLiBleHByZXNzIGZveGVzIGF0IHRoZSBxdWlja2x5","upper_bound":"bnMuIGZ1cmlvdXNseSBleHByZXNzIGZveGVzIGFsb25nc2lkZSBvZiA=","repeats":2},{"count":190863696,"lower_bound":"bnMuIGZ1cmlvdXNseSB1bnVzdWFsIGQ=","upper_bound":"bnQgc2x5bHkuIGRlcG9zaXRzIGJyZWFjaCBjYXJlZnU=","repeats":2},{"count":192063720,"lower_bound":"bnQgdGhlb2RvbGl0ZXM=","upper_bound":"bnRzIGhhZ2dsZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIA==","repeats":2},{"count":193263743,"lower_bound":"bnRzIGhhZ2dsZSBjYXJlZnVsbHkgZmluYWwgaW5zdA==","upper_bound":"bnVzdWFsIGlkZWFzIGxvc2UgZmx1ZmY=","repeats":2},{"count":194463766,"lower_bound":"bnVzdWFsIGluc3RydWN0aW9ucyBzbGVlcCBzaWxlbnQ=","upper_bound":"byB0aGUgcGVuZGluZywgYm9sZCBhY2NvdW50cyB3YWtlIGZ1cg==","repeats":2},{"count":195663789,"lower_bound":"byB0aGUgcmVndWxhciA=","upper_bound":"b2xkIGJsaXRoZWx5PyBmbA==","repeats":2},{"count":196863813,"lower_bound":"b2xkIGRlcGVuZGU=","upper_bound":"b2xpdGVzLS0gZnVyaW91c2x5IGZpbmE=","repeats":2},{"count":198063836,"lower_bound":"b2xpdGVzLiBib2xkIHBpbnRvIGJlYW5zIGk=","upper_bound":"b25pYyBkb2xwaGlucy4gcGVuZGluZywgcGVuZGluZyBleGN1","repeats":2},{"count":199263859,"lower_bound":"b25pYyBlcGl0YXBo","upper_bound":"b25zIG5hZyBxdWlja2x5IGNhcmVmdWw=","repeats":2},{"count":200463882,"lower_bound":"b25zIG5hZyBzbHlseSByZWd1bGFyIGQ=","upper_bound":"b3JkaW5nIHRvIHRoZSBpcm8=","repeats":2},{"count":201663906,"lower_bound":"b3JkaW5nIHRvIHRoZSBpcm9uaWMgZHVnb3V0cy4gc3Rl","upper_bound":"b3NpdHMuIGJsaXRoZWx5IGlyb25pYyB0aGVvZG9saXRl","repeats":2},{"count":202863929,"lower_bound":"b3NpdHMuIGNhcmU=","upper_bound":"b3N0LiBjYXJlZnVsbHkgaXJvbmljIGQ=","repeats":2},{"count":204063952,"lower_bound":"b3N0LiBzbHlseSBib2xkIGRlcG9zaXRzIA==","upper_bound":"b3VudHMgaGFnZ2xlIGFib3ZlIHRoZSBjYXJlZnVsbHkgZXhwcg==","repeats":2},{"count":205263975,"lower_bound":"b3VudHMgaGFnZ2xlIGNhcmVmdWxseSBhYm91dCB0aGU=","upper_bound":"b3VzbHkgYXJvdW5kIHRoZSBibGl0aGVseSBldmVuIHI=","repeats":2},{"count":206463999,"lower_bound":"b3VzbHkgYm9sZCBpZGVhcyBjYWpvbGUgZmx1ZmZpbHkgYWdhaW5z","upper_bound":"b3VzbHkgc2lsZW50IGRvbHBoaW5zLiBm","repeats":2},{"count":207664022,"lower_bound":"b3VzbHkgc2x5bHkgcGVuZGluZyB0aGU=","upper_bound":"b3hlcyBzbGVlcCBmdXJpb3VzbHkg","repeats":2},{"count":208864045,"lower_bound":"b3hlcyBzbGVlcCBmdXJpb3VzbHkuIHF1aWNrbHkgZmluYWwgY291","upper_bound":"cC4gcGVuZGluZyBhY2NvdW50cyBhZ2FpbnN0IHRoZSA=","repeats":2},{"count":210064068,"lower_bound":"cGFja2FnZXMgYWJvdXQgdGhlIGZpbmFsIGRvbHBoaW5zIGRl","upper_bound":"cGFpbnMgYWNjb3JkaW4=","repeats":2},{"count":211264092,"lower_bound":"cGFpbnMgaGFnZ2xlIHBlbmQ=","upper_bound":"cGVuZGluZyBhY2NvdW4=","repeats":2},{"count":212464115,"lower_bound":"cGVuZGluZyBhc3ltcHRvdA==","upper_bound":"cGludG8gYmVhbnMgaGFnZ2xlLiBjYXJlZnVsbHkgZXZlbiBhY2NvdQ==","repeats":2},{"count":213664138,"lower_bound":"cGludG8gYmVhbnMgbm9k","upper_bound":"cG9zaXRzIGhhZw==","repeats":2},{"count":214864161,"lower_bound":"cG9zaXRzIGhhbmcgc2x5bHkgYWxvbmdzaWRlIG9mIHRoZSBmdXJp","upper_bound":"cHJlc3MgcGludG8gYmVhbnMgbXVzdCBhcmUgZnVyaW91c2w=","repeats":2},{"count":216094185,"lower_bound":"cHJlc3MgcGludG8gYmVhbnMhIHJlZ3U=","upper_bound":"cXVlc3RzIHdha2UgY2E=","repeats":30002},{"count":217294208,"lower_bound":"cXVlc3RzISBhY2NvdW50cyBoYWdnbGUgYWNjb3VudHMuIHF1aWNrbHkgZg==","upper_bound":"cXVpY2tseSBpcg==","repeats":2},{"count":218494232,"lower_bound":"cXVpY2tseSBpcm9uaWMgYWNjb3VudHMuIGRlcG9zaXRzIGhhZ2dsZSBmbA==","upper_bound":"ciBkZXBvc2l0cyBjYWpvbGUgc2w=","repeats":2},{"count":219694255,"lower_bound":"ciBkZXBvc2l0czsgaXJvbmljIHBsYXRlbGV0cyBib29zdCBjYXJlZnVs","upper_bound":"ciB0aGUgZmluYWwsIGlyb25p","repeats":2},{"count":220894278,"lower_bound":"ciB0aGUgZmluYWwsIHJlZ3VsYXIgYWNjb3VudHMuIHNseWx5","upper_bound":"cmUgY2FyZWZ1bGx5IGV2ZW4gaWRlYXMuIHBsYXRlbGV0cyBhbG9uZ3M=","repeats":2},{"count":222094301,"lower_bound":"cmUgY2FyZWZ1bGx5OiBmdXJpb3VzbHkgcmVndWxhciByZXF1ZXN0cyBoYQ==","upper_bound":"cmVmdWxseSBleHByZXNzIGFj","repeats":2},{"count":223294325,"lower_bound":"cmVmdWxseSBleHByZXNzIGRlcG9zaXRzLg==","upper_bound":"cmVndWxhciBkZXBvc2l0cyBhZmZpeCBhY2NvdQ==","repeats":2},{"count":224494348,"lower_bound":"cmVndWxhciBkZXBvc2l0cyBuYWcgZXZlbmx5LiBmdXJpb3VzbHkgaXI=","upper_bound":"cmVndWxhciwgdW51c3VhbCBwYWNrYWdl","repeats":2},{"count":225694371,"lower_bound":"cmVndWxhciwgdW51c3VhbCBwbGF0ZQ==","upper_bound":"cmVxdWVzdHMuIHJlZ3VsYXIsIHBlbmRpbmcgZm94ZXMgcw==","repeats":2},{"count":226894394,"lower_bound":"cmVxdWVzdHMuIHNpbGVudCBwYWNrYWdlcyB3YWtlIGNhcmVmdQ==","upper_bound":"cmluZ2x5IGZsdWY=","repeats":2},{"count":228094418,"lower_bound":"cmluZ2x5IGlyb25pYyBhc3ltcHRvdGVzLiBpcm9uaWM=","upper_bound":"cmlvdXNseSBpcm9uaWMgcmVxdWVzdHMuIGNhcmVmdWxseSBib2xkIA==","repeats":2},{"count":229294441,"lower_bound":"cmlvdXNseSBwZW5kaW5nIHBhY2thZw==","upper_bound":"cm9uaWMgZm94ZXMuIGV4cHJlc3MgZGVw","repeats":2},{"count":230494464,"lower_bound":"cm9uaWMgZm94ZXMuIHNseWx5IGV4cHJlc3MgdGhlb2RvbA==","upper_bound":"cm9zcyB0aGUgZGVwb3NpdHMuIHA=","repeats":2},{"count":231694487,"lower_bound":"cm9zcyB0aGUgZmluYWxseSBzcGVj","upper_bound":"cnVjdGlvbnMuIHVudXN1YWwsIHVudXN1YWwgcGFja2FnZXMgY2E=","repeats":2},{"count":232894511,"lower_bound":"cnVuIHNseWx5IA==","upper_bound":"cyBhbG9uZ3NpZGUgb2YgdGhlIGNhcmVmdWxseSBwZW5kaQ==","repeats":2},{"count":234094534,"lower_bound":"cyBhbW9uZyB0aGUgZnVyaQ==","upper_bound":"cyBjYWpvbGUgY2FyZWZ1bA==","repeats":30002},{"count":235294557,"lower_bound":"cyBjYWpvbGUgZXhwcmVzcywgZXY=","upper_bound":"cyBpZGVhcy4gY2FyZWZ1bGx5IHNwZWNpYWwgZG9scGhpbnMgaGFnZ2xl","repeats":2},{"count":236494580,"lower_bound":"cyBpbnN0cnVjdA==","upper_bound":"cyBwbGF0ZWxldHMuIGV2ZW4gZGVwZW5kZW5jaWVzIGludGVn","repeats":2},{"count":237694604,"lower_bound":"cyBwbGF5IGNhcmVmdWxseSBhYm91dCA=","upper_bound":"cyB1c2UgZmx1ZmZpbHkgYmxpdGhlbHkgZmluYWwgcGE=","repeats":2},{"count":238894627,"lower_bound":"cyB1c2UgZmx1ZmZpbHkgcmVndWxhciBwYWNrYWdlcy4gc2x5bHkgaQ==","upper_bound":"cy4gYmxpdGhlbHkgc2lsZW50IHRpdGhlcyBjYWpvbGUgYmxp","repeats":2},{"count":240094650,"lower_bound":"cy4gYmxpdGhlbHkgc2xvdyBncm91Y2hlcyBhZmZpeCBibGl0aGVseSA=","upper_bound":"cy4gZmx1ZmZpbHkgc2lsZW50IHBhY2thZ2VzIGFj","repeats":2},{"count":241294673,"lower_bound":"cy4gZnVyaW91c2x5IGV2ZW4gcGludG8gYmVhbnMgbXVzdCBoYXY=","upper_bound":"cy4gc2lsZW50IGRlcG9zaXRzIGludGVncmF0","repeats":2},{"count":242494697,"lower_bound":"cy4gc2lsZW50IGRlcG9zaXRzIG5h","upper_bound":"c2Ugc2x5bHkgYWNjb3JkaW5nIHRvIHRoZSBmaW5hbCBwYWNrYQ==","repeats":2},{"count":243694720,"lower_bound":"c2Ugc2x5bHkgZnVyaW91c2x5IHJlZ3VsYXIgcGludG8gYmVh","upper_bound":"c2l0cyBib29zdCBxdWlja2x5IGNhcmVmdWxseSBwZXJtYW5l","repeats":2},{"count":244894743,"lower_bound":"c2l0cyBib29zdC4gZmx1ZmZpbHkgYm9sZCB0aGVvZG9saXRlcyA=","upper_bound":"c2xlZXAgcGFzdCB0aA==","repeats":2},{"count":246094766,"lower_bound":"c2xlZXAgcmVxdWVzdHMuIHF1aWNrbHkgcGVuZA==","upper_bound":"c2x5IHJlZ3VsYXI=","repeats":2},{"count":247294790,"lower_bound":"c2x5IHJlZ3VsYXIgYWNjb3VudHMuIGZ1cmlvdQ==","upper_bound":"c2x5bHkgZmluYWwgYWNjb3VudHMuIHBpbnRvIGJlYW5zIGhh","repeats":2},{"count":248494813,"lower_bound":"c2x5bHkgZmluYWwgZGVwdGhzLg==","upper_bound":"c25vb3plIHF1aQ==","repeats":2},{"count":249694836,"lower_bound":"c29tYXMgaGFnZ2xlIGM=","upper_bound":"c3MgaWRlYXMgYWZ0ZXIgdGhlIHRoZW9kb2w=","repeats":2},{"count":250894859,"lower_bound":"c3MgaWRlYXMgaGFuZyBhYm92ZSB0aGUgZmx1ZmZpbHkgcmVndWw=","upper_bound":"c3QgdGhlIGNhcmVm","repeats":2},{"count":252094882,"lower_bound":"c3QgdGhlIGNhcmVmdWw=","upper_bound":"c3RzIG5hZyBzbHlseSByZWd1bGFy","repeats":2},{"count":253294906,"lower_bound":"c3RzIHNsZWVwIA==","upper_bound":"c3VhbCByZXF1ZXN0cy4gZXg=","repeats":2},{"count":254494929,"lower_bound":"c3VhbCB0aGVvZG9saXRlcy4gYm9sZCBhY2NvdW50","upper_bound":"dCBnaWZ0cyBib29zdC4gYWNjb3VudHM=","repeats":2},{"count":255694952,"lower_bound":"dCBpZGVhcyBkZXRlY3QgZnVyaW91c2x5IHVudXN1YWwgcmVxdWU=","upper_bound":"dCwgcGVuZGluZyBkZXBvc2k=","repeats":2},{"count":256894975,"lower_bound":"dDogcGludG8gYmVh","upper_bound":"dGVycyBhY3Jvc3MgdGhlIGV4cHJlc3MsIHNpbGVudCB0aGVvZA==","repeats":2},{"count":258094999,"lower_bound":"dGVycyBhbW9uZw==","upper_bound":"dGhlIGNhcmVmdQ==","repeats":2},{"count":259295022,"lower_bound":"dGhlIGNhcmVmdWw=","upper_bound":"dGhlIGlyb25pYyBkZWNveXMgd2FrZSBiZWhpbmQgdGhlIHNseWx5IA==","repeats":2},{"count":260495045,"lower_bound":"dGhlIGlyb25pYyBkZXBvc2l0cyBib28=","upper_bound":"dGhlIHNwZWNpYWwgdGhlb2RvbGl0ZXMuIHBhY2thZ2VzIGNhag==","repeats":2},{"count":261695068,"lower_bound":"dGhlIHVudXN1YWwgaW5zdHJ1Y3Rpb25zLiBpbg==","upper_bound":"dGhlbHkgcmVndWxhciBhdHRhaW5tZW50cyB3YWtlIGJsaXQ=","repeats":2},{"count":262895092,"lower_bound":"dGhlbHkgcmVndWxhciBkZXBvc2l0cyBhbG9uZ3NpZGUgb2YgdGg=","upper_bound":"dGhpbiByZXF1ZXN0cy4gZXhwcmVzcyBpbnN0cnVjdA==","repeats":2},{"count":264095115,"lower_bound":"dGhpbmx5IGJsaXRoZSBwaW50byBiZWFucy4gdGhlb2RvbGl0ZXMgYQ==","upper_bound":"dG8gYmVhbnMgYWJvdXQgdGhlIGlkbHkgc3BlY2lhbCBkZXBvc2l0","repeats":2},{"count":265295138,"lower_bound":"dG8gYmVhbnMgYWJvdmUgdGhlIGJsaXRoZWx5IGly","upper_bound":"dHJ1Y3Rpb25zIGFib3ZlIHRoZQ==","repeats":2},{"count":266495161,"lower_bound":"dHJ1Y3Rpb25zIGFjY29yZGlu","upper_bound":"dHMgYXJlIHF1aWNrbHkgdW51c3VhbCwgZXZlbiBhY2NvdQ==","repeats":2},{"count":267695185,"lower_bound":"dHMgYXJlLiBldmVuLCBmaW5hbCBleA==","upper_bound":"dHMgbmFnIHF1aWNrbHkgYmxpdGhlbA==","repeats":2},{"count":268895208,"lower_bound":"dHMgbmFnIHNseWw=","upper_bound":"dHMuIGJsaXRoZWx5IHJlZ3VsYXIgYWNjb3VudHMgd2FrZSBhZnQ=","repeats":2},{"count":270095231,"lower_bound":"dHMuIGJsaXRoZWx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMgY2Fqb2w=","upper_bound":"dHMuIHF1aWNrbHkgYm9sZCByZXF1ZXN0cyA=","repeats":2},{"count":271295254,"lower_bound":"dHMuIHJlZ3VsYXIg","upper_bound":"dWN0aW9ucyBhcmUgY2FyZWZ1bGx5IHJlZ3VsYXIgcGFja2FnZXMuIA==","repeats":2},{"count":272495278,"lower_bound":"dWN0aW9ucyBib29zdC4gYmxpdGhl","upper_bound":"dWVzdHMgdXNlIA==","repeats":2},{"count":273695301,"lower_bound":"dWVzdHMgd2FrZQ==","upper_bound":"dWZmaWx5LiBpZGVhcyB1c2Ugc2x5bHkgYWJvdmUgdGhlIGZ1cmlv","repeats":2},{"count":274895324,"lower_bound":"dWZmeSBwaW50byBiZWFucy4gY2FyZWZ1bGx5","upper_bound":"dWxhciBkZXBlbmRlbmNpZXMu","repeats":2},{"count":276095347,"lower_bound":"dWxhciBkZXBvc2l0cyBhZmZpeCBhY3Jvc3MgdGhlIGZ1cmlvdXNseQ==","upper_bound":"dWxkIGhhdmUgdG8gaGFnZ2xlIGZ1cmlvdXM=","repeats":2},{"count":277295371,"lower_bound":"dWxkIGhhdmUgdG8gc2xlZXAgcGVuZGluZyByZXF1ZQ==","upper_bound":"dWxseSBwZW5kaW5nIHBhY2thZ2VzIHNo","repeats":2},{"count":278495394,"lower_bound":"dWxseSBwZW5kaW5nIHJlcXVlc3RzLiBibGl0aGVseSByZWd1bA==","upper_bound":"dW50cyBjYWpvbGUgY2FyZWZ1bGw=","repeats":2},{"count":279695417,"lower_bound":"dW50cyBjYWpvbGUgcXVpY2tseS4gZGFyaW5nIGQ=","upper_bound":"dW51c3VhbCBpZGVhcyB1c2U6IGJvbGQgcGludG8gYmVhbnMgc29s","repeats":2},{"count":280895440,"lower_bound":"dW51c3VhbCBpbnM=","upper_bound":"dXJpb3VzbHkgaXJvbmlj","repeats":2},{"count":282095464,"lower_bound":"dXJpb3VzbHkgaXJvbmljIGVwaXRhcGhzLg==","upper_bound":"dXJ0cy4gY2FyZWY=","repeats":2},{"count":283295487,"lower_bound":"dXJ0cy4gY2FyZWZ1bGx5IGZpbmFsIGlkZWFzIGFnYWlu","upper_bound":"dXNseSBmaW5hbCBkZXBvc2l0cyBtb2xk","repeats":2},{"count":284495510,"lower_bound":"dXNseSBmaW5hbCBpZGVhcyBhYm91dCB0aGUgZnVyaW91c2x5","upper_bound":"dXN1YWwgaWRlYXMgYWJvdXQgdGhlIGNhcmVmdWxseSByZWd1bGFyIHBpbg==","repeats":2},{"count":285695533,"lower_bound":"dXN1YWwgaWRlYXMuIGZ1cmlvdXNseSBpcm9uaWMgcg==","upper_bound":"dmUgdG8gbm9kIGFmdGVyIHRoZSBwZW5kaW5nLCBpcm9uaWMgYWNj","repeats":2},{"count":286895557,"lower_bound":"dmVuIGFjY291bnRzIGFjY29yZGluZyB0byB0aGUg","upper_bound":"dmVuLCBpcm9uaWMgZGVwb3NpdHMuIHF1aQ==","repeats":2},{"count":288095580,"lower_bound":"dmVuLCBzcGVjaWFsIGFzeW1w","upper_bound":"eGVzIGFyZSB0aGlubHkgcmVndWxhciBhY2NvdW50cy4gcXVpZXRs","repeats":2},{"count":289295603,"lower_bound":"eGVzIG5hZyBibGl0aGVseSBpcm9uaWMgZGVwb3NpdHMuIGNs","upper_bound":"eSBhYm92ZSB0aGUgZGVwb3NpdHMuIA==","repeats":2},{"count":290495626,"lower_bound":"eSBhYm92ZSB0aGUgZXhwcmVzcywgcmVndWxhciBmb3hlcy4=","upper_bound":"eSBib2xkIHBhY2thZ2VzLiByZWd1bGFyIHJlcXVlc3RzIGFyb3U=","repeats":2},{"count":291695650,"lower_bound":"eSBib2xkIHBpbnRvIGJlYW5zIHNsZWVwIGFjY291bnRz","upper_bound":"eSBleHByZXNzIA==","repeats":2},{"count":292895673,"lower_bound":"eSBleHByZXNzIGdpZnRzLiBib2xkLCA=","upper_bound":"eSBmb3hlcyEgYm9sZGx5IGJvbGQg","repeats":2},{"count":294095696,"lower_bound":"eSBmdXJpb3VzbA==","upper_bound":"eSBwZW5kaW5nIGFjY291bnRzLg==","repeats":2},{"count":295295719,"lower_bound":"eSBwZW5kaW5nIGFjY291bnRzLiBleHByZXNzIHBpbnQ=","upper_bound":"eSByZWd1bGFyIGRvbHBoaW5zIGJvb3N0LiBzcGVjaWFsIHM=","repeats":2},{"count":296495743,"lower_bound":"eSByZWd1bGFyIGV4Y3VzZXMgaGFn","upper_bound":"eSBzcGVjaWFsIGZveGU=","repeats":2},{"count":297695766,"lower_bound":"eSBzcGVjaWFsIGlkZWFz","upper_bound":"eS4gZnVyaW91c2x5IGZpbmFsIGZveGVzIGhhZw==","repeats":2},{"count":298895789,"lower_bound":"eS4gZnVyaW91c2x5IHJlZ3VsYXIgaWRlYXMgaGFnZ2xlIA==","upper_bound":"eWx5IHF1aWNrbHkgc2lsZW50IHBpbnRvIGJlYW5zLiBpcm8=","repeats":2},{"count":300005811,"lower_bound":"eWx5IHJlZ3VsYXIgYWNjb3VudHMgYXJlIGJsaXRoZWx5IHNseWx5","upper_bound":"emxlIGJsaXRoZWx5","repeats":2}]},"cm_sketch":{"rows":[{"counters":[142285,143918,143507,140571,142484,145560,156689,158578,136125,154414,145607,143500,150414,157245,148759,139325,147237,145750,135367,148314,148364,151053,152676,142962,166322,143497,142972,147111,137405,146761,139435,144955,145884,145965,141781,143642,140453,140073,144818,148076,145857,170340,147414,146636,155542,147699,147309,154961,141954,136855,142943,143190,133440,144257,136736,152132,147641,138852,160912,138266,150847,145759,185944,149618,142915,147001,147393,142875,154762,143531,151698,161470,141762,148993,142987,137444,141592,140912,141853,144408,140580,149517,154781,131116,154570,162675,151225,147349,150862,138609,144129,139097,148004,148952,141020,154861,148276,141030,154497,145454,145234,151755,135720,160531,141643,147261,146380,148291,137799,163897,143808,156388,141740,147321,144816,151968,137727,148213,141573,140696,140216,150691,140943,137659,152389,148130,155092,144747,141800,145686,153059,136360,152463,137618,152264,141279,141895,151490,145892,145504,149503,145941,149592,141128,142378,144067,146806,141837,160104,149836,142171,141808,137732,146067,156093,140271,139564,133620,145240,142488,136584,137693,147168,141553,144084,149619,145210,138808,160100,137225,145721,151063,135125,147934,142079,144285,151174,143940,137968,144185,138484,145965,138748,143468,147332,142564,152762,168228,136461,141110,145301,157203,144716,142797,142908,150507,189399,146358,144956,167182,151834,139840,138808,136769,136641,153296,139747,132075,140591,153552,141174,156121,143482,154122,143525,139723,150875,162521,143062,159151,145415,141003,148310,145309,148595,147957,144761,151096,140508,158179,143647,146876,144012,137468,149228,141142,147619,141043,151254,149818,135946,140710,152567,148640,138511,144925,137485,138485,130872,144735,150118,151868,140903,148274,146948,147299,140941,147561,141072,155295,138463,154430,150906,134997,158671,139770,143691,147251,152366,143997,154755,143388,150143,147049,145112,144465,140620,154243,144096,155300,145376,148706,144502,148641,152065,145065,137721,142683,144492,156400,152449,148278,138632,143442,146025,136413,139832,150276,145733,140636,150282,147350,154958,138757,140923,146379,143756,152145,156192,138970,141216,143363,140301,142688,138488,159432,137231,140747,141413,152480,140957,146407,147420,144528,142737,157453,146902,151133,141272,143715,136858,139700,141882,147917,146675,155196,150036,136361,138313,152314,155094,157453,137329,143545,137197,132821,139809,145308,156838,161270,137673,158932,155090,141940,151523,138237,143611,146196,141746,144686,152583,157318,148574,147278,141403,158698,157285,155173,162687,143935,160846,145645,143437,137384,140542,147688,141018,156621,144184,150145,138263,142495,148871,131184,138779,145389,155445,143242,140674,144651,152268,151694,147843,149178,154705,142060,134175,151272,148037,143613,147541,146325,150507,155569,153093,149110,147047,147149,141605,147876,146033,151459,147659,139479,152264,132952,154606,141293,139129,140066,148117,142176,140515,137400,134691,148027,153393,140257,151305,149812,152404,138779,143489,151275,144823,144922,139582,140689,152408,144056,146766,131969,144444,139846,144324,140673,141751,138996,144713,148204,151179,142307,146006,140206,148143,132785,142342,149102,152211,139769,143872,154047,138399,138124,152056,140096,153261,142726,156941,144263,144810,151429,140102,136272,133740,148729,143670,153545,140440,140862,160778,142807,157063,154590,146293,145949,148676,139320,146347,132208,152914,138566,145405,160554,142630,143727,158893,146526,156340,139456,146085,152243,153668,140134,148431,153780,145210,141251,150369,145084,159955,138440,144760,154253,146944,156287,133765,139179,145055,136991,147519,154797,143252,148223,156730,154679,144122,152910,142818,151358,144068,158865,147857,149994,146080,151373,141256,152054,144256,146579,149709,143067,139342,144433,138542,157763,143415,152016,144380,146908,151674,141775,144584,165497,134461,150885,140508,143153,150588,142295,145042,134538,140081,153650,148142,141260,159599,154640,146812,193098,149084,147090,158280,138088,148235,146147,147597,145485,146187,161109,142703,147710,144585,147923,139636,141127,152965,154675,133166,149645,132676,139940,141665,152829,148786,152969,142688,142474,151679,147346,147238,152806,150955,155116,141172,151587,142566,148371,144204,145987,141363,150827,138583,141000,152252,161651,150809,146523,142767,139171,138478,141116,143199,166665,147500,144799,146293,142998,144949,133578,143542,135962,146423,146412,155143,142017,140586,139640,146779,140701,133699,147215,147535,143358,137248,141965,138290,171383,146027,147420,151634,146675,145362,151730,147769,145497,144796,149334,141670,152542,154372,149401,138333,161990,153072,158119,137921,141463,149358,144550,139495,141202,151213,145450,151365,145593,143905,163012,154023,157845,145845,135668,139325,147161,145491,145229,135245,150285,137879,140796,147007,137441,148472,145921,146943,147767,137305,142922,138290,164578,137053,144997,172109,141645,142624,150817,149857,140793,139041,149571,136838,136785,139368,141858,147457,154022,149890,146815,138002,147696,144770,138033,145538,139808,151455,147878,142201,148328,148664,143131,146931,144099,143631,144542,147637,140879,141628,145924,140973,160177,138863,140297,140307,138909,167133,140323,145933,154599,142807,149730,164828,143674,147515,147845,148211,138727,146587,146713,150590,140760,144797,152132,137631,149245,149036,145706,160987,150575,145245,148339,150021,148465,152652,155862,144294,140596,156686,144178,146792,151066,149009,150868,143491,140188,141093,142428,149935,145119,152433,146405,147560,154664,141241,148029,143284,150553,140450,157511,153952,139772,133302,154041,146123,148924,155833,148639,147092,144150,153274,157151,152129,164626,146952,139237,147998,145072,151952,154392,150313,158387,138566,142878,140394,133723,145075,140064,143636,141809,152410,146657,148325,143962,157335,137179,147892,151063,139761,143445,143340,152216,146606,148664,137263,142464,154256,159798,154845,153488,159892,155654,141131,141504,136757,157480,144823,145245,137264,141819,143180,143514,152508,144548,156448,150251,147773,145468,150133,152430,145942,137369,140181,153860,151194,140627,135523,152415,148279,142490,146343,150737,147375,147416,144215,154346,142658,147520,150024,143835,140040,144138,154624,142010,153646,146369,149973,153205,156818,137624,147839,139894,144601,149417,142090,167283,152263,137471,147059,148635,144497,134359,141171,149624,143031,141875,185866,154755,138415,150017,149070,141144,146459,159383,147438,145187,137533,144746,144424,143752,141438,156314,158900,144597,150238,145443,154793,147611,149486,161439,145042,142902,142770,141937,150031,139990,138047,151995,140269,137793,146505,140995,140318,146197,134951,136851,137983,150603,140709,154362,142272,145072,134265,135479,158926,142679,144388,148547,140752,143239,154623,140938,154470,140129,157587,162821,142018,155437,138618,135060,171526,147250,148010,136001,143658,143039,146591,154632,142567,140735,137393,146443,139119,144879,145645,147632,152928,140029,147090,141912,141943,145212,143883,140138,161143,140737,147453,145311,145200,143073,151135,142891,141211,151945,137995,142306,144326,145091,136167,152694,140339,148683,147723,146215,140696,143176,149822,156551,148346,152155,147763,145891,158510,138104,138917,139923,146446,142306,132836,150679,145772,142923,143553,143142,140049,137228,163863,138714,143411,138116,151716,137899,139959,138607,131919,148193,140334,146667,142335,167456,138199,135795,140849,160563,143308,135146,149829,141232,142675,148558,141345,148691,197010,153583,142953,139790,139032,145308,141565,153121,160695,156064,146381,144941,142329,145192,149823,155295,139116,142247,142219,154908,142746,156044,147727,145820,144963,144519,144271,155564,145424,157719,156839,144929,151238,159918,146983,143099,147537,146458,136386,138796,140013,144143,146545,153625,142049,152442,147357,142120,138358,142748,142773,148233,146515,144272,165558,140636,155707,145910,145606,155834,141369,137865,153947,136854,147661,133965,149749,155948,154216,141003,143725,145273,137146,142370,147413,144396,146231,149917,145107,155730,163724,138533,141845,170043,143425,141151,139979,140773,152893,135885,153410,145160,142546,151217,132342,140617,151901,146593,147229,159907,139938,147428,146864,146822,151034,146882,162190,149899,155156,150999,143825,159724,147196,138949,145503,144960,145668,143318,147561,148427,149493,145661,143681,139010,166805,137369,146598,163914,137958,134289,141622,150823,146825,143347,154996,138420,143619,144351,153790,144944,156849,147414,142930,146809,165882,148814,144667,138372,141875,158387,146718,149625,141437,158698,146100,133486,168849,145350,140924,136917,149843,145140,148539,144623,140959,154355,155208,150037,143979,141281,139407,148604,138277,137583,155946,158882,143533,142848,152919,145136,144095,186246,141291,153242,135991,141417,145088,160073,146767,143492,139395,144962,145744,158921,152076,142185,144312,141621,138380,146041,144069,145303,140091,140519,153228,147463,138076,147137,136332,140936,148662,134427,137132,147701,145226,160056,144065,142750,143963,144225,142568,141442,135400,147695,146815,161673,151747,140839,147263,143344,149905,146880,155569,136788,141055,147439,139454,158414,145137,136166,136050,158102,141146,147844,148944,133072,152103,149275,143714,145999,166306,138418,152739,142374,140384,134102,139946,145350,143253,143148,151083,153792,143217,150077,141165,147164,151180,139190,133444,138732,168768,148641,154490,149984,143418,146802,151121,164519,169618,151813,156150,146708,149080,141907,155546,140317,155509,154154,147582,145398,146871,150875,154851,137929,144338,142568,150764,152967,149766,146153,148508,146772,136336,152690,149585,143679,148271,134980,170477,148146,156541,152982,141851,140601,144096,146948,153623,147089,149813,136881,150008,140141,142105,142327,162093,137159,160972,151024,131004,145457,150010,146033,141635,141500,137863,170613,143124,140000,144587,147281,139037,144305,145592,148312,137627,136729,149404,142361,143481,144570,141259,145149,142966,148063,141326,145064,137897,143654,141864,139801,143205,136212,141254,141058,136812,150943,142415,142060,141212,147747,142528,160815,151956,147274,140637,146803,160638,144397,139291,138623,148859,146365,170967,161157,147376,138625,162226,142277,154890,142376,151216,143223,135506,143384,157921,147761,140714,139071,143624,141607,151300,141596,157234,149230,138092,154429,147550,144875,141064,142461,150450,144877,161684,152018,146237,149071,143369,150707,147629,141886,148083,143525,144602,195650,133139,144270,136466,143694,141331,146810,146137,148528,132329,151013,164678,143398,161986,142015,154739,139114,150699,141318,149038,144919,158149,140190,139013,145861,141890,140649,157930,151675,140381,145130,155628,141548,155289,142856,144189,145489,142292,147805,151001,143081,149089,134088,137858,147622,161627,139952,153203,142898,138733,144675,151442,151393,148196,148374,145603,146122,148694,150931,157028,133114,141156,147619,142452,150738,163671,147500,151308,144123,147397,144591,143058,148390,143612,135508,143848,144665,139837,133862,176901,156998,143391,149413,144350,136741,148254,145628,144828,150339,153401,143427,143657,149199,148619,145211,138797,163166,146650,141902,140697,153616,138804,140636,142658,153156,155882,153332,143515,137973,161139,146105,145176,142657,151979,143547,141589,148820,146882,147124,172299,148991,143101,140100,141874,140433,138394,146648,140465,152690,147059,140872,138012,143734,138003,143923,137387,157627,139563,140565,144238,140868,148857,134655,149571,156383,155199,144757,143687,151294,154629,134128,151477,142594,135815,148584,153596,138007,148698,137045,146128,143031,154526,136432,140225,136653,140886,149141,167497,131990,142678,143092,148520,139323,145054,142819,146183,144968,147419,150733,137608,146011,152034,137437,151694,149145,133667,159427,151701,141208,145883,149926,151592,146594,141483,135859,146786,152346,142833,163221,153102,139605,148796,137099,145616,145557,143137,135346,152011,136809,154936,146671,148701,145186,132878,145920,140709,155406,138687,140302,147271,145858,142681,141163,132211,147931,138097,141346,137636,153785,154470,139076,141274,143251,147572,150109,147947,138147,147207,142242,148467,143107,146784,146369,147750,141200,146620,155460,144180,149768,147209,141458,141733,150981,136626,151741,148664,140031,141077,148355,145669,144176,155519,144975,150906,149781,148088,142400,148293,147721,151729,144217,136759,150400,145317,143894,138921,131726,143377,150611,158452,140741,142645,166291,138759,163905,155959,153309,147760,148808,145574,141525,137555,141629,148699,141945,150726,159474,139730,142096,144719,161024,141353,141536,159482,153337,140512,141245,148864,144813,139637,151485,152691,145306,141981,150704,142762,149693,156027,159625,152581,140880,150317,143550,144279,150591,150150,156684,152941,145757,137416,157739,145804,144639,145223,145034,138222,144122,150671,145445,136395,140313,147541,150852,142129,155323,141294,145500,149539,150174,160120,140431,145048,148397,143318,156266,145289,140740,147018,150025,147922,139156,151282,135356,143876,159525,133895,145701,150367,144724,141454,147848,138210,149207,136524,136834,155975,143905,152042,148179,152282,141644,151032,145214,150102,141865,138435,142554,147875,143076,143005,137963,153322,140679,130214,154741,164425,140858,138306,137276,151101,154728,158451,142415,143408,160516,157307,141368,144636,148708,150594,139492,145896,140250,159187,144705,143655,150837,156097,144848,141082,142231,175604,163864,139628,154689,157294,137888,142272,139674,152674,143407,148667,154647,144698,149245,150551,154777,152585,149107,143633,147588,143520,138062,138749,146425,150563,144362,151104,150038,140977,138096,138560,148789,143158,142236,143580,137990,137395,145785,165203,145159,150272,143924,137203,138574,143007,156377,148571,156599,154307,143470,133311,145683,153637,164759,157317,153630,142765,170415,155875,138132,143127,142096,152345,140488,156867,146772,135642,155354,141416,144288,143353,148264,140188,157990,142754,155065,149422,150985,138326,140119,148177,144225,139282,151585,152255,139244,141891,150857,141041,154877,140199,151761,138499,150484,154027,141518,145025,151648,143769,143910,147455,144095,144418,144127,137965,146661,144807,152315,143171,143568,150144,141443,149902,140526,139728,141693,161008,157748,146389,141790,155117,155661,147543,137570,152738,140752,143604,139199,139330,160408,149696,142754,157991,142445]},{"counters":[148943,155086,143929,148575,140298,149525,150230,150222,151702,152714,149463,143443,140900,141382,144931,144266,144308,141007,152999,139673,141979,143327,143976,159705,160878,141926,143968,137760,141561,145085,145324,147987,144593,148480,160854,155692,160500,141476,148313,143358,143551,139076,150971,137732,137747,141856,137451,137467,143572,160397,154828,148462,148224,152159,145209,136233,151464,161399,147927,138887,136001,153687,145203,149701,141420,136246,138944,158772,159953,139438,150191,141461,149841,148908,151188,146982,142292,150100,140064,145498,141763,143559,142745,142818,147099,141822,141755,148017,144253,143909,148426,143333,155446,135850,160247,147308,140284,143999,142224,151298,144225,148540,143499,142728,144893,164456,139889,138718,140910,136565,138784,155883,135183,145817,136393,141033,142318,147691,145234,144283,159194,153237,147868,153713,145172,152418,169611,169173,143564,154100,189945,156745,144431,145942,152536,150495,143336,142489,148156,149027,139314,146882,142590,144948,142503,144025,143914,149285,141112,137821,152732,149357,149857,144051,168258,155289,142611,163714,155390,151263,137510,148782,160605,152739,143484,155454,139957,139228,144187,146428,145540,145052,142771,142991,144255,154196,136341,136964,138558,159551,143714,149671,146144,152042,153210,145662,149984,143239,148086,141402,136097,144672,144985,141056,171574,142090,144653,140792,144004,152107,145791,148768,144075,139039,156824,140405,138278,146296,140927,141699,141830,169978,141957,150301,135112,148798,152416,154857,145941,159664,147782,150433,141646,141027,162764,150803,144955,151751,153263,144013,140298,144834,151765,155874,146647,149117,141590,138533,146615,147977,146814,147873,154650,150954,150278,147620,150449,150430,148508,149255,142972,134966,158724,149554,146377,151249,147307,148893,155551,150529,154554,136652,154360,139541,144434,150330,149109,143987,140262,143531,150700,152464,142800,162393,149670,146903,137855,166429,146693,148834,153773,142485,138749,141290,142272,148268,140759,146913,138612,135602,142291,157253,146454,163943,148309,150088,142100,156679,141714,143449,148461,161204,165422,144983,144961,148598,151649,146216,151867,147771,156570,144293,144308,140508,147509,142405,146386,145834,143320,149060,149894,164566,152280,152955,144237,145668,153711,155882,149228,152069,155569,145169,151457,142655,147431,142701,152540,138526,147652,141120,137587,143809,147162,148217,140972,143234,154435,140795,142556,146512,141936,150560,141726,141154,142756,142008,141548,147798,142182,152462,142749,133927,140896,143687,150382,138949,152961,140327,182748,141082,144737,161184,148249,156880,147646,141753,147153,143233,145519,143868,146956,136574,145690,158809,166763,141241,146614,139284,150256,136340,161420,146555,147292,158234,139895,141541,154322,137785,147822,135369,165572,148521,134503,139220,136633,139773,142952,140875,141498,154467,141704,144607,138528,149440,135862,139633,138099,149830,143445,138047,156805,152362,141785,140197,137561,141901,137830,158781,162282,149432,157766,148833,136597,145460,150359,162363,139723,147972,141724,140776,132701,133619,140642,137593,143052,136095,144897,137717,138964,136347,163263,141621,139411,141000,146262,149464,146612,152999,150855,148060,149260,154277,148092,148975,144598,150528,151901,129067,147700,138262,145674,148363,141198,150852,150001,152846,139464,144195,148828,161711,162627,156254,150800,146980,139776,153950,139349,152183,146389,133576,151494,149854,154841,147533,151132,143050,146860,151317,156599,158924,140749,137549,140613,152244,147196,147756,149270,149361,137080,153780,146307,149340,143811,143972,145909,149171,142198,144132,134905,157754,143981,146629,145484,140883,148021,135990,142454,156152,146927,145637,142466,146020,149171,157255,143338,159179,139270,135811,153438,143699,140382,135387,142188,138498,139238,143870,143242,147275,152952,150336,145633,143082,133175,141320,142764,138571,146043,137594,146893,152743,140308,147509,154008,142032,145179,136655,147713,144521,139921,140193,137476,144173,139490,149410,146862,148579,152025,142124,146966,149431,150102,150339,135122,155563,146864,146787,147506,137263,158828,144111,139109,140086,139233,140360,158820,148773,140549,151458,159215,152078,150698,144188,136190,139750,173260,148330,138965,135362,145907,154096,140770,141679,143429,149740,150498,150485,164785,138745,146488,147511,145096,148513,162548,144877,165018,148377,138912,150795,137228,148247,134441,145671,140339,145430,143434,144193,138537,155752,150453,149853,144396,144115,140957,148674,134312,143074,138698,154869,152068,140562,143935,144399,146451,151524,163611,135204,147137,133934,140879,142472,140153,139539,142161,144788,134765,140917,141536,142362,145636,142859,131998,156112,138929,152895,142854,149285,131945,144618,150355,142380,144657,154244,147659,148623,140869,153333,144309,142690,168771,135064,136503,143806,148037,139512,142540,151713,146480,145082,141785,141574,139133,142150,142266,143547,155653,139158,153324,147568,149662,147724,153308,152550,152524,146035,142428,142485,149469,147591,146712,147609,151601,161573,165594,140307,146175,144496,137581,143411,148061,143001,144827,153087,163164,151092,163272,150759,134998,136567,141599,139521,142105,139675,159810,141033,142991,145056,142530,145142,147930,157080,144313,147584,141911,152022,142424,139353,145307,139476,149359,146386,142218,151810,141843,152472,147260,136260,148969,167337,151112,148030,141426,153579,137828,146485,134949,138106,148746,149022,143071,148516,135556,150591,154914,144791,146015,141361,152296,149322,146792,145118,140924,148607,145784,138636,141282,145097,143553,145925,146956,145389,140754,141768,144163,149112,131977,147439,143910,153982,148919,139811,143589,144690,145081,136601,139867,150815,148318,139612,149165,149136,138198,154865,135470,146122,143357,152287,151403,138324,142917,159218,147038,146333,149060,149379,138563,151680,143111,135686,139503,144286,143960,151198,142832,148355,154249,146646,143398,144949,159441,150212,144409,149983,145065,140977,141475,145780,138089,138749,146456,135331,140804,142483,153339,140436,139894,146682,150722,150359,147873,149421,144730,142505,151221,140482,151028,160833,151859,153723,136418,144871,142142,141675,140089,151117,183980,134232,153637,143025,146072,144274,134852,152714,148743,166282,166560,152057,145934,148798,139054,156372,136177,149437,147272,147959,149322,142560,154487,152631,145355,151985,148833,153518,149454,144921,142702,150923,135753,141821,143214,147879,153431,145540,153807,146752,143444,145434,150611,156550,150663,151845,144150,151518,177145,142363,159843,146051,155562,147653,146650,143369,138213,144356,153514,158628,138268,149195,143384,151519,145915,139071,140332,143148,149633,148630,141259,138318,139861,143116,188852,168263,154646,144639,141904,146710,144138,140339,144109,142533,149582,159293,147821,147756,154578,146345,148680,139515,149360,154371,151510,152508,140566,151640,144025,152742,138934,139048,136435,145629,155603,151988,154934,146841,148742,144987,148509,140997,155884,148730,138622,143814,143101,144303,144246,150588,147042,154391,134704,144285,141068,145712,157647,142443,155676,137970,143731,154213,138367,139727,149902,147548,144597,153504,143317,149736,147643,136834,144895,148574,138742,164325,149991,143960,144727,140703,131453,141198,137513,144361,149412,142899,144702,149709,145768,146607,149828,147345,135466,150640,150214,149247,144058,149208,150503,147637,146391,140481,162362,144713,152217,139493,147403,140942,151070,145566,142558,156221,141219,141080,145529,151479,145566,166276,143295,150974,142953,148074,148817,139255,146885,135483,131516,144160,154266,151099,144283,137545,141848,165141,143771,138537,142832,142997,149511,136754,141794,136225,138541,139098,142834,142140,152172,145851,145521,156360,145491,151072,145114,133929,148658,141146,145586,146267,151011,143733,156086,152764,153861,140706,144923,147970,153741,141866,153299,145362,145871,161759,140270,144850,150384,143442,144279,168838,146027,137853,139910,139748,173540,152774,147427,150041,136893,148595,142948,145134,142303,143238,151330,137137,153871,132962,175609,139881,144763,146125,147457,137766,144909,138856,148929,150052,148445,155829,154746,151857,154259,138326,164057,141065,149097,142922,139662,139715,152578,144425,150582,139962,141992,156875,148402,135212,148362,154038,139598,139216,144261,143228,151578,146872,150791,151601,145708,149937,159403,146325,136170,146958,170211,147160,149973,148516,157931,144496,139473,145771,146657,161660,148097,144920,145434,150735,143478,146331,147108,142908,151205,140583,139048,184692,147198,141830,137799,145257,145103,143662,140862,140690,138382,150431,145498,157230,147433,148513,143511,158489,150328,148817,146747,145845,138472,154768,149063,157141,153674,144859,145074,140678,133961,137572,147337,151991,144822,152967,146178,153699,147972,150071,149185,146676,145395,138877,143405,141935,132312,137258,137209,151253,147367,144692,139657,152875,143501,166245,147787,149890,140906,150678,142808,143261,142946,142002,137965,143881,154346,149450,144939,151464,139838,158955,149558,148291,145285,142440,142520,171823,148577,145429,149404,150025,145552,145103,144759,146992,137000,163116,161569,158328,146690,151271,144341,144482,135897,148704,147617,155477,146991,143792,147466,144469,145898,161964,143192,142004,158168,142843,150009,165858,150387,153368,141984,145369,157486,146105,140858,148330,145282,143405,152129,139101,145477,141772,138050,146353,138301,144173,153034,146408,169281,144807,142275,140453,139012,143763,152825,171170,145836,153281,147689,133060,148724,146256,170535,141524,152145,138163,139423,140778,145075,148028,147248,156551,151842,166039,143671,163623,146223,136846,156056,144003,140697,141555,149218,152536,140731,152216,157388,146546,137704,134334,136443,138613,144884,148394,159451,148815,141157,144969,165787,148242,137230,137862,142179,145363,142216,137252,146861,163814,153932,133645,155556,144478,139259,137547,151332,145378,136207,149240,148346,142342,143052,142522,146367,143398,138129,144467,143292,144073,142633,166642,167317,144912,142909,139307,143969,148164,133048,151927,143546,159800,136303,142757,149134,151858,148986,153260,146960,147870,151071,148490,143966,144553,139247,143947,152451,142682,151919,140682,150697,137130,139032,155195,142198,151357,131636,140537,151141,140425,156185,147543,142733,140157,138273,147448,146784,163525,143291,136507,140811,143438,144150,147306,142802,147167,159791,150445,153446,149690,155221,138777,150313,149736,147426,142224,143533,151726,155282,139209,141391,152055,159706,144742,144656,153869,144218,146663,143035,141877,141206,149570,143061,148159,165850,143086,147070,143103,150334,145048,145324,143264,137042,151942,154414,138508,137523,137356,156791,145574,141487,141942,149743,156826,155153,146557,145468,147430,142365,143232,144776,139102,145269,148023,187972,154561,145830,143851,149613,149396,142327,141118,153402,143928,150537,137259,141803,137449,158245,142009,133688,148224,142852,145241,134784,143699,151684,146487,132269,143790,148630,136323,141112,151531,174625,140548,138796,140733,144335,144242,147124,148718,147261,149952,148923,139381,148550,142036,149152,148721,149686,146628,144405,144377,147566,153435,134680,139199,144454,165275,164942,152105,154368,134306,134862,135942,155278,148024,139748,146995,170897,156274,138757,141366,148968,137558,146138,146913,141269,142980,143212,139081,140866,141066,143671,139929,145407,156059,145829,152721,144456,143801,142644,143593,156456,143639,146573,151677,155800,151517,145487,148354,141123,139610,141860,143907,144349,151817,155910,142985,158125,139802,141800,136144,154099,144441,142293,137405,144460,145667,146539,144378,133592,149850,148628,147707,154220,141448,144302,145741,137872,145255,138996,141154,148800,151863,151928,151863,140760,142005,167922,155473,146884,154198,147349,144927,146042,135920,134552,143879,141678,143450,143221,141171,141328,137216,143630,150630,150006,157590,147381,155967,141708,135094,148197,149096,145855,141137,142811,139982,149194,138664,146911,143972,148145,147171,144222,134944,151167,143306,147115,141986,150662,145859,143066,145433,135638,144754,146223,139638,143215,164044,142474,136964,143205,154282,155413,140407,137292,159904,145762,150845,143887,148431,163320,165138,141926,145377,174282,140293,142554,157721,147806,137656,140104,138382,147726,139228,139756,151742,150662,149741,148932,146646,141686,152338,142209,135732,139404,139060,131519,143521,163711,137368,147292,149015,137996,142497,147721,139805,147526,135266,145642,136910,146283,142251,147607,140634,156594,145793,148855,138229,155831,148183,143853,143877,142111,134217,145179,147998,141518,147090,150279,144179,148603,139887,135514,146391,140875,137238,147584,140649,141680,151168,140225,148591,143609,147661,141999,140409,142996,157518,139969,163663,148133,136598,143014,144781,150614,141014,153030,135997,136985,146021,147131,138783,141312,143460,143429,137043,139866,141373,147694,153780,143693,143987,151424,142740,146539,147210,159165,140382,135108,134761,143310,144596,148087,147381,158546,148268,143543,139390,152693,162203,143898,145631,150940,147611,136380,145130,145550,150647,148679,154422,143024,143296,141601,134050,154003,142625,143299,138333,153317,153331,142087,148140,145997,144013,155459,142542,153054,140031,138723,149874,141309,157472,135550,149695,136980,146105,135361,147790,146095,146231,136528,141837,140247,139043,138045,137349,142185,140522,151994,151827,150806,139405,148575,140656,140222,149600,137727,157323,143255,150108,147119,146961,150313,149135,142841,151984,145724,146844,142450,146152,145029,152464,140720,143935,148984,143465,151231,136632,152309,147874,146275,141650,143479,142672,159636,139959,139418,158923,140271,148579,149993,145709,151110,145764,138584,148302,145256,140457,145558,139549,149581,156508,151563,141238,182157,149293,136795,143027,144667,153674,141500,145145,148181,137996,138794,149196,153637,146105,146219,145224,140963,145279,153381,138260,152604,141270,150350,146420,147426,146970,149768,141397,145200,145306,141423,146561,142379,145052,165722,140669,151524,146102,142091,146264,156966,143749,137983,145555,142292,140917,140711,144022,150313,142939,137101,139979,146440,142567,140646,154578,136130,159062,139212,157750,143342,168226,156081,145884,136972,153131,145670,132805,137981,143260,143619,140517,148513,153828,143485,142847,168588,155951,150818,145318,143414,150211,129785,144698]},{"counters":[151665,140291,145060,141160,132710,145970,140019,146478,148933,144725,142437,154842,138872,143833,152806,147415,142007,137541,145882,154759,160546,136615,160084,154038,151681,155656,159467,145709,141905,141579,131987,144257,144151,152115,135830,136819,151428,144022,152878,144056,154554,150964,148690,156754,164316,152795,139419,143577,139239,147741,153804,167127,140662,146896,151114,138804,159250,139594,148093,148925,141892,141213,156191,140017,141974,147966,150119,150795,147525,141564,147219,141074,151671,141617,156695,151521,150731,147304,150789,143695,161912,144404,134447,163486,143760,145126,145950,143401,142537,139866,162710,147664,134565,136166,142544,142779,148716,144047,157249,149577,154606,140349,138330,147387,143532,141449,140311,146630,142715,144593,153005,138359,142798,146226,137635,154633,133501,142538,157547,145877,136828,154495,149879,159318,138404,153580,157284,139872,139980,152213,143678,150791,141707,142266,136975,148213,138665,140933,141919,153704,149788,142406,159063,141509,134840,142656,143271,150159,149203,141061,138091,159440,147922,146297,135434,136266,147815,147588,141920,159432,140276,146141,148995,141505,151581,153296,136987,140883,151871,147923,143570,142395,141021,144627,139838,140087,146547,144004,148429,142881,161421,153283,140234,144789,149431,139328,151765,150022,153805,135853,156059,142239,140092,146071,150951,148269,147550,141484,148296,153361,141612,151402,148865,144172,154894,144407,143100,155092,146909,142163,150994,142370,142434,143834,140435,144025,145364,139716,151164,145695,146389,150180,141203,145783,146443,142232,143874,170336,131705,141486,143216,149806,141590,142389,137118,142120,146303,142357,142499,156007,148064,140658,134919,132916,158079,160360,142728,140776,147050,138244,157799,142743,149309,144657,149644,145241,147171,151747,161275,145953,147570,145739,141282,143535,145752,146877,141860,139674,139723,141251,164941,142733,140991,140385,147821,150444,140059,149496,147199,148043,150614,147359,145816,140828,161330,140790,151127,152836,137677,150702,140669,145794,164104,144556,151774,144037,145418,141469,142788,161068,142115,144037,154470,137904,150476,146871,141320,150692,158886,135794,140397,140152,143473,140586,144063,146385,153498,145973,158898,138858,153967,147384,145634,144911,136875,147285,138330,141048,149200,143836,148499,143850,146398,156104,137217,140388,148226,143691,145134,132955,138688,140837,146127,148047,144207,143352,132751,153134,144440,143013,147178,152176,144701,154969,140200,138382,150514,134628,153980,140021,143958,150194,140973,144750,152409,137857,148602,144649,145213,137907,160187,150362,167014,143253,147023,142879,161176,151303,136509,150682,147353,148579,138876,142433,145181,153901,138253,143949,149769,158563,145467,148294,153174,145143,153619,151134,145961,142079,141732,136194,133079,160689,143667,150303,152269,147292,142618,145514,148479,146721,137244,145436,140388,140386,145527,142044,158714,143241,142995,135532,148677,139363,150932,181723,141643,158080,158292,156042,148686,145890,149357,138171,144380,141595,133491,153963,142664,152046,139071,137067,148693,151386,135907,142670,153341,151783,140286,140313,144228,144269,146206,151542,154069,144673,140201,152381,144730,149623,146367,147946,171941,151536,162322,138598,145536,139960,161618,144183,139419,149381,152499,146322,150217,147265,152088,143423,141913,145495,148056,141816,143627,144589,137212,149449,158883,139847,150312,153286,139080,176422,137399,139633,142820,145833,154748,164012,151230,145367,144456,148973,145965,138052,151717,157373,157955,143254,153478,161344,145638,150859,138375,141037,141732,140917,141572,153360,156122,142297,131610,151717,150563,138725,142348,135862,150775,150715,146863,152116,149756,151882,148774,139149,138502,133343,150666,145026,153058,150512,138159,143645,196729,145439,139914,171552,146842,149238,144301,153486,145173,146886,154899,140526,146029,153340,138782,143723,153982,134237,141659,142439,144167,138672,154748,158898,146112,145459,143919,158446,151707,143951,149816,143029,140150,144065,144849,152579,140618,161837,172439,138618,150807,137703,147731,145723,138405,150223,162359,139116,133613,150013,144337,141415,140117,141924,151247,147047,173305,138921,139847,138543,147637,143685,152260,144065,139647,143876,153770,151308,148560,141910,178138,138071,145075,132526,150052,147837,170053,149569,148744,150012,138222,146239,149770,141136,152358,155981,146349,138424,145399,140946,146112,141402,155945,154453,140741,141768,151168,133661,145310,150965,146998,144448,162086,150940,140248,153116,153960,142668,141161,159383,143088,149037,160362,146582,140889,150186,139516,147287,139795,137997,137224,144187,147416,143022,134798,149401,135627,135836,149614,147545,142069,138282,157758,139017,148061,145347,154183,165864,146622,149275,146653,135498,151758,141065,133620,158309,148234,140607,142827,146770,140561,139384,154996,150474,138109,165809,152413,144672,167517,156218,140383,147708,164562,143100,168649,143457,141332,142901,148745,173565,139306,143365,143778,146207,145800,158555,133894,136259,149021,138165,144328,136607,138386,149531,147633,157474,140832,147344,145367,154200,138700,138223,137436,158557,143043,153038,146368,146011,138376,158470,142165,155409,138794,139413,159079,140829,150049,150456,159410,143425,133272,160270,141350,162151,143679,149734,151904,154474,149666,139202,144662,146717,152905,149319,147912,147712,152011,135113,144320,151183,147795,147374,158010,150525,152117,151197,134585,143773,135859,143769,147102,155122,141682,148090,147752,138264,142502,146386,146026,142157,141041,149581,143462,135768,139682,170155,145671,154619,146115,148339,145094,139846,137088,142061,145102,147703,141686,142945,142975,137254,186975,146229,149299,159274,136319,143488,142900,145361,159971,145694,154919,135203,146304,139451,134933,143834,142296,143217,141243,143829,141676,145242,142354,152243,148168,154527,142506,132205,144534,142361,146301,144997,160102,136167,137738,152648,154580,143729,142212,136500,143337,147401,142645,140651,143927,140479,137910,154119,145932,144494,148415,141659,134925,141173,142054,139159,150597,150179,147808,153522,146933,144332,146868,157355,147937,143102,152316,139916,147724,140758,148427,138797,144505,147488,148607,139444,146057,142423,150584,156711,155791,144774,141532,149124,146785,145069,140489,138144,142480,157590,141033,159487,143666,161494,161983,138884,144980,144028,145328,143737,145182,145554,146843,142134,148292,140605,137212,160883,140273,143385,147745,142971,149863,151941,139708,145444,151337,148397,146537,146559,146553,139840,176279,137781,155362,140430,153179,151938,141242,146944,135443,143537,140893,144380,142558,152502,147408,144996,144884,142692,169794,138618,144812,145542,147497,140475,148667,147357,143489,139216,139218,155555,141477,145088,142570,141519,148229,145108,139207,158465,149902,138340,138345,158473,140868,135987,133994,141317,143877,138150,145731,151897,143977,143226,141724,157879,144428,151752,145633,150963,150459,137854,140526,149377,148505,144741,163484,155578,168983,142353,136133,142643,147729,147989,152411,142367,149154,154720,142113,145370,151484,143247,146992,134549,178894,144901,141905,149151,142256,148140,147520,140579,155591,149414,146442,152831,149805,140120,139283,140472,143404,141935,141838,143356,148622,139886,147093,143566,148930,141446,133596,139761,138840,145824,145517,148864,139449,157528,139373,143974,140099,134475,142871,157361,148348,152774,145514,139051,147074,133856,146377,143619,146645,146739,136362,152251,150116,144891,146762,145129,145025,143060,139627,148175,141048,138169,140271,145055,141490,137719,152810,159155,145958,146674,151666,146006,159073,138805,143126,144226,144913,142240,144593,143973,135367,149487,147171,138132,138874,148185,149203,148443,151729,154906,149635,142351,151744,157159,135606,147394,147916,155615,147406,154599,174220,141737,153205,143046,151785,139217,154987,146335,134260,150367,141964,142467,173648,149003,149296,156877,151848,134650,142129,145956,143453,138369,146685,151638,141357,135868,145287,139546,139278,145603,143558,137013,193838,137535,153982,142461,143467,140916,148311,141586,145191,139908,151440,136496,140221,141196,145209,147174,148401,147029,150126,155185,154343,136093,138231,141430,150291,160709,143288,141593,142170,139444,145417,154290,144245,145327,143180,150322,140171,154019,139386,149342,147907,144517,140871,140447,156466,143662,141670,144459,152511,146152,134604,147300,138183,133686,147103,137241,156010,133478,147809,138522,136808,136123,142384,145291,133403,148510,140830,153488,139285,147319,156070,143223,141068,138467,137857,141272,147780,137961,144470,153747,144760,141500,142533,136777,134174,154199,141202,149823,144827,141586,142136,161709,145773,149963,163560,147978,143606,139134,142142,158163,149505,137889,153766,165679,155647,142476,145217,143424,141167,150975,141651,142341,144532,144725,147678,160605,142442,139792,138132,138723,154578,143860,139276,140397,139061,141397,142080,142721,145849,142629,140792,154954,165145,160911,159446,147282,150004,161120,146499,147155,142857,146438,136922,142291,151953,146312,150761,147184,140640,143419,146274,149161,140070,156148,148256,160029,143231,144650,144751,147549,142552,154035,143337,142761,158647,144673,144262,147398,136183,147314,141492,160091,152912,154276,139918,146680,138297,147094,148860,144025,155837,147535,151068,153343,150367,152811,137217,145294,145499,157442,141278,142809,154125,149614,149875,139084,142326,164269,152863,146256,143841,144707,144973,153214,149727,149236,151186,138615,151317,139737,138236,153654,146738,145998,147261,152938,140368,144944,154511,149986,146656,143024,145470,144584,142174,159922,153117,153541,137274,141201,151511,156746,140068,144067,144788,145109,138239,142060,155059,154171,157207,144026,142017,148651,162286,153406,145454,144473,140984,143605,141124,145745,142830,154458,157970,140230,145034,159612,138309,141058,137926,144229,158180,140168,148966,140133,141649,144706,144595,141743,140291,147747,149696,147493,155579,144245,143129,143281,142348,147307,141765,143452,147752,145010,136167,141384,144812,152353,143367,145212,135531,137055,160541,139919,138572,141270,146596,149706,141202,144419,153469,154124,150391,151281,139970,146565,149186,144607,156943,144589,145954,152871,133003,146661,149324,140691,150667,141341,151281,150695,156402,147333,172302,142837,149470,136902,152199,141704,134990,153021,146479,145448,149480,155067,142131,149213,142183,159446,155908,140541,149726,144984,143194,160510,146182,152295,166248,144263,133459,142351,146796,143077,136713,145375,145053,136234,146753,141684,149926,147299,151538,149580,139516,141496,147394,141832,142856,141525,141391,142307,143725,152798,151542,149470,152613,152294,152110,149726,141490,144046,149945,145191,135944,147091,145000,142461,136847,159894,151407,153509,148798,154836,163658,139814,146815,139260,144168,146858,145115,141484,137388,148842,146567,154309,143375,158372,145761,141714,144320,142142,150807,145157,151303,141795,147683,151808,152479,161874,138119,152656,155250,134539,149293,155411,137216,152723,146037,144629,148705,148116,161289,154563,142204,144500,154271,149295,146243,134918,141720,145670,150997,135729,139990,140742,148884,149646,146126,151488,141536,141810,152441,141235,150979,153582,156675,139982,139016,139377,152406,147150,139700,158747,142953,150007,150989,148444,145181,145943,142683,148156,149576,142780,159108,142183,144717,136976,148685,135616,150416,146298,141653,154244,150964,143388,147417,163858,143366,142893,144663,141904,139287,136153,140767,140693,144210,145096,140107,155358,141492,137129,137969,142020,142143,137519,146880,140933,149817,144077,144460,136548,145509,141503,147128,142938,135926,140838,152762,140736,146361,158664,144496,141216,143149,155530,153074,149834,136566,167656,145929,161718,145063,142560,157749,146058,159109,150073,152562,147778,141995,145486,147429,162136,144659,154113,142550,149628,137525,151750,142659,137768,146382,135142,151811,144489,146141,149670,140103,132890,146407,152463,144502,152340,148619,153831,140960,143630,139948,143409,145633,149749,143765,149267,155585,144529,135896,137480,144799,164815,144290,144467,145675,137664,142437,157994,142786,145824,150186,136194,152906,145774,140148,162442,146705,190674,143418,144208,147788,151685,151505,137704,153971,144465,155450,148946,140525,138017,139962,154544,160557,146454,146130,163868,152191,150697,151975,150867,143941,137231,143349,140986,171757,157681,148551,150318,146550,144639,142029,152682,154661,170886,139014,144210,137432,147187,139983,141286,150754,148195,145001,146844,155037,154750,135968,142322,142338,167249,144035,145811,144745,147684,148150,146955,149498,139998,141938,147491,132536,164968,137812,153813,141904,146936,133755,151739,145798,134451,157338,140052,139546,138357,140307,143624,143494,132813,148295,143512,141267,146335,148343,153683,155254,161515,143983,202455,147861,150576,139354,147014,145743,132722,149171,149488,145891,136541,141824,151657,146286,146487,140091,144676,134259,147735,142611,149167,148252,147928,147234,144819,144613,141768,145960,136728,156754,143872,133663,137000,145011,142363,141892,164027,156048,131880,145896,144007,142122,144043,143957,155256,145118,144541,146622,146145,152443,132805,135365,145589,155230,138462,142984,148646,144362,139348,141907,146953,142067,149627,145105,150314,145693,158188,139947,141517,153472,142727,146900,137244,138883,141998,165246,138118,161698,141765,151744,141828,150475,140839,142730,142010,160593,168943,142352,151977,148882,146079,149785,142348,144172,138825,142478,142342,142348,151269,142667,146291,153886,146780,152484,141398,137082,144793,156817,151383,148360,148210,151142,148166,140533,163909,143662,144099,146720,143912,145197,143624,142908,148972,147628,146805,148910,140495,142146,134850,147469,146139,138776,138716,143444,147018,130847,143838,141316,140220,147859,148992,149347,142506,143886,165007,150584,134943,143533,143078,137140,134847,151631,149739,140552,143012,142636,164714,146898,153119,144759,151098,146996,147122,147757,140652,151258,144681,146560,153767,142456,144679,152930,153606,139382,158758,141739,133288,145963,149004,149427,144449,135943,141941,139320,160147,144504,145393,150586,167576,135578,158758,149114,142933,151550,139004,150117,165446,147498,143654,143533,144716,147743,150517,141741,144467,139229,167428,152803,144819,138481,135026,138162,140466,144513,142036,156608,146613,141372,142606]},{"counters":[151715,143011,150824,141475,155457,138103,144034,157939,139642,150497,136330,140900,154630,144167,144126,139211,140197,149754,134575,150840,138784,148806,142174,143423,149569,138732,137237,151645,142767,144047,143753,147684,152402,146536,147247,156180,143181,141758,147603,141257,140956,147220,143228,148848,141290,157298,135807,152560,150108,144006,157198,151681,146913,149560,132819,146190,148337,156032,149630,140410,142739,145518,136153,145062,162027,146641,160605,140569,134601,157568,210425,157505,144030,148592,156241,142407,156212,144068,164161,147953,144231,139713,145172,142276,146113,148328,138596,149174,135505,142755,158806,135893,146765,152439,141536,176500,156795,161608,134534,141777,147101,140327,148148,146433,154941,149909,135757,141500,147421,146947,145554,147175,145715,145975,146408,134799,146507,145579,139186,151809,151739,139500,141258,139973,139655,156558,141290,144433,136662,141273,147540,143688,156680,156477,150028,159773,155468,145247,148769,140911,152649,140568,145426,146203,139498,167847,148146,143945,137361,145386,141738,155688,145863,144792,141996,142196,136760,140929,154469,144943,147669,138128,145899,157035,154542,148734,154992,140658,149858,144688,150089,138332,139494,149467,147934,150822,146368,138923,134899,138349,147949,146350,156473,143523,160746,158719,138917,157133,139788,150593,143954,143462,152822,142546,152967,150977,153866,168385,143243,143332,144487,143405,147832,146725,152331,158249,145962,143185,134869,145292,158383,145573,149688,165341,141647,150079,157732,151102,151651,145961,153944,139596,143951,149206,164227,138772,135852,142797,140339,148620,145227,143647,152331,141347,149813,158183,140377,141030,155872,147059,136711,144210,137579,139314,141459,151601,138275,153022,141016,152764,140344,142617,151164,141178,151157,147658,144767,144653,137728,147350,154811,137687,142793,141560,147329,139699,139960,142257,149397,136776,148045,162290,152637,140710,135856,139600,149028,140926,161006,146344,149534,149723,142126,148370,140374,142112,152887,137902,141085,153433,142262,148165,148732,151429,144751,155304,141208,149011,152268,151434,144186,146090,151973,140699,149629,154059,141769,150486,140553,141866,138115,153306,142409,156133,138516,139776,140714,161052,141807,143251,162605,142597,143392,145969,148086,163708,147874,144529,154474,155679,142293,139723,144981,145116,134967,149216,147270,150007,158525,149200,147486,156276,143624,148134,143734,151621,138057,142596,141083,136528,147237,147630,142211,158264,140817,147902,153231,139171,141365,145881,139955,144781,171676,139312,158291,156140,153155,142157,142625,128374,149666,148344,144207,161277,139187,147368,150793,170495,139530,156664,146127,141490,138087,144569,148211,154845,141039,140672,142505,138732,154466,145145,143547,152440,139773,157157,145532,142074,144708,148957,160003,143918,135424,143987,140540,141819,151532,162573,160461,140078,155883,158182,148857,161558,139194,148929,140534,150008,135472,155026,149139,144333,161928,149037,145031,140780,143254,151979,162368,144518,144230,157786,145525,147188,143840,139746,145184,152920,150208,143782,169934,148283,133691,139695,140976,140727,136220,138537,140229,144927,141204,139636,136384,145929,167363,137224,140708,140689,157845,143233,156383,161274,142365,151105,144303,144021,142735,148150,144643,141095,139659,138219,145306,159701,150940,158003,146591,159380,156616,146354,147086,143028,140262,149655,144754,140216,137139,147430,132710,146070,141748,149659,144845,149660,139902,136092,143158,147945,141993,145776,148501,151889,149133,140649,137523,164577,149928,164218,153224,147274,138416,135275,143209,148305,146797,142837,139791,144752,141095,141614,134881,150147,148764,144787,145104,145230,136875,145738,141805,136337,145129,140375,146922,143335,156838,145719,146887,149269,141631,154244,151902,138065,134307,147444,155064,148139,142166,153190,142405,150495,137718,159412,142887,141297,144659,136103,151227,151357,144512,146794,143852,140960,156662,138386,142030,146236,154056,135983,148206,162243,151632,137441,139973,166350,147056,144850,144960,146151,141124,140369,145007,151055,149491,169911,144969,139973,141888,139319,150436,139695,140232,148108,150495,159171,136285,150303,136506,150090,141914,149201,144519,137557,144488,146546,141929,141130,153162,154964,141785,151222,133438,140799,144571,148326,135621,147069,150881,144925,155380,132820,142420,156768,150674,151037,138940,146847,142693,146277,147714,142197,136833,144440,146957,134423,143298,152688,161131,141701,142908,156489,153877,142560,144189,150897,144099,142681,138994,144853,150885,146489,145936,139912,150699,137437,147769,140476,143380,148535,150702,148003,146868,154554,149852,144740,147519,149583,148176,140272,151477,137658,148606,154216,136392,147318,138110,141794,147254,133076,144740,142778,136585,142768,145994,145559,147142,146516,138514,137739,151270,152830,136477,136256,148558,136656,135906,142095,136495,146131,145958,148230,140355,136891,142158,146434,134076,139482,164043,141130,138065,152372,139546,140448,186913,149489,143114,147406,138002,140846,150566,143662,149415,142107,147313,147959,135727,139251,142889,142708,169743,137772,137123,141151,150477,141778,137374,165740,154404,141624,143777,142288,139417,148128,149082,132906,149196,156701,147613,148731,132323,141549,143145,149701,145331,157254,144914,145579,144088,139325,152520,147927,146432,145860,142679,146103,140456,149766,141642,152685,146125,142188,143617,145051,142924,141181,136765,148527,140997,147213,140282,147089,157126,140375,152544,161745,143751,149851,143551,154065,151157,148907,140618,147832,147288,159102,145372,149532,143979,155462,143396,146630,142006,150415,138317,141743,146355,139555,147615,144263,154674,155642,141560,157542,141067,137347,141166,154315,134402,143550,154565,149152,149219,150988,149053,141630,165923,138177,141850,139810,146929,140306,149325,152486,155648,142268,141118,152780,148091,141415,166074,145517,152315,165763,141180,138622,153952,148227,142039,143155,147827,152272,143887,146708,158739,145504,132178,139914,150334,171531,150936,136607,162215,140920,151634,146086,142610,152043,151096,147850,158449,149028,145158,144584,144326,145558,148643,145094,147729,151510,147165,136099,142170,135351,141044,140292,144500,146943,140050,144783,145755,156326,142348,137973,134843,153589,152019,141699,136767,143367,141892,141663,150184,145648,137566,149738,146701,143228,144239,148509,144933,145719,140245,146685,141223,142348,144322,151668,142058,143399,142890,154285,146913,141491,143245,137532,145822,137168,139306,142846,138153,142426,146853,141781,147146,148563,142574,142476,154603,143937,171541,147215,165347,148134,139572,142953,151888,147530,144324,142030,149557,137516,145546,143226,144504,154247,141869,145816,136539,139030,149109,137328,166851,137194,149354,139978,139117,153121,155867,153717,170717,157776,136306,151479,141815,143198,153060,146435,151374,142409,142066,143993,153210,153862,146115,140138,137291,151086,147917,139740,141989,135267,146067,140792,156937,140525,143853,145814,151003,154516,141036,136077,141433,136184,141491,143490,143494,146933,135848,160214,139903,155553,139237,177704,150458,148459,155147,140218,142718,142444,139768,156181,144357,146699,138397,141626,148417,140592,143609,142900,142976,145541,143873,148216,141269,132189,148817,141304,152274,145133,144073,137849,148800,135416,140747,157742,147355,158595,156421,159762,134541,156809,147461,154734,138748,148875,150932,140955,139392,135477,144355,141479,141540,155179,168232,152910,147411,138569,151175,150377,152806,145374,139576,143884,161075,143946,162578,143862,155378,148624,147506,135333,149657,161750,145586,144793,139302,148625,145257,157608,141974,146148,149116,157758,152802,151950,149535,146114,147451,138725,145502,146817,146743,151399,136518,145479,142672,149335,144266,143294,150922,142490,136878,143169,150424,158989,157551,138264,149369,152518,142081,140401,149689,140029,139059,153403,146250,160016,157450,157239,144811,157206,144353,142830,142538,140108,142720,146266,146047,145711,138882,151722,159914,144296,146436,143993,141818,143156,143323,153725,140727,142789,138529,149275,147120,152739,139132,142911,145652,151934,133220,137617,153843,163270,146443,142006,160488,147338,154147,140275,139145,144357,143159,155920,146005,151505,135846,143377,145637,152983,144543,139719,148082,137882,150492,131589,139865,147449,137316,142212,152532,144154,140903,145299,134591,155714,142320,146642,161820,138621,147903,145847,150345,139155,149578,145100,147471,147639,156269,141887,142315,168953,144141,145352,140130,148529,139899,150327,154952,141721,151750,144350,145649,136884,140263,148190,150667,138724,140411,151906,178892,135007,149352,150944,156689,159308,160095,152138,143857,146445,136745,152902,149236,137936,141714,149501,140235,140606,148465,146177,144458,145865,155991,141680,154518,143901,137029,142280,149970,136309,155482,143348,144175,150429,152410,158502,154123,158530,154880,147599,147887,153705,146324,141588,151593,142539,141843,149785,146995,160557,161656,130206,137885,143834,152248,136325,143348,136581,167914,140909,155617,155449,157912,148203,140194,147522,137865,130711,158144,143304,152244,144391,189819,138961,141906,144531,152458,156475,158248,139703,144591,141498,152736,148269,145393,139424,147212,156576,132753,151969,146698,142730,140758,139769,143363,137845,142206,148159,139369,136072,150508,144239,142410,164638,152248,137990,148628,154818,142074,146455,143522,145074,143190,141584,145560,146374,150342,139353,138856,148241,141296,159020,149121,135285,141625,154273,145182,150501,155685,144933,158643,147932,137661,148689,157306,146080,147293,145911,153039,148376,142135,146604,150740,141534,141062,156959,147500,158269,145672,157555,150658,169601,137308,142248,142390,146604,136744,146604,153423,135597,142406,147565,144029,153982,143133,142033,143824,149539,151235,139806,139446,147863,147590,142713,147251,153561,144802,154393,145054,163080,134789,146065,147358,145037,148651,138754,150826,145672,143065,150721,144092,154042,143280,153405,146698,145526,153627,149545,153925,144637,136487,147960,146017,144987,137683,147117,152851,144925,155588,143774,155736,144058,153295,144778,141622,134601,142637,143601,150096,152277,152438,140663,149310,158607,150604,145737,138713,145634,146227,148079,134408,139033,139944,145525,141128,153306,162043,139024,150309,139473,145434,138154,144295,137192,140234,137853,146795,135523,136627,167129,142053,152706,140417,151942,137783,149028,140144,147779,147085,143634,137110,156549,147934,145543,150306,142484,153251,135319,148211,143603,168067,148903,154442,140005,151686,140505,139951,147142,150783,155876,143632,141723,139005,153161,143677,154128,145997,137619,141108,135403,144435,145068,135293,139272,148459,145792,140179,151537,156017,142539,147156,168708,144710,139706,146918,139397,142890,136863,161392,144845,137775,142987,152108,138832,142718,148528,142010,154497,163354,141705,152478,146909,145588,145845,141759,148186,141960,142159,144000,140136,141431,154062,143621,153899,155117,135735,142408,156298,147796,146720,147546,145628,146088,141848,142408,139413,165383,137512,151807,138876,142552,147416,137335,146140,146313,147479,144393,146345,142643,138516,167027,147039,147476,148796,134680,143530,144117,145588,145511,153917,142481,151092,152795,143595,139165,132895,152752,142856,146873,141468,141843,142346,142989,138966,149436,142515,145089,151088,148807,152150,141566,148220,140017,157873,142848,152684,132464,141236,146177,138454,140432,155472,144786,156438,138604,135289,151348,167579,140894,140194,159812,139262,141669,144595,144272,138304,145258,137309,142383,148631,141110,143686,148310,147161,155244,154399,141555,157979,137422,155846,138071,138587,143568,148310,142043,144260,148888,147551,141705,149412,146055,149658,140095,144311,149209,163943,141619,138599,143142,148504,142418,136001,147484,151154,153497,130504,142601,145003,141245,136551,192585,146856,148090,147143,139837,135295,165136,134936,136101,143512,141862,149671,142380,160070,140086,145361,177394,140496,155129,139101,141774,143126,142850,144844,140790,146009,156735,150114,154299,150085,150984,151183,151165,134799,143996,136431,143793,146016,154965,144801,146919,151574,146299,148347,143071,141659,138254,145143,151757,141835,149182,146456,151969,155222,139660,148045,140857,151467,139506,138789,139558,140896,149401,144627,143380,141209,139447,146004,146993,146531,142505,140449,157384,139669,140120,144963,151168,136823,151533,148883,142334,146993,148843,137609,144322,140864,150905,142827,144482,141388,141537,138548,143957,144167,152666,143074,140307,149526,154790,155179,148604,150052,141898,167289,142182,139279,144738,157229,146987,138787,171253,148968,140740,143487,139615,153355,137806,143762,144287,144066,147456,146052,141216,151417,143615,139263,146301,140028,138943,141796,135090,143535,151749,141841,147335,157741,147217,138212,144601,144883,152484,154213,147881,148165,139663,136393,148006,145100,146335,146255,143700,146855,146507,160346,136533,148813,150236,138339,150496,143045,145852,140884,163949,148023,136180,146306,145281,145615,169138,147684,160890,137835,144495,144345,154898,147367,147286,135515,157239,142935,136054,150697,141149,142642,149519,147464,137396,144188,174444,145118,150905,148656,145705,142091,142451,144330,148628,139728,162236,154486,158346,144918,146482,143733,141428,148329,140204,143349,152532,165343,144832,157740,139414,143891,143785,140198,150139,139092,141265,145383,144600,144861,135923,143650,155110,148802,148749,143938,151780,134959,138077,168635,151147,148381,148993,140729,141327,143499,160766,146939,152302,148973,152405,139141,142494,139619,149465,144062,179684,154466,144355,143817,147218,141160,155445,144218,154212,149889,143301,144174,148168,137788,142032,141565,154425,145501,149405,155964,136154,138450,148578,151797,163329,146435,153869,145132,148877,146696,148419,147410,141930,152284,143848,165096,156368,148131,142766,148041,131999,142682,150467,146873,145008,145826,155123,163568,142425,139522,149466,150912,148232,156675,144897,143305,154184,140139,151122,142129,139597,158676,136386,147823,140113,151948,138710,131871,147285,150502,140112,146491,157325,149175,160611,152831,143407,147433,141892,156273,144168,147789,136730,147949,143675,148570,148580,146904,161732,141895,143200,146602,144345,139842,136662,141990,138117,141292,165667,150119,152774,163520,149381,152813,157359,145582,149125,144086,137551,136505,151673,146521]},{"counters":[140712,146029,145488,138454,141047,142783,142040,141984,154978,142821,146311,145017,137310,153658,158933,142326,151913,163166,157838,151311,155266,140846,144039,145282,142554,149399,145716,156011,141009,139593,139645,145067,146856,145994,157940,154738,142924,142914,159239,140775,144920,139919,150064,137265,139962,135108,156085,146414,132383,141782,156030,151438,147825,154254,139424,151202,146999,140138,144730,155364,140807,182117,144836,146768,143307,147403,153263,147537,150813,147809,145768,142670,154027,157573,150991,167598,138388,139938,144415,134451,134203,152697,142433,153379,147727,148972,162369,139530,138592,141461,142296,145944,129979,145798,153551,143519,143772,138045,144037,149277,134736,145311,140842,144802,151118,164883,142120,161511,158144,134301,153382,143394,145387,143061,146120,136291,142226,142156,137920,144049,147456,156837,148899,133936,161059,156774,139815,141007,148616,145593,144520,140867,133724,138423,139773,142843,140232,162475,146950,149793,144203,139033,148969,143314,160011,149838,138445,135284,138432,161700,145994,139890,154371,146262,148119,141084,152472,142776,146174,141362,147044,146974,142232,139262,148729,137747,150013,156745,159960,145829,143955,140694,143389,144714,132203,147097,137746,148986,145554,143492,139413,148472,183235,147586,130321,149057,144071,146332,137117,139725,159283,139999,147058,139931,154356,151538,140868,141881,147521,139793,167824,140865,147138,149368,137502,148630,150675,149096,135551,147171,149106,143933,135847,146679,154220,141176,144197,145170,142229,150524,145106,155229,142692,140236,151274,137263,147088,147828,146273,145072,151377,149345,141963,145332,142300,139236,139685,139802,155711,138872,142989,144085,146966,134325,140795,143260,144475,151293,154818,150851,144426,140370,140935,148011,157093,135832,136005,149907,152369,148693,143263,137371,151207,138874,138825,146234,147134,143384,142868,145687,153967,152220,140262,137082,141181,141675,142698,141545,143557,152264,142287,138033,150424,139116,150193,144454,141533,143385,147301,141585,142275,147415,149149,149481,149586,142102,143555,145139,139105,146522,154530,140467,151470,151310,137611,146271,151473,139230,144936,153761,136678,150315,145925,150103,148005,140680,142513,158382,156357,158237,150132,143145,150947,135303,142779,141628,135839,140830,144803,171379,150795,149677,146241,138809,142339,145388,144781,144016,144905,141857,141501,140107,142011,136860,147295,141970,143009,143865,146937,161252,138535,146049,156931,157054,143566,153812,154198,163424,138654,184835,135471,143571,148994,138618,137350,140041,148536,151689,146815,144620,147127,138920,143448,164818,158305,144836,138806,150260,141228,142571,156043,147078,141005,149536,151346,134907,143892,150994,155477,138580,151093,137162,149167,147192,135274,154417,141798,145221,143850,148920,142116,140560,140915,136601,142073,161096,137496,153638,183343,144534,152339,153221,141564,142914,156550,140220,149941,155128,137528,141482,145517,143652,147349,141581,152779,157300,155807,152462,143902,148092,141671,163070,145519,146927,144037,140889,144696,142666,137936,141435,144257,151984,140222,150784,144145,141869,146640,140889,155736,152608,159946,138545,136226,162383,160242,138881,172836,155905,142425,142267,154789,140859,143415,150793,151812,148204,138686,152347,153503,139548,143652,150364,148130,157056,143006,144410,140510,147362,146843,138677,141971,150255,146238,134761,139139,148360,145479,142334,149134,140931,139086,139515,142112,141556,142896,146939,145712,151088,149373,149145,145235,151798,147207,139189,143461,148014,151217,153689,144791,140932,147539,153694,139811,140536,147154,151021,143711,143218,143982,141471,143224,150107,154242,142160,185512,144141,132955,138478,144611,150533,138524,147358,144686,144925,145951,140810,159626,146681,150429,139230,142033,145797,146747,143780,149645,168093,159450,142452,136863,152309,189630,148198,138605,143050,142374,143205,144241,147387,150049,140562,147534,152617,152934,142838,145254,143507,140483,146346,144627,139810,142930,159249,139771,145940,150091,148152,151311,152030,142966,137606,145457,144555,135592,138511,152612,138749,149072,139863,146415,141526,150609,137481,137801,137839,145672,145829,143902,142979,149117,141764,152521,153706,151430,146147,148755,133562,150927,139249,150049,147605,139618,143414,145847,145618,151554,145312,143250,158332,145929,154631,146734,150388,149485,142456,153238,137574,156153,138632,140608,155604,148384,146181,145554,141703,145297,148546,158047,146749,149848,145687,139951,152081,167576,153158,150162,169466,137822,143890,151789,143889,146576,153809,140948,158414,150548,155318,170832,138906,152066,154835,147793,142534,151879,145935,149180,140708,146912,139894,146819,172704,151971,147475,146515,148484,143740,136364,144062,142599,149009,150085,141320,136891,143804,138319,144181,145802,144743,153371,151966,149767,147183,147750,152753,150623,161289,144745,148359,141095,144774,151690,158061,147348,155699,153861,165558,139836,142589,138804,151185,138382,143412,139444,141568,138959,148006,144594,138938,140457,156573,151103,143365,142795,145882,141195,149388,140868,140506,149348,152310,144773,142907,148666,142377,147519,149697,148093,154823,134838,142086,139010,154128,140740,143189,136982,149347,142761,144882,149447,156258,155383,142484,148500,137029,187413,156321,155176,140564,149190,154537,145359,136821,136596,144996,136655,142292,148167,149772,148832,138629,147416,148994,144362,141106,152072,149866,141499,134869,141457,144663,138594,149101,142773,133819,150131,138275,155836,158765,135010,143579,145366,142167,147850,150430,143632,143399,138274,145653,142469,141512,138865,150609,144505,152187,161295,134380,145845,144697,149602,139947,146232,153224,151612,145486,152547,142809,149658,140206,139217,143715,146566,152979,161918,144030,143565,136844,149698,151554,145483,145926,138522,148399,146530,151738,156569,141265,135241,140699,143178,161689,144220,146333,161378,138534,147996,156778,135856,142628,144787,134889,141815,145545,142311,137456,169981,139761,151683,148870,140950,147726,144643,146560,190236,136362,142286,143953,142059,142343,162646,144246,143980,148217,155002,138574,144173,155072,151038,139021,143307,144339,139420,142452,139515,140527,162197,180778,144100,142366,143116,139456,153683,145699,154025,152722,142384,133652,143230,158936,143369,155699,151730,150110,149559,137254,142282,145785,149475,137287,147260,181503,149679,144596,144801,135258,138778,138397,149470,141530,146205,141788,147002,133651,145861,144193,145004,149341,147083,149324,149618,146823,141977,148083,151541,143332,139662,143283,143535,140152,146865,152496,150237,146083,162591,141269,154504,145024,139208,138637,139059,148928,139042,152045,144824,138894,148717,165303,140614,143732,144926,151825,140205,137709,157554,147331,146091,149629,141262,143701,144885,148184,142260,142218,142625,142192,143233,146096,137776,151764,143408,148522,144956,144939,136284,160749,164260,153928,146742,173494,144198,147646,150095,143530,136910,150749,153483,141905,174999,143867,168723,140461,153648,142566,141665,158169,141147,150441,168901,149321,144395,147167,138217,165141,158876,139365,146335,142367,144903,136953,144305,148169,132411,147540,143385,141463,145641,160108,150342,135952,145907,145652,159608,148049,143557,146531,136923,144012,141400,149242,146519,145410,147051,142572,149354,150498,139771,145950,145412,150754,132076,150009,150873,142154,150850,157959,143243,153252,145780,152250,137520,142487,154535,143901,142597,143078,138586,146057,143689,147151,153271,150767,134514,139105,144992,145243,156281,140072,157303,143533,153633,149315,136956,149371,150008,156715,144941,138761,141855,133294,150974,144553,160516,136198,138406,142443,152742,145445,150678,137358,143136,133211,179877,144781,149322,151172,150564,157152,143557,143811,139039,145668,137322,152257,148676,141759,151876,140807,144066,138564,136453,147710,145682,150514,147979,139780,133567,150738,140898,149374,148063,188532,140818,154390,160162,161466,142673,145204,147759,138709,145816,139951,141702,145682,149701,152345,143688,149335,142948,141992,141236,132046,147050,140636,154279,152152,146854,148076,147635,139811,149219,157112,144805,148641,162075,147305,142356,145220,150498,146901,153412,140527,156922,144327,141434,149374,145181,137384,146186,138490,146152,138889,146943,153133,153863,150976,143278,149884,155288,141297,150116,151306,142674,145668,145174,142476,139687,152549,158252,142181,156144,151000,139920,143195,148952,145916,154955,142722,138940,144102,142840,145803,157893,143587,143995,146820,144156,146117,168273,144968,140266,142956,140562,136870,147937,133948,146103,153361,145544,160011,145066,147160,160765,149418,152108,145902,142705,146731,148013,148189,144696,135130,139331,143784,137482,147508,136166,140713,143875,138042,151537,149653,140344,146978,160280,147272,140466,145503,139667,156940,142986,147987,156791,147856,150592,142716,143249,146147,148591,144342,148005,151469,140296,145150,143615,159281,137694,141241,142235,144654,138870,145483,141600,151626,139161,146159,161647,155126,135581,148644,148612,140875,146267,138035,137109,161399,151522,145532,145504,144310,146582,142498,155915,148449,143394,164871,141150,167340,165931,141359,156028,160129,148762,133529,138764,147358,145685,143782,142527,143199,140935,145994,145911,141712,141767,136467,143276,141930,140703,155099,141768,142250,155002,153062,162516,142895,148384,140284,152186,131534,153002,157928,152229,154045,140626,149824,142924,146151,152833,139688,140447,147000,143538,143933,147497,136347,143898,145556,141803,151622,142770,156647,142639,139764,137230,159077,147070,142778,138526,145809,148532,156611,141295,138477,135593,144541,141971,144790,143420,153654,155924,152430,139649,146343,148252,153285,144914,141503,140770,143826,143204,144906,149201,145777,146895,148253,148699,176985,142223,143142,138676,141304,143299,144474,191423,149649,143879,141283,146702,152791,146449,135345,141584,140513,143126,144961,140843,158369,153306,141469,149437,146210,136651,144619,145221,139104,144610,149709,141602,142378,137962,143270,148872,144284,153106,150252,147005,160001,145702,142916,150660,154832,151058,137960,152028,152487,152022,137327,151889,145640,138981,144807,160583,139705,157417,143628,143400,137553,140223,139498,142875,144972,142946,146046,148376,143551,137036,146333,147388,155485,144183,142731,159000,157111,154261,145338,140046,148895,146743,169662,142348,140063,139652,161259,138171,145974,135860,162048,151751,141818,144507,136990,154963,139078,149897,149925,140465,137028,148847,148873,151294,142325,137377,179112,139996,143106,141598,144831,152778,136842,148912,145591,145373,138526,134858,141158,149895,153952,165497,145220,156612,145170,139423,139686,146758,135614,153067,145237,153775,145955,150818,146337,156799,153348,143907,151722,149227,142438,153845,149144,149452,146770,138429,155126,163275,138964,150082,140076,145482,132699,164231,147317,150080,139650,139834,144881,150048,147328,150867,144809,153836,138399,145041,150333,145489,152865,143843,147158,142450,141065,144227,157777,163666,145028,143009,144167,146158,146009,142548,152223,140906,137174,143740,149924,140899,138929,141021,135229,152402,153494,151312,150829,137002,145132,150502,141155,146424,155257,154265,140759,138202,145511,154156,137655,142535,151051,146327,143093,148016,150186,146440,140661,150619,151333,152679,143377,137305,149409,142482,139159,142008,146734,138949,149118,144620,138527,139721,155276,140735,171870,148120,153753,140686,149720,147047,140624,146559,147191,143605,142216,145871,142275,154293,155797,145143,141603,151681,153725,150158,152179,147792,141530,137852,146243,141144,150240,141203,140725,146985,149533,130930,149240,144358,156291,143650,147553,151761,139877,144357,151353,146824,143907,134294,144889,152165,146433,146012,148537,141026,140228,150659,145766,150659,143648,147847,149101,148985,139461,150131,146322,148078,142973,143804,142546,139437,151726,139698,139373,147001,147305,139646,144385,136391,138805,150428,136701,133163,163268,142139,141539,146821,140752,135923,138511,147801,141411,142297,140310,145920,154417,149873,143639,157342,154120,146185,169045,143677,151742,144839,153715,140256,147127,137851,158581,156487,138450,157152,148088,150691,147456,147145,138648,141457,147906,143345,139882,140045,146953,153804,139311,156628,131656,146183,154480,161720,159875,145076,147948,143720,141773,143642,141844,168101,138378,148866,151844,143494,142977,139750,145111,138300,152689,161341,141310,146904,139025,139108,142171,146319,155117,144375,158072,147506,143536,152797,149868,141887,144018,135927,137149,142508,144938,141955,148851,165726,136098,144673,133177,163943,141591,142490,144417,151854,141575,161110,145272,139574,146081,148228,149969,136540,146220,163522,144241,137546,140999,146980,146893,151109,136137,142376,139870,143262,145894,144135,149861,152654,150467,149835,148039,144188,139765,138452,141976,145597,153292,140156,144255,143462,152121,137088,139974,145565,146343,142586,135627,139747,136332,147871,154447,144702,143143,142626,138639,148356,135587,145375,141676,147286,148564,150207,138054,151414,144824,144866,151324,136635,143031,154117,146584,153655,136906,139039,146315,145081,143696,140190,153080,138682,150898,154246,141860,145312,150865,146823,141810,148430,139100,143377,143854,138987,137703,146576,146366,155401,144451,152081,135878,147331,143326,147941,156483,141708,143539,152398,146558,150664,140117,146015,133062,142349,161758,146140,148522,146058,137027,143536,153248,138098,145301,149362,149454,139594,134335,143068,146269,142393,142588,168500,141793,158609,143674,139605,143179,138661,145368,139905,144875,145962,145411,146384,159262,149051,147674,154957,142816,162241,142271,143890,144049,136662,144204,158477,146962,141647,149162,145610,134493,140856,151082,148682,150433,156192,152067,141104,146402,159733,141788,146921,147886,153231,146029,143479,165837,137210,143498,141244,151177,146145,145348,149976,156955,141036,140715,136803,143509,142821,146639,144547,135812,140355,143788,141718,148289,141693,143522,143657,182201,142701,160363,151463,145295,144354,147649,146687,152449,141909,141343,155185,143922,136587,152209,136887,155430,147722,145257,143319,159703,140088,140822,154145,171374,153906,150440,140832,145760,141523,147370,147065,150716,170269,143714,138894,152315,147992,144169,133860,149044,150482,146558,150916,153233,162517,139755,145215,159130,140949,139313,173783,137323,143583]}]},"null_count":0,"tot_col_size":8550212697,"last_update_version":401695339853905922},"l_commitdate":{"histogram":{"ndv":2466,"buckets":[{"count":1230023,"lower_bound":"MTk5Mi0wMi0wNQ==","upper_bound":"MTk5Mi0wMy0wNQ==","repeats":120000},{"count":2550049,"lower_bound":"MTk5Mi0wMy0wNg==","upper_bound":"MTk5Mi0wMy0yMA==","repeats":180000},{"count":3780073,"lower_bound":"MTk5Mi0wMy0yMQ==","upper_bound":"MTk5Mi0wMy0zMA==","repeats":240000},{"count":5070098,"lower_bound":"MTk5Mi0wMy0zMQ==","upper_bound":"MTk5Mi0wNC0wNg==","repeats":120000},{"count":6270121,"lower_bound":"MTk5Mi0wNC0wNw==","upper_bound":"MTk5Mi0wNC0xNg==","repeats":90000},{"count":7560146,"lower_bound":"MTk5Mi0wNC0xNw==","upper_bound":"MTk5Mi0wNC0yNA==","repeats":180000},{"count":8760169,"lower_bound":"MTk5Mi0wNC0yNQ==","upper_bound":"MTk5Mi0wNS0wNQ==","repeats":180000},{"count":9960192,"lower_bound":"MTk5Mi0wNS0wNg==","upper_bound":"MTk5Mi0wNS0xMw==","repeats":60000},{"count":11160216,"lower_bound":"MTk5Mi0wNS0xNA==","upper_bound":"MTk5Mi0wNS0yMA==","repeats":210000},{"count":12450241,"lower_bound":"MTk5Mi0wNS0yMQ==","upper_bound":"MTk5Mi0wNS0zMA==","repeats":180000},{"count":13860268,"lower_bound":"MTk5Mi0wNS0zMQ==","upper_bound":"MTk5Mi0wNi0xMA==","repeats":240000},{"count":15090292,"lower_bound":"MTk5Mi0wNi0xMQ==","upper_bound":"MTk5Mi0wNi0yMA==","repeats":120000},{"count":16320316,"lower_bound":"MTk5Mi0wNi0yMQ==","upper_bound":"MTk5Mi0wNy0wMQ==","repeats":120000},{"count":17520339,"lower_bound":"MTk5Mi0wNy0wMg==","upper_bound":"MTk5Mi0wNy0xMw==","repeats":120000},{"count":18810364,"lower_bound":"MTk5Mi0wNy0xNA==","upper_bound":"MTk5Mi0wNy0yNQ==","repeats":210000},{"count":20070388,"lower_bound":"MTk5Mi0wNy0yNg==","upper_bound":"MTk5Mi0wOC0wNQ==","repeats":210000},{"count":21270411,"lower_bound":"MTk5Mi0wOC0wNg==","upper_bound":"MTk5Mi0wOC0xNg==","repeats":90000},{"count":22530436,"lower_bound":"MTk5Mi0wOC0xNw==","upper_bound":"MTk5Mi0wOC0yNA==","repeats":240000},{"count":23730459,"lower_bound":"MTk5Mi0wOC0yNQ==","upper_bound":"MTk5Mi0wOS0wMg==","repeats":60000},{"count":24960483,"lower_bound":"MTk5Mi0wOS0wMw==","upper_bound":"MTk5Mi0wOS0xMQ==","repeats":210000},{"count":26220507,"lower_bound":"MTk5Mi0wOS0xMg==","upper_bound":"MTk5Mi0wOS0xOQ==","repeats":90000},{"count":27510532,"lower_bound":"MTk5Mi0wOS0yMA==","upper_bound":"MTk5Mi0wOS0yOA==","repeats":120000},{"count":28800557,"lower_bound":"MTk5Mi0wOS0yOQ==","upper_bound":"MTk5Mi0xMC0xMA==","repeats":150000},{"count":30030581,"lower_bound":"MTk5Mi0xMC0xMQ==","upper_bound":"MTk5Mi0xMC0xOQ==","repeats":90000},{"count":31320606,"lower_bound":"MTk5Mi0xMC0yMA==","upper_bound":"MTk5Mi0xMC0zMA==","repeats":180000},{"count":32550630,"lower_bound":"MTk5Mi0xMC0zMQ==","upper_bound":"MTk5Mi0xMS0xMQ==","repeats":90000},{"count":33900656,"lower_bound":"MTk5Mi0xMS0xMg==","upper_bound":"MTk5Mi0xMS0yMg==","repeats":180000},{"count":35160681,"lower_bound":"MTk5Mi0xMS0yMw==","upper_bound":"MTk5Mi0xMS0zMA==","repeats":360000},{"count":36360704,"lower_bound":"MTk5Mi0xMi0wMQ==","upper_bound":"MTk5Mi0xMi0xMg==","repeats":30000},{"count":37590728,"lower_bound":"MTk5Mi0xMi0xMw==","upper_bound":"MTk5Mi0xMi0yMg==","repeats":60000},{"count":38940754,"lower_bound":"MTk5Mi0xMi0yMw==","upper_bound":"MTk5My0wMS0wMw==","repeats":210000},{"count":40170778,"lower_bound":"MTk5My0wMS0wNA==","upper_bound":"MTk5My0wMS0xMg==","repeats":120000},{"count":41490803,"lower_bound":"MTk5My0wMS0xMw==","upper_bound":"MTk5My0wMS0yMw==","repeats":180000},{"count":42720827,"lower_bound":"MTk5My0wMS0yNA==","upper_bound":"MTk5My0wMi0wMg==","repeats":90000},{"count":44130854,"lower_bound":"MTk5My0wMi0wMw==","upper_bound":"MTk5My0wMi0xMg==","repeats":300000},{"count":45360878,"lower_bound":"MTk5My0wMi0xMw==","upper_bound":"MTk5My0wMi0yNQ==","repeats":120000},{"count":46650903,"lower_bound":"MTk5My0wMi0yNg==","upper_bound":"MTk5My0wMy0wNg==","repeats":120000},{"count":47910928,"lower_bound":"MTk5My0wMy0wNw==","upper_bound":"MTk5My0wMy0xOA==","repeats":150000},{"count":49200953,"lower_bound":"MTk5My0wMy0xOQ==","upper_bound":"MTk5My0wMy0yOQ==","repeats":120000},{"count":50460977,"lower_bound":"MTk5My0wMy0zMA==","upper_bound":"MTk5My0wNC0wOA==","repeats":90000},{"count":51691001,"lower_bound":"MTk5My0wNC0wOQ==","upper_bound":"MTk5My0wNC0xOQ==","repeats":60000},{"count":53101028,"lower_bound":"MTk5My0wNC0yMA==","upper_bound":"MTk5My0wNC0yOQ==","repeats":240000},{"count":54301051,"lower_bound":"MTk5My0wNC0zMA==","upper_bound":"MTk5My0wNS0wOA==","repeats":90000},{"count":55531075,"lower_bound":"MTk5My0wNS0wOQ==","upper_bound":"MTk5My0wNS0xNg==","repeats":270000},{"count":56761099,"lower_bound":"MTk5My0wNS0xNw==","upper_bound":"MTk5My0wNS0yOA==","repeats":60000},{"count":57991123,"lower_bound":"MTk5My0wNS0yOQ==","upper_bound":"MTk5My0wNi0wNQ==","repeats":150000},{"count":59341149,"lower_bound":"MTk5My0wNi0wNg==","upper_bound":"MTk5My0wNi0xNg==","repeats":180000},{"count":60541172,"lower_bound":"MTk5My0wNi0xNw==","upper_bound":"MTk5My0wNi0yNg==","repeats":60000},{"count":61861198,"lower_bound":"MTk5My0wNi0yNw==","upper_bound":"MTk5My0wNy0wNw==","repeats":150000},{"count":63151223,"lower_bound":"MTk5My0wNy0wOA==","upper_bound":"MTk5My0wNy0xNw==","repeats":180000},{"count":64381247,"lower_bound":"MTk5My0wNy0xOA==","upper_bound":"MTk5My0wNy0yNw==","repeats":180000},{"count":65611270,"lower_bound":"MTk5My0wNy0yOA==","upper_bound":"MTk5My0wOC0wNQ==","repeats":150000},{"count":66841294,"lower_bound":"MTk5My0wOC0wNg==","upper_bound":"MTk5My0wOC0xNA==","repeats":120000},{"count":68041317,"lower_bound":"MTk5My0wOC0xNQ==","upper_bound":"MTk5My0wOC0yNg==","repeats":120000},{"count":69361343,"lower_bound":"MTk5My0wOC0yNw==","upper_bound":"MTk5My0wOS0wNw==","repeats":150000},{"count":70621367,"lower_bound":"MTk5My0wOS0wOA==","upper_bound":"MTk5My0wOS0xNg==","repeats":180000},{"count":71821391,"lower_bound":"MTk5My0wOS0xNw==","upper_bound":"MTk5My0wOS0yNA==","repeats":120000},{"count":73141416,"lower_bound":"MTk5My0wOS0yNQ==","upper_bound":"MTk5My0xMC0wMg==","repeats":150000},{"count":74431441,"lower_bound":"MTk5My0xMC0wMw==","upper_bound":"MTk5My0xMC0xMw==","repeats":150000},{"count":75631464,"lower_bound":"MTk5My0xMC0xNA==","upper_bound":"MTk5My0xMC0yNQ==","repeats":60000},{"count":77011491,"lower_bound":"MTk5My0xMC0yNg==","upper_bound":"MTk5My0xMS0wMw==","repeats":270000},{"count":78211514,"lower_bound":"MTk5My0xMS0wNA==","upper_bound":"MTk5My0xMS0xNA==","repeats":30000},{"count":79591541,"lower_bound":"MTk5My0xMS0xNQ==","upper_bound":"MTk5My0xMS0yNQ==","repeats":210000},{"count":80791564,"lower_bound":"MTk5My0xMS0yNg==","upper_bound":"MTk5My0xMi0wMw==","repeats":180000},{"count":82021588,"lower_bound":"MTk5My0xMi0wNA==","upper_bound":"MTk5My0xMi0xMw==","repeats":60000},{"count":83491617,"lower_bound":"MTk5My0xMi0xNA==","upper_bound":"MTk5My0xMi0yNQ==","repeats":300000},{"count":84691640,"lower_bound":"MTk5My0xMi0yNg==","upper_bound":"MTk5NC0wMS0wMw==","repeats":210000},{"count":85891663,"lower_bound":"MTk5NC0wMS0wNA==","upper_bound":"MTk5NC0wMS0xMQ==","repeats":90000},{"count":87121687,"lower_bound":"MTk5NC0wMS0xMg==","upper_bound":"MTk5NC0wMS0yMQ==","repeats":180000},{"count":88411712,"lower_bound":"MTk5NC0wMS0yMg==","upper_bound":"MTk5NC0wMi0wMQ==","repeats":120000},{"count":89641736,"lower_bound":"MTk5NC0wMi0wMg==","upper_bound":"MTk5NC0wMi0xMA==","repeats":210000},{"count":90901760,"lower_bound":"MTk5NC0wMi0xMQ==","upper_bound":"MTk5NC0wMi0yMQ==","repeats":90000},{"count":92131784,"lower_bound":"MTk5NC0wMi0yMg==","upper_bound":"MTk5NC0wMy0wMw==","repeats":150000},{"count":93481810,"lower_bound":"MTk5NC0wMy0wNA==","upper_bound":"MTk5NC0wMy0xNA==","repeats":210000},{"count":94741835,"lower_bound":"MTk5NC0wMy0xNQ==","upper_bound":"MTk5NC0wMy0yMg==","repeats":150000},{"count":95971858,"lower_bound":"MTk5NC0wMy0yMw==","upper_bound":"MTk5NC0wNC0wNA==","repeats":90000},{"count":97171882,"lower_bound":"MTk5NC0wNC0wNQ==","upper_bound":"MTk5NC0wNC0xMw==","repeats":120000},{"count":98521908,"lower_bound":"MTk5NC0wNC0xNA==","upper_bound":"MTk5NC0wNC0yMQ==","repeats":180000},{"count":99781932,"lower_bound":"MTk5NC0wNC0yMg==","upper_bound":"MTk5NC0wNS0wMQ==","repeats":150000},{"count":101071957,"lower_bound":"MTk5NC0wNS0wMg==","upper_bound":"MTk5NC0wNS0xMQ==","repeats":120000},{"count":102421983,"lower_bound":"MTk5NC0wNS0xMg==","upper_bound":"MTk5NC0wNS0yMQ==","repeats":270000},{"count":103652007,"lower_bound":"MTk5NC0wNS0yMg==","upper_bound":"MTk5NC0wNS0zMA==","repeats":120000},{"count":104912032,"lower_bound":"MTk5NC0wNS0zMQ==","upper_bound":"MTk5NC0wNi0wOA==","repeats":90000},{"count":106112055,"lower_bound":"MTk5NC0wNi0wOQ==","upper_bound":"MTk5NC0wNi0xNw==","repeats":120000},{"count":107312078,"lower_bound":"MTk5NC0wNi0xOA==","upper_bound":"MTk5NC0wNi0yNQ==","repeats":120000},{"count":108542102,"lower_bound":"MTk5NC0wNi0yNg==","upper_bound":"MTk5NC0wNy0wNQ==","repeats":120000},{"count":109772126,"lower_bound":"MTk5NC0wNy0wNg==","upper_bound":"MTk5NC0wNy0xNA==","repeats":180000},{"count":111032150,"lower_bound":"MTk5NC0wNy0xNQ==","upper_bound":"MTk5NC0wNy0yNQ==","repeats":120000},{"count":112352176,"lower_bound":"MTk5NC0wNy0yNg==","upper_bound":"MTk5NC0wOC0wMQ==","repeats":210000},{"count":113612200,"lower_bound":"MTk5NC0wOC0wMg==","upper_bound":"MTk5NC0wOC0xMw==","repeats":210000},{"count":114872225,"lower_bound":"MTk5NC0wOC0xNA==","upper_bound":"MTk5NC0wOC0yMw==","repeats":180000},{"count":116102248,"lower_bound":"MTk5NC0wOC0yNA==","upper_bound":"MTk5NC0wOS0wNA==","repeats":210000},{"count":117362273,"lower_bound":"MTk5NC0wOS0wNQ==","upper_bound":"MTk5NC0wOS0xNg==","repeats":120000},{"count":118622297,"lower_bound":"MTk5NC0wOS0xNw==","upper_bound":"MTk5NC0wOS0yOA==","repeats":180000},{"count":119852321,"lower_bound":"MTk5NC0wOS0yOQ==","upper_bound":"MTk5NC0xMC0wOQ==","repeats":90000},{"count":121142346,"lower_bound":"MTk5NC0xMC0xMA==","upper_bound":"MTk5NC0xMC0yMw==","repeats":180000},{"count":122342369,"lower_bound":"MTk5NC0xMC0yNA==","upper_bound":"MTk5NC0xMS0wMw==","repeats":120000},{"count":123572393,"lower_bound":"MTk5NC0xMS0wNA==","upper_bound":"MTk5NC0xMS0xMQ==","repeats":180000},{"count":124772416,"lower_bound":"MTk5NC0xMS0xMg==","upper_bound":"MTk5NC0xMS0yMQ==","repeats":90000},{"count":126002440,"lower_bound":"MTk5NC0xMS0yMg==","upper_bound":"MTk5NC0xMi0wMg==","repeats":120000},{"count":127202463,"lower_bound":"MTk5NC0xMi0wMw==","upper_bound":"MTk5NC0xMi0xNA==","repeats":90000},{"count":128462488,"lower_bound":"MTk5NC0xMi0xNQ==","upper_bound":"MTk5NC0xMi0yMg==","repeats":240000},{"count":129722512,"lower_bound":"MTk5NC0xMi0yMw==","upper_bound":"MTk5NS0wMS0wNA==","repeats":150000},{"count":130952536,"lower_bound":"MTk5NS0wMS0wNQ==","upper_bound":"MTk5NS0wMS0xNA==","repeats":90000},{"count":132182560,"lower_bound":"MTk5NS0wMS0xNQ==","upper_bound":"MTk5NS0wMS0yNA==","repeats":60000},{"count":133412584,"lower_bound":"MTk5NS0wMS0yNQ==","upper_bound":"MTk5NS0wMi0wNA==","repeats":150000},{"count":134732609,"lower_bound":"MTk5NS0wMi0wNQ==","upper_bound":"MTk5NS0wMi0xNg==","repeats":210000},{"count":135992634,"lower_bound":"MTk5NS0wMi0xNw==","upper_bound":"MTk5NS0wMi0yNQ==","repeats":150000},{"count":137312659,"lower_bound":"MTk5NS0wMi0yNg==","upper_bound":"MTk5NS0wMy0wNw==","repeats":210000},{"count":138542683,"lower_bound":"MTk5NS0wMy0wOA==","upper_bound":"MTk5NS0wMy0xNA==","repeats":180000},{"count":139772707,"lower_bound":"MTk5NS0wMy0xNQ==","upper_bound":"MTk5NS0wMy0yNQ==","repeats":60000},{"count":140972730,"lower_bound":"MTk5NS0wMy0yNg==","upper_bound":"MTk5NS0wNC0wMg==","repeats":150000},{"count":142202754,"lower_bound":"MTk5NS0wNC0wMw==","upper_bound":"MTk5NS0wNC0xMQ==","repeats":120000},{"count":143462778,"lower_bound":"MTk5NS0wNC0xMg==","upper_bound":"MTk5NS0wNC0xOQ==","repeats":210000},{"count":144692802,"lower_bound":"MTk5NS0wNC0yMA==","upper_bound":"MTk5NS0wNC0yNw==","repeats":150000},{"count":145892825,"lower_bound":"MTk5NS0wNC0yOA==","upper_bound":"MTk5NS0wNS0wNw==","repeats":90000},{"count":147272852,"lower_bound":"MTk5NS0wNS0wOA==","upper_bound":"MTk5NS0wNS0xNw==","repeats":240000},{"count":148622878,"lower_bound":"MTk5NS0wNS0xOA==","upper_bound":"MTk5NS0wNS0yOQ==","repeats":240000},{"count":149822902,"lower_bound":"MTk5NS0wNS0zMA==","upper_bound":"MTk5NS0wNi0wNg==","repeats":120000},{"count":151022925,"lower_bound":"MTk5NS0wNi0wNw==","upper_bound":"MTk5NS0wNi0xNg==","repeats":120000},{"count":152282949,"lower_bound":"MTk5NS0wNi0xNw==","upper_bound":"MTk5NS0wNi0yNw==","repeats":210000},{"count":153512973,"lower_bound":"MTk5NS0wNi0yOA==","upper_bound":"MTk5NS0wNy0wOA==","repeats":180000},{"count":154862999,"lower_bound":"MTk5NS0wNy0wOQ==","upper_bound":"MTk5NS0wNy0xNw==","repeats":180000},{"count":156093023,"lower_bound":"MTk5NS0wNy0xOA==","upper_bound":"MTk5NS0wNy0yOA==","repeats":90000},{"count":157323047,"lower_bound":"MTk5NS0wNy0yOQ==","upper_bound":"MTk5NS0wOC0wNQ==","repeats":150000},{"count":158673073,"lower_bound":"MTk5NS0wOC0wNg==","upper_bound":"MTk5NS0wOC0xNQ==","repeats":180000},{"count":159903097,"lower_bound":"MTk5NS0wOC0xNg==","upper_bound":"MTk5NS0wOC0yNw==","repeats":150000},{"count":161103120,"lower_bound":"MTk5NS0wOC0yOA==","upper_bound":"MTk5NS0wOS0wNw==","repeats":90000},{"count":162393145,"lower_bound":"MTk5NS0wOS0wOA==","upper_bound":"MTk5NS0wOS0xNg==","repeats":120000},{"count":163623169,"lower_bound":"MTk5NS0wOS0xNw==","upper_bound":"MTk5NS0wOS0yNg==","repeats":180000},{"count":164943194,"lower_bound":"MTk5NS0wOS0yNw==","upper_bound":"MTk5NS0xMC0wNA==","repeats":150000},{"count":166173218,"lower_bound":"MTk5NS0xMC0wNQ==","upper_bound":"MTk5NS0xMC0xNg==","repeats":150000},{"count":167463243,"lower_bound":"MTk5NS0xMC0xNw==","upper_bound":"MTk5NS0xMC0yNw==","repeats":150000},{"count":168663266,"lower_bound":"MTk5NS0xMC0yOA==","upper_bound":"MTk5NS0xMS0wNQ==","repeats":150000},{"count":169953291,"lower_bound":"MTk5NS0xMS0wNg==","upper_bound":"MTk5NS0xMS0xNA==","repeats":210000},{"count":171243316,"lower_bound":"MTk5NS0xMS0xNQ==","upper_bound":"MTk5NS0xMS0yNQ==","repeats":240000},{"count":172593343,"lower_bound":"MTk5NS0xMS0yNw==","upper_bound":"MTk5NS0xMi0wOA==","repeats":210000},{"count":173943369,"lower_bound":"MTk5NS0xMi0wOQ==","upper_bound":"MTk5NS0xMi0xNw==","repeats":210000},{"count":175143392,"lower_bound":"MTk5NS0xMi0xOA==","upper_bound":"MTk5NS0xMi0yNw==","repeats":120000},{"count":176373416,"lower_bound":"MTk5NS0xMi0yOA==","upper_bound":"MTk5Ni0wMS0wMw==","repeats":210000},{"count":177573439,"lower_bound":"MTk5Ni0wMS0wNA==","upper_bound":"MTk5Ni0wMS0xMw==","repeats":180000},{"count":178833463,"lower_bound":"MTk5Ni0wMS0xNA==","upper_bound":"MTk5Ni0wMS0yNQ==","repeats":180000},{"count":180033487,"lower_bound":"MTk5Ni0wMS0yNg==","upper_bound":"MTk5Ni0wMi0wNw==","repeats":90000},{"count":181263511,"lower_bound":"MTk5Ni0wMi0wOA==","upper_bound":"MTk5Ni0wMi0xNw==","repeats":150000},{"count":182463534,"lower_bound":"MTk5Ni0wMi0xOA==","upper_bound":"MTk5Ni0wMi0yNw==","repeats":90000},{"count":183663557,"lower_bound":"MTk5Ni0wMi0yOA==","upper_bound":"MTk5Ni0wMy0wNg==","repeats":150000},{"count":184863580,"lower_bound":"MTk5Ni0wMy0wNw==","upper_bound":"MTk5Ni0wMy0xOA==","repeats":30000},{"count":186063603,"lower_bound":"MTk5Ni0wMy0xOQ==","upper_bound":"MTk5Ni0wMy0yNw==","repeats":120000},{"count":187383629,"lower_bound":"MTk5Ni0wMy0yOQ==","upper_bound":"MTk5Ni0wNC0wNw==","repeats":150000},{"count":188733655,"lower_bound":"MTk5Ni0wNC0wOA==","upper_bound":"MTk5Ni0wNC0xNw==","repeats":180000},{"count":189993680,"lower_bound":"MTk5Ni0wNC0xOA==","upper_bound":"MTk5Ni0wNC0yNQ==","repeats":120000},{"count":191313705,"lower_bound":"MTk5Ni0wNC0yNg==","upper_bound":"MTk5Ni0wNS0wNA==","repeats":210000},{"count":192513728,"lower_bound":"MTk5Ni0wNS0wNQ==","upper_bound":"MTk5Ni0wNS0xMw==","repeats":150000},{"count":193923756,"lower_bound":"MTk5Ni0wNS0xNA==","upper_bound":"MTk5Ni0wNS0yMw==","repeats":240000},{"count":195213781,"lower_bound":"MTk5Ni0wNS0yNA==","upper_bound":"MTk5Ni0wNi0wMg==","repeats":180000},{"count":196443805,"lower_bound":"MTk5Ni0wNi0wMw==","upper_bound":"MTk5Ni0wNi0xMw==","repeats":150000},{"count":197763830,"lower_bound":"MTk5Ni0wNi0xNA==","upper_bound":"MTk5Ni0wNi0yMw==","repeats":150000},{"count":198963853,"lower_bound":"MTk5Ni0wNi0yNA==","upper_bound":"MTk5Ni0wNy0wMw==","repeats":210000},{"count":200313880,"lower_bound":"MTk5Ni0wNy0wNA==","upper_bound":"MTk5Ni0wNy0xNA==","repeats":210000},{"count":201573904,"lower_bound":"MTk5Ni0wNy0xNQ==","upper_bound":"MTk5Ni0wNy0yNA==","repeats":150000},{"count":202923930,"lower_bound":"MTk5Ni0wNy0yNQ==","upper_bound":"MTk5Ni0wOC0wMQ==","repeats":180000},{"count":204153954,"lower_bound":"MTk5Ni0wOC0wMg==","upper_bound":"MTk5Ni0wOC0wOQ==","repeats":180000},{"count":205533981,"lower_bound":"MTk5Ni0wOC0xMA==","upper_bound":"MTk5Ni0wOC0xOA==","repeats":210000},{"count":206824006,"lower_bound":"MTk5Ni0wOC0xOQ==","upper_bound":"MTk5Ni0wOS0wMQ==","repeats":150000},{"count":208024029,"lower_bound":"MTk5Ni0wOS0wMg==","upper_bound":"MTk5Ni0wOS0xMg==","repeats":30000},{"count":209434056,"lower_bound":"MTk5Ni0wOS0xMw==","upper_bound":"MTk5Ni0wOS0yMg==","repeats":240000},{"count":210724081,"lower_bound":"MTk5Ni0wOS0yMw==","upper_bound":"MTk5Ni0xMC0wNA==","repeats":210000},{"count":211924104,"lower_bound":"MTk5Ni0xMC0wNQ==","upper_bound":"MTk5Ni0xMC0xMg==","repeats":150000},{"count":213124128,"lower_bound":"MTk5Ni0xMC0xMw==","upper_bound":"MTk5Ni0xMC0yMg==","repeats":120000},{"count":214384152,"lower_bound":"MTk5Ni0xMC0yMw==","upper_bound":"MTk5Ni0xMS0wMg==","repeats":90000},{"count":215704178,"lower_bound":"MTk5Ni0xMS0wMw==","upper_bound":"MTk5Ni0xMS0xMQ==","repeats":180000},{"count":216934201,"lower_bound":"MTk5Ni0xMS0xMg==","upper_bound":"MTk5Ni0xMS0yMQ==","repeats":180000},{"count":218134225,"lower_bound":"MTk5Ni0xMS0yMg==","upper_bound":"MTk5Ni0xMi0wMQ==","repeats":240000},{"count":219364249,"lower_bound":"MTk5Ni0xMi0wMg==","upper_bound":"MTk5Ni0xMi0xMQ==","repeats":60000},{"count":220594272,"lower_bound":"MTk5Ni0xMi0xMg==","upper_bound":"MTk5Ni0xMi0yMw==","repeats":60000},{"count":221884297,"lower_bound":"MTk5Ni0xMi0yNA==","upper_bound":"MTk5Ny0wMS0wMg==","repeats":180000},{"count":223294325,"lower_bound":"MTk5Ny0wMS0wMw==","upper_bound":"MTk5Ny0wMS0xMQ==","repeats":240000},{"count":224524348,"lower_bound":"MTk5Ny0wMS0xMg==","upper_bound":"MTk5Ny0wMS0xOQ==","repeats":150000},{"count":225754372,"lower_bound":"MTk5Ny0wMS0yMA==","upper_bound":"MTk5Ny0wMS0yOQ==","repeats":120000},{"count":226954396,"lower_bound":"MTk5Ny0wMS0zMA==","upper_bound":"MTk5Ny0wMi0wNQ==","repeats":210000},{"count":228214420,"lower_bound":"MTk5Ny0wMi0wNg==","upper_bound":"MTk5Ny0wMi0xNg==","repeats":120000},{"count":229474444,"lower_bound":"MTk5Ny0wMi0xNw==","upper_bound":"MTk5Ny0wMi0yNw==","repeats":180000},{"count":230794470,"lower_bound":"MTk5Ny0wMi0yOA==","upper_bound":"MTk5Ny0wMy0xMA==","repeats":210000},{"count":231994493,"lower_bound":"MTk5Ny0wMy0xMQ==","upper_bound":"MTk5Ny0wMy0yMQ==","repeats":60000},{"count":233194516,"lower_bound":"MTk5Ny0wMy0yMg==","upper_bound":"MTk5Ny0wMy0yOQ==","repeats":90000},{"count":234484541,"lower_bound":"MTk5Ny0wMy0zMA==","upper_bound":"MTk5Ny0wNC0xMA==","repeats":150000},{"count":235684565,"lower_bound":"MTk5Ny0wNC0xMQ==","upper_bound":"MTk5Ny0wNC0yMQ==","repeats":60000},{"count":236884588,"lower_bound":"MTk5Ny0wNC0yMg==","upper_bound":"MTk5Ny0wNS0wMw==","repeats":150000},{"count":238084611,"lower_bound":"MTk5Ny0wNS0wNA==","upper_bound":"MTk5Ny0wNS0xMw==","repeats":150000},{"count":239284634,"lower_bound":"MTk5Ny0wNS0xNA==","upper_bound":"MTk5Ny0wNS0yMA==","repeats":180000},{"count":240574659,"lower_bound":"MTk5Ny0wNS0yMQ==","upper_bound":"MTk5Ny0wNS0zMQ==","repeats":120000},{"count":241774683,"lower_bound":"MTk5Ny0wNi0wMQ==","upper_bound":"MTk5Ny0wNi0xMQ==","repeats":150000},{"count":242974706,"lower_bound":"MTk5Ny0wNi0xMg==","upper_bound":"MTk5Ny0wNi0yMQ==","repeats":150000},{"count":244264731,"lower_bound":"MTk5Ny0wNi0yMg==","upper_bound":"MTk5Ny0wNi0yOQ==","repeats":210000},{"count":245554756,"lower_bound":"MTk5Ny0wNi0zMA==","upper_bound":"MTk5Ny0wNy0wOQ==","repeats":120000},{"count":246904782,"lower_bound":"MTk5Ny0wNy0xMA==","upper_bound":"MTk5Ny0wNy0yMg==","repeats":240000},{"count":248194807,"lower_bound":"MTk5Ny0wNy0yMw==","upper_bound":"MTk5Ny0wOC0wMQ==","repeats":210000},{"count":249424831,"lower_bound":"MTk5Ny0wOC0wMg==","upper_bound":"MTk5Ny0wOC0xMA==","repeats":120000},{"count":250684855,"lower_bound":"MTk5Ny0wOC0xMQ==","upper_bound":"MTk5Ny0wOC0yMQ==","repeats":90000},{"count":252004881,"lower_bound":"MTk5Ny0wOC0yMg==","upper_bound":"MTk5Ny0wOC0zMQ==","repeats":240000},{"count":253234905,"lower_bound":"MTk5Ny0wOS0wMQ==","upper_bound":"MTk5Ny0wOS0xMA==","repeats":60000},{"count":254464928,"lower_bound":"MTk5Ny0wOS0xMQ==","upper_bound":"MTk5Ny0wOS0xOA==","repeats":90000},{"count":255724953,"lower_bound":"MTk5Ny0wOS0xOQ==","upper_bound":"MTk5Ny0wOS0zMA==","repeats":180000},{"count":256984977,"lower_bound":"MTk5Ny0xMC0wMQ==","upper_bound":"MTk5Ny0xMC0xMA==","repeats":150000},{"count":258335003,"lower_bound":"MTk5Ny0xMC0xMQ==","upper_bound":"MTk5Ny0xMC0xOQ==","repeats":240000},{"count":259595028,"lower_bound":"MTk5Ny0xMC0yMA==","upper_bound":"MTk5Ny0xMC0yOA==","repeats":120000},{"count":260795051,"lower_bound":"MTk5Ny0xMC0yOQ==","upper_bound":"MTk5Ny0xMS0xMA==","repeats":150000},{"count":262145077,"lower_bound":"MTk5Ny0xMS0xMQ==","upper_bound":"MTk5Ny0xMS0yMg==","repeats":210000},{"count":263435102,"lower_bound":"MTk5Ny0xMS0yMw==","upper_bound":"MTk5Ny0xMi0wMQ==","repeats":150000},{"count":264695127,"lower_bound":"MTk5Ny0xMi0wMg==","upper_bound":"MTk5Ny0xMi0xMQ==","repeats":240000},{"count":265985152,"lower_bound":"MTk5Ny0xMi0xMg==","upper_bound":"MTk5Ny0xMi0yNQ==","repeats":120000},{"count":267275177,"lower_bound":"MTk5Ny0xMi0yNg==","upper_bound":"MTk5OC0wMS0wMw==","repeats":150000},{"count":268505200,"lower_bound":"MTk5OC0wMS0wNA==","upper_bound":"MTk5OC0wMS0xMQ==","repeats":180000},{"count":269735224,"lower_bound":"MTk5OC0wMS0xMw==","upper_bound":"MTk5OC0wMS0yMg==","repeats":120000},{"count":271025249,"lower_bound":"MTk5OC0wMS0yMw==","upper_bound":"MTk5OC0wMi0wNA==","repeats":120000},{"count":272315274,"lower_bound":"MTk5OC0wMi0wNQ==","upper_bound":"MTk5OC0wMi0xNQ==","repeats":120000},{"count":273665300,"lower_bound":"MTk5OC0wMi0xNg==","upper_bound":"MTk5OC0wMi0yNQ==","repeats":180000},{"count":274895324,"lower_bound":"MTk5OC0wMi0yNg==","upper_bound":"MTk5OC0wMy0wNw==","repeats":120000},{"count":276095347,"lower_bound":"MTk5OC0wMy0wOA==","upper_bound":"MTk5OC0wMy0xOA==","repeats":90000},{"count":277385372,"lower_bound":"MTk5OC0wMy0xOQ==","upper_bound":"MTk5OC0wMy0yNw==","repeats":210000},{"count":278645397,"lower_bound":"MTk5OC0wMy0yOA==","upper_bound":"MTk5OC0wNC0wOA==","repeats":270000},{"count":279845420,"lower_bound":"MTk5OC0wNC0wOQ==","upper_bound":"MTk5OC0wNC0xNg==","repeats":180000},{"count":281105444,"lower_bound":"MTk5OC0wNC0xNw==","upper_bound":"MTk5OC0wNC0yNg==","repeats":90000},{"count":282305468,"lower_bound":"MTk5OC0wNC0yNw==","upper_bound":"MTk5OC0wNS0wNg==","repeats":150000},{"count":283505491,"lower_bound":"MTk5OC0wNS0wNw==","upper_bound":"MTk5OC0wNS0xNg==","repeats":120000},{"count":284735515,"lower_bound":"MTk5OC0wNS0xNw==","upper_bound":"MTk5OC0wNS0yNw==","repeats":150000},{"count":285935538,"lower_bound":"MTk5OC0wNS0yOA==","upper_bound":"MTk5OC0wNi0wNg==","repeats":120000},{"count":287255564,"lower_bound":"MTk5OC0wNi0wNw==","upper_bound":"MTk5OC0wNi0xNw==","repeats":150000},{"count":288455587,"lower_bound":"MTk5OC0wNi0xOA==","upper_bound":"MTk5OC0wNi0yOA==","repeats":150000},{"count":289655610,"lower_bound":"MTk5OC0wNi0zMA==","upper_bound":"MTk5OC0wNy0xMA==","repeats":120000},{"count":290945635,"lower_bound":"MTk5OC0wNy0xMQ==","upper_bound":"MTk5OC0wNy0xOA==","repeats":270000},{"count":292175659,"lower_bound":"MTk5OC0wNy0xOQ==","upper_bound":"MTk5OC0wNy0zMQ==","repeats":90000},{"count":293435683,"lower_bound":"MTk5OC0wOC0wMQ==","upper_bound":"MTk5OC0wOC0wOQ==","repeats":90000},{"count":294635706,"lower_bound":"MTk5OC0wOC0xMA==","upper_bound":"MTk5OC0wOC0xOQ==","repeats":150000},{"count":295835730,"lower_bound":"MTk5OC0wOC0yMA==","upper_bound":"MTk5OC0wOC0zMQ==","repeats":60000},{"count":297185756,"lower_bound":"MTk5OC0wOS0wMQ==","upper_bound":"MTk5OC0wOS0xMA==","repeats":180000},{"count":298445780,"lower_bound":"MTk5OC0wOS0xMQ==","upper_bound":"MTk5OC0wOS0yMg==","repeats":150000},{"count":299675804,"lower_bound":"MTk5OC0wOS0yMw==","upper_bound":"MTk5OC0xMC0xNg==","repeats":60000},{"count":300005811,"lower_bound":"MTk5OC0xMC0xNw==","upper_bound":"MTk5OC0xMC0yOA==","repeats":30000}]},"cm_sketch":{"rows":[{"counters":[249577,163040,249612,124603,249050,124631,0,125196,374306,125095,622188,124913,0,124318,0,124596,249751,0,124110,125165,124924,124937,124700,123739,124666,0,0,249332,125142,124960,0,124786,124755,249462,124533,0,0,499838,374125,0,373360,124164,124609,250097,249842,250083,374058,0,271934,0,124783,0,124556,280785,0,373751,0,249162,125140,124457,0,374880,0,0,0,549734,248567,124898,124328,165607,0,124975,373845,0,125162,249111,0,0,249426,249908,0,123792,179644,375628,124607,201582,124481,124610,0,249362,249228,125228,125520,250477,0,125123,124704,0,0,0,0,0,0,124437,216990,0,0,355714,124796,0,249077,124311,124773,249156,0,0,0,124286,0,248690,542978,124418,0,498116,0,125094,249004,623954,0,124036,248610,249142,374210,0,124777,124234,0,124446,124935,125378,124853,248443,249850,0,0,249998,0,249021,125104,0,124686,124000,130727,0,0,0,0,249382,247833,0,0,0,124488,0,0,249828,373322,249870,0,125080,249533,0,248939,124262,0,0,249532,125419,0,124885,124462,124896,249253,0,0,249143,124860,0,124820,124743,124855,498239,0,0,2065,0,0,124808,125153,125150,125192,125142,124845,0,125152,498652,128701,123799,124394,124809,337096,249546,0,0,124716,248574,125020,0,250074,16347,249229,374070,125054,125050,124686,0,498083,0,241759,249560,248452,249794,249503,374568,124226,249303,0,0,249731,124266,0,0,124341,124653,124796,0,124714,0,0,249685,124639,249791,0,249504,623388,124969,492574,0,249188,0,124045,0,124517,249159,124411,0,124753,124546,248990,124824,249253,0,0,249295,249353,124476,18159,374005,0,124690,124383,124407,0,124493,124474,224818,499194,0,249676,375409,249113,0,124821,0,125502,125285,249991,374048,124837,250195,499676,375150,0,124943,0,125330,124357,125073,498645,124155,124950,124387,249976,0,498446,124642,124224,250250,124549,124624,357420,0,124923,208012,0,124587,0,248647,123975,249295,124918,0,249469,125326,248831,0,0,0,0,248548,73960,0,0,124959,0,0,249516,0,249687,249149,124854,0,124274,374256,0,0,124262,249879,0,249037,373396,0,125300,444959,248636,124074,249029,123889,372811,372998,125007,0,124172,0,124988,91984,124444,0,124634,498243,124768,249930,250130,124922,124569,0,0,124367,338122,374453,124170,250051,0,124821,373141,0,0,124752,373295,249400,0,0,124841,249689,124323,0,0,499571,374846,0,0,373291,0,374287,351849,124324,124492,0,0,373928,124779,125107,124362,0,124805,0,0,124986,0,59576,124855,373261,0,125044,201845,0,248662,624019,124456,249992,0,124482,125003,0,124751,271065,0,0,249638,124604,248926,125579,0,374838,374288,0,0,0,104564,0,0,0,0,125024,0,0,0,249927,125039,249500,124573,124152,0,0,0,79572,373205,125102,0,0,0,125157,372796,249897,373647,249218,124852,0,0,0,172143,248742,124508,0,124243,248546,0,0,151102,124727,125571,124814,249975,0,249417,248749,249853,278375,374248,171845,125158,0,249843,124421,250107,250494,0,249194,498648,124621,124406,309287,0,249267,0,0,125265,124228,125052,125037,0,374984,124885,124773,124785,125136,124332,249045,124691,200663,124566,124461,124784,124430,0,749017,0,0,0,125292,124169,498153,167166,0,124955,0,63245,0,249631,124431,124594,123957,374911,249316,0,248876,0,125345,347242,124517,0,124466,249349,124537,124588,124371,125378,124567,373704,124973,125250,372605,0,124466,374124,125062,249262,0,124345,0,0,0,124604,124226,124640,0,124807,125034,124007,124437,124537,249038,430997,124914,249162,249625,0,124054,0,0,0,0,0,374032,249436,0,0,124722,248658,249422,124915,123684,0,124889,0,124266,0,124874,249655,124756,0,0,0,124910,36841,499038,373593,124270,0,0,272226,0,124991,249554,249173,125246,124749,124758,124325,0,124773,250392,124862,0,125165,0,124504,248890,124243,0,124539,0,0,0,0,124192,249304,454114,249380,125002,124823,194616,0,249620,0,0,0,125202,499252,250534,249178,0,249334,125055,125006,249019,124395,249304,498778,0,124958,124842,125138,124771,124537,124928,239079,0,65431,124576,248990,374073,0,373875,0,0,248936,0,124299,0,249774,125255,0,386618,0,134721,498209,125270,248276,0,249070,0,0,124652,499048,209911,250008,122859,249249,0,124475,250249,0,125492,0,125513,374932,124407,124670,125386,249950,125043,499044,249036,249524,248711,535719,249311,124289,124517,0,249102,0,249347,0,624058,124191,0,0,0,0,124582,124625,124487,0,373773,498246,0,0,374361,0,125375,124719,0,0,124942,249752,249437,0,373861,0,125362,0,373919,57346,124929,0,373618,124643,125352,125063,748612,0,125165,124712,125063,0,0,249774,124644,0,124856,0,125207,248817,124894,124287,124532,124371,124270,498992,125455,0,0,125285,124030,125543,124530,124340,249417,0,0,0,125383,373665,249145,124978,249262,125239,249333,0,497511,0,499520,0,124110,124672,124066,374450,0,124022,124912,250347,249545,0,124039,124804,124757,0,124489,124893,124518,0,317174,124659,374706,374302,0,0,124564,8140,0,125268,249329,250156,0,0,499066,124489,249092,124275,0,125122,249505,124991,124329,124619,250032,125163,124491,0,124166,0,374682,125176,124413,0,372523,120439,250533,0,0,125087,124743,124994,0,264981,124320,0,0,124707,249937,249233,124639,249843,249924,0,250380,124114,249079,0,125329,236927,0,498728,0,124931,249461,359883,0,124091,124682,322403,0,125011,124758,498758,248450,124815,124581,249485,124620,124453,124642,155008,249400,248617,0,125193,343166,0,248240,124550,148826,125046,374992,124146,0,124943,125113,0,0,124343,125864,0,249538,0,125007,0,374361,124477,124909,125039,249655,125143,0,249642,373883,498408,0,87573,249100,0,0,0,0,249292,249221,124626,124735,125150,125003,387186,0,125020,124381,125019,374228,249027,249051,124741,233050,373843,0,125082,124232,0,0,124908,249503,249470,0,249852,125141,124950,125516,0,0,124297,249086,124898,124234,124376,124631,124414,124956,249330,249869,0,125006,0,124644,124863,125034,0,248945,124554,375273,124251,373898,249156,124457,249456,0,249214,249588,0,0,124556,249567,0,249521,124764,0,124930,124766,125012,0,124708,0,498983,125113,249827,249107,249047,499174,124380,0,0,375025,288233,124830,124734,747832,248709,0,250262,0,124686,249280,0,374206,373659,373837,374435,250008,124262,124797,248586,124104,124743,124549,249391,248890,0,124859,0,124251,124919,124986,124513,0,124910,250159,373645,0,14448,125368,0,250596,125185,300872,0,124821,206276,248789,248155,124593,124591,124797,0,124814,249790,123738,249009,124537,249062,0,249279,190077,248753,0,124744,248737,249679,124728,249443,120987,0,248450,124942,125162,124751,0,124832,0,0,8113,249844,124587,0,249161,373615,0,123874,124165,0,373565,0,124274,250410,375688,249656,124583,124558,0,124735,0,125298,124515,124897,0,249348,373947,248776,248977,374950,0,124652,0,124719,0,498187,0,0,0,0,249495,249275,124565,124215,249300,499232,249577,125377,0,0,0,373420,249043,0,125076,124777,249246,250139,124873,0,248763,0,0,249757,124863,125292,124718,249903,0,0,124280,250070,0,248854,110251,445359,125010,500365,124904,0,124584,125387,124879,124852,249567,0,125005,124894,125084,124579,124831,249275,498704,124539,125464,499573,124958,0,124665,0,125011,249914,248631,125600,124362,0,249964,0,0,373762,125114,250163,123764,248813,0,124186,249716,373977,125083,249567,0,0,368414,0,248770,0,0,0,249372,123957,374171,248515,124643,0,0,249417,112619,0,373838,249486,0,249622,249811,373402,0,499679,124290,124754,0,0,125350,124859,125272,373266,0,0,0,0,124961,0,219925,178483,0,124936,125104,248273,248725,0,0,124579,0,124508,0,0,248333,249089,374679,124586,250191,151955,125140,248515,249263,372552,126226,124444,0,124236,0,123841,249648,0,124665,124717,124733,40849,0,173215,124995,0,125130,75511,124709,124150,0,124431,248614,124621,124243,124277,748541,373365,0,124361,0,0,374972,249392,124483,0,248403,173888,0,0,124616,0,0,249408,249525,124266,124914,124696,124280,0,124620,28707,373897,125129,124634,374098,373936,248988,249676,249450,0,0,98400,124578,249784,498288,374191,248497,374647,124785,0,248567,124593,125100,249859,249292,0,124636,374160,435306,124637,373786,0,249628,124527,0,124995,0,0,310625,124547,0,0,124938,250344,124893,0,249151,249648,124859,0,333037,373539,125003,250353,0,0,249264,373337,250065,0,0,0,624466,128123,124722,373413,0,374410,0,249203,0,124781,214468,125226,0,249810,124509,0,0,0,0,0,0,0,372825,0,249337,124751,123655,125221,249122,124726,124855,0,0,124809,249450,0,123896,249265,125188,500374,0,373823,248705,124664,124468,499578,0,125250,0,0,249638,124038,123995,248733,124478,0,0,124494,124751,123960,320061,124779,124487,124746,249971,0,0,124198,124208,0,249252,374434,124685,125487,0,249226,248978,623179,124891,0,248615,124011,248786,498635,250394,124917,0,124542,0,168377,0,124374,248965,498447,124484,124580,124730,249770,0,125425,373157,124150,0,249385,124696,499355,124692,622927,159043,124830,373689,0,124826,124260,249679,0,125333,248889,249336,249011,0,124873,124785,124737,0,124135,0,249941,124136,499444,249143,385802,500065,498073,249502,623854,124285,249013,124508,101706,125182,374836,124310,124214,124399,0,0,248989,250028,124574,249175,372769,373778,124074,374528,373928,124340,124330,249095,67542,0,0,499260,124913,0,281685,0,0,124590,124183,124704,220143,374305,0,125923,125096,124268,0,124880,124720,374189,124891,0,249173,0,249426,0,124202,249681,248665,124706,250177,124805,0,0,249190,0,250353,0,124995,0,0,124639,125122,0,124716,125183,0,0,249229,0,249322,249858,124923,0,204148,0,124940,248707,249817,124677,124080,0,124220,0,124441,123906,124328,498949,124347,124803,124672,249238,0,250135,124448,130583,373477,124531,0,374776,124566,0,124943,249294,124586,249051,124841,124706,124272,249289,249270,0,249826,0,124614,124339,124783,125006,373231,125006,249003,123959,124324,124550,124861,0,124542,0,124195,0,0,0,124614,249865,159683,0,0,0,124660,0,373645,124086,498801,0,0,125186,250006,124486,125052,0,124718,0,0,125507,0,0,374084,0,0,498231,124834,374677,248663,0,125247,249060,0,249516,373294,249861,0,0,0,0,250086,374828,249246,249540,0,0,498596,249246,374682,249571,0,125142,0,124623,0,249790,249304,124531,124319,125189,0,124317,249206,249417,0,124347,0,124195,0,374479,373735,124645,249518,373943,0,248904,0,0,124922,0,124312,371933,124632,124328,124357,0,124143,373810,188503,0,0,0,125038,249134,0,124330,0,125161,0,0,0,124282,374746,0,125674,249534,125126,250408,0,0,124618,125062,249060,124378,249274,0,0,124529,125184,0,0,0,0,124741,498507,124935,249422,0,124070,249278,249685,249264,157643,374308,125000,169660,124415,248965,518806,0,125320,374580,124354,497369,374611,0,0,0,250041,0,0,124522,124369,124540,249072,0,124624,248979,0,0,0,0,124607,249312,0,0,18520,374266,0,124492,0,0,0,0,0,0,0,124643,0,125130,124872,0,55094,124614,249887,124657,124852,248218,498750,0,125797,124403,249240,248950,0,250546,0,249559,124408,247890,0,104083,0,0,248719,125116,0,124486,249576,374242,125334,0,374005,124119,388158,249758,124283,124702,124747,124955,373776,373321,0,123946,124327,0,124630,125308,0,0,0,0,0,124698,0,124355,249118,0,124484,124658,124138,124821,250026,872674,218872,242237,124971,0,124215,124138,249850,248813,124223,124748,498102,249462,0,124001,124333,124523,0,249458,124574,0,356807,0,373441,124464,0,0,0,249830,124647,374399,149353,0,124285,0,498383,0,0,99905,249923,258785,0,0,0,373516,0,238515,0,250400,125042,124982,125471,124690,249525,0,0,124020,373583,249442,374368,0,0,248796,248943,0,125088,249163,0,124939,249778,124824,124649,124985,0,124888,125411,249222,124922,374388,124563,125268,248500,250219,124423,248752,249587,373508,124950,0,373940,123738,124696,0,249018,250420,124882]},{"counters":[124796,498937,249634,249820,249722,0,0,500083,0,373315,124992,125207,124549,125000,124625,6166,124678,0,0,124038,0,42802,249672,125095,125311,124484,0,124646,248298,125345,124273,248122,0,249369,125113,250306,499323,0,0,0,124444,0,0,372682,249105,0,499607,124786,123896,248930,0,248951,249757,0,124897,0,497457,248902,124855,124656,0,373103,238822,125113,0,249649,0,0,0,124537,249350,0,0,0,249854,374745,124307,0,124624,124607,249462,248580,373229,124356,0,0,124570,140985,249228,0,0,248856,248771,125025,223009,125130,194650,124462,124497,373384,124891,77712,249442,125250,0,0,0,228260,248958,373715,373466,0,248992,0,124555,124317,124461,124660,0,249680,124236,375077,374409,248904,0,249029,32639,290317,0,0,0,124830,124772,177988,122419,124877,250463,0,0,124593,124101,124364,125129,125049,623427,0,249827,0,124441,0,0,374988,125366,0,0,124439,0,124861,0,0,0,124710,0,124806,34928,375590,330102,124727,124523,0,125563,249747,248536,249810,373756,0,0,249507,249535,124845,0,250051,373158,0,0,125055,374590,124285,87334,214599,124448,0,124796,248709,248667,499712,248394,0,0,0,0,124639,124775,375472,124164,249387,124793,250004,249502,0,0,0,214864,125153,124801,125109,125057,373274,0,0,124277,0,124817,0,124786,124559,249898,0,124787,249086,249546,249149,0,124722,249492,499182,250453,0,0,248813,124730,0,124968,124898,0,248809,0,0,373883,373031,0,0,249255,0,48819,0,0,125087,235001,0,0,373750,125110,124341,250411,125062,0,249692,0,124895,124909,249447,124868,210442,0,0,250322,0,0,498865,0,124953,0,0,0,373358,0,249504,0,0,153276,0,249770,249646,124535,249743,303667,0,124262,249410,248916,0,374284,249801,0,0,249836,83876,0,124172,248578,0,0,0,124657,124517,125102,249741,124063,0,124950,20419,0,124350,0,0,466845,124357,0,124305,124007,373752,124175,249331,498931,0,0,124235,249674,414643,124457,124852,124361,124707,125279,124446,374746,125308,124884,248216,248991,0,249311,124556,0,124439,0,0,125386,124734,124542,249211,0,374369,373667,374003,124352,124831,0,249938,0,0,374201,248283,124536,0,124270,248971,0,250136,248952,374681,123727,0,249624,125436,0,372587,120439,124652,249020,124255,0,249470,124778,249756,125405,250078,499600,249793,499210,125571,0,124364,124919,124600,250157,124243,0,124668,124594,249447,124243,124554,374400,249271,124882,124743,0,124355,125190,0,249266,224223,124530,249364,249339,124450,123739,0,248898,373890,248957,125013,124325,124665,373897,249158,249252,374228,373835,124318,0,124356,457356,0,0,0,249987,124988,0,124288,249393,0,124494,124308,124522,0,124780,124696,124726,124270,352721,124457,0,124786,0,249216,124783,0,248806,0,0,125579,499147,0,248966,124932,0,248884,249361,124784,123901,124433,124405,0,0,249329,0,248786,499398,0,373944,248872,124632,0,499721,125136,249475,169496,0,0,249596,124721,498802,0,248914,373734,0,372690,124116,124712,0,215023,0,375467,139314,248561,125197,124803,124436,0,0,499460,0,374601,0,249451,125154,0,124994,124905,498854,0,249660,124735,248961,248959,124392,124552,0,125375,250361,249858,0,0,0,249892,125006,124548,249621,248606,0,0,124814,125363,249772,249788,0,0,124935,0,124812,0,248627,20606,0,75890,249433,249209,373145,623357,248863,248847,124107,124735,249211,374233,36750,249208,373914,249039,249521,0,0,372620,0,124953,249429,295159,0,0,249995,0,124457,249732,0,249492,498857,0,291700,373622,125490,180505,373586,124855,124749,249740,249123,375319,249111,124280,124136,0,249435,248608,0,248728,123816,126606,250350,250078,0,0,373365,124896,252561,374781,249513,124574,0,498139,373965,249889,374202,124380,0,0,124383,124620,249911,0,0,125239,0,124736,0,248896,0,0,249843,125297,250322,0,124183,124862,249060,250044,373396,249547,124410,373555,373311,125176,498262,155351,124488,0,0,249667,125454,250096,125195,249196,0,249109,124864,0,0,250000,0,0,0,0,124797,498698,0,249593,0,124398,124849,124964,249714,0,373312,0,0,0,0,124690,0,124477,124484,124153,374644,0,124980,125188,124431,99905,104564,248991,248985,186520,0,0,125137,124681,0,719072,500116,0,373892,0,0,124604,248839,373932,248943,124483,372891,124785,124036,56881,0,249505,125044,499907,0,498992,124860,249529,0,374827,249227,0,0,390642,249087,124020,0,0,0,55094,0,0,125161,373919,248934,125094,124539,249277,249155,124483,248647,124177,249573,124550,250273,248914,249371,124580,124425,125088,94004,0,248810,0,375062,125130,0,125323,0,0,124280,0,125111,0,124529,124766,125057,747922,374134,125157,124826,0,125253,374424,0,124622,0,0,124804,0,125239,0,0,249532,249795,124744,249370,248913,0,0,124088,124708,124577,249727,249659,249029,124680,0,248607,125119,248710,0,366110,249590,125021,499153,0,248564,249253,0,275291,124127,124318,254776,249559,248397,373294,0,249440,124645,0,124614,0,498617,0,0,59576,0,249586,249087,124274,249578,249189,499646,0,375040,124960,192419,124878,0,249796,253982,249154,124362,316840,499898,124779,0,124195,0,0,124517,124642,125059,373680,373281,124272,0,125764,248620,124976,124854,0,374158,249856,249339,124950,0,0,0,124603,124518,124002,374606,373333,249512,249443,249497,498897,624766,249696,0,124918,248854,125142,125136,0,124203,124030,249086,0,373759,125073,0,0,249538,0,124011,0,124323,249594,124865,0,374607,0,124954,124483,124446,0,124878,124309,0,124702,125159,248955,248531,248825,124529,0,249799,124821,249590,125050,248790,249605,249038,373844,0,0,124893,249345,0,125030,0,249920,124719,124555,124656,124706,249516,124686,0,125214,0,0,0,248573,0,373164,0,0,249745,0,249771,124783,0,73960,0,124967,124252,0,124260,0,0,125107,124907,250305,249400,374685,0,0,0,124751,249428,125358,124655,125156,241591,2026,248342,0,250023,124785,0,0,0,125319,249663,250265,124634,373586,248583,0,124604,311824,0,125007,0,0,248747,0,0,0,0,498203,0,123914,376099,124561,249240,249600,124836,125378,124786,374557,125015,373517,0,124446,149623,374544,424633,0,124872,0,0,124518,0,0,0,124558,124339,0,0,124442,107955,0,374144,124805,249767,374235,0,0,0,0,375400,124650,498355,373596,0,0,124689,124814,185877,249068,405144,124319,0,374322,328726,0,0,124367,0,0,0,231350,124652,249005,373757,249402,373887,0,373322,0,0,0,0,373676,0,248583,0,373285,0,124639,445972,249295,250427,250142,248713,0,125036,124399,249621,124696,0,124562,124182,249144,249506,125309,249499,123752,124596,249313,124747,124200,249404,0,124328,124621,124468,0,124862,124674,0,124110,0,125257,250028,250776,0,375441,125162,0,249275,249601,0,250196,248485,374802,746769,125618,375457,249435,0,248736,249944,125394,0,0,0,249522,125107,499118,249130,124995,0,374189,499814,124355,248699,374289,0,271032,123981,249058,249141,124982,125192,0,124777,0,250550,125154,0,124832,125285,0,124250,125188,124280,124801,0,0,125072,124818,124764,249367,124667,124230,249830,0,0,124636,384226,124852,125062,124466,0,0,0,124908,124625,249136,0,124327,0,124741,749297,124381,0,0,0,0,124340,248715,0,249773,249541,124935,480352,374686,0,259891,0,373319,382241,153390,0,499248,248897,0,124312,250492,124623,498908,125163,249489,0,149240,124991,124104,124569,97672,373976,125098,248636,374094,124488,249452,124464,0,124565,124330,0,125174,249963,0,124662,124756,125417,499399,124508,249091,124910,0,0,0,0,373805,0,573191,0,0,125061,0,57346,374724,249414,124813,0,0,0,249399,250125,124681,125246,0,0,125140,124602,123919,248869,124743,0,500041,0,124490,0,124080,243844,124499,374824,249191,232338,248943,125161,0,243460,124638,124918,125273,374195,249819,124965,124550,0,375531,0,124642,249173,124464,249452,374069,125364,249061,0,36841,498743,124472,124458,250438,0,125152,124834,206726,249305,124991,0,0,125030,249039,0,177585,0,124872,0,124164,124743,249195,0,125158,124480,124292,0,373129,248851,249583,0,124768,8140,125556,249232,0,124735,373861,124242,0,248969,0,0,249448,0,124465,250266,0,124534,0,0,0,249507,125333,0,0,124726,125202,0,499219,0,0,124146,0,747670,124576,124080,0,0,0,124749,124441,124484,124421,0,249370,0,249816,125005,0,249082,124933,249435,0,248762,0,249745,124851,125481,0,250035,249211,124223,0,374173,0,125030,249752,124590,249251,373959,248901,0,124579,124324,124875,124637,125326,125314,622200,124517,0,0,0,248167,0,249047,124600,124550,248564,249526,59142,413716,0,39226,498093,249106,249013,249511,248779,374265,0,124498,124728,374709,0,249390,249583,0,124711,124995,0,0,124818,0,374151,0,0,0,623722,248768,124818,0,87573,125074,125036,124380,124737,0,124234,125125,201181,0,0,124943,0,0,124527,0,14439,0,248392,124200,248946,124991,124767,249605,497302,124664,81887,373345,0,0,249468,249183,0,124168,124703,124724,124558,249542,0,0,0,124681,249062,0,0,124400,249250,374637,249878,125058,0,125864,0,249634,0,125122,249573,124468,0,123960,0,124492,125104,249503,373943,373440,374190,124274,0,124814,249606,0,124298,0,124838,0,248766,373989,0,249834,0,65431,267728,249180,0,124684,248272,0,124137,0,125330,0,125425,250189,372856,0,0,0,373002,125003,374150,0,124851,124408,249553,0,249085,248425,0,124695,0,0,124593,248641,0,0,340853,373501,124785,124954,124408,0,124088,124135,249676,248377,0,124975,124416,0,249250,0,123508,0,249730,124581,125131,0,125082,0,0,249330,359526,0,0,0,249473,0,124992,26859,245763,124617,249134,124279,250017,124054,124370,123874,124341,0,249540,248545,124674,249640,0,124268,124480,124404,249881,0,0,0,249344,248923,0,0,124236,124917,0,124107,0,124587,124318,124085,374887,124290,0,0,0,0,498400,0,0,124759,124854,124496,124039,124555,124893,0,0,374672,124074,249289,124504,0,498881,10293,124404,497981,0,124393,249264,124855,124421,0,0,0,248926,124166,0,250096,124619,125193,0,124722,0,95855,124210,0,0,124713,250447,125285,0,249040,249209,600094,124660,250071,125113,0,0,375003,0,0,124674,125052,124236,249286,124850,124549,249182,0,125202,0,0,0,249063,0,249583,124604,249476,373111,249539,0,248818,125177,0,125140,250361,499358,124631,0,249024,124685,124652,0,499115,250493,0,374426,124644,374349,249446,0,0,124371,125403,124975,124757,124961,498707,124890,124950,124312,124266,0,124647,249449,124198,0,124338,0,0,0,373544,124051,498409,375353,18520,125028,249494,0,124554,112174,0,0,124417,124400,0,248511,124643,249498,0,749035,197625,0,124489,0,0,374506,124966,0,0,0,0,125229,124339,70191,124563,0,249102,249143,249690,249129,124815,374975,374062,0,124666,0,249836,0,499764,249606,124597,125108,124719,124362,124942,0,0,0,125169,0,124419,0,125054,124951,249073,125276,250202,123762,0,0,123974,124332,125155,373493,124752,250102,124743,124732,32781,374690,499588,0,374214,0,0,250254,124648,124624,374585,372906,748277,124302,125154,373775,249723,0,124167,124437,125061,124897,249254,124863,0,248280,124417,124933,373146,0,124512,124932,0,249465,125000,124357,374060,373743,374033,124330,0,0,0,0,124532,0,123829,0,249365,124547,300153,0,124955,249527,248350,124956,0,125247,374198,124234,249225,0,124642,124603,187395,249462,124412,249276,0,124723,249707,124523,118748,159326,124918,374463,249440,0,124325,0,124437,249307,0,0,250071,124479,0,124814,0,237392,0,124888,0,124455,124920,0,0,124702,125141,250085,374260,124709,125096,0,261593,124906,0,249112,125143,124973,0,136953,124388,124612,248713,374163,146928,47283,249115,374162,0,0,0,249151,249570,249654,0,125047,125226,0,0,249391,250275,125223,0,250304,124359,0,0,124937,0,0,248645,0,373383,124869,374599,0,124737,0,249966,249444,0,0,374319,124304,124284,124178,124561,0,249112,248747,372929,124950,0,0,0,250269]},{"counters":[0,124927,161107,124596,255199,249092,0,0,124525,0,250259,374572,124328,124873,373961,124861,186034,359463,0,0,0,249313,0,125154,124497,0,0,0,125191,374093,0,249265,124254,125128,124178,0,250027,124480,249425,375423,125350,124774,249134,124198,248892,0,0,124286,373672,249860,124543,124963,124562,249240,498792,0,249671,404481,125048,125513,124692,498212,374055,374390,249901,249808,0,249536,124181,249238,0,0,0,296265,124309,249316,0,249302,124579,249324,124795,125454,248635,125108,124315,249352,249508,0,124931,0,373670,374869,0,250798,124888,374491,123598,0,0,373486,0,345612,374342,398591,249448,124808,124175,0,124363,125154,0,0,124991,124270,123874,0,373258,245796,124573,0,124483,124894,124614,249941,0,124910,498527,0,194395,192478,124994,498291,124423,249999,124531,124715,0,0,373442,249267,249545,0,125052,124325,124656,499617,0,124595,374890,0,0,249697,124599,249200,249145,124411,0,124576,125059,374861,124670,0,249441,124430,123914,249655,87334,0,124192,125135,0,0,124837,374987,125158,0,0,0,0,124458,124816,0,0,0,124704,0,0,124472,124622,125155,124920,0,124781,374057,498150,124379,373742,249499,0,124330,0,124894,0,124919,373596,249672,124656,355599,125193,0,124167,249841,124358,0,124380,0,250508,124942,0,250058,124981,0,124452,124801,0,0,373364,0,123960,124487,125087,124961,124290,499902,124786,250010,125011,0,0,438053,249636,249311,374235,0,124391,124779,249472,249913,124242,124491,124343,124371,250477,0,0,0,0,124717,0,249331,124594,124802,0,123948,123738,124783,498141,0,0,249639,233039,124304,373799,124318,124164,498083,0,0,0,124664,0,124203,123995,124688,0,125383,249225,0,0,124581,0,208688,374083,0,0,125419,0,124720,249178,125046,124114,249005,498831,124368,0,498086,249208,0,125005,0,124672,249448,124908,0,124478,355823,533880,124518,0,0,465162,124667,0,0,249537,124081,124997,248499,249189,0,249168,249645,0,0,124568,0,0,373975,249040,249273,124170,124953,368631,0,374302,0,124414,248903,125323,249168,0,250067,104083,498986,249268,374968,124918,0,248998,308222,374335,124152,0,124882,249670,249721,249494,0,0,261014,249659,249248,124210,249394,0,124319,248370,0,0,124478,0,0,124714,0,0,374663,0,0,124620,0,0,124894,374203,249848,249065,0,30700,0,249342,248924,125028,249374,124821,248609,498387,125454,249661,125272,190004,249795,160980,0,374362,124922,0,249078,248444,249064,124456,124541,124339,0,125122,373271,249859,124912,248659,124885,125081,124214,0,249130,124552,124862,0,0,124726,248644,0,248769,0,124473,499366,124489,125152,0,249226,125131,0,0,0,124737,0,247928,0,248698,124755,0,0,125362,0,125094,0,0,125237,249604,0,124831,249521,124492,124353,249489,248397,125240,0,0,249810,249470,124924,124363,124935,124935,0,0,124978,124527,125083,124631,124424,249258,249786,0,0,373690,125143,250381,0,0,0,124498,500116,249474,250090,0,0,0,124773,124998,0,374793,102516,0,124619,250517,124650,124446,250346,0,0,124329,249603,124515,125319,249391,249268,124852,122419,124324,374682,124878,375097,124709,0,0,124942,124946,125138,124249,0,125159,124576,250004,124536,0,249487,0,0,124539,124291,0,375077,125221,124228,373738,124464,125338,125030,124131,498845,124546,249535,100180,123951,374738,249562,123835,125062,374972,249739,0,124548,0,0,124555,125107,249823,0,0,248710,499836,0,372999,249597,0,124759,124743,124939,0,124503,0,124623,0,0,0,249620,200820,0,242886,390320,124882,125096,621783,125155,0,0,0,249018,248941,250126,290069,124061,248721,124741,124534,0,124213,0,112619,249297,373131,124604,0,124968,0,123906,248479,249930,0,373838,123752,124800,124692,124493,124079,498625,124164,124146,125169,214289,124868,0,0,239339,124431,0,248826,0,248406,248292,124950,249067,125010,0,249257,0,374949,124919,0,124862,124192,373923,0,236673,124671,124562,125764,0,158992,0,248148,0,0,373991,0,695722,0,248799,374130,249704,125161,0,124997,0,2026,124226,269489,124699,125084,124762,0,124894,125455,0,125195,249282,248830,248728,249687,124930,0,0,157308,124855,124610,0,248659,0,0,124456,499142,250004,124659,0,374507,249773,498607,0,124242,124805,0,124817,124702,0,248826,0,0,124274,0,0,0,0,204027,248286,249842,249546,249464,499737,374806,0,250103,0,249786,0,0,247873,248460,124918,249331,249696,374644,0,374129,249146,0,310538,124341,249828,124977,373662,124448,0,0,124581,0,0,248430,125153,0,0,125214,250284,0,249148,125250,249758,375306,124577,374522,0,0,250094,249504,374944,124814,124437,124621,124133,249400,0,248737,0,0,249018,124833,124431,0,0,249202,124860,0,498596,216549,374958,123762,124191,124136,0,249711,0,248535,125143,250028,0,498907,124639,0,125182,0,124951,873942,124366,124234,249611,124220,249383,0,124364,373123,0,249980,249336,124888,267467,123739,0,125094,124805,0,0,248708,124020,0,0,269900,0,125042,249914,124439,0,249468,249797,250578,250610,98400,374342,0,124393,124431,124965,248650,125030,249114,249179,124210,431015,0,248876,374988,374000,125192,0,374331,124548,0,0,825555,124197,125165,44781,0,0,288666,248946,565962,124451,124562,0,374194,124523,124049,0,124337,0,0,0,0,124292,0,374207,250343,373871,250044,0,374743,0,125141,0,0,0,499250,250020,0,249056,0,374453,0,0,249523,123957,124702,124526,250144,0,125234,125185,0,124327,248214,373090,0,0,249997,0,498377,374729,124743,249599,0,248846,498450,0,374448,498476,124279,249912,0,124074,248996,0,124862,124597,124375,373894,249964,248464,124561,0,0,249133,0,0,0,104564,249423,125104,0,125025,498510,0,124769,165869,0,124530,373498,124570,0,0,0,124686,0,0,124530,214702,125642,124988,0,248877,124614,124897,175990,124845,249327,0,248971,124728,249667,373665,621160,125060,0,125226,249242,124746,0,0,124283,374705,124882,0,373677,373022,0,0,0,124564,0,177995,249677,125228,0,125062,124474,0,0,249234,124642,124362,0,0,124660,124888,0,249177,124659,124299,0,124839,249822,0,249678,0,248653,373940,124735,2065,0,0,249177,124785,498626,124302,124867,0,373455,124277,0,374830,374029,249018,374199,125111,123875,0,249390,0,124987,124772,124660,0,124449,248791,498373,0,249613,0,0,124943,0,0,0,124792,124029,0,0,0,125226,249062,0,124591,0,0,373811,124554,0,373651,0,124615,373809,124298,249824,373971,263745,0,249907,124826,125157,0,249884,124414,0,0,250070,249752,124973,124215,0,0,248796,49134,0,0,0,124176,125113,249841,124907,0,107955,0,124602,623485,374195,249584,124580,0,124940,125190,0,0,124912,124567,124266,248891,124967,0,0,0,0,249966,0,124964,125229,249116,0,124713,499349,124682,125095,249073,0,500083,125177,249423,248810,250568,0,0,375651,124317,124365,151112,0,124852,251379,124863,124913,124403,0,623457,0,124855,0,248665,124280,0,125944,249772,0,125618,0,124091,248904,125159,125110,248580,0,0,249416,373592,125084,0,374148,0,0,373035,249042,124633,136928,0,124612,124294,249008,249533,124686,124270,249259,124645,497686,0,124223,124325,498830,796960,0,250339,0,124080,373575,249179,250065,0,250414,0,124611,199556,124520,249151,0,124323,123919,124445,248420,249414,373799,125150,248635,249192,249318,249071,124690,0,499261,0,0,0,374344,403440,0,0,372469,124741,248568,0,374374,0,124453,0,250901,124531,124519,124039,59576,0,0,0,0,249448,124649,249062,124709,248571,0,124287,249545,63245,124517,249415,0,249080,0,124523,124728,125003,374696,125012,249398,0,621936,249383,124808,0,248827,0,124987,125369,249631,0,0,0,0,125403,124991,248628,0,373925,125698,0,0,249531,249879,0,124419,0,249332,124318,0,0,249762,250259,249759,0,249963,0,125102,249125,248588,0,248322,0,124784,249737,249927,124068,124369,124690,132597,124378,125358,0,124975,0,249593,249618,0,124277,124756,124567,125105,249506,125150,124764,0,124712,179799,248840,0,0,249123,248472,0,0,124878,249605,0,124513,124120,372867,0,0,124329,0,374154,45493,0,0,124909,250093,0,248977,0,0,124370,374315,0,0,374171,124876,0,0,124958,124773,0,0,0,124235,0,250239,249496,124560,249612,0,248804,249558,249113,259366,0,125049,374635,320597,124888,249421,250251,372805,124565,55094,125699,125314,374634,249041,0,124417,0,124704,248239,124908,0,499633,248383,249805,0,124226,0,248918,124887,124596,124110,0,124661,124602,124652,0,124975,0,124280,0,124780,171812,0,124932,124168,0,0,249443,249862,124453,249616,249447,0,0,124411,249659,125148,124869,0,124617,373766,463224,125043,0,124558,124442,0,374628,124631,0,0,124982,374630,124986,0,124855,124801,249960,374046,86005,249197,124711,374414,124228,124299,124657,124116,0,0,250359,124726,124656,0,124352,249667,374741,124295,0,124863,83408,375222,124874,124393,125003,0,125083,189562,124221,124918,129063,124537,0,249073,124642,124689,0,124707,0,0,0,0,623065,124224,416241,249858,125169,0,124380,124743,124554,124881,249374,124456,124400,0,248870,375021,0,124593,373785,249555,249678,124835,124280,249741,124786,249372,0,124617,374559,149223,248747,374514,124262,194914,124766,0,0,0,0,124074,124359,125088,0,0,0,124580,374501,249654,248828,124341,0,0,124824,124665,124950,0,0,0,124823,249134,125030,248812,248789,249273,0,124736,124809,499864,374039,499652,0,124412,124996,0,124622,124327,0,125153,124457,0,0,123960,0,249424,198626,249865,124883,0,125163,0,125006,124833,374594,0,0,124995,124310,124173,124944,124655,124433,249775,124849,0,375193,374136,124486,344524,124323,249168,234232,0,124556,0,249684,124718,249221,125076,0,0,124706,124696,249966,374661,124887,125022,0,0,125020,0,0,373413,124120,125050,374237,373668,374576,124270,373531,0,124622,0,124191,249269,0,124824,124489,0,249207,249634,0,124960,248869,124972,250209,328841,124549,0,0,249485,124980,0,0,0,0,0,124366,384011,374125,124583,125278,249069,0,249236,249082,249080,124789,124494,0,374855,397535,249330,124550,124959,0,125036,124562,124574,248816,43104,124390,0,124826,0,124821,0,0,249484,177548,250220,125087,18520,125378,124461,374073,0,124943,0,0,122859,241089,424717,124687,249659,124892,125025,0,248855,374263,0,124284,124176,124785,124110,124307,93529,0,249793,0,0,249135,0,374477,124437,0,123684,374685,0,367255,249756,124957,0,249137,0,249413,124364,124554,124552,0,373703,124015,125298,124851,0,124753,124914,248774,249589,0,249658,0,124559,57346,125016,124136,0,124591,250128,249408,124563,624507,0,124527,373095,249879,249879,0,0,249308,249593,327384,124796,124722,249147,0,0,124758,124424,249306,0,124436,124897,124859,0,0,0,249053,124946,124733,124574,124668,0,249160,498246,124745,249745,124886,0,249476,124573,0,124252,373647,0,124816,124912,0,249698,0,321424,124347,125007,125095,125334,125628,124667,248528,124810,0,3902,249100,125214,0,85586,0,124925,249505,124835,39226,124439,249501,0,124297,125394,124985,220216,0,124727,124929,0,0,249708,124477,249350,382546,374586,0,225956,124382,0,396219,374171,124308,249632,0,0,248775,124996,248681,0,0,0,124623,0,124093,0,374348,499608,124059,124355,0,124747,0,32781,124605,0,249890,250005,248957,248308,130866,0,249699,0,0,0,124368,125378,124293,498067,245394,374252,124659,498308,206427,124898,498452,622886,124743,124868,248949,0,97672,249268,0,124808,248796,124029,124814,124482,0,375072,125507,124905,0,124088,124878,124354,124976,125063,0,249551,0,124937,248751,0,124482,249430,276078,124542,498775,153596,249266,372753,249983,124868,0,0,263406,250062,374763,0,124621,124922,125188,249137,124136,125062,250079,124646,373762,125095,0,0,0,0,374815,140507,125140,374598,0,247890,248987,124744,124254,249774,249238,124793,124379,125329,249503,0,0,374782,124082,124566,87573,0,124692,249753,0,248707,124748,248751,249352,248821,123959,580998,374479,249357,248862,0,124017,124503,124643,124604,0,125052,0,0,372647,0]},{"counters":[247974,0,748230,248751,623551,351378,249325,499040,498700,249763,499315,125147,374765,124748,373669,0,124390,0,0,125184,124812,0,0,0,373242,499381,250243,499024,124155,124166,124815,124568,0,372676,250254,0,0,0,249328,0,124965,124855,0,125162,0,0,249313,304305,248599,0,249247,124852,125330,373434,249591,249079,0,124215,497839,124808,0,249821,177563,0,373455,0,374069,0,124779,124530,0,0,249467,0,0,304905,374164,250020,0,373697,124860,124289,0,249516,124745,0,390959,249288,373921,125288,0,0,0,0,248981,0,375447,0,124851,0,125309,0,123722,124488,0,0,124436,125185,124903,248904,124594,0,0,0,0,0,124499,125081,124473,248930,124965,374141,124537,124550,124852,0,0,76193,0,0,124650,0,372551,0,374478,254373,124733,0,124580,124773,249688,124953,48819,124270,461754,124275,249050,124539,248192,134841,248775,0,124888,124935,0,0,0,249880,250185,249704,125025,125471,124687,249504,124981,124712,124615,124918,124588,249855,124552,124729,124743,124299,28707,125239,0,0,0,124634,124858,500265,373422,373383,374135,125232,248996,0,124081,249550,0,124107,0,374108,248773,99905,248717,248923,0,374045,249648,0,249518,249947,250173,0,22705,248499,249298,0,0,0,198125,0,249218,0,0,124912,0,373824,0,125176,125490,499121,124835,125074,374210,124651,125341,0,249395,0,373968,163469,125226,124814,0,125162,249526,0,0,124374,285617,125178,124475,125107,202090,374533,0,124745,124349,329040,374735,248755,374200,401464,373352,181522,0,125007,124525,124614,125207,373915,248597,623669,373674,124445,0,0,248903,374858,125007,125062,124854,83876,0,249407,0,248677,0,0,124821,125191,248712,0,0,248761,249181,124197,374953,249405,124493,0,124569,249681,0,39033,250170,0,124636,372900,373909,0,124688,124353,0,249225,0,124751,206353,0,124758,0,250049,621238,248807,0,0,373743,0,124671,124785,125046,0,0,249817,0,124550,0,0,0,0,125088,372759,124172,0,124318,248815,124912,249689,124422,0,124580,623934,124345,0,124001,125073,374399,248979,499695,0,0,125419,124766,249614,133535,249812,0,124845,125108,0,249505,251633,249425,124709,124406,0,0,0,0,124417,0,250128,124718,124961,249066,0,124127,0,0,0,374611,125214,124491,124481,0,0,0,0,249577,374345,0,125012,125022,249479,125492,0,248520,124660,124821,124686,249285,249053,0,248409,124659,124307,373528,124960,0,124590,0,0,0,124407,125022,0,249126,249728,0,125556,248634,124292,0,248809,124361,341421,0,12325,61297,250082,0,0,249574,249620,0,0,124896,0,124255,373221,0,358712,249618,248680,0,125764,265683,124049,622351,0,123946,0,0,0,0,250096,124783,124681,124652,124389,125184,94004,499015,124678,125255,124810,195420,125272,249110,0,0,0,125207,0,0,0,0,0,0,124325,125237,250104,124700,0,0,0,0,0,0,373913,249930,0,124258,124607,124744,124704,241852,87573,124290,374729,373950,249261,124739,123893,0,0,124813,124444,0,0,124517,0,124625,0,250311,125011,374284,0,124593,124183,249860,0,124814,249151,220185,124719,373853,249271,249315,124672,0,249545,0,332074,124719,250548,0,124599,125080,0,0,0,0,124711,248616,624190,0,123948,873292,125155,196090,0,248673,0,124328,102516,249873,0,0,499543,0,0,250474,375086,249839,0,124913,0,125363,0,0,374410,124800,0,375052,373002,123799,124726,0,374561,0,0,249199,0,249739,0,374113,222390,249279,0,374949,497292,0,124228,228792,249299,124988,124624,123906,0,250125,0,125308,124505,250031,124647,0,125309,249876,249642,249419,124931,124551,0,249296,366916,0,374670,249418,0,324393,187175,124192,250892,124565,498559,124766,124815,0,373988,124747,0,124621,245297,249806,249383,0,250170,249354,124919,0,249451,249753,125128,249378,249278,0,249789,249629,124882,0,0,373618,249148,0,124872,0,373929,124862,0,498646,28551,250297,0,249522,81672,124149,0,0,0,124722,0,249821,124875,248690,373509,125065,125039,124589,124934,124930,0,124784,0,374809,0,0,14439,0,0,124315,124890,373442,374629,125030,314700,100180,125156,0,124349,0,372788,124868,248832,249809,124567,124503,659771,374885,0,124973,498885,0,248777,124652,249092,0,374625,0,124639,124961,124991,124969,124656,34667,0,374592,125102,124925,248538,125143,0,0,0,0,124605,125150,124841,249656,0,124574,373631,250307,0,124647,124429,249221,0,124773,373311,0,124664,498426,250133,124898,498983,0,374027,249443,249749,214203,0,250010,0,124996,248868,124574,124200,124882,124771,249425,124706,0,125202,0,0,0,0,0,249708,124690,249764,124251,124291,124672,0,0,124262,124135,0,0,124955,12182,0,0,0,249816,124773,124880,292009,249744,248792,270936,124446,249081,0,0,124320,0,0,124634,124403,0,124869,499003,0,0,0,0,124457,248729,0,124617,124562,125116,124537,0,374066,248992,124567,0,249356,0,500242,249675,250297,499547,0,124062,238573,373348,0,248851,124554,0,622421,249323,250444,124614,0,0,374658,125331,124652,0,124452,124341,125076,248996,124989,124977,124444,124805,125082,249412,124728,249175,0,0,123508,124347,0,248939,0,0,124762,212084,375554,0,0,0,124620,124182,124224,124689,248881,0,249928,0,124537,124939,250262,124670,374653,0,316335,124250,124523,124733,125698,249502,373637,0,250188,124954,124503,0,249065,0,249111,249516,0,296431,0,373351,247350,124715,124838,124987,374163,124611,124935,125136,0,0,248763,125140,0,0,124652,300342,0,125285,0,125142,0,249250,0,124128,124391,249974,0,124138,250522,0,124586,249881,0,0,123975,0,249600,249424,0,124275,0,124830,124623,124861,124133,125020,374925,0,249603,0,124809,124814,0,0,0,124223,0,0,125051,124594,249510,249916,124821,249042,124898,249198,0,0,234890,0,114285,0,0,0,0,124616,69754,277010,249645,124430,49134,124863,124958,250317,124661,124566,250162,249716,498770,42802,249741,0,0,249740,249458,0,0,124667,249031,249174,124460,250101,0,0,124133,124893,124808,124918,249671,0,0,374804,125158,248197,249826,250563,249014,125087,248763,497601,0,124288,250870,249406,249187,0,124668,124912,124136,0,498975,0,0,0,124557,0,250001,0,128822,0,0,0,124088,124594,124648,124020,0,125083,249453,125171,124439,125318,124992,0,125048,0,124859,249877,249491,124375,124472,123764,124512,0,124878,155771,124369,124664,125226,124632,374772,124986,0,124160,0,124643,124757,248819,0,124086,499104,249288,249899,0,0,373615,0,0,248653,0,124000,248651,0,248753,124195,374096,248526,124899,125298,124975,0,374409,250029,0,124518,124488,123960,134884,249472,124808,125171,124614,124370,0,124535,124784,0,0,249454,249056,124080,0,249830,124684,248779,249153,0,0,0,0,342148,124977,124883,0,0,374370,0,249168,0,0,124831,124849,0,124407,248926,124847,0,249544,248786,0,124247,124368,533315,374109,248636,125368,0,124474,372810,249417,125362,249823,124774,249707,75511,124038,249210,0,249303,124735,0,0,249572,125297,0,124596,124622,356588,0,124889,124631,0,374689,0,124186,0,124940,124565,498088,124665,124466,249241,124519,24905,249481,373853,104564,374592,373530,0,249584,255936,125618,124861,124441,124130,249520,125188,0,249566,124926,248432,122859,124681,0,0,124883,373710,124579,373494,123739,124379,249220,0,249144,0,0,249322,249595,0,249274,373804,373085,0,125142,249769,0,374437,249662,169728,249228,124793,249725,249148,124979,124783,124414,249717,125096,0,124084,232968,124699,124457,124440,124707,0,250301,32639,248948,124298,125285,0,0,249207,124586,0,0,124193,190154,124807,0,368236,499521,0,374108,249465,0,79688,124948,0,0,248183,0,184128,124489,0,497617,249401,0,249248,0,249864,0,0,112619,374179,125941,249535,124737,249521,125153,124654,249793,372737,124359,748313,0,0,124393,248556,498119,124152,374177,125137,124869,374512,124897,124737,124688,250279,375075,0,0,250159,124686,0,0,372644,0,124988,0,0,0,0,124872,497959,124742,124663,124508,124483,124722,0,374465,249304,249179,125020,145204,497094,185999,124404,124908,0,249719,356464,124213,0,500358,373347,124061,0,125122,0,123981,123841,124959,125615,124371,125205,249563,0,249288,125129,124153,124928,0,498780,124741,124777,0,249050,248755,0,249004,0,125314,14448,124786,0,124573,123835,367271,250132,249090,0,0,124015,124483,0,585416,0,0,0,0,0,248102,374023,0,124558,249298,248650,249563,0,125247,124456,124499,249423,124986,245195,374985,0,249991,0,0,249725,231583,0,316315,498602,374295,248962,8113,0,249192,374365,0,0,0,0,0,124721,124633,0,249796,125169,248748,249115,374517,248566,0,373886,126851,373392,124022,498324,125101,498186,0,124284,0,374081,124617,0,124468,0,326015,249632,373444,125270,374624,0,249722,0,249510,249592,0,0,250358,249286,0,124634,0,249946,0,124412,249782,124668,0,151480,375188,437141,125516,374129,249305,124548,124734,0,0,124752,0,249214,249455,124530,196643,248987,125074,0,374564,372911,124759,124716,0,125104,124720,124818,249280,125523,124200,249593,250043,124749,498881,0,0,124866,0,249354,374174,0,124630,0,125146,0,249175,124897,0,124943,249587,124515,0,249339,248393,0,236524,124210,124560,50796,0,248541,124695,124762,0,124518,248683,374230,0,73532,124584,125105,0,498700,249155,0,124747,124778,249283,0,248984,124796,497844,125152,0,0,249461,0,248766,0,124954,124844,373873,124456,0,250075,250011,249631,0,0,0,124592,373427,125195,248888,249023,0,98400,124665,124288,0,373750,0,0,0,125642,124662,0,0,0,374426,125061,125944,0,125056,0,249564,124826,0,124036,124280,0,249857,249589,248595,0,249611,124333,248199,249788,0,374278,0,374245,124487,0,374571,374256,249462,0,250441,0,0,249323,249262,0,497830,124785,0,249022,0,0,125162,391611,125363,248882,124839,0,249817,249339,124707,0,0,0,372995,249332,0,248910,0,0,0,124956,124699,499549,249702,124166,621569,184490,125254,125094,124735,124783,0,125425,124203,124692,125543,248944,124066,0,125674,0,125130,0,124842,498471,125136,249751,0,249656,124616,0,124000,0,0,374077,124045,124749,499145,498614,0,124489,498527,124682,124546,374298,124876,125055,0,124690,0,124609,250133,249455,249296,374016,0,249579,0,124522,249338,248975,248610,0,0,210115,124618,124904,125030,249460,0,250700,0,0,248958,124081,373303,124580,0,124743,0,124660,373888,249380,125513,250072,0,0,124439,375264,214326,373424,124862,124994,249190,124517,124011,249077,124504,124958,123762,249043,0,0,130739,0,125226,0,125131,0,248801,22324,250073,125520,124304,0,498157,125098,0,249416,0,0,0,124456,249928,124621,124564,248848,165119,124642,249597,124539,249148,0,499380,0,0,124273,373558,0,249122,0,125417,0,124135,124643,124806,0,249354,124812,124718,249007,0,250492,124520,125600,124380,373045,0,249752,250479,125219,0,125202,125047,0,250308,249381,249096,249449,124517,0,0,124745,0,0,124480,249788,0,0,0,124097,124308,125034,0,249361,16347,124822,124523,250035,248979,24507,0,0,373841,622955,374010,249257,0,248650,125057,0,0,498989,499106,0,497858,0,124788,0,0,124640,124641,0,53551,124325,374730,0,372766,249795,124666,249350,249983,248759,248962,124775,124975,124752,0,124698,248792,124744,124177,249895,374461,248635,0,124418,249602,124176,0,124396,0,125168,124717,124904,249348,124272,0,0,0,0,249150,124036,0,625155,0,124267,125161,249749,374422,0,0,0,0,0,124698,0,124556,0,249556,248431,249533,282082,125464,0,248806,0,624376,0,0,125165,0,249064,0,124748,124254,124604,124971,124896,0,373358,124943,0,249031,124378,124583,498637,124877,124585,372971,249430,0,0,0,498792,249233,248907,0,0,124228,0,249481,373122,124486,249653,373164,124557,249210,124833,124744,249424,249575,124746,0,0,248324,374709,0,125095,124517,0,124581,374122,124932,249588,0,124262,249226,124733,124385,125003,0,0,249433,124307,124860,124492,0,124566,0,124446,124889,216674,125168,0,249249,124339,249433,248520,124596,0,249382]},{"counters":[125176,0,248889,125460,124186,0,0,248485,124998,249730,125099,249272,622834,249587,124702,373773,124965,0,0,248897,249494,374930,124137,249786,374329,124357,0,248986,249873,125002,249284,0,124743,249434,0,0,374736,249878,374147,124457,0,0,124579,124176,124767,2026,374390,0,0,247938,125387,249179,250142,249596,124681,250553,124537,124935,125182,124373,124567,30881,124362,0,0,184826,124282,249414,0,124722,0,0,0,125047,161903,249707,125020,0,249546,125000,124722,0,249410,373884,124361,125041,249798,0,124487,125010,0,124453,124622,124595,0,498730,124061,0,374388,249328,0,0,124773,249538,125571,0,124468,249730,435879,220515,0,125298,250054,249519,0,0,375042,0,65431,375383,124172,125272,337206,124852,124178,125131,124894,0,249292,124838,748589,124812,124350,124341,0,0,0,125362,248967,24507,250656,0,124757,124922,0,0,373051,0,249625,125084,124087,124127,125052,124752,124323,249827,0,0,124298,248888,248725,0,0,124666,249568,351738,0,373746,249292,124667,125100,375019,0,124525,0,124552,249210,124909,125363,0,0,124883,374051,124439,124477,0,124570,125187,0,0,124537,124834,248593,0,0,124566,0,309570,374629,124969,124308,249285,0,123835,250030,0,124808,249538,487292,499587,373610,125228,125369,124521,124452,124780,0,0,0,249415,233171,124439,249413,125190,248894,124863,124947,124878,0,124421,124737,125764,373616,0,124283,249097,124508,0,125101,249344,0,498584,0,0,124191,124689,0,3902,622153,124665,248917,248082,124318,375075,248621,124480,0,0,124395,333399,124768,124439,0,0,373748,0,0,125261,124688,124660,125098,274300,124484,0,0,0,0,124491,124236,14439,124328,125104,248928,0,0,125492,124691,249481,0,125022,124170,0,0,125142,124526,249249,374065,249532,123994,0,265006,124743,124445,249541,124590,124365,0,124266,124181,249604,0,0,124752,0,0,374669,124022,124925,0,249299,373736,0,249140,98400,248602,124884,359960,0,124657,124328,0,248737,0,124833,373747,0,0,0,249033,250424,124522,124878,124528,248832,249465,249298,248999,0,124594,124484,250103,0,249388,373761,249408,0,124527,124580,124414,125016,0,0,374759,249122,124674,0,249757,125030,124696,374081,123956,0,248920,124659,47283,0,0,249289,0,249481,125138,0,0,124337,0,0,130451,124717,250183,0,124424,0,0,250155,125254,249538,249116,0,372899,373951,374843,125219,0,249477,498420,249727,124368,249523,0,124415,124562,0,112174,125419,499064,0,0,0,248896,69754,125153,373250,249530,0,124294,0,446913,250123,118578,0,374114,0,249070,0,0,249049,249460,249163,53031,248325,124456,248863,0,124922,124537,249206,373963,248410,124591,250002,249654,124347,124403,124865,125119,124624,250025,0,0,249426,374354,124407,124677,249979,124379,249570,499303,124749,0,0,374060,0,124508,124593,124813,249912,42802,124223,374083,0,248635,124584,0,124830,248540,0,248709,249827,0,232167,124001,0,124674,248609,124719,0,0,0,249669,0,0,125309,124940,0,0,124793,124634,124757,124781,249432,125674,124758,249276,373149,124177,373822,124167,0,249399,249145,339838,124556,0,106333,374044,0,124712,0,0,124318,124579,0,0,0,123738,93529,341686,0,125191,374870,124466,0,249688,124789,124523,0,374398,124029,373650,0,249687,0,0,0,124457,249425,0,373044,249382,0,249584,0,0,0,0,249970,498712,0,124707,124872,123957,374222,374073,124441,124491,124869,124992,0,0,124439,0,249880,249217,0,26859,0,622731,124564,0,248370,124586,0,124389,0,249160,249396,0,0,373352,249844,124554,0,0,373678,0,124667,227131,0,289599,0,249657,0,124272,124611,249669,124422,124376,373689,124739,374959,0,124275,374128,0,249561,125159,250086,248645,0,249798,0,248826,124318,124198,0,124718,0,250344,0,249786,39226,249583,374178,10057,0,0,0,124180,124604,374513,0,201071,124645,248681,0,124469,249279,0,249085,0,497090,374110,0,124718,249477,249585,124483,0,0,124329,310870,124080,0,124408,498869,249302,0,0,124883,249757,0,0,0,0,374792,248871,373375,249215,124308,124359,374081,624105,0,0,125013,124103,124359,0,0,0,124297,124856,125224,248448,373346,248840,124745,0,124059,125007,124604,123886,124444,192356,249470,122859,124775,0,178935,499060,249032,0,0,0,124694,0,373141,0,81887,63567,0,373887,125239,0,177881,249825,250172,374112,249123,249768,124442,0,124223,124467,271908,124444,0,124133,250005,124621,125285,373706,124642,248977,124558,0,249827,249672,0,125045,0,124550,125344,0,182157,124681,249177,0,125059,125121,0,249592,248849,0,0,125154,0,124987,124622,124802,124541,124320,124564,499157,0,248325,0,124621,124877,0,248926,124489,0,0,4165,0,0,0,0,0,0,374117,0,124904,0,123969,125162,125141,0,0,319700,248462,249347,374808,0,124810,0,124283,124017,124702,0,497513,249148,124972,14448,373501,249168,0,0,0,497555,248598,124733,0,124081,55094,260612,473284,249098,249045,0,0,478096,249974,249124,248833,0,125362,124309,249779,124758,373581,696764,124459,124555,499379,124735,0,0,454435,0,124624,124976,0,124531,0,125268,0,124787,373030,621975,359875,8140,373642,124955,124917,0,51032,298115,125094,373242,125207,0,0,0,124833,124772,374366,214339,124461,124120,0,0,0,124567,0,124641,124928,250387,248998,124722,0,373194,124912,249458,0,0,0,124314,0,0,123901,124355,192112,125019,249612,0,248637,124036,124110,45493,0,125007,248726,125089,146129,0,0,124482,0,124839,249535,0,125136,250118,250911,245363,249007,124439,249402,0,374226,0,124850,249119,124682,0,0,0,0,0,249925,0,468887,0,125098,373620,124927,124590,124307,0,249741,99905,0,0,210680,0,0,124551,373379,124982,249839,125085,249222,249700,248502,125006,0,124977,0,0,249237,0,0,0,0,249753,0,250074,0,0,249877,0,0,125074,0,249691,0,0,124781,0,124644,124944,124802,0,124341,124517,249894,124865,125003,124834,0,124805,0,124622,0,249137,0,0,125249,124550,0,124517,374319,248441,0,87573,498301,0,124581,0,373315,250024,124029,124638,0,0,124479,249473,0,123922,125208,124015,249221,248804,124824,0,375171,373573,249565,498998,125056,0,249379,125285,0,250008,124734,248966,124668,125364,125140,0,124593,374758,124718,249650,125050,373839,248946,248987,500189,124523,124862,0,250148,372853,124859,124340,125115,0,124196,124192,124313,0,0,123829,373672,0,0,0,373741,250095,124961,0,124602,0,0,0,0,248640,124672,375265,0,124307,249091,124657,125150,0,374577,298497,124375,124754,250425,0,124913,374157,0,250201,373242,124821,125456,249116,248430,249767,249230,180876,125253,0,249696,325115,124347,248383,124419,248411,124367,249080,499641,283661,0,153893,0,248953,124889,124814,249470,124146,124081,0,165224,77712,124519,249419,249675,374457,370232,0,0,0,249025,248978,500200,0,125162,249262,497913,0,125313,124666,249199,0,0,124815,124709,0,0,0,0,0,248292,249267,0,124081,248812,124598,249327,124371,124011,249244,248855,0,124906,124136,124531,124597,374326,249406,0,124339,374155,374042,0,498837,373882,0,124421,249411,125178,124539,249312,124431,0,249696,0,124786,250056,0,373529,0,249535,0,762136,124698,0,373471,0,0,590788,0,249003,125161,249215,0,0,124789,124478,124268,373342,0,748150,125142,249635,124626,124108,0,248804,0,125084,0,249716,0,249298,125618,124787,124568,0,124749,124173,250881,249770,0,124774,124699,482951,0,125394,250020,0,0,0,124623,374244,242296,374391,249705,0,248308,374636,124783,124304,347337,251111,250095,0,0,0,124020,248025,124668,124327,0,0,125052,374532,0,249706,0,124960,125235,196617,0,124534,498581,123839,0,0,0,373606,124931,124318,122419,0,0,249455,124875,0,124943,124496,373488,498886,124648,0,124697,0,124273,0,249805,0,0,248929,374597,124872,249323,468183,114285,124953,0,124801,0,125068,0,0,498945,0,124486,374718,0,124260,249516,0,0,331639,0,125062,0,249272,0,125107,0,0,373544,0,248862,0,249369,0,0,0,0,250082,374457,0,124932,498156,124480,0,0,125309,124994,125314,124620,50796,0,125154,124656,125113,248926,249023,18159,0,0,0,124488,124737,0,499788,249920,249654,374741,277805,0,249342,124499,374688,373908,249171,125193,248549,125183,0,249923,0,124302,125059,250370,0,248511,0,36841,124311,248928,124482,0,124112,0,249443,124119,124000,248880,124283,249255,250208,124312,0,124991,498024,249039,124242,124579,249011,248917,124587,124954,0,0,0,124717,124830,0,124501,125161,248888,0,0,0,124715,0,375264,124786,249577,124091,250092,125105,249534,0,372707,229522,0,124564,0,0,0,124623,125061,124882,0,0,124868,0,124709,0,124771,373836,249244,0,374692,124849,124651,125202,249297,124235,373780,124390,125080,0,124386,0,497923,249012,0,0,249426,248875,373954,124433,125192,500111,497958,124345,248960,0,0,249976,124821,0,124432,250081,498823,372949,250067,124965,124652,0,124387,0,125326,124280,125481,0,0,374064,0,374667,124609,124726,0,374209,248873,116952,0,0,124977,125012,0,625115,125094,249266,249218,0,124334,0,374429,124280,381586,249317,0,124751,124766,124932,0,374820,0,373025,249349,124965,124958,0,250607,124291,0,0,0,124457,248926,248734,250034,124489,124718,374092,374583,498586,374725,248718,124913,124508,249558,0,0,0,249729,0,124228,124704,373755,250689,250324,249567,124908,125103,268483,124310,124517,125143,124659,0,0,457518,124419,250096,498667,0,249698,248945,124527,374261,249469,249382,0,374030,0,124441,374452,124488,124721,321363,124791,0,124473,249360,0,249560,373589,0,125095,0,124788,294154,124480,0,374836,623663,0,0,123739,375102,249164,0,124305,0,373912,124959,124499,130387,250095,125079,0,124783,124266,249358,0,124086,124755,124656,124576,124736,202140,0,499517,124753,248363,248534,0,124002,159626,124863,124457,124228,375222,249886,625495,0,0,249813,248875,125520,172006,124437,0,373488,125221,249658,124653,0,124882,249277,125125,147094,498861,0,374524,248959,262026,250424,0,124908,248217,0,124942,124330,124243,124605,0,249371,0,124838,249081,124817,0,125052,125234,125350,124709,0,124964,0,249517,124554,249315,124612,125157,0,125207,0,0,249542,249318,249183,374802,0,141036,124114,123960,248374,249601,0,124894,124074,250174,250400,248729,248777,125255,0,249841,374623,373451,125126,0,248627,124441,124696,163996,125076,124698,373935,124038,249817,0,0,373807,249747,0,124474,124710,0,124899,374906,0,124845,374670,125104,373713,124700,0,124919,0,0,124104,249117,124458,0,124182,124325,374509,249435,374307,0,124812,249264,125334,0,0,124526,124695,0,0,124491,0,125083,375221,125136,249882,124889,249437,124682,124221,249971,0,0,0,0,248822,0,124584,0,249436,0,0,124569,0,249937,499753,124672,124616,124755,374955,249649,124377,0,0,373327,124672,150628,124309,0,373553,124341,373890,124313,249584,0,32639,0,0,249780,0,249210,124061,0,0,248966,328870,0,124574,0,124166,124625,124484,125140,124937,124908,124557,125153,0,248783,374836,0,125095,0,124565,0,125368,0,124588,249640,0,125158,20419,373670,124896,249718,124664,0,124366,251134,0,498526,249640,0,0,0,124702,125140,124183,0,0,403401,124967,0,248904,375271,123774,0,249318,249424,0,124554,0,125030,124488,249707,125096,124920,439823,248580,124412,248532,417801,0,0,0,373566,374037,0,249015,0,123655,124484,498191,0,0,124381,0,0,249903,124684,124682,0,0,124165,0,373581,249642,497563,249977,0,0,0,0,0,124262,125094,250158,0,373661,0,249780,125126,0,498912,124465,374662,373622,124172,124385,124371,124598,0,0,249706,250646,0,0,118748,0,248622,250060,248841,124658,374444,374569,124632,124743,250340,0,124966,249996,32781,124837,0,373273,125300,124136,373356,0,125177,210404,249413,249485,361289,0,250116,63245,0,125060,249451,249701,124918,0,124160,248324,0,249430,0,0,249180,250308,124671,249934,0,0,249169,249017,0,0,249011,124578,249236,249084,248658,375370,249631,0,124311,124407,248797,0,250074]}]},"null_count":0,"tot_col_size":3000058110,"last_update_version":401695339788369922},"l_discount":{"histogram":{"ndv":11,"buckets":[{"count":28080543,"lower_bound":"MA==","upper_bound":"MA==","repeats":28080000},{"count":55471074,"lower_bound":"MC4wMQ==","upper_bound":"MC4wMQ==","repeats":27390000},{"count":82141591,"lower_bound":"MC4wMg==","upper_bound":"MC4wMg==","repeats":26670000},{"count":109622123,"lower_bound":"MC4wMw==","upper_bound":"MC4wMw==","repeats":27480000},{"count":136202638,"lower_bound":"MC4wNA==","upper_bound":"MC4wNA==","repeats":26580000},{"count":165243200,"lower_bound":"MC4wNQ==","upper_bound":"MC4wNQ==","repeats":29040000},{"count":191163702,"lower_bound":"MC4wNg==","upper_bound":"MC4wNg==","repeats":25920000},{"count":218074224,"lower_bound":"MC4wNw==","upper_bound":"MC4wNw==","repeats":26910000},{"count":245554756,"lower_bound":"MC4wOA==","upper_bound":"MC4wOA==","repeats":27480000},{"count":273935306,"lower_bound":"MC4wOQ==","upper_bound":"MC4wOQ==","repeats":28380000},{"count":300005811,"lower_bound":"MC4x","upper_bound":"MC4x","repeats":26070000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266927,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27280058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27270981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27278325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27271745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27271745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266927,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27278325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27280058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27270981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27270981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268918,0,0,0,0,0,0,0,0,0,0,0,27280058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266927,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27271745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27278325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27278325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266927,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27270981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27280058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27271745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,27268918,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277570,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27271745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266439,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27270981,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27277771,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27280058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27266927,0,0,27273215,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27278325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27273862,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":2700052299,"last_update_version":401695339749048322},"l_extendedprice":{"histogram":{"ndv":2846720,"buckets":[{"count":1200023,"lower_bound":"OTY0Ljk5","upper_bound":"MTIyMC4x","repeats":105},{"count":2400046,"lower_bound":"MTIyMi44OA==","upper_bound":"MTQwOS4yOA==","repeats":105},{"count":3600069,"lower_bound":"MTQxMg==","upper_bound":"MTU3MC4y","repeats":105},{"count":4800092,"lower_bound":"MTU3NC4y","upper_bound":"MTc2NS4yNQ==","repeats":105},{"count":6000116,"lower_bound":"MTc2NS4zNg==","upper_bound":"MTk0NC43Nw==","repeats":105},{"count":7200139,"lower_bound":"MTk1Ni43Nw==","upper_bound":"MjQyMS44Ng==","repeats":105},{"count":8400162,"lower_bound":"MjQzMS40NA==","upper_bound":"MjkwMy45Nw==","repeats":105},{"count":9600185,"lower_bound":"MjkwNC43OA==","upper_bound":"MzE5OC4wOA==","repeats":105},{"count":10800209,"lower_bound":"MzIwMC4zNA==","upper_bound":"MzQwMy4wOA==","repeats":105},{"count":12000232,"lower_bound":"MzQxNC40","upper_bound":"MzY2My4yMg==","repeats":105},{"count":13200255,"lower_bound":"MzY3MC44","upper_bound":"Mzg2MC41NQ==","repeats":105},{"count":14400278,"lower_bound":"Mzg2Ni44OA==","upper_bound":"NDA2My44OA==","repeats":105},{"count":15600302,"lower_bound":"NDA3MS44NA==","upper_bound":"NDQ5Ny41Nw==","repeats":105},{"count":16800325,"lower_bound":"NDUwOQ==","upper_bound":"NDgwMC44OA==","repeats":105},{"count":18000348,"lower_bound":"NDgwMS4zNQ==","upper_bound":"NTA4OA==","repeats":105},{"count":19200371,"lower_bound":"NTA4OC45Ng==","upper_bound":"NTM3OC4z","repeats":105},{"count":20400395,"lower_bound":"NTM4MC4zMg==","upper_bound":"NTYxNS43OQ==","repeats":105},{"count":21600418,"lower_bound":"NTYxNi44NA==","upper_bound":"NTg4MS4zMg==","repeats":105},{"count":22800441,"lower_bound":"NTg4NS41Ng==","upper_bound":"NjI1Ni4yNg==","repeats":105},{"count":24000464,"lower_bound":"NjI2My44","upper_bound":"NjQ5MS4y","repeats":105},{"count":25200488,"lower_bound":"NjQ5NS45NQ==","upper_bound":"Njc4NS41Mg==","repeats":105},{"count":26400511,"lower_bound":"Njc4Ni4yOA==","upper_bound":"NzA1My41Mg==","repeats":105},{"count":27600534,"lower_bound":"NzA2Mi45Ng==","upper_bound":"NzM5MC40OA==","repeats":105},{"count":28800557,"lower_bound":"NzM5Ni44Ng==","upper_bound":"NzYyMi41Ng==","repeats":105},{"count":30000581,"lower_bound":"NzYyMy40Mg==","upper_bound":"Nzg4Ni42","repeats":105},{"count":31200604,"lower_bound":"Nzg5OS4xNg==","upper_bound":"ODE2Ni42","repeats":105},{"count":32400627,"lower_bound":"ODE3MS4zNQ==","upper_bound":"ODUyMS44","repeats":105},{"count":33600650,"lower_bound":"ODUyOC44NQ==","upper_bound":"ODg0MS4xMg==","repeats":105},{"count":34800674,"lower_bound":"ODg1Mi41","upper_bound":"OTExNS44","repeats":105},{"count":36000697,"lower_bound":"OTE0My42MQ==","upper_bound":"OTQ2NS4zOQ==","repeats":105},{"count":37200720,"lower_bound":"OTQ3Mi4xNQ==","upper_bound":"OTgwNi4yOA==","repeats":105},{"count":38400743,"lower_bound":"OTgwOS42","upper_bound":"MTAxMDguMDc=","repeats":105},{"count":39600767,"lower_bound":"MTAxMzQuOTY=","upper_bound":"MTA0NTQuNzY=","repeats":105},{"count":40800790,"lower_bound":"MTA0NTYuMTQ=","upper_bound":"MTA3MzguMzg=","repeats":105},{"count":42000813,"lower_bound":"MTA3MzguOA==","upper_bound":"MTEwMTEuOTg=","repeats":105},{"count":43200836,"lower_bound":"MTEwMjAuMw==","upper_bound":"MTEyODguMzQ=","repeats":105},{"count":44400860,"lower_bound":"MTEyOTYuMDg=","upper_bound":"MTE1OTUuNTQ=","repeats":105},{"count":45600883,"lower_bound":"MTE2MDIuNDQ=","upper_bound":"MTE4ODAuODg=","repeats":105},{"count":46800906,"lower_bound":"MTE4ODMuNTI=","upper_bound":"MTIxMzIuMDU=","repeats":105},{"count":48000929,"lower_bound":"MTIxMzIuMDk=","upper_bound":"MTIzNzEuMDQ=","repeats":105},{"count":49200953,"lower_bound":"MTIzNzUuNDQ=","upper_bound":"MTI2OTcuMw==","repeats":105},{"count":50400976,"lower_bound":"MTI3MDMuMDQ=","upper_bound":"MTMwMjE=","repeats":105},{"count":51600999,"lower_bound":"MTMwMjEuMw==","upper_bound":"MTMyOTguMQ==","repeats":105},{"count":52801022,"lower_bound":"MTMzMDEuMg==","upper_bound":"MTM1MzIuMQ==","repeats":105},{"count":54001045,"lower_bound":"MTM1MzMuNg==","upper_bound":"MTM4MTQuNDY=","repeats":105},{"count":55201069,"lower_bound":"MTM4MjcuMDY=","upper_bound":"MTQwOTguNg==","repeats":105},{"count":56401092,"lower_bound":"MTQxMDUuNzk=","upper_bound":"MTQzMzguOTg=","repeats":105},{"count":57601115,"lower_bound":"MTQzNDUuOTg=","upper_bound":"MTQ3MTAuMzI=","repeats":105},{"count":58801138,"lower_bound":"MTQ3MjYuMDc=","upper_bound":"MTQ5NjAuNzk=","repeats":105},{"count":60001162,"lower_bound":"MTQ5NjIuOTY=","upper_bound":"MTUyMjUuMjE=","repeats":105},{"count":61201185,"lower_bound":"MTUyNTAuMjM=","upper_bound":"MTU1NTQuNjE=","repeats":105},{"count":62401208,"lower_bound":"MTU1NTcuMTM=","upper_bound":"MTU4MDcuODc=","repeats":105},{"count":63601231,"lower_bound":"MTU4MjEuODU=","upper_bound":"MTYxMzUuOQ==","repeats":105},{"count":64801255,"lower_bound":"MTYxNDcuMjM=","upper_bound":"MTYzNzQuNg==","repeats":30105},{"count":66001278,"lower_bound":"MTYzNzUuMDU=","upper_bound":"MTY1OTUuNQ==","repeats":105},{"count":67201301,"lower_bound":"MTY2MDYuOA==","upper_bound":"MTY5NzguNDE=","repeats":105},{"count":68401324,"lower_bound":"MTY5ODYuNA==","upper_bound":"MTczNjkuNjk=","repeats":30105},{"count":69601348,"lower_bound":"MTczODcuNDQ=","upper_bound":"MTc2NzMuNQ==","repeats":105},{"count":70801371,"lower_bound":"MTc2NzQuOTI=","upper_bound":"MTgwMzEuMg==","repeats":105},{"count":72001394,"lower_bound":"MTgwMzMuOQ==","upper_bound":"MTgyNDIuNw==","repeats":105},{"count":73201417,"lower_bound":"MTgyNDIuODg=","upper_bound":"MTg1OTcuNzU=","repeats":105},{"count":74401441,"lower_bound":"MTg2NjYuMjQ=","upper_bound":"MTg5MjkuMDQ=","repeats":105},{"count":75601464,"lower_bound":"MTg5MzMuMg==","upper_bound":"MTkyMzAuMzg=","repeats":105},{"count":76801487,"lower_bound":"MTkyMzEuNQ==","upper_bound":"MTk0ODguNTY=","repeats":105},{"count":78001510,"lower_bound":"MTk0OTguMzI=","upper_bound":"MTk4NzIuNDk=","repeats":105},{"count":79201534,"lower_bound":"MTk4NzQuMDg=","upper_bound":"MjAxOTYuMg==","repeats":105},{"count":80401557,"lower_bound":"MjAyMDQuOQ==","upper_bound":"MjA0NDcuNTY=","repeats":105},{"count":81601580,"lower_bound":"MjA0NTQuMjg=","upper_bound":"MjA3OTIuNw==","repeats":105},{"count":82801603,"lower_bound":"MjA4MDIuOTk=","upper_bound":"MjEwOTY=","repeats":105},{"count":84001627,"lower_bound":"MjExMDYuMjg=","upper_bound":"MjE0MjIuODM=","repeats":105},{"count":85201650,"lower_bound":"MjE0MjguMjI=","upper_bound":"MjE2NTguNg==","repeats":105},{"count":86401673,"lower_bound":"MjE2NzQuNTI=","upper_bound":"MjE5NDkuOTU=","repeats":105},{"count":87601696,"lower_bound":"MjE5NTMuNjk=","upper_bound":"MjIzODYuNA==","repeats":105},{"count":88801720,"lower_bound":"MjIzODkuNjg=","upper_bound":"MjI2NTcuNg==","repeats":105},{"count":90001743,"lower_bound":"MjI2NjEuOA==","upper_bound":"MjI4NzYuNjI=","repeats":105},{"count":91201766,"lower_bound":"MjI5MTQuOTg=","upper_bound":"MjMxNDMuMzI=","repeats":105},{"count":92401789,"lower_bound":"MjMxNTIuNTY=","upper_bound":"MjMzNzguNTI=","repeats":105},{"count":93601813,"lower_bound":"MjMzODQuMTY=","upper_bound":"MjM2NjguOTY=","repeats":105},{"count":94801836,"lower_bound":"MjM2NzQuNTc=","upper_bound":"MjM5MzkuMTY=","repeats":105},{"count":96001859,"lower_bound":"MjM5NTIuMDY=","upper_bound":"MjQyMDEuODQ=","repeats":105},{"count":97201882,"lower_bound":"MjQyMTcuODU=","upper_bound":"MjQ2MTcuMTI=","repeats":105},{"count":98401906,"lower_bound":"MjQ2MTcuMzQ=","upper_bound":"MjQ5NzcuOTM=","repeats":105},{"count":99601929,"lower_bound":"MjQ5ODQuMw==","upper_bound":"MjUyNzcuNDY=","repeats":105},{"count":100801952,"lower_bound":"MjUyODUuMTI=","upper_bound":"MjU1MjAuNTc=","repeats":105},{"count":102001975,"lower_bound":"MjU1MjkuMDE=","upper_bound":"MjU4MjAuODg=","repeats":105},{"count":103201998,"lower_bound":"MjU4MzYuMTY=","upper_bound":"MjYxMjAuNw==","repeats":105},{"count":104402022,"lower_bound":"MjYxMjQuNzg=","upper_bound":"MjY0MDcuMg==","repeats":105},{"count":105602045,"lower_bound":"MjY0MTYuNTI=","upper_bound":"MjY2NzY=","repeats":105},{"count":106802068,"lower_bound":"MjY2OTUuNzY=","upper_bound":"MjY5ODIuNDc=","repeats":105},{"count":108002091,"lower_bound":"MjY5OTk=","upper_bound":"MjcyODguNDg=","repeats":105},{"count":109202115,"lower_bound":"MjcyOTAuMjQ=","upper_bound":"Mjc0OTIuNTc=","repeats":105},{"count":110402138,"lower_bound":"Mjc0OTguNjk=","upper_bound":"Mjc4MDkuNDY=","repeats":105},{"count":111602161,"lower_bound":"Mjc4MTYuMjQ=","upper_bound":"MjgyMDcuMDg=","repeats":105},{"count":112802184,"lower_bound":"MjgyMTYuNjM=","upper_bound":"Mjg1MDA=","repeats":105},{"count":114002208,"lower_bound":"Mjg1MDI=","upper_bound":"Mjg3NDAuMzY=","repeats":105},{"count":115202231,"lower_bound":"Mjg3NDIuMzE=","upper_bound":"MjkwMzcuODQ=","repeats":105},{"count":116402254,"lower_bound":"MjkwNDEuMzI=","upper_bound":"MjkzNDkuMTQ=","repeats":105},{"count":117602277,"lower_bound":"MjkzNjAuMQ==","upper_bound":"Mjk2MzguNjU=","repeats":105},{"count":118802301,"lower_bound":"Mjk2NDcuNDE=","upper_bound":"Mjk4NDcuNDI=","repeats":105},{"count":120002324,"lower_bound":"Mjk4NDguMzI=","upper_bound":"MzAxNTIuMzE=","repeats":105},{"count":121202347,"lower_bound":"MzAxNzMuOTI=","upper_bound":"MzA0MDUuNw==","repeats":105},{"count":122402370,"lower_bound":"MzA0MTIuOA==","upper_bound":"MzA2OTAuMjI=","repeats":105},{"count":123602394,"lower_bound":"MzA3MDkuMzc=","upper_bound":"MzA5NjUuOTE=","repeats":105},{"count":124802417,"lower_bound":"MzA5NzQuNTg=","upper_bound":"MzEyMDIuODI=","repeats":105},{"count":126002440,"lower_bound":"MzEyMDMuNDg=","upper_bound":"MzE1MjEuMjY=","repeats":105},{"count":127202463,"lower_bound":"MzE1MjUuNDU=","upper_bound":"MzE3NTcuNjc=","repeats":105},{"count":128402487,"lower_bound":"MzE3NzAuNA==","upper_bound":"MzIwNDcuNzU=","repeats":105},{"count":129602510,"lower_bound":"MzIwNTUuMjQ=","upper_bound":"MzIzOTYuNw==","repeats":105},{"count":130802533,"lower_bound":"MzIzOTcuNTg=","upper_bound":"MzI2NTEuMg==","repeats":105},{"count":132002556,"lower_bound":"MzI2NTUuNDU=","upper_bound":"MzI5MTQuNDI=","repeats":105},{"count":133202580,"lower_bound":"MzI5MTcuNQ==","upper_bound":"MzMxNTIuMzQ=","repeats":105},{"count":134402603,"lower_bound":"MzMxNjQuNzk=","upper_bound":"MzM0MDAuOTI=","repeats":105},{"count":135602626,"lower_bound":"MzM0MDUuNg==","upper_bound":"MzM3MjYuNDU=","repeats":105},{"count":136802649,"lower_bound":"MzM3MzAuMTk=","upper_bound":"MzM5NzE=","repeats":105},{"count":138002673,"lower_bound":"MzM5NzUuOQ==","upper_bound":"MzQyNjMuMzY=","repeats":105},{"count":139202696,"lower_bound":"MzQyNjQuMDM=","upper_bound":"MzQ1MzYuOTY=","repeats":105},{"count":140402719,"lower_bound":"MzQ1MzguMTM=","upper_bound":"MzQ4MDMuNzY=","repeats":105},{"count":141602742,"lower_bound":"MzQ4MDUuODg=","upper_bound":"MzUxMDAuMjQ=","repeats":105},{"count":142802766,"lower_bound":"MzUxMDQ=","upper_bound":"MzU0MDk=","repeats":105},{"count":144032789,"lower_bound":"MzU0MjUuODg=","upper_bound":"MzU3MDkuMjE=","repeats":30105},{"count":145232813,"lower_bound":"MzU3MDkuNQ==","upper_bound":"MzYwMDIuODI=","repeats":105},{"count":146432836,"lower_bound":"MzYwMDQuNjQ=","upper_bound":"MzYyOTIuNTI=","repeats":105},{"count":147632859,"lower_bound":"MzYyOTMuODg=","upper_bound":"MzY1NDQuMDY=","repeats":105},{"count":148832882,"lower_bound":"MzY1NzcuMg==","upper_bound":"MzY4NzMuNDk=","repeats":105},{"count":150032906,"lower_bound":"MzY4NzYuNDU=","upper_bound":"MzcxNjIuMTg=","repeats":105},{"count":151232929,"lower_bound":"MzcxODQuNzM=","upper_bound":"Mzc0OTYuNDQ=","repeats":105},{"count":152432952,"lower_bound":"Mzc0OTYuNzE=","upper_bound":"Mzc3NTIuNDg=","repeats":105},{"count":153632975,"lower_bound":"Mzc3NTMuMDQ=","upper_bound":"MzgwNDAuMDM=","repeats":105},{"count":154832999,"lower_bound":"MzgwNjYuNg==","upper_bound":"MzgyODEuMDE=","repeats":105},{"count":156033022,"lower_bound":"MzgyODYuNDk=","upper_bound":"Mzg3MTUuOA==","repeats":105},{"count":157233045,"lower_bound":"Mzg3MzkuODY=","upper_bound":"MzkwMzIuMzI=","repeats":105},{"count":158433068,"lower_bound":"MzkwMzMuNTQ=","upper_bound":"MzkyOTUuODc=","repeats":105},{"count":159633092,"lower_bound":"MzkyOTYuNDU=","upper_bound":"Mzk1NjAuMDQ=","repeats":105},{"count":160833115,"lower_bound":"Mzk1NjIuNzQ=","upper_bound":"Mzk4ODYuNw==","repeats":105},{"count":162033138,"lower_bound":"Mzk5MDAuOTY=","upper_bound":"NDAxNDcuNDI=","repeats":105},{"count":163233161,"lower_bound":"NDAxNDkuOTY=","upper_bound":"NDA0NTUuNTY=","repeats":105},{"count":164433185,"lower_bound":"NDA0NjcuMDk=","upper_bound":"NDA3OTcuOTY=","repeats":105},{"count":165633208,"lower_bound":"NDA3OTkuNDM=","upper_bound":"NDEwNzEuOQ==","repeats":105},{"count":166833231,"lower_bound":"NDEwODYuNzQ=","upper_bound":"NDEyOTUuMTU=","repeats":105},{"count":168033254,"lower_bound":"NDEyOTUuOTY=","upper_bound":"NDE1MzUuMg==","repeats":105},{"count":169233277,"lower_bound":"NDE1MzUuODQ=","upper_bound":"NDE4MjUuMg==","repeats":105},{"count":170433301,"lower_bound":"NDE4NTIuNTg=","upper_bound":"NDIwODMuMQ==","repeats":105},{"count":171633324,"lower_bound":"NDIwOTguNTE=","upper_bound":"NDI0MTUuODg=","repeats":105},{"count":172833347,"lower_bound":"NDI0MjAuMDU=","upper_bound":"NDI3MDcuMDQ=","repeats":105},{"count":174033370,"lower_bound":"NDI3MjQuMzQ=","upper_bound":"NDI5OTMuODY=","repeats":105},{"count":175233394,"lower_bound":"NDMwMTIuNTE=","upper_bound":"NDMyNTcuMDU=","repeats":105},{"count":176433417,"lower_bound":"NDMyNzAuMzY=","upper_bound":"NDM1MjUuNDY=","repeats":105},{"count":177633440,"lower_bound":"NDM1MzAuOTM=","upper_bound":"NDM4MTUuNjQ=","repeats":105},{"count":178833463,"lower_bound":"NDM4MjEuNTg=","upper_bound":"NDQxMDYuOTM=","repeats":105},{"count":180033487,"lower_bound":"NDQxMDkuOA==","upper_bound":"NDQzNTQuMDU=","repeats":105},{"count":181233510,"lower_bound":"NDQzNjAuMDk=","upper_bound":"NDQ2MDIuODg=","repeats":105},{"count":182433533,"lower_bound":"NDQ2MDY=","upper_bound":"NDQ3OTcuNjg=","repeats":105},{"count":183633556,"lower_bound":"NDQ3OTkuNg==","upper_bound":"NDUxMjIuNA==","repeats":105},{"count":184833580,"lower_bound":"NDUxMjYuOQ==","upper_bound":"NDU0NTAuNDY=","repeats":105},{"count":186033603,"lower_bound":"NDU0NjQuNA==","upper_bound":"NDU3MDEuODg=","repeats":105},{"count":187233626,"lower_bound":"NDU3MDMuMjQ=","upper_bound":"NDYwMDYuOTI=","repeats":105},{"count":188433649,"lower_bound":"NDYwMDkuMDg=","upper_bound":"NDYxOTMuNzY=","repeats":105},{"count":189633673,"lower_bound":"NDYyMDEuNg==","upper_bound":"NDY0NjguOTU=","repeats":105},{"count":190833696,"lower_bound":"NDY0NjkuMDY=","upper_bound":"NDY3MjcuNjQ=","repeats":105},{"count":192033719,"lower_bound":"NDY3MzUuMDg=","upper_bound":"NDY5ODMuMTM=","repeats":105},{"count":193233742,"lower_bound":"NDY5ODkuMDQ=","upper_bound":"NDcyNDMuNjg=","repeats":105},{"count":194433766,"lower_bound":"NDcyNTUuNzk=","upper_bound":"NDc1ODAuNTY=","repeats":105},{"count":195633789,"lower_bound":"NDc1ODYuNg==","upper_bound":"NDc4MTIuNQ==","repeats":105},{"count":196863813,"lower_bound":"NDc4MjUuMjg=","upper_bound":"NDgwMTYuNQ==","repeats":30105},{"count":198063836,"lower_bound":"NDgwMjUuOTg=","upper_bound":"NDgyODcuNTI=","repeats":105},{"count":199263859,"lower_bound":"NDgyODguMzI=","upper_bound":"NDg1ODIuNTY=","repeats":105},{"count":200463882,"lower_bound":"NDg1ODcuNTU=","upper_bound":"NDg4ODUuNDg=","repeats":105},{"count":201663906,"lower_bound":"NDg4OTMuMDQ=","upper_bound":"NDkxNzguMjU=","repeats":105},{"count":202863929,"lower_bound":"NDkxNzkuMTU=","upper_bound":"NDk0NTMuMjI=","repeats":105},{"count":204063952,"lower_bound":"NDk0NTQuODY=","upper_bound":"NDk4MDIuNzY=","repeats":105},{"count":205263975,"lower_bound":"NDk4MDMuNTI=","upper_bound":"NTAwNzguNjg=","repeats":105},{"count":206463999,"lower_bound":"NTAwODUuMjg=","upper_bound":"NTAzNDEuNQ==","repeats":105},{"count":207664022,"lower_bound":"NTAzNDUuMDU=","upper_bound":"NTA2MDguNTM=","repeats":105},{"count":208864045,"lower_bound":"NTA2MTguNjY=","upper_bound":"NTA5MTIuMDE=","repeats":105},{"count":210064068,"lower_bound":"NTA5MTMuNzI=","upper_bound":"NTExMzcuNTI=","repeats":105},{"count":211264092,"lower_bound":"NTExMzguODE=","upper_bound":"NTEzMjYuOA==","repeats":105},{"count":212464115,"lower_bound":"NTEzNTIuNDQ=","upper_bound":"NTE2MjQuODc=","repeats":105},{"count":213664138,"lower_bound":"NTE2MzkuNTE=","upper_bound":"NTE5MjQuODQ=","repeats":105},{"count":214864161,"lower_bound":"NTE5MzcuNzE=","upper_bound":"NTIxOTUuMg==","repeats":105},{"count":216064185,"lower_bound":"NTIyMTguNzQ=","upper_bound":"NTI1NTIuMzI=","repeats":105},{"count":217264208,"lower_bound":"NTI1NTQuNDg=","upper_bound":"NTI5MDkuOTI=","repeats":105},{"count":218464231,"lower_bound":"NTI5MTAuMjE=","upper_bound":"NTMyOTEuMzk=","repeats":105},{"count":219664254,"lower_bound":"NTMyOTUuNDg=","upper_bound":"NTM1NTYuMw==","repeats":105},{"count":220864278,"lower_bound":"NTM1NTkuMQ==","upper_bound":"NTM5MTAuMTU=","repeats":105},{"count":222064301,"lower_bound":"NTM5MTAuMzY=","upper_bound":"NTQzMjcuNw==","repeats":105},{"count":223264324,"lower_bound":"NTQzMzAuMTU=","upper_bound":"NTQ2ODUuMDE=","repeats":105},{"count":224464347,"lower_bound":"NTQ2ODkuNg==","upper_bound":"NTQ5NzguNzU=","repeats":105},{"count":225664371,"lower_bound":"NTQ5ODUuOTU=","upper_bound":"NTUzMjQuODM=","repeats":105},{"count":226864394,"lower_bound":"NTUzMzU=","upper_bound":"NTU2MTAuNA==","repeats":105},{"count":228064417,"lower_bound":"NTU2MTEuNzg=","upper_bound":"NTU5MTguODQ=","repeats":105},{"count":229264440,"lower_bound":"NTU5MjMuNDI=","upper_bound":"NTYyNTAuNzI=","repeats":105},{"count":230464464,"lower_bound":"NTYyNTIuMjU=","upper_bound":"NTY1NzIuOA==","repeats":105},{"count":231664487,"lower_bound":"NTY1ODIuMw==","upper_bound":"NTY4OTUuNDg=","repeats":105},{"count":232864510,"lower_bound":"NTY5MDAuMjU=","upper_bound":"NTcxNzMuOQ==","repeats":105},{"count":234064533,"lower_bound":"NTcxNzUuNg==","upper_bound":"NTc0NjkuMTg=","repeats":105},{"count":235294557,"lower_bound":"NTc0NjkuMw==","upper_bound":"NTc3NjcuNw==","repeats":30105},{"count":236494580,"lower_bound":"NTc3NzIuMjI=","upper_bound":"NTgxMTQuOTI=","repeats":105},{"count":237694604,"lower_bound":"NTgxMTguNTg=","upper_bound":"NTg0NjQuMTI=","repeats":105},{"count":238894627,"lower_bound":"NTg0NjcuNDI=","upper_bound":"NTg5NjIuNDI=","repeats":105},{"count":240094650,"lower_bound":"NTg5NzUuNjg=","upper_bound":"NTkzNDAuNDg=","repeats":105},{"count":241294673,"lower_bound":"NTkzNDUuMjg=","upper_bound":"NTk3MzMuMTI=","repeats":105},{"count":242494697,"lower_bound":"NTk3MzUuNzY=","upper_bound":"NjAwODUuODI=","repeats":105},{"count":243694720,"lower_bound":"NjAwODk=","upper_bound":"NjA1NTYuNzY=","repeats":105},{"count":244894743,"lower_bound":"NjA1NjAuNw==","upper_bound":"NjA4NTIuMDY=","repeats":105},{"count":246094766,"lower_bound":"NjA4NTMuNzY=","upper_bound":"NjEyMDIuMjQ=","repeats":105},{"count":247294790,"lower_bound":"NjEyMDkuMzM=","upper_bound":"NjE1OTcuMTQ=","repeats":105},{"count":248494813,"lower_bound":"NjE2MTguNjI=","upper_bound":"NjIwOTEuNw==","repeats":105},{"count":249694836,"lower_bound":"NjIxMDcuODg=","upper_bound":"NjI0OTYuMjg=","repeats":105},{"count":250894859,"lower_bound":"NjI1MTEuMTI=","upper_bound":"NjI4NzAuNzY=","repeats":105},{"count":252094882,"lower_bound":"NjI4NzEuMTY=","upper_bound":"NjMzMTMuMzk=","repeats":105},{"count":253294906,"lower_bound":"NjMzMTQuMjg=","upper_bound":"NjM2OTUuNTI=","repeats":105},{"count":254494929,"lower_bound":"NjM3MTUuMDY=","upper_bound":"NjQwOTguMTM=","repeats":105},{"count":255694952,"lower_bound":"NjQxMzQuOA==","upper_bound":"NjQ2MDMuMg==","repeats":105},{"count":256894975,"lower_bound":"NjQ2MjIuMDQ=","upper_bound":"NjQ5OTIuMzg=","repeats":105},{"count":258094999,"lower_bound":"NjUwMDkuMDQ=","upper_bound":"NjU1MjkuNDI=","repeats":105},{"count":259295022,"lower_bound":"NjU1MzEuNzM=","upper_bound":"NjYxMDkuNzQ=","repeats":105},{"count":260495045,"lower_bound":"NjYxMTIuOTI=","upper_bound":"NjY1NTkuODU=","repeats":105},{"count":261695068,"lower_bound":"NjY1NzAuODg=","upper_bound":"NjY4ODkuMDY=","repeats":105},{"count":262895092,"lower_bound":"NjY4OTIuOA==","upper_bound":"Njc1MzI=","repeats":105},{"count":264095115,"lower_bound":"Njc1MzguNDg=","upper_bound":"NjgwODguNjU=","repeats":105},{"count":265295138,"lower_bound":"NjgxMjIuMjU=","upper_bound":"Njg1NzMuNjY=","repeats":105},{"count":266495161,"lower_bound":"Njg2MjguODY=","upper_bound":"NjkxNDguODY=","repeats":105},{"count":267695185,"lower_bound":"NjkxNzIuNTY=","upper_bound":"Njk2NTQuOA==","repeats":105},{"count":268895208,"lower_bound":"Njk2NTUuODM=","upper_bound":"NzAyODcuMDU=","repeats":105},{"count":270095231,"lower_bound":"NzAyODkuOTQ=","upper_bound":"NzA4NjcuMjc=","repeats":105},{"count":271295254,"lower_bound":"NzA4ODguNjI=","upper_bound":"NzE0MTcuNg==","repeats":105},{"count":272495278,"lower_bound":"NzE0MjkuMjg=","upper_bound":"NzE5NjMuMzI=","repeats":105},{"count":273695301,"lower_bound":"NzE5NjYuMw==","upper_bound":"NzI1MDkuNzM=","repeats":105},{"count":274895324,"lower_bound":"NzI1MzAuNzg=","upper_bound":"NzMzMTkuMDQ=","repeats":105},{"count":276095347,"lower_bound":"NzMzNDIuNQ==","upper_bound":"NzM3NjIuOTI=","repeats":105},{"count":277295371,"lower_bound":"NzM3NjcuNzY=","upper_bound":"NzQ0MTAuMg==","repeats":105},{"count":278495394,"lower_bound":"NzQ0MzguOTE=","upper_bound":"NzUwNzYuNA==","repeats":105},{"count":279695417,"lower_bound":"NzUwODEuMjM=","upper_bound":"NzU3NTQuNTY=","repeats":105},{"count":280895440,"lower_bound":"NzU3NzQuODE=","upper_bound":"NzYzMTE=","repeats":105},{"count":282095464,"lower_bound":"NzYzNDMuNg==","upper_bound":"NzY5MzYuNQ==","repeats":105},{"count":283295487,"lower_bound":"NzY5OTUuNA==","upper_bound":"Nzc4MTAuMzg=","repeats":105},{"count":284495510,"lower_bound":"Nzc4MTM=","upper_bound":"Nzg4MDYuMjE=","repeats":105},{"count":285695533,"lower_bound":"Nzg4MTIuMDk=","upper_bound":"Nzk2MTguNQ==","repeats":105},{"count":286895557,"lower_bound":"Nzk2MjYuNDY=","upper_bound":"ODA0MjAuNQ==","repeats":105},{"count":288095580,"lower_bound":"ODA0MzIuMzg=","upper_bound":"ODEzNTIuOTk=","repeats":105},{"count":289295603,"lower_bound":"ODEzNTcuMTU=","upper_bound":"ODIzOTguMjQ=","repeats":105},{"count":290495626,"lower_bound":"ODI0MTkuNjc=","upper_bound":"ODMzMjkuNjU=","repeats":105},{"count":291695650,"lower_bound":"ODMzNTQuNDY=","upper_bound":"ODQ1MTguMQ==","repeats":105},{"count":292895673,"lower_bound":"ODQ1MjI=","upper_bound":"ODU3MTguNjQ=","repeats":105},{"count":294095696,"lower_bound":"ODU3MzIuOTc=","upper_bound":"ODcxMjQuNQ==","repeats":105},{"count":295295719,"lower_bound":"ODcxNTM=","upper_bound":"ODg0NjQuNg==","repeats":105},{"count":296495743,"lower_bound":"ODg0NzYuNTY=","upper_bound":"OTAxMjMuMw==","repeats":105},{"count":297695766,"lower_bound":"OTAxNzIuMzI=","upper_bound":"OTE4NTkuNjI=","repeats":105},{"count":298895789,"lower_bound":"OTE4ODIuNjU=","upper_bound":"OTUwOTYuNzU=","repeats":105},{"count":300005811,"lower_bound":"OTUyNjYuNjU=","upper_bound":"MTAyNzg5LjU=","repeats":105}]},"cm_sketch":{"rows":[{"counters":[146488,137683,144102,140594,145066,152106,145367,145055,144254,142940,152213,141139,140821,146783,145418,142778,142823,144567,145372,149123,139410,150266,147308,153146,142594,149644,138947,145450,141109,136646,142044,146667,140639,141618,146989,141007,155765,144453,151378,144779,147155,151507,160910,140457,147076,149665,136034,142085,149716,143475,150694,147571,146671,144842,140182,147710,143013,144211,151365,145277,140075,146257,152194,151383,142260,136245,144879,150505,154512,140437,145452,148959,148949,152024,153040,151254,147033,146082,145829,144648,151281,146568,152946,150693,141089,146734,147908,145952,151244,143950,150234,146431,143399,142072,146034,140888,142223,151345,147834,145838,148224,147314,146687,143937,148898,144967,142448,143597,146023,141397,146847,141481,141720,140141,147657,150989,142873,144881,148730,140727,151562,143126,140506,142831,151751,152685,149918,151102,151423,149289,148750,148316,149025,148473,140940,142496,153879,150952,145268,148249,144429,147701,148266,142496,149699,148964,154824,145590,136319,151211,150969,154452,146095,144967,147935,151258,139168,144134,148200,147005,149871,140600,140833,152446,142982,144443,138681,143707,143273,139860,139877,143027,144465,150020,145798,143091,146074,149859,141176,145761,149626,150177,146165,150116,136709,149356,145770,137955,151331,133608,151657,143371,137685,143103,138798,149326,154354,149783,144999,148756,148370,149063,145205,145581,146839,142925,138572,145097,138933,143771,149303,139671,148194,150466,150031,158463,138876,145438,146660,145947,149598,146374,153762,147485,146287,141629,141598,145358,146661,142551,138820,145986,147610,143593,152196,152148,148134,151073,152831,149605,151587,143596,136105,144476,146361,144974,148579,137466,147522,149847,143515,156029,143915,151481,144079,144547,146509,148493,137913,143736,148770,141970,141565,139064,144359,148788,146749,149754,146994,144953,147791,140111,150311,140462,136619,160928,148928,140899,151573,151490,137966,145106,150253,144636,143940,147494,145308,151141,140964,148181,147095,150654,152629,144076,147317,153708,149415,149732,147871,153386,149240,151758,145833,150134,139853,150220,149927,144326,149041,142908,139600,150530,143202,140448,142363,154352,154804,144502,150755,141117,148728,150467,136907,147379,148680,151389,144761,148511,146383,143478,144480,142592,149089,150338,147246,143185,145675,142425,156583,149060,146812,149604,150820,153586,146772,154541,138411,155114,152233,144158,135069,150114,144613,150938,147632,151310,147844,149232,148727,142851,142787,145872,150051,148853,141363,138009,140094,145932,146479,142121,144197,143619,148973,148814,146065,138607,139798,140336,142376,153147,148638,143142,147566,145593,144496,147268,145873,146026,150408,150960,147422,148329,152079,145383,150299,153630,147397,138601,145381,136989,145119,147207,144665,141431,142892,142304,147636,146519,151088,141780,143702,143090,149575,148008,141961,146514,147664,146093,141443,136660,143538,139280,145739,150401,139240,147508,148534,149027,134677,143314,147090,139147,146740,150891,135525,145347,147267,145488,147112,141342,143618,150061,143161,144102,144520,139670,149121,147698,147097,156513,147353,140886,144551,150982,154090,145471,140594,145900,150091,149423,146540,149421,149633,146903,146748,147048,147115,154486,150314,154745,148099,144415,150084,137509,140209,146996,143982,148092,146876,142238,138103,141896,154032,158406,148299,152380,146476,148263,143444,145613,150135,145776,147771,147244,152351,148364,143359,145362,148079,146584,143762,150233,147379,154077,147591,142093,148372,148433,148667,146462,139795,159199,146144,143425,148646,149064,144465,148099,143559,143476,147558,144143,156586,134273,151404,142995,133888,152181,144600,143507,143317,141037,150865,140123,144571,155349,150896,148569,145318,144601,146267,144408,146209,150654,149315,146833,145702,155421,144502,145246,145272,147837,151728,153650,143116,146974,152197,139922,143443,145205,142702,153660,148728,146304,142967,150847,150854,142537,142641,154472,148899,145580,149572,146117,151046,146475,151100,148498,142709,141803,147263,141736,138865,150573,155467,153963,143238,147542,141648,151541,154411,145798,152207,143063,139648,146676,145467,150401,151481,155133,144218,147198,145023,148205,145701,147768,152959,153252,149624,150270,141674,148979,144134,144781,139124,148542,143381,153053,149619,143746,142952,143677,139965,153290,148984,133532,146483,142611,150297,147249,144809,147026,143013,141647,146598,157144,153032,152539,142694,148767,148613,148378,148927,145440,151848,145054,147566,148184,140688,149750,143492,141717,152217,142640,149858,146345,150581,142263,155018,150900,145444,143381,149169,153158,151454,146148,152714,140114,144019,145502,138746,146713,143401,151381,150103,147167,134881,143212,148577,139421,150114,152153,152187,142740,150980,152659,148021,137550,144368,153682,145151,148712,153300,145527,157777,150470,137867,146046,149284,148889,143292,141461,151986,144531,155147,146808,146709,151032,144209,147763,156704,152012,150434,145332,143276,147029,147671,149466,155500,150018,152991,143997,148233,147994,154020,144925,151861,148742,133184,145436,139767,136160,140179,148355,143393,145365,135924,156014,140175,146776,148747,137252,150553,143640,145016,144639,148517,146030,148240,146020,137309,144517,144579,146545,149945,144539,141635,145624,145365,147077,150509,139077,152669,152986,145894,145878,150004,155861,148926,139561,143003,141768,136381,147409,143819,147401,150223,142131,144807,140623,143933,148097,145239,150979,144975,153626,143086,144544,145167,144438,152213,149158,153164,144305,142798,139484,144477,144817,148346,148733,143336,150592,158671,149049,147187,147152,157246,150176,146910,149257,139662,133681,137395,143843,150846,137205,148368,148533,145986,160832,144049,151697,145226,139557,144035,141377,139234,148153,147598,148609,144077,145591,146766,141968,152307,143566,139193,149106,155701,141706,140915,152494,155361,146581,144273,146179,138213,137391,146000,148680,150036,143007,151356,154535,154456,142895,148116,145483,146420,148706,153650,143988,131747,142892,146100,147947,137268,156620,143228,139918,143724,140438,143651,150388,145212,149951,152065,144649,153079,145401,137848,146442,142718,149451,140953,137401,138797,158107,150354,146465,138497,147877,138175,143098,143558,150702,148221,153291,153446,148431,155873,145412,148504,138426,155992,153510,139277,148110,147945,147503,141759,147834,151484,150387,150571,145241,150511,143048,139870,145711,139721,146568,158032,139667,150703,149747,141684,141645,144988,142450,153479,152982,134080,145912,135912,150118,150760,148704,136182,136848,147134,147777,147036,144089,149075,147850,154373,131286,140269,137417,145224,152852,148937,148697,154416,142130,147126,144007,146009,145167,143552,147545,143428,146568,154651,142900,140158,153332,161367,144050,135811,147471,154804,154956,160423,142627,139835,146754,148239,147686,137119,148184,146005,147278,139932,157628,152457,145823,147513,148481,142717,148379,138302,144679,149022,144914,140292,152298,140686,147270,147442,143046,154337,150633,136354,144602,141947,148476,148199,150630,150863,151705,151371,153087,148897,141598,144013,151322,142907,144447,159368,146721,150209,144878,147457,142470,137599,143865,144769,144570,140781,148479,148786,143429,153941,149553,137321,145073,140851,145176,137414,149932,146341,153163,143694,145795,155747,147892,148089,141686,146233,139125,143109,140579,143261,146801,140600,152107,148481,142819,145736,141840,148250,147348,149256,139531,140300,144040,142123,144048,131419,147196,147310,146374,142412,149929,146742,137333,147208,153172,146518,143929,153125,150465,141734,142637,144644,143218,136459,140960,147525,145312,146199,143848,136217,148215,146515,146499,146358,144063,153812,148044,145761,145072,149227,155426,156381,153180,143993,139122,155768,151050,148734,148662,143142,147089,151721,145312,150460,149927,149801,150453,146126,148072,147935,149810,144493,142939,141960,148765,143294,144380,150190,140006,142641,142841,140495,146085,158697,148371,139552,148888,148338,143297,144485,151182,151137,149647,140658,152414,154769,139140,155558,150417,152250,145101,140203,150766,149440,156101,151248,146457,148347,145379,145206,145899,148557,140088,141796,137844,141406,149067,149648,150508,152302,142160,151523,147835,150472,144015,152722,149751,146873,144504,135491,150897,147715,145001,149588,155615,145855,139577,144662,151405,154535,143158,156403,145846,147388,148018,139445,139952,143865,135388,146214,138277,142024,148195,142739,152589,150517,149482,145806,145495,144411,141515,152036,145866,141504,151406,144006,145732,149298,153990,148999,151932,139503,139419,154453,146690,141841,140662,146153,150282,143853,145483,143786,146630,150185,143788,143616,136902,149275,147744,150378,146281,144261,142605,147046,147296,149223,146385,145131,145309,148623,146527,152819,145371,146083,147602,148491,148028,149085,151717,150578,149363,146975,146232,141024,137888,143578,146547,141386,141358,154637,138725,137224,148172,147061,149178,150711,150964,144710,149770,143803,147515,146629,140591,150529,139226,144852,149912,138635,144608,148991,138266,154176,147045,138880,145017,146212,145674,149378,146084,156781,149428,151465,154791,140699,147324,140125,151750,138123,144472,141512,158544,138487,153463,140921,147781,146631,136984,150262,150983,144623,150207,154429,147837,147024,139068,140160,137845,150511,146833,146205,135646,156925,138312,146804,152477,146096,139875,146204,138517,148724,149718,141339,151102,145610,145624,144966,142272,149395,149286,158527,146385,146380,146082,148602,144115,142196,147832,139721,141974,146717,151498,148515,148802,144379,151250,148713,149482,145098,135814,145940,145982,150493,141096,147545,146287,136678,143304,146548,143932,147370,144252,142379,147020,140501,146250,149913,138615,151019,146764,149612,149171,158242,146418,147736,154422,144553,147360,146973,149573,141995,147992,141396,146126,148446,145368,149196,144297,152963,146381,156999,155792,140406,147814,148509,149072,144163,145720,145146,145104,147735,142320,143677,151549,138964,142256,148456,150090,147914,150229,141428,145796,145345,142688,144252,135680,152590,145236,148670,141275,142136,143202,149069,144204,146844,147413,152134,145985,139549,145754,146196,150430,145135,150517,139189,143714,141230,147190,140040,149831,151471,144374,145841,151128,153484,139319,139278,144323,146666,145782,146954,150728,136203,154940,149885,154396,147279,142317,146334,148660,143482,151018,148080,148952,143711,143740,143495,144166,143213,145489,151575,156006,143311,153214,152139,144589,149531,144025,146831,148725,150892,146018,145660,145402,144747,142903,151426,144666,144982,147586,144210,141001,147069,145529,153544,142780,147283,142340,146068,138982,155691,140284,150861,159210,138138,137513,146627,157297,141339,152278,141659,152103,144260,162811,142420,139802,138548,149888,148068,142283,141202,147118,143732,143988,140860,139534,151001,146453,152692,143758,143406,145270,148658,137538,143248,147588,155652,155875,146742,162940,148125,145760,141251,146596,146430,146434,142565,149915,148071,143198,151514,143016,148841,140559,141525,143441,144361,147187,142816,148375,146071,149871,146638,144775,140182,149057,158359,143836,153175,154057,142124,147743,143936,144579,145458,142324,151342,144828,144092,154477,146301,142574,153652,147167,143468,146783,152827,136852,144657,148877,144393,153257,153959,149604,146830,145448,149210,152784,139816,152240,140160,148900,144245,147514,138309,146791,151696,155373,145585,144329,142070,147769,149319,146201,152195,147384,142481,149708,148409,143309,156882,137887,142584,142102,150364,150524,139297,137323,141431,143774,149193,141739,142722,139063,137794,156037,148531,147286,149415,147286,141867,141060,143598,148587,143303,142530,148342,147990,158808,141364,158476,147272,153732,154836,151009,150808,146658,141740,152693,146133,156738,152159,143883,154416,145426,147491,151835,149429,151194,142156,139255,152311,147418,149654,149644,143387,137703,148822,149375,146222,141820,144099,152050,140761,145505,144202,147447,145859,144818,142444,145665,150960,144309,144553,142172,148349,146854,149768,147601,143079,141291,143391,138722,145935,143471,141730,139385,146288,142242,148873,140708,147130,153872,157017,138825,146908,143928,143293,145743,142147,152276,144932,149152,153535,146906,154134,144067,150681,142644,150576,146233,142092,155162,145201,140535,141819,144167,154808,157512,146752,141310,143724,145311,141671,144112,142945,147451,142425,140897,144270,147576,151892,146576,141467,152582,142085,143583,153968,148865,145236,145474,152956,139819,151606,145642,150233,147730,148770,148280,147944,147737,138651,150162,146073,140760,142569,155498,141330,146739,142673,154714,141210,149394,137418,147109,149959,148918,150849,152316,148936,150392,154422,153417,140807,144121,144959,141111,150904,144990,145626,143518,143529,137072,152504,143160,148113,144696,140946,140146,141485,143141,150783,143877,150812,153057,139889,151123,146941,140131,151111,155105,146156,146401,151670,152816,148224,151084,141429,151228,143981,141652,150212,142906,158784,145226,147624,149983,145472,142290,143771,144952,148363,150218,150955,161341,147389,146546,144190,154204,144403,151945,139287,150994,157015,148365,137347,147922,145345,152201,151641,146703,151936,148912,144911,155707,147884,149150,160299,142420,142885,131429,139845,144018,151687,148235,153911,154002,139991,139053,157257,151480,145580,158365,147752,146111,148280,146499,155802,140826,154147,147159,141161,156795,140314,148125,143192,145030,154277,147331,148016,137662,134291,138875,144292,142978,149684,145334,154657,146361,136890,153793,151299,145809,143864,152511,149670,150528,137988,146697,133587,150215,146642,144410,140369,145356,149210,153643,143048,143441,148646,144680,151217,147562,145999,143550,156705,152597,151102,144057,138340,149255,135167,154819,145189,145747,139844,146159,147910,152897,151504,144057,152773,145712,148802,143519,137637,145835,147455,143992,148074,147702,134709,145310,149803,145489,150346,147394,143426,141677,153952,148518,152133,148745,153796,142655,148284,143016,142722,147822,147325,135215,143409,146745,154021,145671,151258,143428,150760,144277,148788,144971,154861,143225,146926,153414,147827,141771,156617,150271,151177,138627,145933,149788,138030,144716,141155,145811,147751,150741,153420,147066,144827,144681,148761,145495,147352,146249,140286,148346,144780,145675,150805,137474,154253]},{"counters":[147231,139406,143317,145434,149922,143066,143123,151586,150942,149262,145710,142080,146269,152020,146039,144471,143088,147178,153601,146134,146397,151824,139493,151115,150251,148447,159188,146639,144699,155205,144429,152718,138337,142954,149348,146738,147718,148776,150072,150507,144233,147085,141537,139131,154181,151415,138814,150469,156969,151438,137563,142078,143786,149344,146117,143774,145034,156105,149322,153137,142111,148977,156100,144110,145463,144111,144665,144088,143471,148414,143877,140587,149732,148025,144314,137241,155534,147111,146604,145087,144793,143807,150440,136526,142097,147032,150125,142969,140508,145020,147802,140653,142101,143766,146791,148342,149919,137893,146136,144487,153309,141282,143883,145137,154615,156679,134491,146807,143877,138746,141927,151508,152879,143293,142570,150176,152204,152143,143365,146373,157823,142137,152679,146330,153083,145337,148313,143335,140822,149492,146156,141988,140992,153510,159377,145598,142955,143876,147497,153093,132464,141302,144956,144705,141927,148746,137256,151488,151178,140743,142488,153224,149730,150576,147534,149842,142732,141995,145007,154387,155809,147823,141393,144080,150526,142809,145988,151924,142792,144432,139523,143416,145612,154637,146481,142493,143557,134609,155659,147838,152590,140884,141152,142730,150482,140821,146751,139389,156793,137856,143373,149055,146746,155511,153890,144491,144513,147398,150375,139542,147457,145013,141860,147564,145738,144753,140668,145076,153432,154370,147400,137853,148501,141999,162732,127880,144603,149455,141000,153895,147272,150842,148422,140189,140419,141501,157900,150124,142563,151484,154863,153052,142824,141430,144970,153871,145745,149196,141500,153998,141691,148554,150243,147035,145844,149730,147115,142342,156056,141175,153965,144201,145793,154043,143457,138276,134566,136991,157578,144545,143862,146784,159433,144220,149409,139794,144771,154278,142694,145656,141531,145514,153623,143061,156008,152407,151288,151471,148981,138967,142967,147282,142803,142989,142278,147901,150695,145783,146763,138538,148507,137579,151661,152215,152370,156803,147188,145339,143234,147659,149079,149115,137639,148140,143697,152269,142110,150936,146200,148884,154785,142230,142973,146641,144585,145034,145039,143814,148150,149738,147647,147734,146529,146340,146929,143969,156324,143680,144335,144677,150001,150970,154737,146434,147702,152686,140106,150062,155494,141487,148139,143274,143638,147147,151097,145693,150823,149234,154126,142355,149798,154056,139884,146991,149067,143328,155264,143865,148703,143610,145169,146950,138120,152563,152847,138039,143050,144957,153712,146980,140187,151514,147555,142328,143135,144011,150127,144570,143040,140847,143974,142010,143283,142892,143125,141461,143823,144131,140485,143356,150782,148197,147785,144003,137490,146701,144089,138882,151003,149506,136313,141819,151531,143986,149832,140578,146180,142924,147671,145689,149643,142655,143847,143685,149255,141884,149063,138262,141624,140469,148604,141383,143792,152851,142764,143886,146220,147011,148624,150296,142685,135911,138557,147494,145960,141826,142113,138135,145077,148204,151868,151969,152472,157283,148076,138731,151242,145330,151356,144450,142220,143184,146257,147609,153590,147097,140262,142188,151799,144358,146479,140091,140673,142279,141940,147862,142827,142530,150008,151705,143608,147125,143842,152582,150963,143998,141682,145998,144162,142807,143140,147086,143591,148198,150169,151564,147270,147834,146448,147770,138021,142223,144215,143297,150008,146429,136376,152342,150477,140418,145055,144202,137579,149352,147815,152579,148114,152844,153776,154158,156559,149102,139242,143617,142035,141379,145466,143212,151095,156195,146326,147864,141156,141647,149361,148389,143378,149127,142896,145238,156708,143042,149064,150677,140619,148608,153427,145929,148911,147665,145943,146686,153819,144269,152585,153065,152996,142292,142138,144137,148158,152011,145256,144917,140012,143765,150256,142760,154427,146335,147482,150798,153054,154295,147240,140000,145282,142352,145519,139601,143398,153940,145272,142023,145398,141458,151802,133133,137126,144990,141866,145452,150684,153943,145752,152807,139666,163612,143485,147510,147612,145748,146475,139096,150905,147902,154240,140258,147412,152874,138222,150000,151495,143124,144521,143914,155273,147346,143293,143765,149014,145418,151039,148356,141149,142068,148830,146997,144438,144005,144158,140603,143767,143737,140481,145401,149166,143856,149148,145051,147169,148116,145847,147402,138673,142488,154698,140759,148534,133986,155827,145826,143951,141123,152191,143347,142669,142506,150837,151276,144758,142950,152384,142124,151491,152065,144387,143426,146234,149645,158856,146262,140784,145732,142872,149934,147342,142844,152528,143464,145385,146477,144220,145214,144465,146892,152676,140881,139690,140486,143493,146614,144672,146312,145278,144702,143149,140079,150908,149158,142435,148931,149391,143705,148513,146221,145733,145587,142514,148156,141516,151025,137880,142655,145351,143359,145940,149395,142658,145726,137115,142901,148148,149104,149483,139299,141807,152750,149152,136936,141319,155492,147097,144909,137846,144097,148560,144295,142991,144161,139669,147637,140109,138082,145938,150634,141867,151870,149756,137801,140860,141897,148628,151805,149448,151979,146408,156575,147906,141755,149678,146783,145563,146624,151192,143011,137386,141261,146480,149737,153509,153504,141351,152728,149873,153130,142605,151775,140978,145474,148809,143879,142195,153783,140873,144403,146880,142196,144322,143879,148618,148757,153890,146977,136728,143937,143930,149251,141098,145348,162407,142449,152594,134161,154315,152325,146920,148078,137453,149212,141850,143116,136873,148185,139435,142254,148193,141980,150354,148457,146124,142176,149057,143974,143038,145046,148171,142438,143609,153217,144665,138974,140121,148772,149066,141446,146921,145870,137886,154379,152559,149542,143874,145956,148066,152031,143799,144837,147283,146842,144167,143160,138914,143586,152817,143458,150277,145612,144426,152025,144047,150388,142454,137735,140658,140971,146474,140777,144656,157363,142432,138029,143143,146020,151197,141533,138507,151271,144087,150101,146639,149626,151554,148797,147964,144178,155664,151139,147815,149588,151712,152470,147534,147454,149905,143999,149178,145749,144569,145913,147448,148875,146618,148741,140347,149869,142928,151833,146861,149368,144451,150204,145964,149287,154412,147140,142229,146597,141399,143787,145980,141627,145332,146151,138071,151295,148941,159750,145785,150907,151769,153222,147622,151594,149218,156845,150885,138145,146069,147538,149373,143045,150635,133408,149136,148783,152357,145621,144039,143022,153410,141422,155954,150659,146042,138737,143717,150041,146674,145499,136825,137340,143322,138290,148211,146434,147575,144960,150466,146017,146615,144514,147795,153753,149275,143403,147860,148088,149652,148533,142927,150236,149669,150797,148606,148293,146629,136574,139025,150135,139658,142989,139436,133523,145888,139932,143783,142716,147495,149508,141792,151055,145987,149169,158855,151521,141070,151242,146697,146322,142899,141163,144169,142670,147438,149929,144586,150708,151831,148032,142436,149803,144639,148912,140028,150809,150807,148875,150247,145553,142225,143160,152993,138507,152415,147065,151897,147588,148024,147750,148243,149690,143134,143296,142585,143078,149214,143801,148159,143508,144496,149362,146595,141821,147976,151787,157334,154461,148802,150347,151364,148181,148727,147543,145818,140375,144395,148335,149197,145847,145525,148820,155271,148184,151663,147371,139418,143149,148548,145977,141322,140070,145786,146700,149117,149691,147534,156380,147632,156155,147142,148894,145469,139718,140659,142706,147463,154485,140114,142532,149618,144400,147503,145169,154961,156087,143474,148570,145955,144756,139516,142047,143982,146943,149558,154017,147856,142082,146358,145044,149391,152376,146287,143127,138069,147480,150433,151140,149364,154730,141950,145680,151419,149355,157530,143969,144890,148156,149354,154634,149094,142796,143233,146536,142404,147376,146121,151129,139028,139987,150237,155284,159701,151849,150273,147494,147737,157351,148593,144342,148470,144343,148236,154925,145207,149121,150735,142163,141788,156155,152448,144651,140428,142647,152668,143986,146490,154024,147329,136746,151051,155840,150526,139142,143982,152540,150818,141600,144203,139743,150691,136908,138491,146086,149917,140002,142296,149711,143263,143139,141398,146438,146405,144812,150615,135945,147358,150769,147109,147254,146482,148373,149284,148553,144457,151250,150378,141800,147295,142840,143920,145555,152647,138483,145084,148006,139643,141405,143480,146684,145605,144309,148057,153327,149445,152242,140451,147387,148549,154472,147145,140241,140671,137628,146063,142158,143601,140174,146466,148659,142867,142740,150288,141927,147644,145237,148304,147379,144972,148044,146553,150855,143625,143351,148624,143623,145399,155770,151539,146333,138851,149996,150132,146629,146332,141880,146759,145023,145837,137450,145085,151099,144238,146131,159060,143374,150319,148706,141139,141692,152335,147722,142988,137864,150136,145953,145619,148308,141901,154876,148164,154899,134143,150665,143796,149903,143271,138749,141430,147823,152941,139315,138461,147185,142843,143118,149191,146775,145468,142193,149457,142672,148123,135821,145852,155798,153365,145047,152083,149210,148479,142211,145821,147491,152202,139799,154576,142574,144141,142170,141950,143360,147912,145329,151255,145716,142109,141189,150318,142288,144529,149927,154171,145611,156017,144835,147576,146275,147378,145892,145108,160853,147891,149998,142206,150048,140411,152528,145960,150216,141134,141693,154918,152855,155217,139524,136359,136304,153470,154257,148604,142581,149187,142323,147925,150699,149280,154458,143547,139422,154287,144239,142184,155440,145559,143309,144371,143020,143918,150331,146492,142709,143112,146112,148046,147152,143222,151652,150753,152082,139852,149769,150343,151876,155745,149767,155203,148597,144819,145012,149540,152309,143968,144612,154726,148068,142325,158057,148509,149926,150434,142844,143932,145539,147757,138792,146821,147440,138902,148048,145096,142277,148828,146041,158691,150872,140832,142958,144815,142402,143378,138995,147416,139057,142935,148156,147775,145683,149836,150423,142757,137705,146301,150791,146617,142804,144234,144136,147831,146893,146041,156205,146796,151156,150475,145976,137589,151382,153158,142558,145725,147177,139228,145040,149084,150253,148063,150095,148030,146553,144219,140849,141527,140285,141525,143902,139817,148531,142696,144695,138522,148110,142268,143085,155585,149732,146282,142999,147142,140513,137435,144061,143258,146795,156921,149023,146943,142220,150056,141030,151532,151648,147653,148274,143267,143321,143783,142235,148935,148183,153022,136577,153744,144281,147860,153010,142656,150121,141448,148304,142549,142869,137705,142891,144559,149734,147014,140782,158052,144520,153514,147938,149621,144800,141346,149809,151660,148725,149388,146627,139930,145902,145110,144882,153591,153533,154742,148150,147594,140815,146519,152744,144460,135463,155915,145524,151003,145037,147922,144396,136073,147204,140911,150062,149366,150972,145840,149866,151393,142026,137536,151356,139970,141637,149192,152123,153850,148640,149000,143570,153940,143289,151978,145221,145388,144400,148390,144627,154234,149527,150986,140499,140662,144267,152306,147849,148373,150823,161828,159424,142201,148636,143816,141032,143359,144665,150675,150719,149350,147882,145378,154021,151547,142621,142050,141525,151657,149765,145474,148496,140597,151935,147523,149242,153609,147596,143387,152549,152942,154277,140954,155160,148742,149885,146544,145677,151152,141858,141806,153384,151854,153270,150738,148062,150029,139186,147431,138345,154872,146466,147530,145275,143834,143702,144645,137166,150149,156500,141158,145595,140025,150765,149483,146827,154493,145091,141198,143999,136386,144886,141358,148145,139984,147361,147536,134226,146700,149629,152473,146539,139874,151486,142809,139244,141049,154247,143081,145299,148745,149919,140005,143959,138225,136736,153133,144746,146390,148334,148484,152647,146633,151658,146085,146146,147431,145067,147941,149552,144564,146473,149176,151055,143930,148700,145542,144516,142560,140968,141908,156303,142265,137737,155633,147080,150094,146786,142694,147423,144017,141115,142246,144217,142731,142598,140102,143567,150647,149938,148621,139791,145125,149115,150958,145259,144608,148121,151311,139628,154630,147289,146730,154971,145504,145721,151739,154608,150588,142206,147504,144093,148470,149808,149773,148400,155460,147232,148160,146247,154726,143725,153728,150443,148144,145580,143072,153035,149267,150298,148426,155454,139721,146499,142841,154004,137871,137141,140364,151176,136948,148896,147232,147746,141797,151180,154382,144801,141079,146040,150923,146830,145438,145162,144154,141634,137436,148128,152852,143129,148601,145619,148418,147311,159311,141434,145422,149001,150840,148623,137859,141804,155230,139855,150776,143300,144043,148905,140155,147472,146883,144345,139419,148296,143903,140635,143555,153297,144990,143154,143752,149684,146026,143153,143437,147944,144561,159088,151186,146025,148462,148107,147227,143516,146388,146403,140971,145861,145984,141761,141527,143808,148299,151018,149567,150417,135714,148260,140532,145298,151768,144715,152453,141811,142410,152128,147018,143487,137267,149272,148441,151344,138913,145610,141438,146380,144889,151781,145556,152239,138917,148232,143450,139948,146854,149790,142460,142730,148556,154883,155754,154643,151962,150580,156886,142840,149090,148295,141276,148523,150690,136010,153133,152903,136066,147002,144579,143957,149470,144038,154842,146465,151556,143108,146302,145485,143172,145705,147183,144144,146321,151669,142154,148668,148220,149936,150917,148930,142741,141853,139959,141286,144067,150410,145465,144192,149589,153354,149331,153729,143290,148583,146208,148623,151640,148292,142012,149548,156277,150474,149077,145348,146264,145449,152903,148586,144345,149033,137923,143783,159343,140827,140291,154758,143089,144148,136822,148285,135841,149664,150891,145694,143628,148324,150909,144576,143419,148712,156750,148903,141846,153123,140097,150851,142895,145771,134508,150166,148217,150334,134480,141369,152300,150093,152454,145904,138610,146042,144391,146617,146447,144052,137902,152899,148055,139036,144524,142869,143330,147933,151633,148162,141195,153179,145780,148938,140981,143152,152052,150737,143786,145795,149785,152340,143322,141111,141374,133298,152005,143409]},{"counters":[146314,149581,159733,149845,142107,151218,144992,147371,143342,144003,147901,145251,144643,153139,147448,147541,147767,156609,151753,148128,148040,143649,148780,148715,150291,149152,146089,145173,142680,143265,153779,147695,136675,142018,138397,141687,137630,141940,149091,147310,149022,148411,144649,149980,141098,145322,141313,151436,151374,140082,145609,142023,150317,148182,148485,148177,150445,151555,151816,148604,143399,148362,147742,149077,153939,146666,150462,143721,145476,151848,138885,147280,140217,151230,139163,149713,136426,149813,137689,145629,143081,149630,143755,145707,148298,144926,150198,144909,144047,147323,143980,145529,141620,144382,143597,147400,152936,151571,143558,153862,146713,143751,147744,149757,151904,148010,149695,139863,150747,149110,145966,148047,142145,148326,144319,150967,149474,144394,151577,157820,142225,143583,149245,140825,146452,156888,150834,152066,145986,144090,155255,145383,144568,148955,147114,150314,146588,142527,142193,149964,136367,146386,149281,149421,150566,146089,149306,145729,143621,152760,151347,146203,144227,146271,139941,146081,148916,149806,143955,153834,150074,149377,148840,153926,146885,148062,144549,149703,139798,148324,149722,142883,147364,150205,147727,141912,147650,145281,139849,148458,148565,137726,143620,148820,152393,148254,149466,141290,147356,149434,147159,145491,148064,143760,142545,144791,147840,146925,148143,145172,152336,152405,144832,148775,140946,140340,141864,147679,138503,142618,138261,147077,150074,151351,143093,152195,146448,150126,150924,140392,150653,150341,137940,148477,149744,146213,138650,147889,145965,152744,145451,142766,134511,142644,147134,147416,149553,151884,141124,142247,142416,144567,148216,142292,149739,149633,150321,145536,149085,154495,146117,139913,135441,146381,136602,147914,145503,143662,141166,144234,153409,144239,145578,148649,148781,148122,152452,147104,140539,145790,140394,144267,149443,148114,148173,155638,145099,146416,145945,147723,151787,145027,142741,145264,148645,150047,143834,151557,146267,144221,146140,141935,143653,141206,146681,140272,146722,148986,144702,149988,150109,142884,150260,144831,154193,140685,138415,146899,142889,142871,152417,148069,141926,144673,152677,156483,148212,149378,141607,153034,146534,147988,144791,151693,151943,140610,146005,142424,154185,145752,155129,145024,146465,141616,146787,143381,149358,154249,149935,146665,159236,147531,152477,151241,150811,152943,145182,149044,140427,150560,149693,150246,153595,147740,138947,142971,158955,146286,138612,145960,151450,145220,152033,146180,143662,142871,151872,156344,142829,155073,158316,140721,145002,148670,144239,140071,150532,149624,145840,139999,140192,151836,153495,144040,149530,145229,150684,146448,142222,148851,150645,134669,142948,154877,152195,142516,142534,142193,148526,137393,143110,141790,148949,151879,152600,142572,147791,148518,144575,141137,141708,153141,156988,139959,134604,144505,151578,142842,144204,148329,146986,145186,144489,144930,146440,146885,144159,147512,141904,143686,141137,141811,151640,147088,152326,140562,143579,145955,150799,140419,152568,152632,152241,147596,152015,147365,143113,145360,145944,147974,145303,143589,140972,143665,147646,152465,138539,143079,149325,142131,149334,140379,140833,147955,152135,147604,158204,142478,153843,142500,147758,146178,145719,158828,135154,152927,144252,154203,145328,150679,143466,143514,146646,154926,148212,147388,144483,148815,150121,150631,148172,147442,145943,149610,141380,156391,139432,149304,149268,146927,139774,144362,158137,151380,144904,146780,145085,143781,138833,153531,147407,152647,149199,134376,145347,142014,140594,146033,139898,147126,134524,136627,140267,141952,145839,142576,146453,146736,144388,143612,144423,139370,149192,150736,150769,140355,144953,156869,139968,143384,147062,144647,144494,152858,148759,146830,139280,146284,142100,142883,145757,148153,153986,145980,146184,142510,148124,146159,143939,144757,151109,147546,150467,147605,149160,142707,148983,141522,139794,143764,155899,144964,148425,149386,150347,138925,138227,147537,145191,143607,146339,148755,140645,148092,152856,145040,147700,139936,145824,141580,145215,146465,145063,149677,140504,135605,155248,146524,145300,148398,145874,144125,150334,142558,150838,139871,145618,150518,146270,142979,149481,141829,153015,144937,146979,151625,145255,144996,143132,146707,146632,142735,145961,140852,151671,144501,149548,157335,147617,152337,147504,150169,155377,142281,143324,141981,145995,138747,140744,149517,145222,152349,146903,141834,156427,156254,145178,151436,141315,144386,145748,146765,149926,149077,144971,154931,142454,144911,142719,143567,154970,154684,137833,144230,145672,147380,146034,152829,149482,143798,153069,135196,138801,149375,152375,144636,148639,145155,148378,150460,135048,137997,154789,147545,141786,149711,137429,136870,151556,152628,145406,142783,154061,156388,142544,146379,140160,145151,142602,149746,143789,149838,145796,145341,144690,146537,154663,158877,140766,155218,145361,150720,142434,146941,141369,146492,141571,146648,144724,141261,143737,146209,146521,145159,146401,153528,155594,144049,139323,147674,145343,150355,154893,156998,144090,144169,141436,152027,136333,150601,156239,150031,145134,153158,150062,146572,141523,143252,147402,151276,147144,142071,150113,144900,151234,146924,151454,138733,149521,143945,146930,143960,151460,139833,136583,142958,150191,147767,148891,144385,151246,144223,153461,152112,146177,146602,153514,144387,148313,146268,141772,147819,153177,154048,158016,148106,152983,148100,158166,141594,150708,148569,147977,152499,140304,149776,146178,150012,142283,148363,144534,141066,154894,147369,148732,137249,139787,147884,149714,133805,153825,150674,150429,145246,154399,141987,136972,135671,144319,145687,144428,160468,143079,146653,151434,151614,149852,148105,150573,147245,150441,151312,148815,138655,145036,140905,144789,151441,143739,150413,143241,139019,155037,147137,142030,144335,146315,145446,151872,146612,135735,156335,149792,153295,141061,145745,145224,149570,148611,146485,145147,149266,143643,142639,146406,136688,146789,144920,140286,154418,139735,154673,149275,146021,145112,144475,151867,149604,149873,150162,143443,149684,143807,146527,140536,147164,134687,144466,146501,159578,135602,154555,152697,150606,147422,150218,151757,137785,144412,148402,144351,141643,142719,150577,143852,154420,147396,150837,144469,152370,144526,142206,149905,135494,140309,145297,131819,145221,139277,146227,141296,152077,147130,150568,144212,136132,139461,146967,156618,145621,147913,145481,143859,144173,141609,149426,152886,143252,141023,142368,143179,145937,140621,133410,141559,144088,152512,145905,139136,152469,143972,155006,143256,146294,139018,156939,142101,148452,143768,143168,154377,150721,141672,148220,149320,146316,143755,152110,150384,143844,137805,147382,149404,147914,144780,145174,145735,136474,152753,144926,152756,142060,145120,147557,140595,144252,146076,149367,141715,156665,148555,156658,148098,144195,142165,153612,145436,144194,144458,140069,147820,143194,143082,149314,141475,152575,146933,144146,142823,140223,147200,139768,138632,150220,143929,145330,145997,142670,145894,147416,151795,146351,145407,145206,143900,144673,146474,144880,140405,140405,150443,153490,146018,152757,150206,149063,145357,140192,149533,153225,144256,150788,136619,142900,149176,148274,144254,142526,143053,146011,149978,147262,142879,154239,145128,149232,140462,152099,146124,150348,149777,143091,158091,150084,142136,150872,144144,145163,145235,152754,145468,141798,144005,136005,147069,146735,143365,153496,147544,148416,147490,143168,151169,149855,147277,143000,141350,145503,135495,141707,145845,141531,154705,147025,146603,139394,142070,142053,151340,153404,145517,149955,149263,152791,149513,146227,145598,145173,145115,150812,153016,147584,148682,152432,147010,146198,140351,143558,143657,146193,144377,151336,159764,145812,150417,147069,149434,153350,147889,144539,150268,154686,146824,145049,145470,148072,142847,151807,145540,153145,154795,146380,162861,143269,150610,151809,134754,145772,135031,144698,143859,143600,148341,151322,143072,149292,141284,145882,144813,148316,147877,144031,151152,147087,147055,152467,151629,152854,149008,147624,150132,144197,148578,144308,143870,150527,137908,149891,150548,149202,153770,148009,141336,138673,149657,131831,148264,143947,147895,141999,154076,150719,142777,148281,148171,141619,152502,147724,149008,149254,143560,143884,142209,147232,152075,134333,143782,145318,150613,144710,150499,143613,151688,152768,148237,144275,144849,143581,146415,135650,148193,136086,148804,149430,145045,144537,146749,146295,152769,146007,151009,147976,148319,155426,141968,153984,143185,146520,146803,150643,141427,141517,146578,141984,145349,136636,138703,148591,144057,135719,144626,144554,145643,138680,137371,151389,140419,143132,148824,141957,155879,148224,147310,143774,149331,150363,146258,138351,139201,146419,146168,148716,142525,152454,139724,142190,146313,142782,144107,148024,137552,152826,144087,147237,142154,142131,146597,147919,141250,151175,152467,137112,147419,144550,147101,146630,143888,151495,146737,151552,144620,151710,142718,146546,147072,139169,138772,146763,151519,149908,155212,145235,144224,153596,148290,151101,153709,144770,144186,150596,147277,143447,147661,146717,139557,153790,147282,150233,148858,143346,149135,143033,146345,140819,144655,150486,142215,143977,143852,145809,150900,142433,143802,149278,152779,155441,150429,148781,146051,153463,149956,141518,141496,146390,146972,148287,152522,144694,144696,148847,145872,148016,137819,145557,147826,150629,147805,146774,150164,139324,148837,158657,143223,147217,150675,147982,139864,145643,141403,144098,148423,146002,138793,143788,146680,139746,150569,159236,141220,146818,147957,150320,148369,144373,146593,136647,148413,142566,149693,143124,146503,137554,149139,155310,150327,143300,145059,137565,151920,147298,146384,142549,139518,153739,146117,148644,151947,147709,154177,146080,147932,146836,151834,144871,138741,135402,148910,149304,140923,144620,153213,143606,148622,150222,138882,148569,149076,145845,147667,143707,153412,143737,135843,143985,142430,142598,150858,156423,139056,152824,151984,142558,147418,150150,146933,144649,154389,136482,140144,153284,145724,138701,145996,148760,141009,141995,141564,141310,146683,137184,144938,141489,144138,151628,149344,148170,147546,150357,150170,149524,151936,144351,143176,142147,136779,142857,148210,137487,146793,144660,148240,143744,148011,148162,143186,135513,147681,148692,145036,138565,143123,148727,146793,143914,145892,146683,139665,141127,145319,144979,144454,141557,152813,154785,150406,149634,160633,146698,152341,144001,149526,140739,146374,151672,136798,155094,142287,148630,146086,153979,145892,146335,144000,148186,151103,143091,141800,140278,138727,147846,149107,143802,145716,138372,139825,147627,138947,145743,143518,143990,150090,145987,144646,150517,141901,143326,140029,143992,146255,146936,149989,146598,149696,143147,151409,142536,142901,148420,155312,145919,146874,138624,148114,155979,140495,155107,152754,136876,147289,141741,140896,145331,144910,144650,143007,141903,144491,142537,154236,143760,151608,146822,150724,150997,148880,148968,139312,150495,143943,147304,142629,148436,140347,145124,148374,139837,142610,143046,138224,144289,145190,143909,145155,147142,148589,149423,148598,143450,157273,151963,143092,142084,147716,141449,143601,146347,143710,142264,141966,147657,150629,145367,143018,147144,156222,143072,147899,149384,153585,143643,138032,144237,153327,140060,136591,144705,151117,148705,154766,152380,141073,147443,144621,151156,147052,148125,144748,148574,140642,145714,153743,152368,149475,147862,144862,148201,143772,151867,147257,142839,140374,158341,148277,152282,156206,149056,142932,147057,144093,152638,141907,150677,146427,146184,144060,149481,147772,142632,144138,140126,144632,145187,149394,138447,147589,145605,143920,151495,151905,144429,146926,150499,150890,143759,144349,141344,151688,151648,143176,140334,157513,157805,151632,138528,150744,154331,148384,144661,144461,144723,151921,146981,148434,147500,149292,152013,146152,145571,145930,141035,148793,143627,142695,147123,145370,150870,135292,138769,140236,144643,145375,149480,144949,152908,154808,147837,150826,151283,149347,147219,142701,151601,151669,145479,149340,146417,142781,138179,148613,141558,149365,149870,146107,141462,148761,153122,149342,150262,143104,139795,141965,142987,152188,141134,146060,145927,144525,147451,147359,140744,141914,141545,144638,151343,153486,147550,151962,145160,143209,153738,153360,146314,150640,149139,147284,145092,147042,133895,158340,148321,143860,143046,141004,137816,148289,149855,143918,143770,146196,148950,142441,148068,140731,147498,150495,144943,145493,149497,150346,146627,147652,147690,145984,146519,149799,139937,151750,145866,146180,151761,145585,147783,141029,142347,149928,144584,156322,138601,149340,144678,139838,151830,140278,149530,143331,148607,144485,150492,150171,143964,144899,150792,141085,145806,140563,144411,147234,149231,146236,150596,150900,154879,148852,145372,143845,137643,151996,144226,141675,139155,140871,140263,137008,141391,143259,147816,146279,146820,153432,148596,151855,144538,153663,146330,147619,147493,153298,139165,151436,148503,144809,147699,153097,141682,140646,143742,138382,143072,149642,151531,135350,146222,148063,149399,149539,143472,141374,148532,146563,149592,151466,156947,144041,142343,144404,149876,150949,145416,156251,137846,154209,146027,152727,147983,147735,151254,147258,153779,145653,140722,148324,145966,147939,149136,151652,139231,149997,146026,145517,145532,144025,142346,153558,146449,147379,147080,144662,145452,135727,147953,147366,144759,139559,146727,143003,148602,151509,150107,144611,154313,148075,145980,143226,146577,142862,148473,144872,155520,147377,141018,148638,147463,140937,144903,146863,137396,147219,141274,150760,144861,149083,148155,141301,145090,150515,146983,151303,141780,154126,144092,147265,152528,146865,154741,149511,152908,144073,145516,155452,144349,146649,148636,150215,151323,138106,147027,142779,140441,143528,148273,142080,139972,150637,151541,147393,153315,141744,141404,147136,143716,150051,150180,142372,146254,147657,145359,145095,142468,143495,152356,144839,143808,145665,143498,144543,146427,141141,148436,160101,149427,135710,142436,140511,146813,142414,140082,144623,145274]},{"counters":[143255,145142,151857,157524,147003,152579,150413,148583,144973,146364,146510,137599,153825,138936,140458,140648,142345,147017,141359,144507,141235,149057,144542,142762,139509,159132,152871,144071,144729,141755,147072,154167,150861,140513,142267,144517,146641,144764,145850,138437,150927,141948,152391,149325,148538,143661,149748,150869,149032,138166,149558,136552,149321,142489,144026,154189,146149,144882,143837,154405,143485,152002,148537,144158,143679,146413,142891,148712,143221,150594,153162,136993,147509,145059,158841,145973,149854,155250,147315,150358,145191,146460,151555,141265,155621,146028,149520,144853,153784,134907,145420,143529,143009,147674,146901,145848,147732,146402,145539,147013,147411,147157,146484,143154,144451,147314,142662,140095,156076,143345,147192,144743,147300,140800,152946,156581,136735,142804,156358,143500,145850,150540,144853,142655,142035,146458,152322,141412,148725,146642,145666,147370,145497,143606,148316,146750,137055,147402,146302,149382,143607,142080,144966,138114,143241,151278,145965,143307,149199,142871,142589,142114,150135,140525,152028,151400,141216,147808,146805,154576,145177,144243,143745,147991,157927,142378,150360,140216,149375,142740,148411,144986,150063,143100,146557,146981,149638,148964,143993,144399,136718,147951,141831,149537,145876,144230,150969,156428,144763,143461,139770,150794,146964,152776,149603,146934,150971,141581,138403,144847,147360,147945,146385,134650,152720,144065,145032,144208,141032,156475,140744,149592,148154,138277,145435,152190,139828,141542,153436,141766,144689,143405,144963,146895,138760,157564,149218,128516,147248,150144,144523,134757,158922,148748,132679,142883,142893,141616,158576,144275,142261,147717,141204,151608,148876,148002,142139,145328,154641,148420,141750,146395,142056,145867,142284,143930,148940,150769,145143,143909,150139,145220,144620,144552,155293,158507,143222,152721,155338,147321,146222,146881,147411,143165,149776,149391,139250,146956,146163,143848,148367,146797,152509,154955,147811,150447,148745,143043,146418,150336,141452,147353,151487,143698,143278,136013,142428,141473,152798,151644,151287,140645,151443,146742,146126,148813,147783,147983,144813,146790,151331,148340,154726,143746,142693,147747,135662,150056,147559,147062,153286,146203,146474,149649,156494,149551,142910,143290,151311,143175,139041,139963,150607,147890,144786,147834,143507,145046,147956,151598,146803,150585,136572,148381,141631,145615,140400,145891,145359,146183,139698,144221,143055,154822,153527,150072,138540,142025,146165,146193,146353,147675,150281,147495,139388,141814,144199,142728,151858,141959,150377,150309,157368,141908,149989,152198,143208,159366,150159,147958,150370,149855,146946,142622,137245,143611,142888,145799,140380,145001,143596,152066,155200,151176,154356,146050,139579,147285,141849,143023,146611,150137,139367,143073,142162,142470,153527,146210,150429,147034,145552,145296,146779,149487,148906,148431,138295,146426,152389,148743,141697,142427,149749,145006,160873,144830,149739,153860,146459,146656,152612,148399,150446,140043,144856,150131,152539,147501,141932,140575,146845,138391,144424,140515,144418,149004,144441,144595,148536,139757,143263,147416,144970,143989,146866,142317,144903,152060,146584,136405,146317,142338,145364,149504,148274,144357,147840,135360,140596,147043,137562,153089,153111,145144,147148,151681,152813,143179,148394,135531,145674,145150,145723,155720,144616,144857,147866,152625,144049,146258,148341,146810,148616,136199,137761,146691,141833,136672,146915,144305,140548,151460,150084,148636,144815,139050,148600,146036,144981,145383,143123,153122,149599,138838,152586,149104,150853,149927,154024,145585,142678,146105,155870,152533,143538,137521,155798,150862,150230,144356,149903,148809,137866,140194,148064,143921,148064,151759,144466,145327,150152,144504,149912,147312,148793,143202,149414,151881,147674,150639,145832,145789,147672,148287,148014,147966,140024,153926,146207,146293,143151,138644,144400,145136,151038,147982,141766,151564,143878,142460,139891,147863,140675,158629,155924,148965,131610,145607,145478,144050,145356,143148,146661,148686,146709,144718,147675,146846,148434,146102,137906,148465,143814,142734,153283,142478,143935,161165,151247,136232,141390,154157,140751,144766,152189,155196,148972,145617,147772,137440,144769,144189,145791,142008,143458,142697,140533,150595,147168,138474,151590,148211,140299,148061,147877,145514,143586,151113,147855,149119,138652,133941,156153,144501,145375,138975,142761,149558,144655,148865,139937,139869,143490,156047,148669,153313,147126,146708,148469,150891,145200,145449,152250,157154,149141,148498,145325,143717,149583,146801,152346,137829,141387,148121,147814,150478,138580,145677,136448,145038,151660,146856,143932,144434,144938,144735,149091,142027,144033,143494,150937,143383,140645,148257,153063,151071,144267,139560,146325,152980,152057,140730,144502,148521,142487,150555,155221,151589,143452,152623,144234,154073,150798,149249,146032,150566,137870,144917,144056,152039,150242,155879,149120,151383,142028,152757,149620,153236,151452,142156,147070,144258,147246,153450,141918,148149,150951,144322,142777,136361,140663,141916,137509,150675,143736,139019,148342,149594,148304,150084,138712,146118,144441,147554,144131,150840,146704,139852,149254,148539,149352,144695,146274,149698,141864,141251,145115,150248,145917,138825,142762,157423,149588,144744,151642,138505,149561,143171,155426,144125,144412,147136,148640,147595,144337,141265,154990,146608,149588,140750,145307,149345,149720,145195,139649,146445,145435,146977,149018,145450,141927,144195,148377,151939,154696,139235,149914,153302,149829,149477,146231,151100,144311,145880,142444,144368,155476,144282,148318,141346,152838,147239,149662,153043,147508,138797,146838,151927,146133,146185,153209,139230,145955,144839,148579,149369,144206,154629,139816,142253,143126,149128,146795,148807,146869,141710,151485,155199,140940,148125,152039,147546,145349,153546,152999,145230,152631,152427,148506,147144,136713,140249,149606,147517,146451,147171,142477,143150,149495,147335,146975,143523,143314,147253,139160,144937,143228,148027,149483,141154,147216,146919,143571,146145,143499,141032,150557,146357,146808,148599,155274,138074,143746,144578,143504,146941,143568,141226,143366,143502,150918,144901,150637,150289,145912,148953,140749,139846,142898,145316,138140,135161,147994,149875,150746,148693,143193,148296,141416,145458,143193,158392,148228,149851,148104,149009,146508,140264,155622,148533,144376,149862,144764,142775,139580,144344,147649,145571,144634,145355,147655,138258,147834,154883,138620,139410,150197,154679,150990,151071,147980,145048,147900,139852,141444,144914,143062,151397,146727,152834,142743,144521,152171,147048,142475,145106,152295,139804,141559,148014,150988,139314,143294,147468,145765,143678,146010,141427,144353,145083,150182,145277,144043,151088,145338,152006,146066,156486,150035,146981,151334,146862,140111,149771,146564,139847,150910,144977,148089,148720,143145,151277,148197,153177,151819,143368,143024,162030,146858,155150,144527,148660,144850,151682,146953,146921,149935,151592,147629,144013,145425,142198,148953,154359,146098,140246,141909,152538,146326,149493,150058,151715,137639,145663,155698,148648,137277,148709,152796,150333,136913,150841,143084,145717,136044,147581,152388,141396,140245,137041,151249,141823,140646,150542,144805,143241,147749,144798,151124,145578,153179,148630,151260,151920,145531,145353,145773,133574,139307,146864,143844,143562,151523,137401,145906,146938,141277,148646,140908,145490,146767,155091,143737,141195,150072,140210,150038,146566,145027,149069,146563,137783,150700,154738,145335,146753,150199,148685,136734,143814,143248,144349,152595,145527,140289,140248,143672,143608,143435,137949,142994,138495,148621,141749,145334,138779,144399,157749,154207,151770,144686,146715,148718,155339,146268,146703,147448,150246,146189,140489,155791,141201,149905,140178,147399,146173,147871,143344,143269,148298,141167,144941,147959,150050,144451,148144,149984,150292,147570,140986,141491,147487,150218,152807,145466,153258,148194,145447,141924,145695,145400,143060,154208,139654,151400,145062,148355,142372,141129,143416,142424,144158,142690,141245,147736,141019,152027,149696,146050,148114,147507,147095,158757,150572,144483,135753,150257,149118,144209,141807,137928,155653,149032,154028,138885,139653,145279,148055,148304,148012,146720,142997,152875,148518,142251,143652,142387,149179,148764,139725,147037,137640,143387,159832,146845,145750,150499,146826,144306,155990,150171,139569,150479,141431,138326,142566,141598,137995,138519,150597,147394,143955,151928,146282,140260,146906,146510,151517,145498,144697,144395,155146,147533,146266,146209,144676,145366,145513,139186,151185,150817,143630,144078,148573,149112,145552,143088,149041,149681,154009,143205,148732,152263,153544,151577,144424,148440,149233,146135,144702,150649,143673,147123,154322,147368,143613,142157,140717,149585,137675,145171,140344,138789,143824,147813,140391,141806,144240,154386,139353,143989,142579,135522,144781,145628,143068,135953,154376,149571,158168,155180,142497,134742,140546,155335,148445,148124,141026,141748,144113,150098,149154,146885,148194,148994,147147,153380,152770,147556,142385,146322,138047,139723,151166,148938,145799,143081,140309,154436,145549,140716,145165,143892,145984,143048,147512,153670,150729,146246,152931,147984,155595,143323,151565,147249,155912,142848,141452,136615,146058,144844,141466,149073,141673,155382,147091,140561,138339,143758,150030,141367,137272,144621,149929,148280,146959,139044,141818,146834,141369,154125,152990,141830,149969,144581,152662,149145,145730,149356,151207,149270,143751,138636,145189,136429,149795,142276,159475,143492,139830,150755,153266,145209,135567,151719,137216,148876,149114,148676,153780,139413,155333,147102,135877,152993,147085,136963,155081,148595,142628,151035,137559,145636,146306,143652,143610,148109,147442,147019,146941,146465,141462,146885,138792,152382,148018,147105,145680,150288,147909,142435,147601,148533,141653,139587,149990,145845,147025,139887,149310,140564,148391,135921,148378,146072,148399,151135,149551,151467,146424,144101,148590,145328,143497,150744,150912,145302,146881,159173,149281,152329,146067,141611,142212,149283,146031,152266,141399,155107,136255,148985,151301,146033,146931,143122,147825,145172,146591,154096,138142,154584,151165,147431,137325,148881,148537,135916,147047,156410,158808,146843,152766,144138,142638,149478,150135,151242,146665,154392,145880,151426,150472,140014,143625,141584,146016,142439,147746,148671,143789,150352,146296,147627,161437,150388,143201,145067,148307,144726,143414,146356,147273,138545,138214,158713,138190,154986,138566,152888,147747,147954,140232,145028,141450,142594,147271,155095,135455,142792,148289,147996,143017,146161,146066,154736,147516,154482,142185,145472,146778,151294,153539,158565,141450,150942,145740,145487,149575,149062,142928,142919,142141,149739,141114,140708,150799,138636,142183,139559,147832,143889,159118,146220,144397,159553,146286,150035,141788,147186,147809,144825,152108,151035,145630,152468,147187,149984,149933,151821,140762,147965,150268,145885,138461,145956,152582,147548,143837,147717,150637,156119,145421,145825,143856,136077,143167,140635,149332,155218,140313,148319,150610,144136,158509,145889,147540,145313,143936,143114,142716,147909,145870,145987,138216,148909,155104,140642,150601,147239,150099,141298,149363,154677,140004,147829,146984,151325,154018,153971,146583,140948,153535,145315,146808,145241,146126,151008,155736,148000,149008,144896,141101,144380,148904,147240,147322,150550,157037,154623,151830,148613,142530,149490,140704,142728,144995,153383,151780,150548,146832,142650,148499,144046,147143,138786,148804,144438,156411,146907,150333,139543,151164,140964,150731,137349,151349,148076,143781,139638,144890,143659,149560,148322,155846,148143,150371,144980,148628,149405,151924,144538,137029,142134,146687,140434,149157,147015,145406,151380,142880,146488,146839,148730,145783,148372,151096,146163,156986,144143,146502,149647,150015,153234,137739,145777,155188,144146,148590,151694,150228,144677,142416,144096,139708,148225,146577,152262,154221,145247,147765,139038,145905,150204,143795,148394,150459,135982,145081,149317,155105,141190,149670,141467,149950,151562,149733,150915,143557,146843,147638,142221,140589,148317,139411,131641,148998,142252,139420,152301,148563,147744,150192,145871,149478,140336,146325,156255,144232,149328,151635,138806,149847,147069,142469,144209,141298,146064,148716,154204,141673,143527,151198,156577,146031,137672,139397,146570,149530,149284,138220,152322,145564,143698,157271,146164,147119,144015,151258,152774,139185,148873,144135,149239,147475,151512,143565,139099,150105,144284,141940,143246,138608,149392,140904,138506,146994,144949,138336,146797,141321,153499,141968,145863,145393,152351,149116,147776,149578,155993,147754,150127,141697,138197,140265,154236,138863,142788,148309,144959,141931,146472,141828,144859,148888,156122,146957,148443,135901,140864,141105,152428,151068,152450,140815,142520,148060,135593,150397,144824,139774,138554,145405,145314,149739,141208,140347,149100,145736,147990,139393,147740,147774,152702,149508,147104,148393,153254,143591,151000,146551,141888,145771,154595,153228,157477,142923,142025,151614,144739,136148,145237,148322,141880,151069,152180,144197,147292,139438,150976,146819,143007,152573,153859,147220,152363,154612,145498,151441,143672,150698,145740,143123,145627,140554,147068,146575,143251,149973,147272,147207,146951,147492,144975,147180,148838,142584,149086,144164,141020,140744,135538,139141,147526,152640,153669,151943,134347,146638,150741,140608,145951,150305,145559,150410,154067,146053,142175,143912,157617,153975,144049,135133,147199,154112,145275,144868,147320,147240,145429,150299,147885,146165,151484,141604,145401,148615,151122,152952,142584,149109,143234,145014,147358,150761,149989,142842,145261,146197,146231,140987,139287,155466,152619,142783,142701,140664,149792,140547,139046,154100,147348,154529,143389,151993,138857,140951,144570,152911,145615,147937,144329,141695,152756,143428,148835,144485,141338,151865,144330,150772,155056,143052,144858,146715,141433,143740,151077,154769,153874,140700,148206,146114,148412,153852,150872,150949,141377,144549,155294,146374,143286,151711,142165,140078,145904,139274,148439,146943,145820,154713,147812,151965,147733,150587,134537,152381,144305,144179]},{"counters":[142181,153147,137697,150245,142669,151186,149857,141808,145074,141357,142772,147294,146830,148183,145461,152537,145481,142873,148261,150459,151127,142847,152566,140507,142746,147411,148184,139504,145452,146115,136398,143736,154205,144051,144877,144714,145256,160339,143177,139406,153106,143389,148834,151491,144061,150908,150227,137141,140407,143872,154047,150920,143782,149991,148893,147253,151279,148703,145005,156573,146442,143572,146574,148796,148540,151097,142444,144455,149205,145406,148172,146027,136014,145862,150309,141489,147339,155535,147314,144080,153056,140117,141110,146284,138833,141735,139227,141717,147015,146076,144681,143043,157668,145113,156932,156684,145397,134367,153807,148883,145331,146697,147145,145773,141722,149810,145769,153671,150085,146104,139796,143824,152517,143985,151522,139221,146019,141933,156735,144467,149926,145608,138611,146092,144748,151660,147975,148520,144352,142888,147157,149157,145750,144923,149232,139214,143597,155676,148449,145753,152614,145648,151839,151004,150376,145636,149270,149834,147779,151209,143163,151573,144909,146782,146792,147957,146807,147592,145955,145012,137128,142546,149942,148399,159546,139659,141405,146976,145266,144940,150814,149325,144123,148247,143265,146464,146754,146164,157035,144611,153933,152042,150630,137293,139482,152702,146562,144673,147452,152274,148561,147401,141555,142719,149326,146332,141666,139509,145620,147217,148133,136923,147719,146390,148588,150301,145446,137034,142483,150512,140573,142024,146612,149125,147088,145915,138001,144718,149268,142974,157491,138549,152117,143115,151320,154031,140726,141414,150851,142867,142037,149782,156626,158015,141859,144950,151007,147427,149957,143548,148900,146629,145717,152841,145504,142962,143664,150007,143178,145856,148154,141545,151391,146291,149721,147211,152014,155650,144149,148622,147654,148403,156023,147521,146411,154516,154438,142898,133760,141952,151683,144969,137948,139088,146398,143802,139714,145520,146050,156368,152456,151523,149334,146246,143371,152769,140102,147920,145763,143492,157564,142678,148960,147722,147681,132007,150312,145532,155480,143938,145959,143048,149168,145036,152581,147866,145048,145624,150265,143730,144878,145878,146638,149907,145812,150249,146764,141529,151348,140806,141137,147879,141265,158226,139620,137668,150250,147198,154814,142559,154573,141378,147416,152157,145270,140371,142676,144485,144786,147168,140415,145991,152660,147160,151079,133382,143891,139578,144238,144240,134960,147412,141625,147808,150479,146026,139076,140207,142592,148090,149772,142662,147763,150369,138501,152694,150221,154074,141143,144734,138843,148996,136076,147611,149763,142421,148990,147732,136707,154377,148582,150286,145978,149530,147834,141301,148120,153528,137498,139882,140912,151536,144734,152089,150243,140256,149543,147736,149209,142953,147761,155878,147568,147732,146020,149625,144660,149592,151033,146526,144791,149338,157086,146984,141463,148501,153618,137381,144448,153095,154414,154678,147933,149835,141371,147943,144698,144854,147196,142266,144858,143966,140058,145006,139167,146681,155586,149810,148723,147876,148102,146804,141993,146175,142495,148136,143988,142202,146501,150919,154599,151139,137532,145457,147238,136621,134973,144675,153609,144884,144911,145316,153814,142696,146525,141001,153551,150491,142614,143547,146478,147342,138303,141794,143319,142513,149961,145465,148738,145126,149912,151617,151990,142686,140409,149111,140936,145321,143218,148445,147438,148107,146984,142400,148406,148535,148266,142711,149600,153146,141368,140631,152114,142355,143524,143562,142145,153416,148540,149707,154239,153829,142578,147389,150768,154234,146970,139699,147328,140698,149098,145133,140489,158081,142145,141257,149886,147617,148205,146936,147696,139719,149359,141174,144654,147115,152501,149274,146026,143262,149380,150576,143964,152684,142165,142482,143892,145374,139994,153644,154782,147165,144850,147815,144781,148670,143613,143611,151428,139800,150446,145179,144812,145494,143240,140498,145647,138864,143372,143299,150027,158142,145979,145052,155696,151391,145656,157753,154544,145414,153469,154700,139762,140744,146701,139972,149999,147430,139214,147058,145667,144560,149826,149269,149576,149437,146829,147477,143274,158169,145509,147738,146387,139092,155426,155671,146062,157042,151752,143234,144859,145707,141479,136836,151682,159555,150111,153862,150688,148737,145264,143716,141754,153602,141774,149182,137863,148963,147423,147002,149327,145556,145579,148455,143221,146954,149518,143141,149893,139897,139319,140177,147103,142961,143495,136770,151799,144397,137654,147470,149868,137757,156514,143276,141815,148014,136838,151782,133184,145901,151565,141201,142271,151858,152543,156343,147284,151181,152079,150259,146750,139253,147335,151384,143261,145507,137999,144850,149770,151557,145695,151472,137885,140025,144580,142454,147606,143239,158689,146608,140058,145250,147600,142023,139817,142370,144605,142663,146066,147769,150121,140827,146447,147336,144714,141435,146677,149415,144459,145378,145728,150581,138388,136442,145045,147781,149057,148629,146562,143622,148587,141738,145143,145385,152910,143611,147588,151243,144062,137904,152236,148087,148150,145676,148965,147264,142971,154007,149170,138814,136939,138086,139917,136137,138478,146595,148676,145554,148743,146831,147938,140394,145934,144900,147745,147355,143162,154993,153593,143508,142247,154601,142091,143509,149452,147740,138163,146218,144982,151984,149917,140115,153046,143294,141293,143224,151436,141136,149184,142721,143251,152216,152089,155082,148469,144281,150088,146055,148637,143801,142522,148992,146171,153148,149620,146437,140850,145666,147117,157890,149122,154222,142450,151151,150268,149714,150569,147465,144211,149637,140416,157147,145569,146332,138970,143820,143806,145168,144153,147486,148416,146263,142342,144111,156444,149445,147251,144970,147080,148708,142798,137942,139490,149735,141469,149962,139457,150402,149024,144764,143051,145540,146280,135524,149731,156948,156007,151393,148275,151474,141548,153114,151202,143353,144698,146049,150212,145360,150204,144639,145791,139619,148139,143480,152750,140522,144069,142949,138149,142884,151625,143842,147345,146302,150905,142411,145675,154861,155130,141921,147035,149241,144368,144139,140295,143290,151332,150791,142686,149667,158158,141424,152267,147783,155830,146660,156074,153340,144068,147213,150366,155606,149155,144593,141039,139659,148635,155515,137206,153118,150129,142477,141364,146499,146958,145839,142296,148980,144619,145578,139029,147701,139004,144918,152661,148823,152617,153152,141337,141257,147675,154615,146604,149896,147683,144940,140437,147147,143198,146155,146936,139850,149644,146579,144013,144013,139174,145166,151213,138759,142190,145824,153446,157250,136427,148042,145218,149199,147673,139729,150574,147487,151242,154582,147363,149758,143311,147166,140847,147304,144911,150441,152252,137385,141415,150639,142504,152912,138506,148400,143600,141372,155404,138815,140798,143420,149738,148979,150583,161082,142553,142691,144418,145637,145034,145759,137091,143910,148624,155511,145012,148622,151853,149525,149511,145687,140910,145047,139203,148118,145302,154084,151759,144562,142486,145601,140666,145619,141782,144314,140126,144422,148007,144326,148795,146304,142943,151871,142420,150243,148175,147398,154248,149735,148405,147057,156599,144619,139005,142331,150998,144357,153715,145539,149848,151331,140164,152745,143552,142471,150557,145616,145837,141278,151310,141237,149392,145490,151032,157684,149697,139364,149679,149241,138644,131184,151539,152984,144508,148597,147921,147929,150225,139802,152302,148784,147153,135279,150258,148133,145256,131305,145586,148379,144946,139211,140614,142392,150514,142948,143389,149141,150866,146919,142330,153085,147363,149464,144848,148627,141620,146124,147768,142592,152571,139320,146236,148621,147473,148928,146849,142512,148551,148664,144258,151964,147490,152221,140873,139205,147388,143023,154884,153155,154880,136961,143134,151381,145276,144137,142777,148450,141441,148401,149704,145406,148938,142196,144632,144300,154999,152063,148798,147210,147604,152962,152619,142362,152302,139397,144354,144315,145703,144883,137211,147415,138168,148832,140818,141673,150188,146572,147480,141499,141016,137789,146618,152001,141814,141182,148757,149877,135495,151255,150512,144879,144176,148228,146520,140417,147173,144373,148860,149490,144691,143177,147885,151774,149435,157297,143297,144407,150029,150787,148578,154316,142726,150870,144211,145035,146604,144357,145487,142625,143974,147430,157043,149333,149372,153599,148563,147987,147784,147295,147373,154803,141219,144380,141322,149477,150463,153065,150139,143900,151051,146352,138327,142093,153259,142951,142575,135817,143373,139498,144961,148485,152249,146437,150666,145590,145962,143034,142197,138440,140304,140062,148340,146935,138241,143392,155222,148975,148431,149025,148220,148594,147392,149523,145878,143167,148269,140208,153154,143593,150065,144720,138729,151485,141988,144140,146163,148426,149045,139163,150601,147243,145037,144212,142353,140664,145540,141484,143605,142785,150280,142807,151830,154666,148993,144101,144399,151326,148757,155177,144893,157380,146081,146033,141167,147705,154387,147892,144710,150385,145748,142960,147905,153205,143939,138456,142221,147308,144046,148555,138005,153603,146791,144637,148550,146341,138842,142098,144157,154496,152443,144477,162607,152714,145692,149860,146806,151516,148355,150184,146128,146921,151653,147018,143088,143551,146412,142589,143933,152372,146853,139293,146854,145278,148023,141304,144413,146868,148535,138292,144138,144472,146390,140317,146452,152517,145328,146248,143174,144314,138427,148401,147781,142153,140927,150692,140933,147515,151370,136002,145610,138097,144942,148308,154187,144056,144675,145552,143897,146007,135540,152195,146526,143546,143545,143461,153353,148907,149960,142534,140810,137413,153911,138219,150928,155118,146594,152424,149402,146488,154864,159793,141006,142134,145580,146834,140003,142961,151165,146586,149987,140292,156283,142895,145399,139066,150049,146463,144608,160950,147273,146743,133641,147170,143039,135861,147319,141298,150183,150105,141003,141518,139680,145456,142541,141301,149071,143259,152945,153349,140026,148977,145282,139749,138883,138457,144322,152290,143195,146631,143067,149472,145459,146462,136887,143053,140086,142233,147051,138137,143106,149207,137081,152327,154132,142452,145927,147611,149026,153384,141443,138039,142318,133618,139528,137949,150085,152087,144627,150479,142123,145568,145962,150582,152298,146636,149113,139928,140814,146720,152685,141868,147433,141645,146496,146447,140332,154139,143821,148038,152407,150457,142490,145806,148140,150391,149082,150516,153842,149259,144122,141069,144686,152380,152236,139275,144270,148364,148185,144570,145799,144884,136786,146885,144714,153342,148788,150168,139248,152650,140252,144249,150450,141697,146541,150247,137925,150561,152371,149959,132357,137243,146113,159718,151795,148188,148223,137299,144548,147523,141782,139595,147796,149259,145644,144319,139573,147194,142115,152246,142769,148144,140791,147185,149355,143587,149340,146232,147231,147936,152860,152866,155353,149883,136516,150662,140546,143720,153086,147819,149954,153799,143865,143897,153005,145981,143689,150128,144167,151893,143035,145803,145855,150701,145771,144101,152796,153701,147098,149092,138881,145390,144765,147869,141342,142157,150966,146057,141072,141682,144949,134924,151723,148528,142640,152182,152546,144776,150191,141140,147934,143466,144745,147263,146005,143257,149500,147853,148332,149083,152783,142910,154026,148661,142830,140567,140651,142837,144906,143012,145793,149781,141989,144391,147327,146854,145429,145895,142463,151995,151295,140499,145554,140468,150187,148981,152146,148257,144959,154245,148463,146188,146704,154000,148310,145749,142658,156050,156827,141492,156762,143708,148581,144681,145330,137069,140969,147250,144671,142990,162655,143854,149043,145054,152860,148194,141041,143556,147166,146869,147425,146802,150704,138631,151721,152553,136647,149160,147666,145986,146485,150751,145453,154859,143792,148804,148039,151421,149952,155816,146389,149732,148734,142264,157644,143521,141594,149946,154259,143679,147742,149541,149086,146778,158528,144584,149415,142489,141037,146327,142982,138455,143327,133568,141722,144221,147402,150687,148192,147249,147583,151212,148186,154489,145904,141024,151382,143492,142881,148066,157620,142211,141190,144554,141290,151635,142148,152534,130187,138831,141665,144398,141975,151875,140397,157939,146193,143705,146880,138736,152082,139899,143189,143667,148628,152827,141493,136833,145038,143977,144517,155833,154967,145426,149751,142158,144436,148963,149137,143248,143467,148259,140116,149634,146510,140571,140532,140943,140946,143149,150022,142121,149717,143063,155541,149049,135980,153802,146753,140597,146120,151472,145857,148059,145888,151644,136769,141205,141116,139599,139887,145592,153852,145526,138005,143991,151619,149604,152724,150716,150470,146963,138311,149917,141547,147626,140583,144572,148539,149609,137544,142633,142195,151521,146699,154775,143222,143151,149742,141574,147205,157792,151673,154669,148972,147121,141520,141619,149175,147635,144861,151908,139226,153857,140866,143389,145067,142029,145403,145316,150442,154004,145679,146976,146424,142937,147681,149443,155153,158321,148110,143383,140401,151579,157169,146840,151037,150207,153038,148720,141323,145014,143205,146575,150174,151926,142766,145629,147045,145758,147686,145929,148717,149190,148636,147854,145848,151566,155513,150435,149603,148962,144524,144617,144450,146647,140169,150626,152030,149633,149013,154791,149022,156442,143744,155378,150928,141258,147591,147080,147037,156377,146273,152170,143214,141091,138480,148108,145119,148468,141184,148394,141909,139893,146013,142694,139694,148517,153603,142573,152503,148991,147235,147003,142914,142796,144826,152903,138621,149705,151775,137738,141049,146759,142486,146753,153463,148701,150783,143289,149865,151046,150694,147888,152848,149527,147766,146620,148527,140431,149541,150615,146892,151398,132721,160228,143588,140571,156260,154480,147366,139066,152021,143305,140583,146479,143818,148330,144527,144440,150232,144443,140678,150222,149085,144097,149247,147116,144868,150281,148147,155443,141934,150484,140169,145865,151727,150146,141809,141383,149230,142841,140212,151649,150502,148766,146859,151416,142853,149016,142654,137411,148349,142124,153613,149809,143204,146657,152977,148217,151196,149230,143460,149128]}]},"null_count":0,"tot_col_size":2700052299,"last_update_version":401695339722833922},"l_linenumber":{"histogram":{"ndv":7,"buckets":[{"count":74191437,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":74190000},{"count":139052693,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":64860000},{"count":193953756,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":54900000},{"count":235564562,"lower_bound":"NA==","upper_bound":"NA==","repeats":41610000},{"count":268715204,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":33150000},{"count":288575589,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":19860000},{"count":300005811,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":11430000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64285367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42859108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32143644,0,0,0,0,21430210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10712841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53574641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21430210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64285367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32143644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53574641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10712841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42859108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42859108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32143644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64285367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10712841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21430210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53574641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32143644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64285367,0,0,0,0,21430210,0,0,0,0,0,0,0,0,0,0,0,10712841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53574641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42859108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,42859108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53574641,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10712841,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64285367,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21430210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32143644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":600011622,"last_update_version":401695339709726722},"l_linestatus":{"histogram":{"ndv":2,"buckets":[{"count":149552896,"lower_bound":"Rg==","upper_bound":"Rg==","repeats":149550000},{"count":300005811,"lower_bound":"Tw==","upper_bound":"Tw==","repeats":150450000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149985117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150020694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149985117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150020694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149985117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150020694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150020694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149985117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,149985117,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150020694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":900017433,"last_update_version":401695339762155524},"l_orderkey":{"histogram":{"ndv":74063872,"buckets":[{"count":1200023,"lower_bound":"MjE4MQ==","upper_bound":"NTc1MDc2","repeats":4},{"count":2400046,"lower_bound":"NjQ4OTY2","upper_bound":"MTgzNzM3Nw==","repeats":4},{"count":3600069,"lower_bound":"MTg0ODAwNA==","upper_bound":"Mjk4MzQyNQ==","repeats":4},{"count":4800092,"lower_bound":"MzA3MjI5NQ==","upper_bound":"NDI0OTAyNA==","repeats":4},{"count":6000116,"lower_bound":"NDI2NjUwMw==","upper_bound":"NTQ0OTg2MQ==","repeats":4},{"count":7200139,"lower_bound":"NTQ2NjE3OA==","upper_bound":"NjUxMDE4MA==","repeats":4},{"count":8400162,"lower_bound":"NjYzMDk1MA==","upper_bound":"Nzg4NzU5MQ==","repeats":4},{"count":9600185,"lower_bound":"Nzg5OTM2Nw==","upper_bound":"OTMyOTMxNQ==","repeats":4},{"count":10800209,"lower_bound":"OTMzMjk2MQ==","upper_bound":"MTA1MzgwMTk=","repeats":4},{"count":12000232,"lower_bound":"MTA2Mjk2OTg=","upper_bound":"MTIwNTUyNjg=","repeats":4},{"count":13200255,"lower_bound":"MTIxMTA5Nzk=","upper_bound":"MTMzNzE5Mzk=","repeats":4},{"count":14400278,"lower_bound":"MTMzOTUxMDY=","upper_bound":"MTQ4MjQwMzM=","repeats":4},{"count":15600302,"lower_bound":"MTQ4MjY4ODQ=","upper_bound":"MTU4MzE2ODE=","repeats":4},{"count":16800325,"lower_bound":"MTU4NDQ0MTk=","upper_bound":"MTY4NDQwOTg=","repeats":4},{"count":18000348,"lower_bound":"MTY4NjA4NzA=","upper_bound":"MTc3OTc2MDM=","repeats":4},{"count":19200371,"lower_bound":"MTc4MDk4NTc=","upper_bound":"MTg5OTk4Nzk=","repeats":4},{"count":20400395,"lower_bound":"MTkwMDAyNTk=","upper_bound":"MjAxMDU0MTQ=","repeats":4},{"count":21600418,"lower_bound":"MjAxMTU2MTY=","upper_bound":"MjE1ODcwNDY=","repeats":4},{"count":22800441,"lower_bound":"MjE2MjQ5MDI=","upper_bound":"MjMwNDg0ODc=","repeats":4},{"count":24000464,"lower_bound":"MjMwOTQwODI=","upper_bound":"MjQxNjQ2NzI=","repeats":4},{"count":25200488,"lower_bound":"MjQyMjczOTk=","upper_bound":"MjU1MTg0NzE=","repeats":4},{"count":26400511,"lower_bound":"MjU1MzQ5NDk=","upper_bound":"MjY2NTE2ODE=","repeats":4},{"count":27600534,"lower_bound":"MjY2NzgyNDE=","upper_bound":"MjgwMjE5MjQ=","repeats":4},{"count":28800557,"lower_bound":"MjgwMjQ4MDE=","upper_bound":"Mjg3OTEyMDc=","repeats":4},{"count":30000581,"lower_bound":"Mjg4ODgxOTQ=","upper_bound":"Mjk4MzE3MTU=","repeats":4},{"count":31200604,"lower_bound":"Mjk5MjM0NTg=","upper_bound":"MzExNjUwOTI=","repeats":4},{"count":32400627,"lower_bound":"MzExNzE5NDI=","upper_bound":"MzI2MjY0MDM=","repeats":4},{"count":33600650,"lower_bound":"MzI2NTM0NzM=","upper_bound":"MzM2Nzc1MDY=","repeats":4},{"count":34800674,"lower_bound":"MzM2OTcwNTg=","upper_bound":"MzQ2NzQ1OTg=","repeats":4},{"count":36000697,"lower_bound":"MzQ3MTM4MzE=","upper_bound":"MzU1MTI3NDE=","repeats":4},{"count":37200720,"lower_bound":"MzU1MjkyMTk=","upper_bound":"MzY2OTU3Nzk=","repeats":4},{"count":38400743,"lower_bound":"MzY3MDA1ODE=","upper_bound":"Mzc3NTY2MDg=","repeats":4},{"count":39600767,"lower_bound":"Mzc3ODcxNDI=","upper_bound":"Mzg3MjY5MTU=","repeats":4},{"count":40800790,"lower_bound":"Mzg3MzYzODQ=","upper_bound":"Mzk3NDA3NzM=","repeats":4},{"count":42000813,"lower_bound":"Mzk3NDk5MjQ=","upper_bound":"NDA5MzQ5ODE=","repeats":4},{"count":43200836,"lower_bound":"NDA5ODc0MjQ=","upper_bound":"NDIzNjMwNzc=","repeats":4},{"count":44400860,"lower_bound":"NDIzNjUzMTc=","upper_bound":"NDM0MDYzMDk=","repeats":4},{"count":45600883,"lower_bound":"NDM0MjE3NjI=","upper_bound":"NDUwMTU3MTk=","repeats":4},{"count":46800906,"lower_bound":"NDUwODQ0ODc=","upper_bound":"NDYxMDgzNTg=","repeats":4},{"count":48000929,"lower_bound":"NDYxNjYyNzQ=","upper_bound":"NDc0ODk1Mzc=","repeats":4},{"count":49200953,"lower_bound":"NDc1MTE5NDI=","upper_bound":"NDg3NTkyMDY=","repeats":4},{"count":50400976,"lower_bound":"NDg4MDcyMDU=","upper_bound":"NDk5MDE2OTc=","repeats":4},{"count":51600999,"lower_bound":"NDk5MTk1NTM=","upper_bound":"NTEwMjcxMzg=","repeats":4},{"count":52801022,"lower_bound":"NTEwNDY4ODM=","upper_bound":"NTIwNTk4Nzk=","repeats":4},{"count":54001045,"lower_bound":"NTIwOTU3Nzk=","upper_bound":"NTMxNTM2MDI=","repeats":4},{"count":55201069,"lower_bound":"NTMyMTc5ODc=","upper_bound":"NTQzOTA3NTQ=","repeats":4},{"count":56401092,"lower_bound":"NTQzOTExNjg=","upper_bound":"NTUzNDQ4OTk=","repeats":4},{"count":57601115,"lower_bound":"NTUzNDQ5Mjk=","upper_bound":"NTY3NTI5OTU=","repeats":4},{"count":58801138,"lower_bound":"NTY3Nzc2MDE=","upper_bound":"NTgwNDM0MjY=","repeats":4},{"count":60001162,"lower_bound":"NTgwNzI2NDI=","upper_bound":"NTkwOTM1NzI=","repeats":4},{"count":61201185,"lower_bound":"NTkwOTg1MzI=","upper_bound":"NjAwNTk4MTI=","repeats":4},{"count":62401208,"lower_bound":"NjAxNzg5NDk=","upper_bound":"NjEzMzYyNTg=","repeats":4},{"count":63601231,"lower_bound":"NjEzMzk0Mjc=","upper_bound":"NjIyMjIyNDE=","repeats":4},{"count":64801255,"lower_bound":"NjIyMzIxOTg=","upper_bound":"NjM3Mzc1MDY=","repeats":4},{"count":66001278,"lower_bound":"NjM3ODM3NDY=","upper_bound":"NjQ5NTk0NjI=","repeats":4},{"count":67201301,"lower_bound":"NjQ5NzkyMzY=","upper_bound":"NjYyNTEyMzc=","repeats":4},{"count":68401324,"lower_bound":"NjYyNjQ2NDc=","upper_bound":"Njc3NTQ0OTY=","repeats":4},{"count":69601348,"lower_bound":"Njc3NTQ5NTE=","upper_bound":"Njg3OTYyMjc=","repeats":4},{"count":70801371,"lower_bound":"Njg4MzI2Nzk=","upper_bound":"NzAwMDAzODc=","repeats":4},{"count":72001394,"lower_bound":"NzAwMTAyNzY=","upper_bound":"NzEwNjMxNjk=","repeats":4},{"count":73201417,"lower_bound":"NzExNjE5ODc=","upper_bound":"NzIxNDc4NzQ=","repeats":4},{"count":74401441,"lower_bound":"NzIzMjUyNTQ=","upper_bound":"NzM0NTY0ODQ=","repeats":4},{"count":75601464,"lower_bound":"NzM0NzQ2NjE=","upper_bound":"NzQ4MzM1MDY=","repeats":4},{"count":76801487,"lower_bound":"NzQ4OTM3Njc=","upper_bound":"NzU5NTAxMTM=","repeats":4},{"count":78001510,"lower_bound":"NzU5OTcyMTg=","upper_bound":"Nzc0NDc0OTI=","repeats":4},{"count":79201534,"lower_bound":"Nzc0ODQ0ODM=","upper_bound":"Nzg2NjMwNzg=","repeats":4},{"count":80401557,"lower_bound":"Nzg2ODQyNTk=","upper_bound":"ODAyNjMzMjk=","repeats":4},{"count":81601580,"lower_bound":"ODAzMDg3MDQ=","upper_bound":"ODE2NTUyMDE=","repeats":4},{"count":82801603,"lower_bound":"ODE2NjI3NTQ=","upper_bound":"ODI3MzQ3Mjc=","repeats":4},{"count":84001627,"lower_bound":"ODI3NTUyMDY=","upper_bound":"ODM5MjIzMDk=","repeats":4},{"count":85201650,"lower_bound":"ODM5NDM0OTI=","upper_bound":"ODUwOTM5ODQ=","repeats":4},{"count":86401673,"lower_bound":"ODUxMjM2NTM=","upper_bound":"ODY0MjM0ODg=","repeats":4},{"count":87601696,"lower_bound":"ODY0NTE1NTU=","upper_bound":"ODc2Mzg5NzY=","repeats":4},{"count":88801720,"lower_bound":"ODc2NTMxNTc=","upper_bound":"ODkyMDc0NjE=","repeats":4},{"count":90001743,"lower_bound":"ODkyNTI1MTY=","upper_bound":"OTAxMTc3Mjk=","repeats":4},{"count":91201766,"lower_bound":"OTAxMjcyMDY=","upper_bound":"OTEzMzIyOTM=","repeats":4},{"count":92401789,"lower_bound":"OTEzNTAyNzY=","upper_bound":"OTIzMjc2ODM=","repeats":4},{"count":93601813,"lower_bound":"OTIzNjA5MzM=","upper_bound":"OTM2NTc1NzI=","repeats":4},{"count":94801836,"lower_bound":"OTM2OTcwNTg=","upper_bound":"OTUwNjA3Mzc=","repeats":4},{"count":96001859,"lower_bound":"OTUwODQxMDI=","upper_bound":"OTYxMzQ0Mzg=","repeats":4},{"count":97201882,"lower_bound":"OTYxNDI2MjQ=","upper_bound":"OTcwNzM1Mzk=","repeats":4},{"count":98401906,"lower_bound":"OTcxMTczODA=","upper_bound":"OTg3OTI4Mzg=","repeats":4},{"count":99601929,"lower_bound":"OTg4MDQzNTQ=","upper_bound":"OTk5NzI0ODY=","repeats":4},{"count":100801952,"lower_bound":"MTAwMDE2MTk0","upper_bound":"MTAwOTM2NzA0","repeats":4},{"count":102001975,"lower_bound":"MTAwOTM5ODc2","upper_bound":"MTAyMjgwMjU5","repeats":4},{"count":103201998,"lower_bound":"MTAyMjk4MTc2","upper_bound":"MTAzNDEyMTM1","repeats":4},{"count":104402022,"lower_bound":"MTAzNDg3MzMw","upper_bound":"MTA0Nzg0MTAx","repeats":4},{"count":105602045,"lower_bound":"MTA0ODM2Njc4","upper_bound":"MTA2MTA2ODQ4","repeats":4},{"count":106802068,"lower_bound":"MTA2MTE2ODM1","upper_bound":"MTA3NjU1NjUy","repeats":4},{"count":108002091,"lower_bound":"MTA3NzI2NDMz","upper_bound":"MTA4NjU0NDM0","repeats":4},{"count":109202115,"lower_bound":"MTA4NjY2NzU1","upper_bound":"MTEwMTk3MjE4","repeats":4},{"count":110402138,"lower_bound":"MTEwMTk4NDA1","upper_bound":"MTExMjE0MDU1","repeats":4},{"count":111602161,"lower_bound":"MTExMjgxOTUz","upper_bound":"MTEyNDM2NDIz","repeats":4},{"count":112802184,"lower_bound":"MTEyNDM4NDAx","upper_bound":"MTEzNTQ4OTY1","repeats":4},{"count":114002208,"lower_bound":"MTEzNTcyNTgw","upper_bound":"MTE0OTU0NDcx","repeats":4},{"count":115202231,"lower_bound":"MTE0OTczODI1","upper_bound":"MTE2MDcyOTY3","repeats":4},{"count":116402254,"lower_bound":"MTE2MTAyODE4","upper_bound":"MTE3MTM3NjA2","repeats":4},{"count":117602277,"lower_bound":"MTE3MTYzNDI4","upper_bound":"MTE4NTMwNjMx","repeats":4},{"count":118802301,"lower_bound":"MTE4NTMwNjYy","upper_bound":"MTIwMDMzMTg3","repeats":4},{"count":120002324,"lower_bound":"MTIwMDQ0NTQ1","upper_bound":"MTIxMzc1MjA0","repeats":4},{"count":121202347,"lower_bound":"MTIxMzgyMzA4","upper_bound":"MTIyNzU3MjE2","repeats":4},{"count":122402370,"lower_bound":"MTIyNzY0NDg1","upper_bound":"MTIzNjkzNDEx","repeats":4},{"count":123602394,"lower_bound":"MTIzNzM3ODI2","upper_bound":"MTI0NzIxNzI4","repeats":4},{"count":124802417,"lower_bound":"MTI0NzQwMjI2","upper_bound":"MTI2MTExMzAy","repeats":4},{"count":126002440,"lower_bound":"MTI2MTU2MTMy","upper_bound":"MTI3MzkxNDYw","repeats":4},{"count":127202463,"lower_bound":"MTI3NDkwNjMw","upper_bound":"MTI4NjQxMTUy","repeats":4},{"count":128402487,"lower_bound":"MTI4Njc3OTU5","upper_bound":"MTI5ODg2OTQ5","repeats":4},{"count":129602510,"lower_bound":"MTI5OTE1OTM3","upper_bound":"MTMxNDE1NTU3","repeats":4},{"count":130802533,"lower_bound":"MTMxNDE3NDQy","upper_bound":"MTMyNjI5MTUz","repeats":4},{"count":132002556,"lower_bound":"MTMyNjY2MTE5","upper_bound":"MTMzNjc3Nzk0","repeats":4},{"count":133202580,"lower_bound":"MTMzNjg5MDU5","upper_bound":"MTM0Njk5OTcy","repeats":4},{"count":134402603,"lower_bound":"MTM0NzEyOTAy","upper_bound":"MTM1NjM0NTk4","repeats":4},{"count":135602626,"lower_bound":"MTM1NjUzMTg2","upper_bound":"MTM2OTQ4NTEy","repeats":4},{"count":136802649,"lower_bound":"MTM2OTYxNTM3","upper_bound":"MTM4Mjc4MTc5","repeats":4},{"count":138002673,"lower_bound":"MTM4MjgwMzIx","upper_bound":"MTM5NDYxMTI0","repeats":4},{"count":139202696,"lower_bound":"MTM5NDc0NzU1","upper_bound":"MTQwNDYzNTU1","repeats":4},{"count":140402719,"lower_bound":"MTQwNTE4NDY5","upper_bound":"MTQxNjA0NTUw","repeats":4},{"count":141602742,"lower_bound":"MTQxNjI3ODEz","upper_bound":"MTQyNTg1MDk0","repeats":4},{"count":142802766,"lower_bound":"MTQyNjA4ODM0","upper_bound":"MTQzNDA4NTgx","repeats":4},{"count":144002789,"lower_bound":"MTQzNDI4NzM3","upper_bound":"MTQ0NjA3Nzc3","repeats":4},{"count":145202812,"lower_bound":"MTQ0NjMwOTc3","upper_bound":"MTQ1OTY2MTEz","repeats":4},{"count":146402835,"lower_bound":"MTQ2MDEyMzI2","upper_bound":"MTQ3MTk0MTc3","repeats":4},{"count":147602859,"lower_bound":"MTQ3MjEwNjk0","upper_bound":"MTQ4MTY3MzMz","repeats":4},{"count":148802882,"lower_bound":"MTQ4MTk3NzYw","upper_bound":"MTQ5MTQ2NTYy","repeats":4},{"count":150002905,"lower_bound":"MTQ5MTU0NjU3","upper_bound":"MTUwMjE5OTA5","repeats":4},{"count":151202928,"lower_bound":"MTUwMjkyOTMx","upper_bound":"MTUxNTc2MTk5","repeats":4},{"count":152402951,"lower_bound":"MTUxNzUxNzQ0","upper_bound":"MTUzMTE3OTg4","repeats":4},{"count":153602975,"lower_bound":"MTUzMTMxNDg4","upper_bound":"MTU0MTMyODY0","repeats":4},{"count":154802998,"lower_bound":"MTU0MTg2ODUx","upper_bound":"MTU1MTg5MjU0","repeats":4},{"count":156003021,"lower_bound":"MTU1MTk2NTQ2","upper_bound":"MTU2MjkwNjU3","repeats":4},{"count":157203044,"lower_bound":"MTU2MzA5MjUx","upper_bound":"MTU3NDAxMjUx","repeats":4},{"count":158403068,"lower_bound":"MTU3NDA3ODQw","upper_bound":"MTU5MDk4NDY3","repeats":4},{"count":159603091,"lower_bound":"MTU5MTk1MDQ0","upper_bound":"MTYwNDkyMzIx","repeats":4},{"count":160803114,"lower_bound":"MTYwNTQzMzk0","upper_bound":"MTYxNDk0MTEz","repeats":4},{"count":162003137,"lower_bound":"MTYxNTAxNzkz","upper_bound":"MTYyNTA0MjYw","repeats":4},{"count":163203161,"lower_bound":"MTYyNTIxMzQ4","upper_bound":"MTYzMjU5MjAz","repeats":4},{"count":164403184,"lower_bound":"MTYzMzQ2NTM0","upper_bound":"MTY0Mzc3MDI0","repeats":4},{"count":165603207,"lower_bound":"MTY0NDIwOTI4","upper_bound":"MTY1MzEyMjMw","repeats":4},{"count":166803230,"lower_bound":"MTY1MzEzNDE1","upper_bound":"MTY2NDIxMTIy","repeats":4},{"count":168003254,"lower_bound":"MTY2NDg3NjUx","upper_bound":"MTY3NjUwNzIy","repeats":4},{"count":169203277,"lower_bound":"MTY3NjU5NjE2","upper_bound":"MTY4OTgyNDM2","repeats":4},{"count":170403300,"lower_bound":"MTY4OTkyNDgx","upper_bound":"MTcwNTk5MjMy","repeats":4},{"count":171603323,"lower_bound":"MTcwNjA3Nzgw","upper_bound":"MTcxODkyOTYz","repeats":4},{"count":172803347,"lower_bound":"MTcxOTA1Mjgz","upper_bound":"MTczMTQwNzA0","repeats":4},{"count":174003370,"lower_bound":"MTczMTYyMDIz","upper_bound":"MTc0NDUxOTcy","repeats":4},{"count":175203393,"lower_bound":"MTc0NDUyOTY3","upper_bound":"MTc1NTUxNDU4","repeats":4},{"count":176403416,"lower_bound":"MTc1NjA2NTk0","upper_bound":"MTc2ODgyMjQy","repeats":4},{"count":177603440,"lower_bound":"MTc2ODg0Mjky","upper_bound":"MTc3OTUxMDEw","repeats":4},{"count":178803463,"lower_bound":"MTc3OTc2NTQ0","upper_bound":"MTc4ODcwNTk1","repeats":4},{"count":180003486,"lower_bound":"MTc4OTEyODk5","upper_bound":"MTc5NzU2MDM5","repeats":4},{"count":181203509,"lower_bound":"MTc5NzU4Njkw","upper_bound":"MTgxMDg4NDgx","repeats":4},{"count":182403533,"lower_bound":"MTgxMTYwMTk5","upper_bound":"MTgyMjczMDYz","repeats":4},{"count":183603556,"lower_bound":"MTgyMjk3OTI1","upper_bound":"MTgzNjc5OTA4","repeats":4},{"count":184803579,"lower_bound":"MTgzNjg3NzEz","upper_bound":"MTg0ODkwNDAx","repeats":4},{"count":186003602,"lower_bound":"MTg0ODk1Mzky","upper_bound":"MTg2MzA0NzA3","repeats":4},{"count":187203626,"lower_bound":"MTg2MzEwODUy","upper_bound":"MTg3MTIwMDY3","repeats":4},{"count":188403649,"lower_bound":"MTg3MTM4Mzc0","upper_bound":"MTg4MjI4MTY2","repeats":4},{"count":189603672,"lower_bound":"MTg4MjQ1NDQz","upper_bound":"MTg5NDkyMzIy","repeats":4},{"count":190803695,"lower_bound":"MTg5NTU2MzU3","upper_bound":"MTkwNjIwMjk1","repeats":4},{"count":192003719,"lower_bound":"MTkwNjY5MjQ4","upper_bound":"MTkxNjE2OTk0","repeats":4},{"count":193203742,"lower_bound":"MTkxNjc5MzY3","upper_bound":"MTkyOTA1OTU4","repeats":4},{"count":194403765,"lower_bound":"MTkyOTgwMDM0","upper_bound":"MTk0MTk3NjY1","repeats":4},{"count":195603788,"lower_bound":"MTk0Mjc3NDQ0","upper_bound":"MTk1Nzc0Njky","repeats":4},{"count":196803812,"lower_bound":"MTk1Nzk3MjUx","upper_bound":"MTk3MzI0MjYx","repeats":4},{"count":198003835,"lower_bound":"MTk3MzMyMDAz","upper_bound":"MTk4NTQxODU5","repeats":4},{"count":199203858,"lower_bound":"MTk4NjAyNjk1","upper_bound":"MjAwMDM3MDYz","repeats":4},{"count":200403881,"lower_bound":"MjAwMTk4NTY3","upper_bound":"MjAxMzc2OTky","repeats":4},{"count":201603904,"lower_bound":"MjAxNDE5MTY5","upper_bound":"MjAyNTY4MDAz","repeats":4},{"count":202803928,"lower_bound":"MjAyNTg3ODc3","upper_bound":"MjAzNTI0OTk3","repeats":4},{"count":204003951,"lower_bound":"MjAzNTM4Nzg4","upper_bound":"MjA0NjMzNzY1","repeats":4},{"count":205203974,"lower_bound":"MjA0NjQyODg1","upper_bound":"MjA1ODQ1Mjg1","repeats":4},{"count":206403997,"lower_bound":"MjA1ODUxNzE2","upper_bound":"MjA2OTQ5NTA3","repeats":4},{"count":207604021,"lower_bound":"MjA2OTU2MDk4","upper_bound":"MjA4MzEzMTUz","repeats":4},{"count":208804044,"lower_bound":"MjA4MzIwNjc5","upper_bound":"MjA5NTMzMTU5","repeats":4},{"count":210004067,"lower_bound":"MjA5NTQzMDc4","upper_bound":"MjEwNjU4NDk4","repeats":4},{"count":211204090,"lower_bound":"MjEwNjgxMzQ3","upper_bound":"MjExNTk5NzQ1","repeats":4},{"count":212404114,"lower_bound":"MjExNjAzOTM3","upper_bound":"MjEyNjgwODAz","repeats":4},{"count":213604137,"lower_bound":"MjEyNjg5MDk1","upper_bound":"MjEzNTk5NzE2","repeats":4},{"count":214804160,"lower_bound":"MjEzNjEyNzQw","upper_bound":"MjE0OTU3NDQ1","repeats":4},{"count":216004183,"lower_bound":"MjE0OTk5MTY4","upper_bound":"MjE1OTU4OTc2","repeats":4},{"count":217204207,"lower_bound":"MjE1OTYzMzY0","upper_bound":"MjE3MDU5NTIz","repeats":4},{"count":218404230,"lower_bound":"MjE3MDY3OTA2","upper_bound":"MjE4MzA4NTE3","repeats":4},{"count":219604253,"lower_bound":"MjE4NDAxOTU1","upper_bound":"MjE5NTQ5MjE4","repeats":4},{"count":220804276,"lower_bound":"MjE5NTY2NjU3","upper_bound":"MjIwNDkyODA1","repeats":4},{"count":222004300,"lower_bound":"MjIwNTcyMjMx","upper_bound":"MjIxNzM5NDYz","repeats":4},{"count":223204323,"lower_bound":"MjIxNzkyOTYx","upper_bound":"MjIyODI1OTUy","repeats":4},{"count":224404346,"lower_bound":"MjIyODc4NjI1","upper_bound":"MjIzODQxMTg3","repeats":4},{"count":225604369,"lower_bound":"MjIzODUxMjA0","upper_bound":"MjI0OTQ2MDU0","repeats":4},{"count":226804393,"lower_bound":"MjI1MDgwODAy","upper_bound":"MjI2MjEwMTEz","repeats":4},{"count":228004416,"lower_bound":"MjI2MjQ3NjE4","upper_bound":"MjI3MTI3MzMy","repeats":4},{"count":229204439,"lower_bound":"MjI3MTU4OTE3","upper_bound":"MjI4NTE0MTE2","repeats":4},{"count":230404462,"lower_bound":"MjI4NTI5OTIx","upper_bound":"MjI5NzMyMzIx","repeats":4},{"count":231604486,"lower_bound":"MjI5NzM1MDc3","upper_bound":"MjMwODk3MzEy","repeats":4},{"count":232804509,"lower_bound":"MjMwOTYyNDA2","upper_bound":"MjMyMTEwMjQ1","repeats":4},{"count":234004532,"lower_bound":"MjMyMTE0OTgw","upper_bound":"MjMzMjg4Mjky","repeats":4},{"count":235204555,"lower_bound":"MjMzMzIwMjMw","upper_bound":"MjM0NTI5NzAy","repeats":4},{"count":236404579,"lower_bound":"MjM0NTUxNTU1","upper_bound":"MjM1OTE5MDA4","repeats":4},{"count":237604602,"lower_bound":"MjM1OTg0OTYy","upper_bound":"MjM3MDk4NzI2","repeats":4},{"count":238804625,"lower_bound":"MjM3MTE4NTMz","upper_bound":"MjM4NjQ2MzQx","repeats":4},{"count":240004648,"lower_bound":"MjM4NjY5NTcy","upper_bound":"MjM5OTQ3ODQw","repeats":4},{"count":241204672,"lower_bound":"MjQwMDEwNTY1","upper_bound":"MjQxMzQwNzQx","repeats":4},{"count":242404695,"lower_bound":"MjQxNTE1NDk0","upper_bound":"MjQyNjM1MDEy","repeats":4},{"count":243604718,"lower_bound":"MjQyNjQ2MDg0","upper_bound":"MjQzOTI4NjE0","repeats":4},{"count":244804741,"lower_bound":"MjQzOTU3Njk4","upper_bound":"MjQ1MjE5NTg3","repeats":4},{"count":246004765,"lower_bound":"MjQ1MjIxMDYz","upper_bound":"MjQ2Mzg4MjMx","repeats":4},{"count":247204788,"lower_bound":"MjQ2NDA3MDc2","upper_bound":"MjQ3NjY0NjQy","repeats":4},{"count":248404811,"lower_bound":"MjQ3NzA0ODM3","upper_bound":"MjQ4ODU1NTU0","repeats":4},{"count":249604834,"lower_bound":"MjQ4OTU1NzE2","upper_bound":"MjUwMTk4Nzkx","repeats":4},{"count":250804857,"lower_bound":"MjUwMjEzNTc1","upper_bound":"MjUxMjQ1MjE4","repeats":4},{"count":252004881,"lower_bound":"MjUxMjUyOTM0","upper_bound":"MjUyMzc2MTY2","repeats":4},{"count":253204904,"lower_bound":"MjUyNDcwNjI1","upper_bound":"MjUzOTAxNjM0","repeats":4},{"count":254404927,"lower_bound":"MjUzOTEyMDM5","upper_bound":"MjU0ODYxMDI0","repeats":4},{"count":255604950,"lower_bound":"MjU0ODkyOTAz","upper_bound":"MjU2MjA0NDUy","repeats":4},{"count":256804974,"lower_bound":"MjU2MjA3ODE1","upper_bound":"MjU3NDg0OTM1","repeats":4},{"count":258004997,"lower_bound":"MjU3NDg5MzE3","upper_bound":"MjU4NzQ5NDA4","repeats":4},{"count":259205020,"lower_bound":"MjU4ODA2ODg1","upper_bound":"MjU5Nzk0MTE4","repeats":4},{"count":260405043,"lower_bound":"MjU5ODIxNjAx","upper_bound":"MjYxMDI5MDI1","repeats":4},{"count":261605067,"lower_bound":"MjYxMDgyMjc0","upper_bound":"MjYyMDc1NTU2","repeats":4},{"count":262805090,"lower_bound":"MjYyMDc3MTI3","upper_bound":"MjYzNDA1NDQ1","repeats":4},{"count":264005113,"lower_bound":"MjYzNDUxMjM3","upper_bound":"MjY0NDUwNzg1","repeats":4},{"count":265205136,"lower_bound":"MjY0NTQ2NTYz","upper_bound":"MjY1NDgxMjg0","repeats":4},{"count":266405160,"lower_bound":"MjY1NDgyNTYy","upper_bound":"MjY3MTAzOTcx","repeats":4},{"count":267605183,"lower_bound":"MjY3MTI0NzQy","upper_bound":"MjY4MTc2ODY0","repeats":4},{"count":268805206,"lower_bound":"MjY4MjI1OTg1","upper_bound":"MjY5MTkxMzY1","repeats":4},{"count":270005229,"lower_bound":"MjY5MjEyOTM1","upper_bound":"MjcwMzQ3NDky","repeats":4},{"count":271205253,"lower_bound":"MjcwMzUwMTQ0","upper_bound":"MjcxNDc0ODE3","repeats":4},{"count":272405276,"lower_bound":"MjcxNTQ2NjI0","upper_bound":"MjcyNTI3MTQz","repeats":4},{"count":273605299,"lower_bound":"MjcyNTMzMTI0","upper_bound":"MjczODM3Mjgw","repeats":4},{"count":274805322,"lower_bound":"MjczODQ3NDky","upper_bound":"Mjc0ODYwNDIz","repeats":4},{"count":276005346,"lower_bound":"Mjc0ODc1NTg0","upper_bound":"Mjc2MTIwMDA1","repeats":4},{"count":277205369,"lower_bound":"Mjc2MTYxNzI5","upper_bound":"Mjc3MzA1MTIx","repeats":4},{"count":278405392,"lower_bound":"Mjc3MzMzMjUw","upper_bound":"Mjc4MzAxMjIy","repeats":4},{"count":279605415,"lower_bound":"Mjc4MzYyNzU1","upper_bound":"Mjc5OTE2NTQ3","repeats":4},{"count":280805439,"lower_bound":"MjgwMDk2OTMx","upper_bound":"MjgwOTM2ODMz","repeats":4},{"count":282005462,"lower_bound":"MjgwOTU3NjM0","upper_bound":"MjgyMDU2NzQy","repeats":4},{"count":283205485,"lower_bound":"MjgyMDk1NDI4","upper_bound":"MjgzMzAzNDI0","repeats":4},{"count":284405508,"lower_bound":"MjgzMzE2NzA3","upper_bound":"Mjg0NzM3Mjg1","repeats":4},{"count":285605532,"lower_bound":"Mjg0NzM5MjA1","upper_bound":"Mjg1Nzk5Nzgw","repeats":4},{"count":286805555,"lower_bound":"Mjg1ODY2MDg1","upper_bound":"Mjg2ODI2NDk4","repeats":4},{"count":288005578,"lower_bound":"Mjg2ODQxNDQ0","upper_bound":"Mjg4MjY2NDM4","repeats":4},{"count":289205601,"lower_bound":"Mjg4MzMzODI4","upper_bound":"Mjg5NTk0ODg0","repeats":4},{"count":290405625,"lower_bound":"Mjg5NjI4OTAx","upper_bound":"MjkwODE0NDAw","repeats":4},{"count":291605648,"lower_bound":"MjkwODU2ODA0","upper_bound":"MjkyMTUyMDAx","repeats":4},{"count":292805671,"lower_bound":"MjkyMTU5NDk1","upper_bound":"MjkzMjgwMDAz","repeats":4},{"count":294005694,"lower_bound":"MjkzMzA3NDYw","upper_bound":"Mjk0NzQ5NjM4","repeats":4},{"count":295205718,"lower_bound":"Mjk0Nzk0ODUw","upper_bound":"Mjk1ODE2NTQ5","repeats":4},{"count":296405741,"lower_bound":"Mjk1ODMzMzE4","upper_bound":"Mjk3MDIwNTc4","repeats":4},{"count":297605764,"lower_bound":"Mjk3MDIxNzk2","upper_bound":"Mjk3OTczNDcy","repeats":4},{"count":298805787,"lower_bound":"Mjk3OTc0MTc2","upper_bound":"Mjk4Nzk2NTQ4","repeats":4},{"count":300005811,"lower_bound":"Mjk4Nzk2NzQx","upper_bound":"Mjk5OTgxMjUy","repeats":4}]},"cm_sketch":{"rows":[{"counters":[145538,146845,146353,146379,146627,146384,147260,147531,147493,146166,146814,148346,146322,146565,146224,146757,146265,145637,147099,146421,147550,146461,144168,146259,145990,146780,145567,145414,147393,146522,147068,146636,146283,146251,145629,148391,145710,146090,145936,147260,148382,146079,146118,145093,147486,146736,146806,145497,146638,144516,145777,146251,145621,146813,147272,146111,145883,145123,146554,147528,145092,146987,146918,145559,146301,147483,145872,146484,146700,145052,146027,147125,146224,147169,146499,145709,147005,145645,147300,146379,146201,145901,146035,146629,147279,146476,145494,147590,145697,146806,146255,145129,146951,144795,147233,146503,146269,147894,147968,147975,145628,147275,146922,146304,146701,144734,146757,147767,146785,146253,145255,146386,147107,145419,146216,146587,147572,146365,146128,148107,147382,147029,143824,145983,147190,145587,148570,145735,146654,146062,146776,146651,145381,146694,146962,145196,146898,145768,147383,146443,148146,148149,146007,146706,145533,147925,146549,146739,145863,147089,146509,146701,145874,147538,147021,146210,147111,145340,149281,147097,146923,146450,147054,145746,144980,146237,146584,145569,148051,146583,144334,146144,146236,145131,146944,145854,146659,146868,147428,144982,145888,146704,146389,146655,144003,145838,146231,144857,146731,146303,145902,145300,147360,146141,146870,145440,145617,148509,148084,145609,146191,146168,145847,146551,146829,147465,146371,146692,146703,146001,147257,145787,147101,145890,145911,146612,146388,146642,147408,146182,145476,147217,145913,145600,147422,147712,147089,147281,145474,146642,145750,147213,145464,147353,145830,145763,146391,147211,147031,146424,147795,146027,146900,146309,146827,145932,145702,146515,147031,146299,145954,146507,146891,147594,146989,146217,146248,147043,145731,146742,146670,146108,146930,146571,146033,145744,144953,144398,145401,147352,144977,145665,145603,146936,144590,146684,146355,144886,146690,145478,144951,148191,146119,147366,146918,146873,145864,145970,146456,145795,146619,145995,146006,146567,146247,147940,147266,146913,145733,147516,145817,147915,147630,147525,146814,146190,147160,146292,146378,145861,147865,146707,145802,147417,146596,146273,147256,145952,146773,147396,145964,146254,146228,146322,146223,146612,148217,147455,146782,146918,146670,146646,147201,146117,145801,146232,146914,144612,147656,146836,145351,146655,146259,147549,146662,146228,144952,146903,146493,144708,145896,146928,145777,148216,147425,146501,147415,147173,147000,146557,146947,148524,145833,145015,145021,147074,146961,146589,146723,146701,146774,146845,144765,146422,145933,146080,146989,147327,147432,146393,146519,146484,145684,145827,147003,145992,146551,146987,145691,145795,147005,147180,146653,145916,146487,145851,147436,146844,144676,145768,147354,145116,147810,146771,147494,146686,147122,146633,145985,146633,146808,146678,147512,146038,145799,145951,146178,145515,146919,145495,146338,145205,146115,147141,145730,146856,146717,145631,146449,148750,146865,146011,145839,146691,145971,146556,146879,146441,145326,145860,146466,145860,147536,145650,147477,147134,146851,147592,146682,146239,145400,146676,146780,145997,146403,145265,146938,145732,146635,146173,147377,146382,145945,145782,145040,146108,146551,146315,146977,147984,147673,146309,147155,146222,146808,147783,147293,145485,148271,146564,145636,145875,146798,146738,146824,147195,146248,146529,146277,147081,146871,147392,147824,147232,146817,146434,147430,145960,146855,146200,148000,146697,145975,148310,145761,145719,146197,146829,146994,145057,147492,146698,146514,147354,147047,147436,146162,147011,146692,145129,147725,146010,147099,146884,144410,146062,144530,146165,145627,145376,146616,146132,145913,146434,147137,147960,145487,145053,146531,146840,146850,146568,146205,148008,144772,146534,146061,148038,146449,146781,146917,147122,146343,144855,146800,147552,146622,145123,147740,145824,147621,146228,144943,145799,145977,145894,146145,147098,145058,147417,147130,145456,147120,146880,145715,145852,144881,148003,147383,147207,146749,146649,146942,146894,145631,146100,146909,147514,146483,146034,146987,146385,146831,145596,146412,145864,145796,146064,146031,147357,146783,148310,147545,147868,145622,145113,146962,147234,145815,145578,145825,145544,146259,147461,146436,147160,147065,147340,146225,146087,145469,146562,146525,146750,145562,148619,146063,146006,146907,145776,146230,145504,146424,145515,147093,146964,144836,146936,147611,146531,146525,146611,145417,146122,147635,146536,145979,147816,145825,145645,146510,148338,147171,146173,146475,146754,146044,147537,146738,146281,147019,146756,145648,146776,145574,146027,145562,147677,147758,147253,145967,146478,147892,146032,147054,145436,147169,146418,145597,145766,146609,144871,146381,145833,145762,145950,146584,145723,147150,146621,147022,145339,146162,146204,146199,146175,146572,146990,147269,146658,146398,145316,147730,145865,146271,145921,146878,145577,146659,147316,147756,146199,145786,146184,144811,146062,147357,145604,147801,145853,145561,147032,143889,145487,146013,145069,146815,146136,147742,147040,146677,147153,145474,147670,145109,145773,146991,146184,146473,147406,145385,146636,148007,146419,147650,146485,147639,147272,145980,147692,145962,146902,146842,147276,147097,145602,147226,145615,144893,147532,147235,146486,147947,147003,146751,146001,147404,147683,147959,146289,146145,145719,147646,146216,146241,146233,147338,147109,146600,145082,147846,145454,145199,146485,147609,145391,147122,147261,146752,147258,145786,147189,148298,145242,146805,146574,146034,146835,146799,147897,147606,146055,147636,144873,146586,146957,144465,146013,147511,147402,146093,147548,147006,145994,147166,146777,145204,146452,146161,146350,145064,146736,147401,146498,145368,145908,146815,147667,148220,145201,147446,147957,145952,146566,146410,148153,147579,146788,147531,145964,145612,147109,146799,146667,144396,146344,145397,146165,145831,145805,145861,146543,145901,148822,145939,146936,146594,146100,146344,145580,147333,147009,146813,146808,145692,147070,145323,147807,146948,148234,147686,145782,146977,148012,145832,146025,146571,146914,147804,147932,145351,146605,145967,147193,146548,147810,146351,145903,144645,147240,146563,144934,145587,144939,146519,147148,146328,146766,146682,147659,145763,146579,147947,145824,145234,147036,147217,146721,147474,146284,146544,146021,146151,145351,145763,147405,146144,145779,147441,147008,147308,145021,146355,146845,145865,144394,145952,146537,148266,146727,147143,145796,147071,146998,146790,148381,145805,146115,147542,147270,147796,145804,146173,146653,147822,145892,145726,145395,147668,146676,147291,147952,146982,146563,145669,147400,145464,146739,144904,147060,147199,145843,146247,147197,145938,144796,145772,145601,146070,148742,145873,146714,145373,146848,145940,146489,146089,146459,147824,146422,147631,147137,145322,146852,146107,148349,146095,145955,147713,148192,147282,146669,145909,147848,147852,148258,144857,145485,145154,146224,146940,145028,146084,145968,144845,144594,145526,145527,147861,147136,144142,145974,145986,148094,146412,145610,146929,146170,146296,146061,146509,146133,145741,147619,146623,147848,148471,146603,146711,145689,145908,147330,145459,145162,146035,147924,147070,145809,145364,146984,147039,145433,146685,146323,146068,146760,147387,147293,146962,144677,147018,146320,146875,147306,146843,145614,145330,145869,147818,145583,147006,147501,145838,147825,146415,146723,146655,147047,146521,146235,147838,146560,147277,147184,146723,144846,145644,149498,147408,145804,145149,145991,146713,145926,146638,146787,145947,147252,145991,147694,144910,148374,147779,146091,145986,148112,146378,146266,146433,145343,146080,144874,146841,147581,145564,145472,147147,145692,146438,146339,147764,146691,147132,146275,145297,147575,147783,143868,146440,148129,148716,145678,147132,146022,146030,146670,147869,147243,146026,145916,146343,146125,146989,146412,146197,146986,145758,146428,147708,145922,145728,147051,145194,146807,145862,146170,148038,146983,146826,144829,147501,147048,147116,147913,147178,145431,147088,145610,147492,147484,146308,146170,147081,146813,148006,146150,146238,144701,145673,145153,144942,146755,146410,146850,147227,148636,146707,145710,147057,146331,146840,145070,146102,146982,146822,146821,147141,146410,145896,144684,146259,147087,147602,148170,147794,145854,146470,145302,145812,145688,145803,145290,146426,147306,147279,147056,147527,145821,147837,147475,146711,147389,147353,147803,146695,146481,147254,147903,146257,147316,147607,146351,146375,145981,145803,145667,147429,144815,146099,146146,146116,144090,145841,145622,145697,146494,146213,147090,148643,146161,145261,146210,146325,145447,146673,145866,146687,144856,146467,146357,145818,145577,146255,147269,145387,147111,146212,147132,145743,145739,146808,146040,145516,146203,146875,146407,146254,144824,147560,146283,146637,145460,144116,145668,145848,147044,145591,146786,146629,147837,144748,146068,146738,144927,146408,147697,147361,146801,146361,147022,145628,148327,146003,145387,146063,146373,145446,146815,146252,145361,148033,145776,145911,145038,147062,146446,146812,144716,145182,147132,145352,148444,147091,146507,146170,147275,147377,146458,147434,146129,146199,145974,145976,146219,144897,144890,146494,145456,146818,143985,145637,146525,146887,146796,144455,146997,146838,145021,146564,146971,146178,146601,145744,145775,146334,146282,146822,144739,146232,144881,147976,146431,146051,145998,145954,147646,147449,146825,146512,146188,147664,145292,146419,146497,146019,146755,148191,146639,146355,146074,146494,146414,146347,148453,146406,148516,148010,147451,147363,148135,146555,145766,146405,145696,148279,145796,146517,147031,147151,147289,146978,145379,146679,144892,145060,145594,147051,146301,146541,145341,147632,145106,147370,145209,147805,146667,147186,145047,146413,147091,145369,146325,147076,146761,148052,145690,147569,146076,148345,148411,146463,147568,146682,146697,146399,145739,146287,146128,147259,147467,145572,146084,145753,146775,146228,146166,146623,146888,146890,145371,145752,146089,145632,145406,146490,146965,146363,145706,145406,147335,146536,146857,145770,146818,147141,147083,146823,147147,147503,145108,146555,147903,145747,146030,145864,146138,145644,146417,148213,146190,146659,146179,146032,146083,147567,145767,145915,147472,145209,146190,147105,146252,146212,147329,146858,146896,147519,147734,146253,146434,145847,146072,147780,148146,146052,148264,146873,147646,145372,146500,145017,145700,145004,145585,145377,148793,147049,146482,146605,147306,146746,146024,145940,147447,146327,147180,146884,146461,146604,145871,145636,147025,147154,146671,145251,145721,145928,146797,149200,146106,147173,146799,145711,145475,146782,146135,146697,147508,147718,146989,145317,147131,147202,146912,145041,147929,147393,146155,146075,146422,146433,145347,146953,146126,146231,146815,144971,148082,145441,147803,145965,148576,146668,145376,147490,147631,146031,146770,147127,145264,146377,145482,146801,146343,149004,146606,147022,145619,145693,147089,147497,146427,146165,146285,145658,145248,146043,146780,146851,148482,148439,146948,145971,144945,146644,146491,147251,146081,146107,146286,147240,146751,146323,146440,146902,147465,144795,146029,146821,148260,147699,145923,145965,147509,145873,146658,145546,146900,146593,146928,147365,145919,145970,146057,147112,146437,144484,148135,147881,148078,147399,146009,146701,147534,146762,147490,147545,146719,146340,147627,145985,146778,146664,145631,145758,145521,145256,145059,146125,146621,147102,148547,146520,145403,146091,144871,145628,145728,144301,146250,145951,147027,147108,145437,146584,145968,147770,146425,145995,146960,147112,146459,146967,146133,146338,146694,146946,146087,146834,146424,147385,145686,146642,147144,146183,146834,146384,146041,146904,146136,146099,144602,145887,148091,146213,147152,146426,145876,145874,146697,146660,145445,146877,146930,146919,146216,146096,145399,147158,147291,147092,146210,146031,147769,145889,147201,147430,147271,146301,145979,145262,146604,145675,146949,145534,145704,145799,146968,146641,145655,147186,146419,148474,145644,145910,145504,146925,145749,147348,146367,146363,145775,147580,147391,145806,146675,145889,148214,147836,146257,145487,146852,147312,146245,145687,148322,145224,146736,146093,145567,145052,146040,146209,145167,148498,148097,144985,146184,146686,147250,146147,146273,146134,146570,145976,146030,145746,146492,144600,146735,146606,146509,146453,147161,147508,145504,145257,147197,146701,144647,145218,147427,145611,146957,146228,146259,147089,147660,146798,146032,146285,147155,147304,148234,145513,145905,144426,145369,148780,147777,146902,145797,145743,145274,146396,147626,147828,146241,146496,145024,145042,144881,146706,146295,146917,144834,144783,144981,147130,146581,145878,147563,146329,146800,146544,146757,146271,146415,145298,148762,145779,147368,145557,146139,146589,147275,147589,146383,146719,145536,145832,145987,145700,146751,144961,146054,146053,147762,146750,148149,145773,146416,146091,146350,147114,146445,146291,146852,146944,145589,147190,145869,147674,146898,147030,146881,146425,145189,145593,146531,147786,146359,145368,146549,146666,145698,146020,145633,147580,146658,146895,146506,147177,146419,147334,145251,146392,147779,147247,147245,145995,146787,147268,146243,147547,146926,146738,146664,145337,145759,145374,145654,146737,146584,146550,148085,146659,147756,145936,146787,146614,146450,146425,147178,145757,146377,147333,145027,146623,146240,146177,147191,145459,146739,146541,146994,147037,147618,146921,145358,147537,147443,144936,147308,144858,146657,146275,146473,147850,145201,146858,145573,146023,147038,148516,145418,147182,147227,146124,145226,145941,146841,147025,146551,146873,147825,146612,145998,145195,148061,146039,147573,146005,145840,147131,145750,146680,145450,147063,146720,146432,145799,148282,146597,147038,146355,146057,146616,146831,146623,146448,146743,145649,146417,145996,147750,147376,147325,145641,145270,147051,147438,146272,145481,146432,145097,146901,146966,146094,145444,146403,144017,147246,147055,146980,146606,147420,148399,146352,146204,145991,147145,145895,146485,146271,147584,146414,145438,145188,146044,145962,146495,146064,146098,147798,144785,146780,144819,146359,146878,146353,147047,145493,147211,146398,145732,144609,145419]},{"counters":[145750,146087,146542,145545,146676,148003,146283,146122,147400,146614,145726,145687,145701,147906,147763,146403,147529,146204,145795,147383,146668,146642,146628,145661,146553,147064,146651,146973,147047,145541,146543,146734,146573,144753,147269,146805,146660,147101,146461,147804,147722,146970,146431,147049,145711,146652,146811,147617,147061,145889,145833,146506,146152,145914,147810,146691,146030,146616,145758,146424,145104,145930,145841,145013,148313,146161,146210,147083,146039,144877,147146,146441,145528,146335,146856,145083,148028,146501,147842,146015,145004,147262,147035,146801,146725,145469,146040,146710,148127,145417,146768,147046,146058,145565,145987,146398,147176,145927,146340,147182,146947,147425,147443,147532,147673,147536,145293,145905,146099,147144,147709,146347,145273,146620,146052,147104,146188,145391,146483,145953,148203,145460,147936,145509,146821,147628,148032,146565,146883,147619,146055,147259,146780,147202,146388,146153,146859,144878,144672,146765,145804,145112,147458,144999,145123,145545,146966,147121,146674,147707,146829,146744,146006,145741,145374,145849,147662,145906,146802,146637,147633,146128,145040,146520,145911,147489,145921,146109,145917,146232,145807,146219,144476,146346,145993,146527,146909,146021,146216,145718,147032,146104,144739,147234,146917,147158,146849,147690,145735,146429,146038,147935,147361,146303,145086,146272,146641,146558,146160,145088,146722,147406,145827,146163,146347,148010,146649,145527,146616,147931,146011,147267,146787,146443,146267,147032,148024,147946,146652,147841,147635,146265,147490,146666,147280,145613,145639,148086,146914,146178,145835,147015,146643,146655,145102,146314,146235,147527,145947,146112,145803,146606,146000,146301,145790,145713,147011,146069,146773,147270,148059,146189,146035,145571,147403,146876,145596,148170,145086,145516,145577,146224,146547,145065,145814,146804,145685,145315,147964,147345,147343,145293,147573,145428,145852,146463,146066,145724,145908,145697,146354,145799,145609,148396,144995,146144,146548,146935,146760,147139,144934,145629,146678,147733,146610,146415,146769,145568,144664,147690,145383,146557,146184,146306,146608,147323,144254,147337,145996,146228,145931,146018,146020,146188,146426,147546,147020,146912,147325,145576,145714,147556,146031,145822,147092,145604,147302,147828,146273,144738,146244,145716,146452,146278,146879,145939,146295,145400,147448,147713,146033,146175,146114,146507,146525,146050,145478,147120,146151,145519,146046,146771,145550,147565,146857,145898,146104,146415,146378,147452,147226,146258,146492,147319,146517,146142,146500,147779,147532,146563,145377,147233,147198,147822,146226,148326,145941,147016,146527,145968,145763,146446,147728,147347,145291,145889,145194,147059,146265,147012,145493,145740,145228,147600,147275,146682,145402,146272,145764,145754,146832,146400,146278,145393,144800,145467,146004,145021,146566,146976,147286,145464,146003,146033,147211,145550,147254,147508,147578,146623,145863,146103,146155,145553,146270,146729,146701,146444,146109,145851,145801,146372,146760,146740,146625,146008,146654,145847,147700,145707,146896,145014,146967,145392,147961,146835,146017,146579,146643,145229,146585,146717,145621,148101,147022,145914,146835,145037,146340,146021,145387,146551,146344,145839,146636,146693,148078,146551,146389,146456,147210,146949,147322,147095,145519,146064,145606,145361,146465,145479,145853,147426,146615,145882,146370,147412,146321,146256,146589,145157,145366,146731,147591,146612,145478,146323,146887,146950,146011,146480,146299,146190,147166,146358,147577,147753,146435,144924,145520,145690,146321,148214,146103,145875,147488,145308,146514,145848,145055,148072,146672,146859,148220,146706,146343,148165,146186,147495,147137,146947,146953,146332,147543,146777,148328,144949,146260,145532,147923,146840,147575,145800,147471,147334,145673,146010,145162,144743,147614,145323,145121,148854,146610,147071,147348,147838,145621,145802,146485,147250,146180,146561,146142,146371,145888,145220,147570,147228,146249,146706,146433,145735,146334,146473,147608,146451,145616,146220,146418,144669,146436,145257,145903,144770,146301,146866,145374,147041,147083,146414,146614,145373,146417,145302,147218,148528,146845,144413,147201,147087,147771,146234,146945,147214,147113,146713,145248,148397,145045,147132,146601,147356,147280,145993,146888,147362,145825,146703,145450,146665,147894,147238,145877,147695,145301,147932,145639,147085,147492,146448,146896,145596,146249,145698,146641,145700,145974,146503,147833,148078,148070,148262,146219,146384,146855,145863,147552,147186,146412,145866,146822,146324,146170,146670,147627,147068,145639,146904,145739,145034,145618,147485,147670,146702,145769,147751,147493,146609,146926,147504,146429,146235,146087,146569,146417,146000,144670,146911,145459,147396,146644,145608,147237,147394,148486,145815,146039,145732,147827,147769,146135,146630,147040,145073,145125,147850,146741,145750,144628,147027,147753,145471,147791,145716,148046,147334,146965,148789,146454,146640,146152,145044,148804,145805,146205,146037,146276,146528,147224,147440,146121,145585,145641,146668,146532,146201,146106,147384,147076,148111,145780,145858,146792,148108,146358,147765,144978,144824,144841,145527,147210,144627,147316,146532,146550,145785,144397,146887,147496,148617,146226,145871,146323,146854,146383,146635,147592,146918,148421,146831,146178,145956,145359,146743,145495,146854,145524,147338,146700,146494,146386,147665,145112,147688,146126,146595,144393,144233,146711,145374,147343,147391,146796,146690,148433,144760,148009,145669,145981,147178,147157,147382,146472,145966,145544,146407,147394,148416,147297,146319,146271,147569,144277,146255,145940,146582,146054,146373,146508,144607,146124,146708,146434,146746,145575,146322,145374,147123,147865,147110,147679,146826,146316,146425,145619,145817,148025,144933,145347,145856,146077,145282,148407,147595,146567,146560,148040,146744,146795,147133,148441,146617,146088,146868,146620,145963,146533,147065,144993,147791,144084,145484,146370,146178,145951,145886,146876,146055,145069,146460,147866,146530,146712,147354,145788,146181,146601,145785,147229,145793,146520,144862,147732,146060,147652,145374,147474,146472,147071,147198,146896,144225,146232,147960,145524,146404,147735,145943,146536,146899,146173,146341,144990,147425,147217,146128,147265,146582,146916,147585,147521,145724,146270,145931,147567,146250,146901,145662,146662,145839,146817,145772,146470,147609,145968,145925,146376,146321,146620,147367,146386,145607,147310,145583,145856,145946,146873,146901,144986,146825,147151,146410,146805,146285,146265,148700,146627,147047,146622,145870,147865,146996,144817,146486,145219,146370,146502,147563,149280,145478,147180,146548,145922,148688,146570,146869,145370,146418,145758,147080,146954,147695,146988,146128,145504,145609,146813,145952,146291,146176,146186,147054,145376,146539,147344,146289,146750,146372,146911,146753,145991,146272,146326,146284,146276,146626,146305,145787,147860,146373,145356,146557,146380,145553,146959,145314,146493,145844,145816,148422,146640,146694,145858,146626,146999,145666,146054,146424,147615,148232,145495,145290,146952,146177,147516,146185,145361,146286,146337,146527,144481,147326,145887,147302,146476,146806,146184,144909,145020,146536,147899,145710,146776,146791,146001,146888,147597,146631,147366,145742,146082,145618,147663,143815,147019,146252,146689,146874,146941,146429,146252,145859,147419,146368,145661,145759,146513,144835,144952,146311,144680,146125,146141,146000,148411,145895,146882,145525,146802,146927,147653,145650,146705,146560,148472,146669,146200,145971,146317,145670,144713,145834,147357,146764,146284,146350,147113,147032,145930,146492,145289,146553,146166,145872,146286,145818,146301,146096,146926,147601,146188,146149,145577,145675,147029,146768,145924,145544,146872,146913,145801,145643,144819,145651,145936,146935,144775,147428,146691,147726,144154,147407,147498,145908,146104,146760,147623,146803,146673,145924,146701,147680,145410,146039,146489,146858,147823,146995,145885,146424,146365,146387,145956,145602,147846,146592,146610,147760,146283,147807,146974,146499,147502,147357,148744,145768,147198,146708,146266,145803,144681,146065,146465,147653,145805,146192,144460,146321,147322,146723,146711,146176,146368,146568,145879,147558,146858,146041,146832,145861,148817,146334,146398,148110,146651,145388,146275,146065,146556,147308,144852,146669,145939,146630,146534,146204,146700,146577,145215,146472,145413,147848,146546,146040,147299,147610,145847,146235,147422,146717,147588,147415,145971,146460,146101,146755,146569,146630,147498,145668,145262,148074,146273,146329,146720,147306,146902,146687,146272,147104,146210,144737,148153,148841,148963,145644,145672,147562,147778,146630,146311,146631,145989,146219,147296,145653,146233,146144,146482,145902,144947,146650,147350,144980,144131,147256,145333,145598,147006,148174,146938,146270,146976,147334,146238,145419,147310,145986,144811,146652,147081,147035,147414,147010,147028,147180,148184,145222,146935,145831,147617,147440,146295,145424,146296,145764,144832,147691,146824,145415,145674,147021,145798,144549,146981,147089,146623,146443,147291,146106,145907,145696,145735,146662,146758,146759,146204,145691,147034,147503,145660,146903,148428,146955,146213,145966,145796,147191,145589,146686,145425,146430,146785,145595,146979,147262,146774,144773,146458,146686,145303,147603,147477,146023,146041,146825,146372,145545,147044,146004,145610,147357,145332,145723,145714,146907,146309,147116,146394,146991,148197,147075,145351,144830,146281,146698,146919,147329,145746,144894,147106,145115,147018,145526,145916,145909,145946,147048,147132,146790,147027,146733,147277,145154,147043,147654,145853,146533,146730,145981,147102,146757,145555,146615,147390,145722,145502,146305,147654,146782,147389,147511,146339,146343,145975,145642,147517,145727,146557,145526,146547,146238,148118,146719,147651,145798,146412,147310,145485,146942,146830,145183,146899,146548,145801,146241,145904,148038,144732,145113,144446,147215,147003,146400,146960,146847,146264,145839,147038,145064,145587,146722,145655,147341,145553,145648,146963,147077,147044,146464,146311,146263,145596,145869,147445,146076,145862,144976,146066,146666,146267,146420,146428,146081,147528,145424,147695,146199,146332,145818,146269,146330,144646,146803,145638,145695,146663,146257,147535,147199,147983,145366,146350,145659,146433,147641,146278,147326,147952,147313,146592,146284,145536,146030,147423,144954,145780,145839,145381,145715,149234,147550,145777,145824,145684,145326,146643,146437,144855,146435,145443,147139,147222,146065,146138,145934,145425,147465,146886,145666,145257,145644,146715,146250,146274,147164,147448,147432,146715,146780,146908,147083,145113,147141,146928,145963,147381,146613,147417,147145,145460,146044,146703,146178,147199,147434,145726,145982,147044,146071,147542,147869,146445,145134,147222,147898,146286,146815,145634,146707,147397,146254,146937,145315,145830,147295,147248,146861,146181,144988,146684,147302,147146,146385,146442,147423,146269,146645,147174,147356,147809,146901,145584,146640,145445,145246,147904,145583,145390,145703,145791,145219,146066,146547,145778,145258,147344,145619,146901,146398,146630,146213,145927,147393,146118,147015,146321,146851,145370,146859,146587,147812,146477,146324,147113,145839,147477,146923,146244,146833,146554,147085,145458,145849,146078,145288,146114,146954,146119,146442,147383,146836,147189,145872,147469,146894,147489,144604,146887,149104,147037,146819,145848,147453,147514,145924,146369,147913,147041,147266,146308,147221,146065,146756,146339,146199,146986,147106,144978,147063,145820,147610,145548,146883,147032,146935,147367,143538,148519,147384,146954,146338,146152,146696,145776,147031,145433,145840,145491,146464,146326,146542,146478,145942,147544,146773,149170,146379,147560,146968,146786,145904,146727,146250,145706,147186,145886,147175,145787,148503,146842,146896,146292,145500,145209,146186,145483,147405,147799,145048,148074,147424,146578,145826,147759,147863,146277,145822,147305,147120,146679,147209,146533,147456,147588,146687,146567,146078,145528,146755,147037,146826,145040,147542,147127,145574,147169,146662,146610,149183,145872,146440,145046,145901,146196,147382,146803,146049,146614,145878,146107,146577,148011,146228,146051,146976,145510,145080,146795,146381,146965,146389,146922,147700,146464,147357,146487,146821,148250,148457,145783,146960,148064,146481,147661,144165,145285,147544,145543,146876,146398,144880,146406,147962,146667,146217,146627,147486,146711,146577,145781,146606,145895,146931,146348,147017,146943,145764,146980,145438,147464,146325,145377,146917,146455,146789,146102,146320,147366,146133,146593,146636,147652,147380,146765,149142,146087,145545,146975,147146,146022,146137,147666,145839,146918,145717,147636,144662,147166,145965,145231,146455,147472,146052,146752,146531,146717,146402,145248,146940,147159,146945,143498,146414,145313,147619,146996,147282,146586,146366,146668,147301,148432,147204,148045,146157,145921,147042,146243,146609,145833,145707,145682,146902,146632,146021,144302,145926,146675,145253,146081,147063,147279,147528,146572,146378,146432,147528,144940,146296,146458,146054,147789,146837,146504,147003,146758,147154,146027,147809,146802,146157,147135,147439,145465,147998,147713,146256,146221,146562,147987,146661,146864,145524,147120,147725,146811,146261,148270,146649,146990,147089,145540,146710,146657,146835,146506,147682,145569,146510,145297,146556,145918,147381,146118,148801,144978,146456,145455,146344,146126,146679,146910,148051,145746,146488,146031,146310,145473,145980,146846,145318,147770,146572,145758,146476,146448,146475,145305,145773,145248,145433,146575,145454,145900,146906,146488,147395,145959,146479,146683,145148,146571,145285,147391,147039,146370,145863,147265,147008,145581,146624,146936,146879,147211,146520,148109,146681,146463,146309,146984,146892,147137,145259,143566,145556,145231,146115,143807,146492,146645,146685,146881,146200,145554,147462,145847,145742,147132,146948,145515,146712,144596,146248,144292,147286,146138,145499,145672,146994,146413,147367,146810,147485,145849,145513,146965,146130,148013,145355,146016,147205,146347,145891,146605,146536,147547,147126,146130,145826,145762,147882,146578,148078,145292,146380,145144,147991,147265,147265,145382,146213,148403,146933,145563,146870,146851,147086,146820,147269,145349,146667,146185,145754,145571,147472,146762,146945]},{"counters":[149570,146680,146962,147399,146949,145362,146454,147407,146569,145903,144576,147162,145675,145981,146458,145602,145927,147097,145161,147498,146926,145237,146395,146364,146681,145346,145877,147473,146869,147618,146267,146757,146553,146595,147563,145630,146532,147088,145661,146397,144007,146293,148609,145805,146110,147384,146925,147269,146324,145013,146955,147202,145525,145611,147131,145513,146518,146318,146183,146025,144397,146292,148105,146176,145797,148222,146285,147129,145978,147527,145316,146163,145815,145527,147761,146938,146690,147164,145899,147659,146302,145266,146587,147544,145896,147413,146232,147472,145364,146021,147675,146732,147172,147666,145956,146533,146965,146617,145338,145753,146436,147576,146454,147990,146930,146801,147483,147440,146856,145209,145443,146435,145813,147206,147327,146459,146785,147890,144922,147866,145669,147291,146931,147289,147424,145552,147144,145714,145908,146945,146076,146146,146147,146838,146867,145926,146036,146292,145258,145647,146906,146231,148331,147392,146848,147183,145857,147421,146289,146128,147966,146596,146320,145152,146830,146969,146375,146933,146085,146648,145837,145740,146478,147324,145993,145838,147898,144719,145498,146358,147371,146999,146586,146002,146530,146836,147441,145434,146913,146852,147226,145816,146595,146980,147163,147391,147058,145900,146311,145514,145348,146394,147260,145556,145382,146971,146862,145771,145596,146948,146002,147256,146086,146653,146161,146393,146303,146712,146321,147191,146584,145263,146125,147529,146997,146692,148080,146554,146426,145546,145353,147211,146712,146822,145403,147229,146961,147060,146453,146138,145727,143797,147002,146142,145402,145713,145965,146797,146771,147228,145519,145560,145397,147582,147242,145496,146444,145593,146726,145418,145111,146071,147347,147675,146578,146498,145993,147722,145595,147544,147080,146072,146654,147035,145469,145617,146020,145928,146915,145816,147692,146249,145804,147814,146084,145967,146521,146718,145192,147789,146362,146792,145384,146906,144699,146825,146857,148920,148653,146582,147290,147175,147649,145924,144822,146960,147273,145975,146251,146443,147145,145743,145633,146545,146930,145949,146917,147104,145386,146680,146711,147409,147222,146665,144921,145160,146601,144738,147562,145896,145710,146039,145204,147176,147937,145254,146049,146776,147334,146566,147161,146364,148074,146951,146644,145798,145490,145964,146192,147260,146170,146460,146776,146242,147758,145430,145781,144895,145408,145579,145297,147028,147066,146508,145901,146650,146772,147307,146570,146043,145343,147316,145876,146169,146497,147314,146175,146335,145985,146899,146591,146635,148068,144857,147117,146529,146486,146829,144674,144953,146291,146838,146612,145683,146423,146457,145759,147793,146261,145395,147185,146346,145954,147489,145183,145442,146726,145179,146449,147677,146730,146127,146168,146794,146245,145513,146150,147077,145803,145687,145987,146420,145712,146741,146772,147006,146316,147758,147714,147230,146827,146284,146166,146566,145602,148709,148349,145724,145193,145799,146055,145872,146619,147551,145438,146792,147236,146107,146439,147209,145656,146578,146016,145921,145667,145789,147842,146243,148693,145167,145350,148171,146417,147056,146320,145899,146129,146526,146031,147348,145241,145867,147142,147195,146349,148010,146807,146416,146086,147874,146391,146744,146670,145602,146561,146051,147109,147840,145168,145491,147567,147795,144777,148558,146660,148270,147580,146310,147055,145380,148938,145965,147590,147726,146807,145839,146040,146492,145560,146525,148207,144026,146594,146197,146449,146705,147405,147112,147041,145957,145784,145897,146199,146500,148068,146230,144612,145933,145766,145637,147838,146574,147813,146262,144025,144801,146302,146994,146929,146176,147668,147937,146744,147564,146437,146709,146749,147273,146934,144718,145891,148127,144725,145719,145817,145512,146681,146599,145553,147536,146898,146261,147438,146918,147252,146048,147517,146520,146936,146433,147725,145757,145722,146802,145626,146117,147083,146654,147259,146751,145952,145568,145916,147269,146869,147450,147637,147878,147117,147581,145839,145346,148624,147330,147154,148499,145889,147243,147432,147391,146507,145973,147273,146687,145685,146227,145346,146261,146306,147053,146865,146940,146800,147679,145835,146209,147325,146125,147574,145102,145354,146777,147170,146123,146422,146750,146231,145765,145468,146411,147219,146547,146731,146039,145881,145654,146646,145736,145906,145930,145477,146553,146813,146157,146262,147056,147105,146326,147164,146865,145625,146649,146628,146229,147380,146468,146718,146450,147618,146769,145683,145848,147027,146349,146046,145191,146666,146665,146575,148748,147756,146230,146106,146546,146530,146519,146095,145711,146460,147906,146014,148202,146606,146965,145633,146893,147139,147685,146189,146607,145698,146903,145662,146203,147210,146963,146189,145918,145647,147144,146078,145813,146676,146206,146252,146130,146102,146649,147378,146448,145050,147073,146961,146291,146006,146031,146555,144453,147181,145734,146953,146449,146126,146364,145833,146276,145495,145748,146390,146016,146886,147314,146061,145237,146462,145000,148294,145341,144637,146800,147143,146127,146118,147538,145714,146352,143756,146433,146103,146123,146797,145915,146712,146047,146095,147461,147401,145969,147027,145806,146903,146567,146680,146815,148926,146346,146167,146970,147510,146911,146633,144681,145160,144678,147514,145914,146915,145978,147701,144792,145975,146222,147076,146953,145954,146584,145902,147391,145956,144852,147657,145781,145028,146338,145320,147210,145847,146373,146536,148371,147310,147083,145703,146298,146265,146681,146452,146821,146594,146150,146705,144665,146133,146634,146087,147108,147088,146517,147899,148575,146539,148653,147301,146404,146808,146846,147331,146888,146394,147243,146629,146401,146279,145378,147365,146353,147054,145596,146941,147926,145779,147394,145436,145697,147391,145403,145157,147883,145954,148358,146139,146344,147933,145334,145724,146862,144578,145640,146074,146085,147603,147561,145702,145639,145750,146199,146490,146361,146557,146774,145915,146762,145711,144635,146270,146534,145078,148196,146840,145558,146677,146157,146726,146884,147456,145728,147580,146924,145453,146340,146271,146358,146705,145688,148147,145509,145551,147467,146114,145476,146908,146965,146792,146022,147364,145992,146918,146849,147870,146657,148238,147644,147244,145172,147757,146798,145774,146879,146596,147629,147688,146333,147355,146962,147379,145998,148173,146499,146647,145592,147208,147363,148341,147247,146221,145831,145610,145437,148120,146491,146205,147155,146171,147065,146078,145572,146025,147602,145655,146194,146197,146176,145141,147538,145878,145986,146576,145580,147073,147051,148327,146481,147462,147152,145885,145917,145515,146423,146601,146061,145997,147437,147645,145893,148219,146249,145751,147486,146825,145204,148118,146376,145936,146436,146307,145872,146627,147130,147009,147918,146654,146403,147987,146938,147336,146473,147164,145507,146502,146387,146981,146003,145968,147581,146184,147371,147141,146110,146352,147879,146171,146460,147261,145189,146274,147313,145562,146725,146415,146644,147424,146243,146369,146591,145906,146529,146799,146847,146867,146694,146587,146922,146199,146850,146108,147018,146721,146955,147430,147304,145202,146682,145544,145635,147463,147175,146349,146812,148097,145955,148576,146427,146496,147304,145950,147407,148202,145101,146868,146216,145531,146559,146467,146221,145738,146004,146677,146574,146711,148122,146997,146466,145962,146069,146805,145691,146595,145903,146223,147003,147173,148141,145356,145717,146143,145583,147134,145433,146565,147543,146032,144938,146352,147823,146211,146495,148026,146737,145795,145853,146268,145330,146153,147640,145353,146820,148130,147751,146498,146215,146722,146934,144920,147285,147021,147191,146004,147104,145090,145507,145770,147136,145799,146143,146430,146796,146975,146166,146285,147110,145966,148102,147467,146743,146351,147121,146737,147620,146445,146781,145038,146029,146156,146557,146834,146511,146801,146367,145997,144981,147363,146086,147108,147450,147052,146545,146504,147035,146207,146661,147171,146924,145970,146167,145700,147198,146771,146000,147018,148734,146487,144151,147157,147694,144913,145481,147008,146631,146411,144985,145640,146595,145454,146803,145699,147911,146953,145929,147314,145441,147438,146355,144622,145678,147251,145148,147076,145462,147958,146059,146507,147250,146158,144738,145530,147175,146796,146884,146563,147970,147769,147810,145426,147757,148208,146613,146213,146572,146307,147117,147380,146125,145335,145960,146526,144554,145830,145713,146048,148252,147224,145494,145997,146495,147605,146482,144590,146892,145942,146648,146183,147248,146196,145939,145828,147009,146675,146405,146811,145034,146707,146646,146454,146148,147583,145531,146962,146242,148216,147087,146165,146761,146413,146220,147318,145818,145349,146102,147255,146490,147592,145519,145696,147300,147205,145915,146673,146247,146066,146236,146075,146764,145317,145325,144897,145844,146024,145812,144768,147243,144670,146170,145419,147188,147433,146077,145403,146781,146116,147146,145772,147142,146552,147562,147748,147562,146539,147435,147045,147201,148117,147448,145587,146183,146652,146876,148293,145911,146567,145394,147476,145304,146590,145859,145751,148082,146035,145938,147336,146407,145001,144871,146234,146307,147744,146234,146213,145621,146157,145229,147532,146418,146836,147389,147674,147350,145221,146303,147254,146161,145840,146064,146557,147897,148070,146797,145819,146543,146646,147861,146941,146080,147112,146987,145243,145822,148580,146046,146801,146913,147348,146866,147628,147366,148391,147574,147366,145979,147633,145726,146618,145816,146632,144606,146199,146304,147330,146656,145763,146717,145876,145987,147408,146339,144972,146003,148261,146660,146166,146319,145644,146051,145035,147067,145524,145868,146850,146514,145603,147138,147272,145179,146764,147693,146680,145188,147732,146417,145882,145952,147138,146617,146574,146812,146317,145822,146617,145906,146408,145710,146392,146199,145991,145699,148522,145946,146909,146218,146568,145782,147915,146753,146990,147546,146862,147138,145826,145663,146369,146291,146460,147861,146837,147104,146917,147157,146729,145391,146166,146540,147152,146902,145875,146643,149573,146508,147498,145305,146387,148144,147763,147150,147976,147935,146948,145286,146478,146381,146920,146755,147472,145601,146457,144555,147531,147535,144572,147214,146302,146285,145811,148049,146286,146754,146952,147194,148282,146882,145828,146056,144667,146397,146155,146553,146150,146698,145405,145701,147546,145932,146896,146085,144657,146505,147808,148929,147808,146849,146648,146586,146378,146194,147745,146882,144927,146446,146891,144594,147900,146338,147157,146148,144952,147671,145601,147737,147478,144726,144936,146458,146877,144871,146426,146383,145893,147543,146628,146475,145931,147248,144076,147051,145699,145581,146564,146439,147881,146604,145651,145286,148056,146968,146053,147228,145732,146288,147755,147172,144291,146588,146739,148227,144821,147224,147641,146634,146490,147119,147113,146195,147419,145958,147283,146026,146539,145866,147008,146731,147544,145932,145568,146387,146175,144395,145729,147004,147980,146359,147021,145727,146764,146070,145921,146416,145054,146350,146953,144988,147256,147799,147113,145438,145425,147629,146702,144892,145895,146619,147098,147809,146552,145466,145911,145173,146899,146628,146140,146897,147110,146154,146636,147313,146263,146476,146785,145062,147032,145965,145615,146952,146888,148051,146299,146574,146629,144936,147211,145291,145738,145189,146849,147179,146578,145487,147097,147649,145752,146067,146150,147417,146214,145721,146231,147279,145630,147650,146271,146649,146629,147126,146821,146014,146988,146766,147453,147479,146367,145445,147718,146653,145936,147415,145736,145890,146645,147992,146677,147004,146720,147114,146880,146793,145517,145367,145567,147849,146506,147687,145715,144136,146318,144975,145135,146359,147481,146490,145726,146630,146180,147063,147156,147754,146604,145958,145322,147135,147128,146342,146772,145815,146960,147615,146604,146820,148179,146949,146433,145602,148212,146619,146850,143636,147000,146333,145847,145523,146479,147403,146256,147689,148151,145636,148235,146801,144088,147854,146399,145980,146205,144603,146801,146108,146113,146971,146323,146342,146988,145366,146379,145710,146385,145070,146640,146301,145976,148235,146445,145268,145871,147175,146570,146729,146337,148436,145152,145795,145458,145713,146943,145484,147850,147371,145947,147845,145401,145161,146769,145487,146177,145693,145344,147462,145527,146316,146583,147524,146414,147217,146025,146327,146337,146138,146431,146308,147025,145543,145968,146826,145663,145898,147824,147397,146668,144452,147398,146839,147692,144738,144707,146971,146634,145349,144778,145341,147956,146141,144719,145393,147178,146723,144890,146244,147876,146956,146416,147326,148084,146056,146696,145491,146665,146633,146112,147034,144479,145766,148270,146910,145448,147997,146143,145353,144862,146442,146185,145042,144848,148436,146586,147253,145771,145137,144717,146291,145857,147781,146401,147426,145982,146380,147496,144782,146339,148270,147308,146269,145381,146359,145967,145137,146892,146868,145808,146748,146218,146696,145684,146041,145420,144704,147202,145847,147776,145723,147268,147174,146532,146315,146420,147525,143971,146752,147254,145457,146594,146865,147907,146008,147436,145081,146352,145447,146697,145716,144829,148462,145990,146605,145948,146810,148931,146497,144497,145689,145436,146955,146456,146621,147082,146189,145235,147371,147564,145731,146718,146635,144419,146883,146979,146374,145904,146083,147083,144860,146239,146245,145974,147632,146439,146539,148608,147345,149393,147776,147235,145608,147132,147951,144616,146399,146730,147298,145981,145943,145824,147121,146763,147065,147410,147670,147724,146264,146748,146002,146599,146270,146015,147080,146438,146359,146263,145379,146063,146203,146589,146266,147026,146445,147044,146222,145371,146995,146479,146945,146913,146109,146093,147061,145044,145871,145149,145988,146248,146101,145998,146389,146237,145915,146451,145974,147508,147296,145384,146657,145885,146454,145627,145621,146672,147854,146779,146106,145830,144950,145971,144941,146291,147226,145664,147574,146038,145131,146426,146856,146618,147364,146141,145540,146329,145328,144671,146824,148296,146992,146335,146180,145834,146008,147617,145051,145755,147566,146627,146266,146929,145942,145878,146402]},{"counters":[148154,146939,146558,146425,146640,147717,146313,145292,147286,145637,144908,145299,145652,147365,145980,146574,146596,145118,147710,147594,145906,144900,147309,146928,145701,147266,147508,147630,146267,146807,147922,145982,146787,145849,146137,146047,145315,147593,145218,146441,146119,145696,146219,147908,146341,146801,146178,147646,146804,146824,146497,146832,145490,143972,146025,146853,146404,145291,146956,146235,145848,148880,146427,144642,147285,145453,145652,145326,147695,146451,145870,146048,146162,146571,146959,145573,146512,146921,146454,147775,147089,147377,146526,145173,147737,146974,145874,145063,145726,144662,146925,147417,146333,145058,146599,146380,147851,147656,146039,147933,145955,146749,145675,145246,146671,146411,147440,146415,148158,146033,148213,147922,146176,146541,147522,146324,146511,146303,146492,147096,145846,147178,146390,145511,145917,147525,146437,145674,145044,146919,146595,148246,145548,147705,145677,146254,145811,145472,146027,147958,147956,146065,145893,145650,145304,146097,147011,147201,143810,145412,145684,146143,147450,147189,145999,146310,146304,147322,146449,145546,148003,146882,146305,145497,146483,148209,145958,145985,146536,146988,146391,146229,145368,145380,146938,147355,145892,146802,145288,146100,145967,146558,147013,145926,145195,147447,147070,145205,147339,147005,146290,147862,146838,147666,146922,147995,146519,146639,146310,146777,146474,147188,146859,147159,146085,147516,147189,145419,147357,146164,147180,145238,146750,147596,146186,147468,144876,145995,147800,147142,146350,147293,146738,145500,147723,145529,145798,147888,147099,146120,145716,146483,147164,147307,147106,145907,146513,146828,145213,145517,146943,146656,147656,145691,144606,146179,147385,146163,146189,144607,146898,146897,145502,147464,145810,145814,146200,147615,145471,145447,145507,146078,145871,146404,147007,146668,147597,146265,148903,146842,146868,145786,146530,147547,146256,144903,148541,145866,146854,145569,145544,146657,146739,146655,146824,145148,146686,146825,146565,147726,147149,146352,147249,147747,147250,145944,147559,145140,147099,146840,145679,147164,146245,145800,146591,146067,147100,145750,146322,145426,147822,147875,145542,146449,148452,145324,145466,146492,146529,146356,146845,146118,145434,146305,146138,145261,146702,145907,144330,147903,146376,146122,145581,145873,147005,147280,146580,147800,146409,146136,146855,148017,147292,146579,147564,146551,147256,146091,147499,147768,145420,144970,146183,146691,146762,146916,145843,146344,146483,145001,145101,146675,145547,145809,146723,146276,146629,146848,147066,147080,145328,146548,146502,146784,145314,146750,145212,147230,145284,147033,147617,146327,146349,146251,144496,146786,145608,148334,145773,145723,145972,147067,145862,146895,146869,146712,146563,147164,146311,146565,146776,145726,145971,146683,147357,146890,147632,147162,146751,145529,145575,147508,146586,145895,146947,145071,145069,147678,145503,148321,145976,145846,147170,147180,147090,147508,146111,147249,147504,147497,146668,145846,146445,145634,146653,148167,148199,146699,146206,147024,146926,145079,146470,147057,146302,146685,146226,147742,147062,146637,148184,146365,147101,145380,147597,144369,145928,145919,146766,147271,145048,146937,145770,146522,147067,146341,145069,147160,146981,147039,145454,146616,144913,147295,145863,146585,146783,146014,146062,146270,146040,145618,145720,146136,147265,147240,145996,145532,147226,145947,147783,146094,147372,146252,146762,145261,147813,147167,146415,146618,146988,146185,147482,146701,144930,147234,147246,147027,147080,146316,146833,145952,147651,146397,147680,145991,145996,146722,146123,145301,148039,145762,147069,145714,145529,146434,144561,146687,147101,145207,147841,145704,146613,145026,147480,147064,146139,147246,146826,146876,146261,146226,146376,146829,147073,146620,146000,146795,146764,145187,146510,145627,147613,147926,147185,148023,146436,146700,146170,146202,147746,144920,147757,147609,146502,148324,148849,145337,146606,145957,146998,145987,146947,146100,146606,147486,146479,145287,145186,145550,146678,146644,146724,147989,146997,145740,146779,147426,145905,146014,146731,146836,145723,146506,146778,146811,147288,146476,146823,146718,145600,145176,145281,145984,146624,146624,145791,145691,145728,147535,146676,145833,147312,145672,145066,146590,146844,146076,146646,145532,145100,146826,146962,146382,144873,146477,147503,146912,145939,146779,147057,148152,146311,147937,146074,145576,146956,146943,146587,145656,145561,147074,147204,145751,145504,147288,146627,145690,147011,146819,146417,146266,147159,145900,145488,145360,145429,146140,146160,146277,145822,146146,145725,146869,146711,146101,146445,145127,147190,146877,146077,144980,146379,145974,147240,145312,149393,147766,146053,146412,146643,147506,147277,147228,145887,146128,147166,146549,145767,146348,147554,146026,147092,145644,145519,146358,146776,146322,145692,148094,147761,146584,146127,148560,145262,146138,148070,146855,147652,146376,146800,145716,146177,147143,145979,147051,145787,146528,144939,147019,147035,148105,146717,145299,146831,146299,146501,146317,147204,147586,147406,147374,146775,146657,145724,146389,145563,146506,145681,146824,145752,147260,146334,146857,146652,146857,145659,146906,147446,146588,145091,146980,146148,146884,146094,147399,144734,145879,145859,146128,146180,146987,146547,145203,145080,145123,146718,146345,146159,147608,148116,145102,147160,147631,146230,145006,146652,148110,146456,145861,147582,146469,145381,147191,146991,146874,146240,146107,145779,145781,146924,147007,144825,147025,146015,146615,147050,145819,146935,146437,147742,146157,145922,145215,146085,146374,147678,145823,146479,146660,145854,146993,144167,145136,145968,147629,145796,146187,147893,145441,147597,147522,148302,146762,145438,146365,146225,145145,145761,147724,146167,145938,147031,145637,145971,145610,147136,147201,146730,146814,146399,146873,146328,144998,147351,146967,146631,146931,146365,147218,145268,146271,147562,147636,147150,146349,145517,146483,147956,146174,146289,145982,147388,145766,146322,146013,147142,146957,147844,148213,146503,146896,145751,145474,146477,146867,147638,145894,146156,146759,147000,145973,146322,147497,146612,145649,146351,146417,145556,147417,146181,146588,146449,147740,147428,147875,146913,146282,147361,146102,146852,146344,145884,146591,147273,145801,146030,148218,145832,146938,145518,146508,145214,145310,146730,145705,145692,146025,147276,146179,147678,146523,146449,146792,148243,145893,145909,146562,147287,146836,147974,145713,145971,147045,145712,148324,146677,145847,146734,146220,144962,146643,147427,146265,146137,145388,146388,146401,145946,146214,146858,146222,146823,145474,146332,145064,145578,146360,147164,147581,146797,148133,147174,144857,145652,146151,145666,146250,147845,146497,146311,145692,146539,147718,146610,148037,145880,146323,145245,146674,146916,148090,144785,146142,146933,145729,146368,145205,146247,146867,146853,145950,146652,145683,147751,145269,145744,145664,147878,146696,145467,145049,146504,146609,148011,146406,146697,145086,147771,146386,145809,148742,146241,145976,145958,147881,147564,149155,145841,146743,147370,146261,146415,146929,145274,146029,146384,145241,147187,145623,146968,147285,146751,144704,146946,144973,145573,147299,147127,143843,145280,146523,145587,147420,146030,145270,147039,145563,147137,146659,147655,147282,145585,146338,146239,146776,146462,145345,145767,146453,146543,149158,146589,148081,146919,146418,146179,145427,146586,146707,146272,146303,146791,146596,147257,147086,146527,146498,145843,147306,144909,146500,147382,146867,145872,146173,145572,147183,145557,145731,145956,144727,147519,145678,147577,147201,146459,147475,146661,146320,147012,145313,146171,147106,145388,146482,146498,146572,146768,146815,144522,146635,144745,147657,146067,145599,146101,145920,145325,146312,147551,146352,145991,146773,145774,146414,145598,147538,146499,144735,146141,144858,146171,147642,146140,147249,147583,147290,146434,147604,145859,145940,146655,147493,146120,146323,146564,146908,146096,147113,145734,146325,146451,144481,146486,147063,146693,145699,146128,146575,146526,146494,145926,147441,146125,146512,145608,146185,145701,145313,145971,147231,147242,143969,148134,146227,147358,146999,146262,145852,145440,146793,145825,146751,147680,146213,147328,147098,147003,146066,147188,144882,146201,147505,146298,147708,146410,144100,145671,144333,145998,147954,146656,146337,145534,144751,147321,147660,146696,145822,147911,145484,146709,146112,147101,147249,145810,146832,147309,146085,146049,145214,147614,146875,146752,146879,146526,146252,145790,146815,147131,145509,146787,147506,147423,147716,146314,146623,146534,146472,146206,146524,145873,146990,145076,146115,146162,144528,146221,147590,147196,146210,146293,147451,147378,146616,146171,146235,145845,147002,146770,146933,146120,146727,146445,146282,146048,147316,146621,146097,146811,147840,145956,147073,147003,146495,146284,146204,147674,147271,147103,146916,147323,146342,146542,147073,146449,148543,147207,147612,146810,146493,147211,145752,145973,146014,146274,148013,147158,146116,145614,146590,146636,147141,147087,146780,143909,147082,146987,146589,146975,147639,146613,147741,146747,147256,146803,145632,144967,147239,145936,146479,147116,146989,145710,144235,148153,147737,145567,145630,146226,147193,145653,146581,146733,145466,149148,148274,146183,147128,146506,146809,145710,146453,145545,147460,147119,145921,147111,146043,147491,146657,145503,146841,147296,147500,145746,144720,147813,146429,146896,146420,146990,147166,145629,147743,147569,146691,147417,147202,145789,147946,146344,145341,144780,147659,146567,146827,148523,146909,145054,146425,146620,144873,145400,146153,146870,146031,145688,147719,146356,145541,145401,145754,145540,146472,146168,146532,147184,146359,146957,148396,146837,146789,146496,144920,148311,146786,145830,146978,146587,145577,146643,144903,147198,145360,145948,147328,146082,146914,146635,146653,147582,146422,146147,147498,147496,145689,146134,146437,146806,146154,147271,145828,145295,146554,145277,147260,144995,147687,146966,147467,146478,147351,145238,146687,145584,144930,145701,146558,145627,148249,147652,147748,146758,146317,146949,145064,147124,146585,146256,146415,145373,143388,146218,146116,147392,146667,146808,147529,146795,145784,145956,146771,146521,146326,146136,144892,144562,146964,147285,146787,145982,147701,145552,145608,146112,145447,146340,145504,146909,146294,146212,146185,147091,147803,146390,147183,146925,147642,147948,146421,146512,144692,146003,144233,147057,146730,146187,147374,146760,146982,147920,146960,146521,145519,145851,146326,145298,146414,148051,145781,144770,145654,145281,148018,145091,147498,145696,147246,147921,148094,146192,146307,145941,145991,146689,145204,147337,146332,146800,145744,145601,148580,146171,145435,147649,146384,146194,145415,146155,147380,147160,146500,147415,147296,146903,146359,148724,146781,146321,148279,146494,146642,146614,146490,145642,146653,148650,147201,147764,145567,145172,146924,146072,147672,146007,145783,146483,146303,146763,145107,144743,145677,145944,147484,147952,146403,146211,146727,148100,146010,145315,147773,146629,145689,147917,147177,146966,145867,144706,146204,146379,147164,145549,144627,148346,146182,146305,145887,145809,146234,146064,146100,147175,145407,146311,145706,146312,146464,146767,147209,146625,144906,146127,145950,146713,146780,147126,145756,147210,145948,146990,147547,147167,146482,145418,147640,145147,147275,145109,145962,146312,144468,145435,147303,146199,146369,146032,146992,146365,146414,146914,145220,145954,145750,145691,146521,146555,146577,146655,146375,146148,146072,145933,148272,145668,146599,146940,147908,146878,147997,146506,147441,147076,144851,145495,147460,146756,146483,146080,147915,146475,146453,147830,147447,147570,147114,145451,145931,146924,146222,145033,146269,146696,145569,145277,146764,147855,145487,147180,147319,146186,146835,146135,147607,147926,145492,145847,147609,146866,147358,145361,146070,145648,147694,147655,147010,145388,146817,145070,145033,147357,147096,146293,147993,146206,146770,145734,147106,146517,145067,146882,145283,146476,145937,148236,146484,146778,143902,147839,146539,145422,145817,147426,146456,145241,147003,146258,146203,146386,145776,145448,145659,145863,146421,148205,147184,146456,148463,147122,146289,146570,146515,147097,147099,144588,147520,146217,146451,146262,146260,146946,146239,146035,146510,147983,146549,146791,145227,147450,146448,147537,145529,146200,147265,147863,147296,147387,146793,144833,146318,145463,147728,146836,146818,147641,146540,145229,147147,147503,145707,146530,145649,145954,146838,145740,145631,144614,145762,147273,145533,145512,147066,146882,147717,146102,146060,145611,147074,146988,145307,148328,146819,146688,147514,146500,145550,145712,146401,146382,145092,149180,145420,145930,146533,146959,146766,146044,146728,145794,146479,147188,147571,147135,145067,146851,145867,145813,147377,147290,147837,146715,146314,145439,146370,146668,145485,147355,146684,147792,146656,146262,145697,145179,145802,147624,145555,146480,145938,145030,147600,145897,145811,145573,146279,147226,146133,147719,146363,147259,147781,144922,147141,146625,146351,146854,147293,145878,146273,146943,144472,145799,146949,147028,147166,146320,147195,145716,146496,145103,146312,145883,148390,146554,146163,146005,146777,146689,146543,145733,146829,146034,146374,146387,145386,147306,147068,146658,145368,145581,147379,146625,147012,146429,145681,145844,147246,145312,145432,147682,146426,147167,146831,145670,147613,146177,146017,145302,147441,147703,146036,145580,145560,145724,146357,147110,147450,146460,147110,146770,146648,146371,147137,146299,147322,146585,146976,146931,147508,147103,145621,145441,146847,146628,146606,147651,147423,145383,146646,145506,146220,146321,147070,146581,146581,145998,146542,145721,145986,146101,144453,146717,147315,145930,145654,144921,147013,147105,147210,147543,146174,147108,146552,147579,145391,146824,147008,144830,147980,147575,145923,145721,146311,146232,146425,145620,146950,146578,146456,147123,147508,146648,147558,145050,146449,144633,146296,145773,145372,147534,146998,147313,146563,145969,146263,146568,147244,145192,146329,146322,146134,146983,146362,145570,147242,147378,147638,146354,146745,147352,145936,148689,146331,146390,145688,146597,146684]},{"counters":[145814,145637,146566,145974,147197,145907,146551,147335,146966,146209,145856,145040,146056,146733,145973,146767,146322,146272,146440,146770,144634,145675,145955,146650,145485,146155,145770,146299,148146,146399,145795,146552,146051,145668,146676,148082,147247,147402,146710,147386,146049,146615,147267,146432,147010,146266,146372,147053,147059,145611,147012,147821,146749,146648,146039,146690,146791,146820,147112,145288,146508,144988,145944,146089,146857,145796,145970,146361,146530,147006,144114,147296,147289,146489,146368,145811,146500,145639,146016,147546,147435,145553,146757,146164,148501,144978,145645,146245,145964,147009,146685,146581,145467,145929,145791,146837,145719,145980,146445,146942,146190,146260,146110,145713,144975,146868,147558,147527,146326,146288,146928,148191,147881,148984,146789,146538,146358,146355,146366,145389,146340,146620,145926,146793,145027,146638,146594,147427,146449,146907,147737,146092,146754,148458,148409,146593,146329,146472,146097,146984,146018,146525,146864,146092,147978,146718,148690,147129,146404,146832,146183,146073,145766,146954,145099,148647,145265,145552,146704,145133,146949,145824,147233,146089,146507,146790,146042,147429,145279,146323,145786,145909,145912,146042,145714,146084,146398,145610,147582,147230,147184,147477,146189,146685,146633,146679,145188,147117,146547,144884,145561,146112,147539,146378,147565,146097,146878,146749,146182,144070,146194,146356,144813,146360,147111,145590,145105,145953,146317,146306,147304,146299,146433,147383,147246,146242,144665,146558,146783,147267,146450,145317,146533,146486,146494,145707,146203,147321,146427,146188,146460,146705,145829,146952,146737,146959,146130,145951,146549,145616,146969,147086,147096,147667,146302,147376,147497,146709,146058,147425,147173,146505,146692,146425,146872,146776,146969,146100,147122,146518,147461,146347,145765,145312,146224,147325,147696,146410,146867,147179,145268,146869,147441,147058,145521,146496,146678,145793,145858,148520,147369,148281,147503,146879,145974,146691,145788,147446,146845,146498,145782,146667,147461,147251,146975,145935,147604,146977,146329,144984,146110,145199,145649,147489,145878,148037,146868,146359,145563,147331,144905,145879,144704,146379,146284,143968,147594,146843,147798,147637,146836,144612,146564,146603,146852,145814,146648,146545,146700,145309,146728,147004,146962,146894,147913,146780,147729,146658,145281,147656,145577,146105,146198,147099,147679,146875,146106,145628,148684,148146,147678,144778,146285,148223,147944,147008,145692,145816,144851,145859,147219,146805,147126,147001,148109,145014,147175,147324,146628,147228,147195,147508,146438,146930,146965,148980,147652,147409,144430,145599,146683,146925,145482,147760,145679,146870,147505,146203,146471,147733,145202,147567,144537,144961,146792,145328,145719,146116,148624,146963,147364,146735,146906,147665,145866,146236,146516,146256,147962,146785,146124,145427,145857,145270,146782,146750,147865,146166,147314,145244,145844,146247,145781,145630,144771,146819,145247,145670,146640,145919,146467,146928,146460,147362,146913,146782,146732,147019,145623,146371,144796,147505,146395,146335,145678,146989,147764,146288,146814,147333,146266,147089,147088,145220,146297,146487,146117,147458,146004,146078,146753,146275,145968,146511,145893,145845,146408,146985,146616,146066,146192,147484,146757,146367,146599,147675,146265,144287,146479,146907,147811,146934,146782,145314,146026,144646,145329,146681,148038,145077,146942,146939,146526,146783,147283,144818,148628,147480,146054,146070,145738,146003,146389,145780,146163,146530,146633,146944,146416,147460,146729,146447,145681,145513,147496,146190,146467,145853,145664,145152,145741,145365,146714,147668,147532,146662,146451,145801,147109,147275,146360,145208,148749,146925,146616,146950,146330,146204,145776,145526,147351,147242,146506,147134,147195,146179,147551,145497,145209,147697,144780,146782,146392,145805,146688,146319,146825,146711,147454,145464,146213,146575,146917,147222,148002,145453,147335,147384,147004,147536,146908,144902,146299,146525,146659,147131,146936,147174,146566,145758,147607,146287,146037,146707,146877,146987,145385,147286,146185,145854,146272,146275,148734,144988,145862,147978,146413,145664,147281,146432,147823,147116,145852,146929,146656,148342,145125,146313,144209,146193,147336,144130,145495,147014,146878,147552,146920,146958,147797,146958,147023,147689,145386,144873,146613,148191,145124,146749,145370,147519,145828,147668,147199,147559,145845,147477,148292,147296,147147,146124,145745,146961,145909,145271,148265,147070,145948,145919,145547,145459,146863,145924,145183,146665,146887,145620,147348,146824,146107,145823,146303,146981,146235,146889,145985,147054,145237,146867,145496,145464,147932,146534,145900,146011,146575,145879,146611,145507,147774,145764,145959,145686,146003,147296,145996,147550,148555,146263,146173,146723,146723,145761,145844,145668,145647,146727,145792,146450,146500,145979,146020,147613,146571,145583,146051,147247,146335,146793,146016,146616,146554,144500,146623,145737,146687,146738,146276,145360,145471,147931,146808,146649,147467,146378,147256,146002,146025,145921,145559,145031,146196,145650,146000,146670,147082,146667,145146,145882,148224,146162,146643,146832,145397,146553,146771,146106,147348,146506,145009,145853,146987,145899,145903,148145,145348,147223,147439,147616,146619,146063,147427,146049,144522,144819,145987,147135,145081,145637,146488,147753,147853,147729,145584,146573,147043,147187,145376,147223,146776,145789,145936,145635,145447,145931,147194,146355,147106,147347,145795,146261,145983,145750,145305,146620,145710,146983,146601,148656,146291,146246,146278,145494,148191,145878,148134,146376,145305,145570,147517,147051,146084,146216,146342,146883,146404,146490,147651,145917,146152,146251,146364,147087,147527,145137,147075,146153,146041,147269,146764,146459,147194,147818,147687,147562,147545,146072,147033,147571,145732,146100,148393,147941,147618,146612,145089,148442,146756,145784,146264,148203,146133,146786,144998,146113,146175,144866,146737,146902,146556,146543,146368,146428,146143,147194,145826,145947,146617,146340,147419,148041,146695,145378,146153,147152,146131,144908,148507,146488,145921,145140,144268,148175,146625,145022,145459,145624,147242,148193,145712,146379,147350,147996,145853,146553,147148,146921,145463,146684,146783,145793,146557,145198,144738,145913,146934,146277,145512,146268,146541,147848,145588,145868,148273,148011,146048,146056,146387,146711,146718,146307,146687,146748,147974,146052,147973,145001,146549,147669,146975,144781,146139,147021,143928,147693,146497,146152,146965,146170,146027,146860,146684,145912,147169,146852,146273,146639,145778,147980,144773,145565,146117,147034,146607,146704,146577,145732,147063,146685,146357,146215,147284,147281,144714,145827,145398,145761,148895,146858,147271,145182,148109,147455,146698,144707,146486,146500,147016,147340,146943,147360,146778,147946,148282,147716,146337,146283,147598,146325,147020,147153,146427,146347,146509,147361,146485,146751,146733,145028,147202,147242,145799,147129,147196,145219,146962,145934,146396,146060,147259,147409,148773,146181,146275,146116,146055,146196,146417,146430,146783,147692,148669,147413,145678,147054,147666,146358,145647,147501,147382,146785,146432,145235,146250,146139,147680,145807,146885,147703,146317,146063,146855,146156,145856,146150,147918,146742,146216,145908,146913,146442,146501,146917,148576,146383,145759,145062,147431,147640,146171,146438,146490,147121,147240,145961,145010,147154,146283,145522,147199,147337,145914,145259,145546,145051,145288,148175,146338,146740,146071,148486,147101,145471,146378,146195,146658,147152,147803,146624,146366,146807,147747,145050,147092,146269,147320,146658,145418,145531,146063,145751,146032,146750,148020,145975,145336,146967,148484,145281,145940,146045,144772,147673,144840,146167,147271,146071,146757,146162,146435,146450,148674,146332,145375,147227,145732,145888,145731,148358,147590,146867,147898,146434,145064,147653,147542,147031,147435,146839,147555,145366,145993,145914,146380,147574,146919,145574,145758,145441,145313,147179,145810,145149,144329,146498,145988,147046,146542,146992,144931,146147,145405,145976,147499,146284,146112,145955,147647,147190,145958,147406,145672,145350,146290,145817,146059,147215,144637,145572,146804,145497,147470,147900,145760,147000,147346,147007,144682,147119,145942,147045,146977,146356,145939,146262,146475,146053,145384,146561,147002,145612,145139,145772,146408,146728,145702,146242,145896,145563,147477,146664,147298,146672,146231,145435,147065,147391,146817,145338,145601,147779,146785,146385,145299,146017,147231,146513,145329,146273,145115,147013,147292,144089,145830,148290,148819,147317,146019,145974,147459,146570,147274,147150,147747,145926,146107,146057,147135,146409,145162,146573,147454,147431,146916,146790,146936,146452,146661,146909,146853,146715,146660,146145,147324,144962,147182,146220,146213,145523,146078,145989,147210,145903,146967,147074,145241,147233,145676,147862,146468,146961,144637,145877,146701,146256,146126,144388,146830,145330,146538,145820,145935,145962,145829,146449,144348,147424,145347,147164,147938,148113,146417,145875,146899,147969,145552,144454,145820,146877,145913,147076,145990,147684,146499,146185,147275,146875,146902,146948,145707,145798,146837,146016,146115,145872,146373,146338,147163,147215,147339,145106,147452,146690,145730,146807,144952,146535,146995,146386,145472,146733,146134,147040,147195,146686,147078,147684,146441,146323,146620,146958,147207,147631,146340,146682,147477,146994,146242,146386,145792,147269,147437,147449,145355,145649,147103,146985,145594,145499,147409,146226,147914,145538,147271,144251,147758,147638,147600,146216,144627,146499,146648,145325,145281,145649,146132,146772,146061,145181,147099,145574,147478,146279,146458,146597,148457,145955,145959,146566,145876,145173,147570,145233,147417,147100,146309,147042,147597,147440,146235,147225,147044,146619,147298,146637,147067,146570,147530,147476,146719,146862,147383,145667,147158,146277,146628,145679,145759,147063,147882,144930,144747,147565,146465,146707,145525,146489,145282,146707,147834,145961,146008,147070,146600,147888,146754,145313,146546,146522,146495,147560,146178,147081,146478,145394,146102,146289,146538,147741,146103,147414,147731,146930,147139,147603,145453,145504,145691,146295,146031,145331,146110,146488,146745,147553,144530,148560,146708,147098,144374,146699,146500,147931,146320,147057,145487,146681,146780,147311,146624,145737,145538,147526,145966,144737,146564,145097,147289,146306,145466,146198,146714,146961,147261,147164,145774,147179,146004,146345,146794,146645,146439,145866,146520,147760,145152,146051,145934,146693,147313,147117,146382,144697,145602,147908,146780,146616,145422,147349,146525,146519,146985,145928,147420,146373,145453,147091,146801,145303,148435,145649,146692,145481,146627,146378,145345,147411,148251,145470,145859,145716,144765,148219,146535,146318,146777,145412,148809,146084,145859,146303,145971,148659,146414,148087,144375,146321,145204,145495,147622,147458,146651,147566,146249,146818,147356,146936,146620,146974,147555,146258,146116,146023,146299,146203,145380,145455,145883,148440,147710,146407,146593,147412,146380,146860,145195,145634,147592,145181,146173,146752,147774,146624,144759,145916,147602,147601,145918,146360,146691,145596,146101,146643,145973,146339,145929,146684,147295,146028,145937,145448,146805,147196,145488,146028,146162,144855,146411,146115,146137,146513,147102,146263,145971,146829,145452,145647,146484,146947,146101,145684,147998,146168,147375,146758,146858,144849,146743,145952,145062,145138,145651,146413,146339,146384,145783,147310,145995,145148,146415,145564,146375,148880,147672,145187,144906,146180,146393,146251,145838,146096,146447,147149,146461,146414,147084,147680,145778,146639,146448,146419,145610,145100,147297,146085,147229,146995,147344,147577,145247,146295,147022,145091,145261,147185,146862,146323,145297,147102,146536,146702,144454,146527,147160,146568,146994,146427,147032,145485,146963,147055,145702,146468,148864,145924,145843,147897,146607,145762,145333,146791,146519,145878,146764,145557,146424,145334,145485,146178,147424,146715,145714,145700,148481,145949,147835,147216,146981,146866,144923,145809,146714,145097,146464,147325,146732,145682,146948,146340,147253,146389,147194,147722,146731,144748,145317,146864,145195,145897,146756,145219,146656,145896,145696,145852,146492,147112,146008,145582,146862,147140,145793,147719,147699,146516,146968,147881,145632,146336,146211,148021,146336,144705,146836,146017,147783,144926,146699,146070,146951,147121,145829,145711,144842,145422,146743,146769,146814,147139,147245,146469,146210,146911,145127,148078,145401,146086,146664,145925,146230,146322,147147,146554,146865,146777,147324,147162,145644,146630,147074,146866,146004,146932,146471,144671,147314,147913,146175,145962,146077,147309,145500,147784,146024,145583,146602,146317,147137,146380,147301,145606,147204,146905,146020,146757,144938,147249,145185,148132,146680,146878,146736,146357,146855,146808,146644,145759,145641,148655,146508,145874,147106,147048,145312,146229,148444,146172,145203,147925,146397,146449,146086,146123,147369,146526,146290,148273,147071,146255,146536,145603,146741,146854,146915,146936,145966,147085,147251,146121,147813,145474,145341,147408,146421,146379,145079,145904,147020,146747,147048,147165,146607,146787,145650,146347,147272,145351,146366,144561,145393,148043,147328,146200,146595,146831,147385,145586,146633,145804,146703,145978,146296,145513,147795,147391,146538,145946,146621,146253,148021,145587,145366,145948,145541,146688,147105,145480,144421,146222,145651,146077,148462,147286,146264,146863,146256,145356,146077,146528,146355,146782,146695,146444,146729,147364,146057,146876,148021,145262,147112,145160,146035,147084,146130,146831,148585,145168,146543,146957,145432,145732,147437,146991,145836,146808,145734,146708,146284,145836,147251,145111,147612,147456,145648,147114,145889,145863,146778,146346,146412,146347,147395,146845,147132,146216,145136,146595,146683,145540,145591,145787,145048,146382,146782,146191,146299,147155,147283,147285,147471,145746,146025,145378,145432,146367,145300,145746,146063,145985,147432,146029,146152,144730,146419,146560,146832,147066,147949,147300,146419,145527,146219,146827,147555,146056,146449,144923,147573,146826,145973,148223,146219,147558,147188,145727,146575,145954,148842,148091]}]},"null_count":0,"tot_col_size":1664762574,"last_update_version":401695339644190721},"l_partkey":{"histogram":{"ndv":9943040,"buckets":[{"count":1200023,"lower_bound":"MTI1OA==","upper_bound":"NDI3Mzk=","repeats":30},{"count":2400046,"lower_bound":"NDI5OTY=","upper_bound":"NzMxOTA=","repeats":30},{"count":3600069,"lower_bound":"NzM4MjI=","upper_bound":"MTEwODQ4","repeats":30},{"count":4800092,"lower_bound":"MTEwOTMw","upper_bound":"MTQ2MTQ3","repeats":30},{"count":6000116,"lower_bound":"MTQ4Mjc1","upper_bound":"MTg2Mjkz","repeats":30},{"count":7200139,"lower_bound":"MTg3MjE2","upper_bound":"MjEyNzA5","repeats":30},{"count":8400162,"lower_bound":"MjEzNjMz","upper_bound":"MjYzMTk4","repeats":30},{"count":9600185,"lower_bound":"MjY0NTE1","upper_bound":"MzA1NDI1","repeats":30},{"count":10800209,"lower_bound":"MzA1NjI1","upper_bound":"MzQyNzQ0","repeats":30},{"count":12000232,"lower_bound":"MzQzOTky","upper_bound":"MzgxMjc0","repeats":30},{"count":13200255,"lower_bound":"MzgxMzQz","upper_bound":"NDE4MDIz","repeats":30},{"count":14400278,"lower_bound":"NDIwMDYz","upper_bound":"NDUzMzcz","repeats":30},{"count":15600302,"lower_bound":"NDUzNzYz","upper_bound":"NDgyMjU2","repeats":30},{"count":16800325,"lower_bound":"NDgyNTAz","upper_bound":"NTI3NTk4","repeats":30},{"count":18000348,"lower_bound":"NTI3ODI3","upper_bound":"NTUzOTA5","repeats":30},{"count":19200371,"lower_bound":"NTU1NDMx","upper_bound":"NTg1MDc4","repeats":30},{"count":20400395,"lower_bound":"NTg1MzM2","upper_bound":"NjE5NDQ0","repeats":30},{"count":21600418,"lower_bound":"NjIwODA0","upper_bound":"NjUxNDI5","repeats":30},{"count":22800441,"lower_bound":"NjU0NDE5","upper_bound":"NjkyMzYx","repeats":30},{"count":24000464,"lower_bound":"NjkyNzk0","upper_bound":"NzMxMDk4","repeats":30},{"count":25200488,"lower_bound":"NzMxOTAz","upper_bound":"Nzc4NDUz","repeats":30},{"count":26400511,"lower_bound":"Nzc4Nzgy","upper_bound":"ODE1NjI3","repeats":30},{"count":27600534,"lower_bound":"ODE4ODMy","upper_bound":"ODY2MjY4","repeats":30},{"count":28800557,"lower_bound":"ODY2NDQ4","upper_bound":"OTA2Njg4","repeats":30},{"count":30000581,"lower_bound":"OTA3MDU3","upper_bound":"OTQ1NzIy","repeats":30},{"count":31200604,"lower_bound":"OTQ2MzM0","upper_bound":"OTgwODY4","repeats":30},{"count":32400627,"lower_bound":"OTgzMDM5","upper_bound":"MTAyOTQwNQ==","repeats":30},{"count":33600650,"lower_bound":"MTAyOTgyNQ==","upper_bound":"MTA3MzI0Mg==","repeats":30},{"count":34800674,"lower_bound":"MTA3NTAxNw==","upper_bound":"MTEyMDUxNQ==","repeats":30},{"count":36000697,"lower_bound":"MTEyMDU0Mw==","upper_bound":"MTE2MzY1NA==","repeats":30},{"count":37200720,"lower_bound":"MTE2MzcwMA==","upper_bound":"MTIwNjI3MQ==","repeats":30},{"count":38400743,"lower_bound":"MTIwNjUyMw==","upper_bound":"MTI0MTA0Mw==","repeats":30},{"count":39600767,"lower_bound":"MTI0MjYzNg==","upper_bound":"MTI3Mjk0Mg==","repeats":30},{"count":40800790,"lower_bound":"MTI3NDgzOQ==","upper_bound":"MTMxNDg0Mg==","repeats":30},{"count":42000813,"lower_bound":"MTMxNTE0MQ==","upper_bound":"MTM1NTg3Ng==","repeats":30},{"count":43200836,"lower_bound":"MTM1NTkwNw==","upper_bound":"MTQwMDQ5MA==","repeats":30},{"count":44400860,"lower_bound":"MTQwMTA3MA==","upper_bound":"MTQ0MTU2Nw==","repeats":30},{"count":45600883,"lower_bound":"MTQ0Mzg4OA==","upper_bound":"MTQ3ODM5Mw==","repeats":30},{"count":46800906,"lower_bound":"MTQ4MDQxMA==","upper_bound":"MTUyODAzOA==","repeats":30},{"count":48000929,"lower_bound":"MTUyODczNA==","upper_bound":"MTU2NDE0Nw==","repeats":30},{"count":49200953,"lower_bound":"MTU2NDkzNQ==","upper_bound":"MTYwODUzNQ==","repeats":30},{"count":50400976,"lower_bound":"MTYwOTM5NQ==","upper_bound":"MTY0OTAwNw==","repeats":30},{"count":51600999,"lower_bound":"MTY0OTExNg==","upper_bound":"MTY3ODk1OA==","repeats":30},{"count":52801022,"lower_bound":"MTY4MDExMw==","upper_bound":"MTcxMDc1Mg==","repeats":30},{"count":54001045,"lower_bound":"MTcxMDgzNQ==","upper_bound":"MTc1NjAyOA==","repeats":30},{"count":55201069,"lower_bound":"MTc1NjUyOA==","upper_bound":"MTc5MDU5Mg==","repeats":30},{"count":56401092,"lower_bound":"MTc5NDMwMQ==","upper_bound":"MTgzNDY1Ng==","repeats":30},{"count":57601115,"lower_bound":"MTgzNjI4Mw==","upper_bound":"MTg5Mjk4MQ==","repeats":30},{"count":58801138,"lower_bound":"MTg5Mzk4NQ==","upper_bound":"MTkyOTE5OA==","repeats":30},{"count":60001162,"lower_bound":"MTkzMDA3Mg==","upper_bound":"MTk3NDYyMQ==","repeats":30},{"count":61201185,"lower_bound":"MTk3NDgwNA==","upper_bound":"MjAxNzI5Ng==","repeats":30},{"count":62401208,"lower_bound":"MjAxODY2MA==","upper_bound":"MjA2NjY3OQ==","repeats":30},{"count":63601231,"lower_bound":"MjA2ODEzMA==","upper_bound":"MjExNDY0OQ==","repeats":30},{"count":64801255,"lower_bound":"MjExNDg1OQ==","upper_bound":"MjE1MDU2MQ==","repeats":30},{"count":66001278,"lower_bound":"MjE1Mzk3Mg==","upper_bound":"MjE4ODExNA==","repeats":30},{"count":67201301,"lower_bound":"MjE4OTE2MA==","upper_bound":"MjIyOTMxNQ==","repeats":30},{"count":68401324,"lower_bound":"MjIyOTMyOQ==","upper_bound":"MjI2NDg1Nw==","repeats":30},{"count":69601348,"lower_bound":"MjI2Njc3OA==","upper_bound":"MjMwMzcxNQ==","repeats":30},{"count":70801371,"lower_bound":"MjMwNTkwNQ==","upper_bound":"MjM1MDQ1OA==","repeats":30},{"count":72001394,"lower_bound":"MjM1MDcwMg==","upper_bound":"MjM4NzI0Nw==","repeats":30},{"count":73201417,"lower_bound":"MjM4NzI2MA==","upper_bound":"MjQzMTUzMg==","repeats":30},{"count":74401441,"lower_bound":"MjQzMTY3OQ==","upper_bound":"MjQ3Nzc3MQ==","repeats":30},{"count":75601464,"lower_bound":"MjQ3ODkyOA==","upper_bound":"MjUxMjY5NA==","repeats":30},{"count":76801487,"lower_bound":"MjUxNTYxNA==","upper_bound":"MjU1MDI3Nw==","repeats":30},{"count":78001510,"lower_bound":"MjU1MTc5Mg==","upper_bound":"MjU4ODU5Mw==","repeats":30},{"count":79201534,"lower_bound":"MjU4ODk0OQ==","upper_bound":"MjYyODYxNw==","repeats":30},{"count":80401557,"lower_bound":"MjYzMDc1MQ==","upper_bound":"MjY2NTc0Mg==","repeats":30},{"count":81601580,"lower_bound":"MjY2NTgzNA==","upper_bound":"MjY5ODMxMw==","repeats":30},{"count":82801603,"lower_bound":"MjY5OTAyMQ==","upper_bound":"MjczNDQ4NA==","repeats":30},{"count":84001627,"lower_bound":"MjczNjM1Mw==","upper_bound":"Mjc3MDI5Mw==","repeats":30},{"count":85201650,"lower_bound":"Mjc3MTI3OQ==","upper_bound":"MjgwMzgzOQ==","repeats":30},{"count":86431674,"lower_bound":"MjgwNDQ5MQ==","upper_bound":"Mjg0MDQ3Mw==","repeats":30030},{"count":87631697,"lower_bound":"Mjg0MDUzNQ==","upper_bound":"Mjg5MTQwMQ==","repeats":30},{"count":88831720,"lower_bound":"Mjg5Mjc4OA==","upper_bound":"MjkzMzI5NA==","repeats":30},{"count":90031743,"lower_bound":"MjkzNTE2NQ==","upper_bound":"Mjk2NDYxOQ==","repeats":30},{"count":91231767,"lower_bound":"Mjk2NDk0Mg==","upper_bound":"MzAwNjExMw==","repeats":30},{"count":92431790,"lower_bound":"MzAwNzU4Nw==","upper_bound":"MzA1ODQ4Nw==","repeats":30},{"count":93631813,"lower_bound":"MzA1OTI2MA==","upper_bound":"MzEwNTc4Nw==","repeats":30},{"count":94831836,"lower_bound":"MzEwNzIwMw==","upper_bound":"MzE0Mjk2OA==","repeats":30},{"count":96031860,"lower_bound":"MzE0NDQ3OQ==","upper_bound":"MzE4NDg5OA==","repeats":30},{"count":97231883,"lower_bound":"MzE4NTkxMw==","upper_bound":"MzIyMjMyNw==","repeats":30},{"count":98431906,"lower_bound":"MzIyMzU0Mw==","upper_bound":"MzI1NzQ0Mg==","repeats":30},{"count":99631929,"lower_bound":"MzI2MDY1Nw==","upper_bound":"MzMwNTc2OQ==","repeats":30},{"count":100831953,"lower_bound":"MzMwNjE5OQ==","upper_bound":"MzM1Mjg1NA==","repeats":30},{"count":102031976,"lower_bound":"MzM1MzMzMQ==","upper_bound":"MzM5NTEyMg==","repeats":30},{"count":103231999,"lower_bound":"MzM5NzAxNA==","upper_bound":"MzQzNzk2NQ==","repeats":30},{"count":104432022,"lower_bound":"MzQzNzk4NA==","upper_bound":"MzQ2NjAzNA==","repeats":30},{"count":105632046,"lower_bound":"MzQ2Njg0Mw==","upper_bound":"MzUwMTI2Mg==","repeats":30},{"count":106832069,"lower_bound":"MzUwMTQwMA==","upper_bound":"MzUzNDgwMw==","repeats":30},{"count":108032092,"lower_bound":"MzUzNDgzMw==","upper_bound":"MzU2OTE4MQ==","repeats":30},{"count":109232115,"lower_bound":"MzU2OTc4Mg==","upper_bound":"MzYyNDY5OA==","repeats":30},{"count":110432139,"lower_bound":"MzYyNDc0NA==","upper_bound":"MzY2MDYzNA==","repeats":30},{"count":111632162,"lower_bound":"MzY2MTY4OQ==","upper_bound":"MzcxMTY0NA==","repeats":30},{"count":112832185,"lower_bound":"MzcxMTg1MA==","upper_bound":"MzczNzY2NQ==","repeats":30},{"count":114032208,"lower_bound":"MzczOTM5Mw==","upper_bound":"Mzc3MzI0MA==","repeats":30},{"count":115232232,"lower_bound":"Mzc3Mzk2OQ==","upper_bound":"MzgxOTgxOA==","repeats":30},{"count":116432255,"lower_bound":"MzgyMTIxNg==","upper_bound":"Mzg2MTI3NA==","repeats":30},{"count":117632278,"lower_bound":"Mzg2MjM2Mg==","upper_bound":"Mzg4NjkwNQ==","repeats":30},{"count":118832301,"lower_bound":"Mzg4NzI2Mg==","upper_bound":"MzkzMTIwOA==","repeats":30},{"count":120032324,"lower_bound":"MzkzMjI2OQ==","upper_bound":"Mzk3Nzg2NQ==","repeats":30},{"count":121232348,"lower_bound":"Mzk3ODQ3Mg==","upper_bound":"NDAzMDE0MQ==","repeats":30},{"count":122432371,"lower_bound":"NDAzMDY0Mw==","upper_bound":"NDA2NDU2MA==","repeats":30},{"count":123632394,"lower_bound":"NDA2NDY1OQ==","upper_bound":"NDA5ODEwOQ==","repeats":30},{"count":124832417,"lower_bound":"NDA5ODc4OA==","upper_bound":"NDEzOTM5OQ==","repeats":30},{"count":126032441,"lower_bound":"NDEzOTY0MA==","upper_bound":"NDE4MTYzNQ==","repeats":30},{"count":127232464,"lower_bound":"NDE4NTIwNQ==","upper_bound":"NDIzMTU2Ng==","repeats":30},{"count":128432487,"lower_bound":"NDIzMTcxNA==","upper_bound":"NDI4NTUxNg==","repeats":30},{"count":129632510,"lower_bound":"NDI4NTkwMQ==","upper_bound":"NDMyMzg2Mw==","repeats":30},{"count":130832534,"lower_bound":"NDMyNDg4Ng==","upper_bound":"NDM3ODU5MQ==","repeats":30},{"count":132032557,"lower_bound":"NDM3ODgwNQ==","upper_bound":"NDQyMzAzNg==","repeats":30},{"count":133232580,"lower_bound":"NDQyNDgyNQ==","upper_bound":"NDQ3NjE1Nw==","repeats":30},{"count":134432603,"lower_bound":"NDQ3NzM0Nw==","upper_bound":"NDUwMDcwNQ==","repeats":30},{"count":135632627,"lower_bound":"NDUwMTYxMw==","upper_bound":"NDUzODQyMQ==","repeats":30},{"count":136832650,"lower_bound":"NDUzODQ5OA==","upper_bound":"NDU4NzY2Ng==","repeats":30},{"count":138032673,"lower_bound":"NDU4ODM3OA==","upper_bound":"NDYxNTQ4NQ==","repeats":30},{"count":139232696,"lower_bound":"NDYxNTkwMw==","upper_bound":"NDY1NjYzNQ==","repeats":30},{"count":140432720,"lower_bound":"NDY1Njk4NA==","upper_bound":"NDY4OTkwNQ==","repeats":30},{"count":141632743,"lower_bound":"NDY5MDAyMg==","upper_bound":"NDcyOTk2NQ==","repeats":30},{"count":142832766,"lower_bound":"NDczMzI0Mg==","upper_bound":"NDc2OTAxMA==","repeats":30},{"count":144032789,"lower_bound":"NDc2OTc3NA==","upper_bound":"NDgyMDE2OQ==","repeats":30},{"count":145232813,"lower_bound":"NDgyMDU2Ng==","upper_bound":"NDg2NzQzMQ==","repeats":30},{"count":146432836,"lower_bound":"NDg2NzQ0Mw==","upper_bound":"NDkwMjc3OQ==","repeats":30},{"count":147632859,"lower_bound":"NDkwMzg2NA==","upper_bound":"NDk0MjgwMA==","repeats":30},{"count":148832882,"lower_bound":"NDk0Mjg4MQ==","upper_bound":"NDk4MTI1MA==","repeats":30},{"count":150032906,"lower_bound":"NDk4Mzg3OQ==","upper_bound":"NTAxNzQ5OQ==","repeats":30},{"count":151232929,"lower_bound":"NTAxNzU3MA==","upper_bound":"NTA3MDk5OQ==","repeats":30},{"count":152432952,"lower_bound":"NTA3MTE3NQ==","upper_bound":"NTExMDY1MA==","repeats":30},{"count":153632975,"lower_bound":"NTExMDkxNg==","upper_bound":"NTE1NDU1MA==","repeats":30},{"count":154832999,"lower_bound":"NTE1NTIxMw==","upper_bound":"NTE5MTE3Ng==","repeats":30},{"count":156033022,"lower_bound":"NTE5MTUzMw==","upper_bound":"NTIzNjAzNw==","repeats":30},{"count":157233045,"lower_bound":"NTIzNjc1Ng==","upper_bound":"NTI3OTAxMQ==","repeats":30},{"count":158433068,"lower_bound":"NTI3OTgxMg==","upper_bound":"NTMxOTcxMA==","repeats":30},{"count":159633092,"lower_bound":"NTMyMjQ3MA==","upper_bound":"NTM1MTIyOQ==","repeats":30},{"count":160833115,"lower_bound":"NTM1MTIzOQ==","upper_bound":"NTM4ODg0Ng==","repeats":30},{"count":162033138,"lower_bound":"NTM5MTI2NA==","upper_bound":"NTQyMjUwMA==","repeats":30},{"count":163233161,"lower_bound":"NTQyNDExMw==","upper_bound":"NTQ1Njk3Nw==","repeats":30},{"count":164433185,"lower_bound":"NTQ1NzUzOA==","upper_bound":"NTQ5OTAwMA==","repeats":30},{"count":165633208,"lower_bound":"NTQ5OTkwOA==","upper_bound":"NTU1MjI3Mg==","repeats":30},{"count":166833231,"lower_bound":"NTU1MjgzNA==","upper_bound":"NTU4NzU1OA==","repeats":30},{"count":168033254,"lower_bound":"NTU5MjYxMw==","upper_bound":"NTYzNTA1NA==","repeats":30},{"count":169233277,"lower_bound":"NTYzNzcwMw==","upper_bound":"NTY3NTY0OA==","repeats":30},{"count":170433301,"lower_bound":"NTY3NjI1MA==","upper_bound":"NTcwMzk0OQ==","repeats":30},{"count":171633324,"lower_bound":"NTcwMzk3OA==","upper_bound":"NTc0ODA0OQ==","repeats":30},{"count":172833347,"lower_bound":"NTc1MTM0Ng==","upper_bound":"NTc5MzE4OA==","repeats":30},{"count":174033370,"lower_bound":"NTc5NDQwNw==","upper_bound":"NTgzNzU2OQ==","repeats":30},{"count":175233394,"lower_bound":"NTgzOTg2MA==","upper_bound":"NTg3ODQ4OA==","repeats":30},{"count":176433417,"lower_bound":"NTg3OTE5OQ==","upper_bound":"NTkxMTQ2NQ==","repeats":30},{"count":177633440,"lower_bound":"NTkxMzE4NA==","upper_bound":"NTk0NTU3MQ==","repeats":30},{"count":178833463,"lower_bound":"NTk1MDIxMg==","upper_bound":"NTk4NDIyNg==","repeats":30},{"count":180033487,"lower_bound":"NTk4NTEwNA==","upper_bound":"NjAzNjkwMQ==","repeats":30},{"count":181233510,"lower_bound":"NjAzODA1Nw==","upper_bound":"NjA3NzY5Nw==","repeats":30},{"count":182433533,"lower_bound":"NjA3ODExOA==","upper_bound":"NjEzMzU3OQ==","repeats":30},{"count":183633556,"lower_bound":"NjEzNDEzNA==","upper_bound":"NjE2ODU3MQ==","repeats":30},{"count":184833580,"lower_bound":"NjE2ODU4NQ==","upper_bound":"NjIxMDQyMw==","repeats":30},{"count":186033603,"lower_bound":"NjIxMDYyOA==","upper_bound":"NjI1MDM2OA==","repeats":30},{"count":187233626,"lower_bound":"NjI1MTEzNQ==","upper_bound":"NjI4NTYzOQ==","repeats":30},{"count":188433649,"lower_bound":"NjI4NjI0OA==","upper_bound":"NjMzMzUzMg==","repeats":30},{"count":189633673,"lower_bound":"NjMzMzc5MA==","upper_bound":"NjM2OTY3Nw==","repeats":30},{"count":190833696,"lower_bound":"NjM3MDk3Ng==","upper_bound":"NjQwODI2OA==","repeats":30},{"count":192033719,"lower_bound":"NjQwOTU4Nw==","upper_bound":"NjQ0MjE5NA==","repeats":30},{"count":193233742,"lower_bound":"NjQ0MjIzOQ==","upper_bound":"NjQ4NDk5NQ==","repeats":30},{"count":194433766,"lower_bound":"NjQ4NTQzNA==","upper_bound":"NjUxNTcxMg==","repeats":30},{"count":195633789,"lower_bound":"NjUxNTcyNw==","upper_bound":"NjU2Njg1MA==","repeats":30},{"count":196833812,"lower_bound":"NjU2Njk1OA==","upper_bound":"NjU5ODU4MA==","repeats":30},{"count":198033835,"lower_bound":"NjU5OTQ0MA==","upper_bound":"NjYyNzI3NQ==","repeats":30},{"count":199233859,"lower_bound":"NjYyODgzMw==","upper_bound":"NjY2OTY1OQ==","repeats":30},{"count":200433882,"lower_bound":"NjY2OTc4Ng==","upper_bound":"NjY5ODY4Ng==","repeats":30},{"count":201633905,"lower_bound":"NjY5ODcyOQ==","upper_bound":"NjczODY2Nw==","repeats":30},{"count":202833928,"lower_bound":"NjczOTU3Ng==","upper_bound":"Njc3ODcyNQ==","repeats":30},{"count":204033952,"lower_bound":"Njc3ODk2MQ==","upper_bound":"NjgyMzM1OA==","repeats":30},{"count":205233975,"lower_bound":"NjgyNjMwNQ==","upper_bound":"Njg2NzkzOA==","repeats":30},{"count":206433998,"lower_bound":"Njg2Nzk0Mw==","upper_bound":"NjkwMzE1OQ==","repeats":30},{"count":207634021,"lower_bound":"NjkwMzM0MQ==","upper_bound":"Njk0Njg5Ng==","repeats":30},{"count":208834045,"lower_bound":"Njk0NzM1OA==","upper_bound":"Njk4NDIyNg==","repeats":30},{"count":210034068,"lower_bound":"Njk4NDcyMg==","upper_bound":"NzAxNzI0MA==","repeats":30},{"count":211234091,"lower_bound":"NzAxNzcwMA==","upper_bound":"NzA2MTUxMw==","repeats":30},{"count":212434114,"lower_bound":"NzA2MTY0MA==","upper_bound":"NzA5Njc0Nw==","repeats":30},{"count":213634138,"lower_bound":"NzEwMTEyMg==","upper_bound":"NzEzOTM4NA==","repeats":30},{"count":214834161,"lower_bound":"NzEzOTQzMg==","upper_bound":"NzE3OTUxNg==","repeats":30},{"count":216034184,"lower_bound":"NzE4MDk1OA==","upper_bound":"NzIyMzc1Nw==","repeats":30},{"count":217234207,"lower_bound":"NzIyMzg5NA==","upper_bound":"NzI1Mjk5MQ==","repeats":30},{"count":218434230,"lower_bound":"NzI1NDI0OA==","upper_bound":"NzI5NjQ0NA==","repeats":30},{"count":219634254,"lower_bound":"NzI5NjgzNA==","upper_bound":"NzMzODgyMQ==","repeats":30},{"count":220834277,"lower_bound":"NzM0MDkxMA==","upper_bound":"NzM4MTg0MA==","repeats":30},{"count":222034300,"lower_bound":"NzM4Mjk5NA==","upper_bound":"NzQyNDk3NQ==","repeats":30},{"count":223234323,"lower_bound":"NzQyNTY5NA==","upper_bound":"NzQ2NzIzOA==","repeats":30},{"count":224434347,"lower_bound":"NzQ2NzgxOQ==","upper_bound":"NzUyMTU2Mg==","repeats":30},{"count":225634370,"lower_bound":"NzUyMzE5NQ==","upper_bound":"NzU1MzE0Mw==","repeats":30},{"count":226834393,"lower_bound":"NzU1MzM2MQ==","upper_bound":"NzU4Nzk4NA==","repeats":30},{"count":228034416,"lower_bound":"NzU4ODkzOQ==","upper_bound":"NzYzMTk4OA==","repeats":30},{"count":229234440,"lower_bound":"NzYzMjYyMA==","upper_bound":"NzY4NTkxNg==","repeats":30},{"count":230434463,"lower_bound":"NzY4NjEzNg==","upper_bound":"NzcyODExMw==","repeats":30},{"count":231634486,"lower_bound":"NzcyOTU4Mw==","upper_bound":"Nzc3MTE5MA==","repeats":30},{"count":232834509,"lower_bound":"Nzc3MTkwMQ==","upper_bound":"NzgxMTgzMg==","repeats":30},{"count":234034533,"lower_bound":"NzgxMjE5MQ==","upper_bound":"Nzg1MzQ2Nw==","repeats":30},{"count":235234556,"lower_bound":"Nzg1MzUwNw==","upper_bound":"Nzg5NjAzOA==","repeats":30},{"count":236434579,"lower_bound":"Nzg5NzU4NQ==","upper_bound":"Nzk0NDY5OQ==","repeats":30},{"count":237634602,"lower_bound":"Nzk0NDc3Mw==","upper_bound":"Nzk3NzgzMQ==","repeats":30},{"count":238834626,"lower_bound":"Nzk3OTE2Ng==","upper_bound":"ODAxOTU4OQ==","repeats":30},{"count":240034649,"lower_bound":"ODAyMDYzMQ==","upper_bound":"ODA1ODE1NQ==","repeats":30},{"count":241234672,"lower_bound":"ODA1ODYzMA==","upper_bound":"ODA5OTQwNA==","repeats":30},{"count":242434695,"lower_bound":"ODEwMjM3OA==","upper_bound":"ODE0MDE4Mw==","repeats":30},{"count":243634719,"lower_bound":"ODE0MzAxNA==","upper_bound":"ODE3NDU1NA==","repeats":30},{"count":244834742,"lower_bound":"ODE3NTg1OQ==","upper_bound":"ODIxNDExNA==","repeats":30},{"count":246034765,"lower_bound":"ODIxNDU2Nw==","upper_bound":"ODI1OTg3Mg==","repeats":30},{"count":247234788,"lower_bound":"ODI2MDQzNg==","upper_bound":"ODMwMjQ3NA==","repeats":30},{"count":248434812,"lower_bound":"ODMwMjkyMw==","upper_bound":"ODM0MTAzNA==","repeats":30},{"count":249634835,"lower_bound":"ODM0MTkzMQ==","upper_bound":"ODM3NDgyNQ==","repeats":30},{"count":250834858,"lower_bound":"ODM4MDMwMA==","upper_bound":"ODQxNTQ0OA==","repeats":30},{"count":252034881,"lower_bound":"ODQxNjI4Mw==","upper_bound":"ODQ0NzQ3OA==","repeats":30},{"count":253234905,"lower_bound":"ODQ0NzY0OQ==","upper_bound":"ODQ3ODIzMg==","repeats":30},{"count":254434928,"lower_bound":"ODQ3ODk1NQ==","upper_bound":"ODUyODc4OQ==","repeats":30},{"count":255634951,"lower_bound":"ODUyOTI4OQ==","upper_bound":"ODU1OTQzNg==","repeats":30},{"count":256834974,"lower_bound":"ODU2MTkwOA==","upper_bound":"ODU5NjQ1MQ==","repeats":30},{"count":258034998,"lower_bound":"ODU5ODA4Ng==","upper_bound":"ODY0MTQxNQ==","repeats":30},{"count":259235021,"lower_bound":"ODY0NzUwMw==","upper_bound":"ODY3ODQ3NA==","repeats":30},{"count":260435044,"lower_bound":"ODY3OTI1OQ==","upper_bound":"ODcyMDA2Nw==","repeats":30},{"count":261635067,"lower_bound":"ODcyMDIxMQ==","upper_bound":"ODc0ODQ5Mw==","repeats":30},{"count":262835091,"lower_bound":"ODc1MTk3OA==","upper_bound":"ODc4NjkyMw==","repeats":30},{"count":264035114,"lower_bound":"ODc4Nzg5NA==","upper_bound":"ODgyNjA3Mw==","repeats":30},{"count":265235137,"lower_bound":"ODgyNjc4OQ==","upper_bound":"ODg1OTk5NA==","repeats":30},{"count":266435160,"lower_bound":"ODg2MDI0NA==","upper_bound":"ODg5MzM5NA==","repeats":30},{"count":267635183,"lower_bound":"ODg5Mzk0OQ==","upper_bound":"ODkzNjg3Ng==","repeats":30},{"count":268835207,"lower_bound":"ODkzNzIwMA==","upper_bound":"ODk2OTYxNg==","repeats":30},{"count":270035230,"lower_bound":"ODk3MDYxNQ==","upper_bound":"OTAxMjkyMg==","repeats":30},{"count":271235253,"lower_bound":"OTAxMzQxNA==","upper_bound":"OTA0MTY2NQ==","repeats":30},{"count":272435276,"lower_bound":"OTA0MTkwNA==","upper_bound":"OTA4Nzk2NQ==","repeats":30},{"count":273635300,"lower_bound":"OTA4OTAzNg==","upper_bound":"OTEyNzUyNA==","repeats":30},{"count":274835323,"lower_bound":"OTEyNzg2Mg==","upper_bound":"OTE2NjcxMA==","repeats":30},{"count":276035346,"lower_bound":"OTE2OTAwMA==","upper_bound":"OTIwNDI5OQ==","repeats":30},{"count":277235369,"lower_bound":"OTIwNDg4OA==","upper_bound":"OTIzOTIwNw==","repeats":30},{"count":278435393,"lower_bound":"OTIzOTM2MA==","upper_bound":"OTI3ODE3Mw==","repeats":30},{"count":279635416,"lower_bound":"OTI3ODUxMw==","upper_bound":"OTMyMzg5OQ==","repeats":30},{"count":280835439,"lower_bound":"OTMyODExNw==","upper_bound":"OTM2NzQ1Ng==","repeats":30},{"count":282035462,"lower_bound":"OTM2OTc1NA==","upper_bound":"OTQwMTY3Mg==","repeats":30},{"count":283235486,"lower_bound":"OTQwMTkzOQ==","upper_bound":"OTQ0MzcwOQ==","repeats":30},{"count":284435509,"lower_bound":"OTQ0MzgzOA==","upper_bound":"OTQ4OTc1NA==","repeats":30},{"count":285635532,"lower_bound":"OTQ5MDE3OQ==","upper_bound":"OTUyMjgzMA==","repeats":30},{"count":286835555,"lower_bound":"OTUyMzU3OA==","upper_bound":"OTU2MTk4Nw==","repeats":30},{"count":288035579,"lower_bound":"OTU2MjA2NA==","upper_bound":"OTYwNTgxNg==","repeats":30},{"count":289235602,"lower_bound":"OTYwNTk3MA==","upper_bound":"OTY1MjE0MQ==","repeats":30},{"count":290435625,"lower_bound":"OTY1MjMzMQ==","upper_bound":"OTY5MjQyOA==","repeats":30},{"count":291635648,"lower_bound":"OTY5MjczMQ==","upper_bound":"OTczMTY0OQ==","repeats":30},{"count":292835672,"lower_bound":"OTczMjcyNQ==","upper_bound":"OTc2MzY1Mg==","repeats":30},{"count":294035695,"lower_bound":"OTc2NzA2Mw==","upper_bound":"OTgwNDk2OA==","repeats":30},{"count":295235718,"lower_bound":"OTgwNjM3MA==","upper_bound":"OTgzNDk1Mg==","repeats":30},{"count":296435741,"lower_bound":"OTgzNjI0MA==","upper_bound":"OTg3MzEyOQ==","repeats":30},{"count":297635765,"lower_bound":"OTg3MzY3Nw==","upper_bound":"OTkxMTk5Ng==","repeats":30},{"count":298835788,"lower_bound":"OTkxMjA4OQ==","upper_bound":"OTk1NjI0Ng==","repeats":30},{"count":300005811,"lower_bound":"OTk1Njg3Nw==","upper_bound":"OTk5OTk2MQ==","repeats":30}]},"cm_sketch":{"rows":[{"counters":[144301,144461,148969,145576,146966,147070,148601,150561,146854,148397,147941,145284,149619,144779,142629,147245,145958,144054,148954,143106,149606,148795,147123,148627,148339,144256,149579,144383,147096,148805,145426,146035,145238,146213,147986,146010,144193,147961,147399,148731,149833,142714,148361,144938,145469,144866,147303,143522,141663,148555,146673,142594,146686,147764,142775,139686,148285,144636,145504,144405,146663,146001,145741,144177,145553,147860,147344,147149,146487,145941,143642,144677,145221,152433,147900,149217,145910,146736,146802,146155,145803,146591,151410,148556,149537,148794,144825,146024,146293,150605,146350,142977,147117,150436,148006,144773,146334,144165,149369,148712,146596,147871,148454,143458,147588,146922,149326,148129,146001,147634,143620,147688,148243,144613,146784,148813,146554,149288,147762,149193,144762,144084,146379,146649,147168,148703,149958,144273,144744,147976,147362,148426,144509,145128,147081,149248,149370,147249,149071,144488,145824,147016,146150,148401,145315,144625,143509,149420,146790,146672,145708,148737,146571,143649,148957,145523,148020,153509,146404,148047,147094,149090,143436,145249,144635,146225,149941,141884,149180,147027,148858,145094,148127,144598,149623,146163,148428,148168,148953,146656,144295,145476,148009,146400,142540,145317,146093,145358,145978,145628,151343,149230,148180,145423,146181,145058,147121,142693,144885,142760,147189,147411,146127,151066,145172,151009,146973,145838,146614,145971,141973,147923,148882,151789,144429,147577,142533,144956,144213,145065,147221,149784,147624,146273,147014,151289,144981,145182,148647,149222,152074,147508,146447,147848,146116,141509,147404,145944,145486,146888,149691,145927,143424,148470,146868,147451,145397,149641,143223,145184,144463,150609,148770,143209,150909,141295,147137,148682,146718,146809,147159,148856,144271,144252,146851,145740,146980,143648,147863,148532,145543,146187,146480,146887,145971,148496,147045,146957,147128,144879,148637,152206,143180,145428,146847,146847,144670,145132,145969,147221,146375,142628,143882,145315,142903,146633,147390,147020,148138,144298,143316,144978,144147,147410,151397,143469,149274,147280,149028,147790,145708,141990,142782,150079,145662,142594,145661,146261,146697,144469,147100,145908,142445,146522,146229,143143,146369,145608,147381,148145,145068,144788,145225,144232,144800,144831,144106,143339,143413,147640,144808,146168,145397,146969,147865,148655,146027,146367,145755,145387,148720,146461,143600,149633,144143,148560,149136,148496,151883,149687,145885,146502,146473,144886,144837,145599,146944,149308,144660,147281,146054,145441,147366,142675,146739,146633,143962,148855,145882,151055,145976,143382,146717,149356,149734,144992,143865,150033,143082,147408,146160,140475,145210,146606,144374,145024,148836,143874,141970,145395,146566,142878,145564,145748,146349,147345,142991,145741,146451,141531,146487,144467,146540,146528,143800,144654,147894,145810,147428,151980,145722,143385,144626,147407,147380,149778,146149,144497,148216,147021,146046,149410,146102,147645,147817,144196,143278,152955,145356,145566,147984,145062,145891,146622,143636,152664,147253,146762,146284,148002,144725,144743,144031,149090,143082,145192,148275,149677,144453,145616,147347,148351,149614,144894,145292,145615,148157,145901,149144,146720,143357,148256,145927,148932,145928,144862,146182,147449,145693,145790,146312,145528,146132,145980,147011,143709,145072,151505,146722,145513,146678,148155,147877,151091,148320,145795,147198,148895,148331,142024,145852,144136,152518,150480,148177,145582,148260,141218,145086,143159,146868,145339,143128,146652,143774,147817,147520,143333,146847,145693,145656,151249,143257,146003,148460,150746,145794,146413,149571,146597,147551,143243,148715,143377,148259,144752,143696,144892,143877,144215,143922,142378,150654,145842,147213,145236,143634,147899,148319,151949,144353,144840,147597,147101,146538,145003,147274,144876,144532,143695,144228,148517,147750,145452,149707,146833,146463,145126,146136,146168,146566,144692,144797,146909,145961,146913,144897,146555,150009,145931,145796,146531,147891,149753,149087,146581,150242,147358,148804,147972,148215,142124,149116,150041,149586,147136,147665,144113,146646,147267,144077,148171,147166,148745,148635,146231,147216,146014,146433,147862,144060,148880,149312,150531,145376,144383,148900,148209,146051,146263,144930,146356,142708,143979,143599,145679,144417,150876,146783,146699,147027,145521,146342,147829,145341,149208,145520,147807,143111,147367,142859,146122,145051,146671,144524,145554,143980,146995,144205,146703,146270,147936,145473,143449,148270,145633,145911,145707,144415,149023,146368,146322,143271,150101,148059,145943,144590,145432,145488,145754,147116,147782,146954,144431,145233,140927,147926,149480,147514,142717,148630,147301,143457,141843,144255,148027,148384,146119,145711,143428,143496,147626,146223,145777,148000,151276,145954,149232,147361,144295,148869,145539,144201,143100,147005,147742,146471,149715,145731,145870,147702,148156,148903,147332,144130,146837,144506,145952,147630,145895,146104,149500,144357,146183,149980,146687,147911,151173,144287,145180,146224,144838,146097,145166,146459,145549,142410,148905,147859,145071,144123,148266,149014,147809,146301,143714,145538,145723,146823,148228,148548,144246,147195,145387,146792,148961,146283,145484,141872,147702,148725,144483,145677,146367,142943,147571,147877,143391,145733,148568,146055,145595,147229,145453,144633,149252,147126,148929,141241,147303,146156,145693,143815,146942,144837,146272,142550,144784,146479,148587,145191,146999,145462,148869,149860,151498,145034,145333,152447,148258,149129,148100,146026,149872,146024,148506,147711,145748,147092,145305,146093,148611,146983,146234,146130,145714,142038,146425,143682,151157,143453,146893,146520,146789,143734,144498,147846,142373,147856,149030,150898,147004,145297,142801,146805,148092,145822,148374,146175,145434,147216,146975,147070,146334,143889,149767,144269,147786,148794,142701,146934,143797,146832,146350,148145,150955,144093,143506,147445,145771,151173,145606,146924,144509,145318,146524,146290,148085,144709,146354,147100,144590,149229,146255,149454,147751,145682,146188,146512,147714,148869,146534,143864,147193,146266,145932,147586,143600,144298,143018,148748,145244,148831,145549,147136,147507,147445,145830,148762,147646,145882,147988,145359,147189,144653,146097,149967,145870,145124,145939,144159,148885,148244,146198,145463,146222,146739,149482,146900,148634,146739,148903,148387,145551,148932,141958,147896,147816,148092,152090,144867,145401,149888,149243,146168,149506,147136,147002,143585,145608,149375,146498,146525,143664,147696,146111,148842,147846,145983,150665,143987,146593,145776,150638,147577,146304,151076,146699,143545,148721,144821,144263,147245,150604,144393,144341,148389,145169,145175,144217,146720,146149,144386,147882,147058,149626,148213,146113,146816,144906,143577,145916,143915,146914,149896,141818,151904,149685,146217,147379,139405,148379,148131,150773,145959,146077,146495,147755,146884,144415,148344,143768,146392,147686,145894,146200,148479,144240,146790,143619,149204,142617,150279,144343,142163,145454,146063,145643,146055,147585,145726,144575,143492,142984,147429,147517,145031,148796,148307,146033,143301,149505,145498,147126,148215,147180,149177,147493,147564,148444,146727,146315,146806,145357,148531,146637,146543,148426,144179,144136,146141,149363,149214,146641,144192,150576,143474,149354,149480,145816,144036,144729,145877,149299,145028,146428,146309,149121,146400,145784,149704,147074,146231,143263,145949,149905,147513,145978,146776,145297,143625,144961,147967,146965,148688,144444,147816,142597,144543,147533,144136,147155,146715,140618,141541,145417,148736,148227,148185,144144,146641,144948,146472,145968,144777,146746,141671,150175,145025,148440,142442,146679,147841,148221,145932,147088,147053,146908,145529,143566,149554,148488,148524,148301,146580,148520,143865,149663,148048,145966,144754,144183,147511,146338,147043,146339,143111,142933,145847,149427,144840,148147,147329,145576,147086,147914,148974,143237,151363,144454,143856,145632,149570,147677,153501,142718,146932,144843,147379,147324,143104,146770,147688,143724,148622,145386,147356,143028,147575,149496,145464,146555,148844,146233,147510,148287,149878,148112,147667,148558,149074,144068,146907,142958,146086,147419,147205,152651,146828,147244,144958,148415,145863,147253,147746,148128,147333,146810,146710,147849,145850,148705,145780,141606,146301,143503,147259,147187,145557,144834,149786,146520,142390,147687,146505,150029,147000,146671,147257,150489,146492,146649,145464,146341,148664,145904,149226,145008,143373,144536,142740,153211,147426,144580,142712,145903,149708,148827,146549,143127,144379,146368,146210,145366,144239,146826,142102,144932,145911,147481,147563,151602,144214,149329,145411,143615,150114,145508,148158,146666,141314,147348,144597,147378,145286,144716,145592,144393,146983,145394,142062,145729,144215,150155,147666,146964,149541,146869,147240,150066,147645,143916,145778,145058,142985,147503,148683,148731,145374,148879,151310,151706,149276,144347,145717,146299,145722,144379,144042,147596,147731,144345,144714,148860,149146,148384,141863,146878,146317,148138,143801,151209,144099,143875,147645,141591,144867,144250,142701,148011,148784,143216,148275,137777,148748,145371,143820,148203,143504,146050,147765,147527,147408,144238,144564,147510,149708,146818,149202,149444,143818,146926,144950,146064,144537,145297,145064,145624,147742,145587,146427,149685,145208,144381,147262,149439,148909,148316,143716,146898,150796,144238,146701,143294,143633,149366,148251,149047,147066,146281,147053,144347,145483,149372,147456,148560,144159,145654,146827,146762,148420,147030,146031,149200,144923,148062,147525,143136,149002,143850,149570,148684,149701,142300,149815,148088,146488,145244,145845,147697,143717,146738,147816,144725,149253,142476,148168,148911,143016,147348,145974,148698,148990,146493,145642,143416,141466,147475,146400,142067,142796,150010,144194,144386,145005,146995,148810,142756,145443,146308,146479,148288,147498,145250,145923,147995,144770,145773,145211,145651,146688,145587,146646,149477,149687,145996,146622,149185,149310,147262,143084,144040,147131,148776,148515,146981,146602,148311,144680,148504,146747,149627,145709,142357,142438,146928,145954,147059,145955,145073,144345,147909,145446,148211,148820,149472,147043,145313,145015,143821,145606,147469,144953,147611,142759,145375,146707,146725,148179,142467,146437,148758,146490,147159,150008,144580,144020,148386,147095,147767,144265,149132,144619,146294,147407,145536,143466,144284,147564,144992,150374,145902,146533,143869,140715,145596,147914,146333,145198,144502,145949,145564,145612,144975,146328,147480,147043,148881,150893,144592,146684,147373,144023,144673,150398,149150,147467,145485,145055,148822,145195,147524,147566,149196,148209,147852,146414,148647,151934,146683,148861,144137,142598,148659,148191,147204,144268,148280,145568,146417,143209,148321,146752,145853,146895,148757,147412,145361,147308,146533,143853,146213,147241,146482,147195,144306,144892,145131,145591,143349,148800,142885,143031,146119,145625,146483,145488,143559,144728,148299,150283,147480,143436,146451,145985,145846,147253,148678,147836,154080,149608,145223,149162,146852,148143,148541,149385,148259,145023,144935,148460,143603,148986,143864,145198,145880,147654,149086,144551,144401,144798,144981,147043,148844,149420,147653,142015,148258,149597,143635,144852,147320,145936,144941,143982,147967,144913,148944,147008,150118,144064,147018,142410,148783,144957,143561,145062,147206,144372,147590,145735,149875,148735,144630,147321,142107,145498,144322,148454,147379,147108,147690,144745,146289,144982,150593,145055,144185,141908,144137,142199,146182,145913,147557,148402,147862,142716,147498,146386,148242,146088,147566,144107,144797,145968,146490,144999,147163,147196,145334,144907,147114,149989,146710,140647,149429,145198,148414,146078,146747,144360,144997,146606,147627,144810,146205,150066,145336,146028,143577,145548,146609,145748,147244,142300,147870,150491,147176,143955,148818,143458,141966,146366,145499,148809,145812,147043,146030,147169,144226,144802,145735,144542,146892,146914,147647,148085,144098,145413,145033,144494,145252,144328,146641,143666,145512,144778,149275,147778,148103,152010,147634,146983,143872,144410,147518,146430,144410,147381,144623,148226,146815,144193,148039,148484,145490,148956,146137,146164,147133,146532,150926,149768,144206,146329,146850,147085,145819,148401,143902,146915,143570,152159,143915,144471,147368,145887,148150,147975,146869,146122,147285,142062,146246,147344,144772,142320,147943,147922,147798,144122,144325,148915,145754,145532,146444,145953,148348,148995,147214,146942,146678,145966,145960,145770,151989,147743,145649,143810,145753,144966,149568,147764,144871,146550,146951,146406,144157,146099,142518,145442,147028,145082,147517,145977,148349,143254,149833,146528,145752,147282,146643,149866,146273,142708,148255,148756,145627,147499,145806,146849,148276,142045,146773,148213,146422,143313,146820,147556,147066,147798,143910,150182,146559,145983,146398,146795,147952,147040,147568,144599,143467,145901,145717,143211,146650,146657,144584,144639,145851,146010,146576,146844,146905,146618,144864,145465,146037,148680,147054,148273,148455,148960,143198,146973,147257,144502,147555,147755,144431,145833,148414,149049,146580,148754,142510,147387,146967,146081,146110,150193,148588,147726,146465,143585,149311,142848,145975,144933,147538,147113,146448,148167,145096,145029,148542,148790,148918,146077,147904,147554,148073,148285,150312,143322,149667,148189,146989,145100,139814,146034,151257,149430,148411,142862,147906,147002,150378,145935,146215,147948,148359,146678,144311,147203,144378,148266,145792,144385,147558,148231,149249,147836,143465,147170,146920,148669,146805,147664,148966,144793,145357,144427,146653,147761,144833,147707,145529,147262,147569,145943,142379,147149,147791,146134,149795,145122,148800,144042,147326,145658,145557,143690,148316,147547,144096,146615,148017,147304,144971,143622,145222,148395,144738,148879,147280,148300,147740,146662,142812,144048,145916,143807,144407,149117,143196,145609,150373,145557,147677,150625,150366,146283,149192,145027,145172,148665,140526,147231,149325,146330,147064,143985,145869,144098,145747,144377,143049,149387,147269,145159,145060,145075,148521,142245,148545,145464,144273]},{"counters":[144848,145411,145038,145663,147166,146194,146057,145217,147851,147358,145990,146211,146737,142374,145752,147012,143800,148014,147427,142360,147742,147493,147397,144919,145524,142919,146101,149668,145933,146038,148249,144525,145725,144590,140957,147270,143684,146656,145851,142712,143525,146896,145266,147775,143724,145897,147188,145685,141337,144270,144895,141407,145218,145367,145992,142278,147319,145249,146968,147669,142388,148299,147542,141322,145564,148499,146672,146470,140929,143263,147440,142592,146312,144687,146469,146996,149062,147789,147395,146554,145664,148218,149651,144809,146479,144134,148351,145659,148346,141489,148971,149510,144209,146933,144023,145126,149187,146763,145697,143971,146898,145984,149097,149095,144354,147122,147597,148906,143227,148043,146912,144065,144196,144909,148207,145255,146383,148246,148386,147058,149426,148534,145591,145903,149369,147834,147492,143860,146259,147568,144522,144849,145821,145405,150218,148252,144880,142567,143533,145648,147835,146258,146213,147726,145728,145611,145548,147058,145643,146004,146805,150563,147818,144145,146003,142822,144828,145163,144375,143387,147622,151233,145406,145833,146449,148409,146072,149452,148722,149884,146793,146215,143296,147034,151187,146653,147525,146926,142438,148692,147424,146687,142145,144630,146568,148795,144876,147979,147970,144919,146413,148752,145211,146082,142935,146157,146433,149283,143932,149289,146936,145238,147726,143729,148076,147615,143586,149075,149084,147514,143635,145210,145963,151394,145484,145325,146025,145503,146439,151743,146782,145935,143541,145617,144918,144740,149044,144475,145453,146207,146062,145537,144795,144549,142512,144844,147165,148575,145790,149708,147604,144440,142986,149378,147162,143916,145157,149355,144380,146796,147759,144350,148330,145613,146809,148153,147322,145212,144972,148096,148741,147457,144002,145983,146268,148759,149474,141571,148474,145352,144439,147593,150848,146292,145192,149048,147754,144140,146825,148614,143504,145161,150159,146654,146844,145770,147866,144373,144506,147915,147202,144387,145054,144140,149562,146560,147827,142709,143353,144408,146724,147903,145698,147650,145796,148511,146188,146057,144794,145097,148135,147921,140197,144729,142818,146954,148016,145365,150186,148179,149720,144645,144849,151868,144727,146636,147631,143993,150346,145846,146697,146859,143675,148438,142768,146574,144193,143741,145122,148870,146187,145800,144775,147883,144900,146534,145740,150284,146356,146680,144686,146175,146077,146119,147474,145639,142850,149544,147309,147678,147751,147091,147158,147964,147954,144909,146498,148259,144863,146015,148470,146691,146204,145211,149052,147291,148695,147922,143733,146716,142907,151553,141727,145523,148212,146911,144005,148827,148442,144231,144856,148066,148040,150569,145345,145872,145999,142287,148254,144457,143553,147519,148865,143511,147551,145673,147907,142796,148318,147878,144458,147039,144411,146461,146727,145327,147657,143494,145041,146565,143298,152460,144131,147876,145921,147483,147357,143653,145653,143963,148966,146320,148687,146011,145370,146156,149123,147233,148546,141687,143344,143127,150390,149077,146585,143631,145811,145519,146634,143508,149737,148111,143914,144263,146970,146023,145472,145170,149264,147056,145895,146826,146143,145288,144030,147321,146279,146626,147396,145884,147843,144492,142955,146982,145344,146962,144825,145498,148263,148425,146311,147495,147847,147301,145205,146238,148205,144452,144239,144419,149223,146671,146796,145113,146427,145965,146880,143376,141728,145890,145673,142329,144675,150376,143057,146820,148145,147386,145821,145366,143764,143128,149634,146233,145617,146784,145155,148918,146108,147845,146537,147242,147864,148294,146327,145408,142488,143043,147694,151152,143799,146129,146307,146284,147992,146038,145318,147181,145602,148315,146519,146529,146792,146945,146187,145264,145435,143860,146234,149072,144476,146887,145046,147735,147610,145582,146743,146713,145930,148369,147111,145004,147073,146812,148164,143181,145226,145498,143346,147241,146115,143056,145282,150586,143948,145737,147638,146834,148448,144316,147010,151807,149952,144408,143467,147258,147388,148028,148210,147538,149780,146744,146857,145838,146451,150813,148167,144889,145296,146405,146417,147009,144105,151161,148079,148003,147763,147844,143319,141747,147669,145073,148460,145121,146922,144652,144079,148482,146195,149930,148027,149076,147252,147654,142316,147148,146080,148208,145167,145933,146392,145895,144642,144206,145926,145804,144435,143914,145221,146079,147954,147887,145927,151163,146288,148186,148742,143320,145058,143740,143041,145913,145966,144932,147831,144116,149196,144043,142743,150111,141951,148653,148095,149500,147141,147614,149533,147431,149964,147144,144880,151156,146881,147309,147941,149479,144053,146930,144755,147109,145528,147065,145551,146025,149242,146541,150205,149233,148017,142398,145676,144993,149205,146184,145637,149692,145354,146330,146911,143400,144083,147501,144778,149905,146681,147000,147227,145265,145892,143536,143925,142467,146051,149034,146500,144579,145673,145531,150160,151122,149190,147634,146983,143453,144627,144603,149035,149651,147683,147982,148959,143990,145943,149964,147602,146929,144325,147012,146318,146056,146611,142874,146422,147211,148529,143411,146666,145532,148345,143062,144819,149875,145784,147806,144321,148395,146870,145517,148573,146568,147542,146861,146296,145431,146375,145364,143534,148541,141907,149468,146893,147785,148576,143368,144814,148545,143202,147810,149893,145343,150741,148266,144955,141154,145874,148232,149599,145055,144991,145168,144505,142921,149358,142828,145521,146213,145810,148776,151043,145517,148132,146788,144327,146724,148977,147951,146454,147127,147172,147199,147780,150293,146614,150654,143937,146212,145197,142898,145731,146417,147243,149668,151071,150865,149087,148474,145403,148568,145025,149640,146907,146225,149544,147350,141699,147635,146288,143901,147070,147048,145370,147130,149123,144181,146593,147104,149147,145587,151550,146064,144758,147440,147464,143788,147834,147860,144353,151274,147537,145177,146693,145000,147332,148950,145378,149334,146448,147554,144751,146541,144984,143925,147821,148980,146850,143421,143975,147083,145790,148577,149427,146362,147935,146922,141435,148556,151426,147098,144784,150160,146568,145591,144026,149982,148419,144997,145931,142900,141745,145389,146280,144326,147177,146588,143280,145531,146569,147519,146120,145411,144241,147726,146127,147621,149719,148332,149915,144720,148569,146309,147825,146909,146483,146711,149329,149351,145384,145852,148045,142685,146996,145014,148203,141301,145552,149207,145819,147821,148792,145326,148845,142869,149336,149407,145537,146356,141336,146790,144196,146353,147135,147007,142193,148042,145740,148743,148937,147541,145854,148703,148993,147661,147517,148860,145281,149500,145810,146749,148568,147545,148326,149876,147542,146791,150930,145620,144865,147180,144185,144992,143005,147885,146691,148981,146427,148340,148497,144105,147354,146176,148697,146179,149207,149661,147071,145412,146173,146129,140711,146419,141907,146786,146484,144132,145056,146762,147781,145788,145702,146034,146123,148318,142890,144862,145165,150542,146488,147238,144138,146460,146876,148574,145599,145177,146934,144420,148821,147906,146853,145590,144983,142786,144148,147853,145447,151392,145137,141823,146221,148685,142514,146922,148782,142644,145522,145093,149026,147801,143673,148325,143772,142593,152628,145713,147732,146016,149816,142366,144568,151695,143775,147538,148172,146856,147538,145094,150601,143525,148993,147873,146346,146283,147490,147935,147098,147160,145103,142715,142177,146470,146924,145406,150451,147052,144081,146859,145126,147539,145556,149192,144478,144747,144522,146846,144989,146158,148605,145124,149206,143706,149876,144971,146405,143308,145227,144893,148584,145751,146734,145394,144685,147714,145670,147837,147225,144875,149998,147718,143381,149037,145047,142978,147364,147008,141484,145122,150575,149577,150193,148955,148072,147098,144424,145965,149880,147521,148682,145835,145770,147399,146747,147594,143040,146380,145350,148604,146875,146059,146250,145452,147911,146485,145996,148243,145806,145075,146683,147292,144736,146311,143721,144946,145595,148083,142667,147525,144635,149378,142546,147660,149341,148459,143771,150045,143878,144282,147315,148776,147743,146218,153339,146123,147288,147044,147593,147689,145924,145114,145911,147406,148401,143068,145475,145823,146562,149957,145958,147501,148046,144083,146006,147192,147930,148537,145012,142544,144356,145004,151799,147859,145626,149248,145531,148744,142268,146652,143009,146661,144603,147730,151043,147397,149046,146156,150028,147661,150079,145964,147362,149498,146181,146557,145962,146276,147381,145257,143179,146651,144797,145393,146805,146249,149011,146916,150440,148813,149073,145082,144994,149026,147625,145354,146740,147494,148664,148341,144850,145459,143206,148738,143601,147102,146911,148569,143288,143306,149643,144345,141678,142416,144875,145249,145583,147967,145201,147188,147599,146214,149824,147211,146255,149144,145472,144915,144205,146044,144766,151858,143760,143548,142838,146821,148953,145938,146243,149272,147246,146503,148711,146857,146685,143821,147418,150416,145271,146516,145369,143538,146465,150042,151395,147523,145099,145159,145803,142232,149567,150481,146521,145835,146195,147428,144397,147131,142638,146019,147525,146767,145212,145378,146221,147842,146493,145390,148837,142261,145031,149351,146881,149723,148404,146982,144717,146055,149088,146700,148095,145358,146732,146008,147395,148204,145867,146309,145965,144500,145951,147254,144784,147901,151113,148820,145152,144658,145825,147735,143964,143356,146680,147653,147710,148210,143987,149521,145433,145292,150918,147927,145693,145691,144607,147538,146407,143022,147259,145499,148673,146128,148017,147801,143712,147749,150367,145389,143721,147209,145477,147906,146063,145908,147099,146395,145266,145970,147320,146320,147659,148360,147152,147066,149319,147933,147603,146563,145863,142079,144012,143660,145846,145067,147410,148174,147487,146730,147948,148561,142566,148501,148193,147922,152481,147047,145744,146988,149650,146536,150397,150232,144863,148044,146166,144069,150517,142886,144996,146369,143870,147139,145706,142577,148815,150120,145659,149667,145422,145978,145462,149498,145199,148511,146643,150093,145760,142253,150316,147692,143570,145802,145327,147705,147200,149864,145382,145389,147233,148677,146072,149033,149276,144162,146730,141675,145572,146722,145932,145648,146242,145958,149363,152063,147523,141868,147436,146035,140127,142480,147577,146782,144943,142053,150950,144889,146747,145879,143970,146827,145011,143456,145629,143604,150028,146587,146834,145110,149475,147985,146943,145675,146350,146571,145514,142030,147608,146568,149307,144416,147330,148460,145833,146941,146050,144266,146142,143895,147168,148894,148814,143805,147573,146103,146451,146707,145932,145529,143993,147803,147461,148514,147464,147702,148868,150023,145616,148511,144132,144212,147960,147450,146236,148127,152198,144568,146628,143326,145260,145635,145284,148387,144141,148460,149612,147338,148752,148620,146376,145388,144651,144883,147883,148616,144282,145597,146582,146470,144171,144203,147124,145675,147075,145953,145803,143418,144923,147934,147379,150275,148268,146233,148714,144318,144462,146595,144260,143758,145327,146209,149836,144427,146196,145117,143665,148477,146021,148066,146072,145056,148700,148226,143316,146529,149395,145535,145492,146843,147059,143604,144303,142697,147214,144847,148367,148445,147143,148974,146816,145785,142217,148079,141881,146379,146923,150995,142999,145895,148362,145121,144614,147200,145187,148918,145334,147593,146789,147755,148786,146901,147142,144674,145585,142888,151036,149723,147051,149425,145545,146376,143142,149479,144993,148283,142990,148130,149249,145761,146225,147225,146073,149607,148663,149555,149017,145968,145929,153592,146885,146745,145117,142429,148947,147238,145254,144152,145763,145873,143166,147898,144341,145896,146713,145193,144365,146538,146416,144690,146358,149911,146314,145770,146272,147107,146117,147174,148915,145103,148356,152462,148949,149547,143242,146922,147715,145497,144201,149845,145175,149000,145756,146705,150558,145811,145075,142943,139314,148614,142393,147165,146992,145069,150917,149600,145475,146002,144854,145075,147031,142003,145292,147868,148532,142934,146746,147056,148543,148354,149090,145227,148140,149668,144082,146147,147219,145334,145571,147259,144887,149470,145921,147078,145968,152019,141616,148696,145791,143854,147163,150489,146178,145461,147278,149675,148815,149885,148528,146085,149134,145717,146777,149547,145680,147814,146568,144672,147751,144077,149083,150440,150892,146424,147218,149270,145203,142510,145746,148544,145478,144911,145288,146660,141822,147006,146649,143584,146309,145285,142402,148669,147011,145972,147311,142134,145645,145334,146824,145572,146896,146356,145681,144772,149439,146624,145323,143376,147202,146202,150749,148450,144643,142845,147594,144182,146181,147554,147798,146124,146542,147274,146989,145479,146206,146389,148279,147655,149425,146472,147896,148206,145858,145978,147776,144032,145267,145922,148899,145214,148334,150172,151176,148505,147764,147017,143406,146906,142621,145062,146303,144847,145004,141822,146788,145790,143355,151714,146207,148039,145188,149188,146172,147393,146946,147210,143755,147751,147041,151180,146912,146148,141331,148840,149126,149556,142599,147746,147807,144292,144926,148398,146376,146129,150062,146228,146267,143250,146094,144293,143550,147399,146987,149960,145008,147405,143821,146853,142003,146131,149033,149801,147222,141526,148231,145903,143772,143724,145911,147559,144681,144303,144053,145691,144753,146058,149176,146542,146977,143171,146412,146387,147599,149270,144852,146304,148340,146499,148749,146878,149244,144344,148025,144906,147758,143802,147422,145391,145607,147539,145269,143749,151811,146477,146386,144406,145612,141810,145978,146599,145901,148021,147160,145182,145075,149367,151087,146287,143340,148525,146670,147615,143553,142944,149442,146192,144079,147729,149018,144773,146503,144147,146402,145665,145785,144649,143325,145650,149481,147102,148897,147193,149822,146920,145390,148974,149792,146599,149836,146896,145566,146422,145918,147499,144814,145599,145899,147100,147012,146363,146840,147112,144066,148564,146396,145050,146493,148074,146948,148430,146096,146502,147847,146471,145521,146642,144822,145321,149155,146482,148394,145145,150694,148467]},{"counters":[146580,147050,144952,146220,142376,148975,143151,145787,145730,149535,148326,141495,149159,146678,146098,148033,148713,145419,144577,146626,143740,143975,149367,145567,142180,146289,146111,147742,148251,144791,145531,146879,145875,144138,147895,148289,144061,144580,147321,145234,148560,147834,150592,144000,147907,143305,144740,144728,145175,144844,146260,146897,148174,145971,145352,147968,147065,146419,146337,148640,148631,147834,145922,147489,145981,146475,146550,148209,144104,146421,146467,143080,147865,150843,143079,144177,145245,147060,145844,148352,148752,144253,147421,145598,148454,143541,146703,146437,144533,151618,148616,144577,142626,145515,145881,145102,143107,148132,147004,145083,143673,147985,145029,148051,145599,144171,143984,145682,150674,146549,146794,147787,146653,143483,144281,146920,147141,141441,143931,148892,143548,145201,147576,148695,148607,147166,143775,146831,148910,145447,148530,146669,145266,142901,146853,149889,146381,149809,146713,144706,146037,145713,149516,143549,144238,148840,145268,147412,147523,148764,147148,144248,147522,146966,142670,149114,148732,148698,144950,150100,145942,145399,144741,145020,144880,147463,144302,146995,141022,144816,148796,144746,150153,148151,146974,144473,145339,146287,144261,147464,148745,147460,148605,145642,145898,149957,150162,149153,144768,147981,147745,146306,146211,148891,147323,148079,148757,149168,151536,147361,149482,146809,144557,149136,145478,148251,144962,146371,143241,148214,145659,150084,142573,144307,148984,146351,147275,149592,145356,150034,147424,145600,145074,141940,146796,144721,146285,145471,147329,143004,145088,144971,145159,148795,146649,146645,145850,146772,145968,143745,142860,145730,147103,144831,145958,146945,147128,146480,145783,145892,143798,148907,149948,146664,144346,146500,147500,149647,147393,147740,144416,149100,142666,149271,145322,150517,141649,147281,149534,146559,145240,146312,145921,150699,142351,147186,145275,145713,146303,147569,148492,147603,145786,143889,145888,144982,145469,145044,146611,145115,142758,145650,147158,147848,146856,144669,145046,147199,144515,147039,143989,146168,150598,144965,145468,146472,152227,147797,149141,146554,143395,147135,145765,143835,145758,143825,146146,145309,147365,144143,144176,145541,147271,146222,148002,143423,146702,149462,144527,146083,149223,146222,143412,148903,146747,147750,143931,145021,142801,146601,148252,148913,144763,142806,145792,147029,145166,141201,143053,144187,146114,145517,149188,144967,144704,145627,145247,145247,145693,145710,149424,145685,147243,150110,145462,151758,145001,146284,146820,146452,144777,146639,139947,142594,142961,146645,144567,146328,142303,144342,145089,142066,145849,147997,147129,144714,143860,147301,148988,145287,146733,152146,146793,147408,147016,147229,144736,147145,145412,146150,145303,148995,144948,143794,147298,144991,146841,146392,144944,144282,151416,146442,147115,150517,145350,144373,145846,147127,144537,145273,146942,148520,147044,144682,150140,148552,144476,147711,147878,144434,147010,147579,147615,145216,144173,144833,149299,147467,143846,146849,147131,151822,146067,147665,143864,148511,146005,147580,145183,146650,149740,145710,146636,144271,143448,144105,144788,152577,145856,145234,149425,149483,150600,140489,144565,143496,147059,144886,146463,145659,150228,148854,149753,147404,148186,149925,148741,151516,146045,148231,146839,144234,146808,146518,147694,147308,147167,143975,145576,147134,149079,148471,146670,145622,148970,143664,145462,143403,149362,143295,146409,142477,147162,144562,147912,145351,146323,145944,149699,152683,150350,146865,144320,146322,147293,148605,148255,148529,148486,145671,146350,145789,145309,146256,145270,144968,145593,147822,147088,145797,145472,148630,145944,145428,144886,145806,147283,150921,146520,147700,147335,147784,141950,144767,146923,146188,144462,148991,142782,151081,146539,145732,148609,142451,141393,146965,146377,149530,146841,150692,145250,148465,148147,148234,146291,142828,143991,143973,146288,147109,148340,145497,142113,148496,149315,145262,146625,146577,150638,148079,149246,146796,142452,146820,146732,143401,149581,145836,149556,143931,148673,146800,148707,142617,145517,144625,149828,145818,147547,145388,151130,149889,149942,145676,147860,144792,148176,149128,145878,149090,143410,145166,146076,147504,148015,144802,141740,145464,152070,143929,148339,149237,141415,146933,147200,146247,144823,146526,147275,146910,146060,148471,146912,143817,146113,150371,150686,144470,148179,142196,144043,145276,144778,146374,148306,146894,144449,148461,149807,142700,144929,146321,145365,145557,146596,146814,146423,146588,144787,149287,145092,144040,145268,142002,145971,148275,146741,145395,142731,144340,145022,147838,149590,148046,143912,145188,149566,148160,145260,145411,145877,147777,143200,143738,146520,145659,148105,146698,141853,142269,147205,145200,143624,146438,147066,143245,148347,145976,146968,148222,145598,147030,148675,147537,150620,144295,147211,142774,146510,147846,149503,147656,142225,145663,143181,146976,146012,142789,148428,148009,146122,148372,146909,147068,143950,147729,144038,146077,145732,146842,148275,144270,147205,148037,144444,146739,145641,145099,144158,144434,142590,147209,149750,148360,146533,147430,144274,149480,146534,148378,145092,146237,144226,148347,146485,146910,145451,144818,146089,147321,149513,144213,146585,149091,147390,146143,144133,146714,143484,148132,146975,144937,147426,140286,147401,145160,145661,145597,145700,146062,144890,145414,147614,146879,145748,148422,144745,150422,148776,148294,148889,148703,143714,144584,147635,146537,146050,145625,146618,145983,146064,149468,144097,147844,147499,145781,149011,148592,141384,147061,147890,147451,143501,143821,149021,147074,145623,145555,146997,148497,148954,143686,149975,146825,146876,145919,151334,148780,145744,148803,146248,146993,146901,150719,148173,147740,145207,146645,145064,145333,148416,150400,150396,147369,145581,146584,146283,147174,144283,144351,147728,147303,144617,147238,145909,146756,142458,147592,149580,147804,147360,148066,144084,144800,143572,148822,148528,147720,144304,147204,148184,147401,147476,145810,143890,144216,145626,146048,148998,145435,146999,146122,149919,146715,142554,143020,147596,145780,146200,145606,145326,146594,146216,146996,144122,148751,141898,144036,145841,150783,144075,148102,144957,146256,146963,145761,143891,147773,143327,144679,147957,144719,149090,145635,144881,145469,147898,146162,143486,146344,149038,150948,145769,145535,143412,143221,144780,145520,146768,144573,145587,147368,146192,147194,147667,148773,145493,148205,151975,147562,141630,143940,144328,142045,146263,144944,149355,145740,147211,148720,146116,145330,145393,146079,146879,145639,147156,147395,149049,142857,147520,148574,146726,146333,146478,146319,145095,146510,145755,146589,150265,146654,144292,145115,148649,143751,148748,146633,147854,146045,147574,149355,147294,144419,144414,147303,144545,147060,144782,146646,147114,147920,141883,143203,147549,146295,144707,144941,147649,147480,145749,146634,143162,147837,147328,144479,149175,145851,143464,146534,145794,148172,146310,144786,145972,147723,145024,149761,147530,146782,146626,144342,146082,147912,144687,149120,147801,149217,144736,145077,149247,151416,144790,147715,146042,147413,148111,147428,144322,146403,145620,147199,147805,145167,145217,144707,150774,145876,148370,149839,145848,146932,148611,145443,146965,143042,146869,148449,150824,146733,145073,145831,146007,146280,145602,148890,149989,146483,145788,145416,145408,144102,146737,146242,145918,145554,144874,145286,145067,146525,146992,145584,146218,146975,148239,148886,149423,149510,147436,142998,146430,150160,145922,145914,147514,148270,141603,146914,142855,143511,143682,144027,146563,147629,145933,145480,147131,148272,145990,148262,146258,146951,147427,147675,147630,144243,145383,147178,142527,147259,143411,148981,143719,146147,148500,149095,143797,149156,144146,145510,146726,146411,143961,144339,147138,145282,149291,145526,148753,142584,148654,143174,149949,149645,146643,147254,146125,145325,148238,149263,147599,146971,145932,149151,147045,148551,145931,146310,149151,146335,150238,147504,146231,145072,150083,146770,147221,145192,146338,145020,145793,147355,149086,143655,145502,148202,144864,145777,146809,146423,148466,147129,143458,148265,148171,147321,146304,150124,145278,146539,144713,149040,143759,147988,143008,149134,146667,146581,146937,148851,149182,147386,144785,146791,145248,146496,142887,148692,149634,150357,150192,147082,143619,147830,145800,145912,147523,144688,147897,146534,144509,146754,142678,147184,147076,150174,147198,145111,147033,149026,147966,144304,145594,146614,144352,146499,142965,149381,147918,148918,143068,146747,147221,145121,148451,145537,145108,145547,146948,145517,146299,148089,146410,143406,147378,151229,147920,145158,141005,147231,149554,145938,146976,149084,146907,148146,145832,143469,144326,144781,143753,149057,146979,148413,148460,143975,148103,147564,149170,147594,149637,143732,146667,146909,147754,145408,147796,146118,144250,149381,147074,146688,146644,146053,148621,146030,147351,145281,145803,146547,143869,142979,146014,147722,148329,147320,151401,145309,145224,146380,145036,143064,145580,148096,149116,145089,145746,148903,146544,145909,143645,149915,145481,149425,148490,144817,147244,144479,149302,145094,148421,146208,147224,146764,145097,149005,148279,146663,151065,146006,149255,148378,146051,145351,149462,148441,144098,147111,142919,146485,147419,146403,150000,148508,142061,146762,148531,147769,146196,145063,145721,144964,149288,144623,146560,146204,147545,145349,144262,146076,146561,150096,146513,145219,145186,143476,147788,143975,147783,143914,145212,147167,148026,147914,145668,143273,144654,145685,145111,147340,145299,148370,146993,146560,145149,144163,142393,145875,148402,145088,148875,143460,146283,144342,148832,145038,143621,146707,143679,148396,145876,143849,147049,144920,145195,145462,144278,146994,143173,146814,151094,145792,150674,146406,144615,148435,147826,145961,147159,146611,146931,145934,146097,149039,148299,148437,144173,147684,145987,145916,148457,148369,146071,144598,144683,147380,144229,148923,146890,151409,146377,147527,146625,143456,147856,149099,148352,148605,145683,147549,148755,145157,145936,148766,148630,144838,143887,149026,145197,146174,146546,144450,150545,145044,147039,145576,145412,147474,145487,148872,142809,150707,145115,148046,148436,148506,146614,144401,147990,146014,146103,144340,142476,145523,144187,148588,148716,144468,147944,149207,146177,145430,143096,148125,144860,144861,145103,149596,143254,146944,148042,145015,146331,145527,147918,146557,147626,145248,148035,147344,149480,145791,142397,147939,144402,143926,147765,143350,147866,147433,146866,145619,141661,148303,151424,149236,142463,151951,143276,146622,149796,150629,142849,150151,148405,148826,144527,142744,144219,145487,148848,147647,144258,145122,146762,146166,146838,143275,147348,147308,141979,147084,145200,149051,148658,148432,146267,147279,146235,142829,148559,148826,144407,148372,148668,151544,145476,147032,140715,146767,144398,147497,147615,147762,147527,146203,149132,145173,145699,146156,144186,147473,147609,145211,148741,143572,147952,145571,145984,144451,147784,149110,145511,146155,145341,148266,145717,151136,145641,149287,148083,145254,145512,148739,146556,149472,149808,150190,141987,145936,145151,148499,147105,147577,145917,144250,146362,146795,141276,148371,147473,145682,142074,146340,148443,142283,150784,146087,147494,147497,150154,147805,147830,147776,148919,145920,143986,144207,145785,149388,142958,146006,147362,148670,146641,147560,145330,144560,150485,143740,145987,149100,144552,146682,148100,144263,146530,147314,144665,145176,146383,147340,146344,146045,147325,144882,147173,147150,149742,143528,142290,141114,143339,144059,148968,146401,147504,148511,148072,146793,146087,144408,144641,145698,146122,148948,147324,151712,148399,147187,148820,146406,150767,150087,142126,146859,150291,146065,148311,145363,148028,143892,147319,142057,147840,144605,148411,146116,147072,149780,144187,145153,146333,147092,146645,150937,152070,148703,145710,146168,144341,147943,153968,146505,143835,147517,147482,146437,145272,147661,145285,147110,145697,146652,145539,143489,148770,145936,147575,147446,141482,149899,144137,146811,148128,143031,150487,145612,146671,143807,146939,147332,147925,150023,143747,146643,141303,147042,146932,147797,145168,148417,145659,145700,146844,145493,150185,145147,147727,147890,146877,145738,143581,145885,147638,146698,146931,146249,149098,144377,143535,149452,145096,146264,148069,145520,147507,144854,144302,145212,146529,147875,146018,145651,145168,148266,144646,144144,143256,143900,146769,147039,144617,148350,142022,147200,141531,146814,146116,147302,147544,145837,145820,147869,145475,146981,147913,151320,144984,144932,144734,148213,144821,147975,143665,145467,147914,147744,146764,147132,144199,146937,149517,146974,148580,145843,146400,147308,148505,146215,148213,146278,148059,148305,146996,147434,143568,148910,144631,144486,149085,144899,145228,147398,146135,145913,143665,146235,144863,149365,143672,148560,145790,145543,145735,148836,147893,146139,148742,147989,146975,145823,147353,145549,144869,145058,147122,150451,146690,143648,148018,150430,147029,146497,145541,151553,148942,147634,144818,146773,145633,147605,144623,144417,146975,144585,146921,145239,143799,144381,151168,143159,146484,145349,143333,149986,148800,148148,149604,146487,145734,146167,145613,147377,149664,149066,148104,145038,146144,145609,144739,144896,143829,145032,147645,144692,148511,147331,149778,143567,145817,148609,149625,143283,144367,149991,147603,147523,145496,145900,151174,146385,148257,149285,149489,145907,152467,144865,152352,148479,148594,143187,146826,143966,147331,145499,146035,147081,143792,145298,145256,143860,145529,144559,147560,145325,150200,142583,148681,144997,146495,144845,147909,143721,145014,147204,146803,148055,143936,146669,144212,149282,146459,146636,145260,144122,145203,147734,148795,143603,143362,146279,144587,144432,146147,142240,143676,147427,143473,145614,149403,144379,145941,144246,146541,143038,146934,146187,145735,147535,147888,143401,147812,146650,145078,145267,145941,148556,146399,146888,144794,144621,144287,147322,146320,147179,145326,146338,152913,149457,147558,145367,149037,146887,149913,147345,146654,149287]},{"counters":[146382,147480,142134,145900,145456,149500,148501,143899,147633,149764,148396,147522,146454,145957,146286,148172,144573,144237,145561,146434,149098,148068,146789,145448,149416,148026,149386,146866,145194,146270,142680,146667,145885,145631,148669,144464,147217,149356,143315,146249,145963,148011,145298,148995,144976,149662,150716,148720,144697,148888,143543,147395,145466,143931,142966,144607,146393,144317,147690,146083,146406,142924,141627,147367,145479,145490,145937,148168,141718,148093,146396,147826,147125,147228,143990,146182,146985,150111,146114,144814,147009,149062,144274,146922,150051,147423,144891,146403,143806,145249,142101,146882,145086,146062,144399,148478,145337,147474,148593,147634,145489,145144,144854,146030,145517,141247,147484,146150,149230,146857,147929,146300,143311,146770,148390,148537,147882,143836,143014,149017,149097,147148,143644,145246,139785,146160,152627,145178,143372,142218,144406,145543,147530,146693,147658,149070,148920,148573,146645,147568,145662,149155,145343,145243,144895,140522,147645,147514,147423,147379,145821,146468,141189,143771,146430,144230,147024,149620,145774,147976,147386,146140,146663,146099,143827,145392,144941,145555,144540,142706,148625,148240,141023,142485,147919,145170,146769,145647,142070,147389,148200,150975,145534,147023,143197,146878,146864,149765,142862,148663,146502,146830,143587,147858,145251,150950,147548,145901,148578,143769,147520,146384,146697,144682,145636,145076,144997,142147,147343,147317,148729,147072,149008,149697,144224,144525,143255,147915,141343,145979,141660,146458,147492,143752,147678,147697,148811,146360,144223,147705,144566,149904,141915,147623,148182,146191,146307,144589,149575,147955,148094,145111,144749,144759,149636,142981,147761,145070,146619,148116,144397,146731,145762,147870,143238,144993,146825,148569,145384,149452,150199,146150,147513,150032,144078,144782,142857,145491,147130,142980,145475,145995,146795,148714,147506,149472,147481,149046,148410,143845,145213,150608,148271,146785,143650,147677,153265,143564,144069,147219,152352,148788,145554,144899,147059,146657,144557,147148,148490,148431,142994,145788,144751,147366,146951,150453,148010,146551,146161,146584,145569,148806,144677,146227,143556,151180,149065,146617,146961,142430,147944,147554,146476,145487,151524,149811,146553,148953,148365,146712,144880,147112,145500,146692,145233,152102,150308,146938,144334,146883,147834,149246,149984,149293,148967,150681,146579,142987,146088,146486,149304,140264,148002,142587,146440,147825,145149,145296,147634,149417,147893,148486,144266,143444,140545,147326,148146,148218,145717,147028,143116,147496,145832,143937,143615,146203,145492,153790,143965,148649,148480,145984,147964,146466,144657,147941,149041,146821,141647,145638,144792,148979,143064,148794,150014,147051,143294,145629,145536,149017,147712,145187,148021,146631,146095,145845,148232,149421,145667,142728,144632,147115,145332,145302,144326,147686,147637,142802,147500,148338,149144,145031,150313,145160,146739,143090,146070,143865,148703,145819,148135,146599,147408,148217,150852,144140,143928,144922,143362,144688,146803,144415,144519,145719,148333,141975,152017,149117,146870,146678,144880,142779,143926,146958,147928,147060,146936,147405,144730,143638,145428,147191,149886,144809,149697,144787,143982,147633,146121,145384,149724,143742,143782,144570,143751,148845,147676,145655,146279,145789,144487,144798,149299,147950,145516,140892,146001,145466,144621,146607,148014,147639,146258,145312,142805,142140,143596,148046,146380,148284,143748,147448,145415,146832,145508,142280,150360,143472,143973,150483,146907,148145,146215,145724,148810,144556,146267,150524,145385,147888,149754,147293,147845,146869,149612,146205,145342,148798,149826,144678,144327,147190,147600,144645,145139,145737,144938,144985,143990,146259,146553,144834,146098,147887,148989,147438,144404,142083,148083,143909,148141,143648,145931,147601,145483,151470,145692,147613,149788,141366,147193,147253,146776,147360,146801,145067,145079,144827,147873,144078,145563,144710,144306,146098,149576,146795,144664,142907,146572,150018,146328,145686,150231,147077,145630,144423,143921,146325,147802,144273,145246,146114,148651,143657,147565,147085,148550,149639,148262,146771,147651,147978,144826,145221,149717,145629,146968,146841,142538,149599,144701,145034,150235,145151,150782,144092,149255,144672,147178,138843,147766,146517,147051,148480,146478,145241,144753,146243,143404,144990,145340,145921,148491,145274,146233,148711,146616,148855,143441,145869,151053,147970,140871,142272,146211,145423,143086,144869,147915,145673,147011,145278,147454,146984,146827,148689,144963,147646,146161,148417,144207,144627,145427,145097,146513,145760,148095,146885,145951,144077,143607,144095,150583,145365,147521,143974,146530,150306,147689,148719,148439,145614,144600,149434,148902,149610,147483,147168,146954,148747,147532,146614,145590,143307,149502,146707,148334,149223,146907,148379,148197,146399,147501,145865,146895,146767,145087,144283,144628,144040,142683,142349,146960,144156,146657,143531,145976,145048,146064,142165,144396,147550,145296,148115,145288,147028,149685,145752,146140,144816,147863,147240,149261,146226,144354,143390,148492,147274,146528,147620,147558,145590,142732,148893,147237,146368,149272,143154,148401,148713,142253,146868,145431,145237,140047,144952,148105,146316,145047,145665,146028,145956,147932,148634,149284,144680,145982,146840,149713,145179,143278,146773,146980,146765,145663,150377,147471,143747,147664,143980,148107,146506,149978,143440,146467,153181,146968,146532,144499,146905,147273,144016,148314,148355,143524,145759,147059,143881,145694,145576,149077,146802,141719,142974,146510,146496,144875,142660,150220,147485,142830,145702,147908,147726,147808,148039,150847,145637,149979,148154,149395,148122,149131,146177,146653,147350,145631,152471,144098,149476,144101,145267,144653,145735,148204,146220,145995,151560,148298,150242,145018,147731,147284,145426,148222,147539,144203,147456,147337,146926,148604,148622,144580,149163,144501,153123,146380,148833,147930,148062,148827,149110,149648,143801,144211,149207,149263,145707,144498,144162,145093,146775,148097,148613,146471,146757,148310,146437,148110,142863,145395,151199,147737,151328,149414,150290,147292,147269,146824,147588,145822,147203,145722,140559,146115,145745,146789,148466,146055,143866,147943,148040,147213,146050,148071,148733,148543,146008,147414,148735,148604,147354,144395,147297,145858,147549,149953,142838,143972,150269,148013,150496,146683,147164,147378,144905,141368,151322,147811,142964,144408,144643,145018,146989,151253,148208,145967,147697,146499,146967,144248,147690,145639,146585,145702,144185,149140,144064,146104,145363,143166,141417,149634,149008,145470,146653,148125,148741,146859,143767,147589,145447,146880,149195,143180,142544,145841,148907,145032,148171,146115,147085,145152,145138,145640,146372,145294,145195,147451,143642,147229,145794,146952,150854,147700,143616,145056,144837,149414,147364,147300,145856,150307,149539,148090,143332,144088,146206,144275,144820,147145,147080,147668,145672,143919,146967,145199,149519,149537,146596,144472,148389,144558,145449,144077,148705,151445,148094,148505,144273,147474,150467,144605,145050,147578,148416,145370,148299,145555,144744,144908,143266,146619,147878,149403,147033,145417,146484,145620,145871,146190,145685,146380,149954,142501,144694,146217,147850,147805,149400,147131,142509,146215,145229,146287,144801,146374,144366,149130,145512,147168,146267,146076,145783,146635,148367,145459,149659,144229,143352,142725,145078,147667,145288,148253,149482,150468,147045,143301,143239,148641,144679,151450,142707,145095,147739,150100,148531,149573,150924,148232,147950,146649,145483,143276,148317,147147,146279,148853,150362,144296,145583,146716,145183,147953,146731,147914,145713,143830,145570,144503,147646,145024,148678,148582,145116,147304,146856,149616,144872,145152,147469,147493,145419,144886,143302,149669,147139,147412,146960,148658,147375,150233,147290,148338,144731,144741,147287,145921,144373,148611,146446,147488,143880,149883,143221,143173,145457,145522,152873,142312,142106,146608,144177,147218,147542,145916,146654,146577,146754,147797,141862,145967,149320,147336,146200,149242,149158,148420,145333,142488,143396,144016,143320,143434,147150,146864,145747,145304,148321,146364,145948,142955,145432,149141,146285,148982,144705,143897,146520,146428,148588,148073,145700,147686,148787,147246,145726,144569,147544,145881,149550,152414,144834,144615,151022,145503,146360,145634,142875,144975,144736,148703,146889,144703,145927,148134,145434,148512,149962,145477,144037,150126,148981,150378,145569,146046,146340,144131,144916,144049,144841,145669,146934,147766,146046,143520,145700,149437,144473,145676,149283,144951,146870,144334,145056,146101,144434,148737,149858,147874,150316,144234,146795,144214,149381,144161,145759,149264,144005,145646,148623,145605,147419,145799,146580,147050,148876,147802,145742,149600,150662,147117,146703,144786,149145,146674,146170,146222,149168,147058,145997,146335,143794,148070,148213,145447,143457,146860,147424,146092,148864,144004,147940,147042,146148,143659,148887,146785,144906,146085,146861,149451,146014,148400,144900,146211,145169,148345,147123,145015,148827,146088,147452,150080,143982,148993,140894,148499,148436,146781,143147,148729,142785,150260,147283,148091,146112,149563,145441,145642,149115,145708,145706,144388,146911,145603,149475,145323,145386,145386,150266,141597,146172,143727,146008,149409,146225,144936,149394,150324,146247,145446,145168,145332,147473,148472,148581,146264,144306,148041,149645,142376,147116,145723,150253,147068,149883,146521,143769,146833,143412,145104,150023,142008,144648,145519,146259,146293,146613,144937,145397,146768,145614,147069,146650,145942,144876,146116,148246,147325,144145,146222,147165,144393,146078,145845,143489,149855,147407,146254,150170,143508,143996,144014,142945,144059,147576,147670,146354,148279,145868,148535,149434,146262,145338,145548,147825,148668,143068,145334,146902,146390,146752,147415,145061,146748,146049,143658,145480,148563,144568,144511,149716,144567,145258,146666,145306,147855,147558,143598,145499,148011,150304,145846,147373,144219,144740,148085,142316,146194,146263,149981,150587,146289,144789,149454,145060,147387,146196,145706,145708,144625,150367,147747,147698,146738,148542,146489,145796,148931,142338,146675,144925,143393,147282,147704,143017,146790,148459,149218,143777,146936,148305,145229,147918,149821,143794,148325,145346,147765,147106,145252,146297,144167,148036,149672,145440,145915,145706,148581,144262,145336,143739,143668,145287,145281,144138,146574,147798,143324,150149,146643,148494,147399,145941,145369,146640,141804,141677,147097,144165,149783,148186,147542,146742,146626,147116,145603,147205,144423,147425,143622,147667,145437,147667,145552,146523,146120,148791,148534,144929,147498,146690,146837,144899,143378,147771,143016,147986,144270,148846,144416,145614,146558,147237,148343,147839,149621,146490,144302,146074,145931,150995,148721,150036,144903,146460,150287,144461,147311,149034,141398,148811,148686,149697,144689,149310,146014,145077,146220,146288,148759,149365,146360,147450,145837,146729,146802,144738,148233,143352,147558,147441,146434,149150,146364,144139,148328,147445,145841,146047,142750,148720,146853,144889,145265,146887,145656,147878,148558,148773,146181,147182,145568,147437,148662,144216,144812,146597,146764,146318,146355,149586,144440,146341,146842,149181,150035,151674,145486,147532,149719,150647,146252,148866,146777,144028,144721,146812,146401,145356,150578,152385,145060,147180,145833,149199,147818,147904,147971,144455,146617,147765,147104,148183,141625,142845,148276,146261,144958,146320,143750,148551,144983,150299,147783,146006,145295,145923,146296,149264,146573,147476,144958,146181,146459,148992,143604,142332,145765,146318,147714,148177,144264,145292,146045,147597,142644,147643,149804,146456,145309,148096,148122,145919,144649,147347,147996,148192,144829,145477,145769,145518,145227,148528,146991,146344,144332,145868,143589,147186,148359,148014,144230,145570,145839,151268,147146,149379,145835,145670,147569,146697,144352,145334,149128,145375,151199,146308,147264,149099,145663,146140,147252,148027,147373,143970,146481,146182,149728,149038,145235,148656,144387,145897,145186,149085,146144,147823,146468,145680,143855,148753,144113,145530,144992,146778,141556,147016,147385,143683,149798,146574,152596,144178,147371,146130,147153,146468,145368,146930,147054,146318,145533,145364,146775,146786,147726,147459,145967,147679,144167,145760,143302,145933,144776,145451,147593,147592,145982,147229,147893,147859,147899,145400,145459,146778,144431,148157,147279,142659,144395,149099,151313,146247,147225,148749,149132,147119,145800,146660,145623,150943,146358,149138,143153,145694,146168,148887,146530,145967,143012,147128,146364,149611,144519,145194,151937,145831,146761,144890,145654,148927,142555,144245,147647,144488,146522,146875,145488,146099,144624,147128,142342,145579,143492,141958,144515,143996,148785,144695,144856,145095,146346,147267,145639,146072,144674,144930,148737,145294,147556,144578,142346,149210,147023,150570,145541,147624,143643,147044,149566,147321,145205,149751,142936,143329,144557,147576,146060,146110,146156,142977,149606,146818,149345,146832,152632,144924,149261,144618,150594,143893,146010,146418,147766,143946,146250,146121,143344,151202,144561,146571,145002,148707,148192,147674,145923,148275,149067,148757,147847,143689,146465,147522,148986,143118,148831,143973,150443,149424,147312,144259,141962,147045,146865,146716,145040,145797,146229,145528,144980,147555,148155,149535,142809,145923,145829,150892,144782,145719,147408,147870,146462,143758,149934,145794,149588,145951,149318,147198,145905,147258,142191,147775,142414,147491,141831,143758,148660,142839,149090,142482,144792,145347,146132,149046,144833,147508,144384,146408,144894,146842,145397,147692,145874,147108,142821,145344,146880,147599,147105,145497,147992,149110,143747,143707,148428,146563,146532,147269,145084,141735,146656,142990,146364,148824,142873,146813,143604,147720,145011,144215,152282,146316,148701,148182,144988,141708,148206,146488,143884,146811,144690,145135,145777,145616,143327,142786,147306,145400,150179,145024,145923,144798,146088,147897,145463,147229,146711,148461,146011,145698,145443,148637,145921,144160,150051,147966,146538,142440,145531,144869,150702,147700,146056,145995]},{"counters":[147208,145370,144766,145080,146632,146859,147306,146161,147647,146368,145259,143222,144534,144427,145211,147180,145766,147496,143373,145903,147407,144569,144461,146323,142922,146827,144280,152244,149213,146305,144552,147429,145292,148968,146546,146891,145470,147353,149439,145701,143488,145161,149634,144960,147040,146772,145603,143861,147813,143453,150539,146799,147382,150735,143807,142474,150825,147699,145568,146003,146069,146433,147424,146608,147513,148204,144516,144525,142836,148508,145786,145555,146421,148078,148043,144791,149137,147937,147863,150782,148575,148969,148351,148734,145232,146258,148066,143492,149433,148475,146628,147765,145610,149043,146520,145849,145959,147000,145714,146857,144764,146888,147891,148500,148102,146089,150122,144846,147061,148339,148157,149550,147418,144705,146261,143118,145761,147600,148416,150199,146039,145159,148201,146105,145701,146248,146435,150325,146327,147729,149230,142908,149461,148722,147291,146487,143914,147033,146393,144186,142682,144243,147370,147225,146489,148248,145618,149233,145336,145227,148040,148319,147620,143386,145755,144311,145072,142779,146275,144335,148109,145431,144441,150490,145897,143714,146219,147051,147747,149754,144614,145440,143379,146322,148638,144839,151032,148485,147003,148060,143463,145453,146678,146642,144812,148567,144839,145590,143494,144586,145688,146262,143566,144281,148504,148620,144906,146416,145044,144479,144122,145842,152546,150167,151588,146697,151279,150146,142885,148352,151088,146482,144159,145304,146993,145409,149565,145088,147446,146684,147559,148422,145727,145062,145608,147115,145708,146086,146754,147522,147957,144406,143055,149592,144819,143803,146527,146160,149037,142413,143933,146421,147974,147566,145760,145878,149316,146394,150950,148678,144403,144065,149019,144790,146418,143873,146678,146931,143822,143070,145069,147421,147902,147754,148587,147455,147315,147758,149115,145497,151433,146198,144342,143902,144539,149636,148347,142837,147175,145949,147450,147891,149008,141484,147863,146780,144500,144133,144104,148633,145796,145822,149036,145135,150086,146264,148700,143922,146629,151251,144289,145662,143426,148118,148592,144763,147976,148071,139810,148196,143257,142810,144546,144955,150461,142086,148548,141795,150019,147616,148884,146614,144955,144798,146165,145987,148136,145014,144220,142266,146668,149479,147602,145995,148501,146344,148928,146511,144887,148578,145975,149733,143451,145540,148159,149414,147443,143154,142785,146886,144293,144441,148302,143802,146114,150829,143277,145943,144453,150518,150017,144583,146814,146254,147917,148153,145393,151595,144069,145629,148012,150434,150175,143229,146500,144741,143556,144973,146135,147338,144183,145888,144456,147121,149072,147542,147379,143355,148204,148046,147764,141739,146884,150405,147017,148674,145121,144687,146408,146673,143398,145903,148041,143465,146144,144679,145636,143473,149127,146194,145988,144190,147214,146760,143073,143790,145219,143167,143945,145131,146094,143819,145861,147286,146920,144094,144649,144937,146592,147457,146052,144855,146878,141855,145724,149407,142421,145783,147720,147816,145993,146919,145641,144975,149804,148976,149149,148060,144276,147848,147614,145717,146959,144151,146899,145850,147060,148366,142327,146587,148260,150771,148609,144817,143858,145213,145626,142841,146361,150617,148522,145116,148122,147805,142939,152142,146525,149017,142012,146146,147917,145919,146605,148131,148923,148196,147422,141822,152533,144966,146607,148107,147568,149292,146646,147902,147687,146531,143932,142765,146045,150518,147027,144906,147230,143844,144945,145417,146256,147785,143996,143779,146808,149329,145070,148548,148419,147196,145226,145964,143095,142937,144590,148625,145312,146818,146667,145942,146009,148745,146518,147341,150199,145603,148564,146766,146992,142909,145726,145933,146336,145620,143213,149434,147542,144815,142760,143751,143767,147468,145820,149855,146149,145935,146303,148324,146631,149625,145436,146197,141840,145675,147095,146175,146413,145164,143697,147780,145225,145355,147656,144413,144427,153384,142556,148021,141201,146599,146394,147357,143703,145865,148368,147063,145012,148194,146719,145863,146286,144982,144912,146229,148808,147049,144868,151954,142604,144088,147949,143787,147341,146477,147180,144493,147047,145192,142613,145829,143757,146943,147933,144497,147581,146534,146602,144659,145814,147681,145740,148069,144982,142493,146902,145793,146107,145889,145880,148047,149543,145573,147135,146005,146265,146180,142886,143745,142365,147475,150381,147719,146149,146938,144787,142928,143630,145728,145276,145795,150544,144883,148555,144827,146137,145111,145199,146121,144730,146551,144741,148617,148525,147471,148664,148999,146662,147615,146343,145932,146243,145333,145898,147833,147003,145584,144455,146277,147271,144278,147538,148125,141487,147139,143910,145872,148516,150344,143355,139085,145351,146148,145613,145075,148632,143395,147102,146756,147092,146335,142526,145293,143744,150019,146534,145497,148635,148392,146264,149760,146760,148901,147246,144887,147196,147894,146237,150603,146514,145286,146594,142787,148359,145677,143424,144867,145340,142137,149240,147223,148987,144586,147111,145341,146140,144306,143713,144940,145811,148303,145958,144879,150264,147119,146806,148310,144466,145664,145333,144646,147880,146426,145791,146370,146623,147752,146016,147677,148048,144714,148425,147718,147353,147880,143861,150032,146164,146690,149293,148321,144523,150199,147194,150441,147128,144386,146599,146330,145097,147816,145870,147527,146790,148556,150336,148477,147345,146912,148321,147230,145855,144158,146487,148096,142984,145230,145433,149025,145681,150672,144736,146292,143837,146758,148359,145736,145031,143185,145789,146292,149124,147109,147933,148700,144920,146389,149312,145291,147898,143773,143723,148299,145318,147303,146166,146705,148400,141512,146252,147298,145223,145734,142806,144587,146097,144630,147211,148390,149238,149470,147040,146845,146337,144108,145524,147166,142986,145162,147904,143666,149606,149480,146108,145563,146799,144448,145713,149306,144607,145642,146583,147195,146084,145780,148535,144303,144520,143086,144895,148075,147471,148070,144853,146555,144603,151122,143059,146158,146658,147293,148203,148584,149652,144917,142069,146677,147798,150421,145745,144786,144959,144744,148218,149125,146819,147263,146784,146468,148044,144242,146024,145156,148312,148671,148668,147413,145599,148406,147115,146202,148904,146181,143676,144485,146628,147350,147416,146668,145348,148689,143838,146618,145512,144286,144413,147039,148274,143508,145002,142501,145994,145213,144548,147702,140066,143653,145211,150831,147028,144702,140879,148024,148399,145868,145911,147883,148030,146935,147851,146585,147810,146197,145800,149941,149515,150418,145682,148765,145124,145353,144907,147855,145409,147651,146663,146749,147178,141790,147035,144662,148606,145992,143995,148395,148024,145185,147864,149127,146834,145637,145133,148097,145854,148439,147898,145284,146131,145212,149533,149731,143387,147362,142157,144872,148363,144993,148708,146433,149234,146284,145545,145443,144997,144127,145346,145653,148712,144444,144998,145567,144902,150398,145515,143592,146290,146675,144709,150865,147285,147739,150671,146943,149134,149405,145479,146748,149393,145220,147518,147551,149039,146305,146770,145666,144726,145124,144689,146549,149043,147753,145982,148539,144142,148849,145933,145628,143210,145209,145810,142700,145808,147582,146781,146420,146229,148484,144040,145280,142518,144334,149547,146001,146460,145886,148445,147819,147217,144684,145825,147481,148120,147604,144503,145934,148265,145935,144872,149201,146821,147059,145618,144230,149107,147733,145378,147038,148463,147068,144384,144227,144174,145049,147775,146066,147078,143622,145072,147345,144456,147861,148807,147357,146494,144436,147523,145841,148434,142680,146095,143392,144802,145000,144881,143348,145819,146042,146109,142214,147117,147111,147388,147662,148289,147343,144612,147625,146086,147491,149492,146794,144762,149036,146755,146757,145114,145801,150477,145619,145114,149576,146237,147009,147793,148376,151747,147134,148480,150055,144813,141740,146211,146198,147435,149019,146428,146882,147808,143770,144985,145877,145091,146531,147435,149561,147060,145667,146986,146692,146184,142706,146138,149985,150560,148468,141879,148853,145457,147398,151850,147152,145491,146465,146532,145681,149431,146141,144655,142451,146279,149056,141903,148320,148643,146366,147984,145789,148010,142896,145567,149031,149058,145522,143968,144959,147372,148489,144773,147550,146163,148527,146260,144905,149161,145797,148668,145779,146090,147057,146108,144699,142096,149608,148070,148044,146933,147437,142865,141891,143368,149444,148661,145631,143251,148030,148577,147284,145652,147271,145323,144211,149392,154175,147902,148559,149281,148928,149634,146265,147510,145683,143132,146625,150223,148702,147049,148940,149721,150530,143222,145570,144783,142263,146039,143967,144585,147735,148351,143981,145218,147042,144500,148029,146799,144061,148145,146047,145904,146780,149200,149302,146129,147549,144135,146098,144727,147174,148854,149492,147476,145647,146117,146869,142038,144765,146416,143059,144703,155329,148107,149179,147308,144519,143853,146290,147625,149664,147182,148027,145120,147507,144880,149385,145327,148856,147775,148561,141542,143977,148471,146843,146880,147712,144482,149993,147076,148868,148118,146379,148083,145342,146715,146024,148425,143215,147142,145124,147725,149446,144528,146485,146050,149362,146576,151865,147169,145618,150784,148820,147962,147761,146617,148463,148012,148819,151389,146312,142933,141994,151313,147507,150016,151061,144459,146629,147200,147973,142731,148424,144910,148126,143885,147742,147491,146393,149439,145574,147081,150663,145040,147581,143317,146584,146132,148872,145845,145800,146700,147230,142290,145846,145623,145969,145633,145464,141166,144737,147008,147265,149665,150341,148691,145609,148205,149907,152224,150548,145555,145240,143458,146764,142839,147200,147429,143133,140932,149378,147232,146488,149200,149260,143661,148033,146814,146749,148196,143643,145367,145025,144566,146519,143646,145830,146219,147056,145957,146199,150176,148389,146710,144270,148278,149686,142879,146278,145203,147501,145559,149617,151126,146668,146738,146996,143563,147188,150211,146741,148162,148851,146394,148069,142617,146344,142776,147539,145777,147640,147747,147320,146495,145814,143542,150163,143308,148922,149790,146274,144601,145168,149345,149720,142140,151304,148330,146687,145542,148761,146403,148057,145537,147954,147270,147640,148623,142961,147313,147246,146749,145872,148734,144062,147835,145592,145871,143427,147055,146261,145376,146205,150379,145879,146726,142654,147103,144851,146293,145770,148285,145258,143922,142378,145437,141773,144777,144552,144656,145256,145106,147728,143127,146959,149223,145987,145668,146924,146193,145794,145309,145677,144201,150407,146890,142884,144011,146376,147613,147121,144256,145979,149218,147018,144196,145195,145743,142629,150016,145831,144993,150667,146710,147273,144531,148054,145503,147780,148534,145426,146356,145874,144117,144016,141713,146279,144519,148488,140968,144863,145569,144316,146005,149310,149142,143735,148344,146751,144653,143076,144882,149009,143848,150988,147968,146313,147865,148406,146728,149447,145421,149576,150391,148586,146557,148110,145205,143042,150433,143574,146235,145717,147083,147427,148115,151790,143613,148696,145086,147180,143964,147956,150252,146863,147033,149075,146637,148747,146730,144264,149977,145836,146286,145676,147358,146390,147488,147292,143747,140814,146371,146745,145993,144350,145096,149743,147403,147174,146336,145596,150343,144840,147995,147235,143720,147429,144265,145416,148951,145437,145141,144033,146841,147080,149240,143839,146257,145949,150039,145530,148444,146029,145458,146743,143640,146194,148596,146617,148728,147293,142367,145647,142945,142423,146748,151083,145999,142242,149270,145526,147609,145774,143337,148754,143786,147199,148907,147617,143426,144758,145302,148010,148833,148368,146734,148655,145240,145559,148116,145212,143496,143032,149710,147994,140537,144690,146464,149215,147016,145519,151049,143572,148638,144296,148076,144396,143344,140723,144222,146456,145337,149638,148956,150156,148706,146515,145627,145436,148237,145189,147620,146837,146044,147484,145777,145369,148709,147420,144439,145473,151030,147195,146250,144022,142807,148796,148147,142799,141440,145308,148985,147492,144269,144391,147742,148951,150543,145007,143813,144112,146860,150412,145389,146116,146430,147471,148799,147633,146193,145914,146238,148016,143152,146364,146390,151393,144516,148873,146364,146837,144330,149269,147249,147128,146440,148398,145780,145189,148796,147135,146776,145220,147098,145876,145541,148488,147081,146175,145617,146743,144662,147060,143323,145612,150168,145780,149132,146487,144713,143844,149834,149309,142743,147282,142503,146326,145099,150584,148504,143893,150401,146332,145265,147802,144771,148862,143626,143458,144833,144894,144264,145077,146549,149147,144293,145437,144974,150699,145614,148079,147610,145511,149421,144513,147205,146834,144056,149133,148970,145726,149292,147384,146836,148252,150870,148838,146151,145347,143050,146243,146687,143768,145511,150170,144529,149686,146240,148047,145913,145060,147599,146359,146975,147105,147882,147763,141431,145198,149680,141707,149065,149128,147628,145266,148449,148907,144537,145879,143237,145581,143945,145864,146961,149377,149421,145912,147632,147698,150323,147866,150431,142504,143173,146857,143221,149042,147612,148141,143037,146755,149454,146150,143884,146223,148473,152077,146840,144721,146174,149292,148252,147709,150895,150970,146868,142846,147131,143463,146547,144290,147192,143071,150378,147706,140606,147520,147638,146179,145543,148634,145956,144872,143346,144283,145888,146188,145054,145886,143667,146335,146822,150710,143690,145222,145162,148111,149263,147776,146077,145085,150991,147294,148033,145375,149951,145191,149639,142159,145516,146791,148607,147137,143916,144541,143613,145156,147505,148460,143566,141998,147500,145283,144643,143831,147159,145120,147975,146846,143346,145891,146432,148618,142713,144803,146197,147385,147399,145955,147007,141695,148694,150882,147403,144806,149155,151174,146180,149493,146742,146970,143265,148555,148189,147794,144362,144329,148583,145405,143957,145985,145227,146937,148727,147794,146055,147956,144705,146712,145579,146151,146320,145746,151389,149443,150186,146108,147144,144397,144280,143043,144459,145732,143852,147611]}]},"null_count":0,"tot_col_size":1468327190,"last_update_version":401695339670405122},"l_quantity":{"histogram":{"ndv":50,"buckets":[{"count":7110137,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":7110000},{"count":13350258,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":6240000},{"count":20160390,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":6810000},{"count":26550514,"lower_bound":"NA==","upper_bound":"NA==","repeats":6390000},{"count":31950618,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":5400000},{"count":38430744,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":6480000},{"count":44640864,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":6210000},{"count":50460977,"lower_bound":"OA==","upper_bound":"OA==","repeats":5820000},{"count":56791100,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":6330000},{"count":61951199,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":5160000},{"count":67351304,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":5400000},{"count":72931412,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":5580000},{"count":78601522,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":5670000},{"count":84031627,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":5430000},{"count":90181746,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":6150000},{"count":96121861,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":5940000},{"count":102541986,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":6420000},{"count":108122094,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":5580000},{"count":113972207,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":5850000},{"count":119822320,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":5850000},{"count":125102423,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":5280000},{"count":130502527,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":5400000},{"count":137162656,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":6660000},{"count":142712764,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":5550000},{"count":148142869,"lower_bound":"MjU=","upper_bound":"MjU=","repeats":5430000},{"count":153812979,"lower_bound":"MjY=","upper_bound":"MjY=","repeats":5670000},{"count":160473108,"lower_bound":"Mjc=","upper_bound":"Mjc=","repeats":6660000},{"count":166683228,"lower_bound":"Mjg=","upper_bound":"Mjg=","repeats":6210000},{"count":172443340,"lower_bound":"Mjk=","upper_bound":"Mjk=","repeats":5760000},{"count":178353454,"lower_bound":"MzA=","upper_bound":"MzA=","repeats":5910000},{"count":184083565,"lower_bound":"MzE=","upper_bound":"MzE=","repeats":5730000},{"count":190293685,"lower_bound":"MzI=","upper_bound":"MzI=","repeats":6210000},{"count":196323802,"lower_bound":"MzM=","upper_bound":"MzM=","repeats":6030000},{"count":202653925,"lower_bound":"MzQ=","upper_bound":"MzQ=","repeats":6330000},{"count":208294034,"lower_bound":"MzU=","upper_bound":"MzU=","repeats":5640000},{"count":214654157,"lower_bound":"MzY=","upper_bound":"MzY=","repeats":6360000},{"count":221194284,"lower_bound":"Mzc=","upper_bound":"Mzc=","repeats":6540000},{"count":227104398,"lower_bound":"Mzg=","upper_bound":"Mzg=","repeats":5910000},{"count":232894511,"lower_bound":"Mzk=","upper_bound":"Mzk=","repeats":5790000},{"count":239194633,"lower_bound":"NDA=","upper_bound":"NDA=","repeats":6300000},{"count":245224749,"lower_bound":"NDE=","upper_bound":"NDE=","repeats":6030000},{"count":250984861,"lower_bound":"NDI=","upper_bound":"NDI=","repeats":5760000},{"count":256864975,"lower_bound":"NDM=","upper_bound":"NDM=","repeats":5880000},{"count":262535085,"lower_bound":"NDQ=","upper_bound":"NDQ=","repeats":5670000},{"count":268835207,"lower_bound":"NDU=","upper_bound":"NDU=","repeats":6300000},{"count":275165329,"lower_bound":"NDY=","upper_bound":"NDY=","repeats":6330000},{"count":280775438,"lower_bound":"NDc=","upper_bound":"NDc=","repeats":5610000},{"count":287195562,"lower_bound":"NDg=","upper_bound":"NDg=","repeats":6420000},{"count":293435683,"lower_bound":"NDk=","upper_bound":"NDk=","repeats":6240000},{"count":300005811,"lower_bound":"NTA=","upper_bound":"NTA=","repeats":6570000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,5999065,0,0,6003048,0,0,0,0,0,6002919,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999954,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997965,0,0,0,0,0,0,6001739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002499,0,0,0,0,0,0,0,0,6002662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999414,0,0,0,0,0,0,0,0,0,0,0,5999556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5995438,0,6005344,0,0,0,0,0,0,0,0,0,0,0,0,0,5996510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000673,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999120,0,0,0,0,0,0,0,0,0,0,0,0,0,6002325,0,0,6004848,0,0,0,0,0,0,0,0,0,0,0,5999373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998228,0,0,0,5999129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000786,0,0,6001394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000711,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001558,0,0,0,5998959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999291,0,0,6000658,0,5999797,0,0,0,0,0,0,0,0,0,5998808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5994520,0,0,0,0,0,0,6001451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996005,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002325,0,0,6003048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996510,0,5998346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001739,0,0,0,0,0,0,5995438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999946,0,0,0,0,0,0,6000489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002761,0,0,0,0,0,0,0,0,0,0,0,0,5999373,0,0,5997965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999291,0,0,6000673,0,0,0,0,6001451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000711,0,5998887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002662,0,6002919,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6005344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999232,0,0,0,0,0,0,0,0,5994520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999210,0,0,0,0,0,0,6000786,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999954,0,0,0,0,0,0,0,0,0,11998158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998808,0,0,0,0,0,0,0,5997802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998239,0,0,0,0,0,0,0,5999797,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001451,0,0,0,0,0,0,0,0,0,12000850,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002919,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999129,0,0,0,0,0,5999291,0,5999414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999797,0,5996005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999232,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000711,0,0,0,0,0,0,0,0,0,0,0,0,5997045,0,0,0,0,5997688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002499,0,0,0,0,0,0,0,0,6002152,0,5994520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998228,0,0,5995438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004033,0,0,0,0,0,0,6000403,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999065,0,0,0,0,6002019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999556,0,0,0,0,0,0,0,0,0,0,6000673,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000786,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999210,0,0,5999954,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6005344,0,0,0,0,0,0,0,0,6004014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[6000711,0,0,0,0,5997965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998959,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6003048,0,0,0,0,0,0,0,0,0,6004033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001394,0,0,0,0,0,0,0,0,0,0,5994520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002662,0,0,0,0,0,0,0,0,0,6002761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6005344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996510,0,0,0,0,0,0,0,0,0,0,6002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002152,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5995438,0,0,0,0,0,0,0,0,0,5999129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999930,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999954,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999414,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001451,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002919,0,0,5997045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999373,0,0,0,0,5999120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000786,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000403,0,0,0,0,0,0,5998239,0,6000673,0,0,0,0,0,5998887,0,0,0,0,5999232,0,0,0,0,0,5999291,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998228,0,0,0,0,0,0,5999946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999065,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997045,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000403,6002325,5999414,0,0,0,0,0,0,0,0,0,0,6000658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6003048,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998959,0,0,0,0,0,0,0,0,0,0,5997688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999065,0,0,0,0,0,0,0,0,0,0,0,0,6001451,0,0,0,0,0,0,0,0,0,0,0,6002919,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997802,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004848,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5997965,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5996005,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999232,0,0,0,0,0,0,0,0,0,0,5998346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999954,0,5996510,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998808,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002152,0,0,0,0,0,0,0,0,5999291,0,0,0,0,0,0,0,0,0,0,0,0,0,6001558,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5995438,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002499,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6002761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999946,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6005344,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999373,6000786,0,6000711,6002019,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999868,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999129,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6004014,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5994520,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5999930,0,0,0,0,0,0,5999210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6001394,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5998887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000673,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6000489,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":2700052299,"last_update_version":401695339709726724},"l_receiptdate":{"histogram":{"ndv":2555,"buckets":[{"count":1290024,"lower_bound":"MTk5Mi0wMS0xMw==","upper_bound":"MTk5Mi0wMy0wOA==","repeats":120000},{"count":2550049,"lower_bound":"MTk5Mi0wMy0wOQ==","upper_bound":"MTk5Mi0wMy0yNA==","repeats":120000},{"count":3750072,"lower_bound":"MTk5Mi0wMy0yNQ==","upper_bound":"MTk5Mi0wNC0xMw==","repeats":30000},{"count":4950095,"lower_bound":"MTk5Mi0wNC0xNA==","upper_bound":"MTk5Mi0wNC0yNg==","repeats":240000},{"count":6300122,"lower_bound":"MTk5Mi0wNC0yNw==","upper_bound":"MTk5Mi0wNS0wOA==","repeats":270000},{"count":7530145,"lower_bound":"MTk5Mi0wNS0wOQ==","upper_bound":"MTk5Mi0wNS0yMQ==","repeats":120000},{"count":8760169,"lower_bound":"MTk5Mi0wNS0yMg==","upper_bound":"MTk5Mi0wNi0wMQ==","repeats":90000},{"count":10080195,"lower_bound":"MTk5Mi0wNi0wMg==","upper_bound":"MTk5Mi0wNi0xMA==","repeats":240000},{"count":11400220,"lower_bound":"MTk5Mi0wNi0xMQ==","upper_bound":"MTk5Mi0wNi0yNA==","repeats":150000},{"count":12630244,"lower_bound":"MTk5Mi0wNi0yNQ==","upper_bound":"MTk5Mi0wNy0wMg==","repeats":120000},{"count":13830267,"lower_bound":"MTk5Mi0wNy0wMw==","upper_bound":"MTk5Mi0wNy0xMQ==","repeats":150000},{"count":15150293,"lower_bound":"MTk5Mi0wNy0xMg==","upper_bound":"MTk5Mi0wNy0yMA==","repeats":210000},{"count":16560320,"lower_bound":"MTk5Mi0wNy0yMQ==","upper_bound":"MTk5Mi0wOC0wMQ==","repeats":240000},{"count":17790344,"lower_bound":"MTk5Mi0wOC0wMg==","upper_bound":"MTk5Mi0wOC0xMA==","repeats":150000},{"count":19110370,"lower_bound":"MTk5Mi0wOC0xMQ==","upper_bound":"MTk5Mi0wOC0yMg==","repeats":150000},{"count":20340393,"lower_bound":"MTk5Mi0wOC0yMw==","upper_bound":"MTk5Mi0wOS0wMw==","repeats":180000},{"count":21540417,"lower_bound":"MTk5Mi0wOS0wNA==","upper_bound":"MTk5Mi0wOS0xMQ==","repeats":240000},{"count":22920443,"lower_bound":"MTk5Mi0wOS0xMg==","upper_bound":"MTk5Mi0wOS0yMA==","repeats":300000},{"count":24150467,"lower_bound":"MTk5Mi0wOS0yMQ==","upper_bound":"MTk5Mi0xMC0wMQ==","repeats":120000},{"count":25470493,"lower_bound":"MTk5Mi0xMC0wMg==","upper_bound":"MTk5Mi0xMC0xMA==","repeats":150000},{"count":26790518,"lower_bound":"MTk5Mi0xMC0xMQ==","upper_bound":"MTk5Mi0xMC0yMA==","repeats":150000},{"count":28080543,"lower_bound":"MTk5Mi0xMC0yMQ==","upper_bound":"MTk5Mi0xMC0yOQ==","repeats":150000},{"count":29280567,"lower_bound":"MTk5Mi0xMC0zMA==","upper_bound":"MTk5Mi0xMS0wNg==","repeats":180000},{"count":30540591,"lower_bound":"MTk5Mi0xMS0wNw==","upper_bound":"MTk5Mi0xMS0xNQ==","repeats":90000},{"count":31800615,"lower_bound":"MTk5Mi0xMS0xNg==","upper_bound":"MTk5Mi0xMS0yNQ==","repeats":210000},{"count":33090640,"lower_bound":"MTk5Mi0xMS0yNg==","upper_bound":"MTk5Mi0xMi0wNw==","repeats":180000},{"count":34350665,"lower_bound":"MTk5Mi0xMi0wOA==","upper_bound":"MTk5Mi0xMi0xOA==","repeats":240000},{"count":35580689,"lower_bound":"MTk5Mi0xMi0xOQ==","upper_bound":"MTk5Mi0xMi0yNg==","repeats":150000},{"count":36780712,"lower_bound":"MTk5Mi0xMi0yNw==","upper_bound":"MTk5My0wMS0wNQ==","repeats":30000},{"count":38040736,"lower_bound":"MTk5My0wMS0wNg==","upper_bound":"MTk5My0wMS0yMA==","repeats":210000},{"count":39240760,"lower_bound":"MTk5My0wMS0yMQ==","upper_bound":"MTk5My0wMS0yOA==","repeats":90000},{"count":40440783,"lower_bound":"MTk5My0wMS0yOQ==","upper_bound":"MTk5My0wMi0wOQ==","repeats":150000},{"count":41910811,"lower_bound":"MTk5My0wMi0xMA==","upper_bound":"MTk5My0wMi0xOA==","repeats":360000},{"count":43230837,"lower_bound":"MTk5My0wMi0xOQ==","upper_bound":"MTk5My0wMi0yNw==","repeats":180000},{"count":44490861,"lower_bound":"MTk5My0wMi0yOA==","upper_bound":"MTk5My0wMy0wOA==","repeats":120000},{"count":45720885,"lower_bound":"MTk5My0wMy0wOQ==","upper_bound":"MTk5My0wMy0xOQ==","repeats":270000},{"count":47010910,"lower_bound":"MTk5My0wMy0yMA==","upper_bound":"MTk5My0wMy0yOA==","repeats":120000},{"count":48300935,"lower_bound":"MTk5My0wMy0yOQ==","upper_bound":"MTk5My0wNC0wNw==","repeats":150000},{"count":49500958,"lower_bound":"MTk5My0wNC0wOA==","upper_bound":"MTk5My0wNC0xNg==","repeats":150000},{"count":50820984,"lower_bound":"MTk5My0wNC0xNw==","upper_bound":"MTk5My0wNC0yNw==","repeats":180000},{"count":52081008,"lower_bound":"MTk5My0wNC0yOA==","upper_bound":"MTk5My0wNS0wOA==","repeats":150000},{"count":53341033,"lower_bound":"MTk5My0wNS0wOQ==","upper_bound":"MTk5My0wNS0yMA==","repeats":150000},{"count":54601057,"lower_bound":"MTk5My0wNS0yMQ==","upper_bound":"MTk5My0wNi0wMQ==","repeats":90000},{"count":55831081,"lower_bound":"MTk5My0wNi0wMg==","upper_bound":"MTk5My0wNi0xMw==","repeats":150000},{"count":57031104,"lower_bound":"MTk5My0wNi0xNA==","upper_bound":"MTk5My0wNi0yNA==","repeats":180000},{"count":58321129,"lower_bound":"MTk5My0wNi0yNQ==","upper_bound":"MTk5My0wNy0wMw==","repeats":240000},{"count":59581154,"lower_bound":"MTk5My0wNy0wNA==","upper_bound":"MTk5My0wNy0xMQ==","repeats":180000},{"count":60871179,"lower_bound":"MTk5My0wNy0xMg==","upper_bound":"MTk5My0wNy0yMg==","repeats":120000},{"count":62071202,"lower_bound":"MTk5My0wNy0yMw==","upper_bound":"MTk5My0wOC0wMg==","repeats":30000},{"count":63331226,"lower_bound":"MTk5My0wOC0wMw==","upper_bound":"MTk5My0wOC0xMw==","repeats":90000},{"count":64741254,"lower_bound":"MTk5My0wOC0xNA==","upper_bound":"MTk5My0wOC0yNA==","repeats":240000},{"count":65941277,"lower_bound":"MTk5My0wOC0yNQ==","upper_bound":"MTk5My0wOS0wMg==","repeats":150000},{"count":67201301,"lower_bound":"MTk5My0wOS0wMw==","upper_bound":"MTk5My0wOS0xMg==","repeats":150000},{"count":68401324,"lower_bound":"MTk5My0wOS0xMw==","upper_bound":"MTk5My0wOS0yMQ==","repeats":330000},{"count":69781351,"lower_bound":"MTk5My0wOS0yMg==","upper_bound":"MTk5My0wOS0zMA==","repeats":270000},{"count":70981374,"lower_bound":"MTk5My0xMC0wMQ==","upper_bound":"MTk5My0xMC0wOQ==","repeats":90000},{"count":72181398,"lower_bound":"MTk5My0xMC0xMA==","upper_bound":"MTk5My0xMC0xOA==","repeats":240000},{"count":73381421,"lower_bound":"MTk5My0xMC0xOQ==","upper_bound":"MTk5My0xMC0yOA==","repeats":210000},{"count":74851449,"lower_bound":"MTk5My0xMC0zMA==","upper_bound":"MTk5My0xMS0wOQ==","repeats":300000},{"count":76201475,"lower_bound":"MTk5My0xMS0xMA==","upper_bound":"MTk5My0xMS0xNw==","repeats":210000},{"count":77431499,"lower_bound":"MTk5My0xMS0xOA==","upper_bound":"MTk5My0xMS0yOA==","repeats":270000},{"count":78751525,"lower_bound":"MTk5My0xMS0yOQ==","upper_bound":"MTk5My0xMi0xMA==","repeats":150000},{"count":79951548,"lower_bound":"MTk5My0xMi0xMQ==","upper_bound":"MTk5My0xMi0yMA==","repeats":150000},{"count":81241573,"lower_bound":"MTk5My0xMi0yMQ==","upper_bound":"MTk5My0xMi0yOQ==","repeats":180000},{"count":82471597,"lower_bound":"MTk5My0xMi0zMA==","upper_bound":"MTk5NC0wMS0wNw==","repeats":270000},{"count":83791623,"lower_bound":"MTk5NC0wMS0wOA==","upper_bound":"MTk5NC0wMS0xNg==","repeats":150000},{"count":85021646,"lower_bound":"MTk5NC0wMS0xNw==","upper_bound":"MTk5NC0wMS0yOA==","repeats":180000},{"count":86251670,"lower_bound":"MTk5NC0wMS0yOQ==","upper_bound":"MTk5NC0wMi0wOQ==","repeats":180000},{"count":87481694,"lower_bound":"MTk5NC0wMi0xMA==","upper_bound":"MTk5NC0wMi0yMg==","repeats":270000},{"count":88771719,"lower_bound":"MTk5NC0wMi0yMw==","upper_bound":"MTk5NC0wMy0wNQ==","repeats":180000},{"count":90061744,"lower_bound":"MTk5NC0wMy0wNg==","upper_bound":"MTk5NC0wMy0xNg==","repeats":120000},{"count":91351769,"lower_bound":"MTk5NC0wMy0xNw==","upper_bound":"MTk5NC0wMy0yNg==","repeats":240000},{"count":92701795,"lower_bound":"MTk5NC0wMy0yNw==","upper_bound":"MTk5NC0wNC0wNw==","repeats":210000},{"count":93991820,"lower_bound":"MTk5NC0wNC0wOA==","upper_bound":"MTk5NC0wNC0xOQ==","repeats":120000},{"count":95221844,"lower_bound":"MTk5NC0wNC0yMA==","upper_bound":"MTk5NC0wNC0yOA==","repeats":120000},{"count":96451868,"lower_bound":"MTk5NC0wNC0yOQ==","upper_bound":"MTk5NC0wNS0xMA==","repeats":180000},{"count":97651891,"lower_bound":"MTk5NC0wNS0xMQ==","upper_bound":"MTk5NC0wNS0yMg==","repeats":150000},{"count":99091919,"lower_bound":"MTk5NC0wNS0yNQ==","upper_bound":"MTk5NC0wNi0wNQ==","repeats":330000},{"count":100321943,"lower_bound":"MTk5NC0wNi0wNg==","upper_bound":"MTk5NC0wNi0xNw==","repeats":120000},{"count":101611968,"lower_bound":"MTk5NC0wNi0xOA==","upper_bound":"MTk5NC0wNi0yNQ==","repeats":120000},{"count":102871992,"lower_bound":"MTk5NC0wNi0yNg==","upper_bound":"MTk5NC0wNy0wNg==","repeats":120000},{"count":104102016,"lower_bound":"MTk5NC0wNy0wNw==","upper_bound":"MTk5NC0wNy0xNA==","repeats":210000},{"count":105302039,"lower_bound":"MTk5NC0wNy0xNQ==","upper_bound":"MTk5NC0wNy0yNw==","repeats":210000},{"count":106652065,"lower_bound":"MTk5NC0wNy0yOA==","upper_bound":"MTk5NC0wOC0wNg==","repeats":210000},{"count":108062093,"lower_bound":"MTk5NC0wOC0wNw==","upper_bound":"MTk5NC0wOC0xNg==","repeats":270000},{"count":109292116,"lower_bound":"MTk5NC0wOC0xNw==","upper_bound":"MTk5NC0wOC0yNA==","repeats":150000},{"count":110522140,"lower_bound":"MTk5NC0wOC0yNQ==","upper_bound":"MTk5NC0wOS0wMQ==","repeats":180000},{"count":111752164,"lower_bound":"MTk5NC0wOS0wMg==","upper_bound":"MTk5NC0wOS0xMQ==","repeats":90000},{"count":112952187,"lower_bound":"MTk5NC0wOS0xMg==","upper_bound":"MTk5NC0wOS0yMg==","repeats":90000},{"count":114212212,"lower_bound":"MTk5NC0wOS0yMw==","upper_bound":"MTk5NC0xMC0wNA==","repeats":210000},{"count":115562238,"lower_bound":"MTk5NC0xMC0wNQ==","upper_bound":"MTk5NC0xMC0xMw==","repeats":180000},{"count":116792262,"lower_bound":"MTk5NC0xMC0xNA==","upper_bound":"MTk5NC0xMC0yMQ==","repeats":90000},{"count":118202289,"lower_bound":"MTk5NC0xMC0yMg==","upper_bound":"MTk5NC0xMC0zMQ==","repeats":240000},{"count":119462313,"lower_bound":"MTk5NC0xMS0wMQ==","upper_bound":"MTk5NC0xMS0xMQ==","repeats":120000},{"count":120722338,"lower_bound":"MTk5NC0xMS0xMg==","upper_bound":"MTk5NC0xMS0yMQ==","repeats":90000},{"count":122012363,"lower_bound":"MTk5NC0xMS0yMg==","upper_bound":"MTk5NC0xMS0zMA==","repeats":150000},{"count":123332388,"lower_bound":"MTk5NC0xMi0wMQ==","upper_bound":"MTk5NC0xMi0wOQ==","repeats":210000},{"count":124532412,"lower_bound":"MTk5NC0xMi0xMA==","upper_bound":"MTk5NC0xMi0yMA==","repeats":180000},{"count":125822437,"lower_bound":"MTk5NC0xMi0yMQ==","upper_bound":"MTk5NC0xMi0zMQ==","repeats":120000},{"count":127022460,"lower_bound":"MTk5NS0wMS0wMQ==","upper_bound":"MTk5NS0wMS0xMA==","repeats":120000},{"count":128252484,"lower_bound":"MTk5NS0wMS0xMQ==","upper_bound":"MTk5NS0wMS0yMA==","repeats":210000},{"count":129482508,"lower_bound":"MTk5NS0wMS0yMQ==","upper_bound":"MTk5NS0wMS0yOA==","repeats":300000},{"count":130742532,"lower_bound":"MTk5NS0wMS0yOQ==","upper_bound":"MTk5NS0wMi0wNg==","repeats":330000},{"count":131972556,"lower_bound":"MTk5NS0wMi0wNw==","upper_bound":"MTk5NS0wMi0xNg==","repeats":60000},{"count":133202580,"lower_bound":"MTk5NS0wMi0xNw==","upper_bound":"MTk5NS0wMi0yNw==","repeats":120000},{"count":134462604,"lower_bound":"MTk5NS0wMi0yOA==","upper_bound":"MTk5NS0wMy0xMA==","repeats":150000},{"count":135752629,"lower_bound":"MTk5NS0wMy0xMQ==","upper_bound":"MTk5NS0wMy0yMQ==","repeats":120000},{"count":136952652,"lower_bound":"MTk5NS0wMy0yMg==","upper_bound":"MTk5NS0wNC0wMg==","repeats":120000},{"count":138182676,"lower_bound":"MTk5NS0wNC0wMw==","upper_bound":"MTk5NS0wNC0xMA==","repeats":90000},{"count":139412700,"lower_bound":"MTk5NS0wNC0xMQ==","upper_bound":"MTk5NS0wNC0yMQ==","repeats":90000},{"count":140822727,"lower_bound":"MTk5NS0wNC0yMg==","upper_bound":"MTk5NS0wNS0wMg==","repeats":240000},{"count":142052751,"lower_bound":"MTk5NS0wNS0wMw==","upper_bound":"MTk5NS0wNS0xMA==","repeats":180000},{"count":143252774,"lower_bound":"MTk5NS0wNS0xMQ==","upper_bound":"MTk5NS0wNS0xOQ==","repeats":90000},{"count":144542799,"lower_bound":"MTk5NS0wNS0yMA==","upper_bound":"MTk5NS0wNS0yOA==","repeats":210000},{"count":145802824,"lower_bound":"MTk5NS0wNS0yOQ==","upper_bound":"MTk5NS0wNi0wOA==","repeats":150000},{"count":147032847,"lower_bound":"MTk5NS0wNi0wOQ==","upper_bound":"MTk5NS0wNi0xOQ==","repeats":60000},{"count":148232871,"lower_bound":"MTk5NS0wNi0yMA==","upper_bound":"MTk5NS0wNi0yNw==","repeats":210000},{"count":149492895,"lower_bound":"MTk5NS0wNi0yOA==","upper_bound":"MTk5NS0wNy0wNw==","repeats":150000},{"count":150722919,"lower_bound":"MTk5NS0wNy0wOA==","upper_bound":"MTk5NS0wNy0xNg==","repeats":210000},{"count":152042945,"lower_bound":"MTk5NS0wNy0xNw==","upper_bound":"MTk5NS0wNy0yNA==","repeats":150000},{"count":153332970,"lower_bound":"MTk5NS0wNy0yNQ==","upper_bound":"MTk5NS0wOC0wMQ==","repeats":180000},{"count":154652995,"lower_bound":"MTk5NS0wOC0wMg==","upper_bound":"MTk5NS0wOC0xMA==","repeats":240000},{"count":155913019,"lower_bound":"MTk5NS0wOC0xMQ==","upper_bound":"MTk5NS0wOC0xOQ==","repeats":90000},{"count":157113043,"lower_bound":"MTk5NS0wOC0yMA==","upper_bound":"MTk5NS0wOC0zMA==","repeats":90000},{"count":158313066,"lower_bound":"MTk5NS0wOC0zMQ==","upper_bound":"MTk5NS0wOS0wNw==","repeats":90000},{"count":159513089,"lower_bound":"MTk5NS0wOS0wOA==","upper_bound":"MTk5NS0wOS0xNw==","repeats":120000},{"count":160773114,"lower_bound":"MTk5NS0wOS0xOA==","upper_bound":"MTk5NS0wOS0yOA==","repeats":180000},{"count":161973137,"lower_bound":"MTk5NS0wOS0yOQ==","upper_bound":"MTk5NS0xMC0wNQ==","repeats":210000},{"count":163293162,"lower_bound":"MTk5NS0xMC0wNg==","upper_bound":"MTk5NS0xMC0xNQ==","repeats":180000},{"count":164553187,"lower_bound":"MTk5NS0xMC0xNg==","upper_bound":"MTk5NS0xMC0yNg==","repeats":90000},{"count":165783211,"lower_bound":"MTk5NS0xMC0yNw==","upper_bound":"MTk5NS0xMS0wNQ==","repeats":120000},{"count":167103236,"lower_bound":"MTk5NS0xMS0wNg==","upper_bound":"MTk5NS0xMS0xNQ==","repeats":150000},{"count":168333260,"lower_bound":"MTk5NS0xMS0xNg==","upper_bound":"MTk5NS0xMS0yNw==","repeats":90000},{"count":169593284,"lower_bound":"MTk5NS0xMS0yOA==","upper_bound":"MTk5NS0xMi0wOA==","repeats":90000},{"count":170853309,"lower_bound":"MTk5NS0xMi0wOQ==","upper_bound":"MTk5NS0xMi0xOQ==","repeats":90000},{"count":172083333,"lower_bound":"MTk5NS0xMi0yMA==","upper_bound":"MTk5NS0xMi0zMA==","repeats":120000},{"count":173283356,"lower_bound":"MTk5NS0xMi0zMQ==","upper_bound":"MTk5Ni0wMS0wNw==","repeats":150000},{"count":174513380,"lower_bound":"MTk5Ni0wMS0wOA==","upper_bound":"MTk5Ni0wMS0xNw==","repeats":60000},{"count":175833405,"lower_bound":"MTk5Ni0wMS0xOA==","upper_bound":"MTk5Ni0wMS0yNg==","repeats":240000},{"count":177033429,"lower_bound":"MTk5Ni0wMS0yNw==","upper_bound":"MTk5Ni0wMi0wNA==","repeats":210000},{"count":178383455,"lower_bound":"MTk5Ni0wMi0wNQ==","upper_bound":"MTk5Ni0wMi0xNA==","repeats":180000},{"count":179643479,"lower_bound":"MTk5Ni0wMi0xNQ==","upper_bound":"MTk5Ni0wMi0yMg==","repeats":180000},{"count":180903504,"lower_bound":"MTk5Ni0wMi0yMw==","upper_bound":"MTk5Ni0wMy0wMw==","repeats":150000},{"count":182163528,"lower_bound":"MTk5Ni0wMy0wNA==","upper_bound":"MTk5Ni0wMy0xMg==","repeats":150000},{"count":183423552,"lower_bound":"MTk5Ni0wMy0xMw==","upper_bound":"MTk5Ni0wMy0yNQ==","repeats":150000},{"count":184773578,"lower_bound":"MTk5Ni0wMy0yNg==","upper_bound":"MTk5Ni0wNC0wMw==","repeats":240000},{"count":185973602,"lower_bound":"MTk5Ni0wNC0wNA==","upper_bound":"MTk5Ni0wNC0xMw==","repeats":180000},{"count":187233626,"lower_bound":"MTk5Ni0wNC0xNA==","upper_bound":"MTk5Ni0wNC0yOA==","repeats":90000},{"count":188433649,"lower_bound":"MTk5Ni0wNC0yOQ==","upper_bound":"MTk5Ni0wNS0wNw==","repeats":150000},{"count":189723674,"lower_bound":"MTk5Ni0wNS0wOA==","upper_bound":"MTk5Ni0wNS0xNw==","repeats":180000},{"count":191073701,"lower_bound":"MTk5Ni0wNS0xOA==","upper_bound":"MTk5Ni0wNS0yNw==","repeats":210000},{"count":192273724,"lower_bound":"MTk5Ni0wNS0yOA==","upper_bound":"MTk5Ni0wNi0wNg==","repeats":90000},{"count":193533748,"lower_bound":"MTk5Ni0wNi0wNw==","upper_bound":"MTk5Ni0wNi0xOA==","repeats":120000},{"count":194763772,"lower_bound":"MTk5Ni0wNi0xOQ==","upper_bound":"MTk5Ni0wNi0yOQ==","repeats":60000},{"count":196023796,"lower_bound":"MTk5Ni0wNi0zMA==","upper_bound":"MTk5Ni0wNy0xMA==","repeats":120000},{"count":197373823,"lower_bound":"MTk5Ni0wNy0xMQ==","upper_bound":"MTk5Ni0wNy0yMg==","repeats":180000},{"count":198663848,"lower_bound":"MTk5Ni0wNy0yMw==","upper_bound":"MTk5Ni0wOC0wMw==","repeats":270000},{"count":199953873,"lower_bound":"MTk5Ni0wOC0wNA==","upper_bound":"MTk5Ni0wOC0xMg==","repeats":180000},{"count":201273898,"lower_bound":"MTk5Ni0wOC0xMw==","upper_bound":"MTk5Ni0wOC0yMg==","repeats":180000},{"count":202533923,"lower_bound":"MTk5Ni0wOC0yMw==","upper_bound":"MTk5Ni0wOS0wMQ==","repeats":120000},{"count":203793947,"lower_bound":"MTk5Ni0wOS0wMg==","upper_bound":"MTk5Ni0wOS0xMA==","repeats":180000},{"count":205023971,"lower_bound":"MTk5Ni0wOS0xMQ==","upper_bound":"MTk5Ni0wOS0xOA==","repeats":180000},{"count":206403997,"lower_bound":"MTk5Ni0wOS0xOQ==","upper_bound":"MTk5Ni0wOS0yOA==","repeats":210000},{"count":207694022,"lower_bound":"MTk5Ni0wOS0yOQ==","upper_bound":"MTk5Ni0xMC0wNg==","repeats":240000},{"count":208924046,"lower_bound":"MTk5Ni0xMC0wNw==","upper_bound":"MTk5Ni0xMC0xNg==","repeats":150000},{"count":210244072,"lower_bound":"MTk5Ni0xMC0xNw==","upper_bound":"MTk5Ni0xMC0yNg==","repeats":180000},{"count":211534097,"lower_bound":"MTk5Ni0xMC0yNw==","upper_bound":"MTk5Ni0xMS0wNw==","repeats":120000},{"count":212884123,"lower_bound":"MTk5Ni0xMS0wOA==","upper_bound":"MTk5Ni0xMS0xOQ==","repeats":180000},{"count":214114147,"lower_bound":"MTk5Ni0xMS0yMA==","upper_bound":"MTk5Ni0xMS0zMA==","repeats":90000},{"count":215374171,"lower_bound":"MTk5Ni0xMi0wMQ==","upper_bound":"MTk5Ni0xMi0xMA==","repeats":150000},{"count":216604195,"lower_bound":"MTk5Ni0xMi0xMQ==","upper_bound":"MTk5Ni0xMi0yMQ==","repeats":90000},{"count":217894220,"lower_bound":"MTk5Ni0xMi0yMg==","upper_bound":"MTk5Ni0xMi0zMA==","repeats":150000},{"count":219094243,"lower_bound":"MTk5Ni0xMi0zMQ==","upper_bound":"MTk5Ny0wMS0wNw==","repeats":180000},{"count":220354268,"lower_bound":"MTk5Ny0wMS0wOA==","upper_bound":"MTk5Ny0wMS0xOA==","repeats":120000},{"count":221554291,"lower_bound":"MTk5Ny0wMS0yMA==","upper_bound":"MTk5Ny0wMS0yNw==","repeats":120000},{"count":222814315,"lower_bound":"MTk5Ny0wMS0yOA==","upper_bound":"MTk5Ny0wMi0wNw==","repeats":90000},{"count":224044339,"lower_bound":"MTk5Ny0wMi0wOA==","upper_bound":"MTk5Ny0wMi0xNg==","repeats":90000},{"count":225244362,"lower_bound":"MTk5Ny0wMi0xNw==","upper_bound":"MTk5Ny0wMi0yNQ==","repeats":240000},{"count":226474386,"lower_bound":"MTk5Ny0wMi0yNg==","upper_bound":"MTk5Ny0wMy0wOQ==","repeats":90000},{"count":227734411,"lower_bound":"MTk5Ny0wMy0xMA==","upper_bound":"MTk5Ny0wMy0yMA==","repeats":120000},{"count":229054436,"lower_bound":"MTk5Ny0wMy0yMQ==","upper_bound":"MTk5Ny0wMy0yOQ==","repeats":180000},{"count":230254459,"lower_bound":"MTk5Ny0wMy0zMA==","upper_bound":"MTk5Ny0wNC0xMA==","repeats":90000},{"count":231454483,"lower_bound":"MTk5Ny0wNC0xMQ==","upper_bound":"MTk5Ny0wNC0yMQ==","repeats":90000},{"count":232744508,"lower_bound":"MTk5Ny0wNC0yMg==","upper_bound":"MTk5Ny0wNS0wNA==","repeats":210000},{"count":233974531,"lower_bound":"MTk5Ny0wNS0wNQ==","upper_bound":"MTk5Ny0wNS0xNQ==","repeats":120000},{"count":235234556,"lower_bound":"MTk5Ny0wNS0xNg==","upper_bound":"MTk5Ny0wNS0yOA==","repeats":150000},{"count":236434579,"lower_bound":"MTk5Ny0wNS0yOQ==","upper_bound":"MTk5Ny0wNi0wNg==","repeats":180000},{"count":237634602,"lower_bound":"MTk5Ny0wNi0wNw==","upper_bound":"MTk5Ny0wNi0xNg==","repeats":30000},{"count":238894627,"lower_bound":"MTk5Ny0wNi0xNw==","upper_bound":"MTk5Ny0wNi0yOA==","repeats":90000},{"count":240184652,"lower_bound":"MTk5Ny0wNi0yOQ==","upper_bound":"MTk5Ny0wNy0wNw==","repeats":240000},{"count":241474677,"lower_bound":"MTk5Ny0wNy0wOA==","upper_bound":"MTk5Ny0wNy0xOQ==","repeats":120000},{"count":242734701,"lower_bound":"MTk5Ny0wNy0yMA==","upper_bound":"MTk5Ny0wNy0yOQ==","repeats":180000},{"count":243964725,"lower_bound":"MTk5Ny0wNy0zMA==","upper_bound":"MTk5Ny0wOC0wNg==","repeats":120000},{"count":245224749,"lower_bound":"MTk5Ny0wOC0wNw==","upper_bound":"MTk5Ny0wOC0xNA==","repeats":120000},{"count":246514774,"lower_bound":"MTk5Ny0wOC0xNQ==","upper_bound":"MTk5Ny0wOC0yNA==","repeats":180000},{"count":247744798,"lower_bound":"MTk5Ny0wOC0yNQ==","upper_bound":"MTk5Ny0wOC0zMQ==","repeats":210000},{"count":249094824,"lower_bound":"MTk5Ny0wOS0wMQ==","upper_bound":"MTk5Ny0wOS0xMg==","repeats":180000},{"count":250294848,"lower_bound":"MTk5Ny0wOS0xMw==","upper_bound":"MTk5Ny0wOS0yMw==","repeats":120000},{"count":251524871,"lower_bound":"MTk5Ny0wOS0yNA==","upper_bound":"MTk5Ny0xMC0wNQ==","repeats":60000},{"count":252784896,"lower_bound":"MTk5Ny0xMC0wNg==","upper_bound":"MTk5Ny0xMC0xNA==","repeats":90000},{"count":253984919,"lower_bound":"MTk5Ny0xMC0xNQ==","upper_bound":"MTk5Ny0xMC0yNA==","repeats":60000},{"count":255274944,"lower_bound":"MTk5Ny0xMC0yNQ==","upper_bound":"MTk5Ny0xMS0wMw==","repeats":210000},{"count":256474967,"lower_bound":"MTk5Ny0xMS0wNA==","upper_bound":"MTk5Ny0xMS0xMQ==","repeats":120000},{"count":257764992,"lower_bound":"MTk5Ny0xMS0xMg==","upper_bound":"MTk5Ny0xMS0yMw==","repeats":120000},{"count":258995016,"lower_bound":"MTk5Ny0xMS0yNA==","upper_bound":"MTk5Ny0xMi0wNg==","repeats":150000},{"count":260195039,"lower_bound":"MTk5Ny0xMi0wNw==","upper_bound":"MTk5Ny0xMi0xNQ==","repeats":210000},{"count":261485064,"lower_bound":"MTk5Ny0xMi0xNg==","upper_bound":"MTk5Ny0xMi0yNg==","repeats":180000},{"count":262895092,"lower_bound":"MTk5Ny0xMi0yNw==","upper_bound":"MTk5OC0wMS0wNw==","repeats":240000},{"count":264095115,"lower_bound":"MTk5OC0wMS0wOA==","upper_bound":"MTk5OC0wMS0xNw==","repeats":120000},{"count":265325139,"lower_bound":"MTk5OC0wMS0xOA==","upper_bound":"MTk5OC0wMS0yNg==","repeats":60000},{"count":266645164,"lower_bound":"MTk5OC0wMS0yNw==","upper_bound":"MTk5OC0wMi0wNg==","repeats":150000},{"count":267935189,"lower_bound":"MTk5OC0wMi0wNw==","upper_bound":"MTk5OC0wMi0xNw==","repeats":270000},{"count":269135213,"lower_bound":"MTk5OC0wMi0xOA==","upper_bound":"MTk5OC0wMi0yNg==","repeats":210000},{"count":270365236,"lower_bound":"MTk5OC0wMi0yNw==","upper_bound":"MTk5OC0wMy0wOQ==","repeats":270000},{"count":271565260,"lower_bound":"MTk5OC0wMy0xMA==","upper_bound":"MTk5OC0wMy0xOA==","repeats":60000},{"count":272795283,"lower_bound":"MTk5OC0wMy0xOQ==","upper_bound":"MTk5OC0wMy0yNw==","repeats":90000},{"count":274025307,"lower_bound":"MTk5OC0wMy0yOA==","upper_bound":"MTk5OC0wNC0wNA==","repeats":150000},{"count":275315332,"lower_bound":"MTk5OC0wNC0wNQ==","upper_bound":"MTk5OC0wNC0xMw==","repeats":180000},{"count":276665358,"lower_bound":"MTk5OC0wNC0xNA==","upper_bound":"MTk5OC0wNC0yNA==","repeats":210000},{"count":277895382,"lower_bound":"MTk5OC0wNC0yNQ==","upper_bound":"MTk5OC0wNS0wMw==","repeats":180000},{"count":279155407,"lower_bound":"MTk5OC0wNS0wNA==","upper_bound":"MTk5OC0wNS0xNA==","repeats":120000},{"count":280535433,"lower_bound":"MTk5OC0wNS0xNQ==","upper_bound":"MTk5OC0wNS0yMg==","repeats":330000},{"count":281735457,"lower_bound":"MTk5OC0wNS0yMw==","upper_bound":"MTk5OC0wNi0wMQ==","repeats":150000},{"count":282965480,"lower_bound":"MTk5OC0wNi0wMg==","upper_bound":"MTk5OC0wNi0xNA==","repeats":210000},{"count":284195504,"lower_bound":"MTk5OC0wNi0xNQ==","upper_bound":"MTk5OC0wNi0yNA==","repeats":150000},{"count":285515530,"lower_bound":"MTk5OC0wNi0yNQ==","upper_bound":"MTk5OC0wNy0wMw==","repeats":180000},{"count":286835555,"lower_bound":"MTk5OC0wNy0wNA==","upper_bound":"MTk5OC0wNy0xMQ==","repeats":180000},{"count":288185582,"lower_bound":"MTk5OC0wNy0xMg==","upper_bound":"MTk5OC0wNy0yMA==","repeats":330000},{"count":289535608,"lower_bound":"MTk5OC0wNy0yMQ==","upper_bound":"MTk5OC0wNy0zMA==","repeats":300000},{"count":290765632,"lower_bound":"MTk5OC0wNy0zMQ==","upper_bound":"MTk5OC0wOC0xMA==","repeats":90000},{"count":292085657,"lower_bound":"MTk5OC0wOC0xMQ==","upper_bound":"MTk5OC0wOC0yMg==","repeats":180000},{"count":293375682,"lower_bound":"MTk5OC0wOC0yMw==","upper_bound":"MTk5OC0wOC0zMA==","repeats":150000},{"count":294575705,"lower_bound":"MTk5OC0wOC0zMQ==","upper_bound":"MTk5OC0wOS0wOA==","repeats":150000},{"count":295775729,"lower_bound":"MTk5OC0wOS0wOQ==","upper_bound":"MTk5OC0wOS0yMQ==","repeats":60000},{"count":297125755,"lower_bound":"MTk5OC0wOS0yMg==","upper_bound":"MTk5OC0xMC0wNg==","repeats":180000},{"count":298325778,"lower_bound":"MTk5OC0xMC0wNw==","upper_bound":"MTk5OC0xMC0yMg==","repeats":90000},{"count":299555802,"lower_bound":"MTk5OC0xMC0yMw==","upper_bound":"MTk5OC0xMS0yNw==","repeats":90000},{"count":300005811,"lower_bound":"MTk5OC0xMS0yOA==","upper_bound":"MTk5OC0xMi0xNg==","repeats":30000}]},"cm_sketch":{"rows":[{"counters":[240550,191735,248749,125159,249427,124317,0,124313,412715,125112,582815,125311,0,123829,0,125486,249964,0,124887,125107,125037,124675,124747,125227,124592,0,0,249107,124757,124113,0,125778,124570,249178,124653,0,0,498304,374478,0,373758,124710,123945,249551,247037,250123,374823,0,308070,0,124262,27455,124493,313607,0,373372,0,249348,124537,124382,0,373759,0,0,0,538332,249188,124077,124572,193650,0,124774,374473,0,124577,248803,0,0,249054,249774,0,124029,200827,374822,95968,177579,125639,125047,0,249505,279659,124430,124692,248890,0,124442,124777,0,0,0,0,0,0,124874,185156,0,0,336062,125070,0,250065,124586,124728,248943,0,964,0,124495,0,249133,535561,124515,0,498240,0,124785,250463,587324,0,124795,249492,249058,374080,0,125051,124858,0,124538,124799,124720,124588,259210,249234,0,0,249450,0,205621,125391,0,124758,124487,175524,0,0,0,0,249625,249437,0,0,0,124617,0,0,249577,373912,249476,0,124499,249623,0,249748,124275,0,0,248723,124569,0,124500,124473,125259,249991,0,0,218214,124625,0,90186,125275,124756,454496,0,11043,48651,0,0,124438,124981,125245,125194,124938,124595,0,123811,505768,140905,124769,124525,125005,307901,249447,0,0,124090,249736,124957,0,249330,55992,249830,372495,125137,124459,124821,0,497587,0,196888,249683,248748,249493,257570,372934,124834,249691,0,0,248657,124866,0,0,124092,124437,124203,0,124948,0,0,249512,124657,249665,0,249707,623553,124866,482210,0,250292,0,124792,0,124526,249011,124236,0,124203,124804,291845,124855,249678,0,0,248271,250081,124757,57107,373896,0,125232,124450,124752,0,124407,124496,188535,499006,0,249274,382247,249370,0,124463,0,125068,124983,249448,352617,124235,249326,496532,375064,0,124662,0,124538,124417,146619,497343,124313,125246,124669,249480,0,498410,125103,124152,249629,124724,124768,351701,0,124761,215273,0,124189,0,249443,124843,249318,125034,0,248093,124275,249187,0,0,0,0,249292,84792,0,0,124841,0,0,249446,30,249026,248765,117261,0,124614,374127,0,0,124667,214952,0,250429,373227,0,124739,423488,250081,124906,249233,124293,373977,372831,125317,0,124937,0,124360,94534,124997,0,123941,498256,124375,249567,248851,124748,124838,0,0,156151,307898,374232,119892,246167,0,124816,373724,0,0,124545,373037,249086,0,0,124404,249394,124700,0,0,498453,372978,0,0,374744,0,373247,315131,139462,124790,0,0,373888,124922,124858,127297,0,124680,0,0,124510,0,43789,124713,374063,0,124082,211939,0,249394,622910,124666,249781,0,124327,124987,0,125267,306887,0,0,249588,125021,248965,124768,0,373783,373643,0,0,0,100168,0,0,0,0,125169,0,0,0,254152,124882,249157,124620,124099,0,0,0,54657,373788,124982,0,0,0,124493,373709,248983,374096,249019,124704,0,0,0,162034,249239,124437,0,123873,249376,0,0,185615,124870,124705,125395,249944,0,249561,249576,248690,311604,373423,195631,124940,0,248571,125667,249582,249012,0,249616,498303,99731,125455,327915,0,249839,0,0,125208,124429,117652,124716,0,419979,124913,125132,124300,124637,124634,249388,124594,176793,124418,124055,124708,124375,0,748593,0,0,0,124723,124520,497040,160644,0,124523,0,46074,0,249074,125041,125179,124694,374074,248898,0,248363,0,124358,313062,124644,0,124765,249527,125058,124615,124995,125072,124499,373789,125008,124659,374301,0,124579,373264,125264,249593,0,124885,0,0,0,151296,125039,124704,0,124954,124774,124659,124655,125128,249934,451421,125078,249035,248985,0,124603,0,0,0,0,0,374513,249416,0,5981,124802,249604,248326,123975,123971,0,124616,0,125199,0,125090,249180,125517,0,0,0,124203,32685,499164,373591,124761,0,0,274830,0,124526,207826,249752,128127,124176,123857,123904,0,125028,250141,124643,0,125012,0,124854,249325,123875,0,124482,0,0,0,0,124860,249691,463711,249018,124499,124717,173229,0,249321,0,0,0,124675,500058,249696,249588,0,248545,124526,124537,248245,124031,249859,480095,0,124922,124341,124764,124929,124469,125475,196262,0,46925,124796,248920,374458,0,375139,0,0,250010,0,124648,0,249489,124187,0,393617,0,177816,498450,124494,249337,0,249254,0,0,124403,498066,230389,249627,75893,249889,319,124962,209581,0,124848,0,125006,373529,124609,124892,124963,249947,124653,497035,250465,249943,249694,567203,249057,124736,124914,0,234117,0,249398,0,624016,124539,0,0,0,0,124763,124395,124947,21323,373422,498351,0,0,374710,0,124448,124670,0,0,125049,249709,248823,0,372128,0,124988,0,375222,42855,123901,0,373921,125281,124614,124736,748818,0,124541,124706,124220,0,0,249943,121279,0,124748,0,124419,249289,124929,125226,124416,115426,124980,492809,124374,0,0,124058,125357,124611,123943,124485,249863,0,13240,0,124978,372959,274492,125130,249647,124473,249451,0,488345,0,459052,0,124227,125692,124750,374429,0,124567,125008,248738,250163,0,124176,124530,125176,0,124512,124985,123437,0,331383,124189,374306,361238,0,0,125014,18075,0,124484,249170,249205,0,0,498828,124676,249617,124044,0,124867,249036,124246,124368,124825,248888,124388,124429,0,125182,0,374986,124895,124641,0,374172,108502,241415,0,0,127717,124552,124323,0,272054,124567,0,27,124243,249230,249865,124235,250010,249470,0,249040,124313,249118,0,124866,195340,0,497973,0,124773,249262,319077,0,124687,124276,299961,0,124739,125129,499869,249411,125247,118381,246837,124723,124925,124395,153820,248784,250187,0,124632,345478,0,249804,123902,157101,124276,373860,102002,0,124614,125191,0,0,124548,124030,0,249208,0,124907,0,373944,124981,125040,124907,248831,124707,20046,248864,374633,499034,0,92044,249336,0,0,0,0,249124,250048,124110,124822,124708,141895,381917,0,124623,124254,124869,373327,249846,294297,124972,193436,374358,0,124251,125218,0,0,125047,249759,248730,0,250105,125278,124719,125148,0,0,124501,247994,125120,125007,124378,124435,125035,125001,249867,249314,0,125256,0,124745,124770,124751,0,245144,125196,374351,124175,372916,249443,124418,249539,0,249664,249302,0,0,125148,248982,0,249808,124665,0,108807,124356,124038,0,124739,0,497874,125625,250339,249319,249996,499568,124650,0,0,373099,283309,124116,124204,749026,249286,0,250501,0,124489,248392,0,373997,326430,373848,343798,249600,124340,124351,249120,124414,115247,124699,249445,248761,0,124712,0,125346,124226,124712,124524,0,124618,250588,366802,0,55288,125087,0,249668,124794,323183,0,124978,179874,248902,249015,124317,124570,124384,0,124883,248948,112153,239428,124384,248644,0,249169,207703,249318,0,124627,249047,249573,124353,291637,74438,0,249406,124893,125031,124364,0,124855,0,0,51819,249742,124625,0,248229,373893,1951,138272,124668,0,374035,0,124603,248760,373400,248828,124529,124406,0,124756,0,125192,124258,124415,0,249897,374673,222753,248803,373636,0,124589,0,124633,0,499119,0,0,0,0,249071,248791,124605,123981,248583,498349,248626,154656,0,0,0,373108,248716,0,124933,124662,249648,249682,126017,0,249355,0,0,250647,124383,124600,125472,249746,0,0,124490,248600,0,248657,103553,457789,171826,504140,124799,0,118803,123643,130701,125128,249034,0,130099,125000,124623,124844,124457,249988,500141,124882,124687,497833,124922,0,124749,0,124808,245713,248948,124968,124869,0,249166,0,0,360020,124836,249760,124448,248669,0,124908,249688,373954,125169,258424,0,0,323297,0,248899,0,0,0,249388,124946,373760,248432,124858,0,0,249281,104422,0,372813,249652,0,248717,248871,374686,0,498479,124721,129658,0,0,125149,125023,125070,373481,0,0,0,0,125370,0,186965,165871,0,124584,124535,249390,249581,0,0,124557,0,123861,0,0,249543,249299,374426,125241,249129,151444,124503,249736,249706,374117,139577,124869,0,124673,0,124296,248819,0,124411,141200,124611,34573,0,196798,124821,0,125409,86280,124900,125279,0,124693,249732,125013,125122,125074,748944,373402,0,124815,0,0,374303,249044,124603,0,249579,163322,0,0,124651,0,0,201261,249623,125142,124952,124542,125331,0,124809,28404,377767,124698,125374,362121,374305,248603,250519,249805,0,0,96849,124301,250264,499889,374682,249794,374964,124896,3085,248921,136703,124174,249396,284681,0,124326,373202,452694,124778,373689,0,249521,124749,0,124634,0,0,294056,126386,0,0,125317,249928,125290,0,250122,249787,124507,0,308250,364075,124296,250470,0,0,249212,373136,248478,0,0,0,623306,174234,124427,374633,0,387147,0,249430,0,124808,218539,124542,0,249575,125185,0,0,0,0,0,0,0,422063,0,249293,124707,124613,124737,238277,124241,124617,0,0,124758,249088,3676,125120,249593,125552,498887,5148,373628,249461,124139,125065,498453,0,124692,0,0,249035,124612,124562,249881,122130,0,0,125172,127934,124469,332925,124068,124547,124846,248687,0,0,142984,124946,0,249967,374538,124679,125068,0,249293,249592,624322,124801,0,249686,124686,249883,497470,248240,124484,0,125015,0,194467,0,124224,249711,498986,124514,162585,124687,293882,36557,125047,374444,105790,0,249517,124483,498730,124833,622086,190072,124791,373724,0,124507,124259,249989,0,163486,248648,249402,282622,0,124359,124311,125082,0,124571,0,249346,123975,498528,248793,427189,498063,497758,223704,624083,124918,250067,124295,99994,131914,374642,124900,124757,124379,0,0,249586,249580,124176,249210,373148,373517,124209,345587,374388,124629,124616,250185,47837,0,0,494874,124418,0,279666,0,0,123771,124333,124716,221019,374550,0,124877,124593,124790,0,125056,124872,372937,125026,0,249646,0,249484,0,124737,249747,249603,124647,249843,124796,0,0,249158,0,249013,0,124704,0,0,124702,124979,0,124487,124672,0,0,248076,0,249869,249035,124885,0,212742,1491,124616,249448,249429,124196,124556,1433,124677,0,125053,125149,124500,498763,125393,160462,124725,249055,0,249335,124779,183047,374305,124772,0,373018,125169,0,124703,249529,124881,250047,124795,124650,124140,249216,249606,0,211669,0,124619,124671,124587,124793,355459,124770,249407,149404,125166,124994,124549,0,125073,0,124670,0,0,0,125343,249076,156507,0,0,0,124681,0,374795,124466,497777,0,0,124610,249652,124823,124907,0,124467,0,0,124229,0,8427,340653,0,0,498659,124804,373875,250240,0,124498,248520,0,249646,373815,248838,0,0,0,0,249142,374815,249398,248729,0,0,497316,249754,366473,249312,0,124904,0,124639,1349,249055,248713,124063,124927,124942,0,124399,250760,249590,0,124935,0,124886,0,375489,374724,124397,250026,375053,0,249703,0,0,124423,0,125055,358985,124383,124975,124647,0,124413,374077,204575,0,0,0,124869,248972,0,125436,0,124556,0,0,0,124717,374046,0,125283,249491,137920,249902,0,0,123344,124382,250293,124732,249481,0,0,124320,124466,0,0,0,0,124247,500271,124913,249648,0,124543,249510,228563,248986,189106,374908,124864,195044,124858,222759,524443,0,124686,373958,124377,497980,370515,0,0,0,244607,0,0,124760,124421,124683,249218,0,124593,248821,0,0,0,0,124831,249212,29395,0,23258,352557,0,124006,0,0,0,0,0,0,0,109671,0,124514,124978,0,41602,124240,249211,125024,125005,249179,498438,0,124721,125351,249086,250164,0,249743,0,216293,124514,249177,0,66367,0,0,249679,125506,0,124608,249521,374136,124916,0,362728,124423,395237,203565,124292,125045,124985,124340,372830,375745,0,124500,124063,0,124704,124843,0,0,0,0,0,125123,0,125669,248203,0,124272,124910,124702,124338,249405,873469,186230,230823,124790,0,124643,124630,248998,249042,124467,124104,497887,249713,0,124245,124568,124799,0,249323,124741,0,351628,0,373702,124391,32206,0,0,244755,124878,374304,184852,0,124991,0,496683,0,0,98578,248677,268541,0,0,0,372872,10462,230489,0,249163,124876,124586,124171,124937,249392,0,3990,124537,374152,249112,374848,0,11251,249671,248897,0,131329,249017,0,124636,249289,124567,124802,124926,0,124835,125134,249579,124852,373765,124127,124171,249519,272710,124602,249861,249782,330777,124476,0,374791,125310,124049,0,249351,250027,124752]},{"counters":[125074,499384,249509,236948,249831,0,0,498010,0,368946,124776,124419,124724,124714,124395,50848,104416,0,0,124612,0,35704,249386,124741,124719,124880,0,125248,249169,124358,124137,249321,0,249152,125191,249170,498335,0,0,0,120194,0,0,374356,248967,0,499415,168353,125120,249303,0,249181,249427,0,124922,0,498754,249435,125011,123781,0,373373,195856,125625,0,249722,0,10462,0,124384,250247,0,0,0,249506,374008,125042,0,124593,124557,249481,249560,374052,123998,0,0,124845,180929,249965,0,0,248898,201290,124769,221734,125409,173694,124473,124951,374889,124801,87128,249017,124692,0,0,0,191675,249440,374306,375436,0,248281,0,124219,124686,124055,124493,0,248477,124676,374149,374457,248810,0,248938,30373,282632,0,0,0,124866,110648,165747,110237,125185,249271,0,0,124861,124785,124940,124698,124721,623977,0,249285,0,125053,0,0,373023,125050,0,0,124514,39783,124895,0,0,0,124936,0,124310,31480,374755,337264,124870,124827,0,124576,249040,249099,249832,374230,0,0,249536,249638,124689,0,249538,375308,0,0,124526,374118,124991,58534,217955,124779,0,124203,249854,249231,538879,249809,0,15987,0,0,124702,125131,374281,124553,245531,124912,249529,249179,0,0,0,136108,124597,124840,124993,124578,374279,0,0,124624,0,124819,0,124531,124609,249526,0,126003,230296,248553,249388,0,124345,248527,499327,249320,0,0,249696,124862,0,125373,137043,0,249909,0,0,374153,374449,0,0,249372,0,72685,0,0,124512,194306,0,0,360050,124530,125320,250185,124762,0,251478,0,124376,124901,248392,124994,216115,0,0,248953,0,0,498656,0,124640,0,0,0,374115,0,254299,0,0,153220,0,249351,249037,125193,249531,311439,0,124340,249955,249389,0,374333,253559,0,0,269676,89935,0,124937,250103,0,0,0,124373,124644,124953,249625,80765,0,124476,24112,0,124154,0,0,470052,124647,0,124808,124451,374161,124731,249964,498358,0,0,124878,249424,442399,124476,124704,124838,128548,124570,124538,374078,124941,125105,250676,249617,0,249205,124741,0,132474,0,0,124963,124339,125015,248731,0,374599,373929,369481,124404,124817,46799,249035,0,0,374637,249109,124845,0,124478,249641,0,249075,249470,374578,123899,0,273163,124574,0,375259,108502,125209,249864,124763,0,222020,124732,248986,125050,249754,498860,250143,497412,124705,0,124461,124060,124667,248859,123873,0,124459,125179,249544,125122,125196,373524,249805,125115,125020,0,124916,124575,0,249263,188496,78723,249565,249852,124092,125227,0,246679,375893,250459,124711,125043,124411,373597,244361,249069,373975,379793,123808,0,124405,429552,0,0,0,249934,124360,0,124643,250238,0,125172,124817,124760,0,124713,124483,124241,124980,314781,124382,0,124996,36557,248955,124641,0,248505,0,0,124768,498169,0,249300,124483,0,249175,249561,124641,124819,124384,124555,0,0,248131,0,248900,486635,0,374087,248640,124784,0,499168,123452,248752,160715,0,0,254326,103185,497954,0,248823,367451,0,375261,124154,124479,0,182996,0,366080,180218,249317,124907,124925,125083,0,0,497002,0,374621,0,249805,124373,0,124408,124563,498829,0,249678,124822,249203,249083,125076,125407,0,124651,249748,249381,0,0,0,249997,124315,124013,248857,249599,0,0,125395,124807,249877,248829,0,0,124474,0,85434,0,249767,58164,0,52117,249818,249121,374421,625167,248484,250076,124101,124431,249731,339605,66930,248639,374070,249929,249782,3676,0,375084,0,124618,249220,319822,0,0,249806,0,124351,248512,0,250564,498678,0,318235,362940,124715,166736,373355,124713,124417,249030,249548,368441,249244,124571,124813,0,250007,249582,0,249056,124735,173446,251536,250089,0,0,374309,124009,299010,374612,249293,124176,0,497166,374288,249405,373452,124650,0,0,124450,124723,249486,0,0,123976,0,125088,0,248758,0,4786,249616,124632,249303,0,124333,124643,249428,233643,373499,249490,125005,373192,373296,124895,498113,150624,124984,0,0,249170,124740,249266,125234,249906,0,249684,124738,0,0,249408,0,0,0,0,124384,499713,0,247478,0,124396,124182,124902,249803,0,375570,0,0,0,0,124743,0,124981,170306,125324,373858,0,124595,125552,125041,98578,100168,249145,220594,169053,0,0,123698,124728,0,720618,498948,0,373607,0,0,124962,249379,356782,250734,124603,373078,124708,124905,77191,0,258103,124082,499110,0,499351,124499,249631,5287,373475,248970,0,0,397097,249243,124537,0,0,0,75855,0,0,124728,374123,248845,124482,124556,222940,249531,127214,249926,124092,249901,125330,249542,249104,249208,125019,124332,124942,66384,0,249173,0,374307,124287,0,124847,0,0,83686,0,123972,0,125202,124734,125249,748909,364774,124493,124556,27455,124811,375525,0,125328,0,0,124530,0,124473,0,0,250017,249981,124405,249089,249146,0,0,125180,124739,124843,249154,250226,249263,124641,0,249286,124361,249585,47574,355096,249419,124976,499336,0,249110,249365,0,310221,125161,124561,266132,249705,249953,338698,0,249657,124629,0,125477,0,487208,0,0,43789,0,250127,250363,125553,249052,249852,499366,0,373685,124703,172063,124842,0,249513,265073,249533,124869,331286,499691,124068,0,124886,12939,0,124929,163339,124769,385176,373878,124140,0,125071,249576,124350,124677,0,374368,249261,248882,125246,0,0,0,124181,123437,125051,373568,399996,248835,249825,247290,499273,623982,236256,0,125034,249506,124904,124767,0,124758,125357,241585,0,374361,125155,0,0,248991,37761,124686,0,124700,249633,124124,0,387267,0,125038,123968,124580,0,124620,124347,0,125045,124500,248600,234739,249346,124320,0,248741,124338,249485,124459,249214,249507,249228,373344,0,0,125290,249721,0,124539,0,249092,124633,124585,124687,125067,249366,124821,0,124538,0,0,964,249836,0,374810,0,0,249532,0,248987,124587,0,84792,0,124413,88363,0,124259,0,0,126702,124824,249031,249658,374185,0,0,0,119292,248822,125006,124440,123925,196949,14800,249053,0,249571,125189,0,0,0,124672,248804,249293,125506,375207,249616,0,125137,329617,0,125317,0,0,249151,0,0,0,0,489608,0,124502,373875,124676,248983,249743,124958,124720,124747,373714,124756,373225,0,124310,184256,374273,447429,0,124978,0,0,143200,0,0,0,124406,124671,0,0,125024,68695,0,373158,124576,248564,374392,0,0,0,14846,373781,125032,498613,373559,0,0,124084,124883,203568,249516,437111,124916,0,375336,303395,0,0,124488,0,0,0,225495,124148,249374,373774,258452,374545,2796,373538,0,0,0,0,372954,1903,249260,0,374254,0,124712,424541,250336,249656,249462,249039,0,124996,124685,249246,124542,0,124527,124660,248908,249772,125192,248829,124886,124502,241213,124427,124709,248863,0,124803,99731,125065,0,125207,124313,0,124227,0,124240,250193,250142,0,373802,124704,0,247058,259296,0,249434,250250,373920,745749,124992,374698,248817,0,248375,249713,124399,0,33511,0,235996,124858,499052,250069,124634,0,373387,499501,125669,249827,374135,0,274341,124729,249291,249592,124506,124954,0,124662,0,249597,124637,0,125072,124983,0,124797,124418,124490,124463,0,0,124613,125411,124665,249377,125123,124632,249660,328,0,124890,426914,125005,124703,124765,0,0,0,125047,99478,248982,0,124475,0,124247,748646,124254,0,0,0,0,124485,248935,0,249991,249387,124913,412769,373549,0,231618,0,373696,426025,188067,0,499666,249154,0,125055,249873,124639,498663,124388,248897,0,150345,125173,124414,124838,63407,374033,125122,249887,373546,124617,248906,124391,0,125189,125436,8112,124480,249741,0,124383,124433,124445,530583,124437,249245,124618,0,0,0,0,379790,0,580824,0,0,125091,0,42855,322576,249461,124713,0,0,0,250236,249817,124334,125331,0,0,124162,124425,124592,250406,115247,0,497084,0,124659,0,124583,281048,124494,374020,248784,227038,249525,125016,0,232465,124384,124867,124635,374956,249708,124595,123902,0,374075,0,123624,219042,124511,249354,373856,124800,248330,0,32685,500158,125243,124547,248993,0,123811,124804,214316,249069,124526,28339,0,124757,249199,0,200708,0,125070,22100,124710,124711,249176,0,124940,124860,124610,0,374362,249408,249166,0,168914,18075,124910,249417,0,124443,373564,124906,0,250780,0,0,250188,0,125007,248932,0,124783,0,0,0,209453,124542,0,0,124899,125066,0,498372,0,0,125286,0,748962,124453,124556,0,0,0,124476,124550,124272,124269,0,248657,0,248971,124812,0,249132,124479,248457,2659,249073,0,249106,124402,123884,0,248130,248474,124299,0,374742,0,124496,249067,123771,249210,373314,248705,0,124571,124616,125479,124778,125324,124244,622718,123991,0,0,0,248323,0,249792,124771,124972,249296,249505,77926,441049,34621,33328,498557,248763,250028,248894,248801,374890,0,124655,124905,374477,0,249537,249587,0,125037,124821,0,35537,124951,0,398857,0,0,0,621502,202153,124147,0,92044,124317,124234,125524,124502,0,124858,124907,177630,0,0,124538,0,0,124753,0,21147,29395,249219,124777,249090,124246,125433,254473,498454,124632,55398,374230,0,0,249469,248994,0,124871,125007,124374,124601,249182,0,0,0,124944,250021,0,0,124941,249177,375159,250176,124601,0,124030,0,249285,0,124979,248594,123991,0,124469,0,124006,124535,248818,373710,373440,372957,124614,0,125107,249912,0,141324,0,124643,0,250004,375124,0,249593,0,46925,307031,248776,0,124305,249672,0,124810,0,124538,0,125047,249065,373534,0,0,0,374086,125084,373095,0,124734,124453,249298,0,248908,248914,0,124577,0,0,124317,249152,0,0,343975,373378,124311,124634,124372,0,124351,124606,249572,247793,0,124161,138178,1236,249206,0,124286,0,249982,125277,124739,0,124251,13979,0,248862,366621,0,0,0,248983,0,124974,27272,198883,124562,249260,124641,250226,124603,131271,124245,132378,0,249169,226607,124373,250167,0,124753,124704,124334,249636,0,0,0,204324,248717,0,0,124877,124820,0,124475,0,124452,123829,123959,373832,124785,0,0,0,0,457027,0,0,125291,117261,124190,124498,124877,124985,0,0,374934,124209,249843,124854,0,498495,19171,125209,498336,0,124408,250168,124756,125667,0,0,11842,247897,124505,31663,249371,124825,125012,0,124802,0,62336,124432,0,0,125372,248814,124614,0,249913,248732,564898,124298,250635,124821,0,0,374069,0,0,124827,117652,124673,250331,124301,124468,249945,0,124675,0,0,0,248895,0,249585,125021,249048,374481,249385,0,249707,124665,0,124503,249312,501013,124317,0,249628,124679,124589,0,499596,249243,0,374367,121279,374335,249941,0,0,124732,124454,125752,125176,125370,498655,124608,124719,124731,124866,0,124473,249628,124837,0,124455,0,0,0,373092,168446,498777,374963,23258,124696,249566,0,125136,70570,0,0,124864,124890,0,250922,125281,249607,0,748047,175757,0,166319,0,0,374414,124535,0,0,0,0,124728,125069,83368,124127,0,249816,249647,249086,249296,124536,395387,374464,0,124592,0,249663,0,497900,249227,124941,124473,124710,124706,124893,0,0,0,124680,0,124820,0,124012,125019,248995,133475,249694,124284,0,0,124648,124634,124834,373781,124909,250031,124689,124599,63899,370796,465350,0,373651,0,0,249270,124761,124768,374621,363842,748056,124926,125149,373943,249327,0,124709,124988,125405,124415,248912,124814,0,250040,124767,124536,373734,0,124507,124172,0,249680,124864,124417,382998,374041,373607,124616,0,0,0,0,124416,0,124555,0,249497,125150,289510,0,124340,248615,246796,125001,0,124349,374263,125007,249682,0,125185,124519,151864,243210,124719,249156,0,124225,250186,131125,73748,189890,125187,374371,249653,0,123904,0,124874,249331,0,0,249139,124451,0,112530,0,229150,0,124601,0,124724,124501,0,0,124120,125278,249554,373155,125427,124172,0,270267,125143,0,249131,124468,125008,0,141312,124946,124629,249697,372389,183612,37637,249605,374037,0,0,0,249455,249335,250282,0,125228,126033,0,0,249280,250422,125209,0,248895,124345,0,0,124675,0,0,268242,0,373804,124834,373260,0,125082,0,249231,249031,0,0,374990,124677,124203,124592,124947,0,249911,240440,374219,124957,0,0,0,249362]},{"counters":[0,125042,157827,125486,265940,249996,0,0,124767,0,249463,334181,124975,124359,378222,124549,169265,352150,0,0,0,249182,0,125149,124951,0,0,0,124767,374557,0,249629,124253,125028,124592,0,249721,124688,250473,373687,124935,124886,249115,124837,249835,0,0,124495,373115,248960,124415,124603,124867,248487,499015,0,249224,437251,124428,125006,123963,499133,373800,374493,249544,250378,0,249889,124572,249680,0,0,0,322388,129672,249810,0,248679,124571,249495,124600,124350,250021,124473,124465,248608,249225,0,124773,0,374604,374289,0,248359,124835,375286,135031,0,0,374435,0,311954,373499,457981,249568,124438,124373,16971,124590,124940,0,0,126540,124980,124245,191,373652,198668,124295,0,123968,124971,124240,249152,0,124203,500162,0,207397,172353,124408,498249,124436,249084,124063,127081,0,0,374329,248800,248620,0,124963,125043,124687,499330,0,125003,374276,0,0,248863,124615,249265,248979,125161,0,124796,124769,374131,124892,0,249643,124375,124502,249288,58534,0,125039,124323,0,0,124235,374382,124940,0,0,0,0,124820,125477,0,0,0,124716,10462,0,125243,125328,124834,123931,0,125029,375400,555526,124616,373269,249584,0,124616,0,124553,38944,124060,373700,249470,125105,350008,125012,0,124679,250257,124243,0,124650,0,249875,125049,0,249519,124593,0,124151,124840,0,0,373007,0,124637,124947,124496,125370,124785,498824,125110,260065,124739,0,0,432181,237122,228945,374959,0,124693,124068,249676,212016,124012,124429,124943,124995,247812,0,0,0,0,124880,8112,248967,125179,129759,0,124965,125310,124587,500074,0,0,249838,211135,124977,374299,124731,124906,494086,0,0,0,124632,0,124758,124562,125173,0,124978,250266,0,0,118381,0,175369,373194,0,0,124569,0,124147,248717,124996,124313,249597,499797,124783,39783,479208,249485,0,125167,0,125692,287416,124262,0,122130,316774,563466,124594,1491,0,410465,125123,0,0,249083,124371,123998,249499,249717,0,248353,248504,0,0,124885,0,0,374019,248261,249395,119892,124453,357976,0,375091,0,124420,249015,124847,249681,0,249206,66367,498681,250196,373184,125412,0,222852,327344,374211,124099,0,125585,249831,248691,249789,22100,0,303534,249670,249547,124219,249599,5981,124927,248474,0,0,137537,0,0,124948,0,0,373754,0,0,125291,0,0,124929,373450,249126,249074,0,29446,0,249417,249155,124696,249286,124843,248972,499859,124740,249572,125498,171545,248717,191562,0,374409,124748,0,248844,249370,248578,124666,124795,124671,7885,125168,373437,249474,125008,249663,124500,124504,124757,0,248634,124723,125207,0,0,124899,218576,0,249323,0,124668,498119,126423,123811,0,248566,124739,0,0,0,125082,0,248259,0,248809,124760,0,0,124988,0,124467,0,0,124532,249964,0,124457,249957,125133,114413,249454,249082,124682,41807,0,245155,249565,125037,124452,125084,124815,0,0,124433,124749,124905,124435,124886,205377,250275,0,0,373359,124468,249810,0,13979,0,124655,493243,248641,249398,0,0,0,125193,124419,0,375004,65761,0,124825,249771,124527,124310,249882,0,0,123995,249243,124258,124672,249210,248722,125005,110237,125166,372931,125085,373934,125199,0,0,124893,124532,124764,129462,0,124647,124453,249513,124845,0,248981,0,0,125039,124877,0,372573,124737,124978,373501,124391,124729,124582,124642,498516,124804,250184,64151,124455,373892,249353,124686,124380,374179,278014,44041,124662,0,0,124585,124388,280670,0,0,249637,498871,0,361879,249524,0,125291,124235,124636,0,124735,0,124957,0,0,0,248640,176830,0,198450,395980,142899,124172,622606,125145,0,0,0,249070,250556,249845,316984,124581,239961,124247,124974,0,128924,0,104422,249206,374610,124776,0,124599,0,124365,249840,250054,0,374051,124886,124891,125388,125023,125027,498830,131279,125286,124680,183445,124994,0,0,230769,124670,0,248968,0,249007,249337,124476,248928,125027,0,249346,0,374050,124298,0,124643,124860,374253,0,195064,124957,124562,125071,0,156257,0,249165,0,0,374123,0,674229,0,248983,374897,237298,125309,0,83018,0,14800,124887,307617,124385,124623,124234,0,124572,124374,0,125234,249533,248149,249006,249897,124846,0,0,155254,155301,125047,0,249477,0,0,124166,495637,262728,124744,0,374602,248670,499414,0,124906,124680,0,124819,124574,0,249289,0,0,124614,0,0,0,0,212363,242507,249456,249649,249846,498924,373187,0,250128,0,249336,0,0,248814,249256,124867,249865,249030,373606,0,374405,249736,0,327866,125123,250909,124643,372932,124779,0,0,125068,0,0,250726,124597,0,40842,124454,249451,0,248511,124692,250100,406970,124552,374082,0,0,249186,249615,373914,125395,124993,125207,124811,250232,0,249757,0,0,250037,125121,124723,0,0,214544,124625,0,499063,219282,374008,124284,124539,125338,0,250023,0,248742,124707,249385,0,498320,124702,0,124817,0,125019,872913,124917,124858,248761,124677,249974,0,124621,373651,0,250049,249415,124601,306891,125227,0,124785,124796,0,0,249545,124908,0,0,273809,0,124876,249457,124514,1433,243848,248599,249883,249259,96849,373677,0,124350,125041,124480,250377,124757,249421,244186,124432,450998,0,223653,374413,326048,124490,0,373879,124013,45792,0,800017,124639,125107,36719,0,0,316580,220502,579341,124812,124361,0,373686,124556,124805,0,124878,0,0,0,0,124610,0,373994,249636,374387,250361,0,363537,0,125278,0,0,0,498490,243025,0,249550,0,374329,0,0,249436,124946,124120,124527,249059,0,124543,124794,0,124475,249086,374030,0,0,249116,0,498246,374015,124528,249244,0,249747,493332,0,372455,493826,124391,249561,0,124442,249399,0,124794,124941,124635,361681,249871,249555,124947,0,0,249580,0,0,0,100168,249584,125391,0,125033,499226,0,124576,159196,0,78723,373396,124744,0,0,0,124489,0,0,124732,210509,124666,125199,0,249351,125477,97725,198726,124595,249280,0,249005,124163,249063,374438,654890,124526,502,124989,249283,125472,0,0,124542,373381,124472,0,374867,373873,0,0,0,124576,0,165411,249540,124842,0,124382,124971,0,0,248602,123624,124706,0,0,124681,116466,20046,242155,124444,124648,0,124520,249598,0,248279,0,247388,374349,124431,58104,0,0,250493,124708,499030,124926,124865,0,374991,124624,7255,374283,373998,249170,374596,123972,124374,0,250297,0,124732,110648,124298,0,124420,248894,498251,0,249044,0,0,124278,0,0,0,124734,125137,0,0,0,124872,249597,1903,124998,0,0,372770,124262,0,374017,11923,124644,329715,124353,249431,373886,271026,0,249440,124568,124493,0,249168,125035,0,0,249994,250068,125374,139968,0,0,248911,38733,0,25150,19015,124615,125625,249707,124824,0,68695,0,125317,624300,373353,248723,124367,0,124616,124575,0,0,124755,124943,125199,248884,124719,0,0,0,0,249821,0,124902,124728,249258,29395,124374,498825,124712,124940,249302,0,499316,124665,249242,249418,249222,0,0,374758,124399,124913,185805,0,125128,250198,124814,124418,125351,0,602372,0,124756,0,249805,124490,0,124920,249026,0,124992,0,124687,249693,124500,124530,249037,0,0,249414,374218,123992,0,374778,0,0,400572,249898,124518,144978,0,124569,124272,249526,248989,124338,124478,249351,124397,543213,0,124467,123904,498502,820048,0,249184,0,124583,374021,249239,249553,0,249202,0,125411,211072,124408,248195,0,125499,124592,124882,248757,248893,374641,125056,249568,249662,249460,240112,125232,0,498407,0,0,0,374374,403102,0,0,374535,124972,249552,0,373733,0,124694,0,249335,124772,124969,124498,43789,0,0,0,0,249279,124847,249713,125427,248500,0,124365,248758,46074,124914,249474,6387,249565,0,124710,123999,124296,373853,124038,248549,0,623317,250040,124981,0,249018,208,124576,124465,242954,35537,0,0,0,124454,124738,249502,0,372809,124369,0,0,249114,249326,0,124622,0,248680,124561,0,0,249544,249426,238469,0,248818,0,124953,249818,250032,0,249721,0,124641,220255,249640,125034,124421,124937,176699,124626,124403,0,124161,0,249843,249401,0,132171,124433,124348,124746,249464,124470,124665,3648,124479,165709,249327,0,0,238653,246672,0,0,124842,248435,712,124524,124021,373700,0,0,124405,0,374417,70335,0,0,125040,248651,0,249386,0,0,124884,373863,0,0,375271,123876,0,0,124922,125028,0,0,0,124878,0,249456,248950,124743,249401,0,249668,249975,248569,268600,0,124721,373727,335164,119384,249792,248714,374448,124223,75855,124845,124086,374045,249208,0,127426,0,124777,249137,125047,0,498188,248165,249209,0,129029,0,249387,124409,124502,124227,0,124954,160982,125209,0,124774,0,125331,0,124713,162839,0,124483,124871,0,0,249476,248138,124925,250151,249087,0,0,124258,249414,124872,125299,0,124004,374114,419641,124653,0,124601,124797,0,374297,124317,0,0,124586,374251,124074,0,124617,124463,214348,372195,57232,249146,124153,374549,124592,124906,125024,124154,0,0,249620,124241,124700,0,124465,249394,343813,124488,0,124518,56179,374778,124229,124408,124987,978,124613,205610,124279,124232,141180,126884,0,249973,124739,124829,0,124741,0,0,0,0,648844,125367,410399,276609,124596,0,125524,125275,125494,124091,249369,123468,124941,0,249551,372915,0,124166,373812,250089,248251,124839,83686,249265,91100,249811,0,124562,375418,150753,237970,375172,124340,173384,125146,46799,0,0,0,124906,124345,124942,0,0,0,125019,374064,249807,249529,125320,0,0,124567,124411,124957,0,0,0,124717,249572,124496,249399,248640,249931,0,124064,125055,498227,375083,499243,0,124287,124605,0,124150,124063,0,125223,124777,0,0,124469,0,249632,209384,248911,125138,0,124388,5919,124793,124670,373856,0,0,124821,124900,124267,125043,124440,124384,250129,124182,0,374264,374231,124823,320956,124849,249218,194188,0,125148,0,249768,124467,273141,124933,0,0,125067,124049,248487,373738,124992,124797,0,0,124957,0,0,373928,124525,124459,374602,373991,374083,124761,374380,0,124314,0,124727,249224,0,124855,124260,0,248561,249159,0,124113,248728,123921,249239,302875,124468,0,0,249587,124595,0,0,0,0,0,124559,426872,373363,124529,124338,248261,0,249773,248656,248859,124327,124197,0,374458,399065,248954,123902,124841,0,139080,124924,124176,249493,69798,124606,0,124507,0,124463,0,0,249009,199205,249067,124117,23258,125072,124055,374272,0,124538,0,0,79569,231019,414084,124333,224600,124750,124769,0,249058,374244,0,124203,124270,124300,123088,124939,95843,0,251194,0,0,248368,0,374339,124874,0,123971,374014,0,321833,250231,123779,0,249668,558,249275,124461,125136,125407,0,373581,124949,124932,132829,0,124203,136329,249726,249359,0,249548,0,124609,42855,124627,124608,0,124570,249157,249584,124692,623244,0,124753,356838,249330,250865,0,0,249825,249253,336747,125074,105675,235435,0,0,125123,124892,249769,0,124692,124922,125023,0,0,0,249542,124693,124800,124741,124459,0,248798,463925,125413,250000,124512,0,249653,125115,0,124913,374385,0,125531,124440,0,250311,0,298329,124935,124907,124579,124916,124876,124434,250449,125360,0,49696,248650,124538,0,91367,0,123732,249982,124956,75903,124064,249786,0,124501,124399,124941,220739,0,124870,125380,0,2301,250028,124879,249367,391923,374388,0,225327,124003,0,411125,373961,124817,249162,0,0,248880,124884,248931,0,0,0,124797,0,124710,0,373971,498407,77501,124916,0,124940,0,63899,125060,0,248700,248943,249301,249515,175595,0,249376,0,0,0,124068,124720,124522,498493,232842,373843,124670,498947,179517,125057,498375,624504,124632,125166,249141,0,63407,249387,0,124277,249341,124566,125457,124327,0,375212,124229,124563,0,125180,124620,124377,124350,124220,0,249614,0,124675,249728,0,125256,249683,276850,125073,500528,186720,249189,386391,248959,124220,0,0,305003,249567,373433,0,124948,124423,125552,249085,124813,124762,249411,125248,373176,124040,0,0,0,0,373920,180090,124537,373435,0,248436,249470,124008,124785,249348,249674,124994,124923,124866,249827,0,3205,373981,124876,125169,92044,0,124833,249700,0,249712,124104,249686,249964,250338,124254,567658,374305,250117,249987,0,123880,124799,109671,125137,0,124907,0,0,373707,0]},{"counters":[248989,0,746305,248721,618161,350732,249563,498187,499805,239213,499727,124352,373289,124104,373279,0,124848,0,0,124916,85434,0,0,0,372692,497677,249645,500889,124313,124505,124536,124849,0,373287,249585,0,0,0,249535,0,144875,124778,0,124896,0,0,249504,326029,249992,0,249314,124704,124648,374312,248816,242576,0,123981,497732,124438,0,248524,199630,0,374365,0,375473,0,124121,123943,0,0,249733,0,0,291471,374784,242461,0,375282,124625,124736,0,250331,124494,0,431654,249234,374347,124169,0,0,0,0,248535,0,339864,0,124402,0,124790,0,124665,123500,0,0,125083,125072,124501,249341,125179,0,0,0,0,0,124409,124504,124382,243079,124480,375065,124696,124972,125128,0,0,99781,0,0,124527,0,374629,0,373811,266426,91758,0,124824,125132,249598,124618,72685,124761,433402,124363,249817,125039,255065,177825,249500,0,124835,124415,0,0,0,249354,249179,249722,125019,124171,124333,249545,124593,124479,124530,124867,124615,250145,125237,125257,125275,124648,28404,123976,0,0,0,125374,125177,498361,374369,374122,373226,125546,249135,0,124351,249087,0,124475,0,373502,249681,98578,250105,249736,0,373079,249768,0,248554,249083,249325,0,25209,249410,249377,0,0,0,209460,0,249570,0,0,125008,0,374510,7097,124895,124715,498355,124839,125006,375311,124549,124360,0,248959,0,374663,157201,124989,152562,0,124704,249170,114,0,124224,316363,125324,124962,124388,177674,373006,0,125413,124548,301967,374430,249308,373761,401616,372255,167470,0,124907,124767,124240,123893,373716,249395,624264,373998,124219,0,0,249609,374794,125317,124380,117261,89935,0,249946,31663,249561,0,0,124347,124767,208475,0,0,202075,249015,124639,374843,249546,125023,0,124816,249971,0,67247,249969,0,124890,374184,374805,10462,125070,137018,0,249513,0,125267,179977,0,125123,0,249440,605050,224639,0,0,373151,0,124957,124300,124276,0,0,264430,0,124188,0,0,3648,0,124942,374520,124613,0,123808,250102,124704,248121,125053,0,125019,622332,124885,0,124245,124519,373926,249204,499747,0,0,124569,125146,248925,143129,248897,0,124595,124473,0,249408,264309,248788,123989,124319,0,0,0,0,124864,0,249825,124275,123942,249027,0,125161,0,0,37906,373710,124454,123880,159150,0,0,0,0,249112,373506,0,124038,124254,250005,124848,0,249468,124298,124463,124338,249910,248850,0,249284,124744,124939,374183,124703,0,124532,0,0,0,124752,124797,0,248761,249769,0,124910,249483,124610,0,249319,124574,310135,0,20341,78585,249731,0,0,249292,249299,0,0,124754,0,124763,373576,0,352432,249836,249543,0,125071,271847,124831,622467,39783,124044,0,0,7255,0,249686,124262,124334,125209,125261,124466,61236,498672,104416,124187,124460,208096,124762,250197,0,0,0,124419,0,0,0,0,0,0,123904,124791,249771,124686,0,7885,0,0,0,0,374103,263923,0,124982,124717,124861,124716,197316,92044,124721,373151,373563,248064,124409,124810,0,0,124608,120194,0,0,124586,0,99478,0,249367,124808,374466,0,124166,124608,249055,0,125457,204357,186952,124710,349455,249971,248705,124366,0,249976,0,305478,124633,249027,0,125094,124720,0,0,0,0,124153,249197,624253,0,124965,826565,124834,174777,0,250159,0,124572,65761,249510,0,0,499053,0,0,250173,373699,249816,0,133359,0,124549,4531,0,373701,124891,0,375393,374300,124769,124389,0,373274,0,0,249661,0,249634,0,374098,187874,248926,0,373602,487507,0,124592,191019,249861,124360,124593,125149,0,249951,19015,124843,124716,249345,124473,0,125192,249434,249013,249144,124217,124423,0,249579,354922,0,373492,249891,0,300994,170678,125039,248656,124223,497332,125698,125247,0,373728,124940,0,125013,199338,249392,248801,0,249109,249529,124900,0,248720,248989,125028,213298,249349,0,250079,249642,125585,0,0,374574,260410,0,125070,0,331304,124643,0,498465,62661,249010,0,248996,89404,124607,0,0,0,124637,0,209087,126970,250598,373497,124324,124907,125338,124329,124713,0,124420,0,373702,0,0,21147,0,0,124465,140685,373875,374852,124582,330328,64151,123925,0,124795,0,374200,124220,249541,249430,124348,124735,656509,373157,0,125008,479618,0,248195,124148,249458,0,373977,0,124712,125370,124526,124866,171814,65227,0,375288,124982,123732,248824,124707,0,0,2301,0,124818,124470,124795,249593,0,124741,374443,250253,0,124878,124446,248847,0,125028,374649,0,124139,498168,249045,125120,497603,0,374108,249089,248796,184449,0,248985,24410,124884,249232,124176,124709,125149,124929,249646,124647,0,125066,0,0,0,0,0,249598,124743,249319,124175,124877,125157,0,0,124340,124606,0,37822,124523,54234,0,0,0,249431,124676,125056,318899,249517,248276,307685,124581,248816,0,0,124567,0,0,125506,125351,0,125166,497288,0,0,0,0,124476,248891,0,124004,124527,125506,124469,0,374624,249961,124499,0,248691,0,498511,249399,249542,500209,0,124325,195973,357187,0,249237,124262,0,622099,248721,250682,125343,0,0,372567,125385,124015,0,124369,129708,124933,249596,124655,124397,124319,124680,124251,249511,123999,249249,0,0,124286,124935,0,249062,0,0,124234,265705,374192,0,0,0,125291,124660,124152,124829,249456,0,248879,0,125535,124636,249499,124892,373719,0,331046,125333,124799,124800,124369,248727,374014,0,249446,125038,124799,0,249056,0,248741,250005,0,286343,0,374080,233980,125275,124707,124732,381582,125411,124474,124767,0,0,248896,124537,0,0,124589,323127,0,124983,0,124757,9453,249161,0,124296,124693,253910,0,124702,250077,0,124881,249398,0,0,124843,0,249439,249551,0,124044,0,124791,124797,124895,124811,124623,373503,0,249736,0,125005,125281,0,0,0,124299,0,0,124182,124349,249219,249971,124338,249666,125057,248453,0,0,194580,0,105857,0,0,0,0,124906,48435,298225,249437,124375,38733,124770,111925,248734,124954,125989,249195,249363,499291,35704,248048,0,0,249561,249421,0,0,124434,250456,214897,124942,249877,0,0,125069,124395,124865,125412,249117,0,0,375203,124940,226407,249704,249975,249677,124512,249374,512119,0,124643,250046,249428,249637,0,170278,124755,125338,0,498380,0,0,0,124808,0,249855,0,173627,0,0,0,169719,124448,124761,124908,0,124905,249195,124555,124064,124563,124776,1903,124428,0,125023,248721,249503,125047,125243,124448,124507,0,124422,188269,124421,124632,124542,124624,374179,124074,0,123216,0,109671,124580,249656,0,125314,498730,250015,249556,0,0,375167,0,0,250165,0,124487,249503,0,248964,124886,374842,249745,124040,125192,126725,0,368957,249839,0,124594,124813,124637,143741,250342,159814,124984,125477,124884,0,125193,124708,0,0,248924,249704,124583,0,249157,124305,248739,249995,0,0,10148,0,344133,124643,125138,0,0,374541,0,249907,0,0,124977,125092,0,124609,248786,124427,0,249853,249558,0,124820,124068,530826,374115,291287,125087,0,124743,373729,248247,124586,249813,124470,249748,99520,124612,250027,0,248973,124443,0,0,249571,124632,0,124276,124150,316667,0,124785,124317,0,368655,0,124946,0,125364,124748,498650,124749,124532,249258,124969,59981,249311,369571,100168,374168,374060,0,250252,265911,124992,124549,125053,124037,249147,125552,0,248783,124335,240263,75893,124944,0,0,102991,374859,124557,373674,125227,124923,250004,0,248984,0,0,249177,249144,0,249293,372977,373532,0,124904,251094,0,374184,248592,161631,249426,124994,249534,250047,124998,124421,124064,249232,124172,0,124391,226835,124385,124382,125397,124900,0,250009,30373,255290,124206,124614,11043,0,249032,125241,0,0,125584,171150,124954,0,322902,499242,0,373756,249787,8112,87766,124505,0,0,249485,0,202286,124718,0,498270,249984,0,250095,0,249634,0,0,104422,373149,124704,248894,125270,249595,124597,124783,249152,373140,124913,749212,0,0,124408,249712,483475,124099,373175,123698,124834,373252,124415,124502,124631,250140,374396,0,40842,249280,124758,0,0,373887,0,125199,0,0,0,0,112443,498575,124750,125235,124675,123968,105675,0,374374,237126,249771,124957,148820,498235,176169,125209,124003,9589,248943,351596,124934,0,499415,374547,124581,0,124979,0,124729,124296,168882,124810,124732,124186,216151,0,249329,124203,125324,124896,0,499277,124972,124435,0,248260,249875,0,249496,0,124244,55288,124747,0,139094,124686,356597,249336,249686,0,0,124949,124097,0,589537,0,0,0,22100,5148,249931,375476,0,124601,253677,248493,248910,0,124498,124666,124666,251906,124769,232935,374180,21323,248575,0,0,249208,192060,0,296771,498121,369267,249365,51819,0,249570,374290,0,0,0,0,0,124502,124529,0,273084,124680,249502,248671,374529,249420,0,365657,173647,374059,124567,499420,124660,499069,0,124203,0,373892,124562,0,123991,0,336534,249059,404220,124207,373969,0,249059,0,249870,248496,0,0,248110,249664,0,123941,0,250159,0,124719,249659,124720,0,185429,374580,455425,125148,399498,249227,124881,124333,0,0,124909,0,249590,245351,78723,209099,249797,124317,0,374158,374322,125291,124487,0,124383,124872,125411,249272,125226,124582,248524,249118,124176,499077,0,0,124930,0,248989,366046,0,124704,0,123939,0,249741,124922,0,124278,252130,124785,3205,249443,249309,0,194724,124219,124671,39603,0,248921,124776,125036,0,124559,249638,374088,0,51047,124220,163800,0,499806,249144,0,124427,124732,222514,0,250486,125074,465021,123811,0,0,249137,0,249192,0,124634,124746,374333,124166,0,249187,250393,249123,0,0,0,151332,374437,124612,249774,248640,47574,96849,124566,125211,0,374513,0,0,0,124666,124383,0,0,0,373981,125405,124920,0,124806,0,249496,124568,0,125020,124571,0,249409,249281,248881,0,249528,124568,249690,201909,0,373167,0,373410,124484,0,374143,373918,291916,208,249086,0,0,249969,249178,0,498684,125189,0,249121,0,0,125031,396619,124807,249343,123817,0,249789,249294,124243,0,0,0,373784,249022,0,249888,0,0,0,124674,124478,494437,243641,124614,623961,168741,124651,124467,124822,124204,0,125047,124758,124902,124611,248946,125183,0,124675,0,125409,0,124121,498842,124637,249771,0,249938,124651,0,124597,0,0,374219,124792,124417,498594,455903,0,124512,499233,94570,124804,374634,125068,124591,0,125232,0,124885,250071,249972,249054,375309,0,248735,0,124760,249159,249946,249852,0,0,219220,123344,124692,124496,250079,0,250172,0,0,250828,124371,373855,124367,0,115247,0,124257,373964,248756,125006,249172,0,0,124884,374333,215378,373994,125207,124408,249491,125195,124686,249088,124355,124922,124284,248475,0,0,175496,0,124872,0,125494,0,248880,59082,249602,124692,124977,0,499589,124788,0,249698,0,0,0,120672,249679,125207,124576,249631,159553,125185,249084,124556,249585,0,498757,0,0,124420,373969,0,206758,0,124445,5287,124657,125281,152649,0,249427,124429,124776,249163,0,249614,124408,124968,124650,373524,0,249378,249227,124584,0,124675,125228,0,249944,249114,228532,249248,124644,25150,0,124583,0,0,124688,249402,0,0,0,124904,124374,124774,0,249462,55992,124827,124556,249251,249238,26266,0,0,373996,623404,374686,249360,0,249495,125220,0,0,498981,498666,0,497767,0,124129,0,0,124704,124674,0,41092,125043,373396,0,373999,249473,124708,249815,248332,249124,248379,125131,124969,124545,0,125153,250534,124627,125308,248759,373497,249156,0,157322,248899,124270,0,124184,0,124566,125213,124799,233322,125070,0,0,0,0,248490,124795,0,623301,0,124603,125016,248608,373663,0,11923,0,0,0,124893,0,125148,0,249572,249486,249628,313401,124687,0,248829,0,612568,0,0,130931,0,220386,0,124146,124785,124460,124790,125259,0,374459,124538,0,248498,124626,124529,499041,125185,124504,374072,250033,0,0,0,497960,249630,249202,0,0,125200,0,248296,376919,124608,234739,374394,124132,223045,124670,126699,248949,249608,124846,0,0,249004,373016,0,124040,123991,0,118381,373763,124172,249216,0,124275,249438,124611,124184,124924,0,0,249230,141029,124885,125133,0,124418,0,124310,124616,219471,125093,0,249564,125069,249801,249724,125486,0,249018]},{"counters":[124895,0,249415,124150,124908,0,0,249274,125026,249959,124971,250280,615312,248559,125045,373491,124955,0,0,249200,203625,370662,124810,250292,374320,124647,0,248760,248765,124499,249572,0,124728,249076,0,0,373177,249296,373908,124476,1433,0,124844,124270,125433,14800,373135,0,0,236930,123643,255781,249913,250438,124944,249082,125128,124815,124817,124516,124348,63661,125003,0,0,168481,124717,249388,0,124345,0,0,0,124206,191911,249341,123759,0,249542,124864,124427,0,249436,374820,124574,125244,248833,19015,124547,125027,0,125124,124314,124522,0,512993,124581,0,374662,249262,0,0,125028,248876,124705,0,125065,249706,452255,220572,0,124932,249410,249087,0,0,373184,0,46925,373611,124937,124762,307876,125022,124592,124739,125422,0,245431,124805,721419,124699,130135,125320,0,0,0,124988,248824,26266,249068,0,124580,124423,0,0,358154,0,259288,168664,124422,125161,124963,124610,125499,249307,0,0,124353,249672,249808,0,0,124708,224016,349302,0,374740,249967,124434,124174,375134,0,125052,0,125407,219330,124901,124807,0,0,102991,374380,124514,124879,0,124845,124104,0,0,124469,124804,249500,0,0,125989,0,327181,375322,124866,124743,249762,0,124686,248444,0,125102,249187,446955,499735,374488,124430,124465,124452,124151,125132,0,0,0,250441,257000,124589,250132,124552,249523,124518,124912,124422,0,124269,124502,125071,373465,0,124052,249809,123861,0,124660,249411,0,499228,0,0,124727,124829,0,49696,622736,125130,249654,248703,124561,375236,249459,124860,0,0,124031,346158,124375,124064,0,0,374659,695,0,124628,124631,138236,124788,309117,124514,0,0,0,14027,135478,125171,21147,124975,124535,249915,0,8112,124848,124594,216511,0,124254,119892,0,0,124938,124965,249897,373151,249264,125160,0,271313,124711,124882,249172,124532,124913,0,124866,124572,249446,0,0,124909,0,0,374091,124567,124719,0,249294,374464,0,248495,96849,249200,125045,319028,0,124373,124500,0,248919,0,124670,373853,0,0,0,249125,249471,124760,124842,124690,249280,249694,249777,249118,0,124448,124648,249589,0,248989,373486,249970,0,124753,124824,124420,124829,0,0,374027,247886,124373,0,250266,124539,124542,374017,117071,0,201999,124444,37637,0,0,249755,0,249358,124764,0,0,124878,0,0,140733,124888,248215,0,124886,0,0,249669,124651,249042,249624,0,375047,374109,373656,127380,0,248820,498975,249143,124068,247715,0,124858,124867,0,70570,124569,498017,0,0,0,248311,48435,124679,384170,249923,0,124272,0,425028,272574,107713,0,372785,0,249242,29395,0,249523,237165,249949,75214,248707,124166,248870,0,124748,124696,248785,373875,249930,124570,249317,249183,124422,125351,124124,124308,124768,248882,0,0,249304,375128,124752,124196,249732,124923,250806,498857,124476,0,0,373510,0,124675,124861,124608,250016,35704,124467,374122,0,227687,118803,0,124851,249066,0,250617,249649,0,225773,124245,0,124827,249443,125193,0,0,319,250607,0,0,124790,124690,0,0,124994,123941,125176,125215,248706,124675,123857,249131,373467,124092,373041,124679,0,249627,248499,342714,124741,0,67368,373976,0,124706,0,0,123829,124557,0,0,0,125310,95843,309549,0,124767,374695,124532,0,249425,123976,149949,0,374259,124566,344679,0,247988,0,0,7885,124351,249179,0,380842,249586,0,249214,191,0,0,0,250379,497968,0,124243,124978,124946,373654,374136,124082,123880,125166,124776,0,0,125275,0,249249,250077,0,27272,0,622884,125014,0,250055,125241,0,124476,0,248465,248732,0,0,373995,249602,164045,0,0,374200,0,125123,190405,4531,283872,0,249133,0,125070,125411,248730,125053,124378,372976,124409,370546,0,124363,375173,0,248562,136489,249684,249265,0,249070,0,249567,123908,124837,0,125472,0,250435,0,249059,33328,249384,373812,53184,0,0,0,124900,124776,374291,0,177129,124397,249372,0,124433,249520,0,248827,0,498449,373798,0,124664,249173,249471,124097,0,0,123995,293913,124556,0,124372,499505,249364,0,0,125138,249139,0,0,0,0,373705,249781,373629,249331,124817,93585,373436,603311,0,0,124711,124497,124345,0,0,0,124501,124946,124057,249571,372787,248293,125413,0,77501,124907,124460,124638,124319,173232,250043,75893,125131,0,200151,455880,249349,0,5148,0,124715,0,374302,0,55398,80059,0,374627,124473,0,165970,249938,249453,363590,249770,248746,124797,0,124299,124395,274724,120194,0,125069,214980,124409,124058,384989,124739,249195,124406,0,248458,248881,0,124059,0,125330,125089,0,167490,124728,248546,0,124769,124477,0,249096,248990,0,0,124373,0,124732,124150,125042,125009,124567,125030,498275,0,248296,0,125207,124226,0,249003,124718,4786,0,16060,0,0,0,0,0,0,373775,0,124799,0,124710,124704,125278,0,0,332738,249017,249997,374581,0,124315,0,124292,123880,125176,0,497558,248825,123921,55288,373564,249629,0,0,0,497748,206535,134403,0,124492,41602,268966,439066,249616,235129,0,0,440989,250195,249578,249212,0,124586,124524,250271,125123,373492,708577,117853,124877,460643,124756,0,0,429667,0,124593,124436,0,124772,0,124484,0,124570,373319,623338,353124,18075,374163,124523,124484,0,73870,287797,124467,374112,123893,0,0,0,125121,110648,374623,183608,124055,124525,0,0,0,124943,0,124674,124896,264965,249388,105675,0,413780,169429,248468,0,0,0,124778,0,0,124819,125669,206129,124869,249252,0,249042,125020,123088,70335,0,125317,249804,125119,183390,0,3085,125256,0,124520,224809,0,124767,248842,249557,233539,249793,124884,249582,0,374260,0,125084,258561,124276,0,0,35537,0,0,249805,0,435719,0,125122,374236,125042,123771,125042,0,249670,98578,0,0,215849,0,0,125004,374061,124586,249652,125490,249656,248566,238569,124537,0,124397,42301,68897,244179,0,0,0,0,248994,978,249474,0,0,249631,0,0,125006,0,249993,0,0,124808,0,124745,125043,124472,0,125123,124526,249171,124921,124924,124464,0,124680,0,125328,0,248811,0,0,124950,124188,0,124586,372624,250156,0,92044,496471,0,123954,0,375219,249237,125137,126428,0,0,124451,249530,0,124482,124609,124949,249092,249457,124855,28339,374235,360796,249107,498561,124806,0,249438,124614,1903,249274,122971,208444,124720,124564,124503,0,124317,374540,124275,250004,124459,373349,249310,249344,498275,124827,125207,0,249047,373609,124712,124629,125198,0,124748,125039,124478,0,0,124555,373398,0,0,0,373646,250307,123942,0,125317,3205,29635,0,0,249173,124366,373974,0,124939,249693,125024,125245,0,374602,321677,124635,124872,249342,0,125311,372553,0,249125,373476,124463,124407,250120,230361,249103,249565,201753,124828,0,249591,335438,125393,249430,124820,256693,124488,249346,498394,314522,0,153014,37761,249498,124616,125457,249076,125286,124371,0,194047,87128,124969,248841,250131,374157,324760,0,0,0,249011,249139,499058,0,125031,249227,498567,0,124876,124592,248962,0,0,124536,124652,0,0,0,0,0,248815,249316,0,124351,249516,124855,248294,124732,124686,247276,249061,0,124943,124608,121942,124941,375196,249070,0,124671,373409,375009,0,499180,375076,0,125667,248940,125324,124482,249107,124693,0,248963,0,91100,295903,0,373912,0,249735,0,836233,125123,0,374639,0,0,593937,0,248522,125016,250051,0,0,124327,124297,124753,337924,0,748844,124757,249832,124110,124319,0,249228,0,123992,0,248651,0,248949,124992,124726,118210,0,124417,124267,250035,250131,0,124886,124478,442324,0,124399,248975,0,0,0,147901,377845,197256,373951,249461,0,249195,374468,124262,124977,312937,265350,249572,0,0,0,124908,250980,124486,124063,0,0,117652,375179,0,249568,0,124113,124852,174632,0,124583,498784,122505,0,0,0,373802,124773,123808,110237,0,0,249620,125479,0,124614,124686,373564,500127,124419,0,125078,0,124420,0,249468,0,0,250032,374320,125070,250076,434351,105857,124453,0,124646,0,84569,0,0,497271,0,124608,374629,0,129546,249823,3648,0,338948,0,124762,0,249831,0,124858,0,0,373740,0,249578,0,285353,0,0,0,0,249124,374219,0,124483,499421,124704,0,0,125192,124408,124244,125291,39603,0,124940,123781,125191,249588,249755,57107,0,0,0,123500,125082,0,498106,249080,249764,373438,312175,0,249074,124494,374324,373452,249593,124632,249656,124672,0,249361,0,124926,124581,248505,0,249313,0,32685,124849,249399,124327,0,125041,0,249613,124423,124487,249736,148952,249265,249782,167306,0,124526,498746,249554,124906,127230,250367,248862,124189,124779,0,0,0,125213,124791,0,125030,124556,249166,0,0,0,123996,0,373465,124531,248859,124687,249393,124856,249649,0,375220,225090,0,124718,0,0,0,124957,125091,125115,0,0,124220,0,124900,0,124929,374143,250544,0,373784,124182,121178,125066,250081,124878,373823,124606,124499,0,124789,0,498359,249417,0,0,249072,249760,337780,125064,124490,497433,499539,124725,249617,0,0,248319,124347,0,124789,249606,497351,372694,248868,124829,125209,0,124669,0,125324,124858,123884,0,0,374416,0,373798,124885,124389,0,373035,249497,106209,0,0,124643,124038,0,608641,124785,249704,249374,0,124329,0,374587,124362,426832,248714,0,119292,124356,124779,0,372922,0,374643,248975,124595,124922,0,249526,124758,11251,0,0,124797,247950,248993,250039,124676,124467,373635,375043,499468,374019,248988,124717,124437,249655,0,0,0,249450,0,124429,124630,373896,248549,249410,249232,124707,124298,272939,98221,124644,124468,124663,0,0,430418,156285,248913,499585,0,249682,250360,124749,366937,248450,249350,0,373428,0,124550,374133,124984,124502,333789,124235,0,124668,250119,0,250484,374772,0,125084,2301,124129,286310,124688,0,372913,622004,0,0,125227,374052,248103,0,125002,0,374127,124829,124930,175127,248849,124302,0,124641,125199,249213,0,124466,125027,125105,124796,125088,177378,4195,498839,124770,249460,238042,0,125051,156364,124770,124382,159821,374763,249833,623411,0,0,249404,249633,124692,196026,124993,0,365049,124737,249844,124437,0,125149,250325,124907,183253,491653,0,374932,249506,269711,249708,0,124262,249142,0,125049,125436,125122,124818,0,249649,0,124707,249350,124819,0,125144,124543,124935,125199,0,123989,0,249464,125136,248903,124629,124493,0,124419,0,0,249094,250431,248866,375317,0,180397,124313,124469,226594,250302,0,143118,124481,248952,249715,249125,249622,124187,0,249985,331146,375314,125206,0,249521,125053,124955,191850,120951,124893,374639,124612,250536,0,0,373390,249914,0,124496,124936,0,124040,374918,0,124595,373739,125391,373769,124747,0,124226,0,0,124414,248945,124547,0,126611,123904,373960,249423,374201,0,85434,249425,124916,0,0,124527,124577,0,0,122429,0,124613,375382,123452,249850,124785,248758,124712,124538,275944,0,0,0,0,249722,0,124220,0,249278,0,0,124838,0,250569,498926,125692,124651,124760,374696,248898,124005,0,0,373642,124725,185849,124988,0,367348,133401,364857,124643,248471,2294,30373,0,0,248889,0,249002,124662,0,0,249813,336253,0,124176,0,125182,124395,124272,124162,124675,166854,124808,124597,0,239039,373233,0,124940,0,124223,0,125087,0,124480,248602,0,124940,24112,374626,125259,249710,124632,0,124565,297925,0,499120,249414,0,0,0,124574,124537,124333,0,7255,403628,124719,0,248810,373113,124941,0,249804,290910,0,125494,0,124757,124813,249959,124593,123931,455620,249633,107799,249446,444129,0,46799,0,374589,374383,0,249288,0,124613,124880,498641,0,0,124254,0,0,248845,124305,94570,0,0,124668,0,374565,245476,498753,249405,0,0,0,0,0,124667,124982,250083,0,373397,0,248879,124981,0,499813,125007,374088,374204,124613,125163,124995,124673,0,0,249221,249102,0,0,73748,0,262492,249731,249279,124910,372765,375580,124251,115247,249539,0,124535,249536,63899,124777,0,374169,124566,124303,328756,0,124665,181819,249839,249980,353033,0,249332,46074,0,124526,249393,249399,124232,0,124098,249258,3676,248283,0,0,249424,249972,124957,236823,0,0,248249,248720,0,0,249791,124301,249304,250066,249811,375164,250283,0,124586,124960,283163,0,248953]}]},"null_count":0,"tot_col_size":3000058110,"last_update_version":401695339814584322},"l_returnflag":{"histogram":{"ndv":3,"buckets":[{"count":73561424,"lower_bound":"QQ==","upper_bound":"QQ==","repeats":73560000},{"count":227644409,"lower_bound":"Tg==","upper_bound":"Tg==","repeats":154080000},{"count":300005811,"lower_bound":"Ug==","upper_bound":"Ug==","repeats":72360000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74026400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74027688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151951723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74026400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151951723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74027688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74027688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74026400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151951723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74026400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151951723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74027688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74027688,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,151951723,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74026400,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":900017433,"last_update_version":401695339762155522},"l_shipdate":{"histogram":{"ndv":2526,"buckets":[{"count":1200023,"lower_bound":"MTk5Mi0wMS0xMQ==","upper_bound":"MTk5Mi0wMi0yMA==","repeats":30000},{"count":2400046,"lower_bound":"MTk5Mi0wMi0yMQ==","upper_bound":"MTk5Mi0wMy0wOA==","repeats":90000},{"count":3600069,"lower_bound":"MTk5Mi0wMy0wOQ==","upper_bound":"MTk5Mi0wMy0yMw==","repeats":60000},{"count":4860094,"lower_bound":"MTk5Mi0wMy0yNA==","upper_bound":"MTk5Mi0wNC0wMg==","repeats":120000},{"count":6120118,"lower_bound":"MTk5Mi0wNC0wMw==","upper_bound":"MTk5Mi0wNC0xMw==","repeats":210000},{"count":7320141,"lower_bound":"MTk5Mi0wNC0xNA==","upper_bound":"MTk5Mi0wNC0yNA==","repeats":120000},{"count":8580166,"lower_bound":"MTk5Mi0wNC0yNQ==","upper_bound":"MTk5Mi0wNS0wMw==","repeats":150000},{"count":9810190,"lower_bound":"MTk5Mi0wNS0wNA==","upper_bound":"MTk5Mi0wNS0xNA==","repeats":120000},{"count":11010213,"lower_bound":"MTk5Mi0wNS0xNQ==","upper_bound":"MTk5Mi0wNS0yNA==","repeats":90000},{"count":12210236,"lower_bound":"MTk5Mi0wNS0yNQ==","upper_bound":"MTk5Mi0wNi0wMw==","repeats":120000},{"count":13470260,"lower_bound":"MTk5Mi0wNi0wNA==","upper_bound":"MTk5Mi0wNi0xMw==","repeats":120000},{"count":14820287,"lower_bound":"MTk5Mi0wNi0xNA==","upper_bound":"MTk5Mi0wNi0yMw==","repeats":180000},{"count":16080311,"lower_bound":"MTk5Mi0wNi0yNA==","upper_bound":"MTk5Mi0wNy0wMw==","repeats":180000},{"count":17310335,"lower_bound":"MTk5Mi0wNy0wNA==","upper_bound":"MTk5Mi0wNy0xMw==","repeats":90000},{"count":18510358,"lower_bound":"MTk5Mi0wNy0xNA==","upper_bound":"MTk5Mi0wNy0yMg==","repeats":180000},{"count":19710381,"lower_bound":"MTk5Mi0wNy0yMw==","upper_bound":"MTk5Mi0wOC0wMQ==","repeats":120000},{"count":21000406,"lower_bound":"MTk5Mi0wOC0wMg==","upper_bound":"MTk5Mi0wOC0xMg==","repeats":180000},{"count":22200430,"lower_bound":"MTk5Mi0wOC0xMw==","upper_bound":"MTk5Mi0wOC0yMw==","repeats":150000},{"count":23430453,"lower_bound":"MTk5Mi0wOC0yNA==","upper_bound":"MTk5Mi0wOS0wMg==","repeats":120000},{"count":24750479,"lower_bound":"MTk5Mi0wOS0wMw==","upper_bound":"MTk5Mi0wOS0xMQ==","repeats":240000},{"count":25980503,"lower_bound":"MTk5Mi0wOS0xMg==","upper_bound":"MTk5Mi0wOS0xOQ==","repeats":240000},{"count":27270528,"lower_bound":"MTk5Mi0wOS0yMA==","upper_bound":"MTk5Mi0wOS0yOQ==","repeats":120000},{"count":28560553,"lower_bound":"MTk5Mi0wOS0zMA==","upper_bound":"MTk5Mi0xMC0wOQ==","repeats":180000},{"count":29880578,"lower_bound":"MTk5Mi0xMC0xMA==","upper_bound":"MTk5Mi0xMC0xOA==","repeats":150000},{"count":31170603,"lower_bound":"MTk5Mi0xMC0xOQ==","upper_bound":"MTk5Mi0xMC0yOA==","repeats":210000},{"count":32490629,"lower_bound":"MTk5Mi0xMC0yOQ==","upper_bound":"MTk5Mi0xMS0wNg==","repeats":300000},{"count":33720653,"lower_bound":"MTk5Mi0xMS0wNw==","upper_bound":"MTk5Mi0xMS0xNQ==","repeats":120000},{"count":34950676,"lower_bound":"MTk5Mi0xMS0xNg==","upper_bound":"MTk5Mi0xMS0yNw==","repeats":90000},{"count":36210701,"lower_bound":"MTk5Mi0xMS0yOA==","upper_bound":"MTk5Mi0xMi0wNw==","repeats":120000},{"count":37410724,"lower_bound":"MTk5Mi0xMi0wOA==","upper_bound":"MTk5Mi0xMi0xNw==","repeats":150000},{"count":38670749,"lower_bound":"MTk5Mi0xMi0xOA==","upper_bound":"MTk5Mi0xMi0yNw==","repeats":180000},{"count":39930773,"lower_bound":"MTk5Mi0xMi0yOA==","upper_bound":"MTk5My0wMS0wNw==","repeats":150000},{"count":41190797,"lower_bound":"MTk5My0wMS0wOA==","upper_bound":"MTk5My0wMS0xNw==","repeats":150000},{"count":42420821,"lower_bound":"MTk5My0wMS0xOA==","upper_bound":"MTk5My0wMS0yOA==","repeats":90000},{"count":43650845,"lower_bound":"MTk5My0wMS0yOQ==","upper_bound":"MTk5My0wMi0wNw==","repeats":150000},{"count":44850868,"lower_bound":"MTk5My0wMi0wOA==","upper_bound":"MTk5My0wMi0xNQ==","repeats":120000},{"count":46080892,"lower_bound":"MTk5My0wMi0xNg==","upper_bound":"MTk5My0wMi0yNg==","repeats":180000},{"count":47280915,"lower_bound":"MTk5My0wMi0yNw==","upper_bound":"MTk5My0wMy0wOA==","repeats":120000},{"count":48540940,"lower_bound":"MTk5My0wMy0wOQ==","upper_bound":"MTk5My0wMy0xNg==","repeats":120000},{"count":49740963,"lower_bound":"MTk5My0wMy0xNw==","upper_bound":"MTk5My0wMy0yOA==","repeats":60000},{"count":51030988,"lower_bound":"MTk5My0wMy0yOQ==","upper_bound":"MTk5My0wNC0wNw==","repeats":270000},{"count":52291012,"lower_bound":"MTk5My0wNC0wOA==","upper_bound":"MTk5My0wNC0xNQ==","repeats":270000},{"count":53491036,"lower_bound":"MTk5My0wNC0xNg==","upper_bound":"MTk5My0wNC0yNQ==","repeats":150000},{"count":54871062,"lower_bound":"MTk5My0wNC0yNg==","upper_bound":"MTk5My0wNS0wNw==","repeats":210000},{"count":56131087,"lower_bound":"MTk5My0wNS0wOA==","upper_bound":"MTk5My0wNS0xNw==","repeats":90000},{"count":57361111,"lower_bound":"MTk5My0wNS0xOA==","upper_bound":"MTk5My0wNS0yNw==","repeats":90000},{"count":58591134,"lower_bound":"MTk5My0wNS0yOA==","upper_bound":"MTk5My0wNi0wNw==","repeats":150000},{"count":59911160,"lower_bound":"MTk5My0wNi0wOA==","upper_bound":"MTk5My0wNi0xOA==","repeats":150000},{"count":61171184,"lower_bound":"MTk5My0wNi0xOQ==","upper_bound":"MTk5My0wNi0yOQ==","repeats":150000},{"count":62461209,"lower_bound":"MTk5My0wNi0zMA==","upper_bound":"MTk5My0wNy0xMA==","repeats":120000},{"count":63661233,"lower_bound":"MTk5My0wNy0xMQ==","upper_bound":"MTk5My0wNy0yMQ==","repeats":90000},{"count":64921257,"lower_bound":"MTk5My0wNy0yMg==","upper_bound":"MTk5My0wNy0zMQ==","repeats":120000},{"count":66151281,"lower_bound":"MTk5My0wOC0wMQ==","upper_bound":"MTk5My0wOC0xMg==","repeats":120000},{"count":67411305,"lower_bound":"MTk5My0wOC0xMw==","upper_bound":"MTk5My0wOC0yNQ==","repeats":90000},{"count":68671330,"lower_bound":"MTk5My0wOC0yNg==","upper_bound":"MTk5My0wOS0wNQ==","repeats":90000},{"count":69931354,"lower_bound":"MTk5My0wOS0wNg==","upper_bound":"MTk5My0wOS0xNg==","repeats":150000},{"count":71131377,"lower_bound":"MTk5My0wOS0xNw==","upper_bound":"MTk5My0wOS0yNA==","repeats":240000},{"count":72331401,"lower_bound":"MTk5My0wOS0yNQ==","upper_bound":"MTk5My0xMC0wNA==","repeats":30000},{"count":73621426,"lower_bound":"MTk5My0xMC0wNQ==","upper_bound":"MTk5My0xMC0xNA==","repeats":150000},{"count":74971452,"lower_bound":"MTk5My0xMC0xNQ==","upper_bound":"MTk5My0xMC0yNw==","repeats":180000},{"count":76231476,"lower_bound":"MTk5My0xMC0yOA==","upper_bound":"MTk5My0xMS0wOQ==","repeats":120000},{"count":77551502,"lower_bound":"MTk5My0xMS0xMA==","upper_bound":"MTk5My0xMS0xOQ==","repeats":150000},{"count":78811526,"lower_bound":"MTk5My0xMS0yMA==","upper_bound":"MTk5My0xMS0zMA==","repeats":240000},{"count":80011549,"lower_bound":"MTk5My0xMi0wMQ==","upper_bound":"MTk5My0xMi0wOA==","repeats":210000},{"count":81331575,"lower_bound":"MTk5My0xMi0wOQ==","upper_bound":"MTk5My0xMi0xOA==","repeats":180000},{"count":82591599,"lower_bound":"MTk5My0xMi0xOQ==","upper_bound":"MTk5My0xMi0yNg==","repeats":150000},{"count":83911625,"lower_bound":"MTk5My0xMi0yNw==","upper_bound":"MTk5NC0wMS0wNA==","repeats":180000},{"count":85111648,"lower_bound":"MTk5NC0wMS0wNQ==","upper_bound":"MTk5NC0wMS0xMw==","repeats":90000},{"count":86401673,"lower_bound":"MTk5NC0wMS0xNQ==","upper_bound":"MTk5NC0wMS0yNQ==","repeats":270000},{"count":87601696,"lower_bound":"MTk5NC0wMS0yNg==","upper_bound":"MTk5NC0wMi0wMQ==","repeats":150000},{"count":88951722,"lower_bound":"MTk5NC0wMi0wMg==","upper_bound":"MTk5NC0wMi0xMA==","repeats":210000},{"count":90151746,"lower_bound":"MTk5NC0wMi0xMQ==","upper_bound":"MTk5NC0wMi0yMQ==","repeats":120000},{"count":91531772,"lower_bound":"MTk5NC0wMi0yMg==","upper_bound":"MTk5NC0wMy0wNA==","repeats":210000},{"count":92821797,"lower_bound":"MTk5NC0wMy0wNQ==","upper_bound":"MTk5NC0wMy0xNw==","repeats":150000},{"count":94171824,"lower_bound":"MTk5NC0wMy0xOA==","upper_bound":"MTk5NC0wMy0yNg==","repeats":180000},{"count":95401847,"lower_bound":"MTk5NC0wMy0yNw==","upper_bound":"MTk5NC0wNC0wNA==","repeats":240000},{"count":96601871,"lower_bound":"MTk5NC0wNC0wNQ==","upper_bound":"MTk5NC0wNC0xNg==","repeats":60000},{"count":97831894,"lower_bound":"MTk5NC0wNC0xNw==","upper_bound":"MTk5NC0wNC0yNw==","repeats":120000},{"count":99061918,"lower_bound":"MTk5NC0wNC0yOA==","upper_bound":"MTk5NC0wNS0wNw==","repeats":90000},{"count":100261942,"lower_bound":"MTk5NC0wNS0wOA==","upper_bound":"MTk5NC0wNS0xOA==","repeats":150000},{"count":101551967,"lower_bound":"MTk5NC0wNS0xOQ==","upper_bound":"MTk5NC0wNS0yNw==","repeats":120000},{"count":102751990,"lower_bound":"MTk5NC0wNS0yOA==","upper_bound":"MTk5NC0wNi0wNw==","repeats":90000},{"count":103982014,"lower_bound":"MTk5NC0wNi0wOA==","upper_bound":"MTk5NC0wNi0xNA==","repeats":150000},{"count":105212037,"lower_bound":"MTk5NC0wNi0xNQ==","upper_bound":"MTk5NC0wNi0yMg==","repeats":120000},{"count":106532063,"lower_bound":"MTk5NC0wNi0yMw==","upper_bound":"MTk5NC0wNy0wNA==","repeats":150000},{"count":107732086,"lower_bound":"MTk5NC0wNy0wNQ==","upper_bound":"MTk5NC0wNy0xNA==","repeats":60000},{"count":108962110,"lower_bound":"MTk5NC0wNy0xNQ==","upper_bound":"MTk5NC0wNy0yMg==","repeats":180000},{"count":110282136,"lower_bound":"MTk5NC0wNy0yMw==","upper_bound":"MTk5NC0wOC0wMw==","repeats":240000},{"count":111572161,"lower_bound":"MTk5NC0wOC0wNA==","upper_bound":"MTk5NC0wOC0xMw==","repeats":180000},{"count":112832185,"lower_bound":"MTk5NC0wOC0xNA==","upper_bound":"MTk5NC0wOC0yNQ==","repeats":150000},{"count":114032208,"lower_bound":"MTk5NC0wOC0yNg==","upper_bound":"MTk5NC0wOS0wNQ==","repeats":30000},{"count":115412235,"lower_bound":"MTk5NC0wOS0wNg==","upper_bound":"MTk5NC0wOS0xNw==","repeats":300000},{"count":116792262,"lower_bound":"MTk5NC0wOS0xOA==","upper_bound":"MTk5NC0wOS0yNw==","repeats":270000},{"count":118052286,"lower_bound":"MTk5NC0wOS0yOA==","upper_bound":"MTk5NC0xMC0wOA==","repeats":240000},{"count":119252309,"lower_bound":"MTk5NC0xMC0wOQ==","upper_bound":"MTk5NC0xMC0xOA==","repeats":120000},{"count":120512334,"lower_bound":"MTk5NC0xMC0xOQ==","upper_bound":"MTk5NC0xMC0yOQ==","repeats":90000},{"count":121802359,"lower_bound":"MTk5NC0xMC0zMA==","upper_bound":"MTk5NC0xMS0xMQ==","repeats":120000},{"count":123032383,"lower_bound":"MTk5NC0xMS0xMg==","upper_bound":"MTk5NC0xMS0yMg==","repeats":90000},{"count":124262406,"lower_bound":"MTk5NC0xMS0yMw==","upper_bound":"MTk5NC0xMi0wMQ==","repeats":120000},{"count":125612433,"lower_bound":"MTk5NC0xMi0wMg==","upper_bound":"MTk5NC0xMi0xNQ==","repeats":180000},{"count":126872457,"lower_bound":"MTk5NC0xMi0xNg==","upper_bound":"MTk5NC0xMi0yNg==","repeats":150000},{"count":128072480,"lower_bound":"MTk5NC0xMi0yNw==","upper_bound":"MTk5NS0wMS0wMw==","repeats":120000},{"count":129272503,"lower_bound":"MTk5NS0wMS0wNA==","upper_bound":"MTk5NS0wMS0xMg==","repeats":150000},{"count":130472527,"lower_bound":"MTk5NS0wMS0xMw==","upper_bound":"MTk5NS0wMS0yMA==","repeats":240000},{"count":131762552,"lower_bound":"MTk5NS0wMS0yMQ==","upper_bound":"MTk5NS0wMS0yOQ==","repeats":210000},{"count":132992576,"lower_bound":"MTk5NS0wMS0zMA==","upper_bound":"MTk5NS0wMi0wNw==","repeats":120000},{"count":134222599,"lower_bound":"MTk5NS0wMi0wOA==","upper_bound":"MTk5NS0wMi0yMQ==","repeats":150000},{"count":135572625,"lower_bound":"MTk5NS0wMi0yMg==","upper_bound":"MTk5NS0wMy0wMg==","repeats":180000},{"count":136862650,"lower_bound":"MTk5NS0wMy0wMw==","upper_bound":"MTk5NS0wMy0xMQ==","repeats":150000},{"count":138062674,"lower_bound":"MTk5NS0wMy0xMg==","upper_bound":"MTk5NS0wMy0yMw==","repeats":150000},{"count":139352699,"lower_bound":"MTk5NS0wMy0yNA==","upper_bound":"MTk5NS0wNC0wMw==","repeats":240000},{"count":140762726,"lower_bound":"MTk5NS0wNC0wNA==","upper_bound":"MTk5NS0wNC0xNw==","repeats":240000},{"count":142022750,"lower_bound":"MTk5NS0wNC0xOA==","upper_bound":"MTk5NS0wNC0yNg==","repeats":120000},{"count":143252774,"lower_bound":"MTk5NS0wNC0yNw==","upper_bound":"MTk5NS0wNS0wOA==","repeats":60000},{"count":144452797,"lower_bound":"MTk5NS0wNS0wOQ==","upper_bound":"MTk5NS0wNS0xOA==","repeats":60000},{"count":145682821,"lower_bound":"MTk5NS0wNS0xOQ==","upper_bound":"MTk5NS0wNS0yOA==","repeats":270000},{"count":147002847,"lower_bound":"MTk5NS0wNS0yOQ==","upper_bound":"MTk5NS0wNi0wOQ==","repeats":180000},{"count":148202870,"lower_bound":"MTk5NS0wNi0xMA==","upper_bound":"MTk5NS0wNi0xNw==","repeats":270000},{"count":149402893,"lower_bound":"MTk5NS0wNi0xOA==","upper_bound":"MTk5NS0wNi0yNg==","repeats":180000},{"count":150602917,"lower_bound":"MTk5NS0wNi0yNw==","upper_bound":"MTk5NS0wNy0wOA==","repeats":60000},{"count":151862941,"lower_bound":"MTk5NS0wNy0wOQ==","upper_bound":"MTk5NS0wNy0xOA==","repeats":90000},{"count":153062964,"lower_bound":"MTk5NS0wNy0xOQ==","upper_bound":"MTk5NS0wNy0yOA==","repeats":180000},{"count":154262988,"lower_bound":"MTk5NS0wNy0yOQ==","upper_bound":"MTk5NS0wOC0wNg==","repeats":210000},{"count":155463011,"lower_bound":"MTk5NS0wOC0wNw==","upper_bound":"MTk5NS0wOC0xNQ==","repeats":150000},{"count":156843037,"lower_bound":"MTk5NS0wOC0xNg==","upper_bound":"MTk5NS0wOC0yNg==","repeats":240000},{"count":158283065,"lower_bound":"MTk5NS0wOC0yNw==","upper_bound":"MTk5NS0wOS0wNQ==","repeats":270000},{"count":159543090,"lower_bound":"MTk5NS0wOS0wNg==","upper_bound":"MTk5NS0wOS0xNQ==","repeats":120000},{"count":160863115,"lower_bound":"MTk5NS0wOS0xNg==","upper_bound":"MTk5NS0wOS0yMw==","repeats":240000},{"count":162063139,"lower_bound":"MTk5NS0wOS0yNA==","upper_bound":"MTk5NS0xMC0wNQ==","repeats":90000},{"count":163413165,"lower_bound":"MTk5NS0xMC0wNg==","upper_bound":"MTk5NS0xMC0xNg==","repeats":180000},{"count":164733190,"lower_bound":"MTk5NS0xMC0xNw==","upper_bound":"MTk5NS0xMC0yNg==","repeats":150000},{"count":165993215,"lower_bound":"MTk5NS0xMC0yNw==","upper_bound":"MTk5NS0xMS0wNQ==","repeats":120000},{"count":167193238,"lower_bound":"MTk5NS0xMS0wNg==","upper_bound":"MTk5NS0xMS0xNg==","repeats":60000},{"count":168453262,"lower_bound":"MTk5NS0xMS0xNw==","upper_bound":"MTk5NS0xMS0yNg==","repeats":150000},{"count":169713287,"lower_bound":"MTk5NS0xMS0yNw==","upper_bound":"MTk5NS0xMi0wOQ==","repeats":90000},{"count":170943311,"lower_bound":"MTk5NS0xMi0xMA==","upper_bound":"MTk5NS0xMi0xOA==","repeats":90000},{"count":172233336,"lower_bound":"MTk5NS0xMi0xOQ==","upper_bound":"MTk5NS0xMi0yNw==","repeats":180000},{"count":173433359,"lower_bound":"MTk5NS0xMi0yOA==","upper_bound":"MTk5Ni0wMS0wNA==","repeats":120000},{"count":174663383,"lower_bound":"MTk5Ni0wMS0wNQ==","upper_bound":"MTk5Ni0wMS0xNQ==","repeats":60000},{"count":176013409,"lower_bound":"MTk5Ni0wMS0xNg==","upper_bound":"MTk5Ni0wMS0yNQ==","repeats":240000},{"count":177303434,"lower_bound":"MTk5Ni0wMS0yNg==","upper_bound":"MTk5Ni0wMi0wMg==","repeats":210000},{"count":178563458,"lower_bound":"MTk5Ni0wMi0wMw==","upper_bound":"MTk5Ni0wMi0xMQ==","repeats":240000},{"count":180003486,"lower_bound":"MTk5Ni0wMi0xMg==","upper_bound":"MTk5Ni0wMi0yMw==","repeats":300000},{"count":181353512,"lower_bound":"MTk5Ni0wMi0yNA==","upper_bound":"MTk5Ni0wMy0wNQ==","repeats":180000},{"count":182673538,"lower_bound":"MTk5Ni0wMy0wNg==","upper_bound":"MTk5Ni0wMy0xNA==","repeats":180000},{"count":183933562,"lower_bound":"MTk5Ni0wMy0xNQ==","upper_bound":"MTk5Ni0wMy0yNQ==","repeats":120000},{"count":185163586,"lower_bound":"MTk5Ni0wMy0yNg==","upper_bound":"MTk5Ni0wNC0wNQ==","repeats":150000},{"count":186363609,"lower_bound":"MTk5Ni0wNC0wNg==","upper_bound":"MTk5Ni0wNC0xNQ==","repeats":90000},{"count":187563633,"lower_bound":"MTk5Ni0wNC0xNg==","upper_bound":"MTk5Ni0wNC0yMw==","repeats":150000},{"count":188883658,"lower_bound":"MTk5Ni0wNC0yNA==","upper_bound":"MTk5Ni0wNS0wMg==","repeats":180000},{"count":190083681,"lower_bound":"MTk5Ni0wNS0wMw==","upper_bound":"MTk5Ni0wNS0xNA==","repeats":30000},{"count":191403707,"lower_bound":"MTk5Ni0wNS0xNQ==","upper_bound":"MTk5Ni0wNS0yNQ==","repeats":210000},{"count":192663731,"lower_bound":"MTk5Ni0wNS0yNg==","upper_bound":"MTk5Ni0wNi0wNw==","repeats":90000},{"count":193953756,"lower_bound":"MTk5Ni0wNi0wOA==","upper_bound":"MTk5Ni0wNi0xOA==","repeats":210000},{"count":195213781,"lower_bound":"MTk5Ni0wNi0xOQ==","upper_bound":"MTk5Ni0wNi0yOQ==","repeats":210000},{"count":196413804,"lower_bound":"MTk5Ni0wNi0zMA==","upper_bound":"MTk5Ni0wNy0xMA==","repeats":120000},{"count":197673828,"lower_bound":"MTk5Ni0wNy0xMQ==","upper_bound":"MTk5Ni0wNy0yMQ==","repeats":90000},{"count":198873852,"lower_bound":"MTk5Ni0wNy0yMg==","upper_bound":"MTk5Ni0wNy0yOQ==","repeats":180000},{"count":200163877,"lower_bound":"MTk5Ni0wNy0zMA==","upper_bound":"MTk5Ni0wOC0wNQ==","repeats":150000},{"count":201483902,"lower_bound":"MTk5Ni0wOC0wNg==","upper_bound":"MTk5Ni0wOC0xNg==","repeats":150000},{"count":202773927,"lower_bound":"MTk5Ni0wOC0xNw==","upper_bound":"MTk5Ni0wOC0yNg==","repeats":150000},{"count":204153954,"lower_bound":"MTk5Ni0wOC0yNw==","upper_bound":"MTk5Ni0wOS0wNQ==","repeats":240000},{"count":205443979,"lower_bound":"MTk5Ni0wOS0wNg==","upper_bound":"MTk5Ni0wOS0xNQ==","repeats":120000},{"count":206704003,"lower_bound":"MTk5Ni0wOS0xNg==","upper_bound":"MTk5Ni0wOS0yNw==","repeats":120000},{"count":207934027,"lower_bound":"MTk5Ni0wOS0yOA==","upper_bound":"MTk5Ni0xMC0wOA==","repeats":180000},{"count":209314054,"lower_bound":"MTk5Ni0xMC0wOQ==","upper_bound":"MTk5Ni0xMC0yMQ==","repeats":210000},{"count":210664080,"lower_bound":"MTk5Ni0xMC0yMg==","upper_bound":"MTk5Ni0xMC0yOQ==","repeats":180000},{"count":211924104,"lower_bound":"MTk5Ni0xMC0zMA==","upper_bound":"MTk5Ni0xMS0wNw==","repeats":90000},{"count":213214129,"lower_bound":"MTk5Ni0xMS0wOA==","upper_bound":"MTk5Ni0xMS0xNg==","repeats":180000},{"count":214504154,"lower_bound":"MTk5Ni0xMS0xNw==","upper_bound":"MTk5Ni0xMS0yNg==","repeats":180000},{"count":215824180,"lower_bound":"MTk5Ni0xMS0yNw==","upper_bound":"MTk5Ni0xMi0wNg==","repeats":180000},{"count":217144206,"lower_bound":"MTk5Ni0xMi0wNw==","upper_bound":"MTk5Ni0xMi0xNw==","repeats":210000},{"count":218464231,"lower_bound":"MTk5Ni0xMi0xOA==","upper_bound":"MTk5Ni0xMi0yNw==","repeats":150000},{"count":219754256,"lower_bound":"MTk5Ni0xMi0yOA==","upper_bound":"MTk5Ny0wMS0wNA==","repeats":120000},{"count":221014280,"lower_bound":"MTk5Ny0wMS0wNQ==","upper_bound":"MTk5Ny0wMS0xMw==","repeats":90000},{"count":222244304,"lower_bound":"MTk5Ny0wMS0xNA==","upper_bound":"MTk5Ny0wMS0yMQ==","repeats":90000},{"count":223444328,"lower_bound":"MTk5Ny0wMS0yMg==","upper_bound":"MTk5Ny0wMS0zMQ==","repeats":240000},{"count":224674351,"lower_bound":"MTk5Ny0wMi0wMQ==","upper_bound":"MTk5Ny0wMi0wOA==","repeats":90000},{"count":225934376,"lower_bound":"MTk5Ny0wMi0wOQ==","upper_bound":"MTk5Ny0wMi0xOA==","repeats":150000},{"count":227164400,"lower_bound":"MTk5Ny0wMi0xOQ==","upper_bound":"MTk5Ny0wMy0wMg==","repeats":60000},{"count":228394423,"lower_bound":"MTk5Ny0wMy0wMw==","upper_bound":"MTk5Ny0wMy0xMQ==","repeats":90000},{"count":229624447,"lower_bound":"MTk5Ny0wMy0xMg==","upper_bound":"MTk5Ny0wMy0yMQ==","repeats":150000},{"count":230854471,"lower_bound":"MTk5Ny0wMy0yMg==","upper_bound":"MTk5Ny0wNC0wMw==","repeats":120000},{"count":232114495,"lower_bound":"MTk5Ny0wNC0wNA==","upper_bound":"MTk5Ny0wNC0xMw==","repeats":270000},{"count":233344519,"lower_bound":"MTk5Ny0wNC0xNA==","upper_bound":"MTk5Ny0wNC0yMg==","repeats":60000},{"count":234544543,"lower_bound":"MTk5Ny0wNC0yMw==","upper_bound":"MTk5Ny0wNS0wNQ==","repeats":120000},{"count":235804567,"lower_bound":"MTk5Ny0wNS0wNg==","upper_bound":"MTk5Ny0wNS0xNg==","repeats":90000},{"count":237094592,"lower_bound":"MTk5Ny0wNS0xNw==","upper_bound":"MTk5Ny0wNS0yNg==","repeats":150000},{"count":238414618,"lower_bound":"MTk5Ny0wNS0yNw==","upper_bound":"MTk5Ny0wNi0wNA==","repeats":180000},{"count":239704642,"lower_bound":"MTk5Ny0wNi0wNQ==","upper_bound":"MTk5Ny0wNi0xNQ==","repeats":120000},{"count":240994667,"lower_bound":"MTk5Ny0wNi0xNg==","upper_bound":"MTk5Ny0wNi0yNA==","repeats":240000},{"count":242254692,"lower_bound":"MTk5Ny0wNi0yNQ==","upper_bound":"MTk5Ny0wNy0wNg==","repeats":120000},{"count":243484716,"lower_bound":"MTk5Ny0wNy0wNw==","upper_bound":"MTk5Ny0wNy0xNQ==","repeats":240000},{"count":244684739,"lower_bound":"MTk5Ny0wNy0xNg==","upper_bound":"MTk5Ny0wNy0yNA==","repeats":120000},{"count":245884762,"lower_bound":"MTk5Ny0wNy0yNQ==","upper_bound":"MTk5Ny0wOC0wMg==","repeats":60000},{"count":247084785,"lower_bound":"MTk5Ny0wOC0wMw==","upper_bound":"MTk5Ny0wOC0xMg==","repeats":120000},{"count":248344810,"lower_bound":"MTk5Ny0wOC0xMw==","upper_bound":"MTk5Ny0wOC0yMQ==","repeats":150000},{"count":249604834,"lower_bound":"MTk5Ny0wOC0yMg==","upper_bound":"MTk5Ny0wOC0zMA==","repeats":120000},{"count":250864859,"lower_bound":"MTk5Ny0wOC0zMQ==","upper_bound":"MTk5Ny0wOS0xMQ==","repeats":120000},{"count":252214885,"lower_bound":"MTk5Ny0wOS0xMg==","upper_bound":"MTk5Ny0wOS0yMA==","repeats":210000},{"count":253534910,"lower_bound":"MTk5Ny0wOS0yMQ==","upper_bound":"MTk5Ny0xMC0wMQ==","repeats":180000},{"count":254764934,"lower_bound":"MTk5Ny0xMC0wMg==","upper_bound":"MTk5Ny0xMC0xMA==","repeats":210000},{"count":256114960,"lower_bound":"MTk5Ny0xMC0xMQ==","upper_bound":"MTk5Ny0xMC0xOQ==","repeats":210000},{"count":257344984,"lower_bound":"MTk5Ny0xMC0yMA==","upper_bound":"MTk5Ny0xMC0yOA==","repeats":150000},{"count":258545007,"lower_bound":"MTk5Ny0xMC0yOQ==","upper_bound":"MTk5Ny0xMS0wOQ==","repeats":30000},{"count":259745031,"lower_bound":"MTk5Ny0xMS0xMA==","upper_bound":"MTk5Ny0xMS0xOA==","repeats":120000},{"count":260975054,"lower_bound":"MTk5Ny0xMS0xOQ==","upper_bound":"MTk5Ny0xMS0yOA==","repeats":120000},{"count":262205078,"lower_bound":"MTk5Ny0xMS0yOQ==","upper_bound":"MTk5Ny0xMi0wNw==","repeats":150000},{"count":263405102,"lower_bound":"MTk5Ny0xMi0wOA==","upper_bound":"MTk5Ny0xMi0xNA==","repeats":390000},{"count":264635125,"lower_bound":"MTk5Ny0xMi0xNQ==","upper_bound":"MTk5Ny0xMi0yNA==","repeats":60000},{"count":265925150,"lower_bound":"MTk5Ny0xMi0yNQ==","upper_bound":"MTk5OC0wMS0wMg==","repeats":180000},{"count":267245176,"lower_bound":"MTk5OC0wMS0wMw==","upper_bound":"MTk5OC0wMS0xMw==","repeats":270000},{"count":268475200,"lower_bound":"MTk5OC0wMS0xNA==","upper_bound":"MTk5OC0wMS0yMw==","repeats":180000},{"count":269675223,"lower_bound":"MTk5OC0wMS0yNA==","upper_bound":"MTk5OC0wMi0wMQ==","repeats":60000},{"count":270935247,"lower_bound":"MTk5OC0wMi0wMg==","upper_bound":"MTk5OC0wMi0xMw==","repeats":180000},{"count":272135271,"lower_bound":"MTk5OC0wMi0xNA==","upper_bound":"MTk5OC0wMi0yMg==","repeats":150000},{"count":273335294,"lower_bound":"MTk5OC0wMi0yMw==","upper_bound":"MTk5OC0wMy0wNg==","repeats":60000},{"count":274595318,"lower_bound":"MTk5OC0wMy0wNw==","upper_bound":"MTk5OC0wMy0xOA==","repeats":90000},{"count":275885343,"lower_bound":"MTk5OC0wMy0xOQ==","upper_bound":"MTk5OC0wMy0yOA==","repeats":120000},{"count":277205369,"lower_bound":"MTk5OC0wMy0zMA==","upper_bound":"MTk5OC0wNC0wNQ==","repeats":240000},{"count":278405392,"lower_bound":"MTk5OC0wNC0wNg==","upper_bound":"MTk5OC0wNC0xNQ==","repeats":150000},{"count":279635416,"lower_bound":"MTk5OC0wNC0xNg==","upper_bound":"MTk5OC0wNC0yNQ==","repeats":60000},{"count":280925441,"lower_bound":"MTk5OC0wNC0yNg==","upper_bound":"MTk5OC0wNS0wNQ==","repeats":150000},{"count":282155465,"lower_bound":"MTk5OC0wNS0wNg==","upper_bound":"MTk5OC0wNS0xMw==","repeats":180000},{"count":283355488,"lower_bound":"MTk5OC0wNS0xNA==","upper_bound":"MTk5OC0wNS0yMg==","repeats":210000},{"count":284705514,"lower_bound":"MTk5OC0wNS0yMw==","upper_bound":"MTk5OC0wNS0zMA==","repeats":210000},{"count":285935538,"lower_bound":"MTk5OC0wNS0zMQ==","upper_bound":"MTk5OC0wNi0xMA==","repeats":90000},{"count":287165562,"lower_bound":"MTk5OC0wNi0xMQ==","upper_bound":"MTk5OC0wNi0xOA==","repeats":90000},{"count":288425586,"lower_bound":"MTk5OC0wNi0xOQ==","upper_bound":"MTk5OC0wNi0yOQ==","repeats":120000},{"count":289625609,"lower_bound":"MTk5OC0wNi0zMA==","upper_bound":"MTk5OC0wNy0wOQ==","repeats":30000},{"count":290855633,"lower_bound":"MTk5OC0wNy0xMA==","upper_bound":"MTk5OC0wNy0yMA==","repeats":120000},{"count":292175659,"lower_bound":"MTk5OC0wNy0yMQ==","upper_bound":"MTk5OC0wOC0wMQ==","repeats":180000},{"count":293435683,"lower_bound":"MTk5OC0wOC0wMg==","upper_bound":"MTk5OC0wOC0xMg==","repeats":90000},{"count":294665707,"lower_bound":"MTk5OC0wOC0xMw==","upper_bound":"MTk5OC0wOC0yMQ==","repeats":240000},{"count":295865730,"lower_bound":"MTk5OC0wOC0yMg==","upper_bound":"MTk5OC0wOS0wMg==","repeats":120000},{"count":297155755,"lower_bound":"MTk5OC0wOS0wMw==","upper_bound":"MTk5OC0wOS0xNw==","repeats":120000},{"count":298445780,"lower_bound":"MTk5OC0wOS0xOA==","upper_bound":"MTk5OC0xMC0wNg==","repeats":180000},{"count":299675804,"lower_bound":"MTk5OC0xMC0wNw==","upper_bound":"MTk5OC0xMS0wMQ==","repeats":60000},{"count":300005811,"lower_bound":"MTk5OC0xMS0wMg==","upper_bound":"MTk5OC0xMS0xOA==","repeats":30000}]},"cm_sketch":{"rows":[{"counters":[247836,176287,249729,124620,249621,124661,0,125057,397360,125099,598547,124393,0,124083,0,124446,249674,0,123977,124809,124657,124433,124676,124818,124258,0,0,250092,124490,124667,0,125213,124361,248999,124427,0,0,498164,374286,0,374145,124900,124668,249458,250392,249571,373816,0,292853,0,124748,11570,124621,297279,0,364005,0,248824,124419,124589,0,374011,0,0,0,554363,249406,124065,125413,176933,0,125015,374136,0,125033,249976,0,0,250454,248799,0,124431,184271,374739,112026,193943,124356,125001,0,249307,273634,124619,124276,249908,0,125387,125138,0,0,0,0,0,0,124708,200491,0,0,334640,124885,0,248826,124313,124743,249573,0,8363,0,124465,0,249700,551309,124090,0,498987,0,124764,249049,602784,0,124112,249220,248719,373711,0,125019,124038,0,124213,124918,124915,124858,249715,250395,0,0,249583,0,221360,125083,0,124892,124611,160159,0,0,0,0,249630,248590,0,0,0,124424,0,0,249056,373526,249367,0,125245,249025,0,249241,124641,0,0,249061,124189,0,124527,125378,124675,249365,0,0,233826,124791,0,106287,125060,124857,469762,0,26711,33024,0,0,124253,124812,125634,124300,124753,123847,0,124511,499022,156390,124513,124795,124811,322721,249277,0,0,125051,249931,124434,0,249613,40400,249917,367136,124558,124988,124621,0,500390,0,213614,249015,249491,249451,248764,374664,125283,248866,0,0,249722,124533,0,0,124764,124661,124805,0,124237,0,0,249646,124752,249662,0,249973,621801,124553,465673,0,249669,0,124017,0,124941,249122,124544,0,124882,124546,275942,124600,249926,0,0,249584,249773,125043,41487,373705,0,124292,124842,124800,0,124796,124946,204923,498315,0,249833,396317,249717,0,124581,0,124568,124852,250154,367478,124641,248801,500010,370807,0,124790,0,124983,124719,131173,497174,124133,125416,124849,249095,0,498675,124646,124502,249493,124697,124835,335602,0,124711,199050,0,125060,0,249473,123996,250509,125127,0,249967,123475,250014,0,0,0,0,249176,69357,0,0,124152,0,0,249667,0,249347,249139,101880,0,124700,373638,0,0,124396,229357,0,249774,374326,0,124928,438661,249059,125212,249940,124230,374225,374090,124862,0,124740,0,125138,78112,124714,0,124668,498457,124595,249399,248842,125161,124053,0,0,140494,324020,374535,125214,234690,0,125440,374030,0,0,125269,374866,249359,0,0,124255,249252,125092,0,0,498953,365207,0,0,373846,0,373885,332132,125147,124985,0,0,374005,124427,124862,124925,0,124168,0,0,124595,0,59564,125415,374243,0,124775,196325,0,249731,623988,123968,249514,0,124019,124228,0,124904,285828,0,0,249387,124670,249844,124361,0,374873,374159,0,0,0,84312,0,0,0,0,124843,0,0,0,267140,124458,248199,125141,124539,0,0,0,70189,375175,124647,0,0,0,124355,373768,248839,373710,248642,125106,0,0,0,178995,249939,124646,0,124061,248690,0,0,169995,125597,125087,125730,249403,0,248902,248660,249085,296222,373504,179721,124647,0,248320,123932,248793,249801,0,249095,500317,116548,124252,310712,0,249563,0,0,124446,124184,102806,124646,0,403997,124395,125361,124180,124465,124519,248793,124780,192351,124008,125095,124593,124481,0,748468,0,0,0,124779,124563,499832,177209,0,125032,0,61685,0,249662,124767,125221,124222,374178,248904,0,250224,0,124790,327910,124710,0,124988,248950,124650,124707,124907,124562,124901,373014,125438,124451,373337,0,125020,373731,124469,248955,0,124442,0,0,0,134721,123897,124534,0,124742,125177,128540,124759,125224,249997,436285,124587,248652,248417,0,125129,0,0,0,0,0,373448,248655,0,19374,124717,248482,248645,124127,124029,0,124752,0,125103,0,124605,248867,125734,0,0,0,124805,48402,499484,373657,124945,0,0,291271,0,124803,223049,249861,123936,124310,124397,124390,0,125245,249103,124527,0,125359,0,124624,248274,124115,0,124695,0,0,0,0,124964,249685,447503,249806,124686,124159,189206,0,249435,0,0,0,125158,500608,248708,249781,0,249253,124682,125009,249125,124428,249333,496079,0,124966,124667,124685,125294,124543,123858,211686,0,62540,124407,248824,373724,0,374085,0,0,249416,0,124907,0,249981,124823,0,410942,0,161260,498388,124929,248855,0,249997,0,0,124175,499241,229653,249542,91808,249269,5190,124998,226776,0,124674,0,125158,372899,123985,124634,124579,249777,125471,499082,248626,249317,248973,549605,248938,124822,125324,0,249637,0,249641,0,624236,124600,0,0,0,0,124399,125389,124365,5272,374148,498555,0,0,373297,0,125211,124442,0,0,125246,249331,250116,0,373745,0,125013,0,375108,58797,124476,0,374104,124681,125243,124719,748030,0,124981,124727,124889,0,0,249732,124467,0,124299,0,124662,249555,124787,124973,124329,101380,124841,497867,124438,0,0,124594,125002,125029,124790,125130,248752,0,0,0,124466,373976,257351,124255,248841,124573,249168,0,473367,0,475687,0,124936,124625,124257,373853,0,124952,124345,249666,250101,0,124921,124613,124465,0,124649,124999,125116,0,314896,124136,374289,374978,0,0,124628,33959,0,124437,248532,250196,0,0,499913,124179,249295,124566,0,124978,248883,125464,124377,124333,249442,125346,125018,0,124767,0,373311,124633,125008,0,374111,92788,249584,0,0,124658,124821,124575,0,286560,124710,0,2044,125309,249633,249027,124075,249588,248382,0,249668,124345,248711,0,124589,211124,0,498875,0,124508,249161,334553,0,124933,125152,316210,0,124424,124307,499595,249520,124499,124446,249292,124725,125011,125457,170484,248843,249308,0,124360,328570,0,249996,124456,167346,125080,374189,117459,0,125225,124723,0,0,124741,124472,0,248859,0,123911,0,374144,124507,124910,124259,249555,124515,4143,248638,372946,498475,0,76227,248325,0,0,0,0,249221,249000,124491,124513,124685,125810,381256,0,124836,125342,124854,373191,249372,276649,124768,209525,374125,0,125051,124768,0,0,124911,249442,249801,0,249576,125267,125005,125223,0,0,125145,249056,124238,124482,124254,124752,124648,125202,248869,250261,0,124617,0,124975,124590,125063,0,249093,124752,373645,125223,373665,249382,124724,250388,0,249232,249322,0,0,124914,249105,0,248848,124208,0,124637,124347,124823,0,123909,0,498309,125131,249126,250158,249134,497612,124846,0,0,373966,297865,125010,124894,749322,249301,0,249846,0,124263,250085,0,373901,346066,374012,358596,249189,123903,124583,248685,125125,124103,124603,249372,249459,0,124372,0,124935,125281,124755,124686,0,124399,249414,374066,0,39051,124776,0,248682,124768,307869,0,125003,195851,249034,248632,125196,124888,124473,0,124684,248945,95737,249167,125020,249738,0,247743,200946,249590,0,125201,249463,249234,124643,275396,90958,0,249389,124413,124382,124304,0,124966,0,0,36168,249037,124271,0,249746,374446,0,123905,124491,0,374295,0,124806,249458,373985,249281,124482,124806,0,124598,0,124840,124557,124019,0,249049,373419,238752,249850,373875,0,124809,0,125239,0,497146,0,0,0,0,249629,249426,124669,124567,249190,498606,248955,139066,978,0,0,373776,249180,0,124329,124965,249871,248995,125454,0,249576,0,0,249354,124759,124949,125007,248537,0,0,124650,249687,0,250177,87534,442315,155768,515704,124221,0,105607,124624,124744,124933,249585,0,125301,124428,124557,124657,124259,249672,499352,124405,124813,498667,125035,0,123845,0,124839,234488,249907,123932,124452,0,249534,0,0,343786,124554,248903,124405,250385,0,124783,250137,373889,125437,274728,0,0,339112,0,248676,0,0,0,250017,125082,374456,249796,125375,0,0,249088,88571,0,374063,249256,0,248912,249304,374677,0,500180,125368,124984,0,0,124876,124778,125087,374395,0,0,0,0,124252,0,203803,181206,0,124686,125030,249564,250237,0,0,124964,0,124939,0,0,249904,249776,375544,125098,249830,168281,124430,248938,250218,373596,156264,124624,0,125128,0,124411,249534,0,124996,125516,125134,50118,0,181026,124915,0,124713,69873,124266,124529,0,123775,249365,125027,123806,124677,749440,375302,0,124369,0,0,373544,249592,124310,0,249290,179534,0,0,124385,0,0,217469,249569,124616,124630,124971,124972,0,124871,44233,389246,124802,124941,345951,373967,249050,248735,250142,0,0,81296,124673,249218,500374,375268,248899,373664,125117,14532,249689,151915,124770,249913,268340,0,124392,374147,436345,124540,373613,0,250102,124621,0,124657,0,0,310576,124821,0,0,124725,249193,125215,0,250371,249570,125368,0,336055,348888,124531,249977,0,0,249203,374062,240607,0,0,0,623986,158661,124848,374194,0,373630,0,247764,0,125016,202424,124971,0,248972,124806,0,0,0,0,0,0,0,406491,0,248530,124512,124599,125004,248246,124351,119434,0,0,124850,249686,0,124690,248571,123832,499022,18437,373827,248882,124336,124641,498944,0,124152,0,0,249509,124674,125016,249838,111491,0,0,123880,148562,124873,314981,124761,124944,124057,249882,0,0,126204,124780,0,249530,373534,124649,125210,0,249449,248750,624189,125182,0,249081,124639,249924,499035,248944,124890,0,124264,0,178358,0,124839,249575,499174,124562,146260,124663,278730,20452,124355,373481,121955,0,248768,125296,497647,124808,622064,173941,124644,373853,0,124071,124432,249260,0,147912,249003,250268,266746,0,124298,124541,124759,0,124891,0,249387,125008,498027,249008,411369,498685,499159,239808,622976,125038,249512,124531,83416,146651,374399,124563,124200,125127,0,0,249433,249033,124249,248990,373984,374645,124968,360583,374020,124525,124400,249469,64289,0,0,497980,125146,0,295592,0,0,125311,125002,124244,205887,374540,0,121424,124683,123529,0,124754,124858,374465,124772,0,249281,0,248848,0,125161,249088,249499,124692,249155,124322,0,0,249664,0,249976,0,124447,0,0,124970,124990,0,124656,124097,0,0,249071,0,250501,249093,124539,0,196712,10300,124508,250066,248480,124423,124539,0,124135,0,124930,125020,124857,498970,124629,144764,124250,249152,0,249463,124694,182169,373393,125413,0,375052,125143,0,124769,248248,124922,250653,124238,124279,124493,249171,248671,0,227420,0,125475,124914,124464,124617,372514,124709,249894,133930,124823,124961,125062,0,124841,0,125122,0,0,0,124848,249068,171947,0,0,0,124470,0,374479,124793,498735,0,0,125155,249008,124301,124690,0,124729,0,0,124727,0,0,357201,0,0,498831,124223,374552,249170,0,124869,248700,0,248720,374843,248472,0,0,0,0,249195,373638,249376,248415,0,0,499311,249328,353489,249148,0,124412,0,125190,9179,249441,248343,124927,124259,124691,0,124819,249670,248645,0,124695,0,124264,0,374005,373733,124708,249256,373369,0,250113,0,0,124713,0,125179,343036,125245,124113,124055,0,124996,373763,189026,0,0,0,124820,249069,0,124809,0,124929,0,0,0,124499,374246,0,125327,249784,153536,249802,0,0,113097,125826,249431,124570,249588,0,0,124333,125278,0,0,0,0,125195,499926,124163,249189,0,124900,249904,245125,248846,173473,373708,124701,179256,124062,238535,538252,0,125143,374563,125168,499285,357072,0,0,0,231269,0,0,124577,124801,124133,249878,0,124783,249644,0,0,0,0,124871,249795,13256,0,38975,368558,0,124877,0,0,0,0,0,0,0,124876,0,124949,124461,0,57119,123721,249342,124107,124747,248137,498536,0,124713,124638,249746,249188,0,248482,0,231723,124719,249110,0,82078,0,0,249209,124210,0,124996,249385,373777,125130,0,347656,124481,410834,219662,125351,124202,130279,125371,361752,374821,0,124887,124600,0,124994,125076,0,0,0,0,0,125480,0,124924,248779,0,124397,124941,124285,125403,249374,873823,201070,215736,124817,0,124811,124409,248728,248606,124753,124461,498931,249374,0,124800,124799,124624,0,249133,124129,0,343070,0,374380,124566,16631,0,0,232059,124771,375185,169699,0,124344,0,499684,0,0,82676,248633,283614,0,0,0,374318,25768,214529,0,248332,124674,124722,124805,124435,250945,0,0,124711,373658,249790,374780,0,0,250493,249184,0,146048,249708,0,124563,249830,124874,124475,124184,0,124326,124450,247897,125263,373760,124935,125067,249065,256478,123926,250084,249551,346875,123853,0,374039,124217,124520,0,249746,249808,124629]},{"counters":[124838,499318,248170,221671,250263,0,0,499336,0,354817,124377,124662,124697,124619,125389,35243,120078,0,0,124674,0,51931,248352,125057,125038,124655,0,124641,250179,124790,124597,249311,0,249598,124723,249473,499839,0,0,0,107956,0,0,374658,249388,0,500118,152235,124690,249853,0,249478,250024,0,125037,0,499525,249312,124123,124901,0,373656,212569,125131,0,249952,0,25768,0,125020,248795,0,0,0,249902,374033,124860,0,124783,125001,249110,249057,373865,124577,0,0,125343,165157,249044,0,0,249185,218296,124323,205876,124713,189480,125378,124534,373707,125182,71232,249875,124152,0,0,0,207270,248875,374307,373686,0,250014,0,124993,124216,125095,124989,0,248777,124455,373800,374067,249391,0,249478,46441,299471,0,0,0,124650,94669,181979,93917,124907,249359,0,0,124216,124812,125278,124802,124646,624021,0,249322,0,124930,0,0,373497,124398,0,0,124863,23777,124763,0,0,0,124607,0,124513,47595,370627,321081,125597,124424,0,124999,249014,248962,248963,374033,0,0,249167,250758,124696,0,249647,374092,0,0,124682,372013,124344,74061,202080,124694,0,124805,249371,249252,521080,249541,0,0,0,0,124970,124862,374713,125431,248832,124677,249275,249155,0,0,0,167719,124387,125057,124397,124846,374075,0,0,124817,0,124064,0,125355,124744,249938,0,125038,247665,248935,250853,0,124101,248663,498566,249252,0,0,250049,124820,0,124106,124238,0,248299,0,0,374114,374010,0,0,250164,0,56334,0,0,124658,209676,0,0,373912,124253,124324,249503,124469,0,249332,0,124628,120695,249609,123790,199805,0,0,250575,0,0,498823,0,124474,0,0,0,373248,0,248748,0,0,169115,0,249682,248892,124315,249678,279566,0,123903,248917,249457,0,373814,265509,0,0,254767,74157,0,124740,250040,0,0,0,124629,124710,125311,249445,96461,0,123853,39942,0,124344,0,0,453773,124055,0,124699,124448,374701,124186,250066,498725,0,0,124473,250046,425524,124047,125106,124632,140075,124349,124213,373258,124209,124637,249725,248765,0,249761,124299,0,146855,0,0,124579,124244,124264,248552,0,373397,373928,375473,124593,125173,30945,249121,0,0,373641,249824,124385,0,125133,249575,0,249115,249689,374117,124391,0,250345,124075,0,374483,92788,125046,250315,124850,0,238097,124149,249615,125093,249873,499037,249578,500316,125087,0,125110,124061,124585,248793,124061,0,124655,125221,250094,123806,124752,373962,249107,124800,124091,0,124040,124071,0,249492,205092,94944,249848,250676,124873,124818,0,248627,362525,249118,124936,124007,124996,373599,231855,249054,374972,395873,125011,0,124808,445792,0,0,0,250135,125138,0,124942,249291,0,123880,124557,124577,0,124746,125296,124351,124841,331652,124589,0,124950,20452,249109,124451,0,249249,0,0,124361,499376,0,249027,123904,0,249734,249137,123782,124560,124057,124682,0,0,249800,0,249894,498275,0,374657,249221,125181,0,499708,124882,248525,176926,0,0,267200,119849,499803,0,249234,353853,0,374226,125109,124681,0,199374,0,373755,163870,249148,124366,124957,125035,0,0,498545,0,374609,0,249387,124721,0,124781,124836,498668,0,249733,124513,248761,248847,125086,124485,0,124800,249706,248205,0,0,0,249882,124592,124729,249734,250146,0,0,125730,125162,249801,248985,0,0,124908,0,101388,0,249911,42266,0,68131,249897,249539,375288,622438,249814,249217,124601,123712,249754,353939,50375,248647,373160,249454,248944,0,0,373092,0,124661,249010,304400,0,0,249156,0,124574,249765,0,249254,498420,0,303508,346646,125197,181569,373763,125415,124708,250077,250080,373723,249386,125416,124226,0,249787,250043,0,249672,124631,157537,258845,249772,0,0,374155,124813,283491,374311,249144,124249,0,499343,373754,249254,373417,124846,0,0,124842,124725,248740,0,0,124765,0,124680,0,249355,0,0,249724,124844,250043,0,125002,124527,248891,249191,373805,249128,124174,374003,374101,124633,499498,155563,124727,0,0,249718,124494,250036,124737,248512,0,249296,124561,0,0,249574,0,0,0,0,124473,499389,0,237524,0,125472,124495,124626,250073,0,375283,0,0,0,0,123877,0,124507,154673,125137,374716,0,124515,123832,124767,82676,84312,250648,237517,186216,0,0,115625,124641,0,704979,499586,0,373981,0,0,124919,248653,373334,249499,124310,373504,125385,127190,61124,0,249769,124775,499149,0,499860,124651,249171,0,373829,249407,0,0,410873,249428,124711,0,0,0,59731,0,0,124604,374101,249813,124788,124138,238818,248974,138834,248514,124002,249546,124395,249740,249271,248978,124949,124714,125352,95717,0,249669,0,374288,124813,0,124984,0,0,99618,0,123831,0,124952,125051,125039,748221,374701,124355,124448,11570,124458,373694,0,125065,0,0,124613,0,124573,0,0,249969,248589,123712,248932,249345,0,0,125019,123909,125088,248816,249402,249235,124330,0,250133,125001,248955,31786,340795,249673,124870,503662,0,249769,249478,0,294112,124902,124313,282752,249537,248774,355463,0,248914,124919,0,124438,0,470543,0,0,59564,0,249716,250831,125014,249321,249220,499515,0,374670,124983,188774,124686,0,249318,281842,249294,124452,314900,498904,124761,0,124264,29048,0,124823,148282,125060,374580,373123,124493,0,124574,250271,124851,124570,0,373704,248916,249339,125416,0,0,0,124620,125116,124024,373818,383516,249564,249005,236150,499032,624073,248665,0,125127,248596,124412,124732,0,124131,125002,249406,0,373928,124606,0,0,248655,21812,124639,0,125092,249035,124191,0,374579,0,124748,124164,124703,0,124469,124108,0,124202,124250,249188,250162,248940,124333,0,249549,125403,249340,124988,250032,248850,250232,377971,0,0,125215,248954,0,124475,0,249589,125239,124742,124405,124437,239361,124621,0,124632,0,0,8363,249633,0,373627,0,0,250048,0,249140,124464,0,69357,0,124785,104326,0,124432,0,0,137274,124731,249346,248959,373376,0,0,0,124776,249504,124372,124321,124709,213631,31114,248542,0,250250,124783,0,0,0,125148,249248,250013,125504,374236,250072,0,124959,313712,0,124862,0,0,248983,0,0,0,0,474885,0,123869,374164,124916,250082,257275,124514,124915,124234,373932,124537,374421,0,124269,169231,374473,430863,0,124461,0,0,126529,0,0,0,124806,124914,0,0,125246,84468,0,373812,124734,249847,374162,0,0,0,0,374579,124253,498558,373972,0,0,123735,124684,187050,248310,420688,124977,0,373470,320939,0,0,125093,0,0,0,210893,124509,250045,373467,249805,373555,0,374161,0,0,0,0,374207,11308,249894,0,373678,0,124794,440581,248458,249415,250094,248407,0,124205,124615,248586,124971,0,124945,124845,248754,249233,124180,249165,124733,124672,249436,124168,124370,250008,0,124430,116548,124641,0,125039,124560,0,124936,0,124627,249231,249121,0,373630,124595,0,248884,274169,0,249988,248964,374153,748703,124414,372976,249507,0,249769,248989,118838,0,17460,0,243140,124862,498163,249493,124657,0,374349,499632,124924,250157,372705,0,290299,124109,249154,249460,123964,129827,0,124965,0,248864,124444,0,124999,124852,0,123823,124644,124650,124901,0,0,124492,125028,124208,250525,124720,124603,249488,0,0,124701,410620,124747,125372,124988,0,0,0,124911,115323,249277,0,124491,0,125195,749146,125342,0,0,0,0,125130,249684,0,250073,248783,124163,444369,373778,0,278833,0,373303,410906,170484,0,498686,249302,0,125179,249293,125190,499623,125346,249368,0,167341,124807,125125,124053,79522,374773,124633,249525,375407,124424,249503,124566,0,124857,124809,0,124334,249312,0,125418,125277,124952,514950,124646,249590,124399,0,0,0,0,374191,0,567888,0,0,124329,0,58797,352991,249344,124794,0,0,0,249276,249304,123705,123936,0,0,124840,124585,124639,249879,124103,0,499245,0,124864,0,124668,248746,124650,373460,248846,211436,249228,124340,0,216387,124688,123739,124245,373000,250185,124330,124456,0,373469,0,124648,234594,124953,247964,373058,124717,248179,0,48402,499072,125044,124877,249572,0,124511,124223,198647,249139,124803,12522,0,124967,249348,0,183297,0,124865,6370,124900,125021,249991,0,124647,124590,124660,0,373904,249012,249625,0,153071,33959,124193,250046,0,125072,373858,124733,0,249876,0,0,249913,0,124718,249554,0,124372,0,0,0,225997,125087,0,0,124690,124975,0,499687,0,0,124407,0,747838,124702,124539,0,0,0,124418,123901,124397,124505,0,249185,0,250882,125301,0,248056,125160,249140,13414,249301,0,249515,124115,124846,0,249760,248383,124615,0,374551,0,124925,248471,125311,248884,374478,249515,0,124638,125147,124299,124540,124980,124390,622214,123105,0,0,0,248722,0,250278,124581,124540,249237,249626,62110,425214,18655,49383,499012,249582,250328,249683,249582,373795,0,124853,126687,368138,0,248839,249989,0,124088,124915,0,19807,124675,0,384137,0,0,0,624283,218712,125194,0,76227,124374,124821,125271,124759,0,124038,124656,194309,0,0,124654,0,0,124395,0,36849,13256,249492,125150,249325,125464,124465,268554,497263,124196,70840,374139,0,0,248647,248977,0,124505,124595,124766,125421,248819,0,0,0,124722,249635,0,0,124019,248840,374627,249370,124964,0,124472,0,249099,0,124990,248914,125086,0,124873,0,124877,125030,248938,374196,372940,374210,124700,0,124512,248923,0,125450,0,124446,0,249212,373899,0,250055,0,62540,290686,249141,0,125450,247521,0,125156,0,124983,0,124355,249875,374000,0,0,0,374507,124724,373535,0,124396,124027,249541,0,249457,249936,0,124644,0,0,125196,249340,0,0,328052,373366,124541,124519,125138,0,124490,124717,248147,249106,0,124579,124733,0,248843,0,124539,0,249476,125028,124572,0,125051,30140,0,248922,322303,0,0,0,249554,0,125030,43602,215971,124502,249300,125080,249867,125129,145196,123905,124633,0,248775,242588,124490,249558,0,124564,124989,124341,249496,0,0,0,219585,248800,0,0,125022,125300,0,124215,0,124423,124083,124657,374339,124470,0,0,0,0,472601,0,0,124522,101880,124704,124573,125344,124999,0,0,373500,124968,249546,124624,0,498316,35000,124821,500069,0,124534,249460,124857,123932,0,0,27699,248568,125107,15401,248842,124333,124773,0,124717,0,78378,123752,0,0,124862,249398,124699,0,248903,249951,565447,124234,249430,124441,0,0,374268,0,0,124504,102806,125128,249103,125426,124604,249380,0,125158,0,0,0,248795,0,249692,124670,249800,373563,249730,0,249152,124887,0,124430,249978,499027,124661,0,249168,124649,124809,0,499374,249258,0,374070,124467,373838,250082,0,0,125427,124281,125015,124465,124252,499501,123438,125005,124813,124533,0,124616,249587,124124,0,124948,0,0,0,374409,152471,498651,374168,38975,124703,249387,0,125138,86202,0,0,124737,124140,0,248837,124681,250102,0,746024,191412,0,150055,0,0,373826,124983,0,0,0,0,125136,125219,66509,124935,0,249736,249699,249539,249554,124232,381034,374529,0,124258,0,250072,0,499243,249133,124197,124701,124319,124888,124413,0,0,0,124477,0,124477,0,124032,124963,249298,148923,249311,124432,0,0,125169,124519,125099,372454,125571,248703,124154,124489,48434,359078,482311,0,374171,0,0,249111,125023,124835,372449,348744,749669,124461,124599,374441,249238,0,124544,124497,124514,124019,249101,124274,0,249052,124885,125061,375204,0,124341,124521,0,249319,124701,124719,373290,374848,372975,124400,0,0,0,0,124329,0,124598,0,249203,124821,305869,0,125371,250066,249152,125202,0,124781,374077,124482,249432,0,124635,124603,183640,248663,124883,249374,0,124616,249481,124221,89442,174827,124605,375273,249350,0,124390,0,124708,249180,0,0,248835,124126,0,112659,0,213314,0,124947,0,125142,124273,0,0,124084,125267,249548,374273,124427,124679,0,285645,124679,0,249955,125323,125438,0,140939,124496,124132,250984,373590,168039,53824,248738,374426,0,0,0,249680,248891,250091,0,124812,135271,0,0,250113,250175,124636,0,249139,125042,0,0,124433,0,0,253616,0,373989,124837,374014,0,124759,0,249931,248365,0,0,374561,124268,124483,124447,124373,0,250252,225184,373908,124565,0,0,0,248266]},{"counters":[0,124976,173018,124446,282756,250760,0,0,124570,0,250027,350370,124113,124298,374827,125062,186118,336136,0,0,0,249334,0,124599,124534,0,0,0,124069,374637,0,249680,124477,124722,124447,0,249795,124437,249260,372974,124540,124454,248893,124124,249774,0,0,124465,374067,248956,124093,125634,124562,248789,498058,0,248745,421668,124963,125158,124447,499309,373972,368544,249666,248670,0,248799,123992,250177,0,0,0,304844,143905,248929,0,248968,124638,250545,124647,124728,248495,124701,124801,248925,249291,0,124508,0,373601,372871,0,249311,124326,382070,124358,0,0,374801,0,327498,373053,425796,249455,124253,125003,1057,124643,124457,0,0,125464,124841,123905,0,374240,215244,124987,0,124164,124670,123721,249406,0,124805,498093,0,191321,189310,124781,498206,124123,249698,124927,138853,0,0,374329,249321,249513,0,124656,124007,124405,499075,0,124577,373758,0,0,249174,125182,248704,249049,125605,0,124407,125060,374143,124634,0,248832,124481,123869,249629,74061,0,124889,125006,0,0,124641,375184,124647,0,0,0,0,124453,124358,0,0,0,124244,25768,0,125044,125065,125099,124521,0,123996,375265,553810,124941,375104,250073,0,124400,0,124185,22825,124061,375163,249316,125002,334527,124773,0,124714,250260,124727,0,124846,0,248960,125246,0,249879,125091,0,124429,125057,0,0,374680,0,124301,124365,124707,124252,124470,498251,124691,276437,124424,0,0,427817,249632,244823,374869,0,124410,124761,249668,227652,125005,125018,124540,124907,250366,0,0,0,0,124150,0,248757,125221,124833,0,124851,124217,124464,499115,0,0,249190,211347,124512,374077,124841,124446,481774,0,0,0,124196,0,124131,125016,124900,0,124466,249557,0,0,124446,0,175545,375014,0,0,124189,0,124515,249447,124779,124345,248836,499830,124418,23777,496128,249189,0,124230,0,124625,271481,124392,0,111491,333127,546600,125108,10300,0,442026,124720,0,0,249150,124171,124896,249333,250033,0,249603,248233,0,0,124765,0,0,374072,248576,249258,125214,125054,341403,0,373929,0,125129,250076,124984,249453,0,249416,82078,499020,249727,374814,125067,0,238834,310913,374501,124539,0,125241,250177,249550,249809,6370,0,287667,249541,249038,124850,249218,19374,124259,250168,0,0,124745,0,0,124237,0,0,373600,0,0,124856,0,0,124787,377151,249466,250172,0,45829,0,249405,249214,124703,250040,125338,249456,497469,124494,250153,125422,187681,249064,174978,0,372494,125161,0,248795,249892,249668,123968,124513,124914,22703,124752,374559,250875,124345,248609,124527,125119,124200,0,249785,124719,125039,0,0,124690,233797,0,248813,0,124787,498627,125053,124511,0,248993,124572,0,0,0,124759,0,248536,0,249090,124990,0,0,125013,0,124734,0,0,124977,249798,0,124259,249785,124096,124791,250121,248452,124601,25406,0,234642,250425,124657,124723,124556,123913,0,0,124293,124621,125358,124752,124287,220643,250214,0,0,374189,125323,249926,0,30140,0,124853,498067,249007,249162,0,0,0,124743,124613,0,373915,81758,0,124333,250304,124485,124269,249508,0,0,124592,249369,124557,125148,249462,250053,124747,93917,124823,374263,124921,374183,124892,0,0,124413,124653,124685,142598,0,125265,124702,249348,124385,0,248709,0,0,124809,125067,0,374301,125004,123955,373645,124566,124813,125078,125071,499049,124546,249476,80235,124959,374042,249280,124477,124883,373641,261797,27718,124989,0,0,124742,124198,265908,0,0,249952,497601,0,344865,248356,0,124522,124698,124563,0,124731,0,125152,0,0,0,248635,193218,0,213727,410474,126709,124679,623903,125187,0,0,0,249747,250632,247999,301157,124820,225052,125195,125339,0,124724,0,88571,248444,374819,124467,0,124807,0,124522,248907,249427,0,373884,124733,125394,124564,125041,124732,497972,124900,124407,124477,199502,123790,0,0,215136,124541,0,248117,0,249722,249889,123853,249508,124823,0,250235,0,373707,124982,0,124527,124964,373606,0,210852,125007,125323,124574,0,171409,0,249204,0,0,375062,0,689919,0,249177,374519,221610,124518,0,98425,0,31114,124474,292472,125149,124557,123882,0,124903,124438,0,124737,249138,249954,249126,250273,124648,0,0,171277,138499,125001,0,249798,0,0,124707,498703,249644,125299,0,373488,250226,498518,0,124733,124168,0,124064,124655,0,249269,0,0,124700,0,0,0,0,196353,249266,249245,249398,249053,500838,373913,0,249125,0,248560,0,0,247884,249543,123739,248774,250148,373532,0,374084,249240,0,311776,125611,249539,125309,374469,124694,0,0,124649,0,0,249616,124387,0,24748,124613,245749,0,249808,124152,248963,392549,124536,373898,0,0,249988,249662,374115,124468,125396,125089,125093,248953,0,249005,0,0,249181,124339,124913,0,0,230358,124791,0,498642,202827,374740,124432,124600,124893,0,250483,0,249537,124515,250056,0,499241,124970,0,124866,0,124963,872743,124649,124038,249475,124135,249568,0,125483,373991,0,248907,249735,124947,290676,124818,0,124764,124322,0,0,249518,125150,0,0,289537,0,124674,249828,124863,0,229993,249330,249900,248963,81296,374769,0,124686,124767,124581,248658,124967,249187,249311,123752,434830,0,240546,374170,342247,125409,0,373512,124729,30111,0,817661,125037,124809,52605,0,0,301196,236468,564562,124439,125283,0,374122,124221,124517,0,124974,0,0,0,0,124660,0,373756,248869,374183,249343,0,348282,0,125267,0,0,0,499257,226912,0,249075,0,374557,0,0,249581,125082,124084,124755,249606,0,124796,124768,0,124491,249932,373246,0,0,249738,0,498240,374437,124347,248825,0,249760,484485,0,373675,480656,124382,248862,0,124479,249673,0,124401,124197,124632,373927,249760,249826,124373,0,0,248794,0,0,0,84312,248870,125083,0,124660,498467,0,124138,174954,0,94944,373795,124683,0,0,0,124263,0,0,124352,179448,124473,124653,0,249529,124438,113110,182945,123847,249557,0,248481,124546,249089,374112,638843,124639,0,124972,249705,124464,0,0,124653,373679,125381,0,374244,373964,0,0,0,124512,0,182046,249473,124718,0,125826,124574,0,0,240384,124648,124888,0,0,124470,124101,4143,248903,124462,124907,0,124627,248929,0,248794,0,249062,373793,123712,57794,0,0,249980,125385,500144,124461,125188,0,374462,124817,0,374434,374204,250014,373779,123831,124751,0,249268,0,124538,94669,124234,0,124558,249137,500210,0,248853,0,0,124625,0,0,0,124993,124884,0,0,0,124310,249239,11308,124355,0,0,361565,124300,0,373213,0,124957,344408,124393,249084,374041,285922,0,250242,125025,124355,0,249174,124648,0,0,249132,249476,125104,124567,0,0,249385,54478,0,9311,3014,124934,125131,249596,124731,0,84468,0,124455,622113,374664,249677,124883,0,124508,124071,0,0,124271,125201,125103,250422,124806,0,0,0,0,248979,0,124626,125136,248597,13256,124982,497993,124653,124524,250094,0,499624,124887,248678,249359,249759,0,0,374243,124819,124348,169439,0,124933,249516,124274,125146,124638,0,619339,0,124857,0,248856,124650,0,125010,249324,0,124414,0,124933,249118,124250,124253,249517,0,0,249311,374219,124561,0,374366,0,0,383511,249643,125239,161073,0,124491,124865,250400,249663,124553,125133,249252,124708,528944,0,124753,124390,499121,803909,0,249663,0,124668,373338,249524,249258,0,249381,0,124923,193890,124907,249013,0,124695,124639,124811,249076,249762,373362,124383,249184,249454,249277,226713,124292,0,500035,0,0,0,375300,418792,0,0,374385,124768,249843,0,373622,0,124502,0,249466,125413,125257,124573,59564,0,0,0,0,248066,124685,249310,124427,249420,0,124522,249413,61685,125324,248403,20696,248496,0,124686,123803,124531,374440,124823,248171,0,623417,249583,125117,0,249067,4092,124747,125034,228907,19807,0,0,0,124281,124247,249590,0,374013,124929,0,0,250403,248619,0,124845,0,248628,124313,0,0,248310,249791,221978,0,248958,0,125311,249308,249094,0,250016,0,123782,236839,249843,125425,124801,124435,160823,125491,124564,0,124579,0,250862,249538,0,146462,125277,124663,125448,249472,124992,124208,15433,124681,181149,249106,0,0,249011,248838,0,0,124686,248205,0,124686,124198,375230,0,0,124424,0,373652,54712,0,0,124910,240910,0,249430,0,0,124500,373578,0,0,373666,124705,0,0,125035,125245,0,0,0,124473,0,249426,248981,124895,249055,0,249212,248882,249760,284327,0,124646,374810,317863,106906,249298,249523,374687,124148,59731,124588,124551,373363,250355,0,138299,0,125138,249841,124911,0,499685,249369,250040,0,141760,0,249081,124242,124672,124936,0,124609,145037,125046,0,125015,0,124972,0,124746,178776,0,123904,124505,0,0,250210,250188,125011,248870,248942,0,0,124234,249898,124582,125280,0,124852,374434,420511,125471,0,125421,124707,0,374882,124661,0,0,124722,374415,124674,0,119434,124901,231127,361603,73030,249581,124775,373694,124737,124706,124107,125109,0,0,249927,124351,125047,0,124082,249381,358392,124644,0,124986,72550,373974,125017,124534,124228,0,125024,189838,124373,124515,156243,133384,0,248872,124699,124824,0,124538,0,0,0,0,640622,124890,425699,261660,124459,0,125271,125060,124245,125293,248844,124040,124019,0,249169,374230,0,124198,373369,249258,248919,124662,99618,249083,106980,249150,0,124502,374217,167025,249112,374702,123903,189459,124787,30945,0,0,0,125212,125042,125352,0,0,0,124949,374257,249440,250081,124324,0,0,124874,124996,124565,0,0,0,124159,248549,124925,248763,249121,249763,0,125263,124575,499600,374804,498201,0,124365,124492,0,125014,124600,0,124363,124617,0,0,124873,0,249778,193615,248188,125609,0,125346,0,124617,124656,374922,0,0,124915,124563,124059,124800,124321,124057,255288,124495,0,373520,373712,124301,326014,125432,249470,209592,0,124914,0,248643,124729,256907,124329,0,0,124437,124520,249281,374805,125389,124898,0,0,124434,0,0,374363,124968,124988,373469,373162,374174,124945,374366,0,125133,0,124542,249353,0,124600,124071,0,249042,249096,0,124667,249541,124661,249886,319633,124604,0,0,249832,124515,0,0,0,0,0,124563,410528,373750,124482,124838,249493,0,249355,249524,249219,124962,125531,0,375389,414386,249559,124456,124152,0,124821,125119,124249,249372,53584,124483,0,124071,0,124581,0,0,249769,182157,249663,125277,38975,124562,125095,373867,0,124654,0,0,91808,216193,429826,125087,241368,124333,124323,0,249252,374361,0,124483,124593,124180,125733,125021,79051,0,249610,0,0,249648,0,374978,124708,0,124029,374537,0,337591,250353,125246,0,250021,6111,250030,125110,125138,124485,0,374570,124851,124414,124115,0,124882,124587,249406,249433,0,248855,0,124744,58797,124329,124564,0,124888,249614,249424,125171,623970,0,124395,372630,248756,249159,0,0,248847,250182,320216,124838,122182,249929,0,0,125225,132951,249563,0,124545,125037,124778,0,0,0,249958,125186,124897,124129,124655,0,248830,478910,124986,249404,125174,0,249656,124846,0,125450,373512,0,124203,124529,0,249426,0,316049,124695,123911,124413,125130,124743,124374,249002,124311,0,34290,249525,124632,0,75506,0,114421,249221,125041,76405,123891,249666,0,125145,118838,124580,205727,0,125597,125189,0,12308,249168,125034,250060,407782,372750,0,207711,124767,0,396041,374543,124557,248630,0,0,248800,124470,248767,0,0,0,124176,0,124172,0,373951,499530,94165,124040,0,124747,0,48434,124058,0,249755,249157,249251,249175,159919,0,249321,0,0,0,124522,124915,124637,498914,218159,375134,124997,499308,196115,124716,499802,624485,124726,124386,249559,0,79522,248825,0,124832,249056,125392,125141,124019,0,372897,124727,124836,0,125019,124469,125168,124851,124889,0,249265,0,124433,249801,0,124915,248924,292826,124841,498868,171106,248780,402712,249243,124851,0,0,288172,250073,375032,0,124690,124713,123832,248833,124226,124469,248892,124641,373217,125117,0,0,0,0,374324,164706,124419,373207,0,249291,248748,124695,124919,248874,249584,124918,124486,124589,248473,0,0,374014,124787,125143,76227,0,124808,248915,0,249809,124461,249206,248651,249177,124619,583461,373601,249837,249841,0,124960,124302,124876,124959,0,124690,0,0,373516,0]},{"counters":[249471,0,747993,249674,624372,332728,249448,499345,497981,223291,499813,123874,374908,124461,374325,0,124574,0,0,125020,101388,0,0,0,373655,498709,249043,498827,124133,125107,124232,124551,0,373511,249311,0,0,0,249502,0,127802,124296,0,130223,0,0,249106,309051,248221,0,248893,125106,128061,373981,249066,229049,0,124567,497969,124253,0,248892,183381,0,374265,0,373889,0,125024,124790,0,0,249903,0,0,306274,374169,226731,0,374517,124791,124822,0,249643,124927,0,415089,248876,373684,124696,0,0,0,0,249180,0,355471,0,124115,0,124360,0,125265,124876,0,0,125035,124040,124789,248969,125221,0,0,0,0,0,124882,125119,124873,248687,124581,375323,124139,124540,124933,0,0,100541,0,0,124485,0,374496,0,374149,282193,108142,0,124448,125361,248532,124661,56334,124945,447585,125038,249315,124809,251249,160846,249397,0,124326,124708,0,0,0,249472,249909,250318,124657,124805,125087,250588,125091,124681,124855,123739,124707,249326,124982,124844,125060,124907,44233,124765,0,0,0,124941,124642,498837,374561,374141,374307,124438,248643,0,124675,249830,0,124215,0,374580,249590,82676,249658,249517,0,373824,249582,0,249088,249341,249121,0,41105,248843,245706,0,0,0,193848,0,249974,0,0,124345,0,373454,21785,124633,125197,498985,124662,125228,373157,124691,125484,0,249373,0,374609,173444,124972,136082,0,124595,248731,0,0,124839,299212,123783,124998,124198,194001,374285,0,124986,124761,306589,373803,250074,375335,417298,372605,183731,0,123911,124570,123721,124564,374266,250132,624500,372462,124554,0,0,248829,373785,124862,124883,101880,74157,0,249627,15401,248818,0,0,124360,124069,224086,0,0,218820,249099,125037,375075,249633,125041,0,124882,249669,0,51674,250130,0,124701,373766,374560,25768,125000,153168,0,250167,0,124904,195860,0,125225,0,249451,595905,241331,0,0,374802,0,125007,124180,125080,0,0,249797,0,124413,0,0,15433,0,125352,372953,124601,0,125011,249116,124335,240511,124245,0,124949,624252,124442,0,124800,124803,373652,248802,497695,0,0,124189,124787,249289,158478,249203,0,123847,124701,0,249527,281472,249395,124663,125396,0,0,0,0,124737,0,249727,124718,124567,249937,0,124902,0,0,29631,374682,124613,125383,141816,0,0,0,0,248823,374329,0,124823,125020,249499,124674,0,249418,124234,124581,124553,248913,249343,0,249177,125299,125021,373524,124983,0,124433,0,0,0,124800,124898,0,249189,249120,0,124193,249602,124660,0,249515,124325,324952,0,36293,62499,249450,0,0,249599,249551,0,0,124376,0,124850,374238,0,337702,249555,250058,0,124574,287307,124774,623616,23777,124349,0,0,0,0,249720,124748,123705,125046,124314,125278,77280,497947,120078,124823,124926,191645,124533,249622,0,0,0,124662,0,0,0,0,0,0,124390,124998,249852,125333,0,22703,0,0,0,0,373997,249565,0,124870,124871,124493,124244,213748,76227,125368,373717,373950,249821,124825,124610,0,0,124219,107956,0,0,124668,0,115323,0,248850,124839,373353,0,124198,124650,250035,0,125141,220722,202778,124319,376891,249456,249523,124227,0,249422,0,322205,125239,249083,0,124167,124088,0,0,0,0,124775,249533,616773,0,124851,849806,125099,190343,0,249194,0,125413,81758,249284,0,0,500319,0,0,248654,374736,249898,0,148552,0,125255,17721,0,373582,125394,0,373686,373058,124513,124974,0,377077,0,0,249058,0,249424,0,374254,204251,250071,0,374166,497292,0,124737,206625,249465,125138,124783,125020,0,249702,3014,125076,124834,249817,124616,0,124180,249000,250193,249510,125145,124173,0,249840,341075,0,375521,248917,0,316548,186181,124889,249661,124148,499043,133414,124499,0,374061,124747,0,125027,215521,249379,248531,0,249731,249345,124943,0,249499,248974,124722,229357,249652,0,250156,249311,125241,0,0,374998,249722,0,124865,0,346557,124527,0,498160,46395,249316,0,248341,73437,124869,0,0,0,124805,0,225810,134599,250546,372806,124724,124259,130758,124839,125087,0,124576,0,373286,0,0,36849,0,0,124801,126307,374424,374390,125078,314206,80235,124709,0,124709,0,373996,124851,249952,249884,124663,124731,670984,374033,0,125438,496568,0,249539,124509,249324,0,373606,0,124794,124252,124803,124553,155321,49350,0,373778,124647,114421,249514,124515,0,0,12308,0,124252,124992,124238,248693,0,124129,374439,249330,0,124771,124838,249916,0,125245,374963,0,124336,500255,249476,124238,498609,0,373884,248821,250423,199505,0,249847,8285,124470,249345,124249,124370,125289,125294,248679,124692,0,124975,0,0,0,0,0,249641,123877,249384,125223,125067,124892,0,0,123903,124717,0,13256,125032,38040,0,0,0,249023,124220,124754,302192,248757,249194,291888,124665,249348,0,0,124710,0,0,125504,124638,0,124675,498593,0,0,0,0,124047,249049,0,124852,124945,124210,124543,0,375283,249086,124901,0,249538,0,497831,248177,249833,497632,0,124880,212984,373134,0,249301,124300,0,623778,248958,249835,124848,0,0,374073,125031,124734,0,124798,124324,124329,248870,124469,124909,124826,124168,125051,249918,123803,249799,0,0,124539,124695,0,249260,0,0,123882,231926,374206,0,0,0,124856,124845,124502,124824,250384,0,249082,0,124205,124563,249332,124634,373446,0,315245,124295,124624,124897,124929,249713,373687,0,251251,124748,124302,0,248478,0,248760,249460,0,303748,0,374126,218540,124319,124668,124538,394249,124923,124908,124732,0,0,249213,124419,0,0,124809,307144,0,124852,0,124490,24770,249917,0,124342,124410,249092,0,124285,250116,0,124922,248604,0,0,123996,0,248982,249468,0,124566,0,124644,124176,124763,125093,124836,374447,0,249172,0,124811,124468,0,0,0,124615,0,0,124401,124423,248748,248658,125403,247963,124716,250191,0,0,209359,0,89926,0,0,0,0,124551,64805,266788,249873,124481,54478,124590,124460,248976,124609,124482,248356,250240,497870,51931,242429,0,0,249950,249560,0,0,124374,249255,230136,125435,249086,0,0,124657,124555,124494,125067,249319,0,0,373391,124647,242212,248387,250001,249145,124658,249499,528130,0,124942,249676,249273,249558,0,154829,124271,124893,0,499701,0,0,0,124624,0,250308,0,158811,0,0,0,153495,124398,125023,125150,0,125358,250126,124443,123891,125308,124377,11308,124963,0,124778,248978,249814,124212,125044,124405,124341,0,124646,170530,124801,124196,124971,124277,374576,124674,0,124277,0,124876,124331,250952,0,124490,498949,249221,250212,0,0,373894,0,0,249438,0,124611,248705,0,249819,124264,373634,249411,124577,124840,125015,0,359757,249814,0,125108,124694,124301,159888,249573,144639,124893,124438,124500,0,124315,124593,0,0,249455,249311,124668,0,249343,125450,248861,250223,0,0,0,0,328321,125309,125609,0,0,373802,0,249632,0,0,124300,124540,0,123985,249406,124762,0,248621,249099,0,124745,124522,545278,374271,274609,124776,0,124434,374597,248281,124682,249055,125090,250380,69873,124674,249761,0,248510,125072,0,0,249172,124844,0,124735,125014,333854,0,124447,124661,0,355795,0,124733,0,132272,124715,498532,123845,124740,248706,125257,44513,248920,359160,84312,374523,374352,0,248529,282428,124414,125062,124930,124153,248940,123832,0,249579,124680,225021,91808,124722,0,0,118599,374590,124964,373779,124818,124486,249813,0,249237,0,0,250120,249144,0,250127,373046,375148,0,124412,249364,0,373961,249393,177134,249538,124918,248864,248760,124970,124294,125256,248784,124679,0,125109,212078,125149,124589,125120,124642,0,249274,46441,268461,124712,124699,26711,0,248944,125098,0,0,124857,187156,124742,0,338377,498685,0,372661,250185,0,72007,125027,0,0,249212,0,186875,125152,0,498780,249831,0,248738,0,248903,0,0,88571,374695,124864,249486,124394,249336,124387,124739,249540,372518,124379,748604,0,0,124534,249472,499537,124539,374452,115625,124837,373361,124019,124759,124822,249698,374401,0,24748,249379,124892,0,0,372743,0,124653,0,0,0,0,96644,498840,124545,125104,124626,124164,122182,0,373665,250146,248640,124434,165327,499545,186267,124821,124974,0,249502,335865,124724,0,495102,374068,124820,0,124990,0,124109,124411,151870,124897,125427,125233,231999,0,249619,125212,125137,124486,0,498769,124768,125204,0,249246,249282,0,249320,0,124390,39051,124234,0,154986,124477,341874,249233,248505,0,0,124851,124707,0,573659,0,0,0,6370,18437,249700,373122,0,125421,249106,250086,248410,0,124869,123968,123866,263308,125252,218065,375725,5272,249517,0,0,249379,207425,0,312933,497403,356106,249705,36168,0,249202,375551,0,0,0,0,0,124716,124745,0,256251,124477,249434,249365,373599,249290,0,351252,157974,374119,124952,499698,124902,498443,0,124483,0,373480,124502,0,125086,0,321120,248933,388999,125098,373845,0,248720,0,248418,249912,0,0,249331,248947,0,124668,0,250404,0,124883,244410,124240,0,169981,374029,438167,125223,383267,248247,124991,124557,0,0,125571,0,250318,248643,94944,192840,249285,124374,0,373670,372397,124522,124656,0,125112,124858,125028,250023,125122,124397,249047,249446,124310,499566,0,0,124819,0,249817,373116,0,124994,0,124614,0,250783,125037,0,124625,262070,125199,0,249087,249467,0,210546,124850,124433,56917,0,249492,124513,124927,0,124759,249652,374296,0,67240,124527,147599,0,498208,249508,0,124168,124149,237357,0,250190,124838,483080,124511,0,0,248957,0,249755,0,124519,125342,374536,124707,0,249413,249971,250485,0,0,0,143375,374223,124182,249399,250406,31786,81296,124624,124590,0,373537,0,0,0,124473,125418,0,0,0,374548,124514,125010,0,124824,0,248808,125025,0,125336,125416,0,248813,249910,249254,0,249689,124799,249442,217456,0,373529,0,373834,124734,0,373935,373962,276140,4092,249193,0,0,249171,249537,0,499975,124783,0,249763,0,0,124382,413327,125162,249712,124703,0,248821,249496,125309,0,0,0,373985,249804,0,249917,0,0,0,124699,124691,497690,230337,124029,623172,184194,123921,124734,124513,124182,0,124355,124131,124097,125029,250513,124442,0,124277,0,124713,0,124025,497651,124465,250661,0,249361,124385,0,125062,0,0,373351,124017,124708,498609,471811,0,124649,498139,109834,124546,373269,124239,124521,0,124292,0,124580,249296,249641,248974,374235,0,248460,0,124577,248935,249151,249073,0,0,219778,113097,124793,124925,249997,0,249421,0,0,248993,124171,373347,124883,0,124103,0,125085,373403,248818,125158,248972,0,0,124853,374679,189059,373071,125039,124781,250037,124850,124639,249650,124851,124966,124432,249906,0,0,159943,0,124310,0,124729,0,249388,43252,250544,124276,124512,0,499307,124187,0,249084,0,0,0,124040,249789,125089,124512,248914,174959,124635,249372,124138,249250,0,498868,0,0,124791,373836,0,222814,0,124952,0,124764,124681,137035,0,249451,124647,125057,249009,0,249304,124907,123932,124846,374369,0,249558,249546,124643,0,125158,124812,0,248603,248671,244128,249261,124710,9311,0,125048,0,0,124437,249484,0,0,0,124759,124655,125177,0,249825,40400,125326,124221,248754,249940,42369,0,0,374137,623846,374158,249178,0,249795,124646,0,0,497824,498008,0,498725,0,124626,0,0,124534,124621,0,57220,124007,374310,0,373432,249361,124456,248705,249987,250289,248516,124862,125099,125269,0,125480,249048,125201,125192,249073,374713,249341,0,141038,249144,124593,0,124199,0,124211,125516,124221,248727,124509,0,0,0,0,249405,124112,0,623233,0,124759,124340,249803,374160,0,0,0,0,0,124283,0,124914,0,250038,249273,249422,298144,124813,0,249394,0,596556,0,0,125359,0,236750,0,125003,124919,125113,124817,124675,0,374588,124654,0,249934,125491,124482,500436,124907,124465,375308,249973,0,0,0,497993,249512,248357,0,0,124691,0,250006,373457,124996,219962,374073,124274,239027,124656,123712,249171,249307,124057,0,0,248752,374410,0,125117,123105,0,124446,373947,124521,249559,0,124641,249861,125134,124642,124753,0,0,248284,124860,125081,124096,0,124008,0,124269,124752,202547,125227,0,250381,125219,250893,249044,124446,0,249630]},{"counters":[124633,0,249102,124154,124783,0,0,249148,124844,249020,124716,249810,621152,249277,124202,373714,124906,0,0,249321,219570,373651,125156,250229,374562,124055,0,250413,248870,124686,249672,0,124383,250027,0,0,374680,248981,373844,124047,0,0,124657,124593,124465,31114,373424,0,0,220887,124624,249337,249305,248872,124722,249417,125224,123913,124866,124813,124663,47092,124925,0,0,183716,124499,249277,0,124101,0,0,0,124589,175187,249995,125149,0,249225,124701,124848,0,249906,374510,124325,125127,249770,3014,124944,124823,0,124771,125133,124928,0,528425,124820,0,373787,250212,0,0,125245,250043,125087,0,124641,249533,437524,205480,0,124414,249743,249067,0,0,373685,0,62540,374179,124740,124533,323209,125166,124447,124572,124411,0,249128,125733,737206,125185,143718,124324,0,0,0,125013,248355,42369,249220,0,124331,124713,0,0,373346,0,248925,152275,125203,124902,124656,124614,124695,248872,0,0,124393,249874,249092,0,0,124456,239977,333356,0,374444,249426,124374,124770,373912,0,124964,0,124485,235851,120695,125162,0,0,118599,373279,124863,125034,0,125343,123519,0,0,124543,124223,248999,0,0,124482,0,311158,374424,124553,124719,248995,0,124477,249219,0,124810,249868,462024,498260,374347,124619,125034,124422,124429,124682,0,0,0,249685,226912,124152,249994,124365,250307,124986,124529,124646,0,124505,124759,124574,373139,0,124965,249422,124939,0,124902,248663,0,499201,0,0,124542,124824,0,34290,621452,124527,248939,249035,124313,373176,249401,124590,0,0,124428,323614,124595,123891,0,0,374611,7217,0,124786,124822,155225,124187,293759,124562,0,0,0,0,151903,124697,36849,124113,125030,249124,0,0,124674,124780,233030,0,125020,125214,0,0,124753,124385,248406,374266,249595,124611,0,287213,125021,124811,249163,124433,124348,0,124533,123992,249934,0,0,125571,0,0,374299,124952,125058,0,249411,374002,0,250123,81296,249934,125364,334973,0,124629,124857,0,249143,0,124656,373255,0,0,0,248770,249762,124577,124686,124833,250333,250032,249158,249535,0,124398,124172,249420,0,248635,374541,249449,0,124395,124448,125129,124783,0,0,373240,238233,124490,0,250119,124475,124971,375190,124457,0,217326,124462,53824,0,0,249316,0,249933,124685,0,0,124974,0,0,157257,124564,249244,0,124287,0,0,249974,123921,249788,249363,0,372648,373107,372791,124643,0,248991,497565,250238,124522,249941,0,124062,124562,0,86202,124189,498222,0,0,0,249757,64805,125289,400228,248559,0,124865,0,441934,255735,91758,0,374520,0,250193,13256,0,249521,249721,249746,59052,249275,124707,249992,0,125161,124139,248211,373275,249637,124888,249323,249429,124619,124638,124191,124417,124835,248449,0,0,249198,373074,124800,124423,249731,124486,249833,498679,124418,0,0,372893,0,124626,124216,124219,249030,51931,124753,373436,0,243718,105607,0,125066,249177,0,248311,249650,0,210529,124800,0,124504,248812,124704,0,0,5190,249533,0,0,124360,124477,0,0,124918,124668,124465,124934,249725,124277,124397,248874,374103,124002,373475,124714,0,248886,248791,327033,124299,0,83273,373538,0,124727,0,0,124083,124964,0,0,0,124217,79051,326605,0,124069,372942,124740,0,249262,124647,133935,0,373399,125392,361085,0,249636,0,0,22703,124574,248252,0,395432,249095,0,249440,0,0,0,0,249174,499149,0,125309,124461,125082,373355,373929,125231,125383,124675,124377,0,0,124089,0,248454,249865,0,43602,0,623789,124628,0,250085,125098,0,125011,0,249532,248918,0,0,374103,250149,148077,0,0,373326,0,124720,206715,17721,299372,0,249330,0,124509,124923,249525,124245,124254,373289,124825,373775,0,125038,373662,0,250104,152964,249456,248716,0,249726,0,249191,124660,124124,0,125007,0,249440,0,249079,49383,249316,374007,37064,0,0,0,124377,124467,374296,0,193763,124708,249613,0,124555,248741,0,249196,0,497989,374280,0,124573,249382,248947,124707,0,0,124592,310515,124539,0,125138,499674,249264,0,0,125609,249127,0,0,0,0,373511,249550,374290,249733,124557,109453,374216,620100,0,0,124936,124695,125042,0,0,0,125145,124950,124939,248988,375300,250222,124986,0,94165,123911,125113,124981,124826,190019,249323,91808,124862,0,184142,472776,250551,0,18437,0,124635,0,374583,0,70840,64005,0,374251,124573,0,181946,249731,249346,347774,249471,249060,124707,0,124615,124476,290617,107956,0,124657,231055,124299,124594,372773,124699,248960,124806,0,249563,249725,0,124711,0,124395,124779,0,184495,124641,249381,0,125060,124291,0,250505,248851,0,0,124721,0,124538,125014,125565,124358,124710,125261,498555,0,248857,0,125089,124485,0,249113,125152,0,0,32005,0,0,0,0,0,0,373990,0,124221,0,125068,124595,125267,0,0,316093,248641,248925,373360,0,124341,0,125351,124960,124616,0,497861,249380,124661,39051,373954,249270,0,0,0,499748,221228,149432,0,124599,57119,283949,454036,250503,249871,0,0,456951,250209,249707,249550,0,124682,125468,249265,125225,373429,693169,104324,125344,477299,124598,0,0,444448,0,124783,124667,0,125413,0,124437,0,125038,373952,623282,335934,33959,374921,125032,124890,0,58046,303417,124734,373569,124564,0,0,0,124339,94669,372995,199373,125095,124968,0,0,0,125201,0,124621,124486,249563,249509,122182,0,397148,152805,249333,0,0,0,124167,0,0,124560,124924,190592,124854,249823,0,249801,125336,125733,54712,0,124862,250403,124989,167388,0,14532,124915,0,124627,241135,0,124732,249267,249267,217445,249061,124853,250164,0,374521,0,125453,274103,125152,0,0,19807,0,0,248805,0,452415,0,124633,375242,124976,125311,124860,0,249659,82676,0,0,200294,0,0,124866,373834,124722,249007,124462,248594,250075,223451,125009,0,124909,11570,37058,231615,0,0,0,0,248847,0,249744,0,0,249693,0,0,125228,0,248621,0,0,125016,0,124975,124800,124833,0,124633,124941,248035,125119,124753,124910,0,124168,0,125065,0,249395,0,0,124229,124413,0,124668,374887,249596,0,76227,499160,0,124692,0,374313,249681,124884,135057,0,0,124126,249890,0,124898,124292,124851,250007,249994,124600,12522,373667,373167,249076,498729,124824,0,249299,124699,11308,249956,112156,224510,124240,124173,124430,0,125196,373178,124718,249172,124988,373439,248952,249392,499170,124424,125039,0,249653,373934,124372,124525,124604,0,124378,124889,124228,0,0,124598,374873,0,0,0,375168,249242,124567,0,124455,0,4143,0,0,249263,124227,374792,0,125021,249222,124107,125634,0,373907,305985,124632,124984,249683,0,124393,373520,0,249483,372763,124581,124097,250238,247371,249060,249936,186140,124703,0,249509,319757,124629,248711,124477,270937,125093,249416,498373,298928,0,169388,21812,249186,124752,125141,249326,124407,124171,0,176981,71232,125257,248601,250048,374788,340193,0,0,0,251621,248527,499153,0,124382,249991,498803,0,124677,124258,247970,0,0,124232,124547,0,0,0,0,0,249467,249523,0,124675,249152,124249,249373,125427,124639,236278,248671,0,124859,124564,124291,124197,374824,249461,0,124914,374101,373309,0,499451,374368,0,123932,248736,123783,124695,249576,123775,0,249535,0,106980,279420,0,374627,0,250091,0,801676,125480,0,373968,0,0,576441,0,249297,124340,248917,0,0,124962,124745,124564,353859,0,746923,124490,250405,124491,124926,0,249682,0,124561,0,249367,0,249448,124414,124676,124235,0,124708,124059,249028,249368,0,124454,124691,458697,0,118838,249913,0,0,0,131610,373797,213353,374452,249901,0,249447,374091,124748,124512,328863,250310,249172,0,0,0,125150,258302,124718,124600,0,0,102806,374697,0,249003,0,124667,124617,190734,0,124284,498698,124378,0,0,0,373129,124508,125011,93917,0,0,249784,124299,0,125225,124488,374652,499434,124579,0,124564,0,124791,0,249105,0,0,248519,374302,124865,249588,451816,89926,125054,0,124521,0,101144,0,0,490053,0,124996,374469,0,124432,249962,15433,0,322760,0,124469,0,249881,0,124862,0,0,374276,0,249142,0,269954,0,0,0,0,248839,374202,0,123904,498794,124989,0,0,124180,124781,124390,124856,55939,0,124457,124901,124723,249082,249630,41487,0,0,0,124876,124759,0,497984,248617,249478,375204,295364,0,250029,124650,374575,373485,249585,124360,249998,124097,0,249510,0,124461,124886,249178,0,249757,0,48402,125349,249877,124019,0,124994,0,249608,124481,124611,249481,132938,249051,249671,151835,0,124803,498571,249738,124733,138052,248730,250129,125060,124158,0,0,0,125516,124644,0,124533,124929,248952,0,0,0,124321,0,374374,125355,248809,124933,249593,124774,249891,0,373629,209278,0,125135,0,0,0,125152,124329,124800,0,0,124851,0,124266,0,125294,372545,257292,0,375496,124495,109734,124975,248969,124473,373918,124483,125245,0,124247,0,497652,248730,0,0,248871,248467,353340,123708,125409,498756,498317,125059,248731,0,0,249589,124360,0,124468,244406,498829,373823,249433,123659,125046,0,124849,0,124980,124465,124846,0,0,374814,0,373546,124580,124974,0,373485,249170,91037,0,0,125309,124823,0,623616,124764,249251,248447,0,125017,0,372843,124915,410714,249133,0,124776,124347,123986,0,374042,0,372723,249827,124330,125035,0,250324,124692,0,0,0,124654,249328,249493,249259,124179,124729,373523,375153,498692,374157,249167,124766,124646,249189,0,0,0,249003,0,124184,124817,373865,249412,249423,249045,125020,124975,289102,114012,124710,125323,125477,0,0,447084,140246,248411,497990,0,250361,250178,124621,351860,249654,249562,0,372922,0,123901,373881,124727,124716,317461,124483,0,124787,249786,0,249448,380437,0,124379,12308,124626,301486,124437,0,364591,615140,0,0,124818,374510,248973,0,124090,0,374652,124483,124421,159616,249941,124819,0,124451,125103,249382,0,124793,124352,125002,124407,124680,194155,16477,498926,124922,249932,248496,0,124024,172553,124590,124589,143346,375333,248960,623806,0,0,250088,249564,124276,179868,125396,0,350762,125004,249571,124661,0,125289,249446,124656,167811,498641,0,373652,249093,285265,248696,0,124392,248907,0,125246,124809,123806,124252,0,249495,0,124668,249950,124064,0,124366,124796,124540,124892,0,125068,0,249794,125138,249534,124132,124355,0,124662,0,0,249640,249946,248951,375209,0,164913,124345,124873,242196,248922,0,126750,124284,249522,248834,249418,249588,124823,0,249088,346703,374641,125009,0,249182,124930,127475,177308,109748,124283,373740,124674,248344,0,0,375046,250145,0,124946,124607,0,124577,374877,0,123847,373713,125083,373791,124676,0,125281,0,0,125125,249060,124877,0,124845,124390,373367,249602,373917,0,101388,250469,125130,0,0,124755,124644,0,0,124511,0,125024,374929,124882,249541,124447,248865,124653,124371,259738,0,0,0,0,250023,0,124527,0,249462,0,0,124053,0,248911,498420,124625,124385,124990,373865,248566,124393,0,0,373522,124250,170122,124525,0,374004,125591,350050,124244,249057,0,46441,0,0,250268,0,249543,124720,0,0,248850,321107,0,124249,0,124767,125389,124397,124840,124433,150317,124624,124387,0,249318,374360,0,124524,0,124148,0,124776,0,125017,249463,0,124647,39942,373988,124675,249626,124196,0,124335,281782,0,500050,249331,0,0,0,124655,124419,125002,0,0,419249,124806,0,249655,373688,124365,0,248486,273673,0,124245,0,124967,124694,249177,124683,124521,439045,249352,123775,249082,428627,0,30945,0,373902,374768,0,249731,0,124599,124655,499300,0,0,125342,0,0,250398,125450,109834,0,0,124491,0,373768,232493,491931,249454,0,0,0,0,0,124396,124688,248944,0,372691,0,249500,124488,0,499244,124718,374680,373735,124601,124729,124907,124682,0,0,248529,246040,0,0,89442,0,248796,249143,249217,124941,374244,374095,125189,124103,248566,0,124983,250040,48434,125217,0,374284,124625,125008,345035,0,124887,202249,250105,250403,338244,0,249706,61685,0,124639,249966,249704,124515,0,124306,249784,0,250071,0,0,249252,249307,125007,221527,0,0,250085,249104,0,0,248955,124673,248464,248971,249326,373631,249956,0,124313,125438,266192,0,249264]}]},"null_count":0,"tot_col_size":3000058110,"last_update_version":401695339775262722},"l_shipinstruct":{"histogram":{"ndv":4,"buckets":[{"count":75301458,"lower_bound":"Q09MTEVDVCBDT0Q=","upper_bound":"Q09MTEVDVCBDT0Q=","repeats":75300000},{"count":149222890,"lower_bound":"REVMSVZFUiBJTiBQRVJTT04=","upper_bound":"REVMSVZFUiBJTiBQRVJTT04=","repeats":73920000},{"count":223564330,"lower_bound":"Tk9ORQ==","upper_bound":"Tk9ORQ==","repeats":74340000},{"count":300005811,"lower_bound":"VEFLRSBCQUNLIFJFVFVSTg==","upper_bound":"VEFLRSBCQUNLIFJFVFVSTg==","repeats":76440000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74996622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74999879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75002585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75006725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75006725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75002585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74999879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74996622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75006725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74999879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75002585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74996622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75002585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74999879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74996622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75006725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75002585,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75006725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74996622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74999879,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":4200039832,"last_update_version":401695339840798722},"l_shipmode":{"histogram":{"ndv":7,"buckets":[{"count":43230837,"lower_bound":"QUlS","upper_bound":"QUlS","repeats":43230000},{"count":87421693,"lower_bound":"Rk9C","upper_bound":"Rk9C","repeats":44190000},{"count":129092500,"lower_bound":"TUFJTA==","upper_bound":"TUFJTA==","repeats":41670000},{"count":172683344,"lower_bound":"UkFJTA==","upper_bound":"UkFJTA==","repeats":43590000},{"count":215524174,"lower_bound":"UkVHIEFJUg==","upper_bound":"UkVHIEFJUg==","repeats":42840000},{"count":258124999,"lower_bound":"U0hJUA==","upper_bound":"U0hJUA==","repeats":42600000},{"count":300005811,"lower_bound":"VFJVQ0s=","upper_bound":"VFJVQ0s=","repeats":41880000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42854769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42865157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42855561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42858939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42850817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42865157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42850817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42858939,0,0,0,0,0,0,0,0,42860498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42854769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42855561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42850817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42858939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42855561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42865157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42854769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42854769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42855561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42850817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42865157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42858939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42850817,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860498,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42858939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42854769,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42855561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42865157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,42860070,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":1885740662,"last_update_version":401695339840798724},"l_suppkey":{"histogram":{"ndv":490496,"buckets":[{"count":1200023,"lower_bound":"OTE=","upper_bound":"MTkwMg==","repeats":611},{"count":2400046,"lower_bound":"MTkwOQ==","upper_bound":"Mzc5MQ==","repeats":611},{"count":3600069,"lower_bound":"Mzc5OA==","upper_bound":"NTY1MA==","repeats":611},{"count":4800092,"lower_bound":"NTY1Ng==","upper_bound":"NzcyNA==","repeats":611},{"count":6000116,"lower_bound":"Nzc1NA==","upper_bound":"OTYwNg==","repeats":30611},{"count":7200139,"lower_bound":"OTY3NQ==","upper_bound":"MTE0NjA=","repeats":611},{"count":8400162,"lower_bound":"MTE1NDE=","upper_bound":"MTM3ODg=","repeats":611},{"count":9600185,"lower_bound":"MTM4NTE=","upper_bound":"MTU1NjI=","repeats":611},{"count":10800209,"lower_bound":"MTU2MTU=","upper_bound":"MTc3NzA=","repeats":611},{"count":12000232,"lower_bound":"MTc4MTI=","upper_bound":"MTkzNzk=","repeats":611},{"count":13200255,"lower_bound":"MTk0MDY=","upper_bound":"MjA4NTU=","repeats":30611},{"count":14400278,"lower_bound":"MjA4NzU=","upper_bound":"MjI5NTM=","repeats":611},{"count":15600302,"lower_bound":"MjI5OTk=","upper_bound":"MjUyMDg=","repeats":611},{"count":16800325,"lower_bound":"MjUyNTY=","upper_bound":"MjY3OTY=","repeats":611},{"count":18000348,"lower_bound":"MjY4NTI=","upper_bound":"Mjg4NTg=","repeats":611},{"count":19200371,"lower_bound":"Mjg5MzM=","upper_bound":"MzE0Njg=","repeats":611},{"count":20400395,"lower_bound":"MzE0Nzk=","upper_bound":"MzMxNTA=","repeats":611},{"count":21600418,"lower_bound":"MzMxNjE=","upper_bound":"MzU1OTI=","repeats":611},{"count":22800441,"lower_bound":"MzU1OTM=","upper_bound":"Mzc5OTA=","repeats":611},{"count":24000464,"lower_bound":"MzgwMzQ=","upper_bound":"Mzk0MjE=","repeats":611},{"count":25200488,"lower_bound":"Mzk0NzA=","upper_bound":"NDE0OTQ=","repeats":611},{"count":26400511,"lower_bound":"NDE1NDI=","upper_bound":"NDM5NTk=","repeats":611},{"count":27600534,"lower_bound":"NDM5Nzg=","upper_bound":"NDU5MjU=","repeats":611},{"count":28800557,"lower_bound":"NDU5NjI=","upper_bound":"NDgwNTg=","repeats":611},{"count":30000581,"lower_bound":"NDgxODg=","upper_bound":"NTAyNjM=","repeats":611},{"count":31200604,"lower_bound":"NTAzMjQ=","upper_bound":"NTIxNzE=","repeats":611},{"count":32400627,"lower_bound":"NTIyMzg=","upper_bound":"NTQwNDQ=","repeats":611},{"count":33600650,"lower_bound":"NTQwNTg=","upper_bound":"NTUzOTc=","repeats":611},{"count":34800674,"lower_bound":"NTU0MjQ=","upper_bound":"NTc2NDk=","repeats":611},{"count":36000697,"lower_bound":"NTc2ODA=","upper_bound":"NTk4Mjg=","repeats":611},{"count":37200720,"lower_bound":"NTk4NzM=","upper_bound":"NjE3NjY=","repeats":611},{"count":38400743,"lower_bound":"NjE3Nzc=","upper_bound":"NjMxNTk=","repeats":611},{"count":39600767,"lower_bound":"NjMzODk=","upper_bound":"NjU0Njg=","repeats":611},{"count":40800790,"lower_bound":"NjU0ODA=","upper_bound":"NjgyMDU=","repeats":611},{"count":42000813,"lower_bound":"NjgyNTQ=","upper_bound":"NzA0NTU=","repeats":611},{"count":43200836,"lower_bound":"NzA0NjA=","upper_bound":"NzIwNzM=","repeats":611},{"count":44400860,"lower_bound":"NzIwOTg=","upper_bound":"NzM4MzM=","repeats":611},{"count":45600883,"lower_bound":"NzM4MzY=","upper_bound":"NzYwNzU=","repeats":611},{"count":46800906,"lower_bound":"NzYxMDY=","upper_bound":"Nzc5ODc=","repeats":611},{"count":48000929,"lower_bound":"NzgxMDg=","upper_bound":"Nzk4MzY=","repeats":611},{"count":49200953,"lower_bound":"Nzk4NDM=","upper_bound":"ODIwMzU=","repeats":611},{"count":50400976,"lower_bound":"ODIwNzI=","upper_bound":"ODM5NzM=","repeats":611},{"count":51600999,"lower_bound":"ODQwMTY=","upper_bound":"ODU4MzQ=","repeats":611},{"count":52801022,"lower_bound":"ODU4NDk=","upper_bound":"ODg0Mzg=","repeats":611},{"count":54001045,"lower_bound":"ODg0NzY=","upper_bound":"OTA0NTM=","repeats":611},{"count":55201069,"lower_bound":"OTA0NjE=","upper_bound":"OTI1MTI=","repeats":611},{"count":56401092,"lower_bound":"OTI2NTM=","upper_bound":"OTQ2NTU=","repeats":611},{"count":57601115,"lower_bound":"OTQ3NDQ=","upper_bound":"OTY4OTk=","repeats":611},{"count":58801138,"lower_bound":"OTY5OTg=","upper_bound":"OTkwMjI=","repeats":611},{"count":60001162,"lower_bound":"OTkwNDg=","upper_bound":"MTAwODY2","repeats":611},{"count":61201185,"lower_bound":"MTAwODg3","upper_bound":"MTAyNjUy","repeats":611},{"count":62401208,"lower_bound":"MTAyNjgw","upper_bound":"MTA0NzAz","repeats":611},{"count":63601231,"lower_bound":"MTA0Nzk2","upper_bound":"MTA3MTg0","repeats":611},{"count":64801255,"lower_bound":"MTA3MjAy","upper_bound":"MTA5MjI5","repeats":611},{"count":66001278,"lower_bound":"MTA5MjMx","upper_bound":"MTEwNTg3","repeats":611},{"count":67201301,"lower_bound":"MTEwNTk3","upper_bound":"MTEyNDUw","repeats":611},{"count":68401324,"lower_bound":"MTEyNDgz","upper_bound":"MTEzODAx","repeats":611},{"count":69601348,"lower_bound":"MTEzODEw","upper_bound":"MTE2Nzg3","repeats":611},{"count":70801371,"lower_bound":"MTE2ODYz","upper_bound":"MTE4NjQ0","repeats":611},{"count":72001394,"lower_bound":"MTE4Njcy","upper_bound":"MTIwOTYy","repeats":611},{"count":73201417,"lower_bound":"MTIwOTc2","upper_bound":"MTIzMTk2","repeats":611},{"count":74401441,"lower_bound":"MTIzMjM3","upper_bound":"MTI1Mjk2","repeats":611},{"count":75601464,"lower_bound":"MTI1MzQ5","upper_bound":"MTI3MzUz","repeats":611},{"count":76801487,"lower_bound":"MTI3MzU3","upper_bound":"MTI5MTc0","repeats":611},{"count":78001510,"lower_bound":"MTI5MTg2","upper_bound":"MTMwNjM4","repeats":611},{"count":79201534,"lower_bound":"MTMwNjQw","upper_bound":"MTMzMDQ2","repeats":611},{"count":80401557,"lower_bound":"MTMzMDky","upper_bound":"MTM0OTQw","repeats":611},{"count":81601580,"lower_bound":"MTM1MDE1","upper_bound":"MTM2OTE2","repeats":611},{"count":82801603,"lower_bound":"MTM2OTY1","upper_bound":"MTM4OTkx","repeats":611},{"count":84001627,"lower_bound":"MTM4OTk0","upper_bound":"MTQxMTAz","repeats":611},{"count":85201650,"lower_bound":"MTQxMTQ5","upper_bound":"MTQyOTA0","repeats":611},{"count":86401673,"lower_bound":"MTQyOTM1","upper_bound":"MTQ0NzQ5","repeats":611},{"count":87601696,"lower_bound":"MTQ0NzUy","upper_bound":"MTQ2NTI3","repeats":611},{"count":88801720,"lower_bound":"MTQ2NTU2","upper_bound":"MTQ4NDMx","repeats":611},{"count":90001743,"lower_bound":"MTQ4NDU2","upper_bound":"MTQ5ODU4","repeats":611},{"count":91201766,"lower_bound":"MTUwMDIz","upper_bound":"MTUyNDMw","repeats":611},{"count":92401789,"lower_bound":"MTUyNDY3","upper_bound":"MTU0MDA5","repeats":611},{"count":93601813,"lower_bound":"MTU0MDIz","upper_bound":"MTU2MzY4","repeats":611},{"count":94801836,"lower_bound":"MTU2Mzgx","upper_bound":"MTU4MTI0","repeats":611},{"count":96001859,"lower_bound":"MTU4MTY3","upper_bound":"MTU5NjQz","repeats":30611},{"count":97201882,"lower_bound":"MTU5NjYz","upper_bound":"MTYxMjM3","repeats":611},{"count":98401906,"lower_bound":"MTYxMzA4","upper_bound":"MTYzMzUz","repeats":611},{"count":99601929,"lower_bound":"MTYzMzkx","upper_bound":"MTY0ODM0","repeats":611},{"count":100801952,"lower_bound":"MTY0ODU3","upper_bound":"MTY3MTEy","repeats":611},{"count":102001975,"lower_bound":"MTY3MTU2","upper_bound":"MTY5MzQy","repeats":611},{"count":103201998,"lower_bound":"MTY5Mzcw","upper_bound":"MTcxMDEx","repeats":611},{"count":104402022,"lower_bound":"MTcxMDE5","upper_bound":"MTczMDIz","repeats":611},{"count":105602045,"lower_bound":"MTczMTA1","upper_bound":"MTc1Mzk1","repeats":611},{"count":106802068,"lower_bound":"MTc1NDMw","upper_bound":"MTc3NzMy","repeats":611},{"count":108002091,"lower_bound":"MTc3Nzg2","upper_bound":"MTc5NjM1","repeats":611},{"count":109202115,"lower_bound":"MTc5Njkw","upper_bound":"MTgxODE4","repeats":611},{"count":110402138,"lower_bound":"MTgxODIw","upper_bound":"MTgzNTc4","repeats":611},{"count":111602161,"lower_bound":"MTgzNjM5","upper_bound":"MTg1NDgw","repeats":611},{"count":112802184,"lower_bound":"MTg1NTcw","upper_bound":"MTg3NDk0","repeats":611},{"count":114002208,"lower_bound":"MTg3NTE2","upper_bound":"MTg5Mzkx","repeats":611},{"count":115202231,"lower_bound":"MTg5NDU2","upper_bound":"MTkwNzg4","repeats":611},{"count":116402254,"lower_bound":"MTkwNzky","upper_bound":"MTkyNzE1","repeats":611},{"count":117602277,"lower_bound":"MTkyNzYx","upper_bound":"MTk0ODEx","repeats":611},{"count":118802301,"lower_bound":"MTk0OTMz","upper_bound":"MTk2OTQz","repeats":611},{"count":120002324,"lower_bound":"MTk3MDgz","upper_bound":"MTk5MzQw","repeats":611},{"count":121202347,"lower_bound":"MTk5Mzc0","upper_bound":"MjAxNTQ3","repeats":611},{"count":122402370,"lower_bound":"MjAxNTk0","upper_bound":"MjAzNDQ3","repeats":611},{"count":123602394,"lower_bound":"MjAzNTQ0","upper_bound":"MjA1NjYy","repeats":611},{"count":124802417,"lower_bound":"MjA1ODQy","upper_bound":"MjA3NTU1","repeats":611},{"count":126002440,"lower_bound":"MjA3NTgz","upper_bound":"MjA5NzUy","repeats":611},{"count":127202463,"lower_bound":"MjA5NzY1","upper_bound":"MjEyNDQ2","repeats":611},{"count":128402487,"lower_bound":"MjEyNDcx","upper_bound":"MjE0ODQy","repeats":611},{"count":129602510,"lower_bound":"MjE0ODYw","upper_bound":"MjE2NDg1","repeats":611},{"count":130802533,"lower_bound":"MjE2NDky","upper_bound":"MjE4MDkx","repeats":611},{"count":132002556,"lower_bound":"MjE4MDk0","upper_bound":"MjIwNDU5","repeats":611},{"count":133202580,"lower_bound":"MjIwNDY4","upper_bound":"MjIyODUx","repeats":611},{"count":134402603,"lower_bound":"MjIyODkw","upper_bound":"MjI1NzYx","repeats":611},{"count":135602626,"lower_bound":"MjI1NzY4","upper_bound":"MjI3NzU0","repeats":611},{"count":136802649,"lower_bound":"MjI3ODc0","upper_bound":"MjI5ODIz","repeats":611},{"count":138002673,"lower_bound":"MjI5OTAz","upper_bound":"MjMxNTQ1","repeats":611},{"count":139202696,"lower_bound":"MjMxNjAz","upper_bound":"MjMyNzU0","repeats":611},{"count":140402719,"lower_bound":"MjMyNzg5","upper_bound":"MjM0NjYx","repeats":611},{"count":141602742,"lower_bound":"MjM0Njcw","upper_bound":"MjM2MTg3","repeats":611},{"count":142802766,"lower_bound":"MjM2Mjcy","upper_bound":"MjM4MTU2","repeats":611},{"count":144002789,"lower_bound":"MjM4MTgz","upper_bound":"MjQwMTQz","repeats":611},{"count":145202812,"lower_bound":"MjQwMTc3","upper_bound":"MjQxOTM5","repeats":611},{"count":146402835,"lower_bound":"MjQxOTc5","upper_bound":"MjQ0MDY5","repeats":611},{"count":147602859,"lower_bound":"MjQ0MDcw","upper_bound":"MjQ2MDEz","repeats":611},{"count":148802882,"lower_bound":"MjQ2MDQy","upper_bound":"MjQ3NzUx","repeats":611},{"count":150002905,"lower_bound":"MjQ3ODE5","upper_bound":"MjUwMTU5","repeats":611},{"count":151202928,"lower_bound":"MjUwMjMw","upper_bound":"MjUyMTg5","repeats":611},{"count":152402951,"lower_bound":"MjUyMjEx","upper_bound":"MjU0NzI4","repeats":611},{"count":153602975,"lower_bound":"MjU0ODc2","upper_bound":"MjU2NDQw","repeats":611},{"count":154802998,"lower_bound":"MjU2NDUw","upper_bound":"MjU4MzEz","repeats":611},{"count":156003021,"lower_bound":"MjU4MzM1","upper_bound":"MjU5OTA2","repeats":611},{"count":157203044,"lower_bound":"MjU5OTIy","upper_bound":"MjYxNjg0","repeats":611},{"count":158403068,"lower_bound":"MjYxNzAx","upper_bound":"MjYzOTMy","repeats":611},{"count":159603091,"lower_bound":"MjYzOTQ0","upper_bound":"MjY2Mzk4","repeats":611},{"count":160803114,"lower_bound":"MjY2NDM3","upper_bound":"MjY4Mjcy","repeats":611},{"count":162003137,"lower_bound":"MjY4MzIw","upper_bound":"MjY5OTgw","repeats":611},{"count":163203161,"lower_bound":"MjcwMTA1","upper_bound":"MjcxNzc3","repeats":611},{"count":164403184,"lower_bound":"MjcxNzc5","upper_bound":"Mjc0MDYz","repeats":611},{"count":165603207,"lower_bound":"Mjc0MDgw","upper_bound":"Mjc1OTYy","repeats":611},{"count":166803230,"lower_bound":"Mjc1OTc0","upper_bound":"Mjc3Njg4","repeats":611},{"count":168003254,"lower_bound":"Mjc3NzEx","upper_bound":"Mjc5NTg4","repeats":611},{"count":169203277,"lower_bound":"Mjc5NjQ0","upper_bound":"MjgxNzkw","repeats":611},{"count":170403300,"lower_bound":"MjgxODA0","upper_bound":"MjgzNjUz","repeats":611},{"count":171603323,"lower_bound":"MjgzNjc2","upper_bound":"Mjg1MjY3","repeats":611},{"count":172803347,"lower_bound":"Mjg1MzQ4","upper_bound":"Mjg3MjUz","repeats":611},{"count":174003370,"lower_bound":"Mjg3MzA0","upper_bound":"Mjg5MTM0","repeats":611},{"count":175203393,"lower_bound":"Mjg5MTQ0","upper_bound":"MjkxMDk4","repeats":611},{"count":176403416,"lower_bound":"MjkxMTE3","upper_bound":"MjkzNDgw","repeats":611},{"count":177603440,"lower_bound":"MjkzNTMz","upper_bound":"Mjk1Mzcx","repeats":611},{"count":178803463,"lower_bound":"Mjk1Mzkz","upper_bound":"Mjk2NjU1","repeats":611},{"count":180003486,"lower_bound":"Mjk2NzIx","upper_bound":"Mjk4NzMy","repeats":611},{"count":181203509,"lower_bound":"Mjk4NzM2","upper_bound":"MzAwMzE2","repeats":611},{"count":182403533,"lower_bound":"MzAwMzI0","upper_bound":"MzAyMDYx","repeats":611},{"count":183603556,"lower_bound":"MzAyMDk1","upper_bound":"MzAzODg5","repeats":611},{"count":184803579,"lower_bound":"MzAzOTYz","upper_bound":"MzA1NTEx","repeats":611},{"count":186003602,"lower_bound":"MzA1NTU3","upper_bound":"MzA3MTkz","repeats":611},{"count":187203626,"lower_bound":"MzA3MjEx","upper_bound":"MzA5NDI2","repeats":611},{"count":188403649,"lower_bound":"MzA5NDMx","upper_bound":"MzExNTIz","repeats":611},{"count":189603672,"lower_bound":"MzExNTQx","upper_bound":"MzEzMjQ1","repeats":611},{"count":190803695,"lower_bound":"MzEzMjk2","upper_bound":"MzE1Njcy","repeats":611},{"count":192003719,"lower_bound":"MzE1NzM4","upper_bound":"MzE3NjQ2","repeats":611},{"count":193203742,"lower_bound":"MzE3NzE1","upper_bound":"MzIwMDYx","repeats":611},{"count":194403765,"lower_bound":"MzIwMTU5","upper_bound":"MzIxOTky","repeats":611},{"count":195603788,"lower_bound":"MzIyMDM3","upper_bound":"MzIzODUy","repeats":611},{"count":196803812,"lower_bound":"MzIzODYy","upper_bound":"MzI2MTQ3","repeats":611},{"count":198003835,"lower_bound":"MzI2MjM1","upper_bound":"MzI4NDA5","repeats":611},{"count":199203858,"lower_bound":"MzI4NDUy","upper_bound":"MzMxMTA0","repeats":611},{"count":200403881,"lower_bound":"MzMxMTE0","upper_bound":"MzMyNzU4","repeats":611},{"count":201603904,"lower_bound":"MzMyNzgx","upper_bound":"MzM0NTY2","repeats":611},{"count":202803928,"lower_bound":"MzM0NTg1","upper_bound":"MzM2NTU4","repeats":611},{"count":204003951,"lower_bound":"MzM2NjUz","upper_bound":"MzM4MzY0","repeats":611},{"count":205203974,"lower_bound":"MzM4NDg4","upper_bound":"MzQwNTUx","repeats":611},{"count":206403997,"lower_bound":"MzQwNjA5","upper_bound":"MzQyMDk2","repeats":611},{"count":207604021,"lower_bound":"MzQyMTIw","upper_bound":"MzQ0MzM2","repeats":611},{"count":208804044,"lower_bound":"MzQ0MzQz","upper_bound":"MzQ2MzA5","repeats":611},{"count":210004067,"lower_bound":"MzQ2MzQw","upper_bound":"MzQ4NjEx","repeats":611},{"count":211204090,"lower_bound":"MzQ4NzU3","upper_bound":"MzUwOTc2","repeats":611},{"count":212404114,"lower_bound":"MzUwOTk1","upper_bound":"MzUzMjQy","repeats":611},{"count":213604137,"lower_bound":"MzUzMjY1","upper_bound":"MzU0Njc4","repeats":611},{"count":214804160,"lower_bound":"MzU0Njg4","upper_bound":"MzU3MTQx","repeats":611},{"count":216004183,"lower_bound":"MzU3MjE1","upper_bound":"MzU5MDg2","repeats":611},{"count":217204207,"lower_bound":"MzU5MTYw","upper_bound":"MzYyMDc2","repeats":611},{"count":218404230,"lower_bound":"MzYyMTA4","upper_bound":"MzY0MTQy","repeats":611},{"count":219604253,"lower_bound":"MzY0MTc2","upper_bound":"MzY2MTIw","repeats":611},{"count":220804276,"lower_bound":"MzY2MTU0","upper_bound":"MzY3OTgw","repeats":611},{"count":222004300,"lower_bound":"MzY3OTky","upper_bound":"MzcwMTA3","repeats":611},{"count":223204323,"lower_bound":"MzcwMTIy","upper_bound":"MzcyMjk2","repeats":611},{"count":224404346,"lower_bound":"MzcyMzIx","upper_bound":"MzczOTk0","repeats":611},{"count":225604369,"lower_bound":"Mzc0MDEy","upper_bound":"Mzc1OTA3","repeats":611},{"count":226804393,"lower_bound":"Mzc1OTEx","upper_bound":"Mzc4MDMx","repeats":611},{"count":228004416,"lower_bound":"Mzc4MTA1","upper_bound":"Mzc5NTMz","repeats":611},{"count":229204439,"lower_bound":"Mzc5NjA3","upper_bound":"MzgxMzUz","repeats":611},{"count":230404462,"lower_bound":"MzgxMzYx","upper_bound":"MzgzNDQ4","repeats":611},{"count":231604486,"lower_bound":"MzgzNTM1","upper_bound":"Mzg2MDAy","repeats":611},{"count":232804509,"lower_bound":"Mzg2MDky","upper_bound":"Mzg3OTI4","repeats":611},{"count":234004532,"lower_bound":"Mzg3OTUw","upper_bound":"MzkwMTI3","repeats":611},{"count":235204555,"lower_bound":"MzkwMTMx","upper_bound":"MzkyMTk5","repeats":611},{"count":236404579,"lower_bound":"MzkyMjk0","upper_bound":"Mzk0NjQ5","repeats":611},{"count":237604602,"lower_bound":"Mzk0NzQw","upper_bound":"Mzk2NDAw","repeats":611},{"count":238804625,"lower_bound":"Mzk2NTIy","upper_bound":"Mzk4NDUw","repeats":611},{"count":240004648,"lower_bound":"Mzk4NDg2","upper_bound":"NDAwMTk5","repeats":611},{"count":241204672,"lower_bound":"NDAwMjA2","upper_bound":"NDAxODQz","repeats":611},{"count":242404695,"lower_bound":"NDAxODcw","upper_bound":"NDA0NzUz","repeats":611},{"count":243604718,"lower_bound":"NDA0NzY3","upper_bound":"NDA2Njk4","repeats":611},{"count":244804741,"lower_bound":"NDA2NzA4","upper_bound":"NDA4NTI3","repeats":611},{"count":246004765,"lower_bound":"NDA4NTMw","upper_bound":"NDEwNjU1","repeats":611},{"count":247204788,"lower_bound":"NDEwNjY2","upper_bound":"NDEyMjM0","repeats":611},{"count":248404811,"lower_bound":"NDEyMjgz","upper_bound":"NDE0NzMx","repeats":611},{"count":249604834,"lower_bound":"NDE0NzY2","upper_bound":"NDE3MDA2","repeats":611},{"count":250804857,"lower_bound":"NDE3MDMx","upper_bound":"NDE4OTc3","repeats":611},{"count":252004881,"lower_bound":"NDE4OTg4","upper_bound":"NDIwODA0","repeats":611},{"count":253204904,"lower_bound":"NDIwODA5","upper_bound":"NDIyMzQ1","repeats":611},{"count":254404927,"lower_bound":"NDIyMzQ2","upper_bound":"NDI0MzYy","repeats":611},{"count":255604950,"lower_bound":"NDI0Mzcz","upper_bound":"NDI2NTcy","repeats":30611},{"count":256804974,"lower_bound":"NDI2NjA0","upper_bound":"NDI3ODk3","repeats":611},{"count":258004997,"lower_bound":"NDI3OTA0","upper_bound":"NDI5NDYx","repeats":611},{"count":259205020,"lower_bound":"NDI5NDcz","upper_bound":"NDMxMzQz","repeats":611},{"count":260405043,"lower_bound":"NDMxNDk3","upper_bound":"NDMzMTAw","repeats":611},{"count":261605067,"lower_bound":"NDMzMTQw","upper_bound":"NDM0OTk3","repeats":611},{"count":262805090,"lower_bound":"NDM1MDU0","upper_bound":"NDM2ODk0","repeats":611},{"count":264005113,"lower_bound":"NDM3MDY4","upper_bound":"NDM4OTI0","repeats":611},{"count":265205136,"lower_bound":"NDM4OTI4","upper_bound":"NDQwNjk0","repeats":611},{"count":266405160,"lower_bound":"NDQwODIx","upper_bound":"NDQyNjc1","repeats":611},{"count":267605183,"lower_bound":"NDQyNzU3","upper_bound":"NDQ0OTQ3","repeats":611},{"count":268805206,"lower_bound":"NDQ1MDg2","upper_bound":"NDQ3MDEy","repeats":611},{"count":270005229,"lower_bound":"NDQ3MDc1","upper_bound":"NDQ5MDg4","repeats":611},{"count":271205253,"lower_bound":"NDQ5MDkz","upper_bound":"NDUxMjA5","repeats":611},{"count":272405276,"lower_bound":"NDUxMjUx","upper_bound":"NDUzMDIw","repeats":611},{"count":273605299,"lower_bound":"NDUzMTM1","upper_bound":"NDU1NjU4","repeats":611},{"count":274805322,"lower_bound":"NDU1NzA4","upper_bound":"NDU3MzMw","repeats":611},{"count":276005346,"lower_bound":"NDU3Mzk5","upper_bound":"NDU5MTM4","repeats":611},{"count":277205369,"lower_bound":"NDU5MTQ1","upper_bound":"NDYxNzU2","repeats":611},{"count":278405392,"lower_bound":"NDYxNzcy","upper_bound":"NDY0MDI0","repeats":611},{"count":279605415,"lower_bound":"NDY0MTE0","upper_bound":"NDY2MzAz","repeats":611},{"count":280805439,"lower_bound":"NDY2MzA1","upper_bound":"NDY4MDkx","repeats":611},{"count":282005462,"lower_bound":"NDY4MTUx","upper_bound":"NDcwMzQ3","repeats":611},{"count":283205485,"lower_bound":"NDcwMzc3","upper_bound":"NDcyMTkw","repeats":611},{"count":284405508,"lower_bound":"NDcyMjcw","upper_bound":"NDc0MjQx","repeats":611},{"count":285605532,"lower_bound":"NDc0MzE5","upper_bound":"NDc2MTAw","repeats":611},{"count":286805555,"lower_bound":"NDc2MTcx","upper_bound":"NDc4MzY5","repeats":611},{"count":288005578,"lower_bound":"NDc4Mzkw","upper_bound":"NDgwNjgz","repeats":611},{"count":289205601,"lower_bound":"NDgwNjg4","upper_bound":"NDgyMzc2","repeats":611},{"count":290405625,"lower_bound":"NDgyMzk1","upper_bound":"NDg0NDI1","repeats":611},{"count":291605648,"lower_bound":"NDg0NDQ1","upper_bound":"NDg2NjUx","repeats":611},{"count":292805671,"lower_bound":"NDg2NjYy","upper_bound":"NDg4NzU5","repeats":611},{"count":294005694,"lower_bound":"NDg4Nzcy","upper_bound":"NDkwOTQ3","repeats":611},{"count":295205718,"lower_bound":"NDkxMDA2","upper_bound":"NDkzMDU4","repeats":611},{"count":296405741,"lower_bound":"NDkzMDc0","upper_bound":"NDk1MTU3","repeats":611},{"count":297605764,"lower_bound":"NDk1MTg4","upper_bound":"NDk2NjM5","repeats":611},{"count":298805787,"lower_bound":"NDk2NjUw","upper_bound":"NDk4MTY4","repeats":611},{"count":300005811,"lower_bound":"NDk4Mjg0","upper_bound":"NDk5OTQ3","repeats":611}]},"cm_sketch":{"rows":[{"counters":[144110,140527,148232,128140,146621,142341,149636,153822,140435,150488,137863,143895,137794,155581,143526,161555,150686,136445,150571,143274,147446,158376,152416,149287,160601,134510,154691,140944,158637,161230,136833,163907,130672,130959,143360,152023,137491,154409,128919,163306,144694,145117,153466,146138,136623,144962,152750,149641,126323,139805,139385,135096,140335,158322,138313,139220,155894,146991,140629,155732,135783,141727,146917,140543,143711,145186,136301,139872,142247,159276,144954,145019,141337,139324,150865,170460,142945,146033,137025,152091,136647,131844,149938,142626,154992,152411,139749,152783,117923,135918,135584,153691,159727,151456,138941,139583,160718,152989,152494,155734,140962,156054,159288,143884,144333,131406,154724,148986,152143,146983,133574,144399,163119,144536,160525,155224,147774,130106,155463,147020,156584,142942,153662,155086,123039,140043,146498,139411,150636,172581,156253,149358,147064,170726,153585,135236,152151,143497,138925,129956,143902,138802,136725,147619,158950,132794,140031,148303,143335,147381,145417,144802,143606,151581,139184,144707,145572,155502,146589,138476,147881,149879,138154,149541,156412,148207,160638,142196,153258,146366,131901,141182,140758,138883,172253,152693,156595,150705,155842,144209,156267,146022,156360,134824,148485,149327,137342,156184,152682,141190,156426,156621,146534,158019,139901,168013,139071,142229,146575,152665,153872,150371,137302,154581,147843,148284,138756,135479,151896,142842,139431,153747,155460,153461,128972,137208,132803,150750,144784,165292,143034,127935,144113,136987,128410,152369,144773,162521,141187,166642,148555,137387,145644,153308,139158,147802,159790,130683,126750,145160,146491,141742,151576,136965,145721,157229,142684,138704,131902,148090,163863,145418,155654,135294,157196,158317,167794,152626,143284,137525,153989,139539,130785,143693,166887,154697,160237,147868,153263,157438,160127,149545,134219,136849,162028,149707,140739,159493,133748,145779,155830,151011,139484,161024,139937,155606,148338,148746,147694,143268,155490,144740,130742,152322,149558,141339,139716,137397,138192,142356,147405,130369,139958,148852,151141,155514,142171,145815,154050,151825,152267,136750,135483,156185,150183,146073,144073,148639,149876,144301,151277,148525,143777,165983,138947,143387,147720,146506,150312,138522,139592,141553,141180,158883,151373,145263,150619,161451,143320,160760,163067,162272,144854,144180,137462,143284,137141,149701,154159,132426,158203,142885,145818,136840,142951,137737,148360,155067,155447,150548,125899,141314,144559,142041,139194,153103,157259,153254,142790,140575,142259,154621,142228,130604,147339,146593,154909,158266,148241,153675,146492,135888,154487,127141,135056,138980,147633,149800,142121,159346,135022,137026,144639,159291,131001,155035,146478,146237,129733,148638,136768,140636,143186,143410,137345,151217,153421,136232,143894,124439,141978,151079,136698,148481,151294,147631,153784,134486,151121,186024,156843,149398,144956,138881,135823,145644,135315,137651,153361,141885,148430,144049,141541,148310,161616,136324,154128,151149,142214,162849,146969,135268,140323,137306,128845,166736,146811,147742,136749,167494,142209,136021,155600,157062,138213,145529,157846,150028,150307,149472,134489,156712,142519,139786,134762,144079,152686,149921,150974,142174,147860,165037,151729,157422,140370,148922,160138,130944,147129,143603,142508,135546,166006,159502,140421,153408,146669,147512,132672,149877,133534,150749,142865,164848,146452,148108,150605,143313,147627,142846,162749,136452,148606,153117,143787,144308,147983,151978,142856,149959,139172,142450,154879,132698,133353,137114,144560,135923,157919,133215,149712,142833,135276,140086,154893,164602,132933,152906,148554,148336,143978,125161,165598,146575,141017,130876,140566,138677,141977,150998,152416,140301,144497,140644,136187,148054,129324,137537,155471,160627,141693,145210,136217,140575,153946,151823,152775,138257,150052,153768,135715,128173,132354,139942,156159,145068,152172,130269,149211,141895,139101,148940,138603,143890,133454,149574,120020,151579,137160,124140,142986,146046,135402,159519,149816,142909,152238,149953,146269,151807,130397,125219,163457,157386,155873,152790,144038,131413,149766,126660,143258,148379,138103,155791,163098,162712,152434,141258,133078,158720,151299,159608,156113,141602,132552,137346,152407,144211,152376,147053,138609,132441,148723,166744,137618,153255,131700,151815,143288,135044,130467,141351,144445,142235,142260,144966,151902,158905,149098,155762,138053,130641,139247,117742,121602,140133,137047,153937,147472,157405,134738,155421,146624,162300,146984,149833,143679,143522,135288,155005,152142,145878,128635,147873,157210,152642,175553,156673,164726,123878,134933,143733,152411,134310,145973,137283,162115,163223,158577,147036,136016,145415,142385,147634,152412,155079,130887,147344,151422,152020,128109,148960,167129,140447,145012,147297,135173,130033,152827,143907,133105,147005,147383,158155,137184,142067,147520,152961,138745,143234,150742,154390,160351,147877,149699,150961,154802,153669,151635,154762,152055,149728,145098,141318,144322,158408,143195,158456,123389,147887,146348,136059,145667,152556,150265,145819,143849,135056,151078,139748,149115,145092,141776,145589,146811,143420,144266,134712,151714,149556,129569,158267,139241,133207,158475,140004,139091,140633,135030,140508,153078,133252,125784,138979,134199,161107,135528,153152,137545,146055,130853,139587,150080,148609,142632,151791,154427,138293,118372,139506,149748,133960,145894,158321,149666,160524,148100,152019,151792,156451,135132,157061,160786,147545,137897,140598,138445,149635,142737,139019,150420,148587,147032,156932,128549,145401,156744,155756,139986,138401,146956,172507,159615,144250,146407,145158,145801,144125,138277,144467,127180,135906,158312,147186,149331,154776,145091,130026,133093,143721,143036,153628,146914,144451,152151,141188,151028,149215,140354,142721,134167,156003,151912,150167,136211,141538,141570,148054,149478,133891,166361,146532,160132,147970,142194,151884,158565,137779,160546,148410,145676,157408,147229,142413,159477,141115,141128,144239,131358,139409,141183,135220,160265,142911,151341,152888,145715,142387,134662,164167,137136,136853,148158,137829,136920,135254,130648,145672,117290,143879,135956,152358,158420,155178,129684,145824,146253,141976,162417,148632,146491,140801,132347,151798,149079,139796,157870,142159,138227,144949,151733,151914,141968,143110,138338,150285,148386,165682,146354,159044,139988,137990,135790,150409,149595,146987,159816,144087,157923,148865,135577,140647,145109,142209,135402,159726,143786,138229,138691,146388,139732,143169,143699,161034,138547,146535,137480,146071,147374,153551,154375,161685,138547,144274,133291,163728,138325,145574,140327,133140,148380,146740,146639,157183,160676,147541,163341,149617,147087,157804,159908,143671,156527,125131,137130,138183,130764,141001,149833,137781,144856,138571,142856,152378,145625,141910,133255,155161,142666,140085,128622,137184,140562,161743,137815,169884,146071,157620,163698,139016,145162,138335,137660,144615,153134,157015,151717,128786,143006,128483,153239,137790,148609,155311,145113,154100,138975,130488,162043,132317,140842,155963,149903,147316,137699,150807,136752,141068,152639,145928,149822,129976,141327,160965,147929,148314,160879,142351,140595,153894,146181,134763,152765,148636,163062,145374,143365,166738,153186,147621,146515,158117,145647,137375,148263,165506,129897,147263,151763,135903,156600,143891,147942,139783,151250,144493,150569,176292,142811,157741,154004,153256,125520,140705,162997,141144,158902,159741,150484,147387,131007,151485,156470,140842,152438,141292,151867,131530,153367,141010,138089,150704,162074,160738,121729,134158,146217,143516,140072,131269,149130,155518,148786,144347,158674,144977,136305,159477,146068,137279,128593,137489,147683,138671,133628,143309,137490,150685,145478,154088,151508,144771,149608,146276,138327,156905,139478,148629,145523,141624,159243,145568,175694,137099,133317,145238,143594,143275,140777,139998,162671,136650,145653,148951,140182,144953,135052,131124,144924,153926,137682,138054,140830,134102,153031,151919,149038,139724,137365,147427,155668,155939,153545,156478,145278,148217,160169,156635,146190,143416,135697,149708,151688,137087,152111,140865,161669,140287,155049,153944,142542,145157,155165,146128,148070,155068,133411,158814,149794,147180,134113,143090,144507,164121,159382,131673,142319,140276,143695,134041,126616,149931,152536,144932,143299,148783,136505,136735,152295,150739,155508,143906,149561,141865,141672,153521,136558,154635,130816,154546,157234,133359,146358,150555,153170,143458,154274,143221,147704,164966,145561,153130,147360,154931,137974,143757,146263,159720,131695,147757,132310,160991,147181,161578,146948,138410,151719,156493,146722,132984,124553,162438,151448,150566,144213,150353,161152,157490,141425,167837,135540,143859,149625,142122,156036,149355,151366,134947,149587,152973,133541,146498,169460,151563,149248,135344,147377,134213,135998,145615,139145,127378,138033,152111,149857,129893,134170,157049,135685,145701,164963,144630,149164,150733,143498,145670,132929,133309,158375,142752,150417,145006,127427,145114,157809,140687,139804,143101,143929,131983,143279,153025,134256,148772,143959,150286,148841,137141,133168,143214,120628,127600,161653,128359,177266,145396,145158,138668,148616,139615,150057,147443,157939,143670,141821,158559,137532,130869,138458,161939,143337,136162,145651,146059,132344,149487,143996,148562,143875,140068,162294,139473,138740,148021,138371,157563,142634,153880,166524,157510,144227,144914,152672,143222,140634,172605,159532,162259,147617,149759,152459,145903,134914,156937,141957,143674,132507,137162,142927,152253,148647,142060,138680,128711,135801,146113,147441,155258,152016,137769,157062,151813,153321,136369,141226,140456,144893,135303,158423,142762,153668,153886,145097,142156,154616,147835,145338,142774,147220,141542,148435,133427,152841,156039,152012,152065,139123,146201,167814,154182,137189,138546,147619,148069,156287,149015,154056,144241,148507,154304,143731,156944,151034,141932,141128,148194,136640,148147,132061,169214,151754,154807,156056,146410,158937,150052,140129,143709,169584,157416,152257,148857,140098,154972,147724,150610,153963,143062,147820,152168,139894,145405,151299,140998,160559,147401,145905,150417,142879,146693,141773,138685,132632,151221,166518,136814,136279,161705,137517,139188,159814,141688,135103,162521,156431,151859,155126,151967,142441,133817,145964,148661,134866,141119,134913,153952,156929,158776,141371,135525,131621,154253,140966,153566,150508,156257,132247,148356,153235,152351,155068,147955,149493,120907,126562,155026,165068,147845,153591,146218,138431,151889,145553,139904,157422,141558,156388,150886,153092,159014,158869,141281,165131,131955,148837,143490,157615,148085,136355,138570,143837,144818,133196,149660,159626,150362,133982,147461,159808,153826,157758,148174,132761,153128,166554,153902,138838,131246,136143,137970,142876,156011,152188,146148,146979,141739,127868,135486,159266,154756,156196,136173,138531,140518,150322,157787,138349,151110,156054,148327,160837,159783,138381,138853,137531,157052,154699,129846,148315,148484,162082,157773,145030,166278,149442,157111,152292,146554,151904,157533,139681,149829,155310,158455,150669,142416,147250,138151,148144,137687,147489,158352,139424,146383,148440,150777,159187,143942,151818,137143,138667,151280,134635,145561,167404,137177,158694,154832,161263,135130,143553,151634,146256,139110,150542,160874,150141,152846,141617,142643,148175,141327,160808,157173,157022,126595,140341,147851,143719,142348,143575,149982,155748,136158,149761,141735,136456,142383,153117,140750,148376,141232,144990,155475,147159,147532,149688,152133,132292,143572,139172,131240,146406,151936,146565,164776,154274,141350,151494,156621,150965,133349,137055,150741,138824,148841,138844,147739,154288,129513,136020,160067,161787,145633,144723,151478,144137,147763,136992,138803,141510,122366,157080,167824,146777,153896,136259,150131,149284,145691,139057,169030,172215,144504,140585,143853,162996,142437,153282,145070,150363,134906,146134,137481,135710,142421,153706,152849,149091,134751,136892,129824,151224,162936,164279,153897,159095,150323,142819,138780,143010,134826,151258,150298,151534,146080,155912,154910,154910,115083,156993,143856,144951,152655,137344,160099,148981,155086,148208,151701,136088,155702,148514,145578,138030,143701,134743,158461,154201,144749,141817,157578,147677,146409,153740,158143,141882,143289,142144,125396,147610,130594,146552,139623,150506,142848,159210,156124,140221,158742,155694,145680,142743,149122,166791,135394,138599,156062,147125,150202,138273,158683,151896,130776,154378,147204,134837,155147,142498,140005,157681,147291,139522,152748,156954,165214,142577,152794,155597,139562,142613,148830,152392,133947,146606,131191,135264,130683,151525,148460,132075,154130,146089,168547,149565,149627,136030,156987,149156,149609,147652,172455,153354,127179,122708,126210,138530,132853,151546,151673,161603,154864,151412,150446,155947,158694,135267,139610,159509,148396,147277,152549,153026,147124,153554,142824,133829,153251,127089,138428,141365,144695,156518,142634,155599,147300,145663,158268,153847,135077,142638,156211,136694,162508,166979,150353,149237,134349,152718,157163,141966,165676,145756,147197,131786,174237,141320,158484,156360,153658,147796,142554,146405,148618,159884,154759,145519,152326,143067,155609,159809,153878,152158,150159,138573,154565,145452,134017,151953,147009,150300,155040,146541,141541,157382,145382,139333,164596,135911,142540,152318,140878,158654,152632,157683,161979,144781,154710,154331,137485,133165,144233,159051,145005,141434,163712,145933,145769,145856,145287,158440,147865,138903,134811,140828,135847,157082,148564,142699,141495,142792,140967,130258,147516,139112,141763,146040,139484,161640,145995,143896,136355,142738,151197,143991,151861,148054,139242,156718,148680,141688,127250,152754,151058,154144,154425,141386,142247,145841,147576,141440,144295,123573,146723,148747,135635,147942,134094,136829,160782,144518,143484,161919,129852,139848,134331,166129,150207,141749,144647,129056,154989,133470,134108,149799,139124,158472,160547,146814,132952,169960,155601,144188,144879,158617,147414,172087,127434,165061,140877,151525,147032,148736,139391,135654,136984,148849,136325,143072,133759,144427,159911,156227,123922,135482,141005,143862,157238]},{"counters":[138403,145592,133052,140537,144386,140741,135448,153493,138306,157716,142530,145824,139616,134572,137773,154876,135424,163241,142800,133322,136332,145305,142898,161213,157846,157751,138288,153991,146782,144020,173892,135250,140816,156622,132875,164293,150288,145480,136489,145352,166461,141325,146265,139213,136044,144559,129773,143122,154580,138973,151803,143948,170240,148708,149737,150185,160307,155716,146009,154140,156171,154766,147955,145094,150918,145767,132915,147374,141045,130744,138961,141148,163758,150020,154671,145358,136382,146362,144889,142713,151290,126732,147583,147516,130306,146561,150865,149602,153859,139660,152789,143285,147830,165963,132074,156831,154335,124347,134260,150127,166187,140997,151902,148377,136529,132248,134966,163220,139557,169308,141972,155206,155517,155845,147708,145523,139396,164412,149080,135596,154085,149190,157698,154147,153206,144211,152603,139606,138081,145856,132379,152922,136630,157541,149475,159995,142135,138575,136227,158280,153297,152124,141795,129504,137786,129424,140318,138980,123727,145865,139254,148031,146932,144734,130935,134636,154055,122128,145938,143237,139252,157622,137921,147008,126557,158142,154490,157509,131696,148017,161835,163548,140006,149484,161065,139689,139812,153960,153165,147640,136572,141810,121665,147293,143195,149985,152330,150943,158689,119245,138005,146779,148006,139061,139015,129155,149398,145865,139533,149189,130248,142458,152792,138486,146915,145053,136986,144539,144680,143433,149968,137895,147001,154900,145035,143216,145082,162206,156996,154249,138520,135190,151365,144490,140356,134025,145354,164124,135843,161792,159983,143442,133507,149764,138974,144739,145038,136262,147281,143701,155670,127768,132304,143615,159598,150105,134523,138260,136991,130899,152548,140526,147646,147388,127143,147153,145010,146280,143950,163654,154971,139149,146977,166882,141312,152491,143423,139372,146011,126158,138153,152565,155878,156040,133470,158317,152311,142169,156458,156879,171813,140555,146900,161199,145237,150191,132905,137462,142309,144543,144227,132153,146141,137674,134921,149336,133886,127384,147642,155075,146595,136671,156989,153744,156399,148581,134836,152951,154389,141391,167443,144249,144396,146368,130746,139759,145615,127107,147850,151461,147505,149590,154310,154086,134321,120359,166731,125115,147182,149719,154198,143490,147361,136746,147362,140128,147308,154436,139944,147674,141389,154767,153249,129545,145088,144474,155750,152710,168832,146730,157985,137060,159475,119501,152648,140478,134860,134970,135450,143184,136984,141679,145399,129269,149309,157544,136578,139592,135302,152521,160469,157042,139524,150586,147792,141184,153304,142215,153614,144340,135732,159503,163842,150953,156095,148668,131162,140900,144731,127983,141762,146438,145910,140139,161992,162950,139608,134022,153119,126728,154258,161407,158596,152283,155440,150740,138544,144491,144437,139782,147703,166405,142047,159936,134039,149874,128740,150905,152151,154787,134287,137378,143197,146359,149463,135992,129446,153149,137730,140256,148720,150390,137428,139973,150526,149320,173020,151415,140879,143990,130427,153776,154098,146263,140143,132643,137148,138030,148293,154046,149659,147994,148274,135390,166608,146836,151644,157030,132354,148692,151220,142080,148129,137394,147689,171883,160999,152300,137220,147130,163610,154851,139164,148454,146735,151860,150142,157502,155798,138764,163247,163580,149955,139698,136215,144426,162902,136529,163898,140578,142321,142276,142643,159125,145099,160544,137856,139357,128095,146232,135600,136999,128381,167924,134746,164335,162303,156858,145830,137904,137723,147744,146086,148975,137176,155786,147462,141700,142644,153503,147942,145265,136274,141001,148817,153416,165300,138356,173615,162473,158284,152484,139761,157412,142387,159644,139234,149849,147975,147511,154458,132312,142490,150061,143630,134999,153859,148307,154662,150841,139794,141606,140986,143822,153400,139469,133050,152238,143352,154848,133000,134449,135971,143221,144663,144166,130479,167237,141224,157699,143035,148906,138953,137032,143294,144373,144256,137159,141653,147293,142038,146149,156599,134077,151123,140073,146970,148897,137706,134415,147634,143512,136154,144301,153169,136653,140372,147213,149305,143668,140617,149950,150834,151064,140003,146817,130204,146023,141253,135658,149836,146482,148219,145744,146986,142980,149279,135816,147828,147033,149935,152371,159556,150788,141428,157225,143534,139137,145944,141296,147098,138006,152935,141182,141909,157699,151902,147431,133767,144962,146907,150723,134600,140638,156879,131436,136883,143174,143466,127261,143322,126077,152552,153320,144481,136947,146062,131361,139437,147132,144321,153955,161065,141738,152783,150125,134973,152184,139168,148144,148219,142495,158620,147274,142862,145281,157002,153255,131707,175574,143781,130269,150314,148709,138646,157446,160248,146292,162184,137014,152890,128597,152920,136461,147756,138627,148366,142714,143005,157063,160495,147687,148206,142986,146831,157208,147911,152664,147600,155504,132157,138598,140513,150396,137495,153461,148632,135216,140850,160070,150741,136907,149067,138991,140750,124125,150527,136232,132259,151881,163946,146696,142481,142031,156193,132502,121189,129829,155177,157353,165455,146832,147550,130489,152060,157513,149995,157151,144547,149523,139959,123296,138678,165734,155627,153570,145649,153685,138386,148036,145273,148872,143332,150936,149448,129083,142711,150606,149124,159448,138593,140683,143694,156412,150551,141550,143232,136084,155395,143537,144522,138834,143249,142152,141376,145931,147058,143379,139677,145968,160056,136265,163463,150193,147409,159194,147385,153563,160775,141969,147862,144696,121921,140977,138508,140743,156307,156576,143672,157578,147237,145746,150057,142255,144966,142662,134068,146517,154264,156251,142207,150082,146600,161110,154863,152110,166880,142512,145407,158985,159937,140364,150918,154269,140711,149740,140792,150914,147367,150370,161483,154995,142639,153158,152435,150095,142301,150652,158492,136078,144517,153603,154954,145868,155083,143896,141157,162957,140130,137547,145908,127824,139953,152860,145408,147061,139677,138669,148207,126947,155798,158040,160572,138456,143663,133905,133201,148035,144824,165453,165381,134326,159137,143399,142379,155599,170775,145256,136705,148513,140572,154387,136572,134968,150744,143415,139771,151471,138828,149385,135586,155856,135745,139082,139451,133214,149026,154303,145440,136296,136326,134832,150947,135553,166631,147216,139017,142521,147399,135927,132721,149173,147220,128277,149011,130265,134617,153509,151744,136466,159125,152423,148099,161279,151598,151829,150481,157715,142240,146402,152646,142402,141949,146457,148169,159329,146569,146538,159880,136586,144289,147477,135002,133431,146415,147628,139523,146492,122496,135160,140966,158626,143424,156416,152444,145660,154662,145660,150092,136479,153305,146355,147659,153283,160309,159188,165598,136162,139066,120796,129264,135866,147884,150679,150095,155867,153375,148731,159267,152242,156591,159477,154105,167491,153900,130448,147158,146442,131678,157085,134963,130630,142787,160584,157691,118698,150089,169212,139206,141492,152008,147418,128486,156520,142010,136842,142695,147177,144748,137824,151135,155763,161840,146437,139547,138883,165170,132641,135126,138463,129722,145787,159237,164838,142031,144075,142990,141858,138739,154537,144778,152900,159075,155149,148143,146882,143844,147223,146445,154513,144192,154116,149436,140998,153787,135542,145841,136315,158310,155765,152976,145893,159063,142573,146637,145562,164127,143955,128340,134688,150682,143824,148055,133253,159469,153406,148449,138338,145830,157388,151158,136694,145329,149468,149552,132650,144077,146993,141621,146600,140955,132442,154137,153576,160923,155563,156568,151641,156369,152035,156681,127849,134311,156313,138644,147040,143770,135754,139316,141106,123243,140375,145951,159283,161976,163318,132455,151192,150995,154320,138377,138634,147097,151217,141338,152532,160606,143592,142472,140135,140756,153555,148604,132356,147039,141686,134936,156456,144111,147371,151318,153409,158079,153070,143049,151905,155549,139694,141451,163047,149435,166483,145723,149667,144339,151163,140398,147396,146958,138633,133455,134772,135718,144620,157367,159556,151209,143475,152059,149462,143817,139753,151902,151094,145400,141933,140017,142347,141434,145444,162888,145491,139139,141720,142213,153869,151361,143422,149955,141621,126900,146298,134952,151923,131241,150973,151335,147376,136321,137698,158958,150900,152733,140143,142270,144078,145421,171054,163034,157938,149526,146288,131236,155255,123579,157071,136027,139202,139728,167520,156556,143878,149557,157144,164396,147287,141811,155253,149097,136512,151427,142854,157872,159265,171589,161342,158279,141377,126168,140115,136741,164105,127318,142080,152212,153993,144747,149463,155403,160781,146152,157767,148296,155803,155250,129030,148724,127285,143670,144425,134565,143064,152195,145392,132231,138152,159978,137462,141613,139923,142214,129852,135500,154590,138844,154180,139862,156006,172619,165937,160259,152512,153724,130202,133555,143786,146195,169531,148050,134772,147290,152759,151831,152331,150499,147263,138316,146043,148534,140406,157468,160224,142714,150286,142333,142938,150617,141153,127550,156774,136596,147650,161857,128690,141533,159310,147672,151627,161500,134112,146274,143384,141261,157479,157929,149297,151905,148679,138057,142474,138593,154042,145464,132931,131874,137378,149581,132603,152867,155739,139469,152686,136270,147552,153845,151450,160189,145466,162487,169545,150455,150772,144722,141031,147131,144723,152513,145729,148542,136523,142524,145400,154451,143582,134783,150916,142107,157300,166248,160467,144825,145852,154139,148830,154513,150760,152565,151138,140165,132155,154357,154137,133852,139646,127927,147890,125095,165592,149944,167771,163563,148070,161722,160958,123455,140020,131443,144686,148111,160335,154893,163617,136249,134288,151648,154720,146046,139000,147109,143774,157231,147763,139722,149232,146421,161933,133389,142327,152822,145823,151125,139294,141096,139858,138737,153179,137672,148845,152276,154917,150614,157953,135060,146331,156980,135010,149529,146474,134541,158646,138649,149568,142225,136460,155235,143791,144687,171014,153579,128450,151837,151159,144826,146221,141824,142929,145306,143280,153898,137045,142310,164695,152214,128292,169297,152099,143130,141431,149763,155786,145750,153563,147238,151106,145233,150831,165820,138313,165254,136541,142062,153517,130107,149489,146817,148207,144294,149045,141310,146053,156206,136526,150311,140286,150134,145528,141442,156645,173420,128969,143045,149389,140680,130261,154995,131608,131840,157993,155109,139976,144531,145930,153252,133090,150704,164555,148121,151355,148120,148795,143560,144356,145384,130816,151550,133894,144295,145296,149984,146231,156897,130334,160639,141728,141595,136279,158111,139597,143635,148991,147198,148783,144814,143086,155403,162939,158539,156204,147037,152257,135306,150146,135031,135197,137852,136400,120329,133000,141509,141511,167430,129670,156142,145277,148907,137393,144359,142413,148754,143058,161652,135086,140051,140610,152252,140545,137680,153869,130525,139459,154906,132604,157071,144225,146396,148684,154832,140514,150632,144499,149595,160095,137056,144528,143442,169822,152095,144935,147706,162700,146194,151771,157591,150168,154271,141397,148674,135891,143398,148851,154424,151445,136353,149740,156573,143024,135836,138240,135123,133650,149186,158482,131548,140707,155967,144394,136626,132902,132183,134740,154998,147854,141648,141309,152511,132362,138651,150821,156369,162016,126080,141922,130429,147586,145643,148098,141616,143218,143606,154889,145719,144539,144832,146680,143738,151924,156864,151542,159316,137167,161914,150166,140191,146487,143269,145014,147640,140814,159867,147450,146658,147133,136908,164421,135613,135896,145443,156204,133307,144195,162503,150081,152293,145658,158703,145955,148801,139475,148590,136501,148692,153497,133794,138684,140516,155090,136218,138746,151105,136089,136344,149902,161898,155639,160272,142258,149209,157444,150862,140337,148827,166693,145720,144878,134498,154741,141127,154555,154339,151302,136101,140290,145218,139187,136801,149910,144626,146993,155756,149332,140946,119109,145781,162852,136104,139904,149947,147763,148617,148365,140369,133975,157052,146960,145706,154955,133090,150854,156216,145115,142998,140314,150598,143242,143505,155355,155591,150118,141944,146794,131759,145242,158923,163951,159884,140498,156374,146851,142845,147704,129818,148682,142676,147504,141436,167365,143240,132080,140696,145966,148163,164553,155352,147962,158063,132145,159699,142555,134778,142845,143326,152561,141674,155346,154402,151939,163412,154596,139853,149915,138196,132394,131835,165459,163129,154662,149696,152224,140158,148266,141768,146489,146678,163804,131786,153565,164873,153991,152730,153391,149187,147713,138130,148931,132248,153273,157763,152967,144029,126096,136856,149557,142314,145635,145065,157678,146152,142060,136405,153165,135025,143235,148965,149285,146497,139212,156624,152087,141792,159101,145225,152209,143239,141759,152066,152110,147217,140565,138544,128187,164936,133665,149577,147795,145367,139196,143106,151701,151731,151244,136478,152990,135363,147097,149206,146838,134971,149119,129078,117137,161550,150725,137355,152461,140324,134330,146546,150442,150504,149080,144911,142557,160806,146594,141413,146556,147268,153329,140608,157801,152148,167971,152114,156662,137150,144151,152407,155262,141605,150460,151187,133485,150845,146999,140203,153053,136475,132536,144802,147070,160840,146755,134017,149903,138529,140459,142784,165552,141818,150434,148984,148247,141310,155644,148317,158715,133833,141102,134420,166897,145629,163247,147118,141230,155436,148664,145156,142556,149420,145827,155207,150750,154754,164063,158748,162799,147471,157175,148968,139300,140866,159495,126698,139953,155209,147909,157760,134532,137803,130434,135020,146360,149025,167363,158324,146302,148578,138468,149660,157645,146848,138950,149773,137381,143330,150151,142695,149641,143459,137704,144042,138679,136551,150289,133311,132518,155272,142284,129700,129045,143313,153223,169208,161152,145734,139955,146070,151380,141158,152597,150959,149173,151514,141666,145863,165125,147730,150015,152079,145089,161688,145814,145953,148383,146922,141060,138340,157257,141986,133917,137437,146121,134909,154140,147946,152844,153704,144394,141524,142305,156622,132518,161015,168792,147067,131350,146049,142268]},{"counters":[141805,133480,142793,148014,142161,150378,151724,135784,142502,155316,148943,148040,148019,162641,151497,148720,137029,139408,144944,136825,140699,145091,148161,146666,146143,123124,147306,151501,149723,143850,135056,151957,147226,135473,131452,148207,145373,150774,143912,163031,164245,144537,156615,147320,150720,141529,150468,128855,134761,143359,168051,168146,154613,140486,151339,151116,147140,138736,151321,132807,127825,144759,139394,144116,143608,155185,149305,160250,137808,135797,157079,139638,156914,151897,148279,157544,136426,139774,131230,148008,136513,156701,152118,138773,158432,144635,150676,142308,130381,143934,140929,157672,137647,160084,145323,136535,146555,144349,161392,139843,140797,151360,151823,143306,152627,145603,141462,165791,143902,149859,158389,144619,154734,134977,145472,136307,146753,155999,148552,145195,144005,157970,153261,145474,156526,156035,151536,148096,157038,140115,134012,141024,136908,135479,144261,162309,161956,144112,149725,146190,139631,144928,150789,154872,137955,147171,145052,151415,144071,139359,144394,142835,148231,155458,127287,157304,155518,145653,142936,144638,144190,152657,158117,137663,155780,153577,140144,135053,151954,142567,144953,136309,132692,148820,143909,155489,140283,148008,129414,149279,152941,154288,172631,163048,146731,153981,137026,156677,144347,151448,149551,163108,143572,132870,142039,144601,153287,151984,172527,153194,131740,160992,153138,138714,142779,155397,139762,139350,154961,150024,149422,154343,140859,144881,141254,153284,133924,166171,131920,151926,128668,131724,144514,156630,142098,141163,160141,133738,166362,159287,141334,130525,146053,157629,154128,141722,147009,146938,131875,159131,153636,142043,133925,158800,137295,127233,149508,141342,132123,156175,149453,138499,166341,160319,148219,143850,148227,147402,152201,157971,152138,147369,136161,151865,164690,152015,140939,157741,159125,146436,169087,128001,128954,152196,134633,149262,148020,158208,152279,152418,143605,153691,147121,131307,126534,146911,129946,143453,151936,148002,155454,150257,142469,143410,139480,148118,143143,123913,129167,148925,160226,149896,139363,162702,155071,129906,165521,147149,130276,143931,143104,142858,134229,134757,158768,151022,149396,142021,147436,155449,152371,142408,151849,151922,137511,139569,162797,134582,140598,158635,157171,160439,125883,143085,138663,145854,134531,142373,138636,144340,180876,137994,150590,176221,144389,157208,132750,152117,158737,145794,159752,154924,136153,150121,144626,152047,122585,150182,151009,153952,149049,167011,146101,142837,145121,145920,138196,154477,151400,131391,150903,160518,119524,145006,142386,148077,156503,130644,135842,132628,142957,142794,163299,137669,162089,155753,145848,152881,154272,149003,149096,144807,155553,150129,146749,152095,141246,153837,138496,152015,133413,141953,127556,138238,178445,155692,146283,149264,151241,153221,144941,145534,128025,147854,151191,145886,152961,152375,132902,141121,153241,135567,143879,138699,157356,149438,142815,140175,161275,138209,137610,137989,166651,135134,137307,146403,173839,152360,150701,144276,161072,171567,131107,156806,153002,125043,135472,146961,157857,148945,159490,147968,148169,125789,148784,133207,126109,133979,161069,139270,151103,162158,136909,137458,145648,141844,144337,143944,144339,155970,152427,137216,152154,137937,164211,136253,135500,146351,155097,160102,143593,138552,147564,151566,184168,145670,146378,140293,146595,138169,158995,158174,167042,146937,146507,141641,140721,147427,155821,144518,138960,142765,143863,134939,146977,151779,157455,144882,144547,153684,161072,157063,138624,144001,140784,148124,161879,147358,153374,140191,143497,162347,137803,153933,127416,183933,143437,144986,141060,140681,147901,159537,144990,143121,144681,136878,156514,148814,142508,154244,148161,153446,118850,136230,149914,166870,142994,136149,139322,157087,150467,149403,149615,137855,140178,145407,127454,154079,151930,144410,154179,138915,140647,155278,150966,137619,141184,160473,143363,139597,145551,127372,151891,150460,150629,141640,150975,140512,156647,142093,155287,154280,119734,142943,142689,147021,141862,140977,155397,138775,151376,143456,149760,145232,124921,139926,140926,155843,129134,141455,143400,150016,150747,141439,141187,144262,153712,141670,154058,145248,145361,150941,136681,150695,159104,129649,121808,122676,162009,134003,143629,149010,135599,127202,143868,136297,140515,140210,147177,126044,143710,150582,148706,143694,151697,142623,136570,152260,149820,148072,133641,148406,144415,150312,146715,158094,151018,155046,151869,139618,135124,147235,144376,151334,130518,146736,142870,157709,149697,153839,138993,153882,156441,148781,129489,148082,150918,144991,141190,135908,152637,156157,140989,153396,143583,147814,157854,145485,143076,143411,153722,156930,134254,144334,136504,132282,149536,138399,150928,128750,141950,152299,122478,151426,158759,153165,139434,147666,128149,137716,146223,153593,162521,158851,154627,133181,140555,135966,144748,140805,149826,161710,158209,158464,136363,164249,142158,133264,156776,163599,144528,134009,153143,143115,150907,148192,137647,147640,146808,142815,147468,144258,148920,165435,143189,134316,135889,144126,131496,161702,141208,155141,154406,151464,143575,145057,145647,138292,151772,148398,166023,144836,156841,141206,135893,149473,158981,145683,140694,141763,150001,127752,155468,154766,139440,160542,148166,153852,137967,165451,156783,161731,142784,140564,162193,136197,156193,134374,159020,154297,158862,153948,138955,130949,154295,141408,164078,151251,160737,162647,143146,136107,147921,156121,148304,149382,146647,151389,143034,157300,158214,156255,148309,142254,143032,144394,148380,161193,140439,153622,143885,133867,139141,145559,153167,139724,147544,150655,141754,153502,142726,146251,139449,144833,148344,150972,161256,149446,134029,139131,152909,163464,157740,140408,145037,164488,136694,155111,143787,144876,152297,126160,148230,142196,137863,136912,146231,126388,139425,142321,147658,135163,133693,138569,142175,147967,145888,151904,160335,147336,133212,149822,143021,135971,135581,154196,145732,146631,121387,150195,138603,160025,148326,146922,130375,131975,168222,148159,157762,138501,147809,161133,159127,148450,141932,137037,142311,148670,141324,151011,130863,143097,141349,154308,148305,144326,139979,136813,165968,145987,160828,143629,137309,145311,141125,154524,150995,138809,140070,150213,154129,140559,160076,159253,154096,146649,138582,141105,140656,143410,160847,144068,136978,157691,155366,123123,145665,140856,138685,141870,144479,146098,162931,145258,157631,150902,145776,129850,156689,138694,139763,148303,136974,154638,153202,148654,154922,148959,146619,140930,147365,149275,153579,159683,147507,138608,155853,150869,152115,148325,137857,148604,142359,145130,150795,147673,131456,142785,152349,138048,160792,148783,149187,137986,127192,131062,166390,147749,167255,145701,146421,152596,140371,129419,133959,146088,133604,146838,167971,148671,147273,145516,146897,147270,151217,149312,144702,155432,140971,152208,138652,149042,123163,144093,148329,155542,141824,138943,144465,161456,156201,158102,144801,163435,144023,139170,159458,161267,147733,141440,142570,149360,144043,152271,159825,146226,143061,151358,151374,158787,144862,159914,156741,164412,158802,144747,145463,172379,139113,142779,149422,147691,147304,162016,165791,139056,162063,150943,136011,155025,154559,141260,154350,146244,141635,137616,136714,142046,128453,144047,144241,134797,165634,143463,137936,151093,140097,133886,151860,144977,161251,142804,145330,137407,123900,158272,135687,147939,143530,141815,164119,145067,140144,152699,153723,141028,155970,159462,149155,149144,146110,149910,148075,147637,156120,148553,141973,150888,151011,144972,161164,143587,146155,152654,164199,140986,133330,141821,144062,151258,151762,151072,137398,149716,137197,133854,144305,141314,147268,136317,159126,147795,139955,158813,144446,149903,140488,145076,153443,132023,142448,129342,140294,127939,135764,150276,153829,143465,149809,131481,161870,153245,133088,129786,149070,144408,150160,143643,134171,150916,161624,141080,139331,151742,152227,156675,148900,129377,149863,140848,143771,135828,137607,132972,145671,150250,158933,131385,133899,156271,139884,151981,147117,148504,131364,138193,153259,140967,147122,144495,142775,134252,131887,131202,148907,147666,143661,172170,143648,138322,143252,134618,138735,152020,142447,150213,133122,134633,141404,158640,140158,139308,134144,156536,130670,134072,151213,154514,144253,142715,138359,163794,139517,152502,140148,158650,145775,155696,144268,160222,137111,136755,155712,157592,135547,159195,139869,143448,159114,146701,148837,128527,155953,142968,144549,149958,150081,146836,162038,155124,157214,157332,153552,144084,146036,146189,144027,163356,149174,153258,150688,147616,138809,148355,162655,148847,147166,144273,150465,133727,142403,150494,149726,145143,145890,140830,139999,151257,142181,138562,143936,145709,138055,166156,160417,155044,155912,141933,132422,150893,144669,144814,142850,138616,142879,151422,155965,147688,145855,139958,152207,152633,154319,141451,140687,146989,150812,156966,150861,128245,141487,136063,145949,127717,160697,146508,159891,144561,155583,143275,137713,151425,157116,149446,135477,151508,143698,156467,139127,155825,151922,147385,154246,165558,135727,151463,152979,137855,143893,137930,163632,150233,141894,123655,151386,145477,158561,139189,150348,167878,158254,151758,145956,136426,144299,129885,137829,167660,136971,151789,140756,135575,140890,147564,145081,131424,167990,159361,145037,139485,165109,150670,141972,131587,155412,138836,151073,135384,138973,151982,138100,158755,148985,133264,149722,133743,140889,150630,145218,166139,146296,139810,127451,146495,152733,161829,128535,143278,132491,155359,135400,146598,153909,152534,144834,145426,149119,148876,153076,127158,153228,143357,147599,140858,157769,126653,141379,156201,133604,150720,132993,150812,148596,149443,130683,145714,139101,142685,143860,161443,144898,145551,155812,140321,136309,151517,153501,149712,143299,167514,149114,152978,143618,157663,151366,158384,145138,159857,165586,150797,157558,125025,156439,146209,146753,153665,136402,140567,173508,143125,154229,146162,131324,144162,137656,150591,147836,145799,139578,151292,135580,151788,143259,161402,133513,140532,147807,167931,141693,146608,134852,146371,159866,140001,159619,149778,143853,149423,142104,144711,138782,135894,154994,153308,147469,133178,140944,161852,134657,133346,138311,129791,138178,149224,147545,145873,147154,137913,144807,157092,147684,151496,159249,154061,154561,140972,135414,161049,135216,134802,142713,144954,144631,146705,150803,132414,160778,136822,156403,141934,137405,145546,136661,135651,142988,145337,154938,129694,125251,138066,140595,143777,147002,164341,156566,157953,135411,140610,136190,125512,165498,145625,153620,127698,138362,139704,135113,145771,145981,138770,151919,152672,140913,130116,157836,148998,146850,151677,143176,157293,157074,159964,136804,149607,134505,148311,162245,145007,130270,134123,146253,140155,147460,169060,131775,161607,149370,162838,150937,147285,130987,141383,154664,137703,132342,138982,146856,152406,145490,150339,167681,145772,139132,149499,149799,140812,158426,132603,135908,150985,153158,151180,149382,154709,154391,142416,135028,160153,155816,146943,152958,147560,158490,160315,129710,161644,149848,161812,136684,141786,152837,151549,156918,152079,138928,157940,145647,156964,134840,158063,141465,148849,143386,143738,160572,136646,150386,154912,136467,151982,170833,150770,147998,152494,151023,150247,136766,143628,131191,156665,141776,153585,133490,133288,149311,145482,134281,149577,152304,149953,149469,150323,128102,158345,152132,138605,144513,166241,138255,147561,157467,150109,142039,144916,135815,151922,154606,155595,151034,141778,137985,123280,129179,139317,144916,148447,145223,141133,148385,141904,169118,152681,150667,170847,144923,153255,157231,149461,145028,133098,149446,153942,152220,144608,135826,131996,141146,129751,139520,140479,160536,150850,157822,140947,147127,136583,146892,137040,144756,151324,159397,133775,144853,154204,142622,160599,137188,135659,159042,142722,156875,137401,158926,144337,151567,137589,141116,148128,142153,159871,145671,145376,152998,150464,146606,134279,147192,149369,135200,145515,165326,147294,153944,145218,143898,161929,151202,147470,143667,142752,140967,146698,162655,147284,141410,159495,154252,145553,138033,144629,138613,142966,135171,146409,150754,169672,143873,152937,137000,140864,127111,135759,139866,148403,147039,149128,143453,142177,145598,147866,145506,145236,134077,148242,159113,133867,122586,149853,126610,144790,123174,148218,140095,136055,141770,151949,151938,142772,145049,131331,147686,140712,146164,136031,141451,153204,137112,154346,137095,144404,139034,131036,149041,141353,136888,140525,151362,154993,145319,151411,158212,133878,148434,151778,133396,146844,132485,156522,145281,153622,146001,127666,143390,161941,136089,147894,152827,133465,149959,143101,141329,151149,158735,154331,150503,157845,141585,150944,146234,151362,149736,142001,133766,133516,142820,158058,164133,131416,144617,149382,140628,136315,146307,154273,142470,144741,138508,159049,160979,156907,150489,149185,129628,161217,136420,140500,141975,152089,158861,149547,143284,153354,157593,133755,154951,180459,154648,126601,145114,139691,155925,131330,157397,149232,143394,140751,152753,133807,128814,136581,145831,135393,135121,151549,132593,158107,134526,147110,149513,149115,146044,134061,148518,148348,137585,127857,143804,147029,144753,144182,146630,137658,146712,155373,154867,130000,157200,141789,146146,154496,128617,137576,147418,150587,130861,146937,136406,146324,148627,141314,147483,148481,134223,140584,157470,152350,157983,147074,140768,169003,147705,143886,158230,146714,153660,148115,149378,140287,127069,154123,165111,146050,145316,156813,149247,143836,135635,136815,137825,139506,149537,139398,124460,144245,147964,156261,152390,146513,155480,153757,143423,139435,146959,146165,145869,144964,151420,146215,145385,148164,150489,153572,140434,156021,143519,138367,146309,151819,154869,138315,135243,131313,147058,157380,153111,140957,139898,145284,138350,148832,148620,169460,141072,137034,136854,143267,136329,160774,161165,152467,150042,161926,154478,153112,151399,147890,149030,139840,150464,144753,137951,142262,128695,134242,153232,148263,148271,158884]},{"counters":[148726,149324,140462,142928,152330,133961,147728,157597,128213,140015,166934,160354,166504,141210,165280,144039,147407,145059,147916,137001,160890,150107,151253,143900,137584,145146,150824,145155,144673,143238,138105,146445,140097,158688,153052,124306,152750,166797,149813,149669,138479,147710,155535,140284,153601,150424,152739,139053,142288,140910,122526,136687,136624,143645,145620,142210,142477,148652,142852,133783,140357,140288,137535,157049,143672,158784,164850,150079,140330,152373,154518,150060,139033,132638,137758,142136,132366,150264,143633,144401,140188,149535,162091,157633,135953,140740,132068,146365,142553,128743,149610,150366,162545,154548,136221,147266,148735,147284,158034,145063,128345,137125,155522,152752,134161,137144,142210,137513,159601,137871,146337,131380,147705,138836,156312,133731,132425,143953,137871,149270,158497,147178,136443,141762,135500,143466,143860,137561,148907,137984,133737,140043,141783,171186,159954,149564,144685,147051,148126,148150,147054,158835,136029,148644,149247,150742,146232,149865,152090,149605,140025,140666,155785,153008,139266,143026,137203,142127,146724,134096,139343,145476,159370,155582,155091,144024,127754,130852,163229,138463,141726,132700,149311,155919,160457,140147,144227,146161,146525,143515,139707,151891,127797,145390,137986,150131,152287,150629,134400,150474,138628,137718,145202,140481,142306,162297,141912,140004,156259,136200,144197,152360,174268,142163,151383,145864,139056,153834,154065,160964,135745,152288,159352,153362,162896,157226,134979,160657,161630,139585,159134,143459,150565,148052,160332,134222,158627,157723,158805,138772,159189,165092,131563,149849,148987,140073,165261,163171,165309,143326,134515,147225,144336,146829,153361,155538,140880,153650,148722,150331,139177,134000,135862,174972,145026,145268,151906,126872,137200,131670,140602,149187,138314,152355,143714,138368,143754,154325,137359,144330,150104,148382,150212,142551,145584,154194,137528,137391,138984,135445,159588,149935,160027,148326,150867,135842,139457,158386,145989,150447,156328,136089,141915,149347,143874,146619,158084,148203,132620,144836,142945,157859,135291,148110,130617,158009,153540,142876,146778,155339,135120,140782,126253,152521,156330,154372,152772,156791,161210,134026,146509,142969,150104,152446,149386,155370,163547,141345,143219,139912,141779,141188,146286,155452,145510,144210,152437,147644,126916,149364,158968,164226,136007,147079,142648,151268,139481,141840,146176,145366,151195,140409,138301,142143,146371,126799,147759,146409,151084,163660,165552,153548,138596,133314,140629,141014,131991,154646,150405,124776,140569,135092,133725,142893,141850,146313,129248,157118,153661,161197,127443,156040,143835,152848,135727,154478,150758,149171,144931,146475,142334,138951,153414,144247,141190,157733,147732,147265,161885,146427,151670,149951,153877,137921,137909,135622,142833,156464,131405,137699,131399,165554,147613,139962,139018,141199,156670,145081,149763,142350,146396,143898,154247,141676,164845,139673,136144,146744,158075,152673,153938,145073,155213,148394,147826,155626,150119,163610,130871,139302,164481,143128,118075,144347,143412,137454,142544,144540,157341,141794,147865,131718,151579,140426,148435,154223,144222,151988,138614,146181,134951,160620,143985,122203,154696,152801,151037,150576,148666,140167,136767,137255,157268,150827,149475,162167,149302,148787,144681,138133,131841,139817,143338,139634,134054,137829,140423,162146,146579,144449,162844,136827,128267,135952,151024,139452,136415,157998,142199,165819,147735,140952,143609,157881,132723,142686,137612,148475,142378,151062,139819,144663,151136,125084,171926,154218,157241,148509,154239,157008,144814,142516,151685,159506,152195,142109,143465,148934,146122,147013,156327,163589,151803,130730,145712,134362,151268,155064,141114,145582,145551,149814,158654,144730,145575,151534,135903,148030,138248,146110,143489,147328,163949,147532,133757,165129,155020,147511,153074,140468,135947,150658,127320,145313,130447,129745,140882,145621,148474,143915,148413,138750,146158,131371,140832,152275,148559,138559,140828,143454,143534,156131,145505,147428,159576,139921,157340,147230,146988,144972,152716,154163,142911,148229,164768,141108,154163,150585,135599,153513,150946,123249,147591,146818,143894,136525,140250,162810,133125,154155,145469,141347,142173,143241,151538,146820,127306,160653,153101,156032,148436,139964,143765,163647,148888,145873,153461,145551,143825,152967,149851,148955,146004,136866,152347,140679,135978,147343,142741,154459,150124,173235,135926,150713,150361,157840,155494,159384,151408,144873,150326,144285,135584,133439,136741,152100,134012,152102,153483,160581,149013,148264,149971,141914,145843,141453,147176,142141,152070,152318,125723,146547,147368,141609,138673,161009,141440,144084,141892,152805,154814,152351,133963,169890,158769,137037,147396,149927,137197,164478,138982,148297,148514,139211,157429,144365,151063,155806,146742,142659,132417,151867,137060,145347,147085,142073,162982,152460,147457,144535,145742,138007,161397,147972,148917,153081,133906,127750,137691,137943,163716,152869,145151,135553,140184,131257,163628,145146,126461,138678,145619,142554,142624,166935,145848,151051,159395,143580,140944,142999,149601,152983,140956,141695,148232,131821,168898,151284,157616,148546,135029,143808,150117,151876,130847,138730,139052,136439,141765,145757,147386,129547,162995,148860,142775,146859,135954,160301,173984,152931,136591,150008,140241,141285,138106,157099,151594,143837,135328,152651,142654,160326,158273,140202,146625,152010,135885,124622,125971,140095,136415,143157,164352,141589,143571,158707,143784,152531,137440,127226,150153,146101,132070,122052,161449,142656,148148,149028,157217,129265,149174,145220,153005,146982,145630,153750,157216,133548,154992,150768,152520,142943,150106,142282,148265,149380,154674,154382,142375,157128,138957,149602,148503,147711,160807,139696,133658,137409,137541,169265,148059,143830,142794,144125,152267,152208,151192,140498,146288,140356,148076,149693,151251,141912,158120,154505,152649,163298,150240,150060,146594,158767,150818,141727,142770,136593,162090,166807,124062,146032,153666,149730,162772,152971,144718,130050,151054,139720,144502,136235,146182,149799,146895,144823,151073,146051,133043,160402,142696,132580,150165,143947,141745,138292,155189,137297,147474,135842,139947,152013,146347,142652,150527,140845,140874,140096,135447,144019,150542,146471,146455,157021,136892,152061,151549,141504,156566,149410,147096,147656,159583,159078,136653,152410,150142,144616,160582,147246,143136,144006,155791,134252,144807,155560,148154,143906,149555,152926,147939,152359,157845,148743,156237,159742,141439,147392,137487,149752,146646,138394,137080,132604,154858,154333,140165,131841,140338,151138,147199,130864,156838,145057,146318,142669,146978,136370,147532,141038,146684,152856,145487,164298,155085,150120,142436,132064,131904,139328,154837,132784,136592,142922,150919,143835,154151,142955,137186,141445,159885,147871,147755,142362,141258,163159,143621,139715,149232,162963,129429,142142,145807,146389,150256,144494,144405,132230,146209,158801,139070,146067,143485,146821,149749,148120,138503,167462,145786,150382,144710,144432,148017,163408,123475,142077,157018,149639,144478,153610,138614,152718,153923,140406,147792,153922,165816,156695,147481,146523,137524,143360,147816,131225,154195,139192,133291,149468,143344,152936,133343,157275,159490,140457,129151,145042,164048,146529,137276,140510,135926,154994,151063,143139,143178,121619,182248,149048,149195,152996,143764,150457,144792,133365,157056,139240,140960,151412,166837,162735,136735,150573,153688,141288,147175,152010,135092,161008,147524,168148,148058,147886,145922,149851,140494,156033,154759,150839,141277,137017,150199,151928,142562,157822,149597,147718,139500,149671,150660,159381,140195,157635,137651,148377,154452,131605,151874,144805,151052,149689,146336,147311,147651,135550,141930,152542,152684,136084,158542,142661,159545,142057,143219,133021,150938,146850,157511,142117,128065,137021,149729,150131,161585,144445,143860,147912,142164,148104,159269,142562,157172,162102,152716,141647,139444,151019,150696,150498,126615,151462,152132,143147,149212,150151,165310,134847,158986,129515,145826,131387,132930,148558,151099,133932,128426,143534,139288,159238,148843,164445,143207,139096,124484,130922,153558,150697,143156,149104,144483,152820,143368,160201,136013,149699,132080,137834,142573,161462,138334,140877,155442,157343,140889,163430,149732,143019,151635,135196,146284,158597,140755,139920,141906,158128,148762,126959,132770,159206,145588,147772,154053,165699,147382,149166,136496,144017,143162,135543,142818,148363,129485,143589,135056,148954,153639,150716,164450,155309,140926,155942,129583,142773,155252,140968,140340,143836,156134,156909,144092,156111,147130,156460,136537,168030,145075,138652,130877,148996,149530,152600,155438,136982,152103,157881,137153,167742,145112,126039,133162,162541,144217,131730,150963,155512,139597,147407,145508,127993,137881,142240,157427,146078,140385,134461,155457,144116,153479,146654,145891,153430,138474,149398,151622,143291,145714,159634,140906,159308,139761,141487,147828,152764,127768,147570,138385,140661,145974,139246,134375,126993,135381,146766,133198,157812,155989,147021,144641,148801,144247,136595,152864,150201,155964,157826,134093,150150,160729,140949,157359,141215,147365,137775,161384,144376,146411,149006,149252,139440,142658,154906,151783,139425,152322,130437,145788,146130,134046,143379,155375,137341,142658,154343,160450,144552,148684,152700,155230,157255,153772,147338,158510,133237,148659,141121,146182,157078,143619,163403,159429,145537,151864,131963,136190,139862,144870,144865,140873,143796,142046,143278,141478,134822,146058,129254,170435,139212,137120,146247,132513,152729,146184,138124,163747,152942,159324,130375,147674,151292,166237,146372,148043,149477,140877,161066,137497,146072,158044,147002,137945,151711,140538,142545,160630,147606,135194,159269,136176,159742,133489,150670,141247,143062,138689,157400,150777,150379,140029,156217,144434,127647,161409,154015,145462,150357,143874,147589,145253,144680,147065,162694,129759,167128,156792,142062,149119,157517,138207,153662,147849,136470,164729,135285,129099,148666,138672,158208,141379,146174,145280,158929,153483,135164,143826,134422,142575,141255,157155,152997,144393,156261,170160,151318,147045,143573,146229,144262,150123,165726,150785,133538,154953,141910,158976,142515,149243,154734,144534,135366,146831,126034,150843,157648,154635,140470,134767,150387,162345,148453,147569,132611,131906,147652,136248,147697,156330,145686,159200,150456,162903,162524,150431,136957,136243,142256,144082,142463,144766,142945,129903,141163,143437,140743,138908,138924,143515,147054,133628,149961,157113,133564,144957,149745,146368,162147,152769,143202,140083,143670,162261,136315,151256,133076,140245,135837,146192,141279,145252,165859,156936,140773,149679,148720,133760,133581,142228,132679,142628,153782,139089,164866,147979,137289,144676,150016,146456,159116,158490,146364,140797,144383,146988,151534,146827,143543,139751,154922,143528,155049,149238,156035,151056,148371,151166,145659,140315,174607,139169,156946,149822,140957,154348,143250,153094,154741,141993,154378,132998,145112,156404,140371,151849,142663,157742,144143,144613,139260,141914,142924,144473,150728,135874,146342,146110,142442,131488,136415,136428,153262,136139,133033,140889,147847,145891,143211,147984,161229,145601,125591,147989,132900,149484,159273,148089,144228,158385,155132,138556,151942,149907,138121,137620,145649,149201,145686,145626,158151,150790,145152,151545,172832,143102,144926,150306,150041,151138,155410,142370,149405,131627,143913,152751,139374,132998,120740,151863,138707,149021,151144,166396,145085,131696,143554,135898,156827,148445,138885,153248,151829,140344,141610,143285,130383,136055,145789,150329,138522,149610,147245,157587,134504,140452,143859,156647,154841,145408,131733,131745,157418,144469,159612,156413,154816,141160,139182,150732,143315,167980,162898,156792,129277,145246,126496,151104,160626,148957,150497,144726,135883,130288,145795,134934,165643,144528,142473,134634,135496,155704,148466,158926,133771,136488,130859,154178,165256,142737,156628,151305,146373,135642,156306,157024,138177,151982,148865,143912,135434,142314,152141,150473,148506,144607,155289,140231,145083,172007,147990,128379,144779,136660,143598,136985,157177,142832,137368,165414,151818,157504,127522,155667,157374,152518,149168,139893,139690,149522,147707,162483,147002,141303,145102,155241,150333,148703,153131,155128,153049,136587,153039,147784,155601,145325,133250,138169,148977,145723,152848,151990,133309,135855,143105,148061,160715,165479,156179,150408,158617,138434,154002,145144,141172,147680,145903,168469,132535,143667,140378,147539,146244,130950,141431,162912,148366,137463,137606,150403,130261,146639,145062,155553,146483,160898,148372,158024,155611,140993,141707,139143,131804,131373,145884,152060,162128,165585,150311,152110,135485,143438,118717,131168,133435,149076,158050,161400,146969,160831,146971,154247,158246,140313,143341,140612,142357,155234,151216,152148,155871,153532,158675,142369,137102,143653,136085,137100,150509,141202,146431,160514,148441,134959,145047,142831,144266,150817,144825,152376,141423,163087,130169,146058,136543,148580,138187,145711,173232,156101,141585,131420,171087,150156,125864,159335,148153,154272,151536,142307,138431,135557,156841,166132,140079,156314,162182,144277,142918,167273,149410,129577,160103,154270,122820,144041,141288,161956,154507,144069,145739,145029,155484,131788,154351,140084,157908,145348,144642,142736,149713,145555,150005,145757,158216,145556,153925,141969,151664,122362,141016,139349,155022,148517,156324,132946,156496,144962,153606,136266,141794,128435,143034,133082,145040,129491,155715,132150,155843,141682,151797,136119,141335,143363,154188,140547,148396,154729,137009,149571,166012,136868,139861,166837,156445,135463,158304,151698,148861,136603,139915,142566,138759,139771,128148,159463,137844,138920,144787,146041,145936,136035,148492,132914,135621,154617,141191,150871,153086,161977,135858,152019,152021,137075,126211,136773,143246,146709,161511,124800,148941,162822,152755,140996,154470,151787,146699,143766,142579,145362,162786,133331,157874,137992,123839,152997,144529,152130,153557,131916,138569,138490,155699,147826,153293,134966,151155,160270,129720,147812,144184,151971,132607,151951,134572]},{"counters":[146277,136592,129349,140453,145897,159350,148673,143716,146043,142185,149336,154439,148910,124351,134904,147042,153042,147278,148096,160869,142011,163510,142106,123433,150330,140599,145466,145735,148180,150224,157048,144674,149648,152524,144196,160113,158098,159020,144097,155575,133468,156304,147817,158944,137963,166543,135586,128595,149030,154838,159342,145951,134522,165652,149728,152481,144131,145193,144834,149495,156834,124173,138636,136524,145293,140170,122509,164110,146399,143371,125742,148731,139612,152059,126739,157842,152790,157882,141558,152967,155986,143207,141874,158583,140527,160410,123652,146356,142471,159571,141046,142791,151775,146420,128889,157593,126710,146948,145963,148569,153306,153693,152301,151488,157310,133536,155035,145398,139630,133882,161877,151332,145780,135012,134889,144786,142437,140658,137161,144370,138345,149262,148013,129575,132322,142057,140218,137587,132308,152053,153649,138737,147928,147276,150646,138793,149424,146662,160483,137672,124823,133187,150476,147373,144914,145527,153314,147012,159810,139029,150562,149616,152823,147498,149770,140221,133514,141255,136331,135883,137304,139543,138081,147369,135728,147976,148560,140325,140904,144695,135150,139936,138983,133181,164946,131201,145450,140542,146845,141521,139877,144982,156998,129796,128532,128191,139267,143083,140795,129450,150536,132855,132684,132585,160430,165179,145752,147680,148338,158340,150792,138889,147505,166856,147951,141492,128885,169800,137566,134286,140150,154748,142106,152827,136648,143733,159934,154290,148663,156695,145894,147160,132786,145660,140846,172453,152644,140594,146025,146149,139874,146959,135330,158060,142620,139431,158140,159361,156774,146785,142172,158554,139153,159605,147500,143009,140387,152555,168091,159737,146760,140389,139347,153184,145835,152994,131521,142514,126495,146238,159755,152031,145845,158280,155910,136694,137807,139707,146003,131574,151706,146785,152036,146105,136382,148270,167555,129239,145498,155107,133648,160460,169595,132487,148132,149258,153336,142167,147252,148416,130945,136974,168552,170137,148637,144930,143562,130738,146578,151806,144928,135607,139978,153967,140836,134410,154059,145995,139302,140694,132849,164361,150577,151601,149710,136393,145592,139348,164074,140023,142862,160861,144469,139901,143444,153002,149246,139214,134283,143784,159105,152329,145368,143638,147200,149594,164026,152000,152171,142878,136585,127222,154587,154419,147859,161229,147354,158182,144783,164889,151542,152827,142535,138321,138575,154773,139717,151855,139960,151361,167523,129964,134444,137461,142529,147179,145317,171582,149062,143132,144412,143728,151318,130081,131761,137288,138952,163857,155663,155600,155212,126687,145823,149881,143670,142619,141242,149831,157129,147925,174707,142279,146106,142906,144541,144798,165312,156901,160417,150845,152219,145201,147289,148360,172016,164693,141111,130025,147339,135256,164162,153791,141935,157207,139816,148020,161477,146204,146894,137195,140402,144707,154121,150649,144914,142288,147633,158215,132941,138180,137288,143803,137792,147462,142374,138038,151131,139297,160980,141065,124776,127948,156389,153698,147667,153982,161609,146006,151802,143185,140967,141063,148416,147345,153935,149788,159345,141100,133149,156214,144956,148468,157363,140887,147001,164041,140572,144539,141000,147572,143970,135177,155105,148848,137759,158041,157184,143896,147186,154072,148850,130197,134081,140723,138926,146126,148039,120050,153602,159459,150532,145033,150672,140814,144666,151708,147686,152482,144379,156014,153714,154158,145962,134032,131830,144670,149624,145111,125721,151436,132122,149415,150647,130744,146932,132972,162577,151354,140747,140521,163496,145764,151269,142958,142209,160382,129424,138866,159133,146012,163665,159818,137320,150967,149882,150515,140740,151302,133394,145454,149556,147020,137840,161366,140105,123910,126280,133494,158044,123611,145997,146531,161765,154073,139889,150455,139889,141343,143384,152701,142930,135475,159172,145146,140298,147651,146461,147076,132318,157674,146893,142482,149888,160409,154242,156845,143726,140786,150778,152068,139175,146707,143701,151071,141408,158966,151828,151553,135058,136907,139324,129396,144741,146766,148488,153285,155941,136897,144321,133664,154698,159571,151294,145778,148131,149999,137923,156223,143552,161417,150469,146517,138632,159101,133402,163285,151865,144117,147270,146074,141381,133420,135596,148308,147148,146285,135779,146653,148002,142520,150085,145351,139396,146869,140567,159632,138709,144124,135450,162929,137282,138882,141371,165455,152392,146458,132611,149452,161382,133409,142885,149971,140763,139592,145279,153386,138784,156869,138030,150833,147891,147943,138159,149766,142990,155841,150228,152675,143349,136917,149981,150384,156135,141101,123859,150418,149651,148654,145879,164126,145500,151156,149092,138173,155324,161434,136848,133236,151604,167291,137038,123882,145620,140076,139838,136693,158805,137817,146212,145733,135103,147133,134116,154977,160623,134623,130718,147031,152282,167166,150694,139738,145672,154514,154331,149327,129925,152625,148862,143939,151709,146789,146162,140796,157199,139254,160504,154655,162151,150003,143722,156305,145127,153893,143043,142631,141373,162564,144081,138038,143187,144847,141034,153248,138989,146498,136813,142695,155117,142920,143778,149921,148294,142543,147039,133958,146664,155129,151754,151366,146797,151583,139142,166423,143585,150623,137452,157543,139636,143937,139594,147644,139511,157380,147519,150544,139978,161368,137730,147146,142281,158026,152219,136383,154798,139431,156155,135475,142297,158742,144933,143198,123430,144145,142037,161045,137249,153914,157560,168821,159723,153060,138079,152951,139833,139662,138152,143154,158205,150578,140225,164780,142952,153898,160723,130661,146540,152147,144302,152120,153455,165301,147636,144732,143998,153489,141128,135223,134518,147001,143895,136520,158961,143030,145552,131821,129954,163711,150313,145931,146140,139553,138496,143953,145888,151493,156695,145929,144181,142879,138027,133022,147368,161714,139956,159979,143504,155621,160819,151723,149972,145888,160949,134467,141530,134125,138553,151502,160295,138966,148322,144905,158304,157505,143239,149853,165761,155580,164052,142591,154483,142938,146444,166268,150859,163424,144983,168823,150600,153309,148811,153030,155496,143776,147316,159638,168335,132770,152556,122996,144413,152140,144230,149178,162673,131471,146100,146839,133601,146127,143083,140486,149878,146082,134936,142472,153072,148813,128966,156798,174605,141927,134021,130991,153249,146171,136698,139134,153440,137132,126752,158000,139205,115604,138821,143631,151371,133779,155596,141082,151987,149111,147096,146674,161620,144435,147270,146429,132011,137432,152092,143999,153890,130226,139208,133221,137299,151256,139123,167947,136835,159493,133361,148348,158965,141591,146009,138372,148423,153736,138825,159099,155750,135109,149124,152723,139622,153601,153777,147084,140719,157074,145025,137576,164869,153554,145626,156365,130774,147061,160275,145825,158724,154059,146246,138139,144886,141307,149562,154732,148169,138734,144863,144107,163195,146320,148307,144948,139463,148924,153032,159371,151673,147004,146419,166238,149295,167219,157429,157836,143075,162061,153632,154511,163124,157061,136585,134366,161942,141694,155113,160132,143650,138687,133578,153909,149290,145906,147043,159853,159521,150706,145437,143332,138525,134631,143338,140033,137943,151307,157530,129479,154705,136144,137125,134381,139182,149177,140464,153651,160454,152363,140962,137599,155294,153793,141968,156596,159920,135224,144398,154344,148548,141279,146174,151697,144312,142965,141478,146231,144893,161187,139702,145916,150334,155319,130632,150337,137428,146454,145203,159195,137193,139525,167549,141545,153799,130154,151895,159284,136274,135107,148053,157462,153987,139817,138495,152969,151173,144267,148295,144522,144759,144943,136795,136769,138489,156527,128146,162545,145583,158795,138885,163817,137238,141423,146627,146475,136521,145072,159115,174146,130310,149880,167697,155720,152227,147569,150248,128902,149085,144053,143177,151854,149148,142165,146739,148914,150519,157051,154336,145025,158728,159623,145445,154954,148847,155069,150102,149998,138336,145919,152520,151251,135668,168736,142811,136053,141767,149700,154258,152651,141995,149304,153550,153297,147265,137522,146338,146540,144882,148283,138616,134361,148150,144992,154517,147016,141434,133350,138744,148676,152496,139997,167132,127708,136660,141567,145955,156397,143296,149774,146744,139304,146154,163319,137226,152229,150041,163094,145945,150948,159080,138623,139610,141253,137026,144101,132700,146878,131031,138735,142264,147357,141075,127880,145023,151773,132763,140122,153453,146879,139319,150989,143485,126986,148322,132120,140001,158973,135707,143747,149240,141662,143793,141489,143984,152029,140362,157814,142210,142722,145888,147142,143125,141113,135362,137604,135388,132191,145749,142368,143823,138366,145282,138001,140022,142167,149073,135091,138351,138027,128749,145803,123866,153197,149981,161177,129654,143888,150980,148928,141632,154925,141932,147424,142537,141857,142318,142940,150641,147042,126753,149232,149904,148933,155663,145692,153606,157058,161753,153761,164877,146394,156116,151818,130021,145748,128534,139352,141403,136391,143511,159897,140709,151883,149953,133802,140662,133205,150697,125911,152186,155317,140608,149390,145744,141421,148151,142947,149467,127898,138488,137352,158583,158270,139260,146775,143515,156394,137544,149166,134918,146975,150124,151319,144849,159352,155170,143115,152373,168412,154924,152714,148753,155630,149528,144182,157510,146341,137110,151801,159224,142481,145094,139198,132893,144488,152388,146865,152579,143063,151559,134009,145306,151138,152279,149134,154471,174151,128388,133329,141879,141679,155080,146403,146652,128363,139096,151263,160147,138399,143073,158050,145625,127910,157683,154864,141163,138464,154689,150602,158478,135068,143638,141006,129603,130567,128678,147275,150091,147533,143073,132135,138311,141471,140513,149093,136596,130676,143490,156189,148400,140996,140454,132550,152522,161420,153424,142109,144857,135753,147369,130575,155234,145254,143023,138723,155254,146030,143453,133217,154674,150825,145538,149596,157450,140968,144186,137453,158908,127374,137404,148073,162374,151885,134313,139153,135784,135430,149079,154615,147089,162000,153087,146937,161546,144747,137063,150164,138511,159297,153291,152069,152739,135878,160800,153852,163932,147927,149394,131956,136262,146300,137706,162321,151883,149216,146468,163145,149656,149772,150330,135593,150449,132955,136147,141716,153944,162225,138207,131748,159762,164144,126583,156055,141062,155804,162064,139683,139471,133819,164619,146885,129244,138145,155476,121763,151415,149716,141281,141076,157796,152743,128777,138177,151733,140635,145225,143529,154817,133021,146717,160048,148584,139754,137416,146612,142732,138310,140022,155208,153771,167345,134672,141059,154944,153252,159450,148146,138319,134863,143331,145989,141380,149628,150025,140855,144800,131331,147325,147573,163134,135743,141467,151145,140349,155184,142114,142436,157548,147453,148756,144022,162626,149690,141514,129585,142812,147940,131353,145831,158362,130034,134698,154468,126103,149787,158352,142802,175563,126010,149020,162169,144680,145667,164851,153515,157643,134567,152023,151834,149296,130041,144176,148587,145650,146958,139734,162541,148973,147070,149141,140693,128913,141890,154675,148954,149219,138353,162562,145981,144186,134589,153217,155413,142310,161423,143507,144284,150918,142450,152712,136419,157163,150883,141379,147165,143476,157386,153805,144523,136537,149592,149303,150140,182477,162007,137762,147710,148807,138445,139558,157434,145281,147914,159460,149562,157479,147973,136878,132799,137564,139284,151368,163421,133724,144208,138473,141614,149212,138829,146486,139383,153160,140935,154577,158176,136177,156672,149717,133420,151329,135572,140020,150844,143021,145582,153103,125886,132652,141304,156860,137894,155731,130552,147294,136404,128711,147832,146914,148289,142277,140260,141429,137148,160700,151181,124590,138823,123517,143598,139099,141146,139891,156949,142701,154235,135880,138836,148071,122982,133118,148815,142072,141514,143300,143404,155461,136418,130219,142209,153861,148294,153487,148994,152357,146167,160592,146731,142377,148286,144522,144214,140153,143599,141159,145104,153013,135923,149498,143848,156466,148001,153537,157170,156435,143312,137232,146319,142415,133409,140109,119252,138323,154261,148466,154751,138907,146270,154286,144911,162061,146900,146408,144274,125369,143017,144906,156546,146277,162900,151129,135872,130175,170312,140874,140368,154515,154550,140001,132912,157775,156617,150362,143780,146507,129618,146456,157880,149809,138317,135442,159814,141429,140268,152076,156519,157418,140597,144410,169611,152954,151583,145882,146830,150049,136338,134984,144547,173715,140935,131672,145536,152059,134463,138643,137730,155832,139154,157298,143703,134324,139586,132964,140822,155422,138014,131771,151126,153985,144718,136330,155682,144309,137106,131132,148427,131130,153662,152841,142099,150737,146179,162509,160422,149673,152511,155396,147719,134500,142096,129381,147943,141665,153997,143091,161271,140632,150983,151983,151237,155704,139483,148537,148369,140157,146788,135287,156712,144168,144408,162843,151643,145107,159680,151367,146067,166617,143634,147356,146124,144594,148971,142062,152363,142932,147476,155672,162804,159122,148143,159632,152695,142607,146716,141624,143168,139094,156142,152387,146793,133962,151035,160710,157464,137727,150856,159020,148495,142027,145018,141797,169783,166822,133896,149031,175971,158503,139581,144931,138537,147642,138471,140776,140009,134977,142327,139081,135611,174016,145607,154333,153210,143432,137959,136873,139148,160757,136403,149013,158675,149884,143797,144629,147769,130718,147922,140273,149357,155221,134920,160440,139264,144137,146767,139997,147877,155045,147221,169458,136693,134593,130584,154583,161887,152711,146404,152146,149578,164104,142640,140846,147580,150840,151344,146677,148963,143672,173190,137620,152211,138872,145866,151761,162486,153056,131724,149131,153973,134371,130163,159754,147765,138685,135032,139968,138246,151596,154381,143727,146879,149073,140250,129660,175942,155903,153375,138061,157129,147972,138454,149227,140889,138939,157037,166068,144287,172949,142561,153242,164135,155190,161188,161623,169025,152472,142824,149323,143274,157111,140678,122115,141289,135378,155248,134876,152925]}]},"null_count":0,"tot_col_size":1195070151,"last_update_version":401695339683512322},"l_tax":{"histogram":{"ndv":9,"buckets":[{"count":33300645,"lower_bound":"MA==","upper_bound":"MA==","repeats":33300000},{"count":66631290,"lower_bound":"MC4wMQ==","upper_bound":"MC4wMQ==","repeats":33330000},{"count":100261942,"lower_bound":"MC4wMg==","upper_bound":"MC4wMg==","repeats":33630000},{"count":134942613,"lower_bound":"MC4wMw==","upper_bound":"MC4wMw==","repeats":34680000},{"count":167133237,"lower_bound":"MC4wNA==","upper_bound":"MC4wNA==","repeats":32190000},{"count":202173916,"lower_bound":"MC4wNQ==","upper_bound":"MC4wNQ==","repeats":35040000},{"count":234724546,"lower_bound":"MC4wNg==","upper_bound":"MC4wNg==","repeats":32550000},{"count":268325197,"lower_bound":"MC4wNw==","upper_bound":"MC4wNw==","repeats":33600000},{"count":300005811,"lower_bound":"MC4wOA==","upper_bound":"MC4wOA==","repeats":31680000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33334750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33327217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33337739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33342494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33330226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33336416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33329408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33337739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33329408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33327217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33334750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33342494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33330226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33336416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33342494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33336416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33337739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33330226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33327217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33334750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33329408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33330226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33337739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33336416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33327217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33342494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33334750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33329408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33334750,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33329408,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33337739,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33342494,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33336416,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33327217,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33333819,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33330226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":2700052299,"last_update_version":401695339749048324}},"indices":{"primary":{"histogram":{"ndv":300005811,"buckets":[{"count":10341398,"lower_bound":"A4AAAAAAAAABA4AAAAAAAAAB","upper_bound":"A4AAAAAAnc5FA4AAAAAAAAAB","repeats":1},{"count":18599679,"lower_bound":"A4AAAAAAnc5FA4AAAAAAAAAC","upper_bound":"A4AAAAABG9uhA4AAAAAAAAAC","repeats":1},{"count":26499419,"lower_bound":"A4AAAAABG9uhA4AAAAAAAAAD","upper_bound":"A4AAAAABlGKCA4AAAAAAAAAG","repeats":1},{"count":34480637,"lower_bound":"A4AAAAABlGKCA4AAAAAAAAAH","upper_bound":"A4AAAAACDiXFA4AAAAAAAAAB","repeats":1},{"count":41725017,"lower_bound":"A4AAAAACDiXFA4AAAAAAAAAC","upper_bound":"A4AAAAACfLthA4AAAAAAAAAD","repeats":1},{"count":46156893,"lower_bound":"A4AAAAACfLthA4AAAAAAAAAE","upper_bound":"A4AAAAACwHgHA4AAAAAAAAAD","repeats":1},{"count":50106763,"lower_bound":"A4AAAAACwHggA4AAAAAAAAAB","upper_bound":"A4AAAAAC/L+GA4AAAAAAAAAC","repeats":1},{"count":54056633,"lower_bound":"A4AAAAAC/L+HA4AAAAAAAAAB","upper_bound":"A4AAAAADOQpkA4AAAAAAAAAC","repeats":1},{"count":57825837,"lower_bound":"A4AAAAADOQpkA4AAAAAAAAAD","upper_bound":"A4AAAAADcpqiA4AAAAAAAAAC","repeats":1},{"count":61382491,"lower_bound":"A4AAAAADcpqiA4AAAAAAAAAD","upper_bound":"A4AAAAADqNWBA4AAAAAAAAAC","repeats":1},{"count":64939145,"lower_bound":"A4AAAAADqNWBA4AAAAAAAAAD","upper_bound":"A4AAAAAD3xiHA4AAAAAAAAAF","repeats":1},{"count":68708349,"lower_bound":"A4AAAAAD3xiHA4AAAAAAAAAG","upper_bound":"A4AAAAAEGKFDA4AAAAAAAAAD","repeats":1},{"count":72265003,"lower_bound":"A4AAAAAEGKFDA4AAAAAAAAAE","upper_bound":"A4AAAAAETuVgA4AAAAAAAAAH","repeats":1},{"count":75859167,"lower_bound":"A4AAAAAETuVhA4AAAAAAAAAB","upper_bound":"A4AAAAAEhbgEA4AAAAAAAAAB","repeats":1},{"count":79628371,"lower_bound":"A4AAAAAEhbgEA4AAAAAAAAAC","upper_bound":"A4AAAAAEvzJjA4AAAAAAAAAD","repeats":1},{"count":83185025,"lower_bound":"A4AAAAAEvzJjA4AAAAAAAAAE","upper_bound":"A4AAAAAE9XlnA4AAAAAAAAAC","repeats":1},{"count":86479535,"lower_bound":"A4AAAAAE9XlnA4AAAAAAAAAD","upper_bound":"A4AAAAAFJ87HA4AAAAAAAAAF","repeats":1},{"count":90248739,"lower_bound":"A4AAAAAFJ87gA4AAAAAAAAAB","upper_bound":"A4AAAAAFYUZAA4AAAAAAAAAE","repeats":1},{"count":93805393,"lower_bound":"A4AAAAAFYUZAA4AAAAAAAAAF","upper_bound":"A4AAAAAFl37gA4AAAAAAAAAE","repeats":1},{"count":97362047,"lower_bound":"A4AAAAAFl37hA4AAAAAAAAAB","upper_bound":"A4AAAAAFzc8AA4AAAAAAAAAD","repeats":1},{"count":101131251,"lower_bound":"A4AAAAAFzc8AA4AAAAAAAAAE","upper_bound":"A4AAAAAGB1KnA4AAAAAAAAAC","repeats":1},{"count":104687905,"lower_bound":"A4AAAAAGB1KnA4AAAAAAAAAD","upper_bound":"A4AAAAAGPZ5iA4AAAAAAAAAE","repeats":1},{"count":108283036,"lower_bound":"A4AAAAAGPZ5iA4AAAAAAAAAF","upper_bound":"A4AAAAAGdHCmA4AAAAAAAAAE","repeats":1},{"count":112052240,"lower_bound":"A4AAAAAGdHCmA4AAAAAAAAAF","upper_bound":"A4AAAAAGrejkA4AAAAAAAAAG","repeats":1},{"count":115608894,"lower_bound":"A4AAAAAGrejkA4AAAAAAAAAH","upper_bound":"A4AAAAAG5CRDA4AAAAAAAAAF","repeats":1},{"count":119165548,"lower_bound":"A4AAAAAG5CRDA4AAAAAAAAAG","upper_bound":"A4AAAAAHGmgFA4AAAAAAAAAB","repeats":1},{"count":122934752,"lower_bound":"A4AAAAAHGmgGA4AAAAAAAAAB","upper_bound":"A4AAAAAHU+CCA4AAAAAAAAAE","repeats":1},{"count":126491406,"lower_bound":"A4AAAAAHU+CCA4AAAAAAAAAF","upper_bound":"A4AAAAAHihwAA4AAAAAAAAAB","repeats":1},{"count":130048060,"lower_bound":"A4AAAAAHihwAA4AAAAAAAAAC","upper_bound":"A4AAAAAHwGjAA4AAAAAAAAAG","repeats":1},{"count":133817264,"lower_bound":"A4AAAAAHwGjAA4AAAAAAAAAH","upper_bound":"A4AAAAAH+ehAA4AAAAAAAAAD","repeats":1},{"count":137514260,"lower_bound":"A4AAAAAH+ehAA4AAAAAAAAAE","upper_bound":"A4AAAAAIMk/EA4AAAAAAAAAB","repeats":1},{"count":141070914,"lower_bound":"A4AAAAAIMk/EA4AAAAAAAAAC","upper_bound":"A4AAAAAIaJckA4AAAAAAAAAC","repeats":1},{"count":143791542,"lower_bound":"A4AAAAAIaJckA4AAAAAAAAAD","upper_bound":"A4AAAAAIkhgGA4AAAAAAAAAB","repeats":1},{"count":146512170,"lower_bound":"A4AAAAAIkhgGA4AAAAAAAAAC","upper_bound":"A4AAAAAIu5znA4AAAAAAAAAD","repeats":1},{"count":149232798,"lower_bound":"A4AAAAAIu5znA4AAAAAAAAAE","upper_bound":"A4AAAAAI5SHjA4AAAAAAAAAF","repeats":1},{"count":151953426,"lower_bound":"A4AAAAAI5SHkA4AAAAAAAAAB","upper_bound":"A4AAAAAJDqsmA4AAAAAAAAAB","repeats":1},{"count":154674054,"lower_bound":"A4AAAAAJDqsmA4AAAAAAAAAC","upper_bound":"A4AAAAAJOCOEA4AAAAAAAAAF","repeats":1},{"count":157082944,"lower_bound":"A4AAAAAJOCOEA4AAAAAAAAAG","upper_bound":"A4AAAAAJXOvmA4AAAAAAAAAC","repeats":1},{"count":158754996,"lower_bound":"A4AAAAAJXOvnA4AAAAAAAAAB","upper_bound":"A4AAAAAJdmZiA4AAAAAAAAAC","repeats":1},{"count":160639598,"lower_bound":"A4AAAAAJdmZiA4AAAAAAAAAD","upper_bound":"A4AAAAAJky0mA4AAAAAAAAAC","repeats":1},{"count":162524200,"lower_bound":"A4AAAAAJky0mA4AAAAAAAAAD","upper_bound":"A4AAAAAJr/qnA4AAAAAAAAAD","repeats":1},{"count":164196252,"lower_bound":"A4AAAAAJr/qnA4AAAAAAAAAE","upper_bound":"A4AAAAAJyXZGA4AAAAAAAAAD","repeats":1},{"count":166160167,"lower_bound":"A4AAAAAJyXZGA4AAAAAAAAAE","upper_bound":"A4AAAAAJ52pmA4AAAAAAAAAB","repeats":1},{"count":168044769,"lower_bound":"A4AAAAAJ52pnA4AAAAAAAAAB","upper_bound":"A4AAAAAKBDKlA4AAAAAAAAAB","repeats":1},{"count":169716821,"lower_bound":"A4AAAAAKBDKlA4AAAAAAAAAC","upper_bound":"A4AAAAAKHbZgA4AAAAAAAAAC","repeats":1},{"count":171601423,"lower_bound":"A4AAAAAKHbZgA4AAAAAAAAAD","upper_bound":"A4AAAAAKOnaHA4AAAAAAAAAC","repeats":1},{"count":173486025,"lower_bound":"A4AAAAAKOnaHA4AAAAAAAAAD","upper_bound":"A4AAAAAKV0LBA4AAAAAAAAAD","repeats":1},{"count":175158077,"lower_bound":"A4AAAAAKV0LBA4AAAAAAAAAE","upper_bound":"A4AAAAAKcMKnA4AAAAAAAAAB","repeats":1},{"count":177042679,"lower_bound":"A4AAAAAKcMKnA4AAAAAAAAAC","upper_bound":"A4AAAAAKjX/gA4AAAAAAAAAB","repeats":1},{"count":178927281,"lower_bound":"A4AAAAAKjX/hA4AAAAAAAAAB","upper_bound":"A4AAAAAKqjvCA4AAAAAAAAAC","repeats":1},{"count":180599333,"lower_bound":"A4AAAAAKqjvCA4AAAAAAAAAD","upper_bound":"A4AAAAAKw8KFA4AAAAAAAAAE","repeats":1},{"count":182483935,"lower_bound":"A4AAAAAKw8KFA4AAAAAAAAAF","upper_bound":"A4AAAAAK4HtCA4AAAAAAAAAG","repeats":1},{"count":184368537,"lower_bound":"A4AAAAAK4HtCA4AAAAAAAAAH","upper_bound":"A4AAAAAK/ThjA4AAAAAAAAAB","repeats":1},{"count":186040589,"lower_bound":"A4AAAAAK/ThjA4AAAAAAAAAC","upper_bound":"A4AAAAALFrihA4AAAAAAAAAG","repeats":1},{"count":187925191,"lower_bound":"A4AAAAALFrihA4AAAAAAAAAH","upper_bound":"A4AAAAALM3hkA4AAAAAAAAAD","repeats":1},{"count":189809793,"lower_bound":"A4AAAAALM3hlA4AAAAAAAAAB","upper_bound":"A4AAAAALUDcmA4AAAAAAAAAE","repeats":1},{"count":191481845,"lower_bound":"A4AAAAALUDcnA4AAAAAAAAAB","upper_bound":"A4AAAAALacMlA4AAAAAAAAAG","repeats":1},{"count":193366447,"lower_bound":"A4AAAAALacMmA4AAAAAAAAAB","upper_bound":"A4AAAAALhoxGA4AAAAAAAAAH","repeats":1},{"count":194999605,"lower_bound":"A4AAAAALhoxHA4AAAAAAAAAB","upper_bound":"A4AAAAALn3pjA4AAAAAAAAAC","repeats":1},{"count":196884207,"lower_bound":"A4AAAAALn3pjA4AAAAAAAAAD","upper_bound":"A4AAAAALvD1BA4AAAAAAAAAB","repeats":1},{"count":198768809,"lower_bound":"A4AAAAALvD1BA4AAAAAAAAAC","upper_bound":"A4AAAAAL2PrFA4AAAAAAAAAG","repeats":1},{"count":200440861,"lower_bound":"A4AAAAAL2PrGA4AAAAAAAAAB","upper_bound":"A4AAAAAL8n7iA4AAAAAAAAAB","repeats":1},{"count":202325463,"lower_bound":"A4AAAAAL8n7jA4AAAAAAAAAB","upper_bound":"A4AAAAAMDzsjA4AAAAAAAAAC","repeats":1},{"count":204210065,"lower_bound":"A4AAAAAMDzsjA4AAAAAAAAAD","upper_bound":"A4AAAAAMK/pnA4AAAAAAAAAB","repeats":1},{"count":205570379,"lower_bound":"A4AAAAAMK/pnA4AAAAAAAAAC","upper_bound":"A4AAAAAMQLRiA4AAAAAAAAAD","repeats":1},{"count":206930693,"lower_bound":"A4AAAAAMQLRiA4AAAAAAAAAE","upper_bound":"A4AAAAAMVW4gA4AAAAAAAAAE","repeats":1},{"count":208291007,"lower_bound":"A4AAAAAMVW4gA4AAAAAAAAAF","upper_bound":"A4AAAAAMaiRgA4AAAAAAAAAE","repeats":1},{"count":209651321,"lower_bound":"A4AAAAAMaiRhA4AAAAAAAAAB","upper_bound":"A4AAAAAMfuhHA4AAAAAAAAAE","repeats":1},{"count":211011635,"lower_bound":"A4AAAAAMfuhHA4AAAAAAAAAF","upper_bound":"A4AAAAAMk6kFA4AAAAAAAAAC","repeats":1},{"count":212371949,"lower_bound":"A4AAAAAMk6kFA4AAAAAAAAAD","upper_bound":"A4AAAAAMqGKFA4AAAAAAAAAE","repeats":1},{"count":213732263,"lower_bound":"A4AAAAAMqGKFA4AAAAAAAAAF","upper_bound":"A4AAAAAMvSSiA4AAAAAAAAAC","repeats":1},{"count":215092577,"lower_bound":"A4AAAAAMvSSiA4AAAAAAAAAD","upper_bound":"A4AAAAAM0eMjA4AAAAAAAAAC","repeats":1},{"count":216452891,"lower_bound":"A4AAAAAM0eMkA4AAAAAAAAAB","upper_bound":"A4AAAAAM5quFA4AAAAAAAAAE","repeats":1},{"count":217813205,"lower_bound":"A4AAAAAM5quFA4AAAAAAAAAF","upper_bound":"A4AAAAAM+2dEA4AAAAAAAAAE","repeats":1},{"count":219173519,"lower_bound":"A4AAAAAM+2dEA4AAAAAAAAAF","upper_bound":"A4AAAAANECoDA4AAAAAAAAAC","repeats":1},{"count":220533833,"lower_bound":"A4AAAAANECoDA4AAAAAAAAAD","upper_bound":"A4AAAAANJOuEA4AAAAAAAAAH","repeats":1},{"count":221894147,"lower_bound":"A4AAAAANJOuFA4AAAAAAAAAB","upper_bound":"A4AAAAANOauFA4AAAAAAAAAD","repeats":1},{"count":223254461,"lower_bound":"A4AAAAANOauFA4AAAAAAAAAE","upper_bound":"A4AAAAANTmqGA4AAAAAAAAAC","repeats":1},{"count":224614775,"lower_bound":"A4AAAAANTmqGA4AAAAAAAAAD","upper_bound":"A4AAAAANYzInA4AAAAAAAAAD","repeats":1},{"count":226395020,"lower_bound":"A4AAAAANYzInA4AAAAAAAAAE","upper_bound":"A4AAAAANfl7EA4AAAAAAAAAC","repeats":1},{"count":227755334,"lower_bound":"A4AAAAANfl7FA4AAAAAAAAAB","upper_bound":"A4AAAAANkxnDA4AAAAAAAAAC","repeats":1},{"count":229115648,"lower_bound":"A4AAAAANkxnDA4AAAAAAAAAD","upper_bound":"A4AAAAANp9sCA4AAAAAAAAAC","repeats":1},{"count":230475962,"lower_bound":"A4AAAAANp9sCA4AAAAAAAAAD","upper_bound":"A4AAAAANvJnlA4AAAAAAAAAB","repeats":1},{"count":231836276,"lower_bound":"A4AAAAANvJnlA4AAAAAAAAAC","upper_bound":"A4AAAAAN0VlnA4AAAAAAAAAB","repeats":1},{"count":233196590,"lower_bound":"A4AAAAAN0VlnA4AAAAAAAAAC","upper_bound":"A4AAAAAN5hmnA4AAAAAAAAAG","repeats":1},{"count":234556904,"lower_bound":"A4AAAAAN5hmnA4AAAAAAAAAH","upper_bound":"A4AAAAAN+tukA4AAAAAAAAAB","repeats":1},{"count":235917218,"lower_bound":"A4AAAAAN+tukA4AAAAAAAAAC","upper_bound":"A4AAAAAOD6BjA4AAAAAAAAAB","repeats":1},{"count":237277532,"lower_bound":"A4AAAAAOD6BkA4AAAAAAAAAB","upper_bound":"A4AAAAAOJF+EA4AAAAAAAAAB","repeats":1},{"count":238637846,"lower_bound":"A4AAAAAOJF+EA4AAAAAAAAAC","upper_bound":"A4AAAAAOOSJAA4AAAAAAAAAD","repeats":1},{"count":239998160,"lower_bound":"A4AAAAAOOSJAA4AAAAAAAAAE","upper_bound":"A4AAAAAOTePEA4AAAAAAAAAF","repeats":1},{"count":241358474,"lower_bound":"A4AAAAAOTePFA4AAAAAAAAAB","upper_bound":"A4AAAAAOYqaHA4AAAAAAAAAB","repeats":1},{"count":242718788,"lower_bound":"A4AAAAAOYqaHA4AAAAAAAAAC","upper_bound":"A4AAAAAOd2jHA4AAAAAAAAAC","repeats":1},{"count":244079102,"lower_bound":"A4AAAAAOd2jHA4AAAAAAAAAD","upper_bound":"A4AAAAAOjDCCA4AAAAAAAAAC","repeats":1},{"count":245439416,"lower_bound":"A4AAAAAOjDCCA4AAAAAAAAAD","upper_bound":"A4AAAAAOoOrnA4AAAAAAAAAH","repeats":1},{"count":246799730,"lower_bound":"A4AAAAAOoOsAA4AAAAAAAAAB","upper_bound":"A4AAAAAOtaqFA4AAAAAAAAAC","repeats":1},{"count":248160044,"lower_bound":"A4AAAAAOtaqFA4AAAAAAAAAD","upper_bound":"A4AAAAAOynUEA4AAAAAAAAAC","repeats":1},{"count":249520358,"lower_bound":"A4AAAAAOynUEA4AAAAAAAAAD","upper_bound":"A4AAAAAO3zphA4AAAAAAAAAC","repeats":1},{"count":250880672,"lower_bound":"A4AAAAAO3zpiA4AAAAAAAAAB","upper_bound":"A4AAAAAO8/kGA4AAAAAAAAAE","repeats":1},{"count":252240986,"lower_bound":"A4AAAAAO8/kGA4AAAAAAAAAF","upper_bound":"A4AAAAAPCLwiA4AAAAAAAAAD","repeats":1},{"count":253601300,"lower_bound":"A4AAAAAPCLwiA4AAAAAAAAAE","upper_bound":"A4AAAAAPHX8EA4AAAAAAAAAH","repeats":1},{"count":254961614,"lower_bound":"A4AAAAAPHX8FA4AAAAAAAAAB","upper_bound":"A4AAAAAPMkMFA4AAAAAAAAAC","repeats":1},{"count":256535454,"lower_bound":"A4AAAAAPMkMFA4AAAAAAAAAD","upper_bound":"A4AAAAAPSkgFA4AAAAAAAAAB","repeats":1},{"count":257895768,"lower_bound":"A4AAAAAPSkgGA4AAAAAAAAAB","upper_bound":"A4AAAAAPXwsDA4AAAAAAAAAC","repeats":1},{"count":259256082,"lower_bound":"A4AAAAAPXwsDA4AAAAAAAAAD","upper_bound":"A4AAAAAPc8LmA4AAAAAAAAAG","repeats":1},{"count":260616396,"lower_bound":"A4AAAAAPc8LnA4AAAAAAAAAB","upper_bound":"A4AAAAAPiIIkA4AAAAAAAAAF","repeats":1},{"count":261976710,"lower_bound":"A4AAAAAPiIIkA4AAAAAAAAAG","upper_bound":"A4AAAAAPnUOmA4AAAAAAAAAB","repeats":1},{"count":263337024,"lower_bound":"A4AAAAAPnUOnA4AAAAAAAAAB","upper_bound":"A4AAAAAPsgaFA4AAAAAAAAAD","repeats":1},{"count":264697338,"lower_bound":"A4AAAAAPsgaFA4AAAAAAAAAE","upper_bound":"A4AAAAAPxsQkA4AAAAAAAAAB","repeats":1},{"count":266057652,"lower_bound":"A4AAAAAPxsQkA4AAAAAAAAAC","upper_bound":"A4AAAAAP24dnA4AAAAAAAAAB","repeats":1},{"count":267417966,"lower_bound":"A4AAAAAP24dnA4AAAAAAAAAC","upper_bound":"A4AAAAAP8EeFA4AAAAAAAAAC","repeats":1},{"count":268778280,"lower_bound":"A4AAAAAP8EeFA4AAAAAAAAAD","upper_bound":"A4AAAAAQBQzHA4AAAAAAAAAG","repeats":1},{"count":270138594,"lower_bound":"A4AAAAAQBQzHA4AAAAAAAAAH","upper_bound":"A4AAAAAQGc3FA4AAAAAAAAAC","repeats":1},{"count":271498908,"lower_bound":"A4AAAAAQGc3FA4AAAAAAAAAD","upper_bound":"A4AAAAAQLpRhA4AAAAAAAAAB","repeats":1},{"count":272859222,"lower_bound":"A4AAAAAQLpRhA4AAAAAAAAAC","upper_bound":"A4AAAAAQQ1oiA4AAAAAAAAAB","repeats":1},{"count":274219536,"lower_bound":"A4AAAAAQQ1oiA4AAAAAAAAAC","upper_bound":"A4AAAAAQWBrgA4AAAAAAAAAF","repeats":1},{"count":275579850,"lower_bound":"A4AAAAAQWBrgA4AAAAAAAAAG","upper_bound":"A4AAAAAQbN6iA4AAAAAAAAAB","repeats":1},{"count":276940164,"lower_bound":"A4AAAAAQbN6jA4AAAAAAAAAB","upper_bound":"A4AAAAAQgaBCA4AAAAAAAAAD","repeats":1},{"count":278300478,"lower_bound":"A4AAAAAQgaBDA4AAAAAAAAAB","upper_bound":"A4AAAAAQllrCA4AAAAAAAAAC","repeats":1},{"count":279660792,"lower_bound":"A4AAAAAQllrCA4AAAAAAAAAD","upper_bound":"A4AAAAAQqxrAA4AAAAAAAAAC","repeats":1},{"count":281021106,"lower_bound":"A4AAAAAQqxrAA4AAAAAAAAAD","upper_bound":"A4AAAAAQv9lkA4AAAAAAAAAE","repeats":1},{"count":282381420,"lower_bound":"A4AAAAAQv9lkA4AAAAAAAAAF","upper_bound":"A4AAAAAQ1JVFA4AAAAAAAAAD","repeats":1},{"count":283741734,"lower_bound":"A4AAAAAQ1JVFA4AAAAAAAAAE","upper_bound":"A4AAAAAQ6VgFA4AAAAAAAAAC","repeats":1},{"count":285102048,"lower_bound":"A4AAAAAQ6VgFA4AAAAAAAAAD","upper_bound":"A4AAAAAQ/h6BA4AAAAAAAAAG","repeats":1},{"count":286659924,"lower_bound":"A4AAAAAQ/h6CA4AAAAAAAAAB","upper_bound":"A4AAAAARFd6gA4AAAAAAAAAB","repeats":1},{"count":288020238,"lower_bound":"A4AAAAARFd6gA4AAAAAAAAAC","upper_bound":"A4AAAAARKqHmA4AAAAAAAAAB","repeats":1},{"count":289380552,"lower_bound":"A4AAAAARKqHmA4AAAAAAAAAC","upper_bound":"A4AAAAARP2SkA4AAAAAAAAAD","repeats":1},{"count":290740866,"lower_bound":"A4AAAAARP2SkA4AAAAAAAAAE","upper_bound":"A4AAAAARVCwHA4AAAAAAAAAF","repeats":1},{"count":292101180,"lower_bound":"A4AAAAARVCwHA4AAAAAAAAAG","upper_bound":"A4AAAAARaPLjA4AAAAAAAAAG","repeats":1},{"count":292412918,"lower_bound":"A4AAAAARaPLjA4AAAAAAAAAH","upper_bound":"A4AAAAARbbcDA4AAAAAAAAAC","repeats":1},{"count":293773232,"lower_bound":"A4AAAAARbbcDA4AAAAAAAAAD","upper_bound":"A4AAAAARgnrlA4AAAAAAAAAE","repeats":1},{"count":295133546,"lower_bound":"A4AAAAARgnrlA4AAAAAAAAAF","upper_bound":"A4AAAAARl0YgA4AAAAAAAAAB","repeats":1},{"count":296493860,"lower_bound":"A4AAAAARl0YgA4AAAAAAAAAC","upper_bound":"A4AAAAARrAigA4AAAAAAAAAB","repeats":1},{"count":297854174,"lower_bound":"A4AAAAARrAigA4AAAAAAAAAC","upper_bound":"A4AAAAARwMYkA4AAAAAAAAAF","repeats":1},{"count":299214488,"lower_bound":"A4AAAAARwMYkA4AAAAAAAAAG","upper_bound":"A4AAAAAR1YuCA4AAAAAAAAAB","repeats":1},{"count":300005811,"lower_bound":"A4AAAAAR1YuCA4AAAAAAAAAC","upper_bound":"A4AAAAAR4aMAA4AAAAAAAAAC","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695486890475521}},"count":300005811,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/nation.json b/cmd/explaintest/s/tpch_stats/nation.json deleted file mode 100644 index 86f17082108b2..0000000000000 --- a/cmd/explaintest/s/tpch_stats/nation.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"nation","columns":{"n_comment":{"histogram":{"ndv":25,"buckets":[{"count":1,"lower_bound":"IGhhZ2dsZS4gY2FyZWZ1bGx5IGZpbmFsIGRlcG9zaXRzIGRldGVjdCBzbHlseSBhZ2Fp","upper_bound":"IGhhZ2dsZS4gY2FyZWZ1bGx5IGZpbmFsIGRlcG9zaXRzIGRldGVjdCBzbHlseSBhZ2Fp","repeats":1},{"count":2,"lower_bound":"IHBlbmRpbmcgZXhjdXNlcyBoYWdnbGUgZnVyaW91c2x5IGRlcG9zaXRzLiBwZW5kaW5nLCBleHByZXNzIHBpbnRvIGJlYW5zIHdha2UgZmx1ZmZpbHkgcGFzdCB0","upper_bound":"IHBlbmRpbmcgZXhjdXNlcyBoYWdnbGUgZnVyaW91c2x5IGRlcG9zaXRzLiBwZW5kaW5nLCBleHByZXNzIHBpbnRvIGJlYW5zIHdha2UgZmx1ZmZpbHkgcGFzdCB0","repeats":1},{"count":3,"lower_bound":"IHJlcXVlc3RzIGFnYWluc3QgdGhlIHBsYXRlbGV0cyB1c2UgbmV2ZXIgYWNjb3JkaW5nIHRvIHRoZSBxdWlja2x5IHJlZ3VsYXIgcGludA==","upper_bound":"IHJlcXVlc3RzIGFnYWluc3QgdGhlIHBsYXRlbGV0cyB1c2UgbmV2ZXIgYWNjb3JkaW5nIHRvIHRoZSBxdWlja2x5IHJlZ3VsYXIgcGludA==","repeats":1},{"count":4,"lower_bound":"IHNseWx5IGV4cHJlc3MgYXN5bXB0b3Rlcy4gcmVndWxhciBkZXBvc2l0cyBoYWdnbGUgc2x5bHkuIGNhcmVmdWxseSBpcm9uaWMgaG9ja2V5IHBsYXllcnMgc2xlZXAgYmxpdGhlbHkuIGNhcmVmdWxs","upper_bound":"IHNseWx5IGV4cHJlc3MgYXN5bXB0b3Rlcy4gcmVndWxhciBkZXBvc2l0cyBoYWdnbGUgc2x5bHkuIGNhcmVmdWxseSBpcm9uaWMgaG9ja2V5IHBsYXllcnMgc2xlZXAgYmxpdGhlbHkuIGNhcmVmdWxs","repeats":1},{"count":5,"lower_bound":"YWwgZm94ZXMgcHJvbWlzZSBzbHlseSBhY2NvcmRpbmcgdG8gdGhlIHJlZ3VsYXIgYWNjb3VudHMuIGJvbGQgcmVxdWVzdHMgYWxvbg==","upper_bound":"YWwgZm94ZXMgcHJvbWlzZSBzbHlseSBhY2NvcmRpbmcgdG8gdGhlIHJlZ3VsYXIgYWNjb3VudHMuIGJvbGQgcmVxdWVzdHMgYWxvbg==","repeats":1},{"count":6,"lower_bound":"YyBkZXBlbmRlbmNpZXMuIGZ1cmlvdXNseSBleHByZXNzIG5vdG9ybmlzIHNsZWVwIHNseWx5IHJlZ3VsYXIgYWNjb3VudHMuIGlkZWFzIHNsZWVwLiBkZXBvcw==","upper_bound":"YyBkZXBlbmRlbmNpZXMuIGZ1cmlvdXNseSBleHByZXNzIG5vdG9ybmlzIHNsZWVwIHNseWx5IHJlZ3VsYXIgYWNjb3VudHMuIGlkZWFzIHNsZWVwLiBkZXBvcw==","repeats":1},{"count":7,"lower_bound":"ZWFucyBib29zdCBjYXJlZnVsbHkgc3BlY2lhbCByZXF1ZXN0cy4gYWNjb3VudHMgYXJlLiBjYXJlZnVsbA==","upper_bound":"ZWFucyBib29zdCBjYXJlZnVsbHkgc3BlY2lhbCByZXF1ZXN0cy4gYWNjb3VudHMgYXJlLiBjYXJlZnVsbA==","repeats":1},{"count":8,"lower_bound":"ZWFzIGhhbmcgaXJvbmljLCBzaWxlbnQgcGFja2FnZXMuIHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIGZ1cmlvdXNseSBvdmVyIHRoZSB0aXRoZXMuIGZsdWZmaWx5IGJvbGQ=","upper_bound":"ZWFzIGhhbmcgaXJvbmljLCBzaWxlbnQgcGFja2FnZXMuIHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIGZ1cmlvdXNseSBvdmVyIHRoZSB0aXRoZXMuIGZsdWZmaWx5IGJvbGQ=","repeats":1},{"count":9,"lower_bound":"ZWZ1bGx5IGFsb25nc2lkZSBvZiB0aGUgc2x5bHkgZmluYWwgZGVwZW5kZW5jaWVzLiA=","upper_bound":"ZWZ1bGx5IGFsb25nc2lkZSBvZiB0aGUgc2x5bHkgZmluYWwgZGVwZW5kZW5jaWVzLiA=","repeats":1},{"count":10,"lower_bound":"aGVseSBlbnRpY2luZ2x5IGV4cHJlc3MgYWNjb3VudHMuIGV2ZW4sIGZpbmFsIA==","upper_bound":"aGVseSBlbnRpY2luZ2x5IGV4cHJlc3MgYWNjb3VudHMuIGV2ZW4sIGZpbmFsIA==","repeats":1},{"count":11,"lower_bound":"aWMgZGVwb3NpdHMgYXJlIGJsaXRoZWx5IGFib3V0IHRoZSBjYXJlZnVsbHkgcmVndWxhciBwYQ==","upper_bound":"aWMgZGVwb3NpdHMgYXJlIGJsaXRoZWx5IGFib3V0IHRoZSBjYXJlZnVsbHkgcmVndWxhciBwYQ==","repeats":1},{"count":12,"lower_bound":"bCBwbGF0ZWxldHMuIHJlZ3VsYXIgYWNjb3VudHMgeC1yYXk6IHVudXN1YWwsIHJlZ3VsYXIgYWNjbw==","upper_bound":"bCBwbGF0ZWxldHMuIHJlZ3VsYXIgYWNjb3VudHMgeC1yYXk6IHVudXN1YWwsIHJlZ3VsYXIgYWNjbw==","repeats":1},{"count":13,"lower_bound":"bmljIGRlcG9zaXRzIGJvb3N0IGF0b3AgdGhlIHF1aWNrbHkgZmluYWwgcmVxdWVzdHM/IHF1aWNrbHkgcmVndWxh","upper_bound":"bmljIGRlcG9zaXRzIGJvb3N0IGF0b3AgdGhlIHF1aWNrbHkgZmluYWwgcmVxdWVzdHM/IHF1aWNrbHkgcmVndWxh","repeats":1},{"count":14,"lower_bound":"b3VzbHkuIGZpbmFsLCBleHByZXNzIGdpZnRzIGNham9sZSBh","upper_bound":"b3VzbHkuIGZpbmFsLCBleHByZXNzIGdpZnRzIGNham9sZSBh","repeats":1},{"count":15,"lower_bound":"cGxhdGVsZXRzLiBibGl0aGVseSBwZW5kaW5nIGRlcGVuZGVuY2llcyB1c2UgZmx1ZmZpbHkgYWNyb3NzIHRoZSBldmVuIHBpbnRvIGJlYW5zLiBjYXJlZnVsbHkgc2lsZW50IGFjY291bg==","upper_bound":"cGxhdGVsZXRzLiBibGl0aGVseSBwZW5kaW5nIGRlcGVuZGVuY2llcyB1c2UgZmx1ZmZpbHkgYWNyb3NzIHRoZSBldmVuIHBpbnRvIGJlYW5zLiBjYXJlZnVsbHkgc2lsZW50IGFjY291bg==","repeats":1},{"count":16,"lower_bound":"cmVmdWxseSBmaW5hbCByZXF1ZXN0cy4gcmVndWxhciwgaXJvbmk=","upper_bound":"cmVmdWxseSBmaW5hbCByZXF1ZXN0cy4gcmVndWxhciwgaXJvbmk=","repeats":1},{"count":17,"lower_bound":"cm5zLiBibGl0aGVseSBib2xkIGNvdXJ0cyBhbW9uZyB0aGUgY2xvc2VseSByZWd1bGFyIHBhY2thZ2VzIHVzZSBmdXJpb3VzbHkgYm9sZCBwbGF0ZWxldHM/","upper_bound":"cm5zLiBibGl0aGVseSBib2xkIGNvdXJ0cyBhbW9uZyB0aGUgY2xvc2VseSByZWd1bGFyIHBhY2thZ2VzIHVzZSBmdXJpb3VzbHkgYm9sZCBwbGF0ZWxldHM/","repeats":1},{"count":18,"lower_bound":"cy4gaXJvbmljLCB1bnVzdWFsIGFzeW1wdG90ZXMgd2FrZSBibGl0aGVseSBy","upper_bound":"cy4gaXJvbmljLCB1bnVzdWFsIGFzeW1wdG90ZXMgd2FrZSBibGl0aGVseSBy","repeats":1},{"count":19,"lower_bound":"c3MgZXhjdXNlcyBjYWpvbGUgc2x5bHkgYWNyb3NzIHRoZSBwYWNrYWdlcy4gZGVwb3NpdHMgcHJpbnQgYXJvdW4=","upper_bound":"c3MgZXhjdXNlcyBjYWpvbGUgc2x5bHkgYWNyb3NzIHRoZSBwYWNrYWdlcy4gZGVwb3NpdHMgcHJpbnQgYXJvdW4=","repeats":1},{"count":20,"lower_bound":"dHMuIHNpbGVudCByZXF1ZXN0cyBoYWdnbGUuIGNsb3NlbHkgZXhwcmVzcyBwYWNrYWdlcyBzbGVlcCBhY3Jvc3MgdGhlIGJsaXRoZWx5","upper_bound":"dHMuIHNpbGVudCByZXF1ZXN0cyBoYWdnbGUuIGNsb3NlbHkgZXhwcmVzcyBwYWNrYWdlcyBzbGVlcCBhY3Jvc3MgdGhlIGJsaXRoZWx5","repeats":1},{"count":21,"lower_bound":"dWxhciBhc3ltcHRvdGVzIGFyZSBhYm91dCB0aGUgZnVyaW91cyBtdWx0aXBsaWVycy4gZXhwcmVzcyBkZXBlbmRlbmNpZXMgbmFnIGFib3ZlIHRoZSBpcm9uaWNhbGx5IGlyb25pYyBhY2NvdW50","upper_bound":"dWxhciBhc3ltcHRvdGVzIGFyZSBhYm91dCB0aGUgZnVyaW91cyBtdWx0aXBsaWVycy4gZXhwcmVzcyBkZXBlbmRlbmNpZXMgbmFnIGFib3ZlIHRoZSBpcm9uaWNhbGx5IGlyb25pYyBhY2NvdW50","repeats":1},{"count":22,"lower_bound":"dmVuIHBhY2thZ2VzIHdha2UgcXVpY2tseS4gcmVndQ==","upper_bound":"dmVuIHBhY2thZ2VzIHdha2UgcXVpY2tseS4gcmVndQ==","repeats":1},{"count":23,"lower_bound":"eSBhYm92ZSB0aGUgY2FyZWZ1bGx5IHVudXN1YWwgdGhlb2RvbGl0ZXMuIGZpbmFsIGR1Z291dHMgYXJlIHF1aWNrbHkgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBk","upper_bound":"eSBhYm92ZSB0aGUgY2FyZWZ1bGx5IHVudXN1YWwgdGhlb2RvbGl0ZXMuIGZpbmFsIGR1Z291dHMgYXJlIHF1aWNrbHkgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBk","repeats":1},{"count":24,"lower_bound":"eSBhbG9uZ3NpZGUgb2YgdGhlIHBlbmRpbmcgZGVwb3NpdHMuIGNhcmVmdWxseSBzcGVjaWFsIHBhY2thZ2VzIGFyZSBhYm91dCB0aGUgaXJvbmljIGZvcmdlcy4gc2x5bHkgc3BlY2lhbCA=","upper_bound":"eSBhbG9uZ3NpZGUgb2YgdGhlIHBlbmRpbmcgZGVwb3NpdHMuIGNhcmVmdWxseSBzcGVjaWFsIHBhY2thZ2VzIGFyZSBhYm91dCB0aGUgaXJvbmljIGZvcmdlcy4gc2x5bHkgc3BlY2lhbCA=","repeats":1},{"count":25,"lower_bound":"eSBmaW5hbCBwYWNrYWdlcy4gc2xvdyBmb3hlcyBjYWpvbGUgcXVpY2tseS4gcXVpY2tseSBzaWxlbnQgcGxhdGVsZXRzIGJyZWFjaCBpcm9uaWMgYWNjb3VudHMuIHVudXN1YWwgcGludG8gYmU=","upper_bound":"eSBmaW5hbCBwYWNrYWdlcy4gc2xvdyBmb3hlcyBjYWpvbGUgcXVpY2tseS4gcXVpY2tseSBzaWxlbnQgcGxhdGVsZXRzIGJyZWFjaCBpcm9uaWMgYWNjb3VudHMuIHVudXN1YWwgcGludG8gYmU=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":1922,"last_update_version":401695327690424324},"n_name":{"histogram":{"ndv":25,"buckets":[{"count":1,"lower_bound":"QUxHRVJJQQ==","upper_bound":"QUxHRVJJQQ==","repeats":1},{"count":2,"lower_bound":"QVJHRU5USU5B","upper_bound":"QVJHRU5USU5B","repeats":1},{"count":3,"lower_bound":"QlJBWklM","upper_bound":"QlJBWklM","repeats":1},{"count":4,"lower_bound":"Q0FOQURB","upper_bound":"Q0FOQURB","repeats":1},{"count":5,"lower_bound":"Q0hJTkE=","upper_bound":"Q0hJTkE=","repeats":1},{"count":6,"lower_bound":"RUdZUFQ=","upper_bound":"RUdZUFQ=","repeats":1},{"count":7,"lower_bound":"RVRISU9QSUE=","upper_bound":"RVRISU9QSUE=","repeats":1},{"count":8,"lower_bound":"RlJBTkNF","upper_bound":"RlJBTkNF","repeats":1},{"count":9,"lower_bound":"R0VSTUFOWQ==","upper_bound":"R0VSTUFOWQ==","repeats":1},{"count":10,"lower_bound":"SU5ESUE=","upper_bound":"SU5ESUE=","repeats":1},{"count":11,"lower_bound":"SU5ET05FU0lB","upper_bound":"SU5ET05FU0lB","repeats":1},{"count":12,"lower_bound":"SVJBTg==","upper_bound":"SVJBTg==","repeats":1},{"count":13,"lower_bound":"SVJBUQ==","upper_bound":"SVJBUQ==","repeats":1},{"count":14,"lower_bound":"SkFQQU4=","upper_bound":"SkFQQU4=","repeats":1},{"count":15,"lower_bound":"Sk9SREFO","upper_bound":"Sk9SREFO","repeats":1},{"count":16,"lower_bound":"S0VOWUE=","upper_bound":"S0VOWUE=","repeats":1},{"count":17,"lower_bound":"TU9ST0NDTw==","upper_bound":"TU9ST0NDTw==","repeats":1},{"count":18,"lower_bound":"TU9aQU1CSVFVRQ==","upper_bound":"TU9aQU1CSVFVRQ==","repeats":1},{"count":19,"lower_bound":"UEVSVQ==","upper_bound":"UEVSVQ==","repeats":1},{"count":20,"lower_bound":"Uk9NQU5JQQ==","upper_bound":"Uk9NQU5JQQ==","repeats":1},{"count":21,"lower_bound":"UlVTU0lB","upper_bound":"UlVTU0lB","repeats":1},{"count":22,"lower_bound":"U0FVREkgQVJBQklB","upper_bound":"U0FVREkgQVJBQklB","repeats":1},{"count":23,"lower_bound":"VU5JVEVEIEtJTkdET00=","upper_bound":"VU5JVEVEIEtJTkdET00=","repeats":1},{"count":24,"lower_bound":"VU5JVEVEIFNUQVRFUw==","upper_bound":"VU5JVEVEIFNUQVRFUw==","repeats":1},{"count":25,"lower_bound":"VklFVE5BTQ==","upper_bound":"VklFVE5BTQ==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":227,"last_update_version":401695327677317121},"n_nationkey":{"histogram":{"ndv":25,"buckets":[{"count":1,"lower_bound":"MA==","upper_bound":"MA==","repeats":1},{"count":2,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1},{"count":3,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":1},{"count":4,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":1},{"count":5,"lower_bound":"NA==","upper_bound":"NA==","repeats":1},{"count":6,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":1},{"count":7,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":1},{"count":8,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":1},{"count":9,"lower_bound":"OA==","upper_bound":"OA==","repeats":1},{"count":10,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":1},{"count":11,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":1},{"count":12,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":1},{"count":13,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":1},{"count":14,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":1},{"count":15,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":1},{"count":16,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":1},{"count":17,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":1},{"count":18,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":1},{"count":19,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":1},{"count":20,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":1},{"count":21,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":1},{"count":22,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":1},{"count":23,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":1},{"count":24,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":1},{"count":25,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695327493816321},"n_regionkey":{"histogram":{"ndv":5,"buckets":[{"count":5,"lower_bound":"MA==","upper_bound":"MA==","repeats":5},{"count":10,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":5},{"count":15,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":5},{"count":20,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":5},{"count":25,"lower_bound":"NA==","upper_bound":"NA==","repeats":5}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":50,"last_update_version":401695327690424322}},"indices":{},"count":25,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/orders.json b/cmd/explaintest/s/tpch_stats/orders.json deleted file mode 100644 index b5159dc25107c..0000000000000 --- a/cmd/explaintest/s/tpch_stats/orders.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"orders","columns":{"o_clerk":{"histogram":{"ndv":49832,"buckets":[{"count":300000,"lower_bound":"Q2xlcmsjMDAwMDAwMDAy","upper_bound":"Q2xlcmsjMDAwMDAwMjE5","repeats":9005},{"count":600000,"lower_bound":"Q2xlcmsjMDAwMDAwMjMx","upper_bound":"Q2xlcmsjMDAwMDAwNDEx","repeats":1505},{"count":900000,"lower_bound":"Q2xlcmsjMDAwMDAwNDE5","upper_bound":"Q2xlcmsjMDAwMDAwNjI3","repeats":1505},{"count":1200000,"lower_bound":"Q2xlcmsjMDAwMDAwNjM1","upper_bound":"Q2xlcmsjMDAwMDAwNzQ0","repeats":1505},{"count":1500000,"lower_bound":"Q2xlcmsjMDAwMDAwNzQ3","upper_bound":"Q2xlcmsjMDAwMDAwOTA4","repeats":1505},{"count":1800000,"lower_bound":"Q2xlcmsjMDAwMDAwOTA5","upper_bound":"Q2xlcmsjMDAwMDAxMDc2","repeats":1505},{"count":2100000,"lower_bound":"Q2xlcmsjMDAwMDAxMDgz","upper_bound":"Q2xlcmsjMDAwMDAxMzQ1","repeats":1505},{"count":2400000,"lower_bound":"Q2xlcmsjMDAwMDAxMzQ2","upper_bound":"Q2xlcmsjMDAwMDAxNjA4","repeats":1505},{"count":2700000,"lower_bound":"Q2xlcmsjMDAwMDAxNjI1","upper_bound":"Q2xlcmsjMDAwMDAxODcx","repeats":1505},{"count":3007500,"lower_bound":"Q2xlcmsjMDAwMDAxODcy","upper_bound":"Q2xlcmsjMDAwMDAyMTA0","repeats":9005},{"count":3307500,"lower_bound":"Q2xlcmsjMDAwMDAyMTE3","upper_bound":"Q2xlcmsjMDAwMDAyMzAz","repeats":1505},{"count":3615000,"lower_bound":"Q2xlcmsjMDAwMDAyMzA3","upper_bound":"Q2xlcmsjMDAwMDAyNTI1","repeats":16505},{"count":3915000,"lower_bound":"Q2xlcmsjMDAwMDAyNTI3","upper_bound":"Q2xlcmsjMDAwMDAyNjk0","repeats":1505},{"count":4215000,"lower_bound":"Q2xlcmsjMDAwMDAyNjk3","upper_bound":"Q2xlcmsjMDAwMDAyOTEy","repeats":1505},{"count":4515000,"lower_bound":"Q2xlcmsjMDAwMDAyOTEz","upper_bound":"Q2xlcmsjMDAwMDAzMTQ0","repeats":1505},{"count":4815000,"lower_bound":"Q2xlcmsjMDAwMDAzMTQ2","upper_bound":"Q2xlcmsjMDAwMDAzMzQ5","repeats":1505},{"count":5115000,"lower_bound":"Q2xlcmsjMDAwMDAzMzUw","upper_bound":"Q2xlcmsjMDAwMDAzNjI5","repeats":1505},{"count":5415000,"lower_bound":"Q2xlcmsjMDAwMDAzNjM5","upper_bound":"Q2xlcmsjMDAwMDAzODkw","repeats":1505},{"count":5715000,"lower_bound":"Q2xlcmsjMDAwMDAzODkx","upper_bound":"Q2xlcmsjMDAwMDA0MTA3","repeats":1505},{"count":6015000,"lower_bound":"Q2xlcmsjMDAwMDA0MTA4","upper_bound":"Q2xlcmsjMDAwMDA0MzM2","repeats":1505},{"count":6315000,"lower_bound":"Q2xlcmsjMDAwMDA0MzM4","upper_bound":"Q2xlcmsjMDAwMDA0NTIx","repeats":1505},{"count":6615000,"lower_bound":"Q2xlcmsjMDAwMDA0NTIz","upper_bound":"Q2xlcmsjMDAwMDA0NzA5","repeats":1505},{"count":6915000,"lower_bound":"Q2xlcmsjMDAwMDA0NzE1","upper_bound":"Q2xlcmsjMDAwMDA0OTE4","repeats":1505},{"count":7215000,"lower_bound":"Q2xlcmsjMDAwMDA0OTI3","upper_bound":"Q2xlcmsjMDAwMDA1MTI0","repeats":1505},{"count":7522500,"lower_bound":"Q2xlcmsjMDAwMDA1MTI2","upper_bound":"Q2xlcmsjMDAwMDA1Mjg3","repeats":9005},{"count":7822500,"lower_bound":"Q2xlcmsjMDAwMDA1Mjg4","upper_bound":"Q2xlcmsjMDAwMDA1NTA5","repeats":1505},{"count":8122500,"lower_bound":"Q2xlcmsjMDAwMDA1NTEz","upper_bound":"Q2xlcmsjMDAwMDA1NzA3","repeats":1505},{"count":8422500,"lower_bound":"Q2xlcmsjMDAwMDA1NzEw","upper_bound":"Q2xlcmsjMDAwMDA1OTA0","repeats":1505},{"count":8722500,"lower_bound":"Q2xlcmsjMDAwMDA1OTA1","upper_bound":"Q2xlcmsjMDAwMDA2MjIz","repeats":1505},{"count":9022500,"lower_bound":"Q2xlcmsjMDAwMDA2MjI0","upper_bound":"Q2xlcmsjMDAwMDA2Mzkw","repeats":9005},{"count":9322500,"lower_bound":"Q2xlcmsjMDAwMDA2Mzk1","upper_bound":"Q2xlcmsjMDAwMDA2NTcy","repeats":1505},{"count":9622500,"lower_bound":"Q2xlcmsjMDAwMDA2NTc0","upper_bound":"Q2xlcmsjMDAwMDA2NzUz","repeats":1505},{"count":9922500,"lower_bound":"Q2xlcmsjMDAwMDA2NzYx","upper_bound":"Q2xlcmsjMDAwMDA2OTQx","repeats":1505},{"count":10222500,"lower_bound":"Q2xlcmsjMDAwMDA2OTQy","upper_bound":"Q2xlcmsjMDAwMDA3MDk2","repeats":9005},{"count":10522500,"lower_bound":"Q2xlcmsjMDAwMDA3MTAx","upper_bound":"Q2xlcmsjMDAwMDA3Mjk5","repeats":1505},{"count":10822500,"lower_bound":"Q2xlcmsjMDAwMDA3MzAy","upper_bound":"Q2xlcmsjMDAwMDA3NDk2","repeats":1505},{"count":11122500,"lower_bound":"Q2xlcmsjMDAwMDA3NTA4","upper_bound":"Q2xlcmsjMDAwMDA3NzY0","repeats":1505},{"count":11430000,"lower_bound":"Q2xlcmsjMDAwMDA3NzY3","upper_bound":"Q2xlcmsjMDAwMDA3OTMy","repeats":9005},{"count":11730000,"lower_bound":"Q2xlcmsjMDAwMDA3OTM3","upper_bound":"Q2xlcmsjMDAwMDA4MDky","repeats":1505},{"count":12030000,"lower_bound":"Q2xlcmsjMDAwMDA4MDkz","upper_bound":"Q2xlcmsjMDAwMDA4MzI0","repeats":1505},{"count":12330000,"lower_bound":"Q2xlcmsjMDAwMDA4MzMw","upper_bound":"Q2xlcmsjMDAwMDA4NTE1","repeats":1505},{"count":12630000,"lower_bound":"Q2xlcmsjMDAwMDA4NTE3","upper_bound":"Q2xlcmsjMDAwMDA4NzI0","repeats":1505},{"count":12930000,"lower_bound":"Q2xlcmsjMDAwMDA4NzI1","upper_bound":"Q2xlcmsjMDAwMDA4OTA5","repeats":1505},{"count":13230000,"lower_bound":"Q2xlcmsjMDAwMDA4OTI2","upper_bound":"Q2xlcmsjMDAwMDA5MDY5","repeats":1505},{"count":13530000,"lower_bound":"Q2xlcmsjMDAwMDA5MDc0","upper_bound":"Q2xlcmsjMDAwMDA5MjQw","repeats":1505},{"count":13830000,"lower_bound":"Q2xlcmsjMDAwMDA5MjQx","upper_bound":"Q2xlcmsjMDAwMDA5NDgx","repeats":1505},{"count":14130000,"lower_bound":"Q2xlcmsjMDAwMDA5NDky","upper_bound":"Q2xlcmsjMDAwMDA5NjYy","repeats":1505},{"count":14437500,"lower_bound":"Q2xlcmsjMDAwMDA5NjY4","upper_bound":"Q2xlcmsjMDAwMDA5ODcx","repeats":9005},{"count":14737500,"lower_bound":"Q2xlcmsjMDAwMDA5ODc0","upper_bound":"Q2xlcmsjMDAwMDEwMDQ0","repeats":1505},{"count":15045000,"lower_bound":"Q2xlcmsjMDAwMDEwMDQ3","upper_bound":"Q2xlcmsjMDAwMDEwMjQ2","repeats":9005},{"count":15352500,"lower_bound":"Q2xlcmsjMDAwMDEwMjY0","upper_bound":"Q2xlcmsjMDAwMDEwNDY2","repeats":9005},{"count":15652500,"lower_bound":"Q2xlcmsjMDAwMDEwNDY3","upper_bound":"Q2xlcmsjMDAwMDEwNjYx","repeats":1505},{"count":15952500,"lower_bound":"Q2xlcmsjMDAwMDEwNjY2","upper_bound":"Q2xlcmsjMDAwMDEwODUy","repeats":1505},{"count":16252500,"lower_bound":"Q2xlcmsjMDAwMDEwODUz","upper_bound":"Q2xlcmsjMDAwMDExMDU2","repeats":1505},{"count":16552500,"lower_bound":"Q2xlcmsjMDAwMDExMDY1","upper_bound":"Q2xlcmsjMDAwMDExMjU3","repeats":9005},{"count":16860000,"lower_bound":"Q2xlcmsjMDAwMDExMjU4","upper_bound":"Q2xlcmsjMDAwMDExNDQ3","repeats":9005},{"count":17160000,"lower_bound":"Q2xlcmsjMDAwMDExNDUx","upper_bound":"Q2xlcmsjMDAwMDExNTc5","repeats":1505},{"count":17460000,"lower_bound":"Q2xlcmsjMDAwMDExNTkw","upper_bound":"Q2xlcmsjMDAwMDExNzM2","repeats":1505},{"count":17760000,"lower_bound":"Q2xlcmsjMDAwMDExNzM4","upper_bound":"Q2xlcmsjMDAwMDExOTM5","repeats":1505},{"count":18060000,"lower_bound":"Q2xlcmsjMDAwMDExOTQw","upper_bound":"Q2xlcmsjMDAwMDEyMTY5","repeats":1505},{"count":18360000,"lower_bound":"Q2xlcmsjMDAwMDEyMTgz","upper_bound":"Q2xlcmsjMDAwMDEyMzg1","repeats":1505},{"count":18660000,"lower_bound":"Q2xlcmsjMDAwMDEyMzg5","upper_bound":"Q2xlcmsjMDAwMDEyNTk0","repeats":1505},{"count":18960000,"lower_bound":"Q2xlcmsjMDAwMDEyNjAy","upper_bound":"Q2xlcmsjMDAwMDEyNzk4","repeats":1505},{"count":19260000,"lower_bound":"Q2xlcmsjMDAwMDEyODA0","upper_bound":"Q2xlcmsjMDAwMDEyOTk1","repeats":1505},{"count":19560000,"lower_bound":"Q2xlcmsjMDAwMDEyOTk2","upper_bound":"Q2xlcmsjMDAwMDEzMjAw","repeats":1505},{"count":19860000,"lower_bound":"Q2xlcmsjMDAwMDEzMjA1","upper_bound":"Q2xlcmsjMDAwMDEzNDE5","repeats":1505},{"count":20160000,"lower_bound":"Q2xlcmsjMDAwMDEzNDI0","upper_bound":"Q2xlcmsjMDAwMDEzNTk0","repeats":1505},{"count":20460000,"lower_bound":"Q2xlcmsjMDAwMDEzNTk1","upper_bound":"Q2xlcmsjMDAwMDEzNzcy","repeats":1505},{"count":20760000,"lower_bound":"Q2xlcmsjMDAwMDEzNzkz","upper_bound":"Q2xlcmsjMDAwMDEzOTc0","repeats":1505},{"count":21060000,"lower_bound":"Q2xlcmsjMDAwMDEzOTg4","upper_bound":"Q2xlcmsjMDAwMDE0MTY2","repeats":1505},{"count":21360000,"lower_bound":"Q2xlcmsjMDAwMDE0MTY5","upper_bound":"Q2xlcmsjMDAwMDE0Mzk2","repeats":1505},{"count":21667500,"lower_bound":"Q2xlcmsjMDAwMDE0Mzk3","upper_bound":"Q2xlcmsjMDAwMDE0NjA4","repeats":9005},{"count":21967500,"lower_bound":"Q2xlcmsjMDAwMDE0NjEy","upper_bound":"Q2xlcmsjMDAwMDE0ODM2","repeats":1505},{"count":22267500,"lower_bound":"Q2xlcmsjMDAwMDE0ODM4","upper_bound":"Q2xlcmsjMDAwMDE1MTI2","repeats":1505},{"count":22567500,"lower_bound":"Q2xlcmsjMDAwMDE1MTQw","upper_bound":"Q2xlcmsjMDAwMDE1MzEw","repeats":1505},{"count":22867500,"lower_bound":"Q2xlcmsjMDAwMDE1MzI0","upper_bound":"Q2xlcmsjMDAwMDE1NDgz","repeats":1505},{"count":23167500,"lower_bound":"Q2xlcmsjMDAwMDE1NDg4","upper_bound":"Q2xlcmsjMDAwMDE1NjI2","repeats":1505},{"count":23467500,"lower_bound":"Q2xlcmsjMDAwMDE1NjI5","upper_bound":"Q2xlcmsjMDAwMDE1Nzg5","repeats":1505},{"count":23775000,"lower_bound":"Q2xlcmsjMDAwMDE1ODE0","upper_bound":"Q2xlcmsjMDAwMDE1OTk3","repeats":9005},{"count":24075000,"lower_bound":"Q2xlcmsjMDAwMDE2MDAx","upper_bound":"Q2xlcmsjMDAwMDE2MjIz","repeats":1505},{"count":24375000,"lower_bound":"Q2xlcmsjMDAwMDE2MjI0","upper_bound":"Q2xlcmsjMDAwMDE2MzQ5","repeats":1505},{"count":24675000,"lower_bound":"Q2xlcmsjMDAwMDE2MzU4","upper_bound":"Q2xlcmsjMDAwMDE2NTcw","repeats":1505},{"count":24975000,"lower_bound":"Q2xlcmsjMDAwMDE2NTcx","upper_bound":"Q2xlcmsjMDAwMDE2NzU2","repeats":1505},{"count":25275000,"lower_bound":"Q2xlcmsjMDAwMDE2NzYw","upper_bound":"Q2xlcmsjMDAwMDE2OTM4","repeats":1505},{"count":25575000,"lower_bound":"Q2xlcmsjMDAwMDE2OTQw","upper_bound":"Q2xlcmsjMDAwMDE3MTM4","repeats":1505},{"count":25875000,"lower_bound":"Q2xlcmsjMDAwMDE3MTUy","upper_bound":"Q2xlcmsjMDAwMDE3MzI4","repeats":1505},{"count":26175000,"lower_bound":"Q2xlcmsjMDAwMDE3MzMx","upper_bound":"Q2xlcmsjMDAwMDE3NTE0","repeats":1505},{"count":26475000,"lower_bound":"Q2xlcmsjMDAwMDE3NTIw","upper_bound":"Q2xlcmsjMDAwMDE3NzY1","repeats":1505},{"count":26775000,"lower_bound":"Q2xlcmsjMDAwMDE3Nzcx","upper_bound":"Q2xlcmsjMDAwMDE4MDEz","repeats":1505},{"count":27075000,"lower_bound":"Q2xlcmsjMDAwMDE4MDE2","upper_bound":"Q2xlcmsjMDAwMDE4MjM3","repeats":9005},{"count":27375000,"lower_bound":"Q2xlcmsjMDAwMDE4MjM4","upper_bound":"Q2xlcmsjMDAwMDE4NDUw","repeats":1505},{"count":27675000,"lower_bound":"Q2xlcmsjMDAwMDE4NDUy","upper_bound":"Q2xlcmsjMDAwMDE4NjA5","repeats":1505},{"count":27975000,"lower_bound":"Q2xlcmsjMDAwMDE4NjE3","upper_bound":"Q2xlcmsjMDAwMDE4ODUw","repeats":1505},{"count":28275000,"lower_bound":"Q2xlcmsjMDAwMDE4ODUy","upper_bound":"Q2xlcmsjMDAwMDE4OTk2","repeats":9005},{"count":28582500,"lower_bound":"Q2xlcmsjMDAwMDE5MDA4","upper_bound":"Q2xlcmsjMDAwMDE5MjUw","repeats":9005},{"count":28882500,"lower_bound":"Q2xlcmsjMDAwMDE5MjUz","upper_bound":"Q2xlcmsjMDAwMDE5NDYy","repeats":1505},{"count":29182500,"lower_bound":"Q2xlcmsjMDAwMDE5NDY2","upper_bound":"Q2xlcmsjMDAwMDE5NjEw","repeats":1505},{"count":29482500,"lower_bound":"Q2xlcmsjMDAwMDE5NjE2","upper_bound":"Q2xlcmsjMDAwMDE5Nzg1","repeats":1505},{"count":29782500,"lower_bound":"Q2xlcmsjMDAwMDE5Nzg5","upper_bound":"Q2xlcmsjMDAwMDE5OTcz","repeats":1505},{"count":30082500,"lower_bound":"Q2xlcmsjMDAwMDE5OTg0","upper_bound":"Q2xlcmsjMDAwMDIwMTk2","repeats":1505},{"count":30382500,"lower_bound":"Q2xlcmsjMDAwMDIwMjA4","upper_bound":"Q2xlcmsjMDAwMDIwMzgy","repeats":1505},{"count":30682500,"lower_bound":"Q2xlcmsjMDAwMDIwMzgz","upper_bound":"Q2xlcmsjMDAwMDIwNTIz","repeats":9005},{"count":30982500,"lower_bound":"Q2xlcmsjMDAwMDIwNTI5","upper_bound":"Q2xlcmsjMDAwMDIwNzIx","repeats":1505},{"count":31282500,"lower_bound":"Q2xlcmsjMDAwMDIwNzI0","upper_bound":"Q2xlcmsjMDAwMDIwOTI4","repeats":1505},{"count":31582500,"lower_bound":"Q2xlcmsjMDAwMDIwOTQw","upper_bound":"Q2xlcmsjMDAwMDIxMTYx","repeats":1505},{"count":31882500,"lower_bound":"Q2xlcmsjMDAwMDIxMTcy","upper_bound":"Q2xlcmsjMDAwMDIxMzM0","repeats":1505},{"count":32182500,"lower_bound":"Q2xlcmsjMDAwMDIxMzQw","upper_bound":"Q2xlcmsjMDAwMDIxNTI3","repeats":1505},{"count":32482500,"lower_bound":"Q2xlcmsjMDAwMDIxNTI4","upper_bound":"Q2xlcmsjMDAwMDIxNjg3","repeats":1505},{"count":32782500,"lower_bound":"Q2xlcmsjMDAwMDIxNjkw","upper_bound":"Q2xlcmsjMDAwMDIxODIx","repeats":1505},{"count":33082500,"lower_bound":"Q2xlcmsjMDAwMDIxODI2","upper_bound":"Q2xlcmsjMDAwMDIyMDcy","repeats":1505},{"count":33382500,"lower_bound":"Q2xlcmsjMDAwMDIyMDc3","upper_bound":"Q2xlcmsjMDAwMDIyMjc4","repeats":1505},{"count":33682500,"lower_bound":"Q2xlcmsjMDAwMDIyMjc5","upper_bound":"Q2xlcmsjMDAwMDIyNDYx","repeats":1505},{"count":33982500,"lower_bound":"Q2xlcmsjMDAwMDIyNDY5","upper_bound":"Q2xlcmsjMDAwMDIyNjU5","repeats":1505},{"count":34282500,"lower_bound":"Q2xlcmsjMDAwMDIyNjYx","upper_bound":"Q2xlcmsjMDAwMDIyODQz","repeats":1505},{"count":34582500,"lower_bound":"Q2xlcmsjMDAwMDIyODY4","upper_bound":"Q2xlcmsjMDAwMDIzMDY4","repeats":1505},{"count":34882500,"lower_bound":"Q2xlcmsjMDAwMDIzMDcy","upper_bound":"Q2xlcmsjMDAwMDIzMjcx","repeats":1505},{"count":35190000,"lower_bound":"Q2xlcmsjMDAwMDIzMjg0","upper_bound":"Q2xlcmsjMDAwMDIzNDY5","repeats":9005},{"count":35490000,"lower_bound":"Q2xlcmsjMDAwMDIzNDgz","upper_bound":"Q2xlcmsjMDAwMDIzNzM0","repeats":1505},{"count":35790000,"lower_bound":"Q2xlcmsjMDAwMDIzNzM3","upper_bound":"Q2xlcmsjMDAwMDIzOTQx","repeats":1505},{"count":36090000,"lower_bound":"Q2xlcmsjMDAwMDIzOTQz","upper_bound":"Q2xlcmsjMDAwMDI0MDc4","repeats":1505},{"count":36390000,"lower_bound":"Q2xlcmsjMDAwMDI0MDg0","upper_bound":"Q2xlcmsjMDAwMDI0MzAx","repeats":1505},{"count":36690000,"lower_bound":"Q2xlcmsjMDAwMDI0MzAy","upper_bound":"Q2xlcmsjMDAwMDI0NDY4","repeats":9005},{"count":37005000,"lower_bound":"Q2xlcmsjMDAwMDI0NDcx","upper_bound":"Q2xlcmsjMDAwMDI0NjU1","repeats":16505},{"count":37305000,"lower_bound":"Q2xlcmsjMDAwMDI0NjU3","upper_bound":"Q2xlcmsjMDAwMDI0ODMy","repeats":1505},{"count":37605000,"lower_bound":"Q2xlcmsjMDAwMDI0ODM3","upper_bound":"Q2xlcmsjMDAwMDI1MDcy","repeats":1505},{"count":37905000,"lower_bound":"Q2xlcmsjMDAwMDI1MDc5","upper_bound":"Q2xlcmsjMDAwMDI1Mjkx","repeats":1505},{"count":38205000,"lower_bound":"Q2xlcmsjMDAwMDI1Mjk4","upper_bound":"Q2xlcmsjMDAwMDI1NDg5","repeats":1505},{"count":38505000,"lower_bound":"Q2xlcmsjMDAwMDI1NDkx","upper_bound":"Q2xlcmsjMDAwMDI1Njc4","repeats":1505},{"count":38805000,"lower_bound":"Q2xlcmsjMDAwMDI1Njg2","upper_bound":"Q2xlcmsjMDAwMDI1OTEy","repeats":9005},{"count":39105000,"lower_bound":"Q2xlcmsjMDAwMDI1OTE3","upper_bound":"Q2xlcmsjMDAwMDI2MTEy","repeats":1505},{"count":39405000,"lower_bound":"Q2xlcmsjMDAwMDI2MTEz","upper_bound":"Q2xlcmsjMDAwMDI2MzEz","repeats":1505},{"count":39705000,"lower_bound":"Q2xlcmsjMDAwMDI2MzE3","upper_bound":"Q2xlcmsjMDAwMDI2NTAw","repeats":1505},{"count":40005000,"lower_bound":"Q2xlcmsjMDAwMDI2NTEw","upper_bound":"Q2xlcmsjMDAwMDI2NzEx","repeats":1505},{"count":40305000,"lower_bound":"Q2xlcmsjMDAwMDI2NzE2","upper_bound":"Q2xlcmsjMDAwMDI2ODY4","repeats":1505},{"count":40605000,"lower_bound":"Q2xlcmsjMDAwMDI2ODgw","upper_bound":"Q2xlcmsjMDAwMDI3MDgx","repeats":1505},{"count":40905000,"lower_bound":"Q2xlcmsjMDAwMDI3MDg3","upper_bound":"Q2xlcmsjMDAwMDI3Mjk2","repeats":1505},{"count":41205000,"lower_bound":"Q2xlcmsjMDAwMDI3MzEz","upper_bound":"Q2xlcmsjMDAwMDI3NDY4","repeats":1505},{"count":41505000,"lower_bound":"Q2xlcmsjMDAwMDI3NDc4","upper_bound":"Q2xlcmsjMDAwMDI3NjI3","repeats":1505},{"count":41805000,"lower_bound":"Q2xlcmsjMDAwMDI3NjMw","upper_bound":"Q2xlcmsjMDAwMDI3ODQz","repeats":1505},{"count":42105000,"lower_bound":"Q2xlcmsjMDAwMDI3ODUz","upper_bound":"Q2xlcmsjMDAwMDI4MDI2","repeats":1505},{"count":42405000,"lower_bound":"Q2xlcmsjMDAwMDI4MDI3","upper_bound":"Q2xlcmsjMDAwMDI4MjAx","repeats":1505},{"count":42705000,"lower_bound":"Q2xlcmsjMDAwMDI4MjA0","upper_bound":"Q2xlcmsjMDAwMDI4MzYw","repeats":1505},{"count":43005000,"lower_bound":"Q2xlcmsjMDAwMDI4MzYy","upper_bound":"Q2xlcmsjMDAwMDI4NTU4","repeats":1505},{"count":43305000,"lower_bound":"Q2xlcmsjMDAwMDI4NTYy","upper_bound":"Q2xlcmsjMDAwMDI4Nzkx","repeats":1505},{"count":43605000,"lower_bound":"Q2xlcmsjMDAwMDI4Nzk5","upper_bound":"Q2xlcmsjMDAwMDI5MDA3","repeats":1505},{"count":43905000,"lower_bound":"Q2xlcmsjMDAwMDI5MDE0","upper_bound":"Q2xlcmsjMDAwMDI5MjE5","repeats":9005},{"count":44205000,"lower_bound":"Q2xlcmsjMDAwMDI5MjMw","upper_bound":"Q2xlcmsjMDAwMDI5NDE1","repeats":1505},{"count":44505000,"lower_bound":"Q2xlcmsjMDAwMDI5NDE2","upper_bound":"Q2xlcmsjMDAwMDI5NjUy","repeats":1505},{"count":44805000,"lower_bound":"Q2xlcmsjMDAwMDI5NjU4","upper_bound":"Q2xlcmsjMDAwMDI5ODY3","repeats":1505},{"count":45105000,"lower_bound":"Q2xlcmsjMDAwMDI5ODc2","upper_bound":"Q2xlcmsjMDAwMDMwMDcw","repeats":1505},{"count":45405000,"lower_bound":"Q2xlcmsjMDAwMDMwMDc5","upper_bound":"Q2xlcmsjMDAwMDMwMjM3","repeats":1505},{"count":45705000,"lower_bound":"Q2xlcmsjMDAwMDMwMjUy","upper_bound":"Q2xlcmsjMDAwMDMwNDU2","repeats":9005},{"count":46005000,"lower_bound":"Q2xlcmsjMDAwMDMwNDU4","upper_bound":"Q2xlcmsjMDAwMDMwNjY3","repeats":1505},{"count":46305000,"lower_bound":"Q2xlcmsjMDAwMDMwNjY4","upper_bound":"Q2xlcmsjMDAwMDMwOTAx","repeats":9005},{"count":46605000,"lower_bound":"Q2xlcmsjMDAwMDMwOTA4","upper_bound":"Q2xlcmsjMDAwMDMxMDIy","repeats":1505},{"count":46905000,"lower_bound":"Q2xlcmsjMDAwMDMxMDMz","upper_bound":"Q2xlcmsjMDAwMDMxMjU1","repeats":1505},{"count":47205000,"lower_bound":"Q2xlcmsjMDAwMDMxMjY5","upper_bound":"Q2xlcmsjMDAwMDMxNDMx","repeats":1505},{"count":47505000,"lower_bound":"Q2xlcmsjMDAwMDMxNDMz","upper_bound":"Q2xlcmsjMDAwMDMxNTkz","repeats":9005},{"count":47812500,"lower_bound":"Q2xlcmsjMDAwMDMxNjAy","upper_bound":"Q2xlcmsjMDAwMDMxODIw","repeats":9005},{"count":48112500,"lower_bound":"Q2xlcmsjMDAwMDMxODM1","upper_bound":"Q2xlcmsjMDAwMDMyMDM1","repeats":1505},{"count":48412500,"lower_bound":"Q2xlcmsjMDAwMDMyMDM2","upper_bound":"Q2xlcmsjMDAwMDMyMjAz","repeats":1505},{"count":48712500,"lower_bound":"Q2xlcmsjMDAwMDMyMjA4","upper_bound":"Q2xlcmsjMDAwMDMyMzg1","repeats":1505},{"count":49012500,"lower_bound":"Q2xlcmsjMDAwMDMyMzky","upper_bound":"Q2xlcmsjMDAwMDMyNjY1","repeats":1505},{"count":49320000,"lower_bound":"Q2xlcmsjMDAwMDMyNjY3","upper_bound":"Q2xlcmsjMDAwMDMyODE4","repeats":16505},{"count":49620000,"lower_bound":"Q2xlcmsjMDAwMDMyODIx","upper_bound":"Q2xlcmsjMDAwMDMzMDA3","repeats":1505},{"count":49920000,"lower_bound":"Q2xlcmsjMDAwMDMzMDEw","upper_bound":"Q2xlcmsjMDAwMDMzMjM0","repeats":1505},{"count":50220000,"lower_bound":"Q2xlcmsjMDAwMDMzMjM1","upper_bound":"Q2xlcmsjMDAwMDMzNDEw","repeats":1505},{"count":50527500,"lower_bound":"Q2xlcmsjMDAwMDMzNDE4","upper_bound":"Q2xlcmsjMDAwMDMzNjEz","repeats":9005},{"count":50827500,"lower_bound":"Q2xlcmsjMDAwMDMzNjE3","upper_bound":"Q2xlcmsjMDAwMDMzODQw","repeats":1505},{"count":51135000,"lower_bound":"Q2xlcmsjMDAwMDMzODQz","upper_bound":"Q2xlcmsjMDAwMDM0MDcz","repeats":9005},{"count":51435000,"lower_bound":"Q2xlcmsjMDAwMDM0MDc2","upper_bound":"Q2xlcmsjMDAwMDM0MjM5","repeats":1505},{"count":51735000,"lower_bound":"Q2xlcmsjMDAwMDM0MjQw","upper_bound":"Q2xlcmsjMDAwMDM0NDI3","repeats":1505},{"count":52035000,"lower_bound":"Q2xlcmsjMDAwMDM0NDM0","upper_bound":"Q2xlcmsjMDAwMDM0NjM2","repeats":1505},{"count":52342500,"lower_bound":"Q2xlcmsjMDAwMDM0NjQw","upper_bound":"Q2xlcmsjMDAwMDM0ODE5","repeats":16505},{"count":52642500,"lower_bound":"Q2xlcmsjMDAwMDM0ODI2","upper_bound":"Q2xlcmsjMDAwMDM1MDI5","repeats":1505},{"count":52950000,"lower_bound":"Q2xlcmsjMDAwMDM1MDMz","upper_bound":"Q2xlcmsjMDAwMDM1MjY3","repeats":9005},{"count":53250000,"lower_bound":"Q2xlcmsjMDAwMDM1MjY4","upper_bound":"Q2xlcmsjMDAwMDM1NDgy","repeats":1505},{"count":53550000,"lower_bound":"Q2xlcmsjMDAwMDM1NDg2","upper_bound":"Q2xlcmsjMDAwMDM1Njk3","repeats":9005},{"count":53850000,"lower_bound":"Q2xlcmsjMDAwMDM1Njk5","upper_bound":"Q2xlcmsjMDAwMDM1ODE2","repeats":1505},{"count":54150000,"lower_bound":"Q2xlcmsjMDAwMDM1ODE4","upper_bound":"Q2xlcmsjMDAwMDM2MDI4","repeats":1505},{"count":54450000,"lower_bound":"Q2xlcmsjMDAwMDM2MDMx","upper_bound":"Q2xlcmsjMDAwMDM2MjE3","repeats":1505},{"count":54750000,"lower_bound":"Q2xlcmsjMDAwMDM2MjIw","upper_bound":"Q2xlcmsjMDAwMDM2NDMz","repeats":9005},{"count":55050000,"lower_bound":"Q2xlcmsjMDAwMDM2NDQx","upper_bound":"Q2xlcmsjMDAwMDM2NTg2","repeats":1505},{"count":55350000,"lower_bound":"Q2xlcmsjMDAwMDM2NTkx","upper_bound":"Q2xlcmsjMDAwMDM2ODI1","repeats":1505},{"count":55650000,"lower_bound":"Q2xlcmsjMDAwMDM2ODI2","upper_bound":"Q2xlcmsjMDAwMDM3MDUx","repeats":1505},{"count":55957500,"lower_bound":"Q2xlcmsjMDAwMDM3MDU0","upper_bound":"Q2xlcmsjMDAwMDM3MTkw","repeats":9005},{"count":56257500,"lower_bound":"Q2xlcmsjMDAwMDM3MTk0","upper_bound":"Q2xlcmsjMDAwMDM3Mzgx","repeats":1505},{"count":56557500,"lower_bound":"Q2xlcmsjMDAwMDM3Mzg4","upper_bound":"Q2xlcmsjMDAwMDM3NTcx","repeats":1505},{"count":56857500,"lower_bound":"Q2xlcmsjMDAwMDM3NTc0","upper_bound":"Q2xlcmsjMDAwMDM3Nzg3","repeats":1505},{"count":57157500,"lower_bound":"Q2xlcmsjMDAwMDM3Nzg5","upper_bound":"Q2xlcmsjMDAwMDM3OTY1","repeats":1505},{"count":57457500,"lower_bound":"Q2xlcmsjMDAwMDM3OTg5","upper_bound":"Q2xlcmsjMDAwMDM4MjMx","repeats":1505},{"count":57757500,"lower_bound":"Q2xlcmsjMDAwMDM4MjM3","upper_bound":"Q2xlcmsjMDAwMDM4NDMz","repeats":1505},{"count":58057500,"lower_bound":"Q2xlcmsjMDAwMDM4NDM2","upper_bound":"Q2xlcmsjMDAwMDM4NjY3","repeats":1505},{"count":58357500,"lower_bound":"Q2xlcmsjMDAwMDM4Njc1","upper_bound":"Q2xlcmsjMDAwMDM4ODQ4","repeats":1505},{"count":58657500,"lower_bound":"Q2xlcmsjMDAwMDM4ODU2","upper_bound":"Q2xlcmsjMDAwMDM5MDc5","repeats":1505},{"count":58957500,"lower_bound":"Q2xlcmsjMDAwMDM5MDgx","upper_bound":"Q2xlcmsjMDAwMDM5MjUy","repeats":1505},{"count":59257500,"lower_bound":"Q2xlcmsjMDAwMDM5MjUz","upper_bound":"Q2xlcmsjMDAwMDM5NDA0","repeats":1505},{"count":59557500,"lower_bound":"Q2xlcmsjMDAwMDM5NDEy","upper_bound":"Q2xlcmsjMDAwMDM5NjI2","repeats":1505},{"count":59857500,"lower_bound":"Q2xlcmsjMDAwMDM5NjI4","upper_bound":"Q2xlcmsjMDAwMDM5Nzc5","repeats":9005},{"count":60157500,"lower_bound":"Q2xlcmsjMDAwMDM5Nzg2","upper_bound":"Q2xlcmsjMDAwMDQwMDE1","repeats":1505},{"count":60457500,"lower_bound":"Q2xlcmsjMDAwMDQwMDI1","upper_bound":"Q2xlcmsjMDAwMDQwMjA0","repeats":1505},{"count":60757500,"lower_bound":"Q2xlcmsjMDAwMDQwMjA4","upper_bound":"Q2xlcmsjMDAwMDQwMzcx","repeats":1505},{"count":61057500,"lower_bound":"Q2xlcmsjMDAwMDQwMzc2","upper_bound":"Q2xlcmsjMDAwMDQwNTcy","repeats":1505},{"count":61357500,"lower_bound":"Q2xlcmsjMDAwMDQwNTc5","upper_bound":"Q2xlcmsjMDAwMDQwNzY3","repeats":9005},{"count":61657500,"lower_bound":"Q2xlcmsjMDAwMDQwNzY4","upper_bound":"Q2xlcmsjMDAwMDQwOTI2","repeats":9005},{"count":61957500,"lower_bound":"Q2xlcmsjMDAwMDQwOTMw","upper_bound":"Q2xlcmsjMDAwMDQxMTA0","repeats":1505},{"count":62257500,"lower_bound":"Q2xlcmsjMDAwMDQxMTIz","upper_bound":"Q2xlcmsjMDAwMDQxMzAw","repeats":9005},{"count":62557500,"lower_bound":"Q2xlcmsjMDAwMDQxMzE1","upper_bound":"Q2xlcmsjMDAwMDQxNTQ2","repeats":1505},{"count":62857500,"lower_bound":"Q2xlcmsjMDAwMDQxNTQ3","upper_bound":"Q2xlcmsjMDAwMDQxNzM2","repeats":1505},{"count":63157500,"lower_bound":"Q2xlcmsjMDAwMDQxNzM3","upper_bound":"Q2xlcmsjMDAwMDQxOTMz","repeats":1505},{"count":63457500,"lower_bound":"Q2xlcmsjMDAwMDQxOTM3","upper_bound":"Q2xlcmsjMDAwMDQyMTEz","repeats":1505},{"count":63757500,"lower_bound":"Q2xlcmsjMDAwMDQyMTE3","upper_bound":"Q2xlcmsjMDAwMDQyMzcy","repeats":1505},{"count":64057500,"lower_bound":"Q2xlcmsjMDAwMDQyMzc4","upper_bound":"Q2xlcmsjMDAwMDQyNjI0","repeats":9005},{"count":64357500,"lower_bound":"Q2xlcmsjMDAwMDQyNjI3","upper_bound":"Q2xlcmsjMDAwMDQyODI0","repeats":1505},{"count":64657500,"lower_bound":"Q2xlcmsjMDAwMDQyODI2","upper_bound":"Q2xlcmsjMDAwMDQzMDM3","repeats":1505},{"count":64957500,"lower_bound":"Q2xlcmsjMDAwMDQzMDQ1","upper_bound":"Q2xlcmsjMDAwMDQzMjA1","repeats":1505},{"count":65257500,"lower_bound":"Q2xlcmsjMDAwMDQzMjA4","upper_bound":"Q2xlcmsjMDAwMDQzMzc5","repeats":1505},{"count":65557500,"lower_bound":"Q2xlcmsjMDAwMDQzMzgw","upper_bound":"Q2xlcmsjMDAwMDQzNjU4","repeats":1505},{"count":65857500,"lower_bound":"Q2xlcmsjMDAwMDQzNjYx","upper_bound":"Q2xlcmsjMDAwMDQzODQz","repeats":1505},{"count":66157500,"lower_bound":"Q2xlcmsjMDAwMDQzODQ3","upper_bound":"Q2xlcmsjMDAwMDQ0MDM5","repeats":1505},{"count":66457500,"lower_bound":"Q2xlcmsjMDAwMDQ0MDQz","upper_bound":"Q2xlcmsjMDAwMDQ0MjE4","repeats":1505},{"count":66757500,"lower_bound":"Q2xlcmsjMDAwMDQ0MjI1","upper_bound":"Q2xlcmsjMDAwMDQ0NDMw","repeats":1505},{"count":67057500,"lower_bound":"Q2xlcmsjMDAwMDQ0NDMx","upper_bound":"Q2xlcmsjMDAwMDQ0NjMy","repeats":1505},{"count":67357500,"lower_bound":"Q2xlcmsjMDAwMDQ0NjQ0","upper_bound":"Q2xlcmsjMDAwMDQ0ODU4","repeats":1505},{"count":67657500,"lower_bound":"Q2xlcmsjMDAwMDQ0ODYx","upper_bound":"Q2xlcmsjMDAwMDQ1MDQ4","repeats":9005},{"count":67965000,"lower_bound":"Q2xlcmsjMDAwMDQ1MDUw","upper_bound":"Q2xlcmsjMDAwMDQ1MjA1","repeats":9005},{"count":68265000,"lower_bound":"Q2xlcmsjMDAwMDQ1MjEw","upper_bound":"Q2xlcmsjMDAwMDQ1MzYw","repeats":1505},{"count":68565000,"lower_bound":"Q2xlcmsjMDAwMDQ1MzYx","upper_bound":"Q2xlcmsjMDAwMDQ1NTYx","repeats":1505},{"count":68865000,"lower_bound":"Q2xlcmsjMDAwMDQ1NTcw","upper_bound":"Q2xlcmsjMDAwMDQ1Nzk2","repeats":9005},{"count":69165000,"lower_bound":"Q2xlcmsjMDAwMDQ1ODA1","upper_bound":"Q2xlcmsjMDAwMDQ2MDE4","repeats":9005},{"count":69465000,"lower_bound":"Q2xlcmsjMDAwMDQ2MDIy","upper_bound":"Q2xlcmsjMDAwMDQ2MjE1","repeats":9005},{"count":69765000,"lower_bound":"Q2xlcmsjMDAwMDQ2MjMw","upper_bound":"Q2xlcmsjMDAwMDQ2NDM0","repeats":1505},{"count":70065000,"lower_bound":"Q2xlcmsjMDAwMDQ2NDM1","upper_bound":"Q2xlcmsjMDAwMDQ2NTk1","repeats":1505},{"count":70365000,"lower_bound":"Q2xlcmsjMDAwMDQ2NTk4","upper_bound":"Q2xlcmsjMDAwMDQ2ODQw","repeats":1505},{"count":70687500,"lower_bound":"Q2xlcmsjMDAwMDQ2ODUw","upper_bound":"Q2xlcmsjMDAwMDQ3MDY3","repeats":24005},{"count":70987500,"lower_bound":"Q2xlcmsjMDAwMDQ3MDgy","upper_bound":"Q2xlcmsjMDAwMDQ3MjY3","repeats":1505},{"count":71295000,"lower_bound":"Q2xlcmsjMDAwMDQ3Mjc1","upper_bound":"Q2xlcmsjMDAwMDQ3NDQ0","repeats":9005},{"count":71595000,"lower_bound":"Q2xlcmsjMDAwMDQ3NDUx","upper_bound":"Q2xlcmsjMDAwMDQ3NjI2","repeats":16505},{"count":71895000,"lower_bound":"Q2xlcmsjMDAwMDQ3NjI4","upper_bound":"Q2xlcmsjMDAwMDQ3ODEw","repeats":1505},{"count":72195000,"lower_bound":"Q2xlcmsjMDAwMDQ3ODEz","upper_bound":"Q2xlcmsjMDAwMDQ4MDI1","repeats":9005},{"count":72495000,"lower_bound":"Q2xlcmsjMDAwMDQ4MDMy","upper_bound":"Q2xlcmsjMDAwMDQ4MjI1","repeats":9005},{"count":72795000,"lower_bound":"Q2xlcmsjMDAwMDQ4MjM1","upper_bound":"Q2xlcmsjMDAwMDQ4NDA1","repeats":9005},{"count":73095000,"lower_bound":"Q2xlcmsjMDAwMDQ4NDA5","upper_bound":"Q2xlcmsjMDAwMDQ4NjIw","repeats":1505},{"count":73395000,"lower_bound":"Q2xlcmsjMDAwMDQ4NjIz","upper_bound":"Q2xlcmsjMDAwMDQ4ODUw","repeats":1505},{"count":73695000,"lower_bound":"Q2xlcmsjMDAwMDQ4ODU3","upper_bound":"Q2xlcmsjMDAwMDQ5MDEx","repeats":1505},{"count":74002500,"lower_bound":"Q2xlcmsjMDAwMDQ5MDEz","upper_bound":"Q2xlcmsjMDAwMDQ5MjQ2","repeats":9005},{"count":74302500,"lower_bound":"Q2xlcmsjMDAwMDQ5MjUx","upper_bound":"Q2xlcmsjMDAwMDQ5NDMx","repeats":1505},{"count":74602500,"lower_bound":"Q2xlcmsjMDAwMDQ5NDMy","upper_bound":"Q2xlcmsjMDAwMDQ5NzE3","repeats":1505},{"count":74902500,"lower_bound":"Q2xlcmsjMDAwMDQ5NzM1","upper_bound":"Q2xlcmsjMDAwMDQ5OTIz","repeats":1505},{"count":75000000,"lower_bound":"Q2xlcmsjMDAwMDQ5OTI4","upper_bound":"Q2xlcmsjMDAwMDQ5OTkx","repeats":1505}]},"cm_sketch":{"rows":[{"counters":[40301,28517,37502,34583,28562,39141,36193,48069,22612,29876,37774,36032,37664,28582,31557,34615,46962,39118,29924,37797,32928,37406,19521,28751,33242,31583,46542,34400,38812,31386,38856,31479,31659,40369,48204,46519,38882,34299,43624,35892,42137,19549,34536,42121,21232,34349,25454,37316,34354,18143,22343,29786,33186,44891,34658,37586,30056,32750,36090,34204,28486,34758,33317,34686,53953,58333,34575,33275,33109,17933,32793,46602,29849,29970,25586,46592,34507,30292,46687,43498,31591,55221,35940,44715,48265,55429,35954,37146,39092,31585,52616,36058,26939,28557,34672,25422,28454,34331,38780,50953,35889,47926,38873,37712,46379,30283,36239,42180,28326,35893,44625,43155,53972,28422,27078,26985,29941,33102,47934,43539,35826,22481,30098,39109,25530,34168,28298,37578,34378,49331,30101,36109,23830,31522,25492,42116,34801,45150,24024,34259,37394,42538,36199,40565,31904,38608,43779,34358,29691,31273,37546,30089,37945,43645,38843,46541,34699,40445,43238,31527,34205,30204,37566,27136,35800,38829,41824,54014,46637,49569,42112,42201,43941,31719,36239,37670,33047,33120,52677,48136,19181,34447,42158,49165,35816,31507,49869,31479,35670,34558,25545,37322,32840,46692,24073,40464,40628,36023,49521,49174,31682,32917,37413,31459,42147,36089,28450,28356,35954,37086,45333,34320,44870,24049,32739,49814,43676,22635,44896,45115,30153,22544,32944,34913,36059,31825,21040,35679,37541,37704,32752,34325,37824,33097,40302,47949,27314,37401,28468,34589,40411,35972,39118,36133,40639,33042,30282,38938,39231,37705,32985,17989,39259,47590,37813,34248,46708,40529,27042,27258,30158,40307,39030,37470,34584,40431,43337,38971,47705,52358,37568,27025,46463,46538,38997,41551,25531,23839,48126,39155,34552,34671,43442,34554,22265,28181,38012,43610,31829,34398,24113,34545,49609,40411,34003,36195,40311,28430,43499,37363,34329,43197,26927,38954,40485,32970,40486,25310,43473,29965,40377,35943,31269,33056,41693,32968,31530,40426,45229,42188,33046,37083,35948,36184,30102,34311,53725,36142,37554,44395,37503,31278,31505,44775,32842,42190,48096,36244,40778,42071,33182,26854,28657,47790,36061,32970,32826,33017,44639,39026,30022,43347,43741,43765,40022,42007,41948,31673,44909,30137,37196,28621,32929,47763,26841,50854,37300,43732,42002,31502,33091,41884,52491,44995,29936,25252,34431,31422,31391,32936,46458,40679,30250,37276,27057,34443,44857,25638,40589,31386,46349,33008,28530,25387,43291,41625,35988,48195,32706,37606,34757,28415,33162,32795,43279,37770,26981,24327,41532,26870,16453,34448,23871,25534,38989,48017,55045,31565,41942,31407,35961,36133,39049,31423,43360,48078,37460,32981,30084,29851,32884,32852,47836,40648,54144,43934,41998,36440,28527,28451,34213,26933,34365,49648,33381,29888,38954,55529,31548,38918,25318,43736,23637,26934,37343,33034,25446,41799,43442,33087,22436,32808,46502,49141,28813,33134,39100,34562,35923,31636,28202,24144,30030,30075,44778,39372,37443,32852,36063,31432,39317,38946,39070,55574,28733,47846,37929,40663,39051,32978,35669,38971,35911,35747,48163,34246,46643,43684,30061,37438,37665,41930,37737,29926,33033,38847,40302,45010,36148,44786,37786,22519,52800,25297,50827,45062,49508,33109,40715,30278,34510,40244,39258,35833,35876,36305,43749,34556,30030,31671,20941,31505,29830,39132,43457,32789,51031,35993,46501,43778,26001,31588,47886,44857,35932,36253,30229,43661,34465,28687,31476,40384,25436,26838,31447,37612,53931,49681,47964,37287,35930,47855,34563,35807,40532,31360,41860,29755,28335,49765,37477,28444,44708,43352,31519,40801,41793,24031,28337,25465,40535,37230,29955,32648,38860,39088,25482,28418,33419,51105,44508,33117,30148,37423,28467,44643,39295,46579,45252,43407,34474,40385,37332,27390,31270,31575,37655,45005,29747,39133,40577,49635,28671,29908,42037,35815,43050,25397,33481,43466,34665,42222,58271,41920,32940,40410,41780,42421,34691,38848,35877,45083,31381,49726,42137,40768,23937,26981,37680,40502,23922,31586,48103,35948,42444,48052,31629,48007,45047,22544,27059,34160,28279,30014,34785,29917,34506,34545,36126,35943,46714,35687,31491,30048,34252,29894,34388,43404,37585,39185,36186,35960,47754,40767,28625,37548,35982,30140,48216,43633,31026,47776,34469,34450,40730,37576,36314,43506,36049,21080,50870,36293,34690,35540,43579,34446,41719,29895,43624,36067,38757,47898,44960,34606,40780,25865,33269,31740,34505,36005,49292,36198,40460,38886,45990,35833,37108,31336,45312,40649,46512,46476,35882,36010,34461,39110,43530,19394,24100,40179,36139,34476,37435,31338,33221,40393,35838,41957,33096,45306,32853,29830,31702,34798,42024,46809,35808,34289,35887,37617,29616,46300,40392,35925,51189,46297,41757,50904,42493,37261,37319,31491,40142,21011,52570,22273,38555,21002,52838,34570,50904,43568,41875,40470,35862,30146,25298,35879,40582,40639,48004,28728,32860,37612,34543,41777,36037,28965,36068,31684,40615,39135,25559,29900,48293,34187,37379,46682,38775,35994,42015,35691,43607,25624,51066,37558,38890,37510,40366,31674,34420,61638,30090,31529,40555,31401,40460,31281,30060,27127,34533,30297,46751,35891,30002,40548,36054,31684,19668,34272,37562,40534,40587,37187,41841,35751,37397,43327,34329,38798,45082,49919,34398,34408,30168,34796,40351,45053,36054,34675,37563,34671,36063,26763,28720,46258,33042,37362,29950,43522,28608,51102,29732,43334,41819,35920,41415,30066,40158,29598,37434,28452,29738,34484,41873,47984,38925,24032,36030,49476,46180,40660,25482,35965,37577,37776,33201,34204,27171,39071,25606,42021,33072,28404,32983,34750,31490,22495,25600,37440,34460,36038,37620,29960,31445,40792,40370,38887,31487,36067,26916,41939,52830,38945,38735,32908,40514,39307,37881,36096,32842,33097,33065,38980,25531,22726,44872,43448,37488,26897,32899,33125,36032,40206,43512,31256,33083,35655,50910,29891,23939,38985,33059,34516,56594,43253,46502,43654,34340,40701,32715,38908,42124,40366,25514,36022,38974,33140,38991,40769,24270,31379,30078,35832,32953,37342,36113,40614,37326,43517,42303,40337,48001,33180,31498,25591,43421,39003,31561,30023,35912,44930,36239,31501,31570,58452,41686,46705,26839,47993,36023,37267,38961,31053,40542,40423,52545,29867,23658,44949,43852,31481,29875,25620,39183,40537,42033,31630,34657,34125,29746,37391,35807,24172,43144,49608,35861,49234,45359,34516,43523,37455,33087,34359,34510,43730,40402,40585,34664,32817,37704,24255,34545,31291,27099,31449,36056,36113,40751,42029,39067,31450,34708,34820,25544,28275,40232,34429,36408,28515,28581,31464,45028,24025,30112,49560,31584,37564,46824,47936,40682,37396,46468,49593,47622,39251,34721,30054,42049,25526,25412,24078,30007,38996,37612,37230,47790,34464,43392,31846,27161,27126,34447,45021,43486,28488,42062,25416,45105,40312,54263,51756,31372,25455,41750,44993,49370,33164,43673,46008,34320,36097,37511,34654,31067,48063,31679,36288,28675,31529,30029,31214,46013,31619,37501,39041,43547,42219,38970,37228,31454,38876,44608,43465,26898,29962,26770,37729,25578,32694,40345,43526,37234,32778,43666,46290,38755,34395,28318,34482,43489,40698,33257,43173,28299,37349,49731,28460,22519,25517,31225,32962,31577,40539,52620,42007,42000,36068,55641,35994,26826,25477,34726,31726,37706,38761,34268,25460,43521,40366,19603,34459,34698,39035,26982,41878,31506,33002,42115,49939,45198,47787,32959,26764,49758,36115,35845,44848,36136,38956,35932,34415,41763,41945,26783,46473,40664,22231,16497,36071,42151,37570,36073,29744,45025,27042,42138,30187,34423,34352,37476,45058,50692,36060,31352,34717,44846,19743,40635,30203,34472,32759,33345,41974,26994,28468,43502,37540,45149,26482,31708,42117,29948,45254,29877,50842,35779,41867,32788,32865,38629,34577,27030,25573,38730,43521,38874,39212,37377,37688,37763,38880,37437,34406,39182,41515,37036,26896,45149,29971,44841,51277,30120,31668,28388,31393,21073,37500,42083,42132,40478,41911,29618,43580,40914,24099,34292,35876,32842,37561,42087,25802,35905,43635,34412,47559,33208,34343,43312,31576,34297,51238,49618,29789,35680,21075,23998,37584,41906,30166,47847,25680,37484,43350,31646,37455,31407,47892,32794,40471,37504,30291,40232,34357,31491,31390,45105,51141,37736,25475,36078,55542,25548,43481,37490,47875,44989,25370,43360,36108,28538,34585,37469,31252,29859,43577,40211,28468,28685,25444,34427,34516,40377,35946,37684,49824,31697,32767,46222,40497,43351,43680,40739,49962,45094,37331,29924,31546,40571,35904,34601,25358,30063,46381,49430,29797,25563,31825,39134,55265,34547,39291,37435,44875,37674,37277,31516,46062,38903,28491,40471,37618,28897,28705,36089,36266,32989,42111,49404,40224,23947,43642,32953,54289,34810,31717,29989,36100,41677,40726,38918,38430,48107,40443,31583,41838,24028,21034,46418,43261,29824,43730,42214,41887,37391,28464,30105,42265,27143,35810,41721,38838,44816,34568,34797,33036,26935,41088,38592,37618,34684,37475,34327,34360,40355,30284,32972,29914,34619,25630,43488,31342,34647,36130,37627,40676,34468,34286,41808,25673,33000,36204,39081,42235,32938,31345,35801,49740,22548,36292,43768,31320,35902,32901,31842,37520,33300,34670,33263,41885,46670,28812,40510,35873,31489,35933,41895,46317,43643,43508,28497,34163,31514,34469,29795,40672,38916,24171,52512,33144,31455,24097,38803,35769,28275,25686,28705,32812,31362,37263,37190,36050,36045,32863,31823,31652,45314,34433,28230,40720,40510,46723,37526,26986,39183,19473,37520,42212,47967,29884,27173,39126,33305,41984,25355,28723,49245,22634,25397,25480,42131,40497,35704,35690,34532,33357,34271,25375,31894,37349,38942,31840,35737,35899,30101,42159,28328,33087,31211,43409,51213,39163,55353,38826,35666,30239,42276,31793,24007,36033,22555,34567,25596,35776,35764,45261,31372,34456,38894,37096,42159,34213,52099,37526,28475,19611,34313,43308,41973,37876,34398,28570,47771,27117,28181,37648,27261,47896,34213,55398,54001,28555,30065,44564,40721,43195,22687,55641,41986,36121,36135,31250,22419,46412,28872,32817,34416,33343,25477,55310,38834,34290,31481,37348,27164,33159,22588,38614,46453,33087,38959,43687,44836,43442,35943,31756,49699,34610,35922,47540,43385,36343,34344,42044,34767,40355,30146,39234,49514,42195,28509,34136,35762,30262,28703,46672,36004,34860,25379,26951,26818,41988,28569,49140,34362,40859,31637,28381,34453,29871,43331,35837,26658,46695,33100,28625,30338,37756,28749,33221,40508,46635,48274,27041,31402,31741,37528,40295,30000,36121,36095,29952,52430,16495,28547,42112,44916,29855,55585,46847,57128,38867,41966,38920,37583,46285,28623,39125,29784,37704,22434,31604,37474,48076,36020,34236,26843,19540,36310,34590,44987,34478,44953,34347,24197,34701,46682,37628,29699,32918,51001,34618,33098,41867,30118,41949,44751,30108,28574,49891,37643,24097,46476,29959,31476,31749,29911,36138,46678,46533,39039,44890,22437,53781,26972,31535,33221,48377,38850,56881,28588,34359,48090,34439,42059,34722,29991,42164,37556,31510,34400,38974,42169,28430,49726,34743,35913,31409,46326,26708,42137,29685,43373,35631,34508,30113,34393,34584,21026,44992,28597,40624,34596,42233,44650,32814,46222,40473,22294,39144,30214,29992,55674,35729,25628,25413,42213,22423,39079,34530,37462,42389,30248,26864,31330,35982,36343,31387,31118,43260,40343,42071,38940,46306,48347,28794,28218,34744,38897,50659,30274,43768,37699,39476,23983,38890,37724,50661,40686,46115,40754,31271,36423,45034,26792,35983,33094,39118,40808,40371,43990,29943,44887,34259,42053,31246,32825,34455,31284,39276,38981,36058,30516,50873,42394,32680,35049,22500,38958,42276,44693,40553,45022,35992,35803,31566,32708,28451,37513,34290,46436,31500,31508,28499,41742,42235,37405,46661,29910,24139,36134,37454,39033,31184,47985,43440,43687,36307,44829,31377,34057,44994,29887,38832,41685,40292,38851,31573,34422,25634,31343,34383,25609,31264,41831,38853,36130,34251,26936,52392,33183,50755,29836,32740,30020,31216,23749,37511,28785,37957,33037,39306,25363,30179,43723,38773,32906,34353,31883,43608,32871,29725,39146,37237,40168,26723,25571,31638,47940,46419,28716,32780,28563,35935,49163,40412,37541,40652,31749,48167,31312,49762,31655,46682,40653,37741,32955,37507,31646,29767,29975,34686,42065,47956,58382,37252,35845,26881,29924,43502,36329,37337,37532,45211,26943,25817,40644,26868,37645,41747,24092,45435,47898,44016,23973,37511,33057,29752,43880,39393,33021,40656,39324,36114,39094,37500,43834,43432,22317,50804,34431,26681,33342,37440,42067,39195,27237,33120,35935,42084,38862,43785,41611,37697,37535,43401,31431,25557,37598,33067,33033,35990,43642,32772,33036,30311,28744,26892,37425,43366,44645,47684,32947,27123,33201,37361,33133,34591,35987,50730,32834,43633,30000,37291,40365,53946,43501,34648]},{"counters":[33037,34563,25383,35657,34561,34562,42233,35825,28248,40241,47706,25372,31392,43643,40787,30005,48094,39208,42337,28442,35987,29934,41915,47692,43234,37448,43714,40597,39108,28368,42030,30005,25577,28997,32980,40325,46563,25446,52413,34337,31606,38849,47741,30444,29931,35906,25359,28508,39328,41969,39068,27135,45080,50862,37660,25545,32956,46436,34644,36096,46451,33091,35897,27154,25452,43453,43271,47923,37461,61878,30055,44975,48160,37569,30052,38823,35853,34579,34343,37716,46290,34290,33095,32904,55708,34488,36460,40188,35749,40673,36121,33267,30096,30042,36187,18047,35669,46590,31510,43285,38833,35808,29980,58756,26865,52642,45331,36125,28328,46439,40181,43619,30058,53523,36259,40471,29690,37415,31558,39215,26998,34580,31710,28600,41983,31994,41951,28742,44860,39449,61557,25325,43927,34718,46589,36016,31543,34360,40538,44793,37729,34408,54300,30225,31705,25380,17984,47731,38816,38728,30355,32991,47893,42195,42018,45161,34614,34143,32778,32978,37629,25403,46180,27000,36027,43968,37725,40564,22434,31411,28314,39249,33103,28500,42076,37355,24262,27160,38786,33070,27061,41964,37611,37483,30059,36357,34627,33291,40377,35764,34518,25247,25698,29967,39240,37276,28567,25564,28639,36082,39264,52490,38548,36185,45393,45112,43395,32908,46049,31580,40268,51275,36085,47796,41829,27105,31466,42298,42080,35596,24029,31778,30028,30110,29943,31800,48120,25547,32738,25480,40729,36029,42076,35690,34637,32909,36339,26769,28433,37519,59996,41682,38949,39069,28434,31543,24119,40700,25432,39090,34625,40708,43837,26802,34154,46545,52437,40622,35890,32997,29930,44757,52611,43460,37605,49510,34645,35871,40444,36210,37594,47985,33043,43794,32929,41929,40855,48105,22406,28615,47724,34633,36091,27022,41853,42503,36094,22551,32810,40713,37362,32997,32901,39042,44914,30124,32964,34698,34631,43289,25587,33043,39189,32749,37368,27117,34210,35648,37480,41872,32897,31244,33005,27219,31548,33108,31422,25416,31604,38904,31404,43465,28410,39004,28613,32853,35740,33118,29645,35904,40483,44779,43756,33084,42008,45072,45051,25448,37286,42272,29975,30043,28687,34618,27000,31343,39382,31578,45149,48201,35999,47716,22123,43457,43475,43388,43258,29938,26784,32953,37383,42168,37737,31500,31787,45067,33041,25333,38939,29954,35688,51300,40550,40094,34486,46652,46994,34329,37453,27125,23945,19367,33092,22527,33214,29898,36096,39199,24028,38949,33071,26942,35594,37837,31447,25612,29929,40434,26573,28705,25344,34435,29718,26947,31788,44969,28350,35644,31630,46497,22491,30100,46818,28386,33138,43386,32709,46584,58560,47832,38935,38900,40340,29738,40566,43215,25676,37548,52352,58573,36325,44824,31474,43271,38776,35923,44849,39035,28365,35810,56523,44990,31535,38825,40478,37395,40493,25582,28486,43423,45390,46341,43313,28682,42246,38812,31613,25625,37259,35969,44671,45011,42219,34456,46232,32682,38921,44709,44750,36037,37536,31243,35945,50921,23957,25597,36020,37555,46639,49281,34424,32981,41595,43643,26742,40430,41959,45199,38138,62648,43348,43345,49463,36059,43174,34525,25543,32966,31429,31638,30134,44688,45026,35774,41064,29839,34264,36152,41890,35638,52835,38888,38919,40453,39014,40551,53985,31546,39224,31564,28323,21066,35877,43576,39085,37564,28561,40425,34403,26961,36095,43730,40638,46494,36148,34320,23741,38845,37693,36574,36021,17999,32884,29973,48318,30078,38779,46605,35942,44505,31662,37521,31543,42086,42017,30269,36015,40433,43362,46719,42155,44698,33381,31241,23917,32990,31496,34701,38980,44770,36038,37807,39116,40643,32856,39157,32978,21146,38969,28444,26837,31490,33054,31461,25518,27156,36031,23783,35879,26989,22521,43590,39197,34717,17865,37411,29970,34512,34499,34822,38531,34322,31375,29941,43444,34262,37714,24010,43644,39188,26962,20992,31472,44428,28168,37725,44892,43484,31443,47953,33198,28702,42069,45006,29989,40492,39038,32834,40521,32995,34603,31604,28529,46702,25522,31653,29880,39083,40759,35749,40698,48217,48308,38937,25607,33248,55120,31628,47583,42284,35752,37419,40773,37216,29643,34060,43546,24146,49381,40560,34474,27087,37761,43550,33041,37347,40435,37546,34260,30140,30000,39191,32972,39272,46686,36094,19357,39179,46478,20994,47849,54058,39096,46487,34434,44949,45162,37163,38932,28231,44776,37429,31657,47892,35937,29814,42164,43119,25470,38999,28396,39122,33070,47911,39231,34486,45056,45164,46209,28490,37566,31383,40074,32908,34567,31791,22510,25201,41778,40515,32955,43620,31457,31396,35912,36009,43531,34243,40079,39149,43877,46283,35791,35917,41924,19549,38883,30047,31175,27124,49831,22486,31554,27029,23992,31262,37392,35914,36086,43625,40093,37416,34545,34633,25292,25370,40747,45535,34645,39060,46712,40497,29847,24234,43668,38755,36037,34525,30011,28854,26734,26796,32945,32828,34555,29902,31521,24047,26912,30176,34884,41988,40795,37179,37676,38848,46446,33061,38971,34734,42067,34343,48027,36326,37618,32964,37608,38640,40458,31193,46550,37846,28561,33137,37270,36150,42082,37291,46284,34434,39043,36124,45140,31645,46616,50910,34509,37403,37542,36005,54152,34277,31427,31606,35984,29968,25490,38951,37490,31480,43509,31296,37595,36189,34336,34614,34383,44862,24082,45207,50748,46081,20949,37556,25523,27056,31745,20834,31584,38937,31677,33030,32642,27072,29805,40119,33226,45026,37494,32901,40479,22520,31558,32587,34499,39110,22639,29719,38918,37627,29836,36036,34538,45112,35809,43917,34625,37182,38677,39051,37443,49642,23912,43235,41996,33001,35918,28256,38977,41861,44803,28445,22573,31410,37698,30137,37423,34694,37445,47871,26970,37285,40003,42066,36188,46331,34418,34568,36129,24079,35684,32740,40276,43475,34546,34754,46260,34721,36218,34465,33113,32918,28669,37848,55503,43257,31347,42168,40155,43441,31409,34669,34399,34451,40220,46315,38808,25457,36089,25575,46386,28568,34569,43592,31252,40489,46236,34299,40454,34386,50784,33129,24034,31587,37716,37532,39954,24047,31401,32941,34630,31753,34492,48214,30151,35985,25310,31629,34564,38687,46629,39103,37359,38753,41823,33423,28145,26947,28502,29745,53650,36013,42373,36148,34515,40414,55757,32988,31415,39221,37251,43386,40477,23916,33197,45235,25497,37367,48348,35830,25419,40307,28459,30020,28673,37607,33203,38906,36098,32849,31501,49382,42956,46832,23907,38759,40641,43855,24358,37670,29791,35950,31644,40202,30157,45244,34530,26899,40474,38917,25045,25807,32872,32909,32863,34326,26897,36060,43418,45139,23842,48173,39068,55299,46916,36186,39066,51113,61862,37325,43640,29913,33003,30092,35953,37556,20912,41760,26847,43569,49716,27048,31486,36129,31131,29691,33071,28339,49639,39052,31656,31457,42091,32780,39116,23808,23980,37567,46562,36086,34642,34469,44966,66055,36172,31549,31395,33180,50737,47002,34603,43482,34737,29842,32858,38845,49421,33321,33101,30164,43513,44975,38931,38969,38940,41941,28495,35761,30116,40372,25733,37318,43404,49432,35903,26928,30287,32526,30143,49723,35953,43717,34541,34347,36296,30065,41737,23890,25443,49711,47781,37811,43157,36191,38923,37711,31471,27025,22322,41672,37325,43792,31150,40592,42157,43527,44915,32819,32972,41776,33208,36007,38763,31438,48134,29991,37861,34589,37506,39137,48222,42038,33277,43744,40667,28516,25663,41512,36179,37364,34735,31604,30236,42031,19684,37468,34493,34731,25530,40791,52261,34506,42180,34424,46159,41932,35630,28604,28387,29809,41978,27124,30081,37465,28614,38756,36011,31314,36196,37403,44809,40201,43433,24187,34339,30064,43800,43298,27029,40739,39101,48110,40513,32924,40507,35634,45171,32694,28240,31400,33187,40239,26938,34628,38908,32794,34545,31228,19481,46401,37304,52590,37543,31265,31516,37393,50709,49164,45273,37620,51203,37627,24378,38884,29654,46095,37439,44972,26794,45153,43466,46396,23837,19402,37565,45062,34483,32694,37305,48522,44993,39001,25427,40551,33092,25360,36087,42044,34421,38952,42167,40347,27098,36045,39045,27001,31286,32891,42032,27009,22720,43698,34198,37682,39389,34906,37629,31813,28528,25424,34486,34229,35909,33087,32796,27238,31439,34498,40144,43570,45121,31292,40736,45236,26941,34521,29964,34486,25224,30258,47928,57064,38776,36055,44724,44938,41842,36251,36259,33209,33023,37028,39370,40464,44923,43487,37621,46534,34414,29916,42089,39154,38901,43442,37826,36098,34723,49485,44867,36066,37814,42469,39080,43438,43433,43448,40562,50409,36194,32958,36190,42169,33213,52325,33064,30136,39473,40643,36170,34352,43194,33148,48140,28406,36147,29766,43165,40433,40866,32906,34577,37597,30095,32980,20929,41746,45026,33172,31464,39254,34813,32885,25310,40477,40470,29931,40633,37683,55730,38898,35843,34705,36054,38880,19279,31512,31618,23890,50680,37313,41948,16563,28636,33171,37510,43497,43556,41580,35902,33055,38983,45022,31522,29738,34422,34870,53813,48196,25807,34334,36191,30480,31601,43023,39259,33011,33298,27129,43291,44685,34877,37681,46669,28863,28492,34737,35776,37771,38868,34177,30048,40592,40735,34465,27143,25481,41827,32918,46567,29857,30235,40312,35808,28541,25511,40622,35946,37457,37466,31778,48070,29950,37671,25276,43680,52592,35663,43582,58368,34619,36138,37372,46677,35784,32717,28665,29948,31196,28443,37798,19407,33107,37871,26837,48174,30150,24558,31434,39049,26909,28456,33216,37567,28630,36209,38726,42302,38915,40584,50887,30193,43834,35999,56930,31609,49709,25437,40482,40602,37575,29896,30002,42311,25325,44981,36145,41562,28348,37511,40661,17916,37698,41790,45391,36225,42097,40765,29992,22480,40648,36277,31644,30196,27211,20807,25430,24134,26947,34102,32865,41755,40662,40510,30041,40620,29962,39207,48019,35956,47860,37305,38768,16646,35967,33197,47846,22533,31184,30064,36004,37367,31487,38826,34539,35702,32982,43693,46535,30261,41965,49722,34390,38892,45443,39361,25421,29870,25647,43257,40850,34681,46230,38975,21024,30290,54016,46759,28163,34193,49544,32968,30026,22416,45010,40830,42216,34682,20988,34491,35798,40704,32883,36249,39144,37557,45982,31208,44563,28265,34446,49234,34167,43674,39157,42176,35923,32970,38858,28643,35860,40677,23857,40680,34723,29942,23876,47859,47935,41984,39179,37219,32993,50952,43267,43321,43593,46651,46110,40758,52082,29957,45099,37896,32842,47836,24196,39254,34710,34646,34470,36192,28145,47917,45083,34619,27174,33109,43341,34599,31485,28390,35841,41972,58408,29947,39205,36140,46843,30092,21020,34473,40608,46390,32912,29992,34502,43498,53944,35986,31573,43332,40307,46615,34466,35807,51189,27290,46942,28374,30328,26863,40526,35733,31505,39231,37462,32991,37900,37642,37227,48049,32783,26836,30135,40607,32965,46528,39080,41929,46675,47795,50938,31701,50989,32799,39033,38858,36117,34447,36153,49885,34463,45289,42148,35967,28446,34344,44727,26921,52098,43548,25600,42954,40124,35744,43607,34658,34495,47930,26980,30095,38753,34634,40431,31626,47597,33113,31693,32807,37801,31632,34436,33081,35819,31657,38826,40474,35946,44740,44865,49602,48770,47934,32969,37643,38855,36199,31733,37525,41971,38785,30009,51020,37491,49537,41794,21173,45186,45895,35911,44663,35917,41637,35566,43517,46331,30136,41924,37631,50974,28551,29896,31932,37405,40378,36130,44607,41891,29988,37645,32921,43488,37669,32801,33236,40644,30178,40586,36101,41737,41964,33158,42372,37638,29631,25364,26985,46800,34349,26953,35928,34574,42113,32897,36071,35943,47878,32926,24033,40563,48441,31585,31897,40624,42028,52596,42285,31751,38996,28661,34377,53984,38716,38664,46470,32991,38829,32910,39289,40539,37699,48140,38933,37212,28381,47852,46598,46650,30140,30009,31351,48038,58641,33054,49111,43390,44774,31357,37355,36069,37599,31633,40674,30092,40678,37495,40255,40716,31643,37223,28451,40320,37544,40500,40583,36097,31240,45228,43788,31627,35908,48512,37302,43417,25861,29664,34899,42064,29880,37613,49423,36109,50628,28787,21061,29947,29964,57146,30038,31265,58723,30172,37204,37431,31564,33367,31442,19340,44874,39212,37479,43540,31670,30201,47560,21065,40488,35992,37425,43541,39054,36176,33115,23938,34487,34444,43448,47997,33085,32845,28863,42319,37518,43721,46566,31488,37300,36504,46854,39164,37179,32875,34681,24003,34534,37425,19434,28497,31512,43563,31461,35807,38650,34581,28580,47893,28561,17982,27093,33142,43874,40506,24139,29627,40301,46296,35662,33364,45075,35990,37359,34599,25592,31459,46462,28591,49469,30018,37326,47772,40433,45090,26941,34784,34517,25580,36193,38794,30041,33320,32765,40364,26909,37267,23922,28520,39178,46286,40630,40464,39007,34107,32885,35759,43655,37650,23924,37318,38540,29983,31656,28559,38867,43258,32529,29950,35976,24066,43302,48107,45135,32939,27167,40592,36186,21278,30099,34392,38979,36032,34733,28584,31508,32685,37351,34625,34291,43500]},{"counters":[28420,38987,22445,46164,19459,19486,39264,46533,49591,35905,20933,36039,37718,37422,37422,39131,40519,46831,34628,36284,34470,45460,47706,46453,39221,22592,34416,34789,38886,40399,43397,40445,40590,35610,35610,39233,24207,34729,53992,32928,27089,33246,39117,44822,28494,32794,43616,40200,39205,28660,47650,41911,30021,37580,24009,40363,30122,36165,26982,29972,43638,40483,40645,52069,52135,34517,18006,37744,31629,45157,47756,31329,29934,34329,31203,25317,26956,29932,46482,37223,34596,45482,46839,34829,44997,43322,31592,41968,34590,35878,34557,38826,34634,39295,29973,37719,27184,35892,36240,31826,37882,38950,23849,26918,52407,28685,35901,43408,42013,23904,34664,51016,34234,22429,27123,20980,32895,51686,29881,31324,31399,32897,30095,55425,32926,28509,25728,46352,34585,48152,40533,39026,36226,44925,36160,34396,39250,37698,45120,44848,31342,52193,40532,32934,36278,37485,37394,25528,30354,29965,48111,48119,36111,37529,34301,25436,27369,31718,37226,52409,40026,54188,44830,37565,32708,31727,40621,36276,34661,40500,39409,41759,46510,46093,44860,41718,37243,38815,31403,43443,38954,37572,48654,31285,41992,25485,46594,28591,48084,48277,43659,35899,51221,36083,25551,38868,37526,35854,46091,41886,35858,34567,24067,30020,26983,34692,34167,40503,36441,46746,40597,42025,45309,35753,39029,43872,37246,45083,46249,43530,43863,29886,31461,31328,37573,34418,54327,41655,31581,34556,46567,42220,48175,40411,37295,30146,52436,35902,24067,25395,23916,38858,34569,40576,25788,42147,48161,24003,37430,43349,24090,44717,37655,40618,37266,41791,32685,31609,34810,36329,33127,28422,37473,30247,32757,40633,36166,35936,53899,34520,34665,24075,32811,33002,25170,34343,40706,35711,38911,28534,52415,46099,37389,32869,31716,40464,35895,30056,25731,30081,34291,34414,28572,28873,37487,37606,35826,31768,36059,40495,39004,27250,29996,47412,33233,44949,35591,31633,37172,43115,32767,33200,31406,25403,32752,39066,26926,43576,44796,31357,46531,46214,42225,28536,43154,28496,34365,37641,26742,40447,39064,24055,33033,24043,33134,32953,51114,45000,32872,39262,40361,25627,46785,31235,40756,38611,42087,35906,34641,31720,29833,37344,31356,49435,37344,39295,29954,34432,43637,39196,30133,30217,40211,33259,34636,51035,43517,41992,46834,38736,37587,28664,45086,44924,38719,39356,32935,33028,43205,33312,42011,30190,32673,31690,34723,44985,39004,43516,27043,35924,34524,44994,40630,42274,20854,34500,24257,35041,32955,24090,36933,25535,47299,18077,30169,43571,25503,43403,34564,40517,47989,25542,40696,28604,55462,32773,40897,34646,26833,31630,34369,43924,49410,40491,38877,34408,37535,37289,37694,47980,42299,39043,38825,38648,28370,28635,14985,44994,25537,44748,16816,27023,32968,32980,32881,34687,34386,32803,48136,35825,33232,34613,21131,38877,35894,44454,32951,34518,33033,41822,45105,31626,31609,46500,51255,38978,43427,33132,43440,42095,33050,41902,47561,34613,37606,35967,35952,39227,46561,31569,31473,39153,43389,37327,40383,40658,28566,37581,35922,33116,34298,17935,33152,38821,23713,25602,29946,36116,44918,31160,37732,50982,22689,25592,33055,28299,46561,27084,28597,39047,34230,34351,44843,39058,46262,37425,38851,32751,38891,55614,38847,41556,39182,45014,30211,43328,36265,34597,34689,50975,49401,35775,32913,31604,31123,26567,39098,32746,39335,25399,40607,27074,28458,49310,38917,32711,36242,34188,24110,29707,29960,56743,37676,40709,24152,37440,30936,43269,38781,46473,40389,34681,24191,37310,45095,31545,46757,29830,31514,46727,41922,28425,37624,21139,51234,31449,46680,52588,39075,33199,38821,37524,40527,42014,34640,41907,32720,32991,28799,35909,36026,33067,36242,44871,39050,34365,31487,33186,50921,43425,41978,40844,31134,30246,30043,34117,39185,34407,21174,28518,40557,51138,37504,41927,29899,44871,52767,34288,38790,45276,35928,39061,32986,33273,29897,25530,31897,52458,31422,47886,38791,38892,37011,32872,42070,46599,41973,42132,44381,46470,45039,43379,43321,43760,46304,23934,38868,34775,34616,31602,32784,43363,46368,39263,38839,25263,35970,31600,28476,40705,39147,37495,37476,31408,25382,38877,52587,31608,31376,39658,43444,44724,37625,37249,46353,33323,38767,37496,38642,38847,44570,25607,34438,37583,30162,30192,38850,45010,48016,39216,34425,29865,44777,43202,29988,28285,30256,32718,42242,47428,37649,40343,49449,34341,41837,19592,38751,40110,39190,32874,34813,36208,25608,34787,37327,37613,27337,40501,28598,35887,30215,29778,37343,39219,30105,31501,28434,35966,52477,40286,47841,33025,31411,28375,41973,46429,36098,33176,52551,43252,31631,32967,24065,37646,40354,46386,56851,31661,34434,27170,42240,34469,34685,25564,38847,28527,28491,45089,41832,46615,36963,52473,28551,36222,37723,51009,43753,30032,34451,22366,40713,52324,38978,43811,40543,32812,43497,35975,37624,34422,32981,33019,39027,42359,34259,31858,28543,26707,29997,42156,43702,29816,30032,43694,31395,37289,43179,36129,43782,31218,49679,36056,20737,32971,28335,33079,41699,34593,34597,24110,58126,40421,31519,29871,42034,25797,34541,36113,34508,28560,41721,47955,22337,26950,37907,46776,40424,35973,45409,43357,49514,32842,44922,29819,49562,37710,38827,31587,25587,36078,37601,52470,42089,40710,22582,38937,43522,42052,26954,40539,52653,31488,31531,42059,41582,36126,27383,30061,34198,30045,37411,46692,40455,45986,28469,38946,28506,36241,32910,43552,40503,36093,35918,45379,27094,25503,24155,33086,37626,38743,47687,35745,17992,37138,29946,43493,34651,19638,37564,28617,31460,42268,25253,37207,34116,34704,46890,38876,41746,36087,34693,34867,40534,37418,31449,48365,35899,32936,38755,51138,36309,29780,28686,32878,46732,37453,28680,34495,32868,31621,44618,31225,32906,35897,46378,32770,40399,28478,42329,46208,39001,27179,36098,42074,35991,44954,29953,32835,31578,27036,44819,49339,47049,37448,44664,37601,37482,39377,31577,29939,45011,43208,30116,33118,33081,42072,37009,34306,39249,44943,36028,28526,34367,34195,28308,34694,34440,31454,31633,39053,46380,31582,45256,37279,42125,22405,30132,31570,52555,29771,37500,31580,28817,35878,43099,46370,39008,61089,51230,37802,40661,46451,22568,45171,33042,39002,40562,43596,40581,34873,31877,34456,23965,38890,34405,38882,30251,42381,37520,32937,32822,36027,34721,43396,40628,52290,41953,22378,42338,37347,31554,46838,36141,34107,32995,30136,34618,36133,26714,40638,47878,52843,31482,42054,46385,40454,31565,37487,31576,37740,40697,25582,34318,43571,38925,39239,48155,38979,34614,52467,42279,40388,43271,40277,37696,36098,31837,40339,37494,31435,29571,36228,43644,40334,31735,46512,31408,27294,40666,28257,40336,41672,26942,53641,23786,30173,22429,42038,41858,27230,34529,37224,43248,44997,39254,22293,37593,44906,28459,44670,36270,59857,34593,27034,42295,29815,34151,44951,42322,41967,30117,46554,43654,43675,42211,34417,31440,28573,28346,35948,28636,62835,46279,31632,52215,20837,41950,37275,31508,34811,32950,35993,48012,37469,27163,44912,44736,42240,41642,30007,40561,26902,27113,38965,49348,39140,43245,35914,37345,34408,39240,40447,37721,34428,45103,21004,46094,45061,30017,38875,34498,40501,34490,39029,52662,31729,37418,37623,37567,35848,34876,34553,43411,36106,40617,26882,35973,28616,40504,31568,24207,37443,32938,33190,34452,49101,43082,31565,33315,47789,28829,31576,25212,37668,37378,28541,22625,28442,44928,44876,45116,53072,45092,31427,36068,30111,37456,30279,37332,30129,33122,32840,29922,36108,32936,40216,44939,28572,34365,37652,43654,35791,22518,40601,26947,43332,37297,40249,41778,43285,26948,30261,26991,23879,23982,37510,49514,43767,30166,35858,22281,24207,39371,47960,19673,38811,22658,43725,35924,29997,45318,38803,27131,40703,33194,33084,47985,28372,32818,31652,29770,34483,33101,43052,34607,55535,39074,46432,32754,34402,28249,25686,33268,32765,46311,36084,37560,36196,35959,25302,34346,28833,31556,34220,48266,45016,36177,23991,42063,36030,40516,43381,37950,40635,37468,35985,41856,29801,40539,33005,43725,43278,35791,27287,25776,33219,34847,26949,34349,51018,31383,43500,29951,42152,30103,30116,31529,33126,41900,34534,32790,22781,29942,44985,37529,26955,25502,40603,44823,34710,24010,33055,52674,24048,26972,42045,29908,32932,42177,35904,38929,30198,50617,33074,35062,38846,46428,36148,28479,38835,37589,25312,43577,40445,37378,31447,19461,31437,28773,50965,47852,23848,30208,40491,39081,33054,46598,26720,25711,38989,42228,25378,38801,31201,41974,41886,29873,40298,41696,33282,32950,42115,34479,47928,41994,32906,46631,37550,39180,39171,29970,49751,43384,40173,43266,41911,31728,43356,35591,46523,46329,25758,34594,30886,40637,40635,34108,28358,33068,24132,27045,38923,34140,33180,40191,40667,37321,49499,41801,32956,45038,40738,39037,30195,46338,49849,29844,38559,29651,25477,44724,40335,38475,39162,40469,39046,30042,47853,36289,34480,32983,40295,29928,32933,40395,41912,40132,39198,40375,37152,32781,28408,36176,39456,31645,35996,25482,56797,39265,46535,30322,49941,35680,40198,31562,44706,33426,33057,28672,22357,37732,38812,40455,31603,37012,39229,32736,45026,55558,25382,28619,23839,33069,34313,37597,46483,25621,42027,46761,38701,33129,31731,28597,52655,35693,46615,40255,33102,24059,44955,34318,43264,48016,41644,43246,43835,34379,43705,48377,31386,44832,32732,31313,37444,31971,49701,29998,34673,43533,39324,31528,36083,33230,40546,39444,21140,36152,28296,32906,50888,34294,31401,34422,37739,40541,34173,35973,37724,32824,32942,26869,40298,28862,44850,30079,55111,33184,39032,32984,43510,30011,30139,45029,30023,31647,25569,27120,40432,46640,33124,25384,31535,32983,34227,43353,31701,40632,37622,45517,37670,32844,49836,37456,29847,34342,20919,42349,49341,16588,43420,29810,27140,45584,31370,37513,40878,49516,26934,34526,35742,26841,45151,33131,31264,44987,51526,40499,34335,39256,30242,39031,25606,37435,29789,43397,37412,40057,33069,41870,32930,37720,32923,37338,33445,34552,29869,40522,44059,28676,40504,38932,26914,42246,36022,43439,32908,42292,40783,31461,39109,48296,46592,35711,41931,40604,34435,49181,34426,48062,43564,35906,31303,34498,31580,31414,44932,37451,35886,28494,53298,32988,49491,31312,27230,46549,40391,42024,38763,30203,26711,34586,37717,28392,29879,25536,29894,27130,30207,20930,46425,31086,45164,46449,49598,31526,52576,30025,47999,22222,40544,32921,31703,33015,40264,42142,29763,43657,37288,33116,28430,36136,29972,34372,30025,28491,43414,37200,34188,25371,43670,47803,28410,46755,35998,21047,43594,28263,55367,31250,27099,31266,25413,32810,22588,35753,29992,50488,45324,34727,33002,50829,42251,32847,38904,27102,28397,39035,28402,40551,36184,38899,25537,37186,39188,37588,34428,31632,19524,21068,38919,43214,26632,25349,27120,32740,28276,52384,37773,27149,35950,39038,34264,40814,40520,37315,30225,39252,46442,30104,28525,42078,46532,29721,32979,39367,34562,31610,31202,37542,37589,28334,40402,31572,46496,30128,30209,35974,32832,19407,40735,43689,31201,23767,46689,43482,56814,40139,40110,34289,28570,23876,29981,45057,31600,34427,46721,45078,32828,42145,40572,43542,34173,39445,40518,28454,48211,41976,35783,49213,44837,34657,28425,26871,48093,42007,46511,40019,33048,50996,41067,34744,44948,38702,34472,28523,24088,51127,34293,32962,28644,32985,28614,34190,28415,31598,35847,42019,42175,41825,25407,39198,40446,28523,43948,33312,38804,27236,28228,33214,37703,26947,30060,35985,26939,43441,25206,34270,35676,35932,28597,25712,30049,42342,36132,28467,45180,40580,45098,45033,36094,32672,28662,46400,31370,39059,32909,25429,31563,45177,38426,28522,27174,33100,32703,31509,38962,37562,34367,35028,37298,42042,27207,43474,35581,36157,42122,16568,46537,42097,40687,42286,45074,42161,30309,38923,41975,49660,33167,39020,31396,37488,41915,41860,41850,28557,34478,31170,36323,34586,54129,37492,22274,30170,40505,41926,46660,37212,56807,34568,32981,37396,39004,36154,28601,30060,34472,50607,31542,38721,30230,37453,43353,37634,30123,28382,31359,40426,37572,26904,36009,35820,30172,45178,24113,30034,38931,37153,28779,43398,46783,32925,28626,44981,39337,38984,49196,40490,49503,33003,37700,37604,37617,43761,33275,25535,25454,30130,16581,51163,46610,31490,43684,37303,42189,38985,34358,23891,40340,32848,34363,37737,22341,43515,17781,27171,35821,40453,49659,41879,34698,38982,32921,37740,26997,23932,23784,40734,34835,43641,34376,39009,36042,34235,31346,24034,33291,45007,31388,22610,39109,27033,32937,34553,27319,46889,25441,34584,29803,42045,37548,39061,38893,43512,36199,25337,26971,28558,37572,45065,56899,37615,53908,35886,32711,52368,33024,27088,34484,47988,40829,39181,19332,37408,32751,43866,40596,30227,28583]},{"counters":[29881,38988,23725,40281,30095,42128,54178,37404,46341,39041,26980,37632,34384,33055,46481,48146,28536,39563,31417,40836,35944,38856,40605,44882,32772,42035,45174,37570,40301,40211,29818,25438,43480,55584,43702,36006,44642,30093,40597,31820,24059,32944,29888,28405,48371,31515,36007,52696,34434,31525,37453,32857,43674,40420,38913,31592,54085,29769,40680,37793,36279,28609,34475,36333,40689,41917,35982,31521,32850,23911,32941,34881,40402,42308,31382,30226,40724,45005,25334,40603,20866,36119,38873,21145,31817,37424,32760,40600,26784,31714,39505,40343,41924,36091,37476,32958,43374,28682,32838,34360,27070,38822,37487,36239,40529,28596,29877,34350,46857,40501,35916,37598,49736,34105,38963,23973,29861,25474,30176,32964,39098,45175,38934,32955,40393,40683,40506,28547,31685,55367,33100,40242,40639,34460,33029,34638,42095,32709,34431,32954,38870,21146,34602,36061,39110,37155,40644,42474,28502,61715,29986,38939,37299,34504,23807,31550,40606,42095,32718,58386,57289,49605,40422,46754,40414,38830,43614,25564,25521,40372,36037,33320,36424,40713,37476,40584,38790,41515,40387,32965,38978,39149,46726,34860,36177,39052,46619,42046,42504,37321,32909,35864,29925,37524,34378,22214,42135,48125,46989,36186,39071,31507,40662,37643,31327,40587,44712,34315,25315,41957,37412,28496,30120,44711,34546,48319,32756,41957,33077,42061,31684,37616,32647,25530,52505,29839,34523,31570,22507,43511,28453,26853,23947,40345,23937,36040,40226,34426,32885,36115,41989,39134,36408,39228,30146,37595,34766,32783,29996,33018,26955,43731,38948,36084,36291,34512,55425,34388,31560,28536,40770,37277,51171,36203,31544,32735,36189,49682,27079,34889,34281,28326,30232,28566,43136,40210,44997,41845,28526,40466,36161,21126,31323,33043,30103,28546,45136,28438,55375,31596,49765,41909,36177,31606,39058,39063,47779,37340,38859,37499,39272,43140,33089,31630,30106,34301,37541,25726,56951,32835,40462,35790,25632,27178,34043,45446,34492,40237,45232,48014,31579,39157,34366,35925,28504,38965,40351,28260,47645,30013,32841,43419,40669,34721,34338,28745,37577,34474,30057,48175,39266,30046,47952,42407,31507,30059,26993,42295,30197,19530,33075,28408,46795,38796,31641,37328,41513,34293,26891,32847,31338,45112,37285,27054,32976,30052,34610,37241,35871,25498,24131,27149,29983,37574,38963,45085,39269,42097,31409,22505,35872,25607,22905,37473,41774,50666,39142,38854,43485,37119,27073,34415,46469,42113,38916,28406,37695,34619,44839,43624,40400,37355,36101,31657,37406,39111,33069,55635,40595,43375,39364,50755,32962,34666,36123,45188,31492,43276,38963,41805,36343,46509,25534,27118,31354,40682,26999,28425,31307,38905,53905,37650,46272,42261,33034,41905,34558,31412,34422,37771,49591,36130,44661,31571,25446,36238,50519,34388,42021,43290,40364,27020,43266,47992,42151,34271,28630,43407,33275,29700,35472,40483,47896,42067,46274,33231,26942,34489,25554,31692,30094,39220,42187,40588,42074,39027,58135,38739,44660,35803,39099,43350,42000,36257,31879,18229,28663,32962,32967,30148,31764,40752,34388,37284,37487,36035,42201,37379,31584,46358,39231,48003,37372,42221,40353,31228,41982,27114,31805,34371,33209,38922,31686,37429,26989,39138,24026,31429,40413,60989,38991,27012,30135,46523,21060,39218,31145,25424,31697,37521,39012,43502,30141,33206,43355,34614,35739,38937,30156,35922,47725,35940,39095,32994,43211,33136,30042,29946,40848,40667,32839,36202,29594,31308,44770,35946,36328,25500,41805,52774,47839,42030,46389,35731,35675,28370,31480,39012,36294,22380,47868,32817,34499,37586,32961,26788,52775,39203,34470,34637,42155,25295,34502,35842,31739,46395,36004,34723,52495,37457,37402,37408,33080,34654,29782,35810,22540,46393,35928,35982,29756,40553,40636,48103,30034,42257,37812,36123,37380,28198,25639,35476,35937,50796,35968,34665,45035,46443,32812,39005,28610,31413,51258,31697,37449,28407,31338,37513,27106,38846,24077,32938,29996,39414,40113,37177,34676,35835,25308,37407,45054,31330,46183,42218,41929,32877,23860,25552,33044,34287,35588,35751,46225,31443,28531,40500,41945,40564,23946,28087,30159,41856,46262,45178,28460,46507,33137,28754,40573,38951,38886,33283,32849,32981,33002,28644,34551,29808,35847,30138,42261,35694,35849,40075,24080,34544,37624,52384,52431,42193,29956,43432,17930,28508,30309,42049,34467,36200,43679,34441,46461,30315,42074,42265,37313,40439,37319,34454,48215,40904,34081,34304,43796,47950,22402,34274,38918,32627,28541,36045,35916,39262,37495,28578,40135,34428,46721,33470,40392,42171,47910,37929,52338,34481,38926,31534,19411,32708,30087,34608,37421,37650,40511,47913,37685,42019,37562,37719,43392,43576,29945,32901,25462,44890,36105,36094,38986,52630,34794,47818,23897,40742,24188,31783,33037,25521,40900,43377,35846,40366,31582,33082,22683,40981,32757,23775,29910,36153,43265,30137,31656,40337,40646,40652,30000,37435,37689,33109,35940,41898,30314,36080,41644,37387,30124,43510,46568,38773,45155,30204,42208,27058,43313,47777,24023,28199,31807,31578,34416,41872,49641,21043,26879,37534,41849,38990,34418,39182,38792,41660,41832,43246,28553,31757,37440,35956,25425,40438,46469,40571,34551,27000,42131,27210,43636,37657,40274,30300,30177,45105,34512,35765,33086,34534,61653,48102,49674,38709,31526,45074,36011,43824,38771,43377,41929,31262,41941,36009,30084,28506,39357,37452,27199,28552,26936,48056,31472,24230,36041,48205,43679,31410,28298,28311,46269,34586,40693,22360,48080,37784,34582,39040,35926,52407,37487,40257,31653,34920,33114,43790,40426,37437,47757,31436,43670,40528,37210,31391,42231,28720,36217,34892,38971,40110,32662,40656,36107,39118,33104,41946,36275,49848,34507,35829,50742,26842,37689,42195,38867,37632,33120,32814,46625,40441,28553,36047,38965,35625,30103,39026,40589,45181,48478,28462,52612,25340,48354,32809,40325,29990,28426,40392,34696,39022,52637,31366,30034,32795,34311,31643,48080,46754,26947,45009,39325,28420,37528,31550,34519,38968,41761,40385,41995,37427,46590,45162,19390,37166,28564,45039,43471,24012,37756,25259,47970,23968,27170,37136,28433,25502,19669,34383,43375,31546,43713,44865,46492,43386,32677,40779,25976,53876,36050,33107,39265,48050,36012,32887,35765,27099,40292,34258,28812,34682,33253,34496,27037,40484,44920,31466,31557,23963,49434,43452,39055,39009,37468,40423,32696,25488,29998,48062,37373,31826,24196,34561,33041,38742,42029,36061,31572,45197,35780,37314,29846,45143,51161,25573,25610,39287,19689,23903,41895,49382,52261,43461,38803,42148,13463,19638,43662,44955,28418,31428,40704,38710,44780,46442,31615,30178,47918,37369,34467,45131,34359,31644,41901,32896,43368,33066,32887,23831,41930,37486,36349,36253,27030,37643,31408,44592,25415,39013,24168,48013,49272,50881,32872,40373,42016,40366,38586,38964,26824,45043,32935,34397,39129,55309,31436,35895,28599,32819,37456,37672,28576,38993,43155,30092,37552,36146,42196,37186,39010,28399,53110,37513,40692,30047,27132,34353,29920,49643,40438,31614,29866,48030,19227,35841,43719,32884,37454,37305,21078,32898,49525,22593,26833,22552,38818,33058,36018,38817,35835,41756,35908,48332,39079,57266,26766,30021,34334,38747,40447,29824,33280,45123,36020,29930,35810,51164,28414,44568,34429,45136,34585,35948,33159,28395,33020,26927,28584,40292,34260,22340,22436,28660,28685,43437,36123,48288,39085,37555,37461,29870,27016,33035,16541,49624,46530,20842,31342,40137,30154,21160,27058,37626,42095,34324,38939,34371,46183,38995,37398,27083,51024,32954,55280,43475,51026,41930,52518,36064,31635,43636,29737,34464,34196,38917,46951,36124,33079,30074,30330,28315,44866,26975,29952,28307,31910,31503,27088,40368,46530,35875,26785,30327,31451,37240,37476,34625,43717,38722,39117,38866,48153,47777,34389,31598,38980,41990,34649,46701,37456,45002,43439,42146,28549,38589,21110,42137,37343,29928,25566,34308,31501,43346,33226,59667,33278,31774,46646,19723,30120,36216,36089,35845,34379,21051,28484,37891,43176,37487,48303,60457,28709,40365,39079,40619,22709,28270,29828,43505,40506,37297,39268,47844,43436,37073,43629,31546,45378,44829,33378,45272,34474,21221,40321,34622,37447,35786,45208,20721,31365,34417,37358,36049,43366,43504,31739,40481,34305,41776,33038,50987,54030,43146,34561,31678,28577,39308,45159,33114,48009,25461,49201,37477,32913,47975,31567,38869,23925,34437,32780,29861,29851,37193,43356,28462,34599,42131,34342,31692,37577,31549,39145,34280,34577,27137,39031,23910,45307,28310,38909,46404,39102,31785,32719,34290,31568,43597,38681,47865,40034,37315,50961,25826,34396,49714,35981,39051,40231,30141,28456,29698,43642,30111,37401,37438,35875,30074,29823,34619,30293,24076,43558,29949,32994,25471,49413,39080,42208,31445,28394,37442,30165,23809,37277,40542,41744,39049,40680,36098,46484,44899,33359,34498,52553,28344,38867,25470,31736,42159,31353,34810,26710,31339,37357,34583,41938,49578,32671,30008,27179,26620,44980,42044,27007,49579,38971,37516,31049,31606,40697,33040,29806,33144,48013,37297,45058,37402,36159,37511,34417,35884,35838,35746,48292,40050,43904,37346,43445,27103,54022,31599,45203,40431,41778,40554,34265,34660,60046,34294,27009,41804,41988,25576,37724,29548,52949,37896,31296,33162,29923,46594,37563,40402,34467,36323,42167,34405,47956,44848,25647,38971,43830,36199,37270,40617,41839,32970,27273,30483,49633,31601,37137,27128,40133,37454,43402,39060,29910,39064,42028,46416,46646,36034,31381,37247,36069,34670,33324,38636,37480,40509,31536,34295,32874,43425,52853,30081,43374,43450,32811,50707,25269,19327,36024,25590,37457,39341,51223,32894,34422,46368,39083,33218,34413,52462,38945,40363,39906,28571,39046,39331,48215,49461,49696,49456,36041,34627,40372,37491,34580,24028,41603,35582,41858,36100,27117,35922,27115,31460,40324,34349,28651,47827,51390,28340,31360,45021,22455,32608,32930,35891,39104,31348,43551,35993,31389,37449,39119,28306,43557,44653,29708,28769,34452,34489,36174,26642,30023,32881,43721,29665,38915,32905,31242,43110,38838,40607,30021,24106,41906,37219,39142,25341,35962,41817,40598,31270,34324,39014,22427,46537,34776,46760,33107,31665,29959,24292,41932,49190,31489,27135,35926,49880,29732,40516,40337,39503,37327,45359,49475,37502,38857,38933,34648,46315,39070,31470,39083,40160,28784,40252,33215,43653,38725,35703,30074,30030,37416,44955,37339,36067,26969,55358,34320,34615,34599,37164,31289,34095,40502,27121,38912,34611,34341,35715,35972,31433,40745,36170,46727,44822,40605,36143,32888,37314,41864,47915,32870,35906,32979,36077,39100,34321,31789,36247,20925,28320,31456,46691,40568,37703,29737,35605,16504,43722,26922,37525,41814,28432,31669,36231,28618,38857,34435,30161,25343,30090,39135,50678,28353,46458,40396,32961,29952,37480,31650,32872,46682,27357,53803,27201,26683,31366,37765,41878,22627,37764,26853,23948,27135,38984,31486,49363,28326,48249,32921,35972,34372,38992,42128,25484,33336,34709,45238,35744,43713,46329,27258,30015,29855,37618,27070,37118,32908,37457,31448,37588,42082,48242,52219,32985,35991,39112,38969,30152,39015,36023,41928,22452,36113,25399,36228,31325,28447,32948,35753,27120,48018,43958,29887,36066,28633,30078,43197,34480,31404,46273,31410,32610,30082,49258,30123,31510,50957,44864,39013,40237,31229,45001,34167,34510,30171,43633,27184,39309,29951,47865,37744,31429,46620,40556,30255,32958,42006,45049,26992,35871,36066,39086,43578,37552,40506,57148,37782,31828,43411,43644,30011,43376,39003,40463,46479,41782,34619,39062,36063,40747,34415,38736,39200,45031,39117,38878,36009,49529,35787,52389,40574,38742,40515,33098,32914,51357,48193,33246,38916,46343,31759,48205,40374,31379,43903,30077,44915,23875,49381,29824,34464,39307,21082,26790,31426,33178,40264,28425,34501,36106,31562,45170,40500,34637,40720,26991,41943,28693,35785,25540,40511,39129,35943,36095,37644,46325,33103,37786,31242,37694,37528,35708,41603,49197,31682,32885,44792,34479,46697,26823,42079,24250,35760,25441,28240,45191,31400,35887,32842,51154,34674,36077,46620,35733,25256,37441,34510,36077,32592,28179,33279,39070,34526,40547,40657,35784,34688,44907,37506,39032,37461,38856,30067,28400,34530,38911,31908,46734,22378,35623,40394,20759,30066,28530,50924,30170,27014,28729,39029,37704,32899,31400,35758,30070,48047,49167,36070,28610,37443,37498,34701,39138,45335,30150,55206,37780,35977,34557,20990,43516,39215,48411,30141,39101,42075,31488,46437,46365,26908,40417,17960,39019,28532,28510,42183,38753,44809,25220,40024,42277,27145,34569,31603,46310,34507,35856,46583,35689,52352,29997,34419,32845,34186,31557,31692,42272,37547,31667,55484,30006,21070,32919,37527,34470,25621,48064,43641,25290,25587,36144,42122,34357,39047,37395,45268,41843,22423,28393]},{"counters":[34546,40699,26645,43249,43791,43264,44827,31614,32809,46388,30103,29894,37537,20807,47991,28501,38971,35951,26961,40234,37559,32780,47801,31446,34267,42166,31669,39048,16538,40289,26742,38920,38635,40386,35687,38866,31289,28514,25457,29875,52891,43772,29670,37334,41800,40615,33141,27023,27337,38847,37526,45202,31541,27012,37653,37630,49215,34604,38950,55353,39143,31702,35734,43455,37182,31545,24001,40423,35844,36013,36167,48313,49772,22587,36061,45049,34629,32924,32836,38933,36196,28842,37485,36316,37439,42001,43650,35700,48201,44934,38888,32800,27051,33020,31793,46523,18233,32902,34555,37060,31571,41999,37423,31754,33074,37442,35744,27137,48032,31509,29880,42047,37398,60046,39154,38962,43338,40358,46447,45189,37406,37642,30072,50928,36022,28519,39029,38799,33053,50642,34430,29935,36204,45079,36040,48190,37354,34515,37547,28357,28336,49309,28512,46626,40456,36034,30126,32907,41866,33358,58350,38936,37479,35676,37762,31486,42171,37616,38783,45016,32813,25644,37583,46910,32741,47809,61457,31399,25344,37130,42011,29678,37739,45111,34714,48102,41889,35902,36317,37343,46561,35800,29730,34585,37416,31739,45606,22573,38910,45036,46360,40737,39072,37481,15062,29980,45329,38738,42007,40202,49656,29980,40162,32794,44897,34456,40422,28274,31405,45246,29908,34624,37553,31389,40323,38759,28439,37419,28363,27075,41596,34592,28403,34358,40283,42315,25733,40355,33089,33015,36245,25227,21089,43453,37409,39083,36118,44746,31642,37472,55290,34309,41941,47862,37406,27150,36153,28517,46551,35891,34511,35882,43851,36060,22516,32938,31594,41108,29903,42091,40463,36152,39053,45277,19524,35857,41947,25788,38585,43398,35702,34459,24011,31237,35844,34394,28416,42037,36280,22693,53402,47893,46376,25624,24145,46578,31345,33102,32865,25397,40217,35689,27069,26980,40640,40786,35597,30043,37725,43344,35722,44860,43778,38879,35944,37357,37415,55623,39216,52483,52739,37283,35895,51012,42030,44882,30035,51093,29867,37318,39325,43665,42154,44861,28631,38995,30223,37478,44817,37844,39152,31611,34410,37442,22316,37534,49438,37505,44768,29949,28575,41842,46646,32816,30115,35826,35972,32675,46386,25553,25459,31578,28690,22574,33187,36297,31230,38913,36297,31654,34496,28461,26851,29816,45112,39222,34246,38924,21184,37653,31684,26774,30302,34524,48123,28136,34219,28425,31647,35996,32662,43391,27196,30114,39312,43515,25436,31371,46195,32999,34359,25672,33028,34595,38632,46219,25382,44655,39136,31254,24124,42127,46512,51043,35813,47744,43780,46357,32725,38772,32937,35584,49257,41791,24065,39117,32896,34926,45321,34534,41887,43443,40152,22473,36064,40595,48091,39281,32878,46395,25278,30001,43699,32936,40670,31711,29969,28580,34577,34521,43238,34682,39020,43393,33088,35984,40901,42176,37020,50940,36056,46334,31423,38739,51108,40605,28721,28596,28440,48387,40526,37573,34592,35909,24088,39013,31634,30160,40520,27068,40398,30001,28481,25435,38991,44936,44886,33225,40862,33219,31497,36211,50955,28622,34479,31636,32791,33032,30074,24076,33045,35639,28336,29940,45134,27413,38727,39317,30032,23903,40681,37389,47976,36090,45469,37237,31579,45069,31512,25695,23932,51030,41697,48045,40243,28505,26992,30158,39184,32924,36175,37519,33543,27157,46312,34034,46484,40568,31685,32864,40695,37561,34589,35846,33023,35856,43707,35828,28503,32995,37551,28333,40699,30410,56408,39008,25668,43155,37626,41903,40462,49754,23886,34439,39355,34745,47864,32827,48102,36201,40504,31924,43628,33064,29866,28287,46522,35704,43614,46466,40472,50841,36084,31398,38777,36264,26964,35976,33051,50760,28244,34150,24147,40271,34790,34305,40667,31368,29880,46519,28670,42070,27023,40282,53931,43786,40528,28242,35711,22608,40380,34045,34433,31768,46856,40425,31744,44858,31409,35870,33063,49564,29791,34803,34310,34425,28673,31418,32922,40342,27088,50952,30296,34326,44884,31428,31850,34480,28493,41364,37045,29678,37588,23870,48193,31601,44972,37211,40361,40706,29903,30107,33093,54157,51214,37526,40583,25483,28530,32963,30114,41693,36249,25388,25575,32987,42029,29987,42045,37771,31510,34495,39245,29999,38887,40532,52454,30265,23912,38908,38854,32683,28990,35717,25753,41969,41851,34820,34407,43401,40438,38788,38843,16569,26841,24317,27129,40632,31693,22603,43902,52348,42049,38759,42104,44948,19447,38905,37166,42121,34630,37452,28497,39016,20833,34536,31534,51000,31368,28429,52317,37835,37335,34311,43327,34379,31415,44739,37787,46625,43619,34629,28347,51135,53515,40863,37387,39108,30054,27199,37762,30167,45227,48107,29920,28531,35940,34419,36065,22579,46537,39111,33249,32970,38717,31350,29981,56949,25666,54439,30043,19634,36121,28386,40471,31763,33102,40671,36024,41921,41836,37371,51198,52520,37528,31397,29888,40722,37443,43178,38903,28771,33035,49171,37737,28676,29624,38903,29924,48146,41888,31688,34179,32856,37686,40467,46350,58561,30036,31684,43428,46601,37395,37742,42290,37567,49470,44862,41812,33202,44955,31356,29818,34626,30079,41998,30050,40324,36215,32904,46149,35884,45134,45111,22496,39435,36124,48249,41911,42246,40441,22399,28269,45176,51087,36096,33039,40043,33107,41810,37350,44680,38974,44976,31593,43590,34284,40733,26886,34823,25783,40645,38708,43555,33026,42322,31726,47842,35760,38952,28516,47730,33239,32918,34346,26947,28605,34599,40548,39035,37382,31645,19430,46422,33316,27190,32810,28513,28537,27100,37694,38979,40224,37565,33146,31594,38975,31676,35832,42019,37587,49442,19405,52973,40607,44933,37432,38691,37368,36370,39025,35922,37133,33258,33397,40691,31533,34555,30005,26778,38829,22182,37471,45180,43688,40597,43411,22397,19642,34829,52284,40217,54129,42045,35939,27057,39115,37747,34503,21165,21030,48379,35876,44897,32907,43382,21132,25312,33284,37679,37057,28493,34612,40370,41992,37669,46556,25727,46345,34769,31542,39188,20757,31647,28283,44426,38945,23895,37468,22723,37275,51276,37424,31640,37733,45066,40468,45212,43495,33062,33043,28523,34358,34095,38925,40223,30063,31797,40379,41890,30006,49758,52045,46320,24025,31346,22636,25486,28431,37671,38926,34396,30018,23785,35768,39332,27057,43457,34533,30126,37383,38852,30104,40540,37508,42569,31573,35963,49309,25338,40424,36979,34559,29979,29988,34688,28576,34732,46783,34549,40687,48133,34193,45333,22296,47647,36089,28686,40610,34915,58670,44967,33007,30103,25534,40242,34638,19525,34480,41835,34305,40746,34452,34609,35785,48231,29608,28591,46707,41881,35963,26842,31518,31553,35860,28662,46698,45239,30081,27067,40393,37490,55251,32814,25657,30165,48083,25299,42043,41959,32720,43501,28531,38957,55622,44727,38770,31615,22497,28545,30133,47556,37451,36182,28413,31727,41682,35803,21073,29879,28692,48095,46450,33178,43730,48016,46738,31568,33246,37583,40550,25343,41881,23780,36214,28343,38938,33034,37492,40124,41987,27001,46525,48520,49556,34408,49546,28655,29950,43610,33144,41508,27028,31144,22581,37750,33000,41843,33028,40392,42266,29942,41907,40174,43608,28294,40794,32860,38714,34479,28506,38891,41900,45324,46485,52721,27164,34806,31483,31302,43357,48068,37572,54632,33009,32650,37541,46539,28429,40362,31269,40277,35803,39121,23889,42071,37337,32996,40428,28472,36171,43359,39105,45102,32662,23943,27098,35928,40617,37566,46613,31543,24033,37741,31517,38928,37629,39271,43133,24067,41703,30228,43494,53732,39257,34667,27052,30039,42171,26878,36257,37532,45919,32691,46279,36000,37415,41998,39190,43468,49598,34561,52454,31632,32668,36071,24184,37539,46434,32729,35920,36078,31710,31438,31397,31405,50954,50527,31811,36096,25397,40553,47787,48208,34551,23562,37407,38961,35936,40400,28452,31937,37536,49532,49328,38896,35865,39013,25449,31704,50953,46224,45548,28552,41893,37538,34401,35744,25538,46779,42042,32740,41969,40714,41786,28412,49668,39432,31774,38884,32891,50667,45414,31497,22539,34062,49528,41872,37468,46311,25460,26859,40798,35813,36076,33328,37539,27145,42268,34220,46128,40693,36182,34390,51220,35852,31613,33095,19712,32983,33030,36102,35981,31315,52691,33008,34331,37628,45564,64425,34454,33166,39174,28498,43512,34479,23879,42144,40603,38771,34561,46582,28381,40254,44900,46726,43645,31473,27277,43339,37553,32807,44921,34224,36129,32702,39128,31503,56455,29946,41885,31502,28609,34606,37866,25577,34520,20894,40378,50946,44619,28522,22485,27309,30250,34389,32654,43433,42051,46417,30030,36017,39017,30061,31454,43313,46718,20988,37659,29923,34344,27097,19439,28312,42044,40241,38946,33084,30191,34408,32998,27125,42136,32956,34402,26948,49153,34244,37458,29691,38790,28553,46440,39498,25483,45037,41603,45103,40912,41975,40300,48124,27046,45431,35696,29991,21070,37633,48013,26961,31468,50704,30062,22609,40580,19314,29826,28500,29902,34909,27008,31365,26973,28362,48110,19461,33029,31362,39114,42236,30045,52462,32834,40191,42199,48050,48317,33099,38621,34240,47952,42023,27045,25468,50824,22617,50664,46660,46373,49588,43236,53780,30113,36109,37469,46736,34299,43623,35907,35973,40022,37391,34470,37624,42072,44774,49180,54017,26894,39338,47774,51333,34769,39355,31550,64994,40357,42037,24069,37499,43335,37480,43683,39038,40319,37865,33171,28428,21459,34342,37882,35861,35916,34536,31450,43413,29890,37432,52657,31469,48135,33152,36148,30141,34796,48123,25539,35520,25467,31559,21197,37581,46574,37390,50374,33145,34442,27093,31764,34465,34789,31560,41924,19881,49433,32979,31482,36088,43790,22564,35798,40345,40832,30255,34499,40660,41902,23978,29919,34528,33186,43260,43501,38849,36090,40329,37433,41704,39016,40406,51293,31142,35810,32936,35839,53890,28606,35723,24044,29748,27155,24007,37497,45100,33067,19392,52640,34323,39107,36056,31538,18018,34563,40643,46458,40214,35999,42158,31524,26878,20995,41877,33065,37407,35872,29628,34640,49393,30032,39290,33180,45198,34428,46414,37486,37444,32992,43479,35725,25691,26934,45227,31399,34543,36110,26910,49786,31691,39273,31421,31408,46369,23880,50940,43500,37267,31577,29977,40294,22571,29945,46422,37472,46589,50739,30029,50809,19428,46881,37767,40504,34609,35991,48258,31659,38804,43940,40345,43379,38902,25709,35979,50928,38996,25297,28608,28587,36139,42127,52699,27015,38830,40573,47604,31638,28448,47991,43571,20876,34623,41982,54073,35907,33054,25538,42024,31421,40712,29980,36435,37505,38673,39109,28776,34441,43572,30140,34739,32930,42089,43385,37517,34634,31740,29998,37664,34478,30171,39082,32706,34541,37472,30184,39272,43716,21077,35856,39204,46212,43531,44778,37291,29883,46543,44752,32886,26992,44846,26908,38721,38735,37518,41927,34455,26779,27110,42312,60321,25614,31449,39205,25853,36177,28566,40699,47940,40753,40327,42025,24161,28946,38889,37580,33130,32583,36092,45151,35645,33146,33120,42301,44876,40539,43541,42185,28771,32830,49204,40180,34430,38968,29809,39167,26967,36167,42125,37511,33080,37305,37476,33122,25598,37792,31602,26870,25420,54327,46568,40102,44937,31301,34398,41752,27144,36122,49594,50128,51039,24023,32713,34921,41983,43352,46444,34405,40352,24047,37524,34465,54263,46454,40664,32882,27122,46808,56732,39093,21099,33207,37223,51184,34651,39016,32955,27113,36102,37356,30032,37706,45020,35985,30016,33107,30075,42396,24143,46395,38742,35999,33029,46491,25503,28726,32844,53847,40437,31337,33355,29907,27030,25479,41994,43735,31481,42003,23842,27017,43368,17861,32878,38975,43270,43392,28155,36153,30312,40498,42028,46578,30198,31423,31537,52556,46228,40565,52528,37731,40545,40594,31484,25670,28425,41978,25549,34655,40384,53860,24233,28507,38786,40915,31454,25687,40550,33109,40385,34736,28348,29930,27048,46106,25648,19474,52773,31578,26941,23897,36051,35858,40607,37939,39015,40325,33154,39023,46313,23596,41847,35920,34596,46211,48100,35799,23972,34451,43413,38900,44929,46710,33034,31574,30074,50665,33090,31730,33213,27022,31348,34725,32766,46262,31271,37261,36009,31486,49333,41831,43354,40519,22758,34640,39210,39014,48250,29883,22318,25378,37536,38842,40586,28286,31497,37874,32958,40521,32850,44904,40149,31465,34506,39249,30116,46502,48069,43476,29955,39127,32960,32788,50957,36031,29870,37557,41958,46439,30378,36009,45036,42125,36007,35798,48020,37416,33097,34229,20820,37363,43072,34758,39034,28328,28644,33180,31615,37368,32964,35828,36055,37478,50782,46425,27141,27044,35987,38863,31296,31323,41920,39207,32782,54049,26955,25779,31336,27025,35980,56856,32784,38818,28424,32950,37590,34616,35913,28697,43236,37353,36095,30003,46493,43404,30026,37308,33090,34116,39415,35873,39032,31270,39054,36420,30190,34595,24195,44775,46543,44878,34209,39049,25504,38905,34460,36156,39327,34535,34376,21094,34185,43618,34572,34686,43457,42386,37591,28453,34550,32903,28561]}]},"null_count":0,"tot_col_size":1275000000,"last_update_version":401695328332677122},"o_comment":{"histogram":{"ndv":63168512,"buckets":[{"count":300000,"lower_bound":"IFRpcmVzaWFzIGludGVncmF0ZSBmaW5hbCBjb3VydHMuIGJvbGQgZGVwb3NpdHMgc2hhbGwgd2FrZS4gdGhpbiA=","upper_bound":"IGFjY291bnRzIGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgcmVndWxhciBhY2M=","repeats":1},{"count":600000,"lower_bound":"IGFjY291bnRzIGFtb25nIHRoZSBmbHVmZmlseSBzcGVjaWFsIGFjY28=","upper_bound":"IGFjY291bnRzLiB1bnVzdWFsIGluc3RydWN0aW9ucyBjYWpvbGUgZnVyaW91c2w=","repeats":1},{"count":900000,"lower_bound":"IGFjcm9zcyB0aGUgYm9sZCBpZGVhcyBwb2FjaCBmaW5hbCwgZXZlbiBmb3hlczogZnVy","upper_bound":"IGFsb25nc2lkZSBvZiB0aGUgcnV0aGxlc3NseSBldmVuIHJlcXVlc3RzIGludA==","repeats":1},{"count":1200000,"lower_bound":"IGFsd2F5cyBhZnRlciB0aGUgaXJvbmljIGlkZWFzLiBmdXJpb3VzbHkgZXZlbiBmb3hlcyBuYWcgc2x5bHkuIGZ1cmk=","upper_bound":"IGFzeW1wdG90ZXMuIGV2ZW4gcGFja2E=","repeats":1},{"count":1500000,"lower_bound":"IGFzeW1wdG90ZXMuIGZsdWZmaWx5IGJvbGQgcmVxdWVzdHMgaGFnZ2xlIGFsb25nc2lkZSBvZiB0aGUgY2FyZWZ1bGx5IHVudXN1","upper_bound":"IGJsaXRoZWx5IGV2ZW4gZGVwb3NpdHMuIGVudGljaW5nIHBhY2thZ2VzIG5hZyBxdWlja2x5","repeats":1},{"count":1800000,"lower_bound":"IGJsaXRoZWx5IGV2ZW4gdGhlb2RvbA==","upper_bound":"IGJvbGQgcGludG8gYmVhbnMuIGZ1cmlvdXNseSBib2xkIHNlbnRpbWVudHMgYWZmaXggYWJvdmUgdGhlIGNhcmVm","repeats":1},{"count":2100000,"lower_bound":"IGJvbGQgcGxhdGVsZXRzIGFmZml4IGNhcmVmdWxseS4gY2FyZWZ1bGx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGFtb25nIHRoZSBjYXJl","upper_bound":"IGNham9sZS4gcmVndWxhciBkZXBvc2l0cyBoYWdnbGUgZmx1ZmZpbHkuIGNhcmU=","repeats":1},{"count":2400000,"lower_bound":"IGNhcmVmdWwgZGVwb3NpdHM/IGZpbmFsLCBldmVuIHJlcXVlc3RzIHdha2UgYWJvdmUgdA==","upper_bound":"IGNhcmVmdWxseSByZWd1bGFyIGlkZWFzLiBibGl0aGVseSBwZW5kaW5nIA==","repeats":1},{"count":2700000,"lower_bound":"IGNhcmVmdWxseSByZWd1bGFyIHBhY2thZ2VzOyBmdXJpb3VzbHkgcGVuZGluZyBpbnN0cnVj","upper_bound":"IGRlcG9zaXRzIGFnYWluc3QgdGhlIGZ1cmlvdXNseSBzbG93IHBpbnRvIGJlYW5zIG5hZyBhdG9wIHRoZSA=","repeats":1},{"count":3000000,"lower_bound":"IGRlcG9zaXRzIGFyZSBmbHVmZg==","upper_bound":"IGRvbHBoaW5zIGVhdCBhYm91dCB0aGUgYnVzaWx5IGZpbmFsIGZveGVzISBmaW5hbCBwaW50byBiZWFucyBjYQ==","repeats":1},{"count":3300000,"lower_bound":"IGRvbHBoaW5zIGludGVncmF0ZS4=","upper_bound":"IGV2ZW4gcGFja2FnZXMuIHNseWx5IHJlZw==","repeats":1},{"count":3600000,"lower_bound":"IGV2ZW4gcGFpbnMgd2FrZSBjYXJlZnVsbHkgc3BlY2lhbCBwYWNrYWdlcy4gZg==","upper_bound":"IGZpbmFsIGRlcGVuZGVuY2llcyBjYWpvbGUuIGlyb25pYyB0aGVvZG9saXRlcyB3YWtlIHVudXN1YWwgcGFja2FnZXMuIGZpbg==","repeats":1},{"count":3900000,"lower_bound":"IGZpbmFsIGV4Y3VzZXMgaGFnZ2xlIGFsb25nc2lkZSBvZiB0aGUgcmVndWxhciBhY2NvdW50cw==","upper_bound":"IGZsdWZmaWx5IGV2ZW4gYWNjb3VudHMgZG96ZSBpcm9uaWMgcGVhcmxzLiBldmVuLCBpcm9uaWMgYWM=","repeats":1},{"count":4200000,"lower_bound":"IGZsdWZmaWx5IGV2ZW4gcmVxdWVzdHMgaGFn","upper_bound":"IGZ1cmlvdXNseSBhYm92ZSB0aGUgZmx1ZmZpbHkgcmVndWxhciBhY2NvdW50cy4gZG9nZ2VkbHkgc3Bl","repeats":1},{"count":4500000,"lower_bound":"IGZ1cmlvdXNseSBhY2NvcmRpbmcgdG8gdGhlIHNseWx5IGZpbmFsIGluc3RydWN0aW9ucy4gc2x5bHkgdW51c3VhbCA=","upper_bound":"IGZ1cmlvdXNseSB1bnVzdWFsIGRlcG9zaXRzIGFjcm9zcyB0aGUgcXVpY2tseSBzaWxlbnQgZXhjdXNlcyBib29zdCBhbG9uZyB0","repeats":1},{"count":4800000,"lower_bound":"IGZ1cmlvdXNseSB1bnVzdWFsIGRlcG9zaXRzIGFyZSBhbG9uZ3NpZGUgb2Yg","upper_bound":"IGlkZWFzIHdha2UgYmxpdGhlbHkgZmluYWwgcGFja2FnZXMuIGV4cHJlc3MsIGlyb25pYyA=","repeats":1},{"count":5100000,"lower_bound":"IGlkZWFzIHdha2UgcGVybWFuZW50bHkuIHF1aWNrbHkgYm9sZCBob2NrZXkgcGxheWVycyBh","upper_bound":"IGlyb25pYyBkZXBvc2l0cyBpbnRlZ3JhdGUgc2x5","repeats":1},{"count":5400000,"lower_bound":"IGlyb25pYyBkZXBvc2l0cy4gcXVpY2tseSBzcGVjaWFsIGV4Y3VzZXMgaGFnZ2xlIGFtb25nIHRoZSBibGl0aGVseSBwZQ==","upper_bound":"IG5hZyBibGl0aGVseSBhcm91bmQgdGhlIHVudXN1YWwgYWNjb3VudHMuIGNhcmVmdWxseSBmaW5hbCBpZGVhcyBjYWpvbGUgY2FyZWY=","repeats":1},{"count":5700000,"lower_bound":"IG5hZyBkb2dnZWRseSBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cy4gcmVndWxhcmx5IHNpbGVudCB0aGVvZG9saXRlcw==","upper_bound":"IHBhY2thZ2VzIHNoYWxsIG5hZyBzbHlseS4gcmVndWxhciBhc3ltcHRvdGVzIHdha2UgYWJvdXQgdGhlIGZ1cmlvdXNseSA=","repeats":1},{"count":6000000,"lower_bound":"IHBhY2thZ2VzIHNsZWVwIGZ1cmlvdXNseS4gZmlu","upper_bound":"IHBlbmRpbmcgcGFja2FnZXMgdW53aW5kIGNhcmVmdWxseSBibGl0aGVseSBwZW5kaW5nIHJlYQ==","repeats":1},{"count":6300000,"lower_bound":"IHBlbmRpbmcgcGF0dGVybnMgc2xlZXAgYmxpdGhlbA==","upper_bound":"IHBvYWNoIHNseWx5IGFmdGVyIHRoZSBibGl0aGVseSBmaW5hbCBhY2NvdW50cy4gYmxpdGhlbHkgdW51cw==","repeats":1},{"count":6600000,"lower_bound":"IHByaW50IHNseWx5IHF1aWNrbHkgdW51c3VhbCBpbnN0cnVjdGlvbnMuIGZ1cmlvdXNseSByZWd1bGFyIHBhY2thZ2VzIGhhZ2dsZQ==","upper_bound":"IHJlZ3VsYXIgYWNjb3VudHMuIHF1aWNrbHkgZXhwcmVzcyBmb3hlcyBzbGVlcC4gZXhwcmVzcyBhc3ltcHRvdGVzIHByb21pc2UgaXI=","repeats":1},{"count":6900000,"lower_bound":"IHJlZ3VsYXIgYWNjb3VudHMuIHNseWx5IHJlZ3VsYXIgZXhjdXNlcyB3YWtlIGNhcmVmdWxs","upper_bound":"IHJlZ3VsYXIgdGhlb2RvbGl0ZXMu","repeats":1},{"count":7200000,"lower_bound":"IHJlZ3VsYXIgd2FydGhvZ3MgYmVm","upper_bound":"IHJ1biBzbHlseSEgaXJvbmljIHBhY2thZ2VzIHdha2UgZnVyaW91c2x5LS0gYnVzeSBhc3ltcHRvdGVzIHByb21pc2UgYWNybw==","repeats":1},{"count":7500000,"lower_bound":"IHJ1dGhsZXNzIGF0dGFpbm1lbg==","upper_bound":"IHNsb3dseSBpcm9uaWMgcmVxdWVzdHMuIGNhcmVmdWxseSBwZW5kaW5nIGFzeW1w","repeats":1},{"count":7800000,"lower_bound":"IHNsb3dseSByZWd1bGFyIGF0dGFpbm1lbnRzIGludGVncmF0ZSBhYm91dCB0aGUgc2lsZW50bHkgZXZlbiBwaW50byA=","upper_bound":"IHNseWx5IHNpbGVudCwgdW51c3VhbCBzYXV0ZXJuZXMuIGZ1cmlvdXNseSByZWd1bGFyIGZveGVzIHdha2UgcXVpY2tseSBm","repeats":1},{"count":8100000,"lower_bound":"IHNseWx5IHNseWx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIGNh","upper_bound":"IHRoZSBhY2NvdW50cy4gZnVyaW91c2x5IGJvbGQgcGxhdGVsZXRzIGFyZS4gc2x5bHkgcGU=","repeats":1},{"count":8400000,"lower_bound":"IHRoZSBhY2NvdW50cy4gZnVyaW91c2x5IHJlZ3VsYXIgcmVxdWVzdHMgYmVoaW5kIHRoZSBxdWlja2x5IHJlZ3VsYQ==","upper_bound":"IHRoZSBmdXJpb3VzbHkgcGVuZGluZyBhY2NvdW50cy4gcmVxdWVzdHMgYWxvbmcgdGhlIHJlZ3VsYXIsIGV2ZW4gZGVwb3NpdHMgbmFn","repeats":1},{"count":8700000,"lower_bound":"IHRoZSBmdXJpb3VzbHkgcmVndWxhciBwYWNrYWdlcyBjYWpvbGUgcGVuZGluZywgcmVndWxhciBpbnN0cnVjdGlvbnMu","upper_bound":"IHRoZSB0aGVvZG9saXRlcy4gZnVyaW91c2x5IHBlbmRpbmcgZGVwb3NpdHMgYw==","repeats":1},{"count":9000000,"lower_bound":"IHRoZSB1bnVzdWFsIGRvbHBoaW5zIG5hZw==","upper_bound":"IHRvIHRoZSBmcmV0cyBjYWpvbGUg","repeats":1},{"count":9300000,"lower_bound":"IHRvIHRoZSBpcm9uaWMgYWNjb3VudHMuIGNhcmVmdWxseSBm","upper_bound":"IHVzZSBjYXJlZnVsbHkgcGVuZGluZyBhY2NvdW50cy4gZnVyaW91c2x5IHJlZ3VsYXIgcGxhdGVsZXRzIGNham8=","repeats":1},{"count":9600000,"lower_bound":"IHVzZSBjYXJlZnVsbHkuIGZsdWZmaWx5IGV2ZW4gcmVxdWVzdHMgY2Fqb2xlIGJsaXRoZWx5IHJlZ3VsYXIgaWRlYXMu","upper_bound":"LCBmaW5hbCBwbGF0ZWxldHMuIGJsaXRoZWx5IHVudXN1YWwgZGVwZW5kZW5jaWVzIG5hZyBjYXJlZnVsbHkgYWxvbmcgdGhlIGV4Y3Vz","repeats":1},{"count":9900000,"lower_bound":"LCBmaW5hbCB0aGVvZG9saXRlcyBhcmUgY2FyZWZ1bGx5IHBlbmRpbmcgZXhjdXNlcy4gYWNjb3VudHMgYWNy","upper_bound":"LiBibGl0aGVseSBzcGVjaWFsIGRlcG9zaXRzIGhhZ2ds","repeats":1},{"count":10200000,"lower_bound":"LiBibGl0aGVseSBzcGVjaWFsIGluc3Ry","upper_bound":"LiBldmVuIHJlcXVlc3RzIGRldGVjdCBjYXJlZnVsbHkgYWNyb3NzIHRoZSBwaW50byBiZWFucy4gc2x5bHkgaXI=","repeats":1},{"count":10500000,"lower_bound":"LiBldmVuLCBzcGVjaWFsIGlkZWFzIHdha2UgYmxpdGhlbHkgYXN5bXB0b3Q=","upper_bound":"LiBmdXJpb3VzbHkgcmVndWxhciBleA==","repeats":1},{"count":10800000,"lower_bound":"LiBmdXJpb3VzbHkgcmVndWxhciBwYWNrYWdlcyBjYWpvbGUgY2FyZWZ1bGx5IHRocm91Z2hvdXQgdGhlIGV2ZQ==","upper_bound":"LiByZWd1bGFyIHJlcXVlc3RzIGFjcm9zcyB0aGUgcGVuZGluZywgYm9sZCBw","repeats":1},{"count":11100000,"lower_bound":"LiByZWd1bGFyIHJlcXVlc3RzIGFyZSBmdXJpb3VzbHkgaXJv","upper_bound":"LiBzcGVjaWFsIHBsYXRlbGV0cyBjYWpvbGUgZm94ZXMuIGZ1cmlvdXNseSBldmVuIGV4Y3VzZXM=","repeats":1},{"count":11400000,"lower_bound":"LiBzdGVhbHRoaWx5IGZpbmFsIGluc3RydWN0aW9ucyBwbGF5IGZsdWZmaWx5LiBmaW4=","upper_bound":"YWJvdmUgdGhlIGJvbGQgZGVwb3NpdHMuIHNseWx5IHVudXN1YWwgaW5zdHJ1Y3Rpb25zIGQ=","repeats":1},{"count":11700000,"lower_bound":"YWJvdmUgdGhlIGNhcmVmdWxseSBldmVuIGV4Y3VzZXMuIHJlZ3VsYXJseSBldmVuIGRlcG9zaXRzIGludGVncmF0ZQ==","upper_bound":"YWNjb3VudHMgbW9sZCBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHQ=","repeats":1},{"count":12000000,"lower_bound":"YWNjb3VudHMgbmFnIGJsaXRoZWx5IHBlbmRpbmcgZGVwb3NpdHMuIGI=","upper_bound":"YWNrYWdlcyBzbGVlcCBhZ2FpbnN0IA==","repeats":1},{"count":12300000,"lower_bound":"YWNrYWdlcyBzbGVlcCBmdXJpb3VzbHkgc3RlYWx0aHks","upper_bound":"YWNyb3NzIHRoZSBydXRobGVzcyw=","repeats":1},{"count":12600000,"lower_bound":"YWNyb3NzIHRoZSBzbHlseSBpcm9uaWMgcmVxdWVzdHMgbmFnIA==","upper_bound":"YWdlcyBoYWdnbGUgY2FyZWZ1bGx5IGZsdWZmaWx5IGV2ZW4g","repeats":1},{"count":12900000,"lower_bound":"YWdlcyBoYWdnbGUgcGVybWFuZW50bHkgY2xvc2VseSB1bnVzdWFsIGQ=","upper_bound":"YWdnbGUgZnVyaW91c2x5LiBjYXJlZnVsbHkgYm9sZCByZXF1ZXM=","repeats":1},{"count":13200000,"lower_bound":"YWdnbGUgcXVpY2tseS4gZXhwcmVzcyBpZGVhcyBhZnRlciB0aGUgY2FyZWZ1bGx5IHNwZWNpYWwgZGlubw==","upper_bound":"YWtlIHF1aWNrbHkgYm9sZCBwYWNrYWdlcy4gZmluYWwsIGV2ZW4g","repeats":1},{"count":13500000,"lower_bound":"YWtlIHF1aWNrbHkgY2FyZWZ1bCBwbGF0ZWxldHMuIGlyb25pYyBwbGF0ZWxldHMgbmFnIHVwIHRoZSBjYXJlZnVsbHkgcmVn","upper_bound":"YWwgaWRlYXMgZG96ZS4gc2x5bHkgaXJvbmljIGRlcG9zaXRzIGFjY29yZGluZyB0bw==","repeats":1},{"count":13800000,"lower_bound":"YWwgaWRlYXMgc2xlZXAgdGhpbmx5LiBleHBy","upper_bound":"YWwgcmVxdWVzdHMgYm9vc3QgYm9sZCwgZmluYWwgZG9scGhpbnMuIGJsaXRoZWx5IHNpbGVudCBhY2NvdW50cyBzb2x2","repeats":1},{"count":14100000,"lower_bound":"YWwgcmVxdWVzdHMgY2Fqb2xlISBxdWlja2x5IHJlZ3VsYXIgZXhjdXNlcyBzaG91bGQgaGF2","upper_bound":"YW5lbnRseSBldmVuIGluc3RydWN0aW9ucy4gc2x5bHkgcmVndWxhciBmb3hl","repeats":1},{"count":14400000,"lower_bound":"YW5lbnRseSBleHByZXNzIHBhY2thZ2VzIG5hZyBzbHlseSBmdXJpb3VzbHkgZmluYWwgZGVwZW5kZW5jaWVzLiBleHByZXNzLCA=","upper_bound":"YXIgZGVwb3NpdHMgY2Fqb2xlIHU=","repeats":1},{"count":14700000,"lower_bound":"YXIgZGVwb3NpdHMgc2xlZXAgZnVyaW91c2x5IGFsb25nc2lkZQ==","upper_bound":"YXIgdGhlb2RvbGl0ZXMgd2FrZSBmbHVmZmlseSBhZnRlciB0aGUgZmx1ZmZpbHk=","repeats":1},{"count":15000000,"lower_bound":"YXIgdGhlb2RvbGl0ZXMuIGlyb25pYyBkZXBvc2l0cyBzbGVlcCBmdXJpb3VzbHk=","upper_bound":"YXJlZnVsbHkgYWNjb3VudHMtLSByZWd1bGFyIGFjY291bnRzIGFsb25ncw==","repeats":1},{"count":15300000,"lower_bound":"YXJlZnVsbHkgYWxvbmcgdGhlIGZveGVzLiBib2xkIGluc3RydWN0aW9ucyBkb3VidCBhbG9uZ3NpZGUgb2Yg","upper_bound":"YXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBhcmUgY2FyZWZ1bGx5LiBxdWlja2x5IGZpbmFsIGRlcG9zaXRzIGFjcm9zcyA=","repeats":1},{"count":15600000,"lower_bound":"YXJlZnVsbHkgcmVndWxhciBzb21hcyBzbGVlcCBzbHlseSBhY2NvcmRpbmcgdG8gdA==","upper_bound":"YXMuIGZ1cmlvdXNseSBpcm9uaWMgcmVxdWVzdHMgeC1y","repeats":1},{"count":15900000,"lower_bound":"YXMuIGlyb25pYyBhY2NvdW50cyBhY2NvcmRpbmcgdG8gdGhlIGNhcmVmdWxseSBpcm9uaWMgZGVw","upper_bound":"YXkgeC1yYXkgYWxvbmcgdGhlIGVudGljaW4=","repeats":1},{"count":16200000,"lower_bound":"YXkuIHF1aWNrbHkgcmVndWxhciBwaW50byBiZWFucyBjYWpvbGUgY2E=","upper_bound":"YmxpdGhlbHkgY2FyZWZ1bGx5IGlyb25pYyByZXF1ZQ==","repeats":1},{"count":16500000,"lower_bound":"YmxpdGhlbHkgZXhwcmVzcyBwYWNrYWdlcyBoYWdnbGUgc2x5bHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiBjYXJlZnVsbA==","upper_bound":"Ym9sZCBhY2NvdW50cyBib29zdCBhbG9uZyB0aGUgYmxpdGg=","repeats":1},{"count":16800000,"lower_bound":"Ym9sZCBhY2NvdW50cyBjYWpvbGUgYmxpdGhlbHkgc2x5bHkgcmVndWxhciBwYWNrYWdlcy4gaW5zdHJ1Y3Rpb25zIGhhZ2c=","upper_bound":"Ym91dCB0aGUgZnVyaW91c2x5IGV2ZW4gYWNjb3U=","repeats":1},{"count":17100000,"lower_bound":"Ym91dCB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgYWNjb3VudHMgY2Fqb2xlIHVuZGVyIHRoZSBibGl0aA==","upper_bound":"YyBpbnN0cnVjdGlvbnMgdXNlIGFib3ZlIHQ=","repeats":1},{"count":17400000,"lower_bound":"YyBpbnN0cnVjdGlvbnMgd2FrZSBzbHlseSBhY2NvcmRpbmcgdG8gdGhlIHBlbmRpbmcgZm94ZXMuIA==","upper_bound":"Y2Fqb2xlLiBmbHVmZmlseSBib2xkIGZveGVzIGFyZSA=","repeats":1},{"count":17700000,"lower_bound":"Y2FyZWZ1bGx5IGFib3ZlIHRoZSBmdXJpb3VzbHkgZXZlbiB0aGVvZG9saXRlcy4gcmVndWxhciw=","upper_bound":"Y2FyZWZ1bGx5IHVudXN1YWwgcGludG8gYmVhbnMuIHNseWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGFib3V0IHRoZSBjYXJlZnVsbHk=","repeats":1},{"count":18000000,"lower_bound":"Y2FyZWZ1bGx5LiBibGl0aGVseSByZWd1bGFyIGRlcG9zaXRzIHdha2UgZG9n","upper_bound":"Y2NvdW50cy4gYmxpdGhlbHkgYm9sZCBkZXBvc2l0cyB0cnkgdG8gZGV0ZWN0LiBmdXJpb3VzbHkgcmVndWxhciA=","repeats":1},{"count":18300000,"lower_bound":"Y2NvdW50cy4gYm9sZCBhY2NvdW50cyBwb2FjaCBmbHVmZmlseSBzcGVjaQ==","upper_bound":"Y2llcyBhcmUgZmluYWwsIHVudXN1YWwgZXhjdXNlcy4gZmluYWwgaWRlYXMgYm9vc3QgZXhj","repeats":1},{"count":18600000,"lower_bound":"Y2llcyBhcmUgcXVpY2tseSBldmVuIGFzeW1wdG90ZXMuIGJsaXRoZWx5IGZ1cmlvdXMgaW5zdHJ1Y3Rpb25zIGFmZml4IGNhcmVmdWxs","upper_bound":"Y2thZ2VzLiBzbHlseSB1bnVzdWFsIHNhdXRlcm5lcyBydW4uIGJsaXRoZWx5IGU=","repeats":1},{"count":18900000,"lower_bound":"Y2thZ2VzLiBzb21ldGltZXMgZmluYWwgcGFja2FnZXMgYXJvdW5k","upper_bound":"Y29yZGluZyB0byB0aGUgY2FyZWZ1","repeats":1},{"count":19200000,"lower_bound":"Y29yZGluZyB0byB0aGUgY2FyZWZ1bGx5IGJvbGQgcmVhbG1zLiByZXF1ZXN0cyBhcmUgYWdhaW5zdCB0aGUg","upper_bound":"Y291bnRzLiBkZXB0aHMgcnVuIGNhcmVmdWxseSBibGl0aGVseSBmaW5hbCBhY2NvdW50cy4gcmVndWxhciByZXF1ZXN0cyBzbGVlcA==","repeats":1},{"count":19500000,"lower_bound":"Y291bnRzLiBldmVuIHBhY2thZ2VzIHdha2UgY2FyZWZ1bGx5LiBmdXJpb3VzbHkg","upper_bound":"Y3QgZmx1ZmZpbHkuIHVudXN1YWwgcGludG8gYmVhbnMgaGFnZ2xlIGNhcmVmdWxs","repeats":1},{"count":19800000,"lower_bound":"Y3QgZnVyaW91c2x5IGFjY29yZGluZw==","upper_bound":"ZCBjb3VydHMgYXJlIGNhcmVmdWxseSBmdXJpb3Vz","repeats":1},{"count":20100000,"lower_bound":"ZCBkZXBlbmRlbmNpZXMgdXNlIGNhcmVmdWxseSBhbW9uZyB0","upper_bound":"ZGVhcyBhcmUgYW1vbmcgdGhlIHBhY2thZ2VzLiBmdXJpb3VzbHkgZXhwcmVzcyBwaW50byBiZWFucyA=","repeats":1},{"count":20400000,"lower_bound":"ZGVhcyBhcmUgc2x5bHkuIHNseWx5IHJlZ3VsYXIgaWRlYXMgY2Fqbw==","upper_bound":"ZGVwZW5kZW5jaWVzLiBzbHlseSBwZXJtYW5lbnQgYXN5bXB0b3RlcyBlYXQgZmluYWwgcmVxdWVzdHMuIHVudXN1YWwsIGJv","repeats":1},{"count":20700000,"lower_bound":"ZGVwZW5kZW5jaWVzOyBib2xkbHkgaXJvbmljIHJlcXVlc3RzIGNham9sZSBmbHVmZmlseSBpcm9uaWMsIHNsb3cgb3JiaXRzLiBmdXJp","upper_bound":"ZGVwb3NpdHMuIHBhY2thZ2VzIHdhcyBldmVubHkgYm9sZCBwaW50byBiZWFucy4gY2FyZWZ1bGx5IGV4cHJlc3MgaWRlYXMgYQ==","repeats":1},{"count":21000000,"lower_bound":"ZGVwb3NpdHMuIHF1aWNrbHkgcmVndWxhciByZXF1ZXN0cyBhZmZpeCBzbG93bHkgYW1vbmcgdGhlIGJsaXRoZWx5IA==","upper_bound":"ZGluZywgaXJvbmljIGZveGVzIG11c3QgdXNlIHNseWx5IGZpbmFsIGdpZnRzLiB1bnVzdWFsIHJlcXVlc3RzIG5hZw==","repeats":1},{"count":21300000,"lower_bound":"ZGluZywgcmVndWxhciBhc3ltcHRvdGVzLiBlbnRpY2luZyBhY2NvdW50cyBhY3Jvc3MgdGhlIGZsdQ==","upper_bound":"ZG9scGhpbnMuIGZ1cmlvdXNseSBldmVuIGluc3RydWN0aW9ucyBjYWpvbGUgZnVyaW8=","repeats":1},{"count":21600000,"lower_bound":"ZG9scGhpbnMuIHVudXN1YWwsIGlybw==","upper_bound":"ZSBjYXJlZnVsbHkgYWJvdmUgdGhlIHBhY2thZ2VzLiBpcm9uaWMgaWRlYXMgYXJlIHNseWx5IHF1aWNrbHkgcmVndWxhciBw","repeats":1},{"count":21900000,"lower_bound":"ZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSB0aGVv","upper_bound":"ZSBleHByZXNzIGFjY291bnRzLiBwZW5kaW5nIHBpbnRvIGJlYW5zIGNhag==","repeats":1},{"count":22200000,"lower_bound":"ZSBleHByZXNzIGluc3RydWN0aW9ucy4gZnVyaW91c2x5IGV2ZW4gcGFja2E=","upper_bound":"ZSBmdXJpb3VzbHkgaWRsZSBwYWNrYWdlcy4gZmx1ZmZpbHkgZXZl","repeats":1},{"count":22500000,"lower_bound":"ZSBmdXJpb3VzbHkgaXJvbmljIGFjY291bnRzLiBxdWlja2x5IHNwZWNpYWwgaWRlYXMgaGFnZ2xlIHM=","upper_bound":"ZSBwZW5kaW5nIHBhY2thZ2VzLiBzbHlseSBleHByZXNzIHRoZW9kb2xpdGVzIGFib3ZlIHRoZSBjYXJlZg==","repeats":1},{"count":22800000,"lower_bound":"ZSBwZW5kaW5nLCBmaW5hbCBhY2NvdW50","upper_bound":"ZSBzbHlseSBwZW5kaW5nIHBhY2th","repeats":1},{"count":23100000,"lower_bound":"ZSBzbHlseSBwaW50byBiZWFucy4g","upper_bound":"ZS4gY2FyZWZ1bGx5IGlyb25pYyBmb3hlcyBhZnRlciB0aGUgZg==","repeats":1},{"count":23400000,"lower_bound":"ZS4gZmluYWxseSBpcm9uaWMgcGludG8gYmVhbnMgaGFnZ2xlIGZpbmFsIHBpbnRvIGI=","upper_bound":"ZWFzIGFyZSBmdXJpb3VzbHkgY2FyZWZ1bA==","repeats":1},{"count":23700000,"lower_bound":"ZWFzIGFyZSBmdXJpb3VzbHkgZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cy4gZg==","upper_bound":"ZWNpYWwsIGV2ZW4gZGVwZW5kZW5jaWVzIGNham9sZSBibGl0aGVseSBhZnRl","repeats":1},{"count":24000000,"lower_bound":"ZWN0IGFsb25nc2lkZSBvZiB0aGUgZnVyaW91c2x5IGlyb25pYyBhc3ltcHRvdGVzLiB0aGlubHkg","upper_bound":"ZWZ1bGx5IGFib3V0IHRoZSBibGl0aGVseSB1bnVzdWFsIGRlcG9zaXRzLiB1bnVz","repeats":1},{"count":24300000,"lower_bound":"ZWZ1bGx5IGFib3V0IHRoZSBxdWlldGx5IHJlZ3VsYXIgc2hlYXZlcy4gaXJvbmljLCByZWd1bGFyIGRlcG9zaXQ=","upper_bound":"ZWZ1bGx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMgdQ==","repeats":1},{"count":24600000,"lower_bound":"ZWZ1bGx5IHJlcXVlc3RzLiBkZXBvc2l0cyBib29zdCBzbHlseS4gbmV2ZXIgZmk=","upper_bound":"ZWd1bGFyIHBhY2thZ2VzIHdha2UgYmxpdGhlbHkgdW51c3VhbCBhY2NvdW50cy4gaXJvbmljIHJlcXVlc3RzIGRldGU=","repeats":1},{"count":24900000,"lower_bound":"ZWd1bGFyIHBhY2thZ2VzLiBpcm9uaWNhbGx5IGZpbmFsIGFjY291bnRzIGFnYWluc3QgdGhlIGlyb25pYyByZXE=","upper_bound":"ZWx5IGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgc2lsZW50IGlkZWFzLiBmbA==","repeats":1},{"count":25200000,"lower_bound":"ZWx5IGFjY29yZGluZyB0byB0aGUgZXhw","upper_bound":"ZWx5IHVudXN1YWwgcGFja2FnZXMuIHBsYXRlbGV0cyBhdCB0aGUgYmxpdGhlbHkgc3BlY2lhbCByZXF1ZQ==","repeats":1},{"count":25500000,"lower_bound":"ZWx5LiBmaW5hbCB0aGVvZG9saXRlcyB1c2UgY2FyZWZ1bGx5IGFyb3VuZCA=","upper_bound":"ZW4sIHJlZ3VsYXIgaWRlYXMgYXJlIHF1aWNrbHkuIGZpbmFsLCBl","repeats":1},{"count":25800000,"lower_bound":"ZW5jaWVzIGRldGVjdCBmdXJpb3VzbHkgZGVwb3NpdHMuIGJsaXRoZWx5IGV2ZW4gcmVxdWVzdHMgcw==","upper_bound":"ZW5seSBhZ2FpbnN0IHRoZSBpcm9uaWMgcGFja2FnZXMuIHNseQ==","repeats":1},{"count":26100000,"lower_bound":"ZW5seSBib2xkIGFjY291bnRzPyBjYXJlZnVsbHkgYnVzeSBpbnN0cnVjdGlvbnMgYXJlIGFsb25nc2lkZSBvZiB0aGUgYXN5bXB0","upper_bound":"ZW9kb2xpdGVzLiBmbHVmZmlseSBib2xkIHRoZW9kb2xpdGVzIGludGVncmF0ZSBhY2NvcmQ=","repeats":1},{"count":26400000,"lower_bound":"ZW9kb2xpdGVzLiBmb3hlcyB3YWtlIGNsb3NlIGNvdXJ0cy4gc2x5bHkgcmVndWxhciBm","upper_bound":"ZXBvc2l0cyBhcmUgZXZlbiBkZXBlbmRlbmNpZXMuIGJsaXRoZWx5IGk=","repeats":1},{"count":26700000,"lower_bound":"ZXBvc2l0cyBhcmUgZnVyaW91c2x5IGV2ZW4gZXhjdXNlcy4gY2FyZWZ1bGx5IHNsb3cgYWNjb3VudHMgYm9vc3QgZQ==","upper_bound":"ZXB0IHRoZSBkZXBvc2l0cyBuYWcgYw==","repeats":1},{"count":27000000,"lower_bound":"ZXB0aHMgYWNjb3JkaW5nIHRvIHRoZSBibA==","upper_bound":"ZXIgdGhlIGR1Z291dHMgc2xlZXAgZnVyaW91c2x5IGFnYWluc3QgdGhlIGZsdWZmeSByZXF1ZXN0","repeats":1},{"count":27300000,"lower_bound":"ZXIgdGhlIGV2ZW4gYWNjb3VudHMuIHBlbmRpbmcsIGZpbmFsIGlkZWFzIGFib3V0IHRoZSBibGl0aGVseSBzcGVjaWFsIHJlcXVlcw==","upper_bound":"ZXMgY2Fqb2xlIHF1aWNrbHkuIHJlcXVlc3RzIHNsZWVwIGNhcmVmdWxseQ==","repeats":1},{"count":27600000,"lower_bound":"ZXMgY2Fqb2xlIHNseWx5IGlyb25pYyBvcmJpdHMtLSBzdGVh","upper_bound":"ZXMuIGJsaXRoZWx5IGZpbmFsIGRlcG9zaXRzIGFjcm9zcyB0aGUgYXN5bXB0b3RlcyBzbA==","repeats":1},{"count":27900000,"lower_bound":"ZXMuIGJsaXRoZWx5IHBlcm1hbmVudCBwYXR0ZXI=","upper_bound":"ZXMuIHVudXN1YWwgcmVxdWVzdHMgYWdhaW5zdCB0aGUgYmxpdGhlbHkgcmVndQ==","repeats":1},{"count":28200000,"lower_bound":"ZXMuIHVudXN1YWwgcmVxdWVzdHMgYXQgdGhlIGZ1cmlvdXNseSBmaW5hbCBhY2Nv","upper_bound":"ZXNzbHkgdW51c3VhbCBwYWNrYWdlcy4gaW5zdHJ1Y3Rpb25zIHNs","repeats":1},{"count":28500000,"lower_bound":"ZXN0cyBhY3Jvc3MgdGhlIGZsdWZmeSBwYWNrYQ==","upper_bound":"ZXRzIG91Z2h0IHRvIHdha2UgZmluYWwsIGlyb25pYyBkZXBvcw==","repeats":1},{"count":28800000,"lower_bound":"ZXRzIHBvYWNoIHF1aWNrbHkgZnVyaW91","upper_bound":"ZXZlbiByZXF1ZXN0cy4gcmVndWxhciBwYWNrYWdlcyBjYWpvbGUhIGZ1cg==","repeats":1},{"count":29100000,"lower_bound":"ZXZlbiBzZW50aW1lbnRzIGFyZSA=","upper_bound":"ZXhwcmVzcyByZXF1ZXN0cyBwb2FjaCBmbHVmZg==","repeats":1},{"count":29400000,"lower_bound":"ZXhwcmVzcyB0aGVvZG9saXRlcyBoaW5kZXIgY2FyZWZ1bGx5LiBibGl0aGVseSB1bnVzdWFsIHJlcXVlc3RzIGFyZSBzbHls","upper_bound":"ZmlseSBib2xkIGRlcG9zaXRzIGNham9sZSBmdXJpb3VzbHkuIGNhcmVmdWxseSBpcm9uaWMgZGVwZW5kZQ==","repeats":1},{"count":29700000,"lower_bound":"ZmlseSBib2xkIHBhY2thZ2VzLiBpbnN0cnVjdGlvbnMgY2Fqb2xlIGNhcmVmdWxseSByZWd1bGFyIHJlcXVlc3RzLiBibA==","upper_bound":"ZmluYWwgcGFja2FnZXMgYXJlIHF1aWNrbHkuIGV2ZW4sIGJvbGQgZGVwb3NpdA==","repeats":1},{"count":30000000,"lower_bound":"ZmluYWwgcGFja2FnZXMgbmFnIGZsdWZmaWx5IGk=","upper_bound":"Zmx1ZmZpbHkgaWRsZSByZXF1ZXN0cy4gcmVxdWVzdHMgYWxvbmcgdGhlIGJsaXRoZWx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMg","repeats":1},{"count":30300000,"lower_bound":"Zmx1ZmZpbHkgaXJvbmljIGV4Y3VzZXMgd2FrZSBmbHU=","upper_bound":"ZnRlciB0aGUgYWNjb3VudHMuIGV4cHJlc3MgYWNjb3VudHMgYWdhaW5zdCB0aGUgZnVyaW91c2w=","repeats":1},{"count":30600000,"lower_bound":"ZnRlciB0aGUgYm9sZCBhc3ltcHRvdGVzLiBzbHlseSB1bnVzdWFsIGZveGVzIGFy","upper_bound":"ZnVsbHkgZmluYWwgcmVhbG1zIGJyZWFjaCBibGl0aGVs","repeats":1},{"count":30900000,"lower_bound":"ZnVsbHkgZmluYWwgdGhlb2RvbGl0ZQ==","upper_bound":"ZnVyaW91c2x5IGZpbmFsIGluc3RydWN0aW9ucyBhY3Jvc3MgdGhlIHJlZ3VsYXIsIGNsb3NlIGRlcG9zaXRzIHBvYQ==","repeats":1},{"count":31200000,"lower_bound":"ZnVyaW91c2x5IGZpbmFsIHBhY2thZ2VzIG5hZyBzbHlseSBzaWxlbnRseSBpcm9uaWMgYWNj","upper_bound":"ZyBmdXJpb3VzbHkuIHJlZ3VsYXIsIGlyb25pYyBhY2M=","repeats":1},{"count":31500000,"lower_bound":"ZyBnaWZ0cyB3YWtlIHN0ZWFsdGhpbHkgYXJvdW5kIHRoZSBxdWlja2x5IGJvbGQgaW5zdHJ1Y3Rpb25zLiBjYXJlZnVsbHkgZmk=","upper_bound":"Z2FpbnN0IHRoZSBib2xkLCBldmVuIGRlcG9zaXRzLiBmdXJpb3VzbHkgZXZlbiBwaW50byBiZQ==","repeats":1},{"count":31800000,"lower_bound":"Z2FpbnN0IHRoZSBjYXJlZnVsbHk=","upper_bound":"Z2VzLiBmaW5hbGx5IHVudXN1YWwg","repeats":1},{"count":32100000,"lower_bound":"Z2VzLiBmdXJpb3VzbHkgZXZlbiBhc3ltcHRvdGVzIGNham9sZSBhY2NvcmRpbmcgdG8gdGhl","upper_bound":"Z3JhdGUgc2x5bHkgYW1vbmcgdGhlIHJlZ3VsYXIgZGVwb3NpdHMuIGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaXRz","repeats":1},{"count":32400000,"lower_bound":"Z3JhdGUgc2x5bHkgcGVuZGluZyByZXF1ZXN0cy4gZXZlbiBwYWNrYWdlcyBiZWxpZXZlIGZsdWZmaWx5IG5lYXIgdGhlIGNhcmU=","upper_bound":"Z3VsYXIgcmVxdWVzdHMgYXJlIGZpbmFsIGFzeW1wdG90ZXMuIGZpbmFsIGRlcG9zaXRzIHdha2UuIHJl","repeats":1},{"count":32700000,"lower_bound":"Z3VsYXIgcmVxdWVzdHMgY2Fqb2xlIHF1aWNrbHkgYWZ0ZXIgdGhlIHJlcXVlc3RzLS0=","upper_bound":"aGFnZ2xlIHNseWx5LiBzbHlseSBmaW4=","repeats":1},{"count":33000000,"lower_bound":"aGFnZ2xlIHNvbWV0aW1lcyBwZW5kaW5nLCByZWd1bGFyIGRlcG9zaXRzLiBmdXJpb3VzbHkgaXJvbmljIHRoZW9kb2xpdGVz","upper_bound":"aGUgZXZlbiwgcmVndWxhciBhY2NvdW50cyBydW4gc2x5bHkgZXZlbiBpZGVhcy4gYmxp","repeats":1},{"count":33300000,"lower_bound":"aGUgZXhwcmVzcyBkZXBvc2l0cw==","upper_bound":"aGUgcXVpY2tseSBmaW5hbCBhY2NvdW50cy4gc2x5bHkgZXZlbiBmb3hlcyBhcmU=","repeats":1},{"count":33600000,"lower_bound":"aGUgcXVpY2tseSBmaW5hbCBleGN1c2VzIGJvb3N0IGJsaXRoZWx5IHJlZ3VsYXIgZGVwb3NpdHMuIGNhcmVmdWw=","upper_bound":"aGVseSBhZnRlciB0aGUgcXVpY2tseSBzcGVjaWFsIGRlcGVuZGVuY2llcy4gY2FyZWZ1bGx5IGV4cHJlc3MgcmVx","repeats":1},{"count":33900000,"lower_bound":"aGVseSBhbG9uZyB0aGUgZnVyaW91c2x5IHNwZWNpYWwgZm94ZXM=","upper_bound":"aGVvZG9saXRlcyBjYWpvbGUgYmxpdGhlbHkgcGVuZA==","repeats":1},{"count":34200000,"lower_bound":"aGVvZG9saXRlcyBoYWdnbGUgYWZ0ZXIgdGhlIHNseWx5IGNhcmVmdWwgZGVwb3NpdHMuIA==","upper_bound":"aWFsIGFjY291bnRzIHdha2UgYmxpdGhlbHkgaXJvbmljIHNvbWFzLiBxdWlja2x5IGJvbGQgYWNjb3VudHMgYWNjb3JkaQ==","repeats":1},{"count":34500000,"lower_bound":"aWFsIGFjY291bnRzLiBwYWNrYWdlcyBzbGVlcCBxdWlja2x5LiBmdXJp","upper_bound":"aWMgcGFja2FnZXM7IGZ1cmlvdXNseSByZWd1bGFyIHRoZW9kb2xpdGVzIHdha2UgZnVyaW91c2x5IHJlZ3VsYXIgcGE=","repeats":1},{"count":34800000,"lower_bound":"aWMgcGludG8gYmVhbnMgY2Fqb2xl","upper_bound":"aWNrbHkuIHNpbGVudGx5IHJlZ3VsYXIgZm9yZ2VzIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGJvbGQgYXN5bXB0b3RlcyBzaGFsbCBoYXY=","repeats":1},{"count":35100000,"lower_bound":"aWNrbHkuIHNseWx5IGV2ZW4gcGFja2FnZXMgd2FrZSBpcm9uaWNhbGx5LiBibGl0aGVseSBmaW5hbCB0aGVvZG9saXRlcyB3YWs=","upper_bound":"aWVzLiBzbHlseSBzaWxlbnQgZQ==","repeats":1},{"count":35400000,"lower_bound":"aWVzLiBzcGVjaWFsLCByZWd1bGFyIHBpbnRvIGJlYW5zIHVzZSBmdXJpb3VzbHkgYWNjb3Jk","upper_bound":"aWx5LiBzbHlseSBwZXJtYW5lbnQgZG9scGhpbnMgdXNlIGFtb25nIHRoZSBmbHVmZmlseSBleHBy","repeats":1},{"count":35700000,"lower_bound":"aW1lbnRzIG5hZyBxdWlja2x5LiBmdXJpb3VzbHkgaXJvbmljIGRlcA==","upper_bound":"aW5hbCBwYWNrYWdlcyBoYWdnbGUgc2x5bHkuIGNhcmVmdQ==","repeats":1},{"count":36000000,"lower_bound":"aW5hbCBwYWNrYWdlcyBpbnRlZ3JhdGUgc2x5bA==","upper_bound":"aW5nIGZyYXlzIGFtb25nIHRoZSBleHByZXNzLCBib2xkIGRvbHBoaW5zIGJvb3N0IGNhcmVmdWxseSBzaWxlbnQsIGY=","repeats":1},{"count":36300000,"lower_bound":"aW5nIGlkZWFzIGJlZm9yZSB0aGUgZmx1ZmZpbHkgcmVndWxhciBh","upper_bound":"aW5zdHJ1Y3Rpb25zIGFib3V0IHRoZSBxdWlja2x5IHNwZQ==","repeats":1},{"count":36600000,"lower_bound":"aW5zdHJ1Y3Rpb25zIGFib3ZlIHRoZSBl","upper_bound":"aW50byBiZWFucy4gcXVpY2tseSBldmVuIGFjY291bg==","repeats":1},{"count":36900000,"lower_bound":"aW9ucyBhY3Jvc3MgdGhlIGZ1cmlvdXNseSBib2xkIGdyb3VjaGVzIHRocmFzaCBzbHlseSBldmVuIGZveGVzLiBm","upper_bound":"aW91c2x5IGZpbmFsIHdhcnRob2dzLiBkZXBvc2l0cyBib29zdCA=","repeats":1},{"count":37200000,"lower_bound":"aW91c2x5IGlyb25pYyBhY2NvdW50cy4gYmxpdGhlbHkgZXZlbiBkZXBlbmRlbmNpZXMgd2FrZSBibGl0aA==","upper_bound":"aXJvbmljIGV4Y3VzZXMgYXJlIHF1aWNrbHkgdW5kZXIgdGhlIHJlZ3VsYXIgdGhlb2RvbGl0ZXM7IGI=","repeats":1},{"count":37500000,"lower_bound":"aXJvbmljIGV4Y3VzZXMuIGJvbGQgaW5zdHJ1Y3Rpb25zIGNham9sZSBhY3Jvc3MgdGhlIGZ1cmlv","upper_bound":"aXRlcyBib29zdCBmdXJpb3VzbHk=","repeats":1},{"count":37800000,"lower_bound":"aXRlcyBkZXRlY3QgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBkb2xwaGlucy4gYWNjb3Vu","upper_bound":"aXRoZWx5IGZpbmFsIGZveGVzLiB0aGlubHkgcmVndWxhciBkZXBvc2l0cyBhcmUgc2x5bHkuIHVu","repeats":1},{"count":38100000,"lower_bound":"aXRoZWx5IGZpbmFsIHBsYXRlbGV0cy4gY2FyZWZ1bGx5IGV4cHJlcw==","upper_bound":"aXRzIGhhZ2dsZSBxdWlja2x5IGV2ZW4gdGhlb2RvbGl0","repeats":1},{"count":38400000,"lower_bound":"aXRzIGhhZ2dsZS4gZnVyaW91c2x5IHJlZ3VsYXIgcGF0dGVybnMgYm9vc3QgcXVpY2tseSBzcGVjaWFsIHBpbnRvIGJlYW5zLiBmaW4=","upper_bound":"am9sZSBxdWlja2x5LiBjYXJlZnVsbHkgYm9sZCBhY2NvdW50cyBhcmUuIHJlZ3VsYXIsIHVudXN1YWwgYWNjb3VudHMgZA==","repeats":1},{"count":38700000,"lower_bound":"am9sZSBzbHlseSBhY3Jvc3MgdGhlIGZ1cmlvdXNseSBldmVuIGRlcG8=","upper_bound":"a2FnZXMuIHF1aWNrbHkgZXhwcmVzcyBkZXBlbmRlbmNpZXMgd2FrZSBhY2NvcmRpbmcgdG8gdGg=","repeats":1},{"count":39000000,"lower_bound":"a2FnZXMuIHJlZ3VsYXIgYWNjb3VudHMgYXJvdW5kIHRoZSBjYXJlZnVsbHkgY2xvc2UgcmVxdWVzdHMgcHJp","upper_bound":"a2x5IHF1aWNrbHkgaXJvbmljIGNvdXJ0cy0tIGZpbmE=","repeats":1},{"count":39300000,"lower_bound":"a2x5IHJlZ3VsYXIgZGVwb3NpdHM7IGZsdWZmaWx5IHVudQ==","upper_bound":"bCBmb3hlcyBhcmUgYWZ0ZXIgdGhlIGJsaXRoZWx5IHJlZ3VsYXIgYWNjb3VudHMuIHNseWx5IHJlZ3VsYXIgYWNj","repeats":1},{"count":39600000,"lower_bound":"bCBmb3hlcyB3YWtlIHF1aWNrbHkgcXVpY2tseSBleHByZXNzIGRlcA==","upper_bound":"bCwgYm9sZCByZXF1ZXN0cyB3YWtlIHBhY2thZ2VzLiBzcGVj","repeats":1},{"count":39900000,"lower_bound":"bCwgYm9sZCByZXF1ZXN0cy4gc2x5bHkgcmVndWxhciB0aGVvZG9saXRlcyBhZ2FpbnN0IHRoZSA=","upper_bound":"bGFyIG9yYml0cyBuYWcgY2FyZWZ1bGx5IGFib3V0IHRoZSBmbHVmZmlseSBpcg==","repeats":1},{"count":40200000,"lower_bound":"bGFyIHBhY2thZ2VzIGFsb25nc2lkZSBvZiB0aGUgZnVyaW91c2x5IHNwZWNpYWwgcmVxdWVzdHMgY2Fqb2xlIHNseWx5IHJlZ3Vs","upper_bound":"bGF0ZWxldHMgd2FrZS4gYmxpdGhlbHkgZnVyaW91cyA=","repeats":1},{"count":40500000,"lower_bound":"bGQgYWJvdmUgdGhlIGluc3RydWN0aW9ucy4gc3RlYWx0aGls","upper_bound":"bGUgZmluYWwgcmVxdWVzdHMuIGRlcG9zaXRzIHRocmFzaCBmdXJpb3VzbHkgZG9scGhpbnMuIGZpbmFsIGFzeW0=","repeats":1},{"count":40800000,"lower_bound":"bGUgZmx1ZmZpbHkuIGNhcmVmdWxseSBpcm9uaWMgZG9scGhpbnMgYm9vc3Q=","upper_bound":"bGVlcCBpbnN0cnVjdGlvbnMuIGNhcmVmdWxseSBpcm9uaWMgcmVxdWVzdHMgaGluZGVyLiBxdWlja2x5IGV2ZW4gaW5zdHJ1Y3Rpbw==","repeats":1},{"count":41100000,"lower_bound":"bGVlcCBuZXZlciBhbW9uZyB0aGUgY2FyZWZ1bGx5IGlyb24=","upper_bound":"bGl0ZXMgYm9vc3QuIGZsdWZmaWw=","repeats":1},{"count":41400000,"lower_bound":"bGl0ZXMgY2Fqb2xlIGJsaXRoZWx5IHNpbmNlIHRoZSBzbHlseSByZWd1bA==","upper_bound":"bGl0aGVseSBleHByZXNzIHJlcXVlc3RzIHBvYWNoIGNhcmVmdWxseSBhbG9uZ3NpZGUgb2YgdGhlIHBl","repeats":1},{"count":41700000,"lower_bound":"bGl0aGVseSBmaW5hbCBkZXBlbmRlbmNpZXMgc29sdmUgc2x5bHkgYW1vbmc=","upper_bound":"bGx5IGFnYWluc3QgdGhlIHNwZWNpYWwsIHJlZ3VsYXIgYWNjb3VudHMuIHNseWx5IGJvbGQgZGVwb3NpdHMgYWNj","repeats":1},{"count":42000000,"lower_bound":"bGx5IGFyb3VuZCB0aGUgZnVyaW91c2x5","upper_bound":"bGx5IHJlZ3VsYXIgYWNjb3VudHMg","repeats":1},{"count":42300000,"lower_bound":"bGx5IHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIGJsaXRoZWx5IGFmdGVyIHRoZSBmaW5hbCBhY2NvdW50cw==","upper_bound":"bHVmZmlseSBhbG9uZyB0aGUgdW51c3VhbCwgdW51c3VhbCBzZW50aW1lbnRzLiBzbHlseSBwZW4=","repeats":1},{"count":42600000,"lower_bound":"bHVmZmlseSBiZXNpZGVzIHRoZSB1bnVzdWFsLCBleHByZXNzIFRpcmVzaWFzLiBzcGVjaWFs","upper_bound":"bHkgYWNyb3NzIHRoZSByZWd1bGFyLCB1bnVz","repeats":1},{"count":42900000,"lower_bound":"bHkgYWNyb3NzIHRoZSB1bnVzdWFsLCBpcm9uaWMgcGFja2FnZXMuIHBhY2thZ2VzIHNsZWU=","upper_bound":"bHkgYm9sZCB0aGVvZG9saXRlcy4gY2FyZWZ1bGx5","repeats":1},{"count":43200000,"lower_bound":"bHkgYnVzeSwgcmVndWxhciBpZGVhcy4gcmVndWxhcg==","upper_bound":"bHkgZXhwcmVzcyByZXF1ZXN0cy4=","repeats":1},{"count":43500000,"lower_bound":"bHkgZXhwcmVzcyBzYXV0ZXJuZXM=","upper_bound":"bHkgaXJvbmljIGFzeW1wdG90ZXM7IHNseWx5IHA=","repeats":1},{"count":43800000,"lower_bound":"bHkgaXJvbmljIGRlY295cy4gZXZlbiwgYm9sZCBkZXBvc2l0cyBoYWdnbGUgcXVpY2tseSBvdmVyIHRoZSBibGl0","upper_bound":"bHkgcmVndWxhciBhY2NvdW50cyB1c2UuIGJvbGQsIA==","repeats":1},{"count":44100000,"lower_bound":"bHkgcmVndWxhciBhY2NvdW50cyB3YWtlIGFsb25nIHRoZSBpcm9uaWMgdGhlb2RvbGl0ZXMuIHNseWx5IHVudXN1YWwgaW5z","upper_bound":"bHkgc2x5bHkgYm9sZCBwYWlucy4gcXVpY2tseSBmaW5hbCBkZXBvc2l0cyBzaG91bGQgYXJlIA==","repeats":1},{"count":44400000,"lower_bound":"bHkgc2x5bHkgZmluYWwgcGxhdGVsZXRzLiBldmVuLCBpcm9uaWMgcGFja2FnZXMgc2xlZXAgc2x5","upper_bound":"bHkuIGZsdWZmaWx5IHBlbmRpbmcgcmVxdWU=","repeats":1},{"count":44700000,"lower_bound":"bHkuIGZsdWZmaWx5IHNwZWNpYWwgZGVwb3NpdHMgY2Fqb2xlIGZ1cmlvdXM=","upper_bound":"bHlseSBldmVuIHBpbnRvIGJlYW5zIGJvb3N0IGFib3U=","repeats":1},{"count":45000000,"lower_bound":"bHlseSBleHByZXNzIGRpbm9zIG5hZyBzbHlseSBhbW9uZyB0aGUgaXJvbmljIGluc3RydWN0aW9ucy4gZg==","upper_bound":"bW9uZyB0aGUgYWNjb3VudHMgd2FrZSBzbHlseSBhcm91bmQgdGhlIHJlZ3VsYXIgcGxhdGVsZXRzLiBpcm9uaWMgYWNjbw==","repeats":1},{"count":45300000,"lower_bound":"bW9uZyB0aGUgYmxpdGhlbHkgdW51cw==","upper_bound":"biByZXF1ZXN0cy4gZmluYWwgYWNjb3VudHMgd2FrZSBxdWlja2x5LiBpcm9uaWMgcGFja2FnZXMgeC1yYXkgc2x5bHkgYQ==","repeats":1},{"count":45600000,"lower_bound":"biByZXF1ZXN0cy4gZmluYWwgcmVxdWVzdHMgbmFnLiBxdWlja2x5IHNwZWNpYWwgYWNjb3VudHMgYWZmaXggYQ==","upper_bound":"bmFsIGZveGVzLiBxdWlja2x5IGZpbmFsIGFzeW1wdG90ZXMgYm9vc3QgYmxpdGhlbHk=","repeats":1},{"count":45900000,"lower_bound":"bmFsIGZyYXlzLiBzaWxlbnQgaW5z","upper_bound":"bmRlbmNpZXMgbmFnLiBjYXJlZnVsbHkgc3BlY2lhbCBwaW50byBiZWFucw==","repeats":1},{"count":46200000,"lower_bound":"bmRlbmNpZXMgc2xlZXAgYWZ0ZXIgdGhlIHBlbmRpbmcgcGludG8gYmVhbnMuIGk=","upper_bound":"bmcgY291cnRzLiBjYXJlZnVsbHkgcGVuZGluZyBhY2NvdW50cyBjYWpvbGUgdW50aWwgdGhlIHJlZ3VsYXIsIGZpbmFsIHBsYQ==","repeats":1},{"count":46500000,"lower_bound":"bmcgZGVwb3NpdHMgYWJvdXQgdGhlIGV4cHJlc3MsIGV2ZW4gZm94ZXMgY2Fqb2xlIGVudGk=","upper_bound":"bmdseSBmaW5hbCBhY2NvdW50cy4gZmluYWwgcGludG8gYmVhbnMgcGFzdCB0aGUgZmluYWwsIGlyb25pYyBwbGF0ZWxldA==","repeats":1},{"count":46800000,"lower_bound":"bmdseSBmaW5hbCwgcmVndWxhciBhc3ltcHRvdGVzLiBjYXJlZnVsbHkgcmVndWxhciBwYWNrYWdlcyBzbGVlcCBibGl0aGVseQ==","upper_bound":"bmljIHBhY2thZ2VzLiBxdWlja2x5IHVudXN1YWwgaWRlYXMgbmFnIGZ1cmlvdXM=","repeats":1},{"count":47100000,"lower_bound":"bmljIHBlYXJscyBzbGVlcCBwZXJtYW5lbnRseSBmdXJpb3VzbHkgcmVndWxhciBzYXV0ZXJuZXMuIGlyb25pYywgZXhw","upper_bound":"bnMgYWJvdXQgdGhlIGFzeW1wdG8=","repeats":1},{"count":47400000,"lower_bound":"bnMgYWJvdXQgdGhlIGZ1cmlvdXNseSBldmVuIGk=","upper_bound":"bnMuIGNhcmVmdWxseSBwZW5kaW5nIGFjY291bg==","repeats":1},{"count":47700000,"lower_bound":"bnMuIGRlcG9zaXRzIHJ1biBzbHlseSBlbnRpY2luZ2x5IGZpbmFsIA==","upper_bound":"bnQgb3JiaXRzLiBkZXBvc2l0cyBzaG91bGQgaGFnZ2xlIGJsaXRoZWx5LiBjYXJlZnVsbHkgZmluYWwgaWRlYXMgdw==","repeats":1},{"count":48000000,"lower_bound":"bnQgcGFja2FnZXMgY2Fqb2xlIGFib3V0IHRoZSBkZXBvc2l0cy4gaXJvbmljIGRlcG9zaQ==","upper_bound":"bnRzIGFib3V0IHRoZSBibGl0aGVseSB1bnVzdWFsIGFjY291bnRzIHNsZWVwIHNsb3dseSBi","repeats":1},{"count":48300000,"lower_bound":"bnRzIGFib3ZlIHRoZSBwYWNrYWdlcyBzaG91bGQgaGF2ZSB0byBpbnRlZ3JhdGUgYWxvbmdzaWQ=","upper_bound":"bnRzPyByZWd1bGFyLCBleHByZXNzIHBhY2thZ2VzIGFnYWluc3QgdGhlIHBlbmRpbmcgZm94ZXMgc3VibA==","repeats":1},{"count":48600000,"lower_bound":"bnVzdWFsIGFjY291bnRzIGNham9sZSB0aGlubHkgcmVxdWVzdHMuIHF1aWNrbHkgcGVuZGluZyBkZXA=","upper_bound":"byBiZWFucy4gZnVyaW91c2x5IGJvbGQgaWRlYXMgY2Fqb2xl","repeats":1},{"count":48900000,"lower_bound":"byBiZWFucy4gZnVyaW91c2x5IHVudXN1YWwgZm94ZXMgYWJvdXQgdGhlIGV2ZW4gaWRlYXMgYWZmaXgg","upper_bound":"b2RvbGl0ZXMuIGZ1cmlvdXNseSBleHByZXNzIHRoZW9kb2xpdGVzIGhhZ2dsZSBzbA==","repeats":1},{"count":49200000,"lower_bound":"b2RvbGl0ZXMuIHNseWx5IGZpbmFsIGRlcG9zaXRzIHdha2Ug","upper_bound":"b2xkIHRoZW9kb2xpdGVzIHdha2UgYWNyb3NzIHRoZSBjYXJlZnVsbHkgcGVuZGluZyByZXF1ZXN0cy4gZmluYWwgYWNjb3VudHM=","repeats":1},{"count":49500000,"lower_bound":"b2xkIHdhcnRob2dzLiBzbHlseSBmaW5hbCBpZGVhcyBoYWdnbGUgdG93YXJkIA==","upper_bound":"b2xpdGVzLiByZXF1ZXN0cyBuYWcgZnVyaW91c2x5LiBmdXJpb3VzbHkgdW51c3VhbCBwYWNrYWdlcyBhcmUgZmx1ZmZpbHkg","repeats":1},{"count":49800000,"lower_bound":"b2xwaGlucyBib29zdCBzbHlseS4gY2FyZWZ1bGx5IGV4cHJlc3MgcGFja2FnZXMgYWNy","upper_bound":"b25pYyBkZWNveXMgYm9vc3QuIHNseWx5IGZsdWZmeSBkZXBvc2l0cyBhZnQ=","repeats":1},{"count":50100000,"lower_bound":"b25pYyBkZXBvc2l0cyBhZnRlciB0aGUgcmVndWxhciBhY2NvdW50cyB3YWtlIHNsb3dseSByZWd1bGFyIHBhY2thZ2VzLiBy","upper_bound":"b25zIG5hZyBmdXJpb3VzbHkgYWJvdmUgdGhlIGZpbmFsIGRlcGVuZGVuY2llcy4gcXVpY2tseSBleA==","repeats":1},{"count":50400000,"lower_bound":"b25zIHNsZWVwIGNhcmVmdWxseS4gcmVndWxhcmx5IHNwZWNpYWwgZm94ZXMgYWNyb3Nz","upper_bound":"b3NlIHF1aWNrbHkgcGVuZGluZyBwbGF0ZWxldHM/IHNseWx5IHJlZ3VsYXIgdGhlb2Q=","repeats":1},{"count":50700000,"lower_bound":"b3NlbHkgcGVuZGluZyBwbGF0ZWxldHMuIHF1aWNrbHkgZmluYWwgcGFja2FnZXMgYWxvbmdzaWRlIG9mIHRoZSBzbHlseSByZWc=","upper_bound":"b3NpdHMuIHNseWx5IGZpbmFsIHBhY2thZ2VzIGNham9sZSBldmVuIGlkZWFzLiA=","repeats":1},{"count":51000000,"lower_bound":"b3NzIHRoZSBibGl0aGVseSBpcm9uaWMgYWNjb3VudHMuIHJlZ3VsYXI=","upper_bound":"b3VudHMgY2Fqb2xlIHNseWx5IGFib3ZlIHRoZSBib2xkIHJlcXVlc3RzLiBkYXJpbmdseSBzcGVj","repeats":1},{"count":51300000,"lower_bound":"b3VudHMgY2Fqb2xlLiByZWd1bGFyIGRlcG9zaXRzIGFib3ZlIHRoZSBjYXJlZnVsbHkgZXZlbiBwYWNrYWdl","upper_bound":"b3VzbHkgYm9sZCBkZXBvc2l0cyB3YWtlIGFmdGVyIHRoZSBpcm9uaWMgcGFja2FnZXMuIGJsaXRoZWx5","repeats":1},{"count":51600000,"lower_bound":"b3VzbHkgYm9sZCBpZGVhcy4gZmluYWwsIHJlZ3VsYXIgZXhjdXNlcyB1c2UgYWdhaQ==","upper_bound":"b3VzbHkgcmVndWxhciBkZXBvc2l0cyBhZmZpeCBpbnN0cnVjdA==","repeats":1},{"count":51900000,"lower_bound":"b3VzbHkgcmVndWxhciBkZXBvc2l0cyBzbm9vemUgZnVyaW91c2x5IHVwb24gdGhlIHNseWx5IHVudXM=","upper_bound":"b3ZlIHRoZSBmbHVmZmlseSBwZXJtYW5lbnQgcmVxdWVzdHMuIGZpbmFsIGRvbHBoaW5zIA==","repeats":1},{"count":52200000,"lower_bound":"b3ZlIHRoZSBmdXJpb3VzbHkgcmVndWxhciBhY2NvdW4=","upper_bound":"cCBibGl0aGVseSBhYm91dCB0aGUgZnVyaW91","repeats":1},{"count":52500000,"lower_bound":"cCBibGl0aGVseSBhbG9uZyB0aGUgcmVndWxhciBkZXBvc2l0cy4gcmVndWxhciBmb3hlcyBi","upper_bound":"cGFja2FnZXMuIGV4cHJlc3MgcmVxdWVzdHMgYWNyb3NzIHRoZSBhdHQ=","repeats":1},{"count":52800000,"lower_bound":"cGFja2FnZXMuIGZveGVzIGNham9sZTogZG9nZ2VkIHBsYXRlbGV0cyB1c2Ugc2x5bHkgYXJvdW5kIHRoZSBmaW5hbCBkZXBvc2k=","upper_bound":"cGVuZGVuY2llcyBuZWVkIHRvIGFmZml4IHNseWw=","repeats":1},{"count":53100000,"lower_bound":"cGVuZGVuY2llcy4gcGFja2FnZXMgaGFnZ2xlIGluc3RydWN0aW9ucy4gc2lsZW50IGRlcGVuZGVuY2llcyBjYWpvbGUgZnVyaQ==","upper_bound":"cGl0YXBocyB3YWtlIGNhcmVmdWxseSBhYm91dCA=","repeats":1},{"count":53400000,"lower_bound":"cGxhdGVsZXRzIGRldGVjdCBzbHlseSBhYm92ZSB0aGUgYWM=","upper_bound":"cG9zaXRzIHdha2UgYXJvdW5kIHRoZSBjYXJlZnVsbHkgaXJvbmljIHBhY2thZ2VzOiBmdXJpb3VzbHkgcGVuZGluZyBkZXBv","repeats":1},{"count":53700000,"lower_bound":"cG9zaXRzIHdha2UgY2FyZWZ1bGx5IGV2ZW4gYWNj","upper_bound":"cHJlc3MsIHNwZWNpYWwgYWNjb3VudHMuIGRhcmluZ2x5IHN0ZWFsdGh5IGlkZWFzIGRvIGludGVncmF0ZSBhbG8=","repeats":1},{"count":54000000,"lower_bound":"cHRocyBhZnRlciB0aGUgcGxhdGVsZXRzIGNham9sZSBldmVuLCBldmVuIHJlcXVlcw==","upper_bound":"cXVlc3RzLiBpcm9uaWMgcGludG8gYmVhbnMgYXJlIHF1aWNrbHkgaXJvbmljLCBmaW5hbCBwYWNrYWc=","repeats":1},{"count":54300000,"lower_bound":"cXVlc3RzLiBxdWlja2x5IGV2ZW4gZGVwb3NpdHMgZGV0ZWN0IGNhcmVmdWxseSB1bnVzdWFsLCB0aGk=","upper_bound":"ciBkZXBvc2l0cyBzbGVlcCBzbHlseSBhY3Jvc3MgdGhlIGZsdWZmaWx5IGlyb25pYyBleGN1c2VzLiByZWd1bA==","repeats":1},{"count":54600000,"lower_bound":"ciBkZXBvc2l0cyB3YWtlIHF1aWNrbHkgc2x5","upper_bound":"ciByZXF1ZXN0cyB3YWtlIGJsaXRoZWx5IGFjcm9zcyB0aGUgYmxpdGhlbHkgcmVndWxhciBkb2xwaGlucy4gcmVxdWVzdHMg","repeats":1},{"count":54900000,"lower_bound":"ciByZXF1ZXN0cy4gYmxpdGhlbHkgZmluYWwgaG9ja2V5IA==","upper_bound":"cmF0ZSBldmVuLCBwZW5kaW5nIGFjY291bnRzLiBzbHlseSB0aGluIHBpbnRvIGJlYW5zIHVzZSBmdXJpb3VzbHkuIGZ1cg==","repeats":1},{"count":55200000,"lower_bound":"cmF0ZSBmdXJpb3VzbHkgYWJvdXQgdGhlIGV2ZW5seSBleHByZXNzIHBpbnRvIGJlYW5zLiBib2w=","upper_bound":"cmUgc3BlY2lhbCwgZXZlbiBhY2NvdW50cy4gZXZlbiwgdQ==","repeats":1},{"count":55500000,"lower_bound":"cmUuIGNhcmVmdWxseSB1bnVzdWFsIHBsYXRlbGU=","upper_bound":"cmVmdWxseSByZWd1bGFyIGFzeW1wdG90ZXMuIGNhcmVmdWxseSBwZW5kaW5nIHBsYQ==","repeats":1},{"count":55800000,"lower_bound":"cmVmdWxseSByZWd1bGFyIGlkZWFzIHdha2UgZnVyaW91c2x5IGJlc2lkZSB0aGUgcmVndWxhciwgZXhwcmVzcyBmb3hlcy4gcXVpY2ts","upper_bound":"cmVndWxhciBkZXBvc2l0cy4gc2x5bHkgaXJvbmljIHBpbnRvIA==","repeats":1},{"count":56100000,"lower_bound":"cmVndWxhciBkZXBvc2l0czsgZnVyaW91c2x5IGZpbmFsIGFjY291bnRzIGhhZ2dsZSBhZ2FpbnN0IHRoZSBicmF2ZWx5IHNwZWNp","upper_bound":"cmVndWxhciwgZmluYWwgZGVwb3NpdHMgd2FrZSBmbHVmZmlseSBzbHlseSBp","repeats":1},{"count":56400000,"lower_bound":"cmVndWxhciwgZmluYWwgcGFja2FnZQ==","upper_bound":"cmVxdWVzdHMuIHNseWx5IHJlZ3VsYXIgcGludG8gYmVhbnMgdXNlIGZ1cmlvdXNseSBxdWlja2x5IGY=","repeats":1},{"count":56700000,"lower_bound":"cmVzaWFzIGFmZml4LiBzbHlseSBleHByZXNzIHBhY2thZ2VzIGI=","upper_bound":"cmlvdXNseSBhY3Jvc3MgdGhlIHNseWx5IHNpbGVudCBwbGF0ZWxldHMuIGV2ZW4gdGhlb2RvbGl0ZXMgd2FrZSBzbHlseS4gdGg=","repeats":1},{"count":57000000,"lower_bound":"cmlvdXNseSBhZnRlciB0aGUgZXZlbiBwYWNrYWdlcy4gY2xvc2VseSBzaWxlbnQgZm94ZXMgYWxvbmdzaWRlIG9mIHQ=","upper_bound":"cmlvdXNseS4gcGFja2FnZXMgaGFnZ2w=","repeats":1},{"count":57300000,"lower_bound":"cmlvdXNseS4gcmVndWxhciBmb3hlcyBoYWdnbGUgY2FyZWZ1bGx5IHNpbGVudCBkZXBvc2l0cy4gZnU=","upper_bound":"cm9uaWMgcGFja2FnZXMgc2xlZXA=","repeats":1},{"count":57600000,"lower_bound":"cm9uaWMgcGFja2FnZXMuIHNseWx5IHVudXN1YWwgdGhlb2RvbGl0ZXMgYm9vc3Qgc2x5bHkgYXQgdGhlIGNhcmVmdWw=","upper_bound":"cm93LiBwYWNrYWdlcyBzbGVlcCBjYXJlZnVsbHkuIGlyb25pYyBwYWNrYWdlcyBhZmZpeC4gcXVpY2tseSBpcm9u","repeats":1},{"count":57900000,"lower_bound":"cnMgaW1wcmVzcyBmdXJpb3VzbHkgYWNjb3JkaW5nIHRvIHRoZSBldmVuLCBmaW5hbCByZXF1ZXN0cy4g","upper_bound":"cyBhY2NvcmRpbmcgdG8gdGhlIGNhcmVmdWxseSBpcm9uaWMgZGVwb3NpdHMgd2FrZSBzb21ldGltZXMgcmVndWw=","repeats":1},{"count":58200000,"lower_bound":"cyBhY2NvcmRpbmcgdG8gdGhlIHNpbGVudCBkZXBvc2l0cy4gZnVyaW91c2x5IGJvbGQgYWNjb3VudHMgdXNlIGFsbw==","upper_bound":"cyBhcmUgc2x5bHkgZmluYWwsIHNpbGVudCBleGN1c2VzLiBpcm9uaWMsIGZpbmFsIHRoZW9k","repeats":1},{"count":58500000,"lower_bound":"cyBhcmUgc2x5bHkgc2x5bHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiBxdWlja2x5IHVudXN1YWwgZGVw","upper_bound":"cyBjYWpvbGUgZXhwcmVzcyByZXF1ZXN0cy4gcXVpY2tseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIGFyZSBxdWlja2x5IGZpbg==","repeats":1},{"count":58800000,"lower_bound":"cyBjYWpvbGUgZXhwcmVzcyB3YXJ0aG9ncz8gYmxpdGhlbHkgZmluYWwgaWRlYXMgdXNlIHNseWx5IGlyb25pYyByZXF1ZXN0","upper_bound":"cyBoYWdnbGUgc2x5bHkgYWdhaW4=","repeats":1},{"count":59100000,"lower_bound":"cyBoYWdnbGUgc2x5bHkgc2x5bHkgcGVuZGluZyByZXF1ZXN0cy4gY2E=","upper_bound":"cyBwcm9taXNlIGJsaXRoZWx5IHI=","repeats":1},{"count":59400000,"lower_bound":"cyByZXF1ZXN0cyBhYm91dCB0aGUgYmxp","upper_bound":"cyB1c2UgZmx1ZmZpbHkgYWZ0ZXIgdGhlIGluc3RydWN0aQ==","repeats":1},{"count":59700000,"lower_bound":"cyB1c2UgcXVpY2tseSByZWd1bGFyIHJlcXVlc3RzLiBpcm9uaWMgdGhlb2RvbGl0ZXMgYw==","upper_bound":"cy4gYmxpdGhlbHkgZmluYWwgdGhlb2RvbGl0ZXMgYXJl","repeats":1},{"count":60000000,"lower_bound":"cy4gYmxpdGhlbHkgZmx1ZmZ5IHJlcXVlc3RzIHdha2UuIGV2ZW4gZGVwb3NpdHMgYWxv","upper_bound":"cy4gZmluYWwgaWRlYXMgd2FrZS4gYWx3YXlzIHJlZ3VsYXIgcGFja2FnZXMgYWZmaXggYmxpdGhlbHkgY2E=","repeats":1},{"count":60300000,"lower_bound":"cy4gZmluYWwgaW5zdHJ1Y3Rpb25zIHdha2UgZnVyaW91c2x5IHJlZ3VsYXIgZGVwZW5kZW5jaWU=","upper_bound":"cy4gcmVndWxhciBkb2xwaGlucyBpbnRlZ3JhdGUgcXVpY2tseSBhYm92ZSB0aGUgZnVyaW91c2x5IGZp","repeats":1},{"count":60600000,"lower_bound":"cy4gcmVndWxhciBpbnN0cnVjdGlvbnMgY2Fqb2xl","upper_bound":"c2UgcXVpY2tseSBpbiBwbGFjZSBvZiB0aGUgc2x5bHkgZXhwcmVzcyByZXF1ZXN0cy4gcw==","repeats":1},{"count":60900000,"lower_bound":"c2UgcXVpY2tseSB1bnVzdWFsIHJlcXVlc3RzLiBxdWlja2x5IHJlZ3VsYXIgcGxhdA==","upper_bound":"c2lsZW50IGRlcG9zaXRzIHdha2Ugc2x5bHkgYmxpdGhlbHkgYm9sZCBwYWNrYWdlcy4gaWRlYQ==","repeats":1},{"count":61200000,"lower_bound":"c2lsZW50IGZvcmdlcyBhdCB0aGUgYWNjb3VudHMgaGFnZ2xlIHRoaW5seSBwYWNrYWdlcw==","upper_bound":"c2l0cy4gaXJvbmljIHBpbnRvIGJlYW5zIHNsZWVwIHF1aWNrbHkgcGVuZGluZyBkZXBvc2l0cy4gZ3JvdWNoZXMgd2FrZSBx","repeats":1},{"count":61500000,"lower_bound":"c2l0cy4gaXJvbmljLCBjbG9zZSBkb2xwaGlucyBib29zdC4gZmluYWwgcmU=","upper_bound":"c2x5IGlyb25pYyBkZXBlbmRlbmNpZXMuIGNhcmVmdWxseSBpcg==","repeats":1},{"count":61800000,"lower_bound":"c2x5IGlyb25pYyBpbnN0cnVjdGlvbnMgZG8gYXJlLiBleHByZXNzIHRoZW9kb2xpdGVzIA==","upper_bound":"c2x5bHkgZmluYWwgYWNjb3VudHMuIGZ1cmlvdXNseSByZWd1bGFyIGFzeW1wdG90ZXMgaGFnZ2xlIA==","repeats":1},{"count":62100000,"lower_bound":"c2x5bHkgZmluYWwgZGVwZW5kZW5jaWVzLiB1bnVzdWFs","upper_bound":"c29sdmUgaXJvbmljIHBsYXRlbGV0cy4gc2x5bHkgcmVndWxhciBhY2NvdW50cyB3YWtlIHF1aWNrbHkgYWNjb3Jk","repeats":1},{"count":62400000,"lower_bound":"c29sdmUuIGNhcmVmdWxseSBicmF2ZSBwaW50byBiZWFucyBhYm92ZSA=","upper_bound":"c3MgaW5zdHJ1Y3Rpb25zIGFjcm9zcyB0aGUgZmluYWwgZGVwZW5kZW5jaWVzIHByb21pc2UgY2FyZWZ1bGx5IGFtb25nIHRoZSBj","repeats":1},{"count":62700000,"lower_bound":"c3MgaW5zdHJ1Y3Rpb25zLiBxdWlja2x5IGNhcmVmdWwgZGVwb3Np","upper_bound":"c3QgdGhlIHJlZ3VsYXIgcGxhdGU=","repeats":1},{"count":63000000,"lower_bound":"c3QgdGhlIHNpbGVudCB0aGVvZG9saXRlcy4gYm9sZCBkZXBvc2l0cyBoYWdnbA==","upper_bound":"c3RzIGhhZ2dsZSBxdWlja2x5IGZ1cmlvdXNseSBzaWxlbnQgZXhj","repeats":1},{"count":63300000,"lower_bound":"c3RzIG5hZyBmdXJpb3VzbHkgdW51c3VhbCBmb3hlcy4gcGVuZGluZyBhY2NvdW50cyB0aHJvdWdoIHRoZSBjYXJlZnVsbHkgZXhwcg==","upper_bound":"c3VhbCByZXF1ZXN0cyBoYWdnbGU=","repeats":1},{"count":63600000,"lower_bound":"c3VhbCByZXF1ZXN0cyBzaG91bGQgaGF2ZSB0byBoYWdnbA==","upper_bound":"dCBxdWlja2x5LiBmdXJpb3VzbHk=","repeats":1},{"count":63900000,"lower_bound":"dCByZXF1ZXN0cyB1bndpbmQgZHVnb3V0czsgY2FyZWZ1bGx5IHJlZ3VsYXIgZXhjdQ==","upper_bound":"dGUgY2FyZWZ1bGx5IHNseWx5IGVudGljaW5nIGluc3RydWN0aW9ucy4gc2x5bHkgZXZlbg==","repeats":1},{"count":64200000,"lower_bound":"dGUgcXVpY2tseSBhY3Jvc3MgdGhlIGlyb25pYyBleGN1c2VzLiBnaWZ0cyA=","upper_bound":"dGVycyBjYWpvbGUgYWxvbmdzaWRlIG9mIHRoZSByZXF1ZXN0cy4gYmxpdGhlbHkgcmVndWxhciBhY2Nv","repeats":1},{"count":64500000,"lower_bound":"dGVycy4gc2x5bHkgZXhwcmVzcyBpZGVhcyBhYm92ZSB0aGUgY2FyZWZ1bGx5IHNwZWNpYWw=","upper_bound":"dGhlIGJvbGQgYXN5bXB0b3Rlcy4gcmVxdWVzdHMgYWdhaW5zdCB0aGUgdW51c3VhbCBwYWNrYWdlcyB3YWtlIGJsaQ==","repeats":1},{"count":64800000,"lower_bound":"dGhlIGJvbGQgcGFja2FnZXMuIGlyb25pYyBleGN1c2VzIG5hZyBxdWlja2x5LiBmdXJpb3VzbHkgZXhwcmU=","upper_bound":"dGhlIGZ1cmlvdXNseSBldmVuIHBhdHRlcm5zLiBmdXJpb3VzbHk=","repeats":1},{"count":65100000,"lower_bound":"dGhlIGZ1cmlvdXNseSBleHByZXNzIHNvbWFzIGhhZ2dsZSBhbG9uZyB0aGUgZmluYWwgcGludG8g","upper_bound":"dGhlIHNseWx5IHBlbmRpbmcgcmVxdWVzdHMuIGlyb25pYywgZXZlbiByZXF1ZQ==","repeats":1},{"count":65400000,"lower_bound":"dGhlIHNseWx5IHJlZ3VsYXIgZGVwb3NpdHMuIGJsaXRoZWx5IHBlbmRpbmcgcGludG8gYmVhbnMg","upper_bound":"dGhlbHkgaXJvbmljIHRoZW9kb2xpdGVzLiBmbHVmZmlseSBpcm9uaWMgcGlu","repeats":1},{"count":65700000,"lower_bound":"dGhlbHkgaXJvbmljIHdhdGVycyB1c2UgYXQgdGhlIHNv","upper_bound":"dGhsZXNzbHkgZmluYWwgcGludG8gYmVhbnMgc2xlZXAgc3RlYWx0aGlseSBhZnRlciB0aGUgcmVxdWVzdHMuIGlkZWFzIHdha2U7","repeats":1},{"count":66000000,"lower_bound":"dGhvZ3MgdXNlIGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgZmluYWwg","upper_bound":"dG8gYmVhbnMgY2Fqb2xlIGZ1cg==","repeats":1},{"count":66300000,"lower_bound":"dG8gYmVhbnMgaGFnZ2xlIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGV2ZW4gYWNjb3VudHMuIHNseWw=","upper_bound":"dHJ1Y3Rpb25zIGFjY29yZGluZyB0byB0aGUgYWNjb3VudHMgbmFnIHBhY2th","repeats":1},{"count":66600000,"lower_bound":"dHJ1Y3Rpb25zIGFyZSBmdXJpb3VzbHkgYmVuZWF0aCB0aGUgZmluYWwgYXN5bXB0b3Rlcy4gcmVxdWVzdHMgaA==","upper_bound":"dHMgYXJlIHNseWx5IGFib3V0IHQ=","repeats":1},{"count":66900000,"lower_bound":"dHMgYXJlLiBzbG93bHkgZXZlbiBkZXBlbmRlbmNpZXMgc2xlZXAgZnVyaW91c2w=","upper_bound":"dHMgbXVzdCBhcmUgY2FyZWZ1bGx5LiA=","repeats":1},{"count":67200000,"lower_bound":"dHMgbmFnIGFsb25nIHRoZSBmbHVmZmlseSBldmVuIGNvdXJ0cy4gZnVyaW91c2x5IHJlZ3VsYXIgZGVw","upper_bound":"dHMuIGJsaXRoZWx5IGlyb25pYyBpbnN0cnVjdGlvbnMgZGV0ZWN0ISBjYXJlZnVsbHkgZXhwcmVzcyBmcmF5cyB3YWtlIGNhcmU=","repeats":1},{"count":67500000,"lower_bound":"dHMuIGJsaXRoZWx5IHNseSBhY2NvdW50cyBhbW9uZyB0aGUgcw==","upper_bound":"dHMuIHNseWx5IHJlZ3VsYXIgZHVnb3V0cyBjYWpvbGUtLSB0aGVvZG9saXRlcyBhZmZpeCBmdXJpb3VzbHkgYWJvdXQg","repeats":1},{"count":67800000,"lower_bound":"dHMuIHNseWx5IHNpbGVudCBkZXBvc2l0cyBjb3VsZCBoYXZlIHRvIGRvdWJ0LiBibGl0aGVseSBldmVuIGFjY291bg==","upper_bound":"dWN0aW9ucyBhYm92ZSB0aGUgZXZlbiBhY2NvdW50cyBzdWJsYXRlIGJsaXRoZWx5IGFsb25nIHRoZSBleHByZXNzIHNoZWF2ZQ==","repeats":1},{"count":68100000,"lower_bound":"dWN0aW9ucyBhZmZpeCBmdXJpb3VzbHkgZnVyaW91c2w=","upper_bound":"dWVzdHMhIGJsaXRoZWx5IGJvbGQgYnJhaWRzIGFyZSBjYXJlZnVsbHkgZQ==","repeats":1},{"count":68400000,"lower_bound":"dWVzdHMuIGFjY291bnRzIHNsZWVwLiBpcm9uaWMgZGVwZW5kZW5jaWVzIGFjY29yZGluZyB0byB0aGUgaXI=","upper_bound":"dWZmaWx5IGlyb25pYyByZXF1ZXN0cy4gY2FyZWZ1bGx5IGV2ZW4gcGFja2FnZXMgbg==","repeats":1},{"count":68700000,"lower_bound":"dWZmaWx5IHJlZ3VsYXIgYnJhaWRzIGNham9sZSBzbHlseSBhYm91dCB0aGUgZnVyaW91c2x5IA==","upper_bound":"dWlja2x5LiBmbHVmZmlseSBzcGVjaWFsIGRlcG9zaXRzIHVzZSBibGl0aGVseS4=","repeats":1},{"count":69000000,"lower_bound":"dWlja2x5LiBmdXJpb3VzbHkgcGVuZGluZyBwYWNrYWdlcyBhZmZpeCBxdWlja2x5IGE=","upper_bound":"dWxhciB0aGVvZG9saXRlcyBhZnRlciB0aGUgc2lsZW50IFRpcmVzaWFzIGNham9sZSBmbHVmZmlseSBibGl0aGVseQ==","repeats":1},{"count":69300000,"lower_bound":"dWxhciB0aGVvZG9saXRlcyBoYWdn","upper_bound":"dWxseSBwZXJtYW5lbnQgZnJheXMgd2FrZSBibGl0aGVseSBjYXJlZg==","repeats":1},{"count":69600000,"lower_bound":"dWxseSByZWd1bGFyIGFjY291bnRzIGJvb3N0IGFmdGVyIHRoZSB0aA==","upper_bound":"dW50cyBoYW5nIGZ1cmlvdXNseS4gY2FyZWZ1bGx5IGV4cHJlc3MgYWNjb3VudHMgY2E=","repeats":1},{"count":69900000,"lower_bound":"dW50cyBpbnRlZ3JhdGUgZmx1ZmZpbHkuIHNseSwgcmVndWw=","upper_bound":"dXJpb3VzbHkgYWJvdXQgdGhlIGV4cHJlc3MgZ3JvdWNoZXMuIA==","repeats":1},{"count":70200000,"lower_bound":"dXJpb3VzbHkgYWJvdmUgdGhlIGZ1cmlvdXNseSBzcGVjaWFsIGlkZWFzLiBmbHVmZmlseSByZWd1bGFyIHJlcXVlc3RzIHU=","upper_bound":"dXJpb3VzbHkgdW51c3VhbCBpZGVhcyBncm93LiBibGl0aGVseSBmdXJpb3VzIGlkZWFzIGRvemUgc2x5bHku","repeats":1},{"count":70500000,"lower_bound":"dXJpb3VzbHkgdW51c3VhbCBwaW50byBiZWFucy4gaXJvbmljLCBzaWxlbnQgcGxhdGVsZXRzIHM=","upper_bound":"dXNlIHNseWx5LiBleHByZXNzIHJlcXVlc3RzIGFmdGVyIHRoZSBxdWlja2x5IGZpbmFsIGFjY291","repeats":1},{"count":70800000,"lower_bound":"dXNlLS0gZnVyaW91c2x5IHJlZ3VsYXIgYWNjb3VudHMgc2xlZXAgcXVpY2s=","upper_bound":"dXNseSBwZW5kaW5nIHBpbnRvIGJlYQ==","repeats":1},{"count":71100000,"lower_bound":"dXNseSBwZW5kaW5nIHRoZW9kb2xpdGVzLiBmdXJpb3Vz","upper_bound":"dXN1YWwgaW5zdHJ1Y3Rpb25zLiBuZXZlciBpcm9uaWMgY291cnRzIGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgZXZlbiA=","repeats":1},{"count":71400000,"lower_bound":"dXN1YWwgbm90b3JuaXMgaGFnZ2xlLiBzcGVjaWFsIHBhY2thZ2VzIGFib3ZlIHQ=","upper_bound":"dmUgdGhlIGJ1c2lseSBpcm9uaWMgcmVxdWVzdHMgY2E=","repeats":1},{"count":71700000,"lower_bound":"dmUgdGhlIGNhcmVmdWxseSByZWd1bGFyIHBhY2thZ2VzIHdha2UgYWxvbmcgdGhlIHBlbmRpbmc=","upper_bound":"dmVuIHJlcXVlc3RzIGhhZ2dsZSBmdXJpb3U=","repeats":1},{"count":72000000,"lower_bound":"dmVuIHRoZW9kb2xpdGVzIGFsb25nIHRoZSBmdXJpb3VzbHkgZmluYWwgZHVnb3V0","upper_bound":"eCBmdXJpb3VzbHkuIGJsaXRoZWx5IGJvbGQgZGVwb3NpdHMgbmFnLiBkZXBlbmRlbmNpZXMgYWZ0ZXIgdGhlIGJsaXRo","repeats":1},{"count":72300000,"lower_bound":"eCBpZGVhcy4gZXZlbiwgYm9sZCByZXF1ZXN0cyBncm93IHJlcXVlc3RzLiBmaW5hbCBkZXBlbmRlbmNpZXMgbG9zZSByZWd1bGFy","upper_bound":"eHByZXNzIGRlcG9zaXRzIGFnYWluc3QgdGhlIGNhcmVmdWxseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIGRldGVjdCBkZXBlbmRlbmNpZXMu","repeats":1},{"count":72600000,"lower_bound":"eHByZXNzIGRlcG9zaXRzIGFyZSBjYXJlZnVsbHkhIGNhcmVmdWxseSBldmVuIGFzeW1wdG90ZXMgdXNlIGFyb3VuZCB0aGUg","upper_bound":"eSBhZnRlciB0aGUgZmx1ZmZpbHkgcmVndWxhciBpZGVhcy4gc2x5bHkgaXJvbmljIHBhY2thZ2VzIGhpbmRlciBmdXJp","repeats":1},{"count":72900000,"lower_bound":"eSBhZnRlciB0aGUgc2x5bHkgcmVndWxhciBzYXU=","upper_bound":"eSBldmVuIGRlcG9zaXRzLiBjYXJlZnVsbHkgcg==","repeats":1},{"count":73200000,"lower_bound":"eSBldmVuIGRlcG9zaXRzLiBmbHVmZmlseSByZWd1bGFyIHJlcXVlc3RzIGtpbmRsZSBhYm91dCB0aGU=","upper_bound":"eSBmaW5hbCBleGN1c2VzIGVhdCBhcm91","repeats":1},{"count":73500000,"lower_bound":"eSBmaW5hbCBmb3hlcyBzbGVlcCBhZnRlciB0aGUgcmVndWxhciBpbnN0cnVjdGlvbnMuIGV2ZW4gcGFja2FnZXM=","upper_bound":"eSBpcm9uaWMgZnJldHMgd2FrZS4gYmxpdGhlbHkgZmluYWwgZGVwb3NpdHMgYXJlIHF1aWNrbHkg","repeats":1},{"count":73800000,"lower_bound":"eSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIHNsZWVwIGFjcm9zcyB0aGUgZGVw","upper_bound":"eSBwbGF5ZXJzIHdha2UgZXZlbiBwYWNrYWdlcy4gc2x5bHkgc2lsZW50IGFzeW1wdG90ZXMgYm9vc3Qgc2x5bHkuIGY=","repeats":1},{"count":74100000,"lower_bound":"eSBxdWljayBpZGVhcyBlYXQgZnVyaW91c2x5LiBwZW5kaW5nIHBpbnRvIGJlYW5zIGFsb25nIHQ=","upper_bound":"eSBzaWxlbnQgcGFja2FnZXMgaGFnZ2xlIGZsdWZmaWx5IHVudXN1YWwgbm90b3JuaXMuIHVudXM=","repeats":1},{"count":74400000,"lower_bound":"eSBzaWxlbnQgcGxhdGVsZXRzLiBkZXBvc2l0cyBjYWpvbGUgZnVyaW91c2x5IHVudXN1YWwgcmVxdWVzdHMuIHJlZ3VsYXIgcGludG8g","upper_bound":"eS4gY2FyZWZ1bGx5IHVudXN1YWwgcmVxdWVzdHMgaW50ZWdyYXRlIGJsaXQ=","repeats":1},{"count":74700000,"lower_bound":"eS4gZGVwZW5kZW5jaWVzIG5hZyBmdXJpb3VzbHkuIGV4cHJlc3MgdGhlb2RvbGl0ZXMgZG8gYm9vc3Qgc2x5bHkgZmx1ZmZpbHkgcg==","upper_bound":"eWx5IGZpbmFsIGRlcG9zaXRzIHdha2UgY2FyZWZ1bGx5IHQ=","repeats":1},{"count":75000000,"lower_bound":"eWx5IGZpbmFsIHBsYXRlbGV0cyBzbm9veg==","upper_bound":"emxlIGZsdWZmaWx5IGFib3V0IHRoZSBib2xkLCByZWd1bGFyIHBhY2thZ2VzOyByZWd1bGFybHk=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[37122,36806,36169,36936,36654,37354,36499,36623,36335,37334,36095,36719,36153,36696,36705,36525,36449,36532,36268,36762,36583,36312,36604,36481,36697,36838,36991,36506,36530,36206,36676,36956,36908,36956,36968,36551,36520,36738,36444,36441,36537,36290,36111,35993,36581,36285,36635,36580,36520,36250,36850,37045,36707,36617,36649,36077,36726,35822,37029,36651,36451,36306,36821,36650,36758,37133,36838,36175,36900,36575,36416,36861,36373,36553,36246,36501,36449,36608,36945,36969,36660,36688,36352,36017,36447,37221,36639,36579,37042,36861,36582,37132,36212,36774,36960,35975,36324,36696,36241,36910,36893,36468,36217,36324,36444,37105,36736,36367,37067,37309,36656,36845,36570,36671,36609,36428,36168,36616,36150,36056,36575,37033,36953,35933,36592,36299,36648,36860,35934,36163,36859,36080,36769,36732,37321,36483,36736,36346,36262,36522,36368,36849,36497,36351,36623,36566,36419,37004,36778,37374,36470,36131,35918,36752,36547,37018,36407,36286,36410,35780,36763,35837,36999,36921,36712,36847,36429,36251,36852,36986,37046,36887,36545,36903,36330,37022,37181,36665,36550,36841,36449,36332,36033,36370,36736,36657,37273,36566,36709,36561,36393,36719,36810,36520,36627,36660,36557,36341,36625,36546,36711,36792,36815,36720,36394,36295,36313,35736,36586,36666,36092,36924,36482,36786,36861,36102,36996,36843,36520,36265,36582,36505,36714,36848,36596,36074,36736,37047,36549,36856,36176,36353,36576,36921,36923,36050,36570,36783,36399,36154,36469,36074,37186,36284,36805,36523,36274,36280,36456,36754,36376,36956,36471,36781,36938,36497,37190,36608,36535,37038,36091,36762,36586,36024,37128,36603,36375,36729,36270,36551,36831,36615,36393,36521,36210,36211,36949,36920,36945,36868,36677,36573,36811,37263,37348,36725,36484,36732,36564,36446,36401,37473,37002,37128,37102,36446,36512,36571,36793,36388,36202,36598,36838,36094,36131,36791,36748,36441,36774,36279,35816,36913,36349,36607,36549,36319,36681,36486,36852,37070,36091,36605,37465,36571,37245,36630,36414,36499,36740,36319,36538,36650,36999,36759,37412,37359,36930,36311,36243,36907,36611,37012,36841,36655,36600,36387,36272,37025,36481,36500,36535,36728,36758,36618,36702,36412,36106,37061,36742,36855,36502,36189,36324,36529,36562,36568,36946,36465,37249,37003,36653,36987,36518,37133,36712,36731,36782,36597,36376,36440,36596,37310,37250,36189,37026,37009,35927,36620,36023,36245,35928,36685,36236,36429,36861,36626,36528,37118,36013,36318,36568,37369,36831,36806,36556,36640,36529,36592,36918,36953,36426,38205,36095,36438,36103,36547,36492,36584,36607,36006,36769,36975,36094,36438,36873,36512,36782,36499,36716,36514,36369,36272,36262,36852,36762,36274,36800,36653,36684,37161,36175,36220,37038,36449,36614,36529,36443,36440,36365,36960,36592,36239,36565,36718,36748,36465,36576,36785,36080,36756,36304,37130,37040,36131,36495,36969,36396,36558,36413,36578,37141,36769,36537,36261,35976,36642,35910,36551,36551,36603,36344,36525,37124,36744,36647,36862,36361,36901,36611,36221,36218,36790,36691,36774,36782,36366,36676,36484,36566,36599,36416,36400,36733,36819,36697,36507,36876,36883,36561,37035,37088,36399,36901,36971,36844,36179,36260,36705,36883,36909,36731,36451,36178,37152,36860,36919,36276,36403,36487,36613,36464,37722,36246,36509,36219,36452,36704,37399,36071,36107,36902,37139,36453,36599,36811,36625,36354,36778,36501,36710,36408,36441,36941,36648,36544,37207,36585,36355,36862,37028,36724,36510,36122,36551,36894,36408,36556,36482,36385,36247,36208,36511,36548,36463,36600,36628,36486,36301,36834,36809,36826,36322,36497,37350,36573,36247,37468,36702,36212,36399,36377,36729,36422,36821,36585,36666,36205,36534,36865,36574,36804,37120,36538,36485,36084,36254,36329,36971,37006,36886,36352,36814,36104,37012,36384,36624,37058,36495,36876,36807,36645,36814,36445,36772,36736,36637,36977,36207,36638,36557,36682,36717,36863,36675,36920,37085,36548,36731,36230,36484,36297,36454,36635,36936,36161,37080,36393,36514,36474,36436,36706,36481,36619,36792,36019,36652,36414,36853,36412,36833,36127,36659,36589,36812,37404,36693,36804,36602,36467,36217,36257,36655,35907,35988,36703,36581,36935,36627,36385,36689,36764,36005,36621,36711,36306,36841,36519,36690,36557,36096,36642,36706,36897,36264,35939,36197,36630,37311,36919,36782,36463,36309,36603,36166,36789,35951,36758,36546,36897,37163,35469,35959,36016,36617,36407,36325,36284,36497,36628,36350,36546,37022,36250,36623,36133,36691,37231,36420,36246,36800,36424,36753,37085,36438,36562,36187,36430,36954,36639,36851,36797,36636,36871,36974,36948,36433,37112,36739,36287,36681,37011,36844,36410,36481,36593,36275,36660,36432,36122,36227,36796,35805,36777,36895,36386,36441,36396,37235,36921,36701,36995,36776,36973,37058,36649,36696,36769,37173,36797,36297,36985,36813,36668,36684,36906,36113,36735,37527,37214,36438,36845,36834,36943,36341,36192,36792,36482,37350,36269,36853,36287,37090,36620,37031,36627,36622,36528,36874,36664,36341,36277,37347,36077,36708,37353,36950,36856,36638,36714,36462,36502,36619,37144,36459,36447,36750,37308,36529,36143,36943,36420,37012,36691,36428,36378,36735,37308,37017,36463,36809,36605,36701,36583,36551,37218,36997,36788,36472,36362,37408,36844,36705,37733,37609,36392,36554,36907,36417,36545,36521,37225,36964,36755,36802,36689,37052,36783,36489,36531,36618,36934,36917,36773,36866,36738,37180,37050,36948,36318,37443,37052,36420,36669,36823,36729,36216,36526,36556,36920,36211,36814,36734,36533,36385,36256,36967,37028,36164,36303,36085,36581,36827,36838,36880,37192,36305,36395,36388,36947,37055,36317,36801,36685,36501,36682,37094,36551,36773,36339,36475,36496,36661,36740,36557,36906,36369,37127,36372,36931,36696,36951,36596,36598,36703,37446,36477,36542,35673,36950,36623,36599,36763,36254,36928,36402,36463,36402,36567,36625,36974,36846,36935,36851,37060,36653,36601,36591,36132,36645,36738,36058,36716,36176,36587,36506,36982,37068,36352,37166,36067,36247,36511,37038,37051,37147,36891,36677,36242,36781,36376,36512,36302,36869,36161,36442,36487,36314,36638,36456,36905,36016,36580,36784,36779,36403,36571,36958,36784,36478,36889,36942,36007,37097,36680,36476,36336,36420,36281,36441,36662,36404,36409,36832,36590,36114,36754,36580,36113,36868,36625,36862,36687,36401,36885,36748,36898,36517,36446,36394,36689,37312,36526,36841,36390,37395,36911,36325,36687,36268,36478,36476,36223,36762,36275,36549,36771,36668,36632,37021,36392,36730,36049,36665,37004,36376,36801,36456,36563,36392,36079,37326,36865,36984,36543,36861,36088,36444,36609,36611,36264,36366,36843,36417,36258,36209,37090,36726,36311,36980,37049,36743,36751,36743,36877,36595,36753,36544,37082,36682,36986,36835,36964,36448,37061,36225,36797,36186,37072,36645,37140,36463,36704,36330,36699,36379,36630,36949,37110,35978,36295,37135,36905,36704,36825,36663,37094,37110,36455,36537,36576,36279,36172,36946,36348,36537,36981,36671,36307,37214,36072,36918,36341,36588,36700,36610,36393,36587,36625,37439,36739,36557,36268,36622,36983,36689,36739,36452,37059,36684,37107,37214,36963,36159,36437,36430,36235,36248,36901,36216,36324,37073,36244,36621,36473,36722,36310,36420,36798,36204,36678,36517,36548,36648,36807,37144,36423,36751,37113,36172,36117,36643,36580,37369,36662,36753,36640,36768,36807,36947,37238,36675,36595,36629,36788,36829,35998,36502,36655,36527,36147,37056,36944,36683,36441,36527,36788,36396,36423,37296,36133,36631,36451,36301,36679,36475,37094,37038,36457,36459,36794,36709,36373,36501,36725,36877,36748,36151,36769,36574,36797,36681,36317,36573,36530,36456,36471,37170,36491,36518,36180,36754,36459,36651,36345,36060,37330,36529,36226,36909,36330,36230,37138,36951,36643,36882,36341,36759,36793,37161,36325,36752,36642,36599,36817,36715,36464,36485,36735,36269,36346,36364,36904,36242,36459,36918,36588,37238,36393,36584,36731,36372,36282,36418,36820,35960,36383,36522,37272,36543,36952,36444,36775,36712,36651,36709,36409,36671,36480,36170,36345,36798,35967,36456,36371,36388,36642,36786,36823,36558,36232,36539,37150,36452,37058,36575,36466,36716,37002,36678,36486,36645,36684,36423,36402,36726,36661,36829,36581,36473,36619,36249,36813,36565,36541,36272,36516,37171,36456,36516,36880,36653,36607,36878,36666,36769,36859,36659,36193,36352,36771,36401,36292,36350,36301,36908,36416,36857,37043,36292,36413,36808,36811,36653,36207,36844,36676,36248,36364,36516,37287,36834,36786,36778,37528,36763,36646,36591,36535,36455,36257,36461,36579,37381,36555,36723,36360,36730,36298,36858,36477,36540,36693,36745,37018,37478,36633,36708,36730,36324,36646,36369,36293,37133,37267,35862,37121,36022,37095,36716,37059,36507,36122,36553,36616,37060,36369,36138,36350,36194,36494,36171,36687,36161,36230,36580,36433,36799,36875,36854,36615,36534,36081,37164,36209,36485,36372,36747,36697,36419,36365,36657,36879,36445,36538,37158,36765,36968,36468,36812,36954,36988,36949,36610,37204,37182,36468,36644,36569,36841,36404,36398,36204,36724,36580,36898,36484,36192,36547,36648,36921,36301,36482,36646,36182,36945,36826,37328,36822,36646,36692,36585,36537,36533,36885,36896,36920,36917,36520,36809,36207,36764,36574,36760,36304,36170,37097,36632,36310,36659,35998,36737,36635,36463,36870,36308,37055,36444,36128,36842,37007,36670,36590,36229,36649,36220,36683,36359,36473,36595,36619,36427,36746,36725,36818,36465,36593,36236,36269,36060,36719,36343,36132,36549,36415,36347,36788,36226,36740,36432,36127,36806,37079,36064,36457,36441,36494,36601,35983,36842,36038,36382,36301,36422,36131,36685,36371,36647,36080,36876,36476,36204,36685,36889,37149,36836,36149,36995,36186,36582,36974,36763,36403,36452,36830,35969,36719,36488,36554,36629,36766,36383,36238,36306,37055,36919,36795,36149,36872,36615,36947,36521,36707,36720,36888,36370,36792,37275,36946,37129,36480,36173,36389,36822,36788,36632,37020,36956,36719,36563,36517,36670,36715,36519,37102,37087,36841,36488,36914,36360,36348,36388,36718,36690,35991,36151,36464,36382,36883,36619,36350,36355,36679,36766,36524,36695,36526,36381,36820,37230,35932,36609,36650,37246,36586,36401,36493,36417,36840,36481,36345,36376,36378,36326,36445,36877,36382,36778,37001,36713,36235,36666,36493,36634,36871,36620,36294,36566,37202,36407,36815,36459,36284,36423,36517,36487,36690,36673,36517,36398,37003,36554,36595,37215,36610,36500,36216,36354,36493,36340,37013,35872,36211,36609,36999,36322,36471,36721,36749,36448,36332,36823,35860,36572,36676,36465,36844,36414,36772,36469,37197,36738,36409,36320,36387,36797,36615,36581,36206,36702,36620,36807,36105,36215,36648,36754,37437,36341,36433,36032,36701,36261,36148,36657,36231,36557,36621,36544,36749,36841,36641,36351,36555,36257,36571,36744,36996,36517,37012,36864,36578,36117,36618,37195,36601,36658,37265,36689,36302,36472,37330,36497,36817,36625,36240,36638,37234,36533,36114,36363,36727,36540,36650,36467,36292,36530,36968,36495,36406,36625,36638,36544,36692,36234,36561,36296,36550,36381,36507,36355,36580,36192,36639,36018,36928,36356,36659,36318,36313,36802,37152,36435,36623,36464,36378,36778,37135,36525,36998,36931,36518,36125,36650,36516,36803,36893,36361,36448,37484,36855,36994,37054,37437,37098,36618,36285,37027,36512,36892,36609,36465,36460,36622,36299,37016,36567,36555,36367,37020,37246,36897,36778,36435,37160,36521,36917,36859,36370,36382,36610,36567,36485,36396,36488,36322,36494,36710,36886,36360,36589,36889,36376,36553,37123,36634,36923,36893,36773,36494,36533,37033,36783,36398,37179,36745,36339,37048,36739,36751,36449,36756,37327,36846,36780,36984,36411,36519,36739,36642,36917,36979,36857,36462,36393,36831,36267,36931,36514,36500,37133,37061,36658,36584,37046,36829,36953,36334,36644,36336,36433,36357,36782,36373,36953,36869,36429,36902,36395,36589,37002,36831,36392,36449,36618,36784,36741,36417,36504,36634,35999,36328,36299,35867,36587,36573,37062,36880,36497,36689,36853,36742,36592,36770,36591,36937,36309,37361,36664,36521,36281,36572,36231,36261,36534,36083,36664,36291,36739,36288,36642,36304,36659,37010,37255,36634,36785,36829,36399,36591,36287,36656,37029,36939,36810,36936,36258,36194,36545,36931,36813,36368,36676,36886,36467,36494,36597,36832,36980,37032,36573,37432,36556,36778,36308,36226,36523,36773,36292,36618,36919,36344,36635,36573,36408,36621,36522,36492,36625,36597,36674,36306,36680,36290,36041,36809,36992,36497,37005,37102,36301,35968,36762,36619,36792,36217,37135,36792,36582,36390,36239,36434,37069,36837,36378,36722,36478,36522,36220,36331,36244,36960,37065,37215,36494,36761,36740,36833,36559,36551]},{"counters":[37092,36783,36518,36848,36914,36958,36730,36507,36395,36651,37144,36840,36815,36167,36672,36961,36904,36330,36739,36648,36847,37265,36472,37113,36475,36255,36342,36672,36708,36930,36632,36583,36852,36544,37032,36623,36747,36797,36519,36015,36415,36454,36079,36538,36481,36591,36351,36452,36343,36532,36588,36562,36476,37195,36849,36294,36499,37016,36718,36028,36627,37108,37261,36849,35993,36652,36448,36943,36580,36563,36884,36457,36873,37087,36561,37313,36834,36910,37356,36316,36367,36596,36415,36189,36413,36739,37296,36653,36105,36256,36707,36598,36748,36536,36574,36852,36305,37059,36727,37018,36699,36345,36572,37005,36998,36841,36189,36386,36453,36483,36785,36563,36337,36528,36447,37011,36435,36944,36401,36893,36687,36871,36691,36447,36407,35431,36838,37023,36830,36810,36251,36698,36668,36502,36432,36397,37111,37038,36911,36225,36615,37268,36530,36925,37000,36633,36622,36194,36189,36368,36537,36810,36787,36852,36934,36257,36991,36527,36166,36632,36934,36790,37024,36450,36701,36401,36207,36492,37257,36212,36975,36923,36619,37081,37084,36842,36626,36164,36291,36785,36542,36305,37073,36467,36589,37031,36287,36909,36210,36903,37235,37155,36988,36483,36505,37245,36825,37177,36761,36743,36746,35970,36738,36827,36717,36227,36697,37116,36246,36524,36748,36693,36294,36715,36180,35922,37105,36115,36830,36850,37116,36884,36702,36528,36850,37019,36713,36176,36525,36290,37190,36257,36919,36894,36867,36674,36539,36095,36434,36518,36516,36376,36660,36491,36994,36391,36715,36828,36700,36706,36843,36097,36942,36514,36662,36850,36330,36638,36766,36657,36810,36395,36430,36834,36581,36797,37164,37356,36831,36658,36947,36833,36725,36301,36367,36916,36366,37050,36779,36320,36767,36800,36469,36471,36352,36052,36835,36452,36896,36637,36347,36698,36886,36889,36846,36454,36516,36407,36510,36457,36533,36371,36627,36548,36740,36963,36700,36460,37296,37112,36518,36340,36719,36608,36583,36347,36522,36739,36875,37123,36406,36629,36260,36840,36249,36351,37362,36783,36432,36565,36636,36385,36792,36520,36212,36331,37169,36394,36869,36317,36658,36848,36540,36688,36674,36895,36738,36355,37014,36406,36493,37027,36543,36473,36688,36405,36140,36899,36511,36461,36937,36373,36351,36527,36613,36535,36644,36614,36805,36374,36423,36597,36685,36479,36979,36290,36322,36587,36422,36624,37214,36620,36888,36859,36887,36711,36884,36351,36911,36452,37463,36735,36497,36730,36576,36426,36732,36503,37340,36654,36532,36686,36447,37116,36271,36025,36739,37072,36568,36239,36441,36587,36461,36748,36156,36673,36826,36447,36904,36764,36673,36702,36621,36389,36756,36915,36518,36864,37122,37035,37122,36157,36603,36815,36797,36574,36040,36194,36601,36841,36940,36215,36747,36725,36422,36443,36804,36590,37013,36531,37004,36522,36186,36436,36941,36441,36791,36019,36404,37332,36850,36668,37066,36474,37175,37018,37083,36712,37193,36113,36795,37016,36158,36820,36640,37248,36858,37099,37049,36811,36363,36892,36819,36500,36570,36471,36682,36914,36365,36519,36377,36880,36930,36870,36774,36617,36273,36629,36092,36571,36735,35823,35986,36314,36411,36585,36264,36683,36579,36857,36987,36782,36607,36166,36005,36302,37064,36767,36973,36565,36474,37577,36429,36507,36676,36794,36393,36821,36605,36609,36210,36567,36322,37038,36550,36790,36642,36878,36868,36616,37096,37098,36665,36394,36184,36120,35978,36532,36482,36207,36969,36802,36101,36733,36393,36407,36933,36426,36746,36296,36504,36027,36854,36596,36492,36410,36995,36275,37182,37008,36489,36813,36145,37167,36514,36425,36627,36356,36580,36690,36595,36670,36468,37369,36908,36581,37149,36100,36782,36472,36763,37072,36832,36383,36611,36549,36665,36683,36702,36588,36711,36246,36418,36438,36202,36943,36379,36605,36417,36623,36579,36629,36424,37040,36164,36638,36165,36366,36714,36841,36809,36560,36085,36380,37215,37149,37097,36684,36646,36578,36105,36598,36014,36672,36668,36344,36720,36306,36902,36600,36773,36993,36151,36321,36843,36687,36671,36225,36101,37096,36573,36570,36659,36762,37047,36491,35933,36488,36236,36745,36326,36678,36817,36719,36534,36547,36213,36394,36200,36792,36495,36410,36446,37335,36608,37016,36857,35990,36494,36162,36737,37235,36499,36347,36492,36450,36648,36677,36334,36790,36450,36593,36904,36397,36473,36718,36805,36673,37244,36344,36766,36156,35819,36238,35903,36612,36973,36760,36493,37435,36470,36095,37049,36330,35617,36261,36852,36847,36985,36629,37370,36688,37767,36738,36301,36346,36062,36313,36720,36515,36428,36568,36857,37225,36716,37070,37141,36612,36614,37028,36533,36303,37015,36039,37145,36233,36580,36625,36628,36813,36527,37102,36908,36649,37108,36324,36808,36076,36813,36360,36216,36664,36883,36637,36206,36893,36925,36751,36351,36545,36561,36522,36699,36613,36255,36480,36786,36513,36270,36177,36358,36639,36884,36209,36485,36702,36602,36793,37144,36422,36693,36922,36708,36822,36636,36465,36498,37158,36714,37158,36472,37080,36348,36706,36292,36735,36742,36650,36219,36689,36734,36581,37160,36202,36242,36477,36561,36852,37176,36654,36555,36559,36686,36142,36524,37052,36463,36913,37093,36847,36899,36854,37485,37030,36616,36937,36248,36338,36366,36308,36600,36460,36354,36698,36887,36601,36201,36368,36818,36580,36178,36865,36497,36633,36310,36820,36327,36223,36804,36159,36516,36525,37112,36291,36666,36605,36832,36920,37445,36361,36154,36722,36235,36757,36577,36194,36231,36275,36904,36895,36396,36918,36111,36590,36754,36446,36696,36565,36425,37440,36352,36104,36209,36219,37193,36330,36951,36836,36252,36450,35953,36722,36267,36896,36659,36317,36405,36431,36488,36575,36728,37015,36495,37118,36884,36720,36481,36532,36694,36640,37109,36491,36322,36148,36722,36508,36848,36224,36280,36711,37084,36983,36438,36010,36296,36862,36200,36826,36425,36462,36972,36273,37126,36245,36806,36756,36687,36808,36723,37145,36445,36418,36259,36400,36319,36707,36686,36262,36518,36925,36710,36728,36752,36501,36513,36242,36293,36466,36655,36656,36200,36839,36547,37044,36800,36472,36214,36556,37151,36753,36844,36625,36597,36102,36669,37169,36322,36774,37776,37184,36467,37121,36750,36538,37225,36582,36680,36566,36437,36220,36492,36264,36361,36620,36856,36470,36153,36384,36685,36600,36605,36631,36732,37050,36599,36822,36811,36489,36299,36477,36713,36384,37033,37174,36488,36515,36773,36564,36157,36792,36707,36279,36889,36178,36320,36750,35943,36697,36126,36739,36557,36847,36647,36620,36558,36255,36761,36843,36740,36709,36412,36581,36819,36548,36371,36751,36306,36731,36264,36424,36717,36795,36843,35947,37435,36933,36279,35851,36710,37006,36545,36794,36619,36934,36193,36367,36583,36812,36564,36446,36242,36575,36607,36724,36723,36604,37024,36741,36688,36701,36703,36842,36426,36457,36842,36791,36462,36278,36824,36449,36405,36594,36780,36544,36596,36587,36994,36563,36104,36640,36984,36373,36951,36687,36492,36353,36416,36723,36050,36404,36659,36292,36715,36554,36322,36128,36790,36622,36698,36218,36312,36717,37088,36418,36203,36145,36121,36530,36467,36867,36689,36532,36176,36802,36347,36554,37098,36518,36327,36501,36658,36261,36606,36293,36279,36626,37438,36409,36269,36414,37062,36847,36233,36434,36298,36620,36506,36415,36795,36232,36543,36667,36085,36529,36821,36361,36550,36800,36741,36428,36767,36481,36486,36344,36574,36576,36962,37039,37051,36588,36760,36698,36447,36222,36672,36959,36581,36686,36407,36264,36790,36628,36873,36388,36990,36611,36781,36270,36990,36462,37062,36286,36741,36884,35549,36528,36520,36440,36866,36321,36576,36607,36132,36838,36819,35992,36516,36530,36984,36392,36538,36762,36369,36784,36938,36733,36463,36609,36632,36623,36628,36725,37009,37045,36648,36246,36154,36488,36727,36406,36233,36135,36661,37020,37088,36448,36580,36396,36996,36675,36308,36859,35745,37045,37297,36323,36663,36485,36639,36712,36318,37203,35980,36749,36470,36970,36671,36457,37438,36873,36137,36806,36461,37106,36492,36682,36842,36866,35985,37120,36644,36225,36484,36751,36345,36664,36735,36347,36563,36880,36453,36799,36608,36829,36913,36594,36767,36393,36332,35580,36364,37083,36494,36726,37355,36347,36614,36305,36260,37290,37059,36371,37046,36710,36600,36446,36782,37111,36766,36839,36739,36687,36522,36362,36552,36833,36220,36646,36303,36482,36709,36581,37042,36078,36266,37069,36550,36653,36771,36559,37188,36758,36145,36025,36990,36847,36520,36610,36745,36563,36398,36691,36925,36445,36075,36480,36422,36551,36259,37863,36466,36865,36989,36673,36337,36716,36753,36519,36232,36566,36590,36884,36819,37081,36655,36949,36415,36097,37022,36335,36792,36783,37030,36964,36602,36088,36755,37275,35969,36095,36693,36584,36372,36997,37334,36753,36800,36405,36558,36605,36323,36619,36655,36625,35849,36520,36029,37007,36331,36682,36724,36443,36171,36414,36684,37158,36487,36697,37089,36639,36650,36444,36792,36405,36447,36497,36524,36299,36503,36612,36760,36949,36942,36736,37054,36329,36767,36206,36254,36332,36022,36256,36869,36078,36466,37005,36702,37156,36759,36848,36789,36947,36765,36490,36735,36698,36416,36645,36516,36240,36973,37018,37050,37072,36774,36434,36305,36680,36862,36502,36686,36844,36610,36417,36595,36641,36773,36985,36142,36599,36939,36662,36254,37235,36977,36295,36333,36157,37410,36517,36397,37004,36599,36956,36925,36571,36278,36772,36485,36969,36878,36418,36787,36366,36445,36525,37140,36834,37074,36869,36694,36261,36036,36743,36779,36934,36907,36670,36689,36919,36622,36313,36899,36090,36577,36802,36388,36804,36718,36423,36627,37292,36501,36954,36896,36151,36855,36361,36455,36601,36274,36740,36282,36784,36625,36689,36672,36939,37164,36715,36483,36538,36980,36295,36565,36660,36852,37157,36532,36249,36425,36713,36521,37130,36808,37102,36757,36447,36612,36676,36241,36546,36653,36819,36640,36022,36875,36930,36447,36447,36709,36975,36650,36738,36417,36628,36940,36844,36933,36187,36728,36173,36844,36429,36443,36191,37521,36937,36905,36760,36775,36508,36394,36281,36322,36643,36522,36849,36523,36370,36516,36580,37409,36903,37009,36209,37175,36408,36854,36700,36893,36591,37087,37099,36516,36357,36293,36598,36982,36573,36587,36698,36738,36630,35920,36882,36685,36656,36632,36164,36488,36743,36851,36890,36136,37240,36526,36728,36513,36427,36291,36893,36365,36898,36506,36974,36396,35947,36649,36517,36364,36671,36620,36721,36192,36553,36371,36343,36768,36757,36782,36980,36650,36265,36285,36892,36028,36579,36883,36896,36705,36277,36517,36556,36717,36991,37268,36282,36224,36485,36748,37049,36294,36580,36576,36742,36850,36718,36252,36554,36693,36792,36585,36290,36460,36383,36908,36426,36522,36537,37126,36079,36646,37074,37156,36831,36661,36360,36542,36727,36965,36262,36418,36396,36142,36829,36465,36515,36604,36556,36682,36572,36547,36697,36716,36670,36419,36716,36658,35867,36249,36093,37054,36162,36428,36616,36121,36498,36799,36302,36421,36560,36549,36323,36647,36551,36522,36739,37199,36790,36574,36467,35988,37047,36421,36681,36078,36640,36334,36561,36764,36503,36496,36613,36402,36131,36408,36729,36472,37151,36626,36788,36088,36664,36571,36600,35953,37090,36872,36694,36306,36490,36231,36172,36516,36732,36374,36433,36203,36299,37008,36539,36434,36570,36345,36445,36686,36843,36422,37226,36757,36140,36476,36665,36584,36693,36878,36494,36402,36742,36491,36748,36168,36916,36867,36611,36671,36582,36425,36809,36811,36468,36713,36667,36132,35948,37100,36610,36292,36333,36316,36841,36508,36829,37019,36436,36961,36573,37149,36679,36345,36802,36398,36458,36078,36822,36447,37078,36828,36431,36986,36386,37136,36334,36260,36068,36789,36080,36450,36927,36852,35831,36461,37140,36225,36844,36727,36411,36618,36711,37207,36797,36616,36616,36604,36771,36875,36516,36578,36474,36598,36568,36660,36725,36321,36694,36593,36606,36878,36604,36698,36402,36543,36659,37592,36309,36623,36516,36187,36794,35952,36215,37433,36863,36657,36360,35932,37444,37001,36972,36214,36431,36800,37363,36013,36711,36523,36486,35749,36930,36348,36331,36693,37482,36932,36220,36882,36877,36377,36432,36600,37125,36794,37013,36705,36346,36860,36786,36799,36678,36367,36472,36679,36783,36440,36485,36681,37069,36480,36055,36683,36467,36173,36652,36512,36427,36702,36096,37018,36295,36394,36460,36726,36844,36920,36404,36861,36835,36742,36869,36971,36726,36769,36059,36450,36607,36498,36547,36815,36435,36342,36477,36747,36774,36342,36429,37099,36558,36489,36842,36656,37093,37287,36648,36131,36914,36893,36947,36763,37300,36350,36080,36533,37004,36801,36816,36958,36918,36592,36762,36824,36074,36795,36729,36633,36511,36400,36678,37123,36441,37016,36446,36499,36518,36314,36762,36388,36557]},{"counters":[36611,36445,36227,37065,36055,36393,37139,36577,36360,36661,36621,36585,36602,36401,36987,36468,36764,37056,36572,37027,36672,36543,37217,36421,37059,36076,36473,36925,36373,36649,36005,37033,36784,37096,36174,36809,36722,36577,36571,36546,37621,36443,36694,36906,36901,36458,36081,36598,36534,36979,36980,36780,36404,36199,36643,36896,36655,36907,36923,36738,36681,36812,36928,36454,36729,36449,36417,37403,37126,36133,36070,36294,36337,36517,36719,36948,36574,36759,36611,37080,36369,36726,36511,36912,36524,36701,36246,36598,36605,36374,36246,36691,36053,36679,36572,37078,37498,36826,36353,37081,36741,36322,36020,36919,36920,36563,36023,37030,36578,36751,36766,36337,36680,36788,36215,36987,36294,37015,36701,36573,36210,36451,36602,36908,36890,36566,36176,36851,37018,37216,36112,36703,35981,36756,36711,36658,36190,36815,36787,36698,36946,36565,36597,36756,36490,36716,36837,36798,37122,36276,36829,36739,36396,36314,36488,36615,36975,36665,36171,36641,36694,36747,36393,36609,36553,37085,36917,36600,37072,36684,36284,36230,36829,36909,36073,36202,36738,36560,37162,36737,36447,36483,36657,36579,36397,36460,36783,36728,36485,37057,37025,36212,36566,36519,36620,36971,36882,36588,36134,36642,36623,37115,36111,36339,36522,36590,36633,36402,36551,36636,36487,36301,36133,36883,37139,36391,36340,36963,36738,36811,37121,36358,36251,36053,36520,36769,37150,37112,36399,36572,36801,36699,36722,36985,37184,36998,36611,36887,36563,36603,36625,36386,36148,35870,37019,36396,36250,36505,36765,36207,36706,36045,37212,36384,36986,36611,36406,37107,36778,36879,36715,36761,36503,36161,36710,37035,36580,36980,36962,35956,36324,36516,36768,36877,36754,36758,36277,36897,36465,36751,36740,36468,36911,36626,36578,36501,36526,36995,36073,36570,36212,36511,36314,36377,36967,36487,37105,36231,36333,36557,36938,36755,36751,36731,36654,36501,36949,36993,36621,36275,36659,36933,36477,35921,36464,36897,36784,36894,36257,36677,36586,36669,36960,36716,36651,36904,36788,36279,37219,36377,36297,36638,36989,36338,36838,36583,36885,36170,36901,36398,36608,37177,36766,37379,36483,36481,35985,36294,36427,35936,36722,36750,36510,36495,36652,36699,36495,36233,36621,36354,36520,36674,35867,36746,36527,36782,36874,37081,36662,36242,36631,36673,36996,36333,36196,36450,36618,36568,36633,36378,36805,36515,36660,36936,36672,36538,36783,36633,36653,36667,36039,36348,36635,36910,36640,36581,36346,36536,36152,37171,35840,37024,36200,37105,36105,36302,36570,36884,36664,36860,36483,36987,36917,37024,36525,37009,36885,36260,36279,36646,35805,36606,37018,36800,36790,37169,36916,36040,36807,36404,36779,36749,36342,36942,36450,36543,36406,36672,36309,36237,36684,36715,36580,36861,37076,37051,36654,36517,36033,36585,36821,37050,37129,36816,36630,36439,37056,36679,36132,36022,36893,36797,36315,36665,36412,36776,37183,36725,36683,36981,36796,36689,36465,36374,36370,36534,36660,36488,36863,37136,36764,37243,36638,36591,36931,36559,36359,36914,36728,36779,36092,36129,36432,37015,36810,37293,36695,36248,36708,36900,36766,36306,36292,36452,36664,36223,37598,36582,37157,36652,36685,36836,36441,36205,36496,36424,36936,36643,36485,36491,36718,36365,36942,36260,36937,37151,36878,36947,36230,36332,36731,36258,36385,36244,36444,36848,36206,36709,36069,36355,36794,36462,36595,36484,36220,36463,36347,36252,36429,36861,36418,36355,36684,36750,36642,36092,36655,36438,36799,36702,36802,37100,36639,36860,36332,36529,37139,36559,36950,36443,36005,36677,36627,36701,36088,36692,36803,37136,36122,36529,36630,36722,35863,36202,36772,36714,36418,36789,36091,36479,36775,36622,36840,36209,36281,36743,36410,36840,36417,36666,36279,36519,36466,36894,37132,36645,36606,37251,36390,36724,37474,36739,36768,36680,36566,36603,36168,37001,36596,36980,36161,36587,36476,36634,36974,37041,37637,36212,36925,37013,36504,36740,36213,36932,36361,36774,36275,35931,35968,36134,36052,37391,36374,36473,36530,36420,36148,36390,36431,36780,36846,37641,36231,36518,36752,36694,36332,36440,37052,36518,36308,36813,36519,36697,36437,36553,37156,36550,36345,36012,35996,36557,36246,36290,36536,37125,36041,36098,36725,36496,37036,36734,36547,36354,36807,36648,36517,36660,36741,36668,36669,36076,36372,36755,36842,36744,36862,37002,36766,36983,36164,36296,36291,36065,36675,36935,37012,36830,36795,36842,36357,36316,36930,36541,36886,36588,36772,36549,36592,36357,36427,36689,36939,36279,36473,36390,36456,36818,36300,36647,36554,36329,36457,37143,36729,36602,36100,36753,36664,37172,36078,36435,36440,36552,36701,36335,37036,37040,36067,36399,36450,36969,36392,36637,36577,36735,36917,36625,36545,36348,36977,36924,36439,36662,37152,36119,36668,36516,36423,36396,36460,36126,36491,36851,36965,36265,36795,37184,36309,36575,36560,37003,36698,36937,37165,36503,36117,36267,36468,36682,36694,36847,36306,36377,36592,36289,36307,36838,36453,37560,36491,36537,36887,36731,36515,36658,36923,37002,36813,36377,37452,36215,36189,36937,36703,37060,36764,36742,36490,36589,36646,36129,36808,36177,36676,36942,37149,36703,36575,36409,36626,36508,37108,36371,36924,36713,36165,36615,36326,37254,36282,36900,36239,37330,36773,36606,37109,37168,36785,36809,37010,36656,36142,36826,36326,36574,36718,36561,36287,36728,36458,36839,36353,36424,36430,36472,36548,36116,36232,36998,36957,36063,36827,36224,36770,36538,36714,36602,36496,36973,36822,36273,36720,37094,36202,36736,36871,36152,36469,36285,36414,36647,36573,36489,36530,35965,36737,36534,36346,36883,36842,36216,36567,36914,36396,36295,36857,37154,36516,37015,36834,36520,36298,36816,36513,36751,36782,36484,36645,36643,36759,36461,36065,36828,36402,36554,36669,36687,37193,36404,36495,36521,36429,36635,36569,36653,37019,36343,36415,37243,36748,36270,36584,36777,36319,36375,36580,37006,36969,36022,36922,36372,36488,36500,36981,36619,37020,36598,36580,37002,37196,36518,36782,36435,36233,36015,36237,36605,36122,36234,36697,35891,36863,36539,36944,36770,36914,35934,36231,36631,36790,36945,37043,36651,36306,36259,37037,36489,36537,36760,37153,36508,36830,37446,36442,36407,36658,36782,35993,36149,36047,36603,36965,36600,36417,36214,36683,37537,36332,36635,36620,36327,36424,36185,36659,36999,36896,36324,35881,37120,36494,36894,36455,36494,36335,36460,36618,36582,36212,36314,36452,36527,36846,37167,36421,36840,36662,37111,36451,36900,36687,36870,36700,36660,36374,36204,36254,36935,36981,36910,36663,36431,36920,36681,36021,36440,36198,36310,36584,36658,36216,37093,36428,36795,36372,37153,36613,36214,36780,36999,36227,36927,35883,36915,36188,36396,36812,36755,36372,36713,36507,37155,36376,36700,37216,36720,36484,36558,36697,36761,36496,36554,36741,36486,36234,36760,36179,36526,36247,36997,36592,36686,37024,37213,36810,36785,36371,37181,36895,36875,36111,36730,36869,36497,36913,36455,36932,36647,36454,36661,36827,36543,36630,36198,36724,36661,36770,36839,36364,36503,37202,36767,36130,36854,36413,36395,36472,36577,36120,36220,36654,36784,37201,37055,36568,36797,36893,36398,36351,37220,36794,36287,36492,36932,36405,36178,36534,36205,36503,36486,36595,37258,37683,36379,37063,36193,36561,36500,36801,36805,36398,36080,36925,36180,36757,36598,36673,36675,36590,36684,36896,36596,37055,36795,36694,36913,36965,36928,36623,36574,37531,36530,37023,36525,36486,36575,36357,36446,36713,36592,36975,36342,36856,36870,36741,36810,36835,36548,36478,36758,36125,36451,36588,36663,36245,36412,36801,36592,36792,36356,36364,36082,36718,36613,35914,36715,36945,36271,36728,36551,36780,36761,36045,36503,36378,36665,36680,36750,36528,36648,36877,36376,36506,36521,36844,36401,36664,36268,36903,37021,37126,37218,36215,36960,36688,37208,36737,36918,36753,36685,36847,37104,36269,36422,37218,37399,36879,35621,36682,36652,36565,36410,37045,36646,36806,36731,36454,36609,36148,36420,36489,36183,36294,36457,37073,36547,36305,36871,37032,36870,36056,36474,36232,36365,36648,36383,36733,37137,36505,37212,36287,36912,36969,36962,36795,36750,36439,37585,36527,36371,36810,36454,36887,36621,36998,36475,35981,36707,36559,37115,36494,36511,36137,37063,36925,36802,36143,36554,37068,36584,36393,36488,36794,36301,36762,36949,36128,36578,36466,37116,36678,36501,36288,37426,36534,36704,36930,36775,36713,36829,37231,36679,36396,36750,36801,36445,36431,36081,36447,36651,36784,37008,36611,36389,36749,36503,37007,36910,36729,36183,36772,37050,36902,36759,36692,36597,36600,36769,36431,36888,36585,36641,36324,36972,36815,36920,36359,36586,37225,36500,36656,36642,36727,36749,36363,36609,36601,36562,36195,37200,36903,36539,36572,36760,36418,36570,36634,37068,37029,36788,36815,36302,36365,37055,36612,37170,36801,36455,36348,36105,36146,36384,36138,36661,36661,36908,36464,36521,36772,36530,36684,36856,36821,36100,36783,36645,36654,36727,36625,36696,36645,36881,36515,36773,36747,36910,36733,36560,36458,36148,36269,36869,36655,36254,36435,37232,36931,36791,36765,36567,36458,36138,36255,36538,36383,36413,36242,36130,36839,36818,36743,36557,36701,36616,36447,36516,36669,36658,36886,36003,36750,36390,36660,36417,36841,36868,36947,36712,36328,36545,36208,36372,36314,36244,37023,36600,37084,36512,36227,36888,36455,36325,36552,36394,36977,36812,36329,36675,36510,36438,36657,36013,36077,36569,36699,36096,36818,36598,37022,36617,36390,36786,36749,36320,37551,36321,36815,36625,36193,37120,36357,36435,36377,36582,35922,36834,36722,36809,36934,36088,36924,36264,36545,36563,36592,36749,36141,36434,36326,36680,36263,36450,36300,36946,36787,36350,36337,36601,36492,36526,37548,36989,36730,36886,36504,37709,36690,36416,36730,36939,36296,35970,36862,36500,36246,36751,36699,37076,36729,36635,36923,36395,36342,36278,36468,36201,36289,36918,36694,36435,36587,36643,36421,36839,36294,36624,36780,36475,35923,36894,36930,36527,36881,36455,36671,36658,36265,36390,36970,36957,36466,36891,36498,36334,36805,36529,36614,36671,36640,36217,36631,36743,37633,35932,36693,36821,36531,36184,36390,36317,36553,36358,36638,37422,36792,36510,36775,36999,36358,36241,36999,36595,36532,36776,37191,36606,36979,36906,36740,36338,36843,36437,37129,36343,36460,35812,36343,37119,36744,36078,36269,36200,36619,37250,37023,36282,36667,36531,36462,37029,36783,36981,36170,36938,36542,37171,36923,36739,36987,36728,36526,37410,36334,36267,37374,36326,36238,36927,36652,36508,36610,36505,36825,36266,37019,36351,36043,36385,36509,36901,36742,37035,36309,36239,36689,36542,36899,36539,36534,36338,36877,36500,37039,36677,36420,37269,36610,36524,35943,36787,36219,36909,36331,37026,36511,36700,36870,36345,36110,37277,36973,36434,36586,36524,36118,36116,36317,37161,36189,36774,36520,36979,36038,36733,36575,36307,36565,36544,36647,36985,36236,36208,36699,36336,37103,36756,36365,36104,36824,36583,36605,37153,36342,37193,36184,36360,36652,36396,36418,36197,36567,36735,36878,36580,36550,37003,36672,36182,36385,36565,36237,36420,36826,36638,37171,36099,36870,36618,36703,36895,36419,36322,36857,35846,36609,36824,36451,36778,37089,36852,36005,36393,36621,36317,36242,36625,36706,36586,36238,36602,36667,36541,36952,36265,36032,35941,36612,36656,36816,36632,36389,37203,36267,36478,36906,36262,36694,36236,36740,36437,37625,36787,36345,37186,36635,36072,36840,36781,36381,36587,36586,36499,36506,36831,36786,36095,36663,36791,37204,36723,36339,36900,36172,35956,36115,36681,36982,36764,36631,36346,36327,36732,37284,36799,36601,36915,36748,36328,36659,36567,36640,36118,36851,36787,36954,36860,36573,37245,36782,36322,36723,36588,36685,36639,36581,36296,37110,36528,37118,37080,36625,36878,36560,36614,36298,35843,36963,36418,36586,36808,36766,36478,36526,36286,36348,36497,36566,36275,37055,36508,36374,36897,36352,36605,36476,36389,36986,37035,36268,36290,36951,36591,36439,36928,36471,36720,36549,37139,37037,36577,36655,36351,35887,36595,36691,36077,36854,36949,37289,36827,36472,36469,36567,36906,36856,36379,36641,36311,36152,36179,36862,36437,36439,36599,36000,36415,36635,36701,37247,36303,36543,37191,36749,36478,36295,36249,36528,36386,36954,36849,37019,36640,36449,36561,36968,36464,36743,36811,36458,36207,37056,36394,36263,36898,36594,36871,37093,37331,36930,36730,36595,36834,36923,36671,36108,36133,36348,37083,36736,36575,36521,37076,36864,36973,36427,36018,36445,36743,36613,36440,36453,36675,36798,37225,36789,36466,36695,37024,36525,37069,36746,36686,36929,35707,37017,36162,36887,36753,36518,37018,36588,36729,36963,36547,37048,37418,36294,36783,36760,36828,36549,36736,36775,36844,36498,36744,36963,36342]},{"counters":[36149,36871,37003,36816,36730,36387,37072,37587,36630,36734,36947,36292,35863,36497,36414,36698,36424,36975,36101,36156,36288,36619,36369,36694,37022,36878,36432,36528,36624,36537,36519,36650,36873,36096,36334,37150,36685,36716,36912,36266,36733,36973,36813,36677,36391,37060,36254,37108,36846,36228,36477,36899,36393,36483,36547,36858,36765,36787,36834,36469,36562,36737,36178,36733,36700,36633,36371,36845,36927,36931,36381,37060,36447,37088,36664,36871,36522,37089,36687,36784,36675,36588,36595,36424,36412,37455,36375,36934,36510,36567,36629,36270,36883,36422,37207,36106,36936,36708,36630,36633,36146,36266,36557,36542,37040,36510,36411,36094,36781,37040,36223,36805,36934,36559,37178,36685,36577,36371,36440,36612,36720,36934,37024,36252,37066,36903,36397,36785,36423,36262,36705,36324,36844,36635,36757,36678,36203,35694,36690,36628,36736,36320,36525,36527,36482,36632,36423,36552,36296,37069,36600,36852,36594,36485,36250,36398,36813,36840,36767,37085,36467,36303,36933,36144,36457,36739,36315,35961,36267,36361,36754,36953,36757,36542,36294,36815,36601,36355,36234,36650,36731,36557,36618,36323,36709,36841,36519,36691,36402,36347,36289,36882,36409,37465,36937,36741,36383,36806,36799,36367,36860,36768,36284,36302,36549,36278,36135,36819,36541,36960,36401,36378,36446,36297,36747,36969,36844,36831,36868,36489,36413,36689,36589,36684,36803,36531,36683,36644,36976,36346,37068,36681,36800,36297,36952,36540,36398,36449,37088,36746,36748,36095,36270,36646,36190,36145,36554,36410,36457,36928,36341,36542,36606,36652,36272,36674,36476,36246,35993,36691,37495,36848,36106,36267,37536,36904,36315,37072,36240,36547,36724,36521,37029,36496,36504,37015,36698,36817,36783,36616,36795,36728,36574,37186,36874,36461,36675,36591,37132,36038,36379,36507,36663,36552,36467,36506,36587,36848,36520,36709,36128,37306,36297,36454,36804,36067,36168,36631,36436,36741,37054,37103,36366,36528,36152,37075,36216,36489,36757,36676,36334,36363,36355,36536,37234,36432,36361,36444,36272,36804,36596,36826,36519,36730,36453,36792,37095,37148,36636,36586,36765,36352,36735,36907,36700,36309,36677,35954,36779,36361,36578,36909,36916,36686,36390,36797,37188,36563,36245,35958,37048,36775,36499,36812,37048,36758,36749,36432,36734,36397,36571,36871,36279,36081,36679,36440,36616,37028,35754,36830,36801,36645,36313,36795,36813,36860,35974,37091,36241,36728,36754,36815,36320,36647,36370,36424,36856,36465,36463,36479,36219,36557,36423,36390,36663,36588,36692,36511,37061,35999,36787,36777,36518,36497,36541,36883,36492,36844,36466,36779,36526,36316,37343,36493,36688,36707,37027,36641,36573,36607,35805,36296,36279,36361,36753,36052,36882,36320,37261,36627,36671,36373,36636,36339,36514,36620,36687,36242,36670,36910,36530,36074,36653,36146,36537,36885,36234,36561,36311,36904,36462,36768,36579,36652,36806,37132,35683,36560,36266,36557,36722,36138,36433,36563,37125,36926,36863,37516,36884,36437,36469,36267,36567,36783,36364,36362,36776,36645,35883,36354,37049,36374,36953,36432,36081,36535,36502,37380,36694,36816,36627,36713,36397,36562,36617,36677,36492,36536,36757,36748,36282,36365,36636,36661,36485,36493,36416,36959,36473,36456,36031,36660,36443,36371,36523,36687,36409,36375,36558,36528,36478,36505,36929,36333,36413,37246,36160,36642,36896,36684,37194,36910,35984,36088,36214,36574,36674,37172,36879,37008,36957,36856,36605,36856,37149,36815,36174,37217,36424,36726,36595,36218,36732,36857,36579,36191,36743,36733,36841,36810,36579,36225,37111,36626,37426,36610,36431,36791,36782,36487,37212,36516,36191,37449,36349,36886,36424,36709,36614,36363,36295,36634,36665,36506,36339,36405,36342,36694,36450,36871,36766,36299,36666,36712,36284,37125,36275,36661,36294,36920,36814,36016,36782,36033,37274,36406,36933,37098,36506,36466,36048,36299,36462,36632,35982,36250,36115,36790,37127,36402,36467,36663,36371,36752,36980,36787,36800,37096,36350,36965,36429,36264,36022,36316,36449,36935,36577,36792,36523,36584,36421,36581,36765,36432,36704,36601,36703,36511,36937,36839,36414,36792,37108,36567,36893,36835,36104,36585,36924,36758,36365,37154,36704,36877,36194,36382,37009,35802,37047,36630,37604,36209,36496,36977,36797,36643,36853,36390,37042,36416,36289,36330,36537,36404,36586,36953,36492,36492,36653,36546,36615,36850,37055,37179,36458,36760,36473,36230,36525,36698,36258,37208,36180,36539,36768,36660,36417,36183,37009,36398,36752,36525,36607,36571,36476,36485,36537,36620,36328,36326,36423,36673,37387,36401,36674,36439,36298,37047,36349,36449,36338,36351,36545,36429,36435,36579,36243,36955,36693,36167,36620,36599,36605,36829,36848,36641,36349,36441,37143,36344,36425,36381,36562,36486,36476,37150,36968,36585,36533,36460,36930,36968,36521,36235,36711,36280,36216,36943,36361,36999,37081,36504,36774,36285,36522,36615,36830,36883,36497,36790,36415,36743,36281,37548,37177,36230,36492,36739,37210,36522,36540,37248,36946,36674,36842,36820,36861,37221,37068,36652,36587,36625,36515,36956,36554,36826,36559,36600,36450,36498,36305,37108,36566,36161,36540,36966,36605,36615,37171,36255,36490,36304,36830,36486,35979,36598,36775,36742,36710,36458,37089,36627,36463,36270,36395,36952,36743,36882,36603,36835,36813,36213,36672,36869,36750,36876,36452,36254,37327,36452,36213,36980,36218,36323,36797,36791,36467,36649,36735,36840,36702,36953,36930,36446,36619,36592,36826,36558,36473,36720,36649,36934,36799,36071,36704,36772,36255,36140,36614,36461,36839,36743,36894,36460,36579,36854,36347,36411,36938,35985,35670,36731,36662,36475,36737,36453,37007,36493,36982,36510,37462,36764,36653,36455,36790,36423,36431,36766,36627,36203,36464,36260,36231,36386,36687,36443,36381,36433,36684,36258,36643,37090,36737,36557,36577,36825,37160,36432,36358,36232,35821,36798,36718,36467,36447,36312,36515,36429,37153,36400,36254,36694,36416,37019,36822,36482,36529,36413,36684,36609,36983,36836,37252,36799,36009,37008,36797,36554,36593,36659,36823,37537,36560,35944,37176,36555,36872,36733,36931,36507,36783,36344,36844,36130,36408,36632,36907,36149,36138,36735,37217,36217,36479,36365,36248,36915,36292,36941,37527,36428,36666,36081,36206,36163,36770,36564,36781,36755,36889,36232,36649,37221,37097,37044,36330,36243,36218,36955,36173,36518,36593,36258,36294,36604,36807,36548,36371,35946,37158,37037,36375,36405,36456,36504,37071,36793,37193,36683,36320,36494,36575,36827,36579,37420,36448,36744,36941,36776,36772,36531,36909,36335,36318,37186,36234,36669,36915,36418,36567,36462,37318,36252,36553,36359,36621,36540,36855,36470,36353,36531,35935,36146,37006,37166,36135,36701,36666,36982,36492,36574,36438,37052,36723,36387,37187,36746,36524,36496,36464,36367,36847,36714,36904,37137,37185,37001,37239,36516,36489,36412,36117,36753,36518,36497,36849,36644,37136,37085,36631,36768,36436,36128,36325,36178,36991,36764,36432,37026,36477,36544,36934,36530,36297,36890,36311,36234,37210,36755,36324,36543,36232,36310,36406,36687,36715,36788,36556,36653,37161,36796,37006,36493,36571,36584,36883,36383,37182,36692,36709,36020,36453,36735,36944,37141,36270,36116,36465,37082,36294,36494,36548,36402,36979,36165,36344,37184,36540,36610,36258,36765,36609,36804,36685,37058,36148,36670,36411,36429,36596,36381,36240,36329,36844,36641,36383,36497,37019,36592,36750,36649,36634,36646,37040,36726,36333,37073,37469,36619,36688,36724,36869,36837,36541,36730,36527,36171,36364,36754,36689,36970,37020,36703,36766,36576,36941,37090,36941,36589,36764,36785,37074,36161,36620,36791,36671,36227,36790,36683,36992,36076,36656,36865,37047,36338,37078,36572,36723,36491,36943,36279,36616,36406,36766,36250,36794,36494,36401,36382,36927,36542,37204,36933,37248,36921,36595,36286,36255,36407,37060,36603,36331,36548,36272,36362,37114,36894,37015,37253,36948,36404,36671,36659,37011,36851,36922,36514,36402,36892,37183,36379,36248,36478,36649,36322,36805,36511,37269,36392,36657,36578,36581,36648,36062,37183,36828,36315,36698,36765,36586,36806,36866,36884,36297,36531,36956,36609,36758,35824,36806,36457,36449,36628,36886,36196,36508,36588,36698,36744,36038,36772,36609,36431,37283,36416,36650,36841,36340,36775,36830,36830,36289,36546,36502,36767,36527,36737,36253,37012,36524,36144,36010,35989,36454,37094,36452,36721,36605,36271,36383,36730,36507,36254,36491,36816,37077,36508,37170,37286,37022,36946,36608,36374,36661,36428,36709,36911,37104,36364,36499,36488,36591,36302,36286,36784,36596,36147,36674,36673,36954,36859,36177,35991,36322,36645,36756,37334,36184,36342,36591,36332,36473,37222,36744,36480,36638,36351,36603,36062,36358,36862,36410,36315,36761,36501,36337,36811,36723,36533,36763,36559,36546,36508,36951,36730,36778,36305,36614,36529,36505,36414,36803,37107,36544,36743,36265,37099,36688,36378,37009,37478,36267,36598,36418,36463,36313,36163,36898,36388,36576,36991,36567,35983,36864,36997,36836,36500,36599,36532,36549,36942,36776,36551,36780,36525,36409,36526,36332,36998,36742,36793,36335,36595,36700,36770,36032,36276,37440,36708,36573,36545,35855,36930,36442,36836,36810,36438,36741,37224,36754,36986,36693,36647,36149,36500,36555,36940,36441,36836,35883,36535,36260,36409,36968,36309,36435,36457,36612,36682,36473,36395,36207,36487,36012,36696,36482,36327,36900,37006,36383,37326,36650,36641,36405,36639,36061,36505,36500,36284,36687,36350,36437,36723,37261,36300,36237,36432,37064,36449,36662,37137,36397,36332,36923,36807,36517,36501,36333,36191,36882,36354,36621,36563,36420,36480,36843,36764,36491,36924,37105,36851,36839,36706,36640,36508,36532,36463,36457,36164,36986,36849,36501,36665,37273,36444,36679,36506,36649,36262,36949,36900,36633,36899,36679,36638,36061,36346,36281,36602,36706,36721,36629,36079,36711,36733,36488,36230,36790,36458,36814,36417,36266,36731,36439,36247,36424,36284,36576,36383,36389,36666,36803,37493,36669,36738,36837,37016,36700,36552,36570,36548,36572,37320,36269,36897,36852,36367,36655,37022,37015,36614,36819,36771,36408,36600,36625,36350,36594,36254,36804,36783,36644,36857,36347,36715,36495,36642,35945,36720,37055,37247,36310,36416,36438,36064,36195,36386,36935,36636,36413,36842,36642,36189,37212,36597,36560,36821,36361,36425,36692,36210,36395,36665,36813,37597,36538,36866,36312,36658,36691,36294,36241,36917,37090,36582,36623,36393,36877,36424,36442,36756,36956,36875,36884,36657,36925,36888,36560,36763,36986,36690,36486,36829,36510,36760,35725,36690,37078,36667,36826,36858,37036,36780,36413,36422,36827,36636,36493,36036,36719,37127,36944,36261,37178,36643,36982,36636,36166,36417,36903,36511,37306,36583,36691,35986,36412,36652,36268,36800,36822,36457,36913,36692,36638,36407,36661,37225,36543,36430,37138,36492,36730,36867,36771,36136,36709,36413,36847,36385,36165,36340,36742,36395,36163,36578,36661,36759,37021,36580,36577,36763,35937,36273,36385,36685,36641,36668,36739,37260,36328,36416,35848,36379,36539,36418,36865,36174,36690,37029,35933,36455,36725,37009,37254,36359,36485,36604,36537,36893,36651,36637,36681,36938,36981,36239,36768,36990,36622,37015,36396,36497,36658,36698,36741,36754,36811,36933,37380,36943,36560,36938,36452,37047,36525,37265,36686,36271,36903,36379,36402,36725,36579,36491,36332,36661,36417,36783,36944,36468,36539,36766,36695,36881,36457,36075,36306,36533,35960,36764,36362,36598,36631,36618,36393,36945,36896,36626,36569,36729,37417,36375,36885,36954,36501,36234,36921,36196,36640,36796,37692,36458,36855,36815,36937,36702,36269,36867,37151,36815,36992,36884,36658,36628,36102,36960,36865,36969,36534,36127,36334,36909,36387,36693,36631,36849,37150,36444,36587,36492,37077,36680,37048,36925,36702,36678,36628,36689,36263,37423,36272,36876,36513,36645,37216,36322,36419,36376,36955,36990,36771,36683,36762,36666,37156,36867,36233,37130,36599,36151,36142,36923,37012,36234,36761,36841,36461,36730,36794,36724,36524,36165,37188,36549,36203,36265,36200,36393,36474,37075,36260,36746,36745,37428,37370,36432,36724,36392,36939,36608,36624,36652,36630,36979,36563,36636,36605,37027,36546,36467,36662,36195,36495,37294,36740,36465,36228,36616,36444,36256,36417,36783,36589,36187,37456,36424,36572,36575,36313,36691,36264,37255,37034,36271,36567,36781,37250,36332,36156,36330,36729,36563,37281,36452,36509,36461,36327,36500,36468,36452,36279,36508,37097,36235,36303,36112,36527,36813,35813,36916,36621,36293,36558,36343,36445,37097,36590,36668,36867,36232,36751,36543,36596,36706,37347,36358,36570,36031,36103,36908,36717,36955,36821,36120,36669,36681,36826,36200,36674,36660,37020,37021,36546,36326,36411,36608,36358,36267,36417,36695]},{"counters":[36897,36697,36159,36181,36545,37105,36450,36252,36403,36780,36689,36316,36889,36683,37053,36898,37184,36414,36954,36447,36173,37028,36301,37524,36799,37004,36863,36764,36502,36995,36726,36399,36778,36601,36564,37555,35986,36710,36773,36005,36182,36700,36786,36922,36409,36281,36657,36932,36523,36303,36538,36631,36997,36415,36554,36812,36996,36613,36025,37016,36212,36679,36024,36463,36205,36408,36281,36720,36306,36377,36466,36469,36619,36686,36244,36606,36351,36430,36223,35687,36344,36735,36154,36384,36831,36116,36419,36778,36390,35971,36707,36816,35842,37163,36886,36071,37039,36253,37159,36537,36637,36891,36823,37159,36567,36616,36565,36704,36315,36250,36604,36258,36661,36464,36000,36618,36990,36162,36750,36251,36717,36448,36874,36247,36556,36476,36148,37095,36272,36899,36995,36835,36271,36646,36166,36310,36981,36289,36261,36781,36610,36360,36649,36193,36413,36292,35995,36957,35660,36652,36961,36853,36435,36754,36687,36355,37058,36335,36981,36573,37067,37022,36568,37109,36156,36158,36408,36767,36855,36904,36050,37131,36610,36329,36909,36645,36483,36732,36770,36153,36506,36362,36790,36902,36938,36452,37067,36065,36416,37001,36322,36729,36311,37059,36886,36503,36759,36724,36476,36481,36879,36341,36662,36749,36706,36609,36888,36118,36409,36641,36147,36723,35968,36578,37122,36331,36871,36298,36805,36568,36558,36741,37072,36476,36836,36638,36364,36421,36809,36434,36908,36913,37398,36568,36844,36565,36195,36130,36670,36499,36241,36513,36757,36391,36822,36733,36206,36913,36695,36502,36754,36848,37143,36304,36716,36536,36567,37235,36904,36142,36375,36461,37110,36612,36755,36336,36619,36238,36624,36770,36251,36789,36783,36348,36619,36371,36361,36605,36551,36965,36429,36703,36518,36501,36696,37489,37254,36669,37244,36456,36540,36875,36082,36416,37040,36378,36761,36789,36475,36301,36580,36554,36813,36663,36488,36799,36654,36719,36357,36587,36447,36746,36507,36523,36496,36510,36359,36713,36583,36529,36700,36760,36349,36721,36482,36980,36458,36240,36917,37072,36589,36896,36947,36895,37206,36890,37207,36908,36835,36557,35644,36358,36347,36379,36592,36408,36617,36744,36601,36157,36536,36782,36557,36406,37282,36413,36800,36709,36241,36233,36436,37172,36838,36598,37093,36642,36631,36765,36457,36866,36627,36469,36284,36764,36573,36780,36581,36848,36217,36917,36447,37039,36425,36877,36680,36756,36821,36796,36434,36654,37015,36323,36538,37119,36450,36378,36463,36426,36238,36301,36460,36805,36765,36435,36538,36225,36113,36823,36367,36396,36455,36557,37080,36467,36677,36779,36470,36941,36209,36804,36581,36949,36866,36164,36724,36304,36885,36941,36935,37207,36291,37001,36481,37016,36475,36347,37182,36560,36643,36354,36517,36380,36738,36456,36128,36464,36053,36181,36566,36585,36449,36840,36800,36645,36490,36257,36665,36633,36267,36387,36420,36522,37018,35958,36839,36815,36376,36860,36968,36756,36968,36665,36647,36517,36921,36525,36894,36560,36366,36635,36767,36900,36787,36553,36820,36909,36709,36510,36793,36360,35927,36080,36749,36537,36350,36862,36718,37061,37203,36808,36724,36873,37009,36593,36890,37079,37136,36130,36943,36803,36472,36555,36072,36124,36591,36391,36184,36559,36971,36036,36411,37108,36625,36316,37028,36381,36429,36560,36754,36248,36452,37098,36370,36508,36583,36741,36565,36629,36435,36375,37332,36420,36099,36071,36915,36668,36708,36239,36516,36723,36781,36547,36617,36743,36774,35935,36618,36983,36945,36479,36973,36978,36659,36502,36556,36788,36242,36913,36023,36520,36458,36105,36595,36533,36617,36462,37245,37344,36717,36969,36110,37156,36294,36391,36059,36634,36440,36631,36300,36852,36850,36282,36588,36315,36364,36655,36773,36628,37077,36712,36441,37309,36419,36355,36655,36219,37126,36775,36547,36375,36242,36783,36648,36604,36482,36430,37195,36644,36475,37042,36984,37166,36765,36675,37549,36771,37155,36568,36310,36813,36860,36871,36944,36914,36346,36218,36865,36981,36309,37031,37307,36623,36373,36187,36147,36505,36637,36514,36731,36585,37192,36451,36414,37196,36330,36553,37103,36834,36860,36648,36592,36699,36887,36610,37497,36958,36611,36440,36470,37517,36658,37286,36559,36793,37123,36261,36580,36466,36723,36589,36956,36674,37148,36637,36662,36131,36952,36369,36746,36441,36552,36898,36728,36912,36779,36960,36623,35994,36534,36874,37280,36449,36563,36896,36445,36694,36674,36380,36898,36613,36688,36216,36306,36651,37308,36899,36201,36488,36639,36221,36777,35951,37120,35893,36324,36644,36751,36645,36955,36924,36106,35937,36818,36387,36857,36528,36566,37052,36563,36444,36639,36187,36372,36407,36942,36298,36454,36639,36403,36641,36386,36980,36749,36010,36248,36978,36710,37093,36670,36482,36407,37057,36599,36601,36772,36579,36650,36733,36730,36628,36848,36791,36022,36185,36553,36952,36729,36774,36914,36550,37295,35970,36212,36304,36525,36642,36778,35834,36220,36670,36418,37030,36931,36780,36028,36912,36642,36379,37099,36445,37093,37140,36864,37202,36506,36699,37001,37043,36659,36366,37008,36949,36483,36291,36739,36690,36287,36371,36621,36612,36311,36646,37096,36736,36553,36693,36176,37313,36925,36674,36581,37077,36673,36929,36467,36637,36558,36890,36422,36573,36821,36137,36469,37044,36755,36256,36377,37260,36607,36461,36749,36502,36554,36735,36974,37108,36188,36230,36938,36891,36077,37140,36552,36870,35980,36514,36565,36370,36361,36566,36340,36583,36759,36613,36203,36826,36749,36903,37241,36844,36284,36613,36630,36939,36361,36231,36496,36245,36258,36511,36365,36769,36602,36396,36755,36834,36881,36677,36324,36400,36799,36343,36362,36974,36870,36931,36249,36662,36716,36596,36786,36229,35670,36466,36619,36666,36805,36374,36982,36431,36528,36306,36569,36722,36641,36775,36144,36656,36834,36416,37319,36269,36721,36646,36890,36947,36045,36845,36253,36696,36196,36850,36843,36401,36540,36554,36418,37057,36813,36417,36203,36423,36434,36867,36409,36720,36905,36830,36797,36484,36669,36717,36963,36081,36550,36894,36703,36725,36488,36678,36264,36655,36634,37118,36646,36476,36719,36347,36941,36152,36309,36968,36508,36813,36245,36121,36500,36481,36409,36762,36262,37047,36362,36218,36035,37282,36542,36516,36132,36874,36959,36717,36869,36689,36540,36350,36656,36410,36748,36598,36523,36455,37015,36417,36954,37748,36023,36553,36186,36657,36370,36895,36544,36269,36910,37258,36321,37543,36647,37045,36771,36872,36101,36546,36890,36656,36739,37177,36730,36391,35973,36958,36450,36822,36555,36765,36503,36219,37138,36744,37160,36275,36097,36189,36487,36516,37127,36723,36600,36540,36662,35924,37323,36207,36349,36571,36474,37116,36959,36493,36023,36613,36573,36723,36205,37002,36193,36359,36773,36440,36596,36241,36880,36679,36481,37375,36669,36652,36637,36944,36614,36217,36276,36858,37401,36438,36483,36814,36647,36661,37133,36398,36348,36391,36594,36820,36853,36344,36331,36941,36536,36375,36041,36924,36516,36969,36549,36311,36745,36515,36236,36666,36510,36510,36578,36543,36849,36739,36728,36970,36998,36883,36285,36934,36502,36394,36415,36770,36992,36406,36293,36214,36856,36931,36703,36493,35989,36549,36062,36429,36559,36768,36661,36705,36666,36444,36401,36886,36509,37222,36839,36462,36292,36502,36941,37091,36573,36635,36370,36502,36825,36229,36294,36430,36710,36664,36084,36256,36874,37043,36041,36688,36715,36158,36869,36577,36619,36285,36197,36808,36718,36691,36486,36489,36492,36514,36703,36841,36191,36489,36356,36422,36602,36903,35944,36559,36800,36660,36606,36646,36287,36941,37075,36845,36525,36998,36550,37043,36390,36975,36498,37146,36777,36823,36591,36133,36885,37712,36516,37030,36364,36545,37206,35813,36413,36742,37054,36959,37004,36412,36571,36653,36963,36951,37103,37000,36925,35806,37221,36879,36178,36902,36480,36659,36785,36730,37266,37059,36700,36392,36449,37184,36378,36622,36289,36733,36786,36982,36524,36760,36596,36253,36464,36380,36196,36429,36226,36400,36525,36303,37214,36557,36008,36610,36736,36217,36692,36564,36410,36894,36067,36007,36915,36288,36357,37021,36265,37181,36677,36298,36296,36925,36921,36336,36303,36757,37027,36871,36346,36825,35949,36556,36592,36666,36547,37014,37034,36386,36262,36454,36633,36720,36437,36470,37234,36789,36492,36841,36792,36645,36871,36183,36354,36693,36682,36463,36412,36717,36900,36559,37174,37371,36726,36476,36885,36543,36691,36673,36677,36473,36583,36661,36775,36788,36358,36904,37305,36891,36221,36402,36311,36480,36459,36667,36703,36971,36779,36799,36732,36842,36976,36618,36212,36869,36750,36837,36331,36780,36621,36196,36306,36794,36316,36390,36887,36447,36748,36813,36085,36970,36674,36415,36679,37112,36608,36251,37288,36591,36268,36319,36458,37446,36661,36861,36871,36977,36593,36849,36671,36662,36590,36267,36636,36917,36324,36554,36293,36947,36600,36277,36050,36913,36560,36463,36326,36098,36471,36564,36948,36512,36622,36858,36264,36135,36942,36587,36715,36433,36161,36820,36573,36524,36637,37027,36136,36788,36228,36666,36698,37311,36641,36528,36575,37097,36825,36326,36449,36268,36933,36125,36845,36914,36437,36569,36910,37099,36946,37098,36299,36710,37172,37083,36476,36242,36481,36734,36457,36572,36562,36384,36244,36635,36903,36662,36476,36472,36632,36856,36122,36658,36510,36592,36479,36525,37139,37182,36645,36963,36580,36570,37178,36297,36113,36869,36990,36535,36323,36765,36227,36547,36071,36543,36900,36593,36706,36436,37016,36150,36796,36556,36722,36858,36833,36960,36573,36551,36825,36736,36726,36844,36750,36766,37576,36846,35889,36523,36483,36590,36176,36126,36431,37133,36094,36500,36588,36492,36042,36524,36744,36625,36519,36504,36726,36413,36503,36626,36796,37108,36650,36289,36676,36507,36884,36220,36562,36482,36100,36446,37306,36298,36730,37251,36298,36719,36677,36397,36702,37112,36602,36734,36846,36951,36634,36921,36626,36325,36383,37025,37049,35784,36493,36260,36224,37044,36514,37060,37097,36512,36666,36659,36402,36522,36979,36531,36366,36377,37105,36633,36798,36373,36834,36440,36734,36519,37105,36778,36747,36418,36248,36469,36644,37090,36244,36112,36746,36148,36277,36860,36605,36437,36942,36338,36613,37018,36364,36204,36478,37023,36600,37155,37247,36621,36671,36466,36564,36735,36574,36798,37107,36178,36717,36510,36872,36048,36895,37287,37519,36503,35787,36395,37179,36362,36435,37185,36401,36317,36624,36851,36451,36237,36339,36488,36124,36815,36113,36654,36710,36749,36576,36122,37192,37074,37041,36594,36851,36308,36202,37235,36484,36888,36487,36971,37018,36549,36652,36177,36636,37028,36600,36207,36342,36981,36659,36371,37212,36240,36868,36987,36434,36518,36703,36389,36289,36574,36797,36374,36337,36536,36717,36825,36817,36732,36487,36444,36786,36598,36531,35883,36429,36669,36612,36334,36433,36577,36438,36440,36465,37233,36791,36675,36803,36495,36885,36869,37013,36753,35988,36741,36424,36561,36573,36033,36503,36690,36335,36475,36625,36761,36577,37227,37042,36604,36986,36704,36533,36370,36609,36404,36439,37048,36409,36876,36361,36555,36389,36908,36517,36376,36758,36798,36464,36795,36576,36776,36563,36568,36209,36390,36606,36701,36249,37016,36403,36589,36630,36643,36467,36489,35978,36375,36878,36659,36307,36309,37038,36887,36375,36694,36983,37010,36705,36174,36235,36872,36630,36577,36112,36741,36613,37221,36259,36556,36559,36616,36362,36906,36626,36124,36550,36444,37010,36791,36721,36397,36260,36927,36381,36118,36944,37043,36611,36088,36722,36647,36874,36557,36897,36431,36322,36721,36667,36478,36594,36441,37034,36871,36616,36359,36517,36876,36707,37187,36899,36311,36424,37007,36839,36593,35986,36211,36804,36379,36860,36622,36928,36287,36588,36738,36566,36661,36197,37337,36166,36443,36871,36296,36801,36475,36636,36453,36863,37057,36883,36855,36527,36430,37093,36556,36550,36566,36685,36715,36086,36467,36741,36484,36038,37281,36481,37226,36454,36825,36724,36822,36830,36500,36901,36734,36639,36757,36385,36490,36515,37043,36563,37152,36158,36984,37269,36691,36431,36665,36843,36023,36354,36960,36404,36260,37127,36798,36487,36850,36559,36675,36254,36407,36625,36563,36915,36306,36646,36864,36481,36789,36295,36484,36251,37050,36261,36434,36423,36892,36545,37056,36839,36309,36631,36243,36953,36140,37086,36643,36292,36023,36737,36638,36636,37025,37159,36592,36746,36567,36837,37209,36560,36859,36573,36445,36432,36562,36255,36275,36742,36805,36646,36152,36550,36952,36184,36869,36521,36378,37327,36792,36268,36939,36574,36514,36997,36706,37099,36124,36913,36367,36770,37057,36450,36731,35921,36917,36862,36456,36149,36302,36628,36075,36666,36076,36755,36340,37215,36874,36907,36402,36921,36713,36536,36751,37015,37077,36921,37167,37297,36485,36673,37008,36249,36526]}]},"null_count":0,"tot_col_size":3806281133,"last_update_version":401695328358891524},"o_custkey":{"histogram":{"ndv":4973568,"buckets":[{"count":300000,"lower_bound":"NDk=","upper_bound":"MjQwMDE=","repeats":15},{"count":600000,"lower_bound":"MjQzMTM=","upper_bound":"NDY1MjA=","repeats":15},{"count":900000,"lower_bound":"NDk2MzA=","upper_bound":"NzYwNDU=","repeats":15},{"count":1200000,"lower_bound":"NzcyNjM=","upper_bound":"MTAwODM4","repeats":15},{"count":1500000,"lower_bound":"MTAxNzk4","upper_bound":"MTMzODQw","repeats":15},{"count":1800000,"lower_bound":"MTM0MDQ0","upper_bound":"MTYxNzAx","repeats":15},{"count":2100000,"lower_bound":"MTYyNTM5","upper_bound":"MTkyMTkz","repeats":15},{"count":2400000,"lower_bound":"MTkyODk4","upper_bound":"MjI2ODA1","repeats":15},{"count":2700000,"lower_bound":"MjI3NzE5","upper_bound":"MjYyNDcy","repeats":15},{"count":3000000,"lower_bound":"MjY0MTUx","upper_bound":"Mjg3ODI0","repeats":15},{"count":3300000,"lower_bound":"Mjg4MTI3","upper_bound":"MzE2MzU3","repeats":15},{"count":3600000,"lower_bound":"MzE4NDAz","upper_bound":"MzQ3NDMy","repeats":15},{"count":3900000,"lower_bound":"MzQ4MzU4","upper_bound":"Mzc5MzU3","repeats":15},{"count":4200000,"lower_bound":"Mzc5MzY5","upper_bound":"NDEzMzU3","repeats":15},{"count":4500000,"lower_bound":"NDE0NTg3","upper_bound":"NDQyMDI4","repeats":15},{"count":4800000,"lower_bound":"NDQyNTk3","upper_bound":"NDc2NjU2","repeats":15},{"count":5100000,"lower_bound":"NDc2NzM3","upper_bound":"NTE0MjY0","repeats":15},{"count":5400000,"lower_bound":"NTE1MTcx","upper_bound":"NTUwMjQz","repeats":15},{"count":5700000,"lower_bound":"NTUwNTg1","upper_bound":"NTgxMjM5","repeats":15},{"count":6000000,"lower_bound":"NTgzMTg3","upper_bound":"NjE3MDAy","repeats":15},{"count":6300000,"lower_bound":"NjE4MjU0","upper_bound":"NjU5NTQ4","repeats":15},{"count":6600000,"lower_bound":"NjU5ODcy","upper_bound":"Njg3OTQz","repeats":15},{"count":6900000,"lower_bound":"Njg4OTg0","upper_bound":"NzEzODQw","repeats":15},{"count":7200000,"lower_bound":"NzE1NTIy","upper_bound":"NzM4ODU3","repeats":15},{"count":7500000,"lower_bound":"NzM5Mzk2","upper_bound":"NzcyOTg4","repeats":15},{"count":7800000,"lower_bound":"Nzc2MTAy","upper_bound":"ODA4NjMw","repeats":15},{"count":8100000,"lower_bound":"ODA5MTM4","upper_bound":"ODMzMTUy","repeats":15},{"count":8400000,"lower_bound":"ODMzNDk0","upper_bound":"ODU4NzM3","repeats":15},{"count":8700000,"lower_bound":"ODU4ODkz","upper_bound":"ODg0NTQ2","repeats":15},{"count":9000000,"lower_bound":"ODg0ODg0","upper_bound":"OTEyNTgz","repeats":15},{"count":9300000,"lower_bound":"OTEzNTA3","upper_bound":"OTU2MjUy","repeats":15},{"count":9600000,"lower_bound":"OTU2Mjg3","upper_bound":"OTgxMzMx","repeats":15},{"count":9900000,"lower_bound":"OTgxODgx","upper_bound":"MTAwOTU2OA==","repeats":15},{"count":10200000,"lower_bound":"MTAxMDA1OQ==","upper_bound":"MTAzOTY2Nw==","repeats":15},{"count":10500000,"lower_bound":"MTA0MDM0Nw==","upper_bound":"MTA2NTk0Nw==","repeats":15},{"count":10800000,"lower_bound":"MTA2NjYzNg==","upper_bound":"MTA5NzEyOA==","repeats":15},{"count":11100000,"lower_bound":"MTA5OTE5Mg==","upper_bound":"MTEzMTU3OA==","repeats":15},{"count":11400000,"lower_bound":"MTEzMjE3MQ==","upper_bound":"MTE1NjIyOA==","repeats":15},{"count":11700000,"lower_bound":"MTE1NjM4Mg==","upper_bound":"MTE4Mjc4NA==","repeats":15},{"count":12000000,"lower_bound":"MTE4MjgxNQ==","upper_bound":"MTIyMTY4OQ==","repeats":15},{"count":12300000,"lower_bound":"MTIyMjU1Mg==","upper_bound":"MTI0NTkwNw==","repeats":15},{"count":12600000,"lower_bound":"MTI0NjY1NA==","upper_bound":"MTI2ODAxNA==","repeats":15},{"count":12900000,"lower_bound":"MTI2ODMxMQ==","upper_bound":"MTI5MTc4OQ==","repeats":15},{"count":13200000,"lower_bound":"MTI5MTkyNQ==","upper_bound":"MTMxODU1MA==","repeats":15},{"count":13500000,"lower_bound":"MTMxOTEwNA==","upper_bound":"MTM0NTkxNQ==","repeats":15},{"count":13800000,"lower_bound":"MTM0NjQ1MA==","upper_bound":"MTM3MjA1Nw==","repeats":15},{"count":14100000,"lower_bound":"MTM3MjY2NA==","upper_bound":"MTQwMjI4NQ==","repeats":15},{"count":14400000,"lower_bound":"MTQwMjMzMw==","upper_bound":"MTQzNTEyNA==","repeats":15},{"count":14700000,"lower_bound":"MTQzNjgzMw==","upper_bound":"MTQ2Mjc2MA==","repeats":15},{"count":15000000,"lower_bound":"MTQ2MzA4MA==","upper_bound":"MTQ5NDM2Nw==","repeats":15},{"count":15300000,"lower_bound":"MTQ5Njk2Mg==","upper_bound":"MTUxOTQxMQ==","repeats":15},{"count":15600000,"lower_bound":"MTUxOTg1MA==","upper_bound":"MTU0NTkyMA==","repeats":15},{"count":15900000,"lower_bound":"MTU0NjMwOQ==","upper_bound":"MTU3OTc2Mg==","repeats":15},{"count":16200000,"lower_bound":"MTU4MTk1NQ==","upper_bound":"MTYxMjM3NQ==","repeats":15},{"count":16500000,"lower_bound":"MTYxMzY3NA==","upper_bound":"MTYzNzcyOA==","repeats":15},{"count":16800000,"lower_bound":"MTYzODYxMA==","upper_bound":"MTY1OTUxNw==","repeats":15},{"count":17100000,"lower_bound":"MTY2MDk4MQ==","upper_bound":"MTY5MjIwMw==","repeats":15},{"count":17400000,"lower_bound":"MTY5MjYxNA==","upper_bound":"MTcyNDM1Ng==","repeats":15},{"count":17700000,"lower_bound":"MTcyNjIyMg==","upper_bound":"MTc1Mjc1MQ==","repeats":15},{"count":18000000,"lower_bound":"MTc1MzE1NA==","upper_bound":"MTc4NjE5Mg==","repeats":15},{"count":18300000,"lower_bound":"MTc4Njc3Nw==","upper_bound":"MTgxMTgwMw==","repeats":15},{"count":18600000,"lower_bound":"MTgxMzEyMw==","upper_bound":"MTg0MzEzMg==","repeats":15},{"count":18900000,"lower_bound":"MTg0MzI1OQ==","upper_bound":"MTg3ODA1NQ==","repeats":15},{"count":19200000,"lower_bound":"MTg3OTAzMQ==","upper_bound":"MTkwNTE0MA==","repeats":15},{"count":19500000,"lower_bound":"MTkwNTI0NA==","upper_bound":"MTk0MDI1MQ==","repeats":15},{"count":19800000,"lower_bound":"MTk0MzQ4NQ==","upper_bound":"MTk3Nzk3Mw==","repeats":15},{"count":20100000,"lower_bound":"MTk3ODQ2NQ==","upper_bound":"MjAwNDE1NA==","repeats":15},{"count":20400000,"lower_bound":"MjAwNTA1Nw==","upper_bound":"MjAyNjE3Nw==","repeats":15},{"count":20700000,"lower_bound":"MjAyNjUyNg==","upper_bound":"MjA1OTc0Nw==","repeats":15},{"count":21000000,"lower_bound":"MjA2MDM4MA==","upper_bound":"MjA4NjU0MA==","repeats":15},{"count":21300000,"lower_bound":"MjA4ODAwMQ==","upper_bound":"MjExODc1NA==","repeats":15},{"count":21600000,"lower_bound":"MjExODc2MQ==","upper_bound":"MjE0NzU1Mg==","repeats":15},{"count":21900000,"lower_bound":"MjE0NzcwNA==","upper_bound":"MjE3OTQ3NA==","repeats":15},{"count":22200000,"lower_bound":"MjE4MDExMw==","upper_bound":"MjIyMDE4NA==","repeats":15},{"count":22500000,"lower_bound":"MjIyMTA5Nw==","upper_bound":"MjI1NTY5Mg==","repeats":15},{"count":22800000,"lower_bound":"MjI1NTkwNg==","upper_bound":"MjI4MzE0MA==","repeats":15},{"count":23100000,"lower_bound":"MjI4MzIyMA==","upper_bound":"MjMxMjY1NA==","repeats":15},{"count":23400000,"lower_bound":"MjMxMzM5MQ==","upper_bound":"MjM0OTg5Ng==","repeats":15},{"count":23700000,"lower_bound":"MjM1MDMwNw==","upper_bound":"MjM3ODg3OQ==","repeats":15},{"count":24000000,"lower_bound":"MjM3OTg3Nw==","upper_bound":"MjQwNzIyMg==","repeats":15},{"count":24300000,"lower_bound":"MjQwODQzMQ==","upper_bound":"MjQ0NjQzMA==","repeats":15},{"count":24600000,"lower_bound":"MjQ0NjQ3MQ==","upper_bound":"MjQ3NjYwMA==","repeats":15},{"count":24900000,"lower_bound":"MjQ3NzM5Mg==","upper_bound":"MjUwNzcwNw==","repeats":15},{"count":25200000,"lower_bound":"MjUwODQ5Nw==","upper_bound":"MjUzNzI2Mw==","repeats":15},{"count":25500000,"lower_bound":"MjUzNzI5NA==","upper_bound":"MjU2MTc5NA==","repeats":15},{"count":25800000,"lower_bound":"MjU2MjU1Ng==","upper_bound":"MjU4NDExMg==","repeats":15},{"count":26100000,"lower_bound":"MjU4NDU2Nw==","upper_bound":"MjYxOTU3Mg==","repeats":15},{"count":26400000,"lower_bound":"MjYxOTk5NA==","upper_bound":"MjY1MzQ4Mw==","repeats":15},{"count":26700000,"lower_bound":"MjY1MzYwMw==","upper_bound":"MjY4MjkzNA==","repeats":15},{"count":27000000,"lower_bound":"MjY4MzI1MA==","upper_bound":"MjcwODQ5MQ==","repeats":15},{"count":27300000,"lower_bound":"MjcwODg0OA==","upper_bound":"Mjc0MjM5Nw==","repeats":15},{"count":27600000,"lower_bound":"Mjc0MjUyMQ==","upper_bound":"Mjc3NzQ1OQ==","repeats":15},{"count":27900000,"lower_bound":"Mjc3Nzg0OQ==","upper_bound":"MjgwNDU5MQ==","repeats":15},{"count":28200000,"lower_bound":"MjgwNjA1Nw==","upper_bound":"Mjg0MTM4Mg==","repeats":15},{"count":28500000,"lower_bound":"Mjg0NDQ0MA==","upper_bound":"Mjg4Mzg5Mg==","repeats":15},{"count":28800000,"lower_bound":"Mjg4NTgwOQ==","upper_bound":"MjkxOTQwMw==","repeats":15},{"count":29100000,"lower_bound":"MjkyMTg5MA==","upper_bound":"Mjk1MDQ4MA==","repeats":15},{"count":29400000,"lower_bound":"Mjk1MDkyMg==","upper_bound":"Mjk4MTg3Ng==","repeats":15},{"count":29700000,"lower_bound":"Mjk4MjQ3Mw==","upper_bound":"MzAxMTA4MA==","repeats":15},{"count":30000000,"lower_bound":"MzAxMjk1NQ==","upper_bound":"MzA0NTA1OQ==","repeats":15},{"count":30300000,"lower_bound":"MzA0NTQ4Mg==","upper_bound":"MzA4NzE0NQ==","repeats":15},{"count":30600000,"lower_bound":"MzA4NzI4MA==","upper_bound":"MzExMDAxOA==","repeats":15},{"count":30900000,"lower_bound":"MzExMjE1Ng==","upper_bound":"MzEzODg1Ng==","repeats":15},{"count":31200000,"lower_bound":"MzEzOTUwNQ==","upper_bound":"MzE3MDQ2NA==","repeats":15},{"count":31500000,"lower_bound":"MzE3MDU5Mw==","upper_bound":"MzE5MTM2Ng==","repeats":15},{"count":31800000,"lower_bound":"MzE5MjUwOA==","upper_bound":"MzIyMDI2NA==","repeats":15},{"count":32100000,"lower_bound":"MzIyMDc4Ng==","upper_bound":"MzI1MDA4NA==","repeats":15},{"count":32400000,"lower_bound":"MzI1MDY5Mw==","upper_bound":"MzI3Njk4Mg==","repeats":15},{"count":32700000,"lower_bound":"MzI3ODQwNA==","upper_bound":"MzMxNjA0OA==","repeats":15},{"count":33000000,"lower_bound":"MzMxNjg5NA==","upper_bound":"MzM0MTIwMQ==","repeats":15},{"count":33300000,"lower_bound":"MzM0MTQ3MA==","upper_bound":"MzM2NzcyNw==","repeats":15},{"count":33600000,"lower_bound":"MzM2Nzc2OA==","upper_bound":"MzM5NTQzMQ==","repeats":15},{"count":33900000,"lower_bound":"MzM5NTg2Nw==","upper_bound":"MzQyMTExNw==","repeats":15},{"count":34200000,"lower_bound":"MzQyNDExNA==","upper_bound":"MzQ1Mzg0NA==","repeats":15},{"count":34500000,"lower_bound":"MzQ1Mzg0NQ==","upper_bound":"MzQ4MTk5Ng==","repeats":15},{"count":34800000,"lower_bound":"MzQ4MjE1OA==","upper_bound":"MzUwNzA5NA==","repeats":15},{"count":35100000,"lower_bound":"MzUwNzg4OQ==","upper_bound":"MzUzNDM3Ng==","repeats":15},{"count":35400000,"lower_bound":"MzUzNDkzNQ==","upper_bound":"MzU2NjY4MA==","repeats":15},{"count":35700000,"lower_bound":"MzU2Nzc4Mg==","upper_bound":"MzU5NDUwOA==","repeats":15},{"count":36000000,"lower_bound":"MzU5NTI2NA==","upper_bound":"MzYyNzY0OQ==","repeats":15},{"count":36300000,"lower_bound":"MzYyNzg1MA==","upper_bound":"MzY1MDU3OA==","repeats":15},{"count":36600000,"lower_bound":"MzY1MTA0Nw==","upper_bound":"MzY3NTQ1NA==","repeats":15},{"count":36900000,"lower_bound":"MzY3NjU2MQ==","upper_bound":"MzcxMjg3MA==","repeats":15},{"count":37200000,"lower_bound":"MzcxMjk1MQ==","upper_bound":"Mzc0MDk3Nw==","repeats":15},{"count":37500000,"lower_bound":"Mzc0MTEzMw==","upper_bound":"Mzc2ODE2NA==","repeats":15},{"count":37800000,"lower_bound":"Mzc2ODYxOQ==","upper_bound":"Mzc5NTMxMQ==","repeats":15},{"count":38100000,"lower_bound":"Mzc5NjI1Ng==","upper_bound":"MzgyMTMyNw==","repeats":15},{"count":38400000,"lower_bound":"MzgyMjIwOA==","upper_bound":"Mzg0ODM4Ng==","repeats":15},{"count":38700000,"lower_bound":"Mzg0ODUwMw==","upper_bound":"Mzg4MDAyMg==","repeats":15},{"count":39000000,"lower_bound":"Mzg4MTExOQ==","upper_bound":"MzkxMzA3Ng==","repeats":15},{"count":39300000,"lower_bound":"MzkxNDM3Mg==","upper_bound":"MzkzNzcxOA==","repeats":15},{"count":39600000,"lower_bound":"MzkzODI2OQ==","upper_bound":"Mzk2MzkxNg==","repeats":15},{"count":39900000,"lower_bound":"Mzk2NDIwMg==","upper_bound":"Mzk5NDQyMQ==","repeats":15},{"count":40200000,"lower_bound":"Mzk5NTAwOQ==","upper_bound":"NDAyNDM4MQ==","repeats":15},{"count":40500000,"lower_bound":"NDAyNTU3OQ==","upper_bound":"NDA1NzMyOA==","repeats":15},{"count":40800000,"lower_bound":"NDA1ODM0Nw==","upper_bound":"NDA4OTg0OA==","repeats":15},{"count":41100000,"lower_bound":"NDA4OTg1OQ==","upper_bound":"NDExNjE2Ng==","repeats":15},{"count":41400000,"lower_bound":"NDEyMDQwOQ==","upper_bound":"NDE0Nzc4NA==","repeats":15},{"count":41700000,"lower_bound":"NDE0OTMxOQ==","upper_bound":"NDE5MTA0OQ==","repeats":15},{"count":42000000,"lower_bound":"NDE5MTMzMg==","upper_bound":"NDIxNzMwNg==","repeats":15},{"count":42300000,"lower_bound":"NDIxNzM4Mw==","upper_bound":"NDI1MDU3NQ==","repeats":15},{"count":42600000,"lower_bound":"NDI1MTQ2MQ==","upper_bound":"NDI4NjM0OA==","repeats":15},{"count":42900000,"lower_bound":"NDI4NzcxNQ==","upper_bound":"NDMxNjgxNg==","repeats":15},{"count":43200000,"lower_bound":"NDMxNzI5MA==","upper_bound":"NDM0NzQ3Ng==","repeats":15},{"count":43500000,"lower_bound":"NDM0NzYzNA==","upper_bound":"NDM4Njk1Mw==","repeats":15},{"count":43800000,"lower_bound":"NDM4NzU2OA==","upper_bound":"NDQxMzc5NA==","repeats":15},{"count":44100000,"lower_bound":"NDQxNDU5OA==","upper_bound":"NDQzODkyMQ==","repeats":15},{"count":44400000,"lower_bound":"NDQzOTg3OA==","upper_bound":"NDQ2NDA2NA==","repeats":15},{"count":44700000,"lower_bound":"NDQ2NDMwNQ==","upper_bound":"NDQ5Mzc5OA==","repeats":15},{"count":45000000,"lower_bound":"NDQ5NTAzOQ==","upper_bound":"NDUyMTYzMg==","repeats":15},{"count":45300000,"lower_bound":"NDUyMTc3OA==","upper_bound":"NDU0NjE4NA==","repeats":15},{"count":45600000,"lower_bound":"NDU0Njg4NQ==","upper_bound":"NDU3NTQ2OQ==","repeats":15},{"count":45900000,"lower_bound":"NDU3NTY0Ng==","upper_bound":"NDYwMjA1Mg==","repeats":15},{"count":46200000,"lower_bound":"NDYwMjU2NQ==","upper_bound":"NDYzMTczNA==","repeats":15},{"count":46500000,"lower_bound":"NDYzMjQxMA==","upper_bound":"NDY1NzgxNg==","repeats":15},{"count":46800000,"lower_bound":"NDY1ODM0MQ==","upper_bound":"NDY5MzA5OQ==","repeats":15},{"count":47100000,"lower_bound":"NDY5MzU1Ng==","upper_bound":"NDcxOTk2Nw==","repeats":15},{"count":47400000,"lower_bound":"NDcyMDY0Ng==","upper_bound":"NDc0Njc3OQ==","repeats":15},{"count":47700000,"lower_bound":"NDc0NzExNQ==","upper_bound":"NDc4MTY0NQ==","repeats":15},{"count":48000000,"lower_bound":"NDc4MjA3NA==","upper_bound":"NDgwNTk0NA==","repeats":15},{"count":48300000,"lower_bound":"NDgwNjIzMg==","upper_bound":"NDgzMzAwNA==","repeats":15},{"count":48600000,"lower_bound":"NDgzNDMzOQ==","upper_bound":"NDg2NjAxMQ==","repeats":15},{"count":48900000,"lower_bound":"NDg2NzYyMQ==","upper_bound":"NDg5ODE1NQ==","repeats":15},{"count":49200000,"lower_bound":"NDg5ODQ1OA==","upper_bound":"NDkzMDc0NA==","repeats":15},{"count":49500000,"lower_bound":"NDkzMTEzNw==","upper_bound":"NDk1NzY2Mw==","repeats":15},{"count":49800000,"lower_bound":"NDk1ODM3Nw==","upper_bound":"NDk5NDAyOQ==","repeats":15},{"count":50100000,"lower_bound":"NDk5NDMzNQ==","upper_bound":"NTAyNDk4OQ==","repeats":15},{"count":50400000,"lower_bound":"NTAyNjM2Mw==","upper_bound":"NTA1Njc4MQ==","repeats":15},{"count":50700000,"lower_bound":"NTA1NzAyNg==","upper_bound":"NTA5NTAwOQ==","repeats":15},{"count":51000000,"lower_bound":"NTA5NTUyNQ==","upper_bound":"NTEyMjA1NQ==","repeats":15},{"count":51300000,"lower_bound":"NTEyMjI4Mw==","upper_bound":"NTE0Nzc1Mg==","repeats":15},{"count":51600000,"lower_bound":"NTE0ODgyMA==","upper_bound":"NTE4NDk1NQ==","repeats":15},{"count":51900000,"lower_bound":"NTE4NTQ1OQ==","upper_bound":"NTIxNzUxMQ==","repeats":15},{"count":52200000,"lower_bound":"NTIxNzc1Nw==","upper_bound":"NTI0NDM1NQ==","repeats":15},{"count":52500000,"lower_bound":"NTI0NTc3Nw==","upper_bound":"NTI3NDc0OA==","repeats":15},{"count":52800000,"lower_bound":"NTI3NjU4Mg==","upper_bound":"NTMxMDUxNw==","repeats":15},{"count":53100000,"lower_bound":"NTMxMTgxOQ==","upper_bound":"NTM0Njk3NA==","repeats":15},{"count":53400000,"lower_bound":"NTM0ODA5NQ==","upper_bound":"NTM3ODE0NA==","repeats":15},{"count":53700000,"lower_bound":"NTM3OTE2MA==","upper_bound":"NTQwODQzMg==","repeats":15},{"count":54000000,"lower_bound":"NTQwODUzNg==","upper_bound":"NTQ0MjY5Nw==","repeats":15},{"count":54300000,"lower_bound":"NTQ0NTA4Mg==","upper_bound":"NTQ3NzMxNQ==","repeats":15},{"count":54600000,"lower_bound":"NTQ3NzMyNg==","upper_bound":"NTUxMDU0OA==","repeats":15},{"count":54900000,"lower_bound":"NTUxMDgyNA==","upper_bound":"NTUzNjQyMA==","repeats":15},{"count":55200000,"lower_bound":"NTUzNzMzNg==","upper_bound":"NTU2MjIyMw==","repeats":15},{"count":55500000,"lower_bound":"NTU2Mjk0Mw==","upper_bound":"NTU4NTMwOA==","repeats":15},{"count":55800000,"lower_bound":"NTU4NTUxOQ==","upper_bound":"NTYwNjc4Mw==","repeats":15},{"count":56100000,"lower_bound":"NTYwNzIzOA==","upper_bound":"NTY0MDIzMw==","repeats":15},{"count":56400000,"lower_bound":"NTY0MTU4Mg==","upper_bound":"NTY3NDgyNQ==","repeats":15},{"count":56700000,"lower_bound":"NTY3NTE0Ng==","upper_bound":"NTY5OTU3OQ==","repeats":15},{"count":57000000,"lower_bound":"NTY5OTcwNQ==","upper_bound":"NTcyNzU0Mg==","repeats":15},{"count":57300000,"lower_bound":"NTcyODAwMA==","upper_bound":"NTc1NzgzOA==","repeats":15},{"count":57600000,"lower_bound":"NTc1ODAyOA==","upper_bound":"NTc4OTE5NA==","repeats":15},{"count":57900000,"lower_bound":"NTc4OTY2NQ==","upper_bound":"NTgzMDAwNA==","repeats":15},{"count":58200000,"lower_bound":"NTgzMDQyMw==","upper_bound":"NTg1OTU5Mg==","repeats":15},{"count":58500000,"lower_bound":"NTg1OTg0OA==","upper_bound":"NTg4OTc3OA==","repeats":15},{"count":58800000,"lower_bound":"NTg5MDM0OA==","upper_bound":"NTkyMzYzNA==","repeats":15},{"count":59100000,"lower_bound":"NTkyNjE4NA==","upper_bound":"NTk2MjU4OQ==","repeats":15},{"count":59400000,"lower_bound":"NTk2MzAyNg==","upper_bound":"NTk4OTA2MQ==","repeats":15},{"count":59700000,"lower_bound":"NTk4OTE1OQ==","upper_bound":"NjAxMzg0MA==","repeats":15},{"count":60000000,"lower_bound":"NjAxMzg1NQ==","upper_bound":"NjA0MDYxMg==","repeats":15},{"count":60300000,"lower_bound":"NjA0MTQxOQ==","upper_bound":"NjA3NDg3NQ==","repeats":15},{"count":60600000,"lower_bound":"NjA3NTUyMQ==","upper_bound":"NjExMjMzOQ==","repeats":15},{"count":60900000,"lower_bound":"NjExMjM1OA==","upper_bound":"NjEzNzIyNQ==","repeats":15},{"count":61200000,"lower_bound":"NjEzNzQ1OQ==","upper_bound":"NjE2NTg2Mg==","repeats":15},{"count":61500000,"lower_bound":"NjE2NjYyNQ==","upper_bound":"NjE5MDg4Mg==","repeats":15},{"count":61800000,"lower_bound":"NjE5MTIyOA==","upper_bound":"NjIxOTIzNQ==","repeats":15},{"count":62100000,"lower_bound":"NjIxOTc4MQ==","upper_bound":"NjI0Njc3Mg==","repeats":15},{"count":62400000,"lower_bound":"NjI0Njc5MA==","upper_bound":"NjI3MzU3NA==","repeats":15},{"count":62700000,"lower_bound":"NjI3MzczMA==","upper_bound":"NjMxMjE3NQ==","repeats":15},{"count":63000000,"lower_bound":"NjMxMzAxMg==","upper_bound":"NjMzODY3Nw==","repeats":15},{"count":63300000,"lower_bound":"NjMzODk5OA==","upper_bound":"NjM2OTQxMw==","repeats":15},{"count":63600000,"lower_bound":"NjM2OTQ3NQ==","upper_bound":"NjM5OTA0MA==","repeats":15},{"count":63900000,"lower_bound":"NjM5OTIzOQ==","upper_bound":"NjQyNzI2Nw==","repeats":15},{"count":64200000,"lower_bound":"NjQyNzkwMw==","upper_bound":"NjQ1MzU4MQ==","repeats":15},{"count":64500000,"lower_bound":"NjQ1NDMwMA==","upper_bound":"NjQ4MzEwNw==","repeats":15},{"count":64800000,"lower_bound":"NjQ4NDU5OA==","upper_bound":"NjUxNjkyOA==","repeats":15},{"count":65100000,"lower_bound":"NjUxNzE1OQ==","upper_bound":"NjU0MjI3NQ==","repeats":15},{"count":65400000,"lower_bound":"NjU0MjI4NA==","upper_bound":"NjU2OTIxOA==","repeats":15},{"count":65700000,"lower_bound":"NjU2OTU0Ng==","upper_bound":"NjYwMTMxOQ==","repeats":15},{"count":66000000,"lower_bound":"NjYwMTc1OQ==","upper_bound":"NjYzOTM1Mg==","repeats":15},{"count":66300000,"lower_bound":"NjYzOTk5Mg==","upper_bound":"NjY2NTcyMg==","repeats":15},{"count":66600000,"lower_bound":"NjY2NTkyOQ==","upper_bound":"NjY5MTQ5Ng==","repeats":15},{"count":66900000,"lower_bound":"NjY5MTUwNQ==","upper_bound":"NjcyMDA0Ng==","repeats":15},{"count":67200000,"lower_bound":"NjcyMDE2Mw==","upper_bound":"Njc0ODUyOA==","repeats":15},{"count":67500000,"lower_bound":"Njc0OTM1NA==","upper_bound":"Njc4MTM4NA==","repeats":15},{"count":67800000,"lower_bound":"Njc4MjI5Mw==","upper_bound":"NjgwNTE4Ng==","repeats":15},{"count":68100000,"lower_bound":"NjgwNTQ1OQ==","upper_bound":"NjgzMjkzNw==","repeats":15},{"count":68400000,"lower_bound":"NjgzMzA2MA==","upper_bound":"Njg2NDg5Ng==","repeats":15},{"count":68700000,"lower_bound":"Njg2NjM5Ng==","upper_bound":"Njg5NTI1NQ==","repeats":15},{"count":69000000,"lower_bound":"Njg5NTU4Mg==","upper_bound":"NjkyNjg5MA==","repeats":15},{"count":69300000,"lower_bound":"NjkyNzEwMw==","upper_bound":"Njk1MDgzMw==","repeats":15},{"count":69600000,"lower_bound":"Njk1MTY2NA==","upper_bound":"Njk3NzI2OQ==","repeats":15},{"count":69900000,"lower_bound":"Njk3Nzc2Mg==","upper_bound":"NzAxMzk1MQ==","repeats":15},{"count":70200000,"lower_bound":"NzAxNDEyNA==","upper_bound":"NzA0MTQ1Nw==","repeats":15},{"count":70500000,"lower_bound":"NzA0MjcwMA==","upper_bound":"NzA3NTM2NA==","repeats":15},{"count":70800000,"lower_bound":"NzA3NTQ1MQ==","upper_bound":"NzEwMTM5Nw==","repeats":15},{"count":71100000,"lower_bound":"NzEwMTk0MA==","upper_bound":"NzEyOTg0MQ==","repeats":15},{"count":71400000,"lower_bound":"NzEyOTg1NQ==","upper_bound":"NzE1ODQzMw==","repeats":15},{"count":71700000,"lower_bound":"NzE1ODU2OQ==","upper_bound":"NzE4NDAzMA==","repeats":15},{"count":72000000,"lower_bound":"NzE4NDAzOA==","upper_bound":"NzIxMjY0Ng==","repeats":15},{"count":72300000,"lower_bound":"NzIxMjk1MA==","upper_bound":"NzI0MzI5NQ==","repeats":15},{"count":72600000,"lower_bound":"NzI0MzQ2OA==","upper_bound":"NzI2OTIxOA==","repeats":15},{"count":72900000,"lower_bound":"NzI3MDA4NA==","upper_bound":"NzI5NDIzMg==","repeats":15},{"count":73200000,"lower_bound":"NzI5NDQ3Mg==","upper_bound":"NzMzMDA3MA==","repeats":15},{"count":73500000,"lower_bound":"NzMzMDMzMA==","upper_bound":"NzM2MDMwMQ==","repeats":15},{"count":73800000,"lower_bound":"NzM2MDU2NA==","upper_bound":"NzM4NDk0Mg==","repeats":15},{"count":74100000,"lower_bound":"NzM5MDUzNw==","upper_bound":"NzQxMjcwNQ==","repeats":15},{"count":74400000,"lower_bound":"NzQxNDE5OA==","upper_bound":"NzQzOTk0NQ==","repeats":15},{"count":74700000,"lower_bound":"NzQ0MDU5MA==","upper_bound":"NzQ3NjA3Ng==","repeats":15},{"count":75000000,"lower_bound":"NzQ3NjI2OQ==","upper_bound":"NzQ5OTY3NQ==","repeats":15}]},"cm_sketch":{"rows":[{"counters":[36943,35644,37378,37164,36978,36539,36947,36871,36177,37517,37251,37081,37609,36273,36001,37005,36582,36293,36091,35181,37284,35620,36652,37987,36822,35931,36734,35337,38096,36936,37601,36602,35719,37445,37845,36881,35492,36898,36327,37696,37086,35226,36497,37019,35657,35494,37634,35874,35981,36236,36942,35775,36587,37397,35808,33630,36926,35648,35415,36892,35778,36024,36035,35540,37164,37171,36661,36903,36364,35367,34757,37064,36495,37917,36613,35418,36535,35939,36531,36368,36537,37213,37859,37810,36701,37410,36001,36896,37364,37780,36291,35553,37779,37274,36939,35782,37395,36341,37246,36777,37252,35954,36645,35808,36986,37422,38231,36897,36380,37109,36795,36464,36547,36268,36524,37161,36649,36913,36503,37895,35352,36041,36695,36189,36835,37759,37148,36262,35766,36578,36674,37001,35847,36292,36961,37589,36813,35420,36805,36240,37032,36791,37329,35745,36602,35920,35664,36797,36096,36961,35418,37388,37573,35370,37719,37200,36898,37894,35619,36859,36540,37117,35110,37296,36882,37300,37431,35002,37098,36406,37059,36958,37573,35691,37105,36067,37335,37089,38257,37078,35838,36445,35502,37295,35471,36742,36835,36270,36431,36379,38026,38015,37946,36251,36243,36787,36449,35645,36480,35580,35601,36502,36494,37721,36677,37705,37297,37274,37728,35680,35629,37325,36934,37442,36744,36835,35127,35569,36765,35346,36272,36763,37711,36695,36753,37004,36565,36819,36653,38219,37599,35848,37131,37303,37133,34690,37274,37148,36538,38013,36742,37345,35064,37997,37854,36970,36110,37686,36354,35597,35727,38332,37642,35206,37216,35033,36374,37744,37275,36596,37650,37278,35207,35224,37305,36663,36179,36441,37094,37928,36833,35993,36447,36617,36881,37365,36645,35201,36317,36208,37279,39144,35665,36830,36521,37000,37075,35557,36708,35903,35254,36181,36426,36691,36047,36511,36033,37025,36146,35412,36319,35630,37054,37148,36726,36031,38023,37222,36858,37199,35359,35100,35924,37741,37536,35810,37100,36627,37289,36049,35884,36974,35956,36115,37183,35601,36416,36559,36810,37653,35987,35383,37373,36198,35814,36113,35582,37726,34725,36487,36615,36539,36833,36159,36240,36691,37018,36516,35970,36050,36768,36475,35556,38385,35253,37587,37205,36592,37254,38554,36159,36337,36601,36393,35784,37103,36767,36176,36298,36682,37064,36457,36357,35487,36465,35974,35530,37447,36381,37269,37807,35581,35926,37159,37279,35306,35804,37436,35278,35365,36424,35487,36198,37333,35419,35892,37347,35439,35464,35750,36502,35506,36235,37076,36467,37558,35617,35727,37175,35309,37044,36689,37153,36404,35867,36154,36556,36268,37162,38613,37185,35996,35847,36083,36708,37977,36654,34905,36724,36405,36233,37659,36682,37468,36737,35919,36888,38012,37134,36058,36901,36188,36815,38135,36951,38466,36500,36402,37522,36744,36991,37219,35642,37819,35014,36591,37029,38112,36579,36260,35727,37582,37625,36874,35363,36546,36168,36880,37144,37002,35246,36324,36877,36846,37699,35902,37072,36495,36606,36474,36911,35519,36599,37083,36768,36168,36794,37852,35910,37535,35884,35470,36827,36838,36959,36507,35987,36973,37609,34883,35868,36470,38952,38425,36241,36738,37073,35048,36208,33872,36630,36812,34936,36864,36054,36687,37343,35170,36425,36154,36627,37970,35103,35775,37200,37307,36221,38392,36605,37680,37209,36045,36969,36262,36724,37234,35443,35434,34709,36055,34612,35433,37878,35333,36483,36848,35518,36715,38334,37488,36271,37533,36781,36458,36178,35997,37170,36469,36045,35653,36741,37665,36916,37255,36983,37280,36878,36918,36290,36896,35525,37275,36303,36818,36528,36060,36108,36524,37678,36733,36384,37018,36269,36850,37820,36600,37359,37093,37272,37249,37700,35064,37084,38352,37000,35621,36122,35732,36529,35670,36730,37329,36503,36553,35617,35413,36115,36332,36737,35940,35216,37090,37091,38358,36322,36281,37640,38496,36415,36800,36313,36860,35576,35942,35400,38058,35118,38849,36486,35973,37815,36093,36358,36695,36497,36658,36548,37638,36039,37062,36927,37331,36785,37530,35763,37183,35118,38107,35615,36279,36348,37419,35789,36478,37065,37113,37020,36443,35566,37939,36780,36247,35584,37126,35992,35585,36123,35250,36130,36841,36275,37095,36464,35914,35881,34947,36878,37098,36905,35241,38452,36183,36225,34009,36482,37204,37366,35740,37049,36164,36242,37154,37027,35871,37144,38608,37064,37673,38068,36496,37071,36862,35705,37038,37756,38540,37770,37240,37021,37886,37170,35375,37092,36874,36483,36296,35550,35934,36584,36433,36870,37142,35117,36645,37892,36788,36298,37961,36705,37271,36237,35189,37575,36336,35810,36500,35684,37344,36669,37459,36915,35910,36441,36969,36295,34973,36556,36843,37269,36964,37212,35115,37014,35694,38430,36150,36260,36159,35697,37206,37472,35069,37193,36402,35924,38327,37029,35946,35629,36524,38120,36058,37535,36387,36974,36896,37568,37511,35836,36613,37142,35989,36659,36057,35679,36903,36156,35860,37297,37721,36114,36470,36173,37275,36931,38134,37237,35537,38679,36704,37726,37420,36736,37635,36955,38512,37002,36943,36163,35622,35613,37094,36767,36472,36628,37217,35057,36916,35371,38047,35993,36476,36481,37460,35606,34902,36906,34401,37379,36888,36988,35744,37028,36037,37704,36942,36724,36053,36726,36299,37802,37862,37365,35986,35438,36295,36037,38152,37568,36841,36728,36392,36906,36250,37594,37556,35335,35400,36926,37394,37795,36669,37093,36984,36467,37534,36960,36896,36513,36021,37318,36362,38191,36817,38365,38607,36492,38134,36336,36888,37425,37077,36555,37299,35675,37049,36432,35197,35700,35350,37753,36358,38057,36610,36782,37034,36907,36931,38092,37112,36809,38431,36220,36488,35659,37377,38257,37398,36242,36413,36182,38374,36954,36193,36821,35741,37543,38194,35869,37375,36922,37076,37757,35789,36644,35648,36806,36707,36005,37390,36338,34918,37491,36865,36035,36184,37357,35465,34800,36834,36954,36187,38080,37457,37208,36413,37383,36439,35894,37829,36077,37113,36606,36864,36814,36866,38167,37459,36876,37023,37531,34607,37280,38375,35368,36446,37141,36415,36263,35105,36617,36972,35552,36818,37043,37129,37564,36976,36200,36017,35663,35822,35421,36797,37025,36029,38217,36876,37525,37469,33612,38057,36766,37934,36318,36984,35878,37713,37789,36700,37095,35669,37946,36713,36966,36400,36515,35492,36086,34188,36774,35324,37578,36556,36294,35378,35434,36579,36774,35034,36458,35489,35318,36826,36817,36011,35555,37523,37151,36421,35427,36768,36738,35269,37188,35291,37153,37553,38240,36864,36871,36086,37196,36450,35821,35984,36536,37301,35514,35617,36071,36624,38341,36333,36715,38135,36043,37408,37913,35712,36997,36528,36435,37786,37317,37079,36761,38090,37522,36149,37643,36424,35220,35719,35906,37114,36591,36305,37200,36747,36363,36021,37441,37540,38130,38212,36506,35800,35902,36588,36376,36647,36765,35081,35128,35628,37394,37732,36994,35408,36948,36438,36214,35560,36402,36623,35277,37337,36356,36883,35994,35838,37264,35941,36080,36547,35643,37055,36090,36074,37673,37105,37696,36187,37239,36267,36837,36767,37798,36591,36557,36846,38389,37034,36459,36334,35807,36622,36692,36859,35912,36186,36318,36806,37051,36131,36888,35585,38024,36564,35154,36511,36996,36631,38024,34633,35553,35650,36642,37205,36687,35585,36977,35704,36420,37419,36905,35171,37533,38242,36517,36836,37353,35431,37456,36894,38120,36685,37326,36312,37055,35364,36030,34778,36405,36687,36904,38887,36367,37584,36128,37151,36009,37931,37233,37085,36301,36029,36296,37719,36215,37619,35832,34906,36488,35791,36584,37174,36077,37457,38671,37349,35482,37575,36152,37605,36753,37359,35995,37475,36473,35973,36106,36718,37515,36446,38261,36282,35534,36866,35750,38683,36717,36292,36367,36731,37462,37315,36276,35460,35971,36489,36124,36630,36329,37757,35445,36157,37174,36953,35485,38080,36046,37065,36393,35432,36766,36357,36818,37575,35176,37906,36551,36531,37113,34849,35524,35322,37166,37087,35793,36099,35634,37724,36985,37718,38028,37068,36690,37659,37308,36975,36716,36117,36521,36998,37630,38345,36674,37587,38342,37531,37347,35638,37256,36385,36113,35094,36415,36141,37107,37263,35434,37898,37662,36973,36102,36443,36639,37362,36511,37614,36330,36153,36759,34127,35493,36310,35825,35974,37829,35011,36725,35103,38628,36446,36755,37051,34998,37541,37875,35970,36955,35875,35253,37374,37485,35893,36309,37634,36003,37148,36699,37485,36284,36115,36098,36279,36786,36068,37111,36543,37387,35553,36235,37363,37379,36725,35942,36659,37665,35981,37184,35146,35632,38520,37087,38018,36192,36491,36176,36240,36583,37163,35774,36983,36251,36496,35550,36876,36619,37459,36630,37555,36714,36330,36285,35906,37542,35877,37684,36242,37199,36353,37201,37683,35939,35770,36478,36404,35986,37163,36312,36479,36729,34889,37607,36270,36191,36440,37220,36726,36851,36808,35959,36120,34931,35722,37526,34672,34970,37641,36069,35946,35371,36952,37365,35051,37383,35861,37420,36727,37062,36041,35491,36241,35459,36250,35515,36294,36336,35089,37433,36177,37562,35842,35906,38199,36954,36581,35764,37081,37142,37406,37380,36183,36501,37078,36483,36295,36536,37637,36121,35114,34569,37023,36607,36767,36697,36242,36853,36838,37155,35962,36865,36255,37215,36834,35896,36594,36621,36890,36874,35786,34869,35962,36569,36568,36930,35102,36714,36867,36594,36166,36299,35408,35461,36052,37187,37028,36090,37356,35581,36884,36667,35822,35634,36296,37287,36435,38379,35601,36552,35261,34575,35628,37638,35788,36325,36464,35869,35194,36313,36223,36350,37068,37810,37528,37304,35757,36837,36917,34436,35733,37850,37130,37723,35984,35872,36689,37007,36915,36269,36027,35505,38052,36919,36769,38372,36881,37858,34955,34690,37171,37552,37052,36099,37279,36556,37684,34680,37639,36639,36439,37258,36114,37332,36735,36399,37840,35996,36730,37494,36017,36964,35697,37200,35723,36922,36120,37476,36794,35598,37043,36170,35088,36192,36154,34515,37895,39143,37382,36223,36917,36340,36376,37303,36717,36665,39079,36872,36490,37126,36559,37474,37469,37949,36376,36991,36575,36710,34960,36309,35472,35514,36585,36827,36808,36536,36992,35777,36236,37172,37159,36928,36332,34649,37546,37000,36320,35727,37993,36393,37046,35895,37421,35984,36535,35566,36406,36000,37507,36027,36972,36057,35338,36030,36740,36006,36949,36077,36934,36885,35827,37495,35087,36133,35478,36786,36862,36609,37452,35567,36849,35999,37427,35691,36286,35629,36340,35730,37450,35962,36968,35898,37818,36460,36929,37031,37072,35653,35539,35201,35454,36899,37125,36449,37198,36728,36702,36565,37121,37624,36453,35074,37919,35879,35908,36557,35817,35320,37080,38040,38332,37196,36659,36744,36420,37396,36841,36699,37659,35985,37207,35172,37298,38560,36740,36556,37493,36231,35646,37535,35698,37091,36027,37056,36326,36883,37425,36002,37182,36448,36305,37666,37008,36138,36307,35989,35704,35487,35033,36141,36921,36883,36456,37061,36945,36799,36820,38626,37755,37297,36217,35773,37119,36705,37233,37112,35447,37038,37965,36432,38125,35844,36826,38100,36372,35868,36643,37494,38282,37520,35863,36439,36663,36862,36420,36714,34854,36632,36313,38115,35203,36092,38031,35486,37247,37382,37322,37558,37422,35035,36030,37131,34931,36540,37179,37307,36059,36616,35744,36250,36670,35818,35352,38850,37677,37784,37776,37261,36098,36662,35732,37697,38817,37171,36553,35496,36002,36442,38216,36335,34788,36234,37161,36636,36062,36222,35656,34933,36495,35848,36076,35916,36182,35676,36581,36430,37003,36634,37326,37195,36242,35415,36365,37090,36162,37235,35694,37394,36106,34585,37532,37759,37818,35762,36551,37075,35862,37697,36108,38392,36960,35814,35880,36648,36614,36698,36851,36411,35421,36468,36621,34874,36922,35855,35583,36892,36680,37110,36053,36218,37075,37198,35668,35931,35895,38628,38019,36944,37771,36860,35729,37343,36422,35395,36723,36607,35997,37670,37449,36446,36831,37027,35526,36133,37793,36779,36649,35848,36489,37550,36657,35952,36442,35420,36599,36339,36559,36158,37078,36708,36588,36686,37175,37219,36968,36369,37245,36656,37034,37233,37939,34898,37637,37111,37106,36632,34696,35797,38096,37151,36413,36292,36496,36645,38414,36344,37041,38405,37502,37395,36312,36864,36419,37494,36352,36635,37394,36967,35899,37622,34641,37236,36729,37281,37297,36539,36969,36425,36330,35983,36477,36357,36462,35998,36160,37373,36952,37471,35740,37001,37188,36978,36948,37013,36415,36661,36460,37284,37608,35755,37552,37609,35544,36779,36674,37589,36536,35328,37151,37444,35215,37592,36265,37758,35892,37223,37379,35145,37171,35139,36720,37795,36125,36980,37574,36101,37087,37661,36789,36682,38415,36572,37859,36213,33389,37211,36774,36982,36495,36202,37037,34908,37226,35858,35301,38740,37010,35705,35915,36462,37637,35672,37026,36624,36600]},{"counters":[36373,36948,35948,36345,36904,36796,36268,35480,37000,37369,35970,37953,37246,35963,35701,36322,35746,36006,37458,33894,36959,37134,36500,34896,36959,35857,35587,37840,36909,36254,37785,36428,37076,36486,34622,37342,36834,35761,35405,35709,36207,36418,35846,36432,36322,36685,36201,35797,35333,35674,36650,35219,37026,36775,35220,34980,37936,36266,36738,37006,35638,36769,37360,36849,35408,37355,37201,36112,35602,35877,37118,35561,35985,36182,37181,36367,36817,36808,38357,37018,35531,37280,37633,36079,36555,36008,36836,37053,37196,35020,37578,36697,35802,36839,35676,35638,36994,35716,36303,36072,36494,36257,37149,37316,35543,36374,36828,37647,34788,38083,37075,35983,36133,36892,36976,36203,35441,38047,36756,38078,37379,38224,36933,37226,37768,37462,37393,35650,36896,37352,35394,36147,37249,37321,36550,37823,35952,34872,36766,36914,38230,37218,37157,36082,36789,36442,36465,37408,35672,36577,36913,38486,37171,35783,35405,35481,35648,34962,36709,35105,37015,37514,36831,36352,36585,37350,35414,38229,37378,38216,36712,37928,35427,37522,38559,37057,37148,36416,35195,37585,37348,37494,36331,36352,36861,37916,35889,35944,37073,36510,37259,37607,36837,36944,35091,36607,36355,36665,35857,35756,37189,35975,37503,35277,37232,36655,36426,36782,37149,37615,35447,35351,35886,37609,36520,36671,36875,35954,36650,38530,36605,36344,36141,37288,36803,36637,38264,35345,37105,37332,36988,35871,34778,36150,35479,35606,36599,37500,36713,37557,36981,36340,35423,37141,36853,36636,35581,38049,36499,37558,37250,35212,37189,35785,35962,36856,36468,36217,35903,37224,36994,36278,36668,35126,37141,36075,37696,34967,36933,35865,35727,36834,38377,36177,36133,37470,36101,36072,36435,38095,36326,36376,37644,36162,36559,36571,37607,35576,35860,37046,37303,35957,35647,36576,38139,36439,37570,35177,36462,35224,36005,37256,37647,38030,36345,37066,36839,36601,35972,35259,37916,37157,34662,37391,35935,36678,37824,35617,37279,36830,37946,36213,36681,39330,36325,37309,36665,36143,37458,36568,36130,36731,35667,36109,34811,36536,35505,36585,34776,36296,37548,36405,36485,37053,36466,36115,36232,37621,36568,37168,36917,36216,36037,35715,36540,35869,35216,35837,37081,36394,36761,36786,35807,37201,36554,35980,36296,37649,36757,37129,36244,36679,36457,36518,37093,36742,37396,37117,35602,36235,35854,38546,35559,36556,37667,35881,36212,36759,36426,36068,35880,36953,37176,37420,36898,35628,37495,35040,36315,35989,36890,36823,36155,35768,37177,35363,37781,35373,37234,35393,37228,36017,36088,36640,35483,36351,37467,36467,36132,36640,36799,38302,36193,36942,37240,35526,37494,35964,36876,36527,37489,36070,37101,36159,36341,36046,36888,37036,36271,34960,36149,35675,38379,37791,37402,36488,37107,36530,37225,36287,37444,37892,35680,36025,36989,36410,36291,36670,37608,36265,35291,36371,36882,36242,35341,37942,36214,36248,37034,36933,37112,36785,35804,36846,36107,35853,35020,36806,37068,37279,36237,36149,36116,36892,37057,37051,36717,35570,35969,36690,37499,37211,36276,37782,35923,36199,37787,36988,35777,35994,34734,35685,35573,37418,36408,36769,36473,37525,36461,36347,35802,36494,36764,36497,35631,37697,36119,36394,36832,36648,36925,36912,36374,37199,36467,36872,36639,34129,36690,38209,36288,36912,37566,36924,36721,37509,37215,36235,37348,35764,37296,36931,37462,36926,36851,36818,35989,35432,36509,35944,37096,35802,36225,38150,37234,36522,37176,36596,36986,37173,37304,35863,35794,35798,36935,36444,36497,36252,35598,37216,36686,34536,35970,36614,35714,37323,36466,36849,36356,35825,36822,39032,37384,34771,34499,35689,37799,36853,37182,36187,37315,37083,36575,35925,36040,37223,35915,36254,36459,36709,36124,37015,37227,37062,36305,36566,37959,37965,35390,34446,37126,36754,37097,35918,36908,36297,36494,38329,36631,36853,37386,36996,36920,36876,35319,36816,36550,35991,35073,36177,36505,36428,36222,36659,36149,36810,36803,37799,35679,37139,36185,36105,36545,37347,36043,37851,37289,36549,35572,37017,36554,36095,36303,36295,37513,36457,37369,35045,36017,37667,36062,37240,37068,37673,37305,36611,36629,37023,38154,36381,35917,37437,36269,37292,37651,37328,35446,36958,35285,37853,36938,35807,37807,36640,36556,36203,39289,38048,37257,35126,36634,36410,37068,35965,36822,38127,36558,36228,36227,36182,36806,36202,35803,37645,36750,36537,36684,35909,36751,37483,36561,35807,36720,37203,36649,36419,36007,35821,37170,38318,36874,36653,36414,36381,36536,35926,36645,37540,37004,36029,38551,36123,35975,37869,36781,36239,37061,36390,35577,37662,37180,34955,36139,36249,37083,35504,37873,37074,35013,35669,37717,37987,37383,36593,35836,36079,38136,35655,36236,37092,37866,35980,37119,36684,36182,35898,34986,36682,35378,37778,37896,36760,36190,36067,35165,38738,36646,36671,37441,36467,37569,38061,36291,34421,36896,36928,36106,36201,36872,37014,36321,35369,36909,36888,36057,37055,36466,37382,36370,35756,37285,36007,35449,37382,36640,37374,37178,37946,36782,36605,35644,37437,36697,38364,37557,35297,36325,36606,37703,37350,36815,36719,37407,37633,36819,38224,37490,37621,35726,35537,37913,37002,36396,36774,35134,37355,37236,36388,37098,37207,36591,38430,36403,35923,37497,36995,37964,35435,38407,35696,36168,37138,35955,35568,36579,37485,34835,37601,37306,36025,36616,35661,37332,37884,35815,36753,36689,37264,36114,35889,36211,35588,37346,36669,37389,35327,36387,36787,37084,36951,37427,36949,36897,37227,34772,37038,38683,36693,35651,37501,37504,36339,35993,37808,36358,35759,37082,36467,35303,36527,37127,36408,36426,35732,35825,36124,36429,36542,36439,36027,36018,36458,37064,36816,37650,37704,37071,35133,36621,36584,37913,37111,35909,36835,38316,37236,36309,37279,36788,34588,37557,37304,36344,36607,35417,37649,36590,37365,36876,37078,37345,36151,37324,36980,37036,36747,34497,36466,36143,37129,35708,37467,34955,37231,35883,37037,37612,36096,35752,37294,37476,35862,36337,37369,36068,37194,36739,36314,37559,37060,37411,37469,36468,36287,38168,37190,36251,36179,36367,36269,35915,36166,36361,36849,36152,36885,37746,35888,36426,36592,37488,36506,37849,37360,38218,36636,35345,36635,36430,35787,35171,37260,37025,36100,35685,36297,37660,37118,36092,37173,36534,37104,36971,36832,35194,37218,35433,35953,37044,37079,37234,37622,35279,36602,35799,35399,36345,36793,35620,36049,36221,35652,36259,38017,37084,37686,36268,36597,36191,37772,35539,36905,36423,35235,36068,36303,36987,36514,35154,37079,35232,35935,38514,37013,37252,36779,36558,34946,36441,38306,35935,36940,36468,37162,37393,36399,37983,36215,37377,36524,36267,35823,37054,36234,36972,36640,36175,36319,35038,36360,36529,35947,37774,36616,35735,36154,36793,36863,36456,37610,35700,36433,34892,36674,36419,35394,35903,36909,36701,36025,37610,35494,36559,36186,36543,36703,37451,36341,37053,35742,35985,36617,36922,37633,35215,36020,36859,37212,36329,36775,36789,36208,36288,36404,35869,36003,37877,36781,36762,36329,37189,36572,35113,35979,37998,36765,36770,35708,36456,35438,36297,36792,35310,37676,36106,37094,36737,37376,36680,36773,37702,36362,36066,37039,36639,35937,37194,37430,36279,35851,34986,35420,36409,36804,35021,36814,36793,37003,35532,35437,36388,36395,37145,37814,35836,36986,35241,36328,36275,36463,37597,35839,37909,37119,36568,36233,36935,35665,36802,37587,37292,34801,36745,36253,36499,37508,36464,36824,36734,35836,35991,36725,37221,35920,37866,36417,35925,36612,38018,35620,36012,36129,36797,37613,34970,37495,35412,36160,36292,37234,39016,36648,38183,36434,37335,36374,37280,37000,38274,37010,36682,37022,36669,35888,36747,36556,34908,37779,36362,36657,36204,35900,36895,36695,38878,37828,36541,36707,37112,37391,36846,36497,36259,37239,38177,37483,36679,36345,35789,38420,34833,35839,38042,37386,35932,36239,37305,36927,34970,35953,35451,36851,36532,37024,37066,35797,36669,35822,38062,37315,36277,37613,36240,35817,36032,36174,37080,38316,36470,35534,36302,35751,36410,36947,37599,37404,36354,37012,36821,35386,36703,35739,36519,37370,37291,36662,36922,35996,36390,38060,37330,37977,36640,35538,37084,35580,37693,38090,36595,36697,36574,35847,35538,37313,35726,36282,37175,36568,35970,35692,35016,36553,36154,37080,36886,36030,36547,37205,37409,37235,36376,36697,35051,36583,36530,36572,37240,36432,37051,36048,36766,36787,36283,37128,36139,37201,37001,35872,36151,38125,37259,37234,36513,34938,36114,36913,35977,36567,36578,36686,36407,37186,35970,37175,35650,35402,37772,36816,36740,35570,35880,37437,37790,35317,37137,35965,37029,36941,38317,37113,35352,36982,37230,36606,35521,37182,35753,36390,37528,36289,36952,36488,35672,35072,36326,36966,37028,36875,36754,36153,37768,37053,37037,38047,36014,36276,34452,36855,36760,35849,36570,37497,36285,35902,37313,37097,35800,37043,36941,36665,38734,38595,36939,36288,37008,35544,36670,37945,36039,35922,36134,36024,38264,34551,35774,36391,36121,35415,36199,36347,37755,37479,36433,37320,36445,37031,36178,37053,35099,36432,38440,36899,36359,35921,37740,37937,37441,35300,37111,37119,36234,37849,36128,36888,37551,38175,36138,38132,36816,35751,36323,36293,36673,35945,37310,36342,35784,36508,37750,37787,36653,35770,35977,36208,36531,36550,37912,36871,35784,36103,37994,35765,36091,36303,35949,36594,36617,35796,35850,35610,37178,37277,37303,36891,38629,38506,36174,36761,35868,37017,35927,36303,36944,36726,36717,35948,36748,37376,36637,37792,37504,36762,36233,35317,37028,36762,36097,36886,36197,37290,36560,36879,36850,36901,36201,36853,36098,37146,36999,36645,37478,36021,35779,35998,34886,36207,36955,37311,36685,36515,39094,36434,36624,36193,36736,36720,36472,36660,35547,37414,37544,37321,35826,37545,37521,36606,36034,36516,36658,37479,35680,37028,36285,37372,36534,37011,37024,37733,37455,38181,37373,35182,36461,36362,36893,39123,37021,37088,37186,36973,36720,36762,36741,37044,37342,35703,37391,35858,37357,35035,36034,36591,36424,35894,36068,35820,37353,37258,36232,35858,37631,35613,36034,37145,36495,35920,35891,35524,36197,34843,38295,36676,36694,37026,36891,36439,37333,36942,36453,37652,37427,37430,36860,38319,37155,35952,36466,36729,36811,37471,36098,37020,36083,36370,36253,36746,36812,36690,35356,35603,37462,37360,37206,37598,34677,35380,35332,37041,36452,37103,35574,36825,37309,36776,36679,35995,35601,36467,37709,36641,37094,37028,36198,38040,37376,36258,35986,36228,37230,36772,36595,35862,36579,36848,35593,36842,36163,36642,37558,36916,34982,36409,36534,36191,37843,36693,36049,36669,36171,36585,36143,37232,36816,35952,37346,38617,37577,38719,35606,36369,36862,37242,35686,37872,35280,38017,35350,36482,36340,35742,36892,35665,36027,38998,33914,36132,35574,35966,37785,38014,36105,36953,35874,35058,35821,36242,35755,36815,37166,36112,36547,37575,37858,37111,36624,37410,36788,37583,35744,36279,35948,35918,36458,37548,35769,37628,36523,36628,36137,38344,34917,36807,37298,36685,36358,36539,37028,36194,38218,37242,37404,39007,36899,36882,37148,36175,35033,37824,37078,36772,35851,36040,36042,36430,37449,37214,37911,35315,37022,36027,36555,35274,36483,36394,36079,36244,36084,35918,35200,36525,37142,35574,37687,37431,35438,36683,36096,37444,36626,35091,37491,36372,36733,35785,37392,36630,38562,36345,37587,36004,36315,35864,36852,37290,38144,36846,36375,35890,36289,35028,35849,36328,37482,36769,36844,37293,37062,35855,36655,37036,37619,37317,37935,37426,37136,37306,36084,36724,36612,36218,36333,35647,37581,36292,37446,37943,36608,37848,38089,38040,35866,36434,35131,36526,36502,35828,36166,35242,36716,35307,35976,38088,36398,36928,36060,36139,36383,36648,37138,35722,35970,37686,36627,37495,36533,36992,34562,36679,37743,38015,35282,37240,37118,35952,36556,36801,36842,38069,38634,36689,37518,35849,37654,35134,36725,35894,36745,36815,36819,37291,36235,36611,35213,36004,37166,37073,36379,34659,37041,36955,36290,34892,36789,36883,36197,36141,36194,36053,35949,36998,37811,36414,36666,35966,36644,35901,37081,36904,36878,37377,36917,37061,37064,37062,36894,36544,36707,37091,37365,35696,37587,36254,36269,37068,36098,35579,37720,35930,36850,35697,36999,35743,35897,37023,36126,37381,37569,36039,35164,36514,36871,35652,36482,36482,37684,37019,34673,35977,36520,36010,36314,37486,36711,36287,36846,36298,35503,36762,35619,34897,35559,36072,37064,37560,36668,36539,37401,36543,36715,37577,36874,36646,36682,37307,35977,37744,36477,37366,37024,35940,37547,37469,36730,35222,36637,37380,36052,37733,36948,36599,36545,36600,35864,37488,36437,36527,37097,36670,35339,38032,36101,35600,36485,37255,37770,35887,38002,37521]},{"counters":[36805,35903,37058,37144,35627,38009,34500,36607,35654,38131,38034,36262,36965,37226,35506,36828,37578,35893,35131,35341,35260,36489,36694,36845,35480,35873,37054,36261,36570,35528,36567,36983,35646,36768,36296,36728,36328,36126,37193,36785,37173,37661,38312,36794,37091,36584,35430,36244,36401,36287,38195,36436,36384,35820,35778,36764,36520,36393,35426,37343,36093,35733,36655,37256,37368,35406,35906,36514,36506,37230,36775,36221,37182,37590,36129,35755,36505,36371,36037,37594,36568,36108,37454,36579,36200,37515,36104,36227,36539,37774,38164,36905,35803,37038,36950,36688,35847,37165,36597,36129,35153,36648,37303,36920,36429,35739,36333,36575,37472,36639,36862,37598,37538,35632,35430,37099,36463,35657,35496,36540,34609,36993,36865,36459,37974,37361,37305,36248,37105,36310,36783,35950,36546,35317,36481,36218,37010,37602,36452,36851,35390,35305,38150,35391,36647,37555,36009,37089,36378,36675,37374,35752,37083,37513,36065,37078,38276,37665,37129,36369,36081,37084,36358,36590,36822,36113,36819,37713,35277,35945,37335,35338,38400,37117,36809,35732,36278,36166,35828,36871,37009,36365,37122,36395,36764,38020,37592,36169,35613,36663,36953,37576,36981,36625,36856,37479,37648,36628,39355,37160,36783,36473,36288,37084,35576,36874,36689,35935,35248,37235,36711,37395,36565,36984,36675,36102,38559,36277,36588,37769,37204,37038,36087,35695,37259,36223,36761,37363,37669,35283,36751,35966,35277,37367,36085,36591,36546,36563,37072,35841,35991,36868,37011,35758,36358,37650,36683,36440,36776,37524,36202,37638,37286,36716,36082,37049,36709,36847,36359,36443,34938,37390,35797,36944,36161,36663,34505,37850,37384,37558,36960,37050,36268,38136,36065,37271,37072,36384,37406,36479,37473,37418,35438,35168,35584,35629,35944,37022,35480,36972,35915,35968,37198,36109,37661,36899,36168,36749,35436,36893,35187,36748,38288,36926,37015,36243,37144,35941,36750,36644,35783,37351,35757,36659,37116,35573,36339,36349,36926,36816,37303,36040,35669,36131,37564,35850,36626,37407,36447,37617,37098,35644,35647,37139,36153,37051,36043,36462,36325,35513,36436,36842,36016,35625,35822,37516,35469,35880,36842,35842,37472,37686,38188,35452,36034,36378,36032,36123,36658,36259,37833,35174,37206,37937,36331,38836,35835,37324,37691,36500,36248,36734,34350,35589,36925,35972,36561,36586,34996,35492,36630,36080,36674,36491,37083,36134,35493,36031,37335,35674,37924,38151,36192,36513,36574,37362,36248,36791,36079,36024,35568,36793,35672,35337,37262,37266,36524,36098,36739,36688,38331,36133,35001,37967,37443,35590,35715,37275,35836,36357,36484,37328,36705,36140,38072,37711,35868,36349,37032,35597,36266,36566,36768,34550,35791,35319,36875,36405,36898,37478,36131,37973,36890,36372,35181,35750,35847,37263,36756,36622,37871,36359,36408,35570,36138,35690,36417,37964,38016,35793,37023,37071,37357,34720,36289,36612,36114,36409,36866,36415,37564,37463,39669,35830,36194,37214,37977,37953,36495,36836,36532,35209,36283,36009,37231,38097,37066,35488,37237,36798,36517,36750,36361,37033,37302,36196,36620,34521,36780,36385,37135,36246,37024,36044,37931,36687,37331,37183,37879,38116,36214,36841,36336,36992,37554,36945,36551,37418,36900,35604,36397,36419,36699,36203,36371,36325,36102,35921,35710,36300,35775,36891,35788,36793,36505,36344,35928,37385,36977,38053,37535,36713,35387,35170,37401,37331,36181,36955,35866,37321,35659,36392,37214,35616,34865,37369,36474,36986,34812,37234,36778,37677,37085,35988,36512,35842,36089,35407,36679,35974,38312,36692,35413,36784,36455,35755,36179,36851,37184,37627,38380,37227,36255,36719,37444,35657,36829,36271,38086,35168,37881,35162,37864,35593,37274,35750,37397,35755,37519,38139,37062,37864,37711,36229,37132,37171,35816,37286,37651,35838,36582,36018,37174,37265,35847,36294,33860,37633,37833,35199,36977,36614,35310,36427,36982,37049,36798,36774,37241,36271,36723,37813,36918,35434,37436,38036,37870,36135,37887,34104,37214,35682,35814,36064,38160,35737,36172,37322,38069,35651,35666,36575,36236,36284,36243,36095,38112,37266,35451,37909,35600,35847,36309,35242,36294,36497,35577,36273,35847,34943,37509,37183,38044,37322,35550,35906,37904,37832,35679,36276,36937,36925,35186,36584,36649,36064,36462,36996,35746,35803,36710,37020,34802,37008,36581,36276,37379,36483,35880,37592,35887,36586,37916,36899,38179,36333,36679,35290,35741,35676,36222,38165,35839,36619,36141,36830,36591,36639,36332,37584,35869,36678,36653,37003,35963,36656,37222,36510,36413,36909,38128,36607,36569,36403,36246,35040,36263,35666,36907,36345,35275,36569,37812,36941,36778,36709,36003,37845,36946,37834,36419,36571,36947,38276,36444,37555,36727,35384,36874,37107,36660,35269,37426,37057,37203,37199,36785,37004,34527,37435,36434,37271,36627,36084,37755,36938,36846,35177,36931,35334,36913,36914,36772,36180,35345,37635,35702,38309,37148,37069,37777,36885,35904,35246,37686,36764,36830,36707,36522,37293,35755,37449,36533,36927,36835,37211,38674,38319,36876,36620,36572,35703,35035,35582,36397,37929,36879,35992,36598,35662,38201,34328,37157,37322,36470,35875,37946,37729,36013,36628,36909,36777,36315,37961,37426,36920,36210,36737,37182,36531,37446,37831,38876,37001,36065,36755,36517,37720,35885,36556,36951,36800,36070,37597,36256,35859,34950,36472,38494,37212,36745,36058,35498,36709,35613,37638,36411,36396,35150,36823,37951,37348,37743,36540,35648,35263,36225,36502,37602,36104,37053,36042,37416,37352,35262,36146,37348,36802,36559,36807,36120,36229,36919,36065,35314,37307,36479,35325,36866,36595,35817,37828,37190,35366,36584,35388,35467,36570,37013,35817,37000,35945,37453,35657,35329,35746,36474,36427,35612,35550,36012,38409,35406,35671,34631,35698,35929,36356,37076,35945,36245,36118,37366,36101,35784,35977,37291,36872,37996,37074,36488,35102,35952,36380,35778,35492,37641,37200,36494,37012,36651,36326,36610,36838,36630,36964,37645,36712,36902,36063,37362,38572,37470,36664,37407,36977,36476,35943,37115,36447,36891,37857,37041,35655,36755,36422,35802,36599,36398,36316,37161,37336,36434,34785,34968,37474,35126,37708,36610,37351,36891,37555,35295,37370,36789,36496,37233,35687,37448,37857,36403,35962,36598,35927,36174,36159,37521,37940,34994,36258,36573,37481,36057,37326,36873,36980,36985,37961,36782,35965,36722,36575,37094,36520,36065,37092,37560,37477,35932,36836,38006,36377,36023,36920,36869,37313,37568,37542,36315,36661,36103,37240,35639,35508,35320,34953,37663,36688,38359,36885,37043,36952,37817,36066,36408,35090,36064,36491,37598,35919,36825,36717,37051,37170,36557,38154,38665,37088,37378,35522,36787,35779,36735,36511,37539,36314,36172,35825,35609,36793,36351,36553,37562,36547,37186,36701,38457,36966,38955,35703,36562,37930,37277,37277,35898,36799,35714,36845,35601,36389,35993,35953,36635,37988,37097,35999,37081,35806,36313,36746,36390,36229,36121,38033,37164,36717,37180,36014,34857,36829,35555,37512,35401,36914,37002,36848,35517,37400,37255,35588,36600,36251,36211,36031,36728,35660,37405,37205,37053,35333,36597,36311,37608,37963,36500,36689,35672,37217,36796,37998,37719,35644,36162,37650,37302,36862,37184,37269,37361,36513,37226,36516,35660,36554,37859,36135,36049,36160,36442,36076,35739,37566,37015,35133,36008,36657,36513,37045,37708,35125,35236,37249,35185,35428,37265,37216,35804,36826,36160,35901,37048,37391,36512,36584,35135,38615,35965,37590,36274,36996,37388,37446,35708,35833,35714,36292,34176,37779,38697,37007,37694,35751,36136,37656,35896,36838,37420,36809,36583,38004,36607,36026,35235,37538,37136,36757,36190,37055,36209,36290,37934,36160,35781,36082,36723,35492,35808,37303,37786,37270,35425,37199,37769,36663,38684,37088,36756,35321,37382,36770,36604,36181,36732,36459,35992,38301,36901,35553,35782,35488,38145,35665,36838,37777,37016,36459,36964,36125,36290,36172,36607,37095,37049,37292,37756,35858,37088,36326,37462,36530,37290,37243,36774,35612,37208,36228,36190,36394,34806,36835,36770,35950,36684,36154,38054,36942,37631,36346,36348,35635,35918,36181,36397,37671,37502,36823,38921,36691,36425,36484,36025,36361,36899,36209,37873,37001,37696,37449,36969,36446,35062,38286,36174,37037,37071,37182,36621,36206,37127,36585,36032,37078,35940,36560,36232,36959,38390,37016,37833,36685,37646,37850,37097,35399,37568,37025,35699,35929,35770,37100,36293,35821,37019,37474,34863,36906,37519,36435,36404,36787,36774,36677,36818,35370,37128,36597,37022,36654,35364,36221,36210,37167,37520,36824,35863,36972,37251,37019,37046,36100,36718,36404,36789,38173,36867,36014,35909,36075,36756,37022,37141,37705,36898,36012,35874,35973,35125,37095,36923,35295,36272,36261,36510,35367,37201,36184,36613,37111,36217,36426,36047,36159,37097,36239,36625,36755,35996,36717,34855,35294,37852,36464,38160,36356,36389,37060,37437,36989,36054,35816,38463,35822,36198,36903,37323,37045,35510,36558,36220,35979,37743,36995,36120,35923,36287,36672,35603,37780,36560,38499,36529,36681,36907,37285,36854,37108,36892,36979,36593,37064,36534,36221,36708,37358,37108,36652,35614,37707,35116,37853,37343,36092,37881,35779,37310,35700,37722,37566,36200,36893,36045,37628,35817,37981,37090,37874,37434,35592,37409,37212,36794,36252,36274,37464,36827,36997,37244,35490,36217,36979,37300,35725,36140,36802,36389,36292,36239,36833,35869,36281,36253,35961,36603,36043,38121,36370,36842,35235,37057,35561,36511,37326,36416,36605,34855,35360,37460,35878,37380,37175,35905,35818,36222,37672,38056,38291,35507,38415,35576,36607,37564,36601,36287,37708,37159,37588,35957,35401,34397,35697,36892,36270,36106,35251,36581,36358,35305,36933,36681,37822,36355,37768,35587,37542,36688,37314,37132,36884,37062,36149,36773,37557,36827,37520,37253,37877,35109,36168,33707,36177,35919,37023,37655,37121,36834,36356,36951,36221,35712,35971,36449,35825,37636,35769,36957,35822,37976,36269,36106,35932,36325,37118,35920,37489,36535,37693,36466,37921,36271,37549,36565,37015,36664,37038,35872,36564,37725,37336,35461,36615,35823,36779,36321,37097,36775,35966,36296,36749,35284,37045,36413,37262,35234,35960,36520,36173,39363,36382,35987,36359,36773,36449,36495,36962,37391,36275,35889,36360,35731,38347,35838,35574,37491,36762,36959,37024,36300,37347,37775,35756,36489,38233,35867,36348,35735,35547,38051,36736,36395,35633,36360,37199,36253,37326,36053,36041,36507,36185,36479,36295,34611,36009,35011,36234,36231,36563,37144,37426,35711,36774,36735,35835,36889,36124,36778,37646,37567,37743,36278,36972,36201,37190,37290,37410,36020,35804,37711,35356,37509,36026,36978,35587,37244,36087,36945,35874,36939,36496,36918,37308,36812,36984,36574,36580,37240,37799,37622,36531,37107,35910,35904,36088,38965,36290,35950,35955,36458,35984,37108,37897,36493,37064,36661,36065,36991,35440,36947,36701,36515,36459,34837,38317,36233,36115,38252,35208,38324,36193,36738,36048,37210,37643,36693,37501,35974,37065,34851,37223,36674,36481,37210,37423,37054,36625,36539,36774,37992,35387,37191,37732,37336,35858,34697,36758,36429,37023,37001,36903,37410,35950,35249,36659,35425,36509,37411,36857,36637,35807,37824,36301,36792,37120,36469,36382,37000,37216,36930,36557,34672,36374,36863,36213,36567,37170,36526,37387,36507,36475,35798,36793,36506,35800,35971,37328,37357,35672,35799,37625,35727,36284,35020,37133,35703,37117,35679,35851,37004,36870,36087,36936,35086,36626,37228,37479,37079,36540,36542,37239,37569,36722,36207,35635,35868,38841,37519,36396,35311,37742,35918,36345,37278,36706,36657,36459,36698,35826,36300,36335,36419,36783,35600,36881,36159,36763,36671,37628,36712,36348,37233,36874,36249,37151,37848,36671,36022,36466,36400,36829,37634,35382,36595,37574,37502,36363,36408,37154,35983,37093,36328,37204,35399,37670,36932,36981,37651,35521,36723,35668,35559,35536,37821,35480,37513,36310,34396,37521,36368,37727,37707,35295,36642,36190,37050,37041,38076,37071,36600,36015,36570,36289,36150,36388,36907,36209,35252,35999,37774,35980,36568,36489,35970,36912,37628,35559,36335,39098,37284,36979,36854,35845,37323,36789,35800,37011,38213,35681,38468,35859,38154,37770,37224,35340,36270,36475,37072,36167,36966,36575,35790,36065,37194,36010,36322,36180,37003,36066,37284,36003,37551,36889,36818,36140,37568,35903,35860,36336,35625,37584,35899,37096,35099,37198,37105,36679,36324,35890,36707,38730,37421,35976,36230,37344,35356,36224,36944,35323,36448,36729,35541,36224,37360,36115,36359,35876,36732,35960,37339,37066,35189,39159,36910,35547,36025,36430,35849,37025,36905,35820,36359,36240,36060,35964,36516,37173,36773,36551,35300,36270,38113,38200,36392,36598,36857,37024,37281,36877,36085,38151]},{"counters":[37548,35768,35495,36836,36203,37296,37491,36301,36681,37168,36995,37496,37353,36578,36518,36889,37024,36955,36362,36071,37474,37392,36024,36206,37478,36609,37874,37022,35545,37397,35228,37023,35892,37253,35949,34695,36420,37705,35667,36001,35519,37564,35957,36302,37199,38262,36776,36837,35817,36528,36140,35743,35952,36949,34800,34735,37528,36666,36341,37609,37063,36132,36306,37108,37583,35798,36474,37186,36268,37065,37083,37822,37298,35685,34980,37268,37620,36573,35722,35868,35782,36518,35651,35866,36756,36223,35496,36788,35783,37298,35234,36033,37641,36793,35977,36893,36049,36950,36410,36069,36031,36593,36445,37582,36416,34922,36448,37254,37436,37421,36292,37571,36401,36318,38084,37465,36902,35740,35808,37124,36982,36063,35599,35889,35024,35641,38703,36283,35915,34642,36066,36392,37292,36633,37892,37767,37839,37762,35991,37429,36433,37311,36356,36091,34757,35274,37376,36842,36877,37360,36960,36783,35481,35830,37073,35145,36657,36904,36386,36430,36542,35550,37086,37296,36372,36262,36333,37158,37122,35412,37056,36815,35614,35435,36822,37781,37068,35583,35238,38345,36100,38431,35982,36923,35521,36718,36134,37984,35565,37525,35764,37300,36227,37468,36988,37577,37386,35596,37569,35901,37346,37040,36427,36532,36882,37236,36212,35495,36441,37248,35357,37845,37112,36226,35729,36234,36583,36923,34836,36781,35704,36749,37639,35265,35846,35723,36534,36786,35885,37295,37248,36829,35474,36445,37349,36978,36154,36654,36337,37433,36818,36104,36542,36699,37089,35498,37440,35995,36114,37627,36584,36985,36959,36891,35609,35913,36164,37502,37585,37370,36629,36875,36642,36874,35819,37066,36502,35925,36790,35047,35314,35881,36251,36984,37055,38088,38159,37264,36567,36509,37119,37171,37061,36843,36123,36415,38209,34642,35672,36467,38505,37234,36385,36813,37259,35640,36307,36583,36139,37875,34822,35602,36119,37400,36509,37369,38398,36808,36148,36413,36438,37433,35295,37823,36122,37269,37534,36367,37372,35454,36983,37201,36558,36263,37105,36728,37189,37384,36618,35774,35167,35722,34793,37318,35904,37780,36486,36162,36408,36497,37821,37289,37962,37347,36686,36701,36017,35362,35206,36805,37269,34783,36246,35017,36405,36883,36828,36022,37057,37426,37909,35660,35701,36563,35484,37208,35891,36505,36450,36691,36369,36953,36025,34899,36057,37744,36215,38748,35397,37461,35749,37716,36522,35952,36029,38389,38212,36298,35805,36536,36138,36793,36809,37686,37552,36039,36220,35881,35592,37922,37100,36140,36447,36174,36502,35430,35822,37442,36837,35961,37010,37224,34620,35505,36039,37306,36566,35221,36496,36772,36919,36280,37521,35661,37513,36309,37116,36122,36924,35873,37039,36923,37113,37843,37551,36051,36106,36562,35720,35921,35958,35914,35084,36598,37509,34160,37717,37135,35934,35487,36759,35466,36514,37163,37237,36487,36478,36454,35923,36494,36897,36341,37331,35311,37000,36672,35874,35966,37264,36384,36727,36278,35522,36593,35948,36168,37704,36323,36159,36468,35952,35974,37976,36478,35927,35495,36571,36582,36586,35970,36386,36868,36922,35548,35287,35344,35510,36855,37460,37551,34840,36522,35916,36855,36401,33809,37995,36449,35436,36815,36627,37600,36075,36468,36661,34743,36610,36971,37406,36703,36312,36789,36713,36255,37959,36008,36917,37248,38013,36394,36298,36186,36529,36443,36258,37193,36080,37391,36519,36835,35638,36251,36815,36981,38399,35924,35466,35691,38012,36000,36822,36064,36310,37974,35959,37917,37309,36143,39077,34894,37441,36900,37522,36827,38143,35925,35973,36568,37895,36073,36419,35822,35778,36195,37344,36385,37149,36014,36148,36838,36491,36772,38271,37755,37352,36969,34612,35730,36699,36609,36132,36256,38003,35844,36235,37661,36319,36941,36526,35960,37384,37100,36336,36070,37175,37487,37060,35981,36031,36955,35304,35862,37195,35380,38964,35327,36407,36419,36740,35109,36423,36271,36006,37255,37230,35900,37276,36141,35878,35144,35753,36227,36789,36678,36922,37957,37159,37687,36839,35468,37786,37814,35248,35015,36255,36551,34920,36066,37408,35732,36261,35514,36490,37189,36955,35671,36105,37504,36021,36991,35160,36708,36025,36332,36413,36327,37058,36244,35224,37525,36442,35669,37817,36550,35536,35276,37915,36598,36983,37008,37099,36075,36612,37386,37551,37932,37068,37065,36545,37546,37257,36283,36364,36061,37680,37179,37555,37552,37616,36289,36639,38109,36087,36718,36330,37360,35747,34960,36795,34495,36141,35057,36930,35707,37558,35498,35252,35360,38170,35358,36680,37550,35280,37456,35686,36818,37421,36533,36358,35755,36403,37251,37880,36586,36783,34988,37530,36843,35480,36470,37076,37381,35431,36955,36442,36959,37343,35617,37040,36889,34809,37102,36765,36632,35287,35257,38137,35880,36760,35455,37271,36608,37705,38135,36973,35539,36263,36462,37310,37310,35323,35788,37571,36913,38579,36927,38159,36191,36960,36306,36911,36832,37525,34295,37626,39121,36281,36354,36594,36752,36764,34036,37269,36232,35850,36874,35849,37500,35053,36721,37258,36806,36494,34833,36498,36623,36389,35525,38453,36576,36861,36839,36888,36847,36506,38233,37963,36803,36587,37141,36542,36616,37575,36656,37564,37395,35816,37363,35925,38177,36084,36001,37018,36543,37860,36926,36751,37946,37460,37173,36687,36128,36585,36160,37779,36797,35665,37328,36561,35151,35651,37033,36528,36785,37069,38823,36819,37761,37097,38024,36899,37360,36648,36323,36269,37202,38037,36640,35928,36308,35423,36049,36989,36612,36471,37439,37733,37474,37962,37567,37100,37678,35979,37244,37029,38107,36851,37263,36338,36390,36552,37229,36720,34921,36371,36209,36413,38191,35333,36558,37111,37222,36312,36647,36796,37257,37306,37586,37406,37591,37054,36718,35535,35507,36980,36715,37487,36513,36239,37568,37352,37773,36120,36906,37116,36065,35594,37959,37054,36275,35870,35591,34987,37141,38935,37973,36407,36591,36967,36621,35908,37259,37410,36862,37223,37476,37859,35928,36802,35817,36770,35024,37255,37131,36753,36634,36189,36765,36733,36933,35873,38401,36997,36087,35997,35571,37634,37951,36684,36449,37117,37564,35959,36301,36173,36276,36746,38095,36497,35113,36876,36094,35868,37824,37903,35314,35754,36457,36404,37606,37891,37416,37187,37309,36838,34660,36454,36685,35330,36120,37394,37640,36968,35969,35453,36462,35798,36996,37296,36597,35336,36510,36037,36763,34727,37657,37762,37599,37361,35863,36621,37606,35264,35540,36264,37184,36421,37438,36584,35488,36309,35718,36437,37115,38327,35851,36636,36051,36915,36555,36824,35639,35986,37262,36650,36675,37468,36093,36421,37779,36367,36176,36147,36195,37507,36103,35624,36197,37271,36282,36649,35547,37352,36113,37559,36492,36350,37972,35740,35464,35971,37276,36041,37077,37025,37799,37849,37005,36232,35431,37624,37144,37925,35096,35898,38170,38048,37381,37552,37910,37872,36732,36095,35219,35761,36256,37432,37223,36171,37713,35221,36768,36854,35771,37551,35919,37748,36923,36581,37717,35421,36422,36014,37831,35682,36766,36393,37356,38055,35993,38114,37000,37019,36634,36100,36338,37478,36720,36021,36177,36253,36515,37214,37153,36294,37069,36139,36892,36183,36449,38396,36566,37250,35766,37549,34898,35538,36906,37309,38185,35851,35087,36492,35425,36033,36973,36088,36472,35795,36452,36510,35644,35765,38167,37220,35750,36386,38000,37516,35407,35909,36337,35916,36257,35099,37530,36711,34964,35408,36173,36579,36308,34774,36176,38020,37507,37152,35552,35685,36311,36100,37927,35996,36335,37257,37265,36445,37551,36830,36914,36859,36385,38479,35795,35617,37962,36295,37527,35511,35440,36308,35704,36773,36675,36376,36704,36801,35566,36557,37664,35378,36147,36736,36981,37417,36543,36896,36594,36639,34754,35812,35775,36806,37333,36670,36924,35787,36459,37814,37037,37078,36052,36357,37233,36835,36771,36920,35016,36741,38025,37286,38399,35665,36335,36229,37022,36532,36221,36588,35243,36821,36210,36211,37111,36959,35692,36493,37797,38009,36653,37050,38020,36130,37153,36290,37131,36407,36251,36876,36408,36390,36656,35712,36324,37915,37640,37003,35648,36732,36912,37755,38249,36285,36896,36615,37414,37372,37364,37182,35987,35378,36679,37184,36535,37041,36440,35093,36434,37188,37248,36304,37737,35460,36978,37296,35556,37232,35352,36466,38429,36266,35775,38128,35299,37514,35252,36890,36867,37692,35771,36156,36391,36364,36959,35711,37527,36886,37147,36447,35479,35467,35651,35400,36616,34769,37285,36885,36684,37089,36989,38412,36425,35838,37112,36040,36316,37364,37543,37294,36738,35825,37299,37429,36462,37988,38374,36436,37040,36504,35893,36657,34862,36371,37933,35935,36878,36402,36722,36102,37504,35636,36272,36835,36448,37393,35330,36094,36256,35509,36190,37006,35252,37148,37300,36063,37248,36617,35956,37776,36900,36197,37015,36762,36602,35486,35708,34877,36384,36695,35685,36733,36061,36549,36759,36202,35948,34805,36818,36510,36871,36516,36980,36057,36505,38360,35615,35558,36285,35977,36631,36557,38222,35925,37201,36737,36324,36209,37514,37607,37136,36075,36512,36745,37610,35623,37394,36674,36978,37475,35480,35853,36864,36648,37022,36352,35037,36236,36986,37432,36259,35790,36016,36484,36848,37981,36901,35433,37733,35656,37159,37311,35765,36925,35066,35393,37203,36390,36023,37231,37882,35802,34964,37138,37738,36119,36876,37046,36258,36224,36391,37014,36307,36352,37453,35636,36536,37879,36441,36605,37305,38404,37020,36441,36435,35262,36267,36387,36545,37243,37219,35672,37654,36080,37480,36863,36687,36261,38128,35596,35419,37794,36119,37193,37720,37361,36169,37644,36929,36252,37380,37379,35771,36085,36461,36031,36632,36182,37328,36450,37333,36758,36598,37503,36106,36093,36503,36494,36753,35445,37327,35854,36779,35981,36450,37064,37179,36871,36649,38508,37893,36857,37466,35531,37643,36452,36540,36700,36423,38342,35980,36244,37917,35003,39214,37661,37369,35640,37511,36912,36641,36326,36048,37311,37150,37136,37307,35440,36594,36884,35928,37811,35530,36900,36464,37269,36903,36585,35739,36125,37480,35837,36174,35498,36724,37135,36661,36130,36380,36497,37497,38077,37305,35513,36829,36991,35800,38003,36392,36495,37511,36396,36150,36980,36700,36422,35788,36342,36621,36823,38673,36357,35905,37086,36603,35989,38529,37442,35611,35702,36035,35888,36482,37254,39965,36408,36898,37561,38492,37196,36699,38036,36561,35121,37107,36889,35786,35240,35337,37720,36309,36187,35661,36147,36680,37266,36752,37139,36302,36847,35291,36851,36989,37270,37079,37804,36070,37435,37707,35525,36874,36689,36148,36395,37261,37232,36141,36202,36100,35620,37525,37383,36164,36102,36586,36473,35409,36205,36339,36904,37112,35916,36466,35904,36669,36606,37864,37416,35576,34945,36044,35120,36773,37068,36753,35563,35342,36811,37412,36795,37537,35636,36402,36924,36571,36911,36268,37266,35413,38379,36459,37899,37895,36704,36879,37801,36733,37377,35607,37337,36598,36736,37132,36247,36932,36423,36928,36001,37925,36405,37279,36319,36573,35432,36139,35604,36338,35752,35535,34777,37420,36055,36398,37159,36599,38578,36758,37264,37399,36516,36652,36172,38456,37528,37070,35794,36882,37626,36884,37610,36885,36675,36368,36759,37138,36107,36270,35895,36418,37492,36964,34982,37814,37527,37413,36795,36274,35847,37573,35800,37182,36940,34981,37399,37957,37551,36030,37240,37475,37553,36414,35689,36613,36601,36815,36336,37661,36059,35866,36687,37418,36750,36194,35942,36862,36707,36497,35830,36075,39384,36531,36486,36970,36442,36674,35576,35920,36287,36160,36241,37057,35713,37759,37013,37613,35964,36701,36990,34612,36065,35864,37995,36375,36407,36284,35876,36508,36458,37525,35695,36816,37832,36960,36638,35692,35817,36958,36496,37471,36262,38244,36537,37010,36860,36605,36360,36981,36003,36824,36917,36851,36567,35988,36967,35949,36388,36664,37000,36746,38309,36775,38434,35977,36877,35878,37566,35975,35994,35695,36249,37676,35630,37558,35390,36124,37106,37784,36737,37908,36276,37481,38436,37312,37352,35745,37170,35339,36600,36272,36790,36291,36613,37452,36869,35925,36104,37139,36526,36599,37094,37409,37067,36025,36355,36488,36584,37858,35676,36591,36852,39449,36311,36271,37612,36608,37156,36847,37674,35940,36468,36696,36963,37434,35962,36348,35916,38301,35682,36845,35378,37167,36906,34967,37793,35406,37257,35925,36128,38358,36228,35212,37034,36359,35721,36562,36165,36513,36936,36832,35653,36847,35970,36908,36747,35430,36877,36124,36128,36320,37591,35869,36973,37184,34918,35368,36960,35892,37398,37170,36720,35747,35434,37752,35052,36631,37884,36488,37370,36660,36688,36028,37160,38190,36080,36476,35597,36752,37087,37637,36178,36081,36594,36373,38024,37367,36965,36265,35248,36577,37054,35192,35937,37933,37829,35717,36795,36535,35573,36874,37559,36842,37114,35401,36080,36312,37490,37072,36807,35650]},{"counters":[36210,36573,36596,35784,36323,36867,36830,36180,36741,37122,36428,36786,35958,35974,37132,36549,36609,36399,36535,36381,36996,35967,35714,36702,35598,36374,35836,38016,35922,36669,35999,36654,36459,36911,36787,36750,36278,36891,36986,36870,35784,36175,36013,36086,36834,36170,37682,36138,36258,35771,36826,36776,36863,38070,35389,36757,37526,37113,36318,36434,37467,36655,37961,36748,36565,38648,36341,35686,36013,37644,34768,37275,36647,37327,36799,35945,37819,37109,37226,36516,37471,36914,36723,36931,36402,37383,36799,36093,37129,37295,36296,36375,37141,37107,36075,35801,36813,36880,36518,36618,36386,37043,37197,38167,36778,36115,37513,36716,35744,35847,37370,37640,36519,36222,36276,35168,36594,36752,37291,38234,36689,36208,38069,35585,36041,36417,34983,37204,35738,37375,37789,35640,37817,37152,36808,36068,37732,36972,36558,35908,34125,36206,37412,37215,37298,36816,36552,36838,35388,35896,36246,37222,37809,36040,36834,37468,36642,34847,35855,36575,37161,36153,35697,37665,36527,36108,37036,37589,37936,37047,36669,36819,35359,36205,37539,36921,36931,37865,36797,37204,36658,35372,37240,36909,36468,37258,36512,36311,35540,35684,35636,37289,36015,36033,37356,36753,37054,36240,37087,36032,35774,36436,38599,37483,37324,36911,36913,37198,35887,36255,38133,35991,35685,36547,35663,35726,37351,36389,36925,37842,37958,36004,36301,36700,36634,36398,36084,35656,36076,36919,36869,35371,36738,37115,35717,35982,37499,36063,38154,35349,34809,36910,36056,35444,37782,36281,36993,35784,37293,36385,36341,36459,38552,35396,36270,35833,35511,36129,35708,36999,36522,36289,36538,36156,38001,36393,36224,36027,36793,37026,38021,37457,35371,37083,35269,37487,36859,36162,36681,36659,36143,36768,36765,35302,36355,37032,36750,36171,37156,35792,36012,36669,36884,36676,36654,36318,36221,36231,36842,38152,35496,36808,36012,37467,36145,36282,37326,37079,34124,36845,35043,35738,36561,36783,38524,34301,38441,34891,37705,36804,37710,37592,36015,36627,35669,36334,36267,36112,35351,36049,36559,36592,36995,36953,36922,38020,37248,36425,36734,37325,36357,38021,35361,38083,37900,37878,36610,36440,36236,37165,36396,35932,37134,35341,36784,36772,36065,36895,35693,38455,38479,35872,36435,37078,37624,36918,36027,37152,35856,36160,37201,37338,37538,34636,37249,37671,35711,36394,36800,36417,36347,37455,36951,36599,37201,36760,37618,35274,37799,37321,36865,35178,37521,37441,36999,37601,36102,36732,36758,37044,35216,36848,36644,36161,35791,35454,35400,37372,36559,36698,35007,37281,36386,37228,35819,34850,36347,35130,36152,36679,37698,35828,36390,37374,36160,35519,37331,35298,36706,37065,36442,36499,36551,35252,36549,37509,35095,35892,35635,36326,36077,36270,36942,36314,38279,37242,37337,37440,36550,36511,37895,36074,36659,35592,36811,36179,36753,36742,35460,36266,37698,37480,38404,35913,36265,36815,36915,35502,36949,38005,36710,36107,38183,37203,35638,37879,36678,36629,35130,35954,35793,36925,35901,35889,36136,37370,37682,35785,38806,35564,37151,36672,36603,36449,36382,36847,36796,37492,35601,36016,37459,38441,36271,36117,36508,36060,36303,36135,37621,36098,35745,36235,36559,37306,36567,35807,36946,36490,37063,35999,36851,35448,36110,36481,36980,37287,35855,36429,36116,37254,36292,35899,37228,37072,37465,36031,36582,36745,36077,35101,37164,36596,35928,36858,38333,36125,34883,36530,35474,36771,36295,37552,35925,36547,35740,36392,35960,37490,36550,36909,35622,37208,37230,37174,36577,36024,35278,37003,34133,35753,36794,36401,35230,37663,36391,37907,35681,36988,36205,36714,35517,36578,37617,37200,37561,37909,36732,36195,36121,36755,36581,35079,37378,37502,36776,36874,35079,37321,36945,36395,37424,36236,37611,35605,37865,37292,35076,35977,36957,37271,36995,35212,37790,36889,36789,36481,36997,37956,35761,37927,36825,36217,37210,36078,35814,37043,37088,37415,38055,35874,37787,36167,36441,36098,36516,35958,35465,35465,37300,36550,35868,36031,37069,35191,36185,35897,36845,37127,38188,36288,36844,36432,35977,35915,36982,36049,36723,36827,35725,35892,37923,37285,36785,36817,37392,37256,37365,36005,36568,37389,36145,37470,37280,36852,35606,35621,37192,35329,37721,37580,34992,38139,37730,36642,36560,37345,35662,35361,36414,37454,35652,37023,36686,35585,36657,36369,35898,35363,34904,35732,36812,36406,36382,36520,36299,37321,36368,36749,37350,36188,36494,35965,37227,37812,36310,37794,36492,36510,36355,35401,35238,36013,35749,35374,37270,35766,37029,36959,36953,36797,37683,36531,36012,35179,35826,36535,35749,36434,35380,35532,36763,35606,36784,37676,35130,36810,37054,36072,36786,37091,35923,36189,36632,36379,37162,36638,37932,36696,37231,36289,38282,36305,35396,37775,36483,36529,37514,37436,35896,37552,36674,38016,36538,36529,36401,37037,36995,37359,36830,37673,36280,38773,37670,37633,36730,37198,37804,36726,36930,35011,36160,37160,36179,35589,36995,37376,35940,37590,36463,35942,36012,36531,36704,37608,37534,36115,36266,35752,37201,37573,37048,37530,35507,36511,37298,36884,37746,37004,35724,37228,36401,37208,36240,36343,37709,35087,35546,36659,35414,36313,36714,36728,37707,35322,36875,38001,36795,37886,37423,36955,36898,35810,36467,36778,36056,35386,36841,35509,36541,36559,35702,36429,36758,35701,36014,37336,35414,36432,36060,37790,37796,36217,37016,36184,36404,36879,35479,38115,36795,36723,35410,36331,35606,38280,35350,36176,37499,36616,36774,37969,38251,35606,34759,36512,36702,36896,35480,36105,36380,36058,36922,36513,37469,37100,35953,36954,35874,36148,36185,35659,38318,37292,37035,36524,35736,36177,37215,36364,37088,37160,35824,34731,37895,36260,36813,36033,35959,36796,35527,36672,36878,36104,35045,36705,36074,35991,35836,35803,36980,36142,36114,36827,34980,36818,35761,37260,37093,35995,34013,37406,36964,36793,36904,36765,36805,36390,37905,37224,36840,36477,37328,38141,37514,37251,36591,37205,36710,36036,36551,37002,36580,36783,35642,37449,37081,33838,36768,35730,37402,37275,36152,35695,36600,35437,37535,38271,37645,37010,35741,37036,36954,36022,37078,35433,37004,36426,37313,38480,34710,37193,36442,34738,36102,35827,36566,35603,37251,36882,37188,35973,35849,37089,36699,35427,37171,35159,36214,36229,35968,36463,35358,36124,37048,36584,36822,37502,36645,37111,37590,36561,37585,36616,37186,36639,37830,37277,36691,36707,37378,36970,37988,35987,35922,36670,37129,36951,37060,36930,36806,36587,36726,37104,36184,36787,36860,36942,36918,35877,36439,36068,36089,36175,36144,36843,35631,35698,35508,35355,37622,37083,35631,36701,37832,37151,37232,37415,37630,35706,36184,36903,36887,37645,37225,35594,37192,36930,36681,37350,36972,36442,36684,36721,36404,38137,37749,36432,35698,36086,35109,35304,36278,36874,35899,34901,36976,38111,36061,37521,36994,37504,36971,36140,36188,35640,37622,35677,36412,36702,36423,36318,36219,35884,35080,36847,37104,36317,36598,36892,36304,36613,36574,36382,35364,37332,36512,37553,36980,36502,37214,37628,37449,36148,35531,35951,37915,36298,36231,37406,36762,34754,35604,36622,37979,37604,37382,37558,36504,35453,36821,36813,37108,38646,36044,36268,37038,36413,36195,36008,36082,36622,35734,38111,36860,36928,37032,36471,37072,35913,36992,38076,37255,36245,35121,37183,37705,36972,37435,36700,35405,35545,37371,35206,37569,35798,36449,36391,36576,37592,35353,36627,36646,36120,36399,36558,37140,35875,35875,37671,35978,36507,35779,34816,36780,36219,36103,37010,36330,37394,36861,37486,37995,35860,36813,36546,35731,35541,35679,36266,35358,37079,37514,37428,36201,37050,35732,34836,35742,37951,37552,36032,35781,37477,37038,36427,36555,37355,36452,35016,37665,39777,36988,37032,37425,37828,36486,36991,36762,37465,35741,37622,37182,35725,36327,37989,37699,37554,36163,35370,36369,35259,36525,36657,36075,36961,37678,35900,34385,36909,36887,36268,37076,35359,36961,35669,35230,35804,37851,36499,36694,36987,35570,36432,37063,35850,36084,36934,37886,36248,36265,36071,35719,36413,36252,35572,36153,39799,37638,37594,36435,36423,35283,35159,37027,35696,36697,37764,36849,36484,36102,38296,35557,36792,36039,36935,35998,37369,37676,36666,36900,37374,36246,37554,36624,37137,36980,38096,37100,36650,35878,36385,36965,36570,37598,36313,36704,37424,36368,37528,36808,37005,36543,37465,36047,37609,37484,36771,37409,37847,37207,36945,36591,37326,37306,36510,35988,34977,39536,37252,37186,38032,34791,35444,36365,36009,35218,37814,37267,36479,36651,36598,35690,37182,37160,35974,37300,37514,36421,36159,35430,35920,37210,37572,37222,36823,37248,37155,34546,36877,36158,36604,36810,36058,36563,35893,37914,36588,37046,38019,37090,35920,37377,37120,37630,37188,35608,36309,36145,35802,34916,36143,37051,35438,35405,36907,37181,37480,38112,37099,35458,36476,36292,36971,37782,37055,36418,35415,36968,35397,34856,36414,37702,37430,36848,35954,36702,37655,37471,36238,37736,37281,35611,36979,35984,36857,36171,37042,38331,36509,36599,36532,36138,36180,37631,37446,37365,37406,36605,37427,35503,35909,35591,35863,36046,35951,37316,37229,35815,37309,35557,37275,35831,36249,37581,36211,35516,36190,37358,38842,36688,37613,37524,37379,35488,37158,36493,37149,36353,36523,36561,37384,37347,35634,37419,36399,37049,36039,37054,36187,37556,36329,36451,35726,37217,35804,35904,36239,38904,36571,37347,35916,37839,36737,36384,35807,36937,35733,35950,35282,37418,35620,36696,35502,35069,37260,37117,36005,35263,37039,37113,36343,36882,37033,35972,36367,37436,36846,36307,38032,36058,35398,36956,37317,37202,37898,36179,35804,36245,37130,37139,36504,36277,34237,37647,36576,35483,37441,36566,37272,36622,36735,36131,36848,37070,37108,36062,37275,37035,35167,36578,36769,36648,37153,35884,36041,35991,35809,38272,37484,36670,36102,35750,36953,36291,35765,36193,37287,35184,37628,36976,36253,37949,36740,37257,37201,35655,37578,37249,36754,37868,37131,36129,36255,38942,36114,36709,36097,36156,36997,37739,38590,35589,37144,37848,37538,36285,36358,37552,36547,36515,37185,37446,37623,37266,36167,37572,36635,36593,35596,36061,35784,36690,36296,35885,36122,37270,36026,35543,36222,36965,35754,37288,36282,35506,34615,36840,35473,37151,37236,35795,35917,36261,36915,37500,36562,37201,36475,36126,37268,36854,35433,35178,36123,38319,36352,37071,36560,36325,35556,35279,35640,37537,36623,36896,37162,35005,37163,35087,34686,37151,38155,37844,34801,37562,36803,37016,36662,35733,38341,35707,38065,36845,36818,35790,36778,36374,37276,36573,38330,38442,37734,35107,36824,37846,36092,34909,35865,38755,35757,34751,36193,35241,37445,37745,36643,37371,35766,37036,35784,35754,36260,35837,34727,36172,36154,36623,37083,37704,37265,37546,36050,36248,36426,36283,36356,36999,36360,37238,37113,36535,35603,37216,37602,36333,35577,37383,37509,37585,35372,35240,36740,36668,35720,36170,36691,37847,37506,35130,35683,36460,36488,37030,35915,36025,37029,37032,36430,36582,36090,36763,36333,36972,36936,36378,37259,37881,38135,36720,37327,35917,37385,35305,37737,36403,36564,36384,36532,36678,36880,37255,37000,37000,35922,37334,36656,37593,36242,36920,36362,35931,38039,37002,36576,36413,37115,36073,36986,35968,36072,37774,36639,37761,37019,35578,36566,38499,36924,36556,37485,35935,36355,36255,38769,38040,36230,37010,36368,37383,36764,36614,38313,36592,36029,35827,36428,35553,36686,36491,36910,36483,37386,36048,37910,36829,36309,36623,36460,37122,36845,37970,36267,35367,37466,37306,36755,37519,36758,37080,37508,37097,35982,36723,36662,36052,36433,35565,36303,36251,37486,35385,36821,37224,38683,35405,36321,37670,36341,36698,37054,37033,36711,35711,35818,36195,36106,36809,37685,36646,35876,36743,36990,36508,37237,36754,37473,36624,36067,36566,38408,37133,36199,35865,36895,37043,37420,38156,35200,35522,36708,36219,37062,37588,36280,36834,37389,37752,36874,36229,37714,36671,38381,37057,36685,36314,36880,36787,36934,37490,38068,37443,35838,36466,35841,36451,36858,36494,35424,38331,36863,35543,37119,36820,35687,36128,36673,36522,35690,35052,35658,36975,36548,36895,36298,35822,35788,36533,37974,34930,36014,36494,37129,38119,36824,36006,34768,38295,36377,37559,36592,37435,36144,38156,35538,35767,36351,37037,36999,35902,37142,35750,36214,37563,36757,36156,34808,36999,36572,36156,36195,36893,36604,36785,36560,35734,35652,36404,37143,36248,36964,37647,37781,36837,35368,37298,35143,36960,37092,37621,35817,37388,38137,35834,38524,37139,36054,35336,37836,37396,36803,35145,36850,36976,36303,35709,37258,36466,37419,36596,37969,35564,36520,36281,35919,36834,36561,36059,35873,38709,37854,37623,37418,36578,36232,35283,35009,36509,35825,35076,36828]}]},"null_count":0,"tot_col_size":364432273,"last_update_version":401695328240926722},"o_orderdate":{"histogram":{"ndv":2406,"buckets":[{"count":315000,"lower_bound":"MTk5Mi0wMS0wMQ==","upper_bound":"MTk5Mi0wMS0xMg==","repeats":22500},{"count":615000,"lower_bound":"MTk5Mi0wMS0xMw==","upper_bound":"MTk5Mi0wMS0yNA==","repeats":30000},{"count":945000,"lower_bound":"MTk5Mi0wMS0yNQ==","upper_bound":"MTk5Mi0wMi0wNw==","repeats":37500},{"count":1275000,"lower_bound":"MTk5Mi0wMi0wOA==","upper_bound":"MTk5Mi0wMi0xOA==","repeats":45000},{"count":1590000,"lower_bound":"MTk5Mi0wMi0xOQ==","upper_bound":"MTk5Mi0wMi0yOQ==","repeats":37500},{"count":1927500,"lower_bound":"MTk5Mi0wMy0wMQ==","upper_bound":"MTk5Mi0wMy0wOQ==","repeats":52500},{"count":2227500,"lower_bound":"MTk5Mi0wMy0xMA==","upper_bound":"MTk5Mi0wMy0yMA==","repeats":15000},{"count":2550000,"lower_bound":"MTk5Mi0wMy0yMQ==","upper_bound":"MTk5Mi0wNC0wMQ==","repeats":37500},{"count":2850000,"lower_bound":"MTk5Mi0wNC0wMg==","upper_bound":"MTk5Mi0wNC0xMg==","repeats":15000},{"count":3157500,"lower_bound":"MTk5Mi0wNC0xMw==","upper_bound":"MTk5Mi0wNC0yMw==","repeats":22500},{"count":3457500,"lower_bound":"MTk5Mi0wNC0yNA==","upper_bound":"MTk5Mi0wNS0wMg==","repeats":15000},{"count":3802500,"lower_bound":"MTk5Mi0wNS0wMw==","upper_bound":"MTk5Mi0wNS0xNQ==","repeats":52500},{"count":4110000,"lower_bound":"MTk5Mi0wNS0xNg==","upper_bound":"MTk5Mi0wNS0yNQ==","repeats":30000},{"count":4410000,"lower_bound":"MTk5Mi0wNS0yNg==","upper_bound":"MTk5Mi0wNi0wOA==","repeats":15000},{"count":4725000,"lower_bound":"MTk5Mi0wNi0wOQ==","upper_bound":"MTk5Mi0wNi0xOA==","repeats":37500},{"count":5032500,"lower_bound":"MTk5Mi0wNi0xOQ==","upper_bound":"MTk5Mi0wNi0yNw==","repeats":37500},{"count":5362500,"lower_bound":"MTk5Mi0wNi0yOA==","upper_bound":"MTk5Mi0wNy0wNw==","repeats":37500},{"count":5700000,"lower_bound":"MTk5Mi0wNy0wOA==","upper_bound":"MTk5Mi0wNy0xOA==","repeats":45000},{"count":6030000,"lower_bound":"MTk5Mi0wNy0xOQ==","upper_bound":"MTk5Mi0wNy0zMQ==","repeats":37500},{"count":6337500,"lower_bound":"MTk5Mi0wOC0wMQ==","upper_bound":"MTk5Mi0wOC0xMQ==","repeats":45000},{"count":6660000,"lower_bound":"MTk5Mi0wOC0xMg==","upper_bound":"MTk5Mi0wOC0yNQ==","repeats":60000},{"count":6960000,"lower_bound":"MTk5Mi0wOC0yNg==","upper_bound":"MTk5Mi0wOS0wNg==","repeats":45000},{"count":7290000,"lower_bound":"MTk5Mi0wOS0wNw==","upper_bound":"MTk5Mi0wOS0xNg==","repeats":45000},{"count":7612500,"lower_bound":"MTk5Mi0wOS0xNw==","upper_bound":"MTk5Mi0wOS0yNw==","repeats":37500},{"count":7927500,"lower_bound":"MTk5Mi0wOS0yOA==","upper_bound":"MTk5Mi0xMC0wNg==","repeats":30000},{"count":8250000,"lower_bound":"MTk5Mi0xMC0wNw==","upper_bound":"MTk5Mi0xMC0xNQ==","repeats":37500},{"count":8580000,"lower_bound":"MTk5Mi0xMC0xNg==","upper_bound":"MTk5Mi0xMC0yNA==","repeats":52500},{"count":8902500,"lower_bound":"MTk5Mi0xMC0yNQ==","upper_bound":"MTk5Mi0xMS0wMg==","repeats":30000},{"count":9217500,"lower_bound":"MTk5Mi0xMS0wMw==","upper_bound":"MTk5Mi0xMS0xMA==","repeats":37500},{"count":9540000,"lower_bound":"MTk5Mi0xMS0xMQ==","upper_bound":"MTk5Mi0xMS0xOA==","repeats":30000},{"count":9855000,"lower_bound":"MTk5Mi0xMS0xOQ==","upper_bound":"MTk5Mi0xMS0yNg==","repeats":45000},{"count":10155000,"lower_bound":"MTk5Mi0xMS0yNw==","upper_bound":"MTk5Mi0xMi0wNg==","repeats":15000},{"count":10462500,"lower_bound":"MTk5Mi0xMi0wNw==","upper_bound":"MTk5Mi0xMi0xNw==","repeats":22500},{"count":10792500,"lower_bound":"MTk5Mi0xMi0xOA==","upper_bound":"MTk5Mi0xMi0yOQ==","repeats":52500},{"count":11092500,"lower_bound":"MTk5Mi0xMi0zMA==","upper_bound":"MTk5My0wMS0wNg==","repeats":15000},{"count":11392500,"lower_bound":"MTk5My0wMS0wNw==","upper_bound":"MTk5My0wMS0xNg==","repeats":37500},{"count":11700000,"lower_bound":"MTk5My0wMS0xNw==","upper_bound":"MTk5My0wMS0yMg==","repeats":67500},{"count":12030000,"lower_bound":"MTk5My0wMS0yMw==","upper_bound":"MTk5My0wMi0wMQ==","repeats":60000},{"count":12345000,"lower_bound":"MTk5My0wMi0wMg==","upper_bound":"MTk5My0wMi0xMg==","repeats":22500},{"count":12660000,"lower_bound":"MTk5My0wMi0xMw==","upper_bound":"MTk5My0wMi0yNQ==","repeats":22500},{"count":12960000,"lower_bound":"MTk5My0wMi0yNg==","upper_bound":"MTk5My0wMy0wNQ==","repeats":22500},{"count":13297500,"lower_bound":"MTk5My0wMy0wNg==","upper_bound":"MTk5My0wMy0xNw==","repeats":45000},{"count":13612500,"lower_bound":"MTk5My0wMy0xOA==","upper_bound":"MTk5My0wMy0yNQ==","repeats":75000},{"count":13912500,"lower_bound":"MTk5My0wMy0yNg==","upper_bound":"MTk5My0wNC0wMg==","repeats":37500},{"count":14220000,"lower_bound":"MTk5My0wNC0wMw==","upper_bound":"MTk5My0wNC0xMg==","repeats":30000},{"count":14527500,"lower_bound":"MTk5My0wNC0xMw==","upper_bound":"MTk5My0wNC0yMQ==","repeats":37500},{"count":14850000,"lower_bound":"MTk5My0wNC0yMg==","upper_bound":"MTk5My0wNS0wMQ==","repeats":67500},{"count":15187500,"lower_bound":"MTk5My0wNS0wMg==","upper_bound":"MTk5My0wNS0xMQ==","repeats":45000},{"count":15502500,"lower_bound":"MTk5My0wNS0xMg==","upper_bound":"MTk5My0wNS0xOQ==","repeats":37500},{"count":15817500,"lower_bound":"MTk5My0wNS0yMA==","upper_bound":"MTk5My0wNS0yOQ==","repeats":30000},{"count":16117500,"lower_bound":"MTk5My0wNS0zMA==","upper_bound":"MTk5My0wNi0wOA==","repeats":15000},{"count":16462500,"lower_bound":"MTk5My0wNi0xMA==","upper_bound":"MTk5My0wNi0xOA==","repeats":60000},{"count":16777500,"lower_bound":"MTk5My0wNi0xOQ==","upper_bound":"MTk5My0wNy0wMQ==","repeats":22500},{"count":17107500,"lower_bound":"MTk5My0wNy0wMg==","upper_bound":"MTk5My0wNy0xMA==","repeats":45000},{"count":17422500,"lower_bound":"MTk5My0wNy0xMQ==","upper_bound":"MTk5My0wNy0yMA==","repeats":30000},{"count":17737500,"lower_bound":"MTk5My0wNy0yMQ==","upper_bound":"MTk5My0wNy0zMA==","repeats":30000},{"count":18037500,"lower_bound":"MTk5My0wNy0zMQ==","upper_bound":"MTk5My0wOC0xMw==","repeats":37500},{"count":18352500,"lower_bound":"MTk5My0wOC0xNA==","upper_bound":"MTk5My0wOC0yMg==","repeats":52500},{"count":18682500,"lower_bound":"MTk5My0wOC0yMw==","upper_bound":"MTk5My0wOS0wMQ==","repeats":45000},{"count":18990000,"lower_bound":"MTk5My0wOS0wMg==","upper_bound":"MTk5My0wOS0xMA==","repeats":37500},{"count":19297500,"lower_bound":"MTk5My0wOS0xMQ==","upper_bound":"MTk5My0wOS0xNw==","repeats":45000},{"count":19605000,"lower_bound":"MTk5My0wOS0xOA==","upper_bound":"MTk5My0wOS0yNw==","repeats":30000},{"count":19920000,"lower_bound":"MTk5My0wOS0yOA==","upper_bound":"MTk5My0xMC0wNA==","repeats":60000},{"count":20220000,"lower_bound":"MTk5My0xMC0wNQ==","upper_bound":"MTk5My0xMC0xNA==","repeats":22500},{"count":20520000,"lower_bound":"MTk5My0xMC0xNQ==","upper_bound":"MTk5My0xMC0yNA==","repeats":30000},{"count":20827500,"lower_bound":"MTk5My0xMC0yNQ==","upper_bound":"MTk5My0xMS0wMQ==","repeats":52500},{"count":21165000,"lower_bound":"MTk5My0xMS0wMg==","upper_bound":"MTk5My0xMS0xMA==","repeats":52500},{"count":21472500,"lower_bound":"MTk5My0xMS0xMQ==","upper_bound":"MTk5My0xMS0yMw==","repeats":22500},{"count":21795000,"lower_bound":"MTk5My0xMS0yNA==","upper_bound":"MTk5My0xMi0wMw==","repeats":37500},{"count":22095000,"lower_bound":"MTk5My0xMi0wNA==","upper_bound":"MTk5My0xMi0xMg==","repeats":60000},{"count":22425000,"lower_bound":"MTk5My0xMi0xMw==","upper_bound":"MTk5My0xMi0yMg==","repeats":45000},{"count":22732500,"lower_bound":"MTk5My0xMi0yMw==","upper_bound":"MTk5NC0wMS0wNA==","repeats":22500},{"count":23032500,"lower_bound":"MTk5NC0wMS0wNQ==","upper_bound":"MTk5NC0wMS0xMg==","repeats":30000},{"count":23362500,"lower_bound":"MTk5NC0wMS0xMw==","upper_bound":"MTk5NC0wMS0yNg==","repeats":45000},{"count":23700000,"lower_bound":"MTk5NC0wMS0yNw==","upper_bound":"MTk5NC0wMi0wNQ==","repeats":52500},{"count":24015000,"lower_bound":"MTk5NC0wMi0wNg==","upper_bound":"MTk5NC0wMi0xMw==","repeats":22500},{"count":24337500,"lower_bound":"MTk5NC0wMi0xNA==","upper_bound":"MTk5NC0wMi0yMg==","repeats":30000},{"count":24667500,"lower_bound":"MTk5NC0wMi0yMw==","upper_bound":"MTk5NC0wMy0wMg==","repeats":45000},{"count":24982500,"lower_bound":"MTk5NC0wMy0wMw==","upper_bound":"MTk5NC0wMy0xMA==","repeats":52500},{"count":25282500,"lower_bound":"MTk5NC0wMy0xMQ==","upper_bound":"MTk5NC0wMy0xOQ==","repeats":45000},{"count":25582500,"lower_bound":"MTk5NC0wMy0yMA==","upper_bound":"MTk5NC0wMy0yOQ==","repeats":22500},{"count":25882500,"lower_bound":"MTk5NC0wMy0zMA==","upper_bound":"MTk5NC0wNC0wNw==","repeats":30000},{"count":26182500,"lower_bound":"MTk5NC0wNC0wOA==","upper_bound":"MTk5NC0wNC0xOA==","repeats":30000},{"count":26497500,"lower_bound":"MTk5NC0wNC0xOQ==","upper_bound":"MTk5NC0wNC0yNg==","repeats":37500},{"count":26805000,"lower_bound":"MTk5NC0wNC0yNw==","upper_bound":"MTk5NC0wNS0wNA==","repeats":52500},{"count":27105000,"lower_bound":"MTk5NC0wNS0wNQ==","upper_bound":"MTk5NC0wNS0xMQ==","repeats":60000},{"count":27457500,"lower_bound":"MTk5NC0wNS0xMg==","upper_bound":"MTk5NC0wNS0yMg==","repeats":60000},{"count":27787500,"lower_bound":"MTk5NC0wNS0yMw==","upper_bound":"MTk5NC0wNS0zMA==","repeats":60000},{"count":28087500,"lower_bound":"MTk5NC0wNS0zMQ==","upper_bound":"MTk5NC0wNi0xMQ==","repeats":15000},{"count":28395000,"lower_bound":"MTk5NC0wNi0xMg==","upper_bound":"MTk5NC0wNi0xOA==","repeats":37500},{"count":28702500,"lower_bound":"MTk5NC0wNi0xOQ==","upper_bound":"MTk5NC0wNy0wMQ==","repeats":15000},{"count":29002500,"lower_bound":"MTk5NC0wNy0wMg==","upper_bound":"MTk5NC0wNy0wOQ==","repeats":30000},{"count":29302500,"lower_bound":"MTk5NC0wNy0xMA==","upper_bound":"MTk5NC0wNy0xNg==","repeats":37500},{"count":29617500,"lower_bound":"MTk5NC0wNy0xNw==","upper_bound":"MTk5NC0wNy0yNg==","repeats":22500},{"count":29925000,"lower_bound":"MTk5NC0wNy0yNw==","upper_bound":"MTk5NC0wOC0wNQ==","repeats":15000},{"count":30262500,"lower_bound":"MTk5NC0wOC0wNg==","upper_bound":"MTk5NC0wOC0xNQ==","repeats":45000},{"count":30562500,"lower_bound":"MTk5NC0wOC0xNg==","upper_bound":"MTk5NC0wOC0yNA==","repeats":22500},{"count":30877500,"lower_bound":"MTk5NC0wOC0yNQ==","upper_bound":"MTk5NC0wOS0wMw==","repeats":45000},{"count":31215000,"lower_bound":"MTk5NC0wOS0wNA==","upper_bound":"MTk5NC0wOS0xMQ==","repeats":90000},{"count":31515000,"lower_bound":"MTk5NC0wOS0xMg==","upper_bound":"MTk5NC0wOS0xOQ==","repeats":30000},{"count":31830000,"lower_bound":"MTk5NC0wOS0yMA==","upper_bound":"MTk5NC0wOS0zMA==","repeats":22500},{"count":32130000,"lower_bound":"MTk5NC0xMC0wMQ==","upper_bound":"MTk5NC0xMC0xMw==","repeats":15000},{"count":32430000,"lower_bound":"MTk5NC0xMC0xNA==","upper_bound":"MTk5NC0xMC0yNg==","repeats":37500},{"count":32730000,"lower_bound":"MTk5NC0xMC0yNw==","upper_bound":"MTk5NC0xMS0wNQ==","repeats":22500},{"count":33052500,"lower_bound":"MTk5NC0xMS0wNg==","upper_bound":"MTk5NC0xMS0xMw==","repeats":45000},{"count":33367500,"lower_bound":"MTk5NC0xMS0xNA==","upper_bound":"MTk5NC0xMS0yNQ==","repeats":45000},{"count":33705000,"lower_bound":"MTk5NC0xMS0yNg==","upper_bound":"MTk5NC0xMi0wNg==","repeats":52500},{"count":34012500,"lower_bound":"MTk5NC0xMi0wNw==","upper_bound":"MTk5NC0xMi0xNg==","repeats":22500},{"count":34357500,"lower_bound":"MTk5NC0xMi0xNw==","upper_bound":"MTk5NC0xMi0yOA==","repeats":60000},{"count":34672500,"lower_bound":"MTk5NC0xMi0yOQ==","upper_bound":"MTk5NS0wMS0wNg==","repeats":37500},{"count":34972500,"lower_bound":"MTk5NS0wMS0wNw==","upper_bound":"MTk5NS0wMS0xNA==","repeats":30000},{"count":35280000,"lower_bound":"MTk5NS0wMS0xNQ==","upper_bound":"MTk5NS0wMS0yMg==","repeats":22500},{"count":35640000,"lower_bound":"MTk5NS0wMS0yMw==","upper_bound":"MTk5NS0wMi0wMQ==","repeats":75000},{"count":35947500,"lower_bound":"MTk5NS0wMi0wMg==","upper_bound":"MTk5NS0wMi0wOQ==","repeats":22500},{"count":36255000,"lower_bound":"MTk5NS0wMi0xMA==","upper_bound":"MTk5NS0wMi0xOQ==","repeats":22500},{"count":36577500,"lower_bound":"MTk5NS0wMi0yMA==","upper_bound":"MTk5NS0wMy0wMQ==","repeats":67500},{"count":36892500,"lower_bound":"MTk5NS0wMy0wMg==","upper_bound":"MTk5NS0wMy0xMw==","repeats":22500},{"count":37192500,"lower_bound":"MTk5NS0wMy0xNA==","upper_bound":"MTk5NS0wMy0yMw==","repeats":30000},{"count":37515000,"lower_bound":"MTk5NS0wMy0yNA==","upper_bound":"MTk5NS0wNC0wNQ==","repeats":30000},{"count":37822500,"lower_bound":"MTk5NS0wNC0wNg==","upper_bound":"MTk5NS0wNC0xNg==","repeats":22500},{"count":38137500,"lower_bound":"MTk5NS0wNC0xNw==","upper_bound":"MTk5NS0wNC0yOQ==","repeats":37500},{"count":38467500,"lower_bound":"MTk5NS0wNC0zMA==","upper_bound":"MTk5NS0wNS0xMQ==","repeats":37500},{"count":38782500,"lower_bound":"MTk5NS0wNS0xMg==","upper_bound":"MTk5NS0wNS0yMA==","repeats":22500},{"count":39097500,"lower_bound":"MTk5NS0wNS0yMQ==","upper_bound":"MTk5NS0wNi0wMQ==","repeats":30000},{"count":39420000,"lower_bound":"MTk5NS0wNi0wMg==","upper_bound":"MTk5NS0wNi0xMQ==","repeats":52500},{"count":39735000,"lower_bound":"MTk5NS0wNi0xMg==","upper_bound":"MTk5NS0wNi0yMg==","repeats":60000},{"count":40057500,"lower_bound":"MTk5NS0wNi0yMw==","upper_bound":"MTk5NS0wNy0wMw==","repeats":30000},{"count":40380000,"lower_bound":"MTk5NS0wNy0wNA==","upper_bound":"MTk5NS0wNy0xMQ==","repeats":30000},{"count":40680000,"lower_bound":"MTk5NS0wNy0xMg==","upper_bound":"MTk5NS0wNy0yNA==","repeats":15000},{"count":40987500,"lower_bound":"MTk5NS0wNy0yNQ==","upper_bound":"MTk5NS0wOC0wNA==","repeats":45000},{"count":41287500,"lower_bound":"MTk5NS0wOC0wNQ==","upper_bound":"MTk5NS0wOC0xNg==","repeats":30000},{"count":41587500,"lower_bound":"MTk5NS0wOC0xNw==","upper_bound":"MTk5NS0wOC0yNw==","repeats":22500},{"count":41887500,"lower_bound":"MTk5NS0wOC0yOA==","upper_bound":"MTk5NS0wOS0wOQ==","repeats":7500},{"count":42187500,"lower_bound":"MTk5NS0wOS0xMA==","upper_bound":"MTk5NS0wOS0yMA==","repeats":22500},{"count":42525000,"lower_bound":"MTk5NS0wOS0yMQ==","upper_bound":"MTk5NS0xMC0wMQ==","repeats":67500},{"count":42840000,"lower_bound":"MTk5NS0xMC0wMg==","upper_bound":"MTk5NS0xMC0xMQ==","repeats":52500},{"count":43140000,"lower_bound":"MTk5NS0xMC0xMg==","upper_bound":"MTk5NS0xMC0xOQ==","repeats":37500},{"count":43447500,"lower_bound":"MTk5NS0xMC0yMA==","upper_bound":"MTk5NS0xMC0zMA==","repeats":45000},{"count":43777500,"lower_bound":"MTk5NS0xMC0zMQ==","upper_bound":"MTk5NS0xMS0xMA==","repeats":45000},{"count":44092500,"lower_bound":"MTk5NS0xMS0xMQ==","upper_bound":"MTk5NS0xMS0yMA==","repeats":37500},{"count":44422500,"lower_bound":"MTk5NS0xMS0yMQ==","upper_bound":"MTk5NS0xMi0wMg==","repeats":37500},{"count":44730000,"lower_bound":"MTk5NS0xMi0wMw==","upper_bound":"MTk5NS0xMi0xMw==","repeats":37500},{"count":45060000,"lower_bound":"MTk5NS0xMi0xNA==","upper_bound":"MTk5NS0xMi0yMw==","repeats":37500},{"count":45382500,"lower_bound":"MTk5NS0xMi0yNA==","upper_bound":"MTk5Ni0wMS0wMw==","repeats":82500},{"count":45690000,"lower_bound":"MTk5Ni0wMS0wNA==","upper_bound":"MTk5Ni0wMS0xNA==","repeats":45000},{"count":46005000,"lower_bound":"MTk5Ni0wMS0xNQ==","upper_bound":"MTk5Ni0wMS0yMQ==","repeats":52500},{"count":46305000,"lower_bound":"MTk5Ni0wMS0yMg==","upper_bound":"MTk5Ni0wMS0zMA==","repeats":22500},{"count":46620000,"lower_bound":"MTk5Ni0wMS0zMQ==","upper_bound":"MTk5Ni0wMi0wOQ==","repeats":60000},{"count":46920000,"lower_bound":"MTk5Ni0wMi0xMA==","upper_bound":"MTk5Ni0wMi0xOA==","repeats":45000},{"count":47227500,"lower_bound":"MTk5Ni0wMi0xOQ==","upper_bound":"MTk5Ni0wMi0yNQ==","repeats":30000},{"count":47557500,"lower_bound":"MTk5Ni0wMi0yNg==","upper_bound":"MTk5Ni0wMy0wNQ==","repeats":60000},{"count":47880000,"lower_bound":"MTk5Ni0wMy0wNg==","upper_bound":"MTk5Ni0wMy0xNA==","repeats":52500},{"count":48195000,"lower_bound":"MTk5Ni0wMy0xNQ==","upper_bound":"MTk5Ni0wMy0yMw==","repeats":45000},{"count":48502500,"lower_bound":"MTk5Ni0wMy0yNA==","upper_bound":"MTk5Ni0wNC0wMg==","repeats":37500},{"count":48832500,"lower_bound":"MTk5Ni0wNC0wMw==","upper_bound":"MTk5Ni0wNC0xMw==","repeats":37500},{"count":49162500,"lower_bound":"MTk5Ni0wNC0xNA==","upper_bound":"MTk5Ni0wNC0yMw==","repeats":52500},{"count":49492500,"lower_bound":"MTk5Ni0wNC0yNA==","upper_bound":"MTk5Ni0wNS0wMg==","repeats":60000},{"count":49807500,"lower_bound":"MTk5Ni0wNS0wMw==","upper_bound":"MTk5Ni0wNS0xMg==","repeats":52500},{"count":50107500,"lower_bound":"MTk5Ni0wNS0xMw==","upper_bound":"MTk5Ni0wNS0yNQ==","repeats":30000},{"count":50430000,"lower_bound":"MTk5Ni0wNS0yNg==","upper_bound":"MTk5Ni0wNi0wNg==","repeats":37500},{"count":50737500,"lower_bound":"MTk5Ni0wNi0wNw==","upper_bound":"MTk5Ni0wNi0xNw==","repeats":37500},{"count":51060000,"lower_bound":"MTk5Ni0wNi0xOA==","upper_bound":"MTk5Ni0wNi0yOA==","repeats":30000},{"count":51412500,"lower_bound":"MTk5Ni0wNi0yOQ==","upper_bound":"MTk5Ni0wNy0wNw==","repeats":60000},{"count":51772500,"lower_bound":"MTk5Ni0wNy0wOA==","upper_bound":"MTk5Ni0wNy0xNw==","repeats":67500},{"count":52080000,"lower_bound":"MTk5Ni0wNy0xOA==","upper_bound":"MTk5Ni0wNy0yNg==","repeats":30000},{"count":52387500,"lower_bound":"MTk5Ni0wNy0yNw==","upper_bound":"MTk5Ni0wOC0wNA==","repeats":22500},{"count":52710000,"lower_bound":"MTk5Ni0wOC0wNQ==","upper_bound":"MTk5Ni0wOC0xNg==","repeats":30000},{"count":53017500,"lower_bound":"MTk5Ni0wOC0xNw==","upper_bound":"MTk5Ni0wOC0yNg==","repeats":22500},{"count":53340000,"lower_bound":"MTk5Ni0wOC0yNw==","upper_bound":"MTk5Ni0wOS0wMg==","repeats":67500},{"count":53640000,"lower_bound":"MTk5Ni0wOS0wMw==","upper_bound":"MTk5Ni0wOS0xNA==","repeats":22500},{"count":53955000,"lower_bound":"MTk5Ni0wOS0xNQ==","upper_bound":"MTk5Ni0wOS0yMw==","repeats":22500},{"count":54262500,"lower_bound":"MTk5Ni0wOS0yNA==","upper_bound":"MTk5Ni0xMC0wMw==","repeats":37500},{"count":54562500,"lower_bound":"MTk5Ni0xMC0wNA==","upper_bound":"MTk5Ni0xMC0xNA==","repeats":7500},{"count":54885000,"lower_bound":"MTk5Ni0xMC0xNQ==","upper_bound":"MTk5Ni0xMC0yNQ==","repeats":45000},{"count":55215000,"lower_bound":"MTk5Ni0xMC0yNg==","upper_bound":"MTk5Ni0xMS0wNQ==","repeats":60000},{"count":55522500,"lower_bound":"MTk5Ni0xMS0wNg==","upper_bound":"MTk5Ni0xMS0xNw==","repeats":15000},{"count":55845000,"lower_bound":"MTk5Ni0xMS0xOA==","upper_bound":"MTk5Ni0xMS0yOQ==","repeats":52500},{"count":56145000,"lower_bound":"MTk5Ni0xMS0zMA==","upper_bound":"MTk5Ni0xMi0wOQ==","repeats":22500},{"count":56460000,"lower_bound":"MTk5Ni0xMi0xMA==","upper_bound":"MTk5Ni0xMi0xNw==","repeats":52500},{"count":56775000,"lower_bound":"MTk5Ni0xMi0xOA==","upper_bound":"MTk5Ni0xMi0yOA==","repeats":37500},{"count":57075000,"lower_bound":"MTk5Ni0xMi0yOQ==","upper_bound":"MTk5Ny0wMS0wNQ==","repeats":60000},{"count":57382500,"lower_bound":"MTk5Ny0wMS0wNg==","upper_bound":"MTk5Ny0wMS0xNg==","repeats":30000},{"count":57705000,"lower_bound":"MTk5Ny0wMS0xNw==","upper_bound":"MTk5Ny0wMS0yNw==","repeats":52500},{"count":58042500,"lower_bound":"MTk5Ny0wMS0yOA==","upper_bound":"MTk5Ny0wMi0wNw==","repeats":52500},{"count":58357500,"lower_bound":"MTk5Ny0wMi0wOA==","upper_bound":"MTk5Ny0wMi0xOQ==","repeats":30000},{"count":58695000,"lower_bound":"MTk5Ny0wMi0yMA==","upper_bound":"MTk5Ny0wMi0yOA==","repeats":75000},{"count":58995000,"lower_bound":"MTk5Ny0wMy0wMQ==","upper_bound":"MTk5Ny0wMy0xMQ==","repeats":7500},{"count":59302500,"lower_bound":"MTk5Ny0wMy0xMg==","upper_bound":"MTk5Ny0wMy0yMg==","repeats":37500},{"count":59625000,"lower_bound":"MTk5Ny0wMy0yMw==","upper_bound":"MTk5Ny0wNC0wMg==","repeats":30000},{"count":59940000,"lower_bound":"MTk5Ny0wNC0wMw==","upper_bound":"MTk5Ny0wNC0xMw==","repeats":22500},{"count":60262500,"lower_bound":"MTk5Ny0wNC0xNA==","upper_bound":"MTk5Ny0wNC0yMw==","repeats":37500},{"count":60600000,"lower_bound":"MTk5Ny0wNC0yNA==","upper_bound":"MTk5Ny0wNS0wMw==","repeats":45000},{"count":60900000,"lower_bound":"MTk5Ny0wNS0wNA==","upper_bound":"MTk5Ny0wNS0xMw==","repeats":37500},{"count":61207500,"lower_bound":"MTk5Ny0wNS0xNA==","upper_bound":"MTk5Ny0wNS0yMw==","repeats":30000},{"count":61507500,"lower_bound":"MTk5Ny0wNS0yNA==","upper_bound":"MTk5Ny0wNi0wMg==","repeats":30000},{"count":61807500,"lower_bound":"MTk5Ny0wNi0wMw==","upper_bound":"MTk5Ny0wNi0xMQ==","repeats":30000},{"count":62122500,"lower_bound":"MTk5Ny0wNi0xMg==","upper_bound":"MTk5Ny0wNi0yMg==","repeats":37500},{"count":62437500,"lower_bound":"MTk5Ny0wNi0yMw==","upper_bound":"MTk5Ny0wNy0wMQ==","repeats":37500},{"count":62745000,"lower_bound":"MTk5Ny0wNy0wMg==","upper_bound":"MTk5Ny0wNy0xMg==","repeats":37500},{"count":63075000,"lower_bound":"MTk5Ny0wNy0xMw==","upper_bound":"MTk5Ny0wNy0yMg==","repeats":37500},{"count":63390000,"lower_bound":"MTk5Ny0wNy0yMw==","upper_bound":"MTk5Ny0wOC0wMQ==","repeats":37500},{"count":63690000,"lower_bound":"MTk5Ny0wOC0wMg==","upper_bound":"MTk5Ny0wOC0xMw==","repeats":30000},{"count":64035000,"lower_bound":"MTk5Ny0wOC0xNA==","upper_bound":"MTk5Ny0wOC0yMw==","repeats":67500},{"count":64350000,"lower_bound":"MTk5Ny0wOC0yNA==","upper_bound":"MTk5Ny0wOS0wMQ==","repeats":60000},{"count":64672500,"lower_bound":"MTk5Ny0wOS0wMg==","upper_bound":"MTk5Ny0wOS0xMQ==","repeats":37500},{"count":64980000,"lower_bound":"MTk5Ny0wOS0xMg==","upper_bound":"MTk5Ny0wOS0xOQ==","repeats":60000},{"count":65310000,"lower_bound":"MTk5Ny0wOS0yMA==","upper_bound":"MTk5Ny0xMC0wMg==","repeats":37500},{"count":65640000,"lower_bound":"MTk5Ny0xMC0wMw==","upper_bound":"MTk5Ny0xMC0xMw==","repeats":37500},{"count":65947500,"lower_bound":"MTk5Ny0xMC0xNA==","upper_bound":"MTk5Ny0xMC0yNA==","repeats":52500},{"count":66262500,"lower_bound":"MTk5Ny0xMC0yNQ==","upper_bound":"MTk5Ny0xMS0wNQ==","repeats":22500},{"count":66577500,"lower_bound":"MTk5Ny0xMS0wNg==","upper_bound":"MTk5Ny0xMS0xMw==","repeats":52500},{"count":66885000,"lower_bound":"MTk5Ny0xMS0xNA==","upper_bound":"MTk5Ny0xMS0yMg==","repeats":37500},{"count":67200000,"lower_bound":"MTk5Ny0xMS0yMw==","upper_bound":"MTk5Ny0xMi0wNA==","repeats":52500},{"count":67522500,"lower_bound":"MTk5Ny0xMi0wNQ==","upper_bound":"MTk5Ny0xMi0xNg==","repeats":30000},{"count":67822500,"lower_bound":"MTk5Ny0xMi0xNw==","upper_bound":"MTk5Ny0xMi0yNg==","repeats":37500},{"count":68130000,"lower_bound":"MTk5Ny0xMi0yNw==","upper_bound":"MTk5OC0wMS0wNg==","repeats":15000},{"count":68475000,"lower_bound":"MTk5OC0wMS0wNw==","upper_bound":"MTk5OC0wMS0xNQ==","repeats":60000},{"count":68790000,"lower_bound":"MTk5OC0wMS0xNg==","upper_bound":"MTk5OC0wMS0yNA==","repeats":45000},{"count":69112500,"lower_bound":"MTk5OC0wMS0yNQ==","upper_bound":"MTk5OC0wMi0wNQ==","repeats":37500},{"count":69442500,"lower_bound":"MTk5OC0wMi0wNg==","upper_bound":"MTk5OC0wMi0xNA==","repeats":37500},{"count":69742500,"lower_bound":"MTk5OC0wMi0xNQ==","upper_bound":"MTk5OC0wMi0yNg==","repeats":7500},{"count":70050000,"lower_bound":"MTk5OC0wMi0yNw==","upper_bound":"MTk5OC0wMy0wNQ==","repeats":30000},{"count":70372500,"lower_bound":"MTk5OC0wMy0wNg==","upper_bound":"MTk5OC0wMy0xNQ==","repeats":45000},{"count":70680000,"lower_bound":"MTk5OC0wMy0xNg==","upper_bound":"MTk5OC0wMy0yMw==","repeats":82500},{"count":71017500,"lower_bound":"MTk5OC0wMy0yNA==","upper_bound":"MTk5OC0wNC0wMw==","repeats":75000},{"count":71325000,"lower_bound":"MTk5OC0wNC0wNA==","upper_bound":"MTk5OC0wNC0xMg==","repeats":15000},{"count":71647500,"lower_bound":"MTk5OC0wNC0xMw==","upper_bound":"MTk5OC0wNC0yMw==","repeats":45000},{"count":71947500,"lower_bound":"MTk5OC0wNC0yNA==","upper_bound":"MTk5OC0wNS0wMg==","repeats":45000},{"count":72247500,"lower_bound":"MTk5OC0wNS0wMw==","upper_bound":"MTk5OC0wNS0xMA==","repeats":75000},{"count":72570000,"lower_bound":"MTk5OC0wNS0xMQ==","upper_bound":"MTk5OC0wNS0xOQ==","repeats":52500},{"count":72900000,"lower_bound":"MTk5OC0wNS0yMA==","upper_bound":"MTk5OC0wNS0yNg==","repeats":45000},{"count":73230000,"lower_bound":"MTk5OC0wNS0yNw==","upper_bound":"MTk5OC0wNi0wNQ==","repeats":37500},{"count":73545000,"lower_bound":"MTk5OC0wNi0wNg==","upper_bound":"MTk5OC0wNi0xNQ==","repeats":22500},{"count":73852500,"lower_bound":"MTk5OC0wNi0xNw==","upper_bound":"MTk5OC0wNi0yNg==","repeats":15000},{"count":74152500,"lower_bound":"MTk5OC0wNi0yNw==","upper_bound":"MTk5OC0wNy0wNA==","repeats":52500},{"count":74452500,"lower_bound":"MTk5OC0wNy0wNQ==","upper_bound":"MTk5OC0wNy0xMw==","repeats":7500},{"count":74767500,"lower_bound":"MTk5OC0wNy0xNA==","upper_bound":"MTk5OC0wNy0yNA==","repeats":30000},{"count":75000000,"lower_bound":"MTk5OC0wNy0yNQ==","upper_bound":"MTk5OC0wOC0wMg==","repeats":15000}]},"cm_sketch":{"rows":[{"counters":[62623,31290,62157,31150,62319,31314,0,31422,93717,31321,156009,30980,0,31128,0,31068,62350,0,31071,31005,31092,31153,31248,31379,30885,0,0,62496,30961,31334,0,31301,30973,62350,31147,0,0,124265,93614,0,93763,31240,31320,62018,62687,62633,93669,0,62222,0,30887,0,31062,62424,0,62898,0,62151,31023,31138,0,93927,0,0,0,155579,62508,30973,31047,30968,0,31203,93571,0,31353,62618,0,0,62429,62673,0,31386,31595,93792,31047,62541,31132,31040,0,62450,93512,31144,31222,62075,0,31269,30961,0,0,0,0,0,0,31120,62192,0,0,93186,31305,0,62246,31393,31264,62301,0,31289,0,31067,0,62083,155825,31350,0,124496,0,31167,62195,156427,0,30868,62432,62860,93302,0,31303,31137,0,30914,31062,30952,31342,62670,62559,0,0,62569,0,62479,31225,0,31056,31069,31348,0,0,0,0,62222,62213,0,0,0,30958,0,0,62552,93549,62127,0,31266,62444,0,62131,31150,0,0,62483,30905,0,31055,30991,31258,62271,0,0,62462,30990,0,30986,31224,31483,124598,0,31145,0,0,0,31271,31308,30896,30867,31207,31698,0,31181,124728,62354,31127,31103,30973,93332,61960,0,0,31029,62373,31060,0,61949,0,62463,62437,30821,31034,31359,0,124709,0,62225,62647,62453,62481,62416,93392,31367,62549,0,0,62311,31245,0,0,31216,31439,31393,0,31314,0,0,62285,31164,62267,0,62106,155451,31416,93802,0,62142,0,30822,0,31199,62403,31324,0,31488,31471,62431,31282,62198,31086,0,62349,62400,31451,0,93775,0,30894,31190,31474,0,31292,31109,62379,124564,0,62572,124792,62402,0,31160,0,31163,31106,62248,93288,31450,62454,124242,61966,0,30971,0,31468,31453,0,124345,31043,31035,31411,62743,0,124843,31333,31111,61879,31147,31132,62099,0,30881,31436,0,31204,0,62088,31198,63035,31150,0,62081,31099,61930,0,0,0,0,62367,0,0,0,31124,0,0,62601,0,62265,62125,0,0,31231,93713,0,0,31025,62154,0,62285,93559,0,31300,124652,62460,31121,62126,30968,93621,92747,31050,0,31303,0,31218,0,31260,0,31347,124977,31118,62324,62820,31239,31187,0,0,31243,93387,94317,31356,31387,0,31379,93464,0,0,31172,93835,62652,0,0,31391,62622,31032,0,0,124530,62394,0,0,93557,0,93820,93159,31014,31089,0,0,93193,31264,31303,31421,0,31435,0,0,31019,0,31099,31284,93424,0,30897,31182,0,62778,155681,31375,62272,0,31452,30995,0,31074,31142,0,0,62373,31106,62576,31021,0,93484,93096,0,0,0,0,0,0,0,0,30800,0,0,0,93711,31130,62067,31139,31040,0,0,0,31458,93381,31368,0,0,0,31397,93132,61820,93967,62696,30854,0,0,0,62155,62380,30904,0,31019,62316,0,0,31319,30959,31133,30791,62602,0,62770,62551,62375,62353,93381,31041,31206,0,62046,31264,62305,62196,0,62402,124457,31178,30985,62225,0,62540,0,0,31151,31269,0,31002,0,93676,30862,31150,31268,31306,31447,62211,31301,62265,31285,31288,31231,30948,0,186797,0,0,0,31007,31184,124883,62617,0,31358,0,30993,0,62543,31225,31277,31277,93976,62590,0,62445,0,31451,93344,30904,0,30803,62120,30786,31200,31409,31362,31154,93215,31291,31400,93000,0,31517,93892,31249,62601,0,31298,0,0,0,31376,31070,30822,0,30918,31394,62664,31083,31050,62375,93630,31218,62240,62273,0,30821,0,0,0,0,0,93361,62571,0,31062,31378,62713,62374,31154,31332,0,31485,0,30809,0,31125,62257,31060,0,0,0,30960,30929,125052,93196,31463,0,0,93047,0,31392,62356,62223,30859,31380,30980,31186,0,31398,62431,31484,0,31109,0,31185,62619,31337,0,31301,0,0,0,0,31051,61957,93564,61978,31204,31130,62487,0,62732,0,0,0,31164,124767,62335,62523,0,62569,31284,31174,62230,31363,62458,124841,0,30932,31166,31088,31288,31080,31171,62055,0,31207,31012,62123,93939,0,93260,0,0,62643,0,31050,0,62372,31292,0,124562,0,31033,124805,30991,62043,0,62234,0,0,31023,123976,62323,62651,30967,62757,31264,31197,62271,0,30968,0,31415,93439,31118,30809,31250,62598,30997,125294,62556,62956,62566,124834,62952,31555,31052,0,62326,0,62315,0,155600,31236,0,0,0,0,31476,30878,31234,0,92922,125122,0,0,93611,0,30985,30987,0,0,31439,62448,62304,0,93925,0,31371,0,93071,31075,31091,0,93786,31257,31123,30969,187808,0,31025,31230,31172,0,0,61964,31256,0,30994,0,31441,62118,31185,31182,31447,0,31093,125083,31044,0,0,30894,31127,31020,30834,31117,62269,0,0,0,31281,93600,62076,31542,62102,31055,62263,0,93972,0,125198,0,31204,31247,31314,93889,0,30934,30964,62922,62333,0,31006,31084,31383,0,31081,31455,31010,0,62506,31376,93538,93680,0,0,30801,31224,0,31456,62382,62264,0,0,125324,31109,62370,31289,0,31371,62642,30801,31204,31467,61932,31215,31324,0,31307,0,92886,31176,31221,0,93307,0,62286,0,0,30920,31295,30933,0,93481,31173,0,31098,31331,62162,62409,31091,62175,62394,0,62195,31456,62065,0,31213,62090,0,124803,0,31372,61584,93817,0,31320,31339,93563,0,31497,31130,123832,62065,31066,30845,62104,31298,31134,31404,61904,62268,62456,0,30749,62181,0,62083,31176,62360,31360,93094,31082,0,31295,31254,0,0,31221,30914,0,62245,0,31112,0,93742,30847,31248,31185,62193,31068,0,62342,93994,124127,0,0,62448,0,0,0,0,62428,62535,31495,31319,31364,31000,93148,0,31079,31042,31110,93989,61932,62327,31426,61744,93484,0,30973,30833,0,0,31247,62345,62493,0,62268,31330,31093,31225,0,0,30988,61677,31466,30794,31114,31295,31224,31079,62345,62405,0,31384,0,31130,31323,31329,0,62128,31155,93646,31090,93888,62499,31236,62653,0,62254,62463,0,0,31091,62130,0,62287,30969,0,30910,31015,30859,0,30868,0,125155,31147,62656,62065,62271,125166,30987,0,0,93172,93779,31070,31360,188005,62628,0,62611,0,30709,62457,0,92967,124438,93814,93182,62117,31298,31198,62331,30934,31025,31310,62320,62316,0,31015,0,30958,31240,31438,31150,0,31178,62248,93714,0,0,31357,0,61935,31210,62382,0,31090,62129,62442,62354,31189,30898,31043,0,31383,62403,0,62253,31200,62449,0,62562,62683,62125,0,31081,62364,62370,31085,62367,31217,0,62624,31146,31166,30925,0,30938,0,0,0,62147,31095,0,62574,93843,0,30987,31099,0,93588,0,31521,62237,93428,62645,31169,31106,0,30804,0,30971,31082,31331,0,62473,93755,62031,62240,93818,0,31053,0,31336,0,93506,0,0,0,0,62812,62003,31410,31168,62329,124407,62768,30937,31177,0,0,93335,62297,0,31108,31031,62369,62056,31187,0,62576,0,0,62139,31070,31266,31168,62739,0,0,31597,62653,0,62263,0,93921,31241,155698,31341,0,0,31474,31081,31190,61965,0,30976,31097,31209,31228,31115,62266,124800,30930,30853,123791,31104,0,31086,0,31444,31182,62804,31269,30939,0,62332,0,0,63097,31064,61813,31321,62510,0,31351,62344,93858,31363,94107,0,0,93685,0,62519,0,0,0,62510,31314,93152,61889,30875,0,0,62631,0,0,93295,62562,0,62413,62322,93759,0,124068,30996,31088,0,0,31006,31040,31053,93288,0,0,0,0,30880,0,61815,61940,0,31146,31358,62220,62406,0,0,31074,0,30817,0,0,61781,62023,94295,30953,62656,61815,31231,62800,63095,93271,62716,31270,0,31149,0,31394,62391,0,31104,31126,31193,31195,0,30807,31155,0,31122,0,31270,31165,0,31479,62197,31131,31290,30963,186640,93301,0,31258,0,0,93620,62582,31246,0,62434,62292,0,0,31133,0,0,62372,62426,30997,31127,31194,31033,0,31203,31194,124606,31148,31269,62316,93508,62042,62473,62457,0,0,0,31392,62235,124549,93542,62501,93896,31241,30972,62453,61949,31386,62485,62557,0,31000,93350,93516,31074,93674,0,62276,31491,0,31189,0,0,93117,30941,0,0,31118,62461,31259,0,61610,62253,31360,0,124088,62107,31156,62510,0,0,62523,93517,31381,0,0,0,156056,31277,31513,93626,0,93670,0,62265,0,31057,30897,31253,0,62537,31121,0,0,0,0,0,0,0,93535,0,62295,31233,31304,31040,62269,31270,0,0,0,31014,62509,0,31193,62055,31337,124648,31194,94025,62397,31036,30819,124674,0,31025,0,0,62227,31318,31076,62338,0,0,0,31395,62448,31166,62433,31320,31127,31259,62504,0,0,31083,30679,0,62352,93502,31220,30934,0,62519,62402,156456,31163,0,62442,30917,62238,124442,62827,31135,0,30986,0,31241,0,31182,62044,124627,30763,31169,31069,62072,0,31378,93648,30967,0,62461,31074,124388,30941,155583,31022,31133,93456,0,31172,31010,62469,0,31207,62604,62079,62418,0,31087,31236,31365,0,31395,0,62707,31217,92922,61843,93343,124166,124239,62200,156223,30898,62153,31467,0,62677,93581,30934,31291,31340,0,0,62281,62279,31722,62482,93802,93022,31061,93310,93139,31132,31053,62378,30984,0,0,124362,30910,0,93336,0,0,31080,31104,31483,31168,93566,0,0,31232,31258,0,31202,31288,93784,31441,0,62641,0,62989,0,31025,62156,62476,31160,61955,30875,0,0,62413,0,62810,0,31121,0,0,31043,30918,0,31037,31223,0,0,61961,0,62566,62226,30841,0,30910,31103,30843,62538,62419,31204,31267,0,31165,0,30993,31214,31193,124992,31225,31237,31290,62161,0,62010,31331,61979,93500,31295,0,93570,31214,0,31271,62631,31321,62307,30971,31065,31240,62821,62286,0,62368,0,30958,31152,31153,31142,94083,31480,62369,31058,31384,31210,31036,0,31384,0,31274,0,0,0,31343,62371,62598,0,0,0,31075,0,93230,31032,124410,0,0,31258,62715,31407,31030,0,31100,0,0,31033,0,0,93746,0,0,124995,31021,93546,62499,0,31175,62383,0,61743,93887,62237,0,0,0,0,61975,93226,62353,62446,0,0,125188,62424,62373,62506,0,31125,0,31347,31533,62158,62234,31087,30957,31107,0,31519,62433,62128,0,31091,0,31123,0,93492,93307,31452,62362,93358,0,62416,0,0,31103,0,31043,62525,31552,31321,31140,0,31124,93586,31243,0,0,0,30937,62503,0,31145,0,31115,0,0,0,31282,94084,0,31487,62370,62740,62379,0,0,0,31119,61918,31082,62216,0,0,30983,31418,0,0,0,0,31393,124462,31137,62642,0,31117,62264,61948,62014,31273,93587,31341,31144,31343,62491,155686,0,31224,93760,31373,124711,62153,0,0,0,30999,0,0,31270,30841,31537,62426,0,31419,62393,0,0,0,0,31074,62232,0,0,31347,93068,0,31205,0,0,0,0,0,0,0,31284,0,31255,31200,0,30967,31445,62338,30866,31382,62556,124668,0,31089,31536,62415,62344,0,62374,0,62273,30767,61953,0,30903,0,0,62173,31156,0,31328,61995,93670,31088,0,62863,31272,124305,62382,31024,31244,62526,31310,61903,93011,0,31235,31417,0,31131,31329,0,0,0,0,0,31082,0,31169,62044,0,31259,31057,31351,31412,62754,218585,62515,31188,31222,0,31172,31278,62492,62303,31178,31614,124142,62617,0,31052,31252,31078,0,62251,31514,0,93437,0,93675,31198,0,0,0,31292,31587,93235,31366,0,31150,0,124593,0,0,0,62189,93563,0,0,0,93357,31102,31091,0,62441,30993,31260,31466,31219,62192,0,0,30820,93889,62447,93381,0,0,62211,62160,0,62179,62533,0,31294,62558,31025,31305,31029,0,31221,31213,62420,31128,93164,31053,31263,62212,62638,31330,62378,62424,93374,30893,0,93313,31075,31314,0,62171,61927,31081]},{"counters":[31382,125388,62086,31033,62251,0,0,125019,0,62185,31322,31441,31147,31490,30878,0,30957,0,0,31318,0,31363,62344,30848,31063,31009,0,31131,62470,31451,31326,62496,0,62219,31254,62348,125209,0,0,0,0,0,0,93514,62148,0,124794,31301,31193,62455,0,61826,62165,0,31563,0,124852,61903,30790,31184,0,93042,61970,31147,0,62430,0,31102,0,31200,62414,0,0,0,62225,92932,31118,0,31419,31247,62639,62813,93790,31089,0,0,30944,30996,62725,0,0,62604,62288,30699,31031,31122,62388,30991,30986,93726,31163,0,61974,31025,0,0,0,62021,62324,93392,93659,0,61818,0,30833,31080,31288,31159,0,62360,31095,93183,94128,62060,0,62348,31117,93898,0,0,0,31308,0,62286,0,31095,62539,0,0,31105,31004,31254,31148,31435,155142,0,61925,0,30993,0,0,93618,31467,0,0,31402,0,31325,0,0,0,31145,0,31138,31266,62834,62726,30959,31059,0,31107,62463,62522,62541,93676,0,0,62522,62274,31008,0,62414,93672,0,0,31284,93298,31150,31140,31233,31331,0,31393,62692,62140,93528,62240,0,0,0,0,31043,31309,93193,31429,62545,31067,61837,62427,0,0,0,62023,31014,31276,31156,31292,93395,0,0,31214,0,31292,0,31050,31246,62434,0,31316,62274,62255,62426,0,31284,62301,124655,62234,0,0,62425,31094,0,31061,31466,0,62456,0,0,93102,93690,0,0,62627,0,0,0,0,30920,62441,0,0,93340,31185,31182,62625,31249,0,62146,0,31453,0,62370,31245,30994,0,0,62035,0,0,125310,0,31017,0,0,0,93719,0,62137,0,0,62614,0,62288,62237,31152,62380,31184,0,31298,62215,61910,0,93694,93366,0,0,62870,0,0,31303,62378,0,0,0,31382,30904,31317,62594,31458,0,30893,31284,0,31109,0,0,93989,31140,0,31214,31451,93179,31051,61997,124707,0,0,31317,62732,93587,31009,30854,30892,61810,31094,30914,93530,31373,31110,62461,62552,0,62197,31160,0,62337,0,0,31250,31195,30986,62639,0,94083,93624,94017,31324,31258,0,61942,0,0,93447,62328,31137,0,31179,62495,0,62237,62949,93401,31207,0,31078,31211,0,93666,0,31259,62332,31048,0,62386,31166,62453,31248,62606,124707,62067,124099,31133,0,31406,31169,31016,62073,31019,0,31145,31277,62395,31290,31155,93222,61994,31495,30901,0,31315,31337,0,62650,61974,31354,62426,62331,31232,31379,0,62331,62275,62207,31157,31204,31104,93423,31285,62430,93732,124637,31171,0,30831,123897,0,0,0,62152,31218,0,31250,62374,0,31395,31150,31270,0,31394,31074,31270,31093,93426,31138,0,31361,0,62360,31151,0,62110,0,0,31021,124596,0,62455,31210,0,62222,62504,31399,31375,31209,31084,0,0,62576,0,62489,125359,0,93666,62085,31034,0,124297,31124,62230,62672,0,0,93210,31038,124480,0,62577,62290,0,93922,30938,31357,0,62669,0,93649,31122,62146,31268,31237,31174,0,0,124943,0,93767,0,62408,31444,0,31097,31007,125269,0,62224,31319,62495,62310,31173,31291,0,31340,62279,61835,0,0,0,62101,31247,31195,62177,62142,0,0,30791,31066,62667,62352,0,0,31124,0,31118,0,62760,0,0,31117,62218,62350,93800,155909,62506,62308,31251,31021,62133,93512,0,62562,93772,62375,62456,0,0,93850,0,31353,62258,62812,0,0,61954,0,31053,62617,0,62364,124668,0,62292,62041,31310,62180,93740,31284,31203,62236,61628,93236,62130,31355,31118,0,61807,62555,0,62599,30908,31288,93982,61921,0,0,93911,31024,62074,93194,62038,31722,0,124913,93171,62175,93657,30987,0,0,31190,31298,62074,0,0,30865,0,30864,0,62344,0,0,62669,31029,62814,0,31104,31484,62672,61974,93762,62478,31027,93422,93743,31176,124530,30991,31354,0,0,62241,31249,62456,31163,61796,0,62555,31294,0,0,62395,0,0,0,0,31043,125785,0,31360,0,31472,31337,31294,62247,0,93704,0,0,0,0,31434,0,30847,30763,31175,93435,0,31248,31337,31225,0,0,62244,62151,62165,0,0,0,31308,0,156321,124903,0,93572,0,0,31565,62425,94159,61902,31246,93734,30927,62204,0,0,62110,30897,124688,0,124982,31536,62211,0,93669,62226,0,0,124064,62403,30820,0,0,0,0,0,0,31483,93157,62120,31343,31122,62467,62740,62017,62171,31241,62610,31244,62808,62417,61887,31318,31030,31067,62464,0,62155,0,93301,31055,0,31106,0,0,31253,0,31210,31086,31128,31299,30939,186021,93214,31397,31030,0,31187,93477,0,30865,0,0,31084,0,31055,0,0,62228,62665,31076,62824,62228,0,0,31001,30868,31041,62428,61939,62390,31077,0,62644,30856,62529,0,62174,62321,31074,156226,0,62287,62873,0,62164,31488,30884,93501,62481,62176,93126,0,62631,31523,0,31116,0,93226,0,0,31099,0,62482,61976,31291,62651,62288,124547,0,93452,31269,62080,31414,0,62228,93459,62484,30939,62358,124274,31320,0,31123,31221,0,31248,31404,30863,93666,93851,31240,0,30929,62182,31321,31442,0,93613,62718,62698,31035,0,0,0,31150,31010,31232,93080,93439,62493,62090,31017,124804,156098,62752,0,31150,62399,31125,31138,0,30996,31127,62726,0,93184,30998,0,0,62568,0,30917,0,31032,62161,30980,0,93788,0,31409,31236,31125,0,31354,31109,0,31244,31290,62028,62299,62442,30983,0,62106,31412,62460,31034,62388,62504,62107,124581,0,0,31259,62486,0,31384,0,62091,31336,31030,31311,31017,31514,31359,0,31168,0,0,31289,62268,0,93232,0,0,62332,0,62004,31153,0,0,0,31164,31327,0,31010,0,0,62473,31162,62617,62521,93258,0,0,0,30992,62283,30973,31287,31009,61981,31360,62639,0,62117,31387,0,0,0,31113,62326,62476,31169,93644,62589,0,30784,62641,0,31050,0,0,61920,0,0,0,0,93375,0,31199,93213,31348,62591,93143,31065,30952,31344,93980,31144,93426,0,31330,31237,93527,93617,0,31200,0,0,31347,0,0,0,31106,31152,0,0,31267,30896,0,93619,30966,62357,93171,0,0,0,0,93676,31355,124540,94145,0,0,31478,31383,31427,62392,94128,31170,0,93347,93628,0,0,31243,0,0,0,31221,30899,62639,93591,62342,93284,0,94018,0,0,0,0,93590,31389,61908,0,93297,0,31207,124025,62382,62228,62439,62143,0,31069,31226,62511,31194,0,31146,31200,62299,62112,31098,62406,30869,30983,62479,31175,31045,62055,0,31046,31178,30819,0,31273,31241,0,31204,0,31556,62079,62238,0,93482,31317,0,62144,94309,0,62782,62655,94031,187342,31177,94035,62283,0,62317,62297,0,0,0,0,31237,31303,124295,62068,31189,0,93440,124612,31169,62502,93640,0,93242,31129,62549,62394,31485,62009,0,31031,0,61913,30981,0,31505,31106,0,30971,30999,31597,31024,0,0,31203,31005,30969,62091,31162,31091,62297,0,0,31313,93958,31382,30994,30803,0,0,0,31247,31104,62166,0,31355,0,31393,186979,31042,0,0,0,0,31117,61986,0,62105,62398,31137,124489,93112,0,124075,0,93514,93246,31013,0,124931,62043,0,31043,62340,31347,125481,31215,62066,0,62406,31146,30934,31187,31053,93377,31124,62493,93525,30958,62446,31198,0,31165,31145,0,31376,62305,0,31346,31258,31192,124934,30904,62506,31178,0,0,0,0,93896,0,124608,0,0,31068,0,31075,93433,62588,31075,0,0,0,62261,62200,31206,30859,0,0,31185,31137,31292,62484,31025,0,124440,0,31298,0,31178,31288,31207,92986,62462,31104,62342,31577,0,31081,31325,31183,31244,93437,62204,31186,31176,0,93177,0,30978,62383,31011,62436,93532,31027,62874,0,30929,124586,31023,31362,62458,0,31181,31021,31394,61860,31392,0,0,31241,62625,0,31279,0,31333,0,31240,31336,62258,0,31206,31100,30905,0,94211,62451,62263,0,31118,31224,31149,61832,0,31114,93604,31169,0,62024,0,0,61842,0,30872,62798,0,31296,0,0,0,62336,31207,0,0,31170,31254,0,125236,0,0,31221,0,187385,31011,31267,0,0,0,31215,31261,31259,31194,0,62243,0,62266,30976,0,62517,31334,62275,31192,62150,0,62522,30906,30912,0,62533,62346,31017,0,93980,0,31013,62309,31080,62547,93194,62299,0,31308,31014,31478,31074,31259,31344,155910,0,0,0,0,62188,0,62469,30836,31595,62496,62418,0,93542,0,31466,124857,62815,62178,62009,62349,92919,0,31319,62446,62385,0,62328,62304,0,31366,31155,0,0,31166,0,93239,0,0,0,155760,61885,31184,0,0,31033,31220,31254,30994,0,31137,31071,62466,0,0,31485,0,0,31528,0,31183,0,62338,31356,62433,30801,31114,93580,124483,31033,31115,93485,0,0,62644,62289,0,31088,31676,31322,31351,62741,0,0,0,30876,62456,0,0,31144,62264,93022,62674,31061,0,30914,0,62067,0,30918,62094,31211,0,31166,0,31205,31358,62677,93649,93874,93540,31231,0,31160,62705,0,31061,0,31194,0,62550,93905,0,62667,0,31207,62593,62026,0,31208,62377,0,31325,0,31468,0,31378,62098,93291,0,0,0,94084,31076,93194,0,31165,31232,62829,0,61878,62365,0,30921,0,0,31189,62251,0,0,62362,93572,31236,31105,31234,0,31292,31085,62778,61898,0,31307,31099,0,62664,0,30958,0,62332,30666,31290,0,30973,31119,0,61924,31411,0,0,0,62255,0,31220,30935,62219,31241,62141,31180,62628,30821,62154,30987,31319,0,62447,62358,31255,62411,0,31184,31266,31135,62233,0,0,0,62526,62269,0,0,31318,31369,0,30591,0,30983,31128,31575,93614,31303,0,0,0,0,93479,0,0,31057,0,31113,31262,31002,31455,0,0,93476,31061,62681,31185,0,124826,31147,31075,124517,0,31029,61984,31483,31264,0,0,30844,62372,31347,0,62232,31467,31067,0,31378,0,30923,31035,0,0,31262,62743,31188,0,62287,62036,124370,31062,62482,31498,0,0,93359,0,0,31221,0,31149,62265,31111,31297,62119,0,31164,0,0,0,61926,0,62155,31106,62548,93429,62604,0,62651,30881,0,31231,62775,124572,31314,0,61790,31220,31053,0,125221,61981,0,94053,31256,92902,62624,0,0,30887,31060,31203,31383,30880,124953,31259,31093,30996,31245,0,30992,62763,31083,0,31055,0,0,0,93776,31286,124438,93320,31347,31238,62056,0,30942,30885,0,0,31369,31212,0,62453,31257,62625,0,187052,61904,0,31081,0,0,93321,31033,0,0,0,0,31216,31194,0,31053,0,62588,62517,62168,62464,31062,93790,93622,0,30885,0,62205,0,124859,62099,31449,31015,30980,30899,31146,0,0,0,31252,0,31254,0,30972,30908,62687,62709,62659,31061,0,0,31230,31447,31240,93038,31416,62564,31345,30836,0,62237,124936,0,94047,0,0,62789,30842,31132,93446,62748,186906,31120,30911,93087,62730,0,31144,31215,31433,31331,62394,31118,0,62249,30925,31418,93333,0,31126,31235,0,62320,31341,31453,93493,93776,93590,31053,0,0,0,0,31447,0,31094,0,61850,30941,93302,0,31310,62233,62520,31079,0,31164,93406,30794,62099,0,31097,31030,61960,62366,31192,62042,0,31359,61846,31105,31294,31179,31069,93119,62477,0,31186,0,31120,62194,0,0,62446,31049,0,30983,0,31264,0,31121,0,31188,31390,0,0,31008,31330,62357,93578,31249,30880,0,93672,30959,0,62169,31110,31291,0,31187,31001,31454,93872,94192,31145,31110,62591,93704,0,0,0,62455,62212,62252,0,31229,62356,0,0,62579,62011,30850,0,61885,31261,0,0,31153,0,0,62218,0,93856,31035,93383,0,31365,0,62170,62578,0,0,93136,31357,31414,31082,31110,0,62450,31052,93460,31268,0,0,0,62207]},{"counters":[0,31246,61926,31068,92880,93290,0,0,30988,0,62346,94076,31321,31087,93287,31036,62430,62374,0,0,0,62037,0,30911,30986,0,0,0,31003,94062,0,62530,31233,31420,31082,0,62379,31285,62688,93389,31133,31195,62370,31083,62299,0,0,31067,93949,62405,30900,31392,30815,62484,124203,0,62108,93638,31325,31415,31154,124581,93783,62589,62596,62323,0,62197,31003,62748,0,0,0,62238,62325,62626,0,62624,31308,62390,31132,31395,62421,31015,31300,62179,62990,0,31372,0,93495,93910,0,61917,31221,124244,31114,0,0,93580,0,93699,94002,93898,62398,31271,31279,0,31094,30724,0,0,30801,31093,30987,0,93233,62309,31233,0,31236,30966,31445,62380,0,30960,124514,0,31195,62227,31097,125038,31077,62133,31087,62420,0,0,93611,62147,62596,0,31194,31204,31311,125354,0,31048,93186,0,0,62441,31215,62109,62280,31139,0,31012,30863,93779,30809,0,62212,30948,31199,62337,31140,0,31247,31380,0,0,31450,93865,31206,0,0,0,0,31012,31057,0,0,0,31483,31102,0,31023,30865,31240,31122,0,31159,93486,156389,30966,93458,62098,0,31053,0,30989,0,31169,93824,62321,30960,62418,31067,0,31099,62230,31107,0,30987,0,62654,31439,0,62512,31151,0,31494,31276,0,0,93009,0,31267,31234,31324,30880,31303,124971,31339,93593,31497,0,0,62219,62295,62125,94261,0,31497,31320,62603,62394,31179,31324,31141,31409,62008,0,0,0,0,31451,0,62358,31277,30952,0,31352,31075,31153,124450,0,0,62608,30910,31125,93327,31175,31207,93707,0,0,0,31033,0,30996,31076,30837,0,31281,62213,0,0,30845,0,31118,93313,0,0,30905,0,31333,62273,31132,31456,62359,124715,30958,0,124554,62319,0,31223,0,31247,62297,31088,0,0,93609,124335,31384,31103,0,124275,31162,0,0,62564,31025,31220,61789,62103,0,62621,62148,0,0,31152,0,0,93436,62285,62724,31356,31172,62365,0,93249,0,31005,62322,31106,62511,0,61883,30903,124256,62322,93078,31483,0,62267,62353,93160,31040,0,31122,62479,62566,62641,0,0,62057,62266,62445,31063,62527,31062,30957,62128,0,0,31221,0,0,31314,0,0,93537,0,0,30897,0,0,31185,124975,62375,62041,0,30991,0,62068,61824,31238,62519,31019,62260,124667,31249,62455,31011,62346,62025,31091,0,93735,31239,0,62419,62483,62367,31375,31288,31152,31083,31153,93487,62384,30964,62632,31055,31238,31291,0,62055,31113,31273,0,0,31170,62475,0,62019,0,31330,124883,31087,31181,0,62447,31290,0,0,0,31365,0,62193,0,62504,31208,0,0,31371,0,30942,0,0,31145,62675,0,31115,62473,31144,31140,62312,62595,31053,0,0,31360,62222,31092,31108,31381,31117,0,0,30948,31491,31247,31295,31436,62422,62714,0,0,93686,31110,61905,0,31119,0,31319,124545,62589,62499,0,0,0,31296,31099,0,93436,31245,0,31467,62482,31039,31330,62251,0,0,30989,62314,31082,31113,62352,62282,31382,0,31384,92972,31087,93862,31211,0,0,31146,31139,31088,62163,0,31265,31011,62500,31137,0,62454,0,0,31298,31196,0,93562,31040,31477,93252,31198,31080,31045,31218,124743,31471,62309,31054,31249,93256,62144,30683,31468,93721,62169,0,30987,0,0,31030,30812,62326,0,0,62093,124507,0,62422,61801,0,31057,31147,31294,0,31444,0,31124,0,0,0,62690,62109,0,62645,124578,31081,30880,155858,31095,0,0,0,62738,62279,62790,62645,31193,31041,31393,31072,0,31136,0,0,61918,93535,31376,0,31215,0,31251,62441,62729,0,93208,30869,31500,30944,31118,31355,124473,31240,31221,31252,62291,31245,0,0,31394,31022,0,62582,0,62145,61801,30893,62305,31241,0,62147,0,93290,31114,0,31484,31051,93318,0,62092,30994,31296,30929,0,62237,0,62749,0,0,93527,0,186911,0,62682,93490,30938,30938,0,31150,0,31360,31323,62241,31035,31209,30991,0,31549,31044,0,31163,62592,62168,62296,62129,31162,0,0,62634,30790,31040,0,62603,0,0,31363,124667,62248,31530,0,93262,62542,124485,0,31169,31435,0,31292,31001,0,61951,0,0,31231,0,0,0,0,30930,62616,62791,62344,62664,125279,93165,0,62186,0,62666,0,0,62480,62324,31183,62247,62547,93335,0,93812,62105,0,62515,62496,62078,31397,93814,31331,0,0,31482,0,0,62130,31014,0,0,31319,31159,0,62155,31025,62410,93960,31147,93465,0,0,62339,62604,93406,31233,31031,30969,31182,62463,0,62178,0,0,62414,31385,31158,0,0,62090,30990,0,125124,31191,93420,31061,31236,31436,0,62180,0,62577,31068,62927,0,124466,31043,0,31296,0,30908,218315,31299,31137,61970,31165,62438,0,31017,93544,0,62492,62308,31121,61961,31379,0,31167,30875,0,0,62452,31260,0,0,93457,0,30993,62722,31402,0,31208,62201,62160,62330,0,93180,0,31559,31225,31137,62368,31241,62457,62086,31035,93844,0,62194,93905,93168,31334,0,93003,31195,0,0,187672,31205,31005,31224,0,0,62437,62510,125068,31104,31167,0,93636,31105,31376,0,31184,0,0,0,0,30905,0,93254,62406,93077,62249,0,62652,0,31330,0,0,0,125087,31061,0,62270,0,93429,0,0,62549,31314,31008,31272,62116,0,31333,31210,0,31355,61852,93425,0,0,62272,0,124224,93510,30897,62293,0,62487,93681,0,93518,93550,31101,62375,0,31045,62425,0,31357,31449,31020,93514,62453,62320,31110,0,0,62267,0,0,0,0,62151,31225,0,31388,125118,0,31002,62274,0,31354,93431,31124,0,0,0,30709,0,0,31076,0,31274,31078,0,62755,31116,31153,31021,31698,62576,0,62701,31121,62036,93171,156568,31017,0,31395,62153,31336,0,0,31184,92915,31322,0,93804,93171,0,0,0,31049,0,62290,31106,31028,0,31119,31228,0,0,31289,30978,30899,0,0,31075,31145,0,62589,31359,31050,0,31200,62449,0,61962,0,62500,92821,31021,31584,0,0,61975,30927,125516,31120,31287,0,93489,31214,0,93314,93270,62492,93336,31210,31093,0,61838,0,31345,0,31062,0,31272,62468,125136,0,62503,0,0,31272,0,0,0,31185,31430,0,0,0,31277,61992,31389,31157,0,0,62622,31057,0,93418,0,31075,93997,31061,62215,93617,93433,0,62009,31087,31397,0,62331,31224,0,0,62552,62519,31145,31168,0,0,62570,31145,0,0,0,30926,31147,62137,31162,0,30896,0,31179,156298,93234,62551,30825,0,30843,31337,0,0,31360,31302,30809,62050,31305,0,0,0,0,62303,0,31294,31216,62400,0,31095,124741,31319,31120,62116,0,124531,30881,62687,62361,62712,0,0,93259,31519,31127,31200,0,31190,62107,31118,30910,31536,0,155365,0,31483,0,62237,31597,0,31247,62473,0,31177,0,31320,62087,31290,31185,62481,0,0,62282,92876,31115,0,92957,0,0,93887,62242,31192,62646,0,31306,31147,62121,62402,31306,31179,62499,31452,125235,0,31178,31186,124588,187494,0,62331,0,31178,93635,62273,63060,0,62537,0,31004,30822,31335,62581,0,31355,31292,31413,62527,62180,93411,31098,62300,62391,61988,31278,30894,0,125095,0,0,0,93126,124583,0,0,93537,31426,62406,0,93296,0,31132,0,62392,31295,30904,31262,31099,0,0,0,0,62880,30875,62292,31249,62209,0,31421,62293,30993,31052,62257,31112,62155,0,31213,31281,31156,93724,30859,62416,0,156157,62279,31342,0,62226,31213,62547,31381,31178,0,0,0,0,31060,31175,62296,0,93490,31130,0,0,62028,62651,0,31211,0,62476,30884,0,0,62920,62499,30999,0,62205,0,31317,62519,62151,0,62100,0,31399,62102,62128,31338,30841,31219,31009,31104,31046,0,31307,0,62157,62102,0,62344,31258,31217,31437,62616,30976,30969,30763,31357,62089,62382,0,0,62396,62160,0,0,31414,62355,0,31150,30925,93184,0,0,31255,0,93252,0,0,0,31248,31270,0,62495,0,0,31042,93258,0,0,93951,31423,0,0,31104,31398,0,0,0,31317,0,62409,62248,31204,62465,0,62189,62440,62503,93487,0,31435,93200,62380,0,62338,61906,93843,31167,0,31306,31206,93378,62325,0,62117,0,30961,62128,31247,0,124998,62619,62494,0,62630,0,62055,31013,30983,31204,0,31118,31137,31259,0,31203,0,31033,0,31394,62238,0,31210,31088,0,0,61763,61954,31134,62313,62258,0,0,31260,62266,31306,31022,0,30681,93487,93496,30997,0,31351,31145,0,93408,31314,0,0,31260,93714,31333,0,0,31024,62171,62804,31093,62589,30919,93304,31369,31101,30866,30938,0,0,62276,31270,30934,0,30984,62189,93153,31134,0,31306,30610,93390,31003,31029,30995,0,30828,31095,31169,31557,62683,62942,0,62615,31510,30892,0,31312,0,0,0,0,155551,31276,124248,62621,31125,0,31254,31224,31279,31221,62604,31041,31144,0,62575,93027,0,31011,93413,62238,62291,31385,31253,61969,30977,62483,0,31241,93605,62227,62745,93643,31298,61900,30922,0,0,0,0,31121,31261,31067,0,0,0,31318,93050,62392,61910,31182,0,0,31025,31104,31268,0,0,0,31130,61998,31013,62252,62637,62556,0,31031,30996,125209,93068,124628,0,31013,31349,0,30925,31417,0,30999,31017,0,0,31166,0,62230,30885,62054,31342,0,31215,0,31142,31323,93396,0,0,31155,30934,31263,30894,31287,31209,93590,31337,0,93573,93747,31407,93783,31128,62137,62318,0,31091,0,62350,31100,62563,31108,0,0,31017,31314,62702,93545,31116,31162,0,0,31060,0,0,92898,31485,31034,93039,93051,93380,31463,93770,0,31198,0,31376,62396,0,31282,30953,0,62406,62413,0,31334,61919,31103,62130,93560,31297,0,0,62368,31248,0,0,0,0,0,31214,93539,93329,31169,31355,62557,0,62425,62144,62275,31143,31360,0,93333,124705,62119,31176,31124,0,31220,31203,31722,62367,0,31226,0,31172,0,31160,0,0,62536,0,62309,31034,31347,31362,31288,93442,0,31485,0,0,30967,31325,124562,31239,62115,31103,30699,0,62394,93387,0,31414,31090,31268,31471,31153,0,0,62638,0,0,62319,0,93646,31120,0,31332,93648,0,93658,62550,31155,0,62518,31351,62638,31406,30942,31291,0,93508,31123,31329,30906,0,31488,31218,62439,62187,0,62321,0,31246,31075,31125,31178,0,30898,62221,62262,31003,155786,0,31528,93689,62434,62459,0,0,62922,62775,62354,31382,31257,62289,0,0,31158,62410,62206,0,30806,31563,31040,0,0,0,62331,31447,31308,31514,31145,0,62249,124864,30748,62711,31460,0,62119,31430,0,31076,93489,0,31192,31298,0,61805,0,93323,31091,31112,31349,31088,31191,31276,62131,31320,0,0,62454,31168,0,0,0,0,62170,31176,31466,31172,62336,0,30988,0,31136,31241,0,30959,30847,0,31206,62345,31182,62306,125081,93675,0,30975,31475,0,93484,94015,31150,62250,0,0,62250,31346,62165,0,0,0,31300,0,31067,0,93803,124759,30993,31315,0,31580,0,0,31105,0,62410,61923,62106,62125,31248,0,62128,0,0,0,31098,30952,31195,124342,31310,93591,30920,124659,62327,31323,124640,156072,30939,31188,62142,0,31053,62466,0,31579,62182,30656,31058,31452,0,93409,31033,31007,0,31001,31354,31373,31321,31172,0,62391,0,31153,61957,0,30883,62613,93090,31384,124920,31334,62839,124580,62057,31279,0,0,62509,62335,94031,0,31425,31103,31337,62683,31118,31249,62181,31131,93776,31071,0,0,0,0,93720,31286,31023,93567,0,62441,62230,31236,31377,62687,62332,31075,30847,31213,62496,0,0,94220,31269,31214,0,0,30941,62474,0,62454,31614,62459,62929,62132,31058,155582,92969,62392,62338,0,31218,31043,31284,30784,0,31030,0,0,93904,0]},{"counters":[62218,0,186783,62441,155784,62018,62291,124227,125250,30666,124772,31254,93731,31614,93327,0,31567,0,0,31145,31118,0,0,0,93825,124903,62192,125091,31043,31347,31062,31105,0,93378,62250,0,0,0,62311,0,31213,31537,0,62617,0,0,62068,62548,62681,0,62904,30854,62804,93942,62577,31298,0,31168,125462,31271,0,62256,31447,0,93729,0,93507,0,31214,30834,0,0,62325,0,0,93426,93567,31072,0,93498,30990,31555,0,62313,31130,0,93039,62132,93631,31346,0,0,0,0,62028,0,93802,0,30906,0,31308,0,31123,30930,0,0,31174,31227,31195,62563,31277,0,0,0,0,0,31069,31238,31006,62208,31137,93616,31272,31595,31190,0,0,30991,0,0,31039,0,92994,0,93637,93212,31178,0,31169,31150,62386,31353,0,31463,124593,30938,62458,31298,62257,31399,62336,0,31221,30991,0,0,0,62283,62286,62259,31126,31466,31239,62377,31151,31357,31046,31183,31200,61867,31283,31139,31224,31050,31194,30865,0,0,0,31269,30974,124575,93630,93510,93277,31002,62291,0,30973,62480,0,30591,0,93131,61965,0,62556,61917,0,93644,61989,0,62238,62247,62563,0,31022,62390,31014,0,0,0,31099,0,62288,0,0,30964,0,94017,31381,31176,31310,125241,31385,31088,93597,31027,30884,0,62109,0,93810,62485,31395,31160,0,31317,62409,0,0,31182,62337,31460,31197,30812,62753,93355,0,30748,31095,62653,93552,62112,93201,124588,93435,62001,0,31112,30988,31445,31196,93902,62311,155848,93799,31037,0,0,62399,93913,31050,31468,0,0,0,62343,0,61686,0,0,31139,31003,62378,0,0,61994,62909,31205,92924,62273,31118,0,31420,62477,0,0,62713,0,31313,94071,93338,31102,31159,61996,0,62237,0,31074,62632,0,31158,0,62067,124746,62529,0,0,93381,0,30994,31268,31360,0,0,62444,0,31024,0,0,30763,0,31067,93249,31074,0,31171,62473,30910,31196,31133,0,31318,155902,31298,0,31052,0,93063,61992,124702,0,0,30905,30922,62484,62380,61986,0,31698,31015,0,62179,93500,62604,30794,31109,0,0,0,0,31369,0,62672,31237,31489,62431,0,31488,0,0,31533,93326,31319,31378,31132,0,0,0,0,62733,93513,0,30859,31195,62814,30968,0,62172,31062,31160,31306,62354,62720,0,62600,31530,31153,93000,31269,0,31157,0,0,0,31474,31162,0,62648,62380,0,31149,62593,30905,0,62300,31159,93690,0,31265,0,62905,0,0,62155,62430,0,0,31323,0,31048,93625,0,62189,62219,62151,0,30929,92739,31291,156207,0,31019,0,0,0,0,62192,30887,31206,31259,31453,31418,31270,124579,30957,31292,30910,31216,30928,62341,0,0,0,31441,0,0,0,0,0,0,31186,31204,62354,31278,0,31083,0,0,0,0,93164,62296,0,30845,31074,31411,31483,62731,0,30996,93577,93616,62305,31219,31269,0,0,31199,0,0,0,30891,0,31104,0,61857,31444,93971,0,31011,31256,62469,0,31058,62693,61976,30980,124574,62364,62586,31319,0,62286,0,92995,31336,62643,0,31257,31288,0,0,0,0,30919,62675,124339,0,31352,218220,31240,62244,0,61973,0,31047,31245,62270,0,0,124804,0,0,61887,92776,62643,0,63063,0,31324,31115,0,93345,31500,0,93397,94231,31127,31373,0,124624,0,0,62222,0,62085,0,93583,62153,62801,0,93633,125201,0,31369,61795,62404,31218,31419,31214,0,62447,0,31329,30923,62350,30992,0,31098,62305,62404,62411,31096,31383,0,62170,62457,0,93842,62214,0,93142,62226,31247,62221,31167,125009,62588,31066,0,93432,31580,0,31131,62151,62603,62069,0,62152,62649,31495,0,62474,62072,31420,62506,62056,0,62815,62678,31122,0,0,93360,62590,0,31333,0,93232,31484,0,124642,0,62166,0,62297,0,31007,0,0,0,31151,0,62321,62581,62116,93677,31142,31185,62481,31003,30992,0,31135,0,93139,0,0,31183,0,0,31300,31486,93803,93607,31045,62434,31054,31009,0,31131,0,93452,31279,62100,62103,31217,31444,187043,93074,0,31291,124245,0,62373,30899,61990,0,93354,0,31207,30880,31392,31416,31113,0,0,93402,31368,0,62409,31068,0,0,31206,0,31246,30976,30971,62059,0,31514,94160,62160,0,31587,31198,62520,0,31398,93368,0,31036,124467,62604,31466,124946,0,93660,61858,62671,62535,0,62090,0,31346,62539,31722,31045,31262,31288,62410,31160,0,31254,0,0,0,0,0,62086,31434,62604,31090,31196,31331,0,0,31298,31085,0,0,31358,0,0,0,0,62205,31148,31202,62336,62450,62584,62437,30986,62251,0,0,31173,0,0,31169,31536,0,31149,124842,0,0,0,0,31009,62531,0,30681,31146,31156,31080,0,93535,62531,31154,0,62138,0,124746,62330,62300,124275,0,30906,62128,93608,0,62162,31057,0,155710,62525,62376,31343,0,0,93819,30985,31391,0,31391,31182,31108,62483,31277,31211,31087,31435,30973,62840,31281,62302,0,0,30958,31091,0,62877,0,0,30991,31355,93001,0,0,0,30897,31200,31111,30892,62500,0,62149,0,31409,31294,62280,30809,93404,0,62544,30975,31078,31308,31130,62287,93274,0,62567,31409,31043,0,61965,0,62195,61942,0,93249,0,93530,30981,31147,31165,31345,124890,31004,31124,31138,0,0,62227,31023,0,0,31053,61841,0,31106,0,30961,31584,62491,0,31348,31497,62552,0,31351,62453,0,31321,62567,0,0,31198,0,62148,62471,0,31289,0,31133,31300,31325,31182,31079,93637,0,62478,0,30973,31233,0,0,0,31017,0,0,31386,31065,62097,62625,31412,61808,31323,62253,0,0,62458,0,0,0,0,0,0,31115,31130,31373,62580,30948,31145,31323,31341,62560,31118,31288,62169,62785,125235,31363,31088,0,0,62295,62839,0,0,31276,61991,61840,31166,62579,0,0,31255,30768,31127,31483,62161,0,0,93326,31206,62368,62125,62579,62363,30920,62249,156259,0,31250,62215,62320,62280,0,31442,31360,31436,0,125283,0,0,0,31206,0,62356,0,31122,0,0,0,31001,31177,30842,31260,0,31247,62398,31460,31172,31312,31322,31389,31325,0,31040,62156,62218,30967,31023,31321,31126,0,31131,31259,30841,31033,31253,31367,93605,31333,0,31374,0,31284,31219,62152,0,31153,124361,62315,62362,0,0,93684,0,0,62499,0,31069,62608,0,62635,31123,93423,62539,31377,30971,31203,0,62227,62037,0,31384,30872,31267,62045,62163,31579,31082,31116,31042,0,31152,31231,0,0,62610,62220,31178,0,62509,31208,62534,62681,0,0,0,0,62791,31397,31342,0,0,93484,0,62312,0,0,31080,30934,0,31118,62134,31087,0,62171,62444,0,31007,31098,156080,93822,62686,31357,0,31146,93566,62599,30975,62368,31078,62369,0,31318,62339,0,61909,31114,0,0,62278,31029,0,30905,30925,93666,0,30933,31314,0,62601,0,31312,0,61968,31191,124743,31086,30869,62531,30904,0,62303,62399,0,93709,93646,0,62406,92825,31177,31036,30993,31326,62294,31337,0,62279,31231,31025,30967,30876,0,0,31097,93173,31074,93227,31379,30847,61600,0,62435,0,0,61732,62794,0,62170,93323,92924,0,31125,61996,0,93148,62569,62282,61991,31075,62297,62111,31424,31595,31234,62276,30880,0,31122,31360,31035,31138,31244,31047,0,62225,31117,93522,31044,31188,31145,0,62452,30953,0,0,31125,62566,30918,0,93789,124652,0,93247,62335,0,0,31033,0,0,62614,0,31297,31417,0,124607,62323,0,62152,0,62585,0,0,0,93499,30997,62285,31109,62041,31014,31140,62579,93731,31132,186977,0,0,31029,62271,124211,31040,93316,0,31035,94132,31331,30994,31105,62373,93357,0,0,62232,31056,0,0,93082,0,31078,0,0,0,0,0,125152,30844,31141,31208,31236,31257,0,93189,62619,62597,31060,62211,124648,62408,31075,31157,0,62478,62388,31136,0,93641,93482,31193,0,30918,0,31129,31394,31124,31009,30887,31356,62280,0,62194,31150,31175,31179,0,124437,31426,30991,0,62447,61918,0,62210,0,31344,0,31344,0,62549,30683,62606,62397,62150,0,0,31123,31154,0,125035,0,0,0,0,31194,62092,93226,0,31351,62419,62548,61995,0,31175,31375,31279,94001,31333,31258,93650,0,61977,0,0,62177,62059,0,93263,125027,62384,62368,0,0,62351,93749,0,0,0,0,0,31190,31168,0,62230,31252,62450,62525,93360,62066,0,62490,31361,94006,30934,124442,31017,124932,0,31414,0,93952,31241,0,31211,0,62006,62296,93582,31264,92998,0,62774,0,62139,62886,0,0,62008,62276,0,31347,0,62125,0,31192,31246,31450,0,31017,93044,93167,31225,93051,62275,31245,31327,0,0,31416,0,62074,62125,31354,31170,62007,31033,0,93615,93798,31057,31037,0,31116,31288,31005,62477,31471,31185,62246,62576,31380,125107,0,0,31122,0,62247,93524,0,31131,0,31413,0,62325,31563,0,31272,62116,31106,0,62682,62243,0,61994,31063,31364,62287,0,62810,31151,31155,0,31252,62426,93794,0,30837,31460,31014,0,124386,62554,0,31175,31166,62188,0,62819,31382,124765,31181,0,0,62152,0,62257,0,31105,31164,93642,31363,0,62419,62022,62428,0,0,0,31289,93209,30964,62353,62174,0,0,31188,31087,0,93586,0,0,0,31274,31346,0,0,0,93355,31433,31247,0,31276,0,62325,31087,0,31364,31355,0,62670,62495,62334,0,62670,31252,62478,62375,0,93566,0,93970,31199,0,93525,93406,62291,31213,62482,0,0,62601,61862,0,124047,31387,0,62017,0,0,31166,124808,31066,62462,31111,0,62581,62207,31331,0,0,0,93561,62236,0,62002,0,0,0,31111,31342,125292,31004,31101,156089,62226,31318,30942,31319,31067,0,31378,30996,31200,31020,62045,31234,0,31184,0,31122,0,30927,124637,31306,62344,0,62032,31133,0,30959,0,0,93531,30822,31203,124558,124612,0,31081,124500,31091,31471,93559,30981,31181,0,30894,0,31031,62031,62258,62353,93463,0,62802,0,31270,62216,62207,61816,0,0,62297,0,31083,31013,62255,0,62335,0,0,62275,31025,93364,30825,0,31025,0,31242,93426,62108,31415,62281,0,0,31111,93702,0,93443,31273,31097,62429,30689,30917,62368,30752,30932,31061,62203,0,0,31182,0,31277,0,31267,0,62502,0,62374,31222,31125,0,124446,31177,0,62810,0,0,0,31041,62633,30969,31049,61996,62288,31097,62447,31122,62045,0,155902,0,0,30710,93388,0,61899,0,31192,0,31117,31257,31138,0,62296,31184,31041,62378,0,62485,31335,31269,30987,93727,0,62559,62208,30874,0,31164,31229,0,62310,62573,62137,62446,30904,0,0,30978,0,0,31285,62543,0,0,0,31289,30913,31394,0,62150,0,31147,31105,62344,62390,31190,0,0,93890,156055,93850,61953,0,62648,30861,0,0,125123,124921,0,124872,0,31309,0,0,30822,31192,0,31203,31204,93057,0,93631,62714,31445,62746,62324,62523,62018,31309,31176,31172,0,31082,62352,31081,31118,62206,93071,62171,0,31056,62414,31090,0,31330,0,31194,31126,31341,62260,31333,0,0,0,0,62654,30868,0,155984,0,31233,31577,62315,93568,0,0,0,0,0,31380,0,31091,0,62183,62577,62130,62412,30853,0,62077,0,124441,0,0,31109,0,62283,0,31251,31377,31279,31222,31258,0,93363,31485,0,62371,31104,31169,125193,31095,31206,93714,62793,0,0,0,125176,62305,61969,0,0,31166,0,62342,93463,31328,31221,93550,31240,62414,31323,31076,62700,62064,31259,0,0,62493,94044,0,31071,0,0,30845,93596,31235,62477,0,31150,62177,31193,31285,31000,0,0,61977,31118,31201,31144,0,31285,0,31330,31485,31219,31252,0,62415,31194,62457,62545,31068,0,62624]},{"counters":[31176,0,62618,30925,31351,0,0,62171,30987,62130,31220,62246,155984,62485,31244,93493,30855,0,0,62119,62648,93400,31325,62611,93517,31140,0,62925,62652,31204,62142,0,31374,62354,0,0,93558,62772,93872,31009,0,0,31228,31090,31114,31360,93939,0,0,31356,31474,62863,61960,62598,30876,62498,31050,31117,31296,31455,31217,0,31421,0,0,62124,31282,62163,0,31284,0,0,0,31302,31308,62618,30815,0,62076,31341,31513,0,62321,93285,31159,31334,62527,0,31127,31241,0,31443,31198,31145,0,155387,31193,0,93403,62779,0,0,31398,62611,31133,0,30819,62357,93381,31291,0,31329,62115,62664,0,0,93574,0,31207,93464,31303,30928,94024,31250,31082,31290,31334,0,62638,31195,187007,31161,62171,31182,0,0,0,31371,62120,31190,62180,0,31219,31103,0,0,93322,0,62714,31209,31147,31488,31194,30692,31355,62148,0,0,31061,62122,62065,0,0,31445,62589,62274,0,93443,62445,31276,31386,93120,0,31254,0,31291,62039,0,31066,0,0,31097,93383,31402,31182,0,30944,0,0,0,31080,31021,62117,0,0,31288,0,62146,92976,31416,31219,62729,0,30683,62362,0,30997,62159,124631,125295,93659,31144,31381,31120,31494,31166,0,0,0,62776,31119,31254,61604,31014,62529,31306,31058,31131,0,31194,30994,30929,92891,0,30981,62661,30817,0,31017,62303,0,124559,0,0,31376,30892,0,0,124926,31441,62149,62273,30884,93300,61870,31100,0,0,31363,62742,31118,31172,0,0,93666,30855,0,31349,31105,62361,31177,62471,30763,0,0,0,0,62186,30758,31183,31321,31358,61909,0,0,30968,31301,93407,0,31195,31356,0,0,31207,31362,62027,93697,62587,31020,0,93145,31336,31413,62874,31157,31127,0,31245,31003,62164,0,0,31416,0,0,93356,30934,31582,0,62389,93167,0,62399,0,62169,62385,93742,0,31382,31193,0,62022,0,31323,93731,0,0,0,62420,62432,31270,31414,31246,61901,62589,62400,62189,0,31177,31244,61951,0,61984,93408,62200,0,31528,31169,31005,31247,0,0,93240,31168,31255,0,62045,31384,31194,93637,31471,0,62472,31359,31110,0,0,61996,0,62239,31088,0,0,31184,0,0,62217,31394,62122,0,31436,0,0,62713,31318,62528,62571,0,93471,93212,93490,30874,0,62384,124888,62639,31098,62199,0,31343,30815,0,30885,30905,124800,0,0,0,62049,31130,31450,124804,62429,0,31147,0,124235,62532,0,0,93817,0,62257,0,0,62522,62461,62305,0,62600,31363,62475,0,31239,31272,62392,93681,62167,30898,62279,62377,31560,31536,30980,31237,31132,62282,0,0,62211,93424,31474,31204,62720,30847,62366,123786,31215,0,0,93468,0,31208,31105,31199,62171,31363,31178,93234,0,62237,0,0,31325,62515,0,62609,62552,0,31130,31052,0,31221,62050,31225,0,0,31264,62447,0,0,31308,31135,0,0,31075,31347,31383,31582,62356,31184,30980,61913,93320,31241,93168,31099,0,62534,62327,62837,31160,0,31034,93567,0,31230,0,0,31128,31074,0,0,0,31075,0,93563,0,31003,93300,30869,0,62344,31312,31078,0,93409,30656,93487,0,62096,0,0,31083,31053,62453,0,124679,62481,0,62310,0,0,0,0,62290,125094,0,31331,31200,31314,93568,94049,31241,31378,31149,31322,0,0,31065,0,62370,62521,0,30935,0,155969,30801,0,62184,30953,0,31014,0,62350,62292,0,0,94107,62200,31057,0,0,93629,0,31162,62320,31115,93407,0,62575,0,31333,31004,62046,31133,31114,93266,31219,93439,0,30938,93438,0,62242,62109,62321,62054,0,62193,0,61898,31127,31083,0,31168,0,62410,0,62406,31466,62404,93610,0,0,0,0,31057,31376,93239,0,62163,31452,62132,0,31297,62186,0,61934,0,124643,94202,0,31064,62530,62124,31154,0,0,30989,93396,31267,0,31234,124776,62424,0,0,31342,62110,0,0,0,0,93668,62093,92899,62304,31150,31325,93059,156250,0,0,31157,31134,31261,0,0,0,30988,31264,31101,62432,93164,62495,30748,0,30993,31112,31279,30926,31087,61775,61999,30967,31309,0,31394,124426,62008,0,31194,0,31411,0,93333,0,31115,0,0,93414,31055,0,62337,62294,62305,62115,62080,62200,31145,0,31017,31375,93391,0,0,31255,62196,31358,30894,93459,31510,61881,31106,0,62169,62389,0,31334,0,31244,31128,0,62166,31308,62442,0,30863,31039,0,62338,62190,0,0,31444,0,31345,30925,30884,31033,31173,31205,124560,0,62365,0,30969,31096,0,62706,31417,0,0,31217,0,0,0,0,0,0,93934,0,31341,0,31247,31317,31330,0,0,62413,62566,62740,93387,0,31179,0,31024,31218,31228,0,124653,62782,31103,0,93523,62228,0,0,0,124824,62390,62679,0,31298,30967,92920,124564,62383,62263,0,0,124817,62804,62237,62767,0,30975,31131,62293,31158,93731,156296,0,31002,124420,30804,0,0,124825,0,31419,31296,0,31295,0,31456,0,31316,93667,155442,62759,31224,93556,31358,31135,0,0,93319,30942,93614,31196,0,0,0,31385,0,93621,62000,31288,31485,0,0,0,31302,0,31192,31179,62414,62352,31257,0,93516,31327,62525,0,0,0,31334,0,0,31375,31169,31314,31110,62476,0,62271,31364,31471,0,0,31050,62170,31465,31471,0,30972,30883,0,31200,62396,0,31138,62475,62153,31092,62528,31111,62461,0,93374,0,31084,93889,31339,0,0,0,0,0,62819,0,125015,0,31124,93482,31246,31080,31118,0,62538,0,0,0,31343,0,0,31222,93541,31260,62082,30808,62063,62787,31019,31174,0,31211,0,0,31131,0,0,0,0,62556,0,62186,0,0,62806,0,0,31088,0,62046,0,0,31057,0,31130,30894,30952,0,31319,31199,62584,31091,31000,31038,0,31435,0,30865,0,62387,0,0,31267,31024,0,30891,94067,62361,0,0,124287,0,31099,0,93387,62302,31430,62099,0,0,31049,62025,0,31264,31230,31123,62587,62839,31282,0,93193,93721,62530,124698,31276,0,62606,31188,31389,62562,0,62309,31450,31334,31231,0,31189,93205,31237,62370,31034,93103,62291,62676,125131,31059,31273,0,62374,93276,31015,31132,31335,0,31119,31247,31222,0,0,31094,93099,0,0,0,93576,62606,31489,0,31179,0,0,0,0,62445,31319,93403,0,31153,62470,30866,30896,0,93196,62413,31020,31088,62064,0,30980,93492,0,62281,93267,31160,31116,62497,62322,62344,62719,31076,31175,0,61856,62897,31225,62108,31254,93570,31243,62462,124353,62464,0,62452,0,62322,31485,31058,62176,31221,31025,0,30845,0,30904,62422,62639,93366,93675,0,0,0,93825,62354,125223,0,31166,61972,124410,0,31171,30885,62437,0,0,31062,30892,0,0,0,0,0,62562,62435,0,30973,62011,30860,62032,30887,30917,30922,62558,0,31313,31178,31107,31449,94054,62785,0,31152,93431,93532,0,124999,93999,0,31264,62474,31460,31301,62593,31479,0,62157,0,30977,61728,0,93449,0,62086,0,186402,31082,0,93701,0,0,124827,0,62183,31577,62396,0,0,31143,31221,31184,93521,0,186759,30961,62095,31495,31068,0,62075,0,31115,0,62128,0,62372,31177,31257,31269,0,31203,31263,62708,62753,0,31195,31342,124167,0,0,62816,0,0,0,31372,93433,62712,94194,62421,0,62413,93567,30887,31125,93432,62078,61916,0,0,0,31260,93937,31442,31417,0,0,0,93280,0,62111,0,31334,31360,62303,0,31315,125011,31117,0,0,0,92919,31372,31171,0,0,0,62049,31478,0,31295,31059,93418,124829,31059,0,31363,0,30710,0,62429,0,0,62438,93726,31333,62289,125393,0,31172,0,31161,0,31225,0,0,93588,0,31328,93682,0,31010,62483,30763,0,62447,0,31249,0,62833,0,31303,0,0,93419,0,62169,0,62367,0,0,0,0,62090,93550,0,31210,125023,31266,0,0,31098,31097,31344,30897,31110,0,30724,31184,31254,62663,62441,0,0,0,0,30930,31365,0,125171,62518,62742,93354,62472,0,62561,31207,93207,93960,62471,30749,62370,31223,0,61959,0,31120,31161,62975,0,61906,0,30929,31223,62062,31452,0,31371,0,62045,31272,31069,62090,31184,62440,62566,30996,0,31392,124540,62192,31169,62500,62084,62319,31204,30928,0,0,0,31126,31133,0,31284,31115,62139,0,0,0,31448,0,93031,31050,62036,31320,62361,31014,62693,0,93147,30932,0,31194,0,0,0,31124,31068,31495,0,0,31279,0,31270,0,31288,93656,93709,0,93543,31337,0,31254,62528,31317,93340,31226,31266,0,31035,0,124152,62339,0,0,62437,62613,93966,31434,31334,124725,125143,31251,62553,0,0,62602,31139,0,31125,31395,124454,92921,62003,31213,31259,0,31411,0,31259,31483,30912,0,0,93491,0,93037,31031,31373,0,93131,62044,0,0,0,31397,30859,0,155471,31167,62022,62414,0,30860,0,93375,31064,92712,62087,0,30992,31015,30737,0,93978,0,93628,62897,31186,31104,0,62040,31068,0,0,0,31023,62673,62803,61895,31109,31100,94145,93241,124735,93487,62481,31607,30904,62211,0,0,0,62615,0,31269,31237,92949,62491,62518,62559,31002,30925,93737,31162,30904,31110,31179,0,0,124161,31211,62346,124690,0,62545,62536,31491,62135,62748,62229,0,93776,0,31261,93331,31354,31190,62210,30818,0,31330,62502,0,61769,124710,0,31135,31206,31309,93595,31285,0,62481,125340,0,0,31379,93467,61822,0,31182,0,93433,31044,31147,31169,62270,31513,0,31151,30809,62158,0,31032,31332,30960,31012,30864,62177,31263,124262,31205,62329,62816,0,31232,62554,31323,31138,31166,93762,62122,156366,0,0,62165,61906,31222,31164,31031,0,61679,31040,62841,31439,0,31262,62615,31071,31107,123865,0,93778,62339,94492,62441,0,31088,62453,0,31439,31145,31290,31246,0,62268,0,31165,62564,31292,0,30983,31333,31133,31211,0,30958,0,62137,30942,31356,31454,31397,0,31441,0,0,62250,62180,62338,93341,0,30945,31456,31166,62451,62327,0,30966,31270,62037,62498,62441,62632,31292,0,62477,93356,93335,30956,0,62466,30993,62725,31392,0,31380,93353,31318,62555,0,0,93829,62507,0,31109,31145,0,31377,93286,0,31698,93280,31225,93252,31248,0,31240,0,0,30934,62683,31362,0,31200,31186,93417,62280,93864,0,31118,62152,31088,0,0,31272,30921,0,0,31007,0,30828,93653,31124,62393,30933,62019,31319,31277,62412,0,0,0,0,62266,0,31460,0,62377,0,0,31187,0,62443,124382,31247,31133,31208,93635,62225,30883,0,0,93732,31290,30679,31033,0,93674,31288,62467,31009,62273,0,31117,0,0,62273,0,61912,31211,0,0,62600,62421,0,31722,0,31307,30878,31259,31185,31153,31247,31206,31014,0,62376,93151,0,31120,0,31167,0,31357,0,31254,61993,0,31206,31284,93827,31258,62266,31033,0,31384,62522,0,124422,62076,0,0,0,31001,31023,31104,0,0,124756,31305,0,62078,93137,31567,0,62237,62534,0,31279,0,31241,30872,62529,31232,31122,93783,62223,31350,62193,93684,0,0,0,93640,93547,0,62464,0,31304,31009,124991,0,0,31042,0,0,62343,31208,31091,0,0,31099,0,93597,31022,92894,61892,0,0,0,0,0,31025,30972,62276,0,93205,0,62758,31519,0,124449,30872,93856,93434,31074,31046,31409,31217,0,0,62243,31359,0,0,31294,0,62290,62150,62410,31057,92920,93024,31077,31025,62286,0,31033,62154,0,31045,0,92966,31281,31217,93654,0,30881,93646,62611,62440,62301,0,62210,30993,0,31017,61962,62523,31557,0,31286,62284,0,62732,0,0,62252,62049,30994,31468,0,0,62132,62317,0,0,62175,31392,62290,62778,61974,93579,62035,0,31393,31391,62556,0,62855]}]},"null_count":0,"tot_col_size":750000000,"last_update_version":401695328293355522},"o_orderkey":{"histogram":{"ndv":75000000,"buckets":[{"count":1538451,"lower_bound":"MQ==","upper_bound":"NjE1Mzc5NQ==","repeats":1},{"count":2586114,"lower_bound":"NjE1Mzc5Ng==","upper_bound":"MTAzNDQ0NTA=","repeats":1},{"count":3633718,"lower_bound":"MTAzNDQ0NTE=","upper_bound":"MTQ1MzQ4NTQ=","repeats":1},{"count":4678637,"lower_bound":"MTQ1MzQ4NTU=","upper_bound":"MTg3MTQ1MzM=","repeats":1},{"count":5726087,"lower_bound":"MTg3MTQ1MzQ=","upper_bound":"MjI5MDQzMjc=","repeats":1},{"count":6773795,"lower_bound":"MjI5MDQzNTI=","upper_bound":"MjcwOTUxNzE=","repeats":1},{"count":7821025,"lower_bound":"MjcwOTUxNzI=","upper_bound":"MzEyODQwOTc=","repeats":1},{"count":8868850,"lower_bound":"MzEyODQwOTg=","upper_bound":"MzU0NzUzOTQ=","repeats":1},{"count":9883607,"lower_bound":"MzU0NzUzOTU=","upper_bound":"Mzk1MzQ0MDc=","repeats":1},{"count":10865624,"lower_bound":"Mzk1MzQ0MzI=","upper_bound":"NDM0NjI0OTY=","repeats":1},{"count":11888044,"lower_bound":"NDM0NjI0OTc=","upper_bound":"NDc1NTIxNjQ=","repeats":1},{"count":12870215,"lower_bound":"NDc1NTIxNjU=","upper_bound":"NTE0ODA4Mzk=","repeats":1},{"count":13852264,"lower_bound":"NTE0ODA4NjQ=","upper_bound":"NTU0MDkwNTY=","repeats":1},{"count":14834472,"lower_bound":"NTU0MDkwNTc=","upper_bound":"NTkzMzc4ODg=","repeats":1},{"count":15816503,"lower_bound":"NTkzMzc4ODk=","upper_bound":"NjMyNjU5OTE=","repeats":1},{"count":16798433,"lower_bound":"NjMyNjYwMTY=","upper_bound":"NjcxOTM3Mjk=","repeats":1},{"count":17289380,"lower_bound":"NjcxOTM3MzA=","upper_bound":"NjkxNTc1MDg=","repeats":1},{"count":17780401,"lower_bound":"NjkxNTc1MDk=","upper_bound":"NzExMjE2MDE=","repeats":1},{"count":18271445,"lower_bound":"NzExMjE2MDI=","upper_bound":"NzMwODU3NjU=","repeats":1},{"count":18758657,"lower_bound":"NzMwODU3NjY=","upper_bound":"NzUwMzQ2MjU=","repeats":1},{"count":19223568,"lower_bound":"NzUwMzQ2MjY=","upper_bound":"NzY4OTQyNzI=","repeats":1},{"count":19714595,"lower_bound":"NzY4OTQyNzM=","upper_bound":"Nzg4NTgzNzE=","repeats":1},{"count":20205639,"lower_bound":"Nzg4NTgzNzI=","upper_bound":"ODA4MjI1MzU=","repeats":1},{"count":20696680,"lower_bound":"ODA4MjI1NjA=","upper_bound":"ODI3ODY3MjA=","repeats":1},{"count":21187714,"lower_bound":"ODI3ODY3MjE=","upper_bound":"ODQ3NTA4NTA=","repeats":1},{"count":21678745,"lower_bound":"ODQ3NTA4NTE=","upper_bound":"ODY3MTQ5Nzc=","repeats":1},{"count":22169773,"lower_bound":"ODY3MTQ5Nzg=","upper_bound":"ODg2NzkwNzc=","repeats":1},{"count":22660738,"lower_bound":"ODg2NzkwNzg=","upper_bound":"OTA2NDI5NDY=","repeats":1},{"count":23151710,"lower_bound":"OTA2NDI5NDc=","upper_bound":"OTI2MDY4MjI=","repeats":1},{"count":23642806,"lower_bound":"OTI2MDY4MjM=","upper_bound":"OTQ1NzEyMDY=","repeats":1},{"count":24133861,"lower_bound":"OTQ1NzEyMDc=","upper_bound":"OTY1MzU0Mjk=","repeats":1},{"count":24624841,"lower_bound":"OTY1MzU0MzA=","upper_bound":"OTg0OTkzNjE=","repeats":1},{"count":25050280,"lower_bound":"OTg0OTkzNjI=","upper_bound":"MTAwMjAxMTIw","repeats":1},{"count":25541298,"lower_bound":"MTAwMjAxMTIx","upper_bound":"MTAyMTY1MTg2","repeats":1},{"count":26032501,"lower_bound":"MTAyMTY1MTg3","upper_bound":"MTA0MTI5OTg5","repeats":1},{"count":26447254,"lower_bound":"MTA0MTI5OTkw","upper_bound":"MTA1Nzg4OTk4","repeats":1},{"count":26858306,"lower_bound":"MTA1Nzg4OTk5","upper_bound":"MTA3NDMzMjE4","repeats":1},{"count":27349231,"lower_bound":"MTA3NDMzMjE5","upper_bound":"MTA5Mzk2OTAz","repeats":1},{"count":27840078,"lower_bound":"MTA5Mzk2OTI4","upper_bound":"MTExMzYwMjk0","repeats":1},{"count":28331066,"lower_bound":"MTExMzYwMjk1","upper_bound":"MTEzMzI0MjU4","repeats":1},{"count":28822093,"lower_bound":"MTEzMzI0MjU5","upper_bound":"MTE1Mjg4MzU3","repeats":1},{"count":29313063,"lower_bound":"MTE1Mjg4MzU4","upper_bound":"MTE3MjUyMjMx","repeats":1},{"count":29804083,"lower_bound":"MTE3MjUyMjU2","upper_bound":"MTE5MjE2MzIz","repeats":1},{"count":30295045,"lower_bound":"MTE5MjE2MzI0","upper_bound":"MTIxMTgwMTY1","repeats":1},{"count":30785963,"lower_bound":"MTIxMTgwMTY2","upper_bound":"MTIzMTQzODQz","repeats":1},{"count":31276994,"lower_bound":"MTIzMTQzODQ0","upper_bound":"MTI1MTA3OTcw","repeats":1},{"count":31768018,"lower_bound":"MTI1MTA3OTcx","upper_bound":"MTI3MDcyMDY2","repeats":1},{"count":32259169,"lower_bound":"MTI3MDcyMDY3","upper_bound":"MTI5MDM2Njcz","repeats":1},{"count":32750129,"lower_bound":"MTI5MDM2Njc0","upper_bound":"MTMxMDAwNTEz","repeats":1},{"count":33241164,"lower_bound":"MTMxMDAwNTE0","upper_bound":"MTMyOTY0NjQ0","repeats":1},{"count":33732256,"lower_bound":"MTMyOTY0NjQ1","upper_bound":"MTM0OTI5MDI0","repeats":1},{"count":34139247,"lower_bound":"MTM0OTI5MDI1","upper_bound":"MTM2NTU2OTY3","repeats":1},{"count":34630172,"lower_bound":"MTM2NTU2OTky","upper_bound":"MTM4NTIwNjc2","repeats":1},{"count":35121176,"lower_bound":"MTM4NTIwNjc3","upper_bound":"MTQwNDg0NzA0","repeats":1},{"count":35612210,"lower_bound":"MTQwNDg0NzA1","upper_bound":"MTQyNDQ4ODM0","repeats":1},{"count":36103239,"lower_bound":"MTQyNDQ4ODM1","upper_bound":"MTQ0NDEyOTM1","repeats":1},{"count":36594288,"lower_bound":"MTQ0NDEyOTYw","upper_bound":"MTQ2Mzc3MTUy","repeats":1},{"count":37085164,"lower_bound":"MTQ2Mzc3MTUz","upper_bound":"MTQ4MzQwNjQ0","repeats":1},{"count":37576206,"lower_bound":"MTQ4MzQwNjQ1","upper_bound":"MTUwMzA0ODA2","repeats":1},{"count":38067306,"lower_bound":"MTUwMzA0ODA3","upper_bound":"MTUyMjY5MjE4","repeats":1},{"count":38558346,"lower_bound":"MTUyMjY5MjE5","upper_bound":"MTU0MjMzMzc4","repeats":1},{"count":39049391,"lower_bound":"MTU0MjMzMzc5","upper_bound":"MTU2MTk3NTQz","repeats":1},{"count":39540466,"lower_bound":"MTU2MTk3NTY4","upper_bound":"MTU4MTYxODU4","repeats":1},{"count":40031388,"lower_bound":"MTU4MTYxODU5","upper_bound":"MTYwMTI1NTQw","repeats":1},{"count":40522437,"lower_bound":"MTYwMTI1NTQx","upper_bound":"MTYyMDg5NzMz","repeats":1},{"count":41013466,"lower_bound":"MTYyMDg5NzM0","upper_bound":"MTY0MDUzODU4","repeats":1},{"count":41406222,"lower_bound":"MTY0MDUzODU5","upper_bound":"MTY1NjI0ODcw","repeats":1},{"count":41897212,"lower_bound":"MTY1NjI0ODcx","upper_bound":"MTY3NTg4ODM2","repeats":1},{"count":42388213,"lower_bound":"MTY3NTg4ODM3","upper_bound":"MTY5NTUyODM3","repeats":1},{"count":42879202,"lower_bound":"MTY5NTUyODM4","upper_bound":"MTcxNTE2ODAy","repeats":1},{"count":43370310,"lower_bound":"MTcxNTE2ODAz","upper_bound":"MTczNDgxMjIy","repeats":1},{"count":43861343,"lower_bound":"MTczNDgxMjIz","upper_bound":"MTc1NDQ1MzUx","repeats":1},{"count":44352281,"lower_bound":"MTc1NDQ1Mzc2","upper_bound":"MTc3NDA5MTIx","repeats":1},{"count":44843416,"lower_bound":"MTc3NDA5MTIy","upper_bound":"MTc5MzczNjY0","repeats":1},{"count":45334472,"lower_bound":"MTc5MzczNjY1","upper_bound":"MTgxMzM3ODg4","repeats":1},{"count":45825539,"lower_bound":"MTgxMzM3ODg5","upper_bound":"MTgzMzAyMTQ3","repeats":1},{"count":46316505,"lower_bound":"MTgzMzAyMTQ4","upper_bound":"MTg1MjY2MDE3","repeats":1},{"count":46807497,"lower_bound":"MTg1MjY2MDE4","upper_bound":"MTg3MjI5OTg1","repeats":1},{"count":47298482,"lower_bound":"MTg3MjI5OTg2","upper_bound":"MTg5MTkzOTIy","repeats":1},{"count":47789385,"lower_bound":"MTg5MTkzOTIz","upper_bound":"MTkxMTU3NTM3","repeats":1},{"count":48280376,"lower_bound":"MTkxMTU3NTM4","upper_bound":"MTkzMTIxNTA0","repeats":1},{"count":48804664,"lower_bound":"MTkzMTIxNTA1","upper_bound":"MTk1MjE4NjU2","repeats":1},{"count":49257656,"lower_bound":"MTk1MjE4NjU3","upper_bound":"MTk3MDMwNjI0","repeats":1},{"count":49748602,"lower_bound":"MTk3MDMwNjI1","upper_bound":"MTk4OTk0NDAy","repeats":1},{"count":50239608,"lower_bound":"MTk4OTk0NDAz","upper_bound":"MjAwOTU4NDMy","repeats":1},{"count":50730556,"lower_bound":"MjAwOTU4NDMz","upper_bound":"MjAyOTIyMjEy","repeats":1},{"count":51221516,"lower_bound":"MjAyOTIyMjEz","upper_bound":"MjA0ODg2MDUy","repeats":1},{"count":51712532,"lower_bound":"MjA0ODg2MDUz","upper_bound":"MjA2ODUwMTE2","repeats":1},{"count":52203460,"lower_bound":"MjA2ODUwMTE3","upper_bound":"MjA4ODEzODI4","repeats":1},{"count":52694423,"lower_bound":"MjA4ODEzODI5","upper_bound":"MjEwNzc3Njcx","repeats":1},{"count":53185452,"lower_bound":"MjEwNzc3Njk2","upper_bound":"MjEyNzQxNzk2","repeats":1},{"count":53676574,"lower_bound":"MjEyNzQxNzk3","upper_bound":"MjE0NzA2Mjc4","repeats":1},{"count":54167696,"lower_bound":"MjE0NzA2Mjc5","upper_bound":"MjE2NjcwNzg0","repeats":1},{"count":54658735,"lower_bound":"MjE2NjcwNzg1","upper_bound":"MjE4NjM0OTE5","repeats":1},{"count":55149705,"lower_bound":"MjE4NjM0OTQ0","upper_bound":"MjIwNTk4ODE3","repeats":1},{"count":55640628,"lower_bound":"MjIwNTk4ODE4","upper_bound":"MjIyNTYyNTAw","repeats":1},{"count":56131713,"lower_bound":"MjIyNTYyNTAx","upper_bound":"MjI0NTI2ODQ5","repeats":1},{"count":56596256,"lower_bound":"MjI0NTI2ODUw","upper_bound":"MjI2Mzg1MDI0","repeats":1},{"count":57087336,"lower_bound":"MjI2Mzg1MDI1","upper_bound":"MjI4MzQ5MzQ0","repeats":1},{"count":57578373,"lower_bound":"MjI4MzQ5MzQ1","upper_bound":"MjMwMzEzNDc3","repeats":1},{"count":58069423,"lower_bound":"MjMwMzEzNDc4","upper_bound":"MjMyMjc3Njcx","repeats":1},{"count":58560377,"lower_bound":"MjMyMjc3Njk2","upper_bound":"MjM0MjQxNTA1","repeats":1},{"count":59051449,"lower_bound":"MjM0MjQxNTA2","upper_bound":"MjM2MjA1Nzkz","repeats":1},{"count":59542553,"lower_bound":"MjM2MjA1Nzk0","upper_bound":"MjM4MTcwMjA5","repeats":1},{"count":60033493,"lower_bound":"MjM4MTcwMjEw","upper_bound":"MjQwMTMzOTU3","repeats":1},{"count":60524521,"lower_bound":"MjQwMTMzOTU4","upper_bound":"MjQyMDk4MDgx","repeats":1},{"count":61015499,"lower_bound":"MjQyMDk4MDgy","upper_bound":"MjQ0MDYxOTg3","repeats":1},{"count":61506445,"lower_bound":"MjQ0MDYxOTg4","upper_bound":"MjQ2MDI1NzY1","repeats":1},{"count":61997523,"lower_bound":"MjQ2MDI1NzY2","upper_bound":"MjQ3OTkwMDgz","repeats":1},{"count":62488472,"lower_bound":"MjQ3OTkwMDg0","upper_bound":"MjQ5OTUzODg4","repeats":1},{"count":62979532,"lower_bound":"MjQ5OTUzODg5","upper_bound":"MjUxOTE4MTE2","repeats":1},{"count":63470579,"lower_bound":"MjUxOTE4MTE3","upper_bound":"MjUzODgyMzA3","repeats":1},{"count":63927684,"lower_bound":"MjUzODgyMzA4","upper_bound":"MjU1NzEwNzI0","repeats":1},{"count":64418599,"lower_bound":"MjU1NzEwNzI1","upper_bound":"MjU3Njc0Mzc1","repeats":1},{"count":64909567,"lower_bound":"MjU3Njc0NDAw","upper_bound":"MjU5NjM4MjQ3","repeats":1},{"count":65400573,"lower_bound":"MjU5NjM4Mjcy","upper_bound":"MjYxNjAyMjc3","repeats":1},{"count":65891602,"lower_bound":"MjYxNjAyMjc4","upper_bound":"MjYzNTY2NDAy","repeats":1},{"count":66382654,"lower_bound":"MjYzNTY2NDAz","upper_bound":"MjY1NTMwNTk4","repeats":1},{"count":66873573,"lower_bound":"MjY1NTMwNTk5","upper_bound":"MjY3NDk0Mjc3","repeats":1},{"count":67364588,"lower_bound":"MjY3NDk0Mjc4","upper_bound":"MjY5NDU4MzQw","repeats":1},{"count":67855575,"lower_bound":"MjY5NDU4MzQx","upper_bound":"MjcxNDIyMjc5","repeats":1},{"count":68346577,"lower_bound":"MjcxNDIyMzA0","upper_bound":"MjczMzg2MzA1","repeats":1},{"count":68837557,"lower_bound":"MjczMzg2MzA2","upper_bound":"Mjc1MzUwMjEz","repeats":1},{"count":69328609,"lower_bound":"Mjc1MzUwMjE0","upper_bound":"Mjc3MzE0NDMz","repeats":1},{"count":69819694,"lower_bound":"Mjc3MzE0NDM0","upper_bound":"Mjc5Mjc4NzU4","repeats":1},{"count":70310851,"lower_bound":"Mjc5Mjc4NzU5","upper_bound":"MjgxMjQzMzk1","repeats":1},{"count":70801868,"lower_bound":"MjgxMjQzMzk2","upper_bound":"MjgzMjA3NDYw","repeats":1},{"count":71265545,"lower_bound":"MjgzMjA3NDYx","upper_bound":"Mjg1MDYyMTc3","repeats":1},{"count":71756521,"lower_bound":"Mjg1MDYyMTc4","upper_bound":"Mjg3MDI2MDgx","repeats":1},{"count":72247580,"lower_bound":"Mjg3MDI2MDgy","upper_bound":"Mjg4OTkwMzA4","repeats":1},{"count":72738560,"lower_bound":"Mjg4OTkwMzA5","upper_bound":"MjkwOTU0MjQw","repeats":1},{"count":73229558,"lower_bound":"MjkwOTU0MjQx","upper_bound":"MjkyOTE4MjE0","repeats":1},{"count":73720491,"lower_bound":"MjkyOTE4MjE1","upper_bound":"Mjk0ODgxOTU1","repeats":1},{"count":74211495,"lower_bound":"Mjk0ODgxOTU2","upper_bound":"Mjk2ODQ1OTU5","repeats":1},{"count":74702517,"lower_bound":"Mjk2ODQ1OTg0","upper_bound":"Mjk4ODEwMDUz","repeats":1},{"count":75000000,"lower_bound":"Mjk4ODEwMDU0","upper_bound":"MzAwMDAwMDAw","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695328227819522},"o_orderpriority":{"histogram":{"ndv":5,"buckets":[{"count":15187500,"lower_bound":"MS1VUkdFTlQ=","upper_bound":"MS1VUkdFTlQ=","repeats":15187500},{"count":30142500,"lower_bound":"Mi1ISUdI","upper_bound":"Mi1ISUdI","repeats":14955000},{"count":44610000,"lower_bound":"My1NRURJVU0=","upper_bound":"My1NRURJVU0=","repeats":14467500},{"count":60172500,"lower_bound":"NC1OT1QgU1BFQ0lGSUVE","upper_bound":"NC1OT1QgU1BFQ0lGSUVE","repeats":15562500},{"count":75000000,"lower_bound":"NS1MT1c=","upper_bound":"NS1MT1c=","repeats":14827500}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14996838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15001373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15001373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14996838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15001373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14996838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14996838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15001373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999560,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15002325,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999904,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14996838,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15001373,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14999560]}]},"null_count":0,"tot_col_size":780023919,"last_update_version":401695328319569922},"o_orderstatus":{"histogram":{"ndv":3,"buckets":[{"count":36607500,"lower_bound":"Rg==","upper_bound":"Rg==","repeats":36607500},{"count":73057500,"lower_bound":"Tw==","upper_bound":"Tw==","repeats":36450000},{"count":75000000,"lower_bound":"UA==","upper_bound":"UA==","repeats":1942500}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36536161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1920293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36543546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1920293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36536161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36543546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36536161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36543546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1920293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36543546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1920293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36536161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36536161,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1920293,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36543546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":225000000,"last_update_version":401695328254033922},"o_shippriority":{"histogram":{"ndv":1,"buckets":[{"count":75000000,"lower_bound":"MA==","upper_bound":"MA==","repeats":75000000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75000000,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":150000000,"last_update_version":401695328358891522},"o_totalprice":{"histogram":{"ndv":23494656,"buckets":[{"count":300000,"lower_bound":"OTI0Ljgy","upper_bound":"MzAxNC42Mw==","repeats":3},{"count":600000,"lower_bound":"MzA0My41OQ==","upper_bound":"NTA2Ni40OQ==","repeats":3},{"count":900000,"lower_bound":"NTExOS44Mg==","upper_bound":"NzAzNy42OA==","repeats":3},{"count":1200000,"lower_bound":"NzA1OS42MQ==","upper_bound":"OTA2NS45OQ==","repeats":3},{"count":1500000,"lower_bound":"OTA5NC42OA==","upper_bound":"MTA4MTYuODE=","repeats":3},{"count":1800000,"lower_bound":"MTA5MjMuMTM=","upper_bound":"MTIxMTEuMTE=","repeats":3},{"count":2100000,"lower_bound":"MTIyMDAuNDU=","upper_bound":"MTQxMDMuNDM=","repeats":3},{"count":2400000,"lower_bound":"MTQxNDEuMDE=","upper_bound":"MTU0ODMuNzg=","repeats":3},{"count":2700000,"lower_bound":"MTU2NzQuODY=","upper_bound":"MTcwNTcuMjE=","repeats":3},{"count":3000000,"lower_bound":"MTcwODAuOTY=","upper_bound":"MTg1MDkuNQ==","repeats":3},{"count":3300000,"lower_bound":"MTg1MTkuOA==","upper_bound":"MjAxMDIuMTE=","repeats":3},{"count":3600000,"lower_bound":"MjAxNTUuODg=","upper_bound":"MjEyOTguMjQ=","repeats":3},{"count":3900000,"lower_bound":"MjEzNTkuMzU=","upper_bound":"MjI3MTguNw==","repeats":3},{"count":4200000,"lower_bound":"MjI3ODAuMDc=","upper_bound":"MjQyMzcuODI=","repeats":3},{"count":4500000,"lower_bound":"MjQyNTkuMDI=","upper_bound":"MjU3OTAuMDY=","repeats":3},{"count":4800000,"lower_bound":"MjU4NDAuMTY=","upper_bound":"MjcyNjYuMDc=","repeats":3},{"count":5100000,"lower_bound":"MjczNDQuMTg=","upper_bound":"Mjg3MDEuNjE=","repeats":3},{"count":5400000,"lower_bound":"Mjg3MjEuNTc=","upper_bound":"Mjk3MjguMTU=","repeats":3},{"count":5700000,"lower_bound":"Mjk3NDMuMzE=","upper_bound":"MzA4MTYuOQ==","repeats":3},{"count":6000000,"lower_bound":"MzA4ODMuMg==","upper_bound":"MzIwNTguMDI=","repeats":3},{"count":6300000,"lower_bound":"MzIxMDEuMDQ=","upper_bound":"MzMyMzcuNzg=","repeats":3},{"count":6600000,"lower_bound":"MzMyNjkuMzE=","upper_bound":"MzQzOTguOTY=","repeats":3},{"count":6900000,"lower_bound":"MzQ0MzQuMDU=","upper_bound":"MzU0MzkuNDk=","repeats":3},{"count":7200000,"lower_bound":"MzU0NzYuMw==","upper_bound":"MzY3ODcuMDU=","repeats":3},{"count":7500000,"lower_bound":"MzY4MDEuNjQ=","upper_bound":"MzgwMTYuMDI=","repeats":3},{"count":7800000,"lower_bound":"MzgxNjUuNDU=","upper_bound":"Mzk2MTUuNTU=","repeats":3},{"count":8100000,"lower_bound":"Mzk3MzEuNTk=","upper_bound":"NDA5NTguMTY=","repeats":3},{"count":8400000,"lower_bound":"NDEwNzQuMDQ=","upper_bound":"NDIyNzYuNg==","repeats":3},{"count":8700000,"lower_bound":"NDIzNDEuMTU=","upper_bound":"NDM1OTAuMjE=","repeats":3},{"count":9000000,"lower_bound":"NDM1OTAuODc=","upper_bound":"NDQ2MDYuNDE=","repeats":3},{"count":9300000,"lower_bound":"NDQ2MzEuNzI=","upper_bound":"NDU2NjcuMjU=","repeats":3},{"count":9600000,"lower_bound":"NDU2NzEuMjk=","upper_bound":"NDY0NzcuMzU=","repeats":3},{"count":9900000,"lower_bound":"NDY1MDAuOQ==","upper_bound":"NDcyMzcuNw==","repeats":3},{"count":10200000,"lower_bound":"NDcyNTYuNzY=","upper_bound":"NDgxMjAuNDg=","repeats":3},{"count":10500000,"lower_bound":"NDgxMzIuOA==","upper_bound":"NDkwNzYuNzg=","repeats":3},{"count":10800000,"lower_bound":"NDkwODMuNTM=","upper_bound":"NDk5NDcuNjY=","repeats":3},{"count":11100000,"lower_bound":"NDk5NTQuOTg=","upper_bound":"NTA5ODkuMzY=","repeats":3},{"count":11400000,"lower_bound":"NTEwMTYuMDQ=","upper_bound":"NTIwODMuMDc=","repeats":3},{"count":11700000,"lower_bound":"NTIxMzQuNDc=","upper_bound":"NTMwNjkuODE=","repeats":3},{"count":12000000,"lower_bound":"NTMxMzcuNw==","upper_bound":"NTQwMjkuNTg=","repeats":3},{"count":12300000,"lower_bound":"NTQwNjAuNDg=","upper_bound":"NTQ3ODEuNzc=","repeats":3},{"count":12600000,"lower_bound":"NTQ4MDUuMjc=","upper_bound":"NTU3ODI=","repeats":3},{"count":12900000,"lower_bound":"NTU3ODMuMDE=","upper_bound":"NTY4NDcuMzU=","repeats":3},{"count":13200000,"lower_bound":"NTY4NzkuMjU=","upper_bound":"NTgwNTQuNTI=","repeats":3},{"count":13500000,"lower_bound":"NTgwNjMuNjI=","upper_bound":"NTkxNDQuNDc=","repeats":3},{"count":13800000,"lower_bound":"NTkxNTYuNTQ=","upper_bound":"NjAzMDguMzk=","repeats":3},{"count":14100000,"lower_bound":"NjAzMjguNzQ=","upper_bound":"NjExMjIuODQ=","repeats":3},{"count":14400000,"lower_bound":"NjExMzYuMQ==","upper_bound":"NjIxNjQuMTY=","repeats":3},{"count":14700000,"lower_bound":"NjIxNjguMDI=","upper_bound":"NjMwMzguMDg=","repeats":3},{"count":15000000,"lower_bound":"NjMwNTYuMzI=","upper_bound":"NjM5MjIuMTc=","repeats":3},{"count":15300000,"lower_bound":"NjM5ODAuNTc=","upper_bound":"NjQ3OTIuNg==","repeats":3},{"count":15600000,"lower_bound":"NjQ4MTMuNjg=","upper_bound":"NjU4NDYuODU=","repeats":3},{"count":15900000,"lower_bound":"NjU4OTIuODY=","upper_bound":"NjcwOTkuMTQ=","repeats":3},{"count":16200000,"lower_bound":"NjcxMzEuNQ==","upper_bound":"NjgwOTEuNTY=","repeats":3},{"count":16500000,"lower_bound":"NjgxNjguMw==","upper_bound":"Njk0MDcuNDI=","repeats":3},{"count":16800000,"lower_bound":"Njk0NDguMzI=","upper_bound":"NzAyNDUuNjQ=","repeats":3},{"count":17100000,"lower_bound":"NzAyNTEuNw==","upper_bound":"NzEzMTguNjY=","repeats":3},{"count":17400000,"lower_bound":"NzEzMzEuMjc=","upper_bound":"NzI0NTMuNzQ=","repeats":3},{"count":17700000,"lower_bound":"NzI0NTMuNzU=","upper_bound":"NzM0MzUuNzM=","repeats":3},{"count":18000000,"lower_bound":"NzM0NDUuNzY=","upper_bound":"NzQ2MzAuMDk=","repeats":3},{"count":18300000,"lower_bound":"NzQ2NjcuNzI=","upper_bound":"NzU3MTYuMjY=","repeats":3},{"count":18600000,"lower_bound":"NzU3NDMuMzg=","upper_bound":"NzY3MTUuOTc=","repeats":3},{"count":18900000,"lower_bound":"NzY3MjUuMTU=","upper_bound":"Nzc0NDQuMjk=","repeats":3},{"count":19200000,"lower_bound":"Nzc0NTQuNzU=","upper_bound":"Nzg0NzcuOQ==","repeats":3},{"count":19500000,"lower_bound":"Nzg0OTUuMDg=","upper_bound":"Nzk4NDcuMw==","repeats":3},{"count":19800000,"lower_bound":"Nzk5MDMuNjg=","upper_bound":"ODA5MDYuMTU=","repeats":3},{"count":20100000,"lower_bound":"ODA5MTguNzc=","upper_bound":"ODIxNTkuNDY=","repeats":3},{"count":20400000,"lower_bound":"ODIxNzUuMDg=","upper_bound":"ODMxODguOTI=","repeats":3},{"count":20700000,"lower_bound":"ODMyMDYuNjk=","upper_bound":"ODQxOTkuODg=","repeats":3},{"count":21000000,"lower_bound":"ODQyMzUuNjk=","upper_bound":"ODUzMzUuMjg=","repeats":3},{"count":21300000,"lower_bound":"ODUzNTcuNDQ=","upper_bound":"ODYyNzguNzQ=","repeats":3},{"count":21600000,"lower_bound":"ODYzMDkuMg==","upper_bound":"ODczOTEuMjU=","repeats":3},{"count":21900000,"lower_bound":"ODc0MjkuNDU=","upper_bound":"ODgzNzYuOTg=","repeats":3},{"count":22200000,"lower_bound":"ODgzODkuNDk=","upper_bound":"ODkyNDAuMzE=","repeats":3},{"count":22500000,"lower_bound":"ODkyOTcuNg==","upper_bound":"OTA1NDUuNzI=","repeats":3},{"count":22800000,"lower_bound":"OTA1NDUuODU=","upper_bound":"OTE3MzkuNjk=","repeats":3},{"count":23100000,"lower_bound":"OTE3NDQuOQ==","upper_bound":"OTI4NzcuNjk=","repeats":3},{"count":23400000,"lower_bound":"OTI5MTkuNjg=","upper_bound":"OTM4MDUuNDU=","repeats":3},{"count":23700000,"lower_bound":"OTM4MTYuMjI=","upper_bound":"OTQ4OTEuNQ==","repeats":3},{"count":24000000,"lower_bound":"OTQ5MDMuNA==","upper_bound":"OTU5NzEuODc=","repeats":3},{"count":24300000,"lower_bound":"OTU5OTUuOTI=","upper_bound":"OTczMDYuODM=","repeats":3},{"count":24600000,"lower_bound":"OTczMTMuODk=","upper_bound":"OTg0MDkuMg==","repeats":3},{"count":24900000,"lower_bound":"OTg0MTUuNzY=","upper_bound":"OTk0MzcuNTk=","repeats":3},{"count":25200000,"lower_bound":"OTk0NzIuNTE=","upper_bound":"MTAwNDIyLjk4","repeats":3},{"count":25500000,"lower_bound":"MTAwNDU5LjI0","upper_bound":"MTAxNDM5Ljk4","repeats":3},{"count":25800000,"lower_bound":"MTAxNDUxLjU=","upper_bound":"MTAyNTk4Ljky","repeats":3},{"count":26100000,"lower_bound":"MTAyNjA2Ljc3","upper_bound":"MTAzNjE5LjM5","repeats":3},{"count":26400000,"lower_bound":"MTAzNjUyLjQ2","upper_bound":"MTA0NjgwLjIx","repeats":3},{"count":26700000,"lower_bound":"MTA0NzAwLjY4","upper_bound":"MTA1Nzc1LjQ4","repeats":3},{"count":27000000,"lower_bound":"MTA1ODAzLjY=","upper_bound":"MTA3MTQ5Ljk1","repeats":3},{"count":27300000,"lower_bound":"MTA3MTcxLjE4","upper_bound":"MTA3OTMzLjA5","repeats":3},{"count":27600000,"lower_bound":"MTA3OTM0LjU1","upper_bound":"MTA4Njk2LjQ4","repeats":3},{"count":27900000,"lower_bound":"MTA4NzIzLjEz","upper_bound":"MTA5NjMyLjc2","repeats":3},{"count":28200000,"lower_bound":"MTA5NjM4LjM=","upper_bound":"MTEwNTc5","repeats":3},{"count":28500000,"lower_bound":"MTEwNTg0LjQ=","upper_bound":"MTExNjg3LjQ4","repeats":3},{"count":28800000,"lower_bound":"MTExNzAxLjk0","upper_bound":"MTEyNjg2LjQ2","repeats":3},{"count":29100000,"lower_bound":"MTEyNzM1Ljk3","upper_bound":"MTEzNTgxLjEx","repeats":3},{"count":29400000,"lower_bound":"MTEzNjA4LjA0","upper_bound":"MTE0OTI0LjYz","repeats":3},{"count":29700000,"lower_bound":"MTE0OTU1LjY=","upper_bound":"MTE1OTk5LjI4","repeats":3},{"count":30000000,"lower_bound":"MTE2MDI0Ljg2","upper_bound":"MTE3NDMyLjA0","repeats":3},{"count":30300000,"lower_bound":"MTE3NDkzLjMx","upper_bound":"MTE4MjA5LjY=","repeats":3},{"count":30600000,"lower_bound":"MTE4MjQ2","upper_bound":"MTE5MTkxLjg0","repeats":3},{"count":30900000,"lower_bound":"MTE5MjAxLjg5","upper_bound":"MTIwMjcyLjY0","repeats":3},{"count":31200000,"lower_bound":"MTIwMzIzLjU0","upper_bound":"MTIxNDA3Ljgx","repeats":3},{"count":31500000,"lower_bound":"MTIxNDA4LjI5","upper_bound":"MTIyNTkyLjAy","repeats":3},{"count":31800000,"lower_bound":"MTIyNjYxLjg2","upper_bound":"MTIzNjIyLjIx","repeats":3},{"count":32100000,"lower_bound":"MTIzNjMwLjAy","upper_bound":"MTI0NDAxLjQ1","repeats":3},{"count":32400000,"lower_bound":"MTI0NDc1Ljc2","upper_bound":"MTI1NDIzLjU1","repeats":3},{"count":32700000,"lower_bound":"MTI1NDI5LjI1","upper_bound":"MTI2NDEzLjMy","repeats":3},{"count":33000000,"lower_bound":"MTI2NDE5LjU=","upper_bound":"MTI3NTE5Ljkx","repeats":3},{"count":33300000,"lower_bound":"MTI3NTI2LjI=","upper_bound":"MTI4NDYwLjk5","repeats":3},{"count":33600000,"lower_bound":"MTI4NDczLjY4","upper_bound":"MTI5NjY5LjI=","repeats":3},{"count":33900000,"lower_bound":"MTI5NzMwLjY5","upper_bound":"MTMwOTA4LjY3","repeats":3},{"count":34200000,"lower_bound":"MTMwOTA4Ljc4","upper_bound":"MTMxODc1LjM=","repeats":3},{"count":34500000,"lower_bound":"MTMxODc4LjEx","upper_bound":"MTMyOTc4Ljk=","repeats":3},{"count":34800000,"lower_bound":"MTMzMDA5Ljg0","upper_bound":"MTM0Mjc1LjE5","repeats":3},{"count":35100000,"lower_bound":"MTM0Mjg1LjA1","upper_bound":"MTM1MzEzLjk=","repeats":3},{"count":35400000,"lower_bound":"MTM1MzQyLjc1","upper_bound":"MTM2MzcxLjQy","repeats":3},{"count":35700000,"lower_bound":"MTM2Mzk4LjM=","upper_bound":"MTM3MTU3LjU2","repeats":3},{"count":36000000,"lower_bound":"MTM3MTY0LjY2","upper_bound":"MTM4MDMzLjk3","repeats":3},{"count":36300000,"lower_bound":"MTM4MDQ2LjQ4","upper_bound":"MTM5MDMzLjUy","repeats":3},{"count":36600000,"lower_bound":"MTM5MDM3LjAy","upper_bound":"MTQwMDE0LjM5","repeats":3},{"count":36900000,"lower_bound":"MTQwMTE2Ljcz","upper_bound":"MTQxNDM4LjA4","repeats":3},{"count":37200000,"lower_bound":"MTQxNDYyLjE5","upper_bound":"MTQyNTE5Ljk0","repeats":3},{"count":37500000,"lower_bound":"MTQyNTQ4Ljcy","upper_bound":"MTQzNjEyLjM4","repeats":3},{"count":37800000,"lower_bound":"MTQzNjE1LjA4","upper_bound":"MTQ0ODgxLjM=","repeats":3},{"count":38100000,"lower_bound":"MTQ0OTI5LjE5","upper_bound":"MTQ2MTIwLjk0","repeats":3},{"count":38400000,"lower_bound":"MTQ2MTIzLjU=","upper_bound":"MTQ3MDYwLjU2","repeats":3},{"count":38700000,"lower_bound":"MTQ3MTA4LjA1","upper_bound":"MTQ4MTg3Ljc=","repeats":3},{"count":39000000,"lower_bound":"MTQ4MTkzLjA1","upper_bound":"MTQ5Njc3LjQ4","repeats":3},{"count":39300000,"lower_bound":"MTQ5Njk2LjUy","upper_bound":"MTUwNzAzLjQ4","repeats":3},{"count":39600000,"lower_bound":"MTUwNzA3LjY5","upper_bound":"MTUxOTMyLjUy","repeats":3},{"count":39900000,"lower_bound":"MTUxOTU3LjMx","upper_bound":"MTUzMTUxLjk0","repeats":3},{"count":40200000,"lower_bound":"MTUzMTczLjM4","upper_bound":"MTU0MTYzLjAz","repeats":3},{"count":40500000,"lower_bound":"MTU0MjExLjk1","upper_bound":"MTU0OTY5LjEy","repeats":3},{"count":40800000,"lower_bound":"MTU0OTcwLjEx","upper_bound":"MTU1OTYxLjg=","repeats":3},{"count":41100000,"lower_bound":"MTU1OTg0Ljg=","upper_bound":"MTU3MDYzLjk1","repeats":3},{"count":41400000,"lower_bound":"MTU3MDc3Ljc4","upper_bound":"MTU4MDU5LjAy","repeats":3},{"count":41700000,"lower_bound":"MTU4MDY0LjU4","upper_bound":"MTU4OTQxLjc4","repeats":3},{"count":42000000,"lower_bound":"MTU4OTYzLjQ1","upper_bound":"MTYwMDQ1LjI4","repeats":3},{"count":42300000,"lower_bound":"MTYwMDk2LjA2","upper_bound":"MTYxMjY3LjYy","repeats":3},{"count":42600000,"lower_bound":"MTYxMjc4Ljg=","upper_bound":"MTYyMTI4LjE0","repeats":3},{"count":42900000,"lower_bound":"MTYyMjA4Ljk4","upper_bound":"MTYzMzU2LjQ3","repeats":3},{"count":43200000,"lower_bound":"MTYzMzY5LjUy","upper_bound":"MTY0NTU4LjY2","repeats":3},{"count":43500000,"lower_bound":"MTY0NTcxLjIz","upper_bound":"MTY1NjE1LjU4","repeats":3},{"count":43800000,"lower_bound":"MTY1NjI5LjU4","upper_bound":"MTY2NDgxLjcy","repeats":3},{"count":44100000,"lower_bound":"MTY2NjEyLjc3","upper_bound":"MTY3NjI0LjQ=","repeats":3},{"count":44400000,"lower_bound":"MTY3NjI1LjAy","upper_bound":"MTY4OTU2LjM2","repeats":3},{"count":44700000,"lower_bound":"MTY4OTY0LjM=","upper_bound":"MTcwMTYwLjE3","repeats":3},{"count":45000000,"lower_bound":"MTcwMjk2LjEy","upper_bound":"MTcxMjcyLjQ0","repeats":3},{"count":45300000,"lower_bound":"MTcxMzA0LjM4","upper_bound":"MTcyMjE5Ljcz","repeats":3},{"count":45600000,"lower_bound":"MTcyMjQ2Ljk4","upper_bound":"MTczMzU3LjM0","repeats":3},{"count":45900000,"lower_bound":"MTczMzc0LjE5","upper_bound":"MTc0MzMyLjY=","repeats":3},{"count":46200000,"lower_bound":"MTc0MzUzLjc4","upper_bound":"MTc1NzM5LjQ0","repeats":3},{"count":46500000,"lower_bound":"MTc1NzQ5LjU2","upper_bound":"MTc2NzIwLjU1","repeats":3},{"count":46800000,"lower_bound":"MTc2ODA4LjY0","upper_bound":"MTc3ODA3LjYx","repeats":3},{"count":47100000,"lower_bound":"MTc3ODI1LjM0","upper_bound":"MTc4ODM2Ljc3","repeats":3},{"count":47400000,"lower_bound":"MTc4ODM2Ljg4","upper_bound":"MTc5NzUwLjM0","repeats":3},{"count":47700000,"lower_bound":"MTc5NzU5LjAy","upper_bound":"MTgwODMwLjQ4","repeats":3},{"count":48000000,"lower_bound":"MTgwODcwLjQ1","upper_bound":"MTgxNjE2LjEx","repeats":3},{"count":48300000,"lower_bound":"MTgxNjE3Ljk1","upper_bound":"MTgyNzQ4Ljk1","repeats":3},{"count":48600000,"lower_bound":"MTgyNzc0LjY3","upper_bound":"MTgzODkwLjk1","repeats":3},{"count":48900000,"lower_bound":"MTgzOTMwLjM5","upper_bound":"MTg0ODkyLjM0","repeats":3},{"count":49200000,"lower_bound":"MTg0OTE2LjA2","upper_bound":"MTg1ODk1Ljcz","repeats":3},{"count":49500000,"lower_bound":"MTg1OTEwLjky","upper_bound":"MTg2NzY1LjM0","repeats":3},{"count":49800000,"lower_bound":"MTg2NzcwLjc3","upper_bound":"MTg3OTQ5LjY0","repeats":3},{"count":50100000,"lower_bound":"MTg3OTU2LjM5","upper_bound":"MTg5MTA4LjIz","repeats":3},{"count":50400000,"lower_bound":"MTg5MTE1LjM=","upper_bound":"MTkwMDkzLjEy","repeats":3},{"count":50700000,"lower_bound":"MTkwMDk1LjM2","upper_bound":"MTkxMjQ0LjIz","repeats":3},{"count":51000000,"lower_bound":"MTkxMjQ5LjEx","upper_bound":"MTkyNDMwLjE0","repeats":3},{"count":51300000,"lower_bound":"MTkyNDczLjEy","upper_bound":"MTkzNTk2Ljgx","repeats":3},{"count":51600000,"lower_bound":"MTkzNjQ3Ljk1","upper_bound":"MTk0NzEzLjcz","repeats":3},{"count":51900000,"lower_bound":"MTk0NzE5LjYy","upper_bound":"MTk1NzMwLjAy","repeats":3},{"count":52200000,"lower_bound":"MTk1NzU1LjE5","upper_bound":"MTk2OTg5LjYy","repeats":3},{"count":52500000,"lower_bound":"MTk3MDA4LjY=","upper_bound":"MTk4MTkyLjU2","repeats":3},{"count":52800000,"lower_bound":"MTk4MjAxLjY0","upper_bound":"MTk5MjEzLjM=","repeats":3},{"count":53100000,"lower_bound":"MTk5Mjk1LjQ1","upper_bound":"MjAwMzU3","repeats":3},{"count":53400000,"lower_bound":"MjAwMzU5Ljg=","upper_bound":"MjAxMzE5LjU2","repeats":3},{"count":53700000,"lower_bound":"MjAxMzM0Ljg4","upper_bound":"MjAyNTQ5Ljg0","repeats":3},{"count":54000000,"lower_bound":"MjAyNjU0LjE2","upper_bound":"MjA0MDI1Ljg5","repeats":3},{"count":54300000,"lower_bound":"MjA0MDM4LjM=","upper_bound":"MjA1MDA1LjU1","repeats":3},{"count":54600000,"lower_bound":"MjA1MDQ0LjQ0","upper_bound":"MjA2NDA2Ljc1","repeats":3},{"count":54900000,"lower_bound":"MjA2NDE1LjM4","upper_bound":"MjA3ODk2LjIy","repeats":3},{"count":55200000,"lower_bound":"MjA3OTAyLjU4","upper_bound":"MjA4OTk2LjU2","repeats":3},{"count":55500000,"lower_bound":"MjA5MDM2LjEx","upper_bound":"MjEwMTI1Ljc1","repeats":3},{"count":55800000,"lower_bound":"MjEwMTY2Ljk0","upper_bound":"MjExMzg5LjI4","repeats":3},{"count":56100000,"lower_bound":"MjExNDMxLjQ0","upper_bound":"MjEyMzQ4Ljk1","repeats":3},{"count":56400000,"lower_bound":"MjEyMzcyLjI1","upper_bound":"MjEzNTYwLjI4","repeats":3},{"count":56700000,"lower_bound":"MjEzNTY3LjY=","upper_bound":"MjE0OTA1LjMx","repeats":3},{"count":57000000,"lower_bound":"MjE0OTExLjcy","upper_bound":"MjE2MTQzLjIz","repeats":3},{"count":57300000,"lower_bound":"MjE2MTkzLjA2","upper_bound":"MjE3NzE4Ljgz","repeats":3},{"count":57600000,"lower_bound":"MjE3NzI2LjE2","upper_bound":"MjE5Mjc0LjE0","repeats":3},{"count":57900000,"lower_bound":"MjE5Mjk5Ljgz","upper_bound":"MjIwNDA1LjA2","repeats":3},{"count":58200000,"lower_bound":"MjIwNDkzLjM2","upper_bound":"MjIyMjYyLjc4","repeats":3},{"count":58500000,"lower_bound":"MjIyMjgwLjQ=","upper_bound":"MjIzNzMzLjc=","repeats":3},{"count":58800000,"lower_bound":"MjIzNzM0LjQy","upper_bound":"MjI1MDQ0LjA1","repeats":3},{"count":59100000,"lower_bound":"MjI1MDk1LjU2","upper_bound":"MjI2MzM2Ljg0","repeats":3},{"count":59400000,"lower_bound":"MjI2MzM5Ljk=","upper_bound":"MjI3NTkzLjU=","repeats":3},{"count":59700000,"lower_bound":"MjI3NjYyLjM4","upper_bound":"MjI4Nzc4LjA1","repeats":3},{"count":60000000,"lower_bound":"MjI4Nzg1LjI=","upper_bound":"MjMwMjQ3LjY=","repeats":3},{"count":60300000,"lower_bound":"MjMwMjkyLjc4","upper_bound":"MjMxODgzLjcz","repeats":3},{"count":60600000,"lower_bound":"MjMxOTAxLjYx","upper_bound":"MjMzNTA1LjQ0","repeats":3},{"count":60900000,"lower_bound":"MjMzNTA5LjQ=","upper_bound":"MjM0Njk4LjI1","repeats":3},{"count":61200000,"lower_bound":"MjM0NzEzLjI=","upper_bound":"MjM1ODM2LjA2","repeats":3},{"count":61500000,"lower_bound":"MjM1ODUyLjA4","upper_bound":"MjM2OTc3LjIz","repeats":3},{"count":61800000,"lower_bound":"MjM3MDIyLjg2","upper_bound":"MjM4NTA5LjY0","repeats":3},{"count":62100000,"lower_bound":"MjM4NTI3LjMx","upper_bound":"MjM5NTkzLjk0","repeats":3},{"count":62400000,"lower_bound":"MjM5NTk5LjE5","upper_bound":"MjQwODQ3LjE0","repeats":3},{"count":62700000,"lower_bound":"MjQwODY0LjM=","upper_bound":"MjQyMjk0Ljk1","repeats":3},{"count":63000000,"lower_bound":"MjQyMzA2LjQ1","upper_bound":"MjQ0MTQ0LjUz","repeats":3},{"count":63300000,"lower_bound":"MjQ0MTQ1LjY2","upper_bound":"MjQ2MDMyLjcy","repeats":3},{"count":63600000,"lower_bound":"MjQ2MDU2Ljky","upper_bound":"MjQ4MDM0Ljcz","repeats":3},{"count":63900000,"lower_bound":"MjQ4MDc2LjM5","upper_bound":"MjQ5NjM0LjU1","repeats":3},{"count":64200000,"lower_bound":"MjQ5NzE4Ljk4","upper_bound":"MjUwODkyLjU1","repeats":3},{"count":64500000,"lower_bound":"MjUwOTk0LjQ0","upper_bound":"MjUzMDM0Ljc3","repeats":3},{"count":64800000,"lower_bound":"MjUzMDYyLjg=","upper_bound":"MjU0NzgwLjg0","repeats":3},{"count":65100000,"lower_bound":"MjU0ODYwLjAy","upper_bound":"MjU2Mjc1LjYy","repeats":3},{"count":65400000,"lower_bound":"MjU2Mjc1Ljg=","upper_bound":"MjU3ODg0LjA2","repeats":3},{"count":65700000,"lower_bound":"MjU4MTA2LjUz","upper_bound":"MjU5OTg5LjAy","repeats":3},{"count":66000000,"lower_bound":"MjYwMDI2","upper_bound":"MjYxODAxLjM=","repeats":3},{"count":66300000,"lower_bound":"MjYxOTU2LjYx","upper_bound":"MjYzMTIxLjk=","repeats":3},{"count":66600000,"lower_bound":"MjYzMTMxLjEy","upper_bound":"MjY1MTQwLjI1","repeats":3},{"count":66900000,"lower_bound":"MjY1MTcxLjg0","upper_bound":"MjY2ODIwLjQ0","repeats":3},{"count":67200000,"lower_bound":"MjY2ODY2LjM0","upper_bound":"MjY4NjA3Ljg4","repeats":3},{"count":67500000,"lower_bound":"MjY4NjI1LjM=","upper_bound":"MjcwOTA5LjI4","repeats":3},{"count":67800000,"lower_bound":"MjcwOTEyLjIy","upper_bound":"MjczMjgyLjg0","repeats":3},{"count":68100000,"lower_bound":"MjczMzAzLjg4","upper_bound":"Mjc1NTY2Ljc4","repeats":3},{"count":68400000,"lower_bound":"Mjc1NTY3LjQ0","upper_bound":"Mjc4NDA4LjM=","repeats":3},{"count":68700000,"lower_bound":"Mjc4NDE1LjY=","upper_bound":"MjgwNjgxLjg4","repeats":3},{"count":69000000,"lower_bound":"MjgwNzEyLjQ3","upper_bound":"MjgyODY2LjM0","repeats":3},{"count":69300000,"lower_bound":"MjgyODc2LjI=","upper_bound":"Mjg1MzYyLjc=","repeats":3},{"count":69600000,"lower_bound":"Mjg1NDg2Ljc1","upper_bound":"Mjg3MDQ2LjM=","repeats":3},{"count":69900000,"lower_bound":"Mjg3MTE0LjYy","upper_bound":"Mjg5Mjg4LjM4","repeats":3},{"count":70200000,"lower_bound":"Mjg5MzEz","upper_bound":"MjkxNzMzLjc=","repeats":3},{"count":70500000,"lower_bound":"MjkxNzkwLjI=","upper_bound":"Mjk0NTA3LjEy","repeats":3},{"count":70800000,"lower_bound":"Mjk0NTIzLjEy","upper_bound":"Mjk3Njc1LjI4","repeats":3},{"count":71100000,"lower_bound":"Mjk3OTgxLjE2","upper_bound":"MzAwNjkxLjc=","repeats":3},{"count":71400000,"lower_bound":"MzAwNzY2LjY2","upper_bound":"MzAzODI5LjAz","repeats":3},{"count":71700000,"lower_bound":"MzA0MDgwLjEy","upper_bound":"MzA3NTU2LjM=","repeats":3},{"count":72000000,"lower_bound":"MzA3NzI3LjYy","upper_bound":"MzExNDM2LjI1","repeats":3},{"count":72300000,"lower_bound":"MzExNDYzLjQ=","upper_bound":"MzE0NDYxLjU2","repeats":3},{"count":72600000,"lower_bound":"MzE0NDc4Ljk3","upper_bound":"MzE4NTg2Ljg4","repeats":3},{"count":72900000,"lower_bound":"MzE4NzUwLjk0","upper_bound":"MzIyNzQyLjM4","repeats":3},{"count":73200000,"lower_bound":"MzIyNzYwLjI4","upper_bound":"MzI4MDg5LjU=","repeats":3},{"count":73500000,"lower_bound":"MzI4Mzk2","upper_bound":"MzM0NzIyLjk3","repeats":3},{"count":73800000,"lower_bound":"MzM1Mjg2Ljk0","upper_bound":"MzQzNTYxLjcy","repeats":3},{"count":74100000,"lower_bound":"MzQzNzAyLjk=","upper_bound":"MzUwNDUx","repeats":3},{"count":74400000,"lower_bound":"MzUwODYzLjk0","upper_bound":"MzYyMTU2LjAz","repeats":3},{"count":74700000,"lower_bound":"MzYyMzQwLjE2","upper_bound":"Mzc5NTM5Ljg4","repeats":3},{"count":75000000,"lower_bound":"Mzc5ODEzLjQ0","upper_bound":"NDc4OTY0LjI=","repeats":3}]},"cm_sketch":{"rows":[{"counters":[36895,36318,36653,36563,36791,36816,36782,36017,36547,35871,36962,36033,37018,36912,37381,36939,36995,36658,36980,36342,36765,36112,36389,36501,36669,36609,36760,36234,36106,36707,36105,37049,36410,36680,36437,36887,37034,36978,36786,36744,36024,37082,37044,37056,36616,37892,35690,36058,36718,36527,37471,37148,37426,36452,35936,36866,36751,36562,37215,36815,36061,36405,36482,37051,36760,36540,35901,36898,37489,36104,36788,37053,36797,36712,37156,36904,35869,36800,36379,37072,36729,36928,36935,36839,36415,36157,36877,35828,36889,36756,36403,36975,37084,35579,36503,36349,37072,36238,36732,36943,36256,36500,37085,36292,36992,36951,36133,36449,36882,36630,36069,35805,37148,36496,36808,36655,36963,36551,36248,36520,36697,36442,37708,36658,35844,36271,36073,36779,36475,36649,36683,36871,36850,35656,36709,37021,36428,37137,36900,37764,36874,36871,36415,36570,35737,36435,36954,36955,36926,36537,36943,37101,36642,36486,36355,37151,36144,36684,36589,36709,36510,37166,36969,36301,36280,36290,36439,35929,36994,36471,36264,36364,36188,37133,36486,36594,36092,36699,36464,36259,36710,36783,36583,37214,36449,36858,36362,36184,36470,36382,37389,36504,36173,37241,36409,36570,36453,36776,37133,36901,37621,36500,36047,35859,36574,36464,36504,36192,36469,36620,36444,36823,37154,36573,35941,36745,36772,37041,36679,36775,36352,37651,37072,36920,36067,36458,36138,37138,36423,36072,36481,36512,36819,36612,36556,36222,36751,36053,37599,36511,36775,36245,36059,37341,36753,37157,37251,36952,36798,35847,37241,37294,36130,36444,36833,37351,36811,36680,36192,36654,36534,35706,36108,36516,36931,36197,36477,37086,36025,36173,36437,36408,36318,36204,36793,37102,36349,35812,36309,36707,36248,37193,37362,36547,35494,36461,36859,36338,36423,36545,37243,37101,37005,36589,36481,37397,36155,37098,36161,37117,36717,36651,36590,36076,36812,36557,36756,36704,37039,36138,37247,37524,36118,36282,36868,37315,37016,36862,36246,36662,36471,36668,36576,36313,36858,36037,37415,37103,35924,37356,35722,36333,36487,36009,36581,37289,36144,36549,36759,36633,36419,36836,37229,37005,36132,36954,36171,37409,36620,36889,36141,36865,36441,36422,36807,36151,37010,36702,36780,36543,36022,37362,36814,36069,36722,36618,36186,36542,37155,37117,35965,36904,36434,36860,35700,36732,36848,36601,36090,36704,36325,36382,36762,36740,36380,36347,36156,36761,36188,36795,36741,36901,37314,35977,36801,37023,36442,35991,36203,35789,36500,36544,35834,36862,36957,36101,37073,37338,36962,36193,36899,35915,37040,36245,37063,36922,37073,36047,36951,36639,36339,36629,36660,36535,36053,36153,36505,36457,36150,36021,37323,36208,37071,36469,36700,36522,36022,36010,37211,36351,35745,36541,35920,36728,36679,37186,36803,36496,36685,37348,37109,36396,36829,36172,36560,36834,36150,36651,36057,37519,35814,36979,36528,36870,36466,36466,36800,36393,36791,36772,36380,36764,36705,35906,36292,35935,36446,36156,36295,36208,36475,36794,36947,37037,36322,36763,36419,36870,36798,36334,35804,35440,36752,36562,37424,36332,36848,36055,36274,36405,36590,36700,36470,37410,36373,36565,37269,37000,36751,36743,36885,36782,36487,36629,36828,36692,36596,36438,36352,36643,35907,36827,36677,36320,36717,36525,36666,36782,36616,36189,36064,37116,37002,36236,36954,36855,36761,36442,36305,36402,37322,36214,36604,37037,37294,35838,36823,36455,36498,35821,36563,36619,36791,36507,36976,36537,36790,36383,36175,36396,36201,36316,36584,36872,36530,36525,37218,36561,36673,36853,37344,36080,36168,36822,36746,37357,37009,36354,36682,36286,36593,36401,36634,36656,36673,36591,36456,36266,36924,37064,37341,36775,36524,36815,36475,36067,36907,36216,36670,36406,35883,37524,37568,36887,35737,36726,36268,36243,37348,36370,36293,36301,36270,36610,36392,36375,36700,36553,36703,36805,36329,36475,37486,36662,36739,36858,36529,36921,36381,36349,36667,36551,36352,36830,37267,37326,37526,36978,36161,36377,36878,36003,36788,36524,37465,36474,36955,36504,35777,36929,36716,36354,37304,36669,36883,36230,36479,36635,36593,36962,36814,36844,36639,36466,36077,36367,36655,36391,36241,36755,36035,37395,36191,36446,36441,36214,36029,37005,36471,36905,36325,36040,36805,36605,37579,36221,36295,36528,36571,36537,36744,36322,36753,36260,36646,36365,35983,36248,36590,36599,36805,36459,36795,36084,37097,36627,36152,37202,36275,36720,36776,35892,36079,36472,36569,36398,37119,36558,36631,37445,36973,36702,36759,36433,37196,36420,36452,36076,36463,36644,36491,36658,36508,35885,36469,36909,36629,36518,35513,36448,36755,36723,36645,36595,36588,36601,36456,36154,37178,36598,36776,36605,36254,36869,36002,36555,36496,36326,37038,37014,36063,36044,36423,36526,36349,36070,36919,36114,36439,36012,37719,36648,36588,37083,36608,36616,36821,36626,36015,36022,36462,37371,36749,37439,36173,37200,36626,36874,36546,37074,37159,36330,37087,37067,37056,36475,35973,36706,36750,36382,36773,36052,37313,36417,36069,36599,37421,36799,36156,36179,36978,36381,36594,36337,36042,36432,36934,36805,37631,36457,37071,36568,36100,36791,35457,37306,36137,35929,36403,36633,36000,35991,36622,36722,36283,36922,36527,36960,37181,36894,36738,36556,36905,36930,36570,37111,36658,36471,37188,36254,37412,36789,35571,37074,36253,36766,37124,36422,36399,36605,36945,36366,36711,36881,36483,36076,36716,36787,36132,36636,36129,36634,36825,36423,36303,37077,36667,37007,36685,36382,36281,36642,36550,37109,37196,36421,36708,37065,37744,36625,36909,36680,36330,36822,36173,36569,37264,37291,37145,36981,36927,36164,36572,36233,37149,36940,37459,36040,37334,37017,36747,36513,36972,36953,35823,36365,36138,36258,36825,36286,36384,36687,35779,36270,37332,36590,36502,35868,36426,36298,37192,37216,36636,36319,35887,36342,37030,35945,35730,37016,37211,36475,36483,36680,36942,37046,36911,36335,36060,37664,36991,36240,36823,36610,37480,37002,36118,36298,36768,37679,36513,36705,37048,36532,36655,37197,36137,36728,36169,36598,35875,36883,37181,37107,36734,36447,36236,36676,36445,36774,37168,36891,36793,36205,36384,36379,37400,36308,37595,37065,36844,36994,36277,36359,36709,36745,35794,36592,36493,36417,36592,35529,36627,36693,35923,36444,36708,36922,36758,36517,37094,36919,36784,36630,36144,36263,36762,36943,35749,36576,37100,36406,37355,36603,35500,36853,36676,35957,36451,36319,36076,37053,36152,36266,36867,36508,36197,36740,36899,36576,35849,36397,36406,36697,36371,36652,37203,36723,37625,36016,36756,35949,36468,36220,36337,36256,35707,36630,37662,36168,36456,36325,36173,36641,36121,36866,36152,36438,36522,35941,35943,36781,36072,36625,37378,36741,36301,36476,36805,36519,36580,36740,36499,36542,36840,36858,36600,36205,36367,36389,36382,36876,36225,36716,36298,36792,37663,37040,36959,36342,37115,36213,35698,37380,36964,36761,36870,36878,36730,35956,36434,36483,36560,36689,37296,37007,36748,36200,36265,36541,36638,36731,36675,36353,37072,36449,36410,36761,36348,36932,36763,36928,36356,36271,36244,36115,36530,36804,36468,36879,36728,36873,36683,36771,37062,36718,36584,36778,36674,36698,37293,36407,36887,36390,36791,36941,36717,36705,36844,36373,37530,37029,37336,36346,37114,36641,36778,36079,36920,36471,35798,36788,36900,36387,37272,37028,37242,36770,37149,36602,37181,37057,36831,36265,36126,36889,36927,36666,36228,37029,36493,35891,36983,36700,36664,36867,36832,36784,36714,36518,36634,36059,36646,36184,36858,36302,36138,36640,36754,36290,37025,36316,36012,36868,36748,36506,36698,36996,36833,36643,36672,36553,36852,36695,36483,36524,36332,36568,36091,36670,35903,35835,36771,36244,37001,36466,36848,36685,37227,36146,36260,36306,36584,36767,36526,37465,36161,36642,37112,36487,35963,36136,36583,36833,36229,36589,37242,36823,36732,36925,36706,36881,36547,36367,36603,36799,37097,36187,36468,36273,36404,36963,37188,36804,36888,36418,35930,37149,36278,36864,37132,36811,37078,36724,36285,36546,37064,36199,35921,35814,36415,37395,36797,37033,36842,36935,36910,36243,36488,36113,36895,36403,36647,37237,36609,37319,35949,35968,37377,37010,36587,36623,36601,36361,36558,37063,36576,36409,36252,37358,36489,36346,36779,37203,36157,36398,36014,36784,36652,36392,36132,35647,36267,36805,36976,36962,35872,36350,36720,36673,36146,37188,37408,36689,36713,37387,36926,36359,36570,36268,36877,36918,35978,37444,35879,37119,36211,37046,36517,36237,36087,36128,36452,36767,37120,36952,36686,36936,37017,36594,35698,35678,35764,35937,35819,35941,36303,36254,36852,36596,36155,36446,36743,35958,36827,36605,36783,36132,36156,36426,36110,36526,37132,35971,36088,37002,36976,37272,36329,37119,36872,36348,36921,36366,36825,36908,36076,36211,36436,37346,35926,37288,36902,36479,36780,37139,36444,35972,37191,36511,36856,36323,37446,36642,36269,36420,36597,37541,36958,36301,36534,36496,37609,36970,36382,37286,36180,36791,36206,36395,37303,35880,36961,35644,36965,36655,36946,36928,36745,36232,37066,36631,36633,36362,37263,36463,36812,36147,37170,36494,37195,37056,36185,37505,37452,36595,36855,36735,36483,36680,36420,36555,37018,37083,37092,36603,36507,36871,35931,36485,36755,37444,36043,36839,36326,36357,36593,35653,36515,36916,36516,35961,36649,36925,37168,36884,37322,36869,36897,36200,36114,36607,36433,36774,36808,36432,36764,36499,37132,36214,36826,36838,36630,37381,36485,36958,37151,36507,36489,36231,37084,36688,37298,36409,37086,37012,36900,36432,36420,36571,36754,36644,36931,36637,36600,36848,36452,36310,37523,36827,36366,36796,36882,35790,36799,36406,36023,37808,37720,36486,36957,36041,37269,36696,36129,36184,36868,36002,36334,36317,36992,36837,36535,37133,36957,36619,36223,36503,35661,37435,38013,36895,36673,37008,36761,35981,36373,36277,36871,36970,36020,36982,36085,37139,36905,36577,36642,36496,36005,36901,36352,36409,37245,36668,36559,36753,36382,36911,36731,36456,35792,36355,36363,36712,36230,36707,37146,36073,36224,36949,36692,36088,36316,36662,36636,36589,36798,36369,36674,37139,36501,36586,36598,36566,36817,36933,36522,35933,36242,37266,36686,36379,36681,37227,36596,36909,37032,37017,36418,36799,36698,36737,36473,36770,36611,37360,37384,36675,36388,37006,36307,36260,35810,36251,36166,36645,36306,36549,35745,36427,36783,36605,36639,35650,36767,37912,37122,36924,36163,36529,36529,36604,36645,37110,37045,36527,36736,37382,36791,37038,36300,36867,36261,37056,37212,36635,36756,37360,36806,36879,36443,36423,36898,36611,36086,36314,36639,36864,36145,36241,36791,36146,36536,36458,36037,36151,37061,37268,36216,36679,37362,36469,36553,37066,37209,35754,37106,36616,36781,36675,36568,37838,36424,37585,36709,37045,36636,36271,36228,36649,36686,36641,37283,37032,36544,37139,36806,36742,36326,37242,36108,36625,36046,35760,36715,37072,36509,36366,37141,37156,37104,36948,35928,36553,36648,37179,36687,36711,36749,37109,36720,36268,37133,36892,36986,36756,36594,36476,35423,36788,36630,36174,36110,36904,36752,36588,36706,36318,37012,37084,36169,37126,35811,36846,36480,36436,36816,36577,36177,37362,36537,35875,36832,37425,36609,37311,37042,36319,36338,36468,36897,37043,36712,36422,36553,36762,36657,35766,36508,37033,36580,36616,36878,36751,36703,36499,36775,36907,36804,35713,36545,36384,36901,37375,35967,36598,36239,37274,36595,36789,36423,36358,36292,36162,36711,36674,36299,35622,37316,36491,36862,36491,37139,36781,36606,35659,36912,36232,37164,36854,36611,36600,36433,36252,36614,37641,36561,37006,36673,36840,36422,36388,35925,36826,36048,36207,36838,35929,37382,35659,37117,35834,36949,36765,36506,36790,36909,36719,36775,36378,36167,36551,36949,36918,36312,36555,37281,36388,36587,37237,36611,36868,36816,37130,35754,36358,37221,36488,36667,37249,36867,36514,36673,36740,36397,36262,36858,36565,36286,36536,36844,37449,36507,36775,37524,36915,36662,35694,36523,35952,35863,37092,36813,35950,36267,36810,36856,36094,36823,36364,36885,36088,36248,36242,36869,36684,36426,37163,36554,36694,36453,36552,36522,36603,36478,37242,36556,36008,36807,36930,36600,36425,36418,37310,37294,36523,36770,36989,36843,36627,36884,37013,36616,36040,36128,36409,37305,36273,36672,36151,36524,36684,36503,37149,36883,36426,36739,36776,36855,37090,36705,36292,36430,36803,36820,36859,36604,36584,37129,36395,36589,36671,36507,36290,36941,36191,36623,36511,36352,36606,35983,36299,37048,36516,36423,36407,36274,37381,36654,36832,37075,36974,36795,36896,36043,36481,36581,36645,36325,36379,36519,36488,36724,36872,36845,36540,36756,36103,36793,36426,36185,35730,36617,36464,36801,36767,35790,36885,36534,37292,37498,36316,36211,36801,36424,36959,35896,36751]},{"counters":[36638,36174,35922,36815,37186,36900,36755,36624,36536,36730,36500,36554,37153,36714,37248,36771,36481,36533,37406,37012,36271,36590,35648,36780,36985,36648,36773,35985,36605,37271,36645,36538,36405,37253,36521,37377,35948,36609,37050,37181,36910,36012,37113,36086,36561,36378,36581,36879,36042,37311,36440,37177,36120,37028,36707,36681,36533,37209,36795,36266,37390,36947,36810,36169,36244,36463,36926,36341,36569,36200,36291,36636,36517,36800,37078,36651,37053,36903,37447,36182,35992,36475,37353,35914,36730,37112,36288,36364,35867,36378,36235,36540,35887,36257,36712,37369,36942,36604,36994,36774,36701,36419,36924,36995,37246,35955,35545,36351,36818,36668,36267,36905,37044,35969,36938,36746,36459,35781,36112,36282,37673,35582,37025,36970,36439,37028,37120,36618,36107,36724,36993,35775,36803,36599,37158,36860,36759,36379,36855,37232,36125,36120,36639,36527,36296,37227,36066,37597,36233,36278,36834,36249,37014,36495,36730,36743,36880,36593,36094,36279,37333,36770,36133,36796,36532,36968,37086,36953,36454,36297,36581,36863,37164,36497,37186,37097,36558,36349,36501,36954,37322,36018,36163,36531,36791,36235,36148,36445,36938,37510,36545,36467,36750,36421,37018,36860,36979,36391,37482,36560,37093,37078,36582,36276,36468,37105,35882,36308,36852,37305,36102,36522,37191,36318,37037,36053,36767,36299,37078,36864,36237,37292,36607,36827,36924,36229,36745,36973,36379,36443,37679,36731,35990,36643,36702,36980,36188,36584,36324,36420,36181,37195,36839,36027,36557,36655,36263,36856,36709,36477,36417,36629,36346,36416,36780,36353,36563,35945,37370,36439,36969,37064,36530,36737,36564,36768,36655,36725,36799,36525,36443,37055,36951,36777,36639,36653,36995,37110,36452,36818,36556,36001,36394,37238,36243,37223,36337,36352,36409,37179,36755,36366,37199,36784,37089,37181,36350,36603,36528,36612,37247,36711,36075,36754,36584,37242,37003,36576,36642,37105,36192,36796,36314,37475,36485,35778,36181,36460,37763,36518,36402,36832,37065,36874,36375,36693,36943,36207,36791,36449,37343,37442,37046,36669,36803,36687,36853,36371,37036,36067,36392,35772,36099,36567,37201,36554,36983,36175,36687,36648,36953,36078,36721,36874,36545,36946,36585,36662,36873,36709,36814,36468,36575,36666,36913,37246,36617,36719,37358,36906,36352,36790,36690,36683,36297,36670,37118,36922,36743,36265,36115,36901,37527,36322,36046,36589,37153,36196,37158,37094,36664,37212,36514,36242,35768,37007,36363,35872,36747,36172,36742,36500,36216,36459,36873,36782,35924,37073,37175,36498,36602,36423,36459,37100,37335,36305,36871,36693,36154,36498,36751,36501,36748,36769,36626,36447,36707,36415,36985,36219,36838,36030,36673,37012,36366,36965,36319,35904,36208,37181,37149,36711,36477,35762,36942,36221,37162,36841,35939,36608,36569,36506,36629,35788,36936,36022,36643,36390,37215,36849,36820,36209,36775,36921,36239,37026,37148,37156,37423,36162,36913,36819,37250,36251,36582,37021,36016,36419,36848,36479,36746,36364,37221,36502,36683,37315,36438,36718,36573,36912,36355,36182,36818,36178,36882,36371,36393,37017,36104,36759,36560,36457,36871,36759,36359,36546,36408,36293,36455,37491,36872,36017,36947,36476,35942,36743,36334,36749,36712,36805,36224,36449,36614,36286,36972,36258,36342,36812,35947,37635,36817,36149,36892,37385,37277,37008,37416,36777,35875,36515,37241,36941,35885,36378,36978,36258,36582,36406,37357,36704,35949,36756,36181,36521,36701,36210,36567,37173,37326,36651,36869,36320,35959,36990,37066,36475,36300,37243,36489,37100,36696,37172,36375,36813,37029,36510,36457,36685,36763,36425,36794,36813,36470,36749,36192,36290,36282,36998,36016,36491,36946,36051,36906,36242,36709,36412,37177,36055,36389,37235,36669,37037,36608,36551,35684,36147,37150,36685,36447,36184,36866,36368,36658,36775,36241,35965,36311,36389,36626,36110,36889,37198,36854,36524,37298,36206,36944,36600,37110,36340,37735,36363,36587,36406,36649,36613,36232,35901,36478,37291,37529,36197,36350,36361,36963,36746,36689,36863,36657,36622,36334,36623,36172,36335,36069,36907,37045,36242,36935,37393,37052,36252,36508,36961,37105,36664,36443,37041,36566,36340,37193,36732,36516,36716,36523,36786,37622,36662,35985,36975,36646,35810,36523,36523,36435,36796,37255,35975,36171,36653,36576,37031,36588,36464,36678,36200,36279,36771,36424,37072,36926,35954,36417,36118,36523,36932,36824,36933,36831,37142,36322,36448,36217,35615,37080,36748,36883,36064,36736,36022,36978,36592,37003,36140,35712,36358,36930,36418,36679,36054,37194,35853,36542,37076,36317,36969,36445,36939,36766,35633,36837,36415,36736,37187,36966,37027,36047,37405,36837,36526,36873,36978,36647,36682,36659,36669,36498,37315,36598,36874,36531,35445,35932,36521,36907,35963,36478,36371,36389,36974,37447,36576,36948,36882,36543,36401,37340,36081,36358,36934,36462,36236,36991,36755,35909,36005,36931,36446,36255,36371,36771,37001,36661,35991,36458,37380,36507,36687,36971,36084,36838,36172,36389,36685,36961,36907,36460,36421,36540,36602,36278,36146,37010,36698,36063,36008,36630,36272,35531,35998,35683,36716,35947,37076,37323,37367,36158,36728,36019,37384,36450,36682,36540,36853,36736,36966,36657,37158,35580,36359,36747,36820,36429,36029,36580,37183,36840,35937,36831,37323,37164,36848,36435,36528,36256,36417,36558,35771,36186,36615,36597,37071,37020,36604,36886,37103,35918,36634,36410,37247,36199,36703,36655,36185,36480,36231,37507,37050,35398,37283,36678,36381,36730,37699,36886,36385,36314,36935,36626,36556,36585,37217,36761,35767,36335,36515,36840,36320,35930,36597,36733,36848,37423,36727,36890,36980,37004,36314,36372,36804,37064,36197,36751,36698,36545,36274,36430,36436,36460,38154,36825,36202,37067,37160,36731,36558,36959,36723,36905,36621,36697,36245,36630,36605,36577,36788,36505,36988,36568,36818,36682,36599,36128,36168,36942,36971,35944,35855,36918,36562,36307,36541,36426,36169,37002,36872,37085,36415,36998,36427,37486,35884,36893,35857,36506,36428,36654,36272,36132,36607,36186,36437,37089,36542,36254,36753,36274,36417,36261,37354,36387,36421,37327,36571,36496,36538,36253,36273,37213,36716,36036,37310,37236,37199,37044,36910,36304,36309,36476,36493,36902,36316,36843,36892,37029,36405,36596,36609,36877,35948,36618,36736,36769,37221,35944,35738,36436,37281,36534,36612,36579,37810,36863,36394,36507,36250,36832,37435,36031,36946,36467,36884,36647,36576,36914,36408,36712,36415,36821,35964,36651,37305,36606,36121,36660,36601,37185,36490,37616,36497,37128,35963,36935,35869,36038,36842,36835,36885,36227,36455,36629,36877,37292,36557,36418,37074,36349,36462,36008,36554,36108,37626,36034,36766,36407,36860,36286,36783,37427,36324,36936,36659,37297,36120,36557,37057,36226,36893,36435,36660,36137,36918,36654,36044,36189,36501,36354,36512,35758,37550,35801,36835,36644,37060,36948,36706,36129,36324,36571,35946,36741,37368,36352,37352,36501,36418,36623,36309,36038,36951,37121,36249,37069,36411,37476,35929,37371,37106,36715,36898,37570,35868,36606,37044,36265,37105,36916,36530,36047,36074,37703,36700,37031,36011,36401,36750,36607,37009,37026,36843,36433,36495,36613,36108,36470,36575,37302,37182,36563,37200,36561,36501,36585,36105,37038,36384,36881,36836,36801,36627,36674,36709,37017,36706,36844,36744,36634,36209,36300,36856,36963,36464,36712,36258,36303,36310,36363,36574,36330,36134,36143,36402,36506,36430,36599,36134,36444,36618,36310,36722,36038,37170,36929,36160,36082,36902,36843,36311,36375,36884,36702,36494,36219,36239,36777,37374,36710,36815,36311,36021,36793,35917,36902,36669,36673,37001,36050,36444,36925,37139,37088,37122,36862,35766,36717,36516,36438,36261,36908,36335,36709,37126,36431,36662,36522,36748,37153,36623,36697,36015,37176,36713,36781,36199,37096,36328,36769,36206,36501,36081,36741,36592,37120,36207,37045,35837,36679,36168,36765,36624,36476,36722,37220,37464,36880,36706,36744,37068,36314,37207,36936,36967,36253,36849,36921,36631,36444,36501,36923,37507,36399,36974,36193,36102,36896,36110,36932,36123,37477,36652,36913,36816,37695,37159,36870,36714,36546,36541,36852,37042,36960,36612,37321,36746,36179,36937,36507,37139,36415,36496,37140,36873,37228,36605,35498,37563,36773,36448,36419,36556,36091,36652,36526,35788,36384,36447,37238,36691,36728,36658,36986,36342,36430,36442,36470,36735,36304,36820,36832,36212,36715,36948,36854,36653,37368,36961,36562,36951,36838,36946,36796,36192,36252,36172,36557,36808,36111,36409,36457,36617,36820,36272,36842,36641,36928,36599,36210,36080,37162,36441,37019,36277,36633,36616,37055,36855,36761,36977,36332,36199,36769,36492,37199,37050,36956,36468,36763,36932,36928,36881,36933,37554,36366,36580,37335,36566,36951,36641,36278,37128,36730,36167,36922,36162,36117,37341,36385,36862,36642,36764,37300,36536,36711,36959,36971,36371,35812,36318,36487,37601,36149,36436,36646,36810,36380,36172,36466,37044,36106,36218,36531,36366,36457,36174,37121,36667,35666,36957,36846,36681,36662,36094,36821,36664,36982,36928,36476,36748,36667,37126,35813,37027,36335,36982,36356,36787,36022,36781,36701,36490,36484,36342,36946,36451,36945,36210,36232,36622,36659,36526,36919,36345,37009,36097,36995,37042,36449,36902,37054,36698,36189,36803,36901,36431,37088,36579,36336,36359,36842,36523,36385,36933,36645,37008,36091,36757,36621,36535,36386,36099,36476,37663,36500,37125,36912,36397,36822,36840,36806,36357,36978,36508,37554,36823,36912,36395,36239,36868,36870,36180,36409,36561,36161,36283,36626,36487,37479,36054,36570,36046,36719,36581,36584,36368,36378,36382,36096,36526,36065,36256,36584,36408,36495,36516,36758,36938,37313,36696,36670,36218,36862,36600,36742,36109,36613,37134,36808,36931,36709,37244,35985,36737,36313,36675,36675,37244,37416,37697,36621,35910,36158,36878,36358,36303,37114,36764,36135,36320,37472,36460,37162,36971,36560,37156,36551,36718,36827,36737,36403,36339,36450,36495,36570,36534,37134,36891,36510,37140,36319,37363,36784,36755,36391,36659,36505,36303,36613,37264,36542,36405,36085,37386,37282,35608,36477,36490,35742,36065,36724,36461,35858,36547,36922,36576,36263,37026,36164,36860,36793,35903,36518,36157,36996,36295,36613,36790,36449,36360,35893,36691,35929,37127,37010,36451,36871,36184,36354,36577,36086,36639,36874,36989,36377,36708,36712,36387,36299,36735,36351,37042,35737,37071,36870,37450,36673,36583,36791,36266,36205,36513,36091,36621,36236,37059,36760,36302,35908,36539,36400,35768,36554,36135,37042,36553,36594,36009,36782,36396,36908,37057,36014,35803,36184,36709,36466,36890,36588,36412,36317,36665,36533,36448,36309,35911,36357,36933,36372,36171,36342,36275,36617,36672,35969,36565,37383,37347,36891,36543,35761,37142,36338,36320,36541,36194,36286,36417,36958,36686,36673,36822,36692,36318,36104,36715,36634,36569,36073,35833,37224,36346,36120,36929,36694,36336,36167,37094,36086,36866,36440,36792,36747,36630,36836,37277,36349,37697,36390,36753,36852,36309,36893,36790,36570,37387,36256,36406,36535,36547,36408,36225,36509,36403,36684,36232,36469,37448,36823,36610,36986,36602,36521,36333,36099,36518,36485,36193,36691,36721,36425,36793,37417,37125,36603,37384,36809,36735,36135,36567,36363,36687,36719,36771,36847,37178,35775,36733,36167,36074,36099,36462,36834,36183,37312,36435,36883,36430,36905,37206,36505,37151,36154,37208,36598,36829,35988,36624,36796,36982,36611,36701,36653,36291,36928,36009,36402,37493,36552,36888,36626,36926,36793,36165,36761,36943,35756,38051,36091,37314,36623,36511,37069,36645,36584,35810,36678,36686,36341,36178,37130,36585,37109,35928,36857,37089,37024,37277,35969,36996,36771,36350,36494,36205,36695,36491,36546,36508,36421,36919,36807,36306,36152,36136,37138,36156,35930,36309,36580,37288,36951,36411,36276,36648,36464,36496,37061,36298,36274,36689,36234,35868,37056,36429,36150,36429,36798,36493,36107,36355,36295,36424,36952,36610,36152,36900,36287,36177,36569,36893,37128,37337,37346,36705,36746,36847,36785,37060,36856,36106,35782,37273,36551,36285,36858,36197,36278,36415,36228,36366,36023,36366,36633,36734,36350,36615,36576,36215,36472,36460,36943,36024,36366,36660,37411,36235,36857,36429,36768,36790,36253,36741,36853,36718,37311,36420,35942,36445,36216,36949,36391,36760,36546,37223,37190,36334,36374,36906,36198,36606,36385,36266,36263,36942,36915,36654,36552,36616,36999,36760,36273,37193,37447,36290,36286,36818,35599,36066,37077,36268,36829,36982,35896,36344,35937,35976,36396,36485,35899,36471,36800,36041,36511,36075,37263,36744,36661,36647,36105,36013,35882,37180,35783,36549,36812,36196,36460,36610,36000,35741,36477,36720,36851,35714,36460,37622,36215,37015,36808,36838]},{"counters":[35896,36457,37023,36440,36877,36198,36497,36730,37180,36255,36510,36015,36067,36694,37456,36833,36657,36676,36378,37028,36639,36973,36875,36576,37300,36359,36695,37683,36834,36704,36835,36502,36140,36678,37101,36401,36888,36395,36556,36603,36303,36821,36371,36668,36046,36617,36275,36904,36465,36213,36971,36638,36589,37266,36963,36663,36763,36569,36400,36667,36844,36459,36993,37419,36741,36901,37019,37142,36408,36729,36334,37136,36898,36551,37050,36619,36414,35798,36780,36091,36644,36797,36482,36682,36230,36780,35865,36308,37208,36837,36882,35887,36968,37321,36261,37068,36187,36414,36612,36415,36663,35973,36168,36473,35891,36578,36836,36162,36649,36635,36391,36052,36900,36819,36143,37079,37178,36337,36263,36451,36070,37134,36728,37218,36558,36546,36683,36905,37370,36668,37116,36680,37016,36130,36456,37185,35925,37077,36590,36593,37083,36798,36606,36243,36501,36962,36283,36814,36544,36424,36387,35819,36291,37169,36693,36458,36674,36288,36207,36199,35609,36894,37065,36681,35995,36365,37870,36958,36593,37408,36980,36196,36575,35897,37082,36360,36856,37083,35908,36567,36002,35925,36761,36717,36331,36033,37083,36478,37253,36978,36463,36111,37076,36427,36551,36985,36567,37447,36976,36817,37043,36666,37073,36751,36234,36464,36327,36653,37166,36770,37015,36659,36299,36323,36449,36719,36265,37038,36529,35883,36447,37090,35888,36369,36453,36761,36335,36408,36920,36275,36445,36987,36222,36074,36705,36573,36380,37185,36555,36083,36406,35849,36321,36568,36237,36693,36561,36780,37408,36587,37011,36332,36952,36503,36129,37042,35885,36931,37635,36990,37009,36235,37019,37161,36708,36413,37134,36306,35940,36721,36768,36799,36802,36748,36161,36762,36914,36660,36529,36656,36162,36075,35939,36303,36513,36807,36135,37687,37193,36648,36318,36107,36848,36941,36520,36302,37230,36711,36712,36515,36688,36687,37052,36302,36868,36704,36461,36326,36754,36344,36869,35978,36946,37063,36348,35843,36732,35854,36102,36411,37201,36566,36194,36376,36896,37539,36814,36313,36327,36562,36777,36907,36911,36311,36944,36863,35928,36726,37033,36588,36129,36617,37016,36517,36589,36592,36334,36489,36211,36383,36118,36527,36156,36420,36488,36555,37742,36734,36551,36385,37117,36905,36502,35544,36876,35427,36252,37034,36509,36438,36484,36617,36757,36993,35889,36744,36398,36889,37250,36029,36377,37027,35994,37215,37303,36889,36891,36091,36095,36469,36548,36560,36518,36678,36602,35972,36683,36327,37012,36201,36461,36809,36224,36307,36995,36272,36918,35770,36849,36031,36995,36134,37159,36418,36173,36511,37230,37038,36913,36221,36480,36396,36791,36554,36521,36075,36675,36907,36441,35995,36816,36478,37501,37111,37203,36404,36540,36124,36999,36434,35669,37177,36220,36349,36748,36835,36859,36762,36380,37031,36321,36211,36319,36274,36770,36268,36066,37365,37107,36139,37222,36913,35814,36981,36289,36820,36341,36417,36941,37721,36208,36151,36370,36943,36308,36414,36365,36623,36110,36049,36421,36415,36554,36402,36835,36544,36374,37560,36397,37265,36528,37667,36476,36462,36747,36600,35747,37170,36239,37189,36033,36224,37095,36365,37061,36559,37022,37250,35799,36496,36416,37426,36552,36756,36300,36090,36172,35920,36282,36384,36143,36074,36560,37052,36728,36294,36853,35836,36350,36281,36622,36242,37222,36717,36934,36490,37089,36885,36471,36292,35907,36697,37783,37310,36976,36479,36279,37036,36544,36457,36143,36837,36490,36545,36684,36171,36475,36686,37373,37051,36981,36894,36843,36810,36129,36638,36969,36799,36528,37050,37240,36636,35961,36874,36885,36216,36238,36167,36854,36233,36866,36726,36440,36987,36226,36207,36324,36172,36227,36468,36706,36966,36568,36743,36574,35893,36759,36676,36679,37060,36880,36599,36350,37050,36569,36965,36231,37455,36941,37048,36221,36478,37317,36048,36796,36170,36347,36625,35885,36471,36392,35960,37073,35970,37570,36380,36592,36529,36932,36452,36281,36079,36534,36803,36113,36749,37040,36870,36492,36229,36601,36880,36786,36570,37388,36462,36400,36428,36125,36901,36291,35894,36497,36736,36544,36809,37222,36475,36461,36606,36715,37000,36826,36451,36778,36564,36425,36626,36843,36777,37378,36336,35659,36396,36507,36527,36529,37395,36915,36712,36176,36291,36228,36667,36349,36415,36269,36454,36866,36954,36895,36443,37026,36866,35777,36176,36883,36971,36591,36579,36471,36935,36338,36450,37591,36058,36767,37464,36414,36945,36529,36846,36321,35656,36253,36689,36813,37360,35692,36958,36706,36894,37390,37072,37000,37078,37586,37377,36447,37155,36810,36352,36750,36710,36481,36281,36478,36593,37120,35800,37520,36199,36691,37064,36334,35900,37710,36269,36998,36874,35858,36057,36796,37046,37432,37117,36327,36816,36339,36639,36064,36002,36173,36512,36043,36013,36587,37018,36357,36534,36709,36536,36695,36562,36318,36017,36756,35840,36965,35961,36455,36073,36640,37246,36250,37407,36643,36944,36690,35735,37005,36550,36737,37303,36641,36803,36606,36032,36469,36598,36834,37032,36325,36484,37093,36835,36674,36313,37215,36222,36171,36057,36422,36683,36217,36300,36423,36170,36776,37026,36681,36699,36794,36488,36869,36676,36861,36354,36949,36451,37029,36966,36406,36242,36226,36270,35646,36376,36763,36152,36066,36212,37128,36198,36579,36988,36802,36773,36291,36906,35407,37239,36089,36726,36329,36699,36604,36749,36552,36238,36860,37138,37316,36560,36863,37106,36844,36933,36499,36174,36621,36733,36652,36828,36605,36097,36362,36261,36909,36052,35883,36348,37157,36644,36934,36327,36247,36180,36675,36731,36700,36636,36639,35905,36735,36487,36600,36940,35879,36355,36281,36294,36586,36831,37000,37733,36612,36618,36986,36923,36901,37014,36826,36748,36143,36657,36466,36586,36976,36162,36706,36868,36260,36561,36402,36905,36043,36718,36685,36754,36251,36670,36198,36147,36079,37035,37160,36429,36839,36253,36374,36622,36599,36534,36882,36449,36586,36213,36828,36399,36644,37093,36649,36757,36749,36954,36652,36473,36295,36457,37113,37076,37078,36554,36916,36939,36318,37060,36745,35737,36384,36278,36459,36908,37082,37263,36784,36430,36548,36827,36717,36686,35882,36617,36237,37098,36263,36722,36559,36391,36914,36297,35711,36134,36102,36814,36036,36701,36440,36273,37200,36769,36270,36203,36799,36900,36543,36723,36627,36719,37173,36434,36845,36133,36410,37174,36112,37305,36638,37049,37263,35795,36679,36463,36476,36069,36625,36915,37211,36314,36650,37035,36652,36467,36654,36845,36911,36557,36657,36482,36977,35696,36615,36833,37276,36518,36812,36734,36787,36606,35680,36451,36380,37183,36732,35877,36193,36881,36620,36613,36450,35601,36549,36050,36863,36840,36965,36918,36166,36159,36924,36234,36508,36417,36478,36217,36312,36988,36014,36603,36430,36715,36386,36571,37038,37037,36485,36729,36684,36384,36328,36496,35782,37217,36476,36013,36671,36600,36174,36259,36757,36840,36403,36846,36373,36642,36985,36653,36091,36029,37180,36572,37175,37123,37493,36953,36430,36870,36005,36685,36308,37113,36235,36247,37083,36835,36005,36973,36113,36697,36607,35983,36912,36518,36348,36203,36610,36991,36460,36454,36683,36568,37262,36385,36470,36470,36698,37023,36406,36825,36063,36147,36826,36492,36604,36165,36790,36417,36488,37040,36350,36341,36123,36246,37224,36643,36792,37027,36000,36894,37470,36934,37271,36756,36436,36605,36437,37387,36918,36629,36067,37254,36785,36011,36108,36059,37257,36767,36323,36630,37603,37131,36165,36572,36793,36289,36879,36052,36189,36926,36730,36596,36432,36958,36590,36398,36161,36463,36670,36695,36597,37066,37399,36603,37328,36374,35745,36477,36718,36233,37224,36255,36177,36397,36729,36954,37230,36950,36436,37128,37409,36677,36776,36434,36416,36561,36936,36553,36819,36573,37240,36340,36352,36604,37411,36504,36717,36606,36646,36890,36598,35842,36924,36333,36336,36058,36974,36543,36074,36207,37109,36258,36895,37545,37273,36368,37416,35927,36859,36919,36521,36165,36814,37425,36275,36816,37070,36466,36310,36954,36799,36788,36533,36560,36244,36164,36327,37113,36315,36660,37453,36824,36307,36730,35773,36356,37109,36645,36898,37024,36750,37106,37093,36537,36464,36989,36521,37023,35667,36568,37377,37008,36908,37003,37355,36934,37354,36406,36723,36685,36646,37062,36658,36565,36690,36935,36371,36127,36179,36482,37352,36634,36421,36998,36705,37047,36859,36032,35756,36655,35706,36457,36615,36222,36607,36299,36331,36874,37122,36716,36684,36438,36481,37406,37004,36821,36994,36676,36130,36238,36751,36656,36612,36014,36465,36828,36645,37014,36819,36789,36601,36909,36134,37054,36857,36946,35954,37710,36081,36504,36798,36816,36498,37174,37224,36902,35872,37375,35845,36620,36454,36231,36631,37165,36800,35990,37015,37179,36811,37257,36527,35969,35984,37154,36449,36512,36217,36378,37061,36424,37071,36586,36907,37121,36019,37239,37011,37146,37203,36654,36958,36518,35963,36163,36193,36187,37236,36084,36562,37076,36623,36911,37053,37017,36884,36654,36391,36722,36769,36333,36700,36458,37141,36338,36732,36126,36194,36873,36509,37483,37152,36961,36509,36400,37302,36671,36740,36821,36013,36206,36839,36377,36402,36697,36644,36364,36956,37019,36675,36605,36609,36562,36203,36829,36446,36368,36423,36706,36790,36794,37276,35917,37237,37092,36085,37425,36574,36766,36651,36450,36129,37517,37259,36372,36183,36634,36511,36775,36769,36172,36623,36299,36616,36515,35873,37037,36463,35729,36858,36392,36485,36303,36114,36614,36739,37309,37004,36938,36508,37414,36556,35758,36952,37147,36569,36626,36321,36723,36049,36748,36542,37274,36163,37063,37372,37240,36260,35499,36922,36906,36448,36815,37701,36770,36371,36896,37073,36185,36841,36519,36514,37088,36584,36177,36398,36805,36268,36861,36721,36197,37008,36091,36464,36684,36299,36855,36344,37211,37370,36389,36987,36573,36178,36922,36149,37255,36440,36214,36497,37152,36450,36922,36300,36266,36519,36897,37003,36264,36478,36934,36491,36191,36972,36174,36554,36573,36376,36857,36936,36619,36862,37169,36896,36947,36429,36642,37083,36887,36187,37363,36551,37380,36230,35745,36413,36239,35981,35996,37106,36141,35422,36719,36291,36431,37553,36994,36473,36141,36547,36848,36712,36933,36613,36599,36957,36268,36441,36679,37047,36829,36682,36110,36411,36843,36509,36463,36286,36446,37402,36405,36660,36016,36928,36718,36651,37065,36223,36813,36765,36261,36902,36028,36953,36594,36416,36418,37089,37042,36649,37053,36416,37260,36943,36475,36045,36880,36510,37349,35964,36989,36577,36741,37006,36772,36969,36761,36779,36390,36614,37438,36857,36885,37080,36724,36622,36926,37223,37298,36971,36414,36423,36857,35860,36901,36166,36445,37009,37254,36818,36361,36160,36458,36424,36995,36952,36619,36994,37530,36306,36893,37142,36238,36731,36534,37353,36852,36338,36345,36508,36140,36682,35913,35479,36206,36754,36531,36366,36718,36280,36750,36076,36738,37031,36261,36874,36508,36853,36649,36918,36578,36736,36457,36733,36341,36968,37247,36520,36478,36777,36540,36632,37018,36706,35993,36735,36948,36763,37511,35839,36386,36511,37422,37037,37160,37006,36474,35901,36598,36237,36911,35927,35671,36463,36854,37475,36316,36599,36672,36844,37074,37312,36597,36247,36742,37036,37113,36078,37009,37224,36822,36369,36586,36407,36537,37171,36836,36434,36276,36233,36221,36041,36507,36870,36902,37390,36499,37015,36848,36241,36505,36730,36687,37005,36463,36922,36321,37084,36984,36143,36566,37102,36437,36320,36587,37092,36998,37567,36079,37095,37297,36588,36977,36220,37258,36739,37101,37330,36479,36475,36318,37233,36114,37155,36167,36804,36999,36271,36749,36506,36077,36744,36575,36638,36416,36453,36820,36902,36583,36581,36631,36788,36482,37198,36498,36606,36864,36105,36670,36834,36421,36453,36356,35815,36468,36151,36719,36807,36785,36457,36949,36561,36300,37212,36615,36780,36421,36436,36952,36707,36747,36778,36450,36464,36218,37410,36292,37332,36545,36267,36579,37085,36424,36611,36887,36907,36314,36494,36616,36241,36295,36873,37414,36921,37120,36548,36806,36391,36426,36568,35893,36725,37034,36600,37235,36245,36929,36643,36025,36571,36448,36968,36396,36561,36676,36272,36777,36328,36671,36849,36631,36920,36670,36529,36366,36701,37454,37022,36712,37500,37350,36302,36412,36951,36446,36219,36589,36771,36364,35826,36210,36746,36533,36905,36827,36992,36089,36293,36641,35966,36465,36214,36864,36724,37264,36882,35910,35877,36286,36707,36210,37291,36657,36380,36411,36957,37163,36542,36203,36623,36709,36331,35822,36854,36575,37347,36602,37535,36430,36414,36686,37121,36822,36497,36587,35967,36354,36891,36121,35743,36620,36298,37063,36824,36464,36126,35795,37218,35988,36952,36365,36501,36631,36380,36983,36623,37139,36301,36638,36777,36606,36874,36461,36309,35996,37078,36391,36871,36671]},{"counters":[36415,36421,36857,37205,36794,37414,36530,36813,36552,36348,36827,36546,36726,36148,36391,36641,36475,36271,36792,36702,36352,36386,36467,36903,36917,36869,36473,36998,35866,36355,36649,37158,36738,36131,36427,37144,36298,37357,36969,36894,37107,36436,37250,37074,36352,36818,36588,36870,37244,36541,36762,36631,36639,36666,36853,36934,36995,37206,36514,36077,36970,37154,36418,37375,36574,36633,36808,35835,36496,36887,36419,36876,36349,36498,36675,36108,36668,36884,36229,36762,36603,36903,36575,36887,37554,36343,36400,36455,36110,36451,36167,36158,36982,36062,36983,36800,35718,36207,36970,36130,36691,36444,37194,36743,36260,36680,36479,36042,36238,36464,37030,36079,36253,36912,37228,36734,36280,36291,36483,37384,36878,36372,36747,36881,36560,36921,37514,36389,37414,36801,36188,36760,36068,37039,36653,36271,36556,36677,37025,36702,37411,36304,36674,36448,36387,36825,36871,35839,36734,36196,36218,36607,37014,36254,37333,36602,36277,36601,36673,36803,36267,36244,36602,36408,36617,36863,36877,36432,36419,37792,37314,36787,36618,36537,36538,35924,37104,36999,36230,36288,37012,36504,36321,36928,36774,36627,36925,36193,35906,36690,36756,36723,36142,36397,36499,36639,36259,36390,37043,37152,37048,36295,36606,36234,36069,36614,36176,36116,36415,36924,36765,36647,36960,36167,36834,36745,36984,36300,37392,35455,36753,36482,37461,36189,36129,36883,36428,36125,36722,36890,36491,36283,36660,36099,36088,36936,36322,36346,36527,36994,36769,36835,35921,36664,36051,36039,36674,36923,36275,36589,36485,36594,36336,36209,36576,36294,37000,37305,35936,36916,37219,35889,36008,36870,36605,36623,36302,37240,37497,36429,36828,36869,36855,36940,36790,37058,36057,36419,35841,37085,36763,37496,36428,36038,36688,36398,36765,35977,35993,36337,35518,36746,36291,36352,36147,36160,36525,36917,36871,36348,36626,36784,36725,36753,37164,36229,36438,36418,36619,36744,37125,37170,36847,36636,36339,36629,36145,36983,36969,35673,36834,36368,36999,36428,37484,36464,36369,36032,36337,36836,36273,35986,36854,36516,37274,36008,36297,36945,37263,37058,36674,37058,36447,36989,35742,36523,36381,36768,36069,36561,36464,37455,37493,37100,36361,37135,36313,36967,36663,36356,36641,36960,36856,36406,36331,36813,36380,36104,36233,36018,36807,36714,36817,36687,36808,36835,36548,36530,37044,36628,36738,36483,36995,36609,36455,36056,36753,36136,36676,37323,36737,36482,36715,36791,36754,36794,37206,37328,36509,36415,37021,36602,35805,36865,36674,36642,37295,35863,36491,37017,36761,36427,36548,36612,37316,36778,36492,36487,35909,37371,36251,36843,36081,36190,36750,36924,36010,37175,37114,35919,36236,37158,36722,36231,36615,36639,36711,35884,36945,36784,36725,36627,37132,35662,36612,36896,36612,36886,37314,36789,36585,37640,36681,35671,36247,36696,36241,37239,37091,36126,37184,36386,37136,37538,36621,36165,36652,36332,36707,36198,35644,36219,36891,36310,37147,37037,36414,36616,36530,36636,36913,36915,36558,36469,36616,36828,36704,37064,37151,36515,36996,36768,36865,36501,35447,36156,36900,37099,36596,36411,36621,35780,36567,36677,37030,36758,36574,36559,36688,36640,36757,37253,36940,35738,36311,36761,36369,37438,37457,36661,36361,36633,37112,36686,36500,36439,36038,36751,36938,35925,36306,37088,36506,37093,37229,36393,36803,36776,36298,36675,36522,37108,36601,36473,36397,36001,36776,36959,36832,37260,36872,36048,36451,37011,36674,36951,36901,36704,36890,35848,36765,36422,37025,36745,36350,36356,36550,36430,36237,36508,36527,37311,35947,37387,37023,36414,36201,36145,37439,37084,37161,36403,36777,36528,36762,36419,36695,35992,36048,36760,36388,35543,36446,37554,36677,36206,36885,36659,36501,37208,36017,36470,36442,36915,36435,37423,36983,37031,37108,36903,36376,36888,36849,36290,36919,36317,36483,36682,36843,36800,37249,36888,35809,36412,36735,36361,36746,36846,36512,36646,36748,36200,37055,36749,36168,36382,36573,36318,37163,36434,35874,36042,36157,37240,36555,37308,36337,36969,36057,36976,35579,36634,36412,36788,36090,36996,36756,36124,36059,36487,36385,36536,36705,36877,36827,36189,36434,36325,36136,37041,36442,37088,36836,36483,36439,36355,37295,36790,36581,36032,36193,37632,36615,36317,36948,36506,36458,36083,36707,37153,36615,36511,36684,37019,36590,36936,36925,37278,37197,37274,36843,36637,37602,36979,36095,36789,36847,36669,36118,36578,35890,37233,37330,36735,36203,36020,36607,37072,36566,36800,36820,36875,36578,37475,36574,35967,36645,36736,36778,36670,35892,36037,36797,36810,37438,36864,36597,37479,37177,37080,36524,36863,37045,36503,36504,35980,36964,36699,37827,36899,35916,36721,36842,37311,35749,37300,36269,36555,35619,36018,36613,37276,36740,36998,37014,36182,36106,36688,36091,36912,36056,36739,37286,37023,36196,36723,36670,36846,36896,36239,37102,37231,36671,36617,36020,35612,36863,37298,36109,36277,36914,37432,36519,36678,36825,36026,36152,36641,37002,36822,36224,36527,36231,37331,36473,36688,36378,36547,36508,36321,36562,36500,36980,37378,36320,36646,36667,36322,36517,36772,36399,36278,36653,37060,37218,37248,36651,36073,36360,37242,36690,36847,36553,36831,36981,36815,37303,36403,36383,36739,36180,37138,36329,37190,36580,37103,36658,37125,36892,36177,35965,36340,36161,36661,37237,36692,36157,36582,37072,36780,36500,36241,36850,36674,37276,36583,36562,36300,36052,36729,36668,37351,35669,36544,36884,36216,36871,36393,36545,36912,36986,37469,36650,37318,36350,37295,37181,36240,36204,36755,36758,36161,36286,36340,37006,36869,36861,36361,37055,36662,36162,37070,36702,36547,36611,36375,36379,37353,36566,36278,36223,37630,36522,37077,37308,35947,36418,37586,36537,36311,36911,36711,36299,35496,36659,36543,37211,36350,36149,37235,36743,37535,36393,36487,37003,37109,36601,36679,36221,36611,36797,36505,36853,36374,35937,36426,36594,35803,36549,37094,36519,36633,37412,36834,36893,36295,36779,36711,36489,36455,36794,36415,37023,35503,36829,35923,36456,36508,36365,36725,36254,36110,36933,36444,37591,36405,36247,36227,36072,36650,36881,35796,35984,36803,36830,36606,36848,36808,36737,37256,36514,36829,36767,36275,36167,35878,37547,37248,35998,36234,36586,36448,36354,36885,36389,37045,36538,36923,36356,36808,37230,36279,37261,36295,36391,36413,36042,36100,37062,36047,37159,36810,35997,36733,36606,36160,36745,35722,36703,36226,36173,36888,36116,36228,36548,37277,36860,37186,36761,36077,36823,37100,37382,36589,36255,36574,36448,36533,36347,37084,37461,36491,36706,36450,36164,36997,35988,35704,36206,36882,36686,35637,37671,36600,35919,36459,36965,36630,36191,36381,36561,36114,36131,37219,36657,36529,36474,37411,36755,36552,37037,36937,36692,36711,37169,36640,36804,36796,36318,36611,36217,36284,36504,36696,36977,36506,36493,36493,36814,35882,35843,36765,37332,36345,36821,36119,37103,36361,37234,37117,36839,37203,36417,36129,36512,36232,36650,36643,36896,36588,36355,36272,37287,36569,36554,36444,36978,36629,35968,36656,36192,36243,36147,36786,36364,36444,37304,36719,37249,36664,36343,36982,36544,36367,35869,36539,36561,36503,36775,36709,36556,35955,36416,35695,37504,36390,36700,36564,35843,37006,36649,36925,36425,36491,36164,36844,36788,35920,36178,37023,36705,36178,36961,36617,36331,35383,37032,36995,36418,36118,36307,36545,36089,36385,37324,35995,36980,36662,36468,37339,36880,36850,36785,36048,36484,36121,37207,36830,37460,36849,36818,36377,36459,37142,37237,37315,37034,36277,36859,37585,36674,37283,36537,36009,36836,36562,36595,36439,36108,37300,37221,36981,37260,37264,36634,36156,36853,36002,36463,37057,36708,36666,36126,36571,36194,36524,36735,36864,36703,36640,36862,36282,36659,36842,36209,36768,36177,36062,36740,37411,37078,36971,36325,36334,36855,37091,36418,36903,36340,36151,36961,37218,36523,37009,36043,36286,36365,36910,36647,36597,36560,36918,36865,36934,36633,36193,36272,36478,36815,36191,37317,36434,36170,36846,37128,36720,36483,36915,36256,36428,37140,36351,36370,36723,36187,36634,36130,37176,37232,36898,36729,37065,36760,36707,37081,36202,36258,36694,36144,36241,36505,37042,36924,37417,36731,36198,36357,36467,36853,36601,36356,36090,36603,36695,35362,37264,36534,36603,36816,36666,36353,37013,36787,36722,36504,36564,36786,36624,36720,36227,36398,36625,36515,36214,36455,36814,36422,36337,36521,35934,36566,36382,36347,36256,36982,36397,36571,36537,37168,36122,36786,37292,36249,36786,36091,36592,37294,36157,37230,37355,36880,36889,36569,37331,35734,35858,36357,36494,37098,37203,36491,36563,36896,36080,36763,36583,36071,35736,36911,37069,36992,37650,36912,36413,36968,37101,36595,36832,36728,36687,36322,36190,36747,36919,37431,36784,36718,36380,37222,36933,37024,36573,35850,36472,36588,36584,37141,37656,35952,36520,36677,36663,36439,36738,36797,37014,36422,35911,37073,36704,36502,36261,37166,36784,36594,36692,37400,36628,36650,37503,37007,36562,35764,36698,36484,36970,36729,36500,37382,36461,37119,35814,36699,37024,37050,36332,36393,36440,36774,36483,37112,36486,36674,36981,36949,36791,36240,36465,36296,36657,36441,36348,36963,37132,36638,35969,36456,36459,36820,36362,36366,37187,36503,36459,36872,36154,36559,36042,36853,37198,36956,37088,36523,36092,36370,36945,36692,36802,37227,36291,36334,36566,37124,36910,36635,36456,36035,36568,36621,36819,35944,36692,37057,36929,37118,36342,36270,35946,37147,36684,37304,36219,36198,36080,35699,36652,37055,36440,36838,37074,36991,36264,36641,36525,36368,36967,36526,36558,36523,36888,36312,37022,36951,36766,36421,35936,36321,36767,36922,37075,36922,36815,37117,35997,36685,37115,36379,37258,36472,37320,36638,36932,36230,36696,36512,36778,37494,36941,37045,36597,36589,36699,36684,36293,36648,36414,36960,36337,36893,36570,36213,36706,36507,36460,36337,36149,36309,37049,36173,36230,36710,36430,36180,36437,37150,35878,36431,36776,35605,36414,36664,36250,36236,36201,36371,36557,36771,36635,37045,36964,36214,37214,36249,36478,37026,36509,36272,36794,36544,36917,36264,37149,36876,35851,36464,36831,36974,36457,36419,36448,36345,36952,35804,37006,36313,36825,37005,36826,36981,36104,36652,37026,37092,37141,36685,36795,35897,36344,36777,36447,36291,36135,36573,37286,36738,36321,36943,36777,36954,36292,36227,37730,37180,36661,36669,35937,36676,36601,36605,36487,36547,36954,36569,37014,36828,37066,37551,36560,36354,37010,36377,36262,36424,36589,36695,36922,37291,36806,37300,36579,37038,36136,36639,37730,36168,37162,37418,36143,36633,36547,36464,36238,36650,36615,36710,36335,36129,36634,37264,36270,36772,36346,36313,36511,36231,36884,36707,36169,36936,36677,36042,36435,36603,36187,36487,36957,36996,37218,36007,37185,36680,36666,36102,35678,36818,36720,36335,36457,36455,36134,36404,36671,36285,36635,36103,36779,36794,36769,36528,35996,36563,35990,36190,36033,35882,36581,36175,36381,36827,36644,36939,36549,36551,36678,36434,36115,36473,36870,36400,35499,36360,36522,36445,36084,36076,36693,36361,36565,37031,36042,36429,36421,36643,36448,36533,36722,36762,36571,37225,36500,35996,36558,36340,36259,36836,36273,36476,36578,37351,35941,36605,36392,37277,36504,36331,36826,36785,36160,36865,37110,36486,36963,36860,36162,36506,36951,35881,36252,36021,36132,36710,35765,36778,36171,37258,36255,36969,35902,36420,36733,37033,36738,36633,36585,37288,36343,36760,36739,36725,37085,36909,36958,36251,36878,36520,36026,36272,36669,37179,36909,36620,36489,36425,36249,36315,37047,37569,36339,36699,36577,36803,36893,35577,36097,36364,36675,37072,36582,36987,35936,36890,36858,36101,35926,35406,36906,37102,36895,36617,36577,37057,36042,36605,36316,35947,35785,36380,36802,36865,36350,36293,36527,36372,37202,36609,36458,36471,36313,36767,36275,36995,36449,36965,36414,36578,37246,35948,36506,36901,36333,36209,35668,36300,36422,36106,37329,35982,36278,36948,36787,36600,36273,36542,35678,36855,36628,36367,36080,36727,36837,35760,35972,36192,37272,36768,36076,36864,36682,36723,36131,36308,36612,36553,37025,36362,37091,36667,37072,37171,36897,37159,37391,36651,35893,37090,37052,36941,36966,37102,36696,36151,36187,37064,36545,37339,36954,36726,36197,36355,37275,36392,36764,36845,35859,35839,36427,36633,36362,36637,36636,35808,37099,36971,36345,36422,37418,37122,36387,36647,36692,36907,36813,36320,37307,36758,37194,36777,36502,36194,36381,37288,37006,37524,36735,36951,36704,37181,36555,36053,36460,36951,36282,36495,36467,36485,36521,36724,37183,37934,35963,36787,36910,35764,36221,37138,37104,36852,36560,36622,36351,36327,36086,37013,36589,36428,36550,37908,36301,35991,36964,36659,37012,35853,36303,36730,36654,36908,36757]},{"counters":[36292,36321,36480,37121,36516,36844,36101,36303,35756,36498,37150,36392,36247,36745,37167,36359,36362,36431,36284,36948,36869,36468,36304,36188,36254,36412,36368,37067,36650,36577,37198,37342,36525,36771,36836,36654,36826,36466,36955,36209,36713,36913,36706,36493,37016,36400,36879,36621,37194,36946,36740,35890,37035,36816,36266,36753,36500,37102,36448,36537,37315,36691,36825,36313,36927,36772,36194,36962,36977,36823,36745,35565,36756,37314,36208,36971,36886,36159,37228,36967,36091,37737,35921,37456,36414,36131,35612,36218,36302,36573,36065,35799,36735,36757,36421,36846,36723,36381,36925,36328,37168,36422,36242,36346,36407,36646,36071,36417,36435,36199,36586,36612,36168,36411,36759,36860,37118,36367,36746,36807,37395,36515,36302,36971,36437,36257,36843,37019,36631,37017,37028,37192,36479,35953,36389,36341,36633,37086,37291,36547,36860,36937,37546,36208,36773,37082,36749,36860,36116,36862,36762,37024,36483,36717,36853,37537,36702,36400,36528,36206,36759,37183,36634,36845,36858,36370,36667,35778,37067,36364,36935,36124,36257,36545,36289,36054,36828,36686,36853,36633,37305,37129,36637,36991,36191,36449,36666,36440,36856,37357,37201,36357,35821,36960,36535,36410,37054,36354,37322,37006,36595,35945,36370,36800,36712,36493,36335,35906,36643,36577,36409,36523,37234,36373,36134,36110,36533,37034,37178,36879,37050,36345,36406,36479,37215,36509,37007,36189,36875,36848,35545,36596,36198,36950,36793,36415,36745,36679,36542,36161,36974,35818,36501,36459,36901,36519,37023,36303,36064,37066,36933,35905,36970,36164,36643,36742,36941,37489,36374,36774,37044,37244,36618,36991,37435,36572,35989,36489,36822,36589,37233,36949,36499,36761,36463,35937,36054,36727,36091,36872,37174,37454,37050,36122,36364,36821,36480,37205,36575,36899,37157,36321,36439,36458,36912,35841,36742,36706,36151,36535,37002,36852,37039,36630,36563,36286,36638,36535,36609,35923,35784,36093,36795,36384,37207,36779,36698,36414,36297,37029,35781,36469,36486,37286,37027,36917,37618,36340,36831,36466,36457,37388,36128,36892,36681,36104,36194,36604,36384,36864,36852,36215,37225,36581,36545,36643,36614,36079,36384,36874,36305,36675,36960,36706,36245,36713,36927,37015,36960,36299,36726,36021,37048,35910,36927,36420,34889,36812,36252,36902,36355,36679,35518,36891,36654,36746,36214,36973,36170,36910,36939,37085,36724,36378,36559,36312,36672,36833,36689,36978,36390,37216,36393,37194,36749,37235,36381,36486,36455,37114,36448,36401,36850,36578,36888,36290,36365,37180,36781,36486,37176,36845,36764,36311,36391,37710,36465,36352,36818,36936,36446,36562,36803,36771,35801,36080,36429,36245,36834,36751,36901,36673,36558,36578,36088,36406,36454,37468,36854,36568,36449,36487,36428,36125,36670,36496,36062,36773,36513,37285,36351,36730,36877,36459,36172,35658,36320,36805,36566,36316,36753,36440,36728,36501,36147,36420,37396,36570,36567,36664,36948,36917,36206,36461,36872,36489,36845,36707,36277,36052,36462,37360,36556,35957,36922,36184,36147,36726,36356,36614,37263,36464,37310,35883,36412,36926,37266,36790,36604,36301,36922,36496,36085,37299,36181,36464,36119,36924,36219,36052,37040,37335,37375,36373,36510,36499,37239,37137,36685,36465,36915,36848,36325,36558,36399,36300,35697,37131,37014,36442,36046,36609,36750,36618,36201,36396,36290,35958,37112,36380,36976,37189,37453,36898,35683,36562,36558,37065,37066,36527,36168,36942,37113,36784,37086,36858,36838,37001,36630,36635,37053,36176,36850,36735,36637,36563,36785,36339,36541,36626,37085,36596,36768,36595,36762,37549,37248,37017,36942,35748,37437,38075,36968,35952,36091,36563,36826,36079,36083,37416,36848,36900,36702,36597,37260,36897,37403,36258,36317,37562,36557,36528,36472,36682,36895,37916,37256,36944,36954,36108,36437,36995,37544,36307,36209,36843,37044,36144,36863,36361,35783,36750,36660,36714,37055,36959,36326,36889,37097,36259,37015,36867,36278,36255,36830,36435,36576,36379,36684,36861,37348,36755,36590,36353,36633,37138,36360,36406,36606,36958,37056,36873,36513,36955,36732,36817,36743,37090,36971,35963,37112,36259,36630,37670,36297,36562,36658,36692,37525,36217,36523,37172,36259,35871,35647,36655,35954,36918,36529,36967,36507,37233,36377,36836,36570,36580,37234,36381,37038,36017,36475,36761,36170,37870,37180,36879,37200,36834,36076,36153,35923,36517,37234,36792,36439,36264,37461,36118,36180,35724,37008,36517,36357,36486,36823,37037,36426,36614,35976,36211,36942,36911,36850,36648,36729,36761,36722,37688,36430,35956,37053,37069,36389,36659,37177,36558,37277,36821,36546,35445,36276,36065,36945,35751,36594,37041,36551,36612,35786,36996,36425,37170,36729,36315,36835,36977,36258,37051,36833,37100,36661,36753,37109,36669,36955,36695,36659,36757,37150,37463,36198,36981,36838,36454,36399,36156,37133,36341,37256,36829,36244,37111,36171,36813,36656,36685,36023,35853,36287,36397,37522,36322,36657,36025,36773,36682,36615,36840,36222,37182,36390,36199,37263,36617,36856,36896,35988,36531,36263,36358,36534,36397,36132,36424,36719,37009,36708,36753,36688,36566,36769,36691,36368,36388,37913,36485,37005,36509,36830,36054,36594,36421,36436,36797,36929,36386,37001,36986,36607,36645,36394,37033,35900,36187,36501,37070,36811,37290,36081,36670,36763,36385,36822,36953,37123,36347,36451,36964,36269,36857,36526,36823,36866,36318,36986,37154,35990,36582,36891,36750,37011,36237,36993,37121,36392,36785,37086,36885,36324,36259,37170,36549,37326,37240,36668,36416,36737,36902,36131,36732,36618,36471,35992,36361,36573,36719,36647,36420,36517,37043,37152,36649,36533,36668,36786,36497,36120,37113,36360,36749,37235,36547,36509,36602,36354,36772,36900,36182,37063,37099,36352,36365,36306,36295,37031,36712,36294,36999,36657,36034,36852,36351,36530,36730,37097,36413,36945,37121,36444,37168,36765,35905,36816,36083,36598,36798,36210,36522,36323,36198,36808,36638,36614,36616,36496,37245,36773,36360,36420,35720,36811,36400,36910,36864,36840,36198,37424,36600,36765,36331,36744,36541,37163,36315,36383,36401,37362,36780,36829,36340,36892,36832,36754,36344,36284,35962,36390,36439,36651,36582,36970,36645,37174,36885,36306,36422,36617,36862,37083,36481,36114,36342,36454,36465,36709,37139,36330,36696,35521,36434,36867,36881,36350,36087,36812,36834,35903,36740,36654,36416,36728,35816,36999,36902,36462,37002,36805,36835,36084,36826,37324,36581,36285,36566,36190,36723,36361,37153,36240,36822,36830,36656,36902,36520,36927,36422,36861,36787,36345,36630,36571,36246,36186,36596,36779,36552,36150,37174,37113,36587,36399,36871,36513,37128,36830,36194,35499,36438,36449,36967,36864,37026,37208,35867,37195,36431,36245,36597,37603,36683,36820,36330,36913,36723,36506,37404,37032,37517,36165,36623,35931,36318,36881,36729,36377,36529,36251,36484,36149,36283,37178,36237,37385,37075,36527,36504,37157,36069,36161,36597,36464,36549,36314,37585,36664,36389,36949,36742,36327,37224,36461,36084,37108,36326,37274,37131,36685,36126,36789,36753,36457,37451,36317,36593,36970,37120,36400,36833,36725,37777,37015,36606,36958,36405,36377,36817,37495,35504,36612,36542,36285,36568,36049,37039,36767,36534,36571,36119,36720,36675,37396,37145,36379,36812,36767,35735,37084,37023,36489,36825,36544,36045,35378,36720,36417,36243,36505,36454,36614,36596,36667,36868,36678,36705,35123,36464,36636,37753,36803,37925,36691,36414,37058,37135,36764,36678,36578,36548,36534,36711,36660,36920,36569,36039,36418,36746,36471,36745,36456,36880,37418,36161,36228,35870,36486,36923,37076,36115,36373,36363,36741,37095,36539,36250,35980,36905,36795,36557,36296,36732,36362,35608,36594,35935,36590,36970,36667,35967,36382,36845,36217,37260,36732,37367,36315,36190,36738,36135,36585,36577,36340,36129,36513,37125,36677,36375,36074,37123,36348,35894,35788,36224,37364,37124,36403,36520,36104,36397,36412,36264,36936,36517,36325,36359,36572,36730,36212,37208,36564,36694,36791,36879,36756,36888,36787,36547,37142,36465,36571,36285,36288,36641,36691,36928,37365,36935,36408,36744,37135,36619,36990,36789,36166,37033,36843,37743,36810,36826,36510,36049,36148,36018,37080,36082,35979,37229,36899,36523,37207,36305,36226,36208,36696,36665,37669,36470,36804,36431,36672,37123,36709,36935,36849,36676,36785,37116,36349,36628,37008,36612,36708,36059,36338,37227,36252,36393,36241,36925,36919,36220,36417,35948,36358,36483,36731,36451,36677,36637,36201,37214,36894,36104,35811,36091,36594,37152,36472,36914,36392,36261,36608,36481,36415,37064,36590,35905,36728,36786,36200,36141,36426,36116,36468,36536,36335,36682,36457,36303,36646,36846,36433,36347,36547,36689,37077,36326,36568,36904,37403,36634,36790,36095,36784,35823,36013,36309,36566,37110,36059,36090,36346,35829,36827,37278,36723,36319,36425,37087,36241,35710,36576,37861,37527,36087,36553,37242,36479,36445,36382,36397,37412,35897,36665,37093,36497,36093,36444,36253,36516,36155,36265,36660,36839,36954,36421,35963,36742,36829,36562,36735,36712,36851,36964,36954,36142,36203,36724,36371,36744,37216,36969,36412,37058,36233,37228,36103,36382,37230,36702,36536,36526,36590,37277,37017,36489,36248,36078,35802,36915,37280,36480,36679,37252,36911,36687,36697,36539,36819,36637,36398,37009,35683,36510,36610,36663,36078,37288,36187,36722,36423,36652,36639,36365,36976,36050,36322,37076,35821,36806,37723,36638,37103,36801,37332,36547,36726,36008,36882,37110,36730,36773,36914,37188,36640,36633,36179,37063,36799,36123,37100,36608,37088,36728,36866,36219,36520,36583,36898,36875,36827,36172,36889,36691,36484,36638,36763,36854,36638,35932,36118,35762,36375,36716,36718,37141,36632,36634,36675,36260,36602,35691,36337,36982,36653,37210,37093,36193,36890,36218,35992,36223,36626,36445,37179,37000,37026,37017,36577,37121,36632,36450,37458,36539,36644,36399,36974,36464,36055,37144,36244,37140,36215,36819,36598,37370,35906,36178,37853,36345,36772,36252,36854,36907,36497,36335,36497,36475,36514,36613,36298,37259,36715,37233,36076,37280,36379,36710,36414,35822,36737,36548,35851,36376,36559,36989,36490,36093,37127,36457,36700,36626,36598,36598,36481,36269,36789,37323,35946,35841,36643,37191,37024,36391,36174,36654,36047,37034,35307,36439,35968,36401,36582,36019,36768,37265,36119,36551,36038,36310,36789,36665,36489,36320,36846,36537,36799,36267,36948,36648,36696,36977,36620,36537,35884,36637,36480,36541,36964,36858,36413,36259,36900,36673,37021,36253,36807,36904,35989,36797,36168,37226,36792,37371,35854,36624,36853,36699,35985,36883,37075,36190,36199,36632,37050,36413,35856,36608,36650,36096,36344,35920,37146,36275,36240,36854,37156,36686,36379,36453,36552,36639,35810,36547,35989,35872,36336,36924,35528,36440,36063,37121,37560,36120,37438,36958,36583,36827,36359,36679,36600,37045,36593,36704,37003,36344,36694,36671,36354,37200,36429,35714,37043,36700,36360,36333,36739,35941,37129,35966,35614,36392,37159,36399,37433,36883,36549,36802,36893,36600,37961,36771,35937,37241,36206,36835,36966,37123,36739,36206,36658,35833,36306,36528,36891,36043,37284,36568,36817,36486,36471,36256,36828,37182,37060,36921,35958,35964,37069,36493,36614,36388,35956,36828,37231,36159,36156,37200,36862,37557,36142,36025,36113,37185,36113,36539,36673,36515,35882,36795,36402,36337,36307,35847,36645,36694,36553,37123,36634,37297,35838,36796,36791,36760,36276,36989,37614,35937,37498,36200,36884,36407,36773,37087,35950,35585,37520,36121,37071,36280,36951,36688,36413,36840,36468,36563,36924,36344,36547,37520,36874,36611,36295,37176,36779,37440,36731,36516,36942,36434,36744,36771,36301,36286,36588,36457,36159,36599,37142,36472,36775,36818,36552,36613,36966,36717,37347,35963,36528,36562,36562,37023,37225,37149,36600,36535,36781,36665,36947,37505,37115,36245,36584,36258,37276,36418,35885,36884,36875,37227,36290,36280,36296,36789,36761,36967,36932,36665,36466,37059,36178,36747,36684,36836,37037,36774,36505,36100,37144,36323,35939,36697,37401,36987,36724,36456,36587,37104,36406,35896,36408,37467,36312,36391,36136,36877,36056,36317,36297,36931,36559,35970,36330,36337,36233,35842,36579,37266,36909,36432,36428,36124,36348,36512,37580,36911,36726,36336,36269,36209,36776,36186,37239,36254,36061,36550,36208,36331,36458,36995,36043,36443,36737,35958,36059,36794,36666,36466,36774,36483,36435,36596,36342,36955,36391,36635,35914,36173,36869,36526,36695,35905,36659,36463,35923,37648,36272,36660,37371,36375,35985,36681,36875,35429,36728,36803,36700,36398,36462,36252,36719,36418,35904,37305,37362,36441,36009,36965,36234,36004,36127,37178,35965,36321,36841,35781,36625,36215,36545,36315,36863,35974,36890,36623,36927,36429,37270,36918,36855]}]},"null_count":0,"tot_col_size":675000000,"last_update_version":401695328267141123}},"indices":{},"count":75000000,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/part.json b/cmd/explaintest/s/tpch_stats/part.json deleted file mode 100644 index 9faf789d1f9e0..0000000000000 --- a/cmd/explaintest/s/tpch_stats/part.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"part","columns":{"p_brand":{"histogram":{"ndv":25,"buckets":[{"count":420000,"lower_bound":"QnJhbmQjMTE=","upper_bound":"QnJhbmQjMTE=","repeats":420000},{"count":824000,"lower_bound":"QnJhbmQjMTI=","upper_bound":"QnJhbmQjMTI=","repeats":404000},{"count":1217000,"lower_bound":"QnJhbmQjMTM=","upper_bound":"QnJhbmQjMTM=","repeats":393000},{"count":1642000,"lower_bound":"QnJhbmQjMTQ=","upper_bound":"QnJhbmQjMTQ=","repeats":425000},{"count":2058000,"lower_bound":"QnJhbmQjMTU=","upper_bound":"QnJhbmQjMTU=","repeats":416000},{"count":2441000,"lower_bound":"QnJhbmQjMjE=","upper_bound":"QnJhbmQjMjE=","repeats":383000},{"count":2825000,"lower_bound":"QnJhbmQjMjI=","upper_bound":"QnJhbmQjMjI=","repeats":384000},{"count":3225000,"lower_bound":"QnJhbmQjMjM=","upper_bound":"QnJhbmQjMjM=","repeats":400000},{"count":3617000,"lower_bound":"QnJhbmQjMjQ=","upper_bound":"QnJhbmQjMjQ=","repeats":392000},{"count":4003000,"lower_bound":"QnJhbmQjMjU=","upper_bound":"QnJhbmQjMjU=","repeats":386000},{"count":4379000,"lower_bound":"QnJhbmQjMzE=","upper_bound":"QnJhbmQjMzE=","repeats":376000},{"count":4770000,"lower_bound":"QnJhbmQjMzI=","upper_bound":"QnJhbmQjMzI=","repeats":391000},{"count":5160000,"lower_bound":"QnJhbmQjMzM=","upper_bound":"QnJhbmQjMzM=","repeats":390000},{"count":5574000,"lower_bound":"QnJhbmQjMzQ=","upper_bound":"QnJhbmQjMzQ=","repeats":414000},{"count":5962000,"lower_bound":"QnJhbmQjMzU=","upper_bound":"QnJhbmQjMzU=","repeats":388000},{"count":6368000,"lower_bound":"QnJhbmQjNDE=","upper_bound":"QnJhbmQjNDE=","repeats":406000},{"count":6784000,"lower_bound":"QnJhbmQjNDI=","upper_bound":"QnJhbmQjNDI=","repeats":416000},{"count":7156000,"lower_bound":"QnJhbmQjNDM=","upper_bound":"QnJhbmQjNDM=","repeats":372000},{"count":7561000,"lower_bound":"QnJhbmQjNDQ=","upper_bound":"QnJhbmQjNDQ=","repeats":405000},{"count":7983000,"lower_bound":"QnJhbmQjNDU=","upper_bound":"QnJhbmQjNDU=","repeats":422000},{"count":8396000,"lower_bound":"QnJhbmQjNTE=","upper_bound":"QnJhbmQjNTE=","repeats":413000},{"count":8795000,"lower_bound":"QnJhbmQjNTI=","upper_bound":"QnJhbmQjNTI=","repeats":399000},{"count":9193000,"lower_bound":"QnJhbmQjNTM=","upper_bound":"QnJhbmQjNTM=","repeats":398000},{"count":9592000,"lower_bound":"QnJhbmQjNTQ=","upper_bound":"QnJhbmQjNTQ=","repeats":399000},{"count":10000000,"lower_bound":"QnJhbmQjNTU=","upper_bound":"QnJhbmQjNTU=","repeats":408000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,398756,0,0,0,0,0,0,0,0,0,399907,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399236,0,0,0,0,0,0,401158,0,0,0,0,0,0,0,0,0,0,400003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399210,0,0,0,0,0,0,0,0,0,0,0,0,400180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399131,399236,0,0,0,0,0,0,0,0,0,400180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,401158,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399907,0,0,0,0,0,0,400386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399509,0,0,400523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,398756,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400235,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,401158,400821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400016,0,0,0,0,0,0,0,0,0,0,399907,0,0,0,0,0,0,0,0,0,0,0,400306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400789,0,0,399306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400053,0,0,0,0,0,0,0,0,0,0,0,0,0,400180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,797887,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400228,0,0,0,0,0,0,0,0,0,0,0,0,399365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399907,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400180,0,399365,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400235,0,0,0,0,0,0,0,0,0,0,0,400105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400386,0,0,0,400228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399306,0,0,0,0,0,0,398756,0,0,0,400003,0,0,0,0,400016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,401158,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[400053,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400180,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400386,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399509,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400370,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400523,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400308,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400821,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399131,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399907,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399210,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400235,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400003,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,398756,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399236,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399306,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399365,0,0,0,0,0,0,0,0,0,0,0,401158,0,400454,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400105,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":100000000,"last_update_version":401695327795281922},"p_comment":{"histogram":{"ndv":2490112,"buckets":[{"count":41000,"lower_bound":"IGFib3U=","upper_bound":"IGFjY291bg==","repeats":2004},{"count":81000,"lower_bound":"IGFjY291bnQ=","upper_bound":"IGFjcm9zcyB0aGUgcXVpY2tseSB1bg==","repeats":4},{"count":121000,"lower_bound":"IGFjcm9zcyB0aGUgcmVndWxhciByZQ==","upper_bound":"IGFsb25nc2lkZSBvZiB0aGUgZmk=","repeats":4},{"count":161000,"lower_bound":"IGFsb25nc2lkZSBvZiB0aGUgc2x5bA==","upper_bound":"IGJlYW5zIGFyZSBibGl0aGVseSBhbA==","repeats":4},{"count":201000,"lower_bound":"IGJlYW5zIGJv","upper_bound":"IGJsaXRoZWx5IGZpbmE=","repeats":4},{"count":241000,"lower_bound":"IGJsaXRoZWx5IGZpbmFsIA==","upper_bound":"IGJvbGQgaWRlYXM7IA==","repeats":4},{"count":281000,"lower_bound":"IGJvbGQgaW5zdHJ1Y3Rpb25zIHU=","upper_bound":"IGNham9sZSBibA==","repeats":4},{"count":321000,"lower_bound":"IGNham9sZSBibGl0aGVseSBwZW5k","upper_bound":"IGNhcmVmdWxseSBhYm92ZSB0aGUgYg==","repeats":4},{"count":361000,"lower_bound":"IGNhcmVmdWxseSBhbW8=","upper_bound":"IGRhcmluZ2x5IHJlZw==","repeats":4},{"count":401000,"lower_bound":"IGRhenpsZSBhcm91bmQgdGg=","upper_bound":"IGRlcG9zaXRzIG5hZyBzbHlseQ==","repeats":4},{"count":441000,"lower_bound":"IGRlcG9zaXRzIG5vZCBibGl0aGVs","upper_bound":"IGVudGljaW5nbHkgcmVndQ==","repeats":4},{"count":481000,"lower_bound":"IGVwaXRhcGhzIGRv","upper_bound":"IGV4Y3U=","repeats":1004},{"count":527000,"lower_bound":"IGV4Y3Vz","upper_bound":"IGZpbmFs","repeats":6004},{"count":567000,"lower_bound":"IGZpbmFsIA==","upper_bound":"IGZpbmFsIHBsYXRlbGV0cw==","repeats":1004},{"count":607000,"lower_bound":"IGZpbmFsIHJlcXVlc3Q=","upper_bound":"IGZveGVzIGNham9sZQ==","repeats":4},{"count":647000,"lower_bound":"IGZveGVzIHNsZQ==","upper_bound":"IGZ1cmlvdXNseSA=","repeats":5004},{"count":687000,"lower_bound":"IGZ1cmlvdXNseSBhYm91dCB0aGUg","upper_bound":"IGZ1cmlvdXNseSB1bnU=","repeats":4},{"count":727000,"lower_bound":"IGZ1cmlvdXNseSB1bnVzdQ==","upper_bound":"IGlkZWFzIHByaW50IGFsd2E=","repeats":4},{"count":767000,"lower_bound":"IGlkZWFzIHNsZWVwIGFjYw==","upper_bound":"IGlyb25pYyBpbnN0cnVjdGlvbg==","repeats":4},{"count":807000,"lower_bound":"IGlyb25pYyBwYWNrYWc=","upper_bound":"IG9mIHRoZSBibGl0aGVseSBw","repeats":4},{"count":847000,"lower_bound":"IG9mIHRoZSBib2xkbHkgcGVuZGluZw==","upper_bound":"IHBhY2thZ2VzLiBmaW4=","repeats":4},{"count":888000,"lower_bound":"IHBhY2thZ2VzLiBmaW5hbCw=","upper_bound":"IHBpbnRv","repeats":2004},{"count":931000,"lower_bound":"IHBpbnRvIA==","upper_bound":"IHF1aWNrbA==","repeats":3004},{"count":974000,"lower_bound":"IHF1aWNrbHk=","upper_bound":"IHJlZ3VsYXIg","repeats":3004},{"count":1014000,"lower_bound":"IHJlZ3VsYXIgYWNjb3U=","upper_bound":"IHJlZ3VsYXIsIGU=","repeats":4},{"count":1054000,"lower_bound":"IHJlZ3VsYXIsIGV2ZW4g","upper_bound":"IHJlcXVlc3RzLg==","repeats":4},{"count":1094000,"lower_bound":"IHJlcXVlc3RzLiBleHByZXM=","upper_bound":"IHNsZWVwIGM=","repeats":4},{"count":1134000,"lower_bound":"IHNsZWVwIGNhcg==","upper_bound":"IHNseWx5IGNhcmVmdWw=","repeats":4},{"count":1177000,"lower_bound":"IHNseWx5IGV2ZQ==","upper_bound":"IHNwZWM=","repeats":3004},{"count":1217000,"lower_bound":"IHNwZWNp","upper_bound":"IHRoZSBibGl0aGVseSBm","repeats":4},{"count":1257000,"lower_bound":"IHRoZSBibGl0aGVseSBpcm9u","upper_bound":"IHRoZSBmdXJpb3VzbHkgZXZlbiBh","repeats":4},{"count":1297000,"lower_bound":"IHRoZSBmdXJpb3VzbHkgcGVu","upper_bound":"IHRoZSB1bnVzdWFsIHJlcXVlc3Rz","repeats":4},{"count":1337000,"lower_bound":"IHRoZSB1bnVzdWFsLCBp","upper_bound":"IHVudXN1YWwgYWNjb3Vu","repeats":4},{"count":1377000,"lower_bound":"IHVudXN1YWwgYWNjb3VudHMgd2E=","upper_bound":"IHdha2Ugc28=","repeats":4},{"count":1417000,"lower_bound":"IHdha2UuIGV2ZW4g","upper_bound":"LCBwZW5kaW5nIHI=","repeats":4},{"count":1457000,"lower_bound":"LCByZWd1bGFyIHBhY2thZw==","upper_bound":"LiBidXNpbHkgcGVuZGluZyBkaW4=","repeats":4},{"count":1497000,"lower_bound":"LiBjYXI=","upper_bound":"LiBmaW5hbCBkZQ==","repeats":4},{"count":1537000,"lower_bound":"LiBmaW5hbCBpZGVhcyBzbGVlcCBz","upper_bound":"LiBuZXZlciB0aGluIGluc3RydWN0","repeats":4},{"count":1577000,"lower_bound":"LiBwYWNrYWdlcyBhYm91dA==","upper_bound":"LiBzbHlseSBleHByZXNzIGk=","repeats":4},{"count":1617000,"lower_bound":"LiBzbHlseSBmaW4=","upper_bound":"YWJvdXQgdGhlIHJlZw==","repeats":4},{"count":1657000,"lower_bound":"YWJvdXQgdGhlIHNseQ==","upper_bound":"YWNjb3VudHMgYm9v","repeats":4},{"count":1697000,"lower_bound":"YWNjb3VudHMgZQ==","upper_bound":"YWNrYWdlcyB3YWtlIGZ1cmlvdXNseQ==","repeats":4},{"count":1737000,"lower_bound":"YWNrYWdlcyB3YWtlIHNseWx5IGFs","upper_bound":"YWcuIHF1aWNrbHkgdW51c3U=","repeats":4},{"count":1777000,"lower_bound":"YWcuIHJlZ3VsYXIgZGVwb3M=","upper_bound":"YWdlcy4gaXJv","repeats":4},{"count":1817000,"lower_bound":"YWdlcy4gcmVx","upper_bound":"YWpvbGUgYWJvdXQgdGhlIGlybw==","repeats":4},{"count":1857000,"lower_bound":"YWpvbGUgYWJvdmUgdGhlIGNh","upper_bound":"YWwgYWNjb3VudHMgcGxheSBhYm8=","repeats":4},{"count":1897000,"lower_bound":"YWwgYXN5bQ==","upper_bound":"YWwgcGE=","repeats":4},{"count":1937000,"lower_bound":"YWwgcGFj","upper_bound":"YWwsIHI=","repeats":4},{"count":1977000,"lower_bound":"YWwsIHJlZ3VsYXIgaWRlYQ==","upper_bound":"YW5zIGJlbGll","repeats":4},{"count":2017000,"lower_bound":"YW5zIGJvb3N0LiBjYXJlZg==","upper_bound":"YXIgZGVwb3NpdA==","repeats":4},{"count":2057000,"lower_bound":"YXIgZGVwb3NpdHMgYWJvdg==","upper_bound":"YXIgdGg=","repeats":4},{"count":2097000,"lower_bound":"YXIgdGhlb2RvbGl0ZXMuIGNhcmU=","upper_bound":"YXJlZnVsbHkgYWNjb3JkaW5nIHRvIA==","repeats":4},{"count":2137000,"lower_bound":"YXJlZnVsbHkgYWxvbmdzaWRlIA==","upper_bound":"YXJvdW4=","repeats":4},{"count":2177000,"lower_bound":"YXJvdW5kIHRoZSBkZXBvc2l0","upper_bound":"YXRlIGY=","repeats":4},{"count":2217000,"lower_bound":"YXRlIHF1aWNrbHkuIA==","upper_bound":"YmVhbnMgdXNlIGNhcmVmdWxs","repeats":4},{"count":2258000,"lower_bound":"YmVhbnMgdXNlIGZ1cmlv","upper_bound":"YmxpdGhlbHkgaQ==","repeats":1004},{"count":2298000,"lower_bound":"YmxpdGhlbHkgcGVuZGlu","upper_bound":"Ym91dCB0","repeats":4},{"count":2338000,"lower_bound":"Ym91dCB0aA==","upper_bound":"YyBmb3hlcyBh","repeats":4},{"count":2378000,"lower_bound":"YyBpZGVhcyBjYWpvbGUgc2x5bHkg","upper_bound":"Y2FyZWZ1","repeats":4004},{"count":2418000,"lower_bound":"Y2FyZWZ1bA==","upper_bound":"Y2FyZWZ1bGx5IHNseWx5IA==","repeats":1004},{"count":2458000,"lower_bound":"Y2FyZWZ1bGx5IHVu","upper_bound":"Y2NvdW50cyBuYWcgYWxv","repeats":4},{"count":2498000,"lower_bound":"Y2NvdW50cyBwb2FjaA==","upper_bound":"Y2lhbCB3YQ==","repeats":4},{"count":2538000,"lower_bound":"Y2lhbCwgdW51c3VhbCBpbnM=","upper_bound":"Y2thZ2VzLiBpZGVhcw==","repeats":4},{"count":2578000,"lower_bound":"Y2thZ2VzLiBwZW5kaQ==","upper_bound":"Y2tseSB1bnVzdWFsIGQ=","repeats":4},{"count":2618000,"lower_bound":"Y2tseS4gYWNjb3VudHMgbmE=","upper_bound":"Y291bnRzIHNsZWVwIGFmdGVyIHRo","repeats":4},{"count":2658000,"lower_bound":"Y291bnRzIHNsZWVwIGJsaXRoZQ==","upper_bound":"Y3QgYnU=","repeats":4},{"count":2698000,"lower_bound":"Y3QgZm94ZXM7IHF1aWNrbHkgZXZlbg==","upper_bound":"Y3VzZXMgeC1yYXkgY2FyZWY=","repeats":4},{"count":2738000,"lower_bound":"Y3VzZXMuIHJlZ3VsYXIgaW5zdA==","upper_bound":"ZGUgb2YgdGhlIGJsaXRoZQ==","repeats":4},{"count":2779000,"lower_bound":"ZGUgb2YgdGhlIHBlbmRpbg==","upper_bound":"ZGVwb3M=","repeats":2004},{"count":2819000,"lower_bound":"ZGVwb3Np","upper_bound":"ZGVwb3NpdHMuIHNseWx5IHNwZWNpYQ==","repeats":4},{"count":2859000,"lower_bound":"ZGVwb3NpdHM/IGJsaQ==","upper_bound":"ZGluZyByZXF1ZXM=","repeats":4},{"count":2899000,"lower_bound":"ZGluZyByZXF1ZXN0","upper_bound":"ZSBhYm92ZQ==","repeats":4},{"count":2939000,"lower_bound":"ZSBhYm92ZSB0aGUgZmx1ZmZpbHkgYg==","upper_bound":"ZSBicmF2ZWx5IGZpbmFsIHJl","repeats":4},{"count":2979000,"lower_bound":"ZSBidXN5IGlkZWFzIGludA==","upper_bound":"ZSBmaW4=","repeats":4},{"count":3019000,"lower_bound":"ZSBmaW5hbA==","upper_bound":"ZSBmdXJpb3VzbHkgcA==","repeats":4},{"count":3059000,"lower_bound":"ZSBmdXJpb3VzbHkgcGVuZGluZw==","upper_bound":"ZSBxdWlldGx5IGFmdGVyIHRoZSBz","repeats":4},{"count":3099000,"lower_bound":"ZSBxdWlldGx5IHJlZ3VsYXIgZA==","upper_bound":"ZSB0aGUgZmluYWwgZXg=","repeats":4},{"count":3139000,"lower_bound":"ZSB0aGUgZnVyaW91c2x5","upper_bound":"ZWFucyB1c2UgYQ==","repeats":4},{"count":3179000,"lower_bound":"ZWFucyB1c2UgY2Fy","upper_bound":"ZWNpYWwgcGlu","repeats":4},{"count":3223000,"lower_bound":"ZWNpYWwgcGludG8gYmVhbnMgYWZ0","upper_bound":"ZWZ1bGx5","repeats":4004},{"count":3263000,"lower_bound":"ZWZ1bGx5IA==","upper_bound":"ZWZ1bGx5IHJlZ3VsYXIgcGE=","repeats":4},{"count":3303000,"lower_bound":"ZWZ1bGx5IHJlZ3VsYXIgcmVx","upper_bound":"ZWd1bGFyIGRlcG9zaXRzIGFj","repeats":4},{"count":3343000,"lower_bound":"ZWd1bGFyIGRlcG9zaXRzIG4=","upper_bound":"ZWxldHMuIGNhcmVmdWxseSBzcGU=","repeats":4},{"count":3383000,"lower_bound":"ZWxldHMuIHNseWx5IGZpbmFsIHBhYw==","upper_bound":"ZWx5IHU=","repeats":4},{"count":3425000,"lower_bound":"ZWx5IHVudXM=","upper_bound":"ZW5jaWVzIA==","repeats":2004},{"count":3465000,"lower_bound":"ZW5jaWVzIGE=","upper_bound":"ZW5kaW5nIGZveGVzLiBzbHk=","repeats":4},{"count":3505000,"lower_bound":"ZW5kaW5nIG9yYml0cyBib29zdA==","upper_bound":"ZW9kb2xpdA==","repeats":1004},{"count":3545000,"lower_bound":"ZW9kb2xpdGVz","upper_bound":"ZXBvc2k=","repeats":4004},{"count":3589000,"lower_bound":"ZXBvc2l0cw==","upper_bound":"ZXF1ZXN0cw==","repeats":4004},{"count":3629000,"lower_bound":"ZXF1ZXN0cyA=","upper_bound":"ZXJtYW5lbnRseSBpcm9uaWMgcGFj","repeats":4},{"count":3669000,"lower_bound":"ZXJucyBlYXQgYXQgdA==","upper_bound":"ZXMgaXJvbmljIA==","repeats":4},{"count":3709000,"lower_bound":"ZXMgbmFnIGFsb25nIA==","upper_bound":"ZXMuIGV2ZW4gcmVxdWVzdHM=","repeats":4},{"count":3749000,"lower_bound":"ZXMuIGV2ZW4gcmVxdWVzdHMg","upper_bound":"ZXNzIGNvdXJ0cyBiZQ==","repeats":4},{"count":3789000,"lower_bound":"ZXNzIGQ=","upper_bound":"ZXN0cyBib29zdCBxdWljaw==","repeats":4},{"count":3829000,"lower_bound":"ZXN0cyBjYWpvbA==","upper_bound":"ZXN0cy4gc3BlYw==","repeats":4},{"count":3869000,"lower_bound":"ZXRlY3Qg","upper_bound":"ZXZlbiBwbGF0ZWxldHMgd2Fr","repeats":4},{"count":3909000,"lower_bound":"ZXZlbiBy","upper_bound":"ZXhwcmVzcyw=","repeats":4},{"count":3949000,"lower_bound":"ZXhwcmVzcywgYm8=","upper_bound":"ZmlseSBleHByZXNzIA==","repeats":4},{"count":3989000,"lower_bound":"ZmlseSBmaW5hbCBhY2NvdW50cyA=","upper_bound":"ZmluYWwgcmVxdWVzdHMuIGY=","repeats":4},{"count":4029000,"lower_bound":"ZmluYWws","upper_bound":"Zm94ZXMgbmFnLiBlbnRpY2luZw==","repeats":4},{"count":4069000,"lower_bound":"Zm94ZXMgcw==","upper_bound":"ZnVsbHkgYWNjb3JkaW5nIHQ=","repeats":4},{"count":4109000,"lower_bound":"ZnVsbHkgYWNyb3NzIHRoZSA=","upper_bound":"ZnVsbHkuIGNhcmVmdWxseSBmaQ==","repeats":4},{"count":4149000,"lower_bound":"ZnVsbHkuIGRlcG9zaXRzIHdha2U=","upper_bound":"ZnVyaW91c2x5IHJlZ3Vs","repeats":4},{"count":4189000,"lower_bound":"ZnVyaW91c2x5IHJlZ3VsYXIgdGhlbw==","upper_bound":"ZyBmb3hlcw==","repeats":4},{"count":4229000,"lower_bound":"ZyBmb3hlcyBhcmU=","upper_bound":"ZyB0byB0aGUgZmluYWwgcGxhdGVs","repeats":4},{"count":4269000,"lower_bound":"ZyB0byB0aGUgZmx1ZmZpbHkgcA==","upper_bound":"Z2VzIGFy","repeats":4},{"count":4309000,"lower_bound":"Z2VzIGFyZSBh","upper_bound":"Z2VzPyBmdXJpb3VzbHkgaXJvbmk=","repeats":4},{"count":4349000,"lower_bound":"Z2dlZCBhY2NvdW50cy4gcGFp","upper_bound":"Z291dHMgYm9vc3QgY2FyZWZ1bA==","repeats":4},{"count":4389000,"lower_bound":"Z3JhdGU=","upper_bound":"Z3VsYXIgZGVwb3NpdHMgYWZ0","repeats":4},{"count":4429000,"lower_bound":"Z3VsYXIgZGVwb3NpdHMgaGluZGVyIA==","upper_bound":"Z3VsYXIsIGV2ZW4gZGVwbw==","repeats":4},{"count":4469000,"lower_bound":"Z3VsYXIsIGZsdWZmeSBkZQ==","upper_bound":"aGUgYWNjb3VudHMuIA==","repeats":4},{"count":4509000,"lower_bound":"aGUgYWNjb3VudHMuIGJ1c2lseSBl","upper_bound":"aGUgZnVyaW91c2w=","repeats":4},{"count":4549000,"lower_bound":"aGUgZnVyaW91c2x5IGU=","upper_bound":"aGVseSA=","repeats":4},{"count":4589000,"lower_bound":"aGVseSBh","upper_bound":"aGVseSB1","repeats":4},{"count":4629000,"lower_bound":"aGVseSB1bnVzdWFsIGlkZWE=","upper_bound":"aG9yc2U=","repeats":4},{"count":4669000,"lower_bound":"aHJhc2ggcXVpYw==","upper_bound":"aWMgZGVwZQ==","repeats":4},{"count":4709000,"lower_bound":"aWMgZGVwZW5kZW5jaQ==","upper_bound":"aWNrbHkgZmluYWwgYWNjb3VudHM=","repeats":4},{"count":4749000,"lower_bound":"aWNrbHkgaXJvbmljLCBmaQ==","upper_bound":"aWRlYXMgd2E=","repeats":4},{"count":4789000,"lower_bound":"aWRlYXMu","upper_bound":"aWx5IGU=","repeats":4},{"count":4829000,"lower_bound":"aWx5IGV2ZW4gZGVwZW5kZW5jaQ==","upper_bound":"aW5hbCBwYWNr","repeats":4},{"count":4869000,"lower_bound":"aW5hbCBwYWNrYQ==","upper_bound":"aW5nIHRvIHRoZSByZXF1ZXN0","repeats":4},{"count":4909000,"lower_bound":"aW5nLCBmaW5hbCBmb3hlcyA=","upper_bound":"aW5zdHJ1Y3Rpb25zLiBmdXJpb3U=","repeats":4},{"count":4949000,"lower_bound":"aW5zdHJ1Y3Rpb25zLiBuZXZlciA=","upper_bound":"aW9ucyB3YWs=","repeats":4},{"count":4989000,"lower_bound":"aW9ucy4g","upper_bound":"aW91c2x5IGlybw==","repeats":4},{"count":5030000,"lower_bound":"aW91c2x5IGlyb24=","upper_bound":"aXJvbmljIGQ=","repeats":2004},{"count":5070000,"lower_bound":"aXJvbmljIGRlcA==","upper_bound":"aXRlcyBuYWcgZmx1ZmZpbHku","repeats":4},{"count":5110000,"lower_bound":"aXRlcyBzb2x2ZSBm","upper_bound":"aXRoZWx5IHNseWx5IA==","repeats":4},{"count":5150000,"lower_bound":"aXRoZXMgYWJvdXQgdGhl","upper_bound":"aXggYWJvdmUgdGhlIGI=","repeats":4},{"count":5190000,"lower_bound":"aXggY2FyZWZ1bGx5","upper_bound":"a2FnZXMgcw==","repeats":4},{"count":5230000,"lower_bound":"a2FnZXMgc2Vy","upper_bound":"a2UgcXVpYw==","repeats":4},{"count":5270000,"lower_bound":"a2UgcXVpY2tseQ==","upper_bound":"a2x5IHNseQ==","repeats":4},{"count":5310000,"lower_bound":"a2x5IHVudXN1","upper_bound":"bCBoYXZlIHRvIHNlcnZlIGY=","repeats":4},{"count":5350000,"lower_bound":"bCBpZGVhcyBhcmUgcGVuZA==","upper_bound":"bCB0aGVvZG9saXRlcy4gZmk=","repeats":4},{"count":5390000,"lower_bound":"bCB3YXJobw==","upper_bound":"bGFyIGZveGVzIHVz","repeats":4},{"count":5430000,"lower_bound":"bGFyIGlkZWE=","upper_bound":"bGF0ZWxldHMgYQ==","repeats":4},{"count":5470000,"lower_bound":"bGF0ZWxldHMgYWZ0ZXIgdGhlIA==","upper_bound":"bGUgYWdhaW5zdCA=","repeats":4},{"count":5510000,"lower_bound":"bGUgYXQgdGhlIGV4cHJlcw==","upper_bound":"bGVlcCBmbHVm","repeats":4},{"count":5550000,"lower_bound":"bGVlcCBuZWFyIA==","upper_bound":"bGlldmUgcmVn","repeats":4},{"count":5590000,"lower_bound":"bGl0ZXM=","upper_bound":"bGl0aGVseSBleHByZXM=","repeats":4},{"count":5630000,"lower_bound":"bGl0aGVseSBleHByZXNzIGFjY291","upper_bound":"bGx5IGZpbmFsIHBpbg==","repeats":4},{"count":5670000,"lower_bound":"bGx5IGZpbmFsIHNhdQ==","upper_bound":"bG9uZyB0aGUgY2w=","repeats":4},{"count":5710000,"lower_bound":"bG9uZyB0aGUgZXhwcmVzcyB0aGVvZA==","upper_bound":"bHVmZmlseSBpcm8=","repeats":4},{"count":5750000,"lower_bound":"bHVmZmlseSBpcm9uaQ==","upper_bound":"bHkgYWxvbmdzaWRlIG9mIHRo","repeats":4},{"count":5790000,"lower_bound":"bHkgYW0=","upper_bound":"bHkgZXZlbiA=","repeats":2004},{"count":5830000,"lower_bound":"bHkgZXZlbiBhY2Nv","upper_bound":"bHkgZmluYWwgZm9yZ2Vz","repeats":4},{"count":5870000,"lower_bound":"bHkgZmluYWwgZm94ZXMuIHNwZQ==","upper_bound":"bHkgaXJvbmljIGFjY28=","repeats":4},{"count":5910000,"lower_bound":"bHkgaXJvbmljIGFjY291","upper_bound":"bHkgcGVuZGluZyB0aGVvZG8=","repeats":4},{"count":5950000,"lower_bound":"bHkgcGVuZGluZyB0aGVvZG9saXQ=","upper_bound":"bHkgcmVndWxhciBw","repeats":4},{"count":5990000,"lower_bound":"bHkgcmVndWxhciBwYWM=","upper_bound":"bHkgdW51c3VhbCA=","repeats":1004},{"count":6030000,"lower_bound":"bHkgdW51c3VhbCBk","upper_bound":"bHlseSBhZ2Fpbg==","repeats":4},{"count":6070000,"lower_bound":"bHlseSBhbG9uZyB0aGU=","upper_bound":"bWFzLiBjYXJlZnVsbHkgdW51","repeats":4},{"count":6110000,"lower_bound":"bWFzLiBxdWlja2x5IA==","upper_bound":"biBkZXA=","repeats":4},{"count":6150000,"lower_bound":"biBkZXBlbmRlbmNpZXMgYWZ0ZXIg","upper_bound":"bmFnLiBmbHVmZmls","repeats":4},{"count":6190000,"lower_bound":"bmFsIGE=","upper_bound":"bmFsLCBldmVuIGRl","repeats":4},{"count":6230000,"lower_bound":"bmFsLCBmaW5hbCBkZXBvcw==","upper_bound":"bmRpbmcgZGVwZW5kZW5jaWVzIGM=","repeats":4},{"count":6270000,"lower_bound":"bmRpbmcgZGVwZW5kZW5jaWVzLiBz","upper_bound":"bmcgaW5zdHJ1","repeats":4},{"count":6310000,"lower_bound":"bmcgaW5zdHJ1Y3Rp","upper_bound":"bmdzaWRlIA==","repeats":1004},{"count":6350000,"lower_bound":"bmdzaWRlIG8=","upper_bound":"bmljLCByZWd1bGFyIGFjY291bnRzLg==","repeats":4},{"count":6390000,"lower_bound":"bmljLCByZWd1bGFyIGlkZQ==","upper_bound":"bnMuIGNhcmVmdQ==","repeats":4},{"count":6430000,"lower_bound":"bnMuIGNhcmVmdWxseSBzcGU=","upper_bound":"bnQgZGVwb3NpdHMgd2Fr","repeats":4},{"count":6470000,"lower_bound":"bnQgZGVwb3NpdHMuIGV2","upper_bound":"bnRzIGNham9sZSBxdWlja2x5IHM=","repeats":4},{"count":6510000,"lower_bound":"bnRzIGRvdWJ0LiBjYXJlZnU=","upper_bound":"bnVzdWFsIHBpbnRvIGI=","repeats":4},{"count":6550000,"lower_bound":"bnVzdWFsIHBpbnRvIGJlYW5zIGE=","upper_bound":"byB0aGUgYWx3YXlzIGU=","repeats":4},{"count":6590000,"lower_bound":"byB0aGUgYmxpdGhlbHkgcmVndQ==","upper_bound":"b2dnZWRseSBhYm8=","repeats":4},{"count":6630000,"lower_bound":"b2dzLiBjYXJlZnVsbHkgcmVndWxhcg==","upper_bound":"b2xlIGZ1cmlvdXNseSBpcm8=","repeats":4},{"count":6670000,"lower_bound":"b2xlIHF1aWM=","upper_bound":"b21pc2UgYw==","repeats":4},{"count":6710000,"lower_bound":"b24gdGhlIHNwZWNpYWwgaW5zdHI=","upper_bound":"b25pYyBmb3hlcy4gc3BlY2lhbCwg","repeats":4},{"count":6750000,"lower_bound":"b25pYyBmcg==","upper_bound":"b25zIHVudw==","repeats":4},{"count":6790000,"lower_bound":"b25zIHdha2Ug","upper_bound":"b3NpdHMgYWNyb3Nz","repeats":4},{"count":6830000,"lower_bound":"b3NpdHMgYWZ0ZXIgdGhlIHF1","upper_bound":"b3NzIHRoZSBmdXJpb3VzbHkgZXg=","repeats":4},{"count":6870000,"lower_bound":"b3NzIHRoZSBmdXJpb3VzbHkgcmU=","upper_bound":"b3VudHMgYWNjb3JkaW4=","repeats":4},{"count":6910000,"lower_bound":"b3VudHMgYWZmaXggcXVpZXRseSBh","upper_bound":"b3VzbHk=","repeats":4004},{"count":6950000,"lower_bound":"b3VzbHkg","upper_bound":"b3VzbHkgcGVuZGluZyBhYw==","repeats":4},{"count":6990000,"lower_bound":"b3VzbHkgcGVuZGluZyByZXF1ZXM=","upper_bound":"b3hlcyA=","repeats":4},{"count":7030000,"lower_bound":"b3hlcyBh","upper_bound":"cCBmdXJpb3VzbA==","repeats":4},{"count":7070000,"lower_bound":"cCBmdXJpb3VzbHkgY2FyZWZ1bGx5IA==","upper_bound":"cGFja2FnZXMuIHBh","repeats":4},{"count":7111000,"lower_bound":"cGFja2FnZXMuIHBlbmRpbmcgcGFjaw==","upper_bound":"cGVuZGVuY2k=","repeats":1004},{"count":7151000,"lower_bound":"cGVuZGVuY2llcyBhcmUuIA==","upper_bound":"cGludG8gYmVhbnMgcHJvbQ==","repeats":4},{"count":7191000,"lower_bound":"cGludG8gYmVhbnMgc2xlZXAgY2FyZQ==","upper_bound":"cG9zaXRzLiBi","repeats":4},{"count":7231000,"lower_bound":"cG9zaXRzLiBibGl0aGU=","upper_bound":"cHJlc3MsIHVudXN1YWwgYQ==","repeats":4},{"count":7271000,"lower_bound":"cHRocyB1c2UgZg==","upper_bound":"cXVlc3RzLiBjYXJlZnVs","repeats":4},{"count":7311000,"lower_bound":"cXVlc3RzLiBjYXJlZnVsbHk=","upper_bound":"ciBhY2NvdW50cyBhZ2FpbnN0IHRo","repeats":4},{"count":7351000,"lower_bound":"ciBhY2NvdW50cyBjYWpvbGUg","upper_bound":"ciBwYWNrYWdl","repeats":1004},{"count":7391000,"lower_bound":"ciBwYWNrYWdlcw==","upper_bound":"ciB0aGVvZG9saXRlcy4gYWNj","repeats":4},{"count":7431000,"lower_bound":"ciB0aGVvZG9saXRlcy4gcXVpY2ts","upper_bound":"cmUgZmx1","repeats":4},{"count":7471000,"lower_bound":"cmUgZnVy","upper_bound":"cmVmdWxseSBldmVuIHQ=","repeats":4},{"count":7511000,"lower_bound":"cmVmdWxseSBldmVuIHRo","upper_bound":"cmVndWxhciBhc3ltcHRvdGVz","repeats":4},{"count":7551000,"lower_bound":"cmVndWxhciBhc3ltcHRvdGVzIGFm","upper_bound":"cmVndWxhciwgYmxpdA==","repeats":4},{"count":7591000,"lower_bound":"cmVndWxhciwgYm8=","upper_bound":"cmVxdWVzdHMgd2FrZS4gY2w=","repeats":4},{"count":7631000,"lower_bound":"cmVxdWVzdHMgd2FzIGNhcg==","upper_bound":"cmVzcyB0aGVvZG9s","repeats":4},{"count":7671000,"lower_bound":"cmVzcyB3YXJob3JzZXMgY2Fqb2xl","upper_bound":"cmlvdXNseSBmaW5hbCBhY2NvdQ==","repeats":4},{"count":7711000,"lower_bound":"cmlvdXNseSBmdXJpb3VzbHk=","upper_bound":"cm9uaWMgZGVw","repeats":4},{"count":7751000,"lower_bound":"cm9uaWMgZGVwZW5k","upper_bound":"cm9zcyB0aGUgY2E=","repeats":4},{"count":7791000,"lower_bound":"cm9zcyB0aGUgY2Fy","upper_bound":"cnVjdGlvbnMgY2Fqb2xlIGZ1","repeats":4},{"count":7831000,"lower_bound":"cnVjdGlvbnMgaGFnZ2w=","upper_bound":"cyBhZnRlcg==","repeats":4},{"count":7871000,"lower_bound":"cyBhZnRlciB0aGU=","upper_bound":"cyBib29zdCBjYXJl","repeats":4},{"count":7911000,"lower_bound":"cyBib29zdCBjYXJlZnVsbHkgYWM=","upper_bound":"cyBoYWdnbA==","repeats":4},{"count":7951000,"lower_bound":"cyBoYWdnbGUgYWJvdXQg","upper_bound":"cyBuYWcgYm9sZGx5IGNhcmVmdQ==","repeats":4},{"count":7991000,"lower_bound":"cyBuYWcgZnVyaW91c2x5IGV4cHJlcw==","upper_bound":"cyBzbGVlcCBzbA==","repeats":1004},{"count":8031000,"lower_bound":"cyBzbGVlcCBzbHlseSBh","upper_bound":"cyB3YWtlIGJsaXRoZWx5LiBl","repeats":4},{"count":8071000,"lower_bound":"cyB3YWtlIGJsaXRoZWx5LiBzcGVjaQ==","upper_bound":"cy4gY2FyZWZ1bGx5IHJlZ3VsYQ==","repeats":4},{"count":8111000,"lower_bound":"cy4gY2FyZWZ1bGx5IHJlZ3VsYXIg","upper_bound":"cy4gZnVyaW91c2w=","repeats":1004},{"count":8151000,"lower_bound":"cy4gZnVyaW91c2x5","upper_bound":"cy4gcmVndWxhciwgZmluYQ==","repeats":4},{"count":8191000,"lower_bound":"cy4gcmVxdWVzdHMgY2Fqb2xlIQ==","upper_bound":"c2UgY2FyZWY=","repeats":4},{"count":8231000,"lower_bound":"c2UgY2FyZWZ1bGw=","upper_bound":"c2lkZXMgdA==","repeats":4},{"count":8271000,"lower_bound":"c2lsZW4=","upper_bound":"c2l0cyB1c2UuIHBlbmRpbmc=","repeats":4},{"count":8311000,"lower_bound":"c2l0cyB3YWs=","upper_bound":"c2x5IGFnYWluc3QgdGhlIHJlZ3VsYQ==","repeats":4},{"count":8351000,"lower_bound":"c2x5IGFtb24=","upper_bound":"c2x5LCByZWd1","repeats":4},{"count":8391000,"lower_bound":"c2x5LiBjYXJlZnVsbHkgcmVn","upper_bound":"c2x5bHkgcmVndWxhciBwYQ==","repeats":4},{"count":8431000,"lower_bound":"c2x5bHkgcmVxdWVzdHMuIHNs","upper_bound":"c3BlY2lhbCwgcmU=","repeats":4},{"count":8471000,"lower_bound":"c3BlY2lhbCwgc2lsZW50IGFjY291bg==","upper_bound":"c3QgYWdhaW5zdCB0aGUgc3Bl","repeats":4},{"count":8511000,"lower_bound":"c3QgYXQgdGhlIGM=","upper_bound":"c3RydWN0aW9ucy4gZm8=","repeats":4},{"count":8551000,"lower_bound":"c3RydWN0aW9ucy4gcXVpY2ts","upper_bound":"c3VhbCBkZXBvc2l0cyBkZXRlY3Q=","repeats":4},{"count":8591000,"lower_bound":"c3VhbCBkZXB0aHM=","upper_bound":"dCBmaW5hbCBmb3hlcy4gaQ==","repeats":4},{"count":8631000,"lower_bound":"dCBmbHVm","upper_bound":"dGUgZnVyaW91cw==","repeats":4},{"count":8671000,"lower_bound":"dGUgZnVyaW91c2x5","upper_bound":"dGVzIGFyZSBmdXJpb3U=","repeats":4},{"count":8711000,"lower_bound":"dGVzIGNham9sZSBzbHls","upper_bound":"dGhlIGJvbGQsIGV4cHJlc3Mg","repeats":4},{"count":8751000,"lower_bound":"dGhlIGNhcmU=","upper_bound":"dGhlIGZ1cmlvdXNseSBpcg==","repeats":4},{"count":8791000,"lower_bound":"dGhlIGZ1cmlvdXNseSBpcm9uaWMg","upper_bound":"dGhlIHNseWx5IGlyb25pYyBpbg==","repeats":4},{"count":8831000,"lower_bound":"dGhlIHNseWx5IHA=","upper_bound":"dGhlbHkgcmVndQ==","repeats":4},{"count":8871000,"lower_bound":"dGhlbHkgcmVndWw=","upper_bound":"dGlvbnM=","repeats":1004},{"count":8911000,"lower_bound":"dGlvbnMg","upper_bound":"dG8gdGhlIGNhcg==","repeats":4},{"count":8951000,"lower_bound":"dG8gdGhlIGNhcmU=","upper_bound":"dHMgYWI=","repeats":4},{"count":8991000,"lower_bound":"dHMgYWJvdmUgdGhlIGZpbmFsIHI=","upper_bound":"dHMgaGFnZ2xlIGNhcmVm","repeats":4},{"count":9031000,"lower_bound":"dHMgaGFnZ2xlLiBxdWljaw==","upper_bound":"dHMgd2FrZSBzbHls","repeats":4},{"count":9071000,"lower_bound":"dHMgd2FrZSBzbHlseSBzbHk=","upper_bound":"dHMuIHNseWx5IHJlZ3Vs","repeats":4},{"count":9111000,"lower_bound":"dHMuIHNwZWNpYWwgYWNj","upper_bound":"dWN0aW9ucyBib29zdCBmbHVmZmls","repeats":4},{"count":9152000,"lower_bound":"dWN0aW9ucyBj","upper_bound":"dWVzdHMuIA==","repeats":1004},{"count":9195000,"lower_bound":"dWVzdHMuIGFjY291bnRzIHNsZQ==","upper_bound":"dWlja2x5","repeats":3004},{"count":9235000,"lower_bound":"dWlja2x5IA==","upper_bound":"dWxhciBkZXBvcw==","repeats":4},{"count":9275000,"lower_bound":"dWxhciBkZXBvc2l0","upper_bound":"dWxseSBib2xk","repeats":4},{"count":9315000,"lower_bound":"dWxseSBib2xkIHJlcXU=","upper_bound":"dW5kIHRoZSBmdXJpb3VzbHkgYm9s","repeats":4},{"count":9355000,"lower_bound":"dW5kIHRoZSBwZXJtYW5lbnRs","upper_bound":"dW51c3VhbA==","repeats":2004},{"count":9395000,"lower_bound":"dW51c3VhbCA=","upper_bound":"dXJpb3VzbHkgZg==","repeats":4},{"count":9435000,"lower_bound":"dXJpb3VzbHkgZmluYWwgZm94ZXM=","upper_bound":"dXNlcyBib29zdCBpZGx5IGE=","repeats":4},{"count":9475000,"lower_bound":"dXNlcyBjYWpvbGUgY2FyZQ==","upper_bound":"dXNseSBwZW5kaW5nIHJlcQ==","repeats":4},{"count":9515000,"lower_bound":"dXNseSBxdWlja2x5IHNwZQ==","upper_bound":"dXN1YWwgdGhlb2RvbA==","repeats":4},{"count":9555000,"lower_bound":"dXN1YWwsIGJvbGQg","upper_bound":"dmVuIGRlcG9zaXQ=","repeats":1004},{"count":9595000,"lower_bound":"dmVuIGZveGVzIA==","upper_bound":"d2FyZCB0aGUgYmxpdGg=","repeats":4},{"count":9635000,"lower_bound":"d2FyaG9yc2VzIHNsZQ==","upper_bound":"eGVzLiA=","repeats":1004},{"count":9675000,"lower_bound":"eGVzLiBibGl0aGVseSBl","upper_bound":"eSBhZnRlciB0aGUgZnVyaW91","repeats":4},{"count":9715000,"lower_bound":"eSBhZnRlciB0aGUgcmVndWxhciw=","upper_bound":"eSBkYXJpbmcgcGVh","repeats":4},{"count":9755000,"lower_bound":"eSBkYXJpbmcgdA==","upper_bound":"eSBmaW5hbA==","repeats":4},{"count":9796000,"lower_bound":"eSBmaW5hbCA=","upper_bound":"eSBpcm9u","repeats":2004},{"count":9837000,"lower_bound":"eSBpcm9uaWM=","upper_bound":"eSByZWc=","repeats":2004},{"count":9877000,"lower_bound":"eSByZWd1","upper_bound":"eSBzcGVjaWE=","repeats":4},{"count":9917000,"lower_bound":"eSBzcGVjaWFsIA==","upper_bound":"eS4gZmx1ZmZpbHkgYm9sZCBw","repeats":4},{"count":9957000,"lower_bound":"eS4gZnVy","upper_bound":"eWx5IGlyb25pYyBwYWNrYWdlcw==","repeats":4},{"count":9997000,"lower_bound":"eWx5IGlyb25pYyBwbGF0ZWxldHMuIA==","upper_bound":"emUgaWRseSBhdCB0","repeats":4},{"count":10000000,"lower_bound":"emxlIGZ1cmlvdXNseSBmaW5hbA==","upper_bound":"enpsZSBmbHU=","repeats":4}]},"cm_sketch":{"rows":[{"counters":[3480,5078,3977,4942,3800,4199,5375,5097,3659,5353,4321,5926,4843,4788,3981,4767,4544,5655,3232,4017,6273,4812,4273,4875,5477,4361,3903,4975,5330,5037,4091,5736,4421,4473,3951,4712,6093,3575,6537,5841,3931,8236,7394,4250,4793,8205,4254,4943,4797,4186,5286,4197,4401,4822,6562,4897,7186,3547,4894,6251,4953,6214,8092,4330,6259,4624,3900,4154,5159,5513,4827,5843,3527,4350,4483,3424,4566,4097,4964,4109,3930,4894,4478,3349,5457,4768,5171,5750,6476,3404,8479,3551,4074,7606,3953,4647,8643,4923,4833,4871,4618,5054,3185,4812,4170,4806,3866,4635,4985,4984,4478,5630,5760,4077,5540,4805,4679,5061,6213,4316,4691,5115,3515,3436,4857,7475,4613,4698,3648,4230,5156,3789,4446,4279,4600,4059,3607,4918,3852,4015,4051,4423,4600,5555,4298,3789,4320,4534,5189,5773,5254,4058,4140,4863,7400,4759,7655,3002,4990,5569,3360,4044,5161,4065,4125,4356,4640,3879,6326,3797,4432,5466,3329,4349,3582,4043,5817,4465,4978,7014,3476,5333,3276,4639,4199,5155,4302,5704,3401,6037,5198,6919,4232,4636,5257,5353,7503,4808,5763,5277,9109,4724,3832,4031,5607,5134,3829,3886,4288,5923,4603,7630,3777,4638,4285,3911,5643,5223,8384,6254,4110,4320,4176,4551,5416,4157,4815,4542,4511,5569,4107,4329,4272,4219,4976,5760,6212,4463,5055,4780,4004,3763,4684,4644,3540,4919,3931,3806,3058,4359,4826,6254,3975,4068,4622,4557,5534,3830,4934,4588,4977,4523,4139,4276,6508,3844,5497,4294,5677,4266,5230,4394,6019,4366,4316,5923,4253,6606,4927,4501,4736,4097,4649,4317,5194,5569,4550,3709,4934,5488,4450,4226,4482,3859,4589,3606,3810,4760,4579,5097,5638,4871,9046,4025,5047,3998,4177,5569,4616,5196,4193,3671,3877,4552,3845,5916,3597,5210,4326,4821,5465,4567,4295,4162,3988,5893,5872,5106,3836,3778,4078,3840,4244,9488,6914,5260,5394,4504,4661,4863,6320,5799,3428,4511,4987,4583,3851,4540,5262,5141,4786,5011,5206,4359,4309,5024,3810,4422,7370,4271,5627,4923,5365,5747,4379,4782,5282,7102,6240,4115,7097,6273,4078,3639,5633,5252,3728,7369,4287,4333,3899,4195,4424,6881,4058,4531,4796,5471,3706,4533,7653,6739,4623,4971,5268,4236,3299,4789,4082,5834,4588,4813,7754,5121,4378,7756,6312,6655,5868,8590,4709,4327,3959,7399,4314,4593,6165,4537,3579,5212,5707,3836,3889,3513,4017,4433,5186,5269,4616,3914,4435,3936,3589,6839,4063,4775,3251,3934,5506,3961,4719,3475,4142,4013,3934,4931,5190,4792,4475,6139,4358,6467,4208,3748,4654,7320,4982,4489,4535,4382,4140,6803,8135,3669,4649,4045,4625,4614,4778,4406,4265,4812,4480,3474,5431,4666,4286,4606,3570,3604,4973,4217,4911,4849,5640,7590,4171,3992,4484,4147,5971,3971,4912,4815,3770,3954,5398,4828,4875,5033,4130,4671,5819,4415,4053,4732,4600,4720,4810,4948,4741,4153,6212,4624,4028,6348,6151,3969,4816,4870,5454,5259,3790,5155,4691,4158,10266,4568,4620,5216,6214,5982,5096,6348,4351,5066,3884,4271,5497,4719,5873,4750,3818,5235,4618,6693,4561,5175,4326,6035,4275,3736,8526,5506,3751,5285,7225,4035,5166,5117,6145,3182,4707,4772,4274,4256,5382,5464,4799,6946,4381,4627,4926,3664,5929,4274,4541,7956,3996,5962,9039,6326,3751,4077,5166,4050,4498,4940,3944,5246,3469,5021,8680,4198,4277,4849,4621,7540,4330,4117,5120,4450,5439,4561,3908,6249,9470,4553,3791,4243,4313,5081,4727,3924,4936,6355,4359,4144,3840,4885,3813,4283,3977,6235,5229,3920,3862,3690,5845,2981,4141,3774,5474,4710,4669,4717,7041,6044,4011,3946,6947,4365,4132,4604,5190,5883,3951,5433,5443,4859,5430,4392,4812,4895,6425,4495,4028,3827,4853,5146,4947,4236,3673,6326,4733,6574,5485,5682,7521,3995,6022,3840,4756,4029,4951,7371,4547,8088,8038,4647,4514,5748,3933,4915,4911,4715,3153,4251,3734,3736,4345,4290,4211,5148,4657,5561,4638,4317,3667,6055,8661,9193,6850,3735,3774,5067,4810,5353,3709,5235,6216,5779,3705,3962,4486,4319,5255,3694,3862,4058,5838,3348,5975,3978,5129,7080,4860,4018,4477,4853,4751,4414,3946,5459,4224,3935,4937,4139,4435,4919,4004,3645,4053,3499,5740,5132,5091,5045,4527,3938,5273,4792,4469,3858,4031,3957,4298,4275,5221,3994,4834,4333,6727,4564,5070,4484,6932,4575,9310,4058,4394,4620,6139,7212,4382,4297,5013,4388,4585,5069,6282,4921,3926,3692,5123,4659,5099,3876,4644,4901,4371,4569,3698,5354,3951,4529,3579,5869,5439,3835,3208,6078,7190,4339,4805,4320,4118,4317,4508,8040,5923,5540,4956,4365,5607,4488,4888,4818,6132,5248,3463,4207,4426,4195,5368,3894,4328,4200,5592,5123,8152,4072,4511,3977,4482,4944,3523,4577,3949,4471,6267,4872,4205,3522,4434,11697,4728,4496,7918,5536,3834,4500,3738,5576,4675,4703,3611,4199,4152,7216,5005,5079,4771,4712,4953,3841,4564,6437,4864,6921,3681,5033,4231,4331,4084,5797,5038,4307,4574,4858,6512,6257,4211,4494,3863,5448,6849,3808,4176,4176,5476,4442,4884,4699,4206,5122,4391,3769,4295,3607,6213,5416,4039,8786,6754,3154,4392,4612,3806,3713,4282,4597,3652,6218,6445,4841,4684,8223,4932,4148,6522,4850,4992,4765,5173,5722,5216,4519,6853,5132,5813,4103,6328,4405,5624,4277,4824,5371,3797,4747,3842,3823,5370,3803,3876,5985,4223,3693,4384,3401,4233,5025,3835,5478,3609,5685,4244,5335,5582,3876,3612,3417,5744,6958,6326,4195,6605,4501,4732,4531,4688,3931,4715,6299,4255,4636,4300,4875,5725,5245,4642,3793,4641,3964,5758,4541,4329,3638,3657,4210,5019,7823,5199,4302,4545,5399,6322,4718,6776,4587,3990,4171,6459,3554,5392,5256,4329,5521,4663,4195,3845,5011,4802,3855,3947,4872,5041,7133,8764,3958,5897,4592,3612,4288,4801,5206,4341,4230,4560,5533,4761,3493,3800,3400,6700,3591,3854,4500,5257,4154,5319,6262,4485,4399,4863,3923,5484,4138,4943,4004,4082,4175,3564,4583,4220,4132,3626,5737,3450,4539,3875,5216,3729,3779,4606,3507,4219,5842,4413,3980,7458,6861,4168,3920,3537,3947,4324,4825,7813,5111,5466,4354,3727,3765,4472,5095,3549,3952,5716,5265,4158,4929,5846,3965,5645,5477,3797,4973,5668,5401,5775,4783,5544,5507,5515,6704,5666,7417,5027,4518,3850,5223,4876,4811,4012,4600,4385,3961,4441,6773,4224,4885,3996,4625,8370,4792,4578,4247,8608,5185,3762,5726,5131,3747,4095,3270,4569,4424,6388,4124,4403,4102,3909,3481,3984,3958,4477,4829,4117,5591,7891,4621,4284,5883,4421,3515,4182,5729,4463,3448,5024,3944,4710,4170,5819,3913,4813,4455,4240,5860,4672,4261,4449,4480,6532,5013,5188,4486,5206,5281,3923,6435,4593,3850,4291,3818,4142,3980,3967,5547,5699,5576,3788,3619,7719,3198,4789,5669,3437,3061,4950,5375,5013,3849,4715,4218,3966,4718,5106,4247,7129,7042,4264,4285,9580,4515,4421,3615,4092,4647,6768,4395,4374,8637,4006,3991,5651,4380,3645,3838,5457,4385,4279,4137,4041,5150,5684,5015,5044,6629,3747,4869,5315,4823,4773,4648,6144,3791,4670,4525,4734,7118,5285,7509,3898,3823,4992,5621,5085,7141,9387,6547,4823,5304,5109,4571,3655,3962,4519,8169,5214,4126,4168,3814,4775,6538,3238,4356,4331,3744,4284,7359,4058,4471,5760,4889,3943,3979,4043,4048,6072,3960,5397,4659,4485,7015,6348,4792,9379,4206,6198,4941,5432,4777,4969,3742,3889,6359,3978,4961,3662,7360,3881,6175,4631,3771,5545,4245,3942,4478,6470,3436,9277,4906,3729,3582,4585,4376,4361,3687,4419,7949,4047,4480,3769,4524,4462,3682,4189,5192,5706,4499,4638,5255,5986,5445,5440,5383,6793,4657,4590,5123,5135,4105,4448,3882,4832,6736,4921,4073,4652,4358,4917,4056,4555,3993,4763,5096,4792,6782,4674,4053,7075,5866,4343,4529,4839,4001,5661,4302,6650,4739,5321,5077,3804,4550,5109,7088,4345,4819,7315,3917,3802,4711,5292,3231,5588,4452,5184,4634,4398,4353,5353,4465,5686,6104,7279,3813,3939,5547,3676,3809,6240,4406,3359,4844,4717,4733,6864,6320,3800,6550,4273,9173,5435,3922,3844,7699,4672,3257,4406,3670,3832,3860,3605,4384,5513,4269,4434,5598,4831,5385,5595,4961,4904,4019,5360,5102,3751,3590,4537,4286,5937,4755,4470,4925,5183,3934,5728,3500,4374,3930,3841,10604,5822,4250,4020,3959,3769,5620,4646,5067,5139,5705,3645,4207,4139,4650,4688,3783,4827,4285,5528,4379,4517,5530,4462,4279,4831,4315,4900,4102,4346,7202,3139,5066,4449,6762,3859,4408,4121,4479,3016,5304,6454,3750,5091,3611,5257,3713,6214,4564,4606,5321,5265,4126,4269,5041,3670,4255,5699,5037,4969,5566,5329,4422,5522,3577,5385,4083,3984,8834,5951,4467,5200,4823,4081,4169,5718,3977,4546,3693,3789,3883,5136,4304,4619,4473,4222,4265,5432,4718,5342,3861,4134,4719,7160,5502,6521,4508,4787,3889,4689,4422,3981,5597,3840,3295,4416,4132,3661,3391,6898,6565,7528,5869,4627,3964,5310,4004,4733,4766,4910,5246,3490,5947,4689,5124,3507,5807,4311,4222,4240,7484,3659,5169,4776,5269,4525,5113,4384,3455,5616,4799,6662,3741,4942,4133,4585,4505,4361,6608,5992,4564,6880,4825,4024,3592,3684,4518,3874,4626,4369,3530,3445,6886,4204,5572,3462,5147,3726,4111,6984,5594,4861,4302,7433,5019,5406,4564,4212,4714,5105,3626,4850,6728,3410,4461,5450,4544,5545,4943,5164,4254,4976,3954,6929,3227,4311,4197,6208,3980,3965,5720,4563,4406,5273,4102,4228,3827,4819,4295,3948,6124,5025,3210,4711,5319,3888,5376,4370,3496,4231,6079,6677,4478,4333,4093,4721,5054,4912,6752,4263,3996,4219,9947,6055,4442,4372,3507,4929,4443,4953,5137,4887,6667,3594,4396,3708,5429,3321,3798,5585,5393,7894,3942,3642,4181,4327,3905,4677,5820,5800,4136,5003,4193,5250,4942,5885,3541,7508,4326,3965,4216,4465,6501,4753,3645,5315,5008,5795,4169,4746,4489,4449,4535,4169,4629,5438,4112,4737,4853,6023,4124,6163,3659,5122,4565,4770,5212,7154,7066,5420,4103,3607,4794,6258,5286,3883,3097,3735,5575,7081,6890,3761,8278,4101,5229,4892,4293,4600,5147,4418,4156,3833,4773,4112,4351,4669,4801,4535,4014,4529,4891,4363,4115,5880,4204,6244,5988,5500,3938,5923,5836,6457,5441,3974,4890,5943,6679,5166,5087,8017,4076,5026,3757,4562,5084,4261,5997,4414,3928,3395,6786,4896,7983,3964,4547,3379,4572,5037,3656,4835,4089,6386,6556,4604,4320,3833,7487,4229,4501,5017,7461,5708,6052,4746,7562,4144,4212,5303,4453,4138,4033,4892,3671,5720,5459,3677,4055,4937,4480,3972,6753,4410,5549,4320,4500,5669,4022,4548,4416,4939,4421,4889,4242,5443,4507,4903,3807,5320,3915,5361,4235,4805,3687,6486,4995,4909,5441,5501,3121,4446,5744,4902,4147,4177,4709,5004,6567,3995,4016,5211,5415,5323,4149,5363,5013,4337,4477,5169,9781,4952,6431,7131,5404,5540,6675,4707,4596,4816,5927,6121,7417,4090,4373,4021,4537,4816,4716,4512,4337,4081,7269,6002,6847,3388,4271,5605,4221,5097,4039,4699,6124,3549,5217,3942,3930,4463,5352,3520,6202,6241,4275,6010,4599,4305,4890,3483,6026,4741,5053,6630,4158,3182,5430,4891,5467,7830,5839,5163,6313,4471,6161,4622,6112,4826,3862,4951,4559,7853,5359,3466,4298,4682,4423,3870,7953,3610,11097,5888,4453,3498,4002,4188,5530,3926,4759,4479,5597,4063,4207,4692,4639,4465,5000,4020,4279,7623,4339,6341,4408,4302,4233,5467,3837,3991,4255,3803,4229,5779,4604,3936,5402,4516,3462,4194,4169,3609,4478,7285,4579,5864,3713,5091,5197,4689,4967,8831,3504,4367,4162,3811,5232,4768,4369,4866,4208]},{"counters":[6408,5948,3943,4282,5140,5410,4707,4288,6087,4743,4588,4004,4548,4516,5247,4840,7339,4874,4688,4919,3944,3817,4606,7454,7806,3890,4521,3547,4930,5751,4622,4765,4782,4883,6076,5220,6678,3951,4890,4549,5027,4882,4530,3863,3547,4230,4632,6697,4478,4726,7650,8428,5342,4607,4981,6552,4455,5938,4378,4960,3503,4776,4494,4402,4060,3930,3356,4752,5424,4660,5255,6711,4298,3953,4981,4738,4644,4273,3828,4727,4622,5300,4138,4720,4469,3660,5952,4813,3974,4148,6665,4317,4331,3482,5050,4505,4410,3722,3759,4244,4800,4486,3837,4420,4326,6323,3503,4320,4195,4444,3787,5301,4511,5057,5499,4027,5935,7981,6416,4067,5592,5397,4462,4918,4718,4548,6610,6682,4050,5786,7063,5272,3695,5076,4182,5065,4806,4350,4413,5118,5616,4545,3981,6042,4121,4693,4443,5729,5161,4705,5445,3918,4034,5538,5989,8801,3740,6084,4669,4909,4795,4609,9680,4405,4672,4298,3939,4279,4957,4528,4293,4015,4914,9279,4654,4776,3543,9125,4022,4919,6562,4332,4254,5410,4373,4136,4740,6442,5410,8559,3654,4196,4285,4128,5761,4063,4885,4041,4116,4785,4024,4072,3829,4080,5931,3926,4183,4625,4963,3810,4729,6653,3797,4504,6781,6499,4745,8338,7484,5368,4780,4522,3766,5153,5426,6697,4883,4980,4458,5173,3603,4888,4165,4900,4019,5049,4011,4207,5637,4938,4372,4701,4881,4839,4161,4117,6581,4854,4635,4908,4585,5835,4460,4239,5354,5597,5268,5305,4742,4444,5612,3857,5042,6010,4988,6087,5252,4372,4677,4633,5205,4936,3790,5527,5918,4812,4220,6050,5794,4500,5414,4205,5161,4800,4871,4301,3505,4763,3356,5456,4730,6290,5899,4973,6033,4160,6740,7383,3730,3929,5161,5371,5673,4407,4193,4959,7898,4171,5706,5631,5302,4144,5407,3893,6373,3560,3969,6238,4210,4538,4516,7377,7500,6409,4139,4107,5455,5405,4388,4270,5467,4455,6473,4383,9106,5238,4443,4189,4003,4825,3840,4760,5308,6258,3496,6693,7423,5604,3874,5361,4762,5288,3665,5386,3572,3856,3984,4835,3677,4603,4308,3412,4231,4890,4347,4832,4634,3781,6303,3996,3981,5126,4897,5482,4546,4343,4830,3869,3884,4808,6688,3704,4276,6878,5755,4389,7485,3866,4320,4231,5748,5093,4504,6832,4284,4513,5129,5649,4328,5800,4996,4525,3802,5801,3542,3670,6697,3895,4143,5023,5823,3992,4345,5083,5354,5460,5878,4184,3819,4436,7882,4377,3909,5680,3463,3689,6673,4680,6164,4834,5313,4126,4085,4978,7375,5421,4990,7722,5140,6517,4327,3879,4438,3733,4650,4322,5216,4080,4946,6473,5077,3946,3847,3993,4632,4918,4809,4794,3959,4932,4898,4858,8075,4243,3670,4621,7222,2811,4308,4064,4949,4318,4220,6431,4149,4297,3604,4210,3971,5253,5363,6095,5361,3871,4110,8174,4172,5645,6191,3730,4712,7476,5274,4233,5563,6275,4510,5302,5200,4741,3744,4284,4526,4761,4862,4760,4317,5375,7625,4942,4818,4460,5333,4163,5508,4945,3988,5570,3404,6953,4128,8849,5890,9370,5097,3409,3941,4826,4540,4583,4064,4958,4659,4876,4730,5887,6750,4043,6052,3824,4283,4126,5581,4246,3738,4288,4143,4829,6309,4869,3848,4042,3074,3803,3834,3554,5080,4418,4877,4282,4281,6994,7650,3997,5223,4290,4881,3964,4103,4148,4006,6171,5151,5114,4547,11845,4555,4387,4316,4416,4008,4592,3280,6044,4499,5036,4591,3872,4897,3787,4764,4251,4972,4395,4527,5739,4432,4354,5504,5049,4707,3785,3317,5307,8688,4560,4699,3402,4827,5656,3551,4415,3768,4841,4593,4897,7649,3792,4720,4706,4569,6603,6024,3919,7624,6094,3903,4335,4366,4260,4126,5250,4976,3828,4223,5361,3942,4466,5924,4119,3851,5138,4279,4641,3557,3638,4747,4942,6945,4557,4588,4898,4630,5448,6241,3392,4842,4199,4620,4494,3741,3645,5639,4396,3826,3538,4766,4285,4407,3535,3388,4694,3909,4263,5878,5075,6493,4788,9582,4312,4251,4908,5136,4172,3472,5625,3914,4921,7661,3189,3532,3959,7673,4657,4067,5972,5306,3965,5184,4111,4909,4062,6407,4092,4658,4893,5290,4710,4399,4386,5827,4859,4511,4715,4375,3670,4249,4460,5361,5428,4295,4955,6091,4471,4363,4445,4635,4200,8854,4909,3784,5345,6370,5477,6276,4246,7037,6062,3649,4309,4817,3578,4907,3961,5698,5585,5001,3741,4657,5342,4205,5690,4902,4146,7118,5086,4739,4492,4127,4457,4585,5463,3783,4515,4547,3447,4858,5455,5870,3969,5817,5626,5099,4902,3577,4406,4634,5367,4302,4353,3635,6149,4781,4870,4425,3665,4575,4458,4069,8580,4368,5897,4446,3467,4389,5734,3867,4103,4059,4366,4527,4193,7313,5443,3407,4531,4047,4947,4916,4207,4058,4784,6568,3480,3975,5143,4716,4583,4678,4123,4756,5345,4078,5435,5380,4380,4166,3666,6612,5492,5504,4789,4509,4098,3673,4716,5332,4622,3599,5038,4159,4745,5025,3956,4524,4574,4070,4466,5157,5025,3861,5840,5519,4080,4791,3894,3637,3735,3910,6772,4902,5464,4903,9637,4793,4549,6218,5005,6303,4172,5151,5538,4684,4457,5000,5123,4516,4923,5536,7002,4466,3733,3929,4735,7158,4034,4671,3604,4078,3825,3511,5181,4647,5286,5462,4410,4757,4920,4161,5234,4005,4195,6012,8278,4340,4660,5008,4120,4353,5694,4479,4719,4451,6477,4227,5078,5947,3850,5825,5695,4898,4757,5297,5176,4510,4187,4695,4735,4525,4681,7687,4739,5887,4969,4853,6566,4962,5268,4323,5487,5917,3877,5597,4653,3832,5388,4995,5741,4997,6387,6354,3884,5080,4167,4576,5765,4519,5430,6882,6127,4671,4074,3957,5939,5791,3744,4326,3967,5593,5332,4276,4708,4365,4953,4383,4059,4679,5596,4305,5469,4560,4541,4348,4863,3784,3964,3259,4060,6459,4275,4759,3945,4891,4050,5587,4456,5534,6099,4802,5069,4449,6398,4097,6033,4852,4757,3637,3949,3882,3910,5052,4160,4679,3658,4002,4762,7256,3891,4394,5269,5375,5547,5263,4499,5003,3887,4580,3929,3489,6141,4764,3663,4089,3990,7445,4517,6190,4221,4909,5511,3880,7391,5148,3755,5192,4931,4018,5663,5057,4265,3970,6576,5126,4103,4493,4215,5040,4640,6590,4064,4537,5320,4716,5631,3827,4748,3682,3839,3994,4537,5513,5296,5000,4909,4311,4722,4416,4568,4194,3693,3763,4253,5575,5538,4778,4173,4090,6375,4797,4361,3699,4201,4180,3744,4719,3523,4303,6879,4745,4276,6238,4358,5240,4590,6553,5472,4046,3462,4621,3848,8566,4588,6714,4434,5333,5868,5085,4556,4268,4179,7585,3982,7854,3960,4094,8017,4317,5606,4630,5079,4854,5561,3747,3752,3874,3756,7883,4965,4873,4360,3946,4451,3994,3980,3721,4138,5157,3996,4329,3769,8134,6648,3878,4877,4663,3976,4209,4190,6102,5042,4932,5250,5466,5950,4810,3990,5206,3844,4616,5438,5237,5940,6794,4400,4814,3625,4006,6608,4485,3551,4302,4445,6202,4767,6119,4511,5408,4346,4303,4652,4196,4522,5313,5063,3963,5212,5332,4385,8290,3974,6119,4029,5608,7282,4543,5246,4856,3901,4552,5653,3913,4372,4461,4598,5045,6147,3729,6641,4419,4517,4833,5552,4979,4386,4507,7614,3678,4837,4158,4804,4279,4590,4226,5225,5159,4985,4847,4687,4428,5373,4636,5909,6300,7405,5134,4242,3876,5690,4381,4289,5730,5524,3877,4603,4824,6508,6196,6339,5585,3657,6435,4289,5223,3469,3601,5079,4719,4001,3850,4685,7203,6164,5206,4600,4117,5612,5476,3979,3528,5716,3497,3918,6488,5854,7134,6799,4401,5144,4918,7605,5373,3531,4147,5509,4026,4340,4575,4758,4431,4468,4551,4440,3395,5325,5344,5171,9649,4401,6812,4239,4796,6263,4378,4550,4696,4960,4349,5782,3997,5062,3976,4869,4901,3561,4281,5167,4089,4860,5662,4119,6100,4429,3764,4195,5110,3570,4336,3690,6289,4143,3745,4628,3351,4175,7429,4332,5713,4669,4824,4183,4413,8660,4540,5428,3986,5334,4977,2947,4411,4362,5409,3693,4790,4212,3820,4945,4630,4372,4870,7255,5839,7116,4098,6010,4532,3540,5450,6046,3906,4445,4393,5033,4104,6007,5189,7602,6470,3299,4636,4063,5100,4923,4903,7107,4008,5024,5145,6472,5064,3396,4276,4737,4644,3458,4527,5726,6771,3211,4803,4924,3594,3614,5961,4802,4504,4564,4594,4725,4201,4224,4006,4018,4453,5721,6732,3986,4152,5865,8542,4656,4314,4198,5388,6429,5598,6110,3765,5163,5720,6256,6145,4379,4883,4805,4049,4312,4398,4624,5307,3822,4084,4738,4484,3463,4349,4365,5000,4068,4549,5750,4117,4501,3625,4673,4951,6614,4564,4532,3804,4630,3922,4367,4356,4791,4472,3962,3884,4477,5068,4108,4478,4123,6729,5494,4964,5777,4476,3839,4408,5818,6428,3956,4727,4834,5488,5957,6198,6793,5536,4738,3972,7214,4797,4944,6694,4090,4237,5215,4437,4297,5531,5018,4690,4029,6681,4231,6357,3824,6287,4603,5188,3945,4028,3877,5411,6434,4719,5278,4953,6882,4893,4805,5091,5009,4696,3926,4186,3913,3743,4389,6959,4982,4631,3904,5007,4833,5336,4451,4686,4301,4843,4523,3943,3787,4606,4321,3234,4420,3657,4080,3562,3825,5619,5294,4040,6606,4775,3545,3712,5328,6032,3813,4011,4505,5524,6333,5260,4681,5264,4293,4586,4546,4592,4938,5173,4118,4887,4565,4293,4014,5077,5985,4954,4277,4074,5852,6730,6523,4566,3448,3355,5373,5016,4642,4909,4591,7620,4542,4341,5687,4525,6347,3870,4018,3884,5094,5761,4280,4360,3879,4053,4167,3963,5418,5572,4349,4393,5537,5161,6151,6385,3755,4159,5092,5491,4633,7283,4287,3723,3620,3831,4117,4320,4594,4963,3845,5452,3676,4104,4179,5015,4331,3922,4145,6144,4103,4869,4400,3522,6458,10270,4969,4810,4370,7415,6155,3907,4401,3567,4737,4067,7537,4222,7623,4130,5895,5108,5255,3985,5917,4183,5218,5302,8022,3463,4436,4333,3707,5047,3914,4146,4897,3641,5027,4905,5696,4412,5223,4753,4496,4314,8085,5194,4110,4110,4537,4611,3623,5001,4481,4298,5464,4005,4364,7264,3934,4074,4312,4563,5460,4396,4073,3435,3964,3890,4221,4362,6699,4061,3355,4030,4899,4776,5062,3503,5630,5432,5488,3730,6981,5790,5327,4194,3947,7309,5307,3980,5031,5460,4080,3707,3615,4983,5623,3917,4371,5238,5018,4883,3950,4079,4521,3565,4050,3844,3767,3287,3965,8470,3846,4204,7100,3764,6969,5890,3768,4674,3809,4457,3514,4530,4390,4972,4213,6437,4372,5278,3919,6772,4417,3859,5101,4707,5774,4247,5794,4157,4187,4767,4118,5169,3704,3954,6811,4901,5712,5256,5999,4746,6343,3552,4617,5384,4640,3885,4363,5000,4392,5771,6111,4336,3805,4621,4744,5351,4922,5329,4388,3422,4790,4491,6227,5895,4243,4306,4208,4353,3836,4041,4689,3996,4762,4447,3526,4510,5204,5323,4006,7106,4448,3988,6244,4451,7798,5269,4678,3651,5380,7052,5772,4079,9408,4631,4974,4439,3992,4244,4640,4578,5554,8840,4709,3973,4152,5134,3902,6420,5085,6061,4908,4897,6733,4040,4265,6309,6062,6687,4515,3824,5490,8315,6333,3574,6257,6505,7040,3370,4323,4173,3959,3958,4177,5629,3392,3782,7649,4042,7576,4668,5601,5489,3781,4395,3980,3600,4424,3576,4583,9465,4367,4982,4191,5697,4541,4660,5024,4208,4949,4300,4395,4281,5623,5095,3989,4985,5815,4631,4811,7402,4005,5051,4415,3524,7483,4748,5481,3943,6587,3453,4753,4984,4955,4969,7846,4301,4790,5002,4563,5454,4904,4720,4870,4601,3737,6577,4489,4333,3646,4598,4579,7165,4375,5064,4814,4419,5387,5315,4265,4777,4366,5073,5184,5036,5015,4519,4630,4816,4182,5095,4502,4513,4652,3847,5789,6731,4300,4016,4807,5495,4023,4370,4500,3969,3883,5183,4388,4012,9436,4018,4698,5047,3846,5318,4070,3398,3643,5474,4831,3983,4751,3128,5254,3561,6350,3917,5101,6949,4271,3532,7472,4228,6325,3889,4374,4315,5283,4162,6432,6481,4567,5781,5301,4737,4311,3647,4145,3269,6223]},{"counters":[4380,3916,4441,4453,4789,4139,5876,7146,6425,4404,5280,4910,4133,4955,4064,4203,7226,4166,3913,8032,5772,3881,5500,4764,4973,7158,5751,4446,4933,4121,3711,4364,7750,6182,5755,4793,4012,3727,4892,4789,5413,5355,4494,4675,7567,4813,3815,4395,3693,4513,4520,6368,6292,4585,5397,4023,7696,4246,7083,5892,4387,5030,4698,6446,3723,5420,8865,4382,4829,3819,5304,5816,4531,4306,4804,6624,4134,4080,5321,4561,5362,4108,6611,6216,5956,4297,5199,3904,4355,3717,6039,6798,3988,3777,4557,3983,4392,3858,4944,4168,10967,3954,3535,4756,4185,4153,4851,4299,5096,4704,4997,3701,3688,4452,3506,5857,4019,4022,7338,4031,4537,5391,6493,5002,3926,5197,5457,8508,4727,5317,5477,4857,5612,4080,4946,4818,5145,3757,3647,5650,7411,3684,6361,4533,3959,5164,4240,5096,7047,4218,3702,5061,3877,4541,4903,4591,4764,6788,3789,5191,3456,8847,4299,3729,5489,4803,3766,3463,7415,7940,4726,4187,3567,3896,5583,4088,4607,4205,4268,4191,4874,4952,4102,3906,4333,3721,4992,7845,4564,3596,4739,4321,4299,4856,4185,6938,4223,4002,5288,4401,4401,4443,4529,4187,5471,4686,5215,5234,5481,4900,7671,5270,4487,5550,4625,4055,5893,5178,4065,4486,4899,4290,4900,4004,4002,4000,4860,6165,3900,3820,4265,4531,3660,5349,3204,3691,4207,5875,7959,6520,4461,5618,3939,3501,7294,5827,3666,3702,4319,4617,4735,3647,5130,4147,4196,3944,4391,6310,5084,4581,4136,5706,4173,10031,5060,5129,4652,4901,4211,4701,5353,3536,4354,6993,6882,4695,3752,4408,3915,6128,4451,5178,3875,6546,4812,4654,4406,5532,3806,6444,5083,5075,5722,6362,4139,3804,3771,4345,4475,5944,3902,4338,4821,3595,6215,5836,4753,5359,6735,3812,3855,4403,4591,4206,5941,4037,4989,4183,5195,5153,5265,5524,4285,4068,3470,4218,6351,4141,4361,4105,4400,3748,4605,4523,4652,3800,7130,4098,4785,3598,6217,3814,5550,4525,4330,5022,3450,4511,4597,5301,4966,4568,5485,4911,3618,3337,4621,3874,4440,3820,4312,5138,4297,4907,6705,6888,4858,3918,4790,6852,5774,9843,5433,5592,4235,4454,7893,5995,4607,5003,3929,8196,4254,4150,4343,4891,4259,3922,4636,4768,5501,4828,6158,3993,4432,5911,4613,4157,4044,4437,3359,5265,3771,4232,5083,4938,4172,4016,4439,4980,3898,4922,4316,3945,4067,3991,4652,5053,4000,3254,4832,4049,4674,6212,4012,4789,5894,5095,4542,4363,4153,3442,4100,4647,3029,5033,4852,4811,4452,4078,7063,4337,4123,6564,4615,4729,3915,3550,7399,3790,4066,4381,5223,4887,3435,4554,3552,5156,4844,4178,7314,4873,6318,3554,4038,5407,5390,4616,3693,5473,5198,3833,4346,6270,8326,5355,3906,4377,7870,4243,4072,4158,3762,4559,6027,5053,4538,6424,4736,6111,5797,3596,5176,4695,5359,5986,5169,4750,4456,4468,5009,4937,4690,4968,6625,5353,4580,5064,4436,4296,5452,3988,4382,5045,3786,4743,8352,5775,4681,4536,10190,3609,3960,5343,4700,4243,4444,4948,5419,4320,4482,3678,3696,3993,4409,4158,4584,5125,5118,4742,9459,7061,5259,6627,3976,5611,4012,4929,4708,4647,5224,3914,5009,8476,5255,3999,4978,4152,4198,3819,5717,4472,4486,4993,4642,4088,7191,4694,5435,5172,5610,4126,3671,4863,5209,5166,4622,7137,7154,3457,6699,4829,4898,5095,6600,5632,5280,6415,3193,4364,4149,5735,3319,4250,4388,5030,7919,3326,6556,3673,4801,4659,4256,4838,3825,4466,4741,4545,4949,4153,5924,3727,7260,2939,4636,6079,7054,6148,5184,4198,5027,4572,4522,3600,5138,4400,5081,4978,5180,4066,4360,3413,5398,5811,4736,3618,4752,5344,7839,4231,4077,4312,5522,4864,3908,4653,4871,4583,4811,5284,6266,4495,4783,4612,4757,4808,3899,4540,3416,3886,3850,4392,4857,3780,3821,4687,4445,3871,4840,3963,6917,3638,5165,3706,4198,5915,4619,5551,4926,4130,8067,5446,4656,4061,3759,5276,4843,4055,4088,4564,4941,4326,5000,5652,3993,6552,4659,4391,5775,4832,3917,6583,6082,4139,6978,6657,4996,4031,4279,7184,3835,4651,6269,4730,3783,5274,4571,3607,4501,3633,4253,3946,4446,4796,5672,5026,5001,5407,3988,7223,4296,3474,5133,5034,3924,5072,4092,6156,3369,4479,4977,4986,5350,5097,5203,3696,5130,4496,5837,3594,3536,4812,3926,5155,4421,4801,5652,5575,4449,6463,5696,6335,5536,4933,4021,4016,4873,3653,3999,4727,4951,4264,5064,5007,4619,5123,4281,4392,4327,4724,4089,6334,3702,5752,4927,5429,4519,4574,5644,4076,3466,5193,3905,3935,10190,6640,5114,5019,4627,4553,3820,4149,5163,4934,5152,4852,5633,4060,3910,4134,6955,4450,4816,5456,3699,4521,5906,4982,8655,4801,5068,3747,4298,7099,3433,5600,3931,3692,3753,4735,4113,5011,4281,5168,5162,4473,4710,7659,4112,3671,4629,4148,5137,3967,4961,4664,4937,5515,4072,4184,5116,4115,6276,3974,5703,3856,6071,4780,6391,6537,4150,5071,5958,3642,6238,3458,4045,4767,4517,4426,4348,4210,4981,5083,4555,4893,5585,3592,3662,4327,4359,3949,5046,3887,5411,4097,3815,3460,4553,4507,4749,4871,3926,4253,5301,8867,3837,4811,6048,5690,3798,4858,4958,5081,6447,6466,3959,4655,3842,4781,4482,7589,4772,5443,4186,3695,3365,4732,3727,4274,5322,10968,4793,8210,3746,4975,5799,4736,4243,3967,4381,4033,6080,3924,5398,7333,4271,4354,4086,4608,3992,3882,3901,7229,4936,5238,7630,3990,3823,3889,5748,4389,4290,4159,5192,4610,3880,4465,6736,3736,3909,4453,3680,4591,7646,4190,7264,5533,3385,4937,4431,3808,3636,5094,3865,4777,6351,3979,4411,6909,4910,5420,5090,6624,4270,5151,3906,9085,7179,4587,4119,3802,6124,5985,5130,4601,4814,4732,5690,4189,3435,4335,4281,5898,4788,5665,4919,5292,3905,8157,4911,4049,6332,5508,6896,3782,5019,5474,4326,4640,4004,6022,5414,4444,6493,7846,4617,5055,4090,4631,4614,5818,3999,3614,5579,5479,5863,4080,4112,5785,4344,3456,5504,7109,4112,3899,3974,8851,3769,4354,3754,3594,4239,5069,8302,7702,5696,4369,4748,3934,4120,3913,4992,5565,5511,4905,6301,4370,4310,4024,4350,3629,3870,4616,3804,4088,4330,5308,3878,3491,5045,4762,4368,4400,5199,4277,5302,4374,3950,4763,5075,4068,4360,4316,3216,7605,5093,4211,3876,4260,4608,4637,5412,7450,5174,3914,5400,5309,5323,5059,4499,4555,8797,4378,6717,4549,5072,4418,5761,4069,6305,6109,3259,4486,5460,4268,5826,4810,6493,7519,4691,3339,4223,4913,3949,3896,4006,6027,4726,4532,5931,4363,4213,4044,7664,7316,6859,3753,4909,3737,4202,3946,4379,3830,5204,4124,4719,3508,5072,4841,4745,5023,5919,4122,5017,6557,4566,3298,3729,4692,4597,5254,3885,4830,3605,3712,3952,4394,4086,4034,4456,4207,3924,4919,3595,4810,6053,4356,3536,4193,5122,3879,8102,4096,4125,4509,3929,4145,4585,3089,4405,3562,5250,2920,4436,5063,3641,6044,6410,4818,4021,4253,4145,5787,3378,4277,4925,4814,4230,3636,3868,5502,4329,3534,4610,4630,4246,3964,4020,6544,4505,4830,4828,5143,7805,5102,5093,5650,4663,4795,6210,4401,4140,3993,4561,4789,4254,3717,5763,5632,5343,4286,4435,3803,4551,5322,3916,6609,4397,8186,7020,5176,3802,3451,3447,4829,4608,6685,3959,4026,4356,4195,5354,4155,5128,6669,4246,5414,6410,4848,5283,3781,5556,5825,3881,5332,6662,3899,3727,3796,5066,4563,4306,3873,4439,4364,4961,4447,3836,4828,4612,5423,4170,4192,6833,7150,4726,4349,4324,4838,6042,4450,6870,4237,3734,5565,4005,4715,6548,5050,4916,4860,5099,4389,4734,3759,5563,4376,5715,4644,6619,7437,4103,5149,6506,5582,3583,3772,7086,4856,5123,4145,4364,5378,4510,4775,4559,5097,5016,5885,7906,4494,5984,3714,6083,3863,4801,4972,5430,4498,7416,4574,3739,3876,5374,5210,5957,4222,4989,3980,3900,6900,4810,5502,4761,4641,6823,5022,3612,4320,4191,4258,3571,4623,5183,5619,5167,4228,7388,5766,5762,4824,4758,4498,5867,4626,3696,4113,4194,4448,5318,3940,5701,6038,3698,3824,4206,4600,5042,4577,4592,4467,6645,3705,4812,3864,4567,5238,4242,4123,5354,7063,4130,4566,4867,6212,4238,4099,5099,3874,4159,4901,5962,6770,4709,4811,3181,3330,5722,4889,3949,4747,4699,4815,6043,5543,4771,4889,5378,4406,4288,5678,4075,3867,4728,5358,4464,5124,3783,5588,4880,3741,6484,5945,7538,7026,5770,4203,5949,4793,4078,3651,4751,3808,3235,6071,4137,3953,5104,6876,5401,5577,3514,4652,5627,4728,5210,5254,3807,4973,3978,5581,5467,4689,2935,4569,6428,3724,3446,5988,4564,4113,6851,5487,5242,4899,5819,4768,3756,4270,4788,4445,7961,6253,3787,4334,6960,5647,4949,5572,6895,4936,6660,4137,3494,4404,4576,4184,4182,4189,4533,4421,3451,4913,4877,4602,4496,5242,6471,4738,4415,4254,3687,4600,3988,6203,3656,4378,4079,4499,5258,5626,4998,5494,4386,5228,6059,4580,4670,6572,4749,5534,4401,5585,4399,4756,6244,4255,6842,4553,3739,6056,5506,6980,4435,4676,7908,8327,3872,4379,5031,4189,4873,3739,4769,4355,4488,3735,4137,4088,3901,4471,5703,6020,4589,6675,7522,3814,5837,4876,5284,4237,3840,3763,5275,4064,4196,5170,5060,4178,4554,4557,3869,4311,7426,5093,4481,6279,4856,5849,4681,3753,5353,4154,5117,5067,3867,6293,4789,4118,7338,5731,3825,4626,8140,3974,3486,5407,3988,3964,4496,4569,4367,4753,3922,3849,3843,3923,3842,4005,3835,6280,3883,4110,5336,4724,4991,3946,4770,4598,3816,3990,7994,4463,4543,5193,3778,3909,4192,5292,6809,5780,3489,6431,4210,7468,4692,4365,4929,4024,5774,4383,4571,4303,4567,3885,5075,4929,5175,4339,5263,4631,6482,4201,3861,5412,5533,3218,5152,4712,3967,4024,4760,3260,5711,4635,4275,4770,4949,5921,7119,4102,3816,4068,5310,5624,3792,4574,5511,4241,4519,3869,5118,5039,4503,3947,7930,4028,4294,5741,4328,4434,5549,3360,6102,4167,4363,5025,3903,7431,4820,4224,5233,4894,4087,5493,4829,3654,7929,5416,4891,4291,4864,4990,5242,7508,4215,5819,6091,7293,4778,7445,5774,3369,4533,4161,6615,4946,6032,5340,5195,4451,4476,4777,4815,9941,4114,4914,3222,7556,3446,4791,4655,7645,3700,7476,6466,4646,3697,10970,3905,5990,6381,4867,4871,4945,5068,4785,4849,5417,8723,5420,3877,5896,4323,5045,3958,5020,4214,7395,4373,3579,4582,4237,4048,4314,5976,3659,4903,3342,4752,3871,4361,7295,4675,5173,5528,5346,4338,8753,4009,7418,6249,4063,4094,3642,4261,5528,5806,5407,4180,4906,4321,4345,4793,5969,5620,4350,3747,5358,4077,7202,5525,5192,4962,4250,5225,3474,5904,3830,5073,4033,4316,3747,4062,8074,5532,3297,4069,4608,4201,5002,3934,5051,4175,8762,4455,4605,5089,3453,4605,5816,4705,4030,3937,4866,4322,4050,3514,5185,3960,4659,3912,5293,4889,4880,3605,3967,4885,4839,4769,3466,7017,3977,6601,3641,5960,3441,4750,3659,4475,6003,4297,4246,5369,5482,4033,4408,4282,4463,4827,4095,4126,3787,4598,3510,4310,4043,4179,5915,4856,5040,4964,8519,3868,6438,5943,5250,4541,4163,4271,5216,4117,5700,3890,4526,4196,6104,4790,4277,3900,4867,4824,6098,4475,3407,3824,4139,6234,4187,3818,5123,3842,4659,3987,4385,4223,4029,4696,4123,7755,5405,4804,5865,4428,3841,5370,4607,6607,3593,4958,5788,4045,4046,3860,5443,5062,5478,4133,5011,4704,4652,4345,3628,5451,3915,4549,5601,3860,5278,4661,4615,4385,5402,3541,4289,6719,4012,5732,4547,6103,3823,3653,5678,5634,5397,5839,5487,3258,5104,5734,4020,4462,4256,4678,5696,4632,4144,4678,4222,4485,4588,3914,4943,7279,5528,4625,3981,4605,6032,4397,3999,4724,7184,4548,4275,3711,8338]},{"counters":[5474,3862,4969,4716,5204,7163,4073,5298,4618,4392,4169,4154,5264,5197,3791,4427,4474,4625,3812,4559,3835,3989,5490,4426,5040,4140,4010,6406,4487,6738,4035,4722,5133,4740,6306,6172,4728,3710,7199,6476,4862,3867,5118,4380,3739,4495,3414,4501,4719,4084,4435,4625,4237,4921,6756,4096,5490,7088,4847,3751,4167,4836,3777,5294,5382,5078,4916,4287,3619,5247,8178,6823,4943,4933,4871,3724,4728,5055,5245,4206,4108,6191,5443,4692,4829,4625,3622,9671,4012,4646,5051,3358,4650,4520,4142,6399,4528,5427,3729,4562,4368,3641,7400,9284,5529,4201,5402,4941,4352,6527,3865,5597,10632,4316,4757,3729,6724,4003,3742,6364,5323,3842,3919,3665,4343,9073,4705,5171,9106,4076,4805,6161,5651,6587,4027,5707,4732,4327,5078,3858,6135,5545,5285,3943,6535,5650,4538,6904,4503,4570,4140,4783,4604,5548,5085,3780,3605,3678,8031,4005,5395,3554,4904,5152,6495,5413,4533,6230,4593,4268,4696,3850,4956,4255,5077,4921,4038,4169,3924,6718,4669,5197,5448,7026,7065,4785,6607,4477,4025,5650,3635,4754,5315,4728,6721,4227,7676,6404,4198,3739,4255,4260,4534,4666,6803,7939,4741,4250,3609,7914,5979,5136,5469,5637,4099,5100,7252,4268,4774,4548,4828,4073,3833,5185,5949,4290,4643,4417,4638,4260,4145,3764,5253,3654,4343,4899,3623,3755,8965,6670,4287,5075,4483,3974,4765,4654,6608,4185,3336,5175,3719,4253,4163,4102,5320,4517,4932,4331,4707,5147,5546,5122,4466,4292,5462,4710,3882,4558,4908,3631,4097,7138,4611,5428,3439,4588,4819,6699,5662,4210,4394,5113,4043,9011,4211,4376,4674,3873,4807,6170,3866,3717,5157,4588,4787,5495,4199,4765,4967,4332,5121,4255,5515,4058,4458,5997,5224,6625,5389,3837,3804,5266,5145,4619,3703,5275,4144,5441,4266,4052,5152,4916,5091,4304,4426,7170,4655,5260,4640,5074,3691,5884,4848,4213,5191,6387,4084,4423,7179,4465,4136,4638,5687,5990,4695,5608,5119,3633,4418,3575,4053,4346,4745,6448,3859,4173,4941,3296,7216,4777,4329,4591,5655,3848,5012,4935,5072,6504,4134,3477,6481,5691,7630,9285,3494,4883,5751,5985,3371,5604,7192,3753,4497,4396,4240,5060,4312,4606,3926,3731,5148,3832,4181,5194,4752,7015,5494,4949,3881,5245,4817,3835,4707,4052,3440,6565,4799,4755,6955,4841,7927,4571,4078,8177,3651,4792,5361,4679,7094,6601,4352,4853,6846,3854,4705,4792,4202,4521,7266,4530,3861,5493,4583,7840,4246,5402,4227,6293,4304,3907,6587,4350,3579,4391,4053,5806,4579,3502,3974,4045,3826,3726,3540,4316,7408,3850,4378,3833,5700,3516,9850,4785,4128,6020,6620,3940,3853,4321,3723,3751,4449,3573,4266,4861,5664,4569,3888,5909,4517,7776,4680,4767,3920,4666,5428,3988,4262,4275,3577,4365,5312,5276,5130,5317,3860,3507,5304,4218,4307,4361,4263,4674,4574,3811,3305,6180,6355,6093,5836,4250,5919,5160,3982,6399,4510,4056,3664,9530,3767,3572,6611,5345,4385,4298,4509,4092,3327,4280,3840,3821,4904,6483,6205,3718,5238,4203,4788,6016,4095,5800,4885,3845,3314,4795,5403,4450,4351,4996,3703,7795,4224,4834,3617,3432,4122,3491,4725,4588,5116,5719,4035,4519,5534,4384,4111,4127,4972,3880,4597,5313,4237,6756,4218,5651,4286,4289,4069,4149,3599,3559,4255,4360,4804,6240,6681,4226,4582,4157,6888,3628,4101,5208,4283,6103,4090,5017,3475,4540,3968,4722,6527,3429,3938,4921,4413,7710,8037,4876,4552,6031,3963,4863,4867,4333,3351,4078,4106,4713,5132,3490,3685,5017,7952,4240,5301,4153,4838,4088,4823,5329,8645,3875,4288,4801,3454,6634,4933,3935,5170,5468,4887,4058,5079,5364,5767,3961,3825,3837,5131,7053,3585,4095,4932,5903,4220,3613,3776,7757,4515,4038,3838,5299,5495,7101,3949,4172,4589,3663,8457,3709,5871,5352,3422,5027,3550,4791,4794,3715,3798,4493,3486,4395,5338,3709,5312,4419,9183,3940,4971,5808,3738,3823,5508,3511,4086,4840,4277,4157,4132,5335,3503,3248,4193,5480,3648,4134,8439,4233,3910,4745,3705,4336,6766,8941,3853,5110,5341,4702,5791,5069,4145,3787,4164,4219,3659,4349,5330,5513,5587,4384,7217,4000,4428,3818,6805,6327,5391,3979,4831,3895,7334,4935,5092,3281,5034,4658,7778,4471,3053,3481,5716,10820,4147,4628,3788,7580,4772,5263,5610,4381,4609,3805,4404,4042,4128,4149,4387,4585,3873,5554,6745,4142,3894,3609,4428,7804,3920,4112,5100,4157,5482,4605,4807,4875,5633,5457,4355,4497,4338,5889,4067,8160,4098,5069,5944,4700,4285,5303,4654,4609,4433,4497,5115,3669,3766,4032,4955,4580,4654,6938,3551,6898,4957,4093,3816,5138,3600,3994,6798,4294,4558,4287,4437,4644,5127,5908,3862,4458,4243,3850,4466,4766,8791,4370,3997,5474,4448,4262,5486,4525,4786,5075,3938,4268,5440,6500,5513,5444,4508,4315,4190,4150,8254,5036,3506,7421,5857,8536,4628,4186,9159,4968,4522,4214,5922,5390,5194,4502,4737,4357,3693,6581,3900,4888,4577,5586,4000,5605,5360,4462,4152,3021,4050,4731,5039,3916,4809,4966,6133,6897,4633,4484,3303,5233,4632,3766,4630,6607,3999,4075,4548,4093,3661,4869,4564,5018,4429,4455,4377,5796,4426,5148,3467,4187,3666,6323,3786,4205,6164,5266,6336,5175,4256,6744,7086,4776,3848,3673,3817,3679,5464,4387,4588,4774,4126,4190,6244,4221,6357,4245,5067,4234,3511,4854,8374,4272,6501,4462,3955,5994,4134,5267,4461,6813,4457,4448,4312,4522,4663,3905,6985,4558,4194,4261,3995,4577,4483,5137,5714,6139,7192,4308,6284,4471,6114,5275,4373,5356,4196,5056,5444,4526,5003,3925,4019,8473,3914,5637,4167,8755,4151,4415,4725,5625,4185,4192,4286,5152,5459,4510,4534,3536,9359,5891,4045,4314,4539,4925,4908,4622,4500,5687,8126,5351,5501,4295,3793,6043,6207,4753,4121,3883,3481,5240,4937,5417,3919,4133,4032,3892,5350,4346,5130,3934,4270,6145,4356,5223,4550,6714,4543,4108,3512,6518,4020,5913,6624,6573,3110,4755,3857,5752,5254,4287,4536,6195,3632,3214,5213,4081,3949,4960,7175,5389,4252,4175,6026,5698,4897,3585,3415,3933,5224,4318,5114,6013,5076,7196,4890,4312,4466,6447,3922,5533,3536,4586,4893,4762,4598,4580,4311,4550,4995,4354,5304,4145,4191,3260,3933,4758,5182,5417,3597,7187,5459,4521,4809,4458,4555,3944,3767,3905,4188,5213,6259,4576,6768,4137,3887,3626,4559,5939,4601,6566,4666,5070,4717,8263,3715,4927,4357,4772,5978,5169,6848,5303,3980,6909,3598,4399,6513,4441,4331,3989,4314,5140,5104,4822,4430,4349,3264,4214,5434,5902,6054,4897,4192,4867,4128,3452,4358,5336,4796,3996,6183,4473,4890,4631,6125,4284,3819,7657,4896,5076,4149,6630,3986,4606,3673,4328,5106,4031,4935,3846,3628,5089,3536,3856,5130,5016,4587,5119,3472,5037,3780,5962,6209,4157,4198,3990,5735,4840,4967,5762,5610,3878,5127,3954,3760,7079,3779,4600,4151,4850,6443,4303,4686,4300,4562,5041,4685,4165,5519,4063,5164,5961,4054,3958,6499,3988,5223,6283,6730,5044,5203,4919,7000,4869,3558,4836,4088,3922,4222,4221,4047,3625,4168,5084,6208,4932,5183,4560,5265,3918,4228,4645,6665,5445,5774,4387,4511,4588,5203,5965,4137,7939,5189,6175,3971,4754,4747,5630,5338,3999,3711,4373,5374,5636,6252,3372,3758,3686,4583,3502,5038,4652,6008,6887,4756,5413,6473,6027,3708,3868,3822,2943,5298,3731,4580,3921,9875,3978,3625,5440,6547,4904,4951,7336,3770,5721,4994,5076,4570,5271,3845,4760,3611,4495,4279,3698,3713,4036,5089,3580,3722,10951,3775,4810,4099,4653,6840,7379,4843,3481,4772,5100,3846,4822,4205,4934,9005,6667,3814,5083,4353,3680,3605,4109,4245,5120,4524,4979,5398,4911,6455,6041,5143,4797,8006,5283,4747,5375,6100,3909,6695,4467,5528,5183,4898,4558,6345,3581,4433,6358,8205,5658,4651,4587,4710,6125,3333,3586,4568,4110,4224,4582,7623,4557,4482,6401,4694,4527,3813,4131,3948,5149,4616,4145,3641,5349,4336,3725,4456,4702,5917,4553,5306,5474,4467,3747,4091,5116,5574,4160,5524,4852,4073,5125,4193,10987,4231,4572,4225,4268,4858,4902,5259,3696,5378,4134,4403,5833,3698,5053,4323,5024,5173,3804,4977,3832,4612,5082,3546,3785,4381,4751,4990,7221,4812,4816,4005,5636,5035,4154,3271,4489,5462,6281,3037,4377,3772,5776,4179,4516,5169,4412,5926,4906,4192,4727,4113,3541,3489,3346,4172,3411,3895,7300,4594,4754,4007,4944,4366,5942,4736,4250,6247,4036,3543,8060,4928,5748,7584,3694,4642,3331,5020,3916,5212,4476,5242,3790,5658,4215,7205,4438,4327,5375,5511,4174,4006,5118,4698,4101,6880,3611,4810,7010,4864,4448,3510,4158,3939,4911,3760,7788,5137,4424,5698,6796,9429,5494,4283,9922,4656,5094,8293,4646,3838,4657,4532,3587,4391,4300,4099,4576,5237,3647,5767,4774,4274,4358,6101,4838,4542,4370,5439,5119,3836,4164,4419,4824,4739,4112,5243,6748,4009,4687,4281,5546,4212,3295,4285,3895,6122,5647,5003,4211,4552,4985,4517,4528,5204,6131,6094,4917,4806,3501,6591,4277,4536,4954,4209,3880,4024,4597,5808,4511,4579,5218,4970,4442,4553,3203,4705,4468,4550,3919,4205,4566,4293,3596,10034,4100,6037,5045,4422,5215,6640,4541,3624,4701,4121,4704,4008,5187,4959,5239,4505,4672,3976,5622,4204,3411,4976,5400,4367,3765,5057,4237,4140,3992,4039,3865,5104,4068,4375,4792,4162,5957,4220,4349,5307,4541,4817,7427,4436,5541,4287,3793,4355,5109,3572,5872,4600,5221,4005,5687,3886,4072,4546,4331,4817,5496,5767,5742,4426,4869,4617,3543,4448,5193,5924,2915,3749,4728,3888,3837,11237,4246,7288,4919,3830,5942,5912,3128,6180,4470,4220,6033,3992,5838,3430,3676,6386,5360,4622,3988,6011,4974,4240,3852,3344,4338,5181,5664,5234,5443,4515,5213,4623,3306,10648,3710,4439,4190,5488,3943,4382,5587,3989,3999,5070,4747,4935,4980,4228,4135,4968,4146,5108,6246,5009,4085,4660,5807,5248,4936,4098,3874,4669,4722,4140,4278,4814,4851,5186,4594,3827,3595,5731,3538,3520,4510,5855,4234,6980,5818,3924,5382,6285,6302,4650,3615,6285,3738,4610,3984,7247,3215,4069,3972,7798,4785,4383,9250,4897,4844,5141,5585,3780,5860,5456,3660,4063,5763,4527,4192,7776,5157,3572,4750,4066,4904,3615,4223,4267,3980,4798,6076,4286,5085,4099,3470,7312,7013,4083,3699,3186,4497,4554,5763,4409,4721,4328,3757,4412,3831,8256,7596,3832,4968,7493,3255,4478,4064,4208,4374,3845,4386,4774,4745,7044,6246,5713,3740,4463,8152,3970,5797,5432,4105,3443,4056,4845,4807,6510,5224,6107,3617,3860,4228,5020,4652,5565,6091,5484,4737,3865,5848,3325,3834,7254,4190,3246,5937,5613,5007,4558,4738,3803,3828,4703,4255,7511,7496,5209,6596,4733,4049,5431,4903,4719,4743,3537,4470,5476,7296,4420,8500,7119,4240,5490,3940,4054,3483,3806,4517,3746,4988,3675,4043,4656,4065,4693,3972,4537,3889,4945,5868,5646,4934,6690,4245,5279,4770,5306,4834,5490,5866,5053,3793,5280,3389,4216,4919,7758,7657,5383,3981,4776,4097,4956,5291,4504,4812,3949,5617,4315,3775,4289,4169,4778,4596,5568,4965,3758,4113,4144,4894,5750,4601,6789,3924,4200,4629,4624,4129,4210,4191,4098,5221,4589,4179,3742,5836,3969,4840,7699,4852,4889,5347,5949,8684,4620,3777,4436,4532,3973,4688,4170,4666,4559,3348,5059,4121,3665,4769,3903,4516,3790,5047,3528,3345,4939,4955,3800,4562,7959,6660,5081,4935,4223,4510,3814,5703,4304,4787,5493,4909,6223,4480,4999,5008,4853,4734,4357,5092,3838,4594,3361,5893,3716,3911,6700,5522,5668,5186,4645,6064,4470,4644,5559,6234,6994,3529,6540,6722]},{"counters":[5622,4634,5397,3559,4081,7197,5124,4144,4605,6000,4056,4399,3191,4468,5501,4078,5465,5355,5033,4350,4941,4070,3937,6433,3991,4460,4104,4981,3959,4346,3717,7454,7331,6104,4782,5725,7510,3912,5353,5228,5136,4248,4167,4862,3808,4122,5777,4951,3617,3824,4545,4493,4496,5287,4504,5568,4418,3666,5288,5165,5121,6673,5495,5857,4340,4775,6821,4696,5972,4939,4645,4726,6446,4894,5335,5784,3723,3843,6570,3678,3999,5248,5355,4718,4907,4051,6367,4305,4519,3992,3484,4580,3313,5554,4684,4339,9270,3754,4531,4089,4729,4679,4224,4137,4639,5419,3787,6358,6154,3088,4370,4062,4240,4009,4939,4384,3801,4579,4133,4476,6434,5388,4194,3979,6029,7671,5526,4672,4843,4059,4038,3767,3168,3931,3544,3965,4492,6824,3830,5302,6881,4525,6563,3889,6137,4856,3286,3756,4203,4944,4212,4169,7696,4505,4704,6719,4848,4330,3918,3889,5002,4560,4053,3757,4557,3844,4516,5001,5673,4518,4272,5257,5438,5349,3733,4171,4758,4631,4818,4558,4530,4200,7595,3899,4257,5077,4242,4306,3530,3598,4777,3842,5053,4129,4417,5828,4479,3845,5674,7138,5681,5398,5385,4720,3805,4348,4702,8769,3408,5431,3920,3947,3273,3958,4488,3900,6370,4098,3843,5671,4252,4468,4811,7988,6778,3283,5108,6897,4616,3884,4790,5092,4412,3838,4902,3789,8082,4228,4975,5100,3972,4400,4328,3390,6183,4985,5405,5410,5155,4350,3835,4932,4454,4383,4722,3915,3603,4599,4627,4300,4227,4213,6215,3317,3551,4255,4047,3641,4173,7477,6300,4418,3434,3858,4336,5364,5365,6973,7749,6672,6543,3918,4942,3487,5381,3989,4097,3913,5146,7177,3903,4078,4598,4501,4367,3988,4023,6254,3285,3847,4718,3766,3863,4316,5209,4383,4226,4357,4687,5812,4070,4310,4643,4931,4416,4960,4227,5408,4904,5425,4942,4940,7960,3182,4422,4641,3438,6199,4928,6974,7000,4874,4231,4070,5273,5281,4020,4079,3955,3807,3694,5943,3832,4197,4575,4613,3884,6549,4383,9017,3953,4802,4934,5047,4505,9583,5206,4990,4795,6290,3404,3827,4657,4332,4486,3684,4431,4894,5081,4781,3883,3909,4830,5596,6017,3914,3589,7504,5157,5661,5414,4720,7323,5110,4505,4829,3916,8332,5098,4364,4164,6855,6372,5538,3293,6749,5091,4624,4104,4643,3720,3731,4216,3523,4658,4911,4235,5117,6754,4488,5915,4802,5435,4106,5278,6587,4792,4450,3799,3625,6835,5688,4102,4096,4866,5335,4746,6811,4537,3876,6773,7439,7646,4222,3862,4042,3737,5754,6553,4827,4948,4567,3638,4548,5225,4319,4316,3652,4385,4698,4980,3559,3592,7137,9939,5850,5817,4723,5755,4342,5097,4744,3996,5035,4415,4526,5387,5155,5548,4018,4873,3979,4336,5770,7577,4638,4445,7569,4946,3745,3925,5179,4082,4257,4468,5413,4809,4214,4269,3862,4257,6402,4103,3912,6318,5267,4658,4540,4134,4252,3811,5739,4330,4129,4949,4597,4879,4601,5110,6798,7374,5805,5409,3582,9527,5048,4460,4443,4637,6993,4822,4516,7719,4796,7555,3975,3190,3723,5491,4322,4495,7375,4038,4200,7811,4029,6559,4022,4500,3702,3978,3916,7088,4818,5612,6583,4906,4591,3907,5005,7078,5203,8736,4332,3988,4058,3769,4484,6007,4063,4277,4713,5291,4333,4170,4107,3571,3966,4766,5965,4020,4840,4486,7019,4323,4852,4724,5437,4520,5156,4305,4665,6435,4614,4525,3298,6342,7624,4235,4296,5805,4204,4028,4111,7252,4372,4004,7566,4097,4229,4295,4398,4340,3741,4201,3700,4681,3808,4342,4392,6324,4095,4565,4388,4545,4402,3904,8195,5610,5049,4514,4261,5313,4336,4604,3699,4705,3566,7042,5818,4476,4470,7674,4222,4094,9122,5433,4320,4615,4055,3700,4532,5704,4693,4701,5295,4502,6640,4434,4374,4702,5632,3785,6605,5184,9017,6053,3844,4339,5298,4347,6627,4331,3886,4319,3556,4652,4159,5120,5964,5028,3873,4530,7673,5633,4912,4357,4753,4612,4944,4135,3326,4421,3598,5232,4598,5252,6807,4241,6114,4366,6230,6072,4324,5044,5236,6091,4010,4240,5269,5489,4464,5536,9215,7027,8591,3693,3791,4714,3688,4478,4343,5678,4281,7374,4841,3512,3903,5094,6027,4483,4911,4693,4526,4286,3822,4968,4090,4205,3792,4349,4390,4172,6308,6218,6866,4773,4574,4374,3692,5091,4171,3806,6904,4010,4732,4497,4256,5735,4578,3953,6827,3804,7357,5896,4427,4297,4311,4867,4422,5723,3848,4487,4853,4236,4964,4709,4847,3226,4384,5450,6898,4452,5778,7771,3697,3456,3690,4056,3521,8892,3840,4350,7537,5351,5951,6111,3516,4479,5722,3648,4821,4292,4314,3745,3955,5131,3583,4334,3757,4244,4236,7187,5529,3706,5640,4266,4414,5119,4735,9703,4756,4224,4197,5187,4562,4939,9601,3779,3618,5009,6197,4217,5731,4344,5631,6531,10040,4690,3610,4478,4376,4142,6022,6460,3973,4085,3580,5308,4490,4790,5763,5942,4321,4746,6470,5160,3851,7604,4365,4288,5063,3818,5630,3861,4261,4399,4020,6756,5301,4320,9358,6996,3959,5636,4496,5727,5138,3836,4448,4281,5450,5027,4556,4894,4305,4209,4585,4730,4141,3849,3790,3847,4764,7728,5483,4242,3839,8078,4447,4361,4737,7146,5903,6063,5829,4949,3843,5939,5505,4539,4420,3491,6281,4629,4773,3713,4804,10205,5298,7502,4816,4757,3607,3981,4668,8047,4377,4080,5160,3375,5796,4160,5881,4414,3924,4750,4800,5431,4284,4009,5885,3978,3723,4223,4893,6130,6240,4460,4556,3913,5914,4132,4776,4062,3718,4083,3924,8782,5536,4855,4584,4409,5634,6028,4873,7104,4214,5187,3705,3507,5646,5695,3860,4976,3438,6172,4424,3870,3430,4569,4647,5995,5747,6510,3808,5113,4763,4347,4049,5165,3798,5319,5716,4372,5408,9258,5338,4945,5684,3853,4471,4598,4750,4616,8039,4236,8610,4957,9119,4434,4177,5040,4185,4036,6551,4531,4085,5295,5242,5355,5549,4070,5302,7879,5263,4375,4797,4594,3878,4602,5120,4658,4964,5880,4247,3784,5562,5426,6777,5197,4222,5226,3424,5531,3668,6211,4389,5618,4154,6292,4762,4793,3805,7648,4200,4728,4174,6711,4403,5104,4737,4837,4145,5522,4120,4926,4247,3615,5990,5298,4130,4964,4485,4038,3684,3978,4221,4588,3626,3377,3711,3820,5668,3697,4872,4794,5167,4623,3457,4575,5215,4731,4007,4060,4752,4707,4565,4157,5009,4081,4623,3731,4138,3787,4274,3775,4886,5121,8157,6087,4303,4070,4540,6520,6266,4504,3785,3943,4483,4513,4345,6860,4341,3730,5422,4271,3548,4257,4589,4543,5162,4339,3935,4685,3827,7313,4599,7067,3812,4481,6435,5676,3932,3808,5127,4789,5284,4599,4164,4225,4391,4571,4014,4741,4770,4114,4256,3158,5485,3434,5371,8176,5803,5052,4836,4151,5834,5437,6305,7830,5125,4062,4842,5775,5050,5168,4579,4094,4510,4204,3728,4716,4321,3434,3980,5139,7140,4023,4011,4577,5029,4826,3558,4025,5022,3972,4351,4786,4980,3967,4490,5133,6769,7840,5687,4356,4782,5685,3771,5740,5038,3727,5291,4222,5086,4605,3964,6245,5778,4594,4252,4996,4426,7388,6676,4243,5455,3845,3574,3897,4098,4096,4113,5774,4079,5240,4186,4415,5233,6985,4431,4175,5226,3861,4573,6784,6329,3880,4275,3776,3583,3885,3603,5481,9435,3919,4403,4073,3958,7329,9008,6058,5071,4882,3806,6170,3681,4000,5064,4142,4847,4246,5069,7972,4537,5814,4576,5027,4538,5842,3653,4691,4319,4151,3978,6290,3978,7637,4160,4793,3568,5658,5775,4710,3880,4379,4187,5597,5888,3521,3542,4887,5082,4505,5116,4885,5817,5439,5749,6036,6332,6680,4358,5948,5430,4359,5270,6160,4296,5257,4467,5227,3702,4480,8116,4696,4584,4399,3822,5183,4402,3255,7654,4584,5554,4578,4373,5146,5356,4282,5383,4945,4978,3936,6107,4354,4270,5441,7232,6484,4988,5303,4325,5079,5356,3869,4310,4276,3677,4852,7172,4877,6773,7057,4044,4308,4890,5801,4431,4650,4307,5581,3878,3838,5220,5298,4211,6240,3874,3845,3456,5111,4422,5022,5578,4435,6958,5147,4618,5927,5016,5144,5290,4450,3861,4022,4319,6666,5028,4804,3841,5313,4937,7529,4217,3976,5564,3874,4630,3959,8918,6666,4017,4454,4266,5633,4582,5558,4762,5615,5860,5166,6280,4926,5732,3886,4513,4205,4249,3720,5174,3719,4065,4796,4211,3761,3532,3762,7361,5693,4010,6632,4488,5441,5063,4802,4786,5119,4615,6448,4521,5279,4258,6321,4360,4194,4406,4507,5563,4806,4919,4566,3924,3311,4909,6899,4404,4359,4569,5556,4064,3863,4810,3734,4755,4813,4159,4141,5742,6043,5050,5422,4926,4748,3704,5255,3604,5258,4538,5930,3920,4762,3909,7477,5784,4353,5348,3319,4670,3555,4582,4405,3990,3975,4270,4271,6315,6670,4167,6725,4308,6159,4443,6160,5301,4301,5969,4311,3998,4092,4594,4082,5860,4989,6187,4287,4557,3987,4563,3864,3967,3257,4454,7698,5132,4405,4311,4370,4784,5106,5251,4408,4826,3942,4749,4661,7233,5026,3736,5150,5440,3544,5122,6982,4254,3583,4987,5265,5619,4361,3742,4292,4507,4699,4512,5470,5160,4327,4241,6391,4139,7089,3871,4164,3714,4419,4088,4579,5220,3708,3704,6394,4272,5335,3571,4818,3766,4308,4033,4971,4070,7272,3735,3544,4689,4237,6977,4992,3561,4535,4704,5032,3956,4765,5040,4421,3709,4344,4571,3537,4843,4323,3996,4189,5458,3952,4686,4076,4341,4143,6049,4689,3125,4555,4281,3863,3435,4579,3781,4720,5508,3865,6345,4471,6115,6246,5706,4679,4719,5503,7330,5040,6740,4726,4614,3799,5271,4493,4602,4891,4077,6154,5280,4326,4852,4996,4102,5002,4254,3944,4713,4733,3741,3844,4801,4547,4942,3971,9659,4428,4057,4412,4160,3466,4670,4423,4251,4039,4157,5078,5403,3973,7433,5410,3531,5025,4652,5515,4256,4655,6728,3940,4426,4066,8027,4406,4707,4386,4181,4016,5909,5698,3829,3790,4170,4119,3601,3686,3840,5516,5988,4198,4050,5619,4329,4151,8132,3683,4903,3474,5025,4391,4342,5373,4438,4522,4955,3673,5079,4750,4727,5613,4527,4969,4009,5314,4282,5786,4535,4891,4561,4517,5524,4584,6091,4499,4302,5054,4659,5809,6243,3608,5060,5893,4151,3608,8693,3696,4781,5381,5136,6412,3773,4999,5700,3765,5039,4227,5308,3791,7680,5417,6671,4475,5890,4225,4920,4453,5648,4136,5805,3838,3903,6456,4419,4581,4164,5133,8798,4323,5202,5478,4270,4125,4082,5447,4085,4645,4238,9591,7612,3865,5301,4979,5375,4123,4117,4922,5353,4313,4945,9177,4095,4653,4536,4000,4400,4095,5067,3895,4596,4608,4114,5645,5671,4353,4047,5245,3897,4619,4272,4749,5320,5298,4263,4577,5089,5377,4037,5462,4091,5171,3575,5850,5274,6786,3371,4517,4944,7140,3956,3964,3394,4500,3837,5570,4617,4174,3570,5189,4322,3788,10125,4131,4389,4641,4793,3552,5065,4764,5720,5042,3517,4049,5295,5452,6051,3741,3360,5214,4131,3802,4311,5722,4128,4899,4859,5424,3970,4360,3744,6215,5182,4728,3956,7490,5605,5056,4116,4022,6153,4723,8083,3948,4779,3588,4256,4590,3759,4545,4775,4505,4425,3847,5353,2945,4723,6187,3802,8006,4744,3581,4271,4930,4554,4223,4339,4057,4124,3459,5008,3725,4673,4575,7188,5316,4901,4044,4399,4725,4445,4454,5795,4990,4010,5177,4410,8194,4663,5861,4762,4183,5901,4384,4416,4000,4073,5577,5238,4311,5120,5028,3726,3275,5908,6261,3925,4462,4703,4799,8094,4495,5142,4578,4959,4339,4707,6445,4382,6009,4541,5648,4837,4652,4327,4001,5032,4903,3903,5124,4593,6059,3696,5010,4068,3925,3664,4819,3990,4511,5073,3863,3779,6884,4047,5027,4264,5069,3952,3941,5269,4914,3815,3908,5164,5346,3634,4523,3455,5164,4533,6794,5383,4775,4201,3694,4217,5979,8448,4967,5234,4467,4152,4285,10491,4152,5975,5546,4229,4965,4928,4312,3665,4067,4368,6524,4775,4727,5659,3591,4968,6821,4546,3502,7094,4683,4572]}]},"null_count":0,"tot_col_size":154979692,"last_update_version":401695327860817922},"p_container":{"histogram":{"ndv":40,"buckets":[{"count":268000,"lower_bound":"SlVNQk8gQkFH","upper_bound":"SlVNQk8gQkFH","repeats":268000},{"count":510000,"lower_bound":"SlVNQk8gQk9Y","upper_bound":"SlVNQk8gQk9Y","repeats":242000},{"count":771000,"lower_bound":"SlVNQk8gQ0FO","upper_bound":"SlVNQk8gQ0FO","repeats":261000},{"count":1044000,"lower_bound":"SlVNQk8gQ0FTRQ==","upper_bound":"SlVNQk8gQ0FTRQ==","repeats":273000},{"count":1295000,"lower_bound":"SlVNQk8gRFJVTQ==","upper_bound":"SlVNQk8gRFJVTQ==","repeats":251000},{"count":1535000,"lower_bound":"SlVNQk8gSkFS","upper_bound":"SlVNQk8gSkFS","repeats":240000},{"count":1810000,"lower_bound":"SlVNQk8gUEFDSw==","upper_bound":"SlVNQk8gUEFDSw==","repeats":275000},{"count":2054000,"lower_bound":"SlVNQk8gUEtH","upper_bound":"SlVNQk8gUEtH","repeats":244000},{"count":2315000,"lower_bound":"TEcgQkFH","upper_bound":"TEcgQkFH","repeats":261000},{"count":2560000,"lower_bound":"TEcgQk9Y","upper_bound":"TEcgQk9Y","repeats":245000},{"count":2835000,"lower_bound":"TEcgQ0FO","upper_bound":"TEcgQ0FO","repeats":275000},{"count":3081000,"lower_bound":"TEcgQ0FTRQ==","upper_bound":"TEcgQ0FTRQ==","repeats":246000},{"count":3341000,"lower_bound":"TEcgRFJVTQ==","upper_bound":"TEcgRFJVTQ==","repeats":260000},{"count":3570000,"lower_bound":"TEcgSkFS","upper_bound":"TEcgSkFS","repeats":229000},{"count":3808000,"lower_bound":"TEcgUEFDSw==","upper_bound":"TEcgUEFDSw==","repeats":238000},{"count":4034000,"lower_bound":"TEcgUEtH","upper_bound":"TEcgUEtH","repeats":226000},{"count":4276000,"lower_bound":"TUVEIEJBRw==","upper_bound":"TUVEIEJBRw==","repeats":242000},{"count":4518000,"lower_bound":"TUVEIEJPWA==","upper_bound":"TUVEIEJPWA==","repeats":242000},{"count":4762000,"lower_bound":"TUVEIENBTg==","upper_bound":"TUVEIENBTg==","repeats":244000},{"count":4994000,"lower_bound":"TUVEIENBU0U=","upper_bound":"TUVEIENBU0U=","repeats":232000},{"count":5224000,"lower_bound":"TUVEIERSVU0=","upper_bound":"TUVEIERSVU0=","repeats":230000},{"count":5454000,"lower_bound":"TUVEIEpBUg==","upper_bound":"TUVEIEpBUg==","repeats":230000},{"count":5718000,"lower_bound":"TUVEIFBBQ0s=","upper_bound":"TUVEIFBBQ0s=","repeats":264000},{"count":5968000,"lower_bound":"TUVEIFBLRw==","upper_bound":"TUVEIFBLRw==","repeats":250000},{"count":6208000,"lower_bound":"U00gQkFH","upper_bound":"U00gQkFH","repeats":240000},{"count":6443000,"lower_bound":"U00gQk9Y","upper_bound":"U00gQk9Y","repeats":235000},{"count":6701000,"lower_bound":"U00gQ0FO","upper_bound":"U00gQ0FO","repeats":258000},{"count":6952000,"lower_bound":"U00gQ0FTRQ==","upper_bound":"U00gQ0FTRQ==","repeats":251000},{"count":7196000,"lower_bound":"U00gRFJVTQ==","upper_bound":"U00gRFJVTQ==","repeats":244000},{"count":7441000,"lower_bound":"U00gSkFS","upper_bound":"U00gSkFS","repeats":245000},{"count":7693000,"lower_bound":"U00gUEFDSw==","upper_bound":"U00gUEFDSw==","repeats":252000},{"count":7953000,"lower_bound":"U00gUEtH","upper_bound":"U00gUEtH","repeats":260000},{"count":8194000,"lower_bound":"V1JBUCBCQUc=","upper_bound":"V1JBUCBCQUc=","repeats":241000},{"count":8430000,"lower_bound":"V1JBUCBCT1g=","upper_bound":"V1JBUCBCT1g=","repeats":236000},{"count":8705000,"lower_bound":"V1JBUCBDQU4=","upper_bound":"V1JBUCBDQU4=","repeats":275000},{"count":8991000,"lower_bound":"V1JBUCBDQVNF","upper_bound":"V1JBUCBDQVNF","repeats":286000},{"count":9249000,"lower_bound":"V1JBUCBEUlVN","upper_bound":"V1JBUCBEUlVN","repeats":258000},{"count":9498000,"lower_bound":"V1JBUCBKQVI=","upper_bound":"V1JBUCBKQVI=","repeats":249000},{"count":9732000,"lower_bound":"V1JBUCBQQUNL","upper_bound":"V1JBUCBQQUNL","repeats":234000},{"count":10000000,"lower_bound":"V1JBUCBQS0c=","upper_bound":"V1JBUCBQS0c=","repeats":268000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,249745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249596,0,0,0,0,0,0,0,249282,0,0,0,0,0,0,0,0,0,250544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249903,0,0,0,0,0,0,0,0,0,250610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250135,0,0,0,0,0,0,0,0,0,0,250312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250667,0,0,0,249393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249793,0,0,0,0,0,0,0,0,0,0,0,0,0,249947,250270,0,249240,0,0,0,0,0,0,0,0,0,0,0,250183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249961,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249963,0,0,0,0,0,0,0,0,0,249749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250667,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249903,0,0,0,0,250221,0,0,0,0,0,249742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249947,0,0,0,0,0,0,0,0,0,0,250098,249745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249793,0,0,0,0,0,0,0,0,250500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249346,0,0,0,0,0,0,0,0,0,0,250586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249440,0,0,0,0,0,0,0,0,0,0,0,0,0,249789,0,0,0,0,0,0,0,0,0,0,0,0,0,250010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250610,0,0,0,0,0,0,249146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251037,0,0,0,0,0,0,0,0,0,0,0,0,0,249961,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249833,0,0,0,0,0,0,250312,0,249393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250298,0,0,0,0,249663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[250667,0,0,0,0,0,0,0,0,0,0,0,0,249789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249961,0,0,0,0,0,0,0,0,0,0,0,0,250200,0,0,0,0,0,0,0,0,0,0,0,0,0,249742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249903,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250571,0,0,0,0,0,0,0,0,0,0,0,0,250098,0,0,0,0,0,0,0,0,0,249663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249721,0,0,0,0,0,0,0,0,0,0,0,249440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250610,0,0,249282,0,0,0,0,0,0,0,0,250183,0,0,0,0,0,0,250135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250298,0,0,0,0,0,0,0,0,250500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249947,0,0,0,0,0,0,0,0,250270,250544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249393,0,0,0,249596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249240,0,0,0,0,0,0,0,0,0,0,0,0,0,250312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250010,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250939,0,0,0,0,0,0,0,0,0,0,0,0,249963,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249207,0,0,0,0,0,0,0,0,249903,0,0,0,250532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249721,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249146,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249947,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250298,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250015,0,0,0,0,0,0,0,500335,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249745,0,0,0,0,0,0,0,0,0,249793,0,0,0,0,250010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249961,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249789,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250667,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250500,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249903,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251037,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249282,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249961,0,0,0,0,0,249146,0,0,0,0,0,0,0,0,0,0,0,0,250586,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250298,0,0,0,0,0,0,0,0,0,249663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249789,0,0,0,0,0,0,0,0,249793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250571,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250500,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249393,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249346,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249440,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250098,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249963,0,0,0,0,0,0,0,0,0,0,0,0,0,250544,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250939,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250183,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249596,0,0,0,0,250312,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250532,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249813,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250667,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,250015,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249745,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249749,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249207,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249947,0,0,0,0,0,0,0,0,0,0,0,0,0,249721,0,0,250270,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":95750204,"last_update_version":401695327834603522},"p_mfgr":{"histogram":{"ndv":5,"buckets":[{"count":2004000,"lower_bound":"TWFudWZhY3R1cmVyIzE=","upper_bound":"TWFudWZhY3R1cmVyIzE=","repeats":2004000},{"count":4028000,"lower_bound":"TWFudWZhY3R1cmVyIzI=","upper_bound":"TWFudWZhY3R1cmVyIzI=","repeats":2024000},{"count":6018000,"lower_bound":"TWFudWZhY3R1cmVyIzM=","upper_bound":"TWFudWZhY3R1cmVyIzM=","repeats":1990000},{"count":7987000,"lower_bound":"TWFudWZhY3R1cmVyIzQ=","upper_bound":"TWFudWZhY3R1cmVyIzQ=","repeats":1969000},{"count":10000000,"lower_bound":"TWFudWZhY3R1cmVyIzU=","upper_bound":"TWFudWZhY3R1cmVyIzU=","repeats":2013000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,2000035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000035,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2000776,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999995,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999343,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1999851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":160000000,"last_update_version":401695327782174721},"p_name":{"histogram":{"ndv":10000000,"buckets":[{"count":40000,"lower_bound":"YWxtb25kIGFudGlxdWUgY2hhcnRyZXVzZSB5ZWxsb3cgY29ybnNpbGs=","upper_bound":"YWxtb25kIG1pZG5pZ2h0IHNreSBzYWRkbGUgY2hhcnRyZXVzZQ==","repeats":1},{"count":80000,"lower_bound":"YWxtb25kIG1pbnQgY29yYWwgbWFnZW50YSBsaWdodA==","upper_bound":"YWxtb25kIHNub3cgc21va2UgdGFuIHBlYWNo","repeats":1},{"count":120000,"lower_bound":"YWxtb25kIHNub3cgd2hlYXQgcGVydSBtZWRpdW0=","upper_bound":"YW50aXF1ZSBkYXJrIGJsdXNoIGJpc3F1ZSBpbmRpYW4=","repeats":1},{"count":160000,"lower_bound":"YW50aXF1ZSBkYXJrIGxpbmVuIGJyb3duIGluZGlhbg==","upper_bound":"YW50aXF1ZSBuYXZ5IGdob3N0IGZpcmVicmljayBsYXdu","repeats":1},{"count":200000,"lower_bound":"YW50aXF1ZSBuYXZ5IG5hdmFqbyBkZWVwIGRpbQ==","upper_bound":"YXF1YW1hcmluZSBhbnRpcXVlIGFsbW9uZCBnb2xkZW5yb2QgYnVybmlzaGVk","repeats":1},{"count":240000,"lower_bound":"YXF1YW1hcmluZSBhbnRpcXVlIG1vY2Nhc2luIG1hcm9vbiBpdm9yeQ==","upper_bound":"YXF1YW1hcmluZSBob25leWRldyBicm93biBibHVlIGxpbmVu","repeats":1},{"count":280000,"lower_bound":"YXF1YW1hcmluZSBob25leWRldyBmaXJlYnJpY2sgZ2hvc3QgbGluZW4=","upper_bound":"YXF1YW1hcmluZSByb3lhbCBtb2NjYXNpbiBwYXBheWEgdGhpc3RsZQ==","repeats":1},{"count":320000,"lower_bound":"YXF1YW1hcmluZSBzYWRkbGUgZGFyayBicm93biBwbHVt","upper_bound":"YXp1cmUgYnVybHl3b29kIHBsdW0gaG9uZXlkZXcgY29ybnNpbGs=","repeats":1},{"count":360000,"lower_bound":"YXp1cmUgYnVybHl3b29kIHNtb2tlIGFsbW9uZCBzbGF0ZQ==","upper_bound":"YXp1cmUgbGF2ZW5kZXIgaG90IGxhd24gdHVycXVvaXNl","repeats":1},{"count":400000,"lower_bound":"YXp1cmUgbGF3biBjaG9jb2xhdGUgbGF2ZW5kZXIgZG9kZ2Vy","upper_bound":"YXp1cmUgcmVkIHBhbGUgY29ybnNpbGsgcGFwYXlh","repeats":1},{"count":440000,"lower_bound":"YXp1cmUgcm9zZSBncmV5IGxhdmVuZGVyIHZpb2xldA==","upper_bound":"YmVpZ2UgYXF1YW1hcmluZSB2aW9sZXQgYmx1ZSBmb3Jlc3Q=","repeats":1},{"count":480000,"lower_bound":"YmVpZ2UgYXp1cmUgbW9jY2FzaW4gYW50aXF1ZSBuYXZham8=","upper_bound":"YmVpZ2UgZ3JlZW4gZHJhYiBsYXduIHNhZGRsZQ==","repeats":1},{"count":520000,"lower_bound":"YmVpZ2UgZ3JleSBidXJseXdvb2Qgcm9zZSBzbGF0ZQ==","upper_bound":"YmVpZ2Ugb3JhbmdlIGdvbGRlbnJvZCBtaW50IGxpbmVu","repeats":1},{"count":560000,"lower_bound":"YmVpZ2Ugb3JhbmdlIGl2b3J5IGxhd24gbGFjZQ==","upper_bound":"YmlzcXVlIGFsbW9uZCB0b21hdG8gaG90IG9yY2hpZA==","repeats":1},{"count":600000,"lower_bound":"YmlzcXVlIGFudGlxdWUgbW9jY2FzaW4gbWludCBtYXJvb24=","upper_bound":"YmlzcXVlIGdyZXkgd2hlYXQgY3JlYW0gcGluaw==","repeats":1},{"count":640000,"lower_bound":"YmlzcXVlIGhvdCBjb3Juc2lsayBjb3JuZmxvd2VyIGxhdmVuZGVy","upper_bound":"YmlzcXVlIHNhZGRsZSBhbG1vbmQgZGFyayBtaXN0eQ==","repeats":1},{"count":680000,"lower_bound":"YmlzcXVlIHNhZGRsZSBsZW1vbiBsYWNlIHR1cnF1b2lzZQ==","upper_bound":"YmxhY2sgY29ybnNpbGsgc2FkZGxlIG1pZG5pZ2h0IG1hcm9vbg==","repeats":1},{"count":720000,"lower_bound":"YmxhY2sgY3JlYW0gYnVybmlzaGVkIGNvcm5mbG93ZXIgcmVk","upper_bound":"YmxhY2sgbWlzdHkgc2FsbW9uIGFsbW9uZCBmbG9yYWw=","repeats":1},{"count":760000,"lower_bound":"YmxhY2sgbW9jY2FzaW4gbWV0YWxsaWMgc21va2UgcGx1bQ==","upper_bound":"YmxhY2sgc21va2UgbGlnaHQgZ2FpbnNib3JvIGFsbW9uZA==","repeats":1},{"count":800000,"lower_bound":"YmxhY2sgc25vdyBibHVzaCBhbnRpcXVlIHBpbms=","upper_bound":"YmxhbmNoZWQgY2hpZmZvbiBhbnRpcXVlIHBlYWNoIGZyb3N0ZWQ=","repeats":1},{"count":840000,"lower_bound":"YmxhbmNoZWQgY2hpZmZvbiBiaXNxdWUgc2FkZGxlIGxpbmVu","upper_bound":"YmxhbmNoZWQgbWFyb29uIHNsYXRlIHBhbGUgcG93ZGVy","repeats":1},{"count":880000,"lower_bound":"YmxhbmNoZWQgbWVkaXVtIGNoYXJ0cmV1c2UgcGVydSBidXJseXdvb2Q=","upper_bound":"YmxhbmNoZWQgc3RlZWwgaW5kaWFuIGNvcmFsIHBsdW0=","repeats":1},{"count":920000,"lower_bound":"YmxhbmNoZWQgc3RlZWwgbWFnZW50YSBwZXJ1IHZpb2xldA==","upper_bound":"Ymx1ZSBkcmFiIHNtb2tlIHNlYXNoZWxsIGJsYW5jaGVk","repeats":1},{"count":960000,"lower_bound":"Ymx1ZSBmaXJlYnJpY2sgcm9zeSByb3NlIG1hcm9vbg==","upper_bound":"Ymx1ZSBuYXZ5IG9saXZlIGFudGlxdWUgYmlzcXVl","repeats":1},{"count":1000000,"lower_bound":"Ymx1ZSBuYXZ5IHNub3cgZnJvc3RlZCBsYXZlbmRlcg==","upper_bound":"Ymx1ZSB3aGVhdCByb3N5IGN5YW4gcGVydQ==","repeats":1},{"count":1040000,"lower_bound":"Ymx1ZSB3aGVhdCBzYWxtb24gc3ByaW5nIGdob3N0","upper_bound":"Ymx1c2ggZnJvc3RlZCBwZWFjaCBibGFuY2hlZCBzYW5keQ==","repeats":1},{"count":1080000,"lower_bound":"Ymx1c2ggZ2hvc3QgZ3JlZW4gc3ByaW5nIG1ldGFsbGlj","upper_bound":"Ymx1c2ggcGx1bSBob25leWRldyBhbnRpcXVlIHdoZWF0","repeats":1},{"count":1120000,"lower_bound":"Ymx1c2ggcGx1bSBob25leWRldyBvcmNoaWQgZ2hvc3Q=","upper_bound":"YnJvd24gYmlzcXVlIHBsdW0gZmxvcmFsIGNyZWFt","repeats":1},{"count":1160000,"lower_bound":"YnJvd24gYmlzcXVlIHJveWFsIG1hZ2VudGEgcGFwYXlh","upper_bound":"YnJvd24ga2hha2kgYWxtb25kIGhvdCBiaXNxdWU=","repeats":1},{"count":1200000,"lower_bound":"YnJvd24ga2hha2kgbGF3biBncmV5IGxpbmVu","upper_bound":"YnJvd24gcGx1bSBkcmFiIHNreSBkaW0=","repeats":1},{"count":1240000,"lower_bound":"YnJvd24gcGx1bSBuYXZham8gc2Vhc2hlbGwgbWludA==","upper_bound":"YnVybHl3b29kIGJsYWNrIGRlZXAgdG9tYXRvIGJpc3F1ZQ==","repeats":1},{"count":1280000,"lower_bound":"YnVybHl3b29kIGJsYW5jaGVkIGF6dXJlIGJlaWdlIGJpc3F1ZQ==","upper_bound":"YnVybHl3b29kIGtoYWtpIHNreSBob25leWRldyBwYWxl","repeats":1},{"count":1320000,"lower_bound":"YnVybHl3b29kIGxhY2UgZ3JlZW4gcGFwYXlhIGF6dXJl","upper_bound":"YnVybHl3b29kIHJvc2UgZG9kZ2VyIGxhd24gcHVmZg==","repeats":1},{"count":1360000,"lower_bound":"YnVybHl3b29kIHJvc3kgbWlkbmlnaHQgY2hhcnRyZXVzZSBjcmVhbQ==","upper_bound":"YnVybmlzaGVkIGFsbW9uZCByZWQgbGlnaHQgc25vdw==","repeats":1},{"count":1400000,"lower_bound":"YnVybmlzaGVkIGFudGlxdWUgYnJvd24gY29yYWwgaXZvcnk=","upper_bound":"YnVybmlzaGVkIGhvdCByb3NlIGNoYXJ0cmV1c2UgYnJvd24=","repeats":1},{"count":1440000,"lower_bound":"YnVybmlzaGVkIGtoYWtpIGxpZ2h0IGluZGlhbiBob25leWRldw==","upper_bound":"YnVybmlzaGVkIHB1cnBsZSB0b21hdG8gZGVlcCBtZWRpdW0=","repeats":1},{"count":1480000,"lower_bound":"YnVybmlzaGVkIHJlZCBkb2RnZXIgZ2FpbnNib3JvIHNhbmR5","upper_bound":"Y2hhcnRyZXVzZSBjb3Juc2lsayBvcmFuZ2Ugc3ByaW5nIGJlaWdl","repeats":1},{"count":1520000,"lower_bound":"Y2hhcnRyZXVzZSBjb3Juc2lsayBzYWRkbGUgYWxtb25kIGJsYW5jaGVk","upper_bound":"Y2hhcnRyZXVzZSBuYXZham8gc2FsbW9uIHJveWFsIGJpc3F1ZQ==","repeats":1},{"count":1560000,"lower_bound":"Y2hhcnRyZXVzZSBuYXZ5IHJvc2UgZ3JlZW4gYnVybHl3b29k","upper_bound":"Y2hhcnRyZXVzZSB3aGVhdCBvcmFuZ2UgbGluZW4gc2FuZHk=","repeats":1},{"count":1600000,"lower_bound":"Y2hhcnRyZXVzZSB3aGVhdCBzZWFzaGVsbCBwb3dkZXIgZGVlcA==","upper_bound":"Y2hpZmZvbiBmcm9zdGVkIHllbGxvdyBsaW1lIGRpbQ==","repeats":1},{"count":1640000,"lower_bound":"Y2hpZmZvbiBnYWluc2Jvcm8gaG90IHZpb2xldCBidXJuaXNoZWQ=","upper_bound":"Y2hpZmZvbiBwb3dkZXIgbGF2ZW5kZXIgcm95YWwgbWV0YWxsaWM=","repeats":1},{"count":1680000,"lower_bound":"Y2hpZmZvbiBwb3dkZXIgbW9jY2FzaW4gdHVycXVvaXNlIGRvZGdlcg==","upper_bound":"Y2hvY29sYXRlIGNvcmFsIGJpc3F1ZSBzaWVubmEgYnVybmlzaGVk","repeats":1},{"count":1720000,"lower_bound":"Y2hvY29sYXRlIGNvcm5mbG93ZXIgc2llbm5hIHBpbmsgcGFwYXlh","upper_bound":"Y2hvY29sYXRlIG1ldGFsbGljIGFudGlxdWUgYXp1cmUgd2hpdGU=","repeats":1},{"count":1760000,"lower_bound":"Y2hvY29sYXRlIG1ldGFsbGljIHJveWFsIGZpcmVicmljayBjb3JuZmxvd2Vy","upper_bound":"Y2hvY29sYXRlIHNreSBjcmVhbSBvcmNoaWQgZGFyaw==","repeats":1},{"count":1800000,"lower_bound":"Y2hvY29sYXRlIHNsYXRlIHNtb2tlIGJsdXNoIHBpbms=","upper_bound":"Y29yYWwgZm9yZXN0IHBsdW0gbGF3biB3aGVhdA==","repeats":1},{"count":1840000,"lower_bound":"Y29yYWwgZ2FpbnNib3JvIG9yYW5nZSBzYWRkbGUgY29ybnNpbGs=","upper_bound":"Y29yYWwgcGFwYXlhIGRvZGdlciBvcmNoaWQgYnVybmlzaGVk","repeats":1},{"count":1880000,"lower_bound":"Y29yYWwgcGFwYXlhIG1hcm9vbiBjb3JuZmxvd2VyIGtoYWtp","upper_bound":"Y29ybmZsb3dlciBiaXNxdWUgbGlnaHQgbWVkaXVtIGF6dXJl","repeats":1},{"count":1920000,"lower_bound":"Y29ybmZsb3dlciBibGFjayBkZWVwIGxhd24gcGVydQ==","upper_bound":"Y29ybmZsb3dlciBraGFraSBzaWVubmEgcGVhY2ggd2hlYXQ=","repeats":1},{"count":1960000,"lower_bound":"Y29ybmZsb3dlciBsYXZlbmRlciBwZXJ1IGFxdWFtYXJpbmUgdGFu","upper_bound":"Y29ybmZsb3dlciBzZWFzaGVsbCBob3Qgcm9zZSBmbG9yYWw=","repeats":1},{"count":2000000,"lower_bound":"Y29ybmZsb3dlciBzZWFzaGVsbCBwYWxlIGdyZXkgbWFnZW50YQ==","upper_bound":"Y29ybnNpbGsgYnJvd24gbWVkaXVtIGdob3N0IHBpbms=","repeats":1},{"count":2040000,"lower_bound":"Y29ybnNpbGsgYnJvd24gbWVkaXVtIHllbGxvdyBhenVyZQ==","upper_bound":"Y29ybnNpbGsgbGFjZSBwZXJ1IGNob2NvbGF0ZSBuYXZ5","repeats":1},{"count":2080000,"lower_bound":"Y29ybnNpbGsgbGF3biBhbnRpcXVlIGJyb3duIHJvc2U=","upper_bound":"Y29ybnNpbGsgcm9zeSBzYWRkbGUgbmF2eSBiaXNxdWU=","repeats":1},{"count":2120000,"lower_bound":"Y29ybnNpbGsgcm95YWwgc3ByaW5nIGxpZ2h0IGxhY2U=","upper_bound":"Y3JlYW0gY29yYWwgYW50aXF1ZSBzcHJpbmcgaG9uZXlkZXc=","repeats":1},{"count":2160000,"lower_bound":"Y3JlYW0gY29ybmZsb3dlciBjb3Juc2lsayBjaG9jb2xhdGUgc21va2U=","upper_bound":"Y3JlYW0ga2hha2kgc2llbm5hIGZyb3N0ZWQgdHVycXVvaXNl","repeats":1},{"count":2200000,"lower_bound":"Y3JlYW0gbGF2ZW5kZXIgbGF3biBncmV5IHNhbmR5","upper_bound":"Y3JlYW0gc2llbm5hIGN5YW4gc2FuZHkgcHVmZg==","repeats":1},{"count":2240000,"lower_bound":"Y3JlYW0gc2t5IGJlaWdlIGl2b3J5IHJveWFs","upper_bound":"Y3lhbiBjb3JuZmxvd2VyIG5hdmFqbyBtYWdlbnRhIGZpcmVicmljaw==","repeats":1},{"count":2280000,"lower_bound":"Y3lhbiBjb3JuZmxvd2VyIHB1cnBsZSB0aGlzdGxlIG1hcm9vbg==","upper_bound":"Y3lhbiBtYXJvb24gYXF1YW1hcmluZSBmcm9zdGVkIHJvc2U=","repeats":1},{"count":2320000,"lower_bound":"Y3lhbiBtYXJvb24gZ3JleSBzYWxtb24gc2FuZHk=","upper_bound":"Y3lhbiBza3kgZGVlcCBjaGFydHJldXNlIHBsdW0=","repeats":1},{"count":2360000,"lower_bound":"Y3lhbiBzbGF0ZSBsaW1lIHJlZCBncmVlbg==","upper_bound":"ZGFyayBjb3Juc2lsayByb3N5IGdyZXkgc2t5","repeats":1},{"count":2400000,"lower_bound":"ZGFyayBjb3Juc2lsayBzaWVubmEgbGlnaHQgbWFyb29u","upper_bound":"ZGFyayBtZXRhbGxpYyBjaGFydHJldXNlIGJ1cmx5d29vZCBob3Q=","repeats":1},{"count":2440000,"lower_bound":"ZGFyayBtZXRhbGxpYyBmaXJlYnJpY2sgY2hhcnRyZXVzZSBzaWVubmE=","upper_bound":"ZGFyayBzdGVlbCB5ZWxsb3cgbGltZSBzYW5keQ==","repeats":1},{"count":2480000,"lower_bound":"ZGFyayB0YW4gY29yYWwgaG9uZXlkZXcgbGFjZQ==","upper_bound":"ZGVlcCBkYXJrIHBhbGUgbWlkbmlnaHQgbGlnaHQ=","repeats":1},{"count":2520000,"lower_bound":"ZGVlcCBkb2RnZXIgbWlkbmlnaHQgZGFyayBhenVyZQ==","upper_bound":"ZGVlcCBtb2NjYXNpbiBjb3JuZmxvd2VyIGRvZGdlciBtYWdlbnRh","repeats":1},{"count":2560000,"lower_bound":"ZGVlcCBtb2NjYXNpbiBjcmVhbSBjb3Juc2lsayBvbGl2ZQ==","upper_bound":"ZGVlcCB0b21hdG8gc2t5IHdoaXRlIHNhbmR5","repeats":1},{"count":2600000,"lower_bound":"ZGVlcCB2aW9sZXQgdGFuIHNlYXNoZWxsIHllbGxvdw==","upper_bound":"ZGltIGRvZGdlciBjaG9jb2xhdGUgbWludCBjb3JuZmxvd2Vy","repeats":1},{"count":2640000,"lower_bound":"ZGltIGRvZGdlciBwbHVtIGNob2NvbGF0ZSBzYWxtb24=","upper_bound":"ZGltIG1pbnQgZGFyayBvcmFuZ2UgYXp1cmU=","repeats":1},{"count":2680000,"lower_bound":"ZGltIG1pbnQgcm9zZSBsYXZlbmRlciBncmVlbg==","upper_bound":"ZGltIHR1cnF1b2lzZSBiZWlnZSBibHVzaCBhcXVhbWFyaW5l","repeats":1},{"count":2720000,"lower_bound":"ZGltIHdoZWF0IG5hdnkgc2FuZHkgc2xhdGU=","upper_bound":"ZG9kZ2VyIGZyb3N0ZWQgZ29sZGVucm9kIGNyZWFtIG9yY2hpZA==","repeats":1},{"count":2760000,"lower_bound":"ZG9kZ2VyIGdyZWVuIHdoZWF0IHBhcGF5YSBibHVzaA==","upper_bound":"ZG9kZ2VyIHJvc3kgcm9zZSBtYWdlbnRhIHRvbWF0bw==","repeats":1},{"count":2800000,"lower_bound":"ZG9kZ2VyIHJveWFsIGNyZWFtIGJsYW5jaGVkIGhvdA==","upper_bound":"ZHJhYiBjb3JuZmxvd2VyIGZyb3N0ZWQgcGx1bSB0YW4=","repeats":1},{"count":2840000,"lower_bound":"ZHJhYiBjb3Juc2lsayBibHVlIGJpc3F1ZSBjeWFu","upper_bound":"ZHJhYiBtYXJvb24gcGx1bSB2aW9sZXQgbW9jY2FzaW4=","repeats":1},{"count":2880000,"lower_bound":"ZHJhYiBtZWRpdW0gdGhpc3RsZSBicm93biByb3N5","upper_bound":"ZHJhYiBzbm93IGxpZ2h0IGJyb3duIGxhd24=","repeats":1},{"count":2920000,"lower_bound":"ZHJhYiBzcHJpbmcgYmlzcXVlIGNyZWFtIGJlaWdl","upper_bound":"ZmlyZWJyaWNrIGNoYXJ0cmV1c2UgaXZvcnkgcGFsZSBkaW0=","repeats":1},{"count":2960000,"lower_bound":"ZmlyZWJyaWNrIGNob2NvbGF0ZSBwbHVtIG9saXZlIHBhbGU=","upper_bound":"ZmlyZWJyaWNrIG1pc3R5IGNoYXJ0cmV1c2UgbWFyb29uIGZyb3N0ZWQ=","repeats":1},{"count":3000000,"lower_bound":"ZmlyZWJyaWNrIG1pc3R5IGZsb3JhbCBsaW5lbiBsYXZlbmRlcg==","upper_bound":"ZmlyZWJyaWNrIHNwcmluZyBhbnRpcXVlIGRlZXAgYXp1cmU=","repeats":1},{"count":3040000,"lower_bound":"ZmlyZWJyaWNrIHNwcmluZyBob3QgZ3JleSBmcm9zdGVk","upper_bound":"ZmxvcmFsIGRhcmsgcGVhY2ggeWVsbG93IGxlbW9u","repeats":1},{"count":3080000,"lower_bound":"ZmxvcmFsIGRhcmsgc2Vhc2hlbGwgZnJvc3RlZCBsaW5lbg==","upper_bound":"ZmxvcmFsIG1pZG5pZ2h0IGF6dXJlIGxpbmVuIGNvcmFs","repeats":1},{"count":3120000,"lower_bound":"ZmxvcmFsIG1pZG5pZ2h0IG1lZGl1bSBncmV5IGZyb3N0ZWQ=","upper_bound":"ZmxvcmFsIHR1cnF1b2lzZSBnb2xkZW5yb2QgcGVydSByb3Nl","repeats":1},{"count":3160000,"lower_bound":"ZmxvcmFsIHR1cnF1b2lzZSBvcmNoaWQgZmlyZWJyaWNrIGNoYXJ0cmV1c2U=","upper_bound":"Zm9yZXN0IGRvZGdlciBvcmFuZ2UgbmF2eSBza3k=","repeats":1},{"count":3200000,"lower_bound":"Zm9yZXN0IGRyYWIgcGFsZSBwbHVtIHJveWFs","upper_bound":"Zm9yZXN0IHBhcGF5YSBtaWRuaWdodCBzbGF0ZSB0aGlzdGxl","repeats":1},{"count":3240000,"lower_bound":"Zm9yZXN0IHBhcGF5YSBtaW50IGRyYWIgcG93ZGVy","upper_bound":"Zm9yZXN0IHRoaXN0bGUgb3JjaGlkIHNreSBjb3Juc2lsaw==","repeats":1},{"count":3280000,"lower_bound":"Zm9yZXN0IHR1cnF1b2lzZSB0aGlzdGxlIGtoYWtpIG1hZ2VudGE=","upper_bound":"ZnJvc3RlZCBmbG9yYWwgY2hvY29sYXRlIHBpbmsgb3JjaGlk","repeats":1},{"count":3320000,"lower_bound":"ZnJvc3RlZCBmbG9yYWwgZ29sZGVucm9kIGxlbW9uIHN0ZWVs","upper_bound":"ZnJvc3RlZCByZWQgbGVtb24gc2t5IGJpc3F1ZQ==","repeats":1},{"count":3360000,"lower_bound":"ZnJvc3RlZCByb3NlIHRvbWF0byBicm93biBzbGF0ZQ==","upper_bound":"Z2FpbnNib3JvIGNob2NvbGF0ZSBjeWFuIGFudGlxdWUgbGF2ZW5kZXI=","repeats":1},{"count":3400000,"lower_bound":"Z2FpbnNib3JvIGNvcm5mbG93ZXIgc2FuZHkgbWludCBzcHJpbmc=","upper_bound":"Z2FpbnNib3JvIG1ldGFsbGljIHNsYXRlIHdoZWF0IGJsdXNo","repeats":1},{"count":3440000,"lower_bound":"Z2FpbnNib3JvIG1pZG5pZ2h0IHNhbmR5IHJvc2UgbWlzdHk=","upper_bound":"Z2FpbnNib3JvIHN0ZWVsIGFudGlxdWUgdGFuIGxpbWU=","repeats":1},{"count":3480000,"lower_bound":"Z2FpbnNib3JvIHRhbiBzYWxtb24gbGltZSBidXJuaXNoZWQ=","upper_bound":"Z2hvc3QgZGVlcCBuYXZham8gbWVkaXVtIGRvZGdlcg==","repeats":1},{"count":3520000,"lower_bound":"Z2hvc3QgZG9kZ2VyIGNyZWFtIGxhY2Ugb2xpdmU=","upper_bound":"Z2hvc3Qgb3JjaGlkIHNwcmluZyBpbmRpYW4gYnVybHl3b29k","repeats":1},{"count":3560000,"lower_bound":"Z2hvc3QgcGFsZSBncmVlbiBvcmFuZ2Ugb2xpdmU=","upper_bound":"Z2hvc3QgeWVsbG93IHdoaXRlIHBhbGUgZGFyaw==","repeats":1},{"count":3600000,"lower_bound":"Z29sZGVucm9kIGFsbW9uZCBzYWRkbGUgaXZvcnkgZmxvcmFs","upper_bound":"Z29sZGVucm9kIGdob3N0IHJlZCBjb3Juc2lsayBjb3JhbA==","repeats":1},{"count":3640000,"lower_bound":"Z29sZGVucm9kIGdyZWVuIG1pZG5pZ2h0IHJvc2Ugc2FsbW9u","upper_bound":"Z29sZGVucm9kIHBhcGF5YSBnaG9zdCBjeWFuIHN0ZWVs","repeats":1},{"count":3680000,"lower_bound":"Z29sZGVucm9kIHBhcGF5YSBsaW5lbiBzZWFzaGVsbCBibHVzaA==","upper_bound":"Z3JlZW4gYmVpZ2UgYWxtb25kIGJpc3F1ZSBmb3Jlc3Q=","repeats":1},{"count":3720000,"lower_bound":"Z3JlZW4gYmVpZ2UgZGVlcCBsYXduIGdyZXk=","upper_bound":"Z3JlZW4gbGF2ZW5kZXIgc25vdyBidXJseXdvb2QgY2hpZmZvbg==","repeats":1},{"count":3760000,"lower_bound":"Z3JlZW4gbGVtb24gZ29sZGVucm9kIHN0ZWVsIHNhZGRsZQ==","upper_bound":"Z3JlZW4gc21va2UgdHVycXVvaXNlIGRvZGdlciBidXJseXdvb2Q=","repeats":1},{"count":3800000,"lower_bound":"Z3JlZW4gc25vdyBkaW0gcmVkIGFsbW9uZA==","upper_bound":"Z3JleSBkZWVwIGtoYWtpIGNyZWFtIGZsb3JhbA==","repeats":1},{"count":3840000,"lower_bound":"Z3JleSBkZWVwIHN0ZWVsIG1pZG5pZ2h0IGZyb3N0ZWQ=","upper_bound":"Z3JleSBtb2NjYXNpbiBkZWVwIGxhd24gbGFjZQ==","repeats":1},{"count":3880000,"lower_bound":"Z3JleSBtb2NjYXNpbiBwYXBheWEgZHJhYiBtYXJvb24=","upper_bound":"Z3JleSBzdGVlbCB0aGlzdGxlIGxhdmVuZGVyIG9yY2hpZA==","repeats":1},{"count":3920000,"lower_bound":"Z3JleSB0YW4gZHJhYiBnb2xkZW5yb2QgaW5kaWFu","upper_bound":"aG9uZXlkZXcgZmxvcmFsIGRlZXAgY29yYWwga2hha2k=","repeats":1},{"count":3960000,"lower_bound":"aG9uZXlkZXcgZmxvcmFsIG9yY2hpZCBkYXJrIG1pbnQ=","upper_bound":"aG9uZXlkZXcgcGFwYXlhIGdob3N0IGdyZWVuIHNwcmluZw==","repeats":1},{"count":4000000,"lower_bound":"aG9uZXlkZXcgcGVhY2ggc2FuZHkgbWV0YWxsaWMgYnVybmlzaGVk","upper_bound":"aG90IGJsYWNrIG9yYW5nZSBjaGlmZm9uIGtoYWtp","repeats":1},{"count":4040000,"lower_bound":"aG90IGJsYWNrIHN0ZWVsIGNoYXJ0cmV1c2UgY29ybmZsb3dlcg==","upper_bound":"aG90IGxpZ2h0IG5hdmFqbyBtZXRhbGxpYyBkaW0=","repeats":1},{"count":4080000,"lower_bound":"aG90IGxpbWUga2hha2kgZmxvcmFsIHllbGxvdw==","upper_bound":"aG90IHNreSBnYWluc2Jvcm8gY3lhbiB0dXJxdW9pc2U=","repeats":1},{"count":4120000,"lower_bound":"aG90IHNsYXRlIGhvbmV5ZGV3IGRvZGdlciBzcHJpbmc=","upper_bound":"aW5kaWFuIGJyb3duIGNvcm5zaWxrIHBvd2RlciBhbG1vbmQ=","repeats":1},{"count":4160000,"lower_bound":"aW5kaWFuIGJyb3duIGhvdCBtaWRuaWdodCBjb3Juc2lsaw==","upper_bound":"aW5kaWFuIGxlbW9uIGZpcmVicmljayBzZWFzaGVsbCBjeWFu","repeats":1},{"count":4200000,"lower_bound":"aW5kaWFuIGxpZ2h0IGhvdCBtaWRuaWdodCBidXJseXdvb2Q=","upper_bound":"aW5kaWFuIHNtb2tlIGZvcmVzdCBmaXJlYnJpY2sgdmlvbGV0","repeats":1},{"count":4240000,"lower_bound":"aW5kaWFuIHNtb2tlIGhvdCB3aGVhdCBhenVyZQ==","upper_bound":"aXZvcnkgY2hvY29sYXRlIHB1ZmYgbGVtb24gbmF2eQ==","repeats":1},{"count":4280000,"lower_bound":"aXZvcnkgY2hvY29sYXRlIHJveWFsIHNhZGRsZSBjb3Juc2lsaw==","upper_bound":"aXZvcnkgbWVkaXVtIGNvcmFsIHJvc2UgcG93ZGVy","repeats":1},{"count":4320000,"lower_bound":"aXZvcnkgbWVkaXVtIHNlYXNoZWxsIHNhbmR5IHNwcmluZw==","upper_bound":"aXZvcnkgc2Vhc2hlbGwgc25vdyBsaW1lIHBvd2Rlcg==","repeats":1},{"count":4360000,"lower_bound":"aXZvcnkgc2llbm5hIGNvcm5zaWxrIGF6dXJlIG1pbnQ=","upper_bound":"a2hha2kgY29ybnNpbGsgdGhpc3RsZSBzYWxtb24gYXp1cmU=","repeats":1},{"count":4400000,"lower_bound":"a2hha2kgY3JlYW0gY29yYWwgc2llbm5hIHB1ZmY=","upper_bound":"a2hha2kgb2xpdmUgaW5kaWFuIHRoaXN0bGUgcm9zZQ==","repeats":1},{"count":4440000,"lower_bound":"a2hha2kgb2xpdmUgbWFnZW50YSBmb3Jlc3Qgb3JjaGlk","upper_bound":"a2hha2kgdGhpc3RsZSBkZWVwIGNvcm5mbG93ZXIgYXF1YW1hcmluZQ==","repeats":1},{"count":4480000,"lower_bound":"a2hha2kgdG9tYXRvIGxlbW9uIHRoaXN0bGUgbGluZW4=","upper_bound":"bGFjZSBmb3Jlc3Qgcm9zeSBsaW5lbiBtYXJvb24=","repeats":1},{"count":4520000,"lower_bound":"bGFjZSBmcm9zdGVkIG1hZ2VudGEgcGFsZSBsYXZlbmRlcg==","upper_bound":"bGFjZSBwZXJ1IHNlYXNoZWxsIGJ1cm5pc2hlZCBnb2xkZW5yb2Q=","repeats":1},{"count":4560000,"lower_bound":"bGFjZSBwaW5rIGFudGlxdWUgYnVybmlzaGVkIG5hdmFqbw==","upper_bound":"bGF2ZW5kZXIgYmx1ZSBzbGF0ZSB0YW4gc2FuZHk=","repeats":1},{"count":4600000,"lower_bound":"bGF2ZW5kZXIgY2hhcnRyZXVzZSBsaW1lIGxlbW9uIHJveWFs","upper_bound":"bGF2ZW5kZXIgcGx1bSBkYXJrIHJveWFsIG9yY2hpZA==","repeats":1},{"count":4640000,"lower_bound":"bGF2ZW5kZXIgcG93ZGVyIGJ1cm5pc2hlZCBkb2RnZXIgbW9jY2FzaW4=","upper_bound":"bGF2ZW5kZXIgd2hpdGUgZmxvcmFsIGZyb3N0ZWQgZG9kZ2Vy","repeats":1},{"count":4680000,"lower_bound":"bGF2ZW5kZXIgd2hpdGUgZm9yZXN0IGJsdWUgaG90","upper_bound":"bGF3biBob25leWRldyBwaW5rIGNvcmFsIGhvdA==","repeats":1},{"count":4720000,"lower_bound":"bGF3biBpbmRpYW4gdGhpc3RsZSBjb3JuZmxvd2VyIHBsdW0=","upper_bound":"bGF3biByb3lhbCBzbm93IGxpbWUgYnVybmlzaGVk","repeats":1},{"count":4760000,"lower_bound":"bGF3biBzYWRkbGUgYWxtb25kIHJvc3kgcG93ZGVy","upper_bound":"bGVtb24gYnJvd24gZmxvcmFsIG1pc3R5IGRyYWI=","repeats":1},{"count":4800000,"lower_bound":"bGVtb24gYnVybHl3b29kIG1ldGFsbGljIGFxdWFtYXJpbmUgbW9jY2FzaW4=","upper_bound":"bGVtb24gbGlnaHQgcGx1bSBtaXN0eSBjb3Juc2lsaw==","repeats":1},{"count":4840000,"lower_bound":"bGVtb24gbGltZSBicm93biBkb2RnZXIgZm9yZXN0","upper_bound":"bGVtb24gc2FsbW9uIHNtb2tlIGJ1cmx5d29vZCBmaXJlYnJpY2s=","repeats":1},{"count":4880000,"lower_bound":"bGVtb24gc2FuZHkgbW9jY2FzaW4gY29ybnNpbGsgYnVybmlzaGVk","upper_bound":"bGlnaHQgY29ybmZsb3dlciBpdm9yeSBzbm93IHdoZWF0","repeats":1},{"count":4920000,"lower_bound":"bGlnaHQgY29ybmZsb3dlciBsYXduIHBlcnUgY2hvY29sYXRl","upper_bound":"bGlnaHQgbWVkaXVtIHN0ZWVsIGZpcmVicmljayBhcXVhbWFyaW5l","repeats":1},{"count":4960000,"lower_bound":"bGlnaHQgbWV0YWxsaWMgYnJvd24gY2hpZmZvbiBjb3JuZmxvd2Vy","upper_bound":"bGlnaHQgc3RlZWwgcGVydSBnYWluc2Jvcm8gc3ByaW5n","repeats":1},{"count":5000000,"lower_bound":"bGlnaHQgc3RlZWwgdGFuIGN5YW4gZ2FpbnNib3Jv","upper_bound":"bGltZSBkb2RnZXIgZGVlcCB5ZWxsb3cgbWludA==","repeats":1},{"count":5040000,"lower_bound":"bGltZSBkcmFiIG1hcm9vbiBiaXNxdWUgY3lhbg==","upper_bound":"bGltZSBvbGl2ZSBnYWluc2Jvcm8gbGF3biB2aW9sZXQ=","repeats":1},{"count":5080000,"lower_bound":"bGltZSBvcmFuZ2Ugc2FuZHkgc3ByaW5nIHdoaXRl","upper_bound":"bGluZW4gYWxtb25kIHNwcmluZyBza3kgc25vdw==","repeats":1},{"count":5120000,"lower_bound":"bGluZW4gYXF1YW1hcmluZSB0dXJxdW9pc2UgbGVtb24gcmVk","upper_bound":"bGluZW4gZ3JleSBob25leWRldyBnaG9zdCBtZWRpdW0=","repeats":1},{"count":5160000,"lower_bound":"bGluZW4gZ3JleSByb3N5IHNlYXNoZWxsIHdoaXRl","upper_bound":"bGluZW4gcm9zZSBjaGlmZm9uIGZpcmVicmljayBzYWxtb24=","repeats":1},{"count":5200000,"lower_bound":"bGluZW4gcm9zZSBtYXJvb24gd2hpdGUgc2llbm5h","upper_bound":"bWFnZW50YSBibHVlIG1pbnQgbGFjZSBvbGl2ZQ==","repeats":1},{"count":5240000,"lower_bound":"bWFnZW50YSBibHVzaCBjaGlmZm9uIGRpbSBncmV5","upper_bound":"bWFnZW50YSBsaW5lbiByb3lhbCBvbGl2ZSBwdWZm","repeats":1},{"count":5280000,"lower_bound":"bWFnZW50YSBtYXJvb24gZmxvcmFsIG9yYW5nZSBjb3JuZmxvd2Vy","upper_bound":"bWFnZW50YSBzZWFzaGVsbCBjb3Juc2lsayBmaXJlYnJpY2sgc3ByaW5n","repeats":1},{"count":5320000,"lower_bound":"bWFnZW50YSBzaWVubmEgc3RlZWwgbWFyb29uIGZsb3JhbA==","upper_bound":"bWFyb29uIGNvcm5mbG93ZXIgZm9yZXN0IGxpbWUgZmxvcmFs","repeats":1},{"count":5360000,"lower_bound":"bWFyb29uIGNvcm5mbG93ZXIgc3RlZWwgdGFuIG1pc3R5","upper_bound":"bWFyb29uIG1pc3R5IHNlYXNoZWxsIGRyYWIgY3lhbg==","repeats":1},{"count":5400000,"lower_bound":"bWFyb29uIG5hdmFqbyBsaW5lbiBjaGlmZm9uIHBhbGU=","upper_bound":"bWFyb29uIHNub3cgbGFjZSBibGFjayBzZWFzaGVsbA==","repeats":1},{"count":5440000,"lower_bound":"bWFyb29uIHNub3cgbGF3biBncmV5IHZpb2xldA==","upper_bound":"bWVkaXVtIGRhcmsgc2llbm5hIHdoaXRlIHBlYWNo","repeats":1},{"count":5480000,"lower_bound":"bWVkaXVtIGRhcmsgc21va2UgYnVybHl3b29kIGxhY2U=","upper_bound":"bWVkaXVtIG9yY2hpZCBnb2xkZW5yb2QgZG9kZ2VyIGZyb3N0ZWQ=","repeats":1},{"count":5520000,"lower_bound":"bWVkaXVtIG9yY2hpZCBwYXBheWEgZ2FpbnNib3JvIHJlZA==","upper_bound":"bWVkaXVtIHNhbmR5IGFsbW9uZCBjaGlmZm9uIG5hdmFqbw==","repeats":1},{"count":5560000,"lower_bound":"bWVkaXVtIHNhbmR5IGNob2NvbGF0ZSByb3lhbCBtZXRhbGxpYw==","upper_bound":"bWV0YWxsaWMgYnVybmlzaGVkIHNpZW5uYSBicm93biBhenVyZQ==","repeats":1},{"count":5600000,"lower_bound":"bWV0YWxsaWMgY2hpZmZvbiBtaW50IHJvc3kgcGFsZQ==","upper_bound":"bWV0YWxsaWMgbWFnZW50YSBncmVlbiByb3lhbCBsaW1l","repeats":1},{"count":5640000,"lower_bound":"bWV0YWxsaWMgbWFyb29uIGN5YW4gZGltIGNoYXJ0cmV1c2U=","upper_bound":"bWV0YWxsaWMgc3ByaW5nIHNpZW5uYSBiZWlnZSBkb2RnZXI=","repeats":1},{"count":5680000,"lower_bound":"bWV0YWxsaWMgc3RlZWwgaW5kaWFuIGZpcmVicmljayBjb3JhbA==","upper_bound":"bWlkbmlnaHQgZGVlcCBza3kgb2xpdmUgYnVybHl3b29k","repeats":1},{"count":5720000,"lower_bound":"bWlkbmlnaHQgZmxvcmFsIHNhbG1vbiBibHVzaCBkaW0=","upper_bound":"bWlkbmlnaHQgbWludCBncmVlbiBmcm9zdGVkIGNoYXJ0cmV1c2U=","repeats":1},{"count":5760000,"lower_bound":"bWlkbmlnaHQgbWlzdHkgbGlnaHQgbGF2ZW5kZXIgbWV0YWxsaWM=","upper_bound":"bWlkbmlnaHQgdHVycXVvaXNlIHBsdW0gbWVkaXVtIG9yY2hpZA==","repeats":1},{"count":5800000,"lower_bound":"bWlkbmlnaHQgdmlvbGV0IGNob2NvbGF0ZSBkcmFiIGJpc3F1ZQ==","upper_bound":"bWludCBjb3JhbCBzZWFzaGVsbCBjaGlmZm9uIGdhaW5zYm9ybw==","repeats":1},{"count":5840000,"lower_bound":"bWludCBjb3JuZmxvd2VyIHdoZWF0IGxhY2UgZG9kZ2Vy","upper_bound":"bWludCBsaW5lbiBzaWVubmEgdGhpc3RsZSBwaW5r","repeats":1},{"count":5880000,"lower_bound":"bWludCBsaW5lbiB2aW9sZXQgaW5kaWFuIGhvbmV5ZGV3","upper_bound":"bWludCBzbGF0ZSBpdm9yeSBza3kgZmlyZWJyaWNr","repeats":1},{"count":5920000,"lower_bound":"bWludCBzbW9rZSBjaGlmZm9uIGJsdWUgb3JjaGlk","upper_bound":"bWlzdHkgY3lhbiBtb2NjYXNpbiBhenVyZSBicm93bg==","repeats":1},{"count":5960000,"lower_bound":"bWlzdHkgZGFyayBza3kgc3ByaW5nIGhvdA==","upper_bound":"bWlzdHkgbWV0YWxsaWMgc2FsbW9uIHBsdW0gcGVhY2g=","repeats":1},{"count":6000000,"lower_bound":"bWlzdHkgbWlkbmlnaHQgbWFnZW50YSBsYXZlbmRlciBsZW1vbg==","upper_bound":"bWlzdHkgdHVycXVvaXNlIGZpcmVicmljayB0b21hdG8gbmF2eQ==","repeats":1},{"count":6040000,"lower_bound":"bWlzdHkgd2hlYXQgbGF2ZW5kZXIgYWxtb25kIGRpbQ==","upper_bound":"bW9jY2FzaW4gZmlyZWJyaWNrIHBhcGF5YSBsaWdodCBvcmFuZ2U=","repeats":1},{"count":6080000,"lower_bound":"bW9jY2FzaW4gZmlyZWJyaWNrIHZpb2xldCBob25leWRldyBsYXdu","upper_bound":"bW9jY2FzaW4gcGx1bSBkaW0gb3JhbmdlIG5hdmFqbw==","repeats":1},{"count":6120000,"lower_bound":"bW9jY2FzaW4gcG93ZGVyIGJpc3F1ZSBkYXJrIG1ldGFsbGlj","upper_bound":"bmF2YWpvIGF6dXJlIGxhdmVuZGVyIHJveWFsIGNvcm5mbG93ZXI=","repeats":1},{"count":6160000,"lower_bound":"bmF2YWpvIGF6dXJlIHJvc3kgY2hpZmZvbiBibHVzaA==","upper_bound":"bmF2YWpvIGZpcmVicmljayBtZXRhbGxpYyBwZWFjaCBtYXJvb24=","repeats":1},{"count":6200000,"lower_bound":"bmF2YWpvIGZpcmVicmljayBzdGVlbCBtaWRuaWdodCBhenVyZQ==","upper_bound":"bmF2YWpvIG9saXZlIGZsb3JhbCBtaXN0eSBkYXJr","repeats":1},{"count":6240000,"lower_bound":"bmF2YWpvIG9yYW5nZSBsaW1lIGFxdWFtYXJpbmUgdGhpc3RsZQ==","upper_bound":"bmF2YWpvIHdoaXRlIHNpZW5uYSBwYWxlIGZyb3N0ZWQ=","repeats":1},{"count":6280000,"lower_bound":"bmF2eSBhbG1vbmQgcGFwYXlhIGxhdmVuZGVyIHBlYWNo","upper_bound":"bmF2eSBkZWVwIG1vY2Nhc2luIGZpcmVicmljayBtZWRpdW0=","repeats":1},{"count":6320000,"lower_bound":"bmF2eSBkb2RnZXIgY3JlYW0gaW5kaWFuIHBvd2Rlcg==","upper_bound":"bmF2eSBvbGl2ZSBiaXNxdWUgZ3JlZW4gcGVhY2g=","repeats":1},{"count":6360000,"lower_bound":"bmF2eSBvbGl2ZSBjaG9jb2xhdGUgYXF1YW1hcmluZSBmaXJlYnJpY2s=","upper_bound":"bmF2eSB0b21hdG8gZG9kZ2VyIHBhbGUgaW5kaWFu","repeats":1},{"count":6400000,"lower_bound":"bmF2eSB2aW9sZXQgY29ybmZsb3dlciBsYXZlbmRlciBzbm93","upper_bound":"b2xpdmUgZm9yZXN0IGJlaWdlIHNreSBsaW5lbg==","repeats":1},{"count":6440000,"lower_bound":"b2xpdmUgZm9yZXN0IGxhdmVuZGVyIHZpb2xldCBidXJuaXNoZWQ=","upper_bound":"b2xpdmUgcGVhY2ggcGFwYXlhIGZyb3N0ZWQgZ3JlZW4=","repeats":1},{"count":6480000,"lower_bound":"b2xpdmUgcGluayBibHVzaCBsaW1lIGJsdWU=","upper_bound":"b3JhbmdlIGF6dXJlIG5hdmFqbyB3aGl0ZSByb3N5","repeats":1},{"count":6520000,"lower_bound":"b3JhbmdlIGJlaWdlIGJpc3F1ZSBpdm9yeSBtaXN0eQ==","upper_bound":"b3JhbmdlIGdyZXkgcm95YWwgY3lhbiBmcm9zdGVk","repeats":1},{"count":6560000,"lower_bound":"b3JhbmdlIGhvbmV5ZGV3IGJsYW5jaGVkIGJsYWNrIHBhbGU=","upper_bound":"b3JhbmdlIHBsdW0gb3JjaGlkIHBhbGUgbmF2eQ==","repeats":1},{"count":6600000,"lower_bound":"b3JhbmdlIHB1ZmYgc2Vhc2hlbGwgdHVycXVvaXNlIGZsb3JhbA==","upper_bound":"b3JjaGlkIGN5YW4gaG9uZXlkZXcga2hha2kgc3ByaW5n","repeats":1},{"count":6640000,"lower_bound":"b3JjaGlkIGRhcmsgbW9jY2FzaW4gYmx1c2ggcGFwYXlh","upper_bound":"b3JjaGlkIG1pc3R5IHNhbG1vbiBraGFraSBzYW5keQ==","repeats":1},{"count":6680000,"lower_bound":"b3JjaGlkIG1vY2Nhc2luIHNhZGRsZSBkcmFiIHNwcmluZw==","upper_bound":"cGFsZSBibGFjayBjaGlmZm9uIGRlZXAgcGluaw==","repeats":1},{"count":6720000,"lower_bound":"cGFsZSBibGFjayB5ZWxsb3cgdG9tYXRvIGNvcm5mbG93ZXI=","upper_bound":"cGFsZSBsYXduIGdyZXkgZHJhYiBzYWxtb24=","repeats":1},{"count":6760000,"lower_bound":"cGFsZSBsYXduIGxlbW9uIGNoYXJ0cmV1c2UgaG9uZXlkZXc=","upper_bound":"cGFsZSByZWQgc2FuZHkgbW9jY2FzaW4gcGVydQ==","repeats":1},{"count":6800000,"lower_bound":"cGFsZSByb3N5IG1pc3R5IGNoYXJ0cmV1c2UgbmF2eQ==","upper_bound":"cGFwYXlhIGJsdWUgbWFyb29uIHZpb2xldCBwdWZm","repeats":1},{"count":6840000,"lower_bound":"cGFwYXlhIGJsdXNoIGxhY2UgY3lhbiByZWQ=","upper_bound":"cGFwYXlhIGxlbW9uIG1hZ2VudGEgY29ybmZsb3dlciBtaW50","repeats":1},{"count":6880000,"lower_bound":"cGFwYXlhIGxpZ2h0IGhvbmV5ZGV3IHBhbGUgcGluaw==","upper_bound":"cGFwYXlhIHN0ZWVsIHNhbG1vbiBtaWRuaWdodCB0aGlzdGxl","repeats":1},{"count":6920000,"lower_bound":"cGFwYXlhIHRhbiBsaWdodCB0aGlzdGxlIG1lZGl1bQ==","upper_bound":"cGVhY2ggZ2FpbnNib3JvIGFsbW9uZCBwZXJ1IHB1cnBsZQ==","repeats":1},{"count":6960000,"lower_bound":"cGVhY2ggZ2FpbnNib3JvIGdob3N0IGN5YW4gcGFwYXlh","upper_bound":"cGVhY2ggcGVydSBwdXJwbGUgY2hvY29sYXRlIGdvbGRlbnJvZA==","repeats":1},{"count":7000000,"lower_bound":"cGVhY2ggcGluayBjb3JuZmxvd2VyIG9yYW5nZSBwZXJ1","upper_bound":"cGVydSBjaGlmZm9uIGRlZXAgc2FsbW9uIHllbGxvdw==","repeats":1},{"count":7040000,"lower_bound":"cGVydSBjb3JhbCBwYWxlIHRoaXN0bGUgc3ByaW5n","upper_bound":"cGVydSBtaW50IGFudGlxdWUgbWVkaXVtIGdhaW5zYm9ybw==","repeats":1},{"count":7080000,"lower_bound":"cGVydSBtaW50IGxpZ2h0IHRhbiByb3Nl","upper_bound":"cGVydSBzcHJpbmcgbmF2eSB0YW4gZ2hvc3Q=","repeats":1},{"count":7120000,"lower_bound":"cGVydSBzdGVlbCBwbHVtIGdob3N0IHRvbWF0bw==","upper_bound":"cGluayBkaW0gcm95YWwgdGFuIG5hdmFqbw==","repeats":1},{"count":7160000,"lower_bound":"cGluayBkcmFiIGxhd24gaG9uZXlkZXcgYWxtb25k","upper_bound":"cGluayBuYXZham8gc2xhdGUgcGVydSBncmVlbg==","repeats":1},{"count":7200000,"lower_bound":"cGluayBuYXZ5IGhvbmV5ZGV3IHZpb2xldCBjeWFu","upper_bound":"cGluayB0YW4gY2hvY29sYXRlIHBvd2RlciBkb2RnZXI=","repeats":1},{"count":7240000,"lower_bound":"cGluayB0aGlzdGxlIGF6dXJlIGJ1cm5pc2hlZCBtaWRuaWdodA==","upper_bound":"cGx1bSBkcmFiIGxpbmVuIHBpbmsgYmxhY2s=","repeats":1},{"count":7280000,"lower_bound":"cGx1bSBmaXJlYnJpY2sga2hha2kgaG90IHNsYXRl","upper_bound":"cGx1bSBwaW5rIG1pbnQgbGluZW4gdHVycXVvaXNl","repeats":1},{"count":7320000,"lower_bound":"cGx1bSBwb3dkZXIgZ3JlZW4gaXZvcnkgd2hpdGU=","upper_bound":"cG93ZGVyIGJsYWNrIGZsb3JhbCByb3NlIGdyZXk=","repeats":1},{"count":7360000,"lower_bound":"cG93ZGVyIGJsYW5jaGVkIGRpbSBncmVlbiBwYXBheWE=","upper_bound":"cG93ZGVyIGdob3N0IGxhdmVuZGVyIGluZGlhbiBhenVyZQ==","repeats":1},{"count":7400000,"lower_bound":"cG93ZGVyIGdvbGRlbnJvZCBraGFraSBtYWdlbnRhIGNvcmFs","upper_bound":"cG93ZGVyIHJlZCBjb3Juc2lsayBob3QgbWFyb29u","repeats":1},{"count":7440000,"lower_bound":"cG93ZGVyIHJlZCBwZXJ1IGRyYWIgZG9kZ2Vy","upper_bound":"cHVmZiBjaGlmZm9uIHBsdW0gYnVybmlzaGVkIGJsYWNr","repeats":1},{"count":7480000,"lower_bound":"cHVmZiBjaGlmZm9uIHdoaXRlIGJ1cm5pc2hlZCBibGFuY2hlZA==","upper_bound":"cHVmZiBtZXRhbGxpYyBmcm9zdGVkIGxpbmVuIGJlaWdl","repeats":1},{"count":7520000,"lower_bound":"cHVmZiBtZXRhbGxpYyBzZWFzaGVsbCBjaGlmZm9uIGtoYWtp","upper_bound":"cHVmZiB0dXJxdW9pc2UgbW9jY2FzaW4gY29yYWwgcm95YWw=","repeats":1},{"count":7560000,"lower_bound":"cHVmZiB0dXJxdW9pc2Ugc2llbm5hIGJyb3duIGFxdWFtYXJpbmU=","upper_bound":"cHVycGxlIGRpbSBkYXJrIHNhbmR5IGtoYWtp","repeats":1},{"count":7600000,"lower_bound":"cHVycGxlIGRpbSBraGFraSBicm93biBsYXdu","upper_bound":"cHVycGxlIG9saXZlIGJ1cm5pc2hlZCBzbW9rZSBob3Q=","repeats":1},{"count":7640000,"lower_bound":"cHVycGxlIG9saXZlIHNsYXRlIGdhaW5zYm9ybyBtb2NjYXNpbg==","upper_bound":"cmVkIGFsbW9uZCBnb2xkZW5yb2QgdmlvbGV0IG1pbnQ=","repeats":1},{"count":7680000,"lower_bound":"cmVkIGFsbW9uZCBtb2NjYXNpbiBwdWZmIHBsdW0=","upper_bound":"cmVkIGxhY2Ugb3JhbmdlIGNvcmFsIG1lZGl1bQ==","repeats":1},{"count":7720000,"lower_bound":"cmVkIGxhdmVuZGVyIGNvcm5zaWxrIHBvd2RlciBuYXZ5","upper_bound":"cmVkIHNhZGRsZSBwbHVtIHNhbmR5IGNvcmFs","repeats":1},{"count":7760000,"lower_bound":"cmVkIHNhZGRsZSBzcHJpbmcgY29ybmZsb3dlciBkb2RnZXI=","upper_bound":"cm9zZSBidXJuaXNoZWQgbGVtb24gcm95YWwgYnVybHl3b29k","repeats":1},{"count":7800000,"lower_bound":"cm9zZSBjaGFydHJldXNlIGxpZ2h0IGF6dXJlIG1pc3R5","upper_bound":"cm9zZSBsaW1lIGJsdXNoIHR1cnF1b2lzZSBsaW5lbg==","repeats":1},{"count":7840000,"lower_bound":"cm9zZSBsaW1lIHNreSBjb3Juc2lsayBncmVlbg==","upper_bound":"cm9zZSBzZWFzaGVsbCBmbG9yYWwgY29yYWwgbGluZW4=","repeats":1},{"count":7880000,"lower_bound":"cm9zZSBzaWVubmEgc25vdyBsZW1vbiB0aGlzdGxl","upper_bound":"cm9zeSBjaGFydHJldXNlIGNvcm5zaWxrIGxhY2UgbWlzdHk=","repeats":1},{"count":7920000,"lower_bound":"cm9zeSBjaGlmZm9uIGxhY2UgcGVhY2ggbGVtb24=","upper_bound":"cm9zeSBtYXJvb24gbmF2eSBicm93biBjaGFydHJldXNl","repeats":1},{"count":7960000,"lower_bound":"cm9zeSBtYXJvb24gc3RlZWwgbWVkaXVtIGNvcm5zaWxr","upper_bound":"cm9zeSB0aGlzdGxlIGJlaWdlIG1pc3R5IGJsdWU=","repeats":1},{"count":8000000,"lower_bound":"cm9zeSB0aGlzdGxlIHRhbiBnb2xkZW5yb2QgbGF2ZW5kZXI=","upper_bound":"cm95YWwgZG9kZ2VyIGJsdWUgcGVhY2ggZHJhYg==","repeats":1},{"count":8040000,"lower_bound":"cm95YWwgZHJhYiBidXJuaXNoZWQgcG93ZGVyIGFudGlxdWU=","upper_bound":"cm95YWwgcGluayBiZWlnZSBwbHVtIGJsdWU=","repeats":1},{"count":8080000,"lower_bound":"cm95YWwgcGx1bSBtYWdlbnRhIGxhY2UgbGF2ZW5kZXI=","upper_bound":"c2FkZGxlIGJpc3F1ZSByb3N5IHBlYWNoIHBpbms=","repeats":1},{"count":8120000,"lower_bound":"c2FkZGxlIGJsYWNrIGxhdmVuZGVyIG1pc3R5IHllbGxvdw==","upper_bound":"c2FkZGxlIGdyZXkgbmF2YWpvIGxlbW9uIGNvcm5mbG93ZXI=","repeats":1},{"count":8160000,"lower_bound":"c2FkZGxlIGhvbmV5ZGV3IGxhY2Ugcm95YWwgc2FuZHk=","upper_bound":"c2FkZGxlIHBhcGF5YSBvbGl2ZSBkZWVwIHdoZWF0","repeats":1},{"count":8200000,"lower_bound":"c2FkZGxlIHBlYWNoIG1ldGFsbGljIGtoYWtpIHN0ZWVs","upper_bound":"c2FsbW9uIGJ1cm5pc2hlZCBwdWZmIHBsdW0gY2hvY29sYXRl","repeats":1},{"count":8240000,"lower_bound":"c2FsbW9uIGNoYXJ0cmV1c2UgZmlyZWJyaWNrIGRlZXAgY3lhbg==","upper_bound":"c2FsbW9uIG1vY2Nhc2luIGJsdWUgbGF2ZW5kZXIgY2hpZmZvbg==","repeats":1},{"count":8280000,"lower_bound":"c2FsbW9uIG1vY2Nhc2luIGRvZGdlciBkYXJrIHBhbGU=","upper_bound":"c2FsbW9uIHRoaXN0bGUgbGltZSByb3NlIGRvZGdlcg==","repeats":1},{"count":8320000,"lower_bound":"c2FsbW9uIHRvbWF0byBkZWVwIGFsbW9uZCBibGFjaw==","upper_bound":"c2FuZHkgY29ybmZsb3dlciBmaXJlYnJpY2sgYmlzcXVlIGhvdA==","repeats":1},{"count":8360000,"lower_bound":"c2FuZHkgY29ybmZsb3dlciBpbmRpYW4gcG93ZGVyIGhvbmV5ZGV3","upper_bound":"c2FuZHkgbGluZW4gc3RlZWwgY3JlYW0gcm9zeQ==","repeats":1},{"count":8400000,"lower_bound":"c2FuZHkgbWFnZW50YSBidXJseXdvb2QgY29ybmZsb3dlciBzYWRkbGU=","upper_bound":"c2FuZHkgeWVsbG93IG1hZ2VudGEgYmx1c2ggbWludA==","repeats":1},{"count":8440000,"lower_bound":"c2Vhc2hlbGwgYWxtb25kIGdyZWVuIGZvcmVzdCBibHVl","upper_bound":"c2Vhc2hlbGwga2hha2kgcGVhY2ggcG93ZGVyIGNvcmFs","repeats":1},{"count":8480000,"lower_bound":"c2Vhc2hlbGwgbGF2ZW5kZXIgZGVlcCBibHVzaCBidXJseXdvb2Q=","upper_bound":"c2Vhc2hlbGwgdGFuIG5hdnkgZmxvcmFsIHR1cnF1b2lzZQ==","repeats":1},{"count":8520000,"lower_bound":"c2Vhc2hlbGwgdGFuIHB1cnBsZSBzcHJpbmcgZ2hvc3Q=","upper_bound":"c2llbm5hIGZvcmVzdCBzdGVlbCBncmV5IHRvbWF0bw==","repeats":1},{"count":8560000,"lower_bound":"c2llbm5hIGdhaW5zYm9ybyBvbGl2ZSB0YW4gc3RlZWw=","upper_bound":"c2llbm5hIHBsdW0gZ29sZGVucm9kIGJ1cm5pc2hlZCBsaW1l","repeats":1},{"count":8600000,"lower_bound":"c2llbm5hIHB1ZmYgbWlzdHkgZmlyZWJyaWNrIHJveWFs","upper_bound":"c2t5IGJsdXNoIGFsbW9uZCBsaWdodCB5ZWxsb3c=","repeats":1},{"count":8640000,"lower_bound":"c2t5IGJyb3duIGNoaWZmb24gc2FsbW9uIHR1cnF1b2lzZQ==","upper_bound":"c2t5IGxhdmVuZGVyIGNoaWZmb24gY2hhcnRyZXVzZSBkYXJr","repeats":1},{"count":8680000,"lower_bound":"c2t5IGxhdmVuZGVyIHJlZCBmbG9yYWwgaXZvcnk=","upper_bound":"c2t5IHJlZCBjaG9jb2xhdGUgc3ByaW5nIG1ldGFsbGlj","repeats":1},{"count":8720000,"lower_bound":"c2t5IHJvc2UgcGVhY2ggY29ybnNpbGsgbWlzdHk=","upper_bound":"c2xhdGUgY2hvY29sYXRlIHJlZCBsaW1lIGJ1cm5pc2hlZA==","repeats":1},{"count":8760000,"lower_bound":"c2xhdGUgY2hvY29sYXRlIHN0ZWVsIGxhY2UgcGFsZQ==","upper_bound":"c2xhdGUgbWFnZW50YSBtZWRpdW0gcG93ZGVyIGNvcm5mbG93ZXI=","repeats":1},{"count":8800000,"lower_bound":"c2xhdGUgbWFyb29uIG1lZGl1bSBhbnRpcXVlIHJveWFs","upper_bound":"c2xhdGUgdGFuIGxhd24gbGF2ZW5kZXIgYmVpZ2U=","repeats":1},{"count":8840000,"lower_bound":"c2xhdGUgdGhpc3RsZSBjaGlmZm9uIGNyZWFtIG1ldGFsbGlj","upper_bound":"c21va2UgaW5kaWFuIHN0ZWVsIG1hZ2VudGEgc2llbm5h","repeats":1},{"count":8880000,"lower_bound":"c21va2Uga2hha2kgZG9kZ2VyIGNob2NvbGF0ZSBtZWRpdW0=","upper_bound":"c21va2Ugc2xhdGUgZ2hvc3QgZm9yZXN0IGdhaW5zYm9ybw==","repeats":1},{"count":8920000,"lower_bound":"c21va2Ugc3ByaW5nIGNvcm5zaWxrIHJveWFsIHBlcnU=","upper_bound":"c25vdyBmaXJlYnJpY2sgc3RlZWwgb2xpdmUgZ2FpbnNib3Jv","repeats":1},{"count":8960000,"lower_bound":"c25vdyBmbG9yYWwgZHJhYiBwdXJwbGUgbWVkaXVt","upper_bound":"c25vdyBtaW50IGZyb3N0ZWQgcm9zeSBsYXdu","repeats":1},{"count":9000000,"lower_bound":"c25vdyBtaXN0eSByb3N5IGFudGlxdWUga2hha2k=","upper_bound":"c25vdyB3aGVhdCBzbGF0ZSBwYWxlIGNvcm5zaWxr","repeats":1},{"count":9040000,"lower_bound":"c25vdyB3aGl0ZSBsZW1vbiB0b21hdG8gbmF2YWpv","upper_bound":"c3ByaW5nIGZyb3N0ZWQgbGF3biBjaG9jb2xhdGUgbmF2eQ==","repeats":1},{"count":9080000,"lower_bound":"c3ByaW5nIGdob3N0IGxpbmVuIGJsdWUgc2t5","upper_bound":"c3ByaW5nIHBsdW0gbGF2ZW5kZXIgbGlnaHQgZ29sZGVucm9k","repeats":1},{"count":9120000,"lower_bound":"c3ByaW5nIHBsdW0gbmF2YWpvIGdyZWVuIHRoaXN0bGU=","upper_bound":"c3RlZWwgY29yYWwgbmF2YWpvIHJvc2UgcGVhY2g=","repeats":1},{"count":9160000,"lower_bound":"c3RlZWwgY29yYWwgc2FuZHkgcm9zeSBvcmFuZ2U=","upper_bound":"c3RlZWwgbWVkaXVtIGN5YW4gd2hlYXQgdmlvbGV0","repeats":1},{"count":9200000,"lower_bound":"c3RlZWwgbWlzdHkgaXZvcnkgYWxtb25kIGZyb3N0ZWQ=","upper_bound":"dGFuIGJpc3F1ZSBjaG9jb2xhdGUgeWVsbG93IG9yYW5nZQ==","repeats":1},{"count":9240000,"lower_bound":"dGFuIGJsYW5jaGVkIHBpbmsgb3JjaGlkIHR1cnF1b2lzZQ==","upper_bound":"dGFuIGxpbWUgaXZvcnkgYXp1cmUgZmxvcmFs","repeats":1},{"count":9280000,"lower_bound":"dGFuIGxpbWUgbmF2YWpvIHBlYWNoIGJsdWU=","upper_bound":"dGFuIHJvc3kgc25vdyBjaG9jb2xhdGUgYmx1ZQ==","repeats":1},{"count":9320000,"lower_bound":"dGFuIHJveWFsIHNpZW5uYSBsaWdodCBtZWRpdW0=","upper_bound":"dGhpc3RsZSBjaG9jb2xhdGUgbGluZW4gZnJvc3RlZCBncmVlbg==","repeats":1},{"count":9360000,"lower_bound":"dGhpc3RsZSBjb3JhbCBncmVlbiBiaXNxdWUgcm9zeQ==","upper_bound":"dGhpc3RsZSBtYWdlbnRhIG1ldGFsbGljIGZsb3JhbCB0dXJxdW9pc2U=","repeats":1},{"count":9400000,"lower_bound":"dGhpc3RsZSBtYXJvb24gY2hvY29sYXRlIGxpZ2h0IGZsb3JhbA==","upper_bound":"dG9tYXRvIGF6dXJlIGtoYWtpIHNhbG1vbiByZWQ=","repeats":1},{"count":9440000,"lower_bound":"dG9tYXRvIGJlaWdlIGxpbWUgc2FsbW9uIGZpcmVicmljaw==","upper_bound":"dG9tYXRvIGdvbGRlbnJvZCBwYXBheWEgaG9uZXlkZXcgc2FuZHk=","repeats":1},{"count":9480000,"lower_bound":"dG9tYXRvIGdyZXkgYXF1YW1hcmluZSBmcm9zdGVkIGNob2NvbGF0ZQ==","upper_bound":"dG9tYXRvIHBsdW0gc3ByaW5nIG9yYW5nZSBmaXJlYnJpY2s=","repeats":1},{"count":9520000,"lower_bound":"dG9tYXRvIHBvd2RlciBpdm9yeSBhbnRpcXVlIHBhbGU=","upper_bound":"dHVycXVvaXNlIGNoaWZmb24gYmxhbmNoZWQgYnJvd24gc2xhdGU=","repeats":1},{"count":9560000,"lower_bound":"dHVycXVvaXNlIGNvcm5zaWxrIG1pbnQgcGx1bSBkaW0=","upper_bound":"dHVycXVvaXNlIG5hdnkgcm9zeSB0b21hdG8gY2hhcnRyZXVzZQ==","repeats":1},{"count":9600000,"lower_bound":"dHVycXVvaXNlIG9saXZlIG9yYW5nZSBhcXVhbWFyaW5lIGZyb3N0ZWQ=","upper_bound":"dmlvbGV0IGJpc3F1ZSBpbmRpYW4gd2hlYXQgYXF1YW1hcmluZQ==","repeats":1},{"count":9640000,"lower_bound":"dmlvbGV0IGJpc3F1ZSBzbW9rZSBzdGVlbCBjaGlmZm9u","upper_bound":"dmlvbGV0IGdhaW5zYm9ybyBwb3dkZXIgbWlzdHkgcm9zZQ==","repeats":1},{"count":9680000,"lower_bound":"dmlvbGV0IGdvbGRlbnJvZCBncmVlbiBhcXVhbWFyaW5lIG9yY2hpZA==","upper_bound":"dmlvbGV0IHBhcGF5YSBza3kgc2FuZHkgZmxvcmFs","repeats":1},{"count":9720000,"lower_bound":"dmlvbGV0IHBlYWNoIHNreSBob3QgYmxhbmNoZWQ=","upper_bound":"d2hlYXQgY29ybnNpbGsgcGx1bSBuYXZ5IHNub3c=","repeats":1},{"count":9760000,"lower_bound":"d2hlYXQgY3JlYW0gZnJvc3RlZCBsaWdodCBuYXZham8=","upper_bound":"d2hlYXQgbWV0YWxsaWMgYWxtb25kIGxhY2UgYmxhbmNoZWQ=","repeats":1},{"count":9800000,"lower_bound":"d2hlYXQgbWludCBibHVzaCBpdm9yeSBidXJseXdvb2Q=","upper_bound":"d2hlYXQgdHVycXVvaXNlIG9yY2hpZCBsaWdodCBiZWlnZQ==","repeats":1},{"count":9840000,"lower_bound":"d2hlYXQgd2hpdGUgb3JjaGlkIGxhY2Ugc2FsbW9u","upper_bound":"d2hpdGUgZ29sZGVucm9kIGNvcm5zaWxrIG1hcm9vbiBhbnRpcXVl","repeats":1},{"count":9880000,"lower_bound":"d2hpdGUgZ29sZGVucm9kIHNtb2tlIGxpbmVuIGNvcmFs","upper_bound":"d2hpdGUgc2Vhc2hlbGwgZ3JlZW4gbWFyb29uIGJ1cmx5d29vZA==","repeats":1},{"count":9920000,"lower_bound":"d2hpdGUgc2llbm5hIGNvcm5zaWxrIGNoaWZmb24gYW50aXF1ZQ==","upper_bound":"eWVsbG93IGRpbSBwZWFjaCBkYXJrIGdyZWVu","repeats":1},{"count":9960000,"lower_bound":"eWVsbG93IGRvZGdlciBicm93biBwYWxlIGdhaW5zYm9ybw==","upper_bound":"eWVsbG93IG1vY2Nhc2luIGtoYWtpIGhvdCBzYWRkbGU=","repeats":1},{"count":10000000,"lower_bound":"eWVsbG93IG9saXZlIGdyZWVuIHdoZWF0IG1pbnQ=","upper_bound":"eWVsbG93IHdoaXRlIGNyZWFtIG5hdmFqbyBkYXJr","repeats":1}]},"cm_sketch":{"rows":[{"counters":[4924,4816,4915,4915,4976,4894,4852,4983,4888,4945,4874,5037,4968,4813,5029,4970,4943,4813,4915,4851,4917,4925,4899,4896,4928,4964,4859,4885,4729,4865,4714,4810,4849,4854,4914,4927,4878,4845,4917,4985,4871,4887,4784,4969,4780,5016,4934,4966,4819,4891,4757,4929,4905,4907,4900,4851,4902,4944,4845,4890,4911,4941,4933,4828,4823,4761,4856,4948,4814,4863,4864,4876,4784,4994,4884,4794,4886,4923,4882,4874,4965,4900,4883,4899,4929,4885,4786,4886,4916,4970,4840,4843,4871,4928,5015,4934,4922,4929,4916,4809,4906,4936,4844,4908,4937,4779,4884,5080,4838,4861,4896,4989,4918,4956,4884,4999,4855,4692,4838,4887,4899,4913,4819,4913,4837,5025,4856,4848,4963,4859,4834,4882,4889,4904,4910,4863,4999,4904,4935,4968,4887,4929,4884,4855,4879,4932,4783,5024,4892,4901,4871,4879,4747,4839,4797,4955,4785,4792,4872,4821,4855,5055,4975,4920,4873,4902,4792,4830,4797,4988,4998,4862,4988,4926,4873,4855,4840,4946,4977,4777,5030,4850,4807,4757,4923,4881,4869,4872,4911,4910,4915,4826,4918,4892,4831,5045,4858,4975,4865,4882,4962,4948,4814,4871,4851,4905,4948,4859,4899,4798,4822,4854,5048,4828,4869,4890,4811,4875,4835,4752,4895,4909,4968,4954,4863,4867,4977,4854,4790,4700,4937,4965,4934,4905,4861,4908,4977,4693,4881,4799,4983,4906,4967,4884,4904,4897,4761,4914,4778,4917,4859,4983,4913,4979,4876,4988,4821,4790,4871,4798,4870,4834,4781,4884,4830,4988,5008,4983,4834,4975,4800,4965,4856,4933,4928,4804,4927,4771,4854,4765,4899,4914,4909,4878,4909,4804,4739,4922,4889,4932,4940,4862,4795,4913,4851,4874,4913,4991,4937,4899,4924,4854,4865,4914,4923,4765,4787,4955,4822,4945,4812,4950,5022,4841,4796,4871,4875,4875,4894,4885,4840,4933,4920,4747,4803,4812,4894,4846,4971,4862,4856,4867,4965,4947,4893,4748,4798,4839,4880,4895,4914,4760,4852,4942,4906,4874,4771,4889,4845,4817,4857,4790,4945,4982,4857,4884,4921,5023,4882,4942,4937,4938,4976,4825,4910,4876,4840,4963,4945,4819,4730,4899,4992,4857,4936,4960,4761,4893,4835,4872,4832,4785,4955,4898,4816,4921,4874,4839,4910,4932,4943,4849,4902,4759,4828,4842,4874,4884,4805,4828,4831,4832,4850,4936,4826,4816,4825,4842,4884,4941,4816,4921,4950,5027,4849,4904,4814,4893,4719,4830,4887,4949,4849,4975,4832,4838,4998,4964,4903,4887,4698,4817,4823,4796,4785,4959,5077,4920,4866,4915,4858,4893,4880,4836,4782,4832,4902,4897,4798,4829,4963,4863,4919,4934,4965,4888,4892,4772,4909,4842,4994,4844,4871,4842,4901,4926,4935,4900,4922,4878,4896,4886,4787,4921,4798,4943,4873,4852,4948,4927,4805,4949,4928,4895,4888,4838,4805,4880,4853,4846,4903,4848,4878,4953,4805,4903,4957,4960,4850,4811,4840,4824,4785,4777,4840,4815,4859,4885,4891,4763,4914,4940,4881,4972,4994,4852,4915,4901,4862,4827,4891,4894,4870,4932,4939,4840,4827,4891,4731,5026,5018,4791,4808,4851,4824,4912,4819,4763,4814,4910,4876,4756,4836,4908,4900,4848,4802,4863,4781,4871,4930,4864,4789,4787,4825,4829,4872,4935,4883,4971,4854,4942,4940,4812,4868,4762,4819,4773,4939,4797,4833,4802,4854,4900,4958,4927,4903,4833,4846,4868,4889,4876,4858,4854,4927,4962,4782,5024,4963,4821,4829,4888,4906,4830,4882,4952,4840,4902,4804,4869,4758,4930,4930,4880,4725,4923,4894,4827,4894,4904,4895,4890,4888,4849,4893,4828,4806,5080,4896,4866,4917,4848,4889,4726,4989,4886,4820,4948,4801,4974,4986,4886,4854,4810,4828,4786,4885,4897,4883,4862,4929,4882,4902,5043,4856,4909,4831,4800,4898,4822,4929,4947,4950,4862,4801,4800,4886,4922,4868,4920,4947,4890,4833,4959,4855,5006,4959,4933,4887,4915,4824,4823,4913,5006,4856,4959,4846,5042,4992,4791,4883,4896,4853,4975,4990,4969,4884,4866,5002,4865,4882,4914,4802,4869,4889,4952,4955,4842,4833,4931,4878,4934,4815,4913,4809,4853,4896,4837,4913,4956,4845,4867,4856,4880,4979,4756,5039,4862,4920,4755,4815,4972,4839,4890,5020,4917,4940,4789,4905,4753,4959,4962,4829,4911,4837,4936,4816,4839,4902,4801,4837,5006,4759,4820,4892,4952,4935,4906,4826,4781,4807,4918,4923,4986,4952,4963,4918,4898,4839,4894,4821,4878,4915,4815,4909,4891,4872,4881,4831,4711,4874,4832,4802,4961,4779,4857,4949,5029,4928,4839,4805,4981,4876,4860,4923,4882,4935,4768,5001,4946,4791,4928,4792,4911,4889,4864,4953,4898,4979,4761,4786,4910,4929,4809,4984,4881,4970,4885,4894,4887,4902,4912,4951,4976,4925,4845,4782,4836,4824,4920,4820,4982,4855,4962,4869,4936,4851,4920,4966,4939,4894,4934,4815,4900,4968,4809,4852,4854,4775,4972,4914,4885,4872,4984,4898,4924,4911,4885,4991,4945,4909,4831,4883,4808,4912,4971,4891,4861,4835,4911,4953,4873,4830,4909,4888,4919,4962,4965,4903,4761,4715,4781,4968,4816,4828,4877,4900,4963,4812,4790,4793,4906,4930,4846,4880,4967,4923,4816,4867,4898,4924,4843,4833,4839,4855,4740,4902,4763,4819,4762,4763,4893,4823,4937,4883,4796,4992,4898,4876,4923,4940,4859,4960,4931,4871,4858,4818,4942,4860,4859,4910,4834,4865,5041,4886,4830,4878,4936,4825,4930,4904,4917,4844,4830,4812,4833,4944,4948,4930,4958,5013,4885,4953,4889,4883,4875,4940,4905,4929,4835,4842,4879,4893,4931,4820,4896,4941,4900,5020,4920,4879,4981,4830,4889,4937,4721,4928,4859,4871,4961,4909,4968,4923,4872,4958,4896,4831,4905,4879,4920,4935,4843,4877,5009,4751,4866,4722,4960,4867,4866,4980,4861,4868,4888,4838,4856,4834,4836,4949,4902,4873,4848,4774,4941,4902,4820,4929,5010,4933,4943,4907,4809,4963,4830,4903,4878,5011,4928,4925,4942,4958,4901,4946,4809,4903,4995,4856,4758,4769,4892,4881,4880,4874,4911,4949,4855,4847,4921,4842,4888,4818,5050,5020,4911,4940,4892,5024,4925,5002,4996,4944,4903,4917,4969,4871,4931,4925,4817,4899,4905,4860,4844,4924,4841,4967,4847,4862,4987,4824,4858,4830,4813,4678,4994,4832,4832,4866,4926,4897,4854,4960,4907,4926,4800,4770,4888,5037,4974,4937,4904,4835,4943,4937,4888,4934,4891,5002,4941,4893,4852,4965,4830,5008,4851,4821,4976,4935,4890,4726,5017,4764,4858,4946,4928,4995,4880,4903,4904,4865,4884,4740,5010,4875,4984,4889,4863,4957,4876,4843,4890,4876,4881,4990,4887,4779,4942,4800,4850,4915,4941,4780,5002,4864,4837,4862,4823,4930,4874,5014,4881,4912,4901,4846,4999,4852,4911,4936,4816,4912,4935,4966,4793,4829,4969,4879,4891,4867,4823,4909,4782,4746,4821,4789,4867,4806,4863,4910,4974,4852,5073,4902,5025,4936,4895,4909,4805,4855,4842,4837,4899,4829,4947,4883,4923,5027,4887,4812,4832,4821,4847,4918,4967,4967,4732,4859,4925,4885,4990,4898,4926,4862,5042,5083,4993,4836,4733,4879,4930,4817,4801,4855,4898,4859,4853,4951,4813,4866,4866,4849,4975,4792,4861,4917,4885,5008,4844,4907,4879,4953,4978,4976,4836,4981,4864,4922,4840,4895,4896,4894,4892,5009,4910,4815,4842,4781,5001,4972,4953,4961,4887,4839,4918,4886,4943,4808,4831,4962,4859,4902,4815,4935,4912,4915,4932,4925,5022,4846,5030,4845,4876,4948,4989,4903,4857,4962,4846,4917,4813,4978,4762,5013,4899,4964,4850,4778,4928,4861,4943,4805,4806,4794,4824,4881,4813,4801,4770,4890,4979,4855,4979,4864,4818,4812,4761,4877,5028,4845,4905,4815,4925,4950,4983,4849,4846,4932,4960,4939,4863,4807,4934,4818,4847,4843,4842,4842,4949,4850,4969,4913,5009,4773,4890,4949,4961,4829,4953,4760,4949,4936,4941,4831,4892,4895,4844,5029,4802,4946,4866,4930,4967,4855,4832,4913,4881,4800,4825,4962,4878,4962,4860,4920,4946,4945,4910,4845,4780,4887,5068,4839,4864,4815,4716,4902,4862,4819,4782,5070,4885,4944,4919,4843,4947,4908,4850,4870,4800,4870,4863,4971,5010,4909,4915,4708,4871,4753,4908,4874,4798,4855,4781,4821,4924,4835,4994,4879,4921,4933,4893,4893,4910,4938,4833,4774,4932,4878,4978,4857,4770,4860,4902,4886,4962,4932,4887,4858,4898,4916,4950,4874,4907,4971,4987,4964,4883,4813,5030,4939,4848,4834,4897,4829,4888,4858,4766,4919,4863,4827,4905,4833,4942,4822,4915,4871,4712,4843,4937,4829,4821,4947,4844,4860,4663,4847,4921,4880,4854,4987,4954,4908,4847,4965,4753,4875,4980,4873,4894,4830,4861,4990,4925,4977,4742,4901,4871,4902,5038,4965,4809,4867,4913,4710,4882,5006,4803,5043,4987,4809,4796,4970,4848,4807,4937,4969,4806,4868,4807,4827,4953,4925,4944,4934,4796,5009,4942,4971,4831,4944,4885,4797,4896,4777,4916,4867,4856,4855,4829,4763,4980,4997,4984,4949,4867,4888,4860,4830,4925,4725,4753,4908,4788,4778,4965,4992,4918,4956,4881,4896,4904,4810,4785,5017,4915,4855,4921,4832,4826,4844,4796,4978,4771,4859,4924,4777,4883,4814,4858,4929,4946,4823,4858,4934,4845,4951,4921,4791,4755,4939,4903,4903,4862,4861,4853,4789,4904,4854,4895,4961,4973,4998,4824,4985,4890,4955,4885,4874,4852,4981,4984,4941,4930,4949,5013,4886,4830,4824,4902,4868,4853,4907,4862,4831,4810,4910,4890,4874,4848,4919,4851,5045,4920,4831,4886,4902,4874,4856,4726,4776,4945,4889,4816,4845,4756,4969,4970,4913,4763,4848,4764,4975,4926,4803,4944,4909,4873,4878,4782,4844,4950,4951,4850,4917,4893,4835,4905,4819,4865,4865,4842,4917,4837,4880,4902,4913,4827,4747,4929,4839,4749,4926,4852,4824,4772,4872,4875,4777,5001,4874,4904,4755,4745,4957,4761,4947,4900,4918,4827,4848,4915,4930,5013,4810,4928,4840,4991,4858,4778,4958,4780,4964,4859,4844,4941,4928,4864,4788,5035,4879,4920,4909,4808,5038,4838,4923,4837,4971,4801,4876,4866,4909,4841,4865,4946,4918,4931,4711,4901,4880,4941,4877,4746,4937,4869,4818,4845,4908,4973,4874,4730,4835,4822,4977,4970,4749,4897,4896,4840,4845,4804,4918,4855,4863,4860,4856,4988,4829,4970,4798,4847,4969,4875,4897,4938,4840,4867,4905,4992,4910,4780,4841,4875,4920,4866,4901,4962,4764,4916,4896,4941,4794,4798,4897,4989,4809,4907,4858,4910,4821,4768,4800,4814,4889,4866,4839,4983,4938,4943,4807,4898,4906,4827,4832,5010,4905,4856,4919,4875,4961,4912,4949,4826,4790,4737,4888,4831,4897,4908,4754,4916,4832,4881,4833,4986,4760,4966,4882,4726,4963,4817,4766,4831,4983,4826,4764,4814,4844,4927,4876,4826,4811,4853,4853,4777,4855,4855,4813,5000,4988,4793,4850,4792,4887,4893,4845,4785,4754,4974,4858,4915,4808,4875,4821,4870,4865,4765,4818,4862,4926,4954,4927,4815,4830,4934,5045,4833,4896,4781,4893,4804,4947,4841,4922,4823,4780,4806,4780,4815,4882,4996,4850,4807,4781,5012,4923,4841,4803,4910,4846,4895,4922,4903,4738,4911,4796,4907,4858,4927,4841,4930,4858,4900,4886,4936,4908,4857,4889,4894,4887,4996,4830,4959,4820,4732,4724,4852,4972,4824,5010,4887,4783,4900,4889,4936,4887,4849,4845,4885,4900,4708,4935,4868,4887,4937,4748,4803,4907,4911,4898,4983,4956,4790,4875,4980,4983,4839,4887,4733,4755,5005,4975,4877,4906,4886,4807,4864,4952,4896,4896,4816,4836,4843,4839,4780,4925,4900,5023,4869,4828,4855,4922,4895,4853,4876,4919,4921,4855,4919,4940,4886,4904,4905,4854,4640,4739,4876,4861,4882,4905,4749,4925,4811,4974,4985,4894,4850,4882,4885,4760,4789,4958,4929,4879,4830,4989,4914,5011,4865,4851,4875,4905,4873,4926,4889,4860,4784,4763,4994,5063,4773,5000,4833,4995,4824,4715,4848,4853,4775,4865,4853]},{"counters":[4938,4896,4856,4881,4755,4943,4836,4952,4865,4900,4784,4930,4958,4904,4836,4844,4920,4998,4762,4774,4893,4883,4829,4902,4837,4948,4860,5029,4852,4912,4790,4843,4946,4874,4882,4998,4958,4812,4834,4872,4883,4957,4713,4881,4795,5080,4911,5049,4871,5004,4835,4928,4866,4939,4934,4837,4820,4788,4796,4984,4924,4869,4782,4875,4856,4989,4913,4835,4941,4768,5011,4761,4893,4845,4827,4956,4906,4882,4896,4950,4946,4938,4801,4959,4857,5073,4961,4890,4865,4808,4925,4968,4878,4868,4854,4779,4762,4995,4880,4901,4882,4814,4869,4939,4760,4926,4917,4872,4771,4827,4913,4923,4932,4979,4924,5010,4850,4866,4820,4876,4773,4901,4900,4852,5011,4879,4942,4903,4801,4974,4927,4826,4799,4925,4904,4836,4852,4929,4773,4971,4821,4780,4920,4939,4865,4798,4813,4836,5011,4962,4901,4925,4869,4873,4811,4890,4849,4988,4832,4758,4906,4861,5037,4913,4974,4909,4888,4924,4865,4759,4901,4838,4963,4820,4904,4889,4964,4819,4807,4974,4893,4926,4857,4855,4928,4807,4878,4883,4955,4875,4895,4901,4968,4775,4917,4888,4859,4818,4893,4876,5022,4925,4943,4889,4758,4856,4854,4756,4910,4951,4825,4781,4780,4848,4947,4931,5126,4933,4923,4916,4977,4729,5022,4894,4842,4924,4817,4884,4915,4999,4894,4893,4905,4892,4770,4904,4913,4866,4955,4809,4724,4901,4998,4784,4951,4840,4845,4869,4900,4976,5049,4888,4809,4955,4937,4869,4776,4826,4937,4899,4872,4847,4799,4763,4849,4934,4917,4930,4876,5079,4788,4892,4860,4926,4971,4811,4961,4887,4918,4938,4910,4880,4710,4835,4928,4965,4841,4792,4744,4972,4873,4865,4866,4869,4835,4854,4831,4947,4925,4768,4882,4880,4889,4909,4925,4763,4857,4917,4879,4872,4815,4965,4950,4843,4963,4911,4781,4935,4777,4902,4959,4862,4862,4935,4818,4848,4846,4974,4734,4828,5064,4883,4805,4892,4874,4928,4876,5023,4866,4884,4902,4798,4826,4842,4876,4885,4878,4808,4966,4931,4918,4813,4706,4900,5007,5047,4888,4937,4962,4813,4929,4902,4809,4916,4866,4865,4820,4990,4770,4831,4922,4972,4942,4936,4869,4860,4910,4931,4902,4935,4904,4936,4831,4840,4926,4947,4801,4935,4789,4829,4783,4901,4885,4861,4846,4934,4880,4746,4794,4829,4868,4936,4742,4834,4954,4882,4941,4881,4891,4853,4814,4836,4866,4835,4822,4915,4766,4890,4851,4855,4758,4829,4913,4756,4812,4910,4920,4909,4867,4846,4820,4887,4912,4871,4846,4842,4878,4862,4839,4855,4931,4853,4873,4920,4948,4882,4940,4842,4851,4858,4951,4678,4954,4805,4926,4915,5065,4911,4922,4949,4962,4765,4879,4949,4956,5001,4861,4764,4927,4886,4874,4916,4996,4895,4834,4896,4889,4879,4800,4887,4873,4870,4763,4923,4946,4767,4930,4995,4889,5014,5043,4797,4925,4861,4926,4817,4923,4800,4810,4883,4861,4967,4848,4944,4783,4881,4912,4830,4928,4988,4865,4955,4843,4922,4903,4837,4856,4888,4953,4939,4922,4905,4988,4896,4901,4982,4766,4845,4922,5022,4874,4847,4842,4842,4806,4881,4906,4934,4952,4825,4818,4848,4824,4934,4953,5000,4834,4773,4836,4908,5006,4810,4876,4982,4891,4899,4941,4816,4811,4890,4745,4894,4775,4908,4926,4770,4825,4850,4883,4973,4904,4907,4847,4816,4914,4972,4938,4930,4792,4946,4863,4889,4874,4820,4983,4880,4857,5003,4909,4899,4886,4762,4909,4930,4905,5008,4879,4791,4885,4898,4861,4933,4789,4976,5007,5040,4790,4865,4868,4974,4980,4798,4840,4900,4923,4813,4947,4889,4990,4932,4763,4852,4918,4918,4901,4905,4933,4898,4972,4860,4993,4848,4816,4809,4878,4984,4945,4750,4839,4917,4836,4936,4755,4925,4838,4856,4907,4916,4927,4837,4938,4857,4856,4896,4732,4830,4869,4959,4809,4874,4815,5019,4874,4956,5006,4868,4922,4843,4881,4886,4956,4909,4862,4703,4884,4857,4961,4700,4898,4826,4930,4842,4817,4847,4872,4760,4858,4900,4862,4840,4731,4822,4941,4850,4895,4850,4900,4890,4974,4940,4923,4852,4838,4847,4881,4883,4825,4883,4858,4874,4855,4951,4940,4845,4858,4875,4760,4808,4898,4851,4777,4819,4890,4959,4895,4696,4771,4769,4782,4840,4839,4907,4896,4745,4800,4849,4883,4807,4845,4952,4995,4880,4828,4795,4878,4769,4817,4947,4844,4945,5036,4830,4850,4829,4775,4877,4841,4795,4920,4892,4812,4730,4927,4924,4781,5003,4884,5005,4898,4917,4962,4878,5006,4932,4878,4835,5005,4914,4828,4934,4802,4930,4778,4917,4780,4875,4817,4908,4878,4721,4866,4861,4968,4828,4887,4980,4804,4955,4883,4923,4744,4986,4899,4919,4809,4967,4851,4800,4972,4660,4806,4877,4759,4973,4960,4867,4854,4953,4857,4981,4928,4921,5109,4865,4842,4859,4849,4988,4975,5038,4826,4731,4824,4866,4782,4833,4781,4802,4872,4898,4870,4914,4917,4972,4788,4963,4854,4855,4985,4891,4872,4856,4944,4860,4847,4943,4801,4899,4857,4872,4937,4873,4843,4969,4721,4928,4798,4828,4861,4884,4832,4834,4935,4974,4933,4839,4858,4837,5041,4803,4938,4871,4871,4896,4791,4870,4883,4885,4889,4858,4897,4868,4899,4831,4878,4785,4991,4848,4996,4958,4877,4931,4977,4931,4867,4849,4798,4949,4780,4812,4894,4848,4813,4859,4953,4914,4887,4866,4813,4887,4954,4955,4835,4822,4853,4906,4957,4942,5065,4969,4766,4932,4810,4952,4975,4870,4851,4937,4933,5004,4864,4816,4940,5010,4838,4786,4998,4815,4824,4892,4803,4955,4902,4882,4907,4925,4964,5034,4927,4853,4902,4763,4956,4820,4767,4989,4825,4936,4897,4841,4844,4932,5048,4828,4992,4885,4891,4911,4880,4847,4774,4920,4888,4840,4887,4854,4924,4984,4781,4827,4800,4988,4819,4801,4835,5020,4780,4969,4916,4753,4782,4845,4960,4944,4892,4864,4920,4913,4958,4972,4844,4814,4774,4911,4832,4828,4862,4814,4889,4767,4863,4830,4851,4905,4882,4813,4888,4815,4886,4775,5102,5002,4882,4916,4892,4784,4871,4883,4896,4802,4936,4974,4759,4726,4952,5011,4930,4883,4855,4868,4895,4819,4916,4906,4796,4731,4871,4818,4852,4858,4769,4778,4959,4922,4855,4904,4843,4873,4880,4895,4881,4831,4844,4935,4860,4845,4981,4920,4850,4886,4855,4942,4953,4782,4865,4854,4907,4927,5008,4916,4913,4838,4840,4881,4970,4941,4767,4858,4862,4886,4871,4750,4948,4862,4854,4839,4882,4934,4850,4832,4875,4877,4940,4809,4869,4874,4862,4912,4851,4867,4898,4940,4917,4985,4934,4902,4799,4855,4876,4868,4845,4959,4836,4830,4885,4915,4819,4900,4952,4996,4807,4784,4850,4714,4817,4924,4864,5016,4845,4919,4917,5011,4962,4834,4907,4956,4894,4940,4923,4883,4770,4753,4882,4747,4832,4820,4861,4884,4833,4922,4874,4983,4888,4909,5019,4854,4925,4806,4833,4843,4841,4915,4941,4961,4971,4942,4924,4938,4880,4771,4837,4824,4788,4945,4956,4864,4777,4897,4922,4880,4940,4852,4835,4867,4928,4947,4862,4831,4828,4878,4907,4870,4946,4669,4964,4912,4914,4976,4908,4869,5002,4780,4940,4934,5032,4929,4983,4802,4919,4825,4912,4870,4941,4915,4971,4866,4860,4888,4874,4848,4958,4779,4933,4859,4884,4816,4841,4796,4974,4874,4800,4898,4844,4973,5061,4934,4951,4885,4846,4983,4889,4816,4905,4964,4858,4913,4955,4936,4988,4989,4843,4915,4795,4918,4829,4822,4827,4851,4951,4880,4923,4884,4768,4887,4903,4945,4898,4918,4804,4804,4840,5010,4865,4871,4855,4963,4894,4948,4834,4948,5068,4931,4898,5025,4845,4911,4851,4914,4825,5050,4799,4964,4824,4856,4908,4917,4905,4866,4871,4913,4716,4794,4796,4844,4880,4979,4724,4900,4883,4839,4970,4868,4836,4892,4769,5024,4800,4752,4892,4883,4968,4867,4965,4972,4852,4906,4834,4796,4781,4899,4891,4883,4745,4919,4782,4790,4943,4971,4783,4770,4998,4871,4835,4800,4801,4924,4790,4899,4864,4776,4874,4736,4725,4991,4879,4750,4848,4915,4864,4831,4734,4976,4897,4947,4787,4967,4986,4751,4942,4779,4864,4828,5057,4985,4805,4836,4977,4974,4751,4832,4941,4853,4876,4827,4939,4883,4989,4973,4955,4844,4973,4932,4876,4967,4914,4938,5000,4828,4995,4960,4855,4862,4792,4870,4875,4919,4880,4892,4835,4847,4765,4885,4980,4880,4885,4890,4853,4824,4936,4879,4795,4967,4818,4787,4908,4844,4812,4855,4874,5000,4883,4901,4932,4964,4921,4915,4928,4861,4861,4816,4967,5078,4779,4846,4848,4773,4778,4749,4925,4955,4827,4844,4879,4773,4859,4801,4902,4740,4921,4854,4962,4783,4896,4907,4957,4952,4822,4970,4846,4947,4804,4990,4801,4951,4892,4916,4997,4877,4969,4863,4931,4899,4871,4881,4997,4832,4967,4791,4904,4911,4759,4806,4942,4885,4903,4910,4901,4734,4821,4817,4950,4874,4759,4889,4915,4896,4938,4825,4788,4988,4793,4837,4769,4960,4856,4775,4828,4930,4888,4930,4918,4838,4903,4798,4782,4893,4804,4844,4855,4973,4816,4951,4788,4834,4925,4927,4877,4995,4847,4807,4915,4911,4903,4931,4874,4886,4828,4888,4946,4881,4891,4896,4825,4940,4981,4866,4869,4880,4908,4725,4836,4892,4837,4940,4859,4839,4944,4919,4949,4811,4841,4894,4793,4995,4816,4835,4891,4975,4923,4848,4900,4793,4783,4851,4887,4884,4792,5024,4787,4852,5080,4875,4961,5044,4946,4951,4867,4818,4869,5044,4884,4930,4863,4833,4929,4935,4833,4925,4830,4805,4840,5040,5002,5032,4934,4978,4946,4902,4932,4871,4943,4853,4862,4924,4867,4970,5043,4948,5000,4877,4911,4959,4911,4906,4923,4883,4794,4776,4747,4807,4796,4930,4757,4921,4701,5013,4928,4859,4835,4873,5034,5014,4940,4913,4840,4853,4917,4786,4949,4876,4937,4970,4748,4889,4851,4719,4801,4728,4908,4913,5043,4962,4848,4835,4878,4935,4824,4885,4845,4936,4847,4915,4826,4862,4905,4830,4889,4823,4907,4886,4889,5084,4946,4979,4816,4881,4992,4920,4948,4842,4897,4889,4803,4875,4813,4878,4896,4942,4873,4981,4933,4845,4940,4797,4873,4835,4836,4789,4896,4823,4861,4866,5037,4829,4896,4859,4944,4899,5001,4882,4853,4917,4863,5054,4842,4920,4941,4981,4925,4851,4732,4897,4904,4895,4895,4737,4925,4944,4869,5006,4956,4811,4973,5031,4981,4787,4918,4842,4819,4823,4852,4861,4814,4900,4963,4923,4872,4898,4923,4785,4749,4776,4865,4924,4900,4872,4922,4886,4877,4761,4864,4850,4908,5003,5022,4873,5027,4911,4765,4768,4882,4881,4843,4799,4854,5009,4944,4892,4988,4702,4888,4920,4951,4794,4890,4786,4985,4910,4720,4811,4874,4862,4801,4882,4942,4874,4896,4879,4914,5053,4974,4835,4866,4854,4795,4937,4897,4913,4835,4835,4886,5007,4877,5023,4900,4961,4846,4818,4805,4875,4994,4733,4860,4762,4960,4879,4899,4858,4872,4959,4806,4998,4974,4865,4956,4911,5023,4941,4799,4828,4870,4756,4817,4912,4768,4903,4783,4848,4702,4840,4895,4914,4857,4924,4884,4851,4758,4736,4969,4979,4928,5014,4904,4913,4769,4781,5026,5043,4854,4794,4833,4807,4811,4871,4962,4881,4938,4841,4898,4825,4739,4907,4934,4829,4831,4885,4918,4896,5049,4861,4892,4827,4913,4860,4980,4739,5124,4828,5005,4927,4894,4875,4896,4933,4894,4884,4837,4905,4869,4853,4816,4801,4944,4964,4782,4915,4884,5027,4887,4937,4716,4967,4830,4762,4910,4832,4845,4908,4811,4919,4813,4816,4895,4915,4802,4877,4872,4842,4906,4950,4873,4808,4811,4886,4969,4846,4935,4826,4889,4892,4857,4898,4909,4976,4838,4890,4815,4792,4861,5027,5026,4953,4826,4794,4819,4917,4894,4965,4886,4867,4767,4889,4902,4890,4886,4927,4917,4853,4868,4967,4853,4893,4916,4909,4891,5056,4882,4880,5007,4962,4928,5021,4908,4962,4840,4885,4907,4776,4915,4862,4880,4841,4905,4898,4995,4898,4957,4788]},{"counters":[4835,4819,4810,4963,4830,4859,4818,4875,4896,4857,4889,4946,4795,4931,4835,4896,4891,4897,4859,4900,4881,4857,4903,4833,4973,4906,5065,4934,4923,4866,4859,4745,4846,4973,4906,5006,4889,4988,4832,4889,4886,4841,4875,4994,4792,4842,4809,4950,4901,5036,4831,4868,4966,4847,4975,4837,4905,4896,4928,4937,4807,4861,4965,4812,4697,4979,4905,4840,4761,4890,4858,4967,4966,4887,4897,4906,4890,4985,4957,4941,4903,4978,4956,4890,4797,4826,4792,4956,4870,4914,4844,4905,4936,4908,4879,4962,4975,4929,4945,4850,5026,4858,4786,4830,4987,5015,4938,4921,4739,4831,4871,4908,5034,4880,4928,4837,4973,4817,5054,4956,4967,4883,4878,4952,4920,4939,4981,4838,4949,4825,4943,4948,4907,4882,4849,4809,4853,4905,4970,4945,4821,4894,5033,4817,4837,4874,4834,4929,5011,4920,4895,4750,4894,4786,4907,4799,4846,4915,4953,4899,4897,5016,4926,5000,4964,4862,4834,4820,4857,4892,4829,4976,4835,4801,4714,4644,4894,4974,4872,4820,4759,4815,4919,4841,4927,4921,4857,4776,4853,4847,4798,4861,4845,5012,4913,4942,4957,4820,4928,4836,4860,4900,4817,4911,4882,4909,4932,5070,4925,4784,4775,4730,4976,4947,4806,4809,4820,4882,4971,4898,4877,4754,4848,4957,4834,4924,5004,4804,4856,4726,4879,4810,4813,4778,4975,4744,4809,5013,4969,4845,4877,4909,4850,4909,4825,4847,4823,4820,4890,4899,4827,4866,4784,4921,4794,4831,4829,4992,4902,4767,4955,4930,4977,4922,4953,4798,4817,4933,4934,4834,4913,4851,4792,4879,4896,4902,5047,4886,4867,4751,4871,4873,4877,4908,4873,4848,4928,5041,4863,4932,4792,4979,4942,4769,5014,4926,4888,4821,4983,4729,4842,4925,4951,4866,4804,4964,4971,5018,4925,4873,4857,4819,4892,4926,4796,4823,4808,4878,4782,4860,4893,4858,4786,4917,4874,4898,5043,4942,4813,4824,4845,4887,4856,4911,5064,4859,4791,4931,4877,4916,4968,4957,4926,4976,4734,4904,4894,4799,4834,4878,4860,4850,4847,4809,4863,4931,5002,4892,4941,4855,4824,4988,4837,4875,4735,4810,4837,4935,4808,4964,4790,4875,4857,4694,4903,4831,4914,4840,4913,4892,4869,4930,4833,4821,4805,4792,4851,4825,4855,4983,4954,4722,4877,4838,4980,4821,4844,4832,4957,5015,4995,4902,5008,4941,4908,4956,4744,4976,4762,4903,4746,4936,4906,4895,4828,4904,4872,4868,4893,4972,4749,4905,4867,4924,4931,4751,4874,4927,4866,5089,4882,4818,4883,4761,4886,4991,4887,4770,5010,4913,4885,4727,4809,4861,4840,4812,4826,4900,4798,4840,5002,4897,4791,4869,4890,4735,4873,4882,4780,4935,4878,4909,4912,4883,4903,4834,4804,4948,4796,4857,4847,4935,4865,4827,4833,4865,4928,4860,4958,4852,4950,4856,4809,4814,4962,4923,4865,4844,4814,4836,4940,4871,4873,4881,4990,4857,4798,4793,4864,4778,4899,4808,4843,4944,4879,4931,4912,4908,4809,4913,4795,4839,4907,4837,4854,4908,4800,4839,4964,4956,4729,4960,4865,4947,4800,4964,4918,4908,4942,4955,5014,4879,4866,4831,5047,4773,4857,4926,4807,4908,4826,4897,4787,4817,4885,4771,4821,4805,4847,4794,4853,4894,4883,4855,4787,4841,4876,4875,5002,4917,4981,4876,4908,4909,5091,4914,4912,4946,4906,4912,4830,4968,4823,4953,4818,4829,4948,4936,4965,4772,4985,4928,4807,4856,4896,4930,4845,4853,4832,4755,4893,4858,4933,4854,4873,4735,4822,4901,4947,4833,4898,4883,4912,4876,4865,4821,4894,5000,4903,4835,4959,4865,4814,4923,4942,4907,4918,4898,4924,4876,5025,4879,4933,4903,4842,4911,4888,4903,4846,4865,4916,4901,4722,4861,5007,4911,4942,4872,4846,4899,4877,4889,5049,4923,4981,4906,4860,4839,4941,4782,4874,4852,4785,4796,4832,4794,4853,4848,4930,4878,4916,4903,4943,4822,4938,4906,5007,4991,4928,4970,4963,4964,4853,4946,4919,4848,4844,4888,4911,4915,4942,4919,4858,4894,4778,4918,4929,4833,4907,4899,4831,4881,4823,4854,5030,4773,4933,4795,4767,4928,4909,4887,4849,4885,4859,4886,4883,4939,4928,4808,4788,4879,4980,4912,4881,4882,4824,4758,4868,4923,4840,5038,4810,4857,4966,4920,4799,4754,4822,4890,4818,4928,4899,4889,4914,4718,4845,4754,5085,4880,4944,4843,4863,4992,4947,4955,4930,4908,4926,4987,4911,4792,4963,4876,4991,4781,4930,4847,4896,4966,4707,4943,4990,4936,4935,4887,4804,4872,4987,4760,4982,4844,4877,4925,4916,4751,4892,4723,4904,4906,4956,4807,4895,4748,4924,4853,4780,4795,4692,4820,4859,4916,4846,4722,4936,4909,4976,4885,4969,4807,4880,4834,4748,4875,4908,4893,4906,4870,4906,4879,4864,4835,4893,4806,4964,5059,4957,4895,4856,4880,4980,4815,4959,4824,4850,4939,4883,4898,4928,4827,4873,4915,4878,4815,4870,4998,4900,4998,4924,4930,4912,4782,4814,4826,4946,4900,4823,4896,5084,4793,4785,4956,4823,4970,4828,4863,4970,4831,4876,4936,4787,4961,4904,4842,4849,4919,4879,4852,4960,4937,4890,4920,4892,4872,4796,4831,4907,4874,4993,4816,4972,4874,4887,4877,4739,4824,4910,4943,4908,4891,4948,4985,4815,4843,4828,4859,4958,4857,4909,4964,4829,4798,4811,4843,5063,4848,4813,4858,4889,4933,4875,4819,4835,4847,4840,4741,4849,4873,4926,4961,4844,4759,4844,4805,4801,4890,4941,4879,4862,4784,4807,4775,4807,4967,4938,4980,4857,5018,4777,4949,4811,4950,5025,4891,4935,4756,4928,4851,4947,5025,5025,4859,4856,4836,4813,4947,4809,4739,4873,4948,4906,4900,4914,4830,4967,4903,4844,4871,4977,4864,4869,5026,4924,4888,4767,4836,4876,4797,4839,4808,4855,4851,4950,4936,4918,4923,4949,4908,5007,4892,4905,4989,4909,4797,4896,4865,4877,4882,4859,4825,4849,4861,4855,5024,4847,4935,4841,4898,4924,4876,5009,4917,4886,5003,4912,4914,5029,4876,4840,4875,4890,5107,4911,4840,4893,4841,4843,4923,4850,4803,4938,4937,4980,4819,5003,4915,4996,4862,4916,4899,4884,4838,4756,4867,4957,4839,4843,4786,4919,4859,4811,4882,4805,5033,4828,4861,4889,4785,4850,4839,4884,4946,4863,4811,5009,4861,4800,4876,4857,4991,5006,4815,4985,4925,4827,4856,4855,4733,4670,4952,4823,4871,4863,4929,4821,4925,4785,4907,4834,4853,4948,4861,4832,4929,4952,4885,4786,4797,4924,4863,4784,4945,4815,4966,4860,4903,4851,4907,4956,4943,4900,5001,4958,4948,4935,4763,4950,4921,4833,4993,4789,4920,4877,4918,4826,4818,4954,4918,4931,4965,4831,4966,4887,5048,4889,5012,4777,4856,4742,4831,4790,4939,4985,4865,4975,5055,4946,4929,4978,5041,4941,4866,4818,4659,4925,5023,4889,4847,4808,4872,4827,4907,4850,4843,4859,4932,4931,4862,4867,4991,4833,4883,4921,4816,4983,4883,4967,4846,4852,5008,4927,4874,4798,4815,4954,5033,4718,4932,4946,4941,4725,4843,4968,4904,4938,4961,4906,4950,4838,4719,4872,4976,4873,4854,4961,4933,4911,4781,4853,4807,4916,4870,4768,4943,4844,4939,4816,4874,4913,4787,4864,4958,4886,4950,4772,4838,4975,4893,4905,4881,4875,4837,4938,4942,4874,4875,4887,4928,4863,4857,4755,4969,4811,4785,4810,4936,4857,4920,4809,4867,4875,4775,4807,4952,4925,4936,4816,4889,4846,4873,4852,4875,4892,4950,4897,4923,4982,4911,4865,4941,4845,4887,4893,4843,4756,4867,4950,4954,4922,4888,4927,4729,4937,4896,4817,4841,4891,4888,4970,4901,4853,4934,4838,5072,4912,4868,4723,4830,4912,4912,4788,4904,4900,4733,4858,4885,4739,4957,4861,4789,4825,4851,4929,4855,4940,4917,4843,4740,4843,4888,4800,4874,4861,4940,4777,4846,4858,4939,4812,4963,4791,4930,5015,4905,4846,4834,4932,4871,4804,4834,4940,4928,4913,4937,4922,4859,4999,4810,4807,4891,4858,4798,4930,4742,4960,4911,4912,4921,4956,4964,4978,4957,4891,4865,4796,4906,4957,4898,4881,4906,4829,4885,4946,5001,4883,4914,4812,4853,4892,4850,5012,4824,4956,4858,4946,4836,4941,4867,4770,4879,4913,4886,4917,4927,4911,4960,4882,4853,4856,4947,4875,4867,4904,4748,4802,4978,4968,4942,4826,4800,4857,4795,4863,4940,4848,4903,4950,4978,4852,4928,4864,4949,4977,4828,4846,4951,4731,4817,4901,4885,4906,4805,4969,4803,4993,4796,4929,4850,4856,4809,4874,4922,4898,4862,4860,4888,4930,4806,4769,4888,4898,4808,4998,4936,4806,4889,4847,5005,4821,4805,4847,5010,4879,4971,4776,5004,4940,4930,4862,4828,4897,4930,4821,4762,4918,4923,4899,4786,4993,4893,4936,4978,4867,4935,4800,4872,4939,4816,4872,4850,4895,4923,4742,4976,5062,4772,4755,4896,4887,4806,4756,4780,4945,4843,4901,4880,4824,4951,4962,4811,4927,5071,4873,4905,4929,4964,4843,4969,4745,4912,4945,4840,4860,4942,4888,5019,4944,5024,4949,4930,5004,4785,4898,4896,4797,4940,4929,4879,4938,4763,4942,4873,4841,4952,4854,4841,4876,4820,4917,4870,4844,4863,4915,4814,4854,4885,4832,4923,4934,4923,4881,4793,4984,4884,4876,4888,5000,4922,4883,4833,4884,4903,4884,4866,4862,4874,4866,4857,4860,4840,4823,4966,4886,4840,4937,5029,4923,4845,4835,4784,4779,4913,4838,4903,4890,4875,4880,5034,4871,4897,4984,4884,4821,4870,4835,4985,5048,4917,4878,4795,4801,4893,4820,4827,4935,4883,4808,4847,4825,4973,4995,4783,4880,5044,4839,4917,4959,4981,4781,4934,4848,4945,4853,4859,4794,4942,4854,4888,4954,4868,4790,4767,4937,4936,4989,4910,4887,5018,4935,4909,4800,4930,4881,4860,4941,4919,4875,4881,4903,4938,4924,4890,4821,4906,4932,4838,4868,4819,4802,4966,4938,4881,4891,4874,4818,4779,4778,4738,4836,4939,4955,4901,4990,4840,4866,4946,4724,4851,4909,5007,4844,4757,4890,4921,4867,4870,4902,4926,4921,4923,4922,4955,4932,5001,4792,4954,4918,4981,4831,4878,4866,4852,4821,4931,4915,4868,4747,4904,4864,4920,4937,4801,4925,4841,4948,4920,4842,4927,4828,4878,4729,5007,5021,4889,4955,4920,4805,4931,4859,4860,4993,4828,4904,4846,4792,4961,4820,4805,4898,4877,4849,4948,4753,4921,4964,4865,4813,4934,4906,4924,4881,4767,4925,4792,4938,4841,4772,4921,4805,4824,4862,4876,4831,4904,4850,4769,4889,5012,4793,4902,4877,4933,4897,4908,4814,4927,4947,4881,4935,4928,4955,4768,4738,4961,4979,4978,4699,4823,4792,4828,4968,4891,4836,5055,4972,4844,4929,4999,4721,4757,4901,4886,4838,4831,4772,4723,4812,4886,4941,4869,4948,4793,4953,4847,4868,4896,5045,5002,4691,4888,5001,4830,4865,4887,4950,4872,4995,4915,4781,4757,4874,4877,4841,4835,4786,4935,4884,4815,4948,4841,4863,4883,4841,4713,4913,4787,4909,4990,4879,4948,4953,4820,4810,4848,4831,4865,4870,4742,4888,5017,4973,4828,4843,4918,4774,4829,4836,4968,4855,4815,4915,4785,4836,4860,4816,4983,4859,4940,4945,4949,4994,4807,4753,4866,4863,4826,4780,4944,4870,4795,4725,4815,4857,4877,4916,4898,4919,4859,4950,4929,4808,4807,4848,4936,4686,4902,4729,4868,4711,4905,4936,4892,4845,4821,4902,4893,4936,4925,4906,4964,4847,4885,4996,4917,4932,4881,4920,5041,4873,4824,4931,4829,4756,4898,4994,4819,4812,4862,4829,4855,4875,4886,4830,4885,4900,4897,4971,4886,4837,4982,4910,4853,4968,4856,4865,4828,4780,4826,4943,4783,4865,4876,4858,4901,4872,4878,4844,4916,4910,4877,4950,4999,4797,4814,4821,4873,4925,5026,4896,4830,4920,4889,4989,4843,4830,4893,4859,5028,4812,4941,4865,4847,4904,4800,4833,4896,4844,4941,4884,4916,4929,5002,4907,4844,4800,4960,4934,4888,4812,4904,4818,4978,4924,4835,4915,4854,4961,4951,4838,4826,4802,4876,4798,4983,4950,4829,4907,4947,4942,4891,5003,4904,4865,4867,4696,4962,4863,4871]},{"counters":[4849,4943,4882,5004,4901,4948,4988,4874,4861,4834,4799,4986,4879,4834,4765,4820,4781,4941,4926,4916,4924,4971,4887,4977,4872,4856,4981,4890,4912,4975,4873,4913,5088,4823,4966,5027,4889,4788,4980,4838,4972,4834,4787,4785,4899,4995,4898,4927,4790,4962,4862,4814,4838,4896,4856,4934,4953,4841,4934,4813,4877,4913,4860,4863,4911,4836,4923,4801,4871,4809,4763,4698,4848,4944,4908,4928,4913,4930,4754,4912,4859,4979,4848,4815,4881,5090,4853,4972,4898,4966,4816,4809,4915,4980,4895,4933,4916,4856,4917,5006,4748,4717,4901,4900,4955,4891,4755,4794,4894,4827,4937,4906,4885,5015,4922,4863,4898,4826,4766,4837,4936,4893,4952,4850,4812,4858,4840,4870,4853,4831,4908,4855,4987,4999,4880,4839,5079,4883,4849,4815,4820,4858,4838,4884,4862,4889,4906,4875,4888,4957,4877,4910,4875,4847,4850,4943,4892,4915,4962,4909,5006,4891,4885,4978,4889,4801,4881,4928,4761,4965,5009,4822,4903,4876,4906,4737,4836,4946,4745,4876,4913,4873,4863,4897,4902,5003,4824,4863,4942,5012,4737,4784,4833,4698,4880,4931,4813,4869,4898,4894,4899,5039,4907,4979,4854,4751,4916,4871,4831,5007,4889,4802,4810,4941,4913,4947,4781,4955,4918,5082,4844,4796,4888,4863,4979,5016,4882,4810,4778,4802,4891,4872,4760,4916,4816,4808,4906,4753,4946,4956,4904,4832,4845,4898,4908,4769,4883,4700,4743,4881,4957,4826,4943,4949,4836,4844,4851,4922,4866,5027,4978,4886,4875,4920,4859,4769,4842,4943,4990,4819,4847,4886,4949,4867,4928,4891,4821,4757,4802,4904,4809,4958,4963,5011,4782,4890,4873,4895,4856,4910,4788,4829,4851,4848,4849,4809,4962,4827,4866,4940,4902,4858,4889,4894,4889,4901,4749,4891,4817,5008,5011,4920,5011,4791,4872,4927,4872,4798,4836,4898,4902,4920,4859,4849,4828,4869,4773,4909,4898,4948,4912,4847,4909,4765,4879,4834,4802,4902,4914,4949,4995,4852,4992,4950,4883,4894,5030,4911,4879,4874,4770,4821,4930,4907,4827,4886,4859,4813,4788,4940,4771,4849,4924,4906,4797,5019,4902,4958,4921,4773,4861,4887,4763,4886,4891,4788,4993,4940,4815,4958,4834,4993,4939,4973,4840,4865,4924,4946,4867,4850,4822,4863,4895,4867,4793,4930,4906,4850,4731,4870,4826,5024,4939,4899,4924,4842,4944,4796,4732,4827,4807,4975,4947,4926,4810,4964,4903,4967,4859,4788,4967,4918,4859,4981,5057,4858,4872,4908,4819,4957,4842,4813,4862,5042,4871,5056,4974,4730,4904,4911,4756,4852,4861,4877,4990,4881,4833,4873,4989,4888,4919,4993,4730,4953,4909,4971,4811,4872,4879,4788,4902,4815,4824,4900,4931,4899,4782,4833,4864,4870,4830,4973,4849,4831,4872,4975,4851,4973,4883,4880,4908,4837,5025,4902,4839,4871,4860,4887,4977,4880,4928,4850,4785,4967,4829,4911,4890,4830,4895,4947,4948,4957,4987,4983,4668,4720,4904,4902,4774,4910,4976,4865,4874,4808,4838,4904,4850,4763,4808,4876,4835,4898,4812,4822,4892,4961,4907,4928,4911,4954,4933,4866,4789,4909,4712,4844,4872,4756,4897,4956,4851,5055,4868,4855,4899,4818,4914,4868,4905,4827,4717,4872,4993,4871,4778,4793,4877,4843,4809,4845,4921,4863,4847,4915,4891,4881,4866,4959,4769,4865,4919,4846,4853,5046,4928,4870,4889,4778,4926,4873,4880,4914,4852,4917,5018,4894,4913,5021,4949,4972,4944,4816,4887,4856,4894,4888,4799,4962,4856,4869,4989,4880,4764,4885,4917,4832,4953,4873,4989,4871,4808,4830,4861,4884,4947,4887,4858,4845,4872,4927,4754,4762,4901,4925,4917,4969,4828,4774,4971,4971,4911,4827,4828,4925,4858,4886,4903,4881,4882,4933,4752,4849,4934,4949,4912,4953,4857,4928,4880,4831,4775,4940,4795,4858,4954,4863,4879,4936,4978,4877,4942,4862,4930,4911,4754,4872,4789,4944,4865,4844,4910,4998,4906,4910,4858,4824,4929,4747,4876,4822,4897,4815,4858,4828,4806,4881,4812,4900,4831,5004,5113,4989,4921,4727,4859,4892,4878,4878,4935,4903,4827,4891,4729,4922,4819,4819,4868,4909,4747,4782,4890,4858,4886,4880,4710,4958,4811,4818,4973,4950,4839,4996,4900,5041,4837,4930,4946,4763,4975,4907,5001,4901,4881,4886,4944,4895,4957,4841,4845,4846,4878,4882,4906,4933,4874,4908,4870,4973,5019,4897,4864,4848,4867,4849,4905,5010,4984,4942,4856,4882,5000,4814,4873,4928,4913,4884,4929,4895,5008,4759,4933,4989,4877,4843,4789,4872,4819,4917,4929,4913,4832,4824,4870,4939,4911,4924,4857,4849,4980,4869,4900,5009,4877,4980,4927,4939,4831,4855,4851,4867,4962,4875,4859,4786,4964,4770,4845,4977,4755,4877,4820,4947,4907,5086,4878,4797,4876,4860,4868,5024,4984,4922,4813,4963,4969,4931,4771,4943,4937,4899,4858,4911,4884,4929,4913,4908,4964,4912,4886,4746,4869,4959,4765,4876,4875,4979,4972,4897,4845,4950,4831,4754,4776,4955,4980,4886,4839,4909,4903,4951,4913,4814,4898,4910,4879,4860,4923,4877,4887,4869,4907,4838,4829,4939,4861,4804,4836,4890,4868,4821,4874,4804,4748,4739,4991,4938,4961,4820,4927,4714,4953,4804,4864,4883,4783,4860,5008,4966,4740,4780,4800,4979,4744,4897,4877,5122,4892,4877,4784,4947,4903,4923,4856,4968,4871,4739,4913,4922,4925,4859,4891,4890,4922,4865,4929,4859,4806,4818,4856,4825,4895,4921,4879,4987,4990,4897,4859,4821,4863,4907,4852,4733,4863,4828,4911,4897,4990,4872,5004,4768,4987,4888,4896,4877,4923,4937,4960,4896,5000,5034,4928,4947,4938,5078,4953,4851,4813,4850,4849,4791,4874,4912,4852,4816,4945,4908,4902,4918,4955,4972,5004,4825,4799,4900,4962,4860,4902,4866,4842,4783,4902,4872,4870,4841,4781,4878,4973,4823,4837,4930,4875,4946,4806,4824,4831,4974,4846,4840,4905,4863,4915,4845,4860,4805,4748,4932,4912,4910,4768,4848,4878,4858,4792,4854,5002,4886,5018,4775,4926,4853,4960,4843,4898,4776,4935,4815,5001,4926,4907,4779,4833,4803,4898,4789,4813,4860,4862,4908,4931,4950,4977,4829,5010,4798,4935,4972,4807,4976,4869,4857,4830,4822,4907,4870,4946,4833,4906,4974,4815,4930,5100,4948,4753,4849,4933,4963,4845,4871,4869,4833,4864,4984,4936,4803,4898,4919,4846,4828,5051,4903,4952,4809,4961,4758,4803,4861,4863,4916,4960,5012,4814,4911,4987,4708,4867,4908,4884,4815,4799,4860,4949,4979,5002,4868,4932,4812,4992,4969,4824,4907,4717,4796,4813,4840,4872,4897,4910,4920,4979,4924,4928,4847,4893,4802,4846,4883,4796,4787,4852,4953,4956,4860,4922,4981,4820,4841,4879,5038,4834,4951,4951,4868,4841,4844,4801,4860,4961,4722,5056,4864,4909,4917,4854,4940,4825,4780,4914,4869,4811,4886,4906,4914,5012,4881,4843,4953,4710,4801,4901,4873,4872,4816,4739,4844,4790,5022,4941,4920,4899,4780,4931,4900,4836,4826,4856,4907,4941,4885,4814,4804,4816,4924,4890,4930,5005,4943,4909,4731,4770,4800,4855,4925,4886,4890,4997,4891,4875,4825,4851,5007,4890,4799,4996,4904,4947,4895,4891,4925,4911,4915,4832,4854,4823,4869,4878,4894,4939,4991,4879,4824,4996,4816,4804,4923,4941,4907,4911,4813,4850,4896,4846,4909,4890,4907,4802,4875,4945,4981,4919,4895,4833,4984,5040,4835,4795,4858,4835,4857,4873,4842,4948,4887,4894,4938,4868,4930,4896,4868,4932,4915,4853,4837,4843,4887,4751,4982,4831,4804,4958,4921,4897,4948,4931,4810,4849,4831,4881,4939,4829,4839,4890,4953,4954,4889,4906,4747,4761,5000,4853,4894,4866,4997,4869,4844,4856,4919,4842,4891,4765,4841,5001,4878,4870,4990,4849,4938,4890,4992,4850,4940,4854,4937,4942,4737,5024,4878,4924,5008,4766,4968,4864,4837,4811,4878,4841,4873,4882,4813,4859,4758,4950,4868,4995,4940,4917,4795,4822,4917,4762,4712,4836,4838,4864,4996,4866,4771,4937,4892,4852,4822,4978,4842,4843,4949,4847,4817,5034,4931,4854,4855,4924,4802,4908,4891,4852,4864,4958,5028,4944,4831,4863,4960,5001,4885,4873,4761,4925,5043,4930,4828,4876,4753,4947,4756,4883,4950,4906,4941,4858,4839,4979,4799,4860,4904,4891,4786,4980,4904,4923,4916,4832,4782,4938,5040,4985,4966,4848,4953,4907,4861,4820,5010,4863,4942,4767,4925,4877,4845,5060,4973,4961,4934,4905,4841,4836,4813,4824,4865,4935,4992,4839,4748,4835,4884,4866,4806,4898,4818,4847,4783,4865,4871,4824,4866,5001,4864,4828,4859,4804,4875,4868,4751,4838,4753,4819,4859,4873,4980,4900,4928,4827,4928,4981,4780,4867,5013,4900,4951,4954,4931,4922,4940,4893,4946,4823,4961,4860,4881,4978,4902,4907,4913,4836,4924,4877,4930,4767,4881,4761,4800,4900,4832,4756,4954,4955,4962,4820,4888,4929,4861,4947,4950,4754,4925,4874,4865,4799,4821,4792,4951,4966,4831,4866,4833,4896,4919,4875,4995,4887,4832,4978,4919,4861,4922,4848,4881,4856,4853,5001,4879,4882,4884,4882,4834,4919,4941,4890,4915,4976,4810,4966,4917,4841,4913,4881,4967,5013,4866,4812,4842,4843,5026,4883,4858,4975,4854,4926,4893,4829,4882,5000,4894,4738,4857,4822,4851,4862,4950,4920,4907,4783,4913,4812,4877,4798,4831,4906,4872,4938,4785,4866,5015,5023,4814,4818,5042,4829,4963,4898,4934,4920,4848,4852,4938,4832,4947,4808,4834,4867,4728,4768,4788,4813,4831,4823,5002,4920,4841,4889,4923,4825,4880,4831,4932,4959,4835,4809,4861,4823,4870,4881,4905,4857,4812,4741,4928,4973,4826,4865,4729,4834,4859,4850,4852,4832,4923,4926,4902,4818,4977,4947,4921,4997,4840,4937,4941,4710,4925,4863,4878,4785,4832,4779,4937,5045,4809,4930,4731,4807,4978,4967,5065,4879,4939,4895,4790,4818,4962,4848,4829,4709,4895,4964,4857,4836,4961,4801,4784,4905,4875,4803,4787,4864,4925,4836,4883,4882,4959,4885,4871,4949,4871,4907,4863,4827,4986,4908,4902,4774,4909,4924,4929,4778,4961,4836,5006,4894,4802,4851,5011,4897,4844,4864,4945,4831,4871,4939,4783,4728,4946,4993,4954,4945,4830,4919,4726,4891,4782,4864,4825,4824,4945,4786,4890,4848,4876,4933,4934,4943,4954,4834,4923,4881,4816,4957,4847,4901,4882,4950,4880,4892,4898,4881,4857,4830,4766,4857,4918,4952,4979,4946,4859,4918,4842,4750,4901,4897,4850,4898,4900,4788,4963,4927,4821,4890,4784,4928,4828,4842,5025,4788,4938,4905,4907,4888,4900,4893,4775,4918,4907,4783,4900,4915,4920,4844,4955,4912,4881,4912,4843,4945,4904,4888,4985,4802,5001,4953,4764,4833,4881,4790,4990,4756,4864,4903,4874,4866,4881,4837,4963,4885,4779,4819,4852,4766,4915,4855,4828,4998,4827,4901,4871,4869,4975,4795,4813,4763,4930,4971,4773,4842,4908,4943,4950,4947,4880,4977,4882,4812,4884,4928,4857,4925,4840,4812,4873,4990,4781,4869,4917,4957,5048,4818,4867,4969,4838,5061,4947,4875,4875,4838,4775,4869,4710,4815,4900,4853,4908,4795,4928,4789,4911,4938,4754,5010,4792,4916,4906,4796,4837,4985,4884,4833,4977,4952,4911,4955,4910,4944,4735,4877,4775,4871,5013,4886,4883,4972,4816,4977,4815,5020,4895,4945,4877,4922,4932,4940,4854,4943,4766,4796,4956,4750,4878,4920,4903,4893,4858,4890,4893,4863,4933,4894,4918,4919,4919,4973,4962,4857,4795,4800,4888,4766,4792,4870,4839,4812,4801,4942,4837,4861,4854,4892,4865,4865,4851,4791,4858,4823,4977,4835,4870,5056,4853,4903,4857,4800,4948,4832,4898,4863,4858,4867,4928,4907,4868,4962,4790,4787,4879,4915,4964,4911,4794,4892,4981,4926,4840,4894,4955,4855,4839,4840,4808,4822,4888,4898,4823,4839,4932,4893,4855,4955,4912,4814,4896,4801,4834,4775,4908,4809,4916,4798,4890,4977,4888,4851,4908,4824,4865,4961,4869,4876,4811,4728,4887,4965,4925]},{"counters":[4734,4923,4813,4839,4887,4915,5035,4841,4797,5001,4862,4936,4875,4824,4895,4802,4910,4755,5010,4987,4930,4798,4861,4908,4982,4870,4809,4929,4897,4731,4755,5018,4913,4926,4846,5045,4967,4843,4896,4883,4920,4801,4926,4922,4968,4888,4932,4875,4900,4808,4910,4836,4935,4922,4851,4764,4889,5006,4812,5030,4861,4791,4851,4782,4875,4824,4912,4850,4894,4860,5019,4840,4908,4926,4844,4925,4881,4959,4944,4926,4879,4880,4822,4953,4878,4803,4894,4782,4840,4841,4865,4923,4836,4835,4745,4919,4915,5019,4852,4823,4875,4877,4899,5071,4974,4863,4915,4854,4755,4875,4810,4769,5045,4836,4917,4884,4845,4848,4854,4900,4827,4891,4876,4853,4943,4891,4931,4919,4926,4975,4867,4788,4928,4804,4879,4831,4793,4998,4878,4819,4904,4990,4876,4891,4896,4799,4868,4752,4974,4898,4742,4920,5001,4893,4781,4884,4877,4955,4876,5033,4924,4844,4931,4962,4788,4822,4878,4990,5001,4832,4943,4815,4858,5017,4986,4773,4973,4800,4963,4986,4948,4845,4811,4822,4834,4864,4772,4865,4878,5071,4935,4908,4898,4802,4894,4822,5014,4934,4892,4782,5001,4798,4901,4957,4879,4830,4921,4941,4846,4828,4894,4952,4772,4818,4857,4744,4892,5001,4885,4838,4969,4875,4809,4816,4912,4820,4726,4908,4805,4886,4789,4843,4948,4824,4673,5037,4936,4924,4829,4986,4849,4858,4879,4942,4902,4931,5028,4905,4876,4958,4868,4892,4885,4810,4885,4980,5005,4992,4859,4852,4745,4830,4897,4700,4889,4911,4725,4825,4847,4920,4877,4857,4788,4870,4826,4840,4841,4917,4874,4871,4909,4907,4937,4892,4927,4797,4842,4810,4871,4905,4681,4944,4842,4816,4816,4875,4949,4847,4923,4854,5017,4775,4790,4917,4970,4976,4841,4906,4841,4960,5013,4696,4866,4946,4850,4885,4897,4948,4827,4827,4880,4902,4843,4783,4835,5071,4803,4796,4937,4806,4984,4947,4853,4814,4757,4836,4966,4872,5041,4918,4868,4918,4957,4872,4881,4848,5025,4910,4906,4832,4755,4906,4950,4938,4957,4841,4905,4969,4874,4832,4914,4899,4928,4948,4886,4857,4873,5013,4839,4892,4923,4844,4891,4847,5005,4992,4922,4896,4828,4817,4860,4948,4814,4891,4938,4936,4921,4853,4884,4909,4845,4821,4918,4980,4877,4829,4916,4895,4943,4930,4857,4879,4768,4870,4890,4908,4841,4871,4980,4917,4916,4857,4768,4903,4930,4834,4800,4890,4833,4820,4936,4831,4949,4939,4861,4921,4901,4821,4860,4808,4825,4885,4866,4846,4900,4929,4956,4958,4692,4819,4844,4867,4781,4812,4833,4987,4801,5005,4860,4823,4807,4897,4833,4917,4953,4937,4905,4980,4958,4831,4890,4901,4816,4853,4929,4927,4854,4903,4830,4750,4914,5027,5002,4988,4966,4980,4917,4804,4800,4917,4937,4901,4893,4804,4833,4887,4882,4900,4804,4741,4896,4896,4785,4909,4928,4895,4879,4952,4911,4798,4867,4944,4853,4914,4839,4817,4865,4899,4868,4781,4900,4910,5003,4846,4829,4913,4894,4794,4959,4917,4959,4910,4927,4865,4794,4775,4971,4860,4805,4763,4862,4979,5001,4949,4837,4882,4918,4905,4951,4988,4961,4882,5006,4964,4879,4965,4918,4878,4986,4927,4920,4938,4981,4905,4847,4964,4909,4874,4944,4952,4954,4807,4881,4934,4781,4815,4836,4856,4765,4909,4848,4816,4895,4819,4954,4777,5007,4939,4954,4832,4842,4755,4871,4821,4987,4955,4907,4895,4895,4938,4873,4930,4828,4859,4795,4816,4904,4958,4879,4966,4978,4948,4933,4930,4906,4874,4869,4872,4997,4887,4821,4924,4843,4798,4857,4899,4887,4949,4792,4804,4943,4991,4946,4917,4862,4787,4789,4753,4894,4855,4943,4790,4770,4770,4827,5009,4860,4903,4893,4911,4765,4895,4815,4891,4934,4846,4967,4824,4947,4818,4909,4946,4717,4803,4858,4836,4892,4888,4865,4922,4858,4838,4829,4898,4978,4793,5006,4888,4883,4938,4976,4959,4910,4916,4953,5026,4836,4932,4804,4885,4985,4907,4904,4864,4825,4953,4914,4804,4891,4890,5053,4818,4736,4955,4836,4937,4749,4885,4827,4955,4809,4781,4899,4727,4920,4971,4917,4818,4780,4929,4846,4801,5000,4938,4763,5000,4924,4960,4923,4885,4886,4918,4967,4916,4853,4934,4891,4913,4977,4861,4876,4963,4839,4999,4821,4868,4841,4973,4926,4784,4938,4848,4827,4798,4834,4802,4966,4839,4852,4906,4881,4930,4913,4824,4872,4918,4890,4855,4997,4891,4845,4870,4951,4947,4961,4901,4780,4879,4867,4787,4832,4792,4828,4826,4915,4863,4862,4868,4856,4882,4724,4872,4827,4861,4853,4961,4949,5000,5047,5044,4890,4901,4881,4762,4900,4885,4923,4986,4831,4895,4894,4820,4885,4841,4787,4835,4981,4900,4858,4855,4942,4952,4979,4814,4984,4961,4939,5042,4944,4991,4870,4885,4856,4870,4891,4823,4842,4841,4983,4875,4816,4696,4850,4775,4901,4886,4901,4927,4870,5008,4881,4912,4823,4891,4946,4894,4849,4854,4861,4867,4819,4902,4967,4767,4968,4831,4892,4729,4809,4876,4906,4868,4949,4766,4820,4770,4754,4891,4966,4895,4883,4882,4824,4830,4913,4861,4783,4885,4836,4852,4839,4855,4791,4934,4925,4909,4938,5090,4904,4895,4892,4925,4825,4867,4817,4891,4812,4832,4786,4852,4925,4852,4868,4837,4913,4902,4856,4990,4784,4879,4934,4911,4840,4910,4829,4884,4909,4915,4894,4842,4914,4784,4959,4839,4877,4763,4937,4941,4668,4883,4915,4857,4919,4817,4786,4864,4764,4913,4974,4966,4881,4732,4811,4843,4816,4854,4800,4715,4870,4858,4969,4902,4991,4769,4740,4949,4896,4906,4837,4803,4906,4902,4870,4846,4762,4903,4718,4882,4945,4907,4815,4895,4843,4833,4836,4917,4914,4871,4919,4923,4830,4892,4835,4838,4868,4855,4904,4912,4844,4859,4947,4827,4801,4934,4865,4874,4957,4909,4951,4868,4806,4797,4889,4872,4782,4888,4853,4805,4906,4999,4889,4872,4807,4822,4786,4916,4953,4994,4889,4851,4830,4885,4841,4914,4872,4750,4984,4905,4785,4903,4814,4781,4887,4975,5029,4925,4912,5046,4792,4956,4857,4786,4912,4882,4863,4777,4853,4929,4903,4943,4850,4919,4961,4853,4894,4807,4934,4858,4888,4925,4891,4870,4949,4949,4784,4823,5017,4792,4861,4828,4860,4907,4945,4846,4902,4972,4861,4716,4830,4911,4964,4838,4838,5056,4842,4935,4980,4803,4868,5035,4889,4885,4846,4943,4844,4732,4804,4931,4850,4902,4878,4917,4957,5016,4815,4796,4871,4947,4924,4967,4956,4846,4836,4984,4962,4980,4894,4913,4803,5019,4909,4968,4794,4749,4930,4898,4827,4904,5003,4774,4786,4819,4919,4953,4866,4965,4797,4974,4825,4945,4865,4785,4905,4802,4939,4883,4973,4946,4874,4857,4925,4820,4854,4838,4989,4951,4928,5017,4883,4825,4804,4962,4910,4981,4867,4936,4831,4959,4883,4928,4880,4904,4821,4809,4942,4829,4870,4882,4792,4885,4903,4834,4906,4923,4908,5031,4926,4839,4884,4829,4911,4981,4874,4949,4870,4811,4794,4853,4800,4972,5037,4886,4785,4993,4917,4901,4969,4861,4898,4823,4836,4887,4793,4945,4916,4769,4820,4972,4971,4967,4965,4936,4909,4822,4902,4920,4773,4931,4837,4947,4926,4967,4895,4883,4856,4841,4717,4874,4822,4876,4867,4927,4772,4851,4859,4955,4898,4882,4837,4837,4844,4822,4975,4907,4880,4838,4876,4831,4888,4909,4825,4847,4903,4869,4846,4965,4981,4934,5015,4950,4890,4865,4891,4776,4820,4915,4869,4895,4799,4882,4888,4739,4900,4887,4924,4886,4834,4827,4774,4918,4860,4866,4889,4789,4811,4854,4748,4888,4989,4942,4827,4745,4879,4845,4834,4976,4867,4977,4837,4832,4853,4897,4921,4979,4856,4808,4745,4960,4709,4894,4834,4853,4960,4715,4875,4938,4875,4866,4944,4996,4809,4819,4991,4915,4860,4932,4990,4896,4844,4811,4845,4940,4772,4835,4764,4878,4921,4951,4910,4835,4757,4816,4878,4867,4913,4787,4849,4947,4966,4806,4916,4969,4859,4789,4850,4752,4810,4988,4858,4927,4998,4860,4785,4762,4964,5001,4961,4619,4918,4891,4940,4964,4792,4912,4822,4967,4701,4789,4854,4793,4923,4816,4942,4763,4887,4944,4862,4972,4844,4850,4874,4810,4858,4861,4793,4786,4835,4957,5030,5007,4924,4835,4872,4866,4860,4857,4844,4844,4876,4887,4950,4892,4876,4823,4856,4954,4902,4812,4900,4858,4880,4804,4888,4998,5058,4923,4882,4872,4921,4968,4872,4879,4792,4879,4803,4870,4979,4946,4974,4861,4765,4914,4908,4855,4843,4790,4889,5036,4808,4943,4868,4860,4817,4860,4859,4898,4819,4857,4847,4949,4771,4801,4942,4813,4927,4989,4798,4944,4979,4941,4834,4933,4817,4846,4731,4898,5016,4754,4891,4889,4996,4907,4847,4934,4790,4843,4913,4920,4908,4830,4896,4914,4714,4958,4954,4941,4896,4956,4963,5094,4972,4905,4810,4907,4912,4745,4949,5037,4878,4880,5010,4946,4830,4873,4876,4912,4952,4923,4985,4824,4869,4880,4933,4855,4840,4807,4984,4881,4824,4898,5055,5018,4856,4844,4927,4939,4863,4934,4964,4776,5045,4866,4910,4812,4843,4896,4926,4902,4804,4866,4902,4907,4826,4934,4868,4903,4925,4991,4886,4898,4885,5007,5066,4743,4840,4925,4910,4839,4900,4820,4860,4978,4823,4922,4882,4862,4927,4868,4825,4926,4803,4831,4883,4852,4952,4876,4904,4891,4922,4998,4872,4957,4801,4900,4754,4953,4882,4922,4948,4962,4832,4849,4924,4861,4890,4878,4795,4941,4948,4927,4813,4805,4908,4931,4957,4835,4939,4921,4761,4813,4843,4742,4883,4704,4878,4763,4812,4917,5000,5048,4865,4829,4932,4863,4889,4905,4938,4790,4901,4719,4787,4921,4909,4913,4889,4998,4965,4939,4769,4852,4809,4894,4992,4912,4834,4848,4848,4838,4878,4916,4832,4875,4842,4803,4879,4935,4948,4792,4920,4938,4945,4833,4822,4824,4784,4894,4883,4855,4929,4957,4912,5050,4833,4985,4992,4817,4955,4828,4759,4938,4861,4888,4980,4768,4854,4874,4920,4823,4904,4838,4742,4822,4967,4893,4750,4903,4933,4988,4888,4869,4925,4897,4814,4832,4866,4918,4820,4943,4883,4892,4849,4958,4824,4939,4815,4892,4825,4962,4897,4921,4882,4915,4952,4885,4959,4830,4770,4807,4840,4986,5043,4807,4915,4953,4880,4837,4899,4874,4985,4845,4973,4927,4894,4974,4877,4962,4888,4894,4906,4912,4869,4980,4792,4862,4881,4860,4884,4944,4983,4869,4864,4808,4821,4866,4783,4826,4950,4896,4923,4864,4761,4947,4966,4985,4885,4857,4851,4881,4777,4867,4956,4819,4907,4905,4953,4795,4923,4871,4943,4875,4912,4976,4875,4851,4887,4766,4866,4931,4807,4836,4893,4897,4896,4838,4890,4955,4760,4930,4806,4951,4963,4762,4881,4934,4883,4899,4970,4846,4753,4934,4934,4790,4883,4898,4874,4867,5085,4931,4888,4963,4923,4903,4722,4893,4917,4887,4868,4927,4848,4893,4885,4985,4999,4892,4913,4907,4864,4816,4807,4859,4946,4902,4937,5015,4829,4835,4947,4883,4974,4848,4881,4846,4981,4878,4922,4915,4975,4793,4952,4887,4898,4777,4917,4930,4811,4892,4730,4830,4924,4825,4940,4990,4997,4968,4973,4825,4874,4875,4806,4945,4807,4767,5065,4931,4861,4859,4858,4873,4893,4837,4901,4857,4813,4912,4824,5049,4948,4747,4863,4814,4849,4958,4921,4950,4840,4931,4856,4959,4840,4807,4985,4903,4804,4953,4903,4908,4934,4937,4889,4816,4872,4753,4853,4902,4848,4980,4821,4757,4876,4930,4903,4824,4998,4978,4805,4941,4834,4870,4927,4950,4805,4885,4808,4962,4897,4953,4860,4952,4883,4861,4728,4812,4799,4904,4796,4862,4858,4817,4821,4734,4998,4845,5000,4828,4826,4847,4860,4783,4958,4756,4878,4836,4784,4962,4985,4976,4914,4925,4866,4783,4916,4902,4943,4894,4753,4932,4905,4861,4915,5002,4781,4822,4901,5055,4862,5006,4871,4739,4851,4871,4805,4745,4815,4774,4965,4882,4873,4799,4897,4932,4964,4938,4943,4837,4950,4892,4890,4888]}]},"null_count":0,"tot_col_size":347486037,"last_update_version":401695327755960321},"p_partkey":{"histogram":{"ndv":10000000,"buckets":[{"count":131072,"lower_bound":"MQ==","upper_bound":"MTMxMDcy","repeats":1},{"count":262144,"lower_bound":"MTMxMDcz","upper_bound":"MjYyMTQ0","repeats":1},{"count":393216,"lower_bound":"MjYyMTQ1","upper_bound":"MzkzMjE2","repeats":1},{"count":524288,"lower_bound":"MzkzMjE3","upper_bound":"NTI0Mjg4","repeats":1},{"count":653537,"lower_bound":"NTI0Mjg5","upper_bound":"NjUzNTM3","repeats":1},{"count":784609,"lower_bound":"NjUzNTM4","upper_bound":"Nzg0NjA5","repeats":1},{"count":915681,"lower_bound":"Nzg0NjEw","upper_bound":"OTE1Njgx","repeats":1},{"count":1042752,"lower_bound":"OTE1Njgy","upper_bound":"MTA0Mjc1Mg==","repeats":1},{"count":1173824,"lower_bound":"MTA0Mjc1Mw==","upper_bound":"MTE3MzgyNA==","repeats":1},{"count":1304896,"lower_bound":"MTE3MzgyNQ==","upper_bound":"MTMwNDg5Ng==","repeats":1},{"count":1435968,"lower_bound":"MTMwNDg5Nw==","upper_bound":"MTQzNTk2OA==","repeats":1},{"count":1567040,"lower_bound":"MTQzNTk2OQ==","upper_bound":"MTU2NzA0MA==","repeats":1},{"count":1649870,"lower_bound":"MTU2NzA0MQ==","upper_bound":"MTY0OTg3MA==","repeats":1},{"count":1715406,"lower_bound":"MTY0OTg3MQ==","upper_bound":"MTcxNTQwNg==","repeats":1},{"count":1780942,"lower_bound":"MTcxNTQwNw==","upper_bound":"MTc4MDk0Mg==","repeats":1},{"count":1846478,"lower_bound":"MTc4MDk0Mw==","upper_bound":"MTg0NjQ3OA==","repeats":1},{"count":1912014,"lower_bound":"MTg0NjQ3OQ==","upper_bound":"MTkxMjAxNA==","repeats":1},{"count":1977550,"lower_bound":"MTkxMjAxNQ==","upper_bound":"MTk3NzU1MA==","repeats":1},{"count":2043086,"lower_bound":"MTk3NzU1MQ==","upper_bound":"MjA0MzA4Ng==","repeats":1},{"count":2104635,"lower_bound":"MjA0MzA4Nw==","upper_bound":"MjEwNDYzNQ==","repeats":1},{"count":2170171,"lower_bound":"MjEwNDYzNg==","upper_bound":"MjE3MDE3MQ==","repeats":1},{"count":2235707,"lower_bound":"MjE3MDE3Mg==","upper_bound":"MjIzNTcwNw==","repeats":1},{"count":2301243,"lower_bound":"MjIzNTcwOA==","upper_bound":"MjMwMTI0Mw==","repeats":1},{"count":2366779,"lower_bound":"MjMwMTI0NA==","upper_bound":"MjM2Njc3OQ==","repeats":1},{"count":2432315,"lower_bound":"MjM2Njc4MA==","upper_bound":"MjQzMjMxNQ==","repeats":1},{"count":2497851,"lower_bound":"MjQzMjMxNg==","upper_bound":"MjQ5Nzg1MQ==","repeats":1},{"count":2563387,"lower_bound":"MjQ5Nzg1Mg==","upper_bound":"MjU2MzM4Nw==","repeats":1},{"count":2626026,"lower_bound":"MjU2MzM4OA==","upper_bound":"MjYyNjAyNg==","repeats":1},{"count":2691562,"lower_bound":"MjYyNjAyNw==","upper_bound":"MjY5MTU2Mg==","repeats":1},{"count":2757098,"lower_bound":"MjY5MTU2Mw==","upper_bound":"Mjc1NzA5OA==","repeats":1},{"count":2822634,"lower_bound":"Mjc1NzA5OQ==","upper_bound":"MjgyMjYzNA==","repeats":1},{"count":2888170,"lower_bound":"MjgyMjYzNQ==","upper_bound":"Mjg4ODE3MA==","repeats":1},{"count":2953706,"lower_bound":"Mjg4ODE3MQ==","upper_bound":"Mjk1MzcwNg==","repeats":1},{"count":3019242,"lower_bound":"Mjk1MzcwNw==","upper_bound":"MzAxOTI0Mg==","repeats":1},{"count":3072639,"lower_bound":"MzAxOTI0Mw==","upper_bound":"MzA3MjYzOQ==","repeats":1},{"count":3138175,"lower_bound":"MzA3MjY0MA==","upper_bound":"MzEzODE3NQ==","repeats":1},{"count":3203711,"lower_bound":"MzEzODE3Ng==","upper_bound":"MzIwMzcxMQ==","repeats":1},{"count":3269247,"lower_bound":"MzIwMzcxMg==","upper_bound":"MzI2OTI0Nw==","repeats":1},{"count":3334783,"lower_bound":"MzI2OTI0OA==","upper_bound":"MzMzNDc4Mw==","repeats":1},{"count":3400319,"lower_bound":"MzMzNDc4NA==","upper_bound":"MzQwMDMxOQ==","repeats":1},{"count":3465855,"lower_bound":"MzQwMDMyMA==","upper_bound":"MzQ2NTg1NQ==","repeats":1},{"count":3531391,"lower_bound":"MzQ2NTg1Ng==","upper_bound":"MzUzMTM5MQ==","repeats":1},{"count":3596927,"lower_bound":"MzUzMTM5Mg==","upper_bound":"MzU5NjkyNw==","repeats":1},{"count":3655659,"lower_bound":"MzU5NjkyOA==","upper_bound":"MzY1NTY1OQ==","repeats":1},{"count":3721195,"lower_bound":"MzY1NTY2MA==","upper_bound":"MzcyMTE5NQ==","repeats":1},{"count":3786731,"lower_bound":"MzcyMTE5Ng==","upper_bound":"Mzc4NjczMQ==","repeats":1},{"count":3852267,"lower_bound":"Mzc4NjczMg==","upper_bound":"Mzg1MjI2Nw==","repeats":1},{"count":3917803,"lower_bound":"Mzg1MjI2OA==","upper_bound":"MzkxNzgwMw==","repeats":1},{"count":3983339,"lower_bound":"MzkxNzgwNA==","upper_bound":"Mzk4MzMzOQ==","repeats":1},{"count":4048875,"lower_bound":"Mzk4MzM0MA==","upper_bound":"NDA0ODg3NQ==","repeats":1},{"count":4102242,"lower_bound":"NDA0ODg3Ng==","upper_bound":"NDEwMjI0Mg==","repeats":1},{"count":4167778,"lower_bound":"NDEwMjI0Mw==","upper_bound":"NDE2Nzc3OA==","repeats":1},{"count":4233314,"lower_bound":"NDE2Nzc3OQ==","upper_bound":"NDIzMzMxNA==","repeats":1},{"count":4298850,"lower_bound":"NDIzMzMxNQ==","upper_bound":"NDI5ODg1MA==","repeats":1},{"count":4364386,"lower_bound":"NDI5ODg1MQ==","upper_bound":"NDM2NDM4Ng==","repeats":1},{"count":4429922,"lower_bound":"NDM2NDM4Nw==","upper_bound":"NDQyOTkyMg==","repeats":1},{"count":4495458,"lower_bound":"NDQyOTkyMw==","upper_bound":"NDQ5NTQ1OA==","repeats":1},{"count":4560994,"lower_bound":"NDQ5NTQ1OQ==","upper_bound":"NDU2MDk5NA==","repeats":1},{"count":4621594,"lower_bound":"NDU2MDk5NQ==","upper_bound":"NDYyMTU5NA==","repeats":1},{"count":4687130,"lower_bound":"NDYyMTU5NQ==","upper_bound":"NDY4NzEzMA==","repeats":1},{"count":4752666,"lower_bound":"NDY4NzEzMQ==","upper_bound":"NDc1MjY2Ng==","repeats":1},{"count":4818202,"lower_bound":"NDc1MjY2Nw==","upper_bound":"NDgxODIwMg==","repeats":1},{"count":4883738,"lower_bound":"NDgxODIwMw==","upper_bound":"NDg4MzczOA==","repeats":1},{"count":4949274,"lower_bound":"NDg4MzczOQ==","upper_bound":"NDk0OTI3NA==","repeats":1},{"count":5014810,"lower_bound":"NDk0OTI3NQ==","upper_bound":"NTAxNDgxMA==","repeats":1},{"count":5051785,"lower_bound":"NTAxNDgxMQ==","upper_bound":"NTA1MTc4NQ==","repeats":1},{"count":5117321,"lower_bound":"NTA1MTc4Ng==","upper_bound":"NTExNzMyMQ==","repeats":1},{"count":5182857,"lower_bound":"NTExNzMyMg==","upper_bound":"NTE4Mjg1Nw==","repeats":1},{"count":5248393,"lower_bound":"NTE4Mjg1OA==","upper_bound":"NTI0ODM5Mw==","repeats":1},{"count":5313929,"lower_bound":"NTI0ODM5NA==","upper_bound":"NTMxMzkyOQ==","repeats":1},{"count":5379465,"lower_bound":"NTMxMzkzMA==","upper_bound":"NTM3OTQ2NQ==","repeats":1},{"count":5445001,"lower_bound":"NTM3OTQ2Ng==","upper_bound":"NTQ0NTAwMQ==","repeats":1},{"count":5510537,"lower_bound":"NTQ0NTAwMg==","upper_bound":"NTUxMDUzNw==","repeats":1},{"count":5547541,"lower_bound":"NTUxMDUzOA==","upper_bound":"NTU0NzU0MQ==","repeats":1},{"count":5613077,"lower_bound":"NTU0NzU0Mg==","upper_bound":"NTYxMzA3Nw==","repeats":1},{"count":5678613,"lower_bound":"NTYxMzA3OA==","upper_bound":"NTY3ODYxMw==","repeats":1},{"count":5744149,"lower_bound":"NTY3ODYxNA==","upper_bound":"NTc0NDE0OQ==","repeats":1},{"count":5809685,"lower_bound":"NTc0NDE1MA==","upper_bound":"NTgwOTY4NQ==","repeats":1},{"count":5875221,"lower_bound":"NTgwOTY4Ng==","upper_bound":"NTg3NTIyMQ==","repeats":1},{"count":5940757,"lower_bound":"NTg3NTIyMg==","upper_bound":"NTk0MDc1Nw==","repeats":1},{"count":5977779,"lower_bound":"NTk0MDc1OA==","upper_bound":"NTk3Nzc3OQ==","repeats":1},{"count":6043315,"lower_bound":"NTk3Nzc4MA==","upper_bound":"NjA0MzMxNQ==","repeats":1},{"count":6108851,"lower_bound":"NjA0MzMxNg==","upper_bound":"NjEwODg1MQ==","repeats":1},{"count":6174387,"lower_bound":"NjEwODg1Mg==","upper_bound":"NjE3NDM4Nw==","repeats":1},{"count":6239923,"lower_bound":"NjE3NDM4OA==","upper_bound":"NjIzOTkyMw==","repeats":1},{"count":6305459,"lower_bound":"NjIzOTkyNA==","upper_bound":"NjMwNTQ1OQ==","repeats":1},{"count":6370995,"lower_bound":"NjMwNTQ2MA==","upper_bound":"NjM3MDk5NQ==","repeats":1},{"count":6436531,"lower_bound":"NjM3MDk5Ng==","upper_bound":"NjQzNjUzMQ==","repeats":1},{"count":6500775,"lower_bound":"NjQzNjUzMg==","upper_bound":"NjUwMDc3NQ==","repeats":1},{"count":6566311,"lower_bound":"NjUwMDc3Ng==","upper_bound":"NjU2NjMxMQ==","repeats":1},{"count":6631847,"lower_bound":"NjU2NjMxMg==","upper_bound":"NjYzMTg0Nw==","repeats":1},{"count":6697383,"lower_bound":"NjYzMTg0OA==","upper_bound":"NjY5NzM4Mw==","repeats":1},{"count":6762919,"lower_bound":"NjY5NzM4NA==","upper_bound":"Njc2MjkxOQ==","repeats":1},{"count":6828455,"lower_bound":"Njc2MjkyMA==","upper_bound":"NjgyODQ1NQ==","repeats":1},{"count":6893991,"lower_bound":"NjgyODQ1Ng==","upper_bound":"Njg5Mzk5MQ==","repeats":1},{"count":6959527,"lower_bound":"Njg5Mzk5Mg==","upper_bound":"Njk1OTUyNw==","repeats":1},{"count":6996558,"lower_bound":"Njk1OTUyOA==","upper_bound":"Njk5NjU1OA==","repeats":1},{"count":7062094,"lower_bound":"Njk5NjU1OQ==","upper_bound":"NzA2MjA5NA==","repeats":1},{"count":7127630,"lower_bound":"NzA2MjA5NQ==","upper_bound":"NzEyNzYzMA==","repeats":1},{"count":7193166,"lower_bound":"NzEyNzYzMQ==","upper_bound":"NzE5MzE2Ng==","repeats":1},{"count":7258702,"lower_bound":"NzE5MzE2Nw==","upper_bound":"NzI1ODcwMg==","repeats":1},{"count":7324238,"lower_bound":"NzI1ODcwMw==","upper_bound":"NzMyNDIzOA==","repeats":1},{"count":7389774,"lower_bound":"NzMyNDIzOQ==","upper_bound":"NzM4OTc3NA==","repeats":1},{"count":7455310,"lower_bound":"NzM4OTc3NQ==","upper_bound":"NzQ1NTMxMA==","repeats":1},{"count":7520846,"lower_bound":"NzQ1NTMxMQ==","upper_bound":"NzUyMDg0Ng==","repeats":1},{"count":7568597,"lower_bound":"NzUyMDg0Nw==","upper_bound":"NzU2ODU5Nw==","repeats":1},{"count":7634133,"lower_bound":"NzU2ODU5OA==","upper_bound":"NzYzNDEzMw==","repeats":1},{"count":7699669,"lower_bound":"NzYzNDEzNA==","upper_bound":"NzY5OTY2OQ==","repeats":1},{"count":7765205,"lower_bound":"NzY5OTY3MA==","upper_bound":"Nzc2NTIwNQ==","repeats":1},{"count":7830741,"lower_bound":"Nzc2NTIwNg==","upper_bound":"NzgzMDc0MQ==","repeats":1},{"count":7896277,"lower_bound":"NzgzMDc0Mg==","upper_bound":"Nzg5NjI3Nw==","repeats":1},{"count":7961813,"lower_bound":"Nzg5NjI3OA==","upper_bound":"Nzk2MTgxMw==","repeats":1},{"count":8027349,"lower_bound":"Nzk2MTgxNA==","upper_bound":"ODAyNzM0OQ==","repeats":1},{"count":8064332,"lower_bound":"ODAyNzM1MA==","upper_bound":"ODA2NDMzMg==","repeats":1},{"count":8129868,"lower_bound":"ODA2NDMzMw==","upper_bound":"ODEyOTg2OA==","repeats":1},{"count":8195404,"lower_bound":"ODEyOTg2OQ==","upper_bound":"ODE5NTQwNA==","repeats":1},{"count":8260940,"lower_bound":"ODE5NTQwNQ==","upper_bound":"ODI2MDk0MA==","repeats":1},{"count":8326476,"lower_bound":"ODI2MDk0MQ==","upper_bound":"ODMyNjQ3Ng==","repeats":1},{"count":8392012,"lower_bound":"ODMyNjQ3Nw==","upper_bound":"ODM5MjAxMg==","repeats":1},{"count":8457548,"lower_bound":"ODM5MjAxMw==","upper_bound":"ODQ1NzU0OA==","repeats":1},{"count":8523084,"lower_bound":"ODQ1NzU0OQ==","upper_bound":"ODUyMzA4NA==","repeats":1},{"count":8587339,"lower_bound":"ODUyMzA4NQ==","upper_bound":"ODU4NzMzOQ==","repeats":1},{"count":8652875,"lower_bound":"ODU4NzM0MA==","upper_bound":"ODY1Mjg3NQ==","repeats":1},{"count":8718411,"lower_bound":"ODY1Mjg3Ng==","upper_bound":"ODcxODQxMQ==","repeats":1},{"count":8783947,"lower_bound":"ODcxODQxMg==","upper_bound":"ODc4Mzk0Nw==","repeats":1},{"count":8849483,"lower_bound":"ODc4Mzk0OA==","upper_bound":"ODg0OTQ4Mw==","repeats":1},{"count":8915019,"lower_bound":"ODg0OTQ4NA==","upper_bound":"ODkxNTAxOQ==","repeats":1},{"count":8980555,"lower_bound":"ODkxNTAyMA==","upper_bound":"ODk4MDU1NQ==","repeats":1},{"count":9017592,"lower_bound":"ODk4MDU1Ng==","upper_bound":"OTAxNzU5Mg==","repeats":1},{"count":9083128,"lower_bound":"OTAxNzU5Mw==","upper_bound":"OTA4MzEyOA==","repeats":1},{"count":9148664,"lower_bound":"OTA4MzEyOQ==","upper_bound":"OTE0ODY2NA==","repeats":1},{"count":9214200,"lower_bound":"OTE0ODY2NQ==","upper_bound":"OTIxNDIwMA==","repeats":1},{"count":9279736,"lower_bound":"OTIxNDIwMQ==","upper_bound":"OTI3OTczNg==","repeats":1},{"count":9345272,"lower_bound":"OTI3OTczNw==","upper_bound":"OTM0NTI3Mg==","repeats":1},{"count":9410808,"lower_bound":"OTM0NTI3Mw==","upper_bound":"OTQxMDgwOA==","repeats":1},{"count":9476344,"lower_bound":"OTQxMDgwOQ==","upper_bound":"OTQ3NjM0NA==","repeats":1},{"count":9541880,"lower_bound":"OTQ3NjM0NQ==","upper_bound":"OTU0MTg4MA==","repeats":1},{"count":9607416,"lower_bound":"OTU0MTg4MQ==","upper_bound":"OTYwNzQxNg==","repeats":1},{"count":9621656,"lower_bound":"OTYwNzQxNw==","upper_bound":"OTYyMTY1Ng==","repeats":1},{"count":9687192,"lower_bound":"OTYyMTY1Nw==","upper_bound":"OTY4NzE5Mg==","repeats":1},{"count":9752728,"lower_bound":"OTY4NzE5Mw==","upper_bound":"OTc1MjcyOA==","repeats":1},{"count":9818264,"lower_bound":"OTc1MjcyOQ==","upper_bound":"OTgxODI2NA==","repeats":1},{"count":9883800,"lower_bound":"OTgxODI2NQ==","upper_bound":"OTg4MzgwMA==","repeats":1},{"count":9949336,"lower_bound":"OTg4MzgwMQ==","upper_bound":"OTk0OTMzNg==","repeats":1},{"count":10000000,"lower_bound":"OTk0OTMzNw==","upper_bound":"MTAwMDAwMDA=","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695327729745924},"p_retailprice":{"histogram":{"ndv":81056,"buckets":[{"count":40000,"lower_bound":"OTA0LjUy","upper_bound":"OTQ1Ljc=","repeats":123},{"count":81000,"lower_bound":"OTQ1Ljk0","upper_bound":"OTU5LjU5","repeats":1123},{"count":121000,"lower_bound":"OTU5LjYx","upper_bound":"OTcyLjc1","repeats":123},{"count":161000,"lower_bound":"OTczLjAx","upper_bound":"OTgwLjk1","repeats":123},{"count":201000,"lower_bound":"OTgxLjY2","upper_bound":"OTg5Ljgx","repeats":123},{"count":241000,"lower_bound":"OTg5Ljkx","upper_bound":"OTk3LjYx","repeats":123},{"count":281000,"lower_bound":"OTk3Ljc4","upper_bound":"MTAwNS42OA==","repeats":123},{"count":321000,"lower_bound":"MTAwNS43NA==","upper_bound":"MTAxMC42OQ==","repeats":123},{"count":361000,"lower_bound":"MTAxMC43Mg==","upper_bound":"MTAxOA==","repeats":123},{"count":401000,"lower_bound":"MTAxOC43NQ==","upper_bound":"MTAyOC42OQ==","repeats":123},{"count":441000,"lower_bound":"MTAyOS4wMw==","upper_bound":"MTAzNS43NQ==","repeats":123},{"count":481000,"lower_bound":"MTAzNS43Ng==","upper_bound":"MTA0MS44Mw==","repeats":123},{"count":521000,"lower_bound":"MTA0MS45OA==","upper_bound":"MTA0OC43OQ==","repeats":1123},{"count":561000,"lower_bound":"MTA0OC44MQ==","upper_bound":"MTA1My44Mw==","repeats":123},{"count":601000,"lower_bound":"MTA1My44Ng==","upper_bound":"MTA1OS41OQ==","repeats":123},{"count":641000,"lower_bound":"MTA1OS44","upper_bound":"MTA2NC4xMg==","repeats":123},{"count":681000,"lower_bound":"MTA2NC41MQ==","upper_bound":"MTA3MS4wNg==","repeats":123},{"count":721000,"lower_bound":"MTA3MS4wOA==","upper_bound":"MTA3NS44NQ==","repeats":123},{"count":761000,"lower_bound":"MTA3Ni4wMw==","upper_bound":"MTA4MC43Ng==","repeats":1123},{"count":801000,"lower_bound":"MTA4MC43OQ==","upper_bound":"MTA4NC44Mw==","repeats":123},{"count":841000,"lower_bound":"MTA4NC44Ng==","upper_bound":"MTA4OC4xMg==","repeats":123},{"count":881000,"lower_bound":"MTA4OC42Mg==","upper_bound":"MTA5Mi43","repeats":123},{"count":921000,"lower_bound":"MTA5Mi43Mg==","upper_bound":"MTA5Ni43","repeats":123},{"count":961000,"lower_bound":"MTA5Ni43Nw==","upper_bound":"MTEwMC4wMw==","repeats":123},{"count":1001000,"lower_bound":"MTEwMC4xNw==","upper_bound":"MTEwNC42NQ==","repeats":123},{"count":1042000,"lower_bound":"MTEwNC44Mg==","upper_bound":"MTEwOS42Ng==","repeats":1123},{"count":1082000,"lower_bound":"MTEwOS43Mg==","upper_bound":"MTExMw==","repeats":1123},{"count":1124000,"lower_bound":"MTExMy4wMg==","upper_bound":"MTExNy4wOA==","repeats":2123},{"count":1164000,"lower_bound":"MTExNy43OQ==","upper_bound":"MTEyMS45OA==","repeats":123},{"count":1204000,"lower_bound":"MTEyMi4x","upper_bound":"MTEyNS4xMg==","repeats":123},{"count":1244000,"lower_bound":"MTEyNS42","upper_bound":"MTEyOS44NQ==","repeats":123},{"count":1284000,"lower_bound":"MTEyOS44Nw==","upper_bound":"MTEzNC42OQ==","repeats":123},{"count":1324000,"lower_bound":"MTEzNC43Nw==","upper_bound":"MTEzOC44","repeats":123},{"count":1364000,"lower_bound":"MTEzOS4wMw==","upper_bound":"MTE0Mi44NQ==","repeats":123},{"count":1404000,"lower_bound":"MTE0My4wMQ==","upper_bound":"MTE0Ny4wNQ==","repeats":123},{"count":1445000,"lower_bound":"MTE0Ny4x","upper_bound":"MTE1MS43Nw==","repeats":2123},{"count":1486000,"lower_bound":"MTE1MS44","upper_bound":"MTE1NC44Ng==","repeats":1123},{"count":1526000,"lower_bound":"MTE1NC45Mg==","upper_bound":"MTE1OC42Mg==","repeats":123},{"count":1566000,"lower_bound":"MTE1OC43Mw==","upper_bound":"MTE2MS44MQ==","repeats":123},{"count":1606000,"lower_bound":"MTE2MS44Mg==","upper_bound":"MTE2NS44Ng==","repeats":123},{"count":1646000,"lower_bound":"MTE2NS44OQ==","upper_bound":"MTE2OS4yNg==","repeats":123},{"count":1686000,"lower_bound":"MTE2OS43Nw==","upper_bound":"MTE3Mi45OA==","repeats":1123},{"count":1726000,"lower_bound":"MTE3Mi45OQ==","upper_bound":"MTE3Ny4wMw==","repeats":123},{"count":1766000,"lower_bound":"MTE3Ny4wNA==","upper_bound":"MTE4MC45","repeats":123},{"count":1806000,"lower_bound":"MTE4MC45Mw==","upper_bound":"MTE4NS4wMQ==","repeats":123},{"count":1846000,"lower_bound":"MTE4NS4wNA==","upper_bound":"MTE4OS4wMQ==","repeats":123},{"count":1886000,"lower_bound":"MTE4OS4wNQ==","upper_bound":"MTE5NC42OQ==","repeats":123},{"count":1926000,"lower_bound":"MTE5NC43OA==","upper_bound":"MTE5OC4xNw==","repeats":123},{"count":1966000,"lower_bound":"MTE5OC43Ng==","upper_bound":"MTIwMS4xMQ==","repeats":123},{"count":2006000,"lower_bound":"MTIwMS4xNQ==","upper_bound":"MTIwNC44OQ==","repeats":123},{"count":2046000,"lower_bound":"MTIwNC45","upper_bound":"MTIwOC45OA==","repeats":123},{"count":2086000,"lower_bound":"MTIwOQ==","upper_bound":"MTIxMi4wMg==","repeats":1123},{"count":2126000,"lower_bound":"MTIxMi4wNA==","upper_bound":"MTIxNS43NA==","repeats":123},{"count":2166000,"lower_bound":"MTIxNS44MQ==","upper_bound":"MTIxOS45OQ==","repeats":123},{"count":2206000,"lower_bound":"MTIyMC4wNA==","upper_bound":"MTIyMy45Nw==","repeats":123},{"count":2247000,"lower_bound":"MTIyNC4y","upper_bound":"MTIyOS4xMQ==","repeats":1123},{"count":2287000,"lower_bound":"MTIyOS4xNQ==","upper_bound":"MTIzMi45Mw==","repeats":123},{"count":2327000,"lower_bound":"MTIzMi45OQ==","upper_bound":"MTIzNy44Ng==","repeats":123},{"count":2367000,"lower_bound":"MTIzNy45Ng==","upper_bound":"MTI0MC45MQ==","repeats":123},{"count":2408000,"lower_bound":"MTI0MC45Mg==","upper_bound":"MTI0NC44Mw==","repeats":1123},{"count":2448000,"lower_bound":"MTI0NC44NQ==","upper_bound":"MTI0OC44","repeats":123},{"count":2488000,"lower_bound":"MTI0OC44Mg==","upper_bound":"MTI1Mi45","repeats":123},{"count":2528000,"lower_bound":"MTI1Mi45Mw==","upper_bound":"MTI1Ni44Ng==","repeats":123},{"count":2568000,"lower_bound":"MTI1Ni45Nw==","upper_bound":"MTI2MS4yOQ==","repeats":123},{"count":2608000,"lower_bound":"MTI2MS4zNQ==","upper_bound":"MTI2NS4wNQ==","repeats":123},{"count":2648000,"lower_bound":"MTI2NS4x","upper_bound":"MTI2OS45Ng==","repeats":123},{"count":2688000,"lower_bound":"MTI3MC4wNw==","upper_bound":"MTI3NC44OQ==","repeats":123},{"count":2728000,"lower_bound":"MTI3NC45NQ==","upper_bound":"MTI3Ny45MQ==","repeats":123},{"count":2768000,"lower_bound":"MTI3Ny45Mw==","upper_bound":"MTI4Mi45OQ==","repeats":123},{"count":2808000,"lower_bound":"MTI4My4wMg==","upper_bound":"MTI4Ni4wOQ==","repeats":123},{"count":2848000,"lower_bound":"MTI4Ni4xOQ==","upper_bound":"MTI5MC44Nw==","repeats":123},{"count":2888000,"lower_bound":"MTI5MC45Nw==","upper_bound":"MTI5NC43Nw==","repeats":123},{"count":2928000,"lower_bound":"MTI5NC43OQ==","upper_bound":"MTI5Ny44OQ==","repeats":123},{"count":2968000,"lower_bound":"MTI5Ny45","upper_bound":"MTMwMS43NA==","repeats":123},{"count":3008000,"lower_bound":"MTMwMS43Ng==","upper_bound":"MTMwNS44Mg==","repeats":123},{"count":3048000,"lower_bound":"MTMwNS44Ng==","upper_bound":"MTMwOC45","repeats":123},{"count":3088000,"lower_bound":"MTMwOC45NQ==","upper_bound":"MTMxMy4wNg==","repeats":123},{"count":3128000,"lower_bound":"MTMxMy4xNA==","upper_bound":"MTMxNy4yNg==","repeats":123},{"count":3168000,"lower_bound":"MTMxNy4z","upper_bound":"MTMyMS45Nw==","repeats":123},{"count":3208000,"lower_bound":"MTMyMS45OA==","upper_bound":"MTMyNC44OA==","repeats":123},{"count":3248000,"lower_bound":"MTMyNC45Mw==","upper_bound":"MTMyOC45Ng==","repeats":123},{"count":3288000,"lower_bound":"MTMyOC45OQ==","upper_bound":"MTMzMi4xOA==","repeats":123},{"count":3328000,"lower_bound":"MTMzMi4yNQ==","upper_bound":"MTMzNS4yNw==","repeats":123},{"count":3368000,"lower_bound":"MTMzNS4yOQ==","upper_bound":"MTMzOC43OA==","repeats":123},{"count":3408000,"lower_bound":"MTMzOC43OQ==","upper_bound":"MTM0My4yNQ==","repeats":123},{"count":3448000,"lower_bound":"MTM0My4yOQ==","upper_bound":"MTM0Ny4z","repeats":123},{"count":3489000,"lower_bound":"MTM0Ny44Nw==","upper_bound":"MTM1Mi4wNg==","repeats":1123},{"count":3529000,"lower_bound":"MTM1Mi4xMQ==","upper_bound":"MTM1Ni4wOQ==","repeats":123},{"count":3570000,"lower_bound":"MTM1Ni4x","upper_bound":"MTM1OC4yNw==","repeats":1123},{"count":3610000,"lower_bound":"MTM1OC4zMQ==","upper_bound":"MTM2Mi4zNA==","repeats":123},{"count":3650000,"lower_bound":"MTM2Mi44NQ==","upper_bound":"MTM2Ni4xNQ==","repeats":123},{"count":3690000,"lower_bound":"MTM2Ni4xOQ==","upper_bound":"MTM3MS4x","repeats":123},{"count":3730000,"lower_bound":"MTM3MS4xMQ==","upper_bound":"MTM3NS4x","repeats":123},{"count":3770000,"lower_bound":"MTM3NS4xNA==","upper_bound":"MTM3OS40Ng==","repeats":123},{"count":3810000,"lower_bound":"MTM3OS44Nw==","upper_bound":"MTM4My4wOA==","repeats":123},{"count":3850000,"lower_bound":"MTM4My4wOQ==","upper_bound":"MTM4Ng==","repeats":123},{"count":3890000,"lower_bound":"MTM4Ni4xOQ==","upper_bound":"MTM5MC4yNA==","repeats":123},{"count":3930000,"lower_bound":"MTM5MC4zMg==","upper_bound":"MTM5NS4wMg==","repeats":123},{"count":3970000,"lower_bound":"MTM5NS4wMw==","upper_bound":"MTM5OS4wNw==","repeats":123},{"count":4011000,"lower_bound":"MTM5OS4xNg==","upper_bound":"MTQwMy4xNA==","repeats":1123},{"count":4052000,"lower_bound":"MTQwMy4xNQ==","upper_bound":"MTQwNy4xNw==","repeats":1123},{"count":4092000,"lower_bound":"MTQwNy4xOA==","upper_bound":"MTQxMi4zMg==","repeats":123},{"count":4133000,"lower_bound":"MTQxMi4zNA==","upper_bound":"MTQxNy4wNw==","repeats":1123},{"count":4173000,"lower_bound":"MTQxNy4x","upper_bound":"MTQyMC4yNg==","repeats":123},{"count":4213000,"lower_bound":"MTQyMC4zNA==","upper_bound":"MTQyNA==","repeats":123},{"count":4253000,"lower_bound":"MTQyNC4wNw==","upper_bound":"MTQyOC4y","repeats":123},{"count":4293000,"lower_bound":"MTQyOC4yNw==","upper_bound":"MTQzMi40Nw==","repeats":123},{"count":4333000,"lower_bound":"MTQzMy4wMg==","upper_bound":"MTQzNi45Ng==","repeats":123},{"count":4373000,"lower_bound":"MTQzNy4wOA==","upper_bound":"MTQ0MS4wNg==","repeats":123},{"count":4413000,"lower_bound":"MTQ0MS4wOA==","upper_bound":"MTQ0NA==","repeats":123},{"count":4453000,"lower_bound":"MTQ0NC4x","upper_bound":"MTQ0OC4yMw==","repeats":123},{"count":4493000,"lower_bound":"MTQ0OC4zMQ==","upper_bound":"MTQ1Mi4yOA==","repeats":123},{"count":4533000,"lower_bound":"MTQ1Mi4zMQ==","upper_bound":"MTQ1NS4xOQ==","repeats":123},{"count":4573000,"lower_bound":"MTQ1NS4y","upper_bound":"MTQ1OC40","repeats":123},{"count":4614000,"lower_bound":"MTQ1OC41Mw==","upper_bound":"MTQ2Mi4xNA==","repeats":1123},{"count":4654000,"lower_bound":"MTQ2Mi4xNQ==","upper_bound":"MTQ2Ni40Ng==","repeats":123},{"count":4694000,"lower_bound":"MTQ2Ny4wMQ==","upper_bound":"MTQ2OS45OQ==","repeats":123},{"count":4734000,"lower_bound":"MTQ3MC4xMw==","upper_bound":"MTQ3NC4wMg==","repeats":123},{"count":4774000,"lower_bound":"MTQ3NC4xNA==","upper_bound":"MTQ3OC4xNA==","repeats":123},{"count":4814000,"lower_bound":"MTQ3OC4xNg==","upper_bound":"MTQ4Mi4wMw==","repeats":123},{"count":4854000,"lower_bound":"MTQ4Mi4wNw==","upper_bound":"MTQ4Ni4yMg==","repeats":123},{"count":4894000,"lower_bound":"MTQ4Ni4yMw==","upper_bound":"MTQ5MS40Nw==","repeats":123},{"count":4934000,"lower_bound":"MTQ5MS41Ng==","upper_bound":"MTQ5NS4zNg==","repeats":123},{"count":4974000,"lower_bound":"MTQ5Ni4wNw==","upper_bound":"MTUwMC4yMQ==","repeats":123},{"count":5014000,"lower_bound":"MTUwMC4yNw==","upper_bound":"MTUwNC4yMQ==","repeats":123},{"count":5054000,"lower_bound":"MTUwNC4yOA==","upper_bound":"MTUwOC4wMw==","repeats":123},{"count":5095000,"lower_bound":"MTUwOC4xNA==","upper_bound":"MTUxMi4yMw==","repeats":1123},{"count":5135000,"lower_bound":"MTUxMi4yNg==","upper_bound":"MTUxNS4zMw==","repeats":123},{"count":5175000,"lower_bound":"MTUxNS4zNA==","upper_bound":"MTUxOS4wOQ==","repeats":123},{"count":5215000,"lower_bound":"MTUxOS4xNQ==","upper_bound":"MTUyMy41Mw==","repeats":123},{"count":5255000,"lower_bound":"MTUyMy41NA==","upper_bound":"MTUyNy4wNw==","repeats":123},{"count":5295000,"lower_bound":"MTUyNy4xOQ==","upper_bound":"MTUzMS4xMQ==","repeats":1123},{"count":5335000,"lower_bound":"MTUzMS4xNA==","upper_bound":"MTUzNS4xOQ==","repeats":1123},{"count":5375000,"lower_bound":"MTUzNS4y","upper_bound":"MTUzOS4wNg==","repeats":123},{"count":5415000,"lower_bound":"MTUzOS4wOA==","upper_bound":"MTU0My4zNQ==","repeats":123},{"count":5455000,"lower_bound":"MTU0My45Nw==","upper_bound":"MTU0Ny4yNg==","repeats":123},{"count":5495000,"lower_bound":"MTU0Ny4zOA==","upper_bound":"MTU1MC40MQ==","repeats":123},{"count":5535000,"lower_bound":"MTU1MC40Nw==","upper_bound":"MTU1NC40Nw==","repeats":123},{"count":5575000,"lower_bound":"MTU1NS4xOA==","upper_bound":"MTU1OS4zOQ==","repeats":123},{"count":5615000,"lower_bound":"MTU1OS40NQ==","upper_bound":"MTU2Mi4xOQ==","repeats":123},{"count":5655000,"lower_bound":"MTU2Mi4yNQ==","upper_bound":"MTU2Ni4xNg==","repeats":123},{"count":5695000,"lower_bound":"MTU2Ni4yMQ==","upper_bound":"MTU3MC40NA==","repeats":1123},{"count":5735000,"lower_bound":"MTU3MC41MQ==","upper_bound":"MTU3NC42Mg==","repeats":123},{"count":5775000,"lower_bound":"MTU3NC42Ng==","upper_bound":"MTU3OS4zMw==","repeats":123},{"count":5815000,"lower_bound":"MTU3OS4zNA==","upper_bound":"MTU4Mi4zOA==","repeats":123},{"count":5855000,"lower_bound":"MTU4Mi40OQ==","upper_bound":"MTU4Ni4zNQ==","repeats":123},{"count":5895000,"lower_bound":"MTU4Ni4zNg==","upper_bound":"MTU5MS4xMQ==","repeats":123},{"count":5935000,"lower_bound":"MTU5MS4xOQ==","upper_bound":"MTU5NC41OQ==","repeats":123},{"count":5975000,"lower_bound":"MTU5NC42","upper_bound":"MTYwMC41NA==","repeats":123},{"count":6015000,"lower_bound":"MTYwMC42Mg==","upper_bound":"MTYwNC4xOQ==","repeats":123},{"count":6055000,"lower_bound":"MTYwNC4yMg==","upper_bound":"MTYwNy41Mw==","repeats":123},{"count":6095000,"lower_bound":"MTYwNy42Mw==","upper_bound":"MTYxMi4yOA==","repeats":123},{"count":6135000,"lower_bound":"MTYxMi4zMQ==","upper_bound":"MTYxNi40Mw==","repeats":123},{"count":6175000,"lower_bound":"MTYxNi40OA==","upper_bound":"MTYyMC4x","repeats":123},{"count":6215000,"lower_bound":"MTYyMC4xMw==","upper_bound":"MTYyMy4zOA==","repeats":123},{"count":6255000,"lower_bound":"MTYyMy40MQ==","upper_bound":"MTYyNy4yMQ==","repeats":123},{"count":6295000,"lower_bound":"MTYyNy4yNQ==","upper_bound":"MTYzMi4yOA==","repeats":123},{"count":6335000,"lower_bound":"MTYzMi4zMQ==","upper_bound":"MTYzNS4xNw==","repeats":123},{"count":6375000,"lower_bound":"MTYzNS4zNA==","upper_bound":"MTYzOS4zNA==","repeats":123},{"count":6415000,"lower_bound":"MTYzOS4zOQ==","upper_bound":"MTY0My4yNw==","repeats":123},{"count":6455000,"lower_bound":"MTY0My4z","upper_bound":"MTY0Ny4yOA==","repeats":123},{"count":6496000,"lower_bound":"MTY0Ny4zNQ==","upper_bound":"MTY1Mi4yOQ==","repeats":1123},{"count":6536000,"lower_bound":"MTY1Mi40Mw==","upper_bound":"MTY1NS41Nw==","repeats":123},{"count":6576000,"lower_bound":"MTY1NS43MQ==","upper_bound":"MTY2MC40Nw==","repeats":123},{"count":6616000,"lower_bound":"MTY2MC41MQ==","upper_bound":"MTY2NC4xNg==","repeats":123},{"count":6656000,"lower_bound":"MTY2NC4xNw==","upper_bound":"MTY2Ny43Ng==","repeats":123},{"count":6697000,"lower_bound":"MTY2OC4xNQ==","upper_bound":"MTY3Mi41OA==","repeats":1123},{"count":6737000,"lower_bound":"MTY3Mi41OQ==","upper_bound":"MTY3NS42OQ==","repeats":123},{"count":6777000,"lower_bound":"MTY3Ni4zMg==","upper_bound":"MTY4MC41","repeats":123},{"count":6817000,"lower_bound":"MTY4MC41OA==","upper_bound":"MTY4NC41Mw==","repeats":123},{"count":6857000,"lower_bound":"MTY4NC41NA==","upper_bound":"MTY4OC4zNg==","repeats":123},{"count":6898000,"lower_bound":"MTY4OC4zNw==","upper_bound":"MTY5Mi40OQ==","repeats":1123},{"count":6938000,"lower_bound":"MTY5Mi41Mw==","upper_bound":"MTY5Ni4zNg==","repeats":1123},{"count":6979000,"lower_bound":"MTY5Ni40Ng==","upper_bound":"MTY5OS40OQ==","repeats":1123},{"count":7019000,"lower_bound":"MTY5OS42Mw==","upper_bound":"MTcwNC41OA==","repeats":123},{"count":7059000,"lower_bound":"MTcwNC41OQ==","upper_bound":"MTcwOC43Mw==","repeats":123},{"count":7099000,"lower_bound":"MTcwOS4yNg==","upper_bound":"MTcxMi4zOQ==","repeats":123},{"count":7139000,"lower_bound":"MTcxMi40Mw==","upper_bound":"MTcxNi41Mg==","repeats":123},{"count":7179000,"lower_bound":"MTcxNi41Nw==","upper_bound":"MTcyMS4z","repeats":123},{"count":7219000,"lower_bound":"MTcyMS4zMw==","upper_bound":"MTcyNC42Nw==","repeats":123},{"count":7259000,"lower_bound":"MTcyNC43","upper_bound":"MTcyOS4zMQ==","repeats":123},{"count":7299000,"lower_bound":"MTcyOS4zMw==","upper_bound":"MTczMy40MQ==","repeats":123},{"count":7339000,"lower_bound":"MTczMy41Mw==","upper_bound":"MTczOC41MQ==","repeats":1123},{"count":7379000,"lower_bound":"MTczOC41NQ==","upper_bound":"MTc0Mi4xNg==","repeats":123},{"count":7419000,"lower_bound":"MTc0Mi4yNg==","upper_bound":"MTc0Ni4zNQ==","repeats":123},{"count":7459000,"lower_bound":"MTc0Ni4zOA==","upper_bound":"MTc0OS4y","repeats":123},{"count":7499000,"lower_bound":"MTc0OS4yMw==","upper_bound":"MTc1Mi42Mg==","repeats":1123},{"count":7539000,"lower_bound":"MTc1My4yOQ==","upper_bound":"MTc1Ni44Mw==","repeats":123},{"count":7579000,"lower_bound":"MTc1Ny4yNg==","upper_bound":"MTc2MC4yOA==","repeats":1123},{"count":7619000,"lower_bound":"MTc2MC4z","upper_bound":"MTc2NC42OA==","repeats":123},{"count":7659000,"lower_bound":"MTc2NC42OQ==","upper_bound":"MTc2Ny42Nw==","repeats":123},{"count":7699000,"lower_bound":"MTc2Ny44Ng==","upper_bound":"MTc3MS41Mw==","repeats":1123},{"count":7739000,"lower_bound":"MTc3MS41NA==","upper_bound":"MTc3NS42MQ==","repeats":123},{"count":7779000,"lower_bound":"MTc3NS42NA==","upper_bound":"MTc3OS41","repeats":123},{"count":7819000,"lower_bound":"MTc3OS41NA==","upper_bound":"MTc4My40OA==","repeats":1123},{"count":7859000,"lower_bound":"MTc4My41Mw==","upper_bound":"MTc4Ni40OA==","repeats":123},{"count":7899000,"lower_bound":"MTc4Ni41OQ==","upper_bound":"MTc5MC40Ng==","repeats":123},{"count":7939000,"lower_bound":"MTc5MC41Ng==","upper_bound":"MTc5NC41Ng==","repeats":123},{"count":7980000,"lower_bound":"MTc5NC41OA==","upper_bound":"MTc5OS42","repeats":1123},{"count":8020000,"lower_bound":"MTc5OS42Mw==","upper_bound":"MTgwMi42NQ==","repeats":123},{"count":8060000,"lower_bound":"MTgwMi42OQ==","upper_bound":"MTgwNi41Mg==","repeats":123},{"count":8100000,"lower_bound":"MTgwNi41Ng==","upper_bound":"MTgxMC42Nw==","repeats":123},{"count":8140000,"lower_bound":"MTgxMC43Mw==","upper_bound":"MTgxMy42Ng==","repeats":123},{"count":8180000,"lower_bound":"MTgxMy43MQ==","upper_bound":"MTgxNy40OA==","repeats":123},{"count":8220000,"lower_bound":"MTgxNy41","upper_bound":"MTgyMS4zNw==","repeats":123},{"count":8260000,"lower_bound":"MTgyMS40","upper_bound":"MTgyNS40Mw==","repeats":123},{"count":8300000,"lower_bound":"MTgyNS41NA==","upper_bound":"MTgyOS40Ng==","repeats":123},{"count":8340000,"lower_bound":"MTgyOS41Mw==","upper_bound":"MTgzMi43Nw==","repeats":123},{"count":8380000,"lower_bound":"MTgzMy40MQ==","upper_bound":"MTgzNi41OQ==","repeats":123},{"count":8420000,"lower_bound":"MTgzNi42Mg==","upper_bound":"MTgzOS43OA==","repeats":123},{"count":8460000,"lower_bound":"MTg0MC4zNQ==","upper_bound":"MTg0My42OA==","repeats":123},{"count":8500000,"lower_bound":"MTg0My43","upper_bound":"MTg0OC4zMQ==","repeats":123},{"count":8540000,"lower_bound":"MTg0OC40NA==","upper_bound":"MTg1MS43OQ==","repeats":1123},{"count":8580000,"lower_bound":"MTg1Mi4zOA==","upper_bound":"MTg1Ni42","repeats":123},{"count":8620000,"lower_bound":"MTg1Ni42NQ==","upper_bound":"MTg2MS42","repeats":123},{"count":8660000,"lower_bound":"MTg2MS43Nw==","upper_bound":"MTg2NS41","repeats":123},{"count":8700000,"lower_bound":"MTg2NS41Mw==","upper_bound":"MTg2OS40Nw==","repeats":1123},{"count":8740000,"lower_bound":"MTg2OS41Mw==","upper_bound":"MTg3Mi43NQ==","repeats":123},{"count":8780000,"lower_bound":"MTg3Mi43Ng==","upper_bound":"MTg3NS44OA==","repeats":1123},{"count":8820000,"lower_bound":"MTg3NS44OQ==","upper_bound":"MTg4MC42NQ==","repeats":123},{"count":8860000,"lower_bound":"MTg4MC42Nw==","upper_bound":"MTg4My43Ng==","repeats":123},{"count":8900000,"lower_bound":"MTg4My44Mw==","upper_bound":"MTg4Ny42Mw==","repeats":123},{"count":8940000,"lower_bound":"MTg4Ny42NA==","upper_bound":"MTg5MS4zNA==","repeats":123},{"count":8980000,"lower_bound":"MTg5MS40OA==","upper_bound":"MTg5NC43OQ==","repeats":123},{"count":9020000,"lower_bound":"MTg5NC45Mg==","upper_bound":"MTg5OS41Ng==","repeats":123},{"count":9060000,"lower_bound":"MTg5OS42Nw==","upper_bound":"MTkwMy42NA==","repeats":123},{"count":9100000,"lower_bound":"MTkwMy43NQ==","upper_bound":"MTkwNi44NQ==","repeats":123},{"count":9140000,"lower_bound":"MTkwNy40MQ==","upper_bound":"MTkxMS45Mg==","repeats":123},{"count":9180000,"lower_bound":"MTkxMS45NQ==","upper_bound":"MTkxNi45MQ==","repeats":123},{"count":9220000,"lower_bound":"MTkxNy40NQ==","upper_bound":"MTkyMS43MQ==","repeats":123},{"count":9260000,"lower_bound":"MTkyMS43NQ==","upper_bound":"MTkyNS40Mg==","repeats":123},{"count":9300000,"lower_bound":"MTkyNS40OA==","upper_bound":"MTkzMC43Ng==","repeats":123},{"count":9340000,"lower_bound":"MTkzMC43OQ==","upper_bound":"MTkzNS42Nw==","repeats":1123},{"count":9380000,"lower_bound":"MTkzNS42OA==","upper_bound":"MTk0MC43NQ==","repeats":123},{"count":9420000,"lower_bound":"MTk0MC45Ng==","upper_bound":"MTk0Ny44Mg==","repeats":123},{"count":9460000,"lower_bound":"MTk0Ny45Mg==","upper_bound":"MTk1NC40MQ==","repeats":123},{"count":9500000,"lower_bound":"MTk1NC40Nw==","upper_bound":"MTk1OS42Mw==","repeats":123},{"count":9540000,"lower_bound":"MTk1OS42NA==","upper_bound":"MTk2NC41OQ==","repeats":123},{"count":9581000,"lower_bound":"MTk2NC42NQ==","upper_bound":"MTk3MC44MQ==","repeats":1123},{"count":9621000,"lower_bound":"MTk3MC44Mg==","upper_bound":"MTk3OS40Ng==","repeats":123},{"count":9661000,"lower_bound":"MTk3OS41","upper_bound":"MTk4Ni40Mg==","repeats":123},{"count":9702000,"lower_bound":"MTk4Ni41","upper_bound":"MTk5Mi43Nw==","repeats":1123},{"count":9742000,"lower_bound":"MTk5Mi44NA==","upper_bound":"MTk5OC44Nw==","repeats":123},{"count":9782000,"lower_bound":"MTk5OS41OA==","upper_bound":"MjAwNy44Mw==","repeats":123},{"count":9822000,"lower_bound":"MjAwOC40Nw==","upper_bound":"MjAxNy40OA==","repeats":123},{"count":9862000,"lower_bound":"MjAxNy40OQ==","upper_bound":"MjAyNC40Nw==","repeats":123},{"count":9902000,"lower_bound":"MjAyNC42NA==","upper_bound":"MjAzNS42Ng==","repeats":123},{"count":9942000,"lower_bound":"MjAzNS44Ng==","upper_bound":"MjA1MC42Nw==","repeats":123},{"count":9982000,"lower_bound":"MjA1MS42MQ==","upper_bound":"MjA2Ny44Ng==","repeats":123},{"count":10000000,"lower_bound":"MjA2OS44Mg==","upper_bound":"MjA5Ny45","repeats":123}]},"cm_sketch":{"rows":[{"counters":[5308,4225,5353,2813,5744,4508,4937,5499,3772,4753,3970,4652,5265,4387,3926,3792,3394,5053,5089,4731,4481,3830,4917,3885,5484,5077,5576,3609,6172,5195,5149,4917,4580,2892,4567,5806,4590,5188,5162,5278,3463,4958,6359,3803,4330,4844,5253,4040,5825,4699,5204,5592,5927,5587,4177,4432,5617,4539,5374,2721,4572,4381,5022,3797,3853,6148,6664,3701,4215,5673,5241,5365,5319,4136,4210,4568,4876,4252,4919,5306,6318,3452,4041,4310,4916,5435,4424,3502,4937,5258,6193,6178,4874,4661,4021,5081,6454,5864,5199,6891,2903,4479,4167,4074,6019,3914,4617,4605,4248,4903,3813,4715,3063,3982,4244,4163,5027,5372,5864,4335,4426,4418,4487,4815,5265,4833,5525,5225,4642,4054,4247,4236,4957,5464,4029,4277,5929,4585,4707,5443,4524,4632,3974,4878,4310,3848,3996,4584,5358,4279,4487,7061,5247,5709,4589,5230,4741,4871,4727,5281,4892,5949,4596,5858,4675,4262,5913,5633,5629,4098,5508,5098,5849,4833,3495,4293,5869,4335,5112,4266,3901,3797,3552,5354,5712,5079,5097,4559,4427,3310,5758,3897,4480,5485,3518,5205,4771,4731,3823,4232,2350,6300,3503,4487,6725,6446,4657,5590,4340,4456,3986,6402,3985,6286,4735,5295,3428,4077,5280,4483,5306,4217,5553,4861,4862,4393,4713,4805,6548,4346,4336,3870,5875,4258,6485,4525,4346,5808,6475,6453,4902,5768,4095,3949,5805,6229,3476,5453,6049,5967,6250,3205,4236,4181,5147,4566,4509,6529,4427,4779,3370,3654,3992,5281,5495,3098,4244,2950,4203,3951,4751,5254,3024,3708,5403,4303,5916,3229,6133,4332,4602,4274,5528,6206,4334,6214,6802,3694,5270,6423,5081,5883,4013,6226,5781,4291,4736,4258,4897,5565,5417,5418,4528,6316,4704,5469,3394,5100,4952,4082,4564,6194,4296,4171,4034,4857,4555,4245,5389,3718,4216,7098,3579,6200,5296,4225,4752,4597,5021,6007,4204,4543,5563,3934,5153,6356,4519,3858,5490,6035,4413,4373,5643,6352,4448,4658,3556,4639,4066,3409,4007,5787,5082,4289,5349,4444,3923,5399,6216,5098,3610,6135,3559,4089,5553,3941,5018,5343,3387,4089,3592,5375,4742,4659,3928,4225,3723,5398,4193,4738,5236,4801,5229,5073,4541,4129,3971,3671,6235,6218,4800,3327,6124,4642,4520,4121,5109,4112,3716,3574,4856,4270,4259,4367,4265,4539,4256,4776,4641,4809,4109,4059,4448,6472,5384,5237,4108,6545,3063,4005,3454,5103,3819,6968,4742,5496,3515,6454,5300,5902,4129,6505,4414,4785,4446,4153,3482,3006,5206,5565,4647,5264,4808,4111,5527,2795,6740,5382,5813,4948,4988,4515,3648,4412,4629,3459,5061,5976,4929,5303,5924,3949,5806,4593,4268,4187,5143,3564,5697,6526,4967,4660,4407,5775,4278,5820,5854,4982,5972,4752,4095,4408,3969,4775,4370,3417,5607,4432,4821,3912,2848,3969,4656,5058,4746,5418,5675,5997,4737,3461,4512,5294,4804,6787,5905,4966,3843,4619,5125,5825,5719,4096,3925,4077,6738,6204,3011,5758,8079,3908,6167,4160,4416,5030,5308,4999,3940,5420,3811,4183,4217,4327,4522,4545,4949,4545,5886,5362,4752,5722,6782,5175,5835,5593,5938,7036,5132,6105,4609,4115,5303,3829,4235,3660,4836,4814,4247,5875,4804,3858,3894,5603,5331,5295,4813,6808,4272,4885,5249,4689,4723,2764,4366,4681,4565,3866,4808,7290,6381,3846,4450,5219,3989,4740,4017,5247,3953,5046,5087,2786,3655,5498,6445,4548,7294,3027,4695,4825,4613,4369,4236,5960,4234,7171,5065,4688,4206,5664,5691,4237,3321,5236,3169,4658,6055,5581,4746,5466,3123,5573,5422,4575,5939,4542,5341,3135,4123,5760,6594,4722,6333,5163,3585,5243,5220,5039,4488,5578,3042,3918,5153,4279,6189,3866,4965,3677,4840,5433,5012,3850,3661,4739,6138,6733,4966,5536,5947,4808,4079,5217,5974,4346,4460,6372,5951,5045,3721,3486,3958,4988,3911,4268,5409,5379,4907,5697,3337,4274,4674,6257,6102,4235,6089,3061,4737,3783,5523,3665,5821,6387,3576,4189,6723,4514,3792,6012,3110,5450,5132,4568,5213,4963,5610,5169,4828,6181,4733,3365,4579,5904,4221,5614,3160,4364,6221,5249,3974,6426,5159,3847,6436,6697,4779,4849,5340,4342,4556,3625,4245,4937,3517,4448,5227,5202,5379,5160,3039,5802,4887,5020,5467,3888,4867,4907,5441,4519,4274,7068,3964,4241,4678,4503,5772,5929,4236,5643,4848,3458,4839,5790,3733,3972,5954,5323,5316,4747,6081,5732,3487,5308,4743,5121,6137,4485,4795,4101,5387,5134,5204,4981,5098,4867,5080,5820,5812,6363,3473,4816,4489,5595,4989,5498,4755,5942,6249,4792,4051,4687,3352,5218,5322,6784,5344,6568,5890,4952,5438,3189,6192,4937,3893,4872,5173,4664,5328,5749,4141,5234,4271,4325,5245,5609,5130,3440,3855,5379,5704,5022,4139,6037,5072,5202,5265,5714,6106,4703,2641,4764,5456,5088,4224,5073,3599,4418,5049,5225,3267,4177,4340,5767,7480,3811,4444,5715,4930,4033,5291,4102,5352,3342,4707,4639,3526,4367,5289,5337,5032,5474,4514,5698,5704,3930,4548,4117,4575,4143,6022,3882,5655,5258,4195,7637,2682,4799,5102,4070,3855,7271,4361,5373,3803,6404,4565,3307,4078,3436,5513,3259,3674,4951,4677,5887,3698,4321,5858,4862,5916,4955,5524,4075,4567,4256,4938,4302,4708,4397,5405,3996,4556,5565,4458,5318,4944,5524,4110,4656,5273,5146,5741,4013,5291,4271,4234,4967,5729,5695,4461,5194,4203,5396,4591,4612,4292,3950,5655,3625,5755,3478,5874,6232,4629,4387,4275,4117,4912,4394,4124,3892,2653,4275,3747,4150,3758,6051,5809,4444,4017,5341,5394,5179,5957,3922,5775,4706,5690,4835,4675,5863,5296,5122,3921,5084,4245,5503,5187,4319,4314,3070,4777,4787,3478,4279,3719,5175,4784,4388,5140,4418,4536,3657,5181,5860,3869,7887,4193,4596,6205,6008,7175,4743,6142,4684,6047,4961,4268,3559,4449,4665,3002,4009,5620,4233,4999,5436,4016,5417,3905,4723,3818,3320,5749,6483,4821,5273,4992,6499,3163,5025,4172,3388,5576,4958,3869,4272,5800,4348,6045,6369,3979,3441,4974,4768,5210,5871,4893,5334,4732,4524,5614,5265,5142,5090,4493,3999,4009,4282,4332,5393,4366,6380,5272,6265,4741,5067,4250,3741,5904,3598,4659,4228,3732,2892,6668,5490,5338,6037,4193,6241,5321,5497,5353,4981,6133,4181,3605,4995,4095,4524,5137,4688,5203,4696,5784,5217,6165,5632,5339,5201,5118,5571,4702,4461,5027,4916,5195,5846,6301,6102,4631,5636,4401,4561,4018,5658,5737,7137,5235,5446,4992,4266,5000,3074,4811,7164,5013,3866,4231,6115,6166,4230,4417,5137,4480,5418,5366,4103,6657,3672,3928,4643,7066,4455,5784,4175,3860,3930,4190,5222,5180,4904,5545,4140,5044,5067,4842,5505,6817,5571,3541,4818,4821,3914,5238,5431,4396,5526,5171,4772,6965,5334,5357,5934,3778,6519,3319,4690,4769,5634,6198,4331,7648,5420,4188,5776,4323,4997,5645,6125,4938,3731,4635,4422,5099,6155,3323,5470,4812,5579,6137,5860,5229,4323,3627,6244,3919,5150,4694,4994,4438,5870,3746,4936,4190,6437,5350,5250,5485,4333,4948,5126,5915,4540,5526,5691,5438,5849,4556,5425,4701,3830,7104,5545,4357,7456,4955,4041,4262,4361,4045,5182,6885,4031,3825,6238,4356,3761,6530,5701,6123,4625,3667,4114,5812,3424,6127,5063,4023,6087,4172,3436,4331,3674,4254,4900,5883,3246,5403,3776,4758,5238,4417,6232,4177,7205,5676,4479,4259,5310,5753,5865,5741,5824,4411,4378,5331,4438,4614,4664,3019,3681,5610,4560,3317,5900,5493,6134,3306,4834,4990,4443,4073,5258,5752,5907,5797,4292,3156,5409,4209,4308,5950,5306,5486,6263,5338,5693,4625,4038,5263,5326,4199,4828,4998,5388,4940,5718,5342,5606,4069,5612,4266,4155,4759,4035,4250,5668,4038,3826,4887,5573,4925,5207,5902,4505,5734,4349,5101,3940,5022,5816,4746,6892,5378,4082,5792,3990,5160,4074,5931,5152,5333,5608,5183,4762,5185,5515,5657,5178,4182,5638,5215,6177,4146,4026,3030,4139,6016,3732,5556,4138,4862,4269,6576,3971,3510,5273,5414,4012,3704,6152,6012,6680,2585,6049,4939,4003,5660,5007,3888,3652,5352,3911,5188,3877,5845,6433,4094,5925,5384,4577,5086,5317,5249,4330,6150,5371,5017,5064,5190,4206,3665,4759,6550,3879,2896,4544,5373,4737,4049,5250,4870,4762,5030,5507,4096,3847,4209,4132,3463,4184,7065,4534,5686,4078,4357,4742,4789,4262,4757,5649,3760,4276,3583,5907,5656,4202,3344,4014,4565,5729,4597,5185,6122,4860,5885,6317,3762,4243,6406,4255,4342,4583,5292,4661,6163,5925,4251,5001,3803,3968,3288,5382,3672,4036,3988,5467,3528,5023,4554,3503,4360,4210,5898,4180,5062,4305,5100,4672,4347,4094,5448,4741,3054,4655,3701,4691,5108,4374,5049,4986,6314,3336,4483,3901,4893,5767,4512,5647,5218,6553,5657,5487,6116,4917,4480,4945,4943,4897,4381,3985,4640,4319,6897,5342,5281,5301,5110,6164,4123,5138,6933,4315,5651,5779,3693,5930,4425,3969,4391,3979,5063,5009,3467,6481,4898,5536,3611,4949,6013,5068,4946,3748,4193,3934,5224,4165,6054,6289,5531,4109,3556,4107,4124,4443,4879,6682,6227,6176,4187,4001,4837,5314,4668,6478,4493,4677,4585,4166,4696,5019,3937,4246,3941,6572,4717,5196,5070,3446,4010,5535,5390,4234,4756,5798,4477,5905,4651,4009,4691,4312,6867,5666,6377,5611,5539,3930,4296,5365,4216,4643,4867,4918,6247,3512,4394,3775,5951,5231,6665,4981,5380,4526,4286,5213,6100,3690,5821,4963,5043,4803,5476,4044,4758,4318,3961,3593,5478,6498,4180,5469,4557,4083,5222,6413,3861,5123,5825,5364,4751,5423,5108,5977,4245,3999,5075,4215,5214,5668,5884,4583,5391,5953,4596,4516,3738,5088,4314,5046,3757,5925,5841,4973,4275,4442,6852,5644,4783,5114,5620,6204,5436,3945,5226,5255,4497,4336,5936,2980,4501,4076,4712,5404,5724,5142,4256,4637,5549,3473,4305,4962,4496,5130,3964,4989,5436,6549,4862,3795,4015,4135,5993,4546,4686,6099,3910,5213,5109,2734,3925,3634,5010,5688,5461,4066,5087,5741,6700,4546,3551,5600,5103,5692,5953,3640,4340,5442,5099,5252,3850,3665,6088,3786,4736,3796,4220,4356,4897,6001,4827,6725,4643,6000,5700,4770,4878,3776,4957,5277,6488,4707,4461,5833,3485,5115,4442,5934,5116,5341,4592,4841,5919,4516,5516,5673,2984,5135,5894,5772,4666,4754,4275,4437,5707,7542,4659,5265,3296,5718,5748,4582,3708,5376,4493,4902,3912,5751,6099,6155,6309,4678,3260,3304,5137,4734,4148,3764,3227,3946,5117,4672,5740,4391,2813,3535,4372,6532,3457,5499,6062,2840,4529,7258,3589,4029,5707,5123,4595,7327,6816,5135,7279,5111,6500,3480,3804,5067,6126,6530,4914,4863,6775,5573,5030,5067,4565,5451,4368,5274,4372,5198,5202,5300,4908,3638,4996,3763,5087,4337,6663,4763,5171,5789,4719,6024,2727,5638,5135,5226,4513,4645,6385,3773,4342,4087,4390,5281,5011,4614,5303,5244,5318,4367,4628,5972,7008,4731,5764,5901,5726,4124,4501,3276,5426,5043,5078,5072,6937,3835,3962,5961,5285,4284,5158,3850,5023,4400,5268,4293,4218,5216,5229,4386,3962,5068,5404,5076,6120,6004,3487,4147,4924,4935,4212,4666,5157,6426,3957,4951,4412,4302,4564,4040,5108,5138,4425,6595,5229,3709,4579,5505,5774,6403,3932,5122,4540,5596,5636,5341,5688,4843,6066,3956,5470,3783,4798,5769,4157,4006,5095,4778,5986,4356,4449,6790,3889,5873,6045,5448,4752,5743,6145,5236,5430,4256,7119,4656,4286,3801,3133,4600,6021,5286,5902,4846,4402,3617,5266,5638,5762,4806,5482,4042,5736,5714,5642,3872,4947,4307,4643,4948,4201,6269,4622,6193,5912,3652,3768,4312,4380,3978,6629,3302,2909,4870,5656,3971,4090,5691,4812,5972,5795,4448,4144,5707,5704,3668,5091,6313]},{"counters":[4699,4255,6083,4924,3998,3813,4948,5060,4582,4093,6003,4940,6271,6079,5359,3054,4002,4797,5166,4278,4192,4128,4567,3607,3967,4677,5266,5772,4009,5920,5622,4185,4263,4436,3328,3786,5862,4983,3841,4027,4815,5252,4357,4791,6001,6359,5379,5365,4562,4129,3586,4620,3582,4679,4978,8214,4891,6376,3991,3707,4324,5980,4687,5455,4190,3572,4817,4197,5164,4108,4972,6139,5748,5485,4322,4932,6809,3982,6159,5701,3947,4896,5423,4806,4091,5353,4938,3844,4998,4438,6137,4609,3937,4971,4294,4762,4921,4658,4648,3464,4648,5458,4409,4694,6197,4526,3900,3679,5419,5030,6083,4955,5442,4377,4856,5609,5415,3613,3074,4055,4856,5135,4840,2819,5416,4511,5758,5395,6163,6283,3301,5094,5991,4771,4707,5719,5518,4878,5113,4517,5086,4209,3965,4744,4499,5047,5321,3806,3482,4288,4453,4454,4453,5785,4923,5416,3844,5281,3683,5424,3996,4875,5487,4257,5368,3904,4549,5691,5714,5093,3936,6688,4311,5250,4379,4533,2891,4539,5159,7070,4237,3882,4815,4162,5820,4190,4063,4337,5585,4675,5497,5722,4510,4124,6079,4184,4637,5769,6189,4697,3189,4157,4166,4905,2832,3419,4226,4427,5197,4919,5145,4069,3868,3969,5881,3636,5612,3861,4814,5080,5750,5122,4587,5177,3492,6484,4873,3984,5342,4202,3619,4914,5235,4591,5628,5582,4664,5915,4578,3700,5434,4078,4329,3960,4161,4948,7325,5336,5489,4507,4454,3965,4455,4217,4808,5508,3779,4476,4412,3918,5492,6026,4878,4917,4919,4842,4913,6168,4858,4089,3862,4585,2743,4660,4718,5951,5862,5009,4872,5210,4965,6180,4276,5583,4688,3230,3873,5357,5431,4136,6502,5916,7462,5930,4957,4761,5894,5023,6015,5417,6907,5904,6583,6310,4157,5690,4750,3669,5054,6068,5161,4359,4474,6157,4165,5290,4882,5173,4388,4784,5342,4885,4781,4302,6118,4947,4693,4037,5151,5384,4701,5496,3968,5092,5159,4606,5456,5116,3759,4166,6387,4944,4583,6215,4476,5790,5345,5700,5260,4348,3533,5468,4831,3659,4353,4656,5568,4081,5917,3817,5271,4870,3868,3994,4649,2797,4746,3217,5263,3907,5014,4225,4602,4143,5001,6974,4852,4838,4147,3780,4895,4704,5095,4530,5190,4102,5253,3911,4416,4743,4694,4119,4425,4482,4399,4556,4939,4808,6183,4118,5206,4096,4781,4246,5559,6213,4858,6086,3696,5282,6690,3967,4992,5719,4540,6953,2841,4704,4609,4960,4194,4805,4730,5116,3788,5019,6402,4702,4651,4423,5169,4424,5610,4023,4079,4619,4452,5161,4683,6543,4101,4709,4669,5078,2768,4503,5107,7725,4428,3471,2597,4766,4596,5789,5206,6295,4658,4655,4828,3850,6546,4347,4204,5431,4932,5990,3874,4765,4906,4782,5182,4643,6427,4861,5848,6792,5860,5902,5249,4002,5033,4218,4248,4224,5065,5147,4623,3957,4315,4571,5168,3963,4782,4895,5926,6259,5177,4096,5103,4777,6239,4148,4890,4742,4053,4677,5957,6742,6534,5489,4512,4745,5627,7161,5804,4685,4449,3627,5482,4884,4837,4486,4227,5422,5200,6341,4779,4229,5620,3770,6084,3669,5303,5929,5244,6031,3572,3745,2781,3968,3795,3771,5968,5109,3852,6761,5186,4413,5580,3943,6342,5208,4899,5525,5843,5439,5000,4728,5801,4213,4304,5481,5084,4192,3872,5037,5552,4106,4665,6318,3522,7588,5872,3462,5062,5828,4233,4169,4502,4823,2731,5160,3902,5342,5119,5464,4966,7213,4410,5948,3426,4722,6041,3438,5506,4439,5575,4181,4214,5061,4155,4363,4458,4785,4253,5709,5511,5056,5651,4491,7764,5882,4489,6666,5757,6201,5300,5881,6218,5393,3990,6170,3531,4920,5416,5050,4343,3836,6154,4008,3963,4797,3964,5242,5754,4750,3313,4094,4301,6034,5347,3569,5374,3452,5039,7024,4936,3163,5407,4697,3969,4550,5320,5060,3814,4928,4453,4123,4678,5153,4071,5511,4767,5943,6193,4477,6564,4216,6138,6196,4260,5080,4038,5199,5954,4325,3997,6503,3926,3286,5787,5531,5676,6287,4996,4388,4396,4652,5239,6308,4416,6193,4356,5611,3248,4373,5590,4529,3907,4389,6025,4999,5330,5890,5320,5793,5267,4605,4951,3667,4843,5875,5371,3396,5125,5610,3490,4164,5095,4540,4660,4847,6200,4135,6376,4451,4899,4306,4796,3741,4082,5069,4334,5150,4514,4084,3864,4588,5200,4701,3099,4254,4795,5482,5028,3755,4963,4775,5170,3987,4599,4760,4887,3066,3624,5628,5354,5290,6133,3536,6960,3873,4391,4711,5645,4708,4637,3859,5959,5380,8112,4625,2736,5407,5040,5978,5734,5206,5366,4765,3792,3879,4220,4114,5500,5931,6486,5861,2311,4113,4778,4355,6500,3125,3618,4132,4572,6295,4417,4024,3805,4562,4076,4681,4714,4995,6170,4688,5178,4320,4132,4349,5419,4097,4841,4658,6831,6864,4433,4711,5377,4497,6124,4728,5249,6183,4866,5379,6231,3667,5196,6110,4297,3826,5792,5968,4258,3788,5215,4815,4713,4708,5107,4463,4388,5745,6442,5728,5066,4876,4480,3737,4552,3824,5660,4598,5179,4629,5222,6752,3814,4493,4957,5184,4708,5439,3427,6194,4501,4464,4660,3890,5819,4716,4684,4685,5052,5330,4832,3759,4647,5694,5026,5351,3646,5601,5306,3280,5029,4184,5247,4352,5755,6191,3280,5010,6284,4720,4983,4909,4395,4527,4923,5101,6314,5526,5584,5996,5371,4756,2651,5310,5807,5969,5602,4595,6275,4082,4146,4085,4615,4960,4267,5879,5370,3823,5228,3888,4359,4988,5069,3798,5556,4165,3363,5884,3491,5718,5011,4849,5570,4054,6316,5289,4283,4111,3624,4807,5446,5570,4837,5684,6265,5294,4930,5048,4442,3686,3904,6294,4846,5547,5167,5123,4422,4895,5033,5358,5330,4292,4664,4859,4219,5010,4163,3742,3820,2921,4777,4749,4696,4084,3920,5423,5236,4186,4170,5612,4352,5855,5154,6034,5195,5150,4048,5442,4465,4049,6216,4995,5233,4358,4648,5058,4210,5472,4404,5012,5059,6000,4765,4789,3709,4326,4485,4644,4390,4216,4174,3701,4417,5049,6649,6563,4685,5736,3381,3427,4197,4146,4242,6248,3383,4389,4786,4845,5308,5561,4786,5372,4074,5715,4713,4205,6257,5146,5041,4015,3765,4364,5427,5151,5098,5662,4996,4347,4327,4956,5673,5227,3129,4053,5126,5285,5263,5598,3919,5028,5499,5178,3846,4362,5747,5476,6061,3642,4774,5748,5779,5623,5006,4383,5580,4773,5161,2968,5706,4615,6299,4879,5347,5006,4021,6629,6266,5608,4540,5008,4477,4819,4447,3356,3907,4519,5546,4796,5371,4950,5773,4980,6008,6643,4667,3601,5585,4175,4472,5392,3251,5293,5530,4671,5508,5483,5230,4498,4380,4622,4256,4405,4650,4713,4803,3738,4602,4551,4727,5517,4770,3009,4831,5209,5629,3640,4921,4049,5443,4293,5321,6012,4206,4976,3371,4863,4296,3447,4098,3790,4016,4535,6285,5154,5569,4544,4083,5061,4901,5669,4854,3923,5500,5040,5062,5386,5320,5749,4801,4443,5658,6076,5438,4998,4195,3940,3466,4544,5739,4276,3300,5041,3666,5642,4666,4872,4794,4633,5207,5802,6718,4516,4606,3030,4593,5812,4859,5641,6030,4440,4001,4217,5434,3123,6791,5084,4632,4095,4312,5751,4102,5070,6664,4420,6066,5001,3574,4425,6271,4597,5350,5020,4474,5914,4436,3948,4490,4242,8760,4497,4884,5662,5545,3039,3992,3645,4829,5670,5635,4707,5800,5888,5035,4907,4584,5023,5465,4533,5170,4373,5687,5347,5720,4092,6340,4804,5005,4808,5068,5259,5038,5715,5773,4425,4563,5403,5487,4542,5853,3380,4457,4987,6007,3742,5116,4200,5185,3272,6402,4599,5567,4903,4773,3276,3470,4604,3907,4201,4696,5776,5417,3719,2984,3427,5075,5182,4930,4421,5068,3253,5427,4077,2996,4741,3882,4159,4221,3805,5641,4736,5306,5563,4410,4901,4340,5769,5713,4620,3453,5965,5409,5205,6805,5294,4887,4706,3138,5147,5229,4082,5152,6618,6259,4492,5201,5168,4630,4329,5007,4251,5786,6711,4046,5635,6617,5389,6130,4582,5231,4243,5161,5473,5475,5462,6895,5513,5836,4891,5117,5601,5383,3288,5159,5601,4613,4878,4403,4611,6990,6778,3711,5671,4541,4823,4980,5063,5403,5288,5006,4180,3484,5606,6090,4704,5018,4730,4769,4486,4662,6308,6436,5244,4419,4082,6302,3852,3980,5801,5318,5255,3996,4525,4231,4900,4492,3846,3117,5653,3578,5111,4165,4105,5079,4774,5634,4325,4529,4296,4636,4863,4441,4208,5434,4588,6088,5409,5986,5754,4354,4836,4149,4628,5518,4201,4312,5061,4400,4706,5055,3266,2287,4033,4399,6003,3901,5102,3956,4222,5187,5270,4331,4824,5763,4416,5092,4819,5462,5125,5150,5856,6116,4218,3074,5063,5033,5860,5004,5223,4568,4780,5037,5426,4448,4355,6006,5713,4149,4949,3972,5185,5022,5178,4670,3660,4586,4844,5278,5074,6204,5987,4935,4221,6270,5242,5457,3438,5042,4188,4378,5929,5247,3566,5314,7820,4010,4632,3449,5690,4746,3801,4201,4225,4789,3707,3580,4351,4467,5068,4961,6012,4260,4362,6220,5276,3908,5766,4511,3718,4549,4255,5672,4849,3266,5171,3644,4977,5399,5348,4211,4297,3997,5235,4322,4093,4362,5712,5901,4603,4063,5321,5334,5900,5022,4818,4995,4318,5246,4256,5275,4724,4623,4740,4447,4515,4897,3764,4083,4323,4360,5683,5710,3915,5052,4849,3677,5204,4982,5747,4728,4734,4610,4536,4374,4286,4046,6788,5766,2863,6246,6220,4047,4976,3802,5305,4172,3445,4053,5686,4997,5162,6790,6081,5291,5827,3510,4888,4922,3698,3470,5289,5338,5569,5436,4798,4614,4234,3656,5693,5522,5832,5735,5417,5946,5747,4499,5150,4892,3645,6926,6194,6229,4303,4901,3177,5200,4912,8007,4932,5742,6125,4067,6097,6077,4345,4882,4660,4008,4436,5502,3814,4110,3881,5022,5447,5413,4276,5041,3115,5715,5932,5031,5293,6135,4903,5503,5359,3862,5103,5159,4651,4877,3941,3466,4978,4202,5617,5049,5170,4998,4188,4940,2967,3956,4917,4847,4055,4834,7587,5557,3875,3786,5398,5056,5431,4534,4403,4761,3580,3328,5648,4230,6184,5229,4363,4985,3986,5595,6374,5526,5729,4749,5254,5135,3184,5805,4622,4794,5143,4329,6051,6196,4135,4613,5310,4718,3659,5267,5166,5507,4188,3551,4927,4889,5711,3762,5675,4955,4534,5359,5631,5804,5786,3800,4581,4574,4641,4890,4474,6509,3361,5639,4252,3187,4890,3825,6634,4271,5912,6764,6339,3162,5622,5111,5667,5774,4867,3725,5138,5360,3691,5298,4885,5817,5126,5459,4193,5234,4796,5489,6839,3993,5350,5297,4343,4977,5042,4473,6661,5101,4275,5170,3677,4257,3984,4345,5167,4996,4208,4350,5174,4324,3574,5165,2880,4711,4573,7092,5426,4828,4665,5905,5579,3343,5308,5599,4562,5498,5403,4491,4848,4404,3131,6141,4306,5707,2434,4579,4287,3823,5076,5049,4332,6357,3346,4966,4377,5619,7971,5355,5303,4538,3941,5689,4587,4511,4037,4800,5909,5382,5727,3304,5425,6641,5177,6341,3573,4321,6292,4303,5226,5008,4084,5165,4452,5073,6560,4438,3740,4197,4892,5201,5220,3751,4946,5655,5516,5252,4765,5431,4887,4991,5973,6075,3749,5933,5809,5927,6158,5426,5802,5063,5291,4195,4940,4680,5767,5036,5140,5648,6528,4434,4082,5522,4720,4225,3923,3995,4478,5483,4771,4783,3122,4700,6697,4542,4742,4393,5194,3294,3572,5060,4215,4634,5201,6292,5138,4939,4319,4967,4432,6305,5135,5221,5727,6561,6125,4742,5405,6520,4625,6259,3100,4009,4309,3730,5328,5036,3787,5866,5373,4734,5389,5253,5734,4622,5353,5646,5696,5229,5227,3684,5223,3548,5471,6750,5008,5185,3369,4098,3914,2820,6841,4368,4542,4169,3768,4381,6187,6005,4797,4110,4969,4233,4604,5722,4537,4668,6019,4654,6227,4147,4053,3565,6956,4174,4744,5586,6181,4332,4998,4474,6248,4827,5657,5747,4958,4609,3610,3241,4099,5222,5026,5172,3246,5448,4380,5641,3854,4491,5677,4552,5085,4789,5167,5125,5450,6053,4806,5641,4028,5339,4394,5079,5374,4264,5333,5357,5706,4256,6599]},{"counters":[5409,4352,3614,5612,4382,4222,5441,6919,4759,2837,3894,4722,4197,6762,5914,4425,4596,6275,4868,4424,4726,4968,6023,3324,4466,6071,4861,4162,3715,5390,4359,6183,5227,5135,4953,4436,3853,5375,4351,4623,3253,5928,4374,4045,5521,3728,3566,5306,3546,4019,4558,5322,4515,4746,4567,5651,3093,6316,5604,4968,8033,5155,3625,4870,4680,5328,4890,4895,5049,5099,4817,4634,4284,5486,3958,5192,4615,4356,4980,4292,4186,3500,6470,5505,5360,4400,3872,4815,3768,5564,4222,4869,5079,4932,4904,3787,6880,4203,3598,4491,7399,4075,5816,6252,4251,4246,5993,6304,5899,3489,5605,4759,4150,5005,5464,6697,3725,5196,4607,4278,5076,5434,4948,5509,4951,5696,4359,3120,4639,3116,4753,5529,4666,5905,5910,5633,5353,4735,4256,5565,6640,5640,5695,4594,6480,5064,5527,4978,3445,4355,4685,4555,5341,2673,3784,7254,4929,2685,4138,5386,3404,4408,5667,4310,4824,6290,4988,6100,4770,3790,4003,6159,5217,5343,4097,4699,5223,5365,3852,4661,5728,4701,3232,3545,5560,5319,5804,3433,7189,4059,7301,4721,5401,4201,5311,5440,3516,5993,4633,5848,5054,6143,4249,4731,3504,6376,4155,3617,5528,5502,4967,4734,5279,4684,5118,4645,5921,5355,4916,5428,3356,4497,5574,5216,5157,6978,4574,4549,5930,4006,6011,4423,3778,2941,3870,5340,4853,6768,3970,5499,5843,3121,5267,4573,3372,5879,4335,6873,4368,3288,5564,3886,5243,3566,4276,5495,5049,4887,4992,5552,4279,4821,6146,6339,4418,4911,3928,4746,3933,5014,4042,4773,4356,4518,3512,5305,3980,6616,4422,5170,5176,4552,3837,5183,5378,5455,5188,5316,4593,5821,5001,3926,4327,6168,4690,4647,4094,4391,4851,5037,4746,4880,4447,4940,5189,5696,4737,4495,4573,3101,6557,4665,4586,5061,4524,5419,5388,4722,5562,4388,5370,4950,5065,4969,5897,4656,5709,4802,4540,4579,5277,4519,4577,6131,3574,5582,5684,4174,4769,5445,6103,4355,3873,4165,3954,4512,4669,5352,5538,6398,5732,5480,4789,4775,5126,6127,5823,4714,4275,5447,4228,5765,5061,4606,5350,4951,5495,6273,5156,6530,6906,4024,4172,6715,5176,3447,4768,5657,4573,5618,4677,4986,5188,5449,5244,5805,5370,5679,5449,4419,7288,4059,4650,4024,4789,4639,5750,4698,4571,4314,4814,3196,4634,5091,3394,4842,3811,6155,5879,5561,5874,4545,4335,2373,6405,5443,3437,6076,3848,3771,3935,4223,5340,3986,4984,4814,4492,5445,3924,4808,5116,3720,4732,4844,3439,5197,4663,4599,4167,4202,4284,3491,4391,5098,5206,3617,4000,4859,7763,5959,4417,4661,5938,4566,4396,5295,4681,4672,3649,3724,5718,5057,3792,6272,4242,4524,6067,5446,4783,4579,4269,5056,5382,6124,4462,4088,5459,3909,5362,3010,5641,5748,5092,5399,5656,6383,3399,4645,5127,6759,4539,6632,3245,5552,4073,6489,5190,4812,4133,4174,5741,4880,6095,7077,5717,5507,6371,5914,5490,5166,5395,5490,3452,3689,4631,3555,4955,3248,6377,3724,4656,3815,2997,6223,4384,5509,4521,3758,4191,6274,4573,3527,5537,5408,4365,5102,4543,5916,4396,4290,4128,5359,6396,3401,4441,4392,6198,2650,4304,4246,5268,5759,5174,4337,5518,4440,4359,4883,5406,5547,5234,4626,4333,5030,5005,4547,4759,5140,3718,5086,4132,3880,6454,5114,7250,4909,4834,5020,5131,4937,4784,4354,5962,2795,3293,4932,4214,4004,3852,5392,6526,5462,3432,6044,4932,4831,4584,4938,4912,6033,5264,4473,5002,4604,6585,5739,6151,4609,4008,5212,4001,5466,4809,4590,3657,6023,5198,5660,5365,6602,4930,4604,6212,4065,4244,4360,3932,6639,5083,5524,5697,5041,5620,3807,4915,4780,3211,5156,4322,4682,4913,4908,5185,5373,5221,5799,6230,4476,4401,5274,4978,4371,5810,5457,7067,6058,4560,3931,3569,6225,4735,4816,5411,5483,5009,5209,3868,5908,4764,5143,4796,4231,5217,4734,4287,5284,5083,3702,3726,5006,4288,6418,5463,5347,5299,4609,4574,4673,4769,4667,4391,6247,5459,5157,5804,5516,5088,4493,3912,4697,6860,5091,5016,5991,5254,3498,3167,7765,4306,5666,4852,4570,4597,6407,4139,4377,5178,3494,8511,5202,5519,4903,3628,6360,4285,3908,4316,3203,3471,3515,6911,4103,6238,5379,5735,4217,4662,5638,3399,4892,5013,4108,6416,5195,3860,4263,4229,5197,6095,4520,3980,4763,5127,4843,6418,5212,3675,4720,5129,5339,5370,2900,4489,4865,4615,4595,5984,4617,5028,3955,4793,4637,4426,5714,5183,4424,3630,4065,5093,4276,5283,7746,5196,4948,4560,4955,4849,5575,5411,5230,3348,3863,6613,4964,4343,4593,6241,5184,5392,5632,3780,4644,4779,4872,5250,5848,3971,4593,4938,4365,4825,5501,4737,5513,4032,3809,4968,4830,4445,3301,3830,4814,3962,4598,5406,5467,4936,4953,5815,5096,3547,4448,3473,4463,3756,4326,4107,3340,6158,5259,3874,4369,5480,5376,5102,6055,5078,5521,4772,5120,3739,3918,4505,4773,5834,4556,3503,4476,4782,7288,3434,4821,3125,3648,4911,4748,4519,3435,6170,4346,5250,5101,4556,5004,4606,4343,5907,3174,7219,4246,5532,5748,6104,4962,3566,3598,6209,4370,5965,4888,4629,5626,6026,5212,5063,4917,5389,4301,5987,5598,3368,3588,4278,5145,5614,5371,5867,4183,6001,4495,4531,6683,6889,4284,4601,4980,5497,4729,5118,3175,5340,5033,4421,4957,4586,3148,3070,5419,5015,3840,4366,6230,5283,4144,4486,4303,3414,4125,5475,5447,4084,5006,5680,4229,5734,4871,4581,4926,5482,5615,4528,5832,4258,5877,3969,6489,5295,5727,4130,4489,5751,5596,3379,4303,2948,2965,3982,4302,4968,4691,5391,5300,4988,3635,5763,4092,2972,6241,3279,3953,4649,4891,5088,6135,4368,4188,3797,3040,4977,5003,5162,4956,5586,4282,5492,5266,3197,5750,5232,5052,3982,4150,3991,5543,5226,4860,4731,3733,6098,6470,5350,5085,5256,6157,4582,4253,4249,6769,5037,5107,6031,4639,4998,4038,6264,4759,3410,4785,4804,4240,4181,4226,4426,5321,5085,5432,4750,4003,5349,4618,4824,4973,4981,2750,4307,4161,2640,5655,5047,4339,3918,5493,5030,4410,4830,4661,5234,6235,4223,3754,5756,4770,6720,4604,3714,4003,4409,3903,4677,5374,5644,5842,4199,4767,3585,5197,5309,6466,2660,4765,6685,6848,4639,3563,3724,5541,5299,4840,3652,5665,4515,5980,5384,5532,5999,5634,4838,5641,6646,3084,6144,5447,5090,3920,3956,4172,4977,6409,5311,4306,3889,4307,4038,3969,5185,5812,5609,4778,4427,4666,5789,5023,4657,4031,4198,4635,4535,4646,5837,4314,5649,4384,6632,4667,3709,6847,4543,5202,6032,5054,4975,6048,4139,3063,5737,5171,5438,5903,3557,5183,3762,4933,5894,4352,5819,4761,3543,4133,5125,5441,3511,3686,4662,3667,6148,4496,6490,5465,3870,4634,6916,6016,4736,4461,7488,4705,3867,4960,4807,5271,5983,5190,5601,4624,4037,3708,6642,6280,5858,3035,2437,3842,6581,4408,4105,4351,5037,6236,4747,4566,4925,5362,3632,5113,6021,4868,5016,4789,4708,5699,3416,5277,4781,3642,4244,4555,5479,5853,4116,3592,3470,4876,6122,4046,5761,6803,3113,4932,5892,6417,4091,4742,5093,6247,4216,5116,3215,4604,6056,5038,6278,4428,6098,3774,6194,3705,3524,5445,5757,4544,4340,4095,5461,4663,5079,4584,4546,4448,4498,6040,4654,4349,5115,4515,3977,4961,5728,3748,4447,4438,5978,4275,4693,6396,5344,3680,4765,4918,5364,5955,5931,5633,3732,3850,4975,5225,3860,3858,4934,3213,4906,3814,5074,3598,5071,4817,5127,4281,5130,5432,5582,3526,4670,4348,5059,4992,4586,5470,5646,4885,6539,4434,5798,4162,3080,6762,6332,4852,4547,4788,5185,5749,6690,4582,4427,4197,4273,5100,5590,5611,4281,4623,3825,5341,4427,5812,3836,3546,5440,5825,6825,4425,4453,5774,5835,6426,4546,4420,5510,5035,5443,7205,6083,4504,5644,3980,5983,3464,4966,3777,4496,4890,5137,4568,5783,6090,5227,4322,4447,3819,4942,5643,4569,5249,6588,3624,6152,4343,4105,4411,3694,3275,3897,4498,3610,3222,5592,5051,3308,5550,6059,5295,5029,3667,4129,3060,4226,5505,3860,4588,6864,4001,5282,5346,5179,3507,5018,5580,5374,6478,5560,3650,4039,4704,4186,3243,4910,5127,3917,6563,4288,5892,4478,5997,4147,3746,4465,4849,6527,4461,5441,4984,5287,5109,3557,6933,3939,4709,4205,4354,4168,3636,4847,4895,4481,4340,3964,6023,5391,4592,4584,4756,6024,5516,4969,5480,3870,4401,5668,5366,5010,5567,5114,3875,3935,3705,3825,5767,5376,3132,4958,4497,5949,4410,4911,3506,4643,5141,4548,4779,6426,4661,4475,5905,5103,4510,6290,5004,4785,3900,4650,5981,5426,4862,4865,2008,4082,3967,4712,5774,4218,5924,3857,5856,4090,6352,4362,3884,3870,4773,4338,4159,5367,5406,5567,4913,6551,4619,6312,6127,4356,5478,5137,4428,5244,5247,4121,4954,4835,5410,3366,3972,4867,5958,4518,3634,4788,5559,4288,4607,5124,4586,6411,4893,3419,3741,4078,5765,3786,5689,6115,5827,4493,5532,5252,5894,3900,4609,5970,5543,6030,3726,5996,2683,3763,4322,6048,4359,3320,5947,4262,4977,5644,5407,4330,5327,3857,3450,4809,4143,4133,3752,4864,5364,5507,4529,4672,4435,4952,4399,4995,4835,5903,4397,4173,4809,5585,4248,6526,6324,5499,5637,5707,5861,5540,5671,5924,4398,4808,5203,4510,4332,4563,5711,4607,5292,5936,5364,4396,5210,6057,3547,4904,4099,4803,5689,6411,4636,4236,5801,4367,5219,5924,3903,3759,5188,5669,5760,3987,5123,4110,3365,4663,4682,4139,4483,5024,4592,3267,5097,4924,5384,4030,5979,4450,5183,6116,4029,5194,6129,4169,5264,3352,5206,4900,5248,3893,4768,4895,4731,5265,5434,5185,6007,5810,6492,5537,7691,5630,5173,3858,5265,4272,6519,4024,6307,5511,5403,4213,4144,5630,5032,6523,5198,4070,4497,5944,4469,4600,5900,3975,5603,4965,5340,5212,4355,6149,5970,4730,4705,5429,4284,5327,4552,4996,5171,6950,3574,6264,4799,4208,5189,5057,4292,6050,5055,5446,4994,3433,3194,4475,4915,4302,4172,4226,5342,4990,5635,3958,4293,4539,5268,5702,4780,3398,3711,5097,5046,5276,5013,4137,4980,3539,6395,5423,5442,5106,5312,7391,4625,3596,5923,4417,5183,4296,4248,5806,3582,3878,5598,5603,4916,5690,4671,3155,3738,5390,4272,4713,4199,5328,4395,4105,4791,4603,7450,3864,6061,5922,4960,4903,3707,4503,5850,5514,4931,3848,5134,4552,5030,5146,4568,4952,4723,4501,5331,5208,6276,5107,4373,4018,4565,3766,5361,4664,4579,4137,3849,4215,6233,3710,6907,5712,5804,4551,4147,6027,4860,4533,4746,4659,4897,6058,4019,4499,4215,6271,4470,3832,5206,5798,7033,4534,4065,4680,3835,6182,5829,3740,3780,3509,5672,4081,5325,6043,4321,6412,4492,3350,4925,5490,5629,6309,5880,5314,5786,3604,5311,3747,6059,5633,2847,4159,3319,4454,5407,5526,5986,5043,5438,4072,6187,4918,4330,5243,6397,5325,5790,4510,6675,4816,5202,3747,2688,5482,4268,4567,5297,6866,4910,4867,4396,5214,6025,3859,5356,4535,5323,4526,4588,4442,4901,4940,4949,5142,4343,4725,5086,3143,3750,4387,4523,4794,6199,5811,5511,5138,4326,4325,5344,5262,3700,4862,5098,6869,4471,4268,4881,4157,5521,5161,3242,5870,5716,3882,5880,3623,4379,4971,4487,4661,3976,5496,5580,4833,3700,5042,5586,6076,3898,4161,5995,2969,5922,4279,6058,5641,4051,5548,3861,5275,5775,5772,4621,3864,4683,4090,5755,5224,4367,5247,3028,3412,4516,4314,4679,5630,4893,4800,4314,6282,4971,4294,5136,5100,5500,5052,4701,4645,4560,4167,4815,3601,4061,7148,3837,4778,5789,5278,4809,4868,6700,4611,5348,5403,6132,3663,4828,6270,5880,6471,4715,4586,3662,5418,4148,4104,4968,4197,5448,3664,4592,5310,3290,4727,4873,4376,4714,4170,4876,3944,4135,4877,4027,5004,5167,4066,4053]},{"counters":[4649,4802,2799,4452,4753,4486,5539,3592,5497,5239,5465,2844,4141,5141,4164,5107,4368,3128,5878,3864,4701,4238,4772,5347,4216,4982,6468,5504,5079,4434,4400,5949,5944,3539,3822,5810,4311,3336,4082,4197,3899,6106,5386,5390,3785,3761,5894,4956,4681,5269,4449,4001,5486,4544,5993,5219,4539,3957,4672,4393,5503,5160,4996,4037,5413,4790,5455,4728,4166,5149,4952,3807,5068,4690,3309,5053,4581,4711,4554,4681,6254,5426,4378,5521,5427,4615,4111,5019,5587,5486,5347,4408,3781,4129,5844,5961,4957,5379,5808,5362,5015,5100,3965,4207,5876,5187,3684,4438,5522,6070,5048,5834,5952,4752,4094,5085,5094,4733,4936,4894,5438,4069,4178,3482,5449,4496,4123,6335,5367,4034,4897,4449,5633,4329,5415,5541,5703,5731,4224,4456,6491,6127,6317,4251,5357,4355,4814,5360,4204,4274,4172,4362,4962,3634,5421,6389,6590,3765,4521,5030,5773,5144,5410,5590,4153,4705,4736,5448,6170,5594,5159,6056,5306,3952,4843,3925,4578,5896,5289,4426,4365,6013,2874,5014,6187,4550,5444,6636,5529,4179,3963,3819,3647,4002,5691,5137,4344,4214,4638,5266,5256,5140,4598,6328,4349,4915,6468,7192,6102,4395,5700,6559,6132,4069,6632,4054,3129,5400,4286,5146,4359,5200,4693,3669,5852,5925,5278,3721,3124,4966,3941,4178,3517,5516,4301,4677,5487,6140,7541,3825,4721,4945,3604,6118,5671,3284,4327,4892,4708,4961,6962,5012,4459,4874,5356,6152,4329,4241,4525,4578,5111,4545,5560,3859,4935,6173,5400,4101,4166,4340,3870,5074,4925,5114,3271,5530,5778,4930,4123,3126,6191,5044,6130,4225,4448,4517,5069,4712,5837,5362,3528,5072,5814,5230,5264,5074,4987,3402,3757,6033,4200,3978,4388,4601,4581,3343,4349,5645,4702,4629,6135,5557,4959,5399,6052,5154,3930,4554,3523,6117,5910,4948,4807,5176,5054,5808,3207,4324,4093,5836,3567,5343,4427,4794,5897,6165,5175,4658,4669,3466,3043,4415,4988,4681,3475,4464,4443,3903,5394,4884,4466,4498,4587,4048,6842,5125,5477,5125,3855,5837,6225,4171,5526,4282,4260,5638,5890,4610,5305,3851,3969,5817,5892,4789,5455,3114,4619,5210,6074,3337,4313,6357,7176,5511,6674,4690,5603,4176,5587,5632,3186,4287,6191,6292,5369,2517,5695,4715,6049,4340,3817,4942,5984,6617,4124,2960,6616,4257,5107,7378,6296,4859,4574,4275,4541,4195,5349,5479,3549,5590,5070,4066,6098,4273,5335,5146,4749,5015,4916,4948,4875,4121,4674,4544,4792,4680,5120,5253,3933,5637,6133,4700,4824,4630,5204,5848,5896,3165,5615,4893,4007,4001,4572,5056,5681,4067,4897,5791,5266,5514,6197,4915,4204,5320,5268,4396,4421,5174,4946,3944,4552,4496,5848,3494,5327,5664,5007,5006,5232,4348,4268,4747,4122,5197,4722,4425,6036,5504,3657,5267,4317,5586,5506,5888,5692,5596,4371,3440,4500,4320,4769,4761,5195,4613,6753,3068,4882,3665,5886,3450,3999,7248,7183,3345,5584,5030,5906,5009,5658,6644,5848,5201,4595,3588,4440,3757,7661,3854,5256,4104,4770,4564,4150,4549,4334,4453,5152,5141,6190,5403,4048,5503,6674,4681,5092,4838,5039,4842,4358,4595,5120,4381,4050,5419,3737,4691,4284,4353,5617,4901,3690,4969,6512,5723,5398,5929,3363,4740,6367,4446,5034,4456,4275,4897,4487,5755,4403,6100,4835,4124,4366,5780,3246,5826,5409,5936,4600,4930,4188,4373,4983,6039,3723,4779,3756,5385,4401,5427,4266,6146,5273,5016,4723,7033,5171,4272,4020,5238,4944,5264,4710,3462,5221,4619,5768,4307,4569,4247,4278,4778,6033,5603,4836,5192,4404,4385,6272,5290,4181,5379,4381,3168,5062,2892,6084,3176,4492,4874,4237,4333,4768,3839,4934,3575,4327,4626,3688,4803,4853,3857,5628,5484,4372,5995,4386,4239,3704,5585,4686,5214,5977,4678,3926,4792,5303,6893,5229,6698,4310,4282,6179,5364,5572,5349,5081,4745,4326,4564,5057,4729,4491,4789,4079,4397,6420,5557,5464,3797,5555,4189,5310,5023,4749,3963,6222,4217,5333,5033,5254,6198,4145,3453,4383,3386,5379,2862,4975,4294,4417,4960,6416,4889,4520,6001,4420,5004,4998,5878,3945,3750,4267,4786,5939,5904,4565,5305,4452,4863,5022,4481,5769,4483,3268,4962,3661,5677,6199,4240,4371,4643,3570,4610,4270,4387,5340,5952,5867,4183,3305,5359,5150,4292,6664,5426,4797,2631,2870,4878,4478,4210,5149,6231,3833,4269,5037,5253,5281,5420,6318,5690,6203,3927,3944,5523,5287,4533,4597,3718,5869,5275,5077,6248,4519,5595,5272,4351,4880,4345,4184,4612,4160,4260,4731,5483,5486,3895,5037,5402,5918,4915,3889,5073,3972,7140,6028,4105,5936,4473,3733,6218,5887,5094,5487,6891,4124,3886,3382,4676,5158,3708,4722,6623,6291,7717,4322,5352,4795,4573,5257,4332,5169,6850,4197,6232,5202,4039,3951,5047,5479,5527,6072,4159,5123,5814,4535,5206,4553,5665,5258,4092,3175,5618,5367,4966,5128,5419,4840,4907,4660,4659,4907,6869,5744,4125,5181,4221,3460,4513,4429,4343,4650,5661,4625,5963,5037,4273,5286,3515,5854,4607,5375,5078,5465,4445,6874,5529,3866,3872,6027,4322,5431,4866,4536,5224,5180,4786,6095,5673,4952,5611,4264,3873,5508,4274,6306,4738,4415,4635,4183,4394,4167,6285,6009,2815,5343,7525,5118,3621,4106,5270,4703,4242,6643,5289,3405,5164,5102,5404,5374,2907,4655,6071,3721,4652,3426,4930,3558,4833,4394,4538,5438,4804,5538,5559,4831,6457,7174,3329,4424,4877,5671,5922,3658,5072,4551,3674,5730,3843,4474,5461,5567,5077,4852,3544,4108,4486,4548,4218,3818,6657,5609,5736,5033,5223,5522,4943,3525,5672,6142,5105,4358,4055,5897,5367,4402,3694,4949,5510,5304,5257,4779,4264,5676,5596,5453,4459,3330,4605,6134,5454,3925,4054,4473,5814,3768,4779,4768,5655,6351,4638,5940,3776,3223,6176,5684,5988,3603,5539,4584,4081,5665,4235,4581,5614,4521,4614,5381,6510,4511,5194,4207,5595,5879,5344,5399,6543,5501,3805,5646,4098,5776,4205,4671,4783,3710,5288,4683,4377,5688,5268,6243,3386,4625,4497,5623,4183,6023,4444,2922,5170,4568,4178,6213,5408,5887,5207,1802,4724,3603,4083,5828,3708,3228,4391,4035,5410,3978,4297,4650,5373,2780,4985,3779,3974,5286,4359,4504,4700,5935,5229,5134,4979,4745,4976,4329,5223,4848,5733,3911,5633,4921,3500,4494,3923,5791,3248,5311,5210,3201,6934,5176,4428,6779,4609,4943,6526,5956,5821,5754,3735,4144,5631,4525,3459,5956,4374,6669,3259,4341,5613,6188,4866,4721,4872,4210,4076,4563,4543,5176,5062,3814,3388,5070,4501,6444,7180,4778,4342,4238,4715,4627,4759,5368,5633,4224,4690,5555,4028,5478,4655,5308,6444,4549,5951,5743,5248,5079,4789,5298,3513,4263,5849,4119,4719,5416,4267,5979,5532,6178,4572,4227,3850,5043,5742,5656,3954,5016,6387,5089,5786,4962,5071,5077,5516,6636,3973,4526,5901,5711,4476,4165,5816,5189,4914,2775,4392,5558,4317,4423,5566,5865,5012,4371,5392,3590,5025,4049,5938,5172,4519,2854,6235,5666,3640,3651,5870,5356,3561,4053,5110,5034,3661,3806,5172,4190,3962,6631,6025,5200,4133,5772,3645,5369,5566,5209,5224,4402,4944,5162,5234,4995,4959,5520,5648,4879,4680,5166,5787,4803,5111,5443,7162,5208,3964,4524,3940,5147,4885,2233,3501,4008,4955,5263,4494,6333,5952,4757,5354,4314,4723,3796,3768,3655,3534,3243,2962,4287,6854,3780,5657,6649,3273,5296,5381,4612,5476,4721,3850,4834,4794,5007,7800,4718,4589,6125,4705,4941,5626,5714,5091,3734,3231,4205,4332,4868,5145,4403,4643,5256,3916,4915,4217,4903,5528,6822,5490,4981,4927,4954,3665,3104,5676,6085,8074,3991,5296,4744,4711,5002,3754,4157,5034,6342,4368,5530,6688,3437,4524,4147,5101,5373,4056,5351,3579,5398,4545,3121,5898,3677,3793,5156,5539,5027,4049,5048,4991,3527,4268,5138,4401,7953,6069,4192,4903,5217,4571,4159,4112,4896,4069,5051,4801,4610,4235,5690,4931,4621,4977,4544,4375,4050,4144,5113,4426,3954,4975,4200,4944,5686,3937,3552,6713,4698,6064,4545,4305,3991,3716,5078,5037,6221,4966,3957,5896,5500,3391,4985,5117,5349,5599,4832,5246,3702,3773,4541,4055,6055,5995,2941,4212,5960,5656,4993,2563,3976,4266,4082,5554,4329,4918,5202,4579,5111,5062,4789,4631,4447,4524,5892,6083,4267,5315,2760,5043,4449,3375,3530,4801,4981,3606,4377,5287,5659,4405,3826,2822,5265,4737,5340,6058,5324,4837,4726,5870,3497,7354,4720,4089,4902,3609,5877,5074,3668,5599,4365,6219,4493,4537,4559,5153,4212,5587,5950,4615,4598,6828,4475,4602,3269,5634,3432,4622,5028,4923,4414,3328,4618,3549,6055,5408,4539,4429,3730,6961,4993,4383,4135,6438,4342,5786,4467,5733,4765,4476,4843,4320,6488,4943,5939,5553,4162,4605,6990,4889,6822,4398,5101,4253,4499,5173,4413,4404,5612,4248,5212,5146,3741,4780,6422,5565,4897,5609,4752,4954,3719,4521,4407,4769,5490,3912,5562,6632,4763,5227,6272,3841,3944,5062,4334,4500,4429,4831,4336,5137,4955,3233,5185,4568,5888,5166,5833,4907,4565,5173,3464,5518,4240,3829,5681,4898,5453,3680,3856,4702,6494,5253,5889,6846,5477,3989,5039,4960,5845,4261,6397,5286,3224,5241,5268,3167,6106,5513,4534,4358,5235,4565,4193,4213,3831,4914,2935,5322,4415,4515,4546,5357,6183,4686,4752,3936,4183,4745,4625,4132,3505,3787,5146,5583,4526,4012,4319,4837,6085,3920,5238,4461,3114,6537,4024,7112,4509,5429,5793,3106,5074,4890,4561,4620,6131,4565,3753,5571,5393,5255,5732,6262,5663,6545,5356,5534,4090,4406,5659,4839,3703,5696,5067,4389,4255,5085,5531,6903,5207,4608,6369,5292,5745,5539,3892,5094,3821,5435,5926,5239,3836,4179,6280,4079,6756,4875,3695,4553,5261,4554,4334,3565,3662,4401,4813,4984,3956,5353,3374,4311,5527,5639,5981,4568,5803,4557,4752,3598,5690,4172,4042,6547,5161,4192,3728,4398,5677,5539,6127,4062,3643,5452,4103,6308,6230,5101,5946,5020,4315,4357,5608,4819,6467,4187,5702,7549,5429,5063,5584,5570,5081,4147,4281,4351,4766,4628,4688,6818,3845,5181,5134,3789,6451,4453,5169,4147,5570,6051,5318,4296,6264,4110,4865,4532,4832,4432,3486,5171,5461,4979,3926,4120,4925,5248,6162,4029,5541,3057,3680,5104,3081,4727,4989,4730,4634,5653,3847,6397,4637,5783,4598,4439,5923,3945,4872,5290,5222,5598,4406,4826,4538,4995,5169,4838,5025,4440,3587,5331,5028,4906,5400,4306,4585,4645,7454,3981,4798,3498,4405,4617,5541,5347,4081,4587,4295,5557,4779,5155,6452,5829,3619,4411,4542,4932,5405,6770,5456,3669,5496,6163,4133,4877,6630,4208,5310,6273,4564,4453,4042,5438,7398,4311,4690,5534,4713,5326,4608,5359,5797,4130,4489,4885,5321,5275,6385,5380,4415,5453,4462,4993,4280,4846,4707,3316,4752,4834,3902,6087,5446,4998,5281,4727,4428,4715,6284,5775,5054,4126,4997,5024,3844,3704,4330,4087,3406,4419,3785,4807,3905,5106,4621,5456,4640,6485,5565,5645,4120,4816,5760,6604,4935,4136,4337,4447,3651,5364,4583,4662,4463,5416,4851,5843,5746,6021,3409,4163,4745,5245,5460,4123,6428,4758,6587,3640,4725,5698,5976,4129,4616,4106,3573,4482,5763,5376,4774,4338,4459,5103,4782,5486,3365,4985,5249,5437,6172,4594,3836,4708,4638,3794,4949,4793,4833,5631,5976,4995,4794,4181,5659,4545,3873,4547,4829,5093,2970,4074,4561,4222,6089,2871,4886,3806,3856,5588,5097,3650,6835,4362,5520,3917,3647,3172,4422,5890,3219,4154,5780,3566,5540,5142,4218,5766,6961,5447,4948,4242,5701,4656,6117,4878,4337,4435,5466,5021,6129,5170,4937,4823,4161,7010,5753,5846,4551,4639,3309,4581,3429,4619,3780,4160,4448,4759,3935,4413]},{"counters":[5332,5685,3716,3672,4449,3713,4864,4907,5355,5723,6696,4400,5623,4771,4150,5437,3462,5087,4213,5112,4827,5225,3454,5704,5230,5264,5556,3065,4042,4681,4230,4563,5254,3640,5491,5049,6470,5307,3763,6139,5876,5332,3974,5820,4787,5177,3842,4519,5170,5638,5765,4178,5283,3973,4896,3491,6049,4448,5018,5545,4099,5656,5455,4836,4945,6088,4552,6823,5119,4400,4084,5124,4748,3817,5083,5598,4720,3338,5110,3678,4247,5600,5130,5522,4485,4501,4989,6071,4039,5041,3949,5190,3887,5760,3882,5168,4398,3202,6970,5545,5243,4635,4292,5044,5614,5670,5079,4244,4892,5489,4819,3568,5322,4193,5875,4198,5230,3436,5934,4606,5258,4053,5505,3479,3335,4747,5486,3997,6881,3880,3346,5646,5350,3864,4911,6160,4996,6168,5774,4004,4255,7221,5182,6922,6107,3992,5348,4901,4925,3084,4393,4854,5049,4667,6180,5151,4636,4553,4903,4141,6414,5046,4466,4689,5945,4694,4277,5886,4668,5750,5415,6225,3971,4891,3391,4681,3744,5988,5607,5668,4310,5884,4014,2988,5199,5438,3797,4363,7932,5112,3100,5184,6073,5033,5783,6204,3478,4587,6411,5184,4090,2505,4355,5488,4185,5752,3838,4988,4866,6683,4218,4653,5370,5187,4997,5431,5146,4453,5058,4794,5748,4602,5085,4843,3351,3665,5064,4357,5502,4539,4462,4403,4398,3678,3946,4956,6153,6507,4094,4566,4481,4455,4822,5499,6136,4711,4148,3092,4727,3877,4934,4840,5378,4231,4704,5250,6565,5539,5941,4458,5091,6523,4957,4484,3262,5149,5644,5275,4268,3768,5006,4439,4709,5360,4622,4894,4133,4722,5256,5298,4767,6344,5685,3878,5283,4694,4869,4688,3798,4988,5191,4626,5870,5136,5235,3592,4637,5842,4816,4346,4999,4990,5228,4978,5895,4103,4639,3244,6332,5581,4409,4736,6487,5489,5137,5080,5109,5973,5867,4918,5030,5249,5599,5068,5056,4126,4823,4208,4854,4945,5567,5873,4166,5562,5299,5591,5394,5200,5016,4493,5188,5815,4223,4119,3997,3382,4874,4241,4452,4591,5672,4879,4177,5147,5211,3571,4828,3718,4122,4748,4156,5267,6029,4546,5566,3769,3685,6246,2361,3515,4903,3800,3809,5407,3318,6518,3443,4182,3965,3731,5445,5122,3085,5408,5281,4137,4971,4261,3657,3612,5255,3712,6107,5893,5470,5680,4364,5602,3363,6016,6433,5526,4332,6313,4977,6120,4862,4780,5482,5767,5566,3276,4630,5224,3030,3366,5130,4405,5118,5094,4050,4270,4712,5195,4698,6203,3761,5506,4016,3925,4744,5534,3832,4430,4579,5140,3798,5092,4643,5008,6755,6092,5806,6552,5346,3215,4232,3170,5620,4955,2927,4993,5648,3134,4704,4058,4650,4336,5574,4566,5198,5774,5014,4413,4393,4687,4876,5465,3855,3866,3599,5868,5028,4404,5180,4269,3562,5424,5696,4411,4022,4831,5454,6037,4859,6272,3062,4344,4943,4731,5040,4489,4019,3745,4987,4325,5366,5815,5134,5078,3853,3721,5619,5530,5115,3737,3423,4366,3811,3825,5496,4614,4991,4197,6008,6268,6448,5204,5236,5308,4676,4718,5585,5402,4677,3852,3778,4308,6471,3779,5270,3387,4257,4838,5401,5678,6267,3790,4418,6505,5585,3107,3824,3508,4372,6779,4112,4799,5729,5598,4163,5334,4341,4605,4582,5035,4758,5753,5077,4077,4565,4166,6346,5066,5064,5347,3834,4556,5042,3605,4894,5536,5500,4906,4240,4473,5753,4931,5185,5099,4026,7241,4991,3567,3852,4087,5030,5346,4232,3734,4748,3821,7109,4911,4791,4565,6971,5565,5387,4939,3468,3034,4504,5782,6353,5084,6495,4583,5722,4283,3010,6226,4774,5394,4240,3979,4676,6303,3549,5317,4111,3716,4969,4049,4788,4218,5155,4865,5895,3267,5097,5657,5554,5542,4606,4867,4690,6127,3860,4058,5436,4963,6756,6064,4439,4928,4563,4936,4679,5193,5147,4728,3813,5156,4578,4957,5121,5934,5163,4948,5016,4175,4573,6220,5078,4964,3676,5425,4884,4561,3936,4180,4061,4872,4805,4711,4936,5682,4341,4097,5842,4066,4146,5997,4831,5179,2861,4355,5335,4197,4277,4862,3512,4957,4638,3465,5916,5180,4226,3201,3770,3780,6128,4818,3220,4512,3450,5317,4248,5401,4970,4330,3821,4902,4733,6699,4054,5829,5699,4165,6964,3960,4504,4427,5401,5092,4663,5108,4490,4568,4287,5348,6589,5498,5256,4921,4908,5373,5253,4379,3485,4240,3139,3512,5506,3619,4664,3873,3998,3190,5098,4701,4783,4510,4568,5915,4136,5607,2700,6184,3720,5341,5935,4662,3006,5244,6033,5646,5086,4305,5425,4971,5149,4639,3808,4439,6144,4457,4148,5293,4897,6749,5104,5046,4247,3802,5603,5323,5980,3390,3450,5668,3736,6481,5660,4432,3843,4869,4540,6366,5632,6349,5265,5316,5963,6330,4910,6354,3778,4011,4018,3921,4418,4754,5993,3920,4691,6438,3613,6141,3505,5276,5037,3884,5339,5274,5212,3805,5616,4984,6135,5126,4566,3905,6919,4857,5625,5348,5144,3211,4442,3661,5171,5544,5472,5335,5254,3268,6291,4766,4023,5375,5575,3746,4015,5194,6250,6112,3636,5466,3253,4875,5783,4754,5528,5301,4806,4888,3533,4697,4249,5011,4372,4856,5601,3310,4594,3129,3418,4503,4959,5200,5217,5917,4783,4289,5528,4029,4636,3711,4445,6088,4025,3019,6062,4886,6307,4521,5190,5028,3637,4766,6630,5655,5019,2344,4179,5165,6508,5185,4932,4775,4712,3681,5335,5014,5151,5372,4524,4222,3849,4235,4856,4353,5384,4992,3686,3932,5111,6610,4245,4566,4273,6153,4146,3791,4996,3869,3398,5653,3979,5830,4306,5850,4260,4446,4256,4475,3207,5111,4555,3337,3426,4332,5539,4975,6856,6569,5419,4241,7133,4007,6701,5319,5508,4571,4710,7264,3655,5540,4433,4895,4333,5201,5669,4024,5057,6490,3904,5086,5781,5398,4946,5018,4417,5157,4766,3668,7322,5628,4877,3470,4373,5223,3596,4295,5178,6924,3536,3479,6485,4810,5418,3379,5576,5288,4345,3945,6194,5224,3551,7097,5216,5566,5728,6031,6180,4117,4454,5847,4260,5618,4783,6333,4976,4159,5075,6452,4628,5445,3923,3666,5352,4941,4273,4654,5412,6815,3309,5432,6568,6302,5910,5305,4701,4951,6522,5549,6372,4544,4459,4594,3995,4557,4995,6684,4976,5235,3810,4431,5591,4194,5870,4316,4377,3520,5116,4595,3688,5784,3815,4896,6151,3871,5465,5719,2761,4117,4385,4631,4980,3356,5068,4832,6028,6267,6661,5559,5826,4781,4211,3618,4293,4734,4432,3189,5744,3581,5727,4244,5674,4591,5940,5299,4370,5034,3144,5232,6179,5016,4134,3986,5473,5123,6869,5578,5267,7039,4734,5512,4499,4819,3635,5783,6075,4257,4250,5558,3764,3750,4233,6603,4366,5804,5192,4860,6315,5874,5500,5576,5610,5015,4604,6079,4318,5199,4853,4323,4289,5729,5749,4445,3873,5323,4379,4516,5235,4999,7674,3378,5480,5326,4147,4884,4936,2997,6690,4853,5616,4096,6160,4086,3834,5456,4701,3558,4073,4960,3596,4098,4654,4215,4878,4798,4258,4160,6359,5146,5595,3458,3906,4535,5556,5820,5630,5304,5055,5352,5801,4405,5293,6673,5740,5917,3913,6757,4912,4933,3749,6429,6496,3715,4388,2503,4103,5072,5216,4286,5139,5257,4636,7123,4253,6459,5781,5180,4593,6611,4685,5361,4403,4707,5854,3901,5002,4303,4434,4049,4073,5447,3361,4872,3750,5036,6489,4799,4413,4732,4091,3907,4346,5869,4772,4819,3536,3306,3751,5653,5263,4378,5712,5173,4773,4368,4309,5899,5461,5297,5762,4065,3972,6389,3115,5681,6899,5462,3907,5998,5439,5022,4019,4970,3852,3483,5332,4440,6042,5425,6266,4452,3702,4844,5366,3965,2673,6808,4061,3459,5408,5620,5459,4662,4833,3346,5706,4845,4267,4959,7010,5840,4285,4456,5308,5747,5455,4385,4809,5279,4393,4560,5119,3853,3917,5256,4412,5386,5675,4668,3594,4672,5650,4944,4012,4551,5072,5799,4626,4949,4723,3882,5595,5408,5924,3626,3523,5512,5358,4309,4304,3427,7232,5352,4408,5073,3688,4477,2672,5112,3337,4416,6820,4808,4252,4500,4470,3531,5773,3927,4731,3587,5273,4955,5731,3887,5075,5655,5024,5525,5562,4463,4122,5180,5246,4578,5026,6641,4835,5344,5716,4442,4427,5070,4920,4563,6222,3531,4365,5222,5690,4530,4040,5202,5149,5216,5604,7255,4047,5018,4086,4824,4300,5334,4106,4734,4867,5292,6432,4029,3679,4337,4582,5802,5889,5651,5901,4636,4361,4007,6093,4777,5337,4307,5206,4399,4337,3227,3892,4494,5081,4149,5482,5732,6376,5009,5645,6140,4215,4596,4282,5091,6008,4506,4714,4442,3556,4984,3045,5773,4517,5079,4724,4407,4136,4398,4694,5449,3454,5277,4965,3913,5067,5543,4815,4786,4344,5300,5673,4605,4446,5570,6641,3798,5369,6336,4070,5530,4162,6546,5459,4687,4415,3805,4975,4396,4984,3817,3625,3122,5148,5575,4242,2997,4382,6319,3821,6665,5655,5388,3800,5580,5378,3571,5340,4951,5468,5146,4342,3887,5105,4254,4593,6610,5861,4901,5329,3890,4779,4856,3361,5821,6337,3722,3155,5429,5730,5192,4763,4479,4451,5862,5574,5830,4377,4131,3414,4712,4021,5732,5005,3266,4842,4816,5746,4203,4727,5476,4397,4744,4255,4963,5433,4642,5795,6319,6043,4560,4549,5162,5448,4887,3277,5856,3339,4687,6230,5208,4631,5421,4088,6307,4685,5187,5579,6535,5714,4526,4736,5150,4589,4406,4359,5235,4464,5629,3446,5552,3289,3924,4488,3659,4722,4692,5189,5983,3497,3838,3941,5741,4030,4977,4924,4568,4526,3478,4701,4217,6622,5285,3660,3498,4787,6111,4326,4181,5449,7804,4193,5619,4516,4494,7014,4631,3285,4543,6262,3658,4922,4368,3375,4166,4507,5961,6350,3013,5399,4598,5268,4577,4563,5204,5257,5197,5981,4660,4645,5534,6059,4608,4746,4762,4172,5103,5697,6177,4433,3633,5591,4273,4950,4041,5450,4975,4395,3837,4313,3944,5811,3879,6501,3726,4257,5144,3775,4579,4548,5936,4850,5978,3811,5734,3619,6255,5398,4339,4726,5653,4897,4559,4635,5609,4293,4318,5988,4283,4613,4955,4500,4086,5274,6894,6455,5849,4884,6500,4448,5471,6013,4036,6372,5574,4657,6068,6209,5381,6429,4978,4369,5238,6139,4880,3691,4562,5505,4781,3580,3923,3777,5870,5834,5962,3921,4840,5058,5550,5424,5268,4399,5257,6101,4911,4745,4602,4223,4931,5847,5757,4603,6292,5015,5143,5352,4565,4611,4818,4097,4506,5608,5702,4770,4962,5279,4912,5808,5399,5312,5082,5351,3953,4801,4018,3232,5303,5205,3981,5941,5476,5005,5579,5515,4063,4029,5073,4152,7069,3458,4010,5122,4355,5465,3942,6613,4466,5622,4344,6990,4221,5446,5083,5901,4840,4305,4516,6475,3587,3793,5273,5097,4054,5105,3841,3941,4045,4574,5506,3974,5637,4292,4853,5293,4650,4275,5583,5376,6882,4726,4400,4460,4426,4632,5179,5079,4283,4645,3191,4600,5647,5544,4411,3768,4275,5051,4953,4797,6277,5416,7053,4783,4200,4757,5518,2357,5312,6311,4079,5523,6159,3811,6139,6344,5509,4389,3933,3600,5505,4359,3813,5560,4284,3126,5253,6085,4784,6123,5075,4338,4628,4625,3713,5894,3369,4710,5801,5132,3816,3928,5722,5233,5424,6399,6723,4537,5854,2827,5217,4431,4497,6374,6005,4929,7358,6985,5628,5617,4695,5539,5529,4325,4135,4758,5612,5085,5122,5300,5087,5386,4283,4341,4822,4751,6064,4621,5834,6468,4679,3472,3523,3485,6498,4728,3887,3805,4142,3697,5143,3872,5081,5205,4788,5762,4539,5472,3050,5703,3892,6925,6757,3455,5541,5141,3536,4284,6824,4021,4898,4976,4220,5427,5442,6537,4663,4729,5114,5886,5121,3925,5298,4491,5633,4892,3473,5717,3974,4764,5230,5828,5685,5684,6059,2928,6688,5100,4520,5411,4027,6144,4697,5039,4946,4518,5678,4008,5058,3328,4230,5052,4926,4974,4456,5169,5776,3244,4479,6126,6377,6593,5185,5081,4115,5036,4514,4587,4997,5530,4944,4409,5509,3841,5105,4058,3822,4623,5215,4378,5177,5866,5148,5035,6403,5090,6502,5069,4497,5620,3869,4889,5157,6604,4919]}]},"null_count":0,"tot_col_size":90000000,"last_update_version":401695327834603524},"p_size":{"histogram":{"ndv":50,"buckets":[{"count":210000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":210000},{"count":433000,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":223000},{"count":634000,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":201000},{"count":855000,"lower_bound":"NA==","upper_bound":"NA==","repeats":221000},{"count":1081000,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":226000},{"count":1282000,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":201000},{"count":1493000,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":211000},{"count":1708000,"lower_bound":"OA==","upper_bound":"OA==","repeats":215000},{"count":1912000,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":204000},{"count":2110000,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":198000},{"count":2312000,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":202000},{"count":2510000,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":198000},{"count":2712000,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":202000},{"count":2922000,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":210000},{"count":3143000,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":221000},{"count":3338000,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":195000},{"count":3530000,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":192000},{"count":3702000,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":172000},{"count":3892000,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":190000},{"count":4084000,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":192000},{"count":4277000,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":193000},{"count":4481000,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":204000},{"count":4673000,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":192000},{"count":4852000,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":179000},{"count":5031000,"lower_bound":"MjU=","upper_bound":"MjU=","repeats":179000},{"count":5231000,"lower_bound":"MjY=","upper_bound":"MjY=","repeats":200000},{"count":5417000,"lower_bound":"Mjc=","upper_bound":"Mjc=","repeats":186000},{"count":5600000,"lower_bound":"Mjg=","upper_bound":"Mjg=","repeats":183000},{"count":5809000,"lower_bound":"Mjk=","upper_bound":"Mjk=","repeats":209000},{"count":6030000,"lower_bound":"MzA=","upper_bound":"MzA=","repeats":221000},{"count":6243000,"lower_bound":"MzE=","upper_bound":"MzE=","repeats":213000},{"count":6438000,"lower_bound":"MzI=","upper_bound":"MzI=","repeats":195000},{"count":6669000,"lower_bound":"MzM=","upper_bound":"MzM=","repeats":231000},{"count":6871000,"lower_bound":"MzQ=","upper_bound":"MzQ=","repeats":202000},{"count":7065000,"lower_bound":"MzU=","upper_bound":"MzU=","repeats":194000},{"count":7275000,"lower_bound":"MzY=","upper_bound":"MzY=","repeats":210000},{"count":7482000,"lower_bound":"Mzc=","upper_bound":"Mzc=","repeats":207000},{"count":7695000,"lower_bound":"Mzg=","upper_bound":"Mzg=","repeats":213000},{"count":7884000,"lower_bound":"Mzk=","upper_bound":"Mzk=","repeats":189000},{"count":8080000,"lower_bound":"NDA=","upper_bound":"NDA=","repeats":196000},{"count":8280000,"lower_bound":"NDE=","upper_bound":"NDE=","repeats":200000},{"count":8480000,"lower_bound":"NDI=","upper_bound":"NDI=","repeats":200000},{"count":8664000,"lower_bound":"NDM=","upper_bound":"NDM=","repeats":184000},{"count":8834000,"lower_bound":"NDQ=","upper_bound":"NDQ=","repeats":170000},{"count":9039000,"lower_bound":"NDU=","upper_bound":"NDU=","repeats":205000},{"count":9233000,"lower_bound":"NDY=","upper_bound":"NDY=","repeats":194000},{"count":9431000,"lower_bound":"NDc=","upper_bound":"NDc=","repeats":198000},{"count":9632000,"lower_bound":"NDg=","upper_bound":"NDg=","repeats":201000},{"count":9818000,"lower_bound":"NDk=","upper_bound":"NDk=","repeats":186000},{"count":10000000,"lower_bound":"NTA=","upper_bound":"NTA=","repeats":182000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400022,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199891,0,0,0,0,0,0,0,0,0,199834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198980,0,0,0,0,0,199923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199694,0,0,0,0,199973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199941,0,0,0,0,0,0,0,200191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199623,0,0,0,0,0,0,0,0,0,0,200610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199987,199803,0,0,0,0,199805,0,0,0,0,0,200150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,199777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200209,0,0,0,200112,0,0,0,0,0,0,0,200079,0,0,0,200016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199886,0,0,0,0,0,0,200173,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199880,0,0,0,0,0,0,0,0,0,0,0,200056,0,0,0,0,0,0,0,0,0,0,0,0,0,199651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399422,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199495,0,0,0,0,0,0,0,0,0,0,0,0,0,200263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200082,0,0,0,0,0,0,0,0,0,0,0,199157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400410,0,0,199886,0,200173,0,0,0,0,0,0,0,0,199684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198980,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199651,0,0,0,0,0,0,200155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200263,0,0,0,0,0,0,199482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,200221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200246,0,0,0,0,0,0,0,0,0,0,199803,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199322,0,0,0,0,0,0,0,0,0,199987,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199880,0,0,0,0,0,0,0,0,0,0,0,0,0,199973,0,0,0,0,0,200079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200062,0,0,199825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199561,0,0,0,0,0,200725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199867,0,0,199694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,400452,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199803,0,0,0,0,0,0,0,0,199880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198980,0,0,0,0,0,0,0,0,0,0,0,0,199482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200079,0,0,0,0,0,0,0,0,0,0,0,0,0,200226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199157,0,0,0,0,0,0,0,199684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201147,0,0,0,0,0,0,0,0,0,0,0,199987,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199941,200150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200155,0,0,0,0,0,200221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199322,0,0,0,0,0,0,0,200112,0,0,0,0,199891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200173,0,0,199886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199825,0,0,0,0,0,0,0,0,200263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199867,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200610,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199495,0,0,0,0,0,0,0,0,0,0,199515,0,0,0,0,0,0,0,0,0,0,0,200260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200079,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199973,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200610,199803,0,0,0,0,0,0,0,0,0,0,200263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199891,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201147,0,0,0,0,0,0,0,0,199482,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198980,0,0,0,0,199805,0,0,0,0,0,0,0,0,0,0,0,200112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200576,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199987,0,200260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200725,0,199322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199157,0,0,0,0,0,200221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199861,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199867,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200246,0,0,0,0,0,0,0,0,0,0,199825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200226,0,0,0,0,0,0,0,200023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199923,0,0,0,0,0,200016,0,0,0,199561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200150,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199495,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199515,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200173,0,0,0,0,0,0,0,199886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,200062,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200023,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200056,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199623,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199482,0,0,0,200112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200265,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200610,0,0,0,0,0,0,0,0,0,0,199987,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199973,0,0,0,0,198980,0,0,0,0,0,0,0,0,0,0,200173,0,0,200150,0,0,0,0,0,0,0,0,0,199886,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199651,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200725,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200246,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199861,0,0,0,0,0,0,0,199867,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199941,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200263,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199834,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199322,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200209,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199880,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199684,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200221,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199694,0,199825,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200956,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200079,0,0,0,0,0,200082,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200260,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199777,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199891,0,0,200155,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200016,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199495,0,0,0,0,0,0,0,200576,0,0,0,0,0,0,0,0,199805,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199561,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199515,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,199803,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200390,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201147,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":20000000,"last_update_version":401695327821496322},"p_type":{"histogram":{"ndv":150,"buckets":[{"count":75000,"lower_bound":"RUNPTk9NWSBBTk9ESVpFRCBCUkFTUw==","upper_bound":"RUNPTk9NWSBBTk9ESVpFRCBCUkFTUw==","repeats":75000},{"count":138000,"lower_bound":"RUNPTk9NWSBBTk9ESVpFRCBDT1BQRVI=","upper_bound":"RUNPTk9NWSBBTk9ESVpFRCBDT1BQRVI=","repeats":63000},{"count":208000,"lower_bound":"RUNPTk9NWSBBTk9ESVpFRCBOSUNLRUw=","upper_bound":"RUNPTk9NWSBBTk9ESVpFRCBOSUNLRUw=","repeats":70000},{"count":280000,"lower_bound":"RUNPTk9NWSBBTk9ESVpFRCBTVEVFTA==","upper_bound":"RUNPTk9NWSBBTk9ESVpFRCBTVEVFTA==","repeats":72000},{"count":338000,"lower_bound":"RUNPTk9NWSBBTk9ESVpFRCBUSU4=","upper_bound":"RUNPTk9NWSBBTk9ESVpFRCBUSU4=","repeats":58000},{"count":416000,"lower_bound":"RUNPTk9NWSBCUlVTSEVEIEJSQVNT","upper_bound":"RUNPTk9NWSBCUlVTSEVEIEJSQVNT","repeats":78000},{"count":475000,"lower_bound":"RUNPTk9NWSBCUlVTSEVEIENPUFBFUg==","upper_bound":"RUNPTk9NWSBCUlVTSEVEIENPUFBFUg==","repeats":59000},{"count":530000,"lower_bound":"RUNPTk9NWSBCUlVTSEVEIE5JQ0tFTA==","upper_bound":"RUNPTk9NWSBCUlVTSEVEIE5JQ0tFTA==","repeats":55000},{"count":609000,"lower_bound":"RUNPTk9NWSBCUlVTSEVEIFNURUVM","upper_bound":"RUNPTk9NWSBCUlVTSEVEIFNURUVM","repeats":79000},{"count":672000,"lower_bound":"RUNPTk9NWSBCUlVTSEVEIFRJTg==","upper_bound":"RUNPTk9NWSBCUlVTSEVEIFRJTg==","repeats":63000},{"count":734000,"lower_bound":"RUNPTk9NWSBCVVJOSVNIRUQgQlJBU1M=","upper_bound":"RUNPTk9NWSBCVVJOSVNIRUQgQlJBU1M=","repeats":62000},{"count":801000,"lower_bound":"RUNPTk9NWSBCVVJOSVNIRUQgQ09QUEVS","upper_bound":"RUNPTk9NWSBCVVJOSVNIRUQgQ09QUEVS","repeats":67000},{"count":880000,"lower_bound":"RUNPTk9NWSBCVVJOSVNIRUQgTklDS0VM","upper_bound":"RUNPTk9NWSBCVVJOSVNIRUQgTklDS0VM","repeats":79000},{"count":960000,"lower_bound":"RUNPTk9NWSBCVVJOSVNIRUQgU1RFRUw=","upper_bound":"RUNPTk9NWSBCVVJOSVNIRUQgU1RFRUw=","repeats":80000},{"count":1013000,"lower_bound":"RUNPTk9NWSBCVVJOSVNIRUQgVElO","upper_bound":"RUNPTk9NWSBCVVJOSVNIRUQgVElO","repeats":53000},{"count":1085000,"lower_bound":"RUNPTk9NWSBQTEFURUQgQlJBU1M=","upper_bound":"RUNPTk9NWSBQTEFURUQgQlJBU1M=","repeats":72000},{"count":1140000,"lower_bound":"RUNPTk9NWSBQTEFURUQgQ09QUEVS","upper_bound":"RUNPTk9NWSBQTEFURUQgQ09QUEVS","repeats":55000},{"count":1198000,"lower_bound":"RUNPTk9NWSBQTEFURUQgTklDS0VM","upper_bound":"RUNPTk9NWSBQTEFURUQgTklDS0VM","repeats":58000},{"count":1268000,"lower_bound":"RUNPTk9NWSBQTEFURUQgU1RFRUw=","upper_bound":"RUNPTk9NWSBQTEFURUQgU1RFRUw=","repeats":70000},{"count":1333000,"lower_bound":"RUNPTk9NWSBQTEFURUQgVElO","upper_bound":"RUNPTk9NWSBQTEFURUQgVElO","repeats":65000},{"count":1394000,"lower_bound":"RUNPTk9NWSBQT0xJU0hFRCBCUkFTUw==","upper_bound":"RUNPTk9NWSBQT0xJU0hFRCBCUkFTUw==","repeats":61000},{"count":1454000,"lower_bound":"RUNPTk9NWSBQT0xJU0hFRCBDT1BQRVI=","upper_bound":"RUNPTk9NWSBQT0xJU0hFRCBDT1BQRVI=","repeats":60000},{"count":1519000,"lower_bound":"RUNPTk9NWSBQT0xJU0hFRCBOSUNLRUw=","upper_bound":"RUNPTk9NWSBQT0xJU0hFRCBOSUNLRUw=","repeats":65000},{"count":1577000,"lower_bound":"RUNPTk9NWSBQT0xJU0hFRCBTVEVFTA==","upper_bound":"RUNPTk9NWSBQT0xJU0hFRCBTVEVFTA==","repeats":58000},{"count":1647000,"lower_bound":"RUNPTk9NWSBQT0xJU0hFRCBUSU4=","upper_bound":"RUNPTk9NWSBQT0xJU0hFRCBUSU4=","repeats":70000},{"count":1709000,"lower_bound":"TEFSR0UgQU5PRElaRUQgQlJBU1M=","upper_bound":"TEFSR0UgQU5PRElaRUQgQlJBU1M=","repeats":62000},{"count":1765000,"lower_bound":"TEFSR0UgQU5PRElaRUQgQ09QUEVS","upper_bound":"TEFSR0UgQU5PRElaRUQgQ09QUEVS","repeats":56000},{"count":1838000,"lower_bound":"TEFSR0UgQU5PRElaRUQgTklDS0VM","upper_bound":"TEFSR0UgQU5PRElaRUQgTklDS0VM","repeats":73000},{"count":1895000,"lower_bound":"TEFSR0UgQU5PRElaRUQgU1RFRUw=","upper_bound":"TEFSR0UgQU5PRElaRUQgU1RFRUw=","repeats":57000},{"count":1965000,"lower_bound":"TEFSR0UgQU5PRElaRUQgVElO","upper_bound":"TEFSR0UgQU5PRElaRUQgVElO","repeats":70000},{"count":2030000,"lower_bound":"TEFSR0UgQlJVU0hFRCBCUkFTUw==","upper_bound":"TEFSR0UgQlJVU0hFRCBCUkFTUw==","repeats":65000},{"count":2106000,"lower_bound":"TEFSR0UgQlJVU0hFRCBDT1BQRVI=","upper_bound":"TEFSR0UgQlJVU0hFRCBDT1BQRVI=","repeats":76000},{"count":2181000,"lower_bound":"TEFSR0UgQlJVU0hFRCBOSUNLRUw=","upper_bound":"TEFSR0UgQlJVU0hFRCBOSUNLRUw=","repeats":75000},{"count":2243000,"lower_bound":"TEFSR0UgQlJVU0hFRCBTVEVFTA==","upper_bound":"TEFSR0UgQlJVU0hFRCBTVEVFTA==","repeats":62000},{"count":2314000,"lower_bound":"TEFSR0UgQlJVU0hFRCBUSU4=","upper_bound":"TEFSR0UgQlJVU0hFRCBUSU4=","repeats":71000},{"count":2393000,"lower_bound":"TEFSR0UgQlVSTklTSEVEIEJSQVNT","upper_bound":"TEFSR0UgQlVSTklTSEVEIEJSQVNT","repeats":79000},{"count":2456000,"lower_bound":"TEFSR0UgQlVSTklTSEVEIENPUFBFUg==","upper_bound":"TEFSR0UgQlVSTklTSEVEIENPUFBFUg==","repeats":63000},{"count":2534000,"lower_bound":"TEFSR0UgQlVSTklTSEVEIE5JQ0tFTA==","upper_bound":"TEFSR0UgQlVSTklTSEVEIE5JQ0tFTA==","repeats":78000},{"count":2586000,"lower_bound":"TEFSR0UgQlVSTklTSEVEIFNURUVM","upper_bound":"TEFSR0UgQlVSTklTSEVEIFNURUVM","repeats":52000},{"count":2650000,"lower_bound":"TEFSR0UgQlVSTklTSEVEIFRJTg==","upper_bound":"TEFSR0UgQlVSTklTSEVEIFRJTg==","repeats":64000},{"count":2704000,"lower_bound":"TEFSR0UgUExBVEVEIEJSQVNT","upper_bound":"TEFSR0UgUExBVEVEIEJSQVNT","repeats":54000},{"count":2754000,"lower_bound":"TEFSR0UgUExBVEVEIENPUFBFUg==","upper_bound":"TEFSR0UgUExBVEVEIENPUFBFUg==","repeats":50000},{"count":2822000,"lower_bound":"TEFSR0UgUExBVEVEIE5JQ0tFTA==","upper_bound":"TEFSR0UgUExBVEVEIE5JQ0tFTA==","repeats":68000},{"count":2890000,"lower_bound":"TEFSR0UgUExBVEVEIFNURUVM","upper_bound":"TEFSR0UgUExBVEVEIFNURUVM","repeats":68000},{"count":2949000,"lower_bound":"TEFSR0UgUExBVEVEIFRJTg==","upper_bound":"TEFSR0UgUExBVEVEIFRJTg==","repeats":59000},{"count":3001000,"lower_bound":"TEFSR0UgUE9MSVNIRUQgQlJBU1M=","upper_bound":"TEFSR0UgUE9MSVNIRUQgQlJBU1M=","repeats":52000},{"count":3068000,"lower_bound":"TEFSR0UgUE9MSVNIRUQgQ09QUEVS","upper_bound":"TEFSR0UgUE9MSVNIRUQgQ09QUEVS","repeats":67000},{"count":3137000,"lower_bound":"TEFSR0UgUE9MSVNIRUQgTklDS0VM","upper_bound":"TEFSR0UgUE9MSVNIRUQgTklDS0VM","repeats":69000},{"count":3208000,"lower_bound":"TEFSR0UgUE9MSVNIRUQgU1RFRUw=","upper_bound":"TEFSR0UgUE9MSVNIRUQgU1RFRUw=","repeats":71000},{"count":3282000,"lower_bound":"TEFSR0UgUE9MSVNIRUQgVElO","upper_bound":"TEFSR0UgUE9MSVNIRUQgVElO","repeats":74000},{"count":3349000,"lower_bound":"TUVESVVNIEFOT0RJWkVEIEJSQVNT","upper_bound":"TUVESVVNIEFOT0RJWkVEIEJSQVNT","repeats":67000},{"count":3415000,"lower_bound":"TUVESVVNIEFOT0RJWkVEIENPUFBFUg==","upper_bound":"TUVESVVNIEFOT0RJWkVEIENPUFBFUg==","repeats":66000},{"count":3474000,"lower_bound":"TUVESVVNIEFOT0RJWkVEIE5JQ0tFTA==","upper_bound":"TUVESVVNIEFOT0RJWkVEIE5JQ0tFTA==","repeats":59000},{"count":3550000,"lower_bound":"TUVESVVNIEFOT0RJWkVEIFNURUVM","upper_bound":"TUVESVVNIEFOT0RJWkVEIFNURUVM","repeats":76000},{"count":3607000,"lower_bound":"TUVESVVNIEFOT0RJWkVEIFRJTg==","upper_bound":"TUVESVVNIEFOT0RJWkVEIFRJTg==","repeats":57000},{"count":3674000,"lower_bound":"TUVESVVNIEJSVVNIRUQgQlJBU1M=","upper_bound":"TUVESVVNIEJSVVNIRUQgQlJBU1M=","repeats":67000},{"count":3732000,"lower_bound":"TUVESVVNIEJSVVNIRUQgQ09QUEVS","upper_bound":"TUVESVVNIEJSVVNIRUQgQ09QUEVS","repeats":58000},{"count":3790000,"lower_bound":"TUVESVVNIEJSVVNIRUQgTklDS0VM","upper_bound":"TUVESVVNIEJSVVNIRUQgTklDS0VM","repeats":58000},{"count":3865000,"lower_bound":"TUVESVVNIEJSVVNIRUQgU1RFRUw=","upper_bound":"TUVESVVNIEJSVVNIRUQgU1RFRUw=","repeats":75000},{"count":3930000,"lower_bound":"TUVESVVNIEJSVVNIRUQgVElO","upper_bound":"TUVESVVNIEJSVVNIRUQgVElO","repeats":65000},{"count":4005000,"lower_bound":"TUVESVVNIEJVUk5JU0hFRCBCUkFTUw==","upper_bound":"TUVESVVNIEJVUk5JU0hFRCBCUkFTUw==","repeats":75000},{"count":4079000,"lower_bound":"TUVESVVNIEJVUk5JU0hFRCBDT1BQRVI=","upper_bound":"TUVESVVNIEJVUk5JU0hFRCBDT1BQRVI=","repeats":74000},{"count":4142000,"lower_bound":"TUVESVVNIEJVUk5JU0hFRCBOSUNLRUw=","upper_bound":"TUVESVVNIEJVUk5JU0hFRCBOSUNLRUw=","repeats":63000},{"count":4214000,"lower_bound":"TUVESVVNIEJVUk5JU0hFRCBTVEVFTA==","upper_bound":"TUVESVVNIEJVUk5JU0hFRCBTVEVFTA==","repeats":72000},{"count":4278000,"lower_bound":"TUVESVVNIEJVUk5JU0hFRCBUSU4=","upper_bound":"TUVESVVNIEJVUk5JU0hFRCBUSU4=","repeats":64000},{"count":4340000,"lower_bound":"TUVESVVNIFBMQVRFRCBCUkFTUw==","upper_bound":"TUVESVVNIFBMQVRFRCBCUkFTUw==","repeats":62000},{"count":4403000,"lower_bound":"TUVESVVNIFBMQVRFRCBDT1BQRVI=","upper_bound":"TUVESVVNIFBMQVRFRCBDT1BQRVI=","repeats":63000},{"count":4466000,"lower_bound":"TUVESVVNIFBMQVRFRCBOSUNLRUw=","upper_bound":"TUVESVVNIFBMQVRFRCBOSUNLRUw=","repeats":63000},{"count":4538000,"lower_bound":"TUVESVVNIFBMQVRFRCBTVEVFTA==","upper_bound":"TUVESVVNIFBMQVRFRCBTVEVFTA==","repeats":72000},{"count":4598000,"lower_bound":"TUVESVVNIFBMQVRFRCBUSU4=","upper_bound":"TUVESVVNIFBMQVRFRCBUSU4=","repeats":60000},{"count":4683000,"lower_bound":"TUVESVVNIFBPTElTSEVEIEJSQVNT","upper_bound":"TUVESVVNIFBPTElTSEVEIEJSQVNT","repeats":85000},{"count":4741000,"lower_bound":"TUVESVVNIFBPTElTSEVEIENPUFBFUg==","upper_bound":"TUVESVVNIFBPTElTSEVEIENPUFBFUg==","repeats":58000},{"count":4809000,"lower_bound":"TUVESVVNIFBPTElTSEVEIE5JQ0tFTA==","upper_bound":"TUVESVVNIFBPTElTSEVEIE5JQ0tFTA==","repeats":68000},{"count":4888000,"lower_bound":"TUVESVVNIFBPTElTSEVEIFNURUVM","upper_bound":"TUVESVVNIFBPTElTSEVEIFNURUVM","repeats":79000},{"count":4952000,"lower_bound":"TUVESVVNIFBPTElTSEVEIFRJTg==","upper_bound":"TUVESVVNIFBPTElTSEVEIFRJTg==","repeats":64000},{"count":5031000,"lower_bound":"UFJPTU8gQU5PRElaRUQgQlJBU1M=","upper_bound":"UFJPTU8gQU5PRElaRUQgQlJBU1M=","repeats":79000},{"count":5102000,"lower_bound":"UFJPTU8gQU5PRElaRUQgQ09QUEVS","upper_bound":"UFJPTU8gQU5PRElaRUQgQ09QUEVS","repeats":71000},{"count":5162000,"lower_bound":"UFJPTU8gQU5PRElaRUQgTklDS0VM","upper_bound":"UFJPTU8gQU5PRElaRUQgTklDS0VM","repeats":60000},{"count":5233000,"lower_bound":"UFJPTU8gQU5PRElaRUQgU1RFRUw=","upper_bound":"UFJPTU8gQU5PRElaRUQgU1RFRUw=","repeats":71000},{"count":5308000,"lower_bound":"UFJPTU8gQU5PRElaRUQgVElO","upper_bound":"UFJPTU8gQU5PRElaRUQgVElO","repeats":75000},{"count":5384000,"lower_bound":"UFJPTU8gQlJVU0hFRCBCUkFTUw==","upper_bound":"UFJPTU8gQlJVU0hFRCBCUkFTUw==","repeats":76000},{"count":5462000,"lower_bound":"UFJPTU8gQlJVU0hFRCBDT1BQRVI=","upper_bound":"UFJPTU8gQlJVU0hFRCBDT1BQRVI=","repeats":78000},{"count":5527000,"lower_bound":"UFJPTU8gQlJVU0hFRCBOSUNLRUw=","upper_bound":"UFJPTU8gQlJVU0hFRCBOSUNLRUw=","repeats":65000},{"count":5609000,"lower_bound":"UFJPTU8gQlJVU0hFRCBTVEVFTA==","upper_bound":"UFJPTU8gQlJVU0hFRCBTVEVFTA==","repeats":82000},{"count":5672000,"lower_bound":"UFJPTU8gQlJVU0hFRCBUSU4=","upper_bound":"UFJPTU8gQlJVU0hFRCBUSU4=","repeats":63000},{"count":5735000,"lower_bound":"UFJPTU8gQlVSTklTSEVEIEJSQVNT","upper_bound":"UFJPTU8gQlVSTklTSEVEIEJSQVNT","repeats":63000},{"count":5806000,"lower_bound":"UFJPTU8gQlVSTklTSEVEIENPUFBFUg==","upper_bound":"UFJPTU8gQlVSTklTSEVEIENPUFBFUg==","repeats":71000},{"count":5858000,"lower_bound":"UFJPTU8gQlVSTklTSEVEIE5JQ0tFTA==","upper_bound":"UFJPTU8gQlVSTklTSEVEIE5JQ0tFTA==","repeats":52000},{"count":5923000,"lower_bound":"UFJPTU8gQlVSTklTSEVEIFNURUVM","upper_bound":"UFJPTU8gQlVSTklTSEVEIFNURUVM","repeats":65000},{"count":5976000,"lower_bound":"UFJPTU8gQlVSTklTSEVEIFRJTg==","upper_bound":"UFJPTU8gQlVSTklTSEVEIFRJTg==","repeats":53000},{"count":6032000,"lower_bound":"UFJPTU8gUExBVEVEIEJSQVNT","upper_bound":"UFJPTU8gUExBVEVEIEJSQVNT","repeats":56000},{"count":6109000,"lower_bound":"UFJPTU8gUExBVEVEIENPUFBFUg==","upper_bound":"UFJPTU8gUExBVEVEIENPUFBFUg==","repeats":77000},{"count":6178000,"lower_bound":"UFJPTU8gUExBVEVEIE5JQ0tFTA==","upper_bound":"UFJPTU8gUExBVEVEIE5JQ0tFTA==","repeats":69000},{"count":6253000,"lower_bound":"UFJPTU8gUExBVEVEIFNURUVM","upper_bound":"UFJPTU8gUExBVEVEIFNURUVM","repeats":75000},{"count":6313000,"lower_bound":"UFJPTU8gUExBVEVEIFRJTg==","upper_bound":"UFJPTU8gUExBVEVEIFRJTg==","repeats":60000},{"count":6379000,"lower_bound":"UFJPTU8gUE9MSVNIRUQgQlJBU1M=","upper_bound":"UFJPTU8gUE9MSVNIRUQgQlJBU1M=","repeats":66000},{"count":6453000,"lower_bound":"UFJPTU8gUE9MSVNIRUQgQ09QUEVS","upper_bound":"UFJPTU8gUE9MSVNIRUQgQ09QUEVS","repeats":74000},{"count":6524000,"lower_bound":"UFJPTU8gUE9MSVNIRUQgTklDS0VM","upper_bound":"UFJPTU8gUE9MSVNIRUQgTklDS0VM","repeats":71000},{"count":6594000,"lower_bound":"UFJPTU8gUE9MSVNIRUQgU1RFRUw=","upper_bound":"UFJPTU8gUE9MSVNIRUQgU1RFRUw=","repeats":70000},{"count":6660000,"lower_bound":"UFJPTU8gUE9MSVNIRUQgVElO","upper_bound":"UFJPTU8gUE9MSVNIRUQgVElO","repeats":66000},{"count":6720000,"lower_bound":"U01BTEwgQU5PRElaRUQgQlJBU1M=","upper_bound":"U01BTEwgQU5PRElaRUQgQlJBU1M=","repeats":60000},{"count":6766000,"lower_bound":"U01BTEwgQU5PRElaRUQgQ09QUEVS","upper_bound":"U01BTEwgQU5PRElaRUQgQ09QUEVS","repeats":46000},{"count":6842000,"lower_bound":"U01BTEwgQU5PRElaRUQgTklDS0VM","upper_bound":"U01BTEwgQU5PRElaRUQgTklDS0VM","repeats":76000},{"count":6907000,"lower_bound":"U01BTEwgQU5PRElaRUQgU1RFRUw=","upper_bound":"U01BTEwgQU5PRElaRUQgU1RFRUw=","repeats":65000},{"count":6979000,"lower_bound":"U01BTEwgQU5PRElaRUQgVElO","upper_bound":"U01BTEwgQU5PRElaRUQgVElO","repeats":72000},{"count":7033000,"lower_bound":"U01BTEwgQlJVU0hFRCBCUkFTUw==","upper_bound":"U01BTEwgQlJVU0hFRCBCUkFTUw==","repeats":54000},{"count":7125000,"lower_bound":"U01BTEwgQlJVU0hFRCBDT1BQRVI=","upper_bound":"U01BTEwgQlJVU0hFRCBDT1BQRVI=","repeats":92000},{"count":7194000,"lower_bound":"U01BTEwgQlJVU0hFRCBOSUNLRUw=","upper_bound":"U01BTEwgQlJVU0hFRCBOSUNLRUw=","repeats":69000},{"count":7260000,"lower_bound":"U01BTEwgQlJVU0hFRCBTVEVFTA==","upper_bound":"U01BTEwgQlJVU0hFRCBTVEVFTA==","repeats":66000},{"count":7324000,"lower_bound":"U01BTEwgQlJVU0hFRCBUSU4=","upper_bound":"U01BTEwgQlJVU0hFRCBUSU4=","repeats":64000},{"count":7383000,"lower_bound":"U01BTEwgQlVSTklTSEVEIEJSQVNT","upper_bound":"U01BTEwgQlVSTklTSEVEIEJSQVNT","repeats":59000},{"count":7446000,"lower_bound":"U01BTEwgQlVSTklTSEVEIENPUFBFUg==","upper_bound":"U01BTEwgQlVSTklTSEVEIENPUFBFUg==","repeats":63000},{"count":7506000,"lower_bound":"U01BTEwgQlVSTklTSEVEIE5JQ0tFTA==","upper_bound":"U01BTEwgQlVSTklTSEVEIE5JQ0tFTA==","repeats":60000},{"count":7574000,"lower_bound":"U01BTEwgQlVSTklTSEVEIFNURUVM","upper_bound":"U01BTEwgQlVSTklTSEVEIFNURUVM","repeats":68000},{"count":7634000,"lower_bound":"U01BTEwgQlVSTklTSEVEIFRJTg==","upper_bound":"U01BTEwgQlVSTklTSEVEIFRJTg==","repeats":60000},{"count":7704000,"lower_bound":"U01BTEwgUExBVEVEIEJSQVNT","upper_bound":"U01BTEwgUExBVEVEIEJSQVNT","repeats":70000},{"count":7771000,"lower_bound":"U01BTEwgUExBVEVEIENPUFBFUg==","upper_bound":"U01BTEwgUExBVEVEIENPUFBFUg==","repeats":67000},{"count":7844000,"lower_bound":"U01BTEwgUExBVEVEIE5JQ0tFTA==","upper_bound":"U01BTEwgUExBVEVEIE5JQ0tFTA==","repeats":73000},{"count":7917000,"lower_bound":"U01BTEwgUExBVEVEIFNURUVM","upper_bound":"U01BTEwgUExBVEVEIFNURUVM","repeats":73000},{"count":7975000,"lower_bound":"U01BTEwgUExBVEVEIFRJTg==","upper_bound":"U01BTEwgUExBVEVEIFRJTg==","repeats":58000},{"count":8032000,"lower_bound":"U01BTEwgUE9MSVNIRUQgQlJBU1M=","upper_bound":"U01BTEwgUE9MSVNIRUQgQlJBU1M=","repeats":57000},{"count":8103000,"lower_bound":"U01BTEwgUE9MSVNIRUQgQ09QUEVS","upper_bound":"U01BTEwgUE9MSVNIRUQgQ09QUEVS","repeats":71000},{"count":8168000,"lower_bound":"U01BTEwgUE9MSVNIRUQgTklDS0VM","upper_bound":"U01BTEwgUE9MSVNIRUQgTklDS0VM","repeats":65000},{"count":8234000,"lower_bound":"U01BTEwgUE9MSVNIRUQgU1RFRUw=","upper_bound":"U01BTEwgUE9MSVNIRUQgU1RFRUw=","repeats":66000},{"count":8305000,"lower_bound":"U01BTEwgUE9MSVNIRUQgVElO","upper_bound":"U01BTEwgUE9MSVNIRUQgVElO","repeats":71000},{"count":8370000,"lower_bound":"U1RBTkRBUkQgQU5PRElaRUQgQlJBU1M=","upper_bound":"U1RBTkRBUkQgQU5PRElaRUQgQlJBU1M=","repeats":65000},{"count":8428000,"lower_bound":"U1RBTkRBUkQgQU5PRElaRUQgQ09QUEVS","upper_bound":"U1RBTkRBUkQgQU5PRElaRUQgQ09QUEVS","repeats":58000},{"count":8494000,"lower_bound":"U1RBTkRBUkQgQU5PRElaRUQgTklDS0VM","upper_bound":"U1RBTkRBUkQgQU5PRElaRUQgTklDS0VM","repeats":66000},{"count":8559000,"lower_bound":"U1RBTkRBUkQgQU5PRElaRUQgU1RFRUw=","upper_bound":"U1RBTkRBUkQgQU5PRElaRUQgU1RFRUw=","repeats":65000},{"count":8628000,"lower_bound":"U1RBTkRBUkQgQU5PRElaRUQgVElO","upper_bound":"U1RBTkRBUkQgQU5PRElaRUQgVElO","repeats":69000},{"count":8691000,"lower_bound":"U1RBTkRBUkQgQlJVU0hFRCBCUkFTUw==","upper_bound":"U1RBTkRBUkQgQlJVU0hFRCBCUkFTUw==","repeats":63000},{"count":8770000,"lower_bound":"U1RBTkRBUkQgQlJVU0hFRCBDT1BQRVI=","upper_bound":"U1RBTkRBUkQgQlJVU0hFRCBDT1BQRVI=","repeats":79000},{"count":8843000,"lower_bound":"U1RBTkRBUkQgQlJVU0hFRCBOSUNLRUw=","upper_bound":"U1RBTkRBUkQgQlJVU0hFRCBOSUNLRUw=","repeats":73000},{"count":8925000,"lower_bound":"U1RBTkRBUkQgQlJVU0hFRCBTVEVFTA==","upper_bound":"U1RBTkRBUkQgQlJVU0hFRCBTVEVFTA==","repeats":82000},{"count":8996000,"lower_bound":"U1RBTkRBUkQgQlJVU0hFRCBUSU4=","upper_bound":"U1RBTkRBUkQgQlJVU0hFRCBUSU4=","repeats":71000},{"count":9053000,"lower_bound":"U1RBTkRBUkQgQlVSTklTSEVEIEJSQVNT","upper_bound":"U1RBTkRBUkQgQlVSTklTSEVEIEJSQVNT","repeats":57000},{"count":9120000,"lower_bound":"U1RBTkRBUkQgQlVSTklTSEVEIENPUFBFUg==","upper_bound":"U1RBTkRBUkQgQlVSTklTSEVEIENPUFBFUg==","repeats":67000},{"count":9193000,"lower_bound":"U1RBTkRBUkQgQlVSTklTSEVEIE5JQ0tFTA==","upper_bound":"U1RBTkRBUkQgQlVSTklTSEVEIE5JQ0tFTA==","repeats":73000},{"count":9265000,"lower_bound":"U1RBTkRBUkQgQlVSTklTSEVEIFNURUVM","upper_bound":"U1RBTkRBUkQgQlVSTklTSEVEIFNURUVM","repeats":72000},{"count":9333000,"lower_bound":"U1RBTkRBUkQgQlVSTklTSEVEIFRJTg==","upper_bound":"U1RBTkRBUkQgQlVSTklTSEVEIFRJTg==","repeats":68000},{"count":9389000,"lower_bound":"U1RBTkRBUkQgUExBVEVEIEJSQVNT","upper_bound":"U1RBTkRBUkQgUExBVEVEIEJSQVNT","repeats":56000},{"count":9468000,"lower_bound":"U1RBTkRBUkQgUExBVEVEIENPUFBFUg==","upper_bound":"U1RBTkRBUkQgUExBVEVEIENPUFBFUg==","repeats":79000},{"count":9534000,"lower_bound":"U1RBTkRBUkQgUExBVEVEIE5JQ0tFTA==","upper_bound":"U1RBTkRBUkQgUExBVEVEIE5JQ0tFTA==","repeats":66000},{"count":9602000,"lower_bound":"U1RBTkRBUkQgUExBVEVEIFNURUVM","upper_bound":"U1RBTkRBUkQgUExBVEVEIFNURUVM","repeats":68000},{"count":9662000,"lower_bound":"U1RBTkRBUkQgUExBVEVEIFRJTg==","upper_bound":"U1RBTkRBUkQgUExBVEVEIFRJTg==","repeats":60000},{"count":9731000,"lower_bound":"U1RBTkRBUkQgUE9MSVNIRUQgQlJBU1M=","upper_bound":"U1RBTkRBUkQgUE9MSVNIRUQgQlJBU1M=","repeats":69000},{"count":9792000,"lower_bound":"U1RBTkRBUkQgUE9MSVNIRUQgQ09QUEVS","upper_bound":"U1RBTkRBUkQgUE9MSVNIRUQgQ09QUEVS","repeats":61000},{"count":9862000,"lower_bound":"U1RBTkRBUkQgUE9MSVNIRUQgTklDS0VM","upper_bound":"U1RBTkRBUkQgUE9MSVNIRUQgTklDS0VM","repeats":70000},{"count":9921000,"lower_bound":"U1RBTkRBUkQgUE9MSVNIRUQgU1RFRUw=","upper_bound":"U1RBTkRBUkQgUE9MSVNIRUQgU1RFRUw=","repeats":59000},{"count":10000000,"lower_bound":"U1RBTkRBUkQgUE9MSVNIRUQgVElO","upper_bound":"U1RBTkRBUkQgUE9MSVNIRUQgVElO","repeats":79000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,133662,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66761,0,0,0,0,0,132742,0,0,0,0,0,0,0,0,0,0,0,66648,0,0,0,0,0,0,67212,0,0,0,0,0,66140,0,0,0,0,0,0,0,0,66797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66678,0,0,0,0,66476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66753,0,0,66409,0,0,0,0,0,66760,66526,0,0,0,0,0,0,65943,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66645,0,0,0,0,0,0,0,0,0,66859,0,0,0,66680,0,66559,0,0,66593,0,0,0,0,0,0,0,66702,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66611,66522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66766,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66546,0,0,0,67262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66369,0,0,0,0,0,0,0,0,0,0,0,66609,0,0,0,0,0,0,0,0,66624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,66220,0,0,0,66849,0,66458,0,0,0,0,0,0,0,66556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66652,0,0,0,0,0,0,0,0,0,0,66996,0,0,0,66806,0,0,0,0,0,0,0,0,0,0,66687,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66352,0,0,0,0,0,0,0,0,0,0,0,66719,0,0,0,0,66347,0,0,0,0,66477,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66402,0,0,0,0,0,0,0,0,0,0,0,0,0,66889,0,0,66672,0,0,0,0,0,0,0,0,0,0,0,0,0,66977,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67050,0,0,0,0,0,0,0,0,0,0,0,0,0,66368,66591,0,0,66596,0,0,0,0,66687,0,0,0,67255,0,0,0,0,0,0,0,0,0,66628,0,0,66664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67027,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66851,0,0,0,0,0,66961,0,0,0,0,0,0,0,0,0,66657,0,0,0,0,0,0,0,0,66485,66696,0,0,0,66781,0,0,0,0,0,66694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66498,0,0,0,0,0,0,0,0,0,0,66807,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66241,0,0,0,0,0,0,0,0,66743,0,0,0,0,0,0,0,0,0,0,0,66463,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66836,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66345,0,0,0,66859,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66640,0,0,0,0,0,0,0,0,0,0,66663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66643,0,0,66654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66698,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66685,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67233,66634,0,0,0,0,0,0,0,0,0,0,66626,0,0,0,0,66923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66839,0,0,0,0,0,0,0,0,0,0,0,0,0,133213,0,0,0,0,0,0,0,0,0,0,66830,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66875,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66429,0,0,0,0,0,0,67055,0,0,0,0,0,0,0,0,66338,0,0,0,0,0,0,66123,0,0,0,0,0,0,0,0,0,66674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66386,0,0,0,0,0,0,66208,0,0,0,0,0,0,0,66854,0,0,66574,0,0,0,0,0,0,0,66799,0,67031,0,0,0,0,0,0,133584,0,0,0,0,0,66493,0,0,0,0,0,0,0,0,66421,0,0,0,66503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66759,0,0,0,0,0,0,0,66935,0,66599,0,0,0,0,0,0,0,0,0,66568,0,0,0,0,66594,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66549,67102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67101,0,0,0,0,66443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66540,0,0,0,0,0,0,0,0,66516,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134010,0,0,0,0,0,0,0,0,66934,0,0,0,0,0,66875,0,0,0,0,0,0,0,0,0,0,0,66582,0,0,0,0,0,66620,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66791,66665,0,0,0,0,0,0,0,0,0,66526,0,0,0,66742,66197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66629,0,0,0,0,0,0,66706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66890,0,0,0,0,0,0,0,0,0,0,66692,66701,0,0,0,0,0,0,0,0,0,0,0,0,66464,66733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66767,0,66622,0,0,0,0,0,0,0,0,66812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66964,0,67341,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,0,0,0,0,0,66663,0,0,0,0,0,0,0,0,0,0,0,0,66033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,66611,0,0,0,0,0,0,0,0,0,0,66935,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66522,0,0,0,0,0,0,0,0,67009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132833,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66678,0,0,0,0,0,0,66402,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66797,0,0,0,66435,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67101,0,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,0,0,0,0,0,66767,0,0,0,0,0,0,0,0,0,0,0,0,66347,0,0,0,66964,66429,0,0,0,0,0,0,0,0,0,0,0,0,0,66352,0,0,0,0,0,0,0,66241,0,0,0,0,0,66609,0,0,0,0,0,0,0,67262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66849,0,0,0,0,0,0,0,0,0,66791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66692,66934,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66742,0,0,0,0,0,0,0,0,0,0,66766,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66977,0,0,66620,0,66123,0,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66596,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66875,0,66751,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67212,0,0,0,0,0,0,66197,0,66421,0,0,0,0,0,0,0,66663,0,66854,0,0,0,0,0,0,0,0,0,0,0,0,67255,0,0,0,0,0,0,0,0,0,0,0,0,66851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67149,0,0,0,0,0,66706,0,0,0,0,0,0,0,66889,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66687,0,0,0,0,0,66208,0,0,0,66733,0,0,66961,66033,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66685,0,0,0,0,0,0,0,0,0,0,66761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66559,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66594,0,0,0,0,0,0,66546,0,0,0,0,0,66680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66923,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66687,0,0,0,66759,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66591,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66634,0,0,0,0,0,0,0,0,0,0,0,66136,0,0,0,0,0,0,0,0,0,0,0,0,0,66345,66658,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66665,0,0,0,0,133914,66781,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133255,66516,0,0,0,0,0,66875,0,0,0,66463,0,0,0,0,0,0,0,0,67341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66420,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,66883,0,0,0,0,0,0,0,66664,0,0,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66382,0,0,0,66644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66640,0,0,0,66753,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66996,0,0,0,0,0,66368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66476,0,0,0,0,0,0,0,0,67031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66593,0,0,0,0,0,66836,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66743,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66622,0,0,0,0,0,0,0,66807,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66806,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66643,0,0,0,0,66556,0,0,0,0,0,0,0,0,0,0,0,66140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66458,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66859,0,0,0,0,66654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132603,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65943,0,66674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67050,0,0,0,0,0,0,0,0,0,0,66645,0,0,0,0,0,0,0,0,0,0,67102,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66443,0,0,0,0,0,0,0,0,0,0,66839,0,0,0,0,0,0,0,66574,0,0,0,0,67001,0,0,0,0,0,0,0,0,0,0,0,0,0,67233,0,0,0,66890,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66652,0,66694,0,0,0,0,0,0,0,66696,0,0,0,0,66498,0,0,0,0,0,66698,66546,0,0,0,0,0,0,133076,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66549,0,0,0,0,0,0,0,0,0,66409,0,0,66701,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66672,0,0,0,0,67027,0,0,0,0,0,0,0,0,66582,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66830,0,0,0,0,66799,0,0,0,0,0,0,0,66793,0,0,0,66664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66493,66485,0,66503,0,0,0,0,0,0,0,0,66657,66568,66719,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66674,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66743,66678,66643,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133458,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66665,0,0,0,0,0,0,0,0,0,0,0,66996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66574,0,0,0,66582,0,67262,0,0,0,0,0,0,0,0,0,0,0,0,66883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66807,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66594,0,0,0,0,66797,0,66549,0,0,0,0,0,0,0,0,0,0,0,0,0,66977,0,0,0,66599,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66654,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66596,0,0,0,0,0,0,0,0,0,66464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67341,0,0,0,0,0,0,0,0,0,0,66839,0,0,0,0,0,0,0,0,0,0,66685,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66978,0,0,0,0,67009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133884,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67233,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66799,0,0,0,0,0,0,0,66964,0,0,66767,0,66568,0,0,0,66766,0,0,0,0,0,0,0,0,0,0,0,66648,0,0,66503,0,0,0,0,0,0,66493,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66935,0,0,0,0,0,0,0,0,66593,0,66476,66516,0,0,0,0,0,66806,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66961,0,0,0,0,0,0,0,0,66698,0,0,0,0,0,66923,0,0,0,0,0,0,0,0,0,0,0,66664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66830,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66793,0,66687,0,0,0,0,0,0,0,0,0,0,66702,0,66889,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66458,0,0,0,0,0,0,0,0,0,66220,0,0,0,0,0,0,0,0,0,67101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67050,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66692,0,0,0,0,0,0,0,66791,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67055,0,66694,0,0,66498,0,0,0,0,0,0,0,0,0,0,0,66136,0,0,0,0,0,0,0,0,66435,0,66696,0,0,0,0,66634,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66751,0,0,66875,0,0,66934,0,0,0,0,66665,0,0,0,0,67212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66658,0,0,0,0,0,0,0,0,0,0,66742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66140,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66626,0,0,0,0,0,133279,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66622,66663,0,0,0,66429,0,0,0,0,0,0,0,0,66345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67027,66546,0,0,0,0,0,66620,0,0,0,0,66624,0,0,0,0,0,0,0,0,66485,0,66477,0,0,0,0,0,0,0,0,0,0,0,0,0,66652,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66657,0,0,0,0,0,0,0,0,0,0,65943,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66859,0,66672,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67031,0,0,66077,0,66645,0,0,0,66591,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66875,0,0,0,0,0,0,0,0,0,0,0,0,0,66687,0,0,0,0,0,66197,0,0,0,66540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66526,66546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66463,0,0,0,0,132592,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66781,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66719,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66123,0,0,0,0,0,0,0,0,0,66680,66386,0,0,0,0,0,66640,66382,0,66733,0,0,0,0,0,66534,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66526,0,0,0,0,0,0,0,0,0,0,0,0,66402,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,66241,66421,0,66409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66338,0,0,0,0,66854,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,66611,0,0,0,0,0,66664,0,0,66663,0,0,0,0,0,0,0,0,66369,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66890,0,0,0,0,0,0,0,66522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133747,0,0,0,0,0,0,0,0,0,0,66347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133454,0,0,0,0,0,0,0,0,66208,0,0,0,66443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66701,0,0,0,0,0,0,0,0,66368,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66429,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67001,0,0,0,0,0,0,0,66516,0,0,0,0,66977,0,0,0,0,0,0,0,0,0,0,0,66701,0,0,0,0,0,0,0,0,0,0,0,66678,0,0,0,0,0,66033,0,0,0,0,0,0,67262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66596,0,0,0,133072,66761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67102,0,0,0,0,0,0,0,0,66443,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66680,0,0,0,0,0,0,0,66851,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133461,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67255,0,0,66923,0,0,0,0,0,0,66706,0,0,0,0,0,0,66674,0,66485,0,0,0,0,0,0,0,0,0,66836,0,0,0,0,0,67027,0,66733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66582,0,0,0,0,0,0,0,0,0,66657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66477,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66961,0,0,0,0,0,0,66859,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66464,66574,0,0,0,0,66652,0,66672,0,0,0,0,0,0,0,0,0,0,0,132689,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66386,0,0,0,66123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66766,0,0,66978,66643,0,0,0,0,0,0,0,0,0,0,67055,0,0,66599,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66368,0,0,0,0,0,0,0,0,0,0,0,66978,0,0,0,0,0,0,66644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66743,0,0,0,0,0,0,66687,0,0,0,0,0,0,0,0,0,0,0,66622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66136,0,0,66421,0,0,0,65943,0,0,0,0,0,0,0,0,0,0,0,0,66889,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66634,0,0,66964,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66767,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67009,0,66911,0,0,0,0,0,0,0,66854,0,0,66875,0,0,0,0,0,66645,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66546,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133646,0,0,0,0,0,0,0,0,66654,0,0,0,0,0,0,0,0,66077,0,0,0,0,0,0,0,0,0,0,0,0,66719,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66702,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66996,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66420,0,66568,0,0,0,0,0,66658,0,0,0,0,66241,0,0,66799,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66626,0,0,0,0,0,0,0,0,0,0,67149,0,0,66503,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66493,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66935,0,0,0,0,66402,0,0,0,0,0,0,0,0,0,0,0,0,0,66812,0,0,0,67233,0,66663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66540,0,0,0,0,0,0,0,0,66665,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66345,0,0,0,0,0,0,0,0,0,0,0,0,67031,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66692,66830,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66859,0,0,0,0,0,0,0,66409,66698,0,0,0,0,0,0,0,0,0,0,0,67101,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66791,0,0,66793,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66546,0,66751,67212,0,0,0,0,0,0,0,0,0,0,0,0,0,133122,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66611,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67341,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66347,0,0,66594,0,0,0,0,0,0,0,0,0,66522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133256,0,0,0,0,66435,0,0,0,0,0,0,0,0,0,0,0,0,133397,0,0,0,0,0,0,66806,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66352,0,0,0,0,0,0,66663,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66742,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66534,0,0,0,0,0,0,0,66781,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66687,0,0,0,0,0,0,0,0,0,0,0,66648,0,0,0,0,0,0,0,0,0,0,0,0,0,66593,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66556,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66640,0,0,0,0,66759,66890,0,0,0,66476,0,0,0,0,0,0,0,0,0,0,66382,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66620,66498,0,0,0,0,0,0,66694,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67050,0,0,0,0,0,0,0,0,66458,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,132916,0,0,0,0,0,0,0,0,0,0,0,0,0,66849,0,0,0,0,0,0,66526,0,0,0,0,0,66685,0,0,0,0,66559,0,0,0,0,0,0,0,0,0,66609,0,0,0,0,0,0,66760,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,67101,0,0,0,0,66851,67262,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66781,66338,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66830,0,0,0,0,0,0,0,0,0,0,0,66140,0,0,0,0,66678,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133563,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66382,0,0,0,0,0,0,0,66793,0,0,0,66883,0,0,0,0,66698,0,0,66701,0,0,0,0,0,0,66687,0,0,0,0,0,0,0,0,0,0,67001,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66812,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66665,0,0,0,0,0,0,0,0,0,0,0,133920,66663,0,0,0,0,0,0,0,0,0,0,0,0,0,65943,0,0,0,0,0,0,0,0,0,0,67149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66934,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66622,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66742,0,0,0,0,0,0,0,66435,0,0,0,0,67102,0,0,0,0,66443,0,0,0,0,0,66797,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66719,0,0,66645,66546,67055,0,0,0,0,0,0,66644,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66241,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66961,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66760,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66208,0,132740,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,133085,0,0,0,0,0,0,0,0,0,66753,0,0,0,0,0,0,0,0,0,0,66136,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66620,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66402,0,0,0,0,0,0,0,66582,0,0,0,0,0,66634,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66875,0,66806,0,0,0,0,0,0,0,0,0,66674,0,0,67341,0,0,0,0,0,0,0,0,66687,0,0,0,66766,0,0,0,0,66220,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66033,0,0,0,0,66464,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66889,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,66761,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66978,0,0,0,66664,0,0,0,0,0,0,0,0,66680,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66836,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66556,0,0,0,0,0,0,0,0,0,0,0,0,66549,66429,0,0,0,0,0,0,0,66978,0,0,0,132695,0,0,0,0,0,0,0,0,0,66574,0,0,0,0,0,0,66694,0,0,66875,0,0,66420,0,0,0,0,0,0,0,0,66593,0,0,0,0,0,66594,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66648,0,0,0,0,0,0,0,0,0,0,0,0,0,66696,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67050,0,66658,0,0,0,0,66626,0,66599,0,0,0,0,0,0,66540,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66964,0,66476,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66458,0,0,0,0,0,0,0,0,0,0,66767,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66220,0,0,0,0,0,66409,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66629,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66643,0,0,0,0,0,67031,0,0,0,0,0,0,0,0,0,0,0,66369,0,0,0,0,0,0,0,0,0,0,0,66702,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67009,0,0,0,0,0,0,0,0,0,0,0,0,66706,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66611,0,0,66733,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66759,0,66347,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66345,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66743,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66368,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66522,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66352,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66839,0,0,0,0,0,0,0,0,0,0,0,0,0,66526,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66859,0,0,0,0,0,0,0,66516,0,0,0,0,0,0,0,0,0,0,0,0,0,133222,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66485,0,0,0,66799,0,0,0,0,0,0,0,0,0,0,0,0,66807,0,0,0,0,0,0,0,0,0,0,66685,0,0,0,0,0,0,0,0,0,0,0,66503,0,0,0,0,0,0,0,0,0,0,0,0,67027,0,0,0,0,0,0,0,0,0,0,0,0,0,66493,0,0,0,66657,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66628,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66386,0,0,0,0,0,0,0,0,66935,0,0,0,0,0,0,0,0,0,66123,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66546,0,0,0,0,0,0,0,0,0,0,0,66911,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66849,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67233,0,0,66477,0,0,66890,0,0,0,0,0,0,0,66996,0,0,0,0,0,0,66421,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66609,0,0,0,0,0,0,0,0,0,66692,0,0,0,0,66977,0,0,0,0,0,66672,0,0,0,0,0,66534,0,0,0,0,0,0,0,0,0,0,66463,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66652,0,0,0,67212,0,0,0,0,0,0,0,0,0,0,0,0,0,66751,0,66760,0,0,0,0,66591,0,0,66596,66624,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66664,0,66791,0,0,0,0,0,0,133713,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":225999676,"last_update_version":401695327808389122}},"indices":{},"count":10000000,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/partsupp.json b/cmd/explaintest/s/tpch_stats/partsupp.json deleted file mode 100644 index 48926dda9865a..0000000000000 --- a/cmd/explaintest/s/tpch_stats/partsupp.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"partsupp","columns":{"ps_availqty":{"histogram":{"ndv":9999,"buckets":[{"count":160000,"lower_bound":"Mg==","upper_bound":"Mzg=","repeats":4000},{"count":324000,"lower_bound":"Mzk=","upper_bound":"ODE=","repeats":8000},{"count":484000,"lower_bound":"ODI=","upper_bound":"MTE4","repeats":4000},{"count":644000,"lower_bound":"MTE5","upper_bound":"MTU5","repeats":4000},{"count":816000,"lower_bound":"MTYw","upper_bound":"MjA5","repeats":16000},{"count":980000,"lower_bound":"MjEw","upper_bound":"MjUy","repeats":8000},{"count":1148000,"lower_bound":"MjUz","upper_bound":"MzAy","repeats":12000},{"count":1308000,"lower_bound":"MzAz","upper_bound":"MzM5","repeats":4000},{"count":1468000,"lower_bound":"MzQx","upper_bound":"Mzc4","repeats":8000},{"count":1632000,"lower_bound":"Mzc5","upper_bound":"NDI4","repeats":8000},{"count":1792000,"lower_bound":"NDI5","upper_bound":"NDcw","repeats":4000},{"count":1964000,"lower_bound":"NDcx","upper_bound":"NTAw","repeats":16000},{"count":2132000,"lower_bound":"NTAy","upper_bound":"NTM5","repeats":12000},{"count":2292000,"lower_bound":"NTQy","upper_bound":"NTg4","repeats":4000},{"count":2460000,"lower_bound":"NTg5","upper_bound":"NjQy","repeats":12000},{"count":2620000,"lower_bound":"NjQz","upper_bound":"Njcy","repeats":8000},{"count":2780000,"lower_bound":"Njcz","upper_bound":"NzA5","repeats":4000},{"count":2940000,"lower_bound":"NzEx","upper_bound":"NzUw","repeats":8000},{"count":3100000,"lower_bound":"NzUy","upper_bound":"ODAx","repeats":4000},{"count":3260000,"lower_bound":"ODAy","upper_bound":"ODM1","repeats":4000},{"count":3424000,"lower_bound":"ODM2","upper_bound":"ODc1","repeats":8000},{"count":3588000,"lower_bound":"ODc2","upper_bound":"OTIx","repeats":8000},{"count":3748000,"lower_bound":"OTIy","upper_bound":"OTU4","repeats":16000},{"count":3908000,"lower_bound":"OTU5","upper_bound":"OTg4","repeats":8000},{"count":4068000,"lower_bound":"OTg5","upper_bound":"MTAxOA==","repeats":4000},{"count":4228000,"lower_bound":"MTAxOQ==","upper_bound":"MTA2MA==","repeats":4000},{"count":4388000,"lower_bound":"MTA2MQ==","upper_bound":"MTA5NQ==","repeats":4000},{"count":4548000,"lower_bound":"MTEwMQ==","upper_bound":"MTE1Mg==","repeats":4000},{"count":4712000,"lower_bound":"MTE1Ng==","upper_bound":"MTIwNA==","repeats":8000},{"count":4876000,"lower_bound":"MTIwNg==","upper_bound":"MTI0Nw==","repeats":8000},{"count":5044000,"lower_bound":"MTI0OA==","upper_bound":"MTI5Mw==","repeats":12000},{"count":5204000,"lower_bound":"MTI5NQ==","upper_bound":"MTM0OA==","repeats":4000},{"count":5364000,"lower_bound":"MTM0OQ==","upper_bound":"MTM4OA==","repeats":4000},{"count":5524000,"lower_bound":"MTM4OQ==","upper_bound":"MTQyNA==","repeats":4000},{"count":5684000,"lower_bound":"MTQyNg==","upper_bound":"MTQ2Nw==","repeats":4000},{"count":5844000,"lower_bound":"MTQ2OA==","upper_bound":"MTUxMw==","repeats":4000},{"count":6004000,"lower_bound":"MTUxNA==","upper_bound":"MTU0Mw==","repeats":4000},{"count":6168000,"lower_bound":"MTU0NQ==","upper_bound":"MTU4Mw==","repeats":8000},{"count":6328000,"lower_bound":"MTU4NA==","upper_bound":"MTYxOA==","repeats":4000},{"count":6488000,"lower_bound":"MTYxOQ==","upper_bound":"MTY1Nw==","repeats":4000},{"count":6652000,"lower_bound":"MTY1OA==","upper_bound":"MTcwMQ==","repeats":20000},{"count":6816000,"lower_bound":"MTcwMg==","upper_bound":"MTczNA==","repeats":8000},{"count":6976000,"lower_bound":"MTczNQ==","upper_bound":"MTc2Mg==","repeats":12000},{"count":7152000,"lower_bound":"MTc2Mw==","upper_bound":"MTc5OA==","repeats":20000},{"count":7312000,"lower_bound":"MTc5OQ==","upper_bound":"MTgzNA==","repeats":8000},{"count":7472000,"lower_bound":"MTgzNg==","upper_bound":"MTg3OQ==","repeats":4000},{"count":7632000,"lower_bound":"MTg4MQ==","upper_bound":"MTkxNQ==","repeats":8000},{"count":7792000,"lower_bound":"MTkxNw==","upper_bound":"MTk1NQ==","repeats":8000},{"count":7952000,"lower_bound":"MTk1Nw==","upper_bound":"MTk5OA==","repeats":12000},{"count":8112000,"lower_bound":"MTk5OQ==","upper_bound":"MjAzNw==","repeats":4000},{"count":8276000,"lower_bound":"MjA0MA==","upper_bound":"MjA3Ng==","repeats":8000},{"count":8436000,"lower_bound":"MjA4MA==","upper_bound":"MjExNg==","repeats":4000},{"count":8596000,"lower_bound":"MjExOA==","upper_bound":"MjE1OQ==","repeats":12000},{"count":8760000,"lower_bound":"MjE2MA==","upper_bound":"MjIwMw==","repeats":8000},{"count":8920000,"lower_bound":"MjIwNQ==","upper_bound":"MjI0MA==","repeats":4000},{"count":9084000,"lower_bound":"MjI0MQ==","upper_bound":"MjI4MA==","repeats":8000},{"count":9244000,"lower_bound":"MjI4MQ==","upper_bound":"MjMyNA==","repeats":4000},{"count":9404000,"lower_bound":"MjMyNQ==","upper_bound":"MjM2Ng==","repeats":4000},{"count":9564000,"lower_bound":"MjM2OA==","upper_bound":"MjQwMA==","repeats":4000},{"count":9724000,"lower_bound":"MjQwMQ==","upper_bound":"MjQ1Mw==","repeats":8000},{"count":9888000,"lower_bound":"MjQ1NA==","upper_bound":"MjQ5MQ==","repeats":12000},{"count":10052000,"lower_bound":"MjQ5Mg==","upper_bound":"MjUzMA==","repeats":16000},{"count":10216000,"lower_bound":"MjUzMQ==","upper_bound":"MjU3Mg==","repeats":12000},{"count":10376000,"lower_bound":"MjU3Mw==","upper_bound":"MjYxMw==","repeats":4000},{"count":10544000,"lower_bound":"MjYxNA==","upper_bound":"MjY1MA==","repeats":12000},{"count":10708000,"lower_bound":"MjY1Mg==","upper_bound":"MjY5Mw==","repeats":8000},{"count":10868000,"lower_bound":"MjY5Nw==","upper_bound":"MjcyNw==","repeats":8000},{"count":11032000,"lower_bound":"MjcyOA==","upper_bound":"Mjc2Nw==","repeats":8000},{"count":11192000,"lower_bound":"Mjc2OA==","upper_bound":"MjgwMw==","repeats":4000},{"count":11352000,"lower_bound":"MjgwNg==","upper_bound":"Mjg0NQ==","repeats":4000},{"count":11516000,"lower_bound":"Mjg0Ng==","upper_bound":"Mjg4Nw==","repeats":12000},{"count":11680000,"lower_bound":"Mjg4OA==","upper_bound":"MjkyNw==","repeats":8000},{"count":11840000,"lower_bound":"MjkyOQ==","upper_bound":"Mjk3MQ==","repeats":4000},{"count":12004000,"lower_bound":"Mjk3Mg==","upper_bound":"MzAwMQ==","repeats":16000},{"count":12172000,"lower_bound":"MzAwMg==","upper_bound":"MzAzOA==","repeats":12000},{"count":12332000,"lower_bound":"MzA0MA==","upper_bound":"MzA4Ng==","repeats":4000},{"count":12492000,"lower_bound":"MzA4Nw==","upper_bound":"MzEyNQ==","repeats":4000},{"count":12652000,"lower_bound":"MzEyNg==","upper_bound":"MzE4Mg==","repeats":4000},{"count":12812000,"lower_bound":"MzE4Mw==","upper_bound":"MzIyMA==","repeats":4000},{"count":12972000,"lower_bound":"MzIyMQ==","upper_bound":"MzI2Mg==","repeats":4000},{"count":13132000,"lower_bound":"MzI2Mw==","upper_bound":"MzMwNQ==","repeats":4000},{"count":13292000,"lower_bound":"MzMwNw==","upper_bound":"MzM1Mw==","repeats":8000},{"count":13456000,"lower_bound":"MzM1Ng==","upper_bound":"MzM5NA==","repeats":8000},{"count":13616000,"lower_bound":"MzM5Ng==","upper_bound":"MzQzNA==","repeats":8000},{"count":13776000,"lower_bound":"MzQzNg==","upper_bound":"MzQ3MA==","repeats":8000},{"count":13936000,"lower_bound":"MzQ3NA==","upper_bound":"MzUwOQ==","repeats":4000},{"count":14096000,"lower_bound":"MzUxMA==","upper_bound":"MzU1Mg==","repeats":4000},{"count":14264000,"lower_bound":"MzU1NA==","upper_bound":"MzYwMw==","repeats":16000},{"count":14424000,"lower_bound":"MzYwNA==","upper_bound":"MzY1MA==","repeats":8000},{"count":14584000,"lower_bound":"MzY1MQ==","upper_bound":"MzY5Mw==","repeats":4000},{"count":14748000,"lower_bound":"MzY5NA==","upper_bound":"MzczMQ==","repeats":8000},{"count":14908000,"lower_bound":"MzczMg==","upper_bound":"Mzc4MQ==","repeats":8000},{"count":15068000,"lower_bound":"Mzc4NA==","upper_bound":"MzgxOQ==","repeats":4000},{"count":15228000,"lower_bound":"MzgyMg==","upper_bound":"Mzg2NQ==","repeats":12000},{"count":15392000,"lower_bound":"Mzg2Ng==","upper_bound":"MzkwNg==","repeats":8000},{"count":15552000,"lower_bound":"MzkwOQ==","upper_bound":"Mzk0Nw==","repeats":8000},{"count":15712000,"lower_bound":"Mzk0OQ==","upper_bound":"Mzk3Ng==","repeats":4000},{"count":15876000,"lower_bound":"Mzk3Nw==","upper_bound":"NDAxNw==","repeats":8000},{"count":16036000,"lower_bound":"NDAxOA==","upper_bound":"NDA1Nw==","repeats":12000},{"count":16196000,"lower_bound":"NDA1OA==","upper_bound":"NDEwNQ==","repeats":8000},{"count":16360000,"lower_bound":"NDExMA==","upper_bound":"NDE1NA==","repeats":8000},{"count":16520000,"lower_bound":"NDE1NQ==","upper_bound":"NDE4NQ==","repeats":12000},{"count":16680000,"lower_bound":"NDE4Ng==","upper_bound":"NDIzMA==","repeats":4000},{"count":16840000,"lower_bound":"NDIzMQ==","upper_bound":"NDI2OQ==","repeats":4000},{"count":17000000,"lower_bound":"NDI3MQ==","upper_bound":"NDMwNQ==","repeats":4000},{"count":17160000,"lower_bound":"NDMwNg==","upper_bound":"NDM1MQ==","repeats":4000},{"count":17320000,"lower_bound":"NDM1NA==","upper_bound":"NDM5OQ==","repeats":4000},{"count":17480000,"lower_bound":"NDQwMA==","upper_bound":"NDQzMw==","repeats":8000},{"count":17640000,"lower_bound":"NDQzNA==","upper_bound":"NDQ4Mg==","repeats":8000},{"count":17804000,"lower_bound":"NDQ4NA==","upper_bound":"NDUyMA==","repeats":8000},{"count":17972000,"lower_bound":"NDUyMQ==","upper_bound":"NDU2NA==","repeats":16000},{"count":18132000,"lower_bound":"NDU2NQ==","upper_bound":"NDU5Nw==","repeats":4000},{"count":18292000,"lower_bound":"NDU5OA==","upper_bound":"NDYzNw==","repeats":4000},{"count":18452000,"lower_bound":"NDYzOA==","upper_bound":"NDY4NA==","repeats":12000},{"count":18616000,"lower_bound":"NDY4Ng==","upper_bound":"NDczNw==","repeats":8000},{"count":18780000,"lower_bound":"NDczOA==","upper_bound":"NDc3Nw==","repeats":8000},{"count":18940000,"lower_bound":"NDc3OQ==","upper_bound":"NDgxNg==","repeats":8000},{"count":19100000,"lower_bound":"NDgxNw==","upper_bound":"NDg1NA==","repeats":8000},{"count":19260000,"lower_bound":"NDg1NQ==","upper_bound":"NDg5MA==","repeats":4000},{"count":19420000,"lower_bound":"NDg5MQ==","upper_bound":"NDkyOQ==","repeats":12000},{"count":19584000,"lower_bound":"NDkzMQ==","upper_bound":"NDk3MQ==","repeats":8000},{"count":19744000,"lower_bound":"NDk3Mg==","upper_bound":"NTAwNg==","repeats":12000},{"count":19908000,"lower_bound":"NTAwNw==","upper_bound":"NTA1MA==","repeats":8000},{"count":20068000,"lower_bound":"NTA1MQ==","upper_bound":"NTA5OQ==","repeats":4000},{"count":20232000,"lower_bound":"NTEwMA==","upper_bound":"NTE1MA==","repeats":8000},{"count":20392000,"lower_bound":"NTE1MQ==","upper_bound":"NTE5Mw==","repeats":4000},{"count":20556000,"lower_bound":"NTE5Ng==","upper_bound":"NTI1Mg==","repeats":8000},{"count":20716000,"lower_bound":"NTI1NA==","upper_bound":"NTI4OQ==","repeats":4000},{"count":20876000,"lower_bound":"NTI5MA==","upper_bound":"NTMzMA==","repeats":4000},{"count":21036000,"lower_bound":"NTMzMQ==","upper_bound":"NTM2Mw==","repeats":8000},{"count":21196000,"lower_bound":"NTM2NA==","upper_bound":"NTQwMg==","repeats":16000},{"count":21356000,"lower_bound":"NTQwMw==","upper_bound":"NTQ0OA==","repeats":4000},{"count":21516000,"lower_bound":"NTQ0OQ==","upper_bound":"NTQ4NA==","repeats":12000},{"count":21684000,"lower_bound":"NTQ4Nw==","upper_bound":"NTUyNw==","repeats":12000},{"count":21852000,"lower_bound":"NTUyOA==","upper_bound":"NTU2MA==","repeats":12000},{"count":22016000,"lower_bound":"NTU2MQ==","upper_bound":"NTYxMA==","repeats":12000},{"count":22180000,"lower_bound":"NTYxMg==","upper_bound":"NTY0Mw==","repeats":8000},{"count":22340000,"lower_bound":"NTY0NA==","upper_bound":"NTY4NQ==","repeats":8000},{"count":22500000,"lower_bound":"NTY4Nw==","upper_bound":"NTcyMw==","repeats":4000},{"count":22660000,"lower_bound":"NTcyNA==","upper_bound":"NTc3MA==","repeats":4000},{"count":22820000,"lower_bound":"NTc3MQ==","upper_bound":"NTgwOQ==","repeats":4000},{"count":22980000,"lower_bound":"NTgxMA==","upper_bound":"NTg0NA==","repeats":12000},{"count":23144000,"lower_bound":"NTg0NQ==","upper_bound":"NTg5MA==","repeats":8000},{"count":23312000,"lower_bound":"NTg5MQ==","upper_bound":"NTkyOA==","repeats":12000},{"count":23476000,"lower_bound":"NTkyOQ==","upper_bound":"NTk3OA==","repeats":8000},{"count":23636000,"lower_bound":"NTk3OQ==","upper_bound":"NjAxOQ==","repeats":8000},{"count":23800000,"lower_bound":"NjAyMQ==","upper_bound":"NjA1OQ==","repeats":8000},{"count":23960000,"lower_bound":"NjA2MA==","upper_bound":"NjA5Ng==","repeats":8000},{"count":24120000,"lower_bound":"NjA5Nw==","upper_bound":"NjEzNw==","repeats":4000},{"count":24280000,"lower_bound":"NjEzOQ==","upper_bound":"NjE4NQ==","repeats":4000},{"count":24444000,"lower_bound":"NjE4Ng==","upper_bound":"NjIyNA==","repeats":8000},{"count":24608000,"lower_bound":"NjIyNQ==","upper_bound":"NjI2Mg==","repeats":16000},{"count":24772000,"lower_bound":"NjI2Mw==","upper_bound":"NjMwOQ==","repeats":12000},{"count":24932000,"lower_bound":"NjMxMA==","upper_bound":"NjM1Mg==","repeats":4000},{"count":25096000,"lower_bound":"NjM1NA==","upper_bound":"NjM4OQ==","repeats":8000},{"count":25264000,"lower_bound":"NjM5Mg==","upper_bound":"NjQyMA==","repeats":24000},{"count":25428000,"lower_bound":"NjQyMQ==","upper_bound":"NjQ1MA==","repeats":8000},{"count":25588000,"lower_bound":"NjQ1MQ==","upper_bound":"NjQ5Mg==","repeats":12000},{"count":25756000,"lower_bound":"NjQ5NA==","upper_bound":"NjUyOQ==","repeats":16000},{"count":25916000,"lower_bound":"NjUzMA==","upper_bound":"NjU3Mg==","repeats":8000},{"count":26076000,"lower_bound":"NjU3NA==","upper_bound":"NjYwMw==","repeats":8000},{"count":26236000,"lower_bound":"NjYwNg==","upper_bound":"NjYyNw==","repeats":4000},{"count":26396000,"lower_bound":"NjYyOA==","upper_bound":"NjY3NQ==","repeats":4000},{"count":26564000,"lower_bound":"NjY3Ng==","upper_bound":"NjczMw==","repeats":12000},{"count":26728000,"lower_bound":"NjczNQ==","upper_bound":"Njc3Mw==","repeats":8000},{"count":26888000,"lower_bound":"Njc3NA==","upper_bound":"NjgyMA==","repeats":4000},{"count":27052000,"lower_bound":"NjgyMg==","upper_bound":"Njg2MQ==","repeats":8000},{"count":27212000,"lower_bound":"Njg2Mg==","upper_bound":"NjkwNQ==","repeats":8000},{"count":27380000,"lower_bound":"NjkwNw==","upper_bound":"Njk0Mw==","repeats":16000},{"count":27540000,"lower_bound":"Njk0Ng==","upper_bound":"Njk3OQ==","repeats":16000},{"count":27700000,"lower_bound":"Njk4MQ==","upper_bound":"NzAxNw==","repeats":4000},{"count":27860000,"lower_bound":"NzAxOQ==","upper_bound":"NzA2NA==","repeats":12000},{"count":28028000,"lower_bound":"NzA2NQ==","upper_bound":"NzEwOQ==","repeats":12000},{"count":28188000,"lower_bound":"NzExMQ==","upper_bound":"NzE0NA==","repeats":4000},{"count":28348000,"lower_bound":"NzE0NQ==","upper_bound":"NzE4NQ==","repeats":4000},{"count":28512000,"lower_bound":"NzE4Nw==","upper_bound":"NzIzMw==","repeats":8000},{"count":28672000,"lower_bound":"NzIzNQ==","upper_bound":"NzI4MQ==","repeats":4000},{"count":28832000,"lower_bound":"NzI4Mw==","upper_bound":"NzMyMA==","repeats":4000},{"count":28992000,"lower_bound":"NzMyMQ==","upper_bound":"NzM1Mw==","repeats":12000},{"count":29152000,"lower_bound":"NzM1NA==","upper_bound":"NzM5MQ==","repeats":8000},{"count":29312000,"lower_bound":"NzM5Mg==","upper_bound":"NzQyNg==","repeats":8000},{"count":29472000,"lower_bound":"NzQyNw==","upper_bound":"NzQ3Nw==","repeats":4000},{"count":29632000,"lower_bound":"NzQ3OA==","upper_bound":"NzUxMg==","repeats":8000},{"count":29792000,"lower_bound":"NzUxNA==","upper_bound":"NzU1Nw==","repeats":8000},{"count":29952000,"lower_bound":"NzU1OA==","upper_bound":"NzYwMQ==","repeats":4000},{"count":30116000,"lower_bound":"NzYwMw==","upper_bound":"NzY0MA==","repeats":8000},{"count":30276000,"lower_bound":"NzY0Mg==","upper_bound":"NzY4Ng==","repeats":4000},{"count":30436000,"lower_bound":"NzY4OA==","upper_bound":"NzcxOQ==","repeats":8000},{"count":30600000,"lower_bound":"NzcyMQ==","upper_bound":"Nzc2Ng==","repeats":12000},{"count":30760000,"lower_bound":"Nzc2OA==","upper_bound":"NzgwNQ==","repeats":4000},{"count":30928000,"lower_bound":"NzgxMA==","upper_bound":"Nzg1Nw==","repeats":16000},{"count":31092000,"lower_bound":"Nzg1OQ==","upper_bound":"Nzg5OQ==","repeats":8000},{"count":31252000,"lower_bound":"NzkwMA==","upper_bound":"NzkzMg==","repeats":8000},{"count":31416000,"lower_bound":"NzkzMw==","upper_bound":"Nzk1OA==","repeats":8000},{"count":31576000,"lower_bound":"Nzk1OQ==","upper_bound":"ODAwMA==","repeats":4000},{"count":31736000,"lower_bound":"ODAwMQ==","upper_bound":"ODAzNw==","repeats":8000},{"count":31896000,"lower_bound":"ODAzOQ==","upper_bound":"ODA2Nw==","repeats":4000},{"count":32056000,"lower_bound":"ODA2OA==","upper_bound":"ODEwMw==","repeats":12000},{"count":32220000,"lower_bound":"ODEwNg==","upper_bound":"ODE0Nw==","repeats":16000},{"count":32380000,"lower_bound":"ODE0OA==","upper_bound":"ODE3Mw==","repeats":4000},{"count":32540000,"lower_bound":"ODE3Nw==","upper_bound":"ODIxMw==","repeats":8000},{"count":32700000,"lower_bound":"ODIxNQ==","upper_bound":"ODI0Nw==","repeats":4000},{"count":32864000,"lower_bound":"ODI0OA==","upper_bound":"ODI4NQ==","repeats":8000},{"count":33024000,"lower_bound":"ODI4OA==","upper_bound":"ODMyNQ==","repeats":4000},{"count":33184000,"lower_bound":"ODMzMw==","upper_bound":"ODM2Nw==","repeats":8000},{"count":33352000,"lower_bound":"ODM2OA==","upper_bound":"ODQwMg==","repeats":12000},{"count":33516000,"lower_bound":"ODQwNQ==","upper_bound":"ODQzNg==","repeats":8000},{"count":33680000,"lower_bound":"ODQzNw==","upper_bound":"ODQ5MQ==","repeats":12000},{"count":33840000,"lower_bound":"ODQ5Mg==","upper_bound":"ODUzNw==","repeats":8000},{"count":34000000,"lower_bound":"ODUzOQ==","upper_bound":"ODU5Mg==","repeats":4000},{"count":34160000,"lower_bound":"ODU5NA==","upper_bound":"ODYzNQ==","repeats":4000},{"count":34320000,"lower_bound":"ODYzNg==","upper_bound":"ODY2NQ==","repeats":4000},{"count":34480000,"lower_bound":"ODY2Ng==","upper_bound":"ODcwMw==","repeats":4000},{"count":34640000,"lower_bound":"ODcwNg==","upper_bound":"ODc0Mg==","repeats":4000},{"count":34804000,"lower_bound":"ODc0NA==","upper_bound":"ODc2OQ==","repeats":8000},{"count":34964000,"lower_bound":"ODc3MA==","upper_bound":"ODgxMQ==","repeats":4000},{"count":35124000,"lower_bound":"ODgxMg==","upper_bound":"ODg0OQ==","repeats":8000},{"count":35284000,"lower_bound":"ODg1MA==","upper_bound":"ODg5Mg==","repeats":8000},{"count":35444000,"lower_bound":"ODg5Mw==","upper_bound":"ODkzNw==","repeats":4000},{"count":35612000,"lower_bound":"ODk0MQ==","upper_bound":"ODk4MQ==","repeats":12000},{"count":35772000,"lower_bound":"ODk4Mg==","upper_bound":"OTAyMg==","repeats":4000},{"count":35932000,"lower_bound":"OTAyMw==","upper_bound":"OTA0NQ==","repeats":4000},{"count":36092000,"lower_bound":"OTA0Nw==","upper_bound":"OTA3NA==","repeats":12000},{"count":36256000,"lower_bound":"OTA3NQ==","upper_bound":"OTExNA==","repeats":12000},{"count":36416000,"lower_bound":"OTExNw==","upper_bound":"OTE1MQ==","repeats":4000},{"count":36580000,"lower_bound":"OTE1Mw==","upper_bound":"OTIwOA==","repeats":8000},{"count":36744000,"lower_bound":"OTIwOQ==","upper_bound":"OTIzOA==","repeats":8000},{"count":36904000,"lower_bound":"OTIzOQ==","upper_bound":"OTI3MQ==","repeats":4000},{"count":37064000,"lower_bound":"OTI3Ng==","upper_bound":"OTMwOA==","repeats":8000},{"count":37232000,"lower_bound":"OTMwOQ==","upper_bound":"OTMzOQ==","repeats":16000},{"count":37392000,"lower_bound":"OTM0MA==","upper_bound":"OTM2Nw==","repeats":4000},{"count":37552000,"lower_bound":"OTM2OQ==","upper_bound":"OTQxNQ==","repeats":4000},{"count":37712000,"lower_bound":"OTQxNg==","upper_bound":"OTQ1OQ==","repeats":4000},{"count":37872000,"lower_bound":"OTQ2MA==","upper_bound":"OTUwMw==","repeats":8000},{"count":38032000,"lower_bound":"OTUwNA==","upper_bound":"OTUzOA==","repeats":4000},{"count":38192000,"lower_bound":"OTUzOQ==","upper_bound":"OTU3NA==","repeats":4000},{"count":38356000,"lower_bound":"OTU3NQ==","upper_bound":"OTYxMA==","repeats":12000},{"count":38520000,"lower_bound":"OTYxMQ==","upper_bound":"OTY0NA==","repeats":12000},{"count":38684000,"lower_bound":"OTY1MA==","upper_bound":"OTY5MA==","repeats":16000},{"count":38844000,"lower_bound":"OTY5MQ==","upper_bound":"OTczMQ==","repeats":8000},{"count":39008000,"lower_bound":"OTczMg==","upper_bound":"OTc2Mg==","repeats":8000},{"count":39168000,"lower_bound":"OTc2NA==","upper_bound":"OTc5Mw==","repeats":12000},{"count":39336000,"lower_bound":"OTc5OQ==","upper_bound":"OTg0Mw==","repeats":16000},{"count":39496000,"lower_bound":"OTg0NQ==","upper_bound":"OTg4OA==","repeats":4000},{"count":39656000,"lower_bound":"OTg4OQ==","upper_bound":"OTkyMA==","repeats":16000},{"count":39816000,"lower_bound":"OTkyMQ==","upper_bound":"OTk2MA==","repeats":4000},{"count":39980000,"lower_bound":"OTk2MQ==","upper_bound":"OTk5Nw==","repeats":8000},{"count":40000000,"lower_bound":"OTk5OA==","upper_bound":"OTk5OQ==","repeats":12000}]},"cm_sketch":{"rows":[{"counters":[20058,27704,15766,8096,23833,20181,12100,32047,7983,15912,24235,27827,16006,16001,12012,15905,24216,11951,23980,7994,20144,24024,23922,23936,12050,11973,28021,19946,11967,8055,19907,20063,15993,0,19988,12106,23927,8072,7965,32233,15827,31903,24110,27865,23832,16076,40204,28062,15902,28188,4048,8019,11950,15982,27980,11865,28048,35679,7908,15890,7945,24140,19935,23839,19800,27801,19995,23887,24032,31838,27998,15987,19968,28169,24128,28253,4012,19864,12030,12167,24091,15980,24034,8169,15751,40227,15727,28177,31992,24165,24014,20166,20012,7873,24243,8131,11987,31964,11955,7982,31891,24065,24004,23790,27422,20030,12006,20081,20271,12034,19786,48121,12018,20280,16084,27804,19927,31867,15985,20084,28109,20047,8045,8056,11998,24051,15770,7945,16058,19994,24297,15957,31932,12012,7882,15812,28114,19958,20376,20091,23823,19880,3994,3851,16138,7972,15991,36128,12006,35872,31996,16028,16063,28048,15771,19982,19931,27984,16080,24003,19877,11797,20083,27725,12020,7948,36008,19851,12046,16249,16022,7886,11762,7971,24055,27949,19993,23948,19928,36020,20125,16167,12015,24091,12047,15895,24065,40097,27846,19976,27981,12075,16125,8032,15613,15956,24166,24029,40166,16176,27811,15691,7987,32128,12036,20112,12002,16106,20038,20021,19936,20041,12017,0,24179,28041,19917,23875,36103,35795,31811,24188,31986,16160,23897,7893,3943,27867,23931,3857,7938,16027,20061,24200,3926,23867,28144,24054,0,15883,24089,8006,16166,23948,16010,20195,23744,8103,7863,20061,20385,11969,20308,11996,19871,19888,12006,19842,28274,15981,27878,16065,20081,19851,23961,32232,8145,24122,20203,39849,23922,36045,16100,20096,11938,8143,3906,31921,12088,15751,15994,15897,7999,20088,7927,27990,16159,4078,16030,20213,11911,12028,20120,24051,24008,16049,19937,15974,7924,32056,11772,39827,15981,28168,8053,35979,12123,7787,32244,27690,24260,7862,20111,32305,15947,35765,12173,15941,12161,27934,20074,23817,27827,15847,32046,23972,3956,19849,12047,15974,23951,12061,15923,27879,27851,15889,20142,24013,15862,19935,12030,12100,23892,27925,0,3943,8047,11851,12117,20023,31819,28202,0,16249,28072,35769,3960,40025,23900,19909,12225,23591,23976,16105,32125,28070,20085,16082,11972,19910,16201,32116,8074,12128,16009,28003,11929,24199,28303,23971,28049,16166,15941,47925,3904,20080,27957,24032,23969,3880,12051,20019,12110,3810,27882,12058,12059,15800,11826,32122,24312,19993,15970,23977,20151,11910,24161,19716,11817,28127,20270,19958,0,16092,20304,24089,19878,19823,16066,40283,8021,3937,20086,11901,7979,19962,12051,31996,27794,11969,24143,36199,20082,23717,40330,8052,4068,19808,36396,36087,27863,15899,16233,15937,12063,16023,8105,19886,7884,20191,7940,35917,15894,20086,7792,15866,19854,8041,20080,20017,8085,20009,24153,15976,7929,12137,15994,3982,11990,20237,12107,36187,23948,16001,19892,44005,12069,20003,3925,19987,15765,11887,35798,24054,23828,27832,32224,11996,12139,12022,19913,20041,7889,24105,16033,32170,20042,7928,11944,15947,24139,4013,4001,11915,19927,3998,19816,16003,23962,24006,20132,11863,8119,0,27869,24110,8122,35830,12106,40353,27893,20011,20091,8080,19813,28113,7857,27971,40226,20293,20013,19904,35862,28238,16292,15886,27592,11930,16116,12103,15809,23843,20022,11994,11973,36070,16040,20041,20062,31936,15826,20078,15933,24045,16135,20041,20089,11970,31741,7924,7851,11827,16108,16053,12282,24078,23802,20015,19983,15870,31907,4135,20120,31829,32121,8081,28085,15994,16245,12050,20031,19884,8229,24185,32074,16008,23952,32190,20413,31841,28192,4041,31673,28119,27958,16077,12011,19958,20113,11887,12074,51898,31996,12044,16066,19825,3988,16001,20066,16158,19920,23928,31911,27557,12110,15920,32076,12024,8121,40047,15945,4055,23885,4015,8114,15896,19924,11962,20022,12032,11948,19892,11984,4009,24093,16053,40537,15810,20262,15967,32028,12145,12032,20283,8141,32079,15951,12020,19873,16024,23893,19848,27767,28093,36424,19807,24088,16296,24123,19927,11871,31776,15769,15977,15993,11929,16008,15979,44239,24031,24086,15928,19859,7964,28324,23722,16096,15925,23966,20056,20171,31997,8014,24060,28244,4076,24343,12035,12206,8083,20162,3961,15887,16188,24040,16115,16027,15868,11943,36159,31973,11799,11883,23926,12089,31856,19934,16157,20296,11989,24127,20079,24051,16153,11965,20210,19871,8051,15968,15924,7990,36143,23969,27877,11840,16123,20185,16028,16072,15894,24280,35775,27994,12049,8017,32162,7951,16194,19897,23627,11941,15892,32328,20017,15937,15793,36174,15903,24200,8034,11890,23854,16112,19606,32129,20002,24182,4026,15907,35732,19979,8069,24318,27908,19807,24166,23849,20002,27851,15826,11932,20129,23958,27932,20259,31976,16066,27988,3959,27985,24109,16318,16068,20032,24080,12034,15977,20101,15885,16033,28217,31792,12065,4030,23834,27793,31955,20001,36088,4051,16122,20131,24122,27704,15836,19922,7831,27929,23952,23963,0,3989,23961,28166,16067,8006,8121,32059,8044,31951,12015,16083,27948,19993,24287,23995,39935,8045,8199,24262,28155,16039,24239,11926,20141,8117,7867,23957,7972,23873,8118,39744,19908,15820,19901,7872,15953,40281,28069,8008,8077,19800,28143,23968,20175,16056,24250,16178,19904,16016,16137,31880,15968,27876,8134,11878,36041,20045,24207,11930,11925,19975,20029,28143,19810,24221,3900,19924,7962,23972,3969,28169,11746,32101,24077,15918,32547,24087,12044,23867,20045,15919,16074,24092,12171,12065,15949,32225,7989,23969,27957,16012,20043,28166,15976,27966,31901,16083,19952,20019,15990,32186,16113,12182,20094,16069,16068,7977,28038,19917,19612,15884,7947,23915,15854,31909,20058,12030,28137,24104,8005,8040,19927,27929,16083,35701,12034,39818,7936,15989,20110,11839,23936,23856,16212,20280,8065,27927,19851,19937,23815,20143,20182,16103,12013,36247,20003,11997,27964,24021,16068,15926,16197,28140,36011,15851,36276,19857,23946,31823,20099,32019,31978,19937,32028,31837,3947,19929,32279,20136,16112,12134,16011,3973,16080,20172,12021,15927,16071,27926,3956,12154,27766,16079,16027,28139,11983,15920,11734,11998,23911,16113,12077,23786,24188,3955,19971,47809,20062,12042,19995,24125,28163,28233,40013,20021,31901,19928,43905,8112,16064,23947,15895,12127,32051,19953,31591,19909,27948,20038,28390,16296,32263,11978,7898,19938,39921,11912,24116,11900,8043,16021,15889,27861,32115,15879,23868,28136,23659,32110,20019,27854,8072,12093,40172,36058,16046,28226,15944,11978,24018,19935,16066,11991,19841,20161,8025,12064,12150,32027,20112,19880,12195,15800,11881,16019,11850,20008,7967,16044,12167,19689,16036,32080,44128,8074,20190,19767,12180,19982,19898,19970,28115,24325,7890,16107,24140,7963,20026,11864,31636,27996,19898,12022,27713,36069,15967,11877,19963,12050,19910,24364,20069,8069,16046,0,24156,11874,4055,23938,19892,7995,20044,16003,19939,12172,20012,19860,19947,15933,12051,31915,19759,11971,19748,19918,12043,11973,12159,27949,24005,32059,12024,20091,12023,32382,19993,12039,15793,28015,15993,19981,20069,0,15999,19943,15874,4082,8041,27927,4031,20180,20013,27954,8127,7984,20210,27949,20036,16295,24142,15883,23923,19900,11888,16013,23849,12022,12151,27991,24248,15808,20073,12025,20199,11809,24198,15999,27842,23818,12136,15908,20140,16071,16240,19814,31908,4003,23732,4022,11773,20098,15935,7933,35861,8007,19824,4079,4079,36061,15944,7936,23735,16202,12012,16189,3990,12167,11993,7923,12069,16082,12017,16104,27830,8069,16065,31988,27868,7914,8000,8023,24392,24177,27850,12080,20321,0,16251,19767,11860,4033,7966,48215,23980,15838,11911,11859,28142,8032,19809,19748,27775,8105,15886,35684,19760,3952,20202,31810,8065,32116,15940,24268,23975,8107,15780,43958,15930,15962,8000,24269,23923,19885,16181,23960,35917,12106,7957,35867,11882,28004,19862,20149,15954,20065,24229,20072,8096,16001,11939,39852,19869,24202,16001,36260,16030,19857,27995,15839,15918,12101,8020,11982,12017,11874,44058,12025,15757,16031,11906,19570,16208,32136,12003,31921,23928,12124,39857,16181,28060,12167,28046,19905,24186,20168,27980,11886,36015,15971,32163,15895,23944,4010,23875,19952,4010,7980,7941,28165,20006,23776,15842,20128,19953,28054,56575,19909,16128,24084,12151,7898,20102,11849,19823,32065,11934,24076,36156,20002,12143,24175,24250,7942,24008,11978,24024,15990,19938,24019,20111,19815,32116,23903,0,56118,31724,20108,20142,11797,8006,3883,20061,16028,16065,20033,19752,31928,16038,16191,19854,20012,19701,11801,12133,24206,23800,8071,15966,20077,12127,31620,16174,12054,19802,11899,16027,39842,19964,23994,19716,24217,20154,23948,20167,11998,19977,7905,27998,24013,7991,31842,12046,15891,24121,27998,20055,20140,23982,15816,20146,19770,16147,23981,8041,16144,16229,11931,24029,19956,16034,11910,19927,7968,23978,32043,28137,23683,16161,27880,40150,15940,20272,12196,19643,48125,4041,23774,23950,15944,20074,35882,7891,7946,23912,23875,15911,23977,11875,20108,35622,8041,7983,20154,8116,7910,8039,28087,24157,36101,15981,19748,23951,11938,7979,27850,24045,15911,20148,11972,15863,12129,16061,27983,23837,27976,19984,39876,12128,15936,16148,3949,7896,16114,36039,3909,4073,7937,24193,31787,39561,24104,27724,23857,23816,4062,24225,20102,15964,39715,11944,24104,28016,3878,15936,11915,20131,16004,35620,24070,27845,11946,4033,11916,20010,19927,23944,16031,27933,8141,23898,12096,23930,12038,32067,27973,28047,44096,31651,8022,7956,16034,11856,23971,15970,27970,24252,24168,19910,12060,19900,15974,19960,20019,12156,19897,11942,12224,32078,7972,43963,15960,31653,16103,19935,36115,16260,24063,11982,27957,27730,39972,11923,16033,32122,11836,12104,27544,16029,16055,12189,11988,44138,19947,23923,23766,24017,24113,7941,20042,15915,27744,24080,24161,11919,40012,23779,20258,11895,12108,7882,20165,16261,48402,15841,23852,12046,12030,19891,24030,15848,4059,16131,16013,12049,28057,8018,11864,11818,12085,15990,11978,19824,23987,20205,27931,20032,27979,16103,28049,12045,27790,23981,20053,20086,4018,19776,20130,28246,32012,12143,23996,31901,15986,24090,3939,20057,16188,8122,23930,48053,11953,12255,23852,8173,15646,20245,28086,11913,4089,32008,7977,7979,24005,19900,28124,24216,12058,32026,20049,20043,20111,8115,16190,7984,28039,11845,12039,3968,15894,11962,36171,28139,15949,28202,20095,12136,8023,12008,16102,23870,16026,8038,15954,32018,28076,40149,20091,24010,16023,15875,23955,11855,15912,24250,24175,15924,28006,15826,11997,24007,15977,11806,24081,7892,27751,19966,24033,16054,11890,20074,16023,12148,31846,15999,11839,24021,7997,19966,20019,24191,15896,11908,35880,12016,31693,12153,31837,24016,16095,11893,19937,27908,23852,31860,16023,20078,16073,44121,7919,24038,16139,19791,11964,15996,12082,4047,12235,24118,32050,35803,35830,11920,32266,3944,12047,11861,12180,8001,15960,19684,12104,12017,24099,12064,12076,19987,23924,27857,31891,31992,19896,3967,35858,19965,11981,12055,20221,12076,7904,20142,24092,20178,32082,27990,20130,20069,31838,35725,12111,23878,24124,19994,28144,19930,27846,16058,23907,24186,28073,16284,20010,32166,12159,23989,12140,35629,20111,32252,24031,20003,11999,27767,28009,28061,48018,31679,19773,19902,19759,23981,39962,28245,12258,3913,24042,15997,31798,15947,27967,32025,19951,52227,27880,23867,16019,24032,20072,51645,19864,8005,7925,20178,35985,20062,15978,19949,15903,7880,24080,12057,23919,20187,11911,23985,36096,12163,19715,23725,7846,11759,27895,20015,23934,24255,23867,20109,12023,12053,16198,35993,8069,12037,23970,24083,8028,16077,28323,12049,12037,12063,15986,23761,19916,20118,28267,19892,31739,7919,19866,28048,19975,23907,23970,36049,12000,20233,15927,24128,31848,11898,39697,16023,31974,19695,20088,24030,12117,23778,16140,12021,15825,19819,19987,19907,7939,36017,23825,15933,15936,11921,3972,19956,12099,16109,11986,32082,31844,8103,11972,28012,24022,16250,12188,20201,23907,40024,12053,11910,16114,11825,15905,12009,4058,19705,20020,15814,20013,27989,27782,16067,11916,12092,28028,12008,24017,15981,16011,12053,15981,24229,24034,35998,20007,35911,16122,19944,11979,15941,8027,16081,28055,3962,39999,23979,24228,20050,35532,19925,36158,8146,8008,12050,4046,15964,20229,31727,11858,19872,35652,31729,16082,16175,19915,28064,16147,19980,16097,27929,7820,23978,35809,11895,12112,19885,36012,28099,31786,12005,11878,24316,16193,15985,16157,23853,23753,12103,20075,11916,16059,15946,31938,16004,20190,16111,15922,36024,15852]},{"counters":[16016,32284,16134,28038,11897,43701,28257,20142,19970,24001,11931,20253,8013,19971,16095,24320,20012,23943,31659,11827,16228,19988,31600,23864,27881,20256,0,23932,3960,24108,11995,16230,20068,32189,8086,35718,11908,7972,24194,16093,24297,35971,12013,16104,15942,7892,8043,23948,12268,11879,20044,7922,15851,15968,28068,20058,20120,12051,16125,3990,12128,7852,12090,8044,11932,23850,23939,11946,28237,19833,3948,16058,31766,19915,19935,24063,28385,15955,32055,11897,16156,12054,16108,28225,11966,16030,28081,19821,19828,16141,3932,12151,16043,15985,11900,19967,31874,12059,23939,11775,12023,39876,31841,16125,12069,12036,15967,28206,19961,31971,43807,20261,24182,12039,23956,32130,23801,12170,23718,0,15995,19979,16065,8034,0,3906,8022,23881,8019,27737,16021,40313,16089,11961,15774,28236,36063,15915,15913,24086,7960,11951,11892,11859,20012,15872,15838,24138,15823,28149,28166,3902,16131,20108,28133,12082,23911,19925,19910,8071,20014,16101,4027,20251,35940,43912,28079,23835,8022,3988,11997,24086,11998,15950,28098,23946,28075,20089,7933,20161,19872,28069,20118,19943,15961,11837,28095,7960,23730,16007,11987,40115,23785,15758,40170,11973,27969,3958,12064,11900,27764,24092,27772,35773,12013,11833,23932,16094,31710,12191,16029,15780,12038,36152,28126,32021,15967,19954,20266,39816,12007,24169,32000,16029,15966,15952,4048,16095,8017,32015,35862,31920,23977,12122,15947,8009,15910,15628,8059,7912,12197,11990,16089,12159,23935,19926,15910,19938,20026,16278,27908,12242,28087,32050,12338,27980,16020,7989,19949,3988,12007,12056,20016,19883,8075,15981,15995,19743,15860,16230,20095,32287,15921,23928,27970,7988,12060,15906,20096,11847,27697,15990,23804,11829,36072,24056,35815,16003,23790,11832,16074,11904,23792,11894,24178,24020,23848,0,15974,7988,32122,24100,23863,11932,15777,20230,27953,20072,23909,32045,40537,43947,15805,24214,44181,15683,16057,15991,24193,3880,3934,23611,43864,12019,11950,16157,23944,31800,20045,23663,24123,20134,16164,19834,19983,20023,40400,7946,23924,11891,24244,12005,19919,4011,15818,27955,32195,8075,15846,24118,31795,3833,23911,11957,7800,16184,19896,15889,11948,15969,40080,4023,7779,7906,23844,32212,15978,20071,15855,31866,7781,16013,20102,20036,19853,20137,24220,0,12101,36012,20081,28045,32111,24003,16007,12083,8084,20010,20239,4140,3910,32019,16033,24176,23930,20188,24139,24012,24052,11933,20013,24096,8058,12150,20052,7930,31779,12073,12074,20070,16094,32291,7877,23886,23990,11887,16056,16043,8014,27980,27861,12105,8034,28045,16009,12131,12162,23802,11881,7967,11990,23863,11915,19927,20155,16139,20174,23949,8115,15991,15840,31896,12044,15826,20183,24199,0,16238,20024,27925,32213,15776,7948,24018,32148,24025,15976,7975,20194,19774,0,32089,16072,24073,7981,19922,35996,28284,16028,11833,7892,11971,7865,32163,27955,4110,35841,12146,8084,8082,15940,24258,12081,20037,23859,7946,20190,20134,11820,11989,19703,19916,31987,15752,15964,15830,8019,28108,8118,27938,16103,27754,19872,23888,24092,19955,28062,7948,19821,19995,4009,16121,24236,11975,28040,16120,16105,16032,40326,3968,12029,27625,24022,4029,12217,15697,24244,4032,19871,19850,12048,20099,11852,11876,23689,23916,16048,8062,19815,11962,24173,39675,19808,23994,3841,15909,24024,16078,3959,4020,15812,12150,23807,19977,20015,27858,8095,7954,16073,16009,15797,19835,28265,31697,7912,27890,7959,20037,36175,27872,24179,31836,8149,12013,27984,20151,44134,11907,12090,19937,12099,20254,15987,15748,19905,20140,8095,20135,3953,23924,27855,28100,20035,20019,28045,15985,35615,19868,16150,7892,19971,12092,16053,23972,12046,32048,16039,11989,16171,8045,15865,24068,20039,19848,20059,19946,7955,16112,23970,24335,11888,7843,20111,16084,36196,7936,40252,11912,15994,8051,24649,20012,31850,23946,8218,16028,15992,7882,16323,27953,39997,20040,11964,8080,16011,7899,23901,16129,19733,28177,35978,4053,7958,20156,48454,12047,20018,12045,11966,16072,12050,24097,23943,28326,28263,23845,11971,16118,24186,27732,20074,23792,15889,20062,39907,19806,31708,8106,12019,12003,27978,20022,19925,12036,19821,19989,11969,16102,8187,28036,35750,31802,19921,23903,23967,20017,27806,0,35847,24024,39784,27996,11970,32155,27949,39858,23741,27942,12115,15784,16046,16222,19910,16080,3968,31987,24061,20278,19816,32139,8041,7942,23728,24055,19982,7981,11850,19944,19983,20194,23950,12059,39998,12005,24119,16071,24112,8113,19999,32048,31874,23938,19841,35796,20002,28057,12231,24168,31671,12095,23789,7965,23718,27913,3996,31903,24008,7983,7960,36030,20191,15954,19951,24040,8010,27961,15982,20085,28220,16171,35776,24113,16017,32098,20065,11994,11927,35861,16025,11762,20049,31898,20056,4015,8064,19941,16024,8020,24016,0,44025,11759,39718,8146,24009,15808,19823,31922,11986,20146,11865,19758,11966,12172,20191,19969,11921,15939,16034,15974,16021,15996,20041,19809,12112,27981,28052,27876,8136,24020,11978,20026,24040,23921,19814,19971,15976,27714,12027,27835,19961,20103,23860,32117,35835,11817,19773,8007,11782,20004,20093,28181,19925,20170,32228,35982,24091,24127,11915,3961,16024,4054,31783,23807,32221,16104,24150,3977,40239,19944,32311,16033,7855,32327,12069,12158,20154,20029,20100,11744,39782,16041,15876,12013,4038,15765,8109,15871,12198,20031,19901,35979,19944,19980,27899,27753,24214,23925,12020,28333,19873,44117,7934,27885,44124,8118,24341,12077,8066,28284,7943,12031,16080,16261,7984,39786,28114,8186,11829,11961,4101,19916,15897,23918,8149,28094,3899,24256,20041,11914,27934,16050,11955,16031,15953,27982,15780,27970,23756,23941,15943,36047,19847,27818,8090,3910,3935,35797,0,36097,23845,3984,7878,20212,20047,15839,28039,19909,43732,11934,15901,4014,12172,19922,12164,20139,20082,20213,12072,12076,19854,11966,19897,15964,15966,27901,11993,31874,40171,11851,20135,23907,11901,28041,19990,12157,32001,7968,19995,7949,7932,15871,20085,28064,27957,19893,3966,3899,12104,28041,35910,20247,24281,16074,12042,12007,27916,0,20054,15991,44001,12014,16034,15930,39929,15998,32076,19871,20160,43904,20028,31896,4011,23824,19669,15983,16141,15991,35814,15810,27943,36148,28018,12161,3908,24036,15970,15774,19904,12018,7999,35891,16199,20139,20163,11938,15770,12181,39953,51802,19676,12007,36365,15948,19927,11961,19757,12060,11950,35743,36127,32091,11947,16091,16046,7957,15908,11940,23711,16214,35842,11947,4004,31915,0,28409,11849,23753,7869,35911,36000,7923,27850,35860,19979,24052,24127,31875,24271,4114,28128,16007,23920,16002,39633,28053,31997,4002,12122,20031,24190,12035,27811,12008,16021,24341,15736,35578,20197,16030,7941,15821,12108,20154,28103,23930,28092,11800,24190,16068,19865,27814,20028,36070,19735,31943,15944,23982,36076,32010,11955,16284,16034,8036,23860,20144,28154,23834,28201,36373,7994,24066,27812,20001,15989,11961,24058,11989,15903,16023,32056,19959,7950,24044,15731,23766,20062,15987,15930,36175,28272,20096,15972,24158,19891,20234,8085,16099,27963,31916,12112,12113,16279,16053,35825,11983,27712,19958,19967,11825,32042,15869,16196,16034,15986,24023,28119,19996,24272,39662,32040,7754,16141,35679,31859,19928,27943,31842,43873,12112,28136,11992,15955,20014,12084,20091,19901,23804,32131,8008,23709,40011,3972,19725,19841,3959,20032,24208,15861,19975,16105,24272,12080,23889,16005,16040,12212,15915,7943,23956,24047,19934,11985,23840,19895,44133,15919,7899,15875,12043,19965,16062,20257,15730,20085,27786,23812,16109,15886,24146,20009,11894,12039,27967,27990,36077,23726,11887,11998,11959,7973,28119,7992,19837,31631,12072,20213,7871,32364,23806,15941,35804,8011,28002,32026,11960,27886,15966,28088,16010,28127,23984,24150,15788,20047,40189,20099,43954,27952,28238,7975,24018,32291,39853,28270,19901,23728,19787,16080,24084,23908,4049,15956,12052,31824,20072,16136,12097,24160,11948,15975,36247,24040,15851,7941,8033,20141,28075,12071,19809,16145,15897,19973,7974,27804,23827,19848,27992,4073,19964,15856,16042,19913,11841,20046,16074,19981,24343,11996,15924,15862,28003,19960,24034,20044,32314,28010,16301,15817,16030,16079,23971,24068,24139,19901,7892,35840,16051,15867,16018,28309,31825,24192,28252,12032,23883,19941,7967,16140,16100,28101,27890,28005,16091,23933,16009,20211,28223,11826,24098,15990,15965,12256,20185,27738,19968,19835,27989,12063,11978,27834,39739,4113,15854,20090,19773,23952,11945,12048,15936,15941,19946,19816,36144,11733,24081,11975,27962,11990,20300,15752,32056,15844,20101,15918,23941,8009,23637,31929,15872,12106,40131,7919,24241,15953,40001,36074,19942,27914,7962,15904,4058,4087,24189,7996,23903,11960,23904,8076,23786,16299,7974,12113,27950,24080,28360,19816,36121,23892,28001,7923,32377,15810,15930,32149,16109,19976,15803,16089,24214,28155,28238,24089,31694,16136,23799,28218,19986,15911,40331,15945,16074,28114,15875,24136,20108,8008,7941,27986,24004,27933,20078,20060,24142,16079,16077,20070,16158,23864,15999,16031,16018,11905,20126,12056,16006,23805,24102,28045,15825,12152,32400,20143,40107,15847,27814,28108,32297,28000,15901,32075,19803,20209,16139,23874,23942,40367,27931,19816,20004,28058,24061,12161,15904,27803,12103,12017,16107,7928,16021,16105,8069,7999,15833,15989,36157,19850,20142,20006,16026,15981,20107,20045,23696,27875,11731,15905,16101,11897,19956,11905,36581,24082,8053,28109,15856,32116,27972,11978,19850,28534,27918,27794,7901,28099,19897,16073,8055,24185,7998,39939,31993,32108,12048,24044,8004,24239,19875,20118,7943,15949,12013,12062,7871,19869,19989,15934,24063,19891,20117,20031,15995,20055,32092,12085,15770,36009,19960,0,11867,28047,16043,12099,35709,8088,24099,8063,4023,24106,15814,15937,16071,8148,12260,23860,19811,24033,8100,12015,12100,16008,31792,16152,4072,11966,11972,15861,12056,27807,15889,28019,27907,24118,11958,3962,43879,11820,28366,12124,11914,7874,23963,16229,27876,27872,16032,12106,20182,11781,8039,23846,15926,7849,19753,15995,23938,24096,31872,7964,15775,24216,23898,36045,16202,16082,8062,24097,11753,24038,20241,24123,16102,7992,24174,16066,15899,23544,32025,16135,20119,20069,7926,3925,24169,27991,15829,24027,16101,3925,27987,16042,12019,31792,11987,15931,11919,11983,11895,12125,11996,23767,16176,3938,19865,11902,24193,19969,15816,27985,24247,4101,28022,24050,32437,27820,28106,24053,16068,12032,12065,4013,20040,51937,4075,19772,19880,15943,16147,16086,20083,11932,12016,24056,20000,19979,8066,23928,4033,31940,16079,19851,12012,11827,20118,16062,23953,27550,16006,20043,39922,11965,20042,4029,32156,20153,27913,20062,12079,19898,20077,19936,20022,27876,20117,20125,23952,12204,15838,12067,20136,23751,16079,27811,20048,7887,12248,23901,15962,24086,4068,15923,11787,15928,24001,27894,27904,16001,4020,11838,28094,15915,24283,12048,20179,32256,15934,40289,19982,15876,11974,16013,27923,8042,27970,20164,28069,23952,11829,24167,20052,24146,19927,15917,24036,28316,12336,32093,32098,4051,20109,24319,23965,20001,4003,24132,15946,23891,8000,20287,28255,31939,16027,23792,11962,20123,28041,7984,44462,15960,15815,31962,12183,24020,27982,27834,23734,28047,15888,11936,24161,16084,24023,11920,23829,15881,24351,3899,23861,19797,27962,11821,12016,16165,40096,20041,28085,7981,8035,23981,20027,24105,15934,15944,23783,8115,27997,24168,28221,12121,3992,20032,12005,32216,16050,28276,19909,48527,20035,11832,4135,32236,16033,19996,12089,24013,20185,12029,24119,24174,24011,15915,8050,27817,15945,19876,11926,36379,20097,16019,24077,8048,31801,32308,31802,16274,11984,23929,15926,4001,7960,19813,8121,16147,31700,16322,12008,28048,27620,15885,20100,16076,12071,32293,32134,20036,20023,11962,11969,16226,44096,20052,16150,20065,15956,16019,28010,4011,19893,8001,7937,32070,31807,24118,15985,16062,7989,16066,31878,23915,12198,15996,11897,15925,12153,12080,32069,28034,20102,24083,19895,24003,15948,12050,28337,19803,11945,27986,12016,7958,20100,12127,15947,31687,16117,19909,28005,12035,23871,36151,28090,8094,27967,16092,4023,0,15663,15968,24205,16094,7841,19896,28076,24041,20169,8100,16236,8135,20251,7933,16059,15959,16040,23992,35643,8080,16021,15978,3945,19860,16039,28117,3926,20084,11938,16183,8120,15892,12043,12039,12054,20195,15638,39931,40147,15892,12113,27905,19955,27782,24189,16194,19841,40025,23924,20068,24119,19920,24150,24055,28066,27979,27769,19919,15978,16064,19959,24043,11893]},{"counters":[12035,19847,19782,11889,27963,19920,24111,23871,23819,16057,27822,15953,39868,12014,15956,24006,8043,23863,27916,20013,39899,20123,23910,40119,12073,16010,31719,11866,19906,11949,24093,31968,7896,36342,20026,16011,4052,23991,19925,11844,12109,19858,20107,19948,31969,11868,11883,32102,36278,16044,31972,23931,36096,23914,7952,12328,24173,12047,28041,12082,16112,12129,24048,28174,28153,31951,12006,27903,19997,23899,24029,28258,31836,11884,24106,19963,19908,15860,16170,15815,8001,19875,20019,40104,12010,19964,12086,7927,3893,20176,28032,12068,27813,40107,12168,36003,36012,20043,19761,27734,19991,27829,24078,12108,23677,11824,11911,36042,23788,24056,24002,12159,11902,24073,31951,24069,27907,24022,12014,23893,51650,23886,12131,23957,20209,24056,11846,27927,7918,20235,12145,32153,15952,11851,20131,20103,36119,36051,16048,15838,19979,28064,11889,24062,19854,16059,12017,4002,7883,16076,23871,16115,8006,15876,24138,40051,20024,19903,15990,32093,12137,7899,19886,7917,20223,3990,16066,12148,15976,20120,40025,12029,15946,23966,15687,19940,20110,20175,12095,15949,3921,11860,16093,8114,20061,23968,32259,31629,11731,23938,15927,19724,27882,32140,11908,27921,4008,16027,8041,12235,16053,31953,11956,19743,24118,27884,16065,8099,12091,15957,43896,11821,19888,15678,32130,40081,16006,24203,28034,12055,15896,15914,28493,15988,31926,12026,19664,20057,15754,36360,20091,7933,20052,43720,15826,11918,16105,16123,24122,20141,15987,19887,24158,28146,20067,27870,15978,12015,27913,24026,7974,12046,39731,24058,51608,12012,15915,15963,16173,36107,28085,24001,3884,27858,12144,19890,12231,16199,12130,28262,11894,15798,8086,7921,7841,19948,31890,27917,24242,19883,15839,23783,8098,27785,12073,23940,4080,8064,23917,20177,19915,16073,11871,27978,23946,7945,12131,16023,11984,23836,4082,28021,12025,24134,28215,19909,12002,20130,12143,8133,7910,11912,20029,15841,15894,20015,16181,8005,24252,28262,23875,11818,24326,8181,8055,19768,7882,20070,24063,11907,19971,20032,19716,39961,19873,31851,15863,19838,31765,31899,24025,16051,20124,19866,24145,20063,3954,24043,20129,19787,19907,28154,12070,32086,20043,24145,8136,32233,16036,36215,11926,11868,8125,23973,8082,8042,16130,23932,19870,24168,16241,27952,28055,23897,12030,15957,0,19950,23864,24031,15944,27782,20074,19920,8030,11940,19798,27962,16112,16181,11925,32415,31965,8072,8014,7973,3901,11934,23979,11926,23897,19709,11988,15877,8069,15962,24180,19893,20020,28126,20130,24056,20103,12073,15813,7915,19834,28039,19936,24063,16019,11982,24103,27917,23992,27916,44295,19916,36113,23965,0,28145,20124,7986,7980,7971,20059,28260,23890,11953,27768,12154,24087,27918,7974,4109,28132,31784,15900,4035,24026,39998,23888,16018,11936,23976,24039,23962,24052,15870,31774,19989,24070,44032,31996,11994,16043,31606,16071,12033,16015,32386,7794,19901,16122,15855,19808,28174,0,7786,20127,15964,19934,19962,44634,4041,7893,23921,4116,36111,23924,7938,23997,19986,31702,16084,7992,23855,7817,35717,20182,12044,15967,15962,32160,20004,19947,32053,15959,12078,27542,11952,8060,20266,16052,20022,24383,16110,11888,15995,16070,35957,20257,11918,15954,12147,28114,27552,16084,24058,11961,20053,43833,12207,7956,19956,32036,11947,16233,12257,12153,19984,15892,28096,24120,20131,8053,16137,15959,28063,23999,16083,19995,12094,20206,12101,15991,23861,7890,16079,7866,27962,3976,12014,16176,27669,11951,24239,16087,31909,0,11902,8161,31832,24147,8022,11707,24102,12211,15851,20101,11982,40015,16059,3995,31963,12137,19918,20167,39953,15958,12033,11922,8027,11925,8002,11978,12087,16133,23678,23921,31746,15818,19892,24163,16102,23886,15951,27980,24190,11904,24136,15981,15889,3962,16078,19974,3976,12116,16163,12112,16007,20194,15854,11902,23997,11989,24142,0,7882,16087,7974,24211,15853,15779,8093,27908,16112,31959,20061,7835,0,7941,20202,32144,11852,19935,12073,19781,19811,35989,7996,16075,11969,19973,16001,16009,7971,12034,16110,11969,35900,28008,7919,16195,24010,28070,12071,12022,27967,28274,15976,11996,23992,24047,15995,36263,8071,32215,43944,19721,11871,12019,16192,19885,19961,24104,19924,24051,7942,23876,16107,8082,15963,32164,20149,12033,20113,12201,15946,28269,11921,27948,16203,23639,7890,20001,11896,19699,19917,20051,15928,28098,27789,11834,27625,8109,23972,8058,12022,7966,32089,23895,44059,16149,20105,39888,27988,15961,27969,20001,11940,7860,15976,7976,15972,15929,24100,11857,32043,12095,15868,31892,8095,24098,7858,19995,28374,28116,7937,15698,31533,35853,20119,12060,15856,19868,11787,11895,12141,12117,15865,31973,23818,19850,23984,15902,24022,20010,27997,8146,20063,12108,15956,19994,16040,32010,19974,31997,28161,12093,12173,24184,16147,8155,36342,32012,11794,11984,20055,23926,44005,24205,32185,23800,15932,15934,39988,19808,27898,28020,11949,32062,19921,20013,7923,16121,19830,27993,4039,15885,15509,35763,3877,20287,8143,23767,19798,8045,12141,28179,4036,11838,11816,36015,11842,20072,27787,12085,4011,15918,11874,16038,24275,15677,12163,12274,16097,15928,11940,23884,20092,0,40151,20198,19705,28116,20025,27943,4035,15858,15939,19961,23925,24152,24083,11794,15996,16007,7960,11817,15896,7910,23959,15802,16108,24011,20027,11931,24116,27985,24068,8085,23959,24328,35830,36064,40051,16060,16049,35876,16119,16153,15794,16191,16073,19866,32204,11972,12046,23938,20134,12192,16000,4022,27880,31890,12041,15981,15934,24244,15809,32235,24027,16160,28058,8027,8056,20168,15827,23885,16052,40215,23898,23981,16137,24041,19859,16173,12119,0,24122,8011,20001,20083,16037,19994,16114,15828,23903,40185,23702,19896,20031,24035,11996,23816,11989,16069,3911,27890,24199,35828,28280,7994,20237,11993,12012,23805,24124,15957,16149,20192,28127,11924,28033,20329,16078,28060,19901,11860,7994,27919,16186,27850,36013,11819,27902,3919,24122,32197,15939,19923,15788,20152,32401,7939,7911,19904,16125,24100,27919,24037,11904,8205,27818,20208,3963,16047,20015,28312,16085,7987,8191,7916,8096,28029,15954,7964,43971,31796,16046,16166,16103,20049,19978,12021,23928,16120,15937,4038,40055,16038,24044,19949,23982,24170,35927,19958,12017,20267,19924,7966,28065,24015,24022,11849,28162,7894,12219,31818,16005,16001,28085,12085,3929,16173,16165,19954,32345,28210,12086,11885,12136,16101,35903,20007,24011,16100,23940,20036,24099,8055,11966,11867,48094,24129,12139,16062,0,24064,4102,28345,11935,12063,16018,15972,56184,19795,31913,11979,8054,24086,8045,24044,16094,23947,19692,16068,28103,28100,63392,12206,8004,15864,20013,11990,27855,20074,16119,24127,32183,35956,23945,23934,35818,28077,15802,28024,12015,19969,24228,20134,28134,24049,19992,7954,11999,15947,11989,20145,7815,27838,8118,15975,8140,11918,24161,4054,12183,27834,35871,12009,32231,19987,16117,8060,12095,15806,23933,4033,15931,7995,27914,24164,35976,7981,11961,35553,20162,20190,7854,20084,0,15951,3981,28108,15869,4042,23879,28261,12014,27849,27803,20042,32114,28055,19916,15994,23688,23946,16020,28078,36237,24370,20088,31869,28093,19642,24079,4017,20081,15991,11940,35935,19916,16257,31895,15844,20244,27958,7892,16036,16010,12123,23914,20161,15898,15931,15972,15907,12158,15940,20004,11943,23960,16223,23900,36490,23933,28290,16039,19957,23894,15921,7922,20217,16076,8070,3971,20314,16009,11897,31985,20008,28091,23834,16115,19803,19906,19996,23830,28106,24195,11758,11833,15989,20037,20208,19888,28106,16008,20226,43907,28199,4041,15933,40145,27851,43762,27848,20144,27940,16160,28093,11893,27882,24168,27896,19855,28037,16294,36076,15973,47675,20055,20498,23971,7988,0,19948,8151,27918,28145,12100,19844,16160,23886,27875,16140,7990,24035,7913,12107,27989,19885,16054,4031,20065,15909,15866,20072,15917,23733,23918,19925,15943,36305,7934,19570,19875,16094,24002,20190,11923,19943,20158,24015,19990,28068,36309,8034,8013,15984,27912,19994,15969,31578,12065,23895,11933,11844,12001,35943,32074,16143,23958,20128,11965,12072,16093,47846,27989,15996,8011,36090,11950,20007,20100,16016,15992,28152,16214,16026,20149,3904,12079,31809,16133,24087,24186,32328,20077,23836,40361,3957,20139,24189,7952,36107,15888,28032,8040,19748,11979,11982,31905,16081,24081,20060,35833,3995,19981,23792,20214,19806,20049,12041,12024,23897,28200,23800,15949,16016,11788,16028,27900,23740,8022,12187,15842,8152,24169,24012,23936,19872,16049,12109,16178,27913,12044,15974,27928,15942,27978,15956,36097,35947,39997,7946,23826,24040,28162,28061,16029,0,23947,12023,16054,12005,23846,36032,24037,12085,15881,20138,11866,7813,15883,23956,28010,24058,20274,11901,12074,11991,19997,12081,16025,0,7991,12091,16042,20012,8069,40354,19847,27995,36146,15932,12011,7909,20095,24325,11881,36191,27904,12284,11939,11873,28140,11887,28076,15747,48058,11788,28024,23663,23977,16087,8110,19854,20034,28243,19914,32054,23900,24202,15856,28038,3920,20057,16084,16125,28005,31981,11829,15903,15835,20413,24223,19901,23791,3979,11946,8049,20205,12098,8016,11819,11972,11908,20209,4053,3986,24077,28166,11891,20257,15990,11916,24158,7987,20055,11849,12206,28140,15819,19955,20183,8019,27951,31907,11913,27960,12062,19931,19978,24401,24082,12179,23679,28063,16189,8123,35960,20075,11933,12171,15925,16150,19821,15996,40109,20295,19853,23789,11818,8012,7985,12106,16161,23884,15895,7891,24012,23955,16042,28154,12120,20231,39836,20037,16102,19994,20138,15838,36025,15852,8066,40150,28193,16228,39858,23790,32023,35901,16165,40025,12012,28013,27919,19746,32238,16087,31932,16092,39957,7943,7864,20203,20279,8026,19938,27751,15937,24039,15855,36089,23935,23878,15886,4123,15853,20121,19890,31933,24073,8121,15986,11974,23914,32201,31551,11764,7852,12007,23975,27980,31962,11972,47802,19972,3982,4016,12146,16044,15954,24104,20075,12026,3939,19846,23669,23961,20102,24018,8031,32138,39912,23966,24050,15926,20167,20075,24126,19846,12186,31966,7966,20109,16177,15901,24231,20053,27963,4001,16066,16054,11972,28201,19970,11989,15719,20198,15978,32156,19845,16027,7952,11875,24003,19861,28006,11933,35988,24203,15900,11815,35813,28408,16049,12028,15930,28027,32011,16001,4007,24083,24225,31745,11897,16007,24016,11825,24223,11889,19943,24246,27851,12000,19986,8039,16168,24238,7990,11925,15830,16095,19985,7961,15784,32031,12004,20095,20275,19977,36099,23877,31891,12109,19848,27672,20075,36114,11910,12117,8022,12044,8047,35650,8059,7995,16138,28265,39892,19888,28063,36229,12145,8019,11940,16135,16080,15981,36150,8016,36073,28015,27893,44004,12119,31962,16143,12141,27932,11925,19870,24239,15872,27912,11821,28006,11901,0,28062,24077,12072,24075,11982,20182,35822,15819,20017,19704,40142,20036,16066,24124,8042,19796,16212,16172,16050,28218,20131,7946,12032,27709,28070,8044,16059,15995,23772,8238,24051,16170,11879,23873,27924,19905,12170,11923,16187,11776,15724,11903,8115,19812,16037,11937,7992,15868,20164,19938,15853,12058,19858,16025,24115,3916,28048,23943,23787,24178,19825,12078,20073,7840,32111,16003,11958,15921,27730,15813,27802,24095,23860,7926,32315,11981,12185,28054,4070,15850,20007,23822,27853,12139,27873,12107,28110,28344,19899,8001,12062,12074,4025,12148,15769,24108,19829,24074,20000,19916,16064,23818,7879,19846,35968,16000,27986,28272,27952,15976,7991,15946,8044,20046,23974,15882,31859,11891,23988,8034,15999,23774,27823,28088,20207,35927,12005,15789,24048,28019,31903,23961,20158,28083,23719,19914,15964,16085,7869,20002,19921,15924,27881,35646,27870,20063,19970,28123,39881,28170,15958,8060,24111,16200,11973,36108,27959,19738,8030,23915,15953,32220,3958,15991,39837,19942,12087,31932,23708,15834,19930,15918,24050,12072,11985,15877,8029,15983,23944,20065,15929,39870,23788,23909,20087,19849,8049,19796,8034,12081,8062,4107,32169,8268,15884,15926,19895,20142,31997,16223,27864,19918,16065,15849,24112,20203,24040,28127,31838,23842,16114,19994,11833,15952,15897,24119,36298,27992,43894,24137,19843,12359,11917,0,19861,3972,11973,7850,28303,40280,23970,11927,15815,24072,12019,12267,8029,16024,24117,24004,20134,15849,11826,20063,7883,24011,12068,15912,19980,20108,20063,23908,3957,8067,32023,15882,24088,27845,23919,16038,16163,11971,19837,8028,23872,7967,44258,15944,27958,28103,3929,32075,11892,24407,27833,35716,36100,20114,15821,27809,15991,0,11912,24175,19942,16037,15932,27839,24141,59999,24212,16052,12030]},{"counters":[12047,24410,35996,16068,19759,11952,15952,19946,12151,31893,15891,19857,19816,24094,27869,24076,8001,19940,8099,11912,16035,20047,12092,32160,19824,7962,32067,19876,31945,11988,24056,12071,20180,31966,19875,11921,20026,11920,19760,15996,12020,20019,24322,44074,27919,12030,23849,32116,16195,15986,11978,23996,20098,3907,23662,20073,20032,27933,27968,19891,32002,51852,19646,16272,15952,8022,4080,19923,15999,31809,15837,23962,23952,12065,19843,4034,16064,11972,11915,20039,24165,43796,24142,27877,24074,19902,8095,11892,32358,20089,3851,7939,19966,19987,23889,11836,15941,19951,16023,15958,11878,24259,44070,8037,11912,40041,11994,24034,27962,23876,16111,19928,19965,12115,27746,11986,28370,24000,16045,23894,15983,16358,23803,11923,24238,19656,11828,16132,12009,11961,12000,20207,4077,31995,51758,12014,20145,15956,16006,16090,27856,16056,15991,23800,28070,24227,32039,8070,15858,12101,27930,16218,20072,19992,19999,15794,27844,40613,11861,32244,16009,23827,20113,28073,11882,19975,15958,12052,24199,23916,16070,11985,20064,16015,24021,16158,12082,36114,19893,16017,16056,35740,11937,11957,3924,20048,23815,16117,7965,15844,11954,11848,27642,23773,19909,23793,20142,20057,16045,16157,4004,31774,28105,32294,16123,28008,16030,12134,11996,19798,15849,40009,20176,16176,8207,24029,16020,27936,24088,11995,20209,24026,32276,19964,20148,31989,40411,24085,15856,19975,31977,7990,7863,24111,12057,31851,27626,27996,36196,12013,28009,15929,15910,19915,11938,20132,28143,11862,20145,7846,11962,43924,16232,35819,4034,19836,7991,11818,19769,15884,28150,27974,23893,27936,32349,28102,16000,23996,8029,8050,24015,20084,19868,23922,19790,27824,12073,8004,27686,20286,15846,32007,20007,15962,32150,16049,7944,3995,20129,32028,16027,8076,15973,20160,23927,24057,23963,28012,56299,24103,24139,7887,15974,16085,20106,11744,31846,12103,24185,23955,23984,28014,44231,19966,7988,16255,28342,19919,24063,27676,40091,19981,24051,35846,12398,7943,16321,16045,19901,36199,20190,7905,20208,15969,32069,12131,19885,12075,8038,12010,44148,28122,16106,15874,23846,20022,28105,16210,3947,23710,12039,11998,24144,20059,52338,4077,19914,39813,28283,12085,19824,35835,20040,23962,32089,20109,16101,19940,12003,28155,16143,23767,20107,20122,23980,16038,16130,19882,7947,43646,27728,19854,20000,23881,8146,7972,23923,8058,36167,8176,24052,27745,16164,8000,11870,16062,8087,28295,23989,31959,15887,43637,16070,32034,35882,12055,20125,20071,16046,12127,27521,31905,16116,23584,20201,27885,15927,36175,19963,19880,8059,15985,12022,27885,15911,24029,11978,31915,11825,19904,28042,31808,31888,24152,36026,19878,23666,11830,20085,7987,27996,19916,24207,11830,3872,12080,11711,27989,28093,12076,27870,12026,12016,20014,28214,27870,28195,20153,20098,16160,16025,15964,31906,24311,7996,40013,44119,11987,23996,19929,15890,23779,28077,19814,12178,19870,8065,15938,16045,12053,19872,12127,15898,15970,20056,15855,7983,32285,20090,27986,15907,7889,15832,20311,36263,0,23813,20166,19940,31950,8138,23901,3990,20053,8120,20065,24049,15934,23956,19993,40090,4005,28144,11946,8078,12085,11901,24169,27859,15797,8003,4014,27879,3897,23992,15714,32010,20320,11994,12087,27913,19794,11930,12080,8068,39832,4081,20140,19866,3986,24057,12057,19859,23978,11935,35858,15988,16068,19910,19686,20231,19875,23844,31956,19965,40108,11896,15863,11956,19911,23871,7963,16048,16075,27854,4077,39584,35751,3911,11877,15985,7804,19892,20102,7900,24163,16137,20152,23988,11963,7987,12103,19728,16093,4008,11883,20091,35713,7900,7911,24032,24294,32049,3945,11934,23861,12185,23906,19901,28025,19771,19877,32049,8102,24288,35991,23881,15873,4042,15931,0,39864,20026,16104,11944,11910,24138,24263,32175,20069,16163,19897,31702,24048,4032,19792,24203,23848,24051,20066,16023,35923,12082,24045,23931,28379,27908,16028,23984,16037,24119,28070,19938,16272,23881,27833,31893,16054,19845,28249,11990,23649,20224,19855,20064,28053,11856,19873,15938,11889,24041,16066,3959,16092,11860,12203,4042,24215,15720,20054,16080,31820,11929,12008,24047,15877,32330,7857,19984,23813,16078,16132,23881,20179,36058,7843,11745,15979,3950,16226,11971,23985,11820,7993,28186,19963,20022,19640,19981,20075,16021,28119,15921,8135,27881,28165,8000,23834,16109,16164,7872,3941,19945,24274,11954,20088,20047,11959,44305,3959,19844,31879,23798,23884,15859,12135,35864,23972,31903,19945,0,7955,12150,16077,16019,12140,19819,12008,8138,15924,15943,19998,20050,20192,16023,19995,31986,27940,16040,12092,23687,36149,20014,8046,7992,19773,39842,27932,20071,27927,11878,15842,8031,19975,31914,11976,27833,19765,15941,11942,28172,24053,11807,8083,12023,28057,27844,11833,8008,8017,11828,19899,19911,27962,23916,15968,0,28367,19778,27842,4039,20092,56147,16041,8024,11969,23924,8082,28277,28091,24212,16013,7858,16193,16023,15919,36335,24072,3922,11949,19969,28178,20052,23886,19927,27824,15987,23891,20180,11799,32140,12009,8032,3913,19875,19896,3989,27993,11969,31934,28104,4115,24038,24276,15981,11970,12033,8062,28145,43916,23911,20153,20173,23895,20256,11926,11951,12051,27860,36060,12107,19728,28204,27988,12187,8028,32202,12086,3971,15931,0,11921,15820,23941,24028,15925,23971,20002,0,24069,20093,20040,12131,28070,40247,27702,11987,11881,19998,15690,20182,20017,32188,27727,31862,7965,16217,27879,11833,19915,20004,16127,16167,12238,24213,11882,15771,11933,24136,31986,24080,16108,20104,16013,8019,12009,8164,28132,23981,16094,32134,23901,3912,19832,19822,12091,15847,20155,28012,35704,11987,20050,12202,24120,28483,4012,32048,20180,28051,19940,15953,16045,8022,16044,8002,39715,23938,12014,20024,27597,27981,7992,44144,23997,12084,12117,11961,11858,3847,27847,16116,20147,20169,16005,20132,19936,31923,19940,15921,28048,20083,12020,20134,11975,15651,24036,3983,52301,31977,24019,11903,8069,11909,32212,11990,4084,16108,19832,23926,32259,15848,20165,44245,11970,16030,16049,16142,35988,16034,16074,15887,12014,27926,27877,4047,23986,15994,19850,24046,12083,16199,11900,19894,8151,43974,11989,19935,24059,24052,24173,11868,12036,12000,27906,28372,7962,27979,20036,31922,23942,19980,19970,11789,28195,35871,20009,19981,11975,28363,8149,24336,24027,24315,20028,28119,23834,12018,19796,7944,15902,12066,19992,24252,24096,15995,15881,23864,19939,27974,12047,27970,12251,3964,24233,19825,20157,15962,7966,24052,15823,39855,19954,16063,11975,40229,24268,36147,15973,12017,19778,28094,24145,19983,12020,28143,27897,19739,16159,23861,23902,19987,12017,16297,15701,20029,7939,15933,28126,35960,12155,24085,11951,11999,3983,36013,20029,35977,7927,24164,12038,12090,31862,12033,24181,23937,28042,4029,28039,11956,15768,19951,16089,19898,27892,11973,23628,19958,28116,32232,19809,23935,24198,15972,11973,48338,8216,15943,20148,8071,12092,12077,31735,36089,4087,19949,28019,20002,11940,12167,16084,27770,11911,40407,12243,15964,36013,48074,11947,28050,15995,23927,24110,3949,12093,31921,24036,15843,24090,20126,15796,16063,51705,16228,31927,19822,32013,35692,24126,7934,7948,20068,7947,12019,7955,23979,7888,20016,28093,23764,16272,11963,15757,12165,7861,16003,44062,20130,11889,20018,16236,28077,19979,16195,12000,16044,32076,20013,31904,7871,19941,15977,11866,19838,23913,16181,36057,24242,20154,39935,12073,24034,24097,24054,11867,19964,15894,12276,31756,16084,20030,39929,31982,35733,16122,0,11937,20200,23850,28033,16123,12009,7984,20158,8072,35741,32093,16041,19969,11987,24184,4011,19858,12046,15950,24139,12175,11902,15909,23965,4090,12007,23990,20182,8000,0,40199,8132,12059,16045,28147,23923,15906,4086,20215,36417,0,16398,11976,20042,28121,24005,11957,20013,40117,23900,12023,15991,15989,12071,23927,11792,44138,11923,3935,15919,11991,19971,3907,12017,35788,27933,24174,16016,16016,16037,23885,7959,12171,16177,23926,7964,16006,15926,19876,31548,20075,23776,8073,12117,20071,11726,12013,28208,4098,24069,15892,27944,11989,19981,31868,27647,11926,7966,24111,19721,11810,31812,32116,12122,28041,4063,28001,11910,19848,36415,15899,19733,15900,11854,20006,23842,16005,12051,15734,12094,31806,48136,15939,12008,31919,27821,36135,23741,12093,27807,31980,8131,24183,19987,19890,16217,15955,12043,24031,24271,19930,27913,15908,27868,15948,7921,8067,19904,16101,7987,3976,15908,16083,12110,19999,32040,28150,12079,7976,16099,12138,27874,20085,4024,15917,23921,16093,15975,15934,28373,15899,16183,23971,12014,23893,15876,11977,15980,15914,28075,35945,11819,16077,3969,11826,32029,20065,20044,23933,20225,24147,12184,7873,15811,11954,23790,28113,19802,19999,28038,4053,11982,19896,11750,39859,23861,31901,19943,27806,12123,12055,35342,12148,12056,8063,19944,15953,12063,11987,28057,16240,12100,20107,35756,32222,24034,31778,0,23978,3954,40299,15757,35870,23963,3906,8007,35716,11948,3850,24150,15971,20063,24256,7836,19978,7955,32025,16094,23878,15834,16206,11925,12013,15990,23921,19928,12132,8008,20055,20210,8000,24037,11939,23841,15890,16083,11964,7841,24038,7925,28025,11932,27902,12173,12168,11863,8071,19948,39913,23873,7937,27964,28054,15825,20082,35891,12122,19904,7794,32108,32088,12169,16039,15973,12021,16067,12056,16101,32276,35774,44069,11888,4063,23756,20180,19959,32093,8008,15713,16063,32035,31896,11982,28035,16511,27992,28283,20039,8021,19845,12003,19829,40432,11919,8112,28055,24051,20297,4160,11887,24144,7962,36229,20103,32361,36005,15978,23828,23967,31831,19699,24033,8105,28073,7874,27876,28261,24067,16252,8085,20010,24048,19555,36246,15994,23750,24005,19846,4113,8056,16098,19941,27996,7950,24272,16016,16009,8024,36147,23972,19781,11934,20072,11984,3986,7974,43963,24033,32173,12010,11918,28099,35757,23898,12094,19942,3969,15955,4025,11886,31788,19823,19922,16166,24022,11986,27718,12119,27996,24228,20251,20034,15852,24047,11974,23701,11994,31999,16189,24133,16113,27912,7935,28147,15965,27894,31863,31943,36404,27880,15981,23938,23999,12269,0,31611,39999,7907,7964,3974,4091,31733,15847,15863,20061,11848,8012,19981,12056,15974,4039,28029,19881,27910,19981,0,16123,15907,24056,36152,15923,19850,7983,20007,7911,11980,27962,19709,32240,4026,16023,32354,24161,8057,8002,20109,4024,15881,11936,7940,19888,15985,16002,24101,19928,44180,32389,19870,11949,19950,32079,39931,24037,36320,15813,11934,39809,11999,19921,16046,7947,15985,44058,15908,23954,24152,32054,19968,16141,16021,28004,16109,20075,19946,20246,27734,36263,20205,19963,24020,27576,7931,24188,11992,19856,24146,32066,24288,7965,23949,15740,31800,28035,15795,3943,23973,15962,36100,47673,19852,32133,8095,15994,23742,31889,23902,23905,16024,20227,31846,12002,35867,20157,0,20052,3930,27680,31916,12054,16079,19873,23842,7924,16246,16147,32279,20087,23940,16163,16019,20348,27762,16054,28264,16056,12055,20126,11972,7890,12111,23992,11889,16139,32035,20290,28251,24016,24171,12076,27718,15739,28192,28181,11897,27821,19959,16087,20119,12063,28108,16002,8048,19871,39936,27974,15560,28283,16189,24140,23586,28214,20031,24246,12126,12001,4013,28134,7875,8017,15992,3925,32000,20136,24029,23917,23949,8063,3924,32145,7874,27952,8115,12087,20186,23964,7919,24001,19937,20076,11868,23733,12123,7947,19695,12003,24282,7962,28060,0,12006,19865,15941,16034,7935,19947,11990,24020,7928,32023,16030,8014,0,16071,20232,19750,8079,7956,31803,20115,28010,15897,28021,23882,39839,19970,19863,36171,28152,12020,24030,35749,24068,19878,20120,8064,12010,20089,20043,28356,0,43769,32175,12206,31864,7980,20109,19889,15923,7865,0,16161,12080,20088,24211,19844,20154,11895,27949,19932,19840,12022,32356,19953,24395,19789,16103,39936,12082,12127,28224,8036,20069,12134,3996,27968,19832,8086,11921,7851,8002,23862,12117,31884,7895,24044,7823,16044,7940,15954,4135,28112,11813,27963,27743,36132,16016,8215,28055,16195,32221,0,20062,31726,7916,20008,28024,24126,24009,8029,20110,12056,28056,4067,11907,24186,15934,16199,23939,16030,23946,12032,15940,3983,23894,16054,23849,12050,19841,20037,19983,16081,24016,16147,23701,19897,24160,15925,24096,24251,20022,12008,8009,8018,27939,23887,16031,40128,20154,11961,16049,15889,16113,24083,12055,20383,16100,24211,28115,7989,20164,4128,16088,11976,24250,27916,27842,12226,31809,19951,19764,15984,23929,20047,23919,19934,11941,19864,12141,16061,8101,35666,28365,4004]},{"counters":[11995,24096,12135,11987,11926,28063,23799,24289,8009,16080,28293,19893,7847,11914,28028,19945,15991,24220,7973,28213,32199,8013,16124,20250,19848,11911,15634,20051,23848,43903,20110,19965,11783,27829,11896,16006,24061,16130,8041,20205,19908,28014,20177,11953,19905,28211,23907,8092,27995,11974,23906,19967,15933,28220,7902,11872,11989,12025,19860,3955,11993,24150,8047,24106,32053,23987,7940,20012,15926,19822,16193,28384,7936,11907,7900,12056,47959,31881,15888,20047,8066,4013,11988,16159,8040,20143,36050,20076,24100,20098,8025,16106,15888,16009,4029,20135,4074,28043,12085,8099,19950,16120,16188,8013,11854,11915,24014,8040,16058,11952,23891,15874,24229,35844,15913,15680,23861,27931,24140,32015,19963,15998,8022,23948,11785,12128,43806,20085,4100,23844,3957,16259,32066,40387,24333,16085,11945,20131,7974,35907,27855,15903,20116,27954,27894,40048,19888,20105,40006,4024,27999,23942,11951,27707,35864,32138,16142,15612,24231,15630,15913,8009,28106,28288,24316,36152,20121,31947,15979,11983,27746,32075,11947,12001,32067,4068,7989,35894,12053,16039,7978,16124,16109,12015,23798,16020,24001,20119,36015,4043,3884,12036,24030,20001,16072,20129,7961,19683,0,15885,23894,15964,23906,15959,27728,20139,12028,32183,32025,11894,23988,12031,4025,7863,15997,28213,19878,24139,27707,15894,15927,40062,15935,12199,16053,16048,8137,20031,32217,39894,15923,15841,20053,20023,15698,15987,44129,16147,20069,19654,3969,40005,19849,19903,15871,24119,36083,19926,8014,31905,12036,15906,3965,19943,16180,19945,35870,28334,27769,24235,3949,31889,24200,12105,20140,27994,16198,12187,12088,24033,8115,27876,12133,24053,15856,24078,12082,15949,23802,16167,7932,28055,16266,8097,15988,20037,16151,27652,15978,11917,11899,15864,27956,27811,35959,16012,11888,31992,27763,24085,7756,8096,32059,15927,0,20132,20167,12078,28048,23723,3949,8148,28050,19836,19962,32212,20321,15920,16239,11891,19755,27921,7985,23943,20159,15925,11982,12026,23916,12099,11889,43916,28243,27973,15855,7824,11852,11985,16122,24085,28132,8030,19889,12098,19972,28220,12052,27931,24283,19903,27919,20094,20052,12097,4026,23957,12076,3959,20074,31699,19811,24055,20164,15891,27799,15733,20217,32293,7987,16004,32105,44480,16015,11991,35925,11773,32072,15649,36354,35951,20229,12042,24308,28157,27861,3987,28179,19991,0,20024,27985,16109,12071,27803,32062,20244,16143,39619,27938,15937,23691,15893,11904,12094,11971,28005,32109,32181,12125,15933,28159,19922,24043,32013,15989,16027,24064,7946,23916,31931,12067,15872,19987,11953,12101,24066,32089,28272,16160,24046,7931,0,36030,28171,24174,27987,16121,12006,27829,28004,20138,7978,36070,11882,16041,27931,32345,19838,27851,40337,8053,28260,19847,7960,8053,0,28241,23970,31640,20031,19668,20047,32051,12055,4028,28192,27989,23668,11975,24073,12164,15836,15813,16089,35916,23945,39651,31856,24187,20025,7998,23958,27946,15974,27962,19881,20018,8102,16060,24049,31989,31867,12008,20126,12248,36006,32073,7935,3971,32006,23939,8117,11896,28077,28346,15913,32096,11907,7990,23988,3970,11910,8187,31834,28001,12012,11942,27966,7862,7968,32057,20003,12069,20102,19863,19953,7932,20001,16053,20310,31982,7965,12033,24227,36241,31873,23920,24009,12016,24220,20342,12237,16167,16029,12059,12119,15808,23988,23763,8011,11952,15695,31981,23751,28125,20114,19787,24027,24146,28042,40125,12179,8081,4055,15931,28244,24271,27975,0,16030,11736,19709,24038,19956,19967,11981,0,19522,11929,39953,12079,40107,19949,35981,7990,16214,15818,23980,24104,27896,19754,16040,27975,11992,15891,24032,19788,19956,11822,20083,19926,23999,15924,8186,32010,3945,23857,19912,16120,12140,15741,31652,24071,16088,15747,15983,31968,39882,20013,19983,19756,28113,11863,20110,15971,8039,32235,32112,15957,20165,23861,20021,19942,27841,8115,28094,19949,16010,20073,16011,27616,20057,27778,23922,27999,20047,15913,15935,23923,24044,16006,16192,20008,23907,23767,16072,24149,0,12079,39844,8162,27933,12064,28000,24097,47704,8160,16138,48058,15909,19924,7988,27942,15846,15895,19899,35941,8031,35924,47791,32078,28094,16021,19990,19877,31946,11914,24046,11876,31857,8071,16039,15968,16060,28120,20283,23954,11886,23881,19858,7997,20036,20081,8026,28066,16008,32553,31980,31890,4055,31680,31718,20352,19948,23882,12026,20168,15737,19802,24070,24025,12042,24095,20003,32080,20178,19978,12166,36287,23896,12055,16078,31859,59628,7979,7930,36444,19763,20189,20120,28014,20117,19989,32032,4038,23807,28029,31989,20057,11950,16007,27668,12014,27986,35788,28013,12180,7990,24084,11954,24427,19914,16039,11818,32275,20046,27998,12197,12052,31824,0,8026,19975,20091,4050,36223,23979,31743,12121,12055,27996,11838,16170,15969,24029,20020,7989,16111,12031,19971,24099,32039,12104,15898,12114,15832,24064,32064,28216,12128,23889,24183,8103,15900,11846,39685,15883,39874,8064,27895,23969,23904,24239,12070,19943,7921,24168,12103,24127,28093,23790,7905,3975,31959,27930,23907,15993,11919,15895,24022,27860,12155,7890,28145,35815,11881,11918,12053,35952,39981,20098,27790,15881,31928,19987,23835,11888,24155,16002,3992,15886,23967,23936,11888,20107,23569,20377,23877,8122,15894,11805,27897,12038,4040,15859,28341,11902,19850,16011,20222,16224,16072,15889,27606,24065,12002,8082,27944,23824,19975,20122,12075,16045,27845,20080,20153,20145,23747,24106,32100,12131,27955,7902,19988,15913,27852,23868,12071,8106,20101,20227,15988,27893,15882,15808,7949,24222,15964,36064,16094,20051,7872,12117,11948,15945,16151,11998,24030,12064,8137,23744,24008,8039,24083,12127,16043,28059,23825,15916,4074,7998,36118,23897,8049,19997,8176,7949,23970,16154,12112,15865,4002,20276,19985,28271,31980,3961,32146,20122,3992,3934,11818,27881,16074,7858,32262,12060,11874,15990,20028,4067,19915,0,28108,15983,32061,3945,15913,28315,23929,8008,12149,27811,11890,16116,32260,12109,19788,12097,20022,20050,16084,3968,43440,24205,28019,28048,28118,23852,12123,32219,15906,7877,19580,39689,19913,28407,31891,20040,23826,24002,7939,19933,8062,27988,12037,24000,16105,19962,19917,23681,24017,19940,27899,15844,20050,19936,3963,31675,23811,19921,12060,23893,20047,12137,12020,19887,24046,11976,19933,11982,19879,24163,24019,15911,23986,27976,8104,20297,16047,11990,16079,23983,7938,19900,3957,8051,24097,28163,24151,16103,19857,15813,7969,11979,31924,16018,32101,12024,7893,24051,24013,11897,15846,16209,0,16180,12075,15855,32321,20145,19895,35899,15941,24051,16025,15838,11947,40147,16070,23911,20024,28162,8012,20100,11896,19884,20093,31752,4039,11862,19959,11912,15991,27884,8002,20103,12106,20141,23702,15760,16049,39942,28092,24023,16195,8004,11949,19924,27954,19884,20072,32365,23946,16106,28018,27939,20204,8198,35870,24157,23617,35909,28094,20064,8101,11921,43825,3962,19919,16148,32009,19953,20069,12151,8026,28282,16041,28027,20093,0,27924,24181,27925,28088,16006,48166,16077,20272,4025,23926,35845,23906,20127,27933,28035,11935,12077,27670,55618,12050,12088,20148,4110,20187,23671,28227,12039,32234,28126,23781,11742,12067,23813,12123,20101,15987,20070,15967,20020,12070,19948,7999,20027,4027,27721,20018,11980,12064,36158,8096,27974,27944,24024,16159,19831,11921,15988,32141,48146,8091,16205,24147,8072,12084,28060,16037,16069,20140,43740,7993,31808,11973,11973,23987,20008,35914,16251,19935,15860,11959,24066,39920,27999,11932,16124,11921,15880,23876,12128,8037,20018,11972,15720,12030,19904,15879,27981,7926,35997,12089,15839,23895,19823,23919,7976,11869,7917,12079,7991,32391,23907,3957,16052,12016,24016,11956,16023,24092,20121,24036,16004,12021,12042,24400,19895,16006,16231,32072,7948,32029,31784,12077,16035,7941,24019,3961,24142,24097,4143,23833,12011,20022,28218,7982,3961,27777,11996,15983,11886,11984,8108,11931,19986,31941,27870,15858,16112,32044,31898,24253,32008,24240,31963,27889,20026,31728,31957,19958,11898,11965,15824,19886,20094,20132,11951,11895,3919,24166,32170,27987,15844,4055,23829,19934,20174,3962,11980,24088,35629,7762,23833,16201,12201,16171,15949,16092,16003,31654,16036,20026,16195,11913,3973,15952,24016,24020,20071,15965,28261,27977,23905,23940,3960,19806,31822,4057,28038,19984,16072,11948,20097,36133,20189,20019,8046,16000,15898,24147,24279,20085,20022,36223,7994,20065,24129,3957,16052,19812,15982,4005,19880,20150,19843,31795,16027,11934,27725,15923,12117,15882,23933,15952,20106,23825,7875,27823,15905,7995,35855,4024,11800,16095,8019,15969,3927,28213,12026,7901,4117,12074,23785,19821,15982,32126,39918,3895,8036,16055,15957,3995,27836,23707,11943,20318,11937,36119,23913,31966,35925,20101,32195,12029,15790,24263,16042,8018,19976,19912,28124,24203,20144,15779,39777,28364,20016,27775,8021,15790,39999,11945,15793,20077,7903,31806,31984,12036,24130,19782,16249,23911,28109,31834,32052,11994,16178,11939,28113,24124,32002,24343,7998,15813,20276,12117,20067,36323,7998,36087,20090,20076,27953,27818,24138,12058,15815,28131,15929,31839,12017,15944,40104,15701,8063,36154,7882,16230,11999,19795,16239,27868,19787,24007,28039,20056,19791,20280,11997,23788,24069,28025,44325,23846,7962,20129,19899,20088,15897,24024,20170,24043,8138,11961,19888,23908,11903,28006,36125,23698,12001,23805,11874,8171,23680,3995,19943,36132,23739,24264,12068,27865,20073,19952,28116,16091,7991,24163,12056,15988,20019,20096,24195,8057,16122,15975,16076,24041,20181,20253,19869,3948,24003,24106,20030,12006,16055,20080,12009,4035,23987,24061,27789,27926,7933,24077,15812,15950,23760,16000,20133,24180,12160,15851,16014,7952,24204,24296,16005,35986,4056,28016,23722,4140,20095,16090,20078,35974,24057,20045,11826,8132,12004,11926,15933,11904,31814,12017,7897,11924,23711,11858,15946,16065,32156,24016,19958,19966,19960,23741,19810,19921,19910,19926,19914,31928,23904,23766,16124,23899,7972,12023,35887,31826,11966,36094,3989,8050,8130,23919,7887,15973,20003,7849,23949,12038,16197,19999,23697,11771,20004,11856,20171,12017,15975,28346,15882,8011,11939,4038,15954,7983,15877,11946,15967,11957,15938,15993,4007,16121,7879,11853,16130,11982,32363,23664,16218,20085,19942,27823,27837,24012,11947,16106,24043,40050,15798,16033,28050,24066,27947,27932,11968,27909,7988,15843,15787,40014,20077,24220,39332,3987,15819,35787,35637,24144,24199,16087,28103,12077,35953,16112,12091,32200,11955,36334,3965,12156,8091,32050,11983,19935,24028,7953,16053,4030,11707,23963,11931,32040,35978,8186,20047,20091,31939,4040,28231,32150,8126,3908,32024,12027,19928,28023,15973,24229,28216,12061,12061,20012,4004,24103,23892,20235,36239,19959,7904,31686,16017,20235,36234,27775,16112,36234,32065,11854,40249,27968,8102,12101,7979,20036,11991,23992,35920,20098,0,15844,15872,23985,7921,19822,12079,24044,31893,8096,28130,12056,11844,19949,16185,27707,16170,35711,28114,7876,16089,32100,16037,16134,19843,28041,24158,15907,31924,12082,12141,16079,27975,16041,19931,27942,19802,27929,7933,8172,23892,12109,27930,11977,31928,32194,8000,11949,12044,3937,16090,15955,8018,12146,40264,28243,12215,16329,31966,24024,15987,32265,8058,20181,31785,19814,19854,7916,12190,15988,23863,4085,3967,28031,27845,0,28119,0,20100,31720,32017,11949,35938,48002,24030,36098,8010,8028,12170,27795,32209,28196,15891,12118,16216,24162,7919,16047,15986,23790,15886,19866,15955,24359,27913,28223,12182,15925,11977,11939,16039,28023,28147,16062,23958,23972,23947,11911,39647,16109,11968,11782,11882,11953,20112,12026,19591,11951,27817,27912,20374,28168,4018,19889,16094,12141,16054,19914,24354,24118,11932,8193,24439,16277,24281,16117,11939,24052,35934,8126,15959,15829,32229,47930,32019,36213,8085,19729,24036,7983,16151,3984,15893,8050,20069,23908,16059,28135,19951,7994,23938,27831,32096,23923,19804,24006,20030,35890,31726,23769,24137,20088,8032,15933,27745,24305,16070,19994,23978,24033,4088,32092,31769,4115,19915,15994,4028,28250,11809,32295,27714,31920,16020,3993,12102,15939,15885,20051,15978,35984,11780,36109,40044,12073,24117,8067,32058,4003,27944,11988,20113,11893,16027,16292,11887,11988,20181,24148,23943,24054,11941,12094,15951,4004,12222,11928,20067,12018,19798,16025,19947,12028,19957,8094,15791,24106,8021,20300,19902,16052,23897,8002,15952,19944,12120,16123,27882,15991,28148,24112,15908,15800,16178,27928,24037,11900,7925,12040,16218,7891,19962,19796,23922]}]},"null_count":0,"tot_col_size":126979718,"last_update_version":401695328149176322},"ps_comment":{"histogram":{"ndv":37240832,"buckets":[{"count":160000,"lower_bound":"IFRpcmVzaWFzIHNsZWVwIGJsaXRoZWx5IGFib3V0IHRoZSBjYXJlZnVsbHkgcmVndWxhciBkZXBvc2l0cy4gc3BlY2lhbCwgZmluYWwgcGFja2FnZXMgaGFnZ2xlIHF1aWNrbHkuIGZ1cmlvdXNseSBmaW5hbCBmb3hlcyBib29zdCBmbHVmZmlseS4gcmVndWxhciB3YXRlcnMgYWZ0ZXIgdGhlIGNhcmU=","upper_bound":"IGFjY291bnRzIGhhZ2dsZSBxdWlja2x5IGNhcmVmdWxseSBib2xkIGZveGVzLiBhc3ltcHRvdGVzIGRldGVjdCBxdWk=","repeats":1},{"count":320000,"lower_bound":"IGFjY291bnRzIGltcHJlc3Mgc2x5bHkgZXhwcmVzcyBmb3hlcy4gc2x5bHkgc2lsZW50IHRoZW9kb2xpdGVzIGFib3ZlIHRoZSBzbHlseSBmaW5hbCBmb3hlcw==","upper_bound":"IGFmdGVyIHRoZSBib2xkIGZveGVzLiBwZW5kaW5nIHJlcXVlc3RzIGJvb3N0IHBlbmRpbmcgaW5zdHJ1Y3Rpb25zLiBmaW5hbCBkb2w=","repeats":1},{"count":480000,"lower_bound":"IGFmdGVyIHRoZSBjYXJlZnVsbHkgY2xvc2UgZGVwZW5kZW5jaWVzLiByZWd1bGFyIGFjY291bnRzIGVhdCBjYXJlZnVsbHkgcmVndWxhciwgZXZlbiByZXF1ZXN0czogZnVyaW91c2x5IGlyb25pYyBpbnN0cnVjdA==","upper_bound":"IGFyZSBjYXJlZnVsbHkgcGVuZGluZyBleGN1c2VzISBkb2xwaGlucyBib29zdCBjYXJlZnVsbHkgc2x5bHkgdW51c3VhbCBjb3VydHMuIGJyYXZlbHkgZXZlbiBmb3hlcyBwbGF5IGNhcmVmdWxseSBhbG9uZ3NpZGUgb2YgdGhlIHJlZ3VsYXIgcmVxdWVzdHMuIGV4cHJlc3MsIGZpbmFsIGFjY291bnRzIHVz","repeats":1},{"count":640000,"lower_bound":"IGFyZSBmdXJpb3VzbHkgYWdhaW5zdCB0aGUgZmx1ZmZpbHkgcmVndWxhciBwYWNrYWdlcy4gY2FyZWZ1bGx5IGJ1c3kgZm94ZXMgYWZ0ZXIgdGhlIGJsaXRoZWx5IHVudXN1YWwgYWNjb3VudHMgaGE=","upper_bound":"IGJlYW5zIGNham9sZSBmdXJpb3VzbHkuIGJvbGQsIHJlZ3VsYXIgZm94ZXMgc2xlZXAgYWxvbmdzaWRlIG9mIHRoZSBxdWlja2x5IHJlZ3VsYXIgcGludG8gYg==","repeats":1},{"count":800000,"lower_bound":"IGJlYW5zIGNham9sZSBwZW5kaW5nIHRoZW9kb2xpdGVzLiBzbHlseSByZWd1bGFyIHBhY2thZ2VzIG5hZyBzbHlseSBwYWNrYWdlcy4gcXVpY2tseSBldmVuIGFzeW1wdG90ZXMgdXNlIGJsaXRoZWx5IGFzeW1wdG90ZXMuIHF1aWNrbHkgaXJvbmljIHRpdGg=","upper_bound":"IGJsaXRoZWx5IGZpbmFsIGFjY291bnRzIHNsZWVwIGZsdWZmaWx5IGFmdGVyIHRoZSBpcm9uaWNhbGx5IHNwZWNpYWwgZm94ZXMuIGZ1cmlvdXNseSBmaW5hbCBwaW50byBiZWFucyBkZXRlY3QgYXQgdGhlIGJvbGQgcGludG8gYmVhbnM7IHF1aWNrbHkgcmVndWxhciBkZXBvc2l0cw==","repeats":1},{"count":960000,"lower_bound":"IGJsaXRoZWx5IGZpbmFsIGluc3RydWN0aW9ucyBuYWcgcXVpY2tseSBldmVuIGRlcG9zaXRzLiBldmVuIGR1Z291dHMgbmFnIGFjY29yZGluZyB0byB0aGUgcGVuZGluZyB0aGVvZG9saXRlcy4gY2FyZWZ1bGx5IGV2ZW4gZGVwb3NpdHMgYWNjbw==","upper_bound":"IGJvbGQgcGludG8gYmVhbnMgZGV0ZWN0IGNhcmVmdWxseSBhbG9uZyB0aGUgcXVpY2tseSBzcGVjaWFsIHBpbnRvIGJlYW5zLiBldmVuLCByZWd1bGE=","repeats":1},{"count":1120000,"lower_bound":"IGJvbGQgcGludG8gYmVhbnMuIHBhY2thZ2VzIGRvemUgZnVyaW91c2x5IGJsaXRoZWx5IGV2ZW4gZGVwb3NpdHMuIGZ1cmlvdXNseSB1bnVzdWFsIGFjY291bnRzIG5hZyByZWd1bGFyLCByZWd1bGFyIG5vdG9ybmlzLiBmdXJpb3VzbHkgZXhwcmVzcyBwYWNrYWdlcyBhY2NvcmRpbmcgdG8gdGhlIGNhcmVmdWxseQ==","upper_bound":"IGNham9sZSBjYXJlZnVsbHkgcXVpY2tseSBleHByZXNzIGluc3RydWN0aW9ucy4gcmVxdWVzdHMgY2Fqb2xlIGJsaXRoZWx5IGNhcmVmdWxseSBmaW5hbCBpbnN0cg==","repeats":1},{"count":1280000,"lower_bound":"IGNham9sZSBjYXJlZnVsbHkgc2x5bHkgZXZlbiBpZGVhcy4gcXVpY2tseSBib2xkIGFzeW1wdG90ZXMgaGluZGVyIGZsdWZmaWx5IHJlZ3VsYXIgZG9scGhpbnMhIGV2ZW4gbXVsdGlwbGllcnMgc2xlZXAgZnVyaW91c2x5LiByZWd1bGE=","upper_bound":"IGNhcmVmdWxseSByZWd1bGFyIHBhY2thZ2VzIG5hZyBhcm91bmQgdGhlIHJlZ3VsYXIgYWNjb3VudHMuIGlyb25pYyBpbnN0cnVjdGlvbnMgdXNlIHNseWx5IGFjY29yZGluZyB0byB0aGU=","repeats":1},{"count":1440000,"lower_bound":"IGNhcmVmdWxseSByZWd1bGFyIHJlcXVlc3RzIGNham9sZSBxdWlja2x5IGFib3V0IHRoZSBncm91Y2hlcy4gcGFja2FnZXMgYXJlIGJsaXRoZWx5LiBzcGVjaWFsIGZyYXlzIGhhZ2dsZSBibGl0aGVs","upper_bound":"IGRlcG9zaXRzIGNham9sZSBxdWlja2x5LiBmdXJpb3VzbHkgZXZlbiBwYWNrYWdlcyBuYWcgZmluYWxseSB0aGVvZG9saXRlcy4gYmxpdGhlIGRlcG9zaXRzIGFyZSBmdXJpb3VzbHkuIHJlZ3VsYXIgaWRlYXMgYXJlIGZ1cmlvdXNseSBw","repeats":1},{"count":1600000,"lower_bound":"IGRlcG9zaXRzIGNhbiBzbGVlcCBhYm91dCB0aGUgcmVndWxhciwgZXZlbiB0aGVvZG9saXRlcy4gYmxpdGhlbHkgaXJvbmlj","upper_bound":"IGRvbHBoaW5zIGJvb3N0IGZpbmFsbHkgc2x5bHkgcGVuZGluZyBwaW50byBiZWFucy4gcmVndWxhciBwYWNrYWdlcyBjYWpvbGUgYmxpdGhlbHkgY2FyZWZ1bGx5IHNpbGVudCBpbnN0cnVjdGlvbnMuIGNhcmVmdWxseSA=","repeats":1},{"count":1760000,"lower_bound":"IGRvbHBoaW5zLiBmbHVmZmlseSBpcm9uaWMgcGFja2FnZXMgc2xlZXAuIGJsaXRoZWx5IHNwZWNpYWwgZGVwb3NpdHMgdXNlLiBzbHlseSByZWd1bGFyIHBhY2thZw==","upper_bound":"IGV2ZW4gdGhlb2RvbGl0ZXMuIGZsdWZmaWx5IGlyb25pYyBpZGVhcyBhcmUgc2x5bHkuIGZpbmFsIGFjY291bnRzIHNsZWVwIGZ1cmlvdXNseSBhYm92ZSB0aGUgaXJvbmljIGZveGVzLiBibGl0aGVseSBmaW5hbCBwYWNrYWdlcyBhYm92ZSB0aGUgZXZlbiBwYWNrYWdlcyBjYWpvbGUgYWZ0ZXIgdGhlIHJlZ3VsYXIgcmVxdWVzdHMuIGZsdWY=","repeats":1},{"count":1920000,"lower_bound":"IGV2ZW4sIGZpbmFsIHBhY2thZ2VzIHdha2UgZmx1ZmZpbHkgYWJvdmUgdGhlIGV2ZW4gcGFja2FnZXMuIGJvbGQsIHBlbmRpbmcgcGludG8gYmVhbnMgYm9vc3QgY2FyZWZ1bGx5LiBzbG93bHkgZXZlbiBwYWNrYWdlcyBoYWdnbGUuIGNhcmVmdWxs","upper_bound":"IGZpbmFsIGFjY291bnRzLiBmaW5hbCwgYm9sZCBleGN1c2VzIGhhZ2dsZSBhZ2FpbnN0IHRoZSBxdWlja2x5IHVudXN1YWwgcGFja2FnZXMuIHVudXN1YWwgZGVwdGhzIHM=","repeats":1},{"count":2080000,"lower_bound":"IGZpbmFsIGFjY291bnRzLiBmbHVmZmlseSByZWd1bGFyIHRoZW9kb2xpdGVzIGFsb25nc2lkZSBvZiB0aGUgYmxpdGhlbHkgZXhwcmVzcyBhY2NvdW50cyBsb3NlIHNseWx5IGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaXRzISBwZW5kaW5nIHRoZW9kb2xpdGVzIHdha2UgZXhjdXNlcy4gcXVpY2tseSBmaW5hbCBhc3ltcHRvdGVzIHNsZWVw","upper_bound":"IGZsdWZmaWx5IGJvbGQgZGVwb3NpdHMgdXNlIGZ1cmlvdXNseSBhbG9uZyB0aGUgY2FyZWZ1bGx5IGlyb25pYyBpZGVhcy4gY2FyZWZ1bGx5IHJlZ3VsYXIgcmVxdWVzdHMgY291bGQgdXNlIGJsaXRoZWx5IGFmdGVyIHRoZSBzaWxlbnQgYWNjbw==","repeats":1},{"count":2240000,"lower_bound":"IGZsdWZmaWx5IGJvbGQgcGludG8gYmVhbnMgc2xlZXAgYWJvdXQgdGhlIGJsaXRoZWx5IGV2ZW4gZGVwZW5kZW5jaWVzLiBwZW5kaW5nIGlkZWFzIG5hZyBmdXJpb3VzbHkgY2FyZWZ1bGx5IGlyb25pYyB0aGVvZG9saXRlcy4gcmVndWxhciwgZmluYWwgcmVxdWVzdHMgcw==","upper_bound":"IGZveGVzIHRocmFzaCBibGl0aGVseSBzbHkgcGFja2FnZXMuIHJlZ3VsYXIgdGhlb2RvbGl0ZXMgc2xlZXAgZXhwcmVzcyBleGN1c2VzLiBldmVuIGRlcG9zaXRzIGNham9sZSBhbG9uZyB0aGUgcmVndWxhciBkZXBlbmRlbmNpZXM6IGZpbmFsIGRlcA==","repeats":1},{"count":2400000,"lower_bound":"IGZveGVzIHRocmFzaCBjYXJlZnVsbHkuIGNhcmVmdWxseSBib2xkIHBpbnRvIGJlYW5zIGFmZml4LiBmaW5hbCwgcmVndWxhciBwaW50byBiZWFucyBjYWpvbGUgc2x5bHku","upper_bound":"IGZ1cmlvdXNseSBpcm9uaWMgZXhjdXNlcy4gc2F1dGVybmVzIGFmZml4IGNhcmVmdWxseSBzaWxlbnQgYWNjb3VudHMuIGNhcmVmdWxseSBib2xkIGFjY28=","repeats":1},{"count":2560000,"lower_bound":"IGZ1cmlvdXNseSBpcm9uaWMgcGxhdGVsZXRzIHNsZWVwIGNhcmVmdWxseS4gYmxpdGhlbHkgaXJvbmljIHBpbnRvIGJlYW5zIGNham9sZSByZWd1bGFyIGluc3RydWN0aW9ucy4gaXJvbmljLCBwZW5kaW5nIHBhY2thZ2VzIGhhbmcgY2FyZWZ1bGx5IHBlbmRpbmc=","upper_bound":"IGhhZ2dsZSBxdWlja2x5IGV4cHJlc3MgaWRlYXMuIHF1aWNrbHkgZXhwcmVzcyBwYWNrYWdlcyBjYWpvbGUgcXVpY2tseSBhbW9uZyB0aGUgcGVuZGluZyBleGN1c2VzLS0gY2FyZWZ1bGx5IGV2ZW4gcGFja2FnZXMgd2FrZSBmbHVmZmlseS4gcXVpY2tseSBibGl0aA==","repeats":1},{"count":2720000,"lower_bound":"IGhhZ2dsZSBxdWlja2x5IGZ1cmlvdXNseSBwZW5kaW5nIG9yYml0cy0tIGRlcG9zaXRzIGNham9sZSBhdCB0aGUgZmk=","upper_bound":"IGluc3RydWN0aW9ucy4gZnVyaW91c2x5IGlyb25pYyByZXF1ZXN0cyBoYWdnbGUgc2xvd2x5IGZpbmFsIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBhcmUgc2x5bHkgYWJvdmUgdGhlIGlyb25pYywgcmVndWxhciBh","repeats":1},{"count":2880000,"lower_bound":"IGluc3RydWN0aW9ucy4gZnVyaW91c2x5IHJlZ3VsYXIgZGVwb3NpdHMgZGV0ZWN0IHF1","upper_bound":"IGlyb25pYyByZXF1ZXN0cy4gZmluYWwgcmVxdWVzdHMgc2xlZXAgcXVpY2tseSBidXN5IHBhY2thZ2VzLiBkZXBvc2l0cyBib29zdCBzbHlseSBmdXJpb3VzbHkgcmVndWxhciA=","repeats":1},{"count":3040000,"lower_bound":"IGlyb25pYyByZXF1ZXN0cy4gZmx1ZmZpbHkgcmVndWxhciBwYWNrYWdlcyB1c2UgYmxpdGhlbHkgYm9sZCB0aGVvZG9saXRlcy4gY2FyZWZ1bGx5IGZpbmFsIGZveGVzIHdha2UgY2FyZWZ1bGx5LiBmdXJpb3VzbHkgaXJvbmljIHBpbnRvIGJlYW5zIHdha2Ugc2x5bHkg","upper_bound":"IG9mIHRoZSBzaWxlbnQgYWNjb3VudHMuIHJlZ3VsYXIgZm94ZXMgY2Fqb2xlLiBmdXJpb3VzbHkgaXJvbmljIGFzeW1wdG90ZXMgYXQgdGhl","repeats":1},{"count":3200000,"lower_bound":"IG9mIHRoZSBzaWxlbnQsIHJlZ3VsYXIgYWNjb3VudHMuIHJlcXVlc3RzIHNsZWVwIGZ1cmlvdXNseS4gZnVyaW91c2x5IGZpbmE=","upper_bound":"IHBhY2thZ2VzLiBzcGVjaWFsLCBzcGVjaWFsIG5vdG9ybmlzIHJ1biBhYm92ZSB0aGUgcmVndWxhciwgcGVybWFuZW50IHBpbnRvIGJlYW5zLS0gZXZlbiwgaXJvbmljIGFjY291bnRzIGFmZml4IHF1aWNrbHkgYWNyb3NzIHRoZSBmdXJpb3VzbHkgZmluYWwgcGFj","repeats":1},{"count":3360000,"lower_bound":"IHBhdHRlcm5zIGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgYm9sZCBmb3hlcyBzbGVlcCBxdWlja2x5IGlkbHkgcmVndWxhciBhY2NvdW50cy4gcXVpY2tseSBpcm9uaWMgcmVxdWVzdHMgYWJvdXQ=","upper_bound":"IHBpbnRvIGJlYW5zIG5hZyBjYXJlZnVsbHkgYXJvdW5kIHRoZSBpcm9uaWMgZm94ZXM6IHBhY2thZ2VzIHN1YmxhdGUgZXhwcmVzcywgYm9sZCBhY2NvdW50cy4gZmluYWwgaWRlYXMgc2xlZXAgc2x5bHk/IHBlbmRpbmcgcmVxdWVzdHMgYWJvdXQgdGhlIHNseWx5IHVudXN1YWwgZGVwZW5kZW5jaWVzIHVud2k=","repeats":1},{"count":3520000,"lower_bound":"IHBpbnRvIGJlYW5zIHBvYWNoIHNseWx5IGlyb25pYywgdW51c3VhbCBpZGVhcy4gZXZlbiBmb3hlcyBhY2NvcmRpbmcgdG8gdGhlIGJsaXRoZWx5IGV2ZW4gZGVwbw==","upper_bound":"IHF1aWNrbHkgZW50aWNpbmcgZGVwb3NpdHMuIHdhcmhvcnNlcyB1bndpbmQuIGZ1cmlvdXNseSBzcGVjaWFsIHRoZW9kb2xpdGVzIHdha2UuIHNwZWNpYWwsIGJvbGQgcGFja2FnZXMgYWZ0ZXIgdGhlIHF1aWNrbHkgc3BlY2lhbCBmb3hlcyA=","repeats":1},{"count":3680000,"lower_bound":"IHF1aWNrbHkgZXZlbiBkZXBvc2l0cyBuYWcgYWZ0ZXIgdGhlIGNhcmVmdWxseSBldmVuIA==","upper_bound":"IHJlZ3VsYXIgYWNjb3VudHMgd2FrZSBzbHlseS4gc2x5bHkgZXZlbiBmb3hlcyB1c2UgYWdhaW5zdCB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgaWRlYXMuIGFzeW1wdG90ZXMgYWxvbmdzaWRlIG9mIHRoZSByZWd1bGFyIGRlcG9zaXRzIGFyZSBzbHlseSBhbG9uZyB0aGUgZnVyaW91c2x5IHJlZ3Vs","repeats":1},{"count":3840000,"lower_bound":"IHJlZ3VsYXIgYWNjb3VudHMgd2FrZS4gaXJvbmljLCBxdWlldCBkZXBvc2l0cyBhZmZpeCBzbHlseSBhZnQ=","upper_bound":"IHJlZ3VsYXIgdGhlb2RvbGl0ZXMgYXJlIGFjY29yZGluZyB0byB0aGUgZnVyaW91c2x5IHF1aWNrIGFzeW1wdG90ZXMuIGV2ZW4gYXN5bXB0b3RlcyBhYm92ZSB0aGUgc3BlY2lhbCByZXF1ZXN0cyB0aHJhc2ggc2x5bHkgYW1vbmcgdGhlIHNseWx5IHBlbmRpbmcgZGVwb3NpdHMuIGZveGVzIGFyZS4gcmVndWxhciBwYWNrYWdlcyBjb3Vs","repeats":1},{"count":4000000,"lower_bound":"IHJlZ3VsYXIgdGhlb2RvbGl0ZXMgY2Fqb2xlIGFsb25nIHRoZSBibGl0aGVseSB0aGluIHRoZW9kb2xpdGVzLiBpcm9uaWMsIGlyb25pYyByZXF1ZXN0cyBoYWdnbGUgY2FyZWZ1bGx5IGJvbA==","upper_bound":"IHJlcXVlc3RzLiBxdWlja2x5IHNwZWNpYWwgZGVwb3NpdHMgaGFnZ2xlLiBxdWlja2x5IGZpbmFsIHBhY2thZ2VzIGludGVncmF0ZSBmdXJpb3VzbHkgZXZlbiwgdW51c3VhbCBhY2NvdW50cy4gY2FyZWZ1bGx5IHNwZWNpYWwgYnJhaWRzIHNsZWVwIHF1aWNrbHkgcXVpY2tseSBpcm9uaWMg","repeats":1},{"count":4160000,"lower_bound":"IHJlcXVlc3RzLiBxdWlja2x5IHVudXN1YWwgZm94ZXMgd2FrZSBmdXJpb3VzIHJlcXVlc3RzLiBpZGVhcyBoYWdnbGUgc2xvd2x5IGFjY291bnRzLiBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBub2QuIHF1aWNrbHkgZnU=","upper_bound":"IHNsZWVwIGZ1cmlvdXNseS4gZmx1ZmZpbHkgZXZlbiBwYWNrYWdlcyBoYWdnbGUgZnVyaW91c2x5LiBjYXJlZnVsbHkgcmVndWxhciBleGN1c2VzIGNham9sZSBjYXJlZnVsbHkgYW1vbmcgdGhlIGZ1cmlvdXNseSBpcm9uaWMgYWNjb3VudHM/IHNseWx5IGY=","repeats":1},{"count":4320000,"lower_bound":"IHNsZWVwIGZ1cmlvdXNseS4gaXJvbmljLCBwZW5kaW5nIHBpbnRvIGJlYW5zIHByaW50LiByZWd1bGFyLCBmaW5hbCBhY2NvdW50cyBhbG9uZyB0aGUgdGhlb2RvbGl0ZXMgc2xlZXAgYmxpdGhlbHkgZnVyaW91c2x5IHNpbGVudCByZXF1ZXN0cy0tIGNhcmVmdWxseSBmbHVmZnkgdGhlb2RvbGl0ZXMg","upper_bound":"IHNseWx5IHBlbmRpbmcgYnJhaWRzIHVzZSBmdXJpb3VzbHkgZmluYWwgdGhlb2RvbGl0ZXMuIGV4cHJlc3MgdGhlb2RvbGl0ZXMgdXNlIGNhcmVmdWxseSBpcm9uaWMgZGVwb3NpdHMuIGJsaXRoZWx5IHJlZ3VsYXIgZA==","repeats":1},{"count":4480000,"lower_bound":"IHNseWx5IHBlbmRpbmcgY291cnRzIGRldGVjdCBmbHVmZmlseSBhYm91dCB0aGUgcXVpY2tseSBzaWxlbnQgcGludG8gYmVhbnMuIGNsb3NlIHRoZW9kb2xpdGVzIGFyZSBj","upper_bound":"IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLiBmdXJpb3VzbHkgaWRsZSBlcGl0YXBocyBhbG9uZ3NpZGUgb2YgdGhlIGZpbmFsIHBhY2thZ2VzIG5hZyBibGl0aGVseSBhZ2FpbnN0IHRoZSByZWd1bGFyLCBpcm9uaWMgaWRlYXMuIGJvbGQgYWNjb3VudHMgZ3JvdyBzbHlseSBhdCB0aGUgcmVndWxhciBpbnM=","repeats":1},{"count":4640000,"lower_bound":"IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLiBzbHlseSBzcGVjaWFsIGZyYXlzIHdha2UgYmxpdGhlbHkuIGZsdWZmaWx5IGlyb25pYyBkZXBvc2l0cyBhbG9uZyB0aGUgYmxpdGhlbHkgcmVndWxhcg==","upper_bound":"IHRoZSBleHByZXNzIHBpbnRvIGJlYW5zLiBjYXJlZnVsbHkgaXJvbmljIHRoZW9kb2xpdGVzIHNsZWVwIGZ1cmlvdXNseS4gZmx1ZmZpbHkgcmVndWxhciBkZXBvc2l0cyA=","repeats":1},{"count":4800000,"lower_bound":"IHRoZSBleHByZXNzLCBxdWljayBwYWNrYWdlcyBoYWdnbGUgZGVwb3NpdHM7IHRoaW4sIGV4cHJlc3MgZGVwZW5kZW5jaWVzIGFsb25nc2lkZSBvZiB0aGUgdW51c3VhbCBkZXBvc2l0cyBoYW5nIGNhcmVmdWxseSBhYm92ZSB0aGUgZnVyaW91c2x5IGZpbmFsIGZveGVzLiBwZW5kaW5nIGFjY291bnRzIG5h","upper_bound":"IHRoZSByZWd1bGFyIGZveGVzLiBmdXJpb3VzbHkgZmluYWwgYWNjb3VudHMgd2FrZSBjYXJlZnVsbHkgYWJvdmUgdGhlIHF1aWNrLCB1bnVzdWFsIHJlcXVlc3RzOiBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBub2QgYWJvdmUgdGhlIGNhcmVmdQ==","repeats":1},{"count":4960000,"lower_bound":"IHRoZSByZWd1bGFyIG11bHRpcGxpZXJzLiB3YXJ0aG9ncyBlbmdhZ2UuIGRlcG9zaXRzIGFjcm9zcyB0aGUgZmluYWwgYWNjb3VudHMgc2xlZXAgZnVyaW91c2x5IHM=","upper_bound":"IHRoZW9kb2xpdGVzIHdha2UgY2FyZWZ1bGx5LiBwZW5kaW5nIGNvdXJ0cyBzb2x2ZSBmaW5hbGx5IGZpbmFsIHBhY2thZ2VzLiBldmVuLCByZWd1bGFyIGFjY291bnRzIG1vbGQgZmx1ZmZpbHkgZm94ZXMuIHNseWx5IHNwZWNpYWwgZGVwb3NpdHMgdXNlIHVwIHRoZSBpZGx5IGJvbGQgZm94ZXMuIGNhcmVmdWxseSByZWd1bGFyIGFzeQ==","repeats":1},{"count":5120000,"lower_bound":"IHRoZW9kb2xpdGVzLiBicmF2ZWx5IGlyb25pYyByZXF1ZXN0cyBzbGVlcC4gcGFja2FnZXMgcGFzdCB0aGUg","upper_bound":"IHVudXN1YWwgaWRlYXMgd2FrZSBjYXJlZnVsbHkgZmluYWwgZGVwb3NpdHMuIGZ1cmlvdXNseSBzbHkgcmVxdWVzdHMgc2xlZXAgZmx1ZmZpbHkuIHJlZ3VsYXIgZGVwb3NpdHMgd2E=","repeats":1},{"count":5280000,"lower_bound":"IHVudXN1YWwgaWRlYXMuIGV2ZW4gZGVwZW5kZW5jaWVzIGhhZ2dsZSBjbG9zZWx5IGNhcmVmdWxseSB1bnVzdWFsIGZveGVzLiBldmVuLCBleHByZXNzIA==","upper_bound":"IHdha2Ugc2x5bHkgYWJvdmUgdGhlIHJlZ3VsYXIgYWNjb3VudHMuIGZveGVzIHdha2Ugc2x5bHkgaWRlYXM7IGZ1cmlvdXNseSBpcm9uaWMgcGFja2FnZXMgd2FrZS4gY291cnRzIGFnYWluc3QgdGhlIGZ1cmlvdXNseQ==","repeats":1},{"count":5440000,"lower_bound":"IHdha2Ugc2x5bHkgcmVndWxhciBkZXBvc2l0cy4gZnVyaW91c2x5IGV4cHJlc3MgZXhjdXNlcyBjYWpvbGUuIGJsaXRoZWw=","upper_bound":"LCByZWd1bGFyIGNvdXJ0cy4gZGFyaW5nIGZveGVzIHVzZSBxdWlja2x5IGFib3ZlIHRoZSB1bnVzdWFsIGZveGVzLiByZXF1ZXN0cyBjYWpvbGUgZnVyaW91c2x5IGJ1c2lseSBpcm9uaWMgaW5zdHJ1Y3Rpb24=","repeats":1},{"count":5600000,"lower_bound":"LCByZWd1bGFyIGRlcG9zaXRzIGNham9sZSBzbHlseSBibGl0aGVseSByZWd1bGFyIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgdGhpbiBhc3ltcA==","upper_bound":"LiBidXNpbHkgc3BlY2lhbCBleGN1c2VzIGFjcm9zcyB0aGUgZmx1ZmZ5LCBpcm9uaWMgcGFja2FnZXMgaGFnZ2xlIHNseWx5IGNhcmVmdWxseSBldmVuIHJlcXVlc3RzLiBwZW5kaW5nIGRlcG9zaXRzIGFjY29yZGluZyB0byB0aGUgYWM=","repeats":1},{"count":5760000,"lower_bound":"LiBjYXJlZnVsbHkgYm9sZCBwaW50byBiZWFucyBpbXByZXNzIGFib3ZlIHRoZSBmdXJpb3VzbHkgcmVndWxhciBpbnN0cnVjdGlvbnM/IGNhcmVmdWxseSBleHByZXNzIGZveGVzIGhhZ2dsZSBzbHlseSBleHByZXNzIHBpbnRvIGJl","upper_bound":"LiBmaW5hbCBwaW50byBiZWFucyBhYm91dCB0aGUgY2FyZWZ1bGx5IGZpbmFsIGRvbHBoaW5zIHdha2UgZnVyaW91c2x5IHRoaW4sIGZpbmFsIGRlcG9zaXRzLiBzbHlseSBjYXJlZnVsIGFzeW1wdG90ZXMgaGFnZ2xlLiBzbHlseSBpcm9u","repeats":1},{"count":5920000,"lower_bound":"LiBmaW5hbCByZXF1ZXN0cyBhcmUgYXJvdW5kIHRoZSBpcm9uaWMgaWRlYXMtLSByZWd1bGFyLCBpcm9uaWMgcGxhdGVsZXRzIGhhZ2dsZS4gc2xvd2x5IGV2ZW4gcmVxdWVzdHMgaGFnZ2xlIGFsb25nc2lkZSBvZiB0aGUgdGhpbiBzaGVhdmVzLiBzbHlseSBzcGVjaWFsIHJlcXVlc3Rz","upper_bound":"LiBwZW5kaW5nIHBpbnRvIGJlYW5zIHdha2UgZmx1ZmZpbHkgYWdhaW5zdCB0aGUgZmluYWwsIGZpbmFsIGluc3RydWN0aW9uczogc2lsZW50bHkgcmVndWxhciBkZXBvc2l0cyB3aWxsIHVzZSBzbHlseSBwZW5kaW5nIGRlcG9zaXRzLiBzcGVjaWFsLCBldmVuIHJlcXVlc3RzIGludGVncmF0ZSBkb2dnZWRseSBhYw==","repeats":1},{"count":6080000,"lower_bound":"LiBwZW5kaW5nLCBldmVuIHJlYWxtcyBoYWdnbGUgZnVyaW91c2x5LiByZXF1ZXN0cyBoYWdnbGUuIHNseWx5IGlyb25pYyBleGN1c2VzIGFyZSBzbHlseSBmdXJpb3VzbHkgcmVndWxhciBkZXBlbmRlbmNpZXMtLSBibGl0aGVseSBpcm9uaWMgYWNjb3VudHMgbmFnIGZ1cmlvdQ==","upper_bound":"LiBzbHlseSBpcm9uaWMgYWNjb3VudHMgYXJlIGJlbmVhdGggdGhlIGJsaXRoZWx5IGV4cHJlc3MgYWNjb3VudHMuIGlyb25pYyBkZXBvc2l0cyBwb2FjaCBjYXJlZnVsbHkgZmluYWwgcGFja2FnZXMuIGZ1cmlvdXNseSBpcm9uaWMgcGFja2FnZXMgYWJvdmUgdGhlIGZ1cmlvdXNseSBib2xkIGZveGVzIGFmZml4IHNseWx5IGFjcm9zcyB0aA==","repeats":1},{"count":6240000,"lower_bound":"LiBzbHlseSBpcm9uaWMgYWNjb3VudHMgYmVsaWV2ZSBuZXZlciBpcm9uaWMgcGludG8gYmVhbnMuIHNseWx5IHJlZ3VsYXIgcmVxdWVzdHMgd2FrZSBzbHlseSBmaW5hbCBhY2NvdW50cy4gc2x5bHkgaXJvbmljIG11bHRpcGxpZXJzIGNham9sZS4gZG9nZ2VkbHkgZmk=","upper_bound":"YWJvdXQgdGhlIGZ1cmlvdXNseSBleHByZXNzIGFjY291bnRzLiBxdWlja2x5IGV4cHJlc3MgaW5zdHJ1Y3Rpb25zIGNham9sZSBibGl0aGVseSBjYXJlZnVsbHkgYm9sZCBwYWlucy4gZnVyaQ==","repeats":1},{"count":6400000,"lower_bound":"YWJvdXQgdGhlIGluc3RydWN0aW9ucyBzZXJ2ZSBhYm91dCB0aGUgYm9sZCBhY2NvdW50cy4gZXZlbiBwaW50byBiZWFucyB3YWtlIGNhcmVmdWxseSBmaW5hbCBpbnN0cnVjdGlvbnMuIGZ1cmlvdXNseSBmaW5hbCBhc3ltcHRvdGVzIGJvb3N0IGZ1cmlvdXNseSBibGl0aGVseSByZWd1bGFyIGRlcG9zaXRzLiBmaW5hbCByZQ==","upper_bound":"YWNjb3VudHMuIGZsdWZmaWx5IHJlZ3VsYXIgYWNjb3VudHMgYWJvdXQgdGhlIGZpbmFsIGNvdXJ0cyBoYWdnbGU=","repeats":1},{"count":6560000,"lower_bound":"YWNjb3VudHMuIGZ1cmlvdXMsIGlkbGUgYXN5bXB0b3RlcyBhbG9uZ3NpZGUgb2YgdGhlIGZsdWZmeSBkZXBvc2l0cyB3YWtlIGNh","upper_bound":"YWNrYWdlcy4gZmluYWwgZm94ZXMgaGFnZ2xlIGJsaXRoZWx5IGVwaXRhcGhzLiB1bnVzdWFsIGRlcG9zaXRzIGludGVncmF0ZSBibGl0aGVseSBhbW9uZyB0aGUgYWNjb3VudHMu","repeats":1},{"count":6720000,"lower_bound":"YWNrYWdlcy4gZnVyaW91c2x5IHBlbmRpbmcgcmVxdWVzdHMgbG9zZSBzbHlseSBzcGVjaWFsLCBzbG93IGluc3RydWN0aW9ucy4gY2FyZWZ1bGx5IGlyb25pYyBwaW50byBiZWFucyBhZmZpeCBjYXJlZnVsbHkgc3BlY2lhbCBkaW5vcw==","upper_bound":"YWcuIGZ1cmlvdXNseSBldmVuIHRoZW9kb2xpdGVzIHNsZWVwIGNhcmVmdWxseS4gdGhpbmx5IHNwZWNpYWwgYWNjb3VudHMgbXVzdCBlbmdhZ2Ugc2x5bHkgc3BlY2lhbCBwYWNrYWdlcy4gaXJvbmljIGluc3RydWN0aW9ucyBhYm91dCB0aGUgc2x5bHkgaXJvbmljIGluc3RydWN0aW9ucw==","repeats":1},{"count":6880000,"lower_bound":"YWcuIHJlZ3VsYXIgcGludG8gYmVhbnMgYXJlIGFib3ZlIHRoZSBjYXJlZnVsbHkgZXhwcmVzcyBzZW50aW1lbnRzLiBkb2dnZWQgZm94ZXMgdXNlIHNseWx5IHF1aWV0IHRoZW9kb2xpdGVzLiBxdWlja2x5IHNpbGVudCB3YXJob3JzZXMgc2xlZXAgZG9nZ2VkbHkgcXVpY2tseSByZWd1bGFyIGNvdXJ0cy4g","upper_bound":"YWdlcy4gc3BlY2lhbCBwYWNrYWdlcyBib29zdCBhZnRlciB0aGUgZmx1ZmZpbHkgZXZlbiBpbnN0cnVjdGlvbnMuIGZ1cmlvdXNseSBzaWxlbnQgcmVxdWVzdHMgc2xlZXAgYmxpdGhlbHkgYmxpdGhlbHkgcmVndWxhciBkZXBlbmRlbmNpZXMuIGV2ZW4gcGxhdGVsZXRzIG5vZCBmdXJpb3VzbHkuIHNseWx5IHJlZw==","repeats":1},{"count":7040000,"lower_bound":"YWdlcy4gdGhpbmx5IHJlZ3VsYXIgZGVwb3NpdHMgYm9vc3QgZnVyaW91c2x5IHVwb24gdGhl","upper_bound":"YWpvbGUgYm9sZGx5IHNwZWNpYWwgcGludG8gYmVhbnMuIHF1aWNrbHkgc2lsZW50IGFzeW1wdG90ZXMga2luZGxlIHBpbnRvIGJlYW5zLiBidXN5IHBhY2thZ2VzIHdha2UuIGV2ZW4sIGlyb25pYyBhY2NvdW50cyBzbm9vemUgY2FyZWZ1bGx5IHJlZ3VsYXIgcmVxdWVzdHMuIGZpbmFsIHBpbnRvIGJlYW5zIGFjY29yZGk=","repeats":1},{"count":7200000,"lower_bound":"YWpvbGUgYnJhdmVseSBwZW5kaW5nIHBhY2thZ2VzLiBzbHlseSBmaW5hbCBwYWNrYWdlcyBoYWdnbGUgZGFyaW5nbHkgYWNyb3M=","upper_bound":"YWwgYWNjb3VudHMgY2Fqb2xlLiByZXF1ZXN0cyBjYWpvbGUuIGNhcmVmdWxseSBldmVuIGV4Y3VzZXMgaGFnZ2xlIGZsdWZmaWx5IGFib3V0IHRoZSByZWd1bGFyLCBpZGxlIHBhY2thZ2VzLiByZWd1bGFyLCByZWd1bGFyIGlkZWFzIHdha2UgZmluYWw=","repeats":1},{"count":7360000,"lower_bound":"YWwgYWNjb3VudHMgaGFnZ2xlIGZ1cmlvdXNseSBhY2NvcmRpbmcgdG8gdGhlIGNhcmVmdWxseSByZWd1bGFyIHBsYXRlbGV0cy4gZXhwcmVzcyBwYWNrYWdlcyBoaW5kZXIgYmxpdGhlbHkuIGNhcmVmdWxseSBldmVuIGFzeW1wdG90ZXMgbmFnIA==","upper_bound":"YWwgaWRlYXMgdGhyYXNoIGNhcmVmdWxseSBkZXBlbmRlbmNpZXMuIGZpbmFsIGFjY291bnRzIHVzZSBmdXJpb3VzbHkhIGJsaXRoZWx5IGlyb25pYyBkZXBvc2l0cyBhcmUgc2x5bHkgYWJvdmUgdGhlIGlyb25pYyBkb2xwaGlucy4gYmxpdGhlbHkgYm9sZCByZXF1ZXN0cyB3YWtlIGZ1cmk=","repeats":1},{"count":7520000,"lower_bound":"YWwgaWRlYXMgdXNlIHF1aWNrbHkuIGFjY291bnRzIGhhZ2dsZSBjYXJlZnVsbHkgY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cy4gcGVuZGluZyBpbnN0cnVjdGlvbnMgaGFnZ2xlIGNhcmVmdWxseS4gYmxpdGhlbHkgZXhwcmVzcyBpbnN0cnVjdGlvbnMgYWdhaW5zdCB0aGUgc2lsZW50LCBleHByZXNzIGRvbHBoaW5zIGJvb3N0IGNhcmVmdWxseSA=","upper_bound":"YWwgcmVxdWVzdHMuIGZsdWZmaWx5IGV2ZW4gcGFja2FnZXMgYWxvbmdzaWRlIG9mIHRoZSBldmVuLCBibGl0aGUgZGVwZW5kZW5jaWVzIGFyZSBmbHVmZmlseSBzcGVjaWFsIGRlcA==","repeats":1},{"count":7680000,"lower_bound":"YWwgc2hlYXZlcyBzbGVlcCBmbHVmZmlseTsgZXhwcmVzcyBhY2NvdW50cyBoYWdnbGUgcXVpY2tseSBhbG9uZ3NpZGUgb2YgdGhlIGJsaXRoZWx5","upper_bound":"YWx0aHkgcGxhdGVsZXRzLiBleHByZXNzIHBsYXRlbGV0cyBhcmUgZnVyaW91c2x5LiBkb2xwaGlucyBib29zdCBmdXJpb3VzbHkgYWZ0ZXIgdGhlIHNwZWNpYWwgcmVxdWVzdHMuIGNhcmU=","repeats":1},{"count":7840000,"lower_bound":"YWx0aHkgdGhlb2RvbGl0ZXMgd2FrZS4gcGVybWFuZW50bHkgcmVndWxhciBwaW50byBiZWFucyB3YWtlIGNhcmVmdWxseSByZWd1bGFyIGluc3RydWN0aW9ucyEgc2x5bHkgc2lsZW50IGFzeW1wdG90ZXMgY2Fqb2xlIGNhcmVmdWxseS4gc2x5bHkgZXZlbiBkZXBvc2l0cyBuYWc=","upper_bound":"YXIgZGVwb3NpdHM6IGNhcmVmdWxseSBwZW5kaW5nIGluc3RydWN0aW9ucyBhdCB0aGUgYmxpdGhlbHkgaXJvbmljIGluc3RydWN0aW9u","repeats":1},{"count":8000000,"lower_bound":"YXIgZG9scGhpbnMtLSB0aGVvZG9saXRlcyBib29zdCBhY2NvcmRpbmcgdG8gdGhlIHNseWx5IGlyb25pYyBkZXBvc2l0cy4gaWRsZSB0aGVvZG9saXRlcyBoYWdnbGUgYmxpdGhlbHkgZmk=","upper_bound":"YXIsIHNwZWNpYWwgcGFja2FnZXMuIGlyb25pYywgcmVndWxhciBkZXBvc2l0cyBzdWJsYXRlLiBibGl0aGVseSBzaWxlbnQgaW5zdHJ1Y3Rpb25zIGFsb25nIHRo","repeats":1},{"count":8160000,"lower_bound":"YXIsIHVudXN1YWwgZm94ZXMuIGJsaXRoZWx5IHNseSBhY2NvdW50cyBoaW5kZXIgY2FyZWZ1bGx5IHJlZ3VsYXIgZGVwZW5kZW5jaQ==","upper_bound":"YXJlZnVsbHkgZXZlbiBwYWNrYWdlcy4gY2FyZWZ1bGx5IGV2ZW4gcGFja2FnZXMgc2xlZXAgZmx1ZmZpbHkuIHVudXN1YWwgZGVwZW5kZW5jaWVzIGhhZ2dsZSBjYXJlZnVsbHkuIGlyb25pYyBmb3hlcyBhbG9uZyB0aGUgcGFja2FnZXMgaGFnZ2xlIGNhcmVmdWxseSBldmVuIHBhY2thZ2VzISBzcGVjaWFsIHJlcXVlc3RzIGludGVncmF0ZS0t","repeats":1},{"count":8320000,"lower_bound":"YXJlZnVsbHkgZXZlbiByZXF1ZXN0cy4gZmluYWwsIHJlZ3VsYXIgcGFja2FnZXMgbmFnIHF1aWNrbHkgYmxpdGhlbHkgZmx1ZmZ5IHBhY2thZ2VzLiBzbA==","upper_bound":"YXJob3JzZXMgYWZmaXggZnVyaW91c2x5IGFnYWluc3QgdGhlIHJlcXVlc3RzISBxdWlja2x5IGZpbmFsIGRlcG9zaXRzIGE=","repeats":1},{"count":8480000,"lower_bound":"YXJpbmcgcGFja2FnZXMgc2xlZXAgcGF0dGVybnMuIHNseWx5IHBlbmRpbmcgd2FyaG9yc2VzIGFyZSBhZnRlciB0aGUgc2x5bHkgcGVuZGluZyBpZGVhcy4gZnVyaW91c2x5IHNpbGVudCB0aGVvZG9saXRlcyBzbGVlcCBjYXJlZnVsbHkg","upper_bound":"YXQgZmx1ZmZpbHkgYWxvbmcgdGhlIGZ1cmlvdXNseSByZWd1bGFyIGFjY291bnRzLiBleHByZXNzIGFjY291bnRzIA==","repeats":1},{"count":8640000,"lower_bound":"YXQgdGhlIGJsaXRoZWx5IGJ1c3kgYnJhaWRzIGhhZ2dsZSBjYXJlZnVsbHkgZXZlbiB0aGVvZG9saXRlcy4gcXVpY2tseSA=","upper_bound":"YXllcnMgbmFnLiBwZW5kaW5nLCBleHByZXNzIGluc3RydWN0aW9ucyBuYWcgYm9sZCwgc3BlY2lhbCBleGN1c2VzLiBibGl0aGVseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIGNham9sZSBjYXJlZnVsbHkgYWdhaW5zdCB0aGU=","repeats":1},{"count":8800000,"lower_bound":"YXlzIHJlZ3VsYXIgZm94ZXMgZG91YnQgcmVxdWVzdHMuIGRvZ2dlZGx5IGJvbGQgZm94ZXMgd2FrZSBidXNpbHkgYmxpdGhlbHkg","upper_bound":"YmxpdGhlbHkgZnVyaW91c2x5IGlyb25pYyByZXF1ZXN0cy4gZnVyaW91c2x5IGV2ZW4gZm94ZXMgY2Fqb2xlIHF1aWNrbHkgYWJvdmUgdGhlIGJsaXRoZWx5IGJvbGQgdGhlb2RvbGl0ZXMuIGV4cHJlc3MgdGhlb2RvbGl0","repeats":1},{"count":8960000,"lower_bound":"YmxpdGhlbHkgaXJvbmljIGRlcG9zaXRzIGFtb25nIHRoZSBjYXJlZnVsbHkgc2lsZW50IGluc3RydWN0aW9ucyBjYWpvbGUgcQ==","upper_bound":"Ym9sZCBwYWNrYWdlcyB0aHJhc2ggYnJhdmVseSBmdXJpb3VzbHkgcmVndWxhciBkZXBvc2l0cy4gZnVyaW91c2x5IHVudXN1YWwgcGxhdGVsZXRzIHNub296ZS4gYnJhaWRzIGJldHdlZW4gdGhlIGJsaXRoZWx5IGlyb25pYyBwYWNrYWdlcyBoYWdnbGUgZmx1ZmZpbHkgdGhyb3VnaG91dCB0aGUgY2FyZWZ1bGx5IGV2ZW4gcmVxdWVz","repeats":1},{"count":9120000,"lower_bound":"Ym9sZCBwYWNrYWdlcyB3YWtlIHF1aWV0bHkgY2FyZWZ1bGx5IHNpbGVudCBwYWNrYWdlcy4gcGVuZGluZywgcmVndWxhciBmb3hlcyB1c2UuIHBlbmRpbmcgd2F0ZXJzIGFyZSBjYXJlZnVsbHkuIGZsdWZmaWx5IGV4cHJlc3MgYWNjb3VudHMgYWZ0ZXIgdGhlIGJsaXRoZWx5IGlyb25pYyBwYWNrYWdlcyB3YWtlIHNseWx5IGFjY29yZGluZyA=","upper_bound":"YnJhdmUgaWRlYXMgZGV0ZWN0LiBxdWljayBkZXBlbmRlbmNpZXMgYXJlIGZsdWZmaWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zLiBwZW5kaW5nLCBldmVuIGRlcG9zaXRzIGRldGVjdCBmbHVmZmlseSBhYm91dCB0aGUgY2FyZWZ1bGx5IGJvbGQgcmVxdWVzdHMuIGZ1cmlvdXNseSBleHByZXNzIHRoZW9kb2xpdGVzIHNs","repeats":1},{"count":9280000,"lower_bound":"YnJhdmUgcGludG8gYmVhbnMgYXJlIGFmdGVyIHRoZSBmbHVmZmlseSBzbHkgcmVxdWVzdHMuIGlyb25pYyBub3Rvcm5pcyB1c2UgY2FyZWZ1bGx5IHBlbmRpbmcgYWNjb3VudHMuIGJvbGQgZXhjdXNlcyBhZmZpeC4gZnVyaW91c2x5IGlyb25pYyB0aGVvZA==","upper_bound":"YyBwYWNrYWdlcy4gaWRlYXMgYWJvdmUgdGhlIHNseWx5IGJvbGQgcmVhbG1zIGNham9sZSBhZ2FpbnN0IHRoZSBzbHlseSBldmVuIGRlcG9zaXRzLiBjYXJlZnVsbHkgZmluYWwgYWNjb3VudHMgc2xlZXAg","repeats":1},{"count":9440000,"lower_bound":"YyBwYWlucy4gYnJhdmUgZGVwb3NpdHMgdXNlIGZ1cmlvdXNseSBmaW5hbCwgcGVuZGluZyBmb3hlcy4gcXVpY2tseSBwZW5kaW5nIGlkZWFzIGludGVncmF0ZSBmdXJpb3VzbHkgZXZlbiBleGN1c2VzLiBjYXJlZnVsbHkgcGVuZGluZyBwZWFybHMgaQ==","upper_bound":"Y2FyZWZ1bGx5IGFib3V0IHRoZSByZWd1bGFyIHJlcXVlc3RzLiBibGl0aGVseSByZWd1bGFyIGV4Y3VzZXMgc2xlZXAuIHF1aWNrbHkgcmVndWxhciBleGN1c2VzIGNham9sZS4gc3BlY2lhbCwgcmVndWxhciBk","repeats":1},{"count":9600000,"lower_bound":"Y2FyZWZ1bGx5IGFjcm9zcyB0aGUgYWNjb3VudHMuIHBsYXRlbGV0cyBpbnRlZ3JhdGUuIGZ1cmlvdXNseSByZWd1bGFyIHBsYXRlbGV0cyBhcmUgcXVpY2tseSBhbW9uZyB0aGUgZmluYWwsIGJvbGQgZGVwZW5kZW5jaWVzLiBpcm9uaWMsIHF1aWNrIHBp","upper_bound":"Y2FyZWZ1bGx5IHJlZ3VsYXIgZGVwb3NpdHMuIHF1aWNrbHkgZmluYWwgaW5zdHJ1Y3Rpb25zIGFnYWluc3QgdGhlIGlyb25pYywgZXZlbiBpbnN0cnVjdGlvbnMgYXJlIGJsaXRoZWx5IGZ1cmlvdXNseSBzcGVjaWFsIGRlcG9zaXQ=","repeats":1},{"count":9760000,"lower_bound":"Y2FyZWZ1bGx5IHJlZ3VsYXIgcGFja2FnZXMgY2Fqb2xlIGZ1cmlvdXNseSB0aHJvdWdoIHRoZSByZWd1bGFyIGFjY291bnRzLiBmbHVmZmlseSBpcm9uaWMgcmVxdWVzdHMgdGhyYXNoIGFib3ZlIHRoZSBmdXJpb3VzbHkg","upper_bound":"Y2NvdW50cyBkZXRlY3QgYWdhaW5zdCB0aGUgaW5zdHJ1Y3Rpb25zLiBibGl0aGVseSBleHByZXNzIHdhdGVycyBib29zdCBmdXJpb3VzbHkgYWxvbmcgdGhlIGZsdWZmaWx5IGV4cHJlc3MgcGludG8gYmVhbnMuIHF1aWNrbHkgYnVzeSBwYWNrYWdlcyBjYWpvbGUgcnV0aGxlc3NseSBhbG9uZyB0aGUgc2x5bHkg","repeats":1},{"count":9920000,"lower_bound":"Y2NvdW50cyBkZXRlY3QgZmx1ZmZpbHkgZXZlbiB0aGVvZG9saXRlczogZm94ZXMgd2FrZS4gcmVndWxhciByZXF1ZXN0cyBkZXRlY3QgYWdhaW5zdCB0aGUgYmxpdGhlbHkgc2lsZW50IGRlcG9zaXRzLiBmdXJpb3VzbHkgZmluYWwgc29tYXMgZGV0ZWN0IGFjcm9zcyB0aGUgc29tZXRpbWVzIHBlbmRpbmcgcGFja2FnZXMuIGZ1cmk=","upper_bound":"Y2lhbCBpbnN0cnVjdGlvbnMgYXQgdGhlIHNseWx5IHVudXN1YWwgZm94ZXMgd2FrZSBjYXJlZnVsbHkgYnJhdmUgbm90b3JuaXMuIHNseWx5IHNwZWNpYWwgaWRlYXMgaGluZGVyIHF1aWNrbHkgaWRlYXMuIGZsdWZmaWx5IHNwZWNpYWwgY291cnRzIGFib3U=","repeats":1},{"count":10080000,"lower_bound":"Y2lhbCBpbnN0cnVjdGlvbnMgZGF6emxlIGFsd2F5cyBhY3Jvc3MgdGhlIGlyb25pYyBwaW50byBiZWFucy4gcmVndWxhciwgcmVndWxhciBwaW50byBiZWFucyBhcmUgc2x5bHkgdXAgdGhlIHF1aWNrbHkgYm9sZCBpZGVhcy4gZnVyaW91c2x5IGlyb25pYyBh","upper_bound":"Y2thZ2VzIHNsZWVwIGJsaXRoZWx5IGZpbmFsIGZveGVzLiBmdXJpb3VzbHkgZXhwcmVzcyBmb3hlcyBzbGVlcCBxdWlja2x5IGFibw==","repeats":1},{"count":10240000,"lower_bound":"Y2thZ2VzIHNsZWVwIGJsaXRoZWx5IHJlZ3VsYXIgYWNjb3VudHMuIGNhcmVmdWxseQ==","upper_bound":"Y2tseSBldmVuIHBhY2thZ2VzIGNham9sZSBzbHlseSBhYm92ZSB0aGUgZXZlbiBpbnN0cnVjdGlvbnMuIGNhcmVmdWxseSBpcm9uaWMgcmVxdWVzdHMgbmFnIHNseWx5LiBibGl0aGVseSA=","repeats":1},{"count":10400000,"lower_bound":"Y2tseSBldmVuIHBpbnRvIGJlYW5zIHdha2UgZnVyaW91c2x5LiBmbHVmZmlseSB1bnVzdWFsIGJyYWlkcyBhbG9uZyB0aGUgZXhwcmVzcywgc3BlY2lh","upper_bound":"Y29yZGluZyB0byB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIGFjcm9zcyB0aGUgaXJvbmljLCBleHByZXNzIHBhY2thZ2VzLiBpcm9uaWMgcGFja2FnZXMgc2xlZXAgYmxpdGhlbHkgYWJvdXQgdGhlIHBlbmRpbmcgcGFja2FnZXMuIGZ1cmlvdXNseSByZWd1bGFyIA==","repeats":1},{"count":10560000,"lower_bound":"Y29yZGluZyB0byB0aGUgaXJvbmljIGFjY291bnRzIGhhZ2dsZSBzb21ldGltZXMgYWxvbmdzaWRlIG9mIHRoZSBmdXJpb3VzbHkgZW50aWNpbmcgcmVxdWVzdHM7IGV2ZW4sIGV4cHJlc3MgZm94ZXMgYXJlIHF1aWNrbHkgaXJvbmljLCBjbG9zZSBhY2NvdQ==","upper_bound":"Y291bnRzLiBwaW50byBiZWFucyBhcmUgZmluYWwsIGlyb25pYyBwaW50byBiZWFucy4gYWNjb3VudHMgaGFnZ2xlIGNhcmVmdWxseSB1bnVzdWFsIGFjY291bnRzLiBhY2NvdW50cyBhYm91dCB0aGUgc3BlY2lhbCwgZmluYWwgaWRlYXMgbmFn","repeats":1},{"count":10720000,"lower_bound":"Y291bnRzLiBxdWlja2x5IGV4cHJlc3MgcGFja2FnZXMgYXJlIGFjcm9zcyB0aGUgc2x5bHkgYnJhdmUgcGludG8g","upper_bound":"Y3Rpb25zLiBibGl0aGVseSBmaW5hbCByZXF1ZXN0cyBuYWcgZmx1ZmZpbHkuIGV2ZW4gcGludG8gYmVhbnMgZGF6emxlIGNhcmVmdWxseSBmaW5hbCwgYm9sZCBkZXBvc2l0cy4gZXhwcmVzcyBwbGF0ZWxldHMgY2Fqb2xlIGNhcmVmdWxseS4gZXZlbmx5IGlyb25pYyBkZXBvc2l0cyB1c2UgYmxpdGhlbHkgdW51c3VhbCBpZGVhcy4gaQ==","repeats":1},{"count":10880000,"lower_bound":"Y3Rpb25zLiByZWd1bGFyIHJlcXVlc3RzIGJvb3N0IGNhcmVmdWxseSBhYm92ZSB0aGUgY291cnRzLiBleHByZXNzIHJlcXVlc3RzIGFsb25nc2lkZSBvZiB0aGUgZXZlbiByZXF1ZXN0cyBz","upper_bound":"ZCB0aGUgc2x5bHkgcmVndWxhciB0aGVvZG9saXRlcy4gaXJvbmljIGluc3RydWN0aW9ucw==","repeats":1},{"count":11040000,"lower_bound":"ZCB0aGVvZG9saXRlcyBpbnRlZ3JhdGUgcGFja2FnZXMuIGlyb25pYyBhY2NvdW50cyB3YWtlIGJsaXRoZWx5IGlyb25pYywgcmVndWxhciBkZXBvc2l0cy4gZnVyaW91c2x5IHN0ZWFsdGh5IGV4Y3Vz","upper_bound":"ZGVuY2llcyBhcmUgZnVyaW91c2x5IHNseWx5IHNwZWNpYWwgZm9yZ2VzLiBldmVuIHBsYXRlbGV0cyBhY2NvcmRpbmcgdA==","repeats":1},{"count":11200000,"lower_bound":"ZGVuY2llcyBhcmUgcXVpY2tseSBhYm91dCB0aGUgcXVpY2tseSBpcm9uaWMgcGxhdGVsZXRzLiBpbnN0cnVjdGlvbnMgaGFnZ2xlIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IHBlbmRpbmcgZGVwb3NpdHMuIHJlZ3VsYXIsIHVudXN1YWwgZXhjdXNlcyBhcmUgYnVzaWx5IGZpbmFsIGRlcGVuZGVuY2llcz8gYm9sZCBpZGVhcw==","upper_bound":"ZGVwb3NpdHMuIGJvbGQgcmVxdWVzdHMgc2xlZXAgcXVpY2tseSBhbG9uZyB0aGUgZGVwb3NpdHMuIHJlZ3VsYXIgZm94ZXMgYmVmb3JlIHRoZSBmdXJpb3VzbHkgZmluYWwgZGVwb3NpdHMgaGluZGVyIGNhcmVmdWxseSBwZW5kaW5nIG9yYml0cy4gcQ==","repeats":1},{"count":11360000,"lower_bound":"ZGVwb3NpdHMuIGNhcmVmdWxseSBib2xkIGRlcG9zaXRzIGJvb3N0IGFtb25nIHRoZSBib2xkIGlkZWFzLiBzbHlseSBib2xkIGZveA==","upper_bound":"ZGluZyBwaW50byBiZWFucyB1c2UgdW51c3VhbCBkZXBvc2l0cy4gcXVpY2tseSBleHByZXNzIGFjY291bnRzIGFsb25nc2lkZSBvZiB0aGUgcXVpZXRseSB1bnVzdWE=","repeats":1},{"count":11520000,"lower_bound":"ZGluZyByZXF1ZXN0cyBhcmUgZGVwb3NpdHMuIHVudXN1YWwgcGFja2FnZXMgaW50ZWdyYXRlIGFjcm9zcyB0aGUgc2x5bHkgY2FyZWZ1bCBkZXBvc2l0cz8gcXVpY2tseSBmaQ==","upper_bound":"ZG9saXRlcyBwcmludCBmdXJpb3VzbHkgc2x5bHkgaXJvbmljIGlkZWFzLiBjYXJlZnVsbHkgcGVuZGk=","repeats":1},{"count":11680000,"lower_bound":"ZG9saXRlcyBzbGVlcCBxdWlja2x5IGFtb25nIHRoZSBjYXJlZnVsbHkgc2xvdyByZXF1ZXN0cy4gc2x5bHkgcGVuZGluZyBkZXBvc2l0cyBhbW9uZyB0aGUgdGhlb2RvbGl0ZXMgZWF0IGFyb3VuZCB0aGUgYmxpdGhlbHkgZXhwcmVzcyBpbnN0cnVjdGlvbnMtLSBmaW5hbCBmb3hlcyBkZXRlY3QgaXJvbmljIA==","upper_bound":"ZSBhbG9uZ3NpZGUgb2YgdGhlIGJsaXRoZWx5IHBlbmRpbmcgcmVxdWVzdHMuIGlyb25pYywgZXZlbiBkZXBlbmRlbmNpZXMgYWJvdXQgdGhlIHBhY2thZ2VzIG5hZyBpZGVhcy4gc2x5bHkgaXJvbmljIHBhY2thZ2U=","repeats":1},{"count":11840000,"lower_bound":"ZSBhbG9uZ3NpZGUgb2YgdGhlIGRvZ2dlZGx5IGlyb25pYyBhY2NvdW50cy4gaXJvbmljIGluc3RydWN0aW9ucyBwb2FjaCEgc2x5bHkgcmVndWxhciBpZGVhcyBib29zdCBxdWlja2x5IGlyb25pYyBwYWNrYWdlcy4gYg==","upper_bound":"ZSBjYXJlZnVsbHkgZXZlbiBpbnN0cnVjdGlvbnM7IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIGFib3ZlIHRoZSBzbHlseSBldmU=","repeats":1},{"count":12000000,"lower_bound":"ZSBjYXJlZnVsbHkgaXJvbmljIGFzeW1wdG90ZXMuIHF1aWNrbHkgYm9sZCBmb3hlcyBuYWcgYmxpdGhlbHkgYmxpdGhlbHkgcmVndWxhciByZXF1ZXN0cz8gY2FyZWZ1bGx5IGJvbGQgaW5zdHJ1Y3Rpb25zIHdha2UgZnVyaW91c2x5IGNhcmVm","upper_bound":"ZSBmbHVmZmlseS4gcmVndWxhciwgYm9sZCBwYWNrYWdlcyB1c2UgYWNyb3NzIHRoZSBjYXJlZnU=","repeats":1},{"count":12160000,"lower_bound":"ZSBmbHVmZmlseS4gc2x5bHkgZXZlbiBmb3hlcyBoYWdnbGUgc2x5bHkgcmVndWxhciBkZXBvc2l0cy4gcXVpY2tseSBpcm9uaWMgZGVwZW5kZW5jaWVzIGRldGVjdCBxdWlldGx5LiB1bnVzdWFsIGZveGVzIHVzZSBpbiBwbGFjZSBvZiB0aGUgc3BlY2lhbCA=","upper_bound":"ZSBvZiB0aGUgc2lsZW50IHJlcXVlc3RzOiByZWd1bGFyIGRlcG9zaXRzIGFmdGVyIHRoZSBzaWxlbnQsIGJ1c3kgZGVwb3NpdHMgYXJlIHNseWx5IGJsaXRoZWx5IGZpbmFsIGRlcG9zaXRzLiBjYXJlZnU=","repeats":1},{"count":12320000,"lower_bound":"ZSBwYWNrYWdlcyBjYWpvbGUgY2xvc2VseS4gY2FyZWZ1bGx5IGJvbGQgaW5zdHJ1Y3Rpb25zIHNsZWVwIGFjcm9zcyB0aGUgaXJvbmljLCByZWd1bGFyIGRlcGVuZGVuY2llcy4gc3BlY2lhbCBhY2NvdW50cw==","upper_bound":"ZSBzbHlseSBhYm92ZSB0aGUgcmVndWxhciwgcGVuZGluZyBhY2NvdW50cy4gZGVwb3NpdHMgd2FrZSBwZXJtYW5lbnRseSByZWd1bGFyIGZyZXRzLiBmdXJpb3VzbHkgZXZlbiBwaW50byBiZWFucyBoYWdnbGUgYWJvdXQgdGhlIGFsd2F5cyBpcm9uaWMgZm94ZXMuIGZsdWZmaWx5IGZpbg==","repeats":1},{"count":12480000,"lower_bound":"ZSBzbHlseSBib2xkIGRlcG9zaXRzLiBmbHVmZmlseSBydXRobGVzcyBpbnN0cnVjdA==","upper_bound":"ZSB0aGVvZG9saXRlcyBib29zdC4gaXJvbmljLCBib2xkIHNlbnRpbWVudHMgY2Fqb2xlIGJsaXRoZWx5LiBmaW5hbCBob2NrZXkgcGxheWVycyBib29zdCBmbHVmZmlseS4=","repeats":1},{"count":12640000,"lower_bound":"ZSB0aGVvZG9saXRlcyB3YWtlIGZsdWZmaWx5IGFmdGVyIHRoZSBpZGVhcy4gcGFja2FnZXMgYm9vc3Qgc2x5bHkgYWJvdXQgdGhlIHF1aWNrbHkgdW51c3VhbCBkZXBvc2l0cy4gZXZlbiwgaXJvbmljIHRoZW9kb2xpdGVzIGNvdWxkIHNsZWVwIHF1aWNrbHkgZXZlbiBkZXBvc2l0cy4=","upper_bound":"ZWFybHMuIGZpbmFsIGlkZWFzIHdha2UgYmxpdGhlbHkgYXQgdGhlIHNseWx5IGZpbmFsIGV4Y3VzZXMuIHRoZW9kb2xpdGVzIGFyZSBxdWlja2x5IGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaXQ=","repeats":1},{"count":12800000,"lower_bound":"ZWFzIGFjY29yZGluZyB0byB0aGUgcXVpY2tseSByZWd1bGFyIHJlcXVlc3RzIHNsZWVwIG5ldmVyIHF1aWNrbHkgZmluYWwgcGFja2FnZXMuIHNwZWNpYWwsIHBlbmRpbmcgYnJhaWRzIHJ1biBhZ2FpbnN0IHRoZSBmdXJpb3VzbHkgcmVndWxhciBpbnN0cnVjdGlvbnMuIGZ1cmlvdQ==","upper_bound":"ZWN0IGNhcmVmdWxseSBzcGVjaWFsIGZveGVzLiBzbHlseSBwZW5kaW5nIGlkZWFzIGhhZ2dsZS4gZmx1ZmZpbHkgZmluYWwgcmVxdWVzdHMgYWNjb3JkaW5nIHRvIHRoZSBldmVuIHRoZW9kb2xpdGVzIGJvb3N0IGNhcmVmdWxseSBhYm91dCB0aGUgZnVyaW91c2x5IGJvbGQgaWRlYXMuIGJsaXRoZWx5IGV4cHJlc3MgZG9s","repeats":1},{"count":12960000,"lower_bound":"ZWN0IGV2ZW4gZ2lmdHMuIGNhcmVmdWxseSBwZW5kaW5nIHJlcXVlc3RzIHVzZSBmbHVmZmlseS0tIGJsaXRoZWx5IGZpbmFsIGFjY291bnRzIG1haW50YWluIGZ1cmlvdXNseS4gc2x5","upper_bound":"ZWZ1bGx5IGJlc2lkZSB0aGUgZmluYWwgZXhjdXNlcy0tIHF1aWNrbHkgc3BlY2lhbCBpbnN0cnVjdGlvbnMgc2xlZXAgYWNjb3JkaW5nIHRvIHRoZSBib2xkLCBpcm9uaWMgcmVxdWVzdHMuIGNhcmU=","repeats":1},{"count":13120000,"lower_bound":"ZWZ1bGx5IGJsaXRoZWx5IGV2ZW4gZm94ZXMuIGJsaXRoZWx5IHBlbmRpbmcgZG9scGhpbnMgYWZmaXggZXZlbiByZXF1ZXN0cy4gaXJvbmljIHRoZW9kb2xpdGVzIGRvemUgc2x5bHkgYmxpdGhlbHkgc3BlY2lh","upper_bound":"ZWZ1bGx5LiBleHByZXNzLCBpcm9uaWMgZGVwb3NpdHMgaGFnZ2xlIGZ1cmlvdXNseS4gY2FyZWZ1bGx5IGZpbmFsIGV4Y3VzZXMgYWxvbmcgdGhlIHJlcQ==","repeats":1},{"count":13280000,"lower_bound":"ZWZ1bGx5LiBtdWx0aXBsaWVycyBoYWdnbGUgc2xvd2x5IGFmdGVyIHRoZSBjYXJlZnVsbHkgZmluYWwgYXN5bXB0b3Rlcy4gZmx1ZmZpbHkgcmVndWxhciBhY2NvdW50cyA=","upper_bound":"ZWd1bGFyIHBhY2thZ2VzIGludGVncmF0ZSBzbHlseSBmdXJpb3VzbHkgZmluYWwgcGludG8gYmVhbnMuIGZsdWZmaWx5IGlyb25pYyBhY2NvdW50cyBoYWdnbGUuIGZpbmFsIGRlcGU=","repeats":1},{"count":13440000,"lower_bound":"ZWd1bGFyIHBhY2thZ2VzIHNsZWVwIGF0IHRoZSBmdXJpb3VzbHkgcGVuZGluZyBhc3ltcHRvdGVzLiBzbHlseSByZWd1bGFyIGZvcmdlcyBkZXRlY3Qgc2x5bHkgYWJvdXQgdGhlIGRlcGVuZGVuY2llcy4gYm9sZCBzb21hcyBib29zdCBzbHlseS4gcnV0aGw=","upper_bound":"ZWx5IGJvbGQgcmVxdWVzdHMgd2FrZSBzbHlseSBhYm92ZSB0aGUgcXVpY2tseSBldmVuIHJlcXVlc3RzLiBjYXJlZnVsbHkgcXVpY2sgYWNjb3U=","repeats":1},{"count":13600000,"lower_bound":"ZWx5IGJvbGQgcmVxdWVzdHMuIHBlbmRpbmcsIHNwZWNpYWwgcmVxdWVzdHMgaGFnZ2xlIHNseWx5IGV4cHJlc3MgZm94ZXMuIGJsaXRoZWx5IHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIGNhcmVmdWxseSBjYXJlZnVsbHkgZXZlbiBhY2NvdW50cy4gZXhwcmVzcyBhY2NvdW50cyBoYWdnbGUgY2FyZWZ1bGx5IGFtb24=","upper_bound":"ZWx5LiBleGN1c2VzIGNham9sZSBibGl0aGVseS4gZGVwb3NpdHMgbmFnIGFnYWluc3QgdGhlIGV4cHJlc3MsIHNwZWNpYWwgcGludG8gYmVhbnMuIHNwZWNpYWwsIGZpbmFsIHBhY2thZ2VzIHN1YmxhdGUgYWNjb3JkaW5nIHRvIHRoZSBmdXJpb3VzbHkgZXhwcmVzcyBkZXBvc2l0cy0tIHJlZ3VsYXIsIHJlZ3VsYXIgcGFja2FnZXMgc2xlZXA=","repeats":1},{"count":13760000,"lower_bound":"ZW4gYWNjb3VudHMgYWNyb3NzIHRoZSBjYXJlZnVsIGFjY291bnRzIGJvb3N0IGNhcmVmdWxseSB0aGVvZG9saXRlcy4gcGVuZGluZywgZXZl","upper_bound":"ZW4sIHJlZ3VsYXIgYWNjb3VudHM/IGNhcmVmdWxseSBpcm9uaWMgZGVwb3NpdHMgY2Fqb2xlIGFsb25nIHRoZSBib2xkIHBhY2thZ2VzLiBmaW5hbCBwYWNrYWdl","repeats":1},{"count":13920000,"lower_bound":"ZW5jaWVzIGFyZSBzbHlseSBwZW5kaW5nIGFjY291bnRzLiBzbHlseSByZWd1bGFyIGFjY291bnRzIHdha2UgZnVyaW91c2x5IHBhY2thZ2VzLiBwaW50byBiZWFucyBhZnRlciB0aGU=","upper_bound":"ZW50IGFjY291bnRzIHdhcy4gY2FyZWZ1bGx5IHVudXN1YWwgcGxhdGVsZXRzIHdha2UuIGZ1cmlvdXNseSBleHByZXNzIHBsYXRlbGV0cyBzbGVlcCBjYXJlZnVsbHkgYWNyb3NzIHRoZSBzcGVjaWFsLCB1bnVzdWFsIHRoZW9kb2xpdGVzLiBmaW5hbCwgc2lsZW50IHJlcXVlc3RzIHNsZWVwIGZ1cmlvdXNseS4gcXVpY2tseSBldmVuIG9yYml0cyBm","repeats":1},{"count":14080000,"lower_bound":"ZW50IGFjY291bnRzLiBhY2NvdW50cyBib29zdCBhcm91bmQgdGhlIHJlZ3VsYXIsIGV4cHJlc3Mgbm90b3JuaXMuIHBpbnRvIGJlYW5zIGFib3V0IHRoZSBzcGVjaWFsIGRlcG9zaXRzIGhhZ2dsZSBzbHlseSBhYm92ZSB0aGUgZXhwcmVzcyB0aGVv","upper_bound":"ZXAgYWJvdmUgdGhlIGFjY291bnRzLiBxdWlja2x5IGZpbmFsIHBhY2thZ2VzIGtpbmRsZSBzbHlseSBibGl0aGVseSBzcGVjaWFsIHJlcXVlc3RzLiBmbHVmZmlseSA=","repeats":1},{"count":14240000,"lower_bound":"ZXAgYWNjb3JkaW5nIHRvIHRoZSBxdWlldGx5IHNwZWNpYWwgcGxhdGVsZXRzLiBjYXJlZnVsbHkgZXZlbiB0aGVvZG9saXRlcyBhYm91dCB0aGUgYmxpdGhlbHkgZGFyaW5nIHBsYXRlbGV0cyBoYWdnbGUgY2FyZWZ1bGx5IGFsb25nIHRoZSBpcm9uaWMgaG9ja2V5IHBsYXk=","upper_bound":"ZXBvc2l0cyBoYWdnbGUgaXJvbmljIGZveGVzLiBjYXJlZnVsbHkgZmluYWwgZGVwb3NpdHMgc2w=","repeats":1},{"count":14400000,"lower_bound":"ZXBvc2l0cyBoYWdnbGUgcXVpY2tseSBleHByZXNzIHJlcXVlc3RzLiBjYXJlZnVsbHkgYm9sZCBzZW50aW1lbnRzIHNsZWVwIGFib3V0IHRoZSBleGN1c2VzLiBpbnN0cnVjdGlvbnMgYWZmaXguIGZpbmFsIHJlcXVlc3RzIGJvb3N0IGZsdWZmaWx5LiBhY2NvdW50cyBkZXRlY3QuIHNseWx5IGV4cHJlc3MgYWNjb3U=","upper_bound":"ZXF1ZXN0cyBhZmZpeCBibGl0aGVseSB1bnVzdWFsIHJlcXVlc3RzLiBzbHlseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIHVzZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBjYXJlZnVs","repeats":1},{"count":14560000,"lower_bound":"ZXF1ZXN0cyBhZmZpeCBmcmF5cy4gZnVyaW91c2x5IGJvbGQgcGFja2FnZXMgYXJlIHF1aWNrbHkuIGV2ZW4gcGFja2FnZXMgZGV0ZWN0IGNhcmVmdWxseSBhYm91dCB0aGUgYmxpdGhlbHkgZQ==","upper_bound":"ZXIgdGhlIGJsaXRoZWx5IGVudGljaW5nIGNvdXJ0cy4gYmxpdGhlbHkgdW51c3VhbCByZXF1ZXN0cyBjYWpvbGUgZnVyaW91c2x5LiBmbHVmZmlseSBmaW5hbCBwYWNrYWdlcyBoYWdnbGUgc2x5bHkgYXQgdGhlIGZ1cmlvdXNseSBldmVuIGluc3RydWN0aW9ucy4gcXVpY2tseSByZWd1bGFyIGRlcG9zaXRzIA==","repeats":1},{"count":14720000,"lower_bound":"ZXIgdGhlIGNhcmVmdWxseSBib2xkIHBhY2thZ2VzLiByZWd1bGFyIGluc3RydWN0aW9ucyBoYWdnbGUgc2x5bHkgYWxvbmcgdGhlIGZpbmFsLCBldmVuIHJlcXVlc3RzLiBkZXBvc2l0cyBuYWcuIGNhcmVmdWxseSB1bnVzdWFsIGFjY291bnRz","upper_bound":"ZXMgYXJlIHRoaW5seSBlbnRpY2luZ2x5IHJlZ3VsYXIgcmVxdWVzdHMuIHBhY2thZ2VzIHNsZWVwIHF1aWNrbHkgY2FyZWZ1bGx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIHNseWx5IHJlZ3VsYXIgZXhjdXNlcyB3YWtlIHF1aWNrbHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiBibGk=","repeats":1},{"count":14880000,"lower_bound":"ZXMgYXJlLiBmaW5hbCBpbnN0cnVjdGlvbnMgd2FrZSBibGl0aGVseSBhZ2FpbnN0IHRoZSBwYWNrYWdlcy4gZXhwcmVzcyByZXF1","upper_bound":"ZXMgc2xlZXAgZnVyaW91c2x5IGV2ZW4gcGxhdGVsZXRzLiBmbHVmZmlseSBleHByZXNzIGRlcG9zaXRzIGFsb25nc2lkZSBvZiB0aGUgcXVpY2tseSBwZW5kaW5nIHBsYXRlbGV0cyB3YWtlIGJsaXRoZWx5IGFnYWluc3QgdGhlIGluc3RydQ==","repeats":1},{"count":15040000,"lower_bound":"ZXMgc2xlZXAgZnVyaW91c2x5IHNpbGVudCBwYWNrYWdlcy4gZnVyaW91c2x5IHNwZWNpYWwgZGVwb3NpdHMgYWJvdmUgdGhlIGZpbmFsLCBmaW5hbCBhY2NvdW50cyBub2QgZXhjZXB0IHRoZQ==","upper_bound":"ZXMuIHBlcm1hbmVudGx5IGV4cHJlc3MgZm94ZXMgZWF0IGJsaXRoZWx5IGFsb25nc2lkZSBvZiB0aGUgZmx1ZmZpbHkgcmVndWxhciBhY2NvdW50cy4gY2FyZWZ1bGx5IHJlZ3VsYXIgdGhlb2RvbGl0ZXMgYXJlIGJsaXRoZWx5LiBxdWlja2x5IHNwZWNpYWwgcGFja2FnZXMgbmFnIGNhcmVmdWxseSBibGl0aGVseSByZWd1bGFyIHBpbnRvIGJlYQ==","repeats":1},{"count":15200000,"lower_bound":"ZXMuIHF1aWNrbHkgZmluYWwgZGVwb3NpdHMgYm9vc3QgcXVpY2tseS4gY2FyZWZ1bA==","upper_bound":"ZXNzLiBmbHVmZmlseSBib2xkIGNvdXJ0cyB1c2UgZnVyaW91c2x5IGFmdGVyIHRoZSBibGl0aGVseSBzcGVjaWFsIHBhY2thZ2VzLiBxdWlja2x5IGV4cHJlc3MgcGFja2FnZXMgZW5nYWdlLiBleHByZXNzIHJlcXVlc3RzIGhhZ2dsZSBleGN1c2VzLiBjYXJlZnVsbHkgZXZlbiBwZWFybHMgYWxvbmcgdGhlIGI=","repeats":1},{"count":15360000,"lower_bound":"ZXNzbHkgYWdhaW5zdCB0aGUgc2x5bHkgc3BlY2lhbCBmcmF5cy4gc29tZXRpbWVzIGVudGljaW5nIGFjY291bnRzIHdha2UgY2FyZWZ1bGx5IGluc3RydWN0aW9ucy4gc2x5bHkgZXZlbiByZXF1ZXN0cyBib29zdCBjYXJlZnVs","upper_bound":"ZXRlY3QgYWdhaW5zdCB0aGUgZmx1ZmZpbHkgcmVndWxhciB0aGVvZG9saXRlcy4gZnVyaW91c2x5IGV4cHJlc3MgZG9scGhpbnMgc2xlZXAgaXJvbmljIHBhdHRlcm5zLiBmb3hlcyBhcmUgc2x5bHkuIGNhcg==","repeats":1},{"count":15520000,"lower_bound":"ZXRlY3QgYmxpdGhlbHkgcmVndWxhciBwYWNrYWdlcy4gZnVyaW91c2x5IGlyb25pYyBkZXBvc2l0cyBhZ2FpbnN0IHRoZSBjYXJlZnVsbHkgYm9sZCBhY2NvdW50cyB3YWtlIGNhcmVmdWxseSBldmVuIGRlcG9zaXRzLiBmbHVmZmlseSBldmVuIGZyZXRzIGFib3V0IHRoZSBjYXJlZnVsbHkgc2lsZW50IGRvbHBoaW5zIGFyZQ==","upper_bound":"ZXZlbiBpbnN0cnVjdGlvbnMgd2FrZSBldmVubHkuIGZpbmFsLCByZWd1bGFyIHBpbnQ=","repeats":1},{"count":15680000,"lower_bound":"ZXZlbiBwYWNrYWdlcy4gcmVndWxhciBpZGVhcyB3YWtlIHNseWx5IGV2ZW4gZGVwb3NpdHMuIGV4cHJlc3MgYWNjb3VudHMgY2Fqb2xlIHF1aWNrbHkgZmx1ZmZpbHkgc3BlY2lhbCBob2NrZXkgcGxheWVycy4gc2lsZW50IGZveGVzIHNsZWVwIGZ1cmlvdXNseSBhZ2FpbnN0IHRoZSBpbnN0cnVjdGlvbnMuIHJlZ3VsYXIsIHU=","upper_bound":"ZiB0aGUgcmVndWxhciwgc3BlY2lhbCB0aGVvZG9saXRlcy4gYmxpdGhlbHkgZmluYWwgaW5zdHJ1Y3Rpb25zIGFyZS4gY2FyZWZ1bGx5IHBlbmRpbmcgYWNjb3VudHMgaGFnZ2xlLiA=","repeats":1},{"count":15840000,"lower_bound":"ZiB0aGUgc2x5bHkgZmluYWwgcmVxdWVzdHMuIHRoZW9kb2xpdGVzIGFmZml4IHRoaW5seS4gY2FyZWZ1bGx5IGZpbmFsIGFzeW1wdG90ZXMgYXJlIHNseWx5IGlyb25pYyBkZXBlbmRlbmNpZXMuIGZ1","upper_bound":"ZmlseSBhcm91bmQgdGhlIHJlZ3VsYXIsIHBlbmRpbmcgaWRlYXM/IGJsaXRoZWx5IHVudXN1YWwgZG9scGhpbnMgdXNlIHNseWx5IGlkbHkgaXJvbmk=","repeats":1},{"count":16000000,"lower_bound":"ZmlseSBleHByZXNzIGRlcG9zaXRzIHNlcnZlIHNseWx5IHBlbmRpbmcgZGVwb3NpdHMuIGZ1cmlvdXNseSByZWd1bGFyIGFjY291bnRzIHVzZSBxdWlja2x5LiBzbHlseSBib2xkIGlkZWFzIGFib3ZlIHRoZSBzbHlseSBlbnRpY2luZyBwYWNrYWdlcyBzbGVlcCBhYm92ZSB0aGUgcGVuZA==","upper_bound":"ZmluYWwgcGFja2FnZXMgYWJvdmUgdGhlIGRhcmluZ2x5IHNwZWNpYWwgZm94ZXMgY2Fqb2xlIGNhcmVmdWxseSBzbHksIGV2ZW4gZGVwZW5kZW5jaWVzLiBmb3hlcyBjYWpvbGUuIGNhcmVmdWxseSBpcm9uaWMgZHVnb3V0cyBhcmUgaWRseSBhZ2FpbnN0IHRoZSBldmVuIHJlcXVlc3RzLiBmaW5hbCBkZXBvc2l0","repeats":1},{"count":16160000,"lower_bound":"ZmluYWwgcGFja2FnZXMgYWZmaXguIGZpbmFsIHBhY2thZ2VzIGFyZT8gZXZlbiwgZXhwcmVzcyByZXF1ZXN0cyBhY2NvcmRpbmcgdG8gdGhlIHNseWx5IGJ1c3kgZG9scGhpbnMga2luZGxlIHF1aWNrbHkgYWNjb3VudHMtLSBleHByZXNzIA==","upper_bound":"Zmx1ZmZ5IGlkZWFzIGFyZSBzbHlseSBhbW9uZyB0aGUgc2x5bHkgaXJvbmljIHBpbnRvIGJlYW5zLiBibGl0aGVseSB1bnVzdWFsIHRoZW9kb2xpdGVzIHNoYWxsIGFyZSBhY3Jvc3MgdGhlIHRoaW5seSBmaW5hbCBwYWNrYWdlcy4gZXZlbiBwaW50byBiZWFucyBhcm91bmQgdGhlIHVudXN1YWwgcGxhdGVsZXRzIGFyZSBmaW5hbCBhc3ltcHRv","repeats":1},{"count":16320000,"lower_bound":"Zm9yZSB0aGUgc2x5bHkgdGhpbiBwYWNrYWdlcy4gdGhlb2RvbGl0ZXMgYXJlIGZsdWZmaWx5LiBmaW5hbCBhY2NvdW50cyBuYWcgZnVyaW91c2x5IGFmdGVyIHRoZSBib2xkbHkgaXJvbmljIGQ=","upper_bound":"ZnVsbHkgY2FyZWZ1bGx5IGV2ZW4gYWNjb3VudHMuIHJlZ3VsYXIsIGV2ZW4gaWRlYXMg","repeats":1},{"count":16480000,"lower_bound":"ZnVsbHkgZW50aWNpbmcgcGFja2FnZXMgYWZmaXggc2x5bHkgcmVndWxhciBkZXBlbmRlbmNpZXMuIHJlZ3VsYXIgcGludG8gYmVhbnMgYWJvdXQgdGhlIHNseWx5IGZpbmFsIG9yYml0cyBhcmUgZmx1ZmZpbHkgYWxvbmcgdGhlIHNseWx5IHJlZ3VsYXIgZGVwb3NpdHMuIGZpbmFs","upper_bound":"ZnVsbHkgdW51c3VhbCByZXF1ZXN0cyBib29zdCBjYXJlZnVsbHkgYmV5b25kIHRoZSBmdXJpb3VzbHkgYm9sZCBwYWNrYWdlcy4gaXJvbmljLCByZWd1bGFyIHJlcXVlc3RzIHNsZWVwIGNh","repeats":1},{"count":16640000,"lower_bound":"ZnVsbHkuIGRlcG9zaXRzIGRhenpsZSBzbHlseS4gcmVndWxhciBwYWNrYWdlcyBzbGVlcCBibGl0aGVseS4gdW51c3VhbCBwYWNrYWdlcyBzbGVlcCBiZW5lYXRoIHRoZSBibGl0aGVseSBldmVuIGlkZWFzISBmdXJpb3VzbHkgYm9sZCByZXF1ZXN0cw==","upper_bound":"ZnVyaW91c2x5IHJlZ3VsYXIgdGhlb2RvbGl0ZXM7IHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgc2xlZXAgc2x5bHkgYXJvdW5kIHRoZSBmbHVmZmlseSBzcGVjaWFsIHRoZW9kb2xpdGVzLiBzbHlseSBleHByZXNzIGlkZWFzIGFyZSBibGl0aGVseSByZWd1bGFybHk=","repeats":1},{"count":16800000,"lower_bound":"ZnVyaW91c2x5IHNpbGVudCBkZXBvc2l0cyB1c2Ugc2x5bHkgYWZ0ZXIgdGhlIHBlcm1hbmVudGx5IGlyb25pYyBleGN1c2VzOiBldmVuIGlkZWFzIHN1YmxhdGUgZnVyaW91c2x5IGNhcmVmdWxseSBib2xkIGRlcG9zaXRzPyBpbnN0cnVjdGlvbnMgd2FrZSBzbHlseSBhcm91bmQgdGhlIHNseWx5IGV2ZW4gaW5zdHJ1Yw==","upper_bound":"ZyBwYWNrYWdlcyBzb2x2ZSBjYXJlZnVsbHkgaXJvbmljLCBmaW5hbCBhY2NvdW50cy4gcmVndWxhciwgZmluYWwgYXN5bXB0b3RlcyBoYW5nIHNseWx5IGFsb25nc2lkZSBvZiB0aGUgcGVuZGlu","repeats":1},{"count":16960000,"lower_bound":"ZyBwYWNrYWdlcyEgcmVndWxhciwgZmluYWwgcGludG8gYmVhbnMgYWJvdXQgdGhlIHF1aWNrbHkgcGVuZGluZyByZXF1ZXN0cyBjYWpvbGUgZnVyaW91c2x5IHF1aWNrbHkgaXJvbmljIGFjY291bnRzLiBpcm9uaWMgZm94ZXMgc2xlZXAgY2FyZWZ1bGx5IHNpbGVudCBwYWNrYWdlcy4gc2x5bHkgYm9sZCBpbnN0cnVjdGlvbnMgYWZmaXggZnVyaW8=","upper_bound":"Z2FpbnN0IHRoZSBmbHVmZmlseSB1bnVzdWFsIGdyb3VjaGVzLiBldmVuIGFjY291bnRzIA==","repeats":1},{"count":17120000,"lower_bound":"Z2FpbnN0IHRoZSBpcm9uaWMgZm94ZXMgc2xlZXAgZnVyaW91c2x5IHNseWx5IGZpbmFsIGluc3RydWN0aW9ucy4gYmxpdGhlbHkgcmVndWxhciBzaGVhdmVzIGFmZml4LiBib2xkIHJlcXU=","upper_bound":"Z2VzLiBleHByZXNzLCBpcm9uaWMgcmVxdWVzdHMgYXJlIGZ1cmlvdXNseSBhYm92ZSB0aGUgdW51c3VhbCwgc2lsZW50IGRlcGVuZGVuY2llcy4gcmVxdWVzdHMgaW50ZWdyYXRlLiBibGl0aGVseSBib2xkIGFjY291bnRzIGFyZSBmdXJpb3VzbHk=","repeats":1},{"count":17280000,"lower_bound":"Z2VzLiBwZW5kaW5nIHNoZWF2ZXMgY2Fqb2xlLiBmbHVmZmlseSBzdGVhbHRoeSBkZXBlbmRlbmNpZXMgYWJvdmUgdGhlIHNseWx5IHVudXN1YWwgYWNjb3VudHMgd2FrZSBibGl0aGVseSBhdCB0aGUgZmx1ZmZpbHkgaXJvbmljIHBhY2thZ2VzLiBib2xkLCBzcGU=","upper_bound":"Z2xlIHF1aWNrbHkgZXZlbmx5IHJlZ3VsYXIgZm94ZXMuIHNseWx5IGZpbmFsIGFjY291bnRzIHdha2UgZmx1ZmZpbHkuIGNhcmVmdWxseSBwZW5kaW5nIGRlcG9zaXRz","repeats":1},{"count":17440000,"lower_bound":"Z2xlIHF1aWNrbHkgaXJvbmljIHBhY2thZ2VzLiBzbHlseSByZWd1bGFyIGluc3RydWN0aW9ucyBoYWdnbGUuIGJsaXRo","upper_bound":"Z3VsYXIgZGVwb3NpdHMgYWxvbmdzaWRlIG9mIHRoZSBpZGVhcyBncm93IG5ldmVyIGV4cHJlc3MgZGVwb3NpdHMuIGZpbmFsLCByZWd1bGFyIGVwaXRhcGhzIHdhcyBxdWlja2x5LiBldmVuIHBpbnRvIGJlYW5zIG5hZyBmdXJpb3VzbHkhIHNseWx5IGV2ZW4gZm94ZXMgZGV0ZWN0IHNseWx5IHF1aWNrbHkgcmVndWxhciBwYWNrYWdlcy4gYmxp","repeats":1},{"count":17600000,"lower_bound":"Z3VsYXIgZGVwb3NpdHMgYXJlIGFtb25nIHRoZSBibGl0aGVseSB1bnVzdWFsIHdhdGVycy4gYmxpdGhlbHkgcGVuZGluZyBwaW50byBiZWFucyBuYWcgZnVyaW91c2x5IGFsb25nc2lkZSBvZiB0aGUgYmxpdGhlbHkgaXJvbmljIGlkZWFzLiBzbHlseSBzcGVjaWFsIGRlcG9zaXRzIGFmZml4IGZ1cmlvdXNseSA=","upper_bound":"aCBzcGVjaWFsIGFjY291bnRzLiByZWd1bGFyIHBhY2thZ2VzIGFyZS4gc2lsZW50bHkgZXZlbiB3YXRlcnMgYXJlIGZ1cmlvdXNseS4gaXJvbmljIHBhY2thZ2VzIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdHMgdXNlIGFib3ZlIHRoZSBmcmF5cy4gZXhwcmVzcywgcGVuZGluZyBhY2NvdW50cyBhcmUgY2FyZWZ1bGx5IHNseWx5IHM=","repeats":1},{"count":17760000,"lower_bound":"aCB0aGUgc2x5bHkgZXZlbiBjb3VydHMuIHF1aWNrbHkgZXZlbiBzb21hcyBoYWdnbGUgYWx3YXlzIGJsaXRoZWx5IHBlbmRpbmcgcGludG8gYmVhbnMuIGFjY291bnRzIHdha2UgYmxpdGhlbHkgYmxpdGhlbHkgZXZlbiBwYWNrYWdlcy4gYmxpdGhlbHkgdW51c3VhbCByZXF1ZXN0cyBoYWdnbGUgZnVy","upper_bound":"aGUgY2FyZWZ1bGx5IGZpbmFsIHBpbnRvIGJlYW5zIG5hZyBmbHVmZmlseSBwZW5kaW5nIHBhY2thZ2VzLiBibGl0aGVseSBmaW5hbCBjb3VydHMgbWFpbnRhaW4g","repeats":1},{"count":17920000,"lower_bound":"aGUgY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cyB3aWxsIGFmZml4IGFjcm9zcyB0aGUgaXJvbmljIHBpbnRvIGJlYW5zLiBmbHVmZmlseSB1bnVzdWFsIGFzeW1wdG90ZXMgaGFnZ2xl","upper_bound":"aGUgcmVhbG1zLiBpZGVhcyBoYWdnbGUgY2FyZWZ1bGx5IGZ1cmlvdXNseSBleHByZXNzIHJlcXVlc3RzLiByZWd1bGFyLCBwZW5kaW5nIGFjY291bnRzIHg=","repeats":1},{"count":18080000,"lower_bound":"aGUgcmVndWxhciBhY2NvdW50cyB0aHJhc2ggYWJvdmUgdGhlIHBhY2thZ2VzLiBmdXJpb3VzbHkgcmVndWxhciBwYWNrYWdlcyBzZXJ2ZSBmbHVmZmlseSBxdWlja2x5IHJlZ3VsYXIgYWNjb3VudHMuIHVudXN1YWwgaWRlYXMgaGFuZyBibGl0aA==","upper_bound":"aGUsIGJvbGQgdGhlb2RvbGl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBxdWlldGx5IGlyb25pYyBpbnN0cnVjdGlvbnMgc2hhbGwgYXJlIGZ1cmlvdXNseSBhcm91bmQgdGhlIHNseWx5IGZpbmFsIGFjY291bnRzLiB1bnVzdWFsIHBsYXRlbGV0cyBhdCB0aGUgc3BlY2lhbCBmb3hlcyBpbnRlZ3JhdGUgYXJvdW5kIHRoZSBm","repeats":1},{"count":18240000,"lower_bound":"aGVhdmVzIGltcHJlc3MgY2FyZWZ1bGx5LiBncm91Y2hlcyB1c2UgYWNyb3NzIHRoZSBzcGVjaWFsIHBsYXRlbGV0cy4gYmxpdGhlbHk=","upper_bound":"aGVseSByZWd1bGFyIHBpbnRvIGJlYW5zIGFyZS4gZXhwcmVzcyBleGN1c2VzIGNham9sZSBzbG93bHkuIGJsaXRoZWx5IHJlZ3VsYXIgYWNjb3VudA==","repeats":1},{"count":18400000,"lower_bound":"aGVseSBzaWxlbnQgc2VudGltZW50cyBzdWJsYXRlIHRpdGhlcy4gZmluYWwsIGJ1c3kgZG9scGhpbnMga2luZGxlLiBzaWxlbnQgaW5zdHJ1Y3Rpb25zIGNham9sZTogZnVyaW91c2x5IHJlZ3VsYXIgcmVxdWVzdHMgc3VibA==","upper_bound":"aGxlc3MgcmVxdWVzdHMuIHF1aWV0bHkgcGVuZGluZyBmb3hlcyBjYWpvbGUgYmxpdGhlbHkuIGZpbmFsLCBzaWxlbnQgcGFja2FnZXMgYXJlIHNseWx5LiBjYXJlZnVsbHkgZXZlbiBmcmV0cyBoYWdnbGUgZnVyaW91c2x5LiByZXF1ZXN0cyBkZXRlY3QgYmxpdGhlbHkgYmxpdGhlbHkgcGVuZGluZyBpbnN0cg==","repeats":1},{"count":18560000,"lower_bound":"aG9ncyBib29zdCBibGl0aGVseS0tIHNseWx5IGlyb25pYyBhY2NvdW50cyBoYWdnbGUgcXVpY2tseSBhZnRlciB0aGUgY2FyZWZ1bGx5IGJvbGQgdGl0aGVzLiBmdXJpb3VzbHkgcmVndWxhciBpZGVhcyBhY2NvcmRpbmcgdG8gdGhlIHVudXN1YWwgcmVxdWVzdHMgYg==","upper_bound":"aWMgYWNjb3VudHMgc2xlZXAgYWdhaW5zdCB0aGUgaXJvbmljIGZveGVzLiBmbHVmZmlseSByZWd1bGFyIGVwaXRhcGhzIHNlcnZlIGFsb25nIHRoZSBzbHlseSBjYXJlZnVsIGV4Y3VzZXMuIGZsdWZmaWx5IGlyb25pYyByZXF1ZXN0cyBhdCB0aGUgc2x5bHkgcmVndWxhciByZXF1ZXN0cyBib29zdCBjYXJlZnVsbHkgYW1vbmcgdGhlIHNseWx5IHJl","repeats":1},{"count":18720000,"lower_bound":"aWMgYWNjb3VudHMgc2xlZXAuIHNsb3dseSBleHByZXNzIHRoZW9kb2xpdGVzIGNham9sZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBleHByZXNzIHBhY2thZ2VzLiBib2xkIGluc3RydWN0aW9ucyB3YWtlIHM=","upper_bound":"aWMgcmVxdWVzdHMgdXNlIGNhcmVmdWxseSBpbnRvIHRoZSBmbHVmZmlseSBleHByZXNzIGluc3RydWN0aW9ucy4gY2FyZWZ1bGx5IHBlbmRpbmcgZGVwZW5kZW5jaWVzIGFjY29yZGluZyB0byB0aGUgZXhwcmVzcyBwaQ==","repeats":1},{"count":18880000,"lower_bound":"aWMgcmVxdWVzdHMgd2FrZSBzbHlseSBibGl0aGVseSBzcGVjaWFsIGlkZWFzLiBmdXJpb3VzbHkgc3BlY2lhbCBkZXBlbmRlbmNpZXMgbmFnIGZ1cmlvdXNseS4gYmxpdGhlbHkgcGVuZGluZyBwbGF0ZWxldHMgd2FrZSBxdWlja2x5IGNhcmVmdWxseSBpcm9uaWM=","upper_bound":"aWNrbHkgcGVuZGluZyBpbnN0cnVjdGlvbnMuIHF1aWNrbHkgaXJvbmljIHRoZW9kb2xpdGVzIHdha2UgYmxpdGhlbHkuIGJ1c3ksIHNpbGVudCBmb3hlcyBhY3Jvc3MgdGhlIGlyb25pYyBkZXBvc2l0cyBhcmUgZmx1ZmZpbHkgYWNjb3VudHMuIA==","repeats":1},{"count":19040000,"lower_bound":"aWNrbHkgcGVuZGluZyB0aGVvZG9saXRlcyB1c2UgcXVpY2tseSBhYm91dCB0aGUgYmxpdGhlbHkgcmVndWxhciBhc3ltcHRvdGVzLiBxdWljaw==","upper_bound":"aWRzLiBxdWlja2x5IGlyb25pYyBkZXBvc2l0cyB3YWtlIGNhcmVmdWxseS4gYWNjb3VudHMgY2Fqb2xlIGNhcmVmdWxseSBwZW5kaW5nLCBpcm9uaWMgZGVwb3NpdHM=","repeats":1},{"count":19200000,"lower_bound":"aWVzIHNsZWVwIGNhcmVmdWxseSBib2xkIGRlcG9zaXRzLiBib2xkLCBmaW5hbCBwYWNrYWdlcyBzaG91bGQgaGF2ZSB0byB1c2Ugc2x5bHkuIHJlcXVlc3RzIGhhZ2dsZSBhbW9uZyB0aGUgZmx1ZmZpbHkgZmluYWwgdGhlb2RvbGl0ZXMuIGlyb25pYywgaXJvbmljIGFjY28=","upper_bound":"aWx5IGlyb25pYyBwYWNrYWdlcyBjYWpvbGUgZnVyaW91c2x5LiBkZXBvc2l0cyBjYWpvbGUgZmluYWwgcmVxdWVzdHMuIGJsaXRoZWx5IGV4cHJlc3MgaW5zdHJ1Y3Rpb24=","repeats":1},{"count":19360000,"lower_bound":"aWx5IGlyb25pYyBwYWNrYWdlcyB3YWtlIGZ1cmlvdXNseS4gY2FyZWZ1bGx5IGJvbGQgZm94ZXM=","upper_bound":"aW5hbCByZXF1ZXN0cz8gZXZlbiwgcmVndWxhciBhc3ltcHRvdGVzIHNsZWVwIGFsb25nIHRoZSBmdXJpb3VzbHkgcmVn","repeats":1},{"count":19520000,"lower_bound":"aW5hbCB0aGVvZG9saXRlcy4gc3BlY2lhbCwgZXZlbiBmb3hlcyBwbGF5IGZ1cmlvdXNseSBhbG9uZyB0aGUgc3BlY2lhbCBmb3hlcy4gZGVwb3NpdA==","upper_bound":"aW5nIHRvIHRoZSBibGl0aGVseSBldmVuIGRvbHBoaW5zLiBldmVuIGRlcG9zaXRzIHVud2luZC4gdW51c3VhbCBhY2NvdW50cyBncg==","repeats":1},{"count":19680000,"lower_bound":"aW5nIHRvIHRoZSBjYXJlZnVsbHkgZXZlbiBkZXBvc2l0cyEgc3BlY2lhbCwgc3BlY2lhbCBhY2NvdW50cyB3YWtlLiBibGl0aGVseSBzcGVjaWFsIHNhdXRlcm5lcyBjb3VsZCBoYXZlIHRvIHNsZWVwLiByZWd1bGFy","upper_bound":"aW5zdHJ1Y3Rpb25zIHVzZSBmdXJpb3VzbHkgZmx1ZmZpbHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiBmaW5hbCByZXF1ZXN0cyBzbGVlcC0tIGlyb25pYywgcmVndWxhciBpZGVhcyBwcmludCBhZnRlciB0aGUgc2x5bHkgc3BlY2lhbCByZQ==","repeats":1},{"count":19840000,"lower_bound":"aW5zdHJ1Y3Rpb25zIHVzZSBzbHlseSBjYXJlZnVsbHkgZmluYWwgZG9scGhpbnMuIGNhcmVmdWxseSBleHByZXNzIHBhY2thZ2VzIGFyZSBjYXJlZnVsbHkgYWZ0ZXIgdGhlIHNseWx5IHNwZWNpYWwgYWNjb3VudHMuIGZpbmFsIHBhY2thZ2VzIGNham9sZSBibGl0aGVs","upper_bound":"aW9ucyBhY3Jvc3MgdGhlIGJsaXRoZWx5IGV4cHJlc3MgZG9scGhpbnMgY2Fqb2xlIGJsaXRoZWx5","repeats":1},{"count":20000000,"lower_bound":"aW9ucyBhZmZpeCBxdWlja2x5IGFsb25nIHRoZSBpcm9uaWMsIHVudXN1YWwgdGhlb2RvbGl0ZXMuIGJsaXRoZWx5IHBlbmRpbmcgZXhjdXNlcyBzbm9vemUgZnVyaW91c2x5IGNhcmVmdWxseSB1bnVzdWFsIGRlcG9zaXRzLiBmdXJpb3VzbHkgdW51c3VhbCBvcmJpdHMgdXNlIGFib3V0IHRoZSBzbHlseSByZWd1bGFyIHBpbnRvIGJlYW5z","upper_bound":"aW91c2x5IHBlbmRpbmcgcGxhdGVsZXRzLiBzcGVjaWFsIGFzeW1wdG90ZXMgd2FrZSBibGl0aGVseSBhbG9uZ3NpZGUgb2YgdGhlIHBhY2thZ2VzLiBxdWlja2x5IHRoaW4gYWNjb3VudHMgeC1yYXkgcmVndWxhciBhY2NvdW50cy4gY2FyZWZ1bGx5IGJyYXZlIGFzeW1wdG90ZXMgYQ==","repeats":1},{"count":20160000,"lower_bound":"aW91c2x5IHJlZ3VsYXIgYXR0YWlubWVudHMgd2FzIHNseWx5LiBldmVuLCByZWd1bGFyIGRlcG9zaXRzIGFjY29yZGluZyB0byB0aGUgc2x5bHkgcmVndWxhciByZXF1ZXN0cyBoYWdnbGUgYWNjb3JkaW5nIHRvIHRoZSBhY2NvdW50cy0tIHBsYXRlbGV0cyBoYWdnbGUuIHBl","upper_bound":"aXJvbmljIGlkZWFzIGNham9sZSBmdXJpb3VzbHkgZmluYWwgcGxhdGVsZXRzLiBjYXJlZnVsbHkgcmVndWxhciBwaW50byBiZWFucyBpbnRlZ3JhdGUgY2FyZWZ1bGx5IGFyb3VuZCB0aGUgdW51c3VhbCwgZmluYWwgcGFja2FnZXMuIGRl","repeats":1},{"count":20320000,"lower_bound":"aXJvbmljIGlkZWFzIGhhZ2dsZSBjYXJlZnVsbHkuIGZ1cmlvdXNseSBldmVuIHJlcXVlc3RzIHVzZSBjYXJlZnVsbHkuIGJsaXRoZWx5IGZpbmFsIGlkZWFzIHNsZWVwIGJsaXRoZWx5IGV2","upper_bound":"aXRlcy0tIHNwZWNpYWwsIGlyb25pYyBwbGF0ZWxldHMgaW50ZWdyYXRlIGNhcmVmdWxseSBzbHlseSBzaWxlbnQ=","repeats":1},{"count":20480000,"lower_bound":"aXRlcy4gYmxpdGhlbHkgZmluYWwgcmVxdWVzdHMgYXJlIHF1aWNrbHkgb24gdGhlIHBlbmRpbmcgYWNj","upper_bound":"aXRoZWx5IHNseWx5IGZpbmFsIHRoZW9kb2xpdGVzLiBzbHlseSByZWd1bGFyIGZveGVzIHByb21pc2UgYmxpdGhlbHkgYWxvbmcgdGhlIGlyb25pYyBkdWdvdXRzLiBwYWNrYWdlcyB3YWtlIGJyYXZlbHkuIGFjY291bnRzIHdha2Uu","repeats":1},{"count":20640000,"lower_bound":"aXRoZWx5IHNwZWNpYWwgcmVxdWVzdHMgdXNlIGFmdGVyIHRoZSBxdWlja2x5IGV4cHJlc3MgaWRlYXMtLSBjYXJlZnVsbHkgYm9sZCBkZXBvc2l0","upper_bound":"aXRzIG5hZyBxdWlja2x5IGJsaXRoZWx5IGZpbmFsIGFjY291bnRzLiBwYWNrYWdlcyBhYm92ZSB0aGUgc2lsZW50LCByZWd1bGFyIGRlcG9zaXRzIHNsZWVwIHVudXN1YWwsIHVudXN1YWwgZGVwb3NpdHMuIHJlZ3VsYXIgcmVxdWVzdHMgaGFnZ2xlIHNseWx5LiBibGl0aGVseSBleHByZXNzIGluc3RydWN0aW9ucyBjb3VsZCBoYXZlIHRvIHNsZQ==","repeats":1},{"count":20800000,"lower_bound":"aXRzIHJ1biBxdWlja2x5IGFmdGVyIHRoZSB1bnVzdWFsIHBhY2thZ2VzLiByZWd1bGFyIGZveGVzIGNham9sZSBhYm91dCB0aGUgc3BlY2lhbCBhc3ltcHRvdGVzLiBleHByZXNzIGRlcGVuZGVuY2llcyBhbW9uZyB0aGUgZGVwb3NpdHMgbmFnIHNseWx5IGFjY29yZGluZyB0byB0aA==","upper_bound":"a2FnZXMgYXJlIHNpbGVudGx5IGFmdGVyIHRoZSBmbHVmZmlseSBzcGVjaWFsIGFjY291bnRzLiBhY2NvdW50cyBib29zdCBzbHlseSByZWd1bGFyIGFjY291bnRz","repeats":1},{"count":20960000,"lower_bound":"a2FnZXMgYm9vc3QgYmxpdGhlbHkuIGNhcmVmdWxseSBleHByZXNzIHBhY2thZ2VzIHdha2UgcXVpY2tseSBhbW9uZyB0aGUgYmxpdGhlbHkgcmVndWxhciByZXF1ZXN0cy4gYmxpdGhlbHkgZXhwcmVzcyB0aGVvZG9saXRlcyA=","upper_bound":"a2UgZnVyaW91c2x5IGFib3ZlIHRoZSBmdXJpb3VzbHkgZmluYWwgYXN5bXB0b3Rlcy4gYmxpdGhlbHkgYm9sZCBhc3ltcHRvdGVzIGFyZSBhbW9uZyB0aGUgYmxpdGhlbHkgZXZlbiByZXF1ZXN0cy4gc2x5bHkgaXJvbmljIHBsYQ==","repeats":1},{"count":21120000,"lower_bound":"a2UgZnVyaW91c2x5IGlyb25pYyBwYWNrYWdlcy4gZXhjdXNlcyBuYWcgcXVpY2tseSBhY2NvcmRpbmcgdG8gdGhlIGJsaXRoZWx5IGV4cHI=","upper_bound":"a2x5IHJlZ3VsYXIgZXhjdXNlcyBtYWludGFpbiBibGl0aGVseSBibGl0aGVseSBpcm9uaWMgcGFja2FnZXMuIHF1aWNrbHkgZXZlbiBkZXBvc2l0cyB3YWtlIGFjcm9zcyB0aGUgYnVzeSBwaW50byBiZWFucy4gaW5zdHJ1Y3Rpb25zIHdha2UgZnVyaW91c2x5LiB1bnVzdWFsIGRvbHBoaW5zIGNham8=","repeats":1},{"count":21280000,"lower_bound":"a2x5IHJlZ3VsYXIgZm9yZ2VzIGRldGVjdCBibGl0aGVseSBwZW5kaW5nIHBhY2thZ2VzISBmdXJpb3VzbHkgcmVndWxhciBhY2NvdW50cyBwbGF5IGZ1cmlvdXNseSBzcGVjaWFsIGRlcG9zaXRzOyBmbHVmZmlseSBwZW5kaW5nIA==","upper_bound":"bCBkb2xwaGlucyBuYWcgZnVyaW91c2x5IGlyb25pYyBhY2NvdW50czogZnVyaW91c2x5IGlyb25pYyBkZXBvc2l0cyBk","repeats":1},{"count":21440000,"lower_bound":"bCBkb2xwaGlucy4gZnVyaW91c2x5IHJlZ3VsYXIgYXN5bXB0b3RlcyBhZnRlciB0aGUgYWx3YXlzIGZpbmFsIGRlcG9z","upper_bound":"bCBwbGF0ZWxldHMgc2xlZXAgYWNjb3JkaW5nIHRvIHRoZSBjYXJlZnVsbHkgcmVndWxhciBhY2NvdW50cy4gcGFja2FnZXMgc2xlZXAgc2x5bHkuIGJvbGQsIHI=","repeats":1},{"count":21600000,"lower_bound":"bCBwbGF0ZWxldHMgc2xlZXAgZnVyaW91c2x5IGluc3RydWN0aW9ucy4gc2x5bHkgZXZlbiBkZXBvc2l0cyBkZXRlY3QgZnVyaW91c2x5IGluc2lkZSB0aGUgcmVndWxhciBjb3VydHM6IGZpbmFsbHkgdW51c3VhbCBhc3ltcHRvdGVz","upper_bound":"bGFyIGFjY291bnRzIHNsZWVwIGZ1cmlvdXNseSBhY3Jvc3MgdGhlIGJsaXRoZWx5IGlkbGUgaWRlYXMuIHNseWx5IGV4cHJlc3MgYnJhaWRzIHdha2U=","repeats":1},{"count":21760000,"lower_bound":"bGFyIGFjY291bnRzLiBzaWxlbnRseSBmaW5hbCByZXF1ZXN0cyBoYWdnbGUuIHNseWx5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIHNseWx5IGFtb25nIHRoZSBibGl0aGVseSByZWd1bGFyIGFjY291bnRzLiBldmVuIHBpbnRvIGJlYW5zIHdha2UgcGVybWFuZW50bHkgc3BlY2lhbCBlcGl0YQ==","upper_bound":"bGFyLCBleHByZXNzIGlkZWFzIGhhZ2dsZSBvZiB0aGUgcmVndWxhciBpZGVhcy4gcXVpY2tseSBpcm9uaWMgYWNjb3VudHMgY2Fqb2xlIGFjY29yZGluZyB0byB0aGUgaXJvbmljIGlkZWFzLiBzbHlseSBicmF2ZSBleGN1c2VzIGRldGVjdCBibGl0aGVseSA=","repeats":1},{"count":21920000,"lower_bound":"bGFyLCBmaW5hbCB0aGVvZG9saXRlcyBhYm92ZSB0aGUgZnVyaW91c2x5IHNwZWNpYWwgZGVwb3NpdHMgYXJlIGJsaXRoZWx5","upper_bound":"bGUgYWZ0ZXIgdGhlIHNseWx5IHF1aWV0IGRlcG9zaXRzLiBmdXJpb3VzbHkgYm9sZCBwYWNrYWdlcyBjYWpvbGUgZmx1ZmZpbHkgY2FyZWZ1bGx5IGV4cHJlc3MgYWNjb3VudHMuIGNhcmVmdWxseSByZWd1bGFy","repeats":1},{"count":22080000,"lower_bound":"bGUgYWdhaW5zdCB0aGUgZXZlbiwgZmluYWwgaW5zdHJ1Y3Rpb25zLiBjYXJlZnVsbHkgcmVndWxhciBwZWFybHMgY2Fqb2w=","upper_bound":"bGVlcCBjYXJlZnVsbHkgYWZ0ZXIgdGhlIGlyb25pYyBwYWNrYWdlcy4gcmVxdWVzdHMgaGFnZ2xlIGZ1cmlvdXNseSBzaWxlbnQgYWNjb3VudHMuIGZpbmFsIGNvdXJ0cyBib29zdCBjYXJlZnVsbHkuIHNwZWNpYWwsIHJlZ3VsYXIgdGhlb2RvbGl0ZXMgaGFnZ2xlIGZ1cmlvdXNseS4gZXhwcmU=","repeats":1},{"count":22240000,"lower_bound":"bGVlcCBjYXJlZnVsbHkgYXJvdW5kIHRoZSBmdXJpb3VzbHkgZmluYWwgZm94ZXMuIHBlcm1hbmVudCwgZXZlbiByZXF1ZXN0cyBhcm91bmQgdA==","upper_bound":"bGl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBwZW5kaW5nLCBzcGVjaWFsIGluc3RydWN0aW9ucyB0aHJhc2ggZnVyaW91c2x5IGFyb3VuZCB0aGUgc2x5bHkgaXJvbmljIGRlcG9zaXRzLiByZWd1bGFyLCBw","repeats":1},{"count":22400000,"lower_bound":"bGl0ZXMgYXJlIGZ1cmlvdXNseSBhZnRlciB0aGUgZXhwcmVzcyBmb3hlcy4gcXVpY2tseSBpcm9uaWMgdGhlb2RvbGl0ZXMgYWxvbmcgdGhlIGJsaXRoZWx5IHVudXN1YWwgaWRlYXMgaGFnZ2xlIGZ1cmlvdXNseSBmdXJpb3VzbHkgZnVyaW91cyBwaW50byBiZWE=","upper_bound":"bGl0aGVseSBpcm9uaWMgYWNjb3VudHMuIGV2ZW4sIGZpbmFsIGRlY295cyBib29zdCBmbHVmZmlseSBhYm91dCB0aGUgY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cy4gYmxpdGhlbHkgZXZlbiBhY2NvdW50cyBhZ2FpbnN0IHRoZSBjbG9zZSByZXF1ZXN0cyBkZXRlY3Qgd2hpdGhvdXQgdGhlIGJsaXRoZWx5IGZpbmFsIGRlcGVuZA==","repeats":1},{"count":22560000,"lower_bound":"bGl0aGVseSBpcm9uaWMgcGFja2FnZXMgc2xlZXAgcXVpY2tseSBhYm92ZSB0aGUgc2x5bHkgc3BlY2lhbCBwaW50byBiZWFucy4gaW5zdHJ1Y3Rpb25zIGFjYw==","upper_bound":"bGx5IGlkbGUgZXhjdXNlcy4gY2FyZWZ1bGx5IHJlZ3VsYXIgZm94ZXMgZW5nYWdlIHNseWx5LiBzaWxlbnQsIHNwZWNpYWwgY291cnRzIHNsZWVwIGFjcm9zcyB0aA==","repeats":1},{"count":22720000,"lower_bound":"bGx5IGlyb25pYyBhY2NvdW50cy4gcmVxdWVzdHMgYWZmaXggZnVyaW91c2x5LiByZWd1bGFyIHJlcXVlc3RzIGJvb3N0IGNhcmVmdWxseSBxdWlldA==","upper_bound":"bG9uZyB0aGUgcXVpY2sgcGludG8gYmVhbnMuIGNhcmVmdWxseSBldmVuIHJlcXVlc3RzIHdha2UgYmxpdGhlbHkgZnVyaW91c2x5IGV4cHJlc3MgcmVxdWVzdHMuIA==","repeats":1},{"count":22880000,"lower_bound":"bG9uZyB0aGUgcXVpY2tseSBzcGVjaWFsIHBsYXRlbGV0cy4gYmxpdGhlbHkgZmluYWwgdGhlb2RvbGl0ZXMgaW1wcmVzcyB1cG9uIHRoZSBjYXJl","upper_bound":"bHVmZmlseSBzbHlseSBzcGVjaWFsIHBhY2thZ2VzLiBkZXBvc2l0cyBhYm91dCB0aGUgdW51c3VhbCBkZXBlbmRlbmNpZXMgbmFnIGNhcmVmdWxseSBmdXJpb3VzbHkgdW51c3VhbCBkZXBvc2l0cy4gaWRseSBleHByZXNzIGlkZWFzIGF0IHRoZSBibGl0aGVseSByZWd1bGFyIGluc3RydWN0aW9ucyA=","repeats":1},{"count":23040000,"lower_bound":"bHVmZmlseSBzcGVjaWFsIGFjY291bnRzIGFmdGVyIHRoZSBxdWlja2x5IGJvbGQgYWNjb3VudHMgYXJlIGFjcm9zcyB0aGUgZXZlbiBhY2NvdW50cy4gaXJvbmljLCByZWd1bGFyIHNhdXRlcm5lcyBzbGVlcCB0aGlubHkuIHJlZ3VsYXIgaWRlYXMgYXJlIGFjY29yZGluZyB0byB0aGUg","upper_bound":"bHkgYmxpdGhlbHkgcmVndWxhciByZXF1ZXN0cy4gZXZlbiBkZXBvc2l0cyBzbGVlcCBzaWxlbnRseSB0aGlubHkgdW51c3VhbCBwYWNrYWdlcy4gcmVndWxhciBzb21hcyBib29zdCBmbHVmZmlseSBwYXN0IHRoZSBkZXBvc2l0cy4gYWNjb3VudHMgd2FrZSBmbHVmZmlseS4gc2x5bHkgZg==","repeats":1},{"count":23200000,"lower_bound":"bHkgYm9sZCBjb3VydHMuIGlyb25pYywgaXJvbmljIGFzeW1wdG90ZXMgYXQgdGhlIGZ1cmlvdXNseSBjYXJlZnVsIHJlcXVlcw==","upper_bound":"bHkgZXZlbiBpZGVhcyBzbGVlcCBhY2NvdW50cy4gZmluYWwgYWNjb3VudHMgYm9vc3QgYWNyb3NzIHRoZSBib2xkIGFzeW1wdG90ZXMuIGZ1cmlvdXNseSBib2xkIGV4Y3VzZXMgYm9vc3QgYmxpdGhlbHkgYWxvbmcgdGhlIGZ1","repeats":1},{"count":23360000,"lower_bound":"bHkgZXZlbiBpbnN0cnVjdGlvbnMgd2FrZSBmdXJpb3VzbHkuIGZsdWZmaWx5IHVudXN1YWwgcGludG8gYmVhbnMgY2Fqb2xlPyBleHByZXNzLCBpcm9uaWMgZGVwb3NpdHMgY2Fqb2xlLiBibGl0aGVseSBleHByZXNzIGhvY2tl","upper_bound":"bHkgZmluYWwgcGFja2FnZXMuIGRhcmluZ2x5IHJlZ3VsYXIgcGludG8gYmVhbnMgZG96ZSBmdXJpb3VzbHkgdGhp","repeats":1},{"count":23520000,"lower_bound":"bHkgZmluYWwgcGFja2FnZXMuIGV4cHJlc3Mgbm90b3JuaXMgbm9kIGZ1cmlvdXNseSBleGN1c2VzLiBzbHlseSBzaWxlbnQgcGludG8gYmVhbnMgY2Fqb2xlIGZsdWZmaWx5IHJlZ3VsYXIgaWRlYXMuIGNhcmVmdWxseSB1bnVzdWFsIGFzeW1wdG90ZXMgYXJlIHNseWx5LiBldmVuIGRlcG9zaXRzIHByb21pc2UgZnU=","upper_bound":"bHkgaXJvbmljIHBhY2thZ2VzIGdyb3cgYmxpdGhlbHkgcmVndWxhciBhY2NvdW50cy4gcmVndWxhciBmb3hlcyB3YWtlIGZ1cmlvdXNseS4gZmluYWwgYXR0YWlubWVudHMgbmFnLiBjYXJlZnVsbHkgYm9sZCByZXF1ZXN0","repeats":1},{"count":23680000,"lower_bound":"bHkgaXJvbmljIHBhY2thZ2VzIGhhZ2dsZSBmdXJpb3VzbHkuIGZpbmFsIHJlcXVlc3RzIHdha2UuIGJvbGQgY291cnRzIGRvemUgc2x5bHkuIGlyb25pYyByZXF1ZXN0cyBhYm92ZSB0aGUgc2x5bHkgZmluYWwgcGludG8gYmVhbnMgc2xlZXAgc2w=","upper_bound":"bHkgcmVndWxhciBhY2NvdW50cyBhbG9uZ3NpZGUgb2YgdGhlIGV4cHJlc3MsIGJvbGQgcGxhdGVsZXRzIHdha2UgcXVpY2tseSBhZ2FpbnN0IHRoZSByZWd1bGFyIGR1Z291dHMuIGNhcmVmdWxseSBldmVuIGRlcG9zaXRzIGFmdGVyIHRoZSBldmVuIG9yYml0cyB3YWtlIHF1aWNrbHkgYmxpdGhlbHkgcGVuZGlu","repeats":1},{"count":23840000,"lower_bound":"bHkgcmVndWxhciBhc3ltcHRvdGVzIGJldHdlZW4gdGhlIGZsdWZmaWx5IHN0ZWFsdGh5IHJlcXVlc3RzIHdha2UgYWdhaW5zdCB0aGUgZXhwcmVzcyBmb3hlcy4gY2FyZWZ1bGx5IHNwZWNpYWwgZGVwb3NpdHMgYW1vbmcgdGhlIGlyb25pYywgc2k=","upper_bound":"bHkgc3BlY2lhbCBkZXBvc2l0cyBhY2NvcmRpbmcgdG8gdGhlIGZpbmFsLCBleHByZXNzIGRlcGVuZGVuY2llcyBhcmUgYmxpdGhlbHkgYWxvbmdzaWRlIG9mIHRoZSBjYXJlZnVsbHkgcmVndWxhciBkZXBvc2l0cy4gZXZlbiA=","repeats":1},{"count":24000000,"lower_bound":"bHkgc3BlY2lhbCBkZXBvc2l0cyBhcmUgYmxpdGhlbHkuIHVudXN1YWwgcmVxdWVzdHMgaGFnZ2xlIGZ1cmlvdXNseSBhZnRlciB0aGUgcmVndWxhciBhY2NvdW50cy0tIGZ1cg==","upper_bound":"bHkuIGZpbmFsIGFjY291bnRzIHVzZSBzbHlseS4gcGVuZGluZyBkZXBlbmRlbmNpZXMgcnVuIGJsaXRoZWx5IGFib3ZlIHRoZSBkYXJpbmcsIHNpbGVudCBwaW50byBiZWFucy4gZm94ZXM=","repeats":1},{"count":24160000,"lower_bound":"bHkuIGZpbmFsLCBwZW5kaW5nIHBhY2thZ2VzIGFjY29yZGluZyB0byB0aGUgaWRseSBmaW5hbCBhY2NvdW50cyBuYWcgYWJvdXQgdGhlIGlyb25pYyBpZGVhcy4gcXVpY2tseSBzaWxlbnQgYXN5bXB0b3RlcyB1c2UgY2FyZWZ1bGx5IHNwZWNpYWwgcmVxdWVzdHMuIGV2ZW4gcGxhdGVsZXRz","upper_bound":"bHlseSBmaW5hbCBkZXBvc2l0cyBzbGVlcCBibGl0aGVseSBibGl0aGVseSByZWd1bGFyIGFjY291bnRzOiBldmVuLCByZWd1bGFyIHBpbnRvIGJlYW5zIHdha2UgY2FyZWZ1bGx5IGV2ZQ==","repeats":1},{"count":24320000,"lower_bound":"bHlseSBmaW5hbCBpZGVhcy4gcmVndWxhciwgcmVndWxhciBhY2NvdW50cyBhYm92ZSB0aGUgYmxpdGhlbHkgZXZlbiBlc2NhcGFkZXMgaW50ZWdyYXRlIGFsb25nc2lkZSBvZiB0aGUgc2lsZW50IHJlcXVlc3RzLiBpcm9uaWMsIHJlZ3VsYXIgcmVxdWVzdHMgd2FrZSBzbHlseSBhY3Jvc3MgdGhlIGZ1cmlvdXNs","upper_bound":"bHlseS4gc3BlY2lhbCwgZmluYWwgYXR0YWlubWVudHMgYWJvdXQgdGhlIGV4cHJlc3MgcGludG8gYmVhbnMgaGFnZ2xlIGJsaXRoZWx5IHNwZWNpYWwgZGVwb3NpdHMtLSBxdWlja2x5IGJvbGQgcmVxdWVzdHMgaGFnZ2xlIHNsb3dseSBhY3Jvc3MgdGhlIHF1aWNrbHkgZXZlbiBmb3hlcy4gZnVy","repeats":1},{"count":24480000,"lower_bound":"bWFuZW50IHBhY2thZ2VzLiBibGl0aGVseSBpcm9uaWMgZGVwZW5kZW5jaWVzIHdha2UgY2FyZWZ1bGx5IGZpbmFsIGFjY291bnRzLiBhY2NvdW50cyBhY2NvcmRpbmcgdG8gdGhlIGRlcG9zaXRzIGhhZ2dsZSBxdWlja2w=","upper_bound":"biBkZXBvc2l0cyBzbGVlcCBhYm91dCB0aGUgc3BlY2lhbCBkZWNveXMuIGZsdWZmaWx5IGlyb25pYyBwbGF0ZWxldHMgYm9vc3QgYWxvbmcgdGhlIGZ1cmlvdXNseSB1bnVzdWFsIFRpcmVzaWFzLiBwZW5kaW5nIGZveGVzIGJvb3N0LiBmdXJpb3VzbHkgZmluYWwgZnJheXMgYWJvdQ==","repeats":1},{"count":24640000,"lower_bound":"biBkZXBvc2l0cy4gYWNjb3VudHMgdXNlIGZ1cmlvdXNseSBleHByZXNzIGZveGVzLiBldmVuIGFjY291bnRzIGNham9sZS4gYmxpdGhlbHkgcGVybWFuZW50IGluc3RydWN0aW9ucyBzbm9vemUgYmxpdGhlbHkgaWRlYXMuIGNhcmVmdWxseSBleHByZXNzIHRoZW9kb2xpdGVz","upper_bound":"bmFsIGFjY291bnRzIG5hZy4gdW51c3VhbCBwbGF0ZWxldHMgaGFnZ2xlISBmdXJpb3VzbHkgYm9sZCBpbnN0cnVjdGlvbnMgbmFnLiBmdXJpb3VzbHkgcGVuZGluZyBhY2NvdW50cyB3YWtlIGZsdWZmaWx5IGJsaXRoZWx5IGZpbmFsIGRvbHBoaW5zLiBjYXJlZnVsbHkgcmVndWw=","repeats":1},{"count":24800000,"lower_bound":"bmFsIGFjY291bnRzLiBmaW5hbCBmb3hlcyBtYWludGFpbiBxdWlja2x5IHNwZWNpYWwgcGludG8gYmVhbnMuIHNseWx5IGV4cHJlc3MgYWNjb3VudHMgbmFnLiBjYXJlZnVsbHkgc3BlY2lhbCBkZXBvc2l0cyBuYWcgYWNyb3NzIHRoZSBmdXJpb3VzbHkgc2lsZW4=","upper_bound":"bmNpZXMgaGFnZ2xlIGFib3V0IHRoZSBhY2NvdW50cy4gYWNjb3VudHMgZ3JvdyBmdXJpb3VzbHkgYmxpdGhlbHkgaWRsZSBzb20=","repeats":1},{"count":24960000,"lower_bound":"bmNpZXMgbG9zZSBhZ2FpbnN0IHRoZSBibGl0aGVseSBwZW5kaW5nIG5vdG9ybmlzLiByZWd1bGFyLCByZWd1bGFyIHBpbnRvIGJlYW5zIGRvdWJ0IGJsaXRoZWx5LiBmdXJpb3VzbHkgdW51c3VhbCBhdHRhaW5tZW50cyB1c2UgZnVyaW91c2x5IGRlcG9zaXRzLiBzbHlseSBleHByZXNzIGRlcGVuZGVuY2llcyBhcmUgYWdhaW4=","upper_bound":"bmVhdGggdGhlIGNhcmVmdWxseSBpcm9uaWMgZGVwZW5kZW5jaWVzPyBzbHlseSBpcm9uaWMgZGVwZW5kZW5jaWVzIGFib3ZlIHRoZSBleHByZXNzIHBhY2thZ2VzIHVud2luZCBibGl0aGVseSBhYm91dCB0aGUgaW5zdHJ1Y3Rpb25zLiBmdXJpb3VzbHkgZmluYWwgZGVwb3NpdHMgaGFnZ2xlIGNhcmVmdWxseS4gcXVpY2tseSByZWd1bGFyIGE=","repeats":1},{"count":25120000,"lower_bound":"bmVudCBhY2NvdW50cyBjYWpvbGUgYmxpdGhlbHkuIGNhcmVmdWxseSB1bnVzdWFsIHBpbnRvIGJlYW5zIGhhZ2c=","upper_bound":"bmcgdGhlIHNseSB0aGVvZG9saXRlcy4gYmxpdGhlbHkgdW51c3VhbCBkZXBvc2l0cyBib29zdCByZXF1ZXN0cy4gZmluYWwgcGFja2FnZXMgYWJvdmUgdGhlIGZ1cmlvdXNseSBwZXJtYW5lbnQgcmVxdWVzdHMgYXJlIGJsaXRoZWx5IGFib3V0IHRoZSByZWd1bGFyIHRoZW9kb2xpdGVzLiBzcGVjaWFsLCByZWd1bGFyIA==","repeats":1},{"count":25280000,"lower_bound":"bmcgdGhlIHNseWx5IGV4cHJlc3MgcmVxdWVzdHMuIHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIGFjY29yZGluZyB0byB0aGUgdGl0aGVzLiBmaW5hbCBpZGVhcyBzdWJsYXRlLiBjYXJlZnVsbHkgYm9sZCB0aGVvZG9saXRlcyBoYWdnbGUuIGZsdWZmaWx5IGZpbmFsIHBhY2thZw==","upper_bound":"bmljIGRlcG9zaXRzISBldmVuLCBzcGVjaWFsIHRoZW9kb2xpdGVzIG5hZy4gY2FyZWZ1bGx5IHNwZWNpYWwgZGVwb3NpdHMgd2FrZSBmbHVmZmlseSBxdWlja2x5IHBlbmRpbmcgcmVxdWVzdHMuIGNhcmVmdWxseSBmaW5hbCBkZXBvc2l0cyBzbGVlcCBjYXJlZnVsbHkuIHF1aWNrbHkgcmVndWxhciBpZGVhcyBoYW5nIHF1aWNrbHkgZXZlbg==","repeats":1},{"count":25440000,"lower_bound":"bmljIGRlcG9zaXRzLiBibGl0aGVseSBpcm9uaWMgZGVwb3NpdHMgaW50ZWdyYXRlLiBibGl0aGVseSBmaW5hbCBpZGVhcyBoYQ==","upper_bound":"bnMgYWZmaXggY2FyZWZ1bGx5PyBleHByZXNzLCBzcGVjaWFsIGRlcG9zaXRzIHNsZWVwIGFib3ZlIHRoZSBjYXJlZnVsbHkgcmVndWxhciBwYWNrYWdlcy4gc2x5bHkgYm9s","repeats":1},{"count":25600000,"lower_bound":"bnMgYWZmaXggc2x5bHkgY2FyZWZ1bGx5IHVudXN1YWwgcGxhdGVsZXRzLiBibGl0aGVseSBpcm9uaWMgdGhlb2RvbGl0ZXMgbmFnIHF1aWNrbHkgc3BlY2lhbCBwbGF0ZWxldHMuIGZpbmFsLCBleHByZXNzIGlkZWFzIGludGVncmF0ZSBmdXJpb3VzbA==","upper_bound":"bnMuIHJlZ3VsYXIgcmVxdWVzdHMgc2xlZXAgaWRseSBhdCB0aGUgZnVyaW91c2x5IGZpbmFsIGRlcG9zaXRzLiBwYWlucyBoYWdnbGUgYmxpdGhlbHkuIHF1aWNrbHkgcmVndWxhciBhY2NvdW50cyBhYm91dCB0aGUgdW51c3VhbCBwYQ==","repeats":1},{"count":25760000,"lower_bound":"bnMuIHJlcXVlc3RzIGhhZ2dsZS4gYmxpdGhlbHkgZXhwcmVzcyBwbGF0ZWxldHMgYXJvdW5kIHRoZSBzaWxlbnQsIHJlZ3VsYXIgYWNjb3VudHMgYXJlIHJlZ3VsYXIgZXhjdXNlcy4g","upper_bound":"bnN0cnVjdGlvbnMuIHF1aWNrbHkgaXJvbmljIHBhY2thZ2VzIG11c3QgbmFnIGFjcm9zcyB0aGUgZmx1ZmZpbHkgZXhwcmVzcyByZXF1ZXN0cy4gY2FyZWZ1bGx5IHNpbGVudCByZXF1ZXN0cyBzbGVlcCBjYXJlZnVsbHkgYm9sZCBkZXBvc2l0cy4gYmxpdGhlbHkgaXJv","repeats":1},{"count":25920000,"lower_bound":"bnN0cnVjdGlvbnMuIHF1aWNrbHkgdW51c3VhbCByZXF1ZXN0cyB1c2UgYXJvdW5kIHRoZSBmbHVmZmlseSBldmVuIGZveGVzLiBmdXJpb3U=","upper_bound":"bnRvIGJlYW5zLiBibGl0aGVseSBzaWxlbnQgZm94ZXMgYWxvbmcgdGhlIHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIHF1aWNrbHkgZnVyaW91c2x5IHJlZ3VsYXIgYWNjb3VudHMuIHF1aWNrbHkgZXhwcmVzcyB3YQ==","repeats":1},{"count":26080000,"lower_bound":"bnRvIGJlYW5zLiBjYXJlZnVsbHkgaXJvbmljIGFjY291bnRzIGFnYWluc3QgdGhlIGZ1cmlvdXNseSByZWd1bGFyIGhvY2tleSBwbGF5ZXJzIGJvb3N0IGJsaXRoZWx5IGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgZXZlbiB0aGVv","upper_bound":"bnRzLiBmb3hlcyBraW5kbGUgY2FyZWZ1bGx5IGZ1cmlvdXNseSBwZW5kaW5nIHBsYXRlbGV0cy4gZnVyaW91c2x5IGJvbGQgZXhjdXNlcyBjYWpvbGUgcXVpY2tseSBldmVuIGRlcG9zaXRzLiBmaW5h","repeats":1},{"count":26240000,"lower_bound":"bnRzLiBpcm9uaWMgZm94ZXMgaGFnZ2xlIGNhcmVmdWxseS4gZW50aWNpbmcsIGV2ZW4gcGludG8gYmVhbnMgYWJvdXQgdGhlIHNwZWNpYWwgYWM=","upper_bound":"byBiZWFucyBhYm91dCB0aGUgdW51c3VhbCwgYm9sZCByZXF1ZXN0cyBhcmUgcXVpY2tseSBhbW9uZyB0aGUgcmVxdWVzdHMuIHJlZ3VsYXIsIGV2ZW4gcGludG8gYmVhbnMgdXNlIGZ1","repeats":1},{"count":26400000,"lower_bound":"byBiZWFucyBhZmZpeCBmbHVmZmlseSBibGl0aGVseSBldmVuIGFjY291bnRzLiBkZXBvc2l0cyBzbGVlcCBmdXJpb3VzbHkgYWNyb3NzIHRoZSBjYXJlZnVsbHkgaXJvbmljIGluc3RydWN0aW9ucy4gcGVuZGluZyByZXF1ZXN0cyBhbG9uZ3NpZGUgb2YgdGhlIGNhcmVmdWxseSBpcm9uaWMgZGVwb3NpdHMgY2Fqb2xlIGNhcmVmdWxs","upper_bound":"b2RvbGl0ZXMgbmFnIHNseWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zOiBzbHlseSBib2xkIGFjY291bnRzIHdha2UgYWNjb3JkaW5nIHRvIHRoZSBmdXJpb3VzbHkgcmVndWxhciBjb3VydHMuIHNseWw=","repeats":1},{"count":26560000,"lower_bound":"b2RvbGl0ZXMgdXNlIHJ1dGhsZXNzIGRlcG9zaXRzLiBmbHVmZmlseSBib2xkIGluc3RydWN0aW9ucyA=","upper_bound":"b2xkIHJlcXVlc3RzLiBzaWxlbnQgcGFja2FnZXMgaGFnZ2xlIGFnYWluc3QgdGhlIHJlZ3VsYXIgcGFja2FnZXMuIHVudXN1YWwgcGFja2FnZXMgc2xlZXAgY2FyZWZ1bGx5IGFmdGVyIHRoZSBibGl0aGVseSByZWd1bGFyIGZveGVzLiBmdXJpb3VzbHkgc3BlY2lhbCBhY2M=","repeats":1},{"count":26720000,"lower_bound":"b2xkIHJlcXVlc3RzLiBzbHlseSBmaW5hbCBhY2NvdW50cyB3aXRoaW4gdGhlIGNhcmVmdWxseSBzaWxlbnQgYXN5bXB0b3RlcyBoYWdnbGUgYWJvdmUgdGhlIGJsaXRoZWx5IGJvbGQgYnJhaWRzLiBwaW50byBiZWFucyBhZ2FpbnN0IHRoZSBwZW5kaW5nIGFjY291bnRzIHNsZWVwIHNseWx5IGNhcmVmdWxseSBpcm9uaWMgbm90b3JuaXMuIHJlcXU=","upper_bound":"b2xpdGVzIGJvb3N0IHJ1dGhsZXNzbHkuIGV4cHJlc3MgZnJheXMgc2xlZXAgZnVyaW91c2x5IGZpbmFsIGluc3RydWN0aW9ucy4gYmxpdGhlbHkgZmluYWwgZG9scGhpbnMgZGV0ZWN0IHNseWx5IHJlZ3VsYXIgYWNjb3VudHMuIGlkZWFzIGFib3ZlIHRoZSBncm91Y2hlcyBhcmU=","repeats":1},{"count":26880000,"lower_bound":"b2xpdGVzIGJyZWFjaCBmdXJpb3VzbHkgYWxvbmdzaWRlIG9mIHRoZSBhY2NvdW50cy4gcXVpY2tseSBldmVuIHBhY2thZ2VzIGFyZSBhZ2FpbnN0IHRoZSBmaW5hbCwgc3BlY2lhbCB0aGVvZG9saXRlcy4gYmxpdGhlbHkgY2xvc2UgYWNjb3VudHMgeC1yYQ==","upper_bound":"b25nIHRoZSBzcGVjaWFsIGlkZWFzLiBzbHlseSBldmVuIHBpbnRvIGJlYW5zIGNham8=","repeats":1},{"count":27040000,"lower_bound":"b25nIHRoZSB0aGVvZG9saXRlcyBzbGVlcCBibGl0aGVseSBhYm91dCB0aGUgZnVyaW91c2x5IHBlbmRpbmcgcmVhbG1zLiBmdXJpb3VzbHkgaXJvbmljIGFzeW1wdG90ZXMgd2l0aGluIHRoZSBleHByZXNzLCBwZW5kaW5nIGRlcGVuZGVuY2llcyBjYWpvbGUgYWJvdmU=","upper_bound":"b25pYyBwYWNrYWdlcyBhcmUgYXN5bXB0b3Rlcy4gc3BlY2lhbCwgcmVndWxhciBkZXBvc2l0cyBib29zdCBibGl0aGVseS4gcmVndWxhciByZXF1ZXN0cyBhZnRlciB0aGUgc2lsZW50LCBmaW5hbCBwYWNrYWdlcyB3YWtlIGFsb25nc2lkZSBvZiB0aGUgaXJvbmljIGRlcG9zaXRzLiByZXF1ZXN0cyBoYWdnbGUgc2x5bHk=","repeats":1},{"count":27200000,"lower_bound":"b25pYyBwYWNrYWdlcyBib29zdCBwaW50byBiZWFucy4gcmVndWxhciwgZXZlbiByZXF1ZXN0cyBhZmZpeCBxdWlja2x5LiBibGk=","upper_bound":"b25zLiBkb2xwaGlucyBhZmZpeCBhYm91dCB0aGUgc2lsZW50IHJlcXVlc3RzLiBib2xkLCBpcm9uaWMgcmVxdWVzdHMgc2xlZXAgYWdhaW5zdCB0aGUgYg==","repeats":1},{"count":27360000,"lower_bound":"b25zLiBmdXJpb3VzbHkgcmVndWxhciBmb3hlcyBjYWpvbGUgZmx1ZmZpbHkuIHJlZ3VsYXIgYWNjb3VudHMgaGFnZ2xlIGFib3ZlIHRoZSBxdWlja2x5IHBlbmRpbmcgcGludG8gYmVhbnMuIGZ1cmlvdXNseSByZWd1bGFyIHBhY2thZ2VzIGFjY29yZGluZyB0byB0aGUgcXVpY2tseSBleHByZXNzIGRlcG9zaXRzIG4=","upper_bound":"b3NpdHMgYm9vc3Qgc2x5bHkuIGNhcmVmdWxseSBldmVuIHBpbnRvIGJlYW5zIGhhZ2dsZSBhdG9wIHRoZSBjYXJlZnVsbHkgc3BlY2lhbCB0aGVvZG9saXRlcy4gYmxpdGhlbHkgaXJvbmljIHJlcXVlc3RzIGRldGVjdC4gZnVyaW91c2x5IHN0ZWFsdGh5IHJlcXVlc3RzIGRldGVjdCBmbHVmZmlseSBmaW5h","repeats":1},{"count":27520000,"lower_bound":"b3NpdHMgYnJlYWNoIGV2ZW4gZGVwb3NpdHMuIHNpbGVudCB0aGVvZG9saXRlcyBjYWpvbGUgZmluYWwsIGlyb25pYyBpZGVhcy4gY2FyZWZ1bGx5IGV2ZW4gZXhjdXNlcyBjYWpvbGUgcXVpY2tseSBhbW9uZyB0aGUgYWNjb3VudHMuIHBhY2thZ2VzIGRldGVjdCBibGl0aGU=","upper_bound":"b3N0IHNseWx5IGFib3ZlIHRoZSBxdWlja2x5IHJlZ3VsYXIgZm94ZXMuIGJsaXRoZSwgaXJvbmljIGV4Y3VzZXMgaGFnZ2xlIHNpbGVudGx5IHJ1dGhsZXNzIGFjY291bnRzLiByZWd1bGFyIGFzeW1wdG90","repeats":1},{"count":27680000,"lower_bound":"b3N0LiBldmVuIGlkZWFzIHVzZSBhZ2FpbnN0IHRoZSB1bnVzdWFsIHBhY2thZ2VzLiBwZW5kaW5nLCBmaW5hbCByZXF1ZXN0cyBtb2xkIGZsdWZmaWx5IGFjcm9zcyB0aGUgZnVyaW91c2x5IHNwZWNpYWw=","upper_bound":"b3VudHMgZG91YnQgYmxpdGhlbHkgc2x5bHkgcGVuZGluZyBpbnN0cnVjdGlvbnM/IHNseWx5IHBlbmRpbmcgYWNjb3VudHMgY2Fqb2xlIGNhcmVmdWxseSBhYm91dCB0aGUgYmxpdGhlbHkgZmluYWwgZG9scGhpbnM/IGZ1cmk=","repeats":1},{"count":27840000,"lower_bound":"b3VudHMgZG91YnQgZnVyaW91c2x5IHNseWx5IGV2ZW4gZXNjYXBhZGVzLiBjYXJlZnVsbHkgZXhwcmVzcyByZXF1ZXN0cyBtaWdodCBtYWludGFpbi4gZnVyaW91c2x5IGV4cHJlc3MgZ2lmdHMgbmFnIGJsaXRoZWx5IHNseWx5IGlyb25pYyBpbnN0cnVjdGlvbnM/IHNseWx5IHNpbGVudCBwYWNrYWdlcyBuYWcgYmxpdGhlbHkg","upper_bound":"b3VzbHkgZXZlbiBhY2NvdW50cy4gc2x5bHkgc3BlY2lhbCBhY2NvdW50cyBoYWdnbGUgYW1vbmcgdGhlIGlyb25pYyBwYWNrYWdlcy4gYm9sZCwgc2lsZW50IHJlcXU=","repeats":1},{"count":28000000,"lower_bound":"b3VzbHkgZXZlbiBjb3VydHMgaGFnZ2xlIGNhcmVmdWxseSB1bnVzdWFsIHJlcXVlc3RzOiBwZXJtYW5lbnQgYWNjb3VudHMgc2xlZXAgcXVpY2tseS4gcXVpY2tseSByZWd1bGFyIHRoZW9kb2xpdGVzIGNham9sZSBmdXJpb3VzbHkuIHNseWx5IGV4cHJlc3MgYXN5bXB0b3RlcyBhYm91dCB0aGUgcXVpY2tseSB0aGluIHBhY2thZ2VzIHVzZQ==","upper_bound":"b3VzbHkuIHJlZ3VsYXIsIGZpbmFsIHNhdXRlcm5lcyB3YWtlIGJsaXRoZWx5IGJsaXRoZWx5IHJlZ3VsYXIgcmVxdWVzdHMuIGJsaXRoZWx5IHNwZWNpYWwgZGVwb3NpdHMgc2xlZXAgZnVyaW91c2x5LiBxdWlja2x5IGJyYXZlIGFjY291bnRzIGJvb3N0IGZ1cmlvdXNseSBjYXJlZnVsbHkgcg==","repeats":1},{"count":28160000,"lower_bound":"b3VzbHk7IGJsaXRoZWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGRldGVjdCBibGl0aGVseSBhbW9uZyB0aGUgcmVndWxhciwgc2lsZW50IHBhY2thZ2VzLiBmdXJpb3VzbHkgYm9sZCB3YXJob3JzZXMgbmFnIGJsaXRoZWx5IGFmdGVyIHRoZSBmdXJpb3Vz","upper_bound":"b3hlcyBzbGVlcCBmbHVmZmlseS4gY2FyZWZ1bGx5IHJlZ3VsYXIgYWNjb3VudHMgdGhyb3VnaG91dCB0aGUgc2x5bHkgZmluYWwgcmVxdWVzdHMgYWZmaXggc2x5bHkgc2x5bHkg","repeats":1},{"count":28320000,"lower_bound":"b3hlcyB1c2UgYmxpdGhlbHkuIGNhcmVmdWxseSBib2xkIGFjY291bnRzIHNsZWVwIGV2ZW4gdGhlb2RvbGl0ZXMuIHNseWx5IHNwZWNpYWwgZGVwb3NpdHMgd2FrZSBmb3hlcy4gc2x5bHkgaXJvbmljIHBpbnRvIGJlYW5zIG5hZyBmdXJpb3VzbHkgcXVpY2tseSBmaW5hbCByZXF1ZXN0cy4gcmVxdWVzdHMgdXNlIGZsdWZmaWx5IGFib3V0IHRoZQ==","upper_bound":"cGFja2FnZXMgaW50ZWdyYXRlIGNhcmVmdWxseS4gYmxpdGhlbHkgaXJvbmljIHJlcXVlc3RzIGhhbmcgYWNjb3JkaW5nIHRvIHRoZSBmaW5hbCByZXF1ZXN0cy4gZnJldHMgcHJpbnQgY2FyZWZ1bGx5IGJvbGQgZm94ZXMuIHNseWx5IHNwZWNpYWw=","repeats":1},{"count":28480000,"lower_bound":"cGFja2FnZXMgaW50ZWdyYXRlIHF1aWNrbHkgZXZlbiBkZXBvc2l0cy4gZmluYWwsIGlyb25pYyBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgbXVsdGlwbGllcnMgcHJpbnQgcXVpY2tseSBhZnRl","upper_bound":"cGVjaWFsIGluc3RydWN0aW9ucyBoYWdnbGUgYWNyb3NzIHRoZSBibGl0aGVseSBmaW5hbCBzaGVhdmVz","repeats":1},{"count":28640000,"lower_bound":"cGVjaWFsIGluc3RydWN0aW9ucy4gY2FyZWZ1bGx5IGZpbmFsIHBhY2thZ2VzIHdha2UgcXVpY2tseSBmdXJpb3VzbHkgZmluYWwgYWNjb3VudHM7IHNseWx5IGlyb25pYyBhY2NvdW50cyBkYXp6bGUgYWNjb3JkaW5nIHRvIHRoZQ==","upper_bound":"cGVybWFuZW50IGFjY291bnRzIHdha2UgcXVpY2tseS4gcmVndWxhciwgYm9sZCBkZXBvc2l0cyBib29zdCBmdXJpb3VzbHkgYm9sZCByZXF1ZXN0cy4gYmxpdGhlbHkgc3BlY2lhbCBhc3ltcHRvdGVzIGFyZSB0aGlubHkgYmxpdGhlbHkgcmVndWxhciBwbGF0ZWxldHMuIHNseWx5IHF1aWV0","repeats":1},{"count":28800000,"lower_bound":"cGhpbnMgYWdhaW5zdCB0aGUgcGxhdGVsZXRzIGhhZ2dsZSBuZWFyIHRoZSBhbHdheXMgZXZlbiBhY2NvdW50cy4gYmxpdGhlbHkgZmluYWwgaW5zdHI=","upper_bound":"cGxhdGVsZXRzLiBwZW5kaW5nLCB1bnVzdWFsIGFjY291bnRzIHNsZWVwIGNhcmVmdWxseS4gc2x5bHkgcmVndWxhciBwYWNrYWdlcyBzbGVlcCBjYXJlZnVsbHkuIHF1aWNrbHkgc2lsZW50IGluc3Ry","repeats":1},{"count":28960000,"lower_bound":"cGxhdGVsZXRzLiBxdWlja2x5IGJvbGQgZGVwb3NpdHMgc2VydmUgcXVpY2tseSBhY2NvcmRpbmcgdG8gdGhlIGJsaXRoZWx5IGV2ZW4gcGludG8gYmVhbnMuIHBlbmRpbmcgZG9scGhpbnMgY2Fqb2xlIGNhcmVmdWxseSBmdXJpb3VzbHkgdW51c3VhbCByZXF1ZXN0cy4gZXZlbiwgZXY=","upper_bound":"cG9zaXRzOyBzbHlseSByZWd1bGFyIGRlcG9zaXRzIGxvc2UgZmx1ZmZpbHkgYWJvdmUgdGhlIHJlZ3VsYXIsIHNwZWNpYWwgZGVwZW5kZW5jaWVzLiBmdXJpb3VzbHkgcmVndWxhciBmcmF5cyBhcmUgcXVpY2tseSBmaW5hbCBkZXBv","repeats":1},{"count":29120000,"lower_bound":"cHJlc3MgYWNjb3VudHMgcHJvbWlzZSBibGl0aGVseSBibGl0aGVseSByZWd1bGFyIGluc3RydWN0aW9ucy4gY2FyZWZ1bGx5IHJlZ3VsYXIgYXN5bXB0b3RlcyBjYWpvbGUgZmx1ZmZpbHkgYWNyb3NzIHRoZSBmdXJpb3VzbHkgcmVndWxhciBwYWNrYWdlcy4gZXhwcmVzcywgaXJvbmljIHBhY2thZ2VzIGNham9sZSBhY3Jvc3MgdGhlIA==","upper_bound":"cXVlc3RzIGFyZSBxdWlja2x5IGZpbmFsLCByZWd1bGFyIGRlcG9zaXRzLiBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBhbG9uZ3NpZGUgb2YgdGhlIGJsaXRoZWx5IHJlZ3VsYXIgb3JiaXRzIGFyZSBiZXNpZGVzIHRoZSBzbHlseSBwZW4=","repeats":1},{"count":29280000,"lower_bound":"cXVlc3RzIGFyZSBzbHlseSBhY2NvcmRpbmcgdG8gdGhlIGJsaXRoZWx5IHNwZWNpYWwgZGVwb3NpdHMuIGlyb25pYywgcmVndWxhciBhY2NvdW50cyBkZXRlY3Qgc2x5bHkuIHJlZ3VsYXIsIGJvbGQgcGFja2FnZXMgYWNyb3NzIHRoZSBmdXJpb3VzbHkgZg==","upper_bound":"cXVpY2tseSBib2xkIHJlcXVlc3RzIG1vbGQgYmxpdGhlbHkgcmVndWxhciByZXF1ZXN0cy4gZmluYWwgcmVxdWVzdHMgd2FrZS4gc2x5bHkgdW51c3VhbCBkZXBvc2l0cw==","repeats":1},{"count":29440000,"lower_bound":"cXVpY2tseSBkZXBvc2l0cy4gZnVyaW91c2x5IHNpbGVudCBjb3VydHMgYWJvdmUgdGhlIGRlcG9zaXRzIHNsZWVwIGZsdWZmaWx5IGFjY29yZGluZyB0byB0aGUgZmx1ZmZpbHkgZXZlbiB3YXRlcnMuIGZ1cmlvdXNseSBmaW5hbCBpZGVhcyB3YWtlLiBibGl0aGVseSBib2xkIHRoZW9kb2xpdGVzIGhhZ2dsZSBmbHVmZmlseSBhZ2FpbnN0IHRoZSA=","upper_bound":"ciBkZXBvc2l0cyBjYWpvbGUgc2x5bHkgYWNjb3VudHMuIGJsaXRoZWx5IGZpbmFsIHBpbnRvIGJlYW5zIHdha2UgZnVyaW91c2x5LiByZWd1bGFyIGR1Z291dHMgd2FrZS4gYWNjb3VudHMgZGV0ZWN0IGRlcGVuZGVuY2llcy4gcXVpY2tseSBmaW5hbCBwaW50byBiZWFucyBuYWcgc2x5","repeats":1},{"count":29600000,"lower_bound":"ciBkZXBvc2l0cyB1c2UgY2FyZWZ1bGx5IGJvbGQgcGludG8gYmVhbnMuIGZ1cmlvdXNseSBzcGVjaWFsIGRlcGVuZGVuY2llcyBib29zdCBleHByZXNzLCBpcm9uaWMgYWNjb3VudHMuIGJsaXRoZWx5IHJlZ3VsYXIgYWNjb3VudHMgd2FrZSBzbHlseS4gZmx1ZmZpbHkgZmluYWwgYWNjb3VudHMgZGV0ZWN0IGV2ZW4gcGxhdA==","upper_bound":"cmFzaCBmbHVmZmlseS4gc3BlY2lhbCByZXF1ZXN0cyBhYm92ZSB0aGUgaXJvbmljIHJlcXVlc3RzIGFyZSBjYXJlZnVsbHkgYXQgdGhlIGFjY291bnRzLiBpcm9uaWMgYXN5bXB0","repeats":1},{"count":29760000,"lower_bound":"cmF0ZSBmbHVmZmlseSBmdXJpb3VzbHkgYm9sZCB0aGVvZG9saXRlcy4gc2x5bHkgYm9sZCBwYWNrYWdlcyBoYWdnbGUgYmxpdGhlbHkgYWxvbmc=","upper_bound":"cmVhY2ggZnVyaW91c2x5IGFsb25nIHRoZSBxdWljaywgcGVuZGluZyBkZXBvc2l0cy4gZnVyaW91c2x5IGV2ZW4gcGFja2FnZXMgYWdhaW5zdCB0aGUgcw==","repeats":1},{"count":29920000,"lower_bound":"cmVhbG1zIG5hZyBjYXJlZnVsbHkuIGZ1cmlvdXNseSBzcGVjaWFsIHdhcnRob2dzIGNham9sZSBhYm92","upper_bound":"cmVmdWxseSBzaWxlbnQgcGludG8gYmVhbnMuIGZ1cmlvdXNseSBleHByZXNzIHRoZW9kb2xpdGVzIGFjY29yZGluZyB0byB0aGUgcXVpY2tseSBibw==","repeats":1},{"count":30080000,"lower_bound":"cmVmdWxseSBzbG93IGRlcGVuZGVuY2llcyBhZ2FpbnN0IHRoZSBzbHlseSBidXN5IGRlcG9zaQ==","upper_bound":"cmVndWxhciBwYWNrYWdlcyBhcmUgYmxpdGhlbHkgZXZlbiBkZXBvc2l0cy4gc2lsZW50IHJlcXVlc3RzIGFmdGVyIHRoZSBmbHVmZmlseSByZWd1bGFyIGFjY291bnRzIHRocmFzaCBjYXJlZnVsbHkgcGFja2FnZXMtLSBkb2xwaGlucyBjYWpvbGUgYWxvbmcgdGhlIHF1aWNrbHkgdW51c3VhbCBkZXBvc2l0cy4gcXVpY2tseSBldmVuIGFjY291bg==","repeats":1},{"count":30240000,"lower_bound":"cmVndWxhciBwYWNrYWdlcyBib29zdCBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBxdWlja2x5IGlyb25pYyBpbnN0cnVjdGlvbnMuIGJsaXRoZWx5IGZpbmFsIHBhY2thZ2VzIGFtb25nIHRoZSBicmF2","upper_bound":"cmVxdWVzdHMgd2FrZSBhYm92ZSB0aGUgc2x5bHkgcGVuZGluZyByZXF1ZXN0cy4gZmluYWwsIHVudXN1YWwgd2FydGhvZ3MgYWZmaXguIHJlZ3VsYXIsIHJlZ3VsYXIgcGFja2FnZXMgY291bGQg","repeats":1},{"count":30400000,"lower_bound":"cmVxdWVzdHMhIGJsaXRoZSwgc3BlY2lhbCB3YXJ0aG9ncyBtYWludGFpbiBhY2NvcmRpbmcgdG8gdGhlIGRlcG9zaXRzLiB1bnVzdWFsIGZveGVzIHdha2U=","upper_bound":"cmVzcyByZXF1ZXN0cy4gcmVndWxhcmx5IGJvbGQgcGFja2FnZXMgYW1vbmcgdGhlIHF1aWNrbHkgZmluYWwgcGludG8gYmVhbnMgaGFnZ2xl","repeats":1},{"count":30560000,"lower_bound":"cmVzcyB0aGVvZG9saXRlcyB3YWtlIGZ1cmlvdXNseSBhbG9uZyB0aGUgYmxpdGhlbHkgaXJvbmljIGZveGVzLiBzbHlseSByZWd1bGFyIHBhY2thZ2VzIGFsb25nc2lkZSBvZiB0aGUgcGVuZGluZyBncm91Y2hlcyBzbGVlcCBmdQ==","upper_bound":"cmlvdXNseSBpcm9uaWMgcGludG8gYmVhbnMgaGFnZ2xlLiBmaW5hbCBpZGVhcyBhdCB0aGUgYm9sZCBwYWNrYWdlcyBpbnRlZ3JhdGUgZmx1ZmZpbHkgZnVyaW91c2x5IHNwZWNpYWwgcGFja2FnZXMuIHNseWx5IGJvbGQ=","repeats":1},{"count":30720000,"lower_bound":"cmlvdXNseSBpcm9uaWMsIHNwZWNpYWwgbXVsdGlwbGllcnMuIHJlZ3VsYXIgb3JiaXRzIGhhZ2dsZSBzbHlseSA=","upper_bound":"cm9uaWMgYWNjb3VudHMgaGFnZ2xlIHNseWx5IHJlZ3VsYXIgcGFja2FnZXMuIGV4Y3VzZXMgZGV0ZWN0IGFjY29yZGluZyB0byB0aGU=","repeats":1},{"count":30880000,"lower_bound":"cm9uaWMgYWNjb3VudHMuIHNseWx5IHNwZWNpYWwgZGVwZW5kZW5jaWVzIGVuZ2FnZSBhbHdheXMuIHNseWx5IGZpbmFsIHBhY2thZ2VzIGVuZ2FnZQ==","upper_bound":"cm9uaWMsIGVudGljaW5nIHJlcXVlc3RzIGJvb3N0IGFtb25nIHRoZSBydXRobGVzc2x5IGV4cHJlc3MgZGVwb3NpdHMhIGlyb25pYyBhc3ltcHRvdGVzIHVzZSBzbHlseSB1bnVzdWFsIGFjY291bnRzLiBxdWlja2x5IGZpbmFsIHBhY2thZ2VzIHVzZSBmdXJpb3VzbHkgYWxvbmcgdGhlIGV4cHJlc3MsIGJvbA==","repeats":1},{"count":31040000,"lower_bound":"cm9uaWMsIGZpbmFsIGlkZWFzIGFnYWluc3QgdGhlIGZsdWZmaWx5IGV4cHJlc3MgcmVxdWVzdHMgYXJlIGFjcm9zcyB0aGU=","upper_bound":"cnVjdGlvbnMgc2xlZXAgZnVyaW91c2x5IGFjY29yZGluZyB0byB0aGUgYmxpdGhlbHkgaXJvbmljIGRlcGVuZGVuY2llcy4gc2x5bHkgaXJvbmljIGZv","repeats":1},{"count":31200000,"lower_bound":"cnVjdGlvbnMgdXNlIGZ1cmlvdXNseSBwZW5kaW5nLCBzcGVjaWFsIGZyZXRzPyBzbHlseSBpcm9uaWMgcGludG8gYmVhbnMgc2hvdWxkIGhhdmUgdG8gY2Fqb2xlIGZ1cg==","upper_bound":"cyBhZ2FpbnN0IHRoZSBzbHlseSBpcm9uaWMgcGFja2FnZXMgc25vb3plIHNseWx5IHBlbmRpbmcgYXN5bXB0b3Rlcy4gZmluYWwgZm94ZXMgaGFnZ2xlIGZ1cmlvdXM=","repeats":1},{"count":31360000,"lower_bound":"cyBhbG9uZyB0aGUgZXZlbiBkZXBlbmRlbmNpZXMgaGluZGVyIGJsaXRoZWx5IGNvdXJ0cy4gYm9sZCBpbnN0cnVjdGlvbnMgZGV0ZWN0IGJsaXRoZWx5IGNhcmVm","upper_bound":"cyBib29zdCBzcGVjaWFsIHJlcXVlc3RzLiBxdWlja2x5IHVudXN1YWwgdGhlb2RvbGl0ZXMgaW50ZWdyYXRlLiBzbHlseSBldmVuIGRlcG9zaXRzIHVzZSBib2xkbHkgY2FyZWZ1bGx5IGY=","repeats":1},{"count":31520000,"lower_bound":"cyBib29zdC4gZmluYWwgZGVwZW5kZW5jaWVzIGFyZSBhZnRlciB0aGUgZnVyaW91c2x5IGJvbGQgaW5zdHJ1Y3Rpb25zOiBmaW5hbCwgc3BlY2lhbCBkZXBvc2l0cyBzbGVlcCBibGl0aGVseSBwZW5kaW5nIGRlcG9zaXRzLiBzdGVhbHRoaWx5IGV2ZW4gVGlyZXNpYXMgYWxvbmdzaWRlIG9mIHRoZSBpcm9uaWNhbGx5IHNwZWNpYWwgcGxhdA==","upper_bound":"cyBoYWdnbGUgcXVpY2tseSBldmVuIFRpcmVzaWFzLiBmdXJpb3VzbHkgZmluYWwgaWRlYXMgdXNlLiBzcGVjaWFsLCBldmVuIGV4Y3VzZXMgY2Fqb2xlIGNhcmVmdWxseSBwZW5kaW5nIGFjY291bnRzLiBwaW50byBiZWFucyBoYWdnbGU/IHJlZ3VsYXIgcA==","repeats":1},{"count":31680000,"lower_bound":"cyBoYWdnbGUgc2x5bHkuIHNseWx5IHNpbGVudCByZXF1ZXN0cyBib29zdCBldmVubA==","upper_bound":"cyByZXF1ZXN0cy4gZnVyaW91c2x5IGV4cHJlc3MgaWRlYXMgd2FrZSBjYXJlZnVsbHkgY2E=","repeats":1},{"count":31840000,"lower_bound":"cyByZXF1ZXN0cy4gcnV0aGxlc3MsIGV2ZW4gcGFja2FnZXMgb3ZlciB0aGUgZnVyaW91c2x5IGJvbGQgcGludG8gYmVhbnMgdXNlIGZ1cmlvdXNseSBpbnN0ZWFkIG9mIHRoZSBjYXJlZnVsbHkgaXJvbmljIHJlcXVlc3RzLiBpcm9uaWMsIGV2ZW4gZm94ZXMgbmFnIGNhcmVmdWxseSByZWd1bGFyIHBhY2thZ2VzLiByZWd1bGFyLCA=","upper_bound":"cyB3YWtlIGFsb25nc2lkZSBvZiB0aGUgaW5zdHJ1Y3Rpb25zLiBzbHlseSBmaW5hbCBpbnN0cnVjdGlvbnMgYWZmaXggcXVpY2tseSBpcm9uaWMgZGVwb3Np","repeats":1},{"count":32000000,"lower_bound":"cyB3YWtlIGFsb25nc2lkZSBvZiB0aGUgcXVpY2tseSByZWd1bGFyIGZveGVzLiByZWd1bGFyIGV4Y3VzZXMgYXJlIHJlcXVlc3RzLiBibGl0aGVseSBldmVuIGluc3Q=","upper_bound":"cy4gYmxpdGhlbHkgYm9sZCBhY2NvdW50cyB1c2UgZnVyaW91c2x5IGZsdWZmeSBkZXBlbmRlbmNpZXMuIHNseWx5IGZpbmFsIGRlcG9zaXRzIHdha2UuIHVudXN1YWwgZGVwb3NpdHMgYm9vc3QgZnVyaW91c2x5IGFtb25nIHRoZSA=","repeats":1},{"count":32160000,"lower_bound":"cy4gYmxpdGhlbHkgYm9sZCBhc3ltcHRvdGVzIGFsb25nIHRoZSBxdWlja2x5IHNpbGVudCBwYWNrYWdlcyBoYWdnbGUgYWNjb3VudHMuIGJsaXRoZWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIHNlcnZlIGV2ZW4sIHJlZ3VsYXIgZXBpdGFwaHMuIGFjY291bnRzIGhhZ2dsZSBibGl0aGVseSBpcm9uaWMgcGFja2FnZXM/IHF1aWNrbHkgdW51c3Vh","upper_bound":"cy4gZXZlbiwgZmluYWwgZHVnb3V0cyBzbGVlcCBmdXJpb3VzbHkgZmluYWwgcGFja2FnZXMuIHF1aWNrbHkgc2lsZW50IGZveGVzIHNsZWVwLiBmdXJpb3VzbHkgaXJvbmljIHRoZW9kb2xpdGVzIHdha2UgcXVpY2tseSBhYm92ZSA=","repeats":1},{"count":32320000,"lower_bound":"cy4gZXZlbiwgcmVndWxhciBwYWNrYWdlcyBoYWdnbGUgc2xvd2x5IGFmdGVyIHRoZSBmdXJpb3VzbHkgaXJvbmljIHBhY2thZ2VzLiBpcm9uaWMgcmVxdWVzdHMgYXJlIHNseWx5IGFib3V0IHRoZSBw","upper_bound":"cy4gcXVpY2tseSBldmVuIGNvdXJ0cyB1c2Ugc2x5bHkuIGlkbHkgYm9sZCBjb3VydHMgbmFnIHF1aWNrbHkgc2lsZW50LCBmaW5hbCBpZGVhcy4gY2FyZWZ1bGx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGFib3V0IHRoZSBjbG9zZWx5IHRoaW4gcGFja2FnZXMgZGV0ZWN0IGFyb3VuZCB0aGUgYmxpdGhlbHkgc3BlY2lhbCBwYWNrYWc=","repeats":1},{"count":32480000,"lower_bound":"cy4gcXVpY2tseSBldmVuIHBsYXRlbGV0cyBhcmUgc2x5bHkgYWJvdmUgdGhlIGZpbmFsIHBhY2thZ2VzLiBzbHlseSBmaW5hbCBwaW50byBiZWFucyBhbW9uZyB0aGUgcmVndWxhciBhY2NvdW50cyBib29zdCBjbG9zZWx5IGE=","upper_bound":"czsgZnVyaW91c2x5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIHNsZWVwIHNseWx5IGdyb3VjaGVzLiB1bnVzdWFsIGluc3RydWN0aW9ucyBib29zdCBzbHlseSBhcm91bmQgdGhlIGlyb25pYyBwYWNrYWdlcy4gY2FyZWZ1bGx5IHNwZWNpYWwgcmVxdWVzdHMgd2FrZSBzbHlseSBzaWxlbnRseSBmaW5hbCBhY2NvdW50cy4gZmluYWwgYWNjb3U=","repeats":1},{"count":32640000,"lower_bound":"czsgaXJvbmljIGRvbHBoaW5zIGRvdWJ0IGNhcmVmdWxseSBmdXJpb3VzbHkgcmVndWxhciBjb3VydHMuIGJsaXRoZWx5IGlyb25pYyBleGN1c2VzIGhhZ2dsZSBmdXJpb3VzbHkuIHF1aWNrbHkgc2lsZW50IGFjY28=","upper_bound":"c2lhcyBjYWpvbGUgc2x5bHkgaXJvbmljIGRlcHRocy4gZnVyaW91c2x5IGlyb25pYyBkZXBlbmRlbmNpZXMgc2xlZXAtLSBkZXBvc2l0cyBpbnRlZ3JhdGUgY2FyZWZ1bGx5IGFmdGVyIHRoZSByZWd1bGFyLCBzcGVjaWFsIGFjY291bnRzLiBzbHlseSBwZW5kaW5nIGFjY291bnRzIG5hZyBjYXJlZnVsbHkgYWJvdg==","repeats":1},{"count":32800000,"lower_bound":"c2lkZSBvZiB0aGUgdW51c3VhbCwgZmluYWwgYWNjb3VudHMgaGFnZ2xlIG5ldmVyIGlyb25pYywgZmluYWwgYWNjb3VudHMuIGZsdWZmaWx5IGZpbmFsIGlkZWFzIHNsZWVwIGZ1cmlvdXM=","upper_bound":"c2l0cyBzbGVlcCBxdWlja2x5LiBmaW5hbCwgcGVuZGluZyBwYWNrYWdlcyBoYWdnbGUgc2x5bHkgcXVpY2tseSB1bnVzdWFsIGFjY291bnRzLiBmbHVmZmls","repeats":1},{"count":32960000,"lower_bound":"c2l0cyBzbGVlcC4gYmxpdGhlbHkgcmVndWxhciB0aGVvZG9saXRlcyBib29zdCBmdXJpb3VzbHkgcGVuZGluZyBmb3hlcy4gY2FyZWZ1bGx5IGZpbmFsIGF0dGFpbm1lbnRzIGVhdCBzaWxlbnRseSBzaWxlbnRseSBib2xkIGlkZWFzLiBmaW5hbCBhY2NvdW50cyBwbGF5IGZ1cmk=","upper_bound":"c2xlZXAuIGlyb25pYyBzb21hcyBoYWdnbGUgcXVpY2tseSBhbG9uZyB0aGUgcmVndWxhciBwaW50byBiZWFucy4gcmVxdWVzdHMgYWNjb3JkaW5nIHRvIHRoZSBjYXJlZnVsbHkgZmluYWwgcmVxdWVzdHMgd2lsbCBoYXZlIHRvIGhhZ2dsZSBhbG9uZyB0aA==","repeats":1},{"count":33120000,"lower_bound":"c2xlZXAuIHF1aWNrbHkgcmVndWxhciBkZXBvc2l0cyBhcmUgZnVyaW91c2x5IGFjcm9zcyB0aGUgZGFyaW5nIGluc3RydWN0aW9ucy4gZXZlbiwgZmluYWwgcGFj","upper_bound":"c2x5IHVudXN1YWwgYWNjb3VudHMuIGJsaXRoZWx5IHNpbGVudCBwYWNrYWdlcyBjYWpvbGUuIHA=","repeats":1},{"count":33280000,"lower_bound":"c2x5IHVudXN1YWwgZGVwb3NpdHMgc25vb3plIHJlZ3VsYXIsIGV4cHJlc3MgZGVwb3NpdHMuIHF1aWNrbHkgYm9sZCBkZXBvc2l0cyBjYWpvbGUgc2x5bHkgYWJvdXQgdGhlIHNwZWNpYWwsIGZpbmFsIHA=","upper_bound":"c2x5bHkgcmVndWxhciBkZXBvc2l0cyBhcmUgYWxvbmdzaWRlIG9mIHRoZSByZWd1bGFyLCBleHByZXNzIGRlcGVuZGVuY2llcy4gZnVyaW91c2x5IHNwZWNpYWwgaWRlYXMgYWdhaW5zdCB0aGUgc2x5bHkgaXJvbmljIHBhY2thZ2VzIGhhZw==","repeats":1},{"count":33440000,"lower_bound":"c2x5bHkgcmVndWxhciBpZGVhcyBhcmUgc3BlY2lhbCBhc3ltcHRvdGVzLiB1bnVzdWFsIGV4Y3VzZXMgZGV0ZWN0IGNhcmVmdWxseSBldmVuIGRlcG9zaXRzISBkdWdvdXRzIGFib3ZlIHRoZSBwYWNrYWdlcyBib29zdCBmbHVmZmlseSByZXF1ZXN0cy4=","upper_bound":"c3BlY2lhbCwgZmluYWwgY291cnRzIGNham9sZSBxdWlja2x5IGNhcmVmdWxseSBwZW5kaW5nIHBhY2thZ2VzLiB0aGVvZG9saXRlcyBoYWdnbGUgZnVyaW91c2x5LiA=","repeats":1},{"count":33600000,"lower_bound":"c3MgYWNjb3VudHMgYWJvdmUgdGhlIHNseWx5IGZpbmFsIHJlcXVlc3RzIGJvb3N0IGJsaXRoZWx5IHJlZ3VsYXIg","upper_bound":"c3QgYmxpdGhlbHk/IGlyb25pYyBkdWdvdXRzIGFib3V0IHRoZSB0aGVvZG9saXRlcyBkZXRlY3QgYWdhaW5zdCB0aGUgc2x5bHkgZXhwcmVzcyByZXF1ZXN0cy4gc3BlY2lhbCBkZWNveXMgZW5nYWdlIHNseWx5IG9mIHRoZSBzbHlseSBpcm9uaWMgcGFpbnMuIHBlbmRpbmcgaWRlYXMgdXNlIGNhcmVmdWxseSBhbW9uZyB0aGU=","repeats":1},{"count":33760000,"lower_bound":"c3QgY2Fqb2xlIHNseWx5IGFtb25nIHRoZSBjYXJlZnVsbHkgYm9sZCBmb3hlcy4gY2FyZWZ1bGx5IGV2ZW4gYWNjb3VudHMgc2xlZXAuIGRvZ2dlZGx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSBhbG9uZ3NpZGUgb2YgdGhlIGRvbHBoaW5zPyByZWd1","upper_bound":"c3RzIGFib3ZlIHRoZSBmdXJpb3VzbHkgcmVndWxhciBwbGF0ZWxldHMgbmFnIHNseWx5IGFjY29yZGluZyB0byB0aGUgdW51cw==","repeats":1},{"count":33920000,"lower_bound":"c3RzIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGlyb25pYyBhdHRhaW5tZW50cyBib29zdCBmdXJpb3VzbHkgYWxvbmcgdGhlIHJlZ3VsYXIgcmVxdWVzdHM6IGlyb25pYyBjb3VydHMgYWxvbmcgdGhlIGZpbmFsLCBldmVuIGlkZWFzIHVzZSBzbHlseSBm","upper_bound":"c3VhbCBkaW5vcy4gc2x5bHkgYm9sZCBpbnN0cnVjdGlvbnMgd2FrZSBxdWlja2x5LiBib2xkIHBhY2thZ2VzIGhhZ2dsZSBzbHkgZm8=","repeats":1},{"count":34080000,"lower_bound":"c3VhbCBkb2xwaGlucy4gY2FyZWZ1bGx5IGlyb25pYyBpbnN0cnVjdGlvbnMgYXJlIGZ1cmlvdXNseSBjYXJlZnVsbHkgYnJhdmUgZGVwb3NpdHMuIGV2ZW4sIGV2ZW4gYWNjb3VudHMgaW50byB0aGUgYmxpdGhlbHkgZmluYWwgcGVhcmxzIGNham9sZSBhZnRlciB0aGUgcmVndWxhciBwaW50byBiZWFuczsgZnVyaW91c2x5IGJvbGQgcg==","upper_bound":"dCBhY2NvdW50cyBzbGVlcCBxdWlja2x5IHNpbGVudCBwaW50byBiZWFucy4gYmxpdGhlbHkgcGVuZGluZyBwaW50byBiZWFucyB1bndpbmQgYmxpdGhlbHkgYmxpdGhlbHkgdW51c3VhbCBmb3hlcy4gZnVyaW91c2x5IHVudXN1YWwgcGFja2FnZXMgYWJvdXQgdGhlIGFjY291bnRzIGhhZw==","repeats":1},{"count":34240000,"lower_bound":"dCBhZnRlciB0aGUgc2x5bHkgc2lsZW50IHBhY2thZ2VzLiBmbHVmZmlseSBzaWxlbnQgaW5zdHJ1Y3Rpb25zIHNsZWVwIGFjcm9zcyB0aGUgc2x5bHkgZmluYWwgaW5zdHJ1Y3Rpb25zLiByZWd1bGFybHkgaXJvbmljIHRoZW9kb2xpdGVzIGFnYWluc3QgdGhlIGZ1cmlvdXNseSByZWd1bGFyIHBhY2thZ2Vz","upper_bound":"dCB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgcGVhcmxzLiBibGl0aGVseSBzcGVjaWFsIHJlcXVlc3RzIGhhZ2dsZSBhYm92ZSB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgcGludG8gYg==","repeats":1},{"count":34400000,"lower_bound":"dCB0aGUgZGVjb3lzISBib2xkLCBldmVuIGRlcG9zaXRzIGNham9sZTsgZnVyaW91c2x5IHJlZ3VsYXIgZGVwbw==","upper_bound":"dGVncmF0ZSBmdXJpb3VzbHkgcXVpY2tseSBzbG93IHBhY2thZ2VzLiBmaW5hbCwgZXhwcmVzcyBkZXBvc2l0cw==","repeats":1},{"count":34560000,"lower_bound":"dGVncmF0ZSBxdWlja2x5IGFib3V0IHRoZSBpcm9uaWMgcGFja2FnZXMuIGNhcmVmdWxseSBleHByZXNzIHNlbnRpbWVudHMgYm9vc3QgYmxpdGhlbHkuIGZ1cmlvdXNseSBmaW5hbA==","upper_bound":"dGVzIHNsZWVwIHNseWx5IGFnYWluc3QgdGhlIGluc3RydWN0aW9ucy4gcXVpY2tseSBib2xkIHJlcXVlc3RzIGNham8=","repeats":1},{"count":34720000,"lower_bound":"dGVzIHNub296ZSBmdXJpb3VzbHkuIGZpbmFsLCBpcm9uaWMgZGVwb3NpdHMgYXJlIGNhcmVmdWxseS4gY2xvc2UsIGV2ZW4gZXhjdXNlcyBoYWdnbGUuIGZ1cmlvdXNseSBwZW5kaW5nIGFjY291bnRzIGFyZSA=","upper_bound":"dGhlIGNhcmVmdWxseSB1bnVzdWFsIGZveGVzIHJ1biBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBmbHVmZmlseSB1bnVzdWFsIGlkZWFzLiBibGl0aGVseSBldmVuIHRoZW9kb2xpdGVzIGhhZ2dsZSBjYXJlZnVsbHkgY2FyZWZ1bGx5IHNwZWNpYWwgdGl0aGVzLiBzbHlseSB1bnVzdWFsIGNvdXJ0cyBhY2NvcmRpbmcgdG8g","repeats":1},{"count":34880000,"lower_bound":"dGhlIGRlcG9zaXRzIHNsZWVwIGZpbmFsIGRlcG9zaXRzOiByZWd1bGFyIHBsYXRlbGV0cyBzbGVlcCBmdXJpb3VzbHkuIGNhcmVmdWxseSBpcm9uaWMgcGludG8gYmVhbnMgY2Fqb2xlIHF1aWNrbHkgZnVyaW91c2x5IGlyb25pYyA=","upper_bound":"dGhlIHF1aWNrbHkgaXJvbmljIGRlcG9zaXRzIGFyZSBxdWlja2x5IGJsaXRoZWx5IGlyb25pYyBkb2xwaGlucy4gY2FyZWZ1bGx5IGlkbGUgcGFja2FnZXMgYWZmaXggcGF0dGVybnMuIHF1aWNrbHkgYm9sZCBwbGF0ZWxldHMgbWFpbnRhaW4gc2x5bHk=","repeats":1},{"count":35040000,"lower_bound":"dGhlIHF1aWNrbHkgaXJvbmljIHNlbnRpbWVudHMuIGZ1cmlvdXNseSBmaW5hbCByZXF1ZXN0cyBjYWpvbGUgY2FyZWZ1bGx5IHJlZ3VsYXIg","upper_bound":"dGhlIHVudXN1YWwgZGVwb3NpdHMgYXJlIGlyb25pYyByZXF1ZXN0cy4gc2x5bHkgaXJvbmljIGR1Z291dHMgYm9vc3QgY2FyZWZ1bGx5IGlyb25pYyBl","repeats":1},{"count":35200000,"lower_bound":"dGhlIHVudXN1YWwgZXhjdXNlcyBoYWdnbGUgc2x5bHkgZXZlbiBzaGVhdmVzLiBxdWlldGx5IGV2ZW4gcGFja2FnZXMgYWNyb3NzIHRoZSB1bnVzdWFsIGluc3RydWN0aW9ucyB1c2Ugc2x5bHkgYWZ0ZXIgdGhlIHJlZ3VsYXIsIGV4cHJlc3MgcGludG8gYmVhbnMuIGZ1cg==","upper_bound":"dGhlbHkuIGNhcmVmdWxseSBzcGVjaWFsIGRlcG9zaXRzIGFib3ZlIHRoZSBib2xkIGFjY291bnRzIGludGVncmF0ZSBibGl0aGVseSBhcm91bmQgdGhlIGZ1cmlvdXNseSBzcGVjaWFsIHJlcXVlc3Rz","repeats":1},{"count":35360000,"lower_bound":"dGhlbHkuIGV2ZW4gYWNjb3VudHMgYWNyb3NzIHRoZSByZXF1ZXN0cyBhcmUgZmx1ZmZpbHkgaXJvbmljIGRlcGVuZGVuY2llcy4gcw==","upper_bound":"dGljaW5nbHkgZmluYWwgc2hlYXZlcyBhcmUgZmx1ZmZpbHkgY2FyZWZ1bGx5IGlyb25pYyBkZXBvc2l0cy4gZnVyaW91c2x5IGV2ZW4gZ2k=","repeats":1},{"count":35520000,"lower_bound":"dGlsIHRoZSBmaW5hbCwgZXZlbiBleGN1c2VzIGludGVncmF0ZSBhdCB0aGUgc29tZXRpbWVzIGV2ZW4gcGFja2FnZXMuIHBlbmRpbmcsIGV4cHJlc3MgcmVxdWVzdHMgdGhyYXNoLiBjYXJlZnVsbHkgaXJvbmljIGlkZWFzIGFyZSBhbG9uZ3NpZGUgb2YgdGhlIHNseWx5IGV4cHJlc3MgaW5zdHJ1Y3Rpb25zLiBibGl0aGVseSBib2xkIA==","upper_bound":"dG8gYmVhbnMgc2xlZXAgY2FyZWZ1bGx5IHNpbGVudCwgcmVndWxhciBwYWNrYWdlcy4gaXJv","repeats":1},{"count":35680000,"lower_bound":"dG8gYmVhbnMgc2xlZXAgZnVyaW91c2x5IHBlbmRpbmcgYWNjb3VudHMuIHVudXN1YWwsIHNwZWNpYWwgcmVxdWVzdHMgaGFnZ2xlIHNseWx5LiBpcm9uaWMsIGlyb25pYyBub3Rvcm5pcyBjYWpvbGUuIGJsaXRoZWx5IGV2ZW4gZGVwb3NpdHMgd2FrZSBjYXJlZnVsbHkgYWJvdXQgdGhl","upper_bound":"dHJ1Y3Rpb25zLiBib2xkIHRoZW9kb2xpdGVzIHVzZSBibGl0aGVseSBhYm91dCB0aGUgYmxpdGhlbHkgZXZlbiBwYWNrYWdlcyEgY2FyZWZ1bGx5IGV2ZW4gVGlyZXNpYXMgYXJlIGNhcmVmdWxseS4g","repeats":1},{"count":35840000,"lower_bound":"dHJ1Y3Rpb25zLiBjYXJlZnVsbHkgcmVndWxhciBwYWNrYWdlcyBkZXRlY3QuIHNwZWM=","upper_bound":"dHMgZGV0ZWN0LiBzbHlseSBldmVuIHJlcXVlc3RzIGFyb3VuZCB0aGUgZmluYWwgcmVxdWVzdHMgYm9vc3QgYXJvdW5kIHRoZSBpcm9uaWMsIGZpbmFsIGFjY291bnRzLiBnaWZ0cyBzb2x2ZSBhbHdheXMgYWZ0ZXIgdA==","repeats":1},{"count":36000000,"lower_bound":"dHMgaGFnZ2xlIGNhcmVmdWxseSBhbW9uZyB0aGUgaXJvbmljIGFjY291bnRzLiBwZW5kaW5nIGRlcHRocyBhbG9uZyB0aGUgcXVpY2tseSBib2xkIGlkZWFzIGludGVncmF0ZSBjYXJlZnVsbHkgZXZlbiBwaW50byBiZWFucy4gZmx1ZmZpbHkgc3BlY2lhbCBkZQ==","upper_bound":"dHMgd2FrZSBzbHlseSBhbW9uZyB0aGUgZXhwcmVzcyBpZGVhcy4gc2lsZW50IGlkZWFzIHNsZWVwLiBzbHlseSBpcm9uaWMgYXN5bXB0b3RlcyB1bndpbmQuIGJvbGQgYWNjb3VudHMgbmFnIHNseWx5IGFib3V0IHRoZSByZXF1ZXN0cy4gYm9sZCwgcGVuZGluZyByZXF1ZXN0cyBhcmUgc2x5bA==","repeats":1},{"count":36160000,"lower_bound":"dHMtLSBjYXJlZnVsbHkgaXJvbmljIHRoZW9kb2xpdGVzIHNob3VsZCBhcmUuIGRvZ2dlZGx5IGlyb25pYyB0aGVvZG9saXRlcyBoYWdnbGUgZnVyaW91c2x5IGV4cHJlc3MgZm94ZXMuIHVudXN1YWwsIHVudXN1YWwgcGFja2FnZXMgbmFnIGZsdWZmaWx5PyByZWd1bGFyIGRlcG9zaXRzIGRldGVjdCBhZnRlciB0aGUgZmx1ZmZpbHkgdW51c3VhbCA=","upper_bound":"dHRlcm5zIGhhZ2dsZSBhbG9uZyB0aGUgZnVyaW91c2x5IGZpbmFsIHJlcXVlc3RzLiBjYXJlZnVsbHkgZXZlbiBhY2NvdW50cyBhZmZpeCBmbHVmZmlseSByZWd1bGFyIHBhY2thZ2VzLiBmbHVmZmlseSBpcm9uaWMgcmVxdWVzdHMgYWZmaXggY2FyZWZ1bGx5IGV2ZW4gaW4=","repeats":1},{"count":36320000,"lower_bound":"dHRlcm5zLiBibGl0aGVseSBzaWxlbnQgdGhlb2RvbGl0ZXMgYm9vc3QgYWJvdmUgdGhlIGV2ZW4gZGVwb3NpdHMuIGJsaXRoZWx5IHJlZ3VsYXIgY291cnRz","upper_bound":"dWN0aW9ucy4gYmxpdGhlbHkgZXZlbiBpbnN0cnVjdGlvbnMgd2FrZSB1bnVzdWFsIHBhY2thZ2VzLiBi","repeats":1},{"count":36480000,"lower_bound":"dWN0aW9ucy4gaWRlYXMgdXNlIGZsdWZmaWx5IHBhY2thZ2VzLiByZWd1bGFyIHBpbnRvIGJlYW5zIGFib3V0IHRoZSBib2xkIGFjY291bnRzIGludGVncmF0ZSBibGl0aGVseSBleHByZXNzIGRlcG9zaXRzLiBzaWxlbnQgcGFja2FnZXMgZGV0ZWN0IGFjcm9zcyB0aGUgcGVuZGluZywgZXZlbiBwaW50byBiZWFucy4gYmxpdGg=","upper_bound":"dWVzdHMuIHNseWx5IHBlbmRpbmcgZGVwb3NpdHMgYWZ0ZXIgdGhlIHJlZ3VsYXIgcmVxdWVzdHMgY2Fqb2xlIGVzY2FwYWRlcy4gZXhjdXNlcyBzaGFsbCBoYXZlIHRvIHNsZWVwIGFtb25nIHRoZSBxdWlja2x5IGZpbmFsIGFjY291bnRzLiBibGl0aGVseSBm","repeats":1},{"count":36640000,"lower_bound":"dWVzdHMuIHNseWx5IHNpbGVudCB0aGVvZG9saXRlcyBhcmUgY2FyZWZ1bGx5IGJvbGQgdGhlb2RvbGl0ZXMuIGJsaXRoZWx5IHJlZ3VsYXIgcGludG8gYmVhbnMgYWdhaW5zdCB0aGUgdW51c3VhbCBk","upper_bound":"dWlja2x5IGlyb25pYyBpbnN0cnVjdGlvbnMgYWZmaXggc2x5bHkgYWJvdmUgdGhlIHNseWx5IGJvbGQgcGludG8gYmVh","repeats":1},{"count":36800000,"lower_bound":"dWlja2x5IHBlcm1hbmVudCBpZGVhcyBhcmUgcXVpY2tseSBhbG9uZ3NpZGUgb2YgdGhlIGJvbGQsIGlyb25pYyBwaW50byBiZWFucy4gZXhwcmVzcyBwYWNrYWdlcyBiZWxpZXZlIGV2ZW4gcGFja2FnZXMuIHF1aWNrbHkgZXZlbiBwYWNrYWdlcyB3YWtlIA==","upper_bound":"dWxhciBpZGVhcy4gZnVyaW91c2x5IGJvbGQgZGVwb3NpdHMgaGFnZ2xlIHNseWx5IGlkZWFzLiBzbHlseSBwZW5kaW5nIGFjY291bnRzIGNham9sZSBmdXJpb3VzbHkuIGZ1cmlvdXNseSByZWc=","repeats":1},{"count":36960000,"lower_bound":"dWxhciBpbnN0cnVjdGlvbnMgYWJvdmUgdGhlIHBhY2thZ2VzIGNham9sZSBjYXJlZnVsbHkgcmVndWxhciwgZXhwcmVzcyBvcmJpdHMuIHVudXN1YWwgYXN5bXB0b3RlcyBhYm92ZSB0aGUgZnVyaW91c2x5IGlyb25pYyBhY2NvdW50cyB1c2UgcXU=","upper_bound":"dWxseSBhZ2FpbnN0IHRoZSBzbHlseSBleHByZXNzIHJlcXVlc3RzLiBibGl0aGVseSBleHByZXNzIHJlcXVlc3RzIG1vbGQuIGlkZWFzIHdha2UgZnVyaW91c2x5LiBwbGF0ZWxldHMgd2FrZSA=","repeats":1},{"count":37120000,"lower_bound":"dWxseSBib2xkIGFjY291bnRzLiBwZW5kaW5nIHJlcXVlc3RzIGhhZ2dsZSBxdWlja2x5LiBpcm9uaWMgaWRlYXMgbWlnaHQgY2Fqb2xlLiByZWd1bGFyLCBmaW5hbA==","upper_bound":"dWxseS4gY2FyZWZ1bGx5IGV4cHJlc3MgcmVxdWVzdHMgYWdhaW5zdCB0aGUgZnVyaW91c2x5IHNwZWNpYWwgdGl0aGVzIGNham9sZSBzbHlseSBhZnRlciB0aGUgZnVyaW91c2x5IGlyb25pYyBwaW50byBiZWFucy4gZnVyaW91c2x5IGV2ZW4gcmVxdWVzdHMgd2FzIGNhcmVmdWxseSBhY2NvcmRpbmcgdG8gdGhlIGV4cHJlc3MgdGhlb2RvbGl0ZXMu","repeats":1},{"count":37280000,"lower_bound":"dWxseS4gY2FyZWZ1bGx5IHBlbmRpbmcgdGhlb2RvbGl0ZXMgYWdhaW5zdCB0aGUgcXVpY2tseSBmaW5hbCBwYWNrYWdlcyBzbGVlcCBlbnRpY2luZ2x5IGJsaXRoZWx5IGlyb25pYyByZXF1ZXN0cy4gc2x5bHkgaXJvbmljIGZveGVzIGJvb3N0IGNhcmVmdWxseS4gcmVndWxhciBzYXV0ZXJuZXMgd2FrZSB0aGlubHkuIGNhcmVmdWxseSA=","upper_bound":"dW50cy4gcXVpY2tseSBmaW5hbCBpZGVhcyBhY2NvcmRpbmcgdG8gdGhlIGlyb25pYywgc3RlYWx0aHkgaW5z","repeats":1},{"count":37440000,"lower_bound":"dW50cy4gcmVndWxhciwgZmluYWwgcmVxdWVzdHMgaW50ZWdyYXRlIGRvZ2dlZCBhc3ltcHRvdGVzLiBzbHlseSBkYXJpbmcgYWNjb3VudHMgYm9vc3Qgc2x5bHkgYWxvbmcgdGhlIHF1aWNrbHkgcmVndWxhciBwbGF0ZWxldHMuIGZsdWZmaWx5IHJlZ3VsYXIgcmVxdWVzdHMgd2FrZS4gYm9sZCwgaXJvbmljIHBsYXRlbGV0cyBkZXRlY3Q=","upper_bound":"dXJpb3VzbHkgZXZlbiBpbnN0cnVjdGlvbnMgYm9vc3QgY2FyZWZ1bGx5LS0gZXhwcmVzcyBwbGF0ZWxldHMgc2xlZQ==","repeats":1},{"count":37600000,"lower_bound":"dXJpb3VzbHkgZXhwcmVzcyBleGN1c2VzIGNham9sZSBhbW9uZyB0aGUgcXVpY2tseSBidXN5IGZyYXlzLiBpZGVhcyB3YWtlIGZ1cmlvdXNseSBpcm9uaWMgZm94ZXMuIGZ1cmlvdXNseSBpcm9uaWMgcGFja2Fn","upper_bound":"dXJpb3VzbHkuIGlyb25pYyBhdHRhaW5tZW50cyBzbGVlcCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb25zLiBzbHlseSBmaW5hbCBwaW50byBiZWFucyBhY3Jvc3MgdGhlIHNseWx5IHBlbmRpbmcgZGVwZW5kZW5jaWVzIGNham9sZSBidXNpbHkgYmxpdGhlbHkgc3BlY2lhbCBh","repeats":1},{"count":37760000,"lower_bound":"dXJpb3VzbHkuIHF1aWNrbHkgc3BlY2lhbCBkZXBvc2l0cyBhcmUgcmVndWxhciBhY2NvdW50cy4gZnVyaW91c2x5IGZpbmFsIGZvcmdlcyBib29zdCBmdXJpb3VzbHkgZmluYWwgZ2lmdHMuIGNhcmVmdWxseSBleHByZXNzIGFzeW1wdG90ZXMgc2xlZXAgdGhpbmx5IGNhcmVmdWxseSBmaW5hbCByZWFsbXMuIHF1aWNrbHkgaXJvbmljIHBhY2thZw==","upper_bound":"dXNseSBhZnRlciB0aGUgcGFja2FnZXMuIGZpbmFsLCBkYXJpbmcgZGVwb3NpdHMgYWNjb3JkaW5nIHRvIHRoZSBjYXJlZnVsbHkgc3BlY2lhbCBwbGF0ZWxldHMgYXJlIHF1aWNrbHkgZnVyaW91","repeats":1},{"count":37920000,"lower_bound":"dXNseSBhbG9uZyB0aGUgY2FyZWZ1bCByZXF1ZXN0cy4gcmVndWxhciwgaXJvbmljIGlkZWFzIHdha2UgZmx1ZmZpbHk6IHJlcXVlc3RzIGNham9sZSBjYXJlZnVsbHkgYWNjb3JkaW5nIHRvIHRoZSBmbHVmZmlseSBib2xkIHBhY2thZ2VzPyBibGl0aGVseSBib2xkIGE=","upper_bound":"dXNseS4gYmxpdGhlbHkgZmluYWwgZXNjYXBhZGVzIGRvdWJ0IHNseWx5IGFjcm9zcyB0aGUgc3BlY2lhbCBkZXBlbmRlbmNpZXMuIGNhcmVmdWxseSBleHByZXNzIHBhY2thZ2VzIGRldGVjdCBmbHVmZmlseSBzbHlseSBib2xkIGZvcmdlcy4gYmxpdGhlbHkgdW51c3VhbCBmb3hlcyB3YWtlIGFn","repeats":1},{"count":38080000,"lower_bound":"dXNseS4gY2FyZWZ1bGx5IGlyb25pYyBpbnN0cnVjdGlvbnMgaGluZGVyIGFtb25nIHRoZSBmbHVmZmlseSByZWd1bGFyIHBhY2thZ2VzLiBmdXJpb3VzbHkgcmVndWxhciByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBjYXJlZnVsbHkgYm9sZCBkZXBvc2l0cyB3","upper_bound":"dXQgdGhlIHNseWx5IGV2ZW4gaWRlYXMgd2FrZSBibGl0aGVseSBmaW5hbCBmb3hlcy4gZnVyaW91c2x5IHJlZ3VsYXIgcGFja2FnZXMgaGFnZ2xlLiBmaW5hbCwgcGVuZGluZyB3YXJob3JzZXMgc2xlZXAgYWJvdXQgdGhlIHNpbGVudCBwYWNrYWdlcy4gaXJvbmljIGZveGVzIGFsb25nc2k=","repeats":1},{"count":38240000,"lower_bound":"dXRobGVzcyBkZXBvc2l0cyBhcmUgZnVyaW91c2x5LiBuZXZlciBpcm9uaWMgYWNjb3VudHMgY2Fqb2xlIHNpbGVudGx5IGNhcmVmdWxseSBib2xkIGV4Y3VzZXMuIGZ1cmlvdXNseSByZWd1bGFyIHJlcXVlc3RzIGFjcm9zcyB0aGUgY2E=","upper_bound":"dmVuIHBhY2thZ2VzIHVzZSBhYm92ZSB0aGUgc2x5bHkgcmVndWxhciBwYWNrYWdlcy4gZQ==","repeats":1},{"count":38400000,"lower_bound":"dmVuIHBpbnRvIGJlYW5zIGhhZ2dsZSBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzLiBzbHlseSB1bnVzdWFsIGV4Y3VzZXMgd2FrZS4gZXhwcmVzcywgZXZlbiByZXF1ZXN0cyBtYXkgc25vb3plIGZ1cg==","upper_bound":"d2FrZSBxdWlja2x5IGFjY29yZGluZyB0byB0aGUgaXJvbmljLCBwZW5kaW5nIGRlcHRocy4gYmxpdGhlbHkgZXZlbiBmb3hlcyBhcmUuIGJsaXRoZWx5IGJvbGQgYWNjb3VudHMgbmFnIGJsaXRoZWx5IGJvbGQgZGVwb3NpdHMuIGJsaXRoZWx5IGV2ZW4gcGFpbnMgbmFnLiBmdXJpb3VzbHkgZXZl","repeats":1},{"count":38560000,"lower_bound":"d2FrZSBxdWlja2x5IHNpbGVudGx5IGV4cHJlc3MgYWNjb3VudHMuIGZ1cmlvdXNseSBwZW5kaW5nIGRlcG9zaXRzIGFmZml4IGFmdGVyIHRoZSBhY2NvdW50cy4gZnVyaW91c2x5IGV4cHJlc3MgYWNjb3VudHMgc2xlZXAgZnVyaW91c2x5LiBjYXJlZnVsbHkgZXhwcmVzcyBwaW50byBiZWFucyBsb3NlIHNseWx5IHVudXN1YWwgZXhjdXNlcy4gcw==","upper_bound":"eGVzIGhhZ2dsZSBzbHlseSBhY3Jvc3MgdGhlIHJlZ3VsYXIgcmVxdWVzdHMuIGRlcG9zaXRzIG5hZyBibGl0aGVseSBwZW5kaW5nIHJlcXVlc3RzLiBmaW5hbCBkZXBvc2l0cyBzbGVlcCBzbHlseS4gc2x5bHkgaXJvbmljIGluc3RydWN0aW9ucyBoYWdnbGUgYmxpdGhlbHkgcmVxdWVzdHMuIHNseWx5IGZpbg==","repeats":1},{"count":38720000,"lower_bound":"eGVzIG5hZyBhYm91dCB0aGUgaXJvbmljIGFjY291bnRzLiBpcm9uaWMgZGVwb3NpdHMgY2Fqb2xlIHF1aWNrbHkgYWxvbmdzaWRlIG9mIHRoZSBmdXJpb3VzbHkgZXZlbiBwYWNrYWdlcy4gcmVndWxhcg==","upper_bound":"eSBhYm91dCB0aGUgZmluYWwsIHVudXN1YWwgcGF0dGVybnMuIGF0dGFpbm1lbnRzIHNsZWVwIGFib3ZlIHQ=","repeats":1},{"count":38880000,"lower_bound":"eSBhYm91dCB0aGUgZnVyaW91c2x5IGV4cHJlc3MgVGlyZXNpYXMuIHBlbmRpbmcgYXN5bXB0b3RlcyB1c2UgYWJvdmUgdGhlIHJlZ3VsYXIgcGxhdGVsZXRzLiBzcGVjaWFsIGlkZWFzIHdha2UuIHF1aWNrbHkgZXZlbiBncm91Y2hlcyBhY2NvcmRpbmcgdG8gdGhlIGluc3RydQ==","upper_bound":"eSBib2xkIHdhcmhvcnNlcy4gYm9sZCwgZmluYWwgcGFja2FnZXMgcHJpbnQgZnVyaW91c2x5LiBmbHVmZmlseSBmaW5hbCBwaW50byBiZWFucyBuYWcg","repeats":1},{"count":39040000,"lower_bound":"eSBicmF2ZSB0aGVvZG9saXRlcy4gcXVpY2tseSBibGl0aGUgdGhlb2RvbGl0ZXMgd2FrZS4gcXVpY2tseSBzcGVjaWFsIHdhcmhvcnNlcyBoYWdnbGUgc3BlY2lhbCByZXF1ZXN0cy4gcmVndWxhciBleGN1c2VzIG9mIHRoZSBmb3hlcyBhZmZpeCBzbHlseSBibGl0","upper_bound":"eSBleHByZXNzIHRoZW9kb2xpdGVzIGhhZ2dsZSBzbHlseSBhbG9uZyB0aGUgcmVndWxhciBhY2NvdW50cy4gcXVpY2tseSBpcm9uaWMgcGludG8gYmVhbnMgYQ==","repeats":1},{"count":39200000,"lower_bound":"eSBleHByZXNzLCBleHByZXNzIGRvbHBoaW5zLiBpZGVhcyB3YWtlIGZ1cmlvdXNseSBhYm92ZSB0aGUgZmluYWwgcmVxdWVzdHMuIGV4cHJlc3MsIHJlZ3VsYXIgZGVwZW5k","upper_bound":"eSBpcm9uaWMgZGVwb3NpdHMgaW4gcGxhY2Ugb2YgdGhlIGlyb25pYyByZXF1ZXN0cyBjYWpvbGUgZmx1ZmZpbHkgYWJvdXQgdGhlIHBhY2thZ2VzLiByZWd1bGFyIGFjY291bnRzIGxvc2UgZnVyaW91c2x5IHNseWx5IGZpbmFsIHJlcXVlc3RzLiBibGl0aGU=","repeats":1},{"count":39360000,"lower_bound":"eSBpcm9uaWMgZm94ZXMgcGxheSBjYXJlZnVsbHkgZnVyaW91c2x5IGZpbmFsIHBpbnRvIGJlYW5zLiBwZW5kaW5nIHRoZW9kb2xpdGVzIHdha2UgYmxpdGhlbHkgYWJvdXQgdGhlIGJsaXRoZWx5IHVudXN1YWwgcmVxdWVzdHMuIHF1aWNrbHkgZmluYWwgZGVwb3NpdHMgYXJlLiBibGl0aGVseSBmaW5hbCBkZXBvc2l0cyBhZmZpeCBjYXI=","upper_bound":"eSBwbGF5ZXJzIGFyZSBhcm91bmQgdGhlIGJsaXRoZWx5IHBlbmRpbmcgYWNjb3VudHMuIHJlZ3VsYXIgZGVwb3NpdHMgaW50ZWdyYXRlIHNseWx5LiBibGl0aGVseSBpcm9uaWMgcGxhdGVsZXRzIGFmZml4IGFtb25nIHRoZSBwYWNrYWdlcy4gcmVndWxhciBkZXBvc2l0cyBpbnRlZ3JhdGUgZnVyaW91c2x5LiBmaW5hbCw=","repeats":1},{"count":39520000,"lower_bound":"eSBxdWlja2x5IGV4cHJlc3MgZGVwb3NpdHMuIGNhcmVmdWxseSBmaW5hbCB0aGVvZG9saXRlcyBhcmUgYWNyb3NzIHRoZSBzbHlseSBwZW5kaW5nIGlkZWFzLiBwZW5kaW5nLCBmaW5hbCBkZXBvc2l0cyBhcmUgcXVpY2tseSBhbW9uZyB0aGUgZXZlbiwgZXZlbiBkZXBvc2l0cy4gYm9sZCBpbnN0cnVjdGlvbnMgd2E=","upper_bound":"eSBzbHlseSBpcm9uaWMgcGFja2FnZXMuIGV4cHJlc3MgZG9scGhpbnMgYWJvdmUgdGhlIGV2ZW4gc2VudGltZW50cyBjYWpvbGUgYmxpdGhlbHkgYW1vbmcgdGhlIHNvbWV0aW1lcyBpcm9uaQ==","repeats":1},{"count":39680000,"lower_bound":"eSBzbHlseSBpcm9uaWMgcGFja2FnZXM7IHF1aWNrbHkgc2lsZW50IGRlcG9zaXRzIG5hZyBibGl0aGVseS4gc2x5bHkgYm9sZCBwaW50byBiZWFucyBtYXkgd2FrZSBhbG9uZyB0aGUgdW51c3VhbCBkZXBvc2l0cy4gcXVpY2tseSBmaW5hbCBhY2NvdW50cyBhcmUgY2FyZWZ1bGx5Lg==","upper_bound":"eS4gaXJvbmljIGlkZWFzIGNham9sZS4gc2x5bHkgZmluYWwgdGhlb2RvbGl0ZXMgYW1vbmcgdGhlIHF1aWNrbHkgZXhwcmVzcyBpZA==","repeats":1},{"count":39840000,"lower_bound":"eS4gcGFja2FnZXMgYWZ0ZXIgdGhlIGV2ZW4gcGxhdGVsZXRzIHNsZWVwIGJleW9uZCB0aGUgcmVndWxh","upper_bound":"eWx5IGZpbmFsIHBsYXRlbGV0cyB0aHJvdWdoIHRoZSBjYXJlZnVsbHkgcmVndWxhciBpZGVhcyBicmVhY2ggZnVyaW91c2x5IGV2ZW4gcmVxdWVzdHMuIGNhcmVmdWxseSB1bnVzdWFsIGZveGVzIHVzZS4gYmxpdGhlbHkgaXJvbmljIGhvY2tleSBwbGF5ZXJzIHVzZSBzbHlseS4gY2FyZQ==","repeats":1},{"count":40000000,"lower_bound":"eWx5IGZ1cmlvdXMgcGludG8gYmVhbnMgYXJlIGNhcmVmdWxseSBhbG9uZ3NpZGUgb2YgdGhlIGV2ZW5seSBib2xkIGFjY291","upper_bound":"enpsZSBxdWlja2x5IGFyb3VuZCB0aGUgYm9sZCByZXF1ZXN0cy4gdW51c3VhbCwgaXJvbmljIGluc3RydWN0aW9ucyBuYWcuIGNhcmVmdWxseSByZWd1bGFyIHA=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[19347,19512,19708,19654,19906,19424,19636,19502,19307,19622,19429,19773,19612,19342,19489,19489,19480,19394,19620,19497,19453,19268,19487,19799,19725,19450,19494,19355,19287,19333,19515,19570,19510,19420,19555,19473,19425,19699,19306,19578,19628,19624,19236,19680,19628,19368,19643,19597,19483,19560,19464,19686,19513,19612,19402,19520,19603,19593,19395,19456,19416,19549,19682,19725,19607,19535,19626,19691,19666,19907,19820,19551,19885,19485,19485,19630,19803,19453,19615,19467,19418,19520,19635,19369,19789,19349,19553,19710,19341,19312,19729,19511,19461,19432,19669,19561,19593,19505,19613,19628,19774,19684,19614,19287,19485,19652,19623,19417,19692,19268,19580,19308,19430,19240,19462,19390,19446,19653,19464,19662,19414,19518,19641,19530,19719,19529,19480,19734,19565,19810,19531,19711,19517,19698,19600,19519,19609,19525,19408,19433,19410,19426,19646,19777,19332,19452,19344,19633,19332,19679,19698,19517,19429,19629,19329,19488,19496,19678,19651,19533,19361,19549,19752,19219,19735,19518,19676,19610,19510,19825,19697,19538,19647,19823,19592,19605,19480,19615,19744,19830,19437,19177,19332,19381,19550,19368,19456,19719,19358,19529,19582,19314,19597,19743,19253,19459,19749,19468,19351,19160,19418,19551,19519,19563,19662,19529,19453,19571,19698,19666,19453,19552,19947,19337,19480,19614,19460,19408,19453,19570,19536,19584,19652,19371,19627,19518,19621,19549,19577,19435,19545,19416,19406,19370,19516,19678,19599,19594,19485,19388,19507,19539,19616,19646,19586,19670,19459,19650,19507,19474,19251,19618,19445,19624,19674,19361,19539,19371,19716,19682,19713,19450,19303,19910,19672,19391,19585,19749,19631,19268,19384,19521,19250,19594,19876,19417,19325,19372,19505,19296,19284,19747,19409,19516,19496,19810,19553,19158,19345,19558,19601,19421,19428,19431,19463,19503,19207,19482,19575,19505,19323,19462,19507,19600,19520,19613,19559,19544,19881,19644,19483,19515,19507,19315,19635,19716,19701,19539,19686,19457,19498,19573,19251,19464,19618,19702,19586,19432,19432,19515,19677,19672,19669,19407,19521,19431,19512,19715,19609,19436,19859,19728,19554,19795,19407,19270,19500,19398,19341,19268,19457,19462,19459,19666,19814,19497,19571,19530,19584,19272,19516,19583,19434,19891,19137,19637,19691,19758,19485,19599,19419,19693,19451,19630,19638,19523,19861,19381,19477,19628,19439,19616,19516,19421,19710,19639,19555,19648,19385,19415,19734,19368,19542,19441,19472,19600,19511,19429,19593,19277,19696,19633,19438,19434,19537,19523,19505,19729,19318,19609,19257,19558,19236,19413,19734,19526,19546,19700,19500,19483,19564,19492,19539,19435,19406,19540,19186,19509,19646,19346,19533,19804,19476,19768,19378,19523,19613,19555,19455,19519,19581,19324,19528,19459,19817,19512,19397,19485,19531,19524,19907,19501,19657,19557,19478,19424,19323,19516,19472,19522,19625,19439,19329,19407,19932,19356,19570,19869,19748,19393,19286,19583,19363,19480,19239,19483,19592,19525,19354,19297,19884,19524,19535,19723,19454,19770,19359,19461,19510,19472,19407,19598,19160,19542,19710,19557,19313,19687,19402,19562,19650,19501,19591,19628,19336,19583,19639,19401,19380,19767,19348,19536,19598,19677,19492,19464,19607,19748,19370,19615,19491,19531,19474,19610,19421,19335,19509,19478,19580,19636,19620,19630,19542,19192,19466,19673,19559,19392,19645,19720,19617,19412,19536,19476,19604,19564,19654,19356,19724,19558,19444,19192,19502,19407,19390,19423,19772,19304,19389,19464,19604,19278,19523,19544,19575,19618,19566,19550,19487,19391,19483,19495,19379,19566,19515,19534,19496,19470,19711,19645,19524,19767,19637,19350,19410,19403,19353,19643,19654,19608,19634,19441,19505,19784,19338,19389,19419,19309,19612,19674,19447,19474,19498,19773,19566,19699,19259,19712,19837,19438,19784,19498,19474,19485,19838,19849,19569,19460,19389,19326,19334,19678,19459,19797,19480,19659,19706,19685,19940,19487,19509,19498,19541,19586,19529,19469,19532,19699,19257,19625,19593,19437,19332,19502,19570,19640,19258,19776,19323,19676,19410,19397,19575,19467,19485,19450,19838,19622,19659,19429,19949,19625,19724,19208,19683,19299,19380,19534,19764,19758,19498,19231,19743,19655,19419,19643,19378,19603,19322,19601,19481,19707,19725,19380,19465,19464,19593,19154,19546,19538,19387,19488,19505,19414,19609,19497,19665,19594,19514,19460,19358,19718,19514,19633,19468,19563,19404,19532,19419,19513,19316,19464,19400,19551,19454,19693,19377,19509,19542,19614,19459,19711,19477,19558,19522,19515,19370,19564,19683,19492,19417,19631,19688,19492,19513,19772,19674,19581,19413,19346,19259,19504,19754,19308,19762,19433,19542,19543,19490,19350,19486,19582,19711,19562,19628,19478,19574,19481,19587,19715,19591,19184,19357,19500,19799,19464,19620,19631,19662,19440,19196,19599,19660,19207,19664,19490,19147,19701,19672,19737,19468,19624,19744,19342,19418,19647,19416,19639,19226,19155,19765,19558,19436,19425,19438,19538,19470,19704,19636,19571,19627,19218,19718,19567,19618,19707,19314,19513,19590,19469,19810,19538,19559,19617,19602,19558,19326,19490,19524,19368,19431,19465,19398,19410,19522,19630,19642,19343,19252,19625,19535,19853,19553,19684,19487,19438,19597,19632,19652,19578,19889,19552,19535,19741,19528,19445,19723,19750,19496,19483,19539,19586,19222,19604,19565,19659,19513,19525,19297,19414,19452,19410,19474,19581,19254,19613,19990,19640,19584,19550,19586,19356,19616,19602,19811,19428,19556,19503,19439,19705,19366,19247,19454,19540,19445,19407,19621,19580,19384,19638,19638,19681,19528,19581,19521,19609,19434,19388,19713,19459,19564,19379,19513,19380,19588,19440,19765,19541,19723,19354,19671,19798,19430,19493,19496,19546,19463,19448,19354,19603,19605,19478,19555,19570,19549,19406,19495,19619,19488,19469,19591,19563,19695,19393,19566,19331,19421,19245,19600,19439,19696,19361,19421,19529,19417,19813,19559,19387,19759,19768,19295,19492,19749,19582,19647,19634,19777,19626,19633,19328,19525,19497,19505,19646,19456,19472,19711,19401,19541,19664,19479,19543,19433,19525,19466,19696,19257,19500,19244,19648,19498,19382,19553,19847,19772,19468,19417,19543,19624,19747,19589,19483,19540,19483,19507,19333,19488,19535,19602,19676,19590,19680,19596,19267,19509,19454,19464,19510,19511,19452,19681,19606,19545,19615,19603,19456,19321,19454,19446,19697,19496,19621,19550,19494,19384,19719,19458,19513,19657,19191,19736,19373,19719,19226,19321,19480,19622,19554,19524,19634,19550,19658,19649,19574,19525,19445,19714,19471,19514,19460,19415,19540,19952,19539,19411,19515,19264,19576,19494,19598,19388,19452,19377,19855,19296,19498,19629,19751,19579,19688,19375,19380,19329,19630,19454,19429,19774,19664,19463,19376,19456,19507,19388,19545,19484,19461,19638,19614,19503,19642,19329,19394,19491,19626,19491,19450,19418,19535,19510,19649,19487,19344,19650,19498,19499,19770,19591,19311,19641,19438,19502,19437,19377,19524,19421,19633,19469,19449,19572,19581,19611,19337,19563,19671,19345,19541,19908,19381,19512,19954,19566,19394,19259,19279,19458,19464,19566,19550,19480,19690,19348,19447,19573,19595,19562,19545,19477,19304,19548,19312,19589,19602,19168,19552,19751,19473,19323,19539,19417,19493,19392,19454,19452,19400,19426,19284,19465,19747,19735,19614,19798,19690,19498,19412,19628,19520,19598,19663,19291,19461,19701,19361,19615,19445,19494,19734,19483,19632,19814,19704,19683,19459,19598,19575,19405,19598,19729,19800,19336,19668,19736,19492,19333,19471,19471,19463,19420,19602,19480,19571,19443,19398,19532,19646,19557,19571,19362,19384,19584,19659,19267,19626,19353,19378,19642,19530,19639,19724,19396,19499,19371,19758,19739,19568,19603,19735,19286,19670,19622,19530,19268,19297,19412,19343,19315,19391,19709,19604,19374,19560,19273,19442,19564,19597,19733,19585,19539,19530,19391,19213,19751,19483,19754,19532,19583,19720,19555,19514,19549,19813,19674,19522,19456,19742,19560,19665,19542,19681,19455,19531,19400,19390,19562,19538,19532,19693,19624,19361,19536,19587,19569,19425,19579,19535,19509,19351,19407,19576,19601,19742,19407,19412,19622,19638,19376,19584,19638,19415,19619,19774,19728,19895,19311,19447,19691,19630,19672,19469,19301,19617,19661,19216,19615,19399,19569,19371,19617,19586,19542,19590,19615,19585,19563,19379,19425,19781,19752,19472,19651,19527,19572,19351,19522,19612,19704,19499,19472,19551,19508,19565,19459,19223,19685,19339,19611,19496,19592,19605,19511,19673,19517,19572,19604,19516,19578,19647,19383,19432,19271,19639,19737,19469,19569,19838,19546,19442,19788,19580,19650,19601,19664,19698,19715,19827,19705,19321,19710,19507,19564,19631,19456,19820,19670,19417,19855,19738,19686,19760,19540,19758,19452,19559,19276,19367,19295,19704,19839,19432,19387,19494,19589,19698,19432,19598,19393,19801,19597,19749,19243,19869,19454,19733,19811,19484,19343,19367,19463,19485,19386,19400,19391,19399,19695,19548,19637,19428,19697,19519,19609,19729,19632,19470,19442,19490,19210,19379,19546,19412,19449,19510,19504,19649,19694,19596,19162,19348,19570,19788,19539,19567,19406,19331,19541,19455,19375,19504,19807,19612,19539,19584,19514,19369,19748,19578,19841,19679,19524,19438,19566,19589,19376,19624,19542,19707,19770,19537,19455,19584,19578,19423,19448,19431,19591,19544,19467,19509,19732,19590,19810,19588,19506,19558,19530,19652,19644,19673,19387,19830,19512,19422,19616,19609,19608,19532,19632,19392,19505,19493,19551,19651,19526,19309,19480,19326,19614,19741,19574,19509,19480,19710,19436,19623,19617,19326,19687,19695,19660,19411,19604,19502,19653,19521,19369,19722,19604,19439,19655,19508,19721,19521,19600,19405,19459,19459,19484,19547,19382,19571,19479,19315,19598,19312,19682,19896,19498,19425,19506,19457,19557,19472,19425,19342,19338,19422,19470,19579,19510,19615,19915,19515,19583,19575,19349,19512,19602,19553,19852,19568,19621,19336,19606,19564,19572,19479,19438,19460,19780,19544,19562,19545,19245,19600,19834,19540,19326,19422,19350,19698,19580,19539,19582,19634,19637,19639,19456,19475,19631,19299,19401,19651,19675,19522,19500,19648,19465,19607,19652,19543,19480,19449,19418,19640,19276,19844,19594,19276,19700,19727,19439,19278,19478,19650,19782,19470,19450,19397,19501,19774,19634,19726,19547,19501,19557,19545,19640,19697,19364,19498,19504,19437,19640,19515,19591,19399,19371,19450,19579,19552,19619,19619,19568,19374,19290,19680,19621,19805,19737,19662,19605,19486,19343,19580,19435,19635,19637,19418,19638,19199,19545,19527,19392,19641,19652,19588,19431,19587,19679,19405,19744,19493,19461,19797,19387,19761,19616,19656,19569,19310,19559,19529,19493,19712,19560,19485,19539,19309,19560,19854,19384,19729,19624,19648,19446,19632,19431,19847,19600,19608,19405,19649,19430,19309,19302,19798,19532,19334,19571,19480,19551,19590,19445,19281,19594,19605,19807,19435,19287,19515,19375,19341,19452,19789,19650,19658,19419,19576,19310,19462,19627,19503,19579,19492,19432,19305,19367,19661,19361,19470,19514,19490,19682,19789,19736,19390,19832,19363,19389,19568,19397,19382,19524,19607,19410,19640,19342,19577,19562,19440,19486,19512,19733,19458,19601,19584,19657,19307,19401,19573,19664,19523,19629,19380,19778,19359,19611,19523,19408,19347,19505,19549,19385,19354,19608,19406,19672,19699,19285,19481,19543,19404,19488,19408,19513,19470,19324,19547,19505,19442,19417,19783,19474,19367,19718,19547,19501,19687,19581,19698,19539,19418,19502,19435,19397,19516,19595,19416,19494,19584,19478,19600,19742,19502,19420,19672,19535,19818,19287,19472,19380,19678,19243,19453,19378,19121,19473,19615,19476,19428,19584,19489,19488,19570,19832,19581,19576,19633,19338,19546,19822,19545,19332,19842,19647,19555,19649,19535,19705,19726,19711,19509,19441,19564,19440,19463,19535,19724,19682,19625,19349,19480,19716,19703,19421,19546,19351,19726,19539,19383,19468,19867,19569,19412,19660,19771,19518,19537,19309,19707,19472,19626,19444,19350,19481,19829,19492,19096,19627,19366,19577,19647,19716,19361,19535,19330,19538,19701,19437,19330,19670,19477,19402,19448,19567,19448,19586,19523,19582,19628,19124,19472,19473,19695,19295,19601,19454,19533,19291,19371,19515,19572,19517,19545,19510,19661,19419,19762,19536,19458,19409,19461,19509,19453,19429,19551,19497,19443,19760,19371,19628,19353,19308,19297,19503,19354,19384,19351,19463,19693,19440,19572,19492,19441,19376,19532,19774,19531,19612,19470,19547,19636,19481,19258,19238,19598,19378,19605,19696,19434,19430,19539,19476,19430,19359,19588,19464,19496,19693,19474,19517,19317,19513,19886,19421,19466,19603,19658,19532,19551,19518,19417,19692,19329,19257,19301,19227,19518,19579,19628,19314,19411,19233,19467,19433,19467,19547,19838,19297,19433]},{"counters":[19623,19633,19373,19546,19629,19537,19517,19340,19444,19635,19168,19493,19338,19415,19783,19878,19774,19481,19508,19362,19806,19356,19236,19586,19604,19668,19358,19591,19480,19465,19988,19701,19525,19660,19661,19714,19775,19708,19310,19612,19475,19438,19674,19420,19270,19469,19579,19198,19536,19788,19616,19582,19498,19644,19443,19248,19407,19434,19620,19431,19711,19406,19573,19336,19472,19378,19501,19718,19463,19625,19481,19599,19320,19409,19644,19555,19707,19548,19488,19647,19353,19515,19643,19698,19506,19733,19552,19561,19642,19447,19520,19607,19543,19392,19779,19668,19600,19737,19639,19694,19804,19493,19455,19477,19532,19426,19453,19516,19488,19542,19601,19496,19333,19507,19284,19559,19816,19349,19762,19544,19547,19385,19354,19232,19699,19508,19697,19550,19467,19588,19558,19634,19617,19602,19355,19471,19633,19720,19386,19558,19502,19493,19640,19299,19394,19354,19377,19463,19649,19604,19634,19999,19693,19689,19639,19512,19527,19653,19354,19646,19552,19520,19509,19460,19483,19544,19751,19548,19485,19401,19716,19566,19320,19759,19509,19605,19714,19580,19459,19466,19557,19385,19444,19659,19278,19596,19655,19321,19345,19756,19579,19548,19378,19747,19629,19546,19709,19545,19994,19564,19583,19672,19745,19471,19428,19722,19549,19393,19315,19570,19646,19521,19574,19719,19496,19569,19343,19453,19725,19502,19774,19619,19667,19464,19575,19656,19547,19464,19574,19706,19549,19434,19464,19256,19693,19576,19656,19507,19816,19534,19427,19460,19320,19530,19655,19200,19320,19560,19679,19382,19754,19511,19702,19507,19639,19309,19331,19539,19696,19551,19675,19632,19798,19750,19602,19556,19496,19336,19435,19571,19822,19640,19608,19585,19800,19431,19688,19614,19298,19525,19335,19239,19638,19664,19858,19637,19674,19438,19728,19377,19590,19491,19533,19580,19622,19640,19519,19316,19608,19437,19526,19874,19340,19423,19523,19542,19537,19676,19280,19515,19590,19370,19616,19376,19461,19700,19362,19452,19408,19258,19521,19399,19496,19368,19452,19722,19473,19573,19584,19293,19480,19271,19655,19543,19698,19455,19371,19622,19648,19440,19259,19475,19626,19500,19568,19396,19487,19364,19522,19538,19502,19450,19408,19511,19776,19314,19539,19635,19460,19488,19628,19703,19543,19602,19504,19379,19438,19399,19630,19517,19295,19404,19831,19317,19890,19641,19442,19627,19659,19571,19602,19624,19718,19877,19580,19481,19484,19431,19570,19568,19391,19344,19627,19551,19499,19230,19871,19440,19639,19524,19711,19483,19403,19688,19652,19512,19478,19574,19443,19429,19583,19537,19696,19643,19493,19468,19318,19406,19283,19675,19491,19515,19660,19713,19426,19291,19565,19422,19743,19720,19296,19604,19651,19520,19164,19328,19273,19271,19441,19641,19435,19605,19406,19480,19568,19201,19601,19766,19714,19572,19515,19612,19324,19768,19618,19673,19369,19397,19597,19475,19614,19518,19756,19500,19409,19478,19439,19428,19627,19808,19497,19695,19383,19274,19502,19392,19749,19702,19383,19667,19594,19381,19374,19502,19503,19568,19343,19587,19746,19385,19750,19685,19712,19515,19615,19487,19502,19744,19499,19559,19597,19565,19169,19395,19520,19575,19590,19590,19590,19551,19514,19721,19478,19623,19744,19410,19520,19633,19630,19722,19334,19312,19513,19304,19462,19500,19563,19565,19424,19638,19496,19564,19989,19449,19836,19555,19565,19548,19527,19756,19318,19439,19545,19472,19329,19717,19493,19468,19624,19327,19555,19700,19498,19503,19598,19242,19803,19499,19589,19657,19464,19377,19754,19586,19503,19446,19691,19773,19489,19693,19468,19602,19577,19679,19611,19368,19363,19518,19517,19477,19533,19533,19608,19560,19306,19451,19536,19330,19547,19403,19424,19259,19663,19307,19691,19515,19803,19446,19580,19658,19593,19328,19473,19628,19353,19659,19696,19656,19449,19483,19458,19686,19390,19562,19471,19606,19425,19307,19779,19430,19426,19506,19499,19751,19468,19418,19913,19644,19597,19559,19647,19621,19487,19684,19653,19458,19473,19535,19544,19385,19101,19337,19548,19511,19437,19487,19566,19540,19535,19761,19709,19465,19653,19353,19436,19499,19492,19302,19406,19431,19541,19382,19580,19582,19570,19550,19650,19568,19546,19808,19467,19502,19727,19489,19559,19274,19719,19584,19429,19652,19372,19674,19529,19586,19483,19357,19830,19412,19552,19536,19513,19509,19658,19765,19490,19420,19348,19526,19409,19626,19363,19208,19635,19415,19651,19368,19569,19778,19637,19666,19567,19687,19520,19682,19627,19659,19770,19527,19718,19385,19426,19628,19444,19520,19343,19574,19223,19717,19490,19450,19557,19638,19557,19346,19354,19719,19433,19599,19475,19420,19777,19513,19596,19463,19749,19480,19470,19354,19771,19621,19500,19642,19577,19576,19410,19655,19462,19329,19492,19543,19386,19351,19500,19432,19626,19645,19674,19642,19642,19666,19649,19612,19896,19541,19669,19499,19292,19756,19364,19366,19529,19721,19474,19306,19697,19803,19557,19547,19417,19415,19819,19585,19407,19479,19566,19514,19513,19363,19493,19620,19366,19594,19608,19510,19417,19764,19313,19421,19564,19745,19475,19203,19708,19440,19687,19684,19375,19629,19566,19618,19803,19829,19505,19292,19592,19306,19573,19021,19474,19208,19450,19489,19473,19669,19673,19618,19579,19366,19436,19867,19327,19494,19253,19408,19787,19527,19432,19450,19629,19505,19496,19378,19680,19569,19071,19270,19339,19580,19616,19432,19684,19427,19607,19551,19445,19378,19599,19681,19683,19465,19558,19669,19437,19588,19465,19535,19469,19584,19494,19545,19302,19447,19727,19549,19380,19842,19369,19515,19729,19707,19641,19363,19623,19347,19519,19569,19338,19704,19554,19307,19699,19529,19698,19516,19349,19605,19972,19404,19336,19648,19455,19447,19538,19539,19423,19349,19511,19887,19406,19815,19442,19530,19783,19350,19627,19483,19702,19490,19603,19358,19475,19604,19369,19538,19474,19444,19420,19487,19515,19548,19866,19426,19551,19632,19598,19548,19474,19370,19721,19756,19493,19512,19510,19573,19548,19602,19481,19485,19218,19503,19396,19303,19612,19471,19509,19627,19565,19406,19603,19596,19388,19370,19708,19630,19290,19670,19611,19533,19536,19646,19551,19597,19442,19463,19300,19445,19518,19619,19484,19344,19373,19681,19782,19448,19422,19535,19470,19252,19607,19869,19371,19477,19450,19753,19475,19417,19686,19480,19526,19345,19775,19419,19436,19692,19683,19610,19391,19607,19528,19759,19599,19405,19393,19301,19193,19457,19669,19521,19512,19614,19808,19695,19636,19189,19632,19280,19481,19619,19504,19878,19376,19611,19569,19518,19595,19713,19400,19513,19869,19486,19454,19462,19505,19390,19552,19209,19560,19320,19487,19383,19450,19742,19677,19652,19510,19412,19532,19636,19619,19605,19728,19549,19556,19589,19618,19491,19868,19739,19507,19373,19329,19445,19512,19687,19747,19647,19588,19512,19736,19490,19448,19473,19618,19665,19392,19720,19432,19533,19636,19361,19288,19497,19337,19562,19384,19655,19407,19715,19739,19287,19393,19425,19385,19320,19507,19391,19526,19493,19655,19432,19675,19621,19652,19418,19599,19616,19434,19667,19603,19549,19518,19437,19621,19509,19521,19460,19346,19332,19345,19621,19564,19619,19517,19623,19636,19559,19739,19692,19746,19399,19405,19601,19864,19545,19559,19337,19496,19524,19327,19510,19562,19277,19312,19148,19498,19448,19323,19696,19432,19558,19615,19564,19306,19665,19578,19481,19543,19503,19482,19773,19975,19320,19545,19444,19540,19429,19639,19516,19406,19324,19547,19416,19764,19505,19806,19622,19588,19642,19205,19649,19654,19703,19518,19600,19733,19763,19689,19441,19317,19447,19391,19555,19398,19445,19798,19618,19745,19447,19403,19503,19376,19606,19536,19379,19528,19728,19627,19734,19533,19385,19431,19454,19382,19817,19442,19545,19501,19423,19549,19596,19572,19747,19440,19436,19484,19768,19668,19580,19526,19508,19642,19313,19562,19570,19749,19513,19316,19511,19462,19888,19760,19575,19627,19621,19445,19672,19518,19253,19535,19536,19435,19569,19426,19565,19553,19839,19741,19464,19457,19651,19439,19805,19339,19582,19377,19566,19451,19689,19654,19778,19391,19349,19442,19492,19621,19286,19515,19455,19244,19634,19558,19341,19429,19608,19202,19467,19611,19478,19641,19444,19486,19418,19490,19419,19586,19611,19487,19361,19546,19719,19581,19558,19441,19583,19517,19599,19653,19523,19567,19504,19305,19491,19452,19354,19630,19543,19674,19398,19209,19394,19567,19460,19637,19615,19483,19457,19546,19291,19397,19448,19591,19696,19643,19661,19481,19652,19841,19614,19592,19684,19486,19843,19296,19580,19661,19501,19426,19490,19421,19267,20011,19801,19249,19502,19461,19714,19570,19720,19455,19255,19391,19478,19520,19235,19042,19552,19541,20028,19657,19657,19439,19375,19614,19514,19550,19393,19468,19322,19490,19426,19670,19760,19338,19413,19569,19405,19528,19567,19321,19472,19362,19435,19412,19612,19619,19635,19710,19345,19726,19723,19601,19419,19641,19451,19670,19571,19415,19487,19651,19494,19550,19322,19439,19301,19491,19410,19626,19520,19440,19509,19470,19679,19383,19382,19400,19497,19665,19441,19251,19368,19376,19429,19576,19532,19448,19447,19632,19564,19533,19346,19594,19391,19631,19785,19644,19601,19507,19652,19428,19684,19569,19425,19678,19368,19549,19518,19901,19262,19662,19466,19573,19540,19708,19665,19639,19364,19511,19604,19577,19541,19780,19440,19338,19644,19601,19701,19446,19403,19591,19398,19490,19812,19488,19472,19380,19437,19588,19535,19550,19576,19604,19350,19373,19712,19531,19453,19666,19377,19231,19693,19468,19596,19763,19726,19644,19805,19393,19435,19504,19542,19433,19616,19637,19557,19457,19354,19670,19737,19614,19400,19858,19650,19701,19495,19511,19312,19803,19476,19461,19410,19402,19472,19565,19420,19270,19399,19456,19290,19509,19470,19351,19550,19305,19615,19531,19600,19498,19553,19617,19433,19579,19550,19598,19919,19470,19442,19467,19805,19715,19487,19434,19514,19502,19572,19821,19450,19820,19526,19720,19445,19434,19574,19590,19407,19522,19427,19322,19590,19585,19660,19440,19464,19603,19104,19323,19621,19549,19599,19331,19420,19376,19633,19595,19485,19472,19435,19509,19609,19617,19490,19516,19643,19693,19594,19745,19378,19476,19635,19344,19448,19456,19392,19573,19528,19170,19410,19583,19727,19672,19348,19509,19473,19523,19634,19738,19737,19539,19470,19486,19546,19530,19274,19500,19846,19509,19362,19388,19735,19712,19566,19511,19625,19635,19627,19309,19602,19637,19537,19598,19474,19479,19605,19781,19600,19739,19768,19581,19561,19598,19617,19606,19517,19885,19516,19374,19540,19514,19577,19571,19393,19363,19517,19368,19534,19508,19378,19857,19482,19514,19682,19346,19521,19658,19243,19714,19875,19339,19831,19301,19640,19466,19333,19351,19434,19541,19378,19684,19685,19658,19615,19606,19718,19282,19726,19813,19441,19618,19633,19453,19686,19453,19619,19221,19552,19504,19474,19576,19523,19603,19608,19553,19411,19672,19872,19594,19772,19643,19786,19399,19445,19714,19508,19199,19675,19796,19606,19623,19507,19413,19700,19563,19589,19341,19459,19253,19253,19641,19488,19222,19219,19319,19349,19700,19555,19758,19355,19496,19560,19340,19336,19796,19482,19566,19516,19627,19557,19524,19536,19555,19718,19192,19525,19515,19412,19558,19450,19558,19607,19459,19551,19379,19889,19618,19373,19589,19663,19713,19529,19462,19380,19653,19575,19699,19453,19532,19583,19776,19607,19563,19485,19980,19619,19549,19530,19612,19692,19582,19391,19395,19410,19527,19491,19769,19545,19470,19628,19534,19323,19659,19278,19295,19526,19714,19510,19318,19449,19273,19647,19439,19506,19555,19624,19536,19658,19483,19528,19617,19331,19422,19278,19504,19440,19415,19395,19695,19645,19855,19465,19704,19391,19688,19496,19516,19457,19579,19659,19577,19562,19464,19520,19390,19550,19516,19549,19544,19392,19534,19453,19365,19619,19350,19440,19525,19756,19608,19591,19406,19452,19505,19347,19410,19692,19267,19546,19518,19614,19316,19303,19653,19640,19601,19336,19367,19515,19361,19510,19573,19530,19589,19371,19381,19829,19704,19667,19423,19295,19424,19545,19461,19367,19595,19347,19498,19384,19419,19197,19310,19380,19393,19487,19544,19344,19254,19453,19778,19595,19360,19520,19562,19807,19631,19686,19496,19126,19719,19613,19736,19657,19207,19190,19390,19550,19555,19870,19410,19686,19490,19413,19436,19488,19480,19528,19690,19424,19477,19616,19403,19570,19386,19676,19551,19617,19387,19531,19358,19838,19273,19504,19600,19590,19530,19667,19627,19469,19677,19675,19337,19471,19448,19534,19689,19507,19491,19780,19376,19711,19694,19711,19724,19400,19763,19473,19593,19493,19336,19522,19471,19711,19491,19525,19695,19130,19454,19493,19484,19452,19753,19765,19885,19378,19534,19533,19668,19456,19530,19434,19602,19623,19471,19569,19294,19423,19448,19401,19445,19327,19346,19716]},{"counters":[19686,19653,19441,19584,19731,19450,19464,19513,19507,19364,19529,19249,19217,19427,19675,19483,19325,19764,19562,19621,19362,19468,19303,19206,19676,19336,19664,19403,19453,19851,19490,19610,19651,19833,19472,19739,19471,19454,19673,19570,19470,19577,19473,19302,19502,19414,19616,19351,19467,19374,19533,19370,19563,19566,19601,19584,19551,19396,19282,19505,19552,19609,19567,19641,19315,19731,19472,19782,19627,19291,19617,19626,19585,19158,19638,19518,19387,19584,19672,19307,19516,19679,19467,19642,19521,19628,19816,19206,19996,19532,19817,19660,19326,19559,19484,19318,19677,19468,19644,19468,19511,19661,19497,19557,19539,19357,19707,19543,19553,19492,19758,19425,19495,19631,19506,19636,19432,19582,19522,19749,19344,19852,19773,19198,19474,19363,19447,19528,19425,19415,19485,19619,19607,19373,19407,19534,19492,19667,19649,19651,19394,19267,19429,19630,19396,19790,19299,19629,19384,19506,19635,19851,19881,19364,19682,19520,19740,19567,19765,19543,19473,19672,19374,19588,19838,19475,19364,19780,19434,19426,19417,19444,19706,19802,19432,19775,19647,19509,19600,19502,19565,19927,19625,19363,19365,19254,19422,19382,19506,19510,19613,19241,19421,19394,19427,19336,19410,19543,19329,19322,19406,19356,19337,19429,19535,19340,19399,19579,19403,19511,19188,19493,19589,19355,19425,19428,19455,19614,19513,19339,19335,19582,19799,19669,19592,19606,19530,19709,19631,19392,19373,19598,19603,19665,19575,19644,19305,19323,19366,19535,19541,19468,19493,19691,19406,19328,19200,19633,19419,19430,19623,19700,19454,19496,19349,19372,19330,19314,19451,19365,19263,19537,19723,19635,19504,19621,19410,19213,19574,19588,19719,19823,19242,19485,19725,19576,19451,19554,19648,19376,19527,19339,19534,19410,19500,19461,19659,19389,19532,19406,19255,19855,19599,19443,19536,19663,19577,19705,19611,19467,19442,19273,19663,19686,19820,19524,19588,19434,19463,19745,19644,19519,19288,19314,19510,19418,19672,19594,19596,19240,19528,19765,19583,19900,19542,19472,19427,19441,19484,19917,19799,19582,19345,19377,19632,19516,19446,19719,19688,19697,19472,19606,19663,19692,19608,19613,19444,19380,19576,19412,19633,19360,19617,19556,19471,19450,19501,19274,19718,19444,19660,19565,19638,19566,19315,19549,19447,19639,19322,19485,19505,19686,19604,19833,19395,19750,19526,19534,19642,19641,19373,19668,19381,19516,19506,19433,19643,19696,19444,19591,19728,19411,19660,19570,19472,19646,19574,19490,19400,19690,19604,19672,19448,19464,19411,19329,19567,19479,19503,19637,19492,19550,19446,19560,19617,19495,19635,19583,19768,19547,19626,19841,19557,19500,19459,19496,19456,19488,19501,19437,19691,19451,19453,19565,19351,20001,19382,19421,19646,19390,19683,19867,19615,19488,19502,19164,19548,19632,19619,19488,19498,19653,19556,19435,19057,19621,19437,19692,19502,19718,19445,19755,19557,19462,19554,19588,19335,19475,19384,19393,19489,19536,19460,19767,19485,19460,19546,19465,19369,19499,19381,19827,19479,19495,19723,19590,19734,19516,19869,19655,19746,19475,19929,19279,19631,19610,19565,19487,19780,19448,19306,19726,19630,19492,19477,19564,19298,19758,19487,19683,19919,19460,19454,19486,19521,19531,19451,19361,19675,19337,19497,19413,19271,19951,19434,19321,19394,19387,19716,19624,19785,19657,19496,19356,19750,19225,19282,19491,19375,19515,19450,19595,19595,19602,19176,19673,19716,19533,19676,19440,19369,19358,19380,19359,19355,19562,19744,19689,19511,19683,19581,19280,19790,19395,19480,19605,19229,19420,19800,19376,19617,19439,19749,19447,19474,19640,19515,19558,19507,19685,19364,19423,19470,19420,19409,19233,19627,19540,19563,19695,19572,19381,19654,19582,19563,19522,19541,19510,19621,19532,19558,19179,19576,19635,19518,19633,19576,19406,19173,19479,19285,19721,19514,19638,19759,19242,19269,19555,19555,19364,19287,19439,19284,19525,19773,19188,19370,19548,19628,19693,19469,19681,19412,19924,19555,19719,19582,19451,19534,19486,19754,19667,19242,20023,19548,19372,19621,19666,19528,19636,19720,19424,19241,19432,19489,19610,19450,19435,19321,19542,19541,19494,19657,19504,19481,19617,19497,19822,19637,19462,19705,19532,19631,19419,19422,19654,19481,19494,19514,19650,19706,19748,19808,19680,19250,19506,19624,19701,19501,19528,19392,19425,19051,19469,19310,19880,19489,19552,19311,19535,19258,19430,19315,19547,19528,19466,19518,19367,19418,19528,19608,19610,19645,19407,19286,19450,19626,19679,19549,19780,19494,19576,19544,19317,19402,19514,19588,19528,19500,19521,19544,19909,19569,19369,19518,19414,19540,19800,19688,19415,19472,19339,19614,19528,19920,19553,19654,19624,19714,19928,19586,19831,19417,19357,19480,19600,19535,19581,19523,19454,19365,19392,19562,19823,19401,19611,19707,19861,19598,19740,19495,19325,19472,19575,19680,19517,19572,19737,19483,19542,19646,19302,19595,19718,19658,19288,19611,19799,19530,19501,19657,19643,19833,19381,19670,19633,19671,19440,19467,19593,19329,19657,19316,19562,19463,19384,19385,19504,19481,19689,19445,19733,19594,19610,19281,19690,19581,19394,19423,19754,19488,19398,19460,19528,19525,19589,19343,19308,19552,19590,19551,19718,19691,19902,19700,19594,19467,19572,19782,19522,19716,19365,19441,19163,19646,19776,19432,19611,19617,19459,19523,19407,19608,19533,19551,19643,19456,19766,19663,19569,19632,19570,19226,19420,19539,19558,19578,19584,19378,19466,19685,19863,19345,19572,19560,19498,19695,19354,19717,19361,19585,19651,19683,19522,19577,19307,19377,19612,19567,19476,19459,19400,19476,19475,19396,19554,19599,19513,19403,19539,19470,19384,19350,19571,19572,19602,19371,19584,19631,19484,19819,19665,19468,19570,19530,19626,19291,19665,19551,19387,19521,19569,19641,19664,19630,19410,19476,19208,19512,19627,19788,19618,19437,19373,19734,19350,19575,19437,19348,19470,19226,19702,19502,19454,19564,19539,19612,19247,19369,19549,19640,19567,19594,19525,19372,19718,19325,19673,19641,19425,19527,19524,19495,19592,19447,19699,19659,19320,19565,19674,19515,19442,19256,19497,19500,19651,19644,19650,19558,19588,19533,19536,19563,19688,19366,19657,19495,19577,19530,19699,19401,19479,19444,19600,19191,19385,19436,19473,19660,19538,19450,19645,19561,19635,19319,19351,19584,19488,19662,19605,19594,19591,19545,19568,19478,19567,19645,19655,19571,19433,19563,19557,19771,19299,19491,19608,19703,19407,19909,19338,19340,19544,19708,19489,19585,19405,19434,19673,19579,19479,19385,19449,19592,19288,19471,19418,19524,19601,19576,19487,19782,19508,19573,19535,19443,19355,19611,19728,19741,19639,19536,19745,19683,19602,19359,19396,19707,19390,19632,19499,19409,19614,19564,19708,19496,19722,19409,19492,19437,19663,19328,19580,19407,19509,19616,19557,19261,19736,19532,19422,19474,19497,19394,19725,19684,19495,19217,19515,19542,19699,19469,19515,19446,19559,19446,19339,19698,19358,19505,19328,19444,19527,19577,19693,19246,19600,19248,19567,19742,19443,19784,19417,19347,19597,19549,19433,19589,19273,19644,19302,19350,19610,19535,19788,19603,19458,19445,19580,19416,19506,19538,19695,19406,19304,19428,19661,19346,19702,19579,19378,19693,19351,19752,19437,19501,19550,19507,19422,19455,19517,19515,19549,19417,19070,19555,19486,19585,19727,19557,19577,19448,19492,19434,19499,19540,19542,19561,19433,19614,19220,19596,19517,19543,19424,19745,19531,19443,19306,19634,19411,19374,19709,19675,19632,19545,19635,19536,19666,19627,19449,19515,19625,19668,19580,19415,19797,19338,19620,19661,19598,19559,19609,19527,19703,19598,19467,19689,19439,19348,19624,19531,19452,19450,19352,19456,19624,19631,19420,19559,19645,19708,19507,19468,19472,19552,19362,19380,19706,19398,19707,19525,19354,19571,19588,19619,19763,19488,19406,19786,19634,19551,19697,19265,19632,19473,19641,19302,19538,19636,19354,19435,19428,19562,19504,19779,19733,19587,19570,19255,19655,19386,19505,19231,19716,19559,19649,19603,19599,19685,19527,19803,19640,19601,19454,19416,19430,19742,19427,19654,19689,19592,19492,19416,19643,19631,19438,19487,19692,19602,19736,19494,19359,19440,19323,19589,19642,19524,19797,19261,19670,19520,19622,19516,19805,19418,19980,19342,19246,19349,19483,19490,19532,19625,19635,19316,19535,19664,19543,19484,19437,19767,19641,19771,19430,19748,19655,19388,19606,19693,19630,19562,19502,19630,19486,19463,19525,19730,19471,19631,19524,19807,19486,19721,19710,19698,19726,19284,19400,19365,20093,19913,19817,19636,19467,19452,19270,19596,19475,19719,19698,19435,19626,19471,19498,19293,19580,19464,19401,19572,19677,19758,19655,19551,19607,19574,19500,19463,19695,19540,19631,19829,19652,19720,19368,19288,19484,19527,19457,19693,19416,19530,19424,19579,19423,19477,19755,19502,19638,19778,19642,19585,19384,19377,19558,19684,19467,19514,19682,19484,19492,19848,19629,19526,19519,19343,19617,19256,19526,19167,19402,19718,19804,19462,19325,19452,19569,19342,19285,19594,19290,19755,19598,19489,19649,19344,19572,19586,19660,19934,19532,19608,19540,19529,19809,19659,19428,19549,19365,19420,19534,19583,19424,19624,19611,19570,19406,19562,19483,19486,19342,19575,19180,19729,19543,19504,19258,19511,19371,19503,19466,19600,19501,19928,19217,19577,19751,19464,19523,19532,19529,19378,19617,19462,19672,19305,19623,19520,19625,19431,19631,19676,19230,19489,19757,19407,19605,19551,19365,19394,19762,19763,19641,19693,19423,19464,19560,19425,19534,19588,19662,19462,19219,19384,19471,19544,19470,19519,19605,19629,19961,19627,19531,19626,19519,19795,19353,19225,19413,19678,19706,19329,19540,19539,19600,19457,19562,19366,19492,19626,19532,19205,19418,19242,19532,19729,19578,19305,19572,19457,19500,19746,19482,19532,19641,19732,19536,19189,19682,19505,19712,19637,19490,19432,19530,19618,19580,19697,19435,19468,19407,19648,19481,19617,19550,19318,19403,19409,19249,19585,19512,19567,19554,19461,19318,19819,19811,19366,19325,19738,19805,19638,19775,19416,19495,19623,19427,19688,19517,19603,19458,19635,19561,19456,19435,19563,19684,19585,19500,19552,19385,19519,19498,19493,19492,19509,19602,19403,19452,19605,19524,19661,19327,19502,19341,19575,19676,19427,19777,19671,19388,19532,19548,19884,19466,19434,19431,19396,19341,19408,19427,19720,19357,20026,19355,19539,19469,19634,19484,19574,19388,19513,19581,19472,19580,19562,19335,19410,19605,19698,19777,19472,19435,19586,19554,19697,19648,19621,19402,19489,19669,19602,19291,19356,19372,19524,19387,19356,19574,19758,19063,19361,19478,19871,19572,19615,19224,19593,19602,19400,19480,19435,19639,19506,19567,19417,19468,19490,19655,19290,19487,19588,19387,19498,19662,19377,19677,19340,19524,19515,19590,19410,19614,19738,19418,19564,19410,19760,19495,19759,19533,19337,19340,19500,19718,19509,19586,19464,19545,19425,19432,19624,19553,19468,19832,19536,19479,19495,19541,19293,19523,19491,19583,19497,19185,19568,19618,19540,19501,19626,19569,19294,19343,19622,19247,19442,19567,19416,19373,19513,19447,19297,19557,19556,19685,19369,19558,19687,19679,19682,19428,19425,19650,19303,19628,19546,19512,19583,19599,19495,19592,19524,19866,19270,19466,19740,19445,19715,19317,19510,19291,19487,19596,19532,19496,19457,19453,19556,19628,19504,19694,19375,19430,19438,19410,19383,19445,19850,19625,19583,19199,19476,19308,19357,19450,19339,19662,19280,19631,19515,19358,19404,19788,19180,19367,19551,19629,19660,19593,19605,19695,19669,19333,19492,19290,19355,19779,19459,19404,19455,19509,20055,19605,19708,19202,19870,19740,19773,19608,19465,19134,19371,19574,19747,19368,19417,19577,19482,19682,19543,19434,19284,19322,19422,19695,19479,19473,19291,19822,19447,19678,19464,19710,19604,19440,19510,19669,19662,19650,19414,19691,19667,19446,19535,19484,19699,19561,19894,19411,19358,19386,19572,19585,19431,19531,19426,19658,19439,19472,19654,19361,19404,19377,19630,19408,19703,19513,19572,19438,19678,19754,19727,19687,19451,19382,19512,19522,19646,19290,19823,19739,19371,19277,19487,19704,19437,19319,19511,19511,19638,19484,19631,19665,19587,19625,19420,19552,19751,19581,19690,19445,19553,19680,19558,19516,19450,19583,19480,19537,19496,19757,19713,19500,19371,19445,19506,19556,19462,19648,19402,19584,19452,19529,19828,19746,19669,19540,19530,19844,19662,19792,19402,19690,19437,19509,19790,19398,19669,19290,19086,19542,19403,19617,19561,19616,19465,19563,19498,19517,19418,19496,19401,19686,19574,19310,19609,19578,19518,19418,19198,19482,19512,19576,19505,19775,19509,19481,19587,19430,19558,19436,19644,19259,19543,19576,19397,19545,19444,19641,19669,19299,19608,19563,19492,19505,19489,19510,19711,19659,19461,19779,19876,19450,19623,19501,19383,19501,19471,19553]},{"counters":[19391,19671,19707,19821,19771,19766,19449,19495,19844,19615,19514,19443,19694,19431,19476,19473,19511,20032,19801,19110,19461,19311,19440,19318,19457,19470,19410,19481,19541,19577,19464,19670,19731,19355,19390,19663,19666,19397,19715,19413,19700,19502,19512,19700,19542,19759,19510,19545,19474,19555,19534,19432,19681,19541,19571,19551,19728,19571,19458,19477,19563,19558,19526,19452,19221,19337,19410,19474,19519,19731,19527,19431,19357,19384,19392,19224,19475,19544,19501,19624,19452,19541,19364,19572,19580,19664,19517,19626,19602,19868,19193,19801,19288,19450,19848,19822,19374,19479,19536,19506,19405,19664,19399,19367,19688,19615,19692,19529,19689,19711,19416,19692,19631,19670,19556,19850,19537,19649,19544,19615,19479,19705,19515,19569,19365,19548,19461,19680,19465,19706,19697,19512,19290,19526,19851,19618,19830,19517,19467,19739,19607,19615,19289,19640,19106,19392,19481,19400,19629,19705,19495,19696,19392,19621,19677,19563,19743,19508,19527,19686,19171,19535,19605,19279,19556,19586,19341,19585,19574,19627,19630,19424,19548,19438,19770,19551,19602,19745,19945,19704,19326,19579,19395,19494,19253,19446,19370,19423,19447,19599,19655,19502,19758,19574,19688,19595,19418,19353,19547,19804,19566,19532,19573,19489,19525,19678,19789,19238,19617,19582,19393,19575,19842,19556,19670,19591,19596,19505,19383,19431,19693,19566,19545,19297,19555,19592,19735,19298,19494,19646,19553,19679,19647,19392,19785,19502,19551,19566,19532,19418,19587,19521,19548,19289,19487,19537,19437,19353,19508,19167,19373,19492,19683,19305,19579,19500,19664,19741,19767,19494,19712,19516,19385,19641,19616,19525,19623,19777,19361,19736,19484,19581,19457,19370,19261,19496,19406,19848,19620,19571,19648,19344,19524,19250,19595,19320,19470,19757,19583,19506,19483,19481,19341,19638,19529,19473,19515,19644,19363,19441,19385,19450,19434,19641,19342,19516,19527,19359,19492,19638,19825,19329,19739,19608,19376,19399,19699,19652,19565,19509,19622,19525,19642,19573,19556,19844,19478,19706,19417,19609,19376,19346,19799,19596,19492,19546,19389,19571,19625,19266,19652,19394,19415,19655,19496,19465,19398,19695,19578,19546,19891,19399,19461,19361,19486,19428,19587,19432,19616,19444,19482,19456,19493,19477,19547,19167,19627,19257,19828,19431,19642,19406,19392,19163,19616,19548,19687,19523,19400,19391,19840,19477,19487,19665,19409,19769,19748,19444,19566,19748,19269,19291,19466,19704,19494,19551,19549,19379,19716,19433,19626,19478,19524,19393,19705,19550,19519,19339,19398,19412,19475,19391,19537,19622,19724,19410,19510,19503,19359,19637,19453,19776,19400,19757,19359,19439,19443,19685,19782,19525,19732,19571,19591,19364,19308,19349,19571,19629,19244,19536,19463,19624,19709,19392,19524,19662,19497,19386,19352,19660,19727,19336,19491,19589,19506,19372,19235,19465,19794,19427,19718,19470,19648,19748,19604,19389,19375,19455,19721,19336,19370,19304,19313,19691,19627,19354,19753,19700,19485,19446,19431,19474,19596,19323,19479,19488,19112,19670,19629,19679,19661,19783,19500,19607,19718,19641,19481,19885,19676,19673,19669,19470,19492,19442,19546,19420,19276,19602,19933,19710,19454,19643,19718,19397,19301,19559,19831,19544,19207,19405,19607,19562,19568,19479,19536,19624,19303,19492,19280,19675,19778,19562,19639,19364,19467,19230,19292,19639,19486,19833,19547,19317,19764,19449,19347,19325,19604,19689,19379,19742,19441,19450,19560,19357,19530,19779,19415,19584,19706,19510,19531,19623,19422,19680,19621,19624,19594,19519,19459,19385,19798,19638,19652,19566,19579,19603,19442,19501,19723,19421,19496,19134,19643,19495,19487,19587,19503,19581,19549,19477,19526,19208,19497,19542,19520,19548,19429,19467,19716,19588,19108,19526,19492,19491,19657,19871,19417,19671,19623,19632,19273,19238,19446,19577,19510,19413,19847,19493,19723,19481,19665,19691,19645,19853,19634,19541,19306,19760,19280,19699,19460,19658,19593,19561,19588,19497,19475,19559,19611,19361,19530,19504,19603,19522,19335,19565,19705,19519,19287,19376,19280,19547,19513,19685,19039,19414,19589,19739,19313,19711,19470,19468,19573,19442,19555,19460,19499,19639,19576,19388,19433,19193,19420,19681,19472,19466,19532,19455,19953,19617,19407,19503,19649,19545,19351,19657,19358,19515,19456,19340,19371,19605,19181,19537,19740,19621,19181,19386,19565,19361,19923,19448,19336,19640,19685,19517,19378,19259,19311,19292,19433,19492,19470,19462,19284,19582,19568,19592,19548,19594,19819,19565,19376,19366,19592,19407,19321,19617,19553,19453,19721,19392,19382,19768,19685,19562,19709,19279,19749,19617,19319,19534,19406,19794,19609,19622,19649,19471,19580,19649,19467,19771,19613,19395,19728,19752,19554,19611,19554,19405,19620,19543,19467,19481,19816,19508,19490,19679,19318,19446,19944,19548,19342,19690,19573,19632,19505,19519,19213,19271,19567,19641,19418,19494,19759,19702,19630,19716,19451,19585,19350,19384,19620,19517,19289,19538,19182,19746,19468,19684,19587,19538,19311,19603,19535,19476,19565,19698,19401,19299,19685,19630,19543,19506,19586,19558,19345,19260,19698,19587,19514,19653,19506,19357,19784,19706,19434,19606,19588,19641,19668,19468,19612,19545,19616,19555,19411,19613,19768,19608,19636,19654,19595,19872,19612,19333,19543,19373,19502,19726,19456,19191,19487,19408,19596,19513,19651,19574,19643,19732,19721,19587,19511,19784,19322,19203,19369,19634,19361,19443,19544,19547,19702,19562,19535,19457,19336,19372,19730,19742,19549,19825,19246,19225,19407,19647,19482,19411,19685,19508,19498,19483,19519,19435,19302,19306,19689,19682,19548,19823,19558,19360,19415,19352,19304,19644,19714,19558,19681,19606,19339,19598,19323,19308,19297,19739,19516,19422,19575,19500,19588,19561,19750,19646,19448,19283,19443,19412,19376,19449,19498,19508,19565,19701,19669,19492,19604,19359,19425,19363,19536,19456,19593,19400,19718,19357,19501,19469,19729,19901,19735,19364,19749,19660,19684,19367,19573,19678,19425,19584,19451,19466,19528,19394,19453,19369,19469,19591,19412,19640,19612,19540,19470,19115,19634,19521,19757,19514,19476,19300,19652,19348,19421,19643,19359,19414,19674,19364,19576,19771,19509,19553,19578,19455,19464,19503,19865,19650,19526,19677,19372,19344,19399,19581,19240,19509,19446,19626,19565,19747,19494,19596,19716,19523,19433,19654,19386,19220,19371,19271,19460,19391,19497,19502,19814,19390,19495,19617,19547,19690,19584,19677,19603,19484,19588,19520,19357,19812,19695,19561,19466,19473,19526,19450,19560,19186,19520,19671,19379,19473,19654,19510,19514,19411,19653,19727,19437,19527,19518,19517,19531,19454,19294,19736,19562,19414,19549,19672,19714,19621,19402,19559,19375,19552,19867,19426,19607,19664,19248,19635,19639,19759,19599,19404,19225,19559,19388,19508,19658,19165,19595,19607,19808,19613,19672,19373,19331,19549,19511,19627,19451,19695,19700,19409,19733,19555,19521,19399,19374,19452,19343,19558,19604,19524,19802,19432,19748,19375,19492,19497,19630,19315,19121,19416,19595,19459,19473,19601,19571,19353,19579,19808,19595,19587,19711,19465,19431,19548,19564,19515,19415,19357,19554,19497,19502,19795,19769,19490,19546,19155,19493,19610,19582,19326,19360,19442,19379,19609,19365,19603,19524,19680,19427,19123,19722,19328,19505,19658,19474,19647,19784,19799,19408,19450,19572,19408,19535,19575,19540,19616,19728,19686,19626,19363,19648,19897,19699,19507,19248,19161,19482,19463,19641,19458,19631,19417,19550,19618,19397,19733,19516,19485,19502,19483,19555,19640,19514,19719,19852,19519,19661,19200,19357,19394,19358,19391,19390,19578,19702,19439,19578,19419,19595,19513,19514,19318,19302,19678,19537,19568,19683,19566,19404,19397,19388,19534,19565,19596,19396,19620,19569,19326,19219,19587,19364,19662,19455,19582,19656,19394,19645,19455,19711,19523,19663,19535,19618,19633,19403,19541,19688,19635,19559,19366,19452,19554,19738,19583,19369,19596,19305,19502,19464,19473,19446,19499,19805,19527,19535,19608,19641,19514,19602,19419,19706,19335,19377,19755,19558,19423,19455,19457,19637,19646,19351,19598,19663,19599,19433,19513,19483,19796,19531,19565,19721,19452,19718,19652,19781,19485,19715,19637,19594,19486,19306,19805,19409,19402,19620,19390,19380,19537,19048,19483,19734,19911,19544,19348,19630,19599,19658,19557,19559,19512,19495,19654,19626,19329,19670,19303,19437,19568,19774,19565,19660,19399,19533,19701,19455,19526,19584,19644,19332,19761,19441,19574,19565,19627,19634,19322,19620,19575,19566,19288,19768,19635,19652,19682,19529,19590,19452,19472,19347,19387,19512,19804,19659,19634,19714,19389,19334,19560,19703,19532,19813,19484,19564,19449,19741,19277,19563,19693,19728,19479,19521,19592,19599,19595,19701,19558,19102,19574,19538,19661,19483,19334,19621,19820,19466,19737,19620,19410,19417,19433,19544,19444,19501,19593,19413,19479,19665,19422,19388,19521,19470,19433,19527,19674,19509,19807,19434,19699,19558,19692,19652,19299,19401,19370,19583,19752,19504,19496,19258,19716,19503,19411,19461,19567,19707,19587,19356,19604,19794,19352,19653,19446,19328,19731,19608,19372,19474,19538,19587,19796,19720,19598,19376,19675,19625,19764,19411,19628,19347,19426,19487,19817,19366,19777,19702,19761,19677,19552,19621,19481,19629,19463,19654,19240,19721,19563,19381,20043,19405,19491,19658,19398,19714,19512,19639,19675,19672,19600,19508,19432,19410,19382,19375,19398,19317,19498,19636,19390,19558,19409,19675,19711,19588,19676,19690,19486,19711,19598,19519,19463,19451,19457,19560,19596,19579,19503,19377,19473,19448,19599,19786,19391,19254,19434,19310,19537,19540,19414,19624,19594,19795,19670,19606,19347,19494,19551,19479,19701,19378,19468,19499,19438,19480,19417,19537,19431,19666,19191,19530,19396,19471,19417,19507,19692,19548,19440,19486,19353,19361,19246,19814,19508,19656,19514,19250,19489,19824,19461,19459,19651,19730,19553,19508,19436,19677,19642,19500,19611,19669,19379,19371,19204,19543,19858,19544,19417,19612,19692,19805,19776,19735,19373,19441,19287,19679,19469,19438,19554,19445,19486,19421,19246,19441,19461,19467,19600,19350,19557,19603,19689,19607,19419,19566,19382,19444,19608,19579,19165,19355,19488,19669,19455,19180,19541,19456,19707,19711,19701,19277,19473,19566,19714,19371,19693,19778,19514,19530,19456,19546,19544,19400,19325,19615,19734,19886,19693,19587,19455,19573,19873,19666,19456,19383,19388,19295,19320,19640,19686,19662,19472,19943,19418,19591,19655,19496,19417,19368,19445,19601,19542,19560,19388,19526,19496,19319,19677,19682,19379,19504,19698,19692,19533,19279,19795,19798,19552,19296,19413,19591,19632,19458,19583,19293,19263,19404,19635,19317,19516,19687,19414,19503,19612,19454,19783,19492,19452,19424,19680,19653,19510,19577,19661,19427,19538,19319,19743,19472,19548,19618,19364,19673,19442,19375,19361,19895,19533,19506,19281,19103,19588,19389,19462,19417,19492,19592,19507,19563,19217,19430,19616,19858,19581,19698,19774,19403,19401,19403,19521,19561,19694,19588,19644,19511,19089,19613,19696,19574,19509,19453,19335,19257,19643,19557,19465,19621,19526,19669,19380,19587,19713,19693,19353,19581,19715,19464,19619,19524,19628,19348,19745,19619,19576,19780,19357,19585,19648,19887,19573,19516,19448,19327,19417,19091,19342,19693,19479,19440,19482,19627,19597,19659,19432,19737,19367,19714,19424,19500,19664,19590,19676,19640,19400,19627,19483,19815,19320,19414,19370,19498,19535,19254,19711,19738,19773,19361,19409,19556,19701,19068,19496,19522,19439,19775,19317,19405,19488,19490,19400,19637,19357,19589,19599,19341,19177,19533,19564,19564,19542,19570,19834,19594,19538,19446,19539,19361,19598,19386,19187,19643,19603,19816,19532,19409,19378,19482,19519,19487,19337,19535,19561,19634,19367,19768,19500,19597,19409,19670,19448,19242,19484,19478,19459,19666,19446,19679,19665,19564,19699,19382,19661,19519,19490,19545,19572,19651,19353,19665,19665,19386,19641,19394,19280,19667,19497,19669,19209,19305,19383,19536,19657,19566,19639,19585,19446,19666,19590,19924,19714,19528,19634,19667,19640,19449,19591,19500,19812,19410,19449,19776,19536,19419,19537,19465,19294,19732,19667,19493,19719,19342,19374,19560,19599,19848,19425,19715,19433,19817,19584,19679,19547,19485,19389,19502,19668,19811,19589,19399,19581,19528,19593,19705,19559,19453,19738,19679,19486,19224,19460,19758,19563,19756,19556,19613,19522,19326,19319,19533,19462,19471,19640,19811,19529,19506,19365,19982,19449,19346,19171,19284,19626,19348,19477,19433,19389,19475,19365,19580,19434,19601,19470,19453,19382,19604,19713,19620,19463,19651,19412,19343,19600,19581,19500,19437,19470,19263,19543,19614,19639,19641,19555,19438,19414,19381,19762,19319,19535,19463,19627,19547,19553,19513,19363,19489,19761]},{"counters":[19552,19574,19658,19762,19562,19366,19443,19606,19657,19662,19631,19721,19322,19389,19709,19695,19595,19564,19486,19465,19393,19567,19554,19491,19421,19569,19432,19424,19483,19728,19437,19637,19548,19292,19185,19647,19505,19465,19539,19570,19524,19716,19360,19464,19431,19506,19382,19185,19549,19642,19815,19227,19437,19476,19482,19846,19427,19468,19788,19410,19765,19634,19547,19496,19348,19571,19423,19687,19391,19689,19526,19437,19485,19284,19173,19698,19365,19469,19529,19528,19564,19660,19675,19282,19606,19292,19450,19321,19574,19505,19504,19599,19517,19677,19220,19331,19371,19585,19346,19467,19901,19565,19313,19207,19521,19721,19323,19655,19554,19825,19480,19562,19640,19464,19519,19293,19751,19456,19748,19658,19605,19610,19529,19373,19755,19553,19655,19512,19403,19430,19456,19346,19410,19563,19528,19619,19707,19233,19402,19479,19372,19360,19480,19829,19328,19466,19307,19552,19407,19570,19565,19679,19583,19262,19503,19422,19418,19374,19340,19631,19600,19673,19458,19572,19542,19600,19457,19668,19522,19704,19699,19290,19575,19758,19418,19653,19561,19583,19563,19640,19475,19326,19521,19755,19546,19454,19564,19343,19472,19629,19704,19362,19453,19345,19664,19681,19206,19661,19605,19551,19633,19491,19564,19368,19492,19644,19444,19660,19212,19593,19738,19392,19533,19424,19584,19454,19780,19383,19716,19530,19395,19494,19391,19475,19623,19657,19457,19486,19465,19449,19553,19419,19575,19532,19445,19356,19491,19289,19389,19574,19357,19859,19769,19842,19882,19646,19281,19568,19520,19636,19693,19519,19498,19387,19337,19523,19687,19735,19554,19473,19913,19530,19597,19635,19413,19609,19449,19805,19423,19737,19462,19662,19608,19522,19501,19395,19292,19572,19497,19706,19507,19576,19765,19507,19177,19387,19440,19807,19444,19370,19242,19431,19456,19444,19578,19575,19490,19518,19595,19668,19764,19424,19955,19619,19485,19719,19475,19646,19462,19868,19586,19532,19690,19369,19337,19537,19461,19606,19597,19331,19338,19185,19496,19294,19356,19855,19497,19819,19538,19473,19392,19675,19221,19579,19506,19502,19204,19636,19595,19648,19622,19531,19380,19392,19330,19424,19180,19498,19562,19583,19743,19571,19679,19643,19723,19524,19338,19328,19574,19608,19543,19520,19655,19472,19351,19556,19458,19258,19746,19722,19646,19529,19299,19281,19609,19516,19533,19393,19316,19639,19534,19674,19422,19356,19680,19668,19385,19665,19535,19524,19648,19293,19312,19367,19320,19576,19554,19811,19712,19304,19545,19388,19497,19626,19588,19505,19472,19226,19541,19446,19599,19468,19462,19484,19672,19605,19617,19481,19679,19621,19499,19676,19482,19737,19370,19388,19543,19874,19345,19488,19551,19788,19567,19559,19591,19848,19678,19409,19510,19527,19565,19484,19657,19544,19825,19675,19544,19487,19377,19550,19426,19331,19704,19289,19556,19659,19559,19407,19569,19567,19641,19678,19488,19482,19443,19679,19586,19347,19482,19336,19534,19292,19591,19464,19590,19741,19826,19566,19659,19351,19501,19523,19592,19504,19728,19194,19576,19558,19636,19441,19226,19387,19758,19365,19422,19684,19478,19350,19359,19774,19451,19424,19308,19536,19244,19517,19521,19456,19570,19668,19473,19807,19629,19402,19824,19686,19259,19377,19483,19410,19374,19376,19420,19546,19340,19357,19690,19408,19367,19328,19681,19751,19177,19686,19265,19459,19608,19650,19743,19591,19680,19459,19558,19807,19470,19449,19384,19451,19704,19424,19631,19581,19718,19657,19737,19321,19439,19620,19517,19312,19419,19628,19719,19756,19654,19728,19400,19317,19418,19517,19549,19686,19525,19397,19353,19286,19700,19645,19541,19442,19090,19428,19404,19784,19552,19600,19295,19554,19477,19704,19465,19532,19597,19715,19560,19687,19254,19689,19611,19884,19605,19563,19710,19486,19497,19719,19531,19942,19537,19379,19461,19718,19665,19573,19644,19408,19559,19547,19508,19543,19425,19605,19803,19651,19482,19601,19582,19563,19701,19330,19460,19303,19575,19647,19429,19676,19581,19469,19546,19572,19605,19550,19535,19545,19412,19625,19540,19695,19724,19385,19388,19663,19643,19624,19335,19355,19317,19576,19666,19476,19625,19457,19565,19370,19480,19651,19590,19638,19430,19457,19762,19583,19621,19376,19591,19779,19584,19544,19455,19690,19738,19622,19572,19300,19646,19410,19616,19573,19386,19635,19455,19374,19543,19568,19463,19573,19822,19684,19299,19422,19527,19496,19236,19577,19597,19565,19427,19612,19684,19812,19546,19443,19355,19367,19646,19570,19515,19831,19612,19538,19550,19589,19781,19437,19424,19507,19537,19664,19457,19390,19684,19439,19473,19558,19748,19727,19551,19328,19361,19679,19541,19668,19424,19509,19435,19763,19471,19518,19629,19545,19439,19445,19414,19717,19460,19547,19577,19491,19739,19599,19802,19657,19425,19321,19493,19481,19755,19469,19497,19489,19455,19424,19493,19327,19432,19920,19519,19704,19470,19581,19700,19444,19481,19678,19421,19338,19647,19510,19417,19346,19657,19487,19406,19619,19356,19646,19665,19441,19516,19469,19706,19430,19695,19485,19490,19466,19761,19631,19589,19499,19350,19400,19675,19413,19519,19781,19289,19591,19725,19657,19390,19600,19468,19434,19407,19539,19435,19308,19362,19592,19375,19393,19479,19350,19565,19757,19529,19501,19720,19435,19679,19748,19587,19503,19336,19281,19550,19469,19534,19692,19671,19435,19508,19321,19493,19669,19763,19437,19677,19581,19320,19587,19434,19559,19556,19585,19380,19559,19485,19579,19524,19655,19557,19698,19379,19487,19507,19537,19618,19370,19491,19500,19568,19561,19534,19854,19418,19271,19491,19583,19238,19460,19580,19494,19611,19686,19732,19828,19947,19693,19525,19671,19667,19444,19578,19608,19538,19685,19498,19352,19392,19720,19558,19473,19560,19219,19714,19451,19732,19539,19679,19608,19397,19190,20000,19266,19659,19606,19681,19586,19432,19318,19580,19524,19370,19209,19377,19355,19432,19439,19209,19554,19495,19360,19596,19455,19538,19466,19575,19559,19628,19507,19428,19524,19604,19401,19335,19483,19578,19452,19545,19538,19615,19543,19572,19634,19591,19470,19181,19643,19516,19533,19447,19511,19729,19222,19366,19598,19418,19851,19262,19525,19574,19696,19335,19547,19501,19529,19743,19538,19565,19453,19751,19598,19495,19604,19469,19287,19502,19409,19752,19298,19769,19576,19563,19411,19509,19684,19787,19528,19438,19583,19393,19615,19684,19450,19595,19775,19354,19674,19649,19367,19647,19576,19414,19552,19623,19430,19431,19593,19389,19413,19490,19653,19691,19585,19598,19683,19673,19514,19485,19422,19733,19787,19457,19563,19510,19327,19841,19484,19377,19682,19533,19585,19515,19587,19640,19687,19409,19230,19712,19207,19271,19527,19495,19263,19442,19672,19614,19559,19772,19532,19689,19511,19694,19547,19377,19366,19547,19502,19362,19484,19450,19714,19186,19461,19568,19655,19418,19728,19730,19366,19381,19544,19419,19554,19306,19324,19562,19543,19627,19530,19472,19678,19551,19546,19587,19652,19539,19444,19600,19561,19401,19371,19568,19459,19313,19329,19709,19430,19563,19370,19834,19399,19687,19685,19701,19415,19412,19542,19738,19694,19573,19549,19477,19631,19662,19257,19566,19733,19319,19396,19475,19324,19475,19334,19549,19743,19464,19812,19465,19598,19632,19723,19575,19441,19204,19208,19496,19489,19438,19549,19428,19767,19356,19429,19337,19367,19648,19396,19798,19396,19677,19450,19712,19360,19715,19490,19609,19393,19601,19461,19777,19472,19556,19428,19350,19451,19661,19530,19283,19513,19421,19723,19437,19608,19510,19700,19579,19335,19512,19275,19638,19439,19686,19417,19422,19565,19425,19535,19545,19718,19656,19638,19521,19359,19535,19671,19376,19488,19495,19625,19636,19553,19480,19456,19501,19547,19374,19567,19314,19426,19624,19656,19437,19508,19624,19756,19493,19523,19582,19495,19325,19513,19557,19496,19364,19501,19388,19474,19710,19481,19644,19594,19566,19633,19523,19511,19310,19497,19577,19562,19557,19541,19680,19706,19401,19662,19348,19473,19595,19453,19578,19501,19745,19457,19535,19683,19661,19744,19665,19510,19573,19646,19810,19543,19508,19459,19343,19393,19492,19832,19672,19756,19651,19359,19603,19451,19419,19446,19587,19661,19508,19531,19506,19571,19453,19666,19532,19390,19692,19510,19106,19497,19400,19399,19508,19537,19437,19657,19689,19372,19298,19455,19327,19545,19671,19536,19493,19722,19574,19612,19819,19545,19628,19463,19285,19317,19724,19440,19286,19313,19684,19553,19430,19614,19542,19614,19672,19480,19328,19674,19360,19776,19362,19526,19541,19713,19502,19784,19670,19566,19443,19438,19525,19777,19539,19699,19578,19448,19541,19521,19416,19497,19487,19420,19453,19633,19446,19815,19442,19427,19670,19536,19543,19463,19454,19590,19428,19412,19603,19545,19690,19553,19729,19811,19347,19887,19536,19514,19523,19367,19502,19475,19556,19538,19497,19421,19687,19683,19569,19559,19351,19451,19588,19589,19313,19684,19613,19426,19201,19514,19490,19507,19806,19592,19656,19645,19610,19562,19618,19673,19436,19302,19641,19528,19749,19702,19571,19338,19441,19505,19498,19459,19615,19595,19617,19880,19456,19551,19633,19566,19568,19376,19644,19707,19694,19525,19803,19443,19446,19430,19388,19789,19318,19446,19355,19585,19204,19616,19511,19597,19688,19600,19766,19200,19618,19335,19578,19262,19699,19766,19530,19799,19555,19459,19745,19460,19537,19628,19359,19741,19641,19732,19569,19600,19597,19392,19573,19744,19606,19169,19490,19581,19693,19390,19684,19420,19396,19891,19634,19394,19426,19478,19434,19612,19408,19464,19606,19638,19441,19680,19415,19555,19558,19432,19347,19395,19382,19500,19431,19415,19564,19651,19641,19546,19662,19493,19384,19503,19371,19672,19487,19478,19551,19502,19388,19559,19362,19636,19721,19629,19445,19490,19417,19654,19358,19666,19698,19588,19525,19598,19405,19492,19601,19661,19339,19612,19681,19766,19617,19280,19804,19379,19494,19755,19631,19637,19478,19367,19629,19720,19743,19295,19686,19348,19538,19593,19466,19412,19533,19501,19661,19618,19708,19606,19549,19254,19384,19435,19296,19587,19378,19387,19680,19482,19551,19652,19217,19675,19400,19546,19497,19600,19472,19401,19425,19607,19620,19583,19867,19642,19468,19582,19677,19488,19449,19460,19504,19588,19666,19584,19551,19568,19582,19671,19755,19530,19566,19719,19590,19380,19440,19497,19650,19363,19388,19587,19664,19393,19363,19451,19545,19613,19652,19309,19460,19456,19367,19453,19684,19740,19618,19416,19278,19607,19561,19400,19514,19443,19373,19474,19452,19407,19866,19397,19770,19503,19589,19588,19504,19681,19471,19588,19692,19504,19830,19608,19712,19420,19445,19674,19516,19224,19677,19667,19843,19542,19350,19431,19703,19380,19669,19936,19281,19948,19822,19671,19723,19516,19762,19617,19282,19644,19482,19754,19604,19290,19330,19908,19831,19629,19672,19356,19596,19683,19352,19800,19311,19576,19702,19338,19270,19633,19614,19619,19617,19521,19496,19402,19587,19438,19632,19347,19625,19514,19454,19533,19582,19784,19747,19602,19529,19469,19563,19578,19602,19448,19643,19562,19620,19559,19520,19553,19384,19628,19527,19209,19392,19636,19353,19796,19425,19661,19686,19238,19555,19401,19481,19574,19298,19815,19468,19531,19637,19819,19643,19438,19610,19510,19371,19517,19445,19629,19514,19449,19571,19291,19643,19536,19456,19428,19652,19351,19541,19626,19706,19639,19378,19338,19629,19562,19557,19617,19404,19841,19458,19630,19455,19559,19492,19596,19232,19579,19602,19369,19620,19451,19517,19819,19418,19498,19442,19478,19376,19303,19621,19867,19722,19530,19411,19510,19876,19724,19482,19409,19603,19583,19446,19572,19480,19690,19720,19557,19494,19456,19607,19368,19410,19514,19590,19849,19776,19330,19350,19460,19482,19467,19288,19520,19472,19569,19647,19490,19557,19508,19634,19499,19589,19399,19310,19546,19782,19581,19596,19570,19669,19474,19570,19444,19339,19670,19726,19479,19685,19215,19701,19313,19661,19564,20151,19576,19449,19600,19660,19483,19739,19873,19560,19531,19603,19730,19366,19456,19542,19554,19390,19355,19672,19517,19708,19549,19362,19562,19440,19528,19747,19154,19661,19409,19431,19394,19545,19508,19552,19465,19627,19525,19571,19545,19416,19542,19650,19536,19420,19523,19503,19396,19559,19451,19685,19614,19373,19395,19581,19527,19735,19440,19597,19365,19339,19272,19407,19554,19752,19664,19645,19481,19553,19541,19316,19518,19693,19588,19162,19855,19747,19674,19517,19386,19321,19407,19181,19515,19526,19270,19215,19528,19408,19638,19355,19387,19583,19454,19778,19517,19390,19158,19348,19500,19138,19765,19686,19636,19386,19604,19246,19562,19354,19815,19408,19351,19405,19559,19586,19377,19386,19645,19468,19608,19375,19520,19312,19804,19746,19717,19366,19494,19363,19390,19469,19415,19548,19339,19574,19776,19507,19680,19626,19394,19406,19464,19503,19532,19572,19645,19497,19374]}]},"null_count":0,"tot_col_size":5055908201,"last_update_version":401695328201605121},"ps_partkey":{"histogram":{"ndv":9943040,"buckets":[{"count":160000,"lower_bound":"MTQ=","upper_bound":"MTM0MA==","repeats":4},{"count":320000,"lower_bound":"MTM0OA==","upper_bound":"MTkxMTc=","repeats":4},{"count":480000,"lower_bound":"MTkyMjQ=","upper_bound":"NDE0Mjk=","repeats":4},{"count":640000,"lower_bound":"NDQyMzQ=","upper_bound":"Nzg1NjI=","repeats":4},{"count":800000,"lower_bound":"ODA1MTU=","upper_bound":"MTE0NDU5","repeats":4},{"count":960000,"lower_bound":"MTE1Mjk0","upper_bound":"MTU2MDM1","repeats":4},{"count":1120000,"lower_bound":"MTU2ODc5","upper_bound":"MTk3NTA3","repeats":4},{"count":1280000,"lower_bound":"MTk5MDE4","upper_bound":"MjM1NTY4","repeats":4},{"count":1440000,"lower_bound":"MjM4MDc3","upper_bound":"MjgyMTIx","repeats":4},{"count":1600000,"lower_bound":"MjgzNzA0","upper_bound":"MzMxMDM3","repeats":4},{"count":1760000,"lower_bound":"MzMxMTY1","upper_bound":"Mzg0MTE4","repeats":4},{"count":1920000,"lower_bound":"Mzg2MTcw","upper_bound":"NDE1MTY1","repeats":4},{"count":2080000,"lower_bound":"NDE2MTQ0","upper_bound":"NDY1NTMz","repeats":4},{"count":2240000,"lower_bound":"NDY5MjA2","upper_bound":"NTAwNDM5","repeats":4},{"count":2400000,"lower_bound":"NTAwNDQ0","upper_bound":"NTAzOTg0","repeats":4},{"count":2560000,"lower_bound":"NTA0MTQ2","upper_bound":"NTMxNTg2","repeats":4},{"count":2720000,"lower_bound":"NTMyMjY5","upper_bound":"NTc1MDcx","repeats":4},{"count":2880000,"lower_bound":"NTc1MDc1","upper_bound":"NjE5ODkw","repeats":4},{"count":3040000,"lower_bound":"NjIwMjEx","upper_bound":"NjYwODEw","repeats":4},{"count":3200000,"lower_bound":"NjY0MjMy","upper_bound":"NzAyMTEx","repeats":4},{"count":3360000,"lower_bound":"NzA1NTU3","upper_bound":"NzM4OTc4","repeats":4},{"count":3520000,"lower_bound":"NzM5NDgx","upper_bound":"Nzc2Mzcx","repeats":4},{"count":3680000,"lower_bound":"Nzc2Nzk3","upper_bound":"ODExMzcw","repeats":4},{"count":3840000,"lower_bound":"ODEzNjE4","upper_bound":"ODQ3MjIx","repeats":4},{"count":4000000,"lower_bound":"ODQ5MDEx","upper_bound":"ODgwNzIz","repeats":4},{"count":4160000,"lower_bound":"ODg1MjYx","upper_bound":"OTIwMDY2","repeats":4},{"count":4320000,"lower_bound":"OTIyMDg1","upper_bound":"OTU2MTU5","repeats":4},{"count":4480000,"lower_bound":"OTU2OTI1","upper_bound":"OTkyNTE0","repeats":4},{"count":4640000,"lower_bound":"OTk1Mjk3","upper_bound":"MTAzNjQ4OQ==","repeats":4},{"count":4800000,"lower_bound":"MTAzNjU2Ng==","upper_bound":"MTA1NzkxMg==","repeats":4},{"count":4960000,"lower_bound":"MTA1OTQ5MA==","upper_bound":"MTEwMDI2Ng==","repeats":4},{"count":5120000,"lower_bound":"MTEwMDk4OQ==","upper_bound":"MTEzNTIxMg==","repeats":4},{"count":5280000,"lower_bound":"MTEzNTY0OQ==","upper_bound":"MTE3MzU4NQ==","repeats":4},{"count":5440000,"lower_bound":"MTE3NDA2Mg==","upper_bound":"MTIxNTMzNg==","repeats":4},{"count":5600000,"lower_bound":"MTIxODg2MQ==","upper_bound":"MTI1MzQ2OA==","repeats":4},{"count":5760000,"lower_bound":"MTI1NDEwOA==","upper_bound":"MTI5NTM2MQ==","repeats":4},{"count":5920000,"lower_bound":"MTI5NTM5Mw==","upper_bound":"MTM0Mzg3NA==","repeats":4},{"count":6080000,"lower_bound":"MTM0NDIwMg==","upper_bound":"MTM4MjU5Mw==","repeats":4},{"count":6240000,"lower_bound":"MTM4Mjk1MA==","upper_bound":"MTQzMzA0Mg==","repeats":4},{"count":6400000,"lower_bound":"MTQzNDA4Ng==","upper_bound":"MTQ4MTI3NQ==","repeats":4},{"count":6560000,"lower_bound":"MTQ4MTM1NQ==","upper_bound":"MTUyNzEwOQ==","repeats":4},{"count":6720000,"lower_bound":"MTUyNzY3Nw==","upper_bound":"MTU3MjE1MQ==","repeats":4},{"count":6880000,"lower_bound":"MTU3MjU5MA==","upper_bound":"MTYxNjA5Mw==","repeats":4},{"count":7040000,"lower_bound":"MTYxNjQ5MQ==","upper_bound":"MTY3OTY0MQ==","repeats":4},{"count":7200000,"lower_bound":"MTY3OTY1Mg==","upper_bound":"MTcyMzE4Ng==","repeats":4},{"count":7360000,"lower_bound":"MTcyNDEzNg==","upper_bound":"MTc2MDY4Mw==","repeats":4},{"count":7520000,"lower_bound":"MTc2MDc2Mw==","upper_bound":"MTgwMDI1Nw==","repeats":4},{"count":7680000,"lower_bound":"MTgwMDQzMA==","upper_bound":"MTgzNzA5Mg==","repeats":4},{"count":7840000,"lower_bound":"MTgzOTAxMQ==","upper_bound":"MTg3MjA4Nw==","repeats":4},{"count":8000000,"lower_bound":"MTg3MjExOQ==","upper_bound":"MTkxNTU1MA==","repeats":4},{"count":8160000,"lower_bound":"MTkxNjc3Ng==","upper_bound":"MTk2ODAxOA==","repeats":4},{"count":8320000,"lower_bound":"MTk2ODY1MA==","upper_bound":"MjAxMjI0MQ==","repeats":4},{"count":8480000,"lower_bound":"MjAxMzA5NQ==","upper_bound":"MjAzOTM1Nw==","repeats":4},{"count":8640000,"lower_bound":"MjA0MDA4Mg==","upper_bound":"MjA4NDgwNA==","repeats":4},{"count":8800000,"lower_bound":"MjA4NTAxMw==","upper_bound":"MjEyMjMzMw==","repeats":4},{"count":8960000,"lower_bound":"MjEyMjM0NQ==","upper_bound":"MjE2MzMzOQ==","repeats":4},{"count":9120000,"lower_bound":"MjE2NDAyMA==","upper_bound":"MjIwMTE4Ng==","repeats":4},{"count":9280000,"lower_bound":"MjIwMTI2Ng==","upper_bound":"MjIzNjM3NQ==","repeats":4},{"count":9440000,"lower_bound":"MjIzNzE3OA==","upper_bound":"MjI3NzMzMg==","repeats":4},{"count":9600000,"lower_bound":"MjI3ODAwMg==","upper_bound":"MjMwODYyNA==","repeats":4},{"count":9760000,"lower_bound":"MjMwOTE3Ng==","upper_bound":"MjM0NzEyMA==","repeats":4},{"count":9920000,"lower_bound":"MjM0ODIzNQ==","upper_bound":"MjM3OTg5Ng==","repeats":4},{"count":10080000,"lower_bound":"MjM4MDEwNA==","upper_bound":"MjQxNjUzMg==","repeats":4},{"count":10240000,"lower_bound":"MjQxOTI5NA==","upper_bound":"MjQ1NjgzNA==","repeats":4},{"count":10400000,"lower_bound":"MjQ1NzM4NA==","upper_bound":"MjQ5OTAwOA==","repeats":4},{"count":10560000,"lower_bound":"MjUwMTQxNg==","upper_bound":"MjUzOTE3MA==","repeats":4},{"count":10720000,"lower_bound":"MjU0MDYzMA==","upper_bound":"MjU2ODc2Mw==","repeats":4},{"count":10880000,"lower_bound":"MjU2OTA1Nw==","upper_bound":"MjYxMDQyOA==","repeats":4},{"count":11040000,"lower_bound":"MjYxMTgzNA==","upper_bound":"MjY1NjczNw==","repeats":4},{"count":11200000,"lower_bound":"MjY1NzQxNA==","upper_bound":"MjY5Nzg0Mw==","repeats":4},{"count":11360000,"lower_bound":"MjY5OTUxOQ==","upper_bound":"Mjc1NTAxMw==","repeats":4},{"count":11520000,"lower_bound":"Mjc1OTA1Nw==","upper_bound":"MjgwODM5Mg==","repeats":4},{"count":11680000,"lower_bound":"MjgwODgwOQ==","upper_bound":"Mjg0NjUxNg==","repeats":4},{"count":11840000,"lower_bound":"Mjg0NzAxNg==","upper_bound":"Mjg4OTIyNg==","repeats":4},{"count":12000000,"lower_bound":"Mjg5MzgxNg==","upper_bound":"MjkzMzI1OA==","repeats":4},{"count":12160000,"lower_bound":"MjkzNDg0OQ==","upper_bound":"Mjk2ODk5MQ==","repeats":4},{"count":12320000,"lower_bound":"Mjk2OTAyMA==","upper_bound":"MzAwNjI0MQ==","repeats":4},{"count":12480000,"lower_bound":"MzAwNzA5NQ==","upper_bound":"MzA0NDc3Mg==","repeats":4},{"count":12640000,"lower_bound":"MzA0NTA0MA==","upper_bound":"MzA3NTkyNg==","repeats":4},{"count":12800000,"lower_bound":"MzA3Nzc1MA==","upper_bound":"MzExNTg4Mw==","repeats":4},{"count":12960000,"lower_bound":"MzExNjQ1Nw==","upper_bound":"MzE0ODM2NQ==","repeats":4},{"count":13120000,"lower_bound":"MzE0OTAzNw==","upper_bound":"MzE4OTQ1Mw==","repeats":4},{"count":13280000,"lower_bound":"MzE5MDkwNw==","upper_bound":"MzIzMDA0MA==","repeats":4},{"count":13440000,"lower_bound":"MzIzMDA4Ng==","upper_bound":"MzI2ODE4Ng==","repeats":4},{"count":13600000,"lower_bound":"MzI2OTE5Mg==","upper_bound":"MzMwMzQ2Mw==","repeats":4},{"count":13760000,"lower_bound":"MzMwNjEwNg==","upper_bound":"MzM0Njc1Mg==","repeats":4},{"count":13920000,"lower_bound":"MzM0Njc3NQ==","upper_bound":"MzM5NDExMA==","repeats":4},{"count":14080000,"lower_bound":"MzM5NDgwNQ==","upper_bound":"MzQyMzEwNA==","repeats":4},{"count":14240000,"lower_bound":"MzQyMzU0Mw==","upper_bound":"MzQ2MDk2Nw==","repeats":4},{"count":14400000,"lower_bound":"MzQ2MzI1Nw==","upper_bound":"MzQ5NTQxOA==","repeats":4},{"count":14560000,"lower_bound":"MzQ5NjMxMg==","upper_bound":"MzUzMTY0MQ==","repeats":4},{"count":14720000,"lower_bound":"MzUzMjAzMg==","upper_bound":"MzU3MjAxNQ==","repeats":4},{"count":14880000,"lower_bound":"MzU3MzIxMA==","upper_bound":"MzYzMDIyMA==","repeats":4},{"count":15040000,"lower_bound":"MzYzMjU5MA==","upper_bound":"MzY3Njk2OA==","repeats":4},{"count":15200000,"lower_bound":"MzY3Nzc1Mg==","upper_bound":"MzcyMzczMw==","repeats":4},{"count":15360000,"lower_bound":"MzcyMzg3NA==","upper_bound":"Mzc2MTI0Nw==","repeats":4},{"count":15520000,"lower_bound":"Mzc2MTQ4OA==","upper_bound":"Mzc5Njk4MQ==","repeats":4},{"count":15680000,"lower_bound":"Mzc5OTE1Mw==","upper_bound":"MzgyOTQ4Mw==","repeats":4},{"count":15840000,"lower_bound":"MzgzMTIxMQ==","upper_bound":"Mzg3NTA3OA==","repeats":4},{"count":16000000,"lower_bound":"Mzg3NjAwNA==","upper_bound":"MzkxOTY0NQ==","repeats":4},{"count":16160000,"lower_bound":"MzkyMTY3OA==","upper_bound":"Mzk2MTE5Ng==","repeats":4},{"count":16320000,"lower_bound":"Mzk2MTM2Ng==","upper_bound":"Mzk5OTI1NQ==","repeats":4},{"count":16480000,"lower_bound":"NDAwMTM4OA==","upper_bound":"NDAzODUxNw==","repeats":4},{"count":16640000,"lower_bound":"NDAzODk4Mg==","upper_bound":"NDA5MTIyOA==","repeats":4},{"count":16800000,"lower_bound":"NDA5MzA4MQ==","upper_bound":"NDEzMjQ2Mw==","repeats":4},{"count":16960000,"lower_bound":"NDEzMjg4MQ==","upper_bound":"NDE4MDU0MA==","repeats":4},{"count":17120000,"lower_bound":"NDE4MDc2NA==","upper_bound":"NDIyMzQyMw==","repeats":4},{"count":17280000,"lower_bound":"NDIyNDA4MA==","upper_bound":"NDI2MzgyMA==","repeats":4},{"count":17440000,"lower_bound":"NDI2MzkwMw==","upper_bound":"NDI5OTcwNA==","repeats":4},{"count":17600000,"lower_bound":"NDMwMDk0NQ==","upper_bound":"NDM0NDYyMw==","repeats":4},{"count":17760000,"lower_bound":"NDM0NDg3OQ==","upper_bound":"NDM4NjUzNA==","repeats":4},{"count":17920000,"lower_bound":"NDM4NzIyNA==","upper_bound":"NDQyNDM2Mw==","repeats":4},{"count":18080000,"lower_bound":"NDQyNDQ0MA==","upper_bound":"NDQ2NTM0Nw==","repeats":4},{"count":18240000,"lower_bound":"NDQ2NTYxMA==","upper_bound":"NDUwOTIyNg==","repeats":4},{"count":18400000,"lower_bound":"NDUwOTYwNg==","upper_bound":"NDU1MTM0Ng==","repeats":4},{"count":18560000,"lower_bound":"NDU1MTc4NA==","upper_bound":"NDU5MzA0Mw==","repeats":4},{"count":18720000,"lower_bound":"NDU5NDQ1MA==","upper_bound":"NDY0NTIwMA==","repeats":4},{"count":18880000,"lower_bound":"NDY0NTgwMQ==","upper_bound":"NDY5MDg1Mw==","repeats":4},{"count":19040000,"lower_bound":"NDY5MzkyNg==","upper_bound":"NDczMTc5MQ==","repeats":4},{"count":19200000,"lower_bound":"NDczMjA0OA==","upper_bound":"NDc3NDcwNw==","repeats":4},{"count":19360000,"lower_bound":"NDc3NjA5Mg==","upper_bound":"NDgxMzAxMw==","repeats":4},{"count":19520000,"lower_bound":"NDgxMzYyNQ==","upper_bound":"NDg0NjM2NA==","repeats":4},{"count":19680000,"lower_bound":"NDg0Nzg0Mg==","upper_bound":"NDg4OTk3MQ==","repeats":4},{"count":19840000,"lower_bound":"NDg5MTA0OA==","upper_bound":"NDkyNDcwOA==","repeats":4},{"count":20000000,"lower_bound":"NDkyNTA2OQ==","upper_bound":"NDk2OTc3Mg==","repeats":4},{"count":20160000,"lower_bound":"NDk2OTg4MA==","upper_bound":"NTAwNjYzNw==","repeats":4},{"count":20320000,"lower_bound":"NTAwNzUxNQ==","upper_bound":"NTA0NDQ5MQ==","repeats":4},{"count":20480000,"lower_bound":"NTA0NTE0Mg==","upper_bound":"NTA3NDA2NA==","repeats":4},{"count":20640000,"lower_bound":"NTA3NDQ3NA==","upper_bound":"NTExMDQ3Nw==","repeats":4},{"count":20800000,"lower_bound":"NTExMDgyNQ==","upper_bound":"NTE1MjUyNw==","repeats":4},{"count":20960000,"lower_bound":"NTE1NTUxNA==","upper_bound":"NTE4OTEzOQ==","repeats":4},{"count":21120000,"lower_bound":"NTE5MDE5OA==","upper_bound":"NTIyMjY4Nw==","repeats":4},{"count":21280000,"lower_bound":"NTIyMzQzNA==","upper_bound":"NTI2NDQ0Nw==","repeats":4},{"count":21440000,"lower_bound":"NTI2NDU5NQ==","upper_bound":"NTMwNjM3OQ==","repeats":4},{"count":21600000,"lower_bound":"NTMwNzE2Ng==","upper_bound":"NTM1MzU1OA==","repeats":4},{"count":21760000,"lower_bound":"NTM1NDUyOQ==","upper_bound":"NTM5ODYwNw==","repeats":4},{"count":21920000,"lower_bound":"NTM5OTM4NQ==","upper_bound":"NTQzNTQ5NQ==","repeats":4},{"count":22080000,"lower_bound":"NTQzNjIxOA==","upper_bound":"NTQ4MDM3OQ==","repeats":4},{"count":22240000,"lower_bound":"NTQ4MTE1MA==","upper_bound":"NTUxMjg3OQ==","repeats":4},{"count":22400000,"lower_bound":"NTUxMzExOQ==","upper_bound":"NTU0OTYxMg==","repeats":4},{"count":22560000,"lower_bound":"NTU1MDAyNQ==","upper_bound":"NTU4NjQxMQ==","repeats":4},{"count":22720000,"lower_bound":"NTU4NjQ4Mw==","upper_bound":"NTYyNzk2NA==","repeats":4},{"count":22880000,"lower_bound":"NTYyODEyMQ==","upper_bound":"NTY3NzQxOA==","repeats":4},{"count":23040000,"lower_bound":"NTY3NzQ3MQ==","upper_bound":"NTcwODIxMg==","repeats":4},{"count":23200000,"lower_bound":"NTcwODg5MA==","upper_bound":"NTc0NDY4Mg==","repeats":4},{"count":23360000,"lower_bound":"NTc0NTE3Nw==","upper_bound":"NTc4MjkyOA==","repeats":4},{"count":23520000,"lower_bound":"NTc4MzU5Mg==","upper_bound":"NTgxNTkzNw==","repeats":4},{"count":23680000,"lower_bound":"NTgxNjg1NQ==","upper_bound":"NTg1ODExMg==","repeats":4},{"count":23840000,"lower_bound":"NTg1ODY4NQ==","upper_bound":"NTkwMjk2OQ==","repeats":4},{"count":24000000,"lower_bound":"NTkwMzgwMg==","upper_bound":"NTk0MDY0Mw==","repeats":4},{"count":24160000,"lower_bound":"NTk0MzAwMg==","upper_bound":"NTk3Mzk4MQ==","repeats":4},{"count":24320000,"lower_bound":"NTk3NDYzOA==","upper_bound":"NjAxNDExMw==","repeats":4},{"count":24480000,"lower_bound":"NjAxNDQ3OA==","upper_bound":"NjA2NTQyNw==","repeats":4},{"count":24640000,"lower_bound":"NjA2NTU5NQ==","upper_bound":"NjEwNzc4MQ==","repeats":4},{"count":24800000,"lower_bound":"NjEwODE1Nw==","upper_bound":"NjEzODQ4OQ==","repeats":4},{"count":24960000,"lower_bound":"NjEzOTYzMw==","upper_bound":"NjE3MTYxMQ==","repeats":4},{"count":25120000,"lower_bound":"NjE3MTY5NQ==","upper_bound":"NjIwNjE0Nw==","repeats":4},{"count":25280000,"lower_bound":"NjIwNjYyMA==","upper_bound":"NjI0NzgyNw==","repeats":4},{"count":25440000,"lower_bound":"NjI0ODg1Ng==","upper_bound":"NjI4NzQzMQ==","repeats":4},{"count":25600000,"lower_bound":"NjI4NzQ2OA==","upper_bound":"NjMyOTE5Mg==","repeats":4},{"count":25760000,"lower_bound":"NjMyOTM4Ng==","upper_bound":"NjM2OTMxOA==","repeats":4},{"count":25920000,"lower_bound":"NjM3MDI2Mw==","upper_bound":"NjQyNjM5NQ==","repeats":4},{"count":26080000,"lower_bound":"NjQyNjc0NQ==","upper_bound":"NjQ2MjgzMw==","repeats":4},{"count":26240000,"lower_bound":"NjQ2MjkwNA==","upper_bound":"NjUxMDg5Nw==","repeats":4},{"count":26400000,"lower_bound":"NjUxMjA4Mw==","upper_bound":"NjU0NTUxMg==","repeats":4},{"count":26560000,"lower_bound":"NjU0NjQ1Ng==","upper_bound":"NjU4NjM1MA==","repeats":4},{"count":26720000,"lower_bound":"NjU4Nzk5NA==","upper_bound":"NjYyOTUwNg==","repeats":4},{"count":26880000,"lower_bound":"NjYzMDkxMA==","upper_bound":"NjY3MzgxNw==","repeats":4},{"count":27040000,"lower_bound":"NjY3NDE5NQ==","upper_bound":"NjcwNjM0Nw==","repeats":4},{"count":27200000,"lower_bound":"NjcwNzc3Mw==","upper_bound":"Njc0NTg3MQ==","repeats":4},{"count":27360000,"lower_bound":"Njc0NTk4NA==","upper_bound":"Njc4MTExMg==","repeats":4},{"count":27520000,"lower_bound":"Njc4MTIzMg==","upper_bound":"NjgyMTU0Mg==","repeats":4},{"count":27680000,"lower_bound":"NjgyMjExOQ==","upper_bound":"Njg2OTY5Mg==","repeats":4},{"count":27840000,"lower_bound":"Njg2OTgzMA==","upper_bound":"NjkwNzI2NA==","repeats":4},{"count":28000000,"lower_bound":"NjkwNzc2OQ==","upper_bound":"NjkzOTkzMg==","repeats":4},{"count":28160000,"lower_bound":"Njk0MDM1Ng==","upper_bound":"Njk4OTg0Mg==","repeats":4},{"count":28320000,"lower_bound":"Njk4OTg0Mw==","upper_bound":"NzAzMDk0OQ==","repeats":4},{"count":28480000,"lower_bound":"NzAzMjcyNQ==","upper_bound":"NzA4MDg5MQ==","repeats":4},{"count":28640000,"lower_bound":"NzA4MzAxMg==","upper_bound":"NzEyOTgzOQ==","repeats":4},{"count":28800000,"lower_bound":"NzEzNDE0MQ==","upper_bound":"NzE2Njk3OQ==","repeats":4},{"count":28960000,"lower_bound":"NzE2NzE1NA==","upper_bound":"NzIwNTMwNg==","repeats":4},{"count":29120000,"lower_bound":"NzIwNTgzMg==","upper_bound":"NzI1NjQ1NA==","repeats":4},{"count":29280000,"lower_bound":"NzI1NjU4MA==","upper_bound":"NzI5MDA0Mw==","repeats":4},{"count":29440000,"lower_bound":"NzI5MjgxNg==","upper_bound":"NzM0MzQzMg==","repeats":4},{"count":29600000,"lower_bound":"NzM0NDEyOA==","upper_bound":"NzM4MTgwMA==","repeats":4},{"count":29760000,"lower_bound":"NzM4MTgzNg==","upper_bound":"NzQyNjI1OQ==","repeats":4},{"count":29920000,"lower_bound":"NzQyNjcxNg==","upper_bound":"NzQ2NjczNg==","repeats":4},{"count":30080000,"lower_bound":"NzQ2Njk2Nw==","upper_bound":"NzUxMjE4OQ==","repeats":4},{"count":30240000,"lower_bound":"NzUxMjY3NA==","upper_bound":"NzU1NjkzMA==","repeats":4},{"count":30400000,"lower_bound":"NzU2MDUyOA==","upper_bound":"NzYwMTY4NA==","repeats":4},{"count":30560000,"lower_bound":"NzYwMTY5MA==","upper_bound":"NzY0ODk3NQ==","repeats":4},{"count":30720000,"lower_bound":"NzY0OTQ3Mg==","upper_bound":"NzY5NDAwOA==","repeats":4},{"count":30880000,"lower_bound":"NzY5NDU1MQ==","upper_bound":"Nzc0MzI0NQ==","repeats":4},{"count":31040000,"lower_bound":"Nzc0NDA4Ng==","upper_bound":"Nzc4MzQ5Mg==","repeats":4},{"count":31200000,"lower_bound":"Nzc4MzkwOA==","upper_bound":"NzgxNzcwNQ==","repeats":4},{"count":31360000,"lower_bound":"NzgxOTgyMg==","upper_bound":"Nzg1ODY5MA==","repeats":4},{"count":31520000,"lower_bound":"Nzg1ODkyOA==","upper_bound":"Nzg5MzcxNA==","repeats":4},{"count":31680000,"lower_bound":"Nzg5NTM3Mg==","upper_bound":"NzkyMzA1MA==","repeats":4},{"count":31840000,"lower_bound":"NzkyMzI5OA==","upper_bound":"Nzk2MTEyMA==","repeats":4},{"count":32000000,"lower_bound":"Nzk2MjMwOA==","upper_bound":"Nzk5OTAzNg==","repeats":4},{"count":32160000,"lower_bound":"Nzk5OTM3Mg==","upper_bound":"ODAzOTQ1Mg==","repeats":4},{"count":32320000,"lower_bound":"ODAzOTk1MA==","upper_bound":"ODA4NTcyNg==","repeats":4},{"count":32480000,"lower_bound":"ODA4ODQ5Mw==","upper_bound":"ODEyNTI0Mg==","repeats":4},{"count":32640000,"lower_bound":"ODEyNTQ3Ng==","upper_bound":"ODE1Mjc5Ng==","repeats":4},{"count":32800000,"lower_bound":"ODE1NjA3Nw==","upper_bound":"ODE5NjgxNw==","repeats":4},{"count":32960000,"lower_bound":"ODE5Njk1Mw==","upper_bound":"ODIzNDE0NA==","repeats":4},{"count":33120000,"lower_bound":"ODIzOTEzMQ==","upper_bound":"ODI4NTA3MQ==","repeats":4},{"count":33280000,"lower_bound":"ODI4Nzc4Ng==","upper_bound":"ODMyNDgxNw==","repeats":4},{"count":33440000,"lower_bound":"ODMyNDg0Ng==","upper_bound":"ODM3NDk5NQ==","repeats":4},{"count":33600000,"lower_bound":"ODM3NjM3Mg==","upper_bound":"ODQwNjE1NQ==","repeats":4},{"count":33760000,"lower_bound":"ODQwNzM2NA==","upper_bound":"ODQ1MDEzMg==","repeats":4},{"count":33920000,"lower_bound":"ODQ1MDM1NA==","upper_bound":"ODQ5NDQyMg==","repeats":4},{"count":34080000,"lower_bound":"ODQ5NTEzNQ==","upper_bound":"ODUyOTI0Mg==","repeats":4},{"count":34240000,"lower_bound":"ODUyOTkxMw==","upper_bound":"ODU2ODQ5NA==","repeats":4},{"count":34400000,"lower_bound":"ODU2ODU5Ng==","upper_bound":"ODYxNDM5NQ==","repeats":4},{"count":34560000,"lower_bound":"ODYxNTcyNA==","upper_bound":"ODY1MTcyMQ==","repeats":4},{"count":34720000,"lower_bound":"ODY1MjY2OQ==","upper_bound":"ODcwNDc1MA==","repeats":4},{"count":34880000,"lower_bound":"ODcwNDc5Mw==","upper_bound":"ODc0NDk3Mw==","repeats":4},{"count":35040000,"lower_bound":"ODc0NTUwOA==","upper_bound":"ODc5MDE5Mg==","repeats":4},{"count":35200000,"lower_bound":"ODc5MTY3OQ==","upper_bound":"ODgzNjk4Mg==","repeats":4},{"count":35360000,"lower_bound":"ODgzNzUxMQ==","upper_bound":"ODg4NjA2Mw==","repeats":4},{"count":35520000,"lower_bound":"ODg4NzAxMQ==","upper_bound":"ODkxNzU3OQ==","repeats":4},{"count":35680000,"lower_bound":"ODkxNzY2NA==","upper_bound":"ODk2NDY3Mw==","repeats":4},{"count":35840000,"lower_bound":"ODk2NDg2Mg==","upper_bound":"ODk5MTQzMw==","repeats":4},{"count":36000000,"lower_bound":"ODk5MzM3Ng==","upper_bound":"OTAyNzE4Mw==","repeats":4},{"count":36160000,"lower_bound":"OTAyNzQyOQ==","upper_bound":"OTA2Mzk5Mg==","repeats":4},{"count":36320000,"lower_bound":"OTA2NTI4Nw==","upper_bound":"OTEwMDE3OA==","repeats":4},{"count":36480000,"lower_bound":"OTEwMzIwMA==","upper_bound":"OTEzMzE3NQ==","repeats":4},{"count":36640000,"lower_bound":"OTEzNDE5NA==","upper_bound":"OTE3NTkxNQ==","repeats":4},{"count":36800000,"lower_bound":"OTE3NzAxMg==","upper_bound":"OTIzMTI5Nw==","repeats":4},{"count":36960000,"lower_bound":"OTIzMTc3Mg==","upper_bound":"OTI3MDg5NA==","repeats":4},{"count":37120000,"lower_bound":"OTI3MTEwMA==","upper_bound":"OTMxMzY3NQ==","repeats":4},{"count":37280000,"lower_bound":"OTMxNTIyNQ==","upper_bound":"OTM2NTQ4OQ==","repeats":4},{"count":37440000,"lower_bound":"OTM2NjgzNw==","upper_bound":"OTQxMTM3NA==","repeats":4},{"count":37600000,"lower_bound":"OTQxMTQxOQ==","upper_bound":"OTQ0MDYzMQ==","repeats":4},{"count":37760000,"lower_bound":"OTQ0MTA0NA==","upper_bound":"OTQ3NzE0OA==","repeats":4},{"count":37920000,"lower_bound":"OTQ3NzUyNQ==","upper_bound":"OTUwNjg5NA==","repeats":4},{"count":38080000,"lower_bound":"OTUwNzA3NA==","upper_bound":"OTU0MDU3MQ==","repeats":4},{"count":38240000,"lower_bound":"OTU0MjMxMg==","upper_bound":"OTU4NTAyMQ==","repeats":4},{"count":38400000,"lower_bound":"OTU4ODc4NQ==","upper_bound":"OTYyMjU3Nw==","repeats":4},{"count":38560000,"lower_bound":"OTYyMjgzNA==","upper_bound":"OTY2ODgyNQ==","repeats":4},{"count":38720000,"lower_bound":"OTY2OTQwMg==","upper_bound":"OTcwNTI3OA==","repeats":4},{"count":38880000,"lower_bound":"OTcwNTY3NA==","upper_bound":"OTc0Mjk4MQ==","repeats":4},{"count":39040000,"lower_bound":"OTc0MzI1Ng==","upper_bound":"OTc4NDI0NA==","repeats":4},{"count":39200000,"lower_bound":"OTc4NDQ2NA==","upper_bound":"OTgyMjQ0NA==","repeats":4},{"count":39360000,"lower_bound":"OTgyMzQ1Mg==","upper_bound":"OTg2MTMyNw==","repeats":4},{"count":39520000,"lower_bound":"OTg2MjEzNw==","upper_bound":"OTkwMTQxNA==","repeats":4},{"count":39680000,"lower_bound":"OTkwMjQ1MA==","upper_bound":"OTkzNTgyMw==","repeats":4},{"count":39840000,"lower_bound":"OTkzNjg2OQ==","upper_bound":"OTk3NDgzOQ==","repeats":4},{"count":40000000,"lower_bound":"OTk3NTA0Mw==","upper_bound":"OTk5OTU4Ng==","repeats":4}]},"cm_sketch":{"rows":[{"counters":[19240,19320,19904,19492,19576,19600,19744,20024,19612,19856,19692,19356,19868,19272,19040,19728,19420,19176,19844,19016,19952,19728,19564,19772,19800,19244,19996,19312,19572,19888,19372,19484,19344,19548,19668,19512,19204,19780,19620,19824,19916,19080,19648,19360,19372,19228,19636,19132,18956,19816,19564,18996,19468,19692,19088,18568,19824,19304,19432,19264,19540,19436,19440,19184,19432,19800,19644,19576,19448,19352,19184,19272,19448,20276,19632,19840,19400,19588,19552,19564,19508,19500,20260,19808,19980,19784,19360,19516,19564,20040,19488,19008,19640,19952,19800,19240,19496,19156,19868,19800,19500,19760,19768,19160,19596,19656,19944,19720,19384,19644,19200,19652,19768,19272,19636,19864,19552,19988,19716,19924,19292,19128,19580,19576,19680,19812,19956,19304,19312,19756,19624,19808,19216,19364,19636,19792,19908,19620,19816,19304,19460,19680,19488,19732,19384,19280,19144,19992,19560,19612,19472,19860,19532,19172,19780,19420,19672,20512,19468,19820,19660,19892,19060,19380,19308,19436,19944,18916,19904,19564,19744,19348,19660,19296,19928,19516,19780,19756,19764,19572,19316,19344,19720,19624,19012,19368,19500,19352,19456,19424,20156,19852,19852,19428,19500,19372,19580,18960,19272,19156,19616,19632,19484,20092,19348,20164,19592,19464,19600,19440,19000,19696,19788,20160,19288,19720,19044,19288,19212,19280,19712,19924,19688,19532,19608,20132,19296,19388,19840,19840,20196,19616,19440,19644,19468,18904,19700,19396,19388,19572,19912,19428,19196,19832,19600,19636,19392,20024,19088,19400,19260,20072,19808,19108,20072,18888,19672,19784,19556,19564,19556,19832,19168,19232,19540,19416,19572,19260,19720,19820,19400,19508,19500,19536,19468,19768,19616,19668,19600,19212,19768,20296,19064,19324,19588,19516,19280,19304,19548,19600,19536,19076,19132,19380,19084,19596,19644,19588,19736,19232,19088,19336,19364,19676,20116,19136,19960,19672,19844,19740,19428,18928,19016,20040,19432,19064,19432,19472,19516,19264,19620,19496,19008,19540,19420,19076,19428,19396,19680,19768,19392,19316,19464,19232,19280,19340,19236,19116,19116,19716,19308,19424,19428,19624,19732,19820,19524,19536,19392,19416,19872,19604,19224,19980,19208,19756,19896,19756,20352,19960,19456,19500,19552,19268,19264,19484,19608,19924,19276,19692,19528,19392,19616,19060,19624,19528,19112,19884,19440,20108,19564,19156,19560,19856,19900,19340,19172,20048,19064,19636,19472,18740,19288,19516,19208,19344,19852,19208,18964,19304,19516,19020,19428,19464,19448,19652,19056,19348,19468,18844,19504,19184,19532,19516,19208,19228,19716,19448,19620,20196,19400,19184,19296,19628,19620,19916,19504,19248,19708,19632,19556,19836,19504,19696,19708,19268,19088,20380,19432,19440,19788,19396,19468,19552,19108,20272,19676,19520,19584,19688,19272,19344,19212,19900,19096,19340,19752,19956,19280,19388,19600,19856,19884,19292,19332,19464,19780,19428,19936,19576,19132,19696,19544,19860,19448,19336,19412,19696,19396,19372,19524,19388,19476,19464,19596,19212,19276,20168,19600,19412,19484,19712,19728,20056,19784,19424,19616,19804,19792,19000,19416,19184,20344,20160,19744,19388,19780,18884,19232,19096,19488,19372,19088,19552,19184,19760,19660,19116,19592,19520,19480,20164,19088,19468,19812,20168,19520,19524,19916,19488,19580,19140,19820,19112,19736,19352,19144,19296,19136,19188,19244,18964,20080,19452,19688,19416,19164,19756,19820,20172,19248,19356,19732,19604,19528,19272,19724,19316,19268,19152,19272,19840,19684,19372,19920,19604,19496,19400,19472,19460,19520,19248,19316,19564,19408,19512,19216,19492,19964,19488,19428,19520,19628,19920,19928,19512,19984,19608,19708,19708,19712,19000,19876,20032,20004,19624,19712,19200,19500,19588,19252,19764,19648,19876,19820,19492,19672,19464,19512,19692,19224,19796,19852,20028,19352,19360,19924,19768,19484,19492,19344,19560,19100,19204,19196,19436,19232,20104,19656,19528,19716,19388,19540,19740,19312,19916,19368,19716,19064,19628,19056,19500,19376,19548,19204,19368,19128,19592,19232,19512,19448,19684,19468,19196,19776,19444,19484,19412,19300,19884,19484,19540,19092,20048,19740,19484,19300,19384,19452,19448,19612,19716,19640,19296,19360,18872,19780,19852,19656,18972,19844,19552,19220,18872,19224,19720,19800,19412,19420,19112,19104,19736,19448,19516,19792,20108,19408,19916,19644,19200,19784,19376,19292,19128,19652,19720,19528,19932,19488,19484,19800,19776,19844,19556,19232,19588,19224,19524,19656,19416,19448,19904,19292,19500,20032,19548,19724,20128,19272,19428,19504,19328,19488,19420,19488,19500,18952,19884,19684,19404,19228,19740,19872,19704,19556,19172,19412,19400,19564,19788,19740,19164,19568,19384,19556,19820,19552,19424,18900,19668,19844,19240,19472,19532,19092,19740,19756,19040,19436,19776,19492,19408,19604,19380,19312,19892,19620,19864,18892,19752,19504,19432,19220,19640,19264,19528,19008,19360,19552,19884,19364,19584,19400,19904,19952,20136,19352,19384,20352,19796,19888,19720,19512,19904,19544,19744,19688,19408,19652,19332,19448,19816,19624,19432,19440,19436,18872,19492,19116,20116,19108,19572,19540,19572,19240,19284,19732,19024,19688,19812,20072,19564,19428,19116,19576,19764,19396,19780,19604,19300,19672,19596,19580,19504,19228,20028,19292,19744,19852,19068,19620,19208,19580,19616,19752,20132,19196,19132,19680,19488,20160,19380,19608,19268,19344,19552,19560,19792,19276,19444,19508,19360,19908,19548,19908,19660,19360,19436,19544,19592,19852,19536,19292,19564,19552,19436,19692,19240,19220,19124,19868,19324,19832,19372,19544,19628,19648,19504,19876,19664,19420,19724,19320,19652,19268,19468,19972,19432,19304,19472,19208,19792,19748,19484,19376,19452,19580,19836,19624,19800,19544,19820,19724,19436,19864,18928,19724,19748,19760,20240,19320,19424,19948,19900,19480,19860,19544,19644,19116,19372,19872,19436,19588,19220,19644,19500,19776,19708,19444,20080,19136,19640,19432,20048,19568,19540,20100,19624,19148,19840,19260,19096,19668,20112,19308,19240,19780,19288,19388,19308,19616,19548,19268,19676,19564,19952,19788,19528,19548,19364,19112,19480,19160,19600,19816,18912,20208,19816,19504,19668,18632,19792,19684,20116,19472,19472,19500,19680,19544,19276,19736,19172,19516,19640,19464,19584,19900,19356,19588,19140,19900,19080,20108,19264,18984,19360,19488,19444,19520,19660,19484,19252,19052,19040,19600,19664,19416,19808,19724,19396,19132,20004,19432,19640,19720,19652,19912,19668,19688,19760,19588,19444,19564,19464,19760,19500,19492,19752,19256,19228,19528,19836,19864,19568,19188,20108,19156,19900,19952,19460,19248,19248,19464,19876,19328,19508,19544,19912,19472,19468,19992,19552,19476,19156,19400,20024,19644,19492,19552,19360,19236,19368,19688,19680,19912,19220,19696,19028,19304,19616,19252,19632,19512,18792,18876,19468,19744,19832,19756,19184,19536,19368,19440,19420,19320,19580,18980,19964,19292,19812,19028,19588,19648,19668,19452,19540,19524,19620,19472,19172,19944,19800,19780,19872,19604,19792,19168,19944,19724,19464,19260,19308,19724,19460,19652,19444,19104,19080,19504,19852,19272,19836,19672,19508,19648,19744,19772,19148,20216,19212,19228,19392,19932,19620,20472,19000,19548,19320,19608,19620,19036,19512,19700,19136,19804,19420,19704,19104,19704,19956,19424,19516,19860,19492,19724,19764,20032,19652,19704,19856,19920,19184,19628,19124,19420,19644,19656,20376,19516,19660,19344,19772,19508,19676,19724,19732,19628,19600,19492,19700,19440,19860,19472,18944,19520,19192,19572,19696,19388,19312,20012,19620,19040,19584,19488,20016,19580,19524,19692,20012,19496,19492,19400,19532,19936,19428,19908,19192,19092,19288,19000,20428,19656,19292,19120,19472,19936,19760,19452,19136,19300,19552,19536,19412,19332,19616,18932,19372,19532,19568,19652,20216,19232,19976,19452,19180,19928,19396,19736,19536,18812,19604,19228,19580,19424,19308,19408,19264,19532,19372,18884,19452,19244,19968,19652,19560,19948,19596,19604,19964,19688,19164,19384,19384,19172,19752,19752,19848,19504,19768,20132,20212,19868,19228,19408,19504,19492,19236,19148,19644,19676,19296,19232,19788,19884,19752,18892,19488,19520,19780,19164,20052,19224,19184,19632,18836,19400,19204,19048,19720,19872,19060,19812,18508,19840,19368,19164,19776,19076,19500,19744,19648,19648,19180,19180,19684,19940,19452,19884,19932,19132,19636,19288,19500,19268,19368,19368,19392,19696,19384,19420,19936,19436,19240,19604,20004,19832,19784,19156,19572,20108,19284,19568,19216,19120,19968,19776,19836,19576,19568,19604,19252,19452,19912,19696,19788,19204,19440,19604,19596,19808,19556,19428,19992,19404,19792,19732,19092,19832,19224,19940,19780,19940,18972,19972,19740,19480,19384,19432,19680,19280,19620,19744,19268,19916,19000,19780,19828,19080,19724,19448,19844,19848,19496,19356,19152,18848,19624,19580,18872,19044,19960,19276,19172,19292,19576,19780,19064,19396,19492,19452,19736,19620,19408,19440,19796,19388,19432,19352,19428,19592,19440,19488,19824,20020,19364,19608,19784,19956,19624,19060,19232,19576,19860,19760,19608,19540,19772,19260,19768,19572,19916,19484,18976,19000,19600,19524,19648,19520,19356,19204,19716,19420,19736,19828,19908,19592,19408,19320,19156,19472,19676,19324,19660,19092,19424,19632,19588,19700,19024,19560,19844,19520,19604,19976,19252,19224,19752,19660,19736,19272,19872,19224,19528,19632,19348,19128,19248,19572,19352,20064,19516,19548,19056,18736,19344,19720,19476,19400,19256,19496,19360,19384,19336,19528,19704,19636,19900,20060,19268,19544,19680,19216,19308,20016,19956,19696,19452,19436,19820,19372,19700,19684,19868,19740,19704,19512,19808,20244,19444,19904,19184,18956,19816,19824,19648,19300,19776,19400,19512,19052,19740,19588,19488,19668,19796,19656,19480,19580,19588,19232,19540,19644,19540,19624,19236,19336,19352,19468,19132,19864,19004,19060,19484,19444,19472,19404,19172,19244,19784,19916,19696,19156,19588,19452,19408,19676,19804,19768,20520,19904,19252,19924,19544,19728,19792,19956,19776,19384,19388,19760,19144,19748,19164,19352,19544,19644,19872,19272,19300,19300,19384,19636,19844,19924,19620,18908,19748,19908,19236,19212,19736,19472,19396,19344,19756,19364,19828,19604,19936,19256,19588,19052,19856,19364,19160,19396,19632,19216,19660,19444,20080,19812,19272,19752,19044,19376,19276,19788,19704,19640,19632,19352,19536,19280,20104,19288,19208,18944,19152,18968,19476,19508,19620,19836,19732,19044,19692,19636,19736,19436,19716,19188,19316,19532,19524,19360,19548,19576,19396,19348,19600,19984,19632,18768,19940,19348,19764,19456,19536,19220,19368,19536,19716,19308,19532,20056,19408,19516,19124,19448,19560,19404,19624,19036,19740,20028,19624,19196,19844,19144,18968,19580,19440,19768,19428,19568,19480,19540,19276,19328,19452,19300,19636,19576,19744,19788,19168,19352,19356,19204,19404,19180,19548,19192,19428,19232,19952,19660,19712,20228,19732,19524,19208,19228,19692,19488,19284,19648,19192,19792,19660,19296,19736,19728,19476,19912,19468,19448,19616,19544,20136,19944,19232,19432,19680,19572,19396,19760,19228,19596,19192,20288,19160,19300,19648,19424,19780,19708,19652,19456,19692,18964,19452,19652,19252,18992,19680,19772,19616,19200,19208,19848,19360,19360,19520,19516,19840,19860,19624,19576,19548,19488,19484,19448,20276,19676,19364,19160,19396,19428,19916,19736,19232,19564,19524,19584,19268,19464,18992,19380,19540,19480,19692,19424,19620,19092,19968,19596,19520,19632,19572,19952,19520,19064,19628,19736,19356,19636,19368,19556,19732,18952,19596,19788,19580,19076,19504,19636,19572,19752,19276,20028,19576,19392,19504,19556,19724,19580,19644,19360,19216,19508,19472,19084,19524,19552,19312,19248,19352,19444,19556,19620,19496,19512,19336,19412,19540,19856,19612,19748,19780,19832,19132,19516,19640,19276,19668,19744,19272,19488,19760,19748,19504,19760,18944,19580,19624,19488,19504,20068,19780,19628,19556,19172,19948,19040,19392,19352,19660,19648,19572,19684,19392,19292,19832,19740,19780,19492,19820,19708,19668,19756,20060,19108,19920,19728,19628,19408,18684,19500,20140,19980,19728,19084,19796,19668,20080,19424,19476,19840,19748,19576,19252,19572,19288,19772,19396,19232,19684,19804,19920,19736,19068,19588,19600,19844,19492,19608,19860,19348,19356,19232,19616,19740,19360,19716,19440,19668,19756,19428,18872,19672,19764,19500,19984,19388,19844,19264,19640,19488,19380,19196,19684,19656,19216,19540,19776,19572,19300,19172,19412,19780,19212,19800,19664,19796,19624,19536,19060,19144,19480,19232,19248,19848,19028,19384,20060,19408,19628,20016,20020,19440,19972,19340,19416,19804,18664,19660,19876,19552,19608,19244,19440,19264,19428,19300,19020,19888,19644,19392,19336,19396,19784,19056,19828,19384,19328]},{"counters":[19308,19360,19372,19372,19668,19624,19392,19372,19708,19672,19472,19452,19556,19008,19408,19572,19156,19624,19600,18968,19724,19656,19592,19284,19360,19136,19484,19868,19464,19428,19776,19288,19428,19288,18832,19708,19160,19536,19540,19068,19128,19684,19384,19676,19252,19456,19612,19404,18856,19264,19304,18956,19352,19412,19392,18948,19624,19344,19544,19728,18988,19780,19668,18856,19456,19820,19464,19576,18796,19072,19588,19044,19540,19224,19536,19600,19892,19724,19688,19544,19416,19712,19944,19292,19544,19144,19776,19360,19724,18884,19936,19888,19264,19540,19196,19380,19876,19612,19412,19256,19564,19456,19884,19900,19244,19612,19720,19828,19104,19764,19624,19164,19204,19336,19764,19344,19524,19792,19852,19704,19904,19776,19476,19488,19936,19780,19692,19168,19600,19680,19268,19320,19492,19456,19920,19848,19296,18988,19148,19420,19684,19520,19528,19704,19476,19380,19400,19640,19408,19476,19532,20068,19684,19280,19524,19048,19356,19316,19284,19208,19700,20124,19392,19488,19512,19772,19400,19968,19852,19932,19608,19536,19152,19656,20124,19540,19684,19620,18872,19796,19700,19612,19064,19344,19600,19760,19304,19712,19744,19268,19584,19856,19412,19544,18924,19464,19508,19876,19176,19900,19676,19368,19720,19228,19760,19692,19180,19884,19800,19660,19132,19272,19464,20188,19344,19388,19480,19360,19536,20264,19544,19484,19160,19448,19360,19376,19920,19244,19388,19532,19444,19384,19320,19284,19056,19304,19552,19872,19428,20092,19632,19252,18980,19912,19664,19236,19356,19904,19196,19616,19724,19264,19736,19408,19472,19684,19684,19404,19392,19748,19724,19660,19204,19396,19456,19828,19944,18868,19780,19352,19348,19708,20076,19532,19460,19912,19684,19176,19632,19696,19136,19388,20032,19528,19588,19488,19752,19284,19376,19672,19572,19256,19308,19168,19944,19488,19700,19060,19056,19296,19552,19664,19476,19736,19444,19732,19408,19476,19236,19348,19796,19788,18736,19348,19036,19552,19704,19280,20020,19816,19936,19296,19340,20280,19332,19604,19684,19204,19976,19392,19580,19540,19164,19732,19044,19520,19220,19252,19364,19836,19540,19360,19300,19652,19336,19528,19384,20080,19540,19456,19296,19540,19528,19428,19636,19400,19012,19860,19616,19664,19656,19680,19576,19760,19744,19336,19564,19732,19344,19512,19808,19536,19496,19312,19864,19604,19880,19680,19160,19540,18992,20244,18972,19392,19744,19580,19144,19884,19800,19300,19340,19728,19776,20028,19356,19472,19380,18960,19784,19312,19200,19784,19832,19128,19668,19380,19668,19028,19720,19624,19272,19600,19220,19516,19476,19368,19704,19132,19384,19552,19176,20316,19220,19780,19408,19608,19672,19116,19420,19240,19792,19524,19840,19500,19348,19468,19928,19676,19764,18968,19032,19144,20104,19924,19528,19148,19452,19436,19540,19196,19980,19744,19180,19248,19588,19396,19424,19388,19936,19624,19436,19636,19508,19316,19188,19688,19504,19472,19648,19472,19748,19308,19112,19560,19420,19648,19328,19448,19712,19784,19420,19744,19748,19660,19388,19544,19716,19252,19272,19276,19812,19504,19592,19368,19508,19376,19604,19240,18944,19392,19248,18968,19300,20044,19052,19488,19788,19672,19424,19452,19164,19112,19968,19480,19384,19576,19352,19804,19460,19716,19588,19556,19676,19740,19528,19432,19008,19052,19744,20184,19204,19524,19504,19456,19704,19496,19408,19572,19492,19796,19500,19604,19568,19592,19564,19424,19452,19100,19620,19824,19324,19520,19344,19716,19664,19356,19616,19580,19492,19788,19592,19300,19532,19488,19708,19056,19352,19280,19136,19720,19556,19044,19356,20060,19240,19420,19688,19624,19760,19252,19544,20332,19888,19268,19112,19540,19616,19764,19828,19644,19968,19496,19596,19416,19568,19988,19772,19256,19384,19448,19488,19564,19244,20140,19756,19680,19612,19812,19056,18924,19696,19320,19760,19336,19680,19304,19228,19880,19468,19916,19692,19864,19644,19648,18940,19560,19536,19748,19360,19464,19452,19440,19296,19208,19536,19408,19292,19148,19364,19520,19672,19712,19368,20128,19552,19756,19816,19060,19316,19140,19108,19472,19460,19316,19672,19184,19760,19200,19008,19904,18928,19788,19664,19924,19652,19716,20020,19644,19992,19656,19248,20200,19652,19572,19808,19992,19236,19564,19280,19652,19436,19600,19392,19440,19924,19520,20052,19916,19740,19028,19496,19296,19916,19544,19392,19948,19440,19480,19536,19100,19264,19628,19280,20036,19512,19596,19688,19376,19544,19208,19260,18976,19544,19920,19520,19276,19468,19416,20052,20296,19868,19624,19632,19144,19292,19264,19868,19940,19688,19672,19776,19176,19452,19984,19676,19572,19240,19636,19520,19464,19664,19112,19592,19564,19772,19076,19528,19340,19732,19132,19400,20052,19440,19616,19148,19764,19520,19456,19828,19496,19620,19540,19560,19392,19476,19440,19128,19740,18908,19912,19560,19696,19660,19152,19240,19816,19156,19600,19976,19388,20092,19812,19396,18824,19444,19724,19936,19364,19368,19364,19308,19136,19964,19088,19320,19512,19400,19816,20056,19404,19756,19500,19244,19560,19924,19692,19584,19684,19604,19576,19680,20060,19612,20052,19196,19476,19344,19120,19392,19536,19636,19944,20100,20156,19816,19748,19440,19804,19416,19860,19596,19528,19936,19660,18824,19712,19512,19228,19596,19668,19312,19672,19880,19240,19540,19592,19944,19380,20188,19420,19356,19580,19596,19164,19748,19696,19260,20128,19656,19388,19536,19324,19612,19888,19408,19844,19476,19704,19340,19496,19304,19236,19672,19820,19580,19072,19144,19640,19460,19844,19892,19472,19688,19556,18900,19816,20164,19532,19260,19972,19548,19440,19188,19928,19816,19300,19416,19084,18832,19440,19548,19248,19588,19496,19104,19448,19492,19712,19476,19400,19324,19732,19524,19676,19968,19776,19884,19368,19772,19508,19716,19564,19464,19596,19912,19900,19412,19504,19752,18956,19604,19480,19732,18956,19416,19908,19440,19708,19816,19408,19940,19064,19880,19880,19412,19488,18828,19612,19180,19652,19584,19708,18920,19800,19412,19800,19972,19684,19468,19736,19888,19692,19688,19848,19348,19940,19452,19540,19844,19708,19756,19932,19640,19600,20124,19484,19272,19616,19260,19392,19064,19724,19604,19888,19596,19812,19876,19228,19608,19472,19888,19424,19892,20028,19664,19352,19520,19508,18832,19544,18884,19512,19532,19240,19344,19616,19700,19384,19500,19432,19468,19772,19044,19412,19364,20036,19472,19604,19172,19680,19580,19828,19460,19424,19592,19272,19812,19720,19552,19372,19344,19040,19188,19756,19416,20144,19360,18980,19504,19856,19040,19636,19844,19080,19460,19360,19840,19744,19152,19768,19196,18984,20284,19532,19712,19476,19880,19008,19312,20160,19136,19708,19872,19588,19680,19420,20136,19172,19900,19736,19520,19520,19648,19692,19592,19608,19304,19072,18952,19456,19676,19408,20124,19620,19224,19580,19304,19612,19456,19868,19260,19268,19268,19588,19296,19512,19804,19384,19852,19204,19936,19276,19536,19068,19412,19308,19880,19496,19544,19468,19296,19712,19504,19736,19584,19376,19880,19724,19196,19804,19444,19108,19616,19548,18908,19356,20000,19988,19968,19828,19792,19600,19196,19480,20004,19692,19800,19456,19356,19576,19524,19644,19084,19544,19392,19904,19532,19532,19552,19376,19644,19460,19424,19804,19480,19380,19500,19692,19348,19532,19208,19336,19472,19796,19052,19716,19292,19928,19004,19628,19916,19772,19224,19916,19144,19240,19648,19836,19728,19480,20476,19520,19728,19636,19728,19688,19384,19320,19488,19688,19820,19120,19428,19464,19508,20008,19564,19676,19744,19212,19388,19568,19676,19740,19332,19044,19320,19332,20116,19688,19420,19796,19356,19800,18980,19684,19136,19576,19336,19700,20256,19608,19908,19440,19960,19664,19992,19412,19732,19968,19512,19476,19500,19544,19652,19428,19124,19576,19252,19460,19576,19424,19856,19604,20084,19856,19856,19388,19336,19872,19668,19388,19536,19688,19888,19708,19292,19428,19100,19832,19116,19636,19576,19792,19128,19128,19956,19316,18844,19036,19256,19388,19356,19752,19384,19600,19612,19492,19928,19664,19432,19860,19380,19224,19244,19476,19300,20200,19192,19088,19060,19568,19860,19436,19528,19840,19508,19580,19820,19604,19636,19160,19640,20088,19324,19596,19312,19108,19524,20060,20084,19624,19396,19292,19436,19000,19932,20100,19628,19460,19468,19588,19224,19636,19044,19476,19680,19568,19332,19392,19568,19688,19540,19412,19860,18912,19384,19892,19616,20052,19740,19604,19312,19432,19884,19500,19736,19384,19536,19552,19744,19792,19480,19476,19424,19336,19472,19652,19280,19704,20184,19844,19408,19288,19412,19680,19148,19176,19528,19648,19688,19764,19280,19988,19412,19368,20136,19664,19364,19440,19252,19668,19480,19096,19692,19368,19780,19440,19684,19744,19132,19716,19948,19432,19108,19632,19404,19720,19520,19432,19620,19536,19348,19444,19732,19440,19672,19700,19664,19568,19952,19768,19724,19476,19524,19056,19184,19088,19412,19372,19652,19736,19656,19548,19788,19772,19036,19824,19728,19684,20408,19676,19380,19576,19928,19540,20032,20044,19332,19768,19420,19240,20000,19096,19348,19424,19176,19552,19520,18996,19900,20064,19456,20044,19420,19472,19396,19980,19384,19860,19548,19952,19452,19028,19996,19624,19120,19520,19444,19692,19596,20060,19428,19372,19612,19816,19400,19908,19816,19264,19576,18920,19364,19656,19480,19432,19532,19468,19896,20352,19660,18824,19656,19512,18640,19060,19724,19484,19356,19000,20044,19332,19540,19472,19156,19612,19332,19184,19432,19132,19952,19544,19572,19312,19848,19768,19620,19448,19464,19568,19384,18964,19660,19540,19884,19308,19596,19724,19440,19636,19452,19224,19448,19140,19688,19836,19828,19232,19624,19500,19544,19616,19500,19360,19172,19712,19632,19808,19616,19724,19876,20028,19428,19788,19164,19220,19676,19548,19464,19740,20264,19444,19536,19136,19308,19392,19276,19748,19172,19748,19904,19588,19796,19836,19508,19416,19308,19348,19744,19864,19224,19364,19556,19576,19244,19244,19536,19428,19560,19488,19420,19084,19252,19668,19608,20072,19808,19584,19772,19228,19316,19540,19184,19228,19432,19460,19972,19304,19516,19332,19132,19816,19516,19704,19552,19440,19876,19760,19104,19584,19880,19392,19440,19584,19664,19128,19200,18984,19588,19320,19780,19808,19600,19852,19572,19444,18972,19820,18876,19552,19612,20152,19160,19448,19812,19328,19312,19652,19340,19784,19412,19652,19716,19656,19880,19468,19568,19272,19412,19108,20164,19856,19592,19904,19444,19464,19076,19924,19344,19800,19072,19708,19880,19404,19516,19608,19432,19928,19876,19904,19804,19480,19432,20528,19604,19572,19368,19036,19872,19552,19368,19268,19512,19472,19056,19712,19248,19540,19544,19452,19320,19536,19560,19328,19508,19928,19520,19548,19544,19628,19500,19588,19808,19304,19756,20284,19840,19880,19104,19616,19648,19344,19220,20036,19320,19916,19384,19548,20112,19408,19332,18996,18552,19840,18908,19592,19520,19360,20052,19944,19368,19532,19276,19404,19636,18960,19396,19704,19816,19048,19484,19620,19824,19772,19900,19376,19748,19920,19212,19452,19704,19412,19428,19604,19264,19912,19416,19592,19480,20276,18836,19824,19404,19220,19608,20096,19528,19336,19720,19904,19788,19964,19756,19464,19904,19368,19544,19940,19420,19724,19484,19236,19676,19232,19816,19912,20168,19492,19616,19904,19356,19064,19420,19796,19408,19264,19352,19528,18928,19592,19604,19136,19564,19276,19048,19756,19624,19424,19612,18920,19412,19432,19504,19420,19568,19588,19488,19360,19940,19520,19384,19116,19572,19508,20004,19804,19288,19036,19668,19224,19472,19700,19748,19508,19552,19588,19560,19400,19456,19628,19740,19628,19868,19472,19700,19792,19504,19404,19660,19216,19292,19412,19900,19320,19788,20012,20064,19832,19720,19564,19040,19524,19032,19368,19476,19352,19288,18916,19520,19364,19152,20172,19556,19700,19332,19840,19540,19672,19620,19620,19080,19720,19636,20100,19584,19532,18824,19860,19852,20016,18992,19632,19708,19236,19340,19764,19504,19508,20012,19488,19468,19160,19532,19308,19156,19572,19620,19944,19408,19656,19204,19584,18968,19520,19916,19940,19644,18952,19732,19480,19228,19120,19424,19684,19244,19224,19188,19424,19276,19484,19900,19568,19616,19052,19544,19520,19696,19848,19296,19512,19724,19508,19760,19500,19820,19240,19768,19304,19664,19148,19660,19344,19316,19676,19344,19208,20180,19560,19548,19212,19336,18888,19472,19544,19420,19708,19644,19308,19420,19948,20068,19508,19068,19776,19536,19728,19172,19056,19956,19492,19248,19732,19824,19240,19400,19212,19520,19468,19480,19164,19044,19404,19896,19680,19844,19676,19976,19616,19444,19860,20032,19440,20056,19616,19400,19580,19460,19672,19304,19408,19428,19528,19632,19496,19540,19672,19236,19780,19484,19280,19496,19700,19628,19804,19504,19524,19660,19532,19404,19660,19300,19340,19824,19588,19752,19408,20016,19780]},{"counters":[19652,19592,19408,19536,19036,19808,19032,19428,19396,19944,19764,18872,19836,19536,19392,19752,19928,19360,19276,19552,19192,19176,19912,19408,18972,19548,19484,19644,19692,19248,19440,19516,19424,19236,19704,19716,19296,19260,19624,19308,19860,19652,20024,19224,19740,19068,19356,19224,19372,19260,19560,19612,19764,19536,19408,19748,19700,19512,19516,19848,19720,19676,19432,19652,19492,19488,19540,19696,19208,19532,19588,19120,19764,20080,19076,19304,19312,19612,19412,19760,19828,19172,19772,19492,19756,19204,19632,19516,19308,20116,19776,19288,18984,19360,19516,19312,19048,19772,19632,19308,19160,19796,19324,19744,19408,19296,19152,19508,20064,19532,19628,19652,19620,19060,19244,19588,19592,18888,19196,19852,19124,19308,19692,19748,19836,19640,19200,19600,19804,19368,19756,19588,19344,19084,19576,19988,19532,19972,19524,19280,19412,19404,19964,19160,19256,19932,19292,19660,19720,19820,19632,19336,19588,19612,18984,19908,19824,19780,19392,20028,19464,19376,19304,19292,19420,19604,19260,19616,18860,19272,19848,19332,20056,19736,19596,19296,19328,19400,19256,19624,19820,19580,19752,19492,19544,19988,19984,19808,19272,19672,19764,19476,19504,19832,19636,19760,19836,19872,20232,19628,19868,19600,19336,19864,19500,19792,19436,19452,19140,19752,19424,20052,19064,19180,19960,19516,19576,19872,19464,20020,19740,19408,19320,18908,19592,19264,19408,19444,19640,19032,19336,19304,19300,19848,19520,19560,19540,19536,19428,19208,19136,19436,19664,19352,19436,19616,19604,19440,19492,19484,19096,19940,20012,19488,19284,19552,19672,19940,19672,19776,19316,19888,19048,19884,19372,19948,18900,19700,19940,19584,19356,19544,19436,20104,18992,19696,19328,19360,19496,19656,19876,19616,19432,19236,19380,19292,19424,19368,19608,19332,19088,19504,19628,19692,19556,19324,19296,19556,19248,19600,19320,19556,20044,19380,19396,19516,20292,19656,19864,19516,19108,19616,19384,19120,19400,19156,19460,19276,19652,19248,19208,19376,19584,19428,19748,19056,19620,19960,19348,19492,19964,19552,19208,19828,19504,19680,19196,19324,18972,19580,19788,19856,19384,19148,19468,19596,19336,18748,19136,19152,19528,19416,19880,19304,19372,19420,19360,19380,19412,19436,19876,19388,19604,20016,19372,20168,19348,19464,19548,19460,19236,19528,18632,18972,19080,19592,19308,19584,18984,19268,19360,19032,19472,19772,19644,19284,19216,19576,19824,19372,19532,20256,19552,19668,19624,19680,19232,19628,19380,19504,19348,19984,19268,19212,19652,19368,19572,19556,19308,19292,20160,19520,19616,20064,19432,19300,19516,19620,19324,19312,19640,19756,19588,19248,19972,19732,19348,19720,19712,19280,19648,19624,19624,19420,19236,19224,19944,19556,19104,19620,19624,20232,19476,19696,19164,19852,19428,19572,19440,19556,20100,19456,19552,19236,19136,19220,19312,20320,19476,19320,19908,19940,20064,18720,19312,19204,19512,19280,19472,19468,19992,19888,19976,19660,19792,20004,19724,20200,19524,19756,19576,19204,19548,19528,19724,19560,19564,19172,19396,19556,19828,19864,19540,19320,19872,19212,19344,19064,19884,19064,19616,19056,19612,19304,19756,19380,19472,19436,20032,20416,20084,19544,19256,19552,19600,19788,19768,19756,19796,19376,19548,19392,19420,19436,19352,19376,19456,19672,19612,19432,19472,19856,19424,19464,19284,19472,19740,20120,19552,19660,19720,19672,18916,19316,19584,19480,19280,19864,19052,20108,19520,19504,19808,18952,18780,19612,19540,20012,19584,20012,19360,19784,19700,19748,19536,19148,19188,19224,19468,19584,19828,19408,19012,19712,19852,19372,19516,19480,19956,19768,19940,19540,19088,19544,19504,19112,19888,19468,19964,19172,19776,19520,19844,19028,19432,19300,19988,19440,19588,19420,20064,20028,20048,19448,19660,19308,19748,19876,19504,19924,19128,19420,19468,19696,19652,19244,18812,19452,20180,19232,19704,19912,18868,19604,19564,19448,19332,19464,19600,19532,19508,19816,19556,19216,19528,20092,20084,19220,19652,18952,19252,19384,19352,19496,19832,19608,19300,19820,19980,19080,19332,19532,19368,19420,19488,19596,19544,19552,19196,19904,19428,19248,19384,18988,19484,19768,19532,19396,19120,19304,19316,19768,19880,19752,19192,19384,19964,19776,19380,19388,19492,19724,19180,19136,19460,19416,19788,19552,18964,18976,19604,19460,19128,19564,19552,19120,19748,19484,19596,19840,19420,19560,19848,19732,20108,19216,19628,19040,19468,19580,19884,19680,18960,19380,19012,19548,19428,19076,19824,19724,19456,19784,19524,19548,19256,19668,19236,19560,19360,19504,19832,19308,19644,19716,19256,19556,19476,19328,19268,19184,19100,19652,19964,19824,19512,19608,19240,19928,19532,19860,19372,19524,19236,19800,19664,19632,19436,19340,19468,19660,19948,19136,19492,19864,19612,19524,19116,19548,19128,19716,19596,19344,19644,18756,19688,19428,19460,19396,19480,19408,19396,19360,19576,19568,19416,19788,19312,20048,19876,19780,19828,19804,19192,19252,19660,19540,19424,19480,19524,19604,19488,19940,19228,19728,19680,19396,19948,19816,18864,19640,19712,19788,19144,19260,19888,19628,19440,19420,19576,19716,19912,19148,19964,19580,19540,19436,20152,19800,19436,19844,19584,19588,19608,20116,19752,19716,19300,19564,19372,19420,19672,19924,20092,19644,19368,19516,19476,19604,19204,19312,19684,19668,19272,19648,19488,19612,18984,19640,19944,19704,19568,19768,19224,19296,19148,19816,19760,19712,19296,19688,19804,19652,19660,19496,19056,19176,19412,19484,20016,19372,19600,19440,19940,19536,19116,19116,19660,19508,19604,19408,19396,19452,19596,19604,19236,19828,18920,19188,19484,19976,19220,19724,19364,19444,19540,19372,19264,19648,19108,19240,19696,19324,19868,19364,19312,19340,19740,19436,19184,19600,19832,20156,19396,19448,19176,19136,19296,19372,19492,19252,19484,19616,19420,19556,19732,19804,19368,19812,20240,19680,18908,19208,19212,19044,19592,19312,19892,19360,19648,19764,19484,19452,19452,19532,19640,19476,19632,19652,19868,19072,19636,19844,19528,19472,19672,19524,19324,19436,19380,19584,19984,19588,19244,19384,19780,19292,19792,19544,19716,19568,19708,20004,19648,19248,19224,19620,19352,19584,19372,19556,19704,19648,18896,19172,19704,19524,19372,19304,19676,19608,19392,19512,19100,19700,19620,19268,19852,19524,19108,19516,19460,19640,19448,19344,19492,19676,19332,19884,19648,19572,19540,19296,19424,19772,19340,19944,19664,19872,19196,19396,19904,20092,19264,19596,19556,19636,19764,19628,19248,19552,19408,19616,19752,19320,19364,19288,20036,19388,19752,19944,19384,19536,19852,19452,19516,19020,19456,19736,20108,19568,19416,19472,19572,19576,19464,19768,20020,19564,19452,19348,19392,19172,19588,19476,19368,19448,19244,19336,19316,19436,19536,19432,19548,19608,19740,19948,19932,19924,19616,19088,19516,20020,19408,19444,19680,19732,18840,19648,19052,19188,19180,19256,19532,19652,19500,19440,19508,19788,19492,19788,19472,19552,19628,19688,19600,19236,19440,19640,19056,19628,19132,19888,19228,19540,19764,19880,19140,19752,19192,19376,19552,19520,19208,19208,19636,19328,19904,19360,19868,19068,19776,19136,19904,19948,19496,19688,19480,19324,19752,19880,19700,19560,19432,19852,19620,19780,19528,19544,19884,19464,19952,19624,19492,19452,19968,19500,19636,19384,19488,19340,19420,19656,19844,19160,19272,19784,19380,19444,19592,19424,19696,19552,19156,19768,19720,19636,19564,19968,19308,19548,19348,19844,19152,19772,19184,19876,19576,19628,19640,19804,19892,19644,19296,19540,19352,19588,18972,19868,19868,20092,20016,19624,19160,19636,19392,19536,19732,19364,19668,19472,19296,19572,19108,19596,19568,19872,19520,19372,19556,19872,19808,19252,19364,19612,19236,19512,19100,19940,19788,19868,19124,19572,19632,19336,19800,19428,19372,19404,19616,19460,19512,19724,19564,19212,19700,20104,19712,19316,18832,19584,19940,19400,19600,19864,19628,19664,19468,19132,19268,19312,19092,19812,19532,19800,19800,19188,19752,19668,19884,19560,19952,19160,19556,19616,19708,19332,19616,19516,19224,19848,19624,19572,19512,19408,19908,19492,19720,19416,19460,19496,19168,19076,19492,19712,19860,19672,20248,19372,19284,19532,19300,19164,19444,19716,19856,19368,19464,19900,19572,19480,19100,19996,19464,19924,19836,19344,19672,19272,19804,19416,19844,19544,19648,19544,19340,19876,19756,19544,20076,19472,19892,19836,19480,19436,19888,19828,19220,19636,19092,19536,19644,19500,19976,19836,18976,19620,19912,19740,19464,19320,19472,19364,19964,19260,19568,19480,19680,19416,19228,19500,19456,19968,19624,19328,19384,19132,19632,19212,19688,19220,19380,19560,19728,19736,19416,19188,19272,19400,19272,19640,19368,19724,19648,19580,19320,19152,18956,19404,19824,19304,19824,19064,19520,19168,19692,19300,19164,19584,19012,19816,19480,19268,19652,19356,19380,19372,19272,19528,19108,19588,20128,19444,20032,19512,19276,19808,19664,19608,19612,19548,19640,19524,19496,19928,19704,19748,19308,19700,19516,19456,19720,19788,19416,19264,19204,19672,19248,19872,19532,20244,19568,19688,19504,19208,19752,19876,19792,19808,19416,19656,19776,19404,19380,19776,19836,19308,19204,19948,19364,19376,19580,19252,20100,19260,19596,19412,19432,19660,19432,19844,18996,20144,19312,19836,19800,19724,19576,19276,19724,19464,19484,19096,19124,19380,19272,19824,19792,19296,19792,19952,19580,19392,19108,19732,19340,19296,19304,20088,19116,19572,19720,19384,19548,19424,19804,19552,19692,19416,19664,19628,19900,19464,18996,19672,19184,19220,19676,19164,19668,19704,19568,19408,18904,19760,20208,19912,19032,20208,19148,19580,20032,20004,19000,20036,19824,19868,19328,19032,19220,19356,19880,19652,19252,19328,19560,19452,19524,19112,19620,19688,18920,19660,19364,19908,19776,19780,19504,19680,19520,19080,19852,19900,19256,19824,19792,20156,19380,19660,18744,19536,19204,19660,19676,19716,19692,19488,19856,19260,19448,19520,19244,19664,19740,19364,19812,19156,19696,19396,19408,19236,19660,19848,19384,19500,19468,19832,19444,20196,19412,19928,19752,19376,19296,19684,19508,19912,20032,19888,19048,19428,19356,19736,19596,19708,19476,19312,19540,19480,18816,19748,19580,19448,18928,19444,19812,19052,20168,19456,19668,19656,20088,19692,19660,19708,19900,19460,19212,19316,19412,19992,19036,19500,19612,19800,19584,19688,19400,19276,20088,19196,19416,19948,19300,19544,19720,19228,19576,19648,19264,19400,19516,19740,19544,19548,19688,19360,19768,19596,19940,19236,18976,18836,19120,19172,19872,19596,19648,19840,19708,19496,19524,19300,19340,19376,19504,19888,19620,20248,19804,19664,19760,19524,20036,20064,18984,19616,20016,19480,19824,19332,19696,19188,19608,18964,19732,19244,19788,19500,19592,19996,19124,19332,19532,19532,19572,20136,20176,19776,19364,19448,19316,19744,20536,19556,19160,19720,19640,19464,19344,19740,19404,19572,19496,19556,19368,19192,19796,19508,19644,19564,18816,19952,19220,19468,19704,19020,20160,19380,19524,19136,19580,19756,19728,19940,19168,19572,18816,19632,19516,19724,19428,19864,19492,19336,19536,19404,20028,19400,19720,19652,19608,19428,19068,19336,19636,19576,19668,19508,19892,19264,19144,19936,19292,19456,19676,19420,19704,19372,19288,19352,19548,19668,19404,19404,19388,19784,19296,19240,19104,19156,19552,19596,19212,19764,18988,19608,18912,19584,19536,19652,19600,19496,19408,19736,19376,19688,19636,20192,19268,19328,19248,19784,19304,19704,19188,19368,19736,19668,19652,19608,19296,19556,19928,19636,19768,19464,19488,19652,19892,19468,19688,19500,19772,19740,19644,19696,19088,19852,19280,19308,19868,19348,19332,19612,19472,19424,19260,19472,19312,19948,19100,19820,19444,19440,19468,19832,19680,19520,19804,19752,19616,19456,19628,19404,19328,19356,19720,19992,19488,19144,19616,20072,19616,19488,19472,20200,19776,19640,19300,19516,19384,19644,19236,19216,19596,19268,19540,19376,19164,19232,20148,19064,19504,19336,19072,19972,19760,19768,19852,19548,19428,19460,19396,19680,19936,19768,19668,19392,19436,19420,19276,19408,19152,19324,19668,19284,19808,19656,19988,19180,19452,19860,20004,19060,19300,19980,19664,19636,19404,19384,20124,19460,19692,19944,19908,19452,20344,19272,20312,19840,19828,19040,19468,19236,19608,19444,19488,19568,19224,19384,19400,19124,19400,19288,19640,19312,20012,19120,19864,19352,19540,19316,19728,19132,19252,19580,19668,19732,19264,19552,19320,19908,19536,19544,19356,19272,19432,19764,19924,19192,19120,19412,19248,19244,19444,19056,19156,19652,19140,19480,19832,19264,19476,19220,19536,19044,19624,19576,19372,19720,19720,19148,19708,19532,19324,19348,19424,19828,19440,19696,19340,19328,19192,19672,19452,19644,19380,19488,20272,19908,19656,19340,19884,19476,19908,19652,19520,19916]},{"counters":[19456,19656,18996,19396,19412,19852,19788,19248,19660,19916,19860,19720,19632,19472,19512,19772,19360,19204,19412,19512,19900,19752,19544,19412,19832,19784,19932,19620,19364,19564,19004,19532,19484,19464,19884,19264,19568,19920,19088,19500,19456,19732,19360,19872,19344,19996,20036,19864,19260,19716,19076,19620,19368,19168,19108,19308,19504,19196,19680,19564,19508,19108,18940,19676,19428,19468,19480,19788,19004,19700,19520,19688,19636,19656,19176,19496,19628,19936,19480,19336,19572,19860,19280,19560,19920,19636,19332,19580,19216,19372,19020,19552,19416,19524,19288,19760,19340,19668,19844,19720,19404,19380,19312,19472,19400,18836,19688,19448,19868,19652,19648,19496,19128,19620,19780,19788,19732,19220,19160,19864,19828,19568,19152,19388,18704,19452,20364,19360,19092,18876,19188,19360,19652,19544,19624,19820,19920,19812,19544,19648,19516,19852,19336,19400,19336,18696,19676,19588,19628,19628,19520,19504,18900,19160,19492,19160,19552,19912,19412,19732,19536,19504,19580,19380,19256,19368,19404,19540,19304,18976,19800,19708,18824,19068,19716,19256,19584,19328,18908,19664,19764,20124,19476,19576,19028,19588,19632,20020,18996,19864,19556,19612,19280,19620,19396,20048,19680,19464,19852,19188,19616,19588,19520,19292,19456,19332,19404,19004,19604,19656,19824,19628,19808,19948,19212,19268,19148,19776,18828,19508,18928,19540,19656,19216,19640,19696,19884,19536,19260,19632,19312,20028,18960,19692,19716,19508,19456,19328,19856,19716,19740,19420,19304,19360,19932,19080,19664,19248,19532,19728,19328,19488,19440,19684,19012,19256,19588,19836,19400,19952,20036,19508,19616,19952,19228,19340,19060,19432,19600,19096,19384,19480,19508,19872,19600,19964,19684,19816,19812,19160,19332,20148,19728,19644,19180,19636,20436,19152,19268,19636,20212,19840,19388,19248,19560,19556,19308,19564,19708,19756,19140,19460,19244,19736,19572,20012,19712,19612,19528,19628,19416,19864,19268,19544,19260,20104,19936,19580,19576,19012,19696,19620,19480,19440,20184,19928,19564,19764,19740,19572,19304,19616,19404,19584,19392,20284,19944,19596,19192,19612,19684,19920,19972,19828,19876,20040,19480,19072,19476,19524,19908,18736,19724,19064,19504,19624,19376,19344,19712,19888,19676,19760,19320,19176,18848,19604,19716,19724,19452,19616,19104,19712,19416,19060,19152,19520,19356,20536,19220,19840,19740,19508,19724,19588,19264,19768,19756,19556,18796,19404,19268,19840,19080,19832,20016,19704,19136,19440,19396,19780,19792,19336,19756,19568,19476,19392,19820,19928,19372,19012,19276,19656,19332,19316,19252,19700,19692,19008,19536,19800,19920,19428,19992,19380,19412,19120,19396,19228,19876,19432,19716,19628,19648,19804,20124,19164,19228,19288,19120,19300,19564,19240,19268,19376,19792,19020,20184,19808,19592,19552,19364,19060,19192,19608,19764,19696,19572,19600,19192,19128,19420,19680,19984,19296,19976,19328,19228,19700,19544,19396,19924,19224,19180,19276,19088,19880,19728,19472,19492,19416,19180,19332,19968,19728,19380,18808,19384,19340,19308,19496,19696,19604,19480,19328,19048,18940,19124,19780,19452,19724,19200,19708,19352,19544,19412,19020,20120,19200,19116,20040,19552,19752,19532,19364,19848,19236,19504,19988,19380,19784,19968,19572,19736,19624,19900,19464,19424,19880,20032,19336,19248,19648,19656,19352,19340,19400,19368,19360,19332,19536,19576,19392,19456,19724,19820,19612,19224,18940,19756,19260,19804,19156,19536,19664,19384,20120,19428,19672,20068,18840,19648,19636,19620,19592,19640,19372,19348,19340,19756,19288,19404,19300,19312,19524,19916,19656,19332,19112,19568,19952,19468,19452,20008,19684,19436,19268,19152,19444,19788,19308,19304,19400,19844,19200,19600,19672,19696,19940,19712,19556,19636,19776,19332,19364,19924,19372,19568,19592,19092,19872,19344,19320,20068,19328,20144,19168,19808,19312,19640,18432,19660,19564,19600,19848,19500,19284,19296,19496,19132,19312,19380,19456,19840,19364,19528,19760,19504,19928,19136,19448,20132,19724,18768,18976,19476,19392,19012,19224,19700,19416,19560,19416,19632,19548,19600,19772,19292,19724,19472,19748,19216,19308,19344,19296,19492,19464,19680,19564,19428,19228,19100,19276,20040,19376,19640,19132,19564,20044,19692,19924,19820,19420,19240,19868,19828,19952,19716,19652,19496,19824,19660,19500,19444,19140,19980,19584,19760,19924,19636,19828,19788,19480,19700,19436,19640,19560,19304,19312,19296,19268,19012,19028,19608,19280,19564,19172,19420,19320,19440,18948,19276,19704,19392,19592,19364,19560,20016,19504,19452,19292,19716,19620,19900,19504,19308,19152,19764,19580,19560,19696,19712,19444,19016,19884,19600,19452,19920,19076,19692,19836,18944,19616,19460,19392,18656,19324,19704,19504,19340,19436,19564,19440,19660,19816,19828,19288,19376,19616,19864,19372,19160,19528,19568,19656,19448,20028,19712,19124,19692,19212,19656,19544,20024,19092,19532,20420,19496,19608,19236,19592,19592,19228,19776,19768,19108,19400,19612,19224,19344,19344,19876,19468,18912,19040,19492,19532,19328,18960,20036,19596,19060,19500,19680,19676,19836,19832,20208,19424,20044,19852,19812,19804,19844,19528,19548,19688,19432,20304,19276,19908,19276,19376,19244,19444,19756,19448,19444,20112,19736,20100,19392,19672,19580,19380,19792,19632,19248,19712,19572,19544,19816,19772,19236,19824,19296,20504,19512,19928,19684,19696,19812,19852,19884,19260,19160,19884,19844,19432,19324,19168,19420,19544,19720,19748,19424,19580,19796,19548,19788,19100,19348,20088,19648,20080,19904,20100,19612,19616,19600,19720,19552,19680,19400,18692,19436,19400,19516,19812,19460,19152,19712,19744,19628,19440,19736,19868,19760,19548,19712,19840,19704,19600,19280,19680,19488,19712,20028,19132,19216,20016,19744,20032,19528,19572,19692,19220,18908,20128,19632,19112,19212,19268,19372,19604,20156,19784,19492,19644,19532,19588,19200,19712,19368,19540,19428,19240,19808,19200,19404,19364,19052,18868,19928,19820,19424,19484,19672,19856,19592,19212,19640,19492,19500,19872,19124,18960,19484,19844,19388,19704,19568,19672,19328,19312,19324,19532,19364,19400,19652,19168,19592,19508,19528,20072,19720,19220,19428,19312,19876,19700,19608,19364,20016,19920,19792,19064,19196,19496,19372,19308,19688,19648,19656,19364,19232,19600,19420,19876,19988,19672,19192,19696,19284,19364,19216,19824,20232,19748,19836,19208,19724,20092,19264,19348,19704,19792,19428,19752,19496,19240,19244,19132,19536,19788,20008,19608,19408,19568,19440,19472,19508,19348,19516,19936,19100,19340,19484,19584,19604,19904,19648,19036,19468,19392,19528,19288,19464,19188,19876,19416,19632,19496,19444,19388,19604,19840,19416,19948,19228,19084,18956,19324,19712,19332,19788,19908,20028,19624,19080,19004,19828,19320,20200,19076,19384,19700,19960,19740,19916,20040,19744,19680,19556,19436,19112,19780,19636,19444,19904,20036,19280,19488,19568,19368,19676,19616,19720,19448,19220,19476,19244,19756,19324,19848,19804,19332,19664,19660,19848,19304,19460,19656,19664,19364,19300,19100,20012,19604,19592,19612,19860,19620,20048,19664,19840,19312,19324,19596,19508,19260,19860,19516,19680,19256,19988,19184,19076,19464,19408,20376,18968,18904,19492,19148,19636,19656,19468,19492,19540,19568,19656,18948,19544,20024,19636,19460,19852,19940,19860,19364,19008,19088,19208,19076,19120,19648,19640,19440,19348,19728,19544,19484,19088,19368,19884,19480,19800,19280,19192,19496,19540,19800,19740,19388,19636,19836,19596,19440,19320,19728,19424,19904,20356,19388,19256,20144,19440,19536,19428,19068,19284,19264,19800,19588,19336,19464,19700,19420,19912,20136,19312,19324,20024,20000,20080,19348,19488,19456,19284,19264,19248,19272,19416,19588,19744,19392,19144,19432,19948,19200,19528,19812,19344,19572,19236,19320,19460,19284,19824,20024,19736,20004,19264,19464,19216,20000,19252,19416,19860,19184,19472,19752,19356,19700,19532,19520,19588,19768,19708,19468,19944,20048,19696,19564,19328,19916,19608,19484,19532,19904,19620,19476,19444,19164,19736,19740,19420,19124,19632,19600,19544,19924,19232,19716,19552,19456,19236,19872,19592,19260,19488,19620,19972,19488,19696,19344,19512,19340,19788,19596,19288,19852,19488,19664,20056,19244,19800,18860,19788,19812,19656,19172,19808,19124,19992,19584,19740,19516,19948,19356,19464,19872,19348,19400,19360,19644,19364,19956,19376,19436,19412,19996,18824,19452,19160,19500,19892,19444,19288,19872,20040,19528,19316,19404,19356,19692,19748,19820,19484,19260,19596,19924,18968,19608,19412,20028,19616,20004,19576,19204,19560,19168,19388,19976,19032,19188,19352,19404,19460,19500,19276,19424,19588,19372,19720,19520,19412,19308,19456,19688,19680,19204,19524,19612,19252,19496,19464,19100,20084,19628,19520,19968,19168,19236,19156,19084,19180,19628,19720,19544,19728,19304,19736,19956,19524,19404,19292,19676,19896,19144,19408,19524,19492,19528,19648,19372,19616,19508,19124,19404,19828,19336,19208,19952,19324,19340,19536,19472,19680,19704,19192,19396,19752,20064,19500,19744,19256,19244,19772,19000,19400,19548,19948,20032,19460,19300,19912,19312,19716,19488,19448,19404,19304,20008,19632,19672,19568,19744,19568,19428,19816,18960,19636,19336,19104,19624,19560,19160,19556,19796,19884,19160,19600,19728,19404,19744,19888,19236,19796,19248,19740,19568,19336,19560,19252,19732,19928,19424,19488,19360,19788,19224,19388,19192,19104,19352,19376,19236,19484,19744,19108,19972,19456,19832,19704,19492,19340,19560,18832,18828,19632,19252,19892,19780,19636,19488,19508,19632,19316,19700,19196,19672,19176,19700,19336,19732,19368,19580,19508,19824,19784,19316,19704,19540,19468,19352,19188,19740,19036,19772,19296,19812,19312,19500,19528,19668,19752,19688,19956,19444,19268,19468,19376,20108,19824,20008,19416,19596,20032,19312,19624,19856,18892,19860,19784,19988,19272,19832,19428,19360,19544,19548,19764,19976,19548,19728,19428,19460,19580,19308,19708,19172,19664,19604,19608,19884,19476,19216,19780,19652,19524,19520,19060,19776,19516,19304,19308,19560,19444,19736,19816,19884,19480,19660,19452,19668,19824,19156,19336,19584,19584,19452,19528,19972,19336,19536,19556,19820,20072,20180,19428,19624,19952,20144,19508,19880,19596,19184,19220,19536,19496,19384,19972,20324,19312,19684,19472,19948,19764,19760,19732,19320,19628,19620,19584,19724,18888,19124,19848,19568,19388,19484,19176,19800,19256,20052,19608,19436,19360,19404,19508,19932,19584,19588,19328,19464,19552,19804,19128,18996,19432,19496,19660,19756,19284,19392,19552,19776,18988,19692,19936,19396,19364,19680,19740,19516,19340,19612,19704,19820,19284,19372,19424,19436,19372,19832,19524,19552,19304,19452,19204,19584,19760,19648,19284,19476,19408,20144,19676,19860,19420,19432,19688,19576,19320,19508,19816,19388,20208,19412,19680,19844,19408,19488,19640,19668,19632,19220,19564,19568,19936,19812,19352,19812,19284,19464,19316,19804,19464,19724,19532,19428,19296,19820,19204,19436,19296,19520,18940,19568,19628,19160,19908,19520,20256,19212,19628,19424,19604,19524,19460,19688,19576,19604,19308,19412,19564,19548,19712,19636,19440,19692,19184,19460,19152,19412,19332,19448,19708,19588,19460,19616,19688,19692,19692,19356,19440,19620,19140,19764,19600,19064,19360,19860,20200,19464,19640,19808,19756,19640,19428,19648,19388,20084,19540,19888,19040,19432,19532,19896,19488,19544,19156,19616,19584,19968,19248,19372,20256,19472,19516,19312,19388,19848,19004,19128,19716,19224,19448,19580,19396,19464,19288,19644,19036,19468,19128,18948,19232,19212,19884,19348,19300,19396,19436,19684,19464,19588,19244,19388,19836,19388,19668,19324,19044,19824,19612,20004,19380,19636,19124,19576,19952,19660,19420,19912,19116,19104,19320,19664,19432,19556,19428,19048,19888,19512,19832,19596,20328,19348,19812,19360,20028,19188,19480,19516,19700,19276,19500,19492,19104,20156,19224,19708,19344,19840,19748,19700,19480,19744,19856,19788,19776,19076,19532,19676,19828,19092,19816,19268,19988,19928,19584,19228,19000,19620,19552,19532,19352,19504,19416,19444,19328,19628,19636,19988,19020,19416,19440,20112,19300,19512,19608,19700,19532,19224,20056,19432,19956,19544,19912,19636,19420,19628,18968,19608,19120,19704,18964,19132,19824,19032,19856,19056,19296,19412,19484,19936,19300,19620,19268,19532,19232,19600,19424,19696,19440,19588,19056,19364,19604,19652,19652,19448,19744,19908,19180,19140,19692,19604,19580,19624,19412,18880,19564,19068,19460,19900,19076,19620,19236,19680,19292,19148,20224,19516,19868,19712,19300,18912,19744,19512,19236,19636,19376,19312,19372,19496,19212,19064,19708,19416,20032,19372,19428,19224,19448,19752,19348,19632,19516,19800,19480,19504,19472,19748,19428,19300,20096,19756,19620,19024,19376,19308,20048,19624,19500,19484]},{"counters":[19584,19444,19380,19324,19592,19512,19524,19492,19656,19524,19356,19184,19292,19276,19424,19716,19488,19580,19144,19500,19624,19260,19256,19540,19060,19564,19228,20368,19896,19488,19260,19688,19320,19868,19632,19584,19416,19608,19956,19492,19228,19308,19912,19408,19532,19552,19436,19276,19612,19112,20004,19496,19664,20068,19140,19080,20076,19668,19336,19480,19440,19520,19668,19520,19640,19684,19232,19264,19048,19888,19412,19392,19536,19756,19728,19364,19880,19784,19712,20092,19840,19848,19692,19780,19316,19556,19800,19164,19932,19744,19516,19616,19388,19900,19568,19484,19532,19616,19420,19532,19200,19548,19696,19804,19748,19492,19992,19420,19568,19780,19736,19964,19656,19268,19472,19112,19432,19716,19792,20076,19452,19360,19764,19468,19416,19512,19492,20096,19456,19628,19856,18964,19912,19828,19624,19628,19268,19652,19500,19276,19032,19296,19648,19524,19572,19740,19472,19876,19468,19340,19668,19820,19748,19148,19432,19240,19380,18996,19612,19272,19716,19472,19248,20012,19496,19164,19544,19580,19724,19940,19312,19420,19012,19456,19812,19264,20088,19828,19620,19736,19116,19380,19516,19516,19276,19880,19300,19408,19080,19236,19388,19508,19188,19216,19828,19788,19272,19504,19416,19252,19200,19380,20352,19956,20196,19540,20124,20044,19036,19652,20048,19508,19216,19380,19564,19388,19892,19372,19728,19528,19616,19824,19472,19388,19468,19612,19440,19424,19500,19672,19724,19264,19100,19932,19324,19140,19616,19492,19884,18936,19160,19540,19708,19648,19380,19460,19980,19576,20176,19860,19300,19236,19832,19252,19580,19212,19512,19540,19112,19112,19352,19612,19720,19800,19824,19556,19612,19680,19788,19360,20272,19544,19276,19240,19272,19988,19732,19044,19716,19512,19580,19796,19828,18872,19724,19456,19312,19268,19208,19744,19480,19464,19836,19392,19952,19492,19832,19172,19572,20156,19252,19376,19128,19716,19796,19280,19788,19728,18624,19848,19132,19044,19280,19348,20160,18940,19776,18840,19984,19680,19840,19528,19356,19260,19416,19480,19772,19416,19296,18900,19604,19968,19608,19536,19864,19560,19808,19636,19368,19748,19512,19948,19200,19356,19728,19904,19528,19064,19048,19604,19156,19256,19804,19224,19452,20092,19064,19484,19248,20072,20060,19316,19684,19524,19772,19716,19396,20172,19156,19428,19640,20052,19984,19092,19568,19380,19128,19284,19496,19616,19188,19496,19176,19696,19820,19660,19632,19208,19752,19720,19712,18876,19576,20032,19700,19748,19344,19268,19520,19552,19100,19500,19744,19088,19504,19312,19392,19164,19864,19504,19440,19256,19604,19520,19060,19176,19352,19084,19240,19360,19484,19208,19444,19592,19504,19228,19356,19316,19612,19636,19576,19256,19544,18976,19432,19984,19048,19420,19684,19644,19560,19552,19404,19392,19984,19884,19892,19716,19252,19668,19684,19460,19592,19288,19536,19436,19596,19720,19016,19516,19720,20076,19752,19264,19120,19360,19436,19088,19520,20080,19828,19344,19724,19716,19068,20228,19516,19784,18900,19452,19752,19484,19480,19764,19844,19760,19632,18868,20340,19320,19576,19684,19660,19832,19568,19720,19648,19516,19236,19044,19412,19996,19556,19340,19556,19148,19280,19360,19424,19692,19160,19188,19524,19908,19268,19760,19872,19620,19396,19460,19092,18984,19288,19916,19468,19620,19520,19432,19472,19796,19540,19644,19964,19436,19824,19496,19548,19092,19332,19388,19472,19484,19028,20000,19684,19320,19052,19188,19240,19616,19476,20020,19528,19508,19484,19800,19528,19924,19488,19472,18932,19500,19600,19492,19552,19336,19132,19696,19344,19368,19684,19272,19220,20408,19012,19764,18900,19476,19480,19676,19124,19404,19800,19648,19340,19644,19568,19384,19480,19392,19276,19388,19800,19588,19308,20276,19020,19240,19632,19184,19672,19540,19700,19316,19624,19408,18964,19448,19164,19576,19732,19260,19696,19556,19540,19372,19376,19636,19496,19676,19384,18964,19584,19416,19476,19472,19448,19840,19924,19476,19628,19460,19560,19552,19116,19168,18960,19616,20080,19644,19472,19604,19328,19096,19132,19428,19416,19476,20132,19296,19812,19380,19548,19380,19328,19520,19272,19544,19348,19808,19808,19756,19792,19792,19600,19644,19456,19584,19536,19376,19452,19684,19704,19400,19268,19516,19644,19196,19644,19656,18836,19736,19188,19368,19768,20104,19140,18648,19448,19596,19396,19292,19716,19068,19592,19504,19628,19460,18996,19288,19120,20036,19480,19376,19788,19760,19472,19988,19636,19872,19616,19372,19628,19676,19512,20108,19596,19416,19596,19040,19728,19388,19148,19304,19440,18960,19868,19736,19848,19384,19688,19404,19492,19320,19232,19408,19552,19716,19408,19336,20064,19628,19616,19764,19296,19436,19420,19308,19748,19504,19396,19500,19488,19672,19444,19664,19776,19244,19796,19692,19640,19716,19180,20032,19536,19640,19892,19764,19264,20040,19584,20040,19660,19280,19512,19456,19420,19720,19412,19728,19632,19816,20056,19688,19572,19580,19696,19664,19472,19212,19528,19716,19080,19340,19424,19844,19396,20120,19304,19552,19208,19532,19748,19464,19372,19096,19416,19480,19876,19588,19708,19860,19324,19528,19908,19384,19716,19176,19176,19712,19468,19636,19496,19476,19792,18912,19528,19644,19368,19372,19084,19216,19532,19212,19632,19848,19896,19892,19600,19568,19584,19264,19388,19644,19044,19352,19732,19204,19908,19968,19428,19436,19496,19232,19420,19932,19336,19388,19604,19596,19484,19472,19820,19260,19280,19140,19284,19728,19628,19692,19380,19468,19340,20140,19072,19588,19508,19564,19704,19852,19960,19300,19008,19584,19776,19996,19432,19456,19332,19380,19740,19924,19664,19672,19476,19628,19752,19268,19492,19396,19780,19852,19784,19748,19324,19760,19744,19512,19908,19496,19164,19252,19544,19560,19640,19532,19424,19788,19252,19588,19480,19216,19216,19628,19788,19072,19328,19060,19524,19344,19260,19768,18776,19156,19392,20100,19624,19340,18768,19716,19768,19460,19408,19740,19752,19608,19740,19556,19744,19444,19448,19976,19900,20036,19468,19892,19404,19484,19296,19768,19384,19604,19528,19500,19540,18976,19608,19244,19840,19492,19108,19788,19792,19308,19636,19920,19588,19376,19324,19768,19412,19744,19716,19276,19532,19320,20008,20048,19040,19632,19012,19324,19768,19260,19860,19572,19944,19508,19400,19320,19340,19252,19436,19408,19864,19256,19284,19376,19324,20000,19408,19220,19576,19524,19336,20076,19596,19680,20052,19580,19884,19848,19332,19528,19932,19436,19660,19704,19860,19428,19640,19388,19372,19404,19372,19588,19808,19744,19408,19784,19224,19824,19468,19428,19192,19400,19544,18972,19432,19736,19540,19544,19488,19784,19244,19404,19092,19216,19972,19420,19512,19496,19720,19660,19704,19336,19428,19740,19708,19644,19300,19472,19816,19476,19372,19912,19572,19528,19360,19264,19904,19764,19352,19660,19848,19672,19236,19232,19168,19332,19640,19396,19536,19156,19436,19732,19240,19720,19848,19660,19548,19212,19672,19472,19812,19036,19512,19136,19364,19388,19312,19084,19344,19532,19504,19000,19676,19640,19596,19616,19760,19680,19224,19696,19436,19656,19956,19476,19340,19808,19548,19536,19368,19468,20028,19452,19360,20032,19500,19540,19632,19740,20236,19668,19672,19928,19416,18940,19452,19488,19692,19884,19556,19552,19768,19144,19368,19424,19356,19508,19536,19936,19596,19288,19508,19472,19452,19036,19464,20036,20096,19728,18924,19884,19456,19668,20212,19648,19368,19560,19512,19396,19900,19504,19336,18908,19592,19840,18960,19800,19860,19488,19712,19392,19760,19012,19360,19928,19864,19456,19296,19300,19692,19776,19352,19632,19508,19864,19472,19324,19828,19440,19868,19440,19472,19656,19472,19240,18932,19956,19708,19636,19596,19684,19052,18904,19176,20024,19800,19396,19072,19812,19768,19636,19484,19600,19380,19288,19892,20512,19652,19736,19884,19872,20020,19440,19672,19448,19080,19556,19928,19760,19576,19876,19936,20008,19104,19428,19268,19056,19408,19240,19372,19684,19796,19192,19412,19548,19204,19728,19620,19248,19704,19568,19420,19556,19936,19932,19532,19712,19288,19488,19292,19680,19828,19900,19620,19336,19592,19620,18904,19340,19380,19184,19344,20596,19684,19940,19556,19240,19160,19504,19644,19824,19648,19724,19328,19664,19276,19928,19356,19796,19628,19836,18924,19252,19852,19544,19536,19684,19244,20012,19596,19852,19816,19580,19656,19344,19488,19460,19740,19032,19636,19392,19668,19884,19308,19532,19444,19904,19564,20180,19552,19456,20068,19860,19752,19668,19560,19740,19764,19804,20188,19576,18984,18960,20136,19664,20060,20144,19288,19548,19708,19688,19092,19700,19352,19736,19192,19764,19612,19512,19800,19444,19628,20104,19356,19716,19052,19516,19536,19840,19460,19524,19532,19608,18928,19396,19412,19552,19392,19324,18888,19380,19616,19644,20016,20084,19812,19428,19752,19908,20256,20020,19464,19396,19176,19612,19068,19732,19640,19112,18868,19860,19628,19548,19924,19908,19160,19672,19624,19600,19796,19176,19460,19364,19192,19596,19056,19424,19476,19688,19440,19588,20020,19780,19516,19232,19792,19928,19088,19592,19396,19756,19416,19884,20136,19520,19516,19640,19104,19632,20008,19508,19788,19892,19544,19772,18936,19512,19084,19636,19408,19700,19732,19692,19460,19492,19152,20008,19104,19848,19944,19552,19304,19352,19868,19992,18960,20160,19828,19524,19380,19784,19452,19656,19368,19692,19696,19748,19820,18976,19652,19608,19580,19352,19784,19212,19720,19408,19432,19196,19632,19484,19444,19532,20028,19432,19536,18932,19588,19436,19480,19404,19688,19352,19092,18944,19448,18896,19320,19332,19272,19360,19324,19616,19096,19544,19908,19432,19456,19516,19496,19464,19328,19436,19324,20044,19676,19044,19236,19528,19748,19592,19344,19432,19840,19660,19256,19280,19360,19040,19936,19436,19232,20100,19584,19700,19388,19676,19492,19700,19832,19372,19572,19408,19236,19264,18904,19464,19288,19748,18844,19400,19420,19244,19544,19912,19924,19268,19732,19616,19316,19128,19336,19824,19140,20176,19732,19480,19804,19760,19552,19828,19376,19972,20084,19740,19512,19716,19416,19136,20060,19140,19536,19432,19596,19616,19624,20184,19132,19796,19356,19596,19252,19716,19992,19608,19584,19748,19464,19816,19584,19264,19984,19504,19540,19448,19612,19500,19644,19628,19180,18800,19472,19560,19456,19256,19316,19928,19676,19596,19508,19404,20032,19352,19724,19684,19104,19676,19232,19352,19828,19272,19352,19092,19572,19624,19896,19164,19408,19524,19892,19420,19768,19568,19384,19592,19200,19528,19724,19548,19800,19676,18976,19412,19076,18988,19556,20092,19484,18912,19960,19480,19668,19388,19096,19860,19216,19668,19872,19640,19084,19332,19400,19764,19828,19728,19592,19872,19308,19456,19660,19396,19168,19036,19968,19696,18780,19288,19536,19952,19632,19424,20124,19168,19808,19228,19704,19288,18988,18760,19264,19480,19368,19824,19844,19980,19744,19508,19508,19384,19804,19444,19664,19552,19480,19644,19480,19360,19780,19652,19292,19324,20164,19532,19564,19156,19028,19876,19736,19088,18908,19352,19808,19676,19236,19224,19740,19788,20052,19336,19144,19268,19548,20044,19280,19352,19568,19628,19840,19732,19444,19352,19612,19736,19164,19576,19436,20092,19208,19904,19440,19676,19148,19828,19648,19616,19560,19768,19432,19368,19824,19620,19528,19268,19616,19484,19360,19768,19612,19436,19512,19576,19312,19624,19092,19360,19912,19520,19808,19464,19300,19108,20012,19840,19004,19620,19024,19548,19412,20104,19900,19160,20044,19588,19380,19660,19304,19824,19128,19124,19312,19368,19216,19380,19480,19840,19308,19372,19372,20032,19404,19708,19740,19400,19908,19344,19648,19472,19200,19804,19840,19436,19904,19648,19632,19784,20176,19788,19552,19444,19032,19520,19516,19180,19436,20020,19192,20032,19544,19772,19400,19432,19676,19488,19624,19592,19668,19688,18968,19368,19956,18932,19856,19892,19660,19332,19756,19800,19312,19480,19160,19392,19100,19416,19512,19868,19976,19440,19672,19736,20000,19712,20048,18944,19128,19496,19160,19896,19688,19716,18992,19532,19868,19536,19116,19504,19724,20208,19592,19340,19516,19980,19764,19712,20108,20104,19644,19008,19668,19156,19496,19212,19668,19060,20000,19656,18760,19656,19696,19520,19472,19800,19444,19336,19128,19324,19416,19476,19448,19540,19200,19512,19664,20160,19076,19312,19368,19784,19876,19724,19440,19404,20184,19592,19788,19444,19996,19332,19920,18960,19356,19516,19788,19536,19152,19304,19160,19272,19724,19764,19172,18976,19616,19400,19356,19208,19660,19304,19720,19556,19156,19472,19500,19784,18952,19380,19492,19596,19596,19504,19572,18824,19768,20064,19632,19372,19928,20116,19520,19912,19508,19596,19080,19888,19748,19724,19240,19276,19800,19328,19220,19456,19368,19656,19864,19736,19472,19716,19324,19480,19452,19528,19500,19456,20268,19952,20108,19464,19660,19240,19264,19120,19300,19412,19156,19684]}]},"null_count":0,"tot_col_size":195772684,"last_update_version":401695328109854723},"ps_suppkey":{"histogram":{"ndv":490496,"buckets":[{"count":160000,"lower_bound":"MTk=","upper_bound":"MTI3MQ==","repeats":81},{"count":320000,"lower_bound":"MTI4Nw==","upper_bound":"MzE2Ng==","repeats":81},{"count":480000,"lower_bound":"MzI5MA==","upper_bound":"NTI4Mw==","repeats":81},{"count":640000,"lower_bound":"NTM5Ng==","upper_bound":"NzU5MQ==","repeats":4081},{"count":800000,"lower_bound":"NzU5OQ==","upper_bound":"OTk5Mw==","repeats":81},{"count":960000,"lower_bound":"MTAwMDQ=","upper_bound":"MTI1NTY=","repeats":81},{"count":1120000,"lower_bound":"MTI2MTI=","upper_bound":"MTQ4NzM=","repeats":81},{"count":1280000,"lower_bound":"MTQ4Nzc=","upper_bound":"MTY5MzM=","repeats":81},{"count":1440000,"lower_bound":"MTcwMDc=","upper_bound":"MTkzNjU=","repeats":81},{"count":1600000,"lower_bound":"MTkzOTc=","upper_bound":"MjE1MDQ=","repeats":81},{"count":1760000,"lower_bound":"MjE1MTQ=","upper_bound":"MjM2MzE=","repeats":81},{"count":1920000,"lower_bound":"MjM2NDQ=","upper_bound":"MjYyMzI=","repeats":81},{"count":2080000,"lower_bound":"MjYyNTc=","upper_bound":"MjgxMjI=","repeats":81},{"count":2240000,"lower_bound":"MjgxNjE=","upper_bound":"MzAxNTY=","repeats":81},{"count":2400000,"lower_bound":"MzAxNzI=","upper_bound":"MzIwNDI=","repeats":81},{"count":2560000,"lower_bound":"MzIwODA=","upper_bound":"MzM2OTE=","repeats":81},{"count":2720000,"lower_bound":"MzM3MTc=","upper_bound":"MzYwODA=","repeats":81},{"count":2880000,"lower_bound":"MzYxODk=","upper_bound":"Mzg1MTY=","repeats":81},{"count":3040000,"lower_bound":"Mzg1MzM=","upper_bound":"NDAzNDM=","repeats":81},{"count":3200000,"lower_bound":"NDAzNTQ=","upper_bound":"NDI4MjM=","repeats":81},{"count":3360000,"lower_bound":"NDI4Mjg=","upper_bound":"NDQ0MDk=","repeats":81},{"count":3520000,"lower_bound":"NDQ0MTQ=","upper_bound":"NDYwNDM=","repeats":81},{"count":3680000,"lower_bound":"NDYwNTc=","upper_bound":"NDgyMjI=","repeats":81},{"count":3840000,"lower_bound":"NDgyMzU=","upper_bound":"NTAzNDE=","repeats":81},{"count":4000000,"lower_bound":"NTA0NTE=","upper_bound":"NTIyNDc=","repeats":81},{"count":4160000,"lower_bound":"NTIyNjE=","upper_bound":"NTQyNzU=","repeats":81},{"count":4320000,"lower_bound":"NTQzMDc=","upper_bound":"NTY0MDE=","repeats":81},{"count":4480000,"lower_bound":"NTY0MDc=","upper_bound":"NTgyMDQ=","repeats":81},{"count":4640000,"lower_bound":"NTgyMTk=","upper_bound":"NjAyMTg=","repeats":81},{"count":4800000,"lower_bound":"NjAzMzQ=","upper_bound":"NjE3NDc=","repeats":81},{"count":4960000,"lower_bound":"NjE4MDQ=","upper_bound":"NjM5NDM=","repeats":81},{"count":5120000,"lower_bound":"NjM5NjQ=","upper_bound":"NjYwMzg=","repeats":81},{"count":5280000,"lower_bound":"NjYwODQ=","upper_bound":"NjgwODQ=","repeats":81},{"count":5440000,"lower_bound":"NjgwOTI=","upper_bound":"Njk3Njg=","repeats":81},{"count":5600000,"lower_bound":"Njk4MDA=","upper_bound":"NzIzODg=","repeats":81},{"count":5760000,"lower_bound":"NzI0OTQ=","upper_bound":"NzQ2ODI=","repeats":81},{"count":5920000,"lower_bound":"NzQ3MTM=","upper_bound":"NzY0NjA=","repeats":81},{"count":6080000,"lower_bound":"NzY1NzA=","upper_bound":"NzgwMjM=","repeats":81},{"count":6240000,"lower_bound":"NzgwOTM=","upper_bound":"ODAzMDE=","repeats":81},{"count":6400000,"lower_bound":"ODAzMDY=","upper_bound":"ODIxNjE=","repeats":81},{"count":6560000,"lower_bound":"ODIxOTE=","upper_bound":"ODQwNjU=","repeats":81},{"count":6720000,"lower_bound":"ODQxMDE=","upper_bound":"ODYwMTM=","repeats":81},{"count":6880000,"lower_bound":"ODYwMTk=","upper_bound":"ODc4NjE=","repeats":81},{"count":7040000,"lower_bound":"ODc4OTE=","upper_bound":"ODk1NDc=","repeats":81},{"count":7200000,"lower_bound":"ODk1NzI=","upper_bound":"OTE1MzI=","repeats":81},{"count":7360000,"lower_bound":"OTE2NjE=","upper_bound":"OTM4MTE=","repeats":81},{"count":7520000,"lower_bound":"OTM4MTM=","upper_bound":"OTU3MjM=","repeats":81},{"count":7680000,"lower_bound":"OTU5MzE=","upper_bound":"OTc3MDk=","repeats":81},{"count":7840000,"lower_bound":"OTc3MjE=","upper_bound":"OTg5MDE=","repeats":81},{"count":8000000,"lower_bound":"OTg5MzI=","upper_bound":"MTAwOTg4","repeats":81},{"count":8160000,"lower_bound":"MTAxMDMz","upper_bound":"MTAyODg0","repeats":81},{"count":8320000,"lower_bound":"MTAyOTMz","upper_bound":"MTA1MDI1","repeats":81},{"count":8480000,"lower_bound":"MTA1MTQ2","upper_bound":"MTA2Njc3","repeats":81},{"count":8640000,"lower_bound":"MTA2Njc5","upper_bound":"MTA4MzUy","repeats":81},{"count":8800000,"lower_bound":"MTA4Mzcy","upper_bound":"MTEwMzUy","repeats":81},{"count":8960000,"lower_bound":"MTEwMzU0","upper_bound":"MTEyMTcz","repeats":81},{"count":9120000,"lower_bound":"MTEyMTc3","upper_bound":"MTEzNDQ4","repeats":81},{"count":9280000,"lower_bound":"MTEzNTI4","upper_bound":"MTE1NzUw","repeats":81},{"count":9440000,"lower_bound":"MTE1NzY4","upper_bound":"MTE3MzE4","repeats":81},{"count":9600000,"lower_bound":"MTE3Mzk5","upper_bound":"MTIwMDU3","repeats":81},{"count":9760000,"lower_bound":"MTIwMDg0","upper_bound":"MTIxNTAw","repeats":81},{"count":9920000,"lower_bound":"MTIxNTE4","upper_bound":"MTIzNjA5","repeats":81},{"count":10080000,"lower_bound":"MTIzNjUz","upper_bound":"MTI1NjM4","repeats":81},{"count":10240000,"lower_bound":"MTI1NjY4","upper_bound":"MTI3MjM2","repeats":81},{"count":10400000,"lower_bound":"MTI3MjYy","upper_bound":"MTI5NTEy","repeats":81},{"count":10560000,"lower_bound":"MTI5NTg0","upper_bound":"MTMxMzIy","repeats":81},{"count":10720000,"lower_bound":"MTMxMzMx","upper_bound":"MTM0MDY1","repeats":81},{"count":10880000,"lower_bound":"MTM0MTc0","upper_bound":"MTM2NzEy","repeats":81},{"count":11040000,"lower_bound":"MTM2NzM0","upper_bound":"MTM4MTYy","repeats":81},{"count":11200000,"lower_bound":"MTM4MTcw","upper_bound":"MTQwNzc5","repeats":81},{"count":11360000,"lower_bound":"MTQwNzg2","upper_bound":"MTQyMzM3","repeats":81},{"count":11520000,"lower_bound":"MTQyNTk0","upper_bound":"MTQ0OTY4","repeats":81},{"count":11680000,"lower_bound":"MTQ0OTgw","upper_bound":"MTQ3MTEx","repeats":81},{"count":11840000,"lower_bound":"MTQ3Mjg0","upper_bound":"MTQ5NjMx","repeats":81},{"count":12000000,"lower_bound":"MTQ5Njk3","upper_bound":"MTUxNTM1","repeats":81},{"count":12160000,"lower_bound":"MTUxNjA4","upper_bound":"MTUzMzMz","repeats":81},{"count":12320000,"lower_bound":"MTUzNTE1","upper_bound":"MTU1OTg1","repeats":81},{"count":12480000,"lower_bound":"MTU1OTk3","upper_bound":"MTU4MDY3","repeats":81},{"count":12640000,"lower_bound":"MTU4MDc2","upper_bound":"MTYwMTkz","repeats":81},{"count":12800000,"lower_bound":"MTYwMjA5","upper_bound":"MTYyMjgx","repeats":81},{"count":12964000,"lower_bound":"MTYyMzMx","upper_bound":"MTY0MTc4","repeats":4081},{"count":13124000,"lower_bound":"MTY0MTk5","upper_bound":"MTY2NTU0","repeats":81},{"count":13284000,"lower_bound":"MTY2NjQw","upper_bound":"MTY5MzAy","repeats":81},{"count":13444000,"lower_bound":"MTY5NTc4","upper_bound":"MTcxNzg5","repeats":81},{"count":13604000,"lower_bound":"MTcxODA0","upper_bound":"MTc0MzMw","repeats":81},{"count":13764000,"lower_bound":"MTc0NDIx","upper_bound":"MTc2MzE5","repeats":81},{"count":13924000,"lower_bound":"MTc2Mzgy","upper_bound":"MTc5MDYw","repeats":81},{"count":14084000,"lower_bound":"MTc5MDkx","upper_bound":"MTgxMTgx","repeats":81},{"count":14244000,"lower_bound":"MTgxMjk2","upper_bound":"MTgzMDY0","repeats":81},{"count":14404000,"lower_bound":"MTgzMDg1","upper_bound":"MTg1MDkx","repeats":81},{"count":14564000,"lower_bound":"MTg1MDky","upper_bound":"MTg3MzIy","repeats":81},{"count":14724000,"lower_bound":"MTg3MzUw","upper_bound":"MTg5MTUw","repeats":81},{"count":14884000,"lower_bound":"MTg5MTU2","upper_bound":"MTkxNjg4","repeats":81},{"count":15044000,"lower_bound":"MTkxNzQx","upper_bound":"MTkzMzE1","repeats":81},{"count":15204000,"lower_bound":"MTkzMzE2","upper_bound":"MTk1Mjcz","repeats":81},{"count":15364000,"lower_bound":"MTk1Mjk2","upper_bound":"MTk2NzI5","repeats":81},{"count":15524000,"lower_bound":"MTk2Nzcz","upper_bound":"MTk4NDk0","repeats":81},{"count":15684000,"lower_bound":"MTk4NTc4","upper_bound":"MjAwMjA5","repeats":81},{"count":15844000,"lower_bound":"MjAwMzkx","upper_bound":"MjAyMjE1","repeats":81},{"count":16004000,"lower_bound":"MjAyMjIz","upper_bound":"MjA0MzEz","repeats":81},{"count":16164000,"lower_bound":"MjA0Mzc4","upper_bound":"MjA2Njcx","repeats":81},{"count":16324000,"lower_bound":"MjA2NzIy","upper_bound":"MjA4NzM5","repeats":81},{"count":16484000,"lower_bound":"MjA4ODE0","upper_bound":"MjEwODM2","repeats":81},{"count":16644000,"lower_bound":"MjEwODQ5","upper_bound":"MjEyOTcz","repeats":81},{"count":16804000,"lower_bound":"MjEzMDg5","upper_bound":"MjE0Njc5","repeats":81},{"count":16964000,"lower_bound":"MjE0OTAw","upper_bound":"MjE2OTM5","repeats":81},{"count":17124000,"lower_bound":"MjE2OTU2","upper_bound":"MjE4Njkw","repeats":81},{"count":17284000,"lower_bound":"MjE4NzA2","upper_bound":"MjIxMzc1","repeats":81},{"count":17444000,"lower_bound":"MjIxNDA1","upper_bound":"MjIzNjQz","repeats":81},{"count":17604000,"lower_bound":"MjIzNjg0","upper_bound":"MjI1NTEw","repeats":81},{"count":17764000,"lower_bound":"MjI1NjIx","upper_bound":"MjI3ODky","repeats":81},{"count":17924000,"lower_bound":"MjI3OTEw","upper_bound":"MjI5OTAy","repeats":81},{"count":18084000,"lower_bound":"MjI5OTcz","upper_bound":"MjMxNjEy","repeats":81},{"count":18244000,"lower_bound":"MjMxNjU3","upper_bound":"MjMzOTc4","repeats":81},{"count":18404000,"lower_bound":"MjM0MDYx","upper_bound":"MjM2MTI2","repeats":81},{"count":18564000,"lower_bound":"MjM2MTYz","upper_bound":"MjM3OTQx","repeats":81},{"count":18724000,"lower_bound":"MjM4MDM5","upper_bound":"MjM5NzUx","repeats":81},{"count":18884000,"lower_bound":"MjM5Nzc0","upper_bound":"MjQxNjA0","repeats":81},{"count":19044000,"lower_bound":"MjQxNjUw","upper_bound":"MjQzNDM3","repeats":81},{"count":19204000,"lower_bound":"MjQzNDUx","upper_bound":"MjQ1NDkw","repeats":81},{"count":19364000,"lower_bound":"MjQ1NTQx","upper_bound":"MjQ4MDYw","repeats":81},{"count":19524000,"lower_bound":"MjQ4MTQx","upper_bound":"MjQ5Nzcy","repeats":81},{"count":19684000,"lower_bound":"MjQ5Nzgz","upper_bound":"MjUwNzE4","repeats":81},{"count":19844000,"lower_bound":"MjUwNzU0","upper_bound":"MjUxOTc5","repeats":81},{"count":20004000,"lower_bound":"MjUyMTEz","upper_bound":"MjU0NDU4","repeats":81},{"count":20164000,"lower_bound":"MjU0NTg5","upper_bound":"MjU2Nzg3","repeats":81},{"count":20324000,"lower_bound":"MjU2ODQ2","upper_bound":"MjU5MTMy","repeats":81},{"count":20484000,"lower_bound":"MjU5MTUx","upper_bound":"MjYxMjAy","repeats":81},{"count":20648000,"lower_bound":"MjYxMjEz","upper_bound":"MjYzNDMx","repeats":4081},{"count":20808000,"lower_bound":"MjYzNTM1","upper_bound":"MjY1NDI3","repeats":81},{"count":20968000,"lower_bound":"MjY1NDkw","upper_bound":"MjY3Mjc5","repeats":81},{"count":21128000,"lower_bound":"MjY3MzA1","upper_bound":"MjY5MzQ4","repeats":81},{"count":21288000,"lower_bound":"MjY5NTY3","upper_bound":"MjcwNjg2","repeats":81},{"count":21448000,"lower_bound":"MjcwNzcx","upper_bound":"MjcyNDA1","repeats":81},{"count":21608000,"lower_bound":"MjcyNDQy","upper_bound":"Mjc0MjA0","repeats":81},{"count":21768000,"lower_bound":"Mjc0MjM3","upper_bound":"Mjc2MTU4","repeats":81},{"count":21928000,"lower_bound":"Mjc2Mjc5","upper_bound":"Mjc4MjA2","repeats":81},{"count":22088000,"lower_bound":"Mjc4MjA4","upper_bound":"MjgwNTYx","repeats":81},{"count":22248000,"lower_bound":"MjgwNTg0","upper_bound":"MjgyNDk1","repeats":81},{"count":22408000,"lower_bound":"MjgyNTU2","upper_bound":"Mjg0Nzc5","repeats":81},{"count":22568000,"lower_bound":"Mjg0ODI3","upper_bound":"Mjg2NzE4","repeats":81},{"count":22728000,"lower_bound":"Mjg2NzM3","upper_bound":"Mjg4NzI1","repeats":81},{"count":22888000,"lower_bound":"Mjg4NzQz","upper_bound":"MjkwNzcx","repeats":81},{"count":23048000,"lower_bound":"MjkwODYx","upper_bound":"MjkyOTI2","repeats":81},{"count":23208000,"lower_bound":"MjkyOTMy","upper_bound":"Mjk0ODE5","repeats":81},{"count":23368000,"lower_bound":"Mjk0ODYz","upper_bound":"Mjk2MjY0","repeats":81},{"count":23528000,"lower_bound":"Mjk2MzU4","upper_bound":"Mjk4NDY0","repeats":81},{"count":23688000,"lower_bound":"Mjk4NTQ2","upper_bound":"Mjk5OTYx","repeats":81},{"count":23848000,"lower_bound":"MzAwMTM0","upper_bound":"MzAxODY0","repeats":81},{"count":24008000,"lower_bound":"MzAxODgx","upper_bound":"MzA0MTM1","repeats":81},{"count":24168000,"lower_bound":"MzA0MTUy","upper_bound":"MzA2MTU2","repeats":81},{"count":24332000,"lower_bound":"MzA2MTgx","upper_bound":"MzA3NTg3","repeats":4081},{"count":24492000,"lower_bound":"MzA3NjEy","upper_bound":"MzA5NDE1","repeats":81},{"count":24652000,"lower_bound":"MzA5NDM5","upper_bound":"MzExNTQ3","repeats":81},{"count":24812000,"lower_bound":"MzExNjQ3","upper_bound":"MzEzNDc1","repeats":81},{"count":24972000,"lower_bound":"MzEzNTI4","upper_bound":"MzE1MzQz","repeats":81},{"count":25132000,"lower_bound":"MzE1MzU5","upper_bound":"MzE4MjI2","repeats":81},{"count":25292000,"lower_bound":"MzE4MjQ1","upper_bound":"MzIwNTAx","repeats":81},{"count":25452000,"lower_bound":"MzIwNjA2","upper_bound":"MzIyNjY3","repeats":81},{"count":25612000,"lower_bound":"MzIyNzU3","upper_bound":"MzI0NzQz","repeats":81},{"count":25772000,"lower_bound":"MzI0NzU4","upper_bound":"MzI2MDc0","repeats":81},{"count":25932000,"lower_bound":"MzI2MDc2","upper_bound":"MzI3NjIx","repeats":81},{"count":26096000,"lower_bound":"MzI3NzA5","upper_bound":"MzI5NDcx","repeats":4081},{"count":26256000,"lower_bound":"MzI5NjQ1","upper_bound":"MzMxODcx","repeats":81},{"count":26416000,"lower_bound":"MzMxODc2","upper_bound":"MzM0NDI2","repeats":81},{"count":26576000,"lower_bound":"MzM0NDU0","upper_bound":"MzM2Mzg5","repeats":81},{"count":26736000,"lower_bound":"MzM2NTM0","upper_bound":"MzM4Nzcw","repeats":81},{"count":26896000,"lower_bound":"MzM4ODA4","upper_bound":"MzQwODIx","repeats":81},{"count":27056000,"lower_bound":"MzQwODMw","upper_bound":"MzQyMjgy","repeats":81},{"count":27216000,"lower_bound":"MzQyMzQ5","upper_bound":"MzQzOTk5","repeats":81},{"count":27376000,"lower_bound":"MzQ0MDEw","upper_bound":"MzQ1Nzg5","repeats":81},{"count":27536000,"lower_bound":"MzQ1ODY2","upper_bound":"MzQ3NzI4","repeats":81},{"count":27696000,"lower_bound":"MzQ3NzQ4","upper_bound":"MzQ5NjEy","repeats":81},{"count":27856000,"lower_bound":"MzQ5NjMx","upper_bound":"MzUyMDk0","repeats":81},{"count":28016000,"lower_bound":"MzUyMTA2","upper_bound":"MzU0MTQw","repeats":81},{"count":28176000,"lower_bound":"MzU0MjMx","upper_bound":"MzU1NTg2","repeats":81},{"count":28336000,"lower_bound":"MzU1Njc2","upper_bound":"MzU3MzMz","repeats":81},{"count":28496000,"lower_bound":"MzU3MzM5","upper_bound":"MzU5MTMw","repeats":81},{"count":28656000,"lower_bound":"MzU5Mjgy","upper_bound":"MzYxNDUw","repeats":81},{"count":28816000,"lower_bound":"MzYxNTIx","upper_bound":"MzYzMjY4","repeats":81},{"count":28976000,"lower_bound":"MzYzMzMz","upper_bound":"MzY0ODEw","repeats":81},{"count":29136000,"lower_bound":"MzY0ODg5","upper_bound":"MzY2ODUy","repeats":81},{"count":29296000,"lower_bound":"MzY2ODU2","upper_bound":"MzY4NzY2","repeats":81},{"count":29456000,"lower_bound":"MzY4ODgy","upper_bound":"MzcwNDQy","repeats":81},{"count":29616000,"lower_bound":"MzcwNDgx","upper_bound":"MzczNDE1","repeats":81},{"count":29776000,"lower_bound":"MzczNDQ5","upper_bound":"Mzc1MTkw","repeats":81},{"count":29936000,"lower_bound":"Mzc1MjEx","upper_bound":"Mzc2MzAw","repeats":81},{"count":30096000,"lower_bound":"Mzc2MzIw","upper_bound":"Mzc4MDI3","repeats":81},{"count":30256000,"lower_bound":"Mzc4MDMz","upper_bound":"Mzc5NjI5","repeats":81},{"count":30416000,"lower_bound":"Mzc5NjM1","upper_bound":"MzgxNjcw","repeats":81},{"count":30576000,"lower_bound":"MzgxNzQy","upper_bound":"MzgzNDQ1","repeats":81},{"count":30736000,"lower_bound":"MzgzNTg2","upper_bound":"Mzg1MjMw","repeats":81},{"count":30896000,"lower_bound":"Mzg1MjMz","upper_bound":"Mzg3NDQ0","repeats":81},{"count":31056000,"lower_bound":"Mzg3NTE0","upper_bound":"Mzg5MDg5","repeats":81},{"count":31216000,"lower_bound":"Mzg5MTEx","upper_bound":"MzkxMzMy","repeats":81},{"count":31376000,"lower_bound":"MzkxMzUz","upper_bound":"MzkzNDQ3","repeats":81},{"count":31536000,"lower_bound":"MzkzNDU4","upper_bound":"Mzk1NDY2","repeats":81},{"count":31696000,"lower_bound":"Mzk1NDg1","upper_bound":"Mzk3MDU0","repeats":81},{"count":31856000,"lower_bound":"Mzk3MTAx","upper_bound":"Mzk4ODE5","repeats":81},{"count":32016000,"lower_bound":"Mzk4ODU2","upper_bound":"NDAxMDMw","repeats":81},{"count":32176000,"lower_bound":"NDAxMTE3","upper_bound":"NDAyOTYw","repeats":81},{"count":32336000,"lower_bound":"NDAzMDA5","upper_bound":"NDA0OTg3","repeats":81},{"count":32496000,"lower_bound":"NDA1MDQz","upper_bound":"NDA2NTEx","repeats":81},{"count":32656000,"lower_bound":"NDA2NTIy","upper_bound":"NDA5MDI0","repeats":81},{"count":32816000,"lower_bound":"NDA5MDM4","upper_bound":"NDExMjUx","repeats":81},{"count":32976000,"lower_bound":"NDExMjU2","upper_bound":"NDEzNDIz","repeats":81},{"count":33136000,"lower_bound":"NDEzNDg5","upper_bound":"NDE1NDU3","repeats":81},{"count":33296000,"lower_bound":"NDE1NDY2","upper_bound":"NDE3ODUz","repeats":81},{"count":33456000,"lower_bound":"NDE3ODgw","upper_bound":"NDE5NzM1","repeats":81},{"count":33616000,"lower_bound":"NDE5Nzk2","upper_bound":"NDIyMDAw","repeats":81},{"count":33776000,"lower_bound":"NDIyMDY3","upper_bound":"NDI0MDIw","repeats":81},{"count":33936000,"lower_bound":"NDI0MDUx","upper_bound":"NDI1OTM3","repeats":81},{"count":34096000,"lower_bound":"NDI1OTc2","upper_bound":"NDI3OTQ4","repeats":81},{"count":34256000,"lower_bound":"NDI4MDAw","upper_bound":"NDMwMzgz","repeats":81},{"count":34416000,"lower_bound":"NDMwNDIw","upper_bound":"NDMyMzY0","repeats":81},{"count":34576000,"lower_bound":"NDMyNDAw","upper_bound":"NDM0NDg5","repeats":81},{"count":34736000,"lower_bound":"NDM0NTQy","upper_bound":"NDM2MzU5","repeats":81},{"count":34896000,"lower_bound":"NDM2NjMz","upper_bound":"NDM4MzI3","repeats":81},{"count":35056000,"lower_bound":"NDM4NDA2","upper_bound":"NDQwNDE0","repeats":81},{"count":35216000,"lower_bound":"NDQwNDU4","upper_bound":"NDQxOTE2","repeats":81},{"count":35376000,"lower_bound":"NDQxOTU1","upper_bound":"NDQzNjY4","repeats":81},{"count":35536000,"lower_bound":"NDQzNjk3","upper_bound":"NDQ2MzM4","repeats":81},{"count":35696000,"lower_bound":"NDQ2MzQz","upper_bound":"NDQ3OTU0","repeats":81},{"count":35856000,"lower_bound":"NDQ4MDQ2","upper_bound":"NDQ5ODA4","repeats":81},{"count":36016000,"lower_bound":"NDQ5ODE4","upper_bound":"NDUxODM3","repeats":81},{"count":36176000,"lower_bound":"NDUxODY0","upper_bound":"NDU0MTg0","repeats":81},{"count":36336000,"lower_bound":"NDU0MjE2","upper_bound":"NDU2MjE5","repeats":81},{"count":36496000,"lower_bound":"NDU2MjUw","upper_bound":"NDU4MzE3","repeats":81},{"count":36656000,"lower_bound":"NDU4NTgy","upper_bound":"NDYwMjQ0","repeats":81},{"count":36816000,"lower_bound":"NDYwMjYy","upper_bound":"NDYxODgz","repeats":81},{"count":36976000,"lower_bound":"NDYxOTY0","upper_bound":"NDYzMjg4","repeats":81},{"count":37136000,"lower_bound":"NDYzMzE4","upper_bound":"NDY1Mzk0","repeats":81},{"count":37296000,"lower_bound":"NDY1NDY0","upper_bound":"NDY3MDQw","repeats":81},{"count":37456000,"lower_bound":"NDY3MTI2","upper_bound":"NDY4NjE0","repeats":81},{"count":37620000,"lower_bound":"NDY4NjUy","upper_bound":"NDcxNTYw","repeats":4081},{"count":37780000,"lower_bound":"NDcxNTg4","upper_bound":"NDcyODI4","repeats":81},{"count":37940000,"lower_bound":"NDcyOTMz","upper_bound":"NDc0OTA4","repeats":81},{"count":38100000,"lower_bound":"NDc1MDY2","upper_bound":"NDc3MDY3","repeats":81},{"count":38260000,"lower_bound":"NDc3MjA4","upper_bound":"NDc5NDQw","repeats":81},{"count":38420000,"lower_bound":"NDc5NDk5","upper_bound":"NDgxMzMw","repeats":81},{"count":38584000,"lower_bound":"NDgxMzM5","upper_bound":"NDgyOTMx","repeats":4081},{"count":38744000,"lower_bound":"NDgyOTk2","upper_bound":"NDg1MTE3","repeats":81},{"count":38904000,"lower_bound":"NDg1Mjc1","upper_bound":"NDg2NzMy","repeats":81},{"count":39064000,"lower_bound":"NDg2ODcx","upper_bound":"NDg4NTIx","repeats":81},{"count":39224000,"lower_bound":"NDg4NTQ3","upper_bound":"NDg5NzYx","repeats":81},{"count":39384000,"lower_bound":"NDg5OTA3","upper_bound":"NDkxOTE0","repeats":81},{"count":39544000,"lower_bound":"NDkxOTM1","upper_bound":"NDk0MTIy","repeats":81},{"count":39704000,"lower_bound":"NDk0MTQz","upper_bound":"NDk2MDA4","repeats":81},{"count":39864000,"lower_bound":"NDk2MDMw","upper_bound":"NDk4NDMw","repeats":81},{"count":40000000,"lower_bound":"NDk4NDk2","upper_bound":"NDk5OTk0","repeats":81}]},"cm_sketch":{"rows":[{"counters":[19200,18720,19680,17040,19520,19040,19920,20480,18720,20000,18400,19200,18400,20720,19200,21520,20080,18160,20080,19120,19680,21120,20320,19920,21440,17920,20560,18800,21120,21440,18240,21920,17440,17520,19200,20240,18400,20640,17200,21760,19360,19360,20480,19520,18160,19280,20320,20000,16800,18640,18560,18000,18720,21200,18480,18640,20800,19680,18800,20800,18080,18880,19600,18640,19120,19280,18160,18640,18960,21200,19360,19280,18880,18640,20080,22640,18960,19520,18240,20240,18160,17600,20080,19040,20720,20320,18560,20320,15680,18080,18080,20560,21280,20160,18480,18640,21520,20480,20320,20800,18720,20800,21200,19120,19200,17440,20640,19840,20240,19600,17840,19200,21760,19200,21440,20720,19680,17360,20720,19600,20800,18960,20480,20640,16480,18720,19520,18640,20160,23040,20880,19920,19600,22720,20400,18000,20320,19040,18560,17440,19120,18480,18240,19600,21280,17760,18560,19920,19120,19680,19360,19360,19120,20240,18560,19280,19440,20640,19520,18480,19760,20000,18400,19920,20800,19760,21360,18880,20400,19520,17600,18800,18800,18480,22960,20320,20960,20080,20720,19280,20800,19440,20880,17920,19680,19920,18240,20880,20320,18880,20880,20800,19440,21040,18640,22480,18560,18960,19600,20400,20480,20000,18320,20640,19680,19760,18480,18160,20160,19120,18480,20480,20800,20480,17200,18240,17760,20080,19280,22000,19120,17120,19200,18240,17120,20320,19360,21760,18800,22240,19840,18320,19440,20480,18480,19680,21360,17440,16960,19280,19600,18880,20160,18240,19360,21040,19040,18480,17600,19840,21920,19360,20720,18000,20960,21040,22320,20320,19040,18320,20560,18640,17440,19200,22240,20640,21360,19680,20320,21040,21520,19840,17920,18240,21600,20000,18800,21280,17760,19440,20720,20160,18560,21520,18640,20720,19680,19840,19680,19120,20720,19360,17360,20240,20000,18880,18640,18320,18320,18960,19680,17360,18720,19840,20160,20720,18960,19520,20400,20240,20160,18160,18080,20800,19920,19520,19280,19840,20000,19280,20160,19840,19120,22080,18560,19200,19600,19520,20000,18400,18560,18880,18800,21120,20160,19360,20080,21520,19040,21440,21760,21600,19360,19200,18320,19040,18320,20000,20560,17680,21040,19120,19520,18240,19040,18480,19760,20720,20720,20160,16720,18800,19360,18960,18560,20400,20880,20320,19040,18720,18960,20640,18880,17360,19680,19600,20640,21120,19760,20480,19520,18080,20640,16960,18000,18480,19600,20000,18960,21280,18080,18320,19360,21280,17440,20720,19600,19520,17280,19840,18240,18800,19120,19120,18320,20160,20480,18160,19280,16560,18960,20160,18240,19680,20080,19680,20480,17920,20080,24800,20880,20000,19280,18480,18080,19440,18080,18400,20480,18880,19760,19120,18880,19760,21520,18240,20560,20240,19040,21680,19600,18080,18720,18240,17200,22240,19600,19680,18240,22400,18960,18080,20720,20960,18320,19440,21040,20000,20080,20000,17920,20800,19040,18560,17920,19280,20400,20000,20080,18880,19680,22080,20160,20960,18720,19920,21440,17440,19680,19120,19040,18000,22080,21280,18720,20480,19520,19680,17680,20000,17840,20080,18960,21920,19520,19760,20080,19120,19680,19040,21760,18240,19840,20400,19120,19200,19760,20240,19040,20000,18560,18960,20640,17680,17760,18240,19280,18160,21120,17760,19920,19040,18000,18560,20720,22000,17680,20320,19840,19920,19200,16720,22080,19600,18800,17440,18800,18480,18960,20160,20320,18800,19360,18800,18160,19760,17200,18400,20640,21440,18880,19360,18080,18800,20480,20240,20320,18480,19920,20560,18080,17120,17600,18640,20800,19360,20400,17440,19760,18960,18560,19840,18480,19200,17840,20000,16000,20160,18320,16560,19120,19600,18000,21360,20000,19040,20320,20000,19600,20240,17360,16800,21760,20960,20720,20400,19200,17520,19920,16960,19040,19760,18400,20800,21760,21680,20320,18800,17760,21040,20080,21280,20720,18880,17600,18320,20240,19200,20400,19520,18480,17680,19920,22320,18320,20400,17520,20160,19120,18000,17360,18880,19280,18960,18960,19280,20240,21200,19840,20800,18400,17360,18560,15600,16240,18720,18240,20480,19680,20960,18000,20640,19600,21680,19520,20000,19200,19200,18160,20640,20320,19360,17120,19680,21040,20400,23440,20880,22000,16480,18000,19120,20320,18000,19440,18320,21600,21760,21120,19520,18160,19440,18880,19680,20320,20720,17360,19680,20240,20240,17120,19840,22240,18720,19360,19600,18000,17280,20400,19200,17760,19600,19680,21040,18320,18960,19680,20320,18400,19040,20080,20560,21360,19680,19920,20160,20640,20560,20320,20640,20400,20000,19360,18880,19280,21120,19120,21120,16560,19680,19520,18080,19440,20320,20000,19440,19120,17920,20160,18560,19920,19360,18880,19360,19440,19120,19200,17920,20320,19920,17280,21120,18480,17760,21120,18640,18480,18720,18000,18800,20400,17760,16800,18480,17840,21440,18080,20400,18400,19440,17440,18560,20000,19840,18960,20240,20640,18400,15760,18560,20000,17920,19440,21200,20000,21360,19760,20240,20240,20880,18080,20960,21440,19680,18400,18800,18480,19840,19040,18480,20000,19760,19520,20960,17200,19360,20880,20800,18640,18480,19600,22960,21200,19280,19360,19360,19440,19280,18480,19280,16960,18080,21120,19680,19920,20640,19280,17360,17760,19120,19120,20560,19680,19280,20320,18800,20160,19920,18720,19040,17840,20720,20320,20080,18160,18880,18960,19680,19920,17920,22240,19520,21360,19760,18960,20240,21120,18320,21440,19840,19440,21040,19600,18960,21280,18800,18800,19200,17440,18640,18880,18080,21280,19040,20240,20400,19440,18960,18000,21920,18240,18240,19760,18320,18320,18000,17440,19440,15680,19200,18160,20320,21120,20720,17280,19440,19440,19040,21600,19840,19520,18880,17680,20240,19840,18640,21040,18960,18400,19200,20320,20240,18960,19040,18480,20000,19760,22080,19520,21200,18720,18480,18080,20080,20000,19520,21280,19200,21040,19840,18160,18720,19280,18960,18000,21280,19120,18480,18560,19440,18640,19040,19120,21440,18480,19520,18400,19440,19600,20560,20560,21600,18480,19360,17760,21760,18480,19280,18720,17680,19680,19520,19520,21040,21440,19680,21760,19920,19680,21040,21200,19200,20960,16720,18240,18400,17520,18800,20080,18400,19360,18480,18960,20320,19440,18960,17760,20720,18960,18640,17120,18240,18720,21520,18400,22560,19520,20960,21840,18560,19360,18480,18400,19200,20400,20960,20320,17280,19120,17200,20400,18320,19840,20640,19360,20480,18480,17440,21600,17680,18720,20800,19920,19680,18240,20160,18320,18880,20320,19440,20000,17280,18880,21520,19760,19760,21440,19040,18800,20480,19520,17920,20400,19760,21760,19360,19120,22240,20400,19680,19520,21120,19360,18240,19760,22080,17280,19600,20320,18160,20880,19200,19760,18640,20160,19280,20080,23440,19040,21040,20480,20400,16720,18720,21680,18800,21200,21280,20080,19680,17440,20240,20800,18880,20320,18800,20160,17520,20400,18800,18480,20080,21600,21440,16320,17840,19520,19120,18800,17520,19840,20800,19840,19280,21280,19360,18240,21280,19440,18320,17200,18400,19680,18560,17840,19120,18320,20080,19360,20560,20240,19360,19920,19600,18400,20880,18640,19920,19360,18880,21200,19440,23280,18240,17760,19360,19200,19120,18880,18640,21600,18160,19360,19840,18720,19280,18080,17520,19280,20640,18400,18320,18800,17840,20400,20240,19920,18640,18320,19680,20720,20800,20480,20880,19440,19840,21360,20880,19520,19120,18080,20000,20320,18240,20240,18720,21600,18640,20720,20480,19040,19360,20720,19440,19680,20640,17840,21280,19920,19600,17920,19120,19280,21920,21280,17520,18960,18720,19120,17840,16880,20000,20320,19440,19120,19840,18160,18240,20320,20160,20720,19200,20000,18880,18960,20480,18160,20640,17440,20560,21040,17840,19520,20080,20320,19200,20640,19120,19760,21920,19440,20480,19680,20640,18320,19200,19520,21200,17520,19680,17600,21360,19680,21520,19680,18400,20160,20880,19520,17760,16720,21680,20240,20080,19200,20000,21440,20880,18800,22400,18080,19200,19920,19040,20800,19920,20160,18080,19920,20400,17760,19600,22720,20240,19920,18080,19680,17920,18160,19440,18560,16960,18480,20320,19920,17280,17840,20960,18080,19360,22080,19280,19920,20080,19200,19360,17680,17760,21200,19040,20000,19440,16960,19280,21040,18800,18560,19040,19200,17600,19120,20480,17920,19840,19280,20000,19840,18320,17760,19040,16080,17040,21520,17120,23600,19360,19440,18400,19840,18640,19920,19600,21040,19120,18960,21120,18400,17440,18480,21680,19120,18160,19360,19440,17680,20000,19200,19840,19120,18720,21680,18560,18560,19840,18480,21040,19040,20480,22160,20960,19280,19360,20320,19200,18800,22880,21280,21600,19760,20000,20240,19440,17920,20960,18960,19120,17680,18240,19040,20240,19760,18960,18480,17120,18080,19520,19680,20640,20240,18400,20880,20160,20480,18160,18880,18720,19280,18080,21200,19040,20480,20480,19360,18960,20640,19760,19360,19040,19600,18800,19760,17680,20400,20880,20240,20320,18560,19520,22320,20640,18320,18560,19680,19760,20880,19840,20560,19280,19760,20560,19120,20960,20160,18960,18800,19760,18240,19760,17680,22560,20240,20640,20800,19520,21120,19920,18640,19280,22560,20960,20320,19840,18640,20720,19760,20160,20560,19120,19680,20320,18720,19360,20080,18800,21440,19600,19440,20160,19040,19520,18880,18480,17680,20160,22080,18320,18160,21440,18400,18560,21360,18880,18000,21680,20960,20240,20720,20320,19040,17920,19440,19760,18000,18800,18080,20560,20880,21200,18800,18160,17600,20560,18800,20480,20080,20800,17680,19840,20480,20320,20640,19760,20000,16080,16880,20640,22080,19760,20480,19520,18480,20240,19280,18560,21040,18880,20800,20160,20400,21280,21280,18880,22000,17600,19840,19120,20960,19760,18160,18480,19200,19440,17760,20000,21200,20000,17840,19680,21360,20480,21040,19760,17760,20480,22240,20480,18480,17520,18240,18480,19040,20880,20240,19440,19600,18880,16960,18080,21280,20560,20800,18160,18480,18720,20000,21040,18400,20160,20800,19760,21360,21280,18480,18560,18320,20960,20720,17280,19760,19760,21680,21040,19280,22160,19920,20960,20240,19520,20320,20960,18640,19920,20720,21120,20160,18960,19600,18400,19760,18320,19600,21120,18560,19600,19840,20000,21200,19280,20240,18240,18480,20160,18000,19360,22240,18240,21120,20560,21440,18000,19200,20240,19520,18560,20080,21520,20080,20400,18880,19040,19760,18800,21440,20960,20960,16960,18720,19760,19200,18960,19120,19920,20800,18160,20080,18800,18160,18960,20400,18720,19760,18880,19360,20720,19600,19680,19920,20320,17600,19120,18480,17600,19600,20320,19600,21920,20560,18880,20160,20880,20160,17840,18240,20080,18400,19840,18480,19680,20560,17360,18080,21360,21600,19440,19280,20240,19200,19760,18240,18480,18880,16240,20960,22400,19520,20480,18160,20000,19920,19440,18480,22560,22880,19280,18720,19120,21680,18960,20400,19280,20080,18000,19520,18320,18080,18960,20560,20400,19840,18000,18240,17360,20240,21840,22000,20400,21280,20000,19040,18560,19040,17920,20160,20080,20240,19520,20720,20560,20560,15360,20960,19120,19360,20240,18320,21360,19840,20720,19760,20240,18160,20800,19840,19360,18480,19200,17920,21120,20560,19360,18880,20960,19680,19440,20480,21040,18880,19120,18960,16800,19680,17440,19600,18560,20000,19040,21200,20800,18640,21120,20720,19440,19040,19840,22160,18080,18480,20800,19680,20000,18400,21200,20320,17360,20560,19600,18000,20640,18880,18640,21040,19600,18640,20320,20960,22080,18960,20320,20640,18640,18960,19840,20240,17920,19600,17520,18080,17360,20240,19840,17520,20560,19520,22480,20000,20000,18160,20960,19840,19920,19680,22960,20320,16960,16400,16880,18400,17680,20240,20240,21520,20640,20240,20000,20800,21200,18080,18640,21360,19760,19600,20320,20400,19520,20480,19040,17840,20400,16960,18560,18960,19280,20880,19120,20720,19680,19440,21120,20560,18000,19120,20720,18240,21600,22240,20080,19840,17920,20400,20960,18880,22080,19440,19600,17520,23280,18880,21120,20880,20480,19760,19040,19520,19840,21200,20640,19520,20320,19120,20640,21360,20560,20240,20080,18480,20640,19360,17840,20320,19680,20080,20640,19520,18800,20960,19440,18560,21920,18080,18880,20320,18800,21200,20240,21040,21600,19280,20720,20560,18320,17760,19200,21200,19360,18880,21840,19440,19360,19440,19360,21120,19680,18640,17920,18800,18080,20960,19840,18960,18800,19120,18800,17280,19680,18640,18960,19440,18560,21600,19520,19280,18160,19040,20080,19280,20240,19760,18560,20880,19840,18880,17040,20400,20160,20560,20640,18800,18960,19440,19600,18880,19200,16480,19600,19840,18080,19680,17840,18320,21440,19200,19040,21680,17280,18560,17920,22080,20080,18880,19280,17200,20640,17760,17920,19920,18560,21120,21360,19600,17840,22720,20720,19120,19280,21200,19600,22880,17040,22000,18800,20320,19600,19760,18560,18160,18240,19840,18160,19040,17840,19280,21360,20800,16560,18000,18800,19200,20960]},{"counters":[18480,19440,17680,18800,19280,18880,18080,20400,18400,21040,19040,19440,18560,17920,18400,20640,18080,21760,19040,17760,18080,19360,19040,21440,21040,21040,18400,20480,19600,19200,23120,18000,18720,20880,17680,21840,20080,19440,18240,19440,22160,18800,19520,18640,18160,19280,17360,19120,20640,18560,20240,19120,22720,19760,20000,20000,21360,20800,19440,20480,20880,20640,19840,19360,20080,19440,17760,19680,18800,17440,18560,18800,21760,19920,20640,19360,18240,19520,19280,19040,20160,16880,19680,19680,17360,19440,20160,20000,20560,18640,20320,19200,19760,22160,17520,20880,20640,16480,17920,20000,22160,18800,20240,19840,18240,17680,18000,21760,18640,22560,18880,20640,20720,20720,19840,19360,18560,21840,19920,18080,20560,19920,20960,20480,20480,19200,20320,18640,18400,19440,17600,20480,18240,21040,19920,21360,18960,18400,18160,21120,20400,20240,18960,17280,18400,17280,18640,18560,16480,19440,18480,19680,19680,19360,17520,18000,20480,16240,19360,19120,18560,20960,18400,19600,16880,21120,20640,21040,17520,19680,21520,21760,18640,20000,21360,18640,18640,20640,20400,19680,18160,18880,16240,19680,19040,20000,20400,20080,21200,15920,18400,19520,19760,18480,18480,17200,19840,19360,18640,19920,17280,19120,20320,18400,19600,19360,18320,19280,19280,19040,20000,18400,19520,20560,19360,19120,19280,21520,20960,20560,18400,18080,20160,19200,18640,17840,19440,21920,18160,21520,21280,19120,17840,20000,18560,19360,19360,18320,19600,19200,20880,16960,17680,19120,21280,20080,17840,18560,18240,17440,20320,18720,19760,19680,16960,19600,19280,19600,19200,21680,20640,18640,19520,22240,18800,20400,19120,18640,19440,16880,18400,20320,20720,20800,17840,21040,20240,18960,20880,20880,22880,18720,19600,21520,19360,20000,17680,18320,18880,19200,19200,17680,19440,18320,18000,20000,17840,16960,19680,20640,19520,18160,20960,20480,20880,19840,18000,20400,20560,18880,22320,19200,19200,19520,17600,18640,19440,16960,19840,20240,19680,19920,20640,20560,17920,16080,22240,16640,19600,20000,20560,19200,19680,18240,19760,18720,19600,20560,18640,19680,18800,20640,20400,17280,19440,19280,20800,20320,22480,19600,21040,18240,21200,15920,20240,18640,18000,18000,18080,19040,18160,18880,19360,17200,19920,21040,18240,18640,18080,20320,21600,20880,18560,20080,19680,18800,20320,19040,20480,19200,18080,21280,21840,20160,20800,19760,17440,18800,19280,17040,18800,19600,19440,18640,21600,21680,18640,17920,20320,16880,20560,21600,21040,20320,20640,20080,18480,19200,19200,18640,19680,22160,18960,21280,17840,20080,17120,20160,20320,20560,17920,18400,19040,19520,19920,18080,17360,20400,18400,18640,19840,20080,18480,18720,20080,19920,23040,20160,18800,19200,17280,20480,20480,19520,18720,17680,18240,18400,19840,20560,20000,19680,19760,18000,22240,19520,20160,20880,17680,19920,20240,18960,19760,18240,19680,22880,21440,20320,18320,19600,21840,20720,18640,19840,19600,20240,20000,21040,20800,18480,21840,21760,20000,18640,18240,19280,21680,18160,21760,18720,18960,19040,19040,21120,19360,21440,18400,18640,17040,19520,18080,18320,17120,22400,18000,21920,21600,20880,19440,18320,18320,19680,19440,19840,18320,20880,19600,18880,19040,20480,19760,19440,18160,18800,19840,20400,22000,18400,23120,21600,21120,20320,18640,20960,19120,21280,18560,19920,19760,19760,20560,17680,18960,20000,19120,18000,20560,19760,20640,20160,18640,18880,18720,19120,20480,18640,17680,20320,19200,20560,17760,17840,18160,19120,19280,19280,17360,22240,18880,21040,19120,19840,18560,18240,19040,19280,19200,18320,18960,19680,18880,19440,20880,17760,20160,18640,19520,19840,18400,17840,19680,19120,18160,19200,20320,18240,18720,19680,19760,19120,18800,19920,20080,20080,18720,19520,17360,19440,18800,18080,20000,19520,19760,19440,19600,19120,20000,18080,19680,19680,20000,20320,21200,20080,18880,21040,19120,18560,19360,18800,19600,18400,20400,18800,18880,21040,20160,19760,17840,19280,19600,20080,17920,18800,21040,17520,18240,19120,19120,16960,19040,16880,20320,20480,19200,18160,19440,17600,18640,19520,19280,20560,21520,18880,20400,20000,18000,20320,18560,19760,19840,19040,21200,19680,19040,19360,20960,20400,17520,23360,19200,17440,20080,19760,18480,21040,21360,19600,21600,18320,20400,17120,20400,18160,19760,18480,19760,18960,19040,21040,21440,19680,19840,19040,19520,20880,19680,20320,19680,20800,17600,18400,18720,20080,18400,20400,19920,18080,18880,21280,20080,18240,19840,18480,18800,16560,20080,18080,17600,20240,21840,19520,19040,18960,20880,17760,16160,17280,20720,20960,22080,19520,19840,17440,20240,21040,20080,20960,19280,19920,18640,16480,18480,22080,20720,20480,19360,20480,18400,19840,19280,19760,19040,20080,19920,17280,19040,20160,19840,21200,18400,18720,19120,20800,20080,18880,19040,18160,20800,19200,19280,18560,19120,18960,18880,19520,19600,19120,18720,19360,21360,18240,21920,20080,19600,21280,19600,20480,21440,18960,19680,19360,16320,18800,18480,18720,20880,20880,19200,21040,19680,19440,20000,18960,19280,19040,17840,19520,20560,20880,19040,20000,19600,21440,20560,20240,22240,19040,19440,21200,21280,18800,20240,20560,18800,19840,18800,20080,19680,20000,21520,20640,19040,20400,20320,19920,19040,20080,21120,18160,19280,20400,20640,19520,20640,19200,18800,21680,18720,18320,19520,17040,18720,20400,19440,19520,18480,18560,19680,16880,20720,21120,21360,18480,19120,17920,17760,19760,19280,22080,22080,18000,21200,19120,18960,20800,22720,19360,18240,19840,18720,20720,18160,18000,20080,19200,18640,20080,18560,19920,18000,20720,18080,18560,18640,17920,19920,20480,19360,18240,18160,18000,20160,18080,22240,19520,18480,18960,19600,18080,17680,19840,19680,17120,19920,17440,17920,20480,20320,18160,21200,20320,19760,21520,20160,20240,20000,21040,18960,19520,20320,19040,18880,19440,19680,21280,19600,19520,21360,18240,19200,19680,18000,17760,19520,19760,18640,19600,16400,17920,18800,21200,19200,20800,20240,19440,20560,19440,20080,18240,20400,19440,19680,20480,21360,21280,22080,18160,18480,16080,17200,18160,19680,20080,20080,20800,20560,19840,21200,20240,20880,21280,20560,22240,20480,17440,19600,19520,17600,20960,18000,17440,19040,21360,20960,15840,19920,22480,18560,18800,20320,19600,17120,20800,18880,18160,18960,19680,19360,18400,20080,20800,21600,19600,18560,18480,22000,17680,18080,18480,17360,19360,21200,21920,18880,19280,19200,18960,18480,20720,19360,20400,21280,20640,19840,19600,19120,19600,19520,20560,19120,20560,20000,18800,20400,18000,19440,18160,21120,20800,20400,19360,21200,19040,19600,19440,22000,19200,17120,18000,20000,19200,19760,17760,21200,20400,19840,18400,19440,20960,20080,18240,19360,20000,20000,17600,19200,19600,18880,19600,18720,17680,20560,20480,21440,20800,20800,20320,20800,20240,20960,17120,17920,20880,18560,19600,19280,18240,18560,18800,16400,18720,19520,21200,21600,21760,17600,20240,20160,20640,18400,18480,19600,20080,18880,20320,21440,19200,19040,18720,18720,20480,19760,17680,19520,18960,17920,20960,19200,19600,20160,20480,21040,20560,19040,20240,20800,18640,18880,21680,19840,22240,19440,19920,19280,20240,18720,19600,19600,18480,17840,17920,18080,19280,21040,21200,20080,19120,20240,19920,19200,18560,20320,20160,19360,18960,18640,18960,18880,19440,21680,19360,18640,18800,18960,20560,20160,19200,19920,18960,16960,19520,18000,20240,17600,20160,20160,19600,18160,18400,21120,20160,20240,18640,18960,19200,19360,22720,21760,21040,19920,19520,17600,20720,16400,20880,18160,18480,18640,22320,20880,19280,19920,20960,21920,19600,18880,20640,19920,18240,20160,18960,20960,21280,22880,21600,21120,18800,16880,18640,18240,21840,17040,18880,20240,20480,19280,19920,20720,21520,19440,20960,19760,20720,20720,17200,19760,16960,19280,19280,18000,19120,20320,19360,17600,18400,21360,18320,18880,18640,18960,17360,18000,20560,18480,20560,18640,20880,22960,22080,21440,20320,20480,17360,17760,19200,19440,22560,19760,17920,19680,20400,20320,20320,20080,19600,18480,19360,19760,18720,21120,21280,19040,20000,19040,19040,20080,18880,16960,20800,18160,19600,21600,17120,18880,21200,19680,20160,21600,17920,19520,19120,18800,20960,21040,19920,20240,19920,18400,19040,18400,20640,19280,17760,17680,18320,20000,17760,20400,20800,18560,20400,18160,19680,20480,20240,21360,19440,21680,22560,20000,20080,19280,18800,19600,19280,20320,19440,19760,18160,18960,19440,20640,19200,18000,20160,19040,20960,22080,21440,19280,19520,20560,19760,20560,20160,20320,20160,18720,17600,20640,20640,17920,18560,17040,19680,16720,22080,20000,22400,21760,19760,21600,21440,16480,18640,17520,19280,19760,21360,20560,21840,18160,17840,20240,20640,19440,18560,19680,19200,20880,19680,18640,19920,19600,21600,17920,19120,20320,19360,20160,18560,18720,18640,18400,20560,18320,19920,20320,20720,20000,21040,18080,19520,20880,18000,19920,19520,18000,21200,18480,20000,18960,18160,20640,19280,19280,22720,20480,17120,20320,20160,19360,19520,18880,19120,19280,19120,20480,18240,18960,22000,20240,17120,22480,20240,19120,18880,19920,20720,19440,20560,19600,20160,19360,20160,22160,18480,22080,18240,18880,20480,17280,19920,19520,19760,19280,19840,18880,19520,20880,18160,20000,18640,20000,19360,18880,20960,23120,17200,19120,19920,18720,17360,20640,17520,17680,21120,20640,18720,19280,19440,20400,17760,20080,22000,19760,20160,19680,19760,19200,19280,19360,17360,20160,17760,19280,19440,20080,19520,20880,17360,21440,18960,18800,18240,21200,18640,19120,19840,19680,19840,19200,19040,20720,21680,21040,20800,19600,20320,18000,20000,18000,18000,18320,18160,16080,17680,18800,18960,22400,17280,20800,19360,19920,18240,19280,19040,19920,19200,21520,18000,18640,18720,20240,18800,18400,20560,17360,18640,20720,17680,20960,19280,19520,19840,20640,18720,20080,19280,19920,21360,18240,19200,19200,22640,20320,19280,19680,21680,19520,20240,20960,20000,20720,18880,19840,18080,19200,19920,20720,20160,18160,19920,20960,19120,18080,18560,18080,17840,19920,21120,17520,18800,20800,19280,18240,17760,17600,17920,20640,19680,18880,18880,20320,17600,18560,20080,20800,21680,16800,18960,17360,19680,19440,19760,18880,19040,19120,20720,19360,19280,19360,19520,19280,20320,20880,20240,21200,18320,21520,20080,18720,19520,19040,19360,19680,18720,21360,19600,19520,19600,18320,21920,18080,18160,19360,20880,17760,19280,21680,20000,20320,19360,21200,19440,19760,18640,19840,18160,19840,20480,17840,18560,18800,20640,18080,18560,20160,18160,18080,20000,21600,20800,21360,18880,19840,20960,20080,18720,19760,22160,19440,19360,17920,20720,18800,20560,20640,20160,18080,18720,19360,18560,18240,20000,19200,19600,20800,19920,18880,15840,19440,21680,18160,18640,19840,19840,19840,19680,18720,17840,20960,19600,19360,20640,17840,20080,20800,19360,19040,18720,20160,19040,19120,20800,20720,20000,18960,19600,17520,19360,21280,21840,21280,18720,20800,19520,19040,19680,17280,19840,19040,19680,18800,22320,19120,17600,18800,19440,19760,21920,20560,19680,21040,17600,21280,19040,18080,19040,19120,20400,18880,20800,20560,20320,21760,20640,18640,19920,18400,17600,17600,22160,21760,20560,19920,20400,18640,19760,18960,19600,19600,21920,17520,20400,22000,20480,20320,20480,19840,19760,18400,19840,17600,20400,21120,20480,19200,16800,18160,20000,19040,19440,19360,20960,19520,18960,18320,20400,18000,19040,19840,19920,19520,18640,20880,20240,18880,21200,19440,20240,19120,18800,20320,20320,19680,18800,18480,17120,21920,17840,19840,19680,19440,18480,19120,20160,20320,20160,18160,20320,18080,19600,19920,19520,18080,19840,17200,15600,21600,20080,18240,20320,18720,17920,19520,20080,20000,19840,19280,18960,21440,19600,18880,19600,19680,20480,18800,20960,20320,22400,20320,20960,18240,19200,20320,20800,18880,20080,20160,17840,20080,19600,18800,20400,18080,17680,19200,19680,21440,19600,17840,20000,18560,18720,19040,22080,18880,20000,19920,19760,18800,20800,19760,21200,17760,18800,18000,22240,19280,21840,19600,18880,20720,19760,19360,19040,19840,19520,20640,20080,20640,21840,21120,21760,19600,20960,19840,18640,18800,21200,16960,18720,20720,19680,21120,18000,18400,17360,18000,19520,19920,22240,21120,19520,19760,18480,19920,21040,19520,18480,20000,18320,19200,20000,19120,20000,19200,18400,19200,18480,18320,20000,17840,17600,20640,18960,17280,17200,19120,20480,22560,21440,19360,18640,19520,20320,18800,20400,20160,19920,20160,18880,19440,22000,19680,19920,20320,19280,21600,19440,19440,19760,19600,18800,18480,21040,18880,17840,18320,19440,18000,20480,19760,20400,20560,19200,18880,18960,20880,17680,21440,22400,19600,17520,19440,18960]},{"counters":[18960,17760,19040,19760,18960,20160,20320,18080,19120,20720,19920,19680,19680,21760,20240,19840,18320,18640,19360,18240,18720,19360,19760,19600,19520,16400,19600,20240,20000,19120,18000,20240,19520,18080,17520,19760,19360,20160,19200,21680,21760,19200,20880,19680,20080,18800,20080,17200,18000,19120,22480,22480,20640,18800,20160,20160,19600,18480,20160,17760,16960,19280,18560,19200,19200,20640,20000,21280,18320,18160,20960,18640,20960,20240,19760,20960,18160,18640,17440,19680,18160,20960,20160,18480,21120,19280,20080,18960,17360,19200,18880,21040,18320,21280,19280,18240,19520,19280,21520,18640,18720,20240,20240,19120,20320,19360,18880,22160,19120,19920,21120,19280,20640,18000,19440,18160,19600,20720,19760,19360,19280,21120,20400,19440,20880,20800,20240,19760,20960,18720,17840,18800,18240,18080,19200,21600,21520,19200,20000,19520,18640,19200,20080,20800,18320,19680,19280,20160,19120,18560,19280,19120,19760,20720,16960,21040,20720,19440,19040,19280,19280,20400,21120,18400,20720,20400,18720,18080,20240,19040,19440,18160,17760,19920,19200,20640,18640,19680,17280,19920,20400,20480,23040,21760,19520,20560,18240,20960,19280,20160,20000,21680,19120,17760,18880,19360,20400,20160,22960,20400,17520,21520,20480,18560,19040,20800,18720,18560,20640,19920,19920,20560,18800,19360,18800,20480,17840,22160,17680,20240,17200,17520,19280,20800,18800,18800,21280,17840,22160,21280,18880,17520,19520,20880,20480,18880,19680,19680,17520,21200,20480,18960,17760,21280,18320,17040,20000,18880,17600,20800,19920,18480,22080,21360,19840,19280,19680,19680,20240,21120,20320,19600,18160,20160,22000,20160,18800,21040,21280,19520,22480,17120,17200,20320,18000,19920,19760,21040,20160,20400,19200,20480,19600,17520,16800,19600,17360,19120,20320,19680,20720,20080,18880,19120,18640,19760,19120,16560,17200,19760,21440,20000,18560,21680,20640,17280,22080,19600,17440,19120,19040,19040,17840,18000,21120,20080,20000,18880,19600,20640,20400,18960,20160,20320,18240,18560,21760,17920,18800,21200,20960,21360,16720,19040,18480,19520,18000,18960,18480,19280,24080,18320,20000,23440,19360,20960,17760,20320,21120,19440,21360,20640,18160,20000,19280,20320,16320,20000,20160,20480,19920,22320,19520,19040,19360,19440,18480,20560,20160,17600,20160,21440,15920,19360,18960,19760,20880,17360,18160,17680,19040,19040,21760,18400,21600,20720,19360,20400,20560,19840,19840,19200,20800,20000,19520,20240,18880,20400,18480,20320,17760,18880,16960,18480,23840,20800,19520,19920,20160,20480,19200,19440,17040,19680,20240,19440,20400,20320,17760,18720,20400,18080,19120,18480,20960,19920,19120,18720,21520,18480,18400,18320,22320,18000,18240,19520,23200,20320,20000,19120,21440,22880,17520,20880,20400,16640,18080,19600,21040,19920,21120,19680,19840,16800,19760,17760,16880,17840,21440,18480,20080,21600,18320,18320,19440,18960,19280,19120,19200,20720,20320,18400,20240,18320,21840,18160,18160,19520,20640,21360,19120,18400,19760,20240,24480,19440,19440,18720,19520,18400,21200,21120,22160,19600,19520,19040,18720,19600,20800,19200,18640,19040,19200,18000,19600,20240,21040,19360,19280,20480,21440,20960,18480,19200,18720,19760,21600,19680,20400,18720,19200,21680,18400,20480,17040,24480,19120,19360,18800,18800,19680,21200,19280,19120,19280,18240,20880,19840,19040,20480,19760,20400,15920,18160,20000,22320,19040,18080,18560,20960,19920,19920,20000,18400,18720,19360,16960,20560,20160,19200,20480,18560,18720,20720,20080,18320,18800,21360,19120,18640,19360,16960,20320,20000,20000,18960,20080,18800,20800,18960,20720,20480,16000,19120,19040,19600,18880,18800,20720,18560,20160,19040,20000,19440,16720,18640,18800,20800,17200,18880,19120,20000,20080,18800,18720,19280,20480,18960,20640,19360,19440,20080,18240,20080,21200,17280,16160,16400,21600,17840,19200,19920,18080,16960,19200,18160,18720,18720,19600,16800,19200,20080,19840,19120,20240,19040,18240,20240,19920,19680,17840,19840,19280,20080,19600,21200,20160,20640,20240,18640,17920,19600,19200,20160,17360,19520,19040,21040,20000,20480,18480,20640,20880,19760,17280,19760,20080,19360,18800,18160,20320,20800,18800,20560,19040,19680,21120,19360,19120,19040,20480,20960,17840,19280,18240,17600,20000,18480,20080,17200,19040,20320,16320,20080,21120,20320,18640,19680,17040,18400,19600,20480,21680,21200,20640,17760,18800,18160,19200,18880,19920,21600,21120,21120,18160,21920,18960,17840,20880,21840,19280,17840,20400,19120,20160,19760,18320,19680,19600,19040,19680,19280,19840,22080,19040,17920,18080,19120,17520,21600,18800,20720,20560,20160,19200,19360,19360,18400,20240,19760,22240,19280,20880,18880,18240,19920,21280,19520,18720,18960,19920,17040,20640,20800,18560,21440,19760,20560,18480,22080,20880,21440,19040,18640,21600,18080,20960,17840,21200,20480,21200,20560,18560,17360,20560,18960,22000,20160,21360,21760,19120,18160,19760,20800,19840,19760,19520,20160,19120,20960,21120,20880,19760,18960,19040,19280,19840,21440,18800,20400,19280,18000,18640,19440,20400,18640,19680,20000,18880,20480,18960,19600,18480,19200,19760,20080,21440,19920,17760,18640,20400,21760,20960,18640,19280,21920,18400,20640,19200,19360,20320,16800,19760,19040,18400,18320,19520,16880,18480,18960,19680,18000,17840,18400,18960,19760,19520,20240,21360,19600,17840,20000,19120,18160,18080,20560,19520,19520,16240,20000,18400,21360,19840,19600,17280,17600,22400,19680,20960,18480,19600,21440,21200,19920,19040,18320,19040,19760,18880,20160,17440,19120,18800,20640,19760,19280,18640,18240,22160,19440,21360,19200,18320,19280,18880,20720,20160,18400,18640,20080,20560,18800,21360,21200,20560,19520,18480,18800,18720,19120,21360,19200,18240,21040,20640,16400,19440,18800,18480,18960,19200,19440,21760,19440,21040,20160,19440,17280,20880,18560,18640,19680,18240,20640,20480,19840,20720,19920,19520,18800,19600,19920,20480,21200,19680,18480,20800,20080,20240,19840,18320,19920,18960,19440,20160,19760,17520,19120,20240,18400,21440,19840,19840,18400,16960,17520,22160,19600,22320,19360,19600,20240,18720,17200,17920,19520,17840,19600,22400,19760,19600,19360,19600,19600,20160,19920,19280,20720,18800,20240,18480,19840,16400,19200,19920,20720,18960,18480,19200,21520,20800,21120,19280,21680,19120,18560,21200,21520,19760,18960,19040,19920,19280,20240,21280,19520,19040,20160,20240,21120,19280,21440,20960,21920,21200,19280,19280,22880,18560,18960,19920,19760,19600,21520,22080,18480,21600,20080,18160,20720,20560,18800,20560,19440,18880,18320,18240,18960,17200,19280,19280,17920,22080,19200,18480,20160,18720,17760,20240,19360,21520,19040,19360,18400,16480,21120,18160,19680,19120,18880,21840,19200,18640,20240,20480,18800,20800,21280,19840,19840,19520,20000,19840,19680,20800,19760,18800,20160,20080,19360,21360,19200,19440,20320,21920,18880,17680,18880,19280,20240,20240,20160,18320,19920,18320,17840,19360,18800,19600,18160,21200,19680,18720,21200,19280,20000,18720,19440,20480,17520,18960,17280,18720,17120,18080,20000,20640,19040,19920,17520,21520,20400,17760,17280,19840,19200,20080,19040,18000,20080,21440,18800,18560,20240,20320,20800,19840,17200,19920,18800,19280,18080,18400,17680,19360,20000,21200,17600,17840,20880,18640,20240,19680,19760,17520,18480,20480,18720,19600,19280,19120,17920,17520,17520,19920,19760,19200,22960,19120,18480,19120,18000,18480,20320,19040,20080,17760,17840,18800,21200,18720,18560,17920,20800,17440,17920,20240,20560,19280,18960,18480,21920,18640,20400,18720,21200,19360,20800,19200,21360,18320,18240,20720,20960,18080,21280,18480,19120,21200,19600,19840,17120,20800,19120,19280,20000,20000,19600,21600,20720,20960,21040,20400,19200,19520,19440,19200,21760,19760,20480,20080,19680,18480,19840,21680,19840,19600,19200,20000,17840,18960,20160,20000,19440,19440,18800,18640,20080,18960,18480,19280,19440,18400,22160,21440,20640,20720,18960,17600,20160,19280,19360,19120,18480,19040,20160,20800,19680,19440,18720,20240,20320,20560,18800,18720,19520,20160,20880,20080,17120,18880,18160,19520,16960,21440,19520,21280,19360,20720,19200,18400,20240,20960,19920,18080,20240,19040,20880,18640,20800,20240,19680,20640,22080,18160,20160,20400,18400,19200,18400,21840,20080,18960,16480,20080,19360,21120,18560,20080,22320,21040,20320,19440,18240,19200,17360,18480,22320,18240,20240,18720,18080,18800,19680,19280,17520,22320,21280,19280,18560,22080,20080,18960,17520,20720,18480,20160,18000,18480,20240,18480,21280,20000,17840,20000,17760,18720,20080,19360,22080,19440,18720,16960,19440,20320,21680,17120,19120,17680,20800,18000,19520,20480,20320,19200,19360,19840,19840,20400,16960,20400,19120,19600,18720,21120,16960,18800,20800,17760,20080,17680,20160,19840,19840,17360,19440,18560,19040,19200,21520,19280,19440,20800,18640,18160,20240,20480,20000,19120,22400,19920,20400,19120,21120,20080,21280,19360,21280,22080,20160,20880,16640,20880,19440,19520,20480,18160,18800,23120,19120,20640,19520,17440,19200,18400,20080,19760,19360,18640,20240,18080,20240,19120,21440,17840,18800,19760,22400,18880,19600,18000,19600,21360,18720,21200,20000,19280,19840,18960,19280,18480,18080,20640,20400,19680,17680,18720,21520,18000,17840,18480,17360,18400,20000,19680,19440,19600,18400,19360,20960,19680,20240,21280,20560,20560,18720,18000,21600,18080,18000,19040,19360,19280,19520,20080,17600,21440,18240,20880,19040,18320,19440,18240,18080,19120,19280,20640,17360,16720,18480,18720,19120,19520,21920,20880,21040,18000,18800,18080,16720,22160,19440,20560,17040,18480,18640,18000,19440,19440,18480,20320,20320,18800,17360,21040,19840,19600,20160,19120,20880,20960,21280,18160,19920,17920,19760,21680,19200,17440,17840,19600,18720,19680,22480,17600,21520,19920,21760,20160,19600,17440,18800,20560,18320,17680,18560,19520,20400,19440,20000,22480,19440,18480,19920,20080,18800,21200,17680,18080,20080,20400,20080,19920,20560,20560,19040,18080,21440,20800,19600,20400,19680,21200,21360,17360,21600,19920,21600,18160,18960,20320,20160,20960,20160,18560,21040,19360,20880,18000,21040,18880,19840,19120,19200,21360,18240,20000,20640,18160,20240,22800,20160,19680,20400,20160,20000,18240,19200,17600,20960,18880,20480,17760,17840,20000,19360,17920,20000,20320,20080,19920,20080,17120,21120,20240,18480,19280,22160,18400,19680,21040,20000,18960,19360,18080,20320,20720,20640,20080,18960,18400,16400,17200,18560,19280,19760,19280,18800,19840,18880,22640,20320,20160,22880,19280,20480,20960,19920,19360,17760,19920,20400,20320,19280,18080,17520,18800,17360,18560,18800,21440,20160,21040,18800,19600,18160,19680,18320,19280,20240,21280,17840,19280,20560,18960,21440,18400,18000,21200,19040,20880,18320,21280,19280,20160,18320,18800,19760,18960,21360,19360,19440,20400,20000,19520,17920,19680,19920,18080,19360,22080,19680,20480,19360,19200,21600,20080,19600,19200,19040,18800,19600,21680,19680,18800,21200,20480,19360,18400,19360,18560,19040,18080,19600,20080,22640,19200,20400,18320,18800,17040,18080,18640,19760,19600,19920,19120,18960,19440,19680,19360,19360,17840,19760,21200,17840,16320,20000,16800,19280,16400,19840,18720,18160,18960,20320,20240,19120,19360,17600,19680,18800,19520,18160,18880,20400,18240,20560,18320,19280,18560,17520,19920,18800,18320,18720,20080,20560,19360,20160,21200,17920,19760,20160,17760,19600,17680,20880,19440,20400,19440,17040,19120,21600,18160,19680,20320,17760,20000,19120,18880,20080,21200,20560,20160,21040,18880,20080,19520,20160,19920,18880,17840,17760,19040,21120,21920,17520,19280,19840,18800,18080,19440,20480,18960,19280,18480,21280,21440,20960,20000,20000,17200,21600,18080,18800,18960,20160,21120,19920,19120,20480,20960,17840,20720,24080,20640,16880,19360,18640,20720,17600,21040,19840,19120,18720,20400,17760,17120,18240,19520,18080,18000,20160,17680,21120,18000,19600,19840,19920,19520,17840,19840,19760,18400,17040,19120,19520,19280,19280,19520,18400,19600,20640,20640,17360,20960,18960,19520,20720,17200,18320,19680,20000,17440,19600,18160,19440,19760,18800,19600,19760,17920,18800,21040,20320,21120,19680,18720,22480,19680,19200,21120,19520,20560,19760,19920,18640,16960,20560,22000,19440,19440,20880,19920,19200,18000,18160,18320,18560,19920,18560,16560,19280,19760,20800,20320,19520,20720,20480,19120,18640,19600,19520,19440,19280,20160,19520,19440,19760,20080,20480,18800,20800,19120,18480,19520,20160,20640,18480,18080,17600,19680,21040,20320,18800,18720,19360,18400,19760,19760,22560,18800,18240,18240,19200,18240,21520,21440,20320,19920,21440,20480,20480,20160,19680,19840,18640,20080,19280,18400,18960,17200,17920,20480,19680,19840,21200]},{"counters":[19840,20000,18640,19120,20240,17840,19680,21040,17120,18720,22320,21440,22240,18800,21920,19200,19600,19280,19680,18240,21440,20000,20160,19200,18320,19360,20160,19360,19200,19200,18400,19520,18640,21120,20480,16560,20400,22240,20000,20000,18400,19600,20640,18800,20400,20080,20400,18560,18960,18800,16400,18240,18240,19120,19440,18960,18960,19680,19040,17840,18640,18720,18240,20960,19120,21120,21920,20000,18640,20320,20560,20000,18480,17680,18400,18960,17600,20000,19200,19280,18720,19920,21600,20960,18160,18800,17600,19440,18960,17200,19920,20000,21600,20640,18160,19680,19840,19680,21120,19360,17120,18240,20720,20400,17920,18320,18880,18320,21280,18400,19520,17520,19680,18560,20880,17840,17600,19200,18400,19840,21200,19600,18160,18880,18000,19120,19200,18400,19920,18400,17840,18720,18880,22880,21280,20000,19280,19600,19760,19680,19680,21120,18240,19760,19920,20160,19440,20080,20240,19920,18640,18800,20720,20400,18640,19040,18320,18880,19600,17920,18720,19520,21280,20720,20800,19280,17040,17360,21760,18400,18960,17760,19920,20800,21360,18800,19200,19520,19520,19120,18560,20320,17040,19440,18480,20000,20320,20080,17840,20080,18400,18400,19360,18720,18960,21600,19040,18640,20880,18080,19120,20240,23200,18960,20240,19520,18480,20480,20560,21440,18160,20400,21280,20480,21600,20960,18000,21440,21600,18560,21200,19200,20080,19760,21280,18000,21120,21120,21200,18480,21200,22000,17440,20000,19920,18640,22080,21760,22000,19040,18000,19600,19200,19600,20560,20720,18720,20560,19840,20080,18560,18000,18080,23280,19360,19440,20240,16960,18320,17520,18720,19840,18400,20320,19200,18480,19200,20560,18240,19280,19920,19840,20080,18960,19440,20560,18400,18400,18480,18160,21200,19920,21280,19760,20160,18080,18560,21120,19440,20160,20880,18080,18880,19840,19280,19520,21120,19680,17600,19280,19040,20960,18080,19760,17520,21040,20400,18960,19520,20640,18000,18720,16800,20320,20880,20560,20400,20800,21520,17840,19520,19120,20080,20320,19920,20640,21840,18880,19040,18720,18960,18800,19520,20800,19440,19200,20320,19680,16880,19840,21200,21920,18160,19680,18960,20240,18480,18880,19520,19280,20160,18720,18480,18960,19520,16880,19760,19440,20160,21760,22080,20480,18480,17760,18800,18800,17600,20640,20080,16720,18800,18000,17840,18960,18880,19520,17280,20800,20480,21440,16960,20800,19200,20320,18080,20640,20080,19920,19280,19520,18960,18480,20480,19200,18800,20960,19680,19680,21680,19600,20240,20000,20560,18320,18320,18080,18960,20880,17520,18320,17520,22160,19760,18720,18480,18720,20800,19360,19920,19040,19520,19120,20640,18960,22000,18640,18160,19600,21040,20320,20480,19280,20720,19760,19760,20720,20080,21760,17440,18480,21920,19120,15760,19280,19200,18320,19040,19200,20880,18960,19680,17600,20160,18800,19760,20480,19280,20320,18480,19440,18000,21360,19200,16320,20640,20400,20160,20080,19760,18720,18240,18320,21040,20080,19920,21600,19840,19840,19280,18400,17600,18640,19120,18640,17920,18320,18720,21600,19520,19200,21680,18240,17120,18160,20080,18640,18240,21040,18960,22160,19680,18800,19040,21040,17680,18960,18320,19760,18960,20080,18640,19200,20160,16720,22880,20560,20960,19840,20560,20960,19280,18960,20160,21200,20240,18960,19120,19920,19520,19520,20960,21840,20240,17360,19360,17920,20080,20720,18800,19360,19440,20000,21200,19360,19360,20240,18080,19840,18400,19520,19120,19680,21840,19680,17840,22000,20720,19680,20400,18720,18080,20080,17040,19440,17360,17360,18720,19440,19760,19200,19680,18480,19440,17440,18800,20240,19760,18480,18800,19120,19200,20880,19440,19600,21360,18640,21040,19680,19600,19360,20400,20560,19120,19840,21920,18880,20560,20000,18160,20400,20160,16400,19600,19520,19120,18160,18800,21760,17760,20640,19440,18880,18960,19120,20240,19520,16960,21440,20480,20800,19840,18640,19200,21840,19760,19520,20480,19440,19120,20480,20000,19920,19440,18320,20320,18800,18160,19600,19040,20640,20000,23120,18160,20080,20080,20960,20720,21200,20160,19280,20080,19200,18080,17920,18320,20320,17920,20320,20480,21440,19920,19840,20000,18960,19360,18880,19600,19040,20320,20320,16800,19520,19680,18960,18480,21440,18800,19200,18880,20400,20640,20240,17920,22720,21120,18240,19760,20000,18320,22000,18480,19760,19760,18480,20960,19200,20080,20800,19520,19040,17600,20240,18240,19360,19600,18880,21760,20320,19600,19280,19360,18400,21520,19760,19840,20400,17840,17040,18400,18400,21840,20400,19440,18080,18720,17440,21840,19440,16880,18560,19360,19040,18880,22240,19440,20160,21280,19120,18720,19120,20000,20320,18880,18880,19760,17520,22480,20160,21040,19760,18000,19120,20000,20160,17440,18480,18480,18160,18960,19440,19680,17280,21760,19840,19120,19520,18080,21280,23120,20400,18160,20080,18640,18800,18400,20880,20160,19120,17920,20400,19040,21280,21120,18720,19520,20240,18080,16640,16800,18720,18240,19120,21920,18880,19200,21200,19200,20400,18320,17040,20080,19520,17600,16240,21520,19040,19760,19920,20880,17200,19920,19360,20400,19600,19440,20400,20960,17760,20640,20080,20480,19040,20000,18960,19760,19840,20640,20640,19040,20960,18560,20000,19760,19680,21360,18720,17840,18320,18320,22560,19760,19200,19040,19200,20320,20240,20160,18640,19520,18720,19760,19840,20160,18880,21120,20560,20320,21680,20080,19920,19520,21200,20080,18960,19120,18160,21600,22160,16640,19440,20560,20000,21760,20400,19280,17280,20160,18640,19280,18160,19440,20000,19600,19280,20160,19440,17760,21440,19040,17760,20000,19200,18880,18400,20640,18240,19600,18160,18720,20240,19520,18960,20080,18800,18800,18640,18080,19200,20160,19520,19440,20880,18320,20240,20080,18800,20880,19920,19600,19600,21360,21120,18240,20400,20080,19280,21440,19600,19120,19200,20720,17920,19280,20720,19760,19120,19840,20320,19760,20480,20960,19920,20800,21280,18800,19760,18320,20000,19600,18480,18240,17680,20720,20640,18640,17680,18720,20240,19680,17520,20800,19280,19440,19120,19600,18160,19760,18880,19520,20480,19440,21920,20640,20000,18960,17600,17600,18560,20640,17600,18160,19040,20160,19200,20480,19120,18400,18800,21280,19760,19680,19040,18800,21840,19120,18560,19840,21840,17280,19040,19440,19600,20080,19280,19200,17600,19600,21120,18560,19440,19120,19600,19920,19680,18480,22320,19440,20080,19280,19280,19680,21840,16480,19040,20960,19920,19360,20560,18480,20400,20560,18800,19760,20560,22160,20880,19600,19520,18320,19120,19680,17520,20560,18560,17680,19920,19040,20320,17760,20960,21360,18800,17360,19280,21920,19520,18320,18800,18160,20720,20080,19120,19200,16160,24240,19840,19920,20320,19200,20080,19360,17680,21040,18480,18800,20240,22160,21680,18160,20080,20560,18720,19760,20320,18080,21440,19760,22320,19680,19680,19520,20000,18640,20800,20720,20080,18880,18240,20080,20240,19120,21040,19920,19760,18560,20000,20080,21280,18720,20960,18320,19760,20560,17600,20320,19280,20160,19920,19440,19680,19680,18080,18880,20400,20320,18240,21200,18960,21280,18880,19120,17760,20160,19600,20960,18880,17120,18240,19920,20080,21520,19280,19200,19680,18960,19760,21200,19040,20960,21520,20320,18960,18560,20160,20080,20080,16880,20240,20320,19120,19840,20000,22000,18080,21200,17280,19360,17520,17760,19840,20160,17760,17120,19200,18560,21200,19840,22000,19120,18560,16640,17520,20480,20080,19200,19920,19280,20320,19120,21360,18160,20000,17520,18320,18960,21520,18560,18800,20720,20960,18800,21760,19920,18960,20160,18000,19440,21120,18640,18720,18880,21120,19840,16880,17680,21280,19440,19600,20560,22160,19600,19840,18160,19200,19040,18080,18960,19840,17200,19200,18080,19840,20560,20080,22000,20720,18800,20720,17360,19040,20720,18800,18720,19120,20800,20960,19200,20800,19600,20880,18160,22400,19360,18480,17440,19840,19920,20320,20640,18240,20240,21040,18320,22400,19360,16800,17840,21680,19200,17520,20160,20720,18560,19680,19440,17040,18400,18960,21040,19440,18800,17840,20640,19120,20400,19600,19440,20480,18480,19920,20160,19040,19520,21200,18800,21200,18640,18800,19680,20400,16960,19760,18480,18720,19440,18560,17920,16960,18000,19600,17760,21040,20880,19600,19360,19760,19200,18320,20400,20080,20800,21120,17920,20080,21440,18800,20960,18880,19600,18320,21520,19280,19520,19840,20000,18480,19040,20560,20160,18640,20240,17440,19440,19440,17840,19120,20720,18320,19040,20560,21440,19280,19840,20400,20640,20960,20480,19680,21040,17760,19840,18720,19440,20960,19040,21760,21280,19520,20240,17520,18160,18720,19280,19360,18720,19120,19040,19120,18880,17920,19520,17120,22640,18560,18240,19600,17680,20400,19440,18400,21840,20400,21280,17360,19680,20160,22160,19520,19760,19920,18720,21440,18240,19520,21040,19600,18400,20240,18800,19040,21520,19680,18000,21200,18160,21280,17840,20000,18800,19040,18480,20960,20080,20080,18640,20800,19280,17040,21440,20560,19360,20160,19200,19680,19360,19280,19680,21600,17200,22320,20880,18960,20000,21040,18480,20560,19760,18240,21920,18000,17200,19840,18480,21120,18880,19520,19280,21200,20480,18000,19200,17840,18960,18800,20960,20400,19200,20880,22720,20240,19520,19040,19520,19200,20080,22080,20080,17760,20640,18960,21200,18960,19840,20640,19280,18080,19600,16880,20080,21120,20640,18720,18000,20000,21600,19840,19760,17600,17600,19680,18160,19760,20800,19440,21200,20080,21760,21680,20080,18240,18080,18960,19120,18960,19280,19040,17360,18880,19120,18800,18560,18560,19200,19520,17840,20000,20880,17840,19280,19920,19520,21600,20240,19200,18640,19200,21600,18160,20160,17680,18720,18080,19520,18800,19360,22080,20880,18800,20000,19840,17920,17760,18880,17680,19040,20480,18640,22000,19760,18320,19360,20000,19600,21200,21040,19600,18800,19200,19600,20240,19520,19120,18560,20640,19120,20720,19920,20800,20080,19840,20240,19520,18800,23360,18560,20960,20000,18800,20480,19040,20480,20560,18960,20560,17680,19360,20880,18640,20320,19040,21040,19200,19280,18560,18960,19120,19200,20080,18080,19520,19520,18960,17520,18240,18240,20400,18080,17760,18800,19680,19360,19120,19760,21440,19440,16720,19760,17760,20000,21280,19760,19200,21120,20720,18560,20240,19920,18400,18320,19360,19920,19440,19440,20960,20000,19360,20240,23040,19040,19280,20000,20000,20160,20720,18960,19920,17520,19280,20400,18720,17680,16160,20240,18560,19840,20160,22160,19280,17520,19200,18080,20960,19920,18480,20320,20320,18720,18880,19120,17360,18080,19360,20080,18480,19920,19600,21040,18000,18720,19200,20960,20560,19360,17600,17600,20960,19280,21280,20880,20640,18800,18560,20160,19120,22400,21760,20880,17200,19360,16880,20080,21360,19760,20080,19200,18160,17360,19440,18000,22000,19280,19040,17920,18080,20800,19760,21280,17840,18160,17520,20560,22080,19120,20800,20160,19600,18080,20880,20960,18400,20240,19760,19200,18080,18960,20240,20080,19840,19280,20720,18640,19280,22960,19840,17200,19280,18240,19120,18240,21040,19120,18320,22080,20320,21040,16960,20720,21040,20240,19920,18640,18560,19920,19760,21680,19600,18960,19280,20720,20080,19840,20400,20640,20400,18240,20400,19680,20720,19440,17760,18480,19840,19360,20480,20320,17680,18160,19120,19760,21440,22000,20800,20080,21120,18480,20560,19360,18800,19760,19440,22480,17680,19120,18880,19600,19600,17440,18800,21680,19840,18320,18320,20000,17440,19520,19440,20800,19520,21440,19840,20960,20720,18720,18880,18560,17600,17600,19520,20240,21760,22080,20000,20400,18000,19120,15760,17440,17760,19840,20960,21520,19600,21440,19600,20560,21120,18720,19120,18800,19040,20640,20080,20320,20720,20480,21120,19040,18320,19120,18080,18320,20080,18720,19520,21440,19760,18000,19360,18960,19200,20080,19360,20240,18960,21760,17360,19440,18160,19760,18480,19440,22960,20880,18960,17600,22880,20080,16800,21280,19680,20560,20160,18960,18400,18080,20960,22080,18560,20800,21680,19200,19120,22240,19920,17200,21440,20640,16400,19280,18800,21680,20640,19200,19440,19360,20720,17520,20560,18640,21040,19360,19200,19120,20000,19440,19920,19440,21120,19440,20560,18960,20240,16320,18880,18560,20640,19840,20720,17760,20880,19280,20560,18160,18880,17120,18960,17760,19360,17280,20720,17680,20800,18960,20240,18160,18880,19120,20480,18720,19760,20640,18240,20000,22160,18320,18640,22320,20800,18080,21200,20160,19920,18240,18640,19040,18400,18640,17120,21200,18400,18480,19280,19520,19600,18160,19840,17680,18080,20640,18880,20160,20480,21520,18160,20240,20320,18320,16800,18320,19120,19520,21520,16560,19920,21760,20320,18800,20640,20320,19520,19120,19040,19440,21680,17840,21040,18240,16480,20320,19200,20240,20400,17520,18480,18400,20720,19680,20480,18000,20160,21280,17360,19680,19200,20240,17680,20240,18000]},{"counters":[19520,18240,17280,18720,19440,21200,19760,19280,19440,18960,19920,20480,19840,16640,18000,19680,20400,19600,19680,21520,18880,21760,18960,16480,20000,18720,19440,19440,19840,20080,20880,19280,20000,20320,19200,21360,21040,21200,19280,20720,17840,20800,19680,21200,18400,22160,18080,17120,19840,20640,21200,19440,17920,22240,20080,20320,19280,19440,19360,19920,20880,16560,18480,18240,19440,18800,16320,21920,19440,19120,16720,19840,18640,20320,16880,21040,20400,21120,18880,20320,20800,19040,18880,21200,18640,21360,16480,19440,18960,21200,18800,19040,20240,19520,17200,20960,16880,19600,19520,19760,20320,20480,20400,20240,21040,17760,20640,19360,18640,17840,21520,20160,19440,18000,18000,19280,19040,18720,18400,19280,18480,19920,19680,17360,17600,18880,18720,18320,17600,20240,20560,18480,19760,19600,20080,18480,19920,19520,21360,18400,16640,17840,20000,19680,19280,19440,20480,19600,21280,18480,20080,19920,20320,19680,19920,18720,17760,18800,18160,18080,18320,18640,18400,19680,18080,19760,19840,18800,18800,19360,18000,18640,18560,17760,22000,17520,19520,18800,19520,18880,18640,19280,20880,17280,17120,17120,18560,19200,18720,17200,19920,17680,17680,17760,21360,22000,19360,19600,19840,21120,20160,18560,19680,22240,19760,18880,17120,22720,18320,17920,18640,20640,18960,20400,18160,19120,21280,20560,19840,20880,19440,19680,17680,19440,18800,23040,20320,18800,19440,19520,18640,19520,18000,21120,19040,18560,21040,21200,21040,19600,18960,21120,18560,21200,19760,19120,18640,20320,22400,21360,19600,18640,18640,20400,19360,20480,17600,19040,16880,19440,21360,20320,19440,21040,20800,18160,18320,18640,19520,17520,20240,19600,20240,19440,18240,19680,22400,17280,19440,20720,17840,21440,22640,17600,19760,19920,20400,18960,19600,19680,17440,18320,22480,22800,19840,19280,19200,17360,19600,20240,19360,18080,18640,20480,18720,17920,20560,19520,18560,18800,17680,21920,20080,20160,20000,18240,19520,18640,21840,18720,19120,21440,19280,18480,19200,20320,19920,18480,17920,19200,21200,20320,19440,19040,19600,20000,21840,20320,20240,19120,18160,16960,20560,20560,19760,21520,19680,21120,19360,22000,20320,20400,18960,18560,18480,20640,18560,20240,18640,20160,22320,17360,17840,18320,19040,19600,19440,22880,19840,19120,19200,19200,20160,17440,17600,18320,18560,21840,20640,20720,20640,16880,19440,20000,19120,18960,18880,20000,20880,19680,23280,18960,19520,19040,19360,19360,22080,20880,21440,20160,20240,19440,19680,19840,22960,21920,18880,17360,19680,18080,21920,20560,18960,21040,18720,19680,21440,19440,19520,18240,18720,19280,20560,20160,19280,19040,19520,21040,17760,18480,18240,19120,18400,19600,19040,18400,20080,18640,21440,18800,16640,17040,20880,20480,19600,20480,21520,19520,20160,19040,18880,18880,19840,19600,20480,20000,21200,18800,17760,20800,19280,19760,21040,18800,19760,21920,18720,19360,18800,19760,19200,18080,20640,19840,18400,21120,20960,19200,19680,20480,19840,17280,17920,18720,18560,19440,19760,16000,20400,21200,20000,19360,20080,18800,19280,20240,19680,20400,19200,20800,20560,20640,19440,17920,17600,19280,19920,19360,16720,20160,17600,20000,20080,17440,19600,17680,21600,20160,18640,18800,21760,19440,20080,19040,18960,21520,17200,18480,21120,19360,21760,21280,18320,20160,20000,20160,18800,20160,17760,19440,19920,19680,18400,21520,18560,16560,16880,17760,21120,16480,19440,19520,21680,20480,18560,20080,18720,18880,19040,20400,19040,18000,21200,19360,18640,19680,19440,19600,17600,21040,19520,19040,19920,21360,20560,20960,19200,18720,20160,20320,18560,19600,19200,20080,18880,21360,20240,20240,18080,18240,18640,17280,19280,19600,19840,20480,20800,18240,19280,17840,20720,21280,20240,19520,19680,20000,18400,20800,19200,21520,20080,19520,18480,21200,17760,21760,20240,19120,19760,19360,18960,17760,18160,19760,19600,19520,18080,19520,19760,18960,20000,19440,18560,19520,18720,21200,18480,19200,18000,21760,18320,18480,18800,22080,20400,19520,17680,19920,21440,17840,19040,20000,18720,18560,19360,20480,18480,20880,18400,20080,19760,19760,18400,19920,19120,20720,20000,20320,19120,18320,20000,20000,20880,18800,16480,20080,19920,19840,19440,21920,19440,20240,19920,18480,20640,21600,18320,17840,20160,22320,18240,16560,19440,18720,18560,18240,21280,18320,19520,19440,18000,19680,17920,20640,21360,17920,17520,19520,20240,22240,20000,18720,19440,20640,20560,20000,17360,20320,19840,19120,20240,19600,19440,18800,21040,18640,21360,20560,21680,20000,19200,20880,19280,20480,19200,18960,18800,21680,19120,18480,19120,19360,18880,20400,18480,19520,18160,18960,20720,19040,19200,20080,19760,18960,19600,17840,19600,20720,20240,20160,19600,20240,18560,22240,19120,20080,18240,21040,18640,19200,18640,19680,18640,20960,19680,20080,18720,21520,18400,19680,19040,21040,20240,18160,20720,18640,20800,18080,18960,21120,19360,19120,16400,19280,18960,21440,18240,20480,21040,22640,21280,20400,18400,20400,18640,18640,18400,19120,21040,20160,18560,22000,19040,20560,21520,17440,19440,20240,19280,20320,20480,22000,19680,19360,19200,20480,18800,18080,18000,19600,19200,18240,21200,19040,19520,17600,17280,21840,20000,19440,19520,18560,18480,19120,19440,20160,20880,19440,19280,19120,18400,17680,19600,21600,18640,21280,19120,20880,21360,20240,20080,19440,21360,17920,18800,17920,18480,20160,21280,18560,19760,19360,21040,21040,19120,19920,22160,20800,21920,19040,20560,19200,19520,22160,20160,21840,19360,22480,20080,20480,19920,20320,20720,19120,19600,21280,22480,17680,20320,16480,19280,20240,19280,20000,21600,17520,19440,19520,17760,19440,19120,18720,20000,19520,18000,18960,20240,19920,17200,20800,23280,18960,17840,17440,20480,19440,18240,18560,20400,18240,16800,21120,18640,15360,18560,19200,20160,17920,20640,18800,20240,19920,19680,19520,21600,19200,19600,19520,17600,18320,20320,19200,20480,17360,18560,17760,18320,20240,18560,22400,18160,21280,17840,19680,21200,18880,19520,18400,19680,20480,18480,21280,20800,18000,19840,20400,18640,20480,20480,19520,18800,20880,19360,18400,22000,20480,19440,20800,17440,19680,21440,19440,21120,20560,19520,18400,19280,18800,20000,20640,19680,18560,19360,19200,21760,19520,19840,19360,18560,20000,20400,21200,20160,19680,19520,22160,19920,22240,21040,21040,19040,21520,20400,20640,21760,20960,18240,17840,21520,18880,20640,21360,19120,18560,17760,20560,19840,19520,19600,21280,21280,20160,19360,19120,18400,18000,19120,18800,18400,20240,21040,17280,20640,18080,18240,17920,18560,19920,18800,20480,21440,20320,18800,18320,20640,20560,18880,20880,21360,18000,19280,20640,19840,18800,19440,20160,19280,19040,18880,19440,19280,21520,18640,19440,20080,20720,17360,20080,18320,19520,19360,21280,18320,18560,22400,18880,20400,17360,20320,21200,18240,17920,19760,21040,20560,18640,18480,20400,20080,19280,19760,19280,19280,19360,18240,18160,18480,20880,17120,21680,19440,21120,18480,21840,18240,18800,19440,19520,18160,19280,21200,23200,17360,19920,22320,20880,20240,19680,20160,17200,19840,19280,19120,20240,20000,19040,19600,19760,20080,20880,20560,19280,21120,21280,19360,20640,19920,20640,20000,20080,18480,19520,20320,20160,18080,22480,19040,18160,18960,20000,20560,20320,18960,19840,20400,20480,19680,18320,19520,19600,19360,19760,18480,17840,19760,19440,20640,19520,18880,17840,18480,19680,20240,18720,22240,16960,18160,18880,19360,20880,19040,19920,19520,18560,19440,21760,18400,20320,20080,21840,19440,20160,21040,18480,18640,18800,18320,19120,17600,19520,17520,18560,18960,19600,18880,17040,19440,20160,17760,18800,20400,19600,18560,20160,19120,17040,19760,17600,18640,21200,18080,19120,19920,18880,19120,18880,19200,20320,18720,20960,18960,18960,19440,19680,19040,18800,18000,18320,18000,17680,19520,19040,19200,18480,19440,18400,18720,18960,20000,18080,18400,18400,17280,19440,16560,20400,20000,21600,17280,19280,20160,19840,18960,20720,19040,19600,18960,18880,18880,19040,20080,19600,16960,19920,19920,19840,20720,19360,20400,20960,21680,20560,22000,19600,20800,20240,17360,19440,17200,18640,18880,18240,19200,21280,18800,20320,20000,17840,18720,17760,20080,16800,20320,20720,18720,19840,19440,18880,19760,19040,20000,17040,18400,18320,21040,21120,18560,19600,19120,20880,18240,19840,18000,19600,20000,20160,19360,21360,20720,19120,20240,22480,20640,20400,19760,20720,19920,19200,20960,19600,18240,20240,21200,18960,19360,18560,17680,19200,20320,19600,20400,19040,20240,17840,19360,20160,20320,19840,20640,23200,17120,17760,18880,18800,20720,19520,19520,17040,18480,20160,21360,18400,19040,21120,19440,17040,21040,20720,18880,18400,20560,20000,21120,18000,19120,18800,17280,17360,17200,19600,20000,19680,19120,17520,18480,18880,18800,19840,18240,17360,19120,20720,19840,18800,18640,17680,20240,21520,20480,18880,19200,18160,19600,17440,20720,19360,19040,18560,20640,19440,19120,17760,20640,20080,19520,20000,21040,18800,19280,18320,21200,17040,18400,19760,21600,20160,17920,18560,18080,18080,19920,20640,19600,21440,20400,19600,21520,19360,18320,20000,18480,21280,20480,20320,20480,18080,21440,20480,21920,19680,19920,17600,18080,19440,18320,21680,20240,19840,19520,21760,20000,20000,20000,18000,20000,17680,18080,18880,20480,21680,18400,17600,21280,21920,16880,20880,18800,20800,21520,18560,18480,17760,21920,19680,17280,18480,20720,16160,20160,19920,18880,18800,21120,20240,17200,18400,20160,18720,19360,19200,20720,17760,19520,21280,19760,18640,18400,19520,19040,18400,18640,20720,20560,22320,17920,18800,20640,20480,21280,19760,18480,18080,19120,19440,18800,19920,19920,18800,19280,17520,19680,19680,21840,18160,18880,20000,18800,20720,18960,19040,20960,19680,19760,19200,21760,19920,18880,17280,19040,19680,17520,19440,21120,17280,18000,20640,16880,20000,21200,18960,23360,16800,19840,21600,19360,19440,21920,20480,21040,18000,20320,20240,19920,17280,19280,19760,19440,19600,18720,21680,19840,19520,19920,18800,17200,18880,20640,19840,19920,18480,21680,19440,19200,17840,20400,20720,19040,21520,19040,19280,20160,19040,20400,18160,20960,20080,18800,19680,19120,20960,20480,19280,18160,19920,19760,20000,24320,21600,18400,19600,19840,18480,18560,21040,19360,19680,21280,19840,21040,19760,18240,17680,18320,18640,20160,21760,17840,19200,18480,18800,19920,18480,19440,18640,20480,18800,20640,21120,18160,20880,19920,17760,20160,18080,18720,20160,19120,19440,20400,16720,17680,18800,20960,18400,20720,17440,19600,18160,17120,19760,19600,19760,19040,18640,18880,18320,21440,20160,16640,18480,16400,19200,18560,18800,18720,20880,19040,20560,18080,18480,19760,16480,17760,19920,18960,18880,19120,19200,20800,18160,17360,19040,20480,19680,20480,19840,20400,19520,21360,19600,18960,19760,19280,19200,18640,19120,18800,19280,20320,18160,20000,19120,20880,19760,20400,20960,20800,19120,18320,19520,18960,17760,18640,15840,18400,20560,19760,20560,18480,19520,20560,19360,21680,19600,19520,19200,16720,19040,19360,20880,19440,21600,20160,18080,17360,22720,18800,18720,20640,20560,18640,17680,21120,20880,20080,19120,19520,17280,19520,20960,19920,18480,18000,21280,18800,18720,20320,20960,20960,18640,19280,22560,20400,20160,19360,19520,20000,18160,18080,19280,23200,18880,17600,19360,20240,18000,18560,18400,20800,18560,21040,19200,17920,18640,17680,18880,20720,18400,17520,20160,20560,19280,18160,20720,19200,18240,17520,19840,17520,20480,20400,18960,20080,19440,21680,21280,19920,20240,20720,19840,17920,18960,17200,19680,18880,20480,19040,21360,18800,20080,20240,20160,20800,18720,19760,19760,18720,19520,18000,20960,19120,19200,21760,20240,19360,21280,20080,19520,22160,19120,19680,19520,19280,19920,18960,20320,19120,19600,20720,21600,21280,19760,21280,20320,19120,19520,18960,18960,18560,20800,20320,19600,17840,20240,21360,20960,18400,20240,21200,19760,18960,19280,18880,22640,22160,17920,19920,23520,21200,18560,19360,18480,19680,18400,18800,18720,18000,18880,18560,18080,23120,19440,20640,20480,19200,18400,18240,18560,21360,18160,19840,21120,19920,19200,19280,19680,17520,19760,18640,19920,20720,18000,21360,18560,19200,19520,18720,19760,20720,19600,22640,18240,17920,17440,20560,21600,20240,19520,20320,19920,21840,18960,18880,19680,20080,20240,19600,19840,19200,23040,18320,20320,18480,19440,20240,21600,20400,17520,19840,20480,17920,17280,21200,19760,18480,18000,18720,18400,20240,20560,19200,19600,19840,18640,17280,23440,20880,20480,18320,20960,19760,18480,20000,18800,18560,20880,22080,19360,23040,19040,20480,21920,20720,21520,21680,22560,20320,18960,20000,19040,20960,18720,16240,18880,18000,20640,18000,20400]}]},"null_count":0,"tot_col_size":159339680,"last_update_version":401695328136069121},"ps_supplycost":{"histogram":{"ndv":100384,"buckets":[{"count":160000,"lower_bound":"MS4wOQ==","upper_bound":"NS40OA==","repeats":398},{"count":320000,"lower_bound":"NS41","upper_bound":"OS4xOQ==","repeats":398},{"count":480000,"lower_bound":"OS4yOA==","upper_bound":"MTQuNzc=","repeats":398},{"count":640000,"lower_bound":"MTQuODM=","upper_bound":"MTkuNTc=","repeats":398},{"count":800000,"lower_bound":"MTkuNjE=","upper_bound":"MjQuNDg=","repeats":398},{"count":960000,"lower_bound":"MjQuODE=","upper_bound":"MjcuNDk=","repeats":398},{"count":1120000,"lower_bound":"MjcuNg==","upper_bound":"MzEuNDE=","repeats":398},{"count":1280000,"lower_bound":"MzEuNTM=","upper_bound":"MzUuMjg=","repeats":398},{"count":1440000,"lower_bound":"MzUuNDU=","upper_bound":"MzkuMDg=","repeats":398},{"count":1600000,"lower_bound":"MzkuMTQ=","upper_bound":"NDIuODM=","repeats":398},{"count":1760000,"lower_bound":"NDIuODk=","upper_bound":"NDguMTc=","repeats":398},{"count":1920000,"lower_bound":"NDguNDg=","upper_bound":"NTIuNDE=","repeats":398},{"count":2080000,"lower_bound":"NTIuNTc=","upper_bound":"NTYuNDg=","repeats":398},{"count":2240000,"lower_bound":"NTYuNTI=","upper_bound":"NTguODk=","repeats":4398},{"count":2400000,"lower_bound":"NTguOQ==","upper_bound":"NjIuOTU=","repeats":398},{"count":2560000,"lower_bound":"NjMuMDk=","upper_bound":"Njc=","repeats":398},{"count":2720000,"lower_bound":"NjcuMDY=","upper_bound":"NzAuNDU=","repeats":398},{"count":2880000,"lower_bound":"NzAuNDY=","upper_bound":"NzQuNQ==","repeats":398},{"count":3040000,"lower_bound":"NzQuNTQ=","upper_bound":"NzguMDQ=","repeats":398},{"count":3200000,"lower_bound":"NzguMDg=","upper_bound":"ODEuNTM=","repeats":398},{"count":3360000,"lower_bound":"ODEuNjI=","upper_bound":"ODYuMDY=","repeats":398},{"count":3520000,"lower_bound":"ODYuMDc=","upper_bound":"ODkuMzM=","repeats":398},{"count":3680000,"lower_bound":"ODkuMzQ=","upper_bound":"OTIuODM=","repeats":398},{"count":3844000,"lower_bound":"OTIuODY=","upper_bound":"OTYuODg=","repeats":4398},{"count":4004000,"lower_bound":"OTYuOTc=","upper_bound":"MTAwLjI2","repeats":398},{"count":4164000,"lower_bound":"MTAwLjI3","upper_bound":"MTAzLjU1","repeats":398},{"count":4324000,"lower_bound":"MTAzLjYx","upper_bound":"MTA5","repeats":398},{"count":4484000,"lower_bound":"MTA5LjA5","upper_bound":"MTEyLjI1","repeats":398},{"count":4644000,"lower_bound":"MTEyLjM=","upper_bound":"MTE1LjI3","repeats":398},{"count":4804000,"lower_bound":"MTE1LjQx","upper_bound":"MTE4Ljg1","repeats":398},{"count":4964000,"lower_bound":"MTE5LjA2","upper_bound":"MTIyLjYx","repeats":398},{"count":5124000,"lower_bound":"MTIyLjY1","upper_bound":"MTI2LjE4","repeats":398},{"count":5284000,"lower_bound":"MTI2LjMz","upper_bound":"MTMwLjE3","repeats":398},{"count":5444000,"lower_bound":"MTMwLjE4","upper_bound":"MTMzLjk=","repeats":398},{"count":5604000,"lower_bound":"MTMzLjk1","upper_bound":"MTM3Ljc1","repeats":398},{"count":5764000,"lower_bound":"MTM3Ljg0","upper_bound":"MTQwLjk4","repeats":398},{"count":5928000,"lower_bound":"MTQxLjA2","upper_bound":"MTQ0LjYy","repeats":4398},{"count":6088000,"lower_bound":"MTQ0Ljcx","upper_bound":"MTQ4LjM0","repeats":398},{"count":6248000,"lower_bound":"MTQ4LjQ3","upper_bound":"MTUyLjcz","repeats":398},{"count":6408000,"lower_bound":"MTUyLjc2","upper_bound":"MTU2LjAx","repeats":398},{"count":6576000,"lower_bound":"MTU2LjE1","upper_bound":"MTYxLjI0","repeats":8398},{"count":6736000,"lower_bound":"MTYxLjI1","upper_bound":"MTY0LjIx","repeats":398},{"count":6896000,"lower_bound":"MTY0LjMy","upper_bound":"MTY3LjYz","repeats":398},{"count":7056000,"lower_bound":"MTY3LjY2","upper_bound":"MTcxLjM3","repeats":398},{"count":7216000,"lower_bound":"MTcxLjQy","upper_bound":"MTc1LjAz","repeats":398},{"count":7376000,"lower_bound":"MTc1LjA4","upper_bound":"MTc5LjM2","repeats":398},{"count":7536000,"lower_bound":"MTc5LjM4","upper_bound":"MTgzLjc=","repeats":398},{"count":7696000,"lower_bound":"MTg0LjA5","upper_bound":"MTg2Ljg=","repeats":398},{"count":7856000,"lower_bound":"MTg3LjAz","upper_bound":"MTkxLjM3","repeats":398},{"count":8016000,"lower_bound":"MTkxLjQ0","upper_bound":"MTk1LjI1","repeats":398},{"count":8176000,"lower_bound":"MTk1LjM2","upper_bound":"MjAyLjM2","repeats":398},{"count":8336000,"lower_bound":"MjAyLjM3","upper_bound":"MjA2Ljg2","repeats":398},{"count":8496000,"lower_bound":"MjA2Ljg3","upper_bound":"MjExLjIz","repeats":398},{"count":8656000,"lower_bound":"MjExLjI4","upper_bound":"MjE1LjQ3","repeats":398},{"count":8816000,"lower_bound":"MjE1LjY0","upper_bound":"MjE5LjY3","repeats":398},{"count":8976000,"lower_bound":"MjE5Ljg5","upper_bound":"MjIyLjgz","repeats":398},{"count":9136000,"lower_bound":"MjIzLjA4","upper_bound":"MjI2LjIz","repeats":398},{"count":9296000,"lower_bound":"MjI2LjM0","upper_bound":"MjI5LjUz","repeats":398},{"count":9456000,"lower_bound":"MjI5LjY=","upper_bound":"MjMzLjUx","repeats":398},{"count":9616000,"lower_bound":"MjMzLjUy","upper_bound":"MjM3LjY5","repeats":398},{"count":9776000,"lower_bound":"MjM4","upper_bound":"MjQxLjQy","repeats":398},{"count":9936000,"lower_bound":"MjQxLjUz","upper_bound":"MjQ2LjQ3","repeats":398},{"count":10096000,"lower_bound":"MjQ2LjY0","upper_bound":"MjUxLjA1","repeats":398},{"count":10256000,"lower_bound":"MjUxLjI=","upper_bound":"MjU1LjAx","repeats":398},{"count":10416000,"lower_bound":"MjU1LjA0","upper_bound":"MjYwLjM1","repeats":398},{"count":10576000,"lower_bound":"MjYwLjQz","upper_bound":"MjYzLjYz","repeats":398},{"count":10736000,"lower_bound":"MjYzLjY2","upper_bound":"MjY3LjU=","repeats":398},{"count":10896000,"lower_bound":"MjY3LjUz","upper_bound":"MjcxLjg0","repeats":398},{"count":11056000,"lower_bound":"MjcyLjI0","upper_bound":"Mjc2LjY4","repeats":398},{"count":11216000,"lower_bound":"Mjc2Ljc1","upper_bound":"MjgwLjQ2","repeats":398},{"count":11376000,"lower_bound":"MjgwLjU3","upper_bound":"MjgzLjk5","repeats":398},{"count":11536000,"lower_bound":"Mjg0LjE=","upper_bound":"Mjg3LjU2","repeats":398},{"count":11696000,"lower_bound":"Mjg3LjU5","upper_bound":"MjkxLjQy","repeats":398},{"count":11856000,"lower_bound":"MjkxLjQ2","upper_bound":"Mjk1LjQ=","repeats":398},{"count":12016000,"lower_bound":"Mjk1LjQ3","upper_bound":"Mjk4LjQx","repeats":398},{"count":12180000,"lower_bound":"Mjk4LjUy","upper_bound":"MzAyLjc3","repeats":4398},{"count":12340000,"lower_bound":"MzAyLjg0","upper_bound":"MzA2LjI=","repeats":398},{"count":12500000,"lower_bound":"MzA2LjMx","upper_bound":"MzA5LjM4","repeats":398},{"count":12660000,"lower_bound":"MzA5LjM5","upper_bound":"MzEyLjgx","repeats":398},{"count":12820000,"lower_bound":"MzEyLjg5","upper_bound":"MzE2Ljg2","repeats":398},{"count":12980000,"lower_bound":"MzE2Ljkx","upper_bound":"MzIxLjc3","repeats":398},{"count":13140000,"lower_bound":"MzIxLjg0","upper_bound":"MzI2LjM=","repeats":398},{"count":13300000,"lower_bound":"MzI2Ljk=","upper_bound":"MzMxLjk1","repeats":398},{"count":13460000,"lower_bound":"MzMxLjk3","upper_bound":"MzM2Ljg=","repeats":398},{"count":13620000,"lower_bound":"MzM3LjEx","upper_bound":"MzQxLjQy","repeats":398},{"count":13780000,"lower_bound":"MzQxLjYy","upper_bound":"MzQ1LjM1","repeats":398},{"count":13940000,"lower_bound":"MzQ1LjU0","upper_bound":"MzQ4Ljk=","repeats":398},{"count":14100000,"lower_bound":"MzQ5LjAy","upper_bound":"MzUyLjUy","repeats":4398},{"count":14260000,"lower_bound":"MzUyLjgz","upper_bound":"MzU2LjEy","repeats":398},{"count":14420000,"lower_bound":"MzU2LjE2","upper_bound":"MzU5Ljkz","repeats":398},{"count":14580000,"lower_bound":"MzU5Ljk0","upper_bound":"MzY0LjA4","repeats":398},{"count":14740000,"lower_bound":"MzY0LjMz","upper_bound":"MzY4LjU=","repeats":398},{"count":14900000,"lower_bound":"MzY4LjUy","upper_bound":"MzcxLjk5","repeats":398},{"count":15060000,"lower_bound":"MzcyLjA2","upper_bound":"Mzc1Ljc4","repeats":398},{"count":15220000,"lower_bound":"Mzc1Ljg=","upper_bound":"Mzc4Ljgy","repeats":398},{"count":15380000,"lower_bound":"Mzc4Ljk5","upper_bound":"MzgyLjU=","repeats":398},{"count":15540000,"lower_bound":"MzgyLjYx","upper_bound":"Mzg1Ljk4","repeats":4398},{"count":15700000,"lower_bound":"Mzg2LjE1","upper_bound":"MzkwLjc5","repeats":398},{"count":15860000,"lower_bound":"MzkwLjg0","upper_bound":"Mzk1LjM3","repeats":398},{"count":16020000,"lower_bound":"Mzk1LjQ1","upper_bound":"NDAwLjA4","repeats":398},{"count":16180000,"lower_bound":"NDAwLjE2","upper_bound":"NDA0LjA5","repeats":398},{"count":16340000,"lower_bound":"NDA0LjEy","upper_bound":"NDA4LjYx","repeats":4398},{"count":16500000,"lower_bound":"NDA4LjY4","upper_bound":"NDEzLjc0","repeats":398},{"count":16660000,"lower_bound":"NDEzLjc1","upper_bound":"NDE3LjY0","repeats":398},{"count":16820000,"lower_bound":"NDE3Ljc=","upper_bound":"NDIyLjE=","repeats":398},{"count":16980000,"lower_bound":"NDIyLjI3","upper_bound":"NDI1LjQ2","repeats":398},{"count":17140000,"lower_bound":"NDI1LjUx","upper_bound":"NDI5LjM4","repeats":398},{"count":17300000,"lower_bound":"NDI5LjYy","upper_bound":"NDMzLjk3","repeats":398},{"count":17460000,"lower_bound":"NDM0LjE4","upper_bound":"NDM4LjE4","repeats":398},{"count":17620000,"lower_bound":"NDM4LjM2","upper_bound":"NDQyLjQz","repeats":398},{"count":17780000,"lower_bound":"NDQyLjQ1","upper_bound":"NDQ2LjE2","repeats":398},{"count":17940000,"lower_bound":"NDQ2LjI3","upper_bound":"NDUwLjE=","repeats":398},{"count":18100000,"lower_bound":"NDUwLjMx","upper_bound":"NDU0LjA5","repeats":398},{"count":18260000,"lower_bound":"NDU0LjIy","upper_bound":"NDU4LjIx","repeats":398},{"count":18420000,"lower_bound":"NDU4LjM0","upper_bound":"NDYyLjAy","repeats":398},{"count":18580000,"lower_bound":"NDYyLjA1","upper_bound":"NDY2LjA1","repeats":4398},{"count":18740000,"lower_bound":"NDY2LjEy","upper_bound":"NDY5Ljg0","repeats":398},{"count":18900000,"lower_bound":"NDY5Ljg3","upper_bound":"NDczLjIx","repeats":398},{"count":19060000,"lower_bound":"NDczLjIy","upper_bound":"NDc3Ljk0","repeats":398},{"count":19220000,"lower_bound":"NDc4","upper_bound":"NDgyLjA2","repeats":398},{"count":19380000,"lower_bound":"NDgyLjI0","upper_bound":"NDg2LjQz","repeats":398},{"count":19540000,"lower_bound":"NDg2LjU0","upper_bound":"NDg5Ljk0","repeats":398},{"count":19700000,"lower_bound":"NDg5Ljk5","upper_bound":"NDkzLjcy","repeats":398},{"count":19860000,"lower_bound":"NDkzLjc0","upper_bound":"NDk4LjA2","repeats":398},{"count":20020000,"lower_bound":"NDk4LjE2","upper_bound":"NTAxLjgx","repeats":398},{"count":20180000,"lower_bound":"NTAxLjkx","upper_bound":"NTA1LjY0","repeats":398},{"count":20340000,"lower_bound":"NTA1LjY3","upper_bound":"NTA5Ljg5","repeats":398},{"count":20500000,"lower_bound":"NTA5Ljkz","upper_bound":"NTE0LjE0","repeats":398},{"count":20660000,"lower_bound":"NTE0LjE1","upper_bound":"NTE3Ljc1","repeats":398},{"count":20824000,"lower_bound":"NTE3Ljky","upper_bound":"NTIxLjE5","repeats":4398},{"count":20984000,"lower_bound":"NTIxLjM4","upper_bound":"NTI1LjQz","repeats":398},{"count":21144000,"lower_bound":"NTI1LjQ3","upper_bound":"NTMwLjE4","repeats":398},{"count":21308000,"lower_bound":"NTMwLjQ=","upper_bound":"NTM0LjU=","repeats":4398},{"count":21468000,"lower_bound":"NTM0LjU3","upper_bound":"NTM4LjM=","repeats":398},{"count":21628000,"lower_bound":"NTM4LjMy","upper_bound":"NTQxLjU3","repeats":398},{"count":21788000,"lower_bound":"NTQxLjY=","upper_bound":"NTQ1LjM3","repeats":398},{"count":21948000,"lower_bound":"NTQ1LjQ0","upper_bound":"NTUwLjQx","repeats":398},{"count":22108000,"lower_bound":"NTUwLjQ1","upper_bound":"NTU0LjQ0","repeats":4398},{"count":22268000,"lower_bound":"NTU0LjUy","upper_bound":"NTU4LjUy","repeats":398},{"count":22428000,"lower_bound":"NTU4Ljc4","upper_bound":"NTYyLjQ4","repeats":398},{"count":22588000,"lower_bound":"NTYyLjU0","upper_bound":"NTY1Ljk4","repeats":4398},{"count":22748000,"lower_bound":"NTY2LjI=","upper_bound":"NTY5LjE=","repeats":398},{"count":22908000,"lower_bound":"NTY5LjE4","upper_bound":"NTczLjE0","repeats":398},{"count":23068000,"lower_bound":"NTczLjE4","upper_bound":"NTc3LjM3","repeats":398},{"count":23228000,"lower_bound":"NTc3LjQ3","upper_bound":"NTgx","repeats":398},{"count":23388000,"lower_bound":"NTgxLjAz","upper_bound":"NTg0Ljk1","repeats":398},{"count":23548000,"lower_bound":"NTg1","upper_bound":"NTg4LjI4","repeats":398},{"count":23708000,"lower_bound":"NTg4LjM=","upper_bound":"NTkyLjY1","repeats":398},{"count":23868000,"lower_bound":"NTkyLjg2","upper_bound":"NTk3Ljkx","repeats":398},{"count":24028000,"lower_bound":"NTk3Ljkz","upper_bound":"NjAyLjA4","repeats":398},{"count":24188000,"lower_bound":"NjAyLjE0","upper_bound":"NjA1LjQ0","repeats":398},{"count":24348000,"lower_bound":"NjA1LjQ1","upper_bound":"NjEwLjMz","repeats":398},{"count":24508000,"lower_bound":"NjEwLjM4","upper_bound":"NjEzLjk1","repeats":398},{"count":24668000,"lower_bound":"NjE0LjIy","upper_bound":"NjE3Ljg5","repeats":398},{"count":24828000,"lower_bound":"NjE4LjA2","upper_bound":"NjIxLjY1","repeats":398},{"count":24988000,"lower_bound":"NjIxLjc=","upper_bound":"NjI1LjE2","repeats":398},{"count":25148000,"lower_bound":"NjI1LjM=","upper_bound":"NjI5LjIx","repeats":398},{"count":25312000,"lower_bound":"NjI5LjU3","upper_bound":"NjMzLjc0","repeats":4398},{"count":25472000,"lower_bound":"NjMzLjc3","upper_bound":"NjM3LjIz","repeats":398},{"count":25632000,"lower_bound":"NjM3LjM2","upper_bound":"NjQxLjQ3","repeats":398},{"count":25792000,"lower_bound":"NjQxLjY4","upper_bound":"NjQ1Ljkz","repeats":398},{"count":25952000,"lower_bound":"NjQ2LjA4","upper_bound":"NjUwLjQ1","repeats":398},{"count":26112000,"lower_bound":"NjUwLjUz","upper_bound":"NjU0LjU3","repeats":4398},{"count":26272000,"lower_bound":"NjU0LjYy","upper_bound":"NjU5Ljc=","repeats":398},{"count":26432000,"lower_bound":"NjU5Ljcz","upper_bound":"NjYzLjEx","repeats":398},{"count":26592000,"lower_bound":"NjYzLjM5","upper_bound":"NjY3LjE2","repeats":398},{"count":26752000,"lower_bound":"NjY3LjIy","upper_bound":"NjcxLjc3","repeats":398},{"count":26912000,"lower_bound":"NjcxLjc5","upper_bound":"Njc1Ljk0","repeats":398},{"count":27072000,"lower_bound":"Njc2LjI1","upper_bound":"NjgwLjI5","repeats":398},{"count":27232000,"lower_bound":"NjgwLjcy","upper_bound":"Njg0LjA0","repeats":398},{"count":27392000,"lower_bound":"Njg0LjIx","upper_bound":"Njg3LjUz","repeats":398},{"count":27552000,"lower_bound":"Njg3Ljgy","upper_bound":"NjkyLjQ=","repeats":398},{"count":27712000,"lower_bound":"NjkyLjQ3","upper_bound":"Njk2LjQ=","repeats":398},{"count":27876000,"lower_bound":"Njk2LjQ2","upper_bound":"Njk5Ljgy","repeats":4398},{"count":28036000,"lower_bound":"Njk5Ljg1","upper_bound":"NzA1LjU4","repeats":398},{"count":28196000,"lower_bound":"NzA1LjYx","upper_bound":"NzA4Ljg5","repeats":398},{"count":28356000,"lower_bound":"NzA4Ljk3","upper_bound":"NzEzLjY3","repeats":398},{"count":28516000,"lower_bound":"NzEzLjY5","upper_bound":"NzE2Ljg1","repeats":398},{"count":28676000,"lower_bound":"NzE2Ljk3","upper_bound":"NzIwLjUz","repeats":398},{"count":28836000,"lower_bound":"NzIwLjU0","upper_bound":"NzIzLjE0","repeats":398},{"count":28996000,"lower_bound":"NzIzLjM1","upper_bound":"NzI3LjI1","repeats":398},{"count":29156000,"lower_bound":"NzI3LjI4","upper_bound":"NzMxLjIx","repeats":398},{"count":29316000,"lower_bound":"NzMxLjIy","upper_bound":"NzM1LjY4","repeats":398},{"count":29476000,"lower_bound":"NzM1Ljc0","upper_bound":"NzQwLjM5","repeats":398},{"count":29636000,"lower_bound":"NzQwLjc2","upper_bound":"NzQ0LjY3","repeats":398},{"count":29796000,"lower_bound":"NzQ0Ljc=","upper_bound":"NzQ3Ljc=","repeats":398},{"count":29956000,"lower_bound":"NzQ3Ljg4","upper_bound":"NzUyLjgz","repeats":398},{"count":30116000,"lower_bound":"NzUyLjg1","upper_bound":"NzU2LjY=","repeats":398},{"count":30276000,"lower_bound":"NzU2LjYz","upper_bound":"NzYwLjgz","repeats":398},{"count":30436000,"lower_bound":"NzYwLjg1","upper_bound":"NzY0Ljc1","repeats":398},{"count":30600000,"lower_bound":"NzY0Ljg2","upper_bound":"NzY4LjQ4","repeats":4398},{"count":30760000,"lower_bound":"NzY4LjU3","upper_bound":"NzcyLjg5","repeats":398},{"count":30920000,"lower_bound":"NzczLjE=","upper_bound":"Nzc2LjU5","repeats":398},{"count":31080000,"lower_bound":"Nzc2LjY1","upper_bound":"NzgwLjIz","repeats":398},{"count":31240000,"lower_bound":"NzgwLjM1","upper_bound":"Nzg0LjI2","repeats":398},{"count":31400000,"lower_bound":"Nzg0LjM5","upper_bound":"Nzg4LjUy","repeats":398},{"count":31560000,"lower_bound":"Nzg4LjY=","upper_bound":"NzkyLjk5","repeats":398},{"count":31720000,"lower_bound":"Nzkz","upper_bound":"Nzk2LjQ3","repeats":398},{"count":31880000,"lower_bound":"Nzk2LjU=","upper_bound":"ODAwLjg3","repeats":398},{"count":32040000,"lower_bound":"ODAxLjEz","upper_bound":"ODA1LjEz","repeats":398},{"count":32200000,"lower_bound":"ODA1LjE0","upper_bound":"ODA4LjI3","repeats":398},{"count":32360000,"lower_bound":"ODA4LjM1","upper_bound":"ODExLjU2","repeats":398},{"count":32520000,"lower_bound":"ODExLjU3","upper_bound":"ODE1LjQx","repeats":398},{"count":32680000,"lower_bound":"ODE1LjYy","upper_bound":"ODE5LjY3","repeats":398},{"count":32840000,"lower_bound":"ODE5Ljcy","upper_bound":"ODI0LjE5","repeats":398},{"count":33000000,"lower_bound":"ODI0LjQ4","upper_bound":"ODI4LjA1","repeats":398},{"count":33164000,"lower_bound":"ODI4LjE2","upper_bound":"ODMxLjE0","repeats":4398},{"count":33324000,"lower_bound":"ODMxLjE2","upper_bound":"ODM1LjU0","repeats":4398},{"count":33484000,"lower_bound":"ODM1LjU5","upper_bound":"ODM5Ljgz","repeats":398},{"count":33644000,"lower_bound":"ODM5Ljg1","upper_bound":"ODQzLjM0","repeats":4398},{"count":33804000,"lower_bound":"ODQzLjM1","upper_bound":"ODQ3LjI3","repeats":398},{"count":33964000,"lower_bound":"ODQ3LjM=","upper_bound":"ODUxLjE2","repeats":398},{"count":34124000,"lower_bound":"ODUxLjI=","upper_bound":"ODU1LjEx","repeats":4398},{"count":34284000,"lower_bound":"ODU1LjE3","upper_bound":"ODU4Ljk1","repeats":398},{"count":34444000,"lower_bound":"ODU5","upper_bound":"ODYzLjI1","repeats":398},{"count":34604000,"lower_bound":"ODYzLjU1","upper_bound":"ODY3LjU0","repeats":398},{"count":34768000,"lower_bound":"ODY3LjU3","upper_bound":"ODcxLjA1","repeats":4398},{"count":34928000,"lower_bound":"ODcxLjA2","upper_bound":"ODc1LjEz","repeats":398},{"count":35088000,"lower_bound":"ODc1LjIz","upper_bound":"ODc3LjY4","repeats":398},{"count":35248000,"lower_bound":"ODc3Ljc0","upper_bound":"ODgxLjMz","repeats":398},{"count":35412000,"lower_bound":"ODgxLjU2","upper_bound":"ODg1Ljc1","repeats":4398},{"count":35572000,"lower_bound":"ODg2LjA4","upper_bound":"ODkwLjY0","repeats":398},{"count":35732000,"lower_bound":"ODkwLjcz","upper_bound":"ODkzLjgx","repeats":398},{"count":35892000,"lower_bound":"ODkzLjg4","upper_bound":"ODk4LjM3","repeats":398},{"count":36052000,"lower_bound":"ODk4LjM5","upper_bound":"OTAzLjQ=","repeats":398},{"count":36212000,"lower_bound":"OTAzLjU=","upper_bound":"OTA2Ljky","repeats":398},{"count":36372000,"lower_bound":"OTA3LjE0","upper_bound":"OTEwLjkz","repeats":398},{"count":36532000,"lower_bound":"OTEwLjk5","upper_bound":"OTE1LjEz","repeats":398},{"count":36692000,"lower_bound":"OTE1LjE5","upper_bound":"OTE5LjI5","repeats":398},{"count":36852000,"lower_bound":"OTE5Ljk=","upper_bound":"OTIzLjk3","repeats":398},{"count":37012000,"lower_bound":"OTI0LjAz","upper_bound":"OTI3Ljky","repeats":4398},{"count":37172000,"lower_bound":"OTI4","upper_bound":"OTMyLjI1","repeats":398},{"count":37332000,"lower_bound":"OTMyLjQx","upper_bound":"OTM1LjUx","repeats":398},{"count":37492000,"lower_bound":"OTM1LjU4","upper_bound":"OTM5LjM4","repeats":398},{"count":37652000,"lower_bound":"OTM5LjQy","upper_bound":"OTQzLjQ4","repeats":398},{"count":37812000,"lower_bound":"OTQzLjg2","upper_bound":"OTQ4LjYz","repeats":4398},{"count":37972000,"lower_bound":"OTQ4LjY5","upper_bound":"OTUyLjM3","repeats":398},{"count":38132000,"lower_bound":"OTUyLjU4","upper_bound":"OTU2LjE1","repeats":398},{"count":38292000,"lower_bound":"OTU2LjMz","upper_bound":"OTU5Ljc4","repeats":398},{"count":38452000,"lower_bound":"OTU5Ljc5","upper_bound":"OTYzLjI0","repeats":398},{"count":38612000,"lower_bound":"OTYzLjI2","upper_bound":"OTY3LjM4","repeats":398},{"count":38772000,"lower_bound":"OTY3LjM5","upper_bound":"OTcwLjAz","repeats":398},{"count":38932000,"lower_bound":"OTcwLjI1","upper_bound":"OTczLjQ5","repeats":398},{"count":39092000,"lower_bound":"OTczLjYx","upper_bound":"OTc4LjI1","repeats":398},{"count":39252000,"lower_bound":"OTc4LjI5","upper_bound":"OTgyLjI0","repeats":398},{"count":39412000,"lower_bound":"OTgyLjM=","upper_bound":"OTg3LjYx","repeats":398},{"count":39572000,"lower_bound":"OTg3LjY1","upper_bound":"OTkwLjU0","repeats":398},{"count":39732000,"lower_bound":"OTkwLjU5","upper_bound":"OTkzLjM3","repeats":398},{"count":39892000,"lower_bound":"OTkzLjM5","upper_bound":"OTk3LjA0","repeats":398},{"count":40000000,"lower_bound":"OTk3LjA5","upper_bound":"OTk5Ljcy","repeats":398}]},"cm_sketch":{"rows":[{"counters":[16548,19354,16703,19688,18788,14891,25911,23960,16370,18103,19143,18871,20292,21127,20866,22538,22063,23506,18021,25587,19632,24892,18584,22825,15973,18393,24156,20670,22485,23645,15961,18031,14802,20138,17376,17694,20672,16032,20175,19762,19004,21060,17181,18211,21320,20783,24225,14621,20394,24108,17373,19554,22578,19404,22435,21512,18251,17155,25806,20849,19671,20589,19129,18126,19593,16280,18573,20094,18015,17786,18160,19844,20835,27753,21473,22244,19481,22884,18227,18414,21969,23348,21191,15891,15278,15611,23696,21337,20317,16084,22091,15778,17660,22816,22878,19524,18835,18929,16295,19806,18166,27531,26203,13578,20196,16672,16001,24144,21542,21555,19869,19539,20482,19985,19799,21736,14378,18110,23268,18729,22531,22512,20465,16372,17158,21061,18557,20409,19964,18525,21139,18714,16199,18999,18910,15417,23918,18817,12065,14418,20708,18448,19261,22492,17331,26009,21394,18057,20185,21330,19266,25360,15994,20880,24126,16169,21416,19866,17017,19612,17707,16211,22586,19949,18121,16742,20096,21078,14623,19083,19462,19758,20619,18320,21287,15267,18937,23692,18773,19247,16408,24719,20524,19449,19521,16801,17823,17499,22431,18438,19973,16505,21073,17069,23488,17112,15534,22942,18926,20539,20738,19607,20451,18874,17579,20615,18944,19457,20652,15806,20798,21440,20365,18043,19419,20936,23167,14367,17133,24244,18987,18577,25290,18814,16867,20918,16356,20943,20070,24980,20081,22465,27594,21435,19256,15177,16198,14010,19621,17171,18078,20358,20219,18781,19868,18604,20988,22981,13875,23883,14125,17900,21183,20866,19506,17719,16345,19478,19912,22973,18852,16363,17678,16329,16363,15649,18430,22771,19274,18419,17795,14167,21266,19483,20360,17497,20124,17209,21675,16320,13768,21619,18713,21551,18877,19469,18939,23282,24692,23719,24149,16815,28197,19577,17474,19244,17959,19105,22106,16253,18534,21895,18742,18674,22446,18766,18934,16262,22492,19152,20955,14716,23241,21730,14883,19911,19193,17878,17592,18458,20821,16796,18090,16434,20680,18913,19913,15326,21012,26683,21028,17289,18069,18946,22132,20694,21541,15699,18745,18906,14027,16325,19208,18270,17065,21142,13811,22973,16675,15252,14849,20406,20912,19391,20951,22918,19062,20125,19214,21503,22298,20519,17693,18299,16846,24834,15574,23021,20016,21567,20212,17841,17178,20350,21180,20099,16772,23558,13265,21338,13235,18753,23428,20861,17755,23674,18582,15996,20646,20637,19407,23565,19862,22062,20398,18448,21750,19630,15535,23035,23251,16946,21454,22042,19691,20808,18322,26702,17127,15204,15743,17797,20783,18752,18517,17158,19248,21286,19714,25312,17625,17732,19764,21716,21341,22486,22065,19758,16974,21041,15544,15749,19159,15193,20154,16260,21028,19394,21723,18354,17773,12478,23429,23125,22313,22477,22036,18382,21778,15028,16401,18581,18847,19423,25029,22717,24285,24024,19265,21446,18934,18623,24464,22781,22536,23074,20089,16790,18481,19914,18864,16152,23589,18938,22539,20471,22963,18106,19152,18437,16211,18356,18647,19157,19387,18282,16421,17631,16648,15729,15412,17436,18821,19452,19625,17426,18205,19636,18845,13308,12312,18454,14010,18967,21935,20001,19845,16624,15524,18294,18294,26551,18303,22733,16733,17956,21567,16274,17961,16667,25215,16053,16901,18056,17217,22355,16872,16941,17583,18807,18360,20065,21612,16631,15231,12573,15239,22549,19689,20887,20253,26090,23416,24840,17250,17688,22920,19391,18713,23087,20466,17879,17336,25634,19537,21012,15155,18123,15528,20452,21941,20632,20367,17078,15124,22224,18424,16248,18757,20415,16911,16736,23227,13245,19000,23341,18752,18966,20333,22850,16076,19850,20672,23776,17476,14181,15997,22695,19812,16397,18755,15874,24832,22880,17488,22248,17243,16527,20481,17470,21942,19940,20101,17876,15786,21167,22849,19533,24090,25282,20001,17262,13704,20615,18089,15633,21575,22278,19222,15086,19880,21623,23143,17909,17762,14898,21756,22994,20086,18998,17715,23685,19969,17806,19134,24396,20488,18200,18175,16463,24677,16909,21582,17792,20352,18430,18690,19593,18918,15027,17677,17810,18311,26784,23237,16413,16902,15571,19191,20664,21544,20694,18251,24631,18494,24489,21212,13855,22062,16431,17041,19729,20869,17277,22495,16482,17189,19148,22305,19913,22312,19757,23738,19147,23542,16844,19472,20260,22759,23821,22446,22798,19929,23748,16401,20687,22560,19166,16353,14493,19814,22554,18313,22734,17912,21860,20663,18104,20183,19884,19936,18111,21571,23791,22368,17232,19594,15627,22330,21193,24724,20323,17959,20153,17628,22479,21215,15264,17942,18036,23545,18951,20731,23353,13575,25009,20807,18645,22746,19568,17520,13876,19199,14937,16647,15184,21666,20213,18750,23394,18567,21424,23931,17814,19877,21296,22148,18720,18207,16084,21900,23885,20259,21504,19847,16264,24268,15907,23449,21685,20035,21236,17212,23964,21953,24648,17903,14102,17513,17663,20504,19140,20783,18368,23083,20455,19521,21099,18979,18084,18195,19607,18756,19354,15936,23771,19218,21182,23051,23055,16769,20540,20333,23242,24830,18404,18077,16843,22123,21518,21339,19961,18504,17054,21513,21718,24010,22960,18296,22953,18103,19003,19682,25182,16419,23600,22025,23844,21732,23246,19530,23625,22277,15597,17600,16784,18981,21315,17652,17858,19213,21527,20596,19248,21757,21133,14762,21067,19542,20212,17621,15827,21349,15646,18463,24741,11968,16994,20990,13533,17014,23462,14415,16149,23123,16649,17047,16042,20883,18721,20689,17712,23265,17955,18097,23964,19569,25568,17925,20568,16668,17147,19332,22643,20537,23279,25693,21248,16718,15214,16650,20447,19998,15589,16989,16891,21588,20569,17309,17997,17851,16898,22232,19349,15630,16957,20276,21060,19368,13913,19497,20729,19894,20482,21252,17346,19634,17942,19504,16176,19878,21651,16658,19675,22652,17206,20031,20400,18495,16553,12446,18350,22782,21166,24092,23183,19921,15223,16129,21067,19907,20499,16883,16267,21952,18479,15425,24833,19725,19542,23719,16482,20330,22971,19448,19697,22073,18120,17118,15749,20805,19319,15040,22991,17557,20534,26145,17857,22042,17784,20586,25474,19869,18185,20035,20478,14414,17659,18988,19562,18920,14483,16558,17001,17620,20833,20605,16627,24174,23164,15724,12762,21355,19859,20099,17603,18404,16809,19224,20413,16043,15506,20080,16963,17216,21883,25489,18873,19063,14422,19842,20786,21210,24690,18013,14114,17408,22057,21114,20840,26413,17299,19750,18980,20233,17806,18848,16099,13719,18964,17980,18431,20440,19472,21607,22979,18033,20780,24022,20667,13620,19752,21667,22650,21820,17602,21587,16352,18346,16336,18087,19190,21947,17275,16206,20249,22826,14820,23895,23501,19638,21238,18571,16912,20415,21393,14966,16317,18810,15748,16825,23097,15350,22519,19156,22065,20981,22004,17309,19632,20191,21003,19725,19558,22204,22567,19774,20072,16018,15140,20129,20944,16902,19798,21217,14403,18926,14851,15421,20424,21206,20104,20745,26388,22605,19756,17926,21622,21723,19909,25462,17191,20311,20468,19108,17241,19490,24565,17976,21223,19493,20121,15582,24341,17697,18888,19790,21610,22673,17914,28512,14432,20043,25142,18455,17354,16898,20794,22656,20413,20325,19408,18472,18456,21702,21306,19197,23106,14041,21509,15561,19489,23186,23887,18195,20677,20615,22732,18260,17660,18469,20956,17547,15803,22097,16760,24945,21749,16840,20327,16486,28509,21633,24447,20739,13254,17652,19373,12761,21388,19059,19687,20063,20449,23560,24856,19900,14320,20798,17971,21574,18430,20853,20351,22519,17784,21054,19154,22387,20772,20236,22016,22276,15564,17592,18410,17593,16271,19855,18229,21496,16844,15087,19505,22055,16648,20675,20192,23625,17957,17976,16479,20409,21748,21538,21110,17780,18898,21853,23592,24545,16486,19306,15507,19298,20357,17662,16527,15913,17532,21982,17136,17615,16258,22117,20792,20441,16985,18601,19263,25364,23281,22126,21861,18491,20298,21820,21984,14843,24092,21235,18617,14734,22987,22666,17442,23660,14487,19891,20659,22710,16150,22742,14732,24969,19644,18327,21106,22390,19659,17272,16772,19673,26202,23804,23195,19042,22402,13340,19899,18264,26848,19113,20108,24613,19922,15303,20899,23678,18300,16725,18882,17518,22944,19019,21251,16374,19618,22597,13082,19035,22706,17504,20443,18098,21190,12319,15326,17787,21367,24190,19307,21656,17545,20118,15223,20599,21144,20089,12005,20881,23123,13871,22651,20236,18606,15810,17851,18286,19671,15221,19135,21038,18132,19324,20239,20443,16789,25126,20468,20836,18288,17168,15564,25826,20099,19632,17839,21526,21517,20025,17939,15576,24749,22311,19180,15480,13757,19672,17202,22932,23176,20101,21510,18387,21581,22652,17388,15118,20037,22844,18200,17565,21203,17319,18600,22360,20618,21156,17857,14886,19421,20299,18576,17929,17403,18355,18284,20422,22118,15184,14805,15827,21192,15630,19952,18297,16762,18648,18013,17284,15749,21836,16030,19187,23878,19644,22113,17447,22429,19268,17262,20892,21298,16459,18960,21148,20669,19163,21568,21084,19484,16423,20509,21631,16458,25096,23208,19208,22738,19600,17522,20462,17297,15909,20767,19697,19095,25782,13826,20279,23688,15796,14722,19432,23656,18117,17472,17187,19424,19982,19199,18426,22228,19170,20947,18588,19564,21316,18512,23890,19014,19582,17072,21406,21915,16295,23118,18452,18092,17238,22483,12385,18434,19154,21678,20136,18546,22118,18528,17927,18979,17298,17869,12493,19717,20794,19440,20082,18380,20864,27361,18286,14577,15777,24464,21295,20316,22318,16412,18108,20279,17382,19114,21265,16524,17400,21774,15909,19020,16159,26017,17708,19689,18713,19165,19998,19113,25055,15325,13110,20573,18077,16151,20288,18489,21603,21717,18181,20973,20645,18803,20103,18407,19583,17217,21911,19414,17236,22507,23045,22687,17561,16976,14294,22499,20915,21403,17887,16048,25386,20965,21754,16790,20134,19482,19456,21961,21253,25119,16549,18944,19775,19156,25858,16763,18554,21887,17801,22749,21667,21301,16845,23075,19540,19750,16985,15496,21554,17513,22336,21751,20988,20277,16819,18274,21113,16537,17757,21891,17510,20165,22110,21891,24341,19527,23895,16984,18341,20437,18879,25798,19020,18863,19368,20532,17192,20211,20533,22514,20049,19638,16190,22744,18809,20756,20926,18341,16959,18852,24373,20866,17255,26980,19649,20730,22870,22890,19244,19226,17917,14286,21705,19619,16675,24068,21621,22486,19947,21578,16041,21830,17092,18927,17920,14139,16332,15808,20213,23911,19052,16282,20526,17791,20090,20869,22311,21179,24172,13185,17560,16997,18021,17923,21160,14817,18269,20807,20110,16573,18477,18360,18788,23683,18834,21171,21121,15289,17030,22053,18477,19469,20914,17877,22916,20421,19331,18855,17384,21369,16335,19112,21120,18398,14778,16342,24223,19209,18168,16864,18652,19939,19541,16956,15856,20922,20650,23178,14866,21139,25856,18615,19257,20903,18953,20285,23654,20821,17772,24484,14319,20183,18956,20052,20381,22726,16709,16578,19300,18422,17615,15748,17337,16953,16816,21989,17004,17534,16033,21591,21393,18683,15848,15692,19487,14328,15391,21810,18840,17387,22169,17666,19487,13860,18237,18587,19853,17932,17472,21409,17300,21065,19429,19321,24552,19897,19532,19740,19827,17641,23000,20764,20066,23535,21194,22545,20334,22883,19025,24600,17770,15786,17035,19897,19926,19893,25600,19788,20041,19164,22343,22491,18854,23760,20579,20954,19309,22484,18071,24787,16439,22846,15926,18674,18198,20090,20785,14508,18152,18405,19272,16029,22254,21387,18831,17160,19453,16424,25650,22024,18278,14218,21327,18775,17635,14869,23974,19763,14835,23258,18356,18632,18499,17105,22228,18453,23063,18569,18081,21571,15649,27146,20847,12920,16248,18779,21227,17958,18958,19050,24455,16035,16409,18350,19444,17362,24215,16627,21316,22336,20270,18528,17487,18470,20324,16361,19603,20849,22835,22552,15993,20470,18753,22876,16802,17476,25988,17236,18713,19838,17000,17825,18925,20254,15695,24184,21033,17547,19695,18958,18111,17997,19899,23329,19682,19260,17472,19281,18770,17996,19088,21618,17985,21761,21271,17257,22399,17328,21002,27320,21754,15299,15103,21164,24501,18700,19567,21829,14821,16338,16965,19215,19828,16465,18586,22161,21698,14789,15678,19256,23047,22626,22274,19868,21926,19146,21241,22322,19586,22534,17326,21422,15895,19179,20287,23426,23666,18038,21720,15961,23343,18528,23114,21499,19562,16570,16671,24058,19324,18793,19280,22715,22695,24186,20248,15703,22384,19840,17190,21693,19742,16155,17687,16226,19572,19022,16906,21205,16737,17648,22163,21148,22759,16535,16740,13517,19642,19590,24534,20875,23263,21846,15689,23999,16228,19284,15798,22998,19318,16241,20116,14930,20718,24023,21264,21016,18596,19735,17514,23894,20666,18549,18641,14963,23320,21431,19327,15679,13316,18532,24448,18257,16190,19580,16952,19308,20439,16539,18923,17637,20515,20287,20684,20313,19630,18320,18418,19599]},{"counters":[19765,20223,18181,22502,17592,18483,17197,17127,26815,22619,18837,16467,16394,17760,18302,14533,23816,17797,20460,21968,19998,19077,17210,20385,11582,25075,20508,18281,19444,19998,17816,21999,23498,20457,19704,16527,13691,23008,13862,18458,15316,20202,20788,19825,17090,14631,24141,19973,19642,20541,19243,21494,19028,21288,22596,13372,19686,20825,21408,13506,21184,18742,15609,19024,15623,16940,18295,19669,20810,19233,19516,18753,19504,18421,19666,23341,19155,21189,18260,24987,17180,20563,18761,28083,17449,16292,16195,19099,19883,23400,18013,12571,18751,16447,18197,17483,15298,18359,21411,18985,19013,12924,15241,16061,19164,17291,18099,15681,15742,18289,19696,20361,20989,12846,23955,21493,19135,22733,19721,24405,21584,23426,21282,25014,19281,18520,22450,20491,16788,22168,20136,18819,24894,16300,20961,22824,19130,23932,21622,21721,24461,20707,23630,14890,16377,19170,22662,22326,21681,18471,22137,19566,18290,17973,19377,17661,17473,18295,21249,22927,19192,15255,13541,25123,14940,21727,16285,15924,17937,12851,15748,22423,16358,21817,23151,16563,20826,17538,19686,22038,21257,15435,21639,20982,20092,20571,16874,17320,15575,23242,15132,21392,24186,19136,19603,16758,22511,20544,20302,21511,21798,19563,15005,19861,25483,17928,15985,23724,15988,21989,23065,18762,19245,15900,21611,21132,23414,20031,21935,17505,18547,16497,19577,19177,15721,14785,20001,25935,21865,18941,19201,22974,18265,20046,20751,21675,16289,18613,21527,18270,24104,16354,22186,17524,12623,15709,16482,18973,19823,18269,21158,18710,24695,22927,25631,19338,19195,19366,20276,17278,21786,20010,22518,18053,15431,17285,18586,18397,24052,20940,16144,20201,18203,15723,14842,20672,16378,19797,18310,21447,16194,18429,17768,16965,21115,17136,19620,16576,18813,18205,24690,18871,17689,22634,17554,18292,21168,20370,16997,17922,18394,23590,20077,22423,19930,15458,20011,18854,20545,20690,17092,18001,20823,16830,21615,16060,17114,16533,23083,20417,17949,18232,19607,14612,22400,17057,22024,15479,17956,21179,17642,20767,19614,14316,17004,19795,23060,23270,17738,16861,22372,18647,18387,14849,22991,19219,23052,18826,17617,19305,15443,16797,17523,21004,20083,20301,20587,17381,17875,19074,20930,17348,20427,24089,18301,15882,22926,21445,20802,16345,18160,18952,21763,14374,19150,20822,20199,16475,20459,22584,26002,25252,21979,20878,21862,16630,17500,22575,20486,20462,24963,22536,22301,20001,17512,16025,19803,18018,16631,21665,16083,18809,20507,17454,20113,16259,18587,17879,21593,21967,18807,20087,22950,15172,21834,23153,16407,16837,21159,20179,21269,18008,17604,19568,22489,18438,18390,18981,22387,20685,21304,21208,17226,15626,24565,18189,16989,23319,21554,15748,22039,12807,16145,18242,20567,19968,19627,22386,14907,17263,18882,23057,21526,15605,14974,19201,20382,18849,21469,28164,20613,14016,19081,18065,20645,20121,16317,21952,18500,18387,19516,22315,19067,24313,21794,18449,18134,15678,14054,20355,19350,23683,18357,18525,20183,23322,19680,19567,17590,22652,18144,19652,17293,18176,20546,20177,21155,10440,21497,24987,24215,18475,19251,16385,21269,16009,23293,23715,19829,15503,16377,19890,26036,21517,23835,16860,20669,14823,21214,14155,14127,22807,18933,19019,16310,19726,22781,13234,17194,16527,23606,20438,23345,19918,20924,16800,22618,15326,15228,16530,21695,22121,18956,18481,21179,19543,20762,17002,21730,14692,20383,22503,21137,19098,22729,17750,14605,22913,19434,18858,21505,22875,13291,19226,22511,20827,17100,22274,18409,23876,19493,20885,16383,22635,17258,21784,18440,17608,18870,20060,22263,21580,16361,19838,22322,17874,18285,16307,21915,21733,20464,18213,23726,15700,23397,19075,19239,19854,19501,17650,23331,22904,21860,17083,20854,16549,24800,25720,21306,24029,20694,18062,17044,18297,20895,17709,17799,19782,20878,20635,18342,15983,14716,16944,23724,19306,21564,19141,16654,15356,16561,19729,20233,23212,18049,21631,17300,19695,21939,21086,20429,18784,20063,24825,17551,20330,24089,13970,22474,14660,23890,18698,22275,18953,22419,21819,21522,15973,15037,22426,17635,15930,21291,19731,16971,18842,20920,21300,20440,16420,20400,21325,19268,23785,17246,19867,19036,19303,28169,17597,19170,23234,17216,16956,16145,20984,22772,19243,17295,19193,16880,19798,17560,19513,15623,18767,23322,15960,13665,21174,19425,21826,17686,20387,23244,18758,22012,16147,23132,21448,18631,15202,21358,17920,17597,18362,16569,16261,21668,16400,23455,18738,23048,17335,19385,20501,20075,18247,17450,18730,24977,15982,17395,18869,20621,22727,15356,22066,16009,23253,17890,21998,18899,22187,19989,20666,14933,16014,25300,17995,14952,19583,23982,17531,21241,23221,12265,17160,22866,16657,16205,18958,18580,19992,20360,23495,20266,15901,20236,18465,21270,19076,16062,21827,12898,22490,16908,16719,20977,15909,18825,19850,24454,19006,24266,20117,17178,20564,22274,16397,16033,17122,23362,19336,26992,20743,21350,21574,17197,21482,20491,25128,20130,18193,22202,21138,18827,19121,21541,18638,17407,15850,15518,19135,18213,24600,19520,20079,23956,20450,16155,20548,23788,20018,14390,19599,18754,24799,20836,17904,16057,16972,22698,21884,21604,18622,18472,18405,20191,15752,20956,19831,14781,17093,16867,13355,18421,14681,19324,16713,19903,19466,16361,20107,19270,17005,18045,20540,19924,19576,16164,16974,18959,19773,20267,17673,20605,18015,15570,15378,14822,15190,17269,18895,21092,18338,15963,20451,20251,11544,16473,22813,20815,16249,16992,19254,18734,19141,12370,24723,20865,15390,16010,19527,18864,22716,18832,20438,23403,16375,18503,16913,17933,15406,16710,16851,21900,16505,15136,22766,22669,18124,19661,19172,23355,23362,18034,17723,22282,16909,16343,22307,17463,22256,24403,21947,21021,16356,20243,17912,23879,14295,15582,15952,19550,20500,20611,15671,18380,18253,22524,18520,22941,21288,18464,23323,19347,18254,17701,15406,21235,19416,23201,13258,19836,16972,20555,20533,19381,20552,18938,18195,21327,21686,15308,16252,23463,25315,23321,17005,20753,22842,21067,18927,19563,19783,15312,18346,17654,21940,23279,19565,23136,19843,17944,19587,24945,22551,21311,17068,22021,18615,17512,20854,18421,18576,18797,18327,19548,23281,20480,18015,18549,19737,21565,13074,17840,20405,12841,18463,19507,18347,19023,19966,14645,23386,18067,18219,22137,16500,19293,22891,19673,20192,21312,26347,18040,16175,20277,16209,19962,19090,20908,19121,15383,23650,22326,20471,17650,20196,19248,18323,16656,22288,22134,23124,22623,16677,15376,17460,21351,24907,16315,20068,20411,21144,21110,18020,20661,24704,21307,20140,20596,15819,21738,19552,24112,16935,20015,16371,22055,15557,20040,18101,20530,15023,21829,19910,15325,22873,22017,22228,21068,18637,23857,21193,21547,13623,21198,22956,21739,21248,17021,21585,15257,15756,24535,19514,16947,28461,14957,15197,19552,17651,24206,17211,19116,17665,15936,26141,25039,25734,18917,18883,18776,18689,19735,19690,17780,21972,18344,15253,17604,20961,17589,20060,18343,23573,21114,18061,18402,18203,18051,17714,22651,21381,22960,20742,19615,15185,21827,21288,13913,23025,16308,16069,21699,23562,14004,22751,16589,17865,24944,20050,18401,20270,21898,16082,20642,18252,14006,23953,17791,22341,21595,16509,17985,20362,23859,22945,24125,18511,22374,17197,23349,23640,22883,20070,18514,17334,22092,25427,22709,18641,25848,16906,17286,20087,20622,16746,14716,23291,18533,16011,25197,21122,18050,19489,22048,16839,17715,15448,17159,20531,18607,16497,19915,24107,18278,18471,18567,20597,27550,19945,20970,19913,21093,15424,21082,20162,19140,19430,16817,16457,22502,19021,17669,21525,14865,19472,18868,18632,24025,19637,21299,25933,15748,19509,16869,18731,18457,20809,16159,22949,23507,19845,17904,18568,19418,19872,21265,22300,17906,19523,17364,15504,18492,24138,15650,22511,22277,17571,20135,20606,17257,18059,21007,20095,18248,19149,18821,18019,20351,21219,19622,16337,21131,19075,19834,15966,17823,18769,21423,24834,17264,15173,16091,18237,19317,18426,19922,16465,21791,16691,17229,19133,19921,21156,14996,18265,20296,21420,20005,22414,28064,17347,17082,23782,21370,15538,19789,17001,20338,14430,19581,17035,18282,15682,15572,17734,16349,23301,15653,22172,19178,21721,20387,22076,19956,25186,15207,16746,24805,20753,20562,20392,18802,21777,20409,24307,18421,23967,18011,16922,23436,21775,21792,21748,22328,19741,17320,14788,23000,22476,19616,22586,18516,16954,20694,22859,16432,14448,21305,22126,14253,21640,19776,21087,21480,16667,19660,18951,16365,18439,15549,22988,17341,21226,19209,19803,16555,20929,20823,24138,20753,20318,22834,21854,15302,18410,23675,20423,20436,19044,19017,21244,21343,22439,19652,21008,16859,18944,22045,23322,20843,17487,18235,18882,25657,22115,20521,16784,20155,16369,17498,21745,21093,18065,23725,19907,19211,21352,18496,19283,22214,16485,14879,19983,18318,24196,15932,20505,17593,16986,18884,20964,20166,24695,18566,21393,15021,18499,21456,16158,15647,22247,17319,15195,20147,20596,22445,18801,15259,19975,19345,20732,22859,21226,19703,18694,20062,19163,19798,19383,15356,18357,21260,16426,21912,19546,16333,20533,24693,20132,17588,21320,19199,14734,24366,16770,12985,18443,13883,20829,23312,17091,19641,17943,19562,25805,16139,20304,21905,19670,22936,19551,20559,16042,18462,16900,16210,19618,17284,18700,15309,21615,19582,15785,21549,19240,25296,20867,18767,28138,21354,15958,23649,20010,20851,18941,20968,17702,18848,14429,16210,12465,21890,17380,19653,18912,19921,18993,18714,19828,17990,19829,20544,23322,24469,21666,22921,17494,15413,19811,22465,18362,21178,14668,22960,15003,24285,20082,17416,22316,16397,16232,13912,20872,20683,16162,15133,16349,19345,21179,19564,18598,20464,17835,20794,24241,14444,20975,22303,23878,18384,19467,19847,17883,25648,15850,18804,18521,24844,18363,19899,20027,20144,21478,18699,17975,15267,21016,25108,20267,20481,20736,18101,21028,21776,15585,20096,16950,22220,24480,18374,19848,18908,15150,16581,22671,18931,19367,19546,19784,21573,25666,17603,21702,23365,14653,20667,27204,18950,21443,18465,18153,20468,14858,20387,23199,26218,19410,20506,22179,17320,21054,23716,23271,18921,19184,16903,15546,16736,17945,19573,22455,26480,21339,19049,22685,16714,23028,20018,19499,26634,17274,18419,21595,16285,20368,25258,19915,20143,26092,23059,19632,19031,17031,18941,23627,24111,23458,23282,16024,17160,19208,18144,13411,21566,23267,22975,20223,23355,15723,18912,18631,18107,21696,16039,18853,14811,20957,19072,22714,19986,23028,21318,21968,21945,19547,16789,17606,17873,17997,20103,25509,24749,20479,18322,21382,20406,16446,24483,20324,23993,19523,16763,21686,22569,19657,17914,22149,27951,20339,21907,18398,18327,19785,20367,19560,15987,20115,21517,26533,16061,20753,19454,18777,19849,22004,17121,19099,18203,24269,21121,18311,15968,16037,22584,22095,22185,22227,20495,17191,19983,19099,16610,16399,18847,16190,19391,19615,18044,20444,16272,16916,26576,17233,21234,22569,15297,19199,19465,18889,16998,17967,17909,22033,17867,21020,19427,22001,16821,18331,20233,22509,22143,15582,13505,16537,22808,16842,20345,23019,14882,12691,19835,12326,17662,17153,19506,20891,21955,23090,20714,20247,17768,19601,19196,20323,21753,19101,21778,20539,19134,21967,18654,20697,18863,16840,22867,20782,19397,18383,21955,16915,21462,25588,20654,19136,19864,24295,12142,20871,21171,22783,19473,18558,18965,17275,20597,20761,20165,17117,23923,14879,20821,21642,17286,15523,17862,18417,15909,18821,13824,16538,15469,21197,18368,19547,12588,20757,18607,14429,22653,19159,16918,18005,20333,19079,19193,19849,24229,15309,25426,24039,19192,17802,20677,19097,21764,19771,20150,21115,17548,22762,19676,19172,23803,16557,18526,22375,19617,19237,22337,22011,23687,20940,18066,23336,15043,17985,22730,25051,21303,17658,17486,20655,16989,26579,14094,21842,24138,18206,15493,20105,25281,21486,22586,22407,18334,23102,16419,23603,18856,14456,21250,15850,20005,20838,14519,15198,16686,15092,14483,20058,19141,17191,23573,18279,23659,18718,19244,16695,14448,20322,16642,16093,21155,21261,16532,19247,17638,18612,20737,22896,21867,21437,19511,20327,14540,16603,17126,22352,21441,20731,16852,20316,20191,24809,17461,23966,14441,17620,21254,16948,20375,20346,16353,19297,19309,13161,15568,20887,25767,22584,18900,19231,16849,17684,19529,23234,16194,16786,21065,22166,14851,18167,20061,21305,20201,24845,16896,16746,20965,16004,17721,20078,19580,19886,17753,25242,24420,21689,16320,14182,26003,18147,19474,21426,19378,20032,18440,16343,23196,17078,21511,21165,19837,24092,20965,23301,22141,20666,17488,23768,22634,21280,19319,22182,16188,17929,22369,22078,20014,19166,21674,16127]},{"counters":[19070,17230,15881,22971,23053,24093,18978,22065,21396,15277,21176,19126,18816,17523,24766,18691,16769,22468,16506,23240,16479,21689,19953,17245,20153,20497,21368,17977,19134,17450,24827,18440,17144,26194,22012,16814,20675,19629,15959,19185,22529,19334,16949,17439,14819,15290,19768,21246,21643,23698,23212,16830,18793,21589,17085,15868,20637,18763,18376,24083,17274,20915,23976,14480,16970,22042,20179,18745,20722,18344,19820,17919,18725,21615,21576,20756,19249,18693,16462,14734,19388,18806,19137,20473,22549,17555,19832,17995,19042,19328,17462,19511,23949,20085,15608,19182,21700,18257,18314,16022,17262,24930,20137,17909,11482,18807,17563,21180,20429,17458,20902,19671,14242,17356,15711,19532,19834,14375,20400,26535,17517,22919,19332,15132,24894,17787,19243,21729,17293,22208,18314,21285,17942,18913,16742,19187,19229,15605,19227,19720,21209,18829,14279,22957,15202,16853,20523,16597,19401,19600,18441,20919,19995,26394,18420,16683,22765,16888,20378,19353,23027,21269,15606,11913,19512,24089,18841,16010,21181,17873,24919,20587,20975,19315,19407,19569,25834,18884,20322,24540,26111,18091,18426,17432,20320,14739,20800,18105,14322,18085,17243,17232,19543,20650,21655,18423,13543,16248,18922,19910,16189,19411,22739,19364,19545,19520,16148,18435,17422,18362,14967,18845,19204,14255,15943,15266,20909,21170,18636,19542,19689,17875,19921,20893,20175,19568,17533,17586,19389,26284,16648,25074,17858,19606,18884,14479,16054,19091,16670,26260,21653,17560,21437,21851,20572,17658,20722,20221,20234,18669,17686,12963,14085,16950,18109,17681,19927,21665,16741,13313,20048,22092,20809,18480,15616,21412,16728,22820,17209,20924,15106,15482,16386,13695,20345,16790,15986,17788,20038,18844,18044,16260,22264,22011,21385,23557,19789,19718,21262,21674,21049,16201,17340,16133,20825,17924,25797,21514,15746,24943,16693,18956,20783,17532,16667,20705,20542,18416,19245,17664,16404,18488,22659,18505,17699,17829,25120,15909,22431,21595,18303,22978,24689,20295,14657,17002,19215,16297,16463,13655,17730,19691,18971,16544,17680,21246,15915,20326,17992,18344,25218,19861,18102,21579,21027,21660,24188,17141,19891,22761,21646,14850,18372,15948,19194,21405,18923,18969,18946,20975,18424,17007,18027,21176,20384,19959,20292,23515,18092,24150,15988,22182,21778,18409,23673,18582,19302,23575,22789,18836,18272,18008,18447,17679,16474,20374,19952,15186,18078,18804,20305,23122,23928,22558,19366,22254,21909,22105,17051,24933,20395,19663,16820,17797,13796,19965,19603,17876,20706,14880,18651,20223,14448,20454,21899,19324,19225,19488,14708,20060,18605,18076,19334,23955,22605,22673,22106,17027,19545,22691,21731,25090,23253,19598,18768,14346,19033,21256,17208,21373,18426,24048,26535,16267,17128,22719,19391,22526,19696,20205,19472,21618,22885,22240,12598,19554,17571,18743,21675,21043,18573,16390,18276,15480,19226,22724,15033,23605,17003,20011,18882,18928,21652,23920,18319,17800,14308,21207,19498,20813,26987,17652,22635,18866,16867,21322,18115,21788,23527,22605,16835,16035,15896,18244,20128,19122,16351,16911,19926,22178,21578,19578,21638,20597,18029,18582,20167,14841,22165,17173,19020,18414,18513,22087,22529,16204,22303,22281,18595,25323,12764,21529,15164,19970,19953,14106,17574,21650,24680,21314,17567,20751,21058,16264,17394,20713,25083,21377,22478,19221,20492,24130,20007,16451,19440,19606,15182,20103,19192,21840,17853,20825,21801,18475,19421,20332,20296,21999,15000,12660,28202,18992,19197,22584,23584,19012,23085,19138,17273,20772,21782,21819,14973,20894,21094,14344,16418,20965,22028,18683,20251,20782,21143,21407,17487,17515,20980,27199,22891,19803,17109,15671,18114,15240,24574,18518,19967,22526,19361,20625,17325,18998,18619,18221,19545,22904,18618,18883,16853,26105,23383,16807,23465,23301,21581,18583,25392,20719,23511,20224,22772,17561,19818,25282,21999,18104,18586,24025,17654,22136,19116,19970,15112,16512,17593,20482,19845,19694,20092,16874,17852,19800,21522,16224,20910,17137,18837,25768,18354,17696,17493,22400,14798,19600,23773,17234,15124,16269,23923,19160,22092,23035,17392,22560,20408,20249,15484,15744,22835,21039,20714,20480,21755,16888,19460,16088,21786,29697,13824,19819,17614,22725,20264,17490,21304,23279,21694,16474,15683,16634,21557,22782,16586,22081,22782,24235,18279,22927,18102,16365,15826,19399,20578,16331,20160,19136,19055,21472,19754,17303,15783,17419,21710,20943,21062,17003,22622,16809,16747,19508,18392,16485,22478,19159,19475,15545,21154,14925,21277,16382,20130,27195,22452,19651,18573,22248,19425,26006,25690,16820,23584,23325,20575,18982,19696,18508,21756,16677,18147,16811,20654,19284,20389,22281,18292,25483,20101,14390,24414,22021,21438,22665,19868,20397,20202,22009,21226,17621,15977,19935,25738,17073,17490,17176,16883,17714,19628,20186,22481,23689,18864,14086,21416,24208,18356,17138,17533,21743,23010,22968,23583,19958,19756,14753,15250,12452,20860,18079,22927,19485,21140,19112,24710,22867,14418,20673,14527,19947,17585,19635,15658,18097,16873,16328,25323,19334,16991,17240,22388,20436,20169,19420,17309,16002,18095,21410,17805,17320,19470,18525,20943,17439,18223,20136,21182,18930,23304,17091,19151,22815,21164,17734,19339,17672,19591,20311,23556,18678,16479,18006,19522,16571,20110,18946,21051,20834,24508,20452,18894,22974,21779,22188,21011,21640,20144,23690,22644,19839,22075,19466,20137,18922,22170,18421,20380,19510,17721,19704,23077,25438,17248,21870,17157,22060,21937,15437,17179,28247,18008,21240,18273,21874,19155,18646,21946,23718,18807,22406,20083,19027,21692,20961,15961,21078,21191,18286,22491,15132,17136,18005,19569,20530,23781,17865,21157,21423,16687,20037,20046,23467,20788,22344,17127,17199,20207,18345,16178,20289,24264,16348,18739,18239,18613,19000,18830,17304,20227,21477,17745,23573,27827,20207,20118,19386,25129,20861,17655,18041,16106,20022,19004,16858,15898,18049,18586,19864,16297,13145,18856,19416,18798,18412,15348,14031,16829,21673,15924,21134,16315,19286,24038,16790,19267,24373,25348,16386,20562,20406,19279,15097,17186,15498,17562,18341,20510,20114,17166,21691,20816,21551,21189,15718,15906,23529,23034,23045,20569,19179,22848,22267,18041,14219,20899,16936,19703,18699,16129,19309,15961,22613,18127,14735,19145,15982,16304,16937,16477,22217,22515,14437,19961,15884,19798,14785,20193,21634,23906,22933,17491,22027,18798,19625,17127,25976,18106,18143,19063,17618,17666,24432,18254,16450,20738,22855,21707,16062,17356,18709,19121,17638,15568,20324,24854,17229,20394,22494,19304,20821,17761,22637,18653,20154,18993,18873,20668,15762,14456,17097,23844,15378,22627,16728,20006,16707,20203,18890,20898,16327,16097,20322,16032,19309,23102,20062,20002,21249,20540,19062,20180,25150,19557,16727,20745,22759,18876,20140,19201,23001,15316,23511,13975,18656,18761,15281,17715,19595,20045,18597,21196,18240,19759,19667,11053,22769,18662,17514,24473,13252,14663,15923,18897,24132,16005,20142,19584,18928,20601,24440,20185,21135,19025,18380,23074,24542,23215,23912,22376,16904,20047,20359,18099,17523,20339,14690,19950,27184,18793,15804,23280,19343,14713,23161,17005,19686,18624,16696,19075,27868,20784,11633,18445,16335,18484,22764,20068,16234,15258,23762,20728,21079,15746,19968,23277,19638,20047,21400,24279,17221,20004,19536,18948,20829,18151,16563,13711,22969,24260,19140,22349,21145,20598,18089,19599,19367,18040,20190,20695,16406,22577,18110,22942,24825,18368,18546,16237,18883,21959,23710,17614,14708,17903,16048,19064,20354,16441,16382,29329,19738,15641,23339,24378,24778,21992,19078,18254,19796,23399,16441,21173,19008,21399,16918,17091,19026,23780,19208,19272,20411,18073,17169,21686,18773,16524,17143,18162,16874,16005,22152,18210,19711,17868,21669,17387,22045,21160,17104,18392,15910,22109,14063,18502,17624,18001,23019,18423,24085,17462,18083,19412,22812,15007,29367,17788,15813,18793,22350,14435,18212,15578,16763,19698,16410,20915,17991,15400,16836,17566,18625,17743,21840,19490,23563,18982,19559,19083,15449,22861,22313,24806,18685,20525,19381,21938,18528,21502,15146,22214,27248,17707,20069,19606,20804,20745,18100,18756,20024,19541,20312,23852,20007,21828,24531,24516,13328,23518,21407,24494,21418,14931,22039,18716,20174,19271,23141,15839,23262,19761,26802,19311,17445,20782,16047,18347,18170,18796,16928,20118,14526,18772,12042,19229,17462,16721,18548,17155,23699,19427,24930,20100,20543,12482,17001,19758,16030,17989,19808,16875,19413,23682,17344,18355,17109,18739,21261,25671,22354,18146,23723,25059,16009,16942,20935,16596,22190,16903,20903,23238,20946,20352,19691,21719,16919,17895,22433,16166,21509,18444,18323,21146,13792,17790,22953,24163,19764,15856,19154,16374,20594,19087,19274,20375,18812,22608,21272,24627,21355,14010,21052,23221,19911,15561,15357,21140,17639,17686,20001,17493,19219,22351,28234,16312,19215,20234,20671,20824,22684,17117,18991,17339,17739,22046,20872,18839,19231,21707,20901,16011,18125,13599,19118,17428,21606,23567,22909,21034,24044,22932,17119,23357,25036,19309,23749,19133,19940,18495,17215,17166,16701,25543,18241,19160,20372,17286,17394,21058,23125,23589,17310,21903,17522,23688,15557,18172,22708,19227,20575,23389,21157,17273,23033,19183,21531,20186,21730,18843,20938,24990,20809,16139,17601,16370,18042,18210,22092,19668,21628,22364,21926,16582,14252,21688,15542,24619,16798,16269,16803,20127,20038,22440,16045,20612,24698,21245,20247,15614,17978,15506,18173,19982,20234,18543,19546,23207,20913,19809,22793,21081,21652,21791,19458,15634,21644,18142,19601,17788,19430,21386,22826,22065,21502,25278,16631,20443,23762,18335,21113,19676,19986,16721,15635,22440,20966,23963,20447,15473,20405,21834,20537,17764,17581,15561,13422,18012,19329,19136,20128,24403,20374,18457,19864,23050,14705,16324,21975,23153,15719,18240,17344,15818,19338,16214,17255,18864,24438,18466,20583,19113,22784,20418,18211,14506,21642,18473,18363,15915,19396,14824,19495,16700,17190,14234,21409,22417,14792,15530,18283,21005,16798,16559,23600,25453,15850,20301,21811,18562,22345,24638,17520,14840,22039,19119,22536,23659,17752,20939,20846,18071,22457,18365,19394,19537,22128,22093,22865,18252,25578,19909,18188,24582,24703,15776,19106,15548,23347,20178,20392,15037,18300,19506,21100,17659,15381,20897,18174,22136,19249,18967,23969,23516,20371,17241,19174,16258,25385,22826,22114,18515,14923,23334,17630,18507,19921,16414,24225,22248,20869,19301,21357,23181,16358,20167,17694,20139,24249,16221,24108,22593,16472,18306,16369,20321,21715,24802,15321,16328,19851,18592,20014,24707,19152,20194,19614,16345,14432,19105,21602,16252,18390,18944,23075,21714,20140,19766,20391,16881,21494,23008,19362,17152,10904,19585,19561,15243,22092,18739,20497,22699,18062,21514,23226,12456,19264,20956,17216,19264,20928,19142,17881,16641,20755,19159,18938,14963,23635,19392,19452,15262,18007,21127,17397,20042,21264,19249,19772,17862,17920,20963,13525,19161,15986,21286,14513,16711,23001,19727,22801,19820,20799,21910,16788,25453,19140,27886,20250,16405,17216,24387,14366,22219,21008,17832,18961,22901,16110,21223,22734,18068,19536,19668,20884,20330,21234,22251,16807,19335,20470,18627,20048,16425,19050,17765,19780,21787,17092,21337,23370,17661,21497,19596,16718,20321,17348,21355,21630,18362,19913,25943,21739,19302,20201,16573,19048,18921,19710,18346,20541,19165,17124,21303,17000,19253,19960,19552,17903,17571,15348,19547,22330,23730,20058,19385,15533,16914,22360,20539,18218,21425,18821,17134,17424,21395,22901,19520,22070,18803,21175,17971,22362,19301,19510,22098,18634,18910,20806,18357,18502,22356,19916,19936,17708,18158,26855,21745,16804,19682,19245,23635,20861,20554,19523,23614,17911,15085,19192,20829,17279,14687,23182,18644,16291,19114,25000,20787,21861,15705,20332,18573,16079,20128,19382,19595,16410,21271,22800,15669,20249,17463,18199,20988,21640,19878,13566,23278,19563,22255,20396,14895,20676,22778,18651,15302,16782,19456,15822,17999,17759,27390,21100,22015,17402,20349,20910,17266,17501,22465,16172,21619,23096,22191,18633,16871,17625,19247,15253,18652,16833,20280,17490,18872,17602,22455,13589,16903,19644,18859,17588,24512,21048,19965,17571,14707,23851,23346,19173,20017,20554,19960,20422,17090,18795,20631,19255,19088,17869,22046,22259,22936,17644,16380,18681,20557,17584,20249,22958,21038,22208,21622,20605,16147,15185,19182,17421,14954,13861,19568,18864,21523,18784,18213,18195,20497,19805,18109,18671,22371,20063,12899,20886,16255,21788,26534,17632,23823,19580,23056,16478,16727,16547,20577,20884,17280,21532,14873,19266,15794,13294,17574,17183,22893,19538,19794,19913,12750,17670,23479,24570,16320,20123]},{"counters":[19961,23006,20342,22043,18651,22378,21841,14420,23341,19737,22448,18039,17940,12930,14613,19155,18074,15483,19867,17974,21104,21587,21272,16326,17830,20442,18890,20120,15581,19014,16111,14999,17970,20474,18456,22119,17326,20003,18779,16374,17509,15893,14932,14848,18853,18566,16169,21849,19583,16018,20980,20357,19367,18619,18067,17769,21401,20944,20961,18361,14978,21714,20470,20290,19942,16777,20419,20508,19984,17175,24257,12792,18777,17622,16443,21388,18734,19498,16404,19545,16013,17982,20300,25617,14042,15307,19556,17933,18936,18043,22438,19209,18680,27436,24741,22325,18903,22877,14277,24931,19938,19166,14850,21108,19802,17140,16804,18438,17935,21210,16375,21681,17023,19757,16524,16843,16946,22150,17770,20777,19959,19704,18837,20226,18844,19667,19783,22757,16625,20961,16478,21167,16715,23603,20738,17681,27590,20087,17838,16336,18223,19233,21469,18744,19237,19412,18385,21510,20417,19680,20997,21327,19231,18506,20306,19650,17551,17202,17890,20104,21700,21740,16509,17559,20526,19879,20212,24206,19224,16692,18238,16990,24430,15888,21517,17490,21525,16065,18445,22069,21138,17482,19389,15209,17057,19481,20027,23133,16039,19496,16673,18944,23583,19288,20652,23991,20866,18441,20335,19792,20367,17372,19320,21681,21365,24716,18671,19354,21635,20033,18855,18452,21863,19281,18614,21724,22081,18016,18169,24213,17871,16586,18713,17074,19459,17331,22815,19817,19236,18150,18448,23501,21921,17121,20706,17611,14423,16195,24932,20762,20480,15538,20073,14750,19594,22043,21382,24198,14072,22199,21320,23173,18935,18621,21953,12579,17311,14847,17972,19837,18466,18401,20345,18404,18898,16582,17354,17959,18716,23084,20534,22094,17964,20646,20701,18958,18876,23634,19113,17410,19403,18377,21027,19861,15508,14832,18344,21222,20166,17947,20361,13978,15687,19263,20983,18984,22672,16883,19855,23103,18412,19781,19478,22078,22241,18224,19330,23094,18796,22255,17521,17961,22366,21209,19083,23563,16577,15809,20274,21159,16924,19580,26803,17522,25778,22072,17840,17549,22293,15197,18522,19323,20751,25145,18481,17877,18923,22034,22740,26047,20376,17479,23483,18964,17437,13173,23570,18462,19122,22523,16240,17948,17718,21341,18596,19686,20766,19726,18511,21219,18816,15677,17425,17767,19403,18546,23313,22133,23700,21358,18949,18755,19636,22554,21617,17383,23845,20832,20440,18361,22523,18183,21133,18857,20933,17664,20139,16460,16608,18956,19975,20459,21221,16470,15588,18624,22809,16850,19007,16843,23329,27073,20529,18006,17668,20752,21171,16575,18829,18782,19275,19668,24825,21087,15076,16878,21122,15674,21986,20436,15269,20574,20023,15369,20366,19955,20628,17992,19813,20669,14171,20794,21744,22105,14324,20495,19674,15633,19752,20617,17295,22450,22250,23247,20301,11292,20688,23283,23156,15136,16141,18210,21982,20294,16551,18425,20068,19382,20454,19065,21045,26339,15049,22326,22359,21697,15719,21698,21938,17472,24278,20042,19330,21566,23095,18124,21618,17270,19223,18435,20338,17847,18776,16207,17270,22118,20612,18171,19316,19822,18350,16479,21907,19158,24006,21352,22208,17260,18897,20784,18675,16335,19369,19120,17016,18756,24037,14882,18257,17811,17575,20444,21582,17516,19904,19197,14792,20987,17495,21677,15575,21615,20544,20045,16109,20448,21264,19087,22251,21618,14829,21714,13569,22435,16527,17347,18012,22136,20420,18861,21295,21848,19412,19117,15995,21421,24802,23855,19460,16539,19602,21981,19730,13487,16486,23661,19282,21534,17310,18767,24657,17609,17087,26160,13152,18026,20427,19551,20023,21428,20081,18189,23732,23348,23242,16749,16058,20868,16787,16449,22824,17924,20623,23542,18695,19339,15715,15740,14963,17994,17665,21864,19970,22638,24632,14932,18157,17510,17537,22861,18606,20813,22377,18140,23239,14424,16512,15998,21329,21034,18304,23052,21386,19472,18756,17829,18030,27107,21381,20057,19312,23864,25375,24604,20221,18694,22713,22226,20765,17147,16531,23364,15163,18868,20477,19999,17997,19773,22883,19975,22430,13894,19799,15693,18796,21989,21505,19070,18823,22072,14425,19593,18580,17841,23173,20427,20472,23641,23488,21515,22915,14797,16466,19541,20423,20729,17147,19564,21391,22035,15335,17749,19712,21417,26858,19649,25051,20401,16929,16827,20706,18817,19115,17075,21957,20994,20512,17510,17540,16849,26594,17327,16152,14465,20306,18408,20782,17975,17879,19712,23893,25787,18768,22725,19162,24563,18397,16660,23068,22339,17408,23227,17736,19717,18751,14808,22335,18027,20088,22477,20392,18971,17006,18791,16572,19460,14474,22473,20221,20037,21184,21688,13827,16343,21489,20261,15521,22939,27011,16001,18311,19168,19929,22745,17592,20181,21615,15772,17940,14013,20595,20550,19132,17196,17974,21156,20104,21471,15347,19239,18761,20437,22942,21153,17142,20495,13086,21501,22908,14436,22537,24356,22060,23623,16374,19357,16730,18483,16584,22185,24222,25509,19396,20843,21769,20197,23943,14199,25087,18351,23228,25615,19825,22045,22883,20878,22484,21651,19289,13972,22091,19044,14042,21042,21240,19379,17474,20877,19869,13138,25251,18412,18730,15589,21586,14517,16268,15919,19695,16225,15602,21533,19644,23875,18722,17645,22925,23867,16346,23584,20093,21497,17727,20357,15182,21138,21258,23896,14878,15395,22302,18496,17079,18614,18528,24087,20675,16012,17961,20421,21802,19755,22778,20142,21627,19789,24564,17478,20199,20054,15653,18854,14024,18813,19249,15955,17591,19181,23252,16282,18841,19281,18252,20787,18088,25421,15770,12811,18552,19209,20707,20403,23616,23595,18495,21241,16856,20882,23160,17942,14964,17586,16309,18077,19237,19053,17534,21060,22792,22070,21768,18062,19889,15158,21519,22131,21855,18224,20345,18181,18907,18103,22587,20360,20329,14850,17745,19229,18890,23697,22462,15665,20065,17309,17535,21624,20425,27240,18404,21265,14839,18132,18352,16617,19817,18130,17688,16882,23749,19253,19010,19507,20186,18822,18495,24796,23768,21589,16864,16864,16257,19422,24307,17640,20164,19430,19916,22376,20832,19129,17549,17591,23769,21971,22977,18486,17426,20965,20597,19783,20274,21038,23569,19008,16675,16213,21041,17663,14511,16406,17924,22106,14055,18251,19991,19347,20389,17178,19804,20877,22535,18926,20376,17952,16034,22443,22616,17542,18789,17527,13601,16524,17547,13956,28229,18367,13524,21514,22022,16425,22821,21883,20670,19034,20696,18868,20057,18710,17352,18628,17190,19241,21418,15680,21202,19336,19627,18614,22042,12737,19693,20115,16413,25399,21869,16964,18439,20893,16337,17672,23264,17128,22931,15665,19781,16125,21536,19268,20015,18102,15527,23907,14742,18463,19392,22880,19074,21816,19574,19139,17177,20392,16800,19979,23405,16187,19153,15745,16089,19841,28800,20577,17119,17624,18850,20377,18272,21821,20558,18011,20356,18805,18819,24738,20358,20104,19885,21717,17031,20448,23258,19891,22732,16521,20026,21255,19322,23824,18228,17493,22292,16414,20439,23338,17141,20182,23942,19066,14752,18626,15612,15941,15721,19844,19629,25198,20196,18697,23216,20243,21720,16460,18391,15414,18776,20536,16050,22913,21024,18633,21157,20299,20626,22127,15625,18030,22100,18047,20035,16428,20368,16843,17300,18264,19946,16790,21305,16434,17331,18937,16929,15830,21002,19837,16549,21263,21687,19875,24155,19803,23241,21094,20287,19373,17294,15208,17284,21751,25614,16849,18457,17925,15256,19984,19954,18575,18377,16479,24701,20755,18170,15250,18863,19923,22858,16832,16249,22410,18814,20202,20553,16859,16088,23656,15911,22118,16905,18554,24607,23427,18104,23314,24215,22994,18901,14261,22015,19433,14925,18553,22523,22324,16635,18976,19243,20844,22046,25327,24121,18886,21516,20716,18822,22465,19809,15642,13182,19127,23152,15352,25821,20915,23116,19257,16074,22201,20656,23331,20162,22321,18911,20142,15029,16717,16356,12382,16387,14443,15392,18050,16998,20794,21854,20491,23237,24576,19952,15079,23352,24308,19686,18580,18331,17341,17460,16159,22093,20805,26037,18556,23721,16769,17293,15207,15622,22914,23299,18709,23227,16103,21250,18097,15693,16823,19937,23589,19902,18473,22084,20169,18925,18573,18375,19061,21174,20077,17381,16386,20090,20595,20758,21257,18893,18935,22151,22187,20500,27360,23459,19333,24647,18716,18264,17958,17916,19951,22310,17981,21982,15363,15976,11157,16011,17188,23000,21473,17937,17013,16847,14291,19962,17637,17208,25090,21512,21389,19847,17964,17683,22705,23300,21701,26489,15730,14434,20541,17380,17139,19660,18376,16172,16073,23717,18436,18596,19288,16236,18377,17697,19342,20371,18929,18370,21409,19658,22661,19227,24047,17859,25811,19178,19328,16853,21160,18125,17506,17783,22069,15312,17706,20505,22277,25252,18561,20189,13936,20756,15966,25616,20643,22411,16955,21324,23324,22199,29695,18384,19556,20207,21929,24306,16779,22236,28256,16879,15600,19705,19635,21203,20803,18763,14783,18724,19271,17048,14134,17245,19203,17668,20009,17263,19749,18404,22363,17582,15454,16286,19048,22278,21703,16632,14985,22091,19578,19831,20307,20849,19375,19084,22914,20172,19101,14023,17949,18291,19805,18353,22419,19215,21598,16469,17342,21272,18051,14945,19579,18382,15911,19399,20984,18522,24130,15716,18107,23653,24392,22285,20627,19125,25283,19742,20355,17851,20436,19473,22052,25568,16371,23254,19097,20319,19525,19297,21604,20047,16570,21127,14820,18658,22045,21279,15220,17596,17879,21979,18409,17384,21607,13716,16873,17817,19526,15192,21353,23858,18633,20555,18107,20887,20364,17208,23776,20373,17985,15998,16404,18607,17294,16084,20571,17786,20385,19156,23568,19414,22645,19659,14638,24113,24876,20368,17581,22925,18684,13385,19982,16986,16735,22758,18452,22077,15174,18028,18542,23048,18760,17526,19765,20012,20986,21586,18950,21046,17628,22770,21295,19309,20067,18793,16163,17562,19681,20041,18722,19698,16431,16115,21594,20282,16153,22020,15956,26763,16420,20740,16506,20042,22983,27211,23225,22828,14820,16565,17680,21690,18907,19119,17463,18667,18939,20401,17230,15737,15838,16526,24126,21883,19350,20735,20084,23950,18131,25351,19856,13533,26015,22672,19969,18914,21425,26190,15997,21872,15851,13563,18133,20322,24236,21175,16374,20323,17404,19299,16861,20807,25259,20422,16813,18805,13949,18204,14838,17310,22040,21278,21848,18803,20181,20038,19610,20305,23161,16184,20992,14875,19584,16006,22155,21120,16738,20416,24852,23387,20233,16391,20217,22481,20836,21645,18556,24955,16517,14053,16840,22409,20414,21933,19605,19186,21906,18932,19943,18046,25777,21429,19157,18237,17349,19366,19073,21756,17831,25226,15121,18229,21101,24709,20444,20347,20306,20854,20315,15925,17785,18654,17917,18330,17930,15923,19713,28881,20600,21686,19086,21859,18063,20907,22107,14422,28224,19174,19210,23229,19590,17788,17961,20696,22147,21798,17286,18934,21079,21550,24566,16357,18750,20840,23679,19023,20296,15689,14889,15599,20307,20778,17296,16942,20036,21980,17576,23203,16489,16643,18804,21294,20532,21435,15708,18381,21921,21203,19368,23679,19931,21579,20724,26077,14865,17498,22806,20828,19953,20570,20008,17223,22074,19079,19581,17640,24681,19083,22550,17990,15713,18873,21435,17359,19693,15773,19169,17816,22033,21645,17213,18364,21249,19769,15238,24748,14583,23383,24116,20724,17652,18744,20007,14858,21854,18117,14944,10682,16861,24707,24844,21704,21841,21262,20606,20010,20818,16134,22815,18799,21079,10365,17979,15701,16739,21709,21699,12615,21063,18805,25920,18748,19566,21065,23249,18205,19847,18158,20447,17783,22397,25243,21843,24169,19061,16082,21190,19822,22564,16465,21668,20361,19953,22043,20538,17542,20375,18681,19974,20393,27364,18948,22006,19867,21985,17246,19549,21626,20552,24846,24387,16366,16340,16000,20773,21252,19986,20561,16886,17158,22614,20638,17043,20728,19400,18738,16850,23014,19156,15537,15419,23506,26888,20616,17532,19508,19035,18021,17583,20204,22045,24732,20265,19510,18394,18797,18288,19261,19762,24496,21857,23678,14070,20395,22466,20405,15779,13994,27802,22481,16828,21527,17113,23829,16622,21019,14940,19764,17443,15158,21161,17389,18479,23766,18516,22425,19703,16915,20887,18067,17380,21067,18456,16783,18067,17516,16236,20856,18290,18032,16140,17938,21901,15686,13833,21158,16012,18318,19166,18693,16034,15571,19998,18317,14684,17722,16558,21253,17896,21681,19226,20112,21975,17169,21740,18059,21411,16313,16636,20219,19211,24509,11947,21351,15685,15550,18007,17227,25613,15787,24926,26437,23956,23466,22280,24727,20194,15545,18027,19553,20365,16043,19789,18497,20111,22300,22531,18314,21028,17848,19918,23885,19531,19889,15629,17419,19607,26271,23499,18021,22520,16496,14492,20579,21695,20705,15627,14909,20427,22471,23083,22829,14064,26747,16383,14912,20921,22776,19913,20638,15580,18060,17038,16326,21894,20338,18990,22284,16829,19148,21353,19066,17723,19770,20026]},{"counters":[18876,24230,20515,19971,15230,21766,18937,19121,19436,22788,18733,19054,21495,16141,16536,19713,19542,20959,16848,18215,27078,19379,16235,16265,19979,21005,20355,21344,19917,20223,15099,16500,16596,20412,16033,20835,11495,19371,16881,21322,15064,20285,25804,17993,17440,16441,20101,17869,21788,22505,19040,20561,23424,19067,17536,14159,19659,20122,22825,21085,20909,17977,18269,22974,16800,23877,20572,16216,22779,22933,15081,16536,20659,18395,14036,18124,15296,16568,23937,21426,17136,20063,19410,19219,17513,16071,15987,18031,22171,17613,22008,17932,19034,21296,19183,17770,15215,21610,20797,22690,18334,21034,19597,20310,15280,19144,22302,20511,17721,23072,18320,21801,21536,19543,18942,23171,26543,16588,17845,16910,16236,19652,18519,22450,20340,19497,26944,17817,19274,23338,17094,20306,17866,19520,19783,20604,18119,18321,21456,20170,13273,21100,19050,19261,15078,17067,16968,20125,20706,23267,22572,22173,18293,23760,20046,18467,16520,17532,16806,17115,19242,14436,23435,16378,19155,15683,22720,16829,17824,21047,18345,18728,21199,23123,20794,20677,24396,17558,23092,22480,19792,19773,21261,19607,27656,19946,18487,20007,22650,17694,15902,19523,18431,14131,19547,18155,18551,20525,21167,17343,21481,21264,24533,16877,19656,17937,21663,18166,23343,22872,15192,16454,22416,18550,20743,19144,16482,17325,16435,18296,19987,21373,16871,18496,21636,18935,22306,19525,21811,17882,19275,23233,18832,17408,19825,22206,21299,17707,17249,19449,19907,20466,19566,21896,22941,26093,20108,21417,17714,20990,15274,16382,20953,19399,16906,16927,20606,17169,18437,17380,19251,19156,20356,18814,17573,15572,16969,20561,19789,19793,18836,19038,25671,15916,22798,18241,22906,14984,19961,11959,23334,14812,23154,18917,19215,18417,15460,18593,26053,26045,23288,15602,20307,18162,19027,16232,16750,18035,15364,17290,19247,16352,21608,23142,19360,16023,20462,19800,20082,19988,18493,18904,23768,22495,16708,21360,21197,20808,19256,26211,19734,22350,22555,23415,21042,18439,20546,15555,19832,21244,20630,22878,17885,25280,15451,20417,23761,16049,14128,23123,17996,23961,15964,18402,19361,22975,16372,21382,21714,20071,16557,13984,16659,13951,19573,19865,19034,19450,20481,17241,15734,23630,16686,21831,16040,19750,19594,18995,18768,16048,18148,19960,16990,19126,20484,18268,20206,20190,16194,23847,15369,18467,21288,26467,16852,19614,18792,17966,23574,16935,18633,17535,17929,20000,22381,15657,21302,14142,19917,22080,24632,18564,20624,21733,19383,16719,19872,18770,22034,18084,22019,19139,21752,21243,17745,19696,12746,21903,16345,20378,18689,19107,24488,23029,24023,17927,17506,20046,17117,22341,17449,13114,14473,14434,17565,21116,18241,16864,18803,21207,22624,19915,20846,15163,17178,17945,14455,22124,17165,21753,18417,22951,19808,24949,15998,23468,18882,18475,24101,16721,20055,14538,20767,21350,14655,13652,21594,16438,20917,16769,21496,22381,21201,17689,16418,22023,21833,22845,20116,24874,21206,16795,14372,19663,20021,19991,15544,16981,13887,19617,23263,18851,13916,18311,19545,18319,19682,20318,20362,21389,17213,19580,17214,19768,18740,20397,20292,18986,21166,22781,20356,17872,19796,17448,24102,16819,22503,23205,20349,20038,18878,16681,22947,19941,18408,16451,17393,20620,19229,21513,18044,17263,15327,21176,23669,20883,19960,19229,19207,23048,17912,17847,19654,15253,17004,21112,17919,20073,15271,16184,25020,24715,23740,19785,19308,18257,14348,18920,16417,27013,20136,24623,16381,18733,20533,21281,18650,21041,18366,19241,21075,22195,20491,23769,24420,15775,20609,20096,18980,16284,18717,22545,19544,16589,19747,19965,18444,18675,18402,20943,19890,22410,17194,26003,13280,22268,22927,17048,18425,22504,19607,24322,16980,17179,22643,20136,21505,23138,21321,20501,15010,21360,16448,27374,19108,20160,17888,20525,18765,21427,25322,19379,20726,18240,19543,15049,18190,23808,19121,17623,16852,20278,16239,25287,22268,16438,20175,23151,13653,16063,20164,16980,18026,21708,24479,23420,16970,19643,18838,12402,20276,16811,17560,21839,21192,22417,18348,18648,23388,24592,15909,17018,22586,20390,22711,18318,19764,14241,16829,22320,16586,20641,23577,18216,20213,16420,22123,14038,18688,16393,23560,18208,18733,22403,17388,22206,26621,18856,21484,18145,17886,18276,20398,17588,24598,19027,18441,17692,19416,20321,16169,16380,19762,18536,18470,18924,25762,20033,19538,20107,21144,24288,21301,18820,16333,20381,27856,16515,22470,17918,18827,23492,18840,23006,20635,17934,18897,19875,17116,22515,14922,20063,15907,17599,21622,20406,13731,19109,16461,19954,16527,29350,21699,15346,18183,19088,21531,17889,18690,14510,20669,21106,24551,22430,22166,20509,20411,20793,17061,21972,20762,15718,17637,16075,16852,15328,14880,18403,17067,21735,16927,19086,20571,20677,26068,19173,20030,18487,17090,18809,17543,23970,19633,25588,17415,19330,18087,16506,21333,23901,18757,18557,24157,20035,22097,18170,20020,19285,19458,19265,19161,14475,23643,23494,18903,14315,19955,14546,19184,22456,20786,16912,18030,20770,16325,23214,21477,20665,23003,19229,17804,20816,23668,18430,18707,19096,15325,22277,19096,25359,17673,18014,18288,20627,19327,22175,24281,15255,21745,18123,17572,19834,20734,14692,19019,19645,19221,12642,18789,14138,20915,18613,20739,20306,27270,20168,16077,14718,20613,28817,20732,27209,21593,19583,20258,15337,12861,26013,20533,21373,21383,15631,17526,20704,23189,20488,17974,24972,23411,17925,21129,17029,20303,20486,15236,23115,18916,16511,25091,23812,14534,20676,22132,20270,24716,15966,20093,14354,24766,16926,19663,22419,20174,20542,22504,20627,24283,20713,14402,20930,12870,16022,18536,18646,20169,19049,19423,20360,23536,20806,22273,15737,14046,16219,18711,23332,16241,19104,22213,15867,14399,18264,20952,20290,20211,17140,19268,16028,19214,20855,20779,19324,22303,19786,21992,13528,19370,21635,21989,22850,21245,20183,18034,14211,18623,15296,20649,19020,22814,18126,22766,21616,21428,23152,18815,20462,18110,18878,23184,13593,20587,20312,21566,13964,23411,17267,18924,22103,18043,21592,19710,20907,22716,21030,18710,18115,16847,17417,19399,19928,15941,21386,16045,17973,15647,24613,18883,19947,20862,18804,24296,21608,18081,24962,25140,17334,19517,14457,19846,21967,24007,22166,15234,17978,23941,18238,18151,16884,19062,20823,17063,21881,24480,22526,16127,19624,21232,22097,17678,23087,21241,22878,16866,19477,24559,18727,17331,18946,21122,21756,24720,19468,18107,16111,16896,17447,15326,12847,19229,20834,21599,19507,19779,19150,22312,20713,24370,16740,21386,19969,18446,22501,19219,22329,15937,21602,27776,17413,18716,21554,18242,22978,22739,16651,22436,20319,15824,22129,19108,14830,20116,18235,19843,21128,19239,18294,19232,16555,22254,16750,23290,21907,20517,19341,18223,26342,14480,17363,20508,15921,18644,17057,21907,15554,13990,17521,18857,18952,17808,17671,19800,20387,25210,25080,18483,22930,21741,17532,14804,23409,15311,16274,20764,22008,23045,18296,16821,21802,20309,21021,21565,16755,20500,22723,18489,19381,23105,20017,19241,19014,24376,20708,23400,14109,18601,18934,17635,20027,22844,18594,21662,24970,19112,20831,15518,20746,19462,20775,21727,20332,20588,17340,18219,24206,24423,22705,18315,16789,16034,19131,15311,17189,19543,19656,17901,16180,21877,15962,17588,19746,21306,16676,18958,27215,21216,16150,22777,17392,21650,23223,14781,16032,21594,19544,18023,20151,14241,18648,21298,18511,21724,16224,16106,16558,15169,18879,18527,20001,20286,18360,20236,17670,17969,17259,21972,15656,17252,26329,13051,18816,17217,17734,19967,21314,24529,15426,23014,17658,19608,24397,20560,24262,19695,17752,18383,19831,19623,22647,22045,17503,23589,24662,21093,19846,20887,24156,27320,18030,23071,16271,17538,19503,14974,24438,22575,20136,19317,23054,24902,15632,20744,16693,15966,25875,17367,23955,21231,14913,21586,18495,23932,19596,15178,22513,19391,20128,18409,17811,18564,13763,18984,26111,17277,17305,18850,19195,20432,20185,21257,24813,18372,17346,18311,15214,17729,15922,22809,21582,21650,17521,19348,21570,19967,14277,19598,18843,18428,18400,19379,19249,19325,20977,21877,20957,19059,13275,18192,16840,18075,19111,20652,18873,20722,24558,21515,18816,18662,21695,20368,24150,21101,20908,16125,19389,16794,16629,24992,16471,20089,14453,22462,19241,27618,16321,20761,13088,15440,17253,22439,24250,23875,20869,18833,15132,17308,15957,16739,21090,23339,18206,17300,22552,18873,19108,16473,16083,18760,23596,20498,19899,19364,24636,19728,21582,20102,17164,16143,18404,17833,19544,19651,23829,16796,13963,18437,19372,19439,20684,19528,21297,20930,17063,17225,21033,18108,21750,17918,23372,19891,21116,17365,16541,21801,18866,18488,22874,20609,16122,17130,16332,17226,17591,21747,19529,20233,18886,19924,17396,21022,23682,14566,19114,22497,22966,16032,17187,18256,20230,21555,15730,19237,19331,21005,17752,21022,16401,18429,18451,16950,19654,25525,20877,18526,17096,19164,23210,18858,22453,11359,21619,16799,20179,17217,14807,17698,15195,14806,21515,14365,19326,21280,19952,18046,20898,15743,19010,16398,21219,21948,17957,20802,19917,20035,17064,12736,20998,18024,21315,14391,22923,17716,17375,19043,20213,19445,26208,19543,18023,21869,21821,18288,17263,20278,18333,16182,25490,17785,23015,18472,19914,21999,17868,18887,17600,23052,23578,23802,17502,19589,18675,21942,18907,22298,22670,20617,21032,18093,21206,22338,18483,23359,22190,22267,16362,20812,16209,17857,19577,22501,16387,18902,12395,21744,17116,15167,13981,17282,21857,17874,19284,18791,21690,22285,19610,16174,19314,21014,21638,17661,17619,19043,23291,19567,20743,21186,23072,20381,18854,20329,19261,15145,26354,13421,17466,19597,17645,19011,22532,14282,18797,20740,17384,20314,17191,18659,10591,16289,20889,18223,23621,18393,16021,21153,18752,24052,20710,16362,20027,22158,20798,15950,21610,23193,19846,20460,16955,22556,20024,18382,13505,22815,15426,20459,19663,21576,18089,20767,20057,16319,17444,19012,18726,22254,19618,18496,21487,19035,19362,24474,17111,19655,19674,16584,22324,20430,20343,20848,23495,22588,17628,20338,15539,20321,17592,13228,24766,16873,20477,22388,16053,20812,19215,19134,19686,18347,15647,18099,24073,18926,19461,24571,22918,19305,18085,16812,21278,20486,19951,20205,21128,22708,15969,18597,14971,17839,16766,18891,14032,18454,15745,16732,19781,20356,14014,15219,20417,17851,18407,16420,17551,21720,16756,16847,21015,18855,20694,23988,20166,20744,19272,15634,19556,24394,20093,17635,14693,19578,21555,21452,20007,17383,11327,17941,22364,18226,17513,17606,19106,16329,18900,17704,18864,18325,19964,17651,20023,19232,15920,14459,23179,22783,19276,23085,28747,13571,15434,20244,19223,19791,18290,20431,20633,23966,19651,18876,23228,14890,23305,18251,21149,21585,22957,17336,15617,14465,19899,18064,19768,16181,20082,22887,23807,22456,20758,18018,19188,19353,23506,22013,18094,27700,17077,21384,26435,15230,19694,24714,22918,16608,20592,20356,21007,18615,23739,15318,13772,19573,20224,15926,22850,21245,15869,20904,16429,24068,25789,17240,18522,19003,19008,17203,21708,20433,20486,16571,19712,20377,19311,23110,16839,19488,23110,17044,23895,19202,19805,19325,19657,18654,15263,19921,20962,17610,24727,19756,18781,21560,19160,18320,17267,19674,21376,22381,20757,24551,19739,19943,17816,18298,18346,23980,22043,24615,17288,21780,18126,16665,17892,18391,18786,22627,17927,16731,16574,22721,13949,17036,24785,18900,21884,17596,17579,19318,17511,19949,23543,19841,19528,18588,19910,17414,18027,18491,20751,20052,17208,17881,22140,15994,18444,18782,18424,19324,18693,17887,22922,18630,26140,18621,18466,21339,18375,21622,18748,17058,14319,22959,20632,18865,13598,16786,23614,15643,19974,26776,20988,11973,19231,14963,20724,17613,22706,16319,24927,19733,20845,26372,19310,17852,18438,25302,19667,21696,18533,14854,17206,21863,16728,23980,21533,20531,19353,18566,22632,15918,20031,17401,19882,22081,17325,12860,24533,18732,17729,17896,17471,23121,20975,21847,21269,17992,19405,21943,18844,19923,22151,12853,16953,21148,19261,28496,19578,16022,17919,19196,14883,19844,20377,21934,23571,14157,22501,20326,20935,18774,15790,15765,15879,19074,18082,20310,17394,19197,17383,17334,24332,17694,25445,15353,20135,19335,19340,21301,18142,20391,19324,20540,20913,15614,19100,17387,17305,20547,16158,15068,24431,26578,20612,19758,20706,18942,22160,19088,19545,21259,23048,21369,21073,23691,19061,18979,21292,18371,24975,22078,18753,18662,17978,25371,19312,19235,16552,17369,20488,21536,16275,16082,20364,20877,19280,22211,22346,21969,18369,23000,22371,22107,23789,18671,18275,18521,15737,16839,22796,25054,22839,24952,21854]}]},"null_count":0,"tot_col_size":360000000,"last_update_version":401695328175390722}},"indices":{"primary":{"histogram":{"ndv":40000000,"buckets":[{"count":524288,"lower_bound":"A4AAAAAAAAABA4AAAAAAAAAC","upper_bound":"A4AAAAAAAgAAA4AAAAAABdCR","repeats":1},{"count":1048576,"lower_bound":"A4AAAAAAAgABA4AAAAAAABe6","upper_bound":"A4AAAAAABAAAA4AAAAAABehJ","repeats":1},{"count":1462714,"lower_bound":"A4AAAAAABAABA4AAAAAAAC9y","upper_bound":"A4AAAAAABZRvA4AAAAAAA6wo","repeats":1},{"count":1724858,"lower_bound":"A4AAAAAABZRvA4AAAAAABZRw","upper_bound":"A4AAAAAABpRvA4AAAAAAAsPg","repeats":1},{"count":1987002,"lower_bound":"A4AAAAAABpRvA4AAAAAABKwo","upper_bound":"A4AAAAAAB5RvA4AAAAAAA8Pg","repeats":1},{"count":2249146,"lower_bound":"A4AAAAAAB5RvA4AAAAAABawo","upper_bound":"A4AAAAAACJRvA4AAAAAAAtuZ","repeats":1},{"count":2509913,"lower_bound":"A4AAAAAACJRvA4AAAAAABMPi","upper_bound":"A4AAAAAACZMXA4AAAAAAAAmz","repeats":1},{"count":2772057,"lower_bound":"A4AAAAAACZMXA4AAAAAAAfH4","upper_bound":"A4AAAAAACpMXA4AAAAAAAQmz","repeats":1},{"count":3034201,"lower_bound":"A4AAAAAACpMXA4AAAAAAAvH4","upper_bound":"A4AAAAAAC5MXA4AAAAAAACFq","repeats":1},{"count":3296345,"lower_bound":"A4AAAAAAC5MXA4AAAAAAAgmz","upper_bound":"A4AAAAAADJMXA4AAAAAAASFq","repeats":1},{"count":3558489,"lower_bound":"A4AAAAAADJMXA4AAAAAAAwmz","upper_bound":"A4AAAAAADZMXA4AAAAAAADkh","repeats":1},{"count":3804691,"lower_bound":"A4AAAAAADZMXA4AAAAAAAiFq","upper_bound":"A4AAAAAADoOFA4AAAAAABPoh","repeats":1},{"count":4066835,"lower_bound":"A4AAAAAADoOFA4AAAAAABuJm","upper_bound":"A4AAAAAAD4OFA4AAAAAABBHa","repeats":1},{"count":4328979,"lower_bound":"A4AAAAAAD4OFA4AAAAAABfok","upper_bound":"A4AAAAAAEIOFA4AAAAAABRHa","repeats":1},{"count":4591123,"lower_bound":"A4AAAAAAEIOFA4AAAAAABvok","upper_bound":"A4AAAAAAEYOFA4AAAAAABCmQ","repeats":1},{"count":4853267,"lower_bound":"A4AAAAAAEYOFA4AAAAAABhHa","upper_bound":"A4AAAAAAEoOFA4AAAAAABSmQ","repeats":1},{"count":5099469,"lower_bound":"A4AAAAAAEoOFA4AAAAAABxHa","upper_bound":"A4AAAAAAE3P0A4AAAAAAAGEp","repeats":1},{"count":5361613,"lower_bound":"A4AAAAAAE3P0A4AAAAAAAklz","upper_bound":"A4AAAAAAFHP0A4AAAAAAAWEp","repeats":1},{"count":5623757,"lower_bound":"A4AAAAAAFHP0A4AAAAAAA0lz","upper_bound":"A4AAAAAAFXP0A4AAAAAAAHjf","repeats":1},{"count":5885901,"lower_bound":"A4AAAAAAFXP0A4AAAAAAAmEp","upper_bound":"A4AAAAAAFnP0A4AAAAAAAXjf","repeats":1},{"count":6139105,"lower_bound":"A4AAAAAAFnP0A4AAAAAAA2Ep","upper_bound":"A4AAAAAAF2s5A4AAAAAAAIfa","repeats":1},{"count":6401249,"lower_bound":"A4AAAAAAF2s5A4AAAAAAAnAl","upper_bound":"A4AAAAAAGGs5A4AAAAAAAYfa","repeats":1},{"count":6663393,"lower_bound":"A4AAAAAAGGs5A4AAAAAAA3Al","upper_bound":"A4AAAAAAGWs5A4AAAAAAAJ+b","repeats":1},{"count":6925537,"lower_bound":"A4AAAAAAGWs5A4AAAAAAAofa","upper_bound":"A4AAAAAAGms5A4AAAAAAAZ+b","repeats":1},{"count":7187681,"lower_bound":"A4AAAAAAGms5A4AAAAAAA4fa","upper_bound":"A4AAAAAAG2s5A4AAAAAAALdQ","repeats":1},{"count":7449825,"lower_bound":"A4AAAAAAG2s5A4AAAAAAAp+b","upper_bound":"A4AAAAAAHGs5A4AAAAAAAbdQ","repeats":1},{"count":7696027,"lower_bound":"A4AAAAAAHGs5A4AAAAAAA5+b","upper_bound":"A4AAAAAAHVunA4AAAAAABJAJ","repeats":1},{"count":7958171,"lower_bound":"A4AAAAAAHVunA4AAAAAABnhI","upper_bound":"A4AAAAAAHlunA4AAAAAABZAJ","repeats":1},{"count":8220315,"lower_bound":"A4AAAAAAHlunA4AAAAAAB3hI","upper_bound":"A4AAAAAAH1unA4AAAAAABKfA","repeats":1},{"count":8482459,"lower_bound":"A4AAAAAAH1unA4AAAAAABpAM","upper_bound":"A4AAAAAAIFunA4AAAAAABafA","repeats":1},{"count":8744603,"lower_bound":"A4AAAAAAIFunA4AAAAAAB5AM","upper_bound":"A4AAAAAAIVunA4AAAAAABL90","repeats":1},{"count":8990805,"lower_bound":"A4AAAAAAIVunA4AAAAAABqfA","upper_bound":"A4AAAAAAIkwWA4AAAAAAAd9b","repeats":1},{"count":9252949,"lower_bound":"A4AAAAAAIkwWA4AAAAAAA8eX","upper_bound":"A4AAAAAAI0wWA4AAAAAAAPcP","repeats":1},{"count":9515093,"lower_bound":"A4AAAAAAI0wWA4AAAAAAAt9b","upper_bound":"A4AAAAAAJEwWA4AAAAAAAA7D","repeats":1},{"count":9777237,"lower_bound":"A4AAAAAAJEwWA4AAAAAAAfcP","upper_bound":"A4AAAAAAJUwWA4AAAAAAAQ7D","repeats":1},{"count":10039381,"lower_bound":"A4AAAAAAJUwWA4AAAAAAAvcP","upper_bound":"A4AAAAAAJkwWA4AAAAAAACZ3","repeats":1},{"count":10296341,"lower_bound":"A4AAAAAAJkwWA4AAAAAAAg7E","upper_bound":"A4AAAAAAJ0cGA4AAAAAAASFn","repeats":1},{"count":10558485,"lower_bound":"A4AAAAAAJ0cGA4AAAAAAAwm0","upper_bound":"A4AAAAAAKEcGA4AAAAAAADku","repeats":1},{"count":10820629,"lower_bound":"A4AAAAAAKEcGA4AAAAAAAiFn","upper_bound":"A4AAAAAAKUcGA4AAAAAAATku","repeats":1},{"count":11082773,"lower_bound":"A4AAAAAAKUcGA4AAAAAAAyFn","upper_bound":"A4AAAAAAKkcGA4AAAAAAAFDh","repeats":1},{"count":11344917,"lower_bound":"A4AAAAAAKkcGA4AAAAAAAjku","upper_bound":"A4AAAAAAK0cGA4AAAAAAAVDh","repeats":1},{"count":11591119,"lower_bound":"A4AAAAAAK0cGA4AAAAAAAzku","upper_bound":"A4AAAAAALDd0A4AAAAAABCmc","repeats":1},{"count":11853263,"lower_bound":"A4AAAAAALDd0A4AAAAAABhHV","upper_bound":"A4AAAAAALTd0A4AAAAAABSmc","repeats":1},{"count":12115407,"lower_bound":"A4AAAAAALTd0A4AAAAAABxHV","upper_bound":"A4AAAAAALjd0A4AAAAAABEFR","repeats":1},{"count":12377551,"lower_bound":"A4AAAAAALjd0A4AAAAAABimf","upper_bound":"A4AAAAAALzd0A4AAAAAABUFR","repeats":1},{"count":12639695,"lower_bound":"A4AAAAAALzd0A4AAAAAABymf","upper_bound":"A4AAAAAAMDd0A4AAAAAABFkD","repeats":1},{"count":12885897,"lower_bound":"A4AAAAAAMDd0A4AAAAAABkFR","upper_bound":"A4AAAAAAMSfjA4AAAAAAAXju","repeats":1},{"count":13148041,"lower_bound":"A4AAAAAAMSfjA4AAAAAAA2Ek","upper_bound":"A4AAAAAAMifjA4AAAAAAAJCg","repeats":1},{"count":13410185,"lower_bound":"A4AAAAAAMifjA4AAAAAAAnju","upper_bound":"A4AAAAAAMyfjA4AAAAAAAZCg","repeats":1},{"count":13672329,"lower_bound":"A4AAAAAAMyfjA4AAAAAAA3ju","upper_bound":"A4AAAAAANCfjA4AAAAAAAKhS","repeats":1},{"count":13934473,"lower_bound":"A4AAAAAANCfjA4AAAAAAApCg","upper_bound":"A4AAAAAANSfjA4AAAAAAAahS","repeats":1},{"count":14191433,"lower_bound":"A4AAAAAANSfjA4AAAAAAA5Cg","upper_bound":"A4AAAAAANiLTA4AAAAAAALr0","repeats":1},{"count":14453577,"lower_bound":"A4AAAAAANiLTA4AAAAAAAqND","upper_bound":"A4AAAAAANyLTA4AAAAAAAbr0","repeats":1},{"count":14715721,"lower_bound":"A4AAAAAANyLTA4AAAAAAA6ND","upper_bound":"A4AAAAAAOCLTA4AAAAAAANLB","repeats":1},{"count":14977865,"lower_bound":"A4AAAAAAOCLTA4AAAAAAArr0","upper_bound":"A4AAAAAAOSLTA4AAAAAAAdLB","repeats":1},{"count":15240009,"lower_bound":"A4AAAAAAOSLTA4AAAAAAA7r0","upper_bound":"A4AAAAAAOiLTA4AAAAAAAOpy","repeats":1},{"count":15486211,"lower_bound":"A4AAAAAAOiLTA4AAAAAAAtLB","upper_bound":"A4AAAAAAOxNBA4AAAAAABati","repeats":1},{"count":15748355,"lower_bound":"A4AAAAAAOxNBA4AAAAAAB5Ox","upper_bound":"A4AAAAAAPBNBA4AAAAAABMMv","repeats":1},{"count":16010499,"lower_bound":"A4AAAAAAPBNBA4AAAAAABqti","upper_bound":"A4AAAAAAPRNBA4AAAAAAA9ri","repeats":1},{"count":16272643,"lower_bound":"A4AAAAAAPRNBA4AAAAAABcMy","upper_bound":"A4AAAAAAPhNBA4AAAAAABNri","repeats":1},{"count":16534787,"lower_bound":"A4AAAAAAPhNBA4AAAAAABsMy","upper_bound":"A4AAAAAAPxNBA4AAAAAAA/KS","repeats":1},{"count":16780989,"lower_bound":"A4AAAAAAPxNBA4AAAAAABdri","upper_bound":"A4AAAAAAQAOwA4AAAAAAARKB","repeats":1},{"count":17043133,"lower_bound":"A4AAAAAAQAOwA4AAAAAAAvqx","upper_bound":"A4AAAAAAQQOwA4AAAAAAACox","repeats":1},{"count":17305277,"lower_bound":"A4AAAAAAQQOwA4AAAAAAAhKB","upper_bound":"A4AAAAAAQgOwA4AAAAAAASox","repeats":1},{"count":17567421,"lower_bound":"A4AAAAAAQgOwA4AAAAAAAxKB","upper_bound":"A4AAAAAAQwOwA4AAAAAAAEHh","repeats":1},{"count":17829565,"lower_bound":"A4AAAAAAQwOwA4AAAAAAAiox","upper_bound":"A4AAAAAARAOwA4AAAAAAAUHh","repeats":1},{"count":18020989,"lower_bound":"A4AAAAAARAOwA4AAAAAAAyox","upper_bound":"A4AAAAAARL6gA4AAAAAAABSB","repeats":1},{"count":18283133,"lower_bound":"A4AAAAAARL6gA4AAAAAAAfzS","upper_bound":"A4AAAAAARb6gA4AAAAAAARSB","repeats":1},{"count":18545277,"lower_bound":"A4AAAAAARb6gA4AAAAAAAvzS","upper_bound":"A4AAAAAARr6gA4AAAAAAACxU","repeats":1},{"count":18807421,"lower_bound":"A4AAAAAARr6gA4AAAAAAAhSB","upper_bound":"A4AAAAAAR76gA4AAAAAAASxU","repeats":1},{"count":19069565,"lower_bound":"A4AAAAAAR76gA4AAAAAAAxSB","upper_bound":"A4AAAAAASL6gA4AAAAAAAEQD","repeats":1},{"count":19331709,"lower_bound":"A4AAAAAASL6gA4AAAAAAAixU","upper_bound":"A4AAAAAASb6gA4AAAAAAAUQD","repeats":1},{"count":19512375,"lower_bound":"A4AAAAAASb6gA4AAAAAAAyxU","upper_bound":"A4AAAAAASm8OA4AAAAAAA9zC","repeats":1},{"count":19774519,"lower_bound":"A4AAAAAASm8OA4AAAAAABcTv","upper_bound":"A4AAAAAAS28OA4AAAAAABNzC","repeats":1},{"count":20036663,"lower_bound":"A4AAAAAAS28OA4AAAAAABsTv","upper_bound":"A4AAAAAATG8OA4AAAAAAA/Rz","repeats":1},{"count":20298807,"lower_bound":"A4AAAAAATG8OA4AAAAAABdzF","upper_bound":"A4AAAAAATW8OA4AAAAAABPRz","repeats":1},{"count":20560951,"lower_bound":"A4AAAAAATW8OA4AAAAAABtzF","upper_bound":"A4AAAAAATm8OA4AAAAAABAwh","repeats":1},{"count":20741617,"lower_bound":"A4AAAAAATm8OA4AAAAAABfRz","upper_bound":"A4AAAAAATx99A4AAAAAAAOwU","repeats":1},{"count":21003761,"lower_bound":"A4AAAAAATx99A4AAAAAAAtQ+","upper_bound":"A4AAAAAAUB99A4AAAAAAAAPC","repeats":1},{"count":21265905,"lower_bound":"A4AAAAAAUB99A4AAAAAAAewU","upper_bound":"A4AAAAAAUR99A4AAAAAAAQPC","repeats":1},{"count":21528049,"lower_bound":"A4AAAAAAUR99A4AAAAAAAuwU","upper_bound":"A4AAAAAAUh99A4AAAAAAABtw","repeats":1},{"count":21790193,"lower_bound":"A4AAAAAAUh99A4AAAAAAAgPC","upper_bound":"A4AAAAAAUx99A4AAAAAAARtw","repeats":1},{"count":22049148,"lower_bound":"A4AAAAAAUx99A4AAAAAAAwPC","upper_bound":"A4AAAAAAVBxfA4AAAAAABej5","repeats":1},{"count":22311292,"lower_bound":"A4AAAAAAVBxgA4AAAAAAADAB","upper_bound":"A4AAAAAAVRxfA4AAAAAABuj5","repeats":1},{"count":22573436,"lower_bound":"A4AAAAAAVRxgA4AAAAAAATAB","upper_bound":"A4AAAAAAVhxfA4AAAAAABgCm","repeats":1},{"count":22835580,"lower_bound":"A4AAAAAAVhxgA4AAAAAAAEfa","upper_bound":"A4AAAAAAVxxfA4AAAAAABwCm","repeats":1},{"count":23097724,"lower_bound":"A4AAAAAAVxxgA4AAAAAAAUfa","upper_bound":"A4AAAAAAWBxfA4AAAAAABhhT","repeats":1},{"count":23359868,"lower_bound":"A4AAAAAAWBxgA4AAAAAAAF+H","upper_bound":"A4AAAAAAWRxfA4AAAAAABxhT","repeats":1},{"count":23540534,"lower_bound":"A4AAAAAAWRxgA4AAAAAAAV+H","upper_bound":"A4AAAAAAWczOA4AAAAAAAg/1","repeats":1},{"count":23802678,"lower_bound":"A4AAAAAAWczOA4AAAAAAA/hI","upper_bound":"A4AAAAAAWszOA4AAAAAAAw/1","repeats":1},{"count":24064822,"lower_bound":"A4AAAAAAWszOA4AAAAAABPhI","upper_bound":"A4AAAAAAW8zOA4AAAAAAAiej","repeats":1},{"count":24326966,"lower_bound":"A4AAAAAAW8zOA4AAAAAABA/3","upper_bound":"A4AAAAAAXMzOA4AAAAAAAyej","repeats":1},{"count":24589110,"lower_bound":"A4AAAAAAXMzOA4AAAAAABQ/3","upper_bound":"A4AAAAAAXczOA4AAAAAAAj9P","repeats":1},{"count":24769776,"lower_bound":"A4AAAAAAXczOA4AAAAAABCej","upper_bound":"A4AAAAAAXn08A4AAAAAABsBl","repeats":1},{"count":25031920,"lower_bound":"A4AAAAAAXn09A4AAAAAAAQea","upper_bound":"A4AAAAAAX308A4AAAAAABdgR","repeats":1},{"count":25294064,"lower_bound":"A4AAAAAAX309A4AAAAAAAB9G","upper_bound":"A4AAAAAAYH08A4AAAAAABtgR","repeats":1},{"count":25556208,"lower_bound":"A4AAAAAAYH09A4AAAAAAAR9G","upper_bound":"A4AAAAAAYX08A4AAAAAABe+9","repeats":1},{"count":25818352,"lower_bound":"A4AAAAAAYX09A4AAAAAAADby","upper_bound":"A4AAAAAAYn08A4AAAAAABu+9","repeats":1},{"count":26049776,"lower_bound":"A4AAAAAAYn09A4AAAAAAATby","upper_bound":"A4AAAAAAY188A4AAAAAABemc","repeats":1},{"count":26311920,"lower_bound":"A4AAAAAAY189A4AAAAAAADCe","upper_bound":"A4AAAAAAZF88A4AAAAAABumc","repeats":1},{"count":26574064,"lower_bound":"A4AAAAAAZF89A4AAAAAAATCe","upper_bound":"A4AAAAAAZV88A4AAAAAABgFH","repeats":1},{"count":26836208,"lower_bound":"A4AAAAAAZV89A4AAAAAAAEh9","upper_bound":"A4AAAAAAZl88A4AAAAAABwFH","repeats":1},{"count":27098352,"lower_bound":"A4AAAAAAZl89A4AAAAAAAUh9","upper_bound":"A4AAAAAAZ188A4AAAAAABhjy","repeats":1},{"count":27360496,"lower_bound":"A4AAAAAAZ189A4AAAAAAAGAo","upper_bound":"A4AAAAAAaF88A4AAAAAABxjy","repeats":1},{"count":27541162,"lower_bound":"A4AAAAAAaF89A4AAAAAAAWAo","upper_bound":"A4AAAAAAaQ+rA4AAAAAAAhCW","repeats":1},{"count":27803306,"lower_bound":"A4AAAAAAaQ+rA4AAAAAAA/jr","upper_bound":"A4AAAAAAag+rA4AAAAAAAxCW","repeats":1},{"count":28065450,"lower_bound":"A4AAAAAAag+rA4AAAAAABPjr","upper_bound":"A4AAAAAAaw+rA4AAAAAAAihC","repeats":1},{"count":28327594,"lower_bound":"A4AAAAAAaw+rA4AAAAAABBCY","upper_bound":"A4AAAAAAbA+rA4AAAAAAAyhC","repeats":1},{"count":28589738,"lower_bound":"A4AAAAAAbA+rA4AAAAAABRCY","upper_bound":"A4AAAAAAbQ+rA4AAAAAAAj/s","repeats":1},{"count":28770404,"lower_bound":"A4AAAAAAbQ+rA4AAAAAABChC","upper_bound":"A4AAAAAAbcAZA4AAAAAABsEG","repeats":1},{"count":28901476,"lower_bound":"A4AAAAAAbcAaA4AAAAAAAQg9","upper_bound":"A4AAAAAAbkAZA4AAAAAAB0EG","repeats":1},{"count":29032548,"lower_bound":"A4AAAAAAbkAaA4AAAAAAAYg9","upper_bound":"A4AAAAAAbsAZA4AAAAAABdiw","repeats":1},{"count":29163620,"lower_bound":"A4AAAAAAbsAaA4AAAAAAAB/n","upper_bound":"A4AAAAAAb0AZA4AAAAAABliw","repeats":1},{"count":29294692,"lower_bound":"A4AAAAAAb0AaA4AAAAAAAJ/n","upper_bound":"A4AAAAAAb8AZA4AAAAAABtiw","repeats":1},{"count":29425764,"lower_bound":"A4AAAAAAb8AaA4AAAAAAAR/n","upper_bound":"A4AAAAAAcEAZA4AAAAAAB1iw","repeats":1},{"count":29556836,"lower_bound":"A4AAAAAAcEAaA4AAAAAAAZ/n","upper_bound":"A4AAAAAAcMAZA4AAAAAABfBa","repeats":1},{"count":29687908,"lower_bound":"A4AAAAAAcMAaA4AAAAAAADeR","upper_bound":"A4AAAAAAcUAZA4AAAAAABnBa","repeats":1},{"count":29818980,"lower_bound":"A4AAAAAAcUAaA4AAAAAAALeR","upper_bound":"A4AAAAAAccAZA4AAAAAABvBa","repeats":1},{"count":29950052,"lower_bound":"A4AAAAAAccAaA4AAAAAAATeR","upper_bound":"A4AAAAAAckAZA4AAAAAAB3Ba","repeats":1},{"count":30037935,"lower_bound":"A4AAAAAAckAaA4AAAAAAAbeR","upper_bound":"A4AAAAAAcpXsA4AAAAAAA/W7","repeats":1},{"count":30169007,"lower_bound":"A4AAAAAAcpXsA4AAAAAABd4S","upper_bound":"A4AAAAAAcxXsA4AAAAAABHW7","repeats":1},{"count":30300079,"lower_bound":"A4AAAAAAcxXsA4AAAAAABl4S","upper_bound":"A4AAAAAAc5XsA4AAAAAABPW7","repeats":1},{"count":30431151,"lower_bound":"A4AAAAAAc5XsA4AAAAAABt4S","upper_bound":"A4AAAAAAdBXsA4AAAAAABXW7","repeats":1},{"count":30562223,"lower_bound":"A4AAAAAAdBXsA4AAAAAAB14S","upper_bound":"A4AAAAAAdJXsA4AAAAAABA1k","repeats":1},{"count":30693295,"lower_bound":"A4AAAAAAdJXsA4AAAAAABfW7","upper_bound":"A4AAAAAAdRXsA4AAAAAABI1k","repeats":1},{"count":30824367,"lower_bound":"A4AAAAAAdRXsA4AAAAAABnW7","upper_bound":"A4AAAAAAdZXsA4AAAAAABQ1k","repeats":1},{"count":30955439,"lower_bound":"A4AAAAAAdZXsA4AAAAAABvW7","upper_bound":"A4AAAAAAdhXsA4AAAAAABY1k","repeats":1},{"count":31086511,"lower_bound":"A4AAAAAAdhXsA4AAAAAAB3W7","upper_bound":"A4AAAAAAdpXsA4AAAAAABCUN","repeats":1},{"count":31217583,"lower_bound":"A4AAAAAAdpXsA4AAAAAABg1k","upper_bound":"A4AAAAAAdxXsA4AAAAAABKUN","repeats":1},{"count":31348655,"lower_bound":"A4AAAAAAdxXsA4AAAAAABo1k","upper_bound":"A4AAAAAAd5XsA4AAAAAABSUN","repeats":1},{"count":31398249,"lower_bound":"A4AAAAAAd5XsA4AAAAAABw1k","upper_bound":"A4AAAAAAd8ZbA4AAAAAAAYUK","repeats":1},{"count":31529321,"lower_bound":"A4AAAAAAd8ZbA4AAAAAAA21h","upper_bound":"A4AAAAAAeEZbA4AAAAAAAByz","repeats":1},{"count":31660393,"lower_bound":"A4AAAAAAeEZbA4AAAAAAAgUK","upper_bound":"A4AAAAAAeMZbA4AAAAAAAJyz","repeats":1},{"count":31791465,"lower_bound":"A4AAAAAAeMZbA4AAAAAAAoUK","upper_bound":"A4AAAAAAeUZbA4AAAAAAARyz","repeats":1},{"count":31922537,"lower_bound":"A4AAAAAAeUZbA4AAAAAAAwUK","upper_bound":"A4AAAAAAecZbA4AAAAAAAZyz","repeats":1},{"count":32053609,"lower_bound":"A4AAAAAAecZbA4AAAAAAA4UK","upper_bound":"A4AAAAAAekZbA4AAAAAAADRc","repeats":1},{"count":32184681,"lower_bound":"A4AAAAAAekZbA4AAAAAAAhy0","upper_bound":"A4AAAAAAesZbA4AAAAAAALRc","repeats":1},{"count":32315753,"lower_bound":"A4AAAAAAesZbA4AAAAAAApy0","upper_bound":"A4AAAAAAe0ZbA4AAAAAAATRc","repeats":1},{"count":32446825,"lower_bound":"A4AAAAAAe0ZbA4AAAAAAAxy0","upper_bound":"A4AAAAAAe8ZbA4AAAAAAAbRc","repeats":1},{"count":32577897,"lower_bound":"A4AAAAAAe8ZbA4AAAAAAA5y0","upper_bound":"A4AAAAAAfEZbA4AAAAAAAExE","repeats":1},{"count":32708969,"lower_bound":"A4AAAAAAfEZbA4AAAAAAAjRc","upper_bound":"A4AAAAAAfMZbA4AAAAAAAMxE","repeats":1},{"count":32758563,"lower_bound":"A4AAAAAAfMZbA4AAAAAAArRc","upper_bound":"A4AAAAAAfPbJA4AAAAAABM0i","repeats":1},{"count":32889635,"lower_bound":"A4AAAAAAfPbJA4AAAAAABrV6","upper_bound":"A4AAAAAAfXbJA4AAAAAABU0i","repeats":1},{"count":33020707,"lower_bound":"A4AAAAAAfXbJA4AAAAAABzV6","upper_bound":"A4AAAAAAffbJA4AAAAAAA+TK","repeats":1},{"count":33151779,"lower_bound":"A4AAAAAAffbJA4AAAAAABc0i","upper_bound":"A4AAAAAAfnbJA4AAAAAABGTK","repeats":1},{"count":33282851,"lower_bound":"A4AAAAAAfnbJA4AAAAAABk0i","upper_bound":"A4AAAAAAfvbJA4AAAAAABOTK","repeats":1},{"count":33413923,"lower_bound":"A4AAAAAAfvbJA4AAAAAABs0i","upper_bound":"A4AAAAAAf3bJA4AAAAAABWTK","repeats":1},{"count":33544995,"lower_bound":"A4AAAAAAf3bJA4AAAAAAB00i","upper_bound":"A4AAAAAAf/bJA4AAAAAAA/yy","repeats":1},{"count":33676067,"lower_bound":"A4AAAAAAf/bJA4AAAAAABeTK","upper_bound":"A4AAAAAAgHbJA4AAAAAABHyy","repeats":1},{"count":33807139,"lower_bound":"A4AAAAAAgHbJA4AAAAAABmTK","upper_bound":"A4AAAAAAgPbJA4AAAAAABPyy","repeats":1},{"count":33938211,"lower_bound":"A4AAAAAAgPbJA4AAAAAABuTK","upper_bound":"A4AAAAAAgXbJA4AAAAAABXyy","repeats":1},{"count":34038563,"lower_bound":"A4AAAAAAgXbJA4AAAAAAB2TK","upper_bound":"A4AAAAAAgdjJA4AAAAAAA/Zc","repeats":1},{"count":34169635,"lower_bound":"A4AAAAAAgdjJA4AAAAAABd61","upper_bound":"A4AAAAAAgljJA4AAAAAABHZc","repeats":1},{"count":34300707,"lower_bound":"A4AAAAAAgljJA4AAAAAABl61","upper_bound":"A4AAAAAAgtjJA4AAAAAABPZc","repeats":1},{"count":34431779,"lower_bound":"A4AAAAAAgtjJA4AAAAAABt61","upper_bound":"A4AAAAAAg1jJA4AAAAAABXZc","repeats":1},{"count":34562851,"lower_bound":"A4AAAAAAg1jJA4AAAAAAB161","upper_bound":"A4AAAAAAg9jJA4AAAAAABA4D","repeats":1},{"count":34693923,"lower_bound":"A4AAAAAAg9jJA4AAAAAABfZc","upper_bound":"A4AAAAAAhFjJA4AAAAAABI4D","repeats":1},{"count":34824995,"lower_bound":"A4AAAAAAhFjJA4AAAAAABnZc","upper_bound":"A4AAAAAAhNjJA4AAAAAABQ4D","repeats":1},{"count":34956067,"lower_bound":"A4AAAAAAhNjJA4AAAAAABvZc","upper_bound":"A4AAAAAAhVjJA4AAAAAABY4D","repeats":1},{"count":35087139,"lower_bound":"A4AAAAAAhVjJA4AAAAAAB3Zc","upper_bound":"A4AAAAAAhdjJA4AAAAAABCWq","repeats":1},{"count":35218211,"lower_bound":"A4AAAAAAhdjJA4AAAAAABg4D","upper_bound":"A4AAAAAAhljJA4AAAAAABKWq","repeats":1},{"count":35349283,"lower_bound":"A4AAAAAAhljJA4AAAAAABo4D","upper_bound":"A4AAAAAAhtjJA4AAAAAABSWq","repeats":1},{"count":35398877,"lower_bound":"A4AAAAAAhtjJA4AAAAAABw4D","upper_bound":"A4AAAAAAhwk4A4AAAAAAAYWr","repeats":1},{"count":35529949,"lower_bound":"A4AAAAAAhwk4A4AAAAAAA24E","upper_bound":"A4AAAAAAh4k4A4AAAAAAAB1S","repeats":1},{"count":35661021,"lower_bound":"A4AAAAAAh4k4A4AAAAAAAgWr","upper_bound":"A4AAAAAAiAk4A4AAAAAAAJ1S","repeats":1},{"count":35792093,"lower_bound":"A4AAAAAAiAk4A4AAAAAAAoWr","upper_bound":"A4AAAAAAiIk4A4AAAAAAAR1S","repeats":1},{"count":35923165,"lower_bound":"A4AAAAAAiIk4A4AAAAAAAwWr","upper_bound":"A4AAAAAAiQk4A4AAAAAAAZ1S","repeats":1},{"count":36054237,"lower_bound":"A4AAAAAAiQk4A4AAAAAAA4Wr","upper_bound":"A4AAAAAAiYk4A4AAAAAAADT5","repeats":1},{"count":36185309,"lower_bound":"A4AAAAAAiYk4A4AAAAAAAh1T","upper_bound":"A4AAAAAAigk4A4AAAAAAALT5","repeats":1},{"count":36316381,"lower_bound":"A4AAAAAAigk4A4AAAAAAAp1T","upper_bound":"A4AAAAAAiok4A4AAAAAAATT5","repeats":1},{"count":36447453,"lower_bound":"A4AAAAAAiok4A4AAAAAAAx1T","upper_bound":"A4AAAAAAiwk4A4AAAAAAAbT5","repeats":1},{"count":36578525,"lower_bound":"A4AAAAAAiwk4A4AAAAAAA51T","upper_bound":"A4AAAAAAi4k4A4AAAAAAAEzn","repeats":1},{"count":36709597,"lower_bound":"A4AAAAAAi4k4A4AAAAAAAjT5","upper_bound":"A4AAAAAAjAk4A4AAAAAAAMzn","repeats":1},{"count":36759191,"lower_bound":"A4AAAAAAjAk4A4AAAAAAArT5","upper_bound":"A4AAAAAAjDmmA4AAAAAABM3B","repeats":1},{"count":36890263,"lower_bound":"A4AAAAAAjDmmA4AAAAAABrYb","upper_bound":"A4AAAAAAjLmmA4AAAAAABU3B","repeats":1},{"count":37021335,"lower_bound":"A4AAAAAAjLmmA4AAAAAABzYb","upper_bound":"A4AAAAAAjTmmA4AAAAAAA+Vn","repeats":1},{"count":37152407,"lower_bound":"A4AAAAAAjTmmA4AAAAAABc3B","upper_bound":"A4AAAAAAjbmmA4AAAAAABGVn","repeats":1},{"count":37283479,"lower_bound":"A4AAAAAAjbmmA4AAAAAABk3B","upper_bound":"A4AAAAAAjjmmA4AAAAAABOVn","repeats":1},{"count":37414551,"lower_bound":"A4AAAAAAjjmmA4AAAAAABs3B","upper_bound":"A4AAAAAAjrmmA4AAAAAABWVn","repeats":1},{"count":37545623,"lower_bound":"A4AAAAAAjrmmA4AAAAAAB03B","upper_bound":"A4AAAAAAjzmmA4AAAAAAA/1V","repeats":1},{"count":37676695,"lower_bound":"A4AAAAAAjzmmA4AAAAAABeVn","upper_bound":"A4AAAAAAj7mmA4AAAAAABH1V","repeats":1},{"count":37807767,"lower_bound":"A4AAAAAAj7mmA4AAAAAABmVn","upper_bound":"A4AAAAAAkDmmA4AAAAAABP1V","repeats":1},{"count":37938839,"lower_bound":"A4AAAAAAkDmmA4AAAAAABuVn","upper_bound":"A4AAAAAAkLmmA4AAAAAABX1V","repeats":1},{"count":38019191,"lower_bound":"A4AAAAAAkLmmA4AAAAAAB2Vn","upper_bound":"A4AAAAAAkQgeA4AAAAAAA+N1","repeats":1},{"count":38150263,"lower_bound":"A4AAAAAAkQgeA4AAAAAABcvQ","upper_bound":"A4AAAAAAkYgeA4AAAAAABGN1","repeats":1},{"count":38281335,"lower_bound":"A4AAAAAAkYgeA4AAAAAABkvQ","upper_bound":"A4AAAAAAkggeA4AAAAAABON1","repeats":1},{"count":38412407,"lower_bound":"A4AAAAAAkggeA4AAAAAABsvQ","upper_bound":"A4AAAAAAkogeA4AAAAAABWN1","repeats":1},{"count":38543479,"lower_bound":"A4AAAAAAkogeA4AAAAAAB0vQ","upper_bound":"A4AAAAAAkwgeA4AAAAAAA/sa","repeats":1},{"count":38674551,"lower_bound":"A4AAAAAAkwgeA4AAAAAABeN1","upper_bound":"A4AAAAAAk4geA4AAAAAABHsa","repeats":1},{"count":38805623,"lower_bound":"A4AAAAAAk4geA4AAAAAABmN1","upper_bound":"A4AAAAAAlAgeA4AAAAAABPsa","repeats":1},{"count":38936695,"lower_bound":"A4AAAAAAlAgeA4AAAAAABuN1","upper_bound":"A4AAAAAAlIgeA4AAAAAABXsa","repeats":1},{"count":39067767,"lower_bound":"A4AAAAAAlIgeA4AAAAAAB2N1","upper_bound":"A4AAAAAAlQgeA4AAAAAABBK/","repeats":1},{"count":39198839,"lower_bound":"A4AAAAAAlQgeA4AAAAAABfsa","upper_bound":"A4AAAAAAlYgeA4AAAAAABJK/","repeats":1},{"count":39329911,"lower_bound":"A4AAAAAAlYgeA4AAAAAABnsa","upper_bound":"A4AAAAAAlggeA4AAAAAABRK/","repeats":1},{"count":39460983,"lower_bound":"A4AAAAAAlggeA4AAAAAABvsa","upper_bound":"A4AAAAAAlogeA4AAAAAABZK/","repeats":1},{"count":39592055,"lower_bound":"A4AAAAAAlogeA4AAAAAAB3sa","upper_bound":"A4AAAAAAlwgeA4AAAAAABCqw","repeats":1},{"count":39723127,"lower_bound":"A4AAAAAAlwgeA4AAAAAABhK/","upper_bound":"A4AAAAAAl4geA4AAAAAABKqw","repeats":1},{"count":39854199,"lower_bound":"A4AAAAAAl4geA4AAAAAABpK/","upper_bound":"A4AAAAAAmAgeA4AAAAAABSqw","repeats":1},{"count":39985271,"lower_bound":"A4AAAAAAmAgeA4AAAAAABxK/","upper_bound":"A4AAAAAAmIgeA4AAAAAABaqw","repeats":1},{"count":40000000,"lower_bound":"A4AAAAAAmIgeA4AAAAAAB5K/","upper_bound":"A4AAAAAAmJaAA4AAAAAABbkS","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695341623377921}},"count":40000000,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/region.json b/cmd/explaintest/s/tpch_stats/region.json deleted file mode 100644 index 01a95c7f9b9e4..0000000000000 --- a/cmd/explaintest/s/tpch_stats/region.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"region","columns":{"r_comment":{"histogram":{"ndv":5,"buckets":[{"count":1,"lower_bound":"Z2VzLiB0aGlubHkgZXZlbiBwaW50byBiZWFucyBjYQ==","upper_bound":"Z2VzLiB0aGlubHkgZXZlbiBwaW50byBiZWFucyBjYQ==","repeats":1},{"count":2,"lower_bound":"aHMgdXNlIGlyb25pYywgZXZlbiByZXF1ZXN0cy4gcw==","upper_bound":"aHMgdXNlIGlyb25pYywgZXZlbiByZXF1ZXN0cy4gcw==","repeats":1},{"count":3,"lower_bound":"bGFyIGRlcG9zaXRzLiBibGl0aGVseSBmaW5hbCBwYWNrYWdlcyBjYWpvbGUuIHJlZ3VsYXIgd2F0ZXJzIGFyZSBmaW5hbCByZXF1ZXN0cy4gcmVndWxhciBhY2NvdW50cyBhcmUgYWNjb3JkaW5nIHRvIA==","upper_bound":"bGFyIGRlcG9zaXRzLiBibGl0aGVseSBmaW5hbCBwYWNrYWdlcyBjYWpvbGUuIHJlZ3VsYXIgd2F0ZXJzIGFyZSBmaW5hbCByZXF1ZXN0cy4gcmVndWxhciBhY2NvdW50cyBhcmUgYWNjb3JkaW5nIHRvIA==","repeats":1},{"count":4,"lower_bound":"bHkgZmluYWwgY291cnRzIGNham9sZSBmdXJpb3VzbHkgZmluYWwgZXhjdXNl","upper_bound":"bHkgZmluYWwgY291cnRzIGNham9sZSBmdXJpb3VzbHkgZmluYWwgZXhjdXNl","repeats":1},{"count":5,"lower_bound":"dWlja2x5IHNwZWNpYWwgYWNjb3VudHMgY2Fqb2xlIGNhcmVmdWxseSBibGl0aGVseSBjbG9zZSByZXF1ZXN0cy4gY2FyZWZ1bGx5IGZpbmFsIGFzeW1wdG90ZXMgaGFnZ2xlIGZ1cmlvdXNs","upper_bound":"dWlja2x5IHNwZWNpYWwgYWNjb3VudHMgY2Fqb2xlIGNhcmVmdWxseSBibGl0aGVseSBjbG9zZSByZXF1ZXN0cy4gY2FyZWZ1bGx5IGZpbmFsIGFzeW1wdG90ZXMgaGFnZ2xlIGZ1cmlvdXNs","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":342,"last_update_version":401695327729745922},"r_name":{"histogram":{"ndv":5,"buckets":[{"count":1,"lower_bound":"QUZSSUNB","upper_bound":"QUZSSUNB","repeats":1},{"count":2,"lower_bound":"QU1FUklDQQ==","upper_bound":"QU1FUklDQQ==","repeats":1},{"count":3,"lower_bound":"QVNJQQ==","upper_bound":"QVNJQQ==","repeats":1},{"count":4,"lower_bound":"RVVST1BF","upper_bound":"RVVST1BF","repeats":1},{"count":5,"lower_bound":"TUlERExFIEVBU1Q=","upper_bound":"TUlERExFIEVBU1Q=","repeats":1}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":44,"last_update_version":401695327716638723},"r_regionkey":{"histogram":{"ndv":5,"buckets":[{"count":1,"lower_bound":"MA==","upper_bound":"MA==","repeats":1},{"count":2,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":1},{"count":3,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":1},{"count":4,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":1},{"count":5,"lower_bound":"NA==","upper_bound":"NA==","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695327716638721}},"indices":{},"count":5,"modify_count":0} diff --git a/cmd/explaintest/s/tpch_stats/supplier.json b/cmd/explaintest/s/tpch_stats/supplier.json deleted file mode 100644 index 56ea5201fa352..0000000000000 --- a/cmd/explaintest/s/tpch_stats/supplier.json +++ /dev/null @@ -1 +0,0 @@ -{"database_name":"tpch","table_name":"supplier","columns":{"s_acctbal":{"histogram":{"ndv":403776,"buckets":[{"count":2000,"lower_bound":"LTk4MS40NA==","upper_bound":"LTk2MS4zOA==","repeats":1},{"count":4000,"lower_bound":"LTk0OS4xMQ==","upper_bound":"LTkzNy4y","repeats":1},{"count":6000,"lower_bound":"LTkzMC43","upper_bound":"LTg4My45Ng==","repeats":1},{"count":8000,"lower_bound":"LTg3MS44Nw==","upper_bound":"LTgzOC43OA==","repeats":1},{"count":10000,"lower_bound":"LTgyNS45Mw==","upper_bound":"LTgwMi41Nw==","repeats":1},{"count":12000,"lower_bound":"LTc5Ny43OA==","upper_bound":"LTczMy40NA==","repeats":1},{"count":14000,"lower_bound":"LTcxOS45NA==","upper_bound":"LTY4MC4xOA==","repeats":1},{"count":16000,"lower_bound":"LTY3OS4z","upper_bound":"LTY0Ni41Ng==","repeats":1},{"count":18000,"lower_bound":"LTYzMS4xOA==","upper_bound":"LTYxNC44NA==","repeats":1},{"count":20000,"lower_bound":"LTYwNS43Mw==","upper_bound":"LTU4Ni4zOQ==","repeats":1},{"count":22000,"lower_bound":"LTU2OS4yMg==","upper_bound":"LTUyNy45Mg==","repeats":1},{"count":24000,"lower_bound":"LTUyMy4wNA==","upper_bound":"LTUwMi42NQ==","repeats":1},{"count":26000,"lower_bound":"LTQ5My45Ng==","upper_bound":"LTQ3My4xMw==","repeats":1},{"count":28000,"lower_bound":"LTQ3Mi40Mw==","upper_bound":"LTQ1NS40Ng==","repeats":1},{"count":30000,"lower_bound":"LTQ1Mi45Mw==","upper_bound":"LTQzMi4xNw==","repeats":1},{"count":32000,"lower_bound":"LTQyOS4zMw==","upper_bound":"LTM4NC41Mg==","repeats":1},{"count":34000,"lower_bound":"LTM4Mi42MQ==","upper_bound":"LTMxMi4yNg==","repeats":1},{"count":36000,"lower_bound":"LTMwOC41Ng==","upper_bound":"LTI3Mi45Mw==","repeats":1},{"count":38000,"lower_bound":"LTI2Ni4yNA==","upper_bound":"LTIxOS43Nw==","repeats":1},{"count":40000,"lower_bound":"LTIxMi43OA==","upper_bound":"LTE4NS4xMg==","repeats":1},{"count":42000,"lower_bound":"LTE3Mi42NA==","upper_bound":"LTE0Ni4xMw==","repeats":1},{"count":44000,"lower_bound":"LTE0MC40NQ==","upper_bound":"LTEyNi4wOA==","repeats":1},{"count":46000,"lower_bound":"LTEyMi4zNw==","upper_bound":"LTEwOS42NA==","repeats":1},{"count":48000,"lower_bound":"LTk0Ljk3","upper_bound":"LTYyLjM1","repeats":1},{"count":50000,"lower_bound":"LTYxLjE4","upper_bound":"LTQuODM=","repeats":1},{"count":52000,"lower_bound":"LTEuNjU=","upper_bound":"MTEuODM=","repeats":1},{"count":54000,"lower_bound":"NDYuMzE=","upper_bound":"ODcuMTk=","repeats":1},{"count":56000,"lower_bound":"ODguNzU=","upper_bound":"MTE5LjEz","repeats":1},{"count":58000,"lower_bound":"MTQyLjM0","upper_bound":"MTYyLjcz","repeats":1},{"count":60000,"lower_bound":"MTY4Ljg5","upper_bound":"MTk2LjM1","repeats":1},{"count":62000,"lower_bound":"MjA3LjU5","upper_bound":"MjUwLjU5","repeats":1},{"count":64000,"lower_bound":"Mjg3LjQ=","upper_bound":"MzA2LjUx","repeats":1},{"count":66000,"lower_bound":"MzI4LjQ1","upper_bound":"MzczLjQ=","repeats":1},{"count":68000,"lower_bound":"Mzc2Ljcx","upper_bound":"NDE2LjI3","repeats":1},{"count":70000,"lower_bound":"NDE4LjQx","upper_bound":"NDM3LjM4","repeats":1},{"count":72000,"lower_bound":"NDQ4LjQ=","upper_bound":"NDk1Ljgz","repeats":1},{"count":74000,"lower_bound":"NTI0Ljg3","upper_bound":"NTcxLjM1","repeats":1},{"count":76000,"lower_bound":"NTc0LjM1","upper_bound":"NjA2Ljk1","repeats":1},{"count":78000,"lower_bound":"NjExLjg=","upper_bound":"NjM5LjM5","repeats":1},{"count":80000,"lower_bound":"NjUxLjc4","upper_bound":"NzE0LjQy","repeats":1},{"count":82000,"lower_bound":"NzE1LjMx","upper_bound":"NzM4LjQ1","repeats":1},{"count":84000,"lower_bound":"NzQwLjg4","upper_bound":"NzQ3LjI5","repeats":1},{"count":86000,"lower_bound":"NzcyLjQ2","upper_bound":"Nzc4LjE5","repeats":1},{"count":88000,"lower_bound":"ODI5LjE2","upper_bound":"ODQ1Ljg4","repeats":1},{"count":90000,"lower_bound":"ODczLjMy","upper_bound":"ODg4LjUx","repeats":1},{"count":92000,"lower_bound":"ODkwLjky","upper_bound":"OTMzLjY3","repeats":1},{"count":94000,"lower_bound":"OTQ2LjA5","upper_bound":"OTY1LjEy","repeats":1},{"count":96000,"lower_bound":"OTk0LjEx","upper_bound":"MTAxOC4zNQ==","repeats":1},{"count":98000,"lower_bound":"MTAxOC45NA==","upper_bound":"MTAyNy42Ng==","repeats":1},{"count":100000,"lower_bound":"MTA0MC41NQ==","upper_bound":"MTA3Ni4wNQ==","repeats":1},{"count":102000,"lower_bound":"MTA3Ni41OA==","upper_bound":"MTEyOS4yMw==","repeats":1},{"count":104000,"lower_bound":"MTE1Mi4xNw==","upper_bound":"MTE4NS42OQ==","repeats":1},{"count":106000,"lower_bound":"MTE5Mi45Mg==","upper_bound":"MTI1NS43NA==","repeats":1},{"count":108000,"lower_bound":"MTI2Mi41","upper_bound":"MTI3OC4xOQ==","repeats":1},{"count":110000,"lower_bound":"MTI4OC4yNQ==","upper_bound":"MTMxNi4xOA==","repeats":1},{"count":112000,"lower_bound":"MTMxNy4x","upper_bound":"MTMzMC4wMw==","repeats":1},{"count":114000,"lower_bound":"MTMzNy45","upper_bound":"MTM1Ny4zNQ==","repeats":1},{"count":116000,"lower_bound":"MTM2My4xMw==","upper_bound":"MTQwMy40Mw==","repeats":1},{"count":118000,"lower_bound":"MTQxMS4xOQ==","upper_bound":"MTQ0My42NA==","repeats":1},{"count":120000,"lower_bound":"MTQ0NC4wOA==","upper_bound":"MTQ4NS45","repeats":1},{"count":122000,"lower_bound":"MTQ5Ni41","upper_bound":"MTUzNy4yOA==","repeats":1},{"count":124000,"lower_bound":"MTU0NS44NQ==","upper_bound":"MTU3Ny4yNg==","repeats":1},{"count":126000,"lower_bound":"MTU4Mi44Mg==","upper_bound":"MTU5NC44OQ==","repeats":1},{"count":128000,"lower_bound":"MTYzMS41Nw==","upper_bound":"MTY1OC4zMg==","repeats":1},{"count":130000,"lower_bound":"MTY2MS45Mg==","upper_bound":"MTY3MC43OQ==","repeats":1},{"count":132000,"lower_bound":"MTY4Ny4z","upper_bound":"MTcwMS42Mw==","repeats":1},{"count":134000,"lower_bound":"MTcxNi41Ng==","upper_bound":"MTczMy4xNQ==","repeats":1},{"count":136000,"lower_bound":"MTczNC4wNQ==","upper_bound":"MTc0OC44NQ==","repeats":1},{"count":138000,"lower_bound":"MTc1My4yMw==","upper_bound":"MTgwMi41Mg==","repeats":1},{"count":140000,"lower_bound":"MTgwNS42OQ==","upper_bound":"MTg5Ny41OQ==","repeats":1},{"count":142000,"lower_bound":"MTkwMS43NA==","upper_bound":"MTk2MC42","repeats":1},{"count":144000,"lower_bound":"MTk2NS45MQ==","upper_bound":"MjAwMy4yOA==","repeats":1},{"count":146000,"lower_bound":"MjAwNS4xOQ==","upper_bound":"MjAxNC45Mg==","repeats":1},{"count":148000,"lower_bound":"MjA1My41","upper_bound":"MjA5NC44NQ==","repeats":1},{"count":150000,"lower_bound":"MjEwMS4y","upper_bound":"MjE0MS43MQ==","repeats":1},{"count":152000,"lower_bound":"MjE0Ny4zMg==","upper_bound":"MjE1NC43","repeats":1},{"count":154000,"lower_bound":"MjE1Ny42Ng==","upper_bound":"MjE4MS41Mg==","repeats":1},{"count":156000,"lower_bound":"MjE4OC41OQ==","upper_bound":"MjIwMy4yNg==","repeats":1},{"count":158000,"lower_bound":"MjIwOS4yNQ==","upper_bound":"MjI3Mi42Mg==","repeats":1},{"count":160000,"lower_bound":"MjI4MS45Ng==","upper_bound":"MjMxMi42Ng==","repeats":1},{"count":162000,"lower_bound":"MjMxOS4xOA==","upper_bound":"MjM1Ny40Mw==","repeats":1},{"count":164000,"lower_bound":"MjM1OS45OA==","upper_bound":"MjM5NC43","repeats":1},{"count":166000,"lower_bound":"MjM5OS4xNA==","upper_bound":"MjQzNC42NA==","repeats":1},{"count":168000,"lower_bound":"MjQ3Mi42OQ==","upper_bound":"MjUwMy4yNA==","repeats":1},{"count":170000,"lower_bound":"MjUwNS4yNg==","upper_bound":"MjUyMy44Ng==","repeats":1},{"count":172000,"lower_bound":"MjUyNi4wOQ==","upper_bound":"MjU1Ny45NQ==","repeats":1},{"count":174000,"lower_bound":"MjU2MC4yNw==","upper_bound":"MjU3OC44Nw==","repeats":1},{"count":176000,"lower_bound":"MjU5MS40OQ==","upper_bound":"MjYwOS4zMg==","repeats":1},{"count":178000,"lower_bound":"MjY0NS43OA==","upper_bound":"MjY4NS43OA==","repeats":1},{"count":180000,"lower_bound":"MjcwOS41OA==","upper_bound":"MjcyMS4xMQ==","repeats":1},{"count":182000,"lower_bound":"MjcyMi43Ng==","upper_bound":"Mjc1My4wOA==","repeats":1},{"count":184000,"lower_bound":"Mjc2NS40MQ==","upper_bound":"MjgwMi45OA==","repeats":1},{"count":186000,"lower_bound":"MjgxNi41","upper_bound":"Mjg3NS41Mg==","repeats":1},{"count":188000,"lower_bound":"Mjg4MC4zMQ==","upper_bound":"MjkwNS4zMw==","repeats":1},{"count":190000,"lower_bound":"MjkwOC41NQ==","upper_bound":"Mjk0NA==","repeats":1},{"count":192000,"lower_bound":"Mjk1NC40OA==","upper_bound":"MzAxMS41MQ==","repeats":1},{"count":194000,"lower_bound":"MzAyMC40OQ==","upper_bound":"MzA0OS45MQ==","repeats":1},{"count":196000,"lower_bound":"MzA1NS40","upper_bound":"MzEwMC4y","repeats":1},{"count":198000,"lower_bound":"MzEwNy45Mg==","upper_bound":"MzE3My44Mg==","repeats":1},{"count":200000,"lower_bound":"MzE3Ny43Nw==","upper_bound":"MzIxNi4xOA==","repeats":1},{"count":202000,"lower_bound":"MzIxOS42Nw==","upper_bound":"MzI2NS4yMg==","repeats":1},{"count":204000,"lower_bound":"MzI3Ni45MQ==","upper_bound":"MzMzMC44Ng==","repeats":1},{"count":206000,"lower_bound":"MzM0My42NQ==","upper_bound":"MzM4MC4xNQ==","repeats":1},{"count":208000,"lower_bound":"MzM4Mi42Nw==","upper_bound":"MzM5My44Ng==","repeats":1},{"count":210000,"lower_bound":"MzM5OC42NA==","upper_bound":"MzQwNi44Ng==","repeats":1},{"count":212000,"lower_bound":"MzQxNC4yMg==","upper_bound":"MzQ0MS45MQ==","repeats":1},{"count":214000,"lower_bound":"MzQ1OC41OQ==","upper_bound":"MzQ5OC4zMw==","repeats":1},{"count":216000,"lower_bound":"MzUxNS4xOA==","upper_bound":"MzU0NC4zMg==","repeats":1},{"count":218000,"lower_bound":"MzU3NC40","upper_bound":"MzU4OS41OQ==","repeats":1},{"count":220000,"lower_bound":"MzU5MC40MQ==","upper_bound":"MzYwMy42Mw==","repeats":1},{"count":222000,"lower_bound":"MzYxMS43Ng==","upper_bound":"MzY1NC42MQ==","repeats":1},{"count":224000,"lower_bound":"MzY2Mi45NQ==","upper_bound":"MzY4My4zOQ==","repeats":1},{"count":226000,"lower_bound":"MzY5Mi4xNw==","upper_bound":"Mzc1NC43OQ==","repeats":1},{"count":228000,"lower_bound":"Mzc1OS44MQ==","upper_bound":"Mzc3OC4yMg==","repeats":1},{"count":230000,"lower_bound":"MzgwMS4xNg==","upper_bound":"Mzg1My41Nw==","repeats":1},{"count":232000,"lower_bound":"Mzg3Ny41Mg==","upper_bound":"MzkwMy4xMQ==","repeats":1},{"count":234000,"lower_bound":"MzkxNi4wNw==","upper_bound":"Mzk1MC43NQ==","repeats":1},{"count":236000,"lower_bound":"Mzk1My4xNg==","upper_bound":"Mzk4MC4zNw==","repeats":1},{"count":238000,"lower_bound":"Mzk4OS42","upper_bound":"NDAwMy43Nw==","repeats":1},{"count":240000,"lower_bound":"NDAxMS42","upper_bound":"NDA0Ni4xMQ==","repeats":1},{"count":242000,"lower_bound":"NDA0OC41NQ==","upper_bound":"NDA4OS43Nw==","repeats":1},{"count":244000,"lower_bound":"NDA5Ny4xNw==","upper_bound":"NDEwNC42OQ==","repeats":1},{"count":246000,"lower_bound":"NDEwOS44NQ==","upper_bound":"NDExNy42OQ==","repeats":1},{"count":248000,"lower_bound":"NDE0MC44MQ==","upper_bound":"NDE3MS44OQ==","repeats":1},{"count":250000,"lower_bound":"NDE3Ny42OQ==","upper_bound":"NDE5OS44MQ==","repeats":1},{"count":252000,"lower_bound":"NDIyOS44Mg==","upper_bound":"NDI3Mi40OA==","repeats":1},{"count":254000,"lower_bound":"NDI4NC4zMg==","upper_bound":"NDMyNS40Nw==","repeats":1},{"count":256000,"lower_bound":"NDMyOS41OQ==","upper_bound":"NDM4Mi40Mg==","repeats":1},{"count":258000,"lower_bound":"NDM5Ny43Ng==","upper_bound":"NDQ0Mi43NA==","repeats":1},{"count":260000,"lower_bound":"NDQ2OS4xNA==","upper_bound":"NDQ3OS43MQ==","repeats":1},{"count":262000,"lower_bound":"NDQ4Ni44Nw==","upper_bound":"NDUyMC42Ng==","repeats":1},{"count":264000,"lower_bound":"NDUyNi4zNg==","upper_bound":"NDU2MC4yNQ==","repeats":1},{"count":266000,"lower_bound":"NDU2MS4xOA==","upper_bound":"NDU3Mi44MQ==","repeats":1},{"count":268000,"lower_bound":"NDU3NS45Mg==","upper_bound":"NDYwMi4yMg==","repeats":1},{"count":270000,"lower_bound":"NDYwNi4zMg==","upper_bound":"NDYxOS40NQ==","repeats":1},{"count":272000,"lower_bound":"NDYzMi4yNg==","upper_bound":"NDY2OS44Mw==","repeats":1},{"count":274000,"lower_bound":"NDY5Mi43Mg==","upper_bound":"NDcxNC40","repeats":1},{"count":276000,"lower_bound":"NDcyMS4yNg==","upper_bound":"NDc0My41Mg==","repeats":1},{"count":278000,"lower_bound":"NDc3Ny4wNw==","upper_bound":"NDgxOC42OQ==","repeats":1},{"count":280000,"lower_bound":"NDgxOS40Ng==","upper_bound":"NDg2Ni4yNQ==","repeats":1},{"count":282000,"lower_bound":"NDkwMC45NA==","upper_bound":"NDk1MC4yNQ==","repeats":1},{"count":284000,"lower_bound":"NDk1MS43Ng==","upper_bound":"NDk4Mi4xMg==","repeats":1},{"count":286000,"lower_bound":"NDk5My4xNg==","upper_bound":"NTAzMS41NA==","repeats":1},{"count":288000,"lower_bound":"NTAzMi43Mg==","upper_bound":"NTA4MC42OA==","repeats":1},{"count":290000,"lower_bound":"NTA4Ny43","upper_bound":"NTEzOC4wOQ==","repeats":1},{"count":292000,"lower_bound":"NTE0MC45NQ==","upper_bound":"NTE2OS4wOA==","repeats":1},{"count":294000,"lower_bound":"NTE3Ni41NQ==","upper_bound":"NTIwNC4zMw==","repeats":1},{"count":296000,"lower_bound":"NTIxNi42NA==","upper_bound":"NTIzMy41Mg==","repeats":1},{"count":298000,"lower_bound":"NTI0Mi40OA==","upper_bound":"NTI5Mi40NA==","repeats":1},{"count":300000,"lower_bound":"NTMwNS42Ng==","upper_bound":"NTMzOS45Mw==","repeats":1},{"count":302000,"lower_bound":"NTM0MC40Mg==","upper_bound":"NTM2NS40Mg==","repeats":1},{"count":304000,"lower_bound":"NTM2Ni44Mw==","upper_bound":"NTM5OC4xMw==","repeats":1},{"count":306000,"lower_bound":"NTQwOC4wNA==","upper_bound":"NTQ0OS40NQ==","repeats":1},{"count":308000,"lower_bound":"NTQ1NS43Nw==","upper_bound":"NTQ4NC4xOA==","repeats":1},{"count":310000,"lower_bound":"NTQ4Ni4zMw==","upper_bound":"NTU0Ni4yNw==","repeats":1},{"count":312000,"lower_bound":"NTU4MS4zNg==","upper_bound":"NTY0MC42Mw==","repeats":1},{"count":314000,"lower_bound":"NTY1My43Ng==","upper_bound":"NTY2OS4xNg==","repeats":1},{"count":316000,"lower_bound":"NTY3MS43MQ==","upper_bound":"NTc1Ni41Nw==","repeats":1},{"count":318000,"lower_bound":"NTc2My45Mw==","upper_bound":"NTc4NC40Mg==","repeats":1},{"count":320000,"lower_bound":"NTc5MC4yMw==","upper_bound":"NTc5OS4zMg==","repeats":1},{"count":322000,"lower_bound":"NTg1OC45Mw==","upper_bound":"NTg5OS4wNA==","repeats":1},{"count":324000,"lower_bound":"NTkxNS45OQ==","upper_bound":"NTk1MC4wOA==","repeats":1},{"count":326000,"lower_bound":"NTk3NS41Ng==","upper_bound":"NjAwMC4yNQ==","repeats":1},{"count":328000,"lower_bound":"NjA2MS4zMg==","upper_bound":"NjEwMS40","repeats":1},{"count":330000,"lower_bound":"NjEwNy4zOA==","upper_bound":"NjE1MS4xMg==","repeats":1},{"count":332000,"lower_bound":"NjE4NC41Mg==","upper_bound":"NjIyMS42OQ==","repeats":1},{"count":334000,"lower_bound":"NjIyNi43Ng==","upper_bound":"NjI3NC4wNg==","repeats":1},{"count":336000,"lower_bound":"NjI3Ny44OA==","upper_bound":"NjI5Mi4xOQ==","repeats":1},{"count":338000,"lower_bound":"NjMwMS4wMQ==","upper_bound":"NjMzMS4wMg==","repeats":1},{"count":340000,"lower_bound":"NjM0MS40OA==","upper_bound":"NjM2NS4zNA==","repeats":1},{"count":342000,"lower_bound":"NjM2Ny42Nw==","upper_bound":"NjM4MC41OA==","repeats":1},{"count":344000,"lower_bound":"NjM4My44MQ==","upper_bound":"NjQxNy4xMg==","repeats":1},{"count":346000,"lower_bound":"NjQxNy41NQ==","upper_bound":"NjQzNS4yNA==","repeats":1},{"count":348000,"lower_bound":"NjQ0OS4xNw==","upper_bound":"NjUwOS4zOA==","repeats":1},{"count":350000,"lower_bound":"NjUxNi4wMw==","upper_bound":"NjU0NS4wMw==","repeats":1},{"count":352000,"lower_bound":"NjU4MC45NA==","upper_bound":"NjU5Ny41Mw==","repeats":1},{"count":354000,"lower_bound":"NjYwMS45OA==","upper_bound":"NjYwOC4yMg==","repeats":1},{"count":356000,"lower_bound":"NjYxNC40NA==","upper_bound":"NjYzOC44NQ==","repeats":1},{"count":358000,"lower_bound":"NjY2Mi42OA==","upper_bound":"NjcwNS4yOA==","repeats":1},{"count":360000,"lower_bound":"NjcwOC4wMg==","upper_bound":"Njc1MC4zOQ==","repeats":1},{"count":362000,"lower_bound":"Njc5MS41NA==","upper_bound":"NjgwNy45NQ==","repeats":1},{"count":364000,"lower_bound":"NjgyMi4zNw==","upper_bound":"Njg1Ni42Mw==","repeats":1},{"count":366000,"lower_bound":"Njg2Ni41MQ==","upper_bound":"Njg5OS4yMw==","repeats":1},{"count":368000,"lower_bound":"NjkwNC4y","upper_bound":"NjkzMS43Mg==","repeats":1},{"count":370000,"lower_bound":"NjkzMy41NQ==","upper_bound":"Njk2Ni44NA==","repeats":1},{"count":372000,"lower_bound":"Njk3Ni43MQ==","upper_bound":"NzAxOS42Ng==","repeats":1},{"count":374000,"lower_bound":"NzA0MS4zNA==","upper_bound":"NzA2MS40NA==","repeats":1},{"count":376000,"lower_bound":"NzA2My4y","upper_bound":"NzEyMS4wMw==","repeats":1},{"count":378000,"lower_bound":"NzEzOC4z","upper_bound":"NzE3OC4xNQ==","repeats":1},{"count":380000,"lower_bound":"NzE4Mi4yOQ==","upper_bound":"NzIwOC4y","repeats":1},{"count":382000,"lower_bound":"NzIxMy43OQ==","upper_bound":"NzIzMi4wMw==","repeats":1},{"count":384000,"lower_bound":"NzIzNC4xMg==","upper_bound":"NzI2OS40OQ==","repeats":1},{"count":386000,"lower_bound":"NzI3NC41Mg==","upper_bound":"NzI5OC4yMw==","repeats":1},{"count":388000,"lower_bound":"NzMwNS4xMg==","upper_bound":"NzMzOS40MQ==","repeats":1},{"count":390000,"lower_bound":"NzM0MC4wNA==","upper_bound":"NzM2Mi45NQ==","repeats":1},{"count":392000,"lower_bound":"NzM2OS4yNQ==","upper_bound":"NzQ4MS41Nw==","repeats":1},{"count":394000,"lower_bound":"NzQ4NS4wOA==","upper_bound":"NzUxMi45","repeats":1},{"count":396000,"lower_bound":"NzUxMi45NA==","upper_bound":"NzU0NC4wNg==","repeats":1},{"count":398000,"lower_bound":"NzU0NC45MQ==","upper_bound":"NzU4MS4yOQ==","repeats":1},{"count":400000,"lower_bound":"NzU4Ni40Mw==","upper_bound":"NzYyMy4yMw==","repeats":1},{"count":402000,"lower_bound":"NzYzOS42","upper_bound":"NzcxMi4zMw==","repeats":1},{"count":404000,"lower_bound":"NzcyNS4zNQ==","upper_bound":"NzczNS44NA==","repeats":1},{"count":406000,"lower_bound":"Nzc0My4yMg==","upper_bound":"Nzc0OC4xMw==","repeats":1},{"count":408000,"lower_bound":"Nzc1NC40OQ==","upper_bound":"Nzc3OC42Mg==","repeats":1},{"count":410000,"lower_bound":"Nzc4Mi4yMw==","upper_bound":"NzgzMC4xMw==","repeats":1},{"count":412000,"lower_bound":"NzgzMy40Nw==","upper_bound":"Nzg1MS43OA==","repeats":1},{"count":414000,"lower_bound":"Nzg2Mi41MQ==","upper_bound":"NzkwNS45Nw==","repeats":1},{"count":416000,"lower_bound":"NzkxOS44","upper_bound":"Nzk1Ny44Mg==","repeats":1},{"count":418000,"lower_bound":"Nzk2MS4xNA==","upper_bound":"Nzk3Ny4yMg==","repeats":1},{"count":420000,"lower_bound":"Nzk5OS4yNw==","upper_bound":"ODA3My4y","repeats":1},{"count":422000,"lower_bound":"ODA3OS4zNg==","upper_bound":"ODEwOC42NA==","repeats":1},{"count":424000,"lower_bound":"ODEyNS45OA==","upper_bound":"ODE0Mi41NQ==","repeats":1},{"count":426000,"lower_bound":"ODE1OS4wOQ==","upper_bound":"ODE4Ny40OQ==","repeats":1},{"count":428000,"lower_bound":"ODE4OC45MQ==","upper_bound":"ODIyMC41NA==","repeats":1},{"count":430000,"lower_bound":"ODIyNi42Ng==","upper_bound":"ODI1My41NQ==","repeats":1},{"count":432000,"lower_bound":"ODI2Ni40NQ==","upper_bound":"ODMwMy41OA==","repeats":1},{"count":434000,"lower_bound":"ODM5NS4yNQ==","upper_bound":"ODQxMS4zOA==","repeats":1},{"count":436000,"lower_bound":"ODQxOS4zNQ==","upper_bound":"ODQyMy43Mw==","repeats":1},{"count":438000,"lower_bound":"ODQ4OC4zNQ==","upper_bound":"ODUyMS43Mg==","repeats":1},{"count":440000,"lower_bound":"ODUyMy4xNA==","upper_bound":"ODU0OS42","repeats":1},{"count":442000,"lower_bound":"ODU1MC42OQ==","upper_bound":"ODU4MC44Mg==","repeats":1},{"count":444000,"lower_bound":"ODU5MC4yMw==","upper_bound":"ODYwMi4wOQ==","repeats":1},{"count":446000,"lower_bound":"ODYwNS43NA==","upper_bound":"ODYzMS4zOQ==","repeats":1},{"count":448000,"lower_bound":"ODY1Ni4wMg==","upper_bound":"ODY5Ni4xMQ==","repeats":1},{"count":450000,"lower_bound":"ODY5Ni40MQ==","upper_bound":"ODczMS4xNQ==","repeats":1},{"count":452000,"lower_bound":"ODczOC43NA==","upper_bound":"ODc4OC4xNw==","repeats":1},{"count":454000,"lower_bound":"ODgwNC41NQ==","upper_bound":"ODgzMC4xNA==","repeats":1},{"count":456000,"lower_bound":"ODgzMS4yMw==","upper_bound":"ODg5Mi42NQ==","repeats":1},{"count":458000,"lower_bound":"ODg5Ni42Mw==","upper_bound":"ODkzNS42MQ==","repeats":1},{"count":460000,"lower_bound":"ODk0MS41Nw==","upper_bound":"OTAxMS4yOQ==","repeats":1},{"count":462000,"lower_bound":"OTA0Ni44NA==","upper_bound":"OTA5NS45Mw==","repeats":1},{"count":464000,"lower_bound":"OTExNi42Mg==","upper_bound":"OTE5OS43OQ==","repeats":1},{"count":466000,"lower_bound":"OTIwMS40Mg==","upper_bound":"OTIzNy45Nw==","repeats":1},{"count":468000,"lower_bound":"OTI3My4wNg==","upper_bound":"OTI5NS4yNQ==","repeats":1},{"count":470000,"lower_bound":"OTMwOS4xMw==","upper_bound":"OTM1NC40OA==","repeats":1},{"count":472000,"lower_bound":"OTM1NS45Mw==","upper_bound":"OTM3MS42NQ==","repeats":1},{"count":474000,"lower_bound":"OTM4Ny4yNg==","upper_bound":"OTM5OS40Nw==","repeats":1},{"count":476000,"lower_bound":"OTQyMi41Mw==","upper_bound":"OTQ3OS4xOA==","repeats":1},{"count":478000,"lower_bound":"OTQ4My4xNw==","upper_bound":"OTUyNw==","repeats":1},{"count":480000,"lower_bound":"OTU1Ni4x","upper_bound":"OTU4Mi4yMQ==","repeats":1},{"count":482000,"lower_bound":"OTU5MS41Mw==","upper_bound":"OTYxMC44Ng==","repeats":1},{"count":484000,"lower_bound":"OTYyMS43Nw==","upper_bound":"OTY2NC44NQ==","repeats":1},{"count":486000,"lower_bound":"OTY3NC4zMQ==","upper_bound":"OTcwNi44OA==","repeats":1},{"count":488000,"lower_bound":"OTcxOS42OQ==","upper_bound":"OTc0OC45Ng==","repeats":1},{"count":490000,"lower_bound":"OTc1MS41OA==","upper_bound":"OTc3Mi43Mg==","repeats":1},{"count":492000,"lower_bound":"OTc3My44Mw==","upper_bound":"OTgwNS45Mw==","repeats":1},{"count":494000,"lower_bound":"OTgwNy40MQ==","upper_bound":"OTgzMS41Ng==","repeats":1},{"count":496000,"lower_bound":"OTgzNS4xMQ==","upper_bound":"OTg1MC41MQ==","repeats":1},{"count":498000,"lower_bound":"OTkwOS4wOA==","upper_bound":"OTkyNS4xNw==","repeats":1},{"count":500000,"lower_bound":"OTk0NS43NA==","upper_bound":"OTk5MC45Mg==","repeats":1}]},"cm_sketch":{"rows":[{"counters":[284,233,234,242,231,233,261,248,221,246,250,293,248,231,228,227,228,241,244,252,266,251,250,239,264,224,245,268,233,243,237,233,224,241,276,204,261,213,223,224,243,261,299,221,247,247,249,229,227,231,217,236,247,254,259,273,263,222,242,223,247,240,238,231,235,252,216,251,254,248,269,259,266,262,271,222,241,252,231,255,235,231,251,247,212,227,224,262,279,249,269,224,234,249,264,255,198,236,270,244,232,264,236,243,245,260,207,266,270,235,214,253,257,228,251,208,255,210,231,249,253,244,221,249,202,212,240,241,254,198,266,246,223,264,264,260,249,239,261,281,246,256,216,255,245,280,230,226,253,212,229,250,235,255,248,263,222,236,254,217,226,242,240,269,252,248,246,293,220,269,234,235,252,254,282,203,247,205,226,238,281,228,252,233,256,253,247,251,277,212,266,246,234,253,257,261,248,248,234,254,257,281,259,251,220,268,246,224,241,274,221,240,220,233,228,259,189,251,231,229,251,217,265,246,228,244,272,260,256,224,241,238,251,263,243,240,270,245,216,237,263,235,253,238,243,258,216,251,234,227,266,269,284,219,261,218,265,237,258,253,263,240,199,259,257,256,264,252,232,248,214,265,230,269,231,253,245,236,240,226,236,255,241,252,230,235,249,254,241,263,262,219,244,240,235,207,222,209,254,244,246,247,239,242,245,224,243,226,271,219,242,245,246,210,240,248,238,229,242,232,256,245,226,228,235,266,248,256,268,251,217,256,249,231,264,274,280,265,238,266,236,241,256,243,254,266,238,261,196,249,225,233,233,211,255,244,257,232,242,269,225,256,263,274,247,214,219,222,255,235,258,257,254,251,281,243,244,232,215,242,251,234,245,250,207,254,253,246,232,272,271,226,268,244,269,228,250,254,265,231,260,236,248,253,255,282,282,221,274,242,222,280,263,234,229,224,253,281,238,272,211,270,246,258,257,253,236,260,244,262,245,236,245,242,245,199,236,230,233,244,241,229,256,248,238,259,217,262,280,227,255,243,237,245,240,212,264,246,238,227,288,233,242,235,246,246,274,242,283,217,251,233,273,249,312,258,271,221,217,243,225,254,249,242,250,264,248,266,246,227,229,237,257,225,250,240,229,259,252,243,228,262,257,269,263,230,255,264,241,264,221,252,228,245,270,268,228,225,241,231,261,214,249,243,259,280,213,255,249,243,220,244,231,262,236,232,252,272,282,250,244,229,263,262,286,255,241,258,213,261,232,242,233,272,263,244,218,234,219,257,253,246,275,255,220,242,221,258,261,235,274,261,228,216,254,243,245,237,254,213,237,235,243,257,235,212,232,219,262,233,224,269,251,231,240,235,210,234,239,217,266,272,266,247,213,218,227,269,253,257,227,249,229,270,252,250,247,243,222,239,235,248,231,246,273,225,228,233,245,245,234,299,227,226,267,260,225,248,211,241,259,233,250,231,256,217,244,266,248,273,231,273,268,266,279,274,246,252,221,230,277,235,227,275,235,231,238,232,246,240,241,241,216,244,240,262,218,215,217,261,271,247,252,232,257,270,248,238,240,268,225,263,250,252,253,251,248,236,214,281,229,236,233,237,259,242,247,244,248,250,250,225,265,239,219,279,236,280,263,250,256,249,234,234,252,233,266,235,248,212,252,225,259,252,219,259,205,249,232,232,270,238,255,244,226,245,253,261,247,258,270,266,244,266,242,227,220,255,274,221,251,267,258,240,246,250,264,235,260,227,252,228,208,247,262,247,273,237,197,250,244,234,255,222,242,238,236,265,188,272,254,250,209,249,230,236,242,240,213,242,252,255,247,261,264,246,225,255,264,257,256,251,272,252,235,224,244,241,225,214,254,234,239,224,207,242,268,246,230,256,232,247,277,242,261,246,230,260,264,243,244,263,230,249,262,228,219,236,274,260,259,237,229,242,244,255,199,227,266,260,244,271,206,235,255,253,290,275,224,263,246,244,232,223,286,246,214,214,216,265,211,243,222,246,252,230,244,264,227,251,235,285,259,236,259,231,232,233,256,265,238,272,235,239,293,255,231,234,233,271,246,215,215,227,246,226,233,243,228,247,234,290,265,248,221,243,226,242,268,233,199,218,250,245,219,283,282,208,221,258,233,257,257,238,229,239,224,237,240,251,223,238,272,235,234,249,211,221,247,245,203,256,246,229,247,253,252,242,232,267,209,243,276,254,236,265,254,235,297,233,255,255,250,223,211,227,283,223,295,262,272,229,211,231,244,236,246,228,254,217,238,233,239,272,239,252,274,237,250,266,255,264,292,262,256,251,227,254,214,229,265,270,235,271,243,234,246,256,247,223,251,294,231,265,222,262,216,250,282,249,249,255,286,219,212,229,243,249,234,220,252,256,238,235,219,264,240,253,259,250,253,268,242,225,247,254,253,236,266,254,224,254,254,240,214,220,233,231,248,286,245,242,259,223,226,254,236,242,203,230,241,261,209,261,228,216,279,200,254,267,241,248,269,247,279,254,237,271,267,228,211,231,254,266,266,293,265,228,241,229,293,214,226,265,261,277,240,251,232,241,238,265,249,268,263,238,203,220,241,270,246,226,240,220,278,252,275,249,245,232,242,236,224,280,260,243,238,239,259,239,248,213,231,233,229,221,248,231,228,221,224,245,237,262,248,228,239,259,253,262,236,284,236,240,262,256,250,241,263,246,258,248,227,236,251,216,258,287,212,212,244,255,249,251,212,249,275,217,239,244,244,237,209,240,229,240,246,204,250,263,215,258,255,278,237,258,208,241,250,256,246,266,267,232,271,226,260,226,224,234,292,228,250,247,233,264,270,246,239,238,211,217,280,254,272,227,288,219,257,245,224,232,241,259,300,250,219,220,250,225,224,219,255,232,255,263,240,272,244,263,239,231,214,241,211,259,246,209,218,230,230,235,212,274,238,277,255,219,247,206,245,223,238,245,267,275,238,245,259,249,256,264,267,235,211,249,230,233,225,211,278,251,249,258,229,271,259,250,236,225,256,242,249,268,204,283,254,209,226,231,232,204,252,235,247,281,246,246,242,244,242,283,268,248,263,237,212,252,254,255,219,230,219,241,276,251,246,229,230,272,232,232,256,234,221,242,228,223,238,253,239,249,232,245,229,224,276,227,250,236,271,231,224,259,216,233,242,212,243,251,265,229,262,256,231,223,218,221,213,233,270,218,240,217,235,256,239,278,252,258,236,232,206,264,228,251,258,257,248,284,218,238,240,261,252,272,261,250,244,218,250,244,204,247,212,245,255,221,238,244,262,245,212,220,248,249,239,248,240,254,262,235,217,268,262,216,271,255,226,244,270,228,238,251,250,223,226,245,281,240,240,222,228,257,281,264,235,243,221,220,239,261,207,226,262,277,274,245,231,267,220,210,294,240,224,260,259,240,228,221,242,262,254,223,254,231,254,230,227,235,245,255,244,231,294,259,237,306,227,240,227,274,253,258,233,222,234,239,256,241,251,263,220,214,241,235,265,245,221,223,282,236,256,249,207,255,265,268,231,224,247,258,251,274,264,269,241,223,265,279,241,230,249,270,250,283,250,245,227,250,207,248,226,272,232,247,230,235,242,260,252,271,238,243,200,249,243,249,187,245,232,267,238,264,243,227,216,217,259,233,245,248,241,233,251,220,238,258,240,232,252,259,236,226,258,213,223,247,229,266,283,257,222,239,223,277,233,275,212,226,270,261,233,254,237,255,244,278,251,251,260,248,233,252,244,222,234,259,241,258,205,210,227,247,268,273,248,239,245,247,237,240,230,230,259,219,224,248,207,228,278,208,264,258,229,235,228,246,235,252,290,238,250,234,229,236,236,233,268,265,218,245,264,249,214,236,260,230,239,237,219,230,234,238,223,232,256,241,259,244,261,253,255,245,238,279,257,241,286,250,229,231,255,268,266,249,258,219,259,258,250,250,230,247,227,250,271,233,224,244,230,229,248,229,224,262,268,237,207,237,242,245,222,223,278,230,266,269,230,213,227,235,239,235,263,224,233,197,246,245,231,252,229,248,255,251,241,268,232,254,249,262,220,215,207,250,268,259,284,254,243,274,238,235,274,244,223,253,254,238,219,232,241,244,240,266,246,223,241,271,234,218,267,265,248,220,256,222,233,236,237,239,238,199,249,266,244,240,241,220,246,265,238,223,235,239,217,240,231,252,252,264,261,217,216,243,233,273,217,237,227,244,251,247,232,227,269,249,259,249,279,263,259,265,235,227,245,276,225,237,258,252,237,251,231,284,275,264,251,252,258,210,232,231,243,242,255,229,240,247,227,274,197,247,241,250,239,245,219,241,219,229,258,219,224,218,248,250,267,265,257,259,216,225,250,212,216,266,251,254,270,283,269,256,244,214,227,239,224,236,238,275,247,269,271,208,243,250,265,286,256,246,210,239,242,270,224,247,250,236,240,246,220,228,256,234,269,237,254,223,206,243,250,250,201,229,226,249,255,262,241,245,251,251,240,261,245,233,264,240,250,236,254,217,251,246,234,275,247,233,254,267,246,251,238,259,242,223,237,268,245,234,252,243,227,235,236,253,248,258,249,253,256,206,254,234,228,280,206,258,286,239,224,275,239,260,240,234,244,262,293,214,242,253,244,239,255,256]},{"counters":[248,249,256,250,234,255,229,217,231,225,246,266,237,234,225,231,236,220,244,255,282,224,227,263,229,246,261,280,211,292,236,266,251,235,250,253,235,274,238,244,247,234,255,225,243,218,214,256,233,267,208,252,224,283,215,239,237,245,237,238,262,223,256,245,229,230,229,221,245,230,246,212,209,226,232,218,213,231,311,293,236,248,280,224,225,236,227,197,264,216,236,220,252,264,259,204,240,258,226,214,283,232,204,208,219,216,232,267,270,255,242,246,246,226,252,244,202,243,254,262,232,262,248,231,242,184,268,258,226,265,267,250,255,246,219,222,236,235,255,261,236,240,250,243,237,248,202,254,276,216,243,228,257,222,240,250,253,269,276,260,256,240,249,266,261,260,230,244,226,240,232,259,239,265,222,235,238,220,226,271,263,269,232,221,261,278,214,230,243,242,266,240,225,282,275,256,252,238,246,242,252,259,237,263,251,256,231,254,233,258,269,221,250,260,258,271,250,231,271,222,241,252,237,238,241,252,273,257,257,243,248,234,263,230,247,274,238,232,216,268,255,245,226,266,266,251,261,230,256,238,260,237,258,272,279,248,221,208,245,241,235,225,250,249,205,249,263,254,275,291,226,254,238,278,245,250,263,255,242,243,242,225,234,244,251,236,246,239,250,237,258,273,234,237,260,244,243,244,250,242,224,266,248,232,217,249,221,244,242,234,268,242,271,248,232,235,252,230,250,238,243,243,232,256,266,258,231,256,243,240,252,241,254,245,211,238,237,241,228,259,264,241,226,224,251,231,235,253,220,281,215,246,212,222,223,279,245,224,237,223,263,219,234,221,232,202,246,257,238,222,250,238,272,229,243,245,232,225,223,240,224,265,221,188,246,224,249,243,240,215,258,230,248,205,196,257,217,250,208,262,218,274,236,277,253,281,246,237,261,243,280,233,274,236,237,280,220,234,226,278,244,227,257,253,233,241,295,266,252,232,259,238,253,246,246,222,227,251,274,233,215,234,234,227,244,254,217,214,225,214,237,258,259,275,226,237,234,232,237,265,277,212,240,259,250,251,272,258,263,251,222,229,243,231,233,265,226,273,255,232,234,254,271,222,226,267,242,258,229,250,230,244,238,252,272,239,237,262,259,231,282,247,244,230,235,236,255,262,251,271,257,225,221,242,249,251,282,211,220,256,242,256,225,239,253,249,255,221,201,222,264,239,268,251,229,215,258,218,211,229,252,285,237,248,240,269,238,238,261,263,248,276,247,214,298,223,250,250,245,218,251,252,248,231,270,222,238,225,239,246,224,225,263,218,233,227,257,233,250,230,255,262,236,256,298,253,238,238,260,250,226,240,268,221,265,231,230,240,213,236,274,258,247,214,223,232,260,258,255,235,268,257,227,228,252,274,250,252,231,249,201,232,231,218,273,232,252,236,252,267,228,236,249,211,250,258,259,248,230,236,255,263,260,255,230,260,218,252,255,238,228,272,254,239,269,233,239,254,255,277,250,219,263,242,243,263,237,261,236,211,263,243,244,302,235,249,277,236,264,246,241,232,244,287,252,260,277,250,217,235,229,221,207,230,224,218,221,205,236,256,234,247,234,266,270,226,304,247,260,222,247,240,250,250,225,252,270,241,209,243,242,249,234,258,242,228,241,254,234,219,212,269,265,277,231,264,270,250,263,251,231,228,225,273,246,228,219,220,244,231,255,221,245,265,278,229,267,244,243,237,250,238,254,266,233,252,209,205,245,209,273,216,215,247,218,256,246,227,216,230,284,248,252,268,236,267,257,251,213,226,245,261,251,203,248,247,230,274,235,253,230,241,234,254,220,270,265,256,226,239,225,228,236,245,268,235,265,231,236,229,234,213,245,236,216,248,247,295,230,221,254,255,235,246,253,239,260,223,236,225,223,261,217,231,223,249,273,247,246,250,248,238,235,280,246,229,224,225,251,242,233,226,269,250,242,247,206,226,246,260,230,211,252,261,220,207,263,243,273,257,240,244,247,253,249,248,252,266,237,251,239,226,236,245,212,277,239,262,241,249,220,224,247,218,198,253,223,212,248,230,221,260,258,268,234,231,245,246,258,217,234,253,250,246,258,251,245,242,246,240,241,245,250,217,255,265,240,252,233,231,272,250,303,298,217,252,245,257,257,253,227,214,215,235,242,262,239,209,257,250,237,267,279,250,240,248,236,284,235,274,254,277,201,237,228,269,203,238,210,256,223,242,249,233,200,270,244,234,246,250,248,270,227,244,237,269,227,217,239,243,230,226,233,250,278,263,229,244,238,268,251,256,243,232,205,274,243,216,243,256,239,242,250,238,260,255,251,249,256,246,249,243,259,230,218,228,244,251,245,259,214,238,212,266,253,249,245,245,263,249,239,240,229,266,252,229,219,253,244,291,207,231,266,251,217,299,252,238,274,265,214,218,232,230,232,235,249,238,236,253,222,252,236,274,245,227,260,246,277,224,254,264,233,230,246,256,253,260,229,259,226,249,225,253,267,234,236,234,304,261,271,256,232,258,223,266,278,224,249,267,226,233,260,232,263,246,246,235,245,283,218,238,253,257,228,253,256,234,222,212,259,228,272,247,249,223,261,235,235,274,254,234,230,226,240,235,243,279,258,230,231,251,269,247,262,250,228,232,220,230,227,239,275,226,248,206,253,215,270,237,239,250,232,237,260,249,240,253,255,227,241,268,235,226,244,238,272,271,269,233,255,236,249,229,239,250,256,239,234,239,285,207,259,224,243,227,234,226,230,238,256,240,197,261,262,289,212,224,262,243,209,251,252,187,261,222,252,223,243,228,277,227,242,235,236,219,216,220,266,255,233,237,269,241,258,218,254,273,227,279,278,259,257,239,279,214,225,240,233,267,267,240,257,252,230,230,244,253,240,236,253,237,233,257,242,226,248,265,257,268,231,257,249,248,225,234,233,254,230,216,236,213,248,243,230,225,234,235,240,204,262,233,230,243,243,257,219,229,246,264,221,238,224,255,242,244,241,234,233,252,246,232,284,233,245,219,254,243,274,217,251,261,275,233,227,232,248,261,245,233,233,233,235,242,254,224,229,258,237,230,256,233,271,265,265,247,222,250,241,240,241,273,252,246,237,275,257,226,252,256,269,238,260,262,262,232,275,269,243,267,248,222,231,266,238,242,251,209,279,230,265,259,246,242,246,254,227,258,250,235,240,205,246,234,245,269,247,254,213,238,248,248,253,226,228,238,236,229,235,259,225,250,232,223,263,230,257,225,226,256,267,251,248,217,260,255,268,245,251,273,244,268,248,271,247,269,238,293,259,226,268,243,250,258,231,226,229,245,251,234,230,233,275,247,205,257,237,234,240,280,203,263,269,233,240,235,232,278,211,245,248,230,224,196,264,217,239,283,216,256,231,263,257,233,220,231,217,256,301,216,232,234,224,293,249,254,247,250,254,239,273,204,224,266,232,220,273,255,237,289,222,248,232,241,216,232,249,229,261,225,273,258,232,249,251,239,265,237,232,231,245,210,244,249,229,236,244,272,247,242,253,261,241,217,243,218,262,256,233,217,224,223,243,249,247,262,241,249,233,262,229,241,252,214,225,248,251,243,274,236,210,254,235,237,309,234,283,261,236,256,288,211,221,229,226,267,199,249,262,300,283,235,277,283,240,275,257,261,297,202,255,254,210,232,244,214,212,266,213,265,254,236,232,253,243,214,286,277,268,253,268,268,238,247,243,313,254,270,232,264,211,255,236,241,289,251,240,274,297,231,256,257,244,254,253,208,228,275,260,249,237,230,257,235,257,236,260,243,254,270,234,253,217,212,234,236,250,264,255,247,249,241,221,248,221,298,248,254,274,239,278,273,230,235,266,267,247,225,238,255,267,227,243,258,255,266,248,230,259,239,260,273,246,244,266,257,245,251,222,233,224,233,230,260,259,241,249,261,234,265,240,265,224,227,232,214,239,246,220,245,248,207,233,236,228,261,266,229,219,268,212,239,253,286,205,250,238,239,237,249,242,250,252,229,245,235,243,241,230,241,246,275,211,228,255,279,268,231,253,260,235,229,248,282,273,226,253,244,248,206,254,257,228,276,261,269,259,213,234,242,247,233,255,235,231,247,231,239,230,246,238,255,270,216,269,245,259,241,260,234,274,237,225,276,215,227,217,254,228,244,231,264,228,241,279,275,260,247,256,219,294,262,228,230,228,231,240,262,242,216,217,246,249,253,254,268,215,276,238,252,235,209,240,239,280,263,245,232,254,242,244,234,266,238,222,239,239,236,285,250,231,276,262,262,263,219,248,271,254,252,271,248,250,228,264,280,241,252,226,253,229,231,255,227,190,256,245,243,284,232,232,248,217,254,244,253,276,234,258,275,213,267,227,250,235,256,259,238,276,218,226,227,214,238,238,245,252,236,271,236,217,278,215,246,252,236,285,258,236,221,278,235,243,270,254,268,282,257,218,255,220,271,223,253,225,232,250,238,255,262,251,234,220,239,234,264,254,223,226,242,263,241,249,246,265,288,215,250,241,255,288,248,244,198,222,238,244,224,227,225,279,264,265,211,252,239,287,203,244,218,243,235,228,213,234,243,232,249,266,249,225,257,248,235,233,265,240,252,227,257,229,263,260,247,243,257,236,239]},{"counters":[228,256,226,265,266,248,275,239,245,270,248,214,279,224,297,238,267,241,242,241,222,244,229,247,253,235,230,218,265,228,244,244,194,256,214,279,249,274,248,256,220,280,216,237,242,238,231,224,273,249,262,231,251,254,224,217,270,254,255,315,254,234,242,248,266,254,276,267,253,201,257,266,221,246,236,249,225,225,235,224,247,252,222,226,271,229,217,253,256,243,210,268,228,221,213,256,261,220,237,237,281,265,215,284,203,230,246,301,244,251,233,226,240,257,235,223,250,221,204,233,231,246,266,259,222,228,254,268,237,230,239,259,228,213,254,243,235,226,243,260,217,244,213,212,244,246,216,271,227,206,234,277,278,242,229,247,242,234,242,265,250,229,253,235,241,226,255,219,260,220,229,247,250,255,223,247,222,257,226,231,240,266,247,254,228,274,218,233,235,226,233,231,263,274,235,264,230,232,211,228,211,265,243,290,206,277,226,239,244,228,223,241,256,249,213,233,215,284,241,265,252,240,252,255,265,270,268,212,229,233,235,282,238,249,253,231,270,274,232,217,251,264,243,264,242,235,228,258,244,273,259,240,235,248,225,262,253,217,283,241,249,247,228,248,227,262,268,238,228,207,225,284,258,265,243,229,254,262,221,216,265,215,245,246,256,234,264,241,260,231,227,233,230,235,258,215,235,267,231,246,241,264,265,227,244,218,218,232,221,224,252,257,255,256,271,267,273,225,276,270,222,258,285,235,235,280,250,237,256,262,226,254,227,243,233,266,237,238,234,239,262,229,246,213,240,261,234,256,241,260,259,254,273,231,243,212,222,266,238,258,228,258,237,220,269,242,249,274,255,257,238,269,248,257,261,207,255,247,241,256,246,228,218,276,288,259,281,228,250,233,280,248,236,272,264,251,266,215,264,237,225,245,212,225,237,254,247,240,259,240,265,238,228,218,220,217,226,247,223,226,254,264,246,244,286,248,266,196,251,263,280,239,249,228,240,220,251,246,233,215,225,264,237,238,241,252,257,257,259,233,232,259,246,250,214,212,223,247,271,242,236,222,230,216,265,220,261,267,224,254,255,209,222,236,258,261,261,268,261,270,241,269,259,270,232,213,208,267,229,250,238,247,221,215,239,269,270,259,213,235,257,252,239,248,264,260,273,233,265,236,259,275,234,242,268,243,234,228,281,255,230,249,253,197,234,236,234,254,221,285,256,255,229,249,240,237,243,262,230,248,261,240,273,242,266,272,261,208,231,221,253,216,236,260,254,232,276,238,246,251,271,253,234,224,264,268,261,260,210,228,226,260,247,244,226,250,227,245,254,238,231,277,252,222,221,220,238,269,287,211,224,252,220,242,227,267,232,259,217,236,253,251,270,250,253,219,240,255,213,263,230,252,253,254,251,246,236,264,228,273,231,257,289,258,232,241,234,266,260,246,231,251,244,257,276,217,222,252,222,209,206,216,284,231,241,251,263,270,247,254,253,243,249,249,258,248,252,261,249,247,275,260,231,242,264,256,244,257,248,282,249,218,245,280,238,232,257,272,243,222,254,226,223,278,244,280,256,264,230,231,218,265,238,227,252,251,254,205,232,200,250,239,260,255,237,241,233,243,248,232,222,249,251,212,225,247,247,249,209,206,250,216,266,301,245,213,227,210,234,257,245,297,258,249,252,250,235,250,247,240,246,244,274,234,261,256,258,249,249,243,258,228,259,243,228,226,252,233,247,280,252,257,210,243,231,240,294,206,255,241,274,208,249,252,214,223,230,255,270,259,261,223,270,288,256,227,240,300,255,250,229,263,258,223,209,243,276,253,257,273,228,231,294,275,253,246,200,238,267,234,236,251,239,237,244,264,257,236,204,217,243,291,243,257,225,240,272,249,272,201,249,219,258,228,218,244,239,201,226,268,241,243,260,234,255,239,255,259,261,246,242,236,275,251,213,227,243,250,232,241,237,230,265,225,274,235,250,231,238,236,195,246,280,248,246,249,246,222,266,251,236,256,229,265,252,223,228,238,271,255,225,265,272,238,255,226,285,225,233,269,256,225,248,255,229,230,242,230,265,255,282,255,246,215,239,240,220,255,242,265,296,263,264,221,244,224,204,226,215,256,255,229,246,259,270,246,225,253,245,246,279,246,260,235,239,213,261,282,239,242,267,231,267,232,225,217,247,222,252,289,225,252,240,241,244,228,250,273,267,253,252,257,238,236,259,234,236,304,241,259,230,213,230,268,207,241,240,252,234,238,260,244,247,301,244,248,221,242,259,258,210,242,238,224,240,267,237,237,266,252,250,222,248,257,219,238,273,267,257,238,255,227,263,233,238,247,245,234,220,228,222,260,225,254,261,232,222,236,223,263,238,255,260,199,224,249,256,228,224,220,249,246,254,281,245,259,240,253,272,244,248,243,270,253,239,229,264,250,216,238,245,248,236,227,245,270,263,295,246,252,253,272,233,246,231,239,214,272,227,266,217,238,232,249,229,232,264,253,218,219,263,248,232,229,230,243,233,229,241,227,247,228,236,224,235,245,259,236,214,225,210,256,250,203,246,279,239,219,243,263,248,272,237,248,231,277,242,275,245,255,272,246,245,224,236,278,227,254,226,244,249,233,250,233,215,219,240,270,264,242,206,242,255,218,255,239,222,258,249,230,264,267,248,239,264,226,230,217,292,225,211,262,231,253,235,222,236,254,236,237,219,236,268,293,239,238,249,256,240,259,262,231,194,227,230,219,231,250,263,251,244,258,247,221,253,247,276,254,245,257,240,227,290,278,256,252,247,241,218,258,243,235,238,260,213,221,226,247,212,201,272,259,224,209,265,225,192,264,238,240,256,263,243,246,232,231,245,242,259,223,247,231,249,221,272,226,245,246,265,227,239,264,215,219,246,282,265,233,258,244,246,257,245,234,228,232,229,265,252,226,237,246,260,206,262,223,240,261,241,263,223,269,220,237,269,256,238,260,252,215,261,266,246,256,248,239,305,243,268,252,260,252,245,244,302,222,216,243,230,237,235,221,229,270,225,263,237,256,257,253,252,230,249,226,268,267,277,274,260,235,254,195,194,214,224,274,231,218,260,241,210,273,252,248,228,250,255,231,267,224,218,260,232,250,286,249,260,220,218,233,281,246,230,265,234,207,259,236,257,250,236,243,228,221,253,245,223,230,259,233,248,219,267,274,250,227,226,229,259,236,289,223,263,244,214,254,237,288,300,264,250,258,255,288,244,239,239,240,252,235,244,227,257,235,244,225,244,214,240,230,226,271,229,266,250,237,286,263,234,232,223,243,229,255,250,232,250,244,236,232,268,248,264,230,197,240,213,234,240,239,251,232,233,240,283,244,273,252,247,253,265,249,228,259,222,218,264,264,254,228,263,270,260,245,260,253,239,258,240,273,216,226,244,222,222,262,244,223,251,267,237,230,251,243,240,245,231,275,255,270,234,252,244,242,235,219,227,209,223,254,232,247,274,275,245,244,260,234,224,263,251,266,240,273,238,242,266,279,237,266,241,191,242,244,227,223,191,265,217,269,282,246,266,233,241,238,252,274,238,235,230,254,228,268,237,249,259,238,238,249,256,208,244,241,247,228,223,249,220,244,246,250,238,233,264,228,261,251,267,239,215,218,244,244,231,274,258,228,237,225,236,239,256,213,258,244,192,260,241,228,239,233,266,241,228,252,238,214,245,254,255,247,248,253,288,234,294,210,231,248,255,270,255,239,238,236,226,232,250,226,245,247,228,285,233,263,251,228,242,232,249,219,255,265,215,273,219,233,262,234,231,247,251,239,273,254,229,234,277,237,229,257,221,261,215,244,250,253,262,252,229,265,239,259,248,252,228,287,240,215,225,233,255,245,245,211,238,237,265,226,245,271,214,218,233,224,266,237,221,243,240,253,247,261,233,218,264,238,224,227,241,234,249,225,235,260,222,225,250,258,238,238,238,272,221,270,263,259,248,235,253,249,225,301,222,248,230,259,292,237,241,231,252,229,245,225,256,240,214,233,232,219,240,246,232,231,235,269,238,228,255,233,253,246,225,250,227,231,231,270,249,221,245,221,225,238,243,238,273,281,262,236,238,235,269,252,272,284,223,274,230,275,239,239,265,240,243,264,248,253,210,249,235,228,256,255,260,254,252,241,249,228,207,234,252,253,213,262,249,241,249,281,244,263,237,232,239,241,261,274,227,238,260,264,242,252,222,242,257,215,257,255,236,273,251,248,217,251,242,231,240,222,249,239,268,247,262,247,255,260,239,247,284,226,219,233,267,235,234,224,233,245,202,236,237,228,223,234,241,249,248,243,248,230,224,247,245,224,261,221,236,262,232,248,248,257,248,262,241,235,274,221,237,264,226,261,274,238,248,268,257,208,221,221,229,253,268,237,254,266,255,201,282,256,266,267,236,247,265,260,262,250,256,243,234,259,251,263,241,255,198,260,248,275,236,253,267,277,196,249,266,261,282,227,251,243,249,253,226,243,266,260,218,283,237,203,221,250,210,263,227,200,237,205,224,292,235,245,263,268,233,271,236,233,239,249,224,220,242,235,217,230,229,247,242,248,216,256,215,255,229,251,216,229,226,225,194,254,263,259,242,228,216,245,268,230,238,256,229,236,235,248,230,242,248,238,214,275]},{"counters":[255,253,256,267,214,243,267,237,252,228,224,234,246,219,250,258,225,246,253,228,257,265,226,258,247,246,233,278,268,232,214,245,212,249,265,221,252,219,245,241,221,248,253,205,224,221,219,242,225,212,241,240,238,233,250,257,235,244,225,237,264,233,236,248,221,205,268,246,210,245,261,228,252,241,266,256,230,220,239,259,242,240,245,213,235,230,209,249,229,234,256,237,251,263,276,256,226,259,251,270,265,252,206,255,229,245,250,255,257,275,230,246,240,248,234,218,237,262,227,228,232,244,228,254,251,192,247,261,268,235,226,240,241,264,271,239,224,243,275,227,245,249,257,248,259,248,258,255,216,240,262,268,238,268,232,269,263,253,261,272,261,259,250,254,227,214,271,267,226,253,238,270,229,230,218,240,243,254,254,229,258,250,256,248,226,276,255,271,223,263,242,217,235,240,250,230,223,256,237,213,243,245,253,207,274,282,266,253,260,279,276,227,248,207,207,257,236,237,256,269,233,228,237,238,259,258,225,214,251,257,267,254,254,241,230,226,246,262,256,241,252,241,252,243,252,227,246,299,251,243,270,245,202,259,219,251,269,217,207,290,251,244,227,216,266,287,247,267,224,241,228,267,198,233,275,258,229,226,269,225,239,222,233,240,233,216,258,242,232,238,262,235,254,279,237,242,222,267,231,235,268,230,255,251,263,269,236,270,254,288,258,243,263,269,247,233,228,238,239,227,251,231,231,245,282,255,214,258,226,243,238,244,252,235,297,225,233,259,247,279,251,198,250,243,254,239,300,236,252,208,247,230,244,226,268,273,216,229,252,258,276,233,266,246,254,242,263,255,234,232,238,212,265,240,252,220,237,251,216,221,239,265,264,284,216,235,236,255,230,286,228,273,278,286,262,231,289,262,259,262,230,243,228,231,221,242,262,262,263,244,244,246,250,225,252,221,227,261,216,272,241,245,253,215,267,249,237,217,228,244,265,262,230,267,227,197,273,264,257,239,262,226,257,228,243,238,260,251,269,242,253,251,220,253,271,253,249,256,235,224,252,230,250,237,238,244,243,224,263,242,243,251,253,255,255,250,242,259,226,273,257,267,232,250,245,240,210,221,229,248,246,200,249,247,253,271,224,228,220,247,267,257,245,282,247,231,232,227,248,242,236,242,259,266,240,238,219,251,218,289,222,218,243,271,247,231,246,254,251,240,262,222,217,266,233,245,249,268,231,237,235,249,278,231,252,266,254,250,251,250,270,225,237,263,209,244,267,230,239,274,238,265,241,296,240,261,224,274,238,238,218,271,225,221,221,237,201,236,249,239,242,261,261,265,230,267,222,261,266,249,235,216,223,239,256,207,226,232,267,257,224,259,230,230,231,236,256,258,220,254,223,242,249,266,231,243,232,254,274,253,250,223,272,239,252,245,251,238,224,244,221,227,213,229,268,230,249,226,232,259,270,263,242,247,269,281,236,266,243,239,237,251,234,248,244,252,207,282,291,232,256,222,241,303,240,231,244,264,245,272,258,276,265,245,273,215,267,257,226,238,264,220,207,244,240,252,247,221,263,231,214,233,231,269,196,277,254,256,262,246,246,281,249,267,246,245,212,244,218,233,262,242,259,235,249,279,293,253,256,212,254,232,247,258,220,266,270,252,231,239,242,244,263,228,258,246,282,207,276,250,264,249,207,298,257,242,255,230,224,224,234,246,228,261,270,260,227,247,240,236,250,258,248,249,275,261,228,226,271,235,258,244,257,277,213,249,254,241,274,257,278,235,246,241,240,224,234,241,260,241,219,250,297,231,248,242,235,256,268,236,237,262,237,241,238,252,230,261,258,271,276,215,253,225,247,252,202,240,242,227,260,246,273,258,238,245,240,279,228,271,234,263,243,263,237,225,250,222,232,293,218,229,254,264,237,235,251,269,247,237,257,228,241,237,268,243,224,232,243,220,235,229,264,242,263,252,251,245,250,227,234,254,261,262,262,259,245,224,258,240,244,228,250,235,231,292,276,255,246,223,242,215,234,252,253,275,270,255,269,239,276,261,260,241,250,268,248,268,259,259,261,264,264,243,235,241,248,262,229,247,242,231,260,253,234,257,250,262,243,231,243,211,252,267,235,234,215,237,248,246,242,245,262,222,249,287,242,271,229,245,273,248,230,218,225,218,290,224,263,230,238,254,221,259,259,281,247,254,252,245,249,227,243,237,228,245,246,258,242,234,233,262,246,252,226,239,267,221,290,195,258,222,270,227,245,217,238,241,245,273,249,210,250,253,214,238,205,241,267,237,230,276,291,241,270,273,262,225,257,258,233,257,206,190,215,254,246,253,213,251,194,235,265,234,253,263,291,249,248,218,247,208,272,268,276,235,219,253,249,233,234,226,249,215,239,248,252,243,284,235,232,242,255,256,241,249,226,255,211,228,231,230,246,231,254,231,225,233,247,274,204,245,247,241,255,237,219,269,205,248,224,236,234,262,236,241,238,261,255,272,228,244,243,244,238,267,248,244,239,219,228,218,249,272,218,226,261,236,272,223,247,217,228,242,233,280,237,238,232,274,231,262,208,252,234,197,244,219,252,238,222,238,246,231,248,253,233,276,216,231,254,244,295,268,240,231,244,242,230,246,268,221,256,229,249,184,208,220,232,253,230,231,227,250,249,229,235,243,241,245,208,227,245,233,228,248,263,209,252,237,237,238,255,263,235,217,243,264,243,268,259,238,237,246,223,232,276,216,270,251,270,272,220,235,278,233,216,260,209,248,239,246,288,229,196,241,208,248,245,217,244,248,236,243,265,245,242,236,233,233,262,252,220,262,256,252,233,225,235,237,255,235,276,240,242,248,258,218,259,249,246,264,225,244,218,252,252,257,253,225,254,239,218,251,245,271,249,227,252,233,242,220,252,234,234,267,237,247,245,252,220,232,248,235,241,230,248,246,239,242,217,254,259,231,248,275,232,255,243,253,273,231,222,270,259,264,270,243,224,236,241,229,234,228,242,241,258,278,252,267,228,228,246,274,253,274,260,228,218,219,228,265,248,236,237,272,245,255,228,248,228,243,252,209,236,239,265,241,236,251,248,259,223,231,230,253,254,232,258,287,215,260,229,252,241,233,266,265,224,251,265,220,247,243,254,215,206,241,242,219,242,228,235,219,244,250,248,226,227,254,250,251,252,233,250,218,243,262,252,232,236,258,242,233,237,232,237,246,230,241,236,261,216,265,239,247,250,269,233,237,236,233,239,257,253,256,229,223,230,271,229,246,246,222,239,268,233,264,269,273,261,240,230,269,233,231,205,253,243,231,205,291,243,223,244,202,251,241,227,231,248,249,245,245,235,254,239,252,269,241,269,246,267,251,265,234,265,215,241,231,277,257,260,250,243,263,242,233,234,227,258,232,243,244,234,203,230,230,246,225,251,250,259,239,206,255,218,218,218,265,248,244,223,239,212,273,240,203,236,254,263,229,244,252,256,199,221,227,246,227,248,252,238,231,239,249,198,244,238,216,220,252,233,208,244,212,249,223,228,236,248,263,203,273,243,234,259,292,229,224,237,257,268,272,265,239,266,256,277,282,265,248,262,226,247,234,235,239,259,236,262,233,257,263,254,249,290,263,221,257,253,227,252,217,252,244,252,242,248,255,267,249,258,219,236,250,219,216,257,211,242,223,244,238,214,221,276,244,249,203,214,230,175,231,215,261,255,280,274,262,256,279,196,238,224,227,227,246,266,256,258,237,204,252,240,232,256,255,262,220,222,262,261,277,242,261,257,243,266,287,208,243,227,264,227,216,240,222,242,250,280,259,254,227,267,247,263,236,234,223,247,232,237,226,220,255,235,252,238,259,278,238,237,225,268,267,245,234,240,257,251,227,270,208,248,220,258,257,246,274,253,241,234,247,213,244,273,228,238,255,217,233,269,263,229,228,224,273,236,230,268,262,222,280,225,243,237,227,253,262,208,219,232,226,262,275,249,226,245,244,212,216,220,263,241,234,245,216,243,237,231,249,215,252,265,221,256,237,223,225,242,296,256,249,233,220,248,215,247,210,243,232,219,236,226,239,241,271,234,231,260,260,255,255,239,236,241,254,207,236,217,243,263,253,244,242,235,214,243,231,251,243,288,228,269,259,251,213,237,250,232,263,221,227,297,227,257,252,246,236,218,250,249,237,252,249,277,221,242,251,231,237,252,233,220,245,247,250,275,230,271,273,273,256,255,232,222,245,210,238,258,249,258,262,241,239,258,211,258,244,244,249,245,233,248,228,271,267,217,234,247,252,240,266,254,240,274,225,247,225,257,230,246,252,234,227,262,285,238,237,258,224,250,248,241,238,236,219,233,233,230,236,225,242,255,255,256,262,232,267,280,233,224,285,255,240,260,279,249,244,238,224,238,218,235,275,257,243,277,247,225,240,268,224,228,251,246,258,242,219,243,224,228,249,270,248,236,248,237,242,253,258,250,238,227,227,230,218,287,244,198,246,247,256,265,254,224,215,229,290,223,239,220,234,237,242,259,274,255,272,242,245,233,277,285,206,249,282,204,235,262,258,256,263,249,264,223,251,244,225,244,250,225,291,258,236,256,230,217,235,274,240,219,241,286,236,244,252,266,265,223,236,242,258,264,218,225,243]},{"counters":[250,261,205,246,215,255,236,239,250,260,247,217,236,221,268,232,234,249,263,247,213,209,230,250,230,272,266,256,223,244,217,260,240,225,267,218,228,215,267,236,239,252,236,240,227,241,233,284,246,257,215,241,240,262,241,215,227,226,253,228,230,250,246,247,271,272,261,250,269,265,228,247,232,209,251,248,237,247,260,226,228,252,239,244,253,236,214,242,237,229,246,269,237,256,265,258,237,251,272,243,285,237,301,248,227,257,281,279,187,234,240,254,241,235,214,225,236,264,258,211,218,234,267,249,249,255,256,241,220,238,247,294,233,254,274,232,212,249,266,222,241,263,228,256,246,221,229,212,226,269,240,229,251,230,253,236,223,258,240,200,257,230,248,227,247,248,239,259,228,256,263,238,270,271,233,253,257,249,255,236,225,273,226,268,257,250,243,218,231,235,224,298,228,268,247,268,240,234,258,240,220,242,251,258,228,273,254,266,269,264,249,245,242,218,262,238,232,249,259,243,208,237,270,232,222,234,223,236,246,246,219,253,246,216,217,260,260,248,224,253,268,270,258,241,254,265,243,203,233,207,225,227,238,225,234,242,241,285,225,205,231,261,256,205,208,248,252,252,232,236,250,253,250,227,251,266,240,242,217,264,227,212,238,245,265,246,249,231,215,237,270,220,261,225,259,210,262,221,248,259,258,251,256,253,245,249,204,229,261,245,214,238,289,229,274,235,234,242,245,256,245,262,237,246,280,231,228,238,272,230,218,241,230,204,271,259,234,219,267,225,250,259,242,280,219,226,221,250,234,265,207,262,273,240,232,231,226,219,216,218,252,293,237,257,291,217,248,275,253,219,212,210,237,240,263,235,253,254,228,260,275,245,284,251,236,275,255,222,255,235,247,263,238,270,276,237,262,245,226,247,265,257,247,257,251,264,270,216,286,235,229,217,225,252,201,247,222,250,254,245,240,241,263,222,240,276,252,235,253,253,229,222,226,207,222,242,249,255,262,250,228,199,252,216,252,276,235,281,286,261,261,298,244,263,247,243,255,266,243,261,242,249,255,240,246,241,261,258,250,232,268,216,252,232,234,229,237,229,247,267,259,252,238,255,241,266,247,239,260,231,288,260,212,220,252,230,246,229,232,262,265,263,275,230,267,237,249,240,248,256,207,230,226,253,269,241,275,246,252,221,262,253,244,234,229,260,266,242,232,260,249,225,236,224,274,258,258,247,227,259,275,229,268,231,257,253,262,251,240,254,275,243,210,265,226,221,227,256,275,221,308,262,243,260,261,237,216,223,265,231,236,279,275,269,266,231,236,235,212,265,255,279,228,208,267,242,245,214,261,248,263,250,285,239,251,272,257,223,242,276,235,208,213,220,249,239,244,255,231,228,190,240,220,253,234,242,224,233,246,247,262,225,239,243,241,240,251,246,254,204,229,215,219,230,234,256,236,229,224,246,238,246,246,242,256,245,229,209,231,237,271,240,218,259,221,261,259,229,240,269,253,235,242,229,262,251,231,241,208,233,272,243,247,265,249,272,243,234,225,246,288,235,244,273,279,256,242,227,226,274,202,228,263,235,248,215,227,239,249,215,240,258,261,254,240,256,257,212,246,265,249,262,237,244,237,227,255,262,251,270,228,261,246,238,230,249,252,225,225,258,215,224,225,259,276,249,222,238,273,213,235,250,241,183,247,268,263,254,234,246,252,226,188,229,215,243,245,266,263,243,229,237,246,278,236,232,212,248,269,232,265,270,259,233,258,255,231,227,269,245,240,268,281,247,246,205,252,247,217,225,235,267,254,236,259,256,230,249,280,296,242,260,263,249,253,212,248,207,233,256,228,219,224,207,242,233,221,229,266,257,237,231,279,218,242,255,258,233,236,249,250,211,231,243,250,258,239,254,219,255,232,236,238,247,225,272,261,215,270,224,220,275,246,225,235,244,220,219,247,258,265,250,257,247,246,257,203,249,256,218,236,246,255,270,237,268,247,225,227,259,255,237,236,273,263,215,243,234,239,260,247,238,218,217,270,256,240,229,250,261,238,212,273,232,250,258,250,214,253,241,246,241,256,233,225,225,247,227,219,265,256,241,263,231,233,256,226,302,248,244,251,254,209,240,248,245,211,279,240,273,246,227,239,252,244,261,232,266,252,249,238,216,243,239,211,193,229,212,297,257,236,218,228,273,239,250,229,253,218,272,272,230,269,241,261,240,235,208,254,237,235,239,251,285,246,261,229,246,255,295,250,254,258,216,231,254,235,269,225,227,238,248,217,262,247,225,253,246,213,223,244,249,222,252,231,260,263,253,214,237,213,231,248,213,214,209,245,264,225,251,254,272,208,261,260,248,282,294,233,248,223,236,238,238,224,226,196,218,252,275,255,252,280,241,215,247,267,250,239,298,240,249,232,267,245,206,263,261,242,263,241,264,259,251,242,212,195,232,243,226,276,224,240,284,277,230,260,225,242,216,267,262,245,224,271,224,262,275,211,234,247,249,244,259,231,288,269,235,281,268,245,260,255,246,229,241,235,256,259,233,235,225,232,245,280,206,212,227,246,265,210,269,254,252,228,237,229,273,231,234,256,219,240,230,209,247,251,293,272,250,234,228,227,272,248,266,248,259,250,240,256,267,250,226,241,209,236,253,234,266,224,286,267,233,286,256,227,245,245,233,286,248,222,244,242,236,247,228,248,233,210,238,259,264,241,254,223,271,234,245,273,235,251,261,225,220,211,250,256,271,263,245,206,233,276,222,240,260,215,232,239,232,267,247,234,241,244,291,213,260,243,243,269,249,233,253,242,262,222,204,237,206,221,238,248,257,250,255,249,266,232,271,225,231,221,224,243,275,238,251,226,248,214,256,221,253,226,234,271,270,222,257,203,240,245,250,207,212,255,214,294,237,224,219,232,251,255,254,239,228,245,256,241,235,217,284,230,247,277,268,252,228,251,229,262,258,239,270,258,246,227,265,279,247,249,237,257,291,240,207,272,264,223,229,240,232,236,278,227,211,273,238,234,215,246,267,232,247,219,218,247,265,252,230,252,245,264,254,256,249,228,265,250,274,200,253,260,224,236,269,266,244,233,223,273,247,250,255,235,268,244,232,228,234,239,234,253,260,252,238,263,278,242,267,270,233,234,205,247,236,270,231,252,247,218,199,234,225,235,262,203,245,227,258,274,255,242,263,222,252,276,257,271,246,204,259,234,230,244,248,229,262,251,259,263,249,243,227,244,235,221,239,244,200,249,234,229,243,255,217,247,198,230,251,228,271,215,260,221,250,233,245,251,237,238,227,211,259,237,256,213,224,232,232,252,252,247,248,272,237,270,218,228,259,230,211,267,226,226,236,274,270,269,275,206,227,223,249,248,235,234,235,244,261,242,233,269,249,258,251,241,204,253,277,242,269,234,212,228,245,273,201,244,241,253,245,228,269,247,233,234,267,278,214,244,203,194,256,251,248,255,220,255,234,231,232,262,248,248,255,240,256,263,238,232,247,209,255,229,246,234,246,258,245,269,272,249,229,247,256,225,265,263,255,266,245,219,273,246,242,255,276,232,222,244,258,241,228,224,258,252,260,236,266,249,246,246,271,253,233,224,285,249,240,227,241,258,236,228,207,232,235,221,282,245,228,267,262,217,219,244,218,249,261,259,224,272,226,232,253,228,269,247,236,243,213,222,217,226,244,227,260,240,271,241,255,242,241,262,249,253,268,248,236,259,229,236,234,261,283,245,273,239,237,205,271,271,263,243,238,236,259,253,235,250,246,220,229,252,256,212,254,230,234,229,255,241,231,243,256,220,217,264,253,227,279,247,232,239,233,233,282,253,239,244,284,234,244,223,244,213,246,228,255,226,260,249,229,264,255,227,277,233,255,223,267,252,228,233,258,239,238,275,230,259,249,271,248,277,267,256,226,266,220,230,262,254,232,261,234,248,256,227,279,233,242,233,253,239,275,237,240,251,239,244,261,240,280,253,238,284,247,266,240,207,242,232,267,233,254,232,242,274,241,252,231,269,205,220,246,272,238,260,252,229,264,249,243,286,220,261,270,251,257,229,252,271,250,268,239,246,266,213,270,249,221,275,243,265,254,220,249,256,236,249,236,231,229,241,244,240,254,242,263,233,271,212,219,226,222,216,237,236,248,276,234,233,226,249,244,248,228,255,245,239,215,243,246,238,236,250,275,239,263,239,280,249,228,243,223,193,259,250,272,269,245,229,244,249,233,254,252,216,275,255,235,241,264,255,218,225,276,230,271,234,241,234,256,254,223,245,241,264,258,236,288,225,237,239,259,272,244,253,257,231,203,250,265,219,265,285,279,261,247,252,230,252,235,246,255,266,252,266,237,241,254,269,269,277,215,258,227,253,236,217,225,258,265,209,230,241,235,236,224,263,222,249,195,252,269,263,212,225,225,246,235,235,250,263,260,231,255,223,224,237,250,232,226,235,262,235,243,266,249,223,273,231,217,244,243,250,248,230,233,263,232,247,256,264,259,243,260,258,269,255,258,268,210,229,254,238,243,249,284,231,277,259,254,308,225,233,238,291,244,266,220,265,213,250,233,230,224,247,241,219,271,242,243,202,212,216,261,230,225,298,217,235,246,218,283,247,232,245,269,260,241,254,262]}]},"null_count":0,"tot_col_size":4500000,"last_update_version":401695316759019521},"s_address":{"histogram":{"ndv":498496,"buckets":[{"count":2000,"lower_bound":"IDUwZmZVY092SEsgWVppLGlScmsxNU5mdGsyMkRyIDdISkl1cA==","upper_bound":"IEE1UHdaZ2FDZWF4RlRkaXlDQXJocXFNT2lkQ2VRQW9lcWdDU2tTbQ==","repeats":1},{"count":4000,"lower_bound":"IEJBeGJpY0xweA==","upper_bound":"IEx6NXU0UXlNNSxRcU1sTXNsMEFiZE4wV3ZVdzBiVGJrLE9jMw==","repeats":1},{"count":6000,"lower_bound":"IFVQMWtyLFBGR0x4VjFYUFROTHEwZ3kz","upper_bound":"IGpXNWp3T2FwVVlhcSAwM25Ma3BjMg==","repeats":1},{"count":8000,"lower_bound":"IGx5eDVaRGEwRkY0Y0ZoeWlwOHVYbA==","upper_bound":"IHlTMjVIdmg3UDgwbTN5c1NVNnNzZ2M2cA==","repeats":1},{"count":10000,"lower_bound":"LDFCanRXWGZENFJIM1FBZXpQdWczZ2JWZDR0eHdEZ2w=","upper_bound":"LEVRTjFOdnlEZFJvNFdnMkVrWTdYbHZTVFg=","repeats":1},{"count":12000,"lower_bound":"LEZSQSBTYWZUZ1JnR253MWtqeUV5IEhZSnU=","upper_bound":"LEhERGlsU1dvSWsyWGdLU0syNjlUeiBXaENEN1pOMyxUNm4=","repeats":1},{"count":14000,"lower_bound":"LEwxcEY0NEJ1aTNwT3R3OXlR","upper_bound":"LFRkRjRtR0dBRnZOMk1kUjNtamFzRDc2dXhiYlpv","repeats":1},{"count":16000,"lower_bound":"LFY1U2E1NjFQOUFvdmJXbmZJdTYx","upper_bound":"LFpFUkMgdG9iMk9tUzRX","repeats":1},{"count":18000,"lower_bound":"LGRxTlBwNGUzeU8zeXpXRlVnNUxY","upper_bound":"LGhuRm9IQk43dGhBY1ZESHdiWmEybU8wZnIscUdyRVkxWUM=","repeats":1},{"count":20000,"lower_bound":"LHJXIDR2M0xQWThWd1NDb3AseXpZS3RSVWhI","upper_bound":"LHhMREV4VUd3ZUF6YkRFRnJHTlJxc0VHUnNwd2cwLDFQR0o=","repeats":1},{"count":22000,"lower_bound":"MENqZFpsSUJvb3lrOHRBWk40UDQ0V3duN1l2TjZMaER5UzZhag==","upper_bound":"MGhOZExEUmRiUFBCMXpJUldSVjhDSXBMb1k4bExlOUJ3LFFZTCw=","repeats":1},{"count":24000,"lower_bound":"MGpmNSBLRzVQcjdSczBjalYxbmF5QU5SQTZldHVuZU9zYix6c2NUbg==","upper_bound":"MTJBdlVaM05RalVMSElnciBuNmhmZXNudmQydA==","repeats":1},{"count":26000,"lower_bound":"MTJuTHJnYWhMVFV3cUZibklNb0tYZ1pBanV4Zw==","upper_bound":"MUtPQ0FjUlgyVTNXVVRRNlgwT05oSXlXTg==","repeats":1},{"count":28000,"lower_bound":"MU1WVHA4SHFnTm85U2dR","upper_bound":"MVlVUEJadDV2Zmd4LGtIcDhQ","repeats":1},{"count":30000,"lower_bound":"MWEyNUNjbWhVcVVwbVZRS0tCaEppVzBtaGdrZWQ=","upper_bound":"MWZuLEFZbUFKeVBJR2tTVXdiIA==","repeats":1},{"count":32000,"lower_bound":"MWp5WWpoaEpVNDhlUkFpclJPMQ==","upper_bound":"MXBIeVJWWnFTZ0ZnWGVh","repeats":1},{"count":34000,"lower_bound":"MXRMc1ViIGpUSg==","upper_bound":"MiB4NDY1ZlU5ZXYwemw4SXFpc2lGWnVEMkk5bXZs","repeats":1},{"count":36000,"lower_bound":"Mixza21KZ0c3bE0=","upper_bound":"MkJtZUxTUnNmOWJROA==","repeats":1},{"count":38000,"lower_bound":"MkJ3eEx1U3lSS2E2a1pzZiByZkxQWjdnIE1nLHY2VVk5dVZxVHJi","upper_bound":"MkdGN0YyRjduM1BSSHJIekVJd3VEeFRP","repeats":1},{"count":40000,"lower_bound":"MkhtdVR2SjJvR2k=","upper_bound":"Mlg0SXZaSktHUm81bDRxd2dPWEI3Z01URFNKWGRrcGdON3JB","repeats":1},{"count":42000,"lower_bound":"MmIxUDgwOVJ2a0w1UDJTVUloWTNn","upper_bound":"MnAzM2tMWnVLSXc2SkxnaXBFcUZIcElIVzBFUDZxWQ==","repeats":1},{"count":44000,"lower_bound":"MnRtd1N3enZEZzE0d1JVMG1adG5TNjJ2MFZmanlsZk1Q","upper_bound":"MzJNU3ZDc2RJSWZ3akI=","repeats":1},{"count":46000,"lower_bound":"M0FqQzNFU3g2N2hXb0QzZEpLRXpNdGRPQ2VZMmxVem1vVw==","upper_bound":"M2FuMVR1OWZESWpY","repeats":1},{"count":48000,"lower_bound":"M2JTb0V0aVEwMDZTWEVxM1hCSVpVTXdjV0F5YlBpUw==","upper_bound":"M3YxOUN5bVkgTlVyQUc3VXVXTzZxbEc5S2lYMWptcjVYeXZBS0xn","repeats":1},{"count":50000,"lower_bound":"M3dDTDc5WWNsTG1CYllmUlQwTWJMMWV3UG4=","upper_bound":"NDJ0LGpSYTV4WE16eWtqZFlzLFI5","repeats":1},{"count":52000,"lower_bound":"NDQwYjdTMUVZcGMxIHhhajVMVU9NQ1oxM05TVno=","upper_bound":"NFF3RDBzR2M1Zkl4eDR1UEZvMFJjRWlldjViWQ==","repeats":1},{"count":54000,"lower_bound":"NFRZSFpOdmRJaXpCak91ZUlK","upper_bound":"NGV3RFFUemFBdmsxZ1RvWHE3U3I4UUtZQmVoQXJ4eE05b2l4T0RKNA==","repeats":1},{"count":56000,"lower_bound":"NGdibXJYV3ogc1UwZ3A1ZFlsWEVvTFRFQWlRIFNx","upper_bound":"NGo4c3ZFWDQ3a1lvZiBldGl1NWZscFprQlF4","repeats":1},{"count":58000,"lower_bound":"NGsxMjFZeFNCVU05TzBlMFU1VU8=","upper_bound":"NG1iTGRuZGRPQjFzSGhoTEZLSFl5dTNxTU5rNjdNV1M=","repeats":1},{"count":60000,"lower_bound":"NHF1ZE9WTmJIbm03eWRrQThRVUk4NHRMSWFEendma08ySEpveUpqTA==","upper_bound":"NUVkT2FDS3EzZjMzOSBhZHJZM3Azek0=","repeats":1},{"count":62000,"lower_bound":"NU9LZkxLNWVoU3MgMWJibzU0OVhKcHZmTHFybyxPVkgyRDlPM3Q=","upper_bound":"NXY5Z25hM1lGaExrNDZDU2l5","repeats":1},{"count":64000,"lower_bound":"NXZPOTNXcHlLMzJtMVBUYmxaY0FLNEU0Tk1O","upper_bound":"NjRucXJqUUx1Q1pxVUUsNWZwQmo=","repeats":1},{"count":66000,"lower_bound":"Njc3cEp6a25xNE5RZ3lDLENvUG1DVURKbU9vSVJNTW84OW0=","upper_bound":"NlI0Q0hBUm1FOTMsa0xibVpQbTA=","repeats":1},{"count":68000,"lower_bound":"NlRQTjVnVFByQjBWc3JsR1ox","upper_bound":"NmNSblQxSHhuWlpPR2ZrSjFwVnk0b2Yya1ggUGpvOVNlaw==","repeats":1},{"count":70000,"lower_bound":"NmZBWVE0c3VZWmtzcjQyOTlCMnBnN0NKVFJHd3hvRHQ=","upper_bound":"NmdpbjA3bFpVeWl5bXZCbEkx","repeats":1},{"count":72000,"lower_bound":"NmpySHh2ZU5QcEF3VE1QZlZMSg==","upper_bound":"NnNOVWRVNEpIMkdqMlRJSm8=","repeats":1},{"count":74000,"lower_bound":"NndtUUgydDNESkFrWHlvQ0taZTBZQzYsdDY=","upper_bound":"NzhseHJzcjNPZE1HbTlxZDNaemV3QQ==","repeats":1},{"count":76000,"lower_bound":"N0RuV2R6diBVeGl2bHU=","upper_bound":"N0paZVhnQVhUMTJhbUloWUx3bHJGa2tmSg==","repeats":1},{"count":78000,"lower_bound":"N1FOTCxOMHBQQlBtcms4dCwxc0h6TFllUVh0","upper_bound":"N2cxTFhDbklvQldh","repeats":1},{"count":80000,"lower_bound":"N2lBTHY4RlFlZlFSN0k=","upper_bound":"N3FycjJZQXpWTFdqMXB4YUhsQw==","repeats":1},{"count":82000,"lower_bound":"N3JsQ1VUVixGOGtqVlNq","upper_bound":"N3g1bk1mblVFQTZKM250QnlYaGluYnZNQmhodk5kbnc=","repeats":1},{"count":84000,"lower_bound":"N3g5eDJRT2hhZjcsLGFrM0Zp","upper_bound":"ODRjTk5NUWVacFI4OEc=","repeats":1},{"count":86000,"lower_bound":"OEZ0Q2RkTHR0Um5pdExPQlVZcVZKdXZRLHBaVXRUTjdL","upper_bound":"OFRweFhMUXhpRGtzQ1BwIFJUeDg5UlpvV0tEVQ==","repeats":1},{"count":88000,"lower_bound":"OFhVaU51VXBJMmZQWkd4WWc2WSBIYmRURHB3","upper_bound":"OGU2bjhLIEF5RWgxZlVVeTdqbkE1V3R0OQ==","repeats":1},{"count":90000,"lower_bound":"OGVocUV5RGp3TSxxVDNyQ2FRbG9xUk9YYzdZaWtRbnpJWQ==","upper_bound":"OHkwaGNzUVl5NmRtcXM4RVZUYXR5dEpEbVM=","repeats":1},{"count":92000,"lower_bound":"OTNabFV5dkRwVFE2Sm9qTkgxUDB5VWlGdWxiMTlRZXUza2o=","upper_bound":"OUpkaUtkcmZobzd1SUVud0lYemEgWWNzQnc0","repeats":1},{"count":94000,"lower_bound":"OUxTVnZHOTI3dERPVDV5MWdYOFR2Qmg2UHZaZ1Rydk01Tg==","upper_bound":"OWU3N0RiRWZVejNlNFdkNg==","repeats":1},{"count":96000,"lower_bound":"OWZMbEswdmxKVThILA==","upper_bound":"QSBDMVdtQlJaQTJCZVBzM2YgIG5CNkQ=","repeats":1},{"count":98000,"lower_bound":"QSxMNXFOLDY1d0h1a0x0Z0czaVg4S2kzRlNMa0k2RzJDQw==","upper_bound":"QUJkc0g4amJUIFh1OHY=","repeats":1},{"count":100000,"lower_bound":"QUJucXNmTmdIZzZ3","upper_bound":"QVc5RU5SaVZKbGQ=","repeats":1},{"count":102000,"lower_bound":"QVg2TVRKOWVuRGZybjVGY2pMYUM0WldoVUZaQg==","upper_bound":"QXNiIGROZFZVblZLUUJEblRSSEtpVzcwSUg5","repeats":1},{"count":104000,"lower_bound":"QiA4OFQxQzEzd0xORXJWUWZlWE8=","upper_bound":"QjJnU2prR2xsaWRMdEt4eiBxSlMzZk0zWlNvQlJmc0k=","repeats":1},{"count":106000,"lower_bound":"QjYzR1FHY1JXVyAgU2x4M0d4UFFFOElSUDhMUw==","upper_bound":"QkhZRlBDazdMWmViUWlkZHVoYWNBWWdOdDNS","repeats":1},{"count":108000,"lower_bound":"Qkk5S2ozVHd2M0l2c044Ukk1cFNnSjlIdG5BZklRVkFyblhCbg==","upper_bound":"QlBiMFhadXd3a2dmeE4gWFZGUmVzVm4xU21VTEo=","repeats":1},{"count":110000,"lower_bound":"QlJkRE1va1VkVG5uajc5ckRwSnNOWjJkdDZR","upper_bound":"QlZBcXFMMFdxWUZQLFpEb2lzRlN5YnRG","repeats":1},{"count":112000,"lower_bound":"QmYxOUlicXpBcklMRlF5alZvTFdBN090d3oxOHJNc0xkb2FM","upper_bound":"Qm12U0F6dkFhZjlYWVcg","repeats":1},{"count":114000,"lower_bound":"QnE1TkR5MWFIVHJRbFhqNUdaOWJsWnVFRVllMTVkcTk=","upper_bound":"Q0NMIHBFd0pyNHZNVWlkIG9KMXZqaU9XWTM=","repeats":1},{"count":116000,"lower_bound":"Q0QgZGh2UndmM1g2MFh1S05zMHZZZ2U=","upper_bound":"Q0tSanVteWRkTDF2UXR0dQ==","repeats":1},{"count":118000,"lower_bound":"Q1Bjb0NoV2FmNHRLZFpHaVg=","upper_bound":"Q3dXSlQgZkpkSDNiUkY3aGRkVDQ1TmtrNGoxQ3Q=","repeats":1},{"count":120000,"lower_bound":"Q3oycmlZUWhYVk9yS01HQjRI","upper_bound":"RFBMOHdJSzhkdDNiQk8gSzVzSUVXYkFHcg==","repeats":1},{"count":122000,"lower_bound":"RFY4NERaRW8xbko0UE1IangweWQzdEJSdHVRaUhJS09tNg==","upper_bound":"RGR5Q2RKbyA5OWQgak5Lbkk1TDNyUzhHOUl3ZUF2QzNH","repeats":1},{"count":124000,"lower_bound":"RGg1V0MsSW1CY1hoNG9Ia1cxYyBRNFg=","upper_bound":"RGpMSix5RUtmZnBULEVLSWJNNlp6aVR0enZDYkU=","repeats":1},{"count":126000,"lower_bound":"RG1XUEVCTUtlYXowNSBCUktmdmNmIHJ3eGl0NQ==","upper_bound":"RHJnZjZUSjQgZ1BpTG1NbVBwIGUwbyxTVTk=","repeats":1},{"count":128000,"lower_bound":"RHNVcXdCYmIgU3pqZlBYTzVtdlZO","upper_bound":"RHZRRmx5RjI2IHVkSkFKIHRpYVA=","repeats":1},{"count":130000,"lower_bound":"RTBNNmJ1eXRMdDJKNXR4","upper_bound":"RTlKaVI1cUFsSnhLd2k=","repeats":1},{"count":132000,"lower_bound":"RUd2Z25xOFhLSDNVMG94MDQ0aUVxSVFE","upper_bound":"RWZPbElxSmQ0VGhxakxxWXBsVTJQIGcgdQ==","repeats":1},{"count":134000,"lower_bound":"RW90NUxtbU1DRWRWdmdiclhFR3B6NFNqbg==","upper_bound":"RjlHNndTS01JVGgyZHpZbVVkUEN3YmJJMXBZUGlaTEhBaDJrSzYz","repeats":1},{"count":136000,"lower_bound":"RkMsTDZiaDVqSGpTdmM3Sw==","upper_bound":"Rk0yb0VjdVkwRVNKLGVXc3dEMg==","repeats":1},{"count":138000,"lower_bound":"RlE1RDJIRmJsSmh4UEZYZkk5NmhDcTJ2QnIzcE93dA==","upper_bound":"Rms4Vm0sOUF2Vw==","repeats":1},{"count":140000,"lower_bound":"Rm1QZEo3YkVLSlRTekF4c2h6S2VJQ1BuRTBIQVdKLGc1Qnk0a0o=","upper_bound":"R0t4eEJYZ0kgSlBvVkZFVWg=","repeats":1},{"count":142000,"lower_bound":"R1JWZWRMRkMxOXVOOW84Yk55TlpXd3pjYkRVbzJlVA==","upper_bound":"R2VRS3pYMHQzQm1u","repeats":1},{"count":144000,"lower_bound":"R2hScHc1S25YendnYlkyWjJtbmZJMHl1V1Jz","upper_bound":"R3lwdVdXMHc1SDd0aHFvTDRMdHIwYkhXeDFIVWMyUVdqMWEg","repeats":1},{"count":146000,"lower_bound":"R3plUERtWlJxR1VsR3FxbHJaR2pVY1VtMWVjQjd6aQ==","upper_bound":"SEQgRjBBUVBWRzNydjlBTA==","repeats":1},{"count":148000,"lower_bound":"SEUsTjFkeXFFUnNJOVNRWldUbUJUdTkyNWFiOThT","upper_bound":"SGJ6MWNjQWdaRlQ=","repeats":1},{"count":150000,"lower_bound":"SGVxMndYLDNSb2ZsYWt0LGVkQXBBT29SVURFZUhVc1ZrV2RtRFhMbQ==","upper_bound":"SHdlbUUzaENYYktYRUdxNWVibFpELHRR","repeats":1},{"count":152000,"lower_bound":"SHpZbHdUUkFvQ2xSRllGbQ==","upper_bound":"STZBNGFOIDFIVHVTeGhNNTlJa05Id0Rxck1TdTRLUVo=","repeats":1},{"count":154000,"lower_bound":"STdFLEdwaEE3bTF6UmN4OHB5OFJsSE0sV0JSSw==","upper_bound":"SVBGVzh0IFBGSU1pZWo4QmZ3ZUx3d3NRTDZob2h6cjBKV0RRLElKcQ==","repeats":1},{"count":156000,"lower_bound":"SVBiQ3dLaFZoaXpIM3Z0ZWggMzdJWnpFVXFlQ0NocEdQSVUzeUgg","upper_bound":"SVdoQUIsSmk4OHVISEtVYUZmMnQ0dDR1","repeats":1},{"count":158000,"lower_bound":"SVlKRlBjdGRqMnNUQ04yYzBpN1gzNEk=","upper_bound":"SWdJekxMVVgyTWhhdjdad04wOHc3TGM3","repeats":1},{"count":160000,"lower_bound":"SWhFdHdyWCAyOUlB","upper_bound":"SixwIERGbEVCTDFFUU1Qakd6WWJ4c1d6aVUwWGZwZkVjcERKTXY3TQ==","repeats":1},{"count":162000,"lower_bound":"SixwV3BXVkZDLA==","upper_bound":"SjhqczZZTWtBTWpFN1AwWVZHM1N5ajQz","repeats":1},{"count":164000,"lower_bound":"SkF0enQ0OXBLYmZlcE9hSWtBIFpjS3Q1VTlGaTRheUtQLEg=","upper_bound":"Sk9nN3VlSFZlNQ==","repeats":1},{"count":166000,"lower_bound":"SlBjd3c3b0E3RGlBdER2aGtCTFZr","upper_bound":"SmdGNkU0TWI0a2tTLEk=","repeats":1},{"count":168000,"lower_bound":"SmlwZTRxTzBrd3lIVHVDcnlRVnZFdXgxaw==","upper_bound":"SnVnU0tYd044b3ZuIDlIVHhnSTRjWEdmOUcsNnM=","repeats":1},{"count":170000,"lower_bound":"SnlLdUZVTTVuS2ph","upper_bound":"SzJmajFJMGpqeXdIc0FVM1NDaXA3eUF4RWFK","repeats":1},{"count":172000,"lower_bound":"SzR2Z3pva2hnWkx6V095","upper_bound":"S0FhQVdpZFUsc1NCYjhmZ2g4d0lQcUVyZ09EWHBjZg==","repeats":1},{"count":174000,"lower_bound":"S0FyV3RzZ2ZheVJHIEhKcWVRbA==","upper_bound":"S1k0clZWTklQc1RoZ0JuZlI0WVowclozcDhkell5MA==","repeats":1},{"count":176000,"lower_bound":"S2JZWUZjUWhlUGFhQkhoN0VPb21Ca0l4YyB0VTREICAsZHVseA==","upper_bound":"S21uYlBwVGl5azRrbGNWeXE3TVhP","repeats":1},{"count":178000,"lower_bound":"S3JPb0xrTFFGMWtrd2FweDBRSGxsM3BrS0F0VFpqZzU=","upper_bound":"TEhpNVQxeEFNUWxRWk5MQ1pBaXN4RnJPbWpE","repeats":1},{"count":180000,"lower_bound":"TExzZVloNDR6dG8yVTB6YU10Miw4U25udyxrY1dwLHFueTc=","upper_bound":"TFIsbDNQVjBQNWtSaQ==","repeats":1},{"count":182000,"lower_bound":"TGc4NXA3cXpYaHYycVJQSjAwTFcxIFZp","upper_bound":"TGxvWnEsd1BFTzRDMXVHbHhUVHBrMFEyRU9oeUlB","repeats":1},{"count":184000,"lower_bound":"TG5ZLEVQZEFkcmU3ZERiNjI=","upper_bound":"TTdMZVc1YjcsdWxhSVBmRkZLLHBE","repeats":1},{"count":186000,"lower_bound":"TThhQVZMTDM5UERNUFZSdA==","upper_bound":"TUlYdVJtYm1xVUJJVlFRMVpvZHl3VzRvRlJ3eVJvak0=","repeats":1},{"count":188000,"lower_bound":"TUpMSENJZzZNcjZmYnpWYnlCckd4Y24gdGIgazdUZk0gRQ==","upper_bound":"TU1NTCxvVjN3eTdUbHpoLG0wNm9lQWc4aG92c1ZmWlBN","repeats":1},{"count":190000,"lower_bound":"TU1qZHFsSUw0dGF1ZWpkTkRkWU91NmU4Z01hMUt1RA==","upper_bound":"TVhUOTkzUHBhNE0=","repeats":1},{"count":192000,"lower_bound":"TVlVQ2ZDRzlDVEMscXZNMFlR","upper_bound":"TWdsRndBTyBRY2lkeGs5TzFB","repeats":1},{"count":194000,"lower_bound":"TWszdURpcyxWR05ockZnbjBweFFlLEZJakdxWk9aTmZlYzNx","upper_bound":"TiBmMHJBVjJWc2cseGpmU3VDMmlXcmxlSXNYbXZmelVuMlB2VjZpcg==","repeats":1},{"count":196000,"lower_bound":"TixObnRzc2FoazN3SmRDSFl1SjVZTmw=","upper_bound":"TjFUc2NKN3FZTix5dW1zWTFOS2ltdHRXMU1VMFFB","repeats":1},{"count":198000,"lower_bound":"TjNhTnJUTXpLZ1Q0V3NVcFlWdHFmemVCQzU2NlNDeXBBeFE=","upper_bound":"TkNUeGlVcWpzMDNFUks4YnVoUmVUUThCZXVz","repeats":1},{"count":200000,"lower_bound":"TkQsQjRsQUZoc2R4STV6","upper_bound":"TkhXbEF2NEZMeUNF","repeats":1},{"count":202000,"lower_bound":"TkhpYmRkbUhyZ21lVXFvVnU=","upper_bound":"TlZCU3IzampkREo0SDZZTzI5d0N4RVZCRWI=","repeats":1},{"count":204000,"lower_bound":"TmFRdWVVRndzMmF0cjdkcTEyV3ByMVhmdGJpbw==","upper_bound":"TmtMYyx5aHZCSkpnTnVZVHE0eHZjeUZmQTg=","repeats":1},{"count":206000,"lower_bound":"TnM1Tkk2RThRVzd1dkw=","upper_bound":"TzlhZFhqRGlBemlyaixsTll2NnpjcW9QLEU=","repeats":1},{"count":208000,"lower_bound":"T0M3NlRUTXpXZWE=","upper_bound":"T0tYd0RCNkVMIGlJMVZ4WGdubWRtaHRTRzcsUEM=","repeats":1},{"count":210000,"lower_bound":"T05pcGdyZG9teWxJRUt5","upper_bound":"T1RXWDJSclppZ0tzWjlDRzc=","repeats":1},{"count":212000,"lower_bound":"T1ZBbzhHTUtkTldSc1lTdUtxQQ==","upper_bound":"T1pWNGwxRyxzLHdpVWtuTFZBZ0xaTkJsbFlzZixzbQ==","repeats":1},{"count":214000,"lower_bound":"T2JsVXk0LDlGWUVKZiA5a3h2dWQ=","upper_bound":"UDhFN1BsUzg0M3ZHUU9PQVlHbE55elNidDBHZ0ZuWFI4MHJHVmht","repeats":1},{"count":216000,"lower_bound":"UDltNDZSLERsdkJTaTFIYk80MjhVcW9Wbw==","upper_bound":"UEVSY29LMXIgbklhelF0MkJjQnBzOG1RWWxFLDY0RGJWTw==","repeats":1},{"count":218000,"lower_bound":"UExOQXZVeElRWWtXdTcgSDRDYUVHY1lxeGJKNw==","upper_bound":"UFggeW5IRHNsVVJFWg==","repeats":1},{"count":220000,"lower_bound":"UGFJaFVWZk5Ib3JQRyxvOGJnY1g0cXBHUWhXYXRuY3Fn","upper_bound":"UGhkY0VCWFlONElBTUU=","repeats":1},{"count":222000,"lower_bound":"UGxDZkJ6aWUgZVcsQiA=","upper_bound":"UHlINlI2SkNyb2JsUnJZ","repeats":1},{"count":224000,"lower_bound":"UHlmS242T1lxUw==","upper_bound":"UUV6MldRZld3c2RyUkJhNTJ1dXdvSk53eDV5S0RG","repeats":1},{"count":226000,"lower_bound":"UUk0Y2hZbHJGVWJVeE5QSndIeTFCYzBuWnc4RVBhN3JPdDZX","upper_bound":"UWNRTjN2T1NMcDkwSmVNY3RCaWdzb1VMNHpDWkg0b3IsSyxQUw==","repeats":1},{"count":228000,"lower_bound":"UWROeXpEcmFNM3dCb0Z6b3pBeWZWY0VPM1NuVjhLRA==","upper_bound":"UXFHZFNaWmY1RU1zd0R4IDl4eGtMT2s4Sg==","repeats":1},{"count":230000,"lower_bound":"UXVBS05PaDBzSjM0MWRYM0RkaVoxQWRUd3VCTFE5VA==","upper_bound":"UjEzUjh0bmxsRVRlLA==","repeats":1},{"count":232000,"lower_bound":"UjFWOU10SVVBd2c=","upper_bound":"UkRnNjFTV2pXaTNjYkxsYWg3YXVHakVWTTF4RlF2bDgxTDVqYkxU","repeats":1},{"count":234000,"lower_bound":"UkxxaE5zbGViWGUgdnhDbEJ2","upper_bound":"UlNSMnZqMjJvQzRwRFpubW5jeDBUYzJSY1Rw","repeats":1},{"count":236000,"lower_bound":"UlZjbzE4U0hEVlRhMHRtVXlCbnF5cGpiSDQ3bA==","upper_bound":"UmhrWlVnSG4sckFneUJ1S3NISnBRREZxUWl0NU9JRQ==","repeats":1},{"count":238000,"lower_bound":"Um14a1phVE8zLGI4d0gxVTAwRWQ4ZUIyYVQgMzNMNmE2d05aaDRNYQ==","upper_bound":"Unk3RHBUMGNsUmp1VTVSWVMwVDY=","repeats":1},{"count":240000,"lower_bound":"Unp1S3ByR2wyM3AyWGFybyBrc2xsM3J0MDlWMkc=","upper_bound":"UzdVZ1pGUVg4NlVNSHdvSnV3Zk9TQ3lxSXBS","repeats":1},{"count":242000,"lower_bound":"U0dLU1J2eSBiRTVjckR0ekosV3lxRmxzVTYxTVgwa2RrSGw2","upper_bound":"U0huZTNReTNOTmNNSjBTQUxQ","repeats":1},{"count":244000,"lower_bound":"U1ZKZWtKQ3gzRVpNNE5zZjVyNXl1QVRhWmZ5UWhzIDRKMWdlIA==","upper_bound":"U20xRzhJZ21NcDBiV2NKYzUzNzR0bjVWbTRFZW4=","repeats":1},{"count":246000,"lower_bound":"U3BVSzZNMU5iY2dZRVpFQTdqWDRwY0UwUw==","upper_bound":"VDFQWWM4SWtGWEs1a3plVWdGTHJwdVRGN0czT2tlakc3SFNmUlQ=","repeats":1},{"count":248000,"lower_bound":"VDR2MEtaQ1J3RGpuU0RiYWo1em9hbUQ0QVMgaA==","upper_bound":"VEhVRmk5OVJtMENrbSBLNEhZeE53S1dl","repeats":1},{"count":250000,"lower_bound":"VE4wTm5EWUpKZTBHUUppUUhHZ2EzIA==","upper_bound":"VFpUcnRXcDRoN2h0S3JqRFhGYnFPdWxXSkxYNzZ3T3Z4aERxcCA=","repeats":1},{"count":252000,"lower_bound":"VGpyTG1lLFhqN1hZVVA4NHpQeVlxRnpsM3BsajhpOVZrZDI=","upper_bound":"VHVQSUtydmxNRXpWRzJyeE1xcXVWOFpIR3FhaQ==","repeats":1},{"count":254000,"lower_bound":"VTB1UFJWQVdRY3BVdFBCQXc5bnNzYjkyMyxEb1RD","upper_bound":"VTJnS1BsSCB1IG02UA==","repeats":1},{"count":256000,"lower_bound":"VTdHSGZtenhMc1BxNVdhd3QwY3kyWixjLEJZVk5KIHYycVpvd0g0","upper_bound":"VUQ4MGdoSkRzalptY2E1TVN2T1M=","repeats":1},{"count":258000,"lower_bound":"VUlBdHYsZ1FyalpQWTBOT0F1SHJqQmtsWVA=","upper_bound":"VVBvZkZPUEIwS1c=","repeats":1},{"count":260000,"lower_bound":"VVUyIFFsaUxSY1R2cjIs","upper_bound":"VXJ2aENJdmlteUJBMmpiMk5zY1E0bG1xb1dUTXRLS0Rvb1EgUQ==","repeats":1},{"count":262000,"lower_bound":"ViBGSXJCSVo3UVMsUkEyZjM=","upper_bound":"VkJTMUxpQTdOVlpiZEEsRDIwRjNBcUs=","repeats":1},{"count":264000,"lower_bound":"VkNXZDdTV0YgcnZxYTdXIFFKLGxNRk4gakplV1F5ZW1sbCxT","upper_bound":"VkpjWnlPNU0xWEQ4QzJQUkM5T3B6N1l6N2YxNTc=","repeats":1},{"count":266000,"lower_bound":"Vk1GdCB6VmtkR0dpcUtUa2J0eEY4NTVRUzhDNDlrQjhXcHEyQg==","upper_bound":"VmI4QTJtSkg4IFhtVw==","repeats":1},{"count":268000,"lower_bound":"VmxWNDRxU2NRQWFuRTVSTUosTDRtY2dMdVZ0bUhoMzg0","upper_bound":"VnFNV0dUOGVLdFJ6V0U=","repeats":1},{"count":270000,"lower_bound":"VnNWcTViYldHdTRKSzB4IHBCT2FQZjFFUDY2dDYwaGJDMnZzbVhZQg==","upper_bound":"VzI4UWFBek9qNVJkMDhrQjJMTDF1OVNuRVNSbWpV","repeats":1},{"count":272000,"lower_bound":"Vzd4dkpLSyBPbTliTlIxSEE3TnBxU1RCVEhZdHZIdjJMUQ==","upper_bound":"V0hwS1RNQ3g2RHkwZkM5","repeats":1},{"count":274000,"lower_bound":"V1FFYUx1VGVOWUw5","upper_bound":"V1pCZFNYQWxUbVZucUogNjVVZm9PbEFtUWZKWg==","repeats":1},{"count":276000,"lower_bound":"V2QgLEdDazEwMkFlOXJqT1Nma1lpRTNrZ1JnYTkzTA==","upper_bound":"V2hkYjFNb3BjQkRPT3UxUDlSUjFkUzg3Rko2bURUQzdYNEdS","repeats":1},{"count":278000,"lower_bound":"V2lrVzRNYU9lUXVMZHYxMm1NbEhVWmZoOXRWYVhnOFFWbEVwcGs=","upper_bound":"WDV1ZUthSUQwMVRyRDFlakFIeGU1V1AyT3UzNm8=","repeats":1},{"count":280000,"lower_bound":"WDdYIDVxeTRFQ0EgIEJpN2daZGZjVg==","upper_bound":"WEZISXg4TVhJQzRWN01qSWx2ajlWRFRhdFVmWXZsekZtZFdkMFlW","repeats":1},{"count":282000,"lower_bound":"WEdNY1ZHZDljTXhReTdIbDRqZE1hNWphcmVSR29J","upper_bound":"WFVrbnp4WVNOMnpDVTVaN2hadCxjNCw=","repeats":1},{"count":284000,"lower_bound":"WFdDcG9sVEc2TVhMaUlpRSxLcVBmZ01Nc0E3clk=","upper_bound":"WHZYV1hpLEJjeVFpT2l0Nmxrc1BZMkt1VHRlSmtmeFZoU2FP","repeats":1},{"count":286000,"lower_bound":"WSBDejAxZG5KOWhpcGZKRDY5VWN5OUU1TlR2M1VDR1VC","upper_bound":"WUNIZzZyYUhSYTg=","repeats":1},{"count":288000,"lower_bound":"WURUMnJudjlEaVhPOGtJWENYbDNQWW56VHJqRUZo","upper_bound":"WU5EZUhDOHNXU2VFb3BxNmJJbTBOZVRMYWc=","repeats":1},{"count":290000,"lower_bound":"WVZESDRkSGRKQjRtaWROOW92YyxSeFgzRXpVb2NiMEZKdXk=","upper_bound":"WWpyTmFJN2h5MGVUV1lCYw==","repeats":1},{"count":292000,"lower_bound":"WW8gWlVRSms2dXRuaUplaQ==","upper_bound":"WXMyS1dyZTFJWUxmTnNVeFEzZlJObG9U","repeats":1},{"count":294000,"lower_bound":"WXZZMFo3OGltSkxaY050NEVNSkZ3RmpKeHBXWEk3TUplclA4","upper_bound":"WjF3THAyS3hHZk5mMkRLVE1ZQVYzdVAyOEtLVndz","repeats":1},{"count":296000,"lower_bound":"WjNyaXl5ZUgwa2JBb3Uxc0c3OWlIIHM=","upper_bound":"WkRzRGVkOTdVdkxL","repeats":1},{"count":298000,"lower_bound":"WkwxM2VqM3g0WUFIRDNJcFpmUGxwWQ==","upper_bound":"Wlpxbyx4YWVtQnZHRnhsTDIwZlh5M2lrN3N4cmh2RFVCaXFKQnpBYw==","repeats":1},{"count":300000,"lower_bound":"WmQ4WW1pWThVZVdwaHYsQ2dIakk4OFdiZW8zZmt0dWNaWEhk","upper_bound":"WmhnV0FqV3RMR0xkWDI1ayxYaTcgQWllMlVlMk9SUzdrZmtMeQ==","repeats":1},{"count":302000,"lower_bound":"WmxROXhkYXBudCBoM2dGbG9UYnQ1RFUyclhFOEdtdk9VSXA=","upper_bound":"WnVxVmdjYlUwc2NLQUJKbGg4MG9zY1dXOWF1WVFucQ==","repeats":1},{"count":304000,"lower_bound":"Wnl1YURBakpybmw2bXRNR2psbQ==","upper_bound":"YTJkY284V0lOSGI3LFVWWWJOSGhjeHZLN1Z5Mlo=","repeats":1},{"count":306000,"lower_bound":"YTZpSm51cGRpV2s4cFhGSGRqR3BjZkoyVjZjbVh3WVcwQzdjcFhCbQ==","upper_bound":"YUROZmNESGJUNlUz","repeats":1},{"count":308000,"lower_bound":"YUZBTlY3cXYsVkhtLGdT","upper_bound":"YVRXdVRvU2xaM3Y0LHZEb1FLR0NMLER1aHhPVXY1TnozNVl2cEVF","repeats":1},{"count":310000,"lower_bound":"YVdlN0VSY2V3Rnc5Y01PcXBpSVYwTGRWYU52UEw=","upper_bound":"YWtabEZHeHV2TDYwcTlx","repeats":1},{"count":312000,"lower_bound":"YXNNb3JIU2x2NnlhZkRnZjJqQlIgcUlnMzIgbTZwN1JjZg==","upper_bound":"YjFQdWJaM3VKODVxd296bXN2QlRY","repeats":1},{"count":314000,"lower_bound":"YjdKeFd5Z3RrazdTdWY4VHNvTQ==","upper_bound":"YkxQYzksIGlNNkd6RjVWNUFZRkEy","repeats":1},{"count":316000,"lower_bound":"YkxQaiBWdmwyaUxtRnJ6bXBVZlEzN0hFeEFCSVphdWU=","upper_bound":"YllXTyBEb1Y1M3JPbUM1RyxubHltVGdncjJlVzBjaDF1LDZxeQ==","repeats":1},{"count":318000,"lower_bound":"YlpDa0VjY1NjQzlJ","upper_bound":"YmhObUxrWFRGS3AzIGZEZEJPNGZnVE05U2pzRDlFSWl1cndGQjA=","repeats":1},{"count":320000,"lower_bound":"YnVhWmx2NFRLU0ZrdklZVnNFWFBvRXpFeTd1M2dmaHNtLDBOSw==","upper_bound":"YyBYNTV1aTEgc2lUbGVTR0VIam5yNExOUWVSbUk=","repeats":1},{"count":322000,"lower_bound":"YzJpN2pXWVRndEg5Y3daTFozblM=","upper_bound":"YzdvdW9mZjZlaFQ4NzhkdFpDYWRwOTA4eEIxdnVYRA==","repeats":1},{"count":324000,"lower_bound":"YzdyOTE0c1RKaHgsZkNKdGZM","upper_bound":"Y1lESFpFbnNTWCA5NFczSGhFWmI2Znk5TFJjQ1ludXpxMVE=","repeats":1},{"count":326000,"lower_bound":"Y1lLWDI0dEdsdnMyczZSdA==","upper_bound":"Y21IU1F5a1J1UDY=","repeats":1},{"count":328000,"lower_bound":"Y3IzVDhXU2tiVENqQ21CUkpiSFg4d1ZYUjEsN0NSMzlP","upper_bound":"ZDRFcTNFUWNtOSBKbTVBclFx","repeats":1},{"count":330000,"lower_bound":"ZDVESUxoUkdUdDV4UDJo","upper_bound":"ZExId2tJY0E4bkJFRXdlbGhCcHdHdGRoeVY=","repeats":1},{"count":332000,"lower_bound":"ZFlxdWZvWVhUWTB5bmdTTW92akc3WnRuYixMdCwsNUlEeE9hdg==","upper_bound":"ZGwxS3VvMSA2ZWh2enR0ZHYgaVg=","repeats":1},{"count":334000,"lower_bound":"ZG8sb1A3QkhHZTZq","upper_bound":"ZHh3WTJJdklCQjFHdFEsaWpiM00wVk1jVUw0UDU=","repeats":1},{"count":336000,"lower_bound":"ZSBMeEZjRVBvN1RtREQ3Y2xiWlpWWEJoVmprMmNCRGt2UHk=","upper_bound":"ZTZHbzhza0h0NzVoRXg=","repeats":1},{"count":338000,"lower_bound":"ZTZ6WGhMIE4gT3VzZXQySjg=","upper_bound":"ZUdBQkVCV1NLazhzLDhERDRMYmhsNGRZIGxLRk40MlNKUQ==","repeats":1},{"count":340000,"lower_bound":"ZUtrYWYydVRid1l0bHFnenNHV09oZmplWUdPZHVSbmFWV1RlYw==","upper_bound":"ZWdKNktBQnlzZUFsWTJFdVRIVQ==","repeats":1},{"count":342000,"lower_bound":"ZW4wcnRqamVYdXRyRmZwYmRlZndmLHhyWVRSIFY4OA==","upper_bound":"ZXZTc1U3OENLYk1T","repeats":1},{"count":344000,"lower_bound":"ZXh5SUhGVFozR0VOZlN5ZU1WanFWMmdKIHBsRlNJS0s=","upper_bound":"ZkV1dVhXcXUxRHU3SXJyWjgxQTg=","repeats":1},{"count":346000,"lower_bound":"Zk9oTEIzTXlpZ1lEWENRQmkgQWRzZWI=","upper_bound":"ZlRJOUE0UDlLcTBWNVY=","repeats":1},{"count":348000,"lower_bound":"ZlhTVDcya0VGRDNCODduWQ==","upper_bound":"ZmxQQ05JVk92UkREVlZybm0xWGNoOWw=","repeats":1},{"count":350000,"lower_bound":"Zm9ZUHJEWXp5TEdPYmk=","upper_bound":"ZzNJcTUgQkpIQzY2ZzJqN05IZ1BVTA==","repeats":1},{"count":352000,"lower_bound":"Z0FUaUhsIFk4ak1GZHdtS2s=","upper_bound":"Z1J4SURHTEZqY2EyaTIxV2VOZFoweEYybURJWEY=","repeats":1},{"count":354000,"lower_bound":"Z1NwVFEwUldmS21rdg==","upper_bound":"Z1piWXF0YzVqVkc0N1VETzhy","repeats":1},{"count":356000,"lower_bound":"Z2N0YnU0UVR1aTRnUXRJN3hhYlE0dlg=","upper_bound":"Z3BTNVR5RDdtY0xleko0Rg==","repeats":1},{"count":358000,"lower_bound":"Z3dNeWE1c2FSTTE4aks2OTlzN0t6UHhLYTVCSHE3","upper_bound":"aDFEaVZGYiBiTVV3SmFrUFpZWGNad1RUdXpObTFIbXNPNw==","repeats":1},{"count":360000,"lower_bound":"aDVLZEVENGY3bTliNDc2Sk03cEVGVGc5NE95Y01zT1I0bFd3MWlKcg==","upper_bound":"aEh0NUE5SWlUWTlpY1Q5dGFKeDNDOVU=","repeats":1},{"count":362000,"lower_bound":"aEk0RmxjTTdWcg==","upper_bound":"aFpuenJpa3RIQjRmVDZBWkRUcE16Z2NFNGdxOWl0eW9i","repeats":1},{"count":364000,"lower_bound":"aGd4VTk0Sk5id2JydFBUR2o4cm8xTCB5WGVjV3dyb3kyb3pWaA==","upper_bound":"aSx4NG80WktVZG55ZiBUdU81SFFRTmNEZFlrUlNTd2VUckdrYkM=","repeats":1},{"count":366000,"lower_bound":"aTVvM0R6NWdFZU0xdCxOYmdWdlE=","upper_bound":"aUZwYjc2QUYsMndkTTZ0VzZmQXM=","repeats":1},{"count":368000,"lower_bound":"aU1UWmNrNWtKbWRLV3JzWlFDIEdBLGFydW4=","upper_bound":"aVV1Z0tsMGl4aDlEZyxWVjVyQ1YwUEVXNldSa3hyOFF4SGNs","repeats":1},{"count":370000,"lower_bound":"aVZLVlhtM0xXQzJsWTdYaVR0VmRWa3pYUEdQNng5cw==","upper_bound":"aWdaZWtjZCBaQ0tsMG12bXo=","repeats":1},{"count":372000,"lower_bound":"aWllTjI1UHU1alZMWHU0Z2xkQ3JPZTR1bFFyOEVhUWQyQlM0OFlmQQ==","upper_bound":"aXh2d3RkU3JRLEJSWUNFWTM5IFpYMUc3NQ==","repeats":1},{"count":374000,"lower_bound":"aixqdUtvTWdqMTBsa3BFbDFrRVNudEI4MjY0Qkd3cTM=","upper_bound":"akVGZU5sdzJ4RUdYUm96eDVSNWxO","repeats":1},{"count":376000,"lower_bound":"aklFTldZZlJCTnBZa0xTbHY1Z1BwRHpoSE1rMyBSd1gxQVE=","upper_bound":"alNxNXBMZUpodU1tdzMwR3FU","repeats":1},{"count":378000,"lower_bound":"aldzbGxMdmt2UG0=","upper_bound":"amRLTE5ydGNZcyBsMWphTU4zNDlhTTYwOWg4bE1WbHFHekw4eGV0","repeats":1},{"count":380000,"lower_bound":"amZleXJ1VGY5VFRWT0U=","upper_bound":"ampvakNXS05paVVkM2Q1UFNMN0JqMGVP","repeats":1},{"count":382000,"lower_bound":"amw5UGxLbVBaTHlKV0IwRw==","upper_bound":"azJYZ1RsMjM2RHQgbDdjZmhtTXF1RjRmbGc=","repeats":1},{"count":384000,"lower_bound":"azlkVmNvVjZpOW80YWxOaXIwN2lRUVYwSjY5Yg==","upper_bound":"a0dXWHhnZ0RyOHQgLENmOGxWQmZCNDB3T3hZUU5v","repeats":1},{"count":386000,"lower_bound":"a010cSwsVTAwLG1kV0lzMjRIbncyQWpQSCA1djFzOUNIYWFLVm05","upper_bound":"a1VFV0RUMzlTOUxQa0hLTzdEZ3gx","repeats":1},{"count":388000,"lower_bound":"a1dza2RlcHFUUXVqaXJN","upper_bound":"a2x6NWxSckoxQUFhaDlEaw==","repeats":1},{"count":390000,"lower_bound":"a3VFb3pjb2tPdFNJb0hmN3c=","upper_bound":"bCw4SUlaVkdqRVdZN09MTg==","repeats":1},{"count":392000,"lower_bound":"bDQ2ZlVEbG8yRzRkazVaeGhOWEFuVGlSWUNy","upper_bound":"bEZxUlBXcHhqWg==","repeats":1},{"count":394000,"lower_bound":"bEg0RlpMVGlScUtR","upper_bound":"bGwxQTN5WjMxS1RLcA==","repeats":1},{"count":396000,"lower_bound":"bGxkZ1YxTnJ0UktkRUZHWDdsSWIsSg==","upper_bound":"bSByaEFBbSB1NHNrenNTZUw5LEY4WmlxSnYsUUdXM3ROSw==","repeats":1},{"count":398000,"lower_bound":"bTUgM3B4NFJUUjh3cCw5TXksMURIMDJtejJEMUZKbVo=","upper_bound":"bUJDekNZQTNQVnlHenJYcUJYUkQ0MzcgUTJWUFI=","repeats":1},{"count":400000,"lower_bound":"bUVLSzk3eGc5cGd5emdl","upper_bound":"bVJ5eW1uUkdJOW12Y21YQyxURURURjdSZ3BTYW9QNkdsZFNsdkE=","repeats":1},{"count":402000,"lower_bound":"bVNGQldwRUcyRDZPMWtvWG4=","upper_bound":"bWFNd24zMWdldWZOLGZMeXR1U1ROVXF3TEhwV1RoZWps","repeats":1},{"count":404000,"lower_bound":"bWJFOTNoWnRzcGhqOTMza293LEpqOWdnQ1BFVCxzVWVH","upper_bound":"bWg1WmJuVjlxczBBV3dvMGlMWUtQcDRpMk0gaTJuUUc=","repeats":1},{"count":406000,"lower_bound":"bWhVWGxSZVJ6RkRuTVJHTHNMdVhLUmI1TUtlZ0g4YkNicQ==","upper_bound":"bXFzZ1I4TDdsb2NMR0JpYzJWR0hwTmhsWnhYNU4=","repeats":1},{"count":408000,"lower_bound":"bXNTSHRLYk1qTXc1MHBaZGogQW4xREl2YVJMQTZlemVYQg==","upper_bound":"bjBEcHY5bFFvMjZMMHQ=","repeats":1},{"count":410000,"lower_bound":"bjRvb1pJTHdvT2ZzajNGOA==","upper_bound":"bkE4dzlWNzdKbENVR2cwMEp6VHQxWDNISw==","repeats":1},{"count":412000,"lower_bound":"bkI3NDBSdURDVVFFV1NtRDV5","upper_bound":"bk40VVBXcjJvVGtqTkNM","repeats":1},{"count":414000,"lower_bound":"blNGMVZ1RUl2Y2tveGNzS3lSaHNucnFhazVyNXk=","upper_bound":"bmFhb2ZaUnlraEpMZGVGM2dOLFZBVWpBNG0=","repeats":1},{"count":416000,"lower_bound":"bmogSENTN2xNRCA5MHlOMEpjbCxFMDQsbkJVMFJNUA==","upper_bound":"bnFOanhMYkFyalBlSzFMV29xcW9MczU4MFZWWGViNg==","repeats":1},{"count":418000,"lower_bound":"bnFtTThxcHdQbnJESkN0RDBSNkhoc3JoVWh6cFlmd3ZUMDU=","upper_bound":"b0Mwb0NQcHg5aWw1WnkycmNBdEk4dHVpT3cyTFdUSWZ1NGpnbUh5","repeats":1},{"count":420000,"lower_bound":"b0NteU1ZTVl3UENOODBZRHB5NEttTVBBZzlDODVZd0J1","upper_bound":"b0xYMVY1djFWbEgzN3NUazhwMXViT2lKLDlkWGFtR3d0OGphdw==","repeats":1},{"count":422000,"lower_bound":"b01ESUtWTFdJVXUyREVkSEVzaEo5VjRXQzZ3LDVi","upper_bound":"b1h2YVpTWkNhU3FiSDk3V3d6TDFZeW1aUUNIUGk5eTU=","repeats":1},{"count":424000,"lower_bound":"b1o0dDBoZW01a1pQVGU4NGdx","upper_bound":"b2lMaWh3VUE2a3REdGFm","repeats":1},{"count":426000,"lower_bound":"b2tZZU0yOUs4Zlo3R2osb0VVeA==","upper_bound":"cDMzakNnIEg2V0pyenhyVlowdzhjWDN5ZkFjS1Q=","repeats":1},{"count":428000,"lower_bound":"cEJGYVcxeTVVSXVmQ3JGS3ZjdVVZdXZ6RE5NUncwV1c2aA==","upper_bound":"cE1lcHVqbmJST215Z3lvdEpFIGNTa3k5SVJnamx6NnFHUUp0Vmdx","repeats":1},{"count":430000,"lower_bound":"cE1uc1kwbkdCQXo3eTRnMG1G","upper_bound":"cGlsS3UwdmYsdmxTa1dvRXJjIDMw","repeats":1},{"count":432000,"lower_bound":"cG13IERUYmxHYXJKdDhVb0I5","upper_bound":"cHVKaFQ2IEgzUzFlVEdHRVdBVGZaQQ==","repeats":1},{"count":434000,"lower_bound":"cHdHWFROUjY1N3Bjb2JlMmpzWmRq","upper_bound":"cUNMQ2xCMlVmWHUxb2NNQ2JDVEQzWG1VRmY5TA==","repeats":1},{"count":436000,"lower_bound":"cUUxejlRU3M1ZFJtN3hpQnhaaVJnSkN4TTQ=","upper_bound":"cWFIU2hWZnRKUzU=","repeats":1},{"count":438000,"lower_bound":"cWkgeGd0OHMwdkhMSHJIbzd6N3VQQnltZ1gsWHBmVA==","upper_bound":"cXpMWHBOTndOeXpIUjEsM21GMjBrQyxZViBDRmNKclZWYjA=","repeats":1},{"count":440000,"lower_bound":"cjRFTVJ5VzdvQg==","upper_bound":"ckhPIGZQLGkzYk0wTE1lQXJsU0ZVeVZzRQ==","repeats":1},{"count":442000,"lower_bound":"ckw3T3c5LFVVZ1RPTkZtMnZoNTA2M0Y=","upper_bound":"cmZpOWdpcGVsUlFKZVMsMndHWTBC","repeats":1},{"count":444000,"lower_bound":"cmgyY0JkaEZEeW9JOFB6UCwycmdOYjBMSg==","upper_bound":"cnNIQjRDWHB4ZFY=","repeats":1},{"count":446000,"lower_bound":"czVxcGRnazhoYiA5WHUsVWJPNW0=","upper_bound":"c0M3cSB1TTQ2N2Y=","repeats":1},{"count":448000,"lower_bound":"c0psczN5V2hkN1ZBIHZMZixy","upper_bound":"c2d3ZHRJeFdoNUZQ","repeats":1},{"count":450000,"lower_bound":"c25haG8gRGZVMmk1eFQ2djFKU3pjVjY=","upper_bound":"dDFwbnpYR2JIam5X","repeats":1},{"count":452000,"lower_bound":"dDZVczVnSjluQmE=","upper_bound":"dENZQXZjSjJvRlkgSk5maUhEQWl3YTF4cHphR1RJ","repeats":1},{"count":454000,"lower_bound":"dERqcDRwdHlOaHNNaVNKQzlOeVZpaVN2NEJTdEtiWUxMY3V5cTRxRQ==","upper_bound":"dEh4ejEgT3VBbzV5UVg=","repeats":1},{"count":456000,"lower_bound":"dElkY3UxaW8gcHVOdiB3d3dXbmdPaGljWFpzWWpaMW4wS0c=","upper_bound":"dFV0ZGZBYXBCcE1HQw==","repeats":1},{"count":458000,"lower_bound":"dGcxVyBRUDQ3N2lpOTRqTm91eUE=","upper_bound":"dHVjYyBrbGV3WjhQWmowZXVEayxSRWxnM2lDdEI=","repeats":1},{"count":460000,"lower_bound":"dSAzeDJSMHFMUkVlaCx4ck9xNUpxZk8xaGJoZlNLQ1pBYWp2a3A=","upper_bound":"dTN4Qlk0T2pOZHJU","repeats":1},{"count":462000,"lower_bound":"dTlZY1E5ZjFldFFVR0JjU3p0ajMw","upper_bound":"dUlnLFYwbmtZVg==","repeats":1},{"count":464000,"lower_bound":"dUlySjVLRSxKIHFWQWRNZHdhdkRINWUsZmsz","upper_bound":"dW9mc2ZuN3ZiMTlEM29LNUp2d21XZFhFS3J2RzRL","repeats":1},{"count":466000,"lower_bound":"dXJ4aGhyM094ZzQ2NkJyTFV3YU1RZHQ2MFZpbXl2c1NXY1FXMw==","upper_bound":"djB1QWI0dWRHcw==","repeats":1},{"count":468000,"lower_bound":"djNvT1RRS1RNV21XbElFbw==","upper_bound":"dkdla2F0RFVxNnp4SGsyT0ty","repeats":1},{"count":470000,"lower_bound":"dk5sbGNVMFdjVEw=","upper_bound":"dllxcTZ0dTR1NGZrbEVQU25Qc2lNYnlZZGRhWnJxU2VEdw==","repeats":1},{"count":472000,"lower_bound":"dmNmYzJOdWpGcldoU3gyUnUxWGEzYTlFbzY5SHpzRVY0dHdoIDJS","upper_bound":"dnhaQUNReGE2QlNIUlJzOGtXbTl1ZHVOenE3eQ==","repeats":1},{"count":474000,"lower_bound":"dnpGTG5tZmJTSFJLQw==","upper_bound":"dzFHa045cmtKaUNXeFExWFdEeGdTIGc1TlphLDMzTXluMmNoNw==","repeats":1},{"count":476000,"lower_bound":"dzRqWmNQNjEyWHpVekxRbDF0eno5UDRxT25hbUI=","upper_bound":"d0FHWnlGUzFEVkFHWjJCMDl6cW9PZGYyIHFmSUU3Zw==","repeats":1},{"count":478000,"lower_bound":"d0dCS3Vpc0RtQzc1b20=","upper_bound":"d00gWjNuZjFHQTFH","repeats":1},{"count":480000,"lower_bound":"d05qandiSUtNSjVZWEI5YVU3aGtv","upper_bound":"d2M0MzI2QUYyTzVMTlcwR0tJY205SFowQThUVGUgVw==","repeats":1},{"count":482000,"lower_bound":"d2NCZXg1QXBnMFpZakk=","upper_bound":"d2drZ2Z3dlNTNWdsS2RpUVpPOG03U1BhIGJtTyxtQmUyNWRw","repeats":1},{"count":484000,"lower_bound":"d2xFRzJxNTlQalVnQ1l4N0czaVdCTUkyMzZRVDJaRlJacEQ=","upper_bound":"eEJLWiw1IEc2UnQ1ZHFrWEFmeUlIOU9IV0hRTg==","repeats":1},{"count":486000,"lower_bound":"eEYxOVB2IDFrSmt4aERjd3UsZyBqRXY=","upper_bound":"eFVHYjBjNmJRWHhLMw==","repeats":1},{"count":488000,"lower_bound":"eGJJRldXVkRaYmZNN0hK","upper_bound":"eHNlcVZFaXk3WTU3ZFo1MFc=","repeats":1},{"count":490000,"lower_bound":"eTA2UXNobE5YVklsSDVNeVZQWmQ3Z1FVSVJRbQ==","upper_bound":"eUxWNnFIdnJMZXZPcTRnIEs0clQ2NCBWZA==","repeats":1},{"count":492000,"lower_bound":"eU9GNzg1TzBWbEhmIENReG1qdkVYNVlpclowdkVlZk1PZkx5","upper_bound":"eVZ0TzFQT01QTkcxdDQyUjB1eXZreUo=","repeats":1},{"count":494000,"lower_bound":"eVdpMG5EOWVHZVQ=","upper_bound":"eWhVT09yckQ1MTU=","repeats":1},{"count":496000,"lower_bound":"eWtHZmtGZnBVd3ZycmswZ0NjS1Bt","upper_bound":"ejUxLFc2eW5SeFBuVXRjRg==","repeats":1},{"count":498000,"lower_bound":"ekJrSThVLGtZUTlZbGxYR1dEVDg=","upper_bound":"elhYY2ViQVpvRzhaZ3FIcFdDdUF5RHE3ZDJkNg==","repeats":1},{"count":500000,"lower_bound":"ellNdU9Gb3Bpb1FEbTg3bFpTTHl4WWRXZ3k0aw==","upper_bound":"enF0TkdUT0FhZ0hobWZkR2hZeVVaQUc5Ym5nWm1y","repeats":1}]},"cm_sketch":{"rows":[{"counters":[239,255,254,234,228,237,269,238,236,232,262,253,204,268,255,224,273,255,257,257,246,249,268,254,250,214,254,252,254,230,218,252,224,246,267,229,235,253,235,230,240,240,231,228,261,210,250,240,245,249,262,242,235,258,242,230,262,242,222,239,226,244,258,240,250,261,258,233,238,246,253,245,239,231,263,245,259,224,249,239,246,234,244,259,256,258,251,228,235,229,237,242,234,238,240,233,227,256,246,244,276,263,232,223,242,225,257,230,223,235,273,245,230,234,247,260,247,242,224,249,266,249,260,242,248,235,249,276,225,233,250,256,209,244,259,230,214,262,252,230,265,248,263,293,263,245,262,244,226,250,249,258,229,268,256,243,240,255,243,241,238,228,263,226,234,250,246,255,247,249,239,239,237,243,234,269,255,235,207,237,230,222,260,242,217,216,238,254,227,261,237,239,259,234,247,257,240,216,236,235,243,245,285,258,232,263,286,270,252,231,226,243,232,218,234,274,204,251,256,237,261,236,241,255,235,246,249,236,249,232,223,254,263,241,249,235,261,256,251,209,262,281,246,234,246,285,247,250,268,215,255,261,243,231,253,262,238,225,225,250,242,250,246,243,232,227,253,238,259,255,263,251,252,277,256,228,223,234,264,235,262,239,237,232,217,226,241,235,249,228,253,262,232,272,238,253,227,263,228,247,248,259,248,230,223,251,239,245,237,231,238,239,255,259,242,240,251,230,255,246,256,240,228,233,255,245,237,228,252,255,238,243,263,245,250,242,224,251,244,244,260,265,247,244,248,218,249,255,262,244,272,242,266,236,241,242,207,248,259,254,253,233,265,237,259,284,232,234,234,255,249,260,230,263,240,245,251,199,238,243,266,204,246,227,243,243,233,225,245,248,234,231,261,274,240,211,257,233,233,243,254,245,272,239,231,262,247,258,276,255,262,232,256,230,224,237,220,248,250,228,275,227,244,249,287,247,245,261,263,238,259,241,252,221,242,228,247,236,244,217,251,232,269,214,240,231,229,224,256,229,252,243,248,211,240,240,258,246,228,227,272,233,295,245,200,267,233,245,233,247,240,237,270,224,229,260,270,247,260,245,261,258,233,250,239,268,240,264,243,273,249,223,234,258,234,258,255,236,245,222,246,252,258,231,244,248,245,258,252,277,233,258,273,266,234,247,255,246,237,248,237,250,247,257,269,245,228,234,246,247,235,248,251,264,253,233,251,248,222,237,234,243,251,231,244,251,242,259,245,247,238,239,228,252,249,236,262,246,252,229,255,225,244,246,252,224,258,252,231,255,248,245,236,254,242,249,224,254,243,243,229,233,267,258,261,261,227,259,270,240,229,228,255,250,237,211,235,245,224,230,258,213,254,232,220,264,241,269,230,264,271,242,282,245,226,260,255,290,246,258,235,252,228,245,256,244,246,246,220,246,225,254,259,248,264,272,254,237,238,245,270,270,238,247,243,221,236,250,261,209,262,229,265,236,230,246,224,242,255,264,213,262,248,242,242,276,236,229,232,233,226,265,256,222,240,250,233,244,253,248,240,262,263,252,239,243,267,255,234,225,275,274,250,225,259,210,230,243,267,241,231,245,247,237,236,252,283,220,216,254,225,271,240,261,209,244,248,221,251,252,256,228,235,260,222,229,247,232,227,253,275,246,272,231,224,224,239,264,237,237,222,264,246,250,236,261,216,235,261,239,255,217,247,227,257,240,259,259,256,231,251,263,225,254,244,261,254,240,248,270,240,208,257,221,241,255,237,235,258,241,236,236,216,230,246,237,251,233,234,239,242,259,215,262,237,238,252,235,247,242,252,238,274,239,254,222,219,220,248,263,247,238,262,262,248,213,234,275,233,269,237,227,236,235,256,204,250,257,218,249,254,229,263,244,240,235,251,244,240,251,239,254,240,240,236,261,262,256,245,250,253,235,251,251,249,246,248,260,269,248,249,227,253,250,239,237,231,245,223,227,249,250,247,256,246,247,232,284,236,250,230,235,255,235,261,249,250,260,259,223,243,243,241,232,266,258,230,205,233,242,266,228,242,273,263,239,223,263,253,251,229,240,221,247,229,245,219,208,242,244,219,232,202,249,259,264,229,230,274,277,261,243,243,268,263,221,256,222,254,255,237,227,227,230,246,215,220,241,256,230,243,235,227,213,219,225,225,246,241,247,233,260,255,246,242,254,265,261,284,226,261,251,217,256,237,261,241,262,243,243,235,226,262,233,248,239,250,274,230,285,253,245,241,233,224,261,244,258,235,247,267,243,253,244,232,218,208,244,261,243,244,265,240,212,241,241,211,236,269,255,213,246,230,267,220,239,220,260,242,250,240,249,225,232,268,237,253,244,260,248,246,263,268,254,272,235,249,252,222,233,218,245,264,260,243,232,240,258,227,236,230,247,223,235,229,241,253,266,229,226,219,247,226,256,259,243,237,222,249,249,224,262,253,264,228,242,263,240,228,263,237,255,287,228,234,246,276,255,231,235,218,220,233,258,267,268,237,235,234,234,231,238,281,255,220,260,260,240,256,260,230,233,245,255,282,259,261,265,229,244,216,247,238,239,221,252,277,245,253,255,222,243,254,221,255,236,227,227,238,254,247,227,236,256,247,262,238,270,234,260,232,265,262,220,258,252,255,207,239,208,240,206,265,246,258,245,268,230,244,273,252,237,259,229,258,260,238,241,252,250,251,257,253,258,267,223,245,242,219,267,249,266,234,245,240,246,226,270,250,265,221,243,212,233,256,252,223,269,241,239,235,270,225,233,263,234,237,228,248,222,237,278,253,254,236,235,253,243,230,251,257,247,244,221,243,226,264,258,249,226,239,223,251,246,244,286,275,251,254,240,238,286,245,255,226,276,266,241,225,230,242,255,258,246,247,243,235,252,237,217,233,259,264,257,269,268,236,264,224,244,229,227,251,260,243,257,226,246,248,219,235,240,230,233,252,245,241,265,259,233,230,259,259,246,227,236,229,240,232,244,231,242,252,258,234,249,237,224,263,236,248,252,253,263,232,246,249,233,233,251,226,225,265,244,240,236,254,237,232,268,260,247,265,260,230,243,259,269,232,271,240,225,255,264,239,260,262,241,252,242,219,228,227,249,263,243,222,231,221,233,242,246,242,263,219,248,255,250,229,264,227,233,256,228,230,255,250,258,253,239,253,247,258,225,245,243,252,227,257,239,234,240,235,255,261,258,242,255,242,272,252,251,230,261,248,249,238,227,232,241,258,251,261,254,252,234,222,259,253,232,232,227,252,233,249,231,229,238,236,242,256,241,255,271,243,231,241,236,256,254,227,233,237,240,227,245,214,222,231,276,236,242,245,254,235,254,264,234,221,209,245,239,248,248,267,237,229,236,232,260,241,232,251,214,250,241,234,208,259,253,258,241,245,227,239,239,242,239,259,239,230,247,235,248,217,239,242,254,239,260,258,235,272,236,246,237,230,243,239,217,236,251,228,229,253,229,246,222,235,223,244,219,237,245,233,250,230,240,260,239,243,243,236,232,266,243,233,276,259,261,258,240,236,244,252,232,242,234,246,256,203,240,269,249,246,230,239,249,243,236,236,253,230,255,229,245,261,220,258,259,252,215,238,227,248,242,235,239,266,224,225,248,248,234,259,216,241,236,232,234,248,238,222,249,221,247,257,263,236,271,221,259,265,229,254,251,256,216,232,237,244,244,266,227,242,225,241,242,233,231,272,231,251,238,253,262,262,233,226,291,218,237,266,244,237,208,242,239,232,223,233,226,219,257,230,223,213,257,231,283,236,226,251,237,254,229,221,253,248,259,238,263,228,235,242,288,224,241,243,236,251,260,218,246,261,224,233,258,260,242,233,258,259,210,232,243,255,239,225,231,249,242,219,249,261,284,255,287,236,278,259,227,272,246,262,228,263,260,257,238,228,264,256,249,239,244,240,245,251,272,253,257,257,221,218,240,273,218,253,203,266,238,219,247,243,225,259,245,238,218,239,270,231,271,240,258,234,246,241,233,260,241,232,237,243,228,234,218,214,221,227,231,211,227,256,247,226,243,250,226,249,265,229,262,259,247,249,234,234,248,256,231,247,212,236,224,239,247,252,272,243,233,217,225,260,278,233,249,276,246,237,235,258,274,210,234,206,263,262,223,241,225,252,236,239,235,222,249,211,240,247,286,227,253,223,263,266,246,225,250,238,258,223,243,248,232,280,222,243,252,238,254,273,261,253,264,274,249,245,231,239,218,221,247,238,258,220,273,256,263,230,283,216,227,276,252,253,256,246,225,232,266,257,221,228,254,261,272,259,285,276,283,233,255,248,247,226,234,252,264,231,242,221,227,239,267,229,224,229,237,244,240,249,271,235,231,242,252,233,244,237,250,245,237,233,243,228,271,233,241,240,218,242,279,242,267,231,277,234,245,254,236,230,257,231,244,227,263,289,260,239,239,265,228,270,218,215,241,227,257,248,262,236,261,255,251,260,242,210,232,249,280,249,222,253,229,254,253,229,213,251,220,243,253,260,223,267,243,260,225,268,242,250,252,233,252,270,250,236,230,241,247,238,260,238,243,247,232,217,272,245,228,250,250,265,261,251,252,253,257,260,234,248,242,270,261,266,249,228,237,244,266,249,265,224,261,245,237]},{"counters":[256,248,245,226,239,249,282,256,223,235,237,271,229,233,253,264,254,243,229,232,217,268,244,232,234,249,265,233,215,268,258,230,239,240,251,231,235,239,238,209,249,246,236,250,255,205,244,237,248,234,260,245,259,266,246,264,255,251,222,260,254,240,241,249,245,241,246,258,241,235,229,225,256,264,244,259,247,255,225,242,218,209,235,245,238,220,244,248,211,233,241,258,233,265,261,248,210,231,224,263,272,228,239,235,238,239,250,227,233,227,250,231,225,239,248,256,239,263,226,262,248,228,244,242,208,223,254,243,249,223,229,235,257,241,238,251,236,221,250,237,232,234,242,222,265,226,228,275,281,240,214,229,261,248,270,233,245,242,237,231,238,249,276,242,235,240,239,255,222,232,241,240,260,222,223,254,232,239,234,249,237,245,244,238,250,261,274,264,254,241,233,240,211,262,218,233,236,265,261,243,285,241,224,251,225,228,246,240,241,233,247,247,235,252,245,245,242,260,266,268,230,238,263,220,234,234,228,235,230,224,270,258,225,227,248,221,252,251,255,230,245,246,219,226,221,266,244,212,231,249,266,215,264,241,240,217,234,234,244,251,250,248,248,256,244,247,285,245,254,276,263,244,233,247,240,240,276,251,232,228,261,258,234,247,258,254,241,231,252,261,254,241,237,250,253,246,225,242,253,220,247,246,233,239,276,255,279,238,256,279,241,229,263,263,277,237,255,217,266,232,259,256,247,260,251,231,274,231,259,238,236,234,243,248,238,266,209,255,250,238,249,238,240,236,249,241,272,242,206,235,256,233,249,255,229,251,240,238,269,239,262,233,246,241,270,264,240,277,273,262,251,210,218,227,230,255,230,228,248,259,238,247,250,228,233,251,246,235,248,247,245,248,224,282,219,230,254,226,228,225,235,250,224,215,253,257,251,279,243,247,263,258,252,219,230,239,237,242,258,224,252,224,238,263,275,225,251,235,249,223,211,263,262,249,251,241,249,240,247,273,240,235,242,225,270,245,244,222,257,239,245,242,259,258,233,240,228,227,277,244,247,249,264,277,239,235,253,218,237,235,263,228,232,218,269,267,242,239,229,250,256,240,257,240,251,239,274,244,243,261,252,256,253,232,229,234,241,232,269,247,241,243,252,244,238,267,252,265,259,255,271,229,247,223,223,259,232,270,248,246,225,246,242,246,238,233,231,226,233,244,237,265,251,251,226,218,258,266,241,250,252,221,261,243,240,250,278,231,243,238,244,255,226,253,263,254,272,259,249,263,246,258,273,242,211,231,230,241,256,253,249,236,235,242,224,254,224,256,241,246,248,254,276,245,263,256,236,248,253,235,253,239,227,217,246,253,255,225,256,245,231,260,263,240,256,230,217,254,243,289,218,267,248,244,220,241,258,253,258,234,243,236,251,228,255,225,241,237,243,252,255,210,240,254,242,258,247,221,220,245,240,238,237,252,236,242,242,232,215,262,262,238,240,253,254,275,241,234,252,255,268,244,271,250,247,249,254,245,236,225,252,231,254,239,236,237,213,226,266,235,260,251,276,258,233,259,237,240,264,236,223,243,256,239,221,267,230,259,240,261,220,227,247,235,227,235,255,256,249,223,260,251,275,249,248,239,206,260,227,240,229,234,280,245,250,239,265,246,238,245,253,235,219,232,225,251,236,251,273,264,258,238,243,264,252,243,228,224,256,236,231,253,260,246,231,262,284,277,263,254,212,225,269,295,233,265,259,263,248,218,237,230,229,233,266,244,277,228,247,263,238,223,224,236,248,252,240,228,258,252,244,255,272,248,252,236,243,236,285,257,236,227,258,250,245,257,209,232,263,259,224,242,287,241,267,234,233,266,247,253,256,219,247,242,251,282,232,238,267,230,250,261,244,263,253,230,252,216,262,206,231,225,242,270,280,242,239,268,258,222,229,225,247,250,241,233,231,250,233,255,249,252,251,268,234,240,261,245,275,248,240,235,252,254,250,238,244,248,241,227,230,251,238,245,239,245,256,267,236,231,239,249,242,254,280,258,235,242,231,240,229,238,238,216,255,252,264,238,247,231,259,247,272,244,241,245,240,232,258,242,227,244,235,229,258,236,243,250,260,232,236,233,257,248,251,259,244,230,258,243,237,224,251,219,244,240,243,240,242,251,213,258,251,234,238,240,207,249,251,241,223,240,269,271,245,236,274,227,248,242,254,252,259,251,273,254,260,234,256,216,269,249,248,261,269,207,217,215,230,220,254,272,232,226,235,225,251,231,268,241,248,247,274,237,239,247,274,234,239,231,249,236,260,224,251,237,246,227,265,231,231,234,233,242,248,266,228,251,229,228,246,278,257,264,233,248,229,252,218,257,250,259,245,210,249,239,265,231,260,256,230,227,226,231,239,224,230,251,264,257,253,240,266,232,218,248,268,237,236,243,253,231,278,258,281,256,240,234,257,241,239,217,222,240,231,266,251,254,246,255,210,227,260,242,202,250,239,249,254,233,259,243,235,257,226,234,239,228,218,263,248,245,212,250,250,240,228,224,256,238,198,229,258,257,222,223,227,255,251,242,260,235,258,217,242,235,247,236,244,223,249,253,244,235,233,226,248,243,244,241,232,231,242,229,254,241,237,247,260,237,240,247,242,246,241,266,249,259,266,269,252,224,231,246,245,255,237,242,245,228,272,252,235,254,234,251,260,259,270,237,249,265,259,240,231,233,237,240,243,262,242,242,245,239,223,238,243,233,213,249,230,228,250,224,222,266,244,289,238,246,234,246,242,267,286,232,233,251,228,228,247,241,229,248,240,234,237,259,237,266,251,258,223,241,227,219,243,254,259,241,227,236,246,243,243,261,257,243,273,240,227,228,243,234,246,233,237,242,248,244,255,246,247,260,218,233,246,223,204,241,256,261,270,257,250,266,230,246,266,240,237,249,250,261,257,281,239,255,254,232,228,247,253,235,272,268,260,249,227,261,223,258,241,253,245,256,246,270,271,235,237,267,228,226,221,220,239,238,232,230,260,232,239,236,239,246,249,237,241,244,223,221,224,225,228,218,219,227,241,251,267,251,231,241,256,247,246,246,255,252,254,237,284,246,255,232,269,227,268,268,235,235,240,243,230,245,259,238,215,225,269,233,238,231,251,224,232,257,237,238,228,263,248,246,248,227,242,226,261,250,241,218,248,236,285,252,276,225,244,242,256,250,253,240,261,220,251,270,242,230,235,248,228,253,257,253,247,248,235,221,227,230,247,251,268,246,267,226,227,254,247,247,247,214,254,247,232,249,230,208,227,238,230,250,222,216,220,255,238,249,237,234,228,271,245,242,259,255,237,244,225,233,252,232,254,265,254,217,230,249,237,212,232,242,229,244,249,230,219,248,233,237,234,256,235,262,251,263,231,211,237,273,262,271,256,258,264,254,255,220,267,231,236,258,230,227,246,248,233,252,282,246,243,246,240,244,264,249,235,245,241,248,240,225,226,239,234,275,217,256,246,228,267,251,249,250,232,256,239,247,253,265,241,249,248,273,272,233,232,259,251,245,261,239,259,245,242,254,247,263,228,283,231,246,245,250,235,244,269,234,257,251,241,234,259,244,248,271,262,228,243,238,254,248,237,243,265,265,256,201,239,256,258,278,248,245,235,245,283,249,252,254,242,229,239,242,211,220,223,233,219,244,248,240,237,255,251,247,259,246,259,239,249,233,228,262,246,226,249,266,228,237,235,225,244,218,248,264,217,234,250,227,207,246,250,236,236,228,252,259,263,256,263,249,227,224,216,249,235,241,196,207,243,230,250,260,252,266,217,244,223,276,229,264,239,237,239,239,243,245,250,243,237,229,237,254,221,221,218,251,253,254,231,259,288,253,229,269,220,223,264,237,262,245,237,267,228,257,208,236,213,264,236,261,242,223,242,216,267,220,243,244,237,289,229,249,220,245,259,247,258,269,230,251,257,240,244,272,225,245,222,231,245,248,251,226,247,266,246,275,253,247,237,240,257,215,263,234,254,237,244,251,248,223,233,241,262,215,267,233,226,252,256,256,256,237,242,249,245,240,239,225,233,246,259,238,233,233,271,230,255,254,247,245,247,219,254,256,257,227,216,264,251,224,261,239,261,224,221,242,251,285,240,259,276,244,271,230,256,223,246,249,238,242,222,248,249,242,265,257,253,223,260,214,236,237,240,224,253,244,255,251,215,270,251,238,221,241,229,251,254,226,286,204,291,280,232,227,221,240,255,238,222,241,246,227,237,243,225,249,231,255,250,242,255,215,275,231,250,264,289,233,238,258,263,263,228,221,248,256,244,242,289,261,242,253,239,253,232,255,244,266,236,236,244,212,247,225,237,234,233,233,240,236,239,261,254,225,229,246,230,234,246,256,271,246,241,226,253,230,248,236,257,248,270,256,228,278,258,221,271,220,255,252,250,252,258,242,246,244,254,238,250,250,255,253,233,250,238,256,241,254,229,238,248,250,249,254,230,271,257,262,248,262,258,227,236,230,253,275,242,246,256,236,224,224,264,228,256,250,220,248,241,258,248,245,237,226,279,253,251,233,244,256,255,237,243,248,264,231,239,261,270,245,241,222,228,253,226,221,247,236,239,250,256,228,252,237,265,245,257,233,240,239,244,253,246,254]},{"counters":[227,266,253,241,274,242,221,230,258,235,250,232,250,244,251,218,249,257,265,263,235,237,219,227,241,233,271,239,246,259,238,249,235,217,251,236,249,252,249,227,247,256,250,219,239,241,244,239,217,256,263,261,220,233,247,243,226,228,264,254,244,248,259,261,238,243,250,270,227,243,240,234,222,254,259,221,249,255,234,268,241,255,218,244,240,229,235,241,241,233,255,255,212,257,243,265,226,257,222,240,232,265,230,216,232,266,261,245,234,224,257,272,255,249,222,256,246,251,236,232,255,256,231,253,254,223,266,234,243,268,254,236,210,231,227,241,264,277,244,249,249,240,220,249,221,225,257,260,247,251,248,237,255,246,243,240,258,255,245,245,235,269,280,258,262,242,250,252,251,235,271,243,225,267,238,251,243,239,253,239,223,217,193,226,249,224,235,244,249,226,233,272,246,238,229,247,260,253,211,266,265,238,260,241,238,244,220,243,240,224,242,246,247,282,255,245,263,253,237,239,244,230,242,236,239,224,231,261,232,244,251,244,245,242,231,269,247,249,250,236,253,211,243,245,236,239,247,246,256,219,264,250,254,238,258,226,273,246,244,276,240,266,223,241,255,224,231,252,263,217,231,243,235,239,240,236,232,234,239,268,258,222,244,274,211,226,246,245,257,223,276,237,219,258,233,264,246,221,248,237,229,238,252,248,249,215,222,245,238,243,258,248,226,236,229,230,244,234,231,265,261,230,241,250,249,240,252,257,250,246,278,236,217,221,214,268,224,259,276,236,252,244,254,276,248,229,247,199,269,248,240,255,220,245,276,257,266,248,244,218,258,255,244,234,267,222,220,234,247,255,237,253,242,243,236,247,250,239,222,277,233,261,234,224,228,216,277,234,257,248,227,250,239,213,255,266,243,237,247,248,241,267,245,252,257,256,231,207,230,265,230,245,242,268,242,233,203,249,249,235,253,258,263,250,219,265,245,240,222,245,228,238,217,249,227,240,229,224,273,245,262,246,263,264,237,263,229,250,239,242,227,264,230,237,236,238,213,255,234,230,227,234,251,260,281,281,231,228,251,231,238,254,260,212,282,231,248,273,236,244,234,245,238,226,253,247,271,228,223,263,233,241,219,238,261,249,229,227,266,258,220,259,240,261,232,240,263,251,232,273,227,240,231,256,255,244,247,254,217,214,254,215,256,260,229,225,237,228,244,247,245,271,220,260,229,233,238,246,269,251,254,236,239,251,234,250,272,244,245,223,247,243,264,237,235,236,255,231,279,228,241,249,244,240,228,230,275,262,250,272,253,222,256,261,256,255,223,254,254,265,254,264,211,221,232,240,266,245,247,243,247,233,235,261,222,241,232,264,256,262,264,246,228,226,217,272,254,244,225,255,238,221,254,252,238,264,239,252,244,252,248,230,262,245,247,235,229,239,257,268,238,283,251,238,262,249,230,232,240,230,232,237,274,261,199,240,254,256,247,250,239,227,248,230,239,221,234,261,228,231,254,262,270,237,252,270,243,240,230,236,238,232,219,248,216,245,253,278,231,230,260,257,227,220,268,244,252,244,215,250,207,232,251,229,255,257,266,276,240,217,269,243,231,250,269,245,262,275,248,214,264,209,262,252,251,256,237,238,229,247,218,250,240,234,251,224,269,225,261,231,260,208,258,268,222,221,255,238,261,239,216,308,239,246,239,234,236,241,260,226,219,243,251,259,231,248,250,251,242,231,241,247,236,254,247,235,252,234,229,243,207,240,218,271,246,252,238,251,286,251,221,248,238,270,259,260,237,259,263,222,243,238,272,281,269,238,263,244,229,209,256,259,234,214,245,239,232,250,240,218,259,253,244,248,252,251,247,247,252,244,250,260,228,271,246,274,253,262,241,256,259,263,271,270,226,253,249,244,230,256,258,231,242,235,229,245,230,230,258,252,267,222,231,257,254,259,233,250,262,227,216,240,232,235,232,255,238,237,234,245,255,274,254,258,262,247,237,218,254,257,217,246,255,204,242,264,236,232,252,230,255,258,251,260,230,228,256,228,235,262,241,236,237,235,220,226,239,230,242,250,230,264,238,250,224,249,230,260,252,207,221,222,279,256,222,250,232,233,231,235,259,251,248,254,246,260,225,230,267,251,234,254,267,253,256,222,220,218,250,239,234,241,278,244,244,221,245,242,247,269,251,254,245,247,240,226,265,253,236,222,229,240,236,269,237,271,242,243,238,264,246,242,243,230,232,229,236,243,236,235,252,257,241,257,260,252,225,244,229,261,240,220,217,249,239,260,238,235,244,224,255,247,236,258,235,208,230,227,240,237,230,232,224,230,270,242,252,251,228,252,269,242,248,236,259,251,265,255,266,261,250,233,256,250,243,224,227,257,241,260,251,250,252,228,228,249,254,239,258,257,262,237,261,246,269,218,232,242,234,217,238,250,210,239,263,241,241,239,253,247,238,257,257,253,245,220,216,249,245,245,233,253,258,262,236,249,258,239,238,247,216,245,260,248,243,227,235,248,218,231,261,243,258,236,238,224,242,242,254,247,231,256,241,224,233,248,249,263,258,262,264,247,258,215,256,233,233,250,222,247,243,249,253,252,230,255,238,237,243,248,227,231,221,253,256,260,219,247,227,256,264,254,227,224,268,226,276,245,229,248,274,235,264,249,265,213,245,229,221,262,261,251,276,229,226,223,263,248,226,274,232,257,246,238,253,244,245,268,286,225,269,255,217,238,217,224,233,270,221,233,230,257,273,292,249,238,243,268,258,236,238,238,241,234,224,251,210,265,226,259,241,208,261,248,224,254,249,238,283,270,246,219,236,232,245,233,249,261,241,212,240,222,233,257,266,210,248,260,231,234,229,235,244,247,239,250,208,225,248,290,250,253,268,247,209,233,259,249,225,251,220,264,242,245,242,258,253,277,236,241,212,245,268,239,248,247,262,237,230,282,278,246,265,248,276,238,237,254,264,257,255,220,248,227,247,263,243,221,270,238,277,231,272,248,230,251,265,241,233,232,199,248,228,214,256,242,242,248,224,260,245,258,288,245,257,236,254,267,267,237,240,235,234,255,228,252,255,257,250,246,264,279,216,250,251,235,233,238,217,244,249,223,262,261,250,273,250,241,237,239,235,251,245,237,241,237,228,219,261,253,221,253,266,266,262,264,227,249,226,248,246,237,270,260,228,241,243,266,254,213,238,246,222,240,261,240,218,235,260,250,235,253,251,250,263,260,221,230,263,271,232,216,234,210,241,223,218,258,238,265,239,247,226,262,230,239,243,253,255,213,253,278,223,255,246,230,251,260,228,260,203,230,227,246,257,226,215,249,245,240,246,238,215,230,227,231,241,236,247,239,270,236,232,260,248,228,268,269,238,245,241,266,243,261,230,242,214,239,243,223,230,233,244,249,226,242,255,230,240,236,263,243,251,276,254,270,263,240,233,240,251,237,241,250,234,228,210,255,241,242,251,231,235,248,252,216,266,252,253,257,232,266,242,250,269,214,251,231,213,238,227,250,280,254,251,252,248,237,243,237,233,269,234,268,236,236,264,217,245,253,232,253,252,255,250,248,268,222,252,274,230,247,250,238,250,234,241,234,239,238,245,262,262,252,247,247,281,261,233,232,242,250,232,228,228,259,256,240,262,250,227,267,251,230,238,238,246,227,243,217,262,261,255,249,246,239,224,240,275,236,259,240,277,234,247,234,241,254,256,251,249,224,243,261,246,213,223,238,234,228,255,255,241,230,248,229,283,223,229,256,257,240,226,231,228,221,254,209,240,235,255,267,270,223,244,233,248,235,222,253,251,263,239,243,224,259,236,260,267,236,222,235,259,223,227,225,218,232,237,244,245,235,214,250,228,250,239,277,253,272,246,235,252,268,231,241,231,249,252,218,236,246,239,259,247,253,248,242,274,215,268,228,245,230,234,228,222,277,228,248,240,280,259,236,219,229,242,231,232,258,242,233,257,252,255,225,292,230,248,232,212,264,257,217,257,244,264,244,237,264,246,213,238,252,264,228,240,262,240,244,246,237,205,260,228,206,225,211,245,253,227,237,237,227,247,267,263,226,226,255,232,239,246,246,280,226,237,237,274,239,245,241,225,264,234,234,238,248,250,249,239,271,240,217,267,229,267,255,256,210,287,255,242,248,251,260,244,256,242,242,232,239,258,253,267,268,271,253,246,245,240,240,260,230,223,234,256,238,215,273,276,242,283,248,246,223,253,255,261,239,242,283,243,230,242,248,251,269,259,238,231,248,241,225,229,248,230,235,228,250,238,252,246,266,244,255,238,241,251,235,285,239,247,228,227,217,260,246,270,249,256,232,250,254,247,246,219,247,241,253,253,242,209,216,239,255,251,236,243,230,251,263,255,229,262,275,263,242,243,242,255,250,272,274,249,225,273,245,223,258,239,256,269,228,228,243,242,242,245,235,238,258,231,216,231,257,264,260,227,239,240,251,243,232,260,248,241,249,238,246,241,245,205,211,233,281,270,266,263,235,254,240,250,253,264,241,238,236,228,273,249,247,260,241,241,252,229,275,236,235,285,237,225,251,271,257,264,235,216,229,258,240,263,278,230,242,247,249,249,262,223,253,255,209,242,267,239,255,261,293,254,231,243,226,268,240,248,232]},{"counters":[249,243,260,263,244,235,230,231,232,220,258,227,257,257,267,278,266,261,244,249,259,234,251,240,269,238,258,203,234,243,207,225,251,271,247,259,260,249,263,249,203,237,207,250,232,230,244,259,231,235,257,264,231,243,242,224,258,242,241,257,250,254,244,259,241,260,226,230,248,237,286,231,241,260,272,238,218,257,234,224,264,230,251,254,232,233,214,273,237,256,234,227,241,263,253,214,224,249,258,254,236,245,244,258,264,242,274,243,244,236,236,245,249,265,233,229,249,234,270,221,252,255,253,231,226,273,248,252,248,261,240,273,233,245,236,206,247,261,250,249,270,232,249,238,241,249,254,230,289,258,269,236,259,235,264,238,241,262,254,256,248,232,241,253,258,233,235,246,238,226,234,227,226,266,246,242,237,223,266,244,270,247,223,218,272,256,251,262,261,268,250,249,244,247,229,268,225,229,225,233,259,240,228,258,254,246,235,220,254,249,281,245,255,275,242,243,255,236,231,243,260,230,237,258,236,232,243,263,237,226,230,248,246,238,259,263,265,258,238,253,220,235,267,256,249,243,245,233,234,249,237,225,274,236,238,238,236,249,257,246,242,258,250,264,238,240,249,247,249,253,254,260,228,232,230,226,231,254,230,258,248,260,218,262,250,258,224,265,242,278,250,244,239,242,212,250,215,228,264,253,221,253,249,225,262,247,259,258,235,251,228,248,254,237,234,262,256,244,244,241,208,222,255,262,219,256,258,243,242,250,252,235,243,265,236,245,253,233,247,233,243,230,252,244,206,276,268,242,222,276,247,258,231,229,236,253,259,235,239,241,240,236,226,256,254,257,256,249,213,273,248,243,225,239,259,204,262,238,242,247,237,265,258,221,219,247,258,255,248,250,225,240,242,246,261,227,230,250,226,244,259,234,243,239,249,217,240,221,237,229,232,251,268,262,237,233,229,245,250,247,229,256,240,242,271,238,232,252,245,257,254,257,258,250,220,241,229,240,237,232,236,229,271,242,271,256,248,269,266,240,212,266,266,230,232,250,224,211,234,244,258,272,248,245,266,235,254,243,211,245,274,280,257,266,227,272,234,256,243,256,254,271,200,236,249,233,233,259,227,274,251,243,238,277,235,250,250,230,247,248,239,244,235,221,263,253,267,240,227,222,264,247,263,252,262,211,251,250,239,255,223,215,258,235,240,211,230,242,258,218,254,233,248,231,248,259,256,219,238,247,253,230,218,238,250,220,248,260,211,280,229,225,222,247,270,246,255,253,254,254,222,260,216,246,229,224,251,234,230,248,257,251,244,231,235,225,229,262,248,253,236,245,246,258,246,248,247,265,246,250,269,262,235,223,231,272,253,264,256,229,261,221,258,244,238,250,229,252,264,232,235,238,247,258,272,269,242,220,243,245,244,266,253,209,243,226,224,243,250,243,225,229,241,233,242,257,274,204,214,264,242,229,225,269,252,246,255,258,261,271,239,234,241,237,232,234,258,237,256,244,238,261,242,225,232,253,225,229,271,234,250,221,251,227,243,237,247,249,236,255,230,246,251,233,238,264,221,236,269,250,222,256,259,238,235,233,228,234,253,260,240,230,250,248,226,239,244,234,267,244,239,234,240,224,270,237,255,238,258,235,244,220,269,241,251,242,252,211,238,227,242,224,249,247,260,236,246,265,279,254,275,281,263,242,239,247,231,259,217,249,267,244,260,234,252,221,226,262,269,251,251,254,246,253,244,229,244,245,257,245,243,257,239,243,259,236,249,269,238,243,231,215,246,223,223,236,251,237,270,238,255,232,254,229,255,239,269,255,237,229,252,235,258,245,244,234,255,241,259,240,263,258,230,259,230,246,255,247,223,248,256,266,245,251,221,252,234,225,242,236,226,246,239,236,206,244,236,253,236,246,250,235,253,268,245,250,199,266,269,229,261,241,253,249,260,251,248,239,241,246,261,230,213,250,255,276,254,245,250,247,222,241,259,251,276,221,278,253,246,238,260,263,229,237,220,249,258,256,231,229,246,208,247,279,235,264,268,245,221,236,265,261,212,231,237,232,256,227,229,222,247,245,260,263,270,240,259,218,237,230,269,228,247,240,234,235,264,254,258,250,251,244,255,239,244,255,231,244,255,252,252,231,250,273,255,263,226,239,217,249,240,251,239,236,258,238,258,225,242,247,234,217,253,234,235,242,242,247,228,237,254,264,238,228,267,222,244,246,224,264,264,249,272,254,251,242,236,266,203,233,257,266,235,248,223,272,240,220,243,247,268,266,242,240,240,251,229,267,235,226,273,236,232,228,233,249,229,266,231,250,255,242,238,269,221,231,253,271,243,234,256,236,245,245,273,242,248,243,251,247,237,245,251,244,257,232,246,231,242,204,231,243,241,209,222,271,237,232,233,229,248,230,225,216,233,245,236,266,236,246,275,236,235,264,244,245,223,232,230,259,254,244,252,241,246,225,247,254,250,279,304,249,241,226,274,264,256,251,257,265,221,237,232,246,266,251,256,255,251,228,248,237,263,236,233,233,253,227,230,278,266,228,255,238,224,249,240,220,244,257,239,260,248,219,227,230,272,235,227,263,251,229,253,265,237,252,212,272,234,208,249,249,249,256,215,244,234,243,259,220,255,240,226,252,232,232,259,251,228,246,240,247,246,233,270,231,245,229,266,213,238,211,254,240,253,217,244,222,248,259,241,243,227,223,240,232,238,239,242,236,260,276,248,246,244,265,250,244,265,258,232,252,246,227,234,246,257,228,260,258,232,226,215,251,255,236,239,220,249,247,242,241,226,268,245,276,253,253,257,249,243,238,258,257,271,239,227,232,254,241,270,239,251,226,219,231,226,236,254,241,234,232,240,263,245,249,220,252,240,243,243,231,240,249,244,241,224,252,252,255,268,213,267,273,220,241,226,239,257,231,245,250,266,227,243,261,246,241,225,258,254,257,273,247,256,230,237,245,230,283,265,263,241,262,224,252,261,213,228,226,241,229,273,230,242,211,269,256,243,239,250,226,220,243,227,248,255,224,263,262,227,258,207,239,241,226,233,250,213,226,245,245,249,239,254,230,248,243,241,228,237,245,246,245,263,255,274,227,269,250,245,268,228,236,239,249,259,226,238,257,241,232,247,279,251,280,260,247,243,237,258,246,245,250,219,246,244,237,240,231,209,228,238,231,270,226,247,240,254,221,252,238,261,262,244,239,256,256,266,228,235,236,246,255,242,239,221,245,233,236,229,244,257,235,247,242,239,245,234,243,244,228,229,251,263,260,239,225,287,245,224,246,268,257,243,285,239,222,234,256,239,251,249,255,258,252,242,237,226,219,269,219,236,254,256,235,251,244,256,253,259,253,254,272,241,229,236,237,240,265,261,252,278,265,233,232,274,237,242,252,246,223,274,269,217,256,267,237,236,245,240,260,229,241,237,245,258,259,244,233,268,242,250,229,235,264,271,223,268,249,254,243,251,236,253,239,235,250,261,220,238,235,265,269,256,256,260,251,240,271,223,259,242,254,271,253,255,255,238,209,236,234,251,280,233,268,248,276,263,248,244,258,268,242,240,266,211,225,231,274,264,253,250,242,231,259,254,258,269,237,226,232,237,231,238,236,247,238,217,242,245,224,251,228,227,210,260,238,243,246,230,232,272,276,248,240,232,236,217,249,243,237,240,250,250,260,233,233,244,216,260,248,234,238,227,249,201,229,277,259,239,228,226,242,224,266,259,236,247,242,246,238,231,264,264,240,227,255,266,232,246,228,284,241,232,239,231,232,260,239,247,243,234,230,262,223,229,239,243,224,247,237,261,242,254,239,250,227,232,251,226,218,255,221,240,238,238,229,252,215,243,237,218,220,243,237,229,237,219,249,235,235,261,227,266,244,257,252,239,232,229,247,251,245,277,235,242,229,253,251,231,235,244,219,248,232,226,243,268,239,229,247,237,229,231,254,239,267,228,288,227,244,234,239,268,211,241,247,223,231,248,209,246,223,255,255,219,235,264,248,227,236,257,257,212,210,236,229,235,213,222,248,238,271,235,259,238,235,242,246,259,267,222,262,286,218,220,248,259,252,278,248,251,237,241,274,251,270,247,274,260,237,244,279,249,243,215,232,253,244,266,225,248,224,257,255,272,237,237,257,254,248,256,241,244,236,259,234,212,241,244,270,266,238,278,243,245,226,228,235,239,233,249,216,262,232,278,284,258,215,242,269,270,265,226,244,253,243,260,232,246,241,262,221,266,210,268,238,240,261,224,223,239,243,259,238,237,251,261,238,237,244,247,230,261,234,237,224,242,264,246,266,278,260,253,236,252,235,254,262,256,225,248,244,231,258,251,237,240,261,259,261,234,246,231,249,270,255,240,233,229,249,253,248,257,236,234,263,237,247,243,227,218,227,254,235,233,245,217,231,241,241,234,251,238,254,233,250,255,253,244,241,279,219,243,214,234,199,248,240,242,241,214,240,245,226,239,236,245,227,263,250,232,242,228,235,239,225,252,238,255,244,225,247,252,251,217,251,231,223,242,232,240,251,241,248,265,220,244,251,245,239,263,244,235,249,245,224,264,227,234,219,256,237,244,262,236,262,248,275,257,216,235,239,249,213,219,241,248,220,258,221,257,229,265,222,264,238]},{"counters":[274,230,263,288,229,238,262,248,234,286,233,233,243,246,256,249,230,270,240,255,300,241,250,260,251,228,244,242,222,255,226,243,262,231,247,229,231,248,234,236,280,238,241,257,229,244,221,237,245,256,231,234,245,246,236,233,259,278,239,244,196,227,235,219,224,251,265,252,249,249,228,245,270,270,216,243,258,238,248,264,259,246,248,237,241,252,219,235,261,249,251,245,262,255,250,243,250,243,236,238,246,236,262,237,261,211,245,237,231,247,284,247,244,232,238,227,252,232,252,254,239,251,235,243,225,245,247,243,249,264,236,248,255,252,266,258,248,207,255,251,254,229,230,231,231,255,224,252,250,258,237,226,233,237,257,254,238,242,249,238,250,231,230,250,232,255,246,252,236,237,249,239,239,259,236,248,239,273,236,248,279,246,258,268,242,222,234,247,254,223,263,233,263,270,249,240,255,262,271,255,237,238,249,260,238,263,266,242,233,242,241,241,232,252,248,245,252,236,250,288,249,248,249,239,216,240,224,241,254,247,228,211,244,251,233,245,231,248,245,226,238,246,245,217,252,232,233,257,245,223,241,256,263,239,254,255,260,246,231,250,235,248,258,239,253,258,272,250,252,266,254,289,265,242,249,255,232,261,262,251,213,250,227,253,250,233,240,219,228,234,242,230,246,259,244,230,218,248,255,256,246,283,249,243,236,234,232,235,235,241,246,253,221,219,250,205,258,242,256,250,257,271,257,273,246,269,248,235,232,254,244,252,238,233,243,221,252,246,239,242,242,225,233,255,239,230,247,246,260,232,275,236,246,225,227,207,235,247,245,218,237,262,257,260,241,253,248,239,243,222,237,242,240,245,242,257,246,255,243,260,265,262,205,229,269,232,233,251,219,262,243,228,260,260,237,252,250,276,250,241,246,237,250,236,237,263,240,230,242,254,215,273,216,256,238,272,256,251,233,231,243,229,262,236,289,218,224,236,230,246,260,233,254,241,244,221,219,222,254,269,237,228,234,237,216,252,241,233,231,226,239,270,213,263,259,219,255,248,230,224,226,239,254,239,265,216,213,226,275,225,258,224,241,212,215,248,245,246,245,249,256,267,252,249,232,216,259,241,241,245,231,248,240,248,240,261,249,232,252,251,244,228,255,229,230,229,248,238,263,274,241,220,252,255,271,246,223,254,214,268,270,248,232,241,227,245,231,265,235,264,271,231,271,239,268,222,237,247,222,256,227,227,227,223,256,233,269,250,247,249,260,248,243,225,276,249,250,242,251,260,229,253,262,246,223,264,248,233,262,237,253,233,240,239,244,241,241,236,256,243,242,249,247,233,232,268,254,221,237,238,249,261,246,236,237,234,251,232,238,233,207,258,244,239,227,236,254,252,242,268,267,228,249,223,257,249,250,285,226,266,260,233,246,246,239,237,241,252,236,239,218,235,205,224,254,227,254,240,233,255,245,246,241,241,240,240,246,273,210,232,234,230,261,238,224,243,240,237,250,251,270,241,246,259,225,272,225,251,263,273,236,233,226,213,249,238,225,229,235,232,256,230,243,241,244,244,241,238,242,237,269,235,242,245,272,250,236,246,252,251,246,249,197,247,264,244,252,230,240,213,263,273,231,261,218,263,255,248,278,238,219,241,232,282,221,257,250,248,218,251,243,257,254,262,267,240,269,229,240,232,235,255,206,252,237,248,233,226,248,250,241,209,267,248,237,236,242,254,238,243,231,263,259,237,250,228,229,224,266,253,246,260,230,248,239,259,236,245,246,213,247,237,258,234,215,264,242,222,239,272,246,242,254,218,209,242,232,253,249,226,228,227,265,242,203,233,271,239,257,257,257,256,253,250,251,225,267,213,262,249,260,253,239,254,234,240,236,241,242,251,238,259,264,239,237,262,233,232,260,228,250,264,260,245,238,264,268,234,268,220,256,255,250,233,233,237,246,234,246,250,234,252,222,248,234,239,258,243,242,280,252,212,235,232,233,263,239,250,255,243,221,256,229,260,245,238,226,259,237,255,259,279,226,245,264,222,247,245,230,233,226,230,247,229,265,258,238,289,221,257,241,227,249,217,219,250,235,232,230,245,217,246,257,238,244,221,218,225,243,254,234,244,220,237,234,266,226,252,228,242,238,269,234,238,223,214,240,235,249,257,248,238,244,228,241,250,240,234,228,229,250,239,272,219,230,235,251,246,246,247,257,226,241,219,255,228,281,284,249,247,247,244,260,253,248,267,236,239,261,253,236,228,281,260,261,197,222,253,226,254,275,244,227,249,234,232,231,236,228,207,259,242,248,257,256,274,249,291,227,247,212,241,236,269,264,241,258,235,253,251,262,224,243,244,218,257,243,247,225,249,242,242,225,239,270,207,278,269,263,239,240,232,247,229,258,225,255,257,248,264,247,252,250,243,242,247,237,227,217,234,226,254,268,232,232,217,247,255,247,248,275,237,251,240,244,248,234,232,231,227,277,240,259,246,247,230,251,246,236,256,223,273,248,259,241,252,254,230,226,236,245,253,222,237,238,211,257,234,247,270,251,246,235,237,250,275,260,254,245,240,245,243,268,231,264,250,271,250,236,240,221,251,247,240,276,247,218,237,241,245,243,273,242,236,210,242,254,256,227,227,254,253,258,247,232,248,211,237,268,254,229,287,242,245,231,259,239,249,242,245,242,233,255,263,239,249,236,232,238,229,238,216,258,253,260,264,238,265,246,227,235,259,233,216,250,242,245,255,257,266,222,268,238,248,230,244,275,231,214,238,210,251,244,242,222,229,230,235,230,231,221,242,216,234,266,238,258,247,238,231,253,233,244,244,250,261,238,259,244,227,223,242,256,231,230,233,252,266,265,255,240,231,216,259,244,278,236,257,248,229,225,244,237,228,260,252,227,222,248,240,225,275,235,229,232,235,216,249,226,242,243,239,288,264,236,224,238,264,246,267,241,267,257,258,251,273,234,246,234,240,249,280,255,275,243,224,260,226,267,235,220,211,255,245,239,266,225,243,242,241,270,238,250,248,217,223,245,239,273,241,238,247,260,250,230,246,256,245,234,225,232,246,258,237,231,266,253,240,228,254,227,221,245,203,218,263,211,238,282,260,229,260,235,254,271,290,241,247,261,261,254,253,223,239,229,249,243,255,238,250,243,238,269,231,258,238,250,215,255,244,225,215,270,231,257,249,215,237,226,247,230,253,249,244,228,277,250,243,238,275,264,249,241,259,247,235,277,262,255,243,235,215,264,233,246,232,250,265,240,254,233,255,250,237,245,208,237,247,260,240,261,242,241,233,247,245,242,230,271,236,239,255,254,259,245,270,219,248,238,237,245,247,235,258,229,251,244,263,239,264,234,259,223,228,250,244,268,231,250,232,223,270,242,242,223,222,257,245,231,219,239,268,225,258,242,247,236,250,260,238,227,264,238,227,231,238,253,248,239,245,230,259,272,242,226,246,282,241,263,282,253,237,229,262,246,231,244,242,246,213,221,258,238,243,238,261,204,252,236,247,244,253,244,229,266,236,260,230,236,241,247,239,238,248,249,256,269,228,254,248,239,254,229,263,255,249,251,244,248,248,231,256,255,236,236,279,249,258,263,234,216,225,203,242,227,260,246,251,252,246,248,252,215,249,261,250,262,238,253,239,276,252,262,241,226,266,236,250,239,245,224,261,241,226,263,250,235,275,239,234,256,243,255,232,241,245,260,228,243,225,252,252,265,226,242,291,230,241,271,287,256,225,261,251,277,246,223,226,234,282,237,264,273,252,240,254,262,241,245,247,243,228,241,244,249,239,257,226,254,236,275,237,225,259,221,262,244,241,221,250,208,248,255,258,249,259,235,265,231,270,215,252,246,231,244,231,247,263,264,245,268,239,233,259,250,256,240,256,243,238,233,240,237,250,230,246,259,247,223,238,254,241,229,252,231,243,239,254,241,262,254,256,214,260,243,274,256,259,238,276,222,267,250,227,249,228,270,243,249,238,252,270,247,217,243,248,255,239,233,274,265,233,244,231,219,215,257,244,260,235,223,261,242,230,252,231,244,249,223,252,285,269,210,202,266,232,227,233,244,226,246,231,244,245,234,243,246,233,234,231,235,209,255,220,264,259,262,245,253,244,231,247,261,235,220,227,245,267,280,252,225,242,253,238,259,252,223,248,264,268,242,245,260,229,266,222,256,263,248,242,235,234,251,247,238,216,235,242,240,232,298,238,260,245,245,239,252,264,261,250,238,219,259,241,255,249,236,221,243,252,243,241,253,244,250,260,276,246,224,270,260,250,219,237,242,231,267,239,234,221,253,240,246,229,216,258,229,273,225,241,249,250,241,233,260,248,221,252,237,246,220,256,284,237,245,241,218,275,241,216,272,242,228,231,275,244,262,235,239,233,235,215,270,227,253,238,257,237,233,223,261,263,243,236,213,253,251,243,268,268,232,249,239,242,233,248,252,264,248,245,244,242,240,228,261,229,259,226,254,241,261,264,239,258,232,264,262,219,232,238,244,251,256,226,254,264,268,231,231,249,237,245,229,239,258,254,264,237,244,226,252,232,227,247,244,252,245,244,230,214,258,213,246,224,244,226,237,249,269,217,258,251,236,254,232,261,237,246,232,243,272,229,233,224,263,276,240,237]}]},"null_count":0,"tot_col_size":13498809,"last_update_version":401695302681886721},"s_comment":{"histogram":{"ndv":495232,"buckets":[{"count":2000,"lower_bound":"IGFib3ZlIHRoZSBjYXJlZnVsbHkgdW51c3VhbCByZXF1ZXN0cy4gZnVyaW91c2x5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIGFjY29yZGluZyA=","upper_bound":"IGFjY29yZGluZyB0byB0aGUgcXVpY2tseSByZWd1bGFyIGFjY291bnRzLiBmdXJpb3VzbHkgaXJvbg==","repeats":1},{"count":4000,"lower_bound":"IGFjY29yZGluZyB0byB0aGUgdW51c3VhbCwgZXhwcmVzcyBkZXBvc2l0cyB3YXMgZnVyaW91c2x5IHNwZWNpYWwg","upper_bound":"IGFjY291bnRzIGVhdCBjYXJlZnVsbHkgYWJvdXQgdGhlIHNseWx5IHVudXN1YWwgcGludG8gYmVhbnMu","repeats":1},{"count":6000,"lower_bound":"IGFjY291bnRzIHNsZWVwIGJsaXRoZWx5IHNseWx5IHVudXN1YWwgcGFja2FnZXMtLSBmaW5hbCBwYWNrYWdlcyBjYWpvbGUgYWxvbmcgdGhlIGZ1cmlvdXNseSBib2xk","upper_bound":"IGFjcm9zcyB0aGUgaWRlYXMuIGZ1cmlvdXNseSBldmVuIHBhY2thZ2VzIHBsYXkgZnVyaW91c2w=","repeats":1},{"count":8000,"lower_bound":"IGFmZml4IGNhcmVmdWxseSBib2xkIGZveGVzOiBwYWNrYWdlcyBjYWpvbGUgc2x5bHkgYWZ0ZXIgdGhlIHNseWx5IGZpbmFsIHJlcXVlc3RzPyBmaW5hbCBkZXBvc2l0","upper_bound":"IGFnYWluc3QgdGhlIHJlZ3VsYXIgZm94ZXMuIHJlZ3VsYXIsIGZpbmFsIGRlcG9zaXRzIHByb21pc2UuIGZ1","repeats":1},{"count":10000,"lower_bound":"IGFsb25nIHRoZSBleHByZXNzIHBhY2thZ2VzLiBydXRobGVzc2x5IGlyb25pYyBhY2NvdW50cyBhcmUgYmxpdGhlbHkuIHF1aWNrbHkgZXZlbiBtdWx0aXBsaWVycyBhcmUg","upper_bound":"IGFyZS4gYmxpdGhlbHkgcGVuZGluZyBmb3hlcyBhcmUgYmxpdGhlbHkgcGVuZGk=","repeats":1},{"count":12000,"lower_bound":"IGFyb3VuZCB0aGUgZnVyaW91c2x5IGZpbmFsIGRlcG9zaXRzLiBzbHlseSByZWd1bGFyIGRlcG9zaXRz","upper_bound":"IGJlYW5zIHdha2UgcmVndWxhciBpbnN0cnVjdGlvbnMuIGJsaXRoZWx5IHBlbmRpbmcgYWNjb3VudHMgaGFnZw==","repeats":1},{"count":14000,"lower_bound":"IGJleW9uZCB0aGUgY2FyZWZ1bGx5IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zLiBzbHlseSByZWd1bGFyIHBhY2thZ2VzIHNsZWVwPyBkZXBvc2l0cyBoYWdnbGUuIGNhcmVmdWxs","upper_bound":"IGJsaXRoZWx5IGZsdWZmaWx5IHJlZ3VsYXIgd2F0ZXJzLiBibGl0aGVseSBleHByZXNzIGJyYWlkcyBhdCB0aGUgcGU=","repeats":1},{"count":16000,"lower_bound":"IGJsaXRoZWx5IHBlbmRpbmcgcGludG8gYmVhbnMuIHF1aWNrbHkgdW51c3VhbCBk","upper_bound":"IGJvbGQgaW5zdHJ1Y3Rpb25zIGFsb25nIHRoZSBjYXJlZnVsbHkgZXZlbiBkZXBlbmRlbmNpZXMgYm9vc3QgYWNjb3JkaQ==","repeats":1},{"count":18000,"lower_bound":"IGJvb3N0IGFsb25nIHRoZSBmdXJpb3VzbHkgc2lsZW50IGNvdXJ0cy4gZnVyaW91cw==","upper_bound":"IGNham9sZSBzbHlseS4gZmx1ZmZpbHkgc2k=","repeats":1},{"count":20000,"lower_bound":"IGNhcmVmdWxseSBhbG9uZ3NpZGUgb2YgdGhlIHNseWx5IHBlbmRpbmcgYWNjb3VudHMuIGJsaXRoZWx5IHNpbGVudCBkZXBlbmRlbmNpZXMgY2Fqb2xlPyA=","upper_bound":"IGNvdXJ0cy4gY2FyZWZ1bGx5IGZ1cmlvdXMgcmVxdWVzdHMgbmFnIGZ1cmlvdXNseSBibGl0aGVseSB1bnVzdWFsIHJlcXVlc3RzLiBjYXJlZnVsbHkgYm8=","repeats":1},{"count":22000,"lower_bound":"IGRlcG9zaXRzIGRvemUgaXJvbmljIHBpbnRvIGJlYW5zLiBz","upper_bound":"IGRldGVjdCBmdXJpb3VzbHkgYWdhaW5zdCB0aGUgaWRlYXMuIA==","repeats":1},{"count":24000,"lower_bound":"IGRvdWJ0IGFmdGVyIHRoZSByZWd1bGFyIGlkZWFzLiBibGl0aGVseSBlbnRpY2luZyBhY2NvdW50cyBhZmZpeCBjYXJlZnVsbHk7IGV2ZW5seSBmaW5hbCBkZXB0aHMgaW50","upper_bound":"IGV2ZW4gcmVxdWVzdHMgYWNjb3JkaW5nIHRv","repeats":1},{"count":26000,"lower_bound":"IGV4cHJlc3MgaG9ja2V5IHBsYXllcnMtLSBzbHlseSBwZW5kaW5nIHRoZW9kb2xpdGVzIGFtb25nIHRoZSBzbHlseSBwZW4=","upper_bound":"IGZpbmFsIGRlcG9zaXRzLiB0aGVvZG9saXRlcyBkZXRlY3QgY2FyZWZ1bGx5IHBhc3QgdGhlIGNhcmVmdWxseSByZWd1bGFyIHJlcXVlc3RzLiA=","repeats":1},{"count":28000,"lower_bound":"IGZpbmFsIGZvcmdlczogY2FyZWZ1bGx5IGZpbmFsIHRpdGhlcyB1c2UgcXVpY2tseSBhdCB0aGUgcXVpY2tseSByZWd1bGFyIGFjYw==","upper_bound":"IGZpbmFsIHBsYXRlbGV0cy4gc2x5bHkgZGFyaW5nIGFjY291bnRzIG5h","repeats":1},{"count":30000,"lower_bound":"IGZpbmFsLCBpcm9uaWMgY291cnRzLiBmdXJpb3VzbHkgaXJvbmljIGZyZXRzIGFyZSBjYXJlZnVsbHkgcmVndWxhciBkZXBlbmRlbmNpZXMuIGQ=","upper_bound":"IGZveGVzIGhpbmRlciBibGl0aGVseTsgc2x5bHkgZXhwcg==","repeats":1},{"count":32000,"lower_bound":"IGZ1cmlvdXNseSBldmVuIGRvbHBoaW5zIHNsZWVwIHF1aWNrbHkgYWNjb3JkaW5nIHRvIHRoZSBkb2dnZWQgZGVwb3NpdHMuIHNwZWNpYWwsIGly","upper_bound":"IGdpZnRzIGJlbGlldmUgZnVyaW91c2x5IHJlZ3VsYXIsIHJlZ3VsYXIgcGFja2FnZXMuIHNseWx5IHJl","repeats":1},{"count":34000,"lower_bound":"IGhhZ2dsZSBmdXJpb3VzbHkuIHNseWx5IGJvbGQgZGVwb3NpdHMgYWxvbmcgdGhlIGJsaXRoZWx5IGZpbmFsIGV4Y3VzZXMgaW1wcmU=","upper_bound":"IGhvY2tleSBwbGF5ZXJzIHNsZWVwIHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIGZsdWZmaWx5IHNwZWNpYWwgcGxhdGVsZXRzIGFib3V0IHRoZSBzaWw=","repeats":1},{"count":36000,"lower_bound":"IGluc3RydWN0aW9ucyBtdXN0IHdha2UgY2FyZWZ1bGx5LiBzcGVjaWFsIGFjY291bnRzIGhhZ2dsZSBhbG9uZyB0aGUgcXVpY2tseSBmaW5h","upper_bound":"IGlyb25pYyByZXF1ZXN0cyBjYWpvbGUgZm9yIA==","repeats":1},{"count":38000,"lower_bound":"IGlyb25pYyByZXF1ZXN0cyBzaGFsbCBoYXZlIHRvIHN1YmxhdGUgZmluYWwgcGFja2FnZXMuIGZ1cmlvdXNseSBxdWljayBmb3hlcyBhbG9uZ3NpZGUgb2YgdGhlIGV4cA==","upper_bound":"IG5hZyBhZnRlciB0aGUgZXZlbiBpbnN0cg==","repeats":1},{"count":40000,"lower_bound":"IHBhY2thZ2VzLiBzbHlseSByZWd1bGFyIGZveGVzIHdha2UuIGJy","upper_bound":"IHBlbmRpbmcgcmVxdWVzdHMuIGZ1cmlvdXNseSBldmVuIHBhY2thZ2VzIG5hZy4gaXJvbmljIGFjYw==","repeats":1},{"count":42000,"lower_bound":"IHBlbmRpbmcsIGV4cHJlc3MgZXhjdXNlcy4g","upper_bound":"IHF1aWNrbHkgcGVuZGluZyBkZXBvc2l0cy4gZmx1ZmZ5LCBwZW5kaW5nIGFjY291bnRzIHdha2Ug","repeats":1},{"count":44000,"lower_bound":"IHF1aWNrbHkgdGhyb3VnaCB0aGUgcXVpY2tseSBpcm9uaWMgcmVxdWVzdHMuIGV2ZW4gZGVwb3NpdHMgY2Fqb2xlIGZ1cmlvdXNseSBhZ2FpbnN0IHRoZSBxdWlja2x5","upper_bound":"IHJlZ3VsYXIgZGVwb3NpdHMgd2FrZSBmdXJpb3VzbHkgYm9sZCBwaW50byBiZWFucy4gZmluYWwsIA==","repeats":1},{"count":46000,"lower_bound":"IHJlZ3VsYXIgaWRlYXMgaGFnZ2xlLiBjYXJlZnVsbHkgaXJvbmljIHRoZW9kb2xpdGVzIGFnYWluc3QgdGhlIHA=","upper_bound":"IHJlZ3VsYXIgcGludG8gYmVhbnMgYWxvbmdzaWRlIG9mIHRoZSBmdXJpb3VzbHkgdW51c3VhbCByZXF1ZXN0","repeats":1},{"count":48000,"lower_bound":"IHJlZ3VsYXIgcGxhdGVsZXRzIHVzZSB0aGlubHkgc3BlY2lhbCwgaXJvbg==","upper_bound":"IHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIGlyb25pYywgdW51c3VhbCBhY2NvdW4=","repeats":1},{"count":50000,"lower_bound":"IHJlZ3VsYXIsIGV2ZW4gZGVwZW5kZW5jaWVzIHNsZWVwLiBjYQ==","upper_bound":"IHJlcXVlc3RzIG5hZyBxdWlja2x5IGFzeW1wdG90ZXMuIGRvZ2dl","repeats":1},{"count":52000,"lower_bound":"IHJlcXVlc3RzIHNsZWVwIGNhcmVmdWxseSBzbA==","upper_bound":"IHNpbGVudCBhY2NvdW50cy4gYmxpdGhlbHkgcGVuZGluZyBleGN1c2VzIHNsZWVwIHNseWx5LiBjYXJlZnVsbHkgYm9sZCBwaW50bw==","repeats":1},{"count":54000,"lower_bound":"IHNsZWVwIGFsb25nIHRoZSByZWd1bGFyIHJlcQ==","upper_bound":"IHNsZWVwLiBzcGVjaWFsLCBzaWxlbnQgcmVxdWVzdHMgc2xlZXAgc2x5bHkuIGZsdWZmaWx5IGlyb25pYyByZXF1ZXN0cyBjYWpvbGUgc2x5bHkuIHBlbmRpbmcsIGZpbmFsIA==","repeats":1},{"count":56000,"lower_bound":"IHNseWx5IHJlZ3VsYXIgcmVxdWVzdHMgaGFnZ2xlIGZ1cmlvdXNseSBhYm91","upper_bound":"IHNwZWNpYWwgcmVxdWVzdHMuIGlyb25pYywgZG9nZ2VkIHA=","repeats":1},{"count":58000,"lower_bound":"IHRoZSBhY2NvdW50cy4gc2x5bHkgZXZlbiBwYWM=","upper_bound":"IHRoZSBjYXJlZnVsbHkgcGVuZGluZyByZXF1ZXN0cyEgYm9sZCBjb3VydHMgbG9zZSBmbHVmZmlseS4gc2xvd2x5IHNpbGVu","repeats":1},{"count":60000,"lower_bound":"IHRoZSBjYXJlZnVsbHkgc3RlYWx0aHkgZGVwb3NpdHMgYnJlYWNoIGFyb3VuZCB0aGUgY2FyZWZ1bGx5IGV2ZW4gZGVwb3NpdA==","upper_bound":"IHRoZSBpcm9uaWMgdGhlb2RvbGl0ZXMgc2xlZXAgdW4=","repeats":1},{"count":62000,"lower_bound":"IHRoZSBxdWlldCBpZGVhcy4gZnVyaW91c2x5IHNwZWNpYWwgbm90b3JuaXMgd2FrZSBmdXJpb3VzbHkgaXJvbmljIGZveGVzLiBzbHlseSBmaW5hbCBhY2Nv","upper_bound":"IHRoZW9kb2xpdGVzLiBibGl0aGVseSBleHByZXNzIGZveGVzIGhhZ2dsZSBmdXJpb3VzbHkuIHF1aWNrbHkgcGVuZGluZyBhc3ltcA==","repeats":1},{"count":64000,"lower_bound":"IHRoZW9kb2xpdGVzLiBzaWxlbnQsIGlyb25pYyBhY2NvdW50cyBib29zdA==","upper_bound":"IHVuZGVyIHRoZSBibGl0aGVseSBwZW5kaW5nIHRoZW9kb2xpdGVzIHdha2UgZnVyaW8=","repeats":1},{"count":66000,"lower_bound":"IHVudXN1YWwgYWNjb3VudHMgZG8gYWZmaXggYWNjb3JkaW5nIHRvIHRoZSBibGl0aGVseSBzcGVjaWFsIHRoZW9kb2xpdGVzLiBpcm9uaWMgZm94ZXMgYXJlIGV2ZQ==","upper_bound":"IHVudXN1YWwgcmVxdWVzdHMuIHJlZ3VsYXIsIGlyb25pYyByZXF1ZXN0cyBzbGVlcCBxdWlja2x5LiBleHByZXNzLCBleHByZXNzIHJlcXVlc3RzIGFjcm9zcyB0aGUgZnVyaQ==","repeats":1},{"count":68000,"lower_bound":"IHVzZSBibGl0aGVseSBhYm92ZSB0aGUgcmVndWxhciBpbnN0cnVjdGlvbnMuIGZ1cmlvdXNseSBibGl0aGUgZGVwb3M=","upper_bound":"ISBmbHVmZmlseSBzcGVjaWFsIHdhcmhvcnNlcyBoYWdnbGUuIHNseWx5IHJlZ3VsYXIgaW5zdHJ1Y3Rpb25zIGNham9sZS4gZnVyaW91c2x5IGV2ZW4gcGFja2E=","repeats":1},{"count":70000,"lower_bound":"LCBldmVuIGFjY291bnRzLiBlbnRpY2luZ2x5IGI=","upper_bound":"LiBjYXJlZnVsbHkgYm9sZCBncm91Y2hlcyB3YWtlIHNseWx5IGFsb25nIHRoZSBxdWlja2x5IHJlZ3VsYXIgYWNjb3VudHMuIHJlZ3VsYXIsIGV2ZW4gZG9scGhpbnMg","repeats":1},{"count":72000,"lower_bound":"LiBjYXJlZnVsbHkgZXZlbiBpZGVhcyBhY2NvcmRpbmcgdG8gdGhlIGlkZWFzIGRvdWJ0IGNhcmVmdWxseSBmbHVmZmlseSA=","upper_bound":"LiBldmVuIGZveGVzIGFsb25nc2lkZSBvZiB0aGUgcmVxdWVzdHMgY2Fqb2xlIGNhcmVm","repeats":1},{"count":74000,"lower_bound":"LiBwZW5kaW5nIGRlcG9zaXRzIHVwb24gdGhlIGNhcmVmdWxseSBmaQ==","upper_bound":"LiByZWd1bGFyIGluc3RydWN0aW9ucyBmb3IgdGhlIGNhcmVmdWxseSB1bnVzdWFsIGluc3RydWN0aW9ucyBzbGVlcCBjYXJlZg==","repeats":1},{"count":76000,"lower_bound":"LiByZWd1bGFyLCBwZW5kaW5nIGluc3RydWN0aW9ucyB0aHJhc2ggcXVpY2tseSBmaW5hbCBtdWx0aXBsaWVycy4gcmVndWxhciBicmFpZHMgd2FrZSBzbA==","upper_bound":"YWJvdXQgdGhlIHF1aWNrbHkgZmluYWwgcGFja2FnZXMuIHJlcXVlc3RzIGFib3V0IHRoZSBz","repeats":1},{"count":78000,"lower_bound":"YWJvdmUgdGhlIGZ1cmlvdXNseSB1bnVzdWFsIHBsYXRlbGV0cy4gY2FyZWZ1bGx5IHNsb3cgcGFja2FnZXMgaW50ZWdyYXRlIHBhY2thZ2VzISBhbHdheXMgcmU=","upper_bound":"YWNjb3VudHMgYWJvdXQgdGhlIGNhcmVmdWxseSBpcm9uaWMgdGhlb2Q=","repeats":1},{"count":80000,"lower_bound":"YWNjb3VudHMgYXJlIGNhcmVmdWxseSBhcm91bmQgdGhlIHNwZWNpYWwgcGFja2FnZXM/IGZ1cmlvdXNseSByZWd1bGFyIG5vdG9ybmlzIGM=","upper_bound":"YWNjb3VudHMgZW5nYWdlIGJ1c2lseSBhZnRlciB0aGUgc2x5bHkgcmVndWxhciBhdHRhaW5tZW50cy4gYmxpdGhlbHkgZnVyaW91cyBkZXB0aHMgaGFnZ2xlIGY=","repeats":1},{"count":82000,"lower_bound":"YWNjb3VudHMuIGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaXRzIGFyZS4gcXVpY2tseSBmaW5hbCBwYWNrYWdlcyBkZXRlY3QgYmxpdGhlbHkgc2lsZW50IHNvbWE=","upper_bound":"YWNrYWdlcyBjYWpvbGUgZXZlbiB0aGVvZG9saXRlcy4gZnVyaW91c2x5IHVudXN1YWwgZGVwb3NpdHMgZGV0ZWN0IHF1aWNrbHkgY2FyZWZ1bGx5IHJl","repeats":1},{"count":84000,"lower_bound":"YWNrYWdlcyB1c2UgcXVpY2tseSByZWd1bGFyIHJlcXVlc3RzPyBlbnRpYw==","upper_bound":"YWdhaW5zdCB0aGUgaG9ja2V5IHBsYXllcnMuIGNhcmVmdWxseSBldmVuIHJlcXVlc3RzIHByb21pc2Ugc3BlY2lhbCBhY2NvdW50cy4gY2FyZWZ1bGx5IGZpbmFsIA==","repeats":1},{"count":86000,"lower_bound":"YWdhaW5zdCB0aGUgcmVndWxhciByZXF1ZXN0cy4gc3BlY2lhbCwgZmluYWwgYWNjb3VudHMgaGFnZ2xlLiA=","upper_bound":"YWdlcyBieSB0aGUgZmluYWwsIGZpbmFsIA==","repeats":1},{"count":88000,"lower_bound":"YWdlcy4gZnVyaW91c2x5IHVudXN1YWwgcGFja2FnZXMg","upper_bound":"YWdnbGUgY2FyZWZ1bGx5IGZ1cmlvdXNseSBzcGVjaWFsIG5vdG9ybmlzISByZWd1bGFyIGJyYWlkcyBoYWdnbGUgZXhwcmVzcyBmb3hlcy4gaXJvbmlj","repeats":1},{"count":90000,"lower_bound":"YWdnbGUgZnVyaW91c2x5IGJsaXRoZWx5IHJlZ3VsYXIgcGFja2FnZXMuIGI=","upper_bound":"YWtlIGNsb3NlbHkgc2xvdyBub3Rvcm5pcy4gZXZlbiByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBmbHVmZmlseSBmaW5hbCB0aGVvZG9saXRlcyBpbnRlZ3JhdGUgYWJvdg==","repeats":1},{"count":92000,"lower_bound":"YWwgYWNjb3VudHMgb3ZlciB0aGUgZmluYWwgcGFja2FnZXMgaGFnZ2xlIGZsdWZmaWx5IGV4cHJlc3MgZm94ZXMuIHNseSwgYm9sZCBleGN1c2VzIHByaW50LiBkb2xw","upper_bound":"YWwgaWRlYXMuIGNhcmVmdWxseSB1bnVzdWFsIHJlcXVlc3RzIG5vZCBjYXJlZnVsbHkgYW1vbmcgdGhlIGNhcmVmdWxseSBzcGVjaWFsIGFjY291bnRzLiBzbHlseSBm","repeats":1},{"count":94000,"lower_bound":"YWwgc2VudGltZW50cyBzbGVlcCBzbHlseS4gc2x5bHkgc2x5IGRlcG9zaXRzIHNsZWVwLiBldmVuIGRlcG9zaXRzIGFsb25nc2lkZSBvZiB0aGUgc2x5bHkgZGFyaW5n","upper_bound":"YWxseSBhYm91dCB0aGUgcmVndWxhciwgZXZlbiBhY2NvdW50cy0tIHF1aWNrbHkgaXJv","repeats":1},{"count":96000,"lower_bound":"YWxvbmcgdGhlIGZpbmFsIGRlcG9zaXRzLiBibGl0aGVseSBib2xkIGZyZXRzIHdha2UuIHJlZ3VsYXIsIHVudXN1YWwgYWNjb3VudHMgYW1vbmcgdGhlIGZ1","upper_bound":"YW5zIG5hZyBzbHlseS4gZmx1ZmZpbHkgcmVndWxhciBwYWlucyBhcmUuIGV4cHJlc3MgcGxhdGVsZXRzIGNham9sZSBjYXJlZnVsbHkgdW51c3VhbCA=","repeats":1},{"count":98000,"lower_bound":"YW5zLiBldmVuIHJlcXVlc3RzIGJlbGlldmUgYWxvbmcgdGhlIHRoZW9kb2xpdGVzLiBmbHVmZmlseSA=","upper_bound":"YXIgZGVwZW5kZW5jaWVzIHdha2Ugc2xvd2x5IGFyb3VuZCB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgYWNjb3VudHMuIGV2ZW4gYWNjb3VudHMgYm9vc3QgZXhwcmVz","repeats":1},{"count":100000,"lower_bound":"YXIgZGVwb3NpdHMgaGFnZ2xlIGFib3V0IHRoZSBibGl0aGVseSBpcm9uaWMgaWQ=","upper_bound":"YXIgcGFja2FnZXMuIHNseWx5IGlyb25pYyByZXF1","repeats":1},{"count":102000,"lower_bound":"YXIgdGhlb2RvbGl0ZXMgYWNjb3JkaW5nIHRvIHRoZSBjYXJlZnVsbHkgZmluYWwgYWNjb3VudHMg","upper_bound":"YXJlZnVsbHkgcmVndWxhciBhc3ltcHRvdGVzLiBibGl0aGVseSByZWd1bGFyIHBpbnRvIGJlYW5zIGNv","repeats":1},{"count":104000,"lower_bound":"YXJlZnVsbHkgc2x5bHkgZXZlbiByZXF1ZXN0cy4gcXVpY2tseSBpcm9uaWMgcmVxdWVzdHMgaGFnZ2xlLiBmdXJpb3VzbHkgdW51c3VhbCBhYw==","upper_bound":"YXJlZnVsbHkuIGV2ZW4sIGV2ZW4gZGVwb3NpdHMgc2xlZXAgZnVyaW91c2x5IGFsb25nc2lkZSBvZiB0aGUgZnVyaW91c2x5IHJlZ3VsYXIgZGVwb3Np","repeats":1},{"count":106000,"lower_bound":"YXMuIGZ1cmlvdXNseSByZWd1bGFyIHRoZW9kb2xpdGVzIGFmdGVyIHRoZSBhY2NvdW50cyBhcmUgYW1vbmcgdGhlIGJsaXRoZWx5IGY=","upper_bound":"YXRlIGFmdGVyIHRoZSBzbHlseSBmaW5hbCA=","repeats":1},{"count":108000,"lower_bound":"YXRlbGV0cyBjYWpvbGUgYmxpdGhlbHkgc2x5bHkgc3BlY2lhbCBkZXBlbmQ=","upper_bound":"YXlzIGNham9sZSBjYXJlZnVsbHkgYWJvdmUgdGhlIGluc3RydWN0aW9ucy4gZXBpdGFwaHMgbmFnIGJyYXZlbHkuIHBhY2thZ2VzIGhhZ2dsZSBxdWlja2x5IGFtbw==","repeats":1},{"count":110000,"lower_bound":"YmVhbnMgYWJvdmUgdGhlIGV2ZW4gYWNjb3VudHMgaGFnZ2xlIA==","upper_bound":"YmxhdGUuIGZpbmFsIHNvbWFzIHN1YmxhdGUgZmw=","repeats":1},{"count":112000,"lower_bound":"YmxpdGhlbHkgYmxpdGhlbHkgc3BlY2lhbCBh","upper_bound":"YmxpdGhlbHkgcmVndWxhciBpbnN0cnVjdGlvbnMgaGFnZ2xlIGJsaXRoZWx5IGJsaXRoZWw=","repeats":1},{"count":114000,"lower_bound":"YmxpdGhlbHkgc3BlY2lhbCBwaW50byBiZWFucyBoYWdnbGUgY2FyZWZ1bGx5IGE=","upper_bound":"Ym9sZCBwYWNrYWdlcyBhcm91bmQgdGhlIGZ1cmlvdXNseSBzcGVjaWFsIHBhY2thZ2VzIGFyZSBhYm91dCB0aGUgcXVpY2tseSBmaW5hbCBwYWNrYWdlcy4gY2FyZWZ1bA==","repeats":1},{"count":116000,"lower_bound":"Ym9sZCBwaW50byBiZWFucy4gc2x5bHkgZXhwcmVzcyBlcGl0YXBocyBoYWc=","upper_bound":"Ym91dCB0aGUgY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cyBoYWdnbGUgc2x5bHkgcGVuZGluZyB0aGVvZG9saXRlczsgZnVyaW91c2x5IGZpbmFsIGluc3RydWN0","repeats":1},{"count":118000,"lower_bound":"YnJhaWRzIHVzZSBhY3Jvc3MgdGhlIGJsaXRoZWx5IGV2","upper_bound":"YyBkZXBvc2l0cyBhZnRlciB0aGUgdW51c3VhbCwgc2lsZW50IGRlY295cyBjYWpvbGUgc2x5bHkgYWZ0ZXIgdGhlIGFsd2F5cyByZWd1bGFyIGFzeW1wdG90","repeats":1},{"count":120000,"lower_bound":"YyBpZGVhcyBuYWcgYmV0d2VlbiB0aGUgc2x5bHkgaXJvbmljIHJlcXVlc3RzLiBxdWlja2x5IHNsb3cgZXhjdXNlcyBoYWdnbGUgY2FyZQ==","upper_bound":"YywgcGVuZGluZyBhc3ltcHRvdGVzLiBzbHlseSB1bnVzdWFsIGV4Y3VzZXM=","repeats":1},{"count":122000,"lower_bound":"Y2Fqb2xlIHNseWx5IHNwZWNpYWwgYWNjb3VudHMtLSBjYXJlZnVsbHkgZmluYWwgc2hlYXZlcyBu","upper_bound":"Y2FyZWZ1bGx5IGFjY29yZGluZyB0byB0aGUgY2FyZWZ1bGx5IHNwZWNpYQ==","repeats":1},{"count":124000,"lower_bound":"Y2FyZWZ1bGx5IGFnYWluc3QgdGhlIHF1aWNrbHkgc3BlY2lh","upper_bound":"Y2FyZWZ1bGx5IGZpbmFsIHRoZW9kb2xpdGVzIGJvb3N0LiBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzIHNsZWVwLiBx","repeats":1},{"count":126000,"lower_bound":"Y2FyZWZ1bGx5IHF1aWV0IHRoZW9kb2xpdGVzLiBhc3ltcHRv","upper_bound":"Y2NvcmRpbmcgdG8gdGhlIHNwZWNpYWwgY291cnRzLiA=","repeats":1},{"count":128000,"lower_bound":"Y2NvdW50cyBhbW9uZyB0aGUgcXVpY2tseSBpcm9uaWMgZXhjdXNlcyBibw==","upper_bound":"Y2NvdW50cy4gZmx1ZmZpbHkgc2lsZW50IGRlcG9zaXRzIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGlyb25pYyBkZXBvc2l0cyB3YWtlIGNhcmVmdWxseSBhZnRlciB0aGUg","repeats":1},{"count":130000,"lower_bound":"Y2lhbCBkZXBvc2l0cyBhZmZpeCBmdXJpb3VzbHkuIHBlbmRpbmcgZGVwZW5kZW5jaWVzIGNham9sZSBmdXJpb3VzbHkgc2x5bHkgcGVuZGluZyBkb2xwaA==","upper_bound":"Y2thZ2VzIHdha2UgZnVyaW91c2x5IGJsaXRoZWx5IHJlZ3VsYXIgaWRlYXMuIHF1aWNrbHkgYm9sZCBwaW50byBiZWFucyBjYWpvbGUuIGI=","repeats":1},{"count":132000,"lower_bound":"Y2thZ2VzIHdha2UuIGZ1cmlvdXNseSBmaW5hbCBleGN1c2VzIGhhZ2dsZS4gcGVybWFuZW50bHkgZmluYWwgcGk=","upper_bound":"Y2tseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIGhhZ2dsZSB3aXRoIHRoZSBzbHlseSBkYXJpbmcgZGVwb3NpdHMuIGZ1cmlvdXNseSBleHByZXNzIHJlcXVlc3RzIA==","repeats":1},{"count":134000,"lower_bound":"Y2tseSByZWd1bGFyIGZveGVzLiBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzIGhhZ2dsZSBzbHlseSBmaW5hbA==","upper_bound":"Y3Jvc3MgdGhlIGZ1cmlvdXNseSByZWd1bGFyIGlkZWFzLiB1bnVzdWFsIHBhY2thZ2VzIGFjcm9zcw==","repeats":1},{"count":136000,"lower_bound":"ZCBkZWNveXMgc2xlZXAgY2FyZWZ1bGx5IGJ1c2lseSB1bnVzdWFsIHJlcXVlc3RzLiBleHByZXNzIGV4Y3Vz","upper_bound":"ZCwgdW51c3VhbCBhY2NvdW50cy4gYmxpdGhlbHkgcGU=","repeats":1},{"count":138000,"lower_bound":"ZGVhcyBhcm91bmQgdGhlIHNwZWNpYWwgYWNjbw==","upper_bound":"ZGVwb3NpdHMgYWNyb3NzIHRoZSBmbHVmZnksIGZpbmFsIGRvbHBoaW5zIGFyZSBjYXJlZnVsbHkgYWdhaW5zdCB0aGUgZmluYWwgcGF0dGVybnMuIHVudXN1YWwsIHJlZ3Vs","repeats":1},{"count":140000,"lower_bound":"ZGVwb3NpdHMgYm9vc3Qgc3BlY2lhbCBmb3hlcy4gZmx1ZmZpbHkgZXZlbiBpZGVhcyBzbGVlcCBhY2NvdW50cy4gc2x5bHkgZXhwcmVzcyBhY2NvdW50cyBib29zdA==","upper_bound":"ZGVwb3NpdHMuIGNhcmVmdWxseSBmdXJpb3VzIHJlcXVlc3RzIGFyZSBzdGVhbHRoaWx5IGFmdGVyIHRoZSBibGl0aGVseSBzcGVjaWFsIGlkZWFzLiBzbHlseSBldmVuIA==","repeats":1},{"count":142000,"lower_bound":"ZGVwb3NpdHMuIHNpbGVudCBwYWNrYWdlcyBzbGVlcCBzbHlseSBjYXJlZnVsbHkgcmVndWxhciBkZXA=","upper_bound":"ZGluZyBwbGF0ZWxldHMuIGZ1cmlvdXNseSBpcm9uaWMgaWRlYXMgZGV0ZQ==","repeats":1},{"count":144000,"lower_bound":"ZGluZyB0byB0aGUgZXhwcmVzcyBwaW50byBiZWFucy4gcmVndWxhciBkZXBvc2l0cyBiZWxpZXZlIGNhcmVmdWw=","upper_bound":"ZG9scGhpbnMuIGZ1cmlvdXNseSBldmVuIGRlcG9zaXRz","repeats":1},{"count":146000,"lower_bound":"ZG91YnQuIGZpbmFsLCBpcm9uaWMgcmVxdWVzdHMgYWZ0ZXIgdGhlIGZ1cmlvdXNseSBib2xkIHNvbWFzIHNvbHZlIGZsdWZmaWx5IGFnYWluc3QgdGhlIGNhcmVmdWxseSB1","upper_bound":"ZSBjYXJlZnVsbHkuIGJsaXRoZWx5IHJlZ3VsYXIgZGVwb3NpdHMgdGhyYXNoIGZ1cmlvdXNseSBhY2NvcmRpbmcgdG8gdGhlIHc=","repeats":1},{"count":148000,"lower_bound":"ZSBmbHVmZmlseSBpcm9uaWMgYWNjb3VudHMuIGZ1cmlvdXNseSB1bnVzdQ==","upper_bound":"ZSBmdXJpb3VzbHkgcGVuZGluZyBhY2NvdW4=","repeats":1},{"count":150000,"lower_bound":"ZSBmdXJpb3VzbHkgc3BlY2lhbCB0aGVvZG9saXRlcyB1c2UgYmxpdGhlbHkgYWJvdmUgdGhlIHBsYXRlbGV0cy4gZW50aWNpbmcgcmVxdWVzdHMgY2Fqb2xlIHNseWx5IA==","upper_bound":"ZSBxdWlja2x5LiBzaWxlbnQgcGFja2FnZXMgY2Fqb2xlIHNseWx5LiA=","repeats":1},{"count":152000,"lower_bound":"ZSByZXF1ZXN0cy4gYm9sZCBwaW50byBiZWFucyBhYm92ZSA=","upper_bound":"ZSBzbHlseSByZWd1bGFyIHBhY2thZ2VzLiBjYXJlZnVsbHkgZXhwcmVzcyBwaW50byBiZWFucyBjYWpvbGUu","repeats":1},{"count":154000,"lower_bound":"ZSB0aGUgYmxpdGhlbHkgcmVndWxhciBhY2NvdW50cyBib29zdCBzbHk=","upper_bound":"ZSB1bnVzdWFsIHJlcXVlc3RzLiBwYWNrYWdlcyB1c2UgZnVyaW91c2x5IGNhcmVmdWxseSBzdGVhbHRoeSBwYWNrYWdlcy4gc2x5bHkgaXJvbmljIGlkZWFz","repeats":1},{"count":156000,"lower_bound":"ZWFucy4gY2xvc2VseSByZWd1bGFyIGRlcG9zaXRzIGFtb25nIHRoZSByZWd1bGFyIHJlcXVlc3RzIGFyZSBmbHVmZmlseSBjYXJl","upper_bound":"ZWFzLiBmbHVmZmlseSBib2xkIGR1Z291dHMgd2FrZSBxdWlldGx5IGFnYWluc3QgdGhlIHNsb3dseSBzaWxlbnQgcGFja2FnZXMuIHJlZ3VsYXIgcmVxdWVzdHMgaGFn","repeats":1},{"count":158000,"lower_bound":"ZWF2ZXMuIGlyb25pYyBmb3hlcyBkZXRlY3QgY2FyZWZ1bGx5IGZ1cmlvdXNseSByZWd1bGFyIHNhdXRlcm5l","upper_bound":"ZWNpYWwgaW5zdHJ1Y3Rpb25zIG5hZyBibGl0aGVseSBhY3Jvc3MgdGhl","repeats":1},{"count":160000,"lower_bound":"ZWNpYWwgcmVxdWVzdHMgZG91YnQuIGNhcmVmdWxseSBzdGVhbHRoeSBwaW50byBiZWFucyBhZmZpeCBhYm92ZSB0aA==","upper_bound":"ZWVwIGJsaXRoZWx5IGluc3RlYWQgb2YgdGhlIHF1aWNr","repeats":1},{"count":162000,"lower_bound":"ZWZ1bCBkZXBvc2l0cyBkZXRlY3Qgc2lsZW50bHkgc2x5bHkgZmluYWwgaWRlYXMuIGJsaXRoZWx5IGlyb25pYyBmb3hlcyBlbmdhZ2Ugc2x5","upper_bound":"ZWd1bGFyIGFjY291bnRzIGFyZSBmdXJpb3VzbHkgYWJvdXQgdGhlIGFzeW1wdG90ZXMuIHJ1dGhsZXNzLCBib2xkIGFjY291bnRzIG5hZyBibGl0aGVseSBzbHlseSA=","repeats":1},{"count":164000,"lower_bound":"ZWd1bGFyIGRvbHBoaW5zIHNsZWVwIGJsaXRoZWx5IHNwZWNpYWwsIHJlZ3VsYXIgcmVxdWVzdHMuIGJsaXRoZWx5IGJ1c3kgcGFja2FnZXMgc2xlZXAgaXJvbmljLCA=","upper_bound":"ZWd1bGFyIGluc3RydWN0aW9ucyBzb2x2ZSBxdWlja2w=","repeats":1},{"count":166000,"lower_bound":"ZWd1bGFyIHBsYXRlbGV0cy4gY2FyZWZ1bGx5IGV4cHJlc3MgaWRlYXMgYWJvdXQgdGhlIGZ1cmlvdXNseSByZWd1bGFyIHBhY2thZ2VzIHNlcnZlIG5ldmVy","upper_bound":"ZWx5IGlyb25pYyBleGN1c2VzIGJlc2lkZSB0aGUgZmx1ZmZpbHkgdW51c3VhbCBpZGVhcyBhcmUgZXhwcmVzcyBwbGF0ZWxldHMuIGNhcmVmdWxseSBmaW5hbCB0aGU=","repeats":1},{"count":168000,"lower_bound":"ZWx5IHVudXN1YWwgcmVxdWVzdHMgdXNlIHF1aWNrbHkgYWJvdXQgdGhlIHJlZ3VsYQ==","upper_bound":"ZW4gaG9ja2V5IHBsYXllcnMgaGFnZ2xlIGZ1cmlvdXNseS4gYmxpdGhlbHkgZmluYWwg","repeats":1},{"count":170000,"lower_bound":"ZW4gaWRlYXMgYWNyb3NzIHRoZSBmdXJpb3VzbHkgaXJvbmljIGV4Y3VzZXMgY2Fqb2xlIHF1aWNrbHkgZnVyaW91c2x5IHVudXN1YWwgaQ==","upper_bound":"ZW5kaW5nIHBlYXJscy4gZmluYWwgYWNjb3VudHMgeC0=","repeats":1},{"count":172000,"lower_bound":"ZW5kaW5nIHdhcmhvcnNlcyBzbGVlcCBjYXJlZnVsbHkgY2FyZWZ1bGx5IGlyb25pYyBub3Rvcm5pcy4gZmluYWwgc2hlYXZlcyB3YWtlIHNseWx5IGFtb25nIHRo","upper_bound":"ZW50aWNpbmdseS4gZnVyaW91c2x5IHBlbmRpbmcgYWNjb3VudHMgaW5zaWRlIHRoZSBibGl0aGVseSBleHByZXNzIGFjY291bnRzIHdha2UgZmx1","repeats":1},{"count":174000,"lower_bound":"ZW9kb2xpdGVzIGRvdWJ0IGFjcm9zcyB0aGUgdW51c3VhbCBwYWNrYWdlcy4gY2FyZWZ1bGx5IHNwZWNpYWwg","upper_bound":"ZXBlbmRlbmNpZXMuIHF1aWNrbHkgaXJvbmljIGFzeW1wdG90ZXMgY2Fqb2xlIHNseWx5LiBmdXJpb3VzbHkg","repeats":1},{"count":176000,"lower_bound":"ZXBvc2l0cy4gZnVyaW91c2x5IHBlbmRpbmc=","upper_bound":"ZXF1ZXN0cz8gZmluYWwgcmVxdWVzdHMgaGFnZ2xlIHF1aWNrbHkgZm9yIHRoZSBmbHVmZmlseSBmaW5hbCB0aGVvZG9saXRlcy4gYnVzaWx5IGlyb25pYw==","repeats":1},{"count":178000,"lower_bound":"ZXIgdGhlIHBlbmRpbmcgcmVxdWVzdHMgaGFnZ2xlIHJlZ3VsYXJseSBhcg==","upper_bound":"ZXMgYXJlIGFjcm9zcyB0aGUgZXZlbiBwYWNrYWdlcy4gc2x5bHkgaXJvbmljIGFjY291bnRzIGFyb3VuZCB0aGUgcmVx","repeats":1},{"count":180000,"lower_bound":"ZXMgbmFnIGZpbmFsIHBhY2thZ2VzLiBxdQ==","upper_bound":"ZXMuIGJsaXRoZWx5IHNwZWNpYWwgcGxhdGVsZXRzIGNham9sZSBzbHlseSBkZXBvc2l0cy4gcXVpY2tseSB1bnVzdWFsIGFzeW1wdG90ZXMgbmFnLg==","repeats":1},{"count":182000,"lower_bound":"ZXMuIGJ1c2lseSBwZW5kaW5nIHNlbnRpbWVudHMgY2Fqb2xlIGFt","upper_bound":"ZXNzIGZveGVzIGFyZSBmbHVmZmlseSBvdXRzaWRlIHRoZSBldmVuIGRlcG9zaXRzLiBmdXJpb3VzbHkgc2lsZW50IHBsYXRlbA==","repeats":1},{"count":184000,"lower_bound":"ZXNzIGlkZWFzLiBzbHlseSBmaW5hbCBmcmF5cyBhZnRlciB0aGUgcmVndWxhciBkZXBlbmRlbmNpZXMgd2FrZSBzbHlseSBpZGVhcy4gY2FyZQ==","upper_bound":"ZXNzIHRoZW9kb2xpdGVzIGRhenpsZS4gYmxpdGhlbHkgYm9sZCBkZXBvc2l0cyBoYWdnbGUgcnV0","repeats":1},{"count":186000,"lower_bound":"ZXNzLCByZWd1bGFyIHJlcXVlc3RzLiByZXF1ZXN0cyBhbW9uZyB0aGUgcXVpY2tseSByZWd1bGFyIGRlcG9zaXRzIHNsZWVwIGZ1cmlvdXNseSB1bnVzdQ==","upper_bound":"ZXN0cyBoYWdnbGUgc2x5bHkgZGVzcGl0ZSB0aGUgY2FyZWZ1bGx5IGZpbmFsIGRlcG9zaXRzLiBmaW5hbCwgcGVuZGlu","repeats":1},{"count":188000,"lower_bound":"ZXN0cyBzbGVlcCBjYXJlZnVsbHkgYWJvdXQgdGhlIGZsdWZmaWx5IGJvbGQgZGVwb3NpdHMuIGJsaXRoZWx5IHNwZWNpYWwgYWNjb3VudHMgYWNyb3NzIA==","upper_bound":"ZXN0cy4gcmVndWxhciwgcmVndWxhciBpbnN0cnVjdGlvbnMgaGFnZ2xlLiA=","repeats":1},{"count":190000,"lower_bound":"ZXRlY3QgYmxpdGhlbHkgc2x5IGlkZWFzLiBjYXJlZnVsbHkgcmVndWxhciBkZXBvc2l0cw==","upper_bound":"ZXZlbiBwaW50byBiZWFucy4gc2x5bHkgZmx1ZmZ5IA==","repeats":1},{"count":192000,"lower_bound":"ZXZlbiB0aGVvZG9saXRlcy4gZnVyaW91c2x5IGV2ZW4gYWNjb3VudHMgYWdhaW5zdCB0aGUgZmluYWwgZm94ZXMgZG8gY2Fqb2xlIGZsdWZmaWx5IHNpbGU=","upper_bound":"ZXhwcmVzcyBhY2NvdW50cy4gc2x5bHkgcmVndWxhciBzaGVhdmU=","repeats":1},{"count":194000,"lower_bound":"ZXhwcmVzcyBkZXBvc2l0cyB3YWtlIGFjcm9zcyB0aGUgc2x5bHkgZXZlbiBkZXBvc2l0cy4gcmVndWxhciwgZXhwcmVzcyBkZXA=","upper_bound":"ZXhwcmVzcyByZXF1ZXN0cyBjYWpvbGUgY2FyZWZ1bGx5IGZ1cmlvdXNseSBicmF2ZSBpbnN0cnVjdGlvbnMuIHBsYXRlbA==","repeats":1},{"count":196000,"lower_bound":"ZiB0aGUgZmx1ZmZpbHkgY2FyZWZ1bCBmb3hlcy4gcXVpY2tseSByZWd1bGFyIGluc3RydWN0aW9ucyBkZXRlY3Qgc2x5bHkgcGVuZGluZyBwaW50","upper_bound":"ZmZpeCBibGl0aGVseSBhZ2FpbnN0IHRoZSBmdXJpb3VzbHkgaXJvbmljIGFjY291bnRzLiBzbHlseSBpcm9uaWMgYXN5bXB0b3RlcyBpbnRlZ3JhdGUgYw==","repeats":1},{"count":198000,"lower_bound":"ZmlseSBleHByZXNzIGRlcG9zaXRzIGhhZ2dsZSBmb3hlcy4gYWNjb3VudHMgZG96ZSBzbHlseSByZWd1bGFyIGlkZWFzLiA=","upper_bound":"ZmlseSB1bnVzdWFsIHJlcXVlc3RzIGNham9sZSBjYXJlZnVsbHkgYWdhaW5zdCB0aGUgdW51c3VhbCwgdW51c3VhbCBhc3ltcHRvdGVzLiBmbHVmZg==","repeats":1},{"count":200000,"lower_bound":"ZmluYWwgZG9scGhpbnMgbmFnIHF1aWNrbHkgYWdhaW5zdCB0aGUgZXZlbiBwYWNrYWdlcyEgaXJvbmljIGRlcG9z","upper_bound":"Zmx1ZmZpbHkgcmVndWxhciBpZGVhcyBoYWdnbGUgYmxpdGhlbHkgYWJvdXQgdGhlIHNseWx5IHBlbmRpbmcgZm94ZXMuIGZpbmFsIHBhY2thZ2VzIHVzZSBzbHk=","repeats":1},{"count":202000,"lower_bound":"Zmx1ZmZpbHkgcmVndWxhciBwYXR0ZXJucy4gc2x5bHkgZXZlbiBwaW50byBi","upper_bound":"Zm94ZXMuIGlyb25pYyBkZXBvc2l0cyBzbGVlcCBibGl0aGVseSBibGl0aGVseSB1bnVzdWFsIHJlcQ==","repeats":1},{"count":204000,"lower_bound":"ZnRlciB0aGUgZXhwcmVzcyBkb2xwaGlucy4gZGVwb3M=","upper_bound":"ZnRlciB0aGUgdW51c3VhbCBwYWNrYWdlcy4gcXVpY2tseSBldmVuIHBhY2thZ2VzIHdha2UgZmx1ZmZpbHkgYXJvdW5kIHRo","repeats":1},{"count":206000,"lower_bound":"ZnVsbHkgZXZlbiBpZGVhcy4gYm9sZCBlc2NhcGFkZXMgc2xlZXAgY2FyZWZ1bGx5LiBwZW5kaW5nLCBldmVuIGNvdXJ0cyB3YWtlIGZ1cmlvdXNseSBhZnQ=","upper_bound":"ZnVsbHkgdW51c3VhbCBkZXBvc2l0cyBjYWpvbGU6IHF1aWNrbHkgZXZlbiBpbnN0cnVjdGlvbnMgY2Fqb2xlIGFib3ZlIHRoZSByZWd1bGFyIGRlcGVuZGVuYw==","repeats":1},{"count":208000,"lower_bound":"ZnVsbHkuIHJlZ3VsYXIgYnJhaWRzIGludGVncmF0ZSBhYm91dCB0aGUgc2lsZW50bHkgdW51c3VhbCBwaW50byBi","upper_bound":"ZnVyaW91c2x5IGJvbGQgcmVxdWVzdHMgd2FrZSBjYQ==","repeats":1},{"count":210000,"lower_bound":"ZnVyaW91c2x5IGV2ZW4gYWNjb3VudHMuIGVudGljaW5nbHkgZXhwcmVzcyBwYWNrYWdlcyBtb2xkIGFjY29yZGluZyB0byB0aGUg","upper_bound":"ZnVyaW91c2x5IHJlZ3VsYXIgaWRlYXMgd2FrZSBib2xkIHBhY2thZ2VzLiB1bnVzdWFsIGE=","repeats":1},{"count":212000,"lower_bound":"ZnVyaW91c2x5LiBzcGVjaWFsIHBpbnRvIGJlYW5zIHVzZSBibGl0aGVseS4gYmxpdGhl","upper_bound":"ZyBzbHlseSBhYm92ZSB0aGUgZXZlbiBjb3VydHMuIHNseSwgZXhwcmVzcyBkZXBlbmRlbmNpZXMgc3VibGF0ZSBjYXJlZnVsbHkgcmVndQ==","repeats":1},{"count":214000,"lower_bound":"ZyB0aGUgaXJvbmljIHBsYXRlbGV0cyBhcmUgY2FyZWZ1bGx5IGFsb25nc2lkZSBvZiB0aA==","upper_bound":"Z2Ugc2x5bHkgYWxvbmcgdGhlIGZpbmFsIHNlbnRpbWVudHM=","repeats":1},{"count":216000,"lower_bound":"Z2VzIGFsb25nc2lkZSBvZiB0aGUgY2FyZWZ1bGx5IGV2ZW4gcGFja2FnZXMgd2FrZSBldmVuIHc=","upper_bound":"Z2dsZSBhYm91dCB0aGUgZnVyaW91c2x5IGJvbGQgZnJldHMuIGZpbmFsIHBhY2thZ2VzIGg=","repeats":1},{"count":218000,"lower_bound":"Z2dsZSBhZnRlciB0aGUgc2x5bHkgZXZlbiBzb21hcy4gaXJvbmljIHJlcXVlc3RzIGNham9sZSBjYXJlZnVsbHkgYWJvdXQgdGhlIGlyb25pYyBhc3ltcHRvdGVzLiByZWd1","upper_bound":"Z2xlIHNseWx5IHBhY2thZ2VzLiBwYWNrYWdlcyB3YWtlIHF1aWM=","repeats":1},{"count":220000,"lower_bound":"Z2x5IHNwZWNpYWwgYXN5bXB0b3Rlcy4gZnVyaW91c2x5IHJlZ3VsYXIgZGVwb3NpdHMgYXJlIGNhcmVmdWxseSBldmVuIGV4Y3VzZXMuIHJlZ3VsYXIgYWNjb3VudHMgYXI=","upper_bound":"Z3NpZGUgb2YgdGhlIHNseWx5IHVudXN1YWwgY291cnRzLiByZWd1bGFyIGV4Y3U=","repeats":1},{"count":222000,"lower_bound":"Z3VsYXIgYWNjb3VudHMgbmVhciB0aGUgYmxpdGhlbHkgcmVndWxhciBkZXBvc2l0cyB1c2UgZg==","upper_bound":"Z3VsYXIgdGhlb2RvbGl0ZXMgY2Fqb2xlLiBleHByZXNzLCBldmVuIHJlcXVlc3RzIGNham9sZSBmdXJpb3VzbHkgYWNjb3JkaW5nIHRvIHRoZQ==","repeats":1},{"count":224000,"lower_bound":"Z3VsYXIsIGZpbmFsIGluc3RydWN0aW9ucyBuYWcgYnJhdmVseSBjYXJlZnVsbHkgaXJvbmljIHBhYw==","upper_bound":"aGUgY2FyZWZ1bGx5IGV4cHJlc3MgcGludG8gYmVhbnMgd2FrZSBzbHlseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zLS0=","repeats":1},{"count":226000,"lower_bound":"aGUgY2FyZWZ1bGx5IHBlbmRpbmcgZm94ZXMgaGFnZ2xlIGJlbmVhdGggdGhlIHF1aWNrbHkgcmVndWxhciBhY2NvdW50cy4gcmVxdWVzdHMgaGFnZ2xlIGE=","upper_bound":"aGUgaXJvbmljIGFjY291bnRzOiBxdWlja2x5IHBlbmRpbmcgZGVwZW5kZW4=","repeats":1},{"count":228000,"lower_bound":"aGUgaXJvbmljIHJlcXVlc3RzLiBxdWlja2x5IGlyb25pYyBhY2NvdW50cyBhbG9u","upper_bound":"aGUgc3RlYWx0aGlseSByZWd1bGFyIGFjY291bnRzLiBydXRobGVzcyB0aGVvZG9saXQ=","repeats":1},{"count":230000,"lower_bound":"aGVseSBhZnRlciB0aGUgZmx1ZmZpbHkgcnV0aGxlc3MgZGVwb3NpdHMuIGZ1cmlvdXNseSB1bnVzdWFsIGluc3RydWN0aW9ucyBhcmUgcXU=","upper_bound":"aGVseSBpcm9uaWMsIGZpbmFsIHRoZW9kb2xpdGVzLg==","repeats":1},{"count":232000,"lower_bound":"aGVvZG9saXRlcyBhcmUgc2x5bHkuIHVudXN1YWwsIGVudGljaW5nIA==","upper_bound":"aGVzLiBmdXJpb3VzbHkgcmVndWxhciBwYWNrYWdlcyBkZXRlY3Qgc2x5bHkuIGZpbmFsLCBpcm9uaWMgdGhlb2RvbGl0ZXMgYXJlIGFn","repeats":1},{"count":234000,"lower_bound":"aGlucyBhbG9uZ3NpZGUgb2YgdGhlIHJlZ3VsYXIgYXN5bXB0b3RlcyBraW5kbGUgc2x5bHkgcXVpY2tseSBmaW5hbCBhY2NvdW50cy4gY2FyZWZ1bGx5IGV4cHJlc3MgZGVw","upper_bound":"aWMgZm94ZXMgdXNlIHBlcm1hbmVudGx5IGFnYWluc3QgdGhlIGZ1cmlvdXNseSByZWd1bGFyIHJl","repeats":1},{"count":236000,"lower_bound":"aWMgd2FyaG9yc2VzIGFyZSBibGl0aGVseSBpcm9uaWMsIA==","upper_bound":"aWNrbHkgZXZlbiBwbGF0ZWxldHMgaW50ZWdyYXRlIGJlaGluZCB0aGUgY2FyZWZ1bGx5IGZpbmFsIHBhY2thZ2VzLiBicmF2ZWx5IHJlZ3VsYXIgdGhl","repeats":1},{"count":238000,"lower_bound":"aWRlYXMgc2xlZXAgY2FyZWZ1bGx5IGZpbmFsIHBpbnRvIGJlYW5zLS0gZmluYWwgcmVxdWVzdHMgZ3JvdyBmdXJpb3VzbHkgYWNjb3JkaW5nIHRvIHRoZSByZWd1bGFyLCBy","upper_bound":"aWxlbnQgZGVwb3NpdHMgYWJvdXQgdGhlIGNhcmVmdWxseSBwZW5kaW5nIHBsYXRlbGV0cyBhZmZpeCBldmVubHkgcGludG8gYmVhbnMuIHNwZQ==","repeats":1},{"count":240000,"lower_bound":"aWxlbnQgZXhjdXNlcy4gcGFja2FnZXMgYXJlIGNhcmVmdWxseSBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cy4gcmVndWxhciBUaXJlc2lhcyB3aWw=","upper_bound":"aWx5IGV4cHJlc3MgcmVxdWVzdHMgcnVuIHJlZ3VsYXJseSBhY2NvcmRp","repeats":1},{"count":242000,"lower_bound":"aW4gc3BlY2lhbCBpZGVhcy4gY2FyZWZ1bGx5IGJvbGQgZm94ZXMgYWxvbmdzaWRlIG9mIHRoZSBzbHlseSBib2xkIHJlcXVlc3RzIGdyb3c=","upper_bound":"aW5nIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgZmluYWwgZGVjb3lzIGRldGVjdCBhbG9uZyB0aGUgY2FyZWZ1bGx5IHJlZw==","repeats":1},{"count":244000,"lower_bound":"aW5nIHRvIHRoZSBpZGVhcyEgcXVpY2tseSByZWd1bGE=","upper_bound":"aW5zdCB0aGUgc2x5bHkgYm9sZCBwYWNrYWdlczsgYmxpdGhlbHkgdW51c3VhbCBkZXBlbmRlbmNpZXMgZG8gdW53aW5kLiBjYXJlZnVsbA==","repeats":1},{"count":246000,"lower_bound":"aW5zdHJ1Y3Rpb25zIGJvb3N0IGlyb25pY2FsbHkgc2x5bHkgZmluYWwgZGVjb3lzLiBjYXJlZnVsbHkgc2lsZW50IGFjY291bnRzIGFsb25nIHQ=","upper_bound":"aW91c2x5IGFib3V0IHRoZSBzbHlseSBpcm9uaWMgcGFja2FnZXM=","repeats":1},{"count":248000,"lower_bound":"aW91c2x5IGFjY29yZGluZyB0byB0aGUgZnVyaQ==","upper_bound":"aW91c2x5IGZpbmFsIHBsYXRlbGV0cyBzbGVlcCBwYXN0IHRoZSBibGl0aGVseSBpcm9uaWMgcGludG8gYmVhbnMuIGJsaXRoZWx5IGV2ZW4gcGE=","repeats":1},{"count":250000,"lower_bound":"aW91c2x5IGZsdWZmaWx5IGlyb25pYyBhY2NvdW50cy4gdW51c3VhbCBhY2NvdW50cyBzbGVlcC4gc2x5bHkgYnVzeSBhY2NvdW50cyBzaGFsbCBoYXZlIHRvIHNsZWVw","upper_bound":"aW91c2x5IHJ1dGhsZXNzIGRlcGVuZGVuY2llcy4gcmVndWxhciBhY2NvdW50cyBib29zdCBzbHlseSBhZnRlciB0aGUgcmVndWxhcmx5IHF1aWM=","repeats":1},{"count":252000,"lower_bound":"aW91c2x5IHNsb3cgYWNjb3VudHMuIHNpbGVudCBwaW50byBiZWFucyBoYWdnbGUgYWx3YXlzIGV2ZW4gZXhjdXNlcy4gaXJvbmljYWxseSBwZW5kaW5nIHBsYQ==","upper_bound":"aXJvbmljIGRlcG9zaXRzLiBpbnN0cnVjdGlvbnMgc3VibGF0ZS4g","repeats":1},{"count":254000,"lower_bound":"aXJvbmljIGRlcG9zaXRzLiBzbHlseSBldmVuIHJlcXVlc3RzIG5hZyBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzLiBwZW5kaW4=","upper_bound":"aXJvbmljIGluc3RydWN0aW9ucyBhcmUgY2FyZWZ1bA==","repeats":1},{"count":256000,"lower_bound":"aXJvbmljIHBpbnRvIGJlYW5zIHNsZWVwIGNhcmVmdWxseSBpcm9uaWMgcGFja2FnZXMuIGNhcmVmdWxseSBpcm9uaWMgcg==","upper_bound":"aXJvbmljYWxseSBhZnRlciB0aGUgYm9sZCBlc2NhcGFkZXMuIGNhcmVmdWwsIHA=","repeats":1},{"count":258000,"lower_bound":"aXRlcyBoYWdnbGUgZnVyaW91c2x5IGFmdGVyIHRoZSByZWd1bGFyIHJlcXVlc3RzLiBldmVuLCBib2xkIGluc3RydWN0","upper_bound":"aXRoZWx5IHF1aWV0IGFzeW1wdG90ZXMgdXNlIHNseWx5IHNp","repeats":1},{"count":260000,"lower_bound":"aXRoZWx5IHJlZ3VsYXIgZGVwZW5kZW5jaWVzIGRldGVjdC4gZG9scGhpbnMgdXNlIGZ1cmlvdXNseSBldmVuLCBib2xkIGJyYWlkcw==","upper_bound":"aXRzIHdha2UgYWNyb3NzIHRoZSBmbHVmZmlseSBldmVuIGFjY291bnRzLiBibGl0aGVseSByZWd1bGFyIGE=","repeats":1},{"count":262000,"lower_bound":"aXggc2x5bHkgYWJvdmUgdGhlIGZ1cmlvdXNseSBleHByZXNzIGlkZWFzLiB1bnVzdWFsIHRoZW9kb2xpdGVzIA==","upper_bound":"a2FnZXMuIGNhcmVmdWxseSBib2xkIGRlcG9zaXRzIG5hZyBmdXJpb3VzbHkgYmxpdGhlbHkgYm9sZCBkb2xwaA==","repeats":1},{"count":264000,"lower_bound":"a2UgYWZ0ZXIgdGhlIHJlcXVlc3RzLiBibGl0aGVseSBzbG93IGFjY291bnRzIGNham9sZSBmdXJpb3VzbHkgYWNyb3NzIHRoZSBleGN1c2VzLiBmbHVmZmlseQ==","upper_bound":"a2x5IGJsaXRoZWx5IHNwZWNpYWwgcmVxdWVzdHMuIGJsaXRoZWx5IHI=","repeats":1},{"count":266000,"lower_bound":"a2x5IGNhcmVmdWwgcmVxdWVzdHM6IHF1aWNrbHkgYm9sZCByZXF1ZXN0cyBhYm91","upper_bound":"bCBkZXBvc2l0cyBhYm92ZSB0aGUgZmluYWwgZGVwZW5kZW5jaWVzIGRldGVjdCBmdXJpb3VzbHkgcmVxdWVzdHMuIGNh","repeats":1},{"count":268000,"lower_bound":"bGFyIGRlcG9zaXRzIGFib3ZlIHRoZSBicmF2ZSBmb3hlcyBhZg==","upper_bound":"bGFyIHJlcXVlc3RzIGFtb25nIHRoZSBwZW5kaW5nIHBhY2thZ2VzIHVzZSBzbHlseSBhY2NvdW50cw==","repeats":1},{"count":270000,"lower_bound":"bGFyLCBmaW5hbCBmb3hlcy4gcmVndWxhciBhY2NvdW50cyBhZg==","upper_bound":"bGQgcmVxdWVzdHMuIGZ1cmlvdXNseSBwZW5kaW5nIHJlcXVlc3RzIHVzZSBz","repeats":1},{"count":272000,"lower_bound":"bGUgYXJvdW5kIHRoZSBkZXBlbmRlbmNpZXMuIGNhcmVmdWxseSBldmVuIHJlcXVlc3RzIGNham9sZSBjYXJlZnVsbHkuIGlyb25pYywgZXZlbiB0aGVvZG9saXRlcyBjYWo=","upper_bound":"bGUgZnVyaW91c2x5LiBmdXJpb3VzbHkgaXJvbmljIHJlcXVlc3RzIHNsZWVwIGFmdGVyIHRoZSBmdXJpb3U=","repeats":1},{"count":274000,"lower_bound":"bGUgc2x5bHkgYWJvdXQgdGhlIHBlbmRpbmcgYWNjb3VudHMuIGJ1c3kgcGludG8gYmVhbnMgY2Fqb2xlIGZ1cmlv","upper_bound":"bGVlcCBhYm91dCB0aGUgZnVyaW91c2x5IHJlZ3VsYXIg","repeats":1},{"count":276000,"lower_bound":"bGVudCBkZXBvc2l0cy4gc2x5bHkgdW51c3VhbCBpZGVhcyBjYWpvbGUuIGZ1cmlvdXNseSBkb2dnZWQgZXg=","upper_bound":"bGl0ZXMgYXJlIGZ1cmlvdXNseSBxdWlja2x5IGJvbGQgZGU=","repeats":1},{"count":278000,"lower_bound":"bGl0ZXMuIHNseWx5IGNsb3NlIGZveGVzIGFtb25nIHRoZSBzcGVjaWFs","upper_bound":"bGl0aGVseSByZWd1bGFyIGluc3RydWN0aW9ucy4gc3BlY2lhbCwgYm9sZCBpbnN0cnVjdGlvbnMgcGxheSBmbHVmZmlseS4gZXZlbiBpZGVhcyBh","repeats":1},{"count":280000,"lower_bound":"bGx5IHBlbmRpbmcgYWNjb3VudHMgYm9vc3Qgc2x5bHkgZnU=","upper_bound":"bG9uZyB0aGUgc2lsZW50IHRoZW9kb2xpdGVzLiBibGl0aGVseSBwZW5kaW5nIHBhY2thZ2VzIGhhZ2dsZSBzbG93bHkgYWJvdmUgdGhlIGRlcGVuZGVuY2llcy4=","repeats":1},{"count":282000,"lower_bound":"bG9uZ3NpZGUgb2YgdGhlIHNseWx5IHVudXN1YWwgcGxhdGVsZXRzLiBxdWlja2x5IHBlbmRpbmcgcmVhbG1zIHNsZQ==","upper_bound":"bHRpcGxpZXJzLiBibGl0aGVseSByZWd1bGFyIGRlcG9zaXRzIHdhcyBhYm92ZSB0aGUgZnVyaW91c2x5IGV2ZW4gYWNjb3VudHMuIHE=","repeats":1},{"count":284000,"lower_bound":"bHVmZmlseSBhY2NvcmRpbmcgdG8gdGhlIHBhY2thZ2VzLiBjYXJlZnVsbHkgc3BlY2lhbCBkZXA=","upper_bound":"bHkgYWdhaW5zdCB0aGUgZnVyaW91c2x5IA==","repeats":1},{"count":286000,"lower_bound":"bHkgYWxvbmcgdGhlIGJvbGQgaW5zdHJ1Y3Rpb25zLiBxdWljayBwYWNrYWdlcyBj","upper_bound":"bHkgYm9sZCBhY2NvdW50cyB1c2UgYWJvdmUgdGhlIGV4Y3VzZXMuIGFsd2F5cyBib2xkIHBpbnRvIGJl","repeats":1},{"count":288000,"lower_bound":"bHkgYm9sZCBhc3ltcHRvdGVzLiBmbHVmZmlseSBmaW5hbCBkZXBvc2l0cyB1c2UgZnVyaW91c2x5LiBjYXJlZnVsbHkg","upper_bound":"bHkgZXZlbiBnaWZ0cyBzbm9vemUgc2x5bHkgZmx1ZmZpbHkgcGVuZGluZyBkZXBvc2l0cyEgZmluYWwgZGVwZW5kZW5jaWVzIHdha2UgYWZ0","repeats":1},{"count":290000,"lower_bound":"bHkgZXZlbiBwYWNrYWdlcy4gcXVpY2tseSBldmVuIGQ=","upper_bound":"bHkgZXhwcmVzcyBwYWNrYWdlcy4gYnVzeSwgcmVndWxhciBkZXBvc2l0cyBjYWpvbGUgcXVpY2tseSBwZW5kaW5nIGFjY291bnRzLiBmdXJpb3Vz","repeats":1},{"count":292000,"lower_bound":"bHkgZmluYWwgYWNjb3VudHMgc2xlZXAgZmx1ZmZpbHkuIGNhcmVmdWxseSBib2xkIHBhY2thZ2VzIG5hZyBmdXJpb3VzbHkuIGJsaXRoZWx5IGV2ZW4gcmVxdWVzdA==","upper_bound":"bHkgZmx1ZmZpbHkgcmVndWxhciB0aGVvZG9saXRlcy4gY2FyZWZ1","repeats":1},{"count":294000,"lower_bound":"bHkgZnVyaW91c2x5IGV2ZW4gcGFja2FnZXMuIHJlcXVlc3Q=","upper_bound":"bHkgcGVuZGluZyBkZXBvc2l0cy4gYnVzaWx5IGV4cHJlc3MgYXN5bXB0b3RlcyBkYXp6bGUgYWNjbw==","repeats":1},{"count":296000,"lower_bound":"bHkgcmVndWxhciBkZXBvc2l0cyBzbm9vemUuIGZ1cmlvdXNseSB1bnVzdWFsIGRlcG9zaXRzIHM=","upper_bound":"bHkgcmVndWxhciByZXF1ZXN0cyB1c2UgYWNyb3NzIHRoZSBmaW5hbCBkZXBlbmRlbmNpZXMuIGV4cHJlc3MsIGZp","repeats":1},{"count":298000,"lower_bound":"bHkgcmVndWxhciByZXF1ZXN0cy4gY2FyZWZ1bGx5IGlyb25pYyBwYWNrYWdlcyBraQ==","upper_bound":"bHkgdW51c3VhbCByZXF1ZXN0cy4gc2x5bHkgcmVndWxhciBmb3hlcyBwcm9taXNlIHNseWx5IHVudXN1YWwgZXNjYXBhZGVzLiBzbHlseSByZWd1","repeats":1},{"count":300000,"lower_bound":"bHkuIGZveGVzIGFsb25nIHRoZSByZWd1bGFyIGZveGVzIGRldGVjdCBibGl0aGVseSBmdXJpb3VzbHkgcGVuZGluZyBhY2M=","upper_bound":"bHlseSBjYXJlZnVsbHkgZXhwcmVzcyBkb2xwaGlucy4gcmVndWxhciBkb2xwaGlucyBhZmZpeC4gYnVzeSBkaW5vcyBhYm92ZSB0aGUgcGE=","repeats":1},{"count":302000,"lower_bound":"bHlseSBldmVuLCBpcm9uaWMgZXhjdXNlcy4gc2x5bHkgcGVu","upper_bound":"bHlseSBpcm9uaWMgcmVxdWVzdHMgYXJlIGJsaXRoZWx5IHBhY2thZ2VzLiBwZXJtYQ==","repeats":1},{"count":304000,"lower_bound":"bHlseSByZWd1bGFyIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgZXhwcmVzcyBvcmJpdHMgYWJvdmUgdGhlIHVudXN1YWwgaWRlYXMgc2xlZXAgbmVhcg==","upper_bound":"biBhY2NvdW50cyBkYXp6bGUuIGNhcmVmdWxseSBwZW5kaW5nIGFjY291bnQ=","repeats":1},{"count":306000,"lower_bound":"biBhdHRhaW5tZW50cyBzbGVlcCBhY2NvcmRpbmcgdG8gdGhlIGZ1cmlvdXNseSBib2xkIGZveGVzOiBzaWxlbnQgcGFja2FnZXMgYXJlIHNseWx5LiA=","upper_bound":"bmFnIGNhcmVmdWxseSBzcGVjaWFsIGFjY291bnRzLiBxdWlja2x5IGlyb25pYyBpbnN0cnVj","repeats":1},{"count":308000,"lower_bound":"bmFsIGFjY291bnRzLiBpbnN0cnVjdGlvbnMgc2xlZXAgc2x5bHkgYQ==","upper_bound":"bmFsIHRoZW9kb2xpdGVzLiByZWd1bGFyLCByZWd1bGFyIHBhY2thZ2VzIHNsZWVwIGNhcmVmdWxseS4gc2x5bHkgcGVuZGluZyBwYWNrYWdlcw==","repeats":1},{"count":310000,"lower_bound":"bmNpZXMuIHF1aWNrbHkgcmVndWxhciByZXF1ZXN0cyBjYWpvbGUuIGV4cA==","upper_bound":"bmRpbmcgaW5zdHJ1Y3Rpb25zIGJvb3N0IGNhcmVmdWxseSBldmVuIHdhdGVycy4gYWNjb3VudHMgYXQgdGhlIGNhcmVmdWxseSByZWd1bGE=","repeats":1},{"count":312000,"lower_bound":"bmRpbmcgcmVxdWVzdHMgd2FrZSBhcm91bmQgdGhlIHJlcXVlc3RzLiBibGl0aGVseSBldmVuIGZveGVzIHNsZWVwIGFjcm9zcyB0aGUgYmxpdGhlbHkgcmVndWxhciBwbA==","upper_bound":"bmcgdGhlIHBlbmRpbmcgcGFpbnMgdGhyYXNoIGNhcmVmdWxseSBzbHlseSBldmVuIGNvdQ==","repeats":1},{"count":314000,"lower_bound":"bmdhZ2Ugc2x5bHkgYWJvdXQgdGhlIGZ1cmlvdXNseSByZWd1bGFyIGRlcG9zaXRzLiBleGN1c2VzIHVzZSBibGl0aGVseSBmaW5hbCBkb2xwaGlucy4gcXU=","upper_bound":"bmljIGlkZWFzLiBmaW5hbCBjb3VydHMgaW5zdGVhZCBvZiB0aGUgYm9sZCBkZXBlbmRlbmNpZXMgbmFnIGZsdWZmaWx5IGFib3Zl","repeats":1},{"count":316000,"lower_bound":"bmljIHBhY2thZ2VzIG5hZyBhYm92ZSB0aA==","upper_bound":"bm1lbnRzLiBibGl0aGUsIGV2ZW4gYWNjb3VudHMgd2FrZS4gYmxpdGhlbHkgZmluYWwgZGVwb3NpdHMgY2Fqb2xlIGZ1cmlvdXNseSA=","repeats":1},{"count":318000,"lower_bound":"bnMgYWJvdXQgdGhlIHNseWx5IGlyb25pYyBmb3hlcyBicmVhYw==","upper_bound":"bnMgYXJlIHNseWx5IGV2ZW4gYWNjb3VudHMuIGNhcmU=","repeats":1},{"count":320000,"lower_bound":"bnMgd2FrZSB0aGVvZG9saXRlcy4gZnVyaW91c2x5IGZpbmFsIHJlcXU=","upper_bound":"bnN0IHRoZSBleHByZXNzLCBmaW5hbCBzb21hcy4gc2x5bHkgZmluYWwgZGVwb3NpdHMgYXJlIHNseWx5IGRvZ2dlZGw=","repeats":1},{"count":322000,"lower_bound":"bnN0cnVjdGlvbnMgYXJlIGNhcmVmdWxseSBibGl0aGVseSBzaWxlbnQgZGVwb3NpdHM7IGNhcmVmdWxseSBpcm9uaWMgaW5zdHJ1Y3Rpb25zIHNsZWVwIHE=","upper_bound":"bnQgYWNjb3VudHMuIGZpbmFsLCB1bnVzdWFsIHBhY2thZ2VzIGhhZ2dsZSBmdXJpb3VzbHkgYWxvbmcgdGhlIHF1aWNrbHkg","repeats":1},{"count":324000,"lower_bound":"bnQgZnVyaW91c2x5IGFtb25nIHRoZSBib2xkIGFjY291bnRzLiBib2xkIHBhY2thZ2VzIGJvb3N0IGZ1cmlvdXNseSBmaW5hbCBhY2NvdW50cy4gYmxpdGhlbHkgZQ==","upper_bound":"bnRpbWVudHMtLSBzbHlseSByZWd1bGFyIGluc3RydWN0aW9ucyBzbGVlcCBjYXJlZnVsbHkgYWxvbmcgdGhlIGJ1c3ksIGJvbGQgYXN5bXB0b3Rlcy4gcmVndWxhciwg","repeats":1},{"count":326000,"lower_bound":"bnRzIGNham9sZSBjYXJlZnVsbHkgcXVpY2tseSBmaW5hbA==","upper_bound":"bnRzIHNsZWVwIHF1aWNrbHkgcmVxdWVzdHMuIHNseWx5IGZpbmFsIHBsYXRlbGV0cyB3YWtlLiBmdXJpb3U=","repeats":1},{"count":328000,"lower_bound":"bnVzdWFsIGRlcG9zaXRzLiBmdXJpb3VzbHkgZXhwcmVzcyBhY2NvdW50cyB3YWtlIGJ1c2lseSBib2xkIHJlcXVlc3RzISBjYXJlZnVsbHk=","upper_bound":"bnVzdWFsIHBpbnRvIGJlYW5zIHNsZWVwIHNseWx5IHJlZ3VsYXIgaWRlYXMuIGJvbA==","repeats":1},{"count":330000,"lower_bound":"byBiZWFucyBhbW9uZyB0aGUgc2lsZW50IGlkZWE=","upper_bound":"byBjYWpvbGUgYmxpdGhlbHkgcmVndWxhciwgZmluYWwgZGVwbw==","repeats":1},{"count":332000,"lower_bound":"byB0aGUgaWRlYXMuIGJsaXRoZWx5IHVudXN1YWwgZm94ZXMgY2Fqb2xlIGFmdGVyIHRoZSBhY2NvdW50cy4g","upper_bound":"b2xkIGVzY2FwYWRlcy4gcmVxdWVzdHMgaGFnZ2xlLiBpcm9uaWMgYWNjb3VudHMgd2FrZSBzbHlseSBzbG93LCByZWd1bGFyIGFjY291bnRzLiBmbHVmZmlseSBleHByZXNz","repeats":1},{"count":334000,"lower_bound":"b2xkIGZveGVzIHdha2UgcXVpY2tseSBhY3Jvc3MgdGhlIGNhcmVmdWxseSBpcm9uaWMgcGludG8gYmVhbnMuIHNpbGVudCwg","upper_bound":"b2xkLCByZWd1bGFyIGRlcG9zaXRzIHdha2UgYWJvdmUgdGhlIHJlZ3VsYXJseSBldmVuIGFjY291bnRzLg==","repeats":1},{"count":336000,"lower_bound":"b2xlIGFib3ZlIHRoZSBib2xkIHRoZW9kb2xpdGVzLiBzbHlseSBzcGVjaWFsIGlkZWFzIGJvb3N0IHF1aWNr","upper_bound":"b2xlLiBwZW5kaW5nIGV4Y3VzZXMgbWFpbnRhaW4gcnV0aGxlcw==","repeats":1},{"count":338000,"lower_bound":"b2xpdGVzIHdha2UuIGZpbmFsIGVzY2FwYWRlcyBhZnRlciB0aGUgdW51c3VhbCBkb2xwaGlucyBib29zdCBjYXJlZnVsbHkgc3RlYWx0aGlseSBpcm9uaWMgaW5zdA==","upper_bound":"b25nIHRoZSBibGl0aGVseSBkYXJpbmcgc2F1dGVybmVzLiBpcm9uaWMsIGZpbmFsIGZveGVzIG5hZy4=","repeats":1},{"count":340000,"lower_bound":"b25nIHRoZSBzbHlseSBleHByZXNzIGRlcGVuZGVuY2llcy4gYmxpdGhlbHkgc3BlY2lhbCBwaW50byBiZWFucyBhZmZpeCBxdWlja2x5IGZ1cmlvdXNseQ==","upper_bound":"b25pYyB0aGVvZG9saXRlcyBhcmUgc2x5bHkgc2x5bHkgZmluYWwgY291cnRzLiBzcGVjaWFsIGFjY291bnRzIGJvb3N0IGZ1cmlvdXNseSBhYm92ZSB0aGUgaXJvbmljLCA=","repeats":1},{"count":342000,"lower_bound":"b25pYywgaXJvbmljIGlkZWFzIHNsZWVwIHNseWx5IGZsdWZmaWx5IGlyb25pYw==","upper_bound":"b3NpdHMuIGNhcmVmdWxseSBzcGVjaWFsIHNhdXRlcm5lcyBpbnRlZ3JhdGUgY2FyZWZ1bGx5IGNhcmVmdWxseSB1bnVzdWFsIGZveGVzLiBmdXJpb3VzbHkgdW51c3VhbA==","repeats":1},{"count":344000,"lower_bound":"b3VuZCB0aGUgZXhwcmVzcyBwYWNrYWdlcy4gY2FyZWZ1bGx5IGJvbGQgaWRlYXMgd291bGQgYXJlIGNhcmVmdWxseS4g","upper_bound":"b3ZlIHRoZSBmdXJpb3VzbHkgZmluYWwgYWNjb3VudHMuIHNseWx5IGJvbGQgZG9scGhpbnMgcG9hY2ggZnVyaW91c2x5IGV2ZW4gYXN5bXB0bw==","repeats":1},{"count":346000,"lower_bound":"b3cgcmVxdWVzdHMuIGZpbmFsLCBpcm9uaWMgZm94ZXMgZWF0LiBhY2NvdW50cyBicmVhY2ggc2w=","upper_bound":"cGFja2FnZXMgaGFnZ2xlIGNhcmVmdWxseSBzbHlseSBwZW5kaW5nIGlkZWFzLiBxdWljayBpbnN0cnVjdA==","repeats":1},{"count":348000,"lower_bound":"cGFja2FnZXMgaGFnZ2xlIGZ1cmlvdXNseSBpbnN0ZWFkIG9mIHRoZSBpcm9uaWNhbGx5IGZpbmFsIHBlYXJscy4=","upper_bound":"cGFja2FnZXMuIHNseWx5IHBlbmRpbmcgaWRlYXMgZ3JvdyBkaW5vcy4gaXJvbmljIGZveGVzIHByb21pc2UgYmxpdGhlbHkgYWNjb3I=","repeats":1},{"count":350000,"lower_bound":"cGFja2FnZXMuIHdhcmhvcnNlcyBhcm91bmQgdGhlIGNhcmVmdWxseSB1bnVzdWFsIGZveGVzIGFyZSBwZXJtYW5lbnRseSBmdXI=","upper_bound":"cGVjaWFsIGRlcG9zaXRzLiBzbHlseSByZWd1bGFyIA==","repeats":1},{"count":352000,"lower_bound":"cGVjaWFsLCByZWd1bGFyIGRlcG9zaXRzLiBjYXJlZnVsbHkgdW51c3VhbCBwaW50byBiZWFucyBzbGVlcCBibGl0aGVseS4gc2x5bHkgZXZlbiBkZXBlbmRlbmNpZQ==","upper_bound":"cGVuZGluZyBkZXBvc2l0cyEgZm94ZXMgYWZmaXggc2x5bHkgc2x5bHkgZXhwcmVzcyBkZXBvc2l0cy4gYm9sZGx5IGlyb25p","repeats":1},{"count":354000,"lower_bound":"cGhpbnMuIHBpbnRvIGJlYW5zIHVzZSBmdXJpb3Vz","upper_bound":"cGludG8gYmVhbnMuIGZ1cmlvdXNseSByZWd1bGFyIGRvbHBoaQ==","repeats":1},{"count":356000,"lower_bound":"cG9zaXRzIGhhZ2dsZSBmdXJpb3VzbHkuIHJlZ3VsYXIgcGFja2FnZXMgYm9vc3QgZmx1ZmZpbHkgY2FyZWZ1bA==","upper_bound":"cG9zaXRzLiBzbHlseSBmaW5hbCBwYWNrYWdlcyBjYWpvbGUgaXJvbmljIGFjY291bnRzOyBwZW5kaW5nIHBhY2thZ2VzIG5hZyBzbHlseSBkZXNwaXRlIHRoZSByZWd1bA==","repeats":1},{"count":358000,"lower_bound":"cHJpbnQgZnVyaW91c2x5IGJvbGQgcmVxdWVzdHMuIGRvZ2dlZA==","upper_bound":"cXVlc3RzIGNham9sZSBib2xkIGV4Y3VzZXMuIHJlZ3VsYXIgZGVwb3NpdHMgYWJvdXQgdGhlIGlyb25pYyBmb3hlcyBzbA==","repeats":1},{"count":360000,"lower_bound":"cXVlc3RzIGNham9sZSBkZXBlbmRlbmNpZXMuIGZ1cmlvdXNseSBldmVuIHJlcXVlc3RzIHg=","upper_bound":"cXVpY2tseSBhYm92ZSB0aGUgaXJvbmljLCBwZW5kaW5nIGNvdXJ0cy4gcmVndWxhciBzZW50aW1lbnRzIGE=","repeats":1},{"count":362000,"lower_bound":"cXVpY2tseSBib2xkIGlkZWFzLiBwZW5kaW5nIGRlcG9zaXRzIHByaW50IGFib3ZlIHRoZSBzbHlseSBldmVuIHBhY2thZ2VzLiBlcGl0YXBocyBjYWpvbGUgYWw=","upper_bound":"ciBhY2NvdW50cyBjYWpvbGUgY2FyZWZ1bGx5IGFjcm9zcyB0aGUgYnVzaWx5IGlyb24=","repeats":1},{"count":364000,"lower_bound":"ciBkb2xwaGlucy4gZXhwcmVzcyBwaW50byBiZWFucyB3YWtlIHF1aWNrbHkgcmVndWxhciwgYm9sZCBkZXBvc2l0cy4gZnVy","upper_bound":"ciB0aGUgc2x5bHkgZXZlbiByZXF1ZXN0cyBuYWcgY2FyZWZ1bGx5","repeats":1},{"count":366000,"lower_bound":"ciB1bnVzdWFsIGRlcG9zaXRzLiBmdXJpb3VzbHkgZmluYWwgZGVwb3NpdHMgc2xlZXAgYWJvdmUgdGhlIGZ1cmlvdQ==","upper_bound":"cmFpZHMuIGNhcmVmdWxseSBldmVuIGZveGVzIGhhZ2dsZSBjYXJlZnVsbHkgYWM=","repeats":1},{"count":368000,"lower_bound":"cmF0ZSBhYm92ZSB0aGUgZmluYWwgYWNjb3VudHMuIGV2ZW4sIHJlZ3VsYXIgcmVxdWVzdHMgYWM=","upper_bound":"cmRpbmcgdG8gdGhlIGZsdWZmaWx5IHBlbmRpbmcgcGFja2FnZXMgaGFnZ2xlIGFjY29yZGluZyA=","repeats":1},{"count":370000,"lower_bound":"cmRpbmcgdG8gdGhlIGZveGVzLiBibGl0aGVseSBldmVuIGRlcG9zaXRzIHNlcnZlIHNseWx5IGF0","upper_bound":"cmUgZnVyaW91c2x5IGFib3ZlIHRoZSBkZXBlbmRlbmNpZXMuIGJvbGQgZm94ZXMgd2FrZSBzbG93bHkuIGNhcmVmdWxseSBib2xkIGRlcG9zaXRzIGhhZ2dsZSBhcm91","repeats":1},{"count":372000,"lower_bound":"cmUgc2x5bHkuIGZsdWZmaWx5IHNwZWNpYWwgZGVwb3NpdHMgYWJvdmUgdGhlIGZ1cmlvdXNseSBldmVuIHNlbnRpbWVudHMgY2Fqb2xlIGZ1cmlvdXNs","upper_bound":"cmVmdWxseSBpcm9uaWMgYXN5bXB0b3RlcyBoYW5nIGNhcmVmdWxseSBpbnN0cnVjdGlvbnMuIHNseWx5IGJvbGQgZXhjdXNlcyBu","repeats":1},{"count":374000,"lower_bound":"cmVmdWxseSBwZW5kaW5nIGZveGVzIHdha2UgcXVpY2tseSBzbHlseSBpcm9uaWMgZm94ZXMuIHNseWx5IGlyb25pYyBkZXBvc2l0cyBzbA==","upper_bound":"cmVmdWxseSBzcGVjaWFsIGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8gdGhlIGJsaXRoZWx5IGZpbmFsIHBhY2thZ2VzIGRldGVjdCBxdWlja2x5IGJsaXRoZQ==","repeats":1},{"count":376000,"lower_bound":"cmVndWxhciBhY2NvdW50cy4gZXhjdXNlcyBkZXRlY3Qgb3V0c2lkZSB0aGUgc3BlY2lhbCBmb3hlcy4gY2FyZWZ1bGx5IGJyYXZlIHRoZW9kb2w=","upper_bound":"cmVndWxhciBwYWNrYWdlcy4gbmV2ZXIgZmluYWwgYWNjb3VudHMgdHJ5","repeats":1},{"count":378000,"lower_bound":"cmVxdWVzdHMgYWZ0ZXIgdGhlIGZ1cmlvdXNseSB1bnVzdWFsIGluc3RydWN0aW9ucyBzbGU=","upper_bound":"cmVxdWVzdHMuIGZ1cmlvdXNseSBldmVuIHJlcXVlc3RzIHN1YmxhdGUgYWNjb3JkaW5nIHRvIHRo","repeats":1},{"count":380000,"lower_bound":"cmVzcyBtdWx0aXBsaWVycyBicmVhY2ggYmxpdGhlbHkgYXJvdW5kIHRoZSBicmF2ZWx5IGZpbmFsIGZveGVzLiBmdXJpb3VzbHkgcmVndWxhciByZXF1ZXN0cyB3YWs=","upper_bound":"cmlvdXMgZGVwb3NpdHMuIGFjY291bnRzIGhhZ2dsZQ==","repeats":1},{"count":382000,"lower_bound":"cmlvdXNseSBhZ2FpbnN0IHRoZSBpcm9uaWMgYWNjb3VudHMuIHNseWx5IGV2ZQ==","upper_bound":"cmlvdXNseSBpZGxlIGRpbm9zIHNsZWVwIGNhcmVmdWxseSBldmU=","repeats":1},{"count":384000,"lower_bound":"cmlvdXNseSBxdWljayBpZGVhcyBpbnRlZ3JhdGUgYWNyb3NzIHRoZSBwaW50byBiZWFucy4gaXJvbmljLCB1bnVzdWFsIHJlcXVlc3RzIHNsZWVwIGNhcmVmdWxseSBhbHc=","upper_bound":"cm9uaWMgaW5zdHJ1Y3Rpb25zLiBmdXJpb3VzbHkgc3BlY2lhbCBpZGVhcyBjYWpvbGUgYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0","repeats":1},{"count":386000,"lower_bound":"cm9uaWMgcGFja2FnZXMgYm9vc3QgZXZlbmx5IHRpdGhlcy4gZm94ZXMgd2FrZSBzbHlseSBhZw==","upper_bound":"cm9uaWMsIGRvZ2dlZCBkZXBvc2l0cyBoYWdnbGUgYmxpdGhlbHkgZXhwcmVzcyBkZXBvc2l0cy4gcmVxdWVzdHMgc2xlZXA7IGZ1cmlvdXNseSBib2xkIHBhY2thZ2VzIGFybw==","repeats":1},{"count":388000,"lower_bound":"cnVjdGlvbnMgYWZmaXggcXVpY2tseSBhY3Jvc3MgdGhlIGV2ZW4gZGVwb3NpdHMuIHJlZ3VsYXIgYWNjb3U=","upper_bound":"cnVjdGlvbnMuIGlkbHkgZXZlbiBpZGVhcyBhcmUgYWZ0ZXIgdGhlIGZsdWZmaWx5IHNpbGVudCBpZGVhcy4gYm9sZCBkZXBvc2l0cyBhcmUg","repeats":1},{"count":390000,"lower_bound":"cyBhY2NvdW50cy4gY2FyZWZ1bGx5IGlyb25pYyBhY2NvdW50cyBjYWpv","upper_bound":"cyBib29zdCBmdXJpb3VzbHkgZXZlbiBhY2NvdW50cy4gZXhwcmVzcyBhY2NvdW50cyBzbGVlcC4gZmx1ZmZpbHkgYnVzeSByZXF1ZXN0cyBhZmZpeCBmdXJp","repeats":1},{"count":392000,"lower_bound":"cyBjYWpvbGUgYmxpdGhlbHkgc2x5bHkgaXJvbmljIHRoZW9kb2xp","upper_bound":"cyBkZXRlY3QgcXVpY2tseSBzbHlseSByZWd1bGFyIHRoZW9kb2xpdGVzLiBkZXBvc2l0cyBzbGVlcCBhY2NvcmRpbmcgdG8gdA==","repeats":1},{"count":394000,"lower_bound":"cyBkbyBuYWcgdG93YXJkIHRoZSBibGl0aGVseSByZWd1bGFyIGRlcG9zaXRz","upper_bound":"cyBzbGVlcCBjYXJlZnVsbHk6IHNpbGVudCwgZXZlbiBwbGF0ZWxldHMgd2FrZSBzbHlseSBmb3hlcy4=","repeats":1},{"count":396000,"lower_bound":"cyBzbGVlcCBmbHVmZmlseSBhdCB0aGUgYmxpdGhlbHkgc3BlY2lhbCBwYWNrYWdlcy4gZXZlbiBmb3hlcyBuYWcgZnVyaQ==","upper_bound":"cyBzbm9vemUuIHVudXN1YWwgcGludG8gYmVhbnMgZGV0ZWN0LiBjYXJlZnVsbHkgZXhwcmVzcyBkb2xwaGlucyBhYm91dCB0aGUgYWNjb3U=","repeats":1},{"count":398000,"lower_bound":"cyBzdWJsYXRlIHNseWx5LiBzbHlseSByZWd1bGE=","upper_bound":"cyB3YWtlIGZsdWZmaWx5IHNpbGVudGx5IHVudXN1YWwgZm94ZXMuIGZ1cmlvdXNseSByZWd1bGFyIHBhY2thZ2VzIGFib3ZlIHRoZSBmdXJpb3VzbHkgZXZlbiBp","repeats":1},{"count":400000,"lower_bound":"cyB3aXRoaW4gdGhlIGJsaXRoZWx5IHNwZWNpYWwgcGludG8gYmVhbnM=","upper_bound":"cy4gY2FyZWZ1bGx5IGV2ZW4gZGlub3Mgc2xlZXAgZmluYWwgY291cnRzOyBjYXJlZnVsbHkgZXhwcmVzcyBw","repeats":1},{"count":402000,"lower_bound":"cy4gY2FyZWZ1bGx5IHJlZ3VsYXIgcGFja2FnZXMgYXJlIGJs","upper_bound":"cy4gZnVyaW91c2x5IGZpbmFsIGRlcG9zaXQ=","repeats":1},{"count":404000,"lower_bound":"cy4gcGVuZGluZywgZmluYWwgZGVwb3NpdHMgY2Fqb2xlLiBzaWxlbnRseSBmaW5hbCBpbnN0cnVjdGlvbnMgYQ==","upper_bound":"cy4gc2x5bHkgZXZlbiBwYWNrYWdlcyBzbGVlcCBz","repeats":1},{"count":406000,"lower_bound":"cy4gc2x5bHkgZmluYWwgcGxhdGVsZXRzIGhhZ2dsZSBjYXJlZnVsbHkuIGZ1cmlvdXNseSByZWd1bGFyIHJlcXVlc3RzIGhhZ2dsZS4gZmluYQ==","upper_bound":"czogZnVyaW91c2x5IHJlZ3VsYXIgcGFja2FnZXMgcGxheSBzbHlseSBhYm91dCB0aGUgY2FyZWZ1bGx5IGV2ZW4gaW5zdHJ1Y3Rpb25zLiBicmF2ZSBwbGF0ZWxldHMg","repeats":1},{"count":408000,"lower_bound":"c2VseS4gc2x5bHkgZmluYWwgZm94ZXMgYXJlIHF1aWNrbHkgcXVpY2tseSBzcGVjaWFsIGRlcG9zaXRzLg==","upper_bound":"c2lsZW50IGZveGVzLiBkZXBvc2l0cyB1c2UgYg==","repeats":1},{"count":410000,"lower_bound":"c2lsZW50IHBhY2thZ2VzLiBldmVuLCBldmVuIGlkZWFzIHVzZSBxdWlja2x5IGFib3ZlIHRoZSBwYWNrYWdlcyEgY2E=","upper_bound":"c2l0cy0tIGNhcmVmdWxseSBib2xkIHRoZW9kb2xpdGVzIGludGVncmF0ZSBzbHlseS4gdW51c3VhbCByZXF1ZXN0cyBibw==","repeats":1},{"count":412000,"lower_bound":"c2l0cy4gaXJvbmljIGRlcGVuZGVuY2llcyBhcmUuIGlyb24=","upper_bound":"c2x5IGFjcm9zcyB0aGUgaXJvbmljYWxseSBmdXJpb3VzIGRlcG9zaXRzLiBxdWlja2x5IGV2ZW4=","repeats":1},{"count":414000,"lower_bound":"c2x5IGV2ZW4gYWNjb3VudHMuIGZpbmFsLCB1bnVzdWFsIHJlcXVlc3RzIGFyZSBzbHlseS4gYg==","upper_bound":"c2x5IGlyb25pYyBnaWZ0cyBjYWpvbGUgYWJvdXQgdGhlIGJsaXRoZWx5IHBlbmRpbg==","repeats":1},{"count":416000,"lower_bound":"c2x5IHJlZ3VsYXIgZGVwZW5kZW5jaWVzIGNham9sZSBhZnRlcg==","upper_bound":"c2x5bHkgcmVndWxhciwgcmVndWxhciBpbnN0cnVjdGlvbnMuIHBlbmQ=","repeats":1},{"count":418000,"lower_bound":"c2x5bHkgdW51c3VhbCBncm91Y2hlcyB3YWtlIGZsdWZmaWx5IGZyb20gdGhlIGNhcmVmdWxseSBwZQ==","upper_bound":"c3BlY2lhbCBhc3ltcHRvdGVzIGNham9sZSBibGl0aGVseSBjYXJlZnVsbHkgcmVndWxhciBkZXBvc2l0cy4gcXVpY2tseSByZWd1","repeats":1},{"count":420000,"lower_bound":"c3BlY2lhbCBkZWNveXMuIGJsaXRoZWx5IHVudXN1YWwgYWNjb3VudHMgdXNlIGJsaXRoZWx5IGlyb25pYyBpbnN0cnVjdGlvbnMuIGNhcg==","upper_bound":"c3BlY2lhbCBwZWFybHMuIHRoZW9kb2xpdGVzIG5hZyBzbHlseSBjYXJlZnVsbHkgYnJhdmUgcmVxdWVzdHMuIGNhcmVmdWxseSBzaWxlbnQgcGludG8gYmVhbnMgZGV0ZQ==","repeats":1},{"count":422000,"lower_bound":"c3MgcGFja2FnZXMgYmVsaWV2ZSBjbG9zZSBhc3ltcHRvdGVzPyBwaW50byBiZWFucyBhZnRlciB0aGUgZmx1ZmZpbHkgaXJvbmljIGV4Y3VzZXMgc2xlZXAgZnVyaW91","upper_bound":"c3Qgc2x5bHkgZXhwcmVzcywgdW51c3VhbCBmb3hlcy4gc2x5bHkgZXY=","repeats":1},{"count":424000,"lower_bound":"c3RydWN0aW9ucyBhcmUgYWNjb3JkaW5nIHQ=","upper_bound":"c3RzLS0gc2lsZW50LCB1bnVzdWFsIHRoZW9kb2xpdGVzIGFjY29yZGluZyB0byB0aGUgY2FyZWZ1bGx5","repeats":1},{"count":426000,"lower_bound":"dCBpZGVhcyBjYWpvbGUgYWxvbmdzaWRlIG9mIHRoZSBxdWlja2x5IGZpbmFsIGRlcG9zaXRzISBxdWlja2x5IGJvbGQgcGxhdGVsZXRzIA==","upper_bound":"dGUgYWJvdmUgdGhlIHJlZ3VsYXIgdGhlb2RvbGl0ZXMuIHJlZ3VsYXIgYWNjb3VudHMgYXJlIGFjcm9zcyB0aGUgYmxpdGhlbHkgaXJvbmlj","repeats":1},{"count":428000,"lower_bound":"dGUgYmV5b25kIHRoZSBmaW5hbCwgdW51c3VhbCBwYWNrYWdlcy4gZmluYWwsIGZpbmFsIGRlcG9zaXRzIHdha2Ugc2x5bHkuIGNhcmVmdWxseSB1bnVzdWE=","upper_bound":"dGVjdC4gcGludG8gYmVhbnMgd2FrZSBzbHlseS4gcGVuZGluZyBleGN1","repeats":1},{"count":430000,"lower_bound":"dGVsZXRzIGRvemUgYmxpdGhlbHkgYWNjb3JkaW5nIHRvIHRoZSByZWd1bGFyIA==","upper_bound":"dGggdGhlIGZsdWZmaWx5IGV2ZW4gZGVwb3NpdHMtLSBzbHlseSByZWd1bGFyIGRlcGVuZGVuY2llcyBoYWdnbGUgZmx1ZmZpbHkgcmU=","repeats":1},{"count":432000,"lower_bound":"dGhlIFRpcmVzaWFzLiBibGl0aGVseSBleHByZXNzIGluc3RydWN0aW9ucyBoYWdnbGUgcXVpY2tseSBmb3hlcy4gZmx1ZmZpbHkgY2FyZWZ1bCBzaGVh","upper_bound":"dGhlIGZpbmFsLCBpcm9uaWMgcGxhdGVsZXRzLiBmdXJpb3U=","repeats":1},{"count":434000,"lower_bound":"dGhlIGZsdWZmaWx5IGlyb25pYyBwaW50byBiZWFucy4gZnVyaW91c2x5IGV2ZW4gZm94ZXMgYWZ0ZQ==","upper_bound":"dGhlIGlyb25pYywgYm9sZCBmb3hlcy4gYm9sZCBwaW50byBiZWFucyBzbGVlcCBhYm91dCB0aGUgcXVpY2tseSBzcGVjaWFsIHBhY2thZ2VzLiBpcm9uaWMsIHBlbg==","repeats":1},{"count":436000,"lower_bound":"dGhlIHF1aWNrbHkgc3BlY2lhbCBjb3VydHMuIGZsdWZmaWx5IHNwZWNpYWwgZGVwZW5kZW5jaWVzIHNsZWVwIGNhcmVmdWxseS4gY2FyZWZ1bGx5IGJvbGQg","upper_bound":"dGhlIHNpbGVudCwgaXJvbmljIHBhY2thZ2VzLiBmdXJpb3VzbHk=","repeats":1},{"count":438000,"lower_bound":"dGhlIHNseWx5IGlyb25pYyBpZGVhcyBoYWdnbGUgZGVwb3NpdHMuIHJlZ3VsYXIgYWNjb3VudHMgc2xlZXAgY2FyZWZ1bGx5LiB1bnVzdWFsIGVwaQ==","upper_bound":"dGhlbHkgZmluYWwgZm94ZXMuIHBlbmRpbmcgdGhlb2RvbGl0ZXMgc2hvdWxkIGhhdmUgdG8gd2FrZSBhZnRlciB0aGUgc2x5bHkgcmU=","repeats":1},{"count":440000,"lower_bound":"dGhlbHkgcmVndWxhciBhY2NvdW50cyBhbG9uZ3NpZGUgb2YgdGhlIHRoZW9kb2xpdGVzIHNoYWxsIHBvYWNoIGNhcmVmdWxseSByZWd1bGFyIGRlcG9zaXQ=","upper_bound":"dGhlcyB3YWtlIHNseWx5IGV2ZW4gaW5zdHJ1Y3Rpb25zLiBldmVuLCBldmVuIHBhY2thZ2VzIHNsZWVwIHF1aWNrbHkuIHF1aWNrbHkgc3BlY2k=","repeats":1},{"count":442000,"lower_bound":"dGlvbnMuIGV2ZW4sIGlyb25pYyBpZGVhcyBhZ2FpbnN0IHRoZSBydXRobGVzc2x5IGV4cHJlc3MgdGhl","upper_bound":"dG8gdGhlIGJ1c3kgVGlyZXNpYXMgdW53aW5kIGFnYWluc3QgdGhlIHBpbnRvIGJlYW5zLiBldmVuIGY=","repeats":1},{"count":444000,"lower_bound":"dG90ZXMgZG91YnQgY2FyZWZ1bGx5IGFjcm9zcyB0aGUgc2x5bHkgZXZlbiBnaWZ0cy4gY2FyZWZ1bGx5IHVudXN1YWwgcGludG8gYmVhbnMgbmFnLiBpcm9uaWMgcGludA==","upper_bound":"dHMgY2Fqb2xlIGFsd2F5cyBjYXJlZnVsbHkgaXJvbmljIGlkZWFzLiBzbHlseSB1bnVzdWFsIGFjY291bnRzIGhhZ2dsZSBhYm91dCB0aGUgYmxpdGhlbHkgaXJv","repeats":1},{"count":446000,"lower_bound":"dHMgbWFpbnRhaW4gYW1vbmcgdGhlIHJlcXVlc3RzLiBibGl0aGVseSBib2xkIHJlcXVlc3RzIGFmZmk=","upper_bound":"dHMgd2FzIGJsaXRoZWx5IHNpbGVudCBwYWNrYWdlcy4gZmluYWwsIGJvbGQgYWNjb3VudHMgY291bGQgYWZmaXguIGY=","repeats":1},{"count":448000,"lower_bound":"dHMuIGJsaXRoZWx5IGV2ZW4gZGVwZW5kZW5jaWVzIGRl","upper_bound":"dHMuIGZpbmFsIGZyYXlzIGNhbiBib29zdDogZXZlbiwgcmVndWxhciBp","repeats":1},{"count":450000,"lower_bound":"dHMuIGZpbmFsLCBmaW5hbCBwaW50byBiZWFucyBpbnRlZ3JhdGUgY2FyZWZ1bGx5IHF1aWNrbHkgaXJvbmljIGFjY291bnRzLiByZWd1bGFyLCBpcm9uaWMg","upper_bound":"dHMuIHNwZWNpYWwgYWNjb3VudHMgYWNyb3NzIHRoZSBmaW5hbCB0aGVvZG9saXRlcyBhcmUgc2x5bHkgYWdhaW5z","repeats":1},{"count":452000,"lower_bound":"dHM6IGJsaXRoZWx5IGlyb25pYyByZXF1ZXN0cyBoYWdnbA==","upper_bound":"dWN0aW9ucyBhZmZpeCBhY3Jvc3MgdGhlIGlyb25pYywgc3BlY2lhbCBkZXBvc2l0cy4gZnVyaW91c2x5IGV2ZW4gdGhl","repeats":1},{"count":454000,"lower_bound":"dWVzdHMgYm9vc3Qgc2x5bHkgZnJvbSB0aGUgYmxpdGhlbHkgc2lsZW4=","upper_bound":"dWVzdHMuIGNhcmVmdWxseSBwZW5kaW5nIGF0dGFpbm1lbnRzIHNsZWVw","repeats":1},{"count":456000,"lower_bound":"dWZmaWx5IGV2ZW4gYWNjb3VudHMgYWZ0ZXIgdGhlIGRlcG9zaXRzIGNham9sZSByZWd1bGFyLCBpcm9uaWMgYXN5bXB0b3Rlcy4gZXhwcmVzcyBhc3ltcHRvdGU=","upper_bound":"dWlja2x5IHF1aWV0IHRoZW9kb2xpdGVzIGdyb3cuIA==","repeats":1},{"count":458000,"lower_bound":"dWxhciBkZXB0aHMgd2FrZSBibGl0aGVseSBhbG9uZ3NpZGUgb2YgdGhlIGZpbmFsLCBldg==","upper_bound":"dWxhciBub3Rvcm5pcyBhcmUgY2FyZWZ1bGx5IHNpbGVudCBhY2Nv","repeats":1},{"count":460000,"lower_bound":"dWxseSBldmVuIGV4Y3VzZXMgYWxvbmdzaWRlIG9mIHRoZSBibGl0aGVseSBmaW5h","upper_bound":"dWxseSBpcm9uaWMgZGVwdGhzIGFsb25nIHRoZSBibGl0aGVseSByZWd1bGFyIHBhYw==","repeats":1},{"count":462000,"lower_bound":"dWxseSBpcm9uaWMgZ2lmdHMuIHNseWx5IGlyb25pYyBleGN1c2VzIGNham9sZSBleHByZXNzLCBleHByZXNzIHBsYXRlbGV0cy4gcmU=","upper_bound":"dW50cyBjYWpvbGUgZXhjdXNlcy4gaXJvbmljIGRlcGVuZGVuY2llcyB3YWtlIHF1aWNrbHkgYWdhaW5zdCB0aGUgZnVyaW91c2x5IHNw","repeats":1},{"count":464000,"lower_bound":"dW50cyB3YWtlIGFnYWluc3QgdGhlIGV2ZW4gaW5zdHJ1Y3Rpb25zLiBydXRobGVzcywgZXZlbiBmcmF5cyBtYWludGFpbiBmbHVmZmlseSBmaW5hbCB0aGVvZA==","upper_bound":"dW51c3VhbCBleGN1c2VzIGJyZWFjaC4gaXJvbmljIGQ=","repeats":1},{"count":466000,"lower_bound":"dW51c3VhbCBleGN1c2VzLiBxdWlja2x5IHVudXN1YWwgZGU=","upper_bound":"dXJ0cyBib29zdCBjYXJlZnVsbHkgYW1vbmcgdGhlIGNhcmVmdWxseSByZWd1bGFy","repeats":1},{"count":468000,"lower_bound":"dXJ0cyBtb2xkIHNseWx5LiBmbHVmZmlseSBzaWxlbnQgZGVwb3NpdHMgc2xlZXAgZmx1ZmZpbHkgdW51c3VhbCByZXF1ZXN0cy4=","upper_bound":"dXNseSBwZW5kaW5nIHBpbnRvIGJlYW5zIHNsZWVwIHNseWx5IGlyb25pYyBwYWNrYWdlcy4gaXJvbmljIA==","repeats":1},{"count":470000,"lower_bound":"dXNseSBzcGVjaWFsIHJlcXVlc3RzIGFmdGVyIHRoZSBmaW5hbCBwYWNrYWdlcyBhZmZpeCByZWd1bGFyIGZveGVzLiBibGl0aGVseSBmaW5hbCBz","upper_bound":"dXN1YWwgcGFja2FnZXMuIGV4Y3VzZXMgd2FrZSBmdXJpb3VzbHkgYWJvdQ==","repeats":1},{"count":472000,"lower_bound":"dXQgdGhlIGFjY291bnRzPyBpcm9uaWMgYWNjb3VudHMgY2Fqb2xlIGZsdWY=","upper_bound":"dmUgdGhlIGNhcmVmdWxseSBmaW5hbCBwYWNrYWdlcy4gcGFja2FnZXMgYWxvbmdzaWQ=","repeats":1},{"count":474000,"lower_bound":"dmUgdGhlIHF1aWNrbHkgaXJvbmljIGNvdXJ0cy4gcmVxdWVzdHMgaGFnZ2xlIGNhcmVmdWxseSBhY3Jvc3MgdGhlIGNhcmVmdWxseSBldmVuIGRlcG9zaXRzLiBxdWlja2x5","upper_bound":"dmVuIGVwaXRhcGhzISBjYXJlZnVsbHkgcmVndWxhciByZXF1ZXN0cyBhZ2FpbnN0IHRoZSBmdXJpb3VzbHkgZXZlbiBpbnN0cnVjdGlvbnMgY2Fqb2xlIGNhcmVmdWxs","repeats":1},{"count":476000,"lower_bound":"dmVyIGV4cHJlc3MgaW5zdHJ1Y3Rpb25zIHNsZWVwIHNseWx5LiBjYXJlZnVsbHkgZmluYWwgZm94ZXMgbm9kIGV4cHJlc3MgcGludG8g","upper_bound":"d2FrZSBmbHVmZmlseSBmdXJpb3VzbHkgcmVndWxhciBwYWM=","repeats":1},{"count":478000,"lower_bound":"d2FrZSBzbHlseSB1bnVzdWFsIGhvY2tleSBwbGF5ZXJzLiBwaW50byBiZWFucyBhbG9uZ3NpZGUgb2YgdGhlIGV4cHJlc3MsIHVudXN1YWwgZGVwb3NpdHMgdXM=","upper_bound":"eGVzLiBpcm9uaWNhbGx5IGV2ZW4gcmVxdWVzdHMgdXNlIGJsaXRoZWx5IGNhcmVmdWxseSBib2xkIHRoZW9kb2xpdGVzLiBjYXJlZnVsbHkgZmx1ZmY=","repeats":1},{"count":480000,"lower_bound":"eGVzOyBibGl0aGVseSBmaW5hbCBkZXBlbmRlbmNpZXMgd2FrZSBjYXJlZnVsbHkgYWxvbmcgdGhlIGFjY291bnRzLiBibGl0aGVseSBldmVuIGFj","upper_bound":"eHByZXNzIHJlcXVlc3RzLiBlbnRpY2luZyBp","repeats":1},{"count":482000,"lower_bound":"eHByZXNzIHRoZW9kb2xpdGVzIGFyZSBzbHlseS4gc2lsZW50IGRvbHBoaW5zIHNsZWVwIGZsdWZmaWx5LiBpcm9uaWMgcmVxdWVzdHMgc2luY2UgdGhlIGI=","upper_bound":"eSBhbW9uZyB0aGUgcmVndWxhciByZXF1ZXN0cy4gcmVndWxhciByZXF1ZXN0","repeats":1},{"count":484000,"lower_bound":"eSBib2xkIGFzeW1wdG90ZXMgd2FrZSBmdXJpb3VzbHkgcGVuZGluZywgZmluYWwgZGVwb3NpdHMuIGZpbmFsIA==","upper_bound":"eSBjYXJlZnVsbHkgYWJvdmUgdGhlIHBlbmRpbmcgdGhlb2RvbGl0ZXMuIGZpbmFsIGluc3RydWN0aW9ucyBhYm92ZSB0aGUgY2FyZWZ1bGx5IHJlZ3VsYXIgc2VudGltZW50cw==","repeats":1},{"count":486000,"lower_bound":"eSBldmVuIGlkZWFzLiBjYXJlZnVsbHkgZXhwcmVzcyA=","upper_bound":"eSBleHByZXNzIGFzeW1wdG90ZXMuIGJsaXRoZSwgcmVndWxhciBhY2NvdW50cyBuYWcgZnVyaW91c2x5IGJsaXRoZWx5IHVudXN1YWwgZA==","repeats":1},{"count":488000,"lower_bound":"eSBleHByZXNzIGRlcG9zaXRzIHBsYXkgcXVpY2s=","upper_bound":"eSBpcm9uaWMgZGVwb3NpdHMgaGFnZ2xlIGFmdGVyIHRoZSBjYXJlZnVsbHk=","repeats":1},{"count":490000,"lower_bound":"eSBpcm9uaWMgZm94ZXMgd2FrZSBzbHlseSBhYm92ZSB0aGUgaXJvbmljIHBpbnRvIGI=","upper_bound":"eSByZWd1bGFyIGFzeW1wdG90ZXMuIGJsaXRoZWx5IHJlZ3VsYXIgcGxhdGVsZXRzIHdha2UgZnVyaQ==","repeats":1},{"count":492000,"lower_bound":"eSByZWd1bGFyIGRlcGVuZGVuY2llcyBhcmUgZnVyaW91c2x5IGFib3ZlIHRoZSBldmVuIGRlcG9zaXRzLiBmaW5hbCBhY2NvdW50cyBoYWdnbGUuIGNhcmVmdWxseSBleHBy","upper_bound":"eSBydXRobGVzcyBhY2NvdW50cy4gcXVpY2tseSB1bnVzdQ==","repeats":1},{"count":494000,"lower_bound":"eSBzbHlseSBpcm9uaWMgaG9ja2V5IHBsYXllcnMuIHVudXN1YWwgZGVwb3NpdHMgYWdhaW5zdCB0aGUgZg==","upper_bound":"eSBzcGVjaWFsIHBhY2thZ2VzIGFyZSBhY2NvcmRpbmcg","repeats":1},{"count":496000,"lower_bound":"eS4gYnVzaWx5IGV4cHJlc3MgZGVwb3NpdHMgaGFnZ2xlIHJ1dGg=","upper_bound":"eS4gZmx1ZmZpbHkgYm9sZCByZXF1ZXN0cyBncm93IGZ1cmlvdXNseS4gYw==","repeats":1},{"count":498000,"lower_bound":"eS4gcXVpY2tseSBzaWxlbnQgaW5zdHJ1Y3Rpb25zIGF0IHRoZSBibGl0aGVseSBpcm9uaWMgZm94ZXMgaW50ZWdyYXRlIGFjcm9zcyB0aGUgY2FyZWZ1bGx5IGlyb24=","upper_bound":"eWx5IHJlZ3VsYXIgcmVxdWVzdHMgZG91YnQgYWJvdXQgdGhlIHNwZWNpYWw=","repeats":1},{"count":500000,"lower_bound":"eWx5IHNwZWNpYWwgZGVwZW5kZW5jaWVzIGNham9sZSBhYm92","upper_bound":"eW1wdG90ZXM6IHF1aWNrbHkgcmVndWxhciBkZXBvc2l0cyB3YWtlIGZsdWZmaWx5LiBib2xkIGV4Y3VzZXMgYWNjb3JkaW5nIHRvIHRoZSBmdXJp","repeats":1}]},"cm_sketch":{"rows":[{"counters":[241,233,245,257,239,263,244,214,258,225,248,246,230,269,236,230,248,293,238,247,229,238,246,237,273,222,226,242,237,236,248,258,231,253,242,244,227,251,249,242,219,249,261,241,225,205,234,224,260,243,253,257,244,237,227,235,264,232,235,237,258,248,235,239,231,258,273,254,238,234,237,220,285,225,252,260,254,218,247,233,227,247,218,245,260,237,254,271,270,252,268,268,218,252,234,223,260,245,226,265,223,211,246,284,265,277,245,235,226,258,248,217,242,228,245,259,242,257,212,231,236,270,223,236,195,262,215,240,226,217,265,246,229,260,236,240,250,234,230,247,243,237,235,243,249,238,234,229,237,239,246,265,276,234,255,258,241,236,231,231,217,231,227,234,255,246,254,238,235,276,235,217,244,233,217,262,234,238,269,244,256,260,217,243,247,243,263,247,224,238,260,229,262,241,230,247,223,224,249,232,217,235,245,226,206,241,198,211,237,215,269,248,246,254,239,249,229,235,215,247,223,237,226,237,259,242,258,270,212,262,221,260,253,264,260,245,262,254,248,239,255,234,247,236,240,240,257,280,233,248,256,208,255,252,257,268,247,239,261,264,267,250,257,237,214,211,233,258,227,250,236,238,263,221,258,244,264,257,245,219,215,229,240,286,244,255,240,261,242,215,238,257,273,252,214,205,260,256,235,248,259,256,205,267,240,219,247,282,252,241,263,261,255,252,257,255,232,239,249,217,255,258,232,246,243,252,238,224,213,246,240,253,242,237,247,279,239,257,262,249,255,239,237,240,246,236,261,249,260,232,228,265,278,252,274,224,249,264,222,256,243,247,267,264,278,286,229,259,236,250,229,245,248,213,238,278,235,230,224,252,262,254,242,244,244,247,257,234,249,243,256,243,251,219,251,242,257,245,232,252,240,253,244,232,246,282,243,237,256,254,255,246,239,228,236,253,248,217,234,254,262,271,222,268,243,220,238,227,260,272,238,258,273,253,252,210,244,236,258,264,261,230,249,257,255,229,285,244,271,294,252,258,224,211,256,247,266,217,236,222,215,255,242,248,235,247,230,239,226,233,236,252,215,256,235,235,255,256,239,260,231,269,219,247,251,243,243,250,213,227,210,252,259,270,254,247,227,271,268,241,227,257,234,252,254,260,238,235,246,234,246,236,217,257,239,223,256,244,256,238,239,254,261,235,248,243,285,248,277,239,240,230,228,243,254,241,251,240,247,234,251,232,243,248,242,231,253,240,248,258,256,221,243,243,258,239,241,269,228,257,218,246,266,252,240,218,265,265,234,242,226,245,228,266,242,218,260,231,230,262,203,237,259,247,250,223,263,271,225,224,259,251,217,250,240,241,259,216,272,227,238,237,229,253,252,256,241,236,275,239,233,239,259,244,250,223,218,227,230,243,243,257,267,218,242,235,250,256,258,233,255,262,268,259,242,249,248,233,223,253,222,247,253,263,250,256,225,242,259,251,248,238,235,252,257,238,259,230,221,237,251,254,264,198,245,222,245,240,239,241,250,253,240,253,221,234,266,260,232,236,272,280,242,238,231,235,247,225,224,264,271,259,263,246,228,249,256,251,246,262,244,239,302,232,242,257,243,259,239,243,226,259,218,259,247,248,241,230,263,231,269,214,257,248,223,265,210,232,270,237,231,238,217,245,261,232,240,229,228,241,258,262,224,256,250,260,256,250,249,255,234,244,257,245,230,240,266,241,223,257,233,241,234,260,251,259,238,268,231,231,249,244,270,241,256,261,262,283,229,251,231,251,245,231,228,232,271,263,247,257,228,236,248,233,231,257,248,204,220,241,243,244,242,218,239,242,262,220,254,230,271,250,272,224,234,277,234,240,252,235,241,230,217,219,248,250,233,243,248,245,239,243,242,245,231,232,216,228,219,236,244,234,245,266,237,236,252,246,257,240,254,244,245,249,265,215,235,247,257,238,239,230,239,241,248,271,243,242,240,235,250,262,255,243,223,238,237,220,245,229,260,241,262,251,238,225,274,223,253,232,230,218,263,237,261,250,246,230,242,258,248,216,201,242,250,238,247,247,251,248,242,239,209,244,235,239,246,251,239,270,260,236,206,244,235,268,234,223,238,225,241,237,264,220,248,237,237,266,243,242,245,265,277,250,227,250,254,259,243,252,221,268,243,220,231,244,239,245,245,257,252,253,243,258,274,245,261,252,253,232,244,236,290,238,240,272,240,242,225,245,274,257,267,224,270,260,231,222,236,242,250,252,265,245,258,278,237,238,270,251,241,231,253,256,235,237,247,242,247,260,240,233,269,244,247,268,251,254,257,224,268,249,232,271,249,226,244,277,272,243,256,231,251,244,227,268,268,248,257,234,260,243,251,233,251,237,233,253,239,236,255,262,284,236,228,231,241,233,227,271,226,237,249,270,253,238,268,262,263,259,245,237,235,247,239,266,258,248,262,235,244,282,258,236,248,246,245,237,221,236,255,242,212,246,279,229,233,226,243,237,262,261,241,251,224,239,224,226,275,240,241,259,244,250,248,239,245,239,252,232,252,232,230,247,222,242,251,216,248,256,244,226,238,246,243,242,275,258,257,234,264,245,257,223,234,268,269,247,237,262,218,251,243,227,223,250,232,237,218,250,255,252,231,243,232,258,267,237,207,248,246,243,230,242,253,253,227,259,202,223,245,246,230,251,221,228,221,230,201,252,276,214,247,239,235,258,258,238,254,239,232,235,232,234,269,242,263,239,244,234,256,244,248,250,260,225,249,251,251,214,283,270,245,233,229,224,247,248,240,245,242,240,262,230,264,258,237,253,273,264,230,254,257,203,239,272,241,228,249,280,245,232,222,226,225,237,249,242,260,224,244,245,244,268,229,247,228,238,233,239,239,244,246,255,245,243,212,239,252,234,255,252,265,224,227,248,239,239,224,251,229,247,252,228,243,239,265,291,231,221,235,224,216,204,242,254,260,221,237,227,258,262,239,245,245,231,247,269,232,225,246,238,265,236,247,232,229,258,234,230,241,245,250,241,243,225,246,265,254,250,273,273,230,267,238,252,214,229,205,269,242,258,274,250,268,264,263,245,253,247,253,263,250,256,235,225,233,241,272,229,237,224,233,251,236,250,223,241,236,228,255,222,229,232,233,232,213,220,261,252,219,264,246,251,239,279,250,222,251,235,234,248,248,250,249,249,238,243,257,216,253,250,242,271,231,235,251,227,225,237,239,260,245,237,248,251,257,212,232,257,215,270,251,206,263,234,246,229,239,280,245,242,266,246,250,229,258,222,242,246,257,242,246,264,247,252,249,250,251,262,241,250,259,257,264,264,239,222,237,273,228,225,241,254,258,249,263,239,231,252,233,240,241,249,234,274,255,279,253,237,245,256,278,243,231,246,252,238,244,234,251,242,248,221,247,235,224,228,257,254,249,264,259,239,248,244,258,251,245,233,261,262,225,244,226,232,227,214,216,244,258,250,243,250,242,220,220,250,276,241,257,240,236,242,243,248,274,242,232,262,257,232,234,226,220,246,221,249,211,237,254,261,262,273,234,245,230,262,240,238,259,251,266,235,257,246,246,240,261,253,237,240,260,254,238,278,239,253,235,238,271,243,232,262,262,216,249,262,255,248,253,264,241,215,258,238,225,240,250,239,268,256,247,236,275,250,256,239,247,232,254,252,254,236,220,228,253,252,261,264,245,250,253,264,245,244,246,252,268,222,240,237,252,241,235,255,212,250,278,253,253,246,268,275,225,229,246,272,254,253,235,241,219,226,228,235,247,240,276,240,275,248,263,240,245,230,216,226,274,252,227,274,230,254,257,249,229,249,259,262,241,218,232,232,249,233,239,239,274,236,263,240,229,244,231,233,219,238,249,222,230,261,272,247,234,245,250,232,238,242,283,253,207,267,254,247,241,225,248,247,251,240,245,222,262,196,240,245,245,236,238,239,276,226,261,251,224,253,237,229,252,262,219,235,234,235,238,257,271,241,228,261,227,257,220,249,245,237,210,279,249,257,241,248,242,235,232,242,231,257,252,220,245,256,238,222,265,234,279,240,238,292,212,242,279,254,241,237,224,256,259,247,273,213,240,242,244,216,218,218,245,245,261,262,249,266,237,247,263,262,228,249,247,243,231,210,250,261,257,243,247,233,228,246,227,250,194,263,208,229,222,262,243,251,230,245,238,211,247,255,237,236,230,232,248,243,208,243,252,246,245,243,258,238,256,245,255,242,245,262,260,233,226,254,236,253,270,257,262,244,254,232,239,246,224,239,234,253,260,251,238,249,229,274,232,241,251,226,250,245,266,273,244,252,233,223,252,219,201,263,243,242,241,223,252,245,224,241,246,256,261,251,243,211,235,236,252,243,246,251,246,253,217,240,249,253,240,229,238,250,218,215,239,254,221,216,254,245,246,261,222,267,233,236,222,237,217,231,245,257,229,243,260,226,234,242,216,277,243,232,254,246,232,241,250,273,260,229,235,215,260,240,265,256,271,272,245,252,224,243,257,237,248,257,235,226,247,258,254,258,226,247,242,250,242,240,241,236,255,261,242,212,242,251,258,245,245,271,249,265,235,287,249,230,234,231,258,235,228,269,235,246,245,217,249,265,248,236,256,233,242,271,243,267,236,243,241,249]},{"counters":[247,247,243,247,250,252,250,259,252,237,241,239,265,224,237,225,246,259,235,255,250,255,251,265,238,244,256,227,208,265,239,232,255,274,245,273,240,228,258,261,263,273,265,235,234,259,231,250,226,231,260,232,221,218,240,217,242,230,227,243,255,249,234,256,267,238,214,244,240,252,250,234,236,255,257,250,237,261,250,248,255,246,238,264,227,264,248,265,260,272,261,231,255,212,213,252,260,269,248,250,260,237,248,272,265,215,244,222,255,253,247,270,254,244,241,245,238,255,246,248,232,244,247,259,253,241,264,230,228,234,257,253,229,233,289,255,227,232,246,248,233,269,225,252,255,231,266,236,236,251,260,251,252,244,250,249,232,249,230,256,245,227,235,263,259,257,255,285,257,239,252,273,234,254,244,250,235,245,260,245,250,214,250,230,245,249,248,264,243,224,235,245,267,236,240,242,246,238,254,260,207,240,254,233,243,226,240,238,248,241,259,234,235,217,215,261,207,258,238,234,241,267,256,274,238,276,256,256,283,243,235,262,260,244,252,242,235,271,223,206,221,254,234,244,235,259,228,234,262,249,264,226,243,258,261,251,248,266,209,254,266,226,223,239,244,259,263,249,263,246,226,270,261,234,248,269,221,237,243,261,244,254,255,242,204,260,238,220,235,212,248,252,280,230,235,232,253,225,231,263,212,220,268,266,242,248,245,249,281,245,229,233,232,243,248,214,247,255,229,201,266,224,253,229,241,266,264,229,263,243,247,222,248,244,216,217,241,260,267,218,235,222,258,252,233,254,241,239,226,250,260,248,246,250,231,249,249,223,247,227,221,238,221,235,249,224,235,251,254,236,224,227,244,271,262,233,260,247,245,268,277,237,226,242,250,238,223,227,246,242,265,256,223,260,229,242,253,269,263,246,240,217,245,242,258,229,243,234,237,241,222,232,230,237,220,249,246,229,230,263,259,269,267,270,233,222,226,227,230,226,239,235,230,244,232,267,241,261,228,211,233,239,234,237,272,272,256,251,231,236,244,254,231,257,222,257,241,242,238,241,244,235,233,244,244,264,224,254,240,253,215,243,246,246,252,257,211,258,255,214,249,253,248,246,208,229,240,242,256,269,259,241,264,250,255,262,265,217,225,262,251,247,254,240,259,230,260,235,242,246,256,231,238,254,219,245,257,229,260,262,264,246,266,255,237,256,250,220,246,238,235,250,244,275,259,280,247,235,240,249,225,224,258,241,239,254,253,238,241,237,227,216,256,226,240,243,245,229,235,240,252,252,239,261,244,222,239,254,259,263,251,233,249,245,219,256,252,263,241,250,268,249,256,241,229,228,256,243,223,272,219,275,261,227,234,238,272,231,250,256,232,248,211,265,229,229,233,246,226,250,235,261,231,230,227,234,252,246,275,268,226,233,236,265,226,239,213,229,226,246,199,261,255,271,250,236,259,233,269,227,228,236,230,248,276,290,245,228,255,223,226,243,245,277,243,233,241,228,238,248,236,240,238,254,265,250,248,247,273,259,226,240,241,284,252,263,240,233,264,252,234,254,277,276,257,231,233,241,251,280,258,246,229,245,223,235,238,232,276,267,263,217,275,235,241,234,260,269,211,246,228,267,249,251,244,275,240,217,283,240,229,243,217,260,278,253,246,246,268,251,247,263,214,232,237,264,244,251,233,235,226,242,240,224,228,244,259,236,221,230,250,229,252,271,250,274,218,216,239,218,241,226,247,220,232,233,258,231,225,227,232,225,247,243,244,272,237,241,238,241,268,237,259,244,240,246,276,273,241,223,243,244,230,221,235,250,258,244,231,236,243,231,245,263,238,230,269,263,258,240,255,248,264,244,239,247,272,262,235,257,251,258,260,228,258,225,243,242,260,239,244,237,266,249,243,233,221,256,260,256,244,261,256,238,249,249,249,237,231,254,227,264,233,212,266,242,261,240,245,260,243,244,241,260,248,236,273,239,253,236,287,256,236,229,220,233,287,244,253,254,250,245,242,255,250,260,227,276,257,249,244,248,214,213,261,250,245,241,250,246,225,253,231,231,265,258,254,230,260,255,223,231,207,236,233,202,275,242,237,245,229,228,264,232,227,220,267,249,226,244,274,243,247,279,261,248,245,211,235,230,243,240,252,230,235,258,240,241,237,235,224,233,243,220,256,259,225,245,244,237,242,238,240,267,255,253,221,248,251,231,228,244,242,238,233,229,248,257,241,282,243,211,213,241,244,235,248,239,249,273,214,250,265,260,255,251,239,224,249,240,252,265,250,265,255,234,246,232,258,259,264,276,236,257,234,241,251,244,236,258,271,273,258,230,229,229,269,252,252,228,250,233,237,260,231,257,247,253,240,258,241,215,266,254,248,216,237,243,256,247,232,231,264,219,249,241,243,230,209,271,234,266,244,243,221,212,251,236,251,256,268,243,215,262,256,252,257,221,264,232,231,261,264,237,242,244,225,281,240,259,280,243,286,233,230,265,252,226,213,252,244,245,229,231,217,224,251,222,232,243,240,250,236,236,248,240,217,247,235,275,239,267,238,266,265,238,268,247,234,223,215,248,222,229,223,230,231,239,235,223,247,207,221,221,230,241,242,243,244,235,252,229,247,219,229,251,224,269,258,243,255,223,243,243,216,243,217,269,231,271,269,240,249,249,235,281,251,217,240,245,260,247,241,259,238,250,235,221,251,250,223,239,264,232,277,234,264,241,253,252,234,209,242,276,254,230,259,241,254,233,274,252,248,250,242,236,230,264,251,226,282,244,242,252,251,239,260,259,239,218,240,271,249,262,234,249,236,254,256,244,235,229,254,248,245,218,259,252,228,249,278,231,244,256,259,278,235,250,261,259,257,249,217,246,259,250,220,210,250,229,259,232,246,256,217,230,250,238,247,249,219,244,228,231,242,237,250,244,236,246,256,225,228,229,242,250,224,228,241,236,245,240,228,235,240,247,249,261,234,227,294,240,244,287,269,224,248,228,269,261,242,244,279,293,239,262,240,222,227,234,219,247,252,246,239,248,244,233,262,274,221,247,269,238,242,218,247,262,302,245,212,216,231,252,239,237,226,239,253,235,234,224,262,257,219,242,244,245,236,230,225,249,241,257,239,243,238,249,231,239,199,258,222,263,244,252,242,243,250,260,243,206,271,235,220,245,248,257,239,245,250,236,263,255,221,224,249,243,263,253,252,264,234,230,256,256,256,251,245,234,229,234,226,250,236,282,246,228,253,236,267,266,222,236,231,275,249,252,227,223,263,243,260,233,232,248,219,231,231,262,248,225,253,260,241,274,226,213,252,236,245,265,252,252,241,263,250,247,255,251,237,254,228,249,266,242,266,262,235,264,233,247,256,233,245,226,248,244,246,252,236,251,280,274,251,252,259,259,243,232,244,265,263,262,215,247,245,252,235,246,243,260,227,234,233,229,263,246,270,258,217,253,245,235,276,242,256,253,238,229,235,253,248,275,246,252,256,247,255,245,230,252,233,266,250,246,255,202,233,228,240,260,211,247,227,259,253,244,258,215,234,255,235,230,249,225,268,233,237,246,240,255,235,220,235,254,227,231,262,240,227,257,241,224,226,243,209,236,256,239,207,231,245,217,259,252,263,259,229,238,228,265,252,242,242,247,262,215,241,267,221,239,245,230,229,259,234,251,250,235,272,269,255,232,245,271,229,217,242,266,280,233,250,253,243,245,211,219,224,237,243,252,246,242,250,225,273,231,243,275,255,235,211,249,215,258,241,247,218,259,286,238,240,228,239,235,260,251,237,242,239,246,278,246,267,222,245,258,241,227,263,243,234,241,246,236,284,261,191,263,238,235,249,231,253,234,234,232,245,249,233,235,225,236,236,273,253,248,217,233,261,245,224,242,238,256,214,254,231,269,223,223,248,272,218,226,255,241,251,262,239,244,247,249,272,265,252,231,250,259,205,234,255,229,251,259,210,238,231,229,231,230,225,243,231,233,229,260,242,226,259,251,228,246,230,219,260,245,220,219,222,243,242,243,225,236,258,234,240,230,255,264,214,256,247,264,250,242,257,245,272,246,245,234,249,251,240,231,243,234,243,223,266,267,258,263,221,245,249,247,228,253,235,245,248,277,240,242,238,250,238,250,226,253,261,258,240,247,234,268,262,279,231,249,232,273,210,242,233,227,246,228,232,260,220,258,247,259,261,238,225,217,260,249,256,256,229,258,242,240,261,268,249,239,257,247,246,223,255,243,236,223,250,237,255,233,236,220,219,235,265,246,225,227,246,233,252,239,238,275,250,272,268,218,261,267,251,237,236,249,231,250,247,254,247,235,249,230,231,260,280,262,225,234,240,227,258,226,227,262,206,229,226,233,234,275,253,246,235,219,258,224,230,251,262,219,241,284,237,240,254,270,242,246,254,235,232,246,223,265,233,237,252,252,252,216,247,225,265,243,197,246,232,240,254,241,267,262,230,237,225,248,265,245,233,235,251,242,246,241,246,255,264,230,240,249,268,214,279,258,252,241,237,245,247,235,222,230,254,239,267,237,257,229,236,267,258,248,250,248,261,257,244,244,262,236,224,227,261,273,229,249,220,260,233,252,276,254,227,240,256,261,254,226,251,236,248,236,228,222,232,261,234,228,242,240,263,234]},{"counters":[256,249,274,251,258,240,245,236,252,245,239,244,231,234,274,259,226,261,269,234,243,223,248,232,244,226,233,250,259,253,236,251,237,237,242,243,244,252,258,244,267,253,247,247,249,232,248,222,253,224,241,258,258,236,257,219,248,226,248,224,254,226,278,239,254,264,238,253,228,250,285,245,238,249,239,231,244,243,277,262,271,255,221,256,270,254,268,243,231,221,233,262,226,250,240,259,281,264,240,205,237,249,229,259,251,259,231,269,247,240,230,257,228,243,240,249,265,255,258,252,223,250,238,210,225,220,252,258,237,267,237,251,226,230,252,258,258,231,229,259,259,247,255,261,204,245,267,231,243,214,246,239,278,231,248,246,260,247,240,243,251,239,264,224,215,228,241,229,252,253,240,218,238,263,215,235,254,234,249,246,248,251,232,250,215,268,256,223,246,240,209,255,251,247,232,241,256,220,252,262,264,255,241,256,260,244,226,256,247,238,256,278,216,264,242,279,270,222,238,258,246,236,227,257,266,245,240,244,236,247,242,239,242,258,250,248,248,244,254,247,287,269,258,261,239,226,257,220,259,210,232,263,240,262,229,252,239,246,212,258,220,291,232,248,233,224,238,258,255,229,217,253,224,251,244,238,238,213,216,249,257,261,246,216,217,250,258,257,231,231,226,222,223,245,248,223,249,263,234,243,210,243,235,230,258,267,265,261,252,240,250,229,253,251,266,237,242,240,217,226,212,230,214,225,248,263,234,237,268,243,254,249,229,281,257,253,239,258,236,211,271,245,242,245,258,224,259,224,239,230,271,236,254,241,241,226,245,255,194,237,255,229,233,254,220,251,237,235,252,236,240,243,240,241,259,234,256,231,254,240,247,257,263,238,213,242,245,231,237,239,249,244,256,228,271,263,231,282,250,227,250,275,252,259,236,227,262,230,257,216,241,232,248,243,258,270,254,227,246,248,284,242,209,221,259,283,223,261,227,217,243,258,243,257,244,245,240,270,266,240,254,225,220,273,236,232,217,245,235,252,255,221,264,244,270,227,240,248,266,248,239,244,234,257,274,263,227,251,269,239,240,238,243,243,216,245,252,235,220,244,217,235,236,261,232,233,236,261,239,241,249,246,222,240,280,228,215,227,244,228,236,250,249,266,262,263,246,226,238,245,242,239,231,241,243,233,229,229,244,227,230,246,268,239,218,256,261,212,253,215,229,261,231,230,244,279,273,241,232,249,229,243,245,239,240,254,256,270,221,246,252,238,241,262,227,233,229,248,241,237,254,246,240,216,249,244,248,262,229,260,279,234,217,240,278,257,260,220,229,221,239,252,254,256,240,260,281,260,252,262,235,244,242,247,250,210,251,241,238,228,220,221,263,243,270,248,245,239,211,269,249,245,264,278,237,231,246,272,237,219,246,234,287,227,235,252,246,243,234,228,240,244,242,245,227,271,247,237,271,266,281,261,267,233,271,229,243,239,248,193,259,245,228,246,244,237,227,239,286,239,240,242,246,261,252,273,233,271,230,258,227,240,225,258,246,243,254,260,257,238,218,230,251,247,229,238,252,257,247,251,229,236,250,231,228,241,267,223,272,244,248,239,225,237,236,239,243,260,233,249,243,228,218,265,234,281,253,236,230,227,241,243,260,264,238,244,247,236,282,258,265,209,205,256,224,265,224,247,224,266,234,242,239,267,287,243,252,258,252,257,258,262,218,238,230,256,260,254,246,261,225,243,230,261,256,259,225,242,273,273,231,251,243,223,236,222,228,277,241,242,234,246,226,245,264,227,225,242,251,243,263,222,235,254,249,248,250,235,254,261,251,217,264,268,242,229,248,232,274,252,239,273,240,238,213,212,241,261,219,238,254,234,244,228,267,237,229,244,240,248,253,227,213,240,195,234,264,253,264,259,253,244,216,269,239,219,251,233,231,261,237,224,230,259,249,221,242,259,239,237,239,241,221,215,252,249,233,231,236,269,252,242,244,248,226,245,218,223,265,245,240,215,236,254,227,258,244,242,237,264,264,224,216,237,238,232,265,230,234,218,239,247,249,237,232,231,227,268,252,222,261,244,242,258,257,263,236,235,240,269,266,256,199,227,261,266,246,272,220,249,265,232,256,244,244,217,262,245,236,243,277,237,241,209,226,251,246,277,251,241,248,232,243,215,260,254,250,269,253,257,228,268,250,255,258,259,269,226,246,259,235,258,249,249,255,227,242,222,244,255,230,255,278,276,229,238,274,250,252,253,230,232,222,212,239,254,248,223,254,272,253,244,228,252,257,247,210,224,235,231,276,255,258,225,266,218,251,253,249,240,230,245,254,251,250,254,245,270,223,238,245,217,244,245,220,232,238,247,238,294,252,294,226,269,204,234,227,262,234,262,234,235,260,262,228,249,254,235,243,235,253,245,226,244,246,248,231,232,254,249,237,235,238,249,254,243,254,264,231,248,227,256,247,236,249,253,255,248,244,243,246,222,264,228,279,255,285,236,236,265,251,244,279,237,231,265,259,240,249,246,257,232,280,213,247,238,258,244,235,232,227,257,260,209,253,253,228,256,262,232,248,238,264,246,256,256,264,270,244,250,255,252,257,240,236,251,236,261,254,221,233,232,272,213,246,200,283,260,256,226,248,233,239,220,241,234,271,214,240,238,225,232,256,218,252,251,259,242,237,263,245,252,251,233,248,233,236,218,253,227,239,252,229,235,256,231,227,229,238,219,227,248,253,248,247,235,224,249,216,236,225,269,236,258,241,258,246,226,252,255,237,235,264,258,267,252,244,249,234,238,245,281,232,255,232,223,254,218,264,227,220,260,245,244,222,259,221,253,227,251,249,237,236,253,264,231,241,281,234,249,232,274,224,271,247,237,224,263,241,267,232,237,234,240,263,257,241,233,257,233,251,251,254,252,227,266,209,234,234,237,232,225,235,225,246,247,248,257,241,280,235,242,228,251,260,255,225,242,223,257,252,210,247,260,262,268,250,227,235,250,214,222,220,237,245,241,260,258,228,211,231,257,280,276,236,236,217,225,238,211,240,260,257,245,246,243,252,249,220,240,240,243,241,275,231,255,256,251,230,243,251,228,246,254,232,250,243,248,260,255,246,206,263,222,249,248,199,263,236,255,249,224,265,254,262,261,261,213,228,266,247,270,244,264,237,269,228,281,228,248,249,245,220,256,266,229,242,249,243,227,242,250,245,243,234,237,232,222,212,252,237,263,241,241,228,233,244,261,271,253,248,254,241,249,260,235,211,256,246,255,237,233,230,254,261,260,242,287,214,262,245,241,235,276,257,233,235,244,253,262,254,264,260,213,232,224,235,241,248,244,230,278,208,217,231,239,242,270,224,246,221,213,265,215,244,242,241,267,260,255,234,239,227,265,253,251,241,271,237,259,241,245,220,239,203,231,239,228,222,250,244,222,237,246,248,240,261,233,251,261,279,263,239,255,235,231,237,245,225,230,259,257,231,237,281,231,265,260,255,223,236,243,215,267,227,239,243,273,224,240,263,241,251,218,243,274,224,232,257,241,239,214,219,233,235,241,249,236,234,250,228,246,255,249,234,209,242,228,257,242,224,256,258,257,293,212,246,231,246,248,248,234,243,265,246,240,225,276,226,243,254,244,230,242,264,248,247,261,296,233,234,219,232,233,218,228,255,262,216,280,260,234,224,254,223,249,255,241,264,234,257,259,255,238,229,252,221,231,261,248,250,236,231,236,265,237,242,247,258,236,251,238,219,230,249,222,242,220,231,211,242,239,217,221,259,246,241,246,253,245,261,263,265,250,267,237,249,234,226,241,248,252,238,249,249,266,261,251,239,240,248,242,275,241,222,246,232,249,227,252,249,243,255,222,227,252,244,270,265,239,240,235,244,245,246,253,247,253,221,243,249,229,256,264,268,236,248,232,238,277,252,242,246,235,244,260,269,245,242,276,229,224,265,239,254,252,256,248,276,233,266,233,232,256,241,236,232,289,234,239,261,230,244,215,238,234,242,250,217,204,252,260,235,218,238,267,244,249,232,263,230,256,231,231,243,234,278,216,224,244,227,256,263,233,256,241,240,241,234,273,266,239,269,261,227,260,260,244,246,250,210,256,229,221,230,207,212,252,226,257,236,214,240,251,246,248,236,270,271,251,254,261,260,234,224,253,224,253,226,221,245,209,247,267,246,232,262,239,288,238,238,239,263,251,243,224,251,240,263,218,233,230,253,242,265,216,249,248,273,239,254,261,257,219,258,237,242,236,270,243,234,225,265,235,232,257,267,258,246,232,259,251,223,244,244,214,254,246,256,267,255,246,240,250,237,237,261,235,273,232,262,244,266,249,248,248,228,231,256,246,249,233,247,259,238,263,254,210,226,272,243,249,274,249,254,252,246,242,266,205,267,274,251,229,243,242,240,267,235,264,255,254,222,254,220,246,220,237,271,257,235,239,209,255,241,257,260,257,247,268,245,252,219,255,245,220,218,273,226,245,278,256,264,254,254,231,261,230,230,268,263,232,235,239,252,265,260,232,220,267,259,204,236,249,248,240,239,262,210,251,238,240,242,256,240,234,245,222,239,257,234,226,263,230,263,252,245,243,247,260,257,228,228,248,251,255,237,234,252,229,241,221,256,229,253,246,271,258]},{"counters":[245,248,244,243,226,254,245,281,228,233,228,252,235,231,271,253,226,247,266,219,240,243,249,241,235,250,234,221,237,252,268,222,251,253,255,271,211,256,259,239,252,238,217,262,229,243,235,236,224,225,243,223,234,265,248,248,260,270,224,263,223,246,251,263,228,253,235,255,214,233,263,207,227,261,253,251,228,237,239,248,223,231,229,256,236,250,232,234,259,246,231,259,241,250,238,248,251,229,233,232,242,266,243,235,227,244,245,235,218,251,259,241,258,236,256,239,262,281,273,243,221,238,231,248,249,235,244,231,232,224,235,221,242,250,243,228,240,248,229,244,215,202,229,228,259,241,221,247,255,242,218,254,237,275,250,256,240,237,253,232,251,241,261,259,243,242,207,256,267,245,261,240,240,254,273,242,239,237,240,240,265,253,247,245,208,244,248,262,215,231,250,256,234,218,227,249,264,239,276,235,255,236,235,272,248,226,221,240,236,247,241,273,230,245,232,233,243,221,231,270,263,232,239,282,239,235,239,252,242,231,220,259,232,231,231,251,236,237,259,252,252,243,221,248,268,213,231,235,239,269,253,264,236,218,246,241,250,256,245,234,247,243,239,229,266,246,249,239,239,239,208,242,251,237,256,241,222,250,271,241,232,272,243,228,262,259,239,245,262,267,233,248,226,213,236,275,230,259,252,251,248,245,240,262,217,259,254,251,276,249,275,251,238,256,233,260,222,253,233,199,237,268,266,257,257,263,253,260,261,256,264,243,237,272,226,253,255,266,267,230,228,246,248,245,257,245,251,247,239,266,285,224,222,220,229,246,262,248,213,273,242,216,228,256,258,252,253,278,272,246,241,258,231,236,229,263,251,244,251,239,251,240,274,226,267,223,240,237,258,262,224,269,245,244,229,221,248,244,236,250,242,242,230,233,216,240,234,235,243,300,248,256,243,244,265,262,222,235,246,238,256,241,266,247,235,218,231,250,216,240,231,245,264,226,253,251,229,239,218,269,252,263,234,266,234,259,239,242,229,234,235,208,261,211,252,226,268,242,261,251,248,253,260,248,212,230,236,208,236,257,228,248,220,230,261,233,255,249,228,250,252,222,277,261,229,237,244,222,253,235,229,253,253,225,246,263,235,260,239,260,242,260,231,228,247,255,254,234,250,237,224,253,253,265,228,233,250,276,248,278,262,249,261,248,217,246,222,235,247,248,248,264,254,237,248,225,224,228,238,232,251,236,222,277,244,247,278,249,233,253,250,248,251,233,261,271,235,242,261,255,253,267,230,237,223,267,264,250,252,242,247,255,233,238,248,252,248,240,232,238,256,235,269,229,211,212,238,226,243,275,239,249,241,264,270,257,259,220,255,238,265,230,228,249,227,250,223,215,232,268,231,287,264,236,234,224,232,249,230,223,240,244,242,223,232,251,266,247,251,258,242,250,258,241,229,250,245,246,263,236,236,227,235,258,250,214,248,238,255,266,251,239,240,252,272,224,259,250,253,256,220,257,237,240,232,248,225,277,252,245,226,229,253,238,248,259,247,239,251,254,243,264,235,218,234,244,244,227,246,236,239,251,232,224,236,217,263,257,253,221,257,242,229,232,225,249,244,254,263,247,237,250,244,271,248,254,248,251,272,237,212,253,252,252,241,230,225,261,239,267,252,261,246,248,226,232,248,242,236,238,226,245,251,248,256,242,239,235,248,252,242,278,232,237,242,236,270,256,238,235,258,261,213,250,249,239,258,250,221,265,260,271,230,243,241,225,251,236,225,231,261,266,257,246,249,257,262,242,276,235,218,234,241,220,223,246,224,244,245,224,257,273,246,256,208,259,254,246,276,246,242,257,243,254,235,247,234,249,238,259,221,265,221,256,222,236,262,240,267,267,256,245,238,242,244,246,269,257,230,252,232,286,265,214,234,237,233,254,259,251,237,231,235,248,238,215,253,248,231,228,254,253,252,242,217,237,250,229,252,237,255,230,248,249,268,254,250,244,222,242,224,228,242,258,242,237,234,237,221,232,225,251,232,239,213,236,238,244,243,254,234,244,243,232,264,252,245,236,237,252,266,258,240,247,259,237,234,229,228,211,249,253,283,249,247,252,247,253,208,223,254,244,246,258,245,252,227,244,318,225,217,246,241,236,248,263,228,254,268,245,243,255,241,228,220,230,220,238,257,254,229,210,264,230,256,236,249,260,251,245,211,251,217,263,259,252,240,267,237,242,236,255,280,245,243,244,234,242,250,244,222,261,229,254,260,226,222,231,226,285,264,246,262,243,259,255,263,221,270,279,240,220,225,272,227,270,223,248,260,259,251,260,229,246,267,254,220,241,259,220,263,238,224,247,239,229,250,246,244,249,223,262,247,281,272,247,230,229,252,230,259,242,239,239,275,249,263,237,228,244,239,212,236,233,246,252,254,278,248,222,231,215,245,266,230,259,244,257,251,225,236,251,240,248,239,258,260,245,250,253,233,247,249,237,248,240,250,228,246,248,248,256,244,247,267,252,242,252,234,260,235,256,259,264,241,234,209,269,221,230,249,263,238,247,242,241,234,230,246,252,228,253,213,239,252,274,251,233,252,245,262,261,240,231,259,255,258,249,250,238,253,259,263,260,233,223,248,244,248,249,222,253,236,242,234,236,239,223,257,250,251,259,254,210,245,240,248,225,227,263,233,246,260,245,256,233,223,241,211,273,246,240,226,257,234,239,283,248,260,240,250,247,236,230,239,268,215,230,234,245,254,224,239,233,265,269,262,248,244,249,237,223,236,260,246,240,254,230,259,230,237,222,233,255,261,218,251,239,263,252,262,222,223,235,248,238,249,265,238,270,223,268,262,231,241,222,250,251,246,245,248,252,245,255,229,238,230,223,231,255,236,245,241,254,258,263,242,257,249,265,263,276,251,258,262,240,270,278,247,233,272,229,260,213,260,231,234,229,233,225,244,226,255,249,226,206,266,215,237,228,250,239,231,246,230,258,216,256,263,227,235,240,277,220,248,240,248,238,226,252,259,227,244,251,216,277,255,253,244,242,225,258,248,241,238,266,235,241,247,256,226,252,237,253,247,220,265,247,237,276,261,232,241,242,280,229,221,271,278,246,249,233,264,212,226,254,241,234,232,252,246,228,237,231,241,234,234,241,225,234,254,253,245,267,257,258,238,228,239,218,272,257,234,262,243,262,253,244,250,254,260,232,265,248,225,228,236,228,220,247,249,253,219,253,266,253,246,252,244,258,257,239,238,248,235,244,226,248,254,219,233,233,220,259,265,248,241,233,246,260,262,264,249,207,280,204,240,213,217,243,232,253,246,249,209,250,244,250,221,248,237,245,249,237,242,221,215,232,257,241,270,238,235,235,251,258,236,237,224,249,227,242,246,256,259,247,237,252,245,228,243,220,224,235,252,232,226,249,240,251,240,226,235,244,227,243,241,258,237,237,250,262,254,219,258,250,236,208,245,235,241,250,257,233,268,259,250,233,256,209,245,251,218,234,268,261,224,225,273,247,264,237,226,240,243,258,215,235,264,248,227,257,246,248,247,257,273,223,232,253,243,235,271,248,244,244,233,249,245,235,244,233,260,271,262,276,233,250,247,248,245,265,262,231,262,235,260,221,230,250,246,223,273,206,261,231,240,223,250,246,252,245,231,274,260,221,276,257,246,265,239,233,260,220,255,248,217,262,248,257,242,242,225,249,258,253,280,243,246,248,242,222,262,215,234,232,230,230,248,260,230,271,233,248,261,225,257,248,274,218,252,250,261,235,259,258,244,235,245,258,220,246,249,235,254,242,249,252,246,261,252,238,247,236,216,221,239,235,230,266,231,252,226,232,258,246,254,260,230,272,235,255,242,245,248,247,241,277,246,222,244,251,225,229,264,239,237,237,252,229,271,237,238,221,263,258,253,234,226,266,242,216,235,245,272,247,225,252,237,210,219,253,224,239,228,247,249,263,243,258,259,262,226,243,242,248,225,238,223,236,243,209,258,245,267,248,243,240,257,238,232,243,219,246,270,250,259,227,241,266,250,251,248,247,238,239,263,230,243,275,253,240,256,255,250,254,217,261,267,252,253,233,244,232,236,252,240,246,247,244,278,236,231,248,232,220,226,280,255,226,230,227,238,236,264,271,231,246,271,240,223,232,231,213,227,242,258,219,252,254,245,254,232,212,260,228,257,265,240,256,259,235,255,241,209,243,230,225,222,261,221,234,252,245,239,225,251,267,228,256,268,258,263,229,220,257,262,262,245,253,240,269,257,260,249,246,256,253,256,238,258,254,247,224,220,250,225,237,243,233,208,273,257,247,254,260,248,244,257,239,220,246,225,247,238,233,253,226,255,262,245,269,265,252,252,232,250,251,262,233,251,242,249,250,237,243,240,262,268,231,247,229,257,238,256,256,246,234,258,264,234,229,236,256,233,236,231,218,251,217,248,218,276,236,246,234,223,232,247,264,227,230,255,260,257,263,214,258,265,252,247,228,263,270,244,244,262,242,232,228,265,233,257,220,244,225,219,245,236,273,242,255,230,246,253,250,259,252,238,262,230,212,247,233,254,260,252,218,252,262,243,252,233,262,246,227,261,268,271,276,252,262,224,258,226,261,223,231,275,216,209,220,255,236,246,249,239,235]},{"counters":[249,253,238,265,272,232,235,274,214,258,250,263,241,250,248,245,258,248,248,268,257,241,260,262,229,267,240,248,234,270,240,253,235,256,248,255,245,276,277,227,253,226,263,254,223,232,233,250,240,269,229,260,261,236,226,235,253,239,214,207,250,233,206,253,256,199,263,236,266,218,244,216,258,241,233,237,247,235,264,222,255,232,244,246,209,234,230,238,258,245,248,228,258,236,211,211,261,244,262,254,250,244,234,242,224,223,232,248,254,232,243,243,255,234,248,245,239,253,233,247,242,236,245,249,264,236,254,264,254,242,217,244,264,256,229,243,238,250,250,240,240,227,240,265,248,249,237,226,273,250,226,242,247,232,258,228,242,232,253,249,230,241,256,251,238,216,235,245,240,244,271,252,244,229,249,224,232,234,257,230,229,239,265,244,239,258,265,256,236,218,258,235,227,235,235,237,264,256,240,245,237,265,231,251,245,248,241,233,252,277,272,274,235,227,255,256,247,263,244,220,232,244,231,245,257,207,239,262,227,258,245,247,210,229,265,234,245,250,232,221,269,239,242,228,247,270,254,245,243,266,253,274,265,259,244,223,223,226,251,253,241,261,220,242,262,245,244,250,231,250,233,236,245,255,261,230,250,227,224,260,242,222,247,278,262,223,241,235,252,241,262,249,257,247,246,259,247,264,253,259,284,248,249,254,199,257,244,235,261,230,271,252,209,240,262,257,246,231,244,236,214,260,270,237,259,287,240,253,260,238,240,242,242,259,223,242,252,259,221,258,240,223,236,250,243,236,262,249,228,248,228,256,247,249,267,237,203,247,251,232,258,251,267,248,251,260,259,239,255,265,245,260,245,216,250,223,261,249,236,245,244,251,257,243,246,260,251,230,268,269,233,250,254,245,236,238,218,248,254,258,232,269,238,229,226,235,235,225,231,262,233,229,264,244,265,232,253,267,257,227,249,265,235,257,208,236,236,214,256,250,234,250,262,216,251,230,253,232,235,241,252,220,228,226,251,250,239,264,244,239,230,237,230,255,250,234,259,257,263,201,227,236,256,230,241,239,245,245,241,244,227,245,219,232,248,249,249,273,222,229,265,251,230,247,261,235,227,242,213,269,229,265,244,252,250,217,255,233,255,246,248,230,230,265,237,277,240,235,262,262,225,270,250,248,214,258,255,290,266,227,242,236,243,257,248,249,259,225,257,261,225,241,228,221,244,220,226,267,232,234,256,217,253,251,277,263,251,237,245,233,228,258,242,221,228,256,241,241,224,242,224,228,228,256,206,237,249,257,239,208,242,252,236,271,247,246,219,248,245,212,225,240,234,242,248,231,267,227,214,279,205,266,260,233,233,226,254,264,243,254,241,237,221,245,210,238,244,225,243,245,251,247,224,261,244,261,226,266,241,260,257,248,268,229,229,257,277,241,248,227,257,255,221,236,216,256,246,245,247,234,235,258,233,277,237,232,279,246,245,266,259,238,233,231,237,237,233,233,212,229,217,264,219,236,274,245,237,209,237,254,254,260,242,242,281,248,256,237,263,212,219,235,227,228,254,252,237,263,250,265,238,247,240,249,238,240,253,247,261,245,232,256,272,231,251,265,231,267,258,260,220,240,245,256,243,240,251,247,253,250,237,226,244,263,232,241,208,279,256,226,247,263,253,240,234,213,253,246,227,241,255,241,282,239,239,229,282,277,240,253,249,220,244,256,234,223,258,229,257,244,241,244,250,220,269,272,244,256,243,225,233,227,259,236,220,233,231,259,256,242,217,241,243,261,245,227,243,263,224,201,242,220,251,251,216,278,269,271,236,235,234,242,256,265,230,202,231,250,275,235,243,200,255,250,259,244,255,243,227,219,251,235,265,235,236,250,234,247,244,248,244,261,230,256,244,246,259,227,220,273,225,261,255,268,230,260,236,239,226,252,272,212,261,207,247,231,250,251,228,267,257,271,211,234,241,244,256,243,234,231,251,269,255,240,248,229,254,228,210,241,223,256,254,246,208,231,228,237,231,244,229,289,242,262,265,254,244,238,261,252,247,242,246,214,218,214,250,258,235,267,250,209,249,229,233,247,242,259,266,220,234,231,252,228,227,259,261,242,255,236,228,230,240,224,266,247,269,256,232,276,241,240,252,244,251,253,252,247,251,277,250,247,240,243,230,241,242,244,221,253,260,256,267,256,244,243,249,239,255,234,234,273,219,256,269,243,269,264,247,247,259,213,245,255,224,221,243,244,244,264,250,261,262,225,263,225,255,209,239,231,232,236,243,236,234,222,240,233,252,265,227,258,261,261,240,230,233,260,225,229,237,223,208,237,295,242,227,259,251,232,259,231,226,263,229,244,242,239,229,254,257,246,246,248,222,257,258,255,225,231,266,234,254,248,236,263,229,251,239,264,222,248,248,238,246,256,234,260,233,264,268,227,245,253,244,231,224,247,249,250,279,246,255,265,257,249,226,247,232,254,261,249,212,262,237,245,237,248,229,248,248,229,232,252,259,223,241,244,241,233,224,244,240,233,240,235,243,249,241,240,245,235,256,247,270,232,222,243,233,244,223,202,256,273,237,247,238,272,243,229,250,231,250,260,227,243,256,247,234,240,256,242,252,222,237,248,239,224,223,231,238,257,253,229,226,238,237,250,266,243,240,255,259,214,236,246,217,251,238,262,268,244,232,256,243,267,244,242,261,264,255,240,254,268,265,263,223,261,231,235,227,280,218,252,239,256,253,229,243,239,238,232,244,249,247,250,269,252,253,253,282,261,245,256,235,243,230,258,264,239,247,236,232,244,221,226,261,240,241,242,247,271,219,249,256,231,239,266,223,238,238,255,230,227,247,234,246,274,224,247,248,257,234,236,259,262,219,244,213,241,255,264,235,250,218,240,217,253,266,239,252,252,246,240,241,259,267,213,246,247,219,258,235,250,240,238,255,244,241,259,245,243,245,244,232,247,256,255,230,251,242,252,240,254,249,211,245,235,225,241,252,243,260,263,229,229,231,221,238,211,250,253,248,236,262,235,245,225,236,232,262,247,237,242,261,244,260,230,250,235,250,261,245,260,249,218,248,245,232,229,238,251,250,229,254,258,232,243,244,245,227,241,249,221,259,234,263,232,230,258,257,252,257,223,251,241,242,258,263,232,272,279,268,230,234,258,230,241,253,266,248,245,265,261,251,252,253,209,228,278,240,235,231,231,270,242,248,258,274,265,247,233,243,248,248,243,271,241,256,243,231,257,240,236,265,273,270,241,236,259,231,299,253,243,253,269,227,227,244,260,258,265,223,251,231,241,231,240,243,260,244,268,247,228,271,235,229,253,270,222,235,225,237,271,235,241,253,250,247,222,246,237,235,254,256,266,275,261,239,262,257,229,234,248,266,251,248,226,255,255,215,229,226,235,260,256,251,246,238,244,238,224,234,230,246,253,242,251,202,239,255,225,249,211,248,254,249,239,243,231,232,250,238,263,239,266,240,247,227,235,249,221,243,240,263,242,253,236,251,212,245,288,233,210,272,235,237,225,243,244,256,247,240,239,240,237,240,234,256,242,226,224,258,248,245,232,236,278,238,240,245,254,262,219,253,239,229,276,229,269,262,250,231,256,271,268,239,246,247,237,238,224,242,232,255,240,260,246,235,229,248,269,236,262,260,240,273,247,257,241,234,239,236,263,246,234,248,254,233,245,247,238,239,276,245,238,257,249,278,230,236,268,257,259,236,243,235,255,262,244,278,249,249,230,240,259,234,245,241,235,248,227,239,235,247,265,227,245,260,235,248,244,252,249,286,249,237,243,269,228,227,281,252,261,246,248,221,268,240,241,252,249,229,233,284,225,235,225,245,239,248,224,257,258,233,258,215,206,288,265,245,225,253,249,244,250,233,244,245,260,240,240,234,241,220,249,224,236,256,238,255,245,264,248,273,246,257,248,262,233,238,256,250,213,240,234,221,265,243,233,272,231,258,229,240,242,246,267,270,229,245,268,255,235,247,247,248,225,232,242,259,261,263,217,240,251,238,234,243,233,267,234,255,251,247,260,259,244,253,209,248,250,254,246,238,254,239,231,261,215,254,244,228,257,237,237,251,216,265,252,266,234,232,229,241,236,226,248,237,250,222,244,225,274,247,257,252,251,247,256,229,230,250,226,264,243,237,242,249,238,243,262,220,244,249,246,251,225,248,233,229,250,230,240,227,244,246,213,219,261,243,238,220,234,232,246,283,271,225,249,243,252,251,260,251,248,218,256,229,246,241,265,227,236,266,237,279,252,239,237,276,245,234,241,217,234,261,256,253,272,250,246,251,259,242,225,253,244,209,224,203,214,261,224,248,262,247,250,256,250,233,239,264,238,270,243,242,233,247,237,240,236,230,228,248,261,207,250,240,217,236,259,253,250,235,238,213,230,245,261,239,217,209,226,270,268,241,239,236,228,238,253,232,278,236,251,229,237,237,254,244,245,231,265,216,221,257,241,234,268,253,242,254,255,249,243,239,234,251,225,228,234,262,208,255,213,259,256,284,224,235,243,226,230,255,224,274,242,252,249,261,269,254,250,234,263,231,241,283,228,236,251,260,224,244,247,229,271,243,264,207,261,249,239,268,220,265,232,231,243,249,249,260,245,218,208,236,250]}]},"null_count":0,"tot_col_size":32483288,"last_update_version":401695321661112321},"s_name":{"histogram":{"ndv":500000,"buckets":[{"count":2000,"lower_bound":"U3VwcGxpZXIjMDAwMDAwMTUz","upper_bound":"U3VwcGxpZXIjMDAwMDAxNDc0","repeats":1},{"count":4000,"lower_bound":"U3VwcGxpZXIjMDAwMDAyNzA0","upper_bound":"U3VwcGxpZXIjMDAwMDAzOTQ2","repeats":1},{"count":6000,"lower_bound":"U3VwcGxpZXIjMDAwMDA0Mzgx","upper_bound":"U3VwcGxpZXIjMDAwMDA3OTg4","repeats":1},{"count":8000,"lower_bound":"U3VwcGxpZXIjMDAwMDA4ODg5","upper_bound":"U3VwcGxpZXIjMDAwMDEwMTA5","repeats":1},{"count":10000,"lower_bound":"U3VwcGxpZXIjMDAwMDEwMTgw","upper_bound":"U3VwcGxpZXIjMDAwMDExNTQ5","repeats":1},{"count":12000,"lower_bound":"U3VwcGxpZXIjMDAwMDEyMDQy","upper_bound":"U3VwcGxpZXIjMDAwMDEzNDc0","repeats":1},{"count":14000,"lower_bound":"U3VwcGxpZXIjMDAwMDE0MzU0","upper_bound":"U3VwcGxpZXIjMDAwMDE1ODQ1","repeats":1},{"count":16000,"lower_bound":"U3VwcGxpZXIjMDAwMDE2MzA4","upper_bound":"U3VwcGxpZXIjMDAwMDE3MDMw","repeats":1},{"count":18000,"lower_bound":"U3VwcGxpZXIjMDAwMDE3MDU2","upper_bound":"U3VwcGxpZXIjMDAwMDE3OTY2","repeats":1},{"count":20000,"lower_bound":"U3VwcGxpZXIjMDAwMDE4NTM3","upper_bound":"U3VwcGxpZXIjMDAwMDIwNzk3","repeats":1},{"count":22000,"lower_bound":"U3VwcGxpZXIjMDAwMDIxMDk2","upper_bound":"U3VwcGxpZXIjMDAwMDIxNzYx","repeats":1},{"count":24000,"lower_bound":"U3VwcGxpZXIjMDAwMDIxODkw","upper_bound":"U3VwcGxpZXIjMDAwMDIzMDcz","repeats":1},{"count":26000,"lower_bound":"U3VwcGxpZXIjMDAwMDI0OTUw","upper_bound":"U3VwcGxpZXIjMDAwMDI2MjEy","repeats":1},{"count":28000,"lower_bound":"U3VwcGxpZXIjMDAwMDI2NTkz","upper_bound":"U3VwcGxpZXIjMDAwMDI3MzAw","repeats":1},{"count":30000,"lower_bound":"U3VwcGxpZXIjMDAwMDI3MzYz","upper_bound":"U3VwcGxpZXIjMDAwMDI4MjIz","repeats":1},{"count":32000,"lower_bound":"U3VwcGxpZXIjMDAwMDI4Nzc0","upper_bound":"U3VwcGxpZXIjMDAwMDI5NTc0","repeats":1},{"count":34000,"lower_bound":"U3VwcGxpZXIjMDAwMDI5NjI0","upper_bound":"U3VwcGxpZXIjMDAwMDI5ODk4","repeats":1},{"count":36000,"lower_bound":"U3VwcGxpZXIjMDAwMDI5OTMw","upper_bound":"U3VwcGxpZXIjMDAwMDMwNjY1","repeats":1},{"count":38000,"lower_bound":"U3VwcGxpZXIjMDAwMDMxNzE4","upper_bound":"U3VwcGxpZXIjMDAwMDMyNTA0","repeats":1},{"count":40000,"lower_bound":"U3VwcGxpZXIjMDAwMDMyNzQ3","upper_bound":"U3VwcGxpZXIjMDAwMDM0MjU0","repeats":1},{"count":42000,"lower_bound":"U3VwcGxpZXIjMDAwMDM0NjI2","upper_bound":"U3VwcGxpZXIjMDAwMDM3ODY2","repeats":1},{"count":44000,"lower_bound":"U3VwcGxpZXIjMDAwMDM4MDMz","upper_bound":"U3VwcGxpZXIjMDAwMDM5MzE2","repeats":1},{"count":46000,"lower_bound":"U3VwcGxpZXIjMDAwMDQwMDg5","upper_bound":"U3VwcGxpZXIjMDAwMDQyMjQy","repeats":1},{"count":48000,"lower_bound":"U3VwcGxpZXIjMDAwMDQyNjAw","upper_bound":"U3VwcGxpZXIjMDAwMDQ2NTc5","repeats":1},{"count":50000,"lower_bound":"U3VwcGxpZXIjMDAwMDQ3OTU1","upper_bound":"U3VwcGxpZXIjMDAwMDUwODky","repeats":1},{"count":52000,"lower_bound":"U3VwcGxpZXIjMDAwMDUwOTUx","upper_bound":"U3VwcGxpZXIjMDAwMDUyOTMx","repeats":1},{"count":54000,"lower_bound":"U3VwcGxpZXIjMDAwMDU1ODAz","upper_bound":"U3VwcGxpZXIjMDAwMDU3NTkw","repeats":1},{"count":56000,"lower_bound":"U3VwcGxpZXIjMDAwMDU3ODQy","upper_bound":"U3VwcGxpZXIjMDAwMDU4Nzc3","repeats":1},{"count":58000,"lower_bound":"U3VwcGxpZXIjMDAwMDU5OTY1","upper_bound":"U3VwcGxpZXIjMDAwMDYxNjg2","repeats":1},{"count":60000,"lower_bound":"U3VwcGxpZXIjMDAwMDYyMDIw","upper_bound":"U3VwcGxpZXIjMDAwMDY1MTk3","repeats":1},{"count":62000,"lower_bound":"U3VwcGxpZXIjMDAwMDY1ODA0","upper_bound":"U3VwcGxpZXIjMDAwMDY3NjA5","repeats":1},{"count":64000,"lower_bound":"U3VwcGxpZXIjMDAwMDY3NjQ2","upper_bound":"U3VwcGxpZXIjMDAwMDY5NDcz","repeats":1},{"count":66000,"lower_bound":"U3VwcGxpZXIjMDAwMDY5NDc4","upper_bound":"U3VwcGxpZXIjMDAwMDcxMDgz","repeats":1},{"count":68000,"lower_bound":"U3VwcGxpZXIjMDAwMDcxMzI0","upper_bound":"U3VwcGxpZXIjMDAwMDcyNTUx","repeats":1},{"count":70000,"lower_bound":"U3VwcGxpZXIjMDAwMDczNDI4","upper_bound":"U3VwcGxpZXIjMDAwMDc1NDcy","repeats":1},{"count":72000,"lower_bound":"U3VwcGxpZXIjMDAwMDc2Mzkx","upper_bound":"U3VwcGxpZXIjMDAwMDc4NjM1","repeats":1},{"count":74000,"lower_bound":"U3VwcGxpZXIjMDAwMDc5OTU0","upper_bound":"U3VwcGxpZXIjMDAwMDgzMzE2","repeats":1},{"count":76000,"lower_bound":"U3VwcGxpZXIjMDAwMDgzNDUw","upper_bound":"U3VwcGxpZXIjMDAwMDg2ODE1","repeats":1},{"count":78000,"lower_bound":"U3VwcGxpZXIjMDAwMDg2ODk3","upper_bound":"U3VwcGxpZXIjMDAwMDg3MzYw","repeats":1},{"count":80000,"lower_bound":"U3VwcGxpZXIjMDAwMDg3ODU0","upper_bound":"U3VwcGxpZXIjMDAwMDg4MjYx","repeats":1},{"count":82000,"lower_bound":"U3VwcGxpZXIjMDAwMDg4MzYx","upper_bound":"U3VwcGxpZXIjMDAwMDg4OTk0","repeats":1},{"count":84000,"lower_bound":"U3VwcGxpZXIjMDAwMDkwNjc0","upper_bound":"U3VwcGxpZXIjMDAwMDkxNjgw","repeats":1},{"count":86000,"lower_bound":"U3VwcGxpZXIjMDAwMDkzMjA3","upper_bound":"U3VwcGxpZXIjMDAwMDk1MjQy","repeats":1},{"count":88000,"lower_bound":"U3VwcGxpZXIjMDAwMDk2MDI2","upper_bound":"U3VwcGxpZXIjMDAwMDk3MzM3","repeats":1},{"count":90000,"lower_bound":"U3VwcGxpZXIjMDAwMDk4Njk2","upper_bound":"U3VwcGxpZXIjMDAwMDk5NjAw","repeats":1},{"count":92000,"lower_bound":"U3VwcGxpZXIjMDAwMDk5NzA4","upper_bound":"U3VwcGxpZXIjMDAwMTAzMzE1","repeats":1},{"count":94000,"lower_bound":"U3VwcGxpZXIjMDAwMTAzNjky","upper_bound":"U3VwcGxpZXIjMDAwMTA1MTI5","repeats":1},{"count":96000,"lower_bound":"U3VwcGxpZXIjMDAwMTA1MzQ3","upper_bound":"U3VwcGxpZXIjMDAwMTA2Mzk1","repeats":1},{"count":98000,"lower_bound":"U3VwcGxpZXIjMDAwMTA2NDMx","upper_bound":"U3VwcGxpZXIjMDAwMTA2OTcw","repeats":1},{"count":100000,"lower_bound":"U3VwcGxpZXIjMDAwMTA3MTI2","upper_bound":"U3VwcGxpZXIjMDAwMTA4NDk1","repeats":1},{"count":102000,"lower_bound":"U3VwcGxpZXIjMDAwMTEwNjEy","upper_bound":"U3VwcGxpZXIjMDAwMTEyMDc3","repeats":1},{"count":104000,"lower_bound":"U3VwcGxpZXIjMDAwMTEyMTM2","upper_bound":"U3VwcGxpZXIjMDAwMTEyOTQ0","repeats":1},{"count":106000,"lower_bound":"U3VwcGxpZXIjMDAwMTEyOTU5","upper_bound":"U3VwcGxpZXIjMDAwMTE0Mjc0","repeats":1},{"count":108000,"lower_bound":"U3VwcGxpZXIjMDAwMTE1MDEw","upper_bound":"U3VwcGxpZXIjMDAwMTE1Nzc0","repeats":1},{"count":110000,"lower_bound":"U3VwcGxpZXIjMDAwMTE2MjAz","upper_bound":"U3VwcGxpZXIjMDAwMTE3MzQw","repeats":1},{"count":112000,"lower_bound":"U3VwcGxpZXIjMDAwMTE3OTU1","upper_bound":"U3VwcGxpZXIjMDAwMTIwNzE1","repeats":1},{"count":114000,"lower_bound":"U3VwcGxpZXIjMDAwMTIxODA5","upper_bound":"U3VwcGxpZXIjMDAwMTIzNzU2","repeats":1},{"count":116000,"lower_bound":"U3VwcGxpZXIjMDAwMTIzODc4","upper_bound":"U3VwcGxpZXIjMDAwMTI0NTQz","repeats":1},{"count":118000,"lower_bound":"U3VwcGxpZXIjMDAwMTI0ODQ5","upper_bound":"U3VwcGxpZXIjMDAwMTI2NzQ3","repeats":1},{"count":120000,"lower_bound":"U3VwcGxpZXIjMDAwMTI2OTI5","upper_bound":"U3VwcGxpZXIjMDAwMTMwMzE5","repeats":1},{"count":122000,"lower_bound":"U3VwcGxpZXIjMDAwMTMwNDkz","upper_bound":"U3VwcGxpZXIjMDAwMTMxNjY5","repeats":1},{"count":124000,"lower_bound":"U3VwcGxpZXIjMDAwMTMxODky","upper_bound":"U3VwcGxpZXIjMDAwMTMzMDgz","repeats":1},{"count":126000,"lower_bound":"U3VwcGxpZXIjMDAwMTM0MDYz","upper_bound":"U3VwcGxpZXIjMDAwMTM0NTAy","repeats":1},{"count":128000,"lower_bound":"U3VwcGxpZXIjMDAwMTM0NTc1","upper_bound":"U3VwcGxpZXIjMDAwMTM2MDk2","repeats":1},{"count":130000,"lower_bound":"U3VwcGxpZXIjMDAwMTM2NzE5","upper_bound":"U3VwcGxpZXIjMDAwMTM3Mzcw","repeats":1},{"count":132000,"lower_bound":"U3VwcGxpZXIjMDAwMTM4NDA3","upper_bound":"U3VwcGxpZXIjMDAwMTQwNjAw","repeats":1},{"count":134000,"lower_bound":"U3VwcGxpZXIjMDAwMTQwNjYz","upper_bound":"U3VwcGxpZXIjMDAwMTQyMDk3","repeats":1},{"count":136000,"lower_bound":"U3VwcGxpZXIjMDAwMTQyMjMz","upper_bound":"U3VwcGxpZXIjMDAwMTQzMjc0","repeats":1},{"count":138000,"lower_bound":"U3VwcGxpZXIjMDAwMTQzNTgz","upper_bound":"U3VwcGxpZXIjMDAwMTQ1MzM3","repeats":1},{"count":140000,"lower_bound":"U3VwcGxpZXIjMDAwMTQ1NjM2","upper_bound":"U3VwcGxpZXIjMDAwMTQ3NzMz","repeats":1},{"count":142000,"lower_bound":"U3VwcGxpZXIjMDAwMTQ3NzY0","upper_bound":"U3VwcGxpZXIjMDAwMTUwODQ3","repeats":1},{"count":144000,"lower_bound":"U3VwcGxpZXIjMDAwMTUyMDc3","upper_bound":"U3VwcGxpZXIjMDAwMTUzMTkz","repeats":1},{"count":146000,"lower_bound":"U3VwcGxpZXIjMDAwMTUzNjYy","upper_bound":"U3VwcGxpZXIjMDAwMTU0OTAz","repeats":1},{"count":148000,"lower_bound":"U3VwcGxpZXIjMDAwMTU1NTAz","upper_bound":"U3VwcGxpZXIjMDAwMTU2NjY1","repeats":1},{"count":150000,"lower_bound":"U3VwcGxpZXIjMDAwMTU2NzMw","upper_bound":"U3VwcGxpZXIjMDAwMTU3ODIw","repeats":1},{"count":152000,"lower_bound":"U3VwcGxpZXIjMDAwMTU3ODQz","upper_bound":"U3VwcGxpZXIjMDAwMTYxMDU4","repeats":1},{"count":154000,"lower_bound":"U3VwcGxpZXIjMDAwMTYxNjQ4","upper_bound":"U3VwcGxpZXIjMDAwMTYyMjI4","repeats":1},{"count":156000,"lower_bound":"U3VwcGxpZXIjMDAwMTYyNTY5","upper_bound":"U3VwcGxpZXIjMDAwMTYyOTc4","repeats":1},{"count":158000,"lower_bound":"U3VwcGxpZXIjMDAwMTYzMTA5","upper_bound":"U3VwcGxpZXIjMDAwMTYzNDk3","repeats":1},{"count":160000,"lower_bound":"U3VwcGxpZXIjMDAwMTY0Mjgw","upper_bound":"U3VwcGxpZXIjMDAwMTY1MDkw","repeats":1},{"count":162000,"lower_bound":"U3VwcGxpZXIjMDAwMTY1NDAz","upper_bound":"U3VwcGxpZXIjMDAwMTY1NjI0","repeats":1},{"count":164000,"lower_bound":"U3VwcGxpZXIjMDAwMTY3MjI5","upper_bound":"U3VwcGxpZXIjMDAwMTY5NTQ2","repeats":1},{"count":166000,"lower_bound":"U3VwcGxpZXIjMDAwMTY5Njgy","upper_bound":"U3VwcGxpZXIjMDAwMTcwMjEx","repeats":1},{"count":168000,"lower_bound":"U3VwcGxpZXIjMDAwMTcwNzc2","upper_bound":"U3VwcGxpZXIjMDAwMTczMDEy","repeats":1},{"count":170000,"lower_bound":"U3VwcGxpZXIjMDAwMTczNDEz","upper_bound":"U3VwcGxpZXIjMDAwMTczODEx","repeats":1},{"count":172000,"lower_bound":"U3VwcGxpZXIjMDAwMTczODYz","upper_bound":"U3VwcGxpZXIjMDAwMTc0MDY1","repeats":1},{"count":174000,"lower_bound":"U3VwcGxpZXIjMDAwMTc0ODQ1","upper_bound":"U3VwcGxpZXIjMDAwMTc3OTA1","repeats":1},{"count":176000,"lower_bound":"U3VwcGxpZXIjMDAwMTc4MzU2","upper_bound":"U3VwcGxpZXIjMDAwMTc5OTg1","repeats":1},{"count":178000,"lower_bound":"U3VwcGxpZXIjMDAwMTgwMTM2","upper_bound":"U3VwcGxpZXIjMDAwMTgxNDE4","repeats":1},{"count":180000,"lower_bound":"U3VwcGxpZXIjMDAwMTgxNDgx","upper_bound":"U3VwcGxpZXIjMDAwMTgyOTg3","repeats":1},{"count":182000,"lower_bound":"U3VwcGxpZXIjMDAwMTgzNDUx","upper_bound":"U3VwcGxpZXIjMDAwMTg0NTMy","repeats":1},{"count":184000,"lower_bound":"U3VwcGxpZXIjMDAwMTg0ODQ4","upper_bound":"U3VwcGxpZXIjMDAwMTg2OTE5","repeats":1},{"count":186000,"lower_bound":"U3VwcGxpZXIjMDAwMTg3MDg5","upper_bound":"U3VwcGxpZXIjMDAwMTg4MzA0","repeats":1},{"count":188000,"lower_bound":"U3VwcGxpZXIjMDAwMTg5ODY2","upper_bound":"U3VwcGxpZXIjMDAwMTkwODAz","repeats":1},{"count":190000,"lower_bound":"U3VwcGxpZXIjMDAwMTkxNjUw","upper_bound":"U3VwcGxpZXIjMDAwMTk0MjE0","repeats":1},{"count":192000,"lower_bound":"U3VwcGxpZXIjMDAwMTk0MjQx","upper_bound":"U3VwcGxpZXIjMDAwMTk0NDk3","repeats":1},{"count":194000,"lower_bound":"U3VwcGxpZXIjMDAwMTk0NTUw","upper_bound":"U3VwcGxpZXIjMDAwMTk1Nzgz","repeats":1},{"count":196000,"lower_bound":"U3VwcGxpZXIjMDAwMTk2NTE0","upper_bound":"U3VwcGxpZXIjMDAwMTk5NTUy","repeats":1},{"count":198000,"lower_bound":"U3VwcGxpZXIjMDAwMTk5Njc5","upper_bound":"U3VwcGxpZXIjMDAwMjAwMzA5","repeats":1},{"count":200000,"lower_bound":"U3VwcGxpZXIjMDAwMjAxMzM2","upper_bound":"U3VwcGxpZXIjMDAwMjAyNjg3","repeats":1},{"count":202000,"lower_bound":"U3VwcGxpZXIjMDAwMjAzNTU5","upper_bound":"U3VwcGxpZXIjMDAwMjAzNzE5","repeats":1},{"count":204000,"lower_bound":"U3VwcGxpZXIjMDAwMjA1MTA3","upper_bound":"U3VwcGxpZXIjMDAwMjA2MjIw","repeats":1},{"count":206000,"lower_bound":"U3VwcGxpZXIjMDAwMjA2NTc4","upper_bound":"U3VwcGxpZXIjMDAwMjA3MjEw","repeats":1},{"count":208000,"lower_bound":"U3VwcGxpZXIjMDAwMjA3NTg2","upper_bound":"U3VwcGxpZXIjMDAwMjA4MTI3","repeats":1},{"count":210000,"lower_bound":"U3VwcGxpZXIjMDAwMjA4MzM1","upper_bound":"U3VwcGxpZXIjMDAwMjA5OTAx","repeats":1},{"count":212000,"lower_bound":"U3VwcGxpZXIjMDAwMjEwMzIx","upper_bound":"U3VwcGxpZXIjMDAwMjEyNTIy","repeats":1},{"count":214000,"lower_bound":"U3VwcGxpZXIjMDAwMjEyNzk3","upper_bound":"U3VwcGxpZXIjMDAwMjE0Mzkx","repeats":1},{"count":216000,"lower_bound":"U3VwcGxpZXIjMDAwMjE1MDA1","upper_bound":"U3VwcGxpZXIjMDAwMjE3NTA5","repeats":1},{"count":218000,"lower_bound":"U3VwcGxpZXIjMDAwMjE4MTQ2","upper_bound":"U3VwcGxpZXIjMDAwMjIwMTM0","repeats":1},{"count":220000,"lower_bound":"U3VwcGxpZXIjMDAwMjIwMTk0","upper_bound":"U3VwcGxpZXIjMDAwMjIxNTMz","repeats":1},{"count":222000,"lower_bound":"U3VwcGxpZXIjMDAwMjIyNTYx","upper_bound":"U3VwcGxpZXIjMDAwMjI0MjMy","repeats":1},{"count":224000,"lower_bound":"U3VwcGxpZXIjMDAwMjI0NjQ3","upper_bound":"U3VwcGxpZXIjMDAwMjI2MTA5","repeats":1},{"count":226000,"lower_bound":"U3VwcGxpZXIjMDAwMjI2MjM0","upper_bound":"U3VwcGxpZXIjMDAwMjI4NzU1","repeats":1},{"count":228000,"lower_bound":"U3VwcGxpZXIjMDAwMjI5MzE3","upper_bound":"U3VwcGxpZXIjMDAwMjMwMTA3","repeats":1},{"count":230000,"lower_bound":"U3VwcGxpZXIjMDAwMjMwMTMw","upper_bound":"U3VwcGxpZXIjMDAwMjMwMzY3","repeats":1},{"count":232000,"lower_bound":"U3VwcGxpZXIjMDAwMjMwNDcz","upper_bound":"U3VwcGxpZXIjMDAwMjMxNzYx","repeats":1},{"count":234000,"lower_bound":"U3VwcGxpZXIjMDAwMjMxOTMw","upper_bound":"U3VwcGxpZXIjMDAwMjM1MDM0","repeats":1},{"count":236000,"lower_bound":"U3VwcGxpZXIjMDAwMjM1Mjg4","upper_bound":"U3VwcGxpZXIjMDAwMjM2ODg4","repeats":1},{"count":238000,"lower_bound":"U3VwcGxpZXIjMDAwMjM3ODk0","upper_bound":"U3VwcGxpZXIjMDAwMjQwNDY4","repeats":1},{"count":240000,"lower_bound":"U3VwcGxpZXIjMDAwMjQwNjk2","upper_bound":"U3VwcGxpZXIjMDAwMjQxNTA5","repeats":1},{"count":242000,"lower_bound":"U3VwcGxpZXIjMDAwMjQxOTE2","upper_bound":"U3VwcGxpZXIjMDAwMjQzODk1","repeats":1},{"count":244000,"lower_bound":"U3VwcGxpZXIjMDAwMjQzOTAz","upper_bound":"U3VwcGxpZXIjMDAwMjQ0NTU4","repeats":1},{"count":246000,"lower_bound":"U3VwcGxpZXIjMDAwMjQ0NTYx","upper_bound":"U3VwcGxpZXIjMDAwMjQ2MTEz","repeats":1},{"count":248000,"lower_bound":"U3VwcGxpZXIjMDAwMjQ2MTIy","upper_bound":"U3VwcGxpZXIjMDAwMjQ3NjU5","repeats":1},{"count":250000,"lower_bound":"U3VwcGxpZXIjMDAwMjQ4MDk5","upper_bound":"U3VwcGxpZXIjMDAwMjQ5MDYz","repeats":1},{"count":252000,"lower_bound":"U3VwcGxpZXIjMDAwMjQ5MDk4","upper_bound":"U3VwcGxpZXIjMDAwMjUwNjkw","repeats":1},{"count":254000,"lower_bound":"U3VwcGxpZXIjMDAwMjUxNDIy","upper_bound":"U3VwcGxpZXIjMDAwMjUzMDcw","repeats":1},{"count":256000,"lower_bound":"U3VwcGxpZXIjMDAwMjUzMzUy","upper_bound":"U3VwcGxpZXIjMDAwMjUzODEy","repeats":1},{"count":258000,"lower_bound":"U3VwcGxpZXIjMDAwMjU1MTMw","upper_bound":"U3VwcGxpZXIjMDAwMjU2MDIy","repeats":1},{"count":260000,"lower_bound":"U3VwcGxpZXIjMDAwMjU2MTU4","upper_bound":"U3VwcGxpZXIjMDAwMjU2NTYx","repeats":1},{"count":262000,"lower_bound":"U3VwcGxpZXIjMDAwMjU2NzE5","upper_bound":"U3VwcGxpZXIjMDAwMjU3MTgx","repeats":1},{"count":264000,"lower_bound":"U3VwcGxpZXIjMDAwMjU4MjUw","upper_bound":"U3VwcGxpZXIjMDAwMjU5NjYy","repeats":1},{"count":266000,"lower_bound":"U3VwcGxpZXIjMDAwMjYwMTAw","upper_bound":"U3VwcGxpZXIjMDAwMjYwNzMz","repeats":1},{"count":268000,"lower_bound":"U3VwcGxpZXIjMDAwMjYxMzI4","upper_bound":"U3VwcGxpZXIjMDAwMjYyNjcy","repeats":1},{"count":270000,"lower_bound":"U3VwcGxpZXIjMDAwMjYzNDQ3","upper_bound":"U3VwcGxpZXIjMDAwMjY0Mjkx","repeats":1},{"count":272000,"lower_bound":"U3VwcGxpZXIjMDAwMjY0NTA3","upper_bound":"U3VwcGxpZXIjMDAwMjY1NzM3","repeats":1},{"count":274000,"lower_bound":"U3VwcGxpZXIjMDAwMjY2NjA5","upper_bound":"U3VwcGxpZXIjMDAwMjY3NjA2","repeats":1},{"count":276000,"lower_bound":"U3VwcGxpZXIjMDAwMjY4MDA1","upper_bound":"U3VwcGxpZXIjMDAwMjY4NjE1","repeats":1},{"count":278000,"lower_bound":"U3VwcGxpZXIjMDAwMjY4Nzcw","upper_bound":"U3VwcGxpZXIjMDAwMjcwODIw","repeats":1},{"count":280000,"lower_bound":"U3VwcGxpZXIjMDAwMjcyNzE3","upper_bound":"U3VwcGxpZXIjMDAwMjczNzU4","repeats":1},{"count":282000,"lower_bound":"U3VwcGxpZXIjMDAwMjczOTIz","upper_bound":"U3VwcGxpZXIjMDAwMjc1NjEx","repeats":1},{"count":284000,"lower_bound":"U3VwcGxpZXIjMDAwMjc1NjQ3","upper_bound":"U3VwcGxpZXIjMDAwMjc3MTQw","repeats":1},{"count":286000,"lower_bound":"U3VwcGxpZXIjMDAwMjc4MTk0","upper_bound":"U3VwcGxpZXIjMDAwMjc5NTUy","repeats":1},{"count":288000,"lower_bound":"U3VwcGxpZXIjMDAwMjc5NTg4","upper_bound":"U3VwcGxpZXIjMDAwMjgxNDQy","repeats":1},{"count":290000,"lower_bound":"U3VwcGxpZXIjMDAwMjgxODAx","upper_bound":"U3VwcGxpZXIjMDAwMjg0MDM5","repeats":1},{"count":292000,"lower_bound":"U3VwcGxpZXIjMDAwMjg0Mzg2","upper_bound":"U3VwcGxpZXIjMDAwMjg1MTEy","repeats":1},{"count":294000,"lower_bound":"U3VwcGxpZXIjMDAwMjg1MTc2","upper_bound":"U3VwcGxpZXIjMDAwMjg2NTkz","repeats":1},{"count":296000,"lower_bound":"U3VwcGxpZXIjMDAwMjg4Njky","upper_bound":"U3VwcGxpZXIjMDAwMjkyMjI2","repeats":1},{"count":298000,"lower_bound":"U3VwcGxpZXIjMDAwMjkyNjk3","upper_bound":"U3VwcGxpZXIjMDAwMjk0MTI5","repeats":1},{"count":300000,"lower_bound":"U3VwcGxpZXIjMDAwMjk0NjQ5","upper_bound":"U3VwcGxpZXIjMDAwMjk0OTI3","repeats":1},{"count":302000,"lower_bound":"U3VwcGxpZXIjMDAwMjk1MDM5","upper_bound":"U3VwcGxpZXIjMDAwMjk2MTg0","repeats":1},{"count":304000,"lower_bound":"U3VwcGxpZXIjMDAwMjk2NjU2","upper_bound":"U3VwcGxpZXIjMDAwMjk3NTM5","repeats":1},{"count":306000,"lower_bound":"U3VwcGxpZXIjMDAwMjk3OTE2","upper_bound":"U3VwcGxpZXIjMDAwMzAwMzYy","repeats":1},{"count":308000,"lower_bound":"U3VwcGxpZXIjMDAwMzAwNDMw","upper_bound":"U3VwcGxpZXIjMDAwMzAxNzk3","repeats":1},{"count":310000,"lower_bound":"U3VwcGxpZXIjMDAwMzAyNDQ1","upper_bound":"U3VwcGxpZXIjMDAwMzAyODg2","repeats":1},{"count":312000,"lower_bound":"U3VwcGxpZXIjMDAwMzAzMjYx","upper_bound":"U3VwcGxpZXIjMDAwMzA0NzQ4","repeats":1},{"count":314000,"lower_bound":"U3VwcGxpZXIjMDAwMzA0Nzcx","upper_bound":"U3VwcGxpZXIjMDAwMzA3ODQ5","repeats":1},{"count":316000,"lower_bound":"U3VwcGxpZXIjMDAwMzA4NTI3","upper_bound":"U3VwcGxpZXIjMDAwMzEwMjA4","repeats":1},{"count":318000,"lower_bound":"U3VwcGxpZXIjMDAwMzEwNDgz","upper_bound":"U3VwcGxpZXIjMDAwMzEyMDg2","repeats":1},{"count":320000,"lower_bound":"U3VwcGxpZXIjMDAwMzEzMDM0","upper_bound":"U3VwcGxpZXIjMDAwMzE0MTg2","repeats":1},{"count":322000,"lower_bound":"U3VwcGxpZXIjMDAwMzE0MzQz","upper_bound":"U3VwcGxpZXIjMDAwMzE1MDgz","repeats":1},{"count":324000,"lower_bound":"U3VwcGxpZXIjMDAwMzE4NTQ5","upper_bound":"U3VwcGxpZXIjMDAwMzIwMDk4","repeats":1},{"count":326000,"lower_bound":"U3VwcGxpZXIjMDAwMzIwNzcz","upper_bound":"U3VwcGxpZXIjMDAwMzIxNTYx","repeats":1},{"count":328000,"lower_bound":"U3VwcGxpZXIjMDAwMzIxNjI2","upper_bound":"U3VwcGxpZXIjMDAwMzIyMTQx","repeats":1},{"count":330000,"lower_bound":"U3VwcGxpZXIjMDAwMzIyMTY1","upper_bound":"U3VwcGxpZXIjMDAwMzIzMjc4","repeats":1},{"count":332000,"lower_bound":"U3VwcGxpZXIjMDAwMzI0NjQ1","upper_bound":"U3VwcGxpZXIjMDAwMzI2MzQ4","repeats":1},{"count":334000,"lower_bound":"U3VwcGxpZXIjMDAwMzI4MzUx","upper_bound":"U3VwcGxpZXIjMDAwMzI4OTg3","repeats":1},{"count":336000,"lower_bound":"U3VwcGxpZXIjMDAwMzI5MTEw","upper_bound":"U3VwcGxpZXIjMDAwMzMwMTY4","repeats":1},{"count":338000,"lower_bound":"U3VwcGxpZXIjMDAwMzMwNjE4","upper_bound":"U3VwcGxpZXIjMDAwMzMyMTgy","repeats":1},{"count":340000,"lower_bound":"U3VwcGxpZXIjMDAwMzMzMDIx","upper_bound":"U3VwcGxpZXIjMDAwMzM0MjM4","repeats":1},{"count":342000,"lower_bound":"U3VwcGxpZXIjMDAwMzM0Mzg0","upper_bound":"U3VwcGxpZXIjMDAwMzM1NDYx","repeats":1},{"count":344000,"lower_bound":"U3VwcGxpZXIjMDAwMzM1NDk0","upper_bound":"U3VwcGxpZXIjMDAwMzQxMjk2","repeats":1},{"count":346000,"lower_bound":"U3VwcGxpZXIjMDAwMzQxNjU5","upper_bound":"U3VwcGxpZXIjMDAwMzQ0NDY1","repeats":1},{"count":348000,"lower_bound":"U3VwcGxpZXIjMDAwMzQ1NjM3","upper_bound":"U3VwcGxpZXIjMDAwMzQ3NTc2","repeats":1},{"count":350000,"lower_bound":"U3VwcGxpZXIjMDAwMzQ4MzAx","upper_bound":"U3VwcGxpZXIjMDAwMzQ5OTc1","repeats":1},{"count":352000,"lower_bound":"U3VwcGxpZXIjMDAwMzUwMjY0","upper_bound":"U3VwcGxpZXIjMDAwMzUxMTI0","repeats":1},{"count":354000,"lower_bound":"U3VwcGxpZXIjMDAwMzUxMzg1","upper_bound":"U3VwcGxpZXIjMDAwMzUyMDcw","repeats":1},{"count":356000,"lower_bound":"U3VwcGxpZXIjMDAwMzUyNzQ5","upper_bound":"U3VwcGxpZXIjMDAwMzU0NTMy","repeats":1},{"count":358000,"lower_bound":"U3VwcGxpZXIjMDAwMzU0Njgw","upper_bound":"U3VwcGxpZXIjMDAwMzU2MDI1","repeats":1},{"count":360000,"lower_bound":"U3VwcGxpZXIjMDAwMzU2MzYz","upper_bound":"U3VwcGxpZXIjMDAwMzU3Njkw","repeats":1},{"count":362000,"lower_bound":"U3VwcGxpZXIjMDAwMzU3NzMw","upper_bound":"U3VwcGxpZXIjMDAwMzU4NDMz","repeats":1},{"count":364000,"lower_bound":"U3VwcGxpZXIjMDAwMzU5NDYz","upper_bound":"U3VwcGxpZXIjMDAwMzYwNzgw","repeats":1},{"count":366000,"lower_bound":"U3VwcGxpZXIjMDAwMzYyNDY2","upper_bound":"U3VwcGxpZXIjMDAwMzY0ODQ0","repeats":1},{"count":368000,"lower_bound":"U3VwcGxpZXIjMDAwMzY1NjMy","upper_bound":"U3VwcGxpZXIjMDAwMzY4MjA5","repeats":1},{"count":370000,"lower_bound":"U3VwcGxpZXIjMDAwMzY4OTk3","upper_bound":"U3VwcGxpZXIjMDAwMzcwNDEz","repeats":1},{"count":372000,"lower_bound":"U3VwcGxpZXIjMDAwMzcwNzA1","upper_bound":"U3VwcGxpZXIjMDAwMzcxMTYz","repeats":1},{"count":374000,"lower_bound":"U3VwcGxpZXIjMDAwMzcxMjI2","upper_bound":"U3VwcGxpZXIjMDAwMzcyNTY4","repeats":1},{"count":376000,"lower_bound":"U3VwcGxpZXIjMDAwMzczMTUw","upper_bound":"U3VwcGxpZXIjMDAwMzc0ODg2","repeats":1},{"count":378000,"lower_bound":"U3VwcGxpZXIjMDAwMzc1MDY2","upper_bound":"U3VwcGxpZXIjMDAwMzc1NjQ3","repeats":1},{"count":380000,"lower_bound":"U3VwcGxpZXIjMDAwMzc1NzIx","upper_bound":"U3VwcGxpZXIjMDAwMzc2ODUx","repeats":1},{"count":382000,"lower_bound":"U3VwcGxpZXIjMDAwMzc3MTc4","upper_bound":"U3VwcGxpZXIjMDAwMzc5NDE4","repeats":1},{"count":384000,"lower_bound":"U3VwcGxpZXIjMDAwMzgwNzUy","upper_bound":"U3VwcGxpZXIjMDAwMzgyMjE4","repeats":1},{"count":386000,"lower_bound":"U3VwcGxpZXIjMDAwMzgzMDA0","upper_bound":"U3VwcGxpZXIjMDAwMzg1MzA3","repeats":1},{"count":388000,"lower_bound":"U3VwcGxpZXIjMDAwMzg1Njg1","upper_bound":"U3VwcGxpZXIjMDAwMzg2MzI0","repeats":1},{"count":390000,"lower_bound":"U3VwcGxpZXIjMDAwMzg3NTY0","upper_bound":"U3VwcGxpZXIjMDAwMzkxNDA4","repeats":1},{"count":392000,"lower_bound":"U3VwcGxpZXIjMDAwMzkxNDc4","upper_bound":"U3VwcGxpZXIjMDAwMzk0MjMx","repeats":1},{"count":394000,"lower_bound":"U3VwcGxpZXIjMDAwMzk0Mzk5","upper_bound":"U3VwcGxpZXIjMDAwMzk2NDQ3","repeats":1},{"count":396000,"lower_bound":"U3VwcGxpZXIjMDAwMzk3MDc1","upper_bound":"U3VwcGxpZXIjMDAwMzk5Mjg0","repeats":1},{"count":398000,"lower_bound":"U3VwcGxpZXIjMDAwMzk5MzAx","upper_bound":"U3VwcGxpZXIjMDAwNDAwMjgz","repeats":1},{"count":400000,"lower_bound":"U3VwcGxpZXIjMDAwNDAxOTg4","upper_bound":"U3VwcGxpZXIjMDAwNDAyNDk1","repeats":1},{"count":402000,"lower_bound":"U3VwcGxpZXIjMDAwNDAzNzU3","upper_bound":"U3VwcGxpZXIjMDAwNDA3NDcw","repeats":1},{"count":404000,"lower_bound":"U3VwcGxpZXIjMDAwNDA4NTY5","upper_bound":"U3VwcGxpZXIjMDAwNDEwMTky","repeats":1},{"count":406000,"lower_bound":"U3VwcGxpZXIjMDAwNDEwNDgz","upper_bound":"U3VwcGxpZXIjMDAwNDExMTQw","repeats":1},{"count":408000,"lower_bound":"U3VwcGxpZXIjMDAwNDExMTQx","upper_bound":"U3VwcGxpZXIjMDAwNDEyNjk2","repeats":1},{"count":410000,"lower_bound":"U3VwcGxpZXIjMDAwNDEzMjg0","upper_bound":"U3VwcGxpZXIjMDAwNDE1MDM1","repeats":1},{"count":412000,"lower_bound":"U3VwcGxpZXIjMDAwNDE2Mjc0","upper_bound":"U3VwcGxpZXIjMDAwNDE4MDk1","repeats":1},{"count":414000,"lower_bound":"U3VwcGxpZXIjMDAwNDE4MjE1","upper_bound":"U3VwcGxpZXIjMDAwNDE5NTU0","repeats":1},{"count":416000,"lower_bound":"U3VwcGxpZXIjMDAwNDE5NjUx","upper_bound":"U3VwcGxpZXIjMDAwNDIxMTc0","repeats":1},{"count":418000,"lower_bound":"U3VwcGxpZXIjMDAwNDIyMTcy","upper_bound":"U3VwcGxpZXIjMDAwNDIzMTYz","repeats":1},{"count":420000,"lower_bound":"U3VwcGxpZXIjMDAwNDIzNjgx","upper_bound":"U3VwcGxpZXIjMDAwNDI1NzU2","repeats":1},{"count":422000,"lower_bound":"U3VwcGxpZXIjMDAwNDI2NDEy","upper_bound":"U3VwcGxpZXIjMDAwNDI4MDgy","repeats":1},{"count":424000,"lower_bound":"U3VwcGxpZXIjMDAwNDI4NzM2","upper_bound":"U3VwcGxpZXIjMDAwNDMwMDMx","repeats":1},{"count":426000,"lower_bound":"U3VwcGxpZXIjMDAwNDMwNTU3","upper_bound":"U3VwcGxpZXIjMDAwNDMxNzcw","repeats":1},{"count":428000,"lower_bound":"U3VwcGxpZXIjMDAwNDMxODky","upper_bound":"U3VwcGxpZXIjMDAwNDMzMTM4","repeats":1},{"count":430000,"lower_bound":"U3VwcGxpZXIjMDAwNDMzOTEy","upper_bound":"U3VwcGxpZXIjMDAwNDM1MTE3","repeats":1},{"count":432000,"lower_bound":"U3VwcGxpZXIjMDAwNDM1MzM1","upper_bound":"U3VwcGxpZXIjMDAwNDM4MDI3","repeats":1},{"count":434000,"lower_bound":"U3VwcGxpZXIjMDAwNDM4Mzc5","upper_bound":"U3VwcGxpZXIjMDAwNDM5MTM0","repeats":1},{"count":436000,"lower_bound":"U3VwcGxpZXIjMDAwNDQwMTkw","upper_bound":"U3VwcGxpZXIjMDAwNDQwOTg0","repeats":1},{"count":438000,"lower_bound":"U3VwcGxpZXIjMDAwNDQxMDg5","upper_bound":"U3VwcGxpZXIjMDAwNDQ0NDA2","repeats":1},{"count":440000,"lower_bound":"U3VwcGxpZXIjMDAwNDQ0NTQ4","upper_bound":"U3VwcGxpZXIjMDAwNDQ1NTky","repeats":1},{"count":442000,"lower_bound":"U3VwcGxpZXIjMDAwNDQ1NjMy","upper_bound":"U3VwcGxpZXIjMDAwNDQ3NDcy","repeats":1},{"count":444000,"lower_bound":"U3VwcGxpZXIjMDAwNDQ3NTQ3","upper_bound":"U3VwcGxpZXIjMDAwNDQ4Mjc3","repeats":1},{"count":446000,"lower_bound":"U3VwcGxpZXIjMDAwNDQ4NzMw","upper_bound":"U3VwcGxpZXIjMDAwNDUwNDk2","repeats":1},{"count":448000,"lower_bound":"U3VwcGxpZXIjMDAwNDUwODEz","upper_bound":"U3VwcGxpZXIjMDAwNDUxNTUz","repeats":1},{"count":450000,"lower_bound":"U3VwcGxpZXIjMDAwNDUxNzY4","upper_bound":"U3VwcGxpZXIjMDAwNDUyODk3","repeats":1},{"count":452000,"lower_bound":"U3VwcGxpZXIjMDAwNDUzMTg5","upper_bound":"U3VwcGxpZXIjMDAwNDU1NDAx","repeats":1},{"count":454000,"lower_bound":"U3VwcGxpZXIjMDAwNDU2Njgx","upper_bound":"U3VwcGxpZXIjMDAwNDU4MDMz","repeats":1},{"count":456000,"lower_bound":"U3VwcGxpZXIjMDAwNDU4Mjc2","upper_bound":"U3VwcGxpZXIjMDAwNDYwMDcw","repeats":1},{"count":458000,"lower_bound":"U3VwcGxpZXIjMDAwNDYwNDc4","upper_bound":"U3VwcGxpZXIjMDAwNDYyODQ1","repeats":1},{"count":460000,"lower_bound":"U3VwcGxpZXIjMDAwNDYyOTA3","upper_bound":"U3VwcGxpZXIjMDAwNDYzNTg3","repeats":1},{"count":462000,"lower_bound":"U3VwcGxpZXIjMDAwNDY1NjAy","upper_bound":"U3VwcGxpZXIjMDAwNDY4NDI4","repeats":1},{"count":464000,"lower_bound":"U3VwcGxpZXIjMDAwNDY5MjAx","upper_bound":"U3VwcGxpZXIjMDAwNDY5OTk5","repeats":1},{"count":466000,"lower_bound":"U3VwcGxpZXIjMDAwNDcwMDIw","upper_bound":"U3VwcGxpZXIjMDAwNDcxMTc0","repeats":1},{"count":468000,"lower_bound":"U3VwcGxpZXIjMDAwNDcxMzUx","upper_bound":"U3VwcGxpZXIjMDAwNDcyNDkx","repeats":1},{"count":470000,"lower_bound":"U3VwcGxpZXIjMDAwNDczMjM2","upper_bound":"U3VwcGxpZXIjMDAwNDc1MzA0","repeats":1},{"count":472000,"lower_bound":"U3VwcGxpZXIjMDAwNDc1NjQw","upper_bound":"U3VwcGxpZXIjMDAwNDc3NDMz","repeats":1},{"count":474000,"lower_bound":"U3VwcGxpZXIjMDAwNDc3ODE0","upper_bound":"U3VwcGxpZXIjMDAwNDc5NjM0","repeats":1},{"count":476000,"lower_bound":"U3VwcGxpZXIjMDAwNDgwMzY1","upper_bound":"U3VwcGxpZXIjMDAwNDgxMTk5","repeats":1},{"count":478000,"lower_bound":"U3VwcGxpZXIjMDAwNDgxODQ2","upper_bound":"U3VwcGxpZXIjMDAwNDgyODY4","repeats":1},{"count":480000,"lower_bound":"U3VwcGxpZXIjMDAwNDgzMDAx","upper_bound":"U3VwcGxpZXIjMDAwNDgzNzM1","repeats":1},{"count":482000,"lower_bound":"U3VwcGxpZXIjMDAwNDgzODAx","upper_bound":"U3VwcGxpZXIjMDAwNDg0OTk4","repeats":1},{"count":484000,"lower_bound":"U3VwcGxpZXIjMDAwNDg1NTM1","upper_bound":"U3VwcGxpZXIjMDAwNDg2MzA0","repeats":1},{"count":486000,"lower_bound":"U3VwcGxpZXIjMDAwNDg2NDEz","upper_bound":"U3VwcGxpZXIjMDAwNDg4NTU0","repeats":1},{"count":488000,"lower_bound":"U3VwcGxpZXIjMDAwNDg5NDQ4","upper_bound":"U3VwcGxpZXIjMDAwNDg5NzYw","repeats":1},{"count":490000,"lower_bound":"U3VwcGxpZXIjMDAwNDg5ODA1","upper_bound":"U3VwcGxpZXIjMDAwNDkwMzE2","repeats":1},{"count":492000,"lower_bound":"U3VwcGxpZXIjMDAwNDkwNjk3","upper_bound":"U3VwcGxpZXIjMDAwNDk1MDA0","repeats":1},{"count":494000,"lower_bound":"U3VwcGxpZXIjMDAwNDk1MTE4","upper_bound":"U3VwcGxpZXIjMDAwNDk2ODE2","repeats":1},{"count":496000,"lower_bound":"U3VwcGxpZXIjMDAwNDk3NDQz","upper_bound":"U3VwcGxpZXIjMDAwNDk3OTkz","repeats":1},{"count":498000,"lower_bound":"U3VwcGxpZXIjMDAwNDk4MTg3","upper_bound":"U3VwcGxpZXIjMDAwNDk4NTM0","repeats":1},{"count":500000,"lower_bound":"U3VwcGxpZXIjMDAwNDk4OTkz","upper_bound":"U3VwcGxpZXIjMDAwNDk5Nzg4","repeats":1}]},"cm_sketch":{"rows":[{"counters":[237,236,243,226,224,231,238,234,233,250,247,243,255,255,260,234,235,244,232,244,248,226,214,257,250,243,262,242,255,248,262,262,246,223,231,264,229,235,236,243,226,258,262,216,266,259,256,255,226,248,245,217,240,252,251,240,273,221,260,221,250,248,277,237,257,250,251,239,232,241,266,234,250,235,234,211,218,271,240,238,248,232,285,243,233,234,231,227,235,259,228,236,239,244,264,246,255,254,253,247,240,249,231,236,236,264,242,251,241,239,227,238,257,251,255,268,256,264,225,234,254,239,259,213,264,209,283,242,217,260,236,238,249,261,223,259,226,232,251,254,230,263,254,250,236,241,243,263,201,230,229,270,249,250,230,235,242,251,230,245,221,269,243,237,251,280,271,254,220,256,249,222,236,272,238,244,255,234,269,223,232,225,274,279,265,271,267,219,260,248,237,228,242,246,259,251,196,249,248,241,238,254,231,290,253,219,254,243,261,252,260,246,222,266,243,268,252,246,238,240,225,248,272,228,238,252,241,223,248,214,234,286,252,244,262,235,253,246,240,251,212,263,245,260,256,233,238,222,253,270,250,275,254,202,250,269,243,244,225,240,228,237,267,264,263,232,246,247,249,241,219,234,258,230,249,245,243,254,253,239,227,215,228,240,255,214,234,231,258,220,265,265,241,251,249,261,225,237,258,284,252,262,252,252,212,242,244,254,268,228,266,221,261,253,240,242,234,268,222,245,249,255,265,238,203,230,258,244,269,255,253,238,268,228,261,259,238,251,231,252,239,253,224,217,235,246,227,231,243,273,213,266,220,237,238,247,242,244,248,264,265,259,230,257,236,225,225,228,270,251,228,253,250,228,230,242,223,248,227,231,274,230,245,237,255,196,270,238,258,222,248,259,257,242,261,237,250,237,246,245,248,288,237,239,225,275,255,236,243,246,255,245,233,280,269,233,231,248,222,241,245,235,209,241,228,241,229,231,248,239,268,264,241,268,255,244,232,231,221,184,252,217,223,227,229,243,244,239,271,249,229,243,257,250,234,252,228,242,236,253,216,256,240,215,254,247,240,273,261,263,262,249,261,238,230,228,254,244,234,265,226,252,237,259,240,218,231,240,256,240,243,218,232,238,247,237,249,217,265,264,247,218,278,231,221,248,263,255,248,234,262,242,243,247,228,255,247,247,258,264,232,240,240,247,245,223,239,241,238,234,222,247,236,250,258,233,231,232,211,254,258,247,246,255,244,270,235,249,225,262,224,218,253,254,272,258,244,237,267,261,225,261,239,227,256,252,235,243,247,242,249,232,236,235,249,226,253,244,263,254,257,229,238,234,269,233,256,253,246,265,258,274,254,277,229,236,218,229,260,241,264,246,252,233,225,225,273,243,255,245,251,212,243,254,215,257,271,234,210,228,223,229,233,270,268,244,248,254,230,231,225,259,247,251,232,239,250,275,209,231,269,262,230,248,244,213,239,246,245,262,251,251,226,242,217,231,246,235,236,271,240,252,264,253,259,217,253,235,233,253,223,249,251,248,260,270,222,237,259,238,272,240,244,278,249,242,274,240,222,256,228,264,255,257,259,235,258,255,235,241,222,246,234,226,273,256,256,267,266,243,257,240,246,236,220,214,225,268,236,281,234,256,246,199,236,243,257,254,273,245,242,241,250,256,250,223,241,241,269,249,277,240,255,239,243,241,245,272,217,234,230,232,229,217,243,250,244,228,240,274,232,258,224,271,260,229,266,237,253,233,248,243,257,251,253,252,238,269,215,282,216,221,222,264,244,254,276,217,248,230,241,234,214,214,246,274,230,232,257,235,228,238,262,259,245,254,250,212,244,245,231,259,223,231,244,245,270,253,239,244,242,226,240,236,262,220,257,246,222,217,230,248,269,260,242,256,242,230,245,262,231,252,244,215,231,247,235,249,242,250,256,231,234,229,256,231,257,215,256,240,260,240,240,234,227,227,256,251,237,259,234,242,248,243,215,249,258,235,239,209,247,244,251,230,273,244,212,217,233,245,291,253,250,231,259,267,241,237,242,247,241,247,239,212,242,251,249,231,232,243,268,240,229,262,256,235,238,253,268,240,271,251,262,241,229,238,271,251,241,238,239,239,264,246,241,223,266,257,231,216,238,238,274,271,223,254,229,253,226,225,243,231,248,238,259,234,225,232,218,235,234,238,237,252,257,237,261,256,257,253,242,254,259,232,278,240,262,257,246,284,224,246,228,259,241,213,263,262,237,254,244,247,249,246,241,248,229,269,279,224,241,269,246,245,281,239,226,257,244,256,217,251,261,237,218,230,214,220,252,241,237,235,288,247,229,250,249,245,253,238,250,228,254,251,242,249,247,257,248,234,230,235,236,232,258,248,239,235,290,258,231,237,240,238,253,231,241,245,207,266,250,244,227,241,222,238,250,256,228,218,249,241,260,220,239,259,248,208,275,258,242,268,245,223,237,246,242,243,237,246,232,241,248,235,221,244,275,255,253,263,249,250,266,275,224,246,262,224,224,249,261,242,249,248,258,259,244,255,244,252,241,231,256,247,239,242,222,209,222,251,257,247,239,255,245,245,242,240,241,228,265,272,270,234,226,233,244,230,268,251,240,270,248,243,237,247,221,234,246,259,251,247,245,245,255,254,243,260,216,247,237,249,248,227,245,225,237,233,242,273,290,229,247,247,246,245,278,252,269,249,226,227,232,256,242,228,250,237,232,224,251,251,221,225,247,228,232,268,221,272,260,262,227,258,256,230,222,201,230,241,242,224,253,266,258,240,242,264,263,222,251,258,225,262,230,235,245,227,260,233,214,243,230,232,225,255,241,242,254,230,262,253,241,250,249,259,230,228,248,238,242,260,272,271,256,250,253,204,235,258,247,266,227,249,221,254,237,222,226,250,216,239,241,253,254,253,258,261,216,214,241,233,240,245,242,232,224,249,251,251,212,223,235,267,234,235,252,244,258,224,225,242,245,244,216,269,258,225,236,236,220,252,223,248,269,246,271,241,245,251,252,248,254,229,243,238,231,255,248,239,224,261,249,230,238,240,235,237,222,252,235,215,244,262,212,268,228,226,230,246,226,242,234,243,234,254,243,216,266,245,216,236,247,266,224,246,261,230,248,253,229,252,223,238,251,245,268,256,215,241,255,258,251,253,257,233,239,235,227,274,272,215,222,233,230,257,248,242,254,233,261,279,246,237,242,248,229,213,292,250,250,265,240,246,230,229,248,222,236,244,267,276,255,233,247,237,227,263,233,258,252,248,244,221,238,252,226,235,240,258,270,242,266,266,235,272,247,248,282,238,251,259,232,223,241,218,212,271,225,223,237,260,253,257,218,221,267,243,250,241,229,239,277,283,235,276,224,263,246,255,256,247,239,250,221,226,224,221,237,227,231,224,244,229,222,249,226,258,221,226,265,245,226,222,261,249,229,245,249,226,261,245,231,254,243,247,236,252,263,268,242,233,255,240,277,231,229,246,254,257,248,260,243,254,236,228,243,224,256,251,212,230,245,260,257,241,239,270,280,270,243,246,240,263,283,237,254,247,226,223,272,238,243,257,230,263,249,228,236,245,257,229,247,209,242,263,246,247,260,250,240,229,245,238,243,245,236,278,239,254,235,259,203,248,235,229,244,229,266,216,230,229,238,256,238,223,249,260,250,239,228,235,228,247,267,219,255,242,248,238,252,207,234,243,247,249,265,251,271,229,251,234,225,250,267,252,250,242,269,263,212,240,247,259,269,249,233,242,268,241,256,234,234,229,231,243,243,240,252,259,221,238,247,256,235,228,259,237,242,237,257,227,253,265,294,250,268,258,232,247,243,267,277,262,275,230,259,255,239,227,276,284,255,237,229,268,267,238,222,244,225,230,237,231,265,226,259,251,218,262,222,255,241,243,239,242,251,223,244,259,256,226,244,277,260,268,230,231,274,239,231,260,246,240,278,273,267,250,250,227,259,239,242,225,247,248,246,232,242,248,225,263,244,243,250,232,232,234,251,201,255,256,233,263,257,261,255,235,240,259,253,268,250,258,233,230,244,262,216,234,219,237,230,266,231,277,217,246,238,243,247,255,235,198,252,235,255,255,227,241,225,225,230,229,274,238,243,253,218,269,208,246,240,255,240,234,268,259,246,233,253,263,234,248,233,227,261,273,230,279,254,233,255,245,256,254,236,247,265,224,234,232,215,260,239,256,225,249,243,280,293,215,279,242,237,233,213,226,247,228,256,240,250,245,251,239,248,237,236,210,254,236,250,236,249,283,254,256,220,242,228,276,249,252,249,249,252,246,241,258,240,245,238,233,230,239,233,254,254,226,263,233,293,228,273,249,239,252,230,211,266,259,250,251,248,219,257,272,246,230,242,240,231,227,235,240,232,225,254,227,207,248,238,268,253,247,259,244,246,216,269,212,249,243,250,256,225,244,268,224,225,214,242,254,271,262,248,220,268,229,249,242,248,227,264,238,249,262,246,256,234,259,227,254,268,228,236,261,242,248,231,234,240,238,236,247,259,249,255,258,260,241,225,247,263,255,226,275,225,268,254,223,267,228,251,228,256,246,238,257,244,259,262,260,257,247,214,233,255,264,242,240,263,230,245,265,237,241,236,268,249,249,200,242,226,237,243,229]},{"counters":[223,247,265,240,227,218,220,229,247,248,260,233,249,239,234,239,237,247,245,247,235,239,227,207,261,243,229,247,233,234,260,263,231,277,238,255,233,224,243,266,248,256,240,258,284,249,256,258,225,230,216,256,243,255,233,225,240,258,229,242,246,248,260,241,253,229,259,241,240,245,282,256,239,223,237,248,235,244,250,239,257,251,256,238,255,238,255,235,218,249,247,235,247,224,259,232,233,211,287,251,247,230,245,253,235,222,256,250,263,233,261,259,251,264,253,250,241,240,241,237,242,246,249,222,233,233,269,233,203,224,251,203,260,248,241,262,237,234,230,230,242,243,223,243,247,278,237,205,257,220,244,236,233,244,263,245,259,269,273,266,245,222,266,238,254,213,248,218,225,248,281,247,243,259,235,253,217,243,235,259,219,237,263,247,252,223,243,231,256,229,248,243,242,223,242,249,241,260,238,251,246,239,253,238,221,258,229,273,223,281,261,229,270,253,246,243,246,265,232,263,266,252,235,236,255,252,237,277,237,253,253,238,216,250,264,280,238,226,225,252,262,259,237,250,252,243,251,228,249,255,253,252,269,200,256,252,197,249,251,240,230,253,271,219,236,259,273,260,258,265,237,230,244,237,245,232,240,236,253,247,264,232,236,227,255,231,222,235,251,241,224,238,229,247,248,246,241,235,219,219,235,225,256,257,233,235,264,238,243,254,236,272,261,224,244,245,253,212,259,264,231,219,289,224,257,221,251,257,243,250,270,250,232,247,250,258,246,250,247,230,269,253,258,264,257,230,228,240,232,249,264,246,257,218,232,229,224,253,231,243,258,218,240,232,221,246,233,232,231,238,249,252,245,273,234,243,232,270,239,297,255,222,242,251,238,233,231,261,253,275,263,241,245,280,236,243,244,235,242,280,272,247,273,226,251,244,219,253,253,227,253,242,246,246,244,233,234,260,270,238,265,233,261,250,232,252,270,247,255,236,246,266,237,217,222,242,253,252,256,260,218,258,245,266,243,231,262,236,240,247,234,240,257,219,234,240,231,251,261,238,238,224,271,250,277,238,233,246,241,226,250,262,254,283,277,276,238,232,229,256,234,230,238,247,240,246,247,207,267,235,257,242,240,222,246,248,218,253,258,218,246,231,252,265,242,250,259,251,239,241,241,275,254,238,243,243,251,239,261,228,277,262,239,259,236,236,237,284,253,249,251,267,264,246,243,235,239,240,227,246,246,274,258,226,241,238,258,267,228,252,259,253,242,245,254,237,231,253,231,232,227,281,250,252,255,230,255,257,234,250,271,273,245,239,267,260,236,241,230,276,247,211,266,255,209,252,258,239,254,233,221,229,237,256,295,224,245,237,258,254,256,236,279,258,236,232,250,265,223,262,270,250,259,242,266,270,271,262,252,234,236,246,243,256,243,220,246,234,274,269,266,256,219,222,280,237,221,231,240,229,251,241,222,230,260,253,250,239,250,245,227,219,249,277,250,252,262,248,265,229,225,231,260,247,235,262,242,257,247,234,262,219,212,225,256,230,224,249,262,236,238,231,239,233,258,227,253,227,224,252,256,248,220,230,242,250,272,251,261,263,214,253,260,273,226,250,264,234,231,237,252,249,230,236,247,240,247,243,256,242,261,256,233,264,224,252,251,254,224,246,258,227,240,238,228,249,212,221,227,272,256,234,246,272,239,257,219,230,236,247,265,262,258,242,221,226,254,272,265,237,228,240,259,226,249,228,249,226,243,254,262,234,264,228,241,270,225,263,258,243,225,221,246,253,251,225,243,238,231,259,264,238,261,250,232,237,232,282,250,234,255,252,251,195,237,266,245,240,249,271,231,246,227,235,237,240,244,209,244,261,221,234,251,241,213,234,251,245,210,259,247,247,245,265,248,249,244,239,246,224,233,239,238,264,229,246,238,225,227,251,257,240,239,229,236,266,255,232,221,238,263,253,252,226,232,250,249,288,246,216,211,239,243,243,231,267,242,225,252,250,266,230,243,259,239,250,284,240,264,241,239,231,221,225,246,236,224,274,243,243,248,256,225,232,229,255,234,235,228,247,232,240,253,253,234,277,262,244,243,252,240,244,237,232,227,235,230,251,231,262,228,271,247,234,207,249,226,254,237,222,240,249,248,256,249,252,257,261,259,204,246,239,239,243,221,243,220,252,231,250,259,253,245,218,248,226,227,225,233,244,239,262,240,237,271,209,251,237,242,243,247,242,237,240,215,236,253,233,227,217,232,250,251,239,256,241,237,233,238,260,243,244,212,228,236,235,234,258,233,230,253,286,239,266,249,265,241,245,221,230,257,235,249,285,224,240,232,235,250,251,211,256,240,226,238,222,236,251,241,263,240,226,264,242,255,222,243,232,263,258,249,241,236,231,251,256,249,269,206,205,235,227,225,231,255,230,224,265,231,262,233,245,214,251,259,244,240,244,254,234,269,235,231,248,263,249,233,266,265,264,256,225,251,228,238,238,246,243,273,256,251,231,243,260,291,250,245,252,260,232,248,233,250,220,222,223,219,239,240,226,235,262,265,265,209,205,256,223,260,249,264,241,261,252,247,234,236,265,253,241,230,239,229,258,255,270,261,243,270,272,235,228,213,242,232,249,243,233,263,233,243,257,252,231,269,259,275,246,251,234,222,233,256,235,234,256,256,248,219,230,235,235,222,280,253,220,251,238,253,232,233,250,275,236,246,239,255,279,220,245,237,219,265,208,230,222,249,224,237,228,261,246,254,231,258,250,251,237,254,242,242,241,236,233,224,253,244,270,273,262,226,222,248,230,254,252,223,217,233,241,257,281,231,244,245,238,240,228,233,239,238,235,255,250,256,249,241,192,216,240,265,247,262,254,269,263,228,234,245,221,243,255,253,266,259,233,235,236,242,251,246,266,218,248,226,243,257,234,261,229,238,251,223,236,237,263,246,260,268,247,255,258,243,223,250,256,260,247,237,237,264,244,252,244,251,236,279,258,251,246,258,228,236,269,236,238,242,250,269,215,231,275,243,242,260,231,275,244,259,255,245,235,269,268,235,275,245,207,260,227,233,223,237,264,254,232,232,234,255,243,268,239,239,246,246,247,222,263,239,246,248,264,245,242,230,208,231,249,243,223,240,243,233,239,247,209,234,226,269,263,241,229,258,264,237,236,231,260,259,237,246,248,201,240,253,252,247,204,237,257,231,250,247,234,261,238,237,236,244,268,260,249,243,227,233,266,260,231,238,254,230,239,225,257,264,225,255,261,249,242,221,258,250,220,245,251,249,289,208,276,242,240,246,254,228,238,245,246,270,241,249,240,233,276,241,247,260,239,242,216,229,224,244,253,249,253,242,263,245,260,234,199,213,274,254,246,234,231,229,248,254,257,234,236,234,233,271,231,247,254,262,234,249,226,255,236,239,242,246,263,263,224,234,215,257,280,274,232,244,252,259,270,252,257,240,205,227,253,252,260,254,233,221,239,264,252,233,230,235,235,235,243,225,239,262,261,243,251,224,245,240,257,250,218,247,256,222,220,248,231,252,250,278,237,234,225,275,254,233,231,251,256,221,257,223,247,227,235,233,213,244,246,279,225,233,261,240,222,255,263,240,255,281,252,234,268,261,267,266,231,253,247,242,216,240,256,249,224,229,272,234,240,210,232,247,234,249,240,227,257,236,240,259,251,253,233,240,241,230,252,234,230,257,253,266,227,221,251,248,258,243,226,224,242,245,251,239,241,254,214,247,230,218,225,257,223,230,243,238,260,236,235,233,255,235,241,234,224,245,230,254,246,295,262,234,271,209,218,249,264,269,248,218,245,223,241,256,248,253,238,246,266,245,238,244,256,226,245,239,265,266,225,245,272,244,224,273,250,224,243,238,240,246,255,226,254,267,228,239,257,223,240,251,247,250,263,248,255,238,262,236,231,250,270,206,243,268,219,256,222,238,244,232,233,260,225,224,242,241,217,225,235,243,236,220,262,217,252,225,235,246,211,252,234,262,262,250,240,265,255,227,230,231,230,241,241,229,260,237,230,267,228,229,247,246,266,230,231,242,250,256,251,235,238,235,244,239,246,244,255,226,261,223,262,248,248,248,229,233,249,246,258,263,234,242,242,222,246,247,250,260,275,247,253,219,249,262,240,230,227,249,229,265,234,260,214,236,234,256,265,267,212,240,247,232,283,228,246,280,224,237,267,257,239,233,224,217,239,239,247,222,234,236,242,246,243,237,229,274,259,244,262,248,223,253,257,238,226,240,246,257,225,256,268,246,236,262,221,245,266,246,247,238,243,245,248,227,249,221,268,247,234,254,221,247,282,276,268,278,230,259,226,225,245,261,264,261,256,227,249,259,235,246,255,265,239,218,231,256,246,261,231,250,245,269,251,229,223,236,233,239,245,244,215,236,260,242,279,248,235,252,273,245,245,283,267,275,213,240,249,272,227,260,278,233,241,253,272,249,232,249,254,242,247,235,230,229,244,244,224,237,283,224,255,232,226,241,265,253,241,253,242,277,236,248,221,268,256,218,250,269,223,248,215,253,259,229,209,255,249,226,233,228,252,241,266,252,264,277,247,212,251,237,246,265,245,252,241,254,254,267,248,233,258,256,234,223,237,223,219,252,248,292,255,230,256,236,255]},{"counters":[257,248,221,224,273,230,258,240,230,256,243,244,237,256,235,253,250,216,242,280,219,235,237,237,229,273,246,281,230,270,261,271,220,231,244,269,230,242,239,261,251,225,244,247,238,245,238,211,227,226,253,237,248,213,241,259,211,218,235,247,244,270,245,242,271,248,258,259,228,251,231,239,248,245,232,228,239,262,214,248,236,244,220,278,247,237,272,232,243,265,268,227,222,243,253,242,275,213,246,222,242,240,258,226,233,263,265,247,239,254,244,211,236,233,233,252,239,245,216,251,228,243,257,221,249,249,273,246,242,257,219,231,213,255,249,221,244,263,268,266,227,253,250,288,261,242,232,257,221,246,263,264,279,232,232,258,268,260,268,208,251,260,224,266,232,237,256,282,242,258,227,275,239,238,244,220,261,260,251,235,236,247,246,255,252,230,256,225,232,239,246,239,246,258,228,218,236,243,230,250,267,238,235,259,253,250,228,262,229,240,228,251,263,225,234,252,222,262,257,242,257,227,248,227,238,259,259,241,244,247,218,266,271,270,227,259,249,231,214,253,243,257,243,244,222,219,277,244,222,276,246,254,237,242,231,247,268,235,259,238,221,269,268,241,230,233,243,225,224,224,242,240,239,231,234,225,246,255,233,255,258,262,251,229,253,247,253,225,214,249,250,226,240,226,268,247,240,242,246,213,233,264,208,242,261,234,252,254,218,246,251,254,236,239,240,230,252,253,229,255,234,233,230,237,240,233,236,240,265,243,240,242,219,263,218,248,246,263,247,237,206,206,253,221,238,235,242,235,248,248,255,267,231,236,253,246,239,215,231,228,236,222,256,256,237,218,215,244,235,253,229,229,245,245,247,218,229,247,223,258,236,226,245,259,263,236,241,250,247,270,242,202,223,242,222,225,280,269,259,214,235,241,233,243,226,260,270,257,243,251,265,249,269,228,262,239,236,230,214,248,222,269,250,214,243,254,244,255,249,243,254,221,251,246,244,235,227,249,263,270,239,254,240,249,261,254,279,228,253,244,266,239,213,252,227,250,237,257,239,244,248,256,263,228,249,242,242,256,236,246,236,254,225,228,237,199,224,251,251,217,238,246,228,243,203,257,235,221,251,217,243,237,243,223,259,252,228,226,240,212,229,244,275,271,272,255,261,246,241,237,266,213,244,266,252,248,241,232,264,232,227,251,247,258,259,236,262,238,281,258,245,262,253,278,251,240,249,204,246,275,228,260,226,267,257,242,247,254,239,241,256,216,257,264,249,255,234,264,251,243,232,252,247,236,241,253,242,285,248,242,248,234,232,251,272,262,220,224,237,217,241,263,223,248,251,244,242,242,252,274,246,240,252,252,229,251,250,246,232,239,237,221,222,258,229,271,266,237,260,236,253,262,245,238,250,225,239,255,223,265,246,250,247,241,243,225,247,244,236,257,241,227,260,241,253,264,251,230,262,222,246,244,249,234,241,232,237,230,234,253,230,214,271,237,246,234,266,237,248,256,239,242,266,256,254,227,255,243,254,234,225,219,227,251,233,265,247,233,245,247,233,261,243,239,206,252,230,262,267,263,229,232,233,239,252,245,253,259,256,242,243,219,254,237,269,245,232,272,231,228,283,245,259,262,263,247,258,240,229,249,246,261,230,252,226,242,249,232,263,243,225,271,259,256,276,255,239,264,232,234,239,226,232,234,255,238,262,265,249,261,257,250,229,247,261,247,271,235,224,225,256,233,242,250,222,249,240,252,234,247,226,242,242,275,259,210,239,236,250,234,231,239,219,229,258,222,252,227,249,242,274,240,233,250,231,265,243,229,262,243,221,256,249,238,223,225,242,242,234,242,247,272,276,248,213,251,258,232,239,247,246,238,240,261,280,244,244,251,246,235,248,232,240,231,266,226,266,246,277,252,256,248,233,231,237,286,242,260,258,215,258,236,234,247,239,236,266,239,231,246,269,235,252,236,247,255,236,263,252,262,241,226,220,238,259,234,248,244,254,232,218,247,251,223,247,233,241,256,227,250,237,246,240,233,233,246,252,269,248,239,227,258,246,246,227,225,266,255,235,237,257,256,232,241,246,237,263,230,276,224,245,215,231,232,255,241,256,255,221,251,240,211,263,250,229,247,229,263,248,219,235,247,264,214,253,231,247,251,223,241,239,274,234,221,242,268,233,269,256,233,260,250,248,225,220,234,258,250,256,261,268,219,248,225,243,238,225,251,237,262,253,233,238,237,259,236,229,232,236,255,233,230,201,243,244,256,220,242,252,242,242,243,246,210,251,254,245,221,242,236,224,249,255,248,239,235,240,251,233,231,246,245,254,240,241,250,246,240,242,266,242,249,268,262,248,242,243,241,235,238,254,257,255,241,254,243,236,273,253,223,261,239,274,266,248,270,249,222,257,267,228,238,264,260,243,255,248,249,244,230,264,227,255,241,240,227,233,265,253,261,224,237,253,212,240,229,244,248,215,237,250,222,242,243,250,242,239,235,251,244,236,242,249,257,232,238,224,249,234,255,222,261,255,254,217,245,249,276,259,262,245,258,250,260,233,231,253,251,241,261,222,257,249,262,262,220,241,220,258,224,251,250,255,245,259,222,229,275,241,246,231,245,251,273,234,235,233,227,257,249,251,243,270,271,231,231,250,253,229,244,260,231,249,258,223,275,245,286,257,246,248,227,280,225,225,242,244,222,219,232,261,246,264,201,256,237,225,273,257,236,247,254,232,250,232,234,264,283,237,223,256,285,274,228,260,232,248,204,249,234,236,249,234,234,254,269,262,264,228,271,258,243,246,248,230,226,257,238,236,234,253,271,235,229,250,265,245,245,252,256,224,249,254,248,254,258,239,240,259,233,262,258,262,243,289,240,215,244,224,212,238,237,256,252,236,237,252,257,236,262,238,251,255,214,254,260,235,239,257,224,249,245,256,268,243,237,255,245,247,263,231,253,245,247,230,254,224,242,236,246,245,248,268,239,255,235,264,253,248,233,245,252,244,269,248,229,235,264,241,225,232,237,250,266,233,265,229,256,255,269,225,241,228,243,225,244,271,250,264,247,273,222,224,241,252,247,280,263,232,272,244,245,255,250,253,232,240,260,243,222,253,247,235,246,233,244,245,225,220,255,230,232,267,240,243,253,251,248,248,246,248,225,254,222,236,228,243,226,251,233,255,252,236,263,276,240,244,228,255,254,267,250,261,230,266,249,257,247,228,230,242,238,252,222,240,237,254,248,240,234,225,276,231,249,275,258,233,261,232,236,277,242,248,252,271,222,239,237,264,233,251,259,247,239,229,260,260,251,233,249,239,261,265,218,237,266,230,255,237,230,244,254,250,258,274,232,265,259,244,231,269,254,232,237,236,263,226,250,277,255,244,258,227,240,253,270,237,251,272,260,260,245,218,254,250,226,233,242,229,255,270,234,252,236,243,243,228,227,246,236,266,264,216,253,256,230,273,250,254,220,231,262,240,252,222,255,229,232,265,258,246,266,271,244,226,271,261,272,256,238,243,275,243,237,246,241,237,243,244,254,226,256,239,249,255,253,239,246,255,237,215,216,236,263,240,229,212,213,256,251,227,238,262,244,247,225,222,276,273,269,245,248,245,243,239,278,266,249,221,224,237,276,225,252,242,246,268,259,264,235,267,231,238,239,220,230,245,226,250,247,255,239,271,249,224,236,253,253,214,211,247,225,244,244,272,227,242,239,243,259,251,255,260,232,241,247,235,263,226,252,220,240,258,220,256,288,255,238,251,239,244,229,259,258,235,261,228,261,252,248,252,234,272,244,215,209,226,242,254,258,230,254,273,233,236,232,277,222,244,233,249,252,231,254,232,232,236,261,265,243,230,233,272,282,237,201,244,271,235,250,227,228,242,237,273,229,215,254,270,238,250,287,254,249,240,250,254,248,250,252,241,237,230,245,266,232,239,223,240,254,217,243,272,230,253,263,248,251,220,257,239,250,228,247,253,248,258,240,238,221,239,260,239,222,238,253,255,245,229,212,253,233,230,265,253,232,268,237,252,248,231,224,240,241,223,244,252,233,247,229,263,237,260,249,222,228,251,237,241,248,209,235,205,252,244,254,251,253,241,234,248,237,244,215,226,251,244,243,222,258,232,245,230,239,237,247,256,249,247,225,248,261,265,257,260,234,254,243,266,238,273,258,248,256,241,237,240,262,253,245,220,240,216,231,243,282,237,250,240,227,214,248,234,277,247,250,228,243,247,241,226,242,220,232,232,249,226,243,253,243,240,291,263,229,265,212,212,257,225,249,229,209,258,247,236,235,239,221,254,224,260,228,267,241,236,267,217,256,260,243,228,224,236,246,231,244,263,226,245,262,242,218,229,241,262,252,259,263,242,214,247,271,274,221,254,244,249,254,221,246,248,259,255,253,211,264,255,230,244,233,250,238,248,231,259,248,266,254,225,231,226,254,239,222,235,230,231,250,276,236,245,243,245,245,242,234,246,244,244,247,254,242,264,244,260,237,238,274,235,224,233,236,263,249,225,238,234,248,240,242,269,267,267,222,216,225,246,237,228,245,241,248,266,225,249,213,240,283,239,237,260,213,243,211,242,222,244,239,237,236,262,227,237,252,235,239,211,251,269,252,227,251,184,262,252,250,258,249]},{"counters":[238,242,239,248,239,239,242,231,273,267,242,242,233,251,260,220,256,248,233,250,231,200,261,210,237,235,234,231,252,221,260,206,240,252,255,243,274,272,253,253,230,232,265,257,247,232,235,243,238,229,235,228,260,236,250,256,289,220,244,224,245,245,254,222,259,234,226,231,247,234,227,242,241,254,232,267,262,253,277,260,237,251,243,250,252,252,239,249,208,236,221,204,222,257,241,275,239,229,238,267,244,233,259,243,206,237,239,261,253,248,215,221,221,233,226,227,234,263,255,243,253,251,269,242,269,254,243,254,223,239,269,230,230,220,232,235,249,216,250,265,241,247,242,233,243,237,258,255,231,246,252,244,233,232,268,243,263,273,246,268,261,237,222,234,228,265,256,223,249,224,244,229,236,231,212,246,250,227,249,244,252,275,243,214,247,220,215,252,259,240,258,204,250,252,228,259,239,262,220,226,256,231,244,260,247,236,248,238,266,257,235,228,270,247,201,242,252,244,256,250,258,242,258,244,252,260,250,228,248,228,206,242,245,249,226,244,255,251,243,232,222,249,228,252,222,248,258,249,235,244,261,220,255,223,240,240,258,259,274,250,232,265,255,252,232,224,243,252,219,241,238,239,256,245,240,234,237,250,225,258,269,229,245,231,255,241,263,229,264,258,252,257,232,230,258,252,246,238,253,253,254,226,236,275,236,257,250,235,245,252,251,218,243,243,226,209,240,238,225,265,238,256,246,244,255,227,231,215,253,249,230,260,221,264,234,233,257,210,244,241,233,250,229,251,248,254,255,254,254,239,233,214,267,245,246,250,225,255,251,256,239,261,266,247,241,263,237,245,253,239,241,237,258,257,257,256,235,211,267,237,242,254,265,244,220,240,218,250,258,248,259,233,217,227,227,241,232,245,277,233,243,216,232,248,283,240,223,228,221,245,252,231,257,245,245,252,250,257,242,233,256,257,249,225,251,217,251,236,254,216,247,272,237,241,252,222,252,235,243,232,255,244,250,255,245,249,242,241,239,254,257,242,234,217,226,262,243,254,241,237,247,225,248,269,234,237,243,260,264,265,269,255,244,277,250,248,204,236,253,232,251,226,232,254,235,256,261,249,216,259,213,216,245,239,233,239,230,257,224,223,254,260,281,227,256,263,233,227,246,248,244,262,261,234,215,237,256,261,240,252,237,244,245,208,236,253,238,256,264,232,250,234,251,284,227,247,249,248,238,237,230,246,264,246,238,238,247,257,216,231,264,266,239,246,226,227,274,267,262,247,231,234,244,251,244,239,259,248,246,232,214,234,229,233,230,237,244,220,244,203,274,240,242,274,228,269,242,255,256,252,243,265,243,236,231,246,256,263,252,248,244,258,224,230,248,235,264,235,264,263,261,241,228,207,246,252,241,255,241,273,243,249,251,222,258,236,249,253,218,253,278,258,248,223,241,235,231,252,240,231,230,239,239,260,240,252,238,231,264,242,260,246,260,235,243,238,223,242,222,263,265,245,240,233,243,225,236,240,220,234,248,242,231,261,245,227,247,237,252,230,254,273,239,230,249,209,269,228,229,250,239,255,239,222,225,251,238,281,239,236,251,254,266,225,268,232,265,240,259,222,249,246,240,244,288,277,235,210,244,237,234,246,264,275,236,249,230,199,233,264,260,233,247,283,234,278,238,263,258,256,222,240,259,241,267,224,234,262,257,270,264,234,267,244,230,261,247,257,257,243,224,217,234,236,267,254,222,267,246,212,250,252,257,254,215,253,240,239,249,237,206,253,241,278,238,255,263,240,244,248,241,224,259,254,225,240,251,216,246,230,259,259,246,251,244,259,257,245,244,242,240,240,257,260,246,216,245,246,243,219,251,252,279,234,256,214,248,246,250,238,233,227,250,260,226,203,277,260,260,239,240,247,220,278,249,244,260,275,242,227,251,235,259,221,261,235,219,255,221,253,219,248,250,224,257,226,236,247,248,258,244,253,258,230,219,257,244,242,240,221,226,264,236,261,253,233,253,236,244,254,233,243,257,243,210,260,233,237,240,246,258,233,225,255,217,263,221,250,247,229,223,250,276,237,275,255,225,250,204,264,234,229,257,235,247,216,277,254,259,264,233,202,240,226,241,240,245,238,240,275,215,248,265,227,223,247,233,238,248,251,243,243,260,261,232,236,257,253,228,236,235,249,242,256,254,244,262,260,233,234,250,270,253,235,245,241,247,267,263,231,219,212,253,216,254,267,232,237,235,222,232,235,242,224,221,266,260,276,246,267,248,244,262,232,240,262,246,233,253,235,207,232,231,245,224,239,260,232,267,213,253,244,230,252,256,228,252,266,233,252,254,198,236,233,203,242,267,224,232,253,252,243,243,265,267,257,252,258,255,274,228,227,259,221,217,242,260,239,229,240,269,276,275,246,255,247,236,212,241,229,237,244,258,250,221,249,219,247,217,244,225,275,244,260,262,239,247,239,254,278,262,239,219,266,238,261,238,235,240,257,251,255,259,228,253,257,236,230,234,259,283,271,241,241,237,272,260,240,206,256,225,218,254,254,241,248,238,248,238,253,274,248,248,219,230,238,259,235,243,245,217,239,250,262,259,251,241,224,233,267,238,242,265,233,230,237,244,248,252,241,252,242,264,245,254,266,273,270,258,246,234,215,258,239,237,271,270,278,243,243,238,234,250,243,244,257,228,248,229,242,230,228,218,241,256,250,217,231,234,250,246,267,275,247,263,218,235,243,243,248,253,223,233,258,263,262,245,232,238,251,225,257,237,236,265,223,256,231,235,250,245,248,256,243,258,262,245,221,232,241,245,239,226,214,242,261,251,256,220,244,255,229,252,211,270,243,227,224,242,247,277,256,256,253,261,248,263,236,229,258,256,240,220,261,240,257,243,244,231,269,237,247,219,221,269,237,270,248,254,241,230,216,255,246,244,235,233,277,210,244,249,223,212,237,245,246,268,227,239,216,253,211,243,225,248,238,238,251,238,276,234,250,277,249,221,258,243,245,261,258,248,241,242,232,211,246,254,242,219,260,244,250,255,248,246,278,227,257,245,249,222,202,263,239,249,231,247,267,267,222,252,264,236,269,257,245,227,258,248,219,233,260,240,216,256,248,267,243,219,233,259,262,235,229,222,256,247,221,243,260,244,232,226,252,238,239,250,261,240,224,257,216,242,243,237,237,226,249,258,248,253,248,221,250,254,249,233,232,255,239,272,244,228,224,229,231,245,251,289,252,238,254,258,256,260,221,242,262,235,260,237,242,263,229,227,283,235,249,233,241,275,240,244,210,240,253,239,261,232,233,239,234,229,274,253,251,248,240,262,231,254,248,256,244,235,241,247,230,233,241,252,262,245,235,227,249,232,275,243,245,249,265,261,227,243,227,239,256,231,246,266,255,226,258,233,231,228,237,243,252,264,250,255,230,229,262,249,232,244,261,236,284,241,260,238,252,239,248,256,271,242,244,240,250,210,258,245,253,237,242,269,222,225,259,232,257,242,246,268,253,246,233,271,238,249,254,273,258,252,232,223,274,245,238,247,267,262,247,236,256,245,204,222,248,269,253,251,231,265,244,250,225,274,242,231,237,235,263,275,233,227,242,267,228,240,270,223,246,224,229,269,253,224,240,231,257,246,227,248,238,253,240,243,245,258,258,259,240,229,239,266,246,263,264,271,232,241,254,234,214,234,248,247,242,240,260,240,223,268,210,254,249,269,240,247,251,247,232,256,241,232,266,247,248,273,238,258,245,238,252,199,243,240,253,234,263,283,232,237,226,253,244,221,251,233,240,245,240,228,235,237,243,264,247,227,240,253,259,260,233,232,216,255,266,233,241,228,252,257,268,246,237,243,251,249,232,244,218,243,242,258,239,236,234,236,238,225,243,270,239,275,247,230,256,261,228,255,224,253,232,266,246,220,237,253,254,246,233,234,249,244,254,233,251,257,232,234,222,262,213,246,244,214,234,265,239,231,234,254,221,271,237,246,241,240,240,245,260,265,237,243,276,250,226,265,267,248,252,238,219,268,266,231,230,259,239,226,254,254,244,231,281,260,268,243,233,243,250,221,214,238,260,232,244,245,251,227,258,259,240,238,245,225,233,240,263,226,234,224,227,247,245,256,238,247,234,232,218,253,228,254,272,232,244,233,222,237,263,228,255,245,235,225,243,244,274,247,261,248,273,247,217,236,233,241,249,288,266,243,236,209,276,259,234,249,240,261,234,243,242,233,262,222,240,187,246,232,224,245,278,246,231,247,259,236,211,244,257,258,260,252,238,232,275,253,219,249,247,264,270,273,236,242,263,220,249,238,242,234,248,273,247,261,237,252,222,223,246,256,240,243,269,243,218,253,247,234,235,257,235,238,255,266,211,259,247,242,256,254,248,234,243,237,237,267,245,236,271,246,229,261,266,253,246,227,250,260,223,263,245,244,226,264,234,250,242,228,215,272,256,252,267,256,226,266,282,242,255,262,246,266,260,235,243,240,229,235,235,216,247,264,237,259,247,250,239,262,232,248,234,258,237,245,260,224,246,255,203,260,243,242,238,223,268,228,304,248,231,257,230,235,220,234,246,238,241,240,262,267,254,250,232,250,251,243,236,237,249,247,251,247,241,239,250,235,251,270,228]},{"counters":[226,265,272,246,216,237,235,237,211,275,246,252,241,239,235,221,265,262,257,247,249,246,265,251,246,219,227,257,249,229,238,240,262,236,228,279,243,256,231,261,261,262,218,254,231,239,246,265,275,231,245,250,225,227,290,235,213,231,232,255,249,264,253,229,263,252,233,233,259,233,225,214,227,255,260,261,252,224,255,261,240,249,238,235,243,227,242,227,242,234,245,257,254,228,217,249,244,252,255,269,228,247,219,218,265,245,241,265,263,251,216,242,255,260,237,295,240,263,268,256,247,246,239,243,210,230,244,251,231,234,235,244,249,233,236,243,242,265,244,230,282,251,245,270,249,223,256,230,218,235,226,235,265,232,262,217,251,222,238,238,241,230,227,257,240,206,256,199,256,264,245,227,231,282,244,251,244,258,234,275,244,219,239,268,232,233,258,253,252,246,251,250,254,245,252,221,236,256,227,246,254,254,272,233,243,246,213,233,253,250,269,238,229,224,271,239,250,249,261,235,247,245,248,247,230,223,261,224,265,260,245,231,259,229,252,244,262,235,246,241,232,221,240,232,219,252,245,216,258,238,230,235,276,226,242,208,270,249,250,224,232,240,245,254,235,244,243,239,239,254,264,257,239,229,234,265,253,246,241,253,231,220,235,218,266,247,258,235,248,241,222,207,226,259,259,265,209,212,272,243,242,248,227,261,246,247,243,230,238,233,252,230,251,214,234,266,247,246,237,246,241,243,263,268,240,241,247,250,208,231,219,256,220,233,252,272,259,205,232,255,250,261,235,250,255,252,250,238,247,243,229,244,239,247,244,243,237,247,249,235,243,246,234,255,240,255,261,246,251,216,239,261,218,276,230,269,237,249,256,249,233,253,234,261,262,255,268,237,252,249,246,238,273,261,224,244,263,231,262,240,244,255,264,233,229,244,235,244,264,233,256,206,222,232,272,282,242,228,256,250,228,259,246,225,236,239,254,271,222,257,243,239,234,261,251,227,250,227,207,246,240,251,269,235,220,271,247,252,240,265,263,226,254,267,250,248,245,247,252,234,257,212,234,239,217,255,237,251,244,246,249,267,245,259,264,245,251,236,253,246,248,238,260,225,220,248,240,250,245,247,242,227,256,233,238,256,239,247,248,240,248,230,231,265,287,234,241,241,250,271,269,248,274,282,248,251,214,234,262,224,268,234,234,247,240,252,261,263,256,239,242,237,228,254,259,281,271,266,266,227,285,282,258,252,256,261,226,234,231,236,222,236,280,237,273,209,252,256,251,248,239,267,232,204,235,243,243,237,233,215,273,252,277,225,264,255,214,236,247,268,284,273,222,247,233,258,246,258,270,236,263,259,245,233,240,239,214,251,241,248,245,239,243,236,254,257,251,223,254,245,263,236,236,235,246,228,258,275,240,247,228,243,254,244,241,245,263,245,276,274,247,232,220,260,254,254,247,234,274,207,239,253,215,250,252,249,231,259,243,243,284,281,252,245,234,236,257,242,245,236,240,266,237,257,236,231,251,264,220,236,256,246,235,229,239,253,247,247,239,246,226,257,220,248,234,268,266,227,219,230,234,256,248,223,253,258,232,227,229,210,253,223,262,262,259,224,234,238,235,249,239,255,246,231,272,223,256,231,235,250,237,230,221,235,244,271,234,246,243,245,279,243,253,261,242,239,261,236,268,253,233,264,239,264,239,240,238,237,232,252,258,263,258,239,239,247,222,262,272,247,242,234,268,255,241,241,255,229,234,248,257,236,254,237,252,269,258,250,228,241,233,266,246,242,250,233,234,249,232,222,251,259,267,237,257,210,237,259,242,241,265,238,243,244,244,271,256,257,248,238,235,261,277,242,242,248,248,229,258,238,254,267,221,253,231,237,240,255,250,244,266,260,239,232,241,260,234,248,231,238,251,243,244,235,254,238,258,240,218,248,242,276,278,253,248,262,244,250,246,221,229,224,227,232,213,229,243,262,255,249,264,233,244,245,242,253,249,245,237,234,242,247,229,235,245,242,263,230,257,240,239,243,249,239,239,243,231,225,265,275,239,233,237,257,254,250,220,240,239,217,229,215,243,234,223,250,255,249,235,240,239,232,255,236,238,222,250,258,251,261,236,244,257,251,259,227,233,223,239,251,264,243,230,236,269,246,241,239,210,219,247,252,228,255,238,254,267,246,271,236,242,249,228,226,240,225,268,249,207,255,265,254,238,239,228,250,235,252,247,238,259,233,231,240,250,257,275,249,231,239,251,252,221,268,226,258,244,252,264,255,247,262,237,256,222,254,258,244,259,225,268,218,225,242,249,256,226,220,222,246,239,262,258,263,217,300,243,264,256,280,238,245,224,239,244,256,242,234,254,270,268,239,217,267,245,244,214,232,208,243,233,204,259,222,243,232,231,237,229,249,250,257,212,254,253,244,244,245,253,245,254,251,267,243,242,238,235,246,219,226,246,231,262,219,239,242,238,238,254,254,243,231,255,248,258,244,254,226,264,237,249,252,231,227,260,229,255,245,254,237,249,247,254,222,210,231,239,290,257,244,239,238,255,240,270,253,234,209,232,245,251,237,239,255,251,239,245,233,263,246,268,257,221,226,255,267,256,246,230,234,246,220,262,234,264,242,243,246,248,227,247,279,255,247,241,227,229,260,229,256,250,242,251,240,253,266,284,227,215,262,228,257,226,248,241,208,259,256,228,261,289,229,252,247,254,229,237,241,220,241,250,219,268,243,255,223,239,239,241,231,241,219,268,268,253,255,240,237,265,275,241,220,240,256,246,280,225,248,256,262,243,249,211,215,260,250,239,241,232,231,223,233,236,228,236,243,270,277,249,244,232,240,236,254,243,266,260,217,244,232,231,250,244,225,267,227,262,233,237,243,240,239,230,242,220,264,243,233,256,216,265,224,226,242,237,232,256,228,251,218,230,244,227,244,219,244,250,262,236,242,281,238,254,256,240,261,263,218,217,233,271,238,231,240,245,239,249,237,216,240,226,214,225,269,220,255,227,254,261,220,208,251,254,237,263,241,238,243,238,226,238,218,248,228,241,239,228,256,247,214,256,264,231,227,270,218,228,242,253,233,226,258,243,242,235,246,224,246,258,240,240,247,236,260,289,236,232,256,244,252,239,255,222,213,243,247,250,265,228,263,234,238,245,247,232,240,239,262,251,274,236,214,278,245,251,244,232,244,227,256,246,204,254,218,234,269,217,236,263,249,220,238,252,236,223,198,252,253,247,239,211,234,244,245,252,258,238,238,229,212,245,244,252,240,202,259,222,225,246,248,226,249,244,280,224,268,257,265,250,258,234,251,247,243,238,240,253,225,234,258,248,252,254,258,245,255,263,243,219,246,233,237,230,270,211,280,232,233,243,238,248,240,247,270,287,244,251,229,239,267,256,230,218,270,260,228,234,265,235,229,227,242,257,245,229,249,241,242,251,253,270,268,240,284,264,249,256,249,262,237,256,244,223,245,240,234,234,267,255,272,259,244,243,266,227,244,238,251,211,268,223,237,224,211,244,239,260,257,229,254,246,241,266,241,233,258,246,226,243,281,226,237,222,255,249,234,251,254,255,261,271,234,240,242,231,255,246,268,238,253,229,241,250,226,246,242,248,284,285,228,236,226,262,237,264,240,247,235,230,246,255,264,218,256,259,228,257,255,268,237,229,222,227,227,235,226,264,249,225,262,264,244,257,229,206,257,252,245,247,239,231,231,221,240,233,234,255,247,269,269,248,241,236,238,223,243,263,246,253,254,260,228,232,239,221,256,237,269,236,240,256,265,235,273,235,261,240,209,247,247,223,214,263,239,236,254,256,239,260,261,237,231,234,252,247,252,213,245,234,240,224,234,224,216,227,250,239,238,248,247,250,258,240,263,230,245,227,261,253,273,276,235,260,260,243,236,223,253,218,240,247,234,289,253,238,250,291,241,246,237,255,246,259,241,242,260,245,225,266,226,248,255,234,257,241,279,239,237,223,248,238,240,247,238,270,242,232,240,264,258,242,262,232,246,241,235,212,237,225,279,253,257,228,259,246,232,252,242,223,258,254,249,245,238,259,226,255,218,242,228,247,233,240,218,244,241,248,232,277,257,217,249,265,218,207,254,253,272,237,235,234,241,263,229,247,234,263,270,249,248,242,249,218,239,231,236,255,269,247,226,233,246,238,247,242,222,218,250,241,233,257,242,217,247,263,251,256,268,233,263,235,222,248,257,221,224,250,238,226,248,245,233,243,251,260,252,231,234,242,243,240,244,223,249,239,250,266,246,213,221,247,241,257,253,245,231,247,258,241,252,232,225,263,246,213,235,267,242,251,245,248,245,228,230,227,257,255,237,243,267,239,239,251,250,241,251,258,239,258,226,271,220,238,276,244,222,258,247,228,254,263,292,244,230,244,239,235,230,245,214,241,276,251,255,261,249,253,246,241,280,254,257,260,264,245,211,231,228,252,219,247,243,253,268,260,266,220,234,244,230,256,251,258,257,233,259,265,220,259,218,225,232,235,229,234,223,263,253,250,230,229,232,254,237,242,270,254,221,243,247,217,239,241,239,231,243,254,238,240,265,266,249,276,240,245,232,216,235,266,236,249,238,244,244,240,222,237,266,248,233,255,227,243,230,277,239,239,258]}]},"null_count":0,"tot_col_size":10000000,"last_update_version":401695299929374721},"s_nationkey":{"histogram":{"ndv":25,"buckets":[{"count":20000,"lower_bound":"MA==","upper_bound":"MA==","repeats":20000},{"count":44000,"lower_bound":"MQ==","upper_bound":"MQ==","repeats":24000},{"count":66000,"lower_bound":"Mg==","upper_bound":"Mg==","repeats":22000},{"count":87000,"lower_bound":"Mw==","upper_bound":"Mw==","repeats":21000},{"count":111000,"lower_bound":"NA==","upper_bound":"NA==","repeats":24000},{"count":130500,"lower_bound":"NQ==","upper_bound":"NQ==","repeats":19500},{"count":148000,"lower_bound":"Ng==","upper_bound":"Ng==","repeats":17500},{"count":171000,"lower_bound":"Nw==","upper_bound":"Nw==","repeats":23000},{"count":188000,"lower_bound":"OA==","upper_bound":"OA==","repeats":17000},{"count":206500,"lower_bound":"OQ==","upper_bound":"OQ==","repeats":18500},{"count":234000,"lower_bound":"MTA=","upper_bound":"MTA=","repeats":27500},{"count":245500,"lower_bound":"MTE=","upper_bound":"MTE=","repeats":11500},{"count":267000,"lower_bound":"MTI=","upper_bound":"MTI=","repeats":21500},{"count":284500,"lower_bound":"MTM=","upper_bound":"MTM=","repeats":17500},{"count":305000,"lower_bound":"MTQ=","upper_bound":"MTQ=","repeats":20500},{"count":328500,"lower_bound":"MTU=","upper_bound":"MTU=","repeats":23500},{"count":347000,"lower_bound":"MTY=","upper_bound":"MTY=","repeats":18500},{"count":365000,"lower_bound":"MTc=","upper_bound":"MTc=","repeats":18000},{"count":381000,"lower_bound":"MTg=","upper_bound":"MTg=","repeats":16000},{"count":401500,"lower_bound":"MTk=","upper_bound":"MTk=","repeats":20500},{"count":424000,"lower_bound":"MjA=","upper_bound":"MjA=","repeats":22500},{"count":441500,"lower_bound":"MjE=","upper_bound":"MjE=","repeats":17500},{"count":462000,"lower_bound":"MjI=","upper_bound":"MjI=","repeats":20500},{"count":482000,"lower_bound":"MjM=","upper_bound":"MjM=","repeats":20000},{"count":500000,"lower_bound":"MjQ=","upper_bound":"MjQ=","repeats":18000}]},"cm_sketch":{"rows":[{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20089,0,0,0,0,0,19931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19992,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20006,0,0,0,0,20088,0,0,0,0,0,20239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19885,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20081,0,0,0,20104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19989,0,0,0,0,0,0,0,0,0,0,0,20007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19885,0,0,0,0,19992,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20009,0,0,0,0,0,0,0,0,0,0,20006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19989,0,0,0,0,0,0,0,0,0,0,0,0,0,20010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39943,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20006,0,0,0,0,0,0,0,0,19989,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20089,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19992,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19801,0,0,0,0,0,0,0,20104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20010,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20006,0,0,0,0,0,0,0,0,0,0,19795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20089,0,0,0,0,20088,0,0,0,0,0,0,0,0,0,0,0,20104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19926,0,19801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19992,0,0,0,0,0,0,0,0,0,19972,0,0,0,0,0,0,0,0,0,20058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19989,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19885,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]},{"counters":[0,0,0,0,0,0,20058,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19972,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19960,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20007,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19822,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20010,0,0,0,0,20089,0,0,0,0,0,0,0,0,0,0,0,0,0,20239,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19926,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20009,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19948,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19795,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19801,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20081,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19989,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19992,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19885,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19931,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19883,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20074,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20088,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20006,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}]},"null_count":0,"tot_col_size":1000000,"last_update_version":401695306011115521},"s_phone":{"histogram":{"ndv":493056,"buckets":[{"count":2000,"lower_bound":"MTAtMTE4LTk3My03ODQ0","upper_bound":"MTAtMTk3LTQ4Ny0zODgz","repeats":1},{"count":4000,"lower_bound":"MTAtMTk3LTc4NC00MDMz","upper_bound":"MTAtMjg2LTczNC0yMzU5","repeats":1},{"count":6000,"lower_bound":"MTAtMjk1LTk4NS04MDU2","upper_bound":"MTAtNDQxLTcyMS00MjEy","repeats":1},{"count":8000,"lower_bound":"MTAtNDYyLTQ3My01MDY1","upper_bound":"MTAtNTcxLTI3OS02NDAw","repeats":1},{"count":10000,"lower_bound":"MTAtNjE3LTIzMC0yNjA2","upper_bound":"MTAtNjg1LTYwMS0xMjI2","repeats":1},{"count":12000,"lower_bound":"MTAtNjg4LTUxNC00MDI4","upper_bound":"MTAtNzI2LTExNC01MTkz","repeats":1},{"count":14000,"lower_bound":"MTAtNzMxLTY1Ni01OTUw","upper_bound":"MTAtODM5LTE4Ny02NDEw","repeats":1},{"count":16000,"lower_bound":"MTAtOTE0LTUzNS03MzQ1","upper_bound":"MTEtMTIyLTg4My01MzY1","repeats":1},{"count":18000,"lower_bound":"MTEtMTI1LTMwNS01MTcy","upper_bound":"MTEtMTgyLTkzMC02NDY4","repeats":1},{"count":20000,"lower_bound":"MTEtMjUzLTIxNC0xNTQ1","upper_bound":"MTEtMzIxLTI0MS04MTE0","repeats":1},{"count":22000,"lower_bound":"MTEtMzI0LTQ3OS0xMTU3","upper_bound":"MTEtMzU1LTczMC03MTY2","repeats":1},{"count":24000,"lower_bound":"MTEtMzgwLTE0NC03MTA1","upper_bound":"MTEtMzg1LTU5OS01NDE4","repeats":1},{"count":26000,"lower_bound":"MTEtMzg2LTk1Ni0yMjcz","upper_bound":"MTEtNDUxLTE4OS01NTk1","repeats":1},{"count":28000,"lower_bound":"MTEtNDYyLTYyMS0yMzE1","upper_bound":"MTEtNjA4LTU2OC0xMDcy","repeats":1},{"count":30000,"lower_bound":"MTEtNjI4LTE5MC00Njg4","upper_bound":"MTEtNjkzLTE3Ny02ODY4","repeats":1},{"count":32000,"lower_bound":"MTEtNjk2LTE3OC05NTg5","upper_bound":"MTEtNzAyLTUxOC05NDMy","repeats":1},{"count":34000,"lower_bound":"MTEtNzE1LTQ1MS04NTEx","upper_bound":"MTEtNzk5LTg3MS03NjI5","repeats":1},{"count":36000,"lower_bound":"MTEtODA2LTU0MS03NzMw","upper_bound":"MTEtOTM3LTU1My0xODkw","repeats":1},{"count":38000,"lower_bound":"MTEtOTQwLTUxMy03NDM1","upper_bound":"MTEtOTc3LTUyNy01NTgw","repeats":1},{"count":40000,"lower_bound":"MTItMTM4LTUxNC05NTc3","upper_bound":"MTItMjAwLTM5OS05NzM2","repeats":1},{"count":42000,"lower_bound":"MTItMjU3LTE5My04MTU3","upper_bound":"MTItMjkxLTE3Ny05Mzgy","repeats":1},{"count":44000,"lower_bound":"MTItMzEwLTk4Ny01MDI2","upper_bound":"MTItNDQxLTQ2MS0xNjIw","repeats":1},{"count":46000,"lower_bound":"MTItNDQ0LTk2Mi00OTc1","upper_bound":"MTItNTExLTk3Ni0xNTI0","repeats":1},{"count":48000,"lower_bound":"MTItNTI2LTUwMi05OTAw","upper_bound":"MTItNTc2LTMyMS0yMjI5","repeats":1},{"count":50000,"lower_bound":"MTItNjI3LTI2OS0xNDY0","upper_bound":"MTItNjgwLTE1MS00OTU4","repeats":1},{"count":52000,"lower_bound":"MTItNzIzLTgyMC0zMTk0","upper_bound":"MTItODI4LTk3Ni02MzE5","repeats":1},{"count":54000,"lower_bound":"MTItODU0LTg4MS01MjE3","upper_bound":"MTItODk0LTI5Mi04MTg3","repeats":1},{"count":56000,"lower_bound":"MTItOTAyLTQwNi01MzMy","upper_bound":"MTItOTMwLTYzOS02NzA5","repeats":1},{"count":58000,"lower_bound":"MTItOTQxLTE1OC00MzYy","upper_bound":"MTItOTcxLTI3Ni00NTE1","repeats":1},{"count":60000,"lower_bound":"MTItOTg0LTM1MS00NTYz","upper_bound":"MTMtMTQ5LTI5Ni01NzI5","repeats":1},{"count":62000,"lower_bound":"MTMtMTUxLTM2My05Mzgy","upper_bound":"MTMtMjE5LTM2NC02OTYy","repeats":1},{"count":64000,"lower_bound":"MTMtMjQxLTE4MC0zMDM2","upper_bound":"MTMtMjkzLTQxMi0xMzU1","repeats":1},{"count":66000,"lower_bound":"MTMtMzM0LTI1NC01MDA5","upper_bound":"MTMtMzg0LTgyOC0zNjI2","repeats":1},{"count":68000,"lower_bound":"MTMtNDI5LTM4MC0yNTM2","upper_bound":"MTMtNDQwLTg2Ny02MzQw","repeats":1},{"count":70000,"lower_bound":"MTMtNDgzLTQ0OC0zOTc2","upper_bound":"MTMtNTUwLTg1NS03NzE2","repeats":1},{"count":72000,"lower_bound":"MTMtNTcyLTM1Ni0xMDA0","upper_bound":"MTMtNjE3LTcwNC04Mjg1","repeats":1},{"count":74000,"lower_bound":"MTMtNjUyLTY5Ni02MDA0","upper_bound":"MTMtNjk2LTU0My00MDgw","repeats":1},{"count":76000,"lower_bound":"MTMtNzA0LTM2My01Njk5","upper_bound":"MTMtODI5LTc3Mi02MzA1","repeats":1},{"count":78000,"lower_bound":"MTMtODM0LTIyMS01MDg2","upper_bound":"MTMtODUxLTQwMS05NjY2","repeats":1},{"count":80000,"lower_bound":"MTMtODkxLTc3MC01MTQ1","upper_bound":"MTMtOTMxLTc5NC03MTI5","repeats":1},{"count":82000,"lower_bound":"MTMtOTY4LTIwOS00NTE2","upper_bound":"MTQtMTI1LTY4MC02NzYw","repeats":1},{"count":84000,"lower_bound":"MTQtMTUzLTE0MC0zNTA1","upper_bound":"MTQtMjcwLTM5My01NDEw","repeats":1},{"count":86000,"lower_bound":"MTQtMjgxLTE0MC0yMDI0","upper_bound":"MTQtMzM1LTYxNC0yODA1","repeats":1},{"count":88000,"lower_bound":"MTQtMzQxLTQwMi0yNDY0","upper_bound":"MTQtNDA2LTc1Mi0xNTg5","repeats":1},{"count":90000,"lower_bound":"MTQtNDEwLTc3OC05NzMw","upper_bound":"MTQtNDI4LTQyMi04ODE1","repeats":1},{"count":92000,"lower_bound":"MTQtNDM3LTk0NS01NTAx","upper_bound":"MTQtNDY1LTM0MS03Njkz","repeats":1},{"count":94000,"lower_bound":"MTQtNDc0LTg2MS02NzMw","upper_bound":"MTQtNDc5LTQxNy01MTQ0","repeats":1},{"count":96000,"lower_bound":"MTQtNDgwLTUzOC0zMTE3","upper_bound":"MTQtNTAzLTcxMy04Njgy","repeats":1},{"count":98000,"lower_bound":"MTQtNTEwLTE5OC04OTU1","upper_bound":"MTQtNTY2LTc1Mi00NTI2","repeats":1},{"count":100000,"lower_bound":"MTQtNjY2LTc4MS04MTk3","upper_bound":"MTQtNzY1LTQ1NS05NDEz","repeats":1},{"count":102000,"lower_bound":"MTQtNzcyLTIyNS0xMzM5","upper_bound":"MTQtODQ0LTk0My02Mzg4","repeats":1},{"count":104000,"lower_bound":"MTQtODQ2LTEzMy04NDg3","upper_bound":"MTQtOTk2LTM2OC01NjEz","repeats":1},{"count":106000,"lower_bound":"MTUtMTAxLTIzOC0yMDUw","upper_bound":"MTUtMTEzLTkzNi04NjEw","repeats":1},{"count":108000,"lower_bound":"MTUtMTQ2LTE2MS04NTA3","upper_bound":"MTUtMTgwLTU1MS02MjQ5","repeats":1},{"count":110000,"lower_bound":"MTUtMjA0LTgwMy0zODUx","upper_bound":"MTUtMjcwLTk0OC0yNTQ2","repeats":1},{"count":112000,"lower_bound":"MTUtMjk5LTU2NC00Mzkx","upper_bound":"MTUtMzc2LTUwNy02MDk1","repeats":1},{"count":114000,"lower_bound":"MTUtNDMxLTQ1Ny05NTE5","upper_bound":"MTUtNTQ5LTQzOS05MTM4","repeats":1},{"count":116000,"lower_bound":"MTUtNTU3LTE3Ni05MDE1","upper_bound":"MTUtNjc5LTEwMC02MzQ5","repeats":1},{"count":118000,"lower_bound":"MTUtNzMyLTM5Ni05OTE3","upper_bound":"MTUtNzY4LTY4OC0yMDEx","repeats":1},{"count":120000,"lower_bound":"MTUtNzc4LTYxNi0zNDMw","upper_bound":"MTUtODUyLTg0My0zNzUz","repeats":1},{"count":122000,"lower_bound":"MTUtOTAxLTIzNS04OTk0","upper_bound":"MTUtOTk2LTg5OC01MTk3","repeats":1},{"count":124000,"lower_bound":"MTYtMTEyLTE4My0zNTkz","upper_bound":"MTYtMTQ2LTgzMC01Njkz","repeats":1},{"count":126000,"lower_bound":"MTYtMTg3LTQ3MS04MjA4","upper_bound":"MTYtMjc1LTg2NS0zMDUy","repeats":1},{"count":128000,"lower_bound":"MTYtMjgzLTczNy02OTcy","upper_bound":"MTYtMzE5LTkzOC04NTAy","repeats":1},{"count":130000,"lower_bound":"MTYtMzI2LTY2MC04Njgz","upper_bound":"MTYtNDA1LTQ4Mi02NzA2","repeats":1},{"count":132000,"lower_bound":"MTYtNDMzLTk5Ni00NTI5","upper_bound":"MTYtNTE3LTQ5MC02OTk1","repeats":1},{"count":134000,"lower_bound":"MTYtNTMwLTkwOS02MDQx","upper_bound":"MTYtNjIzLTI5MS00OTk0","repeats":1},{"count":136000,"lower_bound":"MTYtNjIzLTM3NS05ODU4","upper_bound":"MTYtNjY5LTczMi05NTU3","repeats":1},{"count":138000,"lower_bound":"MTYtNjkyLTE0OC0zMDk4","upper_bound":"MTYtNzAzLTM5Ny03Mzc4","repeats":1},{"count":140000,"lower_bound":"MTYtNzA2LTMwOC02MTQy","upper_bound":"MTYtODA0LTg3OS02OTE0","repeats":1},{"count":142000,"lower_bound":"MTYtODI3LTIxNS0xMjgz","upper_bound":"MTYtODc3LTI1MS05OTA5","repeats":1},{"count":144000,"lower_bound":"MTYtODk4LTIzNi03NTAw","upper_bound":"MTYtOTcwLTc5NC00NTA3","repeats":1},{"count":146000,"lower_bound":"MTYtOTc0LTgzMC04NTA1","upper_bound":"MTctMTI1LTIwMy03NzY3","repeats":1},{"count":148000,"lower_bound":"MTctMTI5LTk3OC0xMjAw","upper_bound":"MTctMTU2LTMxMS00MzQ3","repeats":1},{"count":150000,"lower_bound":"MTctMTY5LTY5Mi0zNDgx","upper_bound":"MTctMTk0LTU4NS01NjI1","repeats":1},{"count":152000,"lower_bound":"MTctMTk2LTk2Mi05Mzk0","upper_bound":"MTctMjMxLTg5NS02MDcz","repeats":1},{"count":154000,"lower_bound":"MTctMjMyLTU2NC04NTUx","upper_bound":"MTctMjY0LTM2MC0zMDU4","repeats":1},{"count":156000,"lower_bound":"MTctMjY1LTkwNy01OTYz","upper_bound":"MTctMzMxLTc5OC02NTYy","repeats":1},{"count":158000,"lower_bound":"MTctMzMyLTUxNC04ODQ1","upper_bound":"MTctNDQ0LTE0Ni03MzU5","repeats":1},{"count":160000,"lower_bound":"MTctNDQ2LTIzNC04OTU4","upper_bound":"MTctNTEzLTc5NS04MTk3","repeats":1},{"count":162000,"lower_bound":"MTctNTk5LTk5Ny0yMDI2","upper_bound":"MTctNjU2LTY4MC0xMDUz","repeats":1},{"count":164000,"lower_bound":"MTctNjU3LTM0Ni04NTQ5","upper_bound":"MTctNzczLTUyMS03MjA3","repeats":1},{"count":166000,"lower_bound":"MTctNzkxLTQ4My00MTQ2","upper_bound":"MTctODQwLTY1Ny01MTM5","repeats":1},{"count":168000,"lower_bound":"MTctODU3LTMwMy0yOTk5","upper_bound":"MTctOTIzLTI0My03Mzk5","repeats":1},{"count":170000,"lower_bound":"MTctOTQ2LTc1NC01MTEy","upper_bound":"MTctOTk2LTYzMS05NDc2","repeats":1},{"count":172000,"lower_bound":"MTgtMTExLTUxNS05NTE3","upper_bound":"MTgtMTg3LTc5Mi02MTA3","repeats":1},{"count":174000,"lower_bound":"MTgtMjI3LTE3MC00MDkw","upper_bound":"MTgtMjc1LTIyMy00NTcy","repeats":1},{"count":176000,"lower_bound":"MTgtMzM4LTU2OS0xODI5","upper_bound":"MTgtMzYxLTQwNi0xNTUz","repeats":1},{"count":178000,"lower_bound":"MTgtMzk0LTUyNS05NTYz","upper_bound":"MTgtNDQ4LTgzMi0zODk1","repeats":1},{"count":180000,"lower_bound":"MTgtNDkxLTgyMy01NDEx","upper_bound":"MTgtNjEwLTY1Mi05ODg1","repeats":1},{"count":182000,"lower_bound":"MTgtNjExLTQ1MC04OTAx","upper_bound":"MTgtNjY0LTg4MS0yMDIy","repeats":1},{"count":184000,"lower_bound":"MTgtNjY0LTkzNi0yMDE4","upper_bound":"MTgtNzA2LTQwMS03NDYy","repeats":1},{"count":186000,"lower_bound":"MTgtNzU2LTU3MC0xNjc1","upper_bound":"MTgtODUzLTE3OC00MDU5","repeats":1},{"count":188000,"lower_bound":"MTgtODc5LTU2OC0yMDI1","upper_bound":"MTgtOTg1LTUxOS05OTk4","repeats":1},{"count":190000,"lower_bound":"MTgtOTkyLTcyOS0zMjYw","upper_bound":"MTktMTM1LTYyOC03MDA4","repeats":1},{"count":192000,"lower_bound":"MTktMTQwLTE1My0zNTQ3","upper_bound":"MTktMjIwLTEyMS02Mjkw","repeats":1},{"count":194000,"lower_bound":"MTktMjYzLTY3MS02Njcx","upper_bound":"MTktMzA3LTY3My0zMjcx","repeats":1},{"count":196000,"lower_bound":"MTktMzA4LTM2Ni00Mjk3","upper_bound":"MTktMzY2LTE2Mi00MjU3","repeats":1},{"count":198000,"lower_bound":"MTktMzc1LTc3My00ODk4","upper_bound":"MTktNDIzLTgwMy0yNTI3","repeats":1},{"count":200000,"lower_bound":"MTktNDI0LTMyNy0zMTIw","upper_bound":"MTktNTIxLTQ0NS0zOTkx","repeats":1},{"count":202000,"lower_bound":"MTktNTYxLTU2MC03NDM3","upper_bound":"MTktNjE4LTkxNi03NjE5","repeats":1},{"count":204000,"lower_bound":"MTktNjI2LTY4OC0yNTk5","upper_bound":"MTktNjkwLTU2OS04MDI5","repeats":1},{"count":206000,"lower_bound":"MTktNzE1LTQ4NC05MjQ3","upper_bound":"MTktNzc3LTg4OS0xMjk2","repeats":1},{"count":208000,"lower_bound":"MTktNzg5LTI2MC05MjI4","upper_bound":"MTktODI1LTkwMC01ODQz","repeats":1},{"count":210000,"lower_bound":"MTktODQzLTc4MS0yMzI2","upper_bound":"MTktOTA3LTY5MS0yMjE1","repeats":1},{"count":212000,"lower_bound":"MTktOTI2LTIzNS0xOTQw","upper_bound":"MTktOTQ2LTE0NC05NTc5","repeats":1},{"count":214000,"lower_bound":"MTktOTkyLTg3Mi0xMDc4","upper_bound":"MjAtMTI5LTE5Ny02MzYw","repeats":1},{"count":216000,"lower_bound":"MjAtMTY3LTg5MC05NjQx","upper_bound":"MjAtMjUxLTQ4My0xMDM3","repeats":1},{"count":218000,"lower_bound":"MjAtMjg3LTM4NS0xMDYw","upper_bound":"MjAtMzQ4LTY0Mi0xMTgx","repeats":1},{"count":220000,"lower_bound":"MjAtMzUzLTI4OS02Nzkw","upper_bound":"MjAtMzk1LTExMC0xNjU1","repeats":1},{"count":222000,"lower_bound":"MjAtNDEyLTMwMS00OTYw","upper_bound":"MjAtNDc5LTUzNi02NTk2","repeats":1},{"count":224000,"lower_bound":"MjAtNDg3LTU3Mi0yMTg4","upper_bound":"MjAtNjEwLTU5NC0zOTgy","repeats":1},{"count":226000,"lower_bound":"MjAtNjE2LTY4MS0yNDUy","upper_bound":"MjAtNzIyLTc3NS0xNTgy","repeats":1},{"count":228000,"lower_bound":"MjAtNzYxLTg3OC0yMzgy","upper_bound":"MjAtODYxLTM4Ni0xODU0","repeats":1},{"count":230000,"lower_bound":"MjAtODYxLTk1Ni05MzY4","upper_bound":"MjAtOTU4LTc1Ni02NDk0","repeats":1},{"count":232000,"lower_bound":"MjAtOTY5LTU0OC03NDQ2","upper_bound":"MjAtOTc4LTEwOC04MjM4","repeats":1},{"count":234000,"lower_bound":"MjEtMTE5LTc4MC05NTkx","upper_bound":"MjEtMjI1LTI1Mi04MzMw","repeats":1},{"count":236000,"lower_bound":"MjEtMjI4LTM3MS0yODAz","upper_bound":"MjEtMzA0LTI1OS0zODE0","repeats":1},{"count":238000,"lower_bound":"MjEtMzA5LTIwNi03ODA3","upper_bound":"MjEtNTA0LTkxNi02MjI2","repeats":1},{"count":240000,"lower_bound":"MjEtNTIwLTg1NS0zOTUx","upper_bound":"MjEtNTU4LTg4MS05NjA1","repeats":1},{"count":242000,"lower_bound":"MjEtNTgyLTQ2NC02NjU3","upper_bound":"MjEtNjE4LTkwNy01Mjg4","repeats":1},{"count":244000,"lower_bound":"MjEtNjM4LTQ4NC02NjE4","upper_bound":"MjEtNzI2LTc1OS04MjY4","repeats":1},{"count":246000,"lower_bound":"MjEtNzQ2LTE3OC00MjI1","upper_bound":"MjEtODQ1LTM1My0yMjgx","repeats":1},{"count":248000,"lower_bound":"MjEtODY3LTQ5NC01NDk5","upper_bound":"MjEtOTI1LTI5MS02Njc0","repeats":1},{"count":250000,"lower_bound":"MjEtOTQxLTkxMC01OTI4","upper_bound":"MjEtOTYwLTE4Mi05NzE0","repeats":1},{"count":252000,"lower_bound":"MjEtOTcxLTUyNC00MTYx","upper_bound":"MjItMTY0LTc2Ni03Nzky","repeats":1},{"count":254000,"lower_bound":"MjItMjYzLTk2Ny04ODcz","upper_bound":"MjItMzQxLTYwNi04MDM5","repeats":1},{"count":256000,"lower_bound":"MjItMzUwLTMzOC0yOTQ4","upper_bound":"MjItNDAwLTY1MS03NjE2","repeats":1},{"count":258000,"lower_bound":"MjItNDA5LTY2MS05Mjkz","upper_bound":"MjItNDU2LTU4Ny01NzUy","repeats":1},{"count":260000,"lower_bound":"MjItNDkzLTUwOS0zOTA1","upper_bound":"MjItNTkzLTM2OS02Mjc1","repeats":1},{"count":262000,"lower_bound":"MjItNjI2LTkzMi0yNzY5","upper_bound":"MjItNzY1LTM2Ni0zNjU5","repeats":1},{"count":264000,"lower_bound":"MjItNzc1LTc3Ny0yNzM0","upper_bound":"MjItODAxLTc2Ni03OTgw","repeats":1},{"count":266000,"lower_bound":"MjItODE1LTM5OC0yMjQy","upper_bound":"MjItODM5LTc5My05MzI4","repeats":1},{"count":268000,"lower_bound":"MjItODQxLTMxMy0xMDA0","upper_bound":"MjItOTAzLTI4OC01Mzkx","repeats":1},{"count":270000,"lower_bound":"MjItOTM3LTY0NC03Mzc0","upper_bound":"MjItOTk1LTY3MC02MTgy","repeats":1},{"count":272000,"lower_bound":"MjMtMTQ2LTY0Ni0yNzQw","upper_bound":"MjMtMTkwLTkxNC00NDQ4","repeats":1},{"count":274000,"lower_bound":"MjMtMjAwLTYyOS0xNDI2","upper_bound":"MjMtMjIxLTU0MS02MDY5","repeats":1},{"count":276000,"lower_bound":"MjMtMjcxLTI0NC0zNTUy","upper_bound":"MjMtMzQ2LTk5Mi05MjE1","repeats":1},{"count":278000,"lower_bound":"MjMtMzU1LTQ1Ni00MTA3","upper_bound":"MjMtNDk5LTI3My0zMzQ2","repeats":1},{"count":280000,"lower_bound":"MjMtNTM2LTcyMy0yODM3","upper_bound":"MjMtNjI4LTg4Ny04MjY4","repeats":1},{"count":282000,"lower_bound":"MjMtNjQ1LTI1Mi0yOTM4","upper_bound":"MjMtNzM0LTQyMi01OTUz","repeats":1},{"count":284000,"lower_bound":"MjMtNzUzLTI1MS0yNzY5","upper_bound":"MjMtODAyLTM2MC03NTgy","repeats":1},{"count":286000,"lower_bound":"MjMtODQ0LTMyNi00Njg5","upper_bound":"MjMtODYzLTQ3Ny0zNzgz","repeats":1},{"count":288000,"lower_bound":"MjMtODgzLTQ1OS01NTM4","upper_bound":"MjMtODkzLTQ5Ni04MDYx","repeats":1},{"count":290000,"lower_bound":"MjMtOTE3LTE3Mi01Nzg5","upper_bound":"MjMtOTgwLTI5Mi01MDI2","repeats":1},{"count":292000,"lower_bound":"MjQtMTAwLTY4OS00ODMz","upper_bound":"MjQtMTY1LTk0NS00MzQ4","repeats":1},{"count":294000,"lower_bound":"MjQtMTc4LTcxOC02NTk2","upper_bound":"MjQtMjk0LTM3OS00NzQw","repeats":1},{"count":296000,"lower_bound":"MjQtMzA3LTUxOS02MTg3","upper_bound":"MjQtNDE4LTg4MS00NDU2","repeats":1},{"count":298000,"lower_bound":"MjQtNDI0LTYzOS0xMTcw","upper_bound":"MjQtNTE5LTEyNi0xOTE3","repeats":1},{"count":300000,"lower_bound":"MjQtNTU0LTkwNC0xODM5","upper_bound":"MjQtNTc2LTQxMC05MzY1","repeats":1},{"count":302000,"lower_bound":"MjQtNTk1LTc5Ny00NjMw","upper_bound":"MjQtNjcwLTMzOC03MDU1","repeats":1},{"count":304000,"lower_bound":"MjQtNzE4LTU3NC04NDY0","upper_bound":"MjQtODMyLTM2OC0zMjM3","repeats":1},{"count":306000,"lower_bound":"MjQtODQ0LTc0NC03Mzc1","upper_bound":"MjQtOTA3LTkzMC0xMzgy","repeats":1},{"count":308000,"lower_bound":"MjQtOTE0LTk0MS05MjUz","upper_bound":"MjUtMTU1LTIzOS01MjI1","repeats":1},{"count":310000,"lower_bound":"MjUtMTY4LTY0Ni02OTAy","upper_bound":"MjUtMjc5LTE4MC03NzAz","repeats":1},{"count":312000,"lower_bound":"MjUtMzEwLTkxNi0yNDI0","upper_bound":"MjUtMzE0LTM2Ny03Nzk4","repeats":1},{"count":314000,"lower_bound":"MjUtMzU0LTg0Ni00NDUy","upper_bound":"MjUtNDEzLTU0My03MjM4","repeats":1},{"count":316000,"lower_bound":"MjUtNDIyLTM2MC0xNDky","upper_bound":"MjUtNDYzLTM3OC04NzMz","repeats":1},{"count":318000,"lower_bound":"MjUtNDc5LTg2MC02ODM3","upper_bound":"MjUtNjExLTkzMS01MDE1","repeats":1},{"count":320000,"lower_bound":"MjUtNjEzLTg1NC0zMDkw","upper_bound":"MjUtNjQyLTU3My01NzA1","repeats":1},{"count":322000,"lower_bound":"MjUtNjc0LTk3OS02MTg0","upper_bound":"MjUtNjk2LTIzMy0zNzM2","repeats":1},{"count":324000,"lower_bound":"MjUtNzAyLTE3OS02MDg2","upper_bound":"MjUtODE4LTczOC0xNTQ2","repeats":1},{"count":326000,"lower_bound":"MjUtODQxLTk1My00MDE3","upper_bound":"MjUtODc0LTQ3Mi05MTEx","repeats":1},{"count":328000,"lower_bound":"MjUtOTM1LTExNy01NjUz","upper_bound":"MjUtOTg3LTExNS01NDc4","repeats":1},{"count":330000,"lower_bound":"MjUtOTg4LTE0NC05NDYy","upper_bound":"MjYtMTcwLTg1Ny05MDAx","repeats":1},{"count":332000,"lower_bound":"MjYtMTcyLTYxNi03MDYy","upper_bound":"MjYtMjAwLTI3Ny05OTgw","repeats":1},{"count":334000,"lower_bound":"MjYtMjI5LTEzMS0zOTAz","upper_bound":"MjYtMzgwLTE2My0zNjk2","repeats":1},{"count":336000,"lower_bound":"MjYtMzk1LTk1MC03NTc1","upper_bound":"MjYtNDAxLTgwMy01MjQw","repeats":1},{"count":338000,"lower_bound":"MjYtNDA1LTE1OS01NzY4","upper_bound":"MjYtNDE5LTc3Ni02NTky","repeats":1},{"count":340000,"lower_bound":"MjYtNDY4LTUwMC01MzQ2","upper_bound":"MjYtNjI5LTk3My01NDg4","repeats":1},{"count":342000,"lower_bound":"MjYtNjM4LTc2NC0zNjkx","upper_bound":"MjYtNjcwLTczNC03OTMx","repeats":1},{"count":344000,"lower_bound":"MjYtNjk2LTE1Mi01MDM1","upper_bound":"MjYtNzQ3LTExNS01NDM2","repeats":1},{"count":346000,"lower_bound":"MjYtNzg1LTkxOC03ODk1","upper_bound":"MjYtODMxLTc2MC01NDA5","repeats":1},{"count":348000,"lower_bound":"MjYtODM0LTE1MC03NTQ2","upper_bound":"MjYtODUyLTI1OC0zMzQ2","repeats":1},{"count":350000,"lower_bound":"MjYtODYxLTc4My02MjIz","upper_bound":"MjYtOTM2LTk3MS03NDAz","repeats":1},{"count":352000,"lower_bound":"MjYtOTQ1LTEzMS03MjYy","upper_bound":"MjctMTM0LTIzMy03MzE5","repeats":1},{"count":354000,"lower_bound":"MjctMTk5LTI4Ni01NjM4","upper_bound":"MjctMjcwLTkxNi05MjI4","repeats":1},{"count":356000,"lower_bound":"MjctMzM5LTY3Ni03NzA3","upper_bound":"MjctMzk1LTM1MC04NjQw","repeats":1},{"count":358000,"lower_bound":"MjctNDM2LTMzMS04NzQw","upper_bound":"MjctNTE2LTg0Ny04MDE1","repeats":1},{"count":360000,"lower_bound":"MjctNTI3LTY5NS0zNTU4","upper_bound":"MjctNjE2LTg4Ny02MDYx","repeats":1},{"count":362000,"lower_bound":"MjctNjM5LTMwNC05ODcy","upper_bound":"MjctNzU2LTg2OS03NzAz","repeats":1},{"count":364000,"lower_bound":"MjctNzc1LTY0OC0zNzU2","upper_bound":"MjctODQ0LTU2Mi01MDgx","repeats":1},{"count":366000,"lower_bound":"MjctODUwLTU0OC04NDAw","upper_bound":"MjctOTQ0LTI2NS0zMjIw","repeats":1},{"count":368000,"lower_bound":"MjctOTY1LTQ4Mi04MzA1","upper_bound":"MjgtMTI0LTEwNC0xNjA5","repeats":1},{"count":370000,"lower_bound":"MjgtMjM4LTc5My0yODY4","upper_bound":"MjgtMzE2LTg3MC01NTM1","repeats":1},{"count":372000,"lower_bound":"MjgtMzMyLTI3OC0xNDc4","upper_bound":"MjgtMzU5LTcwNy05OTk2","repeats":1},{"count":374000,"lower_bound":"MjgtMzg1LTE1OS00ODU1","upper_bound":"MjgtNDAzLTQ3NC05NTI4","repeats":1},{"count":376000,"lower_bound":"MjgtNDMyLTIwNy0yMDQx","upper_bound":"MjgtNDc2LTI5MS0xNjUx","repeats":1},{"count":378000,"lower_bound":"MjgtNDc3LTEzNy01MDY2","upper_bound":"MjgtNTU2LTI1My0zODM2","repeats":1},{"count":380000,"lower_bound":"MjgtNTg5LTMwMy04NjMw","upper_bound":"MjgtNTk2LTcyMC01NzE3","repeats":1},{"count":382000,"lower_bound":"MjgtNjEzLTE3NC02OTUx","upper_bound":"MjgtNjQ2LTQ0NC0xNzAx","repeats":1},{"count":384000,"lower_bound":"MjgtNjg2LTc0MC0xNDY1","upper_bound":"MjgtNzYyLTkwNy05OTg4","repeats":1},{"count":386000,"lower_bound":"MjgtNzg0LTYxMy0yNzYz","upper_bound":"MjgtODM1LTI2OS04NTI3","repeats":1},{"count":388000,"lower_bound":"MjgtODg0LTUyMS0yMjAw","upper_bound":"MjgtOTMzLTc3OS0zMzUx","repeats":1},{"count":390000,"lower_bound":"MjgtOTc5LTIwMy0yNDQx","upper_bound":"MjktMTE1LTk4NC0xNzA4","repeats":1},{"count":392000,"lower_bound":"MjktMTQyLTY3NS05NzY5","upper_bound":"MjktMjA2LTczNS01NTI3","repeats":1},{"count":394000,"lower_bound":"MjktMjE3LTYxMC03MzM1","upper_bound":"MjktMzAzLTc4Ni04MjQ5","repeats":1},{"count":396000,"lower_bound":"MjktMzY3LTM5Mi0xMTUw","upper_bound":"MjktNDY0LTc2My0yNzQw","repeats":1},{"count":398000,"lower_bound":"MjktNDc3LTM3Mi04NTM4","upper_bound":"MjktNTc0LTczOS04MDAw","repeats":1},{"count":400000,"lower_bound":"MjktNTc1LTkwNi05NTEy","upper_bound":"MjktNjczLTM2Ni00Mjg5","repeats":1},{"count":402000,"lower_bound":"MjktNjgyLTkwNy04MTMz","upper_bound":"MjktODQ5LTk3NC01ODc1","repeats":1},{"count":404000,"lower_bound":"MjktODcyLTk5NS04NzUy","upper_bound":"MjktOTgzLTU1Mi05NDY4","repeats":1},{"count":406000,"lower_bound":"MzAtMTEwLTg0Mi01OTIz","upper_bound":"MzAtMTc4LTU2OC00NjIz","repeats":1},{"count":408000,"lower_bound":"MzAtMTc5LTgyNS01MjAw","upper_bound":"MzAtMTk0LTk2My0yNTUx","repeats":1},{"count":410000,"lower_bound":"MzAtMjMwLTgzMi0zMTA4","upper_bound":"MzAtMzIxLTI2NS02MDMz","repeats":1},{"count":412000,"lower_bound":"MzAtMzI5LTY3NC01Mjgw","upper_bound":"MzAtMzczLTcwNC04NTA2","repeats":1},{"count":414000,"lower_bound":"MzAtNDEzLTE1MS01NTY3","upper_bound":"MzAtNDc2LTE4My01MzI3","repeats":1},{"count":416000,"lower_bound":"MzAtNDgzLTU1OC02NDM0","upper_bound":"MzAtNTg4LTMxOC0xODY3","repeats":1},{"count":418000,"lower_bound":"MzAtNjEzLTczNy0xNTgx","upper_bound":"MzAtNjY0LTM5OC02MTkz","repeats":1},{"count":420000,"lower_bound":"MzAtNzAyLTIwMi00NDA0","upper_bound":"MzAtNzQ5LTM1MS01OTQw","repeats":1},{"count":422000,"lower_bound":"MzAtNzY1LTg4MC03MzEz","upper_bound":"MzAtNzk0LTgxNC0xNzQ3","repeats":1},{"count":424000,"lower_bound":"MzAtODczLTMxOC04MzIx","upper_bound":"MzAtOTA3LTgxNC0xNDAy","repeats":1},{"count":426000,"lower_bound":"MzAtOTExLTMxOS05Mjgx","upper_bound":"MzAtOTY1LTUwNS05NDMy","repeats":1},{"count":428000,"lower_bound":"MzEtMTE2LTY4OS0zOTQw","upper_bound":"MzEtMjMzLTk3OC03OTY4","repeats":1},{"count":430000,"lower_bound":"MzEtMjU1LTUyNC0yNTQy","upper_bound":"MzEtMzE3LTU0Ni01OTc4","repeats":1},{"count":432000,"lower_bound":"MzEtMzE4LTI4MC02MTQ4","upper_bound":"MzEtMzY0LTk5Ny01MDg0","repeats":1},{"count":434000,"lower_bound":"MzEtNDI5LTQ3Ny03Mzgy","upper_bound":"MzEtNDc2LTk0OC0xMzY3","repeats":1},{"count":436000,"lower_bound":"MzEtNDg0LTE3Mi04OTAy","upper_bound":"MzEtNTE2LTUxNi0zOTA2","repeats":1},{"count":438000,"lower_bound":"MzEtNTIwLTg0Ni0zMTc0","upper_bound":"MzEtNTQ2LTk3Mi03ODAy","repeats":1},{"count":440000,"lower_bound":"MzEtNTg5LTQyMy00MzYz","upper_bound":"MzEtNjMwLTE2MS0yOTY2","repeats":1},{"count":442000,"lower_bound":"MzEtNjMyLTUzMS04NDE0","upper_bound":"MzEtNzYzLTI3NC02NDk0","repeats":1},{"count":444000,"lower_bound":"MzEtNzk0LTEwNy00NzQ5","upper_bound":"MzEtODMwLTk2OC0zNDcz","repeats":1},{"count":446000,"lower_bound":"MzEtOTA1LTQxOC0xNTE0","upper_bound":"MzEtOTg1LTE0NS02OTI3","repeats":1},{"count":448000,"lower_bound":"MzEtOTk0LTk0MC02ODQy","upper_bound":"MzItMjM0LTc2MS04NTI5","repeats":1},{"count":450000,"lower_bound":"MzItMjYzLTgzNi02ODg1","upper_bound":"MzItMzE3LTIxOC00NTk1","repeats":1},{"count":452000,"lower_bound":"MzItMzYwLTY3Ni0xNjI5","upper_bound":"MzItMzkwLTM0NC0xNDgz","repeats":1},{"count":454000,"lower_bound":"MzItNDEyLTI5Ni0zNDE1","upper_bound":"MzItNTYxLTU5OS0yNzg1","repeats":1},{"count":456000,"lower_bound":"MzItNTYzLTE1OS05MzM3","upper_bound":"MzItNjM4LTcwMC05OTUw","repeats":1},{"count":458000,"lower_bound":"MzItNjc1LTMyNS00NjMw","upper_bound":"MzItNjkzLTU0My02NjM4","repeats":1},{"count":460000,"lower_bound":"MzItNzQ3LTM0MC01Nzc4","upper_bound":"MzItOTM3LTU1MC02MTk1","repeats":1},{"count":462000,"lower_bound":"MzMtMTIyLTYzMC05Mzgz","upper_bound":"MzMtMTkzLTE4OC0zNjk2","repeats":1},{"count":464000,"lower_bound":"MzMtMjI3LTU3OS05MjM5","upper_bound":"MzMtMzQ1LTQxMy01Nzc0","repeats":1},{"count":466000,"lower_bound":"MzMtMzUxLTI0MC01NTQ1","upper_bound":"MzMtNDIzLTI0Ny04OTcx","repeats":1},{"count":468000,"lower_bound":"MzMtNDI4LTU2My0yNjc5","upper_bound":"MzMtNDc5LTc5NC02OTIw","repeats":1},{"count":470000,"lower_bound":"MzMtNDg4LTMxMi04ODM4","upper_bound":"MzMtNTYzLTcxMi00MTc0","repeats":1},{"count":472000,"lower_bound":"MzMtNTczLTY3Mi05NDY2","upper_bound":"MzMtNjYxLTg0Mi03MTM1","repeats":1},{"count":474000,"lower_bound":"MzMtNjYzLTYyNy01NTU2","upper_bound":"MzMtNzQ3LTc4NS03Mzcy","repeats":1},{"count":476000,"lower_bound":"MzMtNzU0LTcxNi00OTMy","upper_bound":"MzMtODI1LTc2My05ODI2","repeats":1},{"count":478000,"lower_bound":"MzMtODM0LTI5NS00NzM3","upper_bound":"MzMtOTQ2LTE2Ny02MTI5","repeats":1},{"count":480000,"lower_bound":"MzMtOTYzLTc4OS03NjA4","upper_bound":"MzQtMTAzLTk3MS05Mjkw","repeats":1},{"count":482000,"lower_bound":"MzQtMTE3LTgxMC04Njg3","upper_bound":"MzQtMTM1LTg2Ni04MTAx","repeats":1},{"count":484000,"lower_bound":"MzQtMTM5LTU2Ny05MjQy","upper_bound":"MzQtMjE2LTczOC0xMjA3","repeats":1},{"count":486000,"lower_bound":"MzQtMjIyLTQ5My02ODMy","upper_bound":"MzQtMzk4LTI0Ny00Njg0","repeats":1},{"count":488000,"lower_bound":"MzQtNDM2LTQ0Mi0xNTAw","upper_bound":"MzQtNDYxLTIwMC0xNTUz","repeats":1},{"count":490000,"lower_bound":"MzQtNDgxLTQ0MS04OTUx","upper_bound":"MzQtNTg3LTUwMi01NDA2","repeats":1},{"count":492000,"lower_bound":"MzQtNjA1LTk1NC04NjQ4","upper_bound":"MzQtNjkyLTM0MC04ODA4","repeats":1},{"count":494000,"lower_bound":"MzQtNzQ0LTY3NS02NzI4","upper_bound":"MzQtNzgyLTk5Ni0zOTQ3","repeats":1},{"count":496000,"lower_bound":"MzQtNzg3LTM3MS03NzUz","upper_bound":"MzQtODU4LTI1Ni0xMDI1","repeats":1},{"count":498000,"lower_bound":"MzQtODYwLTc1My05MDcx","upper_bound":"MzQtOTA2LTYwMi0xMDEy","repeats":1},{"count":500000,"lower_bound":"MzQtOTc3LTQ3Ni00Njg5","upper_bound":"MzQtOTkxLTc3Ny0xMzk5","repeats":1}]},"cm_sketch":{"rows":[{"counters":[218,265,206,235,232,249,256,225,264,246,237,270,259,225,223,225,230,238,275,246,243,274,282,223,223,253,265,222,251,255,216,287,270,252,272,239,238,228,261,262,249,221,266,248,264,248,271,245,222,245,236,240,240,242,243,241,240,246,243,251,224,245,239,236,238,244,238,241,212,224,233,255,231,262,227,257,231,235,222,235,254,247,246,226,245,241,235,264,235,234,242,248,228,225,260,245,233,245,237,238,230,240,241,264,255,256,210,275,275,266,263,252,246,254,247,249,259,250,227,225,229,251,241,220,220,238,247,239,259,240,213,260,256,238,261,257,243,250,243,244,258,254,255,228,251,234,234,235,248,261,263,225,253,230,219,245,256,259,234,228,264,244,264,231,247,237,248,253,244,278,260,242,210,257,229,220,236,244,238,246,233,260,278,245,199,238,238,259,258,238,271,232,256,225,258,236,238,246,231,267,284,261,242,254,233,233,249,250,234,263,227,257,256,250,263,241,271,254,227,276,259,235,268,240,260,263,233,226,234,223,255,241,243,241,273,258,238,224,256,279,264,239,270,253,229,212,231,249,215,258,243,224,264,261,238,253,241,251,223,262,235,262,244,252,306,227,224,214,250,255,251,266,241,257,257,234,260,253,287,252,250,222,246,233,264,213,255,263,231,278,232,213,246,223,265,268,253,255,233,226,250,254,241,282,219,222,260,233,241,260,249,220,252,226,230,253,235,253,249,249,215,255,229,246,240,267,252,242,240,247,221,242,247,215,235,239,230,249,244,247,276,241,238,273,251,265,251,236,269,233,235,235,261,220,232,268,232,252,241,256,253,213,253,238,233,233,231,238,226,247,237,246,264,248,248,260,249,246,275,243,245,229,246,250,226,256,265,231,225,245,233,259,268,242,233,226,240,236,247,218,249,247,256,263,269,235,253,229,213,222,251,242,212,229,216,253,238,231,243,239,265,262,209,247,212,251,254,254,237,251,256,274,253,236,229,260,213,223,259,267,230,266,239,248,241,212,245,235,239,271,241,249,227,242,264,251,266,260,250,251,220,213,220,238,250,234,234,246,254,236,246,253,212,237,267,249,235,221,237,216,257,259,249,236,233,255,228,248,239,231,254,242,249,280,234,251,249,254,230,240,248,227,258,239,221,263,263,245,250,246,239,242,260,260,269,244,248,244,247,235,239,247,241,251,244,226,242,243,231,269,251,248,233,252,252,225,238,255,226,240,230,238,261,219,240,264,245,247,253,251,240,226,246,239,231,255,244,251,264,256,215,250,228,247,251,253,246,255,240,257,261,240,258,266,230,251,262,249,257,242,236,249,240,244,252,250,235,256,258,261,264,228,231,250,237,260,225,227,258,230,227,213,248,242,258,232,218,220,257,224,254,262,270,229,247,254,255,263,226,227,254,243,226,258,257,245,249,242,246,264,227,249,233,235,249,232,254,266,225,250,227,253,251,245,235,239,228,237,242,229,225,229,229,256,233,269,233,253,273,275,263,228,244,243,218,257,249,257,219,229,238,240,234,226,240,236,233,245,251,247,254,221,264,238,233,243,229,234,249,222,247,247,248,256,266,265,263,221,240,251,234,266,253,261,248,228,216,255,233,219,245,240,260,245,253,234,233,248,220,233,246,251,255,244,248,254,235,247,210,261,243,234,243,220,257,247,234,256,254,247,241,257,219,219,261,248,252,238,224,236,255,224,233,258,241,272,237,245,221,244,219,272,235,247,240,247,263,269,229,247,253,249,233,241,262,249,228,269,241,255,207,266,226,231,230,261,237,246,236,264,262,223,245,256,241,268,265,232,217,239,252,248,229,208,213,250,238,268,247,247,233,227,236,245,262,247,245,254,250,249,251,222,255,256,248,239,232,245,211,236,245,235,261,246,223,243,257,235,219,260,230,231,255,235,260,263,258,281,239,248,260,241,231,241,210,255,249,244,249,268,246,241,236,253,251,245,239,245,259,228,220,236,253,236,251,226,251,266,238,232,259,225,233,241,272,241,264,244,236,234,241,248,232,242,230,216,224,234,240,254,226,245,248,244,258,245,241,255,247,246,246,223,219,253,225,268,221,267,223,252,242,249,232,239,221,233,249,271,257,248,264,229,240,244,240,252,255,251,238,245,274,249,253,243,256,254,252,242,265,243,242,257,237,235,257,259,221,234,250,218,225,250,238,267,235,269,259,237,242,250,216,234,224,257,249,249,247,239,279,268,252,246,247,262,272,257,222,246,252,216,235,261,239,252,235,229,233,227,231,273,228,268,242,233,265,255,255,246,248,231,250,246,255,245,234,246,254,268,217,267,275,246,265,278,267,238,233,240,224,208,252,253,216,222,252,232,228,243,257,249,257,239,278,240,233,268,256,256,258,221,252,234,236,258,258,239,242,239,251,242,243,268,262,233,230,257,231,258,225,254,243,234,257,222,217,250,244,250,274,243,263,243,248,241,245,249,241,226,243,279,222,243,248,261,253,241,255,265,250,216,241,228,252,234,236,251,237,244,238,242,244,216,261,229,214,227,255,241,244,251,231,260,216,239,249,243,249,235,218,243,241,224,226,235,246,249,236,233,258,225,245,201,252,231,240,231,259,261,262,258,244,228,277,242,264,261,236,245,261,265,236,242,233,232,272,264,270,238,224,234,253,229,218,243,245,242,229,234,256,248,223,242,243,251,255,224,243,228,289,205,260,244,247,254,255,239,239,255,249,224,286,251,240,262,244,259,238,237,260,258,271,266,245,236,241,247,234,251,262,266,242,198,242,236,237,238,261,236,264,244,248,257,253,250,254,260,255,247,223,232,254,259,224,279,245,240,255,231,251,267,246,245,256,258,265,224,241,237,240,222,266,236,272,228,226,250,236,224,240,263,267,232,254,234,222,243,255,242,221,226,218,241,241,259,243,206,245,232,242,247,218,250,244,255,249,240,226,229,229,243,239,241,287,235,214,231,238,267,233,240,219,229,234,225,246,244,259,244,253,263,244,236,241,290,232,250,249,272,263,247,236,229,260,241,261,238,269,256,237,237,258,246,245,241,201,220,260,225,231,240,252,246,251,242,236,233,230,251,235,244,224,231,229,253,245,233,244,232,240,250,240,209,208,235,250,255,255,241,254,226,249,246,242,267,288,267,228,267,213,243,230,234,242,278,244,231,254,253,258,248,270,240,253,238,254,223,260,243,257,225,269,259,254,249,259,240,223,246,243,264,238,223,229,223,252,244,238,240,216,258,215,231,244,226,248,248,227,251,240,222,249,260,274,253,254,234,241,245,255,239,236,224,253,232,240,231,241,259,264,261,232,244,209,237,242,237,242,252,258,216,229,244,249,249,244,250,222,246,265,249,257,265,253,243,244,277,257,240,252,217,227,264,271,273,226,254,272,236,255,273,232,239,242,248,242,225,250,249,273,228,205,215,234,253,244,247,255,250,248,252,257,226,245,238,243,234,257,253,236,242,256,232,237,260,250,267,256,244,242,257,243,238,269,245,212,273,262,251,259,237,259,224,235,225,238,249,267,251,234,209,233,257,272,247,245,253,272,255,231,209,238,257,252,258,233,235,242,250,248,230,221,250,214,226,248,226,210,249,241,211,255,224,266,262,229,252,264,255,235,247,248,237,249,261,240,231,239,217,275,238,246,219,245,241,236,259,262,244,258,206,247,250,217,244,270,268,234,238,241,239,249,225,235,275,226,224,233,254,248,258,232,264,240,258,239,269,249,243,222,242,250,262,258,234,246,248,215,240,223,213,250,252,233,236,231,241,239,230,238,250,233,229,251,266,244,241,239,241,241,240,273,252,236,226,245,224,274,229,232,248,260,258,247,234,252,237,256,242,248,254,264,226,199,231,230,246,255,257,267,264,244,230,226,216,258,248,258,261,261,230,234,224,245,259,228,231,235,241,251,253,238,244,230,248,246,255,234,255,260,218,258,253,246,219,228,240,227,232,259,248,250,210,249,230,224,269,267,240,241,234,272,239,271,233,253,248,249,238,242,219,256,274,267,252,237,248,226,226,254,225,224,243,270,246,261,232,275,244,242,230,250,244,232,272,271,230,273,246,257,237,237,246,254,238,233,235,257,230,243,232,219,221,258,221,261,237,242,258,255,244,258,245,250,244,241,255,254,264,227,253,268,248,281,227,219,249,234,248,262,242,259,240,252,241,228,246,249,253,232,278,236,218,238,251,267,241,244,225,255,254,250,232,267,226,243,251,246,252,260,236,247,264,244,265,213,244,238,272,257,228,257,246,267,225,267,269,209,240,254,229,224,263,253,235,251,243,240,256,241,257,261,228,238,227,246,236,233,268,244,250,220,233,253,235,215,228,263,235,238,273,232,271,249,245,231,262,231,238,228,244,225,228,258,241,226,239,262,259,237,211,242,247,242,246,238,214,244,263,239,226,234,234,256,231,242,212,251,287,252,241,241,239,241,228,226,238,240,243,279,239,223,235,222,245,245,284,249,245,275,251,246,270,248,257,236,246,260,231,232,249,256,248,266,240,246,234,249,219,258,225,218,240,220,234,244,244,261,254,220,239,229,268,259,262,253,281,249,266,248,266,242,252,256,267,233,240,233,264,257,225,254,238,242,248,245,252,228,250,237,258,241,261,214,227,246,240,247,243]},{"counters":[234,241,249,261,247,228,220,243,219,226,243,244,279,263,237,249,240,253,244,237,233,233,263,222,236,200,262,249,278,263,240,240,248,252,239,245,249,249,240,242,251,259,247,216,237,242,235,256,263,254,243,248,257,228,236,259,270,255,256,241,229,288,261,251,241,252,215,264,249,212,248,260,252,250,230,236,243,252,241,232,263,265,218,250,244,240,243,261,219,232,263,230,255,245,251,268,231,235,247,248,239,266,256,251,249,255,242,253,262,229,225,294,253,243,235,253,231,243,216,216,259,233,211,241,235,240,267,241,227,242,242,239,237,252,250,253,230,246,244,254,249,237,230,201,219,219,246,228,251,235,230,241,225,250,239,266,253,245,242,247,256,252,226,233,214,279,240,233,270,262,245,235,248,237,240,247,235,226,231,236,212,241,210,262,244,248,259,247,254,226,225,263,240,248,224,250,227,236,256,238,241,246,251,245,244,285,262,251,287,239,241,249,255,254,234,240,256,233,240,255,295,242,221,240,257,225,254,222,250,249,251,216,267,274,238,238,217,246,266,226,227,239,251,249,235,259,253,219,251,241,220,251,209,242,266,237,217,250,287,242,227,231,263,250,208,246,221,273,248,220,248,248,243,231,238,249,239,239,257,238,248,241,229,242,255,259,261,230,250,244,239,242,241,255,228,230,234,260,263,213,224,266,231,246,241,229,227,252,226,246,274,241,271,250,248,215,257,274,265,246,239,244,270,236,238,268,243,263,228,239,236,242,274,294,245,283,279,249,258,267,221,222,249,237,251,251,244,242,254,272,251,257,262,245,243,251,279,234,229,234,216,226,266,273,257,245,240,239,251,233,245,250,250,259,249,210,261,246,229,219,250,270,235,235,244,248,227,240,267,235,266,254,208,250,248,251,225,245,239,229,234,240,268,258,278,231,231,231,251,232,246,254,220,229,263,240,207,229,260,254,218,251,253,252,259,277,225,233,249,242,231,239,243,258,263,237,240,251,219,238,216,261,226,253,259,237,224,262,242,255,253,245,247,235,219,245,246,257,253,248,218,266,212,253,267,252,220,213,242,259,249,255,259,237,253,256,254,252,265,242,275,266,247,239,248,238,208,232,245,239,258,250,249,245,226,235,267,245,238,250,257,216,232,246,248,243,239,265,230,238,241,231,258,244,234,220,245,231,239,257,239,262,276,214,287,246,255,253,249,227,235,245,227,255,249,241,230,252,248,247,252,255,246,269,210,265,249,271,223,261,253,270,250,233,251,240,248,239,248,236,249,270,225,223,242,249,242,232,240,264,252,231,250,262,231,250,227,242,248,235,241,225,237,240,253,246,260,223,253,243,251,253,243,223,277,227,250,243,231,231,238,256,232,247,252,265,236,237,242,208,258,227,252,262,243,270,252,249,234,224,247,240,221,252,229,264,250,229,270,247,242,251,224,252,220,267,239,253,245,211,286,270,250,227,235,254,257,237,241,239,232,254,281,246,254,256,216,220,265,214,256,253,269,255,233,247,253,234,228,245,247,223,236,246,245,267,233,249,249,270,248,232,259,217,217,240,240,233,249,249,272,241,256,231,249,260,244,257,230,237,244,239,215,235,251,238,233,243,235,257,250,252,257,239,224,256,245,253,277,244,247,245,251,244,231,219,234,215,227,227,244,233,230,225,233,251,262,245,266,229,271,234,251,262,239,221,211,250,254,240,248,245,240,273,208,268,267,242,261,231,232,246,241,252,249,253,213,251,247,219,229,252,270,247,246,267,251,243,231,228,246,260,232,246,217,246,230,217,258,262,261,269,246,228,249,270,225,248,265,213,230,264,240,237,229,234,257,260,232,220,239,238,228,227,222,248,233,243,232,239,271,267,217,253,238,242,245,235,230,236,240,248,220,241,253,254,284,272,241,195,258,257,248,265,254,246,230,237,222,237,246,234,244,262,245,223,245,253,238,233,274,246,236,225,256,223,245,245,239,251,245,249,225,253,230,215,247,249,240,239,241,258,241,267,257,239,245,248,238,264,250,229,218,265,268,235,210,234,262,245,252,243,271,239,273,236,253,255,245,225,252,255,253,250,240,244,253,226,241,222,239,244,236,244,237,261,252,235,232,232,235,239,232,252,262,240,264,235,239,255,270,280,240,229,241,264,235,242,238,242,269,266,233,220,219,233,263,264,255,227,255,246,242,229,218,214,253,221,252,267,228,232,249,228,206,220,249,244,254,260,248,271,236,234,237,228,229,266,212,251,264,223,280,245,261,262,246,258,262,223,239,266,255,263,229,243,235,236,229,221,265,228,245,244,246,235,275,212,235,258,232,233,244,232,237,246,236,245,221,262,223,234,255,246,239,245,234,214,280,265,224,214,234,227,260,251,229,272,238,228,246,255,267,244,234,202,226,252,244,243,257,231,247,237,239,238,249,213,247,245,233,248,224,250,230,264,258,271,271,245,246,264,233,281,242,237,245,252,265,238,254,242,218,265,240,245,242,266,232,239,226,255,211,219,237,255,235,235,255,235,251,239,240,222,260,243,235,243,239,230,205,230,243,234,240,254,242,229,250,250,259,249,271,221,251,229,261,267,258,276,261,265,238,260,252,254,267,245,257,230,258,274,261,243,244,255,250,248,252,229,260,232,247,233,218,248,254,239,254,239,257,230,245,258,232,259,233,256,252,245,254,218,255,254,222,220,238,219,211,248,242,251,239,237,275,221,249,259,235,249,227,245,245,282,227,253,260,243,235,254,264,238,235,267,255,257,226,282,248,239,271,231,260,262,237,250,248,240,265,245,232,276,253,249,229,271,246,223,226,239,259,245,215,239,249,232,256,235,234,265,232,251,291,260,257,263,237,278,211,247,247,237,254,235,251,251,241,243,234,246,242,237,228,244,270,254,250,221,221,270,264,260,266,260,237,224,249,257,223,212,245,242,266,238,254,278,254,239,236,246,222,229,265,243,249,240,248,254,233,213,254,238,230,235,259,234,256,256,257,271,261,260,255,245,251,244,239,236,231,224,239,258,245,260,227,230,254,234,249,267,274,232,235,267,218,211,266,243,254,251,243,232,254,246,231,237,266,252,241,257,238,234,238,247,218,233,262,261,254,230,259,230,234,223,242,228,220,234,221,227,226,256,249,237,234,244,232,261,256,224,274,248,227,222,249,254,236,247,230,238,234,246,244,270,243,234,223,269,250,253,234,261,259,244,276,241,231,233,234,242,260,242,237,238,245,256,217,232,240,235,257,237,241,218,250,270,240,219,250,278,239,253,250,249,220,235,241,233,248,258,258,239,262,243,236,245,240,236,216,224,262,226,229,267,232,242,258,238,264,244,250,255,249,236,233,229,263,237,247,246,273,232,258,248,242,249,248,263,265,274,258,263,213,241,252,240,251,260,224,244,244,222,222,228,223,233,209,266,242,275,248,245,235,253,251,253,268,233,238,231,248,239,257,242,262,233,254,260,229,277,265,223,275,214,244,215,274,229,266,221,246,227,249,247,242,240,271,257,261,245,221,248,247,222,219,230,253,263,249,245,252,267,232,259,238,264,235,276,257,225,248,230,249,254,255,235,210,263,220,271,261,258,244,233,244,251,243,266,250,257,239,251,269,254,252,216,245,267,265,246,248,240,218,257,244,261,256,244,247,246,238,242,248,251,245,235,235,233,238,232,226,228,237,220,251,252,244,225,270,245,227,251,261,232,247,264,264,258,253,232,253,244,277,218,254,234,259,258,246,258,242,232,244,249,261,243,251,240,244,267,246,226,258,264,278,240,259,230,243,241,225,231,252,238,245,246,264,224,250,259,240,251,270,247,279,251,280,236,254,224,256,256,248,273,247,271,239,217,266,253,250,232,272,231,274,224,270,244,250,239,222,264,213,236,244,250,236,265,261,227,208,224,256,237,258,253,234,233,201,239,233,254,230,234,245,243,239,261,254,255,254,254,236,214,248,216,233,283,235,230,245,275,224,226,232,233,260,258,243,225,255,228,236,246,223,252,247,243,259,258,230,245,245,235,243,223,240,242,244,246,250,244,242,233,254,231,231,256,225,224,249,272,252,253,237,253,265,258,266,254,263,265,239,235,239,236,249,255,225,252,244,227,241,261,251,257,251,239,249,223,233,249,247,244,235,250,249,238,254,252,208,243,253,256,233,264,263,253,269,215,250,256,243,258,258,246,233,215,256,244,244,226,225,252,249,267,250,211,247,257,261,219,220,221,248,242,246,238,221,240,255,253,259,221,237,245,245,230,250,227,265,258,211,246,223,223,261,251,257,245,236,232,245,232,226,261,242,229,251,244,227,200,234,274,216,241,206,238,231,275,226,221,218,263,227,254,236,269,235,310,218,238,223,234,213,240,229,241,238,224,228,241,255,229,242,241,247,223,237,221,230,226,233,266,248,262,209,207,246,252,243,249,249,253,214,258,239,235,243,235,230,245,239,272,250,243,270,245,254,227,241,218,244,257,238,256,223,238,237,238,235,253,239,209,260,247,240,232,250,255,231,251,235,217,215,235,273,242,228,258,249,263,259,225,261,271,226,235,272,203,258,260,235,237,258,250,249,237,230,241,234,239,231,253,215,267,220,243,244,253,269,238,245,261,256,237,243,252,244,271,258,236,251,273,237,215,251,256]},{"counters":[240,258,249,249,260,261,231,220,234,258,258,246,244,261,247,263,233,213,274,208,225,257,240,226,247,215,265,237,231,264,224,245,231,224,230,212,272,223,237,254,245,244,247,222,239,238,242,224,226,240,266,235,262,256,251,245,255,203,255,245,219,268,242,229,236,251,234,246,222,243,290,234,262,251,242,246,238,245,257,266,240,263,246,254,237,259,254,262,251,261,240,246,255,255,237,255,230,257,248,255,255,234,223,241,224,254,286,256,251,262,244,270,275,215,238,254,231,262,238,228,246,256,254,266,273,239,264,248,249,243,264,229,227,221,239,242,236,224,221,242,229,242,245,224,247,239,250,229,244,233,248,255,252,235,263,253,232,265,246,212,246,261,242,245,245,246,260,237,259,291,249,257,256,251,250,253,255,235,254,241,266,265,220,243,252,237,238,229,237,256,246,255,240,239,244,248,229,199,231,234,234,251,249,238,248,241,217,272,259,227,255,226,255,250,254,257,232,238,256,247,251,233,269,252,248,265,229,211,223,245,249,245,233,240,244,257,237,247,266,286,233,271,273,238,257,241,253,244,252,259,272,254,227,236,263,241,257,249,265,256,271,252,235,256,265,262,250,260,242,260,256,252,249,249,242,267,254,235,239,237,260,225,233,249,249,231,250,268,263,231,234,239,223,232,261,233,213,233,256,268,247,229,243,246,255,227,250,234,250,244,238,244,233,247,234,269,224,234,207,279,273,247,244,248,227,225,201,236,228,238,250,235,230,225,260,245,240,271,247,246,265,237,262,227,238,239,245,242,225,253,265,228,237,257,236,221,254,221,223,255,233,226,235,229,231,224,254,246,224,258,235,238,260,248,251,263,250,239,250,246,253,237,255,209,254,248,253,261,238,220,272,228,253,250,229,264,257,246,242,226,238,258,230,247,270,246,249,274,237,250,212,257,221,228,232,246,240,248,262,243,241,269,240,239,253,249,271,251,256,255,248,241,253,253,208,253,249,254,259,224,232,257,231,247,239,242,255,226,252,232,266,260,246,270,275,243,252,234,236,257,255,275,257,225,253,239,239,250,223,251,265,252,256,264,257,228,258,217,250,209,261,230,207,232,246,243,245,262,236,236,264,245,262,229,252,242,250,238,249,270,249,237,244,268,230,238,240,247,237,266,227,218,257,245,258,275,276,236,230,238,245,263,231,241,243,217,240,259,229,246,242,258,222,254,236,241,247,262,215,248,236,221,259,250,254,243,240,235,248,251,235,241,267,262,252,255,254,286,270,275,249,222,239,231,248,261,235,267,230,224,241,259,262,241,250,228,257,237,255,243,231,249,236,245,212,255,255,248,239,259,242,215,238,246,249,244,255,209,252,241,235,251,233,262,231,254,241,261,237,237,218,258,266,242,235,234,252,236,243,229,228,259,271,230,244,240,226,282,234,240,224,251,232,263,250,239,242,237,269,218,238,223,256,251,231,261,224,241,201,234,247,244,246,249,236,252,252,218,204,216,251,249,255,219,268,231,207,242,236,240,247,240,236,256,262,239,232,229,259,239,226,209,261,253,264,235,243,229,204,216,240,243,256,249,254,242,219,234,247,195,258,257,267,268,238,272,225,245,255,238,255,251,237,267,245,258,263,242,249,229,242,243,240,255,229,267,240,242,262,250,236,213,233,267,260,256,237,232,234,255,252,240,240,266,224,272,237,242,240,255,242,230,238,265,246,232,216,264,249,234,228,236,239,258,242,266,233,255,235,211,255,244,248,238,236,234,256,253,242,251,213,271,241,266,236,276,236,236,246,235,242,278,226,244,241,243,237,233,226,277,267,242,264,230,253,235,275,242,235,261,247,226,232,260,260,234,233,244,267,254,230,240,212,250,273,255,227,255,258,218,255,255,257,277,258,227,228,249,250,266,235,231,250,237,242,232,229,235,226,230,251,263,250,233,255,239,240,243,280,219,252,248,241,264,246,245,245,241,261,246,247,257,235,263,227,260,223,256,261,230,224,277,230,241,218,240,237,275,260,251,245,231,243,265,243,220,272,263,243,236,256,241,246,225,237,230,243,230,255,226,244,237,240,269,219,244,247,219,241,240,236,263,249,289,254,289,249,220,253,238,230,251,246,241,242,265,244,241,225,231,221,259,243,236,252,218,246,223,269,228,246,232,256,241,230,210,240,242,259,248,242,238,255,248,240,241,228,271,233,227,248,244,227,253,238,234,231,260,249,201,243,224,242,255,243,249,264,247,241,232,223,213,235,261,253,256,215,249,263,224,242,247,222,234,242,244,216,265,238,248,239,210,260,254,224,234,239,217,226,246,261,241,234,230,242,222,265,231,227,254,225,223,259,264,235,253,264,259,236,264,264,230,260,236,228,241,253,261,261,244,248,261,234,224,230,257,237,254,254,236,247,251,277,238,238,255,259,231,256,248,225,249,257,310,250,232,252,254,228,244,245,246,262,233,242,252,241,226,270,248,213,243,273,243,266,264,264,225,258,229,228,241,242,235,226,243,246,225,233,288,245,236,253,233,244,230,270,246,241,265,245,249,237,263,245,252,243,235,228,242,241,250,261,241,238,246,242,218,257,246,239,254,263,226,205,252,225,267,219,248,252,241,226,217,263,238,232,264,248,268,239,284,228,263,254,253,224,237,222,249,238,250,235,229,249,250,235,235,218,261,220,211,263,212,237,248,250,266,245,227,230,247,252,226,237,235,226,250,240,243,232,250,226,238,258,247,248,249,251,216,243,262,266,247,254,254,221,246,236,283,271,240,258,280,247,276,242,258,253,227,239,242,239,263,246,251,253,258,206,246,256,218,247,223,275,227,242,228,233,253,268,230,250,261,237,236,219,229,262,262,260,253,230,258,252,246,218,266,243,245,215,258,233,243,276,260,266,260,237,213,263,237,244,245,254,276,232,263,219,266,258,241,209,223,257,212,262,240,246,276,247,238,262,251,202,267,269,218,262,242,271,251,236,269,249,236,242,242,223,242,285,237,237,249,228,261,236,236,254,223,260,224,240,235,232,248,228,243,244,269,232,240,258,255,223,245,252,239,235,255,234,231,236,222,252,257,238,255,260,240,248,231,217,251,248,251,240,231,234,246,239,255,251,239,246,234,220,223,265,261,228,231,261,247,207,236,262,230,255,244,220,258,250,243,254,254,262,254,238,241,228,262,235,225,216,246,239,251,242,235,239,228,258,253,268,266,250,251,268,283,249,237,251,242,223,217,234,256,239,243,244,222,242,230,228,252,227,264,211,226,258,220,221,243,250,246,258,232,220,242,208,264,223,221,244,249,262,226,234,259,257,270,252,240,247,256,235,257,262,232,237,232,246,198,274,239,233,239,262,232,262,260,220,217,242,249,237,239,243,247,248,259,278,256,213,240,239,260,266,225,225,276,241,257,239,263,242,242,240,251,253,235,261,233,237,259,251,230,270,245,260,236,220,257,266,216,269,224,234,256,244,231,257,211,271,243,265,249,232,229,239,252,277,255,219,234,258,247,226,286,250,240,261,241,266,250,225,242,256,252,255,244,278,213,240,261,256,239,252,237,238,256,258,234,229,249,211,211,239,237,224,244,222,228,249,228,223,226,244,245,261,255,269,268,258,236,251,266,266,225,221,265,232,261,251,255,228,231,244,250,257,241,256,231,240,253,235,246,221,252,225,265,212,238,254,225,249,243,240,260,258,238,244,235,220,235,235,237,264,248,236,248,259,240,241,237,213,254,255,249,269,251,246,225,231,264,246,245,264,263,233,254,221,236,238,220,226,260,241,237,249,257,274,248,246,246,241,248,234,236,238,221,232,253,239,228,245,225,236,256,220,258,237,231,267,242,252,234,221,255,251,274,269,250,253,237,231,280,253,261,255,229,245,231,233,246,271,256,258,239,280,246,243,246,257,244,258,253,240,244,242,256,239,247,239,249,251,230,234,270,253,248,241,249,233,256,230,242,276,243,237,227,260,238,234,239,242,235,243,238,256,277,247,248,240,222,254,266,248,264,229,244,240,282,213,237,266,220,259,257,222,234,255,210,239,256,222,230,264,237,245,238,248,237,234,261,239,268,263,240,267,206,268,234,233,244,236,233,264,234,234,238,271,229,222,236,235,261,262,239,236,268,238,232,217,244,255,264,221,243,227,245,220,239,246,220,264,249,241,250,244,248,247,245,248,234,239,249,218,245,240,271,251,220,253,251,219,251,275,244,219,254,262,243,231,250,264,246,282,246,234,236,260,240,240,237,245,229,245,262,221,245,252,239,238,228,238,241,247,253,274,226,237,235,240,224,220,245,250,232,249,232,238,251,272,261,257,221,250,229,246,247,285,220,234,274,233,248,210,240,242,263,263,246,246,257,238,245,232,235,247,241,256,262,239,242,243,221,236,210,215,232,259,253,258,199,237,234,256,239,218,217,225,236,256,241,259,251,234,226,254,263,255,222,234,207,223,218,238,237,248,261,230,253,272,225,234,264,235,229,232,254,256,256,271,246,253,240,219,279,248,218,245,236,261,238,281,252,229,242,242,229,226,234,236,225,229,222,230,237,283,253,238,246,250,232,243,242,229,252,255,241,239,243,247,251,270,259,218,239,250,263,249,256,273,233,241,237,263,243,254,229,250,245,237,234,255,241]},{"counters":[255,223,245,256,258,244,227,266,242,242,241,247,238,228,278,226,282,262,252,227,239,230,246,245,249,232,232,251,223,227,225,252,238,269,233,261,267,244,255,246,231,228,269,240,237,243,243,262,242,223,226,240,243,231,238,271,254,243,236,256,231,248,237,240,230,250,224,230,255,224,240,259,241,234,238,255,249,242,244,260,267,251,270,252,243,222,262,271,224,234,249,233,241,255,241,263,237,242,265,259,255,240,231,236,251,277,229,248,241,252,213,245,276,248,276,233,235,244,253,230,251,236,217,232,255,218,234,252,246,218,252,247,239,226,224,281,227,235,228,248,232,243,264,234,262,259,226,256,270,273,235,225,270,230,235,231,253,245,231,230,266,241,228,228,278,249,245,240,260,250,228,250,222,279,252,270,213,226,247,229,222,250,240,218,253,248,246,260,249,274,259,243,223,218,258,265,211,247,286,228,235,238,271,260,233,251,236,234,245,235,251,239,246,233,232,247,248,217,225,248,271,206,248,208,254,257,271,250,223,211,232,239,260,264,247,234,245,277,239,232,229,259,234,223,232,261,247,235,244,225,264,277,272,235,249,250,234,268,225,244,251,246,228,226,245,230,220,270,232,251,223,227,226,258,215,231,254,252,259,241,268,234,239,260,219,229,237,262,273,239,240,243,236,244,277,238,214,274,214,229,226,256,236,249,230,252,241,259,242,243,237,255,262,255,277,238,258,245,222,232,257,245,249,245,248,244,258,242,241,241,241,257,247,245,237,249,243,227,222,230,240,232,223,263,240,236,243,265,239,253,261,245,231,237,242,238,232,251,253,229,256,240,252,243,265,238,254,243,245,217,268,236,209,271,253,244,263,246,242,254,238,241,233,227,251,228,222,239,240,253,260,246,239,218,245,267,232,239,243,235,270,246,209,229,256,252,259,215,222,261,263,233,244,222,250,269,230,259,233,237,249,242,265,199,272,254,265,227,230,241,231,249,264,240,256,249,243,238,226,240,237,227,248,231,239,265,244,227,230,255,246,241,271,246,259,268,244,219,258,259,255,237,234,247,249,241,287,239,262,236,221,226,242,223,248,233,218,235,222,256,231,237,232,288,254,233,230,256,233,237,255,241,234,250,216,233,245,236,278,256,260,223,262,222,254,245,253,264,244,260,230,242,252,254,223,242,228,266,252,213,230,275,250,225,256,241,242,287,218,237,234,264,235,256,252,250,235,239,213,259,239,195,249,255,245,266,232,272,255,221,261,220,249,236,248,237,265,238,220,243,241,248,221,259,268,236,243,260,259,247,256,241,265,246,264,241,243,238,241,235,251,258,258,240,249,240,249,222,254,247,242,246,267,254,244,236,259,247,249,261,255,227,232,251,247,230,225,213,221,219,246,256,259,202,293,233,262,233,226,236,226,251,277,257,252,241,254,243,257,252,235,249,237,243,198,236,251,269,236,245,240,253,276,247,245,264,227,240,242,211,231,274,220,203,261,224,225,241,222,253,253,231,222,247,261,249,251,257,228,266,232,221,236,240,236,247,223,244,236,237,231,222,239,216,251,249,258,225,240,228,222,234,241,254,264,251,248,264,270,226,252,221,217,249,217,241,257,232,224,217,233,233,247,223,215,248,245,233,250,218,221,228,248,228,246,249,248,253,272,250,224,263,224,239,226,237,224,283,253,254,239,252,254,268,224,254,240,236,228,255,235,275,264,239,274,250,217,268,241,255,249,241,206,244,251,220,229,272,254,257,216,254,240,234,262,255,245,248,225,255,234,269,237,235,233,257,230,256,273,230,237,232,252,255,238,229,242,228,262,230,248,265,263,220,273,231,239,243,241,260,258,262,244,218,245,256,251,239,268,234,248,258,240,264,268,242,238,236,263,240,251,250,251,252,213,266,254,233,254,224,228,220,235,243,242,243,231,244,241,238,221,249,251,250,253,256,261,250,224,253,239,233,237,258,221,234,240,256,215,239,228,236,248,252,255,262,256,259,240,245,238,228,228,262,270,223,244,238,261,231,265,242,260,250,258,254,260,251,240,234,237,223,250,244,257,254,259,251,263,236,232,243,258,203,231,243,243,225,271,250,255,261,228,213,234,244,234,275,245,257,240,236,231,254,259,227,235,254,234,235,234,231,256,247,255,230,240,245,239,256,236,257,230,306,239,234,246,220,220,240,265,265,259,248,252,210,245,256,257,263,229,241,242,217,250,256,249,234,222,240,228,216,251,234,224,260,249,262,263,253,208,252,265,249,222,291,277,250,273,227,246,258,242,267,226,255,272,234,231,243,242,227,248,242,257,261,222,242,266,215,273,264,264,228,276,242,235,284,236,248,263,243,235,249,244,229,244,254,261,222,224,225,252,234,243,245,222,231,235,215,258,260,239,269,252,215,247,242,231,240,247,245,267,231,248,253,232,228,243,241,231,247,248,221,255,263,239,241,229,227,233,250,264,237,226,264,240,244,213,222,269,254,283,247,262,205,251,234,259,251,224,240,234,246,246,244,231,243,223,244,256,243,242,224,236,260,272,230,235,260,230,240,252,247,225,242,222,250,222,249,252,245,227,253,217,193,225,252,229,226,219,251,221,246,257,230,242,255,210,244,230,218,237,237,273,256,216,251,254,208,241,233,249,259,232,270,275,242,256,231,230,256,241,253,241,245,272,203,216,233,263,242,220,240,238,256,260,237,261,264,236,257,240,265,244,235,255,247,249,265,248,234,241,245,250,238,221,235,243,254,246,265,254,237,244,238,243,254,228,236,262,241,245,247,262,253,243,266,242,254,223,241,253,232,232,270,269,248,257,245,233,256,229,253,227,223,243,231,256,256,247,265,254,253,264,237,229,229,238,255,269,247,238,252,258,243,233,249,265,235,242,238,248,244,235,224,226,199,267,260,231,216,241,236,267,220,245,234,256,246,244,248,266,242,261,236,243,268,221,223,217,235,218,253,259,258,257,232,256,258,254,244,235,246,214,241,258,251,251,240,245,220,275,229,224,214,231,240,256,269,284,236,236,209,235,228,248,252,240,237,258,247,258,239,254,219,240,248,254,271,233,225,226,215,253,230,240,247,257,252,252,232,239,233,236,252,252,245,242,273,253,241,254,240,243,248,252,223,229,244,287,244,250,259,242,250,267,247,248,244,261,243,260,201,233,273,273,231,229,284,235,270,246,252,232,257,237,241,254,240,290,271,249,220,224,236,247,216,231,238,249,256,253,266,260,264,245,251,239,257,223,230,240,267,203,242,239,229,246,221,226,226,236,244,243,271,264,233,236,235,256,247,250,242,238,247,221,216,215,244,245,257,217,265,241,249,259,270,245,233,265,240,226,215,266,259,234,233,251,240,237,236,258,250,251,270,258,291,271,237,262,224,241,235,224,267,255,232,239,233,240,245,242,238,265,243,244,248,232,254,234,262,221,277,281,256,239,231,238,216,266,235,242,241,244,267,233,245,244,266,248,285,275,209,223,256,240,251,244,234,237,218,271,269,233,265,244,235,244,240,232,241,250,255,224,253,253,248,243,247,227,260,249,264,237,254,233,235,218,243,232,270,217,262,254,250,259,231,259,248,239,234,244,232,249,260,237,229,251,228,266,256,242,240,239,259,232,228,259,242,237,244,226,246,241,223,210,266,253,267,258,241,251,268,252,243,265,235,241,282,231,258,216,267,248,253,224,225,246,267,270,256,251,229,257,263,265,236,233,216,233,237,250,228,238,237,239,231,253,242,233,250,225,266,242,246,259,241,241,212,247,225,245,250,219,242,225,238,269,251,245,236,296,246,223,215,232,256,232,240,254,251,255,233,222,268,259,245,252,230,239,264,229,221,258,241,251,244,234,242,261,230,250,232,235,245,238,255,252,247,249,272,239,251,257,264,233,229,229,264,253,286,250,246,253,243,217,261,271,287,238,230,233,255,246,253,235,228,256,242,244,227,267,234,232,257,241,266,245,240,244,240,241,243,247,245,267,239,252,247,274,235,251,242,275,237,251,243,225,234,260,273,235,237,213,254,259,262,233,237,267,258,236,262,241,224,260,221,232,237,243,234,231,256,242,241,262,263,249,237,254,239,252,234,215,238,234,266,224,245,237,257,260,244,248,233,245,248,244,280,243,238,244,254,236,234,256,242,254,242,243,281,248,242,263,239,246,257,263,244,258,238,247,256,227,262,263,254,255,242,249,255,229,276,218,224,229,229,269,265,234,239,226,223,239,243,234,244,266,246,271,268,245,229,273,252,246,288,282,270,265,241,280,279,239,239,221,241,240,270,247,269,232,252,240,244,259,234,250,235,278,271,236,237,263,233,239,249,224,228,284,239,267,237,241,224,261,270,244,275,237,248,236,246,240,236,255,258,270,236,237,253,268,233,249,236,244,239,249,246,237,263,262,247,232,229,238,233,232,237,255,241,238,261,241,249,255,256,228,259,249,228,207,258,242,260,239,249,235,251,239,224,242,256,246,248,252,231,232,250,221,246,248,205,244,260,229,235,238,238,248,250,232,261,225,247,252,266,242,273,241,248,243,251,246,252,258,250,287,245,240,263,234,230,241,225,240,234,241,237,231,237,230,236,244,252,220,231,241,259,220,247,247,247,239,248,231,213,269,227,232,251,202,227,237,255,223,245]},{"counters":[260,232,248,262,269,267,243,239,243,264,250,233,243,227,227,246,238,231,254,219,230,219,235,239,229,237,251,255,243,250,258,236,232,219,249,232,268,240,219,255,231,255,207,229,235,219,262,229,250,239,253,255,264,260,252,267,243,247,258,237,250,258,261,255,235,262,264,246,240,245,251,237,244,249,235,250,250,239,257,239,247,222,228,234,253,252,271,226,226,211,241,239,255,246,255,252,262,232,256,249,251,263,250,241,249,275,221,271,213,229,236,232,244,272,232,233,225,237,266,232,219,226,247,252,248,275,264,235,257,233,235,258,240,226,259,224,263,248,260,251,252,235,250,226,256,246,232,245,251,243,217,228,236,237,224,230,208,236,255,248,269,252,252,232,242,265,260,283,223,245,238,230,223,256,241,243,238,250,232,232,236,255,250,256,233,250,227,270,272,242,250,247,227,233,235,242,256,257,248,268,217,221,244,231,271,207,239,249,229,245,251,244,246,251,231,259,228,215,246,255,251,235,240,227,233,221,267,236,249,240,248,235,251,247,252,234,247,240,259,256,257,246,253,225,264,230,250,259,259,232,251,239,251,252,267,245,224,251,240,233,233,240,226,237,243,219,258,247,233,248,265,262,248,238,271,254,221,231,231,218,290,245,251,242,251,262,255,261,245,252,253,249,223,263,238,240,266,278,248,251,221,245,267,222,243,254,238,245,255,216,226,250,261,250,222,233,231,233,253,230,245,250,247,242,221,229,229,253,245,258,266,240,272,234,240,251,261,228,244,238,257,255,241,245,238,255,248,259,274,234,252,243,210,269,247,247,242,223,247,234,259,263,224,212,265,261,236,251,270,269,242,220,256,258,241,199,249,236,265,252,246,228,229,250,252,208,197,253,259,257,250,259,250,237,245,239,240,238,217,226,234,268,242,244,247,232,221,261,250,253,273,228,226,255,218,248,233,237,245,249,227,227,243,240,264,231,225,239,246,233,250,232,219,252,262,264,248,257,220,267,258,262,233,247,206,237,233,244,243,230,246,232,233,246,236,264,236,219,234,256,248,238,240,226,262,223,276,247,227,271,241,233,259,250,252,220,261,246,257,237,291,257,254,258,234,265,258,266,240,258,230,241,262,285,273,233,230,252,231,279,207,275,237,254,273,263,245,255,256,222,273,262,238,240,252,244,280,268,241,246,231,247,282,218,253,238,253,199,232,225,234,229,283,222,230,267,253,236,237,267,226,230,246,234,257,251,268,245,255,226,246,232,259,283,228,251,251,242,242,213,230,208,252,246,257,241,242,249,229,244,238,225,254,235,261,230,262,234,252,255,248,233,224,255,260,235,246,252,240,275,272,254,262,291,260,250,234,259,257,262,241,254,263,253,241,233,255,260,251,256,249,241,258,250,246,220,242,244,250,241,251,231,222,249,243,239,254,244,253,224,252,225,230,252,231,236,217,231,244,263,267,229,231,248,256,247,255,249,234,264,259,242,273,236,234,270,248,234,237,256,222,242,256,264,251,257,246,250,253,235,246,234,257,249,241,256,261,247,229,233,240,236,229,210,248,248,229,246,251,237,226,258,249,214,266,247,247,271,262,256,233,244,264,253,240,258,247,250,236,246,240,238,239,267,252,200,239,245,246,227,228,256,270,212,243,229,232,225,245,237,241,258,250,231,243,259,267,221,245,227,238,209,254,250,227,252,246,233,266,261,259,261,231,265,227,217,228,225,225,222,252,258,269,254,242,271,237,260,231,220,257,254,252,207,229,233,243,232,263,244,232,271,231,234,260,228,248,255,255,231,224,281,228,236,258,235,224,258,236,264,246,253,228,256,237,241,263,245,262,235,243,259,201,260,259,261,243,252,253,216,253,227,254,283,259,244,249,246,233,269,241,246,241,219,261,222,270,221,251,247,244,269,207,253,230,258,236,233,265,268,245,243,239,259,249,247,255,227,248,238,254,281,240,244,243,267,264,236,263,257,223,244,255,248,248,239,229,241,254,261,230,232,250,249,216,256,224,231,250,225,250,280,252,251,246,220,251,254,229,273,253,234,269,239,272,266,250,229,235,236,229,252,253,245,271,243,229,226,223,246,236,258,268,262,244,216,213,223,272,250,262,282,249,256,256,233,268,239,257,260,230,253,243,238,236,231,273,277,259,267,255,242,273,239,248,243,269,239,244,257,236,239,275,240,244,253,237,250,239,262,236,237,249,233,251,231,248,221,244,234,265,273,238,248,276,263,224,247,245,239,269,241,238,242,236,261,251,225,221,244,221,238,221,242,224,265,273,243,261,247,256,266,274,230,237,265,256,240,241,245,254,207,259,233,252,233,273,271,241,244,245,235,265,267,219,235,209,244,235,260,264,238,256,243,258,272,234,197,260,241,231,213,255,229,241,234,232,255,222,267,243,272,248,259,245,235,230,218,247,238,229,235,245,240,239,235,275,244,242,228,203,223,246,269,250,227,245,270,241,242,200,262,243,239,237,221,268,255,236,222,225,231,233,235,235,236,263,257,222,246,261,226,251,246,254,280,265,258,258,222,259,274,237,271,204,234,232,235,236,244,256,238,266,248,260,221,257,265,219,220,223,241,264,249,244,229,222,248,238,238,250,233,237,243,244,230,273,239,229,251,246,232,252,237,213,259,238,273,222,241,257,265,224,230,249,247,226,246,258,248,236,242,238,247,242,241,250,229,234,260,225,236,250,263,241,241,245,232,260,254,247,273,243,268,232,254,252,248,250,250,233,258,211,229,234,265,257,233,246,235,246,250,251,227,273,244,219,222,230,266,254,227,250,252,267,263,251,261,258,253,221,261,252,255,239,240,242,245,256,265,248,222,245,280,239,252,248,248,239,249,245,258,226,249,235,249,232,241,283,229,263,228,244,234,246,245,268,256,264,257,256,250,242,244,265,220,213,228,225,237,248,245,242,246,228,259,249,224,224,251,243,224,228,244,206,245,247,231,258,235,250,246,222,251,294,232,235,254,237,245,239,252,228,230,259,235,232,226,248,248,254,279,276,240,224,224,223,230,210,257,259,238,234,258,233,257,242,240,245,216,255,261,254,262,239,273,241,232,245,241,245,216,229,237,245,253,230,239,242,246,246,234,230,229,248,241,244,238,270,238,255,257,269,275,236,271,235,244,215,260,249,262,248,224,236,234,254,271,226,223,231,258,225,251,234,259,266,258,232,249,259,247,225,254,234,241,227,266,226,233,231,266,241,231,238,261,257,237,265,230,251,235,236,225,226,227,235,240,239,221,223,243,242,243,252,235,230,246,224,248,253,236,221,236,258,260,208,258,231,229,260,234,240,256,214,255,250,251,223,262,274,227,260,243,236,236,269,255,238,242,232,249,226,238,229,242,246,250,238,233,240,245,253,245,256,238,228,238,242,236,236,264,248,252,249,250,231,230,260,226,211,258,244,239,223,223,237,255,253,246,243,239,250,239,263,253,249,245,236,260,234,235,243,252,223,256,199,267,239,268,240,229,273,260,249,227,245,265,249,225,253,248,233,265,223,224,245,254,245,241,232,290,220,238,234,238,282,252,251,233,233,201,254,221,270,241,236,240,244,230,245,254,231,259,252,265,227,235,214,241,230,259,214,229,269,230,245,258,245,254,250,244,229,249,231,238,260,240,255,257,232,241,239,227,249,245,242,258,243,234,240,248,202,244,255,227,221,212,242,258,262,232,238,249,260,234,229,221,244,255,259,248,250,258,237,245,235,218,253,263,227,237,201,237,222,239,237,254,270,244,237,230,242,224,232,260,256,251,269,218,258,242,249,258,242,245,231,211,239,240,282,265,228,231,244,251,258,221,227,265,246,245,248,258,221,241,216,260,229,229,269,247,251,226,208,215,229,275,224,234,277,233,261,208,223,251,238,225,218,228,258,266,253,254,249,257,239,248,224,261,240,264,248,218,221,255,229,259,259,238,250,268,229,228,264,218,245,289,214,256,268,242,249,258,251,246,234,259,224,233,227,247,249,243,266,223,235,238,273,255,261,246,236,225,238,243,257,237,223,239,240,247,255,220,239,237,256,272,241,236,259,228,252,262,221,252,243,241,251,236,228,236,254,228,239,210,229,280,253,229,232,261,233,249,256,240,229,237,241,266,223,240,265,258,243,258,245,233,232,266,239,230,227,266,249,254,251,215,228,253,234,259,250,254,248,243,225,268,255,248,248,215,218,249,228,254,257,245,245,227,235,239,240,247,241,225,255,269,268,235,243,243,239,251,270,232,243,228,234,263,243,251,216,228,256,236,263,238,258,244,238,240,231,238,269,257,271,245,239,225,233,220,256,254,227,261,248,276,235,232,265,264,240,222,257,236,238,214,253,244,245,250,248,271,221,225,241,287,239,254,271,245,250,241,254,259,264,261,251,222,247,230,242,223,215,226,254,234,270,238,246,233,252,242,271,250,244,237,241,247,246,225,243,238,237,250,247,283,237,233,225,223,239,247,235,243,250,246,234,242,251,262,254,256,242,219,240,236,238,253,248,216,243,231,255,227,239,238,243,264,234,222,256,261,228,272,248,240,231,256,241,222,221,264,211,248,241,236,236,251,279,264,261,233,245,229,241,222,250,256,263,252,261,262,238,250,234,259,241,254,261,244,270,245,248,246,239,231]}]},"null_count":0,"tot_col_size":8500000,"last_update_version":401695310454456321},"s_suppkey":{"histogram":{"ndv":500000,"buckets":[{"count":2048,"lower_bound":"MQ==","upper_bound":"MjA0OA==","repeats":1},{"count":4096,"lower_bound":"MjA0OQ==","upper_bound":"NDA5Ng==","repeats":1},{"count":6144,"lower_bound":"NDA5Nw==","upper_bound":"NjE0NA==","repeats":1},{"count":8192,"lower_bound":"NjE0NQ==","upper_bound":"ODE5Mg==","repeats":1},{"count":10240,"lower_bound":"ODE5Mw==","upper_bound":"MTAyNDA=","repeats":1},{"count":12288,"lower_bound":"MTAyNDE=","upper_bound":"MTIyODg=","repeats":1},{"count":14336,"lower_bound":"MTIyODk=","upper_bound":"MTQzMzY=","repeats":1},{"count":16384,"lower_bound":"MTQzMzc=","upper_bound":"MTYzODQ=","repeats":1},{"count":18432,"lower_bound":"MTYzODU=","upper_bound":"MTg0MzI=","repeats":1},{"count":20480,"lower_bound":"MTg0MzM=","upper_bound":"MjA0ODA=","repeats":1},{"count":22528,"lower_bound":"MjA0ODE=","upper_bound":"MjI1Mjg=","repeats":1},{"count":24576,"lower_bound":"MjI1Mjk=","upper_bound":"MjQ1NzY=","repeats":1},{"count":26624,"lower_bound":"MjQ1Nzc=","upper_bound":"MjY2MjQ=","repeats":1},{"count":28672,"lower_bound":"MjY2MjU=","upper_bound":"Mjg2NzI=","repeats":1},{"count":30720,"lower_bound":"Mjg2NzM=","upper_bound":"MzA3MjA=","repeats":1},{"count":32768,"lower_bound":"MzA3MjE=","upper_bound":"MzI3Njg=","repeats":1},{"count":34816,"lower_bound":"MzI3Njk=","upper_bound":"MzQ4MTY=","repeats":1},{"count":36864,"lower_bound":"MzQ4MTc=","upper_bound":"MzY4NjQ=","repeats":1},{"count":38912,"lower_bound":"MzY4NjU=","upper_bound":"Mzg5MTI=","repeats":1},{"count":40960,"lower_bound":"Mzg5MTM=","upper_bound":"NDA5NjA=","repeats":1},{"count":43008,"lower_bound":"NDA5NjE=","upper_bound":"NDMwMDg=","repeats":1},{"count":45056,"lower_bound":"NDMwMDk=","upper_bound":"NDUwNTY=","repeats":1},{"count":47104,"lower_bound":"NDUwNTc=","upper_bound":"NDcxMDQ=","repeats":1},{"count":49152,"lower_bound":"NDcxMDU=","upper_bound":"NDkxNTI=","repeats":1},{"count":51200,"lower_bound":"NDkxNTM=","upper_bound":"NTEyMDA=","repeats":1},{"count":53248,"lower_bound":"NTEyMDE=","upper_bound":"NTMyNDg=","repeats":1},{"count":55296,"lower_bound":"NTMyNDk=","upper_bound":"NTUyOTY=","repeats":1},{"count":57344,"lower_bound":"NTUyOTc=","upper_bound":"NTczNDQ=","repeats":1},{"count":59392,"lower_bound":"NTczNDU=","upper_bound":"NTkzOTI=","repeats":1},{"count":61440,"lower_bound":"NTkzOTM=","upper_bound":"NjE0NDA=","repeats":1},{"count":63488,"lower_bound":"NjE0NDE=","upper_bound":"NjM0ODg=","repeats":1},{"count":65536,"lower_bound":"NjM0ODk=","upper_bound":"NjU1MzY=","repeats":1},{"count":67584,"lower_bound":"NjU1Mzc=","upper_bound":"Njc1ODQ=","repeats":1},{"count":69632,"lower_bound":"Njc1ODU=","upper_bound":"Njk2MzI=","repeats":1},{"count":71680,"lower_bound":"Njk2MzM=","upper_bound":"NzE2ODA=","repeats":1},{"count":73728,"lower_bound":"NzE2ODE=","upper_bound":"NzM3Mjg=","repeats":1},{"count":75776,"lower_bound":"NzM3Mjk=","upper_bound":"NzU3NzY=","repeats":1},{"count":77824,"lower_bound":"NzU3Nzc=","upper_bound":"Nzc4MjQ=","repeats":1},{"count":79872,"lower_bound":"Nzc4MjU=","upper_bound":"Nzk4NzI=","repeats":1},{"count":81920,"lower_bound":"Nzk4NzM=","upper_bound":"ODE5MjA=","repeats":1},{"count":83968,"lower_bound":"ODE5MjE=","upper_bound":"ODM5Njg=","repeats":1},{"count":86016,"lower_bound":"ODM5Njk=","upper_bound":"ODYwMTY=","repeats":1},{"count":88064,"lower_bound":"ODYwMTc=","upper_bound":"ODgwNjQ=","repeats":1},{"count":90112,"lower_bound":"ODgwNjU=","upper_bound":"OTAxMTI=","repeats":1},{"count":92160,"lower_bound":"OTAxMTM=","upper_bound":"OTIxNjA=","repeats":1},{"count":94208,"lower_bound":"OTIxNjE=","upper_bound":"OTQyMDg=","repeats":1},{"count":96256,"lower_bound":"OTQyMDk=","upper_bound":"OTYyNTY=","repeats":1},{"count":98304,"lower_bound":"OTYyNTc=","upper_bound":"OTgzMDQ=","repeats":1},{"count":100352,"lower_bound":"OTgzMDU=","upper_bound":"MTAwMzUy","repeats":1},{"count":102400,"lower_bound":"MTAwMzUz","upper_bound":"MTAyNDAw","repeats":1},{"count":104448,"lower_bound":"MTAyNDAx","upper_bound":"MTA0NDQ4","repeats":1},{"count":106496,"lower_bound":"MTA0NDQ5","upper_bound":"MTA2NDk2","repeats":1},{"count":108544,"lower_bound":"MTA2NDk3","upper_bound":"MTA4NTQ0","repeats":1},{"count":110592,"lower_bound":"MTA4NTQ1","upper_bound":"MTEwNTky","repeats":1},{"count":112640,"lower_bound":"MTEwNTkz","upper_bound":"MTEyNjQw","repeats":1},{"count":114688,"lower_bound":"MTEyNjQx","upper_bound":"MTE0Njg4","repeats":1},{"count":116736,"lower_bound":"MTE0Njg5","upper_bound":"MTE2NzM2","repeats":1},{"count":118784,"lower_bound":"MTE2NzM3","upper_bound":"MTE4Nzg0","repeats":1},{"count":120832,"lower_bound":"MTE4Nzg1","upper_bound":"MTIwODMy","repeats":1},{"count":122880,"lower_bound":"MTIwODMz","upper_bound":"MTIyODgw","repeats":1},{"count":124928,"lower_bound":"MTIyODgx","upper_bound":"MTI0OTI4","repeats":1},{"count":126976,"lower_bound":"MTI0OTI5","upper_bound":"MTI2OTc2","repeats":1},{"count":129024,"lower_bound":"MTI2OTc3","upper_bound":"MTI5MDI0","repeats":1},{"count":131072,"lower_bound":"MTI5MDI1","upper_bound":"MTMxMDcy","repeats":1},{"count":133120,"lower_bound":"MTMxMDcz","upper_bound":"MTMzMTIw","repeats":1},{"count":135168,"lower_bound":"MTMzMTIx","upper_bound":"MTM1MTY4","repeats":1},{"count":137216,"lower_bound":"MTM1MTY5","upper_bound":"MTM3MjE2","repeats":1},{"count":139264,"lower_bound":"MTM3MjE3","upper_bound":"MTM5MjY0","repeats":1},{"count":141312,"lower_bound":"MTM5MjY1","upper_bound":"MTQxMzEy","repeats":1},{"count":143360,"lower_bound":"MTQxMzEz","upper_bound":"MTQzMzYw","repeats":1},{"count":145408,"lower_bound":"MTQzMzYx","upper_bound":"MTQ1NDA4","repeats":1},{"count":147456,"lower_bound":"MTQ1NDA5","upper_bound":"MTQ3NDU2","repeats":1},{"count":149504,"lower_bound":"MTQ3NDU3","upper_bound":"MTQ5NTA0","repeats":1},{"count":151552,"lower_bound":"MTQ5NTA1","upper_bound":"MTUxNTUy","repeats":1},{"count":153600,"lower_bound":"MTUxNTUz","upper_bound":"MTUzNjAw","repeats":1},{"count":155648,"lower_bound":"MTUzNjAx","upper_bound":"MTU1NjQ4","repeats":1},{"count":157696,"lower_bound":"MTU1NjQ5","upper_bound":"MTU3Njk2","repeats":1},{"count":159744,"lower_bound":"MTU3Njk3","upper_bound":"MTU5NzQ0","repeats":1},{"count":161792,"lower_bound":"MTU5NzQ1","upper_bound":"MTYxNzky","repeats":1},{"count":163840,"lower_bound":"MTYxNzkz","upper_bound":"MTYzODQw","repeats":1},{"count":165888,"lower_bound":"MTYzODQx","upper_bound":"MTY1ODg4","repeats":1},{"count":167936,"lower_bound":"MTY1ODg5","upper_bound":"MTY3OTM2","repeats":1},{"count":169984,"lower_bound":"MTY3OTM3","upper_bound":"MTY5OTg0","repeats":1},{"count":172032,"lower_bound":"MTY5OTg1","upper_bound":"MTcyMDMy","repeats":1},{"count":174080,"lower_bound":"MTcyMDMz","upper_bound":"MTc0MDgw","repeats":1},{"count":176128,"lower_bound":"MTc0MDgx","upper_bound":"MTc2MTI4","repeats":1},{"count":178176,"lower_bound":"MTc2MTI5","upper_bound":"MTc4MTc2","repeats":1},{"count":180224,"lower_bound":"MTc4MTc3","upper_bound":"MTgwMjI0","repeats":1},{"count":182272,"lower_bound":"MTgwMjI1","upper_bound":"MTgyMjcy","repeats":1},{"count":184320,"lower_bound":"MTgyMjcz","upper_bound":"MTg0MzIw","repeats":1},{"count":186368,"lower_bound":"MTg0MzIx","upper_bound":"MTg2MzY4","repeats":1},{"count":188416,"lower_bound":"MTg2MzY5","upper_bound":"MTg4NDE2","repeats":1},{"count":190464,"lower_bound":"MTg4NDE3","upper_bound":"MTkwNDY0","repeats":1},{"count":192512,"lower_bound":"MTkwNDY1","upper_bound":"MTkyNTEy","repeats":1},{"count":194560,"lower_bound":"MTkyNTEz","upper_bound":"MTk0NTYw","repeats":1},{"count":196608,"lower_bound":"MTk0NTYx","upper_bound":"MTk2NjA4","repeats":1},{"count":198656,"lower_bound":"MTk2NjA5","upper_bound":"MTk4NjU2","repeats":1},{"count":200704,"lower_bound":"MTk4NjU3","upper_bound":"MjAwNzA0","repeats":1},{"count":202752,"lower_bound":"MjAwNzA1","upper_bound":"MjAyNzUy","repeats":1},{"count":204800,"lower_bound":"MjAyNzUz","upper_bound":"MjA0ODAw","repeats":1},{"count":206848,"lower_bound":"MjA0ODAx","upper_bound":"MjA2ODQ4","repeats":1},{"count":208896,"lower_bound":"MjA2ODQ5","upper_bound":"MjA4ODk2","repeats":1},{"count":210944,"lower_bound":"MjA4ODk3","upper_bound":"MjEwOTQ0","repeats":1},{"count":212992,"lower_bound":"MjEwOTQ1","upper_bound":"MjEyOTky","repeats":1},{"count":215040,"lower_bound":"MjEyOTkz","upper_bound":"MjE1MDQw","repeats":1},{"count":217088,"lower_bound":"MjE1MDQx","upper_bound":"MjE3MDg4","repeats":1},{"count":219136,"lower_bound":"MjE3MDg5","upper_bound":"MjE5MTM2","repeats":1},{"count":221184,"lower_bound":"MjE5MTM3","upper_bound":"MjIxMTg0","repeats":1},{"count":223232,"lower_bound":"MjIxMTg1","upper_bound":"MjIzMjMy","repeats":1},{"count":225280,"lower_bound":"MjIzMjMz","upper_bound":"MjI1Mjgw","repeats":1},{"count":227328,"lower_bound":"MjI1Mjgx","upper_bound":"MjI3MzI4","repeats":1},{"count":229376,"lower_bound":"MjI3MzI5","upper_bound":"MjI5Mzc2","repeats":1},{"count":231424,"lower_bound":"MjI5Mzc3","upper_bound":"MjMxNDI0","repeats":1},{"count":233472,"lower_bound":"MjMxNDI1","upper_bound":"MjMzNDcy","repeats":1},{"count":235520,"lower_bound":"MjMzNDcz","upper_bound":"MjM1NTIw","repeats":1},{"count":237568,"lower_bound":"MjM1NTIx","upper_bound":"MjM3NTY4","repeats":1},{"count":239616,"lower_bound":"MjM3NTY5","upper_bound":"MjM5NjE2","repeats":1},{"count":241664,"lower_bound":"MjM5NjE3","upper_bound":"MjQxNjY0","repeats":1},{"count":243712,"lower_bound":"MjQxNjY1","upper_bound":"MjQzNzEy","repeats":1},{"count":245760,"lower_bound":"MjQzNzEz","upper_bound":"MjQ1NzYw","repeats":1},{"count":247808,"lower_bound":"MjQ1NzYx","upper_bound":"MjQ3ODA4","repeats":1},{"count":249856,"lower_bound":"MjQ3ODA5","upper_bound":"MjQ5ODU2","repeats":1},{"count":251904,"lower_bound":"MjQ5ODU3","upper_bound":"MjUxOTA0","repeats":1},{"count":253952,"lower_bound":"MjUxOTA1","upper_bound":"MjUzOTUy","repeats":1},{"count":256000,"lower_bound":"MjUzOTUz","upper_bound":"MjU2MDAw","repeats":1},{"count":258048,"lower_bound":"MjU2MDAx","upper_bound":"MjU4MDQ4","repeats":1},{"count":260096,"lower_bound":"MjU4MDQ5","upper_bound":"MjYwMDk2","repeats":1},{"count":262144,"lower_bound":"MjYwMDk3","upper_bound":"MjYyMTQ0","repeats":1},{"count":264192,"lower_bound":"MjYyMTQ1","upper_bound":"MjY0MTky","repeats":1},{"count":266240,"lower_bound":"MjY0MTkz","upper_bound":"MjY2MjQw","repeats":1},{"count":268288,"lower_bound":"MjY2MjQx","upper_bound":"MjY4Mjg4","repeats":1},{"count":270336,"lower_bound":"MjY4Mjg5","upper_bound":"MjcwMzM2","repeats":1},{"count":272384,"lower_bound":"MjcwMzM3","upper_bound":"MjcyMzg0","repeats":1},{"count":274432,"lower_bound":"MjcyMzg1","upper_bound":"Mjc0NDMy","repeats":1},{"count":276480,"lower_bound":"Mjc0NDMz","upper_bound":"Mjc2NDgw","repeats":1},{"count":278528,"lower_bound":"Mjc2NDgx","upper_bound":"Mjc4NTI4","repeats":1},{"count":280576,"lower_bound":"Mjc4NTI5","upper_bound":"MjgwNTc2","repeats":1},{"count":282624,"lower_bound":"MjgwNTc3","upper_bound":"MjgyNjI0","repeats":1},{"count":284672,"lower_bound":"MjgyNjI1","upper_bound":"Mjg0Njcy","repeats":1},{"count":286720,"lower_bound":"Mjg0Njcz","upper_bound":"Mjg2NzIw","repeats":1},{"count":288768,"lower_bound":"Mjg2NzIx","upper_bound":"Mjg4NzY4","repeats":1},{"count":290816,"lower_bound":"Mjg4NzY5","upper_bound":"MjkwODE2","repeats":1},{"count":292864,"lower_bound":"MjkwODE3","upper_bound":"MjkyODY0","repeats":1},{"count":294912,"lower_bound":"MjkyODY1","upper_bound":"Mjk0OTEy","repeats":1},{"count":296960,"lower_bound":"Mjk0OTEz","upper_bound":"Mjk2OTYw","repeats":1},{"count":299008,"lower_bound":"Mjk2OTYx","upper_bound":"Mjk5MDA4","repeats":1},{"count":301056,"lower_bound":"Mjk5MDA5","upper_bound":"MzAxMDU2","repeats":1},{"count":303104,"lower_bound":"MzAxMDU3","upper_bound":"MzAzMTA0","repeats":1},{"count":305152,"lower_bound":"MzAzMTA1","upper_bound":"MzA1MTUy","repeats":1},{"count":307200,"lower_bound":"MzA1MTUz","upper_bound":"MzA3MjAw","repeats":1},{"count":309248,"lower_bound":"MzA3MjAx","upper_bound":"MzA5MjQ4","repeats":1},{"count":311296,"lower_bound":"MzA5MjQ5","upper_bound":"MzExMjk2","repeats":1},{"count":313344,"lower_bound":"MzExMjk3","upper_bound":"MzEzMzQ0","repeats":1},{"count":315392,"lower_bound":"MzEzMzQ1","upper_bound":"MzE1Mzky","repeats":1},{"count":317440,"lower_bound":"MzE1Mzkz","upper_bound":"MzE3NDQw","repeats":1},{"count":319488,"lower_bound":"MzE3NDQx","upper_bound":"MzE5NDg4","repeats":1},{"count":321536,"lower_bound":"MzE5NDg5","upper_bound":"MzIxNTM2","repeats":1},{"count":323584,"lower_bound":"MzIxNTM3","upper_bound":"MzIzNTg0","repeats":1},{"count":325632,"lower_bound":"MzIzNTg1","upper_bound":"MzI1NjMy","repeats":1},{"count":327680,"lower_bound":"MzI1NjMz","upper_bound":"MzI3Njgw","repeats":1},{"count":329728,"lower_bound":"MzI3Njgx","upper_bound":"MzI5NzI4","repeats":1},{"count":331776,"lower_bound":"MzI5NzI5","upper_bound":"MzMxNzc2","repeats":1},{"count":333824,"lower_bound":"MzMxNzc3","upper_bound":"MzMzODI0","repeats":1},{"count":335872,"lower_bound":"MzMzODI1","upper_bound":"MzM1ODcy","repeats":1},{"count":337920,"lower_bound":"MzM1ODcz","upper_bound":"MzM3OTIw","repeats":1},{"count":339968,"lower_bound":"MzM3OTIx","upper_bound":"MzM5OTY4","repeats":1},{"count":342016,"lower_bound":"MzM5OTY5","upper_bound":"MzQyMDE2","repeats":1},{"count":344064,"lower_bound":"MzQyMDE3","upper_bound":"MzQ0MDY0","repeats":1},{"count":346112,"lower_bound":"MzQ0MDY1","upper_bound":"MzQ2MTEy","repeats":1},{"count":348160,"lower_bound":"MzQ2MTEz","upper_bound":"MzQ4MTYw","repeats":1},{"count":350208,"lower_bound":"MzQ4MTYx","upper_bound":"MzUwMjA4","repeats":1},{"count":352256,"lower_bound":"MzUwMjA5","upper_bound":"MzUyMjU2","repeats":1},{"count":354304,"lower_bound":"MzUyMjU3","upper_bound":"MzU0MzA0","repeats":1},{"count":356352,"lower_bound":"MzU0MzA1","upper_bound":"MzU2MzUy","repeats":1},{"count":358400,"lower_bound":"MzU2MzUz","upper_bound":"MzU4NDAw","repeats":1},{"count":360448,"lower_bound":"MzU4NDAx","upper_bound":"MzYwNDQ4","repeats":1},{"count":362496,"lower_bound":"MzYwNDQ5","upper_bound":"MzYyNDk2","repeats":1},{"count":364544,"lower_bound":"MzYyNDk3","upper_bound":"MzY0NTQ0","repeats":1},{"count":366592,"lower_bound":"MzY0NTQ1","upper_bound":"MzY2NTky","repeats":1},{"count":368640,"lower_bound":"MzY2NTkz","upper_bound":"MzY4NjQw","repeats":1},{"count":370688,"lower_bound":"MzY4NjQx","upper_bound":"MzcwNjg4","repeats":1},{"count":372736,"lower_bound":"MzcwNjg5","upper_bound":"MzcyNzM2","repeats":1},{"count":374784,"lower_bound":"MzcyNzM3","upper_bound":"Mzc0Nzg0","repeats":1},{"count":376832,"lower_bound":"Mzc0Nzg1","upper_bound":"Mzc2ODMy","repeats":1},{"count":378880,"lower_bound":"Mzc2ODMz","upper_bound":"Mzc4ODgw","repeats":1},{"count":380928,"lower_bound":"Mzc4ODgx","upper_bound":"MzgwOTI4","repeats":1},{"count":382976,"lower_bound":"MzgwOTI5","upper_bound":"MzgyOTc2","repeats":1},{"count":385024,"lower_bound":"MzgyOTc3","upper_bound":"Mzg1MDI0","repeats":1},{"count":387072,"lower_bound":"Mzg1MDI1","upper_bound":"Mzg3MDcy","repeats":1},{"count":389120,"lower_bound":"Mzg3MDcz","upper_bound":"Mzg5MTIw","repeats":1},{"count":391168,"lower_bound":"Mzg5MTIx","upper_bound":"MzkxMTY4","repeats":1},{"count":393216,"lower_bound":"MzkxMTY5","upper_bound":"MzkzMjE2","repeats":1},{"count":395264,"lower_bound":"MzkzMjE3","upper_bound":"Mzk1MjY0","repeats":1},{"count":397312,"lower_bound":"Mzk1MjY1","upper_bound":"Mzk3MzEy","repeats":1},{"count":399360,"lower_bound":"Mzk3MzEz","upper_bound":"Mzk5MzYw","repeats":1},{"count":401408,"lower_bound":"Mzk5MzYx","upper_bound":"NDAxNDA4","repeats":1},{"count":403456,"lower_bound":"NDAxNDA5","upper_bound":"NDAzNDU2","repeats":1},{"count":405504,"lower_bound":"NDAzNDU3","upper_bound":"NDA1NTA0","repeats":1},{"count":407552,"lower_bound":"NDA1NTA1","upper_bound":"NDA3NTUy","repeats":1},{"count":409600,"lower_bound":"NDA3NTUz","upper_bound":"NDA5NjAw","repeats":1},{"count":411648,"lower_bound":"NDA5NjAx","upper_bound":"NDExNjQ4","repeats":1},{"count":413696,"lower_bound":"NDExNjQ5","upper_bound":"NDEzNjk2","repeats":1},{"count":415744,"lower_bound":"NDEzNjk3","upper_bound":"NDE1NzQ0","repeats":1},{"count":417792,"lower_bound":"NDE1NzQ1","upper_bound":"NDE3Nzky","repeats":1},{"count":419840,"lower_bound":"NDE3Nzkz","upper_bound":"NDE5ODQw","repeats":1},{"count":421888,"lower_bound":"NDE5ODQx","upper_bound":"NDIxODg4","repeats":1},{"count":423936,"lower_bound":"NDIxODg5","upper_bound":"NDIzOTM2","repeats":1},{"count":425984,"lower_bound":"NDIzOTM3","upper_bound":"NDI1OTg0","repeats":1},{"count":428032,"lower_bound":"NDI1OTg1","upper_bound":"NDI4MDMy","repeats":1},{"count":430080,"lower_bound":"NDI4MDMz","upper_bound":"NDMwMDgw","repeats":1},{"count":432128,"lower_bound":"NDMwMDgx","upper_bound":"NDMyMTI4","repeats":1},{"count":434176,"lower_bound":"NDMyMTI5","upper_bound":"NDM0MTc2","repeats":1},{"count":436224,"lower_bound":"NDM0MTc3","upper_bound":"NDM2MjI0","repeats":1},{"count":438272,"lower_bound":"NDM2MjI1","upper_bound":"NDM4Mjcy","repeats":1},{"count":440320,"lower_bound":"NDM4Mjcz","upper_bound":"NDQwMzIw","repeats":1},{"count":442368,"lower_bound":"NDQwMzIx","upper_bound":"NDQyMzY4","repeats":1},{"count":444416,"lower_bound":"NDQyMzY5","upper_bound":"NDQ0NDE2","repeats":1},{"count":446464,"lower_bound":"NDQ0NDE3","upper_bound":"NDQ2NDY0","repeats":1},{"count":448512,"lower_bound":"NDQ2NDY1","upper_bound":"NDQ4NTEy","repeats":1},{"count":450560,"lower_bound":"NDQ4NTEz","upper_bound":"NDUwNTYw","repeats":1},{"count":452608,"lower_bound":"NDUwNTYx","upper_bound":"NDUyNjA4","repeats":1},{"count":454656,"lower_bound":"NDUyNjA5","upper_bound":"NDU0NjU2","repeats":1},{"count":456704,"lower_bound":"NDU0NjU3","upper_bound":"NDU2NzA0","repeats":1},{"count":458752,"lower_bound":"NDU2NzA1","upper_bound":"NDU4NzUy","repeats":1},{"count":460800,"lower_bound":"NDU4NzUz","upper_bound":"NDYwODAw","repeats":1},{"count":462848,"lower_bound":"NDYwODAx","upper_bound":"NDYyODQ4","repeats":1},{"count":464896,"lower_bound":"NDYyODQ5","upper_bound":"NDY0ODk2","repeats":1},{"count":466944,"lower_bound":"NDY0ODk3","upper_bound":"NDY2OTQ0","repeats":1},{"count":468992,"lower_bound":"NDY2OTQ1","upper_bound":"NDY4OTky","repeats":1},{"count":471040,"lower_bound":"NDY4OTkz","upper_bound":"NDcxMDQw","repeats":1},{"count":473088,"lower_bound":"NDcxMDQx","upper_bound":"NDczMDg4","repeats":1},{"count":475136,"lower_bound":"NDczMDg5","upper_bound":"NDc1MTM2","repeats":1},{"count":477184,"lower_bound":"NDc1MTM3","upper_bound":"NDc3MTg0","repeats":1},{"count":479232,"lower_bound":"NDc3MTg1","upper_bound":"NDc5MjMy","repeats":1},{"count":481280,"lower_bound":"NDc5MjMz","upper_bound":"NDgxMjgw","repeats":1},{"count":483328,"lower_bound":"NDgxMjgx","upper_bound":"NDgzMzI4","repeats":1},{"count":485376,"lower_bound":"NDgzMzI5","upper_bound":"NDg1Mzc2","repeats":1},{"count":487424,"lower_bound":"NDg1Mzc3","upper_bound":"NDg3NDI0","repeats":1},{"count":489472,"lower_bound":"NDg3NDI1","upper_bound":"NDg5NDcy","repeats":1},{"count":491520,"lower_bound":"NDg5NDcz","upper_bound":"NDkxNTIw","repeats":1},{"count":493568,"lower_bound":"NDkxNTIx","upper_bound":"NDkzNTY4","repeats":1},{"count":495616,"lower_bound":"NDkzNTY5","upper_bound":"NDk1NjE2","repeats":1},{"count":497664,"lower_bound":"NDk1NjE3","upper_bound":"NDk3NjY0","repeats":1},{"count":499712,"lower_bound":"NDk3NjY1","upper_bound":"NDk5NzEy","repeats":1},{"count":500000,"lower_bound":"NDk5NzEz","upper_bound":"NTAwMDAw","repeats":1}]},"cm_sketch":null,"null_count":0,"tot_col_size":0,"last_update_version":401695296442859521}},"indices":{},"count":500000,"modify_count":0} diff --git a/cmd/explaintest/t/access_path_selection.test b/cmd/explaintest/t/access_path_selection.test index 8345b19a0c94b..26b68ff3609d8 100644 --- a/cmd/explaintest/t/access_path_selection.test +++ b/cmd/explaintest/t/access_path_selection.test @@ -5,15 +5,15 @@ KEY `IDX_a` (`a`), KEY `IDX_b` (`b`), KEY `IDX_ab` (`a`, `b`) ); -explain select a from access_path_selection where a < 3; +explain format = 'brief' select a from access_path_selection where a < 3; # In this query, IDX_ab is better than IDX_a. # The reason is that we have to do double scan if we use IDX_a since it doesn't contain column b. -explain select a, b from access_path_selection where a < 3; +explain format = 'brief' select a, b from access_path_selection where a < 3; # In this query, IDX_ab can't be used, so IDX_b is the best. -explain select a, b from access_path_selection where b < 3; -explain select a, b from access_path_selection where a < 3 and b < 3; +explain format = 'brief' select a, b from access_path_selection where b < 3; +explain format = 'brief' select a, b from access_path_selection where a < 3 and b < 3; # _tidb_rowid should also be considered as PK. -explain select a, b from access_path_selection where a > 10 order by _tidb_rowid; -explain select max(_tidb_rowid) from access_path_selection; +explain format = 'brief' select a, b from access_path_selection where a > 10 order by _tidb_rowid; +explain format = 'brief' select max(_tidb_rowid) from access_path_selection; # Use indexPath in this query. -explain select count(1) from access_path_selection; +explain format = 'brief' select count(1) from access_path_selection; diff --git a/cmd/explaintest/t/black_list.test b/cmd/explaintest/t/black_list.test index ef03c3f72519d..6fcc8559cc0a0 100644 --- a/cmd/explaintest/t/black_list.test +++ b/cmd/explaintest/t/black_list.test @@ -2,40 +2,40 @@ use test; drop table if exists t; create table t (a int); -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; insert into mysql.opt_rule_blacklist values('predicate_push_down'); admin reload opt_rule_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; delete from mysql.opt_rule_blacklist where name='predicate_push_down'; admin reload opt_rule_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; insert into mysql.expr_pushdown_blacklist values('<', 'tikv,tiflash,tidb', 'for test'); admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; delete from mysql.expr_pushdown_blacklist where name='<' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; insert into mysql.expr_pushdown_blacklist values('lt', 'tikv,tiflash,tidb', 'for test'); admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; delete from mysql.expr_pushdown_blacklist where name='lt' and store_type = 'tikv,tiflash,tidb' and reason = 'for test'; admin reload expr_pushdown_blacklist; -explain select * from t where a < 1; +explain format = 'brief' select * from t where a < 1; diff --git a/cmd/explaintest/t/clustered_index.test b/cmd/explaintest/t/clustered_index.test new file mode 100644 index 0000000000000..7c40b6ae6523d --- /dev/null +++ b/cmd/explaintest/t/clustered_index.test @@ -0,0 +1,57 @@ +drop database if exists with_cluster_index; +create database with_cluster_index; +drop database if exists wout_cluster_index; +create database wout_cluster_index; + +use with_cluster_index; +set @@tidb_enable_clustered_index = 1; +create table tbl_0 ( col_0 decimal not null , col_1 blob(207) , col_2 text , col_3 datetime default '1986-07-01' , col_4 bigint unsigned default 1504335725690712365 , primary key idx_0 ( col_3,col_2(1),col_1(6) ) , key idx_1 ( col_3 ) , unique key idx_2 ( col_3 ) , unique key idx_3 ( col_0 ) , key idx_4 ( col_1(1),col_2(1) ) , key idx_5 ( col_2(1) ) ) ; +create table tbl_1 ( col_5 char(135) , col_6 bit(17) default 50609 not null , col_7 char(202) default 'IoQWYoGdbbgBDlxpDHQ' , col_8 char(213) , col_9 time not null , primary key idx_6 ( col_6 ) , unique key idx_7 ( col_5 ) ) ; +create table tbl_2 ( col_10 datetime default '1976-05-11' , col_11 datetime , col_12 float , col_13 double(56,29) default 18.0118 , col_14 char not null , primary key idx_8 ( col_14,col_13,col_10 ) , key idx_9 ( col_11 ) ) ; +create table tbl_3 ( col_15 tinyint default -91 not null , col_16 bit(61) default 990141831018971350 not null , col_17 double(244,22) default 3985 not null , col_18 binary(32) default 'kxMlWqvpxXNBlxoU' , col_19 text(401) , primary key idx_10 ( col_18,col_19(4) ) , key idx_11 ( col_17,col_18,col_19(2),col_15,col_16 ) , unique key idx_12 ( col_17 ) ) ; +create table tbl_4 ( col_20 double(230,16) default 8.49 not null , col_21 int unsigned not null , col_22 enum('Alice','Bob','Charlie','David') not null , col_23 float default 3066.13040283622 , col_24 datetime default '1980-10-27' not null , primary key idx_13 ( col_22,col_24 ) , key idx_14 ( col_23,col_20 ) , key idx_15 ( col_24 ) , key idx_16 ( col_20 ) , unique key idx_17 ( col_24 ) , key idx_18 ( col_21 ) ) ; +load stats 's/with_cluster_index_tbl_0.json'; +load stats 's/with_cluster_index_tbl_1.json'; +load stats 's/with_cluster_index_tbl_2.json'; +load stats 's/with_cluster_index_tbl_3.json'; +load stats 's/with_cluster_index_tbl_4.json'; + +use wout_cluster_index; +set @@tidb_enable_clustered_index = 0; +create table tbl_0 ( col_0 decimal not null , col_1 blob(207) , col_2 text , col_3 datetime default '1986-07-01' , col_4 bigint unsigned default 1504335725690712365 , primary key idx_0 ( col_3,col_2(1),col_1(6) ) , key idx_1 ( col_3 ) , unique key idx_2 ( col_3 ) , unique key idx_3 ( col_0 ) , key idx_4 ( col_1(1),col_2(1) ) , key idx_5 ( col_2(1) ) ) ; +create table tbl_1 ( col_5 char(135) , col_6 bit(17) default 50609 not null , col_7 char(202) default 'IoQWYoGdbbgBDlxpDHQ' , col_8 char(213) , col_9 time not null , primary key idx_6 ( col_6 ) , unique key idx_7 ( col_5 ) ) ; +create table tbl_2 ( col_10 datetime default '1976-05-11' , col_11 datetime , col_12 float , col_13 double(56,29) default 18.0118 , col_14 char not null , primary key idx_8 ( col_14,col_13,col_10 ) , key idx_9 ( col_11 ) ) ; +create table tbl_3 ( col_15 tinyint default -91 not null , col_16 bit(61) default 990141831018971350 not null , col_17 double(244,22) default 3985 not null , col_18 binary(32) default 'kxMlWqvpxXNBlxoU' , col_19 text(401) , primary key idx_10 ( col_18,col_19(4) ) , key idx_11 ( col_17,col_18,col_19(2),col_15,col_16 ) , unique key idx_12 ( col_17 ) ) ; +create table tbl_4 ( col_20 double(230,16) default 8.49 not null , col_21 int unsigned not null , col_22 enum('Alice','Bob','Charlie','David') not null , col_23 float default 3066.13040283622 , col_24 datetime default '1980-10-27' not null , primary key idx_13 ( col_22,col_24 ) , key idx_14 ( col_23,col_20 ) , key idx_15 ( col_24 ) , key idx_16 ( col_20 ) , unique key idx_17 ( col_24 ) , key idx_18 ( col_21 ) ) ; +load stats 's/wout_cluster_index_tbl_0.json'; +load stats 's/wout_cluster_index_tbl_1.json'; +load stats 's/wout_cluster_index_tbl_2.json'; +load stats 's/wout_cluster_index_tbl_3.json'; +load stats 's/wout_cluster_index_tbl_4.json'; + +explain select count(*) from with_cluster_index.tbl_0 where col_0 < 5429 ; +explain select count(*) from wout_cluster_index.tbl_0 where col_0 < 5429 ; + +explain select count(*) from with_cluster_index.tbl_0 where col_0 < 41 ; +explain select count(*) from wout_cluster_index.tbl_0 where col_0 < 41 ; + +explain select col_14 from with_cluster_index.tbl_2 where col_11 <> '2013-11-01' ; +explain select col_14 from wout_cluster_index.tbl_2 where col_11 <> '2013-11-01' ; + +explain select sum( col_4 ) from with_cluster_index.tbl_0 where col_3 != '1993-12-02' ; +explain select sum( col_4 ) from wout_cluster_index.tbl_0 where col_3 != '1993-12-02' ; + +explain select col_0 from with_cluster_index.tbl_0 where col_0 <= 0 ; +explain select col_0 from wout_cluster_index.tbl_0 where col_0 <= 0 ; + +explain select col_3 from with_cluster_index.tbl_0 where col_3 >= '1981-09-15' ; +explain select col_3 from wout_cluster_index.tbl_0 where col_3 >= '1981-09-15' ; + +explain select tbl_2.col_14 , tbl_0.col_1 from with_cluster_index.tbl_2 right join with_cluster_index.tbl_0 on col_3 = col_11 ; +explain select tbl_2.col_14 , tbl_0.col_1 from wout_cluster_index.tbl_2 right join wout_cluster_index.tbl_0 on col_3 = col_11 ; + +explain select count(*) from with_cluster_index.tbl_0 where col_0 <= 0 ; +explain select count(*) from wout_cluster_index.tbl_0 where col_0 <= 0 ; + +explain select count(*) from with_cluster_index.tbl_0 where col_0 >= 803163 ; +explain select count(*) from wout_cluster_index.tbl_0 where col_0 >= 803163 ; diff --git a/cmd/explaintest/t/explain-non-select-stmt.test b/cmd/explaintest/t/explain-non-select-stmt.test index f231b95a8600e..474958c84e07c 100644 --- a/cmd/explaintest/t/explain-non-select-stmt.test +++ b/cmd/explaintest/t/explain-non-select-stmt.test @@ -1,8 +1,8 @@ use test; drop table if exists t; create table t(a bigint, b bigint); -explain insert into t values(1, 1); -explain insert into t select * from t; -explain delete from t where a > 100; -explain update t set b = 100 where a = 200; -explain replace into t select a, 100 from t; +explain format = 'brief' insert into t values(1, 1); +explain format = 'brief' insert into t select * from t; +explain format = 'brief' delete from t where a > 100; +explain format = 'brief' update t set b = 100 where a = 200; +explain format = 'brief' replace into t select a, 100 from t; diff --git a/cmd/explaintest/t/explain.test b/cmd/explaintest/t/explain.test index 33fd0e7165d61..bed6567b61d4a 100644 --- a/cmd/explaintest/t/explain.test +++ b/cmd/explaintest/t/explain.test @@ -11,8 +11,8 @@ drop table if exists t; create table t(id int primary key, a int, b int); set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; -explain select group_concat(a) from t group by id; -explain select group_concat(a, b) from t group by id; +explain format = 'brief' select group_concat(a) from t group by id; +explain format = 'brief' select group_concat(a, b) from t group by id; drop table t; drop view if exists v; diff --git a/cmd/explaintest/t/explain_complex.test b/cmd/explaintest/t/explain_complex.test index aae669cc9274f..2447db8f2d53c 100644 --- a/cmd/explaintest/t/explain_complex.test +++ b/cmd/explaintest/t/explain_complex.test @@ -108,17 +108,17 @@ CREATE TABLE `rr` ( PRIMARY KEY (`aid`,`dic`) ); -explain SELECT `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5`, count(dic) as install_device FROM `dt` use index (cmi) WHERE (`ds` >= '2016-09-01') AND (`ds` <= '2016-11-03') AND (`cm` IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5` ORDER BY `ds2` DESC; +explain format = 'brief' SELECT `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5`, count(dic) as install_device FROM `dt` use index (cmi) WHERE (`ds` >= '2016-09-01') AND (`ds` <= '2016-11-03') AND (`cm` IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY `ds`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6_md5`, `p7_md5` ORDER BY `ds2` DESC; -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; -explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; +explain format = 'brief' SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; -explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; +explain format = 'brief' select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; -explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; +explain format = 'brief' select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; CREATE TABLE `tbl_001` (`a` int, `b` int); CREATE TABLE `tbl_002` (`a` int, `b` int); @@ -130,7 +130,7 @@ CREATE TABLE `tbl_007` (`a` int, `b` int); CREATE TABLE `tbl_008` (`a` int, `b` int); CREATE TABLE `tbl_009` (`a` int, `b` int); -explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; +explain format = 'brief' select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; CREATE TABLE org_department ( id int(11) NOT NULL AUTO_INCREMENT, @@ -173,4 +173,4 @@ CREATE TABLE org_position ( UNIQUE KEY org_employee_position_pk (hotel_id,user_id,position_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -explain SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; +explain format = 'brief' SELECT d.id, d.ctx, d.name, d.left_value, d.right_value, d.depth, d.leader_id, d.status, d.created_on, d.updated_on FROM org_department AS d LEFT JOIN org_position AS p ON p.department_id = d.id AND p.status = 1000 LEFT JOIN org_employee_position AS ep ON ep.position_id = p.id AND ep.status = 1000 WHERE (d.ctx = 1 AND (ep.user_id = 62 OR d.id = 20 OR d.id = 20) AND d.status = 1000) GROUP BY d.id ORDER BY d.left_value; diff --git a/cmd/explaintest/t/explain_complex_stats.test b/cmd/explaintest/t/explain_complex_stats.test index f2b0cbb6ddafb..cd5dc4bfce31b 100644 --- a/cmd/explaintest/t/explain_complex_stats.test +++ b/cmd/explaintest/t/explain_complex_stats.test @@ -118,17 +118,17 @@ CREATE TABLE rr ( ); load stats 's/explain_complex_stats_rr.json'; -explain SELECT ds, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(dic) as install_device FROM dt use index (cm) WHERE (ds >= '2016-09-01') AND (ds <= '2016-11-03') AND (cm IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY ds, p1, p2, p3, p4, p5, p6_md5, p7_md5 ORDER BY ds2 DESC; +explain format = 'brief' SELECT ds, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(dic) as install_device FROM dt use index (cm) WHERE (ds >= '2016-09-01') AND (ds <= '2016-11-03') AND (cm IN ('1062', '1086', '1423', '1424', '1425', '1426', '1427', '1428', '1429', '1430', '1431', '1432', '1433', '1434', '1435', '1436', '1437', '1438', '1439', '1440', '1441', '1442', '1443', '1444', '1445', '1446', '1447', '1448', '1449', '1450', '1451', '1452', '1488', '1489', '1490', '1491', '1492', '1493', '1494', '1495', '1496', '1497', '1550', '1551', '1552', '1553', '1554', '1555', '1556', '1557', '1558', '1559', '1597', '1598', '1599', '1600', '1601', '1602', '1603', '1604', '1605', '1606', '1607', '1608', '1609', '1610', '1611', '1612', '1613', '1614', '1615', '1616', '1623', '1624', '1625', '1626', '1627', '1628', '1629', '1630', '1631', '1632', '1709', '1719', '1720', '1843', '2813', '2814', '2815', '2816', '2817', '2818', '2819', '2820', '2821', '2822', '2823', '2824', '2825', '2826', '2827', '2828', '2829', '2830', '2831', '2832', '2833', '2834', '2835', '2836', '2837', '2838', '2839', '2840', '2841', '2842', '2843', '2844', '2845', '2846', '2847', '2848', '2849', '2850', '2851', '2852', '2853', '2854', '2855', '2856', '2857', '2858', '2859', '2860', '2861', '2862', '2863', '2864', '2865', '2866', '2867', '2868', '2869', '2870', '2871', '2872', '3139', '3140', '3141', '3142', '3143', '3144', '3145', '3146', '3147', '3148', '3149', '3150', '3151', '3152', '3153', '3154', '3155', '3156', '3157', '3158', '3386', '3387', '3388', '3389', '3390', '3391', '3392', '3393', '3394', '3395', '3664', '3665', '3666', '3667', '3668', '3670', '3671', '3672', '3673', '3674', '3676', '3677', '3678', '3679', '3680', '3681', '3682', '3683', '3684', '3685', '3686', '3687', '3688', '3689', '3690', '3691', '3692', '3693', '3694', '3695', '3696', '3697', '3698', '3699', '3700', '3701', '3702', '3703', '3704', '3705', '3706', '3707', '3708', '3709', '3710', '3711', '3712', '3713', '3714', '3715', '3960', '3961', '3962', '3963', '3964', '3965', '3966', '3967', '3968', '3978', '3979', '3980', '3981', '3982', '3983', '3984', '3985', '3986', '3987', '4208', '4209', '4210', '4211', '4212', '4304', '4305', '4306', '4307', '4308', '4866', '4867', '4868', '4869', '4870', '4871', '4872', '4873', '4874', '4875')) GROUP BY ds, p1, p2, p3, p4, p5, p6_md5, p7_md5 ORDER BY ds2 DESC; -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.bm = 0 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext, gad.t as gtime from st gad join (select id, aid, pt, dic, ip, t from dd where pt = 'android' and bm = 0 and t > 1478143908) sdk on gad.aid = sdk.aid and gad.ip = sdk.ip and sdk.t > gad.t where gad.t > 1478143908 and gad.bm = 0 and gad.pt = 'android' group by gad.aid, sdk.dic limit 2500; -explain select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; +explain format = 'brief' select gad.id as gid,sdk.id as sid,gad.aid as aid,gad.cm as cm,sdk.dic as dic,sdk.ip as ip, sdk.t as t, gad.p1 as p1, gad.p2 as p2, gad.p3 as p3, gad.p4 as p4, gad.p5 as p5, gad.p6_md5 as p6, gad.p7_md5 as p7, gad.ext as ext from st gad join dd sdk on gad.aid = sdk.aid and gad.dic = sdk.mac and gad.t < sdk.t where gad.t > 1477971479 and gad.bm = 0 and gad.pt = 'ios' and gad.dit = 'mac' and sdk.t > 1477971479 and sdk.bm = 0 and sdk.pt = 'ios' limit 3000; -explain SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; +explain format = 'brief' SELECT cm, p1, p2, p3, p4, p5, p6_md5, p7_md5, count(1) as click_pv, count(DISTINCT ip) as click_ip FROM st WHERE (t between 1478188800 and 1478275200) and aid='cn.sbkcq' and pt='android' GROUP BY cm, p1, p2, p3, p4, p5, p6_md5, p7_md5; -explain select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; +explain format = 'brief' select dt.id as id, dt.aid as aid, dt.pt as pt, dt.dic as dic, dt.cm as cm, rr.gid as gid, rr.acd as acd, rr.t as t,dt.p1 as p1, dt.p2 as p2, dt.p3 as p3, dt.p4 as p4, dt.p5 as p5, dt.p6_md5 as p6, dt.p7_md5 as p7 from dt dt join rr rr on (rr.pt = 'ios' and rr.t > 1478185592 and dt.aid = rr.aid and dt.dic = rr.dic) where dt.pt = 'ios' and dt.t > 1478185592 and dt.bm = 0 limit 2000; -explain select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; +explain format = 'brief' select pc,cr,count(DISTINCT uid) as pay_users,count(oid) as pay_times,sum(am) as am from pp where ps=2 and ppt>=1478188800 and ppt<1478275200 and pi in ('510017','520017') and uid in ('18089709','18090780') group by pc,cr; drop table if exists tbl_001; CREATE TABLE tbl_001 (a int, b int); @@ -166,4 +166,4 @@ drop table if exists tbl_009; CREATE TABLE tbl_009 (a int, b int); load stats 's/explain_complex_stats_tbl_009.json'; -explain select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; +explain format = 'brief' select sum(a) from (select * from tbl_001 union all select * from tbl_002 union all select * from tbl_003 union all select * from tbl_004 union all select * from tbl_005 union all select * from tbl_006 union all select * from tbl_007 union all select * from tbl_008 union all select * from tbl_009) x group by b; diff --git a/cmd/explaintest/t/explain_easy.test b/cmd/explaintest/t/explain_easy.test index 930f097d9d2b3..99382306b8658 100644 --- a/cmd/explaintest/t/explain_easy.test +++ b/cmd/explaintest/t/explain_easy.test @@ -13,45 +13,45 @@ set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; set @@session.tidb_window_concurrency = 1; -explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); -explain select * from t1; -explain select * from t1 order by c2; -explain select * from t2 order by c2; -explain select * from t1 where t1.c1 > 0; -explain select t1.c1, t1.c2 from t1 where t1.c2 = 1; -explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; -explain update t1 set t1.c2 = 2 where t1.c1 = 1; -explain delete from t1 where t1.c2 = 1; -explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; -explain select * from t2 order by t2.c2 limit 0, 1; -explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; -explain select * from t1 where c1 = 1 and c2 > 1; -explain select sum(t1.c1 in (select c1 from t2)) from t1; -explain select c1 from t1 where c1 in (select c2 from t2); -explain select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; -explain select * from information_schema.columns; -explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; -explain select * from t1 order by c1 desc limit 1; -explain select * from t4 use index(idx) where a > 1 and b > 1 and c > 1 limit 1; -explain select * from t4 where a > 1 and c > 1 limit 1; -explain select ifnull(null, t1.c1) from t1; -explain select if(10, t1.c1, t1.c2) from t1; -explain select c1 from t2 union select c1 from t2 union all select c1 from t2; -explain select c1 from t2 union all select c1 from t2 union select c1 from t2; +explain format = 'brief' select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); +explain format = 'brief' select * from t1; +explain format = 'brief' select * from t1 order by c2; +explain format = 'brief' select * from t2 order by c2; +explain format = 'brief' select * from t1 where t1.c1 > 0; +explain format = 'brief' select t1.c1, t1.c2 from t1 where t1.c2 = 1; +explain format = 'brief' select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; +explain format = 'brief' update t1 set t1.c2 = 2 where t1.c1 = 1; +explain format = 'brief' delete from t1 where t1.c2 = 1; +explain format = 'brief' select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; +explain format = 'brief' select * from t2 order by t2.c2 limit 0, 1; +explain format = 'brief' select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; +explain format = 'brief' select * from t1 where c1 = 1 and c2 > 1; +explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; +explain format = 'brief' select c1 from t1 where c1 in (select c2 from t2); +explain format = 'brief' select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; +explain format = 'brief' select * from information_schema.columns; +explain format = 'brief' select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; +explain format = 'brief' select * from t1 order by c1 desc limit 1; +explain format = 'brief' select * from t4 use index(idx) where a > 1 and b > 1 and c > 1 limit 1; +explain format = 'brief' select * from t4 where a > 1 and c > 1 limit 1; +explain format = 'brief' select ifnull(null, t1.c1) from t1; +explain format = 'brief' select if(10, t1.c1, t1.c2) from t1; +explain format = 'brief' select c1 from t2 union select c1 from t2 union all select c1 from t2; +explain format = 'brief' select c1 from t2 union all select c1 from t2 union select c1 from t2; select * from information_schema.tidb_indexes where table_name='t4'; # https://github.com/pingcap/tidb/issues/9125 -explain select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; -explain select 1 from (select count(c2), count(c3) from t1) k; -explain select count(1) from (select max(c2), count(c3) as m from t1) k; -explain select count(1) from (select count(c2) from t1 group by c3) k; +explain format = 'brief' select count(1) from (select count(1) from (select * from t1 where c3 = 100) k) k2; +explain format = 'brief' select 1 from (select count(c2), count(c3) from t1) k; +explain format = 'brief' select count(1) from (select max(c2), count(c3) as m from t1) k; +explain format = 'brief' select count(1) from (select count(c2) from t1 group by c3) k; set @@session.tidb_opt_insubq_to_join_and_agg=0; -explain select sum(t1.c1 in (select c1 from t2)) from t1; -explain select 1 in (select c2 from t2) from t1; -explain select sum(6 in (select c2 from t2)) from t1; +explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; +explain format = 'brief' select 1 in (select c2 from t2) from t1; +explain format = 'brief' select sum(6 in (select c2 from t2)) from t1; explain format="dot" select sum(t1.c1 in (select c1 from t2)) from t1; explain format="dot" select 1 in (select c2 from t2) from t1; @@ -60,53 +60,53 @@ drop table if exists t1, t2, t3, t4; drop table if exists t; create table t(a int primary key, b int, c int, index idx(b)); -explain select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s ignore index(idx), t t1 where s.a = t.a and s.a = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.a = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = t.a and s.c = t1.a) from t; insert into t values(1, 1, 1), (2, 2 ,2), (3, 3, 3), (4, 3, 4),(5,3,5); analyze table t; -explain select t.c in (select count(*) from t s, t t1 where s.b = t.a and s.b = 3 and s.a = t1.a) from t; -explain select t.c in (select count(*) from t s left join t t1 on s.a = t1.a where 3 = t.a and s.b = 3) from t; -explain select t.c in (select count(*) from t s right join t t1 on s.a = t1.a where 3 = t.a and t1.b = 3) from t; +explain format = 'brief' select t.c in (select count(*) from t s, t t1 where s.b = t.a and s.b = 3 and s.a = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s left join t t1 on s.a = t1.a where 3 = t.a and s.b = 3) from t; +explain format = 'brief' select t.c in (select count(*) from t s right join t t1 on s.a = t1.a where 3 = t.a and t1.b = 3) from t; drop table if exists t; create table t(a int unsigned); -explain select t.a = '123455' from t; -explain select t.a > '123455' from t; -explain select t.a != '123455' from t; -explain select t.a = 12345678912345678998789678687678.111 from t; +explain format = 'brief' select t.a = '123455' from t; +explain format = 'brief' select t.a > '123455' from t; +explain format = 'brief' select t.a != '123455' from t; +explain format = 'brief' select t.a = 12345678912345678998789678687678.111 from t; drop table if exists t; create table t(a bigint, b bigint, index idx(a, b)); -explain select * from t where a in (1, 2) and a in (1, 3); -explain select * from t where b in (1, 2) and b in (1, 3); -explain select * from t where a = 1 and a = 1; -explain select * from t where a = 1 and a = 2; -explain select * from t where b = 1 and b = 2; -explain select * from t t1 join t t2 where t1.b = t2.b and t2.b is null; -explain select * from t t1 where not exists (select * from t t2 where t1.b = t2.b); +explain format = 'brief' select * from t where a in (1, 2) and a in (1, 3); +explain format = 'brief' select * from t where b in (1, 2) and b in (1, 3); +explain format = 'brief' select * from t where a = 1 and a = 1; +explain format = 'brief' select * from t where a = 1 and a = 2; +explain format = 'brief' select * from t where b = 1 and b = 2; +explain format = 'brief' select * from t t1 join t t2 where t1.b = t2.b and t2.b is null; +explain format = 'brief' select * from t t1 where not exists (select * from t t2 where t1.b = t2.b); drop table if exists t; create table t(a bigint primary key); -explain select * from t where a = 1 and a = 2; -explain select null or a > 1 from t; -explain select * from t where a = 1 for update; +explain format = 'brief' select * from t where a = 1 and a = 2; +explain format = 'brief' select null or a > 1 from t; +explain format = 'brief' select * from t where a = 1 for update; drop table if exists ta, tb; create table ta (a varchar(20)); create table tb (a varchar(20)); begin; insert tb values ('1'); -explain select * from ta where a = 1; +explain format = 'brief' select * from ta where a = 1; rollback; # outer join elimination drop table if exists t1, t2; create table t1(a int, b int, c int, primary key(a, b)); create table t2(a int, b int, c int, primary key(a)); -explain select t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; -explain select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; +explain format = 'brief' select t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; +explain format = 'brief' select distinct t1.a, t1.b from t1 left outer join t2 on t1.a = t2.a; CREATE TABLE `test01` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, @@ -124,48 +124,48 @@ CREATE TABLE `test02` ( PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -EXPLAIN SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS; +explain format = 'brief' SELECT COUNT(1) FROM (SELECT COALESCE(b.region_name, '不详') region_name, SUM(a.registration_num) registration_num FROM (SELECT stat_date, show_date, region_id, 0 registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202 UNION ALL SELECT stat_date, show_date, region_id, registration_num registration_num FROM test01 WHERE period = 1 AND stat_date >= 20191202 AND stat_date <= 20191202) a LEFT JOIN test02 b ON a.region_id = b.id WHERE registration_num > 0 AND a.stat_date >= '20191202' AND a.stat_date <= '20191202' GROUP BY a.stat_date , a.show_date , COALESCE(b.region_name, '不详') ) JLS; # https://github.com/pingcap/tidb/issues/7918 drop table if exists t; create table t(a int, nb int not null, nc int not null); -explain select ifnull(a, 0) from t; -explain select ifnull(nb, 0) from t; -explain select ifnull(nb, 0), ifnull(nc, 0) from t; -explain select ifnull(a, 0), ifnull(nb, 0) from t; -explain select ifnull(nb, 0), ifnull(nb, 0) from t; -explain select 1+ifnull(nb, 0) from t; -explain select 1+ifnull(a, 0) from t; -explain select 1+ifnull(nb, 0) from t where nb=1; +explain format = 'brief' select ifnull(a, 0) from t; +explain format = 'brief' select ifnull(nb, 0) from t; +explain format = 'brief' select ifnull(nb, 0), ifnull(nc, 0) from t; +explain format = 'brief' select ifnull(a, 0), ifnull(nb, 0) from t; +explain format = 'brief' select ifnull(nb, 0), ifnull(nb, 0) from t; +explain format = 'brief' select 1+ifnull(nb, 0) from t; +explain format = 'brief' select 1+ifnull(a, 0) from t; +explain format = 'brief' select 1+ifnull(nb, 0) from t where nb=1; # ifnull can be eliminated -explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(ta.nb, 1) or ta.nb is null; -explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; -explain select * from t ta inner join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; -explain select ifnull(t.nc, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; +explain format = 'brief' select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(ta.nb, 1) or ta.nb is null; +explain format = 'brief' select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; +explain format = 'brief' select * from t ta inner join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.nb, 1) or tb.nb is null; +explain format = 'brief' select ifnull(t.nc, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; # ifnull cannot be eliminated -explain select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; -explain select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; +explain format = 'brief' select * from t ta left outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; +explain format = 'brief' select * from t ta right outer join t tb on ta.nb = tb.nb and ta.a > 1 where ifnull(tb.a, 1) or tb.a is null; # when it comes to inner join case, ifnull can always be eliminated on not null column -explain select ifnull(t.a, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; +explain format = 'brief' select ifnull(t.a, 1) in (select count(*) from t s , t t1 where s.a = t.a and s.a = t1.a) from t; drop table if exists t; create table t(a int); -explain select * from t where _tidb_rowid = 0; -explain select * from t where _tidb_rowid > 0; -explain select a, _tidb_rowid from t where a > 0; -explain select * from t where _tidb_rowid > 0 and a > 0; +explain format = 'brief' select * from t where _tidb_rowid = 0; +explain format = 'brief' select * from t where _tidb_rowid > 0; +explain format = 'brief' select a, _tidb_rowid from t where a > 0; +explain format = 'brief' select * from t where _tidb_rowid > 0 and a > 0; drop table if exists t; create table t(a int, b int, c int); -explain select * from (select * from t order by (select 2)) t order by a, b; -explain select * from (select * from t order by c) t order by a, b; +explain format = 'brief' select * from (select * from t order by (select 2)) t order by a, b; +explain format = 'brief' select * from (select * from t order by c) t order by a, b; drop table if exists t; set @@session.tidb_opt_insubq_to_join_and_agg=1; -explain SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; -explain SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); +explain format = 'brief' SELECT 0 AS a FROM dual UNION SELECT 1 AS a FROM dual ORDER BY a; +explain format = 'brief' SELECT 0 AS a FROM dual UNION (SELECT 1 AS a FROM dual ORDER BY a); create table t (i int key, j int, unique key (i, j)); begin; insert into t values (1, 1); -explain update t set j = -j where i = 1 and j = 1; +explain format = 'brief' update t set j = -j where i = 1 and j = 1; rollback; drop table if exists t; @@ -173,32 +173,32 @@ drop table if exists t; create table t(a int); begin; insert into t values (1); -explain select * from t left outer join t t1 on t.a = t1.a where t.a not between 1 and 2; +explain format = 'brief' select * from t left outer join t t1 on t.a = t1.a where t.a not between 1 and 2; rollback; drop table if exists t; create table t(a time, b date); insert into t values (1, "1000-01-01"), (2, "1000-01-02"), (3, "1000-01-03"); analyze table t; -explain select * from t where a = 1; -explain select * from t where b = "1000-01-01"; +explain format = 'brief' select * from t where a = 1; +explain format = 'brief' select * from t where b = "1000-01-01"; drop table t; create table t(a int); insert into t values (1),(2),(2),(2),(9),(9),(9),(10); analyze table t with 1 buckets; -explain select * from t where a >= 3 and a <= 8; +explain format = 'brief' select * from t where a >= 3 and a <= 8; drop table t; # https://github.com/pingcap/tidb/issues/10626 create table t(a int, b int, index idx_ab(a, b)); -explain select a, b from t where a in (1) order by b; -explain select a, b from t where a = 1 order by b; +explain format = 'brief' select a, b from t where a in (1) order by b; +explain format = 'brief' select a, b from t where a = 1 order by b; drop table if exists t; # https://github.com/pingcap/tidb/issues/11903 create table t(a int, b int); -explain select a, b from (select a, b, avg(b) over (partition by a)as avg_b from t) as tt where a > 10 and b < 10 and a > avg_b; +explain format = 'brief' select a, b from (select a, b, avg(b) over (partition by a)as avg_b from t) as tt where a > 10 and b < 10 and a > avg_b; drop table if exists t; create table t(a int, b int); @@ -207,6 +207,14 @@ drop table if exists t; # select / update should choose same access path for table t. create table t(a binary(16) not null, b varchar(2) default null, c varchar(100) default 'aaaa', key (a,b)); -explain select * from t where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; -explain update t set c = 'ssss' where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; +explain format = 'brief' select * from t where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; +explain format = 'brief' update t set c = 'ssss' where a=x'FA34E1093CB428485734E3917F000000' and b='xb'; +drop table if exists t; + +create table t(a int, b int); +explain format = 'brief' select (select count(n.a) from t) from t n; +explain format = 'brief' select (select sum((select count(a)))) from t; +explain format = 'brief' select count(a) from t group by b order by (select count(a)); +explain format = 'brief' select (select sum(count(a))) from t; +explain format = 'brief' select sum(a), (select sum(a)), count(a) from t group by b order by (select count(a)); drop table if exists t; diff --git a/cmd/explaintest/t/explain_easy_stats.test b/cmd/explaintest/t/explain_easy_stats.test index 5596cdefe1892..cad15dc2db0b5 100644 --- a/cmd/explaintest/t/explain_easy_stats.test +++ b/cmd/explaintest/t/explain_easy_stats.test @@ -14,51 +14,51 @@ set @@session.tidb_hashagg_partial_concurrency = 1; set @@session.tidb_hashagg_final_concurrency = 1; -explain select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); -explain select * from t1; -explain select * from t1 order by c2; -explain select * from t2 order by c2; -explain select * from t1 where t1.c1 > 0; -explain select t1.c1, t1.c2 from t1 where t1.c2 = 1; -explain select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; -explain update t1 set t1.c2 = 2 where t1.c1 = 1; -explain delete from t1 where t1.c2 = 1; -explain select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; -explain select * from t2 order by t2.c2 limit 0, 1; -explain select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; -explain select * from t1 where c1 = 1 and c2 > 1; +explain format = 'brief' select * from t3 where exists (select s.a from t3 s having sum(s.a) = t3.a ); +explain format = 'brief' select * from t1; +explain format = 'brief' select * from t1 order by c2; +explain format = 'brief' select * from t2 order by c2; +explain format = 'brief' select * from t1 where t1.c1 > 0; +explain format = 'brief' select t1.c1, t1.c2 from t1 where t1.c2 = 1; +explain format = 'brief' select * from t1 left join t2 on t1.c2 = t2.c1 where t1.c1 > 1; +explain format = 'brief' update t1 set t1.c2 = 2 where t1.c1 = 1; +explain format = 'brief' delete from t1 where t1.c2 = 1; +explain format = 'brief' select count(b.c2) from t1 a, t2 b where a.c1 = b.c2 group by a.c1; +explain format = 'brief' select * from t2 order by t2.c2 limit 0, 1; +explain format = 'brief' select * from t1 where c1 > 1 and c2 = 1 and c3 < 1; +explain format = 'brief' select * from t1 where c1 = 1 and c2 > 1; # TODO: Add this test after support stream agg on TiKV. -# explain select sum(t1.c1 in (select c1 from t2)) from t1; +# explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; # id parents children task operator info count # TableScan_20 StreamAgg_13 cop table:t1, range:(-inf,+inf), keep order:false 8000 # StreamAgg_13 TableScan_20 cop , funcs:sum(in(test.t1.c1, 1, 2)) 1 # TableReader_22 StreamAgg_21 root data:StreamAgg_13 1 # StreamAgg_21 TableReader_22 root , funcs:sum(col_0) 1 -explain select c1 from t1 where c1 in (select c2 from t2); -# explain select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; -explain select * from information_schema.columns; -explain select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; -explain select * from t1 order by c1 desc limit 1; +explain format = 'brief' select c1 from t1 where c1 in (select c2 from t2); +# explain format = 'brief' select (select count(1) k from t1 s where s.c1 = t1.c1 having k != 0) from t1; +explain format = 'brief' select * from information_schema.columns; +explain format = 'brief' select c2 = (select c2 from t2 where t1.c1 = t2.c1 order by c1 limit 1) from t1; +explain format = 'brief' select * from t1 order by c1 desc limit 1; set @@session.tidb_opt_insubq_to_join_and_agg=0; -# explain select sum(t1.c1 in (select c1 from t2)) from t1; +# explain format = 'brief' select sum(t1.c1 in (select c1 from t2)) from t1; -explain select 1 in (select c2 from t2) from t1; +explain format = 'brief' select 1 in (select c2 from t2) from t1; -# explain select sum(6 in (select c2 from t2)) from t1; +# explain format = 'brief' select sum(6 in (select c2 from t2)) from t1; # explain format="dot" select sum(t1.c1 in (select c1 from t2)) from t1; explain format="dot" select 1 in (select c2 from t2) from t1; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 1; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 0; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 ORDER BY a; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b; -explain select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b ORDER BY a limit 1; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 1; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1, 0; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 ORDER BY a; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b; +explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b ORDER BY a limit 1; drop table if exists t1, t2, t3, index_prune; set @@session.tidb_opt_insubq_to_join_and_agg=1; @@ -66,4 +66,4 @@ set @@session.tidb_opt_insubq_to_join_and_agg=1; drop table if exists tbl; create table tbl(column1 int, column2 int, index idx(column1, column2)); load stats 's/explain_easy_stats_tbl_dnf.json'; -explain select * from tbl where (column1=0 and column2=1) or (column1=1 and column2=3) or (column1=2 and column2=5); +explain format = 'brief' select * from tbl where (column1=0 and column2=1) or (column1=1 and column2=3) or (column1=2 and column2=5); diff --git a/cmd/explaintest/t/explain_generate_column_substitute.test b/cmd/explaintest/t/explain_generate_column_substitute.test index ee9008bf32351..78096628c293d 100644 --- a/cmd/explaintest/t/explain_generate_column_substitute.test +++ b/cmd/explaintest/t/explain_generate_column_substitute.test @@ -133,35 +133,44 @@ desc update t set a=2, b = 3 where b+a = 3; desc delete from t where a+1 = 3; desc delete from t where b+a = 0; +# test expression index substitution use point get +alter table t drop index expr_idx_c; +alter table t drop index expr_idx_e; +truncate table t; +alter table t add UNIQUE expr_idx_c((a+1)); +alter table t add UNIQUE expr_idx_e((b+a)); +insert into t values (2, 2.1, default, default); +desc select * from t where a+1 = 3; + # test flen for float and double drop table if exists t0; create table t0(c0 float(24), c1 double as (c0) unique); -explain select c0 from t0; -- TableRead +explain format = 'brief' select c0 from t0; -- TableRead drop table if exists t0; create table t0(c0 float(25), c1 double as (c0) unique); -explain select c0 from t0; -- IndexRead +explain format = 'brief' select c0 from t0; -- IndexRead drop table if exists t0; -create table t0(c0 double(24), c1 double as (c0) unique); -explain select c0 from t0; -- IndexRead +create table t0(c0 double, c1 double as (c0) unique); +explain format = 'brief' select c0 from t0; -- IndexRead drop table if exists t0; -create table t0(c0 double(25), c1 double as (c0) unique); -explain select c0 from t0; -- IndexRead +create table t0(c0 double, c1 double as (c0) unique); +explain format = 'brief' select c0 from t0; -- IndexRead drop table if exists t0; create table t0(c0 float(24), c1 float as (c0) unique); -explain select c0 from t0; -- IndexRead +explain format = 'brief' select c0 from t0; -- IndexRead drop table if exists t0; create table t0(c0 float(25), c1 float as (c0) unique); -explain select c0 from t0; -- TableRead +explain format = 'brief' select c0 from t0; -- TableRead drop table if exists t0; -create table t0(c0 double(24), c1 float as (c0) unique); -explain select c0 from t0; -- TableRead +create table t0(c0 double, c1 float as (c0) unique); +explain format = 'brief' select c0 from t0; -- TableRead drop table if exists t0; -create table t0(c0 double(25), c1 float as (c0) unique); -explain select c0 from t0; -- TableRead +create table t0(c0 double, c1 float as (c0) unique); +explain format = 'brief' select c0 from t0; -- TableRead diff --git a/cmd/explaintest/t/explain_indexmerge.test b/cmd/explaintest/t/explain_indexmerge.test index 372d23b5c1392..c58602f81a40b 100644 --- a/cmd/explaintest/t/explain_indexmerge.test +++ b/cmd/explaintest/t/explain_indexmerge.test @@ -5,26 +5,39 @@ create index tc on t (c); create index td on t (d); # generate a, b, c, d, e, f from 0 to 5000000 and a = b = c = d = e = f load stats 's/explain_indexmerge_stats_t.json'; -explain select * from t where a < 50 or b < 50; -explain select * from t where (a < 50 or b < 50) and f > 100; -explain select * from t where b < 50 or c < 50; +explain format = 'brief' select * from t where a < 50 or b < 50; +explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; +explain format = 'brief' select * from t where b < 50 or c < 50; set session tidb_enable_index_merge = on; # choose the best plan based on cost -explain select * from t where a < 50 or b < 50; -explain select * from t where (a < 50 or b < 50) and f > 100; -explain select * from t where a < 50 or b < 5000000; -explain select * from t where b < 50 or c < 50; -explain select * from t where b < 50 or c < 5000000; -explain select * from t where a < 50 or b < 50 or c < 50; -explain select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; +explain format = 'brief' select * from t where a < 50 or b < 50; +explain format = 'brief' select * from t where (a < 50 or b < 50) and f > 100; +explain format = 'brief' select * from t where a < 50 or b < 5000000; +explain format = 'brief' select * from t where b < 50 or c < 50; +explain format = 'brief' select * from t where b < 50 or c < 5000000; +explain format = 'brief' select * from t where a < 50 or b < 50 or c < 50; +explain format = 'brief' select * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; explain format="dot" select * from t where (a < 50 or b < 50) and f > 100; set session tidb_enable_index_merge = off; # be forced to use IndexMerge -explain select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; -explain select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; -explain select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; -explain select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; +explain format = 'brief' select /*+ use_index_merge(t, primary, tb, tc) */ * from t where a <= 500000 or b <= 1000000 or c <= 3000000; +explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; +explain format = 'brief' select /*+ use_index_merge(t, tb, tc) */ * from t where (b < 10000 or c < 10000) and (a < 10 or d < 10) and f < 10; +explain format = 'brief' select /*+ use_index_merge(t, tb) */ * from t where b < 50 or c < 5000000; # no_index_merge hint -explain select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; +explain format = 'brief' select /*+ no_index_merge(), use_index_merge(t, tb, tc) */ * from t where b < 50 or c < 5000000; # tableScan can be a partial path to fetch handle -explain select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; +explain format = 'brief' select /*+ use_index_merge(t, primary, tb) */ * from t where a < 50 or b < 5000000; +# composed index +set session tidb_enable_index_merge = on; +drop table if exists t; +CREATE TABLE t ( + `id` int(11) NOT NULL, + `aid` bigint, + `c1` varchar(255) DEFAULT NULL, + `c2` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `aid_c1` (`aid`,`c1`), + KEY `aid_c2` (`aid`,`c2`) +); +desc select /*+ USE_INDEX_MERGE(t, aid_c1, aid_c2) */ * from t where (aid = 1 and c1='aaa') or (aid = 2 and c2='bbb'); diff --git a/cmd/explaintest/t/explain_join_stats.test b/cmd/explaintest/t/explain_join_stats.test index 5734466b76cd2..39092af0cbfe3 100644 --- a/cmd/explaintest/t/explain_join_stats.test +++ b/cmd/explaintest/t/explain_join_stats.test @@ -5,6 +5,6 @@ load stats 's/explain_join_stats_e.json'; create table lo(a int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (a)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30002; load stats 's/explain_join_stats_lo.json'; -- HashJoin(43ms) would execute faster than IndexJoin(1230ms) -explain select count(*) from e, lo where lo.a=e.a and e.b=22336; +explain format = 'brief' select count(*) from e, lo where lo.a=e.a and e.b=22336; -- Pay attention to the estimated row count of e -explain select /*+ TIDB_INLJ(e) */ count(*) from e, lo where lo.a=e.a and e.b=22336; +explain format = 'brief' select /*+ TIDB_INLJ(e) */ count(*) from e, lo where lo.a=e.a and e.b=22336; diff --git a/cmd/explaintest/t/explain_union_scan.test b/cmd/explaintest/t/explain_union_scan.test index f3e492495dd77..6e904ad3c7a89 100644 --- a/cmd/explaintest/t/explain_union_scan.test +++ b/cmd/explaintest/t/explain_union_scan.test @@ -16,6 +16,6 @@ begin; update city set province_id = 77 where id="06766b3ef41d484d8878606393f1ed0b"; -explain select t1.*, t2.province_id as provinceID, t2.city_name as cityName, t3.description as description from city t1 inner join city t2 on t1.id = t2.id left join city t3 on t1.province_id = t3.province_id where t1.province_id > 1 and t1.province_id < 100 limit 10; +explain format = 'brief' select t1.*, t2.province_id as provinceID, t2.city_name as cityName, t3.description as description from city t1 inner join city t2 on t1.id = t2.id left join city t3 on t1.province_id = t3.province_id where t1.province_id > 1 and t1.province_id < 100 limit 10; commit; diff --git a/cmd/explaintest/t/generated_columns.test b/cmd/explaintest/t/generated_columns.test index 17198b23ecade..82dfcf4d1d8c8 100644 --- a/cmd/explaintest/t/generated_columns.test +++ b/cmd/explaintest/t/generated_columns.test @@ -2,7 +2,7 @@ -- Most of the cases are ported from other tests to make sure generated columns behaves the same. -- Stored generated columns as indices -set @@tidb_partition_prune_mode='dynamic-only'; +set @@tidb_partition_prune_mode='dynamic'; DROP TABLE IF EXISTS person; CREATE TABLE person ( @@ -13,7 +13,7 @@ CREATE TABLE person ( KEY (city) ); -EXPLAIN SELECT name, id FROM person WHERE city = 'Beijing'; +EXPLAIN format = 'brief' SELECT name, id FROM person WHERE city = 'Beijing'; DROP TABLE IF EXISTS `sgc`; @@ -27,10 +27,10 @@ CREATE TABLE `sgc` ( KEY `idx_a_b` (`a`,`b`) ); -EXPLAIN SELECT a FROM sgc where a < 3; -EXPLAIN SELECT a, b FROM sgc where a < 3; -EXPLAIN SELECT a, b from sgc where b < 3; -EXPLAIN SELECT a, b from sgc where a < 3 and b < 3; +EXPLAIN format = 'brief' SELECT a FROM sgc where a < 3; +EXPLAIN format = 'brief' SELECT a, b FROM sgc where a < 3; +EXPLAIN format = 'brief' SELECT a, b from sgc where b < 3; +EXPLAIN format = 'brief' SELECT a, b from sgc where a < 3 and b < 3; DROP TABLE IF EXISTS sgc1, sgc2; @@ -68,8 +68,8 @@ VALUES ('{"a": 1}', '{"1": "1"}'); ANALYZE TABLE sgc1, sgc2; -EXPLAIN SELECT /*+ TIDB_INLJ(sgc1, sgc2) */ * from sgc1 join sgc2 on sgc1.a=sgc2.a; -EXPLAIN SELECT * from sgc1 join sgc2 on sgc1.a=sgc2.a; +EXPLAIN format = 'brief' SELECT /*+ TIDB_INLJ(sgc1, sgc2) */ * from sgc1 join sgc2 on sgc1.a=sgc2.a; +EXPLAIN format = 'brief' SELECT * from sgc1 join sgc2 on sgc1.a=sgc2.a; -- Stored generated columns as partition columns @@ -88,8 +88,8 @@ PARTITION p4 VALUES LESS THAN (5), PARTITION p5 VALUES LESS THAN (6), PARTITION max VALUES LESS THAN MAXVALUE); -EXPLAIN SELECT * FROM sgc3 WHERE a <= 1; -EXPLAIN SELECT * FROM sgc3 WHERE a < 7; +EXPLAIN format = 'brief' SELECT * FROM sgc3 WHERE a <= 1; +EXPLAIN format = 'brief' SELECT * FROM sgc3 WHERE a < 7; -- Virtual generated columns as indices @@ -97,10 +97,10 @@ DROP TABLE IF EXISTS t1; CREATE TABLE t1(a INT, b INT AS (a+1) VIRTUAL, c INT AS (b+1) VIRTUAL, d INT AS (c+1) VIRTUAL, KEY(b), INDEX IDX(c, d)); INSERT INTO t1 (a) VALUES (0); -EXPLAIN SELECT b FROM t1 WHERE b=1; -EXPLAIN SELECT b, c, d FROM t1 WHERE b=1; -EXPLAIN SELECT * FROM t1 WHERE b=1; -EXPLAIN SELECT c FROM t1 WHERE c=2 AND d=3; +EXPLAIN format = 'brief' SELECT b FROM t1 WHERE b=1; +EXPLAIN format = 'brief' SELECT b, c, d FROM t1 WHERE b=1; +EXPLAIN format = 'brief' SELECT * FROM t1 WHERE b=1; +EXPLAIN format = 'brief' SELECT c FROM t1 WHERE c=2 AND d=3; DROP TABLE IF EXISTS person; CREATE TABLE person ( @@ -111,7 +111,7 @@ city_no INT AS (JSON_EXTRACT(address_info, '$.city_no')) VIRTUAL, KEY(city_no)); INSERT INTO person (name, address_info) VALUES ("John", CAST('{"city_no": 1}' AS JSON)); -EXPLAIN SELECT name FROM person where city_no=1; +EXPLAIN format = 'brief' SELECT name FROM person where city_no=1; -- Virtual generated columns in aggregate statement -- ISSUE https://github.com/pingcap/tidb/issues/14072 @@ -123,18 +123,18 @@ CREATE TABLE t1 (a INT, index (c)); INSERT INTO t1 (a) VALUES (2), (1), (1), (3), (NULL); -EXPLAIN SELECT sum(a) FROM t1 GROUP BY b; -EXPLAIN SELECT sum(a) FROM t1 GROUP BY c; -EXPLAIN SELECT sum(b) FROM t1 GROUP BY a; -EXPLAIN SELECT sum(b) FROM t1 GROUP BY c; -EXPLAIN SELECT sum(c) FROM t1 GROUP BY a; -EXPLAIN SELECT sum(c) FROM t1 GROUP BY b; +EXPLAIN format = 'brief' SELECT sum(a) FROM t1 GROUP BY b; +EXPLAIN format = 'brief' SELECT sum(a) FROM t1 GROUP BY c; +EXPLAIN format = 'brief' SELECT sum(b) FROM t1 GROUP BY a; +EXPLAIN format = 'brief' SELECT sum(b) FROM t1 GROUP BY c; +EXPLAIN format = 'brief' SELECT sum(c) FROM t1 GROUP BY a; +EXPLAIN format = 'brief' SELECT sum(c) FROM t1 GROUP BY b; -- Virtual generated column for point get and batch point get DROP TABLE IF EXISTS tu; CREATE TABLE tu (a INT, b INT, c INT GENERATED ALWAYS AS (a + b) VIRTUAL, primary key (a), unique key uk(c)); INSERT INTO tu(a, b) VALUES(1, 2); -EXPLAIN SELECT * FROM tu WHERE c = 1; -EXPLAIN SELECT a, c FROM tu WHERE c = 1; -EXPLAIN SELECT * FROM tu WHERE c in(1, 2, 3); -EXPLAIN SELECT c, a FROM tu WHERE c in(1, 2, 3); +EXPLAIN format = 'brief' SELECT * FROM tu WHERE c = 1; +EXPLAIN format = 'brief' SELECT a, c FROM tu WHERE c = 1; +EXPLAIN format = 'brief' SELECT * FROM tu WHERE c in(1, 2, 3); +EXPLAIN format = 'brief' SELECT c, a FROM tu WHERE c in(1, 2, 3); diff --git a/cmd/explaintest/t/index_join.test b/cmd/explaintest/t/index_join.test index 6cd0806d6f298..c0636a876dc4e 100644 --- a/cmd/explaintest/t/index_join.test +++ b/cmd/explaintest/t/index_join.test @@ -10,8 +10,8 @@ set session tidb_hashagg_final_concurrency = 1; -- Test https://github.com/pingcap/tidb/issues/9577 -- we expect the following two SQL chose t2 as the outer table -explain select /*+ TIDB_INLJ(t1, t2) */ * from t1 join t2 on t1.a=t2.a; -explain select * from t1 join t2 on t1.a=t2.a; +explain format = 'brief' select /*+ TIDB_INLJ(t1, t2) */ * from t1 join t2 on t1.a=t2.a; +explain format = 'brief' select * from t1 join t2 on t1.a=t2.a; -- Test https://github.com/pingcap/tidb/issues/10516 drop table if exists t1, t2; @@ -19,11 +19,11 @@ create table t1(a int not null, b int not null); create table t2(a int not null, b int not null, key a(a)); set @@tidb_opt_insubq_to_join_and_agg=0; -explain select /*+ TIDB_INLJ(t2@sel_2) */ * from t1 where t1.a in (select t2.a from t2); +explain format = 'brief' select /*+ TIDB_INLJ(t2@sel_2) */ * from t1 where t1.a in (select t2.a from t2); show warnings; set @@tidb_opt_insubq_to_join_and_agg=1; drop table if exists t1, t2; create table t1(a int not null, b int not null, key a(a)); create table t2(a int not null, b int not null, key a(a)); -explain select /*+ TIDB_INLJ(t1) */ * from t1 where t1.a in (select t2.a from t2); +explain format = 'brief' select /*+ TIDB_INLJ(t1) */ * from t1 where t1.a in (select t2.a from t2); diff --git a/cmd/explaintest/t/partition_pruning.test b/cmd/explaintest/t/partition_pruning.test index ff6c5979cba80..cd322a0679c6c 100644 --- a/cmd/explaintest/t/partition_pruning.test +++ b/cmd/explaintest/t/partition_pruning.test @@ -26,11 +26,11 @@ PARTITION max VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); --replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; --replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # -EXPLAIN SELECT * FROM t1 WHERE a < 7; +explain format = 'brief' SELECT * FROM t1 WHERE a < 7; --replace_column 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 11 # -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; DROP TABLE t1; --echo # @@ -49,75 +49,75 @@ PARTITION max VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7),(8); SELECT * FROM t1 WHERE a < 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 1; +explain format = 'brief' SELECT * FROM t1 WHERE a < 1; SELECT * FROM t1 WHERE a < 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 2; +explain format = 'brief' SELECT * FROM t1 WHERE a < 2; SELECT * FROM t1 WHERE a < 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 3; +explain format = 'brief' SELECT * FROM t1 WHERE a < 3; SELECT * FROM t1 WHERE a < 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 4; +explain format = 'brief' SELECT * FROM t1 WHERE a < 4; SELECT * FROM t1 WHERE a < 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 5; +explain format = 'brief' SELECT * FROM t1 WHERE a < 5; SELECT * FROM t1 WHERE a < 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 6; +explain format = 'brief' SELECT * FROM t1 WHERE a < 6; SELECT * FROM t1 WHERE a < 7 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 7; +explain format = 'brief' SELECT * FROM t1 WHERE a < 7; SELECT * FROM t1 WHERE a <= 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; SELECT * FROM t1 WHERE a <= 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 2; SELECT * FROM t1 WHERE a <= 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 3; SELECT * FROM t1 WHERE a <= 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 4; SELECT * FROM t1 WHERE a <= 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 5; SELECT * FROM t1 WHERE a <= 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 6; SELECT * FROM t1 WHERE a <= 7 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 7; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 7; SELECT * FROM t1 WHERE a = 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 1; +explain format = 'brief' SELECT * FROM t1 WHERE a = 1; SELECT * FROM t1 WHERE a = 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 2; +explain format = 'brief' SELECT * FROM t1 WHERE a = 2; SELECT * FROM t1 WHERE a = 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 3; +explain format = 'brief' SELECT * FROM t1 WHERE a = 3; SELECT * FROM t1 WHERE a = 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 4; +explain format = 'brief' SELECT * FROM t1 WHERE a = 4; SELECT * FROM t1 WHERE a = 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 5; +explain format = 'brief' SELECT * FROM t1 WHERE a = 5; SELECT * FROM t1 WHERE a = 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 6; +explain format = 'brief' SELECT * FROM t1 WHERE a = 6; SELECT * FROM t1 WHERE a = 7 order by a; -EXPLAIN SELECT * FROM t1 WHERE a = 7; +explain format = 'brief' SELECT * FROM t1 WHERE a = 7; SELECT * FROM t1 WHERE a >= 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 1; SELECT * FROM t1 WHERE a >= 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 2; SELECT * FROM t1 WHERE a >= 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 3; SELECT * FROM t1 WHERE a >= 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 4; SELECT * FROM t1 WHERE a >= 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 5; SELECT * FROM t1 WHERE a >= 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 6; SELECT * FROM t1 WHERE a >= 7 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 7; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 7; SELECT * FROM t1 WHERE a > 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 1; +explain format = 'brief' SELECT * FROM t1 WHERE a > 1; SELECT * FROM t1 WHERE a > 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 2; +explain format = 'brief' SELECT * FROM t1 WHERE a > 2; SELECT * FROM t1 WHERE a > 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 3; +explain format = 'brief' SELECT * FROM t1 WHERE a > 3; SELECT * FROM t1 WHERE a > 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 4; +explain format = 'brief' SELECT * FROM t1 WHERE a > 4; SELECT * FROM t1 WHERE a > 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 5; +explain format = 'brief' SELECT * FROM t1 WHERE a > 5; SELECT * FROM t1 WHERE a > 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 6; +explain format = 'brief' SELECT * FROM t1 WHERE a > 6; SELECT * FROM t1 WHERE a > 7 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 7; +explain format = 'brief' SELECT * FROM t1 WHERE a > 7; DROP TABLE t1; CREATE TABLE t1 (a INT PRIMARY KEY) @@ -132,65 +132,65 @@ PARTITION max VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (-1),(0),(1),(2),(3),(4),(5),(6),(7); SELECT * FROM t1 WHERE a < 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 1; +explain format = 'brief' SELECT * FROM t1 WHERE a < 1; SELECT * FROM t1 WHERE a < 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 2; +explain format = 'brief' SELECT * FROM t1 WHERE a < 2; SELECT * FROM t1 WHERE a < 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 3; +explain format = 'brief' SELECT * FROM t1 WHERE a < 3; SELECT * FROM t1 WHERE a < 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 4; +explain format = 'brief' SELECT * FROM t1 WHERE a < 4; SELECT * FROM t1 WHERE a < 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 5; +explain format = 'brief' SELECT * FROM t1 WHERE a < 5; SELECT * FROM t1 WHERE a < 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a < 6; +explain format = 'brief' SELECT * FROM t1 WHERE a < 6; SELECT * FROM t1 WHERE a <= 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 1; SELECT * FROM t1 WHERE a <= 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 2; SELECT * FROM t1 WHERE a <= 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 3; SELECT * FROM t1 WHERE a <= 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 4; SELECT * FROM t1 WHERE a <= 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 5; SELECT * FROM t1 WHERE a <= 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a <= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a <= 6; SELECT * FROM t1 WHERE a = 1; -EXPLAIN SELECT * FROM t1 WHERE a = 1; +explain format = 'brief' SELECT * FROM t1 WHERE a = 1; SELECT * FROM t1 WHERE a = 2; -EXPLAIN SELECT * FROM t1 WHERE a = 2; +explain format = 'brief' SELECT * FROM t1 WHERE a = 2; SELECT * FROM t1 WHERE a = 3; -EXPLAIN SELECT * FROM t1 WHERE a = 3; +explain format = 'brief' SELECT * FROM t1 WHERE a = 3; SELECT * FROM t1 WHERE a = 4; -EXPLAIN SELECT * FROM t1 WHERE a = 4; +explain format = 'brief' SELECT * FROM t1 WHERE a = 4; SELECT * FROM t1 WHERE a = 5; -EXPLAIN SELECT * FROM t1 WHERE a = 5; +explain format = 'brief' SELECT * FROM t1 WHERE a = 5; SELECT * FROM t1 WHERE a = 6; -EXPLAIN SELECT * FROM t1 WHERE a = 6; +explain format = 'brief' SELECT * FROM t1 WHERE a = 6; SELECT * FROM t1 WHERE a >= 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 1; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 1; SELECT * FROM t1 WHERE a >= 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 2; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 2; SELECT * FROM t1 WHERE a >= 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 3; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 3; SELECT * FROM t1 WHERE a >= 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 4; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 4; SELECT * FROM t1 WHERE a >= 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 5; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 5; SELECT * FROM t1 WHERE a >= 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a >= 6; +explain format = 'brief' SELECT * FROM t1 WHERE a >= 6; SELECT * FROM t1 WHERE a > 1 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 1; +explain format = 'brief' SELECT * FROM t1 WHERE a > 1; SELECT * FROM t1 WHERE a > 2 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 2; +explain format = 'brief' SELECT * FROM t1 WHERE a > 2; SELECT * FROM t1 WHERE a > 3 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 3; +explain format = 'brief' SELECT * FROM t1 WHERE a > 3; SELECT * FROM t1 WHERE a > 4 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 4; +explain format = 'brief' SELECT * FROM t1 WHERE a > 4; SELECT * FROM t1 WHERE a > 5 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 5; +explain format = 'brief' SELECT * FROM t1 WHERE a > 5; SELECT * FROM t1 WHERE a > 6 order by a; -EXPLAIN SELECT * FROM t1 WHERE a > 6; +explain format = 'brief' SELECT * FROM t1 WHERE a > 6; DROP TABLE t1; # @@ -234,60 +234,60 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); DROP TABLE t1; @@ -306,60 +306,60 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); DROP TABLE t1; @@ -377,60 +377,60 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-02 23:59:59'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); DROP TABLE t1; @@ -448,60 +448,60 @@ INSERT INTO t1 VALUES (1, '2009-01-01'), (1, '2009-04-01'), (2, '2009-04-01'), (1, '2009-04-02'), (2, '2009-04-02'), (1, '2009-04-03'), (2, '2009-04-03'), (1, '2009-04-04'), (2, '2009-04-04'), (1, '2009-04-05'), (1, '2009-04-06'), (1, '2009-04-07'); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:59' AS DATETIME); -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; -EXPLAIN SELECT * FROM t1 WHERE b < '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b <= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b = '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b >= '2009-04-03'; -EXPLAIN SELECT * FROM t1 WHERE b > '2009-04-03'; -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03' AS DATE); +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03 00:00:00'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-02 23:59:59'; +explain format = 'brief' SELECT * FROM t1 WHERE b < '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b <= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b = '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b >= '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b > '2009-04-03'; +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-03 00:00:01' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b <= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b = CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b >= CAST('2009-04-02 23:59:58' AS DATETIME); -EXPLAIN SELECT * FROM t1 +explain format = 'brief' SELECT * FROM t1 WHERE b > CAST('2009-04-02 23:59:58' AS DATETIME); DROP TABLE t1; @@ -517,7 +517,7 @@ CREATE TABLE t1 ( PARTITION p20090405 VALUES LESS THAN MAXVALUE); INSERT INTO t1 VALUES (1, '2009-01-01'), (2, NULL); --echo # test with an invalid date, which lead to item->null_value is set. -EXPLAIN SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); +explain format = 'brief' SELECT * FROM t1 WHERE b < CAST('2009-04-99' AS DATETIME); DROP TABLE t1; # @@ -547,11 +547,11 @@ partition by range (a*1) ( ); insert into t3 values (5),(15); -explain select * from t3 where a=11; -explain select * from t3 where a=10; -explain select * from t3 where a=20; +explain format = 'brief' select * from t3 where a=11; +explain format = 'brief' select * from t3 where a=10; +explain format = 'brief' select * from t3 where a=20; -explain select * from t3 where a=30; +explain format = 'brief' select * from t3 where a=30; # RANGE(field) partitioning, interval analysis. create table t7 (a int not null) partition by RANGE(a) ( @@ -564,33 +564,33 @@ create table t7 (a int not null) partition by RANGE(a) ( insert into t7 values (10),(30),(50); # leftmost intervals -explain select * from t7 where a < 5; -explain select * from t7 where a < 9; -explain select * from t7 where a <= 9; -explain select * from t7 where a = 9; -explain select * from t7 where a >= 9; -explain select * from t7 where a > 9; -explain select * from t7 where a < 10; -explain select * from t7 where a <= 10; -explain select * from t7 where a = 10; -explain select * from t7 where a >= 10; -explain select * from t7 where a > 10; +explain format = 'brief' select * from t7 where a < 5; +explain format = 'brief' select * from t7 where a < 9; +explain format = 'brief' select * from t7 where a <= 9; +explain format = 'brief' select * from t7 where a = 9; +explain format = 'brief' select * from t7 where a >= 9; +explain format = 'brief' select * from t7 where a > 9; +explain format = 'brief' select * from t7 where a < 10; +explain format = 'brief' select * from t7 where a <= 10; +explain format = 'brief' select * from t7 where a = 10; +explain format = 'brief' select * from t7 where a >= 10; +explain format = 'brief' select * from t7 where a > 10; #rightmost intervals -explain select * from t7 where a < 89; -explain select * from t7 where a <= 89; -explain select * from t7 where a = 89; -explain select * from t7 where a > 89; -explain select * from t7 where a >= 89; -explain select * from t7 where a < 90; -explain select * from t7 where a <= 90; -explain select * from t7 where a = 90; -explain select * from t7 where a > 90; -explain select * from t7 where a >= 90; -explain select * from t7 where a > 91; +explain format = 'brief' select * from t7 where a < 89; +explain format = 'brief' select * from t7 where a <= 89; +explain format = 'brief' select * from t7 where a = 89; +explain format = 'brief' select * from t7 where a > 89; +explain format = 'brief' select * from t7 where a >= 89; +explain format = 'brief' select * from t7 where a < 90; +explain format = 'brief' select * from t7 where a <= 90; +explain format = 'brief' select * from t7 where a = 90; +explain format = 'brief' select * from t7 where a > 90; +explain format = 'brief' select * from t7 where a >= 90; +explain format = 'brief' select * from t7 where a > 91; # misc intervals -explain select * from t7 where a > 11 and a < 29; +explain format = 'brief' select * from t7 where a > 11 and a < 29; drop table t7; @@ -604,33 +604,33 @@ create table t7 (a int unsigned not null) partition by RANGE(a) ( insert into t7 values (10),(30),(50); # leftmost intervals -explain select * from t7 where a < 5; -explain select * from t7 where a < 9; -explain select * from t7 where a <= 9; -explain select * from t7 where a = 9; -explain select * from t7 where a >= 9; -explain select * from t7 where a > 9; -explain select * from t7 where a < 10; -explain select * from t7 where a <= 10; -explain select * from t7 where a = 10; -explain select * from t7 where a >= 10; -explain select * from t7 where a > 10; +explain format = 'brief' select * from t7 where a < 5; +explain format = 'brief' select * from t7 where a < 9; +explain format = 'brief' select * from t7 where a <= 9; +explain format = 'brief' select * from t7 where a = 9; +explain format = 'brief' select * from t7 where a >= 9; +explain format = 'brief' select * from t7 where a > 9; +explain format = 'brief' select * from t7 where a < 10; +explain format = 'brief' select * from t7 where a <= 10; +explain format = 'brief' select * from t7 where a = 10; +explain format = 'brief' select * from t7 where a >= 10; +explain format = 'brief' select * from t7 where a > 10; #rightmost intervals -explain select * from t7 where a < 89; -explain select * from t7 where a <= 89; -explain select * from t7 where a = 89; -explain select * from t7 where a > 89; -explain select * from t7 where a >= 89; -explain select * from t7 where a < 90; -explain select * from t7 where a <= 90; -explain select * from t7 where a = 90; -explain select * from t7 where a > 90; -explain select * from t7 where a >= 90; -explain select * from t7 where a > 91; +explain format = 'brief' select * from t7 where a < 89; +explain format = 'brief' select * from t7 where a <= 89; +explain format = 'brief' select * from t7 where a = 89; +explain format = 'brief' select * from t7 where a > 89; +explain format = 'brief' select * from t7 where a >= 89; +explain format = 'brief' select * from t7 where a < 90; +explain format = 'brief' select * from t7 where a <= 90; +explain format = 'brief' select * from t7 where a = 90; +explain format = 'brief' select * from t7 where a > 90; +explain format = 'brief' select * from t7 where a >= 90; +explain format = 'brief' select * from t7 where a > 91; # misc intervals -explain select * from t7 where a > 11 and a < 29; +explain format = 'brief' select * from t7 where a > 11 and a < 29; # LIST(monontonic_func) partitioning create table t8 (a date not null) partition by RANGE(YEAR(a)) ( @@ -640,7 +640,7 @@ create table t8 (a date not null) partition by RANGE(YEAR(a)) ( ); insert into t8 values ('1985-05-05'),('1995-05-05'); -explain select * from t8 where a < '1980-02-02'; +explain format = 'brief' select * from t8 where a < '1980-02-02'; # LIST(strict_monotonic_func) partitioning create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( @@ -650,8 +650,8 @@ create table t9 (a date not null) partition by RANGE(TO_DAYS(a)) ( ); insert into t9 values ('2005-05-05'), ('2005-04-04'); -explain select * from t9 where a < '2004-12-19'; -explain select * from t9 where a <= '2004-12-19'; +explain format = 'brief' select * from t9 where a < '2004-12-19'; +explain format = 'brief' select * from t9 where a <= '2004-12-19'; drop table t7,t8,t9; @@ -667,10 +667,10 @@ partition by range (a1) ( partition p2 values less than (9) ); insert into t1 values (1),(2),(3); -explain select * from t1 where a1 > 3; -explain select * from t1 where a1 >= 3; +explain format = 'brief' select * from t1 where a1 > 3; +explain format = 'brief' select * from t1 where a1 >= 3; -explain select * from t1 where a1 < 3 and a1 > 3; +explain format = 'brief' select * from t1 where a1 < 3 and a1 > 3; drop table t1; # Test partition pruning for single-table UPDATE/DELETE. @@ -713,14 +713,14 @@ insert into t2 select a,3 from t1 where a >= 400 and a < 600; insert into t2 select a,4 from t1 where a >= 600 and a < 800; insert into t2 select a,5 from t1 where a >= 800 and a < 1001; -explain select * from t2; -explain select * from t2 where a < 801 and a > 200; -explain select * from t2 where a < 801 and a > 800; -explain select * from t2 where a > 600; -explain select * from t2 where a > 600 and b = 1; -explain select * from t2 where a > 600 and b = 4; -explain select * from t2 where a > 600 and b = 5; -explain select * from t2 where b = 5; +explain format = 'brief' select * from t2; +explain format = 'brief' select * from t2 where a < 801 and a > 200; +explain format = 'brief' select * from t2 where a < 801 and a > 800; +explain format = 'brief' select * from t2 where a > 600; +explain format = 'brief' select * from t2 where a > 600 and b = 1; +explain format = 'brief' select * from t2 where a > 600 and b = 4; +explain format = 'brief' select * from t2 where a > 600 and b = 5; +explain format = 'brief' select * from t2 where b = 5; flush status; update t2 set b = 100 where b = 6; @@ -761,31 +761,31 @@ insert into t2 select a,7 from t1 where a >= 700 and a < 800; insert into t2 select a,8 from t1 where a >= 800 and a < 900; insert into t2 select a,9 from t1 where a >= 900 and a < 1001; -explain select * from t2; +explain format = 'brief' select * from t2; # not using indexes -explain select * from t2 where a = 101; -explain select * from t2 where a = 550; -explain select * from t2 where a = 833; -explain select * from t2 where a in (10,20,30); -explain select * from t2 where (a = 100 OR a = 900); -explain select * from t2 where (a > 100 AND a < 600); -explain select * from t2 where b = 4; +explain format = 'brief' select * from t2 where a = 101; +explain format = 'brief' select * from t2 where a = 550; +explain format = 'brief' select * from t2 where a = 833; +explain format = 'brief' select * from t2 where a in (10,20,30); +explain format = 'brief' select * from t2 where (a = 100 OR a = 900); +explain format = 'brief' select * from t2 where (a > 100 AND a < 600); +explain format = 'brief' select * from t2 where b = 4; -explain select * from t2 where b = 6; +explain format = 'brief' select * from t2 where b = 6; -explain select * from t2 where b in (1,3,5); +explain format = 'brief' select * from t2 where b in (1,3,5); -explain select * from t2 where b in (2,4,6); +explain format = 'brief' select * from t2 where b in (2,4,6); -explain select * from t2 where b in (7,8,9); +explain format = 'brief' select * from t2 where b in (7,8,9); -explain select * from t2 where b > 5; +explain format = 'brief' select * from t2 where b > 5; -explain select * from t2 where b > 5 and b < 8; +explain format = 'brief' select * from t2 where b > 5 and b < 8; -explain select * from t2 where b > 5 and b < 7; +explain format = 'brief' select * from t2 where b > 5 and b < 7; -explain select * from t2 where b > 0 and b < 5; +explain format = 'brief' select * from t2 where b > 0 and b < 5; flush status; update t2 set a = 111 where b = 10; @@ -818,9 +818,9 @@ show status like 'Handler_read_next'; drop table t1, t2; -# BUG#20484 "Partitions: crash with explain and union" +# BUG#20484 "Partitions: crash with explain format = 'brief' and union" create table t1 (s1 int); -explain select 1 from t1 union all select 2; +explain format = 'brief' select 1 from t1 union all select 2; drop table t1; # @@ -849,18 +849,18 @@ create table t2 (a int) insert into t1 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); insert into t2 values (0x20), (0x20), (0x41), (0x41), (0xFE), (0xFE); -explain select * from t1 where a=0; -explain select * from t2 where a=0; -explain select * from t1 where a=0xFE; -explain select * from t2 where a=0xFE; -explain select * from t1 where a > 0xFE AND a <= 0xFF; -explain select * from t2 where a > 0xFE AND a <= 0xFF; -explain select * from t1 where a >= 0xFE AND a <= 0xFF; -explain select * from t2 where a >= 0xFE AND a <= 0xFF; -explain select * from t1 where a < 64 AND a >= 63; -explain select * from t2 where a < 64 AND a >= 63; -explain select * from t1 where a <= 64 AND a >= 63; -explain select * from t2 where a <= 64 AND a >= 63; +explain format = 'brief' select * from t1 where a=0; +explain format = 'brief' select * from t2 where a=0; +explain format = 'brief' select * from t1 where a=0xFE; +explain format = 'brief' select * from t2 where a=0xFE; +explain format = 'brief' select * from t1 where a > 0xFE AND a <= 0xFF; +explain format = 'brief' select * from t2 where a > 0xFE AND a <= 0xFF; +explain format = 'brief' select * from t1 where a >= 0xFE AND a <= 0xFF; +explain format = 'brief' select * from t2 where a >= 0xFE AND a <= 0xFF; +explain format = 'brief' select * from t1 where a < 64 AND a >= 63; +explain format = 'brief' select * from t2 where a < 64 AND a >= 63; +explain format = 'brief' select * from t1 where a <= 64 AND a >= 63; +explain format = 'brief' select * from t2 where a <= 64 AND a >= 63; drop table t1; drop table t2; @@ -874,13 +874,13 @@ create table t1(a bigint unsigned not null) partition by range(a+0) ( insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); insert into t1 values (9),(19),(0xFFFF0000FFFF000-1), (0xFFFF0000FFFFFFF-1); -explain select * from t1 where +explain format = 'brief' select * from t1 where a >= 2305561538531885056-10 and a <= 2305561538531885056-8; -explain select * from t1 where +explain format = 'brief' select * from t1 where a > 0xFFFFFFFFFFFFFFEC and a < 0xFFFFFFFFFFFFFFEE; -explain select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; +explain format = 'brief' select * from t1 where a>=0 and a <= 0xFFFFFFFFFFFFFFFF; drop table t1; create table t1 (a bigint) partition by range(a+0) ( @@ -890,7 +890,7 @@ create table t1 (a bigint) partition by range(a+0) ( partition p4 values less than (1000) ); insert into t1 values (-15),(-5),(5),(15),(-15),(-5),(5),(15); -explain select * from t1 where a>-2 and a <=0; +explain format = 'brief' select * from t1 where a>-2 and a <=0; drop table t1; @@ -908,7 +908,7 @@ INSERT INTO t1 VALUES ('2007-03-07 12:00:00'); INSERT INTO t1 VALUES ('2007-03-08 12:00:00'); INSERT INTO t1 VALUES ('2007-03-15 12:00:00'); -- echo must use p0 only: -explain select * from t1 where recdate < '2007-03-08 00:00:00'; +explain format = 'brief' select * from t1 where recdate < '2007-03-08 00:00:00'; drop table t1; CREATE TABLE t1 ( recdate DATETIME NOT NULL ) @@ -922,7 +922,7 @@ INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); INSERT INTO t1 VALUES ('2006-03-01 12:00:00'); -- echo must use p0 only: -explain select * from t1 where recdate < '2006-01-01 00:00:00'; +explain format = 'brief' select * from t1 where recdate < '2006-01-01 00:00:00'; drop table t1; -- echo # @@ -939,31 +939,31 @@ create table t1 (a int) insert into t1 select A.a + 10*B.a from t0 A, t0 B; # this will use interval_via_walking -explain select * from t1 where a between 10 and 13; -explain select * from t1 where a between 10 and 10+33; +explain format = 'brief' select * from t1 where a between 10 and 13; +explain format = 'brief' select * from t1 where a between 10 and 10+33; drop table t0, t1; drop table if exists t; create table t(a timestamp) partition by range(unix_timestamp(a)) (partition p0 values less than(unix_timestamp('2019-02-16 14:20:00')), partition p1 values less than (maxvalue)); -explain select * from t where a between timestamp'2019-02-16 14:19:00' and timestamp'2019-02-16 14:21:00'; +explain format = 'brief' select * from t where a between timestamp'2019-02-16 14:19:00' and timestamp'2019-02-16 14:21:00'; drop table if exists t; create table t(a int) partition by range(a) (partition p0 values less than (100), partition p1 values less than (200), partition p2 values less than (300)); begin; -explain select * from t; +explain format = 'brief' select * from t; insert into t values(1); -explain select * from t; +explain format = 'brief' select * from t; rollback; begin; insert into t values(101); -explain select * from t; +explain format = 'brief' select * from t; rollback; begin; insert into t values(201); -explain select * from t; +explain format = 'brief' select * from t; rollback; -explain select * from t; +explain format = 'brief' select * from t; drop table if exists t; CREATE TABLE `t` ( @@ -990,28 +990,28 @@ partition by range (floor(unix_timestamp(ts))) ( partition p2 values less than (unix_timestamp('2020-04-25 00:00:00')) ); -explain select * from t where ts = '2020-04-06 00:00:00' -- p1; -explain select * from t where ts = '2020-04-05 00:00:00.001' -- p1; -explain select * from t where ts > '2020-04-15 00:00:00' -- p2; -explain select * from t where ts > '2020-04-14 23:59:59.999' -- p1,p2; -explain select * from t where ts > '2020-04-15 00:00:00.001' -- p2; -explain select * from t where ts > '2020-04-26 00:00:00.001' -- dual; -explain select * from t where ts >= '2020-04-04 12:22:32' -- p0,p1,p2; -explain select * from t where ts >= '2020-04-05 00:00:00' -- p1,p2; -explain select * from t where ts >= '2020-04-25 00:00:00' -- dual; -explain select * from t where ts < '2020-04-25 00:00:00' -- p0,p1,p2; -explain select * from t where ts < '2020-04-15 00:00:00.001' -- p0,p1,p2; -explain select * from t where ts < '2020-04-15 00:00:00' -- expect perfect : p0,p1, obtain: p0,p1,p2; -explain select * from t where ts < '2020-04-14 23:59:59.999' -- p0,p1; -explain select * from t where ts < '2020-04-03 00:00:00' -- p0; -explain select * from t where ts < '2021-05-03 00:00:00' -- p0,p1,p2; -explain select * from t where ts <= '2020-04-05 00:00:00' -- p0,p1; -explain select * from t where ts <= '2020-04-03 00:00:00' -- p0; -explain select * from t where ts <= '2020-04-14 23:59:59.123' -- p0,p1; -explain select * from t where ts <= '2020-04-25 00:00:00' -- p0,p1,p2; -explain select * from t where ts > '2020-04-25 00:00:00' or ts < '2020-01-02 00:00:00' -- p0; -explain select * from t where ts > '2020-04-02 00:00:00' and ts < '2020-04-07 00:00:00' -- p0,p1; +explain format = 'brief' select * from t where ts = '2020-04-06 00:00:00' -- p1; +explain format = 'brief' select * from t where ts = '2020-04-05 00:00:00.001' -- p1; +explain format = 'brief' select * from t where ts > '2020-04-15 00:00:00' -- p2; +explain format = 'brief' select * from t where ts > '2020-04-14 23:59:59.999' -- p1,p2; +explain format = 'brief' select * from t where ts > '2020-04-15 00:00:00.001' -- p2; +explain format = 'brief' select * from t where ts > '2020-04-26 00:00:00.001' -- dual; +explain format = 'brief' select * from t where ts >= '2020-04-04 12:22:32' -- p0,p1,p2; +explain format = 'brief' select * from t where ts >= '2020-04-05 00:00:00' -- p1,p2; +explain format = 'brief' select * from t where ts >= '2020-04-25 00:00:00' -- dual; +explain format = 'brief' select * from t where ts < '2020-04-25 00:00:00' -- p0,p1,p2; +explain format = 'brief' select * from t where ts < '2020-04-15 00:00:00.001' -- p0,p1,p2; +explain format = 'brief' select * from t where ts < '2020-04-15 00:00:00' -- expect perfect : p0,p1, obtain: p0,p1,p2; +explain format = 'brief' select * from t where ts < '2020-04-14 23:59:59.999' -- p0,p1; +explain format = 'brief' select * from t where ts < '2020-04-03 00:00:00' -- p0; +explain format = 'brief' select * from t where ts < '2021-05-03 00:00:00' -- p0,p1,p2; +explain format = 'brief' select * from t where ts <= '2020-04-05 00:00:00' -- p0,p1; +explain format = 'brief' select * from t where ts <= '2020-04-03 00:00:00' -- p0; +explain format = 'brief' select * from t where ts <= '2020-04-14 23:59:59.123' -- p0,p1; +explain format = 'brief' select * from t where ts <= '2020-04-25 00:00:00' -- p0,p1,p2; +explain format = 'brief' select * from t where ts > '2020-04-25 00:00:00' or ts < '2020-01-02 00:00:00' -- p0; +explain format = 'brief' select * from t where ts > '2020-04-02 00:00:00' and ts < '2020-04-07 00:00:00' -- p0,p1; drop table if exists t; create table t (id int, name varchar(20)) partition by hash(id) partitions 128; -explain SELECT * FROM t partition (p1) where name = '1'; +explain format = 'brief' SELECT * FROM t partition (p1) where name = '1'; diff --git a/cmd/explaintest/t/select.test b/cmd/explaintest/t/select.test index 552e511f79e49..77ace4a6d3512 100644 --- a/cmd/explaintest/t/select.test +++ b/cmd/explaintest/t/select.test @@ -142,34 +142,34 @@ insert into t1 values(5, 6, 7); insert into t1 values(6, 7, 8); insert into t1 values(7, 8, 9); insert into t1 values(9, 10, 11); -explain select a, c from t1 use index(idx) order by a limit 5; +explain format = 'brief' select a, c from t1 use index(idx) order by a limit 5; select c, a from t1 use index(idx) order by a limit 5; #test stream aggregation push down drop table if exists t; create table t (a int, b int, c int, key idx(a, b, c)); #test for empty table -explain select count(a) from t; +explain format = 'brief' select count(a) from t; select count(a) from t; #test for one row insert t values(0,0,0); -explain select distinct b from t group by a; +explain format = 'brief' select distinct b from t group by a; select distinct b from t group by a; -explain select count(b) from t group by a; +explain format = 'brief' select count(b) from t group by a; select count(b) from t group by a; #test for rows insert t values(1,1,1),(3,3,6),(3,2,5),(2,1,4),(1,1,3),(1,1,2); -explain select count(a) from t where b>0 group by a, b; +explain format = 'brief' select count(a) from t where b>0 group by a, b; select count(a) from t where b>0 group by a, b; -explain select count(a) from t where b>0 group by a, b order by a; +explain format = 'brief' select count(a) from t where b>0 group by a, b order by a; select count(a) from t where b>0 group by a, b order by a; -explain select count(a) from t where b>0 group by a, b order by a limit 1; +explain format = 'brief' select count(a) from t where b>0 group by a, b order by a limit 1; select count(a) from t where b>0 group by a, b order by a limit 1; # test outer join simplification, issue #7687 drop table if exists t; create table t (id int primary key, a int, b int); -explain select * from (t t1 left join t t2 on t1.a = t2.a) left join (t t3 left join t t4 on t3.a = t4.a) on t2.b = 1; +explain format = 'brief' select * from (t t1 left join t t2 on t1.a = t2.a) left join (t t3 left join t t4 on t3.a = t4.a) on t2.b = 1; drop table if exists t; create table t(a bigint primary key, b bigint); @@ -191,41 +191,56 @@ desc select * from th partition (p2,p1); # test != any(subq) and = all(subq) drop table if exists t; create table t(a int, b int); -explain select a != any (select a from t t2) from t t1; -explain select a = all (select a from t t2) from t t1; +explain format = 'brief' select a != any (select a from t t2) from t t1; +explain format = 'brief' select a = all (select a from t t2) from t t1; drop table if exists t; create table t(a int, b int); drop table if exists s; create table s(a varchar(20), b varchar(20)); -explain select a in (select a from s where s.b = t.b) from t; -explain select a in (select a+b from t t2 where t2.b = t1.b) from t t1; +explain format = 'brief' select a in (select a from s where s.b = t.b) from t; +explain format = 'brief' select a in (select a+b from t t2 where t2.b = t1.b) from t t1; drop table t; create table t(a int not null, b int); -explain select a in (select a from t t2 where t2.b = t1.b) from t t1; +explain format = 'brief' select a in (select a from t t2 where t2.b = t1.b) from t t1; # test sleep in subquery -explain select 1 from (select sleep(1)) t; +explain format = 'brief' select 1 from (select sleep(1)) t; # test order by rand() drop table if exists t; create table t(a int, b int); -explain select a from t order by rand(); -explain select a, b from t order by abs(2); -explain select a from t order by abs(rand())+1; +explain format = 'brief' select a from t order by rand(); +explain format = 'brief' select a, b from t order by abs(2); +explain format = 'brief' select a from t order by abs(rand())+1; # test order by correlated column drop table if exists t1; create table t1(a int, b int); drop table if exists t2; create table t2(a int, b int); -explain select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b); +explain format = 'brief' select * from t1 where t1.a in (select t2.a as a from t2 where t2.b > t1.b order by t1.b); # test fields with windows function drop table t; CREATE TABLE t (id int(10) unsigned NOT NULL AUTO_INCREMENT, i int(10) unsigned DEFAULT NULL, - x int(10) unsigned DEFAULT 0, + x int(10) unsigned DEFAULT '0', PRIMARY KEY (`id`) ); -explain select row_number() over( partition by i ) - x as rnk from t; +explain format = 'brief' select row_number() over( partition by i ) - x as rnk from t; + +# for issue 21692 +create table precise_types ( + a BIGINT UNSIGNED NOT NULL, + b BIGINT NOT NULL, + c DECIMAL(21,1) NOT NULL, + d DOUBLE(21,1) NOT NULL +); +insert into precise_types values ( + 18446744073709551614, + -9223372036854775806, + 99999999999999999999, + 18446744073709551614 +); +SELECT a, b, c, d FROM precise_types; diff --git a/cmd/explaintest/t/subquery.test b/cmd/explaintest/t/subquery.test index ba0a87ed668b2..8d9bd730b767c 100644 --- a/cmd/explaintest/t/subquery.test +++ b/cmd/explaintest/t/subquery.test @@ -4,14 +4,14 @@ create table t1(a bigint, b bigint); create table t2(a bigint, b bigint); set session tidb_hashagg_partial_concurrency = 1; set session tidb_hashagg_final_concurrency = 1; -explain select * from t1 where t1.a in (select t1.b + t2.b from t2); +explain format = 'brief' select * from t1 where t1.a in (select t1.b + t2.b from t2); drop table if exists t; create table t(a int primary key, b int, c int, d int, index idx(b,c,d)); insert into t values(1,1,1,1),(2,2,2,2),(3,2,2,2),(4,2,2,2),(5,2,2,2); analyze table t; -explain select t.c in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c = 1 and s.d = t.a and s.a = t1.a) from t; +explain format = 'brief' select t.c in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c = 1 and s.d = t.a and s.a = t1.a) from t; drop table if exists t; create table t(a int, b int, c int); -explain select a from t t1 where t1.a = (select max(t2.a) from t t2 where t1.b=t2.b and t1.c=t2.b); \ No newline at end of file +explain format = 'brief' select a from t t1 where t1.a = (select max(t2.a) from t t2 where t1.b=t2.b and t1.c=t2.b); diff --git a/cmd/explaintest/t/topn_push_down.test b/cmd/explaintest/t/topn_push_down.test index a6e9c1be9f610..baec87a061c00 100644 --- a/cmd/explaintest/t/topn_push_down.test +++ b/cmd/explaintest/t/topn_push_down.test @@ -159,7 +159,7 @@ CREATE TABLE `te` ( KEY `idx_third_tran_no` (`third_tran_no`(10)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=''; -EXPLAIN SELECT te.expect_time AS expected_time FROM +explain format = 'brief' SELECT te.expect_time AS expected_time FROM tr tr inner JOIN te te ON te.trade_id = tr.id left JOIN p p ON p.relate_id = tr.id WHERE @@ -186,9 +186,9 @@ desc select * from t1 where t1.a in (select a from (select t2.a as a, t1.b as b -- test ExpectedCnt of join's children drop table if exists t; create table t(a int not null, index idx(a)); -explain select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; -explain select /*+ TIDB_INLJ(t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; -explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; -explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; -explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; -explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; +explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a limit 5; +explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a = t2.a where t2.a is null limit 5; diff --git a/cmd/explaintest/t/topn_pushdown.test b/cmd/explaintest/t/topn_pushdown.test index 7ff3889a63ae6..590c409c47d75 100644 --- a/cmd/explaintest/t/topn_pushdown.test +++ b/cmd/explaintest/t/topn_pushdown.test @@ -1 +1 @@ -explain select * from ((select 4 as a) union all (select 33 as a)) tmp order by a desc limit 1; +explain format = 'brief' select * from ((select 4 as a) union all (select 33 as a)) tmp order by a desc limit 1; diff --git a/cmd/explaintest/t/tpch.test b/cmd/explaintest/t/tpch.test index 6909c72ad7e6b..4b195ac6c7373 100644 --- a/cmd/explaintest/t/tpch.test +++ b/cmd/explaintest/t/tpch.test @@ -109,7 +109,7 @@ set @@session.tidb_opt_agg_push_down = 0; Planner enhancement: none. */ -explain +explain format = 'brief' select l_returnflag, l_linestatus, @@ -144,7 +144,7 @@ order by Planner enhancement: join reorder. */ -explain +explain format = 'brief' select s_acctbal, s_name, @@ -201,7 +201,7 @@ limit 100; planner enhancement: if group-by item have primary key, non-priamry key is useless. */ -explain +explain format = 'brief' select l_orderkey, sum(l_extendedprice * (1 - l_discount)) as revenue, @@ -234,7 +234,7 @@ limit 10; at least one lineitem was received by the customer later than its committed date. The query lists the count of such orders for each order priority sorted in ascending priority order. */ -explain +explain format = 'brief' select o_orderpriority, count(*) as order_count @@ -270,7 +270,7 @@ order by Planner enhancement: join reorder. */ -explain +explain format = 'brief' select n_name, sum(l_extendedprice * (1 - l_discount)) as revenue @@ -308,7 +308,7 @@ order by potential revenue increase is equal to the sum of [l_extendedprice * l_discount] for all lineitems with discounts and quantities in the qualifying range. */ -explain +explain format = 'brief' select sum(l_extendedprice * l_discount) as revenue from @@ -331,7 +331,7 @@ where Planner enahancement: join reorder. */ -explain +explain format = 'brief' select supp_nation, cust_nation, @@ -383,7 +383,7 @@ order by Planner enhancement: join reorder. */ -explain +explain format = 'brief' select o_year, sum(case @@ -434,7 +434,7 @@ order by Planner enhancement: join reorder. */ -explain +explain format = 'brief' select nation, o_year, @@ -480,7 +480,7 @@ order by Planner enhancement: join reorder, if group-by item have primary key, non-priamry key is useless. */ -explain +explain format = 'brief' select c_custkey, c_name, @@ -522,7 +522,7 @@ limit 20; the parts that represent a significant percentage of the total value of all available parts. The query displays the part number and the value of those parts in descending order of value. */ -explain +explain format = 'brief' select ps_partkey, sum(ps_supplycost * ps_availqty) as value @@ -562,7 +562,7 @@ order by The late lineitems are partitioned into two groups, those with priority URGENT or HIGH, and those with a priority other than URGENT or HIGH. */ -explain +explain format = 'brief' select l_shipmode, sum(case @@ -601,7 +601,7 @@ order by have 1, 2, 3, etc. A check is made to ensure that the orders counted do not fall into one of several special categories of orders. Special categories are identified in the order comment column by looking for a particular pattern. */ -explain +explain format = 'brief' select c_count, count(*) as custdist @@ -631,7 +631,7 @@ order by promotional parts. The query considers only parts actually shipped in that month and gives the percentage. Revenue is defined as (l_extendedprice * (1-l_discount)). */ -explain +explain format = 'brief' select 100.00 * sum(case when p_type like 'PROMO%' @@ -702,7 +702,7 @@ drop view revenue0 type, not of a given brand, and not from a supplier who has had complaints registered at the Better Business Bureau. Results must be presented in descending count and ascending brand, type, and size. */ -explain +explain format = 'brief' select p_brand, p_type, @@ -746,7 +746,7 @@ order by Planner enahancement: aggregation pull up through join. */ -explain +explain format = 'brief' select sum(l_extendedprice) / 7.0 as avg_yearly from @@ -775,7 +775,7 @@ where Planner enhancement: cost estimation is not so good, join reorder. The inner subquery's result is only 300+ rows. */ -explain +explain format = 'brief' select c_name, c_custkey, @@ -820,7 +820,7 @@ limit 100; that were shipped by air and delivered in person. Parts are selected based on the combination of specific brands, a list of containers, and a range of sizes. */ -explain +explain format = 'brief' select sum(l_extendedprice* (1 - l_discount)) as revenue from @@ -866,7 +866,7 @@ where defined to be more than 50% of the parts like the given part that the supplier shipped in a given year for a given nation. Only parts whose names share a certain naming convention are considered. */ -explain +explain format = 'brief' select s_name, s_address @@ -913,7 +913,7 @@ order by multi-supplier order (with current status of 'F') where they were the only supplier who failed to meet the committed delivery date. */ -explain +explain format = 'brief' select s_name, count(*) as numwait @@ -964,7 +964,7 @@ limit 100; but who have a greater than average “positive” account balance. It also reflects the magnitude of that balance. Country code is defined as the first two characters of c_phone. */ -explain +explain format = 'brief' select cntrycode, count(*) as numcust, diff --git a/cmd/explaintest/t/window_function.test b/cmd/explaintest/t/window_function.test index 832ff6639cc08..5bd5951653f73 100644 --- a/cmd/explaintest/t/window_function.test +++ b/cmd/explaintest/t/window_function.test @@ -3,29 +3,29 @@ drop table if exists t; create table t (a int, b int, c timestamp, index idx(a)); set @@tidb_enable_window_function = 1; set @@session.tidb_window_concurrency = 1; -explain select sum(a) over() from t; -explain select sum(a) over(partition by a) from t; -explain select sum(a) over(partition by a order by b) from t; -explain select sum(a) over(partition by a order by b rows unbounded preceding) from t; -explain select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; -explain select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; -explain select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; +explain format = 'brief' select sum(a) over() from t; +explain format = 'brief' select sum(a) over(partition by a) from t; +explain format = 'brief' select sum(a) over(partition by a order by b) from t; +explain format = 'brief' select sum(a) over(partition by a order by b rows unbounded preceding) from t; +explain format = 'brief' select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; +explain format = 'brief' select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; +explain format = 'brief' select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; set @@session.tidb_window_concurrency = 4; -explain select sum(a) over() from t; -explain select sum(a) over(partition by a) from t; -explain select sum(a) over(partition by a order by b) from t; -explain select sum(a) over(partition by a order by b rows unbounded preceding) from t; -explain select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; -explain select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; -explain select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; +explain format = 'brief' select sum(a) over() from t; +explain format = 'brief' select sum(a) over(partition by a) from t; +explain format = 'brief' select sum(a) over(partition by a order by b) from t; +explain format = 'brief' select sum(a) over(partition by a order by b rows unbounded preceding) from t; +explain format = 'brief' select sum(a) over(partition by a order by b rows between 1 preceding and 1 following) from t; +explain format = 'brief' select sum(a) over(partition by a order by b range between 1 preceding and 1 following) from t; +explain format = 'brief' select sum(a) over(partition by a order by c range between interval '2:30' minute_second preceding and interval '2:30' minute_second following) from t; drop table if exists t1; create table t1(a int primary key, b int); insert into t1 values(1, 1), (2, 1); analyze table t1; -explain select sum(a) over(partition by b) from t1; +explain format = 'brief' select sum(a) over(partition by b) from t1; insert into t1 values(3, 3); analyze table t1; -explain select sum(a) over(partition by b) from t1; +explain format = 'brief' select sum(a) over(partition by b) from t1; diff --git a/cmd/importer/config.go b/cmd/importer/config.go index 34d13fc95f8d9..81ada45abf0fb 100644 --- a/cmd/importer/config.go +++ b/cmd/importer/config.go @@ -69,7 +69,7 @@ func (c *DBConfig) String() string { return fmt.Sprintf("DBConfig(%+v)", *c) } -//DDLConfig is the configuration for ddl statements. +// DDLConfig is the configuration for ddl statements. type DDLConfig struct { TableSQL string `toml:"table-sql" json:"table-sql"` diff --git a/config/config.go b/config/config.go index 4d9de147649cf..a6ba012727b28 100644 --- a/config/config.go +++ b/config/config.go @@ -14,13 +14,9 @@ package config import ( - "crypto/tls" - "crypto/x509" "encoding/base64" "encoding/json" "fmt" - "io/ioutil" - "net/url" "os" "os/user" "path/filepath" @@ -33,10 +29,10 @@ import ( zaplog "github.com/pingcap/log" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + tikvcfg "github.com/pingcap/tidb/store/tikv/config" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/versioninfo" tracing "github.com/uber/jaeger-client-go/config" - "go.uber.org/zap" ) @@ -51,6 +47,10 @@ const ( DefMaxIndexLength = 3072 // DefMaxOfMaxIndexLength is the maximum index length(in bytes) for TiDB v3.0.7 and previous version. DefMaxOfMaxIndexLength = 3072 * 4 + // DefIndexLimit is the limitation of index on a single table. This value is consistent with MySQL. + DefIndexLimit = 64 + // DefMaxOfIndexLimit is the maximum limitation of index on a single table for TiDB. + DefMaxOfIndexLimit = 64 * 8 // DefPort is the default port of TiDB DefPort = 4000 // DefStatusPort is the default status port of TiDB @@ -59,10 +59,10 @@ const ( DefHost = "0.0.0.0" // DefStatusHost is the default status host of TiDB DefStatusHost = "0.0.0.0" - // DefStoreLivenessTimeout is the default value for store liveness timeout. - DefStoreLivenessTimeout = "5s" - // DefTiDBRedactLog is the default value for redact log. - DefTiDBRedactLog = 0 + // Def TableColumnCountLimit is limit of the number of columns in a table + DefTableColumnCountLimit = 1017 + // Def TableColumnCountLimit is maximum limitation of the number of columns in a table + DefMaxOfTableColumnCountLimit = 4096 ) // Valid config maps @@ -82,46 +82,49 @@ var ( // Config contains configuration options. type Config struct { - Host string `toml:"host" json:"host"` - AdvertiseAddress string `toml:"advertise-address" json:"advertise-address"` - Port uint `toml:"port" json:"port"` - Cors string `toml:"cors" json:"cors"` - Store string `toml:"store" json:"store"` - Path string `toml:"path" json:"path"` - Socket string `toml:"socket" json:"socket"` - Lease string `toml:"lease" json:"lease"` - RunDDL bool `toml:"run-ddl" json:"run-ddl"` - SplitTable bool `toml:"split-table" json:"split-table"` - TokenLimit uint `toml:"token-limit" json:"token-limit"` - OOMUseTmpStorage bool `toml:"oom-use-tmp-storage" json:"oom-use-tmp-storage"` - TempStoragePath string `toml:"tmp-storage-path" json:"tmp-storage-path"` - OOMAction string `toml:"oom-action" json:"oom-action"` - MemQuotaQuery int64 `toml:"mem-quota-query" json:"mem-quota-query"` - NestedLoopJoinCacheCapacity int64 `toml:"nested-loop-join-cache-capacity" json:"nested-loop-join-cache-capacity"` + Host string `toml:"host" json:"host"` + AdvertiseAddress string `toml:"advertise-address" json:"advertise-address"` + Port uint `toml:"port" json:"port"` + Cors string `toml:"cors" json:"cors"` + Store string `toml:"store" json:"store"` + Path string `toml:"path" json:"path"` + Socket string `toml:"socket" json:"socket"` + Lease string `toml:"lease" json:"lease"` + RunDDL bool `toml:"run-ddl" json:"run-ddl"` + SplitTable bool `toml:"split-table" json:"split-table"` + TokenLimit uint `toml:"token-limit" json:"token-limit"` + OOMUseTmpStorage bool `toml:"oom-use-tmp-storage" json:"oom-use-tmp-storage"` + TempStoragePath string `toml:"tmp-storage-path" json:"tmp-storage-path"` + OOMAction string `toml:"oom-action" json:"oom-action"` + MemQuotaQuery int64 `toml:"mem-quota-query" json:"mem-quota-query"` // TempStorageQuota describe the temporary storage Quota during query exector when OOMUseTmpStorage is enabled // If the quota exceed the capacity of the TempStoragePath, the tidb-server would exit with fatal error - TempStorageQuota int64 `toml:"tmp-storage-quota" json:"tmp-storage-quota"` // Bytes - EnableStreaming bool `toml:"enable-streaming" json:"enable-streaming"` - EnableBatchDML bool `toml:"enable-batch-dml" json:"enable-batch-dml"` - TxnLocalLatches TxnLocalLatches `toml:"-" json:"-"` + TempStorageQuota int64 `toml:"tmp-storage-quota" json:"tmp-storage-quota"` // Bytes + EnableStreaming bool `toml:"enable-streaming" json:"enable-streaming"` + EnableBatchDML bool `toml:"enable-batch-dml" json:"enable-batch-dml"` + TxnLocalLatches tikvcfg.TxnLocalLatches `toml:"-" json:"-"` // Set sys variable lower-case-table-names, ref: https://dev.mysql.com/doc/refman/5.7/en/identifier-case-sensitivity.html. // TODO: We actually only support mode 2, which keeps the original case, but the comparison is case-insensitive. - LowerCaseTableNames int `toml:"lower-case-table-names" json:"lower-case-table-names"` - ServerVersion string `toml:"server-version" json:"server-version"` - Log Log `toml:"log" json:"log"` - Security Security `toml:"security" json:"security"` - Status Status `toml:"status" json:"status"` - Performance Performance `toml:"performance" json:"performance"` - PreparedPlanCache PreparedPlanCache `toml:"prepared-plan-cache" json:"prepared-plan-cache"` - OpenTracing OpenTracing `toml:"opentracing" json:"opentracing"` - ProxyProtocol ProxyProtocol `toml:"proxy-protocol" json:"proxy-protocol"` - TiKVClient TiKVClient `toml:"tikv-client" json:"tikv-client"` - Binlog Binlog `toml:"binlog" json:"binlog"` - CompatibleKillQuery bool `toml:"compatible-kill-query" json:"compatible-kill-query"` - Plugin Plugin `toml:"plugin" json:"plugin"` - PessimisticTxn PessimisticTxn `toml:"pessimistic-txn" json:"pessimistic-txn"` - CheckMb4ValueInUTF8 bool `toml:"check-mb4-value-in-utf8" json:"check-mb4-value-in-utf8"` - MaxIndexLength int `toml:"max-index-length" json:"max-index-length"` + LowerCaseTableNames int `toml:"lower-case-table-names" json:"lower-case-table-names"` + ServerVersion string `toml:"server-version" json:"server-version"` + Log Log `toml:"log" json:"log"` + Security Security `toml:"security" json:"security"` + Status Status `toml:"status" json:"status"` + Performance Performance `toml:"performance" json:"performance"` + PreparedPlanCache PreparedPlanCache `toml:"prepared-plan-cache" json:"prepared-plan-cache"` + OpenTracing OpenTracing `toml:"opentracing" json:"opentracing"` + ProxyProtocol ProxyProtocol `toml:"proxy-protocol" json:"proxy-protocol"` + PDClient tikvcfg.PDClient `toml:"pd-client" json:"pd-client"` + TiKVClient tikvcfg.TiKVClient `toml:"tikv-client" json:"tikv-client"` + Binlog Binlog `toml:"binlog" json:"binlog"` + CompatibleKillQuery bool `toml:"compatible-kill-query" json:"compatible-kill-query"` + Plugin Plugin `toml:"plugin" json:"plugin"` + PessimisticTxn PessimisticTxn `toml:"pessimistic-txn" json:"pessimistic-txn"` + CheckMb4ValueInUTF8 bool `toml:"check-mb4-value-in-utf8" json:"check-mb4-value-in-utf8"` + MaxIndexLength int `toml:"max-index-length" json:"max-index-length"` + IndexLimit int `toml:"index-limit" json:"index-limit"` + TableColumnCountLimit uint32 `toml:"table-column-count-limit" json:"table-column-count-limit"` + GracefulWaitBeforeShutdown int `toml:"graceful-wait-before-shutdown" json:"graceful-wait-before-shutdown"` // AlterPrimaryKey is used to control alter primary key feature. AlterPrimaryKey bool `toml:"alter-primary-key" json:"alter-primary-key"` // TreatOldVersionUTF8AsUTF8MB4 is use to treat old version table/column UTF8 charset as UTF8MB4. This is for compatibility. @@ -152,16 +155,27 @@ type Config struct { EnableTelemetry bool `toml:"enable-telemetry" json:"enable-telemetry"` // Labels indicates the labels set for the tidb server. The labels describe some specific properties for the tidb // server like `zone`/`rack`/`host`. Currently, labels won't affect the tidb server except for some special - // label keys. Now we only have `group` as a special label key. - // Note that: 'group' is a special label key which should be automatically set by tidb-operator. We don't suggest + // label keys. Now we have following special keys: + // 1. 'group' is a special label key which should be automatically set by tidb-operator. We don't suggest // users to set 'group' in labels. + // 2. 'zone' is a special key that indicates the DC location of this tidb-server. If it is set, the value for this + // key will be the default value of the session variable `txn_scope` for this tidb-server. Labels map[string]string `toml:"labels" json:"labels"` // EnableGlobalIndex enables creating global index. EnableGlobalIndex bool `toml:"enable-global-index" json:"enable-global-index"` // DeprecateIntegerDisplayWidth indicates whether deprecating the max display length for integer. DeprecateIntegerDisplayWidth bool `toml:"deprecate-integer-display-length" json:"deprecate-integer-display-length"` - // EnableRedactLog indicates that whether redact log, 0 is disable. 1 is enable. - EnableRedactLog int32 `toml:"enable-redact-log" json:"enable-redact-log"` + // EnableEnumLengthLimit indicates whether the enum/set element length is limited. + // According to MySQL 8.0 Refman: + // The maximum supported length of an individual SET element is M <= 255 and (M x w) <= 1020, + // where M is the element literal length and w is the number of bytes required for the maximum-length character in the character set. + // See https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html for more details. + EnableEnumLengthLimit bool `toml:"enable-enum-length-limit" json:"enable-enum-length-limit"` + // StoresRefreshInterval indicates the interval of refreshing stores info, the unit is second. + StoresRefreshInterval uint64 `toml:"stores-refresh-interval" json:"stores-refresh-interval"` + // EnableTCP4Only enables net.Listen("tcp4",...) + // Note that: it can make lvs with toa work and thus tidb can get real client ip. + EnableTCP4Only bool `toml:"enable-tcp4-only" json:"enable-tcp4-only"` } // UpdateTempStoragePath is to update the `TempStoragePath` if port/statusPort was changed @@ -174,6 +188,22 @@ func (c *Config) UpdateTempStoragePath() { } } +func (c *Config) getTiKVConfig() *tikvcfg.Config { + return &tikvcfg.Config{ + CommitterConcurrency: c.Performance.CommitterConcurrency, + MaxTxnTTL: c.Performance.MaxTxnTTL, + ServerMemoryQuota: defTiKVCfg.ServerMemoryQuota, + TiKVClient: c.TiKVClient, + Security: c.Security.ClusterSecurity(), + PDClient: c.PDClient, + PessimisticTxn: tikvcfg.PessimisticTxn{MaxRetryCount: c.PessimisticTxn.MaxRetryCount}, + TxnLocalLatches: c.TxnLocalLatches, + StoresRefreshInterval: c.StoresRefreshInterval, + OpenTracingEnable: c.OpenTracing.Enable, + Path: c.Path, + } +} + func encodeDefTempStorageDir(tempDir string, host, statusHost string, port, statusPort uint) string { dirName := base64.URLEncoding.EncodeToString([]byte(fmt.Sprintf("%v:%v/%v:%v", host, port, statusHost, statusPort))) var osUID string @@ -345,49 +375,9 @@ func (e *ErrConfigValidationFailed) Error() string { } -// ToTLSConfig generates tls's config based on security section of the config. -func (s *Security) ToTLSConfig() (tlsConfig *tls.Config, err error) { - if len(s.ClusterSSLCA) != 0 { - certPool := x509.NewCertPool() - // Create a certificate pool from the certificate authority - var ca []byte - ca, err = ioutil.ReadFile(s.ClusterSSLCA) - if err != nil { - err = errors.Errorf("could not read ca certificate: %s", err) - return - } - // Append the certificates from the CA - if !certPool.AppendCertsFromPEM(ca) { - err = errors.New("failed to append ca certs") - return - } - tlsConfig = &tls.Config{ - RootCAs: certPool, - ClientCAs: certPool, - } - - if len(s.ClusterSSLCert) != 0 && len(s.ClusterSSLKey) != 0 { - getCert := func() (*tls.Certificate, error) { - // Load the client certificates from disk - cert, err := tls.LoadX509KeyPair(s.ClusterSSLCert, s.ClusterSSLKey) - if err != nil { - return nil, errors.Errorf("could not load client key pair: %s", err) - } - return &cert, nil - } - // pre-test cert's loading. - if _, err = getCert(); err != nil { - return - } - tlsConfig.GetClientCertificate = func(info *tls.CertificateRequestInfo) (certificate *tls.Certificate, err error) { - return getCert() - } - tlsConfig.GetCertificate = func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, err error) { - return getCert() - } - } - } - return +// ClusterSecurity returns Security info for cluster +func (s *Security) ClusterSecurity() tikvcfg.Security { + return tikvcfg.NewSecurity(s.ClusterSSLCA, s.ClusterSSLCert, s.ClusterSSLKey, s.ClusterVerifyCN) } // Status is the status section of the config. @@ -404,25 +394,27 @@ type Status struct { type Performance struct { MaxProcs uint `toml:"max-procs" json:"max-procs"` // Deprecated: use ServerMemoryQuota instead - MaxMemory uint64 `toml:"max-memory" json:"max-memory"` - ServerMemoryQuota uint64 `toml:"server-memory-quota" json:"server-memory-quota"` - StatsLease string `toml:"stats-lease" json:"stats-lease"` - StmtCountLimit uint `toml:"stmt-count-limit" json:"stmt-count-limit"` - FeedbackProbability float64 `toml:"feedback-probability" json:"feedback-probability"` - QueryFeedbackLimit uint `toml:"query-feedback-limit" json:"query-feedback-limit"` - PseudoEstimateRatio float64 `toml:"pseudo-estimate-ratio" json:"pseudo-estimate-ratio"` - ForcePriority string `toml:"force-priority" json:"force-priority"` - BindInfoLease string `toml:"bind-info-lease" json:"bind-info-lease"` - TxnEntrySizeLimit uint64 `toml:"txn-entry-size-limit" json:"txn-entry-size-limit"` - TxnTotalSizeLimit uint64 `toml:"txn-total-size-limit" json:"txn-total-size-limit"` - TCPKeepAlive bool `toml:"tcp-keep-alive" json:"tcp-keep-alive"` - CrossJoin bool `toml:"cross-join" json:"cross-join"` - RunAutoAnalyze bool `toml:"run-auto-analyze" json:"run-auto-analyze"` - DistinctAggPushDown bool `toml:"distinct-agg-push-down" json:"agg-push-down-join"` - CommitterConcurrency int `toml:"committer-concurrency" json:"committer-concurrency"` - MaxTxnTTL uint64 `toml:"max-txn-ttl" json:"max-txn-ttl"` - MemProfileInterval string `toml:"mem-profile-interval" json:"mem-profile-interval"` - IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` + MaxMemory uint64 `toml:"max-memory" json:"max-memory"` + ServerMemoryQuota uint64 `toml:"server-memory-quota" json:"server-memory-quota"` + MemoryUsageAlarmRatio float64 `toml:"memory-usage-alarm-ratio" json:"memory-usage-alarm-ratio"` + StatsLease string `toml:"stats-lease" json:"stats-lease"` + StmtCountLimit uint `toml:"stmt-count-limit" json:"stmt-count-limit"` + FeedbackProbability float64 `toml:"feedback-probability" json:"feedback-probability"` + QueryFeedbackLimit uint `toml:"query-feedback-limit" json:"query-feedback-limit"` + PseudoEstimateRatio float64 `toml:"pseudo-estimate-ratio" json:"pseudo-estimate-ratio"` + ForcePriority string `toml:"force-priority" json:"force-priority"` + BindInfoLease string `toml:"bind-info-lease" json:"bind-info-lease"` + TxnEntrySizeLimit uint64 `toml:"txn-entry-size-limit" json:"txn-entry-size-limit"` + TxnTotalSizeLimit uint64 `toml:"txn-total-size-limit" json:"txn-total-size-limit"` + TCPKeepAlive bool `toml:"tcp-keep-alive" json:"tcp-keep-alive"` + CrossJoin bool `toml:"cross-join" json:"cross-join"` + RunAutoAnalyze bool `toml:"run-auto-analyze" json:"run-auto-analyze"` + DistinctAggPushDown bool `toml:"distinct-agg-push-down" json:"agg-push-down-join"` + CommitterConcurrency int `toml:"committer-concurrency" json:"committer-concurrency"` + MaxTxnTTL uint64 `toml:"max-txn-ttl" json:"max-txn-ttl"` + MemProfileInterval string `toml:"mem-profile-interval" json:"mem-profile-interval"` + IndexUsageSyncLease string `toml:"index-usage-sync-lease" json:"index-usage-sync-lease"` + GOGC int `toml:"gogc" json:"gogc"` } // PlanCache is the PlanCache section of the config. @@ -432,12 +424,6 @@ type PlanCache struct { Shards uint `toml:"shards" json:"shards"` } -// TxnLocalLatches is the TxnLocalLatches section of the config. -type TxnLocalLatches struct { - Enabled bool `toml:"-" json:"-"` - Capacity uint `toml:"-" json:"-"` -} - // PreparedPlanCache is the PreparedPlanCache section of the config. type PreparedPlanCache struct { Enabled bool `toml:"enabled" json:"enabled"` @@ -482,66 +468,6 @@ type ProxyProtocol struct { HeaderTimeout uint `toml:"header-timeout" json:"header-timeout"` } -// TiKVClient is the config for tikv client. -type TiKVClient struct { - // GrpcConnectionCount is the max gRPC connections that will be established - // with each tikv-server. - GrpcConnectionCount uint `toml:"grpc-connection-count" json:"grpc-connection-count"` - // After a duration of this time in seconds if the client doesn't see any activity it pings - // the server to see if the transport is still alive. - GrpcKeepAliveTime uint `toml:"grpc-keepalive-time" json:"grpc-keepalive-time"` - // After having pinged for keepalive check, the client waits for a duration of Timeout in seconds - // and if no activity is seen even after that the connection is closed. - GrpcKeepAliveTimeout uint `toml:"grpc-keepalive-timeout" json:"grpc-keepalive-timeout"` - // CommitTimeout is the max time which command 'commit' will wait. - CommitTimeout string `toml:"commit-timeout" json:"commit-timeout"` - AsyncCommit AsyncCommit `toml:"async-commit" json:"async-commit"` - // MaxBatchSize is the max batch size when calling batch commands API. - MaxBatchSize uint `toml:"max-batch-size" json:"max-batch-size"` - // If TiKV load is greater than this, TiDB will wait for a while to avoid little batch. - OverloadThreshold uint `toml:"overload-threshold" json:"overload-threshold"` - // MaxBatchWaitTime in nanosecond is the max wait time for batch. - MaxBatchWaitTime time.Duration `toml:"max-batch-wait-time" json:"max-batch-wait-time"` - // BatchWaitSize is the max wait size for batch. - BatchWaitSize uint `toml:"batch-wait-size" json:"batch-wait-size"` - // EnableChunkRPC indicate the data encode in chunk format for coprocessor requests. - EnableChunkRPC bool `toml:"enable-chunk-rpc" json:"enable-chunk-rpc"` - // If a Region has not been accessed for more than the given duration (in seconds), it - // will be reloaded from the PD. - RegionCacheTTL uint `toml:"region-cache-ttl" json:"region-cache-ttl"` - // If a store has been up to the limit, it will return error for successive request to - // prevent the store occupying too much token in dispatching level. - StoreLimit int64 `toml:"store-limit" json:"store-limit"` - // StoreLivenessTimeout is the timeout for store liveness check request. - StoreLivenessTimeout string `toml:"store-liveness-timeout" json:"store-liveness-timeout"` - CoprCache CoprocessorCache `toml:"copr-cache" json:"copr-cache"` - // TTLRefreshedTxnSize controls whether a transaction should update its TTL or not. - TTLRefreshedTxnSize int64 `toml:"ttl-refreshed-txn-size" json:"ttl-refreshed-txn-size"` -} - -// AsyncCommit is the config for the async commit feature. -type AsyncCommit struct { - // Whether to enable the async commit feature. - Enable bool `toml:"enable" json:"enable"` - // Use async commit only if the number of keys does not exceed KeysLimit. - KeysLimit uint `toml:"keys-limit" json:"keys-limit"` - // Use async commit only if the total size of keys does not exceed TotalKeySizeLimit. - TotalKeySizeLimit uint64 `toml:"total-key-size-limit" json:"total-key-size-limit"` -} - -// CoprocessorCache is the config for coprocessor cache. -type CoprocessorCache struct { - // Whether to enable the copr cache. The copr cache saves the result from TiKV Coprocessor in the memory and - // reuses the result when corresponding data in TiKV is unchanged, on a region basis. - Enable bool `toml:"enable" json:"enable"` - // The capacity in MB of the cache. - CapacityMB float64 `toml:"capacity-mb" json:"capacity-mb"` - // Only cache requests whose result set is small. - AdmissionMaxResultMB float64 `toml:"admission-max-result-mb" json:"admission-max-result-mb"` - // Only cache requests takes notable time to process. - AdmissionMinProcessMs uint64 `toml:"admission-min-process-ms" json:"admission-min-process-ms"` -} - // Binlog is the config for binlog. type Binlog struct { Enable bool `toml:"enable" json:"enable"` @@ -555,18 +481,25 @@ type Binlog struct { Strategy string `toml:"strategy" json:"strategy"` } -// Plugin is the config for plugin -type Plugin struct { - Dir string `toml:"dir" json:"dir"` - Load string `toml:"load" json:"load"` -} - // PessimisticTxn is the config for pessimistic transaction. type PessimisticTxn struct { // The max count of retry for a single statement in a pessimistic transaction. MaxRetryCount uint `toml:"max-retry-count" json:"max-retry-count"` } +// DefaultPessimisticTxn returns the default configuration for PessimisticTxn +func DefaultPessimisticTxn() PessimisticTxn { + return PessimisticTxn{ + MaxRetryCount: 256, + } +} + +// Plugin is the config for plugin +type Plugin struct { + Dir string `toml:"dir" json:"dir"` + Load string `toml:"load" json:"load"` +} + // StmtSummary is the config for statement summary. type StmtSummary struct { // Enable statement summary or not. @@ -592,8 +525,13 @@ type IsolationRead struct { // Experimental controls the features that are still experimental: their semantics, interfaces are subject to change. // Using these features in the production environment is not recommended. type Experimental struct { + // Whether enable creating expression index. + AllowsExpressionIndex bool `toml:"allow-expression-index" json:"allow-expression-index"` + // Whether enable global kill. + EnableGlobalKill bool `toml:"enable-global-kill" json:"enable-global-kill"` } +var defTiKVCfg = tikvcfg.DefaultConfig() var defaultConf = Config{ Host: DefHost, AdvertiseAddress: "", @@ -610,11 +548,12 @@ var defaultConf = Config{ TempStoragePath: tempStorageDirName, OOMAction: OOMActionCancel, MemQuotaQuery: 1 << 30, - NestedLoopJoinCacheCapacity: 20971520, EnableStreaming: false, EnableBatchDML: false, CheckMb4ValueInUTF8: true, MaxIndexLength: 3072, + IndexLimit: 64, + TableColumnCountLimit: 1017, AlterPrimaryKey: false, TreatOldVersionUTF8AsUTF8MB4: true, EnableTableLock: false, @@ -623,12 +562,10 @@ var defaultConf = Config{ RepairMode: false, RepairTableList: []string{}, MaxServerConnections: 0, - TxnLocalLatches: TxnLocalLatches{ - Enabled: false, - Capacity: 0, - }, - LowerCaseTableNames: 2, - ServerVersion: "", + TxnLocalLatches: defTiKVCfg.TxnLocalLatches, + LowerCaseTableNames: 2, + GracefulWaitBeforeShutdown: 0, + ServerVersion: "", Log: Log{ Level: "info", Format: "text", @@ -652,25 +589,28 @@ var defaultConf = Config{ RecordQPSbyDB: false, }, Performance: Performance{ - MaxMemory: 0, - ServerMemoryQuota: 0, - TCPKeepAlive: true, - CrossJoin: true, - StatsLease: "3s", - RunAutoAnalyze: true, - StmtCountLimit: 5000, - FeedbackProbability: 0.05, - QueryFeedbackLimit: 512, - PseudoEstimateRatio: 0.8, - ForcePriority: "NO_PRIORITY", - BindInfoLease: "3s", - TxnEntrySizeLimit: DefTxnEntrySizeLimit, - TxnTotalSizeLimit: DefTxnTotalSizeLimit, - DistinctAggPushDown: false, - CommitterConcurrency: 16, - MaxTxnTTL: 60 * 60 * 1000, // 1hour - MemProfileInterval: "1m", - IndexUsageSyncLease: "60s", + MaxMemory: 0, + ServerMemoryQuota: 0, + MemoryUsageAlarmRatio: 0.8, + TCPKeepAlive: true, + CrossJoin: true, + StatsLease: "3s", + RunAutoAnalyze: true, + StmtCountLimit: 5000, + FeedbackProbability: 0.0, + QueryFeedbackLimit: 512, + PseudoEstimateRatio: 0.8, + ForcePriority: "NO_PRIORITY", + BindInfoLease: "3s", + TxnEntrySizeLimit: DefTxnEntrySizeLimit, + TxnTotalSizeLimit: DefTxnTotalSizeLimit, + DistinctAggPushDown: false, + CommitterConcurrency: defTiKVCfg.CommitterConcurrency, + MaxTxnTTL: defTiKVCfg.MaxTxnTTL, // 1hour + MemProfileInterval: "1m", + // TODO: set indexUsageSyncLease to 60s. + IndexUsageSyncLease: "0s", + GOGC: 100, }, ProxyProtocol: ProxyProtocol{ Networks: "", @@ -689,45 +629,13 @@ var defaultConf = Config{ }, Reporter: OpenTracingReporter{}, }, - TiKVClient: TiKVClient{ - GrpcConnectionCount: 4, - GrpcKeepAliveTime: 10, - GrpcKeepAliveTimeout: 3, - CommitTimeout: "41s", - AsyncCommit: AsyncCommit{ - Enable: false, - // FIXME: Find an appropriate default limit. - KeysLimit: 256, - TotalKeySizeLimit: 4 * 1024, // 4 KiB - }, - - MaxBatchSize: 128, - OverloadThreshold: 200, - MaxBatchWaitTime: 0, - BatchWaitSize: 8, - - EnableChunkRPC: true, - - RegionCacheTTL: 600, - StoreLimit: 0, - StoreLivenessTimeout: DefStoreLivenessTimeout, - - TTLRefreshedTxnSize: 32 * 1024 * 1024, - - CoprCache: CoprocessorCache{ - Enable: true, - CapacityMB: 1000, - AdmissionMaxResultMB: 10, - AdmissionMinProcessMs: 5, - }, - }, + PDClient: defTiKVCfg.PDClient, + TiKVClient: defTiKVCfg.TiKVClient, Binlog: Binlog{ WriteTimeout: "15s", Strategy: "range", }, - PessimisticTxn: PessimisticTxn{ - MaxRetryCount: 256, - }, + PessimisticTxn: DefaultPessimisticTxn(), StmtSummary: StmtSummary{ Enable: true, EnableInternalQuery: false, @@ -739,7 +647,10 @@ var defaultConf = Config{ IsolationRead: IsolationRead{ Engines: []string{"tikv", "tiflash", "tidb"}, }, - Experimental: Experimental{}, + Experimental: Experimental{ + AllowsExpressionIndex: false, + EnableGlobalKill: false, + }, EnableCollectExecutionInfo: true, EnableTelemetry: true, Labels: make(map[string]string), @@ -748,7 +659,8 @@ var defaultConf = Config{ SpilledFileEncryptionMethod: SpilledFileEncryptionMethodPlaintext, }, DeprecateIntegerDisplayWidth: false, - EnableRedactLog: DefTiDBRedactLog, + EnableEnumLengthLimit: true, + StoresRefreshInterval: defTiKVCfg.StoresRefreshInterval, } var ( @@ -771,6 +683,8 @@ func GetGlobalConfig() *Config { // StoreGlobalConfig stores a new config to the globalConf. It mostly uses in the test to avoid some data races. func StoreGlobalConfig(config *Config) { globalConf.Store(config) + cfg := *config.getTiKVConfig() + tikvcfg.StoreGlobalConfig(&cfg) } var deprecatedConfig = map[string]struct{}{ @@ -784,6 +698,8 @@ var deprecatedConfig = map[string]struct{}{ "performance.max-memory": {}, "max-txn-time-use": {}, "experimental.allow-auto-random": {}, + "enable-redact-log": {}, // use variable tidb_redact_log instead + "tikv-client.copr-cache.enable": {}, } func isAllDeprecatedConfigItems(items []string) bool { @@ -795,6 +711,14 @@ func isAllDeprecatedConfigItems(items []string) bool { return true } +// IsMemoryQuotaQuerySetByUser indicates whether the config item mem-quota-query +// is set by the user. +var IsMemoryQuotaQuerySetByUser bool + +// IsOOMActionSetByUser indicates whether the config item mem-action is set by +// the user. +var IsOOMActionSetByUser bool + // InitializeConfig initialize the global config handler. // The function enforceCmdArgs is used to merge the config file with command arguments: // For example, if you start TiDB by the command "./tidb-server --port=3000", the port number should be @@ -850,6 +774,12 @@ func (c *Config) Load(confFile string) error { if c.TokenLimit == 0 { c.TokenLimit = 1000 } + if metaData.IsDefined("mem-quota-query") { + IsMemoryQuotaQuerySetByUser = true + } + if metaData.IsDefined("oom-action") { + IsOOMActionSetByUser = true + } if len(c.ServerVersion) > 0 { mysql.ServerVersion = c.ServerVersion } @@ -897,6 +827,9 @@ func (c *Config) Valid() error { if c.MaxIndexLength < DefMaxIndexLength || c.MaxIndexLength > DefMaxOfMaxIndexLength { return fmt.Errorf("max-index-length should be [%d, %d]", DefMaxIndexLength, DefMaxOfMaxIndexLength) } + if c.IndexLimit < DefIndexLimit || c.IndexLimit > DefMaxOfIndexLimit { + return fmt.Errorf("index-limit should be [%d, %d]", DefIndexLimit, DefMaxOfIndexLimit) + } if c.Log.File.MaxSize > MaxLogFileSize { return fmt.Errorf("invalid max log file size=%v which is larger than max=%v", c.Log.File.MaxSize, MaxLogFileSize) } @@ -904,25 +837,33 @@ func (c *Config) Valid() error { if c.OOMAction != OOMActionLog && c.OOMAction != OOMActionCancel { return fmt.Errorf("unsupported OOMAction %v, TiDB only supports [%v, %v]", c.OOMAction, OOMActionLog, OOMActionCancel) } + if c.TableColumnCountLimit < DefTableColumnCountLimit || c.TableColumnCountLimit > DefMaxOfTableColumnCountLimit { + return fmt.Errorf("table-column-limit should be [%d, %d]", DefIndexLimit, DefMaxOfTableColumnCountLimit) + } // lower_case_table_names is allowed to be 0, 1, 2 if c.LowerCaseTableNames < 0 || c.LowerCaseTableNames > 2 { return fmt.Errorf("lower-case-table-names should be 0 or 1 or 2") } - if c.TxnLocalLatches.Enabled && c.TxnLocalLatches.Capacity == 0 { - return fmt.Errorf("txn-local-latches.capacity can not be 0") + // txn-local-latches + if err := c.TxnLocalLatches.Valid(); err != nil { + return err } // For tikvclient. - if c.TiKVClient.GrpcConnectionCount == 0 { - return fmt.Errorf("grpc-connection-count should be greater than 0") + if err := c.TiKVClient.Valid(); err != nil { + return err } if c.Performance.TxnTotalSizeLimit > 10<<30 { return fmt.Errorf("txn-total-size-limit should be less than %d", 10<<30) } + if c.Performance.MemoryUsageAlarmRatio > 1 || c.Performance.MemoryUsageAlarmRatio < 0 { + return fmt.Errorf("memory-usage-alarm-ratio in [Performance] must be greater than or equal to 0 and less than or equal to 1") + } + if c.StmtSummary.MaxStmtCount <= 0 { return fmt.Errorf("max-stmt-count in [stmt-summary] should be greater than 0") } @@ -992,23 +933,6 @@ var TableLockDelayClean = func() uint64 { return GetGlobalConfig().DelayCleanTableLock } -// RedactLogEnabled uses to check whether enabled the log redact. -func RedactLogEnabled() bool { - return atomic.LoadInt32(&GetGlobalConfig().EnableRedactLog) == 1 -} - -// SetRedactLog uses to set log redact status. -func SetRedactLog(enable bool) { - value := int32(0) - if enable { - value = 1 - } - g := GetGlobalConfig() - newConf := *g - newConf.EnableRedactLog = value - StoreGlobalConfig(&newConf) -} - // ToLogConfig converts *Log to *logutil.LogConfig. func (l *Log) ToLogConfig() *logutil.LogConfig { return logutil.NewLogConfig(l.Level, l.Format, l.SlowQueryFile, l.File, l.getDisableTimestamp(), func(config *zaplog.Config) { config.DisableErrorVerbose = l.getDisableErrorStack() }) @@ -1058,28 +982,3 @@ const ( OOMActionCancel = "cancel" OOMActionLog = "log" ) - -// ParsePath parses this path. -func ParsePath(path string) (etcdAddrs []string, disableGC bool, err error) { - var u *url.URL - u, err = url.Parse(path) - if err != nil { - err = errors.Trace(err) - return - } - if strings.ToLower(u.Scheme) != "tikv" { - err = errors.Errorf("Uri scheme expected [tikv] but found [%s]", u.Scheme) - logutil.BgLogger().Error("parsePath error", zap.Error(err)) - return - } - switch strings.ToLower(u.Query().Get("disableGC")) { - case "true": - disableGC = true - case "false", "": - default: - err = errors.New("disableGC flag should be true/false") - return - } - etcdAddrs = strings.Split(u.Host, ",") - return -} diff --git a/config/config.toml.example b/config/config.toml.example index 3fdb3863d76bf..60e86c847f205 100644 --- a/config/config.toml.example +++ b/config/config.toml.example @@ -34,9 +34,6 @@ token-limit = 1000 # The maximum memory available for a single SQL statement. Default: 1GB mem-quota-query = 1073741824 -# The maximum number available of a NLJ cache for a single SQL statement. Default: 20MB -nested-loop-join-cache-capacity = 20971520 - # Controls whether to enable the temporary storage for some operators when a single SQL statement exceeds the memory quota specified by mem-quota-query. oom-use-tmp-storage = true @@ -54,9 +51,6 @@ tmp-storage-quota = -1 # Valid options: ["log", "cancel"] oom-action = "cancel" -# Enable coprocessor streaming. -enable-streaming = false - # Enable batch commit for the DMLs. enable-batch-dml = false @@ -67,6 +61,10 @@ lower-case-table-names = 2 # turn on this option when TiDB server is behind a proxy. compatible-kill-query = false +# Make SIGTERM wait N seconds before starting the shutdown procedure. This is designed for when TiDB is behind a proxy/load balancer. +# The health check will fail immediately but the server will not start shutting down until the time has elapsed. +graceful-wait-before-shutdown = 0 + # check mb4 value in utf8 is used to control whether to check the mb4 characters when the charset is utf8. check-mb4-value-in-utf8 = true @@ -76,6 +74,9 @@ treat-old-version-utf8-as-utf8mb4 = true # max-index-length is used to deal with compatibility issues from v3.0.7 and previous version upgrades. It can only be in [3072, 3072*4]. max-index-length = 3072 +# index-limit is used to deal with compatibility issues. It can only be in [64, 64*8]. +index-limit = 64 + # enable-table-lock is used to control table lock feature. Default is false, indicate the table lock feature is disabled. enable-table-lock = false @@ -123,6 +124,13 @@ enable-telemetry = true # a warning like `Integer display width is deprecated and will be removed in a future release`. deprecate-integer-display-length = false +# enable-enum-length-limit is used to deal with compatibility issues. When true, the enum/set element length is limited. +# According to MySQL 8.0 Refman: +# The maximum supported length of an individual SET element is M <= 255 and (M x w) <= 1020, +# where M is the element literal length and w is the number of bytes required for the maximum-length character in the character set. +# See https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html for more details. +enable-enum-length-limit = true + [log] # Log level: debug, info, warn, error, fatal. level = "info" @@ -222,6 +230,14 @@ max-procs = 0 # Memory size quota for tidb server, 0 means unlimited server-memory-quota = 0 +# The alarm threshold when memory usage of the tidb-server exceeds. The valid value range is greater than or equal to 0 +# and less than or equal to 1. The default value is 0.8. +# If this configuration is set to 0 or 1, it'll disable the alarm. +# Otherwise, related information will be recorded in the directory `tmp-storage-path/record`. +# Note: If the configuration `server-memory-quota` is set and larger than 0, the alarm threshold will be +# `memory-usage-alarm-ratio * server-memory-quota`; otherwise, it'll be `memory-usage-alarm-ratio * system memory size`. +memory-usage-alarm-ratio = 0.8 + # StmtCountLimit limits the max count of statement inside a transaction. stmt-count-limit = 5000 @@ -238,7 +254,7 @@ stats-lease = "3s" run-auto-analyze = true # Probability to use the query feedback to update stats, 0.0 or 1.0 for always false/true. -feedback-probability = 0.05 +feedback-probability = 0.0 # The max number of query feedback that cache in memory. query-feedback-limit = 512 @@ -277,6 +293,16 @@ max-txn-ttl = 3600000 # the interval duration between two memory profile into global tracker mem-profile-interval = "1m" +# Index usage sync lease duration, which influences the time of dump index usage information to KV. +# Here we set to 0 to not dump index usage information to KV, +# because we have not completed GC and other functions. +index-usage-sync-lease = "0s" + +# The Go GC trigger factor, you can get more information about it at https://golang.org/pkg/runtime. +# If you encounter OOM when executing large query, you can decrease this value to trigger GC earlier. +# If you find the CPU used by GC is too high or GC is too frequent and impact your business you can increase this value. +gogc = 100 + [proxy-protocol] # PROXY protocol acceptable client networks. # Empty string means disable PROXY protocol, * means all networks. @@ -341,6 +367,10 @@ log-spans = false # LocalAgentHostPort instructs reporter to send spans to jaeger-agent at this address local-agent-host-port = "" +[pd-client] +# Max time which PD client will wait for the PD server in seconds. +pd-server-timeout = 3 + [tikv-client] # Max gRPC connections that will be established with each tikv-server. grpc-connection-count = 4 @@ -353,6 +383,9 @@ grpc-keepalive-time = 10 # and if no activity is seen even after that the connection is closed. grpc-keepalive-timeout = 3 +# The compression type for gRPC channel: none or gzip. +grpc-compression-type = "none" + # Max time for commit command, must be twice bigger than raft election timeout. commit-timeout = "41s" @@ -384,29 +417,10 @@ store-liveness-timeout = "5s" # If the size(in byte) of a transaction is large than `ttl-refreshed-txn-size`, it update the lock TTL during the 2PC. ttl-refreshed-txn-size = 33554432 -[tikv-client.async-commit] -# Whether to enable the async commit feature. This feature reduces the latency of the two-phase commit. -enable = false -# The maximum allowed keys in an async commit transaction. Transactions with more keys than the limit -# will be committed with normal 2PC way. -keys-limit = 256 -# The maximum length total of keys in bytes. Transactions will be committed with the normal 2PC way -# if the limit is exceeded. -total-key-size-limit = 4096 - [tikv-client.copr-cache] -# Whether to enable the copr cache. The copr cache saves the result from TiKV Coprocessor in the memory and -# reuses the result when corresponding data in TiKV is unchanged, on a region basis. -enable = true - -# The capacity in MB of the cache. +# The capacity in MB of the cache. Zero means disable coprocessor cache. capacity-mb = 1000.0 -# Only cache requests whose result set is small. -admission-max-result-mb = 10.0 -# Only cache requests takes notable time to process. -admission-min-process-ms = 5 - [binlog] # enable to write binlog. # NOTE: If binlog is enabled with Kafka (e.g. arbiter cluster), @@ -452,6 +466,10 @@ history-size = 24 # experimental section controls the features that are still experimental: their semantics, # interfaces are subject to change, using these features in the production environment is not recommended. [experimental] +# enable creating expression index. +allow-expression-index = false +# enable global kill. +enable-global-kill = false # server level isolation read by engines and labels [isolation-read] diff --git a/config/config_test.go b/config/config_test.go index af1e9c64d81a2..59dfcffb24a6f 100644 --- a/config/config_test.go +++ b/config/config_test.go @@ -108,8 +108,10 @@ func (s *testConfigSuite) TestLogConfig(c *C) { c.Assert(conf.Log.EnableTimestamp, Equals, expectedEnableTimestamp) c.Assert(conf.Log.DisableTimestamp, Equals, expectedDisableTimestamp) c.Assert(conf.Log.ToLogConfig(), DeepEquals, logutil.NewLogConfig("info", "text", "tidb-slow.log", conf.Log.File, resultedDisableTimestamp, func(config *zaplog.Config) { config.DisableErrorVerbose = resultedDisableErrorVerbose })) - f.Truncate(0) - f.Seek(0, 0) + err := f.Truncate(0) + c.Assert(err, IsNil) + _, err = f.Seek(0, 0) + c.Assert(err, IsNil) } testLoad(` @@ -174,8 +176,10 @@ unrecognized-option-test = true c.Assert(conf.Load(configFile), ErrorMatches, "(?:.|\n)*invalid configuration option(?:.|\n)*") c.Assert(conf.MaxServerConnections, Equals, uint32(0)) - f.Truncate(0) - f.Seek(0, 0) + err = f.Truncate(0) + c.Assert(err, IsNil) + _, err = f.Seek(0, 0) + c.Assert(err, IsNil) _, err = f.WriteString(` token-limit = 0 @@ -188,10 +192,13 @@ server-version = "test_version" repair-mode = true max-server-connections = 200 mem-quota-query = 10000 -nested-loop-join-cache-capacity = 100 max-index-length = 3080 +index-limit = 70 +table-column-count-limit = 4000 skip-register-to-dashboard = true deprecate-integer-display-length = true +enable-enum-length-limit = false +stores-refresh-interval = 30 [performance] txn-total-size-limit=2000 [tikv-client] @@ -201,7 +208,6 @@ region-cache-ttl=6000 store-limit=0 ttl-refreshed-txn-size=8192 [tikv-client.async-commit] -enable=true keys-limit=123 total-key-size-limit=1024 [stmt-summary] @@ -212,11 +218,13 @@ max-sql-length=1024 refresh-interval=100 history-size=100 [experimental] +allow-expression-index = true [isolation-read] engines = ["tiflash"] [labels] foo= "bar" group= "abc" +zone= "dc-1" [security] spilled-file-encryption-method = "plaintext" `) @@ -237,7 +245,6 @@ spilled-file-encryption-method = "plaintext" c.Assert(conf.AlterPrimaryKey, Equals, true) c.Assert(conf.TiKVClient.CommitTimeout, Equals, "41s") - c.Assert(conf.TiKVClient.AsyncCommit.Enable, Equals, true) c.Assert(conf.TiKVClient.AsyncCommit.KeysLimit, Equals, uint(123)) c.Assert(conf.TiKVClient.AsyncCommit.TotalKeySizeLimit, Equals, uint64(1024)) c.Assert(conf.TiKVClient.MaxBatchSize, Equals, uint(128)) @@ -258,15 +265,20 @@ spilled-file-encryption-method = "plaintext" c.Assert(conf.RepairMode, Equals, true) c.Assert(conf.MaxServerConnections, Equals, uint32(200)) c.Assert(conf.MemQuotaQuery, Equals, int64(10000)) - c.Assert(conf.NestedLoopJoinCacheCapacity, Equals, int64(100)) + c.Assert(conf.Experimental.AllowsExpressionIndex, IsTrue) c.Assert(conf.IsolationRead.Engines, DeepEquals, []string{"tiflash"}) c.Assert(conf.MaxIndexLength, Equals, 3080) + c.Assert(conf.IndexLimit, Equals, 70) + c.Assert(conf.TableColumnCountLimit, Equals, uint32(4000)) c.Assert(conf.SkipRegisterToDashboard, Equals, true) - c.Assert(len(conf.Labels), Equals, 2) + c.Assert(len(conf.Labels), Equals, 3) c.Assert(conf.Labels["foo"], Equals, "bar") c.Assert(conf.Labels["group"], Equals, "abc") + c.Assert(conf.Labels["zone"], Equals, "dc-1") c.Assert(conf.Security.SpilledFileEncryptionMethod, Equals, SpilledFileEncryptionMethodPlaintext) c.Assert(conf.DeprecateIntegerDisplayWidth, Equals, true) + c.Assert(conf.EnableEnumLengthLimit, Equals, false) + c.Assert(conf.StoresRefreshInterval, Equals, uint64(30)) _, err = f.WriteString(` [log.file] @@ -278,8 +290,10 @@ log-rotate = true`) // Test telemetry config default value and whether it will be overwritten. conf = NewConfig() - f.Truncate(0) - f.Seek(0, 0) + err = f.Truncate(0) + c.Assert(err, IsNil) + _, err = f.Seek(0, 0) + c.Assert(err, IsNil) c.Assert(f.Sync(), IsNil) c.Assert(conf.Load(configFile), IsNil) c.Assert(conf.EnableTelemetry, Equals, true) @@ -394,7 +408,8 @@ xkNuJ2BlEGkwWLiRbKy1lNBBFUXKuhh3L/EIY10WTnr3TQzeL6H1 conf.Security.ClusterSSLCA = certFile conf.Security.ClusterSSLCert = certFile conf.Security.ClusterSSLKey = keyFile - tlsConfig, err := conf.Security.ToTLSConfig() + clusterSecurity := conf.Security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() c.Assert(err, IsNil) c.Assert(tlsConfig, NotNil) @@ -468,17 +483,28 @@ func (s *testConfigSuite) TestMaxIndexLength(c *C) { checkValid(DefMaxOfMaxIndexLength+1, false) } -func (s *testConfigSuite) TestParsePath(c *C) { - etcdAddrs, disableGC, err := ParsePath("tikv://node1:2379,node2:2379") - c.Assert(err, IsNil) - c.Assert(etcdAddrs, DeepEquals, []string{"node1:2379", "node2:2379"}) - c.Assert(disableGC, IsFalse) +func (s *testConfigSuite) TestIndexLimit(c *C) { + conf := NewConfig() + checkValid := func(indexLimit int, shouldBeValid bool) { + conf.IndexLimit = indexLimit + c.Assert(conf.Valid() == nil, Equals, shouldBeValid) + } + checkValid(DefIndexLimit, true) + checkValid(DefIndexLimit-1, false) + checkValid(DefMaxOfIndexLimit, true) + checkValid(DefMaxOfIndexLimit+1, false) +} - _, _, err = ParsePath("tikv://node1:2379") - c.Assert(err, IsNil) - _, disableGC, err = ParsePath("tikv://node1:2379?disableGC=true") - c.Assert(err, IsNil) - c.Assert(disableGC, IsTrue) +func (s *testConfigSuite) TestTableColumnCountLimit(c *C) { + conf := NewConfig() + checkValid := func(tableColumnLimit int, shouldBeValid bool) { + conf.TableColumnCountLimit = uint32(tableColumnLimit) + c.Assert(conf.Valid() == nil, Equals, shouldBeValid) + } + checkValid(DefTableColumnCountLimit, true) + checkValid(DefTableColumnCountLimit-1, false) + checkValid(DefMaxOfTableColumnCountLimit, true) + checkValid(DefMaxOfTableColumnCountLimit+1, false) } func (s *testConfigSuite) TestEncodeDefTempStorageDir(c *C) { diff --git a/config/config_util.go b/config/config_util.go index 6922437cf1bcb..ce54255369507 100644 --- a/config/config_util.go +++ b/config/config_util.go @@ -25,6 +25,7 @@ import ( "github.com/BurntSushi/toml" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" ) // CloneConf deeply clones this config. @@ -154,3 +155,23 @@ func flatten(flatMap map[string]interface{}, nested interface{}, prefix string) flatMap[prefix] = nested } } + +const ( + globalTxnScope = "global" +) + +// GetTxnScopeFromConfig extracts @@txn_scope value from config +func GetTxnScopeFromConfig() (bool, string) { + failpoint.Inject("injectTxnScope", func(val failpoint.Value) { + v := val.(string) + if len(v) > 0 { + failpoint.Return(false, v) + } + failpoint.Return(true, globalTxnScope) + }) + v, ok := GetGlobalConfig().Labels["zone"] + if ok && len(v) > 0 { + return false, v + } + return true, globalTxnScope +} diff --git a/config/config_util_test.go b/config/config_util_test.go index 7972fcf706000..3ed621758f757 100644 --- a/config/config_util_test.go +++ b/config/config_util_test.go @@ -23,6 +23,7 @@ import ( "github.com/BurntSushi/toml" . "github.com/pingcap/check" + "github.com/pingcap/failpoint" ) func (s *testConfigSuite) TestCloneConf(c *C) { @@ -168,3 +169,21 @@ engines = ["tikv", "tiflash", "tidb"] c.Assert(toJSONStr(flatMap["log.format"]), Equals, `"text"`) c.Assert(toJSONStr(flatMap["isolation-read.engines"]), Equals, `["tikv","tiflash","tidb"]`) } + +func (s *testConfigSuite) TestTxnScopeValue(c *C) { + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("bj")`) + isGlobal, v := GetTxnScopeFromConfig() + c.Assert(isGlobal, IsFalse) + c.Assert(v, Equals, "bj") + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("")`) + isGlobal, v = GetTxnScopeFromConfig() + c.Assert(isGlobal, IsTrue) + c.Assert(v, Equals, "global") + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("global")`) + isGlobal, v = GetTxnScopeFromConfig() + c.Assert(isGlobal, IsFalse) + c.Assert(v, Equals, "global") + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") +} diff --git a/ddl/backfilling.go b/ddl/backfilling.go index 5a8e4ece3e564..0f9b781b93a38 100644 --- a/ddl/backfilling.go +++ b/ddl/backfilling.go @@ -14,8 +14,9 @@ package ddl import ( + "bytes" "context" - "math" + "fmt" "strconv" "sync/atomic" "time" @@ -44,14 +45,69 @@ type backfillWorkerType byte const ( typeAddIndexWorker backfillWorkerType = 0 typeUpdateColumnWorker backfillWorkerType = 1 + typeCleanUpIndexWorker backfillWorkerType = 2 ) +// By now the DDL jobs that need backfilling include: +// 1: add-index +// 2: modify-column-type +// 3: clean-up global index +// +// They all have a write reorganization state to back fill data into the rows existed. +// Backfilling is time consuming, to accelerate this process, TiDB has built some sub +// workers to do this in the DDL owner node. +// +// DDL owner thread +// ^ +// | (reorgCtx.doneCh) +// | +// worker master +// ^ (waitTaskResults) +// | +// | +// v (sendRangeTask) +// +--------------------+---------+---------+------------------+--------------+ +// | | | | | +// backfillworker1 backfillworker2 backfillworker3 backfillworker4 ... +// +// The worker master is responsible for scaling the backfilling workers according to the +// system variable "tidb_ddl_reorg_worker_cnt". Essentially, reorg job is mainly based +// on the [start, end] range of the table to backfill data. We did not do it all at once, +// there were several ddl rounds. +// +// [start1---end1 start2---end2 start3---end3 start4---end4 ... ... ] +// | | | | | | | | +// +-------+ +-------+ +-------+ +-------+ ... ... +// | | | | +// bfworker1 bfworker2 bfworker3 bfworker4 ... ... +// | | | | | | +// +---------------- (round1)----------------+ +--(round2)--+ +// +// The main range [start, end] will be split into small ranges. +// Each small range corresponds to a region and it will be delivered to a backfillworker. +// Each worker can only be assigned with one range at one round, those remaining ranges +// will be cached until all the backfill workers have had their previous range jobs done. +// +// [ region start --------------------- region end ] +// | +// v +// [ batch ] [ batch ] [ batch ] [ batch ] ... +// | | | | +// v v v v +// (a kv txn) -> -> -> +// +// For a single range, backfill worker doesn't backfill all the data in one kv transaction. +// Instead, it is divided into batches, each time a kv transaction completes the backfilling +// of a partial batch. + func (bWT backfillWorkerType) String() string { switch bWT { case typeAddIndexWorker: return "add index" case typeUpdateColumnWorker: return "update column" + case typeCleanUpIndexWorker: + return "clean up index" default: return "unknown" } @@ -65,14 +121,14 @@ type backfiller interface { type backfillResult struct { addedCount int scanCount int - nextHandle kv.Handle + nextKey kv.Key err error } // backfillTaskContext is the context of the batch adding indices or updating column values. // After finishing the batch adding indices or updating column values, result in backfillTaskContext will be merged into backfillResult. type backfillTaskContext struct { - nextHandle kv.Handle + nextKey kv.Key done bool addedCount int scanCount int @@ -120,20 +176,15 @@ func closeBackfillWorkers(workers []*backfillWorker) { type reorgBackfillTask struct { physicalTableID int64 - startHandle kv.Handle - endHandle kv.Handle - // endIncluded indicates whether the range include the endHandle. - // When the last handle is math.MaxInt64, set endIncluded to true to - // tell worker backfilling index of endHandle. - endIncluded bool + startKey kv.Key + endKey kv.Key } func (r *reorgBackfillTask) String() string { - rightParenthesis := ")" - if r.endIncluded { - rightParenthesis = "]" - } - return "physicalTableID_" + strconv.FormatInt(r.physicalTableID, 10) + "_" + "[" + r.startHandle.String() + "," + r.endHandle.String() + rightParenthesis + physicalID := strconv.FormatInt(r.physicalTableID, 10) + startKey := tryDecodeToHandleString(r.startKey) + endKey := tryDecodeToHandleString(r.endKey) + return "physicalTableID_" + physicalID + "_" + "[" + startKey + "," + endKey + "]" } func logSlowOperations(elapsed time.Duration, slowMsg string, threshold uint32) { @@ -148,7 +199,7 @@ func logSlowOperations(elapsed time.Duration, slowMsg string, threshold uint32) // mergeBackfillCtxToResult merge partial result in taskCtx into result. func mergeBackfillCtxToResult(taskCtx *backfillTaskContext, result *backfillResult) { - result.nextHandle = taskCtx.nextHandle + result.nextKey = taskCtx.nextKey result.addedCount += taskCtx.addedCount result.scanCount += taskCtx.scanCount } @@ -171,7 +222,7 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, result := &backfillResult{ err: nil, addedCount: 0, - nextHandle: handleRange.startHandle, + nextKey: handleRange.startKey, } lastLogCount := 0 lastLogTime := time.Now() @@ -210,19 +261,25 @@ func (w *backfillWorker) handleBackfillTask(d *ddlCtx, task *reorgBackfillTask, if num := result.scanCount - lastLogCount; num >= 30000 { lastLogCount = result.scanCount - logutil.BgLogger().Info("[ddl] backfill worker back fill index", zap.Int("workerID", w.id), zap.Int("addedCount", result.addedCount), - zap.Int("scanCount", result.scanCount), zap.String("nextHandle", toString(taskCtx.nextHandle)), zap.Float64("speed(rows/s)", float64(num)/time.Since(lastLogTime).Seconds())) + logutil.BgLogger().Info("[ddl] backfill worker back fill index", + zap.Int("workerID", w.id), + zap.Int("addedCount", result.addedCount), + zap.Int("scanCount", result.scanCount), + zap.String("nextHandle", tryDecodeToHandleString(taskCtx.nextKey)), + zap.Float64("speed(rows/s)", float64(num)/time.Since(lastLogTime).Seconds())) lastLogTime = time.Now() } - handleRange.startHandle = taskCtx.nextHandle + handleRange.startKey = taskCtx.nextKey if taskCtx.done { break } } logutil.BgLogger().Info("[ddl] backfill worker finish task", zap.Int("workerID", w.id), - zap.String("task", task.String()), zap.Int("addedCount", result.addedCount), - zap.Int("scanCount", result.scanCount), zap.String("nextHandle", toString(result.nextHandle)), + zap.String("task", task.String()), + zap.Int("addedCount", result.addedCount), + zap.Int("scanCount", result.scanCount), + zap.String("nextHandle", tryDecodeToHandleString(result.nextKey)), zap.String("takeTime", time.Since(startTime).String())) return result } @@ -242,7 +299,7 @@ func (w *backfillWorker) run(d *ddlCtx, bf backfiller) { logutil.BgLogger().Debug("[ddl] backfill worker got task", zap.Int("workerID", w.id), zap.String("task", task.String())) failpoint.Inject("mockBackfillRunErr", func() { if w.id == 0 { - result := &backfillResult{addedCount: 0, nextHandle: nil, err: errors.Errorf("mock backfill error")} + result := &backfillResult{addedCount: 0, nextKey: nil, err: errors.Errorf("mock backfill error")} w.resultCh <- result failpoint.Continue() } @@ -259,13 +316,12 @@ func (w *backfillWorker) run(d *ddlCtx, bf backfiller) { // splitTableRanges uses PD region's key ranges to split the backfilling table key range space, // to speed up backfilling data in table with disperse handle. // The `t` should be a non-partitioned table or a partition. -func splitTableRanges(t table.PhysicalTable, store kv.Storage, startHandle, endHandle kv.Handle) ([]kv.KeyRange, error) { - startRecordKey := t.RecordKey(startHandle) - endRecordKey := t.RecordKey(endHandle) - - logutil.BgLogger().Info("[ddl] split table range from PD", zap.Int64("physicalTableID", t.GetPhysicalID()), - zap.String("startHandle", toString(startHandle)), zap.String("endHandle", toString(endHandle))) - kvRange := kv.KeyRange{StartKey: startRecordKey, EndKey: endRecordKey} +func splitTableRanges(t table.PhysicalTable, store kv.Storage, startKey, endKey kv.Key) ([]kv.KeyRange, error) { + logutil.BgLogger().Info("[ddl] split table range from PD", + zap.Int64("physicalTableID", t.GetPhysicalID()), + zap.String("startHandle", tryDecodeToHandleString(startKey)), + zap.String("endHandle", tryDecodeToHandleString(endKey))) + kvRange := kv.KeyRange{StartKey: startKey, EndKey: endKey} s, ok := store.(tikv.Storage) if !ok { // Only support split ranges in tikv.Storage now. @@ -279,15 +335,17 @@ func splitTableRanges(t table.PhysicalTable, store kv.Storage, startHandle, endH return nil, errors.Trace(err) } if len(ranges) == 0 { - return nil, errors.Trace(errInvalidSplitRegionRanges) + errMsg := fmt.Sprintf("cannot find region in range [%s, %s]", startKey.String(), endKey.String()) + return nil, errors.Trace(errInvalidSplitRegionRanges.GenWithStackByArgs(errMsg)) } return ranges, nil } -func (w *worker) waitTaskResults(workers []*backfillWorker, taskCnt int, totalAddedCount *int64, startHandle kv.Handle) (kv.Handle, int64, error) { +func (w *worker) waitTaskResults(workers []*backfillWorker, taskCnt int, + totalAddedCount *int64, startKey kv.Key) (kv.Key, int64, error) { var ( addedCount int64 - nextHandle = startHandle + nextKey = startKey firstErr error ) for i := 0; i < taskCnt; i++ { @@ -307,11 +365,11 @@ func (w *worker) waitTaskResults(workers []*backfillWorker, taskCnt int, totalAd if firstErr == nil { *totalAddedCount += int64(result.addedCount) addedCount += int64(result.addedCount) - nextHandle = result.nextHandle + nextKey = result.nextKey } } - return nextHandle, addedCount, errors.Trace(firstErr) + return nextKey, addedCount, errors.Trace(firstErr) } // handleReorgTasks sends tasks to workers, and waits for all the running workers to return results, @@ -321,10 +379,10 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, workers[i].taskCh <- task } - startHandle := batchTasks[0].startHandle + startKey := batchTasks[0].startKey taskCnt := len(batchTasks) startTime := time.Now() - nextHandle, taskAddedCount, err := w.waitTaskResults(workers, taskCnt, totalAddedCount, startHandle) + nextKey, taskAddedCount, err := w.waitTaskResults(workers, taskCnt, totalAddedCount, startKey) elapsedTime := time.Since(startTime) if err == nil { err = w.isReorgRunnable(reorgInfo.d) @@ -332,58 +390,67 @@ func (w *worker) handleReorgTasks(reorgInfo *reorgInfo, totalAddedCount *int64, if err != nil { // Update the reorg handle that has been processed. - err1 := reorgInfo.UpdateReorgMeta(nextHandle) + err1 := reorgInfo.UpdateReorgMeta(nextKey) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblError).Observe(elapsedTime.Seconds()) logutil.BgLogger().Warn("[ddl] backfill worker handle batch tasks failed", - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), - zap.Int64("totalAddedCount", *totalAddedCount), zap.String("startHandle", toString(startHandle)), - zap.String("nextHandle", toString(nextHandle)), zap.Int64("batchAddedCount", taskAddedCount), - zap.String("taskFailedError", err.Error()), zap.String("takeTime", elapsedTime.String()), + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), + zap.Int64("elementID", reorgInfo.currElement.ID), + zap.Int64("totalAddedCount", *totalAddedCount), + zap.String("startHandle", tryDecodeToHandleString(startKey)), + zap.String("nextHandle", tryDecodeToHandleString(nextKey)), + zap.Int64("batchAddedCount", taskAddedCount), + zap.String("taskFailedError", err.Error()), + zap.String("takeTime", elapsedTime.String()), zap.NamedError("updateHandleError", err1)) return errors.Trace(err) } // nextHandle will be updated periodically in runReorgJob, so no need to update it here. - w.reorgCtx.setNextHandle(nextHandle) + w.reorgCtx.setNextKey(nextKey) metrics.BatchAddIdxHistogram.WithLabelValues(metrics.LblOK).Observe(elapsedTime.Seconds()) logutil.BgLogger().Info("[ddl] backfill workers successfully processed batch", - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), - zap.Int64("totalAddedCount", *totalAddedCount), zap.String("startHandle", toString(startHandle)), - zap.String("nextHandle", toString(nextHandle)), zap.Int64("batchAddedCount", taskAddedCount), zap.String("takeTime", elapsedTime.String())) + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), + zap.Int64("elementID", reorgInfo.currElement.ID), + zap.Int64("totalAddedCount", *totalAddedCount), + zap.String("startHandle", tryDecodeToHandleString(startKey)), + zap.String("nextHandle", tryDecodeToHandleString(nextKey)), + zap.Int64("batchAddedCount", taskAddedCount), + zap.String("takeTime", elapsedTime.String())) return nil } -func decodeHandleRange(keyRange kv.KeyRange) (kv.Handle, kv.Handle, error) { - startHandle, err := tablecodec.DecodeRowKey(keyRange.StartKey) - if err != nil { - return nil, nil, errors.Trace(err) - } - endHandle, err := tablecodec.DecodeRowKey(keyRange.EndKey) +func tryDecodeToHandleString(key kv.Key) string { + handle, err := tablecodec.DecodeRowKey(key) if err != nil { - return nil, nil, errors.Trace(err) + recordPrefixIdx := bytes.Index(key, []byte("_r")) + if recordPrefixIdx == -1 { + return fmt.Sprintf("key: %x", key) + } + handleBytes := key[recordPrefixIdx+2:] + terminatedWithZero := len(handleBytes) > 0 && handleBytes[len(handleBytes)-1] == 0 + if terminatedWithZero { + handle, err := tablecodec.DecodeRowKey(key[:len(key)-1]) + if err == nil { + return handle.String() + ".next" + } + } + return fmt.Sprintf("%x", handleBytes) } - - return startHandle, endHandle, nil + return handle.String() } // sendRangeTaskToWorkers sends tasks to workers, and returns remaining kvRanges that is not handled. func (w *worker) sendRangeTaskToWorkers(workers []*backfillWorker, reorgInfo *reorgInfo, - totalAddedCount *int64, kvRanges []kv.KeyRange, globalEndHandle kv.Handle) ([]kv.KeyRange, error) { + totalAddedCount *int64, kvRanges []kv.KeyRange) ([]kv.KeyRange, error) { batchTasks := make([]*reorgBackfillTask, 0, len(workers)) physicalTableID := reorgInfo.PhysicalTableID // Build reorg tasks. for _, keyRange := range kvRanges { - startHandle, endHandle, err := decodeHandleRange(keyRange) - if err != nil { - return nil, errors.Trace(err) - } - - endIncluded := false - if endHandle.Equal(globalEndHandle) { - endIncluded = true - } - task := &reorgBackfillTask{physicalTableID, startHandle, endHandle, endIncluded} + task := &reorgBackfillTask{ + physicalTableID: physicalTableID, + startKey: keyRange.StartKey, + endKey: keyRange.EndKey} batchTasks = append(batchTasks, task) if len(batchTasks) >= len(workers) { @@ -465,7 +532,7 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba job := reorgInfo.Job totalAddedCount := job.GetRowCount() - startHandle, endHandle := reorgInfo.StartHandle, reorgInfo.EndHandle + startKey, endKey := reorgInfo.StartKey, reorgInfo.EndKey sessCtx := newContext(reorgInfo.d.store) decodeColMap, err := makeupDecodeColMap(sessCtx, t) if err != nil { @@ -475,7 +542,7 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba if err := w.isReorgRunnable(reorgInfo.d); err != nil { return errors.Trace(err) } - if startHandle == nil && endHandle == nil { + if startKey == nil && endKey == nil { return nil } @@ -493,7 +560,7 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba }() for { - kvRanges, err := splitTableRanges(t, reorgInfo.d.store, startHandle, endHandle) + kvRanges, err := splitTableRanges(t, reorgInfo.d.store, startKey, endKey) if err != nil { return errors.Trace(err) } @@ -503,6 +570,7 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba logutil.BgLogger().Error("[ddl] load DDL reorganization variable failed", zap.Error(err)) } workerCnt = variable.GetDDLReorgWorkerCounter() + rowFormat := variable.GetDDLReorgRowFormat() // If only have 1 range, we can only start 1 worker. if len(kvRanges) < int(workerCnt) { workerCnt = int32(len(kvRanges)) @@ -511,17 +579,36 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba for i := len(backfillWorkers); i < int(workerCnt); i++ { sessCtx := newContext(reorgInfo.d.store) sessCtx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true - - if bfWorkerType == typeAddIndexWorker { + // Set the row encode format version. + sessCtx.GetSessionVars().RowEncoder.Enable = rowFormat != variable.DefTiDBRowFormatV1 + // Simulate the sql mode environment in the worker sessionCtx. + sqlMode := reorgInfo.ReorgMeta.SQLMode + sessCtx.GetSessionVars().SQLMode = sqlMode + sessCtx.GetSessionVars().StmtCtx.BadNullAsWarning = !sqlMode.HasStrictMode() + sessCtx.GetSessionVars().StmtCtx.TruncateAsWarning = !sqlMode.HasStrictMode() + sessCtx.GetSessionVars().StmtCtx.OverflowAsWarning = !sqlMode.HasStrictMode() + sessCtx.GetSessionVars().StmtCtx.AllowInvalidDate = sqlMode.HasAllowInvalidDatesMode() + sessCtx.GetSessionVars().StmtCtx.DividedByZeroAsWarning = !sqlMode.HasStrictMode() + sessCtx.GetSessionVars().StmtCtx.IgnoreZeroInDate = !sqlMode.HasStrictMode() || sqlMode.HasAllowInvalidDatesMode() + + switch bfWorkerType { + case typeAddIndexWorker: idxWorker := newAddIndexWorker(sessCtx, w, i, t, indexInfo, decodeColMap, reorgInfo.ReorgMeta.SQLMode) idxWorker.priority = job.Priority backfillWorkers = append(backfillWorkers, idxWorker.backfillWorker) go idxWorker.backfillWorker.run(reorgInfo.d, idxWorker) - } else { + case typeUpdateColumnWorker: updateWorker := newUpdateColumnWorker(sessCtx, w, i, t, oldColInfo, colInfo, decodeColMap, reorgInfo.ReorgMeta.SQLMode) updateWorker.priority = job.Priority backfillWorkers = append(backfillWorkers, updateWorker.backfillWorker) go updateWorker.backfillWorker.run(reorgInfo.d, updateWorker) + case typeCleanUpIndexWorker: + idxWorker := newCleanUpIndexWorker(sessCtx, w, i, t, decodeColMap, reorgInfo.ReorgMeta.SQLMode) + idxWorker.priority = job.Priority + backfillWorkers = append(backfillWorkers, idxWorker.backfillWorker) + go idxWorker.backfillWorker.run(reorgInfo.d, idxWorker) + default: + return errors.New("unknow backfill type") } } // Shrink the worker size. @@ -547,9 +634,12 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba } }) - logutil.BgLogger().Info("[ddl] start backfill workers to reorg record", zap.Int("workerCnt", len(backfillWorkers)), - zap.Int("regionCnt", len(kvRanges)), zap.String("startHandle", toString(startHandle)), zap.String("endHandle", toString(endHandle))) - remains, err := w.sendRangeTaskToWorkers(backfillWorkers, reorgInfo, &totalAddedCount, kvRanges, endHandle) + logutil.BgLogger().Info("[ddl] start backfill workers to reorg record", + zap.Int("workerCnt", len(backfillWorkers)), + zap.Int("regionCnt", len(kvRanges)), + zap.String("startHandle", tryDecodeToHandleString(startKey)), + zap.String("endHandle", tryDecodeToHandleString(endKey))) + remains, err := w.sendRangeTaskToWorkers(backfillWorkers, reorgInfo, &totalAddedCount, kvRanges) if err != nil { return errors.Trace(err) } @@ -557,10 +647,7 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba if len(remains) == 0 { break } - startHandle, _, err = decodeHandleRange(remains[0]) - if err != nil { - return errors.Trace(err) - } + startKey = remains[0].StartKey } return nil } @@ -568,35 +655,25 @@ func (w *worker) writePhysicalTableRecord(t table.PhysicalTable, bfWorkerType ba // recordIterFunc is used for low-level record iteration. type recordIterFunc func(h kv.Handle, rowKey kv.Key, rawRecord []byte) (more bool, err error) -func iterateSnapshotRows(store kv.Storage, priority int, t table.Table, version uint64, startHandle kv.Handle, endHandle kv.Handle, endIncluded bool, fn recordIterFunc) error { +func iterateSnapshotRows(store kv.Storage, priority int, t table.Table, version uint64, + startKey kv.Key, endKey kv.Key, fn recordIterFunc) error { var firstKey kv.Key - if startHandle == nil { + if startKey == nil { firstKey = t.RecordPrefix() } else { - firstKey = t.RecordKey(startHandle) + firstKey = startKey } var upperBound kv.Key - if endHandle == nil { + if endKey == nil { upperBound = t.RecordPrefix().PrefixNext() } else { - if endIncluded { - if endHandle.IsInt() && endHandle.IntValue() == math.MaxInt64 { - upperBound = t.RecordKey(endHandle).PrefixNext() - } else { - upperBound = t.RecordKey(endHandle.Next()) - } - } else { - upperBound = t.RecordKey(endHandle) - } + upperBound = endKey.PrefixNext() } ver := kv.Version{Ver: version} - snap, err := store.GetSnapshot(ver) + snap := store.GetSnapshot(ver) snap.SetOption(kv.Priority, priority) - if err != nil { - return errors.Trace(err) - } it, err := snap.Iter(firstKey, upperBound) if err != nil { @@ -614,7 +691,7 @@ func iterateSnapshotRows(store kv.Storage, priority int, t table.Table, version if err != nil { return errors.Trace(err) } - rk := t.RecordKey(handle) + rk := tablecodec.EncodeRecordKey(t.RecordPrefix(), handle) more, err := fn(handle, rk, it.Value()) if !more || err != nil { diff --git a/ddl/callback.go b/ddl/callback.go index af2b4856e8c1d..758740527f0bc 100644 --- a/ddl/callback.go +++ b/ddl/callback.go @@ -37,8 +37,10 @@ func (bi *BaseInterceptor) OnGetInfoSchema(ctx sessionctx.Context, is infoschema // Callback is used for DDL. type Callback interface { - // OnChanged is called after schema is changed. + // OnChanged is called after a ddl statement is finished. OnChanged(err error) error + // OnSchemaStateChange is called after a schema state is changed. + OnSchemaStateChanged() // OnJobRunBefore is called before running job. OnJobRunBefore(job *model.Job) // OnJobUpdated is called after the running job is updated. @@ -56,6 +58,11 @@ func (c *BaseCallback) OnChanged(err error) error { return err } +// OnSchemaStateChanged implements Callback interface. +func (c *BaseCallback) OnSchemaStateChanged() { + // Nothing to do. +} + // OnJobRunBefore implements Callback.OnJobRunBefore interface. func (c *BaseCallback) OnJobRunBefore(job *model.Job) { // Nothing to do. diff --git a/ddl/callback_test.go b/ddl/callback_test.go index 7f01cb626d62c..80ec643de54e3 100644 --- a/ddl/callback_test.go +++ b/ddl/callback_test.go @@ -40,6 +40,9 @@ func (ti *TestInterceptor) OnGetInfoSchema(ctx sessionctx.Context, is infoschema type TestDDLCallback struct { *BaseCallback + // We recommended to pass the domain parameter to the test ddl callback, it will ensure + // domain to reload schema before your ddl stepping into the next state change. + Do DomainReloader onJobRunBefore func(*model.Job) OnJobRunBeforeExported func(*model.Job) @@ -48,6 +51,14 @@ type TestDDLCallback struct { onWatched func(ctx context.Context) } +func (tc *TestDDLCallback) OnSchemaStateChanged() { + if tc.Do != nil { + if err := tc.Do.Reload(); err != nil { + log.Warn("reload failed on schema state changed", zap.Error(err)) + } + } +} + func (tc *TestDDLCallback) OnJobRunBefore(job *model.Job) { log.Info("on job run before", zap.String("job", job.String())) if tc.OnJobRunBeforeExported != nil { @@ -92,3 +103,7 @@ func (s *testDDLSuite) TestCallback(c *C) { cb.OnJobUpdated(nil) cb.OnWatched(context.TODO()) } + +type DomainReloader interface { + Reload() error +} diff --git a/ddl/column.go b/ddl/column.go index cf4d55c20e034..8932957593a6d 100644 --- a/ddl/column.go +++ b/ddl/column.go @@ -15,8 +15,8 @@ package ddl import ( "bytes" + "context" "fmt" - "math" "math/bits" "strings" "sync/atomic" @@ -29,6 +29,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -36,9 +37,11 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" decoder "github.com/pingcap/tidb/util/rowDecoder" @@ -209,19 +212,30 @@ func onAddColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) switch columnInfo.State { case model.StateNone: // none -> delete only - job.SchemaState = model.StateDeleteOnly columnInfo.State = model.StateDeleteOnly ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, originalState != columnInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: // delete only -> write only - job.SchemaState = model.StateWriteOnly columnInfo.State = model.StateWriteOnly ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != columnInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + // Update the job state when all affairs done. + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> reorganization - job.SchemaState = model.StateWriteReorganization columnInfo.State = model.StateWriteReorganization ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != columnInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + // Update the job state when all affairs done. + job.SchemaState = model.StateWriteReorganization case model.StateWriteReorganization: // reorganization -> public // Adjust table column offset. @@ -346,19 +360,28 @@ func onAddColumns(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error switch columnInfos[0].State { case model.StateNone: // none -> delete only - job.SchemaState = model.StateDeleteOnly setColumnsState(columnInfos, model.StateDeleteOnly) ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, originalState != columnInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: // delete only -> write only - job.SchemaState = model.StateWriteOnly setColumnsState(columnInfos, model.StateWriteOnly) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != columnInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> reorganization - job.SchemaState = model.StateWriteReorganization setColumnsState(columnInfos, model.StateWriteReorganization) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != columnInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteReorganization case model.StateWriteReorganization: // reorganization -> public // Adjust table column offsets. @@ -410,7 +433,6 @@ func onDropColumns(t *meta.Meta, job *model.Job) (ver int64, _ error) { switch colInfos[0].State { case model.StatePublic: // public -> write only - job.SchemaState = model.StateWriteOnly setColumnsState(colInfos, model.StateWriteOnly) setIndicesState(idxInfos, model.StateWriteOnly) for _, colInfo := range colInfos { @@ -420,18 +442,28 @@ func onDropColumns(t *meta.Meta, job *model.Job) (ver int64, _ error) { } } ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, originalState != colInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> delete only - job.SchemaState = model.StateDeleteOnly setColumnsState(colInfos, model.StateDeleteOnly) setIndicesState(idxInfos, model.StateDeleteOnly) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != colInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: // delete only -> reorganization - job.SchemaState = model.StateDeleteReorganization setColumnsState(colInfos, model.StateDeleteReorganization) setIndicesState(idxInfos, model.StateDeleteReorganization) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != colInfos[0].State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteReorganization case model.StateDeleteReorganization: // reorganization -> absent // All reorganization jobs are done, drop this column. @@ -542,7 +574,6 @@ func onDropColumn(t *meta.Meta, job *model.Job) (ver int64, _ error) { switch colInfo.State { case model.StatePublic: // public -> write only - job.SchemaState = model.StateWriteOnly colInfo.State = model.StateWriteOnly setIndicesState(idxInfos, model.StateWriteOnly) err = checkDropColumnForStatePublic(tblInfo, colInfo) @@ -550,18 +581,28 @@ func onDropColumn(t *meta.Meta, job *model.Job) (ver int64, _ error) { return ver, errors.Trace(err) } ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, originalState != colInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> delete only - job.SchemaState = model.StateDeleteOnly colInfo.State = model.StateDeleteOnly setIndicesState(idxInfos, model.StateDeleteOnly) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != colInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: // delete only -> reorganization - job.SchemaState = model.StateDeleteReorganization colInfo.State = model.StateDeleteReorganization setIndicesState(idxInfos, model.StateDeleteReorganization) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != colInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteReorganization case model.StateDeleteReorganization: // reorganization -> absent // All reorganization jobs are done, drop this column. @@ -647,15 +688,64 @@ func onSetDefaultValue(t *meta.Meta, job *model.Job) (ver int64, _ error) { func needChangeColumnData(oldCol, newCol *model.ColumnInfo) bool { toUnsigned := mysql.HasUnsignedFlag(newCol.Flag) originUnsigned := mysql.HasUnsignedFlag(oldCol.Flag) - if oldCol.Tp == newCol.Tp && oldCol.Tp == mysql.TypeNewDecimal { - // Since type decimal will encode the precision, frac, negative(signed) and wordBuf into storage together, there is no short - // cut to eliminate data reorg change for column type change between decimal. - return oldCol.Flen != newCol.Flen || oldCol.Decimal != newCol.Decimal || toUnsigned != originUnsigned + needTruncationOrToggleSign := func() bool { + return (newCol.Flen > 0 && newCol.Flen < oldCol.Flen) || (toUnsigned != originUnsigned) } - if newCol.Flen > 0 && newCol.Flen < oldCol.Flen || toUnsigned != originUnsigned { - return true + // Ignore the potential max display length represented by integer's flen, use default flen instead. + oldColFlen, _ := mysql.GetDefaultFieldLengthAndDecimal(oldCol.Tp) + newColFlen, _ := mysql.GetDefaultFieldLengthAndDecimal(newCol.Tp) + needTruncationOrToggleSignForInteger := func() bool { + return (newColFlen > 0 && newColFlen < oldColFlen) || (toUnsigned != originUnsigned) + } + + // Deal with the same type. + if oldCol.Tp == newCol.Tp { + switch oldCol.Tp { + case mysql.TypeNewDecimal: + // Since type decimal will encode the precision, frac, negative(signed) and wordBuf into storage together, there is no short + // cut to eliminate data reorg change for column type change between decimal. + return oldCol.Flen != newCol.Flen || oldCol.Decimal != newCol.Decimal || toUnsigned != originUnsigned + case mysql.TypeEnum, mysql.TypeSet: + return isElemsChangedToModifyColumn(oldCol.Elems, newCol.Elems) + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + return toUnsigned != originUnsigned + } + + return needTruncationOrToggleSign() } + // Deal with the different type. + switch oldCol.Tp { + case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: + switch newCol.Tp { + case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: + return needTruncationOrToggleSign() + } + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + switch newCol.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + return needTruncationOrToggleSignForInteger() + } + case mysql.TypeFloat, mysql.TypeDouble: + switch newCol.Tp { + case mysql.TypeFloat, mysql.TypeDouble: + return needTruncationOrToggleSign() + } + } + + return true +} + +func isElemsChangedToModifyColumn(oldElems, newElems []string) bool { + if len(newElems) < len(oldElems) { + return true + } + for index, oldElem := range oldElems { + newElem := newElems[index] + if oldElem != newElem { + return true + } + } return false } @@ -746,11 +836,26 @@ func (w *worker) onModifyColumn(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in msg := "tidb_enable_change_column_type is true and this column has primary key flag" return ver, errUnsupportedModifyColumn.GenWithStackByArgs(msg) } - // TODO: Check whether we need to check OriginDefaultValue. + jobParam.changingCol = jobParam.newCol.Clone() jobParam.changingCol.Name = newColName jobParam.changingCol.ChangeStateInfo = &model.ChangeStateInfo{DependencyColumnOffset: oldCol.Offset} - _, _, _, err := createColumnInfo(tblInfo, jobParam.changingCol, changingColPos) + + // Since column type change is implemented as adding a new column then substituting the old one. + // Case exists when update-where statement fetch a NULL for not-null column without any default data, + // it will errors. + // So we set zero original default value here to prevent this error. besides, in insert & update records, + // we have already implement using the casted value of relative column to insert rather than the origin + // default value. + originDefVal, err := generateOriginDefaultValue(jobParam.newCol) + if err != nil { + return ver, errors.Trace(err) + } + if err = jobParam.changingCol.SetOriginDefaultValue(originDefVal); err != nil { + return ver, errors.Trace(err) + } + + _, _, _, err = createColumnInfo(tblInfo, jobParam.changingCol, changingColPos) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) @@ -834,7 +939,12 @@ func (w *worker) doModifyColumnTypeWithData( } defer w.sessPool.put(ctx) - _, _, err = ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(valStr) + stmt, err := ctx.(sqlexec.RestrictedSQLExecutor).ParseWithParams(context.Background(), valStr) + if err != nil { + job.State = model.JobStateCancelled + failpoint.Return(ver, err) + } + _, _, err = ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedStmt(context.Background(), stmt) if err != nil { job.State = model.JobStateCancelled failpoint.Return(ver, err) @@ -848,6 +958,7 @@ func (w *worker) doModifyColumnTypeWithData( // Make sure job args change after `updateVersionAndTableInfoWithCheck`, otherwise, the job args will // be updated in `updateDDLJob` even if it meets an error in `updateVersionAndTableInfoWithCheck`. job.SchemaState = model.StateDeleteOnly + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(0) job.Args = append(job.Args, changingCol, changingIdxs) case model.StateDeleteOnly: // Column from null to not null. @@ -875,6 +986,8 @@ func (w *worker) doModifyColumnTypeWithData( if err != nil { return ver, errors.Trace(err) } + // Initialize SnapshotVer to 0 for later reorganization check. + job.SnapshotVer = 0 job.SchemaState = model.StateWriteReorganization case model.StateWriteReorganization: tbl, err := getTable(d.store, dbInfo.ID, tblInfo) @@ -889,6 +1002,11 @@ func (w *worker) doModifyColumnTypeWithData( return ver, errors.Trace(err) } + // Inject a failpoint so that we can pause here and do verification on other components. + // With a failpoint-enabled version of TiDB, you can trigger this failpoint by the following command: + // enable: curl -X PUT -d "pause" "http://127.0.0.1:10080/fail/github.com/pingcap/tidb/ddl/mockDelayInModifyColumnTypeWithData". + // disable: curl -X DELETE "http://127.0.0.1:10080/fail/github.com/pingcap/tidb/ddl/mockDelayInModifyColumnTypeWithData" + failpoint.Inject("mockDelayInModifyColumnTypeWithData", func() {}) err = w.runReorgJob(t, reorgInfo, tbl.Meta(), d.lease, func() (addIndexErr error) { defer util.Recover(metrics.LabelDDL, "onModifyColumn", func() { @@ -901,7 +1019,7 @@ func (w *worker) doModifyColumnTypeWithData( // If timeout, we should return, check for the owner and re-wait job done. return ver, nil } - if kv.ErrKeyExists.Equal(err) || errCancelledDDLJob.Equal(err) || errCantDecodeRecord.Equal(err) || types.ErrOverflow.Equal(err) { + if needRollbackData(err) { if err1 := t.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { logutil.BgLogger().Warn("[ddl] run modify column job failed, RemoveDDLReorgHandle failed, can't convert job to rollback", zap.String("job", job.String()), zap.Error(err1)) @@ -960,6 +1078,14 @@ func (w *worker) doModifyColumnTypeWithData( return ver, errors.Trace(err) } +// needRollbackData indicates whether it needs to rollback data when specific error occurs. +func needRollbackData(err error) bool { + return kv.ErrKeyExists.Equal(err) || errCancelledDDLJob.Equal(err) || errCantDecodeRecord.Equal(err) || + types.ErrOverflow.Equal(err) || types.ErrDataTooLong.Equal(err) || types.ErrTruncated.Equal(err) || + json.ErrInvalidJSONText.Equal(err) || types.ErrBadNumber.Equal(err) || types.ErrInvalidYear.Equal(err) || + types.ErrWrongValue.Equal(err) +} + // BuildElements is exported for testing. func BuildElements(changingCol *model.ColumnInfo, changingIdxs []*model.IndexInfo) []*meta.Element { elements := make([]*meta.Element, 0, len(changingIdxs)+1) @@ -1012,15 +1138,22 @@ func (w *worker) updateColumnAndIndexes(t table.Table, oldCol, col *model.Column // This backfill job has been exited during processing. At that time, the element is reorgInfo.elements[i+1] and handle range is [reorgInfo.StartHandle, reorgInfo.EndHandle]. // Then the handle range of the rest elements' is [originalStartHandle, originalEndHandle]. if i == startElementOffsetToResetHandle+1 { - reorgInfo.StartHandle, reorgInfo.EndHandle = originalStartHandle, originalEndHandle + reorgInfo.StartKey, reorgInfo.EndKey = originalStartHandle, originalEndHandle } + // Update the element in the reorgCtx to keep the atomic access for daemon-worker. + w.reorgCtx.setCurrentElement(reorgInfo.elements[i+1]) + + // Update the element in the reorgInfo for updating the reorg meta below. reorgInfo.currElement = reorgInfo.elements[i+1] // Write the reorg info to store so the whole reorganize process can recover from panic. - err := reorgInfo.UpdateReorgMeta(reorgInfo.StartHandle) - logutil.BgLogger().Info("[ddl] update column and indexes", zap.Int64("jobID", reorgInfo.Job.ID), - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), - zap.String("startHandle", toString(reorgInfo.StartHandle)), zap.String("endHandle", toString(reorgInfo.EndHandle))) + err := reorgInfo.UpdateReorgMeta(reorgInfo.StartKey) + logutil.BgLogger().Info("[ddl] update column and indexes", + zap.Int64("jobID", reorgInfo.Job.ID), + zap.ByteString("elementType", reorgInfo.currElement.TypeKey), + zap.Int64("elementID", reorgInfo.currElement.ID), + zap.String("startHandle", tryDecodeToHandleString(reorgInfo.StartKey)), + zap.String("endHandle", tryDecodeToHandleString(reorgInfo.EndKey))) if err != nil { return errors.Trace(err) } @@ -1071,43 +1204,32 @@ type rowRecord struct { warning *terror.Error // It's used to record the cast warning of a record. } -// getNextHandle gets next handle of entry that we are going to process. -func (w *updateColumnWorker) getNextHandle(taskRange reorgBackfillTask, taskDone bool, lastAccessedHandle kv.Handle) (nextHandle kv.Handle) { +// getNextKey gets next handle of entry that we are going to process. +func (w *updateColumnWorker) getNextKey(taskRange reorgBackfillTask, + taskDone bool, lastAccessedHandle kv.Key) (nextHandle kv.Key) { if !taskDone { // The task is not done. So we need to pick the last processed entry's handle and add one. return lastAccessedHandle.Next() } - // The task is done. So we need to choose a handle outside this range. - // Some corner cases should be considered: - // - The end of task range is MaxInt64. - // - The end of the task is excluded in the range. - if (taskRange.endHandle.IsInt() && taskRange.endHandle.IntValue() == math.MaxInt64) || !taskRange.endIncluded { - return taskRange.endHandle - } - - return taskRange.endHandle.Next() + return taskRange.endKey.Next() } -func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*rowRecord, kv.Handle, bool, error) { +func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*rowRecord, kv.Key, bool, error) { w.rowRecords = w.rowRecords[:0] startTime := time.Now() // taskDone means that the added handle is out of taskRange.endHandle. taskDone := false - var lastAccessedHandle kv.Handle + var lastAccessedHandle kv.Key oprStartTime := startTime - err := iterateSnapshotRows(w.sessCtx.GetStore(), w.priority, w.table, txn.StartTS(), taskRange.startHandle, taskRange.endHandle, taskRange.endIncluded, + err := iterateSnapshotRows(w.sessCtx.GetStore(), w.priority, w.table, txn.StartTS(), taskRange.startKey, taskRange.endKey, func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { oprEndTime := time.Now() logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotRows in updateColumnWorker fetchRowColVals", 0) oprStartTime = oprEndTime - if !taskRange.endIncluded { - taskDone = handle.Compare(taskRange.endHandle) >= 0 - } else { - taskDone = handle.Compare(taskRange.endHandle) > 0 - } + taskDone = recordKey.Cmp(taskRange.endKey) > 0 if taskDone || len(w.rowRecords) >= w.batchCnt { return false, nil @@ -1116,8 +1238,8 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg if err1 := w.getRowRecord(handle, recordKey, rawRow); err1 != nil { return false, errors.Trace(err1) } - lastAccessedHandle = handle - if handle.Equal(taskRange.endHandle) { + lastAccessedHandle = recordKey + if recordKey.Cmp(taskRange.endKey) == 0 { // If taskRange.endIncluded == false, we will not reach here when handle == taskRange.endHandle. taskDone = true return false, nil @@ -1130,7 +1252,7 @@ func (w *updateColumnWorker) fetchRowColVals(txn kv.Transaction, taskRange reorg } logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) - return w.rowRecords, w.getNextHandle(taskRange, taskDone, lastAccessedHandle), taskDone, errors.Trace(err) + return w.rowRecords, w.getNextKey(taskRange, taskDone, lastAccessedHandle), taskDone, errors.Trace(err) } func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, rawRow []byte) error { @@ -1146,14 +1268,21 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra } var recordWarning *terror.Error + // Since every updateColumnWorker handle their own work individually, we can cache warning in statement context when casting datum. + oldWarn := w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() + if oldWarn == nil { + oldWarn = []stmtctx.SQLWarn{} + } else { + oldWarn = oldWarn[:0] + } + w.sessCtx.GetSessionVars().StmtCtx.SetWarnings(oldWarn) newColVal, err := table.CastValue(w.sessCtx, w.rowMap[w.oldColInfo.ID], w.newColInfo, false, false) if err != nil { - if IsNormalWarning(err) || (!w.sqlMode.HasStrictMode() && IsStrictWarning(err)) { - // Keep the warnings. - recordWarning = errors.Cause(err).(*terror.Error) - } else { - return errors.Trace(err) - } + return w.reformatErrors(err) + } + if w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() != nil && len(w.sessCtx.GetSessionVars().StmtCtx.GetWarnings()) != 0 { + warn := w.sessCtx.GetSessionVars().StmtCtx.GetWarnings() + recordWarning = errors.Cause(w.reformatErrors(warn[0].Err)).(*terror.Error) } failpoint.Inject("MockReorgTimeoutInOneRegion", func(val failpoint.Value) { @@ -1182,24 +1311,17 @@ func (w *updateColumnWorker) getRowRecord(handle kv.Handle, recordKey []byte, ra return nil } -// IsNormalWarning is used to check the normal warnings, for example data-truncated warnings. -// This kind of warning will be always thrown out regard less of what kind of the sql mode is. -func IsNormalWarning(err error) bool { - // TODO: there are more errors here can be identified as normal warnings. - if types.ErrTruncatedWrongVal.Equal(err) { - return true +// reformatErrors casted error because `convertTo` function couldn't package column name and datum value for some errors. +func (w *updateColumnWorker) reformatErrors(err error) error { + // Since row count is not precious in concurrent reorganization, here we substitute row count with datum value. + if types.ErrTruncated.Equal(err) { + err = types.ErrTruncated.GenWithStack("Data truncated for column '%s', value is '%s'", w.oldColInfo.Name, w.rowMap[w.oldColInfo.ID]) } - return false -} -// IsStrictWarning is used to check whether the error can be transferred as a warning under a -// non-strict SQL Mode. -func IsStrictWarning(err error) bool { - // TODO: there are more errors here can be identified as warnings under non-strict SQL mode. - if types.ErrOverflow.Equal(err) { - return true + if types.ErrInvalidYear.Equal(err) { + err = types.ErrInvalidYear.GenWithStack("Invalid year value for column '%s', value is '%s'", w.oldColInfo.Name, w.rowMap[w.oldColInfo.ID]) } - return false + return err } func (w *updateColumnWorker) cleanRowMap() { @@ -1211,16 +1333,16 @@ func (w *updateColumnWorker) cleanRowMap() { // BackfillDataInTxn will backfill the table record in a transaction, lock corresponding rowKey, if the value of rowKey is changed. func (w *updateColumnWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) { oprStartTime := time.Now() - errInTxn = kv.RunInNewTxn(w.sessCtx.GetStore(), true, func(txn kv.Transaction) error { + errInTxn = kv.RunInNewTxn(context.Background(), w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 txn.SetOption(kv.Priority, w.priority) - rowRecords, nextHandle, taskDone, err := w.fetchRowColVals(txn, handleRange) + rowRecords, nextKey, taskDone, err := w.fetchRowColVals(txn, handleRange) if err != nil { return errors.Trace(err) } - taskCtx.nextHandle = nextHandle + taskCtx.nextKey = nextKey taskCtx.done = taskDone warningsMap := make(map[errors.ErrorID]*terror.Error, len(rowRecords)) @@ -1380,7 +1502,7 @@ func adjustColumnInfoInModifyColumn( func checkAndApplyNewAutoRandomBits(job *model.Job, t *meta.Meta, tblInfo *model.TableInfo, newCol *model.ColumnInfo, oldName *model.CIStr, newAutoRandBits uint64) error { schemaID := job.SchemaID - newLayout := autoid.NewAutoRandomIDLayout(&newCol.FieldType, newAutoRandBits) + newLayout := autoid.NewShardIDLayout(&newCol.FieldType, newAutoRandBits) // GenAutoRandomID first to prevent concurrent update. _, err := t.GenAutoRandomID(schemaID, tblInfo.ID, 1) @@ -1408,16 +1530,25 @@ func checkAndApplyNewAutoRandomBits(job *model.Job, t *meta.Meta, tblInfo *model // checkForNullValue ensure there are no null values of the column of this table. // `isDataTruncated` indicates whether the new field and the old field type are the same, in order to be compatible with mysql. func checkForNullValue(ctx sessionctx.Context, isDataTruncated bool, schema, table, newCol model.CIStr, oldCols ...*model.ColumnInfo) error { - colsStr := "" + var buf strings.Builder + buf.WriteString("select 1 from %n.%n where ") + paramsList := make([]interface{}, 0, 2+len(oldCols)) + paramsList = append(paramsList, schema.L, table.L) for i, col := range oldCols { if i == 0 { - colsStr += "`" + col.Name.L + "` is null" + buf.WriteString("%n is null") + paramsList = append(paramsList, col.Name.L) } else { - colsStr += " or `" + col.Name.L + "` is null" + buf.WriteString(" or %n is null") + paramsList = append(paramsList, col.Name.L) } } - sql := fmt.Sprintf("select 1 from `%s`.`%s` where %s limit 1;", schema.L, table.L, colsStr) - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + buf.WriteString(" limit 1") + stmt, err := ctx.(sqlexec.RestrictedSQLExecutor).ParseWithParams(context.Background(), buf.String(), paramsList...) + if err != nil { + return errors.Trace(err) + } + rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedStmt(context.Background(), stmt) if err != nil { return errors.Trace(err) } @@ -1507,7 +1638,7 @@ func allocateColumnID(tblInfo *model.TableInfo) int64 { } func checkAddColumnTooManyColumns(colNum int) error { - if uint32(colNum) > atomic.LoadUint32(&TableColumnCountLimit) { + if uint32(colNum) > atomic.LoadUint32(&config.GetGlobalConfig().TableColumnCountLimit) { return errTooManyFields } return nil @@ -1569,10 +1700,21 @@ func generateOriginDefaultValue(col *model.ColumnInfo) (interface{}, error) { var err error odValue := col.GetDefaultValue() if odValue == nil && mysql.HasNotNullFlag(col.Flag) { - zeroVal := table.GetZeroValue(col) - odValue, err = zeroVal.ToString() - if err != nil { - return nil, errors.Trace(err) + switch col.Tp { + // Just use enum field's first element for OriginDefaultValue. + case mysql.TypeEnum: + defEnum, verr := types.ParseEnumValue(col.FieldType.Elems, 1) + if verr != nil { + return nil, errors.Trace(verr) + } + defVal := types.NewCollateMysqlEnumDatum(defEnum, col.Collate) + return defVal.ToString() + default: + zeroVal := table.GetZeroValue(col) + odValue, err = zeroVal.ToString() + if err != nil { + return nil, errors.Trace(err) + } } } diff --git a/ddl/column_change_test.go b/ddl/column_change_test.go index e8d5f3b0e74f5..94e8787a2bdc4 100644 --- a/ddl/column_change_test.go +++ b/ddl/column_change_test.go @@ -30,6 +30,8 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testutil" @@ -49,7 +51,7 @@ func (s *testColumnChangeSuite) SetUpSuite(c *C) { Name: model.NewCIStr("test_column_change"), ID: 1, } - err := kv.RunInNewTxn(s.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) return errors.Trace(t.CreateDatabase(s.dbInfo)) }) @@ -67,7 +69,10 @@ func (s *testColumnChangeSuite) TestColumnChange(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() // create table t (c1 int, c2 int); tblInfo := testTableInfo(c, d, "t", 2) ctx := testNewContext(d) @@ -160,7 +165,10 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C) WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ids, err := d.genGlobalIDs(1) tableID := ids[0] @@ -187,7 +195,7 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C) tc.onJobRunBefore = func(job *model.Job) { if atomic.LoadInt32(&errCount) > 0 && job.Type == model.ActionModifyColumn { atomic.AddInt32(&errCount, -1) - genAutoRandErr = kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + genAutoRandErr = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) _, err1 := t.GenAutoRandomID(s.dbInfo.ID, tableID, 1) return err1 @@ -210,7 +218,7 @@ func (s *testColumnChangeSuite) TestModifyAutoRandColumnWithMetaKeyChanged(c *C) c.Assert(genAutoRandErr, IsNil) testCheckJobDone(c, d, job, true) var newTbInfo *model.TableInfo - err = kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err error newTbInfo, err = t.GetTable(s.dbInfo.ID, tableID) @@ -297,6 +305,28 @@ func (s *testColumnChangeSuite) testColumnDrop(c *C, ctx sessionctx.Context, d * testDropColumn(c, ctx, d, s.dbInfo, tbl.Meta(), dropCol.Name.L, false) } +func seek(t table.PhysicalTable, ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) { + txn, err := ctx.Txn(true) + if err != nil { + return nil, false, err + } + recordPrefix := t.RecordPrefix() + seekKey := tablecodec.EncodeRowKeyWithHandle(t.GetPhysicalID(), h) + iter, err := txn.Iter(seekKey, recordPrefix.PrefixNext()) + if err != nil { + return nil, false, err + } + if !iter.Valid() || !iter.Key().HasPrefix(recordPrefix) { + // No more records in the table, skip to the end. + return nil, false, nil + } + handle, err := tablecodec.DecodeRowKey(iter.Key()) + if err != nil { + return nil, false, err + } + return handle, true, nil +} + func (s *testColumnChangeSuite) checkAddWriteOnly(ctx sessionctx.Context, d *ddl, deleteOnlyTable, writeOnlyTable table.Table, h kv.Handle) error { // WriteOnlyTable: insert t values (2, 3) err := ctx.NewTxn(context.Background()) @@ -317,7 +347,7 @@ func (s *testColumnChangeSuite) checkAddWriteOnly(ctx sessionctx.Context, d *ddl return errors.Trace(err) } // This test is for RowWithCols when column state is StateWriteOnly. - row, err := writeOnlyTable.RowWithCols(ctx, h, writeOnlyTable.WritableCols()) + row, err := tables.RowWithCols(writeOnlyTable, ctx, h, writeOnlyTable.WritableCols()) if err != nil { return errors.Trace(err) } @@ -332,7 +362,7 @@ func (s *testColumnChangeSuite) checkAddWriteOnly(ctx sessionctx.Context, d *ddl return errors.Trace(err) } // WriteOnlyTable: update t set c1 = 2 where c1 = 1 - h, _, err = writeOnlyTable.Seek(ctx, kv.IntHandle(0)) + h, _, err = seek(writeOnlyTable.(table.PhysicalTable), ctx, kv.IntHandle(0)) if err != nil { return errors.Trace(err) } @@ -387,7 +417,7 @@ func (s *testColumnChangeSuite) checkAddPublic(sctx sessionctx.Context, d *ddl, return errors.Trace(err) } // writeOnlyTable update t set c1 = 3 where c1 = 4 - oldRow, err := writeOnlyTable.RowWithCols(sctx, h, writeOnlyTable.WritableCols()) + oldRow, err := tables.RowWithCols(writeOnlyTable, sctx, h, writeOnlyTable.WritableCols()) if err != nil { return errors.Trace(err) } @@ -413,7 +443,7 @@ func (s *testColumnChangeSuite) checkAddPublic(sctx sessionctx.Context, d *ddl, func getCurrentTable(d *ddl, schemaID, tableID int64) (table.Table, error) { var tblInfo *model.TableInfo - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err error tblInfo, err = t.GetTable(schemaID, tableID) @@ -435,7 +465,7 @@ func getCurrentTable(d *ddl, schemaID, tableID int64) (table.Table, error) { func checkResult(ctx sessionctx.Context, t table.Table, cols []*table.Column, rows [][]interface{}) error { var gotRows [][]interface{} - err := t.IterRecords(ctx, t.FirstKey(), cols, func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err := tables.IterRecords(t, ctx, cols, func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { gotRows = append(gotRows, datumsToInterfaces(data)) return true, nil }) diff --git a/ddl/column_test.go b/ddl/column_test.go index 9c7679a12741b..2e287ac82d4d0 100644 --- a/ddl/column_test.go +++ b/ddl/column_test.go @@ -15,6 +15,7 @@ package ddl import ( "context" + "fmt" "reflect" "sync" @@ -53,7 +54,8 @@ func (s *testColumnSuite) SetUpSuite(c *C) { s.dbInfo = testSchemaInfo(c, d, "test_column") testCreateSchema(c, testNewContext(d), d, s.dbInfo) - d.Stop() + err := d.Stop() + c.Assert(err, IsNil) } func (s *testColumnSuite) TearDownSuite(c *C) { @@ -188,7 +190,10 @@ func (s *testColumnSuite) TestColumn(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() tblInfo := testTableInfo(c, d, "t1", 3) ctx := testNewContext(d) @@ -206,7 +211,7 @@ func (s *testColumnSuite) TestColumn(c *C) { c.Assert(err, IsNil) i := int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { c.Assert(data, HasLen, 3) c.Assert(data[0].GetInt64(), Equals, i) c.Assert(data[1].GetInt64(), Equals, 10*i) @@ -226,7 +231,7 @@ func (s *testColumnSuite) TestColumn(c *C) { c.Assert(table.FindCol(t.Cols(), "c4"), NotNil) i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { c.Assert(data, HasLen, 4) c.Assert(data[0].GetInt64(), Equals, i) @@ -243,7 +248,7 @@ func (s *testColumnSuite) TestColumn(c *C) { c.Assert(err, IsNil) err = ctx.NewTxn(context.Background()) c.Assert(err, IsNil) - values, err := t.RowWithCols(ctx, h, t.Cols()) + values, err := tables.RowWithCols(t, ctx, h, t.Cols()) c.Assert(err, IsNil) c.Assert(values, HasLen, 4) @@ -253,7 +258,7 @@ func (s *testColumnSuite) TestColumn(c *C) { testCheckJobDone(c, d, job, false) t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) - values, err = t.RowWithCols(ctx, h, t.Cols()) + values, err = tables.RowWithCols(t, ctx, h, t.Cols()) c.Assert(err, IsNil) c.Assert(values, HasLen, 3) @@ -263,7 +268,7 @@ func (s *testColumnSuite) TestColumn(c *C) { testCheckJobDone(c, d, job, true) t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) - values, err = t.RowWithCols(ctx, h, t.Cols()) + values, err = tables.RowWithCols(t, ctx, h, t.Cols()) c.Assert(err, IsNil) c.Assert(values, HasLen, 4) @@ -273,7 +278,7 @@ func (s *testColumnSuite) TestColumn(c *C) { testCheckJobDone(c, d, job, true) t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) - values, err = t.RowWithCols(ctx, h, t.Cols()) + values, err = tables.RowWithCols(t, ctx, h, t.Cols()) c.Assert(err, IsNil) c.Assert(values, HasLen, 5) @@ -298,7 +303,7 @@ func (s *testColumnSuite) TestColumn(c *C) { c.Assert(cols[5].Offset, Equals, 5) c.Assert(cols[5].Name.L, Equals, "c5") - values, err = t.RowWithCols(ctx, h, cols) + values, err = tables.RowWithCols(t, ctx, h, cols) c.Assert(err, IsNil) c.Assert(values, HasLen, 6) @@ -310,7 +315,7 @@ func (s *testColumnSuite) TestColumn(c *C) { t = testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) - values, err = t.RowWithCols(ctx, h, t.Cols()) + values, err = tables.RowWithCols(t, ctx, h, t.Cols()) c.Assert(err, IsNil) c.Assert(values, HasLen, 5) c.Assert(values[0].GetInt64(), Equals, int64(202)) @@ -343,10 +348,13 @@ func (s *testColumnSuite) checkColumnKVExist(ctx sessionctx.Context, t table.Tab } defer func() { if txn, err1 := ctx.Txn(true); err1 == nil { - txn.Commit(context.Background()) + err = txn.Commit(context.Background()) + if err != nil { + panic(err) + } } }() - key := t.RecordKey(handle) + key := tablecodec.EncodeRecordKey(t.RecordPrefix(), handle) txn, err := ctx.Txn(true) if err != nil { return errors.Trace(err) @@ -405,7 +413,7 @@ func (s *testColumnSuite) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl, return errors.Trace(err) } i := int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, row) { return false, errors.Errorf("%v not equal to %v", data, row) } @@ -441,7 +449,7 @@ func (s *testColumnSuite) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl, rows := [][]types.Datum{row, newRow} i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, rows[i]) { return false, errors.Errorf("%v not equal to %v", data, rows[i]) } @@ -474,7 +482,7 @@ func (s *testColumnSuite) checkDeleteOnlyColumn(ctx sessionctx.Context, d *ddl, return errors.Trace(err) } i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { i++ return true, nil }) @@ -507,7 +515,7 @@ func (s *testColumnSuite) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, t } i := int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, row) { return false, errors.Errorf("%v not equal to %v", data, row) } @@ -545,7 +553,7 @@ func (s *testColumnSuite) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, t rows := [][]types.Datum{row, newRow} i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, rows[i]) { return false, errors.Errorf("%v not equal to %v", data, rows[i]) } @@ -579,7 +587,7 @@ func (s *testColumnSuite) checkWriteOnlyColumn(ctx sessionctx.Context, d *ddl, t } i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { i++ return true, nil }) @@ -612,7 +620,7 @@ func (s *testColumnSuite) checkReorganizationColumn(ctx sessionctx.Context, d *d } i := int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, row) { return false, errors.Errorf("%v not equal to %v", data, row) } @@ -645,7 +653,7 @@ func (s *testColumnSuite) checkReorganizationColumn(ctx sessionctx.Context, d *d rows := [][]types.Datum{row, newRow} i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, rows[i]) { return false, errors.Errorf("%v not equal to %v", data, rows[i]) } @@ -680,7 +688,7 @@ func (s *testColumnSuite) checkReorganizationColumn(ctx sessionctx.Context, d *d } i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { i++ return true, nil }) @@ -709,7 +717,7 @@ func (s *testColumnSuite) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblI i := int64(0) updatedRow := append(oldRow, types.NewDatum(columnValue)) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, updatedRow) { return false, errors.Errorf("%v not equal to %v", data, updatedRow) } @@ -742,13 +750,16 @@ func (s *testColumnSuite) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblI rows := [][]types.Datum{updatedRow, newRow} i = int64(0) - t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, rows[i]) { return false, errors.Errorf("%v not equal to %v", data, rows[i]) } i++ return true, nil }) + if err != nil { + return errors.Trace(err) + } if i != 2 { return errors.Errorf("expect 2, got %v", i) } @@ -770,7 +781,7 @@ func (s *testColumnSuite) checkPublicColumn(ctx sessionctx.Context, d *ddl, tblI } i = int64(0) - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { if !reflect.DeepEqual(data, updatedRow) { return false, errors.Errorf("%v not equal to %v", data, updatedRow) } @@ -907,7 +918,8 @@ func (s *testColumnSuite) TestAddColumn(c *C) { err = txn.Commit(context.Background()) c.Assert(err, IsNil) - d.Stop() + err = d.Stop() + c.Assert(err, IsNil) } func (s *testColumnSuite) TestAddColumns(c *C) { @@ -991,7 +1003,8 @@ func (s *testColumnSuite) TestAddColumns(c *C) { job = testDropTable(c, ctx, d, s.dbInfo, tblInfo) testCheckJobDone(c, d, job, false) - d.Stop() + err = d.Stop() + c.Assert(err, IsNil) } func (s *testColumnSuite) TestDropColumn(c *C) { @@ -1066,7 +1079,8 @@ func (s *testColumnSuite) TestDropColumn(c *C) { err = txn.Commit(context.Background()) c.Assert(err, IsNil) - d.Stop() + err = d.Stop() + c.Assert(err, IsNil) } func (s *testColumnSuite) TestDropColumns(c *C) { @@ -1134,7 +1148,8 @@ func (s *testColumnSuite) TestDropColumns(c *C) { job = testDropTable(c, ctx, d, s.dbInfo, tblInfo) testCheckJobDone(c, d, job, false) - d.Stop() + err = d.Stop() + c.Assert(err, IsNil) } func (s *testColumnSuite) TestModifyColumn(c *C) { @@ -1145,26 +1160,29 @@ func (s *testColumnSuite) TestModifyColumn(c *C) { WithLease(testLease), ) ctx := testNewContext(d) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() tests := []struct { origin string to string err error }{ {"int", "bigint", nil}, - {"int", "int unsigned", errUnsupportedModifyColumn.GenWithStackByArgs("length 10 is less than origin 11, and tidb_enable_change_column_type is false")}, + {"int", "int unsigned", errUnsupportedModifyColumn.GenWithStackByArgs("can't change unsigned integer to signed or vice versa, and tidb_enable_change_column_type is false")}, {"varchar(10)", "text", nil}, {"varbinary(10)", "blob", nil}, {"text", "blob", errUnsupportedModifyCharset.GenWithStackByArgs("charset from utf8mb4 to binary")}, - {"varchar(10)", "varchar(8)", errUnsupportedModifyColumn.GenWithStackByArgs("length 8 is less than origin 10")}, + {"varchar(10)", "varchar(8)", errUnsupportedModifyColumn.GenWithStackByArgs("length 8 is less than origin 10, and tidb_enable_change_column_type is false")}, {"varchar(10)", "varchar(11)", nil}, {"varchar(10) character set utf8 collate utf8_bin", "varchar(10) character set utf8", nil}, {"decimal(2,1)", "decimal(3,2)", errUnsupportedModifyColumn.GenWithStackByArgs("decimal change from decimal(2, 1) to decimal(3, 2), and tidb_enable_change_column_type is false")}, {"decimal(2,1)", "decimal(2,2)", errUnsupportedModifyColumn.GenWithStackByArgs("decimal change from decimal(2, 1) to decimal(2, 2), and tidb_enable_change_column_type is false")}, {"decimal(2,1)", "decimal(2,1)", nil}, - {"decimal(2,1)", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(2,1)")}, - {"decimal", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(11,0)")}, - {"decimal(2,1)", "bigint", errUnsupportedModifyColumn.GenWithStackByArgs("type bigint(20) not match origin decimal(2,1)")}, + {"decimal(2,1)", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(2,1), and tidb_enable_change_column_type is false")}, + {"decimal", "int", errUnsupportedModifyColumn.GenWithStackByArgs("type int(11) not match origin decimal(10,0), and tidb_enable_change_column_type is false")}, + {"decimal(2,1)", "bigint", errUnsupportedModifyColumn.GenWithStackByArgs("type bigint(20) not match origin decimal(2,1), and tidb_enable_change_column_type is false")}, } for _, tt := range tests { ftA := s.colDefStrToFieldType(c, tt.origin) @@ -1200,3 +1218,52 @@ func (s *testColumnSuite) TestFieldCase(c *C) { err := checkDuplicateColumn(colObjects) c.Assert(err.Error(), Equals, infoschema.ErrColumnExists.GenWithStackByArgs("Field").Error()) } + +func (s *testColumnSuite) TestAutoConvertBlobTypeByLength(c *C) { + d := testNewDDLAndStart( + context.Background(), + c, + WithStore(s.store), + WithLease(testLease), + ) + // Close the customized ddl(worker goroutine included) after the test is finished, otherwise, it will + // cause go routine in TiDB leak test. + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() + + sql := fmt.Sprintf("create table t0(c0 Blob(%d), c1 Blob(%d), c2 Blob(%d), c3 Blob(%d))", + tinyBlobMaxLength-1, blobMaxLength-1, mediumBlobMaxLength-1, longBlobMaxLength-1) + stmt, err := parser.New().ParseOneStmt(sql, "", "") + c.Assert(err, IsNil) + tblInfo, err := BuildTableInfoFromAST(stmt.(*ast.CreateTableStmt)) + c.Assert(err, IsNil) + genIDs, err := d.genGlobalIDs(1) + c.Assert(err, IsNil) + tblInfo.ID = genIDs[0] + + ctx := testNewContext(d) + err = ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) + testCreateTable(c, ctx, d, s.dbInfo, tblInfo) + t := testGetTable(c, d, s.dbInfo.ID, tblInfo.ID) + + c.Assert(t.Cols()[0].Tp, Equals, mysql.TypeTinyBlob) + c.Assert(t.Cols()[0].Flen, Equals, tinyBlobMaxLength) + c.Assert(t.Cols()[1].Tp, Equals, mysql.TypeBlob) + c.Assert(t.Cols()[1].Flen, Equals, blobMaxLength) + c.Assert(t.Cols()[2].Tp, Equals, mysql.TypeMediumBlob) + c.Assert(t.Cols()[2].Flen, Equals, mediumBlobMaxLength) + c.Assert(t.Cols()[3].Tp, Equals, mysql.TypeLongBlob) + c.Assert(t.Cols()[3].Flen, Equals, longBlobMaxLength) + + oldRow := types.MakeDatums([]byte("a"), []byte("a"), []byte("a"), []byte("a")) + _, err = t.AddRecord(ctx, oldRow) + c.Assert(err, IsNil) + + txn, err := ctx.Txn(true) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) +} diff --git a/ddl/column_type_change_test.go b/ddl/column_type_change_test.go index 0fb8b91071298..fb82096dd3755 100644 --- a/ddl/column_type_change_test.go +++ b/ddl/column_type_change_test.go @@ -14,10 +14,13 @@ package ddl_test import ( + "context" "errors" "time" . "github.com/pingcap/check" + errors2 "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" parser_mysql "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -25,20 +28,23 @@ import ( "github.com/pingcap/tidb/domain" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/testkit" ) var _ = SerialSuites(&testColumnTypeChangeSuite{}) type testColumnTypeChangeSuite struct { - store kv.Storage - dbInfo *model.DBInfo - dom *domain.Domain + store kv.Storage + dom *domain.Domain } func (s *testColumnTypeChangeSuite) SetUpSuite(c *C) { @@ -283,8 +289,1487 @@ var mockTerrorMap = make(map[string]*terror.Error) func init() { // Since terror new action will cause data race with other test suite (getTerrorCode) in parallel, we init it all here. - mockTerrorMap[model.StateNone.String()] = terror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateNone.String()) - mockTerrorMap[model.StateDeleteOnly.String()] = terror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateDeleteOnly.String()) - mockTerrorMap[model.StateWriteOnly.String()] = terror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateWriteOnly.String()) - mockTerrorMap[model.StateWriteReorganization.String()] = terror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateWriteReorganization.String()) + mockTerrorMap[model.StateNone.String()] = dbterror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateNone.String()) + mockTerrorMap[model.StateDeleteOnly.String()] = dbterror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateDeleteOnly.String()) + mockTerrorMap[model.StateWriteOnly.String()] = dbterror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateWriteOnly.String()) + mockTerrorMap[model.StateWriteReorganization.String()] = dbterror.ClassDDL.New(1, "MockRollingBackInCallBack-"+model.StateWriteReorganization.String()) +} + +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromIntegerToOthers(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + }() + + prepare := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a tinyint, b smallint, c mediumint, d int, e bigint, f bigint)") + tk.MustExec("insert into t values(1, 11, 111, 1111, 11111, 111111)") + } + prepareForEnumSet := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a tinyint, b smallint, c mediumint, d int, e bigint)") + tk.MustExec("insert into t values(1, 1, 1, 11111, 11111)") + } + + // integer to string + prepare(tk) + tk.MustExec("alter table t modify a varchar(10)") + modifiedColumn := getModifyColumn(c, tk.Se, "test", "t", "a", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeVarchar) + tk.MustQuery("select a from t").Check(testkit.Rows("1")) + + tk.MustExec("alter table t modify b char(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "b", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeString) + tk.MustQuery("select b from t").Check(testkit.Rows("11")) + + tk.MustExec("alter table t modify c binary(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "c", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeString) + tk.MustQuery("select c from t").Check(testkit.Rows("111\x00\x00\x00\x00\x00\x00\x00")) + + tk.MustExec("alter table t modify d varbinary(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "d", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeVarchar) + tk.MustQuery("select d from t").Check(testkit.Rows("1111")) + + tk.MustExec("alter table t modify e blob(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "e", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeTinyBlob) + tk.MustQuery("select e from t").Check(testkit.Rows("11111")) + + tk.MustExec("alter table t modify f text(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "f", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeTinyBlob) + tk.MustQuery("select f from t").Check(testkit.Rows("111111")) + + // integer to decimal + prepare(tk) + tk.MustExec("alter table t modify a decimal(2,1)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "a", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeNewDecimal) + tk.MustQuery("select a from t").Check(testkit.Rows("1.0")) + + // integer to year + // For year(2), MySQL converts values in the ranges '0' to '69' and '70' to '99' to YEAR values in the ranges 2000 to 2069 and 1970 to 1999. + tk.MustExec("alter table t modify b year") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "b", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeYear) + tk.MustQuery("select b from t").Check(testkit.Rows("2011")) + + // integer to time + tk.MustExec("alter table t modify c time") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "c", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeDuration) // mysql.TypeTime has rename to TypeDuration. + tk.MustQuery("select c from t").Check(testkit.Rows("00:01:11")) + + // integer to date (mysql will throw `Incorrect date value: '1111' for column 'd' at row 1` error) + tk.MustExec("alter table t modify d date") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "d", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeDate) + tk.MustQuery("select d from t").Check(testkit.Rows("2000-11-11")) // the given number will be left-forward used. + + // integer to timestamp (according to what timezone you have set) + tk.MustExec("alter table t modify e timestamp") + tk.MustExec("set @@session.time_zone=UTC") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "e", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeTimestamp) + tk.MustQuery("select e from t").Check(testkit.Rows("2001-11-11 00:00:00")) // the given number will be left-forward used. + + // integer to datetime + tk.MustExec("alter table t modify f datetime") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "f", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeDatetime) + tk.MustQuery("select f from t").Check(testkit.Rows("2011-11-11 00:00:00")) // the given number will be left-forward used. + + // integer to floating-point values + prepare(tk) + tk.MustExec("alter table t modify a float") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "a", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeFloat) + tk.MustQuery("select a from t").Check(testkit.Rows("1")) + + tk.MustExec("alter table t modify b double") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "b", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeDouble) + tk.MustQuery("select b from t").Check(testkit.Rows("11")) + + // integer to bit + tk.MustExec("alter table t modify c bit(10)") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "c", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeBit) + // 111 will be stored ad 0x00,0110,1111 = 0x6F, which will be shown as ASCII('o')=111 as well. + tk.MustQuery("select c from t").Check(testkit.Rows("\x00o")) + + // integer to json + tk.MustExec("alter table t modify d json") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "d", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeJSON) + tk.MustQuery("select d from t").Check(testkit.Rows("1111")) + + // integer to enum + prepareForEnumSet(tk) + // TiDB take integer as the enum element offset to cast. + tk.MustExec("alter table t modify a enum(\"a\", \"b\")") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "a", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeEnum) + tk.MustQuery("select a from t").Check(testkit.Rows("a")) + + // TiDB take integer as the set element offset to cast. + tk.MustExec("alter table t modify b set(\"a\", \"b\")") + modifiedColumn = getModifyColumn(c, tk.Se, "test", "t", "b", false) + c.Assert(modifiedColumn, NotNil) + c.Assert(modifiedColumn.Tp, Equals, parser_mysql.TypeSet) + tk.MustQuery("select b from t").Check(testkit.Rows("a")) + + // TiDB can't take integer as the enum element string to cast, while the MySQL can. + tk.MustGetErrCode("alter table t modify d enum(\"11111\", \"22222\")", mysql.WarnDataTruncated) + + // TiDB can't take integer as the set element string to cast, while the MySQL can. + tk.MustGetErrCode("alter table t modify e set(\"11111\", \"22222\")", mysql.WarnDataTruncated) +} + +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromStringToOthers(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Set time zone to UTC. + originalTz := tk.Se.GetSessionVars().TimeZone + tk.Se.GetSessionVars().TimeZone = time.UTC + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + tk.Se.GetSessionVars().TimeZone = originalTz + }() + + // Init string date type table. + reset := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec(` + create table t ( + c char(8), + vc varchar(8), + bny binary(8), + vbny varbinary(8), + bb blob, + txt text, + e enum('123', '2020-07-15 18:32:17.888', 'str', '{"k1": "value"}'), + s set('123', '2020-07-15 18:32:17.888', 'str', '{"k1": "value"}') + ) + `) + } + + // To numeric data types. + // tinyint + reset(tk) + tk.MustExec("insert into t values ('123', '123', '123', '123', '123', '123', '123', '123')") + tk.MustExec("alter table t modify c tinyint") + tk.MustExec("alter table t modify vc tinyint") + tk.MustExec("alter table t modify bny tinyint") + tk.MustExec("alter table t modify vbny tinyint") + tk.MustExec("alter table t modify bb tinyint") + tk.MustExec("alter table t modify txt tinyint") + tk.MustExec("alter table t modify e tinyint") + tk.MustExec("alter table t modify s tinyint") + tk.MustQuery("select * from t").Check(testkit.Rows("123 123 123 123 123 123 1 1")) + // int + reset(tk) + tk.MustExec("insert into t values ('17305', '17305', '17305', '17305', '17305', '17305', '123', '123')") + tk.MustExec("alter table t modify c int") + tk.MustExec("alter table t modify vc int") + tk.MustExec("alter table t modify bny int") + tk.MustExec("alter table t modify vbny int") + tk.MustExec("alter table t modify bb int") + tk.MustExec("alter table t modify txt int") + tk.MustExec("alter table t modify e int") + tk.MustExec("alter table t modify s int") + tk.MustQuery("select * from t").Check(testkit.Rows("17305 17305 17305 17305 17305 17305 1 1")) + // bigint + reset(tk) + tk.MustExec("insert into t values ('17305867', '17305867', '17305867', '17305867', '17305867', '17305867', '123', '123')") + tk.MustExec("alter table t modify c bigint") + tk.MustExec("alter table t modify vc bigint") + tk.MustExec("alter table t modify bny bigint") + tk.MustExec("alter table t modify vbny bigint") + tk.MustExec("alter table t modify bb bigint") + tk.MustExec("alter table t modify txt bigint") + tk.MustExec("alter table t modify e bigint") + tk.MustExec("alter table t modify s bigint") + tk.MustQuery("select * from t").Check(testkit.Rows("17305867 17305867 17305867 17305867 17305867 17305867 1 1")) + // bit + reset(tk) + tk.MustExec("insert into t values ('1', '1', '1', '1', '1', '1', '123', '123')") + tk.MustGetErrCode("alter table t modify c bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify vc bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify bny bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify vbny bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify bb bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify txt bit", mysql.ErrUnsupportedDDLOperation) + tk.MustExec("alter table t modify e bit") + tk.MustExec("alter table t modify s bit") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1\x00\x00\x00\x00\x00\x00\x00 1 1 1 \x01 \x01")) + // decimal + reset(tk) + tk.MustExec("insert into t values ('123.45', '123.45', '123.45', '123.45', '123.45', '123.45', '123', '123')") + tk.MustExec("alter table t modify c decimal(7, 4)") + tk.MustExec("alter table t modify vc decimal(7, 4)") + tk.MustExec("alter table t modify bny decimal(7, 4)") + tk.MustExec("alter table t modify vbny decimal(7, 4)") + tk.MustExec("alter table t modify bb decimal(7, 4)") + tk.MustExec("alter table t modify txt decimal(7, 4)") + tk.MustExec("alter table t modify e decimal(7, 4)") + tk.MustExec("alter table t modify s decimal(7, 4)") + tk.MustQuery("select * from t").Check(testkit.Rows("123.4500 123.4500 123.4500 123.4500 123.4500 123.4500 1.0000 1.0000")) + // double + reset(tk) + tk.MustExec("insert into t values ('123.45', '123.45', '123.45', '123.45', '123.45', '123.45', '123', '123')") + tk.MustExec("alter table t modify c double(7, 4)") + tk.MustExec("alter table t modify vc double(7, 4)") + tk.MustExec("alter table t modify bny double(7, 4)") + tk.MustExec("alter table t modify vbny double(7, 4)") + tk.MustExec("alter table t modify bb double(7, 4)") + tk.MustExec("alter table t modify txt double(7, 4)") + tk.MustExec("alter table t modify e double(7, 4)") + tk.MustExec("alter table t modify s double(7, 4)") + tk.MustQuery("select * from t").Check(testkit.Rows("123.45 123.45 123.45 123.45 123.45 123.45 1 1")) + + // To date and time data types. + // date + reset(tk) + tk.MustExec("insert into t values ('20200826', '2008261', '20200826', '200826', '2020-08-26', '08-26 19:35:41', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888')") + tk.MustExec("alter table t modify c date") + tk.MustExec("alter table t modify vc date") + tk.MustExec("alter table t modify bny date") + tk.MustExec("alter table t modify vbny date") + tk.MustExec("alter table t modify bb date") + // Alter text '08-26 19:35:41' to date will error. (same as mysql does) + tk.MustGetErrCode("alter table t modify txt date", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify e date", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify s date", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-08-26 2020-08-26 2020-08-26 2020-08-26 2020-08-26 08-26 19:35:41 2020-07-15 18:32:17.888 2020-07-15 18:32:17.888")) + // time + reset(tk) + tk.MustExec("insert into t values ('19:35:41', '19:35:41', '19:35:41', '19:35:41', '19:35:41.45678', '19:35:41.45678', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888')") + tk.MustExec("alter table t modify c time") + tk.MustExec("alter table t modify vc time") + tk.MustExec("alter table t modify bny time") + tk.MustExec("alter table t modify vbny time") + tk.MustExec("alter table t modify bb time") + tk.MustExec("alter table t modify txt time") + tk.MustGetErrCode("alter table t modify e time", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify s time", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("19:35:41 19:35:41 19:35:41 19:35:41 19:35:41 19:35:41 2020-07-15 18:32:17.888 2020-07-15 18:32:17.888")) + // datetime + reset(tk) + tk.MustExec("alter table t modify c char(23)") + tk.MustExec("alter table t modify vc varchar(23)") + tk.MustExec("alter table t modify bny binary(23)") + tk.MustExec("alter table t modify vbny varbinary(23)") + tk.MustExec("insert into t values ('2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888')") + tk.MustExec("alter table t modify c datetime") + tk.MustExec("alter table t modify vc datetime") + tk.MustExec("alter table t modify bny datetime") + tk.MustExec("alter table t modify vbny datetime") + tk.MustExec("alter table t modify bb datetime") + tk.MustExec("alter table t modify txt datetime") + tk.MustGetErrCode("alter table t modify e datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify s datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:17.888 2020-07-15 18:32:17.888")) + // timestamp + reset(tk) + tk.MustExec("alter table t modify c char(23)") + tk.MustExec("alter table t modify vc varchar(23)") + tk.MustExec("alter table t modify bny binary(23)") + tk.MustExec("alter table t modify vbny varbinary(23)") + tk.MustExec("insert into t values ('2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888')") + tk.MustExec("alter table t modify c timestamp") + tk.MustExec("alter table t modify vc timestamp") + tk.MustExec("alter table t modify bny timestamp") + tk.MustExec("alter table t modify vbny timestamp") + tk.MustExec("alter table t modify bb timestamp") + tk.MustExec("alter table t modify txt timestamp") + tk.MustGetErrCode("alter table t modify e timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify s timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:18 2020-07-15 18:32:17.888 2020-07-15 18:32:17.888")) + // year + reset(tk) + tk.MustExec("insert into t values ('2020', '91', '2', '2020', '20', '99', '2020-07-15 18:32:17.888', '2020-07-15 18:32:17.888')") + tk.MustExec("alter table t modify c year") + tk.MustExec("alter table t modify vc year") + tk.MustExec("alter table t modify bny year") + tk.MustExec("alter table t modify vbny year") + tk.MustExec("alter table t modify bb year") + tk.MustExec("alter table t modify txt year") + tk.MustExec("alter table t modify e year") + tk.MustExec("alter table t modify s year") + tk.MustQuery("select * from t").Check(testkit.Rows("2020 1991 2002 2020 2020 1999 2002 2002")) + + // To json data type. + reset(tk) + tk.MustExec("alter table t modify c char(15)") + tk.MustExec("alter table t modify vc varchar(15)") + tk.MustExec("alter table t modify bny binary(15)") + tk.MustExec("alter table t modify vbny varbinary(15)") + tk.MustExec("insert into t values ('{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}', '{\"k1\": \"value\"}')") + tk.MustExec("alter table t modify c json") + tk.MustExec("alter table t modify vc json") + tk.MustExec("alter table t modify bny json") + tk.MustExec("alter table t modify vbny json") + tk.MustExec("alter table t modify bb json") + tk.MustExec("alter table t modify txt json") + tk.MustExec("alter table t modify e json") + tk.MustExec("alter table t modify s json") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"k1\": \"value\"} {\"k1\": \"value\"} {\"k1\": \"value\"} {\"k1\": \"value\"} {\"k1\": \"value\"} {\"k1\": \"value\"} \"{\\\"k1\\\": \\\"value\\\"}\" \"{\\\"k1\\\": \\\"value\\\"}\"")) + + reset(tk) + tk.MustExec("insert into t values ('123x', 'x123', 'abc', 'datetime', 'timestamp', 'date', '123', '123')") + tk.MustGetErrCode("alter table t modify c int", mysql.ErrTruncatedWrongValue) + + tk.MustGetErrCode("alter table t modify vc smallint", mysql.ErrTruncatedWrongValue) + + tk.MustGetErrCode("alter table t modify bny bigint", mysql.ErrTruncatedWrongValue) + + tk.MustGetErrCode("alter table t modify vbny datetime", mysql.ErrTruncatedWrongValue) + + tk.MustGetErrCode("alter table t modify bb timestamp", mysql.ErrTruncatedWrongValue) + + tk.MustGetErrCode("alter table t modify txt date", mysql.ErrTruncatedWrongValue) + + reset(tk) + tk.MustExec("alter table t modify vc varchar(20)") + tk.MustExec("insert into t(c, vc) values ('1x', '20200915110836')") + tk.MustGetErrCode("alter table t modify c year", mysql.ErrTruncatedWrongValue) + + // Special cases about different behavior between TiDB and MySQL. + // MySQL will get warning but TiDB not. + // MySQL will get "Warning 1292 Incorrect time value: '20200915110836' for column 'vc'" + tk.MustExec("alter table t modify vc time") + tk.MustQuery("select vc from t").Check(testkit.Rows("11:08:36")) + + // Both error but different error message. + // MySQL will get "ERROR 3140 (22032): Invalid JSON text: "The document root must not be followed by other values." at position 1 in value for column '#sql-5b_42.c'." error. + reset(tk) + tk.MustExec("alter table t modify c char(15)") + tk.MustExec("insert into t(c) values ('{\"k1\": \"value\"')") + tk.MustGetErrCode("alter table t modify c json", mysql.ErrInvalidJSONText) + + // MySQL will get "ERROR 1366 (HY000): Incorrect DECIMAL value: '0' for column '' at row -1" error. + tk.MustExec("insert into t(vc) values ('abc')") + tk.MustGetErrCode("alter table t modify vc decimal(5,3)", mysql.ErrBadNumber) +} + +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromNumericToOthers(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Set time zone to UTC. + originalTz := tk.Se.GetSessionVars().TimeZone + tk.Se.GetSessionVars().TimeZone = time.UTC + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + tk.Se.GetSessionVars().TimeZone = originalTz + }() + + // Init string date type table. + reset := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec(` + create table t ( + d decimal(13, 7), + n numeric(5, 2), + r real(20, 12), + db real(32, 11), + f32 float(23), + f64 double, + b bit(5) + ) + `) + } + + // To integer data types. + // tinyint + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustGetErrCode("alter table t modify d tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify n tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify r tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify db tinyint", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify f32 tinyint") + tk.MustGetErrCode("alter table t modify f64 tinyint", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify b tinyint") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111 -222222222222.22223 21")) + // int + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d int") + tk.MustExec("alter table t modify n int") + tk.MustExec("alter table t modify r int") + tk.MustExec("alter table t modify db int") + tk.MustExec("alter table t modify f32 int") + tk.MustGetErrCode("alter table t modify f64 int", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify b int") + tk.MustQuery("select * from t").Check(testkit.Rows("-258 333 2000000 323232323 -111 -222222222222.22223 21")) + // bigint + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d bigint") + tk.MustExec("alter table t modify n bigint") + tk.MustExec("alter table t modify r bigint") + tk.MustExec("alter table t modify db bigint") + tk.MustExec("alter table t modify f32 bigint") + tk.MustExec("alter table t modify f64 bigint") + tk.MustExec("alter table t modify b bigint") + tk.MustQuery("select * from t").Check(testkit.Rows("-258 333 2000000 323232323 -111 -222222222222 21")) + // unsigned bigint + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + // MySQL will get "ERROR 1264 (22001): Data truncation: Out of range value for column 'd' at row 1". + tk.MustGetErrCode("alter table t modify d bigint unsigned", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify n bigint unsigned") + tk.MustExec("alter table t modify r bigint unsigned") + tk.MustExec("alter table t modify db bigint unsigned") + // MySQL will get "ERROR 1264 (22001): Data truncation: Out of range value for column 'f32' at row 1". + tk.MustGetErrCode("alter table t modify f32 bigint unsigned", mysql.ErrDataOutOfRange) + // MySQL will get "ERROR 1264 (22001): Data truncation: Out of range value for column 'f64' at row 1". + tk.MustGetErrCode("alter table t modify f64 bigint unsigned", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify b int") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333 2000000 323232323 -111.111115 -222222222222.22223 21")) + + // To string data types. + // char + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d char(20)") + tk.MustExec("alter table t modify n char(20)") + tk.MustExec("alter table t modify r char(20)") + // MySQL will get "ERROR 1406 (22001): Data truncation: Data too long for column 'db' at row 1". + tk.MustExec("alter table t modify db char(20)") + // MySQL will get "-111.111" rather than "-111.111115" at TiDB. + tk.MustExec("alter table t modify f32 char(20)") + // MySQL will get "ERROR 1406 (22001): Data truncation: Data too long for column 'f64' at row 1". + tk.MustExec("alter table t modify f64 char(20)") + tk.MustExec("alter table t modify b char(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15")) + + // varchar + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d varchar(30)") + tk.MustExec("alter table t modify n varchar(30)") + tk.MustExec("alter table t modify r varchar(30)") + tk.MustExec("alter table t modify db varchar(30)") + // MySQL will get "-111.111" rather than "-111.111115" at TiDB. + tk.MustExec("alter table t modify f32 varchar(30)") + // MySQL will get "ERROR 1406 (22001): Data truncation: Data too long for column 'f64' at row 1". + tk.MustExec("alter table t modify f64 varchar(30)") + tk.MustExec("alter table t modify b varchar(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15")) + + // binary + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustGetErrCode("alter table t modify d binary(10)", mysql.ErrDataTooLong) + tk.MustExec("alter table t modify n binary(10)") + tk.MustGetErrCode("alter table t modify r binary(10)", mysql.ErrDataTooLong) + tk.MustGetErrCode("alter table t modify db binary(10)", mysql.ErrDataTooLong) + // MySQL will run with no error. + tk.MustGetErrCode("alter table t modify f32 binary(10)", mysql.ErrDataTooLong) + tk.MustGetErrCode("alter table t modify f64 binary(10)", mysql.ErrDataTooLong) + tk.MustExec("alter table t modify b binary(10)") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33\x00\x00\x00\x00 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15\x00\x00\x00\x00\x00\x00\x00\x00\x00")) + + // varbinary + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d varbinary(30)") + tk.MustExec("alter table t modify n varbinary(30)") + tk.MustExec("alter table t modify r varbinary(30)") + tk.MustExec("alter table t modify db varbinary(30)") + // MySQL will get "-111.111" rather than "-111.111115" at TiDB. + tk.MustExec("alter table t modify f32 varbinary(30)") + // MySQL will get "ERROR 1406 (22001): Data truncation: Data too long for column 'f64' at row 1". + tk.MustExec("alter table t modify f64 varbinary(30)") + tk.MustExec("alter table t modify b varbinary(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15")) + + // blob + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d blob") + tk.MustExec("alter table t modify n blob") + tk.MustExec("alter table t modify r blob") + tk.MustExec("alter table t modify db blob") + // MySQL will get "-111.111" rather than "-111.111115" at TiDB. + tk.MustExec("alter table t modify f32 blob") + tk.MustExec("alter table t modify f64 blob") + tk.MustExec("alter table t modify b blob") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15")) + + // text + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d text") + tk.MustExec("alter table t modify n text") + tk.MustExec("alter table t modify r text") + tk.MustExec("alter table t modify db text") + // MySQL will get "-111.111" rather than "-111.111115" at TiDB. + tk.MustExec("alter table t modify f32 text") + tk.MustExec("alter table t modify f64 text") + tk.MustExec("alter table t modify b text") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111115 -222222222222.22223 \x15")) + + // enum + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.111, -222222222222.222222222222222, b'10101')") + tk.MustGetErrCode("alter table t modify d enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify n enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify r enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify db enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f32 enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify b enum('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111 -222222222222.22223 \x15")) + + // set + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.111, -222222222222.222222222222222, b'10101')") + tk.MustGetErrCode("alter table t modify d set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify n set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify r set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify db set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f32 set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify b set('-258.12345', '333.33', '2000000.20000002', '323232323.3232323232', '-111.111', '-222222222222.222222222222222', b'10101')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("-258.1234500 333.33 2000000.20000002 323232323.32323235 -111.111 -222222222222.22223 \x15")) + + // To date and time data types. + // datetime + reset(tk) + tk.MustExec("insert into t values (200805.11, 307.333, 20200805.11111111, 20200805111307.11111111, 200805111307.11111111, 20200805111307.11111111, b'10101')") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect datetime value: '200805.1100000' for column 'd' at row 1". + tk.MustExec("alter table t modify d datetime") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect datetime value: '307.33' for column 'n' at row 1". + tk.MustExec("alter table t modify n datetime") + tk.MustGetErrCode("alter table t modify r datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify db datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f32 datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify b datetime", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-08-05 00:00:00 2000-03-07 00:00:00 20200805.11111111 20200805111307.11 200805100000 20200805111307.11 \x15")) + // time + reset(tk) + tk.MustExec("insert into t values (200805.11, 307.333, 20200805.11111111, 20200805111307.11111111, 200805111307.11111111, 20200805111307.11111111, b'10101')") + tk.MustExec("alter table t modify d time") + tk.MustExec("alter table t modify n time") + tk.MustGetErrCode("alter table t modify r time", mysql.ErrTruncatedWrongValue) + tk.MustExec("alter table t modify db time") + tk.MustExec("alter table t modify f32 time") + tk.MustExec("alter table t modify f64 time") + tk.MustGetErrCode("alter table t modify b time", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("20:08:05 00:03:07 20200805.11111111 11:13:07 10:00:00 11:13:07 \x15")) + // date + reset(tk) + tk.MustExec("insert into t values (200805.11, 307.333, 20200805.11111111, 20200805111307.11111111, 200805111307.11111111, 20200805111307.11111111, b'10101')") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect date value: '200805.1100000' for column 'd' at row 1". + tk.MustExec("alter table t modify d date") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect date value: '307.33' for column 'n' at row 1". + tk.MustExec("alter table t modify n date") + tk.MustGetErrCode("alter table t modify r date", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify db date", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f32 date", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 date", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify b date", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-08-05 2000-03-07 20200805.11111111 20200805111307.11 200805100000 20200805111307.11 \x15")) + // timestamp + reset(tk) + tk.MustExec("insert into t values (200805.11, 307.333, 20200805.11111111, 20200805111307.11111111, 200805111307.11111111, 20200805111307.11111111, b'10101')") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect datetime value: '200805.1100000' for column 'd' at row 1". + tk.MustExec("alter table t modify d timestamp") + // MySQL will get "ERROR 1292 (22001) Data truncation: Incorrect datetime value: '307.33' for column 'n' at row 1". + tk.MustExec("alter table t modify n timestamp") + tk.MustGetErrCode("alter table t modify r timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify db timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f32 timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify b timestamp", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-08-05 00:00:00 2000-03-07 00:00:00 20200805.11111111 20200805111307.11 200805100000 20200805111307.11 \x15")) + // year + reset(tk) + tk.MustExec("insert into t values (200805.11, 307.333, 2.55555, 98.1111111, 2154.00001, 20200805111307.11111111, b'10101')") + tk.MustGetErrMsg("alter table t modify d year", "[types:8033]Invalid year value for column 'd', value is 'KindMysqlDecimal 200805.1100000'") + tk.MustGetErrCode("alter table t modify n year", mysql.ErrInvalidYear) + // MySQL will get "ERROR 1264 (22001) Data truncation: Out of range value for column 'r' at row 1". + tk.MustExec("alter table t modify r year") + // MySQL will get "ERROR 1264 (22001) Data truncation: Out of range value for column 'db' at row 1". + tk.MustExec("alter table t modify db year") + // MySQL will get "ERROR 1264 (22001) Data truncation: Out of range value for column 'f32' at row 1". + tk.MustExec("alter table t modify f32 year") + tk.MustGetErrMsg("alter table t modify f64 year", "[types:8033]Invalid year value for column 'f64', value is 'KindFloat64 2.020080511130711e+13'") + tk.MustExec("alter table t modify b year") + tk.MustQuery("select * from t").Check(testkit.Rows("200805.1100000 307.33 2003 1998 2154 20200805111307.11 2021")) + + // To json data type. + reset(tk) + tk.MustExec("insert into t values (-258.12345, 333.33, 2000000.20000002, 323232323.3232323232, -111.11111111, -222222222222.222222222222222, b'10101')") + tk.MustExec("alter table t modify d json") + tk.MustExec("alter table t modify n json") + tk.MustExec("alter table t modify r json") + tk.MustExec("alter table t modify db json") + tk.MustExec("alter table t modify f32 json") + tk.MustExec("alter table t modify f64 json") + tk.MustExec("alter table t modify b json") + tk.MustQuery("select * from t").Check(testkit.Rows("-258.12345 333.33 2000000.20000002 323232323.32323235 -111.11111450195312 -222222222222.22223 \"\\u0015\"")) +} + +// Test issue #20529. +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeIgnoreDisplayLength(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + }() + + originalHook := s.dom.DDL().GetHook() + defer s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) + + var assertResult bool + assertHasAlterWriteReorg := func(tbl table.Table) { + // Restore the assert result to false. + assertResult = false + hook := &ddl.TestDDLCallback{} + hook.OnJobRunBeforeExported = func(job *model.Job) { + if tbl.Meta().ID != job.TableID { + return + } + if job.SchemaState == model.StateWriteReorganization { + assertResult = true + } + } + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + } + + // Change int to tinyint. + // Although display length is increased, the default flen is decreased, reorg is needed. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int(1))") + tbl := testGetTableByName(c, tk.Se, "test", "t") + assertHasAlterWriteReorg(tbl) + tk.MustExec("alter table t modify column a tinyint(3)") + c.Assert(assertResult, Equals, true) + + // Change tinyint to tinyint + // Although display length is decreased, default flen is the same, reorg is not needed. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a tinyint(3))") + tbl = testGetTableByName(c, tk.Se, "test", "t") + assertHasAlterWriteReorg(tbl) + tk.MustExec("alter table t modify column a tinyint(1)") + c.Assert(assertResult, Equals, false) + tk.MustExec("drop table if exists t") +} + +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromDateTimeTypeToOthers(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Set time zone to UTC. + originalTz := tk.Se.GetSessionVars().TimeZone + tk.Se.GetSessionVars().TimeZone = time.UTC + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + tk.Se.GetSessionVars().TimeZone = originalTz + }() + + // Init string date type table. + reset := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec(` + create table t ( + d date, + t time(3), + dt datetime(6), + tmp timestamp(6), + y year + ) + `) + } + + // To numeric data types. + // tinyint + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustGetErrCode("alter table t modify d tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify t tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify dt tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify tmp tinyint", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify y tinyint", mysql.ErrDataOutOfRange) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + // int + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d int") + tk.MustExec("alter table t modify t int") + tk.MustGetErrCode("alter table t modify dt int", mysql.ErrDataOutOfRange) + tk.MustGetErrCode("alter table t modify tmp int", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify y int") + tk.MustQuery("select * from t").Check(testkit.Rows("20201030 193825 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + // bigint + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d bigint") + tk.MustExec("alter table t modify t bigint") + tk.MustExec("alter table t modify dt bigint") + tk.MustExec("alter table t modify tmp bigint") + tk.MustExec("alter table t modify y bigint") + tk.MustQuery("select * from t").Check(testkit.Rows("20201030 193825 20201030082133 20201030082133 2020")) + // bit + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustGetErrCode("alter table t modify d bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify dt bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify tmp bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify y bit", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + // decimal + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d decimal") + tk.MustExec("alter table t modify t decimal(10, 4)") + tk.MustExec("alter table t modify dt decimal(20, 6)") + tk.MustExec("alter table t modify tmp decimal(22, 8)") + tk.MustExec("alter table t modify y decimal") + tk.MustQuery("select * from t").Check(testkit.Rows("20201030 193825.0010 20201030082133.455555 20201030082133.45555500 2020")) + // double + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d double") + tk.MustExec("alter table t modify t double(10, 4)") + tk.MustExec("alter table t modify dt double(20, 6)") + tk.MustExec("alter table t modify tmp double(22, 8)") + tk.MustExec("alter table t modify y double") + tk.MustQuery("select * from t").Check(testkit.Rows("20201030 193825.001 20201030082133.457 20201030082133.457 2020")) + + // To string data types. + // char + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d char(30)") + tk.MustExec("alter table t modify t char(30)") + tk.MustExec("alter table t modify dt char(30)") + tk.MustExec("alter table t modify tmp char(30)") + tk.MustExec("alter table t modify y char(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // varchar + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d varchar(30)") + tk.MustExec("alter table t modify t varchar(30)") + tk.MustExec("alter table t modify dt varchar(30)") + tk.MustExec("alter table t modify tmp varchar(30)") + tk.MustExec("alter table t modify y varchar(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // binary + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d binary(30)") + tk.MustExec("alter table t modify t binary(30)") + tk.MustExec("alter table t modify dt binary(30)") + tk.MustExec("alter table t modify tmp binary(30)") + tk.MustExec("alter table t modify y binary(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "19:38:25.001\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "2020-10-30 08:21:33.455555\x00\x00\x00\x00 " + + "2020-10-30 08:21:33.455555\x00\x00\x00\x00 " + + "2020\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00")) + + // varbinary + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d varbinary(30)") + tk.MustExec("alter table t modify t varbinary(30)") + tk.MustExec("alter table t modify dt varbinary(30)") + tk.MustExec("alter table t modify tmp varbinary(30)") + tk.MustExec("alter table t modify y varbinary(30)") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // text + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d text") + tk.MustExec("alter table t modify t text") + tk.MustExec("alter table t modify dt text") + tk.MustExec("alter table t modify tmp text") + tk.MustExec("alter table t modify y text") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // blob + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d blob") + tk.MustExec("alter table t modify t blob") + tk.MustExec("alter table t modify dt blob") + tk.MustExec("alter table t modify tmp blob") + tk.MustExec("alter table t modify y blob") + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // enum + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustGetErrCode("alter table t modify d enum('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t enum('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify dt enum('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify tmp enum('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify y enum('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // set + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustGetErrCode("alter table t modify d set('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t set('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify dt set('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify tmp set('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify y set('2020-10-30', '19:38:25.001', '20201030082133.455555', '2020')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("2020-10-30 19:38:25.001 2020-10-30 08:21:33.455555 2020-10-30 08:21:33.455555 2020")) + + // To json data type. + reset(tk) + tk.MustExec("insert into t values ('2020-10-30', '19:38:25.001', 20201030082133.455555, 20201030082133.455555, 2020)") + tk.MustExec("alter table t modify d json") + tk.MustExec("alter table t modify t json") + tk.MustExec("alter table t modify dt json") + tk.MustExec("alter table t modify tmp json") + tk.MustExec("alter table t modify y json") + tk.MustQuery("select * from t").Check(testkit.Rows("\"2020-10-30\" \"19:38:25.001\" \"2020-10-30 08:21:33.455555\" \"2020-10-30 08:21:33.455555\" 2020")) +} + +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFromJsonToOthers(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Set time zone to UTC. + originalTz := tk.Se.GetSessionVars().TimeZone + tk.Se.GetSessionVars().TimeZone = time.UTC + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + tk.Se.GetSessionVars().TimeZone = originalTz + }() + + // Init string date type table. + reset := func(tk *testkit.TestKit) { + tk.MustExec("drop table if exists t") + tk.MustExec(` + create table t ( + obj json, + arr json, + nil json, + t json, + f json, + i json, + ui json, + f64 json, + str json + ) + `) + } + + // To numeric data types. + // tinyint + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj tinyint", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". + tk.MustGetErrCode("alter table t modify arr tinyint", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". + tk.MustExec("alter table t modify nil tinyint") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". + tk.MustExec("alter table t modify t tinyint") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". + tk.MustExec("alter table t modify f tinyint") + tk.MustExec("alter table t modify i tinyint") + tk.MustExec("alter table t modify ui tinyint") + tk.MustGetErrCode("alter table t modify f64 tinyint", mysql.ErrDataOutOfRange) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". + tk.MustGetErrCode("alter table t modify str tinyint", mysql.ErrTruncatedWrongValue) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323.32323235 \"json string\"")) + + // int + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj int", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". + tk.MustGetErrCode("alter table t modify arr int", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". + tk.MustExec("alter table t modify nil int") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". + tk.MustExec("alter table t modify t int") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". + tk.MustExec("alter table t modify f int") + tk.MustExec("alter table t modify i int") + tk.MustExec("alter table t modify ui int") + tk.MustExec("alter table t modify f64 int") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". + tk.MustGetErrCode("alter table t modify str int", mysql.ErrTruncatedWrongValue) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + + // bigint + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj bigint", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". + tk.MustGetErrCode("alter table t modify arr bigint", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". + tk.MustExec("alter table t modify nil bigint") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". + tk.MustExec("alter table t modify t bigint") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". + tk.MustExec("alter table t modify f bigint") + tk.MustExec("alter table t modify i bigint") + tk.MustExec("alter table t modify ui bigint") + tk.MustExec("alter table t modify f64 bigint") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". + tk.MustGetErrCode("alter table t modify str bigint", mysql.ErrTruncatedWrongValue) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + + // unsigned bigint + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj bigint unsigned", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 1". + tk.MustGetErrCode("alter table t modify arr bigint unsigned", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'null' for column 'nil' at row 1". + tk.MustExec("alter table t modify nil bigint unsigned") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'true' for column 't' at row 1". + tk.MustExec("alter table t modify t bigint unsigned") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: 'false' for column 'f' at row 1". + tk.MustExec("alter table t modify f bigint unsigned") + // MySQL will get "ERROR 1264 (22003) Out of range value for column 'i' at row 1". + tk.MustGetErrCode("alter table t modify i bigint unsigned", mysql.ErrDataOutOfRange) + tk.MustExec("alter table t modify ui bigint unsigned") + tk.MustExec("alter table t modify f64 bigint unsigned") + // MySQL will get "ERROR 1366 (HY000) Incorrect integer value: '"json string"' for column 'str' at row 1". + tk.MustGetErrCode("alter table t modify str bigint unsigned", mysql.ErrTruncatedWrongValue) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323 \"json string\"")) + + // bit + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustGetErrCode("alter table t modify obj bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify arr bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify nil bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify i bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify ui bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 bit", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify str bit", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // decimal + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column obj at row 1". + tk.MustGetErrCode("alter table t modify obj decimal(20, 10)", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column arr at row 1". + tk.MustGetErrCode("alter table t modify arr decimal(20, 10)", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 3156 (22001) Invalid JSON value for CAST to DECIMAL from column nil at row 1". + tk.MustExec("alter table t modify nil decimal(20, 10)") + tk.MustExec("alter table t modify t decimal(20, 10)") + tk.MustExec("alter table t modify f decimal(20, 10)") + tk.MustExec("alter table t modify i decimal(20, 10)") + tk.MustExec("alter table t modify ui decimal(20, 10)") + tk.MustExec("alter table t modify f64 decimal(20, 10)") + // MySQL will get "ERROR 1366 (HY000): Incorrect DECIMAL value: '0' for column '' at row -1". + tk.MustGetErrCode("alter table t modify str decimal(20, 10)", mysql.ErrBadNumber) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0.0000000000 1.0000000000 0.0000000000 -22.0000000000 22.0000000000 323232323.3232323500 \"json string\"")) + + // double + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + // MySQL will get "ERROR 1265 (01000): Data truncated for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj double", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1265 (01000): Data truncated for column 'arr' at row 1". + tk.MustGetErrCode("alter table t modify arr double", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1265 (01000): Data truncated for column 'nil' at row 1". + tk.MustExec("alter table t modify nil double") + // MySQL will get "ERROR 1265 (01000): Data truncated for column 't' at row 1". + tk.MustExec("alter table t modify t double") + // MySQL will get "ERROR 1265 (01000): Data truncated for column 'f' at row 1". + tk.MustExec("alter table t modify f double") + tk.MustExec("alter table t modify i double") + tk.MustExec("alter table t modify ui double") + tk.MustExec("alter table t modify f64 double") + // MySQL will get "ERROR 1265 (01000): Data truncated for column 'str' at row 1". + tk.MustGetErrCode("alter table t modify str double", mysql.ErrTruncatedWrongValue) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 1 0 -22 22 323232323.32323235 \"json string\"")) + + // To string data types. + // char + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj char(20)") + tk.MustExec("alter table t modify arr char(20)") + tk.MustExec("alter table t modify nil char(20)") + tk.MustExec("alter table t modify t char(20)") + tk.MustExec("alter table t modify f char(20)") + tk.MustExec("alter table t modify i char(20)") + tk.MustExec("alter table t modify ui char(20)") + tk.MustExec("alter table t modify f64 char(20)") + tk.MustExec("alter table t modify str char(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // varchar + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj varchar(20)") + tk.MustExec("alter table t modify arr varchar(20)") + tk.MustExec("alter table t modify nil varchar(20)") + tk.MustExec("alter table t modify t varchar(20)") + tk.MustExec("alter table t modify f varchar(20)") + tk.MustExec("alter table t modify i varchar(20)") + tk.MustExec("alter table t modify ui varchar(20)") + tk.MustExec("alter table t modify f64 varchar(20)") + tk.MustExec("alter table t modify str varchar(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // binary + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj binary(20)") + tk.MustExec("alter table t modify arr binary(20)") + tk.MustExec("alter table t modify nil binary(20)") + tk.MustExec("alter table t modify t binary(20)") + tk.MustExec("alter table t modify f binary(20)") + tk.MustExec("alter table t modify i binary(20)") + tk.MustExec("alter table t modify ui binary(20)") + tk.MustExec("alter table t modify f64 binary(20)") + tk.MustExec("alter table t modify str binary(20)") + tk.MustQuery("select * from t").Check(testkit.Rows( + "{\"obj\": 100}\x00\x00\x00\x00\x00\x00\x00\x00 " + + "[-1, 0, 1]\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "null\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "true\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "false\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "-22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 " + + "323232323.32323235\x00\x00 " + + "\"json string\"\x00\x00\x00\x00\x00\x00\x00")) + // varbinary + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj varbinary(20)") + tk.MustExec("alter table t modify arr varbinary(20)") + tk.MustExec("alter table t modify nil varbinary(20)") + tk.MustExec("alter table t modify t varbinary(20)") + tk.MustExec("alter table t modify f varbinary(20)") + tk.MustExec("alter table t modify i varbinary(20)") + tk.MustExec("alter table t modify ui varbinary(20)") + tk.MustExec("alter table t modify f64 varbinary(20)") + tk.MustExec("alter table t modify str varbinary(20)") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // blob + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj blob") + tk.MustExec("alter table t modify arr blob") + tk.MustExec("alter table t modify nil blob") + tk.MustExec("alter table t modify t blob") + tk.MustExec("alter table t modify f blob") + tk.MustExec("alter table t modify i blob") + tk.MustExec("alter table t modify ui blob") + tk.MustExec("alter table t modify f64 blob") + tk.MustExec("alter table t modify str blob") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // text + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustExec("alter table t modify obj text") + tk.MustExec("alter table t modify arr text") + tk.MustExec("alter table t modify nil text") + tk.MustExec("alter table t modify t text") + tk.MustExec("alter table t modify f text") + tk.MustExec("alter table t modify i text") + tk.MustExec("alter table t modify ui text") + tk.MustExec("alter table t modify f64 text") + tk.MustExec("alter table t modify str text") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // enum + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustGetErrCode("alter table t modify obj enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify arr enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify nil enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify i enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify ui enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify str enum('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false -22 22 323232323.32323235 \"json string\"")) + + // set + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')") + tk.MustGetErrCode("alter table t modify obj set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify arr set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify nil set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify t set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify i set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify ui set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify f64 set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustGetErrCode("alter table t modify str set('{\"obj\": 100}', '[-1]', 'null', 'true', 'false', '-22', '22', '323232323.3232323232', '\"json string\"')", mysql.ErrUnsupportedDDLOperation) + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1] null true false -22 22 323232323.32323235 \"json string\"")) + + // To date and time data types. + // datetime + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustGetErrCode("alter table t modify obj datetime", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify arr datetime", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify nil datetime", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify t datetime", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify f datetime", mysql.ErrTruncatedWrongValue) + tk.MustExec("alter table t modify i datetime") + tk.MustExec("alter table t modify ui datetime") + tk.MustExec("alter table t modify f64 datetime") + // MySQL will get "ERROR 1292 (22007): Incorrect datetime value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". + tk.MustExec("alter table t modify str datetime") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01")) + + // time + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '200805', '1111', '200805.11', '\"19:35:41\"')") + // MySQL will get "ERROR 1366 (HY000): Incorrect time value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj time", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect time value: '[-1, 0, 1]' for column 'arr' at row 11". + tk.MustGetErrCode("alter table t modify arr time", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect time value: 'null' for column 'nil' at row 1". + tk.MustGetErrCode("alter table t modify nil time", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect time value: 'true' for column 't' at row 1". + tk.MustGetErrCode("alter table t modify t time", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect time value: 'true' for column 't' at row 1". + tk.MustGetErrCode("alter table t modify f time", mysql.ErrTruncatedWrongValue) + tk.MustExec("alter table t modify i time") + tk.MustExec("alter table t modify ui time") + tk.MustExec("alter table t modify f64 time") + // MySQL will get "ERROR 1292 (22007): Incorrect time value: '"19:35:41"' for column 'str' at row 1". + tk.MustExec("alter table t modify str time") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 20:08:05 00:11:11 20:08:05 19:35:41")) + + // date + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustGetErrCode("alter table t modify obj date", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify arr date", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify nil date", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify t date", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify f date", mysql.ErrTruncatedWrongValue) + tk.MustExec("alter table t modify i date") + tk.MustExec("alter table t modify ui date") + tk.MustExec("alter table t modify f64 date") + // MySQL will get "ERROR 1292 (22007): Incorrect date value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". + tk.MustExec("alter table t modify str date") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 2020-11-23 2020-08-26 2020-08-26")) + + // timestamp + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '20200826173501', '20201123', '20200826173501.123456', '\"2020-08-26 17:35:01.123456\"')") + tk.MustGetErrCode("alter table t modify obj timestamp", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify arr timestamp", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify nil timestamp", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify t timestamp", mysql.ErrTruncatedWrongValue) + tk.MustGetErrCode("alter table t modify f timestamp", mysql.ErrTruncatedWrongValue) + tk.MustExec("alter table t modify i timestamp") + tk.MustExec("alter table t modify ui timestamp") + tk.MustExec("alter table t modify f64 timestamp") + // MySQL will get "ERROR 1292 (22007): Incorrect timestamptime value: '"2020-08-26 17:35:01.123456"' for column 'str' at row 1". + tk.MustExec("alter table t modify str timestamp") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] null true false 2020-08-26 17:35:01 2020-11-23 00:00:00 2020-08-26 17:35:01 2020-08-26 17:35:01")) + + // year + reset(tk) + tk.MustExec("insert into t values ('{\"obj\": 100}', '[-1, 0, 1]', 'null', 'true', 'false', '2020', '91', '9', '\"2020\"')") + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '{"obj": 100}' for column 'obj' at row 1". + tk.MustGetErrCode("alter table t modify obj year", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '[-1, 0, 1]' for column 'arr' at row 11". + tk.MustGetErrCode("alter table t modify arr year", mysql.ErrTruncatedWrongValue) + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'null' for column 'nil' at row 1". + tk.MustExec("alter table t modify nil year") + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'true' for column 't' at row 1". + tk.MustExec("alter table t modify t year") + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: 'false' for column 'f' at row 1". + tk.MustExec("alter table t modify f year") + tk.MustExec("alter table t modify i year") + tk.MustExec("alter table t modify ui year") + tk.MustExec("alter table t modify f64 year") + // MySQL will get "ERROR 1366 (HY000): Incorrect integer value: '"2020"' for column 'str' at row 1". + tk.MustExec("alter table t modify str year") + tk.MustQuery("select * from t").Check(testkit.Rows("{\"obj\": 100} [-1, 0, 1] 0 2001 0 2020 1991 2009 2020")) +} + +// TestRowFormat is used to close issue #21391, the encoded row in column type change should be aware of the new row format. +func (s *testColumnTypeChangeSuite) TestRowFormat(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + }() + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int primary key, v varchar(10))") + tk.MustExec("insert into t values (1, \"123\");") + tk.MustExec("alter table t modify column v varchar(5);") + + tbl := testGetTableByName(c, tk.Se, "test", "t") + encodedKey := tablecodec.EncodeRowKeyWithHandle(tbl.Meta().ID, kv.IntHandle(1)) + + h := helper.NewHelper(s.store.(helper.Storage)) + data, err := h.GetMvccByEncodedKey(encodedKey) + c.Assert(err, IsNil) + // The new format will start with CodecVer = 128 (0x80). + c.Assert(data.Info.Writes[0].ShortValue, DeepEquals, []byte{0x80, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1, 0x2, 0x3, 0x1, 0x0, 0x4, 0x0, 0x7, 0x0, 0x1, 0x31, 0x32, 0x33, 0x31, 0x32, 0x33}) + tk.MustExec("drop table if exists t") +} + +// Close issue #17530 +func (s *testColumnTypeChangeSuite) TestColumnTypeChangeFlenErrorMsg(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int4)") + _, err := tk.Exec("alter table t MODIFY COLUMN a tinyint(11)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: length 4 is less than origin 11, and tidb_enable_change_column_type is false") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a decimal(20))") + tk.MustExec("insert into t values (12345678901234567890)") + _, err = tk.Exec("alter table t modify column a bigint") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type bigint(20) not match origin decimal(20,0), and tidb_enable_change_column_type is false") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table a (a bigint(2))") + tk.MustExec("insert into a values(123456),(789123)") + _, err = tk.Exec("alter table a modify column a tinyint") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: length 4 is less than origin 20, and tidb_enable_change_column_type is false") + + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t ( id int not null primary key auto_increment, token varchar(512) NOT NULL DEFAULT '', index (token))") + tk.MustExec("INSERT INTO t VALUES (NULL, 'aa')") + _, err = tk.Exec("ALTER TABLE t CHANGE COLUMN token token varchar(255) DEFAULT '' NOT NULL") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: length 255 is less than origin 512, and tidb_enable_change_column_type is false") +} + +// Close issue #22395 +// Background: +// Since the changing column is implemented as adding a new column and substitute the old one when it finished. +// The added column with NOT-NULL option will be fetched with error when it's origin default value is not set. +// It's good because the insert / update logic will cast the related column to changing column rather than use +// origin default value directly. +func (s *testColumnTypeChangeSuite) TestChangingColOriginDefaultValue(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // Enable column change variable. + tk.Se.GetSessionVars().EnableChangeColumnType = true + defer func() { + tk.Se.GetSessionVars().EnableChangeColumnType = false + }() + + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1, 1)") + tk.MustExec("insert into t values(2, 2)") + + tbl := testGetTableByName(c, tk.Se, "test", "t") + originalHook := s.dom.DDL().GetHook() + hook := &ddl.TestDDLCallback{Do: s.dom} + var ( + once bool + checkErr error + ) + hook.OnJobRunBeforeExported = func(job *model.Job) { + if checkErr != nil { + return + } + if tbl.Meta().ID != job.TableID { + return + } + if job.SchemaState == model.StateWriteOnly || job.SchemaState == model.StateWriteReorganization { + if !once { + once = true + tbl := testGetTableByName(c, tk1.Se, "test", "t") + if len(tbl.WritableCols()) != 3 { + checkErr = errors.New("assert the writable column number error") + return + } + if tbl.WritableCols()[2].OriginDefaultValue.(string) != "0" { + checkErr = errors.New("assert the write only column origin default value error") + return + } + } + // For writable column: + // Insert/ Update should set the column with the casted-related column value. + _, err := tk1.Exec("insert into t values(3, 3)") + if err != nil { + checkErr = err + return + } + if job.SchemaState == model.StateWriteOnly { + // The casted value will be inserted into changing column too. + _, err := tk1.Exec("update t set b = -1 where a = 1") + if err != nil { + checkErr = err + return + } + } else { + // The casted value will be inserted into changing column too. + _, err := tk1.Exec("update t set b = -2 where a = 2") + if err != nil { + checkErr = err + return + } + } + } + } + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + tk.MustExec("alter table t modify column b tinyint NOT NULL") + s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) + // Since getReorgInfo will stagnate StateWriteReorganization for a ddl round, so insert should exec 3 times. + tk.MustQuery("select * from t order by a").Check(testkit.Rows("1 -1", "2 -2", "3 3", "3 3", "3 3")) + tk.MustExec("drop table if exists t") +} + +// Close issue #22820 +func (s *testColumnTypeChangeSuite) TestChangingAttributeOfColumnWithFK(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + prepare := func() { + tk.MustExec("drop table if exists users") + tk.MustExec("drop table if exists orders") + tk.MustExec("CREATE TABLE users (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, doc JSON);") + tk.MustExec("CREATE TABLE orders (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, doc JSON, FOREIGN KEY fk_user_id (user_id) REFERENCES users(id));") + } + + prepare() + // For column with FK, alter action can be performed for changing null/not null, default value, comment and so on, but column type. + tk.MustExec("alter table orders modify user_id int null;") + tbl := testGetTableByName(c, tk.Se, "test", "orders") + c.Assert(parser_mysql.HasNotNullFlag(tbl.Meta().Columns[1].Flag), Equals, false) + + prepare() + tk.MustExec("alter table orders change user_id user_id2 int null") + tbl = testGetTableByName(c, tk.Se, "test", "orders") + c.Assert(tbl.Meta().Columns[1].Name.L, Equals, "user_id2") + c.Assert(parser_mysql.HasNotNullFlag(tbl.Meta().Columns[1].Flag), Equals, false) + + prepare() + tk.MustExec("alter table orders modify user_id int default -1 comment \"haha\"") + tbl = testGetTableByName(c, tk.Se, "test", "orders") + c.Assert(tbl.Meta().Columns[1].Comment, Equals, "haha") + c.Assert(tbl.Meta().Columns[1].DefaultValue.(string), Equals, "-1") + + prepare() + tk.MustGetErrCode("alter table orders modify user_id bigint", mysql.ErrFKIncompatibleColumns) + + tk.MustExec("drop table if exists orders, users") +} + +// Close issue #23202 +func (s *testColumnTypeChangeSuite) TestDDLExitWhenCancelMeetPanic(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1),(2,2)") + tk.MustExec("alter table t add index(b)") + tk.MustExec("set @@global.tidb_ddl_error_count_limit=3") + + failpoint.Enable("github.com/pingcap/tidb/ddl/mockExceedErrorLimit", `return(true)`) + defer func() { + failpoint.Disable("github.com/pingcap/tidb/ddl/mockExceedErrorLimit") + }() + + originalHook := s.dom.DDL().GetHook() + defer s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) + + hook := &ddl.TestDDLCallback{Do: s.dom} + var jobID int64 + hook.OnJobRunBeforeExported = func(job *model.Job) { + if jobID != 0 { + return + } + if job.Type == model.ActionDropIndex { + jobID = job.ID + } + } + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + + // when it panics in write-reorg state, the job will be pulled up as a cancelling job. Since drop-index with + // write-reorg can't be cancelled, so it will be converted to running state and try again (dead loop). + _, err := tk.Exec("alter table t drop index b") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:-1]panic in handling DDL logic and error count beyond the limitation 3, cancelled") + c.Assert(jobID > 0, Equals, true) + + // Verification of the history job state. + var job *model.Job + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { + t := meta.NewMeta(txn) + var err1 error + job, err1 = t.GetHistoryDDLJob(jobID) + return errors2.Trace(err1) + }) + c.Assert(err, IsNil) + c.Assert(job.ErrorCount, Equals, int64(4)) + c.Assert(job.Error.Error(), Equals, "[ddl:-1]panic in handling DDL logic and error count beyond the limitation 3, cancelled") } diff --git a/ddl/db_change_test.go b/ddl/db_change_test.go index 516564d719ad7..a7cbdc050c92b 100644 --- a/ddl/db_change_test.go +++ b/ddl/db_change_test.go @@ -86,14 +86,19 @@ func (s *testStateChangeSuiteBase) SetUpSuite(c *C) { } func (s *testStateChangeSuiteBase) TearDownSuite(c *C) { - s.se.Execute(context.Background(), "drop database if exists test_db_state") + _, err := s.se.Execute(context.Background(), "drop database if exists test_db_state") + c.Assert(err, IsNil) s.se.Close() s.dom.Close() - s.store.Close() + err = s.store.Close() + c.Assert(err, IsNil) } // TestShowCreateTable tests the result of "show create table" when we are running "add index" or "add column". func (s *serialTestStateChangeSuite) TestShowCreateTable(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("create table t (id int)") @@ -191,7 +196,8 @@ func (s *testStateChangeSuite) TestDropNotNullColumn(c *C) { if checkErr != nil { return } - originalCallback.OnChanged(nil) + err := originalCallback.OnChanged(nil) + c.Assert(err, IsNil) if job.SchemaState == model.StateWriteOnly { switch sqlNum { case 0: @@ -262,7 +268,10 @@ func (s *testStateChangeSuite) test(c *C, tableName, alterTableSQL string, testI c4 timestamp on update current_timestamp, key(c1, c2))`) c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table t") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t") + c.Assert(err, IsNil) + }() _, err = s.se.Execute(context.Background(), "insert into t values(1, 'a', 'N', '2017-07-01')") c.Assert(err, IsNil) @@ -467,7 +476,10 @@ func (s *testStateChangeSuite) TestAppendEnum(c *C) { c4 int primary key, unique key idx2 (c2, c3))`) c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table t") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t") + c.Assert(err, IsNil) + }() _, err = s.se.Execute(context.Background(), "insert into t values('a', 'N', '2017-07-01', 8)") c.Assert(err, IsNil) // Make sure these sqls use the the plan of index scan. @@ -482,10 +494,10 @@ func (s *testStateChangeSuite) TestAppendEnum(c *C) { c.Assert(err.Error(), Equals, "[types:1265]Data truncated for column 'c2' at row 1") failAlterTableSQL1 := "alter table t change c2 c2 enum('N') DEFAULT 'N'" _, err = s.se.Execute(context.Background(), failAlterTableSQL1) - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: the number of enum column's elements is less than the original: 2") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: the number of enum column's elements is less than the original: 2, and tidb_enable_change_column_type is false") failAlterTableSQL2 := "alter table t change c2 c2 int default 0" _, err = s.se.Execute(context.Background(), failAlterTableSQL2) - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: cannot modify enum type column's to type int(11)") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type int(11) not match origin enum('N','Y'), and tidb_enable_change_column_type is false") alterTableSQL := "alter table t change c2 c2 enum('N','Y','A') DEFAULT 'A'" _, err = s.se.Execute(context.Background(), alterTableSQL) c.Assert(err, IsNil) @@ -499,14 +511,17 @@ func (s *testStateChangeSuite) TestAppendEnum(c *C) { result, err := s.execQuery(tk, "select c4, c2 from t order by c4 asc") c.Assert(err, IsNil) expected := []string{"8 N", "10 A", "11 A"} - checkResult(result, testkit.Rows(expected...)) + err = checkResult(result, testkit.Rows(expected...)) + c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "update t set c2='N' where c4 = 10") c.Assert(err, IsNil) result, err = s.execQuery(tk, "select c2 from t where c4 = 10") c.Assert(err, IsNil) - expected = []string{"8 N", "10 N", "11 A"} - checkResult(result, testkit.Rows(expected...)) + // fixed + expected = []string{"N"} + err = checkResult(result, testkit.Rows(expected...)) + c.Assert(err, IsNil) } // https://github.com/pingcap/tidb/pull/6249 fixes the following two test cases. @@ -580,7 +595,10 @@ func (s *serialTestStateChangeSuite) TestWriteReorgForModifyColumnWithPKIsHandle c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tt (a, c) values(1, 11)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tt") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tt") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 12) sqls[0] = sqlWithErr{"delete from tt where c = -11", nil} @@ -647,7 +665,10 @@ func (s *serialTestStateChangeSuite) testModifyColumn(c *C, state model.SchemaSt c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tt (a, c) values('b', 22)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tt") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tt") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 13) sqls[0] = sqlWithErr{"delete from tt where c = 11", nil} @@ -705,7 +726,10 @@ func (s *testStateChangeSuite) TestDeleteOnly(c *C) { c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tt (c, c4) values('a', 8)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tt") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tt") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 5) sqls[0] = sqlWithErr{"insert t set c1 = 'c1_insert', c3 = '2018-02-12', c4 = 1", @@ -725,6 +749,12 @@ func (s *testStateChangeSuite) TestDeleteOnly(c *C) { // TestDeleteOnlyForDropExpressionIndex tests for deleting data when the hidden column is delete-only state. func (s *serialTestStateChangeSuite) TestDeleteOnlyForDropExpressionIndex(c *C) { + originalVal := config.GetGlobalConfig().Experimental.AllowsExpressionIndex + config.GetGlobalConfig().Experimental.AllowsExpressionIndex = true + defer func() { + config.GetGlobalConfig().Experimental.AllowsExpressionIndex = originalVal + }() + _, err := s.se.Execute(context.Background(), "use test_db_state") c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), `create table tt (a int, b int)`) @@ -733,7 +763,10 @@ func (s *serialTestStateChangeSuite) TestDeleteOnlyForDropExpressionIndex(c *C) c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tt (a, b) values(8, 8)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tt") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tt") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 1) sqls[0] = sqlWithErr{"delete from tt where b=8", nil} @@ -760,7 +793,10 @@ func (s *testStateChangeSuite) TestWriteOnlyForDropColumn(c *C) { c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tt (c1, c4) values(8, 8)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tt") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tt") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 2) sqls[0] = sqlWithErr{"update t set c1='5', c3='2020-03-01';", errors.New("[planner:1054]Unknown column 'c3' in 'field list'")} @@ -780,7 +816,10 @@ func (s *testStateChangeSuite) TestWriteOnlyForDropColumns(c *C) { c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into t_drop_columns (c1, c4) values(8, 8)") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table t_drop_columns") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t_drop_columns") + c.Assert(err, IsNil) + }() sqls := make([]sqlWithErr, 2) sqls[0] = sqlWithErr{"update t set c1='5', c3='2020-03-01';", errors.New("[planner:1054]Unknown column 'c3' in 'field list'")} @@ -802,14 +841,17 @@ func (s *testStateChangeSuiteBase) runTestInSchemaState(c *C, state model.Schema c4 int primary key, unique key idx2 (c2))`) c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table t") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t") + c.Assert(err, IsNil) + }() _, err = s.se.Execute(context.Background(), "insert into t values('a', 'N', '2017-07-01', 8)") c.Assert(err, IsNil) // Make sure these sqls use the the plan of index scan. _, err = s.se.Execute(context.Background(), "drop stats t") c.Assert(err, IsNil) - callback := &ddl.TestDDLCallback{} + callback := &ddl.TestDDLCallback{Do: s.dom} prevState := model.StateNone var checkErr error times := 0 @@ -895,7 +937,10 @@ func (s *testStateChangeSuiteBase) CheckResult(tk *testkit.TestKit, sql string, func (s *testStateChangeSuite) TestShowIndex(c *C) { _, err := s.se.Execute(context.Background(), `create table t(c1 int primary key, c2 int)`) c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table t") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t") + c.Assert(err, IsNil) + }() callback := &ddl.TestDDLCallback{} prevState := model.StateNone @@ -950,7 +995,10 @@ func (s *testStateChangeSuite) TestShowIndex(c *C) { partition p5 values less than (2015) );`) c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tr") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tr") + c.Assert(err, IsNil) + }() _, err = s.se.Execute(context.Background(), "create index idx1 on tr (purchased);") c.Assert(err, IsNil) result, err = s.execQuery(tk, "show index from tr;") @@ -1019,7 +1067,10 @@ func (s *testStateChangeSuite) TestParallelAddColumAndSetDefaultValue(c *C) { c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "insert into tx values('a', 'N')") c.Assert(err, IsNil) - defer s.se.Execute(context.Background(), "drop table tx") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table tx") + c.Assert(err, IsNil) + }() sql1 := "alter table tx add column cx int after c1" sql2 := "alter table tx alter c2 set default 'N'" @@ -1062,6 +1113,9 @@ func (s *testStateChangeSuite) TestParallelAlterAddIndex(c *C) { } func (s *serialTestStateChangeSuite) TestParallelAlterAddExpressionIndex(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) sql1 := "ALTER TABLE t add index expr_index_b((b+1));" sql2 := "CREATE INDEX expr_index_b ON t ((c+1));" f := func(c *C, err1, err2 error) { @@ -1149,7 +1203,11 @@ func (s *testStateChangeSuite) TestParallelDropPrimaryKey(c *C) { func (s *testStateChangeSuite) TestParallelCreateAndRename(c *C) { sql1 := "create table t_exists(c int);" sql2 := "alter table t rename to t_exists;" - defer s.se.Execute(context.Background(), "drop table t_exists") + defer func() { + // fixed + _, err := s.se.Execute(context.Background(), "drop table if exists t_exists ") + c.Assert(err, IsNil) + }() f := func(c *C, err1, err2 error) { c.Assert(err1, IsNil) c.Assert(err2.Error(), Equals, "[schema:1050]Table 't_exists' already exists") @@ -1181,7 +1239,7 @@ func (s *testStateChangeSuiteBase) prepareTestControlParallelExecSQL(c *C) (sess } var qLen int for { - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { jobs, err1 := admin.GetDDLJobs(txn) if err1 != nil { return err1 @@ -1189,6 +1247,7 @@ func (s *testStateChangeSuiteBase) prepareTestControlParallelExecSQL(c *C) (sess qLen = len(jobs) return nil }) + c.Assert(err, IsNil) if qLen == 2 { break } @@ -1213,7 +1272,7 @@ func (s *testStateChangeSuiteBase) prepareTestControlParallelExecSQL(c *C) (sess go func() { var qLen int for { - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { jobs, err3 := admin.GetDDLJobs(txn) if err3 != nil { return err3 @@ -1221,6 +1280,7 @@ func (s *testStateChangeSuiteBase) prepareTestControlParallelExecSQL(c *C) (sess qLen = len(jobs) return nil }) + c.Assert(err, IsNil) if qLen == 1 { // Make sure sql2 is executed after the sql1. close(ch) @@ -1241,15 +1301,20 @@ func (s *testStateChangeSuiteBase) testControlParallelExecSQL(c *C, sql1, sql2 s _, err := s.se.Execute(context.Background(), s.preSQL) c.Assert(err, IsNil) } - defer s.se.Execute(context.Background(), "drop table t") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table t") + c.Assert(err, IsNil) + }() - _, err = s.se.Execute(context.Background(), "drop database if exists t_part") + // fixed + _, err = s.se.Execute(context.Background(), "drop table if exists t_part") c.Assert(err, IsNil) - s.se.Execute(context.Background(), `create table t_part (a int key) + _, err = s.se.Execute(context.Background(), `create table t_part (a int key) partition by range(a) ( partition p0 values less than (10), partition p1 values less than (20) );`) + c.Assert(err, IsNil) se, se1, ch, originalCallback := s.prepareTestControlParallelExecSQL(c) defer s.dom.DDL().(ddl.DDLForTest).SetHook(originalCallback) @@ -1274,7 +1339,10 @@ func (s *testStateChangeSuiteBase) testControlParallelExecSQL(c *C, sql1, sql2 s func (s *serialTestStateChangeSuite) TestParallelUpdateTableReplica(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() ctx := context.Background() _, err := s.se.Execute(context.Background(), "use test_db_state") @@ -1356,19 +1424,28 @@ func (s *testStateChangeSuite) testParallelExecSQL(c *C, sql string) { // TestCreateTableIfNotExists parallel exec create table if not exists xxx. No error returns is expected. func (s *testStateChangeSuite) TestCreateTableIfNotExists(c *C) { - defer s.se.Execute(context.Background(), "drop table test_not_exists") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table test_not_exists") + c.Assert(err, IsNil) + }() s.testParallelExecSQL(c, "create table if not exists test_not_exists(a int);") } // TestCreateDBIfNotExists parallel exec create database if not exists xxx. No error returns is expected. func (s *testStateChangeSuite) TestCreateDBIfNotExists(c *C) { - defer s.se.Execute(context.Background(), "drop database test_not_exists") + defer func() { + _, err := s.se.Execute(context.Background(), "drop database test_not_exists") + c.Assert(err, IsNil) + }() s.testParallelExecSQL(c, "create database if not exists test_not_exists;") } // TestDDLIfNotExists parallel exec some DDLs with `if not exists` clause. No error returns is expected. func (s *testStateChangeSuite) TestDDLIfNotExists(c *C) { - defer s.se.Execute(context.Background(), "drop table test_not_exists") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table test_not_exists") + c.Assert(err, IsNil) + }() _, err := s.se.Execute(context.Background(), "create table if not exists test_not_exists(a int)") c.Assert(err, IsNil) @@ -1388,8 +1465,10 @@ func (s *testStateChangeSuite) TestDDLIfNotExists(c *C) { // TestDDLIfExists parallel exec some DDLs with `if exists` clause. No error returns is expected. func (s *testStateChangeSuite) TestDDLIfExists(c *C) { defer func() { - s.se.Execute(context.Background(), "drop table test_exists") - s.se.Execute(context.Background(), "drop table test_exists_2") + _, err := s.se.Execute(context.Background(), "drop table test_exists") + c.Assert(err, IsNil) + _, err = s.se.Execute(context.Background(), "drop table test_exists_2") + c.Assert(err, IsNil) }() _, err := s.se.Execute(context.Background(), "create table if not exists test_exists (a int key, b int)") c.Assert(err, IsNil) @@ -1422,7 +1501,10 @@ func (s *testStateChangeSuite) TestDDLIfExists(c *C) { // In a cluster, TiDB "a" executes the DDL. // TiDB "b" fails to load schema, then TiDB "b" executes the DDL statement associated with the DDL statement executed by "a". func (s *testStateChangeSuite) TestParallelDDLBeforeRunDDLJob(c *C) { - defer s.se.Execute(context.Background(), "drop table test_table") + defer func() { + _, err := s.se.Execute(context.Background(), "drop table test_table") + c.Assert(err, IsNil) + }() _, err := s.se.Execute(context.Background(), "use test_db_state") c.Assert(err, IsNil) _, err = s.se.Execute(context.Background(), "create table test_table (c1 int, c2 int default 1, index (c1))") @@ -1627,7 +1709,7 @@ func (s *serialTestStateChangeSuite) TestModifyColumnTypeArgs(c *C) { ID, err := strconv.Atoi(jobID) c.Assert(err, IsNil) var historyJob *model.Job - err = kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) historyJob, err = t.GetHistoryDDLJob(int64(ID)) if err != nil { diff --git a/ddl/db_integration_test.go b/ddl/db_integration_test.go index 4a8b7a8a20328..8aa31771e7f8f 100644 --- a/ddl/db_integration_test.go +++ b/ddl/db_integration_test.go @@ -39,9 +39,11 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" @@ -55,6 +57,7 @@ var _ = Suite(&testIntegrationSuite4{&testIntegrationSuite{}}) var _ = Suite(&testIntegrationSuite5{&testIntegrationSuite{}}) var _ = Suite(&testIntegrationSuite6{&testIntegrationSuite{}}) var _ = SerialSuites(&testIntegrationSuite7{&testIntegrationSuite{}}) +var _ = SerialSuites(&testIntegrationSuite8{&testIntegrationSuite{}}) type testIntegrationSuite struct { lease time.Duration @@ -123,6 +126,7 @@ type testIntegrationSuite4 struct{ *testIntegrationSuite } type testIntegrationSuite5 struct{ *testIntegrationSuite } type testIntegrationSuite6 struct{ *testIntegrationSuite } type testIntegrationSuite7 struct{ *testIntegrationSuite } +type testIntegrationSuite8 struct{ *testIntegrationSuite } func (s *testIntegrationSuite5) TestNoZeroDateMode(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -430,13 +434,13 @@ func (s *testIntegrationSuite1) TestIssue5092(c *C) { tk.MustExec("alter table t_issue_5092 add column d int default 4 after c1, add column aa int default 0 first") tk.MustQuery("select * from t_issue_5092").Check(testkit.Rows("0 1 2 22 3 33 4")) tk.MustQuery("show create table t_issue_5092").Check(testkit.Rows("t_issue_5092 CREATE TABLE `t_issue_5092` (\n" + - " `aa` int(11) DEFAULT 0,\n" + - " `a` int(11) DEFAULT 1,\n" + - " `b` int(11) DEFAULT 2,\n" + - " `b1` int(11) DEFAULT 22,\n" + - " `c` int(11) DEFAULT 3,\n" + - " `c1` int(11) DEFAULT 33,\n" + - " `d` int(11) DEFAULT 4\n" + + " `aa` int(11) DEFAULT '0',\n" + + " `a` int(11) DEFAULT '1',\n" + + " `b` int(11) DEFAULT '2',\n" + + " `b1` int(11) DEFAULT '22',\n" + + " `c` int(11) DEFAULT '3',\n" + + " `c1` int(11) DEFAULT '33',\n" + + " `d` int(11) DEFAULT '4'\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustExec("drop table t_issue_5092") @@ -686,13 +690,14 @@ func (s *testIntegrationSuite2) TestUpdateMultipleTable(c *C) { } t1Info.Columns = append(t1Info.Columns, newColumn) - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) _, err = m.GenSchemaVersion() c.Assert(err, IsNil) c.Assert(m.UpdateTable(db.ID, t1Info), IsNil) return nil }) + c.Assert(err, IsNil) err = dom.Reload() c.Assert(err, IsNil) @@ -702,13 +707,14 @@ func (s *testIntegrationSuite2) TestUpdateMultipleTable(c *C) { newColumn.State = model.StatePublic - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) _, err = m.GenSchemaVersion() c.Assert(err, IsNil) c.Assert(m.UpdateTable(db.ID, t1Info), IsNil) return nil }) + c.Assert(err, IsNil) err = dom.Reload() c.Assert(err, IsNil) @@ -947,15 +953,15 @@ func (s *testIntegrationSuite5) TestModifyColumnOption(c *C) { tk.MustExec("create table t2 (b char, c int)") assertErrCode("alter table t2 modify column c int references t1(a)", errMsg) _, err := tk.Exec("alter table t1 change a a varchar(16)") - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type varchar(16) not match origin int(11)") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type varchar(16) not match origin int(11), and tidb_enable_change_column_type is false") _, err = tk.Exec("alter table t1 change a a varchar(10)") - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type varchar(10) not match origin int(11)") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type varchar(10) not match origin int(11), and tidb_enable_change_column_type is false") _, err = tk.Exec("alter table t1 change a a datetime") - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type datetime not match origin int(11)") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type datetime not match origin int(11), and tidb_enable_change_column_type is false") _, err = tk.Exec("alter table t1 change a a int(11) unsigned") c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: can't change unsigned integer to signed or vice versa, and tidb_enable_change_column_type is false") _, err = tk.Exec("alter table t2 change b b int(11) unsigned") - c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type int(11) not match origin char(1)") + c.Assert(err.Error(), Equals, "[ddl:8200]Unsupported modify column: type int(11) not match origin char(1), and tidb_enable_change_column_type is false") } func (s *testIntegrationSuite4) TestIndexOnMultipleGeneratedColumn(c *C) { @@ -1302,7 +1308,7 @@ func getMaxTableHandle(ctx *testMaxTableRowIDContext, store kv.Storage) (kv.Hand c := ctx.c d := ctx.d tbl := ctx.tbl - curVer, err := store.CurrentVersion() + curVer, err := store.CurrentVersion(oracle.GlobalTxnScope) c.Assert(err, IsNil) maxHandle, emptyTable, err := d.GetTableMaxHandle(curVer.Ver, tbl.(table.PhysicalTable)) c.Assert(err, IsNil) @@ -1319,7 +1325,7 @@ func checkGetMaxTableRowID(ctx *testMaxTableRowIDContext, store kv.Storage, expe func getHistoryDDLJob(store kv.Storage, id int64) (*model.Job, error) { var job *model.Job - err := kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error job, err1 = t.GetHistoryDDLJob(id) @@ -1344,11 +1350,31 @@ func (s *testIntegrationSuite6) TestCreateTableTooLarge(c *C) { sql += ");" tk.MustGetErrCode(sql, errno.ErrTooManyFields) - originLimit := atomic.LoadUint32(&ddl.TableColumnCountLimit) - atomic.StoreUint32(&ddl.TableColumnCountLimit, uint32(cnt*4)) + originLimit := config.GetGlobalConfig().TableColumnCountLimit + atomic.StoreUint32(&config.GetGlobalConfig().TableColumnCountLimit, uint32(cnt*4)) _, err := tk.Exec(sql) c.Assert(kv.ErrEntryTooLarge.Equal(err), IsTrue, Commentf("err:%v", err)) - atomic.StoreUint32(&ddl.TableColumnCountLimit, originLimit) + atomic.StoreUint32(&config.GetGlobalConfig().TableColumnCountLimit, originLimit) +} + +func (s *testIntegrationSuite8) TestCreateTableTooManyIndexes(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + sql := "create table t_too_many_indexes (" + for i := 0; i < 100; i++ { + if i != 0 { + sql += "," + } + sql += fmt.Sprintf("c%d int", i) + } + for i := 0; i < 100; i++ { + sql += "," + sql += fmt.Sprintf("key k%d(c%d)", i, i) + } + sql += ");" + + tk.MustGetErrCode(sql, errno.ErrTooManyKeys) } func (s *testIntegrationSuite3) TestChangeColumnPosition(c *C) { @@ -1448,7 +1474,7 @@ func (s *testIntegrationSuite3) TestResolveCharset(c *C) { func (s *testIntegrationSuite6) TestAddColumnTooMany(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - count := int(atomic.LoadUint32(&ddl.TableColumnCountLimit) - 1) + count := int(atomic.LoadUint32(&config.GetGlobalConfig().TableColumnCountLimit) - 1) var cols []string for i := 0; i < count; i++ { cols = append(cols, fmt.Sprintf("a%d int", i)) @@ -1460,6 +1486,28 @@ func (s *testIntegrationSuite6) TestAddColumnTooMany(c *C) { tk.MustGetErrCode(alterSQL, errno.ErrTooManyFields) } +func (s *testIntegrationSuite8) TestCreateTooManyIndexes(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + count := config.GetGlobalConfig().IndexLimit - 1 + sql := "create table t_index_too_many (" + for i := 0; i < 100; i++ { + if i != 0 { + sql += "," + } + sql += fmt.Sprintf("c%d int", i) + } + for i := 0; i < count; i++ { + sql += "," + sql += fmt.Sprintf("key k%d(c%d)", i, i) + } + sql += ");" + tk.MustExec(sql) + tk.MustExec("create index idx1 on t_index_too_many (c62)") + alterSQL := "create index idx2 on t_index_too_many (c63)" + tk.MustGetErrCode(alterSQL, errno.ErrTooManyKeys) +} + func (s *testIntegrationSuite3) TestAlterColumn(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test_db") @@ -1531,7 +1579,7 @@ func (s *testIntegrationSuite3) TestAlterColumn(c *C) { c.Assert(err, NotNil) result := tk.MustQuery("show create table mc") createSQL := result.Rows()[0][1] - expected := "CREATE TABLE `mc` (\n `a` int(11) NOT NULL,\n `b` int(11) DEFAULT NULL,\n `c` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" + expected := "CREATE TABLE `mc` (\n `a` int(11) NOT NULL,\n `b` int(11) DEFAULT NULL,\n `c` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" c.Assert(createSQL, Equals, expected) // Change / modify column should preserve index options. @@ -1542,7 +1590,7 @@ func (s *testIntegrationSuite3) TestAlterColumn(c *C) { tk.MustExec("alter table mc modify column c bigint") // Unique should be preserved result = tk.MustQuery("show create table mc") createSQL = result.Rows()[0][1] - expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL,\n `b` bigint(20) DEFAULT NULL,\n `c` bigint(20) DEFAULT NULL,\n PRIMARY KEY (`a`),\n UNIQUE KEY `c` (`c`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" + expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL,\n `b` bigint(20) DEFAULT NULL,\n `c` bigint(20) DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */,\n UNIQUE KEY `c` (`c`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" c.Assert(createSQL, Equals, expected) // Dropping or keeping auto_increment is allowed, however adding is not allowed. @@ -1551,7 +1599,7 @@ func (s *testIntegrationSuite3) TestAlterColumn(c *C) { tk.MustExec("alter table mc modify column a bigint auto_increment") // Keeps auto_increment result = tk.MustQuery("show create table mc") createSQL = result.Rows()[0][1] - expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL AUTO_INCREMENT,\n `b` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" + expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL AUTO_INCREMENT,\n `b` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" c.Assert(createSQL, Equals, expected) _, err = tk.Exec("alter table mc modify column a bigint") // Droppping auto_increment is not allow when @@tidb_allow_remove_auto_inc == 'off' c.Assert(err, NotNil) @@ -1559,7 +1607,7 @@ func (s *testIntegrationSuite3) TestAlterColumn(c *C) { tk.MustExec("alter table mc modify column a bigint") // Dropping auto_increment is ok when @@tidb_allow_remove_auto_inc == 'on' result = tk.MustQuery("show create table mc") createSQL = result.Rows()[0][1] - expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL,\n `b` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" + expected = "CREATE TABLE `mc` (\n `a` bigint(20) NOT NULL,\n `b` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin" c.Assert(createSQL, Equals, expected) _, err = tk.Exec("alter table mc modify column a bigint auto_increment") // Adds auto_increment should throw error @@ -2111,6 +2159,9 @@ func (s *testIntegrationSuite3) TestParserIssue284(c *C) { } func (s *testIntegrationSuite7) TestAddExpressionIndex(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -2118,6 +2169,7 @@ func (s *testIntegrationSuite7) TestAddExpressionIndex(c *C) { tk.MustExec("create table t (a int, b real);") tk.MustExec("insert into t values (1, 2.1);") tk.MustExec("alter table t add index idx((a+b));") + tk.MustQuery("SELECT * FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE table_name = 't'").Check(testkit.Rows()) tblInfo, err := s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) c.Assert(err, IsNil) @@ -2161,13 +2213,24 @@ func (s *testIntegrationSuite7) TestAddExpressionIndex(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, key((a+1)), key((a+2)), key idx((a+3)), key((a+4)));") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (A INT, B INT, UNIQUE KEY ((A * 2)));") + + // Test experiment switch. + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = false + }) + tk.MustGetErrMsg("create index d on t((a+1))", "[ddl:8200]Unsupported creating expression index without allow-expression-index in config") + tk.MustGetErrMsg("create table t(a int, key ((a+1)));", "[ddl:8200]Unsupported creating expression index without allow-expression-index in config") } func (s *testIntegrationSuite7) TestCreateExpressionIndexError(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true conf.AlterPrimaryKey = true }) + tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -2202,9 +2265,13 @@ func (s *testIntegrationSuite7) TestCreateExpressionIndexError(c *C) { tk.MustExec("create table t (j json, key k ((j+1),(j+1)))") tk.MustGetErrCode("create table t1 (col1 int, index ((concat(''))));", errno.ErrWrongKeyColumnFunctionalIndex) + tk.MustGetErrCode("CREATE TABLE t1 (col1 INT, PRIMARY KEY ((ABS(col1))));", errno.ErrFunctionalIndexPrimaryKey) } func (s *testIntegrationSuite7) TestAddExpressionIndexOnPartition(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t;") @@ -2335,6 +2402,9 @@ func (s *testIntegrationSuite3) TestCreateTableWithAutoIdCache(c *C) { } func (s *testIntegrationSuite4) TestAlterIndexVisibility(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("create database if not exists alter_index_test") tk.MustExec("USE alter_index_test;") @@ -2430,6 +2500,26 @@ func (s *testIntegrationSuite5) TestDropColumnsWithMultiIndex(c *C) { tk.MustQuery(query).Check(testkit.Rows()) } +func (s *testIntegrationSuite5) TestDropLastVisibleColumn(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("create table t_drop_last_column(x int, key((1+1)))") + defer tk.MustExec("drop table if exists t_drop_last_column") + _, err := tk.Exec("alter table t_drop_last_column drop column x") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:1113]A table must have at least 1 column") +} + +func (s *testIntegrationSuite5) TestDropLastVisibleColumns(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("create table t_drop_last_columns(x int, y int, key((1+1)))") + defer tk.MustExec("drop table if exists t_drop_last_columns") + _, err := tk.Exec("alter table t_drop_last_columns drop column x, drop column y") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[ddl:1113]A table must have at least 1 column") +} + func (s *testIntegrationSuite7) TestAutoIncrementTableOption(c *C) { tk := testkit.NewTestKit(c, s.store) defer config.RestoreFunc()() @@ -2453,3 +2543,153 @@ func (s *testIntegrationSuite7) TestAutoIncrementTableOption(c *C) { tk.MustExec("insert into t values ();") tk.MustQuery("select * from t;").Check(testkit.Rows("12345678901234567890")) } + +func (s *testIntegrationSuite3) TestIssue20490(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("create table issue20490 (a int);") + tk.MustExec("insert into issue20490(a) values(1);") + tk.MustExec("alter table issue20490 add b int not null default 1;") + tk.MustExec("insert into issue20490(a) values(2);") + tk.MustExec("alter table issue20490 modify b int null;") + tk.MustExec("insert into issue20490(a) values(3);") + + tk.MustQuery("select b from issue20490 order by a;").Check(testkit.Rows("1", "1", "")) +} + +func (s *testIntegrationSuite3) TestIssue20741WithEnumField(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists issue20741") + tk.MustExec("create table issue20741(id int primary key, c int)") + tk.MustExec("insert into issue20741(id, c) values(1, 2), (2, 2)") + tk.MustExec("alter table issue20741 add column cc enum('a', 'b', 'c', 'd') not null") + tk.MustExec("update issue20741 set c=2 where id=1") + tk.MustQuery("select * from issue20741").Check(testkit.Rows("1 2 a", "2 2 a")) + tk.MustQuery("select * from issue20741 where cc = 0").Check(testkit.Rows()) + tk.MustQuery("select * from issue20741 where cc = 1").Check(testkit.Rows("1 2 a", "2 2 a")) +} + +func (s *testIntegrationSuite3) TestIssue20741WithSetField(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists issue20741_2") + tk.MustExec("create table issue20741_2(id int primary key, c int)") + tk.MustExec("insert into issue20741_2(id, c) values(1, 2), (2, 2)") + tk.MustExec("alter table issue20741_2 add column cc set('a', 'b', 'c', 'd') not null") + tk.MustExec("update issue20741_2 set c=2 where id=1") + tk.MustQuery("select * from issue20741_2").Check(testkit.Rows("1 2 ", "2 2 ")) + tk.MustQuery("select * from issue20741_2 where cc = 0").Check(testkit.Rows("1 2 ", "2 2 ")) + tk.MustQuery("select * from issue20741_2 where cc = 1").Check(testkit.Rows()) + _, err := tk.Exec("insert into issue20741_2(id, c) values (3, 3)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[table:1364]Field 'cc' doesn't have a default value") +} + +// TestDefaultValueIsLatin1 for issue #18977 +func (s *testIntegrationSuite3) TestEnumAndSetDefaultValue(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + defer tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a enum(0x61, 'b') not null default 0x61, b set(0x61, 'b') not null default 0x61) character set latin1") + tbl := testGetTableByName(c, s.ctx, "test", "t") + c.Assert(tbl.Meta().Columns[0].DefaultValue, Equals, "a") + c.Assert(tbl.Meta().Columns[1].DefaultValue, Equals, "a") + + tk.MustExec("drop table t") + tk.MustExec("create table t (a enum(0x61, 'b') not null default 0x61, b set(0x61, 'b') not null default 0x61) character set utf8mb4") + tbl = testGetTableByName(c, s.ctx, "test", "t") + c.Assert(tbl.Meta().Columns[0].DefaultValue, Equals, "a") + c.Assert(tbl.Meta().Columns[1].DefaultValue, Equals, "a") +} + +func (s *testIntegrationSuite3) TestStrictDoubleTypeCheck(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_strict_double_type_check = 'ON'") + sql := "create table double_type_check(id int, c double(10));" + _, err := tk.Exec(sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[parser:1149]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use") + tk.MustExec("set @@tidb_enable_strict_double_type_check = 'OFF'") + defer tk.MustExec("set @@tidb_enable_strict_double_type_check = 'ON'") + tk.MustExec(sql) +} + +func (s *testIntegrationSuite7) TestDuplicateErrorMessage(c *C) { + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + type testdata struct { + types []string + values []string + } + tests := []testdata{ + {[]string{"int"}, []string{"1"}}, + {[]string{"datetime"}, []string{"'2020-01-01 00:00:00'"}}, + {[]string{"varchar(10)"}, []string{"'qwe'"}}, + {[]string{"enum('r', 'g', 'b')"}, []string{"'r'"}}, + {[]string{"int", "datetime", "varchar(10)", "enum('r', 'g', 'b')"}, []string{"1", "'2020-01-01 00:00:00'", "'qwe'", "'r'"}}, + } + + for _, newCollate := range []bool{false, true} { + collate.SetNewCollationEnabledForTest(newCollate) + for _, globalIndex := range []bool{false, true} { + restoreConfig := config.RestoreFunc() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableGlobalIndex = globalIndex + conf.AlterPrimaryKey = false + }) + for _, clusteredIndex := range []bool{false, true} { + tk.Se.GetSessionVars().EnableClusteredIndex = clusteredIndex + for _, t := range tests { + tk.MustExec("drop table if exists t;") + fields := make([]string, len(t.types)) + + for i, tp := range t.types { + fields[i] = fmt.Sprintf("a%d %s", i, tp) + } + tk.MustExec("create table t (id1 int, id2 varchar(10), " + strings.Join(fields, ",") + ",primary key(id1, id2)) " + + "collate utf8mb4_general_ci " + + "partition by range (id1) (partition p1 values less than (2), partition p2 values less than (maxvalue))") + + vals := strings.Join(t.values, ",") + tk.MustExec(fmt.Sprintf("insert into t values (1, 'asd', %s), (1, 'dsa', %s)", vals, vals)) + for i := range t.types { + fields[i] = fmt.Sprintf("a%d", i) + } + index := strings.Join(fields, ",") + for i, val := range t.values { + fields[i] = strings.Replace(val, "'", "", -1) + } + tk.MustGetErrMsg("alter table t add unique index t_idx(id1,"+index+")", + fmt.Sprintf("[kv:1062]Duplicate entry '1-%s' for key 't_idx'", strings.Join(fields, "-"))) + } + } + restoreConfig() + } + } +} + +func (s *testIntegrationSuite3) TestIssue22028(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + _, err := tk.Exec("create table t(a double(0, 0));") + c.Assert(err.Error(), Equals, "[types:1439]Display width out of range for column 'a' (max = 255)") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a double);") + _, err = tk.Exec("ALTER TABLE t MODIFY COLUMN a DOUBLE(0,0);") + c.Assert(err.Error(), Equals, "[types:1439]Display width out of range for column 'a' (max = 255)") +} + +func (s *testIntegrationSuite3) TestIssue21835(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + _, err := tk.Exec("create table t( col decimal(1,2) not null default 0);") + c.Assert(err.Error(), Equals, "[types:1427]For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column 'col').") +} diff --git a/ddl/db_partition_test.go b/ddl/db_partition_test.go index 098b64d131c08..2b44bf2c8cec8 100644 --- a/ddl/db_partition_test.go +++ b/ddl/db_partition_test.go @@ -14,9 +14,9 @@ package ddl_test import ( + "bytes" "context" "fmt" - "math" "math/rand" "strings" "sync/atomic" @@ -29,6 +29,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/testutil" "github.com/pingcap/tidb/domain" @@ -42,6 +43,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/admin" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" ) @@ -352,13 +354,17 @@ func (s *testIntegrationSuite2) TestCreateTableWithHashPartition(c *C) { // Fix create partition table using extract() function as partition key. tk.MustExec("create table t2 (a date, b datetime) partition by hash (EXTRACT(YEAR_MONTH FROM a)) partitions 7") + tk.MustExec("create table t3 (a int, b int) partition by hash(ceiling(a-b)) partitions 10") + tk.MustExec("create table t4 (a int, b int) partition by hash(floor(a-b)) partitions 10") } -func (s *testIntegrationSuite1) TestCreateTableWithRangeColumnPartition(c *C) { +func (s *testIntegrationSuite7) TestCreateTableWithRangeColumnPartition(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") tk.MustExec("drop table if exists log_message_1;") - tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") tk.MustExec(` create table log_message_1 ( add_time datetime not null default '2000-01-01 00:00:00', @@ -401,6 +407,18 @@ create table log_message_1 ( "create table t (id int) partition by range columns (id);", ast.ErrPartitionsMustBeDefined, }, + { + "create table t(a datetime) partition by range columns (a) (partition p1 values less than ('2000-02-01'), partition p2 values less than ('20000102'));", + ddl.ErrRangeNotIncreasing, + }, + { + "create table t(a time) partition by range columns (a) (partition p1 values less than ('202020'), partition p2 values less than ('20:20:10'));", + ddl.ErrRangeNotIncreasing, + }, + { + "create table t(a time) partition by range columns (a) (partition p1 values less than ('202090'));", + ddl.ErrWrongTypeColumnValue, + }, { "create table t (id int) partition by range columns (id) (partition p0 values less than (1, 2));", ast.ErrPartitionColumnList, @@ -413,6 +431,10 @@ create table log_message_1 ( "create table t (a int) partition by range columns (b) (partition p0 values less than (1));", ddl.ErrFieldNotFoundPart, }, + { + "create table t (a date) partition by range (to_days(to_days(a))) (partition p0 values less than (1));", + ddl.ErrWrongExprInPartitionFunc, + }, { "create table t (id timestamp) partition by range columns (id) (partition p0 values less than ('2019-01-09 11:23:34'));", ddl.ErrNotAllowedTypeInPartition, @@ -475,6 +497,49 @@ create table log_message_1 ( "PARTITION p1 VALUES LESS THAN (20190906));", ddl.ErrWrongTypeColumnValue, }, + { + "create table t(a char(10) collate utf8mb4_bin) " + + "partition by range columns (a) (" + + "partition p0 values less than ('a'), " + + "partition p1 values less than ('G'));", + ddl.ErrRangeNotIncreasing, + }, + { + "CREATE TABLE t1(c0 INT) PARTITION BY HASH((NOT c0)) PARTITIONS 2;", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "CREATE TABLE t1(c0 INT) PARTITION BY HASH((!c0)) PARTITIONS 2;", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "CREATE TABLE t1(c0 INT) PARTITION BY LIST((NOT c0)) (partition p0 values in (0), partition p1 values in (1));", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "CREATE TABLE t1(c0 INT) PARTITION BY LIST((!c0)) (partition p0 values in (0), partition p1 values in (1));", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "CREATE TABLE t1 (a TIME, b DATE) PARTITION BY range(DATEDIFF(a, b)) (partition p1 values less than (20));", + ddl.ErrWrongExprInPartitionFunc, + }, + { + "CREATE TABLE t1 (a DATE, b VARCHAR(10)) PARTITION BY range(DATEDIFF(a, b)) (partition p1 values less than (20));", + ddl.ErrWrongExprInPartitionFunc, + }, + { + "create table t1 (a bigint unsigned) partition by list (a) (partition p0 values in (10, 20, 30, -1));", + ddl.ErrWrongTypeColumnValue, + }, + { + "CREATE TABLE new (a TIMESTAMP NOT NULL PRIMARY KEY) PARTITION BY RANGE (a % 2) (PARTITION p VALUES LESS THAN (20080819));", + ddl.ErrWrongExprInPartitionFunc, + }, + { + "CREATE TABLE new (a TIMESTAMP NOT NULL PRIMARY KEY) PARTITION BY RANGE (a+2) (PARTITION p VALUES LESS THAN (20080819));", + ddl.ErrWrongExprInPartitionFunc, + }, } for i, t := range cases { _, err := tk.Exec(t.sql) @@ -484,13 +549,710 @@ create table log_message_1 ( )) } + tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1 (a int, b char(3)) partition by range columns (a, b) (" + "partition p0 values less than (1, 'a')," + "partition p1 values less than (2, maxvalue))") + tk.MustExec("drop table if exists t2;") tk.MustExec("create table t2 (a int, b char(3)) partition by range columns (b) (" + "partition p0 values less than ( 'a')," + "partition p1 values less than (maxvalue))") + + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t(a char(10) collate utf8mb4_unicode_ci) partition by range columns (a) ( + partition p0 values less than ('a'), + partition p1 values less than ('G'));`) + + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t(a int) partition by range columns (a) ( + partition p0 values less than (10), + partition p1 values less than (20));`) +} + +func (s *testIntegrationSuite1) TestDisableTablePartition(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + for _, v := range []string{"'AUTO'", "'OFF'", "0", "'ON'"} { + tk.MustExec("set @@session.tidb_enable_table_partition = " + v) + tk.MustExec("set @@session.tidb_enable_list_partition = OFF") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int) partition by list (id) ( + partition p0 values in (1,2),partition p1 values in (3,4));`) + tbl := testGetTableByName(c, tk.Se, "test", "t") + c.Assert(tbl.Meta().Partition, IsNil) + _, err := tk.Exec(`alter table t add partition ( + partition p4 values in (7), + partition p5 values in (8,9));`) + c.Assert(ddl.ErrPartitionMgmtOnNonpartitioned.Equal(err), IsTrue) + tk.MustExec("insert into t values (1),(3),(5),(100),(null)") + } +} + +func (s *testIntegrationSuite1) generatePartitionTableByNum(num int) string { + buf := bytes.NewBuffer(make([]byte, 0, 1024*1024)) + buf.WriteString("create table t (id int) partition by list (id) (") + for i := 0; i < num; i++ { + if i > 0 { + buf.WriteString(",") + } + buf.WriteString(fmt.Sprintf("partition p%v values in (%v)", i, i)) + } + buf.WriteString(")") + return buf.String() +} + +func (s *testIntegrationSuite1) TestCreateTableWithListPartition(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + type errorCase struct { + sql string + err *terror.Error + } + cases := []errorCase{ + { + "create table t (id int) partition by list (id);", + ast.ErrPartitionsMustBeDefined, + }, + { + "create table t (a int) partition by list (b) (partition p0 values in (1));", + ddl.ErrBadField, + }, + { + "create table t (id timestamp) partition by list (id) (partition p0 values in ('2019-01-09 11:23:34'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (id decimal) partition by list (id) (partition p0 values in ('2019-01-09 11:23:34'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (id float) partition by list (id) (partition p0 values in (1));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id double) partition by list (id) (partition p0 values in (1));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id text) partition by list (id) (partition p0 values in ('abc'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (id blob) partition by list (id) (partition p0 values in ('abc'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (id enum('a','b')) partition by list (id) (partition p0 values in ('a'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (id set('a','b')) partition by list (id) (partition p0 values in ('a'));", + ddl.ErrValuesIsNotIntType, + }, + { + "create table t (a int) partition by list (a) (partition p0 values in (1), partition p0 values in (2));", + ddl.ErrSameNamePartition, + }, + { + "create table t (a int) partition by list (a) (partition p0 values in (1), partition P0 values in (2));", + ddl.ErrSameNamePartition, + }, + { + "create table t (id bigint) partition by list (cast(id as unsigned)) (partition p0 values in (1))", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "create table t (id float) partition by list (ceiling(id)) (partition p0 values in (1))", + ddl.ErrPartitionFuncNotAllowed, + }, + { + "create table t(b char(10)) partition by range columns (b) (partition p1 values less than ('G' collate utf8mb4_unicode_ci));", + ddl.ErrPartitionFunctionIsNotAllowed, + }, + { + "create table t (a date) partition by list (to_days(to_days(a))) (partition p0 values in (1), partition P1 values in (2));", + ddl.ErrWrongExprInPartitionFunc, + }, + { + "create table t (a int) partition by list (a) (partition p0 values in (1), partition p1 values in (1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a int) partition by list (a) (partition p0 values in (1), partition p1 values in (+1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a int) partition by list (a) (partition p0 values in (null), partition p1 values in (NULL));", + ddl.ErrMultipleDefConstInListPart, + }, + { + `create table t1 (id int key, name varchar(10), unique index idx(name)) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16) + );`, + ddl.ErrUniqueKeyNeedAllFieldsInPf, + }, + { + s.generatePartitionTableByNum(ddl.PartitionCountLimit + 1), + ddl.ErrTooManyPartitions, + }, + } + for i, t := range cases { + _, err := tk.Exec(t.sql) + c.Assert(t.err.Equal(err), IsTrue, Commentf( + "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", + i, t.sql, t.err, err, + )) + } + + validCases := []string{ + "create table t (a int) partition by list (a) (partition p0 values in (1));", + "create table t (a bigint unsigned) partition by list (a) (partition p0 values in (18446744073709551615));", + "create table t (a bigint unsigned) partition by list (a) (partition p0 values in (18446744073709551615 - 1));", + "create table t (a int) partition by list (a) (partition p0 values in (1,null));", + "create table t (a int) partition by list (a) (partition p0 values in (1), partition p1 values in (2));", + `create table t (id int, name varchar(10), age int) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,-14,18), + partition p3 values in (7,8,15,+16) + );`, + "create table t (id year) partition by list (id) (partition p0 values in (2000));", + "create table t (a tinyint) partition by list (a) (partition p0 values in (65536));", + "create table t (a tinyint) partition by list (a*100) (partition p0 values in (65536));", + "create table t (a bigint) partition by list (a) (partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')));", + "create table t (a datetime) partition by list (to_seconds(a)) (partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')));", + "create table t (a int, b int generated always as (a+1) virtual) partition by list (b + 1) (partition p0 values in (1));", + s.generatePartitionTableByNum(ddl.PartitionCountLimit), + } + + for _, sql := range validCases { + tk.MustExec("drop table if exists t") + tk.MustExec(sql) + tbl := testGetTableByName(c, s.ctx, "test", "t") + tblInfo := tbl.Meta() + c.Assert(tblInfo.Partition, NotNil) + c.Assert(tblInfo.Partition.Enable, Equals, true) + c.Assert(tblInfo.Partition.Type == model.PartitionTypeList, IsTrue) + } +} + +func (s *testIntegrationSuite1) TestCreateTableWithListColumnsPartition(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + type errorCase struct { + sql string + err *terror.Error + } + cases := []errorCase{ + { + "create table t (id int) partition by list columns (id);", + ast.ErrPartitionsMustBeDefined, + }, + { + "create table t (a int) partition by list columns (b) (partition p0 values in (1));", + ddl.ErrFieldNotFoundPart, + }, + { + "create table t (id timestamp) partition by list columns (id) (partition p0 values in ('2019-01-09 11:23:34'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id decimal) partition by list columns (id) (partition p0 values in ('2019-01-09 11:23:34'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id year) partition by list columns (id) (partition p0 values in (2000));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id float) partition by list columns (id) (partition p0 values in (1));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id double) partition by list columns (id) (partition p0 values in (1));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id text) partition by list columns (id) (partition p0 values in ('abc'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id blob) partition by list columns (id) (partition p0 values in ('abc'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id enum('a','b')) partition by list columns (id) (partition p0 values in ('a'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (id set('a','b')) partition by list columns (id) (partition p0 values in ('a'));", + ddl.ErrNotAllowedTypeInPartition, + }, + { + "create table t (a varchar(2)) partition by list columns (a) (partition p0 values in ('abc'));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a tinyint) partition by list columns (a) (partition p0 values in (65536));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a bigint) partition by list columns (a) (partition p0 values in (18446744073709551615));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a bigint unsigned) partition by list columns (a) (partition p0 values in (-1));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a char) partition by list columns (a) (partition p0 values in ('abc'));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a datetime) partition by list columns (a) (partition p0 values in ('2020-11-31 12:00:00'));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a int) partition by list columns (a) (partition p0 values in (1), partition p0 values in (2));", + ddl.ErrSameNamePartition, + }, + { + "create table t (a int) partition by list columns (a) (partition p0 values in (1), partition P0 values in (2));", + ddl.ErrSameNamePartition, + }, + { + "create table t (a int) partition by list columns (a) (partition p0 values in (1), partition p1 values in (1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a int) partition by list columns (a) (partition p0 values in (1), partition p1 values in (+1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a tinyint) partition by list columns (a) (partition p0 values in (1), partition p1 values in (+1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a mediumint) partition by list columns (a) (partition p0 values in (1), partition p1 values in (+1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a bigint) partition by list columns (a) (partition p0 values in (1), partition p1 values in (+1));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a bigint) partition by list columns (a) (partition p0 values in (1,+1))", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a int) partition by list columns (a) (partition p0 values in (null), partition p1 values in (NULL));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a bigint, b int) partition by list columns (a,b) (partition p0 values in ((1,2),(1,2)))", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a bigint, b int) partition by list columns (a,b) (partition p0 values in ((1,1),(2,2)), partition p1 values in ((+1,1)));", + ddl.ErrMultipleDefConstInListPart, + }, + { + `create table t1 (id int key, name varchar(10), unique index idx(name)) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16) + );`, + ddl.ErrUniqueKeyNeedAllFieldsInPf, + }, + { + "create table t (a date) partition by list columns (a) (partition p0 values in ('2020-02-02'), partition p1 values in ('20200202'));", + ddl.ErrMultipleDefConstInListPart, + }, + { + "create table t (a int, b varchar(10)) partition by list columns (a,b) (partition p0 values in (1));", + ast.ErrPartitionColumnList, + }, + { + "create table t (a int, b varchar(10)) partition by list columns (a,b) (partition p0 values in (('ab','ab')));", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a int, b datetime) partition by list columns (a,b) (partition p0 values in ((1)));", + ast.ErrPartitionColumnList, + }, + { + "create table t(b int) partition by hash ( b ) partitions 3 (partition p1, partition p2, partition p2);", + ddl.ErrSameNamePartition, + }, + } + for i, t := range cases { + _, err := tk.Exec(t.sql) + c.Assert(t.err.Equal(err), IsTrue, Commentf( + "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", + i, t.sql, t.err, err, + )) + } + + validCases := []string{ + "create table t (a int) partition by list columns (a) (partition p0 values in (1));", + "create table t (a bigint unsigned) partition by list columns (a) (partition p0 values in (18446744073709551615));", + "create table t (a bigint unsigned) partition by list columns (a) (partition p0 values in (18446744073709551615 - 1));", + "create table t (a int) partition by list columns (a) (partition p0 values in (1,null));", + "create table t (a int) partition by list columns (a) (partition p0 values in (1), partition p1 values in (2));", + `create table t (id int, name varchar(10), age int) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,-14,18), + partition p3 values in (7,8,15,+16) + );`, + "create table t (a datetime) partition by list columns (a) (partition p0 values in ('2020-09-28 17:03:38','2020-09-28 17:03:39'));", + "create table t (a date) partition by list columns (a) (partition p0 values in ('2020-09-28','2020-09-29'));", + "create table t (a bigint, b date) partition by list columns (a,b) (partition p0 values in ((1,'2020-09-28'),(1,'2020-09-29')));", + "create table t (a bigint) partition by list columns (a) (partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')));", + "create table t (a varchar(10)) partition by list columns (a) (partition p0 values in ('abc'));", + "create table t (a char) partition by list columns (a) (partition p0 values in ('a'));", + "create table t (a bool) partition by list columns (a) (partition p0 values in (1));", + "create table t (c1 bool, c2 tinyint, c3 int, c4 bigint, c5 datetime, c6 date,c7 varchar(10), c8 char) " + + "partition by list columns (c1,c2,c3,c4,c5,c6,c7,c8) (" + + "partition p0 values in ((1,2,3,4,'2020-11-30 00:00:01', '2020-11-30','abc','a')));", + "create table t (a int, b int generated always as (a+1) virtual) partition by list columns (b) (partition p0 values in (1));", + "create table t(a int,b char(10)) partition by list columns (a, b) (partition p1 values in ((2, 'a'), (1, 'b')), partition p2 values in ((2, 'b')));", + } + + for _, sql := range validCases { + tk.MustExec("drop table if exists t") + tk.MustExec(sql) + tbl := testGetTableByName(c, s.ctx, "test", "t") + tblInfo := tbl.Meta() + c.Assert(tblInfo.Partition, NotNil) + c.Assert(tblInfo.Partition.Enable, Equals, true) + c.Assert(tblInfo.Partition.Type == model.PartitionTypeList, IsTrue) + } +} + +func (s *testIntegrationSuite5) TestAlterTableAddPartitionByList(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int) partition by list (id) ( + partition p0 values in (1,2), + partition p1 values in (3,4), + partition p3 values in (5,null) + );`) + tk.MustExec(`alter table t add partition ( + partition p4 values in (7), + partition p5 values in (8,9));`) + + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + + c.Assert(part.Expr, Equals, "`id`") + c.Assert(part.Definitions, HasLen, 5) + c.Assert(part.Definitions[0].InValues, DeepEquals, [][]string{{"1"}, {"2"}}) + c.Assert(part.Definitions[0].Name, Equals, model.NewCIStr("p0")) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"3"}, {"4"}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p1")) + c.Assert(part.Definitions[2].InValues, DeepEquals, [][]string{{"5"}, {"NULL"}}) + c.Assert(part.Definitions[2].Name, Equals, model.NewCIStr("p3")) + c.Assert(part.Definitions[3].InValues, DeepEquals, [][]string{{"7"}}) + c.Assert(part.Definitions[3].Name, Equals, model.NewCIStr("p4")) + c.Assert(part.Definitions[4].InValues, DeepEquals, [][]string{{"8"}, {"9"}}) + c.Assert(part.Definitions[4].Name, Equals, model.NewCIStr("p5")) + + errorCases := []struct { + sql string + err *terror.Error + }{ + {"alter table t add partition (partition p4 values in (7))", + ddl.ErrSameNamePartition, + }, + {"alter table t add partition (partition p6 values less than (7))", + ast.ErrPartitionWrongValues, + }, + {"alter table t add partition (partition p6 values in (null))", + ddl.ErrMultipleDefConstInListPart, + }, + {"alter table t add partition (partition p6 values in (7))", + ddl.ErrMultipleDefConstInListPart, + }, + {"alter table t add partition (partition p6 values in ('a'))", + ddl.ErrValuesIsNotIntType, + }, + {"alter table t add partition (partition p5 values in (10),partition p6 values in (7))", + ddl.ErrSameNamePartition, + }, + } + + for i, t := range errorCases { + _, err := tk.Exec(t.sql) + c.Assert(t.err.Equal(err), IsTrue, Commentf( + "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", + i, t.sql, t.err, err, + )) + } + + errorCases2 := []struct { + create string + alter string + err *terror.Error + }{ + { + "create table t (a bigint unsigned) partition by list columns (a) (partition p0 values in (1));", + "alter table t add partition (partition p1 values in (-1))", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a varchar(2)) partition by list columns (a) (partition p0 values in ('a','b'));", + "alter table t add partition (partition p1 values in ('abc'))", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a tinyint) partition by list columns (a) (partition p0 values in (1,2,3));", + "alter table t add partition (partition p1 values in (65536))", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a bigint) partition by list columns (a) (partition p0 values in (1,2,3));", + "alter table t add partition (partition p1 values in (18446744073709551615))", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a char) partition by list columns (a) (partition p0 values in ('a','b'));", + "alter table t add partition (partition p1 values in ('abc'))", + ddl.ErrWrongTypeColumnValue, + }, + { + "create table t (a datetime) partition by list columns (a) (partition p0 values in ('2020-11-30 12:00:00'));", + "alter table t add partition (partition p1 values in ('2020-11-31 12:00:00'))", + ddl.ErrWrongTypeColumnValue, + }, + } + + for i, t := range errorCases2 { + tk.MustExec("drop table if exists t;") + tk.MustExec(t.create) + _, err := tk.Exec(t.alter) + c.Assert(t.err.Equal(err), IsTrue, Commentf( + "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", + i, t.alter, t.err, err, + )) + } +} + +func (s *testIntegrationSuite5) TestAlterTableAddPartitionByListColumns(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int, name varchar(10)) partition by list columns (id,name) ( + partition p0 values in ((1,'a'),(2,'b')), + partition p1 values in ((3,'a'),(4,'b')), + partition p3 values in ((5,null)) + );`) + tk.MustExec(`alter table t add partition ( + partition p4 values in ((7,'a')), + partition p5 values in ((8,'a')));`) + + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + + c.Assert(part.Expr, Equals, "") + c.Assert(part.Columns[0].O, Equals, "id") + c.Assert(part.Columns[1].O, Equals, "name") + c.Assert(part.Definitions, HasLen, 5) + c.Assert(part.Definitions[0].InValues, DeepEquals, [][]string{{"1", `"a"`}, {"2", `"b"`}}) + c.Assert(part.Definitions[0].Name, Equals, model.NewCIStr("p0")) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"3", `"a"`}, {"4", `"b"`}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p1")) + c.Assert(part.Definitions[2].InValues, DeepEquals, [][]string{{"5", `NULL`}}) + c.Assert(part.Definitions[2].Name, Equals, model.NewCIStr("p3")) + c.Assert(part.Definitions[3].InValues, DeepEquals, [][]string{{"7", `"a"`}}) + c.Assert(part.Definitions[3].Name, Equals, model.NewCIStr("p4")) + c.Assert(part.Definitions[4].InValues, DeepEquals, [][]string{{"8", `"a"`}}) + c.Assert(part.Definitions[4].Name, Equals, model.NewCIStr("p5")) + + errorCases := []struct { + sql string + err *terror.Error + }{ + {"alter table t add partition (partition p4 values in ((7,'b')))", + ddl.ErrSameNamePartition, + }, + {"alter table t add partition (partition p6 values less than ((7,'a')))", + ast.ErrPartitionWrongValues, + }, + {"alter table t add partition (partition p6 values in ((5,null)))", + ddl.ErrMultipleDefConstInListPart, + }, + {"alter table t add partition (partition p6 values in ((7,'a')))", + ddl.ErrMultipleDefConstInListPart, + }, + {"alter table t add partition (partition p6 values in (('a','a')))", + ddl.ErrWrongTypeColumnValue, + }, + } + + for i, t := range errorCases { + _, err := tk.Exec(t.sql) + c.Assert(t.err.Equal(err), IsTrue, Commentf( + "case %d fail, sql = `%s`\nexpected error = `%v`\n actual error = `%v`", + i, t.sql, t.err, err, + )) + } +} + +func (s *testIntegrationSuite5) TestAlterTableDropPartitionByList(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int) partition by list (id) ( + partition p0 values in (1,2), + partition p1 values in (3,4), + partition p3 values in (5,null) + );`) + tk.MustExec(`insert into t values (1),(3),(5),(null)`) + tk.MustExec(`alter table t drop partition p1`) + tk.MustQuery("select * from t").Check(testkit.Rows("1", "5", "")) + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + c.Assert(part.Expr, Equals, "`id`") + c.Assert(part.Definitions, HasLen, 2) + c.Assert(part.Definitions[0].InValues, DeepEquals, [][]string{{"1"}, {"2"}}) + c.Assert(part.Definitions[0].Name, Equals, model.NewCIStr("p0")) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"5"}, {"NULL"}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p3")) + + sql := "alter table t drop partition p10;" + tk.MustGetErrCode(sql, tmysql.ErrDropPartitionNonExistent) + tk.MustExec(`alter table t drop partition p3`) + tk.MustQuery("select * from t").Check(testkit.Rows("1")) + sql = "alter table t drop partition p0;" + tk.MustGetErrCode(sql, tmysql.ErrDropLastPartition) +} + +func (s *testIntegrationSuite5) TestAlterTableDropPartitionByListColumns(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int, name varchar(10)) partition by list columns (id,name) ( + partition p0 values in ((1,'a'),(2,'b')), + partition p1 values in ((3,'a'),(4,'b')), + partition p3 values in ((5,'a'),(null,null)) + );`) + tk.MustExec(`insert into t values (1,'a'),(3,'a'),(5,'a'),(null,null)`) + tk.MustExec(`alter table t drop partition p1`) + tk.MustQuery("select * from t").Check(testkit.Rows("1 a", "5 a", " ")) + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + c.Assert(part.Expr, Equals, "") + c.Assert(part.Columns[0].O, Equals, "id") + c.Assert(part.Columns[1].O, Equals, "name") + c.Assert(part.Definitions, HasLen, 2) + c.Assert(part.Definitions[0].InValues, DeepEquals, [][]string{{"1", `"a"`}, {"2", `"b"`}}) + c.Assert(part.Definitions[0].Name, Equals, model.NewCIStr("p0")) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"5", `"a"`}, {"NULL", "NULL"}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p3")) + + sql := "alter table t drop partition p10;" + tk.MustGetErrCode(sql, tmysql.ErrDropPartitionNonExistent) + tk.MustExec(`alter table t drop partition p3`) + tk.MustQuery("select * from t").Check(testkit.Rows("1 a")) + sql = "alter table t drop partition p0;" + tk.MustGetErrCode(sql, tmysql.ErrDropLastPartition) +} + +func (s *testIntegrationSuite5) TestAlterTableTruncatePartitionByList(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int) partition by list (id) ( + partition p0 values in (1,2), + partition p1 values in (3,4), + partition p3 values in (5,null) + );`) + tk.MustExec(`insert into t values (1),(3),(5),(null)`) + oldTbl := testGetTableByName(c, tk.Se, "test", "t") + tk.MustExec(`alter table t truncate partition p1`) + tk.MustQuery("select * from t").Check(testkit.Rows("1", "5", "")) + tbl := testGetTableByName(c, tk.Se, "test", "t") + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + c.Assert(part.Definitions, HasLen, 3) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"3"}, {"4"}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p1")) + c.Assert(part.Definitions[1].ID == oldTbl.Meta().Partition.Definitions[1].ID, IsFalse) + + sql := "alter table t truncate partition p10;" + tk.MustGetErrCode(sql, tmysql.ErrUnknownPartition) + tk.MustExec(`alter table t truncate partition p3`) + tk.MustQuery("select * from t").Check(testkit.Rows("1")) + tk.MustExec(`alter table t truncate partition p0`) + tk.MustQuery("select * from t").Check(testkit.Rows()) +} + +func (s *testIntegrationSuite5) TestAlterTableTruncatePartitionByListColumns(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`create table t (id int, name varchar(10)) partition by list columns (id,name) ( + partition p0 values in ((1,'a'),(2,'b')), + partition p1 values in ((3,'a'),(4,'b')), + partition p3 values in ((5,'a'),(null,null)) + );`) + tk.MustExec(`insert into t values (1,'a'),(3,'a'),(5,'a'),(null,null)`) + oldTbl := testGetTableByName(c, tk.Se, "test", "t") + tk.MustExec(`alter table t truncate partition p1`) + tk.MustQuery("select * from t").Check(testkit.Rows("1 a", "5 a", " ")) + tbl := testGetTableByName(c, tk.Se, "test", "t") + c.Assert(tbl.Meta().Partition, NotNil) + part := tbl.Meta().Partition + c.Assert(part.Type == model.PartitionTypeList, IsTrue) + c.Assert(part.Definitions, HasLen, 3) + c.Assert(part.Definitions[1].InValues, DeepEquals, [][]string{{"3", `"a"`}, {"4", `"b"`}}) + c.Assert(part.Definitions[1].Name, Equals, model.NewCIStr("p1")) + c.Assert(part.Definitions[1].ID == oldTbl.Meta().Partition.Definitions[1].ID, IsFalse) + + sql := "alter table t truncate partition p10;" + tk.MustGetErrCode(sql, tmysql.ErrUnknownPartition) + tk.MustExec(`alter table t truncate partition p3`) + tk.MustQuery("select * from t").Check(testkit.Rows("1 a")) + tk.MustExec(`alter table t truncate partition p0`) + tk.MustQuery("select * from t").Check(testkit.Rows()) } func (s *testIntegrationSuite3) TestCreateTableWithKeyPartition(c *C) { @@ -818,6 +1580,44 @@ func (s *testIntegrationSuite5) TestMultiPartitionDropAndTruncate(c *C) { result.Check(testkit.Rows(`2010`)) } +func (s *testIntegrationSuite7) TestDropPartitionWithGlobalIndex(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableGlobalIndex = true + }) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists test_global") + tk.MustExec(`create table test_global ( a int, b int, c int) + partition by range( a ) ( + partition p1 values less than (10), + partition p2 values less than (20) + );`) + t := testGetTableByName(c, s.ctx, "test", "test_global") + pid := t.Meta().Partition.Definitions[1].ID + + tk.MustExec("Alter Table test_global Add Unique Index idx_b (b);") + tk.MustExec("Alter Table test_global Add Unique Index idx_c (c);") + tk.MustExec(`INSERT INTO test_global VALUES (1, 1, 1), (2, 2, 2), (11, 3, 3), (12, 4, 4)`) + + tk.MustExec("alter table test_global drop partition p2;") + result := tk.MustQuery("select * from test_global;") + result.Sort().Check(testkit.Rows(`1 1 1`, `2 2 2`)) + + t = testGetTableByName(c, s.ctx, "test", "test_global") + idxInfo := t.Meta().FindIndexByName("idx_b") + c.Assert(idxInfo, NotNil) + cnt := checkGlobalIndexCleanUpDone(c, s.ctx, t.Meta(), idxInfo, pid) + c.Assert(cnt, Equals, 2) + + idxInfo = t.Meta().FindIndexByName("idx_c") + c.Assert(idxInfo, NotNil) + cnt = checkGlobalIndexCleanUpDone(c, s.ctx, t.Meta(), idxInfo, pid) + c.Assert(cnt, Equals, 2) + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableGlobalIndex = false + }) +} + func (s *testIntegrationSuite7) TestAlterTableExchangePartition(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -836,6 +1636,15 @@ func (s *testIntegrationSuite7) TestAlterTableExchangePartition(c *C) { id INT NOT NULL );`) tk.MustExec(`INSERT INTO e VALUES (1669),(337),(16),(2005)`) + // test disable exchange partition + tk.MustExec("ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 8200 Exchange Partition is disabled, please set 'tidb_enable_exchange_partition' if you need to need to enable it")) + tk.MustQuery("select * from e").Check(testkit.Rows("16", "1669", "337", "2005")) + tk.MustQuery("select * from e2").Check(testkit.Rows()) + + // enable exchange partition + tk.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk.MustExec("set @@tidb_enable_exchange_partition=0") tk.MustExec("ALTER TABLE e EXCHANGE PARTITION p0 WITH TABLE e2") tk.MustQuery("select * from e2").Check(testkit.Rows("16")) tk.MustQuery("select * from e").Check(testkit.Rows("1669", "337", "2005")) @@ -965,7 +1774,10 @@ func (s *testIntegrationSuite7) TestAlterTableExchangePartition(c *C) { // test for tiflash replica c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() tk.MustExec("create table e15 (a int) partition by hash(a) partitions 1;") tk.MustExec("create table e16 (a int)") @@ -1222,6 +2034,8 @@ func (s *testIntegrationSuite4) TestExchangePartitionTableCompatiable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + err := tk.Se.GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "1") + c.Assert(err, IsNil) for i, t := range cases { tk.MustExec(t.ptSQL) tk.MustExec(t.ntSQL) @@ -1235,11 +2049,18 @@ func (s *testIntegrationSuite4) TestExchangePartitionTableCompatiable(c *C) { tk.MustExec(t.exchangeSQL) } } + err = tk.Se.GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "0") + c.Assert(err, IsNil) } func (s *testIntegrationSuite7) TestExchangePartitionExpressIndex(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk.MustExec("set @@tidb_enable_exchange_partition=0") tk.MustExec("drop table if exists pt1;") tk.MustExec("create table pt1(a int, b int, c int) PARTITION BY hash (a) partitions 1;") tk.MustExec("alter table pt1 add index idx((a+c));") @@ -1303,7 +2124,7 @@ func (s *testIntegrationSuite4) TestAddPartitionTooManyPartitions(c *C) { func checkPartitionDelRangeDone(c *C, s *testIntegrationSuite, partitionPrefix kv.Key) bool { hasOldPartitionData := true for i := 0; i < waitForCleanDataRound; i++ { - err := kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { it, err := txn.Iter(partitionPrefix, nil) if err != nil { return err @@ -1698,6 +2519,7 @@ func (s *testIntegrationSuite5) TestPartitionUniqueKeyNeedAllFieldsInPf(c *C) { )` tk.MustGetErrCode(sql10, tmysql.ErrUniqueKeyNeedAllFieldsInPf) + // after we support multiple columns partition, this sql should fail. For now, it will be a normal table. sql11 := `create table part9 ( a int not null, b int not null, @@ -1712,7 +2534,7 @@ func (s *testIntegrationSuite5) TestPartitionUniqueKeyNeedAllFieldsInPf(c *C) { partition p1 values less than (7, 9), partition p2 values less than (11, 22) )` - tk.MustGetErrCode(sql11, tmysql.ErrUniqueKeyNeedAllFieldsInPf) + tk.MustExec(sql11) sql12 := `create table part12 (a varchar(20), b binary, unique index (a(5))) partition by range columns (a) ( partition p0 values less than ('aaaaa'), @@ -1930,7 +2752,10 @@ func backgroundExecOnJobUpdatedExported(c *C, store kv.Storage, ctx sessionctx.C return } t := testGetTableByName(c, ctx, "test_db", "t1") - for _, index := range t.WritableIndices() { + for _, index := range t.Indices() { + if !tables.IsIndexWritable(index) { + continue + } if index.Meta().Name.L == idxName { c3IdxInfo = index.Meta() } @@ -2037,7 +2862,7 @@ func testPartitionAddIndex(tk *testkit.TestKit, c *C, key string) { idxName1 := "idx1" f := func(end int, isPK bool) string { - dml := fmt.Sprintf("insert into partition_add_idx values") + dml := "insert into partition_add_idx values" for i := 0; i < end; i++ { dVal := 1988 + rand.Intn(30) if isPK { @@ -2110,7 +2935,7 @@ func (s *testIntegrationSuite5) TestDropSchemaWithPartitionTable(c *C) { row := rows[0] c.Assert(row.GetString(3), Equals, "drop schema") jobID := row.GetInt64(0) - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) historyJob, err := t.GetHistoryDDLJob(jobID) c.Assert(err, IsNil) @@ -2121,6 +2946,7 @@ func (s *testIntegrationSuite5) TestDropSchemaWithPartitionTable(c *C) { c.Assert(len(tableIDs), Equals, 3) return nil }) + c.Assert(err, IsNil) // check records num after drop database. for i := 0; i < waitForCleanDataRound; i++ { @@ -2140,9 +2966,8 @@ func getPartitionTableRecordsNum(c *C, ctx sessionctx.Context, tbl table.Partiti for _, def := range info.Definitions { pid := def.ID partition := tbl.(table.PartitionedTable).GetPartition(pid) - startKey := partition.RecordKey(kv.IntHandle(math.MinInt64)) c.Assert(ctx.NewTxn(context.Background()), IsNil) - err := partition.IterRecords(ctx, startKey, partition.Cols(), + err := tables.IterRecords(partition, ctx, partition.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { num++ return true, nil @@ -2368,6 +3193,8 @@ func (s *testIntegrationSuite7) TestCommitWhenSchemaChange(c *C) { )`) tk2 := testkit.NewTestKit(c, s.store) tk2.MustExec("use test") + tk2.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk2.MustExec("set @@tidb_enable_exchange_partition=0") tk.MustExec("begin") tk.MustExec("insert into schema_change values (1, '2019-12-25 13:27:42')") @@ -2419,3 +3246,120 @@ func (s *testIntegrationSuite7) TestCommitWhenSchemaChange(c *C) { tk.MustExec("admin check table nt") tk.MustQuery("select * from nt").Check(testkit.Rows()) } + +func (s *testIntegrationSuite7) TestCreatePartitionTableWithWrongType(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + var err error + _, err = tk.Exec(`create table t( + b int(10) + ) partition by range columns (b) ( + partition p0 values less than (0x10), + partition p3 values less than (0x20) + )`) + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec(`create table t( + b int(10) + ) partition by range columns (b) ( + partition p0 values less than ('g'), + partition p3 values less than ('k') + )`) + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec(`create table t( + b char(10) + ) partition by range columns (b) ( + partition p0 values less than (30), + partition p3 values less than (60) + )`) + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec(`create table t( + b datetime + ) partition by range columns (b) ( + partition p0 values less than ('g'), + partition p3 values less than ('m') + )`) + c.Assert(err, NotNil) +} + +func (s *testIntegrationSuite7) TestAddPartitionForTableWithWrongType(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop tables if exists t_int, t_char, t_date") + tk.MustExec(`create table t_int(b int(10)) + partition by range columns (b) ( + partition p0 values less than (10) + )`) + + tk.MustExec(`create table t_char(b char(10)) + partition by range columns (b) ( + partition p0 values less than ('a') + )`) + + tk.MustExec(`create table t_date(b datetime) + partition by range columns (b) ( + partition p0 values less than ('2020-09-01') + )`) + + var err error + + _, err = tk.Exec("alter table t_int add partition (partition p1 values less than ('g'))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_int add partition (partition p1 values less than (0x20))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_char add partition (partition p1 values less than (0x20))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_char add partition (partition p1 values less than (10))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_date add partition (partition p1 values less than ('m'))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_date add partition (partition p1 values less than (0x20))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) + + _, err = tk.Exec("alter table t_date add partition (partition p1 values less than (20))") + c.Assert(err, NotNil) + c.Assert(ddl.ErrWrongTypeColumnValue.Equal(err), IsTrue) +} + +func (s *testIntegrationSuite7) TestPartitionListWithTimeType(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("create table t_list1(a date) partition by list columns (a) (partition p0 values in ('2010-02-02', '20180203'), partition p1 values in ('20200202'));") + tk.MustExec("insert into t_list1(a) values (20180203);") + tk.MustQuery(`select * from t_list1 partition (p0);`).Check(testkit.Rows("2018-02-03")) +} + +func (s *testIntegrationSuite7) TestPartitionListWithNewCollation(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustGetErrCode(`create table t (a char(10) collate utf8mb4_general_ci) partition by list columns (a) (partition p0 values in ('a', 'A'));`, mysql.ErrMultipleDefConstInListPart) + tk.MustExec("create table t11(a char(10) collate utf8mb4_general_ci) partition by list columns (a) (partition p0 values in ('a', 'b'), partition p1 values in ('C', 'D'));") + tk.MustExec("insert into t11(a) values ('A'), ('c'), ('C'), ('d'), ('B');") + tk.MustQuery(`select * from t11 order by a;`).Check(testkit.Rows("A", "B", "c", "C", "d")) + tk.MustQuery(`select * from t11 partition (p0);`).Check(testkit.Rows("A", "B")) + tk.MustQuery(`select * from t11 partition (p1);`).Check(testkit.Rows("c", "C", "d")) + str := tk.MustQuery(`desc select * from t11 where a = 'b';`).Rows()[0][3].(string) + c.Assert(strings.Contains(str, "partition:p0"), IsTrue) +} diff --git a/ddl/db_test.go b/ddl/db_test.go index 1e1848b44fcba..1f83765a48b47 100644 --- a/ddl/db_test.go +++ b/ddl/db_test.go @@ -45,8 +45,9 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" @@ -57,7 +58,6 @@ import ( "github.com/pingcap/tidb/util/domainutil" "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -116,14 +116,17 @@ func setUpSuite(s *testDBSuite, c *C) { _, err = s.s.Execute(context.Background(), "create database test_db") c.Assert(err, IsNil) - s.s.Execute(context.Background(), "set @@global.tidb_max_delta_schema_count= 4096") + _, err = s.s.Execute(context.Background(), "set @@global.tidb_max_delta_schema_count= 4096") + c.Assert(err, IsNil) } func tearDownSuite(s *testDBSuite, c *C) { - s.s.Execute(context.Background(), "drop database if exists test_db") + _, err := s.s.Execute(context.Background(), "drop database if exists test_db") + c.Assert(err, IsNil) s.s.Close() s.dom.Close() - s.store.Close() + err = s.store.Close() + c.Assert(err, IsNil) } func (s *testDBSuite) SetUpSuite(c *C) { @@ -179,7 +182,7 @@ func (s *testSerialDBSuite) TestAddIndexWithPK(c *C) { }) testAddIndexWithPK(tk, s, c) - tk.MustExec("set @@tidb_enable_clustered_index = 1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true testAddIndexWithPK(tk, s, c) } @@ -290,7 +293,7 @@ func (s *testDBSuite5) TestAddPrimaryKeyRollback1(c *C) { hasNullValsInKey := false idxName := "PRIMARY" addIdxSQL := "alter table t1 add primary key c3_index (c3);" - errMsg := "[kv:1062]Duplicate entry '' for key 'PRIMARY'" + errMsg := "[kv:1062]Duplicate entry '" + strconv.Itoa(defaultBatchSize*2-10) + "' for key 'PRIMARY'" testAddIndexRollback(c, s.store, s.lease, idxName, addIdxSQL, errMsg, hasNullValsInKey) } @@ -307,11 +310,14 @@ func (s *testDBSuite2) TestAddUniqueIndexRollback(c *C) { hasNullValsInKey := false idxName := "c3_index" addIdxSQL := "create unique index c3_index on t1 (c3)" - errMsg := "[kv:1062]Duplicate entry '' for key 'c3_index'" + errMsg := "[kv:1062]Duplicate entry '" + strconv.Itoa(defaultBatchSize*2-10) + "' for key 'c3_index'" testAddIndexRollback(c, s.store, s.lease, idxName, addIdxSQL, errMsg, hasNullValsInKey) } func (s *testSerialDBSuite) TestAddExpressionIndexRollback(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test_db") tk.MustExec("drop table if exists t1") @@ -323,7 +329,7 @@ func (s *testSerialDBSuite) TestAddExpressionIndexRollback(c *C) { _, checkErr = tk1.Exec("use test_db") d := s.dom.DDL() - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var currJob *model.Job ctx := mock.NewContext() ctx.Store = s.store @@ -352,7 +358,7 @@ func (s *testSerialDBSuite) TestAddExpressionIndexRollback(c *C) { txn, err := ctx.Txn(true) c.Assert(err, IsNil) m := meta.NewMeta(txn) - element, start, end, physicalID, err := m.GetDDLReorgHandle(currJob, false) + element, start, end, physicalID, err := m.GetDDLReorgHandle(currJob) c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) c.Assert(element, IsNil) c.Assert(start, IsNil) @@ -414,6 +420,10 @@ LOOP: // delete some rows, and add some data for i := count; i < count+step; i++ { n := rand.Intn(count) + // Don't delete this row, otherwise error message would change. + if n == defaultBatchSize*2-10 { + continue + } tk.MustExec("delete from t1 where c1 = ?", n) tk.MustExec("insert into t1 values (?, ?, ?)", i+10, i, i) } @@ -439,7 +449,7 @@ LOOP: func (s *testDBSuite5) TestCancelAddPrimaryKey(c *C) { idxName := "primary" addIdxSQL := "alter table t1 add primary key idx_c2 (c2);" - testCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL, "") + testCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL, "", s.dom) // Check the column's flag when the "add primary key" failed. tk := testkit.NewTestKit(c, s.store) @@ -455,14 +465,14 @@ func (s *testDBSuite5) TestCancelAddPrimaryKey(c *C) { func (s *testDBSuite3) TestCancelAddIndex(c *C) { idxName := "c3_index " addIdxSQL := "create unique index c3_index on t1 (c3)" - testCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL, "") + testCancelAddIndex(c, s.store, s.dom.DDL(), s.lease, idxName, addIdxSQL, "", s.dom) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test_db") tk.MustExec("drop table t1") } -func testCancelAddIndex(c *C, store kv.Storage, d ddl.DDL, lease time.Duration, idxName, addIdxSQL, sqlModeSQL string) { +func testCancelAddIndex(c *C, store kv.Storage, d ddl.DDL, lease time.Duration, idxName, addIdxSQL, sqlModeSQL string, dom *domain.Domain) { tk := testkit.NewTestKit(c, store) tk.MustExec("use test_db") tk.MustExec("drop table if exists t1") @@ -484,7 +494,7 @@ func testCancelAddIndex(c *C, store kv.Storage, d ddl.DDL, lease time.Duration, } var c3IdxInfo *model.IndexInfo - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: dom} originBatchSize := tk.MustQuery("select @@global.tidb_ddl_reorg_batch_size") // Set batch size to lower try to slow down add-index reorganization, This if for hook to cancel this ddl job. tk.MustExec("set @@global.tidb_ddl_reorg_batch_size = 32") @@ -550,7 +560,7 @@ func (s *testDBSuite4) TestCancelAddIndex1(c *C) { } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionAddIndex && job.State == model.JobStateRunning && job.SchemaState == model.StateWriteReorganization && job.SnapshotVer == 0 { jobIDs := []int64{job.ID} @@ -604,7 +614,7 @@ func (s *testDBSuite4) TestCancelDropPrimaryKey(c *C) { idxName := "primary" addIdxSQL := "alter table t add primary key idx_c2 (c2);" dropIdxSQL := "alter table t drop primary key;" - testCancelDropIndex(c, s.store, s.dom.DDL(), idxName, addIdxSQL, dropIdxSQL) + testCancelDropIndex(c, s.store, s.dom.DDL(), idxName, addIdxSQL, dropIdxSQL, s.dom) } // TestCancelDropIndex tests cancel ddl job which type is drop index. @@ -612,11 +622,11 @@ func (s *testDBSuite5) TestCancelDropIndex(c *C) { idxName := "idx_c2" addIdxSQL := "alter table t add index idx_c2 (c2);" dropIdxSQL := "alter table t drop index idx_c2;" - testCancelDropIndex(c, s.store, s.dom.DDL(), idxName, addIdxSQL, dropIdxSQL) + testCancelDropIndex(c, s.store, s.dom.DDL(), idxName, addIdxSQL, dropIdxSQL, s.dom) } // testCancelDropIndex tests cancel ddl job which type is drop index. -func testCancelDropIndex(c *C, store kv.Storage, d ddl.DDL, idxName, addIdxSQL, dropIdxSQL string) { +func testCancelDropIndex(c *C, store kv.Storage, d ddl.DDL, idxName, addIdxSQL, dropIdxSQL string, dom *domain.Domain) { tk := testkit.NewTestKit(c, store) tk.MustExec("use test_db") tk.MustExec("drop table if exists t") @@ -639,7 +649,7 @@ func testCancelDropIndex(c *C, store kv.Storage, d ddl.DDL, idxName, addIdxSQL, {true, model.JobStateRunning, model.StateDeleteReorganization, false}, } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: dom} var jobID int64 testCase := &testCases[0] hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -714,7 +724,7 @@ func (s *testDBSuite5) TestCancelTruncateTable(c *C) { s.mustExec(tk, c, "create table t(c1 int, c2 int)") defer s.mustExec(tk, c, "drop table t;") var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionTruncateTable && job.State == model.JobStateNone { jobIDs := []int64{job.ID} @@ -757,7 +767,7 @@ func (s *testDBSuite5) TestParallelDropSchemaAndDropTable(c *C) { s.mustExec(tk, c, "use test_drop_schema_table") s.mustExec(tk, c, "create table t(c1 int, c2 int)") var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} dbInfo := testGetSchemaByName(c, tk.Se, "test_drop_schema_table") done := false var wg sync.WaitGroup @@ -819,7 +829,7 @@ func (s *testDBSuite1) TestCancelRenameIndex(c *C) { } s.mustExec(tk, c, "alter table t add index idx_c2(c2)") var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type == model.ActionRenameIndex && job.State == model.JobStateNone { jobIDs := []int64{job.ID} @@ -886,7 +896,7 @@ func (s *testDBSuite2) TestCancelDropTableAndSchema(c *C) { {true, model.ActionDropSchema, model.JobStateRunning, model.StateDeleteOnly, false}, } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var jobID int64 testCase := &testCases[0] s.mustExec(tk, c, "create database if not exists test_drop_db") @@ -1050,7 +1060,7 @@ func (s *testDBSuite6) TestAddMultiColumnsIndexClusterIndex(c *C) { tk.MustExec("create database test_add_multi_col_index_clustered;") tk.MustExec("use test_add_multi_col_index_clustered;") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a int, b varchar(10), c int, primary key (a, b));") tk.MustExec("insert into t values (1, '1', 1), (2, '2', NULL), (3, '3', 3);") tk.MustExec("create index idx on t (a, c);") @@ -1130,7 +1140,11 @@ func (s *testDBSuite4) TestAddIndex4(c *C) { partition p4 values less than maxvalue)`, "") } -func (s *testDBSuite5) TestAddIndex5(c *C) { +func (s *testSerialDBSuite) TestAddIndex5(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.AlterPrimaryKey = false + }) testAddIndex(c, s.store, s.lease, testClusteredIndex, `create table test_add_index (c1 bigint, c2 bigint, c3 bigint, primary key(c2, c3))`, "") } @@ -1150,7 +1164,7 @@ func testAddIndex(c *C, store kv.Storage, lease time.Duration, tp testAddIndexTy case testPartition: tk.MustExec("set @@session.tidb_enable_table_partition = '1';") case testClusteredIndex: - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true } tk.MustExec("drop table if exists test_add_index") tk.MustExec(createTableSQL) @@ -1251,8 +1265,7 @@ LOOP: c.Assert(ctx.NewTxn(context.Background()), IsNil) t := testGetTableByName(c, ctx, "test_db", "test_add_index") handles := kv.NewHandleMap() - startKey := t.RecordKey(kv.IntHandle(math.MinInt64)) - err := t.IterRecords(ctx, startKey, t.Cols(), + err := tables.IterRecords(t, ctx, t.Cols(), func(h kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { handles.Set(h, struct{}{}) return true, nil @@ -1276,7 +1289,8 @@ LOOP: c.Assert(nidx.Meta().ID, Greater, int64(0)) txn, err := ctx.Txn(true) c.Assert(err, IsNil) - txn.Rollback() + err = txn.Rollback() + c.Assert(err, IsNil) c.Assert(ctx.NewTxn(context.Background()), IsNil) @@ -1292,7 +1306,7 @@ LOOP: c.Assert(err, IsNil) _, ok := handles.Get(h) - c.Assert(ok, IsTrue) + c.Assert(ok, IsTrue, Commentf("handle: %v", h.String())) handles.Delete(h) } c.Assert(handles.Len(), Equals, 0) @@ -1328,7 +1342,7 @@ func (s *testDBSuite1) TestCancelAddTableAndDropTablePartition(c *C) { {model.ActionAddTablePartition, model.JobStateRunning, model.StateReplicaOnly, true}, } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} testCase := &testCases[0] var jobID int64 hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -1499,7 +1513,7 @@ func (s *testDBSuite3) TestCancelDropColumn(c *C) { {true, model.JobStateRunning, model.StateDeleteReorganization, false}, } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var jobID int64 testCase := &testCases[0] hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -1606,7 +1620,7 @@ func (s *testDBSuite3) TestCancelDropColumns(c *C) { {true, model.JobStateRunning, model.StateDeleteReorganization, false}, } var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var jobID int64 testCase := &testCases[0] hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -1700,7 +1714,10 @@ func checkDelRangeDone(c *C, ctx sessionctx.Context, idx table.Index) { c.Assert(ctx.NewTxn(context.Background()), IsNil) txn, err := ctx.Txn(true) c.Assert(err, IsNil) - defer txn.Rollback() + defer func() { + err := txn.Rollback() + c.Assert(err, IsNil) + }() txn, err = ctx.Txn(true) c.Assert(err, IsNil) @@ -1732,6 +1749,35 @@ func checkDelRangeDone(c *C, ctx sessionctx.Context, idx table.Index) { c.Assert(handles, HasLen, 0, Commentf("take time %v", time.Since(startTime))) } +func checkGlobalIndexCleanUpDone(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, pid int64) int { + c.Assert(ctx.NewTxn(context.Background()), IsNil) + txn, err := ctx.Txn(true) + c.Assert(err, IsNil) + defer func() { + err := txn.Rollback() + c.Assert(err, IsNil) + }() + + cnt := 0 + prefix := tablecodec.EncodeTableIndexPrefix(tblInfo.ID, idxInfo.ID) + it, err := txn.Iter(prefix, nil) + c.Assert(err, IsNil) + for it.Valid() { + if !it.Key().HasPrefix(prefix) { + break + } + segs := tablecodec.SplitIndexValue(it.Value()) + c.Assert(segs.PartitionID, NotNil) + _, pi, err := codec.DecodeInt(segs.PartitionID) + c.Assert(err, IsNil) + c.Assert(pi, Not(Equals), pid) + cnt++ + err = it.Next() + c.Assert(err, IsNil) + } + return cnt +} + func (s *testDBSuite5) TestAlterPrimaryKey(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("create table test_add_pk(a int, b int unsigned , c varchar(255) default 'abc', d int as (a+b), e int as (a+1) stored, index idx(b))") @@ -1760,7 +1806,7 @@ func (s *testDBSuite5) TestAlterPrimaryKey(c *C) { " `a` int(11) NOT NULL,\n"+ " `b` int(11) NOT NULL,\n"+ " KEY `idx` (`a`),\n"+ - " PRIMARY KEY (`a`,`b`)\n"+ + " PRIMARY KEY (`a`,`b`) /*T![clustered_index] NONCLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustExec("alter table test_add_pk2 drop primary key") tk.MustQuery("desc test_add_pk2").Check(testutil.RowsWithSep(",", ""+ @@ -1850,7 +1896,8 @@ func (s *testDBSuite4) TestAddIndexWithDupCols(c *C) { // checkGlobalIndexRow reads one record from global index and check. Only support int handle. func checkGlobalIndexRow(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, indexInfo *model.IndexInfo, pid int64, idxVals []types.Datum, rowVals []types.Datum) { - ctx.NewTxn(context.Background()) + err := ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) txn, err := ctx.Txn(true) sc := ctx.GetSessionVars().StmtCtx c.Assert(err, IsNil) @@ -1859,15 +1906,6 @@ func checkGlobalIndexRow(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, for _, col := range tblInfo.Columns { tblColMap[col.ID] = &col.FieldType } - idxColInfos := make([]rowcodec.ColInfo, 0, len(indexInfo.Columns)) - for _, idxCol := range indexInfo.Columns { - col := tblInfo.Columns[idxCol.Offset] - idxColInfos = append(idxColInfos, rowcodec.ColInfo{ - ID: col.ID, - IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), - Ft: rowcodec.FieldTypeFromModelColumn(col), - }) - } // Check local index entry does not exist. localPrefix := tablecodec.EncodeTableIndexPrefix(pid, indexInfo.ID) @@ -1884,8 +1922,8 @@ func checkGlobalIndexRow(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, c.Assert(err, IsNil) value, err := txn.Get(context.Background(), key) c.Assert(err, IsNil) - colVals, err := tablecodec.DecodeIndexKV(key, value, len(indexInfo.Columns), - tablecodec.HandleDefault, idxColInfos) + idxColInfos := tables.BuildRowcodecColInfoForIndexColumns(indexInfo, tblInfo) + colVals, err := tablecodec.DecodeIndexKV(key, value, len(indexInfo.Columns), tablecodec.HandleDefault, idxColInfos) c.Assert(err, IsNil) c.Assert(colVals, HasLen, len(idxVals)+2) for i, val := range idxVals { @@ -1893,11 +1931,11 @@ func checkGlobalIndexRow(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, c.Assert(err, IsNil) c.Assert(d, DeepEquals, val) } - _, d, err := codec.DecodeOne(colVals[len(idxVals)+1]) //pid + _, d, err := codec.DecodeOne(colVals[len(idxVals)+1]) // pid c.Assert(err, IsNil) c.Assert(d.GetInt64(), Equals, pid) - _, d, err = codec.DecodeOne(colVals[len(idxVals)]) //handle + _, d, err = codec.DecodeOne(colVals[len(idxVals)]) // handle c.Assert(err, IsNil) h := kv.IntHandle(d.GetInt64()) rowKey := tablecodec.EncodeRowKey(pid, h.Encoded()) @@ -1914,8 +1952,8 @@ func checkGlobalIndexRow(c *C, ctx sessionctx.Context, tblInfo *model.TableInfo, func (s *testSerialDBSuite) TestAddGlobalIndex(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.AlterPrimaryKey = true conf.EnableGlobalIndex = true + conf.AlterPrimaryKey = true }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test_db") @@ -1932,7 +1970,8 @@ func (s *testSerialDBSuite) TestAddGlobalIndex(c *C) { c.Assert(indexInfo.Global, IsTrue) ctx := s.s.(sessionctx.Context) - ctx.NewTxn(context.Background()) + err := ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) txn, err := ctx.Txn(true) c.Assert(err, IsNil) @@ -1947,7 +1986,8 @@ func (s *testSerialDBSuite) TestAddGlobalIndex(c *C) { idxVals = []types.Datum{types.NewDatum(2)} rowVals = []types.Datum{types.NewDatum(2), types.NewDatum(11)} checkGlobalIndexRow(c, ctx, tblInfo, indexInfo, pid, idxVals, rowVals) - txn.Commit(context.Background()) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) // Test add global Primary Key index tk.MustExec("create table test_t2 (a int, b int) partition by range (b)" + @@ -1962,7 +2002,8 @@ func (s *testSerialDBSuite) TestAddGlobalIndex(c *C) { c.Assert(indexInfo, NotNil) c.Assert(indexInfo.Global, IsTrue) - ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) txn, err = ctx.Txn(true) c.Assert(err, IsNil) @@ -1978,10 +2019,8 @@ func (s *testSerialDBSuite) TestAddGlobalIndex(c *C) { rowVals = []types.Datum{types.NewDatum(2), types.NewDatum(11)} checkGlobalIndexRow(c, ctx, tblInfo, indexInfo, pid, idxVals, rowVals) - txn.Commit(context.Background()) - config.UpdateGlobal(func(conf *config.Config) { - conf.EnableGlobalIndex = false - }) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) } func (s *testDBSuite) showColumns(tk *testkit.TestKit, c *C, tableName string) [][]interface{} { @@ -2090,13 +2129,15 @@ LOOP: t := s.testGetTable(c, "t2") i := 0 j := 0 - ctx.NewTxn(context.Background()) + err = ctx.NewTxn(context.Background()) + c.Assert(err, IsNil) defer func() { if txn, err1 := ctx.Txn(true); err1 == nil { - txn.Rollback() + err := txn.Rollback() + c.Assert(err, IsNil) } }() - err = t.IterRecords(ctx, t.FirstKey(), t.Cols(), + err = tables.IterRecords(t, ctx, t.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { i++ // c4 must be -1 or > 0 @@ -2433,7 +2474,7 @@ func (s *testSerialDBSuite) TestCreateTableWithLike2(c *C) { tbl1 := testGetTableByName(c, s.s, "test_db", "t1") doneCh := make(chan error, 2) - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var onceChecker sync.Map hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type != model.ActionAddColumn && job.Type != model.ActionDropColumn && @@ -2497,7 +2538,10 @@ func (s *testSerialDBSuite) TestCreateTableWithLike2(c *C) { // Test for table has tiflash replica. c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) tk.MustExec("drop table if exists t1,t2;") @@ -2624,15 +2668,14 @@ func (s *testSerialDBSuite) TestCreateTable(c *C) { } func (s *testSerialDBSuite) TestRepairTable(c *C) { - // TODO: When AlterPrimaryKey is false, this test fails. Fix it later. - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.AlterPrimaryKey = true - }) c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/repairFetchCreateTable", `return(true)`), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/infoschema/repairFetchCreateTable"), IsNil) }() + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.AlterPrimaryKey = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t, other_table, origin") @@ -2718,7 +2761,7 @@ func (s *testSerialDBSuite) TestRepairTable(c *C) { // Repaired tableInfo has been filtered by `domain.InfoSchema()`, so get it in repairInfo. originTableInfo, _ := domainutil.RepairInfo.GetRepairedTableInfoByTableName("test", "origin") - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var repairErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if job.Type != model.ActionRepairTable { @@ -2767,7 +2810,7 @@ func (s *testSerialDBSuite) TestRepairTable(c *C) { // Exec the show create table statement to make sure new tableInfo has been set. result := tk.MustQuery("show create table origin") - c.Assert(result.Rows()[0][1], Equals, "CREATE TABLE `origin` (\n `a` int(11) NOT NULL AUTO_INCREMENT,\n `b` varchar(5) DEFAULT NULL,\n `c` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + c.Assert(result.Rows()[0][1], Equals, "CREATE TABLE `origin` (\n `a` int(11) NOT NULL AUTO_INCREMENT,\n `b` varchar(5) DEFAULT NULL,\n `c` int(11) DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] NONCLUSTERED */\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") } @@ -2916,6 +2959,35 @@ func (s *testDBSuite2) TestCreateTableWithSetCol(c *C) { tk.MustQuery("select * from t_set").Check(testkit.Rows("1,4,10,21")) } +func (s *testDBSuite2) TestCreateTableWithEnumCol(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + // It's for failure cases. + // The type of default value is string. + tk.MustExec("drop table if exists t_enum") + failedSQL := "create table t_enum (a enum('1', '4', '10') default '3');" + tk.MustGetErrCode(failedSQL, errno.ErrInvalidDefault) + failedSQL = "create table t_enum (a enum('1', '4', '10') default '');" + tk.MustGetErrCode(failedSQL, errno.ErrInvalidDefault) + // The type of default value is int. + failedSQL = "create table t_enum (a enum('1', '4', '10') default 0);" + tk.MustGetErrCode(failedSQL, errno.ErrInvalidDefault) + failedSQL = "create table t_enum (a enum('1', '4', '10') default 8);" + tk.MustGetErrCode(failedSQL, errno.ErrInvalidDefault) + + // The type of default value is int. + // It's for successful cases + tk.MustExec("drop table if exists t_enum") + tk.MustExec("create table t_enum (a enum('2', '3', '4') default 2);") + ret := tk.MustQuery("show create table t_enum").Rows()[0][1] + c.Assert(strings.Contains(ret.(string), "`a` enum('2','3','4') DEFAULT '3'"), IsTrue) + tk.MustExec("drop table t_enum") + tk.MustExec("create table t_enum (a enum('a', 'c', 'd') default 2);") + ret = tk.MustQuery("show create table t_enum").Rows()[0][1] + c.Assert(strings.Contains(ret.(string), "`a` enum('a','c','d') DEFAULT 'c'"), IsTrue) + tk.MustExec("insert into t_enum value()") + tk.MustQuery("select * from t_enum").Check(testkit.Rows("c")) +} + func (s *testDBSuite2) TestTableForeignKey(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -3080,7 +3152,7 @@ func (s *testSerialDBSuite) TestTruncateTable(c *C) { tablePrefix := tablecodec.EncodeTablePrefix(oldTblID) hasOldTableData := true for i := 0; i < waitForCleanDataRound; i++ { - err = kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { it, err1 := txn.Iter(tablePrefix, nil) if err1 != nil { return err1 @@ -3103,7 +3175,10 @@ func (s *testSerialDBSuite) TestTruncateTable(c *C) { // Test for truncate table should clear the tiflash available status. c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err = failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() tk.MustExec("drop table if exists t1;") tk.MustExec("create table t1 (a int);") @@ -3272,14 +3347,108 @@ func (s *testDBSuite1) TestRenameMultiTables(c *C) { tk.MustExec("use test") tk.MustExec("create table t1(id int)") tk.MustExec("create table t2(id int)") - // Currently it will fail only. - sql := fmt.Sprintf("rename table t1 to t3, t2 to t4") + sql := "rename table t1 to t3, t2 to t4" _, err := tk.Exec(sql) - c.Assert(err, NotNil) - originErr := errors.Cause(err) - c.Assert(originErr.Error(), Equals, "can't run multi schema change") + c.Assert(err, IsNil) + + tk.MustExec("drop table t3, t4") + + tk.MustExec("create table t1 (c1 int, c2 int)") + tk.MustExec("create table t2 (c1 int, c2 int)") + tk.MustExec("insert t1 values (1, 1), (2, 2)") + tk.MustExec("insert t2 values (1, 1), (2, 2)") + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + oldTblInfo1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + oldTblID1 := oldTblInfo1.Meta().ID + oldTblInfo2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + oldTblID2 := oldTblInfo2.Meta().ID + tk.MustExec("create database test1") + tk.MustExec("use test1") + tk.MustExec("rename table test.t1 to test1.t1, test.t2 to test1.t2") + is = domain.GetDomain(ctx).InfoSchema() + newTblInfo1, err := is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + c.Assert(newTblInfo1.Meta().ID, Equals, oldTblID1) + newTblInfo2, err := is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + c.Assert(newTblInfo2.Meta().ID, Equals, oldTblID2) + tk.MustQuery("select * from t1").Check(testkit.Rows("1 1", "2 2")) + tk.MustQuery("select * from t2").Check(testkit.Rows("1 1", "2 2")) - tk.MustExec("drop table t1, t2") + // Make sure t1,t2 doesn't exist. + isExist := is.TableExists(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(isExist, IsFalse) + isExist = is.TableExists(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(isExist, IsFalse) + + // for the same database + tk.MustExec("use test1") + tk.MustExec("rename table test1.t1 to test1.t3, test1.t2 to test1.t4") + is = domain.GetDomain(ctx).InfoSchema() + newTblInfo1, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t3")) + c.Assert(err, IsNil) + c.Assert(newTblInfo1.Meta().ID, Equals, oldTblID1) + newTblInfo2, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t4")) + c.Assert(err, IsNil) + c.Assert(newTblInfo2.Meta().ID, Equals, oldTblID2) + tk.MustQuery("select * from t3").Check(testkit.Rows("1 1", "2 2")) + isExist = is.TableExists(model.NewCIStr("test1"), model.NewCIStr("t1")) + c.Assert(isExist, IsFalse) + tk.MustQuery("select * from t4").Check(testkit.Rows("1 1", "2 2")) + isExist = is.TableExists(model.NewCIStr("test1"), model.NewCIStr("t2")) + c.Assert(isExist, IsFalse) + tk.MustQuery("show tables").Check(testkit.Rows("t3", "t4")) + + // for multi tables same database + tk.MustExec("create table t5 (c1 int, c2 int)") + tk.MustExec("insert t5 values (1, 1), (2, 2)") + is = domain.GetDomain(ctx).InfoSchema() + oldTblInfo3, err := is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t5")) + c.Assert(err, IsNil) + oldTblID3 := oldTblInfo3.Meta().ID + tk.MustExec("rename table test1.t3 to test1.t1, test1.t4 to test1.t2, test1.t5 to test1.t3") + is = domain.GetDomain(ctx).InfoSchema() + newTblInfo1, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + c.Assert(newTblInfo1.Meta().ID, Equals, oldTblID1) + newTblInfo2, err = is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + c.Assert(newTblInfo2.Meta().ID, Equals, oldTblID2) + newTblInfo3, err := is.TableByName(model.NewCIStr("test1"), model.NewCIStr("t3")) + c.Assert(err, IsNil) + c.Assert(newTblInfo3.Meta().ID, Equals, oldTblID3) + tk.MustQuery("show tables").Check(testkit.Rows("t1", "t2", "t3")) + + // for multi tables different databases + tk.MustExec("use test") + tk.MustExec("rename table test1.t1 to test.t2, test1.t2 to test.t3, test1.t3 to test.t4") + is = domain.GetDomain(ctx).InfoSchema() + newTblInfo1, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t2")) + c.Assert(err, IsNil) + c.Assert(newTblInfo1.Meta().ID, Equals, oldTblID1) + newTblInfo2, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t3")) + c.Assert(err, IsNil) + c.Assert(newTblInfo2.Meta().ID, Equals, oldTblID2) + newTblInfo3, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t4")) + c.Assert(err, IsNil) + c.Assert(newTblInfo3.Meta().ID, Equals, oldTblID3) + tk.MustQuery("show tables").Check(testkit.Rows("t2", "t3", "t4")) + + // for failure case + failSQL := "rename table test_not_exist.t to test_not_exist.t, test_not_exist.t to test_not_exist.t" + tk.MustGetErrCode(failSQL, errno.ErrFileNotFound) + failSQL = "rename table test.test_not_exist to test.test_not_exist, test.test_not_exist to test.test_not_exist" + tk.MustGetErrCode(failSQL, errno.ErrFileNotFound) + failSQL = "rename table test.t_not_exist to test_not_exist.t, test.t_not_exist to test_not_exist.t" + tk.MustGetErrCode(failSQL, errno.ErrFileNotFound) + failSQL = "rename table test1.t2 to test_not_exist.t, test1.t2 to test_not_exist.t" + tk.MustGetErrCode(failSQL, errno.ErrFileNotFound) + + tk.MustExec("drop database test1") + tk.MustExec("drop database test") } func (s *testDBSuite2) TestAddNotNullColumn(c *C) { @@ -3298,8 +3467,13 @@ out: c.Assert(err, IsNil) break out default: - tk.MustExec("update tnn set c2 = c2 + 1 where c1 = 99") - updateCnt++ + // Close issue #14636 + // Because add column action is not amendable now, it causes an error when the schema is changed + // in the process of an insert statement. + _, err := tk.Exec("update tnn set c2 = c2 + 1 where c1 = 99") + if err == nil { + updateCnt++ + } } } expected := fmt.Sprintf("%d %d", updateCnt, 3) @@ -3349,7 +3523,7 @@ func (s *testDBSuite3) TestGeneratedColumnDDL(c *C) { result.Check(testkit.Rows("table_with_gen_col_string CREATE TABLE `table_with_gen_col_string` (\n" + " `first_name` varchar(10) DEFAULT NULL,\n" + " `last_name` varchar(10) DEFAULT NULL,\n" + - " `full_name` varchar(255) GENERATED ALWAYS AS (concat(`first_name`, ' ', `last_name`)) VIRTUAL\n" + + " `full_name` varchar(255) GENERATED ALWAYS AS (concat(`first_name`, _utf8mb4' ', `last_name`)) VIRTUAL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustExec("alter table table_with_gen_col_string modify column full_name varchar(255) GENERATED ALWAYS AS (CONCAT(last_name,' ' ,first_name) ) VIRTUAL") @@ -3357,9 +3531,13 @@ func (s *testDBSuite3) TestGeneratedColumnDDL(c *C) { result.Check(testkit.Rows("table_with_gen_col_string CREATE TABLE `table_with_gen_col_string` (\n" + " `first_name` varchar(10) DEFAULT NULL,\n" + " `last_name` varchar(10) DEFAULT NULL,\n" + - " `full_name` varchar(255) GENERATED ALWAYS AS (concat(`last_name`, ' ', `first_name`)) VIRTUAL\n" + + " `full_name` varchar(255) GENERATED ALWAYS AS (concat(`last_name`, _utf8mb4' ', `first_name`)) VIRTUAL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) + // Test incorrect parameter count. + tk.MustGetErrCode("create table test_gv_incorrect_pc(a double, b int as (lower(a, 2)))", errno.ErrWrongParamcountToNativeFct) + tk.MustGetErrCode("create table test_gv_incorrect_pc(a double, b int as (lower(a, 2)) stored)", errno.ErrWrongParamcountToNativeFct) + genExprTests := []struct { stmt string err int @@ -3390,6 +3568,14 @@ func (s *testDBSuite3) TestGeneratedColumnDDL(c *C) { // Add stored generated column through alter table. {`alter table test_gv_ddl add column d int as (b+2) stored`, errno.ErrUnsupportedOnGeneratedColumn}, {`alter table test_gv_ddl modify column b int as (a + 8) stored`, errno.ErrUnsupportedOnGeneratedColumn}, + + // Add generated column with incorrect parameter count. + {`alter table test_gv_ddl add column z int as (lower(a, 2))`, errno.ErrWrongParamcountToNativeFct}, + {`alter table test_gv_ddl add column z int as (lower(a, 2)) stored`, errno.ErrWrongParamcountToNativeFct}, + + // Modify generated column with incorrect parameter count. + {`alter table test_gv_ddl modify column b int as (lower(a, 2))`, errno.ErrWrongParamcountToNativeFct}, + {`alter table test_gv_ddl change column b b int as (lower(a, 2))`, errno.ErrWrongParamcountToNativeFct}, } for _, tt := range genExprTests { tk.MustGetErrCode(tt.stmt, tt.err) @@ -3411,6 +3597,16 @@ func (s *testDBSuite3) TestGeneratedColumnDDL(c *C) { tk.MustExec(`alter table test_gv_ddl change column c cnew bigint`) result = tk.MustQuery(`DESC test_gv_ddl`) result.Check(testkit.Rows(`a int(11) YES `, `b bigint(20) YES VIRTUAL GENERATED`, `cnew bigint(20) YES `)) + + // Test generated column `\\`. + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t(c0 TEXT AS ('\\\\'));") + tk.MustExec("insert into t values ()") + tk.MustQuery("select * from t").Check(testkit.Rows("\\")) + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t(c0 TEXT AS ('a\\\\b\\\\c\\\\'))") + tk.MustExec("insert into t values ()") + tk.MustQuery("select * from t").Check(testkit.Rows("a\\b\\c\\")) } func (s *testDBSuite4) TestComment(c *C) { @@ -3655,7 +3851,7 @@ func (s *testDBSuite5) TestModifyColumnRollBack(c *C) { var c2 *table.Column var checkErr error - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} hook.OnJobUpdatedExported = func(job *model.Job) { if checkErr != nil { return @@ -3753,7 +3949,7 @@ func (s *testSerialDBSuite) TestModifyColumnnReorgInfo(c *C) { defer s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) // Check insert null before job first update. - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var checkErr error var currJob *model.Job var elements []*meta.Element @@ -3807,7 +4003,7 @@ func (s *testSerialDBSuite) TestModifyColumnnReorgInfo(c *C) { txn, err := ctx.Txn(true) c.Assert(err, IsNil) m := meta.NewMeta(txn) - e, start, end, physicalID, err := m.GetDDLReorgHandle(currJob, false) + e, start, end, physicalID, err := m.GetDDLReorgHandle(currJob) c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) c.Assert(e, IsNil) c.Assert(start, IsNil) @@ -3853,9 +4049,11 @@ func (s *testSerialDBSuite) TestModifyColumnNullToNotNullWithChangingVal2(c *C) c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/mockInsertValueAfterCheckNull", `return("insert into test.tt values (NULL, NULL)")`), IsNil) defer func() { tk.Se.GetSessionVars().EnableChangeColumnType = enableChangeColumnType - failpoint.Disable("github.com/pingcap/tidb/ddl/mockInsertValueAfterCheckNull") + err := failpoint.Disable("github.com/pingcap/tidb/ddl/mockInsertValueAfterCheckNull") + c.Assert(err, IsNil) }() + tk.MustExec("drop table if exists tt;") tk.MustExec(`create table tt (a bigint, b int, unique index idx(a));`) tk.MustExec("insert into tt values (1,1),(2,2),(3,3);") _, err := tk.Exec("alter table tt modify a int not null;") @@ -3877,6 +4075,65 @@ func (s *testSerialDBSuite) TestModifyColumnNullToNotNullWithChangingVal(c *C) { c.Assert(c2.FieldType.Tp, Equals, mysql.TypeTiny) } +func (s *testSerialDBSuite) TestModifyColumnBetweenStringTypes(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // varchar to varchar + tk.MustExec("drop table if exists tt;") + tk.MustExec("create table tt (a varchar(10));") + tk.MustExec("insert into tt values ('111'),('10000');") + tk.MustExec("alter table tt change a a varchar(5);") + c2 := getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Flen, Equals, 5) + tk.MustQuery("select * from tt").Check(testkit.Rows("111", "10000")) + tk.MustGetErrMsg("alter table tt change a a varchar(4);", "[types:1406]Data Too Long, field len 4, data len 5") + tk.MustExec("alter table tt change a a varchar(100);") + + // varchar to char + tk.MustExec("alter table tt change a a char(10);") + c2 = getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Tp, Equals, mysql.TypeString) + c.Assert(c2.FieldType.Flen, Equals, 10) + tk.MustQuery("select * from tt").Check(testkit.Rows("111", "10000")) + tk.MustGetErrMsg("alter table tt change a a char(4);", "[types:1406]Data Too Long, field len 4, data len 5") + + // char to text + tk.MustExec("alter table tt change a a text;") + c2 = getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Tp, Equals, mysql.TypeBlob) + + // text to set + tk.MustGetErrMsg("alter table tt change a a set('111', '2222');", "[types:1265]Data truncated for column 'a', value is 'KindString 10000'") + tk.MustExec("alter table tt change a a set('111', '10000');") + c2 = getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Tp, Equals, mysql.TypeSet) + tk.MustQuery("select * from tt").Check(testkit.Rows("111", "10000")) + + // set to set + tk.MustExec("alter table tt change a a set('10000', '111');") + c2 = getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Tp, Equals, mysql.TypeSet) + tk.MustQuery("select * from tt").Check(testkit.Rows("111", "10000")) + + // set to enum + tk.MustGetErrMsg("alter table tt change a a enum('111', '2222');", "[types:1265]Data truncated for column 'a', value is 'KindMysqlSet 10000'") + tk.MustExec("alter table tt change a a enum('111', '10000');") + c2 = getModifyColumn(c, s.s.(sessionctx.Context), "test", "tt", "a", false) + c.Assert(c2.FieldType.Tp, Equals, mysql.TypeEnum) + tk.MustQuery("select * from tt").Check(testkit.Rows("111", "10000")) + tk.MustExec("alter table tt change a a enum('10000', '111');") + tk.MustQuery("select * from tt where a = 1").Check(testkit.Rows("10000")) + tk.MustQuery("select * from tt where a = 2").Check(testkit.Rows("111")) + + // no-strict mode + tk.MustExec(`set @@sql_mode="";`) + tk.MustExec("alter table tt change a a enum('111', '2222');") + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1265|Data truncated for column 'a', value is 'KindMysqlEnum 10000'")) + + tk.MustExec("drop table tt;") +} + func getModifyColumn(c *C, ctx sessionctx.Context, db, tbl, colName string, allColumn bool) *table.Column { t := testGetTableByName(c, ctx, db, tbl) colName = strings.ToLower(colName) @@ -3918,7 +4175,7 @@ func testModifyColumnNullToNotNull(c *C, s *testDBSuite, enableChangeColumnType // Check insert null before job first update. times := 0 - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} tk.MustExec("delete from t1") var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { @@ -3991,7 +4248,7 @@ func (s *testDBSuite2) TestTransactionOnAddDropColumn(c *C) { originHook := s.dom.DDL().GetHook() defer s.dom.DDL().(ddl.DDLForTest).SetHook(originHook) - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -4047,7 +4304,7 @@ func (s *testDBSuite3) TestTransactionWithWriteOnlyColumn(c *C) { originHook := s.dom.DDL().GetHook() defer s.dom.DDL().(ddl.DDLForTest).SetHook(originHook) - hook := &ddl.TestDDLCallback{} + hook := &ddl.TestDDLCallback{Do: s.dom} var checkErr error hook.OnJobRunBeforeExported = func(job *model.Job) { if checkErr != nil { @@ -4117,7 +4374,7 @@ func (s *testDBSuite4) TestAddColumn2(c *C) { ctx := context.Background() err = tk.Se.NewTxn(ctx) c.Assert(err, IsNil) - oldRow, err := writeOnlyTable.RowWithCols(tk.Se, kv.IntHandle(1), writeOnlyTable.WritableCols()) + oldRow, err := tables.RowWithCols(writeOnlyTable, tk.Se, kv.IntHandle(1), writeOnlyTable.WritableCols()) c.Assert(err, IsNil) c.Assert(len(oldRow), Equals, 3) err = writeOnlyTable.RemoveRecord(tk.Se, kv.IntHandle(1), oldRow) @@ -4263,9 +4520,9 @@ func testAddIndexForGeneratedColumn(tk *testkit.TestKit, s *testSerialDBSuite, c } // NOTE: this test case contains a bug, it should be uncommented after the bug is fixed. // TODO: Fix bug https://github.com/pingcap/tidb/issues/12181 - //s.mustExec(c, "delete from t where y = 2155") - //s.mustExec(c, "alter table t add index idx_y(y1)") - //s.mustExec(c, "alter table t drop index idx_y") + // s.mustExec(c, "delete from t where y = 2155") + // s.mustExec(c, "alter table t add index idx_y(y1)") + // s.mustExec(c, "alter table t drop index idx_y") // Fix issue 9311. tk.MustExec("drop table if exists gcai_table") @@ -4292,7 +4549,7 @@ func (s *testSerialDBSuite) TestAddIndexForGeneratedColumn(c *C) { }) testAddIndexForGeneratedColumn(tk, s, c) - tk.MustExec("set @@tidb_enable_clustered_index = 1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true testAddIndexForGeneratedColumn(tk, s, c) } @@ -4514,6 +4771,301 @@ func (s *testSerialDBSuite) TestModifyColumnCharset(c *C) { } +func (s *testDBSuite1) TestModifyColumnTime(c *C) { + limit := variable.GetDDLErrorCountLimit() + variable.SetDDLErrorCountLimit(3) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + enableChangeColumnType := tk.Se.GetSessionVars().EnableChangeColumnType + tk.Se.GetSessionVars().EnableChangeColumnType = true + + // Set time zone to UTC. + originalTz := tk.Se.GetSessionVars().TimeZone + tk.Se.GetSessionVars().TimeZone = time.UTC + defer func() { + variable.SetDDLErrorCountLimit(limit) + tk.Se.GetSessionVars().EnableChangeColumnType = enableChangeColumnType + tk.Se.GetSessionVars().TimeZone = originalTz + }() + + now := time.Now().UTC() + now = time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, time.UTC) + timeToDate1 := now.Format("2006-01-02") + timeToDate2 := now.AddDate(0, 0, 30).Format("2006-01-02") + + timeToDatetime1 := now.Add(20 * time.Hour).Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToDatetime2 := now.Add(20 * time.Hour).Format("2006-01-02 15:04:05") + timeToDatetime3 := now.Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToDatetime4 := now.AddDate(0, 0, 30).Add(20 * time.Hour).Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToDatetime5 := now.AddDate(0, 0, 30).Add(20 * time.Hour).Format("2006-01-02 15:04:05") + + timeToTimestamp1 := now.Add(20 * time.Hour).Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToTimestamp2 := now.Add(20 * time.Hour).Format("2006-01-02 15:04:05") + timeToTimestamp3 := now.Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToTimestamp4 := now.AddDate(0, 0, 30).Add(20 * time.Hour).Add(12 * time.Second).Format("2006-01-02 15:04:05") + timeToTimestamp5 := now.AddDate(0, 0, 30).Add(20 * time.Hour).Format("2006-01-02 15:04:05") + currentYear := strconv.Itoa(time.Now().Year()) + + // 1. In conversion between date/time, fraction parts are taken into account + // Refer to doc: https://dev.mysql.com/doc/refman/5.7/en/date-and-time-type-conversion.html + // 2. Failed tests are commentd to pass unit-test + tests := []struct { + from string + value string + to string + expect string + err uint16 + }{ + // time to year, it's reasonable to return current year and discard the time (even if MySQL may get data out of range error). + {"time", `"30 20:00:12"`, "year", currentYear, 0}, + {"time", `"30 20:00"`, "year", currentYear, 0}, + {"time", `"30 20"`, "year", currentYear, 0}, + {"time", `"20:00:12"`, "year", currentYear, 0}, + {"time", `"20:00"`, "year", currentYear, 0}, + {"time", `"12"`, "year", currentYear, 0}, + {"time", `"200012"`, "year", currentYear, 0}, + {"time", `200012`, "year", currentYear, 0}, + {"time", `0012`, "year", currentYear, 0}, + {"time", `12`, "year", currentYear, 0}, + {"time", `"30 20:00:12.498"`, "year", currentYear, 0}, + {"time", `"20:00:12.498"`, "year", currentYear, 0}, + {"time", `"200012.498"`, "year", currentYear, 0}, + {"time", `200012.498`, "year", currentYear, 0}, + + // time to date + {"time", `"30 20:00:12"`, "date", timeToDate2, 0}, + {"time", `"30 20:00"`, "date", timeToDate2, 0}, + {"time", `"30 20"`, "date", timeToDate2, 0}, + {"time", `"20:00:12"`, "date", timeToDate1, 0}, + {"time", `"20:00"`, "date", timeToDate1, 0}, + {"time", `"12"`, "date", timeToDate1, 0}, + {"time", `"200012"`, "date", timeToDate1, 0}, + {"time", `200012`, "date", timeToDate1, 0}, + {"time", `0012`, "date", timeToDate1, 0}, + {"time", `12`, "date", timeToDate1, 0}, + {"time", `"30 20:00:12.498"`, "date", timeToDate2, 0}, + {"time", `"20:00:12.498"`, "date", timeToDate1, 0}, + {"time", `"200012.498"`, "date", timeToDate1, 0}, + {"time", `200012.498`, "date", timeToDate1, 0}, + + // time to datetime + {"time", `"30 20:00:12"`, "datetime", timeToDatetime4, 0}, + {"time", `"30 20:00"`, "datetime", timeToDatetime5, 0}, + {"time", `"30 20"`, "datetime", timeToDatetime5, 0}, + {"time", `"20:00:12"`, "datetime", timeToDatetime1, 0}, + {"time", `"20:00"`, "datetime", timeToDatetime2, 0}, + {"time", `"12"`, "datetime", timeToDatetime3, 0}, + {"time", `"200012"`, "datetime", timeToDatetime1, 0}, + {"time", `200012`, "datetime", timeToDatetime1, 0}, + {"time", `0012`, "datetime", timeToDatetime3, 0}, + {"time", `12`, "datetime", timeToDatetime3, 0}, + {"time", `"30 20:00:12.498"`, "datetime", timeToDatetime4, 0}, + {"time", `"20:00:12.498"`, "datetime", timeToDatetime1, 0}, + {"time", `"200012.498"`, "datetime", timeToDatetime1, 0}, + {"time", `200012.498`, "datetime", timeToDatetime1, 0}, + + // time to timestamp + {"time", `"30 20:00:12"`, "timestamp", timeToTimestamp4, 0}, + {"time", `"30 20:00"`, "timestamp", timeToTimestamp5, 0}, + {"time", `"30 20"`, "timestamp", timeToTimestamp5, 0}, + {"time", `"20:00:12"`, "timestamp", timeToTimestamp1, 0}, + {"time", `"20:00"`, "timestamp", timeToTimestamp2, 0}, + {"time", `"12"`, "timestamp", timeToTimestamp3, 0}, + {"time", `"200012"`, "timestamp", timeToTimestamp1, 0}, + {"time", `200012`, "timestamp", timeToTimestamp1, 0}, + {"time", `0012`, "timestamp", timeToTimestamp3, 0}, + {"time", `12`, "timestamp", timeToTimestamp3, 0}, + {"time", `"30 20:00:12.498"`, "timestamp", timeToTimestamp4, 0}, + {"time", `"20:00:12.498"`, "timestamp", timeToTimestamp1, 0}, + {"time", `"200012.498"`, "timestamp", timeToTimestamp1, 0}, + {"time", `200012.498`, "timestamp", timeToTimestamp1, 0}, + + // date to time + {"date", `"2019-01-02"`, "time", "00:00:00", 0}, + {"date", `"19-01-02"`, "time", "00:00:00", 0}, + {"date", `"20190102"`, "time", "00:00:00", 0}, + {"date", `"190102"`, "time", "00:00:00", 0}, + {"date", `20190102`, "time", "00:00:00", 0}, + {"date", `190102`, "time", "00:00:00", 0}, + + // date to year + {"date", `"2019-01-02"`, "year", "2019", 0}, + {"date", `"19-01-02"`, "year", "2019", 0}, + {"date", `"20190102"`, "year", "2019", 0}, + {"date", `"190102"`, "year", "2019", 0}, + {"date", `20190102`, "year", "2019", 0}, + {"date", `190102`, "year", "2019", 0}, + + // date to datetime + {"date", `"2019-01-02"`, "datetime", "2019-01-02 00:00:00", 0}, + {"date", `"19-01-02"`, "datetime", "2019-01-02 00:00:00", 0}, + {"date", `"20190102"`, "datetime", "2019-01-02 00:00:00", 0}, + {"date", `"190102"`, "datetime", "2019-01-02 00:00:00", 0}, + {"date", `20190102`, "datetime", "2019-01-02 00:00:00", 0}, + {"date", `190102`, "datetime", "2019-01-02 00:00:00", 0}, + + // date to timestamp + {"date", `"2019-01-02"`, "timestamp", "2019-01-02 00:00:00", 0}, + {"date", `"19-01-02"`, "timestamp", "2019-01-02 00:00:00", 0}, + {"date", `"20190102"`, "timestamp", "2019-01-02 00:00:00", 0}, + {"date", `"190102"`, "timestamp", "2019-01-02 00:00:00", 0}, + {"date", `20190102`, "timestamp", "2019-01-02 00:00:00", 0}, + {"date", `190102`, "timestamp", "2019-01-02 00:00:00", 0}, + + // timestamp to year + {"timestamp", `"2006-01-02 15:04:05"`, "year", "2006", 0}, + {"timestamp", `"06-01-02 15:04:05"`, "year", "2006", 0}, + {"timestamp", `"20060102150405"`, "year", "2006", 0}, + {"timestamp", `"060102150405"`, "year", "2006", 0}, + {"timestamp", `20060102150405`, "year", "2006", 0}, + {"timestamp", `060102150405`, "year", "2006", 0}, + {"timestamp", `"2006-01-02 23:59:59.506"`, "year", "2006", 0}, + + // timestamp to time + {"timestamp", `"2006-01-02 15:04:05"`, "time", "15:04:05", 0}, + {"timestamp", `"06-01-02 15:04:05"`, "time", "15:04:05", 0}, + {"timestamp", `"20060102150405"`, "time", "15:04:05", 0}, + {"timestamp", `"060102150405"`, "time", "15:04:05", 0}, + {"timestamp", `20060102150405`, "time", "15:04:05", 0}, + {"timestamp", `060102150405`, "time", "15:04:05", 0}, + {"timestamp", `"2006-01-02 23:59:59.506"`, "time", "00:00:00", 0}, + + // timestamp to date + {"timestamp", `"2006-01-02 15:04:05"`, "date", "2006-01-02", 0}, + {"timestamp", `"06-01-02 15:04:05"`, "date", "2006-01-02", 0}, + {"timestamp", `"20060102150405"`, "date", "2006-01-02", 0}, + {"timestamp", `"060102150405"`, "date", "2006-01-02", 0}, + {"timestamp", `20060102150405`, "date", "2006-01-02", 0}, + {"timestamp", `060102150405`, "date", "2006-01-02", 0}, + {"timestamp", `"2006-01-02 23:59:59.506"`, "date", "2006-01-03", 0}, + + // timestamp to datetime + {"timestamp", `"2006-01-02 15:04:05"`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `"06-01-02 15:04:05"`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `"20060102150405"`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `"060102150405"`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `20060102150405`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `060102150405`, "datetime", "2006-01-02 15:04:05", 0}, + {"timestamp", `"2006-01-02 23:59:59.506"`, "datetime", "2006-01-03 00:00:00", 0}, + + // datetime to year + {"datetime", `"2006-01-02 15:04:05"`, "year", "2006", 0}, + {"datetime", `"06-01-02 15:04:05"`, "year", "2006", 0}, + {"datetime", `"20060102150405"`, "year", "2006", 0}, + {"datetime", `"060102150405"`, "year", "2006", 0}, + {"datetime", `20060102150405`, "year", "2006", 0}, + {"datetime", `060102150405`, "year", "2006", 0}, + {"datetime", `"2006-01-02 23:59:59.506"`, "year", "2006", 0}, + // MySQL will get "Data truncation: Out of range value for column 'a' at row 1. + {"datetime", `"1000-01-02 23:59:59"`, "year", "", errno.ErrInvalidYear}, + {"datetime", `"9999-01-02 23:59:59"`, "year", "", errno.ErrInvalidYear}, + + // datetime to time + {"datetime", `"2006-01-02 15:04:05"`, "time", "15:04:05", 0}, + {"datetime", `"06-01-02 15:04:05"`, "time", "15:04:05", 0}, + {"datetime", `"20060102150405"`, "time", "15:04:05", 0}, + {"datetime", `"060102150405"`, "time", "15:04:05", 0}, + {"datetime", `20060102150405`, "time", "15:04:05", 0}, + {"datetime", `060102150405`, "time", "15:04:05", 0}, + {"datetime", `"2006-01-02 23:59:59.506"`, "time", "00:00:00", 0}, + {"datetime", `"1000-01-02 23:59:59"`, "time", "23:59:59", 0}, + {"datetime", `"9999-01-02 23:59:59"`, "time", "23:59:59", 0}, + + // datetime to date + {"datetime", `"2006-01-02 15:04:05"`, "date", "2006-01-02", 0}, + {"datetime", `"06-01-02 15:04:05"`, "date", "2006-01-02", 0}, + {"datetime", `"20060102150405"`, "date", "2006-01-02", 0}, + {"datetime", `"060102150405"`, "date", "2006-01-02", 0}, + {"datetime", `20060102150405`, "date", "2006-01-02", 0}, + {"datetime", `060102150405`, "date", "2006-01-02", 0}, + {"datetime", `"2006-01-02 23:59:59.506"`, "date", "2006-01-03", 0}, + {"datetime", `"1000-01-02 23:59:59"`, "date", "1000-01-02", 0}, + {"datetime", `"9999-01-02 23:59:59"`, "date", "9999-01-02", 0}, + + // datetime to timestamp + {"datetime", `"2006-01-02 15:04:05"`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `"06-01-02 15:04:05"`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `"20060102150405"`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `"060102150405"`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `20060102150405`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `060102150405`, "timestamp", "2006-01-02 15:04:05", 0}, + {"datetime", `"2006-01-02 23:59:59.506"`, "timestamp", "2006-01-03 00:00:00", 0}, + {"datetime", `"1000-01-02 23:59:59"`, "timestamp", "1000-01-02 23:59:59", 0}, + {"datetime", `"9999-01-02 23:59:59"`, "timestamp", "9999-01-02 23:59:59", 0}, + + // year to time + // failed cases are not handled by TiDB + {"year", `"2019"`, "time", "00:20:19", 0}, + {"year", `2019`, "time", "00:20:19", 0}, + {"year", `"00"`, "time", "00:20:00", 0}, + {"year", `"69"`, "time", "", errno.ErrTruncatedWrongValue}, + {"year", `"70"`, "time", "", errno.ErrTruncatedWrongValue}, + {"year", `"99"`, "time", "", errno.ErrTruncatedWrongValue}, + {"year", `00`, "time", "00:00:00", 0}, + {"year", `69`, "time", "", errno.ErrTruncatedWrongValue}, + {"year", `70`, "time", "", errno.ErrTruncatedWrongValue}, + {"year", `99`, "time", "", errno.ErrTruncatedWrongValue}, + + // year to date + {"year", `"2019"`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `2019`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `"00"`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `"69"`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `"70"`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `"99"`, "date", "", errno.ErrTruncatedWrongValue}, + // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. + {"year", `00`, "date", "0000-00-00", 0}, + {"year", `69`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `70`, "date", "", errno.ErrTruncatedWrongValue}, + {"year", `99`, "date", "", errno.ErrTruncatedWrongValue}, + + // year to datetime + {"year", `"2019"`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `2019`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `"00"`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `"69"`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `"70"`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `"99"`, "datetime", "", errno.ErrTruncatedWrongValue}, + // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. + {"year", `00`, "datetime", "0000-00-00 00:00:00", 0}, + {"year", `69`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `70`, "datetime", "", errno.ErrTruncatedWrongValue}, + {"year", `99`, "datetime", "", errno.ErrTruncatedWrongValue}, + + // year to timestamp + {"year", `"2019"`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `2019`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `"00"`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `"69"`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `"70"`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `"99"`, "timestamp", "", errno.ErrTruncatedWrongValue}, + // MySQL will get "Data truncation: Incorrect date value: '0000'", but TiDB treat 00 as valid datetime. + {"year", `00`, "timestamp", "0000-00-00 00:00:00", 0}, + {"year", `69`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `70`, "timestamp", "", errno.ErrTruncatedWrongValue}, + {"year", `99`, "timestamp", "", errno.ErrTruncatedWrongValue}, + } + + for _, t := range tests { + tk.MustExec("drop table if exists t_mc") + tk.MustExec(fmt.Sprintf("create table t_mc(a %s)", t.from)) + tk.MustExec(fmt.Sprintf(`insert into t_mc (a) values (%s)`, t.value)) + _, err := tk.Exec(fmt.Sprintf(`alter table t_mc modify a %s`, t.to)) + if t.err != 0 { + c.Assert(err, NotNil, Commentf("%+v", t)) + c.Assert(err, ErrorMatches, fmt.Sprintf(".*[ddl:%d].*", t.err), Commentf("%+v", t)) + continue + } + c.Assert(err, IsNil, Commentf("%+v", t)) + + rs, err := tk.Exec("select a from t_mc") + c.Assert(err, IsNil, Commentf("%+v", t)) + + tk.ResultSetToResult(rs, Commentf("%+v", t)).Check(testkit.Rows(t.expect)) + } +} + func (s *testSerialDBSuite) TestSetTableFlashReplica(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) @@ -4599,14 +5151,15 @@ func (s *testSerialDBSuite) TestSetTableFlashReplica(c *C) { // Test for FindTableByPartitionID. is := domain.GetDomain(tk.Se).InfoSchema() - t, dbInfo := is.FindTableByPartitionID(partition.Definitions[0].ID) + t, dbInfo, _ := is.FindTableByPartitionID(partition.Definitions[0].ID) c.Assert(t, NotNil) c.Assert(dbInfo, NotNil) c.Assert(t.Meta().Name.L, Equals, "t_flash") - t, dbInfo = is.FindTableByPartitionID(t.Meta().ID) + t, dbInfo, _ = is.FindTableByPartitionID(t.Meta().ID) c.Assert(t, IsNil) c.Assert(dbInfo, IsNil) - failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + err = failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) // Test for set replica count more than the tiflash store count. s.mustExec(tk, c, "drop table if exists t_flash;") @@ -4787,7 +5340,10 @@ func (s *testDBSuite2) TestWriteLocal(c *C) { func (s *testSerialDBSuite) TestSkipSchemaChecker(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -5108,6 +5664,78 @@ func (s *testDBSuite4) TestConcurrentLockTables(c *C) { tk2.MustExec("unlock tables") } +func (s *testDBSuite4) TestLockTableReadOnly(c *C) { + if israce.RaceEnabled { + c.Skip("skip race test") + } + tk := testkit.NewTestKit(c, s.store) + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test") + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1,t2") + defer func() { + tk.MustExec("alter table t1 read write") + tk.MustExec("alter table t2 read write") + tk.MustExec("drop table if exists t1,t2") + }() + tk.MustExec("create table t1 (a int key, b int)") + tk.MustExec("create table t2 (a int key)") + + tk.MustExec("alter table t1 read only") + tk.MustQuery("select * from t1") + tk2.MustQuery("select * from t1") + _, err := tk.Exec("insert into t1 set a=1, b=2") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + _, err = tk.Exec("update t1 set a=1") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + _, err = tk.Exec("delete from t1") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + + _, err = tk2.Exec("insert into t1 set a=1, b=2") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + _, err = tk2.Exec("update t1 set a=1") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + _, err = tk2.Exec("delete from t1") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + tk2.MustExec("alter table t1 read only") + _, err = tk2.Exec("insert into t1 set a=1, b=2") + c.Assert(terror.ErrorEqual(err, infoschema.ErrTableLocked), IsTrue) + tk.MustExec("alter table t1 read write") + + tk.MustExec("lock tables t1 read") + c.Assert(terror.ErrorEqual(tk.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + tk.MustExec("lock tables t1 write") + c.Assert(terror.ErrorEqual(tk.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + tk.MustExec("lock tables t1 write local") + c.Assert(terror.ErrorEqual(tk.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("alter table t1 read only"), infoschema.ErrTableLocked), IsTrue) + tk.MustExec("unlock tables") + + tk.MustExec("alter table t1 read only") + c.Assert(terror.ErrorEqual(tk.ExecToErr("lock tables t1 read"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("lock tables t1 read"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk.ExecToErr("lock tables t1 write"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("lock tables t1 write"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk.ExecToErr("lock tables t1 write local"), infoschema.ErrTableLocked), IsTrue) + c.Assert(terror.ErrorEqual(tk2.ExecToErr("lock tables t1 write local"), infoschema.ErrTableLocked), IsTrue) + tk.MustExec("admin cleanup table lock t1") + tk2.MustExec("insert into t1 set a=1, b=2") + + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1") + tk.MustExec("begin pessimistic") + tk.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 2")) + tk2.MustExec("update t1 set b = 3") + tk2.MustExec("alter table t1 read only") + tk2.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 3")) + tk.MustQuery("select * from t1 where a = 1").Check(testkit.Rows("1 2")) + tk.MustExec("update t1 set b = 4") + c.Assert(terror.ErrorEqual(tk.ExecToErr("commit"), domain.ErrInfoSchemaChanged), IsTrue) + tk2.MustExec("alter table t1 read write") +} + func (s *testDBSuite4) testParallelExecSQL(c *C, sql1, sql2 string, se1, se2 session.Session, f checkRet) { callback := &ddl.TestDDLCallback{} times := 0 @@ -5117,7 +5745,7 @@ func (s *testDBSuite4) testParallelExecSQL(c *C, sql1, sql2 string, se1, se2 ses } var qLen int for { - err := kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { jobs, err1 := admin.GetDDLJobs(txn) if err1 != nil { return err1 @@ -5147,7 +5775,7 @@ func (s *testDBSuite4) testParallelExecSQL(c *C, sql1, sql2 string, se1, se2 ses go func() { var qLen int for { - err := kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { jobs, err3 := admin.GetDDLJobs(txn) if err3 != nil { return err3 @@ -5181,6 +5809,8 @@ func (s *testDBSuite4) testParallelExecSQL(c *C, sql1, sql2 string, se1, se2 ses func checkTableLock(c *C, se session.Session, dbName, tableName string, lockTp model.TableLockType) { tb := testGetTableByName(c, se, dbName, tableName) dom := domain.GetDomain(se) + err := dom.Reload() + c.Assert(err, IsNil) if lockTp != model.TableLockNone { c.Assert(tb.Meta().Lock, NotNil) c.Assert(tb.Meta().Lock.Tp, Equals, lockTp) @@ -5375,6 +6005,7 @@ func (s *testDBSuite1) TestAlterTableWithValidation(c *C) { func (s *testSerialDBSuite) TestCommitTxnWithIndexChange(c *C) { // Prepare work. tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") tk.MustExec("drop database if exists test_db") tk.MustExec("create database test_db") tk.MustExec("use test_db") @@ -5426,7 +6057,7 @@ func (s *testSerialDBSuite) TestCommitTxnWithIndexChange(c *C) { "insert into t2 values(11, 11, 11)", "delete from t2 where c2 = 11", "update t2 set c2 = 110 where c1 = 11"}, - //"update t2 set c1 = 10 where c3 = 100"}, + // "update t2 set c1 = 10 where c3 = 100"}, []string{"alter table t1 add index k2(c2)", "alter table t1 drop index k2", "alter table t1 add index kk2(c2, c1)", @@ -5446,7 +6077,6 @@ func (s *testSerialDBSuite) TestCommitTxnWithIndexChange(c *C) { false, model.StateNone}, // Test unique index - /* TODO unique index is not supported now. {[]string{"insert into t1 values(3, 30, 300)", "insert into t1 values(4, 40, 400)", "insert into t2 values(11, 11, 11)", @@ -5490,7 +6120,6 @@ func (s *testSerialDBSuite) TestCommitTxnWithIndexChange(c *C) { {"1 10 100", "2 20 200"}}, true, model.StateWriteOnly}, - */ } tk.MustQuery("select * from t1;").Check(testkit.Rows("1 10 100", "2 20 200")) @@ -5868,3 +6497,116 @@ func (s *testSerialDBSuite) TestModifyColumnTypeWhenInterception(c *C) { res := tk.MustQuery("show warnings") c.Assert(len(res.Rows()), Equals, count) } + +func (s *testDBSuite4) TestGeneratedColumnWindowFunction(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("DROP TABLE IF EXISTS t") + tk.MustGetErrCode("CREATE TABLE t (a INT , b INT as (ROW_NUMBER() OVER (ORDER BY a)))", errno.ErrWindowInvalidWindowFuncUse) + tk.MustGetErrCode("CREATE TABLE t (a INT , index idx ((ROW_NUMBER() OVER (ORDER BY a))))", errno.ErrWindowInvalidWindowFuncUse) +} + +func (s *testDBSuite4) TestAnonymousIndex(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("DROP TABLE IF EXISTS t") + tk.MustExec("create table t(bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb int, b int);") + tk.MustExec("alter table t add index bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb(b);") + tk.MustExec("alter table t add index (bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb);") + res := tk.MustQuery("show index from t where key_name='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb';") + c.Assert(len(res.Rows()), Equals, 1) + res = tk.MustQuery("show index from t where key_name='bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb_2';") + c.Assert(len(res.Rows()), Equals, 1) +} + +func (s *testDBSuite4) TestUnsupportedAlterTableOption(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_db") + tk.MustExec("DROP TABLE IF EXISTS t") + tk.MustExec("create table t(a char(10) not null,b char(20)) shard_row_id_bits=6;") + tk.MustGetErrCode("alter table t pre_split_regions=6;", errno.ErrUnsupportedDDLOperation) +} + +func (s *testDBSuite4) TestCreateTableWithDecimalWithDoubleZero(c *C) { + tk := testkit.NewTestKit(c, s.store) + + checkType := func(db, table, field string) { + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(table)) + c.Assert(err, IsNil) + tblInfo := tableInfo.Meta() + for _, col := range tblInfo.Columns { + if col.Name.L == field { + c.Assert(col.Flen, Equals, 10) + } + } + } + + tk.MustExec("use test") + tk.MustExec("drop table if exists tt") + tk.MustExec("create table tt(d decimal(0, 0))") + checkType("test", "tt", "d") + + tk.MustExec("drop table tt") + tk.MustExec("create table tt(a int)") + tk.MustExec("alter table tt add column d decimal(0, 0)") + checkType("test", "tt", "d") + + /* + Currently not support change column to decimal + tk.MustExec("drop table tt") + tk.MustExec("create table tt(d int)") + tk.MustExec("alter table tt change column d d decimal(0, 0)") + checkType("test", "tt", "d") + */ +} + +func (s *testDBSuite4) TestIssue22207(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("set @@session.tidb_enable_exchange_partition = 1;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("drop table if exists t2;") + tk.MustExec("create table t1(id char(10)) partition by list columns(id) (partition p0 values in ('a'), partition p1 values in ('b'));") + tk.MustExec("insert into t1 VALUES('a')") + tk.MustExec("create table t2(id char(10));") + tk.MustExec("ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;") + tk.MustQuery("select * from t2").Check(testkit.Rows("a")) + c.Assert(len(tk.MustQuery("select * from t1").Rows()), Equals, 0) + + tk.MustExec("drop table if exists t1;") + tk.MustExec("drop table if exists t2;") + tk.MustExec("create table t1 (id int) partition by list (id) (partition p0 values in (1,2,3), partition p1 values in (4,5,6));") + tk.MustExec("insert into t1 VALUES(1);") + tk.MustExec("insert into t1 VALUES(2);") + tk.MustExec("insert into t1 VALUES(3);") + tk.MustExec("create table t2(id int);") + tk.MustExec("ALTER TABLE t1 EXCHANGE PARTITION p0 WITH TABLE t2;") + tk.MustQuery("select * from t2").Check(testkit.Rows("1", "2", "3")) + c.Assert(len(tk.MustQuery("select * from t1").Rows()), Equals, 0) + tk.MustExec("set @@session.tidb_enable_exchange_partition = 0;") +} + +func (s *testSerialDBSuite) TestIssue22819(c *C) { + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("use test;") + tk1.MustExec("drop table if exists t1;") + defer func() { + tk1.MustExec("drop table if exists t1;") + }() + + tk1.MustExec("create table t1 (v int) partition by hash (v) partitions 2") + tk1.MustExec("insert into t1 values (1)") + + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test;") + tk1.MustExec("begin") + tk1.MustExec("update t1 set v = 2 where v = 1") + + tk2.MustExec("alter table t1 truncate partition p0") + + _, err := tk1.Exec("commit") + c.Assert(err, ErrorMatches, ".*8028.*Information schema is changed during the execution of the statement.*") +} diff --git a/ddl/ddl.go b/ddl/ddl.go index a764d51e0b755..50eafa62e160b 100644 --- a/ddl/ddl.go +++ b/ddl/ddl.go @@ -19,6 +19,7 @@ package ddl import ( "context" + "flag" "fmt" "sync" "time" @@ -41,9 +42,11 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/table" goutil "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" + "go.etcd.io/etcd/clientv3" "go.uber.org/zap" ) @@ -52,7 +55,9 @@ const ( currentVersion = 1 // DDLOwnerKey is the ddl owner path that is saved to etcd, and it's exported for testing. DDLOwnerKey = "/tidb/ddl/fg/owner" - ddlPrompt = "ddl" + // addingDDLJobPrefix is the path prefix used to record the newly added DDL job, and it's saved to etcd. + addingDDLJobPrefix = "/tidb/ddl/add_ddl_job_" + ddlPrompt = "ddl" shardRowIDBitsMax = 15 @@ -78,9 +83,6 @@ const ( ) var ( - // TableColumnCountLimit is limit of the number of columns in a table. - // It's exported for testing. - TableColumnCountLimit = uint32(512) // EnableSplitTableRegion is a flag to decide whether to split a new region for // a newly created table. It takes effect only if the Storage supports split // region. @@ -103,6 +105,7 @@ type DDL interface { AlterTable(ctx sessionctx.Context, tableIdent ast.Ident, spec []*ast.AlterTableSpec) error TruncateTable(ctx sessionctx.Context, tableIdent ast.Ident) error RenameTable(ctx sessionctx.Context, oldTableIdent, newTableIdent ast.Ident, isAlterTable bool) error + RenameTables(ctx sessionctx.Context, oldTableIdent, newTableIdent []ast.Ident, isAlterTable bool) error LockTables(ctx sessionctx.Context, stmt *ast.LockTablesStmt) error UnlockTables(ctx sessionctx.Context, lockedTables []model.TableLockTpInfo) error CleanupTableLock(ctx sessionctx.Context, tables []*ast.TableName) error @@ -110,6 +113,7 @@ type DDL interface { RepairTable(ctx sessionctx.Context, table *ast.TableName, createStmt *ast.CreateTableStmt) error CreateSequence(ctx sessionctx.Context, stmt *ast.CreateSequenceStmt) error DropSequence(ctx sessionctx.Context, tableIdent ast.Ident, ifExists bool) (err error) + AlterSequence(ctx sessionctx.Context, stmt *ast.AlterSequenceStmt) error // CreateSchemaWithInfo creates a database (schema) given its database info. // @@ -151,8 +155,8 @@ type DDL interface { GetScope(status string) variable.ScopeFlag // Stop stops DDL worker. Stop() error - // RegisterEventCh registers event channel for ddl. - RegisterEventCh(chan<- *util.Event) + // RegisterStatsHandle registers statistics handle and its corresponding event channel for ddl. + RegisterStatsHandle(*handle.Handle) // SchemaSyncer gets the schema syncer. SchemaSyncer() util.SchemaSyncer // OwnerManager gets the owner manager. @@ -197,7 +201,9 @@ type ddlCtx struct { lease time.Duration // lease is schema lease. binlogCli *pumpcli.PumpsClient // binlogCli is used for Binlog. infoHandle *infoschema.Handle + statsHandle *handle.Handle tableLockCkr util.DeadTableLockChecker + etcdCli *clientv3.Client // hook may be modified. mu struct { @@ -216,9 +222,10 @@ func (dc *ddlCtx) isOwner() bool { return isOwner } -// RegisterEventCh registers passed channel for ddl Event. -func (d *ddl) RegisterEventCh(ch chan<- *util.Event) { - d.ddlEventCh = ch +// RegisterStatsHandle registers statistics handle and its corresponding even channel for ddl. +func (d *ddl) RegisterStatsHandle(h *handle.Handle) { + d.ddlCtx.statsHandle = h + d.ddlEventCh = h.DDLEventCh() } // asyncNotifyEvent will notify the ddl event to outside world, say statistic handle. When the channel is full, we may @@ -283,6 +290,7 @@ func newDDL(ctx context.Context, options ...Option) *ddl { binlogCli: binloginfo.GetPumpsClient(), infoHandle: opt.InfoHandle, tableLockCkr: deadLockCkr, + etcdCli: opt.EtcdCli, } ddlCtx.mu.hook = opt.Hook ddlCtx.mu.interceptor = &BaseInterceptor{} @@ -393,9 +401,7 @@ func (d *ddl) close() { // GetLease implements DDL.GetLease interface. func (d *ddl) GetLease() time.Duration { - d.m.RLock() lease := d.lease - d.m.RUnlock() return lease } @@ -412,7 +418,7 @@ func (d *ddl) GetInfoSchemaWithInterceptor(ctx sessionctx.Context) infoschema.In func (d *ddl) genGlobalIDs(count int) ([]int64, error) { var ret []int64 - err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, true, func(ctx context.Context, txn kv.Transaction) error { failpoint.Inject("mockGenGlobalIDFail", func(val failpoint.Value) { if val.(bool) { failpoint.Return(errors.New("gofail genGlobalIDs error")) @@ -443,46 +449,89 @@ func (d *ddl) GetID() string { return d.uuid } -func checkJobMaxInterval(job *model.Job) time.Duration { - // The job of adding index takes more time to process. - // So it uses the longer time. - if job.Type == model.ActionAddIndex || job.Type == model.ActionAddPrimaryKey { - return 3 * time.Second +var ( + fastDDLIntervalPolicy = []time.Duration{ + 500 * time.Millisecond, + } + normalDDLIntervalPolicy = []time.Duration{ + 500 * time.Millisecond, + 500 * time.Millisecond, + 1 * time.Second, + } + slowDDLIntervalPolicy = []time.Duration{ + 500 * time.Millisecond, + 500 * time.Millisecond, + 1 * time.Second, + 1 * time.Second, + 3 * time.Second, + } +) + +func getIntervalFromPolicy(policy []time.Duration, i int) (time.Duration, bool) { + plen := len(policy) + if i < plen { + return policy[i], true } - if job.Type == model.ActionCreateTable || job.Type == model.ActionCreateSchema { - return 500 * time.Millisecond + return policy[plen-1], false +} + +func getJobCheckInterval(job *model.Job, i int) (time.Duration, bool) { + switch job.Type { + case model.ActionAddIndex, model.ActionAddPrimaryKey: + return getIntervalFromPolicy(slowDDLIntervalPolicy, i) + case model.ActionCreateTable, model.ActionCreateSchema: + return getIntervalFromPolicy(fastDDLIntervalPolicy, i) + default: + return getIntervalFromPolicy(normalDDLIntervalPolicy, i) } - return 1 * time.Second } -func (d *ddl) asyncNotifyWorker(jobTp model.ActionType) { +func (d *ddl) asyncNotifyWorker(job *model.Job) { // If the workers don't run, we needn't to notify workers. if !RunWorker { return } + var worker *worker + jobTp := job.Type if jobTp == model.ActionAddIndex || jobTp == model.ActionAddPrimaryKey { - asyncNotify(d.workers[addIdxWorker].ddlJobCh) + worker = d.workers[addIdxWorker] + } else { + worker = d.workers[generalWorker] + } + if d.ownerManager.IsOwner() { + asyncNotify(worker.ddlJobCh) } else { - asyncNotify(d.workers[generalWorker].ddlJobCh) + d.asyncNotifyByEtcd(worker.addingDDLJobKey, job) } } -func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { - if isChanClosed(d.ctx.Done()) { - return d.ctx.Err() +func updateTickerInterval(ticker *time.Ticker, lease time.Duration, job *model.Job, i int) *time.Ticker { + interval, changed := getJobCheckInterval(job, i) + if !changed { + return ticker } + // For now we should stop old ticker and create a new ticker + ticker.Stop() + return time.NewTicker(chooseLeaseTime(lease, interval)) +} +// doDDLJob will return +// - nil: found in history DDL job and no job error +// - context.Cancel: job has been sent to worker, but not found in history DDL job before cancel +// - other: found in history DDL job and return that job error +func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { // Get a global job ID and put the DDL job in the queue. job.Query, _ = ctx.Value(sessionctx.QueryString).(string) task := &limitJobTask{job, make(chan error)} d.limitJobCh <- task + // worker should restart to continue handling tasks in limitJobCh, and send back through task.err err := <-task.err ctx.GetSessionVars().StmtCtx.IsDDLJobInQueue = true // Notice worker that we push a new job and wait the job done. - d.asyncNotifyWorker(job.Type) + d.asyncNotifyWorker(job) logutil.BgLogger().Info("[ddl] start DDL job", zap.String("job", job.String()), zap.String("query", job.Query)) var historyJob *model.Job @@ -490,7 +539,8 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { // For a job from start to end, the state of it will be none -> delete only -> write only -> reorganization -> public // For every state changes, we will wait as lease 2 * lease time, so here the ticker check is 10 * lease. // But we use etcd to speed up, normally it takes less than 0.5s now, so we use 0.5s or 1s or 3s as the max value. - ticker := time.NewTicker(chooseLeaseTime(10*d.lease, checkJobMaxInterval(job))) + initInterval, _ := getJobCheckInterval(job, 0) + ticker := time.NewTicker(chooseLeaseTime(10*d.lease, initInterval)) startTime := time.Now() metrics.JobsGauge.WithLabelValues(job.Type.String()).Inc() defer func() { @@ -498,6 +548,7 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { metrics.JobsGauge.WithLabelValues(job.Type.String()).Dec() metrics.HandleJobHistogram.WithLabelValues(job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(startTime).Seconds()) }() + i := 0 for { failpoint.Inject("storeCloseInLoop", func(_ failpoint.Value) { d.cancel() @@ -506,10 +557,11 @@ func (d *ddl) doDDLJob(ctx sessionctx.Context, job *model.Job) error { select { case <-d.ddlJobDoneCh: case <-ticker.C: + i++ + ticker = updateTickerInterval(ticker, 10*d.lease, job, i) case <-d.ctx.Done(): - logutil.BgLogger().Error("[ddl] doDDLJob will quit because context done", zap.Error(d.ctx.Err())) - err := d.ctx.Err() - return err + logutil.BgLogger().Info("[ddl] doDDLJob will quit because context done") + return context.Canceled } historyJob, err = d.getHistoryDDLJob(jobID) @@ -615,3 +667,14 @@ type RecoverInfo struct { CurAutoIncID int64 CurAutoRandID int64 } + +var ( + // RunInGoTest is used to identify whether ddl in running in the test. + RunInGoTest bool +) + +func init() { + if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil { + RunInGoTest = true + } +} diff --git a/ddl/ddl_api.go b/ddl/ddl_api.go index 6d11db1dd3fae..5dfd135bcddec 100644 --- a/ddl/ddl_api.go +++ b/ddl/ddl_api.go @@ -18,9 +18,7 @@ package ddl import ( - "bytes" "encoding/hex" - "encoding/json" "fmt" "math" "strconv" @@ -29,6 +27,7 @@ import ( "time" "github.com/cznic/mathutil" + "github.com/go-yaml/yaml" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/ast" @@ -66,6 +65,11 @@ const ( expressionIndexPrefix = "_V$" changingColumnPrefix = "_Col$_" changingIndexPrefix = "_Idx$_" + tableNotExist = -1 + tinyBlobMaxLength = 255 + blobMaxLength = 65535 + mediumBlobMaxLength = 16777215 + longBlobMaxLength = 4294967295 ) func (d *ddl) CreateSchema(ctx sessionctx.Context, schema model.CIStr, charsetInfo *ast.CharsetOpt) error { @@ -550,6 +554,26 @@ func processColumnFlags(col *table.Column) { } } +func adjustBlobTypesFlen(col *table.Column) { + if col.FieldType.Tp == mysql.TypeBlob { + if col.FieldType.Flen <= tinyBlobMaxLength { + logutil.BgLogger().Info(fmt.Sprintf("Automatically convert BLOB(%d) to TINYBLOB", col.FieldType.Flen)) + col.FieldType.Flen = tinyBlobMaxLength + col.FieldType.Tp = mysql.TypeTinyBlob + } else if col.FieldType.Flen <= blobMaxLength { + col.FieldType.Flen = blobMaxLength + } else if col.FieldType.Flen <= mediumBlobMaxLength { + logutil.BgLogger().Info(fmt.Sprintf("Automatically convert BLOB(%d) to MEDIUMBLOB", col.FieldType.Flen)) + col.FieldType.Flen = mediumBlobMaxLength + col.FieldType.Tp = mysql.TypeMediumBlob + } else if col.FieldType.Flen <= longBlobMaxLength { + logutil.BgLogger().Info(fmt.Sprintf("Automatically convert BLOB(%d) to LONGBLOB", col.FieldType.Flen)) + col.FieldType.Flen = longBlobMaxLength + col.FieldType.Tp = mysql.TypeLongBlob + } + } +} + // columnDefToCol converts ColumnDef to Col and TableConstraints. // outPriKeyConstraint is the primary key constraint out of column definition. such as: create table t1 (id int , age int, primary key(id)); func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, outPriKeyConstraint *ast.Constraint) (*table.Column, []*ast.Constraint, error) { @@ -562,6 +586,8 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o Version: model.CurrLatestColumnInfoVersion, }) + adjustBlobTypesFlen(col) + if !isExplicitTimeStamp() { // Check and set TimestampFlag, OnUpdateNowFlag and NotNullFlag. if col.Tp == mysql.TypeTimestamp { @@ -602,9 +628,12 @@ func columnDefToCol(ctx sessionctx.Context, offset int, colDef *ast.ColumnDef, o case ast.ColumnOptionPrimaryKey: // Check PriKeyFlag first to avoid extra duplicate constraints. if col.Flag&mysql.PriKeyFlag == 0 { - constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys} + constraint := &ast.Constraint{Tp: ast.ConstraintPrimaryKey, Keys: keys, + Option: &ast.IndexOption{PrimaryKeyTp: v.PrimaryKeyTp}} constraints = append(constraints, constraint) col.Flag |= mysql.PriKeyFlag + // Add NotNullFlag early so that processColumnFlags() can see it. + col.Flag |= mysql.NotNullFlag } case ast.ColumnOptionUniqKey: // Check UniqueFlag first to avoid extra duplicate constraints. @@ -741,7 +770,7 @@ func getDefaultValue(ctx sessionctx.Context, col *table.Column, c *ast.ColumnOpt if tp == mysql.TypeBit || tp == mysql.TypeString || tp == mysql.TypeVarchar || tp == mysql.TypeVarString || tp == mysql.TypeBlob || tp == mysql.TypeLongBlob || tp == mysql.TypeMediumBlob || tp == mysql.TypeTinyBlob || - tp == mysql.TypeJSON { + tp == mysql.TypeJSON || tp == mysql.TypeEnum || tp == mysql.TypeSet { // For BinaryLiteral / string fields, when getting default value we cast the value into BinaryLiteral{}, thus we return // its raw string content here. return v.GetBinaryLiteral().ToString(), false, nil @@ -756,7 +785,10 @@ func getDefaultValue(ctx sessionctx.Context, col *table.Column, c *ast.ColumnOpt switch tp { case mysql.TypeSet: - val, err := setSetDefaultValue(v, col) + val, err := getSetDefaultValue(v, col) + return val, false, err + case mysql.TypeEnum: + val, err := getEnumDefaultValue(v, col) return val, false, err case mysql.TypeDuration: if v, err = v.ConvertTo(ctx.GetSessionVars().StmtCtx, &col.FieldType); err != nil { @@ -787,8 +819,8 @@ func tryToGetSequenceDefaultValue(c *ast.ColumnOption) (expr string, isExpr bool return "", false, nil } -// setSetDefaultValue sets the default value for the set type. See https://dev.mysql.com/doc/refman/5.7/en/set.html. -func setSetDefaultValue(v types.Datum, col *table.Column) (string, error) { +// getSetDefaultValue gets the default value for the set type. See https://dev.mysql.com/doc/refman/5.7/en/set.html. +func getSetDefaultValue(v types.Datum, col *table.Column) (string, error) { if v.Kind() == types.KindInt64 { setCnt := len(col.Elems) maxLimit := int64(1< int64(len(col.Elems)) { + return "", ErrInvalidDefaultValue.GenWithStackByArgs(col.Name.O) + } + enumVal, err := types.ParseEnumValue(col.Elems, uint64(val)) + if err != nil { + return "", errors.Trace(err) } + v.SetMysqlEnum(enumVal, col.Collate) + return v.ToString() } - if existCnt != len(valMap) { - return "", ErrInvalidDefaultValue.GenWithStackByArgs(col.Name.O) + + str, err := v.ToString() + if err != nil { + return "", errors.Trace(err) } - setVal, err := types.ParseSetName(col.Elems, str, col.Collate) + enumVal, err := types.ParseEnumName(col.Elems, str, col.Collate) if err != nil { return "", ErrInvalidDefaultValue.GenWithStackByArgs(col.Name.O) } - v.SetMysqlSet(setVal, col.Collate) + v.SetMysqlEnum(enumVal, col.Collate) return v.ToString() } @@ -961,8 +1001,20 @@ func checkColumnValueConstraint(col *table.Column, collation string) error { } valueMap := make(map[string]bool, len(col.Elems)) ctor := collate.GetCollator(collation) + enumLengthLimit := config.GetGlobalConfig().EnableEnumLengthLimit + desc, err := charset.GetCharsetDesc(col.Charset) + if err != nil { + return errors.Trace(err) + } for i := range col.Elems { val := string(ctor.Key(col.Elems[i])) + // According to MySQL 8.0 Refman: + // The maximum supported length of an individual ENUM element is M <= 255 and (M x w) <= 1020, + // where M is the element literal length and w is the number of bytes required for the maximum-length character in the character set. + // See https://dev.mysql.com/doc/refman/8.0/en/string-type-syntax.html for more details. + if enumLengthLimit && (len(val) > 255 || len(val)*desc.Maxlen > 1020) { + return ErrTooLongValueForType.GenWithStackByArgs(col.Name) + } if _, ok := valueMap[val]; ok { tpStr := "ENUM" if col.Tp == mysql.TypeSet { @@ -1060,12 +1112,19 @@ func checkTooLongColumn(cols []*model.ColumnInfo) error { } func checkTooManyColumns(colDefs []*model.ColumnInfo) error { - if uint32(len(colDefs)) > atomic.LoadUint32(&TableColumnCountLimit) { + if uint32(len(colDefs)) > atomic.LoadUint32(&config.GetGlobalConfig().TableColumnCountLimit) { return errTooManyFields } return nil } +func checkTooManyIndexes(idxDefs []*model.IndexInfo) error { + if len(idxDefs) > config.GetGlobalConfig().IndexLimit { + return errTooManyKeys.GenWithStackByArgs(config.GetGlobalConfig().IndexLimit) + } + return nil +} + // checkColumnsAttributes checks attributes for multiple columns. func checkColumnsAttributes(colDefs []*model.ColumnInfo) error { for _, colDef := range colDefs { @@ -1279,7 +1338,7 @@ func setTableAutoRandomBits(ctx sessionctx.Context, tbInfo *model.TableInfo, col return errors.Trace(err) } - layout := autoid.NewAutoRandomIDLayout(col.Tp, autoRandBits) + layout := autoid.NewShardIDLayout(col.Tp, autoRandBits) if autoRandBits == 0 { return ErrInvalidAutoRandom.GenWithStackByArgs(autoid.AutoRandomNonPositive) } else if autoRandBits > autoid.MaxAutoRandomBits { @@ -1366,24 +1425,47 @@ func buildTableInfo( if err != nil { return nil, err } - if !config.GetGlobalConfig().AlterPrimaryKey { - singleIntPK := isSingleIntPK(constr, lastCol) - clusteredIdx := ctx.GetSessionVars().EnableClusteredIndex - if singleIntPK || clusteredIdx { - // Primary key cannot be invisible. - if constr.Option != nil && constr.Option.Visibility == ast.IndexVisibilityInvisible { - return nil, ErrPKIndexCantBeInvisible + pkTp := model.PrimaryKeyTypeDefault + if constr.Option != nil { + pkTp = constr.Option.PrimaryKeyTp + } + noBinlog := ctx.GetSessionVars().BinlogClient == nil + switch pkTp { + case model.PrimaryKeyTypeNonClustered: + break + case model.PrimaryKeyTypeClustered: + if isSingleIntPK(constr, lastCol) { + tbInfo.PKIsHandle = true + } else { + tbInfo.IsCommonHandle = noBinlog + if tbInfo.IsCommonHandle { + tbInfo.CommonHandleVersion = 1 + } + if !noBinlog { + errMsg := "cannot build clustered index table because the binlog is ON" + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf(errMsg)) } } - if singleIntPK { - tbInfo.PKIsHandle = true - // Avoid creating index for PK handle column. - continue + case model.PrimaryKeyTypeDefault: + alterPKConf := config.GetGlobalConfig().AlterPrimaryKey + if isSingleIntPK(constr, lastCol) { + tbInfo.PKIsHandle = !alterPKConf + } else { + tbInfo.IsCommonHandle = !alterPKConf && ctx.GetSessionVars().EnableClusteredIndex && noBinlog + if tbInfo.IsCommonHandle { + tbInfo.CommonHandleVersion = 1 + } } - if clusteredIdx { - tbInfo.IsCommonHandle = true + } + if tbInfo.PKIsHandle || tbInfo.IsCommonHandle { + // Primary key cannot be invisible. + if constr.Option != nil && constr.Option.Visibility == ast.IndexVisibilityInvisible { + return nil, ErrPKIndexCantBeInvisible } } + if tbInfo.PKIsHandle { + continue + } } if constr.Tp == ast.ConstraintFulltext { @@ -1467,6 +1549,9 @@ func checkTableInfoValidExtra(tbInfo *model.TableInfo) error { if err := checkTooManyColumns(tbInfo.Columns); err != nil { return errors.Trace(err) } + if err := checkTooManyIndexes(tbInfo.Indices); err != nil { + return errors.Trace(err) + } if err := checkColumnsAttributes(tbInfo.Columns); err != nil { return errors.Trace(err) } @@ -1489,32 +1574,40 @@ func checkTableInfoValidWithStmt(ctx sessionctx.Context, tbInfo *model.TableInfo if err := checkGeneratedColumn(s.Cols); err != nil { return errors.Trace(err) } - if s.Partition != nil { - err := checkPartitionExprValid(ctx, tbInfo, s.Partition.Expr) - if err != nil { + if tbInfo.Partition != nil && s.Partition != nil { + if err := checkPartitionDefinitionConstraints(ctx, tbInfo); err != nil { return errors.Trace(err) } - - pi := tbInfo.Partition - if pi != nil { - switch pi.Type { - case model.PartitionTypeRange: - err = checkPartitionByRange(ctx, tbInfo, s) - case model.PartitionTypeHash: - err = checkPartitionByHash(ctx, tbInfo, s) - } - if err != nil { - return errors.Trace(err) - } + if err := checkPartitionFuncType(ctx, s.Partition.Expr, tbInfo); err != nil { + return errors.Trace(err) } - - if err = checkPartitioningKeysConstraints(ctx, s, tbInfo); err != nil { + if err := checkPartitioningKeysConstraints(ctx, s, tbInfo); err != nil { return errors.Trace(err) } } return nil } +func checkPartitionDefinitionConstraints(ctx sessionctx.Context, tbInfo *model.TableInfo) error { + var err error + if err = checkPartitionNameUnique(tbInfo.Partition); err != nil { + return errors.Trace(err) + } + if err = checkAddPartitionTooManyPartitions(uint64(len(tbInfo.Partition.Definitions))); err != nil { + return errors.Trace(err) + } + + switch tbInfo.Partition.Type { + case model.PartitionTypeRange: + err = checkPartitionByRange(ctx, tbInfo) + case model.PartitionTypeHash: + err = checkPartitionByHash(ctx, tbInfo) + case model.PartitionTypeList: + err = checkPartitionByList(ctx, tbInfo) + } + return errors.Trace(err) +} + // checkTableInfoValid uses to check table info valid. This is used to validate table info. func checkTableInfoValid(tblInfo *model.TableInfo) error { _, err := tables.TableFromMeta(nil, tblInfo) @@ -1619,7 +1712,7 @@ func buildTableInfoWithStmt(ctx sessionctx.Context, s *ast.CreateTableStmt, dbCh return nil, errors.Trace(err) } - tbInfo.Partition, err = buildTablePartitionInfo(ctx, s) + err = buildTablePartitionInfo(ctx, s.Partition, tbInfo) if err != nil { return nil, errors.Trace(err) } @@ -1639,17 +1732,13 @@ func (d *ddl) assignTableID(tbInfo *model.TableInfo) error { return nil } -func (d *ddl) assignPartitionIDs(tbInfo *model.TableInfo) error { - if tbInfo.Partition == nil { - return nil - } - partitionDefs := tbInfo.Partition.Definitions - genIDs, err := d.genGlobalIDs(len(partitionDefs)) +func (d *ddl) assignPartitionIDs(defs []model.PartitionDefinition) error { + genIDs, err := d.genGlobalIDs(len(defs)) if err != nil { return errors.Trace(err) } - for i := range partitionDefs { - partitionDefs[i].ID = genIDs[i] + for i := range defs { + defs[i].ID = genIDs[i] } return nil } @@ -1738,8 +1827,11 @@ func (d *ddl) CreateTableWithInfo( if err := d.assignTableID(tbInfo); err != nil { return errors.Trace(err) } - if err := d.assignPartitionIDs(tbInfo); err != nil { - return errors.Trace(err) + + if tbInfo.Partition != nil { + if err := d.assignPartitionIDs(tbInfo.Partition.Definitions); err != nil { + return errors.Trace(err) + } } if err := checkTableInfoValidExtra(tbInfo); err != nil { @@ -1873,10 +1965,10 @@ func (d *ddl) CreateView(ctx sessionctx.Context, s *ast.CreateViewStmt) (err err tblCharset := "" tblCollate := "" - if v, ok := ctx.GetSessionVars().GetSystemVar("character_set_client"); ok { + if v, ok := ctx.GetSessionVars().GetSystemVar(variable.CharacterSetConnection); ok { tblCharset = v } - if v, ok := ctx.GetSessionVars().GetSystemVar("collation_connection"); ok { + if v, ok := ctx.GetSessionVars().GetSystemVar(variable.CollationConnection); ok { tblCollate = v } @@ -1906,72 +1998,30 @@ func buildViewInfo(ctx sessionctx.Context, s *ast.CreateViewStmt) (*model.ViewIn Security: s.Security, SelectStmt: sb.String(), CheckOption: s.CheckOption, Cols: nil}, nil } -func checkPartitionByHash(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) error { - pi := tbInfo.Partition - if err := checkAddPartitionTooManyPartitions(pi.Num); err != nil { - return err - } - if err := checkNoHashPartitions(ctx, pi.Num); err != nil { - return err - } - if err := checkPartitionFuncValid(ctx, tbInfo, s.Partition.Expr); err != nil { - return err - } - return checkPartitionFuncType(ctx, s, tbInfo) +func checkPartitionByHash(ctx sessionctx.Context, tbInfo *model.TableInfo) error { + return checkNoHashPartitions(ctx, tbInfo.Partition.Num) } // checkPartitionByRange checks validity of a "BY RANGE" partition. -func checkPartitionByRange(ctx sessionctx.Context, tbInfo *model.TableInfo, s *ast.CreateTableStmt) error { +func checkPartitionByRange(ctx sessionctx.Context, tbInfo *model.TableInfo) error { failpoint.Inject("CheckPartitionByRangeErr", func() { panic("Out Of Memory Quota!") }) pi := tbInfo.Partition - if err := checkPartitionNameUnique(pi); err != nil { - return err - } - - if err := checkAddPartitionTooManyPartitions(uint64(len(pi.Definitions))); err != nil { - return err - } - - if err := checkNoRangePartitions(len(pi.Definitions)); err != nil { - return err - } if len(pi.Columns) == 0 { - if err := checkCreatePartitionValue(ctx, tbInfo); err != nil { - return err - } - - // s maybe nil when add partition. - if s == nil { - return nil - } - - if err := checkPartitionFuncValid(ctx, tbInfo, s.Partition.Expr); err != nil { - return err - } - return checkPartitionFuncType(ctx, s, tbInfo) - } - - // Check for range columns partition. - if err := checkRangeColumnsPartitionType(tbInfo); err != nil { - return err - } - - if s != nil { - for _, def := range s.Partition.Definitions { - exprs := def.Clause.(*ast.PartitionDefinitionClauseLessThan).Exprs - if err := checkRangeColumnsTypeAndValuesMatch(ctx, tbInfo, exprs); err != nil { - return err - } - } + return checkRangePartitionValue(ctx, tbInfo) } return checkRangeColumnsPartitionValue(ctx, tbInfo) } -func checkRangeColumnsPartitionType(tbInfo *model.TableInfo) error { +// checkPartitionByList checks validity of a "BY LIST" partition. +func checkPartitionByList(ctx sessionctx.Context, tbInfo *model.TableInfo) error { + return checkListPartitionValue(ctx, tbInfo) +} + +func checkColumnsPartitionType(tbInfo *model.TableInfo) error { for _, col := range tbInfo.Partition.Columns { colInfo := getColumnInfoByName(tbInfo, col.L) if colInfo == nil { @@ -1984,7 +2034,7 @@ func checkRangeColumnsPartitionType(tbInfo *model.TableInfo) error { // See https://dev.mysql.com/doc/mysql-partitioning-excerpt/5.7/en/partitioning-columns.html switch colInfo.FieldType.Tp { case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: - case mysql.TypeDate, mysql.TypeDatetime: + case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeDuration: case mysql.TypeVarchar, mysql.TypeString: default: return ErrNotAllowedTypeInPartition.GenWithStackByArgs(col.O) @@ -2043,7 +2093,8 @@ func checkTwoRangeColumns(ctx sessionctx.Context, curr, prev *model.PartitionDef // PARTITION p0 VALUES LESS THAN (5,10,'ggg') // PARTITION p1 VALUES LESS THAN (10,20,'mmm') // PARTITION p2 VALUES LESS THAN (15,30,'sss') - succ, err := parseAndEvalBoolExpr(ctx, fmt.Sprintf("(%s) > (%s)", curr.LessThan[i], prev.LessThan[i]), tbInfo) + colInfo := findColumnByName(pi.Columns[i].L, tbInfo) + succ, err := parseAndEvalBoolExpr(ctx, curr.LessThan[i], prev.LessThan[i], colInfo, tbInfo) if err != nil { return false, err } @@ -2055,11 +2106,20 @@ func checkTwoRangeColumns(ctx sessionctx.Context, curr, prev *model.PartitionDef return false, nil } -func parseAndEvalBoolExpr(ctx sessionctx.Context, expr string, tbInfo *model.TableInfo) (bool, error) { - e, err := expression.ParseSimpleExprWithTableInfo(ctx, expr, tbInfo) +func parseAndEvalBoolExpr(ctx sessionctx.Context, l, r string, colInfo *model.ColumnInfo, tbInfo *model.TableInfo) (bool, error) { + lexpr, err := expression.ParseSimpleExprCastWithTableInfo(ctx, l, tbInfo, &colInfo.FieldType) + if err != nil { + return false, err + } + rexpr, err := expression.ParseSimpleExprCastWithTableInfo(ctx, r, tbInfo, &colInfo.FieldType) if err != nil { return false, err } + e, err := expression.NewFunctionBase(ctx, ast.GT, types.NewFieldType(mysql.TypeLonglong), lexpr, rexpr) + if err != nil { + return false, err + } + e.SetCharsetAndCollation(colInfo.Charset, colInfo.Collate) res, _, err1 := e.EvalInt(ctx, chunk.Row{}) if err1 != nil { return false, err1 @@ -2125,12 +2185,20 @@ func handleTableOptions(options []*ast.TableOption, tbInfo *model.TableInfo) err // We don't handle charset and collate here since they're handled in `getCharsetAndCollateInTableOption`. } } - if tbInfo.PreSplitRegions > tbInfo.ShardRowIDBits { - tbInfo.PreSplitRegions = tbInfo.ShardRowIDBits + shardingBits := shardingBits(tbInfo) + if tbInfo.PreSplitRegions > shardingBits { + tbInfo.PreSplitRegions = shardingBits } return nil } +func shardingBits(tblInfo *model.TableInfo) uint64 { + if tblInfo.ShardRowIDBits > 0 { + return tblInfo.ShardRowIDBits + } + return tblInfo.AutoRandomBits +} + // isIgnorableSpec checks if the spec type is ignorable. // Some specs are parsed by ignored. This is for compatibility. func isIgnorableSpec(tp ast.AlterTableType) bool { @@ -2206,8 +2274,7 @@ func getCharsetAndCollateInTableOption(startIdx int, options []*ast.TableOption) func needToOverwriteColCharset(options []*ast.TableOption) bool { for i := len(options) - 1; i >= 0; i-- { opt := options[i] - switch opt.Tp { - case ast.TableOptionCharset: + if opt.Tp == ast.TableOptionCharset { // Only overwrite columns charset if the option contains `CONVERT TO`. return opt.UintValue == ast.TableOptionCharsetWithConvertTo } @@ -2272,6 +2339,9 @@ func (d *ddl) AlterTable(ctx sessionctx.Context, ident ast.Ident, specs []*ast.A } if len(validSpecs) > 1 { + if !ctx.GetSessionVars().EnableChangeMultiSchema { + return errRunMultiSchemaChanges + } if isSameTypeMultiSpecs(validSpecs) { switch validSpecs[0].Tp { case ast.AlterTableAddColumns: @@ -2326,6 +2396,24 @@ func (d *ddl) AlterTable(ctx sessionctx.Context, ident ast.Ident, specs []*ast.A err = d.DropTablePartition(ctx, ident, spec) case ast.AlterTableTruncatePartition: err = d.TruncateTablePartition(ctx, ident, spec) + case ast.AlterTableWriteable: + if !config.TableLockEnabled() { + return nil + } + tName := &ast.TableName{Schema: ident.Schema, Name: ident.Name} + if spec.Writeable { + err = d.CleanupTableLock(ctx, []*ast.TableName{tName}) + } else { + lockStmt := &ast.LockTablesStmt{ + TableLocks: []ast.TableLock{ + { + Table: tName, + Type: model.TableLockReadOnly, + }, + }, + } + err = d.LockTables(ctx, lockStmt) + } case ast.AlterTableExchangePartition: err = d.ExchangeTablePartition(ctx, ident, spec) case ast.AlterTableAddConstraint: @@ -2366,7 +2454,11 @@ func (d *ddl) AlterTable(ctx sessionctx.Context, ident ast.Ident, specs []*ast.A isAlterTable := true err = d.RenameTable(ctx, ident, newIdent, isAlterTable) case ast.AlterTableAlterPartition: - err = d.AlterTablePartition(ctx, ident, spec) + if ctx.GetSessionVars().EnableAlterPlacement { + err = d.AlterTableAlterPartition(ctx, ident, spec) + } else { + err = errors.New("alter partition alter placement is experimental and it is switched off by tidb_enable_alter_placement") + } case ast.AlterTablePartition: // Prevent silent succeed if user executes ALTER TABLE x PARTITION BY ... err = errors.New("alter table partition is unsupported") @@ -2405,6 +2497,8 @@ func (d *ddl) AlterTable(ctx sessionctx.Context, ident ast.Ident, specs []*ast.A needsOverwriteCols := needToOverwriteColCharset(spec.Options) err = d.AlterTableCharsetAndCollate(ctx, ident, toCharset, toCollate, needsOverwriteCols) handledCharsetOrCollate = true + default: + err = errUnsupportedAlterTableOption } if err != nil { @@ -2425,6 +2519,10 @@ func (d *ddl) AlterTable(ctx sessionctx.Context, ident ast.Ident, specs []*ast.A ctx.GetSessionVars().StmtCtx.AppendWarning(errUnsupportedAlterTableWithValidation) case ast.AlterTableWithoutValidation: ctx.GetSessionVars().StmtCtx.AppendWarning(errUnsupportedAlterTableWithoutValidation) + case ast.AlterTableAddStatistics: + err = d.AlterTableAddStatistics(ctx, ident, spec.Statistics, spec.IfNotExists) + case ast.AlterTableDropStatistics: + err = d.AlterTableDropStatistics(ctx, ident, spec.Statistics, spec.IfExists) default: // Nothing to do now. } @@ -2456,7 +2554,7 @@ func (d *ddl) RebaseAutoID(ctx sessionctx.Context, ident ast.Ident, newBase int6 break } } - layout := autoid.NewAutoRandomIDLayout(&autoRandColTp, tbInfo.AutoRandomBits) + layout := autoid.NewShardIDLayout(&autoRandColTp, tbInfo.AutoRandomBits) if layout.IncrementalMask()&newBase != newBase { errMsg := fmt.Sprintf(autoid.AutoRandomRebaseOverflow, newBase, layout.IncrementalBitsCapacity()) return errors.Trace(ErrInvalidAutoRandom.GenWithStackByArgs(errMsg)) @@ -2782,10 +2880,13 @@ func (d *ddl) AddTablePartitions(ctx sessionctx.Context, ident ast.Ident, spec * return errors.Trace(ErrPartitionMgmtOnNonpartitioned) } - partInfo, err := buildPartitionInfo(ctx, meta, d, spec) + partInfo, err := buildAddedPartitionInfo(ctx, meta, spec) if err != nil { return errors.Trace(err) } + if err := d.assignPartitionIDs(partInfo.Definitions); err != nil { + return errors.Trace(err) + } // partInfo contains only the new added partition, we have to combine it with the // old partitions to check all partitions is strictly increasing. @@ -2793,8 +2894,7 @@ func (d *ddl) AddTablePartitions(ctx sessionctx.Context, ident ast.Ident, spec * tmp := *partInfo tmp.Definitions = append(pi.Definitions, tmp.Definitions...) clonedMeta.Partition = &tmp - err = checkPartitionByRange(ctx, clonedMeta, nil) - if err != nil { + if err := checkPartitionDefinitionConstraints(ctx, clonedMeta); err != nil { if ErrSameNamePartition.Equal(err) && spec.IfNotExists { ctx.GetSessionVars().StmtCtx.AppendNote(err) return nil @@ -3082,6 +3182,10 @@ func checkExchangePartition(pt *model.TableInfo, nt *model.TableInfo) error { } func (d *ddl) ExchangeTablePartition(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) error { + if !ctx.GetSessionVars().TiDBEnableExchangePartition { + ctx.GetSessionVars().StmtCtx.AppendWarning(errExchangePartitionDisabled) + return nil + } ptSchema, pt, err := d.getSchemaAndTableByIdent(ctx, ident) if err != nil { return errors.Trace(err) @@ -3148,6 +3252,10 @@ func (d *ddl) DropColumn(ctx sessionctx.Context, ti ast.Ident, spec *ast.AlterTa return nil } colName := spec.OldColumnName.Name + err = checkDropVisibleColumnCnt(t, 1) + if err != nil { + return err + } job := &model.Job{ SchemaID: schema.ID, @@ -3216,6 +3324,10 @@ func (d *ddl) DropColumns(ctx sessionctx.Context, ti ast.Ident, specs []*ast.Alt return ErrCantRemoveAllFields.GenWithStack("can't drop all columns in table %s", tblInfo.Name) } + err = checkDropVisibleColumnCnt(t, len(colNames)) + if err != nil { + return err + } job := &model.Job{ SchemaID: schema.ID, @@ -3258,6 +3370,20 @@ func checkIsDroppableColumn(ctx sessionctx.Context, t table.Table, spec *ast.Alt return true, nil } +func checkDropVisibleColumnCnt(t table.Table, columnCnt int) error { + tblInfo := t.Meta() + visibleColumCnt := 0 + for _, column := range tblInfo.Columns { + if !column.Hidden { + visibleColumCnt++ + } + if visibleColumCnt > columnCnt { + return nil + } + } + return ErrTableMustHaveColumns +} + // checkModifyCharsetAndCollation returns error when the charset or collation is not modifiable. // needRewriteCollationData is used when trying to modify the collation of a column, it is true when the column is with // index because index of a string column is collation-aware. @@ -3288,104 +3414,149 @@ func checkModifyCharsetAndCollation(toCharset, toCollate, origCharset, origColla return nil } -// CheckModifyTypeCompatible checks whether changes column type to another is compatible considering -// field length and precision. -func CheckModifyTypeCompatible(origin *types.FieldType, to *types.FieldType) (allowedChangeColumnValueMsg string, err error) { - unsupportedMsg := fmt.Sprintf("type %v not match origin %v", to.CompactStr(), origin.CompactStr()) - var isIntType bool - switch origin.Tp { - case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, - mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - switch to.Tp { - case mysql.TypeVarchar, mysql.TypeString, mysql.TypeVarString, - mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - default: - return "", errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) - } - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: - switch to.Tp { - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: - isIntType = true - default: - return "", errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) - } - case mysql.TypeEnum, mysql.TypeSet: - var typeVar string - if origin.Tp == mysql.TypeEnum { - typeVar = "enum" - } else { - typeVar = "set" - } - if origin.Tp != to.Tp { - msg := fmt.Sprintf("cannot modify %s type column's to type %s", typeVar, to.String()) - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) - } - if len(to.Elems) < len(origin.Elems) { - msg := fmt.Sprintf("the number of %s column's elements is less than the original: %d", typeVar, len(origin.Elems)) - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) - } - for index, originElem := range origin.Elems { - toElem := to.Elems[index] - if originElem != toElem { - msg := fmt.Sprintf("cannot modify %s column value %s to %s", typeVar, originElem, toElem) - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) +// CheckModifyTypeCompatible checks whether changes column type to another is compatible and can be changed. +// If types are compatible and can be directly changed, nil err will be returned; otherwise the types are incompatible. +// There are two cases when types incompatible: +// 1. returned canReorg == true: types can be changed by reorg +// 2. returned canReorg == false: type change not supported yet +func CheckModifyTypeCompatible(origin *types.FieldType, to *types.FieldType) (canReorg bool, errMsg string, err error) { + // Deal with the same type. + if origin.Tp == to.Tp { + if origin.Tp == mysql.TypeEnum || origin.Tp == mysql.TypeSet { + typeVar := "set" + if origin.Tp == mysql.TypeEnum { + typeVar = "enum" + } + if len(to.Elems) < len(origin.Elems) { + msg := fmt.Sprintf("the number of %s column's elements is less than the original: %d", typeVar, len(origin.Elems)) + return true, msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) + } + for index, originElem := range origin.Elems { + toElem := to.Elems[index] + if originElem != toElem { + msg := fmt.Sprintf("cannot modify %s column value %s to %s", typeVar, originElem, toElem) + return true, msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) + } } } - case mysql.TypeNewDecimal: - if origin.Tp != to.Tp { - return "", errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) - } - // Floating-point and fixed-point types also can be UNSIGNED. As with integer types, this attribute prevents - // negative values from being stored in the column. Unlike the integer types, the upper range of column values - // remains the same. - if to.Flen != origin.Flen || to.Decimal != origin.Decimal || mysql.HasUnsignedFlag(to.Flag) != mysql.HasUnsignedFlag(origin.Flag) { - msg := fmt.Sprintf("decimal change from decimal(%d, %d) to decimal(%d, %d)", origin.Flen, origin.Decimal, to.Flen, to.Decimal) - return msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) + + if origin.Tp == mysql.TypeNewDecimal { + // Floating-point and fixed-point types also can be UNSIGNED. As with integer types, this attribute prevents + // negative values from being stored in the column. Unlike the integer types, the upper range of column values + // remains the same. + if to.Flen != origin.Flen || to.Decimal != origin.Decimal || mysql.HasUnsignedFlag(to.Flag) != mysql.HasUnsignedFlag(origin.Flag) { + msg := fmt.Sprintf("decimal change from decimal(%d, %d) to decimal(%d, %d)", origin.Flen, origin.Decimal, to.Flen, to.Decimal) + return true, msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) + } } - default: - if origin.Tp != to.Tp { - return "", errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) + + needReorg, reason := needReorgToChange(origin, to) + if !needReorg { + return false, "", nil } + return true, reason, errUnsupportedModifyColumn.GenWithStackByArgs(reason) + } + + // Deal with the different type. + if !checkTypeChangeSupported(origin, to) { + unsupportedMsg := fmt.Sprintf("change from original type %v to %v is currently unsupported yet", to.CompactStr(), origin.CompactStr()) + return false, unsupportedMsg, errUnsupportedModifyColumn.GenWithStackByArgs(unsupportedMsg) } - if to.Flen > 0 && to.Flen < origin.Flen { - msg := fmt.Sprintf("length %d is less than origin %d", to.Flen, origin.Flen) - if isIntType { - return msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) + // Check if different type can directly convert and no need to reorg. + stringToString := types.IsString(origin.Tp) && types.IsString(to.Tp) + integerToInteger := mysql.IsIntegerType(origin.Tp) && mysql.IsIntegerType(to.Tp) + if stringToString || integerToInteger { + needReorg, reason := needReorgToChange(origin, to) + if !needReorg { + return false, "", nil } - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) + return true, reason, errUnsupportedModifyColumn.GenWithStackByArgs(reason) + } + + notCompatibleMsg := fmt.Sprintf("type %v not match origin %v", to.CompactStr(), origin.CompactStr()) + return true, notCompatibleMsg, errUnsupportedModifyColumn.GenWithStackByArgs(notCompatibleMsg) +} + +func needReorgToChange(origin *types.FieldType, to *types.FieldType) (needOreg bool, reasonMsg string) { + toFlen := to.Flen + originFlen := origin.Flen + if mysql.IsIntegerType(to.Tp) && mysql.IsIntegerType(origin.Tp) { + // For integers, we should ignore the potential display length represented by flen, using + // the default flen of the type. + originFlen, _ = mysql.GetDefaultFieldLengthAndDecimal(origin.Tp) + toFlen, _ = mysql.GetDefaultFieldLengthAndDecimal(to.Tp) + } + + if toFlen > 0 && toFlen < originFlen { + return true, fmt.Sprintf("length %d is less than origin %d", toFlen, originFlen) } if to.Decimal > 0 && to.Decimal < origin.Decimal { - msg := fmt.Sprintf("decimal %d is less than origin %d", to.Decimal, origin.Decimal) - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) + return true, fmt.Sprintf("decimal %d is less than origin %d", to.Decimal, origin.Decimal) + } + if mysql.HasUnsignedFlag(origin.Flag) != mysql.HasUnsignedFlag(to.Flag) { + return true, "can't change unsigned integer to signed or vice versa" + } + return false, "" +} + +func checkTypeChangeSupported(origin *types.FieldType, to *types.FieldType) bool { + if types.IsString(origin.Tp) && to.Tp == mysql.TypeBit { + // TODO: Currently string data type cast to bit are not compatible with mysql, should fix here after compatible. + return false } - toUnsigned := mysql.HasUnsignedFlag(to.Flag) - originUnsigned := mysql.HasUnsignedFlag(origin.Flag) - if originUnsigned != toUnsigned { - msg := fmt.Sprintf("can't change unsigned integer to signed or vice versa") - if isIntType { - return msg, errUnsupportedModifyColumn.GenWithStackByArgs(msg) - } - return "", errUnsupportedModifyColumn.GenWithStackByArgs(msg) + if (origin.Tp == mysql.TypeEnum || origin.Tp == mysql.TypeSet) && + (types.IsTypeTime(to.Tp) || to.Tp == mysql.TypeDuration) { + // TODO: Currently enum/set cast to date/datetime/timestamp/time/bit are not support yet, should fix here after supported. + return false + } + + if (types.IsTypeTime(origin.Tp) || origin.Tp == mysql.TypeDuration || origin.Tp == mysql.TypeYear) && + (to.Tp == mysql.TypeEnum || to.Tp == mysql.TypeSet || to.Tp == mysql.TypeBit) { + // TODO: Currently date and time cast to enum/set/bit are not support yet, should fix here after supported. + return false + } + + if (origin.Tp == mysql.TypeFloat || origin.Tp == mysql.TypeDouble) && + (types.IsTypeTime(to.Tp) || to.Tp == mysql.TypeEnum || to.Tp == mysql.TypeSet) { + // TODO: Currently float/double cast to date/datetime/timestamp/enum/set type are not support yet, should fix here after supported. + return false + } + + if origin.Tp == mysql.TypeBit && + (types.IsTypeTime(to.Tp) || to.Tp == mysql.TypeDuration || to.Tp == mysql.TypeEnum || to.Tp == mysql.TypeSet) { + // TODO: Currently bit cast to date/datetime/timestamp/time/enum/set are not support yet, should fix here after supported. + return false + } + + if origin.Tp == mysql.TypeNewDecimal && (to.Tp == mysql.TypeEnum || to.Tp == mysql.TypeSet) { + // TODO: Currently decimal cast to enum/set are not support yet, should fix here after supported. + return false } - return "", nil + + if origin.Tp == mysql.TypeJSON && (to.Tp == mysql.TypeEnum || to.Tp == mysql.TypeSet || to.Tp == mysql.TypeBit) { + // TODO: Currently json cast to enum/set/bit are not support yet, should fix here after supported. + return false + } + + return true } -// checkModifyTypes checks if the 'origin' type can be modified to 'to' type without the need to -// change or check existing data in the table. -// It returns error if the two types has incompatible charset and collation, different sign, different -// digital/string types, or length of new Flen and Decimal is less than origin. +// checkModifyTypes checks if the 'origin' type can be modified to 'to' type no matter directly change +// or change by reorg. It returns error if the two types are incompatible and correlated change are not +// supported. However, even the two types can be change, if the flag "tidb_enable_change_column_type" not +// set, or the "origin" type contains primary key, error will be returned. func checkModifyTypes(ctx sessionctx.Context, origin *types.FieldType, to *types.FieldType, needRewriteCollationData bool) error { - changeColumnValueMsg, err := CheckModifyTypeCompatible(origin, to) + canReorg, changeColumnErrMsg, err := CheckModifyTypeCompatible(origin, to) if err != nil { enableChangeColumnType := ctx.GetSessionVars().EnableChangeColumnType - if len(changeColumnValueMsg) == 0 { + if !canReorg { return errors.Trace(err) } if !enableChangeColumnType { - msg := fmt.Sprintf("%s, and tidb_enable_change_column_type is false", changeColumnValueMsg) + msg := fmt.Sprintf("%s, and tidb_enable_change_column_type is false", changeColumnErrMsg) return errUnsupportedModifyColumn.GenWithStackByArgs(msg) } else if mysql.HasPriKeyFlag(origin.Flag) { msg := "tidb_enable_change_column_type is true and this column has primary key flag" @@ -3394,6 +3565,10 @@ func checkModifyTypes(ctx sessionctx.Context, origin *types.FieldType, to *types } err = checkModifyCharsetAndCollation(to.Charset, to.Collate, origin.Charset, origin.Collate, needRewriteCollationData) + // column type change can handle the charset change between these two types in the process of the reorg. + if err != nil && errUnsupportedModifyCharset.Equal(err) && canReorg { + return nil + } return errors.Trace(err) } @@ -3540,10 +3715,6 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or return nil, infoschema.ErrColumnExists.GenWithStackByArgs(newColName) } } - // Check the column with foreign key. - if fkInfo := getColumnForeignKeyInfo(originalColName.L, t.Meta().ForeignKeys); fkInfo != nil { - return nil, errFKIncompatibleColumns.GenWithStackByArgs(originalColName, fkInfo.Name) - } // Constraints in the new column means adding new constraints. Errors should thrown, // which will be done by `processColumnOptions` later. @@ -3601,6 +3772,18 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or return nil, errors.Trace(err) } + // Check the column with foreign key, waiting for the default flen and decimal. + if fkInfo := getColumnForeignKeyInfo(originalColName.L, t.Meta().ForeignKeys); fkInfo != nil { + // For now we strongly ban the all column type change for column with foreign key. + // Actually MySQL support change column with foreign key from varchar(m) -> varchar(m+t) and t > 0. + if newCol.Tp != col.Tp || newCol.Flen != col.Flen || newCol.Decimal != col.Decimal { + return nil, errFKIncompatibleColumns.GenWithStackByArgs(originalColName, fkInfo.Name) + } + } + + // Adjust the flen for blob types after the default flen is set. + adjustBlobTypesFlen(newCol) + if err = processColumnOptions(ctx, newCol, specNewColumn.Options); err != nil { return nil, errors.Trace(err) } @@ -3662,7 +3845,7 @@ func (d *ddl) getModifiableColumnJob(ctx sessionctx.Context, ident ast.Ident, or } // As same with MySQL, we don't support modifying the stored status for generated columns. - if err = checkModifyGeneratedColumn(t, col, newCol, specNewColumn); err != nil { + if err = checkModifyGeneratedColumn(t, col, newCol, specNewColumn, spec.Position); err != nil { return nil, errors.Trace(err) } @@ -4103,12 +4286,70 @@ func checkTiFlashReplicaCount(ctx sessionctx.Context, replicaCount uint64) error return nil } +// AlterTableAddStatistics registers extended statistics for a table. +func (d *ddl) AlterTableAddStatistics(ctx sessionctx.Context, ident ast.Ident, stats *ast.StatisticsSpec, ifNotExists bool) error { + if !ctx.GetSessionVars().EnableExtendedStats { + return errors.New("Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + } + // Not support Cardinality and Dependency statistics type for now. + if stats.StatsType == ast.StatsTypeCardinality || stats.StatsType == ast.StatsTypeDependency { + return errors.New("Cardinality and Dependency statistics types are not supported now") + } + _, tbl, err := d.getSchemaAndTableByIdent(ctx, ident) + if err != nil { + return err + } + tblInfo := tbl.Meta() + if tblInfo.GetPartitionInfo() != nil { + return errors.New("Extended statistics on partitioned tables are not supported now") + } + colIDs := make([]int64, 0, 2) + // Check whether columns exist. + for _, colName := range stats.Columns { + col := table.FindCol(tbl.VisibleCols(), colName.Name.L) + if col == nil { + return infoschema.ErrColumnNotExists.GenWithStackByArgs(colName.Name, ident.Name) + } + if stats.StatsType == ast.StatsTypeCorrelation && tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag) { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("No need to create correlation statistics on the integer primary key column")) + return nil + } + colIDs = append(colIDs, col.ID) + } + if len(colIDs) != 2 && (stats.StatsType == ast.StatsTypeCorrelation || stats.StatsType == ast.StatsTypeDependency) { + return errors.New("Only support Correlation and Dependency statistics types on 2 columns") + } + if len(colIDs) < 1 && stats.StatsType == ast.StatsTypeCardinality { + return errors.New("Only support Cardinality statistics type on at least 2 columns") + } + // TODO: check whether covering index exists for cardinality / dependency types. + + // Call utilities of statistics.Handle to modify system tables instead of doing DML directly, + // because locking in Handle can guarantee the correctness of `version` in system tables. + return d.ddlCtx.statsHandle.InsertExtendedStats(stats.StatsName, colIDs, int(stats.StatsType), tblInfo.ID, ifNotExists) +} + +// AlterTableDropStatistics logically deletes extended statistics for a table. +func (d *ddl) AlterTableDropStatistics(ctx sessionctx.Context, ident ast.Ident, stats *ast.StatisticsSpec, ifExists bool) error { + if !ctx.GetSessionVars().EnableExtendedStats { + return errors.New("Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + } + _, tbl, err := d.getSchemaAndTableByIdent(ctx, ident) + if err != nil { + return err + } + tblInfo := tbl.Meta() + // Call utilities of statistics.Handle to modify system tables instead of doing DML directly, + // because locking in Handle can guarantee the correctness of `version` in system tables. + return d.ddlCtx.statsHandle.MarkExtendedStatsDeleted(stats.StatsName, tblInfo.ID, ifExists) +} + // UpdateTableReplicaInfo updates the table flash replica infos. func (d *ddl) UpdateTableReplicaInfo(ctx sessionctx.Context, physicalID int64, available bool) error { is := d.infoHandle.Get() tb, ok := is.TableByID(physicalID) if !ok { - tb, _ = is.FindTableByPartitionID(physicalID) + tb, _, _ = is.FindTableByPartitionID(physicalID) if tb == nil { return infoschema.ErrTableNotExists.GenWithStack("Table which ID = %d does not exist.", physicalID) } @@ -4336,11 +4577,8 @@ func (d *ddl) TruncateTable(ctx sessionctx.Context, ti ast.Ident) error { } return errors.Trace(err) } - oldTblInfo := tb.Meta() - if oldTblInfo.PreSplitRegions > 0 { - if _, tb, err := d.getSchemaAndTableByIdent(ctx, ti); err == nil { - d.preSplitAndScatter(ctx, tb.Meta(), tb.Meta().GetPartitionInfo()) - } + if _, tb, err := d.getSchemaAndTableByIdent(ctx, ti); err == nil { + d.preSplitAndScatter(ctx, tb.Meta(), tb.Meta().GetPartitionInfo()) } if !config.TableLockEnabled() { @@ -4354,63 +4592,149 @@ func (d *ddl) TruncateTable(ctx sessionctx.Context, ti ast.Ident) error { func (d *ddl) RenameTable(ctx sessionctx.Context, oldIdent, newIdent ast.Ident, isAlterTable bool) error { is := d.GetInfoSchemaWithInterceptor(ctx) + tables := make(map[string]int64) + schemas, tableID, err := extractTblInfos(is, oldIdent, newIdent, isAlterTable, tables) + if err != nil { + return err + } + + if schemas == nil { + return nil + } + + job := &model.Job{ + SchemaID: schemas[1].ID, + TableID: tableID, + SchemaName: schemas[1].Name.L, + Type: model.ActionRenameTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{schemas[0].ID, newIdent.Name}, + } + + err = d.doDDLJob(ctx, job) + err = d.callHookOnChanged(err) + return errors.Trace(err) +} + +func (d *ddl) RenameTables(ctx sessionctx.Context, oldIdents, newIdents []ast.Ident, isAlterTable bool) error { + is := d.GetInfoSchemaWithInterceptor(ctx) + tableNames := make([]*model.CIStr, 0, len(oldIdents)) + oldSchemaIDs := make([]int64, 0, len(oldIdents)) + newSchemaIDs := make([]int64, 0, len(oldIdents)) + tableIDs := make([]int64, 0, len(oldIdents)) + + var schemas []*model.DBInfo + var tableID int64 + var err error + + tables := make(map[string]int64) + for i := 0; i < len(oldIdents); i++ { + schemas, tableID, err = extractTblInfos(is, oldIdents[i], newIdents[i], isAlterTable, tables) + if err != nil { + return err + } + tableIDs = append(tableIDs, tableID) + tableNames = append(tableNames, &newIdents[i].Name) + oldSchemaIDs = append(oldSchemaIDs, schemas[0].ID) + newSchemaIDs = append(newSchemaIDs, schemas[1].ID) + } + + job := &model.Job{ + SchemaID: schemas[1].ID, + TableID: tableIDs[0], + SchemaName: schemas[1].Name.L, + Type: model.ActionRenameTables, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{oldSchemaIDs, newSchemaIDs, tableNames, tableIDs}, + } + + err = d.doDDLJob(ctx, job) + err = d.callHookOnChanged(err) + return errors.Trace(err) +} + +func extractTblInfos(is infoschema.InfoSchema, oldIdent, newIdent ast.Ident, isAlterTable bool, tables map[string]int64) ([]*model.DBInfo, int64, error) { oldSchema, ok := is.SchemaByName(oldIdent.Schema) if !ok { if isAlterTable { - return infoschema.ErrTableNotExists.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) + return nil, 0, infoschema.ErrTableNotExists.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) } - if is.TableExists(newIdent.Schema, newIdent.Name) { - return infoschema.ErrTableExists.GenWithStackByArgs(newIdent) + if tableExists(is, newIdent, tables) { + return nil, 0, infoschema.ErrTableExists.GenWithStackByArgs(newIdent) } - return errFileNotFound.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) + return nil, 0, errFileNotFound.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) } - oldTbl, err := is.TableByName(oldIdent.Schema, oldIdent.Name) - if err != nil { + if !tableExists(is, oldIdent, tables) { if isAlterTable { - return infoschema.ErrTableNotExists.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) + return nil, 0, infoschema.ErrTableNotExists.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) } - if is.TableExists(newIdent.Schema, newIdent.Name) { - return infoschema.ErrTableExists.GenWithStackByArgs(newIdent) + if tableExists(is, newIdent, tables) { + return nil, 0, infoschema.ErrTableExists.GenWithStackByArgs(newIdent) } - return errFileNotFound.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) + return nil, 0, errFileNotFound.GenWithStackByArgs(oldIdent.Schema, oldIdent.Name) } if isAlterTable && newIdent.Schema.L == oldIdent.Schema.L && newIdent.Name.L == oldIdent.Name.L { // oldIdent is equal to newIdent, do nothing - return nil + return nil, 0, nil } newSchema, ok := is.SchemaByName(newIdent.Schema) if !ok { - return ErrErrorOnRename.GenWithStackByArgs( + return nil, 0, ErrErrorOnRename.GenWithStackByArgs( fmt.Sprintf("%s.%s", oldIdent.Schema, oldIdent.Name), fmt.Sprintf("%s.%s", newIdent.Schema, newIdent.Name), 168, fmt.Sprintf("Database `%s` doesn't exist", newIdent.Schema)) } - if is.TableExists(newIdent.Schema, newIdent.Name) { - return infoschema.ErrTableExists.GenWithStackByArgs(newIdent) + if tableExists(is, newIdent, tables) { + return nil, 0, infoschema.ErrTableExists.GenWithStackByArgs(newIdent) } if err := checkTooLongTable(newIdent.Name); err != nil { - return errors.Trace(err) + return nil, 0, errors.Trace(err) } + oldTableID := getTableID(is, oldIdent, tables) + oldIdentKey := getIdentKey(oldIdent) + tables[oldIdentKey] = tableNotExist + newIdentKey := getIdentKey(newIdent) + tables[newIdentKey] = oldTableID + return []*model.DBInfo{oldSchema, newSchema}, oldTableID, nil +} - job := &model.Job{ - SchemaID: newSchema.ID, - TableID: oldTbl.Meta().ID, - SchemaName: newSchema.Name.L, - Type: model.ActionRenameTable, - BinlogInfo: &model.HistoryInfo{}, - Args: []interface{}{oldSchema.ID, newIdent.Name}, +func tableExists(is infoschema.InfoSchema, ident ast.Ident, tables map[string]int64) bool { + identKey := getIdentKey(ident) + tableID, ok := tables[identKey] + if (ok && tableID != tableNotExist) || (!ok && is.TableExists(ident.Schema, ident.Name)) { + return true } + return false +} - err = d.doDDLJob(ctx, job) - err = d.callHookOnChanged(err) - return errors.Trace(err) +func getTableID(is infoschema.InfoSchema, ident ast.Ident, tables map[string]int64) int64 { + identKey := getIdentKey(ident) + tableID, ok := tables[identKey] + if !ok { + oldTbl, err := is.TableByName(ident.Schema, ident.Name) + if err != nil { + return tableNotExist + } + tableID = oldTbl.Meta().ID + } + return tableID } -func getAnonymousIndex(t table.Table, colName model.CIStr) model.CIStr { +func getIdentKey(ident ast.Ident) string { + return fmt.Sprintf("%s.%s", ident.Schema.L, ident.Name.L) +} + +func getAnonymousIndex(t table.Table, colName model.CIStr, idxName model.CIStr) model.CIStr { + // `id` is used to indicated the index name's suffix. id := 2 l := len(t.Indices()) indexName := colName + if idxName.O != "" { + // Use the provided index name, it only happens when the original index name is too long and be truncated. + indexName = idxName + id = 3 + } if strings.EqualFold(indexName.L, mysql.PrimaryKeyName) { indexName = model.NewCIStr(fmt.Sprintf("%s_%d", colName.O, id)) id = 3 @@ -4418,6 +4742,9 @@ func getAnonymousIndex(t table.Table, colName model.CIStr) model.CIStr { for i := 0; i < l; i++ { if t.Indices()[i].Meta().Name.L == indexName.L { indexName = model.NewCIStr(fmt.Sprintf("%s_%d", colName.O, id)) + if err := checkTooLongIndex(indexName); err != nil { + indexName = getAnonymousIndex(t, model.NewCIStr(colName.O[:30]), model.NewCIStr(fmt.Sprintf("%s_%d", colName.O[:30], 2))) + } i = -1 id++ } @@ -4428,7 +4755,8 @@ func getAnonymousIndex(t table.Table, colName model.CIStr) model.CIStr { func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName model.CIStr, indexPartSpecifications []*ast.IndexPartSpecification, indexOption *ast.IndexOption) error { if !config.GetGlobalConfig().AlterPrimaryKey { - return ErrUnsupportedModifyPrimaryKey.GenWithStack("Unsupported add primary key, alter-primary-key is false") + return ErrUnsupportedModifyPrimaryKey.GenWithStack("Unsupported add primary key, alter-primary-key is false. " + + "Please check the documentation for the tidb-server configuration files") } schema, t, err := d.getSchemaAndTableByIdent(ctx, ti) @@ -4480,7 +4808,7 @@ func (d *ddl) CreatePrimaryKey(ctx sessionctx.Context, ti ast.Ident, indexName m if !config.GetGlobalConfig().EnableGlobalIndex { return ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("PRIMARY") } - //index columns does not contain all partition columns, must set global + // index columns does not contain all partition columns, must set global global = true } } @@ -4565,8 +4893,8 @@ func buildHiddenColumnInfo(ctx sessionctx.Context, indexPartSpecifications []*as } checkDependencies := make(map[string]struct{}) for _, colName := range findColumnNamesInExpr(idxPart.Expr) { - colInfo.Dependences[colName.Name.O] = struct{}{} - checkDependencies[colName.Name.O] = struct{}{} + colInfo.Dependences[colName.Name.L] = struct{}{} + checkDependencies[colName.Name.L] = struct{}{} } if err = checkDependedColExist(checkDependencies, existCols); err != nil { return nil, errors.Trace(err) @@ -4577,6 +4905,9 @@ func buildHiddenColumnInfo(ctx sessionctx.Context, indexPartSpecifications []*as idxPart.Expr = nil hiddenCols = append(hiddenCols, colInfo) } + if len(hiddenCols) > 0 && !config.GetGlobalConfig().Experimental.AllowsExpressionIndex { + return nil, ErrUnsupportedExpressionIndex + } return hiddenCols, nil } @@ -4598,7 +4929,7 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde if indexPartSpecifications[0].Column != nil { colName = indexPartSpecifications[0].Column.Name } - indexName = getAnonymousIndex(t, colName) + indexName = getAnonymousIndex(t, colName, model.NewCIStr("")) } if indexInfo := t.Meta().FindIndexByName(indexName.L); indexInfo != nil { @@ -4653,7 +4984,7 @@ func (d *ddl) CreateIndex(ctx sessionctx.Context, ti ast.Ident, keyType ast.Inde if !config.GetGlobalConfig().EnableGlobalIndex { return ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("UNIQUE INDEX") } - //index columns does not contain all partition columns, must set global + // index columns does not contain all partition columns, must set global global = true } } @@ -4935,12 +5266,14 @@ func validateCommentLength(vars *variable.SessionVars, indexName string, indexOp return indexOption.Comment, nil } -func buildPartitionInfo(ctx sessionctx.Context, meta *model.TableInfo, d *ddl, spec *ast.AlterTableSpec) (*model.PartitionInfo, error) { - if meta.Partition.Type == model.PartitionTypeRange { +// buildAddedPartitionInfo build alter table add partition info +func buildAddedPartitionInfo(ctx sessionctx.Context, meta *model.TableInfo, spec *ast.AlterTableSpec) (*model.PartitionInfo, error) { + switch meta.Partition.Type { + case model.PartitionTypeRange, model.PartitionTypeList: if len(spec.PartDefinitions) == 0 { return nil, ast.ErrPartitionsMustBeDefined.GenWithStackByArgs(meta.Partition.Type) } - } else { + default: // we don't support ADD PARTITION for all other partition types yet. return nil, errors.Trace(ErrUnsupportedAddPartition) } @@ -4952,74 +5285,62 @@ func buildPartitionInfo(ctx sessionctx.Context, meta *model.TableInfo, d *ddl, s Enable: meta.Partition.Enable, } - genIDs, err := d.genGlobalIDs(len(spec.PartDefinitions)) + defs, err := buildPartitionDefinitionsInfo(ctx, spec.PartDefinitions, meta) if err != nil { return nil, err } - for ith, def := range spec.PartDefinitions { - if err := def.Clause.Validate(part.Type, len(part.Columns)); err != nil { - return nil, errors.Trace(err) - } - if err := checkTooLongTable(def.Name); err != nil { - return nil, err - } - // For RANGE partition only VALUES LESS THAN should be possible. - clause := def.Clause.(*ast.PartitionDefinitionClauseLessThan) - if len(part.Columns) > 0 { - if err := checkRangeColumnsTypeAndValuesMatch(ctx, meta, clause.Exprs); err != nil { - return nil, err - } - } - - comment, _ := def.Comment() - piDef := model.PartitionDefinition{ - Name: def.Name, - ID: genIDs[ith], - Comment: comment, - } - buf := new(bytes.Buffer) - for _, expr := range clause.Exprs { - expr.Format(buf) - piDef.LessThan = append(piDef.LessThan, buf.String()) - buf.Reset() - } - part.Definitions = append(part.Definitions, piDef) - } + part.Definitions = defs return part, nil } -func checkRangeColumnsTypeAndValuesMatch(ctx sessionctx.Context, meta *model.TableInfo, exprs []ast.ExprNode) error { +func checkColumnsTypeAndValuesMatch(ctx sessionctx.Context, meta *model.TableInfo, exprs []ast.ExprNode) error { // Validate() has already checked len(colNames) = len(exprs) // create table ... partition by range columns (cols) // partition p0 values less than (expr) // check the type of cols[i] and expr is consistent. - colNames := meta.Partition.Columns + colTypes := collectColumnsType(meta) for i, colExpr := range exprs { if _, ok := colExpr.(*ast.MaxValueExpr); ok { continue } - - colName := colNames[i] - colInfo := getColumnInfoByName(meta, colName.L) - if colInfo == nil { - return errors.Trace(ErrFieldNotFoundPart) - } - colType := &colInfo.FieldType - + colType := colTypes[i] val, err := expression.EvalAstExpr(ctx, colExpr) if err != nil { return err } - // Check val.ConvertTo(colType) doesn't work, so we need this case by case check. + vkind := val.Kind() switch colType.Tp { - case mysql.TypeDate, mysql.TypeDatetime: - switch val.Kind() { + case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeDuration: + switch vkind { case types.KindString, types.KindBytes: + break default: return ErrWrongTypeColumnValue.GenWithStackByArgs() } + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + switch vkind { + case types.KindInt64, types.KindUint64, types.KindNull: + default: + return ErrWrongTypeColumnValue.GenWithStackByArgs() + } + case mysql.TypeFloat, mysql.TypeDouble: + switch vkind { + case types.KindFloat32, types.KindFloat64, types.KindNull: + default: + return ErrWrongTypeColumnValue.GenWithStackByArgs() + } + case mysql.TypeString, mysql.TypeVarString: + switch vkind { + case types.KindString, types.KindBytes, types.KindNull: + default: + return ErrWrongTypeColumnValue.GenWithStackByArgs() + } + } + _, err = val.ConvertTo(ctx.GetSessionVars().StmtCtx, &colType) + if err != nil { + return ErrWrongTypeColumnValue.GenWithStackByArgs() } } return nil @@ -5319,6 +5640,49 @@ func (d *ddl) CreateSequence(ctx sessionctx.Context, stmt *ast.CreateSequenceStm return d.CreateTableWithInfo(ctx, ident.Schema, tbInfo, onExist, false /*tryRetainID*/) } +func (d *ddl) AlterSequence(ctx sessionctx.Context, stmt *ast.AlterSequenceStmt) error { + ident := ast.Ident{Name: stmt.Name.Name, Schema: stmt.Name.Schema} + is := d.GetInfoSchemaWithInterceptor(ctx) + // Check schema existence. + db, ok := is.SchemaByName(ident.Schema) + if !ok { + return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(ident.Schema) + } + // Check table existence. + tbl, err := is.TableByName(ident.Schema, ident.Name) + if err != nil { + if stmt.IfExists { + ctx.GetSessionVars().StmtCtx.AppendNote(err) + return nil + } + return err + } + if !tbl.Meta().IsSequence() { + return ErrWrongObject.GenWithStackByArgs(ident.Schema, ident.Name, "SEQUENCE") + } + + // Validate the new sequence option value in old sequenceInfo. + oldSequenceInfo := tbl.Meta().Sequence + copySequenceInfo := *oldSequenceInfo + _, _, err = alterSequenceOptions(stmt.SeqOptions, ident, ©SequenceInfo) + if err != nil { + return err + } + + job := &model.Job{ + SchemaID: db.ID, + TableID: tbl.Meta().ID, + SchemaName: db.Name.L, + Type: model.ActionAlterSequence, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{ident, stmt.SeqOptions}, + } + + err = d.doDDLJob(ctx, job) + err = d.callHookOnChanged(err) + return errors.Trace(err) +} + func (d *ddl) DropSequence(ctx sessionctx.Context, ti ast.Ident, ifExists bool) (err error) { schema, tbl, err := d.getSchemaAndTableByIdent(ctx, ti) if err != nil { @@ -5381,23 +5745,19 @@ func (d *ddl) AlterIndexVisibility(ctx sessionctx.Context, ident ast.Ident, inde } func buildPlacementSpecReplicasAndConstraint(replicas uint64, cnstr string) ([]*placement.Rule, error) { - var err error - cnstr = strings.TrimSpace(cnstr) - rules := make([]*placement.Rule, 0, 1) - if len(cnstr) > 0 && cnstr[0] == '[' { + rules := []*placement.Rule{} + + cnstbytes := []byte(cnstr) + + constraints1 := []string{} + err1 := yaml.UnmarshalStrict(cnstbytes, &constraints1) + if err1 == nil { // can not emit REPLICAS with an array label if replicas == 0 { return rules, errors.Errorf("array CONSTRAINTS should be with a positive REPLICAS") } - constraints := []string{} - - err = json.Unmarshal([]byte(cnstr), &constraints) - if err != nil { - return rules, err - } - - labelConstraints, err := placement.CheckLabelConstraints(constraints) + labelConstraints, err := placement.CheckLabelConstraints(constraints1) if err != nil { return rules, err } @@ -5406,46 +5766,48 @@ func buildPlacementSpecReplicasAndConstraint(replicas uint64, cnstr string) ([]* Count: int(replicas), LabelConstraints: labelConstraints, }) - } else if len(cnstr) > 0 && cnstr[0] == '{' { - constraints := map[string]int{} - err = json.Unmarshal([]byte(cnstr), &constraints) - if err != nil { - return rules, err - } + return rules, nil + } + + constraints2 := map[string]int{} + err2 := yaml.UnmarshalStrict(cnstbytes, &constraints2) + if err2 == nil { ruleCnt := int(replicas) - for labels, cnt := range constraints { + + for labels, cnt := range constraints2 { if cnt <= 0 { - err = errors.Errorf("count should be positive, but got %d", cnt) - break + return rules, errors.Errorf("count should be positive, but got %d", cnt) } if replicas != 0 { ruleCnt -= cnt if ruleCnt < 0 { - err = errors.Errorf("REPLICAS should be larger or equal to the number of total replicas, but got %d", replicas) - break + return rules, errors.Errorf("REPLICAS should be larger or equal to the number of total replicas, but got %d", replicas) } } labelConstraints, err := placement.CheckLabelConstraints(strings.Split(strings.TrimSpace(labels), ",")) if err != nil { - break + return rules, err } + rules = append(rules, &placement.Rule{ Count: cnt, LabelConstraints: labelConstraints, }) } + if ruleCnt > 0 { rules = append(rules, &placement.Rule{ Count: ruleCnt, }) } - } else { - err = errors.Errorf("constraint should be a JSON array or object, but got '%s'", cnstr) + + return rules, nil } - return rules, err + + return nil, errors.Errorf("constraint is neither an array of string, nor a string-to-number map, due to:\n%s\n%s", err1, err2) } func buildPlacementSpecs(bundle *placement.Bundle, specs []*ast.PlacementSpec) (*placement.Bundle, error) { @@ -5460,19 +5822,26 @@ func buildPlacementSpecs(bundle *placement.Bundle, specs []*ast.PlacementSpec) ( case ast.PlacementRoleFollower: role = placement.Follower case ast.PlacementRoleLeader: + if spec.Replicas == 0 { + spec.Replicas = 1 + } + if spec.Replicas > 1 { + err = errors.Errorf("replicas can only be 1 when the role is leader") + } role = placement.Leader case ast.PlacementRoleLearner: role = placement.Learner case ast.PlacementRoleVoter: role = placement.Voter default: - err = errors.Errorf("unknown role: %d", spec.Role) + err = errors.Errorf("ROLE is not specified") } if err != nil { break } if spec.Tp == ast.PlacementAlter || spec.Tp == ast.PlacementDrop { + origLen := len(bundle.Rules) newRules := bundle.Rules[:0] for _, r := range bundle.Rules { if r.Role != role { @@ -5483,6 +5852,11 @@ func buildPlacementSpecs(bundle *placement.Bundle, specs []*ast.PlacementSpec) ( // alter == drop + add new rules if spec.Tp == ast.PlacementDrop { + // error if no rules will be dropped + if len(bundle.Rules) == origLen { + err = errors.Errorf("no rule of role '%s' to drop", role) + break + } continue } } @@ -5514,7 +5888,7 @@ func buildPlacementSpecs(bundle *placement.Bundle, specs []*ast.PlacementSpec) ( return bundle, nil } -func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) (err error) { +func (d *ddl) AlterTableAlterPartition(ctx sessionctx.Context, ident ast.Ident, spec *ast.AlterTableSpec) (err error) { schema, tb, err := d.getSchemaAndTableByIdent(ctx, ident) if err != nil { return errors.Trace(err) @@ -5530,14 +5904,9 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec return errors.Trace(err) } - pid := placement.GroupID(partitionID) + oldBundle := infoschema.GetBundle(d.infoHandle.Get(), []int64{partitionID, meta.ID, schema.ID}) - oldBundle, ok := d.infoHandle.Get().BundleByName(pid) - if !ok { - oldBundle = &placement.Bundle{ID: pid} - } else { - oldBundle = oldBundle.Clone() - } + oldBundle.ID = placement.GroupID(partitionID) bundle, err := buildPlacementSpecs(oldBundle, spec.PlacementSpecs) if err != nil { @@ -5545,8 +5914,8 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec } extraCnt := map[placement.PeerRoleType]int{} - startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(partitionID))) - endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(partitionID+1))) + startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(partitionID))) + endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(partitionID+1))) newRules := bundle.Rules[:0] for i, rule := range bundle.Rules { // merge all empty constraints @@ -5554,6 +5923,14 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec extraCnt[rule.Role] += rule.Count continue } + // refer to tidb#22065. + // add -engine=tiflash to every rule to avoid schedules to tiflash instances. + // placement rules in SQL is not compatible with `set tiflash replica` yet + rule.LabelConstraints = append(rule.LabelConstraints, placement.LabelConstraint{ + Op: placement.NotIn, + Key: placement.EngineLabelKey, + Values: []string{placement.EngineLabelTiFlash}, + }) rule.GroupID = bundle.ID rule.ID = strconv.Itoa(i) rule.StartKeyHex = startKey @@ -5564,15 +5941,22 @@ func (d *ddl) AlterTablePartition(ctx sessionctx.Context, ident ast.Ident, spec if cnt <= 0 { continue } - bundle.Rules = append(newRules, &placement.Rule{ + // refer to tidb#22065. + newRules = append(newRules, &placement.Rule{ GroupID: bundle.ID, - ID: "default", + ID: string(role), Role: role, Count: cnt, StartKeyHex: startKey, EndKeyHex: endKey, + LabelConstraints: []placement.LabelConstraint{{ + Op: placement.NotIn, + Key: placement.EngineLabelKey, + Values: []string{placement.EngineLabelTiFlash}, + }}, }) } + bundle.Rules = newRules if len(bundle.Rules) == 0 { bundle.Index = 0 bundle.Override = false diff --git a/ddl/ddl_test.go b/ddl/ddl_test.go index a05fd76b862d9..a2bca47ee382e 100644 --- a/ddl/ddl_test.go +++ b/ddl/ddl_test.go @@ -67,7 +67,10 @@ func TestT(t *testing.T) { CustomVerboseFlag = true *CustomParallelSuiteFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } autoid.SetStep(5000) ReorgWaitTimeout = 30 * time.Millisecond batchInsertDeleteRangeSize = 2 @@ -78,9 +81,11 @@ func TestT(t *testing.T) { conf.Log.SlowThreshold = 10000 // Test for add/drop primary key. conf.AlterPrimaryKey = true + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 }) - _, err := infosync.GlobalInfoSyncerInit(context.Background(), "t", nil, true) + _, err = infosync.GlobalInfoSyncerInit(context.Background(), "t", func() uint64 { return 1 }, nil, true) if err != nil { t.Fatal(err) } @@ -259,3 +264,30 @@ func buildRebaseAutoIDJobJob(dbInfo *model.DBInfo, tblInfo *model.TableInfo, new Args: []interface{}{newBaseID}, } } + +func (s *testDDLSuite) TestGetIntervalFromPolicy(c *C) { + policy := []time.Duration{ + 1 * time.Second, + 2 * time.Second, + } + var ( + val time.Duration + changed bool + ) + + val, changed = getIntervalFromPolicy(policy, 0) + c.Assert(val, Equals, 1*time.Second) + c.Assert(changed, Equals, true) + + val, changed = getIntervalFromPolicy(policy, 1) + c.Assert(val, Equals, 2*time.Second) + c.Assert(changed, Equals, true) + + val, changed = getIntervalFromPolicy(policy, 2) + c.Assert(val, Equals, 2*time.Second) + c.Assert(changed, Equals, false) + + val, changed = getIntervalFromPolicy(policy, 3) + c.Assert(val, Equals, 2*time.Second) + c.Assert(changed, Equals, false) +} diff --git a/ddl/ddl_worker.go b/ddl/ddl_worker.go index 1a7c60ba9ae75..1c263821b932b 100644 --- a/ddl/ddl_worker.go +++ b/ddl/ddl_worker.go @@ -16,6 +16,7 @@ package ddl import ( "context" "fmt" + "strconv" "sync" "sync/atomic" "time" @@ -34,7 +35,9 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" tidbutil "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/admin" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" + "go.etcd.io/etcd/clientv3" "go.uber.org/zap" ) @@ -73,11 +76,12 @@ const ( // worker is used for handling DDL jobs. // Now we have two kinds of workers. type worker struct { - id int32 - tp workerType - ddlJobCh chan struct{} - ctx context.Context - wg sync.WaitGroup + id int32 + tp workerType + addingDDLJobKey string + ddlJobCh chan struct{} + ctx context.Context + wg sync.WaitGroup sessPool *sessionPool // sessPool is used to new sessions to execute SQL in ddl package. reorgCtx *reorgCtx // reorgCtx is used for reorganization. @@ -96,6 +100,7 @@ func newWorker(ctx context.Context, tp workerType, sessPool *sessionPool, delRan delRangeManager: delRangeMgr, } + worker.addingDDLJobKey = addingDDLJobPrefix + worker.typeStr() worker.logCtx = logutil.WithKeyValue(context.Background(), "worker", worker.String()) return worker } @@ -141,23 +146,55 @@ func (w *worker) start(d *ddlCtx) { ticker := time.NewTicker(checkTime) defer ticker.Stop() + var notifyDDLJobByEtcdCh clientv3.WatchChan + if d.etcdCli != nil { + notifyDDLJobByEtcdCh = d.etcdCli.Watch(context.Background(), w.addingDDLJobKey) + } + rewatchCnt := 0 for { + ok := true select { case <-ticker.C: logutil.Logger(w.logCtx).Debug("[ddl] wait to check DDL status again", zap.Duration("interval", checkTime)) case <-w.ddlJobCh: + case _, ok = <-notifyDDLJobByEtcdCh: case <-w.ctx.Done(): return } + if !ok { + logutil.Logger(w.logCtx).Warn("[ddl] start worker watch channel closed", zap.String("watch key", w.addingDDLJobKey)) + notifyDDLJobByEtcdCh = d.etcdCli.Watch(context.Background(), w.addingDDLJobKey) + rewatchCnt++ + if rewatchCnt > 10 { + time.Sleep(time.Duration(rewatchCnt) * time.Second) + } + continue + } + + rewatchCnt = 0 err := w.handleDDLJobQueue(d) if err != nil { - logutil.Logger(w.logCtx).Error("[ddl] handle DDL job failed", zap.Error(err)) + logutil.Logger(w.logCtx).Warn("[ddl] handle DDL job failed", zap.Error(err)) } } } +func (d *ddl) asyncNotifyByEtcd(addingDDLJobKey string, job *model.Job) { + if d.etcdCli == nil { + return + } + + jobID := strconv.FormatInt(job.ID, 10) + timeStart := time.Now() + err := util.PutKVToEtcd(d.ctx, d.etcdCli, 1, addingDDLJobKey, jobID) + if err != nil { + logutil.BgLogger().Info("[ddl] notify handling DDL job failed", zap.String("jobID", jobID), zap.Error(err)) + } + metrics.DDLWorkerHistogram.WithLabelValues(metrics.WorkerNotifyDDLJob, job.Type.String(), metrics.RetLabel(err)).Observe(time.Since(timeStart).Seconds()) +} + func asyncNotify(ch chan struct{}) { select { case ch <- struct{}{}: @@ -223,7 +260,7 @@ func (d *ddl) limitDDLJobs() { // addBatchDDLJobs gets global job IDs and puts the DDL jobs in the DDL queue. func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { startTime := time.Now() - err := kv.RunInNewTxn(d.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) ids, err := t.GenGlobalIDs(len(tasks)) if err != nil { @@ -264,7 +301,7 @@ func (d *ddl) addBatchDDLJobs(tasks []*limitJobTask) { func (d *ddl) getHistoryDDLJob(id int64) (*model.Job, error) { var job *model.Job - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error job, err1 = t.GetHistoryDDLJob(id) @@ -349,8 +386,7 @@ func (w *worker) finishDDLJob(t *meta.Meta, job *model.Job) (err error) { err = w.deleteRange(job) } } - switch job.Type { - case model.ActionRecoverTable: + if job.Type == model.ActionRecoverTable { err = finishRecoverTable(w, t, job) } if err != nil { @@ -430,7 +466,7 @@ func (w *worker) handleDDLJobQueue(d *ddlCtx) error { runJobErr error ) waitTime := 2 * d.lease - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { // We are not owner, return and retry checking later. if !d.isOwner() { return nil @@ -516,6 +552,13 @@ func (w *worker) handleDDLJobQueue(d *ddlCtx) error { w.waitSchemaChanged(ctx, d, waitTime, schemaVer, job) cancel() + if RunInGoTest { + // d.mu.hook is initialed from domain / test callback, which will force the owner host update schema diff synchronously. + d.mu.RLock() + d.mu.hook.OnSchemaStateChanged() + d.mu.RUnlock() + } + d.mu.RLock() d.mu.hook.OnJobUpdated(job) d.mu.RUnlock() @@ -578,12 +621,55 @@ func chooseLeaseTime(t, max time.Duration) time.Duration { return t } +// countForPanic records the error count for DDL job. +func (w *worker) countForPanic(job *model.Job) { + // If run DDL job panic, just cancel the DDL jobs. + job.State = model.JobStateCancelling + job.ErrorCount++ + + // Load global DDL variables. + if err1 := loadDDLVars(w); err1 != nil { + logutil.Logger(w.logCtx).Error("[ddl] load DDL global variable failed", zap.Error(err1)) + } + errorCount := variable.GetDDLErrorCountLimit() + + if job.ErrorCount > errorCount { + msg := fmt.Sprintf("panic in handling DDL logic and error count beyond the limitation %d, cancelled", errorCount) + logutil.Logger(w.logCtx).Warn(msg) + job.Error = toTError(errors.New(msg)) + job.State = model.JobStateCancelled + } +} + +// countForError records the error count for DDL job. +func (w *worker) countForError(err error, job *model.Job) error { + job.Error = toTError(err) + job.ErrorCount++ + + // If job is cancelled, we shouldn't return an error and shouldn't load DDL variables. + if job.State == model.JobStateCancelled { + logutil.Logger(w.logCtx).Info("[ddl] DDL job is cancelled normally", zap.Error(err)) + return nil + } + logutil.Logger(w.logCtx).Error("[ddl] run DDL job error", zap.Error(err)) + + // Load global DDL variables. + if err1 := loadDDLVars(w); err1 != nil { + logutil.Logger(w.logCtx).Error("[ddl] load DDL global variable failed", zap.Error(err1)) + } + // Check error limit to avoid falling into an infinite loop. + if job.ErrorCount > variable.GetDDLErrorCountLimit() && job.State == model.JobStateRunning && admin.IsJobRollbackable(job) { + logutil.Logger(w.logCtx).Warn("[ddl] DDL job error count exceed the limit, cancelling it now", zap.Int64("jobID", job.ID), zap.Int64("errorCountLimit", variable.GetDDLErrorCountLimit())) + job.State = model.JobStateCancelling + } + return err +} + // runDDLJob runs a DDL job. It returns the current schema version in this transaction and the error. func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, err error) { defer tidbutil.Recover(metrics.LabelDDLWorker, fmt.Sprintf("%s runDDLJob", w), func() { - // If run DDL job panic, just cancel the DDL jobs. - job.State = model.JobStateCancelling + w.countForPanic(job) }, false) // Mock for run ddl job panic. @@ -606,13 +692,18 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, job.State = model.JobStateRunning } + // For every type, `schema/table` modification and `job` modification are conducted + // in the one kv transaction. The `schema/table` modification can be always discarded + // by kv reset when meets a unhandled error, but the `job` modification can't. + // So make sure job state and args change is after all other checks or make sure these + // change has no effect when retrying it. switch job.Type { case model.ActionCreateSchema: ver, err = onCreateSchema(d, t, job) case model.ActionModifySchemaCharsetAndCollate: ver, err = onModifySchemaCharsetAndCollate(t, job) case model.ActionDropSchema: - ver, err = onDropSchema(t, job) + ver, err = onDropSchema(d, t, job) case model.ActionCreateTable: ver, err = onCreateTable(d, t, job) case model.ActionRepairTable: @@ -622,7 +713,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionDropTable, model.ActionDropView, model.ActionDropSequence: ver, err = onDropTableOrView(t, job) case model.ActionDropTablePartition: - ver, err = onDropTablePartition(d, t, job) + ver, err = w.onDropTablePartition(d, t, job) case model.ActionTruncateTablePartition: ver, err = onTruncateTablePartition(d, t, job) case model.ActionExchangeTablePartition: @@ -666,7 +757,7 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionModifyTableAutoIdCache: ver, err = onModifyTableAutoIDCache(t, job) case model.ActionAddTablePartition: - ver, err = onAddTablePartition(d, t, job) + ver, err = w.onAddTablePartition(d, t, job) case model.ActionModifyTableCharsetAndCollate: ver, err = onModifyTableCharsetAndCollate(t, job) case model.ActionRecoverTable: @@ -684,34 +775,20 @@ func (w *worker) runDDLJob(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, case model.ActionAlterIndexVisibility: ver, err = onAlterIndexVisibility(t, job) case model.ActionAlterTableAlterPartition: - ver, err = onAlterTablePartition(t, job) + ver, err = onAlterTableAlterPartition(t, job) + case model.ActionAlterSequence: + ver, err = onAlterSequence(t, job) + case model.ActionRenameTables: + ver, err = onRenameTables(d, t, job) default: // Invalid job, cancel it. job.State = model.JobStateCancelled err = errInvalidDDLJob.GenWithStack("invalid ddl job type: %v", job.Type) } - // Save errors in job, so that others can know errors happened. + // Save errors in job if any, so that others can know errors happened. if err != nil { - job.Error = toTError(err) - job.ErrorCount++ - - // If job is cancelled, we shouldn't return an error and shouldn't load DDL variables. - if job.State == model.JobStateCancelled { - logutil.Logger(w.logCtx).Info("[ddl] DDL job is cancelled normally", zap.Error(err)) - return ver, nil - } - logutil.Logger(w.logCtx).Error("[ddl] run DDL job error", zap.Error(err)) - - // Load global ddl variables. - if err1 := loadDDLVars(w); err1 != nil { - logutil.Logger(w.logCtx).Error("[ddl] load DDL global variable failed", zap.Error(err1)) - } - // Check error limit to avoid falling into an infinite loop. - if job.ErrorCount > variable.GetDDLErrorCountLimit() && job.State == model.JobStateRunning && admin.IsJobRollbackable(job) { - logutil.Logger(w.logCtx).Warn("[ddl] DDL job error count exceed the limit, cancelling it now", zap.Int64("jobID", job.ID), zap.Int64("errorCountLimit", variable.GetDDLErrorCountLimit())) - job.State = model.JobStateCancelling - } + err = w.countForError(err, job) } return } @@ -735,7 +812,7 @@ func toTError(err error) *terror.Error { } // TODO: Add the error code. - return terror.ClassDDL.Synthesize(terror.CodeUnknown, err.Error()) + return dbterror.ClassDDL.Synthesize(terror.CodeUnknown, err.Error()) } // waitSchemaChanged waits for the completion of updating all servers' schema. In order to make sure that happens, @@ -778,10 +855,8 @@ func (w *worker) waitSchemaChanged(ctx context.Context, d *ddlCtx, waitTime time } d.schemaSyncer.NotifyCleanExpiredPaths() // Wait until timeout. - select { - case <-ctx.Done(): - return - } + <-ctx.Done() + return } logutil.Logger(w.logCtx).Info("[ddl] wait latest schema version changed", zap.Int64("ver", latestSchemaVersion), @@ -810,6 +885,21 @@ func (w *worker) waitSchemaSynced(d *ddlCtx, job *model.Job, waitTime time.Durat w.waitSchemaChanged(ctx, d, waitTime, latestSchemaVersion, job) } +func buildPlacementAffects(oldIDs []int64, newIDs []int64) []*model.AffectedOption { + if len(oldIDs) == 0 { + return nil + } + + affects := make([]*model.AffectedOption, len(oldIDs)) + for i := 0; i < len(oldIDs); i++ { + affects[i] = &model.AffectedOption{ + OldTableID: oldIDs[i], + TableID: newIDs[i], + } + } + return affects +} + // updateSchemaVersion increments the schema version by 1 and sets SchemaDiff. func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { schemaVersion, err := t.GenSchemaVersion() @@ -829,6 +919,13 @@ func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { return 0, errors.Trace(err) } diff.OldTableID = job.TableID + + // affects are used to update placement rule cache + if len(job.CtxVars) > 0 { + oldIDs := job.CtxVars[0].([]int64) + newIDs := job.CtxVars[1].([]int64) + diff.AffectedOpts = buildPlacementAffects(oldIDs, newIDs) + } case model.ActionCreateView: tbInfo := &model.TableInfo{} var orReplace bool @@ -848,6 +945,28 @@ func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { return 0, errors.Trace(err) } diff.TableID = job.TableID + case model.ActionRenameTables: + oldSchemaIDs := []int64{} + newSchemaIDs := []int64{} + tableNames := []*model.CIStr{} + tableIDs := []int64{} + err = job.DecodeArgs(&oldSchemaIDs, &newSchemaIDs, &tableNames, &tableIDs) + if err != nil { + return 0, errors.Trace(err) + } + affects := make([]*model.AffectedOption, len(newSchemaIDs)) + for i, newSchemaID := range newSchemaIDs { + affects[i] = &model.AffectedOption{ + SchemaID: newSchemaID, + TableID: tableIDs[i], + OldTableID: tableIDs[i], + OldSchemaID: oldSchemaIDs[i], + } + } + diff.TableID = tableIDs[0] + diff.SchemaID = newSchemaIDs[0] + diff.OldSchemaID = oldSchemaIDs[0] + diff.AffectedOpts = affects case model.ActionExchangeTablePartition: var ( ptSchemaID int64 @@ -866,21 +985,29 @@ func updateSchemaVersion(t *meta.Meta, job *model.Job) (int64, error) { } diff.AffectedOpts = affects case model.ActionTruncateTablePartition: - var oldIDs []int64 - err = job.DecodeArgs(&oldIDs) - if err != nil { - return 0, errors.Trace(err) + diff.TableID = job.TableID + if len(job.CtxVars) > 0 { + oldIDs := job.CtxVars[0].([]int64) + newIDs := job.CtxVars[1].([]int64) + diff.AffectedOpts = buildPlacementAffects(oldIDs, newIDs) } + case model.ActionDropTablePartition, model.ActionRecoverTable, model.ActionDropTable: + // affects are used to update placement rule cache diff.TableID = job.TableID - affects := make([]*model.AffectedOption, len(oldIDs)) - for i := 0; i < len(oldIDs); i++ { - affects[i] = &model.AffectedOption{ - SchemaID: job.SchemaID, - TableID: oldIDs[i], - OldTableID: oldIDs[i], + if len(job.CtxVars) > 0 { + if oldIDs, ok := job.CtxVars[0].([]int64); ok { + diff.AffectedOpts = buildPlacementAffects(oldIDs, oldIDs) + } + } + case model.ActionAlterTableAlterPartition: + diff.TableID = job.TableID + if len(job.CtxVars) > 0 { + diff.AffectedOpts = []*model.AffectedOption{ + { + TableID: job.CtxVars[0].(int64), + }, } } - diff.AffectedOpts = affects default: diff.TableID = job.TableID } diff --git a/ddl/ddl_worker_test.go b/ddl/ddl_worker_test.go index 6efa8df25e2df..6e745820b04b9 100644 --- a/ddl/ddl_worker_test.go +++ b/ddl/ddl_worker_test.go @@ -56,7 +56,10 @@ func (s *testDDLSerialSuite) SetUpSuite(c *C) { func (s *testDDLSuite) TestCheckOwner(c *C) { store := testCreateStore(c, "test_owner") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d1 := testNewDDLAndStart( context.Background(), @@ -64,17 +67,108 @@ func (s *testDDLSuite) TestCheckOwner(c *C) { WithStore(store), WithLease(testLease), ) - defer d1.Stop() + defer func() { + err := d1.Stop() + c.Assert(err, IsNil) + }() time.Sleep(testLease) testCheckOwner(c, d1, true) c.Assert(d1.GetLease(), Equals, testLease) } +func (s *testDDLSuite) TestNotifyDDLJob(c *C) { + store := testCreateStore(c, "test_notify_job") + defer store.Close() + + getFirstNotificationAfterStartDDL := func(d *ddl) { + select { + case <-d.workers[addIdxWorker].ddlJobCh: + default: + // The notification may be received by the worker. + } + select { + case <-d.workers[generalWorker].ddlJobCh: + default: + // The notification may be received by the worker. + } + } + + d := testNewDDLAndStart( + context.Background(), + c, + WithStore(store), + WithLease(testLease), + ) + defer d.Stop() + getFirstNotificationAfterStartDDL(d) + // Ensure that the notification is not handled in workers `start` function. + d.cancel() + for _, worker := range d.workers { + worker.close() + } + + job := &model.Job{ + SchemaID: 1, + TableID: 2, + Type: model.ActionCreateTable, + BinlogInfo: &model.HistoryInfo{}, + Args: []interface{}{}, + } + // Test the notification mechanism of the owner and the server receiving the DDL request on the same TiDB. + // This DDL request is a general DDL job. + d.asyncNotifyWorker(job) + select { + case <-d.workers[generalWorker].ddlJobCh: + default: + c.Fatal("do not get the general job notification") + } + // Test the notification mechanism of the owner and the server receiving the DDL request on the same TiDB. + // This DDL request is a add index DDL job. + job.Type = model.ActionAddIndex + d.asyncNotifyWorker(job) + select { + case <-d.workers[addIdxWorker].ddlJobCh: + default: + c.Fatal("do not get the add index job notification") + } + + // Test the notification mechanism that the owner and the server receiving the DDL request are not on the same TiDB. + // And the etcd client is nil. + d1 := testNewDDLAndStart( + context.Background(), + c, + WithStore(store), + WithLease(testLease), + ) + defer d1.Stop() + getFirstNotificationAfterStartDDL(d1) + // Ensure that the notification is not handled by worker's "start". + d1.cancel() + for _, worker := range d1.workers { + worker.close() + } + d1.ownerManager.RetireOwner() + d1.asyncNotifyWorker(job) + job.Type = model.ActionCreateTable + d1.asyncNotifyWorker(job) + testCheckOwner(c, d1, false) + select { + case <-d1.workers[addIdxWorker].ddlJobCh: + c.Fatal("should not get the add index job notification") + case <-d1.workers[generalWorker].ddlJobCh: + c.Fatal("should not get the general job notification") + default: + } +} + // testRunWorker tests no job is handled when the value of RunWorker is false. func (s *testDDLSerialSuite) testRunWorker(c *C) { store := testCreateStore(c, "test_run_worker") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() RunWorker = false d := testNewDDLAndStart( @@ -84,7 +178,10 @@ func (s *testDDLSerialSuite) testRunWorker(c *C) { WithLease(testLease), ) testCheckOwner(c, d, false) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() // Make sure the DDL worker is nil. worker := d.generalWorker() @@ -98,14 +195,20 @@ func (s *testDDLSerialSuite) testRunWorker(c *C) { WithLease(testLease), ) testCheckOwner(c, d1, true) - defer d1.Stop() + defer func() { + err := d1.Stop() + c.Assert(err, IsNil) + }() worker = d1.generalWorker() c.Assert(worker, NotNil) } func (s *testDDLSuite) TestSchemaError(c *C) { store := testCreateStore(c, "test_schema_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -113,7 +216,10 @@ func (s *testDDLSuite) TestSchemaError(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) doDDLJobErr(c, 1, 0, model.ActionCreateSchema, []interface{}{1}, ctx, d) @@ -121,7 +227,10 @@ func (s *testDDLSuite) TestSchemaError(c *C) { func (s *testDDLSuite) TestTableError(c *C) { store := testCreateStore(c, "test_table_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -129,7 +238,10 @@ func (s *testDDLSuite) TestTableError(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) // Schema ID is wrong, so dropping table is failed. @@ -142,7 +254,7 @@ func (s *testDDLSuite) TestTableError(c *C) { // Table ID or schema ID is wrong, so getting table is failed. tblInfo := testTableInfo(c, d, "t", 3) testCreateTable(c, ctx, d, dbInfo, tblInfo) - err := kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { job.SchemaID = -1 job.TableID = -1 t := meta.NewMeta(txn) @@ -160,14 +272,17 @@ func (s *testDDLSuite) TestTableError(c *C) { // Schema ID is wrong, so creating table is failed. doDDLJobErr(c, -1, tblInfo.ID, model.ActionCreateTable, []interface{}{tblInfo}, ctx, d) // Table exists, so creating table is failed. - tblInfo.ID = tblInfo.ID + 1 + tblInfo.ID++ doDDLJobErr(c, dbInfo.ID, tblInfo.ID, model.ActionCreateTable, []interface{}{tblInfo}, ctx, d) } func (s *testDDLSuite) TestViewError(c *C) { store := testCreateStore(c, "test_view_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -175,7 +290,10 @@ func (s *testDDLSuite) TestViewError(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) dbInfo := testSchemaInfo(c, d, "test") testCreateSchema(c, testNewContext(d), d, dbInfo) @@ -189,21 +307,27 @@ func (s *testDDLSuite) TestViewError(c *C) { // Schema ID is wrong and orReplace is false, so creating view is failed. doDDLJobErr(c, -1, tblInfo.ID, model.ActionCreateView, []interface{}{tblInfo, false}, ctx, d) // View exists and orReplace is false, so creating view is failed. - tblInfo.ID = tblInfo.ID + 1 + tblInfo.ID++ doDDLJobErr(c, dbInfo.ID, tblInfo.ID, model.ActionCreateView, []interface{}{tblInfo, false}, ctx, d) } func (s *testDDLSuite) TestInvalidDDLJob(c *C) { store := testCreateStore(c, "test_invalid_ddl_job_type_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), c, WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) job := &model.Job{ @@ -219,7 +343,10 @@ func (s *testDDLSuite) TestInvalidDDLJob(c *C) { func (s *testDDLSuite) TestForeignKeyError(c *C) { store := testCreateStore(c, "test_foreign_key_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -227,7 +354,10 @@ func (s *testDDLSuite) TestForeignKeyError(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) doDDLJobErr(c, -1, 1, model.ActionAddForeignKey, nil, ctx, d) @@ -242,7 +372,10 @@ func (s *testDDLSuite) TestForeignKeyError(c *C) { func (s *testDDLSuite) TestIndexError(c *C) { store := testCreateStore(c, "test_index_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -250,7 +383,10 @@ func (s *testDDLSuite) TestIndexError(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) // Schema ID is wrong. @@ -283,14 +419,20 @@ func (s *testDDLSuite) TestIndexError(c *C) { func (s *testDDLSuite) TestColumnError(c *C) { store := testCreateStore(c, "test_column_error") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), c, WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) dbInfo := testSchemaInfo(c, d, "test") @@ -339,7 +481,7 @@ func testCheckOwner(c *C, d *ddl, expectedVal bool) { } func testCheckJobDone(c *C, d *ddl, job *model.Job, isAdd bool) { - kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) historyJob, err := t.GetHistoryDDLJob(job.ID) c.Assert(err, IsNil) @@ -352,10 +494,11 @@ func testCheckJobDone(c *C, d *ddl, job *model.Job, isAdd bool) { return nil }) + c.Assert(err, IsNil) } func testCheckJobCancelled(c *C, d *ddl, job *model.Job, state *model.SchemaState) { - kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) historyJob, err := t.GetHistoryDDLJob(job.ID) c.Assert(err, IsNil) @@ -365,6 +508,7 @@ func testCheckJobCancelled(c *C, d *ddl, job *model.Job, state *model.SchemaStat } return nil }) + c.Assert(err, IsNil) } func doDDLJobErrWithSchemaState(ctx sessionctx.Context, d *ddl, c *C, schemaID, tableID int64, tp model.ActionType, @@ -456,7 +600,7 @@ func buildCancelJobTests(firstID int64) []testCancelJob { {act: model.ActionShardRowID, jobIDs: []int64{firstID + 17}, cancelRetErrs: noErrs, cancelState: model.StateNone}, {act: model.ActionModifyColumn, jobIDs: []int64{firstID + 18}, cancelRetErrs: noErrs, cancelState: model.StateNone}, - {act: model.ActionModifyColumn, jobIDs: []int64{firstID + 19}, cancelRetErrs: []error{admin.ErrCancelFinishedDDLJob.GenWithStackByArgs(firstID + 19)}, cancelState: model.StateDeleteOnly}, + {act: model.ActionModifyColumn, jobIDs: []int64{firstID + 19}, cancelRetErrs: noErrs, cancelState: model.StateDeleteOnly}, {act: model.ActionAddForeignKey, jobIDs: []int64{firstID + 20}, cancelRetErrs: noErrs, cancelState: model.StateNone}, {act: model.ActionAddForeignKey, jobIDs: []int64{firstID + 21}, cancelRetErrs: []error{admin.ErrCancelFinishedDDLJob.GenWithStackByArgs(firstID + 21)}, cancelState: model.StatePublic}, @@ -565,14 +709,20 @@ func checkIdxVisibility(changedTable table.Table, idxName string, expected bool) func (s *testDDLSerialSuite) TestCancelJob(c *C) { store := testCreateStore(c, "test_cancel_job") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), c, WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() dbInfo := testSchemaInfo(c, d, "test_cancel_job") testCreateSchema(c, testNewContext(d), d, dbInfo) // create a partition table. @@ -584,6 +734,12 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { ctx := testNewContext(d) err := ctx.NewTxn(context.Background()) c.Assert(err, IsNil) + err = ctx.GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "1") + c.Assert(err, IsNil) + defer func() { + err := ctx.GetSessionVars().SetSystemVar("tidb_enable_exchange_partition", "0") + c.Assert(err, IsNil) + }() testCreateTable(c, ctx, d, dbInfo, partitionTblInfo) tableAutoID := int64(100) shardRowIDBits := uint64(5) @@ -773,7 +929,7 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { // modify none-state column col.DefaultValue = "1" updateTest(&tests[15]) - modifyColumnArgs := []interface{}{col, col.Name, &ast.ColumnPosition{}, byte(0)} + modifyColumnArgs := []interface{}{col, col.Name, &ast.ColumnPosition{}, byte(0), uint64(0)} doDDLJobErrWithSchemaState(ctx, d, c, dbInfo.ID, tblInfo.ID, test.act, modifyColumnArgs, &test.cancelState) c.Check(checkErr, IsNil) changedTable = testGetTable(c, d, dbInfo.ID, tblInfo.ID) @@ -782,15 +938,16 @@ func (s *testDDLSerialSuite) TestCancelJob(c *C) { // modify delete-only-state column, col.FieldType.Tp = mysql.TypeTiny - col.FieldType.Flen = col.FieldType.Flen - 1 + col.FieldType.Flen-- updateTest(&tests[16]) - modifyColumnArgs = []interface{}{col, col.Name, &ast.ColumnPosition{}, byte(0)} - doDDLJobSuccess(ctx, d, c, dbInfo.ID, tblInfo.ID, test.act, modifyColumnArgs) + modifyColumnArgs = []interface{}{col, col.Name, &ast.ColumnPosition{}, byte(0), uint64(0)} + cancelState = model.StateNone + doDDLJobErrWithSchemaState(ctx, d, c, dbInfo.ID, tblInfo.ID, test.act, modifyColumnArgs, &cancelState) c.Check(checkErr, IsNil) changedTable = testGetTable(c, d, dbInfo.ID, tblInfo.ID) changedCol = model.FindColumnInfo(changedTable.Meta().Columns, col.Name.L) - c.Assert(changedCol.FieldType.Tp, Equals, mysql.TypeTiny) - c.Assert(changedCol.FieldType.Flen, Equals, col.FieldType.Flen) + c.Assert(changedCol.FieldType.Tp, Equals, mysql.TypeLonglong) + c.Assert(changedCol.FieldType.Flen, Equals, col.FieldType.Flen+1) col.FieldType.Flen++ // Test add foreign key failed cause by canceled. @@ -1153,8 +1310,10 @@ func (s *testDDLSuite) TestIgnorableSpec(c *C) { func (s *testDDLSuite) TestBuildJobDependence(c *C) { store := testCreateStore(c, "test_set_job_relation") - defer store.Close() - + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() // Add some non-add-index jobs. job1 := &model.Job{ID: 1, TableID: 1, Type: model.ActionAddColumn} job2 := &model.Job{ID: 2, TableID: 1, Type: model.ActionCreateTable} @@ -1163,7 +1322,7 @@ func (s *testDDLSuite) TestBuildJobDependence(c *C) { job7 := &model.Job{ID: 7, TableID: 2, Type: model.ActionModifyColumn} job9 := &model.Job{ID: 9, SchemaID: 111, Type: model.ActionDropSchema} job11 := &model.Job{ID: 11, TableID: 2, Type: model.ActionRenameTable, Args: []interface{}{int64(111), "old db name"}} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := t.EnQueueDDLJob(job1) c.Assert(err, IsNil) @@ -1181,46 +1340,52 @@ func (s *testDDLSuite) TestBuildJobDependence(c *C) { c.Assert(err, IsNil) return nil }) + c.Assert(err, IsNil) job4 := &model.Job{ID: 4, TableID: 1, Type: model.ActionAddIndex} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := buildJobDependence(t, job4) c.Assert(err, IsNil) c.Assert(job4.DependencyID, Equals, int64(2)) return nil }) + c.Assert(err, IsNil) job5 := &model.Job{ID: 5, TableID: 2, Type: model.ActionAddIndex} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := buildJobDependence(t, job5) c.Assert(err, IsNil) c.Assert(job5.DependencyID, Equals, int64(3)) return nil }) + c.Assert(err, IsNil) job8 := &model.Job{ID: 8, TableID: 3, Type: model.ActionAddIndex} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := buildJobDependence(t, job8) c.Assert(err, IsNil) c.Assert(job8.DependencyID, Equals, int64(0)) return nil }) + c.Assert(err, IsNil) job10 := &model.Job{ID: 10, SchemaID: 111, TableID: 3, Type: model.ActionAddIndex} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := buildJobDependence(t, job10) c.Assert(err, IsNil) c.Assert(job10.DependencyID, Equals, int64(9)) return nil }) + c.Assert(err, IsNil) job12 := &model.Job{ID: 12, SchemaID: 112, TableID: 2, Type: model.ActionAddIndex} - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := buildJobDependence(t, job12) c.Assert(err, IsNil) c.Assert(job12.DependencyID, Equals, int64(11)) return nil }) + c.Assert(err, IsNil) } func addDDLJob(c *C, d *ddl, job *model.Job) { @@ -1232,14 +1397,20 @@ func addDDLJob(c *C, d *ddl, job *model.Job) { func (s *testDDLSuite) TestParallelDDL(c *C) { store := testCreateStore(c, "test_parallel_ddl") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), c, WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) err := ctx.NewTxn(context.Background()) c.Assert(err, IsNil) @@ -1307,7 +1478,7 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { qLen1 := int64(0) qLen2 := int64(0) for { - checkErr = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + checkErr = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) qLen1, err = m.DDLJobQueueLen() if err != nil { @@ -1377,7 +1548,7 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { // check results. isChecked := false for !isChecked { - kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) lastJob, err := m.GetHistoryDDLJob(job11.ID) c.Assert(err, IsNil) @@ -1417,6 +1588,7 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { } return nil }) + c.Assert(err, IsNil) time.Sleep(10 * time.Millisecond) } @@ -1426,7 +1598,10 @@ func (s *testDDLSuite) TestParallelDDL(c *C) { func (s *testDDLSuite) TestDDLPackageExecuteSQL(c *C) { store := testCreateStore(c, "test_run_sql") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -1435,7 +1610,10 @@ func (s *testDDLSuite) TestDDLPackageExecuteSQL(c *C) { WithLease(testLease), ) testCheckOwner(c, d, true) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() worker := d.generalWorker() c.Assert(worker, NotNil) diff --git a/ddl/delete_range.go b/ddl/delete_range.go index a31f24e0a705d..e64c122d41e4d 100644 --- a/ddl/delete_range.go +++ b/ddl/delete_range.go @@ -16,8 +16,8 @@ package ddl import ( "context" "encoding/hex" - "fmt" "math" + "strings" "sync" "sync/atomic" @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" @@ -35,7 +36,7 @@ import ( const ( insertDeleteRangeSQLPrefix = `INSERT IGNORE INTO mysql.gc_delete_range VALUES ` - insertDeleteRangeSQLValue = `("%d", "%d", "%s", "%s", "%d")` + insertDeleteRangeSQLValue = `(%?, %?, %?, %?, %?)` insertDeleteRangeSQL = insertDeleteRangeSQLPrefix + insertDeleteRangeSQLValue delBatchSize = 65536 @@ -195,7 +196,7 @@ func (dr *delRange) doTask(ctx sessionctx.Context, r util.DelRangeTask) error { for { finish := true dr.keys = dr.keys[:0] - err := kv.RunInNewTxn(dr.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), dr.store, false, func(ctx context.Context, txn kv.Transaction) error { iter, err := txn.Iter(oldStartKey, r.EndKey) if err != nil { return errors.Trace(err) @@ -402,18 +403,21 @@ func insertJobIntoDeleteRangeTable(ctx sessionctx.Context, job *model.Job) error func doBatchDeleteIndiceRange(s sqlexec.SQLExecutor, jobID, tableID int64, indexIDs []int64, ts uint64) error { logutil.BgLogger().Info("[ddl] batch insert into delete-range indices", zap.Int64("jobID", jobID), zap.Int64s("elementIDs", indexIDs)) - sql := insertDeleteRangeSQLPrefix + paramsList := make([]interface{}, 0, len(indexIDs)*5) + var buf strings.Builder + buf.WriteString(insertDeleteRangeSQLPrefix) for i, indexID := range indexIDs { startKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID) endKey := tablecodec.EncodeTableIndexPrefix(tableID, indexID+1) startKeyEncoded := hex.EncodeToString(startKey) endKeyEncoded := hex.EncodeToString(endKey) - sql += fmt.Sprintf(insertDeleteRangeSQLValue, jobID, indexID, startKeyEncoded, endKeyEncoded, ts) + buf.WriteString(insertDeleteRangeSQLValue) if i != len(indexIDs)-1 { - sql += "," + buf.WriteString(",") } + paramsList = append(paramsList, jobID, indexID, startKeyEncoded, endKeyEncoded, ts) } - _, err := s.Execute(context.Background(), sql) + _, err := s.ExecuteInternal(context.Background(), buf.String(), paramsList...) return errors.Trace(err) } @@ -421,31 +425,33 @@ func doInsert(s sqlexec.SQLExecutor, jobID int64, elementID int64, startKey, end logutil.BgLogger().Info("[ddl] insert into delete-range table", zap.Int64("jobID", jobID), zap.Int64("elementID", elementID)) startKeyEncoded := hex.EncodeToString(startKey) endKeyEncoded := hex.EncodeToString(endKey) - sql := fmt.Sprintf(insertDeleteRangeSQL, jobID, elementID, startKeyEncoded, endKeyEncoded, ts) - _, err := s.Execute(context.Background(), sql) + _, err := s.ExecuteInternal(context.Background(), insertDeleteRangeSQL, jobID, elementID, startKeyEncoded, endKeyEncoded, ts) return errors.Trace(err) } func doBatchInsert(s sqlexec.SQLExecutor, jobID int64, tableIDs []int64, ts uint64) error { logutil.BgLogger().Info("[ddl] batch insert into delete-range table", zap.Int64("jobID", jobID), zap.Int64s("elementIDs", tableIDs)) - sql := insertDeleteRangeSQLPrefix + var buf strings.Builder + buf.WriteString(insertDeleteRangeSQLPrefix) + paramsList := make([]interface{}, 0, len(tableIDs)*5) for i, tableID := range tableIDs { startKey := tablecodec.EncodeTablePrefix(tableID) endKey := tablecodec.EncodeTablePrefix(tableID + 1) startKeyEncoded := hex.EncodeToString(startKey) endKeyEncoded := hex.EncodeToString(endKey) - sql += fmt.Sprintf(insertDeleteRangeSQLValue, jobID, tableID, startKeyEncoded, endKeyEncoded, ts) + buf.WriteString(insertDeleteRangeSQLValue) if i != len(tableIDs)-1 { - sql += "," + buf.WriteString(",") } + paramsList = append(paramsList, jobID, tableID, startKeyEncoded, endKeyEncoded, ts) } - _, err := s.Execute(context.Background(), sql) + _, err := s.ExecuteInternal(context.Background(), buf.String(), paramsList...) return errors.Trace(err) } // getNowTS gets the current timestamp, in TSO. func getNowTSO(ctx sessionctx.Context) (uint64, error) { - currVer, err := ctx.GetStore().CurrentVersion() + currVer, err := ctx.GetStore().CurrentVersion(oracle.GlobalTxnScope) if err != nil { return 0, errors.Trace(err) } diff --git a/ddl/error.go b/ddl/error.go index c75ccb1b6d487..9a91794034798 100644 --- a/ddl/error.go +++ b/ddl/error.go @@ -16,235 +16,260 @@ package ddl import ( "fmt" - "github.com/pingcap/parser/terror" + parser_mysql "github.com/pingcap/parser/mysql" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) var ( // errWorkerClosed means we have already closed the DDL worker. - errInvalidWorker = terror.ClassDDL.New(mysql.ErrInvalidDDLWorker, mysql.MySQLErrName[mysql.ErrInvalidDDLWorker]) + errInvalidWorker = dbterror.ClassDDL.NewStd(mysql.ErrInvalidDDLWorker) // errNotOwner means we are not owner and can't handle DDL jobs. - errNotOwner = terror.ClassDDL.New(mysql.ErrNotOwner, mysql.MySQLErrName[mysql.ErrNotOwner]) - errCantDecodeRecord = terror.ClassDDL.New(mysql.ErrCantDecodeRecord, mysql.MySQLErrName[mysql.ErrCantDecodeRecord]) - errInvalidDDLJob = terror.ClassDDL.New(mysql.ErrInvalidDDLJob, mysql.MySQLErrName[mysql.ErrInvalidDDLJob]) - errCancelledDDLJob = terror.ClassDDL.New(mysql.ErrCancelledDDLJob, mysql.MySQLErrName[mysql.ErrCancelledDDLJob]) - errFileNotFound = terror.ClassDDL.New(mysql.ErrFileNotFound, mysql.MySQLErrName[mysql.ErrFileNotFound]) - errRunMultiSchemaChanges = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "multi schema change")) - errWaitReorgTimeout = terror.ClassDDL.New(mysql.ErrLockWaitTimeout, mysql.MySQLErrName[mysql.ErrWaitReorgTimeout]) - errInvalidStoreVer = terror.ClassDDL.New(mysql.ErrInvalidStoreVersion, mysql.MySQLErrName[mysql.ErrInvalidStoreVersion]) + errNotOwner = dbterror.ClassDDL.NewStd(mysql.ErrNotOwner) + errCantDecodeRecord = dbterror.ClassDDL.NewStd(mysql.ErrCantDecodeRecord) + errInvalidDDLJob = dbterror.ClassDDL.NewStd(mysql.ErrInvalidDDLJob) + errCancelledDDLJob = dbterror.ClassDDL.NewStd(mysql.ErrCancelledDDLJob) + errFileNotFound = dbterror.ClassDDL.NewStd(mysql.ErrFileNotFound) + errRunMultiSchemaChanges = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "multi schema change"), nil)) + errWaitReorgTimeout = dbterror.ClassDDL.NewStdErr(mysql.ErrLockWaitTimeout, mysql.MySQLErrName[mysql.ErrWaitReorgTimeout]) + errInvalidStoreVer = dbterror.ClassDDL.NewStd(mysql.ErrInvalidStoreVersion) // ErrRepairTableFail is used to repair tableInfo in repair mode. - ErrRepairTableFail = terror.ClassDDL.New(mysql.ErrRepairTable, mysql.MySQLErrName[mysql.ErrRepairTable]) + ErrRepairTableFail = dbterror.ClassDDL.NewStd(mysql.ErrRepairTable) // We don't support dropping column with index covered now. - errCantDropColWithIndex = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "drop column with index")) - errUnsupportedAddColumn = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "add column")) - errUnsupportedModifyColumn = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "modify column: %s")) - errUnsupportedModifyCharset = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "modify %s")) - errUnsupportedModifyCollation = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "modifying collation from %s to %s")) - errUnsupportedPKHandle = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "drop integer primary key")) - errUnsupportedCharset = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "charset %s and collate %s")) - errUnsupportedShardRowIDBits = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "shard_row_id_bits for table with primary key as row id")) - errUnsupportedAlterTableWithValidation = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, "ALTER TABLE WITH VALIDATION is currently unsupported") - errUnsupportedAlterTableWithoutValidation = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, "ALTER TABLE WITHOUT VALIDATION is currently unsupported") - errBlobKeyWithoutLength = terror.ClassDDL.New(mysql.ErrBlobKeyWithoutLength, mysql.MySQLErrName[mysql.ErrBlobKeyWithoutLength]) - errKeyPart0 = terror.ClassDDL.New(mysql.ErrKeyPart0, mysql.MySQLErrName[mysql.ErrKeyPart0]) - errIncorrectPrefixKey = terror.ClassDDL.New(mysql.ErrWrongSubKey, mysql.MySQLErrName[mysql.ErrWrongSubKey]) - errTooLongKey = terror.ClassDDL.New(mysql.ErrTooLongKey, mysql.MySQLErrName[mysql.ErrTooLongKey]) - errKeyColumnDoesNotExits = terror.ClassDDL.New(mysql.ErrKeyColumnDoesNotExits, mysql.MySQLErrName[mysql.ErrKeyColumnDoesNotExits]) - errUnknownTypeLength = terror.ClassDDL.New(mysql.ErrUnknownTypeLength, mysql.MySQLErrName[mysql.ErrUnknownTypeLength]) - errUnknownFractionLength = terror.ClassDDL.New(mysql.ErrUnknownFractionLength, mysql.MySQLErrName[mysql.ErrUnknownFractionLength]) - errInvalidDDLJobVersion = terror.ClassDDL.New(mysql.ErrInvalidDDLJobVersion, mysql.MySQLErrName[mysql.ErrInvalidDDLJobVersion]) - errInvalidUseOfNull = terror.ClassDDL.New(mysql.ErrInvalidUseOfNull, mysql.MySQLErrName[mysql.ErrInvalidUseOfNull]) - errTooManyFields = terror.ClassDDL.New(mysql.ErrTooManyFields, mysql.MySQLErrName[mysql.ErrTooManyFields]) - errInvalidSplitRegionRanges = terror.ClassDDL.New(mysql.ErrInvalidSplitRegionRanges, mysql.MySQLErrName[mysql.ErrInvalidSplitRegionRanges]) - errReorgPanic = terror.ClassDDL.New(mysql.ErrReorgPanic, mysql.MySQLErrName[mysql.ErrReorgPanic]) - errFkColumnCannotDrop = terror.ClassDDL.New(mysql.ErrFkColumnCannotDrop, mysql.MySQLErrName[mysql.ErrFkColumnCannotDrop]) - errFKIncompatibleColumns = terror.ClassDDL.New(mysql.ErrFKIncompatibleColumns, mysql.MySQLErrName[mysql.ErrFKIncompatibleColumns]) - - errOnlyOnRangeListPartition = terror.ClassDDL.New(mysql.ErrOnlyOnRangeListPartition, mysql.MySQLErrName[mysql.ErrOnlyOnRangeListPartition]) + errCantDropColWithIndex = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "drop column with index"), nil)) + errUnsupportedAddColumn = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "add column"), nil)) + errUnsupportedModifyColumn = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "modify column: %s"), nil)) + errUnsupportedModifyCharset = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "modify %s"), nil)) + errUnsupportedModifyCollation = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "modifying collation from %s to %s"), nil)) + errUnsupportedPKHandle = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "drop integer primary key"), nil)) + errUnsupportedCharset = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "charset %s and collate %s"), nil)) + errUnsupportedShardRowIDBits = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "shard_row_id_bits for table with primary key as row id"), nil)) + errUnsupportedAlterTableWithValidation = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER TABLE WITH VALIDATION is currently unsupported", nil)) + errUnsupportedAlterTableWithoutValidation = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("ALTER TABLE WITHOUT VALIDATION is currently unsupported", nil)) + errUnsupportedAlterTableOption = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("This type of ALTER TABLE is currently unsupported", nil)) + errBlobKeyWithoutLength = dbterror.ClassDDL.NewStd(mysql.ErrBlobKeyWithoutLength) + errKeyPart0 = dbterror.ClassDDL.NewStd(mysql.ErrKeyPart0) + errIncorrectPrefixKey = dbterror.ClassDDL.NewStd(mysql.ErrWrongSubKey) + errTooLongKey = dbterror.ClassDDL.NewStd(mysql.ErrTooLongKey) + errKeyColumnDoesNotExits = dbterror.ClassDDL.NewStd(mysql.ErrKeyColumnDoesNotExits) + errInvalidDDLJobVersion = dbterror.ClassDDL.NewStd(mysql.ErrInvalidDDLJobVersion) + errInvalidUseOfNull = dbterror.ClassDDL.NewStd(mysql.ErrInvalidUseOfNull) + errTooManyFields = dbterror.ClassDDL.NewStd(mysql.ErrTooManyFields) + errTooManyKeys = dbterror.ClassDDL.NewStd(mysql.ErrTooManyKeys) + errInvalidSplitRegionRanges = dbterror.ClassDDL.NewStd(mysql.ErrInvalidSplitRegionRanges) + errReorgPanic = dbterror.ClassDDL.NewStd(mysql.ErrReorgPanic) + errFkColumnCannotDrop = dbterror.ClassDDL.NewStd(mysql.ErrFkColumnCannotDrop) + errFKIncompatibleColumns = dbterror.ClassDDL.NewStd(mysql.ErrFKIncompatibleColumns) + + errOnlyOnRangeListPartition = dbterror.ClassDDL.NewStd(mysql.ErrOnlyOnRangeListPartition) // errWrongKeyColumn is for table column cannot be indexed. - errWrongKeyColumn = terror.ClassDDL.New(mysql.ErrWrongKeyColumn, mysql.MySQLErrName[mysql.ErrWrongKeyColumn]) + errWrongKeyColumn = dbterror.ClassDDL.NewStd(mysql.ErrWrongKeyColumn) // errWrongKeyColumnFunctionalIndex is for expression cannot be indexed. - errWrongKeyColumnFunctionalIndex = terror.ClassDDL.New(mysql.ErrWrongKeyColumnFunctionalIndex, mysql.MySQLErrName[mysql.ErrWrongKeyColumnFunctionalIndex]) + errWrongKeyColumnFunctionalIndex = dbterror.ClassDDL.NewStd(mysql.ErrWrongKeyColumnFunctionalIndex) // errWrongFKOptionForGeneratedColumn is for wrong foreign key reference option on generated columns. - errWrongFKOptionForGeneratedColumn = terror.ClassDDL.New(mysql.ErrWrongFKOptionForGeneratedColumn, mysql.MySQLErrName[mysql.ErrWrongFKOptionForGeneratedColumn]) + errWrongFKOptionForGeneratedColumn = dbterror.ClassDDL.NewStd(mysql.ErrWrongFKOptionForGeneratedColumn) // ErrUnsupportedOnGeneratedColumn is for unsupported actions on generated columns. - ErrUnsupportedOnGeneratedColumn = terror.ClassDDL.New(mysql.ErrUnsupportedOnGeneratedColumn, mysql.MySQLErrName[mysql.ErrUnsupportedOnGeneratedColumn]) + ErrUnsupportedOnGeneratedColumn = dbterror.ClassDDL.NewStd(mysql.ErrUnsupportedOnGeneratedColumn) // errGeneratedColumnNonPrior forbids to refer generated column non prior to it. - errGeneratedColumnNonPrior = terror.ClassDDL.New(mysql.ErrGeneratedColumnNonPrior, mysql.MySQLErrName[mysql.ErrGeneratedColumnNonPrior]) + errGeneratedColumnNonPrior = dbterror.ClassDDL.NewStd(mysql.ErrGeneratedColumnNonPrior) // errDependentByGeneratedColumn forbids to delete columns which are dependent by generated columns. - errDependentByGeneratedColumn = terror.ClassDDL.New(mysql.ErrDependentByGeneratedColumn, mysql.MySQLErrName[mysql.ErrDependentByGeneratedColumn]) + errDependentByGeneratedColumn = dbterror.ClassDDL.NewStd(mysql.ErrDependentByGeneratedColumn) // errJSONUsedAsKey forbids to use JSON as key or index. - errJSONUsedAsKey = terror.ClassDDL.New(mysql.ErrJSONUsedAsKey, mysql.MySQLErrName[mysql.ErrJSONUsedAsKey]) + errJSONUsedAsKey = dbterror.ClassDDL.NewStd(mysql.ErrJSONUsedAsKey) // errBlobCantHaveDefault forbids to give not null default value to TEXT/BLOB/JSON. - errBlobCantHaveDefault = terror.ClassDDL.New(mysql.ErrBlobCantHaveDefault, mysql.MySQLErrName[mysql.ErrBlobCantHaveDefault]) - errTooLongIndexComment = terror.ClassDDL.New(mysql.ErrTooLongIndexComment, mysql.MySQLErrName[mysql.ErrTooLongIndexComment]) + errBlobCantHaveDefault = dbterror.ClassDDL.NewStd(mysql.ErrBlobCantHaveDefault) + errTooLongIndexComment = dbterror.ClassDDL.NewStd(mysql.ErrTooLongIndexComment) // ErrInvalidDefaultValue returns for invalid default value for columns. - ErrInvalidDefaultValue = terror.ClassDDL.New(mysql.ErrInvalidDefault, mysql.MySQLErrName[mysql.ErrInvalidDefault]) + ErrInvalidDefaultValue = dbterror.ClassDDL.NewStd(mysql.ErrInvalidDefault) // ErrGeneratedColumnRefAutoInc forbids to refer generated columns to auto-increment columns . - ErrGeneratedColumnRefAutoInc = terror.ClassDDL.New(mysql.ErrGeneratedColumnRefAutoInc, mysql.MySQLErrName[mysql.ErrGeneratedColumnRefAutoInc]) + ErrGeneratedColumnRefAutoInc = dbterror.ClassDDL.NewStd(mysql.ErrGeneratedColumnRefAutoInc) // ErrExpressionIndexCanNotRefer forbids to refer expression index to auto-increment column. - ErrExpressionIndexCanNotRefer = terror.ClassDDL.New(mysql.ErrFunctionalIndexRefAutoIncrement, mysql.MySQLErrName[mysql.ErrFunctionalIndexRefAutoIncrement]) + ErrExpressionIndexCanNotRefer = dbterror.ClassDDL.NewStd(mysql.ErrFunctionalIndexRefAutoIncrement) // ErrUnsupportedAddPartition returns for does not support add partitions. - ErrUnsupportedAddPartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "add partitions")) + ErrUnsupportedAddPartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "add partitions"), nil)) // ErrUnsupportedCoalescePartition returns for does not support coalesce partitions. - ErrUnsupportedCoalescePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "coalesce partitions")) - errUnsupportedReorganizePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "reorganize partition")) - errUnsupportedCheckPartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "check partition")) - errUnsupportedOptimizePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "optimize partition")) - errUnsupportedRebuildPartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "rebuild partition")) - errUnsupportedRemovePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "remove partitioning")) - errUnsupportedRepairPartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "repair partition")) - errUnsupportedExchangePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "exchange partition")) + ErrUnsupportedCoalescePartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "coalesce partitions"), nil)) + errUnsupportedReorganizePartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "reorganize partition"), nil)) + errUnsupportedCheckPartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "check partition"), nil)) + errUnsupportedOptimizePartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "optimize partition"), nil)) + errUnsupportedRebuildPartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "rebuild partition"), nil)) + errUnsupportedRemovePartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "remove partitioning"), nil)) + errUnsupportedRepairPartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "repair partition"), nil)) // ErrGeneratedColumnFunctionIsNotAllowed returns for unsupported functions for generated columns. - ErrGeneratedColumnFunctionIsNotAllowed = terror.ClassDDL.New(mysql.ErrGeneratedColumnFunctionIsNotAllowed, mysql.MySQLErrName[mysql.ErrGeneratedColumnFunctionIsNotAllowed]) + ErrGeneratedColumnFunctionIsNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrGeneratedColumnFunctionIsNotAllowed) // ErrGeneratedColumnRowValueIsNotAllowed returns for generated columns referring to row values. - ErrGeneratedColumnRowValueIsNotAllowed = terror.ClassDDL.New(mysql.ErrGeneratedColumnRowValueIsNotAllowed, mysql.MySQLErrName[mysql.ErrGeneratedColumnRowValueIsNotAllowed]) + ErrGeneratedColumnRowValueIsNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrGeneratedColumnRowValueIsNotAllowed) // ErrUnsupportedPartitionByRangeColumns returns for does unsupported partition by range columns. - ErrUnsupportedPartitionByRangeColumns = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "partition by range columns")) + ErrUnsupportedPartitionByRangeColumns = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "partition by range columns"), nil)) // ErrFunctionalIndexFunctionIsNotAllowed returns for unsupported functions for functional index. - ErrFunctionalIndexFunctionIsNotAllowed = terror.ClassDDL.New(mysql.ErrFunctionalIndexFunctionIsNotAllowed, mysql.MySQLErrName[mysql.ErrFunctionalIndexFunctionIsNotAllowed]) + ErrFunctionalIndexFunctionIsNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrFunctionalIndexFunctionIsNotAllowed) // ErrFunctionalIndexRowValueIsNotAllowed returns for functional index referring to row values. - ErrFunctionalIndexRowValueIsNotAllowed = terror.ClassDDL.New(mysql.ErrFunctionalIndexRowValueIsNotAllowed, mysql.MySQLErrName[mysql.ErrFunctionalIndexRowValueIsNotAllowed]) - errUnsupportedCreatePartition = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "partition type, treat as normal table")) - errTablePartitionDisabled = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, "Partitions are ignored because Table Partition is disabled, please set 'tidb_enable_table_partition' if you need to need to enable it") - errUnsupportedIndexType = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "index type")) + ErrFunctionalIndexRowValueIsNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrFunctionalIndexRowValueIsNotAllowed) + errUnsupportedCreatePartition = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "partition type, treat as normal table"), nil)) + errTablePartitionDisabled = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("Partitions are ignored because Table Partition is disabled, please set 'tidb_enable_table_partition' if you need to need to enable it", nil)) + errUnsupportedIndexType = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "index type"), nil)) + errWindowInvalidWindowFuncUse = dbterror.ClassDDL.NewStd(mysql.ErrWindowInvalidWindowFuncUse) // ErrDupKeyName returns for duplicated key name - ErrDupKeyName = terror.ClassDDL.New(mysql.ErrDupKeyName, mysql.MySQLErrName[mysql.ErrDupKeyName]) + ErrDupKeyName = dbterror.ClassDDL.NewStd(mysql.ErrDupKeyName) // ErrInvalidDDLState returns for invalid ddl model object state. - ErrInvalidDDLState = terror.ClassDDL.New(mysql.ErrInvalidDDLState, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInvalidDDLState])) + ErrInvalidDDLState = dbterror.ClassDDL.NewStdErr(mysql.ErrInvalidDDLState, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInvalidDDLState].Raw), nil)) // ErrUnsupportedModifyPrimaryKey returns an error when add or drop the primary key. // It's exported for testing. - ErrUnsupportedModifyPrimaryKey = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "%s primary key")) + ErrUnsupportedModifyPrimaryKey = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "%s primary key"), nil)) // ErrPKIndexCantBeInvisible return an error when primary key is invisible index - ErrPKIndexCantBeInvisible = terror.ClassDDL.New(mysql.ErrPKIndexCantBeInvisible, mysql.MySQLErrName[mysql.ErrPKIndexCantBeInvisible]) + ErrPKIndexCantBeInvisible = dbterror.ClassDDL.NewStd(mysql.ErrPKIndexCantBeInvisible) // ErrColumnBadNull returns for a bad null value. - ErrColumnBadNull = terror.ClassDDL.New(mysql.ErrBadNull, mysql.MySQLErrName[mysql.ErrBadNull]) + ErrColumnBadNull = dbterror.ClassDDL.NewStd(mysql.ErrBadNull) // ErrBadField forbids to refer to unknown column. - ErrBadField = terror.ClassDDL.New(mysql.ErrBadField, mysql.MySQLErrName[mysql.ErrBadField]) + ErrBadField = dbterror.ClassDDL.NewStd(mysql.ErrBadField) // ErrCantRemoveAllFields returns for deleting all columns. - ErrCantRemoveAllFields = terror.ClassDDL.New(mysql.ErrCantRemoveAllFields, mysql.MySQLErrName[mysql.ErrCantRemoveAllFields]) + ErrCantRemoveAllFields = dbterror.ClassDDL.NewStd(mysql.ErrCantRemoveAllFields) // ErrCantDropFieldOrKey returns for dropping a non-existent field or key. - ErrCantDropFieldOrKey = terror.ClassDDL.New(mysql.ErrCantDropFieldOrKey, mysql.MySQLErrName[mysql.ErrCantDropFieldOrKey]) + ErrCantDropFieldOrKey = dbterror.ClassDDL.NewStd(mysql.ErrCantDropFieldOrKey) // ErrInvalidOnUpdate returns for invalid ON UPDATE clause. - ErrInvalidOnUpdate = terror.ClassDDL.New(mysql.ErrInvalidOnUpdate, mysql.MySQLErrName[mysql.ErrInvalidOnUpdate]) + ErrInvalidOnUpdate = dbterror.ClassDDL.NewStd(mysql.ErrInvalidOnUpdate) // ErrTooLongIdent returns for too long name of database/table/column/index. - ErrTooLongIdent = terror.ClassDDL.New(mysql.ErrTooLongIdent, mysql.MySQLErrName[mysql.ErrTooLongIdent]) + ErrTooLongIdent = dbterror.ClassDDL.NewStd(mysql.ErrTooLongIdent) // ErrWrongDBName returns for wrong database name. - ErrWrongDBName = terror.ClassDDL.New(mysql.ErrWrongDBName, mysql.MySQLErrName[mysql.ErrWrongDBName]) + ErrWrongDBName = dbterror.ClassDDL.NewStd(mysql.ErrWrongDBName) // ErrWrongTableName returns for wrong table name. - ErrWrongTableName = terror.ClassDDL.New(mysql.ErrWrongTableName, mysql.MySQLErrName[mysql.ErrWrongTableName]) + ErrWrongTableName = dbterror.ClassDDL.NewStd(mysql.ErrWrongTableName) // ErrWrongColumnName returns for wrong column name. - ErrWrongColumnName = terror.ClassDDL.New(mysql.ErrWrongColumnName, mysql.MySQLErrName[mysql.ErrWrongColumnName]) + ErrWrongColumnName = dbterror.ClassDDL.NewStd(mysql.ErrWrongColumnName) // ErrInvalidGroupFuncUse returns for using invalid group functions. - ErrInvalidGroupFuncUse = terror.ClassDDL.New(mysql.ErrInvalidGroupFuncUse, mysql.MySQLErrName[mysql.ErrInvalidGroupFuncUse]) + ErrInvalidGroupFuncUse = dbterror.ClassDDL.NewStd(mysql.ErrInvalidGroupFuncUse) // ErrTableMustHaveColumns returns for missing column when creating a table. - ErrTableMustHaveColumns = terror.ClassDDL.New(mysql.ErrTableMustHaveColumns, mysql.MySQLErrName[mysql.ErrTableMustHaveColumns]) + ErrTableMustHaveColumns = dbterror.ClassDDL.NewStd(mysql.ErrTableMustHaveColumns) // ErrWrongNameForIndex returns for wrong index name. - ErrWrongNameForIndex = terror.ClassDDL.New(mysql.ErrWrongNameForIndex, mysql.MySQLErrName[mysql.ErrWrongNameForIndex]) + ErrWrongNameForIndex = dbterror.ClassDDL.NewStd(mysql.ErrWrongNameForIndex) // ErrUnknownCharacterSet returns unknown character set. - ErrUnknownCharacterSet = terror.ClassDDL.New(mysql.ErrUnknownCharacterSet, mysql.MySQLErrName[mysql.ErrUnknownCharacterSet]) + ErrUnknownCharacterSet = dbterror.ClassDDL.NewStd(mysql.ErrUnknownCharacterSet) // ErrUnknownCollation returns unknown collation. - ErrUnknownCollation = terror.ClassDDL.New(mysql.ErrUnknownCollation, mysql.MySQLErrName[mysql.ErrUnknownCollation]) + ErrUnknownCollation = dbterror.ClassDDL.NewStd(mysql.ErrUnknownCollation) // ErrCollationCharsetMismatch returns when collation not match the charset. - ErrCollationCharsetMismatch = terror.ClassDDL.New(mysql.ErrCollationCharsetMismatch, mysql.MySQLErrName[mysql.ErrCollationCharsetMismatch]) + ErrCollationCharsetMismatch = dbterror.ClassDDL.NewStd(mysql.ErrCollationCharsetMismatch) // ErrConflictingDeclarations return conflict declarations. - ErrConflictingDeclarations = terror.ClassDDL.New(mysql.ErrConflictingDeclarations, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrConflictingDeclarations], "CHARACTER SET ", "%s", "CHARACTER SET ", "%s")) + ErrConflictingDeclarations = dbterror.ClassDDL.NewStdErr(mysql.ErrConflictingDeclarations, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrConflictingDeclarations].Raw, "CHARACTER SET ", "%s", "CHARACTER SET ", "%s"), nil)) // ErrPrimaryCantHaveNull returns All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead - ErrPrimaryCantHaveNull = terror.ClassDDL.New(mysql.ErrPrimaryCantHaveNull, mysql.MySQLErrName[mysql.ErrPrimaryCantHaveNull]) + ErrPrimaryCantHaveNull = dbterror.ClassDDL.NewStd(mysql.ErrPrimaryCantHaveNull) // ErrErrorOnRename returns error for wrong database name in alter table rename - ErrErrorOnRename = terror.ClassDDL.New(mysql.ErrErrorOnRename, mysql.MySQLErrName[mysql.ErrErrorOnRename]) + ErrErrorOnRename = dbterror.ClassDDL.NewStd(mysql.ErrErrorOnRename) // ErrViewSelectClause returns error for create view with select into clause - ErrViewSelectClause = terror.ClassDDL.New(mysql.ErrViewSelectClause, mysql.MySQLErrName[mysql.ErrViewSelectClause]) + ErrViewSelectClause = dbterror.ClassDDL.NewStd(mysql.ErrViewSelectClause) // ErrNotAllowedTypeInPartition returns not allowed type error when creating table partition with unsupported expression type. - ErrNotAllowedTypeInPartition = terror.ClassDDL.New(mysql.ErrFieldTypeNotAllowedAsPartitionField, mysql.MySQLErrName[mysql.ErrFieldTypeNotAllowedAsPartitionField]) + ErrNotAllowedTypeInPartition = dbterror.ClassDDL.NewStd(mysql.ErrFieldTypeNotAllowedAsPartitionField) // ErrPartitionMgmtOnNonpartitioned returns it's not a partition table. - ErrPartitionMgmtOnNonpartitioned = terror.ClassDDL.New(mysql.ErrPartitionMgmtOnNonpartitioned, mysql.MySQLErrName[mysql.ErrPartitionMgmtOnNonpartitioned]) + ErrPartitionMgmtOnNonpartitioned = dbterror.ClassDDL.NewStd(mysql.ErrPartitionMgmtOnNonpartitioned) // ErrDropPartitionNonExistent returns error in list of partition. - ErrDropPartitionNonExistent = terror.ClassDDL.New(mysql.ErrDropPartitionNonExistent, mysql.MySQLErrName[mysql.ErrDropPartitionNonExistent]) + ErrDropPartitionNonExistent = dbterror.ClassDDL.NewStd(mysql.ErrDropPartitionNonExistent) // ErrSameNamePartition returns duplicate partition name. - ErrSameNamePartition = terror.ClassDDL.New(mysql.ErrSameNamePartition, mysql.MySQLErrName[mysql.ErrSameNamePartition]) + ErrSameNamePartition = dbterror.ClassDDL.NewStd(mysql.ErrSameNamePartition) // ErrRangeNotIncreasing returns values less than value must be strictly increasing for each partition. - ErrRangeNotIncreasing = terror.ClassDDL.New(mysql.ErrRangeNotIncreasing, mysql.MySQLErrName[mysql.ErrRangeNotIncreasing]) + ErrRangeNotIncreasing = dbterror.ClassDDL.NewStd(mysql.ErrRangeNotIncreasing) // ErrPartitionMaxvalue returns maxvalue can only be used in last partition definition. - ErrPartitionMaxvalue = terror.ClassDDL.New(mysql.ErrPartitionMaxvalue, mysql.MySQLErrName[mysql.ErrPartitionMaxvalue]) - //ErrDropLastPartition returns cannot remove all partitions, use drop table instead. - ErrDropLastPartition = terror.ClassDDL.New(mysql.ErrDropLastPartition, mysql.MySQLErrName[mysql.ErrDropLastPartition]) - //ErrTooManyPartitions returns too many partitions were defined. - ErrTooManyPartitions = terror.ClassDDL.New(mysql.ErrTooManyPartitions, mysql.MySQLErrName[mysql.ErrTooManyPartitions]) - //ErrPartitionFunctionIsNotAllowed returns this partition function is not allowed. - ErrPartitionFunctionIsNotAllowed = terror.ClassDDL.New(mysql.ErrPartitionFunctionIsNotAllowed, mysql.MySQLErrName[mysql.ErrPartitionFunctionIsNotAllowed]) + ErrPartitionMaxvalue = dbterror.ClassDDL.NewStd(mysql.ErrPartitionMaxvalue) + // ErrDropLastPartition returns cannot remove all partitions, use drop table instead. + ErrDropLastPartition = dbterror.ClassDDL.NewStd(mysql.ErrDropLastPartition) + // ErrTooManyPartitions returns too many partitions were defined. + ErrTooManyPartitions = dbterror.ClassDDL.NewStd(mysql.ErrTooManyPartitions) + // ErrPartitionFunctionIsNotAllowed returns this partition function is not allowed. + ErrPartitionFunctionIsNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrPartitionFunctionIsNotAllowed) // ErrPartitionFuncNotAllowed returns partition function returns the wrong type. - ErrPartitionFuncNotAllowed = terror.ClassDDL.New(mysql.ErrPartitionFuncNotAllowed, mysql.MySQLErrName[mysql.ErrPartitionFuncNotAllowed]) + ErrPartitionFuncNotAllowed = dbterror.ClassDDL.NewStd(mysql.ErrPartitionFuncNotAllowed) // ErrUniqueKeyNeedAllFieldsInPf returns must include all columns in the table's partitioning function. - ErrUniqueKeyNeedAllFieldsInPf = terror.ClassDDL.New(mysql.ErrUniqueKeyNeedAllFieldsInPf, mysql.MySQLErrName[mysql.ErrUniqueKeyNeedAllFieldsInPf]) - errWrongExprInPartitionFunc = terror.ClassDDL.New(mysql.ErrWrongExprInPartitionFunc, mysql.MySQLErrName[mysql.ErrWrongExprInPartitionFunc]) + ErrUniqueKeyNeedAllFieldsInPf = dbterror.ClassDDL.NewStd(mysql.ErrUniqueKeyNeedAllFieldsInPf) + // ErrWrongExprInPartitionFunc Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed. + ErrWrongExprInPartitionFunc = dbterror.ClassDDL.NewStd(mysql.ErrWrongExprInPartitionFunc) // ErrWarnDataTruncated returns data truncated error. - ErrWarnDataTruncated = terror.ClassDDL.New(mysql.WarnDataTruncated, mysql.MySQLErrName[mysql.WarnDataTruncated]) + ErrWarnDataTruncated = dbterror.ClassDDL.NewStd(mysql.WarnDataTruncated) // ErrCoalesceOnlyOnHashPartition returns coalesce partition can only be used on hash/key partitions. - ErrCoalesceOnlyOnHashPartition = terror.ClassDDL.New(mysql.ErrCoalesceOnlyOnHashPartition, mysql.MySQLErrName[mysql.ErrCoalesceOnlyOnHashPartition]) + ErrCoalesceOnlyOnHashPartition = dbterror.ClassDDL.NewStd(mysql.ErrCoalesceOnlyOnHashPartition) // ErrViewWrongList returns create view must include all columns in the select clause - ErrViewWrongList = terror.ClassDDL.New(mysql.ErrViewWrongList, mysql.MySQLErrName[mysql.ErrViewWrongList]) + ErrViewWrongList = dbterror.ClassDDL.NewStd(mysql.ErrViewWrongList) // ErrAlterOperationNotSupported returns when alter operations is not supported. - ErrAlterOperationNotSupported = terror.ClassDDL.New(mysql.ErrAlterOperationNotSupportedReason, mysql.MySQLErrName[mysql.ErrAlterOperationNotSupportedReason]) + ErrAlterOperationNotSupported = dbterror.ClassDDL.NewStd(mysql.ErrAlterOperationNotSupportedReason) // ErrWrongObject returns for wrong object. - ErrWrongObject = terror.ClassDDL.New(mysql.ErrWrongObject, mysql.MySQLErrName[mysql.ErrWrongObject]) + ErrWrongObject = dbterror.ClassDDL.NewStd(mysql.ErrWrongObject) // ErrTableCantHandleFt returns FULLTEXT keys are not supported by table type - ErrTableCantHandleFt = terror.ClassDDL.New(mysql.ErrTableCantHandleFt, mysql.MySQLErrName[mysql.ErrTableCantHandleFt]) + ErrTableCantHandleFt = dbterror.ClassDDL.NewStd(mysql.ErrTableCantHandleFt) // ErrFieldNotFoundPart returns an error when 'partition by columns' are not found in table columns. - ErrFieldNotFoundPart = terror.ClassDDL.New(mysql.ErrFieldNotFoundPart, mysql.MySQLErrName[mysql.ErrFieldNotFoundPart]) + ErrFieldNotFoundPart = dbterror.ClassDDL.NewStd(mysql.ErrFieldNotFoundPart) // ErrWrongTypeColumnValue returns 'Partition column values of incorrect type' - ErrWrongTypeColumnValue = terror.ClassDDL.New(mysql.ErrWrongTypeColumnValue, mysql.MySQLErrName[mysql.ErrWrongTypeColumnValue]) + ErrWrongTypeColumnValue = dbterror.ClassDDL.NewStd(mysql.ErrWrongTypeColumnValue) + // ErrValuesIsNotIntType returns 'VALUES value for partition '%-.64s' must have type INT' + ErrValuesIsNotIntType = dbterror.ClassDDL.NewStd(mysql.ErrValuesIsNotIntType) // ErrFunctionalIndexPrimaryKey returns 'The primary key cannot be a functional index' - ErrFunctionalIndexPrimaryKey = terror.ClassDDL.New(mysql.ErrFunctionalIndexPrimaryKey, mysql.MySQLErrName[mysql.ErrFunctionalIndexPrimaryKey]) + ErrFunctionalIndexPrimaryKey = dbterror.ClassDDL.NewStd(mysql.ErrFunctionalIndexPrimaryKey) // ErrFunctionalIndexOnField returns 'Functional index on a column is not supported. Consider using a regular index instead' - ErrFunctionalIndexOnField = terror.ClassDDL.New(mysql.ErrFunctionalIndexOnField, mysql.MySQLErrName[mysql.ErrFunctionalIndexOnField]) + ErrFunctionalIndexOnField = dbterror.ClassDDL.NewStd(mysql.ErrFunctionalIndexOnField) // ErrInvalidAutoRandom returns when auto_random is used incorrectly. - ErrInvalidAutoRandom = terror.ClassDDL.New(mysql.ErrInvalidAutoRandom, mysql.MySQLErrName[mysql.ErrInvalidAutoRandom]) - // ErrUnsupportedConstraintCheck returns when use ADD CONSTRAINT CHECK. - ErrUnsupportedConstraintCheck = terror.ClassDDL.New(mysql.ErrUnsupportedConstraintCheck, mysql.MySQLErrName[mysql.ErrUnsupportedConstraintCheck]) + ErrInvalidAutoRandom = dbterror.ClassDDL.NewStd(mysql.ErrInvalidAutoRandom) + // ErrUnsupportedConstraintCheck returns when use ADD CONSTRAINT CHECK + ErrUnsupportedConstraintCheck = dbterror.ClassDDL.NewStd(mysql.ErrUnsupportedConstraintCheck) // ErrDerivedMustHaveAlias returns when a sub select statement does not have a table alias. - ErrDerivedMustHaveAlias = terror.ClassDDL.New(mysql.ErrDerivedMustHaveAlias, mysql.MySQLErrName[mysql.ErrDerivedMustHaveAlias]) + ErrDerivedMustHaveAlias = dbterror.ClassDDL.NewStd(mysql.ErrDerivedMustHaveAlias) // ErrSequenceRunOut returns when the sequence has been run out. - ErrSequenceRunOut = terror.ClassDDL.New(mysql.ErrSequenceRunOut, mysql.MySQLErrName[mysql.ErrSequenceRunOut]) + ErrSequenceRunOut = dbterror.ClassDDL.NewStd(mysql.ErrSequenceRunOut) // ErrSequenceInvalidData returns when sequence values are conflicting. - ErrSequenceInvalidData = terror.ClassDDL.New(mysql.ErrSequenceInvalidData, mysql.MySQLErrName[mysql.ErrSequenceInvalidData]) + ErrSequenceInvalidData = dbterror.ClassDDL.NewStd(mysql.ErrSequenceInvalidData) // ErrSequenceAccessFail returns when sequences are not able to access. - ErrSequenceAccessFail = terror.ClassDDL.New(mysql.ErrSequenceAccessFail, mysql.MySQLErrName[mysql.ErrSequenceAccessFail]) + ErrSequenceAccessFail = dbterror.ClassDDL.NewStd(mysql.ErrSequenceAccessFail) // ErrNotSequence returns when object is not a sequence. - ErrNotSequence = terror.ClassDDL.New(mysql.ErrNotSequence, mysql.MySQLErrName[mysql.ErrNotSequence]) + ErrNotSequence = dbterror.ClassDDL.NewStd(mysql.ErrNotSequence) // ErrUnknownSequence returns when drop / alter unknown sequence. - ErrUnknownSequence = terror.ClassDDL.New(mysql.ErrUnknownSequence, mysql.MySQLErrName[mysql.ErrUnknownSequence]) + ErrUnknownSequence = dbterror.ClassDDL.NewStd(mysql.ErrUnknownSequence) // ErrSequenceUnsupportedTableOption returns when unsupported table option exists in sequence. - ErrSequenceUnsupportedTableOption = terror.ClassDDL.New(mysql.ErrSequenceUnsupportedTableOption, mysql.MySQLErrName[mysql.ErrSequenceUnsupportedTableOption]) + ErrSequenceUnsupportedTableOption = dbterror.ClassDDL.NewStd(mysql.ErrSequenceUnsupportedTableOption) // ErrColumnTypeUnsupportedNextValue is returned when sequence next value is assigned to unsupported column type. - ErrColumnTypeUnsupportedNextValue = terror.ClassDDL.New(mysql.ErrColumnTypeUnsupportedNextValue, mysql.MySQLErrName[mysql.ErrColumnTypeUnsupportedNextValue]) + ErrColumnTypeUnsupportedNextValue = dbterror.ClassDDL.NewStd(mysql.ErrColumnTypeUnsupportedNextValue) // ErrAddColumnWithSequenceAsDefault is returned when the new added column with sequence's nextval as it's default value. - ErrAddColumnWithSequenceAsDefault = terror.ClassDDL.New(mysql.ErrAddColumnWithSequenceAsDefault, mysql.MySQLErrName[mysql.ErrAddColumnWithSequenceAsDefault]) + ErrAddColumnWithSequenceAsDefault = dbterror.ClassDDL.NewStd(mysql.ErrAddColumnWithSequenceAsDefault) // ErrUnsupportedExpressionIndex is returned when create an expression index without allow-expression-index. - ErrUnsupportedExpressionIndex = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "creating expression index without allow-expression-index in config")) + ErrUnsupportedExpressionIndex = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "creating expression index without allow-expression-index in config"), nil)) // ErrPartitionExchangePartTable is returned when exchange table partition with another table is partitioned. - ErrPartitionExchangePartTable = terror.ClassDDL.New(mysql.ErrPartitionExchangePartTable, mysql.MySQLErrName[mysql.ErrPartitionExchangePartTable]) + ErrPartitionExchangePartTable = dbterror.ClassDDL.NewStd(mysql.ErrPartitionExchangePartTable) // ErrTablesDifferentMetadata is returned when exchanges tables is not compatible. - ErrTablesDifferentMetadata = terror.ClassDDL.New(mysql.ErrTablesDifferentMetadata, mysql.MySQLErrName[mysql.ErrTablesDifferentMetadata]) + ErrTablesDifferentMetadata = dbterror.ClassDDL.NewStd(mysql.ErrTablesDifferentMetadata) // ErrRowDoesNotMatchPartition is returned when the row record of exchange table does not match the partition rule. - ErrRowDoesNotMatchPartition = terror.ClassDDL.New(mysql.ErrRowDoesNotMatchPartition, mysql.MySQLErrName[mysql.ErrRowDoesNotMatchPartition]) + ErrRowDoesNotMatchPartition = dbterror.ClassDDL.NewStd(mysql.ErrRowDoesNotMatchPartition) // ErrPartitionExchangeForeignKey is returned when exchanged normal table has foreign keys. - ErrPartitionExchangeForeignKey = terror.ClassDDL.New(mysql.ErrPartitionExchangeForeignKey, mysql.MySQLErrName[mysql.ErrPartitionExchangeForeignKey]) + ErrPartitionExchangeForeignKey = dbterror.ClassDDL.NewStd(mysql.ErrPartitionExchangeForeignKey) // ErrCheckNoSuchTable is returned when exchanged normal table is view or sequence. - ErrCheckNoSuchTable = terror.ClassDDL.New(mysql.ErrCheckNoSuchTable, mysql.MySQLErrName[mysql.ErrCheckNoSuchTable]) - errUnsupportedPartitionType = terror.ClassDDL.New(mysql.ErrUnsupportedDDLOperation, fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation], "partition type of table %s when exchanging partition")) + ErrCheckNoSuchTable = dbterror.ClassDDL.NewStd(mysql.ErrCheckNoSuchTable) + errUnsupportedPartitionType = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message(fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUnsupportedDDLOperation].Raw, "partition type of table %s when exchanging partition"), nil)) // ErrPartitionExchangeDifferentOption is returned when attribute does not match between partition table and normal table. - ErrPartitionExchangeDifferentOption = terror.ClassDDL.New(mysql.ErrPartitionExchangeDifferentOption, mysql.MySQLErrName[mysql.ErrPartitionExchangeDifferentOption]) + ErrPartitionExchangeDifferentOption = dbterror.ClassDDL.NewStd(mysql.ErrPartitionExchangeDifferentOption) // ErrTableOptionUnionUnsupported is returned when create/alter table with union option. - ErrTableOptionUnionUnsupported = terror.ClassDDL.New(mysql.ErrTableOptionUnionUnsupported, mysql.MySQLErrName[mysql.ErrTableOptionUnionUnsupported]) + ErrTableOptionUnionUnsupported = dbterror.ClassDDL.NewStd(mysql.ErrTableOptionUnionUnsupported) // ErrTableOptionInsertMethodUnsupported is returned when create/alter table with insert method option. - ErrTableOptionInsertMethodUnsupported = terror.ClassDDL.New(mysql.ErrTableOptionInsertMethodUnsupported, mysql.MySQLErrName[mysql.ErrTableOptionInsertMethodUnsupported]) + ErrTableOptionInsertMethodUnsupported = dbterror.ClassDDL.NewStd(mysql.ErrTableOptionInsertMethodUnsupported) // ErrInvalidPlacementSpec is returned when add/alter an invalid placement rule - ErrInvalidPlacementSpec = terror.ClassDDL.New(mysql.ErrInvalidPlacementSpec, mysql.MySQLErrName[mysql.ErrInvalidPlacementSpec]) + ErrInvalidPlacementSpec = dbterror.ClassDDL.NewStd(mysql.ErrInvalidPlacementSpec) + + // ErrInvalidPlacementPolicyCheck is returned when txn_scope and commit data changing do not meet the placement policy + ErrInvalidPlacementPolicyCheck = dbterror.ClassDDL.NewStd(mysql.ErrPlacementPolicyCheck) + + // ErrMultipleDefConstInListPart returns multiple definition of same constant in list partitioning. + ErrMultipleDefConstInListPart = dbterror.ClassDDL.NewStd(mysql.ErrMultipleDefConstInListPart) + + // ErrTruncatedWrongValue is returned when data has been truncated during conversion. + ErrTruncatedWrongValue = dbterror.ClassDDL.NewStd(mysql.ErrTruncatedWrongValue) + + // ErrWarnDataOutOfRange is returned when the value in a numeric column that is outside the permissible range of the column data type. + // See https://dev.mysql.com/doc/refman/5.5/en/out-of-range-and-overflow.html for details + ErrWarnDataOutOfRange = dbterror.ClassDDL.NewStd(mysql.ErrWarnDataOutOfRange) + + // ErrTooLongValueForType is returned when the individual enum element length is too long. + ErrTooLongValueForType = dbterror.ClassDDL.NewStd(mysql.ErrTooLongValueForType) + + // ErrUnknownEngine is returned when the table engine is unknown. + ErrUnknownEngine = dbterror.ClassDDL.NewStd(mysql.ErrUnknownStorageEngine) + + errExchangePartitionDisabled = dbterror.ClassDDL.NewStdErr(mysql.ErrUnsupportedDDLOperation, parser_mysql.Message("Exchange Partition is disabled, please set 'tidb_enable_exchange_partition' if you need to need to enable it", nil)) ) diff --git a/ddl/fail_test.go b/ddl/fail_test.go index 620d8a10819ea..c499a7b671423 100644 --- a/ddl/fail_test.go +++ b/ddl/fail_test.go @@ -30,7 +30,10 @@ func (s *testColumnChangeSuite) TestFailBeforeDecodeArgs(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() // create table t_fail (c1 int, c2 int); tblInfo := testTableInfo(c, d, "t_fail", 2) ctx := testNewContext(d) diff --git a/ddl/failtest/fail_db_test.go b/ddl/failtest/fail_db_test.go index 3681a528d325d..58f0f2d79d6ce 100644 --- a/ddl/failtest/fail_db_test.go +++ b/ddl/failtest/fail_db_test.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/parser" "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/ddl/testutil" ddlutil "github.com/pingcap/tidb/ddl/util" @@ -35,7 +36,7 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" @@ -45,7 +46,14 @@ import ( func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) testleak.BeforeTest() TestingT(t) testleak.AfterTestT(t)() @@ -119,7 +127,7 @@ func (s *testFailDBSuite) TestHalfwayCancelOperations(c *C) { // Test schema is correct. tk.MustExec("select * from t") // test for renaming table - c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/renameTableErr", `return(true)`), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/ddl/renameTableErr", `return("ty")`), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/ddl/renameTableErr"), IsNil) }() @@ -127,6 +135,15 @@ func (s *testFailDBSuite) TestHalfwayCancelOperations(c *C) { tk.MustExec("insert into tx values(1)") _, err = tk.Exec("rename table tx to ty") c.Assert(err, NotNil) + tk.MustExec("create table ty(a int)") + tk.MustExec("insert into ty values(2)") + _, err = tk.Exec("rename table ty to tz, tx to ty") + c.Assert(err, NotNil) + _, err = tk.Exec("select * from tz") + c.Assert(err, NotNil) + _, err = tk.Exec("rename table tx to ty, ty to tz") + c.Assert(err, NotNil) + tk.MustQuery("select * from ty").Check(testkit.Rows("2")) // Make sure that the table's data has not been deleted. tk.MustQuery("select * from tx").Check(testkit.Rows("1")) // Execute ddl statement reload schema. @@ -146,6 +163,8 @@ func (s *testFailDBSuite) TestHalfwayCancelOperations(c *C) { tk.MustExec("insert into pt values(1), (3), (5)") tk.MustExec("create table nt(a int)") tk.MustExec("insert into nt values(7)") + tk.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk.MustExec("set @@tidb_enable_exchange_partition=0") _, err = tk.Exec("alter table pt exchange partition p1 with table nt") c.Assert(err, NotNil) @@ -335,7 +354,7 @@ func (s *testFailDBSuite) TestAddIndexWorkerNum(c *C) { tk.MustExec("use test_db") tk.MustExec("drop table if exists test_add_index") if s.IsCommonHandle { - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table test_add_index (c1 bigint, c2 bigint, c3 bigint, primary key(c1, c3))") } else { tk.MustExec("create table test_add_index (c1 bigint, c2 bigint, c3 bigint, primary key(c1))") @@ -467,9 +486,9 @@ func (s *testFailDBSuite) TestModifyColumn(c *C) { tk.MustQuery("select * from t").Check(testkit.Rows("2 1 3", "22 11 33")) tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `bb` mediumint(9) DEFAULT NULL,\n" + - " `a` int(11) NOT NULL DEFAULT 1,\n" + - " `c` int(11) NOT NULL DEFAULT 0,\n" + - " PRIMARY KEY (`c`),\n" + + " `a` int(11) NOT NULL DEFAULT '1',\n" + + " `c` int(11) NOT NULL DEFAULT '0',\n" + + " PRIMARY KEY (`c`) /*T![clustered_index] CLUSTERED */,\n" + " KEY `idx` (`bb`),\n" + " KEY `idx1` (`a`),\n" + " KEY `idx2` (`bb`,`c`)\n" + @@ -481,9 +500,9 @@ func (s *testFailDBSuite) TestModifyColumn(c *C) { tk.MustExec("alter table t change column a aa mediumint after c") tk.MustQuery("show create table t").Check(testkit.Rows("t CREATE TABLE `t` (\n" + " `bb` mediumint(9) DEFAULT NULL,\n" + - " `c` int(11) NOT NULL DEFAULT 0,\n" + + " `c` int(11) NOT NULL DEFAULT '0',\n" + " `aa` mediumint(9) DEFAULT NULL,\n" + - " PRIMARY KEY (`c`),\n" + + " PRIMARY KEY (`c`) /*T![clustered_index] CLUSTERED */,\n" + " KEY `idx` (`bb`),\n" + " KEY `idx1` (`aa`),\n" + " KEY `idx2` (`bb`,`c`)\n" + diff --git a/ddl/foreign_key_test.go b/ddl/foreign_key_test.go index 953d0dc6b3260..0bd6456a4df2d 100644 --- a/ddl/foreign_key_test.go +++ b/ddl/foreign_key_test.go @@ -117,7 +117,10 @@ func (s *testForeignKeySuite) TestForeignKey(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() s.d = d s.dbInfo = testSchemaInfo(c, d, "test_foreign") ctx := testNewContext(d) diff --git a/ddl/generated_column.go b/ddl/generated_column.go index d76b030a84434..0b33ad2a90b14 100644 --- a/ddl/generated_column.go +++ b/ddl/generated_column.go @@ -160,7 +160,7 @@ func (c *generatedColumnChecker) Leave(inNode ast.Node) (node ast.Node, ok bool) // 3. check if the modified expr contains non-deterministic functions // 4. check whether new column refers to any auto-increment columns. // 5. check if the new column is indexed or stored -func checkModifyGeneratedColumn(tbl table.Table, oldCol, newCol *table.Column, newColDef *ast.ColumnDef) error { +func checkModifyGeneratedColumn(tbl table.Table, oldCol, newCol *table.Column, newColDef *ast.ColumnDef, pos *ast.ColumnPosition) error { // rule 1. oldColIsStored := !oldCol.IsGenerated() || oldCol.GeneratedStored newColIsStored := !newCol.IsGenerated() || newCol.GeneratedStored @@ -170,10 +170,17 @@ func checkModifyGeneratedColumn(tbl table.Table, oldCol, newCol *table.Column, n // rule 2. originCols := tbl.Cols() + var err error var colName2Generation = make(map[string]columnGenerationInDDL, len(originCols)) for i, column := range originCols { // We can compare the pointers simply. if column == oldCol { + if pos != nil && pos.Tp != ast.ColumnPositionNone { + i, err = findPositionRelativeColumn(originCols, pos) + if err != nil { + return errors.Trace(err) + } + } colName2Generation[newCol.Name.L] = columnGenerationInDDL{ position: i, generated: newCol.IsGenerated(), @@ -213,7 +220,8 @@ func checkModifyGeneratedColumn(tbl table.Table, oldCol, newCol *table.Column, n } // rule 4. - if err := checkGeneratedWithAutoInc(tbl.Meta(), newColDef); err != nil { + _, dependColNames := findDependedColumnNames(newColDef) + if err := checkAutoIncrementRef(newColDef.Name.Name.L, dependColNames, tbl.Meta()); err != nil { return errors.Trace(err) } @@ -229,6 +237,8 @@ type illegalFunctionChecker struct { hasIllegalFunc bool hasAggFunc bool hasRowVal bool // hasRowVal checks whether the functional index refers to a row value + hasWindowFunc bool + otherErr error } func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipChildren bool) { @@ -240,6 +250,11 @@ func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipC c.hasIllegalFunc = true return inNode, true } + err := expression.VerifyArgsWrapper(node.FnName.L, len(node.Args)) + if err != nil { + c.otherErr = err + return inNode, true + } case *ast.SubqueryExpr, *ast.ValuesExpr, *ast.VariableExpr: // Subquery & `values(x)` & variable is not allowed c.hasIllegalFunc = true @@ -251,6 +266,9 @@ func (c *illegalFunctionChecker) Enter(inNode ast.Node) (outNode ast.Node, skipC case *ast.RowExpr: c.hasRowVal = true return inNode, true + case *ast.WindowFuncExpr: + c.hasWindowFunc = true + return inNode, true } return inNode, false } @@ -289,14 +307,11 @@ func checkIllegalFn4Generated(name string, genType int, expr ast.ExprNode) error return ErrFunctionalIndexRowValueIsNotAllowed.GenWithStackByArgs(name) } } - return nil -} - -// Check whether newColumnDef refers to any auto-increment columns. -func checkGeneratedWithAutoInc(tableInfo *model.TableInfo, newColumnDef *ast.ColumnDef) error { - _, dependColNames := findDependedColumnNames(newColumnDef) - if err := checkAutoIncrementRef(newColumnDef.Name.Name.L, dependColNames, tableInfo); err != nil { - return errors.Trace(err) + if c.hasWindowFunc { + return errWindowInvalidWindowFuncUse.GenWithStackByArgs(name) + } + if c.otherErr != nil { + return c.otherErr } return nil } diff --git a/ddl/index.go b/ddl/index.go index 7dfb922045896..1e2423f82ef19 100644 --- a/ddl/index.go +++ b/ddl/index.go @@ -15,7 +15,6 @@ package ddl import ( "context" - "math" "strings" "sync/atomic" "time" @@ -99,6 +98,9 @@ func checkPKOnGeneratedColumn(tblInfo *model.TableInfo, indexPartSpecifications } // Virtual columns cannot be used in primary key. if lastCol.IsGenerated() && !lastCol.GeneratedStored { + if lastCol.Hidden { + return nil, ErrFunctionalIndexPrimaryKey + } return nil, ErrUnsupportedOnGeneratedColumn.GenWithStackByArgs("Defining a virtual generated column as primary key") } } @@ -487,6 +489,10 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo indexInfo.ID = allocateIndexID(tblInfo) tblInfo.Indices = append(tblInfo.Indices, indexInfo) + if err = checkTooManyIndexes(tblInfo.Indices); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } // Here we need do this check before set state to `DeleteOnly`, // because if hidden columns has been set to `DeleteOnly`, // the `DeleteOnly` columns are missing when we do this check. @@ -507,7 +513,7 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo return ver, err } job.SchemaState = model.StateDeleteOnly - metrics.AddIndexProgress.Set(0) + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(0) case model.StateDeleteOnly: // delete only -> write only indexInfo.State = model.StateWriteOnly @@ -529,12 +535,12 @@ func (w *worker) onCreateIndex(d *ddlCtx, t *meta.Meta, job *model.Job, isPK boo if err != nil { break } - // Initialize SnapshotVer to 0 for later reorganization check. - job.SnapshotVer = 0 ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != indexInfo.State) if err != nil { return ver, err } + // Initialize SnapshotVer to 0 for later reorganization check. + job.SnapshotVer = 0 job.SchemaState = model.StateWriteReorganization case model.StateWriteReorganization: // reorganization -> public @@ -616,7 +622,6 @@ func onDropIndex(t *meta.Meta, job *model.Job) (ver int64, _ error) { switch indexInfo.State { case model.StatePublic: // public -> write only - job.SchemaState = model.StateWriteOnly indexInfo.State = model.StateWriteOnly if len(dependentHiddenCols) > 0 { firstHiddenOffset := dependentHiddenCols[0].Offset @@ -627,18 +632,28 @@ func onDropIndex(t *meta.Meta, job *model.Job) (ver int64, _ error) { } } ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != indexInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> delete only - job.SchemaState = model.StateDeleteOnly indexInfo.State = model.StateDeleteOnly updateHiddenColumns(tblInfo, indexInfo, model.StateDeleteOnly) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != indexInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: // delete only -> reorganization - job.SchemaState = model.StateDeleteReorganization indexInfo.State = model.StateDeleteReorganization updateHiddenColumns(tblInfo, indexInfo, model.StateDeleteReorganization) ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != indexInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteReorganization case model.StateDeleteReorganization: // reorganization -> absent newIndices := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) @@ -651,6 +666,12 @@ func onDropIndex(t *meta.Meta, job *model.Job) (ver int64, _ error) { // Set column index flag. dropIndexColumnFlag(tblInfo, indexInfo) + failpoint.Inject("mockExceedErrorLimit", func(val failpoint.Value) { + if val.(bool) { + panic("panic test in cancelling add index") + } + }) + tblInfo.Columns = tblInfo.Columns[:len(tblInfo.Columns)-len(dependentHiddenCols)] ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, originalState != model.StateNone) @@ -803,57 +824,63 @@ type indexRecord struct { handle kv.Handle key []byte // It's used to lock a record. Record it to reduce the encoding time. vals []types.Datum // It's the index values. + rsData []types.Datum // It's the restored data for handle. skip bool // skip indicates that the index key is already exists, we should not add it. } -type addIndexWorker struct { +type baseIndexWorker struct { *backfillWorker - index table.Index + indexes []table.Index + metricCounter prometheus.Counter // The following attributes are used to reduce memory allocation. - defaultVals []types.Datum - idxRecords []*indexRecord - rowMap map[int64]types.Datum - rowDecoder *decoder.RowDecoder + defaultVals []types.Datum + idxRecords []*indexRecord + rowMap map[int64]types.Datum + rowDecoder *decoder.RowDecoder + + sqlMode mysql.SQLMode +} + +type addIndexWorker struct { + baseIndexWorker + index table.Index + + // The following attributes are used to reduce memory allocation. idxKeyBufs [][]byte batchCheckKeys []kv.Key distinctCheckFlags []bool - - sqlMode mysql.SQLMode } func newAddIndexWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, indexInfo *model.IndexInfo, decodeColMap map[int64]decoder.Column, sqlMode mysql.SQLMode) *addIndexWorker { index := tables.NewIndex(t.GetPhysicalID(), t.Meta(), indexInfo) rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) return &addIndexWorker{ - backfillWorker: newBackfillWorker(sessCtx, worker, id, t), - index: index, - metricCounter: metrics.BackfillTotalCounter.WithLabelValues("add_idx_speed"), - rowDecoder: rowDecoder, - defaultVals: make([]types.Datum, len(t.WritableCols())), - rowMap: make(map[int64]types.Datum, len(decodeColMap)), - sqlMode: sqlMode, + baseIndexWorker: baseIndexWorker{ + backfillWorker: newBackfillWorker(sessCtx, worker, id, t), + indexes: []table.Index{index}, + rowDecoder: rowDecoder, + defaultVals: make([]types.Datum, len(t.WritableCols())), + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues("add_idx_speed"), + sqlMode: sqlMode, + }, + index: index, } } -func (w *addIndexWorker) AddMetricInfo(cnt float64) { +func (w *baseIndexWorker) AddMetricInfo(cnt float64) { w.metricCounter.Add(cnt) } // mockNotOwnerErrOnce uses to make sure `notOwnerErr` only mock error once. var mockNotOwnerErrOnce uint32 -// getIndexRecord gets index columns values from raw binary value row. -func (w *addIndexWorker) getIndexRecord(handle kv.Handle, recordKey []byte, rawRecord []byte) (*indexRecord, error) { - t := w.table - cols := t.WritableCols() - idxInfo := w.index.Meta() +// getIndexRecord gets index columns values use w.rowDecoder, and generate indexRecord. +func (w *baseIndexWorker) getIndexRecord(idxInfo *model.IndexInfo, handle kv.Handle, recordKey []byte) (*indexRecord, error) { + cols := w.table.WritableCols() sysZone := timeutil.SystemLocation() - _, err := w.rowDecoder.DecodeAndEvalRowWithMap(w.sessCtx, handle, rawRecord, time.UTC, sysZone, w.rowMap) - if err != nil { - return nil, errors.Trace(errCantDecodeRecord.GenWithStackByArgs("index", err)) - } failpoint.Inject("MockGetIndexRecordErr", func(val failpoint.Value) { if valStr, ok := val.(string); ok { switch valStr { @@ -874,6 +901,7 @@ func (w *addIndexWorker) getIndexRecord(handle kv.Handle, recordKey []byte, rawR } }) idxVal := make([]types.Datum, len(idxInfo.Columns)) + var err error for j, v := range idxInfo.Columns { col := cols[v.Offset] idxColumnVal, ok := w.rowMap[col.ID] @@ -898,74 +926,81 @@ func (w *addIndexWorker) getIndexRecord(handle kv.Handle, recordKey []byte, rawR } idxVal[j] = idxColumnVal } - // If there are generated column, rowDecoder will use column value that not in idxInfo.Columns to calculate - // the generated value, so we need to clear up the reusing map. - w.cleanRowMap() - idxRecord := &indexRecord{handle: handle, key: recordKey, vals: idxVal} + + rsData := tables.TryGetHandleRestoredDataWrapper(w.table, nil, w.rowMap) + idxRecord := &indexRecord{handle: handle, key: recordKey, vals: idxVal, rsData: rsData} return idxRecord, nil } -func (w *addIndexWorker) cleanRowMap() { +func (w *baseIndexWorker) cleanRowMap() { for id := range w.rowMap { delete(w.rowMap, id) } } -// getNextHandle gets next handle of entry that we are going to process. -func (w *addIndexWorker) getNextHandle(taskRange reorgBackfillTask, taskDone bool) (nextHandle kv.Handle) { +// getNextKey gets next key of entry that we are going to process. +func (w *baseIndexWorker) getNextKey(taskRange reorgBackfillTask, taskDone bool) (nextKey kv.Key) { if !taskDone { // The task is not done. So we need to pick the last processed entry's handle and add one. - return w.idxRecords[len(w.idxRecords)-1].handle.Next() + lastHandle := w.idxRecords[len(w.idxRecords)-1].handle + recordKey := tablecodec.EncodeRecordKey(w.table.RecordPrefix(), lastHandle) + return recordKey.Next() } + return taskRange.endKey.Next() +} - // The task is done. So we need to choose a handle outside this range. - // Some corner cases should be considered: - // - The end of task range is MaxInt64. - // - The end of the task is excluded in the range. - if (taskRange.endHandle.IsInt() && taskRange.endHandle.IntValue() == math.MaxInt64) || !taskRange.endIncluded { - return taskRange.endHandle +func (w *baseIndexWorker) updateRowDecoder(handle kv.Handle, recordKey []byte, rawRecord []byte) error { + sysZone := timeutil.SystemLocation() + _, err := w.rowDecoder.DecodeAndEvalRowWithMap(w.sessCtx, handle, rawRecord, time.UTC, sysZone, w.rowMap) + if err != nil { + return errors.Trace(errCantDecodeRecord.GenWithStackByArgs("index", err)) } - - return taskRange.endHandle.Next() + return nil } -// fetchRowColVals fetch w.batchCnt count rows that need to backfill indices, and build the corresponding indexRecord slice. +// fetchRowColVals fetch w.batchCnt count records that need to reorganize indices, and build the corresponding indexRecord slice. // fetchRowColVals returns: // 1. The corresponding indexRecord slice. // 2. Next handle of entry that we need to process. // 3. Boolean indicates whether the task is done. // 4. error occurs in fetchRowColVals. nil if no error occurs. -func (w *addIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*indexRecord, kv.Handle, bool, error) { +func (w *baseIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBackfillTask) ([]*indexRecord, kv.Key, bool, error) { // TODO: use tableScan to prune columns. w.idxRecords = w.idxRecords[:0] startTime := time.Now() - // taskDone means that the added handle is out of taskRange.endHandle. + // taskDone means that the reorged handle is out of taskRange.endHandle. taskDone := false oprStartTime := startTime - err := iterateSnapshotRows(w.sessCtx.GetStore(), w.priority, w.table, txn.StartTS(), taskRange.startHandle, taskRange.endHandle, taskRange.endIncluded, + err := iterateSnapshotRows(w.sessCtx.GetStore(), w.priority, w.table, txn.StartTS(), taskRange.startKey, taskRange.endKey, func(handle kv.Handle, recordKey kv.Key, rawRow []byte) (bool, error) { oprEndTime := time.Now() - logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotRows in addIndexWorker fetchRowColVals", 0) + logSlowOperations(oprEndTime.Sub(oprStartTime), "iterateSnapshotRows in baseIndexWorker fetchRowColVals", 0) oprStartTime = oprEndTime - if !taskRange.endIncluded { - taskDone = handle.Compare(taskRange.endHandle) >= 0 - } else { - taskDone = handle.Compare(taskRange.endHandle) > 0 - } + taskDone = recordKey.Cmp(taskRange.endKey) > 0 if taskDone || len(w.idxRecords) >= w.batchCnt { return false, nil } - idxRecord, err1 := w.getIndexRecord(handle, recordKey, rawRow) - if err1 != nil { - return false, errors.Trace(err1) + // Decode one row, generate records of this row. + err := w.updateRowDecoder(handle, recordKey, rawRow) + if err != nil { + return false, err } + for _, index := range w.indexes { + idxRecord, err1 := w.getIndexRecord(index.Meta(), handle, recordKey) + if err1 != nil { + return false, errors.Trace(err1) + } + w.idxRecords = append(w.idxRecords, idxRecord) + } + // If there are generated column, rowDecoder will use column value that not in idxInfo.Columns to calculate + // the generated value, so we need to clear up the reusing map. + w.cleanRowMap() - w.idxRecords = append(w.idxRecords, idxRecord) - if handle.Equal(taskRange.endHandle) { + if recordKey.Cmp(taskRange.endKey) == 0 { // If taskRange.endIncluded == false, we will not reach here when handle == taskRange.endHandle taskDone = true return false, nil @@ -979,7 +1014,7 @@ func (w *addIndexWorker) fetchRowColVals(txn kv.Transaction, taskRange reorgBack logutil.BgLogger().Debug("[ddl] txn fetches handle info", zap.Uint64("txnStartTS", txn.StartTS()), zap.String("taskRange", taskRange.String()), zap.Duration("takeTime", time.Since(startTime))) - return w.idxRecords, w.getNextHandle(taskRange, taskDone), taskDone, errors.Trace(err) + return w.idxRecords, w.getNextKey(taskRange, taskDone), taskDone, errors.Trace(err) } func (w *addIndexWorker) initBatchCheckBufs(batchCount int) { @@ -991,6 +1026,39 @@ func (w *addIndexWorker) initBatchCheckBufs(batchCount int) { w.distinctCheckFlags = w.distinctCheckFlags[:0] } +func (w *addIndexWorker) checkHandleExists(key kv.Key, value []byte, handle kv.Handle) error { + idxInfo := w.index.Meta() + tblInfo := w.table.Meta() + idxColLen := len(idxInfo.Columns) + h, err := tablecodec.DecodeIndexHandle(key, value, idxColLen) + if err != nil { + return errors.Trace(err) + } + hasBeenBackFilled := h.Equal(handle) + if hasBeenBackFilled { + return nil + } + colInfos := tables.BuildRowcodecColInfoForIndexColumns(idxInfo, tblInfo) + values, err := tablecodec.DecodeIndexKV(key, value, idxColLen, tablecodec.HandleNotNeeded, colInfos) + if err != nil { + return err + } + indexName := w.index.Meta().Name.String() + valueStr := make([]string, 0, idxColLen) + for i, val := range values[:idxColLen] { + d, err := tablecodec.DecodeColumnValue(val, colInfos[i].Ft, time.Local) + if err != nil { + return kv.ErrKeyExists.FastGenByArgs(key.String(), indexName) + } + str, err := d.ToString() + if err != nil { + str = string(val) + } + valueStr = append(valueStr, str) + } + return kv.ErrKeyExists.FastGenByArgs(strings.Join(valueStr, "-"), indexName) +} + func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*indexRecord) error { idxInfo := w.index.Meta() if !idxInfo.Unique { @@ -1024,22 +1092,20 @@ func (w *addIndexWorker) batchCheckUniqueKey(txn kv.Transaction, idxRecords []*i for i, key := range w.batchCheckKeys { if val, found := batchVals[string(key)]; found { if w.distinctCheckFlags[i] { - handle, err1 := tablecodec.DecodeHandleInUniqueIndexValue(val, w.table.Meta().IsCommonHandle) - if err1 != nil { - return errors.Trace(err1) - } - - if handle != idxRecords[i].handle { - return errors.Trace(kv.ErrKeyExists) + if err := w.checkHandleExists(key, val, idxRecords[i].handle); err != nil { + return errors.Trace(err) } } idxRecords[i].skip = true - } else { + } else if w.distinctCheckFlags[i] { // The keys in w.batchCheckKeys also maybe duplicate, // so we need to backfill the not found key into `batchVals` map. - if w.distinctCheckFlags[i] { - batchVals[string(key)] = tablecodec.EncodeHandleInUniqueIndexValue(idxRecords[i].handle, false) + needRsData := tables.NeedRestoredData(w.index.Meta().Columns, w.table.Meta().Columns) + val, err := tablecodec.GenIndexValuePortal(stmtCtx, w.table.Meta(), w.index.Meta(), needRsData, w.distinctCheckFlags[i], false, idxRecords[i].vals, idxRecords[i].handle, 0, idxRecords[i].rsData) + if err != nil { + return errors.Trace(err) } + batchVals[string(key)] = val } } // Constrains is already checked. @@ -1059,16 +1125,16 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC }) oprStartTime := time.Now() - errInTxn = kv.RunInNewTxn(w.sessCtx.GetStore(), true, func(txn kv.Transaction) error { + errInTxn = kv.RunInNewTxn(context.Background(), w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { taskCtx.addedCount = 0 taskCtx.scanCount = 0 txn.SetOption(kv.Priority, w.priority) - idxRecords, nextHandle, taskDone, err := w.fetchRowColVals(txn, handleRange) + idxRecords, nextKey, taskDone, err := w.fetchRowColVals(txn, handleRange) if err != nil { return errors.Trace(err) } - taskCtx.nextHandle = nextHandle + taskCtx.nextKey = nextKey taskCtx.done = taskDone err = w.batchCheckUniqueKey(txn, idxRecords) @@ -1092,7 +1158,7 @@ func (w *addIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskC } // Create the index. - handle, err := w.index.Create(w.sessCtx, txn.GetUnionStore(), idxRecord.vals, idxRecord.handle) + handle, err := w.index.Create(w.sessCtx, txn, idxRecord.vals, idxRecord.handle, idxRecord.rsData) if err != nil { if kv.ErrKeyExists.Equal(err) && idxRecord.handle.Equal(handle) { // Index already exists, skip it. @@ -1178,14 +1244,17 @@ func (w *worker) updateReorgInfo(t table.PartitionedTable, reorg *reorgInfo) (bo if err != nil { return false, errors.Trace(err) } - reorg.StartHandle, reorg.EndHandle, reorg.PhysicalTableID = start, end, pid + reorg.StartKey, reorg.EndKey, reorg.PhysicalTableID = start, end, pid // Write the reorg info to store so the whole reorganize process can recover from panic. err = reorg.UpdateReorgMeta(start) - logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), - zap.ByteString("elementType", reorg.currElement.TypeKey), zap.Int64("elementID", reorg.currElement.ID), - zap.Int64("partitionTableID", pid), zap.String("startHandle", toString(start)), - zap.String("endHandle", toString(end)), zap.Error(err)) + logutil.BgLogger().Info("[ddl] job update reorgInfo", + zap.Int64("jobID", reorg.Job.ID), + zap.ByteString("elementType", reorg.currElement.TypeKey), + zap.Int64("elementID", reorg.currElement.ID), + zap.Int64("partitionTableID", pid), + zap.String("startHandle", tryDecodeToHandleString(start)), + zap.String("endHandle", tryDecodeToHandleString(end)), zap.Error(err)) return false, errors.Trace(err) } @@ -1235,6 +1304,136 @@ func indexColumnSliceEqual(a, b []*model.IndexColumn) bool { return true } +type cleanUpIndexWorker struct { + baseIndexWorker +} + +func newCleanUpIndexWorker(sessCtx sessionctx.Context, worker *worker, id int, t table.PhysicalTable, decodeColMap map[int64]decoder.Column, sqlMode mysql.SQLMode) *cleanUpIndexWorker { + indexes := make([]table.Index, 0, len(t.Indices())) + rowDecoder := decoder.NewRowDecoder(t, t.WritableCols(), decodeColMap) + for _, index := range t.Indices() { + if index.Meta().Global { + indexes = append(indexes, index) + } + } + return &cleanUpIndexWorker{ + baseIndexWorker: baseIndexWorker{ + backfillWorker: newBackfillWorker(sessCtx, worker, id, t), + indexes: indexes, + rowDecoder: rowDecoder, + defaultVals: make([]types.Datum, len(t.WritableCols())), + rowMap: make(map[int64]types.Datum, len(decodeColMap)), + metricCounter: metrics.BackfillTotalCounter.WithLabelValues("clean_up_idx_speed"), + sqlMode: sqlMode, + }, + } +} + +func (w *cleanUpIndexWorker) BackfillDataInTxn(handleRange reorgBackfillTask) (taskCtx backfillTaskContext, errInTxn error) { + failpoint.Inject("errorMockPanic", func(val failpoint.Value) { + if val.(bool) { + panic("panic test") + } + }) + + oprStartTime := time.Now() + errInTxn = kv.RunInNewTxn(context.Background(), w.sessCtx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { + taskCtx.addedCount = 0 + taskCtx.scanCount = 0 + txn.SetOption(kv.Priority, w.priority) + + idxRecords, nextKey, taskDone, err := w.fetchRowColVals(txn, handleRange) + if err != nil { + return errors.Trace(err) + } + taskCtx.nextKey = nextKey + taskCtx.done = taskDone + + n := len(w.indexes) + for i, idxRecord := range idxRecords { + taskCtx.scanCount++ + // we fetch records row by row, so records will belong to + // index[0], index[1] ... index[n-1], index[0], index[1] ... + // respectively. So indexes[i%n] is the index of idxRecords[i]. + err := w.indexes[i%n].Delete(w.sessCtx.GetSessionVars().StmtCtx, txn.GetUnionStore(), idxRecord.vals, idxRecord.handle) + if err != nil { + return errors.Trace(err) + } + taskCtx.addedCount++ + } + return nil + }) + logSlowOperations(time.Since(oprStartTime), "cleanUpIndexBackfillDataInTxn", 3000) + + return +} + +// cleanupPhysicalTableIndex handles the drop partition reorganization state for a non-partitioned table or a partition. +func (w *worker) cleanupPhysicalTableIndex(t table.PhysicalTable, reorgInfo *reorgInfo) error { + logutil.BgLogger().Info("[ddl] start to clean up index", zap.String("job", reorgInfo.Job.String()), zap.String("reorgInfo", reorgInfo.String())) + return w.writePhysicalTableRecord(t.(table.PhysicalTable), typeCleanUpIndexWorker, nil, nil, nil, reorgInfo) +} + +// cleanupGlobalIndex handles the drop partition reorganization state to clean up index entries of partitions. +func (w *worker) cleanupGlobalIndexes(tbl table.PartitionedTable, partitionIDs []int64, reorgInfo *reorgInfo) error { + var err error + var finish bool + for !finish { + p := tbl.GetPartition(reorgInfo.PhysicalTableID) + if p == nil { + return errCancelledDDLJob.GenWithStack("Can not find partition id %d for table %d", reorgInfo.PhysicalTableID, tbl.Meta().ID) + } + err = w.cleanupPhysicalTableIndex(p, reorgInfo) + if err != nil { + break + } + finish, err = w.updateReorgInfoForPartitions(tbl, reorgInfo, partitionIDs) + if err != nil { + return errors.Trace(err) + } + } + + return errors.Trace(err) +} + +// updateReorgInfoForPartitions will find the next partition in partitionIDs according to current reorgInfo. +// If no more partitions, or table t is not a partitioned table, returns true to +// indicate that the reorganize work is finished. +func (w *worker) updateReorgInfoForPartitions(t table.PartitionedTable, reorg *reorgInfo, partitionIDs []int64) (bool, error) { + pi := t.Meta().GetPartitionInfo() + if pi == nil { + return true, nil + } + + var pid int64 + for i, pi := range partitionIDs { + if pi == reorg.PhysicalTableID { + if i == len(partitionIDs)-1 { + return true, nil + } + } + pid = partitionIDs[i+1] + } + + currentVer, err := getValidCurrentVersion(reorg.d.store) + if err != nil { + return false, errors.Trace(err) + } + start, end, err := getTableRange(reorg.d, t.GetPartition(pid), currentVer.Ver, reorg.Job.Priority) + if err != nil { + return false, errors.Trace(err) + } + reorg.StartKey, reorg.EndKey, reorg.PhysicalTableID = start, end, pid + + // Write the reorg info to store so the whole reorganize process can recover from panic. + err = reorg.UpdateReorgMeta(reorg.StartKey) + logutil.BgLogger().Info("[ddl] job update reorgInfo", zap.Int64("jobID", reorg.Job.ID), + zap.ByteString("elementType", reorg.currElement.TypeKey), zap.Int64("elementID", reorg.currElement.ID), + zap.Int64("partitionTableID", pid), zap.String("startHandle", tryDecodeToHandleString(start)), + zap.String("endHandle", tryDecodeToHandleString(end)), zap.Error(err)) + return false, errors.Trace(err) +} + func findIndexesByColName(indexes []*model.IndexInfo, colName string) ([]*model.IndexInfo, []int) { idxInfos := make([]*model.IndexInfo, 0, len(indexes)) offsets := make([]int, 0, len(indexes)) diff --git a/ddl/index_change_test.go b/ddl/index_change_test.go index 457dbc0dc237c..0a54b6b25e694 100644 --- a/ddl/index_change_test.go +++ b/ddl/index_change_test.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" ) @@ -41,7 +42,7 @@ func (s *testIndexChangeSuite) SetUpSuite(c *C) { Name: model.NewCIStr("test_index_change"), ID: 1, } - err := kv.RunInNewTxn(s.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) return errors.Trace(t.CreateDatabase(s.dbInfo)) }) @@ -59,7 +60,10 @@ func (s *testIndexChangeSuite) TestIndexChange(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() // create table t (c1 int primary key, c2 int); tblInfo := testTableInfo(c, d, "t", 2) tblInfo.Columns[0].Flag = mysql.PriKeyFlag | mysql.NotNullFlag @@ -328,11 +332,14 @@ func (s *testIndexChangeSuite) checkAddPublic(d *ddl, ctx sessionctx.Context, wr } var rows [][]types.Datum - publicTbl.IterRecords(ctx, publicTbl.FirstKey(), publicTbl.Cols(), + err = tables.IterRecords(publicTbl, ctx, publicTbl.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { rows = append(rows, data) return true, nil }) + if err != nil { + return errors.Trace(err) + } if len(rows) == 0 { return errors.New("table is empty") } diff --git a/ddl/partition.go b/ddl/partition.go index 1683820f5657f..3daf3322f959d 100644 --- a/ddl/partition.go +++ b/ddl/partition.go @@ -16,7 +16,6 @@ package ddl import ( "bytes" "context" - "encoding/hex" "fmt" "strconv" "strings" @@ -31,22 +30,27 @@ import ( "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/opcode" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + driver "github.com/pingcap/tidb/types/parser_driver" + tidbutil "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" + "github.com/tikv/pd/pkg/slice" "go.uber.org/zap" ) @@ -72,10 +76,10 @@ func checkAddPartition(t *meta.Meta, job *model.Job) (*model.TableInfo, *model.P return tblInfo, partInfo, []model.PartitionDefinition{}, nil } -func onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { +func (w *worker) onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { // Handle the rolling back job if job.IsRollingback() { - ver, err := onDropTablePartition(d, t, job) + ver, err := w.onDropTablePartition(d, t, job) if err != nil { return ver, errors.Trace(err) } @@ -110,11 +114,14 @@ func onAddTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ job.State = model.JobStateCancelled return ver, errors.Trace(err) } - // none -> replica only - job.SchemaState = model.StateReplicaOnly // move the adding definition into tableInfo. updateAddingPartitionInfo(partInfo, tblInfo) ver, err = updateVersionAndTableInfoWithCheck(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + // none -> replica only + job.SchemaState = model.StateReplicaOnly case model.StateReplicaOnly: // replica only -> public // Here need do some tiflash replica complement check. @@ -263,7 +270,7 @@ func checkTiFlashPeerStoreAtLeastOne(stores []*metapb.Store, peers []*metapb.Pee func storeHasEngineTiFlashLabel(store *metapb.Store) bool { for _, label := range store.Labels { - if label.Key == "engine" && label.Value == "tiflash" { + if label.Key == placement.EngineLabelKey && label.Value == placement.EngineLabelTiFlash { return true } } @@ -271,104 +278,197 @@ func storeHasEngineTiFlashLabel(store *metapb.Store) bool { } // buildTablePartitionInfo builds partition info and checks for some errors. -func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.CreateTableStmt) (*model.PartitionInfo, error) { - if s.Partition == nil { - return nil, nil +func buildTablePartitionInfo(ctx sessionctx.Context, s *ast.PartitionOptions, tbInfo *model.TableInfo) error { + if s == nil { + return nil } - if ctx.GetSessionVars().EnableTablePartition == "off" { + if strings.EqualFold(ctx.GetSessionVars().EnableTablePartition, "OFF") { ctx.GetSessionVars().StmtCtx.AppendWarning(errTablePartitionDisabled) - return nil, nil + return nil } var enable bool - // When tidb_enable_table_partition is 'on' or 'auto'. - if s.Partition.Tp == model.PartitionTypeRange { - if s.Partition.Sub == nil { + switch s.Tp { + case model.PartitionTypeRange: + // When tidb_enable_table_partition is 'on' or 'auto'. + if s.Sub == nil { // Partition by range expression is enabled by default. - if s.Partition.ColumnNames == nil { + if s.ColumnNames == nil { enable = true } // Partition by range columns and just one column. - if len(s.Partition.ColumnNames) == 1 { + if len(s.ColumnNames) == 1 { enable = true } } - } - // Partition by hash is enabled by default. - // Note that linear hash is not enabled. - if s.Partition.Tp == model.PartitionTypeHash { - if !s.Partition.Linear && s.Partition.Sub == nil { + case model.PartitionTypeHash: + // Partition by hash is enabled by default. + // Note that linear hash is not enabled. + if !s.Linear && s.Sub == nil { enable = true } + case model.PartitionTypeList: + // Partition by list is enabled only when tidb_enable_list_partition is 'ON'. + enable = ctx.GetSessionVars().EnableListTablePartition } if !enable { ctx.GetSessionVars().StmtCtx.AppendWarning(errUnsupportedCreatePartition) - return nil, nil + return nil } pi := &model.PartitionInfo{ - Type: s.Partition.Tp, + Type: s.Tp, Enable: enable, - Num: s.Partition.Num, + Num: s.Num, } - if s.Partition.Expr != nil { + tbInfo.Partition = pi + if s.Expr != nil { + if err := checkPartitionFuncValid(ctx, tbInfo, s.Expr); err != nil { + return errors.Trace(err) + } buf := new(bytes.Buffer) restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, buf) - if err := s.Partition.Expr.Restore(restoreCtx); err != nil { - return nil, err + if err := s.Expr.Restore(restoreCtx); err != nil { + return err } pi.Expr = buf.String() - } else if s.Partition.ColumnNames != nil { - // TODO: Support multiple columns for 'PARTITION BY RANGE COLUMNS'. - if len(s.Partition.ColumnNames) != 1 { - pi.Enable = false - ctx.GetSessionVars().StmtCtx.AppendWarning(ErrUnsupportedPartitionByRangeColumns) - } - pi.Columns = make([]model.CIStr, 0, len(s.Partition.ColumnNames)) - for _, cn := range s.Partition.ColumnNames { + } else if s.ColumnNames != nil { + pi.Columns = make([]model.CIStr, 0, len(s.ColumnNames)) + for _, cn := range s.ColumnNames { pi.Columns = append(pi.Columns, cn.Name) } + if err := checkColumnsPartitionType(tbInfo); err != nil { + return err + } } - if s.Partition.Tp == model.PartitionTypeRange { - if err := buildRangePartitionDefinitions(ctx, s, pi); err != nil { - return nil, errors.Trace(err) - } - } else if s.Partition.Tp == model.PartitionTypeHash { - if err := buildHashPartitionDefinitions(ctx, s, pi); err != nil { - return nil, errors.Trace(err) - } + defs, err := buildPartitionDefinitionsInfo(ctx, s.Definitions, tbInfo) + if err != nil { + return errors.Trace(err) } - return pi, nil + + tbInfo.Partition.Definitions = defs + return nil } -func buildHashPartitionDefinitions(ctx sessionctx.Context, s *ast.CreateTableStmt, pi *model.PartitionInfo) error { - if err := checkAddPartitionTooManyPartitions(pi.Num); err != nil { - return err +// buildPartitionDefinitionsInfo build partition definitions info without assign partition id. tbInfo will be constant +func buildPartitionDefinitionsInfo(ctx sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) ([]model.PartitionDefinition, error) { + switch tbInfo.Partition.Type { + case model.PartitionTypeRange: + return buildRangePartitionDefinitions(ctx, defs, tbInfo) + case model.PartitionTypeHash: + return buildHashPartitionDefinitions(ctx, defs, tbInfo) + case model.PartitionTypeList: + return buildListPartitionDefinitions(ctx, defs, tbInfo) } + return nil, nil +} - defs := make([]model.PartitionDefinition, pi.Num) - for i := 0; i < len(defs); i++ { - if len(s.Partition.Definitions) == 0 { - defs[i].Name = model.NewCIStr(fmt.Sprintf("p%v", i)) +func buildHashPartitionDefinitions(_ sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) ([]model.PartitionDefinition, error) { + if err := checkAddPartitionTooManyPartitions(tbInfo.Partition.Num); err != nil { + return nil, err + } + + definitions := make([]model.PartitionDefinition, tbInfo.Partition.Num) + for i := 0; i < len(definitions); i++ { + if len(defs) == 0 { + definitions[i].Name = model.NewCIStr(fmt.Sprintf("p%v", i)) } else { - def := s.Partition.Definitions[i] - defs[i].Name = def.Name - defs[i].Comment, _ = def.Comment() + def := defs[i] + definitions[i].Name = def.Name + definitions[i].Comment, _ = def.Comment() + } + } + return definitions, nil +} + +func buildListPartitionDefinitions(ctx sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) ([]model.PartitionDefinition, error) { + definitions := make([]model.PartitionDefinition, 0, len(defs)) + exprChecker := newPartitionExprChecker(ctx, nil, checkPartitionExprAllowed) + for _, def := range defs { + if err := def.Clause.Validate(model.PartitionTypeList, len(tbInfo.Partition.Columns)); err != nil { + return nil, err + } + clause := def.Clause.(*ast.PartitionDefinitionClauseIn) + if len(tbInfo.Partition.Columns) > 0 { + for _, vs := range clause.Values { + if err := checkColumnsTypeAndValuesMatch(ctx, tbInfo, vs); err != nil { + return nil, err + } + } + } else { + for _, vs := range clause.Values { + if err := checkPartitionValuesIsInt(ctx, def, vs, tbInfo); err != nil { + return nil, err + } + } + } + comment, _ := def.Comment() + err := checkTooLongTable(def.Name) + if err != nil { + return nil, err + } + piDef := model.PartitionDefinition{ + Name: def.Name, + Comment: comment, + } + + buf := new(bytes.Buffer) + for _, vs := range clause.Values { + inValue := make([]string, 0, len(vs)) + for i := range vs { + vs[i].Accept(exprChecker) + if exprChecker.err != nil { + return nil, exprChecker.err + } + buf.Reset() + vs[i].Format(buf) + inValue = append(inValue, buf.String()) + } + piDef.InValues = append(piDef.InValues, inValue) + buf.Reset() + } + definitions = append(definitions, piDef) + } + return definitions, nil +} + +func collectColumnsType(tbInfo *model.TableInfo) []types.FieldType { + if len(tbInfo.Partition.Columns) > 0 { + colTypes := make([]types.FieldType, 0, len(tbInfo.Partition.Columns)) + for _, col := range tbInfo.Partition.Columns { + colTypes = append(colTypes, findColumnByName(col.L, tbInfo).FieldType) } + + return colTypes } - pi.Definitions = defs + return nil } -func buildRangePartitionDefinitions(ctx sessionctx.Context, s *ast.CreateTableStmt, pi *model.PartitionInfo) (err error) { - for _, def := range s.Partition.Definitions { +func buildRangePartitionDefinitions(ctx sessionctx.Context, defs []*ast.PartitionDefinition, tbInfo *model.TableInfo) ([]model.PartitionDefinition, error) { + definitions := make([]model.PartitionDefinition, 0, len(defs)) + exprChecker := newPartitionExprChecker(ctx, nil, checkPartitionExprAllowed) + for _, def := range defs { + if err := def.Clause.Validate(model.PartitionTypeRange, len(tbInfo.Partition.Columns)); err != nil { + return nil, err + } + clause := def.Clause.(*ast.PartitionDefinitionClauseLessThan) + if len(tbInfo.Partition.Columns) > 0 { + if err := checkColumnsTypeAndValuesMatch(ctx, tbInfo, clause.Exprs); err != nil { + return nil, err + } + } else { + if err := checkPartitionValuesIsInt(ctx, def, clause.Exprs, tbInfo); err != nil { + return nil, err + } + } comment, _ := def.Comment() - err = checkTooLongTable(def.Name) + err := checkTooLongTable(def.Name) if err != nil { - return err + return nil, err } piDef := model.PartitionDefinition{ Name: def.Name, @@ -377,13 +477,44 @@ func buildRangePartitionDefinitions(ctx sessionctx.Context, s *ast.CreateTableSt buf := new(bytes.Buffer) // Range columns partitions support multi-column partitions. - for _, expr := range def.Clause.(*ast.PartitionDefinitionClauseLessThan).Exprs { + for _, expr := range clause.Exprs { + expr.Accept(exprChecker) + if exprChecker.err != nil { + return nil, exprChecker.err + } expr.Format(buf) piDef.LessThan = append(piDef.LessThan, buf.String()) buf.Reset() } - pi.Definitions = append(pi.Definitions, piDef) + definitions = append(definitions, piDef) + } + return definitions, nil +} + +func checkPartitionValuesIsInt(ctx sessionctx.Context, def *ast.PartitionDefinition, exprs []ast.ExprNode, tbInfo *model.TableInfo) error { + tp := types.NewFieldType(mysql.TypeLonglong) + if isRangePartitionColUnsignedBigint(tbInfo.Columns, tbInfo.Partition) { + tp.Flag |= mysql.UnsignedFlag } + for _, exp := range exprs { + if _, ok := exp.(*ast.MaxValueExpr); ok { + continue + } + val, err := expression.EvalAstExpr(ctx, exp) + if err != nil { + return err + } + switch val.Kind() { + case types.KindInt64, types.KindUint64, types.KindNull: + default: + return ErrValuesIsNotIntType.GenWithStackByArgs(def.Name) + } + _, err = val.ConvertTo(ctx.GetSessionVars().StmtCtx, tp) + if err != nil { + return ErrWrongTypeColumnValue.GenWithStackByArgs() + } + } + return nil } @@ -452,270 +583,57 @@ func checkAndOverridePartitionID(newTableInfo, oldTableInfo *model.TableInfo) er return nil } -func stringSliceEqual(a, b []string) bool { - if len(a) != len(b) { - return false - } - if len(a) == 0 { - return true - } - // Accelerate the compare by eliminate index bound check. - b = b[:len(a)] - for i, v := range a { - if v != b[i] { - return false - } - } - return true -} - -// hasTimestampField derives from https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.h#L387 -func hasTimestampField(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) (bool, error) { - partCols, err := checkPartitionColumns(tblInfo, expr) - if err != nil { - return false, err - } - - for _, c := range partCols { - if c.FieldType.Tp == mysql.TypeTimestamp { - return true, nil - } - } - - return false, nil -} - -// hasDateField derives from https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.h#L399 -func hasDateField(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) (bool, error) { - partCols, err := checkPartitionColumns(tblInfo, expr) - if err != nil { - return false, err - } - - for _, c := range partCols { - if c.FieldType.Tp == mysql.TypeDate || c.FieldType.Tp == mysql.TypeDatetime { - return true, nil - } - } - - return false, nil -} - -// hasTimeField derives from https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.h#L412 -func hasTimeField(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) (bool, error) { - partCols, err := checkPartitionColumns(tblInfo, expr) - if err != nil { - return false, err - } - - for _, c := range partCols { - if c.FieldType.Tp == mysql.TypeDatetime || c.FieldType.Tp == mysql.TypeDuration { - return true, nil - } - } - - return false, nil -} - -// defaultTimezoneDependent derives from https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.h#L445 -// We assume the result of any function that has a TIMESTAMP argument to be -// timezone-dependent, since a TIMESTAMP value in both numeric and string -// contexts is interpreted according to the current timezone. -// The only exception is UNIX_TIMESTAMP() which returns the internal -// representation of a TIMESTAMP argument verbatim, and thus does not depend on -// the timezone. -func defaultTimezoneDependent(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) (bool, error) { - v, err := hasTimestampField(ctx, tblInfo, expr) - if err != nil { - return false, err - } - - return !v, nil -} - -func checkPartitionFuncCallValid(ctx sessionctx.Context, tblInfo *model.TableInfo, expr *ast.FuncCallExpr) error { - // We assume the result of any function that has a TIMESTAMP argument to be - // timezone-dependent, since a TIMESTAMP value in both numeric and string - // contexts is interpreted according to the current timezone. - // The only exception is UNIX_TIMESTAMP() which returns the internal - // representation of a TIMESTAMP argument verbatim, and thus does not depend on - // the timezone. - // See https://github.com/mysql/mysql-server/blob/5.7/sql/item_func.h#L445 - if expr.FnName.L != ast.UnixTimestamp { - for _, arg := range expr.Args { - if colName, ok := arg.(*ast.ColumnNameExpr); ok { - col := findColumnByName(colName.Name.Name.L, tblInfo) - if col == nil { - return ErrBadField.GenWithStackByArgs(colName.Name.Name.O, "expression") - } - - if ok && col.FieldType.Tp == mysql.TypeTimestamp { - return errors.Trace(errWrongExprInPartitionFunc) - } - } - } - } - - // check function which allowed in partitioning expressions - // see https://dev.mysql.com/doc/mysql-partitioning-excerpt/5.7/en/partitioning-limitations-functions.html - switch expr.FnName.L { - // Mysql don't allow creating partitions with expressions with non matching - // arguments as a (sub)partitioning function, - // but we want to allow such expressions when opening existing tables for - // easier maintenance. This exception should be deprecated at some point in future so that we always throw an error. - // See https://github.com/mysql/mysql-server/blob/5.7/sql/sql_partition.cc#L1072 - case ast.Day, ast.DayOfMonth, ast.DayOfWeek, ast.DayOfYear, ast.Month, ast.Quarter, ast.ToDays, ast.ToSeconds, - ast.Weekday, ast.Year, ast.YearWeek: - return checkResultOK(hasDateField(ctx, tblInfo, expr)) - case ast.Hour, ast.MicroSecond, ast.Minute, ast.Second, ast.TimeToSec: - return checkResultOK(hasTimeField(ctx, tblInfo, expr)) - case ast.UnixTimestamp: - if len(expr.Args) != 1 { - return errors.Trace(errWrongExprInPartitionFunc) - } - col, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, expr.Args[0]) - if err != nil { - return errors.Trace(err) - } - if col.GetType().Tp != mysql.TypeTimestamp { - return errors.Trace(errWrongExprInPartitionFunc) - } - return nil - case ast.Abs, ast.Ceiling, ast.DateDiff, ast.Extract, ast.Floor, ast.Mod: - for _, arg := range expr.Args { - if err := checkPartitionExprValid(ctx, tblInfo, arg); err != nil { - return err - } - } +// checkPartitionFuncValid checks partition function validly. +func checkPartitionFuncValid(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) error { + if expr == nil { return nil } - return errors.Trace(ErrPartitionFunctionIsNotAllowed) -} - -// checkPartitionExprValid checks partition expression validly. -func checkPartitionExprValid(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) error { - switch v := expr.(type) { - case *ast.FuncCastExpr, *ast.CaseExpr, *ast.SubqueryExpr, *ast.WindowFuncExpr, *ast.RowExpr, *ast.DefaultExpr, *ast.ValuesExpr: - return errors.Trace(ErrPartitionFunctionIsNotAllowed) - case *ast.FuncCallExpr: - return checkPartitionFuncCallValid(ctx, tblInfo, v) - case *ast.BinaryOperationExpr: - // The DIV operator (opcode.IntDiv) is also supported; the / operator ( opcode.Div ) is not permitted. - // see https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html - switch v.Op { - case opcode.Or, opcode.And, opcode.Xor, opcode.LeftShift, opcode.RightShift, opcode.BitNeg, opcode.Div: - return errors.Trace(ErrPartitionFunctionIsNotAllowed) - default: - if err := checkPartitionExprValid(ctx, tblInfo, v.L); err != nil { - return errors.Trace(err) - } - if err := checkPartitionExprValid(ctx, tblInfo, v.R); err != nil { - return errors.Trace(err) - } - } - return nil - case *ast.UnaryOperationExpr: - if v.Op == opcode.BitNeg { - return errors.Trace(ErrPartitionFunctionIsNotAllowed) - } - if err := checkPartitionExprValid(ctx, tblInfo, v.V); err != nil { - return errors.Trace(err) - } - return nil - case *ast.ParenthesesExpr: - return checkPartitionExprValid(ctx, tblInfo, v.Expr) + exprChecker := newPartitionExprChecker(ctx, tblInfo, checkPartitionExprArgs, checkPartitionExprAllowed) + expr.Accept(exprChecker) + if exprChecker.err != nil { + return errors.Trace(exprChecker.err) } - return nil -} - -// checkPartitionFuncValid checks partition function validly. -func checkPartitionFuncValid(ctx sessionctx.Context, tblInfo *model.TableInfo, expr ast.ExprNode) error { - err := checkPartitionExprValid(ctx, tblInfo, expr) - if err != nil { - return err + if len(exprChecker.columns) == 0 { + return errors.Trace(ErrWrongExprInPartitionFunc) } - // check constant. - _, err = checkPartitionColumns(tblInfo, expr) - return err + return nil } // checkResultOK derives from https://github.com/mysql/mysql-server/blob/5.7/sql/item_timefunc // For partition tables, mysql do not support Constant, random or timezone-dependent expressions // Based on mysql code to check whether field is valid, every time related type has check_valid_arguments_processor function. -func checkResultOK(ok bool, err error) error { - if err != nil { - return err - } - +func checkResultOK(ok bool) error { if !ok { - return errors.Trace(errWrongExprInPartitionFunc) + return errors.Trace(ErrWrongExprInPartitionFunc) } return nil } -func checkPartitionColumns(tblInfo *model.TableInfo, expr ast.ExprNode) ([]*model.ColumnInfo, error) { - var buf strings.Builder - restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buf) - err := expr.Restore(restoreCtx) - if err != nil { - return nil, errors.Trace(err) - } - partCols, err := extractPartitionColumns(buf.String(), tblInfo) - if err != nil { - return nil, err - } - - if len(partCols) == 0 { - return nil, errors.Trace(errWrongExprInPartitionFunc) - } - - return partCols, nil -} - // checkPartitionFuncType checks partition function return type. -func checkPartitionFuncType(ctx sessionctx.Context, s *ast.CreateTableStmt, tblInfo *model.TableInfo) error { - if s.Partition.Expr == nil { +func checkPartitionFuncType(ctx sessionctx.Context, expr ast.ExprNode, tblInfo *model.TableInfo) error { + if expr == nil { return nil } - var buf strings.Builder - restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buf) - if err := s.Partition.Expr.Restore(restoreCtx); err != nil { - return errors.Trace(err) - } - exprStr := buf.String() - if s.Partition.Tp == model.PartitionTypeRange || s.Partition.Tp == model.PartitionTypeHash { - // if partition by columnExpr, check the column type - if _, ok := s.Partition.Expr.(*ast.ColumnNameExpr); ok { - for _, col := range tblInfo.Columns { - name := strings.Replace(col.Name.String(), ".", "`.`", -1) - // Range partitioning key supported types: tinyint, smallint, mediumint, int and bigint. - if !validRangePartitionType(col) && fmt.Sprintf("`%s`", name) == exprStr { - return errors.Trace(ErrNotAllowedTypeInPartition.GenWithStackByArgs(exprStr)) - } - } - } - } - e, err := expression.ParseSimpleExprWithTableInfo(ctx, exprStr, tblInfo) + e, err := expression.RewriteSimpleExprWithTableInfo(ctx, tblInfo, expr) if err != nil { return errors.Trace(err) } if e.GetType().EvalType() == types.ETInt { return nil } - if s.Partition.Tp == model.PartitionTypeHash { - if _, ok := s.Partition.Expr.(*ast.ColumnNameExpr); ok { - return ErrNotAllowedTypeInPartition.GenWithStackByArgs(exprStr) - } + + if col, ok := expr.(*ast.ColumnNameExpr); ok { + return errors.Trace(ErrNotAllowedTypeInPartition.GenWithStackByArgs(col.Name.Name.L)) } - return ErrPartitionFuncNotAllowed.GenWithStackByArgs("PARTITION") + return errors.Trace(ErrPartitionFuncNotAllowed.GenWithStackByArgs("PARTITION")) } -// checkCreatePartitionValue checks whether `less than value` is strictly increasing for each partition. +// checkRangePartitionValue checks whether `less than value` is strictly increasing for each partition. // Side effect: it may simplify the partition range definition from a constant expression to an integer. -func checkCreatePartitionValue(ctx sessionctx.Context, tblInfo *model.TableInfo) error { +func checkRangePartitionValue(ctx sessionctx.Context, tblInfo *model.TableInfo) error { pi := tblInfo.Partition defs := pi.Definitions if len(defs) == 0 { @@ -761,6 +679,83 @@ func checkCreatePartitionValue(ctx sessionctx.Context, tblInfo *model.TableInfo) return nil } +func checkListPartitionValue(ctx sessionctx.Context, tblInfo *model.TableInfo) error { + pi := tblInfo.Partition + if len(pi.Definitions) == 0 { + return ast.ErrPartitionsMustBeDefined.GenWithStackByArgs("LIST") + } + expStr, err := formatListPartitionValue(ctx, tblInfo) + if err != nil { + return errors.Trace(err) + } + + partitionsValuesMap := make(map[string]struct{}) + for _, s := range expStr { + if _, ok := partitionsValuesMap[s]; ok { + return errors.Trace(ErrMultipleDefConstInListPart) + } + partitionsValuesMap[s] = struct{}{} + } + + return nil +} + +func formatListPartitionValue(ctx sessionctx.Context, tblInfo *model.TableInfo) ([]string, error) { + defs := tblInfo.Partition.Definitions + pi := tblInfo.Partition + var colTps []*types.FieldType + cols := make([]*model.ColumnInfo, 0, len(pi.Columns)) + if len(pi.Columns) == 0 { + tp := types.NewFieldType(mysql.TypeLonglong) + if isRangePartitionColUnsignedBigint(tblInfo.Columns, tblInfo.Partition) { + tp.Flag |= mysql.UnsignedFlag + } + colTps = []*types.FieldType{tp} + } else { + colTps = make([]*types.FieldType, 0, len(pi.Columns)) + for _, colName := range pi.Columns { + colInfo := findColumnByName(colName.L, tblInfo) + if colInfo == nil { + return nil, errors.Trace(ErrFieldNotFoundPart) + } + colTps = append(colTps, colInfo.FieldType.Clone()) + cols = append(cols, colInfo) + } + } + + exprStrs := make([]string, 0) + inValueStrs := make([]string, 0, mathutil.Max(len(pi.Columns), 1)) + for i := range defs { + for j, vs := range defs[i].InValues { + inValueStrs = inValueStrs[:0] + for k, v := range vs { + expr, err := expression.ParseSimpleExprCastWithTableInfo(ctx, v, &model.TableInfo{}, colTps[k]) + if err != nil { + return nil, errors.Trace(err) + } + eval, err := expr.Eval(chunk.Row{}) + if err != nil { + return nil, errors.Trace(err) + } + s, err := eval.ToString() + if err != nil { + return nil, errors.Trace(err) + } + if !eval.IsNull() && colTps[k].EvalType() == types.ETInt { + defs[i].InValues[j][k] = s + } + if colTps[k].EvalType() == types.ETString { + s = string(hack.String(collate.GetCollator(cols[k].Collate).Key(s))) + } + s = strings.ReplaceAll(s, ",", `\,`) + inValueStrs = append(inValueStrs, s) + } + exprStrs = append(exprStrs, strings.Join(inValueStrs, ",")) + } + } + return exprStrs, nil +} + // getRangeValue gets an integer from the range value string. // The returned boolean value indicates whether the input string is a constant expression. func getRangeValue(ctx sessionctx.Context, str string, unsignedBigint bool) (interface{}, bool, error) { @@ -798,16 +793,6 @@ func getRangeValue(ctx sessionctx.Context, str string, unsignedBigint bool) (int return 0, false, ErrNotAllowedTypeInPartition.GenWithStackByArgs(str) } -// validRangePartitionType checks the type supported by the range partitioning key. -func validRangePartitionType(col *model.ColumnInfo) bool { - switch col.FieldType.EvalType() { - case types.ETInt: - return true - default: - return false - } -} - // checkDropTablePartition checks if the partition exists and does not allow deleting the last existing partition in the table. func checkDropTablePartition(meta *model.TableInfo, partLowerNames []string) error { pi := meta.Partition @@ -833,10 +818,11 @@ func checkDropTablePartition(meta *model.TableInfo, partLowerNames []string) err return nil } -// removePartitionInfo each ddl job deletes a partition. -func removePartitionInfo(tblInfo *model.TableInfo, partLowerNames []string) []int64 { +// updateDroppingPartitionInfo move dropping partitions to DroppingDefinitions, and return partitionIDs +func updateDroppingPartitionInfo(tblInfo *model.TableInfo, partLowerNames []string) []int64 { oldDefs := tblInfo.Partition.Definitions newDefs := make([]model.PartitionDefinition, 0, len(oldDefs)-len(partLowerNames)) + droppingDefs := make([]model.PartitionDefinition, 0, len(partLowerNames)) pids := make([]int64, 0, len(partLowerNames)) // consider using a map to probe partLowerNames if too many partLowerNames @@ -850,12 +836,14 @@ func removePartitionInfo(tblInfo *model.TableInfo, partLowerNames []string) []in } if found { pids = append(pids, oldDefs[i].ID) + droppingDefs = append(droppingDefs, oldDefs[i]) } else { newDefs = append(newDefs, oldDefs[i]) } } tblInfo.Partition.Definitions = newDefs + tblInfo.Partition.DroppingDefinitions = droppingDefs return pids } @@ -869,14 +857,54 @@ func getPartitionDef(tblInfo *model.TableInfo, partName string) (index int, def return index, nil, table.ErrUnknownPartition.GenWithStackByArgs(partName, tblInfo.Name.O) } -func buildPlacementDropBundle(partitionID int64) *placement.Bundle { - return &placement.Bundle{ - ID: placement.GroupID(partitionID), +func getPartitionIDsFromDefinitions(defs []model.PartitionDefinition) []int64 { + pids := make([]int64, 0, len(defs)) + for _, def := range defs { + pids = append(pids, def.ID) + } + return pids +} + +func hasGlobalIndex(tblInfo *model.TableInfo) bool { + for _, idxInfo := range tblInfo.Indices { + if idxInfo.Global { + return true + } + } + return false +} + +// getTableInfoWithDroppingPartitions builds oldTableInfo including dropping partitions, only used by onDropTablePartition. +func getTableInfoWithDroppingPartitions(t *model.TableInfo) *model.TableInfo { + p := t.Partition + nt := t.Clone() + np := *p + npd := make([]model.PartitionDefinition, 0, len(p.Definitions)+len(p.DroppingDefinitions)) + npd = append(npd, p.Definitions...) + npd = append(npd, p.DroppingDefinitions...) + np.Definitions = npd + np.DroppingDefinitions = nil + nt.Partition = &np + return nt +} + +func dropRuleBundles(d *ddlCtx, physicalTableIDs []int64) error { + if d.infoHandle != nil && d.infoHandle.IsValid() { + bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) + for _, ID := range physicalTableIDs { + oldBundle, ok := d.infoHandle.Get().BundleByName(placement.GroupID(ID)) + if ok && !oldBundle.IsEmpty() { + bundles = append(bundles, placement.BuildPlacementDropBundle(ID)) + } + } + err := infosync.PutRuleBundles(context.TODO(), bundles) + return err } + return nil } // onDropTablePartition deletes old partition meta. -func onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { +func (w *worker) onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { var partNames []string if err := job.DecodeArgs(&partNames); err != nil { job.State = model.JobStateCancelled @@ -890,59 +918,105 @@ func onDropTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ if job.Type == model.ActionAddTablePartition { // It is rollbacked from adding table partition, just remove addingDefinitions from tableInfo. physicalTableIDs = rollbackAddingPartitionInfo(tblInfo) - } else { - // If an error occurs, it returns that it cannot delete all partitions or that the partition doesn't exist. - err = checkDropTablePartition(tblInfo, partNames) + err = dropRuleBundles(d, physicalTableIDs) if err != nil { job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { return ver, errors.Trace(err) } - physicalTableIDs = removePartitionInfo(tblInfo, partNames) + job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) + job.Args = []interface{}{physicalTableIDs} + return ver, nil } - if d.infoHandle != nil { - bundles := make([]*placement.Bundle, 0, len(physicalTableIDs)) - for _, ID := range physicalTableIDs { - oldBundle, ok := d.infoHandle.Get().BundleByName(placement.GroupID(ID)) - if ok && !oldBundle.IsEmpty() { - bundles = append(bundles, buildPlacementDropBundle(ID)) - } + if job.State == model.JobStateRunning && job.SchemaState == model.StateNone { + // Manually set first state. + job.SchemaState = model.StatePublic + } + // In order to skip maintaining the state check in partitionDefinition, TiDB use droppingDefinition instead of state field. + // So here using `job.SchemaState` to judge what the stage of this job is. + originalState := job.SchemaState + switch job.SchemaState { + case model.StatePublic: + // If an error occurs, it returns that it cannot delete all partitions or that the partition doesn't exist. + err = checkDropTablePartition(tblInfo, partNames) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) } - - err = infosync.PutRuleBundles(nil, bundles) + err = dropRuleBundles(d, physicalTableIDs) if err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") } - } + updateDroppingPartitionInfo(tblInfo, partNames) + job.SchemaState = model.StateDeleteOnly + ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != job.SchemaState) + case model.StateDeleteOnly: + // This state is not a real 'DeleteOnly' state, because tidb does not maintaining the state check in partitionDefinition. + // Insert this state to confirm all servers can not see the old partitions when reorg is running, + // so that no new data will be inserted into old partitions when reorganizing. + job.SchemaState = model.StateDeleteReorganization + ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != job.SchemaState) + case model.StateDeleteReorganization: + oldTblInfo := getTableInfoWithDroppingPartitions(tblInfo) + physicalTableIDs = getPartitionIDsFromDefinitions(tblInfo.Partition.DroppingDefinitions) + tbl, err := getTable(d.store, job.SchemaID, oldTblInfo) + if err != nil { + return ver, errors.Trace(err) + } + // If table has global indexes, we need reorg to clean up them. + if pt, ok := tbl.(table.PartitionedTable); ok && hasGlobalIndex(tblInfo) { + // Build elements for compatible with modify column type. elements will not be used when reorganizing. + elements := make([]*meta.Element, 0, len(tblInfo.Indices)) + for _, idxInfo := range tblInfo.Indices { + if idxInfo.Global { + elements = append(elements, &meta.Element{ID: idxInfo.ID, TypeKey: meta.IndexElementKey}) + } + } + reorgInfo, err := getReorgInfoFromPartitions(d, t, job, tbl, physicalTableIDs, elements) - ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) - if err != nil { - return ver, errors.Trace(err) - } - // Finish this job. - if job.IsRollingback() { - job.FinishTableJob(model.JobStateRollbackDone, model.StateNone, ver, tblInfo) - } else { + if err != nil || reorgInfo.first { + // If we run reorg firstly, we should update the job snapshot version + // and then run the reorg next time. + return ver, errors.Trace(err) + } + err = w.runReorgJob(t, reorgInfo, tbl.Meta(), d.lease, func() (dropIndexErr error) { + defer tidbutil.Recover(metrics.LabelDDL, "onDropTablePartition", + func() { + dropIndexErr = errCancelledDDLJob.GenWithStack("drop partition panic") + }, false) + return w.cleanupGlobalIndexes(pt, physicalTableIDs, reorgInfo) + }) + if err != nil { + if errWaitReorgTimeout.Equal(err) { + // if timeout, we should return, check for the owner and re-wait job done. + return ver, nil + } + // Clean up the channel of notifyCancelReorgJob. Make sure it can't affect other jobs. + w.reorgCtx.cleanNotifyReorgCancel() + return ver, errors.Trace(err) + } + // Clean up the channel of notifyCancelReorgJob. Make sure it can't affect other jobs. + w.reorgCtx.cleanNotifyReorgCancel() + } + tblInfo.Partition.DroppingDefinitions = nil + // used by ApplyDiff in updateSchemaVersion + job.CtxVars = []interface{}{physicalTableIDs} + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) + // A background job will be created to delete old partition data. + job.Args = []interface{}{physicalTableIDs} + default: + err = ErrInvalidDDLState.GenWithStackByArgs("partition", job.SchemaState) } - - // A background job will be created to delete old partition data. - job.Args = []interface{}{physicalTableIDs} - return ver, nil -} - -func buildPlacementTruncateBundle(oldBundle *placement.Bundle, newID int64) *placement.Bundle { - newBundle := oldBundle.Clone() - newBundle.ID = placement.GroupID(newID) - startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(newID))) - endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(newID+1))) - for _, rule := range newBundle.Rules { - rule.GroupID = newBundle.ID - rule.StartKeyHex = startKey - rule.EndKeyHex = endKey - } - return newBundle + return ver, errors.Trace(err) } // onTruncateTablePartition truncates old partition meta. @@ -968,7 +1042,7 @@ func onTruncateTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (int64, e def := &pi.Definitions[i] if def.ID == oldID { pid, err1 := t.GenGlobalID() - if err != nil { + if err1 != nil { return ver, errors.Trace(err1) } def.ID = pid @@ -998,24 +1072,29 @@ func onTruncateTablePartition(d *ddlCtx, t *meta.Meta, job *model.Job) (int64, e } } - if d.infoHandle != nil { + if d.infoHandle != nil && d.infoHandle.IsValid() { bundles := make([]*placement.Bundle, 0, len(oldIDs)) for i, oldID := range oldIDs { oldBundle, ok := d.infoHandle.Get().BundleByName(placement.GroupID(oldID)) if ok && !oldBundle.IsEmpty() { - bundles = append(bundles, buildPlacementDropBundle(oldID)) - bundles = append(bundles, buildPlacementTruncateBundle(oldBundle, newPartitions[i].ID)) + bundles = append(bundles, placement.BuildPlacementDropBundle(oldID)) + bundles = append(bundles, placement.BuildPlacementCopyBundle(oldBundle, newPartitions[i].ID)) } } - err = infosync.PutRuleBundles(nil, bundles) + err = infosync.PutRuleBundles(context.TODO(), bundles) if err != nil { job.State = model.JobStateCancelled return ver, errors.Wrapf(err, "failed to notify PD the placement rules") } } + newIDs := make([]int64, len(oldIDs)) + for i := range oldIDs { + newIDs[i] = newPartitions[i].ID + } + job.CtxVars = []interface{}{oldIDs, newIDs} ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) if err != nil { return ver, errors.Trace(err) @@ -1126,19 +1205,18 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo return ver, errors.Trace(err) } - tempID := partDef.ID - // exchange table meta id - partDef.ID = nt.ID - if pt.TiFlashReplica != nil { for i, id := range pt.TiFlashReplica.AvailablePartitionIDs { - if id == tempID { - pt.TiFlashReplica.AvailablePartitionIDs[i] = partDef.ID + if id == partDef.ID { + pt.TiFlashReplica.AvailablePartitionIDs[i] = nt.ID break } } } + // exchange table meta id + partDef.ID, nt.ID = nt.ID, partDef.ID + err = t.UpdateTable(ptSchemaID, pt) if err != nil { job.State = model.JobStateCancelled @@ -1153,14 +1231,12 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo }) // recreate non-partition table meta info - err = t.DropTableOrView(job.SchemaID, nt.ID, true) + err = t.DropTableOrView(job.SchemaID, partDef.ID, true) if err != nil { job.State = model.JobStateCancelled return ver, errors.Trace(err) } - nt.ID = tempID - err = t.CreateTableOrView(job.SchemaID, nt) if err != nil { job.State = model.JobStateCancelled @@ -1198,6 +1274,31 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo } } + // the follow code is a swap function for rules of two partitions + // though partitions has exchanged their ID, swap still take effect + if d.infoHandle != nil && d.infoHandle.IsValid() { + bundles := make([]*placement.Bundle, 0, 2) + ptBundle, ptOK := d.infoHandle.Get().BundleByName(placement.GroupID(partDef.ID)) + ptOK = ptOK && !ptBundle.IsEmpty() + ntBundle, ntOK := d.infoHandle.Get().BundleByName(placement.GroupID(nt.ID)) + ntOK = ntOK && !ntBundle.IsEmpty() + if ptOK && ntOK { + bundles = append(bundles, placement.BuildPlacementCopyBundle(ptBundle, nt.ID)) + bundles = append(bundles, placement.BuildPlacementCopyBundle(ntBundle, partDef.ID)) + } else if ptOK { + bundles = append(bundles, placement.BuildPlacementDropBundle(partDef.ID)) + bundles = append(bundles, placement.BuildPlacementCopyBundle(ptBundle, nt.ID)) + } else if ntOK { + bundles = append(bundles, placement.BuildPlacementDropBundle(nt.ID)) + bundles = append(bundles, placement.BuildPlacementCopyBundle(ntBundle, partDef.ID)) + } + err = infosync.PutRuleBundles(context.TODO(), bundles) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Wrapf(err, "failed to notify PD the placement rules") + } + } + ver, err = updateSchemaVersion(t, job) if err != nil { return ver, errors.Trace(err) @@ -1209,6 +1310,7 @@ func (w *worker) onExchangeTablePartition(d *ddlCtx, t *meta.Meta, job *model.Jo func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, index int, schemaName, tableName model.CIStr) error { var sql string + var paramList []interface{} pi := pt.Partition @@ -1217,7 +1319,12 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde if pi.Num == 1 { return nil } - sql = fmt.Sprintf("select 1 from `%s`.`%s` where mod(%s, %d) != %d limit 1", schemaName.L, tableName.L, pi.Expr, pi.Num, index) + var buf strings.Builder + buf.WriteString("select 1 from %n.%n where mod(") + buf.WriteString(pi.Expr) + buf.WriteString(", %?) != %? limit 1") + sql = buf.String() + paramList = append(paramList, schemaName.L, tableName.L, pi.Num, index) case model.PartitionTypeRange: // Table has only one partition and has the maximum value if len(pi.Definitions) == 1 && strings.EqualFold(pi.Definitions[index].LessThan[0], partitionMaxValue) { @@ -1225,9 +1332,15 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde } // For range expression and range columns if len(pi.Columns) == 0 { - sql = buildCheckSQLForRangeExprPartition(pi, index, schemaName, tableName) + sql, paramList = buildCheckSQLForRangeExprPartition(pi, index, schemaName, tableName) } else if len(pi.Columns) == 1 { - sql = buildCheckSQLForRangeColumnsPartition(pi, index, schemaName, tableName) + sql, paramList = buildCheckSQLForRangeColumnsPartition(pi, index, schemaName, tableName) + } + case model.PartitionTypeList: + if len(pi.Columns) == 0 { + sql, paramList = buildCheckSQLForListPartition(pi, index, schemaName, tableName) + } else if len(pi.Columns) == 1 { + sql, paramList = buildCheckSQLForListColumnsPartition(pi, index, schemaName, tableName) } default: return errUnsupportedPartitionType.GenWithStackByArgs(pt.Name.O) @@ -1240,7 +1353,11 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde } defer w.sessPool.put(ctx) - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + stmt, err := ctx.(sqlexec.RestrictedSQLExecutor).ParseWithParams(context.Background(), sql, paramList...) + if err != nil { + return errors.Trace(err) + } + rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedStmt(context.Background(), stmt) if err != nil { return errors.Trace(err) } @@ -1251,25 +1368,82 @@ func checkExchangePartitionRecordValidation(w *worker, pt *model.TableInfo, inde return nil } -func buildCheckSQLForRangeExprPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) string { +func buildCheckSQLForRangeExprPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) (string, []interface{}) { + var buf strings.Builder + paramList := make([]interface{}, 0, 4) + // Since the pi.Expr string may contain the identifier, which couldn't be escaped in our ParseWithParams(...) + // So we write it to the origin sql string here. if index == 0 { - return fmt.Sprintf("select 1 from `%s`.`%s` where %s >= %s limit 1", schemaName.L, tableName.L, pi.Expr, pi.Definitions[index].LessThan[0]) + buf.WriteString("select 1 from %n.%n where ") + buf.WriteString(pi.Expr) + buf.WriteString(" >= %? limit 1") + paramList = append(paramList, schemaName.L, tableName.L, trimQuotation(pi.Definitions[index].LessThan[0])) + return buf.String(), paramList } else if index == len(pi.Definitions)-1 && strings.EqualFold(pi.Definitions[index].LessThan[0], partitionMaxValue) { - return fmt.Sprintf("select 1 from `%s`.`%s` where %s < %s limit 1", schemaName.L, tableName.L, pi.Expr, pi.Definitions[index-1].LessThan[0]) + buf.WriteString("select 1 from %n.%n where ") + buf.WriteString(pi.Expr) + buf.WriteString(" < %? limit 1") + paramList = append(paramList, schemaName.L, tableName.L, trimQuotation(pi.Definitions[index-1].LessThan[0])) + return buf.String(), paramList } else { - return fmt.Sprintf("select 1 from `%s`.`%s` where %s < %s or %s >= %s limit 1", schemaName.L, tableName.L, pi.Expr, pi.Definitions[index-1].LessThan[0], pi.Expr, pi.Definitions[index].LessThan[0]) + buf.WriteString("select 1 from %n.%n where ") + buf.WriteString(pi.Expr) + buf.WriteString(" < %? or ") + buf.WriteString(pi.Expr) + buf.WriteString(" >= %? limit 1") + paramList = append(paramList, schemaName.L, tableName.L, trimQuotation(pi.Definitions[index-1].LessThan[0]), trimQuotation(pi.Definitions[index].LessThan[0])) + return buf.String(), paramList } } -func buildCheckSQLForRangeColumnsPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) string { +func trimQuotation(str string) string { + return strings.Trim(str, "\"") +} + +func buildCheckSQLForRangeColumnsPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) (string, []interface{}) { + paramList := make([]interface{}, 0, 6) colName := pi.Columns[0].L if index == 0 { - return fmt.Sprintf("select 1 from `%s`.`%s` where `%s` >= %s limit 1", schemaName.L, tableName.L, colName, pi.Definitions[index].LessThan[0]) + paramList = append(paramList, schemaName.L, tableName.L, colName, trimQuotation(pi.Definitions[index].LessThan[0])) + return "select 1 from %n.%n where %n >= %? limit 1", paramList } else if index == len(pi.Definitions)-1 && strings.EqualFold(pi.Definitions[index].LessThan[0], partitionMaxValue) { - return fmt.Sprintf("select 1 from `%s`.`%s` where `%s` < %s limit 1", schemaName.L, tableName.L, colName, pi.Definitions[index-1].LessThan[0]) + paramList = append(paramList, schemaName.L, tableName.L, colName, trimQuotation(pi.Definitions[index-1].LessThan[0])) + return "select 1 from %n.%n where %n < %? limit 1", paramList } else { - return fmt.Sprintf("select 1 from `%s`.`%s` where `%s` < %s or `%s` >= %s limit 1", schemaName.L, tableName.L, colName, pi.Definitions[index-1].LessThan[0], colName, pi.Definitions[index].LessThan[0]) + paramList = append(paramList, schemaName.L, tableName.L, colName, trimQuotation(pi.Definitions[index-1].LessThan[0]), colName, trimQuotation(pi.Definitions[index].LessThan[0])) + return "select 1 from %n.%n where %n < %? or %n >= %? limit 1", paramList + } +} + +func buildCheckSQLForListPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) (string, []interface{}) { + var buf strings.Builder + buf.WriteString("select 1 from %n.%n where ") + buf.WriteString(pi.Expr) + buf.WriteString(" not in (%?) limit 1") + inValues := getInValues(pi, index) + + paramList := make([]interface{}, 0, 3) + paramList = append(paramList, schemaName.L, tableName.L, inValues) + return buf.String(), paramList +} + +func buildCheckSQLForListColumnsPartition(pi *model.PartitionInfo, index int, schemaName, tableName model.CIStr) (string, []interface{}) { + colName := pi.Columns[0].L + var buf strings.Builder + buf.WriteString("select 1 from %n.%n where %n not in (%?) limit 1") + inValues := getInValues(pi, index) + + paramList := make([]interface{}, 0, 4) + paramList = append(paramList, schemaName.L, tableName.L, colName, inValues) + return buf.String(), paramList +} + +func getInValues(pi *model.PartitionInfo, index int) []string { + inValues := make([]string, 0, len(pi.Definitions[index].InValues)) + for _, inValue := range pi.Definitions[index].InValues { + inValues = append(inValues, inValue...) } + return inValues } func checkAddPartitionTooManyPartitions(piDefs uint64) error { @@ -1286,13 +1460,6 @@ func checkNoHashPartitions(ctx sessionctx.Context, partitionNum uint64) error { return nil } -func checkNoRangePartitions(partitionNum int) error { - if partitionNum == 0 { - return ast.ErrPartitionsMustBeDefined.GenWithStackByArgs("RANGE") - } - return nil -} - func getPartitionIDs(table *model.TableInfo) []int64 { if table.GetPartitionInfo() == nil { return []int64{} @@ -1313,10 +1480,9 @@ func checkPartitioningKeysConstraints(sctx sessionctx.Context, s *ast.CreateTabl var partCols stringSlice if s.Partition.Expr != nil { - // Parse partitioning key, extract the column names in the partitioning key to slice. - buf := new(bytes.Buffer) - s.Partition.Expr.Format(buf) - partColumns, err := extractPartitionColumns(buf.String(), tblInfo) + extractCols := newPartitionExprChecker(sctx, tblInfo) + s.Partition.Expr.Accept(extractCols) + partColumns, err := extractCols.columns, extractCols.err if err != nil { return err } @@ -1336,7 +1502,9 @@ func checkPartitioningKeysConstraints(sctx sessionctx.Context, s *ast.CreateTabl if index.Primary { return ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("PRIMARY KEY") } - return ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("UNIQUE INDEX") + if !config.GetGlobalConfig().EnableGlobalIndex { + return ErrUniqueKeyNeedAllFieldsInPf.GenWithStackByArgs("UNIQUE INDEX") + } } } // when PKIsHandle, tblInfo.Indices will not contain the primary key. @@ -1407,6 +1575,9 @@ func (cne *columnNameExtractor) Leave(node ast.Node) (ast.Node, bool) { } func findColumnByName(colName string, tblInfo *model.TableInfo) *model.ColumnInfo { + if tblInfo == nil { + return nil + } for _, info := range tblInfo.Columns { if info.Name.L == colName { return info @@ -1505,10 +1676,10 @@ func truncateTableByReassignPartitionIDs(t *meta.Meta, tblInfo *model.TableInfo) return nil } -func onAlterTablePartition(t *meta.Meta, job *model.Job) (int64, error) { +func onAlterTableAlterPartition(t *meta.Meta, job *model.Job) (ver int64, err error) { var partitionID int64 bundle := &placement.Bundle{} - err := job.DecodeArgs(&partitionID, bundle) + err = job.DecodeArgs(&partitionID, bundle) if err != nil { job.State = model.JobStateCancelled return 0, errors.Trace(err) @@ -1525,17 +1696,197 @@ func onAlterTablePartition(t *meta.Meta, job *model.Job) (int64, error) { return 0, errors.Trace(table.ErrUnknownPartition.GenWithStackByArgs("drop?", tblInfo.Name.O)) } - err = infosync.PutRuleBundles(nil, []*placement.Bundle{bundle}) - if err != nil { - job.State = model.JobStateCancelled - return 0, errors.Wrapf(err, "failed to notify PD the placement rules") + pstate := ptInfo.GetStateByID(partitionID) + switch pstate { + case model.StatePublic: + ptInfo.SetStateByID(partitionID, model.StateGlobalTxnOnly) + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateGlobalTxnOnly + case model.StateGlobalTxnOnly: + err = infosync.PutRuleBundles(context.TODO(), []*placement.Bundle{bundle}) + if err != nil { + job.State = model.JobStateCancelled + return 0, errors.Wrapf(err, "failed to notify PD the placement rules") + } + ptInfo.SetStateByID(partitionID, model.StatePublic) + // used by ApplyDiff in updateSchemaVersion + job.CtxVars = []interface{}{partitionID} + ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + } + return ver, nil +} + +type partitionExprProcessor func(sessionctx.Context, *model.TableInfo, ast.ExprNode) error + +type partitionExprChecker struct { + processors []partitionExprProcessor + ctx sessionctx.Context + tbInfo *model.TableInfo + err error + + columns []*model.ColumnInfo +} + +func newPartitionExprChecker(ctx sessionctx.Context, tbInfo *model.TableInfo, processor ...partitionExprProcessor) *partitionExprChecker { + p := &partitionExprChecker{processors: processor, ctx: ctx, tbInfo: tbInfo} + p.processors = append(p.processors, p.extractColumns) + return p +} + +func (p *partitionExprChecker) Enter(n ast.Node) (node ast.Node, skipChildren bool) { + expr, ok := n.(ast.ExprNode) + if !ok { + return n, true + } + for _, processor := range p.processors { + if err := processor(p.ctx, p.tbInfo, expr); err != nil { + p.err = err + return n, true + } + } + + return n, false +} + +func (p *partitionExprChecker) Leave(n ast.Node) (node ast.Node, ok bool) { + return n, p.err == nil +} + +func (p *partitionExprChecker) extractColumns(_ sessionctx.Context, _ *model.TableInfo, expr ast.ExprNode) error { + columnNameExpr, ok := expr.(*ast.ColumnNameExpr) + if !ok { + return nil + } + colInfo := findColumnByName(columnNameExpr.Name.Name.L, p.tbInfo) + if colInfo == nil { + return errors.Trace(ErrBadField.GenWithStackByArgs(columnNameExpr.Name.Name.L, "partition function")) } - ver, err := updateSchemaVersion(t, job) + p.columns = append(p.columns, colInfo) + return nil +} + +func checkPartitionExprAllowed(_ sessionctx.Context, tb *model.TableInfo, e ast.ExprNode) error { + switch v := e.(type) { + case *ast.FuncCallExpr: + if _, ok := expression.AllowedPartitionFuncMap[v.FnName.L]; ok { + return nil + } + case *ast.BinaryOperationExpr: + if _, ok := expression.AllowedPartition4BinaryOpMap[v.Op]; ok { + return errors.Trace(checkNoTimestampArgs(tb, v.L, v.R)) + } + case *ast.UnaryOperationExpr: + if _, ok := expression.AllowedPartition4UnaryOpMap[v.Op]; ok { + return errors.Trace(checkNoTimestampArgs(tb, v.V)) + } + case *ast.ColumnNameExpr, *ast.ParenthesesExpr, *driver.ValueExpr, *ast.MaxValueExpr, + *ast.TimeUnitExpr: + return nil + } + return errors.Trace(ErrPartitionFunctionIsNotAllowed) +} + +func checkPartitionExprArgs(_ sessionctx.Context, tblInfo *model.TableInfo, e ast.ExprNode) error { + expr, ok := e.(*ast.FuncCallExpr) + if !ok { + return nil + } + argsType, err := collectArgsType(tblInfo, expr.Args...) if err != nil { - return ver, errors.Trace(err) + return errors.Trace(err) } + switch expr.FnName.L { + case ast.ToDays, ast.ToSeconds, ast.DayOfMonth, ast.Month, ast.DayOfYear, ast.Quarter, ast.YearWeek, + ast.Year, ast.Weekday, ast.DayOfWeek, ast.Day: + return errors.Trace(checkResultOK(hasDateArgs(argsType...))) + case ast.Hour, ast.Minute, ast.Second, ast.TimeToSec, ast.MicroSecond: + return errors.Trace(checkResultOK(hasTimeArgs(argsType...))) + case ast.UnixTimestamp: + return errors.Trace(checkResultOK(hasTimestampArgs(argsType...))) + case ast.FromDays: + return errors.Trace(checkResultOK(hasDateArgs(argsType...) || hasTimeArgs(argsType...))) + case ast.Extract: + switch expr.Args[0].(*ast.TimeUnitExpr).Unit { + case ast.TimeUnitYear, ast.TimeUnitYearMonth, ast.TimeUnitQuarter, ast.TimeUnitMonth, ast.TimeUnitDay: + return errors.Trace(checkResultOK(hasDateArgs(argsType...))) + case ast.TimeUnitDayMicrosecond, ast.TimeUnitDayHour, ast.TimeUnitDayMinute, ast.TimeUnitDaySecond: + return errors.Trace(checkResultOK(hasDatetimeArgs(argsType...))) + case ast.TimeUnitHour, ast.TimeUnitHourMinute, ast.TimeUnitHourSecond, ast.TimeUnitMinute, ast.TimeUnitMinuteSecond, + ast.TimeUnitSecond, ast.TimeUnitMicrosecond, ast.TimeUnitHourMicrosecond, ast.TimeUnitMinuteMicrosecond, ast.TimeUnitSecondMicrosecond: + return errors.Trace(checkResultOK(hasTimeArgs(argsType...))) + default: + return errors.Trace(ErrWrongExprInPartitionFunc) + } + case ast.DateDiff: + return errors.Trace(checkResultOK(slice.AllOf(argsType, func(i int) bool { + return hasDateArgs(argsType[i]) + }))) - job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) - return ver, nil + case ast.Abs, ast.Ceiling, ast.Floor, ast.Mod: + has := hasTimestampArgs(argsType...) + if has { + return errors.Trace(ErrWrongExprInPartitionFunc) + } + } + return nil +} + +func collectArgsType(tblInfo *model.TableInfo, exprs ...ast.ExprNode) ([]byte, error) { + ts := make([]byte, 0, len(exprs)) + for _, arg := range exprs { + col, ok := arg.(*ast.ColumnNameExpr) + if !ok { + continue + } + columnInfo := findColumnByName(col.Name.Name.L, tblInfo) + if columnInfo == nil { + return nil, errors.Trace(ErrBadField.GenWithStackByArgs(col.Name.Name.L, "partition function")) + } + ts = append(ts, columnInfo.Tp) + } + + return ts, nil +} + +func hasDateArgs(argsType ...byte) bool { + return slice.AnyOf(argsType, func(i int) bool { + return argsType[i] == mysql.TypeDate || argsType[i] == mysql.TypeDatetime + }) +} + +func hasTimeArgs(argsType ...byte) bool { + return slice.AnyOf(argsType, func(i int) bool { + return argsType[i] == mysql.TypeDuration || argsType[i] == mysql.TypeDatetime + }) +} + +func hasTimestampArgs(argsType ...byte) bool { + return slice.AnyOf(argsType, func(i int) bool { + return argsType[i] == mysql.TypeTimestamp + }) +} + +func hasDatetimeArgs(argsType ...byte) bool { + return slice.AnyOf(argsType, func(i int) bool { + return argsType[i] == mysql.TypeDatetime + }) +} + +func checkNoTimestampArgs(tbInfo *model.TableInfo, exprs ...ast.ExprNode) error { + argsType, err := collectArgsType(tbInfo, exprs...) + if err != nil { + return err + } + if hasTimestampArgs(argsType...) { + return errors.Trace(ErrWrongExprInPartitionFunc) + } + return nil } diff --git a/ddl/partition_test.go b/ddl/partition_test.go index edb210a17d298..6173fe0b5c599 100644 --- a/ddl/partition_test.go +++ b/ddl/partition_test.go @@ -46,7 +46,10 @@ func (s *testPartitionSuite) TestDropAndTruncatePartition(c *C) { WithStore(s.store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() dbInfo := testSchemaInfo(c, d, "test_partition") testCreateSchema(c, testNewContext(d), d, dbInfo) // generate 5 partition in tableInfo. diff --git a/ddl/placement/const.go b/ddl/placement/const.go index 3e4df60882dbd..3dcd6a0005a3b 100644 --- a/ddl/placement/const.go +++ b/ddl/placement/const.go @@ -13,9 +13,12 @@ package placement -// RuleDefaultGroupID is the default GroupID for all placement rules, to -// indicate that it is from TiDB_DDL statements. -const RuleDefaultGroupID = "TiDB_DDL" +const ( + // BundleIDPrefix is the bundle prefix of all rule bundles from TiDB_DDL statements. + BundleIDPrefix = "TiDB_DDL_" + // PDBundleID is the bundle name of pd, the default bundle for all regions. + PDBundleID = "pd" +) const ( // RuleIndexDefault is the default index for a rule, check Rule.Index. @@ -29,3 +32,18 @@ const ( // RuleIndexIndex is the index for a rule of index. RuleIndexIndex ) + +const ( + // DCLabelKey indicates the key of label which represents the dc for Store. + // FIXME: currently we assumes "zone" is the dcLabel key in Store + DCLabelKey = "zone" + // EngineLabelKey is the label that indicates the backend of store instance: + // tikv or tiflash. TiFlash instance will contain a label of 'engine: tiflash'. + EngineLabelKey = "engine" + // EngineLabelTiFlash is the label value, which a TiFlash instance will have with + // a label key of EngineLabelKey. + EngineLabelTiFlash = "tiflash" + // EngineLabelTiKV is the label value used in some tests. And possibly TiKV will + // set the engine label with a value of EngineLabelTiKV. + EngineLabelTiKV = "tikv" +) diff --git a/ddl/placement/types.go b/ddl/placement/types.go index bf46635696bc0..0f17cd2f7f659 100644 --- a/ddl/placement/types.go +++ b/ddl/placement/types.go @@ -15,6 +15,9 @@ package placement import ( "encoding/json" + "strings" + + "github.com/pingcap/errors" ) // Refer to https://github.com/tikv/pd/issues/2701 . @@ -59,6 +62,28 @@ type LabelConstraint struct { Values []string `json:"values,omitempty"` } +// Restore converts the LabelConstraint to a string. +func (c *LabelConstraint) Restore() (string, error) { + var sb strings.Builder + for i, value := range c.Values { + switch c.Op { + case In: + sb.WriteString("+") + case NotIn: + sb.WriteString("-") + default: + return "", errors.Errorf("Unsupported label constraint operation: %s", c.Op) + } + sb.WriteString(c.Key) + sb.WriteString("=") + sb.WriteString(value) + if i < len(c.Values)-1 { + sb.WriteString(",") + } + } + return sb.String(), nil +} + // Rule is the placement rule. Check https://github.com/tikv/pd/blob/master/server/schedule/placement/rule.go. type Rule struct { GroupID string `json:"group_id"` diff --git a/ddl/placement/utils.go b/ddl/placement/utils.go index 87c4a37a4e4f9..2efb196bb0d66 100644 --- a/ddl/placement/utils.go +++ b/ddl/placement/utils.go @@ -14,10 +14,14 @@ package placement import ( + "encoding/hex" "fmt" + "strconv" "strings" "github.com/pingcap/errors" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/util/codec" ) func checkLabelConstraint(label string) (LabelConstraint, error) { @@ -52,6 +56,10 @@ func checkLabelConstraint(label string) (LabelConstraint, error) { return r, errors.Errorf("label constraint should be in format '{+|-}key=value', but got '%s'", label) } + if op == In && key == EngineLabelKey && strings.ToLower(val) == EngineLabelTiFlash { + return r, errors.Errorf("unsupported label constraint '%s'", label) + } + r.Key = key r.Op = op r.Values = []string{val} @@ -66,12 +74,115 @@ func CheckLabelConstraints(labels []string) ([]LabelConstraint, error) { if err != nil { return constraints, err } - constraints = append(constraints, label) + + pass := true + + for _, cnst := range constraints { + if label.Key == cnst.Key { + sameOp := label.Op == cnst.Op + sameVal := label.Values[0] == cnst.Values[0] + // no following cases: + // 1. duplicated constraint + // 2. no instance can meet: +dc=sh, -dc=sh + // 3. can not match multiple instances: +dc=sh, +dc=bj + if sameOp && sameVal { + pass = false + break + } else if (!sameOp && sameVal) || (sameOp && !sameVal && label.Op == In) { + s1, err := label.Restore() + if err != nil { + s1 = err.Error() + } + s2, err := cnst.Restore() + if err != nil { + s2 = err.Error() + } + return constraints, errors.Errorf("conflicting constraints '%s' and '%s'", s1, s2) + } + } + } + + if pass { + constraints = append(constraints, label) + } } return constraints, nil } // GroupID accepts a tableID or whatever integer, and encode the integer into a valid GroupID for PD. func GroupID(id int64) string { - return fmt.Sprintf("TIDB_DDL_%d", id) + return fmt.Sprintf("%s%d", BundleIDPrefix, id) +} + +// ObjectIDFromGroupID extracts the db/table/partition ID from the group ID +func ObjectIDFromGroupID(groupID string) (int64, error) { + // If the rule doesn't come from TiDB, skip it. + if !strings.HasPrefix(groupID, BundleIDPrefix) { + return 0, nil + } + id, err := strconv.ParseInt(groupID[len(BundleIDPrefix):], 10, 64) + if err != nil || id <= 0 { + return 0, errors.Errorf("Rule %s doesn't include an id", groupID) + } + return id, nil +} + +// RestoreLabelConstraintList converts the label constraints to a readable string. +func RestoreLabelConstraintList(constraints []LabelConstraint) (string, error) { + var sb strings.Builder + for i, constraint := range constraints { + sb.WriteByte('"') + conStr, err := constraint.Restore() + if err != nil { + return "", err + } + sb.WriteString(conStr) + sb.WriteByte('"') + if i < len(constraints)-1 { + sb.WriteByte(',') + } + } + return sb.String(), nil +} + +// BuildPlacementDropBundle builds the bundle to drop placement rules. +func BuildPlacementDropBundle(partitionID int64) *Bundle { + return &Bundle{ + ID: GroupID(partitionID), + } +} + +// BuildPlacementCopyBundle copies a new bundle from the old, with a new name and a new key range. +func BuildPlacementCopyBundle(oldBundle *Bundle, newID int64) *Bundle { + newBundle := oldBundle.Clone() + newBundle.ID = GroupID(newID) + startKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(newID))) + endKey := hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(newID+1))) + for _, rule := range newBundle.Rules { + rule.GroupID = newBundle.ID + rule.StartKeyHex = startKey + rule.EndKeyHex = endKey + } + return newBundle +} + +// GetLeaderDCByBundle returns the leader's DC by Bundle if found +func GetLeaderDCByBundle(bundle *Bundle, dcLabelKey string) (string, bool) { + for _, rule := range bundle.Rules { + if isValidLeaderRule(rule, dcLabelKey) { + return rule.LabelConstraints[0].Values[0], true + } + } + return "", false +} + +func isValidLeaderRule(rule *Rule, dcLabelKey string) bool { + if rule.Role == Leader && rule.Count == 1 { + for _, con := range rule.LabelConstraints { + if con.Op == In && con.Key == dcLabelKey && len(con.Values) == 1 { + return true + } + } + } + return false } diff --git a/ddl/placement/utils_test.go b/ddl/placement/utils_test.go new file mode 100644 index 0000000000000..19b09dab995db --- /dev/null +++ b/ddl/placement/utils_test.go @@ -0,0 +1,313 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package placement + +import ( + . "github.com/pingcap/check" +) + +var _ = Suite(&testUtilsSuite{}) + +type testUtilsSuite struct{} + +func (t *testUtilsSuite) TestRestoreConstraints(c *C) { + testCases := []struct { + constraints []LabelConstraint + expectedResult string + expectErr bool + }{ + { + constraints: []LabelConstraint{}, + expectedResult: ``, + }, + { + constraints: []LabelConstraint{ + { + Key: "zone", + Op: "in", + Values: []string{"bj"}, + }, + }, + expectedResult: `"+zone=bj"`, + }, + { + constraints: []LabelConstraint{ + { + Key: "zone", + Op: "notIn", + Values: []string{"bj"}, + }, + }, + expectedResult: `"-zone=bj"`, + }, + { + constraints: []LabelConstraint{ + { + Key: "zone", + Op: "exists", + Values: []string{"bj"}, + }, + }, + expectErr: true, + }, + { + constraints: []LabelConstraint{ + { + Key: "zone", + Op: "in", + Values: []string{"bj", "sh"}, + }, + }, + expectedResult: `"+zone=bj,+zone=sh"`, + }, + { + constraints: []LabelConstraint{ + { + Key: "zone", + Op: "in", + Values: []string{"bj", "sh"}, + }, + { + Key: "disk", + Op: "in", + Values: []string{"ssd"}, + }, + }, + expectedResult: `"+zone=bj,+zone=sh","+disk=ssd"`, + }, + } + for _, testCase := range testCases { + rs, err := RestoreLabelConstraintList(testCase.constraints) + if testCase.expectErr { + c.Assert(err, NotNil) + } else { + c.Assert(rs, Equals, testCase.expectedResult) + } + } +} + +func (t *testUtilsSuite) TestObjectIDFromGroupID(c *C) { + testCases := []struct { + bundleID string + expectedID int64 + expectErr bool + }{ + {"pd", 0, false}, + {"TiDB_DDL_foo", 0, true}, + {"TiDB_DDL_3x", 0, true}, + {"TiDB_DDL_3.0", 0, true}, + {"TiDB_DDL_-10", 0, true}, + {"TiDB_DDL_10", 10, false}, + } + for _, testCase := range testCases { + id, err := ObjectIDFromGroupID(testCase.bundleID) + if testCase.expectErr { + c.Assert(err, NotNil) + } else { + c.Assert(id, Equals, testCase.expectedID) + } + } +} + +func (t *testUtilsSuite) TestGetLeaderDCByBundle(c *C) { + testcases := []struct { + name string + bundle *Bundle + expectedDC string + }{ + { + name: "only leader", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "12", + Role: Leader, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: In, + Values: []string{"bj"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 1, + }, + }, + }, + expectedDC: "bj", + }, + { + name: "no leader", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "12", + Role: Voter, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: In, + Values: []string{"bj"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 3, + }, + }, + }, + expectedDC: "", + }, + { + name: "voter and leader", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "11", + Role: Leader, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: In, + Values: []string{"sh"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 1, + }, + { + ID: "12", + Role: Voter, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: In, + Values: []string{"bj"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 3, + }, + }, + }, + expectedDC: "sh", + }, + { + name: "wrong label key", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "11", + Role: Leader, + LabelConstraints: []LabelConstraint{ + { + Key: "fake", + Op: In, + Values: []string{"sh"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 1, + }, + }, + }, + expectedDC: "", + }, + { + name: "wrong operator", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "11", + Role: Leader, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: NotIn, + Values: []string{"sh"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 1, + }, + }, + }, + expectedDC: "", + }, + { + name: "leader have multi values", + bundle: &Bundle{ + ID: GroupID(1), + Rules: []*Rule{ + { + ID: "11", + Role: Leader, + LabelConstraints: []LabelConstraint{ + { + Key: "zone", + Op: In, + Values: []string{"sh", "bj"}, + }, + { + Key: EngineLabelKey, + Op: NotIn, + Values: []string{EngineLabelTiFlash}, + }, + }, + Count: 1, + }, + }, + }, + expectedDC: "", + }, + } + for _, testcase := range testcases { + c.Log(testcase.name) + result, ok := GetLeaderDCByBundle(testcase.bundle, "zone") + if len(testcase.expectedDC) > 0 { + c.Assert(ok, Equals, true) + } else { + c.Assert(ok, Equals, false) + } + c.Assert(result, Equals, testcase.expectedDC) + } +} diff --git a/ddl/placement_rule_test.go b/ddl/placement_rule_test.go index 9e6f61d005dcd..16450b85dfc7e 100644 --- a/ddl/placement_rule_test.go +++ b/ddl/placement_rule_test.go @@ -41,6 +41,139 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { output: []*placement.Rule{}, }, + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["+zone=sh", "+zone=sh"]`, + }}, + output: []*placement.Rule{ + { + Role: placement.Voter, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + }, + }, + }, + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["+zone=sh", "+engine=tiflash"]`, + }}, + err: ".*unsupported label constraint.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["+zone=sh", "+engine=TiFlash"]`, + }}, + err: ".*unsupported label constraint.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: "", + }}, + output: []*placement.Rule{{ + Role: placement.Voter, + Count: 3, + LabelConstraints: []placement.LabelConstraint{}, + }}, + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["+zone=sh", "-zone=sh"]`, + }}, + err: ".*conflicting constraints.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["+zone=sh", "+zone=bj"]`, + }}, + err: ".*conflicting constraints.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Constraints: `{"+zone=sh,+zone=sh": 2, "+zone=sh": 1}`, + }}, + output: []*placement.Rule{ + { + Role: placement.Voter, + Count: 1, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + }, + }, + { + Role: placement.Voter, + Count: 2, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "in", Values: []string{"sh"}}, + }, + }, + }, + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Constraints: `{"+zone=sh,-zone=sh": 2, "+zone=sh": 1}`, + }}, + err: ".*conflicting constraints.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Constraints: `{"+zone=sh,+zone=bj": 2, "+zone=sh": 1}`, + }}, + err: ".*conflicting constraints.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `["- zone=sh", "-zone = bj"]`, + }}, + output: []*placement.Rule{ + { + Role: placement.Voter, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + {Key: "zone", Op: "notIn", Values: []string{"sh"}}, + {Key: "zone", Op: "notIn", Values: []string{"bj"}}, + }, + }, + }, + }, + { input: []*ast.PlacementSpec{{ Role: ast.PlacementRoleVoter, @@ -171,6 +304,25 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { output: []*placement.Rule{}, }, + { + input: []*ast.PlacementSpec{ + { + Role: ast.PlacementRoleLearner, + Tp: ast.PlacementDrop, + }, + }, + bundle: &placement.Bundle{Rules: []*placement.Rule{ + {Role: placement.Learner}, + {Role: placement.Voter}, + {Role: placement.Learner}, + {Role: placement.Voter}, + }}, + output: []*placement.Rule{ + {Role: placement.Voter}, + {Role: placement.Voter}, + }, + }, + { input: []*ast.PlacementSpec{ { @@ -194,19 +346,23 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { { input: []*ast.PlacementSpec{ { - Role: ast.PlacementRoleLearner, - Tp: ast.PlacementAdd, - Replicas: 3, - Constraints: `["+ zone=sh", "-zone = bj"]`, - }, - { - Role: ast.PlacementRoleVoter, + Role: ast.PlacementRoleLearner, Tp: ast.PlacementDrop, }, }, + err: ".*no rule of role 'learner' to drop.*", + }, + + { + input: []*ast.PlacementSpec{{ + Role: ast.PlacementRoleVoter, + Tp: ast.PlacementAdd, + Replicas: 3, + Constraints: `['+ zone=sh', '-zone = bj']`, + }}, output: []*placement.Rule{ { - Role: placement.Learner, + Role: placement.Voter, Count: 3, LabelConstraints: []placement.LabelConstraint{ {Key: "zone", Op: "in", Values: []string{"sh"}}, @@ -224,12 +380,14 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { bundle = t.bundle } out, err := buildPlacementSpecs(bundle, t.input) - if err == nil { + if t.err == "" { + c.Assert(err, IsNil) expected, err := json.Marshal(t.output) c.Assert(err, IsNil) got, err := json.Marshal(out.Rules) c.Assert(err, IsNil) - c.Assert(len(t.output), Equals, len(out.Rules)) + comment := Commentf("%d test\nexpected %s\nbut got %s", i, expected, got) + c.Assert(len(t.output), Equals, len(out.Rules), comment) for _, r1 := range t.output { found := false for _, r2 := range out.Rules { @@ -238,10 +396,10 @@ func (s *testPlacementSuite) TestPlacementBuild(c *C) { break } } - c.Assert(found, IsTrue, Commentf("%d test\nexpected %s\nbut got %s", i, expected, got)) + c.Assert(found, IsTrue, comment) } } else { - c.Assert(err.Error(), ErrorMatches, t.err) + c.Assert(err, ErrorMatches, t.err) } } } @@ -261,7 +419,7 @@ func (s *testPlacementSuite) TestPlacementBuildDrop(c *C) { }, } for _, t := range tests { - out := buildPlacementDropBundle(t.input) + out := placement.BuildPlacementDropBundle(t.input) c.Assert(t.output, DeepEquals, out) } } @@ -282,8 +440,8 @@ func (s *testPlacementSuite) TestPlacementBuildTruncate(c *C) { ID: placement.GroupID(1), Rules: []*placement.Rule{{ GroupID: placement.GroupID(1), - StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(1))), - EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(2))), + StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(1))), + EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(2))), }}, }, }, @@ -293,14 +451,14 @@ func (s *testPlacementSuite) TestPlacementBuildTruncate(c *C) { ID: placement.GroupID(2), Rules: []*placement.Rule{{ GroupID: placement.GroupID(2), - StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(2))), - EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTablePrefix(3))), + StartKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(2))), + EndKeyHex: hex.EncodeToString(codec.EncodeBytes(nil, tablecodec.GenTableRecordPrefix(3))), }}, }, }, } for _, t := range tests { - out := buildPlacementTruncateBundle(bundle, t.input) + out := placement.BuildPlacementCopyBundle(bundle, t.input) c.Assert(t.output, DeepEquals, out) c.Assert(bundle.ID, Equals, placement.GroupID(-1)) c.Assert(bundle.Rules, HasLen, 1) diff --git a/ddl/placement_sql_test.go b/ddl/placement_sql_test.go index f8482603d4006..91c48528a986a 100644 --- a/ddl/placement_sql_test.go +++ b/ddl/placement_sql_test.go @@ -14,8 +14,16 @@ package ddl_test import ( + "fmt" + "sort" + . "github.com/pingcap/check" + "github.com/pingcap/failpoint" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/util/testkit" ) @@ -23,7 +31,12 @@ func (s *testDBSuite1) TestAlterTableAlterPartition(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") - defer tk.MustExec("drop table if exists t1") + + tk.Se.GetSessionVars().EnableAlterPlacement = true + defer func() { + tk.MustExec("drop table if exists t1") + tk.Se.GetSessionVars().EnableAlterPlacement = false + }() tk.MustExec(`create table t1 (c int) PARTITION BY RANGE (c) ( @@ -33,104 +46,154 @@ PARTITION BY RANGE (c) ( PARTITION p3 VALUES LESS THAN (21) );`) + is := s.dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + partDefs := tb.Meta().GetPartitionInfo().Definitions + p0ID := placement.GroupID(partDefs[0].ID) + bundle := &placement.Bundle{ + ID: p0ID, + Rules: []*placement.Rule{{Role: placement.Leader, Count: 1}}, + } + // normal cases - _, err := tk.Exec(`alter table t1 alter partition p0 + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + role=follower + replicas=3`) + c.Assert(err, IsNil) + + _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+zone=sh"]' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ zone = sh ", "- zone = bj "]' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh ": 1}' - role=leader + role=follower + replicas=3`) + c.Assert(err, IsNil) + + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + constraints="{'+zone=sh': 1}" + role=follower + replicas=3`) + c.Assert(err, IsNil) + + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + constraints="['+zone=sh']" + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh, -zone = bj ": 1}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 alter placement policy constraints='{"+ zone = sh, -zone = bj ": 1}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) + s.dom.InfoSchema().SetBundle(bundle) _, err = tk.Exec(`alter table t1 alter partition p0 drop placement policy role=leader`) c.Assert(err, IsNil) + _, err = tk.Exec(`alter table t1 alter partition p0 +drop placement policy + role=follower`) + c.Assert(err, NotNil) + + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + role=xxx + constraints='{"+ zone = sh, -zone = bj ": 1}' + replicas=3`) + c.Assert(err, NotNil) + + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + constraints='{"+ zone = sh, -zone = bj ": 1}' + replicas=3`) + c.Assert(err, ErrorMatches, ".*ROLE is not specified.*") + // multiple statements _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ zone = sh "]' - role=leader + role=follower replicas=3, add placement policy constraints='{"+ zone = sh, -zone = bj ": 1}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ zone = sh "]' - role=leader + role=follower replicas=3, add placement policy - constraints='{"+zone=sh,+zone=bj":1,"+zone=sh,+zone=bj":1}' - role=leader + constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh ": 1, "- zone = bj,+zone=sh": 2}' - role=leader + role=follower replicas=3, alter placement policy constraints='{"+ zone = sh, -zone = bj ": 1}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+zone=sh", "-zone=bj"]' - role=leader + role=follower replicas=3, add placement policy constraints='{"+zone=sh": 1}' - role=leader + role=follower replicas=3, add placement policy - constraints='{"+zone=sh,+zone=bj":1,"+zone=sh,+zone=bj":1}' - role=leader + constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' + role=follower replicas=3, alter placement policy constraints='{"+zone=sh": 1, "-zon =bj,+zone=sh": 1}' - role=leader + role=follower replicas=3`) c.Assert(err, IsNil) @@ -139,11 +202,12 @@ drop placement policy role=leader, drop placement policy role=leader`) - c.Assert(err, IsNil) + c.Assert(err, NotNil) + s.dom.InfoSchema().SetBundle(bundle) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy - constraints='{"+zone=sh,+zone=bj":1,"+zone=sh,+zone=bj":1}' + constraints='{"+zone=sh,-zone=bj":1,"+zone=sh,-zone=nj":1}' role=voter replicas=3, drop placement policy @@ -151,46 +215,64 @@ drop placement policy c.Assert(err, IsNil) // list/dict detection + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + role=follower + constraints='[]'`) + c.Assert(err, ErrorMatches, ".*array CONSTRAINTS should be with a positive REPLICAS.*") + _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints=',,,' - role=leader + role=follower + replicas=3`) + c.Assert(err, ErrorMatches, "(?s).*constraint is neither an array of string, nor a string-to-number map.*") + + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + role=voter replicas=3`) - c.Assert(err, ErrorMatches, ".*array or object.*") + c.Assert(err, IsNil) _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='[,,,' - role=leader + role=follower replicas=3`) - c.Assert(err, ErrorMatches, ".*invalid character.*") + c.Assert(err, ErrorMatches, "(?s).*constraint is neither an array of string, nor a string-to-number map.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{,,,' - role=leader + role=follower replicas=3`) - c.Assert(err, ErrorMatches, ".*invalid character.*") + c.Assert(err, ErrorMatches, "(?s).*constraint is neither an array of string, nor a string-to-number map.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' - role=leader + role=follower replicas=2`) c.Assert(err, ErrorMatches, ".*should be larger or equal to the number of total replicas.*") + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + constraints='{"+ zone = sh ": 1, "- zone = bj": 2}' + role=leader`) + c.Assert(err, ErrorMatches, ".*should be larger or equal to the number of total replicas.*") + // checkPlacementSpecConstraint _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='[",,,"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ "]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") @@ -198,7 +280,7 @@ add placement policy _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["0000"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") @@ -206,7 +288,7 @@ add placement policy _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+000"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") @@ -214,14 +296,14 @@ add placement policy _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ =zone1"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+ = z"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") @@ -229,28 +311,28 @@ add placement policy _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+zone="]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='["+z = "]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*label constraint should be in format.*") _, err = tk.Exec(`alter table t1 alter partition p add placement policy constraints='["+zone=sh"]' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*Unknown partition.*") _, err = tk.Exec(`alter table t1 alter partition p0 add placement policy constraints='{"+ zone = sh, -zone = bj ": -1}' - role=leader + role=follower replicas=3`) c.Assert(err, ErrorMatches, ".*count should be positive.*") @@ -261,13 +343,435 @@ add placement policy replicas=0`) c.Assert(err, ErrorMatches, ".*Invalid placement option REPLICAS, it is not allowed to be 0.*") + // ban tiflash + _, err = tk.Exec(`alter table t1 alter partition p0 +add placement policy + constraints='["+zone=sh", "+engine=tiflash"]' + role=follower + replicas=3`) + c.Assert(err, ErrorMatches, ".*unsupported label.*") + + // invalid partition tk.MustExec("drop table if exists t1") tk.MustExec("create table t1 (c int)") - _, err = tk.Exec(`alter table t1 alter partition p add placement policy constraints='["+zone=sh"]' - role=leader + role=follower replicas=3`) c.Assert(ddl.ErrPartitionMgmtOnNonpartitioned.Equal(err), IsTrue) + + // issue 20751 + tk.MustExec("drop table if exists t_part_pk_id") + tk.MustExec("create TABLE t_part_pk_id (c1 int,c2 int) partition by range(c1 div c2 ) (partition p0 values less than (2))") + _, err = tk.Exec(`alter table t_part_pk_id alter partition p0 add placement policy constraints='["+host=store1"]' role=leader;`) + c.Assert(err, IsNil) + _, err = tk.Exec(`alter table t_part_pk_id alter partition p0 add placement policy constraints='["+host=store1"]' role=leader replicas=3;`) + c.Assert(err, ErrorMatches, ".*replicas can only be 1 when the role is leader") + tk.MustExec("drop table t_part_pk_id") +} + +func (s *testDBSuite1) TestPlacementPolicyCache(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.Se.GetSessionVars().EnableAlterPlacement = true + tk.MustExec("set @@tidb_enable_exchange_partition = 1") + defer func() { + tk.MustExec("set @@tidb_enable_exchange_partition = 0") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.Se.GetSessionVars().EnableAlterPlacement = false + }() + + initTable := func() []string { + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t1") + tk.MustExec(`create table t1(id int) partition by range(id) +(partition p0 values less than (100), partition p1 values less than (200))`) + + is := s.dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + partDefs := tb.Meta().GetPartitionInfo().Definitions + + sort.Slice(partDefs, func(i, j int) bool { return partDefs[i].Name.L < partDefs[j].Name.L }) + + rows := []string{} + for k, v := range partDefs { + ptID := placement.GroupID(v.ID) + is.SetBundle(&placement.Bundle{ + ID: ptID, + Rules: []*placement.Rule{{Count: k}}, + }) + rows = append(rows, fmt.Sprintf("%s 0 test t1 %s %d ", ptID, v.Name.L, k)) + } + return rows + } + + // test drop + rows := initTable() + tk.MustQuery("select * from information_schema.placement_policy order by REPLICAS").Check(testkit.Rows(rows...)) + tk.MustExec("alter table t1 drop partition p0") + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows(rows[1:]...)) + + rows = initTable() + tk.MustQuery("select * from information_schema.placement_policy order by REPLICAS").Check(testkit.Rows(rows...)) + tk.MustExec("drop table t1") + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows()) + + // test truncate + rows = initTable() + tk.MustQuery("select * from information_schema.placement_policy order by REPLICAS").Check(testkit.Rows(rows...)) + tk.MustExec("alter table t1 truncate partition p0") + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows(rows[1:]...)) + + rows = initTable() + tk.MustQuery("select * from information_schema.placement_policy order by REPLICAS").Check(testkit.Rows(rows...)) + tk.MustExec("truncate table t1") + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows()) + + // test exchange + rows = initTable() + tk.MustQuery("select * from information_schema.placement_policy order by REPLICAS").Check(testkit.Rows(rows...)) + tk.MustExec("create table t2(id int)") + tk.MustExec("alter table t1 exchange partition p0 with table t2") + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows()) +} + +func (s *testSerialDBSuite) TestTxnScopeConstraint(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.Se.GetSessionVars().EnableAlterPlacement = true + defer func() { + tk.MustExec("drop table if exists t1") + tk.Se.GetSessionVars().EnableAlterPlacement = false + }() + + tk.MustExec(`create table t1 (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11), + PARTITION p2 VALUES LESS THAN (16), + PARTITION p3 VALUES LESS THAN (21) +);`) + + is := s.dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + partDefs := tb.Meta().GetPartitionInfo().Definitions + + for _, def := range partDefs { + if def.Name.String() == "p0" { + groupID := placement.GroupID(def.ID) + is.SetBundle(&placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Leader, + Count: 1, + LabelConstraints: []placement.LabelConstraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{"sh"}, + }, + }, + }, + }, + }) + } else if def.Name.String() == "p2" { + groupID := placement.GroupID(def.ID) + is.SetBundle(&placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Follower, + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{"sh"}, + }, + }, + }, + }, + }) + } + } + + testCases := []struct { + name string + sql string + txnScope string + zone string + disableAutoCommit bool + err error + }{ + { + name: "Insert into PARTITION p0 with global txnScope", + sql: "insert into t1 (c) values (1)", + txnScope: "global", + zone: "", + err: nil, + }, + { + name: "insert into PARTITION p0 with wrong txnScope", + sql: "insert into t1 (c) values (1)", + txnScope: "local", + zone: "bj", + err: fmt.Errorf(".*out of txn_scope.*"), + }, + { + name: "insert into PARTITION p1 with local txnScope", + sql: "insert into t1 (c) values (10)", + txnScope: "local", + zone: "bj", + err: fmt.Errorf(".*doesn't have placement policies with txn_scope.*"), + }, + { + name: "insert into PARTITION p1 with global txnScope", + sql: "insert into t1 (c) values (10)", + txnScope: "global", + err: nil, + }, + { + name: "insert into PARTITION p2 with local txnScope", + sql: "insert into t1 (c) values (15)", + txnScope: "local", + zone: "bj", + err: fmt.Errorf(".*leader placement policy is not defined.*"), + }, + { + name: "insert into PARTITION p2 with global txnScope", + sql: "insert into t1 (c) values (15)", + txnScope: "global", + zone: "", + err: nil, + }, + { + name: "insert into PARTITION p0 with wrong txnScope and autocommit off", + sql: "insert into t1 (c) values (1)", + txnScope: "local", + zone: "bj", + disableAutoCommit: true, + err: fmt.Errorf(".*out of txn_scope.*"), + }, + } + + for _, testcase := range testCases { + c.Log(testcase.name) + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", + fmt.Sprintf(`return("%v")`, testcase.zone)) + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("set @@txn_scope = %v", testcase.txnScope)) + if testcase.disableAutoCommit { + tk.MustExec("set @@autocommit = 0") + tk.MustExec("begin") + tk.MustExec(testcase.sql) + _, err = tk.Exec("commit") + } else { + _, err = tk.Exec(testcase.sql) + } + if testcase.err == nil { + c.Assert(err, IsNil) + } else { + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, testcase.err.Error()) + } + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + } +} + +func (s *testDBSuite1) TestAbortTxnIfPlacementChanged(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tp1") + tk.Se.GetSessionVars().EnableAlterPlacement = true + defer func() { + tk.MustExec("drop table if exists tp1") + tk.Se.GetSessionVars().EnableAlterPlacement = false + }() + + tk.MustExec(`create table tp1 (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + se1, err := session.CreateSession(s.store) + c.Assert(err, IsNil) + tk1 := testkit.NewTestKitWithSession(c, s.store, se1) + tk1.MustExec("use test") + + tk1.Se.GetSessionVars().EnableAlterPlacement = true + defer func() { + tk1.Se.GetSessionVars().EnableAlterPlacement = false + }() + _, err = tk.Exec(`alter table tp1 alter partition p0 +add placement policy + constraints='["+ zone = sh "]' + role=leader + replicas=1;`) + c.Assert(err, IsNil) + // modify p0 when alter p0 placement policy, the txn should be failed + _, err = tk.Exec("begin;") + c.Assert(err, IsNil) + _, err = tk1.Exec(`alter table tp1 alter partition p0 +add placement policy + constraints='["+ zone = sh "]' + role=follower + replicas=3;`) + c.Assert(err, IsNil) + _, err = tk.Exec("insert into tp1 (c) values (1);") + c.Assert(err, IsNil) + _, err = tk.Exec("commit") + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "*.[domain:8028]*.") + + _, err = tk.Exec(`alter table tp1 alter partition p1 +add placement policy + constraints='["+ zone = sh "]' + role=leader + replicas=1;`) + c.Assert(err, IsNil) + // modify p0 when alter p1 placement policy, the txn should be success. + _, err = tk.Exec("begin;") + c.Assert(err, IsNil) + _, err = tk1.Exec(`alter table tp1 alter partition p1 +add placement policy + constraints='["+ zone = sh "]' + role=follower + replicas=3;`) + c.Assert(err, IsNil) + _, err = tk.Exec("insert into tp1 (c) values (1);") + c.Assert(err, IsNil) + _, err = tk.Exec("commit") + c.Assert(err, IsNil) +} + +func (s *testSerialSuite) TestGlobalTxnState(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + defer tk.MustExec("drop table if exists t1") + + tk.Se.GetSessionVars().EnableAlterPlacement = true + defer func() { + tk.Se.GetSessionVars().EnableAlterPlacement = false + }() + + tk.MustExec(`create table t1 (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + + is := s.dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + pid, err := tables.FindPartitionByName(tb.Meta(), "p0") + c.Assert(err, IsNil) + groupID := placement.GroupID(pid) + bundle := &placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Leader, + Count: 1, + LabelConstraints: []placement.LabelConstraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{"bj"}, + }, + }, + }, + }, + } + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("bj")`) + defer failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + dbInfo := testGetSchemaByName(c, tk.Se, "test") + tk2 := testkit.NewTestKit(c, s.store) + var chkErr error + done := false + testcases := []struct { + name string + hook *ddl.TestDDLCallback + expectErr error + }{ + { + name: "write partition p0 during StateGlobalTxnOnly", + hook: func() *ddl.TestDDLCallback { + hook := &ddl.TestDDLCallback{} + hook.OnJobUpdatedExported = func(job *model.Job) { + if job.Type == model.ActionAlterTableAlterPartition && job.State == model.JobStateRunning && + job.SchemaState == model.StateGlobalTxnOnly && job.SchemaID == dbInfo.ID && done == false { + s.dom.InfoSchema().SetBundle(bundle) + done = true + tk2.MustExec("use test") + tk2.MustExec("set @@txn_scope=local") + _, chkErr = tk2.Exec("insert into t1 (c) values (1);") + } + } + return hook + }(), + expectErr: fmt.Errorf(".*can not be written by local transactions when its placement policy is being altered.*"), + }, + // FIXME: support abort read txn during StateGlobalTxnOnly + // { + // name: "read partition p0 during middle state", + // hook: func() *ddl.TestDDLCallback { + // hook := &ddl.TestDDLCallback{} + // hook.OnJobUpdatedExported = func(job *model.Job) { + // if job.Type == model.ActionAlterTableAlterPartition && job.State == model.JobStateRunning && + // job.SchemaState == model.StateGlobalTxnOnly && job.SchemaID == dbInfo.ID && done == false { + // done = true + // tk2.MustExec("use test") + // tk2.MustExec("set @@txn_scope=bj") + // tk2.MustExec("begin;") + // tk2.MustExec("select * from t1 where c < 6;") + // _, chkErr = tk2.Exec("commit") + // } + // } + // return hook + // }(), + // expectErr: fmt.Errorf(".*can not be written by local transactions when its placement policy is being altered.*"), + // }, + } + originalHook := s.dom.DDL().GetHook() + testFunc := func(name string, hook *ddl.TestDDLCallback, expectErr error) { + c.Log(name) + done = false + s.dom.DDL().(ddl.DDLForTest).SetHook(hook) + defer func() { + s.dom.DDL().(ddl.DDLForTest).SetHook(originalHook) + }() + _, err = tk.Exec(`alter table t1 alter partition p0 +alter placement policy + constraints='["+zone=bj"]' + role=leader + replicas=1`) + c.Assert(err, IsNil) + c.Assert(done, Equals, true) + if expectErr != nil { + c.Assert(chkErr, NotNil) + c.Assert(chkErr.Error(), Matches, expectErr.Error()) + } else { + c.Assert(chkErr, IsNil) + } + } + + for _, testcase := range testcases { + testFunc(testcase.name, testcase.hook, testcase.expectErr) + } } diff --git a/ddl/reorg.go b/ddl/reorg.go index 12ed72604ff16..2318dd6860081 100644 --- a/ddl/reorg.go +++ b/ddl/reorg.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -33,6 +34,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" @@ -61,7 +63,12 @@ type reorgCtx struct { // 1: job is canceled. notifyCancelReorgJob int32 // doneHandle is used to simulate the handle that has been processed. - doneHandle atomic.Value // nullableHandle + + doneKey atomic.Value // nullable kv.Key + + // element is used to record the current element in the reorg process, it can be + // accessed by reorg-worker and daemon-worker concurrently. + element atomic.Value // warnings is used to store the warnings when doing the reorg job under // a certain SQL Mode. @@ -72,18 +79,10 @@ type reorgCtx struct { } } -// nullableHandle can store handle. +// nullableKey can store kv.Key. // Storing a nil object to atomic.Value can lead to panic. This is a workaround. -type nullableHandle struct { - handle kv.Handle -} - -// toString is used in log to avoid nil dereference panic. -func toString(handle kv.Handle) string { - if handle == nil { - return "" - } - return handle.String() +type nullableKey struct { + key kv.Key } // newContext gets a context. It is only used for adding column in reorganization state. @@ -116,8 +115,12 @@ func (rc *reorgCtx) setRowCount(count int64) { atomic.StoreInt64(&rc.rowCount, count) } -func (rc *reorgCtx) setNextHandle(doneHandle kv.Handle) { - rc.doneHandle.Store(nullableHandle{handle: doneHandle}) +func (rc *reorgCtx) setNextKey(doneKey kv.Key) { + rc.doneKey.Store(nullableKey{key: doneKey}) +} + +func (rc *reorgCtx) setCurrentElement(element *meta.Element) { + rc.element.Store(element) } func (rc *reorgCtx) mergeWarnings(warnings map[errors.ErrorID]*terror.Error, warningsCount map[errors.ErrorID]int64) { @@ -140,20 +143,32 @@ func (rc *reorgCtx) increaseRowCount(count int64) { atomic.AddInt64(&rc.rowCount, count) } -func (rc *reorgCtx) getRowCountAndHandle() (int64, kv.Handle) { +func (rc *reorgCtx) getRowCountAndKey() (int64, kv.Key, *meta.Element) { row := atomic.LoadInt64(&rc.rowCount) - h, _ := (rc.doneHandle.Load()).(nullableHandle) - return row, h.handle + h, _ := (rc.doneKey.Load()).(nullableKey) + element, _ := (rc.element.Load()).(*meta.Element) + return row, h.key, element } func (rc *reorgCtx) clean() { rc.setRowCount(0) - rc.setNextHandle(nil) + rc.setNextKey(nil) rc.resetWarnings() rc.doneCh = nil } func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model.TableInfo, lease time.Duration, f func() error) error { + // Sleep for reorgDelay before doing reorganization. + // This provides a safe window for async commit and 1PC to commit with an old schema. + // lease = 0 means it's in an integration test. In this case we don't delay so the test won't run too slowly. + if lease > 0 { + cfg := config.GetGlobalConfig().TiKVClient.AsyncCommit + reorgDelay := cfg.SafeWindow + cfg.AllowedClockDrift + logutil.BgLogger().Info("sleep before reorganization to make async commit safe", + zap.Duration("duration", reorgDelay)) + time.Sleep(reorgDelay) + } + job := reorgInfo.Job // This is for tests compatible, because most of the early tests try to build the reorg job manually // without reorg meta info, which will cause nil pointer in here. @@ -170,7 +185,8 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. w.reorgCtx.doneCh = make(chan error, 1) // initial reorgCtx w.reorgCtx.setRowCount(job.GetRowCount()) - w.reorgCtx.setNextHandle(reorgInfo.StartHandle) + w.reorgCtx.setNextKey(reorgInfo.StartKey) + w.reorgCtx.setCurrentElement(reorgInfo.currElement) w.reorgCtx.mu.warnings = make(map[errors.ErrorID]*terror.Error) w.reorgCtx.mu.warningsCount = make(map[errors.ErrorID]int64) go func() { @@ -192,7 +208,7 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. // wait reorganization job done or timeout select { case err := <-w.reorgCtx.doneCh: - rowCount, _ := w.reorgCtx.getRowCountAndHandle() + rowCount, _, _ := w.reorgCtx.getRowCountAndKey() logutil.BgLogger().Info("[ddl] run reorg job done", zap.Int64("handled rows", rowCount)) // Update a job's RowCount. job.SetRowCount(rowCount) @@ -200,41 +216,51 @@ func (w *worker) runReorgJob(t *meta.Meta, reorgInfo *reorgInfo, tblInfo *model. // Update a job's warnings. w.mergeWarningsIntoJob(job) - if err == nil { - metrics.AddIndexProgress.Set(100) - } w.reorgCtx.clean() if err != nil { return errors.Trace(err) } - metrics.AddIndexProgress.Set(100) + switch reorgInfo.Type { + case model.ActionAddIndex, model.ActionAddPrimaryKey: + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(100) + case model.ActionModifyColumn: + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(100) + } if err1 := t.RemoveDDLReorgHandle(job, reorgInfo.elements); err1 != nil { logutil.BgLogger().Warn("[ddl] run reorg job done, removeDDLReorgHandle failed", zap.Error(err1)) return errors.Trace(err1) } case <-w.ctx.Done(): logutil.BgLogger().Info("[ddl] run reorg job quit") - w.reorgCtx.setNextHandle(nil) + w.reorgCtx.setNextKey(nil) w.reorgCtx.setRowCount(0) w.reorgCtx.resetWarnings() // We return errWaitReorgTimeout here too, so that outer loop will break. return errWaitReorgTimeout case <-time.After(waitTimeout): - rowCount, doneHandle := w.reorgCtx.getRowCountAndHandle() + rowCount, doneKey, currentElement := w.reorgCtx.getRowCountAndKey() // Update a job's RowCount. job.SetRowCount(rowCount) - updateAddIndexProgress(w, tblInfo, rowCount) + updateBackfillProgress(w, reorgInfo, tblInfo, rowCount) // Update a job's warnings. w.mergeWarningsIntoJob(job) w.reorgCtx.resetWarnings() + // Update a reorgInfo's handle. - err := t.UpdateDDLReorgStartHandle(job, reorgInfo.currElement, doneHandle) - logutil.BgLogger().Info("[ddl] run reorg job wait timeout", zap.Duration("waitTime", waitTimeout), - zap.ByteString("elementType", reorgInfo.currElement.TypeKey), zap.Int64("elementID", reorgInfo.currElement.ID), - zap.Int64("totalAddedRowCount", rowCount), zap.String("doneHandle", toString(doneHandle)), zap.Error(err)) + // Since daemon-worker is triggered by timer to store the info half-way. + // you should keep these infos is read-only (like job) / atomic (like doneKey & element) / concurrent safe. + err := t.UpdateDDLReorgStartHandle(job, currentElement, doneKey) + + logutil.BgLogger().Info("[ddl] run reorg job wait timeout", + zap.Duration("waitTime", waitTimeout), + zap.ByteString("elementType", currentElement.TypeKey), + zap.Int64("elementID", currentElement.ID), + zap.Int64("totalAddedRowCount", rowCount), + zap.String("doneKey", tryDecodeToHandleString(doneKey)), + zap.Error(err)) // If timeout, we will return, check the owner and retry to wait job done again. return errWaitReorgTimeout } @@ -249,7 +275,8 @@ func (w *worker) mergeWarningsIntoJob(job *model.Job) { w.reorgCtx.mu.Unlock() } -func updateAddIndexProgress(w *worker, tblInfo *model.TableInfo, addedRowCount int64) { +func updateBackfillProgress(w *worker, reorgInfo *reorgInfo, tblInfo *model.TableInfo, + addedRowCount int64) { if tblInfo == nil || addedRowCount == 0 { return } @@ -263,7 +290,12 @@ func updateAddIndexProgress(w *worker, tblInfo *model.TableInfo, addedRowCount i if progress > 1 { progress = 1 } - metrics.AddIndexProgress.Set(progress * 100) + switch reorgInfo.Type { + case model.ActionAddIndex, model.ActionAddPrimaryKey: + metrics.GetBackfillProgressByLabel(metrics.LblAddIndex).Set(progress * 100) + case model.ActionModifyColumn: + metrics.GetBackfillProgressByLabel(metrics.LblModifyColumn).Set(progress * 100) + } } func getTableTotalCount(w *worker, tblInfo *model.TableInfo) int64 { @@ -279,8 +311,12 @@ func getTableTotalCount(w *worker, tblInfo *model.TableInfo) int64 { if !ok { return statistics.PseudoRowCount } - sql := fmt.Sprintf("select table_rows from information_schema.tables where tidb_table_id=%v;", tblInfo.ID) - rows, _, err := executor.ExecRestrictedSQL(sql) + sql := "select table_rows from information_schema.tables where tidb_table_id=%?;" + stmt, err := executor.ParseWithParams(context.Background(), sql, tblInfo.ID) + if err != nil { + return statistics.PseudoRowCount + } + rows, _, err := executor.ExecRestrictedStmt(context.Background(), stmt) if err != nil { return statistics.PseudoRowCount } @@ -312,12 +348,10 @@ func (w *worker) isReorgRunnable(d *ddlCtx) error { type reorgInfo struct { *model.Job - // StartHandle is the first handle of the adding indices table. - StartHandle kv.Handle - // EndHandle is the last handle of the adding indices table. - EndHandle kv.Handle - d *ddlCtx - first bool + StartKey kv.Key + EndKey kv.Key + d *ddlCtx + first bool // PhysicalTableID is used for partitioned table. // DDL reorganize for a partitioned table will handle partitions one by one, // PhysicalTableID is used to trace the current partition we are handling. @@ -330,8 +364,8 @@ type reorgInfo struct { func (r *reorgInfo) String() string { return "CurrElementType:" + string(r.currElement.TypeKey) + "," + "CurrElementID:" + strconv.FormatInt(r.currElement.ID, 10) + "," + - "StartHandle:" + toString(r.StartHandle) + "," + - "EndHandle:" + toString(r.EndHandle) + "," + + "StartHandle:" + tryDecodeToHandleString(r.StartKey) + "," + + "EndHandle:" + tryDecodeToHandleString(r.EndKey) + "," + "First:" + strconv.FormatBool(r.first) + "," + "PhysicalTableID:" + strconv.FormatInt(r.PhysicalTableID, 10) } @@ -384,13 +418,13 @@ func (dc *ddlCtx) buildDescTableScan(ctx context.Context, startTS uint64, tbl ta } var b distsql.RequestBuilder var builder *distsql.RequestBuilder - if !tbl.Meta().IsCommonHandle { - ranges := ranger.FullIntRange(false) - builder = b.SetTableRanges(tbl.GetPhysicalID(), ranges, nil) + var ranges []*ranger.Range + if tbl.Meta().IsCommonHandle { + ranges = ranger.FullNotNullRange() } else { - ranges := ranger.FullNotNullRange() - builder = b.SetCommonHandleRanges(sctx.GetSessionVars().StmtCtx, tbl.GetPhysicalID(), ranges) + ranges = ranger.FullIntRange(false) } + builder = b.SetHandleRanges(sctx.GetSessionVars().StmtCtx, tbl.GetPhysicalID(), tbl.Meta().IsCommonHandle, ranges, nil) builder.SetDAGRequest(dagPB). SetStartTS(startTS). SetKeepOrder(true). @@ -480,31 +514,35 @@ func buildCommonHandleFromChunkRow(sctx *stmtctx.StatementContext, tblInfo *mode } // getTableRange gets the start and end handle of a table (or partition). -func getTableRange(d *ddlCtx, tbl table.PhysicalTable, snapshotVer uint64, priority int) (startHandle, endHandle kv.Handle, err error) { +func getTableRange(d *ddlCtx, tbl table.PhysicalTable, snapshotVer uint64, priority int) (startHandleKey, endHandleKey kv.Key, err error) { // Get the start handle of this partition. - err = iterateSnapshotRows(d.store, priority, tbl, snapshotVer, nil, nil, true, + err = iterateSnapshotRows(d.store, priority, tbl, snapshotVer, nil, nil, func(h kv.Handle, rowKey kv.Key, rawRecord []byte) (bool, error) { - startHandle = h + startHandleKey = rowKey return false, nil }) if err != nil { - return startHandle, endHandle, errors.Trace(err) + return startHandleKey, endHandleKey, errors.Trace(err) } - var emptyTable bool - endHandle, emptyTable, err = d.GetTableMaxHandle(snapshotVer, tbl) + maxHandle, isEmptyTable, err := d.GetTableMaxHandle(snapshotVer, tbl) if err != nil { - return startHandle, endHandle, errors.Trace(err) + return startHandleKey, nil, errors.Trace(err) } - if emptyTable || endHandle.Compare(startHandle) < 0 { + if maxHandle != nil { + endHandleKey = tablecodec.EncodeRecordKey(tbl.RecordPrefix(), maxHandle) + } + if isEmptyTable || endHandleKey.Cmp(startHandleKey) < 0 { logutil.BgLogger().Info("[ddl] get table range, endHandle < startHandle", zap.String("table", fmt.Sprintf("%v", tbl.Meta())), - zap.Int64("table/partition ID", tbl.GetPhysicalID()), zap.String("endHandle", toString(endHandle)), zap.String("startHandle", toString(startHandle))) - endHandle = startHandle + zap.Int64("table/partition ID", tbl.GetPhysicalID()), + zap.String("endHandle", tryDecodeToHandleString(endHandleKey)), + zap.String("startHandle", tryDecodeToHandleString(startHandleKey))) + endHandleKey = startHandleKey } return } func getValidCurrentVersion(store kv.Storage) (ver kv.Version, err error) { - ver, err = store.CurrentVersion() + ver, err = store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { return ver, errors.Trace(err) } else if ver.Ver <= 0 { @@ -516,8 +554,8 @@ func getValidCurrentVersion(store kv.Storage) (ver kv.Version, err error) { func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elements []*meta.Element) (*reorgInfo, error) { var ( element *meta.Element - start kv.Handle - end kv.Handle + start kv.Key + end kv.Key pid int64 info reorgInfo ) @@ -556,7 +594,8 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elem } logutil.BgLogger().Info("[ddl] job get table range", zap.Int64("jobID", job.ID), zap.Int64("physicalTableID", pid), - zap.String("startHandle", toString(start)), zap.String("endHandle", toString(end))) + zap.String("startHandle", tryDecodeToHandleString(start)), + zap.String("endHandle", tryDecodeToHandleString(end))) failpoint.Inject("errorUpdateReorgHandle", func() (*reorgInfo, error) { return &info, errors.New("occur an error when update reorg handle") @@ -581,7 +620,65 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elem }) var err error - element, start, end, pid, err = t.GetDDLReorgHandle(job, tbl.Meta().IsCommonHandle) + element, start, end, pid, err = t.GetDDLReorgHandle(job) + if err != nil { + // If the reorg element doesn't exist, this reorg info should be saved by the older TiDB versions. + // It's compatible with the older TiDB versions. + // We'll try to remove it in the next major TiDB version. + if meta.ErrDDLReorgElementNotExist.Equal(err) { + job.SnapshotVer = 0 + logutil.BgLogger().Warn("[ddl] get reorg info, the element does not exist", zap.String("job", job.String())) + } + return &info, errors.Trace(err) + } + } + info.Job = job + info.d = d + info.StartKey = start + info.EndKey = end + info.PhysicalTableID = pid + info.currElement = element + info.elements = elements + + return &info, nil +} + +func getReorgInfoFromPartitions(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, partitionIDs []int64, elements []*meta.Element) (*reorgInfo, error) { + var ( + element *meta.Element + start kv.Key + end kv.Key + pid int64 + info reorgInfo + ) + if job.SnapshotVer == 0 { + info.first = true + // get the current version for reorganization if we don't have + ver, err := getValidCurrentVersion(d.store) + if err != nil { + return nil, errors.Trace(err) + } + pid = partitionIDs[0] + tb := tbl.(table.PartitionedTable).GetPartition(pid) + start, end, err = getTableRange(d, tb, ver.Ver, job.Priority) + if err != nil { + return nil, errors.Trace(err) + } + logutil.BgLogger().Info("[ddl] job get table range", + zap.Int64("jobID", job.ID), zap.Int64("physicalTableID", pid), + zap.String("startHandle", tryDecodeToHandleString(start)), + zap.String("endHandle", tryDecodeToHandleString(end))) + + err = t.UpdateDDLReorgHandle(job, start, end, pid, elements[0]) + if err != nil { + return &info, errors.Trace(err) + } + // Update info should after data persistent. + job.SnapshotVer = ver.Ver + element = elements[0] + } else { + var err error + element, start, end, pid, err = t.GetDDLReorgHandle(job) if err != nil { // If the reorg element doesn't exist, this reorg info should be saved by the older TiDB versions. // It's compatible with the older TiDB versions. @@ -595,8 +692,8 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elem } info.Job = job info.d = d - info.StartHandle = start - info.EndHandle = end + info.StartKey = start + info.EndKey = end info.PhysicalTableID = pid info.currElement = element info.elements = elements @@ -604,14 +701,14 @@ func getReorgInfo(d *ddlCtx, t *meta.Meta, job *model.Job, tbl table.Table, elem return &info, nil } -func (r *reorgInfo) UpdateReorgMeta(startHandle kv.Handle) error { - if startHandle == nil && r.EndHandle == nil { +func (r *reorgInfo) UpdateReorgMeta(startKey kv.Key) error { + if startKey == nil && r.EndKey == nil { return nil } - err := kv.RunInNewTxn(r.d.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), r.d.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) - return errors.Trace(t.UpdateDDLReorgHandle(r.Job, startHandle, r.EndHandle, r.PhysicalTableID, r.currElement)) + return errors.Trace(t.UpdateDDLReorgHandle(r.Job, startKey, r.EndKey, r.PhysicalTableID, r.currElement)) }) if err != nil { return errors.Trace(err) diff --git a/ddl/reorg_test.go b/ddl/reorg_test.go index 7c58e43e4b58b..18dd9a975fceb 100644 --- a/ddl/reorg_test.go +++ b/ddl/reorg_test.go @@ -23,7 +23,6 @@ import ( "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" - . "github.com/pingcap/tidb/util/testutil" ) type testCtxKeyType int @@ -36,7 +35,10 @@ const testCtxKey testCtxKeyType = 0 func (s *testDDLSuite) TestReorg(c *C) { store := testCreateStore(c, "test_reorg") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -44,7 +46,10 @@ func (s *testDDLSuite) TestReorg(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() time.Sleep(testLease) @@ -76,7 +81,7 @@ func (s *testDDLSuite) TestReorg(c *C) { handle := s.NewHandle().Int(100).Common("a", 100, "string") f := func() error { d.generalWorker().reorgCtx.setRowCount(rowCount) - d.generalWorker().reorgCtx.setNextHandle(handle) + d.generalWorker().reorgCtx.setNextKey(handle.Encoded()) time.Sleep(1*ReorgWaitTimeout + 100*time.Millisecond) return nil } @@ -94,7 +99,7 @@ func (s *testDDLSuite) TestReorg(c *C) { Job: job, currElement: e, } - mockTbl := tables.MockTableFromMeta(&model.TableInfo{IsCommonHandle: s.IsCommonHandle}) + mockTbl := tables.MockTableFromMeta(&model.TableInfo{IsCommonHandle: s.IsCommonHandle, CommonHandleVersion: 1}) err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, f) c.Assert(err, NotNil) @@ -115,9 +120,9 @@ func (s *testDDLSuite) TestReorg(c *C) { m = meta.NewMeta(txn) info, err1 := getReorgInfo(d.ddlCtx, m, job, mockTbl, nil) c.Assert(err1, IsNil) - c.Assert(info.StartHandle, HandleEquals, handle) + c.Assert(info.StartKey, DeepEquals, kv.Key(handle.Encoded())) c.Assert(info.currElement, DeepEquals, e) - _, doneHandle := d.generalWorker().reorgCtx.getRowCountAndHandle() + _, doneHandle, _ := d.generalWorker().reorgCtx.getRowCountAndKey() c.Assert(doneHandle, IsNil) break } @@ -137,11 +142,11 @@ func (s *testDDLSuite) TestReorg(c *C) { Job: job, d: d.ddlCtx, currElement: element, - StartHandle: s.NewHandle().Int(1).Common(100, "string"), - EndHandle: s.NewHandle().Int(0).Common(101, "string"), + StartKey: s.NewHandle().Int(1).Common(100, "string").Encoded(), + EndKey: s.NewHandle().Int(0).Common(101, "string").Encoded(), PhysicalTableID: 456, } - err = kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error _, err1 = getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element}) @@ -151,21 +156,22 @@ func (s *testDDLSuite) TestReorg(c *C) { }) c.Assert(err, IsNil) job.SnapshotVer = uint64(1) - err = info.UpdateReorgMeta(info.StartHandle) + err = info.UpdateReorgMeta(info.StartKey) c.Assert(err, IsNil) - err = kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) info1, err1 := getReorgInfo(d.ddlCtx, t, job, mockTbl, []*meta.Element{element}) c.Assert(err1, IsNil) c.Assert(info1.currElement, DeepEquals, info.currElement) - c.Assert(info1.StartHandle, HandleEquals, info.StartHandle) - c.Assert(info1.EndHandle, HandleEquals, info.EndHandle) + c.Assert(info1.StartKey, DeepEquals, info.StartKey) + c.Assert(info1.EndKey, DeepEquals, info.EndKey) c.Assert(info1.PhysicalTableID, Equals, info.PhysicalTableID) return nil }) c.Assert(err, IsNil) - d.Stop() + err = d.Stop() + c.Assert(err, IsNil) err = d.generalWorker().runReorgJob(m, rInfo, mockTbl.Meta(), d.lease, func() error { time.Sleep(4 * testLease) return nil @@ -180,7 +186,10 @@ func (s *testDDLSuite) TestReorg(c *C) { func (s *testDDLSuite) TestReorgOwner(c *C) { store := testCreateStore(c, "test_reorg_owner") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d1 := testNewDDLAndStart( context.Background(), @@ -188,7 +197,10 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { WithStore(store), WithLease(testLease), ) - defer d1.Stop() + defer func() { + err := d1.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d1) @@ -200,7 +212,10 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { WithStore(store), WithLease(testLease), ) - defer d2.Stop() + defer func() { + err := d2.Stop() + c.Assert(err, IsNil) + }() dbInfo := testSchemaInfo(c, d1, "test") testCreateSchema(c, ctx, d1, dbInfo) @@ -223,7 +238,8 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { tc := &TestDDLCallback{} tc.onJobRunBefore = func(job *model.Job) { if job.SchemaState == model.StateDeleteReorganization { - d1.Stop() + err = d1.Stop() + c.Assert(err, IsNil) } } @@ -231,7 +247,7 @@ func (s *testDDLSuite) TestReorgOwner(c *C) { testDropSchema(c, ctx, d1, dbInfo) - err = kv.RunInNewTxn(d1.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), d1.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) db, err1 := t.GetDatabase(dbInfo.ID) c.Assert(err1, IsNil) diff --git a/ddl/restart_test.go b/ddl/restart_test.go index 489f635ec67f8..b587d54b80cc8 100644 --- a/ddl/restart_test.go +++ b/ddl/restart_test.go @@ -16,6 +16,7 @@ package ddl import ( "context" + "errors" "time" . "github.com/pingcap/check" @@ -29,8 +30,6 @@ import ( // restartWorkers is like the function of d.start. But it won't initialize the "workers" and create a new worker. // It only starts the original workers. func (d *ddl) restartWorkers(ctx context.Context) { - d.cancel() - d.wg.Wait() d.ctx, d.cancel = context.WithCancel(ctx) d.wg.Add(1) @@ -51,7 +50,7 @@ func (d *ddl) restartWorkers(ctx context.Context) { } // runInterruptedJob should be called concurrently with restartWorkers -func runInterruptedJob(c *C, d *ddl, job *model.Job, doneCh chan struct{}) { +func runInterruptedJob(c *C, d *ddl, job *model.Job, doneCh chan error) { ctx := mock.NewContext() ctx.Store = d.store @@ -60,19 +59,28 @@ func runInterruptedJob(c *C, d *ddl, job *model.Job, doneCh chan struct{}) { err error ) - _ = d.doDDLJob(ctx, job) - - for history == nil { - history, err = d.getHistoryDDLJob(job.ID) - c.Assert(err, IsNil) - time.Sleep(10 * testLease) + err = d.doDDLJob(ctx, job) + if errors.Is(err, context.Canceled) { + endlessLoopTime := time.Now().Add(time.Minute) + for history == nil { + // imitate doDDLJob's logic, quit only find history + history, _ = d.getHistoryDDLJob(job.ID) + if history != nil { + err = history.Error + } + time.Sleep(10 * testLease) + if time.Now().After(endlessLoopTime) { + err = errors.New("runInterruptedJob may enter endless loop") + break + } + } } - c.Assert(history.Error, IsNil) - doneCh <- struct{}{} + + doneCh <- err } func testRunInterruptedJob(c *C, d *ddl, job *model.Job) { - done := make(chan struct{}, 1) + done := make(chan error, 1) go runInterruptedJob(c, d, job, done) ticker := time.NewTicker(d.lease * 1) @@ -81,10 +89,12 @@ LOOP: for { select { case <-ticker.C: - d.Stop() + err := d.Stop() + c.Assert(err, IsNil) d.restartWorkers(context.Background()) time.Sleep(time.Millisecond * 20) - case <-done: + case err := <-done: + c.Assert(err, IsNil) break LOOP } } @@ -92,7 +102,10 @@ LOOP: func (s *testSchemaSuite) TestSchemaResume(c *C) { store := testCreateStore(c, "test_schema_resume") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d1 := testNewDDLAndStart( context.Background(), @@ -100,7 +113,10 @@ func (s *testSchemaSuite) TestSchemaResume(c *C) { WithStore(store), WithLease(testLease), ) - defer d1.Stop() + defer func() { + err := d1.Stop() + c.Assert(err, IsNil) + }() testCheckOwner(c, d1, true) @@ -125,7 +141,10 @@ func (s *testSchemaSuite) TestSchemaResume(c *C) { func (s *testStatSuite) TestStat(c *C) { store := testCreateStore(c, "test_stat") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -133,7 +152,10 @@ func (s *testStatSuite) TestStat(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() dbInfo := testSchemaInfo(c, d, "test") testCreateSchema(c, testNewContext(d), d, dbInfo) @@ -150,7 +172,7 @@ func (s *testStatSuite) TestStat(c *C) { Args: []interface{}{dbInfo.Name}, } - done := make(chan struct{}, 1) + done := make(chan error, 1) go runInterruptedJob(c, d, job, done) ticker := time.NewTicker(d.lease * 1) @@ -160,14 +182,15 @@ LOOP: for { select { case <-ticker.C: - d.Stop() + err := d.Stop() + c.Assert(err, IsNil) c.Assert(s.getDDLSchemaVer(c, d), GreaterEqual, ver) d.restartWorkers(context.Background()) time.Sleep(time.Millisecond * 20) - case <-done: + case err := <-done: // TODO: Get this information from etcd. // m, err := d.Stats(nil) - // c.Assert(err, IsNil) + c.Assert(err, IsNil) break LOOP } } diff --git a/ddl/rollingback.go b/ddl/rollingback.go index 3aff3ed13f13b..7b44d437edfe6 100644 --- a/ddl/rollingback.go +++ b/ddl/rollingback.go @@ -21,7 +21,6 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -35,7 +34,7 @@ func updateColsNull2NotNull(tblInfo *model.TableInfo, indexInfo *model.IndexInfo for _, col := range nullCols { col.Flag |= mysql.NotNullFlag - col.Flag = col.Flag &^ mysql.PreventNullInsertFlag + col.Flag &^= mysql.PreventNullInsertFlag } return nil } @@ -50,7 +49,7 @@ func convertAddIdxJob2RollbackJob(t *meta.Meta, job *model.Job, tblInfo *model.T } for _, col := range nullCols { // Field PreventNullInsertFlag flag reset. - col.Flag = col.Flag &^ mysql.PreventNullInsertFlag + col.Flag &^= mysql.PreventNullInsertFlag } } @@ -70,10 +69,6 @@ func convertAddIdxJob2RollbackJob(t *meta.Meta, job *model.Job, tblInfo *model.T return ver, errors.Trace(err1) } - if kv.ErrKeyExists.Equal(err) { - return ver, kv.ErrKeyExists.GenWithStackByArgs("", indexInfo.Name.O) - } - return ver, errors.Trace(err) } @@ -437,7 +432,7 @@ func convertJob2RollbackJob(w *worker, d *ddlCtx, t *meta.Meta, job *model.Job) case model.ActionModifyColumn: ver, err = rollingbackModifyColumn(t, job) case model.ActionRebaseAutoID, model.ActionShardRowID, model.ActionAddForeignKey, - model.ActionDropForeignKey, model.ActionRenameTable, + model.ActionDropForeignKey, model.ActionRenameTable, model.ActionRenameTables, model.ActionModifyTableCharsetAndCollate, model.ActionTruncateTablePartition, model.ActionModifySchemaCharsetAndCollate, model.ActionRepairTable, model.ActionModifyTableAutoIdCache, model.ActionAlterIndexVisibility, diff --git a/ddl/schema.go b/ddl/schema.go index 88d91a7ceb01c..823e12a551900 100644 --- a/ddl/schema.go +++ b/ddl/schema.go @@ -14,8 +14,12 @@ package ddl import ( + "context" + "github.com/pingcap/errors" "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta" ) @@ -139,7 +143,7 @@ func onModifySchemaCharsetAndCollate(t *meta.Meta, job *model.Job) (ver int64, _ return ver, nil } -func onDropSchema(t *meta.Meta, job *model.Job) (ver int64, _ error) { +func onDropSchema(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { dbInfo, err := checkSchemaExistAndCancelNotExistJob(t, job) if err != nil { return ver, errors.Trace(err) @@ -152,14 +156,39 @@ func onDropSchema(t *meta.Meta, job *model.Job) (ver int64, _ error) { switch dbInfo.State { case model.StatePublic: // public -> write only - job.SchemaState = model.StateWriteOnly dbInfo.State = model.StateWriteOnly err = t.UpdateDatabase(dbInfo) + if err != nil { + return ver, errors.Trace(err) + } + var tables []*model.TableInfo + tables, err = t.ListTables(job.SchemaID) + if err != nil { + return ver, errors.Trace(err) + } + oldIDs := getIDs(tables) + bundles := make([]*placement.Bundle, 0, len(oldIDs)+1) + for _, ID := range append(oldIDs, dbInfo.ID) { + oldBundle, ok := d.infoHandle.Get().BundleByName(placement.GroupID(ID)) + if ok && !oldBundle.IsEmpty() { + bundles = append(bundles, placement.BuildPlacementDropBundle(ID)) + } + } + err := infosync.PutRuleBundles(context.TODO(), bundles) + if err != nil { + return ver, errors.Trace(err) + } + // Update the job state when all affairs done. + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> delete only - job.SchemaState = model.StateDeleteOnly dbInfo.State = model.StateDeleteOnly err = t.UpdateDatabase(dbInfo) + if err != nil { + return ver, errors.Trace(err) + } + // Update the job state when all affairs done. + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: dbInfo.State = model.StateNone var tables []*model.TableInfo diff --git a/ddl/schema_test.go b/ddl/schema_test.go index feecd3cd453e9..c70a0b793bb35 100644 --- a/ddl/schema_test.go +++ b/ddl/schema_test.go @@ -96,7 +96,7 @@ func testCheckSchemaState(c *C, d *ddl, dbInfo *model.DBInfo, state model.Schema isDropped := true for { - kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) info, err := t.GetDatabase(dbInfo.ID) c.Assert(err, IsNil) @@ -114,6 +114,7 @@ func testCheckSchemaState(c *C, d *ddl, dbInfo *model.DBInfo, state model.Schema c.Assert(info.State, Equals, state) return nil }) + c.Assert(err, IsNil) if isDropped { break @@ -123,14 +124,20 @@ func testCheckSchemaState(c *C, d *ddl, dbInfo *model.DBInfo, state model.Schema func (s *testSchemaSuite) TestSchema(c *C) { store := testCreateStore(c, "test_schema") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), c, WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d) dbInfo := testSchemaInfo(c, d, "test") @@ -188,7 +195,10 @@ func (s *testSchemaSuite) TestSchema(c *C) { func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { store := testCreateStore(c, "test_schema_wait") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d1 := testNewDDLAndStart( context.Background(), @@ -196,7 +206,10 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { WithStore(store), WithLease(testLease), ) - defer d1.Stop() + defer func() { + err := d1.Stop() + c.Assert(err, IsNil) + }() testCheckOwner(c, d1, true) @@ -206,7 +219,10 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { WithStore(store), WithLease(testLease*4), ) - defer d2.Stop() + defer func() { + err := d2.Stop() + c.Assert(err, IsNil) + }() ctx := testNewContext(d2) // d2 must not be owner. @@ -227,7 +243,7 @@ func (s *testSchemaSuite) TestSchemaWaitJob(c *C) { func testGetSchemaInfoWithError(d *ddl, schemaID int64) (*model.DBInfo, error) { var dbInfo *model.DBInfo - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error dbInfo, err1 = t.GetDatabase(schemaID) diff --git a/ddl/sequence.go b/ddl/sequence.go index ce7b0bdcdd229..40c3676286106 100644 --- a/ddl/sequence.go +++ b/ddl/sequence.go @@ -15,6 +15,7 @@ package ddl import ( "math" + "reflect" "github.com/cznic/mathutil" "github.com/pingcap/errors" @@ -82,13 +83,13 @@ func createSequenceWithCheck(t *meta.Meta, job *model.Job, schemaID int64, tbInf return t.CreateSequenceAndSetSeqValue(schemaID, tbInfo, sequenceBase) } -func handleSequenceOptions(SeqOptions []*ast.SequenceOption, sequenceInfo *model.SequenceInfo) { +func handleSequenceOptions(seqOptions []*ast.SequenceOption, sequenceInfo *model.SequenceInfo) { var ( minSetFlag bool maxSetFlag bool startSetFlag bool ) - for _, op := range SeqOptions { + for _, op := range seqOptions { switch op.Tp { case ast.SequenceOptionIncrementBy: sequenceInfo.Increment = op.IntValue @@ -183,3 +184,110 @@ func buildSequenceInfo(stmt *ast.CreateSequenceStmt, ident ast.Ident) (*model.Se } return sequenceInfo, nil } + +func alterSequenceOptions(sequenceOptions []*ast.SequenceOption, ident ast.Ident, oldSequence *model.SequenceInfo) (bool, int64, error) { + var ( + restartFlag bool + restartWithFlag bool + restartValue int64 + ) + // Override the old sequence value with new option. + for _, op := range sequenceOptions { + switch op.Tp { + case ast.SequenceOptionIncrementBy: + oldSequence.Increment = op.IntValue + case ast.SequenceStartWith: + oldSequence.Start = op.IntValue + case ast.SequenceMinValue: + oldSequence.MinValue = op.IntValue + case ast.SequenceMaxValue: + oldSequence.MaxValue = op.IntValue + case ast.SequenceCache: + oldSequence.CacheValue = op.IntValue + case ast.SequenceNoCache: + oldSequence.Cache = false + case ast.SequenceCycle: + oldSequence.Cycle = true + case ast.SequenceNoCycle: + oldSequence.Cycle = false + case ast.SequenceRestart: + restartFlag = true + case ast.SequenceRestartWith: + restartWithFlag = true + restartValue = op.IntValue + } + } + if !validateSequenceOptions(oldSequence) { + return false, 0, ErrSequenceInvalidData.GenWithStackByArgs(ident.Schema.L, ident.Name.L) + } + if restartWithFlag { + return true, restartValue, nil + } + if restartFlag { + return true, oldSequence.Start, nil + } + return false, 0, nil +} + +func onAlterSequence(t *meta.Meta, job *model.Job) (ver int64, _ error) { + schemaID := job.SchemaID + var ( + sequenceOpts []*ast.SequenceOption + ident ast.Ident + ) + if err := job.DecodeArgs(&ident, &sequenceOpts); err != nil { + // Invalid arguments, cancel this job. + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + // Get the old tableInfo. + tblInfo, err := checkTableExistAndCancelNonExistJob(t, job, schemaID) + if err != nil { + return ver, errors.Trace(err) + } + + // Substitute the sequence info. + copySequenceInfo := *tblInfo.Sequence + restart, restartValue, err := alterSequenceOptions(sequenceOpts, ident, ©SequenceInfo) + if err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + shouldUpdateVer := !reflect.DeepEqual(*tblInfo.Sequence, copySequenceInfo) || restart + tblInfo.Sequence = ©SequenceInfo + + // Restart the sequence value. + // Notice: during the alter sequence process, if there is some dml continually consumes sequence (nextval/setval), + // the below cases will occur: + // Since the table schema haven't been refreshed in local/other node, dml will still use old definition of sequence + // to allocate sequence ids. Once the restart value is updated to kv here, the allocated ids in the upper layer won't + // guarantee to be consecutive and monotonous. + if restart { + err := restartSequenceValue(t, schemaID, tblInfo, restartValue) + if err != nil { + return ver, errors.Trace(err) + } + } + + // Store the sequence info into kv. + ver, err = updateVersionAndTableInfo(t, job, tblInfo, shouldUpdateVer) + if err != nil { + return ver, errors.Trace(err) + } + // Finish this job. + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +// Like setval does, restart sequence value won't affect current the step frequency. It will look backward for +// the first valid sequence valid rather than return the restart value directly. +func restartSequenceValue(t *meta.Meta, dbID int64, tblInfo *model.TableInfo, seqValue int64) error { + var sequenceBase int64 + if tblInfo.Sequence.Increment >= 0 { + sequenceBase = seqValue - 1 + } else { + sequenceBase = seqValue + 1 + } + return t.RestartSequenceValue(dbID, tblInfo, sequenceBase) +} diff --git a/ddl/sequence_test.go b/ddl/sequence_test.go index 31b41c2bd7d00..f46da112888df 100644 --- a/ddl/sequence_test.go +++ b/ddl/sequence_test.go @@ -74,6 +74,7 @@ func (s *testSequenceSuite) TestCreateSequence(c *C) { c.Assert(sequenceTable.Meta().Sequence.Cycle, Equals, false) // Test create privilege. + tk.MustExec("drop user if exists myuser@localhost") tk.MustExec("create user myuser@localhost") tk1 := testkit.NewTestKit(c, s.store) @@ -989,3 +990,87 @@ func (s *testSequenceSuite) TestSequenceCacheShouldNotBeNegative(c *C) { tk.MustExec("create sequence seq cache 1") } + +func (s *testSequenceSuite) TestAlterSequence(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop sequence if exists seq") + tk.MustExec("create sequence seq") + tk.MustExec("alter sequence seq increment by 2 start with 2") + tk.MustQuery("show create sequence seq").Check(testkit.Rows("seq CREATE SEQUENCE `seq` " + + "start with 2 minvalue 1 maxvalue 9223372036854775806 increment by 2 cache 1000 nocycle ENGINE=InnoDB")) + + tk.MustExec("drop sequence if exists seq") + tk.MustExec("create sequence seq") + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("2")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("3")) + // Alter sequence will invalidate the sequence cache in memory. + tk.MustExec("alter sequence seq increment by 2") + tk.MustQuery("show create sequence seq").Check(testkit.Rows("seq CREATE SEQUENCE `seq` " + + "start with 1 minvalue 1 maxvalue 9223372036854775806 increment by 2 cache 1000 nocycle ENGINE=InnoDB")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1001")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1003")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1005")) + + // Restart with value will reset the sequence value in kv. + tk.MustExec("alter sequence seq restart with 9") + // Like setval does, the sequence current value change won't affect the increment frequency. + // By now the step frequency is: 1, 3, 5, 7, 9, 11, 13, 15... + // After restart with 9, the current value rebased to 8, the next valid value will be 9, coincidentally equal to what we restarted. + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("9")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("11")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("13")) + + tk.MustExec("alter sequence seq restart with 10") + // After restart with 10, the current value rebased to 9, the next valid value will be 11, rather than what we restart. + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("11")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("13")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("15")) + + // Restart will reset the sequence value to start value by default. + tk.MustExec("alter sequence seq restart") + // After restart, the base will be pointed to 0, the first value will be 1 here, then plus the increment 2, the second value will be 3. + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("3")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("5")) + + tk.MustExec("drop sequence if exists seq") + tk.MustExec("create sequence seq increment by 3") + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("1")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("4")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("7")) + + tk.MustExec("alter sequence seq increment by 4") + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("3001")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("3005")) + tk.MustQuery("select nextval(seq)").Check(testkit.Rows("3009")) + tk.MustExec("drop sequence if exists seq") +} + +func (s *testSequenceSuite) TestAlterSequencePrivilege(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop sequence if exists my_seq") + tk.MustExec("create sequence my_seq") + + // Test create privilege. + tk.MustExec("drop user if exists myuser@localhost") + tk.MustExec("create user myuser@localhost") + + tk1 := testkit.NewTestKit(c, s.store) + se, err := session.CreateSession4Test(s.store) + c.Assert(err, IsNil) + c.Assert(se.Auth(&auth.UserIdentity{Username: "myuser", Hostname: "localhost"}, nil, nil), IsTrue) + tk1.Se = se + + // grant the myuser the access to database test. + tk.MustExec("grant select on test.* to 'myuser'@'localhost'") + + tk1.MustExec("use test") + _, err = tk1.Exec("alter sequence my_seq increment = 2") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[planner:1142]ALTER command denied to user 'myuser'@'localhost' for table 'my_seq'") + tk.MustExec("drop sequence if exists my_seq") +} diff --git a/ddl/serial_test.go b/ddl/serial_test.go index c54db5cf44dfa..e5d84c90776a9 100644 --- a/ddl/serial_test.go +++ b/ddl/serial_test.go @@ -41,7 +41,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/gcutil" @@ -113,7 +113,7 @@ func (s *testSerialSuite) TestChangeMaxIndexLength(c *C) { func (s *testSerialSuite) TestPrimaryKey(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_clustered_index = 0") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table primary_key_test (a int, b varchar(10))") tk.MustExec("create table primary_key_test_1 (a int, b varchar(10), primary key(a))") @@ -174,7 +174,7 @@ func (s *testSerialSuite) TestPrimaryKey(c *C) { conf.AlterPrimaryKey = false }) tk.MustExec("drop table if exists t;") - tk.MustExec("set tidb_enable_clustered_index=1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(a int, b varchar(64), primary key(b));") tk.MustExec("insert into t values(1,'a'), (2, 'b');") config.UpdateGlobal(func(conf *config.Config) { @@ -332,7 +332,7 @@ func (s *testSerialSuite) TestMultiRegionGetTableEndCommonHandle(c *C) { tk.MustExec("drop database if exists test_get_endhandle") tk.MustExec("create database test_get_endhandle") tk.MustExec("use test_get_endhandle") - tk.MustExec("set @@tidb_enable_clustered_index = true") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(a varchar(20), b int, c float, d bigint, primary key (a, b, c))") var builder strings.Builder @@ -376,7 +376,7 @@ func (s *testSerialSuite) TestGetTableEndCommonHandle(c *C) { tk.MustExec("drop database if exists test_get_endhandle") tk.MustExec("create database test_get_endhandle") tk.MustExec("use test_get_endhandle") - tk.MustExec("set @@tidb_enable_clustered_index = true") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(a varchar(15), b bigint, c int, primary key (a, b))") tk.MustExec("create table t1(a varchar(15), b bigint, c int, primary key (a(2), b))") @@ -402,7 +402,6 @@ func (s *testSerialSuite) TestGetTableEndCommonHandle(c *C) { // Test MaxTableRowID with prefixed primary key. tbl, err = is.TableByName(model.NewCIStr("test_get_endhandle"), model.NewCIStr("t1")) c.Assert(err, IsNil) - is = s.dom.InfoSchema() d = s.dom.DDL() testCtx = newTestMaxTableRowIDContext(c, d, tbl) checkGetMaxTableRowID(testCtx, s.store, true, nil) @@ -650,9 +649,8 @@ func (s *testSerialSuite) TestRecoverTableByJobID(c *C) { tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) // if GC enable is not exists in mysql.tidb - _, err = tk.Exec(fmt.Sprintf("recover table by job %d", jobID)) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:-1]can not get 'tikv_gc_enable'") + tk.MustExec(fmt.Sprintf("recover table by job %d", jobID)) + tk.MustExec("DROP TABLE t_recover") err = gcutil.EnableGC(tk.Se) c.Assert(err, IsNil) @@ -894,7 +892,7 @@ func (s *testSerialSuite) TestCanceledJobTakeTime(c *C) { once := sync.Once{} hook.OnJobUpdatedExported = func(job *model.Job) { once.Do(func() { - err := kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) return t.DropTableOrView(job.SchemaID, job.TableID, true) }) @@ -1170,6 +1168,9 @@ func (s *testSerialSuite) TestAutoRandomExchangePartition(c *C) { tk.MustExec("use auto_random_db") + tk.MustExec("set @@tidb_enable_exchange_partition=1") + defer tk.MustExec("set @@tidb_enable_exchange_partition=0") + tk.MustExec("drop table if exists e1, e2, e3, e4;") tk.MustExec("create table e1 (a bigint primary key auto_random(3)) partition by hash(a) partitions 1;") @@ -1254,6 +1255,31 @@ func (s *testSerialSuite) TestAutoRandomIncBitsIncrementAndOffset(c *C) { } } +func (s *testSerialSuite) TestAutoRandomWithPreSplitRegion(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database if not exists auto_random_db;") + defer tk.MustExec("drop database if exists auto_random_db;") + tk.MustExec("use auto_random_db;") + tk.MustExec("drop table if exists t;") + + ConfigTestUtils.SetupAutoRandomTestConfig() + defer ConfigTestUtils.RestoreAutoRandomTestConfig() + origin := atomic.LoadUint32(&ddl.EnableSplitTableRegion) + atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) + defer atomic.StoreUint32(&ddl.EnableSplitTableRegion, origin) + tk.MustExec("set @@global.tidb_scatter_region=1;") + + // Test pre-split table region for auto_random table. + tk.MustExec("create table t (a bigint auto_random(2) primary key, b int) pre_split_regions=2;") + re := tk.MustQuery("show table t regions;") + rows := re.Rows() + c.Assert(len(rows), Equals, 4) + tbl := testGetTableByName(c, tk.Se, "auto_random_db", "t") + c.Assert(rows[1][1], Equals, fmt.Sprintf("t_%d_r_2305843009213693952", tbl.Meta().ID)) + c.Assert(rows[2][1], Equals, fmt.Sprintf("t_%d_r_4611686018427387904", tbl.Meta().ID)) + c.Assert(rows[3][1], Equals, fmt.Sprintf("t_%d_r_6917529027641081856", tbl.Meta().ID)) +} + func (s *testSerialSuite) TestModifyingColumn4NewCollations(c *C) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) @@ -1285,6 +1311,7 @@ func (s *testSerialSuite) TestModifyingColumn4NewCollations(c *C) { tk.MustExec("alter table t collate utf8mb4_general_ci") tk.MustExec("alter table t charset utf8mb4 collate utf8mb4_bin") tk.MustExec("alter table t charset utf8mb4 collate utf8mb4_unicode_ci") + tk.MustExec("alter table t charset utf8mb4 collate utf8mb4_zh_pinyin_tidb_as_cs") // Change the default collation of database is allowed. tk.MustExec("alter database dct charset utf8mb4 collate utf8mb4_general_ci") } @@ -1479,3 +1506,29 @@ func (s *testSerialSuite) TestCreateTableNoBlock(c *C) { _, err := tk.Exec("create table t(a int)") c.Assert(err, NotNil) } + +func (s *testSerialSuite) TestCheckEnumLength(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1,t2,t3,t4,t5") + tk.MustGetErrCode("create table t1 (a enum('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))", errno.ErrTooLongValueForType) + tk.MustGetErrCode("create table t1 (a set('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))", errno.ErrTooLongValueForType) + tk.MustExec("create table t2 (id int primary key)") + tk.MustGetErrCode("alter table t2 add a enum('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')", errno.ErrTooLongValueForType) + tk.MustGetErrCode("alter table t2 add a set('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')", errno.ErrTooLongValueForType) + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableEnumLengthLimit = false + }) + _, err := tk.Exec("create table t3 (a enum('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))") + c.Assert(err, IsNil) + tk.MustExec("insert into t3 values(1)") + tk.MustQuery("select a from t3").Check(testkit.Rows("aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")) + _, err = tk.Exec("create table t4 (a set('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))") + c.Assert(err, IsNil) + + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableEnumLengthLimit = true + }) + tk.MustGetErrCode("create table t5 (a enum('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))", errno.ErrTooLongValueForType) + tk.MustGetErrCode("create table t5 (a set('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'))", errno.ErrTooLongValueForType) + tk.MustExec("drop table if exists t1,t2,t3,t4,t5") +} diff --git a/ddl/split_region.go b/ddl/split_region.go index d3ac07a3ddfc7..f5a5d97ae7cd7 100644 --- a/ddl/split_region.go +++ b/ddl/split_region.go @@ -31,7 +31,7 @@ func splitPartitionTableRegion(ctx sessionctx.Context, store kv.SplittableStore, regionIDs := make([]uint64, 0, len(pi.Definitions)) ctxWithTimeout, cancel := context.WithTimeout(context.Background(), ctx.GetSessionVars().GetSplitRegionTimeout()) defer cancel() - if tbInfo.ShardRowIDBits > 0 && tbInfo.PreSplitRegions > 0 { + if shardingBits(tbInfo) > 0 && tbInfo.PreSplitRegions > 0 { for _, def := range pi.Definitions { regionIDs = append(regionIDs, preSplitPhysicalTableByShardRowID(ctxWithTimeout, store, tbInfo, def.ID, scatter)...) } @@ -49,7 +49,7 @@ func splitTableRegion(ctx sessionctx.Context, store kv.SplittableStore, tbInfo * ctxWithTimeout, cancel := context.WithTimeout(context.Background(), ctx.GetSessionVars().GetSplitRegionTimeout()) defer cancel() var regionIDs []uint64 - if tbInfo.ShardRowIDBits > 0 && tbInfo.PreSplitRegions > 0 { + if shardingBits(tbInfo) > 0 && tbInfo.PreSplitRegions > 0 { regionIDs = preSplitPhysicalTableByShardRowID(ctxWithTimeout, store, tbInfo, tbInfo.ID, scatter) } else { regionIDs = append(regionIDs, splitRecordRegion(ctxWithTimeout, store, tbInfo.ID, scatter)) @@ -61,14 +61,14 @@ func splitTableRegion(ctx sessionctx.Context, store kv.SplittableStore, tbInfo * func preSplitPhysicalTableByShardRowID(ctx context.Context, store kv.SplittableStore, tbInfo *model.TableInfo, physicalID int64, scatter bool) []uint64 { // Example: - // ShardRowIDBits = 4 + // sharding_bits = 4 // PreSplitRegions = 2 // // then will pre-split 2^2 = 4 regions. // // in this code: - // max = 1 << tblInfo.ShardRowIDBits = 16 - // step := int64(1 << (tblInfo.ShardRowIDBits - tblInfo.PreSplitRegions)) = 1 << (4-2) = 4; + // max = 1 << sharding_bits = 16 + // step := int64(1 << (sharding_bits - tblInfo.PreSplitRegions)) = 1 << (4-2) = 4; // // then split regionID is below: // 4 << 59 = 2305843009213693952 @@ -84,12 +84,13 @@ func preSplitPhysicalTableByShardRowID(ctx context.Context, store kv.SplittableS // And the max _tidb_rowid is 9223372036854775807, it won't be negative number. // Split table region. - step := int64(1 << (tbInfo.ShardRowIDBits - tbInfo.PreSplitRegions)) - max := int64(1 << tbInfo.ShardRowIDBits) + shardingBits := shardingBits(tbInfo) + step := int64(1 << (shardingBits - tbInfo.PreSplitRegions)) + max := int64(1 << shardingBits) splitTableKeys := make([][]byte, 0, 1<<(tbInfo.PreSplitRegions)) splitTableKeys = append(splitTableKeys, tablecodec.GenTablePrefix(physicalID)) for p := step; p < max; p += step { - recordID := p << (64 - tbInfo.ShardRowIDBits - 1) + recordID := p << (64 - shardingBits - 1) recordPrefix := tablecodec.GenTableRecordPrefix(physicalID) key := tablecodec.EncodeRecordKey(recordPrefix, kv.IntHandle(recordID)) splitTableKeys = append(splitTableKeys, key) diff --git a/ddl/stat.go b/ddl/stat.go index 6cd5038b0d5a3..6f21b99f89a8e 100644 --- a/ddl/stat.go +++ b/ddl/stat.go @@ -14,6 +14,8 @@ package ddl import ( + "context" + "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/variable" @@ -49,7 +51,7 @@ func (d *ddl) Stats(vars *variable.SessionVars) (map[string]interface{}, error) m[serverID] = d.uuid var ddlInfo *admin.DDLInfo - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { var err1 error ddlInfo, err1 = admin.GetDDLInfo(txn) if err1 != nil { @@ -82,7 +84,7 @@ func (d *ddl) Stats(vars *variable.SessionVars) (map[string]interface{}, error) m[ddlJobSchemaID] = job.SchemaID m[ddlJobTableID] = job.TableID m[ddlJobSnapshotVer] = job.SnapshotVer - m[ddlJobReorgHandle] = toString(ddlInfo.ReorgHandle) + m[ddlJobReorgHandle] = tryDecodeToHandleString(ddlInfo.ReorgHandle) m[ddlJobArgs] = job.Args return m, nil } diff --git a/ddl/stat_test.go b/ddl/stat_test.go index 3ea0eba47242c..fe562a0ae0fb8 100644 --- a/ddl/stat_test.go +++ b/ddl/stat_test.go @@ -45,7 +45,10 @@ func (s *testStatSuite) getDDLSchemaVer(c *C, d *ddl) int64 { func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) { store := testCreateStore(c, "test_stat") - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() d := testNewDDLAndStart( context.Background(), @@ -53,7 +56,10 @@ func (s *testSerialStatSuite) TestDDLStatsInfo(c *C) { WithStore(store), WithLease(testLease), ) - defer d.Stop() + defer func() { + err := d.Stop() + c.Assert(err, IsNil) + }() dbInfo := testSchemaInfo(c, d, "test") testCreateSchema(c, testNewContext(d), d, dbInfo) diff --git a/ddl/table.go b/ddl/table.go index bbd29a546def7..263ad12fe460a 100644 --- a/ddl/table.go +++ b/ddl/table.go @@ -14,6 +14,7 @@ package ddl import ( + "context" "fmt" "strconv" "sync/atomic" @@ -25,7 +26,9 @@ import ( "github.com/pingcap/parser/charset" "github.com/pingcap/parser/model" field_types "github.com/pingcap/parser/types" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -173,16 +176,24 @@ func onDropTableOrView(t *meta.Meta, job *model.Job) (ver int64, _ error) { switch tblInfo.State { case model.StatePublic: // public -> write only - job.SchemaState = model.StateWriteOnly tblInfo.State = model.StateWriteOnly ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != tblInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateWriteOnly case model.StateWriteOnly: // write only -> delete only - job.SchemaState = model.StateDeleteOnly tblInfo.State = model.StateDeleteOnly ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != tblInfo.State) + if err != nil { + return ver, errors.Trace(err) + } + job.SchemaState = model.StateDeleteOnly case model.StateDeleteOnly: tblInfo.State = model.StateNone + oldIDs := getPartitionIDs(tblInfo) + job.CtxVars = []interface{}{oldIDs} ver, err = updateVersionAndTableInfo(t, job, tblInfo, originalState != tblInfo.State) if err != nil { return ver, errors.Trace(err) @@ -199,7 +210,7 @@ func onDropTableOrView(t *meta.Meta, job *model.Job) (ver int64, _ error) { // Finish this job. job.FinishTableJob(model.JobStateDone, model.StateNone, ver, tblInfo) startKey := tablecodec.EncodeTablePrefix(job.TableID) - job.Args = append(job.Args, startKey, getPartitionIDs(tblInfo)) + job.Args = append(job.Args, startKey, oldIDs) default: err = ErrInvalidDDLState.GenWithStackByArgs("table", tblInfo.State) } @@ -321,6 +332,7 @@ func (w *worker) onRecoverTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver in } }) + job.CtxVars = []interface{}{tids} ver, err = updateVersionAndTableInfo(t, job, tblInfo, true) if err != nil { return ver, errors.Trace(err) @@ -474,6 +486,36 @@ func onTruncateTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ erro } } + if d.infoHandle != nil && d.infoHandle.IsValid() { + is := d.infoHandle.Get() + + bundles := make([]*placement.Bundle, 0, len(oldPartitionIDs)+1) + if oldBundle, ok := is.BundleByName(placement.GroupID(tableID)); ok { + bundles = append(bundles, placement.BuildPlacementCopyBundle(oldBundle, newTableID)) + } + + if pi := tblInfo.GetPartitionInfo(); pi != nil { + oldIDs := make([]int64, 0, len(oldPartitionIDs)) + newIDs := make([]int64, 0, len(oldPartitionIDs)) + newDefs := pi.Definitions + for i := range oldPartitionIDs { + newID := newDefs[i].ID + if oldBundle, ok := is.BundleByName(placement.GroupID(oldPartitionIDs[i])); ok && !oldBundle.IsEmpty() { + oldIDs = append(oldIDs, oldPartitionIDs[i]) + newIDs = append(newIDs, newID) + bundles = append(bundles, placement.BuildPlacementCopyBundle(oldBundle, newID)) + } + } + job.CtxVars = []interface{}{oldIDs, newIDs} + } + + err = infosync.PutRuleBundles(context.TODO(), bundles) + if err != nil { + job.State = model.JobStateCancelled + return 0, errors.Wrapf(err, "failed to notify PD the placement rules") + } + } + // Clear the tiflash replica available status. if tblInfo.TiFlashReplica != nil { tblInfo.TiFlashReplica.AvailablePartitionIDs = nil @@ -638,12 +680,8 @@ func onRenameTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) return ver, errors.Trace(err) } - tblInfo, err := getTableInfoAndCancelFaultJob(t, job, oldSchemaID) - if err != nil { - return ver, errors.Trace(err) - } newSchemaID := job.SchemaID - err = checkTableNotExists(d, t, newSchemaID, tableName.L) + err := checkTableNotExists(d, t, newSchemaID, tableName.L) if err != nil { if infoschema.ErrDatabaseNotExists.Equal(err) || infoschema.ErrTableExists.Equal(err) { job.State = model.JobStateCancelled @@ -651,6 +689,53 @@ func onRenameTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) return ver, errors.Trace(err) } + ver, tblInfo, err := checkAndRenameTables(t, job, oldSchemaID, job.SchemaID, &tableName) + if err != nil { + return ver, errors.Trace(err) + } + + ver, err = updateSchemaVersion(t, job) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +func onRenameTables(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) { + oldSchemaIDs := []int64{} + newSchemaIDs := []int64{} + tableNames := []*model.CIStr{} + tableIDs := []int64{} + if err := job.DecodeArgs(&oldSchemaIDs, &newSchemaIDs, &tableNames, &tableIDs); err != nil { + job.State = model.JobStateCancelled + return ver, errors.Trace(err) + } + + tblInfo := &model.TableInfo{} + var err error + for i, oldSchemaID := range oldSchemaIDs { + job.TableID = tableIDs[i] + ver, tblInfo, err = checkAndRenameTables(t, job, oldSchemaID, newSchemaIDs[i], tableNames[i]) + if err != nil { + return ver, errors.Trace(err) + } + } + + ver, err = updateSchemaVersion(t, job) + if err != nil { + return ver, errors.Trace(err) + } + job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) + return ver, nil +} + +func checkAndRenameTables(t *meta.Meta, job *model.Job, oldSchemaID int64, newSchemaID int64, tableName *model.CIStr) (ver int64, tblInfo *model.TableInfo, _ error) { + tblInfo, err := getTableInfoAndCancelFaultJob(t, job, oldSchemaID) + if err != nil { + return ver, tblInfo, errors.Trace(err) + } + var autoTableID int64 var autoRandID int64 shouldDelAutoID := false @@ -659,12 +744,12 @@ func onRenameTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) autoTableID, err = t.GetAutoTableID(tblInfo.GetDBID(oldSchemaID), tblInfo.ID) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } autoRandID, err = t.GetAutoRandomID(tblInfo.GetDBID(oldSchemaID), tblInfo.ID) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } // It's compatible with old version. // TODO: Remove it. @@ -674,42 +759,39 @@ func onRenameTable(d *ddlCtx, t *meta.Meta, job *model.Job) (ver int64, _ error) err = t.DropTableOrView(oldSchemaID, tblInfo.ID, shouldDelAutoID) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } failpoint.Inject("renameTableErr", func(val failpoint.Value) { - if val.(bool) { - job.State = model.JobStateCancelled - failpoint.Return(ver, errors.New("occur an error after renaming table")) + if valStr, ok := val.(string); ok { + if tableName.L == valStr { + job.State = model.JobStateCancelled + failpoint.Return(ver, tblInfo, errors.New("occur an error after renaming table")) + } } }) - tblInfo.Name = tableName + tblInfo.Name = *tableName err = t.CreateTableOrView(newSchemaID, tblInfo) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } // Update the table's auto-increment ID. if newSchemaID != oldSchemaID { _, err = t.GenAutoTableID(newSchemaID, tblInfo.ID, autoTableID) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } _, err = t.GenAutoRandomID(newSchemaID, tblInfo.ID, autoRandID) if err != nil { job.State = model.JobStateCancelled - return ver, errors.Trace(err) + return ver, tblInfo, errors.Trace(err) } } - ver, err = updateSchemaVersion(t, job) - if err != nil { - return ver, errors.Trace(err) - } - job.FinishTableJob(model.JobStateDone, model.StatePublic, ver, tblInfo) - return ver, nil + return ver, tblInfo, nil } func onModifyTableComment(t *meta.Meta, job *model.Job) (ver int64, _ error) { diff --git a/ddl/table_lock.go b/ddl/table_lock.go index 1b24c95114204..6309c8ca1aff7 100644 --- a/ddl/table_lock.go +++ b/ddl/table_lock.go @@ -122,7 +122,8 @@ func lockTable(tbInfo *model.TableInfo, idx int, arg *lockTablesArg) error { if tbInfo.Lock.State == model.TableLockStatePreLock { return nil } - if tbInfo.Lock.Tp == model.TableLockRead && arg.LockTables[idx].Tp == model.TableLockRead { + if (tbInfo.Lock.Tp == model.TableLockRead && arg.LockTables[idx].Tp == model.TableLockRead) || + (tbInfo.Lock.Tp == model.TableLockReadOnly && arg.LockTables[idx].Tp == model.TableLockReadOnly) { sessionIndex := findSessionInfoIndex(tbInfo.Lock.Sessions, arg.SessionInfo) // repeat lock. if sessionIndex >= 0 { @@ -145,7 +146,8 @@ func checkTableLocked(tbInfo *model.TableInfo, lockTp model.TableLockType, sessi if tbInfo.Lock.State == model.TableLockStatePreLock { return nil } - if tbInfo.Lock.Tp == model.TableLockRead && lockTp == model.TableLockRead { + if (tbInfo.Lock.Tp == model.TableLockRead && lockTp == model.TableLockRead) || + (tbInfo.Lock.Tp == model.TableLockReadOnly && lockTp == model.TableLockReadOnly) { return nil } sessionIndex := findSessionInfoIndex(tbInfo.Lock.Sessions, sessionInfo) @@ -154,8 +156,8 @@ func checkTableLocked(tbInfo *model.TableInfo, lockTp model.TableLockType, sessi if tbInfo.Lock.Tp == lockTp { return nil } - // If no other session locked this table. - if len(tbInfo.Lock.Sessions) == 1 { + // If no other session locked this table, and it is not a read only lock (session unrelated). + if len(tbInfo.Lock.Sessions) == 1 && tbInfo.Lock.Tp != model.TableLockReadOnly { return nil } } diff --git a/ddl/table_split_test.go b/ddl/table_split_test.go index a64156a007459..af175b96c3afc 100644 --- a/ddl/table_split_test.go +++ b/ddl/table_split_test.go @@ -35,7 +35,10 @@ var _ = Suite(&testDDLTableSplitSuite{}) func (s *testDDLTableSplitSuite) TestTableSplit(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() session.SetSchemaLease(100 * time.Millisecond) session.DisableStats4Test() atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) diff --git a/ddl/table_test.go b/ddl/table_test.go index 3b431e402da7b..5760fc2b152b5 100644 --- a/ddl/table_test.go +++ b/ddl/table_test.go @@ -245,7 +245,7 @@ func testLockTable(c *C, ctx sessionctx.Context, d *ddl, newSchemaID int64, tblI } func checkTableLockedTest(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, serverID string, sessionID uint64, lockTp model.TableLockType) { - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) info, err := t.GetTable(dbInfo.ID, tblInfo.ID) c.Assert(err, IsNil) @@ -298,7 +298,7 @@ func testTruncateTable(c *C, ctx sessionctx.Context, d *ddl, dbInfo *model.DBInf } func testCheckTableState(c *C, d *ddl, dbInfo *model.DBInfo, tblInfo *model.TableInfo, state model.SchemaState) { - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) info, err := t.GetTable(dbInfo.ID, tblInfo.ID) c.Assert(err, IsNil) @@ -323,7 +323,7 @@ func testGetTable(c *C, d *ddl, schemaID int64, tableID int64) table.Table { func testGetTableWithError(d *ddl, schemaID, tableID int64) (table.Table, error) { var tblInfo *model.TableInfo - err := kv.RunInNewTxn(d.store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), d.store, false, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) var err1 error tblInfo, err1 = t.GetTable(schemaID, tableID) @@ -361,8 +361,10 @@ func (s *testTableSuite) SetUpSuite(c *C) { func (s *testTableSuite) TearDownSuite(c *C) { testDropSchema(c, testNewContext(s.d), s.d, s.dbInfo) - s.d.Stop() - s.store.Close() + err := s.d.Stop() + c.Assert(err, IsNil) + err = s.store.Close() + c.Assert(err, IsNil) } func (s *testTableSuite) TestTable(c *C) { diff --git a/ddl/testutil/testutil.go b/ddl/testutil/testutil.go index 875528acd3e39..08ec5953ec58e 100644 --- a/ddl/testutil/testutil.go +++ b/ddl/testutil/testutil.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" ) @@ -71,8 +72,9 @@ func ExtractAllTableHandles(se session.Session, dbName, tbName string) ([]int64, if err != nil { return nil, err } + var allHandles []int64 - err = tbl.IterRecords(se, tbl.FirstKey(), nil, + err = tables.IterRecords(tbl, se, nil, func(h kv.Handle, _ []types.Datum, _ []*table.Column) (more bool, err error) { allHandles = append(allHandles, h.IntValue()) return true, nil diff --git a/ddl/util/syncer_test.go b/ddl/util/syncer_test.go index 122d786af0bea..b552488ad49de 100644 --- a/ddl/util/syncer_test.go +++ b/ddl/util/syncer_test.go @@ -58,7 +58,12 @@ func TestSyncerSimple(t *testing.T) { if err != nil { t.Fatal(err) } - defer store.Close() + defer func() { + err := store.Close() + if err != nil { + t.Fatal(err) + } + }() clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) defer clus.Terminate(t) @@ -74,7 +79,12 @@ func TestSyncerSimple(t *testing.T) { if err != nil { t.Fatalf("DDL start failed %v", err) } - defer d.Stop() + defer func() { + err := d.Stop() + if err != nil { + t.Fatal(err) + } + }() // for init function if err = d.SchemaSyncer().Init(ctx); err != nil { @@ -110,7 +120,12 @@ func TestSyncerSimple(t *testing.T) { if err != nil { t.Fatalf("DDL start failed %v", err) } - defer d1.Stop() + defer func() { + err := d.Stop() + if err != nil { + t.Fatal(err) + } + }() if err = d1.SchemaSyncer().Init(ctx); err != nil { t.Fatalf("schema version syncer init failed %v", err) } diff --git a/ddl/util/util.go b/ddl/util/util.go index 69a6d3ced56f7..0c3ec2608b9eb 100644 --- a/ddl/util/util.go +++ b/ddl/util/util.go @@ -14,11 +14,9 @@ package util import ( - "bytes" "context" "encoding/hex" - "fmt" - "strconv" + "strings" "github.com/pingcap/errors" "github.com/pingcap/parser/terror" @@ -32,12 +30,13 @@ import ( const ( deleteRangesTable = `gc_delete_range` doneDeleteRangesTable = `gc_delete_range_done` - loadDeleteRangeSQL = `SELECT HIGH_PRIORITY job_id, element_id, start_key, end_key FROM mysql.%s WHERE ts < %v` - recordDoneDeletedRangeSQL = `INSERT IGNORE INTO mysql.gc_delete_range_done SELECT * FROM mysql.gc_delete_range WHERE job_id = %d AND element_id = %d` - completeDeleteRangeSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %d AND element_id = %d` - completeDeleteMultiRangesSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %d AND element_id in (%v)` - updateDeleteRangeSQL = `UPDATE mysql.gc_delete_range SET start_key = "%s" WHERE job_id = %d AND element_id = %d AND start_key = "%s"` - deleteDoneRecordSQL = `DELETE FROM mysql.gc_delete_range_done WHERE job_id = %d AND element_id = %d` + loadDeleteRangeSQL = `SELECT HIGH_PRIORITY job_id, element_id, start_key, end_key FROM mysql.%n WHERE ts < %?` + recordDoneDeletedRangeSQL = `INSERT IGNORE INTO mysql.gc_delete_range_done SELECT * FROM mysql.gc_delete_range WHERE job_id = %? AND element_id = %?` + completeDeleteRangeSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %? AND element_id = %?` + completeDeleteMultiRangesSQL = `DELETE FROM mysql.gc_delete_range WHERE job_id = %? AND element_id in (` // + idList + ")" + updateDeleteRangeSQL = `UPDATE mysql.gc_delete_range SET start_key = %? WHERE job_id = %? AND element_id = %? AND start_key = %?` + deleteDoneRecordSQL = `DELETE FROM mysql.gc_delete_range_done WHERE job_id = %? AND element_id = %?` + loadGlobalVars = `SELECT HIGH_PRIORITY variable_name, variable_value from mysql.global_variables where variable_name in (` // + nameList + ")" ) // DelRangeTask is for run delete-range command in gc_worker. @@ -62,16 +61,14 @@ func LoadDoneDeleteRanges(ctx sessionctx.Context, safePoint uint64) (ranges []De } func loadDeleteRangesFromTable(ctx sessionctx.Context, table string, safePoint uint64) (ranges []DelRangeTask, _ error) { - sql := fmt.Sprintf(loadDeleteRangeSQL, table, safePoint) - rss, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rss) > 0 { - defer terror.Call(rss[0].Close) + rs, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), loadDeleteRangeSQL, table, safePoint) + if rs != nil { + defer terror.Call(rs.Close) } if err != nil { return nil, errors.Trace(err) } - rs := rss[0] req := rs.NewChunk() it := chunk.NewIterator4Chunk(req) for { @@ -106,8 +103,7 @@ func loadDeleteRangesFromTable(ctx sessionctx.Context, table string, safePoint u // CompleteDeleteRange moves a record from gc_delete_range table to gc_delete_range_done table. // NOTE: This function WILL NOT start and run in a new transaction internally. func CompleteDeleteRange(ctx sessionctx.Context, dr DelRangeTask) error { - sql := fmt.Sprintf(recordDoneDeletedRangeSQL, dr.JobID, dr.ElementID) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), recordDoneDeletedRangeSQL, dr.JobID, dr.ElementID) if err != nil { return errors.Trace(err) } @@ -117,29 +113,31 @@ func CompleteDeleteRange(ctx sessionctx.Context, dr DelRangeTask) error { // RemoveFromGCDeleteRange is exported for ddl pkg to use. func RemoveFromGCDeleteRange(ctx sessionctx.Context, jobID, elementID int64) error { - sql := fmt.Sprintf(completeDeleteRangeSQL, jobID, elementID) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), completeDeleteRangeSQL, jobID, elementID) return errors.Trace(err) } // RemoveMultiFromGCDeleteRange is exported for ddl pkg to use. func RemoveMultiFromGCDeleteRange(ctx sessionctx.Context, jobID int64, elementIDs []int64) error { - var buf bytes.Buffer + var buf strings.Builder + buf.WriteString(completeDeleteMultiRangesSQL) + paramIDs := make([]interface{}, 0, 1+len(elementIDs)) + paramIDs = append(paramIDs, jobID) for i, elementID := range elementIDs { if i > 0 { buf.WriteString(", ") } - buf.WriteString(strconv.FormatInt(elementID, 10)) + buf.WriteString("%?") + paramIDs = append(paramIDs, elementID) } - sql := fmt.Sprintf(completeDeleteMultiRangesSQL, jobID, buf.String()) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + buf.WriteString(")") + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), buf.String(), paramIDs...) return errors.Trace(err) } // DeleteDoneRecord removes a record from gc_delete_range_done table. func DeleteDoneRecord(ctx sessionctx.Context, dr DelRangeTask) error { - sql := fmt.Sprintf(deleteDoneRecordSQL, dr.JobID, dr.ElementID) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), deleteDoneRecordSQL, dr.JobID, dr.ElementID) return errors.Trace(err) } @@ -147,14 +145,15 @@ func DeleteDoneRecord(ctx sessionctx.Context, dr DelRangeTask) error { func UpdateDeleteRange(ctx sessionctx.Context, dr DelRangeTask, newStartKey, oldStartKey kv.Key) error { newStartKeyHex := hex.EncodeToString(newStartKey) oldStartKeyHex := hex.EncodeToString(oldStartKey) - sql := fmt.Sprintf(updateDeleteRangeSQL, newStartKeyHex, dr.JobID, dr.ElementID, oldStartKeyHex) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), updateDeleteRangeSQL, newStartKeyHex, dr.JobID, dr.ElementID, oldStartKeyHex) return errors.Trace(err) } // LoadDDLReorgVars loads ddl reorg variable from mysql.global_variables. func LoadDDLReorgVars(ctx sessionctx.Context) error { - return LoadGlobalVars(ctx, []string{variable.TiDBDDLReorgWorkerCount, variable.TiDBDDLReorgBatchSize}) + // close issue #21391 + // variable.TiDBRowFormatVersion is used to encode the new row for column type change. + return LoadGlobalVars(ctx, []string{variable.TiDBDDLReorgWorkerCount, variable.TiDBDDLReorgBatchSize, variable.TiDBRowFormatVersion}) } // LoadDDLVars loads ddl variable from mysql.global_variables. @@ -162,20 +161,25 @@ func LoadDDLVars(ctx sessionctx.Context) error { return LoadGlobalVars(ctx, []string{variable.TiDBDDLErrorCountLimit}) } -const loadGlobalVarsSQL = "select HIGH_PRIORITY variable_name, variable_value from mysql.global_variables where variable_name in (%s)" - // LoadGlobalVars loads global variable from mysql.global_variables. func LoadGlobalVars(ctx sessionctx.Context, varNames []string) error { if sctx, ok := ctx.(sqlexec.RestrictedSQLExecutor); ok { - nameList := "" + var buf strings.Builder + buf.WriteString(loadGlobalVars) + paramNames := make([]interface{}, 0, len(varNames)) for i, name := range varNames { if i > 0 { - nameList += ", " + buf.WriteString(", ") } - nameList += fmt.Sprintf("'%s'", name) + buf.WriteString("%?") + paramNames = append(paramNames, name) + } + buf.WriteString(")") + stmt, err := sctx.ParseWithParams(context.Background(), buf.String(), paramNames...) + if err != nil { + return errors.Trace(err) } - sql := fmt.Sprintf(loadGlobalVarsSQL, nameList) - rows, _, err := sctx.ExecRestrictedSQL(sql) + rows, _, err := sctx.ExecRestrictedStmt(context.Background(), stmt) if err != nil { return errors.Trace(err) } diff --git a/distsql/distsql.go b/distsql/distsql.go index 3bf8e1d652fe4..83236ce4dc5f4 100644 --- a/distsql/distsql.go +++ b/distsql/distsql.go @@ -28,6 +28,34 @@ import ( "github.com/pingcap/tipb/go-tipb" ) +// DispatchMPPTasks dispathes all tasks and returns an iterator. +func DispatchMPPTasks(ctx context.Context, sctx sessionctx.Context, tasks []*kv.MPPDispatchRequest, fieldTypes []*types.FieldType, planIDs []int, rootID int) (SelectResult, error) { + resp := sctx.GetMPPClient().DispatchMPPTasks(ctx, sctx.GetSessionVars().KVVars, tasks) + if resp == nil { + err := errors.New("client returns nil response") + return nil, err + } + + encodeType := tipb.EncodeType_TypeDefault + if canUseChunkRPC(sctx) { + encodeType = tipb.EncodeType_TypeChunk + } + // TODO: Add metric label and set open tracing. + return &selectResult{ + label: "mpp", + resp: resp, + rowLen: len(fieldTypes), + fieldTypes: fieldTypes, + ctx: sctx, + feedback: statistics.NewQueryFeedback(0, nil, 0, false), + encodeType: encodeType, + copPlanIDs: planIDs, + rootPlanID: rootID, + storeType: kv.TiFlash, + }, nil + +} + // Select sends a DAG request, returns SelectResult. // In kvReq, KeyRanges is required, Concurrency/KeepOrder/Desc/IsolationLevel/Priority are optional. func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fieldTypes []*types.FieldType, fb *statistics.QueryFeedback) (SelectResult, error) { @@ -45,7 +73,8 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie if !sctx.GetSessionVars().EnableStreaming { kvReq.Streaming = false } - resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, sctx.GetSessionVars().StmtCtx.MemTracker) + enabledRateLimitAction := sctx.GetSessionVars().EnabledRateLimitAction + resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, sctx.GetSessionVars().StmtCtx.MemTracker, enabledRateLimitAction) if resp == nil { err := errors.New("client returns nil response") return nil, err @@ -85,6 +114,7 @@ func Select(ctx context.Context, sctx sessionctx.Context, kvReq *kv.Request, fie sqlType: label, memTracker: kvReq.MemTracker, encodeType: encodetype, + storeType: kvReq.StoreType, }, nil } @@ -106,7 +136,7 @@ func SelectWithRuntimeStats(ctx context.Context, sctx sessionctx.Context, kvReq // Analyze do a analyze request. func Analyze(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv.Variables, isRestrict bool, sessionMemTracker *memory.Tracker) (SelectResult, error) { - resp := client.Send(ctx, kvReq, vars, sessionMemTracker) + resp := client.Send(ctx, kvReq, vars, sessionMemTracker, false) if resp == nil { return nil, errors.New("client returns nil response") } @@ -120,6 +150,7 @@ func Analyze(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv. feedback: statistics.NewQueryFeedback(0, nil, 0, false), sqlType: label, encodeType: tipb.EncodeType_TypeDefault, + storeType: kvReq.StoreType, } return result, nil } @@ -128,7 +159,7 @@ func Analyze(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv. func Checksum(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv.Variables) (SelectResult, error) { // FIXME: As BR have dependency of `Checksum` and TiDB also introduced BR as dependency, Currently we can't edit // Checksum function signature. The two-way dependence should be removed in future. - resp := client.Send(ctx, kvReq, vars, nil) + resp := client.Send(ctx, kvReq, vars, nil, false) if resp == nil { return nil, errors.New("client returns nil response") } @@ -138,6 +169,7 @@ func Checksum(ctx context.Context, client kv.Client, kvReq *kv.Request, vars *kv feedback: statistics.NewQueryFeedback(0, nil, 0, false), sqlType: metrics.LblGeneral, encodeType: tipb.EncodeType_TypeDefault, + storeType: kvReq.StoreType, } return result, nil } diff --git a/distsql/distsql_test.go b/distsql/distsql_test.go index 6942b7c32d60b..e28e35046dc8a 100644 --- a/distsql/distsql_test.go +++ b/distsql/distsql_test.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" @@ -46,7 +47,7 @@ func (s *testSuite) createSelectNormal(batch, totalRows int, c *C, planIDs []int Build() c.Assert(err, IsNil) - /// 4 int64 types. + // 4 int64 types. colTypes := []*types.FieldType{ { Tp: mysql.TypeLonglong, @@ -179,6 +180,28 @@ func (s *testSuite) TestSelectResultRuntimeStats(c *C) { c.Assert(stats.String(), Equals, expect) // Test for idempotence. c.Assert(stats.String(), Equals, expect) + + s1.rpcStat.Stats[tikvrpc.CmdCop] = &tikv.RPCRuntimeStats{ + Count: 1, + Consume: int64(time.Second), + } + stmtStats.RegisterStats(2, s1) + stats = stmtStats.GetRootStats(2) + expect = "cop_task: {num: 2, max: 1s, min: 1ms, avg: 500.5ms, p95: 1s, max_proc_keys: 200, p95_proc_keys: 200, tot_proc: 1s, tot_wait: 1s, rpc_num: 1, rpc_time: 1s, copr_cache_hit_ratio: 0.00}, backoff{RegionMiss: 1ms}" + c.Assert(stats.String(), Equals, expect) + // Test for idempotence. + c.Assert(stats.String(), Equals, expect) + + s1 = &selectResultRuntimeStats{ + copRespTime: []time.Duration{time.Second}, + procKeys: []int64{100}, + backoffSleep: map[string]time.Duration{"RegionMiss": time.Millisecond}, + totalProcessTime: time.Second, + totalWaitTime: time.Second, + rpcStat: tikv.NewRegionRequestRuntimeStats(), + } + expect = "cop_task: {num: 1, max: 1s, proc_keys: 100, tot_proc: 1s, tot_wait: 1s, copr_cache_hit_ratio: 0.00}, backoff{RegionMiss: 1ms}" + c.Assert(s1.String(), Equals, expect) } func (s *testSuite) createSelectStreaming(batch, totalRows int, c *C) (*streamResult, []*types.FieldType) { @@ -191,7 +214,7 @@ func (s *testSuite) createSelectStreaming(batch, totalRows int, c *C) (*streamRe Build() c.Assert(err, IsNil) - /// 4 int64 types. + // 4 int64 types. colTypes := []*types.FieldType{ { Tp: mysql.TypeLonglong, @@ -461,7 +484,7 @@ func createSelectNormal(batch, totalRows int, ctx sessionctx.Context) (*selectRe SetMemTracker(memory.NewTracker(-1, -1)). Build() - /// 4 int64 types. + // 4 int64 types. colTypes := []*types.FieldType{ { Tp: mysql.TypeLonglong, diff --git a/distsql/request_builder.go b/distsql/request_builder.go index 944c56bd5200d..310de50149eeb 100644 --- a/distsql/request_builder.go +++ b/distsql/request_builder.go @@ -14,14 +14,20 @@ package distsql import ( + "fmt" "math" + "sort" + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" @@ -34,11 +40,18 @@ import ( // It is called before we issue a kv request by "Select". type RequestBuilder struct { kv.Request - err error + // txnScope indicates the value of txn_scope + txnScope string + is infoschema.InfoSchema + err error } // Build builds a "kv.Request". func (builder *RequestBuilder) Build() (*kv.Request, error) { + err := builder.verifyTxnScope() + if err != nil { + builder.err = err + } return &builder.Request, builder.err } @@ -48,17 +61,10 @@ func (builder *RequestBuilder) SetMemTracker(tracker *memory.Tracker) *RequestBu return builder } -// SetTableRangesForTables sets "KeyRanges" for "kv.Request" by converting multiples "tableRanges" -// to "KeyRanges" firstly. -func (builder *RequestBuilder) SetTableRangesForTables(tids []int64, tableRanges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { - if builder.err == nil { - builder.Request.KeyRanges = TablesRangesToKVRanges(tids, tableRanges, fb) - } - return builder -} - // SetTableRanges sets "KeyRanges" for "kv.Request" by converting "tableRanges" // to "KeyRanges" firstly. +// Note this function should be deleted or at least not exported, but currently +// br refers it, so have to keep it. func (builder *RequestBuilder) SetTableRanges(tid int64, tableRanges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { if builder.err == nil { builder.Request.KeyRanges = TableRangesToKVRanges(tid, tableRanges, fb) @@ -84,20 +90,17 @@ func (builder *RequestBuilder) SetIndexRangesForTables(sc *stmtctx.StatementCont return builder } -// SetCommonHandleRanges sets "KeyRanges" for "kv.Request" by converting common handle range +// SetHandleRanges sets "KeyRanges" for "kv.Request" by converting table handle range // "ranges" to "KeyRanges" firstly. -func (builder *RequestBuilder) SetCommonHandleRanges(sc *stmtctx.StatementContext, tid int64, ranges []*ranger.Range) *RequestBuilder { - if builder.err == nil { - builder.Request.KeyRanges, builder.err = CommonHandleRangesToKVRanges(sc, []int64{tid}, ranges) - } - return builder +func (builder *RequestBuilder) SetHandleRanges(sc *stmtctx.StatementContext, tid int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { + return builder.SetHandleRangesForTables(sc, []int64{tid}, isCommonHandle, ranges, fb) } -// SetCommonHandleRangesForTables sets "KeyRanges" for "kv.Request" by converting common handle range +// SetHandleRangesForTables sets "KeyRanges" for "kv.Request" by converting table handle range // "ranges" to "KeyRanges" firstly for multiple tables. -func (builder *RequestBuilder) SetCommonHandleRangesForTables(sc *stmtctx.StatementContext, tid []int64, ranges []*ranger.Range) *RequestBuilder { +func (builder *RequestBuilder) SetHandleRangesForTables(sc *stmtctx.StatementContext, tid []int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) *RequestBuilder { if builder.err == nil { - builder.Request.KeyRanges, builder.err = CommonHandleRangesToKVRanges(sc, tid, ranges) + builder.Request.KeyRanges, builder.err = TableHandleRangesToKVRanges(sc, tid, isCommonHandle, ranges, fb) } return builder } @@ -232,6 +235,16 @@ func (builder *RequestBuilder) SetFromSessionVars(sv *variable.SessionVars) *Req } else { builder.Request.SchemaVar = sv.TxnCtx.SchemaVersion } + builder.txnScope = sv.TxnCtx.TxnScope + builder.IsStaleness = sv.TxnCtx.IsStaleness + if builder.IsStaleness && builder.txnScope != oracle.GlobalTxnScope { + builder.MatchStoreLabels = []*metapb.StoreLabel{ + { + Key: placement.DCLabelKey, + Value: builder.txnScope, + }, + } + } return builder } @@ -247,13 +260,82 @@ func (builder *RequestBuilder) SetConcurrency(concurrency int) *RequestBuilder { return builder } +// SetTiDBServerID sets "TiDBServerID" for "kv.Request" +// ServerID is a unique id of TiDB instance among the cluster. +// See https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-01-global-kill.md +func (builder *RequestBuilder) SetTiDBServerID(serverID uint64) *RequestBuilder { + builder.Request.TiDBServerID = serverID + return builder +} + +// SetFromInfoSchema sets the following fields from infoSchema: +// "bundles" +func (builder *RequestBuilder) SetFromInfoSchema(is infoschema.InfoSchema) *RequestBuilder { + if is == nil { + return builder + } + builder.is = is + return builder +} + +func (builder *RequestBuilder) verifyTxnScope() error { + if builder.txnScope == "" { + builder.txnScope = oracle.GlobalTxnScope + } + if builder.txnScope == oracle.GlobalTxnScope || builder.is == nil { + return nil + } + visitPhysicalTableID := make(map[int64]struct{}) + for _, keyRange := range builder.Request.KeyRanges { + tableID := tablecodec.DecodeTableID(keyRange.StartKey) + if tableID > 0 { + visitPhysicalTableID[tableID] = struct{}{} + } else { + return errors.New("requestBuilder can't decode tableID from keyRange") + } + } + + for phyTableID := range visitPhysicalTableID { + valid := VerifyTxnScope(builder.txnScope, phyTableID, builder.is) + if !valid { + var tblName string + var partName string + tblInfo, _, partInfo := builder.is.FindTableByPartitionID(phyTableID) + if tblInfo != nil && partInfo != nil { + tblName = tblInfo.Meta().Name.String() + partName = partInfo.Name.String() + } else { + tblInfo, _ = builder.is.TableByID(phyTableID) + tblName = tblInfo.Meta().Name.String() + } + err := fmt.Errorf("table %v can not be read by %v txn_scope", tblName, builder.txnScope) + if len(partName) > 0 { + err = fmt.Errorf("table %v's partition %v can not be read by %v txn_scope", + tblName, partName, builder.txnScope) + } + return err + } + } + return nil +} + +// TableHandleRangesToKVRanges convert table handle ranges to "KeyRanges" for multiple tables. +func TableHandleRangesToKVRanges(sc *stmtctx.StatementContext, tid []int64, isCommonHandle bool, ranges []*ranger.Range, fb *statistics.QueryFeedback) ([]kv.KeyRange, error) { + if !isCommonHandle { + return tablesRangesToKVRanges(tid, ranges, fb), nil + } + return CommonHandleRangesToKVRanges(sc, tid, ranges) +} + // TableRangesToKVRanges converts table ranges to "KeyRange". +// Note this function should not be exported, but currently +// br refers to it, so have to keep it. func TableRangesToKVRanges(tid int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { - return TablesRangesToKVRanges([]int64{tid}, ranges, fb) + return tablesRangesToKVRanges([]int64{tid}, ranges, fb) } -// TablesRangesToKVRanges converts table ranges to "KeyRange". -func TablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { +// tablesRangesToKVRanges converts table ranges to "KeyRange". +func tablesRangesToKVRanges(tids []int64, ranges []*ranger.Range, fb *statistics.QueryFeedback) []kv.KeyRange { if fb == nil || fb.Hist == nil { return tableRangesToKVRangesWithoutSplit(tids, ranges) } @@ -310,6 +392,64 @@ func encodeHandleKey(ran *ranger.Range) ([]byte, []byte) { return low, high } +// SplitRangesBySign split the ranges into two parts: +// 1. signedRanges is less or equal than maxInt64 +// 2. unsignedRanges is greater than maxInt64 +// We do that because the encoding of tikv key takes every key as a int. As a result MaxUInt64 is indeed +// small than zero. So we must +// 1. pick the range that straddles the MaxInt64 +// 2. split that range into two parts : smaller than max int64 and greater than it. +// 3. if the ascent order is required, return signed first, vice versa. +// 4. if no order is required, is better to return the unsigned one. That's because it's the normal order +// of tikv scan. +func SplitRangesBySign(ranges []*ranger.Range, keepOrder bool, desc bool, isCommonHandle bool) ([]*ranger.Range, []*ranger.Range) { + if isCommonHandle || len(ranges) == 0 || ranges[0].LowVal[0].Kind() == types.KindInt64 { + return ranges, nil + } + idx := sort.Search(len(ranges), func(i int) bool { return ranges[i].HighVal[0].GetUint64() > math.MaxInt64 }) + if idx == len(ranges) { + return ranges, nil + } + if ranges[idx].LowVal[0].GetUint64() > math.MaxInt64 { + signedRanges := ranges[0:idx] + unsignedRanges := ranges[idx:] + if !keepOrder { + return append(unsignedRanges, signedRanges...), nil + } + if desc { + return unsignedRanges, signedRanges + } + return signedRanges, unsignedRanges + } + signedRanges := make([]*ranger.Range, 0, idx+1) + unsignedRanges := make([]*ranger.Range, 0, len(ranges)-idx) + signedRanges = append(signedRanges, ranges[0:idx]...) + if !(ranges[idx].LowVal[0].GetUint64() == math.MaxInt64 && ranges[idx].LowExclude) { + signedRanges = append(signedRanges, &ranger.Range{ + LowVal: ranges[idx].LowVal, + LowExclude: ranges[idx].LowExclude, + HighVal: []types.Datum{types.NewUintDatum(math.MaxInt64)}, + }) + } + if !(ranges[idx].HighVal[0].GetUint64() == math.MaxInt64+1 && ranges[idx].HighExclude) { + unsignedRanges = append(unsignedRanges, &ranger.Range{ + LowVal: []types.Datum{types.NewUintDatum(math.MaxInt64 + 1)}, + HighVal: ranges[idx].HighVal, + HighExclude: ranges[idx].HighExclude, + }) + } + if idx < len(ranges) { + unsignedRanges = append(unsignedRanges, ranges[idx+1:]...) + } + if !keepOrder { + return append(unsignedRanges, signedRanges...), nil + } + if desc { + return unsignedRanges, signedRanges + } + return signedRanges, unsignedRanges +} + // TableHandlesToKVRanges converts sorted handle to kv ranges. // For continuous handles, we should merge them to a single key range. func TableHandlesToKVRanges(tid int64, handles []kv.Handle) []kv.KeyRange { @@ -454,6 +594,25 @@ func CommonHandleRangesToKVRanges(sc *stmtctx.StatementContext, tids []int64, ra return krs, nil } +// VerifyTxnScope verify whether the txnScope and visited physical table break the leader rule's dcLocation. +func VerifyTxnScope(txnScope string, physicalTableID int64, is infoschema.InfoSchema) bool { + if txnScope == "" || txnScope == oracle.GlobalTxnScope { + return true + } + bundle, ok := is.BundleByName(placement.GroupID(physicalTableID)) + if !ok { + return true + } + leaderDC, ok := placement.GetLeaderDCByBundle(bundle, placement.DCLabelKey) + if !ok { + return true + } + if leaderDC != txnScope { + return false + } + return true +} + func indexRangesToKVWithoutSplit(sc *stmtctx.StatementContext, tids []int64, idxID int64, ranges []*ranger.Range) ([]kv.KeyRange, error) { krs := make([]kv.KeyRange, 0, len(ranges)) for _, ran := range ranges { diff --git a/distsql/request_builder_test.go b/distsql/request_builder_test.go index 9387f1ef68b34..2445de54cb82c 100644 --- a/distsql/request_builder_test.go +++ b/distsql/request_builder_test.go @@ -43,7 +43,10 @@ var _ = Suite(&testSuite{}) func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } TestingT(t) } @@ -278,7 +281,7 @@ func (s *testSuite) TestRequestBuilder1(c *C) { }, } - actual, err := (&RequestBuilder{}).SetTableRanges(12, ranges, nil). + actual, err := (&RequestBuilder{}).SetHandleRanges(nil, 12, false, ranges, nil). SetDAGRequest(&tipb.DAGRequest{}). SetDesc(false). SetKeepOrder(false). @@ -573,32 +576,38 @@ func (s *testSuite) TestRequestBuilder6(c *C) { } func (s *testSuite) TestRequestBuilder7(c *C) { - vars := variable.NewSessionVars() - vars.SetReplicaRead(kv.ReplicaReadFollower) + for _, replicaRead := range []kv.ReplicaReadType{ + kv.ReplicaReadLeader, + kv.ReplicaReadFollower, + kv.ReplicaReadMixed, + } { + vars := variable.NewSessionVars() + vars.SetReplicaRead(replicaRead) - concurrency := 10 + concurrency := 10 - actual, err := (&RequestBuilder{}). - SetFromSessionVars(vars). - SetConcurrency(concurrency). - Build() - c.Assert(err, IsNil) + actual, err := (&RequestBuilder{}). + SetFromSessionVars(vars). + SetConcurrency(concurrency). + Build() + c.Assert(err, IsNil) - expect := &kv.Request{ - Tp: 0, - StartTs: 0x0, - KeepOrder: false, - Desc: false, - Concurrency: concurrency, - IsolationLevel: 0, - Priority: 0, - NotFillCache: false, - SyncLog: false, - Streaming: false, - ReplicaRead: kv.ReplicaReadFollower, - } + expect := &kv.Request{ + Tp: 0, + StartTs: 0x0, + KeepOrder: false, + Desc: false, + Concurrency: concurrency, + IsolationLevel: 0, + Priority: 0, + NotFillCache: false, + SyncLog: false, + Streaming: false, + ReplicaRead: replicaRead, + } - c.Assert(actual, DeepEquals, expect) + c.Assert(actual, DeepEquals, expect) + } } func (s *testSuite) TestRequestBuilder8(c *C) { diff --git a/distsql/select_result.go b/distsql/select_result.go index f9840aed95f4c..ad95451040052 100644 --- a/distsql/select_result.go +++ b/distsql/select_result.go @@ -24,16 +24,19 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" @@ -42,8 +45,10 @@ import ( ) var ( - errQueryInterrupted = terror.ClassExecutor.NewStd(errno.ErrQueryInterrupted) + errQueryInterrupted = dbterror.ClassExecutor.NewStd(errno.ErrQueryInterrupted) +) +var ( coprCacheHistogramHit = metrics.DistSQLCoprCacheHistogram.WithLabelValues("hit") coprCacheHistogramMiss = metrics.DistSQLCoprCacheHistogram.WithLabelValues("miss") ) @@ -88,6 +93,8 @@ type selectResult struct { copPlanIDs []int rootPlanID int + storeType kv.StoreType + fetchDuration time.Duration durationReported bool memTracker *memory.Tracker @@ -132,7 +139,7 @@ func (r *selectResult) fetchResp(ctx context.Context) error { atomic.StoreInt64(&r.selectRespSize, respSize) r.memConsume(respSize) if err := r.selectResp.Error; err != nil { - return terror.ClassTiKV.Synthesize(terror.ErrCode(err.Code), err.Msg) + return dbterror.ClassTiKV.Synthesize(terror.ErrCode(err.Code), err.Msg) } sessVars := r.ctx.GetSessionVars() if atomic.LoadUint32(&sessVars.Killed) == 1 { @@ -140,9 +147,11 @@ func (r *selectResult) fetchResp(ctx context.Context) error { } sc := sessVars.StmtCtx for _, warning := range r.selectResp.Warnings { - sc.AppendWarning(terror.ClassTiKV.Synthesize(terror.ErrCode(warning.Code), warning.Msg)) + sc.AppendWarning(dbterror.ClassTiKV.Synthesize(terror.ErrCode(warning.Code), warning.Msg)) + } + if r.feedback != nil { + r.feedback.Update(resultSubset.GetStartKey(), r.selectResp.OutputCounts, r.selectResp.Ndvs) } - r.feedback.Update(resultSubset.GetStartKey(), r.selectResp.OutputCounts) r.partialCount++ hasStats, ok := resultSubset.(CopRuntimeStats) @@ -253,7 +262,7 @@ func (r *selectResult) readFromChunk(ctx context.Context, chk *chunk.Chunk) erro return nil } -func (r *selectResult) updateCopRuntimeStats(ctx context.Context, copStats *tikv.CopRuntimeStats, respTime time.Duration) { +func (r *selectResult) updateCopRuntimeStats(ctx context.Context, copStats *copr.CopRuntimeStats, respTime time.Duration) { callee := copStats.CalleeAddress if r.rootPlanID <= 0 || r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl == nil || callee == "" { return @@ -275,12 +284,16 @@ func (r *selectResult) updateCopRuntimeStats(ctx context.Context, copStats *tikv } r.stats.mergeCopRuntimeStats(copStats, respTime) + if copStats.ScanDetail != nil && len(r.copPlanIDs) > 0 { + r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RecordScanDetail(r.copPlanIDs[len(r.copPlanIDs)-1], r.storeType.Name(), copStats.ScanDetail) + } + for i, detail := range r.selectResp.GetExecutionSummaries() { if detail != nil && detail.TimeProcessedNs != nil && detail.NumProducedRows != nil && detail.NumIterations != nil { planID := r.copPlanIDs[i] r.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl. - RecordOneCopTask(planID, callee, detail) + RecordOneCopTask(planID, r.storeType.Name(), callee, detail) } } } @@ -322,7 +335,7 @@ func (r *selectResult) Close() error { // CopRuntimeStats is a interface uses to check whether the result has cop runtime stats. type CopRuntimeStats interface { // GetCopRuntimeStats gets the cop runtime stats information. - GetCopRuntimeStats() *tikv.CopRuntimeStats + GetCopRuntimeStats() *copr.CopRuntimeStats } type selectResultRuntimeStats struct { @@ -335,15 +348,19 @@ type selectResultRuntimeStats struct { CoprCacheHitNum int64 } -func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *tikv.CopRuntimeStats, respTime time.Duration) { +func (s *selectResultRuntimeStats) mergeCopRuntimeStats(copStats *copr.CopRuntimeStats, respTime time.Duration) { s.copRespTime = append(s.copRespTime, respTime) - s.procKeys = append(s.procKeys, copStats.ProcessedKeys) + if copStats.ScanDetail != nil { + s.procKeys = append(s.procKeys, copStats.ScanDetail.ProcessedKeys) + } else { + s.procKeys = append(s.procKeys, 0) + } for k, v := range copStats.BackoffSleep { s.backoffSleep[k] += v } - s.totalProcessTime += copStats.ProcessTime - s.totalWaitTime += copStats.WaitTime + s.totalProcessTime += copStats.TimeDetail.ProcessTime + s.totalWaitTime += copStats.TimeDetail.WaitTime s.rpcStat.Merge(copStats.RegionRequestRuntimeStats) if copStats.CoprCacheHit { s.CoprCacheHitNum++ @@ -389,10 +406,11 @@ func (s *selectResultRuntimeStats) Merge(rs execdetails.RuntimeStats) { func (s *selectResultRuntimeStats) String() string { buf := bytes.NewBuffer(nil) + rpcStat := s.rpcStat if len(s.copRespTime) > 0 { size := len(s.copRespTime) if size == 1 { - buf.WriteString(fmt.Sprintf("cop_task: {num: 1, max:%v, proc_keys: %v", s.copRespTime[0], s.procKeys[0])) + buf.WriteString(fmt.Sprintf("cop_task: {num: 1, max: %v, proc_keys: %v", execdetails.FormatDuration(s.copRespTime[0]), s.procKeys[0])) } else { sort.Slice(s.copRespTime, func(i, j int) bool { return s.copRespTime[i] < s.copRespTime[j] @@ -410,36 +428,43 @@ func (s *selectResultRuntimeStats) String() string { }) keyMax := s.procKeys[size-1] keyP95 := s.procKeys[size*19/20] - buf.WriteString(fmt.Sprintf("cop_task: {num: %v, max: %v, min: %v, avg: %v, p95: %v", size, vMax, vMin, vAvg, vP95)) + buf.WriteString(fmt.Sprintf("cop_task: {num: %v, max: %v, min: %v, avg: %v, p95: %v", size, + execdetails.FormatDuration(vMax), execdetails.FormatDuration(vMin), + execdetails.FormatDuration(vAvg), execdetails.FormatDuration(vP95))) if keyMax > 0 { buf.WriteString(", max_proc_keys: ") buf.WriteString(strconv.FormatInt(keyMax, 10)) buf.WriteString(", p95_proc_keys: ") buf.WriteString(strconv.FormatInt(keyP95, 10)) } - if s.totalProcessTime > 0 { - buf.WriteString(", tot_proc: ") - buf.WriteString(s.totalProcessTime.String()) - if s.totalWaitTime > 0 { - buf.WriteString(", tot_wait: ") - buf.WriteString(s.totalWaitTime.String()) - } + } + if s.totalProcessTime > 0 { + buf.WriteString(", tot_proc: ") + buf.WriteString(execdetails.FormatDuration(s.totalProcessTime)) + if s.totalWaitTime > 0 { + buf.WriteString(", tot_wait: ") + buf.WriteString(execdetails.FormatDuration(s.totalWaitTime)) } } - copRPC := s.rpcStat.Stats[tikvrpc.CmdCop] + copRPC := rpcStat.Stats[tikvrpc.CmdCop] if copRPC != nil && copRPC.Count > 0 { - delete(s.rpcStat.Stats, tikvrpc.CmdCop) + rpcStat = rpcStat.Clone() + delete(rpcStat.Stats, tikvrpc.CmdCop) buf.WriteString(", rpc_num: ") buf.WriteString(strconv.FormatInt(copRPC.Count, 10)) buf.WriteString(", rpc_time: ") - buf.WriteString(time.Duration(copRPC.Consume).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(copRPC.Consume))) + } + if config.GetGlobalConfig().TiKVClient.CoprCache.CapacityMB > 0 { + buf.WriteString(fmt.Sprintf(", copr_cache_hit_ratio: %v", + strconv.FormatFloat(float64(s.CoprCacheHitNum)/float64(len(s.copRespTime)), 'f', 2, 64))) + } else { + buf.WriteString(", copr_cache: disabled") } - buf.WriteString(fmt.Sprintf(", copr_cache_hit_ratio: %v", - strconv.FormatFloat(float64(s.CoprCacheHitNum)/float64(len(s.copRespTime)), 'f', 2, 64))) buf.WriteString("}") } - rpcStatsStr := s.rpcStat.String() + rpcStatsStr := rpcStat.String() if len(rpcStatsStr) > 0 { buf.WriteString(", ") buf.WriteString(rpcStatsStr) @@ -453,7 +478,7 @@ func (s *selectResultRuntimeStats) String() string { buf.WriteString(", ") } idx++ - buf.WriteString(fmt.Sprintf("%s: %s", k, d.String())) + buf.WriteString(fmt.Sprintf("%s: %s", k, execdetails.FormatDuration(d))) } buf.WriteString("}") } diff --git a/distsql/select_result_test.go b/distsql/select_result_test.go index 469d687517752..38a57ebe94a8e 100644 --- a/distsql/select_result_test.go +++ b/distsql/select_result_test.go @@ -17,8 +17,9 @@ import ( "context" . "github.com/pingcap/check" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tipb/go-tipb" @@ -27,10 +28,10 @@ import ( func (s *testSuite) TestUpdateCopRuntimeStats(c *C) { ctx := mock.NewContext() ctx.GetSessionVars().StmtCtx = new(stmtctx.StatementContext) - sr := selectResult{ctx: ctx} + sr := selectResult{ctx: ctx, storeType: kv.TiKV} c.Assert(ctx.GetSessionVars().StmtCtx.RuntimeStatsColl, IsNil) sr.rootPlanID = 1234 - sr.updateCopRuntimeStats(context.Background(), &tikv.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "a"}}, 0) + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "a"}}, 0) ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = execdetails.NewRuntimeStatsColl() t := uint64(1) @@ -40,12 +41,12 @@ func (s *testSuite) TestUpdateCopRuntimeStats(c *C) { }, } c.Assert(len(sr.selectResp.GetExecutionSummaries()) != len(sr.copPlanIDs), IsTrue) - sr.updateCopRuntimeStats(context.Background(), &tikv.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) c.Assert(ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.ExistsCopStats(1234), IsFalse) sr.copPlanIDs = []int{sr.rootPlanID} c.Assert(ctx.GetSessionVars().StmtCtx.RuntimeStatsColl, NotNil) c.Assert(len(sr.selectResp.GetExecutionSummaries()), Equals, len(sr.copPlanIDs)) - sr.updateCopRuntimeStats(context.Background(), &tikv.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) - c.Assert(ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetCopStats(1234).String(), Equals, "time:1ns, loops:1") + sr.updateCopRuntimeStats(context.Background(), &copr.CopRuntimeStats{ExecDetails: execdetails.ExecDetails{CalleeAddress: "callee"}}, 0) + c.Assert(ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.GetOrCreateCopStats(1234, "tikv").String(), Equals, "tikv_task:{time:1ns, loops:1}, scan_detail: {total_process_keys: 0, total_keys: 0, rocksdb: {delete_skipped_count: 0, key_skipped_count: 0, block: {cache_hit_count: 0, read_count: 0, read_byte: 0 Bytes}}}") } diff --git a/distsql/stream.go b/distsql/stream.go index f1817084cdf44..912f4d5bfd09c 100644 --- a/distsql/stream.go +++ b/distsql/stream.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tipb/go-tipb" ) @@ -97,14 +98,14 @@ func (r *streamResult) readDataFromResponse(ctx context.Context, resp kv.Respons return false, errors.Errorf("stream response error: [%d]%s\n", stream.Error.Code, stream.Error.Msg) } for _, warning := range stream.Warnings { - r.ctx.GetSessionVars().StmtCtx.AppendWarning(terror.ClassTiKV.Synthesize(terror.ErrCode(warning.Code), warning.Msg)) + r.ctx.GetSessionVars().StmtCtx.AppendWarning(dbterror.ClassTiKV.Synthesize(terror.ErrCode(warning.Code), warning.Msg)) } err = result.Unmarshal(stream.Data) if err != nil { return false, errors.Trace(err) } - r.feedback.Update(resultSubset.GetStartKey(), stream.OutputCounts) + r.feedback.Update(resultSubset.GetStartKey(), stream.OutputCounts, stream.Ndvs) r.partialCount++ hasStats, ok := resultSubset.(CopRuntimeStats) diff --git a/docs/design/2018-10-08-online-DDL.md b/docs/design/2018-10-08-online-DDL.md index 732ced186bfc8..87f746a0d0796 100644 --- a/docs/design/2018-10-08-online-DDL.md +++ b/docs/design/2018-10-08-online-DDL.md @@ -73,4 +73,4 @@ This operation requires writing the corresponding column data in the table to th To reduce the impact on other read and write operations, its default priority is low. ## Compatibility -About specific compatibility, you can view [MySQL’s compatibility](https://github.com/pingcap/docs/blob/master/sql/mysql-compatibility.md#ddl). \ No newline at end of file +About specific compatibility, you can view [MySQL’s compatibility](https://github.com/pingcap/docs/blob/master/mysql-compatibility.md#ddl). diff --git a/docs/design/2019-11-18-tidb-with-wasm.md b/docs/design/2019-11-18-tidb-with-wasm.md index 34a0a78f7d481..edfc5284aff51 100644 --- a/docs/design/2019-11-18-tidb-with-wasm.md +++ b/docs/design/2019-11-18-tidb-with-wasm.md @@ -34,7 +34,7 @@ a corresponding assembly language, and an interface to interact with the hosting main goal is to enable applications with high performance requirements to run on web pages. Of course, its instruction format is also designed to be able to run on other platforms. -The WebAssembly virtual machine has better performance than JavaScript because WebAsembly's binary +The WebAssembly virtual machine has better performance than JavaScript because WebAssembly's binary format file has a more compact instruction structure, similar to ELF files (the most commonly used binary instruction format on Unix systems, which is parsed by the loader and loaded into memory for execution). WebAssembly is compiled into memory for execution by a specific runtime. The most common @@ -100,13 +100,13 @@ the file name format is: - *_GOARCH - *_GOOS_GOARCH -So the only thing we need do is to add *_wasm.go, and mock an implemention based on the implemention for other platforms. +So the only thing we need do is to add *_wasm.go, and mock an implementation based on the implementation for other platforms. For case 2, the solution is same as case 1, because we can modify the third-party code directly. For case 3 and case 4, we can’t modify the code directly. There are 3 solutions: -- Open issues for these repos, and ask their owners to support WebAseembly +- Open issues for these repos, and ask their owners to support WebAssembly - Advantage: we don’t need to do it ourselves, and we can keep up with upstream - Disadvantage: some repos have been archived, and some are no longer maintained, nobody will reply our issue - Clone these repos to pingcap org and modify their code, then switch the reference of TiDB to the new repos. diff --git a/docs/design/2020-01-24-collations.md b/docs/design/2020-01-24-collations.md new file mode 100644 index 0000000000000..73ddc6b5586e0 --- /dev/null +++ b/docs/design/2020-01-24-collations.md @@ -0,0 +1,285 @@ +# Proposal: Collations in TiDB + +- Author(s): [Wang Cong](http://github.com/bb7133), [Kolbe Kegel](http://github.com/kolbe) +- Last updated: 2020-02-09 +- Discussion at: https://github.com/pingcap/tidb/issues/14573 + +## Abstract + +For now, TiDB only supports binary collations, this proposal is aimed to provide full collations support for TiDB. + +## Background + +### Collations + +The term "Collation" is defined as the process and function of determining the sorting order of strings of characters, it varies according to language and culture. + +Collations are useful when comparing and sorting data. Different languages have different rules for how to order data and how to compare characters. For example, in Swedish, "ö" and "o" are in fact different letters, so they should not be equivalent in a query (`SELECT ... WHERE col LIKE '%o%'`); additionally, Swedish sorting rules place "ö" after "z" in the alphabet. Meanwhile, in German, "ö" is officially considered a separate letter from "o", but it can be sorted along with "o", expanded to sort along with "oe", or sort at the end of the alphabet, depending on the context (dictionary, phonebook, etc.). In French, diacritics never affect comparison or sorting. The issue becomes even more complex with Unicode and certain Unicode encodings (especially UTF-8) where the same logical character can be represented in many different ways, using a variable number of bytes. For example, "ö" in UTF-8 is represented by the byte sequence C3B6, but it can also be represented using the "combining diaeresis" as 6FCC88. These should compare equivalently when using a multibyte-aware collation. Implementing this functionality as far down as possible in the database reduces the number of rows that must be shipped around. + +### Current collations in MySQL + +In MySQL, collation is treated as an attribute of the character set: for each character set has options for different collations(and one of them is the default collation), every collation belongs to one character set only. The effects of collation are: + + * It defines a total order on all characters of a character set. + * It determines if padding is applied when comparing two strings. + * It describes comparisons of logically identical but physically different byte sequences. +Some examples of the effects of collation can be found in [this part](https://dev.mysql.com/doc/refman/8.0/en/charset-collation-effect.html) of the MySQL Manual and [this webpage](http://demo.icu-project.org/icu-bin/locexp?_=en_US&x=col). + +Several collation implementations are described in [this part](https://dev.mysql.com/doc/refman/8.0/en/charset-collation-implementations.html) of MySQL Manual: + + * Per-character table lookup for 8-bit character sets, for example: `latin1_swedish_ci`. + * Per-character table lookup for multibyte character sets, including some of the Unicode collations, for example: `utf8mb4_general_ci`. + - Full UCA implementation for some Unicode collations, for example: `utf8mb4_0900_ai_ci`. + +### Current collations in TiDB + +For all character sets that are supported, TiDB accepts all of their collations by syntax and stores them as a part of metadata. The real collate-related behaviors are always in binary. For example, + +``` +tidb> create table t(a varchar(20) charset utf8mb4 collate utf8mb4_general_ci key); +Query OK, 0 rows affected +tidb> show create table t; ++-------+-------------------------------------------------------------+ +| Table | Create Table | ++-------+-------------------------------------------------------------+ +| t | CREATE TABLE `t` ( | +| | `a` varchar(20) COLLATE utf8mb4_general_ci NOT NULL, | +| | PRIMARY KEY (`a`) | +| | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin | ++-------+-------------------------------------------------------------+ +1 row in set +tidb> insert into t values ('A'); +Query OK, 1 row affected +tidb> insert into t values ('a'); +Query OK, 1 row affected // Should report error "Duplicate entry 'a'" +``` +In the case above, the user creates a column with a case-insensitive collation `utf8mb4_general_ci`. Since the 'real' collation of TiDB is always `utf8mb4_bin`/`binary`, inserting data into the primary key with "A" and "a" does not lead to an error. + +What's more, the collation `utf8mb4_bin` in MySQL is defined with attribute `PAD SPACE`, that is, trailing spaces are ignored when comparison. Currently `utf8mb4_bin` in TiDB is actually with attribute `NO PAD`: + +``` +tidb> create table t1(a varchar(20) charset utf8mb4 collate utf8mb4_bin key); +Query OK, 0 rows affected +tidb> insert into t1 values ('a') +Query OK, 1 row affected +tidb> insert into t1 values ('a '); +Query OK, 1 row affected // Should report error "Duplicate entry 'a '" +``` + +### Changes to make + +Before diving into the details, we should notice that ALL strings in MySQL(and TiDB as well) are with implicit collations, if they're not explicitly specified. So, if we aim to update the collations in TiDB, codes related to strings comparison/lookup should be checked: + + - Encoding/Decoding: update codec related functions in `codec`/`tablecodec` package. + - SQL Runtime: + + implement `WEIGHT_STRING()` expression, which returns the sorting hexadecimal value(or `sortKeys`) for a string. This expression will be helpful for debugging collations. + + update like/regex/string comparison related functions in `expression` package. + + update the comparisons logic in Join/Aggregation executors in `executor` package. + + update the codes in `UnionScan`(the internal buffer of transaction). + - SQL Optimizer: the optimizer may need to be alignd with the encoding changes in `planner` package. + - DDL/Schema: check if the new collation is supported according to the versions of tables/columns, the related codes are in `ddl` and `infoschema` package. + - Misc + + update string comparison related functions in `util` package. + + check if range functions defined in table partitions work with collations. + +## Proposal + +### Collate Interface + +There are bascially two functions needed for the collate comparison: + + * Function that is used to compare two strings according to the given collation. + * Function that is used to make a memory-comparable `sortKey` corresponding to the given string. + +The interface can be defined as following: + +``` +type CharsetCollation interface { + // Compare returns an integer comparing the two byte slices. The result will be 0 if a == b, -1 if a < b, and +1 if a > b. + Compare(a, b []byte) (int, error) + // Key returns the collation key for str, the returned slice will point to an allocation in Buffer. + Key(buf *Buffer, str []byte) ([]byte, error) +} +``` +The interface is quite similar to the Go [collate package](https://godoc.org/golang.org/x/text/collate). + +### Row Format + +The encoding layout of TiDB has been described in our [previous article](https://pingcap.com/blog/2017-07-11-tidbinternal2/#map). The row format should be changed to make it memory comparable, this is important to the index lookup. Basic principle is that all keys encoded for strings should use the `sortKeys` result from `Key()`/`KeyFromString()` function. However, most of the `sortKeys` calculations are not reversible. + + * For table data, encodings stay unchanged. All strings are compared after decoding with the `Compare()` function. + * For table indices, we replace current `ColumnValue` with `sortKey` and encode the `ColumnValue` to the value,: + - For unique indices: + ``` + Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKey + Value: rowID_indexedColumnsValue + ``` + - For non-unique indices: + ``` + Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKeys_rowID + Value: indexedColumnsValue + ``` + +Pros: Value of the index can be recovered from `ColumnValue` in value. It is able to scan just the index in order to upgrade the on-disk storage to fix bugs in collations, because it has the `sortKey` and the value in the index. + +Cons: The size of index value on string column with new collations is doubled(we need to write both `sortKey` and `indexedColumnsValue`, their sizes are equal for most of the collations). + +#### Rejected Alternative + +A possible alternative option was considered as following: + + * For table data, encodings stay unchanged. + * For table indices, we replace current `ColumnValue` with `sortKey` without additional change: + - For unique indices: + ``` + Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKey + Value: rowID + ``` + - For non-unique indices: + ``` + Key: tablePrefix{tableID}_indexPrefixSep{indexID}_sortKeys_rowID + Value: null + ``` + +Pros: + The current encoding layout keeps unchanged. + +Cons: + Since index value can not be recovered from `sortKey`, extra table lookup is needed for current index-only queries, this may lead to performance regressions and the "covering index" can not work. The extra table lookup also requires corresponding changes to the TiDB optimizer. + +The reason to reject this option is, as a distributed system, the cost of potential table lookup high so that it should be avoided it as much as possible. What's more, adding a covering index is a common SQL optimization method for the DBAs: table lookup can not be avoided through covering index is counter-intuitive. + +## Compatibility + +### Compatibility with MySQL + +As stated before, MySQL has various different collation implementations. For example, in MySQL 5.7, the default collation of `utf8mb4` is `utf8mb4_general_ci`, which has two main flaws: + + * It only implement the `simple mappings` of UCA. + * It used a very old version of UCA. + +In MySQL 8, the default collation of `utf8mb4` has been changed to `utf8mb4_0900_ai_ci`, in which the Unicode version is upgraded to 9.0, with full UCA implementation. + +Should TiDB aim to support all collation of MySQL? + + * If TiDB supports the latest collations only(for example, support `utf8mb4_0900_ai_ci` only and treat `utf8mb4_general_ci` as one of its alias). This seems to be 'standard-correct' but may lead to potential compatibility issues. + * If TiDB supports all the collations, all of their implementations should be analyzed carefully. That is a lot of work. + +### Compatibility between TiDB versions + +In this proposal, both of the compatibility issues can be solved in the new version of TiDB, and with the help of the version of metadata in TiDB, we can always indicate if a collation is old(the "fake one") or new(the "real one"). However, here we propose several requirements below and careful considerations are needed to meet them as many as possible: + + 1. For an existing TiDB cluster, its behavior remains unchanged after upgrading to newer version + - a. After upgrade, the behavior of existing tables remains unchanged. + - b. After upgrade, the behavior of newly-created tables remains unchanged. + - c. If a TiDB cluster is replicating the data to a MySQL instance through Binlog, all replications remain unchanged. + 2. Users of MySQL who requires collations can move to TiDB without modifying their scripts/applications. + 3. Users of TiDB can distinguish the tables with old collation and new collations easily, if they both exist in a TiDB cluster. + 4. All replications/backups/recovers through TiDB tools like Binlog-related mechanism, CDC and BR should not encounter unexpected errors caused from the changes of collations in TiDB. For example, + - When using BR, if backup data from old cluster is applied to the new cluster, the new cluster should know that the data is binary collated without padding, or otherwise 'Duplicate entry' error may be reported for primary key/unique key columns. + - If we don't allow both old collations and new collations exist in a TiDB cluster(the Option 4, see below), trying to make replications/backup & recovery between old/new clusters will break this prerequisite. + +Based on the requirements listed above, the following behaviors are proposed: + +1. Only TiDB clusters that initially boostrapped with the new TiDB version are allowed to enable the new collations. For old TiDB clusters, everything remains unchanged after the upgrade. + +2. We can also provide a configuration entry for the users to choose between old/new collations when deploying the new clusters. + +3. Mark old collations with syntax comment. For a upgraded TiDB cluster, add comment like "`/* AS_BINARY_COLLATION */`" for the old collations; all collations with "`/* AS_BINARY_COLLATION */`" comment are treated as the old ones. + +Pros: Requirement 1 and 2 are met, requirement 3 can be met if we allow old/new collations exist in the same cluster in the future, since old collations are marked with syntax comment. + +Cons: Since existing TiDB cluster can't get new collations enabled, requirement 3 is eliminated; Requirement 4 is not met. + +#### Rejected Alternatives + +The main reason to reject those options are: new collations that are not exist in MySQL have to be added, which may be confusing to the users and potentially break the compatibility between TiDB and MySQL. + +##### Option 1 + +Add a series of new collatins named with the suffix "`_np_bin`"(meaning "NO PADDING BINARY"), for example, `utf8mb4_np_bin`. Such new collations don't exist in MySQL, but they're the "real ones" used by current TiDB. After upgrading to newer TiDB versions, all old collations are shown as "`_np_bin`", MySQL collations behave the same with MySQL. + +Pros: Requirement 1.a, 2, 3 and 4 are met. + +Cons: Requirement 1.b, 1.c are not met. + +##### Option 2 + +Keep all collations defined in TiDB as what they were, define a series of new collations that are actually compatible with MySQL collations. For example, we can create a new `tidb_utf8_mb4_general_ci` that is the same as `utf8mb4_general_ci` in MySQL. When TiDB users want the "real" collations, they can modify their `CREATE TABLE` statements to use the new ones. + +Pros: Requirement 1.a, 1.b and 3 are met. + +Cons: Requirement 1.c, 2 and 4 are not met, the namings are also confusing: collations that are named from MySQL are different from MySQL, but the ones named different from MySQL behave the same as MySQL. + +#### Bug-fixing + +We should also expect potential bugs in implementations of collations and get prepared for fixing them in the newer version of TiDB. However, this is not trivial since the collation affects the on-storage data, so a online data reorganization is required, which is a known limitation of TiDB. For now, another proposal is planning to support reorganizing data(the "online column type change"), we can expect it to be finished in the near future. Based on that, a possible solution for collation bug-fixing can be: + + * Store a new version for the collations in the metadata of the column, it can be named as "CollationVersion" just like the current [ColumnInfoVersion](https://github.com/pingcap/parser/blob/b27aebeca4ba3fd938900fb57c0ea45c55d3753a/model/model.go#L66). This version is used to tracking the on-storage data generated by the collation. + * When we want to fix the bugs, related column index can be reorganized by a TiDB-specific DDL SQL like `ALTER TABLE ... TIDB UPGRADE COLLATION`. When the job is done, collation version is updated to the latest one. + +## Implementation + +### Collations for 8-bit charsets + +The implementation can be simply per-character mapping, same as MySQL. + +### Collations for Unicode charsets + +The following features of the general collation algorithm will be supported: + + * Primary Weight i.e. character + * Secondary Weight i.e. accent + * Tertiary Weight i.e. case + * PAD / NOPAD + +All of them are supported by `text/collate` package of Go, so it is possible to map Go collations to some of UCA-based collations in MySQL like `utf8mb4_unicode_ci`/`utf8mb4_0900_ai_ci`, if we ignore the differences between UCA versions: current `text/collate` uses UCA version `6.2.0` and it is not changable. However, the collations in MySQL are with different UCA versions marked in the names, for example, `utf8mb4_0900_ai_ci` uses version `9.0`. + +For non-standard UCA implementations in MySQL, i.e. the `utf8mb4_general_ci`. The implementation depends on our choice to the [Compatibility with MySQL](#compatibility-with-mysql) chapter, if a 100% compatibility of `utf8mb4_general_ci` is chosen, we need to implement it by our hands. + +### Collations in TiKV + +For all collations supported by TiDB, they should be supported by TiKV as well so that the coprocessors can be pushed-down. Several libraries may be helpful for the work: + + * [Rust unicode_collation](https://docs.rs/unicode-collation/0.0.1/unicode_collation) + * [Rust servo/rust-icu](https://github.com/servo/rust-icu) + * [C++ std::collate](https://en.cppreference.com/w/cpp/locale/collate) + * [C/C++ ICU4C](https://unicode-org.github.io/icu-docs/apidoc/released/icu4c) + +The libraries above work for standard UCA only, for all other collations, implementations should be done from nothing. + +## Migration Plans + +The plan depends on the option chosen in [Compatibility](#compatibility) chapter. + + * For existing TiDB clusters with current binary collations, nothing need to be done if the users are happy with them. + * For the potential migrations from MySQL to TiDB: + - If the collations used in MySQL have been implemented by TiDB, users from MySQL do not need to care about the collations when mirgrating to TiDB except Compatibility Option 2, in which the those collations need to be updated to their corresponding names. + - If there are colltions that are not supported by TiDB yet, users may need to change the them to the supported ones and check if no constraint is broken after the change. The check can be done following the approach mentioned in [this article](https://mysqlserverteam.com/mysql-8-0-collations-migrating-from-older-collations). + +## Testing Plans + +Here lists possible tests that can be done: + + * The unit / integration tests corresponding to the updates in [Changes to make](#changes-to-make) + * The unit / integration tests corresponding to the [implementations](#implementation) + * The collations cases that ported from mysql-tests + * The copr-pushdown tests of TiDB/TiKV + +## Possible Future Works + +We have an opportunity to do a much better job than MySQL has done. + +A collation, logically, should not be a property of a character set. Since all character sets are subsets of Unicode, collations can apply to Unicode codepoints without needing to be tied to individual character sets. + +Further, a collation should not need to be a property of a column, it could rather be a property of an index, so that multiple collations can be defined for individual database objects. This would permit efficient querying of data by many different means. + +## Related issues + +- https://github.com/pingcap/tidb/issues/222 +- https://github.com/pingcap/tidb/issues/1161 +- https://github.com/pingcap/tidb/issues/3580 +- https://github.com/pingcap/tidb/issues/4353 +- https://github.com/pingcap/tidb/issues/7519 +- https://github.com/pingcap/tidb/issues/10192 + diff --git a/docs/design/2020-03-12-invisible-index.md b/docs/design/2020-03-12-invisible-index.md index e44cfcd07abfd..ef77b1ed0fefc 100644 --- a/docs/design/2020-03-12-invisible-index.md +++ b/docs/design/2020-03-12-invisible-index.md @@ -65,7 +65,7 @@ Another solution for implement invisible indexes is: Indicate invisibility by DD ## Compatibility and Migration Plan -This the a new feature and it's absolutly compatible with old TiDB versions, also, it does not impact any data migration. +This the a new feature and it's absolutely compatible with old TiDB versions, also, it does not impact any data migration. The syntax and functions are basically compatible with MySQL expect: When use invisible index in `SQL Hint`, and set `use_invisible_indexes = false`, MySQL allow use the invisible index. @@ -76,7 +76,7 @@ The syntax and functions are basically compatible with MySQL expect: - Add syntax support in parser - Add a new column `IS_VISIBLE` in `information_schema.statistics` - Add a new column `VISIBLE` in `SHOW INDEX FROM table` statement -- Show invisiable column infomations in `SHOW CREATE TABLE` statement +- Show invisible column information in `SHOW CREATE TABLE` statement - Add `use_invisible_indexes` in system variable `@@optimizer_switch` - Add new error message `ERROR 3522 (HY000): A primary key index cannot be invisible` - Ignore invisible index in optimizer and add unit tests diff --git a/docs/design/2020-05-08-standardize-error-codes-and-messages.md b/docs/design/2020-05-08-standardize-error-codes-and-messages.md index 67a1242d96f2b..42e227a311750 100644 --- a/docs/design/2020-05-08-standardize-error-codes-and-messages.md +++ b/docs/design/2020-05-08-standardize-error-codes-and-messages.md @@ -1,7 +1,7 @@ # Proposal: Standardize error codes and messages - Author(s): Joshua -- Last updated: July 22 +- Last updated: September 29 - Discussion at: https://docs.google.com/document/d/1beoa5xyuToboSx6e6J02tjLLX5SWzmqvqHuAPEk-I58/edit?usp=sharing ## Abstract @@ -23,14 +23,14 @@ In order to let TiUP know the the errors every component may throw, the componen keep a metafile in the code repository. The metafile should be a toml file which looks like: ```toml -[error.8005] +[8005] error = '''Write Conflict, txnStartTS is stale''' description = '''Transactions in TiDB encounter write conflicts.''' workaround = ''' Check whether `tidb_disable_txn_auto_retry` is set to `on`. If so, set it to `off`; if it is already `off`, increase the value of `tidb_retry_limit` until the error no longer occurs. ''' -[error.9005] +[9005] error = '''Region is unavailable''' description = ''' A certain Raft Group is not available, such as the number of replicas is not enough. @@ -135,7 +135,7 @@ Check the status, monitoring data and log of the TiKV server. As the syntax above, the 9005 block is the message part of 8005 block, so we expect it's result is the same as this toml: ```toml -[error.8005] +[8005] error = '''Write Conflict, txnStartTS is stale''' description = '''Transactions in TiDB encounter write conflicts.''' workaround = ''' @@ -169,7 +169,7 @@ In the discussion above, an error has at least 4 parts: Besides, we can append a optional tags field to it: ```toml -[error.9005] +[9005] error = "" description = "" workaround = "" diff --git a/docs/design/2020-05-11-heap-profile-record.md b/docs/design/2020-05-11-heap-profile-record.md index 0b5d2710cbc90..dc06b21ee665c 100644 --- a/docs/design/2020-05-11-heap-profile-record.md +++ b/docs/design/2020-05-11-heap-profile-record.md @@ -65,7 +65,7 @@ We can find that the `hash` (the key of cache) and the `element`(the value of th 3. we use [sizeof](https://github.com/templarbit/sizeof) (the result is similar, but lower, not exact) to calculate the size of each key and element is 80byte and 40byte. 4. As 2.28 MB (120 byte * 20000) is similar to the 2.55MB, we can ensure that the heap profile would reflect the heap usage of `SimpleLRUCache`. -## Compatibility and Mirgration Plan +## Compatibility and Migration Plan None diff --git a/docs/design/2020-06-01-global-kill.md b/docs/design/2020-06-01-global-kill.md new file mode 100644 index 0000000000000..61cc6b8504368 --- /dev/null +++ b/docs/design/2020-06-01-global-kill.md @@ -0,0 +1,73 @@ +# Global Kill + +- Author(s): [pingyu](https://github.com/pingyu) (Ping Yu) +- Last updated: 2020-10-25 +- Discussion at: https://github.com/pingcap/tidb/issues/8854 + +## Abstract + +This document introduces the design of global connection id, and the global `KILL ` based on it. + +## Background + +Currently connection ids are local to TiDB instances, which means that a `KILL x` must be directed to the correct instance, and can not safely be load balanced across the cluster, as discussed [here](https://github.com/pingcap/tidb/issues/8854). + +## Proposal + +To support "Global Kill", we need: +1. Global connection ids, which are unique among all TiDB instances. +2. Redirect `KILL x` to target TiDB instance, on which the connection `x` is running. +3. Support both 32 & 64 bits `connId`, to be compatible with legacy 32 bits clients. In this stage, we only design the 64 bits `connId`, and left a `markup` to distinguish between these two kinds. + +## Rationale + +#### 1. Structure of `connId` +##### 64 bits version +``` + 63 62 41 40 1 0 + +--+---------------------+--------------------------------------+------+ + | | serverId | local connId |markup| + |=0| (22b) | (40b) | =1 | + +--+---------------------+--------------------------------------+------+ +``` +##### 32 bits version +(To be discussed in another RFC) +``` + 31 1 0 + +-----------------------------+------+ + | ??? |markup| + | ??? | =0 | + +-----------------------------+------+ +``` + +#### 2. bit 63 +Bit 63 is always __ZERO__, making `connId` in range of non-negative int64, to be more friendly to exists codes, and some languages don't have primitive type `uint64`. + +#### 3. markup +- `markup == 0` indicates that the `connID` is just 32 bits long effectively, and high 32 bits should be all zeros. Compatible with legacy 32 bits clients. +- `markup == 1` indicates that the `connID` is 64 bits long. Incompatible with legacy 32 bits clients. +- `markup == 1` while __high 32 bits are zeros__, indicates that 32 bits truncation happens. See `Compatibility` section. + + +#### 4. serverId +`serverId` is selected RANDOMLY by each TiDB instance on startup, and the uniqueness is guaranteed by PD(etcd). `serverId` should be larger or equal to 1, to ensure that high 32 bits of `connId` is always non-zero, and make it possible to detect truncation. + +On failure (e.g. fail connecting to PD, or all `serverId` are unavailable), we block any new connection. + +`serverId` is kept by PD with a lease (defaults to 12 hours, long enough to avoid brutally killing any long-run SQL). If TiDB is disconnected to PD longer than half of the lease (defaults to 6 hours), all connections are killed, and no new connection is accepted, to avoid running with stale/incorrect `serverId`. On connection to PD restored, a new `serverId` is acquired before accepting new connection. + +On single TiDB instance without PD, a `serverId` of `1` is assigned. + +#### 5. local connId +`local connId` is allocated by each TiDB instance on establishing connections incrementally. + +Integer overflow is ignored at this stage, as `local connId` should be long enough. + +#### 6. global kill +On processing `KILL x` command, first extract `serverId` from `x`. Then if `serverId` aims to a remote TiDB instance, get the address from cluster info (see also [`CLUSTER_INFO`](https://docs.pingcap.com/tidb/stable/information-schema-cluster-info#cluster_info)), and redirect the command to it by "Coprocessor API" provided by the remote TiDB, along with the original user authentication. + +## Compatibility + +- Incompatible with legacy 32 bits clients. (According to some quick tests by now, MySQL client v8.0.19 supports `KILL` a connection with 64 bits `connId`, while `CTRL-C` does not, because it truncates the `connId` to 32 bits). A warning is set prompting that truncation happened, but user cannot see it, because `CTRL-C` is sent by a new connection in an instant. + +- [`KILL TIDB`](https://docs.pingcap.com/tidb/v4.0/sql-statement-kill) syntax and [`compatible-kill-query`](https://docs.pingcap.com/tidb/v4.0/tidb-configuration-file#compatible-kill-query) configuration item are deprecated. diff --git a/docs/design/2020-06-24-placement-rules-in-sql.md b/docs/design/2020-06-24-placement-rules-in-sql.md new file mode 100644 index 0000000000000..a07c7d5b5e171 --- /dev/null +++ b/docs/design/2020-06-24-placement-rules-in-sql.md @@ -0,0 +1,762 @@ +# Defining placement rules in SQL + +- Author(s): [djshow832](https://github.com/djshow832) (Ming Zhang) +- Last updated: 2020-06-24 +- Discussion at: https://docs.google.com/document/d/18Kdhi90dv33muF9k_VAIccNLeGf-DdQyUc8JlWF9Gok + +## Motivation + +TiDB supports placement rules, which can define the placement of data in a more flexible and more granular way. But it only provides configuration files to define them, and it’s complicated. + +This article proposes an approach to configure placement rules through DDL statements. TiDB server parses the statements and notify PD to perform the change. In this way, usability can be improved. + +The scenarios of defining placement rules in SQL include: + +- Place data across regions to improve access locality +- Add a TiFlash replica for a table +- Limit data within its national border to gaurantee data sovereignty +- Place latest data to SSD and history data to HDD +- Place the leader of hot data to a high-performance TiKV instance +- Increase the replica count of more important data +- Separate irrelevant data into different stores to improve availability + +## Define placement rules + +There are 3 kinds of operations on the placement: + +* ADD: Add more replicas for one role. +* ALTER: Override the replica configuration for one role. +* DROP: Remove the replica configuration for one role. + +They’re all achieved by executing `ALTER TABLE` statements. + +### Add placement rules + +Adding new replicas can be done by one or more `ADD PLACEMENT POLICY` clauses: + +```sql +ALTER TABLE table_name + ADD PLACEMENT POLICY CONSTRAINTS=constraints ROLE=role REPLICAS=replicas, + ... +``` + +This statement indicates TiDB to add replicas for all data of table `table_name`, including indexes. + +`ADD PLACEMENT POLICY` is just a part of alter options, just like `ADD COLUMN` or `ADD CONSTRAINT`. + +To define multiple roles at once, multiple `ADD PLACEMENT POLICY` clauses can appear in a single `ALTER TABLE` statement, even for the same Raft role. For example: + +```sql +ALTER TABLE table_name + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=leader REPLICAS=1, + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=follower REPLICAS=1 + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=gz]" ROLE=follower REPLICAS=1; +``` + +This statement indicates PD to schedule the leader to `sh`, add one follower to `sh` and one to `gz`. Note that as the leader can be only one, the first clause doesn't actually add a replica, so this statement adds 2 replicas. + +`ADD PLACEMENT POLICY` also supports adding TiFlash replicas for a table, as statement `ALTER TABLE table_name SET TIFLASH REPLICA count` does. For example: + +```sql +ALTER TABLE table_name + ADD PLACEMENT POLICY CONSTRAINTS="[+engine=tiflash]" ROLE=learner REPLICAS=1; +``` + +The only way to judge whether it’s adding a TiFlash replica is to check the label. If it contains `engine=tiflash`, then it’s adding or removing a TiFlash replica. This logic is conventional in PD for now. + +Placement rules must conform to Raft constraints. For example, an error should be reported when executing this statement: + +```sql +ALTER TABLE test + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=leader REPLICAS=2; +``` + +There can only be one leader, so `REPLICAS` must be 1 or omitted. But for other roles, `REPLICAS` must be specified. + +Besides, at most one role can be defined on the same object. If multiple rules are added on the same role, they will be combined to one rule. For example: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=voter REPLICAS=2, + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=2; +``` + +The same role `voter` is defined in 2 different rules, each of which adds 2 replicas. So it is equivalent to: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY CONSTRAINTS="{+zone=sh:2,+zone=bj:2}" ROLE=voter REPLICAS=4; +``` + +Note that as there may already exist 3 replicas by default, so it will be 7 replicas after executing this statement. So `ADD PLACEMENT POLICY` can be taken as a shortcut for adding replicas to a defined role. In the example above, it can be replaced by `ALTER PLACEMENT POLICY`. + +More details of `CONSTRAINTS` option is described in the "Constraints Configuration" section. + +`ADD PLACEMENT POLICY` is implemented by adding one or more placement rules in PD. The statement must wait until the PD returns a message. It can be cancelled by executing `ADMIN CANCEL DDL JOBS` statement. + +### Alter placement rules + +Altering current placement rules can be done by one or more `ALTER PLACEMENT POLICY` clauses: + +```sql +ALTER TABLE table_name + ALTER PLACEMENT POLICY CONSTRAINTS=constraints ROLE=role REPLICAS=replicas, + ... +``` + +This statement indicates TiDB to overwrite the current placement rule with the same `role`. It affects all data of table `table_name`, including indices. + +Assuming table `test` has 3 replicas by default, the default placement rule is equivalent to: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY ROLE=voter REPLICAS=3; +``` + +`CONSTRAINTS` is omitted here, because there is no label constraints on voters. + +Since at most one rule can be defined for each role, `ALTER PLACEMENT POLICY` will replace the existing rule with the same role. For example: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=voter REPLICAS=2, + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=2, + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=voter REPLICAS=3, + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3; +``` + +As all the rules are defined on the same role `voter`, the first 3 rules will be overwritten by the last one. So it is equivalent to: + +```sql +ALTER TABLE test + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3; +``` + +To add a prohibiting constraint to all the placement rules can be only achieved by overwriting all the rules. For example, assuming the original placement rules are: + +```sql +ALTER TABLE test + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3; + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=follower REPLICAS=2; +``` + +To prohibit all replicas from being placed on zone `gz`, then both the 2 rules should be overwritten: + +```sql +ALTER TABLE test + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj,-zone=gz]" ROLE=voter REPLICAS=3; + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh,-zone=gz]" ROLE=follower REPLICAS=2; +``` + +If no rule on a specified role is defined, `ALTER PLACEMENT POLICY` can be used to replace `ADD PLACEMENT POLICY`. In this way, it's more convenient to add replicas because users needn't check the existence of such a rule. For example, assuming the original placement rule is: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY ROLE=voter REPLICAS=3; +``` + +It's fine to execute this statement: + +```sql +ALTER TABLE test + ALTER PLACEMENT POLICY ROLE=follower REPLICAS=1; +``` + +It's equivalent to: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY ROLE=follower REPLICAS=1; +``` + +Similarly, `ALTER PLACEMENT POLICY` statements must wait until the PD returns a message. It is implemented by overwriting the current placement rule with a new one. + +### Drop placement rules + +Dropping the placement rule on a specified role can be achieved by a `DROP PLACEMENT POLICY` clause: + +```sql +ALTER TABLE table_name + DROP PLACEMENT POLICY ROLE=role, + ... +``` + +In the statement, only `ROLE` option is needed. It only drops the placement rule on `role`. The rule can be either defined on the object itself or inherited from its parent. For example, if a rule on table `t` is inherited from its database, it can also be dropped through this way. + +Dropping placement rules should also conform to Raft constraints. That is, there must be a leader after dropping. For example, if the original placement rule is: + +```sql +ALTER TABLE table_name + ALTER PLACEMENT POLICY ROLE=voter REPLICAS=3; +``` + +It will report an error when executing following statement: + +```sql +ALTER TABLE table_name + DROP PLACEMENT POLICY ROLE=voter; +``` + +No leader is left after dropping all the voters, so it's illegal. + +As leader must exist, it's not allowed to drop all the placement rules. Besides, if there are less than 2 followers left after dropping, a warning will be reported. + +However, resetting all the rules on an object may be useful. "Resetting" means to drop the placement rules defined on the object itself, and let the object follow all the rules of its parent. + +There is no shortcut to reset all the rules. It may help, but it makes the system more complicated. It will be reconsidered when it's really needed. + +Placement rules of indices and partitions can also be dropped in a similar grammar. The statement must wait until PD returns a message. + +### Constraints configuration + +`CONSTRAINTS` option in the `ADD PLACEMENT POLICY` or `ALTER PLACEMENT POLICY` clauses indicates the label constraints. Data must be placed on the stores whose labels conform to `CONSTRAINTS` constraints. If `CONSTRAINTS` is omitted, it means no label constraint is enforced, thus the replicas can be placed anywhere. + +Option `CONSTRAINTS` should be a string and in one of these formats: + +- List: `[{+|-}key=value,...]`, e.g. `[+zone=bj,-disk=hdd]` +- Dictionary: `{"{+|-}key=value,...":count,...}`, e.g. `{"+zone=bj,-disk=hdd":1, +zone=sh:2}` + +Prefix `+` indicates that data can only be placed on the stores whose labels contain such labels, and `-` indicates that data can’t be placed on the stores whose labels contain such labels. For example, `+zone=sh,+zone=bj` indicates to place data only in `sh` and `bj` zones. + +`key` here refers to the label name, and `value` is the label value. The label name should have already been defined in the store configurations. For example, assuming a store has following labels: + +```sql +[server] +labels = "zone=bj,rack=rack0,disk=hdd" +``` + +Then `+zone=bj` matches this store while `+disk=ssd` doesn't. + +In the dictionary format, `count` must be specified, which indicates the number of replicas placed on those stores. When the prefix is `-`, the `count` is still meaningful. + +For example, `CONSTRAINTS="{+zone=sh:1,-zone=bj:2}"` indicates to place 1 replica in `sh`, 2 replicas in anywhere but `bj`. + +In the list format, `count` is not specified. The number of replicas for each constraint is not limited, but the total number of replicas should still conform to the `REPLICAS` option. + +For example, `CONSTRAINTS="[+zone=sh,+zone=bj]" REPLICAS=3` indicates to place 3 repicas on either `sh` or `bj`. There may be 2 replicas on `sh` and 1 in `bj`, or 2 in `bj` and 1 in `sh`. It's up to PD. + +Label constraints can be implemented by defining `label_constraints` field in PD placement rule configuration. `+` and `-` correspond to property `op`. Specifically, `+` is equivalent to `in` and `-` is equivalent to `notIn`. + +For example, `+zone=sh,+zone=bj,-disk=hdd` is equivalent to: + +``` +"label_constraints": [ + {"key": "zone", "op": "in", "values": ["sh", "bj"]}, + {"key": "disk", "op": "notIn", "values": ["hdd"]} +] +``` + +Field `location_labels` in PD placement rule configuration is used to isolate replicas to different zones to improve availability. For now, the global configuration can be used as the default `location_labels` for all placement rules defined in SQL, so it's unnecessary to specify it. + +### Role configuration + +`ROLE` in the statement defines the Raft role of the replicas. It must be specified in the statement. There are 4 predefined roles: + +- `leader`. Exactly one `leader` is allowed. +- `follower`. +- `voter`. It includes `leader` and `follower`. +- `learner`. It can be either TiFlash or TiKV. + +If both `voter` and `follower` are defined in the rules, the replicas of `follower` are not included in the replicas of `voter`. For example: + +```sql +ALTER TABLE test + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=follower REPLICAS=2, + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=voter REPLICAS=2; +``` + +There are 4 replicas for table `test`, 2 of which are in `sh` and 2 are in `bj`. Leader can only be placed on `sh`. + +`ROLE` in the statement is equivalent to field `role` in PD placement rule configuration. + +### Replicas configuration + +`REPLICAS` in the statement indicates the replica count of the specified role. + +Rules defined on `leader` can omit `REPLICAS`, because the count of leader is always 1. + +When all the replica counts are specified in the `CONSTRAINTS` option, `REPLICAS` can also be omitted. For example, `CONSTRAINTS="{+zone=bj:2,+zone=sh:1}", ROLE=voter` indicates that the `REPLICAS` is 3. + +When both `REPLICAS` and `count` in `CONSTRAINTS` are specified, it indicates that the other replicas can be placed anywhere. For example, in the case `CONSTRAINTS="{+zone=bj:2,+zone=sh:1}", ROLE=voter, REPLICAS=4`, 2 replicas are in `bj` and 1 in `sh`, and the last replica can be anywhere, including `bj` and `sh`. + +When the `CONSTRAINTS` option doesn't contain `count`, `REPLICAS` must be specified. For example, `CONSTRAINTS="[+zone=bj]" ROLE=follower` is vague, as the count of `follower` can not be inferred. + +`REPLICAS` in the statement is equivalent to field `count` in PD placement rule configuration. + +### Key range configuration + +In PD placement rule configuration, the key range must be specified. Now that `table_name` is specified in the `ALTER TABLE` statement, key range can be inferred. + +Typically, key format is in such a format: `t_{table_id}_r_{pk_value}`, where `pk_value` may be `_tidb_rowid` in some cases. `table_id` can be inferred from `table_name`, thus key range is `t_{table_id}_` to `t_{table_id+1}_`. + +Similarly, key range of partitions and indices can also be inferred. + +### Database placement + +Defining placement rules of databases simplifies the procedures when there are many tables. For example, in a typical multi-tenant scenario, each user has a private database. The dataset in one database is relatively small, and it’s rare to query across databases. In this case, a whole database can be placed in a single region to reduce multi-region latency. + +Placement of databases is defined through `ALTER` statements: + +```sql +ALTER {DATABASE | SCHEMA} schema_name + {ADD | ALTER} PLACEMENT POLICY ROLE=role CONSTRAINTS=constraints REPLICAS=replicas, + ... + +ALTER {DATABASE | SCHEMA} schema_name + DROP PLACEMENT POLICY ROLE=role, + ... +``` + +This statement defines placement rules for one database, including all tables in it. + +Creating or dropping a table also affects the placement rules. If a placement rule is defined on a database, all tables in this database will automatically apply that rule, including the existing tables and the tables created later. + +Once the placement rules on a database are changed, the tables should also update their placement rules. Users can overwrite the rules by defining placement rules on the tables. See the section "Rule inheritance" for details. + +Since key range is not successive in one database, each table in the database corresponds to at least one placement rule, so there may be many placement rules. + +### Partition placement + +Defining placement rules of partitions is useful for Geo-Partitioning. In the cases where data is very relevant to zones, Geo-Partitioning can be applied to reduce multi-region latency. + +In Geo-Partitioning, the table must be splitted into partitions, and each partition is placed in specific zones. There are some kinds of partition placement: + +* Place all voters on one zone +* Place only leaders on one zone +* Place leaders and half of the followers on one zone + +It’s up to users to choose the right solution. + +Placement of partitions is also defined through `ALTER TABLE` statements: + +```sql +ALTER TABLE table_name ALTER PARTITION partition_name + {ADD | ALTER} PLACEMENT POLICY CONSTRAINTS=constraints ROLE=role REPLICAS=replicas, + ... + +ALTER TABLE table_name ALTER PARTITION partition_name + DROP PLACEMENT POLICY ROLE=role, + ... +``` + +This statement defines placement rules for one partition, including its local indices. + +The key format of a partitioned table is `t_{partition_id}_r_{pk_value}`. As `partition_id` is part of the key prefix, the key range of a partition is successive. The key range is `t_{partition_id}_` to `t_{partition_id+1}_`. + +Placement rules can also be defined on a partitioned table. Because there are multiple key ranges for the table, multiple rules will be generated and sent to PD. When placement rules are defined both on the table and its partitions, the rule priorities described later should be applied. + +### Unpartitioned index placement + +Defining placement rules of indices is more complicated, because indices can be unpartitioned or partitioned. Each case should be considered separately. + +The index here can be primary index or secondary index. When the key of a clustered index is `_tidb_rowid` rather than the primary key, the primary index is actually an unclustered index. In this case, an index placement statement is applied. + +Expression indices and invisible indices are also supported, as the key format is the same as normal. + +Defining placement of an unpartitioned index is in such a statement: + +```sql +ALTER TABLE table_name ALTER INDEX index_name + {ADD | ALTER} PLACEMENT POLICY CONSTRAINTS=constraints ROLE=role REPLICAS=replicas, + ... + +ALTER TABLE table_name ALTER INDEX index_name + DROP PLACEMENT POLICY ROLE=role, + ... +``` + +This key format of an unpartitioned index is `t_{table_id}_i_{index_id}_r_{pk_value}`. The key range can be inferred by `table_id` and `index_id`. + +### Partitioned index placement + +Defining placement rules of an index in one specific partition is in such a statement: + +```sql +ALTER TABLE table_name ALTER PARTITION partition_name ALTER INDEX index_name + {ADD | ALTER} PLACEMENT POLICY CONSTRAINTS=constraints ROLE=role REPLICAS=replicas, + ... + +ALTER TABLE table_name ALTER PARTITION partition_name ALTER INDEX index_name + DROP PLACEMENT POLICY ROLE=role, + ... +``` + +The key format of partitioned index is `t_{partition_id}_i_{index_id}_r_{pk_value}`. The key range can be inferred by `partition_id` and `index_id`. + +When an index is partitioned, defining placement rule of the whole index at once is not supported. It will involve multiple key ranges, and the scenario of its application is rare. + +For example, `t` is a partitioned table and `idx` is the index on `t`. It’s not supported to do this: + +```sql +ALTER TABLE `t` ALTER INDEX `idx` + ADD PLACEMENT POLICY ... +``` + +To alter the placement rule of `idx`, a partition must be specified in the statement. + +Currently, global secondary index on partitioned tables is not supported, so it can be ignored for now. + +### Sequence placement + +Sequence is typically used to allocate ID in `INSERT` statements, so the placement of sequences affects the latency of `INSERT` statements. + +However, sequence is typically used with cache enabled, which means very few requests are sent to sequence. So defining placement rules of sequences is not supported for now. + +## DDL management + +Some kinds of DDL on databases also affect placement rules. + +### DDL on tables + +Once a table is created, it follows the placement rule of its database. + +Defining placement rules in a `CREATE TABLE` statement is useful, especially in data sovereignty scenarios. Data sovereignty requires sensitive data to reside within its own national border, which is very serious. So defining placement rules after creating tables is not acceptable. But for now, it's not supported, as it complicates the implementation. + +Once a table is dropped, the placement rules on it cannot be dropped immediately, because the table can be recovered by `FLASHBACK` or `RECOVER` statements before GC collects the data. Related placement rules should be kept temporarily and will be removed after GC lifetime. + +Since dropped tables are collected by the GC worker, when the GC worker collects a table, the related placement rules can be removed. + +When it’s time to remove all relevant placement rules, not only those rules defined on the table should be removed, but also the rules defined on its partitions and indices. + +Once a table is truncated, the table id is updated. As its key range is changed, the placement rules should also be updated. + +Since the table can be recovered later by `FLASHBACK` statement, a snapshot of the original placement rules should be saved temporarily. After recovering, the table name is changed, but the table id is the original one, so the snapshot of the original placement rules can be recovered directly. + +For example: + +```sql +TRUNCATE TABLE t; + +ALTER TABLE t + ALTER PLACEMENT POLICY CONSTRAINTS="+zone=sh" ROLE=leader; + +FLASHBACK table t to t1; +``` + +In this case, the placement rules of `t` is altered by the user just after truncating. Once `t` is flashbacked to `t1`, the placement rules of `t1` should be recovered to the version before `TRUNCATE` instead of the version after `ALTER PLACEMENT POLICY`. However, the procedure is quite complicated and this kind of action is rare, so the placement rules will be recovered to the newest version for now. + +DDL on partitions and indices will be discussed below, and other DDL on tables won’t affect placement rules: + +* Altering columns +* Renaming tables +* Altering charset and collation + +### DDL on partitions + +TiDB supports adding and dropping partitions. + +Once a partition is added, its placement rule is empty and the partition follows the rule of the table it belongs to. + +Once a partition is dropped, it can’t be recovered anymore, so its placement rules can be removed immediately. + +Also note that DDL on tables may also effect partitions. It's descibed in the section "DDL on tables". + +### DDL on indices + +Once an index is created on an unpartitioned table, the index should follow the rule of the table it belongs to. + +Once an index is created on a table with partitions, each part of the index should follow the rule of the partition it belongs to. + +Once an index is dropped, it can’t be recovered anymore, so its placement rules can be removed immediately. + +Altering primary index is the same with altering secondary indexes. Because if a primary index can be created or dropped, it must be an unclustered index. + +Other DDL on indices won’t affect placement rules: + +* Renaming index +* Altering the visibility of index + +### Show DDL jobs + +As mentioned before, all statements related to placement rules must wait until PD returns. If the execution is interrupted, the job will be cancelled and the DDL will rollback, just like other DDL jobs. + +PD schedules regions asynchronously after it returns the message. TiDB can query the progress of scheduling from PD. The progress is observed by executing `SHOW PLACEMENT POLICY` instead of `ADMIN SHOW DDL JOBS`, because the DDL job finishes once PD returns a message. + +Ongoing and finished statements can also be queried through `ADMIN SHOW DDL`, `ADMIN SHOW DDL JOBS`, or other similar statements. + +## View rules + +All placement rules can be queried through statements. + +### System table + +A new system table `information_schema.placement_rules` is added to view all placement rules. The table contains such columns: + +* rule_id +* target ID +* target name +* constraints +* role +* replicas +* scheduling state + +The system table is a virtual table, which doesn’t persist data. When querying the table, TiDB queries PD and integrates the result in a table format. That also means the metadata is stored on PD instead of TiKV. + +An object may contain multiple placement rules, each of which corresponds to a rule in PD. + +Advantages of building system table include: + +* It’s easy for users to filter and aggregate the result +* There’s no need to support a new grammar, and it’s easier to implement + +### Show placement + +But there’re a problem here. The system table only contains stored placement rules, and users cannot query the effective rule of one object from it. + +For example, table `t` has two partitions `p0` and `p1`, and a placement rule is added on `t`. If the user wants to query the working rule of `p0`, he will find no placement rule is defined for `p0` through the system table. Based on the rule priorities described later, he must query the placement rule on `t`. This procedure is annoying. + +To simplify the procedure, a `SHOW PLACEMENT POLICY` statement is provided to query the effective rule for one specified object. + +The statement is in such a format: + +```sql +SHOW PLACEMENT POLICY FOR {DATABASE | SCHEMA} schema_name; +SHOW PLACEMENT POLICY FOR TABLE table_name [PARTITION partition_name]; +SHOW PLACEMENT POLICY FOR INDEX index_name FROM table_name [PARTITION partition_name]; +``` + +TiDB will automatically find the effective rule based on the rule priorities. + +This statement outputs at most 1 line. For example, when querying a table, only the placement rule defined on the table itself is shown, and the partitions and indices in it will not be shown. + +The output of this statement contains these fields: + +* Target: The object queried. It can be a database, table, partition, or index. + * For database, it is shown in the format `DATABASE database_name` + * For table, it is shown in the format `TABLE database_name.table_name` + * For partition, it is shown in the format `TABLE database_name.table_name PARTITION partition_name` + * For index, it is shown in the format `INDEX index_name FROM database_name.table_name` +* Equivalent placement: A equivalent `ALTER` statement on `target` that defines the placement rule. +* Existing placement: All the executed `ALTER` statements that affect the placement of `target`, including the statements on its parent. +* Scheduling state: The scheduling progress from the PD aspect. + +### Show create table + +It’s useful to show rules in `SHOW CREATE TABLE` statement, because users can check the rules easily. + +Since data in TiDB can be imported to MySQL, the placement rules definition must be shown as a MySQL-compatible comment such as `/*T![placement] placement_clause*/`, where `placement_clause` can be recognized by TiDB. That means TiDB needs to support two approaches to define placement rules, one in `CREATE TABLE` and another in `ALTER TABLE`. + +This is complicated, and `ALTER TABLE` is able to satisfy most of the cases, so `SHOW CREATE TABLE` is kept untouched for now. + +## Implementation + +This section focuses on the implemention details of defining placement rules in SQL. + +### Storing placement rules + +PD uses placement rules to schedule data, so a replica of placement rules must be persistent on the PD. + +However, TiDB also uses placement rules in some cases, as discussed in section "Querying placement rules". There are basically 2 ways to achieve this: + +- Save the placement rules in table information, which will be duplicated with PD +- Only PD persists the placement rules, while TiDB caches a copy of them + +Before choosing the solution, transactional requirements need to be noticed: + +- Defining placement rules may fail, and users will probably retry it. As retrying `ADD PLACEMENT POLICY` will add more replicas than expected, the atomacity of the opertion needs to be gauranteed. +- `ADD PLACEMENT POLICY` needs to read the original placement rules, combine the 2 rules and then store them to PD, so linearizability should be gauranteed. + +If the placement rules are stored on both TiKV and PD, the approaches to keep atomicity are as follows: + +- Enforce a 2PC protocol on TiKV and PD. +- Store them on TiKV along with a middle state. If TiKV succeeds, then try PD, otherwise rollback it by the middle state. The DDL procedure guarantees the atomicity even if TiDB is down. + +The approaches to keep linearizability are as follows: + +- Define placement rules in serial. +- Enforce an exclusive lock on one of the replicas and release it after the whole job finishes. + +As a contrast, if the placement rules are stored only on PD, the approaches to keep atomicity are as follows: + +- Write all the placement rules in one ETCD transaction. +- Persist a middle state on TiKV before sending to PD. This middle state acts as undo log. + +The approaches to keep linearizability are as follows: + +- Define placement rules in serial. +- Enforce an exclusive lock on PD and release it after the job finishes. + +The comparison shows that both solutions are possible, but storing placement rules only on PD is more practical. To guarantee the transactional characteristics, the easiest way is to write all placement rules in a transaction and define them in serial on the TiDB side. + +### Querying placement rules + +The scenarios where TiDB queries placement rules are as follows: + +1. The optimizer uses placement rules to decide to route cop request to TiKV or TiFlash. It's already implemented and the TiFlash information is written into table information, which is stored on TiKV. +2. It will be probably used in locality-aware features in the furture, such as follower-read. Follower-read is always used when TiDB wants to read the nearest replica to reduce multi-region latency. In some distributed databases, it’s implemented by labelling data nodes and selecting the nearest replica according to the labels. +3. Local transactions need to know the binding relationship between Raft leader and region, which is also defined by placement rules. +4. Once a rule is defined on a table, all the subsequent partitions added to the table should also inherit the rule. So the `ADD PARTITION` operation should query the rules on the table. The same is true for creating tables and indices. +5. `SHOW PLACEMENT POLICY` statement should output the placement rules correctly. + +As placement rules will be queried in case 1, 2 and 3, low latency must be guaranteed. As discussed in section "Storing placement rules", placement rules are only persistent on PD. To lower the latency, the only way is caching the placement rules in TiDB. + +Since the cache is created, there must be a way to validate it. Different from region cache, placement rules cache can only be validated each time from PD. There are some ways to work around: + +- Update the schema version once a placement rule is changed, just like other DDL. PD broadcasts the latest schema version to all the TiDB instances, and then TiDB instances fetch the newest placement rules from PD. There will be a slight delay for queries before reading the latest placement rules. The side affect is that more transactions will retry since the schema version is changed. +- TiDB queries placement rules from PD periodly. The delay is controllable but not eliminable. +- Once a placement rule is changed, PD broadcasts it to all the TiDB instances. In this approach, schema version is not involved, so transactions are not affected. The delay is not eliminable either. + +All the approaches above will result in a delay. Fortunately, for case 1 and 2 above, delay is acceptable. It doesn’t matter much if the optimizer doesn’t perceive the placement rules changement immediately. The worst result is that the latency is relatively high for a short time. + +For case 3, although delay is acceptable, but all TiDB instances must be always consistent on the placement rules. To achieve this goal, schema version needs to be updated, thus transactions with old placement rules will fail when committed. + +For case 4 and 5, delay is not acceptable. Once the placement rules are written successfully, subsequent DDL statements should fetch the latest placement rules to gaurantee linearizability. Now that schema version is changed and the latest placement rules are broadcast to all the TiDB instances immediately, delay is eliminable. + +Once the schema version is changed, all TiDB instances recognize the object ID and fetch placement rules from PD, rather than TiKV. + +To query the placement rules on a specified object, the object ID should be written to the placement rules, or it can be inferred from other fields. Now that `id` contains the object ID, TiDB can decode the object ID from it. See section "Building placement rules" for details. + +### DDL procedures + +Defining placement rules is a type of DDL, so it's natural to implement it in a typical DDL procedure. But it differs from other DDL in that it writes to PD instead of TiKV. + +The fact that the DDL procedure in TiDB is mature helps to achieve some features of defining placement rules: + +- Placement rules are defined in serial as there's only one DDL owner at the same time +- DDL is capable of disaster recovery as the middle states are persistent in TiKV +- DDL is rollbackable as the middle states can transform from one to another +- Updating schema version guarantees all active transactions are based on the same version of placement ruels + +### Rule priorities + +When several rules are defined for one record, the most granular rule is chosen for this record. More specifically, the rule priority is: index > partition > table > database > default. + +For example: + +1. At the beginning, all data is placed based on the default placement rules. +2. When a placement rule is added on table `t`, all data on `t` is placed based on the rule. +3. When a placement rule is added on partition `p0` of `t`, all data on `p0` is placed based on the rule of `p0`, but other partitions stay still. +4. When the placement rule on `p0` is removed, data on `p0` is placed based on the rule of `t`, just like other partitions. + +Rules priorities are checked when a placement rule is added, altered, or dropped. + +Rule priorities can be implemented by fields `index` and `override` in the PD placement rule configuration. `override` is alway enabled, and `index` stands for the priority. Rules with higher `index` will overwrite the rules with lower `index` and same key range, but rules with same `index` don't overwrite each other, they just accumulate. + +Specifically, `index` is in such a format: + +* `index` of default placement rules is 0 +* `index` of database placement rules is 1 +* `index` of table placement rules is 2 +* `index` of partition placement rules is 3 +* `index` of index placement rules is 4 + +In such a way, the most granular rule always works. + +### Rule inheritance + +In some cases, creating a new object doesn't need to store its placement rules: + +- Creating a database +- Creating an index on an unpartitioned table +- Creating an index on a partition + +In the last two cases, the key range of the index is included in the key range of the table or partition it belongs to. PD will guarantee the rule priorities described above. + +But in other cases, creating a new object needs to store its placement rules: + +- Creating a table in a database +- Creating a partition in a table + +The placement rules of databases and partitioned tables don't actually work on PD, because the key ranges don't include any records. They are stored on PD and only serve for querying when new objects are created in them. + +For example, when defining a placement rule on database `db`, the key range of this rule is empty. When a new table `t` is created in `db`, TiDB queries the placement rules of `db` and copies them to table `t`, but the new key range corresponds to table `t`. + +Once the placement rules on a database or a partitioned table are changed, the inherited placement rules are also updated, but others are kept. + +Consider such a scenario: + +```sql +ALTER DATABASE db + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=sh]" ROLE=voter REPLICAS=3; + +CREATE TABLE db.t1(id int); + +CREATE TABLE db.t2(id int); + +ALTER TABLE db.t2 + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=follower REPLICAS=1; + +ALTER DATABASE db + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3, + ADD PLACEMENT POLICY CONSTRAINTS="[-zone=sh]" ROLE=follower; +``` + +The final placement rules of `t1` and `t2` will be: + +```sql +ALTER TABLE db.t1 + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3, + ADD PLACEMENT POLICY CONSTRAINTS="[-zone=sh]" ROLE=follower; + +ALTER TABLE db.t2 + ALTER PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3, + ADD PLACEMENT POLICY CONSTRAINTS="[+zone=bj]" ROLE=follower REPLICAS=1; +``` + +Because all the placement rules on `t1` are inherited from `db`, they will keep the same with `db` all the time. The placement rule `CONSTRAINTS="[+zone=bj]" ROLE=follower REPLICAS=1` is private for `t2`, so it will be kept after the changement of `db`. But the other rule `CONSTRAINTS="[+zone=bj]" ROLE=voter REPLICAS=3` is still inherited from `db`. + +To achieve this goal, the placement rules should be marked with the source where they come from. + +### Building placement rules + +There needs a way to map the placement rules in SQL to PD placement rule configuration. Most of the fields are discussed above, so this part focuses on `group_id`, `id`, `start_key` and `end_key`. + +`group_id` is used to identify the source of the placement rules, so `group_id` is `tidb`. + +`ALTER PLACEMENT POLICY` and `DROP PLACEMENT POLICY` need to find the rules of a specified object efficiently. It can be achieved by encoding the object ID in `id`. + +However, an object may have multiple rules for a single role. For example: + +```sql +ALTER TABLE t + ALTER PLACEMENT POLICY CONSTRAINTS="{+zone=bj:2,+zone=sh:1}" ROLE=voter; +``` + +It needs 2 placement rules for `voter` in the PD placment rule configuration, because each rule can only specify one `count`. To make `id` unique, a unique identifier must be appended to `id`. DDL job ID plus an index in the job is a good choice. + +Take the case above for example, assuming the table ID of `t` is 100, the ID of the DDL job executing this statement is 200, then `id` of the placement rules are `100-200-1` and `100-200-2`. + +The prefix of `id` is in such a format: + +* Database: database id +* Table: table id +* Partition: partition id +* Unpartitioned index: the concatenation of table id and index id, e.g. `100_1` +* Partitioned index: the concatenation of partition id and index id + +To query all the placement rules for one object, PD looks for all the `id` with a specific prefix. + +As all placement rules are mapped to PD placement rule configurations, `start_key` and `end_key` must be generated for each object. However, databases and partitioned tables have no key ranges, so the only way is to generate a key range with no actual records. + +As database IDs are all globally unique, it's fine to replace table ID with database ID in the key range. For example, assuming the database ID is 100, then the string format of its key range is: + +- `start_key`: `t_{database_id}_` +- `end_key`: `t_{database_id+1}_` + +It's same for partitioned tables. + +### Future plans + +Many other features in TiDB are in development, some of which may influence placement rules. + +Clustered index affects the key format of primary index. Fortunately, the prefix of key range is untouched. + +Global secondary index largely affect the placement rules of partitioned tables. The key range of one global secondary index is not successive, so if it's necessary to define placement rules on the index, multiple rules should be generated in the PD. But for now, there's no such scenario. + +## Privilege management + +Privilege management is quite straightforward: + +* `ALTER` statement requires `Alter` privilege +* `information_schema.placement_rules` and `SHOW PLACEMENT POLICY` only shows the placement rules on the objects that visible to the current user +* `ADMIN SHOW DDL` requires `Super` privilege + +## Ecosystem tools + +Many tools are based on binlog or metadata. For example, TiDB-binlog is based on binlog, while Lightning and Dumpling are based on metadata. Placement rules need to be compatible with these tools. + +If the downstream is not TiDB, no change needs to be made. But even if it is TiDB, TiKV nodes may have a different geographical topology, which means the labels of TiKV nodes may be different. In this case, placement rules can not be enforced on them. + +Based on this consideration, placement rules need not to be exported to binlog or metadata. This is applicable for all tools, including TiCDC and BR. + +However, there may be also cases where users want exactly the same placement rules as the upstream, and altering placement rules manually is very annoying. It will be considered in the future if there’s a need. diff --git a/docs/design/2020-09-12-utf8mb4-pinyin-order.md b/docs/design/2020-09-12-utf8mb4-pinyin-order.md new file mode 100644 index 0000000000000..3deb35aaa5540 --- /dev/null +++ b/docs/design/2020-09-12-utf8mb4-pinyin-order.md @@ -0,0 +1,78 @@ +# Proposal: support `pinyin` order for `utf8mb4` charset + +- Author(s): [xiongjiwei](https://github.com/xiongjiwei) +- Last updated: 2020-11-06 +- Discussion at: https://github.com/pingcap/tidb/issues/19747 + +## Abstract +This proposal proposes a new feature that supports `pinyin` order for chinese character. + +## Background +It's unable now to order by a column based on its pinyin order. For example: + +```sql +create table t( + a varchar(100) +) +charset = 'utf8mb4' collate = 'utf8mb4_zh_0900_as_cs'; + +# insert some data: +insert into t values ("中文"), ("啊中文"); + +# a query requires to order by column a in its pinyin order: +select * from t order by a; ++-----------+ +| a | ++-----------+ +| 啊中文 | +| 中文 | ++-----------+ +2 rows in set (0.00 sec) +``` + +## Proposal + +`pinyin` order for Chinese character supported by this proposal will add a new collation named `utf8mb4_zh_pinyin_tidb_as_cs` which is support all Unicode and sort Chinese characters correctly according to the PINYIN collation in zh.xml file of [CLDR24](http://unicode.org/Public/cldr/24/core.zip), and only support those Chinese characters with `pinyin` in zh.xml currently, we support neither those CJK characters whose category defined in Unicode are Symbol with the same shape as Chinese characters nor the PINYIN characters. In `utf8mb4_zh_pinyin_tidb_as_cs`, `utf8mb4` means charset utf8mb4, `zh` means Chinese language, `pinyin` means it has pinyin order, `tidb` means a special(tidb) version, and `as_cs` means it is accent-sensitive and case-sensitive. + +### Advantages + +It's a lot of work if we implement `utf8mb4_zh_0900_as_cs`. The implementation of MySQL looks complicated with weight reorders, magic numbers, and some tricks. Implementing `utf8mb4_zh_pinyin_tidb_as_cs` is much easier. It supports all Chinese characters and sorts Chinese characters in pinyin order. It is good enough. + +### Disadvantages + +It is not compatible with MySQL. MySQL does not have a collation named `utf8mb4_zh_pinyin_tidb_as_cs`. + +## Rationale + +### How to implement + +#### Compare and Key + +- For any Chinese character, which has non-zero seq NO. defined in zh.xml according to its gb18030 code, the final weight shall be 0xFFA00000+(seq No.) +- For any non-Chinese gb18030 character 2 bytes C, the final weight shall be C itself. +- For any non-Chinese gb18030 character 4 bytes C, the final weight shall be 0xFF000000+diff(C)(we get diff by Algorithm). + +### Parser + +Choose collation ID `2048` for `utf8mb4_zh_pinyin_tidb_as_cs` and add it into parser. + +> MySQL supports two-byte collation IDs. The range of IDs from 1024 to 2047 is reserved for user-defined collations. [see also](https://dev.mysql.com/doc/refman/8.0/en/adding-collation-choosing-id.html) + +### Compatibility with current collations + +`utf8mb4_zh_pinyin_tidb_as_cs` has same priority with `utf8mb4_unicode_ci` and `utf8mb4_general_ci`, which means these three collations incompatible with each other. + +### Alternative +MySQL has a lot of language specific collations, for `pinyin` order, MySQL uses collation `utf8mb4_zh_0900_as_cs`. + +## Compatibility and Migration Plan + +### Compatibility issues with MySQL + +There is no `utf8mb4_zh_pinyin_tidb_as_cs` collation in MySQL. We can comment `utf8mb4_zh_pinyin_tidb_as_cs` when users need to replicate their data from TiDB to MySQL. + +## Open issues (if applicable) + +https://github.com/pingcap/tidb/issues/19747 + +https://github.com/pingcap/tidb/issues/10192 diff --git a/docs/design/2020-09-30-index-usage-information.md b/docs/design/2020-09-30-index-usage-information.md new file mode 100644 index 0000000000000..2811f49fde1fd --- /dev/null +++ b/docs/design/2020-09-30-index-usage-information.md @@ -0,0 +1,190 @@ +# Proposal: + +- Author(s): [rebelice](https://github.com/rebelice) +- Last updated: Sep. 30, 2020 +- Discussion at: N/A + +## Abstract + +This document describes the design of recording index usage information. + +## Background + +There may be unused indexes in the database. In addition, modifying database tables, indexes, and query statements may cause some indexes to not be used in the future. Users may want to clear these long-unused indexes to relieve storage and performance pressure. + +Related issues: + +- https://github.com/pingcap/tidb/issues/14998 +- https://github.com/pingcap/tidb/issues/14607 +- https://github.com/pingcap/tidb/issues/17508 +- https://asktug.com/t/topic/34614/12 + +## Proposal + +### SCHEMA_INDEX_USAGE + +Design system tables to record index usage information. The system table is designed as follows: + +1. The system table is located in `mysql` database and is named `SCHEMA_INDEX_USAGE`. +2. Columns of `SCHEMA_INDEX_USAGE`: + +| Column name | Data type | Description | +|--------------|-----------|-------------| +| TABLE_ID | bigint | ID of the table or view on which the index is defined.| +| INDEX_ID | bigint | ID of the index.| +| QUERY_COUNT | longlong | Number of the SQL using this index.| +| ROWS_SELECTED| longlong | Number of rows read from the index. We can check the average fetched rows count of each query of the index through `ROWS_READ` / `QUERY_COUNT`.| +| LAST_USED_AT | timestamp | The last time of the SQL using this index.| + + +3. Typical usage: `select * from mysql.SCHEMA_INDEX_USAGE`. + +#### Table creation: + +```sql +create table SCHEMA_INDEX_USAGE ( + TABLE_ID bigint(21), + INDEX_ID bigint(21), + QUERY_COUNT BIGINT, + ROUWS_SELECTED BIGINT, + LAST_USED_AT timestamp, + PRIMARY KEY (SCHEMA_NAME, TABLE_NAME, INDEX_NAME) +); +``` + +According to the [TiDB Doc](https://docs.pingcap.com/zh/tidb/stable/information-schema-tidb-indexes#tidb_indexes), `INDEX_ID` should be `bigint(21)`. Similarly, [this doc](https://docs.pingcap.com/zh/tidb/stable/information-schema-tables#tables) tells us that `TABLE_ID` should be `bigint(21)`. + +#### Table update: + +```sql +insert into mysql.SCHEMA_INDEX_USAGE values (schemaA, tableA, indexA, count, row, used_at) +on duplicate key update query_count=query_count+count, rows_selected=rows_selected+row, last_used_at=greatest(last_used_at, used_at) +``` + +#### Update method: + +Statistics update is divided into statistics and persistence of index usage information. Index usage information is counted by the exec-info collector. And persistence is periodically writing data to system tables. We add a global variable `index-usage-sync-lease` to control the persistence cycle. It is set to 1 minute by default. In addition, add a global SQL variable to control whether to turn on this feature. + +### SCHEMA_UNUSED_INDEXES + +Due to MySQL compatibility, add the system table `SCHEMA_UNUSED_INDEXES`. + +1. Create a view `SCHEMA_UNUSED_INDEXES` on table `SCHEMA_INDEX_USAGE`. +2. Columns of it: + +| Column name | Data type | Description | +| ----------- | --------- | --------------------- | +| object_schema | varchar | The schema name. | +| object_name | varchar | The table name. | +| index_name | varchar | The unused index name.| + +#### View creation: + +```sql +create view information_schema.schema_unused_indexes +as select i.table_schema as table_schema, i.table_name as table_name, i.index_name as index_name +from mysql.tidb_indexes as i left join mysql.schema_index_usage as u +on i.table_schema=u.table_schema and i.table_name=u.table_name and i.index_name=u.index_name +where u.query_count=0 or u.query_count is null; +``` + +### INFORMATION_SCHEMA.SCHEMA_INDEX_USAGE + +We use `TABLE_ID` and `INDEX_ID` as ID `mysql.SCHEMA_INDEX_USAGE`. Because of `TABLE_ID` and `INDEX_ID` is not user-friendly, we need a more user-friendly view. +Columns of it: + +| Column name | Data type | Description | +|--------------|-----------|-------------| +| TABLE_SCHEMA | varchar | Name of the database on which the table or view is defined.| +| TABLE_NAME | varchar | Name of the table or view on which the index is defined.| +| INDEX_NAME | varchar | Name of the index.| +| QUERY_COUNT | longlong | Number of the SQL using this index.| +| ROWS_SELECTED| longlong | Number of rows read from the index. We can check the average fetched rows count of each query of the index through `ROWS_READ` / `QUERY_COUNT`.| +| LAST_USED_AT | timestamp | The last time of the SQL using this index.| + +#### View creation: + +```sql +create view information_schema.schema_index_usage +as select idx.table_schema as table_schema, idx.table_name as table_name, idx.key_name as index_name, stats.query_count as query_count, stats.rows_selected as rows_selected +from mysql.schema_index_usage as stats, information_schema.tidb_indexes as idx, information_schema.tables as tables +where tables.table_name = idx.table_schema + AND tables.table_name = idx.table_name + AND tables.tidb_table_id = stats.table_id + AND idx.index_id = stats.index_id +``` + +### FLUSH SCHEMA_INDEX_USAGE + +#### User story + +Users may have just completed a deployment which changes query patterns such that they expect there will be unused indexes. They can potentially look at the `LAST_USED_AT` column, but sometimes flushing is more desired. + +Similar usage: `FLUSH INDEX_STATISTICS` from https://www.percona.com/doc/percona-server/LATEST/diagnostics/user_stats.html. + +SQL Syntax: `FLUSH SCHEMA_INDEX_USAGE` +Users can use this to initialize SCHEMA_INDEX_USAGE as +```sql +delete from mysql.schema_index_usage; +``` +And it needs a [RELOAD privilege](https://dev.mysql.com/doc/refman/5.7/en/privileges-provided.html#priv_reload) check. + +### Privilege + +Read privilege: Reading SCHEMA_INDEX_USAGE and SCHEMA_UNUSED_INDEXES need permission. A user can see only the rows in the tables that correspond to tables for which the user has the proper access privileges, such as information_schema.tables. +Write privilege: These tables are read-only. You can use FLUSH SCHEMA_INDEX_USAGE command to reinitialize tables, which requires the RELOAD privilege. + +## Rationale + +### MySQL + +- Doc: The [schema_unused_indexes](https://dev.mysql.com/doc/refman/5.7/en/sys-schema-unused-indexes.html) view shows indexes for which there are no events, which indicates that they are not being used. By default, rows are sorted by schema and table. +- User interface + - SQL: `select * from schema_unused_indexes;` + - Columns of schema_unused_indexes + - object_schema (The schema name) + - object_name (The table name) + - index_name (The unused index name) +- The data for this view comes from the [table_io_waits_summary_by_index_usage](https://dev.mysql.com/doc/refman/5.7/en/table-waits-summary-tables.html#performance-schema-table-io-waits-summary-by-table-table). The table contains the following columns + - object_typje, object_schema, object_name, index_name + - In addition, there are columns related to statistical information with different granularities, such as: statistical information of all read operations, statistical information of write operations, or statistical information of all operations. + +### SQL-Server + +- Doc: [sys.dm_db_index_usage_stats](https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-index-usage-stats-transact-sql?view=sql-server-ver15) returns counts of different types of index operations and the time each type of operation was last performed. +- User interface + - SQL: `select * from sys.dm_db_index_usage_stats;` + - Columns of sys.dm_db_index_usage_stats + - database_id + - object_id + - index_id + - The number and final execution time of different types of index operations, including seek, scan, lookup, update. Each operation distinguishes user operations and system operations + - Whenever the index is used, the information in the table will be updated. + +### Oracle + +- Doc: [V$OBJECT_USAGE](https://docs.oracle.com/cd/B28359_01/server.111/b28320/dynviews_2077.htm#REFRN30162) displays statistics about index usage gathered from the database. +- User interface + - SQL: `select * from v$object_usage;` + - Columns of v$object_usage + - index_name + - table_name + - monitoring + - used + - start_monitoring + - end_monitoring +- Oracle can set whether to monitor an index. + +## Compatibility and Migration Plan + +MySQL supports `SCHEMA_UNUSED_INDEXES`. We are considering compatibility and also support this view. + +## Implementation + +My implementation plan is in [issues/19209](https://github.com/pingcap/tidb/issues/19209) + +## Testing Plan + +The test method is similar to general statistics. + +## Open issues (if applicable) diff --git a/docs/design/README.md b/docs/design/README.md index c493556cafb9a..5d71bbaa991f8 100644 --- a/docs/design/README.md +++ b/docs/design/README.md @@ -6,7 +6,7 @@ The design document provides a high-level description of the architecture and im Writing a design document can promote us to think deliberately and gather knowledge from others to get our job done better. An excellent design document is closely related to the success of our task. -## Proprosal Process +## Proposal Process 1. Before starting to write a design document, please [create a new issue](https://github.com/pingcap/tidb/issues/new/choose) for tracing the process of your design. 2. Create a new [Google Doc](https://docs.google.com/document/u/0/) to write the design document. Please refer to this [proposal template](./TEMPLATE.md). @@ -34,6 +34,7 @@ Writing a design document can promote us to think deliberately and gather knowle - [Proposal: Join Reorder Design v1](./2018-10-20-join-reorder-dp-v1.md) - [Proposal: Support Window Functions](./2018-10-31-window-functions.md) - [Proposal: Access a table using multiple indexes](./2019-04-11-indexmerge.md) +- [Proposal: Collations in TiDB](./2020-01-24-collations.md) ### Completed diff --git a/docs/design/TEMPLATE.md b/docs/design/TEMPLATE.md index df3656bced0a6..24a6325f6b088 100644 --- a/docs/design/TEMPLATE.md +++ b/docs/design/TEMPLATE.md @@ -8,86 +8,100 @@ This is a template for TiDB's change proposal process, documented [here](./READM - Last updated: - Discussion at: -## Abstract +## Table of Contents + +* [Introduction](#introduction) +* [Motivation or Background](#motivation-or-background) +* [Detailed Design](#detailed-design) +* [Test Design](#test-design) + * [Functional Tests](#functional-tests) + * [Scenario Tests](#scenario-tests) + * [Compatibility Tests](#compatibility-tests) + * [Benchmark Tests](#benchmark-tests) +* [Impacts & Risks](#impacts--risks) +* [Investigation & Alternatives](#investigation--alternatives) +* [Unresolved Questions](#unresolved-questions) + +## Introduction -## Background +## Motivation or Background -## Proposal +## Detailed Design + +## Test Design + + -## Rationale +### Functional Tests -## Compatibility and Mirgration Plan +### Scenario Tests -## Implementation +### Compatibility Tests + +### Benchmark Tests + + + +## Impacts & Risks + + -## Testing Plan +## Investigation & Alternatives -## Open issues (if applicable) +## Unresolved Questions diff --git a/docs/tidb_http_api.md b/docs/tidb_http_api.md index fb15087cd4789..d948146b58b83 100644 --- a/docs/tidb_http_api.md +++ b/docs/tidb_http_api.md @@ -200,6 +200,37 @@ } ``` + If the handle is clustered, specify the primary key column values in the query string + + ```shell + $curl http://{TiDBIP}:10080/mvcc/key/{db}/{table}?${c1}={v1}&${c2}=${v2} + ``` + + ```shell + $curl http://127.0.0.1:10080/mvcc/key/test/t\?a\=aaa\&b\=2020-01-01 + { + "key": "7480000000000000365F72016161610000000000FA0419A5420000000000", + "region_id": 52, + "value": { + "info": { + "writes": [ + { + "start_ts": 423158426542538752, + "commit_ts": 423158426543587328, + "short_value": "gAACAAAAAQMDAAQAYWFhZA==" + } + ], + "values": [ + { + "start_ts": 423158426542538752, + "value": "gAACAAAAAQMDAAQAYWFhZA==" + } + ] + } + } + } + ``` + 1. Get MVCC Information of the first key in the table with a specified start ts ```shell @@ -446,3 +477,18 @@ timezone.* * op=nowait: return after binlog status is recoverd, do not wait until the skipped-binlog transactions are committed. * op=reset: reset `SkippedCommitterCounter` to 0 to avoid the problem that `SkippedCommitterCounter` is not cleared due to some unusual cases. * op=status: Get the current status of binlog recovery. + +1. Enable/disable async commit feature + + ```shell + curl -X POST -d "tidb_enable_async_commit=1" http://{TiDBIP}:10080/settings + curl -X POST -d "tidb_enable_async_commit=0" http://{TiDBIP}:10080/settings + ``` + +1. Enable/disable one-phase commit feature + + ```shell + curl -X POST -d "tidb_enable_1pc=1" http://{TiDBIP}:10080/settings + curl -X POST -d "tidb_enable_1pc=0" http://{TiDBIP}:10080/settings + ``` + diff --git a/domain/db_test.go b/domain/db_test.go index 54bee09cb0647..36edc2ae8edaf 100644 --- a/domain/db_test.go +++ b/domain/db_test.go @@ -34,7 +34,10 @@ func (ts *dbTestSuite) TestIntegration(c *C) { lease := 50 * time.Millisecond store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() session.SetSchemaLease(lease) domain, err := session.BootstrapSession(store) c.Assert(err, IsNil) @@ -48,9 +51,13 @@ func (ts *dbTestSuite) TestIntegration(c *C) { c.Assert(err, IsNil) // for BindHandle - se.Execute(context.Background(), "use test") - se.Execute(context.Background(), "drop table if exists t") - se.Execute(context.Background(), "create table t(i int, s varchar(20), index index_t(i, s))") + _, err = se.Execute(context.Background(), "use test") + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "drop table if exists t") + c.Assert(err, IsNil) + _, err = se.Execute(context.Background(), "create table t(i int, s varchar(20), index index_t(i, s))") + c.Assert(err, IsNil) _, err = se.Execute(context.Background(), "create global binding for select * from t where i>100 using select * from t use index(index_t) where i>100") + c.Assert(err, IsNil) c.Assert(err, IsNil, Commentf("err %v", err)) } diff --git a/domain/domain.go b/domain/domain.go index a2557f71d3f81..a4cf71836b798 100644 --- a/domain/domain.go +++ b/domain/domain.go @@ -15,6 +15,9 @@ package domain import ( "context" + "fmt" + "math/rand" + "strconv" "sync" "sync/atomic" "time" @@ -26,11 +29,12 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" - "github.com/pingcap/tidb/ddl/placement" + ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" @@ -44,13 +48,16 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/telemetry" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/domainutil" "github.com/pingcap/tidb/util/expensivequery" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" "go.etcd.io/etcd/clientv3" + "go.etcd.io/etcd/clientv3/concurrency" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/keepalive" @@ -79,6 +86,10 @@ type Domain struct { statsUpdating sync2.AtomicInt32 cancel context.CancelFunc indexUsageSyncLease time.Duration + + serverID uint64 + serverIDSession *concurrency.Session + isLostConnectionToPD sync2.AtomicInt32 // !0: true, 0: false. } // loadInfoSchema loads infoschema at startTS into handle, usedSchemaVersion is the currently used @@ -86,10 +97,7 @@ type Domain struct { // It returns the latest schema version, the changed table IDs, whether it's a full load and an error. func (do *Domain) loadInfoSchema(handle *infoschema.Handle, usedSchemaVersion int64, startTS uint64) (neededSchemaVersion int64, change *tikv.RelatedSchemaChange, fullLoad bool, err error) { - snapshot, err := do.store.GetSnapshot(kv.NewVersion(startTS)) - if err != nil { - return 0, nil, fullLoad, err - } + snapshot := do.store.GetSnapshot(kv.NewVersion(startTS)) m := meta.NewSnapshotMeta(snapshot) neededSchemaVersion, err = m.GetSchemaVersion() if err != nil { @@ -141,13 +149,7 @@ func (do *Domain) loadInfoSchema(handle *infoschema.Handle, usedSchemaVersion in return 0, nil, fullLoad, err } - bundles, err := infosync.GetAllRuleBundles(nil) - failpoint.Inject("FailPlacement", func(val failpoint.Value) { - if val.(bool) { - bundles = []*placement.Bundle{} - err = nil - } - }) + bundles, err := infosync.GetAllRuleBundles(context.TODO()) if err != nil { return 0, nil, fullLoad, err } @@ -320,10 +322,7 @@ func (do *Domain) GetSnapshotInfoSchema(snapshotTS uint64) (infoschema.InfoSchem // GetSnapshotMeta gets a new snapshot meta at startTS. func (do *Domain) GetSnapshotMeta(startTS uint64) (*meta.Meta, error) { - snapshot, err := do.store.GetSnapshot(kv.NewVersion(startTS)) - if err != nil { - return nil, err - } + snapshot := do.store.GetSnapshot(kv.NewVersion(startTS)) return meta.NewSnapshotMeta(snapshot), nil } @@ -366,7 +365,7 @@ func (do *Domain) Reload() error { var err error var neededSchemaVersion int64 - ver, err := do.store.CurrentVersion() + ver, err := do.store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { return err } @@ -654,6 +653,7 @@ type ddlCallback struct { do *Domain } +// OnChanged overrides ddl Callback interface. func (c *ddlCallback) OnChanged(err error) error { if err != nil { return err @@ -668,6 +668,14 @@ func (c *ddlCallback) OnChanged(err error) error { return nil } +// OnSchemaStateChange overrides the ddl Callback interface. +func (c *ddlCallback) OnSchemaStateChanged() { + err := c.do.Reload() + if err != nil { + logutil.BgLogger().Error("domain callback failed on schema state changed", zap.Error(err)) + } +} + const resourceIdleTimeout = 3 * time.Minute // resources in the ResourcePool will be recycled after idleTimeout // NewDomain creates a new domain. Should not create multiple domains for the same store. @@ -684,13 +692,16 @@ func NewDomain(store kv.Storage, ddlLease time.Duration, statsLease time.Duratio } do.SchemaValidator = NewSchemaValidator(ddlLease, do) + do.expensiveQueryHandle = expensivequery.NewExpensiveQueryHandle(do.exit) return do } +const serverIDForStandalone = 1 // serverID for standalone deployment. + // Init initializes a domain. func (do *Domain) Init(ddlLease time.Duration, sysFactory func(*Domain) (pools.Resource, error)) error { perfschema.Init() - if ebd, ok := do.store.(tikv.EtcdBackend); ok { + if ebd, ok := do.store.(kv.EtcdBackend); ok { var addrs []string var err error if addrs, err = ebd.EtcdAddrs(); err != nil { @@ -763,7 +774,26 @@ func (do *Domain) Init(ddlLease time.Duration, sysFactory func(*Domain) (pools.R if err != nil { return err } - do.info, err = infosync.GlobalInfoSyncerInit(ctx, do.ddl.GetID(), do.etcdClient, skipRegisterToDashboard) + + if config.GetGlobalConfig().Experimental.EnableGlobalKill { + if do.etcdClient != nil { + err := do.acquireServerID(ctx) + if err != nil { + logutil.BgLogger().Error("acquire serverID failed", zap.Error(err)) + do.isLostConnectionToPD.Set(1) // will retry in `do.serverIDKeeper` + } else { + do.isLostConnectionToPD.Set(0) + } + + do.wg.Add(1) + go do.serverIDKeeper() + } else { + // set serverID for standalone deployment to enable 'KILL'. + atomic.StoreUint64(&do.serverID, serverIDForStandalone) + } + } + + do.info, err = infosync.GlobalInfoSyncerInit(ctx, do.ddl.GetID(), do.ServerID, do.etcdClient, skipRegisterToDashboard) if err != nil { return err } @@ -1033,8 +1063,13 @@ func (do *Domain) StatsHandle() *handle.Handle { } // CreateStatsHandle is used only for test. -func (do *Domain) CreateStatsHandle(ctx sessionctx.Context) { - atomic.StorePointer(&do.statsHandle, unsafe.Pointer(handle.NewHandle(ctx, do.statsLease))) +func (do *Domain) CreateStatsHandle(ctx sessionctx.Context) error { + h, err := handle.NewHandle(ctx, do.statsLease, do.sysSessionPool) + if err != nil { + return err + } + atomic.StorePointer(&do.statsHandle, unsafe.Pointer(h)) + return nil } // StatsUpdating checks if the stats worker is updating. @@ -1059,18 +1094,25 @@ var RunAutoAnalyze = true // It should be called only once in BootstrapSession. func (do *Domain) UpdateTableStatsLoop(ctx sessionctx.Context) error { ctx.GetSessionVars().InRestrictedSQL = true - statsHandle := handle.NewHandle(ctx, do.statsLease) + statsHandle, err := handle.NewHandle(ctx, do.statsLease, do.sysSessionPool) + if err != nil { + return err + } atomic.StorePointer(&do.statsHandle, unsafe.Pointer(statsHandle)) - do.ddl.RegisterEventCh(statsHandle.DDLEventCh()) + do.ddl.RegisterStatsHandle(statsHandle) // Negative stats lease indicates that it is in test, it does not need update. if do.statsLease >= 0 { do.wg.Add(1) go do.loadStatsWorker() } + owner := do.newOwnerManager(handle.StatsPrompt, handle.StatsOwnerKey) + if do.indexUsageSyncLease > 0 { + do.wg.Add(1) + go do.syncIndexUsageWorker(owner) + } if do.statsLease <= 0 { return nil } - owner := do.newOwnerManager(handle.StatsPrompt, handle.StatsOwnerKey) do.wg.Add(1) do.SetStatsUpdating(true) go do.updateStatsWorker(ctx, owner) @@ -1120,6 +1162,10 @@ func (do *Domain) loadStatsWorker() { for { select { case <-loadTicker.C: + err = statsHandle.RefreshVars() + if err != nil { + logutil.BgLogger().Debug("refresh variables failed", zap.Error(err)) + } err = statsHandle.Update(do.InfoSchema()) if err != nil { logutil.BgLogger().Debug("update stats info failed", zap.Error(err)) @@ -1134,6 +1180,36 @@ func (do *Domain) loadStatsWorker() { } } +func (do *Domain) syncIndexUsageWorker(owner owner.Manager) { + defer util.Recover(metrics.LabelDomain, "syncIndexUsageWorker", nil, false) + idxUsageSyncTicker := time.NewTicker(do.indexUsageSyncLease) + gcStatsTicker := time.NewTicker(100 * do.indexUsageSyncLease) + handle := do.StatsHandle() + defer func() { + idxUsageSyncTicker.Stop() + do.wg.Done() + logutil.BgLogger().Info("syncIndexUsageWorker exited.") + }() + for { + select { + case <-do.exit: + // TODO: need flush index usage + return + case <-idxUsageSyncTicker.C: + if err := handle.DumpIndexUsageToKV(); err != nil { + logutil.BgLogger().Debug("dump index usage failed", zap.Error(err)) + } + case <-gcStatsTicker.C: + if !owner.IsOwner() { + continue + } + if err := handle.GCIndexUsage(); err != nil { + logutil.BgLogger().Error("[stats] gc index usage failed", zap.Error(err)) + } + } + } +} + func (do *Domain) updateStatsWorker(ctx sessionctx.Context, owner owner.Manager) { defer util.Recover(metrics.LabelDomain, "updateStatsWorker", nil, false) lease := do.statsLease @@ -1221,11 +1297,6 @@ func (do *Domain) ExpensiveQueryHandle() *expensivequery.Handle { return do.expensiveQueryHandle } -// InitExpensiveQueryHandle init the expensive query handler. -func (do *Domain) InitExpensiveQueryHandle() { - do.expensiveQueryHandle = expensivequery.NewExpensiveQueryHandle(do.exit) -} - const privilegeKey = "/tidb/privilege" // NotifyUpdatePrivilege updates privilege key in etcd, TiDB client that watches @@ -1239,16 +1310,255 @@ func (do *Domain) NotifyUpdatePrivilege(ctx sessionctx.Context) { } } // update locally - _, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(`FLUSH PRIVILEGES`) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + if stmt, err := exec.ParseWithParams(context.Background(), `FLUSH PRIVILEGES`); err == nil { + _, _, err := exec.ExecRestrictedStmt(context.Background(), stmt) + if err != nil { + logutil.BgLogger().Error("unable to update privileges", zap.Error(err)) + } + } +} + +// ServerID gets serverID. +func (do *Domain) ServerID() uint64 { + return atomic.LoadUint64(&do.serverID) +} + +// IsLostConnectionToPD indicates lost connection to PD or not. +func (do *Domain) IsLostConnectionToPD() bool { + return do.isLostConnectionToPD.Get() != 0 +} + +const ( + serverIDEtcdPath = "/tidb/server_id" + refreshServerIDRetryCnt = 3 + acquireServerIDRetryInterval = 300 * time.Millisecond + acquireServerIDTimeout = 10 * time.Second + retrieveServerIDSessionTimeout = 10 * time.Second +) + +var ( + // serverIDTTL should be LONG ENOUGH to avoid barbarically killing an on-going long-run SQL. + serverIDTTL = 12 * time.Hour + // serverIDTimeToKeepAlive is the interval that we keep serverID TTL alive periodically. + serverIDTimeToKeepAlive = 5 * time.Minute + // serverIDTimeToCheckPDConnectionRestored is the interval that we check connection to PD restored (after broken) periodically. + serverIDTimeToCheckPDConnectionRestored = 10 * time.Second + // lostConnectionToPDTimeout is the duration that when TiDB cannot connect to PD excceeds this limit, + // we realize the connection to PD is lost utterly, and server ID acquired before should be released. + // Must be SHORTER than `serverIDTTL`. + lostConnectionToPDTimeout = 6 * time.Hour +) + +var ( + ldflagIsGlobalKillTest = "0" // 1:Yes, otherwise:No. + ldflagServerIDTTL = "10" // in seconds. + ldflagServerIDTimeToKeepAlive = "1" // in seconds. + ldflagServerIDTimeToCheckPDConnectionRestored = "1" // in seconds. + ldflagLostConnectionToPDTimeout = "5" // in seconds. +) + +func initByLDFlagsForGlobalKill() { + if ldflagIsGlobalKillTest == "1" { + var ( + i int + err error + ) + + if i, err = strconv.Atoi(ldflagServerIDTTL); err != nil { + panic("invalid ldflagServerIDTTL") + } + serverIDTTL = time.Duration(i) * time.Second + + if i, err = strconv.Atoi(ldflagServerIDTimeToKeepAlive); err != nil { + panic("invalid ldflagServerIDTimeToKeepAlive") + } + serverIDTimeToKeepAlive = time.Duration(i) * time.Second + + if i, err = strconv.Atoi(ldflagServerIDTimeToCheckPDConnectionRestored); err != nil { + panic("invalid ldflagServerIDTimeToCheckPDConnectionRestored") + } + serverIDTimeToCheckPDConnectionRestored = time.Duration(i) * time.Second + + if i, err = strconv.Atoi(ldflagLostConnectionToPDTimeout); err != nil { + panic("invalid ldflagLostConnectionToPDTimeout") + } + lostConnectionToPDTimeout = time.Duration(i) * time.Second + + logutil.BgLogger().Info("global_kill_test is enabled", zap.Duration("serverIDTTL", serverIDTTL), + zap.Duration("serverIDTimeToKeepAlive", serverIDTimeToKeepAlive), + zap.Duration("serverIDTimeToCheckPDConnectionRestored", serverIDTimeToCheckPDConnectionRestored), + zap.Duration("lostConnectionToPDTimeout", lostConnectionToPDTimeout)) + } +} + +func (do *Domain) retrieveServerIDSession(ctx context.Context) (*concurrency.Session, error) { + if do.serverIDSession != nil { + return do.serverIDSession, nil + } + + // `etcdClient.Grant` needs a shortterm timeout, to avoid blocking if connection to PD lost, + // while `etcdClient.KeepAlive` should be longterm. + // So we separately invoke `etcdClient.Grant` and `concurrency.NewSession` with leaseID. + childCtx, cancel := context.WithTimeout(ctx, retrieveServerIDSessionTimeout) + resp, err := do.etcdClient.Grant(childCtx, int64(serverIDTTL.Seconds())) + cancel() + if err != nil { + logutil.BgLogger().Error("retrieveServerIDSession.Grant fail", zap.Error(err)) + return nil, err + } + leaseID := resp.ID + + session, err := concurrency.NewSession(do.etcdClient, + concurrency.WithLease(leaseID), concurrency.WithContext(context.Background())) + if err != nil { + logutil.BgLogger().Error("retrieveServerIDSession.NewSession fail", zap.Error(err)) + return nil, err + } + do.serverIDSession = session + return session, nil +} + +func (do *Domain) acquireServerID(ctx context.Context) error { + atomic.StoreUint64(&do.serverID, 0) + + session, err := do.retrieveServerIDSession(ctx) + if err != nil { + return err + } + + for { + randServerID := rand.Int63n(int64(util.MaxServerID)) + 1 // get a random serverID: [1, MaxServerID] + key := fmt.Sprintf("%s/%v", serverIDEtcdPath, randServerID) + cmp := clientv3.Compare(clientv3.CreateRevision(key), "=", 0) + value := "0" + + childCtx, cancel := context.WithTimeout(ctx, acquireServerIDTimeout) + txn := do.etcdClient.Txn(childCtx) + t := txn.If(cmp) + resp, err := t.Then(clientv3.OpPut(key, value, clientv3.WithLease(session.Lease()))).Commit() + cancel() + if err != nil { + return err + } + if !resp.Succeeded { + logutil.BgLogger().Info("proposed random serverID exists, will randomize again", zap.Int64("randServerID", randServerID)) + time.Sleep(acquireServerIDRetryInterval) + continue + } + + atomic.StoreUint64(&do.serverID, uint64(randServerID)) + logutil.BgLogger().Info("acquireServerID", zap.Uint64("serverID", do.ServerID()), + zap.String("lease id", strconv.FormatInt(int64(session.Lease()), 16))) + return nil + } +} + +func (do *Domain) refreshServerIDTTL(ctx context.Context) error { + session, err := do.retrieveServerIDSession(ctx) if err != nil { - logutil.BgLogger().Error("unable to update privileges", zap.Error(err)) + return err + } + + key := fmt.Sprintf("%s/%v", serverIDEtcdPath, do.ServerID()) + value := "0" + err = ddlutil.PutKVToEtcd(ctx, do.etcdClient, refreshServerIDRetryCnt, key, value, clientv3.WithLease(session.Lease())) + if err != nil { + logutil.BgLogger().Error("refreshServerIDTTL fail", zap.Uint64("serverID", do.ServerID()), zap.Error(err)) + } else { + logutil.BgLogger().Info("refreshServerIDTTL succeed", zap.Uint64("serverID", do.ServerID()), + zap.String("lease id", strconv.FormatInt(int64(session.Lease()), 16))) + } + return err +} + +func (do *Domain) serverIDKeeper() { + defer func() { + do.wg.Done() + logutil.BgLogger().Info("serverIDKeeper exited.") + }() + defer util.Recover(metrics.LabelDomain, "serverIDKeeper", func() { + logutil.BgLogger().Info("recover serverIDKeeper.") + // should be called before `do.wg.Done()`, to ensure that Domain.Close() waits for the new `serverIDKeeper()` routine. + do.wg.Add(1) + go do.serverIDKeeper() + }, false) + + tickerKeepAlive := time.NewTicker(serverIDTimeToKeepAlive) + tickerCheckRestored := time.NewTicker(serverIDTimeToCheckPDConnectionRestored) + defer func() { + tickerKeepAlive.Stop() + tickerCheckRestored.Stop() + }() + + blocker := make(chan struct{}) // just used for blocking the sessionDone() when session is nil. + sessionDone := func() <-chan struct{} { + if do.serverIDSession == nil { + return blocker + } + return do.serverIDSession.Done() + } + + var lastSucceedTimestamp time.Time + + onConnectionToPDRestored := func() { + logutil.BgLogger().Info("restored connection to PD") + do.isLostConnectionToPD.Set(0) + lastSucceedTimestamp = time.Now() + + if err := do.info.StoreServerInfo(context.Background()); err != nil { + logutil.BgLogger().Error("StoreServerInfo failed", zap.Error(err)) + } + } + + onConnectionToPDLost := func() { + logutil.BgLogger().Warn("lost connection to PD") + do.isLostConnectionToPD.Set(1) + + // Kill all connections when lost connection to PD, + // to avoid the possibility that another TiDB instance acquires the same serverID and generates a same connection ID, + // which will lead to a wrong connection killed. + do.InfoSyncer().GetSessionManager().KillAllConnections() } + + for { + select { + case <-tickerKeepAlive.C: + if !do.IsLostConnectionToPD() { + if err := do.refreshServerIDTTL(context.Background()); err == nil { + lastSucceedTimestamp = time.Now() + } else { + if lostConnectionToPDTimeout > 0 && time.Since(lastSucceedTimestamp) > lostConnectionToPDTimeout { + onConnectionToPDLost() + } + } + } + case <-tickerCheckRestored.C: + if do.IsLostConnectionToPD() { + if err := do.acquireServerID(context.Background()); err == nil { + onConnectionToPDRestored() + } + } + case <-sessionDone(): + // inform that TTL of `serverID` is expired. See https://godoc.org/github.com/coreos/etcd/clientv3/concurrency#Session.Done + // Should be in `IsLostConnectionToPD` state, as `lostConnectionToPDTimeout` is shorter than `serverIDTTL`. + // So just set `do.serverIDSession = nil` to restart `serverID` session in `retrieveServerIDSession()`. + logutil.BgLogger().Info("serverIDSession need restart") + do.serverIDSession = nil + case <-do.exit: + return + } + } +} + +func init() { + initByLDFlagsForGlobalKill() } var ( // ErrInfoSchemaExpired returns the error that information schema is out of date. - ErrInfoSchemaExpired = terror.ClassDomain.New(errno.ErrInfoSchemaExpired, errno.MySQLErrName[errno.ErrInfoSchemaExpired]) + ErrInfoSchemaExpired = dbterror.ClassDomain.NewStd(errno.ErrInfoSchemaExpired) // ErrInfoSchemaChanged returns the error that information schema is changed. - ErrInfoSchemaChanged = terror.ClassDomain.New(errno.ErrInfoSchemaChanged, - errno.MySQLErrName[errno.ErrInfoSchemaChanged]+". "+kv.TxnRetryableMark) + ErrInfoSchemaChanged = dbterror.ClassDomain.NewStdErr(errno.ErrInfoSchemaChanged, + mysql.Message(errno.MySQLErrName[errno.ErrInfoSchemaChanged].Raw+". "+kv.TxnRetryableMark, nil)) ) diff --git a/domain/domain_test.go b/domain/domain_test.go index 099a045d339e5..08709856b3c08 100644 --- a/domain/domain_test.go +++ b/domain/domain_test.go @@ -89,7 +89,7 @@ func unixSocketAvailable() bool { } func TestInfo(t *testing.T) { - err := failpoint.Enable("github.com/pingcap/tidb/domain/FailPlacement", `return(true)`) + err := failpoint.Enable("github.com/pingcap/tidb/domain/infosync/FailPlacement", `return(true)`) if err != nil { t.Fatal(err) } @@ -220,7 +220,17 @@ func TestInfo(t *testing.T) { t.Fatalf("err %v, infos %v", err, infos) } - err = failpoint.Disable("github.com/pingcap/tidb/domain/FailPlacement") + // Test for acquireServerID & refreshServerIDTTL + err = dom.acquireServerID(goCtx) + if err != nil || dom.ServerID() == 0 { + t.Fatalf("dom.acquireServerID err %v, serverID %v", err, dom.ServerID()) + } + err = dom.refreshServerIDTTL(goCtx) + if err != nil { + t.Fatalf("dom.refreshServerIDTTL err %v", err) + } + + err = failpoint.Disable("github.com/pingcap/tidb/domain/infosync/FailPlacement") if err != nil { t.Fatal(err) } @@ -249,8 +259,14 @@ func (msm *mockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, boo func (msm *mockSessionManager) Kill(cid uint64, query bool) {} +func (msm *mockSessionManager) KillAllConnections() {} + func (msm *mockSessionManager) UpdateTLSConfig(cfg *tls.Config) {} +func (msm *mockSessionManager) ServerID() uint64 { + return 1 +} + func (*testSuite) TestT(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() @@ -325,7 +341,7 @@ func (*testSuite) TestT(c *C) { // for schemaValidator schemaVer := dom.SchemaValidator.(*schemaValidator).LatestSchemaVersion() - ver, err := store.CurrentVersion() + ver, err := store.CurrentVersion(oracle.GlobalTxnScope) c.Assert(err, IsNil) ts := ver.Ver @@ -338,7 +354,7 @@ func (*testSuite) TestT(c *C) { c.Assert(succ, Equals, ResultSucc) time.Sleep(ddlLease) - ver, err = store.CurrentVersion() + ver, err = store.CurrentVersion(oracle.GlobalTxnScope) c.Assert(err, IsNil) ts = ver.Ver _, succ = dom.SchemaValidator.Check(ts, schemaVer, nil) @@ -393,7 +409,8 @@ func (*testSuite) TestT(c *C) { dom.autoAnalyzeWorker(nil) counter := metrics.PanicCounter.WithLabelValues(metrics.LabelDomain) pb := &dto.Metric{} - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) c.Assert(pb.GetCounter().GetValue(), Equals, float64(2)) scope := dom.GetScope("status") @@ -421,16 +438,16 @@ func (*testSuite) TestT(c *C) { PS: make([]*util.ProcessInfo, 0), } infoSyncer.SetSessionManager(sm) - beforeTS := variable.GoTimeToTS(time.Now()) + beforeTS := oracle.GoTimeToTS(time.Now()) infoSyncer.ReportMinStartTS(dom.Store()) - afterTS := variable.GoTimeToTS(time.Now()) + afterTS := oracle.GoTimeToTS(time.Now()) c.Assert(infoSyncer.GetMinStartTS() > beforeTS && infoSyncer.GetMinStartTS() < afterTS, IsFalse) lowerLimit := time.Now().Add(-time.Duration(kv.MaxTxnTimeUse) * time.Millisecond) - validTS := variable.GoTimeToTS(lowerLimit.Add(time.Minute)) + validTS := oracle.GoTimeToTS(lowerLimit.Add(time.Minute)) sm.PS = []*util.ProcessInfo{ {CurTxnStartTS: 0}, {CurTxnStartTS: math.MaxUint64}, - {CurTxnStartTS: variable.GoTimeToTS(lowerLimit)}, + {CurTxnStartTS: oracle.GoTimeToTS(lowerLimit)}, {CurTxnStartTS: validTS}, } infoSyncer.SetSessionManager(sm) @@ -476,3 +493,7 @@ func (*testSuite) TestErrorCode(c *C) { c.Assert(int(terror.ToSQLError(ErrInfoSchemaExpired).Code), Equals, errno.ErrInfoSchemaExpired) c.Assert(int(terror.ToSQLError(ErrInfoSchemaChanged).Code), Equals, errno.ErrInfoSchemaChanged) } + +func (*testSuite) TestServerIDConstant(c *C) { + c.Assert(lostConnectionToPDTimeout, Less, serverIDTTL) +} diff --git a/domain/global_vars_cache.go b/domain/global_vars_cache.go index fb922317793e1..52aa12a5ac955 100644 --- a/domain/global_vars_cache.go +++ b/domain/global_vars_cache.go @@ -39,7 +39,8 @@ type GlobalVariableCache struct { SingleFight singleflight.Group } -const globalVariableCacheExpiry = 2 * time.Second +// GlobalVariableCacheExpiry is the global variable cache TTL. +const GlobalVariableCacheExpiry = 2 * time.Second // Update updates the global variable cache. func (gvc *GlobalVariableCache) Update(rows []chunk.Row, fields []*ast.ResultField) { @@ -56,7 +57,7 @@ func (gvc *GlobalVariableCache) Update(rows []chunk.Row, fields []*ast.ResultFie func (gvc *GlobalVariableCache) Get() (succ bool, rows []chunk.Row, fields []*ast.ResultField) { gvc.RLock() defer gvc.RUnlock() - if time.Since(gvc.lastModify) < globalVariableCacheExpiry { + if time.Since(gvc.lastModify) < GlobalVariableCacheExpiry { succ, rows, fields = !gvc.disable, gvc.rows, gvc.fields return } diff --git a/domain/global_vars_cache_test.go b/domain/global_vars_cache_test.go index 1987bd5229fed..7358d709986af 100644 --- a/domain/global_vars_cache_test.go +++ b/domain/global_vars_cache_test.go @@ -41,7 +41,10 @@ func (gvcSuite *testGVCSuite) TestSimple(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() ddlLease := 50 * time.Millisecond dom := NewDomain(store, ddlLease, 0, 0, mockFactory) err = dom.Init(ddlLease, sysMockFactory) @@ -175,7 +178,10 @@ func (gvcSuite *testGVCSuite) TestCheckEnableStmtSummary(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() ddlLease := 50 * time.Millisecond dom := NewDomain(store, ddlLease, 0, 0, mockFactory) err = dom.Init(ddlLease, sysMockFactory) @@ -197,7 +203,8 @@ func (gvcSuite *testGVCSuite) TestCheckEnableStmtSummary(c *C) { Collate: charset.CollationBin, } - stmtsummary.StmtSummaryByDigestMap.SetEnabled("0", false) + err = stmtsummary.StmtSummaryByDigestMap.SetEnabled("0", false) + c.Assert(err, IsNil) ck := chunk.NewChunkWithCapacity([]*types.FieldType{ft, ft1}, 1024) ck.AppendString(0, variable.TiDBEnableStmtSummary) ck.AppendString(1, "1") diff --git a/domain/infosync/info.go b/domain/infosync/info.go index 0660a3d583624..02f7b95cd175e 100644 --- a/domain/infosync/info.go +++ b/domain/infosync/info.go @@ -37,11 +37,12 @@ import ( "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/sessionctx/binloginfo" - "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv/oracle" util2 "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/pdapi" @@ -79,10 +80,7 @@ const ( ) // ErrPrometheusAddrIsNotSet is the error that Prometheus address is not set in PD and etcd -var ErrPrometheusAddrIsNotSet = terror.ClassDomain.New(errno.ErrPrometheusAddrIsNotSet, errno.MySQLErrName[errno.ErrPrometheusAddrIsNotSet]) - -// errPlacementRulesDisabled is exported for internal usage, indicating PD rejected the request due to disabled placement feature. -var errPlacementRulesDisabled = errors.New("placement rules feature is disabled") +var ErrPrometheusAddrIsNotSet = dbterror.ClassDomain.NewStd(errno.ErrPrometheusAddrIsNotSet) // InfoSyncer stores server info to etcd when the tidb-server starts and delete when tidb-server shuts down. type InfoSyncer struct { @@ -110,6 +108,33 @@ type ServerInfo struct { BinlogStatus string `json:"binlog_status"` StartTimestamp int64 `json:"start_timestamp"` Labels map[string]string `json:"labels"` + // ServerID is a function, to always retrieve latest serverID from `Domain`, + // which will be changed on occasions such as connection to PD is restored after broken. + ServerIDGetter func() uint64 `json:"-"` + + // JSONServerID is `serverID` for json marshal/unmarshal ONLY. + JSONServerID uint64 `json:"server_id"` +} + +// Marshal `ServerInfo` into bytes. +func (info *ServerInfo) Marshal() ([]byte, error) { + info.JSONServerID = info.ServerIDGetter() + infoBuf, err := json.Marshal(info) + if err != nil { + return nil, errors.Trace(err) + } + return infoBuf, nil +} + +// Unmarshal `ServerInfo` from bytes. +func (info *ServerInfo) Unmarshal(v []byte) error { + if err := json.Unmarshal(v, info); err != nil { + return err + } + info.ServerIDGetter = func() uint64 { + return info.JSONServerID + } + return nil } // ServerVersionInfo is the server version and git_hash. @@ -136,10 +161,10 @@ func setGlobalInfoSyncer(is *InfoSyncer) { } // GlobalInfoSyncerInit return a new InfoSyncer. It is exported for testing. -func GlobalInfoSyncerInit(ctx context.Context, id string, etcdCli *clientv3.Client, skipRegisterToDashBoard bool) (*InfoSyncer, error) { +func GlobalInfoSyncerInit(ctx context.Context, id string, serverIDGetter func() uint64, etcdCli *clientv3.Client, skipRegisterToDashBoard bool) (*InfoSyncer, error) { is := &InfoSyncer{ etcdCli: etcdCli, - info: getServerInfo(id), + info: getServerInfo(id, serverIDGetter), serverInfoPath: fmt.Sprintf("%s/%s", ServerInformationPath, id), minStartTSPath: fmt.Sprintf("%s/%s", ServerMinStartTSPath, id), } @@ -168,6 +193,11 @@ func (is *InfoSyncer) SetSessionManager(manager util2.SessionManager) { is.manager = manager } +// GetSessionManager get the session manager. +func (is *InfoSyncer) GetSessionManager() util2.SessionManager { + return is.manager +} + // GetServerInfo gets self server static information. func GetServerInfo() (*ServerInfo, error) { is, err := getGlobalInfoSyncer() @@ -284,11 +314,7 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i url = fmt.Sprintf("%s://%s%s", util2.InternalHTTPSchema(), addr, route) } - if ctx != nil { - req, err = http.NewRequestWithContext(ctx, method, url, body) - } else { - req, err = http.NewRequest(method, url, body) - } + req, err = http.NewRequestWithContext(ctx, method, url, body) if err != nil { return nil, err } @@ -297,6 +323,12 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i } res, err = util2.InternalHTTPClient().Do(req) + failpoint.Inject("FailPlacement", func(val failpoint.Value) { + if val.(bool) { + res = &http.Response{StatusCode: http.StatusNotFound, Body: http.NoBody} + err = nil + } + }) if err == nil { bodyBytes, err := ioutil.ReadAll(res.Body) if err != nil { @@ -304,8 +336,7 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i } if res.StatusCode != http.StatusOK { err = errors.Errorf("%s", bodyBytes) - // ignore if placement rules feature is not enabled - if strings.HasPrefix(err.Error(), `"placement rules feature is disabled"`) { + if res.StatusCode == http.StatusNotFound || res.StatusCode == http.StatusPreconditionFailed { err = nil bodyBytes = nil } @@ -317,61 +348,6 @@ func doRequest(ctx context.Context, addrs []string, route, method string, body i return nil, err } -// GetPlacementRules is used to retrieve placement rules from PD. -func GetPlacementRules(ctx context.Context) ([]*placement.RuleOp, error) { - is, err := getGlobalInfoSyncer() - if err != nil { - return nil, err - } - - if is.etcdCli == nil { - return nil, nil - } - - addrs := is.etcdCli.Endpoints() - - if len(addrs) == 0 { - return nil, errors.Errorf("pd unavailable") - } - - rules := []*placement.RuleOp{} - res, err := doRequest(ctx, addrs, path.Join(pdapi.Config, "rules"), http.MethodGet, nil) - if err == nil && res != nil { - err = json.Unmarshal(res, &rules) - } - return rules, err -} - -// UpdatePlacementRules is used to notify PD changes of placement rules. -func UpdatePlacementRules(ctx context.Context, rules []*placement.RuleOp) error { - if len(rules) == 0 { - return nil - } - - is, err := getGlobalInfoSyncer() - if err != nil { - return err - } - - if is.etcdCli == nil { - return nil - } - - addrs := is.etcdCli.Endpoints() - - if len(addrs) == 0 { - return errors.Errorf("pd unavailable") - } - - b, err := json.Marshal(rules) - if err != nil { - return err - } - - _, err = doRequest(ctx, addrs, path.Join(pdapi.Config, "rules/batch"), http.MethodPost, bytes.NewReader(b)) - return err -} - // GetAllRuleBundles is used to get all rule bundles from PD. It is used to load full rules from PD while fullload infoschema. func GetAllRuleBundles(ctx context.Context) ([]*placement.Bundle, error) { is, err := getGlobalInfoSyncer() @@ -456,7 +432,7 @@ func PutRuleBundles(ctx context.Context, bundles []*placement.Bundle) error { func (is *InfoSyncer) getAllServerInfo(ctx context.Context) (map[string]*ServerInfo, error) { allInfo := make(map[string]*ServerInfo) if is.etcdCli == nil { - allInfo[is.info.ID] = getServerInfo(is.info.ID) + allInfo[is.info.ID] = getServerInfo(is.info.ID, is.info.ServerIDGetter) return allInfo, nil } allInfo, err := getInfo(ctx, is.etcdCli, ServerInformationPath, keyOpDefaultRetryCnt, keyOpDefaultTimeout, clientv3.WithPrefix()) @@ -466,12 +442,12 @@ func (is *InfoSyncer) getAllServerInfo(ctx context.Context) (map[string]*ServerI return allInfo, nil } -// storeServerInfo stores self server static information to etcd. -func (is *InfoSyncer) storeServerInfo(ctx context.Context) error { +// StoreServerInfo stores self server static information to etcd. +func (is *InfoSyncer) StoreServerInfo(ctx context.Context) error { if is.etcdCli == nil { return nil } - infoBuf, err := json.Marshal(is.info) + infoBuf, err := is.info.Marshal() if err != nil { return errors.Trace(err) } @@ -574,15 +550,15 @@ func (is *InfoSyncer) ReportMinStartTS(store kv.Storage) { pl := is.manager.ShowProcessList() // Calculate the lower limit of the start timestamp to avoid extremely old transaction delaying GC. - currentVer, err := store.CurrentVersion() + currentVer, err := store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { logutil.BgLogger().Error("update minStartTS failed", zap.Error(err)) return } now := time.Unix(0, oracle.ExtractPhysical(currentVer.Ver)*1e6) - startTSLowerLimit := variable.GoTimeToTS(now.Add(-time.Duration(kv.MaxTxnTimeUse) * time.Millisecond)) + startTSLowerLimit := oracle.GoTimeToTS(now.Add(-time.Duration(kv.MaxTxnTimeUse) * time.Millisecond)) - minStartTS := variable.GoTimeToTS(now) + minStartTS := oracle.GoTimeToTS(now) for _, info := range pl { if info.CurTxnStartTS > startTSLowerLimit && info.CurTxnStartTS < minStartTS { minStartTS = info.CurTxnStartTS @@ -635,10 +611,10 @@ func (is *InfoSyncer) newSessionAndStoreServerInfo(ctx context.Context, retryCnt is.session = session binloginfo.RegisterStatusListener(func(status binloginfo.BinlogStatus) error { is.info.BinlogStatus = status.String() - err := is.storeServerInfo(ctx) + err := is.StoreServerInfo(ctx) return errors.Trace(err) }) - return is.storeServerInfo(ctx) + return is.StoreServerInfo(ctx) } // newTopologySessionAndStoreServerInfo creates a new etcd session and stores server info to etcd. @@ -695,8 +671,12 @@ type metricStorage struct { func (is *InfoSyncer) getPrometheusAddr() (string, error) { // Get PD servers info. - pdAddrs := is.etcdCli.Endpoints() - if len(pdAddrs) == 0 { + clientAvailable := is.etcdCli != nil + var pdAddrs []string + if clientAvailable { + pdAddrs = is.etcdCli.Endpoints() + } + if !clientAvailable || len(pdAddrs) == 0 { return "", errors.Errorf("pd unavailable") } @@ -778,7 +758,7 @@ func getInfo(ctx context.Context, etcdCli *clientv3.Client, key string, retryCnt info := &ServerInfo{ BinlogStatus: binloginfo.BinlogStatusUnknown.String(), } - err = json.Unmarshal(kv.Value, info) + err = info.Unmarshal(kv.Value) if err != nil { logutil.BgLogger().Info("get key failed", zap.String("key", string(kv.Key)), zap.ByteString("value", kv.Value), zap.Error(err)) @@ -792,7 +772,7 @@ func getInfo(ctx context.Context, etcdCli *clientv3.Client, key string, retryCnt } // getServerInfo gets self tidb server information. -func getServerInfo(id string) *ServerInfo { +func getServerInfo(id string, serverIDGetter func() uint64) *ServerInfo { cfg := config.GetGlobalConfig() info := &ServerInfo{ ID: id, @@ -803,10 +783,13 @@ func getServerInfo(id string) *ServerInfo { BinlogStatus: binloginfo.GetStatus().String(), StartTimestamp: time.Now().Unix(), Labels: cfg.Labels, + ServerIDGetter: serverIDGetter, } info.Version = mysql.ServerVersion info.GitHash = versioninfo.TiDBGitHash + metrics.ServerInfo.WithLabelValues(mysql.TiDBReleaseVersion, info.GitHash).Set(float64(info.StartTimestamp)) + failpoint.Inject("mockServerInfo", func(val failpoint.Value) { if val.(bool) { info.StartTimestamp = 1282967700000 diff --git a/domain/infosync/info_test.go b/domain/infosync/info_test.go index a3a67564b8ac5..5be3d368b5524 100644 --- a/domain/infosync/info_test.go +++ b/domain/infosync/info_test.go @@ -87,10 +87,18 @@ func TestTopology(t *testing.T) { cli := clus.RandClient() - failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockServerInfo", "return(true)") - defer failpoint.Disable("github.com/pingcap/tidb/domain/infosync/mockServerInfo") + err := failpoint.Enable("github.com/pingcap/tidb/domain/infosync/mockServerInfo", "return(true)") + if err != nil { + t.Fatal(err) + } + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/domain/infosync/mockServerInfo") + if err != nil { + t.Fatal(err) + } + }() - info, err := GlobalInfoSyncerInit(ctx, currentID, cli, false) + info, err := GlobalInfoSyncerInit(ctx, currentID, func() uint64 { return 1 }, cli, false) if err != nil { t.Fatal(err) } diff --git a/domain/schema_validator.go b/domain/schema_validator.go index b81855283f05e..b983eff1d6203 100644 --- a/domain/schema_validator.go +++ b/domain/schema_validator.go @@ -18,6 +18,7 @@ import ( "sync" "time" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/variable" @@ -153,6 +154,12 @@ func (s *schemaValidator) Update(leaseGrantTS uint64, oldVer, currVer int64, cha tblIDs = change.PhyTblIDS actionTypes = change.ActionTypes } + for idx, ac := range actionTypes { + // NOTE: ac is not an action type, it is (1 << action type). + if ac == 1<= D (column '%-.192s').", - ErrWrongLockOfSystemTable: "You can't combine write-locking of system tables with other tables or lock types", - ErrConnectToForeignDataSource: "Unable to connect to foreign data source: %.64s", - ErrQueryOnForeignDataSource: "There was a problem processing the query on the foreign data source. Data source : %-.64s", - ErrForeignDataSourceDoesntExist: "The foreign data source you are trying to reference does not exist. Data source : %-.64s", - ErrForeignDataStringInvalidCantCreate: "Can't create federated table. The data source connection string '%-.64s' is not in the correct format", - ErrForeignDataStringInvalid: "The data source connection string '%-.64s' is not in the correct format", - ErrCantCreateFederatedTable: "Can't create federated table. Foreign data src : %-.64s", - ErrTrgInWrongSchema: "Trigger in wrong schema", - ErrStackOverrunNeedMore: "Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", - ErrTooLongBody: "Routine body for '%-.100s' is too long", - ErrWarnCantDropDefaultKeycache: "Cannot drop default keycache", - ErrTooBigDisplaywidth: "Display width out of range for column '%-.192s' (max = %d)", - ErrXaerDupid: "XAERDUPID: The XID already exists", - ErrDatetimeFunctionOverflow: "Datetime function: %-.32s field overflow", - ErrCantUpdateUsedTableInSfOrTrg: "Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", - ErrViewPreventUpdate: "The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", - ErrPsNoRecursion: "The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", - ErrSpCantSetAutocommit: "Not allowed to set autocommit from a stored function or trigger", - ErrMalformedDefiner: "Definer is not fully qualified", - ErrViewFrmNoUser: "View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", - ErrViewOtherUser: "You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", - ErrNoSuchUser: "The user specified as a definer ('%-.64s'@'%-.64s') does not exist", - ErrForbidSchemaChange: "Changing schema from '%-.192s' to '%-.192s' is not allowed.", - ErrRowIsReferenced2: "Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", - ErrNoReferencedRow2: "Cannot add or update a child row: a foreign key constraint fails (%.192s)", - ErrSpBadVarShadow: "Variable '%-.64s' must be quoted with `...`, or renamed", - ErrTrgNoDefiner: "No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", - ErrOldFileFormat: "'%-.192s' has an old format, you should re-create the '%s' object(s)", - ErrSpRecursionLimit: "Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", - ErrSpProcTableCorrupt: "Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", - ErrSpWrongName: "Incorrect routine name '%-.192s'", - ErrTableNeedsUpgrade: "Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", - ErrSpNoAggregate: "AGGREGATE is not supported for stored functions", - ErrMaxPreparedStmtCountReached: "Can't create more than maxPreparedStmtCount statements (current value: %d)", - ErrViewRecursive: "`%-.192s`.`%-.192s` contains view recursion", - ErrNonGroupingFieldUsed: "Non-grouping field '%-.192s' is used in %-.64s clause", - ErrTableCantHandleSpkeys: "The used table type doesn't support SPATIAL indexes", - ErrNoTriggersOnSystemSchema: "Triggers can not be created on system tables", - ErrRemovedSpaces: "Leading spaces are removed from name '%s'", - ErrAutoincReadFailed: "Failed to read auto-increment value from storage engine", - ErrUsername: "user name", - ErrHostname: "host name", - ErrWrongStringLength: "String '%-.70s' is too long for %s (should be no longer than %d)", - ErrNonInsertableTable: "The target table %-.100s of the %s is not insertable-into", - ErrAdminWrongMrgTable: "Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", - ErrTooHighLevelOfNestingForSelect: "Too high level of nesting for select", - ErrNameBecomesEmpty: "Name '%-.64s' has become ''", - ErrAmbiguousFieldTerm: "First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", - ErrForeignServerExists: "The foreign server, %s, you are trying to create already exists.", - ErrForeignServerDoesntExist: "The foreign server name you are trying to reference does not exist. Data source : %-.64s", - ErrIllegalHaCreateOption: "Table storage engine '%-.64s' does not support the create option '%.64s'", - ErrPartitionRequiresValues: "Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", - ErrPartitionWrongValues: "Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", - ErrPartitionMaxvalue: "MAXVALUE can only be used in last partition definition", - ErrPartitionSubpartition: "Subpartitions can only be hash partitions and by key", - ErrPartitionSubpartMix: "Must define subpartitions on all partitions if on one partition", - ErrPartitionWrongNoPart: "Wrong number of partitions defined, mismatch with previous setting", - ErrPartitionWrongNoSubpart: "Wrong number of subpartitions defined, mismatch with previous setting", - ErrWrongExprInPartitionFunc: "Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", - ErrNoConstExprInRangeOrList: "Expression in RANGE/LIST VALUES must be constant", - ErrFieldNotFoundPart: "Field in list of fields for partition function not found in table", - ErrListOfFieldsOnlyInHash: "List of fields is only allowed in KEY partitions", - ErrInconsistentPartitionInfo: "The partition info in the frm file is not consistent with what can be written into the frm file", - ErrPartitionFuncNotAllowed: "The %-.192s function returns the wrong type", - ErrPartitionsMustBeDefined: "For %-.64s partitions each partition must be defined", - ErrRangeNotIncreasing: "VALUES LESS THAN value must be strictly increasing for each partition", - ErrInconsistentTypeOfFunctions: "VALUES value must be of same type as partition function", - ErrMultipleDefConstInListPart: "Multiple definition of same constant in list partitioning", - ErrPartitionEntry: "Partitioning can not be used stand-alone in query", - ErrMixHandler: "The mix of handlers in the partitions is not allowed in this version of MySQL", - ErrPartitionNotDefined: "For the partitioned engine it is necessary to define all %-.64s", - ErrTooManyPartitions: "Too many partitions (including subpartitions) were defined", - ErrSubpartition: "It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", - ErrCantCreateHandlerFile: "Failed to create specific handler file", - ErrBlobFieldInPartFunc: "A BLOB field is not allowed in partition function", - ErrUniqueKeyNeedAllFieldsInPf: "A %-.192s must include all columns in the table's partitioning function", - ErrNoParts: "Number of %-.64s = 0 is not an allowed value", - ErrPartitionMgmtOnNonpartitioned: "Partition management on a not partitioned table is not possible", - ErrForeignKeyOnPartitioned: "Foreign key clause is not yet supported in conjunction with partitioning", - ErrDropPartitionNonExistent: "Error in list of partitions to %-.64s", - ErrDropLastPartition: "Cannot remove all partitions, use DROP TABLE instead", - ErrCoalesceOnlyOnHashPartition: "COALESCE PARTITION can only be used on HASH/KEY partitions", - ErrReorgHashOnlyOnSameNo: "REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", - ErrReorgNoParam: "REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", - ErrOnlyOnRangeListPartition: "%-.64s PARTITION can only be used on RANGE/LIST partitions", - ErrAddPartitionSubpart: "Trying to Add partition(s) with wrong number of subpartitions", - ErrAddPartitionNoNewPartition: "At least one partition must be added", - ErrCoalescePartitionNoPartition: "At least one partition must be coalesced", - ErrReorgPartitionNotExist: "More partitions to reorganize than there are partitions", - ErrSameNamePartition: "Duplicate partition name %-.192s", - ErrNoBinlog: "It is not allowed to shut off binlog on this command", - ErrConsecutiveReorgPartitions: "When reorganizing a set of partitions they must be in consecutive order", - ErrReorgOutsideRange: "Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", - ErrPartitionFunctionFailure: "Partition function not supported in this version for this handler", - ErrPartState: "Partition state cannot be defined from CREATE/ALTER TABLE", - ErrLimitedPartRange: "The %-.64s handler only supports 32 bit integers in VALUES", - ErrPluginIsNotLoaded: "Plugin '%-.192s' is not loaded", - ErrWrongValue: "Incorrect %-.32s value: '%-.128s'", - ErrNoPartitionForGivenValue: "Table has no partition for value %-.64s", - ErrFilegroupOptionOnlyOnce: "It is not allowed to specify %s more than once", - ErrCreateFilegroupFailed: "Failed to create %s", - ErrDropFilegroupFailed: "Failed to drop %s", - ErrTablespaceAutoExtend: "The handler doesn't support autoextend of tablespaces", - ErrWrongSizeNumber: "A size parameter was incorrectly specified, either number or on the form 10M", - ErrSizeOverflow: "The size number was correct but we don't allow the digit part to be more than 2 billion", - ErrAlterFilegroupFailed: "Failed to alter: %s", - ErrBinlogRowLoggingFailed: "Writing one row to the row-based binary log failed", - ErrEventAlreadyExists: "Event '%-.192s' already exists", - ErrEventStoreFailed: "Failed to store event %s. Error code %d from storage engine.", - ErrEventDoesNotExist: "Unknown event '%-.192s'", - ErrEventCantAlter: "Failed to alter event '%-.192s'", - ErrEventDropFailed: "Failed to drop %s", - ErrEventIntervalNotPositiveOrTooBig: "INTERVAL is either not positive or too big", - ErrEventEndsBeforeStarts: "ENDS is either invalid or before STARTS", - ErrEventExecTimeInThePast: "Event execution time is in the past. Event has been disabled", - ErrEventOpenTableFailed: "Failed to open mysql.event", - ErrEventNeitherMExprNorMAt: "No datetime expression provided", - ErrObsoleteColCountDoesntMatchCorrupted: "Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ErrObsoleteCannotLoadFromTable: "Cannot load from mysql.%s. The table is probably corrupted", - ErrEventCannotDelete: "Failed to delete the event from mysql.event", - ErrEventCompile: "Error during compilation of event's body", - ErrEventSameName: "Same old and new event name", - ErrEventDataTooLong: "Data for column '%s' too long", - ErrDropIndexFk: "Cannot drop index '%-.192s': needed in a foreign key constraint", - ErrWarnDeprecatedSyntaxWithVer: "The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", - ErrCantWriteLockLogTable: "You can't write-lock a log table. Only read access is possible", - ErrCantLockLogTable: "You can't use locks with log tables.", - ErrForeignDuplicateKeyOldUnused: "Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", - ErrColCountDoesntMatchPleaseUpdate: "Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", - ErrTempTablePreventsSwitchOutOfRbr: "Cannot switch out of the row-based binary log format when the session has open temporary tables", - ErrStoredFunctionPreventsSwitchBinlogFormat: "Cannot change the binary logging format inside a stored function or trigger", - ErrNdbCantSwitchBinlogFormat: "The NDB cluster engine does not support changing the binlog format on the fly yet", - ErrPartitionNoTemporary: "Cannot create temporary table with partitions", - ErrPartitionConstDomain: "Partition constant is out of partition function domain", - ErrPartitionFunctionIsNotAllowed: "This partition function is not allowed", - ErrDdlLog: "Error in DDL log", - ErrNullInValuesLessThan: "Not allowed to use NULL value in VALUES LESS THAN", - ErrWrongPartitionName: "Incorrect partition name", - ErrCantChangeTxCharacteristics: "Transaction characteristics can't be changed while a transaction is in progress", - ErrDupEntryAutoincrementCase: "ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", - ErrEventModifyQueue: "Internal scheduler error %d", - ErrEventSetVar: "Error during starting/stopping of the scheduler. Error code %d", - ErrPartitionMerge: "Engine cannot be used in partitioned tables", - ErrCantActivateLog: "Cannot activate '%-.64s' log", - ErrRbrNotAvailable: "The server was not built with row-based replication", - ErrBase64Decode: "Decoding of base64 string failed", - ErrEventRecursionForbidden: "Recursion of EVENT DDL statements is forbidden when body is present", - ErrEventsDB: "Cannot proceed because system tables used by Event Scheduler were found damaged at server start", - ErrOnlyIntegersAllowed: "Only integers allowed as number here", - ErrUnsuportedLogEngine: "This storage engine cannot be used for log tables\"", - ErrBadLogStatement: "You cannot '%s' a log table if logging is enabled", - ErrCantRenameLogTable: "Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", - ErrWrongParamcountToNativeFct: "Incorrect parameter count in the call to native function '%-.192s'", - ErrWrongParametersToNativeFct: "Incorrect parameters in the call to native function '%-.192s'", - ErrWrongParametersToStoredFct: "Incorrect parameters in the call to stored function '%-.192s'", - ErrNativeFctNameCollision: "This function '%-.192s' has the same name as a native function", - ErrDupEntryWithKeyName: "Duplicate entry '%-.64s' for key '%-.192s'", - ErrBinlogPurgeEmFile: "Too many files opened, please execute the command again", - ErrEventCannotCreateInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", - ErrEventCannotAlterInThePast: "Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", - ErrNoPartitionForGivenValueSilent: "Table has no partition for some existing values", - ErrBinlogUnsafeStatement: "Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", - ErrBinlogLoggingImpossible: "Binary logging not possible. Message: %s", - ErrViewNoCreationCtx: "View `%-.64s`.`%-.64s` has no creation context", - ErrViewInvalidCreationCtx: "Creation context of view `%-.64s`.`%-.64s' is invalid", - ErrSrInvalidCreationCtx: "Creation context of stored routine `%-.64s`.`%-.64s` is invalid", - ErrTrgCorruptedFile: "Corrupted TRG file for table `%-.64s`.`%-.64s`", - ErrTrgNoCreationCtx: "Triggers for table `%-.64s`.`%-.64s` have no creation context", - ErrTrgInvalidCreationCtx: "Trigger creation context of table `%-.64s`.`%-.64s` is invalid", - ErrEventInvalidCreationCtx: "Creation context of event `%-.64s`.`%-.64s` is invalid", - ErrTrgCantOpenTable: "Cannot open table for trigger `%-.64s`.`%-.64s`", - ErrCantCreateSroutine: "Cannot create stored routine `%-.64s`. Check warnings", - ErrNoFormatDescriptionEventBeforeBinlogStatement: "The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", - ErrLoadDataInvalidColumn: "Invalid column reference (%-.64s) in LOAD DATA", - ErrLogPurgeNoFile: "Being purged log %s was not found", - ErrXaRbtimeout: "XARBTIMEOUT: Transaction branch was rolled back: took too long", - ErrXaRbdeadlock: "XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", - ErrNeedReprepare: "Prepared statement needs to be re-prepared", - ErrDelayedNotSupported: "DELAYED option not supported for table '%-.192s'", - WarnOptionIgnored: "<%-.64s> option ignored", - WarnPluginDeleteBuiltin: "Built-in plugins cannot be deleted", - WarnPluginBusy: "Plugin is busy and will be uninstalled on shutdown", - ErrVariableIsReadonly: "%s variable '%s' is read-only. Use SET %s to assign the value", - ErrWarnEngineTransactionRollback: "Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", - ErrNdbReplicationSchema: "Bad schema for mysql.ndbReplication table. Message: %-.64s", - ErrConflictFnParse: "Error in parsing conflict function. Message: %-.64s", - ErrExceptionsWrite: "Write to exceptions table failed. Message: %-.128s\"", - ErrTooLongTableComment: "Comment for table '%-.64s' is too long (max = %d)", - ErrTooLongFieldComment: "Comment for field '%-.64s' is too long (max = %d)", - ErrFuncInexistentNameCollision: "FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", - ErrDatabaseName: "Database", - ErrTableName: "Table", - ErrPartitionName: "Partition", - ErrSubpartitionName: "Subpartition", - ErrTemporaryName: "Temporary", - ErrRenamedName: "Renamed", - ErrTooManyConcurrentTrxs: "Too many active concurrent transactions", - WarnNonASCIISeparatorNotImplemented: "Non-ASCII separator arguments are not fully supported", - ErrDebugSyncTimeout: "debug sync point wait timed out", - ErrDebugSyncHitLimit: "debug sync point hit limit reached", - ErrDupSignalSet: "Duplicate condition information item '%s'", - ErrSignalWarn: "Unhandled user-defined warning condition", - ErrSignalNotFound: "Unhandled user-defined not found condition", - ErrSignalException: "Unhandled user-defined exception condition", - ErrResignalWithoutActiveHandler: "RESIGNAL when handler not active", - ErrSignalBadConditionType: "SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", - WarnCondItemTruncated: "Data truncated for condition item '%s'", - ErrCondItemTooLong: "Data too long for condition item '%s'", - ErrUnknownLocale: "Unknown locale: '%-.64s'", - ErrQueryCacheDisabled: "Query cache is disabled; restart the server with queryCacheType=1 to enable it", - ErrSameNamePartitionField: "Duplicate partition field name '%-.192s'", - ErrPartitionColumnList: "Inconsistency in usage of column lists for partitioning", - ErrWrongTypeColumnValue: "Partition column values of incorrect type", - ErrTooManyPartitionFuncFields: "Too many fields in '%-.192s'", - ErrMaxvalueInValuesIn: "Cannot use MAXVALUE as value in VALUES IN", - ErrTooManyValues: "Cannot have more than one value for this type of %-.64s partitioning", - ErrRowSinglePartitionField: "Row expressions in VALUES IN only allowed for multi-field column partitioning", - ErrFieldTypeNotAllowedAsPartitionField: "Field '%-.192s' is of a not allowed type for this type of partitioning", - ErrPartitionFieldsTooLong: "The total length of the partitioning fields is too large", - ErrBinlogRowEngineAndStmtEngine: "Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", - ErrBinlogRowModeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", - ErrBinlogUnsafeAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", - ErrBinlogRowInjectionAndStmtEngine: "Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", - ErrBinlogStmtModeAndRowEngine: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", - ErrBinlogRowInjectionAndStmtMode: "Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", - ErrBinlogMultipleEnginesAndSelfLoggingEngine: "Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", - ErrBinlogUnsafeLimit: "The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", - ErrBinlogUnsafeInsertDelayed: "The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", - ErrBinlogUnsafeAutoincColumns: "Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", - ErrBinlogUnsafeNontransAfterTrans: "Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", - ErrMessageAndStatement: "%s Statement: %s", - ErrInsideTransactionPreventsSwitchBinlogFormat: "Cannot modify @@session.binlogFormat inside a transaction", - ErrPathLength: "The path specified for %.64s is too long.", - ErrWarnDeprecatedSyntaxNoReplacement: "'%s' is deprecated and will be removed in a future release.", - ErrWrongNativeTableStructure: "Native table '%-.64s'.'%-.64s' has the wrong structure", - ErrWrongPerfSchemaUsage: "Invalid performanceSchema usage.", - ErrWarnISSkippedTable: "Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", - ErrInsideTransactionPreventsSwitchBinlogDirect: "Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", - ErrStoredFunctionPreventsSwitchBinlogDirect: "Cannot change the binlog direct flag inside a stored function or trigger", - ErrSpatialMustHaveGeomCol: "A SPATIAL index may only contain a geometrical type column", - ErrTooLongIndexComment: "Comment for index '%-.64s' is too long (max = %d)", - ErrLockAborted: "Wait on a lock was aborted due to a pending exclusive lock", - ErrDataOutOfRange: "%s value is out of range in '%s'", - ErrWrongSpvarTypeInLimit: "A variable of a non-integer based type in LIMIT clause", - ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: "Mixing self-logging and non-self-logging engines in a statement is unsafe.", - ErrBinlogUnsafeMixedStatement: "Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", - ErrInsideTransactionPreventsSwitchSQLLogBin: "Cannot modify @@session.sqlLogBin inside a transaction", - ErrStoredFunctionPreventsSwitchSQLLogBin: "Cannot change the sqlLogBin inside a stored function or trigger", - ErrFailedReadFromParFile: "Failed to read from the .par file", - ErrValuesIsNotIntType: "VALUES value for partition '%-.64s' must have type INT", - ErrAccessDeniedNoPassword: "Access denied for user '%-.48s'@'%-.64s'", - ErrSetPasswordAuthPlugin: "SET PASSWORD has no significance for users authenticating via plugins", - ErrGrantPluginUserExists: "GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", - ErrTruncateIllegalFk: "Cannot truncate a table referenced in a foreign key constraint (%.192s)", - ErrPluginIsPermanent: "Plugin '%s' is forcePlusPermanent and can not be unloaded", - ErrStmtCacheFull: "Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", - ErrMultiUpdateKeyConflict: "Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", - ErrTableNeedsRebuild: "Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", - WarnOptionBelowLimit: "The value of '%s' should be no less than the value of '%s'", - ErrIndexColumnTooLong: "Index column size too large. The maximum column size is %d bytes.", - ErrErrorInTriggerBody: "Trigger '%-.64s' has an error in its body: '%-.256s'", - ErrErrorInUnknownTriggerBody: "Unknown trigger has an error in its body: '%-.256s'", - ErrIndexCorrupt: "Index %s is corrupted", - ErrUndoRecordTooBig: "Undo log record is too big.", - ErrPluginNoUninstall: "Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", - ErrPluginNoInstall: "Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", - ErrBinlogUnsafeInsertTwoKeys: "INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", - ErrTableInFkCheck: "Table is being used in foreign key check.", - ErrUnsupportedEngine: "Storage engine '%s' does not support system tables. [%s.%s]", - ErrBinlogUnsafeAutoincNotFirst: "INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", - ErrCannotLoadFromTableV2: "Cannot load from %s.%s. The table is probably corrupted", - ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: "Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", - ErrPartitionExchangeDifferentOption: "Non matching attribute '%-.64s' between partition and table", - ErrPartitionExchangePartTable: "Table to exchange with partition is partitioned: '%-.64s'", - ErrPartitionExchangeTempTable: "Table to exchange with partition is temporary: '%-.64s'", - ErrPartitionInsteadOfSubpartition: "Subpartitioned table, use subpartition instead of partition", - ErrUnknownPartition: "Unknown partition '%-.64s' in table '%-.64s'", - ErrTablesDifferentMetadata: "Tables have different definitions", - ErrRowDoesNotMatchPartition: "Found a row that does not match the partition", - ErrBinlogCacheSizeGreaterThanMax: "Option binlogCacheSize (%d) is greater than maxBinlogCacheSize (%d); setting binlogCacheSize equal to maxBinlogCacheSize.", - ErrWarnIndexNotApplicable: "Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", - ErrPartitionExchangeForeignKey: "Table to exchange with partition has foreign key references: '%-.64s'", - ErrNoSuchKeyValue: "Key value '%-.192s' was not found in table '%-.192s.%-.192s'", - ErrRplInfoDataTooLong: "Data for column '%s' too long", - ErrNetworkReadEventChecksumFailure: "Replication event checksum verification failed while reading from network.", - ErrBinlogReadEventChecksumFailure: "Replication event checksum verification failed while reading from a log file.", - ErrBinlogStmtCacheSizeGreaterThanMax: "Option binlogStmtCacheSize (%d) is greater than maxBinlogStmtCacheSize (%d); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", - ErrCantUpdateTableInCreateTableSelect: "Can't update table '%-.192s' while '%-.192s' is being created.", - ErrPartitionClauseOnNonpartitioned: "PARTITION () clause on non partitioned table", - ErrRowDoesNotMatchGivenPartitionSet: "Found a row not matching the given partition set", - ErrNoSuchPartitionunused: "partition '%-.64s' doesn't exist", - ErrChangeRplInfoRepositoryFailure: "Failure while changing the type of replication repository: %s.", - ErrWarningNotCompleteRollbackWithCreatedTempTable: "The creation of some temporary tables could not be rolled back.", - ErrWarningNotCompleteRollbackWithDroppedTempTable: "Some temporary tables were dropped, but these operations could not be rolled back.", - ErrMtsUpdatedDBsGreaterMax: "The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", - ErrMtsCantParallel: "Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", - ErrMtsInconsistentData: "%s", - ErrFulltextNotSupportedWithPartitioning: "FULLTEXT index is not supported for partitioned tables.", - ErrDaInvalidConditionNumber: "Invalid condition number", - ErrInsecurePlainText: "Sending passwords in plain text without SSL/TLS is extremely insecure.", - ErrForeignDuplicateKeyWithChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", - ErrForeignDuplicateKeyWithoutChildInfo: "Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", - ErrTableHasNoFt: "The table does not have FULLTEXT index to support this query", - ErrVariableNotSettableInSfOrTrigger: "The system variable %.200s cannot be set in stored functions or triggers.", - ErrVariableNotSettableInTransaction: "The system variable %.200s cannot be set when there is an ongoing transaction.", - ErrGtidNextIsNotInGtidNextList: "The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", - ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: "When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", - ErrSetStatementCannotInvokeFunction: "The statement 'SET %.200s' cannot invoke a stored function.", - ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: "The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", - ErrSkippingLoggedTransaction: "Skipping transaction %.200s because it has already been executed and logged.", - ErrMalformedGtidSetSpecification: "Malformed GTID set specification '%.200s'.", - ErrMalformedGtidSetEncoding: "Malformed GTID set encoding.", - ErrMalformedGtidSpecification: "Malformed GTID specification '%.200s'.", - ErrGnoExhausted: "Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", - ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: "Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", - ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: "@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", - ErrCantSetGtidNextToGtidWhenGtidModeIsOff: "@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", - ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: "@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", - ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: "@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", - ErrFoundGtidEventWhenGtidModeIsOff: "Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", - ErrGtidUnsafeNonTransactionalTable: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", - ErrGtidUnsafeCreateSelect: "CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", - ErrGtidUnsafeCreateDropTemporaryTableInTransaction: "When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", - ErrGtidModeCanOnlyChangeOneStepAtATime: "The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", - ErrCantSetGtidNextWhenOwningGtid: "@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", - ErrUnknownExplainFormat: "Unknown EXPLAIN format name: '%s'", - ErrCantExecuteInReadOnlyTransaction: "Cannot execute statement in a READ ONLY transaction.", - ErrTooLongTablePartitionComment: "Comment for table partition '%-.64s' is too long (max = %d)", - ErrInnodbFtLimit: "InnoDB presently supports one FULLTEXT index creation at a time", - ErrInnodbNoFtTempTable: "Cannot create FULLTEXT index on temporary InnoDB table", - ErrInnodbFtWrongDocidColumn: "Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ErrInnodbFtWrongDocidIndex: "Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", - ErrInnodbOnlineLogTooBig: "Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", - ErrUnknownAlterAlgorithm: "Unknown ALGORITHM '%s'", - ErrUnknownAlterLock: "Unknown LOCK type '%s'", - ErrMtsResetWorkers: "Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", - ErrColCountDoesntMatchCorruptedV2: "Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", - ErrDiscardFkChecksRunning: "There is a foreign key check running on table '%-.192s'. Cannot discard the table.", - ErrTableSchemaMismatch: "Schema mismatch (%s)", - ErrTableInSystemTablespace: "Table '%-.192s' in system tablespace", - ErrIoRead: "IO Read : (%d, %s) %s", - ErrIoWrite: "IO Write : (%d, %s) %s", - ErrTablespaceMissing: "Tablespace is missing for table '%-.192s'", - ErrTablespaceExists: "Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", - ErrTablespaceDiscarded: "Tablespace has been discarded for table '%-.192s'", - ErrInternal: "Internal : %s", - ErrInnodbImport: "ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %d : '%s'", - ErrInnodbIndexCorrupt: "Index corrupt: %s", - ErrInvalidYearColumnLength: "Supports only YEAR or YEAR(4) column", - ErrNotValidPassword: "Your password does not satisfy the current policy requirements", - ErrMustChangePassword: "You must SET PASSWORD before executing this statement", - ErrFkNoIndexChild: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", - ErrFkNoIndexParent: "Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", - ErrFkFailAddSystem: "Failed to add the foreign key constraint '%s' to system tables", - ErrFkCannotOpenParent: "Failed to open the referenced table '%s'", - ErrFkIncorrectOption: "Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", - ErrFkDupName: "Duplicate foreign key constraint name '%s'", - ErrPasswordFormat: "The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", - ErrFkColumnCannotDrop: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", - ErrFkColumnCannotDropChild: "Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrFkColumnNotNull: "Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", - ErrDupIndex: "Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", - ErrFkColumnCannotChange: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", - ErrFkColumnCannotChangeChild: "Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrFkCannotDeleteParent: "Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", - ErrMalformedPacket: "Malformed communication packet.", - ErrReadOnlyMode: "Running in read-only mode", - ErrVariableNotSettableInSp: "The system variable %.200s cannot be set in stored procedures.", - ErrCantSetGtidPurgedWhenGtidModeIsOff: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", - ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", - ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: "@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", - ErrGtidPurgedWasChanged: "@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", - ErrGtidExecutedWasChanged: "@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", - ErrBinlogStmtModeAndNoReplTables: "Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", - ErrAlterOperationNotSupported: "%s is not supported for this operation. Try %s.", - ErrAlterOperationNotSupportedReason: "%s is not supported. Reason: %s. Try %s.", - ErrAlterOperationNotSupportedReasonCopy: "COPY algorithm requires a lock", - ErrAlterOperationNotSupportedReasonPartition: "Partition specific operations do not yet support LOCK/ALGORITHM", - ErrAlterOperationNotSupportedReasonFkRename: "Columns participating in a foreign key are renamed", - ErrAlterOperationNotSupportedReasonColumnType: "Cannot change column type INPLACE", - ErrAlterOperationNotSupportedReasonFkCheck: "Adding foreign keys needs foreignKeyChecks=OFF", - ErrAlterOperationNotSupportedReasonIgnore: "Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", - ErrAlterOperationNotSupportedReasonNopk: "Dropping a primary key is not allowed without also adding a new primary key", - ErrAlterOperationNotSupportedReasonAutoinc: "Adding an auto-increment column requires a lock", - ErrAlterOperationNotSupportedReasonHiddenFts: "Cannot replace hidden FTSDOCID with a user-visible one", - ErrAlterOperationNotSupportedReasonChangeFts: "Cannot drop or rename FTSDOCID", - ErrAlterOperationNotSupportedReasonFts: "Fulltext index creation requires a lock", - ErrDupUnknownInIndex: "Duplicate entry for key '%-.192s'", - ErrIdentCausesTooLongPath: "Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", - ErrAlterOperationNotSupportedReasonNotNull: "cannot silently convert NULL values, as required in this SQLMODE", - ErrMustChangePasswordLogin: "Your password has expired. To log in you must change it using a client that supports expired passwords.", - ErrRowInWrongPartition: "Found a row in wrong partition %s", - ErrGeneratedColumnFunctionIsNotAllowed: "Expression of generated column '%s' contains a disallowed function.", - ErrGeneratedColumnRowValueIsNotAllowed: "Expression of generated column '%s' cannot refer to a row value", - ErrUnsupportedAlterInplaceOnVirtualColumn: "INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions.", - ErrWrongFKOptionForGeneratedColumn: "Cannot define foreign key with %s clause on a generated column.", - ErrBadGeneratedColumn: "The value specified for generated column '%s' in table '%s' is not allowed.", - ErrUnsupportedOnGeneratedColumn: "'%s' is not supported for generated columns.", - ErrGeneratedColumnNonPrior: "Generated column can refer only to generated columns defined prior to it.", - ErrDependentByGeneratedColumn: "Column '%s' has a generated column dependency.", - ErrGeneratedColumnRefAutoInc: "Generated column '%s' cannot refer to auto-increment column.", - ErrWarnConflictingHint: "Hint %s is ignored as conflicting/duplicated.", - ErrInvalidFieldSize: "Invalid size for column '%s'.", - ErrInvalidArgumentForLogarithm: "Invalid argument for logarithm", - ErrIncorrectType: "Incorrect type for argument %s in function %s.", - ErrInvalidJSONData: "Invalid JSON data provided to function %s: %s", - ErrInvalidJSONText: "Invalid JSON text: %-.192s", - ErrInvalidJSONPath: "Invalid JSON path expression %s.", - ErrInvalidTypeForJSON: "Invalid data type for JSON data in argument %d to function %s; a JSON string or JSON type is required.", - ErrInvalidJSONPathWildcard: "In this situation, path expressions may not contain the * and ** tokens.", - ErrInvalidJSONContainsPathType: "The second argument can only be either 'one' or 'all'.", - ErrJSONUsedAsKey: "JSON column '%-.192s' cannot be used in key specification.", - ErrJSONDocumentNULLKey: "JSON documents may not contain NULL member names.", - ErrSecureTransportRequired: "Connections using insecure transport are prohibited while --require_secure_transport=ON.", - ErrBadUser: "User %s does not exist.", - ErrUserAlreadyExists: "User %s already exists.", - ErrInvalidJSONPathArrayCell: "A path expression is not a path to a cell in an array.", - ErrInvalidEncryptionOption: "Invalid encryption option.", - ErrPKIndexCantBeInvisible: "A primary key index cannot be invisible", - ErrWindowNoSuchWindow: "Window name '%s' is not defined.", - ErrWindowCircularityInWindowGraph: "There is a circularity in the window dependency graph.", - ErrWindowNoChildPartitioning: "A window which depends on another cannot define partitioning.", - ErrWindowNoInherentFrame: "Window '%s' has a frame definition, so cannot be referenced by another window.", - ErrWindowNoRedefineOrderBy: "Window '%s' cannot inherit '%s' since both contain an ORDER BY clause.", - ErrWindowFrameStartIllegal: "Window '%s': frame start cannot be UNBOUNDED FOLLOWING.", - ErrWindowFrameEndIllegal: "Window '%s': frame end cannot be UNBOUNDED PRECEDING.", - ErrWindowFrameIllegal: "Window '%s': frame start or end is negative, NULL or of non-integral type", - ErrWindowRangeFrameOrderType: "Window '%s' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", - ErrWindowRangeFrameTemporalType: "Window '%s' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.", - ErrWindowRangeFrameNumericType: "Window '%s' with RANGE frame has ORDER BY expression of numeric type, INTERVAL bound value not allowed.", - ErrWindowRangeBoundNotConstant: "Window '%s' has a non-constant frame bound.", - ErrWindowDuplicateName: "Window '%s' is defined twice.", - ErrWindowIllegalOrderBy: "Window '%s': ORDER BY or PARTITION BY uses legacy position indication which is not supported, use expression.", - ErrWindowInvalidWindowFuncUse: "You cannot use the window function '%s' in this context.'", - ErrWindowInvalidWindowFuncAliasUse: "You cannot use the alias '%s' of an expression containing a window function in this context.'", - ErrWindowNestedWindowFuncUseInWindowSpec: "You cannot nest a window function in the specification of window '%s'.", - ErrWindowRowsIntervalUse: "Window '%s': INTERVAL can only be used with RANGE frames.", - ErrWindowNoGroupOrderUnused: "ASC or DESC with GROUP BY isn't allowed with window functions; put ASC or DESC in ORDER BY", - ErrWindowExplainJSON: "To get information about window functions use EXPLAIN FORMAT=JSON", - ErrWindowFunctionIgnoresFrame: "Window function '%s' ignores the frame clause of window '%s' and aggregates over the whole partition", - ErrRoleNotGranted: "%s is is not granted to %s", - ErrMaxExecTimeExceeded: "Query execution was interrupted, max_execution_time exceeded.", - ErrLockAcquireFailAndNoWaitSet: "Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.", - ErrDataTruncatedFunctionalIndex: "Data truncated for functional index '%s' at row %d", - ErrDataOutOfRangeFunctionalIndex: "Value is out of range for functional index '%s' at row %d", - ErrFunctionalIndexOnJSONOrGeometryFunction: "Cannot create a functional index on a function that returns a JSON or GEOMETRY value", - ErrFunctionalIndexRefAutoIncrement: "Functional index '%s' cannot refer to an auto-increment column", - ErrCannotDropColumnFunctionalIndex: "Cannot drop column '%s' because it is used by a functional index. In order to drop the column, you must remove the functional index", - ErrFunctionalIndexPrimaryKey: "The primary key cannot be a functional index", - ErrFunctionalIndexOnLob: "Cannot create a functional index on an expression that returns a BLOB or TEXT. Please consider using CAST", - ErrFunctionalIndexFunctionIsNotAllowed: "Expression of functional index '%s' contains a disallowed function", - ErrFulltextFunctionalIndex: "Fulltext functional index is not supported", - ErrSpatialFunctionalIndex: "Spatial functional index is not supported", - ErrWrongKeyColumnFunctionalIndex: "The used storage engine cannot index the expression '%s'", - ErrFunctionalIndexOnField: "Functional index on a column is not supported. Consider using a regular index instead", - ErrFKIncompatibleColumns: "Referencing column '%s' in foreign key constraint '%s' are incompatible", - ErrFunctionalIndexRowValueIsNotAllowed: "Expression of functional index '%s' cannot refer to a row value", - ErrDependentByFunctionalIndex: "Column '%s' has a functional index dependency and cannot be dropped or renamed", - ErrInvalidJSONValueForFuncIndex: "Invalid JSON value for CAST for functional index '%s'", - ErrJSONValueOutOfRangeForFuncIndex: "Out of range JSON value for CAST for functional index '%s'", - ErrFunctionalIndexDataIsTooLong: "Data too long for functional index '%s'", - ErrFunctionalIndexNotApplicable: "Cannot use functional index '%s' due to type or collation conversion", - ErrUnsupportedConstraintCheck: "%s is not supported", +// Note: all ErrMessage to be added should be considered about the log redaction +// by setting the suitable configuration in the second argument of mysql.Message. +// See https://github.com/pingcap/tidb/blob/master/errno/logredaction.md +var MySQLErrName = map[uint16]*mysql.ErrMessage{ + ErrHashchk: mysql.Message("hashchk", nil), + ErrNisamchk: mysql.Message("isamchk", nil), + ErrNo: mysql.Message("NO", nil), + ErrYes: mysql.Message("YES", nil), + ErrCantCreateFile: mysql.Message("Can't create file '%-.200s' (errno: %d - %s)", nil), + ErrCantCreateTable: mysql.Message("Can't create table '%-.200s' (errno: %d)", nil), + ErrCantCreateDB: mysql.Message("Can't create database '%-.192s' (errno: %d)", nil), + ErrDBCreateExists: mysql.Message("Can't create database '%-.192s'; database exists", nil), + ErrDBDropExists: mysql.Message("Can't drop database '%-.192s'; database doesn't exist", nil), + ErrDBDropDelete: mysql.Message("Error dropping database (can't delete '%-.192s', errno: %d)", nil), + ErrDBDropRmdir: mysql.Message("Error dropping database (can't rmdir '%-.192s', errno: %d)", nil), + ErrCantDeleteFile: mysql.Message("Error on delete of '%-.192s' (errno: %d - %s)", nil), + ErrCantFindSystemRec: mysql.Message("Can't read record in system table", nil), + ErrCantGetStat: mysql.Message("Can't get status of '%-.200s' (errno: %d - %s)", nil), + ErrCantGetWd: mysql.Message("Can't get working directory (errno: %d - %s)", nil), + ErrCantLock: mysql.Message("Can't lock file (errno: %d - %s)", nil), + ErrCantOpenFile: mysql.Message("Can't open file: '%-.200s' (errno: %d - %s)", nil), + ErrFileNotFound: mysql.Message("Can't find file: '%-.200s' (errno: %d - %s)", nil), + ErrCantReadDir: mysql.Message("Can't read dir of '%-.192s' (errno: %d - %s)", nil), + ErrCantSetWd: mysql.Message("Can't change dir to '%-.192s' (errno: %d - %s)", nil), + ErrCheckread: mysql.Message("Record has changed since last read in table '%-.192s'", nil), + ErrDiskFull: mysql.Message("Disk full (%s); waiting for someone to free some space... (errno: %d - %s)", nil), + ErrDupKey: mysql.Message("Can't write; duplicate key in table '%-.192s'", nil), + ErrErrorOnClose: mysql.Message("Error on close of '%-.192s' (errno: %d - %s)", nil), + ErrErrorOnRead: mysql.Message("Error reading file '%-.200s' (errno: %d - %s)", nil), + ErrErrorOnRename: mysql.Message("Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s)", nil), + ErrErrorOnWrite: mysql.Message("Error writing file '%-.200s' (errno: %d - %s)", nil), + ErrFileUsed: mysql.Message("'%-.192s' is locked against change", nil), + ErrFilsortAbort: mysql.Message("Sort aborted", nil), + ErrFormNotFound: mysql.Message("View '%-.192s' doesn't exist for '%-.192s'", nil), + ErrGetErrno: mysql.Message("Got error %d from storage engine", nil), + ErrIllegalHa: mysql.Message("Table storage engine for '%-.192s' doesn't have this option", nil), + ErrKeyNotFound: mysql.Message("Can't find record in '%-.192s'", nil), + ErrNotFormFile: mysql.Message("Incorrect information in file: '%-.200s'", nil), + ErrNotKeyFile: mysql.Message("Incorrect key file for table '%-.200s'; try to repair it", nil), + ErrOldKeyFile: mysql.Message("Old key file for table '%-.192s'; repair it!", nil), + ErrOpenAsReadonly: mysql.Message("Table '%-.192s' is read only", nil), + ErrOutofMemory: mysql.Message("Out of memory; restart server and try again (needed %d bytes)", nil), + ErrOutOfSortMemory: mysql.Message("Out of sort memory, consider increasing server sort buffer size", nil), + ErrUnexpectedEOF: mysql.Message("Unexpected EOF found when reading file '%-.192s' (errno: %d - %s)", nil), + ErrConCount: mysql.Message("Too many connections", nil), + ErrOutOfResources: mysql.Message("Out of memory; check if mysqld or some other process uses all available memory; if not, you may have to use 'ulimit' to allow mysqld to use more memory or you can add more swap space", nil), + ErrBadHost: mysql.Message("Can't get hostname for your address", nil), + ErrHandshake: mysql.Message("Bad handshake", nil), + ErrDBaccessDenied: mysql.Message("Access denied for user '%-.48s'@'%-.64s' to database '%-.192s'", nil), + ErrAccessDenied: mysql.Message("Access denied for user '%-.48s'@'%-.64s' (using password: %s)", nil), + ErrNoDB: mysql.Message("No database selected", nil), + ErrUnknownCom: mysql.Message("Unknown command", nil), + ErrBadNull: mysql.Message("Column '%-.192s' cannot be null", nil), + ErrBadDB: mysql.Message("Unknown database '%-.192s'", nil), + ErrTableExists: mysql.Message("Table '%-.192s' already exists", nil), + ErrBadTable: mysql.Message("Unknown table '%-.100s'", nil), + ErrNonUniq: mysql.Message("Column '%-.192s' in %-.192s is ambiguous", nil), + ErrServerShutdown: mysql.Message("Server shutdown in progress", nil), + ErrBadField: mysql.Message("Unknown column '%-.192s' in '%-.192s'", nil), + ErrFieldNotInGroupBy: mysql.Message("Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by", nil), + ErrWrongGroupField: mysql.Message("Can't group on '%-.192s'", nil), + ErrWrongSumSelect: mysql.Message("Statement has sum functions and columns in same statement", nil), + ErrWrongValueCount: mysql.Message("Column count doesn't match value count", nil), + ErrTooLongIdent: mysql.Message("Identifier name '%-.100s' is too long", nil), + ErrDupFieldName: mysql.Message("Duplicate column name '%-.192s'", nil), + ErrDupKeyName: mysql.Message("Duplicate key name '%-.192s'", nil), + ErrDupEntry: mysql.Message("Duplicate entry '%-.64s' for key '%-.192s'", []int{0}), + ErrWrongFieldSpec: mysql.Message("Incorrect column specifier for column '%-.192s'", nil), + ErrParse: mysql.Message("%s %s", nil), + ErrEmptyQuery: mysql.Message("Query was empty", nil), + ErrNonuniqTable: mysql.Message("Not unique table/alias: '%-.192s'", nil), + ErrInvalidDefault: mysql.Message("Invalid default value for '%-.192s'", nil), + ErrMultiplePriKey: mysql.Message("Multiple primary key defined", nil), + ErrTooManyKeys: mysql.Message("Too many keys specified; max %d keys allowed", nil), + ErrTooManyKeyParts: mysql.Message("Too many key parts specified; max %d parts allowed", nil), + ErrTooLongKey: mysql.Message("Specified key was too long; max key length is %d bytes", nil), + ErrKeyColumnDoesNotExits: mysql.Message("Key column '%-.192s' doesn't exist in table", nil), + ErrBlobUsedAsKey: mysql.Message("BLOB column '%-.192s' can't be used in key specification with the used table type", nil), + ErrTooBigFieldlength: mysql.Message("Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead", nil), + ErrWrongAutoKey: mysql.Message("Incorrect table definition; there can be only one auto column and it must be defined as a key", nil), + ErrReady: mysql.Message("%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d", nil), + ErrNormalShutdown: mysql.Message("%s: Normal shutdown\n", nil), + ErrGotSignal: mysql.Message("%s: Got signal %d. Aborting!\n", nil), + ErrShutdownComplete: mysql.Message("%s: Shutdown complete\n", nil), + ErrForcingClose: mysql.Message("%s: Forcing close of thread %d user: '%-.48s'\n", nil), + ErrIpsock: mysql.Message("Can't create IP socket", nil), + ErrNoSuchIndex: mysql.Message("Table '%-.192s' has no index like the one used in CREATE INDEX; recreate the table", nil), + ErrWrongFieldTerminators: mysql.Message("Field separator argument is not what is expected; check the manual", nil), + ErrBlobsAndNoTerminated: mysql.Message("You can't use fixed rowlength with BLOBs; please use 'fields terminated by'", nil), + ErrTextFileNotReadable: mysql.Message("The file '%-.128s' must be in the database directory or be readable by all", nil), + ErrFileExists: mysql.Message("File '%-.200s' already exists", nil), + ErrLoadInfo: mysql.Message("Records: %d Deleted: %d Skipped: %d Warnings: %d", nil), + ErrAlterInfo: mysql.Message("Records: %d Duplicates: %d", nil), + ErrWrongSubKey: mysql.Message("Incorrect prefix key; the used key part isn't a string, the used length is longer than the key part, or the storage engine doesn't support unique prefix keys", nil), + ErrCantRemoveAllFields: mysql.Message("You can't delete all columns with ALTER TABLE; use DROP TABLE instead", nil), + ErrCantDropFieldOrKey: mysql.Message("Can't DROP '%-.192s'; check that column/key exists", nil), + ErrInsertInfo: mysql.Message("Records: %d Duplicates: %d Warnings: %d", nil), + ErrUpdateTableUsed: mysql.Message("You can't specify target table '%-.192s' for update in FROM clause", nil), + ErrNoSuchThread: mysql.Message("Unknown thread id: %d", nil), + ErrKillDenied: mysql.Message("You are not owner of thread %d", nil), + ErrNoTablesUsed: mysql.Message("No tables used", nil), + ErrTooBigSet: mysql.Message("Too many strings for column %-.192s and SET", nil), + ErrNoUniqueLogFile: mysql.Message("Can't generate a unique log-filename %-.200s.(1-999)\n", nil), + ErrTableNotLockedForWrite: mysql.Message("Table '%-.192s' was locked with a READ lock and can't be updated", nil), + ErrTableNotLocked: mysql.Message("Table '%-.192s' was not locked with LOCK TABLES", nil), + ErrBlobCantHaveDefault: mysql.Message("BLOB/TEXT/JSON column '%-.192s' can't have a default value", nil), + ErrWrongDBName: mysql.Message("Incorrect database name '%-.100s'", nil), + ErrWrongTableName: mysql.Message("Incorrect table name '%-.100s'", nil), + ErrTooBigSelect: mysql.Message("The SELECT would examine more than MAXJOINSIZE rows; check your WHERE and use SET SQLBIGSELECTS=1 or SET MAXJOINSIZE=# if the SELECT is okay", nil), + ErrUnknown: mysql.Message("Unknown error", nil), + ErrUnknownProcedure: mysql.Message("Unknown procedure '%-.192s'", nil), + ErrWrongParamcountToProcedure: mysql.Message("Incorrect parameter count to procedure '%-.192s'", nil), + ErrWrongParametersToProcedure: mysql.Message("Incorrect parameters to procedure '%-.192s'", nil), + ErrUnknownTable: mysql.Message("Unknown table '%-.192s' in %-.32s", nil), + ErrFieldSpecifiedTwice: mysql.Message("Column '%-.192s' specified twice", nil), + ErrInvalidGroupFuncUse: mysql.Message("Invalid use of group function", nil), + ErrUnsupportedExtension: mysql.Message("Table '%-.192s' uses an extension that doesn't exist in this MySQL version", nil), + ErrTableMustHaveColumns: mysql.Message("A table must have at least 1 column", nil), + ErrRecordFileFull: mysql.Message("The table '%-.192s' is full", nil), + ErrUnknownCharacterSet: mysql.Message("Unknown character set: '%-.64s'", nil), + ErrTooManyTables: mysql.Message("Too many tables; MySQL can only use %d tables in a join", nil), + ErrTooManyFields: mysql.Message("Too many columns", nil), + ErrTooBigRowsize: mysql.Message("Row size too large. The maximum row size for the used table type, not counting BLOBs, is %d. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs", nil), + ErrStackOverrun: mysql.Message("Thread stack overrun: Used: %d of a %d stack. Use 'mysqld --threadStack=#' to specify a bigger stack if needed", nil), + ErrWrongOuterJoin: mysql.Message("Cross dependency found in OUTER JOIN; examine your ON conditions", nil), + ErrNullColumnInIndex: mysql.Message("Table handler doesn't support NULL in given index. Please change column '%-.192s' to be NOT NULL or use another handler", nil), + ErrCantFindUdf: mysql.Message("Can't load function '%-.192s'", nil), + ErrCantInitializeUdf: mysql.Message("Can't initialize function '%-.192s'; %-.80s", nil), + ErrUdfNoPaths: mysql.Message("No paths allowed for shared library", nil), + ErrUdfExists: mysql.Message("Function '%-.192s' already exists", nil), + ErrCantOpenLibrary: mysql.Message("Can't open shared library '%-.192s' (errno: %d %-.128s)", nil), + ErrCantFindDlEntry: mysql.Message("Can't find symbol '%-.128s' in library", nil), + ErrFunctionNotDefined: mysql.Message("Function '%-.192s' is not defined", nil), + ErrHostIsBlocked: mysql.Message("Host '%-.64s' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'", nil), + ErrHostNotPrivileged: mysql.Message("Host '%-.64s' is not allowed to connect to this MySQL server", nil), + ErrPasswordAnonymousUser: mysql.Message("You are using MySQL as an anonymous user and anonymous users are not allowed to change passwords", nil), + ErrPasswordNotAllowed: mysql.Message("You must have privileges to update tables in the mysql database to be able to change passwords for others", nil), + ErrPasswordNoMatch: mysql.Message("Can't find any matching row in the user table", nil), + ErrUpdateInfo: mysql.Message("Rows matched: %d Changed: %d Warnings: %d", nil), + ErrCantCreateThread: mysql.Message("Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", nil), + ErrWrongValueCountOnRow: mysql.Message("Column count doesn't match value count at row %d", nil), + ErrCantReopenTable: mysql.Message("Can't reopen table: '%-.192s'", nil), + ErrInvalidUseOfNull: mysql.Message("Invalid use of NULL value", nil), + ErrRegexp: mysql.Message("Got error '%-.64s' from regexp", nil), + ErrMixOfGroupFuncAndFields: mysql.Message("Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause", nil), + ErrNonexistingGrant: mysql.Message("There is no such grant defined for user '%-.48s' on host '%-.64s'", nil), + ErrTableaccessDenied: mysql.Message("%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s'", nil), + ErrColumnaccessDenied: mysql.Message("%-.16s command denied to user '%-.48s'@'%-.64s' for column '%-.192s' in table '%-.192s'", nil), + ErrIllegalGrantForTable: mysql.Message("Illegal GRANT/REVOKE command; please consult the manual to see which privileges can be used", nil), + ErrGrantWrongHostOrUser: mysql.Message("The host or user argument to GRANT is too long", nil), + ErrNoSuchTable: mysql.Message("Table '%-.192s.%-.192s' doesn't exist", nil), + ErrNonexistingTableGrant: mysql.Message("There is no such grant defined for user '%-.48s' on host '%-.64s' on table '%-.192s'", nil), + ErrNotAllowedCommand: mysql.Message("The used command is not allowed with this MySQL version", nil), + ErrSyntax: mysql.Message("You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use", nil), + ErrDelayedCantChangeLock: mysql.Message("Delayed insert thread couldn't get requested lock for table %-.192s", nil), + ErrTooManyDelayedThreads: mysql.Message("Too many delayed threads in use", nil), + ErrAbortingConnection: mysql.Message("Aborted connection %d to db: '%-.192s' user: '%-.48s' (%-.64s)", nil), + ErrNetPacketTooLarge: mysql.Message("Got a packet bigger than 'maxAllowedPacket' bytes", nil), + ErrNetReadErrorFromPipe: mysql.Message("Got a read error from the connection pipe", nil), + ErrNetFcntl: mysql.Message("Got an error from fcntl()", nil), + ErrNetPacketsOutOfOrder: mysql.Message("Got packets out of order", nil), + ErrNetUncompress: mysql.Message("Couldn't uncompress communication packet", nil), + ErrNetRead: mysql.Message("Got an error reading communication packets", nil), + ErrNetReadInterrupted: mysql.Message("Got timeout reading communication packets", nil), + ErrNetErrorOnWrite: mysql.Message("Got an error writing communication packets", nil), + ErrNetWriteInterrupted: mysql.Message("Got timeout writing communication packets", nil), + ErrTooLongString: mysql.Message("Result string is longer than 'maxAllowedPacket' bytes", nil), + ErrTableCantHandleBlob: mysql.Message("The used table type doesn't support BLOB/TEXT columns", nil), + ErrTableCantHandleAutoIncrement: mysql.Message("The used table type doesn't support AUTOINCREMENT columns", nil), + ErrDelayedInsertTableLocked: mysql.Message("INSERT DELAYED can't be used with table '%-.192s' because it is locked with LOCK TABLES", nil), + ErrWrongColumnName: mysql.Message("Incorrect column name '%-.100s'", nil), + ErrWrongKeyColumn: mysql.Message("The used storage engine can't index column '%-.192s'", nil), + ErrWrongMrgTable: mysql.Message("Unable to open underlying table which is differently defined or of non-MyISAM type or doesn't exist", nil), + ErrDupUnique: mysql.Message("Can't write, because of unique constraint, to table '%-.192s'", nil), + ErrBlobKeyWithoutLength: mysql.Message("BLOB/TEXT column '%-.192s' used in key specification without a key length", nil), + ErrPrimaryCantHaveNull: mysql.Message("All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead", nil), + ErrTooManyRows: mysql.Message("Result consisted of more than one row", nil), + ErrRequiresPrimaryKey: mysql.Message("This table type requires a primary key", nil), + ErrNoRaidCompiled: mysql.Message("This version of MySQL is not compiled with RAID support", nil), + ErrUpdateWithoutKeyInSafeMode: mysql.Message("You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column", nil), + ErrKeyDoesNotExist: mysql.Message("Key '%-.192s' doesn't exist in table '%-.192s'", nil), + ErrCheckNoSuchTable: mysql.Message("Can't open table", nil), + ErrCheckNotImplemented: mysql.Message("The storage engine for the table doesn't support %s", nil), + ErrCantDoThisDuringAnTransaction: mysql.Message("You are not allowed to execute this command in a transaction", nil), + ErrErrorDuringCommit: mysql.Message("Got error %d during COMMIT", nil), + ErrErrorDuringRollback: mysql.Message("Got error %d during ROLLBACK", nil), + ErrErrorDuringFlushLogs: mysql.Message("Got error %d during FLUSHLOGS", nil), + ErrErrorDuringCheckpoint: mysql.Message("Got error %d during CHECKPOINT", nil), + ErrNewAbortingConnection: mysql.Message("Aborted connection %d to db: '%-.192s' user: '%-.48s' host: '%-.64s' (%-.64s)", nil), + ErrDumpNotImplemented: mysql.Message("The storage engine for the table does not support binary table dump", nil), + ErrIndexRebuild: mysql.Message("Failed rebuilding the index of dumped table '%-.192s'", nil), + ErrFtMatchingKeyNotFound: mysql.Message("Can't find FULLTEXT index matching the column list", nil), + ErrLockOrActiveTransaction: mysql.Message("Can't execute the given command because you have active locked tables or an active transaction", nil), + ErrUnknownSystemVariable: mysql.Message("Unknown system variable '%-.64s'", nil), + ErrCrashedOnUsage: mysql.Message("Table '%-.192s' is marked as crashed and should be repaired", nil), + ErrCrashedOnRepair: mysql.Message("Table '%-.192s' is marked as crashed and last (automatic?) repair failed", nil), + ErrWarningNotCompleteRollback: mysql.Message("Some non-transactional changed tables couldn't be rolled back", nil), + ErrTransCacheFull: mysql.Message("Multi-statement transaction required more than 'maxBinlogCacheSize' bytes of storage; increase this mysqld variable and try again", nil), + ErrTooManyUserConnections: mysql.Message("User %-.64s already has more than 'maxUserConnections' active connections", nil), + ErrSetConstantsOnly: mysql.Message("You may only use constant expressions with SET", nil), + ErrLockWaitTimeout: mysql.Message("Lock wait timeout exceeded; try restarting transaction", nil), + ErrLockTableFull: mysql.Message("The total number of locks exceeds the lock table size", nil), + ErrReadOnlyTransaction: mysql.Message("Update locks cannot be acquired during a READ UNCOMMITTED transaction", nil), + ErrDropDBWithReadLock: mysql.Message("DROP DATABASE not allowed while thread is holding global read lock", nil), + ErrCreateDBWithReadLock: mysql.Message("CREATE DATABASE not allowed while thread is holding global read lock", nil), + ErrWrongArguments: mysql.Message("Incorrect arguments to %s", nil), + ErrNoPermissionToCreateUser: mysql.Message("'%-.48s'@'%-.64s' is not allowed to create new users", nil), + ErrUnionTablesInDifferentDir: mysql.Message("Incorrect table definition; all MERGE tables must be in the same database", nil), + ErrLockDeadlock: mysql.Message("Deadlock found when trying to get lock; try restarting transaction", nil), + ErrTableCantHandleFt: mysql.Message("The used table type doesn't support FULLTEXT indexes", nil), + ErrCannotAddForeign: mysql.Message("Cannot add foreign key constraint", nil), + ErrNoReferencedRow: mysql.Message("Cannot add or update a child row: a foreign key constraint fails", nil), + ErrRowIsReferenced: mysql.Message("Cannot delete or update a parent row: a foreign key constraint fails", nil), + ErrErrorWhenExecutingCommand: mysql.Message("Error when executing command %s: %-.128s", nil), + ErrWrongUsage: mysql.Message("Incorrect usage of %s and %s", nil), + ErrWrongNumberOfColumnsInSelect: mysql.Message("The used SELECT statements have a different number of columns", nil), + ErrCantUpdateWithReadlock: mysql.Message("Can't execute the query because you have a conflicting read lock", nil), + ErrMixingNotAllowed: mysql.Message("Mixing of transactional and non-transactional tables is disabled", nil), + ErrDupArgument: mysql.Message("Option '%s' used twice in statement", nil), + ErrUserLimitReached: mysql.Message("User '%-.64s' has exceeded the '%s' resource (current value: %d)", nil), + ErrSpecificAccessDenied: mysql.Message("Access denied; you need (at least one of) the %-.128s privilege(s) for this operation", nil), + ErrLocalVariable: mysql.Message("Variable '%-.64s' is a SESSION variable and can't be used with SET GLOBAL", nil), + ErrGlobalVariable: mysql.Message("Variable '%-.64s' is a GLOBAL variable and should be set with SET GLOBAL", nil), + ErrNoDefault: mysql.Message("Variable '%-.64s' doesn't have a default value", nil), + ErrWrongValueForVar: mysql.Message("Variable '%-.64s' can't be set to the value of '%-.200s'", nil), + ErrWrongTypeForVar: mysql.Message("Incorrect argument type to variable '%-.64s'", nil), + ErrVarCantBeRead: mysql.Message("Variable '%-.64s' can only be set, not read", nil), + ErrCantUseOptionHere: mysql.Message("Incorrect usage/placement of '%s'", nil), + ErrNotSupportedYet: mysql.Message("This version of TiDB doesn't yet support '%s'", nil), + ErrIncorrectGlobalLocalVar: mysql.Message("Variable '%-.192s' is a %s variable", nil), + ErrWrongFkDef: mysql.Message("Incorrect foreign key definition for '%-.192s': %s", nil), + ErrKeyRefDoNotMatchTableRef: mysql.Message("Key reference and table reference don't match", nil), + ErrOperandColumns: mysql.Message("Operand should contain %d column(s)", nil), + ErrSubqueryNo1Row: mysql.Message("Subquery returns more than 1 row", nil), + ErrUnknownStmtHandler: mysql.Message("Unknown prepared statement handler (%.*s) given to %s", nil), + ErrCorruptHelpDB: mysql.Message("Help database is corrupt or does not exist", nil), + ErrCyclicReference: mysql.Message("Cyclic reference on subqueries", nil), + ErrAutoConvert: mysql.Message("Converting column '%s' from %s to %s", nil), + ErrIllegalReference: mysql.Message("Reference '%-.64s' not supported (%s)", nil), + ErrDerivedMustHaveAlias: mysql.Message("Every derived table must have its own alias", nil), + ErrSelectReduced: mysql.Message("Select %d was reduced during optimization", nil), + ErrTablenameNotAllowedHere: mysql.Message("Table '%s' from one of the %ss cannot be used in %s", nil), + ErrNotSupportedAuthMode: mysql.Message("Client does not support authentication protocol requested by server; consider upgrading MySQL client", nil), + ErrSpatialCantHaveNull: mysql.Message("All parts of a SPATIAL index must be NOT NULL", nil), + ErrCollationCharsetMismatch: mysql.Message("COLLATION '%s' is not valid for CHARACTER SET '%s'", nil), + ErrTooBigForUncompress: mysql.Message("Uncompressed data size too large; the maximum size is %d (probably, length of uncompressed data was corrupted)", nil), + ErrZlibZMem: mysql.Message("ZLIB: Not enough memory", nil), + ErrZlibZBuf: mysql.Message("ZLIB: Not enough room in the output buffer (probably, length of uncompressed data was corrupted)", nil), + ErrZlibZData: mysql.Message("ZLIB: Input data corrupted", nil), + ErrCutValueGroupConcat: mysql.Message("Some rows were cut by GROUPCONCAT(%s)", []int{0}), + ErrWarnTooFewRecords: mysql.Message("Row %d doesn't contain data for all columns", nil), + ErrWarnTooManyRecords: mysql.Message("Row %d was truncated; it contained more data than there were input columns", nil), + ErrWarnNullToNotnull: mysql.Message("Column set to default value; NULL supplied to NOT NULL column '%s' at row %d", nil), + ErrWarnDataOutOfRange: mysql.Message("Out of range value for column '%s' at row %d", nil), + WarnDataTruncated: mysql.Message("Data truncated for column '%s' at row %d", nil), + ErrWarnUsingOtherHandler: mysql.Message("Using storage engine %s for table '%s'", nil), + ErrCantAggregate2collations: mysql.Message("Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s'", nil), + ErrDropUser: mysql.Message("Cannot drop one or more of the requested users", nil), + ErrRevokeGrants: mysql.Message("Can't revoke all privileges for one or more of the requested users", nil), + ErrCantAggregate3collations: mysql.Message("Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s'", nil), + ErrCantAggregateNcollations: mysql.Message("Illegal mix of collations for operation '%s'", nil), + ErrVariableIsNotStruct: mysql.Message("Variable '%-.64s' is not a variable component (can't be used as XXXX.variableName)", nil), + ErrUnknownCollation: mysql.Message("Unknown collation: '%-.64s'", nil), + ErrServerIsInSecureAuthMode: mysql.Message("Server is running in --secure-auth mode, but '%s'@'%s' has a password in the old format; please change the password to the new format", nil), + ErrWarnFieldResolved: mysql.Message("Field or reference '%-.192s%s%-.192s%s%-.192s' of SELECT #%d was resolved in SELECT #%d", nil), + ErrUntilCondIgnored: mysql.Message("SQL thread is not to be started so UNTIL options are ignored", nil), + ErrWrongNameForIndex: mysql.Message("Incorrect index name '%-.100s'", nil), + ErrWrongNameForCatalog: mysql.Message("Incorrect catalog name '%-.100s'", nil), + ErrWarnQcResize: mysql.Message("Query cache failed to set size %d; new query cache size is %d", nil), + ErrBadFtColumn: mysql.Message("Column '%-.192s' cannot be part of FULLTEXT index", nil), + ErrUnknownKeyCache: mysql.Message("Unknown key cache '%-.100s'", nil), + ErrWarnHostnameWontWork: mysql.Message("MySQL is started in --skip-name-resolve mode; you must restart it without this switch for this grant to work", nil), + ErrUnknownStorageEngine: mysql.Message("Unknown storage engine '%s'", nil), + ErrWarnDeprecatedSyntax: mysql.Message("'%s' is deprecated and will be removed in a future release. Please use %s instead", nil), + ErrNonUpdatableTable: mysql.Message("The target table %-.100s of the %s is not updatable", nil), + ErrFeatureDisabled: mysql.Message("The '%s' feature is disabled; you need MySQL built with '%s' to have it working", nil), + ErrOptionPreventsStatement: mysql.Message("The MySQL server is running with the %s option so it cannot execute this statement", nil), + ErrDuplicatedValueInType: mysql.Message("Column '%-.100s' has duplicated value '%-.64s' in %s", []int{1}), + ErrTruncatedWrongValue: mysql.Message("Truncated incorrect %-.64s value: '%-.128s'", []int{1}), + ErrTooMuchAutoTimestampCols: mysql.Message("Incorrect table definition; there can be only one TIMESTAMP column with CURRENTTIMESTAMP in DEFAULT or ON UPDATE clause", nil), + ErrInvalidOnUpdate: mysql.Message("Invalid ON UPDATE clause for '%-.192s' column", nil), + ErrUnsupportedPs: mysql.Message("This command is not supported in the prepared statement protocol yet", nil), + ErrGetErrmsg: mysql.Message("Got error %d '%-.100s' from %s", nil), + ErrGetTemporaryErrmsg: mysql.Message("Got temporary error %d '%-.100s' from %s", nil), + ErrUnknownTimeZone: mysql.Message("Unknown or incorrect time zone: '%-.64s'", nil), + ErrWarnInvalidTimestamp: mysql.Message("Invalid TIMESTAMP value in column '%s' at row %d", nil), + ErrInvalidCharacterString: mysql.Message("Invalid %s character string: '%.64s'", []int{1}), + ErrWarnAllowedPacketOverflowed: mysql.Message("Result of %s() was larger than max_allowed_packet (%d) - truncated", nil), + ErrConflictingDeclarations: mysql.Message("Conflicting declarations: '%s%s' and '%s%s'", nil), + ErrSpNoRecursiveCreate: mysql.Message("Can't create a %s from within another stored routine", nil), + ErrSpAlreadyExists: mysql.Message("%s %s already exists", nil), + ErrSpDoesNotExist: mysql.Message("%s %s does not exist", nil), + ErrSpDropFailed: mysql.Message("Failed to DROP %s %s", nil), + ErrSpStoreFailed: mysql.Message("Failed to CREATE %s %s", nil), + ErrSpLilabelMismatch: mysql.Message("%s with no matching label: %s", nil), + ErrSpLabelRedefine: mysql.Message("Redefining label %s", nil), + ErrSpLabelMismatch: mysql.Message("End-label %s without match", nil), + ErrSpUninitVar: mysql.Message("Referring to uninitialized variable %s", nil), + ErrSpBadselect: mysql.Message("PROCEDURE %s can't return a result set in the given context", nil), + ErrSpBadreturn: mysql.Message("RETURN is only allowed in a FUNCTION", nil), + ErrSpBadstatement: mysql.Message("%s is not allowed in stored procedures", nil), + ErrUpdateLogDeprecatedIgnored: mysql.Message("The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been ignored.", nil), + ErrUpdateLogDeprecatedTranslated: mysql.Message("The update log is deprecated and replaced by the binary log; SET SQLLOGUPDATE has been translated to SET SQLLOGBIN.", nil), + ErrQueryInterrupted: mysql.Message("Query execution was interrupted", nil), + ErrSpWrongNoOfArgs: mysql.Message("Incorrect number of arguments for %s %s; expected %d, got %d", nil), + ErrSpCondMismatch: mysql.Message("Undefined CONDITION: %s", nil), + ErrSpNoreturn: mysql.Message("No RETURN found in FUNCTION %s", nil), + ErrSpNoreturnend: mysql.Message("FUNCTION %s ended without RETURN", nil), + ErrSpBadCursorQuery: mysql.Message("Cursor statement must be a SELECT", nil), + ErrSpBadCursorSelect: mysql.Message("Cursor SELECT must not have INTO", nil), + ErrSpCursorMismatch: mysql.Message("Undefined CURSOR: %s", nil), + ErrSpCursorAlreadyOpen: mysql.Message("Cursor is already open", nil), + ErrSpCursorNotOpen: mysql.Message("Cursor is not open", nil), + ErrSpUndeclaredVar: mysql.Message("Undeclared variable: %s", nil), + ErrSpWrongNoOfFetchArgs: mysql.Message("Incorrect number of FETCH variables", nil), + ErrSpFetchNoData: mysql.Message("No data - zero rows fetched, selected, or processed", nil), + ErrSpDupParam: mysql.Message("Duplicate parameter: %s", nil), + ErrSpDupVar: mysql.Message("Duplicate variable: %s", nil), + ErrSpDupCond: mysql.Message("Duplicate condition: %s", nil), + ErrSpDupCurs: mysql.Message("Duplicate cursor: %s", nil), + ErrSpCantAlter: mysql.Message("Failed to ALTER %s %s", nil), + ErrSpSubselectNyi: mysql.Message("Subquery value not supported", nil), + ErrStmtNotAllowedInSfOrTrg: mysql.Message("%s is not allowed in stored function or trigger", nil), + ErrSpVarcondAfterCurshndlr: mysql.Message("Variable or condition declaration after cursor or handler declaration", nil), + ErrSpCursorAfterHandler: mysql.Message("Cursor declaration after handler declaration", nil), + ErrSpCaseNotFound: mysql.Message("Case not found for CASE statement", nil), + ErrFparserTooBigFile: mysql.Message("Configuration file '%-.192s' is too big", nil), + ErrFparserBadHeader: mysql.Message("Malformed file type header in file '%-.192s'", nil), + ErrFparserEOFInComment: mysql.Message("Unexpected end of file while parsing comment '%-.200s'", nil), + ErrFparserErrorInParameter: mysql.Message("Error while parsing parameter '%-.192s' (line: '%-.192s')", nil), + ErrFparserEOFInUnknownParameter: mysql.Message("Unexpected end of file while skipping unknown parameter '%-.192s'", nil), + ErrViewNoExplain: mysql.Message("EXPLAIN/SHOW can not be issued; lacking privileges for underlying table", nil), + ErrFrmUnknownType: mysql.Message("File '%-.192s' has unknown type '%-.64s' in its header", nil), + ErrWrongObject: mysql.Message("'%-.192s.%-.192s' is not %s", nil), + ErrNonupdateableColumn: mysql.Message("Column '%-.192s' is not updatable", nil), + ErrViewSelectDerived: mysql.Message("View's SELECT contains a subquery in the FROM clause", nil), + ErrViewSelectClause: mysql.Message("View's SELECT contains a '%s' clause", nil), + ErrViewSelectVariable: mysql.Message("View's SELECT contains a variable or parameter", nil), + ErrViewSelectTmptable: mysql.Message("View's SELECT refers to a temporary table '%-.192s'", nil), + ErrViewWrongList: mysql.Message("View's SELECT and view's field list have different column counts", nil), + ErrWarnViewMerge: mysql.Message("View merge algorithm can't be used here for now (assumed undefined algorithm)", nil), + ErrWarnViewWithoutKey: mysql.Message("View being updated does not have complete key of underlying table in it", nil), + ErrViewInvalid: mysql.Message("View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", nil), + ErrSpNoDropSp: mysql.Message("Can't drop or alter a %s from within another stored routine", nil), + ErrSpGotoInHndlr: mysql.Message("GOTO is not allowed in a stored procedure handler", nil), + ErrTrgAlreadyExists: mysql.Message("Trigger already exists", nil), + ErrTrgDoesNotExist: mysql.Message("Trigger does not exist", nil), + ErrTrgOnViewOrTempTable: mysql.Message("Trigger's '%-.192s' is view or temporary table", nil), + ErrTrgCantChangeRow: mysql.Message("Updating of %s row is not allowed in %strigger", nil), + ErrTrgNoSuchRowInTrg: mysql.Message("There is no %s row in %s trigger", nil), + ErrNoDefaultForField: mysql.Message("Field '%-.192s' doesn't have a default value", nil), + ErrDivisionByZero: mysql.Message("Division by 0", nil), + ErrTruncatedWrongValueForField: mysql.Message("Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", []int{0, 1}), + ErrIllegalValueForType: mysql.Message("Illegal %s '%-.192s' value found during parsing", []int{1}), + ErrViewNonupdCheck: mysql.Message("CHECK OPTION on non-updatable view '%-.192s.%-.192s'", nil), + ErrViewCheckFailed: mysql.Message("CHECK OPTION failed '%-.192s.%-.192s'", nil), + ErrProcaccessDenied: mysql.Message("%-.16s command denied to user '%-.48s'@'%-.64s' for routine '%-.192s'", nil), + ErrRelayLogFail: mysql.Message("Failed purging old relay logs: %s", nil), + ErrPasswdLength: mysql.Message("Password hash should be a %d-digit hexadecimal number", nil), + ErrUnknownTargetBinlog: mysql.Message("Target log not found in binlog index", nil), + ErrIoErrLogIndexRead: mysql.Message("I/O error reading log index file", nil), + ErrBinlogPurgeProhibited: mysql.Message("Server configuration does not permit binlog purge", nil), + ErrFseekFail: mysql.Message("Failed on fseek()", nil), + ErrBinlogPurgeFatalErr: mysql.Message("Fatal error during log purge", nil), + ErrLogInUse: mysql.Message("A purgeable log is in use, will not purge", nil), + ErrLogPurgeUnknownErr: mysql.Message("Unknown error during log purge", nil), + ErrRelayLogInit: mysql.Message("Failed initializing relay log position: %s", nil), + ErrNoBinaryLogging: mysql.Message("You are not using binary logging", nil), + ErrReservedSyntax: mysql.Message("The '%-.64s' syntax is reserved for purposes internal to the MySQL server", nil), + ErrWsasFailed: mysql.Message("WSAStartup Failed", nil), + ErrDiffGroupsProc: mysql.Message("Can't handle procedures with different groups yet", nil), + ErrNoGroupForProc: mysql.Message("Select must have a group with this procedure", nil), + ErrOrderWithProc: mysql.Message("Can't use ORDER clause with this procedure", nil), + ErrLoggingProhibitChangingOf: mysql.Message("Binary logging and replication forbid changing the global server %s", nil), + ErrNoFileMapping: mysql.Message("Can't map file: %-.200s, errno: %d", nil), + ErrWrongMagic: mysql.Message("Wrong magic in %-.64s", nil), + ErrPsManyParam: mysql.Message("Prepared statement contains too many placeholders", nil), + ErrKeyPart0: mysql.Message("Key part '%-.192s' length cannot be 0", nil), + ErrViewChecksum: mysql.Message("View text checksum failed", nil), + ErrViewMultiupdate: mysql.Message("Can not modify more than one base table through a join view '%-.192s.%-.192s'", nil), + ErrViewNoInsertFieldList: mysql.Message("Can not insert into join view '%-.192s.%-.192s' without fields list", nil), + ErrViewDeleteMergeView: mysql.Message("Can not delete from join view '%-.192s.%-.192s'", nil), + ErrCannotUser: mysql.Message("Operation %s failed for %.256s", nil), + ErrXaerNota: mysql.Message("XAERNOTA: Unknown XID", nil), + ErrXaerInval: mysql.Message("XAERINVAL: Invalid arguments (or unsupported command)", nil), + ErrXaerRmfail: mysql.Message("XAERRMFAIL: The command cannot be executed when global transaction is in the %.64s state", nil), + ErrXaerOutside: mysql.Message("XAEROUTSIDE: Some work is done outside global transaction", nil), + ErrXaerRmerr: mysql.Message("XAERRMERR: Fatal error occurred in the transaction branch - check your data for consistency", nil), + ErrXaRbrollback: mysql.Message("XARBROLLBACK: Transaction branch was rolled back", nil), + ErrNonexistingProcGrant: mysql.Message("There is no such grant defined for user '%-.48s' on host '%-.64s' on routine '%-.192s'", nil), + ErrProcAutoGrantFail: mysql.Message("Failed to grant EXECUTE and ALTER ROUTINE privileges", nil), + ErrProcAutoRevokeFail: mysql.Message("Failed to revoke all privileges to dropped routine", nil), + ErrDataTooLong: mysql.Message("Data too long for column '%s' at row %d", nil), + ErrSpBadSQLstate: mysql.Message("Bad SQLSTATE: '%s'", nil), + ErrStartup: mysql.Message("%s: ready for connections.\nVersion: '%s' socket: '%s' port: %d %s", nil), + ErrLoadFromFixedSizeRowsToVar: mysql.Message("Can't load value from file with fixed size rows to variable", nil), + ErrCantCreateUserWithGrant: mysql.Message("You are not allowed to create a user with GRANT", nil), + ErrWrongValueForType: mysql.Message("Incorrect %-.32s value: '%-.128s' for function %-.32s", nil), + ErrTableDefChanged: mysql.Message("Table definition has changed, please retry transaction", nil), + ErrSpDupHandler: mysql.Message("Duplicate handler declared in the same block", nil), + ErrSpNotVarArg: mysql.Message("OUT or INOUT argument %d for routine %s is not a variable or NEW pseudo-variable in BEFORE trigger", nil), + ErrSpNoRetset: mysql.Message("Not allowed to return a result set from a %s", nil), + ErrCantCreateGeometryObject: mysql.Message("Cannot get geometry object from data you send to the GEOMETRY field", nil), + ErrFailedRoutineBreakBinlog: mysql.Message("A routine failed and has neither NO SQL nor READS SQL DATA in its declaration and binary logging is enabled; if non-transactional tables were updated, the binary log will miss their changes", nil), + ErrBinlogUnsafeRoutine: mysql.Message("This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", nil), + ErrBinlogCreateRoutineNeedSuper: mysql.Message("You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe logBinTrustFunctionCreators variable)", nil), + ErrExecStmtWithOpenCursor: mysql.Message("You can't execute a prepared statement which has an open cursor associated with it. Reset the statement to re-execute it.", nil), + ErrStmtHasNoOpenCursor: mysql.Message("The statement (%d) has no open cursor.", nil), + ErrCommitNotAllowedInSfOrTrg: mysql.Message("Explicit or implicit commit is not allowed in stored function or trigger.", nil), + ErrNoDefaultForViewField: mysql.Message("Field of view '%-.192s.%-.192s' underlying table doesn't have a default value", nil), + ErrSpNoRecursion: mysql.Message("Recursive stored functions and triggers are not allowed.", nil), + ErrTooBigScale: mysql.Message("Too big scale %d specified for column '%-.192s'. Maximum is %d.", nil), + ErrTooBigPrecision: mysql.Message("Too big precision %d specified for column '%-.192s'. Maximum is %d.", nil), + ErrMBiggerThanD: mysql.Message("For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s').", nil), + ErrWrongLockOfSystemTable: mysql.Message("You can't combine write-locking of system tables with other tables or lock types", nil), + ErrConnectToForeignDataSource: mysql.Message("Unable to connect to foreign data source: %.64s", nil), + ErrQueryOnForeignDataSource: mysql.Message("There was a problem processing the query on the foreign data source. Data source : %-.64s", nil), + ErrForeignDataSourceDoesntExist: mysql.Message("The foreign data source you are trying to reference does not exist. Data source : %-.64s", nil), + ErrForeignDataStringInvalidCantCreate: mysql.Message("Can't create federated table. The data source connection string '%-.64s' is not in the correct format", nil), + ErrForeignDataStringInvalid: mysql.Message("The data source connection string '%-.64s' is not in the correct format", nil), + ErrCantCreateFederatedTable: mysql.Message("Can't create federated table. Foreign data src : %-.64s", nil), + ErrTrgInWrongSchema: mysql.Message("Trigger in wrong schema", nil), + ErrStackOverrunNeedMore: mysql.Message("Thread stack overrun: %d bytes used of a %d byte stack, and %d bytes needed. Use 'mysqld --threadStack=#' to specify a bigger stack.", nil), + ErrTooLongBody: mysql.Message("Routine body for '%-.100s' is too long", nil), + ErrWarnCantDropDefaultKeycache: mysql.Message("Cannot drop default keycache", nil), + ErrTooBigDisplaywidth: mysql.Message("Display width out of range for column '%-.192s' (max = %d)", nil), + ErrXaerDupid: mysql.Message("XAERDUPID: The XID already exists", nil), + ErrDatetimeFunctionOverflow: mysql.Message("Datetime function: %-.32s field overflow", nil), + ErrCantUpdateUsedTableInSfOrTrg: mysql.Message("Can't update table '%-.192s' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.", nil), + ErrViewPreventUpdate: mysql.Message("The definition of table '%-.192s' prevents operation %.192s on table '%-.192s'.", nil), + ErrPsNoRecursion: mysql.Message("The prepared statement contains a stored routine call that refers to that same statement. It's not allowed to execute a prepared statement in such a recursive manner", nil), + ErrSpCantSetAutocommit: mysql.Message("Not allowed to set autocommit from a stored function or trigger", nil), + ErrMalformedDefiner: mysql.Message("Definer is not fully qualified", nil), + ErrViewFrmNoUser: mysql.Message("View '%-.192s'.'%-.192s' has no definer information (old table format). Current user is used as definer. Please recreate the view!", nil), + ErrViewOtherUser: mysql.Message("You need the SUPER privilege for creation view with '%-.192s'@'%-.192s' definer", nil), + ErrNoSuchUser: mysql.Message("The user specified as a definer ('%-.64s'@'%-.64s') does not exist", nil), + ErrForbidSchemaChange: mysql.Message("Changing schema from '%-.192s' to '%-.192s' is not allowed.", nil), + ErrRowIsReferenced2: mysql.Message("Cannot delete or update a parent row: a foreign key constraint fails (%.192s)", nil), + ErrNoReferencedRow2: mysql.Message("Cannot add or update a child row: a foreign key constraint fails (%.192s)", nil), + ErrSpBadVarShadow: mysql.Message("Variable '%-.64s' must be quoted with `...`, or renamed", nil), + ErrTrgNoDefiner: mysql.Message("No definer attribute for trigger '%-.192s'.'%-.192s'. The trigger will be activated under the authorization of the invoker, which may have insufficient privileges. Please recreate the trigger.", nil), + ErrOldFileFormat: mysql.Message("'%-.192s' has an old format, you should re-create the '%s' object(s)", nil), + ErrSpRecursionLimit: mysql.Message("Recursive limit %d (as set by the maxSpRecursionDepth variable) was exceeded for routine %.192s", nil), + ErrSpProcTableCorrupt: mysql.Message("Failed to load routine %-.192s. The table mysql.proc is missing, corrupt, or contains bad data (internal code %d)", nil), + ErrSpWrongName: mysql.Message("Incorrect routine name '%-.192s'", nil), + ErrTableNeedsUpgrade: mysql.Message("Table upgrade required. Please do \"REPAIR TABLE `%-.32s`\"", nil), + ErrSpNoAggregate: mysql.Message("AGGREGATE is not supported for stored functions", nil), + ErrMaxPreparedStmtCountReached: mysql.Message("Can't create more than maxPreparedStmtCount statements (current value: %d)", nil), + ErrViewRecursive: mysql.Message("`%-.192s`.`%-.192s` contains view recursion", nil), + ErrNonGroupingFieldUsed: mysql.Message("Non-grouping field '%-.192s' is used in %-.64s clause", nil), + ErrTableCantHandleSpkeys: mysql.Message("The used table type doesn't support SPATIAL indexes", nil), + ErrNoTriggersOnSystemSchema: mysql.Message("Triggers can not be created on system tables", nil), + ErrRemovedSpaces: mysql.Message("Leading spaces are removed from name '%s'", nil), + ErrAutoincReadFailed: mysql.Message("Failed to read auto-increment value from storage engine", nil), + ErrUsername: mysql.Message("user name", nil), + ErrHostname: mysql.Message("host name", nil), + ErrWrongStringLength: mysql.Message("String '%-.70s' is too long for %s (should be no longer than %d)", nil), + ErrNonInsertableTable: mysql.Message("The target table %-.100s of the %s is not insertable-into", nil), + ErrAdminWrongMrgTable: mysql.Message("Table '%-.64s' is differently defined or of non-MyISAM type or doesn't exist", nil), + ErrTooHighLevelOfNestingForSelect: mysql.Message("Too high level of nesting for select", nil), + ErrNameBecomesEmpty: mysql.Message("Name '%-.64s' has become ''", nil), + ErrAmbiguousFieldTerm: mysql.Message("First character of the FIELDS TERMINATED string is ambiguous; please use non-optional and non-empty FIELDS ENCLOSED BY", nil), + ErrForeignServerExists: mysql.Message("The foreign server, %s, you are trying to create already exists.", nil), + ErrForeignServerDoesntExist: mysql.Message("The foreign server name you are trying to reference does not exist. Data source : %-.64s", nil), + ErrIllegalHaCreateOption: mysql.Message("Table storage engine '%-.64s' does not support the create option '%.64s'", nil), + ErrPartitionRequiresValues: mysql.Message("Syntax : %-.64s PARTITIONING requires definition of VALUES %-.64s for each partition", nil), + ErrPartitionWrongValues: mysql.Message("Only %-.64s PARTITIONING can use VALUES %-.64s in partition definition", []int{1}), + ErrPartitionMaxvalue: mysql.Message("MAXVALUE can only be used in last partition definition", nil), + ErrPartitionSubpartition: mysql.Message("Subpartitions can only be hash partitions and by key", nil), + ErrPartitionSubpartMix: mysql.Message("Must define subpartitions on all partitions if on one partition", nil), + ErrPartitionWrongNoPart: mysql.Message("Wrong number of partitions defined, mismatch with previous setting", nil), + ErrPartitionWrongNoSubpart: mysql.Message("Wrong number of subpartitions defined, mismatch with previous setting", nil), + ErrWrongExprInPartitionFunc: mysql.Message("Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed", nil), + ErrNoConstExprInRangeOrList: mysql.Message("Expression in RANGE/LIST VALUES must be constant", nil), + ErrFieldNotFoundPart: mysql.Message("Field in list of fields for partition function not found in table", nil), + ErrListOfFieldsOnlyInHash: mysql.Message("List of fields is only allowed in KEY partitions", nil), + ErrInconsistentPartitionInfo: mysql.Message("The partition info in the frm file is not consistent with what can be written into the frm file", nil), + ErrPartitionFuncNotAllowed: mysql.Message("The %-.192s function returns the wrong type", nil), + ErrPartitionsMustBeDefined: mysql.Message("For %-.64s partitions each partition must be defined", nil), + ErrRangeNotIncreasing: mysql.Message("VALUES LESS THAN value must be strictly increasing for each partition", nil), + ErrInconsistentTypeOfFunctions: mysql.Message("VALUES value must be of same type as partition function", nil), + ErrMultipleDefConstInListPart: mysql.Message("Multiple definition of same constant in list partitioning", nil), + ErrPartitionEntry: mysql.Message("Partitioning can not be used stand-alone in query", nil), + ErrMixHandler: mysql.Message("The mix of handlers in the partitions is not allowed in this version of MySQL", nil), + ErrPartitionNotDefined: mysql.Message("For the partitioned engine it is necessary to define all %-.64s", nil), + ErrTooManyPartitions: mysql.Message("Too many partitions (including subpartitions) were defined", nil), + ErrSubpartition: mysql.Message("It is only possible to mix RANGE/LIST partitioning with HASH/KEY partitioning for subpartitioning", nil), + ErrCantCreateHandlerFile: mysql.Message("Failed to create specific handler file", nil), + ErrBlobFieldInPartFunc: mysql.Message("A BLOB field is not allowed in partition function", nil), + ErrUniqueKeyNeedAllFieldsInPf: mysql.Message("A %-.192s must include all columns in the table's partitioning function", nil), + ErrNoParts: mysql.Message("Number of %-.64s = 0 is not an allowed value", []int{0}), + ErrPartitionMgmtOnNonpartitioned: mysql.Message("Partition management on a not partitioned table is not possible", nil), + ErrForeignKeyOnPartitioned: mysql.Message("Foreign key clause is not yet supported in conjunction with partitioning", nil), + ErrDropPartitionNonExistent: mysql.Message("Error in list of partitions to %-.64s", nil), + ErrDropLastPartition: mysql.Message("Cannot remove all partitions, use DROP TABLE instead", nil), + ErrCoalesceOnlyOnHashPartition: mysql.Message("COALESCE PARTITION can only be used on HASH/KEY partitions", nil), + ErrReorgHashOnlyOnSameNo: mysql.Message("REORGANIZE PARTITION can only be used to reorganize partitions not to change their numbers", nil), + ErrReorgNoParam: mysql.Message("REORGANIZE PARTITION without parameters can only be used on auto-partitioned tables using HASH PARTITIONs", nil), + ErrOnlyOnRangeListPartition: mysql.Message("%-.64s PARTITION can only be used on RANGE/LIST partitions", nil), + ErrAddPartitionSubpart: mysql.Message("Trying to Add partition(s) with wrong number of subpartitions", nil), + ErrAddPartitionNoNewPartition: mysql.Message("At least one partition must be added", nil), + ErrCoalescePartitionNoPartition: mysql.Message("At least one partition must be coalesced", nil), + ErrReorgPartitionNotExist: mysql.Message("More partitions to reorganize than there are partitions", nil), + ErrSameNamePartition: mysql.Message("Duplicate partition name %-.192s", nil), + ErrNoBinlog: mysql.Message("It is not allowed to shut off binlog on this command", nil), + ErrConsecutiveReorgPartitions: mysql.Message("When reorganizing a set of partitions they must be in consecutive order", nil), + ErrReorgOutsideRange: mysql.Message("Reorganize of range partitions cannot change total ranges except for last partition where it can extend the range", nil), + ErrPartitionFunctionFailure: mysql.Message("Partition function not supported in this version for this handler", nil), + ErrPartState: mysql.Message("Partition state cannot be defined from CREATE/ALTER TABLE", nil), + ErrLimitedPartRange: mysql.Message("The %-.64s handler only supports 32 bit integers in VALUES", nil), + ErrPluginIsNotLoaded: mysql.Message("Plugin '%-.192s' is not loaded", nil), + ErrWrongValue: mysql.Message("Incorrect %-.32s value: '%-.128s'", []int{1}), + ErrNoPartitionForGivenValue: mysql.Message("Table has no partition for value %-.64s", []int{0}), + ErrFilegroupOptionOnlyOnce: mysql.Message("It is not allowed to specify %s more than once", nil), + ErrCreateFilegroupFailed: mysql.Message("Failed to create %s", nil), + ErrDropFilegroupFailed: mysql.Message("Failed to drop %s", nil), + ErrTablespaceAutoExtend: mysql.Message("The handler doesn't support autoextend of tablespaces", nil), + ErrWrongSizeNumber: mysql.Message("A size parameter was incorrectly specified, either number or on the form 10M", nil), + ErrSizeOverflow: mysql.Message("The size number was correct but we don't allow the digit part to be more than 2 billion", nil), + ErrAlterFilegroupFailed: mysql.Message("Failed to alter: %s", nil), + ErrBinlogRowLoggingFailed: mysql.Message("Writing one row to the row-based binary log failed", nil), + ErrEventAlreadyExists: mysql.Message("Event '%-.192s' already exists", nil), + ErrEventStoreFailed: mysql.Message("Failed to store event %s. Error code %d from storage engine.", nil), + ErrEventDoesNotExist: mysql.Message("Unknown event '%-.192s'", nil), + ErrEventCantAlter: mysql.Message("Failed to alter event '%-.192s'", nil), + ErrEventDropFailed: mysql.Message("Failed to drop %s", nil), + ErrEventIntervalNotPositiveOrTooBig: mysql.Message("INTERVAL is either not positive or too big", nil), + ErrEventEndsBeforeStarts: mysql.Message("ENDS is either invalid or before STARTS", nil), + ErrEventExecTimeInThePast: mysql.Message("Event execution time is in the past. Event has been disabled", nil), + ErrEventOpenTableFailed: mysql.Message("Failed to open mysql.event", nil), + ErrEventNeitherMExprNorMAt: mysql.Message("No datetime expression provided", nil), + ErrObsoleteColCountDoesntMatchCorrupted: mysql.Message("Column count of mysql.%s is wrong. Expected %d, found %d. The table is probably corrupted", nil), + ErrObsoleteCannotLoadFromTable: mysql.Message("Cannot load from mysql.%s. The table is probably corrupted", nil), + ErrEventCannotDelete: mysql.Message("Failed to delete the event from mysql.event", nil), + ErrEventCompile: mysql.Message("Error during compilation of event's body", nil), + ErrEventSameName: mysql.Message("Same old and new event name", nil), + ErrEventDataTooLong: mysql.Message("Data for column '%s' too long", nil), + ErrDropIndexFk: mysql.Message("Cannot drop index '%-.192s': needed in a foreign key constraint", nil), + ErrWarnDeprecatedSyntaxWithVer: mysql.Message("The syntax '%s' is deprecated and will be removed in MySQL %s. Please use %s instead", nil), + ErrCantWriteLockLogTable: mysql.Message("You can't write-lock a log table. Only read access is possible", nil), + ErrCantLockLogTable: mysql.Message("You can't use locks with log tables.", nil), + ErrForeignDuplicateKeyOldUnused: mysql.Message("Upholding foreign key constraints for table '%.192s', entry '%-.192s', key %d would lead to a duplicate entry", nil), + ErrColCountDoesntMatchPleaseUpdate: mysql.Message("Column count of mysql.%s is wrong. Expected %d, found %d. Created with MySQL %d, now running %d. Please use mysqlUpgrade to fix this error.", nil), + ErrTempTablePreventsSwitchOutOfRbr: mysql.Message("Cannot switch out of the row-based binary log format when the session has open temporary tables", nil), + ErrStoredFunctionPreventsSwitchBinlogFormat: mysql.Message("Cannot change the binary logging format inside a stored function or trigger", nil), + ErrNdbCantSwitchBinlogFormat: mysql.Message("The NDB cluster engine does not support changing the binlog format on the fly yet", nil), + ErrPartitionNoTemporary: mysql.Message("Cannot create temporary table with partitions", nil), + ErrPartitionConstDomain: mysql.Message("Partition constant is out of partition function domain", nil), + ErrPartitionFunctionIsNotAllowed: mysql.Message("This partition function is not allowed", nil), + ErrDdlLog: mysql.Message("Error in DDL log", nil), + ErrNullInValuesLessThan: mysql.Message("Not allowed to use NULL value in VALUES LESS THAN", nil), + ErrWrongPartitionName: mysql.Message("Incorrect partition name", nil), + ErrCantChangeTxCharacteristics: mysql.Message("Transaction characteristics can't be changed while a transaction is in progress", nil), + ErrDupEntryAutoincrementCase: mysql.Message("ALTER TABLE causes autoIncrement resequencing, resulting in duplicate entry '%-.192s' for key '%-.192s'", nil), + ErrEventModifyQueue: mysql.Message("Internal scheduler error %d", nil), + ErrEventSetVar: mysql.Message("Error during starting/stopping of the scheduler. Error code %d", nil), + ErrPartitionMerge: mysql.Message("Engine cannot be used in partitioned tables", nil), + ErrCantActivateLog: mysql.Message("Cannot activate '%-.64s' log", nil), + ErrRbrNotAvailable: mysql.Message("The server was not built with row-based replication", nil), + ErrBase64Decode: mysql.Message("Decoding of base64 string failed", nil), + ErrEventRecursionForbidden: mysql.Message("Recursion of EVENT DDL statements is forbidden when body is present", nil), + ErrEventsDB: mysql.Message("Cannot proceed because system tables used by Event Scheduler were found damaged at server start", nil), + ErrOnlyIntegersAllowed: mysql.Message("Only integers allowed as number here", nil), + ErrUnsuportedLogEngine: mysql.Message("This storage engine cannot be used for log tables\"", nil), + ErrBadLogStatement: mysql.Message("You cannot '%s' a log table if logging is enabled", nil), + ErrCantRenameLogTable: mysql.Message("Cannot rename '%s'. When logging enabled, rename to/from log table must rename two tables: the log table to an archive table and another table back to '%s'", nil), + ErrWrongParamcountToNativeFct: mysql.Message("Incorrect parameter count in the call to native function '%-.192s'", nil), + ErrWrongParametersToNativeFct: mysql.Message("Incorrect parameters in the call to native function '%-.192s'", nil), + ErrWrongParametersToStoredFct: mysql.Message("Incorrect parameters in the call to stored function '%-.192s'", nil), + ErrNativeFctNameCollision: mysql.Message("This function '%-.192s' has the same name as a native function", nil), + ErrDupEntryWithKeyName: mysql.Message("Duplicate entry '%-.64s' for key '%-.192s'", nil), + ErrBinlogPurgeEmFile: mysql.Message("Too many files opened, please execute the command again", nil), + ErrEventCannotCreateInThePast: mysql.Message("Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was dropped immediately after creation.", nil), + ErrEventCannotAlterInThePast: mysql.Message("Event execution time is in the past and ON COMPLETION NOT PRESERVE is set. The event was not changed. Specify a time in the future.", nil), + ErrNoPartitionForGivenValueSilent: mysql.Message("Table has no partition for some existing values", nil), + ErrBinlogUnsafeStatement: mysql.Message("Unsafe statement written to the binary log using statement format since BINLOGFORMAT = STATEMENT. %s", nil), + ErrBinlogLoggingImpossible: mysql.Message("Binary logging not possible. Message: %s", nil), + ErrViewNoCreationCtx: mysql.Message("View `%-.64s`.`%-.64s` has no creation context", nil), + ErrViewInvalidCreationCtx: mysql.Message("Creation context of view `%-.64s`.`%-.64s' is invalid", nil), + ErrSrInvalidCreationCtx: mysql.Message("Creation context of stored routine `%-.64s`.`%-.64s` is invalid", nil), + ErrTrgCorruptedFile: mysql.Message("Corrupted TRG file for table `%-.64s`.`%-.64s`", nil), + ErrTrgNoCreationCtx: mysql.Message("Triggers for table `%-.64s`.`%-.64s` have no creation context", nil), + ErrTrgInvalidCreationCtx: mysql.Message("Trigger creation context of table `%-.64s`.`%-.64s` is invalid", nil), + ErrEventInvalidCreationCtx: mysql.Message("Creation context of event `%-.64s`.`%-.64s` is invalid", nil), + ErrTrgCantOpenTable: mysql.Message("Cannot open table for trigger `%-.64s`.`%-.64s`", nil), + ErrCantCreateSroutine: mysql.Message("Cannot create stored routine `%-.64s`. Check warnings", nil), + ErrNoFormatDescriptionEventBeforeBinlogStatement: mysql.Message("The BINLOG statement of type `%s` was not preceded by a format description BINLOG statement.", nil), + ErrLoadDataInvalidColumn: mysql.Message("Invalid column reference (%-.64s) in LOAD DATA", nil), + ErrLogPurgeNoFile: mysql.Message("Being purged log %s was not found", nil), + ErrXaRbtimeout: mysql.Message("XARBTIMEOUT: Transaction branch was rolled back: took too long", nil), + ErrXaRbdeadlock: mysql.Message("XARBDEADLOCK: Transaction branch was rolled back: deadlock was detected", nil), + ErrNeedReprepare: mysql.Message("Prepared statement needs to be re-prepared", nil), + ErrDelayedNotSupported: mysql.Message("DELAYED option not supported for table '%-.192s'", nil), + WarnOptionIgnored: mysql.Message("<%-.64s> option ignored", nil), + WarnPluginDeleteBuiltin: mysql.Message("Built-in plugins cannot be deleted", nil), + WarnPluginBusy: mysql.Message("Plugin is busy and will be uninstalled on shutdown", nil), + ErrVariableIsReadonly: mysql.Message("%s variable '%s' is read-only. Use SET %s to assign the value", nil), + ErrWarnEngineTransactionRollback: mysql.Message("Storage engine %s does not support rollback for this statement. Transaction rolled back and must be restarted", nil), + ErrNdbReplicationSchema: mysql.Message("Bad schema for mysql.ndbReplication table. Message: %-.64s", nil), + ErrConflictFnParse: mysql.Message("Error in parsing conflict function. Message: %-.64s", nil), + ErrExceptionsWrite: mysql.Message("Write to exceptions table failed. Message: %-.128s\"", nil), + ErrTooLongTableComment: mysql.Message("Comment for table '%-.64s' is too long (max = %d)", nil), + ErrTooLongFieldComment: mysql.Message("Comment for field '%-.64s' is too long (max = %d)", nil), + ErrFuncInexistentNameCollision: mysql.Message("FUNCTION %s does not exist. Check the 'Function Name Parsing and Resolution' section in the Reference Manual", nil), + ErrDatabaseName: mysql.Message("Database", nil), + ErrTableName: mysql.Message("Table", nil), + ErrPartitionName: mysql.Message("Partition", nil), + ErrSubpartitionName: mysql.Message("Subpartition", nil), + ErrTemporaryName: mysql.Message("Temporary", nil), + ErrRenamedName: mysql.Message("Renamed", nil), + ErrTooManyConcurrentTrxs: mysql.Message("Too many active concurrent transactions", nil), + WarnNonASCIISeparatorNotImplemented: mysql.Message("Non-ASCII separator arguments are not fully supported", nil), + ErrDebugSyncTimeout: mysql.Message("debug sync point wait timed out", nil), + ErrDebugSyncHitLimit: mysql.Message("debug sync point hit limit reached", nil), + ErrDupSignalSet: mysql.Message("Duplicate condition information item '%s'", nil), + ErrSignalWarn: mysql.Message("Unhandled user-defined warning condition", nil), + ErrSignalNotFound: mysql.Message("Unhandled user-defined not found condition", nil), + ErrSignalException: mysql.Message("Unhandled user-defined exception condition", nil), + ErrResignalWithoutActiveHandler: mysql.Message("RESIGNAL when handler not active", nil), + ErrSignalBadConditionType: mysql.Message("SIGNAL/RESIGNAL can only use a CONDITION defined with SQLSTATE", nil), + WarnCondItemTruncated: mysql.Message("Data truncated for condition item '%s'", nil), + ErrCondItemTooLong: mysql.Message("Data too long for condition item '%s'", nil), + ErrUnknownLocale: mysql.Message("Unknown locale: '%-.64s'", nil), + ErrQueryCacheDisabled: mysql.Message("Query cache is disabled; restart the server with queryCacheType=1 to enable it", nil), + ErrSameNamePartitionField: mysql.Message("Duplicate partition field name '%-.192s'", nil), + ErrPartitionColumnList: mysql.Message("Inconsistency in usage of column lists for partitioning", nil), + ErrWrongTypeColumnValue: mysql.Message("Partition column values of incorrect type", nil), + ErrTooManyPartitionFuncFields: mysql.Message("Too many fields in '%-.192s'", nil), + ErrMaxvalueInValuesIn: mysql.Message("Cannot use MAXVALUE as value in VALUES IN", nil), + ErrTooManyValues: mysql.Message("Cannot have more than one value for this type of %-.64s partitioning", nil), + ErrRowSinglePartitionField: mysql.Message("Row expressions in VALUES IN only allowed for multi-field column partitioning", nil), + ErrFieldTypeNotAllowedAsPartitionField: mysql.Message("Field '%-.192s' is of a not allowed type for this type of partitioning", nil), + ErrPartitionFieldsTooLong: mysql.Message("The total length of the partitioning fields is too large", nil), + ErrBinlogRowEngineAndStmtEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since both row-incapable engines and statement-incapable engines are involved.", nil), + ErrBinlogRowModeAndStmtEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = ROW and at least one table uses a storage engine limited to statement-based logging.", nil), + ErrBinlogUnsafeAndStmtEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since statement is unsafe, storage engine is limited to statement-based logging, and BINLOGFORMAT = MIXED. %s", nil), + ErrBinlogRowInjectionAndStmtEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since statement is in row format and at least one table uses a storage engine limited to statement-based logging.", nil), + ErrBinlogStmtModeAndRowEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT and at least one table uses a storage engine limited to row-based logging.%s", nil), + ErrBinlogRowInjectionAndStmtMode: mysql.Message("Cannot execute statement: impossible to write to binary log since statement is in row format and BINLOGFORMAT = STATEMENT.", nil), + ErrBinlogMultipleEnginesAndSelfLoggingEngine: mysql.Message("Cannot execute statement: impossible to write to binary log since more than one engine is involved and at least one engine is self-logging.", nil), + ErrBinlogUnsafeLimit: mysql.Message("The statement is unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted.", nil), + ErrBinlogUnsafeInsertDelayed: mysql.Message("The statement is unsafe because it uses INSERT DELAYED. This is unsafe because the times when rows are inserted cannot be predicted.", nil), + ErrBinlogUnsafeAutoincColumns: mysql.Message("Statement is unsafe because it invokes a trigger or a stored function that inserts into an AUTOINCREMENT column. Inserted values cannot be logged correctly.", nil), + ErrBinlogUnsafeNontransAfterTrans: mysql.Message("Statement is unsafe because it accesses a non-transactional table after accessing a transactional table within the same transaction.", nil), + ErrMessageAndStatement: mysql.Message("%s Statement: %s", nil), + ErrInsideTransactionPreventsSwitchBinlogFormat: mysql.Message("Cannot modify @@session.binlogFormat inside a transaction", nil), + ErrPathLength: mysql.Message("The path specified for %.64s is too long.", nil), + ErrWarnDeprecatedSyntaxNoReplacement: mysql.Message("'%s' is deprecated and will be removed in a future release.", nil), + ErrWrongNativeTableStructure: mysql.Message("Native table '%-.64s'.'%-.64s' has the wrong structure", nil), + ErrWrongPerfSchemaUsage: mysql.Message("Invalid performanceSchema usage.", nil), + ErrWarnISSkippedTable: mysql.Message("Table '%s'.'%s' was skipped since its definition is being modified by concurrent DDL statement", nil), + ErrInsideTransactionPreventsSwitchBinlogDirect: mysql.Message("Cannot modify @@session.binlogDirectNonTransactionalUpdates inside a transaction", nil), + ErrStoredFunctionPreventsSwitchBinlogDirect: mysql.Message("Cannot change the binlog direct flag inside a stored function or trigger", nil), + ErrSpatialMustHaveGeomCol: mysql.Message("A SPATIAL index may only contain a geometrical type column", nil), + ErrTooLongIndexComment: mysql.Message("Comment for index '%-.64s' is too long (max = %d)", nil), + ErrLockAborted: mysql.Message("Wait on a lock was aborted due to a pending exclusive lock", nil), + ErrDataOutOfRange: mysql.Message("%s value is out of range in '%s'", []int{1}), + ErrWrongSpvarTypeInLimit: mysql.Message("A variable of a non-integer based type in LIMIT clause", nil), + ErrBinlogUnsafeMultipleEnginesAndSelfLoggingEngine: mysql.Message("Mixing self-logging and non-self-logging engines in a statement is unsafe.", nil), + ErrBinlogUnsafeMixedStatement: mysql.Message("Statement accesses nontransactional table as well as transactional or temporary table, and writes to any of them.", nil), + ErrInsideTransactionPreventsSwitchSQLLogBin: mysql.Message("Cannot modify @@session.sqlLogBin inside a transaction", nil), + ErrStoredFunctionPreventsSwitchSQLLogBin: mysql.Message("Cannot change the sqlLogBin inside a stored function or trigger", nil), + ErrFailedReadFromParFile: mysql.Message("Failed to read from the .par file", nil), + ErrValuesIsNotIntType: mysql.Message("VALUES value for partition '%-.64s' must have type INT", nil), + ErrAccessDeniedNoPassword: mysql.Message("Access denied for user '%-.48s'@'%-.64s'", nil), + ErrSetPasswordAuthPlugin: mysql.Message("SET PASSWORD has no significance for users authenticating via plugins", nil), + ErrGrantPluginUserExists: mysql.Message("GRANT with IDENTIFIED WITH is illegal because the user %-.*s already exists", nil), + ErrTruncateIllegalFk: mysql.Message("Cannot truncate a table referenced in a foreign key constraint (%.192s)", nil), + ErrPluginIsPermanent: mysql.Message("Plugin '%s' is forcePlusPermanent and can not be unloaded", nil), + ErrStmtCacheFull: mysql.Message("Multi-row statements required more than 'maxBinlogStmtCacheSize' bytes of storage; increase this mysqld variable and try again", nil), + ErrMultiUpdateKeyConflict: mysql.Message("Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'.", nil), + ErrTableNeedsRebuild: mysql.Message("Table rebuild required. Please do \"ALTER TABLE `%-.32s` FORCE\" or dump/reload to fix it!", nil), + WarnOptionBelowLimit: mysql.Message("The value of '%s' should be no less than the value of '%s'", nil), + ErrIndexColumnTooLong: mysql.Message("Index column size too large. The maximum column size is %d bytes.", nil), + ErrErrorInTriggerBody: mysql.Message("Trigger '%-.64s' has an error in its body: '%-.256s'", nil), + ErrErrorInUnknownTriggerBody: mysql.Message("Unknown trigger has an error in its body: '%-.256s'", nil), + ErrIndexCorrupt: mysql.Message("Index %s is corrupted", nil), + ErrUndoRecordTooBig: mysql.Message("Undo log record is too big.", nil), + ErrPluginNoUninstall: mysql.Message("Plugin '%s' is marked as not dynamically uninstallable. You have to stop the server to uninstall it.", nil), + ErrPluginNoInstall: mysql.Message("Plugin '%s' is marked as not dynamically installable. You have to stop the server to install it.", nil), + ErrBinlogUnsafeInsertTwoKeys: mysql.Message("INSERT... ON DUPLICATE KEY UPDATE on a table with more than one UNIQUE KEY is unsafe", nil), + ErrTableInFkCheck: mysql.Message("Table is being used in foreign key check.", nil), + ErrUnsupportedEngine: mysql.Message("Storage engine '%s' does not support system tables. [%s.%s]", nil), + ErrBinlogUnsafeAutoincNotFirst: mysql.Message("INSERT into autoincrement field which is not the first part in the composed primary key is unsafe.", nil), + ErrCannotLoadFromTableV2: mysql.Message("Cannot load from %s.%s. The table is probably corrupted", nil), + ErrOnlyFdAndRbrEventsAllowedInBinlogStatement: mysql.Message("Only FormatDescriptionLogEvent and row events are allowed in BINLOG statements (but %s was provided)", nil), + ErrPartitionExchangeDifferentOption: mysql.Message("Non matching attribute '%-.64s' between partition and table", nil), + ErrPartitionExchangePartTable: mysql.Message("Table to exchange with partition is partitioned: '%-.64s'", nil), + ErrPartitionExchangeTempTable: mysql.Message("Table to exchange with partition is temporary: '%-.64s'", nil), + ErrPartitionInsteadOfSubpartition: mysql.Message("Subpartitioned table, use subpartition instead of partition", nil), + ErrUnknownPartition: mysql.Message("Unknown partition '%-.64s' in table '%-.64s'", nil), + ErrTablesDifferentMetadata: mysql.Message("Tables have different definitions", nil), + ErrRowDoesNotMatchPartition: mysql.Message("Found a row that does not match the partition", nil), + ErrBinlogCacheSizeGreaterThanMax: mysql.Message("Option binlogCacheSize (%d) is greater than maxBinlogCacheSize (%d); setting binlogCacheSize equal to maxBinlogCacheSize.", nil), + ErrWarnIndexNotApplicable: mysql.Message("Cannot use %-.64s access on index '%-.64s' due to type or collation conversion on field '%-.64s'", nil), + ErrPartitionExchangeForeignKey: mysql.Message("Table to exchange with partition has foreign key references: '%-.64s'", nil), + ErrNoSuchKeyValue: mysql.Message("Key value '%-.192s' was not found in table '%-.192s.%-.192s'", nil), + ErrRplInfoDataTooLong: mysql.Message("Data for column '%s' too long", nil), + ErrNetworkReadEventChecksumFailure: mysql.Message("Replication event checksum verification failed while reading from network.", nil), + ErrBinlogReadEventChecksumFailure: mysql.Message("Replication event checksum verification failed while reading from a log file.", nil), + ErrBinlogStmtCacheSizeGreaterThanMax: mysql.Message("Option binlogStmtCacheSize (%d) is greater than maxBinlogStmtCacheSize (%d); setting binlogStmtCacheSize equal to maxBinlogStmtCacheSize.", nil), + ErrCantUpdateTableInCreateTableSelect: mysql.Message("Can't update table '%-.192s' while '%-.192s' is being created.", nil), + ErrPartitionClauseOnNonpartitioned: mysql.Message("PARTITION () clause on non partitioned table", nil), + ErrRowDoesNotMatchGivenPartitionSet: mysql.Message("Found a row not matching the given partition set", nil), + ErrNoSuchPartitionunused: mysql.Message("partition '%-.64s' doesn't exist", nil), + ErrChangeRplInfoRepositoryFailure: mysql.Message("Failure while changing the type of replication repository: %s.", nil), + ErrWarningNotCompleteRollbackWithCreatedTempTable: mysql.Message("The creation of some temporary tables could not be rolled back.", nil), + ErrWarningNotCompleteRollbackWithDroppedTempTable: mysql.Message("Some temporary tables were dropped, but these operations could not be rolled back.", nil), + ErrMtsUpdatedDBsGreaterMax: mysql.Message("The number of modified databases exceeds the maximum %d; the database names will not be included in the replication event metadata.", nil), + ErrMtsCantParallel: mysql.Message("Cannot execute the current event group in the parallel mode. Encountered event %s, relay-log name %s, position %s which prevents execution of this event group in parallel mode. Reason: %s.", nil), + ErrMtsInconsistentData: mysql.Message("%s", nil), + ErrFulltextNotSupportedWithPartitioning: mysql.Message("FULLTEXT index is not supported for partitioned tables.", nil), + ErrDaInvalidConditionNumber: mysql.Message("Invalid condition number", nil), + ErrInsecurePlainText: mysql.Message("Sending passwords in plain text without SSL/TLS is extremely insecure.", nil), + ErrForeignDuplicateKeyWithChildInfo: mysql.Message("Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in table '%.192s', key '%.192s'", nil), + ErrForeignDuplicateKeyWithoutChildInfo: mysql.Message("Foreign key constraint for table '%.192s', record '%-.192s' would lead to a duplicate entry in a child table", nil), + ErrTableHasNoFt: mysql.Message("The table does not have FULLTEXT index to support this query", nil), + ErrVariableNotSettableInSfOrTrigger: mysql.Message("The system variable %.200s cannot be set in stored functions or triggers.", nil), + ErrVariableNotSettableInTransaction: mysql.Message("The system variable %.200s cannot be set when there is an ongoing transaction.", nil), + ErrGtidNextIsNotInGtidNextList: mysql.Message("The system variable @@SESSION.GTIDNEXT has the value %.200s, which is not listed in @@SESSION.GTIDNEXTLIST.", nil), + ErrCantChangeGtidNextInTransactionWhenGtidNextListIsNull: mysql.Message("When @@SESSION.GTIDNEXTLIST == NULL, the system variable @@SESSION.GTIDNEXT cannot change inside a transaction.", nil), + ErrSetStatementCannotInvokeFunction: mysql.Message("The statement 'SET %.200s' cannot invoke a stored function.", nil), + ErrGtidNextCantBeAutomaticIfGtidNextListIsNonNull: mysql.Message("The system variable @@SESSION.GTIDNEXT cannot be 'AUTOMATIC' when @@SESSION.GTIDNEXTLIST is non-NULL.", nil), + ErrSkippingLoggedTransaction: mysql.Message("Skipping transaction %.200s because it has already been executed and logged.", nil), + ErrMalformedGtidSetSpecification: mysql.Message("Malformed GTID set specification '%.200s'.", nil), + ErrMalformedGtidSetEncoding: mysql.Message("Malformed GTID set encoding.", nil), + ErrMalformedGtidSpecification: mysql.Message("Malformed GTID specification '%.200s'.", nil), + ErrGnoExhausted: mysql.Message("Impossible to generate Global Transaction Identifier: the integer component reached the maximal value. Restart the server with a new serverUuid.", nil), + ErrCantDoImplicitCommitInTrxWhenGtidNextIsSet: mysql.Message("Cannot execute statements with implicit commit inside a transaction when @@SESSION.GTIDNEXT != AUTOMATIC or @@SESSION.GTIDNEXTLIST != NULL.", nil), + ErrGtidMode2Or3RequiresEnforceGtidConsistencyOn: mysql.Message("@@GLOBAL.GTIDMODE = ON or UPGRADESTEP2 requires @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", nil), + ErrCantSetGtidNextToGtidWhenGtidModeIsOff: mysql.Message("@@SESSION.GTIDNEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTIDMODE = OFF.", nil), + ErrCantSetGtidNextToAnonymousWhenGtidModeIsOn: mysql.Message("@@SESSION.GTIDNEXT cannot be set to ANONYMOUS when @@GLOBAL.GTIDMODE = ON.", nil), + ErrCantSetGtidNextListToNonNullWhenGtidModeIsOff: mysql.Message("@@SESSION.GTIDNEXTLIST cannot be set to a non-NULL value when @@GLOBAL.GTIDMODE = OFF.", nil), + ErrFoundGtidEventWhenGtidModeIsOff: mysql.Message("Found a GtidLogEvent or PreviousGtidsLogEvent when @@GLOBAL.GTIDMODE = OFF.", nil), + ErrGtidUnsafeNonTransactionalTable: mysql.Message("When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, updates to non-transactional tables can only be done in either autocommitted statements or single-statement transactions, and never in the same statement as updates to transactional tables.", nil), + ErrGtidUnsafeCreateSelect: mysql.Message("CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1.", nil), + ErrGtidUnsafeCreateDropTemporaryTableInTransaction: mysql.Message("When @@GLOBAL.ENFORCEGTIDCONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.", nil), + ErrGtidModeCanOnlyChangeOneStepAtATime: mysql.Message("The value of @@GLOBAL.GTIDMODE can only change one step at a time: OFF <-> UPGRADESTEP1 <-> UPGRADESTEP2 <-> ON. Also note that this value must be stepped up or down simultaneously on all servers; see the Manual for instructions.", nil), + ErrCantSetGtidNextWhenOwningGtid: mysql.Message("@@SESSION.GTIDNEXT cannot be changed by a client that owns a GTID. The client owns %s. Ownership is released on COMMIT or ROLLBACK.", nil), + ErrUnknownExplainFormat: mysql.Message("Unknown EXPLAIN format name: '%s'", nil), + ErrCantExecuteInReadOnlyTransaction: mysql.Message("Cannot execute statement in a READ ONLY transaction.", nil), + ErrTooLongTablePartitionComment: mysql.Message("Comment for table partition '%-.64s' is too long (max = %d)", nil), + ErrInnodbFtLimit: mysql.Message("InnoDB presently supports one FULLTEXT index creation at a time", nil), + ErrInnodbNoFtTempTable: mysql.Message("Cannot create FULLTEXT index on temporary InnoDB table", nil), + ErrInnodbFtWrongDocidColumn: mysql.Message("Column '%-.192s' is of wrong type for an InnoDB FULLTEXT index", nil), + ErrInnodbFtWrongDocidIndex: mysql.Message("Index '%-.192s' is of wrong type for an InnoDB FULLTEXT index", nil), + ErrInnodbOnlineLogTooBig: mysql.Message("Creating index '%-.192s' required more than 'innodbOnlineAlterLogMaxSize' bytes of modification log. Please try again.", nil), + ErrUnknownAlterAlgorithm: mysql.Message("Unknown ALGORITHM '%s'", nil), + ErrUnknownAlterLock: mysql.Message("Unknown LOCK type '%s'", nil), + ErrMtsResetWorkers: mysql.Message("Cannot clean up worker info tables. Additional error messages can be found in the MySQL error log.", nil), + ErrColCountDoesntMatchCorruptedV2: mysql.Message("Column count of %s.%s is wrong. Expected %d, found %d. The table is probably corrupted", nil), + ErrDiscardFkChecksRunning: mysql.Message("There is a foreign key check running on table '%-.192s'. Cannot discard the table.", nil), + ErrTableSchemaMismatch: mysql.Message("Schema mismatch (%s)", nil), + ErrTableInSystemTablespace: mysql.Message("Table '%-.192s' in system tablespace", nil), + ErrIoRead: mysql.Message("IO Read : (%d, %s) %s", nil), + ErrIoWrite: mysql.Message("IO Write : (%d, %s) %s", nil), + ErrTablespaceMissing: mysql.Message("Tablespace is missing for table '%-.192s'", nil), + ErrTablespaceExists: mysql.Message("Tablespace for table '%-.192s' exists. Please DISCARD the tablespace before IMPORT.", nil), + ErrTablespaceDiscarded: mysql.Message("Tablespace has been discarded for table '%-.192s'", nil), + ErrInternal: mysql.Message("Internal : %s", nil), + ErrInnodbImport: mysql.Message("ALTER TABLE '%-.192s' IMPORT TABLESPACE failed with error %d : '%s'", nil), + ErrInnodbIndexCorrupt: mysql.Message("Index corrupt: %s", nil), + ErrInvalidYearColumnLength: mysql.Message("Supports only YEAR or YEAR(4) column", nil), + ErrNotValidPassword: mysql.Message("Your password does not satisfy the current policy requirements", nil), + ErrMustChangePassword: mysql.Message("You must SET PASSWORD before executing this statement", nil), + ErrFkNoIndexChild: mysql.Message("Failed to add the foreign key constaint. Missing index for constraint '%s' in the foreign table '%s'", nil), + ErrFkNoIndexParent: mysql.Message("Failed to add the foreign key constaint. Missing index for constraint '%s' in the referenced table '%s'", nil), + ErrFkFailAddSystem: mysql.Message("Failed to add the foreign key constraint '%s' to system tables", nil), + ErrFkCannotOpenParent: mysql.Message("Failed to open the referenced table '%s'", nil), + ErrFkIncorrectOption: mysql.Message("Failed to add the foreign key constraint on table '%s'. Incorrect options in FOREIGN KEY constraint '%s'", nil), + ErrFkDupName: mysql.Message("Duplicate foreign key constraint name '%s'", nil), + ErrPasswordFormat: mysql.Message("The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function.", nil), + ErrFkColumnCannotDrop: mysql.Message("Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s'", nil), + ErrFkColumnCannotDropChild: mysql.Message("Cannot drop column '%-.192s': needed in a foreign key constraint '%-.192s' of table '%-.192s'", nil), + ErrFkColumnNotNull: mysql.Message("Column '%-.192s' cannot be NOT NULL: needed in a foreign key constraint '%-.192s' SET NULL", nil), + ErrDupIndex: mysql.Message("Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release.", nil), + ErrFkColumnCannotChange: mysql.Message("Cannot change column '%-.192s': used in a foreign key constraint '%-.192s'", nil), + ErrFkColumnCannotChangeChild: mysql.Message("Cannot change column '%-.192s': used in a foreign key constraint '%-.192s' of table '%-.192s'", nil), + ErrFkCannotDeleteParent: mysql.Message("Cannot delete rows from table which is parent in a foreign key constraint '%-.192s' of table '%-.192s'", nil), + ErrMalformedPacket: mysql.Message("Malformed communication packet.", nil), + ErrReadOnlyMode: mysql.Message("Running in read-only mode", nil), + ErrVariableNotSettableInSp: mysql.Message("The system variable %.200s cannot be set in stored procedures.", nil), + ErrCantSetGtidPurgedWhenGtidModeIsOff: mysql.Message("@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDMODE = ON.", nil), + ErrCantSetGtidPurgedWhenGtidExecutedIsNotEmpty: mysql.Message("@@GLOBAL.GTIDPURGED can only be set when @@GLOBAL.GTIDEXECUTED is empty.", nil), + ErrCantSetGtidPurgedWhenOwnedGtidsIsNotEmpty: mysql.Message("@@GLOBAL.GTIDPURGED can only be set when there are no ongoing transactions (not even in other clients).", nil), + ErrGtidPurgedWasChanged: mysql.Message("@@GLOBAL.GTIDPURGED was changed from '%s' to '%s'.", nil), + ErrGtidExecutedWasChanged: mysql.Message("@@GLOBAL.GTIDEXECUTED was changed from '%s' to '%s'.", nil), + ErrBinlogStmtModeAndNoReplTables: mysql.Message("Cannot execute statement: impossible to write to binary log since BINLOGFORMAT = STATEMENT, and both replicated and non replicated tables are written to.", nil), + ErrAlterOperationNotSupported: mysql.Message("%s is not supported for this operation. Try %s.", nil), + ErrAlterOperationNotSupportedReason: mysql.Message("%s is not supported. Reason: %s. Try %s.", nil), + ErrAlterOperationNotSupportedReasonCopy: mysql.Message("COPY algorithm requires a lock", nil), + ErrAlterOperationNotSupportedReasonPartition: mysql.Message("Partition specific operations do not yet support LOCK/ALGORITHM", nil), + ErrAlterOperationNotSupportedReasonFkRename: mysql.Message("Columns participating in a foreign key are renamed", nil), + ErrAlterOperationNotSupportedReasonColumnType: mysql.Message("Cannot change column type INPLACE", nil), + ErrAlterOperationNotSupportedReasonFkCheck: mysql.Message("Adding foreign keys needs foreignKeyChecks=OFF", nil), + ErrAlterOperationNotSupportedReasonIgnore: mysql.Message("Creating unique indexes with IGNORE requires COPY algorithm to remove duplicate rows", nil), + ErrAlterOperationNotSupportedReasonNopk: mysql.Message("Dropping a primary key is not allowed without also adding a new primary key", nil), + ErrAlterOperationNotSupportedReasonAutoinc: mysql.Message("Adding an auto-increment column requires a lock", nil), + ErrAlterOperationNotSupportedReasonHiddenFts: mysql.Message("Cannot replace hidden FTSDOCID with a user-visible one", nil), + ErrAlterOperationNotSupportedReasonChangeFts: mysql.Message("Cannot drop or rename FTSDOCID", nil), + ErrAlterOperationNotSupportedReasonFts: mysql.Message("Fulltext index creation requires a lock", nil), + ErrDupUnknownInIndex: mysql.Message("Duplicate entry for key '%-.192s'", nil), + ErrIdentCausesTooLongPath: mysql.Message("Long database name and identifier for object resulted in path length exceeding %d characters. Path: '%s'.", nil), + ErrAlterOperationNotSupportedReasonNotNull: mysql.Message("cannot silently convert NULL values, as required in this SQLMODE", nil), + ErrMustChangePasswordLogin: mysql.Message("Your password has expired. To log in you must change it using a client that supports expired passwords.", nil), + ErrRowInWrongPartition: mysql.Message("Found a row in wrong partition %s", []int{0}), + ErrGeneratedColumnFunctionIsNotAllowed: mysql.Message("Expression of generated column '%s' contains a disallowed function.", nil), + ErrGeneratedColumnRowValueIsNotAllowed: mysql.Message("Expression of generated column '%s' cannot refer to a row value", nil), + ErrUnsupportedAlterInplaceOnVirtualColumn: mysql.Message("INPLACE ADD or DROP of virtual columns cannot be combined with other ALTER TABLE actions.", nil), + ErrWrongFKOptionForGeneratedColumn: mysql.Message("Cannot define foreign key with %s clause on a generated column.", nil), + ErrBadGeneratedColumn: mysql.Message("The value specified for generated column '%s' in table '%s' is not allowed.", nil), + ErrUnsupportedOnGeneratedColumn: mysql.Message("'%s' is not supported for generated columns.", nil), + ErrGeneratedColumnNonPrior: mysql.Message("Generated column can refer only to generated columns defined prior to it.", nil), + ErrDependentByGeneratedColumn: mysql.Message("Column '%s' has a generated column dependency.", nil), + ErrGeneratedColumnRefAutoInc: mysql.Message("Generated column '%s' cannot refer to auto-increment column.", nil), + ErrWarnConflictingHint: mysql.Message("Hint %s is ignored as conflicting/duplicated.", nil), + ErrUnresolvedHintName: mysql.Message("Unresolved name '%s' for %s hint", nil), + ErrInvalidFieldSize: mysql.Message("Invalid size for column '%s'.", nil), + ErrInvalidArgumentForLogarithm: mysql.Message("Invalid argument for logarithm", nil), + ErrAggregateOrderNonAggQuery: mysql.Message("Expression #%d of ORDER BY contains aggregate function and applies to the result of a non-aggregated query", nil), + ErrIncorrectType: mysql.Message("Incorrect type for argument %s in function %s.", nil), + ErrFieldInOrderNotSelect: mysql.Message("Expression #%d of ORDER BY clause is not in SELECT list, references column '%s' which is not in SELECT list; this is incompatible with %s", nil), + ErrAggregateInOrderNotSelect: mysql.Message("Expression #%d of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with %s", nil), + ErrInvalidJSONData: mysql.Message("Invalid JSON data provided to function %s: %s", nil), + ErrInvalidJSONText: mysql.Message("Invalid JSON text: %-.192s", []int{0}), + ErrInvalidJSONPath: mysql.Message("Invalid JSON path expression %s.", nil), + ErrInvalidTypeForJSON: mysql.Message("Invalid data type for JSON data in argument %d to function %s; a JSON string or JSON type is required.", nil), + ErrInvalidJSONPathWildcard: mysql.Message("In this situation, path expressions may not contain the * and ** tokens.", nil), + ErrInvalidJSONContainsPathType: mysql.Message("The second argument can only be either 'one' or 'all'.", nil), + ErrJSONUsedAsKey: mysql.Message("JSON column '%-.192s' cannot be used in key specification.", nil), + ErrJSONDocumentNULLKey: mysql.Message("JSON documents may not contain NULL member names.", nil), + ErrSecureTransportRequired: mysql.Message("Connections using insecure transport are prohibited while --require_secure_transport=ON.", nil), + ErrBadUser: mysql.Message("User %s does not exist.", nil), + ErrUserAlreadyExists: mysql.Message("User %s already exists.", nil), + ErrInvalidJSONPathArrayCell: mysql.Message("A path expression is not a path to a cell in an array.", nil), + ErrInvalidEncryptionOption: mysql.Message("Invalid encryption option.", nil), + ErrTooLongValueForType: mysql.Message("Too long enumeration/set value for column %s.", nil), + ErrPKIndexCantBeInvisible: mysql.Message("A primary key index cannot be invisible", nil), + ErrWindowNoSuchWindow: mysql.Message("Window name '%s' is not defined.", nil), + ErrWindowCircularityInWindowGraph: mysql.Message("There is a circularity in the window dependency graph.", nil), + ErrWindowNoChildPartitioning: mysql.Message("A window which depends on another cannot define partitioning.", nil), + ErrWindowNoInherentFrame: mysql.Message("Window '%s' has a frame definition, so cannot be referenced by another window.", nil), + ErrWindowNoRedefineOrderBy: mysql.Message("Window '%s' cannot inherit '%s' since both contain an ORDER BY clause.", nil), + ErrWindowFrameStartIllegal: mysql.Message("Window '%s': frame start cannot be UNBOUNDED FOLLOWING.", nil), + ErrWindowFrameEndIllegal: mysql.Message("Window '%s': frame end cannot be UNBOUNDED PRECEDING.", nil), + ErrWindowFrameIllegal: mysql.Message("Window '%s': frame start or end is negative, NULL or of non-integral type", nil), + ErrWindowRangeFrameOrderType: mysql.Message("Window '%s' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", nil), + ErrWindowRangeFrameTemporalType: mysql.Message("Window '%s' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed.", nil), + ErrWindowRangeFrameNumericType: mysql.Message("Window '%s' with RANGE frame has ORDER BY expression of numeric type, INTERVAL bound value not allowed.", nil), + ErrWindowRangeBoundNotConstant: mysql.Message("Window '%s' has a non-constant frame bound.", nil), + ErrWindowDuplicateName: mysql.Message("Window '%s' is defined twice.", nil), + ErrWindowIllegalOrderBy: mysql.Message("Window '%s': ORDER BY or PARTITION BY uses legacy position indication which is not supported, use expression.", nil), + ErrWindowInvalidWindowFuncUse: mysql.Message("You cannot use the window function '%s' in this context.'", nil), + ErrWindowInvalidWindowFuncAliasUse: mysql.Message("You cannot use the alias '%s' of an expression containing a window function in this context.'", nil), + ErrWindowNestedWindowFuncUseInWindowSpec: mysql.Message("You cannot nest a window function in the specification of window '%s'.", nil), + ErrWindowRowsIntervalUse: mysql.Message("Window '%s': INTERVAL can only be used with RANGE frames.", nil), + ErrWindowNoGroupOrderUnused: mysql.Message("ASC or DESC with GROUP BY isn't allowed with window functions; put ASC or DESC in ORDER BY", nil), + ErrWindowExplainJSON: mysql.Message("To get information about window functions use EXPLAIN FORMAT=JSON", nil), + ErrWindowFunctionIgnoresFrame: mysql.Message("Window function '%s' ignores the frame clause of window '%s' and aggregates over the whole partition", nil), + ErrRoleNotGranted: mysql.Message("%s is is not granted to %s", nil), + ErrMaxExecTimeExceeded: mysql.Message("Query execution was interrupted, max_execution_time exceeded.", nil), + ErrLockAcquireFailAndNoWaitSet: mysql.Message("Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set.", nil), + ErrNotHintUpdatable: mysql.Message("Variable '%s' cannot be set using SET_VAR hint.", nil), + ErrDataTruncatedFunctionalIndex: mysql.Message("Data truncated for expression index '%s' at row %d", nil), + ErrDataOutOfRangeFunctionalIndex: mysql.Message("Value is out of range for expression index '%s' at row %d", nil), + ErrFunctionalIndexOnJSONOrGeometryFunction: mysql.Message("Cannot create an expression index on a function that returns a JSON or GEOMETRY value", nil), + ErrFunctionalIndexRefAutoIncrement: mysql.Message("Expression index '%s' cannot refer to an auto-increment column", nil), + ErrCannotDropColumnFunctionalIndex: mysql.Message("Cannot drop column '%s' because it is used by an expression index. In order to drop the column, you must remove the expression index", nil), + ErrFunctionalIndexPrimaryKey: mysql.Message("The primary key cannot be an expression index", nil), + ErrFunctionalIndexOnLob: mysql.Message("Cannot create an expression index on an expression that returns a BLOB or TEXT. Please consider using CAST", nil), + ErrFunctionalIndexFunctionIsNotAllowed: mysql.Message("Expression of expression index '%s' contains a disallowed function", nil), + ErrFulltextFunctionalIndex: mysql.Message("Fulltext expression index is not supported", nil), + ErrSpatialFunctionalIndex: mysql.Message("Spatial expression index is not supported", nil), + ErrWrongKeyColumnFunctionalIndex: mysql.Message("The used storage engine cannot index the expression '%s'", nil), + ErrFunctionalIndexOnField: mysql.Message("Expression index on a column is not supported. Consider using a regular index instead", nil), + ErrFKIncompatibleColumns: mysql.Message("Referencing column '%s' in foreign key constraint '%s' are incompatible", nil), + ErrFunctionalIndexRowValueIsNotAllowed: mysql.Message("Expression of expression index '%s' cannot refer to a row value", nil), + ErrDependentByFunctionalIndex: mysql.Message("Column '%s' has an expression index dependency and cannot be dropped or renamed", nil), + ErrInvalidJSONValueForFuncIndex: mysql.Message("Invalid JSON value for CAST for expression index '%s'", nil), + ErrJSONValueOutOfRangeForFuncIndex: mysql.Message("Out of range JSON value for CAST for expression index '%s'", nil), + ErrFunctionalIndexDataIsTooLong: mysql.Message("Data too long for expression index '%s'", nil), + ErrFunctionalIndexNotApplicable: mysql.Message("Cannot use expression index '%s' due to type or collation conversion", nil), + ErrUnsupportedConstraintCheck: mysql.Message("%s is not supported", nil), // MariaDB errors. - ErrOnlyOneDefaultPartionAllowed: "Only one DEFAULT partition allowed", - ErrWrongPartitionTypeExpectedSystemTime: "Wrong partitioning type, expected type: `SYSTEM_TIME`", - ErrSystemVersioningWrongPartitions: "Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT", - ErrSequenceRunOut: "Sequence '%-.64s.%-.64s' has run out", - ErrSequenceInvalidData: "Sequence '%-.64s.%-.64s' values are conflicting", - ErrSequenceAccessFail: "Sequence '%-.64s.%-.64s' access error", - ErrNotSequence: "'%-.64s.%-.64s' is not a SEQUENCE", - ErrUnknownSequence: "Unknown SEQUENCE: '%-.300s'", - ErrWrongInsertIntoSequence: "Wrong INSERT into a SEQUENCE. One can only do single table INSERT into a sequence object (like with mysqldump). If you want to change the SEQUENCE, use ALTER SEQUENCE instead.", - ErrSequenceInvalidTableStructure: "Sequence '%-.64s.%-.64s' table structure is invalid (%s)", + ErrOnlyOneDefaultPartionAllowed: mysql.Message("Only one DEFAULT partition allowed", nil), + ErrWrongPartitionTypeExpectedSystemTime: mysql.Message("Wrong partitioning type, expected type: `SYSTEM_TIME`", nil), + ErrSystemVersioningWrongPartitions: mysql.Message("Wrong Partitions: must have at least one HISTORY and exactly one last CURRENT", nil), + ErrSequenceRunOut: mysql.Message("Sequence '%-.64s.%-.64s' has run out", nil), + ErrSequenceInvalidData: mysql.Message("Sequence '%-.64s.%-.64s' values are conflicting", nil), + ErrSequenceAccessFail: mysql.Message("Sequence '%-.64s.%-.64s' access error", nil), + ErrNotSequence: mysql.Message("'%-.64s.%-.64s' is not a SEQUENCE", nil), + ErrUnknownSequence: mysql.Message("Unknown SEQUENCE: '%-.300s'", nil), + ErrWrongInsertIntoSequence: mysql.Message("Wrong INSERT into a SEQUENCE. One can only do single table INSERT into a sequence object (like with mysqldump). If you want to change the SEQUENCE, use ALTER SEQUENCE instead.", nil), + ErrSequenceInvalidTableStructure: mysql.Message("Sequence '%-.64s.%-.64s' table structure is invalid (%s)", nil), // TiDB errors. - ErrMemExceedThreshold: "%s holds %dB memory, exceeds threshold %dB.%s", - ErrForUpdateCantRetry: "[%d] can not retry select for update statement", - ErrAdminCheckTable: "TiDB admin check table failed.", - ErrTxnTooLarge: "Transaction is too large, size: %d", - ErrWriteConflictInTiDB: "Write conflict, txnStartTS %d is stale", - ErrInvalidPluginID: "Wrong plugin id: %s, valid plugin id is [name]-[version], both name and version should not contain '-'", - ErrInvalidPluginManifest: "Cannot read plugin %s's manifest", - ErrInvalidPluginName: "Plugin load with %s but got wrong name %s", - ErrInvalidPluginVersion: "Plugin load with %s but got %s", - ErrDuplicatePlugin: "Plugin [%s] is redeclared", - ErrInvalidPluginSysVarName: "Plugin %s's sysVar %s must start with its plugin name %s", - ErrRequireVersionCheckFail: "Plugin %s require %s be %v but got %v", - ErrUnsupportedReloadPlugin: "Plugin %s isn't loaded so cannot be reloaded", - ErrUnsupportedReloadPluginVar: "Reload plugin with different sysVar is unsupported %v", - ErrTableLocked: "Table '%s' was locked in %s by %v", - ErrNotExist: "Error: key not exist", - ErrTxnRetryable: "Error: KV error safe to retry %s ", - ErrCannotSetNilValue: "can not set nil value", - ErrInvalidTxn: "invalid transaction", - ErrEntryTooLarge: "entry too large, the max entry size is %d, the size of data is %d", - ErrNotImplemented: "not implemented", - ErrInfoSchemaExpired: "Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV", - ErrInfoSchemaChanged: "Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`", - ErrBadNumber: "Bad Number", - ErrCastAsSignedOverflow: "Cast to signed converted positive out-of-range integer to it's negative complement", - ErrCastNegIntAsUnsigned: "Cast to unsigned converted negative integer to it's positive complement", - ErrInvalidYearFormat: "invalid year format", - ErrInvalidYear: "invalid year", - ErrIncorrectDatetimeValue: "Incorrect datetime value: '%s'", - ErrInvalidTimeFormat: "invalid time format: '%v'", - ErrInvalidWeekModeFormat: "invalid week mode format: '%v'", - ErrFieldGetDefaultFailed: "Field '%s' get default value fail", - ErrIndexOutBound: "Index column %s offset out of bound, offset: %d, row: %v", - ErrUnsupportedOp: "operation not supported", - ErrRowNotFound: "can not find the row: %s", - ErrTableStateCantNone: "table %s can't be in none state", - ErrColumnStateCantNone: "column %s can't be in none state", - ErrColumnStateNonPublic: "can not use non-public column", - ErrIndexStateCantNone: "index %s can't be in none state", - ErrInvalidRecordKey: "invalid record key", - ErrUnsupportedValueForVar: "variable '%s' does not yet support value: %s", - ErrUnsupportedIsolationLevel: "The isolation level '%s' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error", - ErrInvalidDDLWorker: "Invalid DDL worker", - ErrUnsupportedDDLOperation: "Unsupported %s", - ErrNotOwner: "TiDB server is not a DDL owner", - ErrCantDecodeRecord: "Cannot decode %s value, because %v", - ErrInvalidDDLJob: "Invalid DDL job", - ErrInvalidDDLJobFlag: "Invalid DDL job flag", - ErrWaitReorgTimeout: "Timeout waiting for data reorganization", - ErrInvalidStoreVersion: "Invalid storage current version: %d", - ErrUnknownTypeLength: "Unknown length for type %d", - ErrUnknownFractionLength: "Unknown length for type %d and fraction %d", - ErrInvalidDDLJobVersion: "Version %d of DDL job is greater than current one: %d", - ErrInvalidSplitRegionRanges: "Failed to split region ranges", - ErrReorgPanic: "Reorg worker panic", - ErrInvalidDDLState: "Invalid %s state: %v", - ErrCancelledDDLJob: "Cancelled DDL job", - ErrRepairTable: "Failed to repair table: %s", - ErrLoadPrivilege: "Load privilege table fail: %s", - ErrInvalidPrivilegeType: "unknown privilege type %s", - ErrUnknownFieldType: "unknown field type", - ErrInvalidSequence: "invalid sequence", - ErrInvalidType: "invalid type", - ErrCantGetValidID: "Cannot get a valid auto-ID when retrying the statement", - ErrCantSetToNull: "cannot set variable to null", - ErrSnapshotTooOld: "snapshot is older than GC safe point %s", - ErrInvalidTableID: "invalid TableID", - ErrInvalidAutoRandom: "Invalid auto random: %s", - ErrInvalidHashKeyFlag: "invalid encoded hash key flag", - ErrInvalidListIndex: "invalid list index", - ErrInvalidListMetaData: "invalid list meta data", - ErrWriteOnSnapshot: "write on snapshot", - ErrInvalidKey: "invalid key", - ErrInvalidIndexKey: "invalid index key", - ErrDataInConsistent: "data isn't equal", - ErrDDLReorgElementNotExist: "DDL reorg element does not exist", - ErrDDLJobNotFound: "DDL Job:%v not found", - ErrCancelFinishedDDLJob: "This job:%v is finished, so can't be cancelled", - ErrCannotCancelDDLJob: "This job:%v is almost finished, can't be cancelled now", - ErrUnknownAllocatorType: "Invalid allocator type", - ErrAutoRandReadFailed: "Failed to read auto-random value from storage engine", - ErrInvalidIncrementAndOffset: "Invalid auto_increment settings: auto_increment_increment: %d, auto_increment_offset: %d, both of them must be in range [1..65535]", + ErrMemExceedThreshold: mysql.Message("%s holds %dB memory, exceeds threshold %dB.%s", nil), + ErrForUpdateCantRetry: mysql.Message("[%d] can not retry select for update statement", nil), + ErrAdminCheckTable: mysql.Message("TiDB admin check table failed.", nil), + ErrTxnTooLarge: mysql.Message("Transaction is too large, size: %d", nil), + ErrWriteConflictInTiDB: mysql.Message("Write conflict, txnStartTS %d is stale", nil), + ErrInvalidPluginID: mysql.Message("Wrong plugin id: %s, valid plugin id is [name]-[version], both name and version should not contain '-'", nil), + ErrInvalidPluginManifest: mysql.Message("Cannot read plugin %s's manifest", nil), + ErrInvalidPluginName: mysql.Message("Plugin load with %s but got wrong name %s", nil), + ErrInvalidPluginVersion: mysql.Message("Plugin load with %s but got %s", nil), + ErrDuplicatePlugin: mysql.Message("Plugin [%s] is redeclared", nil), + ErrInvalidPluginSysVarName: mysql.Message("Plugin %s's sysVar %s must start with its plugin name %s", nil), + ErrRequireVersionCheckFail: mysql.Message("Plugin %s require %s be %v but got %v", nil), + ErrUnsupportedReloadPlugin: mysql.Message("Plugin %s isn't loaded so cannot be reloaded", nil), + ErrUnsupportedReloadPluginVar: mysql.Message("Reload plugin with different sysVar is unsupported %v", nil), + ErrTableLocked: mysql.Message("Table '%s' was locked in %s by %v", nil), + ErrNotExist: mysql.Message("Error: key not exist", nil), + ErrTxnRetryable: mysql.Message("Error: KV error safe to retry %s ", []int{0}), + ErrCannotSetNilValue: mysql.Message("can not set nil value", nil), + ErrInvalidTxn: mysql.Message("invalid transaction", nil), + ErrEntryTooLarge: mysql.Message("entry too large, the max entry size is %d, the size of data is %d", nil), + ErrNotImplemented: mysql.Message("not implemented", nil), + ErrInfoSchemaExpired: mysql.Message("Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV", nil), + ErrInfoSchemaChanged: mysql.Message("Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`", nil), + ErrBadNumber: mysql.Message("Bad Number", nil), + ErrCastAsSignedOverflow: mysql.Message("Cast to signed converted positive out-of-range integer to it's negative complement", nil), + ErrCastNegIntAsUnsigned: mysql.Message("Cast to unsigned converted negative integer to it's positive complement", nil), + ErrInvalidYearFormat: mysql.Message("invalid year format", nil), + ErrInvalidYear: mysql.Message("invalid year", nil), + ErrIncorrectDatetimeValue: mysql.Message("Incorrect datetime value: '%s'", []int{0}), + ErrInvalidTimeFormat: mysql.Message("invalid time format: '%v'", []int{0}), + ErrInvalidWeekModeFormat: mysql.Message("invalid week mode format: '%v'", nil), + ErrFieldGetDefaultFailed: mysql.Message("Field '%s' get default value fail", nil), + ErrIndexOutBound: mysql.Message("Index column %s offset out of bound, offset: %d, row: %v", []int{2}), + ErrUnsupportedOp: mysql.Message("operation not supported", nil), + ErrRowNotFound: mysql.Message("can not find the row: %s", []int{0}), + ErrTableStateCantNone: mysql.Message("table %s can't be in none state", nil), + ErrColumnStateCantNone: mysql.Message("column %s can't be in none state", nil), + ErrColumnStateNonPublic: mysql.Message("can not use non-public column", nil), + ErrIndexStateCantNone: mysql.Message("index %s can't be in none state", nil), + ErrInvalidRecordKey: mysql.Message("invalid record key", nil), + ErrUnsupportedValueForVar: mysql.Message("variable '%s' does not yet support value: %s", nil), + ErrUnsupportedIsolationLevel: mysql.Message("The isolation level '%s' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error", nil), + ErrInvalidDDLWorker: mysql.Message("Invalid DDL worker", nil), + ErrUnsupportedDDLOperation: mysql.Message("Unsupported %s", nil), + ErrNotOwner: mysql.Message("TiDB server is not a DDL owner", nil), + ErrCantDecodeRecord: mysql.Message("Cannot decode %s value, because %v", nil), + ErrInvalidDDLJob: mysql.Message("Invalid DDL job", nil), + ErrInvalidDDLJobFlag: mysql.Message("Invalid DDL job flag", nil), + ErrWaitReorgTimeout: mysql.Message("Timeout waiting for data reorganization", nil), + ErrInvalidStoreVersion: mysql.Message("Invalid storage current version: %d", nil), + ErrUnknownTypeLength: mysql.Message("Unknown length for type %d", nil), + ErrUnknownFractionLength: mysql.Message("Unknown length for type %d and fraction %d", nil), + ErrInvalidDDLJobVersion: mysql.Message("Version %d of DDL job is greater than current one: %d", nil), + ErrInvalidSplitRegionRanges: mysql.Message("Failed to split region ranges: %s", nil), + ErrReorgPanic: mysql.Message("Reorg worker panic", nil), + ErrInvalidDDLState: mysql.Message("Invalid %s state: %v", nil), + ErrCancelledDDLJob: mysql.Message("Cancelled DDL job", nil), + ErrRepairTable: mysql.Message("Failed to repair table: %s", nil), + ErrLoadPrivilege: mysql.Message("Load privilege table fail: %s", nil), + ErrInvalidPrivilegeType: mysql.Message("unknown privilege type %s", nil), + ErrUnknownFieldType: mysql.Message("unknown field type", nil), + ErrInvalidSequence: mysql.Message("invalid sequence", nil), + ErrInvalidType: mysql.Message("invalid type", nil), + ErrCantGetValidID: mysql.Message("Cannot get a valid auto-ID when retrying the statement", nil), + ErrCantSetToNull: mysql.Message("cannot set variable to null", nil), + ErrSnapshotTooOld: mysql.Message("snapshot is older than GC safe point %s", nil), + ErrInvalidTableID: mysql.Message("invalid TableID", nil), + ErrInvalidAutoRandom: mysql.Message("Invalid auto random: %s", nil), + ErrInvalidHashKeyFlag: mysql.Message("invalid encoded hash key flag", nil), + ErrInvalidListIndex: mysql.Message("invalid list index", nil), + ErrInvalidListMetaData: mysql.Message("invalid list meta data", nil), + ErrWriteOnSnapshot: mysql.Message("write on snapshot", nil), + ErrInvalidKey: mysql.Message("invalid key", nil), + ErrInvalidIndexKey: mysql.Message("invalid index key", nil), + ErrDataInConsistent: mysql.Message("data isn't equal", nil), + ErrDDLReorgElementNotExist: mysql.Message("DDL reorg element does not exist", nil), + ErrDDLJobNotFound: mysql.Message("DDL Job:%v not found", nil), + ErrCancelFinishedDDLJob: mysql.Message("This job:%v is finished, so can't be cancelled", nil), + ErrCannotCancelDDLJob: mysql.Message("This job:%v is almost finished, can't be cancelled now", nil), + ErrUnknownAllocatorType: mysql.Message("Invalid allocator type", nil), + ErrAutoRandReadFailed: mysql.Message("Failed to read auto-random value from storage engine", nil), + ErrInvalidIncrementAndOffset: mysql.Message("Invalid auto_increment settings: auto_increment_increment: %d, auto_increment_offset: %d, both of them must be in range [1..65535]", nil), + + ErrWarnOptimizerHintInvalidInteger: mysql.Message("integer value is out of range in '%s'", nil), + ErrWarnOptimizerHintUnsupportedHint: mysql.Message("Optimizer hint %s is not supported by TiDB and is ignored", nil), + ErrWarnOptimizerHintInvalidToken: mysql.Message("Cannot use %s '%s' (tok = %d) in an optimizer hint", nil), + ErrWarnMemoryQuotaOverflow: mysql.Message("Max value of MEMORY_QUOTA is %d bytes, ignore this invalid limit", nil), + ErrWarnOptimizerHintParseError: mysql.Message("Optimizer hint syntax error at %v", nil), + + ErrSequenceUnsupportedTableOption: mysql.Message("Unsupported sequence table-option %s", nil), + ErrColumnTypeUnsupportedNextValue: mysql.Message("Unsupported sequence default value for column type '%s'", nil), + ErrAddColumnWithSequenceAsDefault: mysql.Message("Unsupported using sequence as default value in add column '%s'", nil), + ErrUnsupportedType: mysql.Message("Unsupported type %T", nil), + ErrAnalyzeMissIndex: mysql.Message("Index '%s' in field list does not exist in table '%s'", nil), + ErrCartesianProductUnsupported: mysql.Message("Cartesian product is unsupported", nil), + ErrPreparedStmtNotFound: mysql.Message("Prepared statement not found", nil), + ErrWrongParamCount: mysql.Message("Wrong parameter count", nil), + ErrSchemaChanged: mysql.Message("Schema has changed", nil), + ErrUnknownPlan: mysql.Message("Unknown plan", nil), + ErrPrepareMulti: mysql.Message("Can not prepare multiple statements", nil), + ErrPrepareDDL: mysql.Message("Can not prepare DDL statements with parameters", nil), + ErrResultIsEmpty: mysql.Message("Result is empty", nil), + ErrBuildExecutor: mysql.Message("Failed to build executor", nil), + ErrBatchInsertFail: mysql.Message("Batch insert failed, please clean the table and try again.", nil), + ErrGetStartTS: mysql.Message("Can not get start ts", nil), + ErrPrivilegeCheckFail: mysql.Message("privilege check fail", nil), // this error message should begin lowercased to be compatible with the test + ErrInvalidWildCard: mysql.Message("Wildcard fields without any table name appears in wrong place", nil), + ErrMixOfGroupFuncAndFieldsIncompatible: mysql.Message("In aggregated query without GROUP BY, expression #%d of SELECT list contains nonaggregated column '%s'; this is incompatible with sql_mode=only_full_group_by", nil), + ErrUnsupportedSecondArgumentType: mysql.Message("JSON_OBJECTAGG: unsupported second argument type %v", nil), + ErrLockExpire: mysql.Message("TTL manager has timed out, pessimistic locks may expire, please commit or rollback this transaction", nil), + ErrTableOptionUnionUnsupported: mysql.Message("CREATE/ALTER table with union option is not supported", nil), + ErrTableOptionInsertMethodUnsupported: mysql.Message("CREATE/ALTER table with insert method option is not supported", nil), - ErrWarnOptimizerHintInvalidInteger: "integer value is out of range in '%s'", - ErrWarnOptimizerHintUnsupportedHint: "Optimizer hint %s is not supported by TiDB and is ignored", - ErrWarnOptimizerHintInvalidToken: "Cannot use %s '%s' (tok = %d) in an optimizer hint", - ErrWarnMemoryQuotaOverflow: "Max value of MEMORY_QUOTA is %d bytes, ignore this invalid limit", - ErrWarnOptimizerHintParseError: "Optimizer hint syntax error at %v", + ErrBRIEBackupFailed: mysql.Message("Backup failed: %s", nil), + ErrBRIERestoreFailed: mysql.Message("Restore failed: %s", nil), + ErrBRIEImportFailed: mysql.Message("Import failed: %s", nil), + ErrBRIEExportFailed: mysql.Message("Export failed: %s", nil), - ErrSequenceUnsupportedTableOption: "Unsupported sequence table-option %s", - ErrColumnTypeUnsupportedNextValue: "Unsupported sequence default value for column type '%s'", - ErrAddColumnWithSequenceAsDefault: "Unsupported using sequence as default value in add column '%s'", - ErrUnsupportedType: "Unsupported type %T", - ErrAnalyzeMissIndex: "Index '%s' in field list does not exist in table '%s'", - ErrCartesianProductUnsupported: "Cartesian product is unsupported", - ErrPreparedStmtNotFound: "Prepared statement not found", - ErrWrongParamCount: "Wrong parameter count", - ErrSchemaChanged: "Schema has changed", - ErrUnknownPlan: "Unknown plan", - ErrPrepareMulti: "Can not prepare multiple statements", - ErrPrepareDDL: "Can not prepare DDL statements with parameters", - ErrResultIsEmpty: "Result is empty", - ErrBuildExecutor: "Failed to build executor", - ErrBatchInsertFail: "Batch insert failed, please clean the table and try again.", - ErrGetStartTS: "Can not get start ts", - ErrPrivilegeCheckFail: "privilege check fail", // this error message should begin lowercased to be compatible with the test - ErrInvalidWildCard: "Wildcard fields without any table name appears in wrong place", - ErrMixOfGroupFuncAndFieldsIncompatible: "In aggregated query without GROUP BY, expression #%d of SELECT list contains nonaggregated column '%s'; this is incompatible with sql_mode=only_full_group_by", - ErrUnsupportedSecondArgumentType: "JSON_OBJECTAGG: unsupported second argument type %v", - ErrLockExpire: "TTL manager has timed out, pessimistic locks may expire, please commit or rollback this transaction", - ErrTableOptionUnionUnsupported: "CREATE/ALTER table with union option is not supported", - ErrTableOptionInsertMethodUnsupported: "CREATE/ALTER table with insert method option is not supported", + ErrInvalidTableSample: mysql.Message("Invalid TABLESAMPLE: %s", nil), - ErrBRIEBackupFailed: "Backup failed: %s", - ErrBRIERestoreFailed: "Restore failed: %s", - ErrBRIEImportFailed: "Import failed: %s", - ErrBRIEExportFailed: "Export failed: %s", + ErrJSONObjectKeyTooLong: mysql.Message("TiDB does not yet support JSON objects with the key length >= 65536", nil), + ErrPartitionStatsMissing: mysql.Message("Build table: %s global-level stats failed due to missing partition-level stats", nil), - ErrInvalidPlacementSpec: "Invalid placement policy '%s': %s", + ErrInvalidPlacementSpec: mysql.Message("Invalid placement policy '%s': %s", nil), + ErrPlacementPolicyCheck: mysql.Message("Placement policy didn't meet the constraint, reason: %s", nil), + ErrMultiStatementDisabled: mysql.Message("client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk", nil), // TiKV/PD errors. - ErrPDServerTimeout: "PD server timeout", - ErrTiKVServerTimeout: "TiKV server timeout", - ErrTiKVServerBusy: "TiKV server is busy", - ErrResolveLockTimeout: "Resolve lock timeout", - ErrRegionUnavailable: "Region is unavailable", - ErrGCTooEarly: "GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v", - ErrWriteConflict: "Write conflict, txnStartTS=%d, conflictStartTS=%d, conflictCommitTS=%d, key=%s", - ErrTiKVStoreLimit: "Store token is up to the limit, store id = %d", - ErrPrometheusAddrIsNotSet: "Prometheus address is not set in PD and etcd", - ErrTiKVStaleCommand: "TiKV server reports stale command", - ErrTiKVMaxTimestampNotSynced: "TiKV max timestamp is not synced", + ErrPDServerTimeout: mysql.Message("PD server timeout", nil), + ErrTiKVServerTimeout: mysql.Message("TiKV server timeout", nil), + ErrTiKVServerBusy: mysql.Message("TiKV server is busy", nil), + ErrTiFlashServerTimeout: mysql.Message("TiFlash server timeout", nil), + ErrTiFlashServerBusy: mysql.Message("TiFlash server is busy", nil), + ErrResolveLockTimeout: mysql.Message("Resolve lock timeout", nil), + ErrRegionUnavailable: mysql.Message("Region is unavailable", nil), + ErrGCTooEarly: mysql.Message("GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v", nil), + ErrWriteConflict: mysql.Message("Write conflict, txnStartTS=%d, conflictStartTS=%d, conflictCommitTS=%d, key=%s", []int{3}), + ErrTiKVStoreLimit: mysql.Message("Store token is up to the limit, store id = %d", nil), + ErrPrometheusAddrIsNotSet: mysql.Message("Prometheus address is not set in PD and etcd", nil), + ErrTiKVStaleCommand: mysql.Message("TiKV server reports stale command", nil), + ErrTiKVMaxTimestampNotSynced: mysql.Message("TiKV max timestamp is not synced", nil), } diff --git a/errno/infoschema.go b/errno/infoschema.go new file mode 100644 index 0000000000000..60eb5358c83b6 --- /dev/null +++ b/errno/infoschema.go @@ -0,0 +1,157 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package errno + +import ( + "sync" + "time" +) + +// The error summary is protected by a mutex for simplicity. +// It is not expected to be hot unless there are concurrent workloads +// that are generating high error/warning counts, in which case +// the system probably has other issues already. + +// ErrorSummary summarizes errors and warnings +type ErrorSummary struct { + ErrorCount int + WarningCount int + FirstSeen time.Time + LastSeen time.Time +} + +// instanceStatistics provide statistics for a tidb-server instance. +type instanceStatistics struct { + sync.Mutex + global map[uint16]*ErrorSummary + users map[string]map[uint16]*ErrorSummary + hosts map[string]map[uint16]*ErrorSummary +} + +var stats instanceStatistics + +func init() { + FlushStats() +} + +// FlushStats resets errors and warnings across global/users/hosts +func FlushStats() { + stats.Lock() + defer stats.Unlock() + stats.global = make(map[uint16]*ErrorSummary) + stats.users = make(map[string]map[uint16]*ErrorSummary) + stats.hosts = make(map[string]map[uint16]*ErrorSummary) +} + +func copyMap(oldMap map[uint16]*ErrorSummary) map[uint16]*ErrorSummary { + newMap := make(map[uint16]*ErrorSummary, len(oldMap)) + for k, v := range oldMap { + newMap[k] = &ErrorSummary{ + ErrorCount: v.ErrorCount, + WarningCount: v.WarningCount, + FirstSeen: v.FirstSeen, + LastSeen: v.LastSeen, + } + } + return newMap +} + +// GlobalStats summarizes errors and warnings across all users/hosts +func GlobalStats() map[uint16]*ErrorSummary { + stats.Lock() + defer stats.Unlock() + return copyMap(stats.global) +} + +// UserStats summarizes per-user +func UserStats() map[string]map[uint16]*ErrorSummary { + stats.Lock() + defer stats.Unlock() + newMap := make(map[string]map[uint16]*ErrorSummary, len(stats.users)) + for k, v := range stats.users { + newMap[k] = copyMap(v) + } + return newMap +} + +// HostStats summarizes per remote-host +func HostStats() map[string]map[uint16]*ErrorSummary { + stats.Lock() + defer stats.Unlock() + newMap := make(map[string]map[uint16]*ErrorSummary, len(stats.hosts)) + for k, v := range stats.hosts { + newMap[k] = copyMap(v) + } + return newMap +} + +func initCounters(errCode uint16, user, host string) { + seen := time.Now() + stats.Lock() + defer stats.Unlock() + + if _, ok := stats.global[errCode]; !ok { + stats.global[errCode] = &ErrorSummary{FirstSeen: seen} + } + if _, ok := stats.users[user]; !ok { + stats.users[user] = make(map[uint16]*ErrorSummary) + } + if _, ok := stats.users[user][errCode]; !ok { + stats.users[user][errCode] = &ErrorSummary{FirstSeen: seen} + } + if _, ok := stats.hosts[host]; !ok { + stats.hosts[host] = make(map[uint16]*ErrorSummary) + } + if _, ok := stats.hosts[host][errCode]; !ok { + stats.hosts[host][errCode] = &ErrorSummary{FirstSeen: seen} + } +} + +// IncrementError increments the global/user/host statistics for an errCode +func IncrementError(errCode uint16, user, host string) { + seen := time.Now() + initCounters(errCode, user, host) + + stats.Lock() + defer stats.Unlock() + + // Increment counter + update last seen + stats.global[errCode].ErrorCount++ + stats.global[errCode].LastSeen = seen + // Increment counter + update last seen + stats.users[user][errCode].ErrorCount++ + stats.users[user][errCode].LastSeen = seen + // Increment counter + update last seen + stats.hosts[host][errCode].ErrorCount++ + stats.hosts[host][errCode].LastSeen = seen +} + +// IncrementWarning increments the global/user/host statistics for an errCode +func IncrementWarning(errCode uint16, user, host string) { + seen := time.Now() + initCounters(errCode, user, host) + + stats.Lock() + defer stats.Unlock() + + // Increment counter + update last seen + stats.global[errCode].WarningCount++ + stats.global[errCode].LastSeen = seen + // Increment counter + update last seen + stats.users[user][errCode].WarningCount++ + stats.users[user][errCode].LastSeen = seen + // Increment counter + update last seen + stats.hosts[host][errCode].WarningCount++ + stats.hosts[host][errCode].LastSeen = seen +} diff --git a/errno/infoschema_test.go b/errno/infoschema_test.go new file mode 100644 index 0000000000000..1a8d0f0c3984c --- /dev/null +++ b/errno/infoschema_test.go @@ -0,0 +1,89 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package errno + +import ( + "testing" + + . "github.com/pingcap/check" +) + +func TestT(t *testing.T) { + TestingT(t) +} + +var _ = Suite(&testErrno{}) + +type testErrno struct{} + +func (s *testErrno) TestCopySafety(c *C) { + + IncrementError(123, "user", "host") + IncrementError(321, "user2", "host2") + IncrementWarning(123, "user", "host") + IncrementWarning(999, "user", "host") + IncrementWarning(222, "u", "h") + + globalCopy := GlobalStats() + userCopy := UserStats() + hostCopy := HostStats() + + IncrementError(123, "user", "host") + IncrementError(999, "user2", "host2") + IncrementError(123, "user3", "host") + IncrementWarning(123, "user", "host") + IncrementWarning(222, "u", "h") + IncrementWarning(222, "a", "b") + IncrementWarning(333, "c", "d") + + // global stats + c.Assert(stats.global[123].ErrorCount, Equals, 3) + c.Assert(globalCopy[123].ErrorCount, Equals, 1) + + // user stats + c.Assert(len(stats.users), Equals, 6) + c.Assert(len(userCopy), Equals, 3) + c.Assert(stats.users["user"][123].ErrorCount, Equals, 2) + c.Assert(stats.users["user"][123].WarningCount, Equals, 2) + c.Assert(userCopy["user"][123].ErrorCount, Equals, 1) + c.Assert(userCopy["user"][123].WarningCount, Equals, 1) + + // ensure there is no user3 in userCopy + _, ok := userCopy["user3"] + c.Assert(ok, IsFalse) + _, ok = stats.users["user3"] + c.Assert(ok, IsTrue) + _, ok = userCopy["a"] + c.Assert(ok, IsFalse) + _, ok = stats.users["a"] + c.Assert(ok, IsTrue) + + // host stats + c.Assert(len(stats.hosts), Equals, 5) + c.Assert(len(hostCopy), Equals, 3) + IncrementError(123, "user3", "newhost") + c.Assert(len(stats.hosts), Equals, 6) + c.Assert(len(hostCopy), Equals, 3) + + // ensure there is no newhost in hostCopy + _, ok = hostCopy["newhost"] + c.Assert(ok, IsFalse) + _, ok = stats.hosts["newhost"] + c.Assert(ok, IsTrue) + _, ok = hostCopy["b"] + c.Assert(ok, IsFalse) + _, ok = stats.hosts["b"] + c.Assert(ok, IsTrue) + +} diff --git a/errno/logredaction.md b/errno/logredaction.md new file mode 100644 index 0000000000000..3009b19f87f46 --- /dev/null +++ b/errno/logredaction.md @@ -0,0 +1,33 @@ +# Log Redaction + +Background: + +Issue: https://github.com/pingcap/tidb/issues/18566 + +Our database may store some sensitive information, such as customer ID number, credit card number, etc. This sensitive information sometimes exists in the error message in some manners like a form of key-value, and this information will be printed in the log along with the error. + +Some of our users do not want this sensitive information to spread along with logs. Therefore, our requirement is to provide a switch which can hide these possible sensitive information when printing the log. + + +For example, +```sql +mysql> create table t (a int, unique key (a)); +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t values (1),(1); +ERROR 1062 (23000): Duplicate entry '1' for key 'a' +mysql> set @@session.tidb_redact_log=1; +Query OK, 0 rows affected (0.00 sec) + +mysql> insert into t values (1),(1); +ERROR 1062 (23000): Duplicate entry '?' for key '?' +``` + +And its corresponding log is: +``` +[2020/10/20 11:45:37.796 +08:00] [INFO] [conn.go:800] ["command dispatched failed"] [conn=5] [connInfo="id:5, addr:127.0.0.1:57222 status:10, collation:utf8_general_ci, user:root"] [command=Query] [status="inTxn:0, autocommit:1"] [sql="insert into t values (1),(1)"] [txn_mode=OPTIMISTIC] [err="[kv:1062]Duplicate entry '1' for key 'a'"] + +[2020/10/20 11:45:49.539 +08:00] [INFO] [conn.go:800] ["command dispatched failed"] [conn=5] [connInfo="id:5, addr:127.0.0.1:57222 status:10, collation:utf8_general_ci, user:root"] [command=Query] [status="inTxn:0, autocommit:1"] [sql="insert into t values ( ? ) , ( ? )"] [txn_mode=OPTIMISTIC] [err="[kv:1062]Duplicate entry '?' for key '?'"] +``` + +As you can see, after enabling `tidb_redact_log`, sensitive content is hidden both in the error message and in the log. diff --git a/errors.toml b/errors.toml new file mode 100644 index 0000000000000..0b5f0397890db --- /dev/null +++ b/errors.toml @@ -0,0 +1,1638 @@ +# AUTOGENERATED BY github.com/pingcap/errors/errdoc-gen +# YOU CAN CHANGE THE 'description'/'workaround' FIELDS IF THEM ARE IMPROPER. + +["admin:8003"] +error = ''' +TiDB admin check table failed. +''' + +["admin:8223"] +error = ''' +data isn't equal +''' + +["admin:8224"] +error = ''' +DDL Job:%v not found +''' + +["admin:8225"] +error = ''' +This job:%v is finished, so can't be cancelled +''' + +["admin:8226"] +error = ''' +This job:%v is almost finished, can't be cancelled now +''' + +["autoid:1075"] +error = ''' +Incorrect table definition; there can be only one auto column and it must be defined as a key +''' + +["autoid:1467"] +error = ''' +Failed to read auto-increment value from storage engine +''' + +["autoid:8058"] +error = ''' +Invalid allocator type +''' + +["autoid:8059"] +error = ''' +Failed to read auto-random value from storage engine +''' + +["ddl:1025"] +error = ''' +Error on rename of '%-.210s' to '%-.210s' (errno: %d - %s) +''' + +["ddl:1048"] +error = ''' +Column '%-.192s' cannot be null +''' + +["ddl:1054"] +error = ''' +Unknown column '%-.192s' in '%-.192s' +''' + +["ddl:1059"] +error = ''' +Identifier name '%-.100s' is too long +''' + +["ddl:1061"] +error = ''' +Duplicate key name '%-.192s' +''' + +["ddl:1067"] +error = ''' +Invalid default value for '%-.192s' +''' + +["ddl:1090"] +error = ''' +You can't delete all columns with ALTER TABLE; use DROP TABLE instead +''' + +["ddl:1091"] +error = ''' +Can't DROP '%-.192s'; check that column/key exists +''' + +["ddl:1102"] +error = ''' +Incorrect database name '%-.100s' +''' + +["ddl:1103"] +error = ''' +Incorrect table name '%-.100s' +''' + +["ddl:1111"] +error = ''' +Invalid use of group function +''' + +["ddl:1113"] +error = ''' +A table must have at least 1 column +''' + +["ddl:1115"] +error = ''' +Unknown character set: '%-.64s' +''' + +["ddl:1166"] +error = ''' +Incorrect column name '%-.100s' +''' + +["ddl:1171"] +error = ''' +All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead +''' + +["ddl:1177"] +error = ''' +Can't open table +''' + +["ddl:1214"] +error = ''' +The used table type doesn't support FULLTEXT indexes +''' + +["ddl:1248"] +error = ''' +Every derived table must have its own alias +''' + +["ddl:1253"] +error = ''' +COLLATION '%s' is not valid for CHARACTER SET '%s' +''' + +["ddl:1264"] +error = ''' +Out of range value for column '%s' at row %d +''' + +["ddl:1265"] +error = ''' +Data truncated for column '%s' at row %d +''' + +["ddl:1273"] +error = ''' +Unsupported collation when new collation is enabled: '%-.64s' +''' + +["ddl:1280"] +error = ''' +Incorrect index name '%-.100s' +''' + +["ddl:1286"] +error = ''' +Unknown storage engine '%s' +''' + +["ddl:1292"] +error = ''' +Truncated incorrect %-.64s value: '%-.128s' +''' + +["ddl:1294"] +error = ''' +Invalid ON UPDATE clause for '%-.192s' column +''' + +["ddl:1302"] +error = ''' +Conflicting declarations: 'CHARACTER SET %s' and 'CHARACTER SET %s' +''' + +["ddl:1347"] +error = ''' +'%-.192s.%-.192s' is not %s +''' + +["ddl:1350"] +error = ''' +View's SELECT contains a '%s' clause +''' + +["ddl:1353"] +error = ''' +View's SELECT and view's field list have different column counts +''' + +["ddl:1481"] +error = ''' +MAXVALUE can only be used in last partition definition +''' + +["ddl:1486"] +error = ''' +Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed +''' + +["ddl:1488"] +error = ''' +Field in list of fields for partition function not found in table +''' + +["ddl:1491"] +error = ''' +The %-.192s function returns the wrong type +''' + +["ddl:1493"] +error = ''' +VALUES LESS THAN value must be strictly increasing for each partition +''' + +["ddl:1495"] +error = ''' +Multiple definition of same constant in list partitioning +''' + +["ddl:1499"] +error = ''' +Too many partitions (including subpartitions) were defined +''' + +["ddl:1503"] +error = ''' +A %-.192s must include all columns in the table's partitioning function +''' + +["ddl:1505"] +error = ''' +Partition management on a not partitioned table is not possible +''' + +["ddl:1507"] +error = ''' +Error in list of partitions to %-.64s +''' + +["ddl:1508"] +error = ''' +Cannot remove all partitions, use DROP TABLE instead +''' + +["ddl:1509"] +error = ''' +COALESCE PARTITION can only be used on HASH/KEY partitions +''' + +["ddl:1517"] +error = ''' +Duplicate partition name %-.192s +''' + +["ddl:1564"] +error = ''' +This partition function is not allowed +''' + +["ddl:1654"] +error = ''' +Partition column values of incorrect type +''' + +["ddl:1659"] +error = ''' +Field '%-.192s' is of a not allowed type for this type of partitioning +''' + +["ddl:1697"] +error = ''' +VALUES value for partition '%-.64s' must have type INT +''' + +["ddl:1731"] +error = ''' +Non matching attribute '%-.64s' between partition and table +''' + +["ddl:1732"] +error = ''' +Table to exchange with partition is partitioned: '%-.64s' +''' + +["ddl:1736"] +error = ''' +Tables have different definitions +''' + +["ddl:1737"] +error = ''' +Found a row that does not match the partition +''' + +["ddl:1740"] +error = ''' +Table to exchange with partition has foreign key references: '%-.64s' +''' + +["ddl:1846"] +error = ''' +%s is not supported. Reason: %s. Try %s. +''' + +["ddl:3102"] +error = ''' +Expression of generated column '%s' contains a disallowed function. +''' + +["ddl:3106"] +error = ''' +'%s' is not supported for generated columns. +''' + +["ddl:3109"] +error = ''' +Generated column '%s' cannot refer to auto-increment column. +''' + +["ddl:3505"] +error = ''' +Too long enumeration/set value for column %s. +''' + +["ddl:3522"] +error = ''' +A primary key index cannot be invisible +''' + +["ddl:3754"] +error = ''' +Expression index '%s' cannot refer to an auto-increment column +''' + +["ddl:3756"] +error = ''' +The primary key cannot be an expression index +''' + +["ddl:3758"] +error = ''' +Expression of expression index '%s' contains a disallowed function +''' + +["ddl:3762"] +error = ''' +Expression index on a column is not supported. Consider using a regular index instead +''' + +["ddl:3764"] +error = ''' +Expression of generated column '%s' cannot refer to a row value +''' + +["ddl:3800"] +error = ''' +Expression of expression index '%s' cannot refer to a row value +''' + +["ddl:4135"] +error = ''' +Sequence '%-.64s.%-.64s' has run out +''' + +["ddl:4136"] +error = ''' +Sequence '%-.64s.%-.64s' values are conflicting +''' + +["ddl:4137"] +error = ''' +Sequence '%-.64s.%-.64s' access error +''' + +["ddl:4138"] +error = ''' +'%-.64s.%-.64s' is not a SEQUENCE +''' + +["ddl:4139"] +error = ''' +Unknown SEQUENCE: '%-.300s' +''' + +["ddl:8200"] +error = ''' +Unsupported partition by range columns +''' + +["ddl:8210"] +error = ''' +Invalid %!s(MISSING) state: %!v(MISSING) +''' + +["ddl:8215"] +error = ''' +Failed to repair table: %s +''' + +["ddl:8216"] +error = ''' +Invalid auto random: %s +''' + +["ddl:8227"] +error = ''' +Unsupported sequence table-option %s +''' + +["ddl:8228"] +error = ''' +Unsupported sequence default value for column type '%s' +''' + +["ddl:8230"] +error = ''' +Unsupported using sequence as default value in add column '%s' +''' + +["ddl:8231"] +error = ''' +%s is not supported +''' + +["ddl:8232"] +error = ''' +CREATE/ALTER table with union option is not supported +''' + +["ddl:8233"] +error = ''' +CREATE/ALTER table with insert method option is not supported +''' + +["ddl:8234"] +error = ''' +Invalid placement policy '%s': %s +''' + +["ddl:8236"] +error = ''' +Placement policy didn't meet the constraint, reason: %s +''' + +["domain:8027"] +error = ''' +Information schema is out of date: schema failed to update in 1 lease, please make sure TiDB can connect to TiKV +''' + +["domain:8028"] +error = ''' +Information schema is changed during the execution of the statement(for example, table definition may be updated by other DDL ran in parallel). If you see this error often, try increasing `tidb_max_delta_schema_count`. [try again later] +''' + +["domain:9009"] +error = ''' +Prometheus address is not set in PD and etcd +''' + +["executor:1044"] +error = ''' +Access denied for user '%-.48s'@'%-.64s' to database '%-.192s' +''' + +["executor:1049"] +error = ''' +Unknown database '%-.192s' +''' + +["executor:1133"] +error = ''' +Can't find any matching row in the user table +''' + +["executor:1142"] +error = ''' +%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s' +''' + +["executor:1213"] +error = ''' +Deadlock found when trying to get lock; try restarting transaction +''' + +["executor:1242"] +error = ''' +Subquery returns more than 1 row +''' + +["executor:1295"] +error = ''' +This command is not supported in the prepared statement protocol yet +''' + +["executor:1317"] +error = ''' +Query execution was interrupted +''' + +["executor:1347"] +error = ''' +'%-.192s.%-.192s' is not %s +''' + +["executor:1390"] +error = ''' +Prepared statement contains too many placeholders +''' + +["executor:1396"] +error = ''' +Operation %s failed for %.256s +''' + +["executor:1410"] +error = ''' +You are not allowed to create a user with GRANT +''' + +["executor:1568"] +error = ''' +Transaction characteristics can't be changed while a transaction is in progress +''' + +["executor:1827"] +error = ''' +The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD() function. +''' + +["executor:8003"] +error = ''' +TiDB admin check table failed. +''' + +["executor:8114"] +error = ''' +Unknown plan +''' + +["executor:8115"] +error = ''' +Can not prepare multiple statements +''' + +["executor:8116"] +error = ''' +Can not prepare DDL statements with parameters +''' + +["executor:8117"] +error = ''' +Result is empty +''' + +["executor:8118"] +error = ''' +Failed to build executor +''' + +["executor:8119"] +error = ''' +Batch insert failed, please clean the table and try again. +''' + +["executor:8120"] +error = ''' +Can not get start ts +''' + +["executor:8124"] +error = ''' +Backup failed: %s +''' + +["executor:8125"] +error = ''' +Restore failed: %s +''' + +["executor:8126"] +error = ''' +Import failed: %s +''' + +["executor:8127"] +error = ''' +Export failed: %s +''' + +["executor:8212"] +error = ''' +Failed to split region ranges: %s +''' + +["expression:1139"] +error = ''' +Got error '%-.64s' from regexp +''' + +["expression:1235"] +error = ''' +function %s has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions +''' + +["expression:1241"] +error = ''' +Operand should contain %d column(s) +''' + +["expression:1260"] +error = ''' +Some rows were cut by GROUPCONCAT(%s) +''' + +["expression:1267"] +error = ''' +Illegal mix of collations (%s,%s) and (%s,%s) for operation '%s' +''' + +["expression:1270"] +error = ''' +Illegal mix of collations (%s,%s), (%s,%s), (%s,%s) for operation '%s' +''' + +["expression:1271"] +error = ''' +Illegal mix of collations for operation '%s' +''' + +["expression:1365"] +error = ''' +Division by 0 +''' + +["expression:1582"] +error = ''' +Incorrect parameter count in the call to native function '%-.192s' +''' + +["expression:3020"] +error = ''' +Invalid argument for logarithm +''' + +["expression:3064"] +error = ''' +Incorrect type for argument %s in function %s. +''' + +["expression:8128"] +error = ''' +Invalid TABLESAMPLE: %s +''' + +["json:3069"] +error = ''' +Invalid JSON data provided to function %s: %s +''' + +["json:3140"] +error = ''' +Invalid JSON text: %-.192s +''' + +["json:3143"] +error = ''' +Invalid JSON path expression %s. +''' + +["json:3149"] +error = ''' +In this situation, path expressions may not contain the * and ** tokens. +''' + +["json:3150"] +error = ''' +The second argument can only be either 'one' or 'all'. +''' + +["json:3158"] +error = ''' +JSON documents may not contain NULL member names. +''' + +["json:3165"] +error = ''' +A path expression is not a path to a cell in an array. +''' + +["json:8066"] +error = ''' +JSON_OBJECTAGG: unsupported second argument type %v +''' + +["kv:1062"] +error = ''' +Duplicate entry '%-.64s' for key '%-.192s' +''' + +["kv:8004"] +error = ''' +Transaction is too large, size: %d +''' + +["kv:8005"] +error = ''' +Write conflict, txnStartTS %d is stale [try again later] +''' + +["kv:8021"] +error = ''' +Error: key not exist +''' + +["kv:8022"] +error = ''' +Error: KV error safe to retry %s [try again later] +''' + +["kv:8023"] +error = ''' +can not set nil value +''' + +["kv:8024"] +error = ''' +invalid transaction +''' + +["kv:8025"] +error = ''' +entry too large, the max entry size is %d, the size of data is %d +''' + +["kv:8026"] +error = ''' +not implemented +''' + +["kv:9007"] +error = ''' +Write conflict, txnStartTS=%d, conflictStartTS=%d, conflictCommitTS=%d, key=%s [try again later] +''' + +["meta:1007"] +error = ''' +Can't create database '%-.192s'; database exists +''' + +["meta:1049"] +error = ''' +Unknown database '%-.192s' +''' + +["meta:1050"] +error = ''' +Table '%-.192s' already exists +''' + +["meta:1146"] +error = ''' +Table '%-.192s.%-.192s' doesn't exist +''' + +["meta:8235"] +error = ''' +DDL reorg element does not exist +''' + +["planner:1044"] +error = ''' +Access denied for user '%-.48s'@'%-.64s' to database '%-.192s' +''' + +["planner:1045"] +error = ''' +Access denied for user '%-.48s'@'%-.64s' +''' + +["planner:1046"] +error = ''' +No database selected +''' + +["planner:1048"] +error = ''' +Column '%-.192s' cannot be null +''' + +["planner:1051"] +error = ''' +Unknown table '%-.100s' +''' + +["planner:1052"] +error = ''' +Column '%-.192s' in %-.192s is ambiguous +''' + +["planner:1054"] +error = ''' +Unknown column '%-.192s' in '%-.192s' +''' + +["planner:1055"] +error = ''' +Expression #%d of %s is not in GROUP BY clause and contains nonaggregated column '%s' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by +''' + +["planner:1056"] +error = ''' +Can't group on '%-.192s' +''' + +["planner:1060"] +error = ''' +Duplicate column name '%-.192s' +''' + +["planner:1066"] +error = ''' +Not unique table/alias: '%-.192s' +''' + +["planner:1094"] +error = ''' +Unknown thread id: %d +''' + +["planner:1105"] +error = ''' +Unknown error +''' + +["planner:1109"] +error = ''' +Unknown table '%-.192s' in %-.32s +''' + +["planner:1111"] +error = ''' +Invalid use of group function +''' + +["planner:1136"] +error = ''' +Column count doesn't match value count at row %d +''' + +["planner:1142"] +error = ''' +%-.128s command denied to user '%-.48s'@'%-.64s' for table '%-.64s' +''' + +["planner:1146"] +error = ''' +Table '%-.192s.%-.192s' doesn't exist +''' + +["planner:1176"] +error = ''' +Key '%-.192s' doesn't exist in table '%-.192s' +''' + +["planner:1210"] +error = ''' +Incorrect arguments to %s +''' + +["planner:1221"] +error = ''' +Incorrect usage of %s and %s +''' + +["planner:1222"] +error = ''' +The used SELECT statements have a different number of columns +''' + +["planner:1227"] +error = ''' +Access denied; you need (at least one of) the %-.128s privilege(s) for this operation +''' + +["planner:1235"] +error = ''' +This version of TiDB doesn't yet support '%s' +''' + +["planner:1241"] +error = ''' +Operand should contain %d column(s) +''' + +["planner:1247"] +error = ''' +Reference '%-.64s' not supported (%s) +''' + +["planner:1250"] +error = ''' +Table '%s' from one of the %ss cannot be used in %s +''' + +["planner:1288"] +error = ''' +The target table %-.100s of the %s is not updatable +''' + +["planner:1345"] +error = ''' +EXPLAIN/SHOW can not be issued; lacking privileges for underlying table +''' + +["planner:1356"] +error = ''' +View '%-.192s.%-.192s' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them +''' + +["planner:1462"] +error = ''' +`%-.192s`.`%-.192s` contains view recursion +''' + +["planner:1706"] +error = ''' +Primary key/partition key update is not allowed since the table is updated both as '%-.192s' and '%-.192s'. +''' + +["planner:1747"] +error = ''' +PARTITION () clause on non partitioned table +''' + +["planner:1791"] +error = ''' +Unknown EXPLAIN format name: '%s' +''' + +["planner:1815"] +error = ''' +Internal : %s +''' + +["planner:3029"] +error = ''' +Expression #%d of ORDER BY contains aggregate function and applies to the result of a non-aggregated query +''' + +["planner:3065"] +error = ''' +Expression #%d of ORDER BY clause is not in SELECT list, references column '%s' which is not in SELECT list; this is incompatible with %s +''' + +["planner:3066"] +error = ''' +Expression #%d of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with %s +''' + +["planner:3105"] +error = ''' +The value specified for generated column '%s' in table '%s' is not allowed. +''' + +["planner:3106"] +error = ''' +'%s' is not supported for generated columns. +''' + +["planner:3126"] +error = ''' +Hint %s is ignored as conflicting/duplicated. +''' + +["planner:3128"] +error = ''' +Unresolved name '%s' for %s hint +''' + +["planner:3579"] +error = ''' +Window name '%s' is not defined. +''' + +["planner:3580"] +error = ''' +There is a circularity in the window dependency graph. +''' + +["planner:3581"] +error = ''' +A window which depends on another cannot define partitioning. +''' + +["planner:3582"] +error = ''' +Window '%s' has a frame definition, so cannot be referenced by another window. +''' + +["planner:3583"] +error = ''' +Window '%s' cannot inherit '%s' since both contain an ORDER BY clause. +''' + +["planner:3584"] +error = ''' +Window '%s': frame start cannot be UNBOUNDED FOLLOWING. +''' + +["planner:3585"] +error = ''' +Window '%s': frame end cannot be UNBOUNDED PRECEDING. +''' + +["planner:3586"] +error = ''' +Window '%s': frame start or end is negative, NULL or of non-integral type +''' + +["planner:3587"] +error = ''' +Window '%s' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type +''' + +["planner:3588"] +error = ''' +Window '%s' with RANGE frame has ORDER BY expression of datetime type. Only INTERVAL bound value allowed. +''' + +["planner:3589"] +error = ''' +Window '%s' with RANGE frame has ORDER BY expression of numeric type, INTERVAL bound value not allowed. +''' + +["planner:3590"] +error = ''' +Window '%s' has a non-constant frame bound. +''' + +["planner:3591"] +error = ''' +Window '%s' is defined twice. +''' + +["planner:3593"] +error = ''' +You cannot use the window function '%s' in this context.' +''' + +["planner:3594"] +error = ''' +You cannot use the alias '%s' of an expression containing a window function in this context.' +''' + +["planner:3596"] +error = ''' +Window '%s': INTERVAL can only be used with RANGE frames. +''' + +["planner:3599"] +error = ''' +Window function '%s' ignores the frame clause of window '%s' and aggregates over the whole partition +''' + +["planner:3637"] +error = ''' +Variable '%s' cannot be set using SET_VAR hint. +''' + +["planner:8108"] +error = ''' +Unsupported type %T +''' + +["planner:8109"] +error = ''' +Index '%s' in field list does not exist in table '%s' +''' + +["planner:8110"] +error = ''' +Cartesian product is unsupported +''' + +["planner:8111"] +error = ''' +Prepared statement not found +''' + +["planner:8112"] +error = ''' +Wrong parameter count +''' + +["planner:8113"] +error = ''' +Schema has changed +''' + +["planner:8121"] +error = ''' +privilege check fail +''' + +["planner:8122"] +error = ''' +Wildcard fields without any table name appears in wrong place +''' + +["planner:8123"] +error = ''' +In aggregated query without GROUP BY, expression #%d of SELECT list contains nonaggregated column '%s'; this is incompatible with sql_mode=only_full_group_by +''' + +["privilege:1141"] +error = ''' +There is no such grant defined for user '%-.48s' on host '%-.64s' +''' + +["privilege:3530"] +error = ''' +%s is is not granted to %s +''' + +["schema:1007"] +error = ''' +Can't create database '%-.192s'; database exists +''' + +["schema:1008"] +error = ''' +Can't drop database '%-.192s'; database doesn't exist +''' + +["schema:1045"] +error = ''' +Access denied for user '%-.48s'@'%-.64s' (using password: %s) +''' + +["schema:1049"] +error = ''' +Unknown database '%-.192s' +''' + +["schema:1050"] +error = ''' +Table '%-.192s' already exists +''' + +["schema:1051"] +error = ''' +Unknown table '%-.100s' +''' + +["schema:1054"] +error = ''' +Unknown column '%-.192s' in '%-.192s' +''' + +["schema:1060"] +error = ''' +Duplicate column name '%-.192s' +''' + +["schema:1061"] +error = ''' +Duplicate key name '%-.192s' +''' + +["schema:1066"] +error = ''' +Not unique table/alias: '%-.192s' +''' + +["schema:1068"] +error = ''' +Multiple primary key defined +''' + +["schema:1070"] +error = ''' +Too many key parts specified; max %d parts allowed +''' + +["schema:1091"] +error = ''' +Can't DROP '%-.192s'; check that column/key exists +''' + +["schema:1099"] +error = ''' +Table '%-.192s' was locked with a READ lock and can't be updated +''' + +["schema:1100"] +error = ''' +Table '%-.192s' was not locked with LOCK TABLES +''' + +["schema:1146"] +error = ''' +Table '%-.192s.%-.192s' doesn't exist +''' + +["schema:1176"] +error = ''' +Key '%-.192s' doesn't exist in table '%-.192s' +''' + +["schema:1215"] +error = ''' +Cannot add foreign key constraint +''' + +["schema:1239"] +error = ''' +Incorrect foreign key definition for '%-.192s': %s +''' + +["schema:1347"] +error = ''' +'%-.192s.%-.192s' is not %s +''' + +["schema:1831"] +error = ''' +Duplicate index '%-.64s' defined on the table '%-.64s.%-.64s'. This is deprecated and will be disallowed in a future release. +''' + +["schema:3162"] +error = ''' +User %s does not exist. +''' + +["schema:3163"] +error = ''' +User %s already exists. +''' + +["schema:4139"] +error = ''' +Unknown SEQUENCE: '%-.300s' +''' + +["schema:8020"] +error = ''' +Table '%s' was locked in %s by %v +''' + +["session:8002"] +error = ''' +[%d] can not retry select for update statement +''' + +["structure:8217"] +error = ''' +invalid encoded hash key flag +''' + +["structure:8218"] +error = ''' +invalid list index +''' + +["structure:8219"] +error = ''' +invalid list meta data +''' + +["structure:8220"] +error = ''' +write on snapshot +''' + +["table:1048"] +error = ''' +Column '%-.192s' cannot be null +''' + +["table:1054"] +error = ''' +Unknown column '%-.192s' in '%-.192s' +''' + +["table:1192"] +error = ''' +Can't execute the given command because you have active locked tables or an active transaction +''' + +["table:1364"] +error = ''' +Field '%-.192s' doesn't have a default value +''' + +["table:1366"] +error = ''' +Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d +''' + +["table:1526"] +error = ''' +Table has no partition for value %-.64s +''' + +["table:1735"] +error = ''' +Unknown partition '%-.64s' in table '%-.64s' +''' + +["table:1748"] +error = ''' +Found a row not matching the given partition set +''' + +["table:4135"] +error = ''' +Sequence '%-.64s.%-.64s' has run out +''' + +["table:8039"] +error = ''' +Index column %s offset out of bound, offset: %d, row: %v +''' + +["table:8040"] +error = ''' +operation not supported +''' + +["table:8041"] +error = ''' +can not find the row: %s +''' + +["table:8042"] +error = ''' +table %s can't be in none state +''' + +["table:8043"] +error = ''' +can not use non-public column +''' + +["table:8044"] +error = ''' +index %s can't be in none state +''' + +["table:8045"] +error = ''' +invalid record key +''' + +["table:8046"] +error = ''' +column %s can't be in none state +''' + +["tikv:1105"] +error = ''' +Unknown error +''' + +["tikv:1205"] +error = ''' +Lock wait timeout exceeded; try restarting transaction +''' + +["tikv:1317"] +error = ''' +Query execution was interrupted +''' + +["tikv:3572"] +error = ''' +Statement aborted because lock(s) could not be acquired immediately and NOWAIT is set. +''' + +["tikv:8229"] +error = ''' +TTL manager has timed out, pessimistic locks may expire, please commit or rollback this transaction +''' + +["tikv:9001"] +error = ''' +PD server timeout +''' + +["tikv:9002"] +error = ''' +TiKV server timeout +''' + +["tikv:9003"] +error = ''' +TiKV server is busy +''' + +["tikv:9004"] +error = ''' +Resolve lock timeout +''' + +["tikv:9005"] +error = ''' +Region is unavailable +''' + +["tikv:9006"] +error = ''' +GC life time is shorter than transaction duration, transaction starts at %v, GC safe point is %v +''' + +["tikv:9008"] +error = ''' +Store token is up to the limit, store id = %d +''' + +["tikv:9010"] +error = ''' +TiKV server reports stale command +''' + +["tikv:9011"] +error = ''' +TiKV max timestamp is not synced +''' + +["tikv:9012"] +error = ''' +TiFlash server timeout +''' + +["tikv:9013"] +error = ''' +TiFlash server is busy +''' + +["types:1063"] +error = ''' +Incorrect column specifier for column '%-.192s' +''' + +["types:1064"] +error = ''' +You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use +''' + +["types:1074"] +error = ''' +Column length too big for column '%-.192s' (max = %d); use BLOB or TEXT instead +''' + +["types:1097"] +error = ''' +Too many strings for column %-.192s and SET +''' + +["types:1264"] +error = ''' +Out of range value for column '%s' at row %d +''' + +["types:1265"] +error = ''' +Data truncated for column '%s' at row %d +''' + +["types:1291"] +error = ''' +Column '%-.100s' has duplicated value '%-.64s' in %s +''' + +["types:1292"] +error = ''' +Truncated incorrect %-.64s value: '%-.128s' +''' + +["types:1365"] +error = ''' +Division by 0 +''' + +["types:1367"] +error = ''' +Illegal %s '%-.192s' value found during parsing +''' + +["types:1406"] +error = ''' +Data too long for column '%s' at row %d +''' + +["types:1411"] +error = ''' +Incorrect %-.32s value: '%-.128s' for function %-.32s +''' + +["types:1425"] +error = ''' +Too big scale %d specified for column '%-.192s'. Maximum is %d. +''' + +["types:1426"] +error = ''' +Too big precision %d specified for column '%-.192s'. Maximum is %d. +''' + +["types:1427"] +error = ''' +For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '%-.192s'). +''' + +["types:1439"] +error = ''' +Display width out of range for column '%-.192s' (max = %d) +''' + +["types:1441"] +error = ''' +Datetime function: %-.32s field overflow +''' + +["types:1690"] +error = ''' +%s value is out of range in '%s' +''' + +["types:3013"] +error = ''' +Invalid size for column '%s'. +''' + +["types:8029"] +error = ''' +Bad Number +''' + +["types:8030"] +error = ''' +Cast to signed converted positive out-of-range integer to it's negative complement +''' + +["types:8031"] +error = ''' +Cast to unsigned converted negative integer to it's positive complement +''' + +["types:8032"] +error = ''' +invalid year format +''' + +["types:8033"] +error = ''' +invalid year +''' + +["types:8037"] +error = ''' +invalid week mode format: '%v' +''' + +["types:8129"] +error = ''' +TiDB does not yet support JSON objects with the key length >= 65536 +''' + +["types:8131"] +error = ''' +Build table: %s global-level stats failed due to missing partition-level stats +''' + +["variable:1193"] +error = ''' +Unknown system variable '%-.64s' +''' + +["variable:1231"] +error = ''' +Variable '%-.64s' can't be set to the value of '%-.200s' +''' + +["variable:1232"] +error = ''' +Incorrect argument type to variable '%-.64s' +''' + +["variable:1238"] +error = ''' +Variable '%-.192s' is a %s variable +''' + +["variable:1292"] +error = ''' +Truncated incorrect %-.64s value: '%-.128s' +''' + +["variable:1298"] +error = ''' +Unknown or incorrect time zone: '%-.64s' +''' + +["variable:1461"] +error = ''' +Can't create more than maxPreparedStmtCount statements (current value: %d) +''' + +["variable:1621"] +error = ''' +%s variable '%s' is read-only. Use SET %s to assign the value +''' + +["variable:8047"] +error = ''' +variable '%s' does not yet support value: %s +''' + +["variable:8048"] +error = ''' +The isolation level '%s' is not supported. Set tidb_skip_isolation_level_check=1 to skip this error +''' + +["variable:8055"] +error = ''' +snapshot is older than GC safe point %s +''' + diff --git a/executor/adapter.go b/executor/adapter.go index 68c97e6446033..f56271de9845e 100644 --- a/executor/adapter.go +++ b/executor/adapter.go @@ -14,6 +14,7 @@ package executor import ( + "bytes" "context" "fmt" "math" @@ -23,6 +24,7 @@ import ( "sync/atomic" "time" + "github.com/cznic/mathutil" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/log" @@ -42,9 +44,11 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/plancodec" @@ -55,6 +59,16 @@ import ( "go.uber.org/zap/zapcore" ) +// metrics option +var ( + totalQueryProcHistogramGeneral = metrics.TotalQueryProcHistogram.WithLabelValues(metrics.LblGeneral) + totalCopProcHistogramGeneral = metrics.TotalCopProcHistogram.WithLabelValues(metrics.LblGeneral) + totalCopWaitHistogramGeneral = metrics.TotalCopWaitHistogram.WithLabelValues(metrics.LblGeneral) + totalQueryProcHistogramInternal = metrics.TotalQueryProcHistogram.WithLabelValues(metrics.LblInternal) + totalCopProcHistogramInternal = metrics.TotalCopProcHistogram.WithLabelValues(metrics.LblInternal) + totalCopWaitHistogramInternal = metrics.TotalCopWaitHistogram.WithLabelValues(metrics.LblInternal) +) + // processinfoSetter is the interface use to set current running process info. type processinfoSetter interface { SetProcessInfo(string, time.Time, byte, uint64) @@ -284,7 +298,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { } return } - if str, ok := r.(string); !ok || !strings.HasPrefix(str, memory.PanicMemoryExceed) { + if str, ok := r.(string); !ok || !strings.Contains(str, memory.PanicMemoryExceed) { panic(r) } err = errors.Errorf("%v", r) @@ -292,7 +306,7 @@ func (a *ExecStmt) Exec(ctx context.Context) (_ sqlexec.RecordSet, err error) { }() sctx := a.Ctx - ctx = sessionctx.SetCommitCtx(ctx, sctx) + ctx = util.SetSessionID(ctx, sctx.GetSessionVars().ConnectionID) if _, ok := a.Plan.(*plannercore.Analyze); ok && sctx.GetSessionVars().InRestrictedSQL { oriStats, _ := sctx.GetSessionVars().GetSystemVar(variable.TiDBBuildStatsConcurrency) oriScan := sctx.GetSessionVars().DistSQLScanConcurrency() @@ -436,9 +450,10 @@ func (c *chunkRowRecordSet) Fields() []*ast.ResultField { func (c *chunkRowRecordSet) Next(ctx context.Context, chk *chunk.Chunk) error { chk.Reset() - for !chk.IsFull() && c.idx < len(c.rows) { - chk.AppendRow(c.rows[c.idx]) - c.idx++ + if !chk.IsFull() && c.idx < len(c.rows) { + numToAppend := mathutil.Min(len(c.rows)-c.idx, chk.RequiredRows()-chk.NumRows()) + chk.AppendRows(c.rows[c.idx : c.idx+numToAppend]) + c.idx += numToAppend } return nil } @@ -592,8 +607,19 @@ func UpdateForUpdateTS(seCtx sessionctx.Context, newForUpdateTS uint64) error { if !txn.Valid() { return errors.Trace(kv.ErrInvalidTxn) } + + // The Oracle serializable isolation is actually SI in pessimistic mode. + // Do not update ForUpdateTS when the user is using the Serializable isolation level. + // It can be used temporarily on the few occasions when an Oracle-like isolation level is needed. + // Support for this does not mean that TiDB supports serializable isolation of MySQL. + // tidb_skip_isolation_level_check should still be disabled by default. + if seCtx.GetSessionVars().IsIsolation(ast.Serializable) { + return nil + } if newForUpdateTS == 0 { - version, err := seCtx.GetStore().CurrentVersion() + // Because the ForUpdateTS is used for the snapshot for reading data in DML. + // We can avoid allocating a global TSO here to speed it up by using the local TSO. + version, err := seCtx.GetStore().CurrentVersion(seCtx.GetSessionVars().TxnCtx.TxnScope) if err != nil { return err } @@ -606,7 +632,11 @@ func UpdateForUpdateTS(seCtx sessionctx.Context, newForUpdateTS uint64) error { // handlePessimisticLockError updates TS and rebuild executor if the err is write conflict. func (a *ExecStmt) handlePessimisticLockError(ctx context.Context, err error) (Executor, error) { - txnCtx := a.Ctx.GetSessionVars().TxnCtx + sessVars := a.Ctx.GetSessionVars() + if err != nil && sessVars.IsIsolation(ast.Serializable) { + return nil, err + } + txnCtx := sessVars.TxnCtx var newForUpdateTS uint64 if deadlock, ok := errors.Cause(err).(*tikv.ErrDeadlock); ok { if !deadlock.IsRetryable { @@ -698,30 +728,30 @@ func (a *ExecStmt) buildExecutor() (Executor, error) { ctx := a.Ctx stmtCtx := ctx.GetSessionVars().StmtCtx if _, ok := a.Plan.(*plannercore.Execute); !ok { - // Do not sync transaction for Execute statement, because the real optimization work is done in - // "ExecuteExec.Build". - useMaxTS, err := plannercore.IsPointGetWithPKOrUniqueKeyByAutoCommit(ctx, a.Plan) - if err != nil { - return nil, err - } - if useMaxTS { - logutil.BgLogger().Debug("init txnStartTS with MaxUint64", zap.Uint64("conn", ctx.GetSessionVars().ConnectionID), zap.String("text", a.Text)) - err = ctx.InitTxnWithStartTS(math.MaxUint64) - } else if ctx.GetSessionVars().SnapshotTS != 0 { - if _, ok := a.Plan.(*plannercore.CheckTable); ok { - err = ctx.InitTxnWithStartTS(ctx.GetSessionVars().SnapshotTS) + if snapshotTS := ctx.GetSessionVars().SnapshotTS; snapshotTS != 0 { + if err := ctx.InitTxnWithStartTS(snapshotTS); err != nil { + return nil, err } - } - if err != nil { - return nil, err - } - - if stmtPri := stmtCtx.Priority; stmtPri == mysql.NoPriority { - switch { - case useMaxTS: - stmtCtx.Priority = kv.PriorityHigh - case a.LowerPriority: - stmtCtx.Priority = kv.PriorityLow + } else { + // Do not sync transaction for Execute statement, because the real optimization work is done in + // "ExecuteExec.Build". + useMaxTS, err := plannercore.IsPointGetWithPKOrUniqueKeyByAutoCommit(ctx, a.Plan) + if err != nil { + return nil, err + } + if useMaxTS { + logutil.BgLogger().Debug("init txnStartTS with MaxUint64", zap.Uint64("conn", ctx.GetSessionVars().ConnectionID), zap.String("text", a.Text)) + if err := ctx.InitTxnWithStartTS(math.MaxUint64); err != nil { + return nil, err + } + } + if stmtPri := stmtCtx.Priority; stmtPri == mysql.NoPriority { + switch { + case useMaxTS: + stmtCtx.Priority = kv.PriorityHigh + case a.LowerPriority: + stmtCtx.Priority = kv.PriorityLow + } } } } @@ -750,7 +780,7 @@ func (a *ExecStmt) buildExecutor() (Executor, error) { } e = executorExec.stmtExec } - a.isSelectForUpdate = b.hasLock && (!stmtCtx.InDeleteStmt && !stmtCtx.InUpdateStmt) + a.isSelectForUpdate = b.hasLock && (!stmtCtx.InDeleteStmt && !stmtCtx.InUpdateStmt && !stmtCtx.InInsertStmt) return e, nil } @@ -813,7 +843,7 @@ func (a *ExecStmt) FinishExecuteStmt(txnTS uint64, succ bool, hasMoreResults boo a.LogSlowQuery(txnTS, succ, hasMoreResults) a.SummaryStmt(succ) prevStmt := a.GetTextToLog() - if config.RedactLogEnabled() { + if sessVars.EnableRedactLog { sessVars.PrevStmt = FormatSQL(prevStmt, nil) } else { pps := types.CloneRow(sessVars.PreparedParams) @@ -851,13 +881,14 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { costTime := time.Since(sessVars.StartTime) + sessVars.DurationParse threshold := time.Duration(atomic.LoadUint64(&cfg.Log.SlowThreshold)) * time.Millisecond enable := cfg.Log.EnableSlowLog - // if the level is Debug, print slow logs anyway - if (!enable || costTime < threshold) && level > zapcore.DebugLevel { + // if the level is Debug, or trace is enabled, print slow logs anyway + force := level <= zapcore.DebugLevel || trace.IsEnabled() + if (!enable || costTime < threshold) && !force { return } var sql stringutil.StringerFunc normalizedSQL, digest := sessVars.StmtCtx.SQLDigest() - if config.RedactLogEnabled() { + if sessVars.EnableRedactLog { sql = FormatSQL(normalizedSQL, nil) } else if sensitiveStmt, ok := a.StmtNode.(ast.SensitiveStmtNode); ok { sql = FormatSQL(sensitiveStmt.SecureText(), nil) @@ -865,12 +896,25 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { sql = FormatSQL(a.Text, sessVars.PreparedParams) } - var tableIDs, indexNames string - if len(sessVars.StmtCtx.TableIDs) > 0 { - tableIDs = strings.Replace(fmt.Sprintf("%v", sessVars.StmtCtx.TableIDs), " ", ",", -1) - } + var indexNames string if len(sessVars.StmtCtx.IndexNames) > 0 { - indexNames = strings.Replace(fmt.Sprintf("%v", sessVars.StmtCtx.IndexNames), " ", ",", -1) + // remove duplicate index. + idxMap := make(map[string]struct{}) + buf := bytes.NewBuffer(make([]byte, 0, 4)) + buf.WriteByte('[') + for _, idx := range sessVars.StmtCtx.IndexNames { + _, ok := idxMap[idx] + if ok { + continue + } + idxMap[idx] = struct{}{} + if buf.Len() > 1 { + buf.WriteByte(',') + } + buf.WriteString(idx) + } + buf.WriteByte(']') + indexNames = buf.String() } var stmtDetail execdetails.StmtExecDetails stmtDetailRaw := a.GoCtx.Value(execdetails.StmtExecDetailKey) @@ -899,11 +943,12 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { MemMax: memMax, DiskMax: diskMax, Succ: succ, - Plan: getPlanTree(a.Plan), + Plan: getPlanTree(a.Ctx, a.Plan), PlanDigest: planDigest, Prepared: a.isPreparedStmt, HasMoreResults: hasMoreResults, PlanFromCache: sessVars.FoundInPlanCache, + PlanFromBinding: sessVars.FoundInBinding, RewriteInfo: sessVars.RewritePhaseInfo, KVTotal: time.Duration(atomic.LoadInt64(&stmtDetail.WaitKVRespDuration)), PDTotal: time.Duration(atomic.LoadInt64(&stmtDetail.WaitPDRespDuration)), @@ -924,13 +969,23 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { logutil.SlowQueryLogger.Debug(sessVars.SlowLogFormat(slowItems)) } else { logutil.SlowQueryLogger.Warn(sessVars.SlowLogFormat(slowItems)) - metrics.TotalQueryProcHistogram.Observe(costTime.Seconds()) - metrics.TotalCopProcHistogram.Observe(execDetail.ProcessTime.Seconds()) - metrics.TotalCopWaitHistogram.Observe(execDetail.WaitTime.Seconds()) + if sessVars.InRestrictedSQL { + totalQueryProcHistogramInternal.Observe(costTime.Seconds()) + totalCopProcHistogramInternal.Observe(execDetail.TimeDetail.ProcessTime.Seconds()) + totalCopWaitHistogramInternal.Observe(execDetail.TimeDetail.WaitTime.Seconds()) + } else { + totalQueryProcHistogramGeneral.Observe(costTime.Seconds()) + totalCopProcHistogramGeneral.Observe(execDetail.TimeDetail.ProcessTime.Seconds()) + totalCopWaitHistogramGeneral.Observe(execDetail.TimeDetail.WaitTime.Seconds()) + } var userString string if sessVars.User != nil { userString = sessVars.User.String() } + var tableIDs string + if len(sessVars.StmtCtx.TableIDs) > 0 { + tableIDs = strings.Replace(fmt.Sprintf("%v", sessVars.StmtCtx.TableIDs), " ", ",", -1) + } domain.GetDomain(a.Ctx).LogSlowQuery(&domain.SlowQueryInfo{ SQL: sql.String(), Digest: digest, @@ -950,12 +1005,12 @@ func (a *ExecStmt) LogSlowQuery(txnTS uint64, succ bool, hasMoreResults bool) { } // getPlanTree will try to get the select plan tree if the plan is select or the select plan of delete/update/insert statement. -func getPlanTree(p plannercore.Plan) string { +func getPlanTree(sctx sessionctx.Context, p plannercore.Plan) string { cfg := config.GetGlobalConfig() if atomic.LoadUint32(&cfg.Log.RecordPlanInSlowLog) == 0 { return "" } - planTree := plannercore.EncodePlan(p) + planTree, _ := getEncodedPlan(sctx, p, false, nil) if len(planTree) == 0 { return planTree } @@ -973,6 +1028,29 @@ func getPlanDigest(sctx sessionctx.Context, p plannercore.Plan) (normalized, pla return } +// getEncodedPlan gets the encoded plan, and generates the hint string if indicated. +func getEncodedPlan(sctx sessionctx.Context, p plannercore.Plan, genHint bool, n ast.StmtNode) (encodedPlan, hintStr string) { + var hintSet bool + encodedPlan = sctx.GetSessionVars().StmtCtx.GetEncodedPlan() + hintStr, hintSet = sctx.GetSessionVars().StmtCtx.GetPlanHint() + if len(encodedPlan) > 0 && (!genHint || hintSet) { + return + } + if len(encodedPlan) == 0 { + encodedPlan = plannercore.EncodePlan(p) + sctx.GetSessionVars().StmtCtx.SetEncodedPlan(encodedPlan) + } + if genHint { + hints := plannercore.GenHintsFromPhysicalPlan(p) + if n != nil { + hints = append(hints, hint.ExtractTableHintsFromStmtNode(n, nil)...) + } + hintStr = hint.RestoreOptimizerHints(hints) + sctx.GetSessionVars().StmtCtx.SetPlanHint(hintStr) + } + return +} + // SummaryStmt collects statements for information_schema.statements_summary func (a *ExecStmt) SummaryStmt(succ bool) { sessVars := a.Ctx.GetSessionVars() @@ -991,8 +1069,13 @@ func (a *ExecStmt) SummaryStmt(succ bool) { return } stmtCtx := sessVars.StmtCtx + // Make sure StmtType is filled even if succ is false. + if stmtCtx.StmtType == "" { + stmtCtx.StmtType = GetStmtLabel(a.StmtNode) + } normalizedSQL, digest := stmtCtx.SQLDigest() costTime := time.Since(sessVars.StartTime) + sessVars.DurationParse + charset, collation := sessVars.GetCharsetInfo() var prevSQL, prevSQLDigest string if _, ok := a.StmtNode.(*ast.CommitStmt); ok { @@ -1006,8 +1089,8 @@ func (a *ExecStmt) SummaryStmt(succ bool) { sessVars.SetPrevStmtDigest(digest) // No need to encode every time, so encode lazily. - planGenerator := func() string { - return plannercore.EncodePlan(a.Plan) + planGenerator := func() (string, string) { + return getEncodedPlan(a.Ctx, a.Plan, !sessVars.InRestrictedSQL, a.StmtNode) } // Generating plan digest is slow, only generate it once if it's 'Point_Get'. // If it's a point get, different SQLs leads to different plans, so SQL digest @@ -1028,30 +1111,40 @@ func (a *ExecStmt) SummaryStmt(succ bool) { memMax := stmtCtx.MemTracker.MaxConsumed() diskMax := stmtCtx.DiskTracker.MaxConsumed() sql := a.GetTextToLog() + var stmtDetail execdetails.StmtExecDetails + stmtDetailRaw := a.GoCtx.Value(execdetails.StmtExecDetailKey) + if stmtDetailRaw != nil { + stmtDetail = *(stmtDetailRaw.(*execdetails.StmtExecDetails)) + } stmtExecInfo := &stmtsummary.StmtExecInfo{ - SchemaName: strings.ToLower(sessVars.CurrentDB), - OriginalSQL: sql, - NormalizedSQL: normalizedSQL, - Digest: digest, - PrevSQL: prevSQL, - PrevSQLDigest: prevSQLDigest, - PlanGenerator: planGenerator, - PlanDigest: planDigest, - PlanDigestGen: planDigestGen, - User: userString, - TotalLatency: costTime, - ParseLatency: sessVars.DurationParse, - CompileLatency: sessVars.DurationCompile, - StmtCtx: stmtCtx, - CopTasks: copTaskInfo, - ExecDetail: &execDetail, - MemMax: memMax, - DiskMax: diskMax, - StartTime: sessVars.StartTime, - IsInternal: sessVars.InRestrictedSQL, - Succeed: succ, - PlanInCache: sessVars.FoundInPlanCache, - ExecRetryCount: a.retryCount, + SchemaName: strings.ToLower(sessVars.CurrentDB), + OriginalSQL: sql, + Charset: charset, + Collation: collation, + NormalizedSQL: normalizedSQL, + Digest: digest, + PrevSQL: prevSQL, + PrevSQLDigest: prevSQLDigest, + PlanGenerator: planGenerator, + PlanDigest: planDigest, + PlanDigestGen: planDigestGen, + User: userString, + TotalLatency: costTime, + ParseLatency: sessVars.DurationParse, + CompileLatency: sessVars.DurationCompile, + StmtCtx: stmtCtx, + CopTasks: copTaskInfo, + ExecDetail: &execDetail, + MemMax: memMax, + DiskMax: diskMax, + StartTime: sessVars.StartTime, + IsInternal: sessVars.InRestrictedSQL, + Succeed: succ, + PlanInCache: sessVars.FoundInPlanCache, + PlanInBinding: sessVars.FoundInBinding, + ExecRetryCount: a.retryCount, + StmtExecDetails: stmtDetail, + Prepared: a.isPreparedStmt, } if a.retryCount > 0 { stmtExecInfo.ExecRetryTime = costTime - sessVars.DurationParse - sessVars.DurationCompile - time.Since(a.retryStartTime) @@ -1062,7 +1155,7 @@ func (a *ExecStmt) SummaryStmt(succ bool) { // GetTextToLog return the query text to log. func (a *ExecStmt) GetTextToLog() string { var sql string - if config.RedactLogEnabled() { + if a.Ctx.GetSessionVars().EnableRedactLog { sql, _ = a.Ctx.GetSessionVars().StmtCtx.SQLDigest() } else if sensitiveStmt, ok := a.StmtNode.(ast.SensitiveStmtNode); ok { sql = sensitiveStmt.SecureText() diff --git a/executor/admin.go b/executor/admin.go index 6eaa8e363fee3..1b81dcf342c43 100644 --- a/executor/admin.go +++ b/executor/admin.go @@ -76,15 +76,19 @@ func (e *CheckIndexRangeExec) Next(ctx context.Context, req *chunk.Chunk) error return nil } iter := chunk.NewIterator4Chunk(e.srcChunk) + appendRows := make([]chunk.Row, 0, e.srcChunk.NumRows()) for row := iter.Begin(); row != iter.End(); row = iter.Next() { handle := row.GetInt64(handleIdx) for _, hr := range e.handleRanges { if handle >= hr.Begin && handle < hr.End { - req.AppendRow(row) + appendRows = append(appendRows, row) break } } } + if len(appendRows) > 0 { + req.AppendRows(appendRows) + } if req.NumRows() > 0 { return nil } @@ -316,7 +320,7 @@ func (e *RecoverIndexExec) backfillIndex(ctx context.Context) (int64, int64, err result backfillResult ) for { - errInTxn := kv.RunInNewTxn(e.ctx.GetStore(), true, func(txn kv.Transaction) error { + errInTxn := kv.RunInNewTxn(context.Background(), e.ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { var err error result, err = e.backfillIndexInTxn(ctx, txn, currentHandle) return err @@ -345,6 +349,7 @@ func (e *RecoverIndexExec) backfillIndex(ctx context.Context) (int64, int64, err type recoverRows struct { handle kv.Handle idxVals []types.Datum + rsData []types.Datum skip bool } @@ -373,7 +378,8 @@ func (e *RecoverIndexExec) fetchRecoverRows(ctx context.Context, srcResult dists } idxVals := extractIdxVals(row, e.idxValsBufs[result.scanRowCount], e.colFieldTypes, idxValLen) e.idxValsBufs[result.scanRowCount] = idxVals - e.recoverRows = append(e.recoverRows, recoverRows{handle: handle, idxVals: idxVals, skip: false}) + rsData := tables.TryGetHandleRestoredDataWrapper(e.table, plannercore.GetCommonHandleDatum(e.handleCols, row), nil) + e.recoverRows = append(e.recoverRows, recoverRows{handle: handle, idxVals: idxVals, rsData: rsData, skip: false}) result.scanRowCount++ result.currentHandle = handle } @@ -453,13 +459,13 @@ func (e *RecoverIndexExec) backfillIndexInTxn(ctx context.Context, txn kv.Transa continue } - recordKey := e.table.RecordKey(row.handle) + recordKey := tablecodec.EncodeRecordKey(e.table.RecordPrefix(), row.handle) err := txn.LockKeys(ctx, new(kv.LockCtx), recordKey) if err != nil { return result, err } - _, err = e.index.Create(e.ctx, txn.GetUnionStore(), row.idxVals, row.handle) + _, err = e.index.Create(e.ctx, txn, row.idxVals, row.handle, row.rsData) if err != nil { return result, err } @@ -549,7 +555,7 @@ func (e *CleanupIndexExec) getIdxColTypes() []*types.FieldType { func (e *CleanupIndexExec) batchGetRecord(txn kv.Transaction) (map[string][]byte, error) { e.idxValues.Range(func(h kv.Handle, _ interface{}) bool { - e.batchKeys = append(e.batchKeys, e.table.RecordKey(h)) + e.batchKeys = append(e.batchKeys, tablecodec.EncodeRecordKey(e.table.RecordPrefix(), h)) return true }) values, err := txn.BatchGet(context.Background(), e.batchKeys) @@ -571,7 +577,7 @@ func (e *CleanupIndexExec) deleteDanglingIdx(txn kv.Transaction, values map[stri return errors.Trace(errors.Errorf("batch keys are inconsistent with handles")) } for _, handleIdxVals := range handleIdxValsGroup.([][]types.Datum) { - if err := e.index.Delete(e.ctx.GetSessionVars().StmtCtx, txn, handleIdxVals, handle); err != nil { + if err := e.index.Delete(e.ctx.GetSessionVars().StmtCtx, txn.GetUnionStore(), handleIdxVals, handle); err != nil { return err } e.removeCnt++ @@ -687,7 +693,7 @@ func (e *CleanupIndexExec) Next(ctx context.Context, req *chunk.Chunk) error { func (e *CleanupIndexExec) cleanTableIndex(ctx context.Context) error { for { - errInTxn := kv.RunInNewTxn(e.ctx.GetStore(), true, func(txn kv.Transaction) error { + errInTxn := kv.RunInNewTxn(context.Background(), e.ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { err := e.fetchIndex(ctx, txn) if err != nil { return err diff --git a/executor/admin_test.go b/executor/admin_test.go index 01a4556f46000..7241f5cf52f77 100644 --- a/executor/admin_test.go +++ b/executor/admin_test.go @@ -118,7 +118,7 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { sc := s.ctx.GetSessionVars().StmtCtx txn, err := s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(1), kv.IntHandle(1)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(1), kv.IntHandle(1)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -141,7 +141,7 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(10), kv.IntHandle(10)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(10), kv.IntHandle(10)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -155,15 +155,15 @@ func (s *testSuite5) TestAdminRecoverIndex(c *C) { txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(1), kv.IntHandle(1)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(1), kv.IntHandle(1)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(2), kv.IntHandle(2)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(2), kv.IntHandle(2)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(3), kv.IntHandle(3)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(3), kv.IntHandle(3)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(10), kv.IntHandle(10)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(10), kv.IntHandle(10)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(20), kv.IntHandle(20)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(20), kv.IntHandle(20)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -194,7 +194,7 @@ func (s *testSuite5) TestClusteredIndexAdminRecoverIndex(c *C) { tk.MustExec("drop database if exists test_cluster_index_admin_recover;") tk.MustExec("create database test_cluster_index_admin_recover;") tk.MustExec("use test_cluster_index_admin_recover;") - tk.MustExec("set tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true dbName := model.NewCIStr("test_cluster_index_admin_recover") tblName := model.NewCIStr("t") @@ -219,7 +219,7 @@ func (s *testSuite5) TestClusteredIndexAdminRecoverIndex(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) cHandle := testutil.MustNewCommonHandle(c, "1", "3") - err = indexOpr.Delete(sc, txn, types.MakeDatums(2), cHandle) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(2), cHandle) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -252,7 +252,7 @@ func (s *testSuite5) TestAdminRecoverPartitionTableIndex(c *C) { sc := s.ctx.GetSessionVars().StmtCtx txn, err := s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(idxValue), kv.IntHandle(idxValue)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(idxValue), kv.IntHandle(idxValue)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -310,7 +310,7 @@ func (s *testSuite5) TestAdminRecoverIndex1(c *C) { sc := s.ctx.GetSessionVars().StmtCtx tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table admin_test (c1 varchar(255), c2 int, c3 int default 1, primary key(c1), unique key(c2))") tk.MustExec("insert admin_test (c1, c2) values ('1', 1), ('2', 2), ('3', 3), ('10', 10), ('20', 20)") @@ -328,13 +328,13 @@ func (s *testSuite5) TestAdminRecoverIndex1(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums("1"), kv.IntHandle(1)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums("1"), kv.IntHandle(1)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums("2"), kv.IntHandle(2)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums("2"), kv.IntHandle(2)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums("3"), kv.IntHandle(3)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums("3"), kv.IntHandle(3)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums("10"), kv.IntHandle(4)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums("10"), kv.IntHandle(4)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -386,21 +386,21 @@ func (s *testSuite5) TestAdminCleanupIndex(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(1), kv.IntHandle(-100)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(1), kv.IntHandle(-100), nil) c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(6), kv.IntHandle(100)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(100), nil) c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(8), kv.IntHandle(100)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(8), kv.IntHandle(100), nil) c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(nil), kv.IntHandle(101)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(nil), kv.IntHandle(101), nil) c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(nil), kv.IntHandle(102)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(nil), kv.IntHandle(102), nil) c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(6), kv.IntHandle(200)) + _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(200), nil) c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(6), kv.IntHandle(-200)) + _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(6), kv.IntHandle(-200), nil) c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(8), kv.IntHandle(-200)) + _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(8), kv.IntHandle(-200), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -455,9 +455,9 @@ func (s *testSuite5) TestAdminCleanupIndexForPartitionTable(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(idxValue), kv.IntHandle(handle)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) c.Assert(err, IsNil) - _, err = indexOpr3.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(idxValue), kv.IntHandle(handle)) + _, err = indexOpr3.Create(s.ctx, txn, types.MakeDatums(idxValue), kv.IntHandle(handle), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -515,7 +515,7 @@ func (s *testSuite5) TestAdminCleanupIndexPKNotHandle(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table admin_test (c1 int, c2 int, c3 int, primary key (c1, c2))") tk.MustExec("insert admin_test (c1, c2) values (1, 2), (3, 4), (-5, 5)") @@ -537,11 +537,11 @@ func (s *testSuite5) TestAdminCleanupIndexPKNotHandle(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(7, 10), kv.IntHandle(-100)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(7, 10), kv.IntHandle(-100), nil) c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(4, 6), kv.IntHandle(100)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(4, 6), kv.IntHandle(100), nil) c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(-7, 4), kv.IntHandle(101)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(-7, 4), kv.IntHandle(101), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -590,9 +590,9 @@ func (s *testSuite5) TestAdminCleanupIndexMore(c *C) { for i := 0; i < 2000; i++ { c1 := int64(2*i + 7) c2 := int64(2*i + 8) - _, err = indexOpr1.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(c1, c2), kv.IntHandle(c1)) + _, err = indexOpr1.Create(s.ctx, txn, types.MakeDatums(c1, c2), kv.IntHandle(c1), nil) c.Assert(err, IsNil, Commentf(errors.ErrorStack(err))) - _, err = indexOpr2.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(c2), kv.IntHandle(c1)) + _, err = indexOpr2.Create(s.ctx, txn, types.MakeDatums(c2), kv.IntHandle(c1), nil) c.Assert(err, IsNil) } err = txn.Commit(context.Background()) @@ -627,7 +627,7 @@ func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists admin_test") - tk.MustExec("set tidb_enable_clustered_index=1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table admin_test (c1 varchar(255), c2 int, c3 char(10) default 'c3', primary key (c1, c3), unique key(c2), key (c3))") tk.MustExec("insert admin_test (c1, c2) values ('c1_1', 2), ('c1_2', 4), ('c1_3', NULL)") tk.MustExec("insert admin_test (c1, c3) values ('c1_4', 'c3_4'), ('c1_5', 'c3_5'), ('c1_6', default)") @@ -669,11 +669,11 @@ func (s *testSuite5) TestClusteredAdminCleanupIndex(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) for _, di := range c2DanglingIdx { - _, err := indexOpr2.Create(s.ctx, txn.GetUnionStore(), di.idxVal, di.handle) + _, err := indexOpr2.Create(s.ctx, txn, di.idxVal, di.handle, nil) c.Assert(err, IsNil) } for _, di := range c3DanglingIdx { - _, err := indexOpr3.Create(s.ctx, txn.GetUnionStore(), di.idxVal, di.handle) + _, err := indexOpr3.Create(s.ctx, txn, di.idxVal, di.handle, nil) c.Assert(err, IsNil) } err = txn.Commit(context.Background()) @@ -728,21 +728,22 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) txn, err := s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(i), kv.IntHandle(i)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(i), kv.IntHandle(i)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) err = tk.ExecToErr("admin check table admin_test_p") + c.Assert(err, NotNil) c.Assert(err.Error(), Equals, fmt.Sprintf("[executor:8003]admin_test_p err:[admin:8223]index: != record:&admin.RecordData{Handle:%d, Values:[]types.Datum{types.Datum{k:0x1, decimal:0x0, length:0x0, i:%d, collation:\"\", b:[]uint8(nil), x:interface {}(nil)}}}", i, i)) c.Assert(executor.ErrAdminCheckTable.Equal(err), IsTrue) // TODO: fix admin recover for partition table. - //r := tk.MustQuery("admin recover index admin_test_p idx") - //r.Check(testkit.Rows("0 0")) - //tk.MustExec("admin check table admin_test_p") + // r := tk.MustQuery("admin recover index admin_test_p idx") + // r.Check(testkit.Rows("0 0")) + // tk.MustExec("admin check table admin_test_p") // Manual recover index. txn, err = s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(i), kv.IntHandle(i)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i), kv.IntHandle(i), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -756,7 +757,7 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(i+8), kv.IntHandle(i+8)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i+8), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -766,7 +767,7 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { // TODO: fix admin recover for partition table. txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(i+8), kv.IntHandle(i+8)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(i+8), kv.IntHandle(i+8)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -779,7 +780,7 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { indexOpr := tables.NewIndex(tblInfo.GetPartitionInfo().Definitions[partitionIdx].ID, tblInfo, idxInfo) txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(i+8), kv.IntHandle(i)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(i+8), kv.IntHandle(i), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -789,7 +790,7 @@ func (s *testSuite3) TestAdminCheckPartitionTableFailed(c *C) { // TODO: fix admin recover for partition table. txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(i+8), kv.IntHandle(i)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(i+8), kv.IntHandle(i)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -824,7 +825,7 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Index c2 is missing 11. txn, err := s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(-10), kv.IntHandle(-1)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(-10), kv.IntHandle(-1)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -842,7 +843,7 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Index c2 has one more values than table data: 0, and the handle 0 hasn't correlative record. txn, err = s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(0), kv.IntHandle(0)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(0), kv.IntHandle(0), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -855,12 +856,12 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Index c2 has two more values than table data: 10, 13, and these handles have correlative record. txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(0), kv.IntHandle(0)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(0), kv.IntHandle(0)) c.Assert(err, IsNil) // Make sure the index value "19" is smaller "21". Then we scan to "19" before "21". - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(19), kv.IntHandle(10)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(19), kv.IntHandle(10), nil) c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(13), kv.IntHandle(2)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(13), kv.IntHandle(2), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -872,9 +873,9 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Two indices have the same handle. txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(13), kv.IntHandle(2)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(13), kv.IntHandle(2)) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(12), kv.IntHandle(2)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(12), kv.IntHandle(2)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -886,9 +887,9 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Index c2 has one line of data is 19, the corresponding table data is 20. txn, err = s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(12), kv.IntHandle(2)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(12), kv.IntHandle(2), nil) c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(20), kv.IntHandle(10)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(20), kv.IntHandle(10)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -899,9 +900,9 @@ func (s *testSuite5) TestAdminCheckTableFailed(c *C) { // Recover records. txn, err = s.store.Begin() c.Assert(err, IsNil) - err = indexOpr.Delete(sc, txn, types.MakeDatums(19), kv.IntHandle(10)) + err = indexOpr.Delete(sc, txn.GetUnionStore(), types.MakeDatums(19), kv.IntHandle(10)) c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(20), kv.IntHandle(10)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(20), kv.IntHandle(10), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -1058,7 +1059,7 @@ func (s *testSuite5) TestAdminCheckWithSnapshot(c *C) { idxOpr := tables.NewIndex(tblInfo.ID, tblInfo, idxInfo) txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = idxOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(2), kv.IntHandle(100)) + _, err = idxOpr.Create(s.ctx, txn, types.MakeDatums(2), kv.IntHandle(100), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) diff --git a/executor/aggfuncs/aggfunc_test.go b/executor/aggfuncs/aggfunc_test.go index d7dc3703dd4a9..7f66aef7d4aa6 100644 --- a/executor/aggfuncs/aggfunc_test.go +++ b/executor/aggfuncs/aggfunc_test.go @@ -35,7 +35,7 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" @@ -45,6 +45,11 @@ import ( "github.com/pingcap/tidb/util/set" ) +const ( + // separator argument for group_concat() test cases + separator = " " +) + var _ = Suite(&testSuite{}) func TestT(t *testing.T) { @@ -264,9 +269,9 @@ func rowMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) (memDeltas return memDeltas, nil } -type multiArgsUpdateMemDeltaGens func(*chunk.Chunk, []*types.FieldType) (memDeltas []int64, err error) +type multiArgsUpdateMemDeltaGens func(*chunk.Chunk, []*types.FieldType, []*util.ByItems) (memDeltas []int64, err error) -func defaultMultiArgsMemDeltaGens(srcChk *chunk.Chunk, dataTypes []*types.FieldType) (memDeltas []int64, err error) { +func defaultMultiArgsMemDeltaGens(srcChk *chunk.Chunk, dataTypes []*types.FieldType, byItems []*util.ByItems) (memDeltas []int64, err error) { memDeltas = make([]int64, 0) m := make(map[string]bool) for i := 0; i < srcChk.NumRows(); i++ { @@ -342,14 +347,16 @@ type multiArgsAggMemTest struct { multiArgsAggTest multiArgsAggTest allocMemDelta int64 multiArgsUpdateMemDeltaGens multiArgsUpdateMemDeltaGens + isDistinct bool } -func buildMultiArgsAggMemTester(funcName string, tps []byte, rt byte, numRows int, allocMemDelta int64, updateMemDeltaGens multiArgsUpdateMemDeltaGens, results ...interface{}) multiArgsAggMemTest { - multiArgsAggTest := buildMultiArgsAggTester(funcName, tps, rt, numRows, results...) +func buildMultiArgsAggMemTester(funcName string, tps []byte, rt byte, numRows int, allocMemDelta int64, updateMemDeltaGens multiArgsUpdateMemDeltaGens, isDistinct bool) multiArgsAggMemTest { + multiArgsAggTest := buildMultiArgsAggTester(funcName, tps, rt, numRows) pt := multiArgsAggMemTest{ multiArgsAggTest: multiArgsAggTest, allocMemDelta: allocMemDelta, multiArgsUpdateMemDeltaGens: updateMemDeltaGens, + isDistinct: isDistinct, } return pt } @@ -360,7 +367,7 @@ func (s *testSuite) testMergePartialResult(c *C, p aggTest) { args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) c.Assert(err, IsNil) @@ -385,10 +392,12 @@ func (s *testSuite) testMergePartialResult(c *C, p aggTest) { // update partial result. for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + _, err = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + c.Assert(err, IsNil) } p.messUpChunk(srcChk) - partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + c.Assert(err, IsNil) dt := resultChk.GetRow(0).GetDatum(0, p.dataType) if p.funcName == ast.AggFuncApproxCountDistinct { dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeString)) @@ -406,11 +415,13 @@ func (s *testSuite) testMergePartialResult(c *C, p aggTest) { iter.Begin() iter.Next() for row := iter.Next(); row != iter.End(); row = iter.Next() { - partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + _, err = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + c.Assert(err, IsNil) } p.messUpChunk(srcChk) resultChk.Reset() - partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, p.dataType) if p.funcName == ast.AggFuncApproxCountDistinct { dt = resultChk.GetRow(0).GetDatum(0, types.NewFieldType(mysql.TypeString)) @@ -483,10 +494,12 @@ func (s *testSuite) testMultiArgsMergePartialResult(c *C, p multiArgsAggTest) { // update partial result. for row := iter.Begin(); row != iter.End(); row = iter.Next() { - partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + // FIXME: cannot assert error since there are cases of error, e.g. JSON documents may not contain NULL member + _, _ = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) } p.messUpChunk(srcChk) - partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + c.Assert(err, IsNil) dt := resultChk.GetRow(0).GetDatum(0, p.retType) result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) c.Assert(err, IsNil) @@ -501,11 +514,13 @@ func (s *testSuite) testMultiArgsMergePartialResult(c *C, p multiArgsAggTest) { iter.Begin() iter.Next() for row := iter.Next(); row != iter.End(); row = iter.Next() { - partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) + // FIXME: cannot check error + _, _ = partialFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, partialResult) } p.messUpChunk(srcChk) resultChk.Reset() - partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + err = partialFunc.AppendFinalResult2Chunk(s.ctx, partialResult, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, p.retType) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) c.Assert(err, IsNil) @@ -569,13 +584,13 @@ func getDataGenFunc(ft *types.FieldType) func(i int) types.Datum { case mysql.TypeJSON: return func(i int) types.Datum { return types.NewDatum(json.CreateBinary(int64(i))) } case mysql.TypeEnum: - elems := []string{"a", "b", "c", "d", "e"} + elems := []string{"e", "d", "c", "b", "a"} return func(i int) types.Datum { e, _ := types.ParseEnumValue(elems, uint64(i+1)) return types.NewCollateMysqlEnumDatum(e, ft.Collate) } case mysql.TypeSet: - elems := []string{"a", "b", "c", "d", "e"} + elems := []string{"e", "d", "c", "b", "a"} return func(i int) types.Datum { e, _ := types.ParseSetValue(elems, uint64(i+1)) return types.NewMysqlSetDatum(e, ft.Collate) @@ -589,7 +604,7 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } if p.funcName == ast.AggFuncApproxPercentile { args = append(args, &expression.Constant{Value: types.NewIntDatum(50), RetType: types.NewFieldType(mysql.TypeLong)}) @@ -607,10 +622,12 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { iter := chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + c.Assert(err, IsNil) } p.messUpChunk(srcChk) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) c.Assert(err, IsNil) @@ -619,7 +636,8 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) c.Assert(err, IsNil) @@ -640,16 +658,19 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { srcChk = p.genSrcChk() iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + c.Assert(err, IsNil) } p.messUpChunk(srcChk) srcChk = p.genSrcChk() iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + _, err = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + c.Assert(err, IsNil) } p.messUpChunk(srcChk) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) c.Assert(err, IsNil) @@ -658,7 +679,8 @@ func (s *testSuite) testAggFunc(c *C, p aggTest) { // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) c.Assert(err, IsNil) @@ -670,7 +692,7 @@ func (s *testSuite) testAggMemFunc(c *C, p aggMemTest) { args := []expression.Expression{&expression.Column{RetType: p.aggTest.dataType, Index: 0}} if p.aggTest.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.aggTest.funcName, args, p.isDistinct) c.Assert(err, IsNil) @@ -703,7 +725,7 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { args[k] = &expression.Column{RetType: p.dataTypes[k], Index: k} } if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) @@ -719,10 +741,12 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { iter := chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + // FIXME: cannot assert error since there are cases of error, e.g. rows were cut by GROUPCONCAT + _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt := resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err := dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) c.Assert(err, IsNil) @@ -731,7 +755,8 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) c.Assert(err, IsNil) @@ -752,16 +777,19 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { srcChk = p.genSrcChk() iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + // FIXME: cannot check error + _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) srcChk = p.genSrcChk() iter = chunk.NewIterator4Chunk(srcChk) for row := iter.Begin(); row != iter.End(); row = iter.Next() { - finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) + // FIXME: cannot check error + _, _ = finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) } p.messUpChunk(srcChk) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[1]) c.Assert(err, IsNil) @@ -770,7 +798,8 @@ func (s *testSuite) testMultiArgsAggFunc(c *C, p multiArgsAggTest) { // test the empty input resultChk.Reset() finalFunc.ResetPartialResult(finalPr) - finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + err = finalFunc.AppendFinalResult2Chunk(s.ctx, finalPr, resultChk) + c.Assert(err, IsNil) dt = resultChk.GetRow(0).GetDatum(0, desc.RetTp) result, err = dt.CompareDatum(s.ctx.GetSessionVars().StmtCtx, &p.results[0]) c.Assert(err, IsNil) @@ -785,10 +814,10 @@ func (s *testSuite) testMultiArgsAggMemFunc(c *C, p multiArgsAggMemTest) { args[k] = &expression.Column{RetType: p.multiArgsAggTest.dataTypes[k], Index: k} } if p.multiArgsAggTest.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } - desc, err := aggregation.NewAggFuncDesc(s.ctx, p.multiArgsAggTest.funcName, args, false) + desc, err := aggregation.NewAggFuncDesc(s.ctx, p.multiArgsAggTest.funcName, args, p.isDistinct) c.Assert(err, IsNil) if p.multiArgsAggTest.orderBy { desc.OrderByItems = []*util.ByItems{ @@ -799,8 +828,7 @@ func (s *testSuite) testMultiArgsAggMemFunc(c *C, p multiArgsAggMemTest) { finalPr, memDelta := finalFunc.AllocPartialResult() c.Assert(memDelta, Equals, p.allocMemDelta) - resultChk := chunk.NewChunkWithCapacity([]*types.FieldType{desc.RetTp}, 1) - updateMemDeltas, err := p.multiArgsUpdateMemDeltaGens(srcChk, p.multiArgsAggTest.dataTypes) + updateMemDeltas, err := p.multiArgsUpdateMemDeltaGens(srcChk, p.multiArgsAggTest.dataTypes, desc.OrderByItems) c.Assert(err, IsNil) iter := chunk.NewIterator4Chunk(srcChk) i := 0 @@ -809,30 +837,6 @@ func (s *testSuite) testMultiArgsAggMemFunc(c *C, p multiArgsAggMemTest) { c.Assert(memDelta, Equals, updateMemDeltas[i]) i++ } - - // test the agg func with distinct - desc, err = aggregation.NewAggFuncDesc(s.ctx, p.multiArgsAggTest.funcName, args, true) - c.Assert(err, IsNil) - if p.multiArgsAggTest.orderBy { - desc.OrderByItems = []*util.ByItems{ - {Expr: args[0], Desc: true}, - } - } - finalFunc = aggfuncs.Build(s.ctx, desc, 0) - finalPr, memDelta = finalFunc.AllocPartialResult() - c.Assert(memDelta, Equals, p.allocMemDelta) - - resultChk.Reset() - srcChk = p.multiArgsAggTest.genSrcChk() - updateMemDeltas, err = p.multiArgsUpdateMemDeltaGens(srcChk, p.multiArgsAggTest.dataTypes) - c.Assert(err, IsNil) - iter = chunk.NewIterator4Chunk(srcChk) - i = 0 - for row := iter.Begin(); row != iter.End(); row = iter.Next() { - memDelta, _ := finalFunc.UpdatePartialResult(s.ctx, []chunk.Row{row}, finalPr) - c.Assert(memDelta, Equals, updateMemDeltas[i]) - i++ - } } func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { @@ -845,7 +849,7 @@ func (s *testSuite) benchmarkAggFunc(b *testing.B, p aggTest) { args := []expression.Expression{&expression.Column{RetType: p.dataType, Index: 0}} if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) if err != nil { @@ -898,7 +902,7 @@ func (s *testSuite) benchmarkMultiArgsAggFunc(b *testing.B, p multiArgsAggTest) args[k] = &expression.Column{RetType: p.dataTypes[k], Index: k} } if p.funcName == ast.AggFuncGroupConcat { - args = append(args, &expression.Constant{Value: types.NewStringDatum(" "), RetType: types.NewFieldType(mysql.TypeString)}) + args = append(args, &expression.Constant{Value: types.NewStringDatum(separator), RetType: types.NewFieldType(mysql.TypeString)}) } desc, err := aggregation.NewAggFuncDesc(s.ctx, p.funcName, args, false) @@ -943,7 +947,10 @@ func (s *testSuite) baseBenchmarkAggFunc(b *testing.B, output.Reset() b.ResetTimer() for i := 0; i < b.N; i++ { - finalFunc.UpdatePartialResult(s.ctx, input, finalPr) + _, err := finalFunc.UpdatePartialResult(s.ctx, input, finalPr) + if err != nil { + b.Fatal(err) + } b.StopTimer() output.Reset() b.StartTimer() diff --git a/executor/aggfuncs/aggfuncs.go b/executor/aggfuncs/aggfuncs.go index 279c2e2ed7217..a65644a6a1768 100644 --- a/executor/aggfuncs/aggfuncs.go +++ b/executor/aggfuncs/aggfuncs.go @@ -183,6 +183,10 @@ type baseAggFunc struct { // ordinal stores the ordinal of the columns in the output chunk, which is // used to append the final result of this function. ordinal int + + // frac stores digits of the fractional part of decimals, + // which makes the decimal be the result of type inferring. + frac int } func (*baseAggFunc) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { diff --git a/executor/aggfuncs/builder.go b/executor/aggfuncs/builder.go index a8a9780289751..29f079823e66f 100644 --- a/executor/aggfuncs/builder.go +++ b/executor/aggfuncs/builder.go @@ -17,6 +17,7 @@ import ( "fmt" "strconv" + "github.com/cznic/mathutil" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" @@ -91,11 +92,11 @@ func BuildWindowFunctions(ctx sessionctx.Context, windowFuncDesc *aggregation.Ag case ast.WindowFuncNtile: return buildNtile(windowFuncDesc, ordinal) case ast.WindowFuncPercentRank: - return buildPercenRank(ordinal, orderByCols) + return buildPercentRank(ordinal, orderByCols) case ast.WindowFuncLead: - return buildLead(windowFuncDesc, ordinal) + return buildLead(ctx, windowFuncDesc, ordinal) case ast.WindowFuncLag: - return buildLag(windowFuncDesc, ordinal) + return buildLag(ctx, windowFuncDesc, ordinal) case ast.AggFuncMax: // The max/min aggFunc using in the window function will using the sliding window algo. return buildMaxMinInWindowFunction(windowFuncDesc, ordinal, true) @@ -247,6 +248,11 @@ func buildSum(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordi ordinal: ordinal, }, } + frac := base.args[0].GetType().Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) switch aggFuncDesc.Mode { case aggregation.DedupMode: return nil @@ -275,6 +281,15 @@ func buildAvg(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordi args: aggFuncDesc.Args, ordinal: ordinal, } + frac := base.args[0].GetType().Decimal + if len(base.args) == 2 { + frac = base.args[1].GetType().Decimal + } + if frac == -1 { + frac = mysql.MaxDecimalScale + } + base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) + switch aggFuncDesc.Mode { // Build avg functions which consume the original data and remove the // duplicated input of the same group. @@ -319,6 +334,11 @@ func buildFirstRow(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { args: aggFuncDesc.Args, ordinal: ordinal, } + frac := base.args[0].GetType().Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) evalType, fieldType := aggFuncDesc.RetTp.EvalType(), aggFuncDesc.RetTp if fieldType.Tp == mysql.TypeBit { @@ -368,6 +388,11 @@ func buildMaxMin(aggFuncDesc *aggregation.AggFuncDesc, ordinal int, isMax bool) }, isMax: isMax, } + frac := base.args[0].GetType().Decimal + if frac == -1 { + frac = mysql.MaxDecimalScale + } + base.frac = mathutil.Min(frac, mysql.MaxDecimalScale) evalType, fieldType := aggFuncDesc.RetTp.EvalType(), aggFuncDesc.RetTp if fieldType.Tp == mysql.TypeBit { @@ -660,14 +685,14 @@ func buildNtile(aggFuncDes *aggregation.AggFuncDesc, ordinal int) AggFunc { return &ntile{baseAggFunc: base, n: n} } -func buildPercenRank(ordinal int, orderByCols []*expression.Column) AggFunc { +func buildPercentRank(ordinal int, orderByCols []*expression.Column) AggFunc { base := baseAggFunc{ ordinal: ordinal, } return &percentRank{baseAggFunc: base, rowComparer: buildRowComparer(orderByCols)} } -func buildLeadLag(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) baseLeadLag { +func buildLeadLag(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) baseLeadLag { offset := uint64(1) if len(aggFuncDesc.Args) >= 2 { offset, _, _ = expression.GetUint64FromConstant(aggFuncDesc.Args[1]) @@ -676,6 +701,13 @@ func buildLeadLag(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) baseLeadLag defaultExpr = expression.NewNull() if len(aggFuncDesc.Args) == 3 { defaultExpr = aggFuncDesc.Args[2] + switch et := defaultExpr.(type) { + case *expression.Constant: + res, err1 := et.Value.ConvertTo(ctx.GetSessionVars().StmtCtx, aggFuncDesc.RetTp) + if err1 == nil { + defaultExpr = &expression.Constant{Value: res, RetType: aggFuncDesc.RetTp} + } + } } base := baseAggFunc{ args: aggFuncDesc.Args, @@ -685,10 +717,10 @@ func buildLeadLag(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) baseLeadLag return baseLeadLag{baseAggFunc: base, offset: offset, defaultExpr: defaultExpr, valueEvaluator: ve} } -func buildLead(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { - return &lead{buildLeadLag(aggFuncDesc, ordinal)} +func buildLead(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { + return &lead{buildLeadLag(ctx, aggFuncDesc, ordinal)} } -func buildLag(aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { - return &lag{buildLeadLag(aggFuncDesc, ordinal)} +func buildLag(ctx sessionctx.Context, aggFuncDesc *aggregation.AggFuncDesc, ordinal int) AggFunc { + return &lag{buildLeadLag(ctx, aggFuncDesc, ordinal)} } diff --git a/executor/aggfuncs/func_avg.go b/executor/aggfuncs/func_avg.go index 13cf7135448e2..216778d643c53 100644 --- a/executor/aggfuncs/func_avg.go +++ b/executor/aggfuncs/func_avg.go @@ -16,8 +16,6 @@ package aggfuncs import ( "unsafe" - "github.com/cznic/mathutil" - "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -73,15 +71,7 @@ func (e *baseAvgDecimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr Par if err != nil { return err } - // Make the decimal be the result of type inferring. - frac := e.args[0].GetType().Decimal - if len(e.args) == 2 { - frac = e.args[1].GetType().Decimal - } - if frac == -1 { - frac = mysql.MaxDecimalScale - } - err = finalResult.Round(finalResult, mathutil.Min(frac, mysql.MaxDecimalScale), types.ModeHalfEven) + err = finalResult.Round(finalResult, e.frac, types.ModeHalfEven) if err != nil { return err } @@ -203,7 +193,7 @@ func (e *avgPartial4Decimal) MergePartialResult(sctx sessionctx.Context, src, ds type partialResult4AvgDistinctDecimal struct { partialResult4AvgDecimal - valSet set.StringSet + valSet set.StringSetWithMemoryUsage } type avgOriginal4DistinctDecimal struct { @@ -211,17 +201,18 @@ type avgOriginal4DistinctDecimal struct { } func (e *avgOriginal4DistinctDecimal) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewStringSetWithMemoryUsage() p := &partialResult4AvgDistinctDecimal{ - valSet: set.NewStringSet(), + valSet: valSet, } - return PartialResult(p), DefPartialResult4AvgDistinctDecimalSize + return PartialResult(p), DefPartialResult4AvgDistinctDecimalSize + setSize } func (e *avgOriginal4DistinctDecimal) ResetPartialResult(pr PartialResult) { p := (*partialResult4AvgDistinctDecimal)(pr) p.sum = *types.NewDecFromInt(0) p.count = int64(0) - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *avgOriginal4DistinctDecimal) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { @@ -242,8 +233,7 @@ func (e *avgOriginal4DistinctDecimal) UpdatePartialResult(sctx sessionctx.Contex if p.valSet.Exist(decStr) { continue } - p.valSet.Insert(decStr) - memDelta += int64(len(decStr)) + memDelta += p.valSet.Insert(decStr) newSum := new(types.MyDecimal) err = types.DecimalAdd(&p.sum, input, newSum) if err != nil { @@ -267,12 +257,7 @@ func (e *avgOriginal4DistinctDecimal) AppendFinalResult2Chunk(sctx sessionctx.Co if err != nil { return err } - // Make the decimal be the result of type inferring. - frac := e.args[0].GetType().Decimal - if frac == -1 { - frac = mysql.MaxDecimalScale - } - err = finalResult.Round(finalResult, mathutil.Min(frac, mysql.MaxDecimalScale), types.ModeHalfEven) + err = finalResult.Round(finalResult, e.frac, types.ModeHalfEven) if err != nil { return err } @@ -404,7 +389,7 @@ func (e *avgPartial4Float64) MergePartialResult(sctx sessionctx.Context, src, ds type partialResult4AvgDistinctFloat64 struct { partialResult4AvgFloat64 - valSet set.Float64Set + valSet set.Float64SetWithMemoryUsage } type avgOriginal4DistinctFloat64 struct { @@ -412,17 +397,18 @@ type avgOriginal4DistinctFloat64 struct { } func (e *avgOriginal4DistinctFloat64) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewFloat64SetWithMemoryUsage() p := &partialResult4AvgDistinctFloat64{ - valSet: set.NewFloat64Set(), + valSet: valSet, } - return PartialResult(p), DefPartialResult4AvgDistinctFloat64Size + return PartialResult(p), DefPartialResult4AvgDistinctFloat64Size + setSize } func (e *avgOriginal4DistinctFloat64) ResetPartialResult(pr PartialResult) { p := (*partialResult4AvgDistinctFloat64)(pr) p.sum = float64(0) p.count = int64(0) - p.valSet = set.NewFloat64Set() + p.valSet, _ = set.NewFloat64SetWithMemoryUsage() } func (e *avgOriginal4DistinctFloat64) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { @@ -438,8 +424,7 @@ func (e *avgOriginal4DistinctFloat64) UpdatePartialResult(sctx sessionctx.Contex p.sum += input p.count++ - p.valSet.Insert(input) - memDelta += DefFloat64Size + memDelta += p.valSet.Insert(input) } return memDelta, nil } diff --git a/executor/aggfuncs/func_avg_test.go b/executor/aggfuncs/func_avg_test.go index 09d62dd45168b..114a6c5259f2d 100644 --- a/executor/aggfuncs/func_avg_test.go +++ b/executor/aggfuncs/func_avg_test.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor/aggfuncs" + "github.com/pingcap/tidb/util/set" ) func (s *testSuite) TestMergePartialResult4Avg(c *C) { @@ -47,11 +48,11 @@ func (s *testSuite) TestMemAvg(c *C) { buildAggMemTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, aggfuncs.DefPartialResult4AvgDecimalSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncAvg, mysql.TypeNewDecimal, 5, - aggfuncs.DefPartialResult4AvgDistinctDecimalSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4AvgDistinctDecimalSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncAvg, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4AvgFloat64Size, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncAvg, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4AvgDistinctFloat64Size, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4AvgDistinctFloat64Size+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), } for _, test := range tests { s.testAggMemFunc(c, test) diff --git a/executor/aggfuncs/func_count_distinct.go b/executor/aggfuncs/func_count_distinct.go index 0dd974b390283..8e73fd2b32ca4 100644 --- a/executor/aggfuncs/func_count_distinct.go +++ b/executor/aggfuncs/func_count_distinct.go @@ -50,7 +50,7 @@ const ( ) type partialResult4CountDistinctInt struct { - valSet set.Int64Set + valSet set.Int64SetWithMemoryUsage } type countOriginalWithDistinct4Int struct { @@ -58,14 +58,15 @@ type countOriginalWithDistinct4Int struct { } func (e *countOriginalWithDistinct4Int) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewInt64SetWithMemoryUsage() return PartialResult(&partialResult4CountDistinctInt{ - valSet: set.NewInt64Set(), - }), DefPartialResult4CountDistinctIntSize + valSet: valSet, + }), DefPartialResult4CountDistinctIntSize + setSize } func (e *countOriginalWithDistinct4Int) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountDistinctInt)(pr) - p.valSet = set.NewInt64Set() + p.valSet, _ = set.NewInt64SetWithMemoryUsage() } func (e *countOriginalWithDistinct4Int) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -88,15 +89,14 @@ func (e *countOriginalWithDistinct4Int) UpdatePartialResult(sctx sessionctx.Cont if p.valSet.Exist(input) { continue } - p.valSet.Insert(input) - memDelta += DefInt64Size + memDelta += p.valSet.Insert(input) } return memDelta, nil } type partialResult4CountDistinctReal struct { - valSet set.Float64Set + valSet set.Float64SetWithMemoryUsage } type countOriginalWithDistinct4Real struct { @@ -104,14 +104,15 @@ type countOriginalWithDistinct4Real struct { } func (e *countOriginalWithDistinct4Real) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewFloat64SetWithMemoryUsage() return PartialResult(&partialResult4CountDistinctReal{ - valSet: set.NewFloat64Set(), - }), DefPartialResult4CountDistinctRealSize + valSet: valSet, + }), DefPartialResult4CountDistinctRealSize + setSize } func (e *countOriginalWithDistinct4Real) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountDistinctReal)(pr) - p.valSet = set.NewFloat64Set() + p.valSet, _ = set.NewFloat64SetWithMemoryUsage() } func (e *countOriginalWithDistinct4Real) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -134,15 +135,14 @@ func (e *countOriginalWithDistinct4Real) UpdatePartialResult(sctx sessionctx.Con if p.valSet.Exist(input) { continue } - p.valSet.Insert(input) - memDelta += DefFloat64Size + memDelta += p.valSet.Insert(input) } return memDelta, nil } type partialResult4CountDistinctDecimal struct { - valSet set.StringSet + valSet set.StringSetWithMemoryUsage } type countOriginalWithDistinct4Decimal struct { @@ -150,14 +150,15 @@ type countOriginalWithDistinct4Decimal struct { } func (e *countOriginalWithDistinct4Decimal) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewStringSetWithMemoryUsage() return PartialResult(&partialResult4CountDistinctDecimal{ - valSet: set.NewStringSet(), - }), DefPartialResult4CountDistinctDecimalSize + valSet: valSet, + }), DefPartialResult4CountDistinctDecimalSize + setSize } func (e *countOriginalWithDistinct4Decimal) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountDistinctDecimal)(pr) - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *countOriginalWithDistinct4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -185,15 +186,14 @@ func (e *countOriginalWithDistinct4Decimal) UpdatePartialResult(sctx sessionctx. if p.valSet.Exist(decStr) { continue } - p.valSet.Insert(decStr) - memDelta += int64(len(decStr)) + memDelta += p.valSet.Insert(decStr) } return memDelta, nil } type partialResult4CountDistinctDuration struct { - valSet set.Int64Set + valSet set.Int64SetWithMemoryUsage } type countOriginalWithDistinct4Duration struct { @@ -201,14 +201,15 @@ type countOriginalWithDistinct4Duration struct { } func (e *countOriginalWithDistinct4Duration) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewInt64SetWithMemoryUsage() return PartialResult(&partialResult4CountDistinctDuration{ - valSet: set.NewInt64Set(), - }), DefPartialResult4CountDistinctDurationSize + valSet: valSet, + }), DefPartialResult4CountDistinctDurationSize + setSize } func (e *countOriginalWithDistinct4Duration) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountDistinctDuration)(pr) - p.valSet = set.NewInt64Set() + p.valSet, _ = set.NewInt64SetWithMemoryUsage() } func (e *countOriginalWithDistinct4Duration) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -232,15 +233,14 @@ func (e *countOriginalWithDistinct4Duration) UpdatePartialResult(sctx sessionctx if p.valSet.Exist(int64(input.Duration)) { continue } - p.valSet.Insert(int64(input.Duration)) - memDelta += DefInt64Size + memDelta += p.valSet.Insert(int64(input.Duration)) } return memDelta, nil } type partialResult4CountDistinctString struct { - valSet set.StringSet + valSet set.StringSetWithMemoryUsage } type countOriginalWithDistinct4String struct { @@ -248,14 +248,15 @@ type countOriginalWithDistinct4String struct { } func (e *countOriginalWithDistinct4String) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewStringSetWithMemoryUsage() return PartialResult(&partialResult4CountDistinctString{ - valSet: set.NewStringSet(), - }), DefPartialResult4CountDistinctStringSize + valSet: valSet, + }), DefPartialResult4CountDistinctStringSize + setSize } func (e *countOriginalWithDistinct4String) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountDistinctString)(pr) - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *countOriginalWithDistinct4String) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -282,8 +283,7 @@ func (e *countOriginalWithDistinct4String) UpdatePartialResult(sctx sessionctx.C continue } input = stringutil.Copy(input) - p.valSet.Insert(input) - memDelta += int64(len(input)) + memDelta += p.valSet.Insert(input) } return memDelta, nil @@ -294,18 +294,19 @@ type countOriginalWithDistinct struct { } type partialResult4CountWithDistinct struct { - valSet set.StringSet + valSet set.StringSetWithMemoryUsage } func (e *countOriginalWithDistinct) AllocPartialResult() (pr PartialResult, memDelta int64) { + valSet, setSize := set.NewStringSetWithMemoryUsage() return PartialResult(&partialResult4CountWithDistinct{ - valSet: set.NewStringSet(), - }), DefPartialResult4CountWithDistinctSize + valSet: valSet, + }), DefPartialResult4CountWithDistinctSize + setSize } func (e *countOriginalWithDistinct) ResetPartialResult(pr PartialResult) { p := (*partialResult4CountWithDistinct)(pr) - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *countOriginalWithDistinct) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -340,8 +341,7 @@ func (e *countOriginalWithDistinct) UpdatePartialResult(sctx sessionctx.Context, if hasNull || p.valSet.Exist(encodedString) { continue } - p.valSet.Insert(encodedString) - memDelta += int64(len(encodedString)) + memDelta += p.valSet.Insert(encodedString) } return memDelta, nil @@ -500,10 +500,10 @@ type approxCountDistinctHashValue uint32 // This algorithm is also very accurate for data sets with small cardinality and very efficient on CPU. If number of // distinct element is more than 2^32, relative error may be high. type partialResult4ApproxCountDistinct struct { - size uint32 /// Number of elements. - sizeDegree uint8 /// The size of the table as a power of 2. - skipDegree uint8 /// Skip elements not divisible by 2 ^ skipDegree. - hasZero bool /// The hash table contains an element with a hash value of 0. + size uint32 // Number of elements. + sizeDegree uint8 // The size of the table as a power of 2. + skipDegree uint8 // Skip elements not divisible by 2 ^ skipDegree. + hasZero bool // The hash table contains an element with a hash value of 0. buf []approxCountDistinctHashValue } diff --git a/executor/aggfuncs/func_count_test.go b/executor/aggfuncs/func_count_test.go index 3b6898a8cdedb..f45b0a71b290d 100644 --- a/executor/aggfuncs/func_count_test.go +++ b/executor/aggfuncs/func_count_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/set" ) func genApproxDistinctMergePartialResult(begin, end uint64) string { @@ -120,21 +121,21 @@ func (s *testSuite) TestMemCount(c *C) { buildAggMemTester(ast.AggFuncCount, mysql.TypeDuration, 5, aggfuncs.DefPartialResult4CountSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncCount, mysql.TypeLonglong, 5, - aggfuncs.DefPartialResult4CountDistinctIntSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctIntSize+set.DefInt64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeFloat, 5, - aggfuncs.DefPartialResult4CountDistinctRealSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctRealSize+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4CountDistinctRealSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctRealSize+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeNewDecimal, 5, - aggfuncs.DefPartialResult4CountDistinctDecimalSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctDecimalSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeString, 5, - aggfuncs.DefPartialResult4CountDistinctStringSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctStringSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDate, 5, - aggfuncs.DefPartialResult4CountWithDistinctSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountWithDistinctSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeDuration, 5, - aggfuncs.DefPartialResult4CountDistinctDurationSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountDistinctDurationSize+set.DefInt64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncCount, mysql.TypeJSON, 5, - aggfuncs.DefPartialResult4CountWithDistinctSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4CountWithDistinctSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncApproxCountDistinct, mysql.TypeLonglong, 5, aggfuncs.DefPartialResult4ApproxCountDistinctSize, approxCountDistinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncApproxCountDistinct, mysql.TypeString, 5, diff --git a/executor/aggfuncs/func_first_row.go b/executor/aggfuncs/func_first_row.go index 5a6786d95aa63..99c3dbade1439 100644 --- a/executor/aggfuncs/func_first_row.go +++ b/executor/aggfuncs/func_first_row.go @@ -46,6 +46,7 @@ const ( DefPartialResult4FirstRowSetSize = int64(unsafe.Sizeof(partialResult4FirstRowSet{})) ) +// nolint:structcheck type basePartialResult4FirstRow struct { // isNull indicates whether the first row is null. isNull bool @@ -474,6 +475,10 @@ func (e *firstRow4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr P chk.AppendNull(e.ordinal) return nil } + err := p.val.Round(&p.val, e.frac, types.ModeHalfEven) + if err != nil { + return err + } chk.AppendMyDecimal(e.ordinal, &p.val) return nil } @@ -504,14 +509,13 @@ func (e *firstRow4Enum) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup if p.gotFirstRow { return memDelta, nil } - for _, row := range rowsInGroup { - d, err := e.args[0].Eval(row) + if len(rowsInGroup) > 0 { + d, err := e.args[0].Eval(rowsInGroup[0]) if err != nil { return memDelta, err } p.gotFirstRow, p.isNull, p.val = true, d.IsNull(), d.GetMysqlEnum().Copy() memDelta += int64(len(p.val.Name)) - break } return memDelta, nil } @@ -552,14 +556,13 @@ func (e *firstRow4Set) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup if p.gotFirstRow { return memDelta, nil } - for _, row := range rowsInGroup { - d, err := e.args[0].Eval(row) + if len(rowsInGroup) > 0 { + d, err := e.args[0].Eval(rowsInGroup[0]) if err != nil { return memDelta, err } p.gotFirstRow, p.isNull, p.val = true, d.IsNull(), d.GetMysqlSet().Copy() memDelta += int64(len(p.val.Name)) - break } return memDelta, nil } diff --git a/executor/aggfuncs/func_first_row_test.go b/executor/aggfuncs/func_first_row_test.go index cb298664c19a7..03dc2e5da6729 100644 --- a/executor/aggfuncs/func_first_row_test.go +++ b/executor/aggfuncs/func_first_row_test.go @@ -27,12 +27,12 @@ import ( ) func (s *testSuite) TestMergePartialResult4FirstRow(c *C) { - elems := []string{"a", "b", "c", "d", "e"} - enumA, _ := types.ParseEnumName(elems, "a", mysql.DefaultCollationName) + elems := []string{"e", "d", "c", "b", "a"} enumC, _ := types.ParseEnumName(elems, "c", mysql.DefaultCollationName) + enumE, _ := types.ParseEnumName(elems, "e", mysql.DefaultCollationName) - setA, _ := types.ParseSetName(elems, "a", mysql.DefaultCollationName) - setAB, _ := types.ParseSetName(elems, "a,b", mysql.DefaultCollationName) + setED, _ := types.ParseSetName(elems, "e,d", mysql.DefaultCollationName) + setE, _ := types.ParseSetName(elems, "e", mysql.DefaultCollationName) tests := []aggTest{ buildAggTester(ast.AggFuncFirstRow, mysql.TypeLonglong, 5, 0, 2, 0), @@ -43,8 +43,8 @@ func (s *testSuite) TestMergePartialResult4FirstRow(c *C) { buildAggTester(ast.AggFuncFirstRow, mysql.TypeDate, 5, types.TimeFromDays(365), types.TimeFromDays(367), types.TimeFromDays(365)), buildAggTester(ast.AggFuncFirstRow, mysql.TypeDuration, 5, types.Duration{Duration: time.Duration(0)}, types.Duration{Duration: time.Duration(2)}, types.Duration{Duration: time.Duration(0)}), buildAggTester(ast.AggFuncFirstRow, mysql.TypeJSON, 5, json.CreateBinary(int64(0)), json.CreateBinary(int64(2)), json.CreateBinary(int64(0))), - buildAggTester(ast.AggFuncFirstRow, mysql.TypeEnum, 5, enumA, enumC, enumA), - buildAggTester(ast.AggFuncFirstRow, mysql.TypeSet, 5, setA, setAB, setA), + buildAggTester(ast.AggFuncFirstRow, mysql.TypeEnum, 5, enumE, enumC, enumE), + buildAggTester(ast.AggFuncFirstRow, mysql.TypeSet, 5, setE, setED, setE), } for _, test := range tests { s.testMergePartialResult(c, test) diff --git a/executor/aggfuncs/func_group_concat.go b/executor/aggfuncs/func_group_concat.go index 1e4b24bab45ca..ba80b91b3f3c1 100644 --- a/executor/aggfuncs/func_group_concat.go +++ b/executor/aggfuncs/func_group_concat.go @@ -18,8 +18,8 @@ import ( "container/heap" "sort" "sync/atomic" + "unsafe" - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/planner/util" @@ -27,10 +27,27 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/set" ) +const ( + // DefPartialResult4GroupConcatSize is the size of partialResult4GroupConcat + DefPartialResult4GroupConcatSize = int64(unsafe.Sizeof(partialResult4GroupConcat{})) + // DefPartialResult4GroupConcatDistinctSize is the size of partialResult4GroupConcatDistinct + DefPartialResult4GroupConcatDistinctSize = int64(unsafe.Sizeof(partialResult4GroupConcatDistinct{})) + // DefPartialResult4GroupConcatOrderSize is the size of partialResult4GroupConcatOrder + DefPartialResult4GroupConcatOrderSize = int64(unsafe.Sizeof(partialResult4GroupConcatOrder{})) + // DefPartialResult4GroupConcatOrderDistinctSize is the size of partialResult4GroupConcatOrderDistinct + DefPartialResult4GroupConcatOrderDistinctSize = int64(unsafe.Sizeof(partialResult4GroupConcatOrderDistinct{})) + + // DefBytesBufferSize is the size of bytes.Buffer. + DefBytesBufferSize = int64(unsafe.Sizeof(bytes.Buffer{})) + // DefTopNRowsSize is the size of topNRows. + DefTopNRowsSize = int64(unsafe.Sizeof(topNRows{})) +) + type baseGroupConcat4String struct { baseAggFunc byItems []*util.ByItems @@ -87,7 +104,7 @@ type groupConcat struct { func (e *groupConcat) AllocPartialResult() (pr PartialResult, memDelta int64) { p := new(partialResult4GroupConcat) p.valsBuf = &bytes.Buffer{} - return PartialResult(p), 0 + return PartialResult(p), DefPartialResult4GroupConcatSize + DefBytesBufferSize } func (e *groupConcat) ResetPartialResult(pr PartialResult) { @@ -98,12 +115,24 @@ func (e *groupConcat) ResetPartialResult(pr PartialResult) { func (e *groupConcat) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { p := (*partialResult4GroupConcat)(pr) v, isNull := "", false + memDelta += int64(-p.valsBuf.Cap()) + if p.buffer != nil { + memDelta += int64(-p.buffer.Cap()) + } + + defer func() { + memDelta += int64(p.valsBuf.Cap()) + if p.buffer != nil { + memDelta += int64(p.buffer.Cap()) + } + }() + for _, row := range rowsInGroup { p.valsBuf.Reset() for _, arg := range e.args { v, isNull, err = arg.EvalString(sctx, row) if err != nil { - return 0, err + return memDelta, err } if isNull { break @@ -115,15 +144,16 @@ func (e *groupConcat) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup [ } if p.buffer == nil { p.buffer = &bytes.Buffer{} + memDelta += DefBytesBufferSize } else { p.buffer.WriteString(e.sep) } p.buffer.WriteString(p.valsBuf.String()) } if p.buffer != nil { - return 0, e.truncatePartialResultIfNeed(sctx, p.buffer) + return memDelta, e.truncatePartialResultIfNeed(sctx, p.buffer) } - return 0, nil + return memDelta, nil } func (e *groupConcat) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { @@ -135,9 +165,11 @@ func (e *groupConcat) MergePartialResult(sctx sessionctx.Context, src, dst Parti p2.buffer = p1.buffer return 0, nil } + memDelta -= int64(p2.buffer.Cap()) p2.buffer.WriteString(e.sep) p2.buffer.WriteString(p1.buffer.String()) - return 0, e.truncatePartialResultIfNeed(sctx, p2.buffer) + memDelta += int64(p2.buffer.Cap()) + return memDelta, e.truncatePartialResultIfNeed(sctx, p2.buffer) } // SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type. @@ -152,7 +184,7 @@ func (e *groupConcat) GetTruncated() *int32 { type partialResult4GroupConcatDistinct struct { basePartialResult4GroupConcat - valSet set.StringSet + valSet set.StringSetWithMemoryUsage encodeBytesBuffer []byte } @@ -163,25 +195,37 @@ type groupConcatDistinct struct { func (e *groupConcatDistinct) AllocPartialResult() (pr PartialResult, memDelta int64) { p := new(partialResult4GroupConcatDistinct) p.valsBuf = &bytes.Buffer{} - p.valSet = set.NewStringSet() - return PartialResult(p), 0 + setSize := int64(0) + p.valSet, setSize = set.NewStringSetWithMemoryUsage() + return PartialResult(p), DefPartialResult4GroupConcatDistinctSize + DefBytesBufferSize + setSize } func (e *groupConcatDistinct) ResetPartialResult(pr PartialResult) { p := (*partialResult4GroupConcatDistinct)(pr) - p.buffer, p.valSet = nil, set.NewStringSet() + p.buffer = nil + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *groupConcatDistinct) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { p := (*partialResult4GroupConcatDistinct)(pr) v, isNull := "", false + memDelta += int64(-p.valsBuf.Cap()) + (int64(-cap(p.encodeBytesBuffer))) + if p.buffer != nil { + memDelta += int64(-p.buffer.Cap()) + } + defer func() { + memDelta += int64(p.valsBuf.Cap()) + (int64(cap(p.encodeBytesBuffer))) + if p.buffer != nil { + memDelta += int64(p.buffer.Cap()) + } + }() for _, row := range rowsInGroup { p.valsBuf.Reset() p.encodeBytesBuffer = p.encodeBytesBuffer[:0] for _, arg := range e.args { v, isNull, err = arg.EvalString(sctx, row) if err != nil { - return 0, err + return memDelta, err } if isNull { break @@ -196,10 +240,11 @@ func (e *groupConcatDistinct) UpdatePartialResult(sctx sessionctx.Context, rowsI if p.valSet.Exist(joinedVal) { continue } - p.valSet.Insert(joinedVal) + memDelta += p.valSet.Insert(joinedVal) // write separator if p.buffer == nil { p.buffer = &bytes.Buffer{} + memDelta += DefBytesBufferSize } else { p.buffer.WriteString(e.sep) } @@ -207,9 +252,9 @@ func (e *groupConcatDistinct) UpdatePartialResult(sctx sessionctx.Context, rowsI p.buffer.WriteString(p.valsBuf.String()) } if p.buffer != nil { - return 0, e.truncatePartialResultIfNeed(sctx, p.buffer) + return memDelta, e.truncatePartialResultIfNeed(sctx, p.buffer) } - return 0, nil + return memDelta, nil } // SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type. @@ -236,6 +281,11 @@ type topNRows struct { currSize uint64 limitSize uint64 sepSize uint64 + // If sep is truncated, we need to append part of sep to result. + // In the following example, session.group_concat_max_len is 10 and sep is '---'. + // ('---', 'ccc') should be poped from heap, so '-' should be appended to result. + // eg: 'aaa---bbb---ccc' -> 'aaa---bbb-' + isSepTruncated bool } func (h topNRows) Len() int { @@ -278,14 +328,18 @@ func (h *topNRows) Pop() interface{} { return x } -func (h *topNRows) tryToAdd(row sortRow) (truncated bool) { +func (h *topNRows) tryToAdd(row sortRow) (truncated bool, memDelta int64) { h.currSize += uint64(row.buffer.Len()) if len(h.rows) > 0 { h.currSize += h.sepSize } heap.Push(h, row) + memDelta += int64(row.buffer.Cap()) + for _, dt := range row.byItems { + memDelta += GetDatumMemSize(dt) + } if h.currSize <= h.limitSize { - return false + return false, memDelta } for h.currSize > h.limitSize { @@ -295,10 +349,15 @@ func (h *topNRows) tryToAdd(row sortRow) (truncated bool) { h.rows[0].buffer.Truncate(h.rows[0].buffer.Len() - int(debt)) } else { h.currSize -= uint64(h.rows[0].buffer.Len()) + h.sepSize + memDelta -= int64(h.rows[0].buffer.Cap()) + for _, dt := range h.rows[0].byItems { + memDelta -= GetDatumMemSize(dt) + } heap.Pop(h) + h.isSepTruncated = true } } - return true + return true, memDelta } func (h *topNRows) reset() { @@ -316,10 +375,11 @@ func (h *topNRows) concat(sep string, truncated bool) string { } buffer.Write(row.buffer.Bytes()) } - if truncated && uint64(buffer.Len()) < h.limitSize { - // append the last separator, because the last separator may be truncated in tryToAdd. + if h.isSepTruncated { buffer.WriteString(sep) - buffer.Truncate(int(h.limitSize)) + if uint64(buffer.Len()) > h.limitSize { + buffer.Truncate(int(h.limitSize)) + } } return buffer.String() } @@ -349,13 +409,14 @@ func (e *groupConcatOrder) AllocPartialResult() (pr PartialResult, memDelta int6 } p := &partialResult4GroupConcatOrder{ topN: &topNRows{ - desc: desc, - currSize: 0, - limitSize: e.maxLen, - sepSize: uint64(len(e.sep)), + desc: desc, + currSize: 0, + limitSize: e.maxLen, + sepSize: uint64(len(e.sep)), + isSepTruncated: false, }, } - return PartialResult(p), 0 + return PartialResult(p), DefPartialResult4GroupConcatOrderSize + DefTopNRowsSize } func (e *groupConcatOrder) ResetPartialResult(pr PartialResult) { @@ -372,7 +433,7 @@ func (e *groupConcatOrder) UpdatePartialResult(sctx sessionctx.Context, rowsInGr for _, arg := range e.args { v, isNull, err = arg.EvalString(sctx, row) if err != nil { - return 0, err + return memDelta, err } if isNull { break @@ -389,27 +450,28 @@ func (e *groupConcatOrder) UpdatePartialResult(sctx sessionctx.Context, rowsInGr for _, byItem := range e.byItems { d, err := byItem.Expr.Eval(row) if err != nil { - return 0, err + return memDelta, err } sortRow.byItems = append(sortRow.byItems, d.Clone()) } - truncated := p.topN.tryToAdd(sortRow) + truncated, sortRowMemSize := p.topN.tryToAdd(sortRow) + memDelta += sortRowMemSize if p.topN.err != nil { - return 0, p.topN.err + return memDelta, p.topN.err } if truncated { if err := e.handleTruncateError(sctx); err != nil { - return 0, err + return memDelta, err } } } - return 0, nil + return memDelta, nil } func (e *groupConcatOrder) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { // If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg. // So MergePartialResult will not be called. - return 0, terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("groupConcatOrder.MergePartialResult should not be called") + return 0, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("groupConcatOrder.MergePartialResult should not be called") } // SetTruncated will be called in `executorBuilder#buildHashAgg` with duck-type. @@ -424,7 +486,7 @@ func (e *groupConcatOrder) GetTruncated() *int32 { type partialResult4GroupConcatOrderDistinct struct { topN *topNRows - valSet set.StringSet + valSet set.StringSetWithMemoryUsage encodeBytesBuffer []byte } @@ -447,35 +509,39 @@ func (e *groupConcatDistinctOrder) AllocPartialResult() (pr PartialResult, memDe for i, byItem := range e.byItems { desc[i] = byItem.Desc } + valSet, setSize := set.NewStringSetWithMemoryUsage() p := &partialResult4GroupConcatOrderDistinct{ topN: &topNRows{ - desc: desc, - currSize: 0, - limitSize: e.maxLen, - sepSize: uint64(len(e.sep)), + desc: desc, + currSize: 0, + limitSize: e.maxLen, + sepSize: uint64(len(e.sep)), + isSepTruncated: false, }, - valSet: set.NewStringSet(), + valSet: valSet, } - return PartialResult(p), 0 + return PartialResult(p), DefPartialResult4GroupConcatOrderDistinctSize + DefTopNRowsSize + setSize } func (e *groupConcatDistinctOrder) ResetPartialResult(pr PartialResult) { p := (*partialResult4GroupConcatOrderDistinct)(pr) p.topN.reset() - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { p := (*partialResult4GroupConcatOrderDistinct)(pr) p.topN.sctx = sctx v, isNull := "", false + memDelta -= int64(cap(p.encodeBytesBuffer)) + defer func() { memDelta += int64(cap(p.encodeBytesBuffer)) }() for _, row := range rowsInGroup { buffer := new(bytes.Buffer) p.encodeBytesBuffer = p.encodeBytesBuffer[:0] for _, arg := range e.args { v, isNull, err = arg.EvalString(sctx, row) if err != nil { - return 0, err + return memDelta, err } if isNull { break @@ -490,7 +556,7 @@ func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context, if p.valSet.Exist(joinedVal) { continue } - p.valSet.Insert(joinedVal) + memDelta += p.valSet.Insert(joinedVal) sortRow := sortRow{ buffer: buffer, byItems: make([]*types.Datum, 0, len(e.byItems)), @@ -498,25 +564,37 @@ func (e *groupConcatDistinctOrder) UpdatePartialResult(sctx sessionctx.Context, for _, byItem := range e.byItems { d, err := byItem.Expr.Eval(row) if err != nil { - return 0, err + return memDelta, err } sortRow.byItems = append(sortRow.byItems, d.Clone()) } - truncated := p.topN.tryToAdd(sortRow) + truncated, sortRowMemSize := p.topN.tryToAdd(sortRow) + memDelta += sortRowMemSize if p.topN.err != nil { - return 0, p.topN.err + return memDelta, p.topN.err } if truncated { if err := e.handleTruncateError(sctx); err != nil { - return 0, err + return memDelta, err } } } - return 0, nil + return memDelta, nil } func (e *groupConcatDistinctOrder) MergePartialResult(sctx sessionctx.Context, src, dst PartialResult) (memDelta int64, err error) { // If order by exists, the parallel hash aggregation is forbidden in executorBuilder.buildHashAgg. // So MergePartialResult will not be called. - return 0, terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called") + return 0, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal).GenWithStack("groupConcatDistinctOrder.MergePartialResult should not be called") +} + +// GetDatumMemSize calculates the memory size of each types.Datum in sortRow.byItems. +// types.Datum memory size = variable type's memory size + variable value's memory size. +func GetDatumMemSize(d *types.Datum) int64 { + var datumMemSize int64 + datumMemSize += int64(unsafe.Sizeof(*d)) + datumMemSize += int64(len(d.Collation())) + datumMemSize += int64(len(d.GetBytes())) + datumMemSize += getValMemDelta(d.GetInterface()) - DefInterfaceSize + return datumMemSize } diff --git a/executor/aggfuncs/func_group_concat_test.go b/executor/aggfuncs/func_group_concat_test.go index 7e68e93cfed3b..7fa9d131e2bb8 100644 --- a/executor/aggfuncs/func_group_concat_test.go +++ b/executor/aggfuncs/func_group_concat_test.go @@ -14,13 +14,20 @@ package aggfuncs_test import ( + "bytes" "fmt" . "github.com/pingcap/check" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/executor/aggfuncs" + "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/hack" + "github.com/pingcap/tidb/util/set" ) func (s *testSuite) TestMergePartialResult4GroupConcat(c *C) { @@ -36,12 +43,162 @@ func (s *testSuite) TestGroupConcat(c *C) { test2.orderBy = true s.testMultiArgsAggFunc(c, test2) - defer variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, types.NewStringDatum("1024")) + defer func() { + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, types.NewStringDatum("1024")) + c.Assert(err, IsNil) + }() // minimum GroupConcatMaxLen is 4 for i := 4; i <= 7; i++ { - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, types.NewStringDatum(fmt.Sprint(i))) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.GroupConcatMaxLen, types.NewStringDatum(fmt.Sprint(i))) + c.Assert(err, IsNil) test2 = buildMultiArgsAggTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, nil, "44 33 22 11 00"[:i]) test2.orderBy = true s.testMultiArgsAggFunc(c, test2) } } + +func (s *testSuite) TestMemGroupConcat(c *C) { + multiArgsTest1 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, + aggfuncs.DefPartialResult4GroupConcatSize+aggfuncs.DefBytesBufferSize, groupConcatMultiArgsUpdateMemDeltaGens, false) + multiArgsTest2 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, + aggfuncs.DefPartialResult4GroupConcatDistinctSize+aggfuncs.DefBytesBufferSize+set.DefStringSetBucketMemoryUsage, groupConcatDistinctMultiArgsUpdateMemDeltaGens, true) + + multiArgsTest3 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, + aggfuncs.DefPartialResult4GroupConcatOrderSize+aggfuncs.DefTopNRowsSize, groupConcatOrderMultiArgsUpdateMemDeltaGens, false) + multiArgsTest3.multiArgsAggTest.orderBy = true + multiArgsTest4 := buildMultiArgsAggMemTester(ast.AggFuncGroupConcat, []byte{mysql.TypeString, mysql.TypeString}, mysql.TypeString, 5, + aggfuncs.DefPartialResult4GroupConcatOrderDistinctSize+aggfuncs.DefTopNRowsSize+set.DefStringSetBucketMemoryUsage, groupConcatDistinctOrderMultiArgsUpdateMemDeltaGens, true) + multiArgsTest4.multiArgsAggTest.orderBy = true + + multiArgsTests := []multiArgsAggMemTest{multiArgsTest1, multiArgsTest2, multiArgsTest3, multiArgsTest4} + for _, test := range multiArgsTests { + s.testMultiArgsAggMemFunc(c, test) + } +} + +func groupConcatMultiArgsUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType []*types.FieldType, byItems []*util.ByItems) (memDeltas []int64, err error) { + memDeltas = make([]int64, 0) + buffer := new(bytes.Buffer) + valBuffer := new(bytes.Buffer) + for i := 0; i < srcChk.NumRows(); i++ { + valBuffer.Reset() + row := srcChk.GetRow(i) + if row.IsNull(0) { + memDeltas = append(memDeltas, int64(0)) + continue + } + oldMemSize := buffer.Cap() + valBuffer.Cap() + if i != 0 { + buffer.WriteString(separator) + } + for j := 0; j < len(dataType); j++ { + curVal := row.GetString(j) + valBuffer.WriteString(curVal) + } + buffer.WriteString(valBuffer.String()) + memDelta := int64(buffer.Cap() + valBuffer.Cap() - oldMemSize) + if i == 0 { + memDelta += aggfuncs.DefBytesBufferSize + } + memDeltas = append(memDeltas, memDelta) + } + return memDeltas, nil +} + +func groupConcatOrderMultiArgsUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType []*types.FieldType, byItems []*util.ByItems) (memDeltas []int64, err error) { + memDeltas = make([]int64, 0) + for i := 0; i < srcChk.NumRows(); i++ { + buffer := new(bytes.Buffer) + row := srcChk.GetRow(i) + if row.IsNull(0) { + memDeltas = append(memDeltas, int64(0)) + continue + } + oldMemSize := buffer.Cap() + for j := 0; j < len(dataType); j++ { + curVal := row.GetString(j) + buffer.WriteString(curVal) + } + memDelta := int64(buffer.Cap() - oldMemSize) + for _, byItem := range byItems { + fdt, _ := byItem.Expr.Eval(row) + datumMem := aggfuncs.GetDatumMemSize(&fdt) + memDelta += datumMem + } + memDeltas = append(memDeltas, memDelta) + } + return memDeltas, nil +} + +func groupConcatDistinctMultiArgsUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType []*types.FieldType, byItems []*util.ByItems) (memDeltas []int64, err error) { + valSet := set.NewStringSet() + buffer := new(bytes.Buffer) + valsBuf := new(bytes.Buffer) + var encodeBytesBuffer []byte + for i := 0; i < srcChk.NumRows(); i++ { + row := srcChk.GetRow(i) + if row.IsNull(0) { + memDeltas = append(memDeltas, int64(0)) + continue + } + valsBuf.Reset() + oldMemSize := buffer.Cap() + valsBuf.Cap() + cap(encodeBytesBuffer) + encodeBytesBuffer = encodeBytesBuffer[:0] + for j := 0; j < len(dataType); j++ { + curVal := row.GetString(j) + encodeBytesBuffer = codec.EncodeBytes(encodeBytesBuffer, hack.Slice(curVal)) + valsBuf.WriteString(curVal) + } + joinedVal := string(encodeBytesBuffer) + if valSet.Exist(joinedVal) { + memDeltas = append(memDeltas, int64(0)) + continue + } + valSet.Insert(joinedVal) + if i != 0 { + buffer.WriteString(separator) + } + buffer.WriteString(valsBuf.String()) + memDelta := int64(len(joinedVal) + (buffer.Cap() + valsBuf.Cap() + cap(encodeBytesBuffer) - oldMemSize)) + if i == 0 { + memDelta += aggfuncs.DefBytesBufferSize + } + memDeltas = append(memDeltas, memDelta) + } + return memDeltas, nil +} + +func groupConcatDistinctOrderMultiArgsUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType []*types.FieldType, byItems []*util.ByItems) (memDeltas []int64, err error) { + valSet := set.NewStringSet() + var encodeBytesBuffer []byte + for i := 0; i < srcChk.NumRows(); i++ { + valsBuf := new(bytes.Buffer) + row := srcChk.GetRow(i) + if row.IsNull(0) { + memDeltas = append(memDeltas, int64(0)) + continue + } + valsBuf.Reset() + encodeBytesBuffer = encodeBytesBuffer[:0] + oldMemSize := valsBuf.Cap() + cap(encodeBytesBuffer) + for j := 0; j < len(dataType); j++ { + curVal := row.GetString(j) + encodeBytesBuffer = codec.EncodeBytes(encodeBytesBuffer, hack.Slice(curVal)) + valsBuf.WriteString(curVal) + } + joinedVal := string(encodeBytesBuffer) + if valSet.Exist(joinedVal) { + memDeltas = append(memDeltas, int64(0)) + continue + } + valSet.Insert(joinedVal) + memDelta := int64(len(joinedVal) + (valsBuf.Cap() + cap(encodeBytesBuffer) - oldMemSize)) + for _, byItem := range byItems { + fdt, _ := byItem.Expr.Eval(row) + datumMem := aggfuncs.GetDatumMemSize(&fdt) + memDelta += datumMem + } + memDeltas = append(memDeltas, memDelta) + } + return memDeltas, nil +} diff --git a/executor/aggfuncs/func_json_objectagg.go b/executor/aggfuncs/func_json_objectagg.go index 5b34f5be6b442..c2bf3bf985231 100644 --- a/executor/aggfuncs/func_json_objectagg.go +++ b/executor/aggfuncs/func_json_objectagg.go @@ -21,12 +21,15 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/stringutil" ) const ( // DefPartialResult4JsonObjectAgg is the size of partialResult4JsonObject DefPartialResult4JsonObjectAgg = int64(unsafe.Sizeof(partialResult4JsonObjectAgg{})) + // DefMapStringInterfaceBucketSize = bucketSize*(1+unsafe.Sizeof(string) + unsafe.Sizeof(interface{}))+2*ptrSize + DefMapStringInterfaceBucketSize = 8*(1+16+16) + 16 ) type jsonObjectAgg struct { @@ -35,17 +38,20 @@ type jsonObjectAgg struct { type partialResult4JsonObjectAgg struct { entries map[string]interface{} + bInMap int // indicate there are 2^bInMap buckets in entries. } func (e *jsonObjectAgg) AllocPartialResult() (pr PartialResult, memDelta int64) { p := partialResult4JsonObjectAgg{} p.entries = make(map[string]interface{}) - return PartialResult(&p), DefPartialResult4JsonObjectAgg + p.bInMap = 0 + return PartialResult(&p), DefPartialResult4JsonObjectAgg + (1< (1< (1< p.val.Value || !e.isMax && en.Value < p.val.Value { + if e.isMax && en.Name > p.val.Name || !e.isMax && en.Name < p.val.Name { oldMem := len(p.val.Name) newMem := len(en.Name) memDelta += int64(newMem - oldMem) @@ -1375,7 +1452,7 @@ func (e *maxMin4Enum) MergePartialResult(sctx sessionctx.Context, src, dst Parti *p2 = *p1 return 0, nil } - if e.isMax && p1.val.Value > p2.val.Value || !e.isMax && p1.val.Value < p2.val.Value { + if e.isMax && p1.val.Name > p2.val.Name || !e.isMax && p1.val.Name < p2.val.Name { p2.val, p2.isNull = p1.val, false } return 0, nil @@ -1423,7 +1500,7 @@ func (e *maxMin4Set) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup [] continue } s := d.GetMysqlSet() - if e.isMax && s.Value > p.val.Value || !e.isMax && s.Value < p.val.Value { + if e.isMax && s.Name > p.val.Name || !e.isMax && s.Name < p.val.Name { oldMem := len(p.val.Name) newMem := len(s.Name) memDelta += int64(newMem - oldMem) @@ -1442,7 +1519,7 @@ func (e *maxMin4Set) MergePartialResult(sctx sessionctx.Context, src, dst Partia *p2 = *p1 return 0, nil } - if e.isMax && p1.val.Value > p2.val.Value || !e.isMax && p1.val.Value < p2.val.Value { + if e.isMax && p1.val.Name > p2.val.Name || !e.isMax && p1.val.Name < p2.val.Name { p2.val, p2.isNull = p1.val, false } return 0, nil diff --git a/executor/aggfuncs/func_max_min_test.go b/executor/aggfuncs/func_max_min_test.go index adade4a5f3a51..f8adef6d59cf5 100644 --- a/executor/aggfuncs/func_max_min_test.go +++ b/executor/aggfuncs/func_max_min_test.go @@ -66,7 +66,7 @@ func maxMinUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType, is if i == 0 { memDeltas[i] = int64(len(curVal.Name)) preEnumVal = curVal - } else if isMax && curVal.Value > preEnumVal.Value || !isMax && curVal.Value < preEnumVal.Value { + } else if isMax && curVal.Name > preEnumVal.Name || !isMax && curVal.Name < preEnumVal.Name { memDeltas[i] = int64(len(curVal.Name)) - int64(len(preEnumVal.Name)) preEnumVal = curVal } @@ -75,7 +75,7 @@ func maxMinUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType, is if i == 0 { memDeltas[i] = int64(len(curVal.Name)) preSetVal = curVal - } else if isMax && curVal.Value > preSetVal.Value || !isMax && curVal.Value < preSetVal.Value { + } else if isMax && curVal.Name > preSetVal.Name || !isMax && curVal.Name < preSetVal.Name { memDeltas[i] = int64(len(curVal.Name)) - int64(len(preSetVal.Name)) preSetVal = curVal } @@ -93,14 +93,13 @@ func minUpdateMemDeltaGens(srcChk *chunk.Chunk, dataType *types.FieldType) (memD } func (s *testSuite) TestMergePartialResult4MaxMin(c *C) { - elems := []string{"a", "b", "c", "d", "e"} - enumA, _ := types.ParseEnumName(elems, "a", mysql.DefaultCollationName) - enumC, _ := types.ParseEnumName(elems, "c", mysql.DefaultCollationName) - enumE, _ := types.ParseEnumName(elems, "e", mysql.DefaultCollationName) + elems := []string{"e", "d", "c", "b", "a"} + enumA, _ := types.ParseEnum(elems, "a", mysql.DefaultCollationName) + enumC, _ := types.ParseEnum(elems, "c", mysql.DefaultCollationName) + enumE, _ := types.ParseEnum(elems, "e", mysql.DefaultCollationName) - setA, _ := types.ParseSetName(elems, "a", mysql.DefaultCollationName) // setA.Value == 1 - setAB, _ := types.ParseSetName(elems, "a,b", mysql.DefaultCollationName) // setAB.Value == 3 - setAC, _ := types.ParseSetName(elems, "a,c", mysql.DefaultCollationName) // setAC.Value == 5 + setC, _ := types.ParseSet(elems, "c", mysql.DefaultCollationName) // setC.Value == 4 + setED, _ := types.ParseSet(elems, "e,d", mysql.DefaultCollationName) // setED.Value == 3 unsignedType := types.NewFieldType(mysql.TypeLonglong) unsignedType.Flag |= mysql.UnsignedFlag @@ -114,8 +113,8 @@ func (s *testSuite) TestMergePartialResult4MaxMin(c *C) { buildAggTester(ast.AggFuncMax, mysql.TypeDate, 5, types.TimeFromDays(369), types.TimeFromDays(369), types.TimeFromDays(369)), buildAggTester(ast.AggFuncMax, mysql.TypeDuration, 5, types.Duration{Duration: time.Duration(4)}, types.Duration{Duration: time.Duration(4)}, types.Duration{Duration: time.Duration(4)}), buildAggTester(ast.AggFuncMax, mysql.TypeJSON, 5, json.CreateBinary(int64(4)), json.CreateBinary(int64(4)), json.CreateBinary(int64(4))), - buildAggTester(ast.AggFuncMax, mysql.TypeEnum, 5, enumE, enumE, enumE), - buildAggTester(ast.AggFuncMax, mysql.TypeSet, 5, setAC, setAC, setAC), + buildAggTester(ast.AggFuncMax, mysql.TypeEnum, 5, enumE, enumC, enumE), + buildAggTester(ast.AggFuncMax, mysql.TypeSet, 5, setED, setED, setED), buildAggTester(ast.AggFuncMin, mysql.TypeLonglong, 5, 0, 2, 0), buildAggTesterWithFieldType(ast.AggFuncMin, unsignedType, 5, 0, 2, 0), @@ -126,8 +125,8 @@ func (s *testSuite) TestMergePartialResult4MaxMin(c *C) { buildAggTester(ast.AggFuncMin, mysql.TypeDate, 5, types.TimeFromDays(365), types.TimeFromDays(367), types.TimeFromDays(365)), buildAggTester(ast.AggFuncMin, mysql.TypeDuration, 5, types.Duration{Duration: time.Duration(0)}, types.Duration{Duration: time.Duration(2)}, types.Duration{Duration: time.Duration(0)}), buildAggTester(ast.AggFuncMin, mysql.TypeJSON, 5, json.CreateBinary(int64(0)), json.CreateBinary(int64(2)), json.CreateBinary(int64(0))), - buildAggTester(ast.AggFuncMin, mysql.TypeEnum, 5, enumA, enumC, enumA), - buildAggTester(ast.AggFuncMin, mysql.TypeSet, 5, setA, setAB, setA), + buildAggTester(ast.AggFuncMin, mysql.TypeEnum, 5, enumA, enumA, enumA), + buildAggTester(ast.AggFuncMin, mysql.TypeSet, 5, setC, setC, setC), } for _, test := range tests { s.testMergePartialResult(c, test) @@ -176,7 +175,7 @@ func (s *testSuite) TestMemMaxMin(c *C) { buildAggMemTester(ast.AggFuncMax, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4MaxMinFloat64Size, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMax, mysql.TypeDate, 5, - aggfuncs.DefPartialResult4TimeSize, defaultUpdateMemDeltaGens, false), + aggfuncs.DefPartialResult4MaxMinTimeSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMax, mysql.TypeDuration, 5, aggfuncs.DefPartialResult4MaxMinDurationSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMax, mysql.TypeString, 99, @@ -199,7 +198,7 @@ func (s *testSuite) TestMemMaxMin(c *C) { buildAggMemTester(ast.AggFuncMin, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4MaxMinFloat64Size, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMin, mysql.TypeDate, 5, - aggfuncs.DefPartialResult4TimeSize, defaultUpdateMemDeltaGens, false), + aggfuncs.DefPartialResult4MaxMinTimeSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMin, mysql.TypeDuration, 5, aggfuncs.DefPartialResult4MaxMinDurationSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncMin, mysql.TypeString, 99, diff --git a/executor/aggfuncs/func_rank.go b/executor/aggfuncs/func_rank.go index 1efe2dc9379d9..da298721dd6fe 100644 --- a/executor/aggfuncs/func_rank.go +++ b/executor/aggfuncs/func_rank.go @@ -22,7 +22,7 @@ import ( ) const ( - //DefPartialResult4RankSize is the size of partialResult4Rank + // DefPartialResult4RankSize is the size of partialResult4Rank DefPartialResult4RankSize = int64(unsafe.Sizeof(partialResult4Rank{})) ) diff --git a/executor/aggfuncs/func_sum.go b/executor/aggfuncs/func_sum.go index 070d97dcecf2b..127e743b000a9 100644 --- a/executor/aggfuncs/func_sum.go +++ b/executor/aggfuncs/func_sum.go @@ -47,13 +47,13 @@ type partialResult4SumDecimal struct { type partialResult4SumDistinctFloat64 struct { val float64 isNull bool - valSet set.Float64Set + valSet set.Float64SetWithMemoryUsage } type partialResult4SumDistinctDecimal struct { val types.MyDecimal isNull bool - valSet set.StringSet + valSet set.StringSetWithMemoryUsage } type baseSumAggFunc struct { @@ -166,6 +166,10 @@ func (e *sum4Decimal) AppendFinalResult2Chunk(sctx sessionctx.Context, pr Partia chk.AppendNull(e.ordinal) return nil } + err := p.val.Round(&p.val, e.frac, types.ModeHalfEven) + if err != nil { + return err + } chk.AppendMyDecimal(e.ordinal, &p.val) return nil } @@ -259,16 +263,17 @@ type sum4DistinctFloat64 struct { } func (e *sum4DistinctFloat64) AllocPartialResult() (pr PartialResult, memDelta int64) { + setSize := int64(0) p := new(partialResult4SumDistinctFloat64) p.isNull = true - p.valSet = set.NewFloat64Set() - return PartialResult(p), DefPartialResult4SumDistinctFloat64Size + p.valSet, setSize = set.NewFloat64SetWithMemoryUsage() + return PartialResult(p), DefPartialResult4SumDistinctFloat64Size + setSize } func (e *sum4DistinctFloat64) ResetPartialResult(pr PartialResult) { p := (*partialResult4SumDistinctFloat64)(pr) p.isNull = true - p.valSet = set.NewFloat64Set() + p.valSet, _ = set.NewFloat64SetWithMemoryUsage() } func (e *sum4DistinctFloat64) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { @@ -281,8 +286,7 @@ func (e *sum4DistinctFloat64) UpdatePartialResult(sctx sessionctx.Context, rowsI if isNull || p.valSet.Exist(input) { continue } - p.valSet.Insert(input) - memDelta += DefFloat64Size + memDelta += p.valSet.Insert(input) if p.isNull { p.val = input p.isNull = false @@ -310,14 +314,15 @@ type sum4DistinctDecimal struct { func (e *sum4DistinctDecimal) AllocPartialResult() (pr PartialResult, memDelta int64) { p := new(partialResult4SumDistinctDecimal) p.isNull = true - p.valSet = set.NewStringSet() - return PartialResult(p), DefPartialResult4SumDistinctDecimalSize + setSize := int64(0) + p.valSet, setSize = set.NewStringSetWithMemoryUsage() + return PartialResult(p), DefPartialResult4SumDistinctDecimalSize + setSize } func (e *sum4DistinctDecimal) ResetPartialResult(pr PartialResult) { p := (*partialResult4SumDistinctDecimal)(pr) p.isNull = true - p.valSet = set.NewStringSet() + p.valSet, _ = set.NewStringSetWithMemoryUsage() } func (e *sum4DistinctDecimal) UpdatePartialResult(sctx sessionctx.Context, rowsInGroup []chunk.Row, pr PartialResult) (memDelta int64, err error) { @@ -338,8 +343,7 @@ func (e *sum4DistinctDecimal) UpdatePartialResult(sctx sessionctx.Context, rowsI if p.valSet.Exist(decStr) { continue } - p.valSet.Insert(decStr) - memDelta += int64(len(decStr)) + memDelta += p.valSet.Insert(decStr) if p.isNull { p.val = *input p.isNull = false diff --git a/executor/aggfuncs/func_sum_test.go b/executor/aggfuncs/func_sum_test.go index b52b897384827..701b3d36059da 100644 --- a/executor/aggfuncs/func_sum_test.go +++ b/executor/aggfuncs/func_sum_test.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/set" ) func (s *testSuite) TestMergePartialResult4Sum(c *C) { @@ -48,9 +49,9 @@ func (s *testSuite) TestMemSum(c *C) { buildAggMemTester(ast.AggFuncSum, mysql.TypeNewDecimal, 5, aggfuncs.DefPartialResult4SumDecimalSize, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncSum, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4SumDistinctFloat64Size, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4SumDistinctFloat64Size+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), buildAggMemTester(ast.AggFuncSum, mysql.TypeNewDecimal, 5, - aggfuncs.DefPartialResult4SumDistinctDecimalSize, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4SumDistinctDecimalSize+set.DefStringSetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), } for _, test := range tests { s.testAggMemFunc(c, test) diff --git a/executor/aggfuncs/func_varpop.go b/executor/aggfuncs/func_varpop.go index 6bf2f8b2ac215..fcd7ae6806b18 100644 --- a/executor/aggfuncs/func_varpop.go +++ b/executor/aggfuncs/func_varpop.go @@ -126,7 +126,7 @@ type partialResult4VarPopDistinctFloat64 struct { count int64 sum float64 variance float64 - valSet set.Float64Set + valSet set.Float64SetWithMemoryUsage } func (e *varPop4DistinctFloat64) AllocPartialResult() (pr PartialResult, memDelta int64) { @@ -134,8 +134,9 @@ func (e *varPop4DistinctFloat64) AllocPartialResult() (pr PartialResult, memDelt p.count = 0 p.sum = 0 p.variance = 0 - p.valSet = set.NewFloat64Set() - return PartialResult(p), DefPartialResult4VarPopDistinctFloat64Size + setSize := int64(0) + p.valSet, setSize = set.NewFloat64SetWithMemoryUsage() + return PartialResult(p), DefPartialResult4VarPopDistinctFloat64Size + setSize } func (e *varPop4DistinctFloat64) ResetPartialResult(pr PartialResult) { @@ -143,7 +144,7 @@ func (e *varPop4DistinctFloat64) ResetPartialResult(pr PartialResult) { p.count = 0 p.sum = 0 p.variance = 0 - p.valSet = set.NewFloat64Set() + p.valSet, _ = set.NewFloat64SetWithMemoryUsage() } func (e *varPop4DistinctFloat64) AppendFinalResult2Chunk(sctx sessionctx.Context, pr PartialResult, chk *chunk.Chunk) error { @@ -167,11 +168,10 @@ func (e *varPop4DistinctFloat64) UpdatePartialResult(sctx sessionctx.Context, ro if isNull || p.valSet.Exist(input) { continue } - p.valSet.Insert(input) + memDelta += p.valSet.Insert(input) p.count++ p.sum += input - memDelta += DefFloat64Size if p.count > 1 { p.variance = calculateIntermediate(p.count, p.sum, input, p.variance) } diff --git a/executor/aggfuncs/func_varpop_test.go b/executor/aggfuncs/func_varpop_test.go index 056f87cd28051..1b7fe3596bb43 100644 --- a/executor/aggfuncs/func_varpop_test.go +++ b/executor/aggfuncs/func_varpop_test.go @@ -6,6 +6,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/set" ) func (s *testSuite) TestMergePartialResult4Varpop(c *C) { @@ -31,7 +32,7 @@ func (s *testSuite) TestMemVarpop(c *C) { buildAggMemTester(ast.AggFuncVarPop, mysql.TypeDouble, 5, aggfuncs.DefPartialResult4VarPopFloat64Size, defaultUpdateMemDeltaGens, false), buildAggMemTester(ast.AggFuncVarPop, mysql.TypeDouble, 5, - aggfuncs.DefPartialResult4VarPopDistinctFloat64Size, distinctUpdateMemDeltaGens, true), + aggfuncs.DefPartialResult4VarPopDistinctFloat64Size+set.DefFloat64SetBucketMemoryUsage, distinctUpdateMemDeltaGens, true), } for _, test := range tests { s.testAggMemFunc(c, test) diff --git a/executor/aggregate.go b/executor/aggregate.go index 768692ecbec6c..66556266c1627 100644 --- a/executor/aggregate.go +++ b/executor/aggregate.go @@ -17,7 +17,10 @@ import ( "bytes" "context" "fmt" + "sort" "sync" + "sync/atomic" + "time" "github.com/cznic/mathutil" "github.com/pingcap/errors" @@ -32,6 +35,7 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/set" @@ -47,15 +51,30 @@ type baseHashAggWorker struct { finishCh <-chan struct{} aggFuncs []aggfuncs.AggFunc maxChunkSize int + stats *AggWorkerStat + + memTracker *memory.Tracker + BInMap int // indicate there are 2^BInMap buckets in Golang Map. } -func newBaseHashAggWorker(ctx sessionctx.Context, finishCh <-chan struct{}, aggFuncs []aggfuncs.AggFunc, maxChunkSize int) baseHashAggWorker { - return baseHashAggWorker{ +const ( + // ref https://github.com/golang/go/blob/go1.15.6/src/reflect/type.go#L2162. + // defBucketMemoryUsage = bucketSize*(1+unsafe.Sizeof(string) + unsafe.Sizeof(slice))+2*ptrSize + // The bucket size may be changed by golang implement in the future. + defBucketMemoryUsage = 8*(1+16+24) + 16 +) + +func newBaseHashAggWorker(ctx sessionctx.Context, finishCh <-chan struct{}, aggFuncs []aggfuncs.AggFunc, + maxChunkSize int, memTrack *memory.Tracker) baseHashAggWorker { + baseWorker := baseHashAggWorker{ ctx: ctx, finishCh: finishCh, aggFuncs: aggFuncs, maxChunkSize: maxChunkSize, + memTracker: memTrack, + BInMap: 0, } + return baseWorker } // HashAggPartialWorker indicates the partial workers of parallel hash agg execution, @@ -72,8 +91,7 @@ type HashAggPartialWorker struct { groupKey [][]byte // chk stores the input data from child, // and is reused by childExec and partial worker. - chk *chunk.Chunk - memTracker *memory.Tracker + chk *chunk.Chunk } // HashAggFinalWorker indicates the final workers of parallel hash agg execution, @@ -84,7 +102,7 @@ type HashAggFinalWorker struct { rowBuffer []types.Datum mutableRow chunk.MutRow partialResultMap aggPartialResultMapper - groupSet set.StringSet + groupSet set.StringSetWithMemoryUsage inputCh chan *HashAggIntermData outputCh chan *AfFinalResult finalResultHolderCh chan *chunk.Chunk @@ -146,7 +164,8 @@ type HashAggExec struct { PartialAggFuncs []aggfuncs.AggFunc FinalAggFuncs []aggfuncs.AggFunc partialResultMap aggPartialResultMapper - groupSet set.StringSet + bInMap int64 // indicate there are 2^bInMap buckets in partialResultMap + groupSet set.StringSetWithMemoryUsage groupKeys []string cursor4GroupKey int GroupByItems []expression.Expression @@ -171,6 +190,8 @@ type HashAggExec struct { executed bool memTracker *memory.Tracker // track memory usage. + + stats *HashAggRuntimeStats } // HashAggInput indicates the input of hash agg exec. @@ -206,8 +227,9 @@ func (e *HashAggExec) Close() error { if e.isUnparallelExec { e.memTracker.Consume(-e.childResult.MemoryUsage()) e.childResult = nil - e.groupSet = nil + e.groupSet, _ = set.NewStringSetWithMemoryUsage() e.partialResultMap = nil + e.memTracker.ReplaceBytesUsed(0) return e.baseExecutor.Close() } // `Close` may be called after `Open` without calling `Next` in test. @@ -234,22 +256,7 @@ func (e *HashAggExec) Close() error { for range e.finalOutputCh { } e.executed = false - - if e.runtimeStats != nil { - var partialConcurrency, finalConcurrency int - if e.isUnparallelExec { - partialConcurrency = 0 - finalConcurrency = 0 - } else { - partialConcurrency = cap(e.partialWorkers) - finalConcurrency = cap(e.finalWorkers) - } - partialConcurrencyInfo := execdetails.NewConcurrencyInfo("PartialConcurrency", partialConcurrency) - finalConcurrencyInfo := execdetails.NewConcurrencyInfo("FinalConcurrency", finalConcurrency) - runtimeStats := &execdetails.RuntimeStatsWithConcurrencyInfo{} - runtimeStats.SetConcurrencyInfo(partialConcurrencyInfo, finalConcurrencyInfo) - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) - } + e.memTracker.ReplaceBytesUsed(0) return e.baseExecutor.Close() } @@ -261,7 +268,9 @@ func (e *HashAggExec) Open(ctx context.Context) error { e.prepared = false e.memTracker = memory.NewTracker(e.id, -1) - e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) + if e.ctx.GetSessionVars().TrackAggregateMemoryUsage { + e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) + } if e.isUnparallelExec { e.initForUnparallelExec() @@ -272,8 +281,12 @@ func (e *HashAggExec) Open(ctx context.Context) error { } func (e *HashAggExec) initForUnparallelExec() { - e.groupSet = set.NewStringSet() + var setSize int64 + e.groupSet, setSize = set.NewStringSetWithMemoryUsage() e.partialResultMap = make(aggPartialResultMapper) + e.bInMap = 0 + failpoint.Inject("ConsumeRandomPanic", nil) + e.memTracker.Consume(defBucketMemoryUsage*(1< bucketNum * loadFactor. The memory usage will doubled. + if len(mapper) > (1< bucketNum * loadFactor. The memory usage will doubled. + if len(e.partialResultMap) > (1< 0 { + sort.Slice(workerStats, func(i, j int) bool { return workerStats[i].WorkerTime < workerStats[j].WorkerTime }) + buf.WriteString(fmt.Sprintf(", max:%v, p95:%v", + time.Duration(workerStats[n-1].WorkerTime), time.Duration(workerStats[n*19/20].WorkerTime))) + } + buf.WriteString("}") +} + +// String implements the RuntimeStats interface. +func (e *HashAggRuntimeStats) String() string { + buf := bytes.NewBuffer(make([]byte, 0, 64)) + e.workerString(buf, "partial", e.PartialConcurrency, atomic.LoadInt64(&e.PartialWallTime), e.PartialStats) + buf.WriteString(", ") + e.workerString(buf, "final", e.FinalConcurrency, atomic.LoadInt64(&e.FinalWallTime), e.FinalStats) + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (e *HashAggRuntimeStats) Clone() execdetails.RuntimeStats { + newRs := &HashAggRuntimeStats{ + PartialConcurrency: e.PartialConcurrency, + PartialWallTime: atomic.LoadInt64(&e.PartialWallTime), + FinalConcurrency: e.FinalConcurrency, + FinalWallTime: atomic.LoadInt64(&e.FinalWallTime), + PartialStats: make([]*AggWorkerStat, 0, e.PartialConcurrency), + FinalStats: make([]*AggWorkerStat, 0, e.FinalConcurrency), + } + for _, s := range e.PartialStats { + newRs.PartialStats = append(newRs.PartialStats, s.Clone()) + } + for _, s := range e.FinalStats { + newRs.FinalStats = append(newRs.FinalStats, s.Clone()) + } + return newRs +} + +// Merge implements the RuntimeStats interface. +func (e *HashAggRuntimeStats) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*HashAggRuntimeStats) + if !ok { + return + } + atomic.AddInt64(&e.PartialWallTime, atomic.LoadInt64(&tmp.PartialWallTime)) + atomic.AddInt64(&e.FinalWallTime, atomic.LoadInt64(&tmp.FinalWallTime)) + e.PartialStats = append(e.PartialStats, tmp.PartialStats...) + e.FinalStats = append(e.FinalStats, tmp.FinalStats...) +} + +// Tp implements the RuntimeStats interface. +func (e *HashAggRuntimeStats) Tp() int { + return execdetails.TpHashAggRuntimeStat +} + // StreamAggExec deals with all the aggregate functions. // It assumes all the input data is sorted by group by key. // When Next() is called, it will return a result for the same group. @@ -835,6 +1080,10 @@ type StreamAggExec struct { childResult *chunk.Chunk memTracker *memory.Tracker // track memory usage. + // memUsageOfInitialPartialResult indicates the memory usage of all partial results after initialization. + // All partial results will be reset after processing one group data, and the memory usage should also be reset. + // We can't get memory delta from ResetPartialResult, so record the memory usage here. + memUsageOfInitialPartialResult int64 } // Open implements the Executor Open interface. @@ -852,19 +1101,22 @@ func (e *StreamAggExec) Open(ctx context.Context) error { for _, aggFunc := range e.aggFuncs { partialResult, memDelta := aggFunc.AllocPartialResult() e.partialResults = append(e.partialResults, partialResult) - e.memTracker.Consume(memDelta) + e.memUsageOfInitialPartialResult += memDelta } // bytesLimit <= 0 means no limit, for now we just track the memory footprint e.memTracker = memory.NewTracker(e.id, -1) - e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) - e.memTracker.Consume(e.childResult.MemoryUsage()) + if e.ctx.GetSessionVars().TrackAggregateMemoryUsage { + e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) + } + failpoint.Inject("ConsumeRandomPanic", nil) + e.memTracker.Consume(e.childResult.MemoryUsage() + e.memUsageOfInitialPartialResult) return nil } // Close implements the Executor Close interface. func (e *StreamAggExec) Close() error { - e.memTracker.Consume(-e.childResult.MemoryUsage()) + e.memTracker.Consume(-e.childResult.MemoryUsage() - e.memUsageOfInitialPartialResult) e.childResult = nil e.groupChecker.reset() return e.baseExecutor.Close() @@ -935,13 +1187,16 @@ func (e *StreamAggExec) consumeGroupRows() error { return nil } + allMemDelta := int64(0) for i, aggFunc := range e.aggFuncs { memDelta, err := aggFunc.UpdatePartialResult(e.ctx, e.groupRows, e.partialResults[i]) if err != nil { return err } - e.memTracker.Consume(memDelta) + allMemDelta += memDelta } + failpoint.Inject("ConsumeRandomPanic", nil) + e.memTracker.Consume(allMemDelta) e.groupRows = e.groupRows[:0] return nil } @@ -955,6 +1210,7 @@ func (e *StreamAggExec) consumeCurGroupRowsAndFetchChild(ctx context.Context, ch mSize := e.childResult.MemoryUsage() err = Next(ctx, e.children[0], e.childResult) + failpoint.Inject("ConsumeRandomPanic", nil) e.memTracker.Consume(e.childResult.MemoryUsage() - mSize) if err != nil { return err @@ -986,6 +1242,9 @@ func (e *StreamAggExec) appendResult2Chunk(chk *chunk.Chunk) error { } aggFunc.ResetPartialResult(e.partialResults[i]) } + failpoint.Inject("ConsumeRandomPanic", nil) + // All partial results have been reset, so reset the memory usage. + e.memTracker.ReplaceBytesUsed(e.childResult.MemoryUsage() + e.memUsageOfInitialPartialResult) if len(e.aggFuncs) == 0 { chk.SetNumVirtualRows(chk.NumRows() + 1) } diff --git a/executor/aggregate_test.go b/executor/aggregate_test.go index f0ce5f11bc087..b9c4bf49bca91 100644 --- a/executor/aggregate_test.go +++ b/executor/aggregate_test.go @@ -14,12 +14,23 @@ package executor_test import ( + "context" "fmt" + "math" + "math/rand" + "sort" + "strconv" + "strings" + "time" . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/executor" plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -463,7 +474,7 @@ func (s *testSuiteAgg) TestAggregation(c *C) { tk.MustQuery("select std(b) from t1 group by a order by a;").Check(testkit.Rows("", "0", "0")) tk.MustQuery("select stddev(b) from t1 group by a order by a;").Check(testkit.Rows("", "0", "0")) - //For var_samp()/stddev_samp() + // For var_samp()/stddev_samp() tk.MustExec("drop table if exists t1;") tk.MustExec("CREATE TABLE t1 (id int(11),value1 float(10,2));") tk.MustExec("INSERT INTO t1 VALUES (1,0.00),(1,1.00), (1,2.00), (2,10.00), (2,11.00), (2,12.00), (2,13.00);") @@ -630,6 +641,23 @@ func (s *testSuiteAgg) TestGroupConcatAggr(c *C) { // issue #9920 tk.MustQuery("select group_concat(123, null)").Check(testkit.Rows("")) + + // issue #23129 + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(cid int, sname varchar(100));") + tk.MustExec("insert into t1 values(1, 'Bob'), (1, 'Alice');") + tk.MustExec("insert into t1 values(3, 'Ace');") + tk.MustExec("set @@group_concat_max_len=5;") + rows := tk.MustQuery("select group_concat(sname order by sname) from t1 group by cid;") + rows.Check(testkit.Rows("Alice", "Ace")) + + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c1 varchar(10));") + tk.MustExec("insert into t1 values('0123456789');") + tk.MustExec("insert into t1 values('12345');") + tk.MustExec("set @@group_concat_max_len=8;") + rows = tk.MustQuery("select group_concat(c1 order by c1) from t1 group by c1;") + rows.Check(testkit.Rows("01234567", "12345")) } func (s *testSuiteAgg) TestSelectDistinct(c *C) { @@ -770,10 +798,10 @@ func (s *testSuiteAgg) TestOnlyFullGroupBy(c *C) { c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue, Commentf("err %v", err)) // FixMe: test functional dependency of derived table - //tk.MustQuery("select * from (select * from t) as e group by a") - //tk.MustQuery("select * from (select * from t) as e group by b,d") - //err = tk.ExecToErr("select * from (select * from t) as e group by b,c") - //c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue) + // tk.MustQuery("select * from (select * from t) as e group by a") + // tk.MustQuery("select * from (select * from t) as e group by b,d") + // err = tk.ExecToErr("select * from (select * from t) as e group by b,c") + // c.Assert(terror.ErrorEqual(err, plannercore.ErrFieldNotInGroupBy), IsTrue) // test order by tk.MustQuery("select c from t group by c,d order by d") @@ -891,7 +919,7 @@ func (s *testSuiteAgg) TestAggEliminator(c *C) { func (s *testSuiteAgg) TestClusterIndexMaxMinEliminator(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("drop table if exists t;") - tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a int, b int, c int, primary key(a, b));") for i := 0; i < 10+1; i++ { tk.MustExec("insert into t values (?, ?, ?)", i, i, i) @@ -1142,3 +1170,206 @@ func (s *testSuiteAgg) TestIssue17216(c *C) { tk.MustExec(`INSERT INTO t1 VALUES (2084,0.02040000000000000000),(35324,0.02190000000000000000),(43760,0.00510000000000000000),(46084,0.01400000000000000000),(46312,0.00560000000000000000),(61632,0.02730000000000000000),(94676,0.00660000000000000000),(102244,0.01810000000000000000),(113144,0.02140000000000000000),(157024,0.02750000000000000000),(157144,0.01750000000000000000),(182076,0.02370000000000000000),(188696,0.02330000000000000000),(833,0.00390000000000000000),(6701,0.00230000000000000000),(8533,0.01690000000000000000),(13801,0.01360000000000000000),(20797,0.00680000000000000000),(36677,0.00550000000000000000),(46305,0.01290000000000000000),(76113,0.00430000000000000000),(76753,0.02400000000000000000),(92393,0.01720000000000000000),(111733,0.02690000000000000000),(152757,0.00250000000000000000),(162393,0.02760000000000000000),(167169,0.00440000000000000000),(168097,0.01360000000000000000),(180309,0.01720000000000000000),(19918,0.02620000000000000000),(58674,0.01820000000000000000),(67454,0.01510000000000000000),(70870,0.02880000000000000000),(89614,0.02530000000000000000),(106742,0.00180000000000000000),(107886,0.01580000000000000000),(147506,0.02230000000000000000),(148366,0.01340000000000000000),(167258,0.01860000000000000000),(194438,0.00500000000000000000),(10307,0.02850000000000000000),(14539,0.02210000000000000000),(27703,0.00050000000000000000),(32495,0.00680000000000000000),(39235,0.01450000000000000000),(52379,0.01640000000000000000),(54551,0.01910000000000000000),(85659,0.02330000000000000000),(104483,0.02670000000000000000),(109911,0.02040000000000000000),(114523,0.02110000000000000000),(119495,0.02120000000000000000),(137603,0.01910000000000000000),(154031,0.02580000000000000000);`) tk.MustQuery("SELECT count(distinct col1) FROM t1").Check(testkit.Rows("48")) } + +func (s *testSuiteAgg) TestHashAggRuntimeStat(c *C) { + partialInfo := &executor.AggWorkerInfo{ + Concurrency: 5, + WallTime: int64(time.Second * 20), + } + finalInfo := &executor.AggWorkerInfo{ + Concurrency: 8, + WallTime: int64(time.Second * 10), + } + stats := &executor.HashAggRuntimeStats{ + PartialConcurrency: 5, + PartialWallTime: int64(time.Second * 20), + FinalConcurrency: 8, + FinalWallTime: int64(time.Second * 10), + } + for i := 0; i < partialInfo.Concurrency; i++ { + stats.PartialStats = append(stats.PartialStats, &executor.AggWorkerStat{ + TaskNum: 5, + WaitTime: int64(2 * time.Second), + ExecTime: int64(1 * time.Second), + WorkerTime: int64(i) * int64(time.Second), + }) + } + for i := 0; i < finalInfo.Concurrency; i++ { + stats.FinalStats = append(stats.FinalStats, &executor.AggWorkerStat{ + TaskNum: 5, + WaitTime: int64(2 * time.Millisecond), + ExecTime: int64(1 * time.Millisecond), + WorkerTime: int64(i) * int64(time.Millisecond), + }) + } + expect := "partial_worker:{wall_time:20s, concurrency:5, task_num:25, tot_wait:10s, tot_exec:5s, tot_time:10s, max:4s, p95:4s}, final_worker:{wall_time:10s, concurrency:8, task_num:40, tot_wait:16ms, tot_exec:8ms, tot_time:28ms, max:7ms, p95:7ms}" + c.Assert(stats.String(), Equals, expect) + c.Assert(stats.String(), Equals, expect) + c.Assert(stats.Clone().String(), Equals, expect) + stats.Merge(stats.Clone()) + expect = "partial_worker:{wall_time:40s, concurrency:5, task_num:50, tot_wait:20s, tot_exec:10s, tot_time:20s, max:4s, p95:4s}, final_worker:{wall_time:20s, concurrency:8, task_num:80, tot_wait:32ms, tot_exec:16ms, tot_time:56ms, max:7ms, p95:7ms}" + c.Assert(stats.String(), Equals, expect) +} + +func reconstructParallelGroupConcatResult(rows [][]interface{}) []string { + data := make([]string, 0, len(rows)) + for _, row := range rows { + if str, ok := row[0].(string); ok { + tokens := strings.Split(str, ",") + sort.Slice(tokens, func(i, j int) bool { + return tokens[i] < tokens[j] + }) + data = append(data, strings.Join(tokens, ",")) + } + } + + sort.Slice(data, func(i, j int) bool { + return data[i] < data[j] + }) + + return data +} + +func (s *testSuiteAgg) TestParallelStreamAggGroupConcat(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE t(a bigint, b bigint);") + + for i := 0; i < 10000; i++ { + tk.MustExec("insert into t values(?, ?);", rand.Intn(100), rand.Intn(100)) + } + + sql := "select /*+ stream_agg() */ group_concat(a, b) from t group by b;" + concurrencies := []int{1, 2, 4, 8} + var expected []string + for _, con := range concurrencies { + tk.MustExec(fmt.Sprintf("set @@tidb_streamagg_concurrency=%d", con)) + if con == 1 { + expected = reconstructParallelGroupConcatResult(tk.MustQuery(sql).Rows()) + } else { + er := tk.MustQuery("explain format = 'brief' " + sql).Rows() + ok := false + for _, l := range er { + str := fmt.Sprintf("%v", l) + if strings.Contains(str, "Shuffle") { + ok = true + break + } + } + c.Assert(ok, Equals, true) + obtained := reconstructParallelGroupConcatResult(tk.MustQuery(sql).Rows()) + c.Assert(len(obtained), Equals, len(expected)) + for i := 0; i < len(obtained); i++ { + c.Assert(obtained[i], Equals, expected[i]) + } + } + } +} + +func (s *testSuiteAgg) TestIssue20658(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test;") + + aggFuncs := []string{"count(a)", "sum(a)", "avg(a)", "max(a)", "min(a)", "bit_or(a)", "bit_xor(a)", "bit_and(a)", "var_pop(a)", "var_samp(a)", "stddev_pop(a)", "stddev_samp(a)", "approx_count_distinct(a)", "approx_percentile(a, 7)"} + sqlFormat := "select /*+ stream_agg() */ %s from t group by b;" + + sqls := make([]string, 0, len(aggFuncs)) + for _, af := range aggFuncs { + sql := fmt.Sprintf(sqlFormat, af) + sqls = append(sqls, sql) + } + + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE t(a bigint, b bigint);") + for i := 0; i < 10000; i++ { + tk.MustExec("insert into t values (?, ?);", rand.Intn(100), rand.Intn(100)) + } + + concurrencies := []int{1, 2, 4, 8} + for _, sql := range sqls { + var expected [][]interface{} + for _, con := range concurrencies { + tk.MustExec(fmt.Sprintf("set @@tidb_streamagg_concurrency=%d;", con)) + if con == 1 { + expected = tk.MustQuery(sql).Sort().Rows() + } else { + er := tk.MustQuery("explain format = 'brief' " + sql).Rows() + ok := false + for _, l := range er { + str := fmt.Sprintf("%v", l) + if strings.Contains(str, "Shuffle") { + ok = true + break + } + } + c.Assert(ok, Equals, true) + rows := tk.MustQuery(sql).Sort().Rows() + + c.Assert(len(rows), Equals, len(expected)) + for i := range rows { + v1, err := strconv.ParseFloat(rows[i][0].(string), 64) + c.Assert(err, IsNil) + v2, err := strconv.ParseFloat(expected[i][0].(string), 64) + c.Assert(err, IsNil) + c.Assert(math.Abs(v1-v2), Less, 1e-3) + } + } + } + } +} + +func (s *testSerialSuite) TestRandomPanicAggConsume(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set @@tidb_max_chunk_size=32") + tk.MustExec("set @@tidb_init_chunk_size=1") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + for i := 0; i <= 1000; i++ { + tk.MustExec(fmt.Sprintf("insert into t values(%v),(%v),(%v)", i, i, i)) + } + + fpName := "github.com/pingcap/tidb/executor/ConsumeRandomPanic" + c.Assert(failpoint.Enable(fpName, "5%panic(\"ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]\")"), IsNil) + defer func() { + c.Assert(failpoint.Disable(fpName), IsNil) + }() + + // Test 10 times panic for each AggExec. + var res sqlexec.RecordSet + for i := 1; i <= 10; i++ { + var err error + for err == nil { + // Test paralleled hash agg. + res, err = tk.Exec("select /*+ HASH_AGG() */ count(a) from t group by a") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Se, res) + c.Assert(res.Close(), IsNil) + } + } + c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + + err = nil + for err == nil { + // Test unparalleled hash agg. + res, err = tk.Exec("select /*+ HASH_AGG() */ count(distinct a) from t") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Se, res) + c.Assert(res.Close(), IsNil) + } + } + c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + + err = nil + for err == nil { + // Test stream agg. + res, err = tk.Exec("select /*+ STREAM_AGG() */ count(a) from t") + if err == nil { + _, err = session.GetRows4Test(context.Background(), tk.Se, res) + c.Assert(res.Close(), IsNil) + } + } + c.Assert(err.Error(), Equals, "failpoint panic: ERROR 1105 (HY000): Out Of Memory Quota![conn_id=1]") + } +} diff --git a/executor/analyze.go b/executor/analyze.go old mode 100755 new mode 100644 index a3aab93b09de3..923e8e12b27a6 --- a/executor/analyze.go +++ b/executor/analyze.go @@ -16,12 +16,12 @@ package executor import ( "bytes" "context" - "fmt" "math" "math/rand" "runtime" "sort" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/tikv" @@ -62,6 +63,7 @@ type AnalyzeExec struct { baseExecutor tasks []*analyzeTask wg *sync.WaitGroup + opts map[ast.AnalyzeOptionType]uint64 } var ( @@ -96,6 +98,26 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { close(taskCh) statsHandle := domain.GetDomain(e.ctx).StatsHandle() panicCnt := 0 + + pruneMode := variable.PartitionPruneMode(e.ctx.GetSessionVars().PartitionPruneMode.Load()) + // needGlobalStats used to indicate whether we should merge the partition-level stats to global-level stats. + needGlobalStats := pruneMode == variable.Dynamic + type globalStatsKey struct { + tableID int64 + indexID int64 + } + type globalStatsInfo struct { + isIndex int + // When the `isIndex == 0`, the idxID will be the column ID. + // Otherwise, the idxID will be the index ID. + idxID int64 + statsVersion int + } + // globalStatsMap is a map used to store which partition tables and the corresponding indexes need global-level stats. + // The meaning of key in map is the structure that used to store the tableID and indexID. + // The meaning of value in map is some additional information needed to build global-level stats. + globalStatsMap := make(map[globalStatsKey]globalStatsInfo) + for panicCnt < concurrency { result, ok := <-resultCh if !ok { @@ -111,8 +133,20 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { result.job.Finish(true) continue } + statisticsID := result.TableID.GetStatisticsID() for i, hg := range result.Hist { - err1 := statsHandle.SaveStatsToStorage(result.TableID.PersistID, result.Count, result.IsIndex, hg, result.Cms[i], 1) + if result.TableID.IsPartitionTable() && needGlobalStats { + // If it does not belong to the statistics of index, we need to set it to -1 to distinguish. + idxID := int64(-1) + if result.IsIndex != 0 { + idxID = hg.ID + } + globalStatsID := globalStatsKey{result.TableID.TableID, idxID} + if _, ok := globalStatsMap[globalStatsID]; !ok { + globalStatsMap[globalStatsID] = globalStatsInfo{result.IsIndex, hg.ID, result.StatsVer} + } + } + err1 := statsHandle.SaveStatsToStorage(statisticsID, result.Count, result.IsIndex, hg, result.Cms[i], result.TopNs[i], result.Fms[i], result.StatsVer, 1) if err1 != nil { err = err1 logutil.Logger(ctx).Error("save stats to storage failed", zap.Error(err)) @@ -120,7 +154,7 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { continue } } - if err1 := statsHandle.SaveExtendedStatsToStorage(result.TableID.PersistID, result.ExtStats, false); err1 != nil { + if err1 := statsHandle.SaveExtendedStatsToStorage(statisticsID, result.ExtStats, false); err1 != nil { err = err1 logutil.Logger(ctx).Error("save extended stats to storage failed", zap.Error(err)) result.job.Finish(true) @@ -134,6 +168,26 @@ func (e *AnalyzeExec) Next(ctx context.Context, req *chunk.Chunk) error { if err != nil { return err } + if needGlobalStats { + for globalStatsID, info := range globalStatsMap { + globalStats, err := statsHandle.MergePartitionStats2GlobalStats(e.ctx, e.opts, infoschema.GetInfoSchema(e.ctx), globalStatsID.tableID, info.isIndex, info.idxID) + if err != nil { + if types.ErrPartitionStatsMissing.Equal(err) { + // When we find some partition-level stats are missing, we need to report warning. + e.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + continue + } + return err + } + for i := 0; i < globalStats.Num; i++ { + hg, cms, topN, fms := globalStats.Hg[i], globalStats.Cms[i], globalStats.TopN[i], globalStats.Fms[i] + err = statsHandle.SaveStatsToStorage(globalStatsID.tableID, globalStats.Count, info.isIndex, hg, cms, topN, fms, info.statsVersion, 1) + if err != nil { + logutil.Logger(ctx).Error("save global-level stats to storage failed", zap.Error(err)) + } + } + } + } return statsHandle.Update(infoschema.GetInfoSchema(e.ctx)) } @@ -199,7 +253,9 @@ func (e *AnalyzeExec) analyzeWorker(taskCh <-chan *analyzeTask, resultCh chan<- switch task.taskType { case colTask: task.colExec.job = task.job - resultCh <- analyzeColumnsPushdown(task.colExec) + for _, result := range analyzeColumnsPushdown(task.colExec) { + resultCh <- result + } case idxTask: task.idxExec.job = task.job resultCh <- analyzeIndexPushdown(task.idxExec) @@ -229,21 +285,31 @@ func analyzeIndexPushdown(idxExec *AnalyzeIndexExec) analyzeResult { if len(idxExec.idxInfo.Columns) == 1 { ranges = ranger.FullNotNullRange() } - hist, cms, err := idxExec.buildStats(ranges, true) + hist, cms, topN, err := idxExec.buildStats(ranges, true) if err != nil { return analyzeResult{Err: err, job: idxExec.job} } + var statsVer = statistics.Version1 + if idxExec.analyzePB.IdxReq.Version != nil { + statsVer = int(*idxExec.analyzePB.IdxReq.Version) + } result := analyzeResult{ - TableID: idxExec.tableID, - Hist: []*statistics.Histogram{hist}, - Cms: []*statistics.CMSketch{cms}, - IsIndex: 1, - job: idxExec.job, + TableID: idxExec.tableID, + Hist: []*statistics.Histogram{hist}, + Cms: []*statistics.CMSketch{cms}, + TopNs: []*statistics.TopN{topN}, + Fms: []*statistics.FMSketch{nil}, + IsIndex: 1, + job: idxExec.job, + StatsVer: statsVer, } result.Count = hist.NullCount if hist.Len() > 0 { result.Count += hist.Buckets[hist.Len()-1].Count } + if topN.TotalCount() > 0 { + result.Count += int64(topN.TotalCount()) + } return result } @@ -269,9 +335,9 @@ func (e *AnalyzeIndexExec) fetchAnalyzeResult(ranges []*ranger.Range, isNullRang var builder distsql.RequestBuilder var kvReqBuilder *distsql.RequestBuilder if e.isCommonHandle && e.idxInfo.Primary { - kvReqBuilder = builder.SetCommonHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, ranges) + kvReqBuilder = builder.SetHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.tableID.GetStatisticsID()}, true, ranges, nil) } else { - kvReqBuilder = builder.SetIndexRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, e.idxInfo.ID, ranges) + kvReqBuilder = builder.SetIndexRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.tableID.GetStatisticsID()}, e.idxInfo.ID, ranges) } kvReq, err := kvReqBuilder. SetAnalyzeRequest(e.analyzePB). @@ -311,21 +377,68 @@ func (e *AnalyzeIndexExec) open(ranges []*ranger.Range, considerNull bool) error return nil } -func (e *AnalyzeIndexExec) buildStatsFromResult(result distsql.SelectResult, needCMS bool) (*statistics.Histogram, *statistics.CMSketch, error) { +func updateIndexResult( + ctx *stmtctx.StatementContext, + resp *tipb.AnalyzeIndexResp, + job *statistics.AnalyzeJob, + hist *statistics.Histogram, + cms *statistics.CMSketch, + topn *statistics.TopN, + idxInfo *model.IndexInfo, + numBuckets int, + numTopN int, + statsVer int, +) ( + *statistics.Histogram, + *statistics.CMSketch, + *statistics.TopN, + error, +) { + var err error + needCMS := cms != nil + respHist := statistics.HistogramFromProto(resp.Hist) + if job != nil { + job.Update(int64(respHist.TotalRowCount())) + } + hist, err = statistics.MergeHistograms(ctx, hist, respHist, numBuckets, statsVer) + if err != nil { + return nil, nil, nil, err + } + if needCMS { + if resp.Cms == nil { + logutil.Logger(context.TODO()).Warn("nil CMS in response", zap.String("table", idxInfo.Table.O), zap.String("index", idxInfo.Name.O)) + } else { + cm, tmpTopN := statistics.CMSketchAndTopNFromProto(resp.Cms) + if err := cms.MergeCMSketch(cm); err != nil { + return nil, nil, nil, err + } + statistics.MergeTopNAndUpdateCMSketch(topn, tmpTopN, cms, uint32(numTopN)) + } + } + return hist, cms, topn, nil +} + +func (e *AnalyzeIndexExec) buildStatsFromResult(result distsql.SelectResult, needCMS bool) (*statistics.Histogram, *statistics.CMSketch, *statistics.TopN, error) { failpoint.Inject("buildStatsFromResult", func(val failpoint.Value) { if val.(bool) { - failpoint.Return(nil, nil, errors.New("mock buildStatsFromResult error")) + failpoint.Return(nil, nil, nil, errors.New("mock buildStatsFromResult error")) } }) hist := &statistics.Histogram{} var cms *statistics.CMSketch + var topn *statistics.TopN if needCMS { cms = statistics.NewCMSketch(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth])) + topn = statistics.NewTopN(int(e.opts[ast.AnalyzeOptNumTopN])) + } + statsVer := statistics.Version1 + if e.analyzePB.IdxReq.Version != nil { + statsVer = int(*e.analyzePB.IdxReq.Version) } for { data, err := result.NextRaw(context.TODO()) if err != nil { - return nil, nil, err + return nil, nil, nil, err } if data == nil { break @@ -333,32 +446,26 @@ func (e *AnalyzeIndexExec) buildStatsFromResult(result distsql.SelectResult, nee resp := &tipb.AnalyzeIndexResp{} err = resp.Unmarshal(data) if err != nil { - return nil, nil, err + return nil, nil, nil, err } - respHist := statistics.HistogramFromProto(resp.Hist) - e.job.Update(int64(respHist.TotalRowCount())) - hist, err = statistics.MergeHistograms(e.ctx.GetSessionVars().StmtCtx, hist, respHist, int(e.opts[ast.AnalyzeOptNumBuckets])) + hist, cms, topn, err = updateIndexResult(e.ctx.GetSessionVars().StmtCtx, resp, e.job, hist, cms, topn, + e.idxInfo, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), statsVer) if err != nil { - return nil, nil, err - } - if needCMS { - if resp.Cms == nil { - logutil.Logger(context.TODO()).Warn("nil CMS in response", zap.String("table", e.idxInfo.Table.O), zap.String("index", e.idxInfo.Name.O)) - } else if err := cms.MergeCMSketch(statistics.CMSketchFromProto(resp.Cms), 0); err != nil { - return nil, nil, err - } + return nil, nil, nil, err } } - err := hist.ExtractTopN(cms, len(e.idxInfo.Columns), uint32(e.opts[ast.AnalyzeOptNumTopN])) + if needCMS && topn.TotalCount() > 0 { + hist.RemoveIdxVals(topn.TopN) + } if needCMS && cms != nil { cms.CalcDefaultValForAnalyze(uint64(hist.NDV)) } - return hist, cms, err + return hist, cms, topn, nil } -func (e *AnalyzeIndexExec) buildStats(ranges []*ranger.Range, considerNull bool) (hist *statistics.Histogram, cms *statistics.CMSketch, err error) { +func (e *AnalyzeIndexExec) buildStats(ranges []*ranger.Range, considerNull bool) (hist *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, err error) { if err = e.open(ranges, considerNull); err != nil { - return nil, nil, err + return nil, nil, nil, err } defer func() { err1 := closeAll(e.result, e.countNullRes) @@ -366,24 +473,24 @@ func (e *AnalyzeIndexExec) buildStats(ranges []*ranger.Range, considerNull bool) err = err1 } }() - hist, cms, err = e.buildStatsFromResult(e.result, true) + hist, cms, topN, err = e.buildStatsFromResult(e.result, true) if err != nil { - return nil, nil, err + return nil, nil, nil, err } if e.countNullRes != nil { - nullHist, _, err := e.buildStatsFromResult(e.countNullRes, false) + nullHist, _, _, err := e.buildStatsFromResult(e.countNullRes, false) if err != nil { - return nil, nil, err + return nil, nil, nil, err } if l := nullHist.Len(); l > 0 { hist.NullCount = nullHist.Buckets[l-1].Count } } hist.ID = e.idxInfo.ID - return hist, cms, nil + return hist, cms, topN, nil } -func analyzeColumnsPushdown(colExec *AnalyzeColumnsExec) analyzeResult { +func analyzeColumnsPushdown(colExec *AnalyzeColumnsExec) []analyzeResult { var ranges []*ranger.Range if hc := colExec.handleCols; hc != nil { if hc.IsInt() { @@ -394,23 +501,68 @@ func analyzeColumnsPushdown(colExec *AnalyzeColumnsExec) analyzeResult { } else { ranges = ranger.FullIntRange(false) } - hists, cms, extStats, err := colExec.buildStats(ranges, true) + collExtStats := colExec.ctx.GetSessionVars().EnableExtendedStats + hists, cms, topNs, fms, extStats, err := colExec.buildStats(ranges, collExtStats) if err != nil { - return analyzeResult{Err: err, job: colExec.job} + return []analyzeResult{{Err: err, job: colExec.job}} + } + + if hasPkHist(colExec.handleCols) { + PKresult := analyzeResult{ + TableID: colExec.tableID, + Hist: hists[:1], + Cms: cms[:1], + TopNs: topNs[:1], + Fms: fms[:1], + ExtStats: nil, + job: nil, + StatsVer: statistics.Version1, + } + PKresult.Count = int64(PKresult.Hist[0].TotalRowCount()) + restResult := analyzeResult{ + TableID: colExec.tableID, + Hist: hists[1:], + Cms: cms[1:], + TopNs: topNs[1:], + Fms: fms[1:], + ExtStats: extStats, + job: colExec.job, + StatsVer: colExec.analyzeVer, + } + restResult.Count = PKresult.Count + return []analyzeResult{PKresult, restResult} + } + var result []analyzeResult + if colExec.analyzePB.Tp == tipb.AnalyzeType_TypeMixed { + result = append(result, analyzeResult{ + TableID: colExec.tableID, + Hist: []*statistics.Histogram{hists[0]}, + Cms: []*statistics.CMSketch{cms[0]}, + TopNs: []*statistics.TopN{topNs[0]}, + Fms: []*statistics.FMSketch{nil}, + IsIndex: 1, + job: colExec.job, + StatsVer: colExec.analyzeVer, + }) + hists = hists[1:] + cms = cms[1:] + topNs = topNs[1:] } - result := analyzeResult{ + colResult := analyzeResult{ TableID: colExec.tableID, Hist: hists, Cms: cms, + TopNs: topNs, + Fms: fms, ExtStats: extStats, job: colExec.job, + StatsVer: colExec.analyzeVer, } - hist := hists[0] - result.Count = hist.NullCount - if hist.Len() > 0 { - result.Count += hist.Buckets[hist.Len()-1].Count + colResult.Count = int64(colResult.Hist[0].TotalRowCount()) + if colResult.StatsVer == statistics.Version2 { + colResult.Count += int64(topNs[0].TotalCount()) } - return result + return append(result, colResult) } // AnalyzeColumnsExec represents Analyze columns push down executor. @@ -422,14 +574,16 @@ type AnalyzeColumnsExec struct { concurrency int priority int analyzePB *tipb.AnalyzeReq + commonHandle *model.IndexInfo resultHandler *tableResultHandler opts map[ast.AnalyzeOptionType]uint64 job *statistics.AnalyzeJob + analyzeVer int } func (e *AnalyzeColumnsExec) open(ranges []*ranger.Range) error { e.resultHandler = &tableResultHandler{} - firstPartRanges, secondPartRanges := splitRanges(ranges, true, false) + firstPartRanges, secondPartRanges := distsql.SplitRangesBySign(ranges, true, false, !hasPkHist(e.handleCols)) firstResult, err := e.buildResp(firstPartRanges) if err != nil { return err @@ -450,12 +604,7 @@ func (e *AnalyzeColumnsExec) open(ranges []*ranger.Range) error { func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectResult, error) { var builder distsql.RequestBuilder - var reqBuilder *distsql.RequestBuilder - if e.handleCols != nil && !e.handleCols.IsInt() { - reqBuilder = builder.SetCommonHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, e.tableID.CollectIDs, ranges) - } else { - reqBuilder = builder.SetTableRangesForTables(e.tableID.CollectIDs, ranges, nil) - } + reqBuilder := builder.SetHandleRangesForTables(e.ctx.GetSessionVars().StmtCtx, []int64{e.tableID.GetStatisticsID()}, e.handleCols != nil && !e.handleCols.IsInt(), ranges, nil) // Always set KeepOrder of the request to be true, in order to compute // correct `correlation` of columns. kvReq, err := reqBuilder. @@ -476,9 +625,9 @@ func (e *AnalyzeColumnsExec) buildResp(ranges []*ranger.Range) (distsql.SelectRe return result, nil } -func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats bool) (hists []*statistics.Histogram, cms []*statistics.CMSketch, extStats *statistics.ExtendedStatsColl, err error) { +func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats bool) (hists []*statistics.Histogram, cms []*statistics.CMSketch, topNs []*statistics.TopN, fms []*statistics.FMSketch, extStats *statistics.ExtendedStatsColl, err error) { if err = e.open(ranges); err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } defer func() { if err1 := e.resultHandler.Close(); err1 != nil { @@ -488,6 +637,18 @@ func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats boo err = err1 } }() + var handleHist *statistics.Histogram + var handleCms *statistics.CMSketch + var handleTopn *statistics.TopN + statsVer := statistics.Version1 + if e.analyzePB.Tp == tipb.AnalyzeType_TypeMixed { + handleHist = &statistics.Histogram{} + handleCms = statistics.NewCMSketch(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth])) + handleTopn = statistics.NewTopN(int(e.opts[ast.AnalyzeOptNumTopN])) + if e.analyzePB.IdxReq.Version != nil { + statsVer = int(*e.analyzePB.IdxReq.Version) + } + } pkHist := &statistics.Histogram{} collectors := make([]*statistics.SampleCollector, len(e.colsInfo)) for i := range collectors { @@ -501,27 +662,41 @@ func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats boo for { data, err1 := e.resultHandler.nextRaw(context.TODO()) if err1 != nil { - return nil, nil, nil, err1 + return nil, nil, nil, nil, nil, err1 } if data == nil { break } - resp := &tipb.AnalyzeColumnsResp{} - err = resp.Unmarshal(data) - if err != nil { - return nil, nil, nil, err - } sc := e.ctx.GetSessionVars().StmtCtx + var colResp *tipb.AnalyzeColumnsResp + if e.analyzePB.Tp == tipb.AnalyzeType_TypeMixed { + resp := &tipb.AnalyzeMixedResp{} + err = resp.Unmarshal(data) + if err != nil { + return nil, nil, nil, nil, nil, err + } + colResp = resp.ColumnsResp + handleHist, handleCms, handleTopn, err = updateIndexResult(sc, resp.IndexResp, nil, handleHist, + handleCms, handleTopn, e.commonHandle, int(e.opts[ast.AnalyzeOptNumBuckets]), + int(e.opts[ast.AnalyzeOptNumTopN]), statsVer) + + if err != nil { + return nil, nil, nil, nil, nil, err + } + } else { + colResp = &tipb.AnalyzeColumnsResp{} + err = colResp.Unmarshal(data) + } rowCount := int64(0) if hasPkHist(e.handleCols) { - respHist := statistics.HistogramFromProto(resp.PkHist) + respHist := statistics.HistogramFromProto(colResp.PkHist) rowCount = int64(respHist.TotalRowCount()) - pkHist, err = statistics.MergeHistograms(sc, pkHist, respHist, int(e.opts[ast.AnalyzeOptNumBuckets])) + pkHist, err = statistics.MergeHistograms(sc, pkHist, respHist, int(e.opts[ast.AnalyzeOptNumBuckets]), statistics.Version1) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } } - for i, rc := range resp.Collectors { + for i, rc := range colResp.Collectors { respSample := statistics.SampleCollectorFromProto(rc) rowCount = respSample.Count + respSample.NullCount collectors[i].MergeSampleCollector(sc, respSample) @@ -534,39 +709,71 @@ func (e *AnalyzeColumnsExec) buildStats(ranges []*ranger.Range, needExtStats boo pkHist.ID = pkInfo.ID err = pkHist.DecodeTo(pkInfo.RetType, timeZone) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } hists = append(hists, pkHist) cms = append(cms, nil) + topNs = append(topNs, nil) + fms = append(fms, nil) } for i, col := range e.colsInfo { - err := collectors[i].ExtractTopN(uint32(e.opts[ast.AnalyzeOptNumTopN]), e.ctx.GetSessionVars().StmtCtx, &col.FieldType, timeZone) - if err != nil { - return nil, nil, nil, err + if e.analyzeVer < 2 { + // In analyze version 2, we don't collect TopN this way. We will collect TopN from samples in `BuildColumnHistAndTopN()` below. + err := collectors[i].ExtractTopN(uint32(e.opts[ast.AnalyzeOptNumTopN]), e.ctx.GetSessionVars().StmtCtx, &col.FieldType, timeZone) + if err != nil { + return nil, nil, nil, nil, nil, err + } + topNs = append(topNs, collectors[i].TopN) } for j, s := range collectors[i].Samples { collectors[i].Samples[j].Ordinal = j collectors[i].Samples[j].Value, err = tablecodec.DecodeColumnValue(s.Value.GetBytes(), &col.FieldType, timeZone) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err + } + // When collation is enabled, we store the Key representation of the sampling data. So we set it to kind `Bytes` here + // to avoid to convert it to its Key representation once more. + if collectors[i].Samples[j].Value.Kind() == types.KindString { + collectors[i].Samples[j].Value.SetBytes(collectors[i].Samples[j].Value.GetBytes()) } } - hg, err := statistics.BuildColumn(e.ctx, int64(e.opts[ast.AnalyzeOptNumBuckets]), col.ID, collectors[i], &col.FieldType) + var hg *statistics.Histogram + var err error + var topn *statistics.TopN + if e.analyzeVer < 2 { + hg, err = statistics.BuildColumn(e.ctx, int64(e.opts[ast.AnalyzeOptNumBuckets]), col.ID, collectors[i], &col.FieldType) + } else { + hg, topn, err = statistics.BuildColumnHistAndTopN(e.ctx, int(e.opts[ast.AnalyzeOptNumBuckets]), int(e.opts[ast.AnalyzeOptNumTopN]), col.ID, collectors[i], &col.FieldType) + topNs = append(topNs, topn) + } if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } hists = append(hists, hg) collectors[i].CMSketch.CalcDefaultValForAnalyze(uint64(hg.NDV)) cms = append(cms, collectors[i].CMSketch) + fms = append(fms, collectors[i].FMSketch) } if needExtStats { statsHandle := domain.GetDomain(e.ctx).StatsHandle() - extStats, err = statsHandle.BuildExtendedStats(e.tableID.PersistID, e.colsInfo, collectors) + extStats, err = statsHandle.BuildExtendedStats(e.tableID.GetStatisticsID(), e.colsInfo, collectors) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } } - return hists, cms, extStats, nil + if handleHist != nil { + handleHist.ID = e.commonHandle.ID + if handleTopn != nil && handleTopn.TotalCount() > 0 { + handleHist.RemoveIdxVals(handleTopn.TopN) + } + if handleCms != nil { + handleCms.CalcDefaultValForAnalyze(uint64(handleHist.NDV)) + } + hists = append([]*statistics.Histogram{handleHist}, hists...) + cms = append([]*statistics.CMSketch{handleCms}, cms...) + topNs = append([]*statistics.TopN{handleTopn}, topNs...) + } + return hists, cms, topNs, fms, extStats, nil } func hasPkHist(handleCols core.HandleCols) bool { @@ -587,7 +794,7 @@ var ( ) func analyzeFastExec(exec *AnalyzeFastExec) []analyzeResult { - hists, cms, err := exec.buildStats() + hists, cms, topNs, fms, err := exec.buildStats() if err != nil { return []analyzeResult{{Err: err, job: exec.job}} } @@ -596,12 +803,15 @@ func analyzeFastExec(exec *AnalyzeFastExec) []analyzeResult { if len(exec.idxsInfo) > 0 { for i := pkColCount + len(exec.colsInfo); i < len(hists); i++ { idxResult := analyzeResult{ - TableID: exec.tableID, - Hist: []*statistics.Histogram{hists[i]}, - Cms: []*statistics.CMSketch{cms[i]}, - IsIndex: 1, - Count: hists[i].NullCount, - job: exec.job, + TableID: exec.tableID, + Hist: []*statistics.Histogram{hists[i]}, + Cms: []*statistics.CMSketch{cms[i]}, + TopNs: []*statistics.TopN{topNs[i]}, + Fms: []*statistics.FMSketch{nil}, + IsIndex: 1, + Count: hists[i].NullCount, + job: exec.job, + StatsVer: statistics.Version1, } if hists[i].Len() > 0 { idxResult.Count += hists[i].Buckets[hists[i].Len()-1].Count @@ -614,11 +824,14 @@ func analyzeFastExec(exec *AnalyzeFastExec) []analyzeResult { } hist := hists[0] colResult := analyzeResult{ - TableID: exec.tableID, - Hist: hists[:pkColCount+len(exec.colsInfo)], - Cms: cms[:pkColCount+len(exec.colsInfo)], - Count: hist.NullCount, - job: exec.job, + TableID: exec.tableID, + Hist: hists[:pkColCount+len(exec.colsInfo)], + Cms: cms[:pkColCount+len(exec.colsInfo)], + TopNs: topNs[:pkColCount+len(exec.colsInfo)], + Fms: fms[:pkColCount+len(exec.colsInfo)], + Count: hist.NullCount, + job: exec.job, + StatsVer: statistics.Version1, } if hist.Len() > 0 { colResult.Count += hist.Buckets[hist.Len()-1].Count @@ -653,16 +866,21 @@ type AnalyzeFastExec struct { } func (e *AnalyzeFastExec) calculateEstimateSampleStep() (err error) { - sql := fmt.Sprintf("select flag from mysql.stats_histograms where table_id = %d;", e.tableID.PersistID) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + var stmt ast.StmtNode + stmt, err = exec.ParseWithParams(context.TODO(), "select flag from mysql.stats_histograms where table_id = %?", e.tableID.GetStatisticsID()) + if err != nil { + return + } var rows []chunk.Row - rows, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + rows, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return } var historyRowCount uint64 hasBeenAnalyzed := len(rows) != 0 && rows[0].GetInt64(0) == statistics.AnalyzeFlag if hasBeenAnalyzed { - historyRowCount = uint64(domain.GetDomain(e.ctx).StatsHandle().GetPartitionStats(e.tblInfo, e.tableID.PersistID).Count) + historyRowCount = uint64(domain.GetDomain(e.ctx).StatsHandle().GetPartitionStats(e.tblInfo, e.tableID.GetStatisticsID()).Count) } else { dbInfo, ok := domain.GetDomain(e.ctx).InfoSchema().SchemaByTable(e.tblInfo) if !ok { @@ -679,35 +897,29 @@ func (e *AnalyzeFastExec) calculateEstimateSampleStep() (err error) { err = rollbackFn() } }() - var partition string - if e.tableID.StoreAsCollectID() && e.tblInfo.ID != e.tableID.PersistID { + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "select count(*) from %n.%n", dbInfo.Name.L, e.tblInfo.Name.L) + + if e.tblInfo.ID != e.tableID.GetStatisticsID() { for _, definition := range e.tblInfo.Partition.Definitions { - if definition.ID == e.tableID.PersistID { - partition = fmt.Sprintf(" partition(%s)", definition.Name.L) + if definition.ID == e.tableID.GetStatisticsID() { + sqlexec.MustFormatSQL(sql, " partition(%n)", definition.Name.L) break } } } - sql := fmt.Sprintf("select count(*) from %s.%s", dbInfo.Name.L, e.tblInfo.Name.L) - if len(partition) > 0 { - sql += partition - } - var recordSets []sqlexec.RecordSet - recordSets, err = e.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) + var rs sqlexec.RecordSet + rs, err = e.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql.String()) if err != nil { return } - if len(recordSets) == 0 { + if rs == nil { err = errors.Trace(errors.Errorf("empty record set")) return } - defer func() { - for _, r := range recordSets { - terror.Call(r.Close) - } - }() - chk := recordSets[0].NewChunk() - err = recordSets[0].Next(context.TODO(), chk) + defer terror.Call(rs.Close) + chk := rs.NewChunk() + err = rs.Next(context.TODO(), chk) if err != nil { return } @@ -738,7 +950,7 @@ func (e *AnalyzeFastExec) activateTxnForRowCount() (rollbackFn func() error, err txn.SetOption(kv.Priority, kv.PriorityLow) txn.SetOption(kv.IsolationLevel, kv.RC) txn.SetOption(kv.NotFillCache, true) - return nil, nil + return rollbackFn, nil } // buildSampTask build sample tasks. @@ -747,37 +959,36 @@ func (e *AnalyzeFastExec) buildSampTask() (err error) { store, _ := e.ctx.GetStore().(tikv.Storage) e.cache = store.GetRegionCache() accessRegionsCounter := 0 - for _, pid := range e.tableID.CollectIDs { - startKey, endKey := tablecodec.GetTableHandleKeyRange(pid) - targetKey := startKey - for { - // Search for the region which contains the targetKey. - loc, err := e.cache.LocateKey(bo, targetKey) - if err != nil { - return err - } - if bytes.Compare(endKey, loc.StartKey) < 0 { - break - } - accessRegionsCounter++ + pid := e.tableID.GetStatisticsID() + startKey, endKey := tablecodec.GetTableHandleKeyRange(pid) + targetKey := startKey + for { + // Search for the region which contains the targetKey. + loc, err := e.cache.LocateKey(bo, targetKey) + if err != nil { + return err + } + if bytes.Compare(endKey, loc.StartKey) < 0 { + break + } + accessRegionsCounter++ - // Set the next search key. - targetKey = loc.EndKey + // Set the next search key. + targetKey = loc.EndKey - // If the KV pairs in the region all belonging to the table, add it to the sample task. - if bytes.Compare(startKey, loc.StartKey) <= 0 && len(loc.EndKey) != 0 && bytes.Compare(loc.EndKey, endKey) <= 0 { - e.sampTasks = append(e.sampTasks, loc) - continue - } + // If the KV pairs in the region all belonging to the table, add it to the sample task. + if bytes.Compare(startKey, loc.StartKey) <= 0 && len(loc.EndKey) != 0 && bytes.Compare(loc.EndKey, endKey) <= 0 { + e.sampTasks = append(e.sampTasks, loc) + continue + } - e.scanTasks = append(e.scanTasks, loc) - if bytes.Compare(loc.StartKey, startKey) < 0 { - loc.StartKey = startKey - } - if bytes.Compare(endKey, loc.EndKey) < 0 || len(loc.EndKey) == 0 { - loc.EndKey = endKey - break - } + e.scanTasks = append(e.scanTasks, loc) + if bytes.Compare(loc.StartKey, startKey) < 0 { + loc.StartKey = startKey + } + if bytes.Compare(endKey, loc.EndKey) < 0 || len(loc.EndKey) == 0 { + loc.EndKey = endKey + break } } fastAnalyzeHistogramAccessRegions.Observe(float64(accessRegionsCounter)) @@ -935,10 +1146,7 @@ func (e *AnalyzeFastExec) handleScanIter(iter kv.Iterator) (scanKeysSize int, er } func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err error) { - snapshot, err := e.ctx.GetStore().(tikv.Storage).GetSnapshot(kv.MaxVersion) - if err != nil { - return 0, err - } + snapshot := e.ctx.GetStore().GetSnapshot(kv.MaxVersion) if e.ctx.GetSessionVars().GetReplicaRead().IsFollowerRead() { snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } @@ -958,11 +1166,7 @@ func (e *AnalyzeFastExec) handleScanTasks(bo *tikv.Backoffer) (keysSize int, err func (e *AnalyzeFastExec) handleSampTasks(workID int, step uint32, err *error) { defer e.wg.Done() - var snapshot kv.Snapshot - snapshot, *err = e.ctx.GetStore().(tikv.Storage).GetSnapshot(kv.MaxVersion) - if *err != nil { - return - } + snapshot := e.ctx.GetStore().GetSnapshot(kv.MaxVersion) snapshot.SetOption(kv.NotFillCache, true) snapshot.SetOption(kv.IsolationLevel, kv.RC) snapshot.SetOption(kv.Priority, kv.PriorityLow) @@ -1001,28 +1205,34 @@ func (e *AnalyzeFastExec) handleSampTasks(workID int, step uint32, err *error) { } } -func (e *AnalyzeFastExec) buildColumnStats(ID int64, collector *statistics.SampleCollector, tp *types.FieldType, rowCount int64) (*statistics.Histogram, *statistics.CMSketch, error) { +func (e *AnalyzeFastExec) buildColumnStats(ID int64, collector *statistics.SampleCollector, tp *types.FieldType, rowCount int64) (*statistics.Histogram, *statistics.CMSketch, *statistics.TopN, *statistics.FMSketch, error) { + sc := e.ctx.GetSessionVars().StmtCtx data := make([][]byte, 0, len(collector.Samples)) + fmSketch := statistics.NewFMSketch(maxSketchSize) for i, sample := range collector.Samples { sample.Ordinal = i if sample.Value.IsNull() { collector.NullCount++ continue } - bytes, err := tablecodec.EncodeValue(e.ctx.GetSessionVars().StmtCtx, nil, sample.Value) + err := fmSketch.InsertValue(sc, sample.Value) if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err + } + bytes, err := tablecodec.EncodeValue(sc, nil, sample.Value) + if err != nil { + return nil, nil, nil, nil, err } data = append(data, bytes) } // Build CMSketch. - cmSketch, ndv, scaleRatio := statistics.NewCMSketchWithTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data, uint32(e.opts[ast.AnalyzeOptNumTopN]), uint64(rowCount)) + cmSketch, topN, ndv, scaleRatio := statistics.NewCMSketchAndTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data, uint32(e.opts[ast.AnalyzeOptNumTopN]), uint64(rowCount)) // Build Histogram. hist, err := statistics.BuildColumnHist(e.ctx, int64(e.opts[ast.AnalyzeOptNumBuckets]), ID, collector, tp, rowCount, int64(ndv), collector.NullCount*int64(scaleRatio)) - return hist, cmSketch, err + return hist, cmSketch, topN, fmSketch, err } -func (e *AnalyzeFastExec) buildIndexStats(idxInfo *model.IndexInfo, collector *statistics.SampleCollector, rowCount int64) (*statistics.Histogram, *statistics.CMSketch, error) { +func (e *AnalyzeFastExec) buildIndexStats(idxInfo *model.IndexInfo, collector *statistics.SampleCollector, rowCount int64) (*statistics.Histogram, *statistics.CMSketch, *statistics.TopN, error) { data := make([][][]byte, len(idxInfo.Columns)) for _, sample := range collector.Samples { var preLen int @@ -1033,30 +1243,32 @@ func (e *AnalyzeFastExec) buildIndexStats(idxInfo *model.IndexInfo, collector *s var value []byte value, remained, err = codec.CutOne(remained) if err != nil { - return nil, nil, err + return nil, nil, nil, err } preLen += len(value) data[i] = append(data[i], sample.Value.GetBytes()[:preLen]) } } numTop := uint32(e.opts[ast.AnalyzeOptNumTopN]) - cmSketch, ndv, scaleRatio := statistics.NewCMSketchWithTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data[0], numTop, uint64(rowCount)) + cmSketch, topN, ndv, scaleRatio := statistics.NewCMSketchAndTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data[0], numTop, uint64(rowCount)) // Build CM Sketch for each prefix and merge them into one. for i := 1; i < len(idxInfo.Columns); i++ { var curCMSketch *statistics.CMSketch + var curTopN *statistics.TopN // `ndv` should be the ndv of full index, so just rewrite it here. - curCMSketch, ndv, scaleRatio = statistics.NewCMSketchWithTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data[i], numTop, uint64(rowCount)) - err := cmSketch.MergeCMSketch(curCMSketch, numTop) + curCMSketch, curTopN, ndv, scaleRatio = statistics.NewCMSketchAndTopN(int32(e.opts[ast.AnalyzeOptCMSketchDepth]), int32(e.opts[ast.AnalyzeOptCMSketchWidth]), data[i], numTop, uint64(rowCount)) + err := cmSketch.MergeCMSketch(curCMSketch) if err != nil { - return nil, nil, err + return nil, nil, nil, err } + statistics.MergeTopNAndUpdateCMSketch(topN, curTopN, cmSketch, numTop) } // Build Histogram. hist, err := statistics.BuildColumnHist(e.ctx, int64(e.opts[ast.AnalyzeOptNumBuckets]), idxInfo.ID, collector, types.NewFieldType(mysql.TypeBlob), rowCount, int64(ndv), collector.NullCount*int64(scaleRatio)) - return hist, cmSketch, err + return hist, cmSketch, topN, err } -func (e *AnalyzeFastExec) runTasks() ([]*statistics.Histogram, []*statistics.CMSketch, error) { +func (e *AnalyzeFastExec) runTasks() ([]*statistics.Histogram, []*statistics.CMSketch, []*statistics.TopN, []*statistics.FMSketch, error) { errs := make([]error, e.concurrency) pkColCount := pkColsCount(e.handleCols) // collect column samples and primary key samples and index samples. @@ -1077,24 +1289,24 @@ func (e *AnalyzeFastExec) runTasks() ([]*statistics.Histogram, []*statistics.CMS e.wg.Wait() for _, err := range errs { if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } } scanKeysSize, err := e.handleScanTasks(bo) fastAnalyzeHistogramScanKeys.Observe(float64(scanKeysSize)) if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } stats := domain.GetDomain(e.ctx).StatsHandle() var rowCount int64 = 0 if stats.Lease() > 0 { - if t := stats.GetPartitionStats(e.tblInfo, e.tableID.PersistID); !t.Pseudo { + if t := stats.GetPartitionStats(e.tblInfo, e.tableID.GetStatisticsID()); !t.Pseudo { rowCount = t.Count } } - hists, cms := make([]*statistics.Histogram, length), make([]*statistics.CMSketch, length) + hists, cms, topNs, fms := make([]*statistics.Histogram, length), make([]*statistics.CMSketch, length), make([]*statistics.TopN, length), make([]*statistics.FMSketch, length) for i := 0; i < length; i++ { // Build collector properties. collector := e.collectors[i] @@ -1109,31 +1321,31 @@ func (e *AnalyzeFastExec) runTasks() ([]*statistics.Histogram, []*statistics.CMS } if i < pkColCount { pkCol := e.handleCols.GetCol(i) - hists[i], cms[i], err = e.buildColumnStats(pkCol.ID, e.collectors[i], pkCol.RetType, rowCount) + hists[i], cms[i], topNs[i], fms[i], err = e.buildColumnStats(pkCol.ID, e.collectors[i], pkCol.RetType, rowCount) } else if i < pkColCount+len(e.colsInfo) { - hists[i], cms[i], err = e.buildColumnStats(e.colsInfo[i-pkColCount].ID, e.collectors[i], &e.colsInfo[i-pkColCount].FieldType, rowCount) + hists[i], cms[i], topNs[i], fms[i], err = e.buildColumnStats(e.colsInfo[i-pkColCount].ID, e.collectors[i], &e.colsInfo[i-pkColCount].FieldType, rowCount) } else { - hists[i], cms[i], err = e.buildIndexStats(e.idxsInfo[i-pkColCount-len(e.colsInfo)], e.collectors[i], rowCount) + hists[i], cms[i], topNs[i], err = e.buildIndexStats(e.idxsInfo[i-pkColCount-len(e.colsInfo)], e.collectors[i], rowCount) } if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } } - return hists, cms, nil + return hists, cms, topNs, fms, nil } -func (e *AnalyzeFastExec) buildStats() (hists []*statistics.Histogram, cms []*statistics.CMSketch, err error) { +func (e *AnalyzeFastExec) buildStats() (hists []*statistics.Histogram, cms []*statistics.CMSketch, topNs []*statistics.TopN, fms []*statistics.FMSketch, err error) { // To set rand seed, it's for unit test. // To ensure that random sequences are different in non-test environments, RandSeed must be set time.Now(). if RandSeed == 1 { - e.randSeed = time.Now().UnixNano() + atomic.StoreInt64(&e.randSeed, time.Now().UnixNano()) } else { - e.randSeed = RandSeed + atomic.StoreInt64(&e.randSeed, RandSeed) } err = e.buildSampTask() if err != nil { - return nil, nil, err + return nil, nil, nil, nil, err } return e.runTasks() @@ -1165,7 +1377,7 @@ func (e *AnalyzeTestFastExec) TestFastSample() error { e.job = &statistics.AnalyzeJob{} e.tblInfo = e.TblInfo e.opts = e.Opts - _, _, err := e.buildStats() + _, _, _, _, err := e.buildStats() e.Collectors = e.collectors return err } @@ -1174,20 +1386,30 @@ type analyzeIndexIncrementalExec struct { AnalyzeIndexExec oldHist *statistics.Histogram oldCMS *statistics.CMSketch + oldTopN *statistics.TopN } func analyzeIndexIncremental(idxExec *analyzeIndexIncrementalExec) analyzeResult { + var statsVer = statistics.Version1 + if idxExec.analyzePB.IdxReq.Version != nil { + statsVer = int(*idxExec.analyzePB.IdxReq.Version) + } + pruneMode := variable.PartitionPruneMode(idxExec.ctx.GetSessionVars().PartitionPruneMode.Load()) + if idxExec.tableID.IsPartitionTable() && pruneMode == variable.Dynamic { + err := errors.Errorf("[stats]: global statistics for partitioned tables unavailable in ANALYZE INCREMENTAL") + return analyzeResult{Err: err, job: idxExec.job} + } startPos := idxExec.oldHist.GetUpper(idxExec.oldHist.Len() - 1) values, _, err := codec.DecodeRange(startPos.GetBytes(), len(idxExec.idxInfo.Columns), nil, nil) if err != nil { return analyzeResult{Err: err, job: idxExec.job} } ran := ranger.Range{LowVal: values, HighVal: []types.Datum{types.MaxValueDatum()}} - hist, cms, err := idxExec.buildStats([]*ranger.Range{&ran}, false) + hist, cms, topN, err := idxExec.buildStats([]*ranger.Range{&ran}, false) if err != nil { return analyzeResult{Err: err, job: idxExec.job} } - hist, err = statistics.MergeHistograms(idxExec.ctx.GetSessionVars().StmtCtx, idxExec.oldHist, hist, int(idxExec.opts[ast.AnalyzeOptNumBuckets])) + hist, err = statistics.MergeHistograms(idxExec.ctx.GetSessionVars().StmtCtx, idxExec.oldHist, hist, int(idxExec.opts[ast.AnalyzeOptNumBuckets]), statsVer) if err != nil { return analyzeResult{Err: err, job: idxExec.job} } @@ -1198,12 +1420,19 @@ func analyzeIndexIncremental(idxExec *analyzeIndexIncrementalExec) analyzeResult } cms.CalcDefaultValForAnalyze(uint64(hist.NDV)) } + if statsVer == statistics.Version2 { + poped := statistics.MergeTopNAndUpdateCMSketch(topN, idxExec.oldTopN, cms, uint32(idxExec.opts[ast.AnalyzeOptNumTopN])) + hist.AddIdxVals(poped) + } result := analyzeResult{ - TableID: idxExec.tableID, - Hist: []*statistics.Histogram{hist}, - Cms: []*statistics.CMSketch{cms}, - IsIndex: 1, - job: idxExec.job, + TableID: idxExec.tableID, + Hist: []*statistics.Histogram{hist}, + Cms: []*statistics.CMSketch{cms}, + TopNs: []*statistics.TopN{topN}, + Fms: []*statistics.FMSketch{nil}, + IsIndex: 1, + job: idxExec.job, + StatsVer: statsVer, } result.Count = hist.NullCount if hist.Len() > 0 { @@ -1227,20 +1456,23 @@ func analyzePKIncremental(colExec *analyzePKIncrementalExec) analyzeResult { } startPos := *colExec.oldHist.GetUpper(colExec.oldHist.Len() - 1) ran := ranger.Range{LowVal: []types.Datum{startPos}, LowExclude: true, HighVal: []types.Datum{maxVal}} - hists, _, _, err := colExec.buildStats([]*ranger.Range{&ran}, false) + hists, _, _, _, _, err := colExec.buildStats([]*ranger.Range{&ran}, false) if err != nil { return analyzeResult{Err: err, job: colExec.job} } hist := hists[0] - hist, err = statistics.MergeHistograms(colExec.ctx.GetSessionVars().StmtCtx, colExec.oldHist, hist, int(colExec.opts[ast.AnalyzeOptNumBuckets])) + hist, err = statistics.MergeHistograms(colExec.ctx.GetSessionVars().StmtCtx, colExec.oldHist, hist, int(colExec.opts[ast.AnalyzeOptNumBuckets]), statistics.Version1) if err != nil { return analyzeResult{Err: err, job: colExec.job} } result := analyzeResult{ - TableID: colExec.tableID, - Hist: []*statistics.Histogram{hist}, - Cms: []*statistics.CMSketch{nil}, - job: colExec.job, + TableID: colExec.tableID, + Hist: []*statistics.Histogram{hist}, + Cms: []*statistics.CMSketch{nil}, + TopNs: []*statistics.TopN{nil}, + Fms: []*statistics.FMSketch{nil}, + job: colExec.job, + StatsVer: statistics.Version1, } if hist.Len() > 0 { result.Count += hist.Buckets[hist.Len()-1].Count @@ -1253,9 +1485,12 @@ type analyzeResult struct { TableID core.AnalyzeTableID Hist []*statistics.Histogram Cms []*statistics.CMSketch + TopNs []*statistics.TopN + Fms []*statistics.FMSketch ExtStats *statistics.ExtendedStatsColl Count int64 IsIndex int Err error job *statistics.AnalyzeJob + StatsVer int } diff --git a/executor/analyze_test.go b/executor/analyze_test.go index b3880ed9b434f..d535707738173 100644 --- a/executor/analyze_test.go +++ b/executor/analyze_test.go @@ -38,12 +38,13 @@ import ( "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/testkit" ) @@ -51,7 +52,7 @@ var _ = Suite(&testFastAnalyze{}) func (s *testSuite1) TestAnalyzePartition(c *C) { tk := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(tk, variable.StaticOnly, func() { + testkit.WithPruneMode(tk, variable.Static, func() { tk.MustExec("use test") tk.MustExec("drop table if exists t") createTable := `CREATE TABLE t (a int, b int, c varchar(10), primary key(a), index idx(b)) @@ -128,7 +129,7 @@ func (s *testSuite1) TestClusterIndexAnalyze(c *C) { tk.MustExec("drop database if exists test_cluster_index_analyze;") tk.MustExec("create database test_cluster_index_analyze;") tk.MustExec("use test_cluster_index_analyze;") - tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a int, b int, c int, primary key(a, b));") for i := 0; i < 100; i++ { @@ -181,7 +182,7 @@ func (s *testSuite1) TestAnalyzeParameters(c *C) { tbl := s.dom.StatsHandle().GetTableStats(tableInfo) col := tbl.Columns[1] c.Assert(col.Len(), Equals, 20) - c.Assert(len(col.CMSketch.TopN()), Equals, 1) + c.Assert(len(col.TopN.TopN), Equals, 1) width, depth := col.CMSketch.GetWidthAndDepth() c.Assert(depth, Equals, int32(5)) c.Assert(width, Equals, int32(2048)) @@ -190,10 +191,30 @@ func (s *testSuite1) TestAnalyzeParameters(c *C) { tbl = s.dom.StatsHandle().GetTableStats(tableInfo) col = tbl.Columns[1] c.Assert(col.Len(), Equals, 4) - c.Assert(len(col.CMSketch.TopN()), Equals, 0) + c.Assert(col.TopN, IsNil) width, depth = col.CMSketch.GetWidthAndDepth() c.Assert(depth, Equals, int32(4)) c.Assert(width, Equals, int32(4)) + + // Test very large cmsketch + tk.MustExec(fmt.Sprintf("analyze table t with %d cmsketch width, %d cmsketch depth", core.CMSketchSizeLimit, 1)) + tbl = s.dom.StatsHandle().GetTableStats(tableInfo) + col = tbl.Columns[1] + c.Assert(col.Len(), Equals, 20) + c.Assert(len(col.TopN.TopN), Equals, 1) + width, depth = col.CMSketch.GetWidthAndDepth() + c.Assert(depth, Equals, int32(1)) + c.Assert(width, Equals, int32(core.CMSketchSizeLimit)) + + // Test very large cmsketch + tk.MustExec("analyze table t with 20480 cmsketch width, 50 cmsketch depth") + tbl = s.dom.StatsHandle().GetTableStats(tableInfo) + col = tbl.Columns[1] + c.Assert(col.Len(), Equals, 20) + c.Assert(len(col.TopN.TopN), Equals, 1) + width, depth = col.CMSketch.GetWidthAndDepth() + c.Assert(depth, Equals, int32(50)) + c.Assert(width, Equals, int32(20480)) } func (s *testSuite1) TestAnalyzeTooLongColumns(c *C) { @@ -214,6 +235,61 @@ func (s *testSuite1) TestAnalyzeTooLongColumns(c *C) { c.Assert(tbl.Columns[1].TotColSize, Equals, int64(65559)) } +func (s *testSuite1) TestAnalyzeIndexExtractTopN(c *C) { + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() + var dom *domain.Domain + session.DisableStats4Test() + session.SetSchemaLease(0) + dom, err = session.BootstrapSession(store) + c.Assert(err, IsNil) + defer dom.Close() + tk := testkit.NewTestKit(c, store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index idx(a, b))") + tk.MustExec("insert into t values(1, 1), (1, 1), (1, 2), (1, 2)") + tk.MustExec("set @@session.tidb_analyze_version=2") + tk.MustExec("analyze table t with 10 cmsketch width") + + is := infoschema.GetInfoSchema(tk.Se.(sessionctx.Context)) + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := table.Meta() + tbl := dom.StatsHandle().GetTableStats(tableInfo) + + // Construct TopN, should be (1, 1) -> 2 and (1, 2) -> 2 + cms := statistics.NewCMSketch(5, 10) + topn := statistics.NewTopN(2) + { + key1, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(1)) + c.Assert(err, IsNil) + topn.AppendTopN(key1, 2) + key2, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(1), types.NewIntDatum(2)) + c.Assert(err, IsNil) + topn.AppendTopN(key2, 2) + prefixKey, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(1)) + c.Assert(err, IsNil) + cms.InsertBytes(prefixKey) + cms.InsertBytes(prefixKey) + cms.InsertBytes(prefixKey) + cms.InsertBytes(prefixKey) + cms.CalcDefaultValForAnalyze(2) + } + for _, idx := range tbl.Indices { + ok, err := checkHistogram(tk.Se.GetSessionVars().StmtCtx, &idx.Histogram) + c.Assert(err, IsNil) + c.Assert(ok, IsTrue) + c.Assert(idx.CMSketch.Equal(cms), IsTrue) + c.Assert(idx.TopN.Equal(topn), IsTrue) + } +} + func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { var cls cluster.Cluster store, err := mockstore.NewMockStore( @@ -223,7 +299,10 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { }), ) c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() var dom *domain.Domain session.DisableStats4Test() session.SetSchemaLease(0) @@ -272,8 +351,8 @@ func (s *testFastAnalyze) TestAnalyzeFastSample(c *C) { IdxsInfo: indicesInfo, Concurrency: 1, TableID: core.AnalyzeTableID{ - CollectIDs: []int64{tbl.(table.PhysicalTable).GetPhysicalID()}, - PersistID: tbl.(table.PhysicalTable).GetPhysicalID(), + PartitionID: -1, + TableID: tbl.(table.PhysicalTable).GetPhysicalID(), }, TblInfo: tblInfo, Opts: opts, @@ -320,7 +399,10 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { }), ) c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() var dom *domain.Domain session.DisableStats4Test() session.SetSchemaLease(0) @@ -374,32 +456,71 @@ func (s *testFastAnalyze) TestFastAnalyze(c *C) { tk.MustExec("analyze table t1") tk.MustExec("insert into t1 values (1,1),(1,1),(1,2),(1,2)") tk.MustExec("analyze table t1") - tk.MustQuery("explain select a from t1 where a = 1").Check(testkit.Rows( - "IndexReader_6 4.00 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 4.00 cop[tikv] table:t1, index:idx(a, b) range:[1,1], keep order:false")) - tk.MustQuery("explain select a, b from t1 where a = 1 and b = 1").Check(testkit.Rows( - "IndexReader_6 2.00 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 2.00 cop[tikv] table:t1, index:idx(a, b) range:[1 1,1 1], keep order:false")) - tk.MustQuery("explain select a, b from t1 where a = 1 and b = 2").Check(testkit.Rows( - "IndexReader_6 2.00 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 2.00 cop[tikv] table:t1, index:idx(a, b) range:[1 2,1 2], keep order:false")) + tk.MustQuery("explain format = 'brief' select a from t1 where a = 1").Check(testkit.Rows( + "IndexReader 4.00 root index:IndexRangeScan", + "└─IndexRangeScan 4.00 cop[tikv] table:t1, index:idx(a, b) range:[1,1], keep order:false")) + tk.MustQuery("explain format = 'brief' select a, b from t1 where a = 1 and b = 1").Check(testkit.Rows( + "IndexReader 2.00 root index:IndexRangeScan", + "└─IndexRangeScan 2.00 cop[tikv] table:t1, index:idx(a, b) range:[1 1,1 1], keep order:false")) + tk.MustQuery("explain format = 'brief' select a, b from t1 where a = 1 and b = 2").Check(testkit.Rows( + "IndexReader 2.00 root index:IndexRangeScan", + "└─IndexRangeScan 2.00 cop[tikv] table:t1, index:idx(a, b) range:[1 2,1 2], keep order:false")) tk.MustExec("create table t2 (a bigint unsigned, primary key(a))") tk.MustExec("insert into t2 values (0), (18446744073709551615)") tk.MustExec("analyze table t2") tk.MustQuery("show stats_buckets where table_name = 't2'").Check(testkit.Rows( - "test t2 a 0 0 1 1 0 0", - "test t2 a 0 1 2 1 18446744073709551615 18446744073709551615")) + "test t2 a 0 0 1 1 0 0 0", + "test t2 a 0 1 2 1 18446744073709551615 18446744073709551615 0")) - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) tk.MustExec(`create table t3 (id int, v int, primary key(id), index k(v)) partition by hash (id) partitions 4`) tk.MustExec(`insert into t3 values(1, 1), (2, 2), (5, 1), (9, 3), (13, 3), (17, 5), (3, 0)`) tk.MustExec(`analyze table t3`) - tk.MustQuery(`explain select v from t3 partition(p1) where v = 3`).Check(testkit.Rows( - "IndexReader_8 2.00 root index:IndexRangeScan_7", - "└─IndexRangeScan_7 2.00 cop[tikv] table:t3, partition:p1, index:k(v) range:[3,3], keep order:false", + tk.MustQuery(`explain format = 'brief' select v from t3 partition(p1) where v = 3`).Check(testkit.Rows( + "IndexReader 2.00 root index:IndexRangeScan", + "└─IndexRangeScan 2.00 cop[tikv] table:t3, partition:p1, index:k(v) range:[3,3], keep order:false", )) - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.DynamicOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Dynamic) + `'`) + + // global-stats depends on stats-ver2, but stats-ver2 is not compatible with fast-analyze, so forbid using global-stats with fast-analyze now. + // TODO: add more test cases about global-stats with fast-analyze after resolving the compatibility problem. + /* + // test fast analyze in dynamic mode + tk.MustExec("drop table if exists t4;") + tk.MustExec("create table t4(a int, b int) PARTITION BY HASH(a) PARTITIONS 2;") + tk.MustExec("insert into t4 values(1,1),(3,3),(4,4),(2,2),(5,5);") + // Because the statistics of partition p1 are missing, the construction of global-level stats will fail. + tk.MustExec("analyze table t4 partition p1;") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 8131 Build global-level stats failed due to missing partition-level stats")) + // Although the global-level stats build failed, we build partition-level stats for partition p1 success. + result := tk.MustQuery("show stats_meta where table_name = 't4'").Sort() + c.Assert(len(result.Rows()), Equals, 1) + c.Assert(result.Rows()[0][5], Equals, "3") + // Now, we have the partition-level stats for partition p0. We need get the stats for partition p1. And build the global-level stats. + tk.MustExec("analyze table t4 partition p0;") + tk.MustQuery("show warnings").Check(testkit.Rows()) + result = tk.MustQuery("show stats_meta where table_name = 't4'").Sort() + c.Assert(len(result.Rows()), Equals, 3) + c.Assert(result.Rows()[0][5], Equals, "5") + c.Assert(result.Rows()[1][5], Equals, "2") + c.Assert(result.Rows()[2][5], Equals, "3") + */ +} + +func (s *testSerialSuite2) TestFastAnalyze4GlobalStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_fast_analyze=1") + tk.MustExec("set @@session.tidb_build_stats_concurrency=1") + // test fast analyze in dynamic mode + tk.MustExec("set @@session.tidb_analyze_version = 2;") + tk.MustExec("set @@session.tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("drop table if exists t4;") + tk.MustExec("create table t4(a int, b int) PARTITION BY HASH(a) PARTITIONS 2;") + tk.MustExec("insert into t4 values(1,1),(3,3),(4,4),(2,2),(5,5);") + err := tk.ExecToErr("analyze table t4;") + c.Assert(err.Error(), Equals, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently.") } func (s *testSuite1) TestIssue15993(c *C) { @@ -458,6 +579,7 @@ func (s *testSuite1) TestAnalyzeIncremental(c *C) { } func (s *testSuite1) TestAnalyzeIncrementalStreaming(c *C) { + c.Skip("unistore hasn't support streaming yet.") tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.Se.GetSessionVars().EnableStreaming = true @@ -472,13 +594,13 @@ func (s *testSuite1) testAnalyzeIncremental(tk *testkit.TestKit, c *C) { tk.MustQuery("show stats_buckets").Check(testkit.Rows()) tk.MustExec("insert into t values (1,1)") tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t idx 1 0 1 1 1 1")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t idx 1 0 1 1 1 1 0")) tk.MustExec("insert into t values (2,2)") tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t a 0 1 2 1 2 2", "test t idx 1 0 1 1 1 1", "test t idx 1 1 2 1 2 2")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) tk.MustExec("analyze incremental table t index") // Result should not change. - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t a 0 1 2 1 2 2", "test t idx 1 0 1 1 1 1", "test t idx 1 1 2 1 2 2")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) // Test analyze incremental with feedback. tk.MustExec("insert into t values (3,3)") @@ -501,19 +623,41 @@ func (s *testSuite1) testAnalyzeIncremental(tk *testkit.TestKit, c *C) { c.Assert(h.DumpStatsFeedbackToKV(), IsNil) c.Assert(h.HandleUpdateStats(is), IsNil) c.Assert(h.Update(is), IsNil) - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t a 0 1 3 0 2 2147483647", "test t idx 1 0 1 1 1 1", "test t idx 1 1 2 1 2 2")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 3 0 2 2147483647 0", "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0")) tblStats := h.GetTableStats(tblInfo) val, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, types.NewIntDatum(3)) c.Assert(err, IsNil) - c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].CMSketch.QueryBytes(val), Equals, uint64(1)) + c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val), Equals, uint64(1)) c.Assert(statistics.IsAnalyzed(tblStats.Indices[tblInfo.Indices[0].ID].Flag), IsFalse) c.Assert(statistics.IsAnalyzed(tblStats.Columns[tblInfo.Columns[0].ID].Flag), IsFalse) tk.MustExec("analyze incremental table t index") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t a 0 1 2 1 2 2", "test t a 0 2 3 1 3 3", - "test t idx 1 0 1 1 1 1", "test t idx 1 1 2 1 2 2", "test t idx 1 2 3 1 3 3")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t a 0 1 2 1 2 2 0", "test t a 0 2 3 1 3 3 0", + "test t idx 1 0 1 1 1 1 0", "test t idx 1 1 2 1 2 2 0", "test t idx 1 2 3 1 3 3 0")) tblStats = h.GetTableStats(tblInfo) - c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].CMSketch.QueryBytes(val), Equals, uint64(1)) + c.Assert(tblStats.Indices[tblInfo.Indices[0].ID].QueryBytes(val), Equals, uint64(1)) + + // test analyzeIndexIncremental for global-level stats; + tk.MustExec("set @@session.tidb_analyze_version = 2;") + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustExec("drop table if exists t;") + tk.MustExec(`create table t (a int, b int, primary key(a), index idx(b)) partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (30) + );`) + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows()) + tk.MustExec("insert into t values (1,1)") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 idx 1 0 1 1 1 1 0")) + tk.MustExec("insert into t values (2,2)") + tk.MustExec("analyze incremental table t index") + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 a 0 1 2 1 2 2 0", "test t p0 idx 1 0 1 1 1 1 0", "test t p0 idx 1 1 2 1 2 2 0")) + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("insert into t values (11,11)") + err = tk.ExecToErr("analyze incremental table t index") + c.Assert(err.Error(), Equals, "[stats]: global statistics for partitioned tables unavailable in ANALYZE INCREMENTAL") } type testFastAnalyze struct { @@ -558,7 +702,10 @@ func (s *testFastAnalyze) TestFastAnalyzeRetryRowCount(c *C) { mockstore.WithClientHijacker(hijackClient), ) c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) defer dom.Close() @@ -600,6 +747,7 @@ func (s *testSuite1) TestExtractTopN(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key, b int, index index_b(b))") + tk.MustExec("set @@session.tidb_analyze_version=2") for i := 0; i < 10; i++ { tk.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i, i)) } @@ -613,13 +761,35 @@ func (s *testSuite1) TestExtractTopN(c *C) { tblInfo := table.Meta() tblStats := s.dom.StatsHandle().GetTableStats(tblInfo) colStats := tblStats.Columns[tblInfo.Columns[1].ID] - c.Assert(len(colStats.CMSketch.TopN()), Equals, 1) - item := colStats.CMSketch.TopN()[0] + c.Assert(len(colStats.TopN.TopN), Equals, 10) + item := colStats.TopN.TopN[0] c.Assert(item.Count, Equals, uint64(11)) idxStats := tblStats.Indices[tblInfo.Indices[0].ID] - c.Assert(len(idxStats.CMSketch.TopN()), Equals, 1) - item = idxStats.CMSketch.TopN()[0] - c.Assert(item.Count, Equals, uint64(11)) + c.Assert(len(idxStats.TopN.TopN), Equals, 10) + idxItem := idxStats.TopN.TopN[0] + c.Assert(idxItem.Count, Equals, uint64(11)) + // The columns are: DBName, table name, column name, is index, value, count. + tk.MustQuery("show stats_topn").Sort().Check(testkit.Rows("test t b 0 0 11", + "test t b 0 1 1", + "test t b 0 2 1", + "test t b 0 3 1", + "test t b 0 4 1", + "test t b 0 5 1", + "test t b 0 6 1", + "test t b 0 7 1", + "test t b 0 8 1", + "test t b 0 9 1", + "test t index_b 1 0 11", + "test t index_b 1 1 1", + "test t index_b 1 2 1", + "test t index_b 1 3 1", + "test t index_b 1 4 1", + "test t index_b 1 5 1", + "test t index_b 1 6 1", + "test t index_b 1 7 1", + "test t index_b 1 8 1", + "test t index_b 1 9 1", + )) } func (s *testSuite1) TestHashInTopN(c *C) { @@ -648,14 +818,12 @@ func (s *testSuite1) TestHashInTopN(c *C) { tblStats2 := s.dom.StatsHandle().GetTableStats(tblInfo).Copy() // check the hash for topn for _, col := range tblInfo.Columns { - topn1 := tblStats1.Columns[col.ID].CMSketch.TopNMap() - cm2 := tblStats2.Columns[col.ID].CMSketch - for h1, topnMetas := range topn1 { - for _, topnMeta1 := range topnMetas { - count2, exists := cm2.QueryTopN(h1, topnMeta1.GetH2(), topnMeta1.Data) - c.Assert(exists, Equals, true) - c.Assert(count2, Equals, topnMeta1.Count) - } + topn1 := tblStats1.Columns[col.ID].TopN.TopN + cm2 := tblStats2.Columns[col.ID].TopN + for _, topnMeta := range topn1 { + count2, exists := cm2.QueryTopN(topnMeta.Encoded) + c.Assert(exists, Equals, true) + c.Assert(count2, Equals, topnMeta.Count) } } } @@ -675,39 +843,40 @@ func (s *testSuite1) TestNormalAnalyzeOnCommonHandle(c *C) { tk.MustExec("analyze table t1, t2, t3") tk.MustQuery(`show stats_buckets where table_name in ("t1", "t2", "t3")`).Sort().Check(testkit.Rows( - "test t1 a 0 0 1 1 1 1", - "test t1 a 0 1 2 1 2 2", - "test t1 a 0 2 3 1 3 3", - "test t1 b 0 0 1 1 1 1", - "test t1 b 0 1 2 1 2 2", - "test t1 b 0 2 3 1 3 3", - "test t2 PRIMARY 1 0 1 1 111 111", - "test t2 PRIMARY 1 1 2 1 222 222", - "test t2 PRIMARY 1 2 3 1 333 333", - "test t2 a 0 0 1 1 111 111", - "test t2 a 0 1 2 1 222 222", - "test t2 a 0 2 3 1 333 333", - "test t2 b 0 0 1 1 1 1", - "test t2 b 0 1 2 1 2 2", - "test t2 b 0 2 3 1 3 3", - "test t3 PRIMARY 1 0 1 1 (1, 1) (1, 1)", - "test t3 PRIMARY 1 1 2 1 (2, 2) (2, 2)", - "test t3 PRIMARY 1 2 3 1 (3, 3) (3, 3)", - "test t3 a 0 0 1 1 1 1", - "test t3 a 0 1 2 1 2 2", - "test t3 a 0 2 3 1 3 3", - "test t3 b 0 0 1 1 1 1", - "test t3 b 0 1 2 1 2 2", - "test t3 b 0 2 3 1 3 3", - "test t3 c 0 0 1 1 1 1", - "test t3 c 0 1 2 1 2 2", - "test t3 c 0 2 3 1 3 3", - "test t3 c 1 0 1 1 1 1", - "test t3 c 1 1 2 1 2 2", - "test t3 c 1 2 3 1 3 3")) + "test t1 a 0 0 1 1 1 1 0", + "test t1 a 0 1 2 1 2 2 0", + "test t1 a 0 2 3 1 3 3 0", + "test t1 b 0 0 1 1 1 1 0", + "test t1 b 0 1 2 1 2 2 0", + "test t1 b 0 2 3 1 3 3 0", + "test t2 PRIMARY 1 0 1 1 111 111 0", + "test t2 PRIMARY 1 1 2 1 222 222 0", + "test t2 PRIMARY 1 2 3 1 333 333 0", + "test t2 a 0 0 1 1 111 111 0", + "test t2 a 0 1 2 1 222 222 0", + "test t2 a 0 2 3 1 333 333 0", + "test t2 b 0 0 1 1 1 1 0", + "test t2 b 0 1 2 1 2 2 0", + "test t2 b 0 2 3 1 3 3 0", + "test t3 PRIMARY 1 0 1 1 (1, 1) (1, 1) 0", + "test t3 PRIMARY 1 1 2 1 (2, 2) (2, 2) 0", + "test t3 PRIMARY 1 2 3 1 (3, 3) (3, 3) 0", + "test t3 a 0 0 1 1 1 1 0", + "test t3 a 0 1 2 1 2 2 0", + "test t3 a 0 2 3 1 3 3 0", + "test t3 b 0 0 1 1 1 1 0", + "test t3 b 0 1 2 1 2 2 0", + "test t3 b 0 2 3 1 3 3 0", + "test t3 c 0 0 1 1 1 1 0", + "test t3 c 0 1 2 1 2 2 0", + "test t3 c 0 2 3 1 3 3 0", + "test t3 c 1 0 1 1 1 1 0", + "test t3 c 1 1 2 1 2 2 0", + "test t3 c 1 2 3 1 3 3 0")) } func (s *testSuite1) TestDefaultValForAnalyze(c *C) { + c.Skip("skip race test") tk := testkit.NewTestKit(c, s.store) tk.MustExec("drop database if exists test_default_val_for_analyze;") tk.MustExec("create database test_default_val_for_analyze;") @@ -720,10 +889,12 @@ func (s *testSuite1) TestDefaultValForAnalyze(c *C) { for i := 1; i < 4; i++ { tk.MustExec("insert into t values (?)", i) } + tk.MustQuery("select @@tidb_enable_fast_analyze").Check(testkit.Rows("0")) + tk.MustQuery("select @@session.tidb_enable_fast_analyze").Check(testkit.Rows("0")) tk.MustExec("analyze table t with 0 topn;") - tk.MustQuery("explain select * from t where a = 1").Check(testkit.Rows("IndexReader_6 512.00 root index:IndexRangeScan_5", + tk.MustQuery("explain format = 'brief' select * from t where a = 1").Check(testkit.Rows("IndexReader_6 512.00 root index:IndexRangeScan_5", "└─IndexRangeScan_5 512.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false")) - tk.MustQuery("explain select * from t where a = 999").Check(testkit.Rows("IndexReader_6 0.00 root index:IndexRangeScan_5", + tk.MustQuery("explain format = 'brief' select * from t where a = 999").Check(testkit.Rows("IndexReader_6 0.00 root index:IndexRangeScan_5", "└─IndexRangeScan_5 0.00 cop[tikv] table:t, index:a(a) range:[999,999], keep order:false")) tk.MustExec("drop table t;") @@ -735,6 +906,45 @@ func (s *testSuite1) TestDefaultValForAnalyze(c *C) { tk.MustExec("insert into t values (?)", i) } tk.MustExec("analyze table t with 0 topn;") - tk.MustQuery("explain select * from t where a = 1").Check(testkit.Rows("IndexReader_6 1.00 root index:IndexRangeScan_5", + tk.MustQuery("explain format = 'brief' select * from t where a = 1").Check(testkit.Rows("IndexReader_6 1.00 root index:IndexRangeScan_5", "└─IndexRangeScan_5 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false")) } + +func (s *testSerialSuite2) TestIssue20874(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a char(10) collate utf8mb4_unicode_ci not null, b char(20) collate utf8mb4_general_ci not null, key idxa(a), key idxb(b))") + tk.MustExec("insert into t values ('#', 'C'), ('$', 'c'), ('a', 'a')") + tk.MustExec("analyze table t") + tk.MustQuery("show stats_buckets where db_name = 'test' and table_name = 't'").Sort().Check(testkit.Rows( + "test t a 0 0 1 1 \x02\xd2 \x02\xd2 0", + "test t a 0 1 2 1 \x0e\x0f \x0e\x0f 0", + "test t a 0 2 3 1 \x0e3 \x0e3 0", + "test t b 0 0 1 1 \x00A \x00A 0", + "test t b 0 1 3 2 \x00C \x00C 0", + "test t idxa 1 0 1 1 \x02\xd2 \x02\xd2 0", + "test t idxa 1 1 2 1 \x0e\x0f \x0e\x0f 0", + "test t idxa 1 2 3 1 \x0e3 \x0e3 0", + "test t idxb 1 0 1 1 \x00A \x00A 0", + "test t idxb 1 1 3 2 \x00C \x00C 0", + )) +} + +func (s *testSuite1) TestAnalyzeClusteredIndexPrimary(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t0") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t0(a varchar(20), primary key(a) clustered)") + tk.MustExec("create table t1(a varchar(20), primary key(a))") + tk.MustExec("insert into t0 values('1111')") + tk.MustExec("insert into t1 values('1111')") + tk.MustExec("analyze table t0 index primary") + tk.MustExec("analyze table t1 index primary") + tk.MustQuery("show stats_buckets").Check(testkit.Rows( + "test t0 PRIMARY 1 0 1 1 1111 1111 0", + "test t1 PRIMARY 1 0 1 1 1111 1111 0")) +} diff --git a/executor/apply_cache.go b/executor/apply_cache.go index d691997576dc0..eab8e24f6768d 100644 --- a/executor/apply_cache.go +++ b/executor/apply_cache.go @@ -14,6 +14,8 @@ package executor import ( + "sync" + "github.com/cznic/mathutil" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/chunk" @@ -24,7 +26,8 @@ import ( // applyCache is used in the apply executor. When we get the same value of the outer row. // We fetch the inner rows in the cache not to fetch them in the inner executor. type applyCache struct { - cache *kvcache.SimpleLRUCache + lock sync.Mutex + cache *kvcache.SimpleLRUCache // cache.Get/Put are not thread-safe, so it's protected by the lock above memCapacity int64 memTracker *memory.Tracker // track memory usage. } @@ -45,15 +48,27 @@ func newApplyCache(ctx sessionctx.Context) (*applyCache, error) { cache := kvcache.NewSimpleLRUCache(mathutil.MaxUint, 0.1, 0) c := applyCache{ cache: cache, - memCapacity: ctx.GetSessionVars().NestedLoopJoinCacheCapacity, + memCapacity: ctx.GetSessionVars().MemQuotaApplyCache, memTracker: memory.NewTracker(memory.LabelForApplyCache, -1), } return &c, nil } -// Get gets a cache item according to cache key. +func (c *applyCache) get(key applyCacheKey) (value kvcache.Value, ok bool) { + c.lock.Lock() + defer c.lock.Unlock() + return c.cache.Get(key) +} + +func (c *applyCache) put(key applyCacheKey, val kvcache.Value) { + c.lock.Lock() + defer c.lock.Unlock() + c.cache.Put(key, val) +} + +// Get gets a cache item according to cache key. It's thread-safe. func (c *applyCache) Get(key applyCacheKey) (*chunk.List, error) { - value, hit := c.cache.Get(&key) + value, hit := c.get(key) if !hit { return nil, nil } @@ -61,7 +76,7 @@ func (c *applyCache) Get(key applyCacheKey) (*chunk.List, error) { return typedValue, nil } -// Set inserts an item to the cache. +// Set inserts an item to the cache. It's thread-safe. func (c *applyCache) Set(key applyCacheKey, value *chunk.List) (bool, error) { mem := applyCacheKVMem(key, value) if mem > c.memCapacity { // ignore this kv pair if its size is too large @@ -75,7 +90,7 @@ func (c *applyCache) Set(key applyCacheKey, value *chunk.List) (bool, error) { c.memTracker.Consume(-applyCacheKVMem(evictedKey.(applyCacheKey), evictedValue.(*chunk.List))) } c.memTracker.Consume(mem) - c.cache.Put(key, value) + c.put(key, value) return true, nil } diff --git a/executor/apply_cache_test.go b/executor/apply_cache_test.go index 131d2b0e0d885..5c8af4b44b3a1 100644 --- a/executor/apply_cache_test.go +++ b/executor/apply_cache_test.go @@ -31,7 +31,7 @@ type testApplyCacheSuite struct { func (s *testApplyCacheSuite) TestApplyCache(c *C) { ctx := mock.NewContext() - ctx.GetSessionVars().NestedLoopJoinCacheCapacity = 100 + ctx.GetSessionVars().MemQuotaApplyCache = 100 applyCache, err := newApplyCache(ctx) c.Assert(err, IsNil) diff --git a/executor/batch_checker.go b/executor/batch_checker.go index 0986be3ff4548..58ae81d32feb3 100644 --- a/executor/batch_checker.go +++ b/executor/batch_checker.go @@ -15,16 +15,22 @@ package executor import ( "context" + "strings" + "github.com/pingcap/errors" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/stringutil" ) @@ -39,7 +45,8 @@ type toBeCheckedRow struct { handleKey *keyValueWithDupInfo uniqueKeys []*keyValueWithDupInfo // t is the table or partition this row belongs to. - t table.Table + t table.Table + ignored bool } // encodeNewRow encodes a new row to value. @@ -64,29 +71,38 @@ func encodeNewRow(ctx sessionctx.Context, t table.Table, row []types.Datum) ([]b // which need to be checked whether they are duplicate keys. func getKeysNeedCheck(ctx context.Context, sctx sessionctx.Context, t table.Table, rows [][]types.Datum) ([]toBeCheckedRow, error) { nUnique := 0 - for _, v := range t.WritableIndices() { + for _, v := range t.Indices() { + if !tables.IsIndexWritable(v) { + continue + } if v.Meta().Unique { nUnique++ } } toBeCheckRows := make([]toBeCheckedRow, 0, len(rows)) - var handleCols []*table.Column + var ( + tblHandleCols []*table.Column + pkIdxInfo *model.IndexInfo + ) // Get handle column if PK is handle. if t.Meta().PKIsHandle { for _, col := range t.Cols() { if col.IsPKHandleColumn(t.Meta()) { - handleCols = append(handleCols, col) + tblHandleCols = append(tblHandleCols, col) break } } - } else { - handleCols = tables.TryGetCommonPkColumns(t) + } else if t.Meta().IsCommonHandle { + pkIdxInfo = tables.FindPrimaryIndex(t.Meta()) + for _, idxCol := range pkIdxInfo.Columns { + tblHandleCols = append(tblHandleCols, t.Cols()[idxCol.Offset]) + } } var err error for _, row := range rows { - toBeCheckRows, err = getKeysNeedCheckOneRow(sctx, t, row, nUnique, handleCols, toBeCheckRows) + toBeCheckRows, err = getKeysNeedCheckOneRow(sctx, t, row, nUnique, tblHandleCols, pkIdxInfo, toBeCheckRows) if err != nil { return nil, err } @@ -94,11 +110,17 @@ func getKeysNeedCheck(ctx context.Context, sctx sessionctx.Context, t table.Tabl return toBeCheckRows, nil } -func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.Datum, nUnique int, handleCols []*table.Column, result []toBeCheckedRow) ([]toBeCheckedRow, error) { +func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.Datum, nUnique int, handleCols []*table.Column, + pkIdxInfo *model.IndexInfo, result []toBeCheckedRow) ([]toBeCheckedRow, error) { var err error if p, ok := t.(table.PartitionedTable); ok { t, err = p.GetPartitionByRow(ctx, row) if err != nil { + if terr, ok := errors.Cause(err).(*terror.Error); ctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { + ctx.GetSessionVars().StmtCtx.AppendWarning(err) + result = append(result, toBeCheckedRow{ignored: true}) + return result, nil + } return nil, err } } @@ -108,11 +130,7 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D var handle kv.Handle if t.Meta().IsCommonHandle { var err error - handleOrdinals := make([]int, 0, len(handleCols)) - for _, col := range handleCols { - handleOrdinals = append(handleOrdinals, col.Offset) - } - handle, err = kv.BuildHandleFromDatumRow(ctx.GetSessionVars().StmtCtx, row, handleOrdinals) + handle, err = buildHandleFromDatumRow(ctx.GetSessionVars().StmtCtx, row, handleCols, pkIdxInfo) if err != nil { return nil, err } @@ -122,10 +140,24 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D var handleKey *keyValueWithDupInfo if handle != nil { fn := func() string { - return kv.GetDuplicateErrorHandleString(handle) + var str string + var err error + if t.Meta().IsCommonHandle { + data := make([]types.Datum, len(handleCols)) + for i, col := range handleCols { + data[i] = row[col.Offset] + } + str, err = formatDataForDupError(data) + } else { + str, err = row[handleCols[0].Offset].ToString() + } + if err != nil { + return kv.GetDuplicateErrorHandleString(handle) + } + return str } handleKey = &keyValueWithDupInfo{ - newKey: t.RecordKey(handle), + newKey: tablecodec.EncodeRecordKey(t.RecordPrefix(), handle), dupErr: kv.ErrKeyExists.FastGenByArgs(stringutil.MemoizeStr(fn), "PRIMARY"), } } @@ -133,7 +165,10 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D // addChangingColTimes is used to fetch values while processing "modify/change column" operation. addChangingColTimes := 0 // append unique keys and errors - for _, v := range t.WritableIndices() { + for _, v := range t.Indices() { + if !tables.IsIndexWritable(v) { + continue + } if !v.Meta().Unique { continue } @@ -161,7 +196,7 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D if !distinct { continue } - colValStr, err1 := types.DatumsToString(colVals, false) + colValStr, err1 := formatDataForDupError(colVals) if err1 != nil { return nil, err1 } @@ -183,11 +218,43 @@ func getKeysNeedCheckOneRow(ctx sessionctx.Context, t table.Table, row []types.D return result, nil } +func buildHandleFromDatumRow(sctx *stmtctx.StatementContext, row []types.Datum, tblHandleCols []*table.Column, pkIdxInfo *model.IndexInfo) (kv.Handle, error) { + pkDts := make([]types.Datum, 0, len(tblHandleCols)) + for i, col := range tblHandleCols { + d := row[col.Offset] + if pkIdxInfo != nil && len(pkIdxInfo.Columns) > 0 { + tablecodec.TruncateIndexValue(&d, pkIdxInfo.Columns[i], col.ColumnInfo) + } + pkDts = append(pkDts, d) + } + handleBytes, err := codec.EncodeKey(sctx, nil, pkDts...) + if err != nil { + return nil, err + } + handle, err := kv.NewCommonHandle(handleBytes) + if err != nil { + return nil, err + } + return handle, nil +} + +func formatDataForDupError(data []types.Datum) (string, error) { + strs := make([]string, 0, len(data)) + for _, datum := range data { + str, err := datum.ToString() + if err != nil { + return "", errors.Trace(err) + } + strs = append(strs, str) + } + return strings.Join(strs, "-"), nil +} + // getOldRow gets the table record row from storage for batch check. // t could be a normal table or a partition, but it must not be a PartitionedTable. func getOldRow(ctx context.Context, sctx sessionctx.Context, txn kv.Transaction, t table.Table, handle kv.Handle, genExprs []expression.Expression) ([]types.Datum, error) { - oldValue, err := txn.Get(ctx, t.RecordKey(handle)) + oldValue, err := txn.Get(ctx, tablecodec.EncodeRecordKey(t.RecordPrefix(), handle)) if err != nil { return nil, err } diff --git a/executor/batch_point_get.go b/executor/batch_point_get.go index c4fdca29b4bb3..ca4416658306b 100644 --- a/executor/batch_point_get.go +++ b/executor/batch_point_get.go @@ -20,12 +20,15 @@ import ( "sync/atomic" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -99,10 +102,7 @@ func (e *BatchPointGetExec) Open(context.Context) error { // The snapshot may contains cache that can reduce RPC call. snapshot = txn.GetSnapshot() } else { - snapshot, err = e.ctx.GetStore().GetSnapshot(kv.Version{Ver: e.snapshotTS}) - if err != nil { - return err - } + snapshot = e.ctx.GetStore().GetSnapshot(kv.Version{Ver: e.snapshotTS}) } if e.runtimeStats != nil { snapshotStats := &tikv.SnapshotRuntimeStats{} @@ -116,9 +116,26 @@ func (e *BatchPointGetExec) Open(context.Context) error { snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } snapshot.SetOption(kv.TaskID, e.ctx.GetSessionVars().StmtCtx.TaskID) + isStaleness := e.ctx.GetSessionVars().TxnCtx.IsStaleness + snapshot.SetOption(kv.IsStalenessReadOnly, isStaleness) + if isStaleness && e.ctx.GetSessionVars().TxnCtx.TxnScope != oracle.GlobalTxnScope { + snapshot.SetOption(kv.MatchStoreLabels, []*metapb.StoreLabel{ + { + Key: placement.DCLabelKey, + Value: e.ctx.GetSessionVars().TxnCtx.TxnScope, + }, + }) + } var batchGetter kv.BatchGetter = snapshot if txn.Valid() { - batchGetter = kv.NewBufferBatchGetter(txn.GetMemBuffer(), &PessimisticLockCacheGetter{txnCtx: txnCtx}, snapshot) + lock := e.tblInfo.Lock + if e.lock { + batchGetter = kv.NewBufferBatchGetter(txn.GetMemBuffer(), &PessimisticLockCacheGetter{txnCtx: txnCtx}, snapshot) + } else if lock != nil && (lock.Tp == model.TableLockRead || lock.Tp == model.TableLockReadOnly) && e.ctx.GetSessionVars().EnablePointGetCache { + batchGetter = newCacheBatchGetter(e.ctx, e.tblInfo.ID, snapshot) + } else { + batchGetter = kv.NewBufferBatchGetter(txn.GetMemBuffer(), nil, snapshot) + } } e.snapshot = snapshot e.batchGetter = batchGetter @@ -142,6 +159,9 @@ func (e *BatchPointGetExec) Next(ctx context.Context, req *chunk.Chunk) error { if err := e.initialize(ctx); err != nil { return err } + if e.lock { + e.updateDeltaForTableID(e.tblInfo.ID) + } } if e.index >= len(e.values) { @@ -177,10 +197,11 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { var indexKeys []kv.Key var err error batchGetter := e.batchGetter + rc := e.ctx.GetSessionVars().IsPessimisticReadConsistency() if e.idxInfo != nil && !isCommonHandleRead(e.tblInfo, e.idxInfo) { // `SELECT a, b FROM t WHERE (a, b) IN ((1, 2), (1, 2), (2, 1), (1, 2))` should not return duplicated rows dedup := make(map[hack.MutableString]struct{}) - keys := make([]kv.Key, 0, len(e.idxVals)) + toFetchIndexKeys := make([]kv.Key, 0, len(e.idxVals)) for _, idxVals := range e.idxVals { // For all x, 'x IN (null)' evaluate to null, so the query get no result. if datumsContainNull(idxVals) { @@ -197,34 +218,42 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { continue } dedup[s] = struct{}{} - keys = append(keys, idxKey) + toFetchIndexKeys = append(toFetchIndexKeys, idxKey) } if e.keepOrder { - sort.Slice(keys, func(i int, j int) bool { + sort.Slice(toFetchIndexKeys, func(i int, j int) bool { if e.desc { - return keys[i].Cmp(keys[j]) > 0 + return toFetchIndexKeys[i].Cmp(toFetchIndexKeys[j]) > 0 } - return keys[i].Cmp(keys[j]) < 0 + return toFetchIndexKeys[i].Cmp(toFetchIndexKeys[j]) < 0 }) } - indexKeys = keys + + // lock all keys in repeatable read isolation. + // for read consistency, only lock exist keys, + // indexKeys will be generated after getting handles. + if !rc { + indexKeys = toFetchIndexKeys + } else { + indexKeys = make([]kv.Key, 0, len(toFetchIndexKeys)) + } // SELECT * FROM t WHERE x IN (null), in this case there is no key. - if len(keys) == 0 { + if len(toFetchIndexKeys) == 0 { return nil } // Fetch all handles. - handleVals, err = batchGetter.BatchGet(ctx, keys) + handleVals, err = batchGetter.BatchGet(ctx, toFetchIndexKeys) if err != nil { return err } - e.handles = make([]kv.Handle, 0, len(keys)) + e.handles = make([]kv.Handle, 0, len(toFetchIndexKeys)) if e.tblInfo.Partition != nil { - e.physIDs = make([]int64, 0, len(keys)) + e.physIDs = make([]int64, 0, len(toFetchIndexKeys)) } - for _, key := range keys { + for _, key := range toFetchIndexKeys { handleVal := handleVals[string(key)] if len(handleVal) == 0 { continue @@ -234,8 +263,15 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { return err1 } e.handles = append(e.handles, handle) + if rc { + indexKeys = append(indexKeys, key) + } if e.tblInfo.Partition != nil { - e.physIDs = append(e.physIDs, tablecodec.DecodeTableID(key)) + pid := tablecodec.DecodeTableID(key) + e.physIDs = append(e.physIDs, pid) + if e.lock { + e.updateDeltaForTableID(pid) + } } } @@ -306,17 +342,11 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { } var values map[string][]byte - rc := e.ctx.GetSessionVars().IsPessimisticReadConsistency() // Lock keys (include exists and non-exists keys) before fetch all values for Repeatable Read Isolation. if e.lock && !rc { - lockKeys := make([]kv.Key, len(keys), len(keys)+len(indexKeys)) + lockKeys := make([]kv.Key, len(keys)+len(indexKeys)) copy(lockKeys, keys) - for _, idxKey := range indexKeys { - // lock the non-exist index key, using len(val) in case BatchGet result contains some zero len entries - if val := handleVals[string(idxKey)]; len(val) == 0 { - lockKeys = append(lockKeys, idxKey) - } - } + copy(lockKeys[len(keys):], indexKeys) err = LockKeys(ctx, e.ctx, e.waitTime, lockKeys...) if err != nil { return err @@ -330,7 +360,7 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { handles := make([]kv.Handle, 0, len(values)) var existKeys []kv.Key if e.lock && rc { - existKeys = make([]kv.Key, 0, len(values)) + existKeys = make([]kv.Key, 0, 2*len(values)) } e.values = make([][]byte, 0, len(values)) for i, key := range keys { @@ -346,6 +376,12 @@ func (e *BatchPointGetExec) initialize(ctx context.Context) error { handles = append(handles, e.handles[i]) if e.lock && rc { existKeys = append(existKeys, key) + // when e.handles is set in builder directly, index should be primary key and the plan is CommonHandleRead + // with clustered index enabled, indexKeys is empty in this situation + // lock primary key for clustered index table is redundant + if len(indexKeys) != 0 { + existKeys = append(existKeys, indexKeys[i]) + } } } // Lock exists keys only for Read Committed Isolation. @@ -407,3 +443,29 @@ func getPhysID(tblInfo *model.TableInfo, intVal int64) int64 { partIdx := math.Abs(intVal % int64(pi.Num)) return pi.Definitions[partIdx].ID } + +type cacheBatchGetter struct { + ctx sessionctx.Context + tid int64 + snapshot kv.Snapshot +} + +func (b *cacheBatchGetter) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { + cacheDB := b.ctx.GetStore().GetMemCache() + vals := make(map[string][]byte) + for _, key := range keys { + val, err := cacheDB.UnionGet(ctx, b.tid, b.snapshot, key) + if err != nil { + if !kv.ErrNotExist.Equal(err) { + return nil, err + } + continue + } + vals[string(key)] = val + } + return vals, nil +} + +func newCacheBatchGetter(ctx sessionctx.Context, tid int64, snapshot kv.Snapshot) *cacheBatchGetter { + return &cacheBatchGetter{ctx, tid, snapshot} +} diff --git a/executor/batch_point_get_test.go b/executor/batch_point_get_test.go index 468ba2e974cda..c41ac03156243 100644 --- a/executor/batch_point_get_test.go +++ b/executor/batch_point_get_test.go @@ -14,6 +14,10 @@ package executor_test import ( + "fmt" + "sync" + "time" + . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/tidb/domain" @@ -162,3 +166,146 @@ func (s *testBatchPointGetSuite) TestBatchPointGetUnsignedHandleWithSort(c *C) { tk.MustQuery("select id from t2 where id in (8738875760185212610, 1, 9814441339970117597) order by id").Check(testkit.Rows("1", "8738875760185212610", "9814441339970117597")) tk.MustQuery("select id from t2 where id in (8738875760185212610, 1, 9814441339970117597) order by id desc").Check(testkit.Rows("9814441339970117597", "8738875760185212610", "1")) } + +func (s *testBatchPointGetSuite) TestBatchPointGetLockExistKey(c *C) { + var wg sync.WaitGroup + errCh := make(chan error) + + testLock := func(rc bool, key string, tableName string) { + doneCh := make(chan struct{}, 1) + tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + + errCh <- tk1.ExecToErr("use test") + errCh <- tk2.ExecToErr("use test") + tk1.Se.GetSessionVars().EnableClusteredIndex = false + + errCh <- tk1.ExecToErr(fmt.Sprintf("drop table if exists %s", tableName)) + errCh <- tk1.ExecToErr(fmt.Sprintf("create table %s(id int, v int, k int, %s key0(id, v))", tableName, key)) + errCh <- tk1.ExecToErr(fmt.Sprintf("insert into %s values(1, 1, 1), (2, 2, 2)", tableName)) + + if rc { + errCh <- tk1.ExecToErr("set tx_isolation = 'READ-COMMITTED'") + errCh <- tk2.ExecToErr("set tx_isolation = 'READ-COMMITTED'") + } + + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + + // select for update + if !rc { + // lock exist key only for repeatable read + errCh <- tk1.ExecToErr(fmt.Sprintf("select * from %s where (id, v) in ((1, 1), (2, 2)) for update", tableName)) + } else { + // read committed will not lock non-exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("select * from %s where (id, v) in ((1, 1), (2, 2), (3, 3)) for update", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(3, 3, 3)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(1, 1, 10)", tableName)) + doneCh <- struct{}{} + }() + + time.Sleep(150 * time.Millisecond) + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v = 2 where id = 1 and v = 1", tableName)) + + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 2 2", + "3 3 3", + "1 1 10", + )) + + // update + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + if !rc { + // lock exist key only for repeatable read + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v = v + 1 where (id, v) in ((2, 2), (3, 3))", tableName)) + } else { + // read committed will not lock non-exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v = v + 1 where (id, v) in ((2, 2), (3, 3), (4, 4))", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(4, 4, 4)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(3, 3, 30)", tableName)) + doneCh <- struct{}{} + }() + time.Sleep(150 * time.Millisecond) + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 3 2", + "3 4 3", + "1 1 10", + "4 4 4", + "3 3 30", + )) + + // delete + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + if !rc { + // lock exist key only for repeatable read + errCh <- tk1.ExecToErr(fmt.Sprintf("delete from %s where (id, v) in ((3, 4), (4, 4))", tableName)) + } else { + // read committed will not lock non-exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("delete from %s where (id, v) in ((3, 4), (4, 4), (5, 5))", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(5, 5, 5)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(4, 4,40)", tableName)) + doneCh <- struct{}{} + }() + time.Sleep(150 * time.Millisecond) + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 3 2", + "1 1 10", + "3 3 30", + "5 5 5", + "4 4 40", + )) + wg.Done() + } + + for i, one := range []struct { + rc bool + key string + }{ + {rc: false, key: "primary key"}, + {rc: false, key: "unique key"}, + {rc: true, key: "primary key"}, + {rc: true, key: "unique key"}, + } { + wg.Add(1) + tableName := fmt.Sprintf("t_%d", i) + go testLock(one.rc, one.key, tableName) + } + + // should works for common handle in clustered index + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id varchar(40) primary key)") + tk.MustExec("insert into t values('1'), ('2')") + tk.MustExec("set tx_isolation = 'READ-COMMITTED'") + tk.MustExec("begin pessimistic") + tk.MustExec("select * from t where id in('1', '2') for update") + tk.MustExec("commit") + + go func() { + wg.Wait() + close(errCh) + }() + for err := range errCh { + c.Assert(err, IsNil) + } +} diff --git a/executor/benchmark_test.go b/executor/benchmark_test.go index 8afe822ce8f12..2bc89bda9f737 100644 --- a/executor/benchmark_test.go +++ b/executor/benchmark_test.go @@ -17,8 +17,11 @@ import ( "context" "encoding/base64" "fmt" + "io/ioutil" "math/rand" + "os" "sort" + "strconv" "strings" "sync" "testing" @@ -27,9 +30,11 @@ import ( "github.com/pingcap/log" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/planner/core" + plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" @@ -86,6 +91,10 @@ func (mp *mockDataPhysicalPlan) ExplainID() fmt.Stringer { }) } +func (mp *mockDataPhysicalPlan) ID() int { + return 0 +} + func (mp *mockDataPhysicalPlan) Stats() *property.StatsInfo { return nil } @@ -94,6 +103,13 @@ func (mp *mockDataPhysicalPlan) SelectBlockOffset() int { return 0 } +func buildMockDataPhysicalPlan(ctx sessionctx.Context, srcExec Executor) *mockDataPhysicalPlan { + return &mockDataPhysicalPlan{ + schema: srcExec.Schema(), + exec: srcExec, + } +} + func (mds *mockDataSource) genColDatums(col int) (results []interface{}) { typ := mds.retFieldTypes[col] order := false @@ -234,13 +250,14 @@ func buildMockDataSourceWithIndex(opt mockDataSourceParameters, index []int) *mo // aggTestCase has a fixed schema (aggCol Double, groupBy LongLong). type aggTestCase struct { - execType string // "hash" or "stream" - aggFunc string // sum, avg, count .... - groupByNDV int // the number of distinct group-by keys - hasDistinct bool - rows int - concurrency int - ctx sessionctx.Context + execType string // "hash" or "stream" + aggFunc string // sum, avg, count .... + groupByNDV int // the number of distinct group-by keys + hasDistinct bool + rows int + concurrency int + dataSourceSorted bool + ctx sessionctx.Context } func (a aggTestCase) columns() []*expression.Column { @@ -251,15 +268,15 @@ func (a aggTestCase) columns() []*expression.Column { } func (a aggTestCase) String() string { - return fmt.Sprintf("(execType:%v, aggFunc:%v, ndv:%v, hasDistinct:%v, rows:%v, concurrency:%v)", - a.execType, a.aggFunc, a.groupByNDV, a.hasDistinct, a.rows, a.concurrency) + return fmt.Sprintf("(execType:%v, aggFunc:%v, ndv:%v, hasDistinct:%v, rows:%v, concurrency:%v, sorted:%v)", + a.execType, a.aggFunc, a.groupByNDV, a.hasDistinct, a.rows, a.concurrency, a.dataSourceSorted) } func defaultAggTestCase(exec string) *aggTestCase { ctx := mock.NewContext() ctx.GetSessionVars().InitChunkSize = variable.DefInitChunkSize ctx.GetSessionVars().MaxChunkSize = variable.DefMaxChunkSize - return &aggTestCase{exec, ast.AggFuncSum, 1000, false, 10000000, 4, ctx} + return &aggTestCase{exec, ast.AggFuncSum, 1000, false, 10000000, 4, true, ctx} } func buildHashAggExecutor(ctx sessionctx.Context, src Executor, schema *expression.Schema, @@ -277,28 +294,68 @@ func buildHashAggExecutor(ctx sessionctx.Context, src Executor, schema *expressi return exec } -func buildStreamAggExecutor(ctx sessionctx.Context, src Executor, schema *expression.Schema, - aggFuncs []*aggregation.AggFuncDesc, groupItems []expression.Expression) Executor { - plan := new(core.PhysicalStreamAgg) - plan.AggFuncs = aggFuncs - plan.GroupByItems = groupItems - plan.SetSchema(schema) - plan.Init(ctx, nil, 0) - plan.SetChildren(nil) +func buildStreamAggExecutor(ctx sessionctx.Context, srcExec Executor, schema *expression.Schema, + aggFuncs []*aggregation.AggFuncDesc, groupItems []expression.Expression, concurrency int, dataSourceSorted bool) Executor { + src := buildMockDataPhysicalPlan(ctx, srcExec) + + sg := new(core.PhysicalStreamAgg) + sg.AggFuncs = aggFuncs + sg.GroupByItems = groupItems + sg.SetSchema(schema) + sg.Init(ctx, nil, 0) + + var tail core.PhysicalPlan = sg + // if data source is not sorted, we have to attach sort, to make the input of stream-agg sorted + if !dataSourceSorted { + byItems := make([]*util.ByItems, 0, len(sg.GroupByItems)) + for _, col := range sg.GroupByItems { + byItems = append(byItems, &util.ByItems{Expr: col, Desc: false}) + } + sortPP := &core.PhysicalSort{ByItems: byItems} + sortPP.SetChildren(src) + sg.SetChildren(sortPP) + tail = sortPP + } else { + sg.SetChildren(src) + } + + var ( + plan core.PhysicalPlan + splitter core.PartitionSplitterType = core.PartitionHashSplitterType + ) + if concurrency > 1 { + if dataSourceSorted { + splitter = core.PartitionRangeSplitterType + } + plan = core.PhysicalShuffle{ + Concurrency: concurrency, + Tails: []core.PhysicalPlan{tail}, + DataSources: []core.PhysicalPlan{src}, + SplitterType: splitter, + ByItemArrays: [][]expression.Expression{sg.GroupByItems}, + }.Init(ctx, nil, 0) + plan.SetChildren(sg) + } else { + plan = sg + } + b := newExecutorBuilder(ctx, nil) - exec := b.build(plan) - streamAgg := exec.(*StreamAggExec) - streamAgg.children[0] = src - return exec + return b.build(plan) } func buildAggExecutor(b *testing.B, testCase *aggTestCase, child Executor) Executor { ctx := testCase.ctx - if err := ctx.GetSessionVars().SetSystemVar(variable.TiDBHashAggFinalConcurrency, fmt.Sprintf("%v", testCase.concurrency)); err != nil { - b.Fatal(err) - } - if err := ctx.GetSessionVars().SetSystemVar(variable.TiDBHashAggPartialConcurrency, fmt.Sprintf("%v", testCase.concurrency)); err != nil { - b.Fatal(err) + if testCase.execType == "stream" { + if err := ctx.GetSessionVars().SetSystemVar(variable.TiDBStreamAggConcurrency, fmt.Sprintf("%v", testCase.concurrency)); err != nil { + b.Fatal(err) + } + } else { + if err := ctx.GetSessionVars().SetSystemVar(variable.TiDBHashAggFinalConcurrency, fmt.Sprintf("%v", testCase.concurrency)); err != nil { + b.Fatal(err) + } + if err := ctx.GetSessionVars().SetSystemVar(variable.TiDBHashAggPartialConcurrency, fmt.Sprintf("%v", testCase.concurrency)); err != nil { + b.Fatal(err) + } } childCols := testCase.columns() @@ -315,7 +372,7 @@ func buildAggExecutor(b *testing.B, testCase *aggTestCase, child Executor) Execu case "hash": aggExec = buildHashAggExecutor(testCase.ctx, child, schema, aggFuncs, groupBy) case "stream": - aggExec = buildStreamAggExecutor(testCase.ctx, child, schema, aggFuncs, groupBy) + aggExec = buildStreamAggExecutor(testCase.ctx, child, schema, aggFuncs, groupBy, testCase.concurrency, testCase.dataSourceSorted) default: b.Fatal("not implement") } @@ -323,12 +380,15 @@ func buildAggExecutor(b *testing.B, testCase *aggTestCase, child Executor) Execu } func benchmarkAggExecWithCase(b *testing.B, casTest *aggTestCase) { + if err := casTest.ctx.GetSessionVars().SetSystemVar(variable.TiDBStreamAggConcurrency, fmt.Sprintf("%v", casTest.concurrency)); err != nil { + b.Fatal(err) + } + cols := casTest.columns() - orders := []bool{false, casTest.execType == "stream"} dataSource := buildMockDataSource(mockDataSourceParameters{ schema: expression.NewSchema(cols...), ndvs: []int{0, casTest.groupByNDV}, - orders: orders, + orders: []bool{false, casTest.dataSourceSorted}, rows: casTest.rows, ctx: casTest.ctx, }) @@ -361,17 +421,17 @@ func benchmarkAggExecWithCase(b *testing.B, casTest *aggTestCase) { } } -func BenchmarkAggRows(b *testing.B) { - rows := []int{100000, 1000000, 10000000} - concurrencies := []int{1, 4, 8, 15, 20, 30, 40} +func BenchmarkShuffleStreamAggRows(b *testing.B) { + b.ReportAllocs() + sortTypes := []bool{false, true} + rows := []int{10000, 100000, 1000000, 10000000} + concurrencies := []int{1, 2, 4, 8} for _, row := range rows { for _, con := range concurrencies { - for _, exec := range []string{"hash", "stream"} { - if exec == "stream" && con > 1 { - continue - } - cas := defaultAggTestCase(exec) + for _, sorted := range sortTypes { + cas := defaultAggTestCase("stream") cas.rows = row + cas.dataSourceSorted = sorted cas.concurrency = con b.Run(fmt.Sprintf("%v", cas), func(b *testing.B) { benchmarkAggExecWithCase(b, cas) @@ -381,6 +441,21 @@ func BenchmarkAggRows(b *testing.B) { } } +func BenchmarkHashAggRows(b *testing.B) { + rows := []int{100000, 1000000, 10000000} + concurrencies := []int{1, 4, 8, 15, 20, 30, 40} + for _, row := range rows { + for _, con := range concurrencies { + cas := defaultAggTestCase("hash") + cas.rows = row + cas.concurrency = con + b.Run(fmt.Sprintf("%v", cas), func(b *testing.B) { + benchmarkAggExecWithCase(b, cas) + }) + } + } +} + func BenchmarkAggGroupByNDV(b *testing.B) { NDVs := []int{10, 100, 1000, 10000, 100000, 1000000, 10000000} for _, NDV := range NDVs { @@ -398,9 +473,6 @@ func BenchmarkAggConcurrency(b *testing.B) { concs := []int{1, 4, 8, 15, 20, 30, 40} for _, con := range concs { for _, exec := range []string{"hash", "stream"} { - if exec == "stream" && con > 1 { - continue - } cas := defaultAggTestCase(exec) cas.concurrency = con b.Run(fmt.Sprintf("%v", cas), func(b *testing.B) { @@ -428,11 +500,7 @@ func BenchmarkAggDistinct(b *testing.B) { } func buildWindowExecutor(ctx sessionctx.Context, windowFunc string, funcs int, frame *core.WindowFrame, srcExec Executor, schema *expression.Schema, partitionBy []*expression.Column, concurrency int, dataSourceSorted bool) Executor { - src := &mockDataPhysicalPlan{ - schema: srcExec.Schema(), - exec: srcExec, - } - + src := buildMockDataPhysicalPlan(ctx, srcExec) win := new(core.PhysicalWindow) win.WindowFuncDescs = make([]*aggregation.WindowFuncDesc, 0) winSchema := schema.Clone() @@ -463,7 +531,7 @@ func buildWindowExecutor(ctx sessionctx.Context, windowFunc string, funcs int, f }) } for _, col := range partitionBy { - win.PartitionBy = append(win.PartitionBy, property.Item{Col: col}) + win.PartitionBy = append(win.PartitionBy, property.SortItem{Col: col}) } win.Frame = frame win.OrderBy = nil @@ -494,10 +562,10 @@ func buildWindowExecutor(ctx sessionctx.Context, windowFunc string, funcs int, f plan = core.PhysicalShuffle{ Concurrency: concurrency, - Tail: tail, - DataSource: src, + Tails: []plannercore.PhysicalPlan{tail}, + DataSources: []plannercore.PhysicalPlan{src}, SplitterType: core.PartitionHashSplitterType, - HashByItems: byItems, + ByItemArrays: [][]expression.Expression{byItems}, }.Init(ctx, nil, 0) plan.SetChildren(win) } else { @@ -1136,6 +1204,8 @@ type indexJoinTestCase struct { ctx sessionctx.Context outerJoinKeyIdx []int innerJoinKeyIdx []int + outerHashKeyIdx []int + innerHashKeyIdx []int innerIdx []int needOuterSort bool rawData string @@ -1163,6 +1233,8 @@ func defaultIndexJoinTestCase() *indexJoinTestCase { ctx: ctx, outerJoinKeyIdx: []int{0, 1}, innerJoinKeyIdx: []int{0, 1}, + outerHashKeyIdx: []int{0, 1}, + innerHashKeyIdx: []int{0, 1}, innerIdx: []int{0, 1}, rawData: wideString, } @@ -1212,12 +1284,14 @@ func prepare4IndexInnerHashJoin(tc *indexJoinTestCase, outerDS *mockDataSource, outerCtx: outerCtx{ rowTypes: leftTypes, keyCols: tc.outerJoinKeyIdx, + hashCols: tc.outerHashKeyIdx, }, innerCtx: innerCtx{ readerBuilder: &dataReaderBuilder{Plan: &mockPhysicalIndexReader{e: innerDS}, executorBuilder: newExecutorBuilder(tc.ctx, nil)}, rowTypes: rightTypes, colLens: colLens, keyCols: tc.innerJoinKeyIdx, + hashCols: tc.innerHashKeyIdx, }, workerWg: new(sync.WaitGroup), joiner: newJoiner(tc.ctx, 0, false, defaultValues, nil, leftTypes, rightTypes, nil), @@ -1389,7 +1463,43 @@ type mergeJoinTestCase struct { childrenUsedSchema [][]bool } -func prepare4MergeJoin(tc *mergeJoinTestCase, leftExec, rightExec *mockDataSource) *MergeJoinExec { +func prepareMergeJoinExec(tc *mergeJoinTestCase, joinSchema *expression.Schema, leftExec, rightExec Executor, defaultValues []types.Datum, + compareFuncs []expression.CompareFunc, innerJoinKeys []*expression.Column, outerJoinKeys []*expression.Column) *MergeJoinExec { + // only benchmark inner join + mergeJoinExec := &MergeJoinExec{ + stmtCtx: tc.ctx.GetSessionVars().StmtCtx, + baseExecutor: newBaseExecutor(tc.ctx, joinSchema, 3, leftExec, rightExec), + compareFuncs: compareFuncs, + isOuterJoin: false, + } + + mergeJoinExec.joiner = newJoiner( + tc.ctx, + 0, + false, + defaultValues, + nil, + retTypes(leftExec), + retTypes(rightExec), + tc.childrenUsedSchema, + ) + + mergeJoinExec.innerTable = &mergeJoinTable{ + isInner: true, + childIndex: 1, + joinKeys: innerJoinKeys, + } + + mergeJoinExec.outerTable = &mergeJoinTable{ + childIndex: 0, + filters: nil, + joinKeys: outerJoinKeys, + } + + return mergeJoinExec +} + +func prepare4MergeJoin(tc *mergeJoinTestCase, innerDS, outerDS *mockDataSource, sorted bool, concurrency int) Executor { outerCols, innerCols := tc.columns(), tc.columns() joinSchema := expression.NewSchema() @@ -1418,43 +1528,88 @@ func prepare4MergeJoin(tc *mergeJoinTestCase, leftExec, rightExec *mockDataSourc innerJoinKeys = append(innerJoinKeys, innerCols[keyIdx]) } compareFuncs := make([]expression.CompareFunc, 0, len(outerJoinKeys)) - outerCompareFuncs := make([]expression.CompareFunc, 0, len(outerJoinKeys)) for i := range outerJoinKeys { compareFuncs = append(compareFuncs, expression.GetCmpFunction(nil, outerJoinKeys[i], innerJoinKeys[i])) - outerCompareFuncs = append(outerCompareFuncs, expression.GetCmpFunction(nil, outerJoinKeys[i], outerJoinKeys[i])) } defaultValues := make([]types.Datum, len(innerCols)) - // only benchmark inner join - e := &MergeJoinExec{ - stmtCtx: tc.ctx.GetSessionVars().StmtCtx, - baseExecutor: newBaseExecutor(tc.ctx, joinSchema, 3, leftExec, rightExec), - compareFuncs: compareFuncs, - isOuterJoin: false, + var leftExec, rightExec Executor + if sorted { + leftSortExec := &SortExec{ + baseExecutor: newBaseExecutor(tc.ctx, innerDS.schema, 3, innerDS), + ByItems: make([]*util.ByItems, 0, len(tc.innerJoinKeyIdx)), + schema: innerDS.schema, + } + for _, key := range innerJoinKeys { + leftSortExec.ByItems = append(leftSortExec.ByItems, &util.ByItems{Expr: key}) + } + leftExec = leftSortExec + + rightSortExec := &SortExec{ + baseExecutor: newBaseExecutor(tc.ctx, outerDS.schema, 4, outerDS), + ByItems: make([]*util.ByItems, 0, len(tc.outerJoinKeyIdx)), + schema: outerDS.schema, + } + for _, key := range outerJoinKeys { + rightSortExec.ByItems = append(rightSortExec.ByItems, &util.ByItems{Expr: key}) + } + rightExec = rightSortExec + } else { + leftExec = innerDS + rightExec = outerDS } - e.joiner = newJoiner( - tc.ctx, - 0, - false, - defaultValues, - nil, - retTypes(leftExec), - retTypes(rightExec), - tc.childrenUsedSchema, - ) + var e Executor + if concurrency == 1 { + e = prepareMergeJoinExec(tc, joinSchema, leftExec, rightExec, defaultValues, compareFuncs, innerJoinKeys, outerJoinKeys) + } else { + // build dataSources + dataSources := []Executor{leftExec, rightExec} + // build splitters + innerByItems := make([]expression.Expression, 0, len(innerJoinKeys)) + for _, innerJoinKey := range innerJoinKeys { + innerByItems = append(innerByItems, innerJoinKey) + } + outerByItems := make([]expression.Expression, 0, len(outerJoinKeys)) + for _, outerJoinKey := range outerJoinKeys { + outerByItems = append(outerByItems, outerJoinKey) + } + splitters := []partitionSplitter{ + &partitionHashSplitter{ + byItems: innerByItems, + numWorkers: concurrency, + }, + &partitionHashSplitter{ + byItems: outerByItems, + numWorkers: concurrency, + }, + } + // build ShuffleMergeJoinExec + shuffle := &ShuffleExec{ + baseExecutor: newBaseExecutor(tc.ctx, joinSchema, 4), + concurrency: concurrency, + dataSources: dataSources, + splitters: splitters, + } - e.innerTable = &mergeJoinTable{ - isInner: true, - childIndex: 1, - joinKeys: innerJoinKeys, - } + // build workers, only benchmark inner join + shuffle.workers = make([]*shuffleWorker, shuffle.concurrency) + for i := range shuffle.workers { + leftReceiver := shuffleReceiver{ + baseExecutor: newBaseExecutor(tc.ctx, leftExec.Schema(), 0), + } + rightReceiver := shuffleReceiver{ + baseExecutor: newBaseExecutor(tc.ctx, rightExec.Schema(), 0), + } + w := &shuffleWorker{ + receivers: []*shuffleReceiver{&leftReceiver, &rightReceiver}, + } + w.childExec = prepareMergeJoinExec(tc, joinSchema, &leftReceiver, &rightReceiver, defaultValues, compareFuncs, innerJoinKeys, outerJoinKeys) - e.outerTable = &mergeJoinTable{ - childIndex: 0, - filters: nil, - joinKeys: outerJoinKeys, + shuffle.workers[i] = w + } + e = shuffle } return e @@ -1480,6 +1635,8 @@ func newMergeJoinBenchmark(numOuterRows, numInnerDup, numInnerRedundant int) (tc ctx: ctx, outerJoinKeyIdx: []int{0, 1}, innerJoinKeyIdx: []int{0, 1}, + outerHashKeyIdx: []int{0, 1}, + innerHashKeyIdx: []int{0, 1}, innerIdx: []int{0, 1}, rawData: wideString, } @@ -1540,7 +1697,7 @@ func benchmarkMergeJoinExecWithCase(b *testing.B, tc *mergeJoinTestCase, innerDS var exec Executor switch joinType { case innerMergeJoin: - exec = prepare4MergeJoin(tc, innerDS, outerDS) + exec = prepare4MergeJoin(tc, innerDS, outerDS, true, 2) } tmpCtx := context.Background() @@ -1709,3 +1866,208 @@ func BenchmarkSortExec(b *testing.B) { }) } } + +type limitCase struct { + rows int + offset int + count int + childUsedSchema []bool + usingInlineProjection bool + ctx sessionctx.Context +} + +func (tc limitCase) columns() []*expression.Column { + return []*expression.Column{ + {Index: 0, RetType: types.NewFieldType(mysql.TypeLonglong)}, + {Index: 1, RetType: types.NewFieldType(mysql.TypeLonglong)}, + } +} + +func (tc limitCase) String() string { + return fmt.Sprintf("(rows:%v, offset:%v, count:%v, inline_projection:%v)", + tc.rows, tc.offset, tc.count, tc.usingInlineProjection) +} + +func defaultLimitTestCase() *limitCase { + ctx := mock.NewContext() + ctx.GetSessionVars().InitChunkSize = variable.DefInitChunkSize + ctx.GetSessionVars().MaxChunkSize = variable.DefMaxChunkSize + ctx.GetSessionVars().StmtCtx.MemTracker = memory.NewTracker(-1, -1) + tc := &limitCase{ + rows: 30000, + offset: 10000, + count: 10000, + childUsedSchema: []bool{false, true}, + usingInlineProjection: false, + ctx: ctx, + } + return tc +} + +func benchmarkLimitExec(b *testing.B, cas *limitCase) { + opt := mockDataSourceParameters{ + schema: expression.NewSchema(cas.columns()...), + rows: cas.rows, + ctx: cas.ctx, + } + dataSource := buildMockDataSource(opt) + var exec Executor + limit := &LimitExec{ + baseExecutor: newBaseExecutor(cas.ctx, dataSource.schema, 4, dataSource), + begin: uint64(cas.offset), + end: uint64(cas.offset + cas.count), + } + if cas.usingInlineProjection { + if len(cas.childUsedSchema) > 0 { + limit.columnIdxsUsedByChild = make([]int, 0, len(cas.childUsedSchema)) + for i, used := range cas.childUsedSchema { + if used { + limit.columnIdxsUsedByChild = append(limit.columnIdxsUsedByChild, i) + } + } + } + exec = limit + } else { + columns := cas.columns() + usedCols := make([]*expression.Column, 0, len(columns)) + exprs := make([]expression.Expression, 0, len(columns)) + for i, used := range cas.childUsedSchema { + if used { + usedCols = append(usedCols, columns[i]) + exprs = append(exprs, columns[i]) + } + } + proj := &ProjectionExec{ + baseExecutor: newBaseExecutor(cas.ctx, expression.NewSchema(usedCols...), 0, limit), + numWorkers: 1, + evaluatorSuit: expression.NewEvaluatorSuite(exprs, false), + } + exec = proj + } + + b.ResetTimer() + for i := 0; i < b.N; i++ { + b.StopTimer() + tmpCtx := context.Background() + chk := newFirstChunk(exec) + dataSource.prepareChunks() + + b.StartTimer() + if err := exec.Open(tmpCtx); err != nil { + b.Fatal(err) + } + for { + if err := exec.Next(tmpCtx, chk); err != nil { + b.Fatal(err) + } + if chk.NumRows() == 0 { + break + } + } + + if err := exec.Close(); err != nil { + b.Fatal(err) + } + b.StopTimer() + } +} + +func BenchmarkLimitExec(b *testing.B) { + b.ReportAllocs() + cas := defaultLimitTestCase() + usingInlineProjection := []bool{false, true} + for _, inlineProjection := range usingInlineProjection { + cas.usingInlineProjection = inlineProjection + b.Run(fmt.Sprintf("%v", cas), func(b *testing.B) { + benchmarkLimitExec(b, cas) + }) + } +} + +func BenchmarkReadLastLinesOfHugeLine(b *testing.B) { + // step 1. initial a huge line log file + hugeLine := make([]byte, 1024*1024*10) + for i := range hugeLine { + hugeLine[i] = 'a' + byte(i%26) + } + fileName := "tidb.log" + err := ioutil.WriteFile(fileName, hugeLine, 0644) + if err != nil { + b.Fatal(err) + } + file, err := os.OpenFile(fileName, os.O_RDONLY, os.ModePerm) + if err != nil { + b.Fatal(err) + } + defer func() { + file.Close() + os.Remove(fileName) + }() + stat, _ := file.Stat() + filesize := stat.Size() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, n, err := readLastLines(context.Background(), file, filesize) + if err != nil { + b.Fatal(err) + } + if n != len(hugeLine) { + b.Fatalf("len %v, expected: %v", n, len(hugeLine)) + } + } +} + +func BenchmarkAggPartialResultMapperMemoryUsage(b *testing.B) { + b.ReportAllocs() + type testCase struct { + rowNum int + expectedB int + } + cases := []testCase{ + { + rowNum: 0, + expectedB: 0, + }, + { + rowNum: 100, + expectedB: 4, + }, + { + rowNum: 10000, + expectedB: 11, + }, + { + rowNum: 1000000, + expectedB: 18, + }, + { + rowNum: 851968, // 6.5 * (1 << 17) + expectedB: 17, + }, + { + rowNum: 851969, // 6.5 * (1 << 17) + 1 + expectedB: 18, + }, + { + rowNum: 425984, // 6.5 * (1 << 16) + expectedB: 16, + }, + { + rowNum: 425985, // 6.5 * (1 << 16) + 1 + expectedB: 17, + }, + } + + for _, c := range cases { + b.Run(fmt.Sprintf("MapRows %v", c.rowNum), func(b *testing.B) { + b.ReportAllocs() + for i := 0; i < b.N; i++ { + aggMap := make(aggPartialResultMapper) + tempSlice := make([]aggfuncs.PartialResult, 10) + for num := 0; num < c.rowNum; num++ { + aggMap[strconv.Itoa(num)] = tempSlice + } + } + }) + } +} diff --git a/executor/brie.go b/executor/brie.go index 4dd86aa9fdb1b..e26da72d3647b 100644 --- a/executor/brie.go +++ b/executor/brie.go @@ -39,9 +39,10 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tidb/util/sqlexec" ) @@ -164,7 +165,7 @@ func (b *executorBuilder) parseTSString(ts string) (uint64, error) { if err != nil { return 0, err } - return variable.GoTimeToTS(t1), nil + return oracle.GoTimeToTS(t1), nil } func (b *executorBuilder) buildBRIE(s *ast.BRIEStmt, schema *expression.Schema) Executor { @@ -403,6 +404,7 @@ func (gs *tidbGlueSession) CreateSession(store kv.Storage) (glue.Session, error) // Execute implements glue.Session func (gs *tidbGlueSession) Execute(ctx context.Context, sql string) error { + // FIXME: br relies on a deprecated API, it may be unsafe _, err := gs.se.(sqlexec.SQLExecutor).Execute(ctx, sql) return err } @@ -465,3 +467,7 @@ func (gs *tidbGlueSession) Record(name string, value uint64) { gs.info.archiveSize = value } } + +func (gs *tidbGlueSession) GetVersion() string { + return "TiDB\n" + printer.GetTiDBInfo() +} diff --git a/executor/brie_test.go b/executor/brie_test.go new file mode 100644 index 0000000000000..4393e9552128b --- /dev/null +++ b/executor/brie_test.go @@ -0,0 +1,28 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import . "github.com/pingcap/check" + +type testBRIESuite struct{} + +var _ = Suite(&testBRIESuite{}) + +func (s *testPartitionSuite) TestGlueGetVersion(c *C) { + g := tidbGlueSession{} + version := g.GetVersion() + c.Assert(version, Matches, `(.|\n)*Release Version(.|\n)*`) + c.Assert(version, Matches, `(.|\n)*Git Commit Hash(.|\n)*`) + c.Assert(version, Matches, `(.|\n)*GoVersion(.|\n)*`) +} diff --git a/executor/builder.go b/executor/builder.go index cbedfc175399b..c40e36797a432 100644 --- a/executor/builder.go +++ b/executor/builder.go @@ -24,6 +24,7 @@ import ( "github.com/cznic/mathutil" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/diagnosticspb" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/auth" @@ -73,11 +74,13 @@ var ( // executorBuilder builds an Executor from a Plan. // The InfoSchema must not change during execution. type executorBuilder struct { - ctx sessionctx.Context - is infoschema.InfoSchema - snapshotTS uint64 // The consistent snapshot timestamp for the executor to read data. - err error // err is set when there is error happened during Executor building process. - hasLock bool + ctx sessionctx.Context + is infoschema.InfoSchema + snapshotTS uint64 // The consistent snapshot timestamp for the executor to read data. + snapshotTSCached bool + err error // err is set when there is error happened during Executor building process. + hasLock bool + mppTaskID int64 } func newExecutorBuilder(ctx sessionctx.Context, is infoschema.InfoSchema) *executorBuilder { @@ -162,6 +165,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildShow(v) case *plannercore.Simple: return b.buildSimple(v) + case *plannercore.PhysicalSimpleWrapper: + return b.buildSimple(&v.Inner) case *plannercore.Set: return b.buildSet(v) case *plannercore.SetConfig: @@ -206,6 +211,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildAnalyze(v) case *plannercore.PhysicalTableReader: return b.buildTableReader(v) + case *plannercore.PhysicalTableSample: + return b.buildTableSample(v) case *plannercore.PhysicalIndexReader: return b.buildIndexReader(v) case *plannercore.PhysicalIndexLookUpReader: @@ -214,8 +221,8 @@ func (b *executorBuilder) build(p plannercore.Plan) Executor { return b.buildWindow(v) case *plannercore.PhysicalShuffle: return b.buildShuffle(v) - case *plannercore.PhysicalShuffleDataSourceStub: - return b.buildShuffleDataSourceStub(v) + case *plannercore.PhysicalShuffleReceiverStub: + return b.buildShuffleReceiverStub(v) case *plannercore.SQLBindPlan: return b.buildSQLBindExec(v) case *plannercore.SplitRegion: @@ -614,6 +621,17 @@ func (b *executorBuilder) buildLimit(v *plannercore.PhysicalLimit) Executor { begin: v.Offset, end: v.Offset + v.Count, } + + childUsedSchema := markChildrenUsedCols(v.Schema(), v.Children()[0].Schema())[0] + e.columnIdxsUsedByChild = make([]int, 0, len(childUsedSchema)) + for i, used := range childUsedSchema { + if used { + e.columnIdxsUsedByChild = append(e.columnIdxsUsedByChild, i) + } + } + if len(e.columnIdxsUsedByChild) == len(childUsedSchema) { + e.columnIdxsUsedByChild = nil // indicates that all columns are used. LimitExec will improve performance for this condition. + } return e } @@ -690,6 +708,7 @@ func (b *executorBuilder) buildSimple(v *plannercore.Simple) Executor { e := &SimpleExec{ baseExecutor: base, Statement: v.Statement, + IsFromRemote: v.IsFromRemote, is: b.is, } return e @@ -743,6 +762,7 @@ func (b *executorBuilder) buildInsert(v *plannercore.Insert) Executor { allAssignmentsAreConstant: v.AllAssignmentsAreConstant, hasRefCols: v.NeedFillDefaultValue, SelectExec: selectExec, + rowLen: v.RowLen, } err := ivs.initInsertColumns() if err != nil { @@ -771,6 +791,8 @@ func (b *executorBuilder) buildLoadData(v *plannercore.LoadData) Executor { Table: tbl, Columns: v.Columns, GenExprs: v.GenCols.Exprs, + isLoadData: true, + txnInUse: sync.Mutex{}, } loadDataInfo := &LoadDataInfo{ row: make([]types.Datum, 0, len(insertVal.insertColumns)), @@ -945,7 +967,7 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco } return x } - // If reader is union, it means a partitiont table and we should transfer as above. + // If reader is union, it means a partition table and we should transfer as above. if x, ok := reader.(*UnionExec); ok { for i, child := range x.children { x.children[i] = b.buildUnionScanFromReader(child, v) @@ -969,13 +991,6 @@ func (b *executorBuilder) buildUnionScanFromReader(reader Executor, v *plannerco switch x := reader.(type) { case *TableReaderExecutor: us.desc = x.desc - // Union scan can only be in a write transaction, so DirtyDB should has non-nil value now, thus - // GetDirtyDB() is safe here. If this table has been modified in the transaction, non-nil DirtyTable - // can be found in DirtyDB now, so GetDirtyTable is safe; if this table has not been modified in the - // transaction, empty DirtyTable would be inserted into DirtyDB, it does not matter when multiple - // goroutines write empty DirtyTable to DirtyDB for this table concurrently. Although the DirtyDB looks - // safe for data race in all the cases, the map of golang will throw panic when it's accessed in parallel. - // So we lock it when getting dirty table. us.conditions, us.conditionsWithVirCol = plannercore.SplitSelCondsWithVirtualColumn(v.Conditions) us.columns = x.columns us.table = x.table @@ -1348,24 +1363,42 @@ func (b *executorBuilder) buildTableDual(v *plannercore.PhysicalTableDual) Execu return e } +// `getSnapshotTS` returns the timestamp of the snapshot that a reader should read. func (b *executorBuilder) getSnapshotTS() (uint64, error) { + // `refreshForUpdateTSForRC` should always be invoked before returning the cached value to + // ensure the correct value is returned even the `snapshotTS` field is already set by other + // logics. However for `IndexLookUpMergeJoin` and `IndexLookUpHashJoin`, it requires caching the + // snapshotTS and and may even use it after the txn being destroyed. In this case, mark + // `snapshotTSCached` to skip `refreshForUpdateTSForRC`. + if b.snapshotTSCached { + return b.snapshotTS, nil + } + + if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { + if err := b.refreshForUpdateTSForRC(); err != nil { + return 0, err + } + } + if b.snapshotTS != 0 { + b.snapshotTSCached = true // Return the cached value. return b.snapshotTS, nil } snapshotTS := b.ctx.GetSessionVars().SnapshotTS - txn, err := b.ctx.Txn(true) - if err != nil { - return 0, err - } if snapshotTS == 0 { + txn, err := b.ctx.Txn(true) + if err != nil { + return 0, err + } snapshotTS = txn.StartTS() } b.snapshotTS = snapshotTS if b.snapshotTS == 0 { return 0, errors.Trace(ErrGetStartTS) } + b.snapshotTSCached = true return snapshotTS, nil } @@ -1502,7 +1535,11 @@ func (b *executorBuilder) buildMemTable(v *plannercore.PhysicalMemTable) Executo strings.ToLower(infoschema.TableStatementsSummary), strings.ToLower(infoschema.TableStatementsSummaryHistory), strings.ToLower(infoschema.ClusterTableStatementsSummary), - strings.ToLower(infoschema.ClusterTableStatementsSummaryHistory): + strings.ToLower(infoschema.ClusterTableStatementsSummaryHistory), + strings.ToLower(infoschema.TablePlacementPolicy), + strings.ToLower(infoschema.TableClientErrorsSummaryGlobal), + strings.ToLower(infoschema.TableClientErrorsSummaryByUser), + strings.ToLower(infoschema.TableClientErrorsSummaryByHost): return &MemTableReaderExec{ baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), table: v.Table, @@ -1683,7 +1720,7 @@ func (b *executorBuilder) buildApply(v *plannercore.PhysicalApply) Executor { joiners: joiners, corCols: corCols, concurrency: v.Concurrency, - useCache: true, + useCache: v.CanUseCache, } } return serialExec @@ -1776,8 +1813,12 @@ func (b *executorBuilder) buildSplitRegion(v *plannercore.SplitRegion) Executor func (b *executorBuilder) buildUpdate(v *plannercore.Update) Executor { tblID2table := make(map[int64]table.Table, len(v.TblColPosInfos)) + multiUpdateOnSameTable := make(map[int64]bool) for _, info := range v.TblColPosInfos { tbl, _ := b.is.TableByID(info.TblID) + if _, ok := tblID2table[info.TblID]; ok { + multiUpdateOnSameTable[info.TblID] = true + } tblID2table[info.TblID] = tbl if len(v.PartitionedTable) > 0 { // The v.PartitionedTable collects the partitioned table. @@ -1805,6 +1846,8 @@ func (b *executorBuilder) buildUpdate(v *plannercore.Update) Executor { baseExecutor: base, OrderedList: v.OrderedList, allAssignmentsAreConstant: v.AllAssignmentsAreConstant, + virtualAssignmentsOffset: v.VirtualAssignmentsOffset, + multiUpdateOnSameTable: multiUpdateOnSameTable, tblID2table: tblID2table, tblColPosInfos: v.TblColPosInfos, } @@ -1903,9 +1946,15 @@ func (b *executorBuilder) buildAnalyzeIndexPushdown(task plannercore.AnalyzeInde }, opts: opts, } + topNSize := new(int32) + *topNSize = int32(opts[ast.AnalyzeOptNumTopN]) + statsVersion := new(int32) + *statsVersion = int32(task.StatsVersion) e.analyzePB.IdxReq = &tipb.AnalyzeIndexReq{ BucketSize: int64(opts[ast.AnalyzeOptNumBuckets]), NumColumns: int32(len(task.IndexInfo.Columns)), + TopNSize: topNSize, + Version: statsVersion, } if e.isCommonHandle && e.idxInfo.Primary { e.analyzePB.Tp = tipb.AnalyzeType_TypeCommonHandle @@ -1920,7 +1969,7 @@ func (b *executorBuilder) buildAnalyzeIndexPushdown(task plannercore.AnalyzeInde func (b *executorBuilder) buildAnalyzeIndexIncremental(task plannercore.AnalyzeIndexTask, opts map[ast.AnalyzeOptionType]uint64) *analyzeTask { h := domain.GetDomain(b.ctx).StatsHandle() - statsTbl := h.GetPartitionStats(&model.TableInfo{}, task.TableID.PersistID) + statsTbl := h.GetPartitionStats(&model.TableInfo{}, task.TableID.GetStatisticsID()) analyzeTask := b.buildAnalyzeIndexPushdown(task, opts, "") if statsTbl.Pseudo { return analyzeTask @@ -1945,9 +1994,14 @@ func (b *executorBuilder) buildAnalyzeIndexIncremental(task plannercore.AnalyzeI } oldHist = idx.TruncateHistogram(bktID) } + var oldTopN *statistics.TopN + if analyzeTask.idxExec.analyzePB.IdxReq.GetVersion() == statistics.Version2 { + oldTopN = idx.TopN.Copy() + oldTopN.RemoveVal(oldHist.Bounds.GetRow(len(oldHist.Buckets)*2 - 1).GetBytes(0)) + } oldHist = oldHist.RemoveUpperBound() analyzeTask.taskType = idxIncrementalTask - analyzeTask.idxIncrementalExec = &analyzeIndexIncrementalExec{AnalyzeIndexExec: *analyzeTask.idxExec, oldHist: oldHist, oldCMS: idx.CMSketch} + analyzeTask.idxIncrementalExec = &analyzeIndexIncrementalExec{AnalyzeIndexExec: *analyzeTask.idxExec, oldHist: oldHist, oldCMS: idx.CMSketch, oldTopN: oldTopN} analyzeTask.job = &statistics.AnalyzeJob{DBName: task.DBName, TableName: task.TableName, PartitionName: task.PartitionName, JobInfo: "analyze incremental index " + task.IndexInfo.Name.O} return analyzeTask } @@ -1979,7 +2033,8 @@ func (b *executorBuilder) buildAnalyzeColumnsPushdown(task plannercore.AnalyzeCo Flags: sc.PushDownFlags(), TimeZoneOffset: offset, }, - opts: opts, + opts: opts, + analyzeVer: task.StatsVersion, } depth := int32(opts[ast.AnalyzeOptCMSketchDepth]) width := int32(opts[ast.AnalyzeOptCMSketchWidth]) @@ -1993,6 +2048,28 @@ func (b *executorBuilder) buildAnalyzeColumnsPushdown(task plannercore.AnalyzeCo } if task.TblInfo != nil { e.analyzePB.ColReq.PrimaryColumnIds = tables.TryGetCommonPkColumnIds(task.TblInfo) + if task.TblInfo.IsCommonHandle { + e.analyzePB.ColReq.PrimaryPrefixColumnIds = tables.PrimaryPrefixColumnIDs(task.TblInfo) + } + } + if task.CommonHandleInfo != nil { + topNSize := new(int32) + *topNSize = int32(opts[ast.AnalyzeOptNumTopN]) + statsVersion := new(int32) + *statsVersion = int32(task.StatsVersion) + e.analyzePB.IdxReq = &tipb.AnalyzeIndexReq{ + BucketSize: int64(opts[ast.AnalyzeOptNumBuckets]), + NumColumns: int32(len(task.CommonHandleInfo.Columns)), + TopNSize: topNSize, + Version: statsVersion, + } + depth := int32(opts[ast.AnalyzeOptCMSketchDepth]) + width := int32(opts[ast.AnalyzeOptCMSketchWidth]) + e.analyzePB.IdxReq.CmsketchDepth = &depth + e.analyzePB.IdxReq.CmsketchWidth = &width + e.analyzePB.ColReq.PrimaryColumnIds = tables.TryGetCommonPkColumnIds(task.TblInfo) + e.analyzePB.Tp = tipb.AnalyzeType_TypeMixed + e.commonHandle = task.CommonHandleInfo } b.err = plannercore.SetPBColumnsDefaultValue(b.ctx, e.analyzePB.ColReq.ColumnsInfo, cols) job := &statistics.AnalyzeJob{DBName: task.DBName, TableName: task.TableName, PartitionName: task.PartitionName, JobInfo: autoAnalyze + "analyze columns"} @@ -2001,7 +2078,7 @@ func (b *executorBuilder) buildAnalyzeColumnsPushdown(task plannercore.AnalyzeCo func (b *executorBuilder) buildAnalyzePKIncremental(task plannercore.AnalyzeColumnsTask, opts map[ast.AnalyzeOptionType]uint64) *analyzeTask { h := domain.GetDomain(b.ctx).StatsHandle() - statsTbl := h.GetPartitionStats(&model.TableInfo{}, task.TableID.PersistID) + statsTbl := h.GetPartitionStats(&model.TableInfo{}, task.TableID.GetStatisticsID()) analyzeTask := b.buildAnalyzeColumnsPushdown(task, opts, "") if statsTbl.Pseudo { return analyzeTask @@ -2114,6 +2191,7 @@ func (b *executorBuilder) buildAnalyze(v *plannercore.Analyze) Executor { baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), tasks: make([]*analyzeTask, 0, len(v.ColTasks)+len(v.IdxTasks)), wg: &sync.WaitGroup{}, + opts: v.Opts, } enableFastAnalyze := b.ctx.GetSessionVars().EnableFastAnalyze autoAnalyze := "" @@ -2141,11 +2219,7 @@ func (b *executorBuilder) buildAnalyze(v *plannercore.Analyze) Executor { if enableFastAnalyze { b.buildAnalyzeFastIndex(e, task, v.Opts) } else { - if task.TableID.StoreAsCollectID() && len(task.TableID.CollectIDs) > 1 && !task.IndexInfo.Global && !task.IndexInfo.Unique { - b.buildAnalyzeFastIndex(e, task, v.Opts) - } else { - e.tasks = append(e.tasks, b.buildAnalyzeIndexPushdown(task, v.Opts, autoAnalyze)) - } + e.tasks = append(e.tasks, b.buildAnalyzeIndexPushdown(task, v.Opts, autoAnalyze)) } } if b.err != nil { @@ -2187,10 +2261,10 @@ func constructDistExecForTiFlash(sctx sessionctx.Context, p plannercore.Physical } -func (b *executorBuilder) constructDAGReq(plans []plannercore.PhysicalPlan, storeType kv.StoreType) (dagReq *tipb.DAGRequest, streaming bool, err error) { +func constructDAGReq(ctx sessionctx.Context, plans []plannercore.PhysicalPlan, storeType kv.StoreType) (dagReq *tipb.DAGRequest, streaming bool, err error) { dagReq = &tipb.DAGRequest{} - dagReq.TimeZoneName, dagReq.TimeZoneOffset = timeutil.Zone(b.ctx.GetSessionVars().Location()) - sc := b.ctx.GetSessionVars().StmtCtx + dagReq.TimeZoneName, dagReq.TimeZoneOffset = timeutil.Zone(ctx.GetSessionVars().Location()) + sc := ctx.GetSessionVars().StmtCtx if sc.RuntimeStatsColl != nil { collExec := true dagReq.CollectExecutionSummaries = &collExec @@ -2198,13 +2272,13 @@ func (b *executorBuilder) constructDAGReq(plans []plannercore.PhysicalPlan, stor dagReq.Flags = sc.PushDownFlags() if storeType == kv.TiFlash { var executors []*tipb.Executor - executors, streaming, err = constructDistExecForTiFlash(b.ctx, plans[0]) + executors, streaming, err = constructDistExecForTiFlash(ctx, plans[0]) dagReq.RootExecutor = executors[0] } else { - dagReq.Executors, streaming, err = constructDistExec(b.ctx, plans) + dagReq.Executors, streaming, err = constructDistExec(ctx, plans) } - distsql.SetEncodeType(b.ctx, dagReq) + distsql.SetEncodeType(ctx, dagReq) return dagReq, streaming, err } @@ -2249,7 +2323,13 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) innerPlan := v.Children()[v.InnerChildIdx] innerTypes := make([]*types.FieldType, innerPlan.Schema().Len()) for i, col := range innerPlan.Schema().Columns { - innerTypes[i] = col.RetType + innerTypes[i] = col.RetType.Clone() + // The `innerTypes` would be called for `Datum.ConvertTo` when converting the columns from outer table + // to build hash map or construct lookup keys. So we need to modify its Flen otherwise there would be + // truncate error. See issue https://github.com/pingcap/tidb/issues/21232 for example. + if innerTypes[i].EvalType() == types.ETString { + innerTypes[i].Flen = types.UnspecifiedLength + } } var ( @@ -2307,12 +2387,23 @@ func (b *executorBuilder) buildIndexLookUpJoin(v *plannercore.PhysicalIndexJoin) for i := 0; i < len(v.OuterJoinKeys); i++ { outerKeyCols[i] = v.OuterJoinKeys[i].Index } - e.outerCtx.keyCols = outerKeyCols innerKeyCols := make([]int, len(v.InnerJoinKeys)) for i := 0; i < len(v.InnerJoinKeys); i++ { innerKeyCols[i] = v.InnerJoinKeys[i].Index } + e.outerCtx.keyCols = outerKeyCols e.innerCtx.keyCols = innerKeyCols + + outerHashCols, innerHashCols := make([]int, len(v.OuterHashKeys)), make([]int, len(v.InnerHashKeys)) + for i := 0; i < len(v.OuterHashKeys); i++ { + outerHashCols[i] = v.OuterHashKeys[i].Index + } + for i := 0; i < len(v.InnerHashKeys); i++ { + innerHashCols[i] = v.InnerHashKeys[i].Index + } + e.outerCtx.hashCols = outerHashCols + e.innerCtx.hashCols = innerHashCols + e.joinResult = newFirstChunk(e) executorCounterIndexLookUpJoin.Inc() return e @@ -2327,7 +2418,13 @@ func (b *executorBuilder) buildIndexLookUpMergeJoin(v *plannercore.PhysicalIndex innerPlan := v.Children()[v.InnerChildIdx] innerTypes := make([]*types.FieldType, innerPlan.Schema().Len()) for i, col := range innerPlan.Schema().Columns { - innerTypes[i] = col.RetType + innerTypes[i] = col.RetType.Clone() + // The `innerTypes` would be called for `Datum.ConvertTo` when converting the columns from outer table + // to build hash map or construct lookup keys. So we need to modify its Flen otherwise there would be + // truncate error. See issue https://github.com/pingcap/tidb/issues/21232 for example. + if innerTypes[i].EvalType() == types.ETString { + innerTypes[i].Flen = types.UnspecifiedLength + } } var ( outerFilter []expression.Expression @@ -2422,32 +2519,12 @@ func containsLimit(execs []*tipb.Executor) bool { return false } -// When allow batch cop is 1, only agg / topN uses batch cop. -// When allow batch cop is 2, every query uses batch cop. -func (e *TableReaderExecutor) setBatchCop(v *plannercore.PhysicalTableReader) { - if e.storeType != kv.TiFlash || e.keepOrder { - return - } - switch e.ctx.GetSessionVars().AllowBatchCop { - case 1: - for _, p := range v.TablePlans { - switch p.(type) { - case *plannercore.PhysicalHashAgg, *plannercore.PhysicalStreamAgg, *plannercore.PhysicalTopN, *plannercore.PhysicalBroadCastJoin: - e.batchCop = true - } - } - case 2: - e.batchCop = true - } - return -} - func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableReader) (*TableReaderExecutor, error) { tablePlans := v.TablePlans if v.StoreType == kv.TiFlash { tablePlans = []plannercore.PhysicalPlan{v.GetTablePlan()} } - dagReq, streaming, err := b.constructDAGReq(tablePlans, v.StoreType) + dagReq, streaming, err := constructDAGReq(b.ctx, tablePlans, v.StoreType) if err != nil { return nil, err } @@ -2476,15 +2553,19 @@ func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableRea plans: v.TablePlans, tablePlan: v.GetTablePlan(), storeType: v.StoreType, + batchCop: v.BatchCop, } - e.setBatchCop(v) e.buildVirtualColumnInfo() if containsLimit(dagReq.Executors) { e.feedback = statistics.NewQueryFeedback(0, nil, 0, ts.Desc) } else { - e.feedback = statistics.NewQueryFeedback(getPhysicalTableID(tbl), ts.Hist, int64(ts.StatsCount()), ts.Desc) + e.feedback = statistics.NewQueryFeedback(getFeedbackStatsTableID(e.ctx, tbl), ts.Hist, int64(ts.StatsCount()), ts.Desc) } collect := statistics.CollectFeedback(b.ctx.GetSessionVars().StmtCtx, e.feedback, len(ts.Ranges)) + // Do not collect the feedback when the table is the partition table. + if collect && tbl.Meta().Partition != nil { + collect = false + } if !collect { e.feedback.Invalidate() } @@ -2504,14 +2585,37 @@ func buildNoRangeTableReader(b *executorBuilder, v *plannercore.PhysicalTableRea return e, nil } +func (b *executorBuilder) buildMPPGather(v *plannercore.PhysicalTableReader) Executor { + startTs, err := b.getSnapshotTS() + if err != nil { + b.err = err + return nil + } + gather := &MPPGather{ + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), + is: b.is, + originalPlan: v.GetTablePlan(), + startTS: startTs, + allocTaskID: &b.mppTaskID, + } + return gather +} + // buildTableReader builds a table reader executor. It first build a no range table reader, // and then update it ranges from table scan plan. func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) Executor { - if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { - if err := b.refreshForUpdateTSForRC(); err != nil { - b.err = err - return nil + failpoint.Inject("checkUseMPP", func(val failpoint.Value) { + if val.(bool) != useMPPExecution(b.ctx, v) { + if val.(bool) { + b.err = errors.New("expect mpp but not used") + } else { + b.err = errors.New("don't expect mpp but we used it") + } + failpoint.Return(nil) } + }) + if useMPPExecution(b.ctx, v) { + return b.buildMPPGather(v) } ret, err := buildNoRangeTableReader(b, v) if err != nil { @@ -2528,18 +2632,19 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E return ret } - if pi := ts.Table.GetPartitionInfo(); pi == nil { + pi := ts.Table.GetPartitionInfo() + if pi == nil { return ret } + tmp, _ := b.is.TableByID(ts.Table.ID) + tbl := tmp.(table.PartitionedTable) + partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) + if err != nil { + b.err = err + return nil + } if v.StoreType == kv.TiFlash { - tmp, _ := b.is.TableByID(ts.Table.ID) - tbl := tmp.(table.PartitionedTable) - partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) - if err != nil { - b.err = err - return nil - } partsExecutor := make([]Executor, 0, len(partitions)) for _, part := range partitions { exec, err := buildNoRangeTableReader(b, v) @@ -2567,13 +2672,16 @@ func (b *executorBuilder) buildTableReader(v *plannercore.PhysicalTableReader) E } } - nextPartition := nextPartitionForTableReader{exec: ret} - exec, err := buildPartitionTable(b, ts.Table, &v.PartitionInfo, ret, nextPartition) - if err != nil { - b.err = err - return nil + if len(partitions) == 0 { + return &TableDualExec{baseExecutor: *ret.base()} } - return exec + ret.kvRangeBuilder = kvRangeBuilderFromRangeAndPartition{ + sctx: b.ctx, + partitions: partitions, + ranges: ts.Ranges, + } + + return ret } func buildPartitionTable(b *executorBuilder, tblInfo *model.TableInfo, partitionInfo *plannercore.PartitionInfo, e Executor, n nextPartition) (Executor, error) { @@ -2616,33 +2724,17 @@ func buildIndexRangeForEachPartition(ctx sessionctx.Context, usedPartitions []ta return nextRange, nil } -func buildKVRangeForEachPartition(ctx sessionctx.Context, usedPartitions []table.PhysicalTable, contentPos []int64, isCommonHandle bool, - lookUpContents []*indexJoinLookUpContent, indexRanges []*ranger.Range, keyOff2IdxOff []int, cwc *plannercore.ColWithCmpFuncManager) (map[int64]kvRangeBuilder, error) { - rangeBuilders := make(map[int64]kvRangeBuilder) - contentBucket := make(map[int64][]*indexJoinLookUpContent) - for _, p := range usedPartitions { - contentBucket[p.GetPhysicalID()] = make([]*indexJoinLookUpContent, 0, 8) +func keyColumnsIncludeAllPartitionColumns(keyColumns []int, pe *tables.PartitionExpr) bool { + tmp := make(map[int]struct{}, len(keyColumns)) + for _, offset := range keyColumns { + tmp[offset] = struct{}{} } - for i, pos := range contentPos { - if _, ok := contentBucket[pos]; ok { - contentBucket[pos] = append(contentBucket[pos], lookUpContents[i]) - } - } - for _, p := range usedPartitions { - if isCommonHandle { - rangeBuilders[p.GetPhysicalID()] = kvRangeBuilderFromFunc(func(pid int64) ([]kv.KeyRange, error) { - return buildKvRangesForIndexJoin(ctx, pid, -1, contentBucket[pid], indexRanges, keyOff2IdxOff, cwc) - }) - } else { - handles := make([]kv.Handle, 0, len(contentBucket[p.GetPhysicalID()])) - for _, content := range contentBucket[p.GetPhysicalID()] { - handle := kv.IntHandle(content.keys[0].GetInt64()) - handles = append(handles, handle) - } - rangeBuilders[p.GetPhysicalID()] = kvRangeBuilderFromHandles(handles) + for _, offset := range pe.ColumnOffset { + if _, ok := tmp[offset]; !ok { + return false } } - return rangeBuilders, nil + return true } func prunePartitionForInnerExecutor(ctx sessionctx.Context, tbl table.Table, schema *expression.Schema, partitionInfo *plannercore.PartitionInfo, @@ -2700,7 +2792,7 @@ func prunePartitionForInnerExecutor(ctx sessionctx.Context, tbl table.Table, sch } func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexReader) (*IndexReaderExecutor, error) { - dagReq, streaming, err := b.constructDAGReq(v.IndexPlans, kv.TiKV) + dagReq, streaming, err := constructDAGReq(b.ctx, v.IndexPlans, kv.TiKV) if err != nil { return nil, err } @@ -2738,9 +2830,17 @@ func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexRea if containsLimit(dagReq.Executors) { e.feedback = statistics.NewQueryFeedback(0, nil, 0, is.Desc) } else { - e.feedback = statistics.NewQueryFeedback(e.physicalTableID, is.Hist, int64(is.StatsCount()), is.Desc) + tblID := e.physicalTableID + if b.ctx.GetSessionVars().UseDynamicPartitionPrune() { + tblID = e.table.Meta().ID + } + e.feedback = statistics.NewQueryFeedback(tblID, is.Hist, int64(is.StatsCount()), is.Desc) } collect := statistics.CollectFeedback(b.ctx.GetSessionVars().StmtCtx, e.feedback, len(is.Ranges)) + // Do not collect the feedback when the table is the partition table. + if collect && tbl.Meta().Partition != nil { + collect = false + } if !collect { e.feedback.Invalidate() } @@ -2754,12 +2854,6 @@ func buildNoRangeIndexReader(b *executorBuilder, v *plannercore.PhysicalIndexRea } func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) Executor { - if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { - if err := b.refreshForUpdateTSForRC(); err != nil { - b.err = err - return nil - } - } ret, err := buildNoRangeIndexReader(b, v) if err != nil { b.err = err @@ -2775,7 +2869,8 @@ func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) E return ret } - if pi := is.Table.GetPartitionInfo(); pi == nil { + pi := is.Table.GetPartitionInfo() + if pi == nil { return ret } @@ -2783,16 +2878,19 @@ func (b *executorBuilder) buildIndexReader(v *plannercore.PhysicalIndexReader) E return ret } - nextPartition := nextPartitionForIndexReader{exec: ret} - exec, err := buildPartitionTable(b, is.Table, &v.PartitionInfo, ret, nextPartition) + tmp, _ := b.is.TableByID(is.Table.ID) + tbl := tmp.(table.PartitionedTable) + partitions, err := partitionPruning(b.ctx, tbl, v.PartitionInfo.PruningConds, v.PartitionInfo.PartitionNames, v.PartitionInfo.Columns, v.PartitionInfo.ColumnNames) if err != nil { b.err = err + return nil } - return exec + ret.partitions = partitions + return ret } func buildTableReq(b *executorBuilder, schemaLen int, plans []plannercore.PhysicalPlan) (dagReq *tipb.DAGRequest, streaming bool, val table.Table, err error) { - tableReq, tableStreaming, err := b.constructDAGReq(plans, kv.TiKV) + tableReq, tableStreaming, err := constructDAGReq(b.ctx, plans, kv.TiKV) if err != nil { return nil, false, nil, err } @@ -2810,7 +2908,7 @@ func buildTableReq(b *executorBuilder, schemaLen int, plans []plannercore.Physic } func buildIndexReq(b *executorBuilder, schemaLen, handleLen int, plans []plannercore.PhysicalPlan) (dagReq *tipb.DAGRequest, streaming bool, err error) { - indexReq, indexStreaming, err := b.constructDAGReq(plans, kv.TiKV) + indexReq, indexStreaming, err := constructDAGReq(b.ctx, plans, kv.TiKV) if err != nil { return nil, false, err } @@ -2875,12 +2973,16 @@ func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIn if containsLimit(indexReq.Executors) { e.feedback = statistics.NewQueryFeedback(0, nil, 0, is.Desc) } else { - e.feedback = statistics.NewQueryFeedback(getPhysicalTableID(tbl), is.Hist, int64(is.StatsCount()), is.Desc) + e.feedback = statistics.NewQueryFeedback(getFeedbackStatsTableID(e.ctx, tbl), is.Hist, int64(is.StatsCount()), is.Desc) } // Do not collect the feedback for table request. collectTable := false e.tableRequest.CollectRangeCounts = &collectTable collectIndex := statistics.CollectFeedback(b.ctx.GetSessionVars().StmtCtx, e.feedback, len(is.Ranges)) + // Do not collect the feedback when the table is the partition table. + if collectIndex && tbl.Meta().Partition != nil { + collectIndex = false + } if !collectIndex { e.feedback.Invalidate() } @@ -2899,12 +3001,6 @@ func buildNoRangeIndexLookUpReader(b *executorBuilder, v *plannercore.PhysicalIn } func (b *executorBuilder) buildIndexLookUpReader(v *plannercore.PhysicalIndexLookUpReader) Executor { - if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { - if err := b.refreshForUpdateTSForRC(); err != nil { - b.err = err - return nil - } - } ret, err := buildNoRangeIndexLookUpReader(b, v) if err != nil { b.err = err @@ -2947,7 +3043,6 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd partialReqs := make([]*tipb.DAGRequest, 0, partialPlanCount) partialStreamings := make([]bool, 0, partialPlanCount) indexes := make([]*model.IndexInfo, 0, partialPlanCount) - keepOrders := make([]bool, 0, partialPlanCount) descs := make([]bool, 0, partialPlanCount) feedbacks := make([]*statistics.QueryFeedback, 0, partialPlanCount) ts := v.TablePlans[0].(*plannercore.PhysicalTableScan) @@ -2962,13 +3057,11 @@ func buildNoRangeIndexMergeReader(b *executorBuilder, v *plannercore.PhysicalInd if is, ok := v.PartialPlans[i][0].(*plannercore.PhysicalIndexScan); ok { tempReq, tempStreaming, err = buildIndexReq(b, len(is.Index.Columns), ts.HandleCols.NumCols(), v.PartialPlans[i]) - keepOrders = append(keepOrders, is.KeepOrder) descs = append(descs, is.Desc) indexes = append(indexes, is.Index) } else { ts := v.PartialPlans[i][0].(*plannercore.PhysicalTableScan) tempReq, tempStreaming, _, err = buildTableReq(b, len(ts.Columns), v.PartialPlans[i]) - keepOrders = append(keepOrders, ts.KeepOrder) descs = append(descs, ts.Desc) indexes = append(indexes, nil) } @@ -3137,105 +3230,147 @@ func (builder *dataReaderBuilder) buildTableReaderForIndexJoin(ctx context.Conte } tbInfo := e.table.Meta() if v.IsCommonHandle { - kvRanges, err := buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) - if err != nil { - return nil, err - } - if tbInfo.GetPartitionInfo() == nil { + if tbInfo.GetPartitionInfo() == nil || !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { + kvRanges, err := buildKvRangesForIndexJoin(e.ctx, getPhysicalTableID(e.table), -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } return builder.buildTableReaderFromKvRanges(ctx, e, kvRanges) } - e.kvRangeBuilder = kvRangeBuilderFromFunc(func(pid int64) ([]kv.KeyRange, error) { - return buildKvRangesForIndexJoin(e.ctx, pid, -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) - }) - nextPartition := nextPartitionForTableReader{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} - tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) - usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, lookUpContents) + + tbl, _ := builder.is.TableByID(tbInfo.ID) + pt := tbl.(table.PartitionedTable) + pe, err := tbl.(interface { + PartitionExpr() (*tables.PartitionExpr, error) + }).PartitionExpr() if err != nil { return nil, err } - if len(usedPartition) != 0 { - if canPrune { - rangeBuilders, err := buildKVRangeForEachPartition(e.ctx, usedPartition, contentPos, v.IsCommonHandle, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + var kvRanges []kv.KeyRange + if keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { + // In this case we can use dynamic partition pruning. + locateKey := make([]types.Datum, e.Schema().Len()) + kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) + for _, content := range lookUpContents { + for i, date := range content.keys { + locateKey[content.keyCols[i]] = date + } + p, err := pt.GetPartitionByRow(e.ctx, locateKey) + if err != nil { + return nil, err + } + pid := p.GetPhysicalID() + tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, []*indexJoinLookUpContent{content}, indexRanges, keyOff2IdxOff, cwc) if err != nil { return nil, err } - nextPartition.rangeBuilders = rangeBuilders - nextPartition.isFullPartition = false + kvRanges = append(kvRanges, tmp...) } - partitionExec := &PartitionTableExecutor{ - baseExecutor: *e.base(), - partitions: usedPartition, - nextPartition: nextPartition, + } else { + partitionInfo := &v.PartitionInfo + partitions, err := partitionPruning(e.ctx, pt, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + if err != nil { + return nil, err } - return partitionExec, nil - } - ret := &TableDualExec{baseExecutor: *e.base()} - return ret, err - } - handles := make([]kv.Handle, 0, len(lookUpContents)) - validLookUpContents := make([]*indexJoinLookUpContent, 0, len(lookUpContents)) - for _, content := range lookUpContents { - isValidHandle := true - handle := kv.IntHandle(content.keys[0].GetInt64()) - for _, key := range content.keys { - if handle.IntValue() != key.GetInt64() { - isValidHandle = false - break + kvRanges = make([]kv.KeyRange, 0, len(partitions)*len(lookUpContents)) + for _, p := range partitions { + pid := p.GetPhysicalID() + tmp, err := buildKvRangesForIndexJoin(e.ctx, pid, -1, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + if err != nil { + return nil, err + } + kvRanges = append(tmp, kvRanges...) } } - if isValidHandle { - handles = append(handles, handle) - validLookUpContents = append(validLookUpContents, content) - } + return builder.buildTableReaderFromKvRanges(ctx, e, kvRanges) } + handles, lookUpContents := dedupHandles(lookUpContents) if tbInfo.GetPartitionInfo() == nil { return builder.buildTableReaderFromHandles(ctx, e, handles, canReorderHandles) } if !builder.ctx.GetSessionVars().UseDynamicPartitionPrune() { return builder.buildTableReaderFromHandles(ctx, e, handles, canReorderHandles) } - e.kvRangeBuilder = kvRangeBuilderFromHandles(handles) - nextPartition := nextPartitionForTableReader{exec: e, innerPartitionInfo: &innerPartitionInfo{isFullPartition: true}} - tbl, _ := builder.executorBuilder.is.TableByID(tbInfo.ID) - usedPartition, canPrune, contentPos, err := prunePartitionForInnerExecutor(builder.executorBuilder.ctx, tbl, e.Schema(), &v.PartitionInfo, validLookUpContents) + + tbl, _ := builder.is.TableByID(tbInfo.ID) + pt := tbl.(table.PartitionedTable) + pe, err := tbl.(interface { + PartitionExpr() (*tables.PartitionExpr, error) + }).PartitionExpr() if err != nil { return nil, err } - if len(usedPartition) != 0 { - if canPrune { - rangeBuilders, err := buildKVRangeForEachPartition(e.ctx, usedPartition, contentPos, v.IsCommonHandle, lookUpContents, indexRanges, keyOff2IdxOff, cwc) + var kvRanges []kv.KeyRange + if keyColumnsIncludeAllPartitionColumns(lookUpContents[0].keyCols, pe) { + locateKey := make([]types.Datum, e.Schema().Len()) + kvRanges = make([]kv.KeyRange, 0, len(lookUpContents)) + for _, content := range lookUpContents { + for i, date := range content.keys { + locateKey[content.keyCols[i]] = date + } + p, err := pt.GetPartitionByRow(e.ctx, locateKey) if err != nil { return nil, err } - nextPartition.rangeBuilders = rangeBuilders - nextPartition.isFullPartition = false + pid := p.GetPhysicalID() + handle := kv.IntHandle(content.keys[0].GetInt64()) + tmp := distsql.TableHandlesToKVRanges(pid, []kv.Handle{handle}) + kvRanges = append(kvRanges, tmp...) } - partitionExec := &PartitionTableExecutor{ - baseExecutor: *e.base(), - partitions: usedPartition, - nextPartition: nextPartition, + } else { + partitionInfo := &v.PartitionInfo + partitions, err := partitionPruning(e.ctx, pt, partitionInfo.PruningConds, partitionInfo.PartitionNames, partitionInfo.Columns, partitionInfo.ColumnNames) + if err != nil { + return nil, err + } + for _, p := range partitions { + pid := p.GetPhysicalID() + tmp := distsql.TableHandlesToKVRanges(pid, handles) + kvRanges = append(kvRanges, tmp...) } - return partitionExec, nil } - ret := &TableDualExec{baseExecutor: *e.base()} - return ret, err + return builder.buildTableReaderFromKvRanges(ctx, e, kvRanges) } -type kvRangeBuilderFromFunc func(pid int64) ([]kv.KeyRange, error) - -func (h kvRangeBuilderFromFunc) buildKeyRange(pid int64) ([]kv.KeyRange, error) { - return h(pid) +func dedupHandles(lookUpContents []*indexJoinLookUpContent) ([]kv.Handle, []*indexJoinLookUpContent) { + handles := make([]kv.Handle, 0, len(lookUpContents)) + validLookUpContents := make([]*indexJoinLookUpContent, 0, len(lookUpContents)) + for _, content := range lookUpContents { + isValidHandle := true + handle := kv.IntHandle(content.keys[0].GetInt64()) + for _, key := range content.keys { + if handle.IntValue() != key.GetInt64() { + isValidHandle = false + break + } + } + if isValidHandle { + handles = append(handles, handle) + validLookUpContents = append(validLookUpContents, content) + } + } + return handles, validLookUpContents } -type kvRangeBuilderFromHandles []kv.Handle +type kvRangeBuilderFromRangeAndPartition struct { + sctx sessionctx.Context + partitions []table.PhysicalTable + ranges []*ranger.Range +} -func (h kvRangeBuilderFromHandles) buildKeyRange(pid int64) ([]kv.KeyRange, error) { - handles := []kv.Handle(h) - sort.Slice(handles, func(i, j int) bool { - return handles[i].Compare(handles[j]) < 0 - }) - return distsql.TableHandlesToKVRanges(pid, handles), nil +func (h kvRangeBuilderFromRangeAndPartition) buildKeyRange(int64) ([]kv.KeyRange, error) { + var ret []kv.KeyRange + for _, p := range h.partitions { + pid := p.GetPhysicalID() + meta := p.Meta() + kvRange, err := distsql.TableHandleRangesToKVRanges(h.sctx.GetSessionVars().StmtCtx, []int64{pid}, meta != nil && meta.IsCommonHandle, h.ranges, nil) + if err != nil { + return nil, err + } + ret = append(ret, kvRange...) + } + return ret, nil } func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *TableReaderExecutor, reqBuilderWithRange distsql.RequestBuilder) (*TableReaderExecutor, error) { @@ -3250,6 +3385,7 @@ func (builder *dataReaderBuilder) buildTableReaderBase(ctx context.Context, e *T SetKeepOrder(e.keepOrder). SetStreaming(e.streaming). SetFromSessionVars(e.ctx.GetSessionVars()). + SetFromInfoSchema(infoschema.GetInfoSchema(e.ctx)). Build() if err != nil { return nil, err @@ -3272,10 +3408,12 @@ func (builder *dataReaderBuilder) buildTableReaderFromHandles(ctx context.Contex }) } var b distsql.RequestBuilder - if _, ok := handles[0].(kv.PartitionHandle); ok { - b.SetPartitionsAndHandles(handles) - } else { - b.SetTableHandles(getPhysicalTableID(e.table), handles) + if len(handles) > 0 { + if _, ok := handles[0].(kv.PartitionHandle); ok { + b.SetPartitionsAndHandles(handles) + } else { + b.SetTableHandles(getPhysicalTableID(e.table), handles) + } } return builder.buildTableReaderBase(ctx, e, b) } @@ -3582,40 +3720,56 @@ func (b *executorBuilder) buildWindow(v *plannercore.PhysicalWindow) *WindowExec func (b *executorBuilder) buildShuffle(v *plannercore.PhysicalShuffle) *ShuffleExec { base := newBaseExecutor(b.ctx, v.Schema(), v.ID()) - shuffle := &ShuffleExec{baseExecutor: base, - concurrency: v.Concurrency, + shuffle := &ShuffleExec{ + baseExecutor: base, + concurrency: v.Concurrency, } + splitters := make([]partitionSplitter, len(v.ByItemArrays)) switch v.SplitterType { case plannercore.PartitionHashSplitterType: - shuffle.splitter = &partitionHashSplitter{ - byItems: v.HashByItems, - numWorkers: shuffle.concurrency, + for i, byItems := range v.ByItemArrays { + splitters[i] = buildPartitionHashSplitter(shuffle.concurrency, byItems) + } + case plannercore.PartitionRangeSplitterType: + for i, byItems := range v.ByItemArrays { + splitters[i] = buildPartitionRangeSplitter(b.ctx, shuffle.concurrency, byItems) } default: panic("Not implemented. Should not reach here.") } + shuffle.splitters = splitters - shuffle.dataSource = b.build(v.DataSource) - if b.err != nil { - return nil + shuffle.dataSources = make([]Executor, len(v.DataSources)) + for i, dataSource := range v.DataSources { + shuffle.dataSources[i] = b.build(dataSource) + if b.err != nil { + return nil + } } - // head & tail of physical plans' chain within "partition". - var head, tail = v.Children()[0], v.Tail - + head := v.Children()[0] shuffle.workers = make([]*shuffleWorker, shuffle.concurrency) for i := range shuffle.workers { + receivers := make([]*shuffleReceiver, len(v.DataSources)) + for j, dataSource := range v.DataSources { + receivers[j] = &shuffleReceiver{ + baseExecutor: newBaseExecutor(b.ctx, dataSource.Schema(), dataSource.ID()), + } + } + w := &shuffleWorker{ - baseExecutor: newBaseExecutor(b.ctx, v.DataSource.Schema(), v.DataSource.ID()), + receivers: receivers, } - stub := plannercore.PhysicalShuffleDataSourceStub{ - Worker: (unsafe.Pointer)(w), - }.Init(b.ctx, v.DataSource.Stats(), v.DataSource.SelectBlockOffset(), nil) - stub.SetSchema(v.DataSource.Schema()) + for j, dataSource := range v.DataSources { + stub := plannercore.PhysicalShuffleReceiverStub{ + Receiver: (unsafe.Pointer)(receivers[j]), + }.Init(b.ctx, dataSource.Stats(), dataSource.SelectBlockOffset(), nil) + stub.SetSchema(dataSource.Schema()) + v.Tails[j].SetChildren(stub) + } - tail.SetChildren(stub) w.childExec = b.build(head) if b.err != nil { return nil @@ -3627,8 +3781,8 @@ func (b *executorBuilder) buildShuffle(v *plannercore.PhysicalShuffle) *ShuffleE return shuffle } -func (b *executorBuilder) buildShuffleDataSourceStub(v *plannercore.PhysicalShuffleDataSourceStub) *shuffleWorker { - return (*shuffleWorker)(v.Worker) +func (b *executorBuilder) buildShuffleReceiverStub(v *plannercore.PhysicalShuffleReceiverStub) *shuffleReceiver { + return (*shuffleReceiver)(v.Receiver) } func (b *executorBuilder) buildSQLBindExec(v *plannercore.SQLBindPlan) Executor { @@ -3696,12 +3850,6 @@ func NewRowDecoder(ctx sessionctx.Context, schema *expression.Schema, tbl *model } func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan) Executor { - if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { - if err := b.refreshForUpdateTSForRC(); err != nil { - b.err = err - return nil - } - } startTS, err := b.getSnapshotTS() if err != nil { b.err = err @@ -3742,6 +3890,9 @@ func (b *executorBuilder) buildBatchPointGet(plan *plannercore.BatchPointGetPlan } } else { for _, value := range plan.IndexValues { + if datumsContainNull(value) { + continue + } handleBytes, err := EncodeUniqueIndexValuesForKey(e.ctx, e.tblInfo, plan.IndexInfo, value) if err != nil { b.err = err @@ -3779,6 +3930,13 @@ func getPhysicalTableID(t table.Table) int64 { return t.Meta().ID } +func getFeedbackStatsTableID(ctx sessionctx.Context, t table.Table) int64 { + if p, ok := t.(table.PhysicalTable); ok && !ctx.GetSessionVars().UseDynamicPartitionPrune() { + return p.GetPhysicalID() + } + return t.Meta().ID +} + func (b *executorBuilder) buildAdminShowTelemetry(v *plannercore.AdminShowTelemetry) Executor { return &AdminShowTelemetryExec{baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID())} } @@ -3816,3 +3974,22 @@ func partitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds func fullRangePartition(idxArr []int) bool { return len(idxArr) == 1 && idxArr[0] == plannercore.FullRange } + +func (b *executorBuilder) buildTableSample(v *plannercore.PhysicalTableSample) *TableSampleExecutor { + startTS, err := b.getSnapshotTS() + if err != nil { + b.err = err + return nil + } + e := &TableSampleExecutor{ + baseExecutor: newBaseExecutor(b.ctx, v.Schema(), v.ID()), + table: v.TableInfo, + startTS: startTS, + } + if v.TableSampleInfo.AstNode.SampleMethod == ast.SampleMethodTypeTiDBRegion { + e.sampler = newTableRegionSampler( + b.ctx, v.TableInfo, startTS, v.TableSampleInfo.Partitions, v.Schema(), + v.TableSampleInfo.FullSchema, e.retFieldTypes, v.Desc) + } + return e +} diff --git a/executor/checksum.go b/executor/checksum.go index 3f735b2838445..c6c28fe593754 100644 --- a/executor/checksum.go +++ b/executor/checksum.go @@ -233,10 +233,15 @@ func (c *checksumContext) buildTableRequest(ctx sessionctx.Context, tableID int6 Algorithm: tipb.ChecksumAlgorithm_Crc64_Xor, } - ranges := ranger.FullIntRange(false) + var ranges []*ranger.Range + if c.TableInfo.IsCommonHandle { + ranges = ranger.FullNotNullRange() + } else { + ranges = ranger.FullIntRange(false) + } var builder distsql.RequestBuilder - return builder.SetTableRanges(tableID, ranges, nil). + return builder.SetHandleRanges(ctx.GetSessionVars().StmtCtx, tableID, c.TableInfo.IsCommonHandle, ranges, nil). SetChecksumRequest(checksum). SetStartTS(c.StartTs). SetConcurrency(ctx.GetSessionVars().DistSQLScanConcurrency()). diff --git a/executor/chunk_size_control_test.go b/executor/chunk_size_control_test.go index bd21a631fdff4..4f0ee510c4a90 100644 --- a/executor/chunk_size_control_test.go +++ b/executor/chunk_size_control_test.go @@ -26,8 +26,8 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" diff --git a/executor/clustered_index_test.go b/executor/clustered_index_test.go deleted file mode 100644 index cf93d8f0113fc..0000000000000 --- a/executor/clustered_index_test.go +++ /dev/null @@ -1,206 +0,0 @@ -// Copyright 2020 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package executor_test - -import ( - . "github.com/pingcap/check" - "github.com/pingcap/tidb/errno" - "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/util/testkit" -) - -type testClusteredSuite struct{ *baseTestSuite } - -func (s *testClusteredSuite) SetUpTest(c *C) { -} - -func (s *testClusteredSuite) newTK(c *C) *testkit.TestKit { - tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustExec("set @@tidb_enable_clustered_index = 1") - return tk -} - -func (s *testClusteredSuite) TestClusteredUnionScan(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b))") - tk.MustExec("insert t (a, b) values (1, 1)") - tk.MustExec("begin") - tk.MustExec("update t set c = 1") - tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1")) - tk.MustExec("rollback") - - // cover old row format. - tk = testkit.NewTestKitWithInit(c, s.store) - tk.Se.GetSessionVars().RowEncoder.Enable = false - tk.MustExec("begin") - tk.MustExec("update t set c = 1") - tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1")) - tk.MustExec("rollback") -} - -func (s *testClusteredSuite) TestClusteredUnionScanIndexLookup(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t (a int, pk char(10), c int, primary key(pk), key(a));") - tk.MustExec("insert into t values (1, '111', 3);") - - tk.MustExec("begin") - tk.MustExec("update t set a = a + 1, pk = '222' where a = 1;") - sql := "select pk, c from t where a = 2;" - tk.HasPlan(sql, "IndexLookUp") - tk.MustQuery(sql).Check(testkit.Rows("222 3")) - - tk.MustExec("commit") - tk.MustQuery(sql).Check(testkit.Rows("222 3")) -} - -func (s *testClusteredSuite) TestClusteredIndexLookUp(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int, b int, c int, d int, primary key (a, b))") - tk.MustExec("create index idx on t(c)") - tk.MustExec("insert t values (1, 1, 1, 1)") - tk.MustQuery("select d from t use index (idx)").Check(testkit.Rows("1")) -} - -func (s *testClusteredSuite) TestClusteredIndexLookUp2(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists c3") - createTable := ` -CREATE TABLE c3 ( - c_id int(11) NOT NULL, - c_d_id int(11) NOT NULL, - c_w_id int(11) NOT NULL, - c_first varchar(16) DEFAULT NULL, - c_middle char(2) DEFAULT NULL, - c_last varchar(16) DEFAULT NULL, - c_balance decimal(12,2) DEFAULT NULL, - PRIMARY KEY (c_w_id,c_d_id,c_id), - KEY idx (c_w_id,c_d_id,c_last,c_first) -);` - tk.MustExec(createTable) - tk.MustExec("insert c3 values (772,1,1,'aaa','OE','CALL',0),(1905,1,1,'bbb','OE','CALL',0);") - query := ` -SELECT c_balance, c_first, c_middle, c_id FROM c3 use index (idx) WHERE c_w_id = 1 AND c_d_id = 1 and c_last = 'CALL' ORDER BY c_first -` - tk.MustQuery(query).Check(testkit.Rows("0.00 aaa OE 772", "0.00 bbb OE 1905")) -} - -func (s *testClusteredSuite) TestClusteredTopN(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists o3") - createTables := ` - CREATE TABLE o3 ( - o_id int NOT NULL, - o_d_id int, - o_w_id int, - o_c_id int, - PRIMARY KEY (o_w_id,o_d_id,o_id), - KEY idx_order (o_w_id,o_d_id,o_c_id,o_id) -);` - tk.MustExec(createTables) - tk.MustExec("insert o3 values (1, 6, 9, 3), (2, 6, 9, 5), (3, 6, 9, 7)") - tk.MustQuery("SELECT max(o_id) max_order FROM o3 use index (idx_order)").Check(testkit.Rows("3")) -} - -func (s *testClusteredSuite) TestClusteredHint(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists ht") - tk.MustExec("create table ht (a varchar(64) primary key, b int)") - tk.MustQuery("select * from ht use index (`PRIMARY`)") -} - -func (s *testClusteredSuite) TestClusteredBatchPointGet(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b)) PARTITION BY HASH(a) PARTITIONS 3") - tk.MustExec("insert t values (1, 1, 1), (3, 3, 3), (5, 5, 5)") - tk.MustQuery("select * from t where (a, b) in ((1, 1), (3, 3), (5, 5))").Check( - testkit.Rows("1 1 1", "3 3 3", "5 5 5")) -} - -func (s *testClusteredSuite) TestClusteredInsertIgnoreBatchGetKeyCount(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t") - tk.MustExec("CREATE TABLE t (a varchar(10) primary key, b int)") - tk.MustExec("begin optimistic") - tk.MustExec("insert ignore t values ('a', 1)") - txn, err := tk.Se.Txn(false) - c.Assert(err, IsNil) - snapSize := tikv.SnapCacheSize(txn.GetSnapshot()) - c.Assert(snapSize, Equals, 1) - tk.MustExec("rollback") -} - -func (s *testClusteredSuite) TestClusteredPrefixingPrimaryKey(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(name varchar(255), b int, c int, primary key(name(2)), index idx(b));") - tk.MustExec("insert into t(name, b) values('aaaaa', 1), ('bbbbb', 2);") - tk.MustExec("admin check table t;") - - tk.MustGetErrCode("insert into t(name, b) values('aaa', 3);", errno.ErrDupEntry) - sql := "select * from t use index(primary) where name = 'aaaaa';" - tk.HasPlan(sql, "TableReader") - tk.HasPlan(sql, "TableRangeScan") - tk.MustQuery(sql).Check(testkit.Rows("aaaaa 1 ")) - tk.MustExec("admin check table t;") - - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(name varchar(255), b int, c char(10), primary key(c(2), name(2)), index idx(b));") - tk.MustExec("insert into t values ('aaa', 1, 'aaa'), ('bbb', 1, 'bbb');") - tk.MustExec("insert into t values ('aa', 1, 'bbb'), ('bbb', 1, 'ccc');") - tk.MustGetErrCode("insert into t values ('aa', 1, 'aa');", errno.ErrDupEntry) - tk.MustGetErrCode("insert into t values ('aac', 1, 'aac');", errno.ErrDupEntry) - tk.MustGetErrCode("insert into t values ('bb', 1, 'bb');", errno.ErrDupEntry) - tk.MustGetErrCode("insert into t values ('bbc', 1, 'bbc');", errno.ErrDupEntry) - tk.MustGetErrCode("update t set name = 'aa', c = 'aa' where c = 'ccc'", errno.ErrDupEntry) - tk.MustExec("update t set name = 'ccc' where name = 'aa'") - tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). - Check(testkit.Rows("aaa.bbb.bbb.ccc")) - tk.MustExec("admin check table t;") - - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(name varchar(255), b int, primary key(name(2)), index idx(b));") - tk.MustExec("insert into t values ('aaa', 1), ('bbb', 1);") - tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). - Check(testkit.Rows("aaa.bbb")) - - tk.MustGetErrCode("update t set name = 'aaaaa' where name = 'bbb'", errno.ErrDupEntry) - tk.MustExec("update ignore t set name = 'aaaaa' where name = 'bbb'") - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry 'aa' for key 'PRIMARY'")) - tk.MustExec("admin check table t;") -} - -func (s *testClusteredSuite) TestClusteredWithOldRowFormat(c *C) { - tk := s.newTK(c) - tk.Se.GetSessionVars().RowEncoder.Enable = false - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t(id varchar(255) primary key, a int, b int, unique index idx(b));") - tk.MustExec("insert into t values ('b568004d-afad-11ea-8e4d-d651e3a981b7', 1, -1);") - tk.MustQuery("select * from t use index(primary);").Check(testkit.Rows("b568004d-afad-11ea-8e4d-d651e3a981b7 1 -1")) -} - -func (s *testClusteredSuite) TestIssue20002(c *C) { - tk := s.newTK(c) - tk.MustExec("drop table if exists t;") - tk.MustExec("create table t ( c_int int, c_str varchar(40), c_datetime datetime, primary key(c_str), unique key(c_datetime));") - tk.MustExec("insert into t values (1, 'laughing hertz', '2020-04-27 20:29:30'), (2, 'sharp yalow', '2020-04-01 05:53:36'), (3, 'pedantic hoover', '2020-03-10 11:49:00');") - tk.MustExec("begin;") - tk.MustExec("update t set c_str = 'amazing herschel' where c_int = 3;") - tk.MustExec("select c_int, c_str, c_datetime from t where c_datetime between '2020-01-09 22:00:28' and '2020-04-08 15:12:37';") - tk.MustExec("commit;") - tk.MustExec("admin check index t `c_datetime`;") -} diff --git a/executor/compiler.go b/executor/compiler.go index 49ae9e3e844da..bb0f5274a159e 100644 --- a/executor/compiler.go +++ b/executor/compiler.go @@ -218,17 +218,36 @@ func getStmtDbLabel(stmtNode ast.StmtNode) map[string]struct{} { } } case *ast.CreateBindingStmt: + var resNode ast.ResultSetNode if x.OriginNode != nil { - originSelect := x.OriginNode.(*ast.SelectStmt) - dbLabels := getDbFromResultNode(originSelect.From.TableRefs) + switch n := x.OriginNode.(type) { + case *ast.SelectStmt: + resNode = n.From.TableRefs + case *ast.DeleteStmt: + resNode = n.TableRefs.TableRefs + case *ast.UpdateStmt: + resNode = n.TableRefs.TableRefs + case *ast.InsertStmt: + resNode = n.Table.TableRefs + } + dbLabels := getDbFromResultNode(resNode) for _, db := range dbLabels { dbLabelSet[db] = struct{}{} } } if len(dbLabelSet) == 0 && x.HintedNode != nil { - hintedSelect := x.HintedNode.(*ast.SelectStmt) - dbLabels := getDbFromResultNode(hintedSelect.From.TableRefs) + switch n := x.HintedNode.(type) { + case *ast.SelectStmt: + resNode = n.From.TableRefs + case *ast.DeleteStmt: + resNode = n.TableRefs.TableRefs + case *ast.UpdateStmt: + resNode = n.TableRefs.TableRefs + case *ast.InsertStmt: + resNode = n.Table.TableRefs + } + dbLabels := getDbFromResultNode(resNode) for _, db := range dbLabels { dbLabelSet[db] = struct{}{} } @@ -238,7 +257,7 @@ func getStmtDbLabel(stmtNode ast.StmtNode) map[string]struct{} { return dbLabelSet } -func getDbFromResultNode(resultNode ast.ResultSetNode) []string { //may have duplicate db name +func getDbFromResultNode(resultNode ast.ResultSetNode) []string { // may have duplicate db name var dbLabels []string if resultNode == nil { diff --git a/executor/coprocessor.go b/executor/coprocessor.go index cf11d38512177..25959e5454655 100644 --- a/executor/coprocessor.go +++ b/executor/coprocessor.go @@ -161,11 +161,12 @@ func (h *CoprocessorDAGHandler) buildDAGExecutor(req *coprocessor.Request) (Exec h.dagReq = dagReq is := h.sctx.GetSessionVars().TxnCtx.InfoSchema.(infoschema.InfoSchema) // Build physical plan. - bp := core.NewPBPlanBuilder(h.sctx, is) + bp := core.NewPBPlanBuilder(h.sctx, is, req.Ranges) plan, err := bp.Build(dagReq.Executors) if err != nil { return nil, errors.Trace(err) } + plan = core.InjectExtraProjection(plan) // Build executor. b := newExecutorBuilder(h.sctx, is) return b.build(plan), nil diff --git a/executor/ddl.go b/executor/ddl.go index ae2d685a65ccf..2940bab6b80f5 100644 --- a/executor/ddl.go +++ b/executor/ddl.go @@ -122,7 +122,8 @@ func (e *DDLExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { err = e.executeCreateSequence(x) case *ast.DropSequenceStmt: err = e.executeDropSequence(x) - + case *ast.AlterSequenceStmt: + err = e.executeAlterSequence(x) } if err != nil { // If the owner return ErrTableNotExists error when running this DDL, it may be caused by schema changed, @@ -142,7 +143,7 @@ func (e *DDLExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { txnCtx.InfoSchema = is txnCtx.SchemaVersion = is.SchemaMetaVersion() // DDL will force commit old transaction, after DDL, in transaction status should be false. - e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, false) + e.ctx.GetSessionVars().SetInTxn(false) return nil } @@ -153,14 +154,23 @@ func (e *DDLExec) executeTruncateTable(s *ast.TruncateTableStmt) error { } func (e *DDLExec) executeRenameTable(s *ast.RenameTableStmt) error { - if len(s.TableToTables) != 1 { - // Now we only allow one schema changing at the same time. - return errors.Errorf("can't run multi schema change") - } - oldIdent := ast.Ident{Schema: s.OldTable.Schema, Name: s.OldTable.Name} - newIdent := ast.Ident{Schema: s.NewTable.Schema, Name: s.NewTable.Name} isAlterTable := false - err := domain.GetDomain(e.ctx).DDL().RenameTable(e.ctx, oldIdent, newIdent, isAlterTable) + var err error + if len(s.TableToTables) == 1 { + oldIdent := ast.Ident{Schema: s.TableToTables[0].OldTable.Schema, Name: s.TableToTables[0].OldTable.Name} + newIdent := ast.Ident{Schema: s.TableToTables[0].NewTable.Schema, Name: s.TableToTables[0].NewTable.Name} + err = domain.GetDomain(e.ctx).DDL().RenameTable(e.ctx, oldIdent, newIdent, isAlterTable) + } else { + oldIdents := make([]ast.Ident, 0, len(s.TableToTables)) + newIdents := make([]ast.Ident, 0, len(s.TableToTables)) + for _, tables := range s.TableToTables { + oldIdent := ast.Ident{Schema: tables.OldTable.Schema, Name: tables.OldTable.Name} + newIdent := ast.Ident{Schema: tables.NewTable.Schema, Name: tables.NewTable.Name} + oldIdents = append(oldIdents, oldIdent) + newIdents = append(newIdents, newIdent) + } + err = domain.GetDomain(e.ctx).DDL().RenameTables(e.ctx, oldIdents, newIdents, isAlterTable) + } return err } @@ -309,8 +319,12 @@ func (e *DDLExec) dropTableObject(objects []*ast.TableName, obt objectType, ifEx zap.String("database", fullti.Schema.O), zap.String("table", fullti.Name.O), ) - sql := fmt.Sprintf("admin check table `%s`.`%s`", fullti.Schema.O, fullti.Name.O) - _, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), "admin check table %n.%n", fullti.Schema.O, fullti.Name.O) + if err != nil { + return err + } + _, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return err } @@ -589,7 +603,7 @@ func (e *DDLExec) executeLockTables(s *ast.LockTablesStmt) error { return domain.GetDomain(e.ctx).DDL().LockTables(e.ctx, s) } -func (e *DDLExec) executeUnlockTables(s *ast.UnlockTablesStmt) error { +func (e *DDLExec) executeUnlockTables(_ *ast.UnlockTablesStmt) error { if !config.TableLockEnabled() { return nil } @@ -608,3 +622,7 @@ func (e *DDLExec) executeRepairTable(s *ast.RepairTableStmt) error { func (e *DDLExec) executeCreateSequence(s *ast.CreateSequenceStmt) error { return domain.GetDomain(e.ctx).DDL().CreateSequence(e.ctx, s) } + +func (e *DDLExec) executeAlterSequence(s *ast.AlterSequenceStmt) error { + return domain.GetDomain(e.ctx).DDL().AlterSequence(e.ctx, s) +} diff --git a/executor/ddl_test.go b/executor/ddl_test.go index eca31b0c5c525..bc848091998a9 100644 --- a/executor/ddl_test.go +++ b/executor/ddl_test.go @@ -30,6 +30,7 @@ import ( ddltestutil "github.com/pingcap/tidb/ddl/testutil" ddlutil "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -38,6 +39,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testkit" @@ -74,6 +76,17 @@ func (s *testSuite6) TestInTxnExecDDLFail(c *C) { result.Check(testkit.Rows("1")) } +func (s *testSuite6) TestInTxnExecDDLInvalid(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c_int int, c_str varchar(40));") + tk.MustExec("insert into t values (1, 'quizzical hofstadter');") + tk.MustExec("begin;") + _ = tk.MustQuery("select c_int from t where c_str is not null for update;") + tk.MustExec("alter table t add index idx_4 (c_str);") +} + func (s *testSuite6) TestCreateTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -122,6 +135,7 @@ func (s *testSuite6) TestCreateTable(c *C) { c.Assert(req.GetRow(0).GetString(1), Equals, "double") } } + c.Assert(rs.Close(), IsNil) // test multiple collate specified in column when create. tk.MustExec("drop table if exists test_multiple_column_collate;") @@ -185,45 +199,45 @@ func (s *testSuite6) TestCreateTable(c *C) { func (s *testSuite6) TestCreateView(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - //create an source table + // create an source table tk.MustExec("CREATE TABLE source_table (id INT NOT NULL DEFAULT 1, name varchar(255), PRIMARY KEY(id));") - //test create a exist view + // test create a exist view tk.MustExec("CREATE VIEW view_t AS select id , name from source_table") defer tk.MustExec("DROP VIEW IF EXISTS view_t") _, err := tk.Exec("CREATE VIEW view_t AS select id , name from source_table") c.Assert(err.Error(), Equals, "[schema:1050]Table 'test.view_t' already exists") - //create view on nonexistent table + // create view on nonexistent table _, err = tk.Exec("create view v1 (c,d) as select a,b from t1") c.Assert(err.Error(), Equals, "[schema:1146]Table 'test.t1' doesn't exist") - //simple view + // simple view tk.MustExec("create table t1 (a int ,b int)") tk.MustExec("insert into t1 values (1,2), (1,3), (2,4), (2,5), (3,10)") - //view with colList and SelectFieldExpr + // view with colList and SelectFieldExpr tk.MustExec("create view v1 (c) as select b+1 from t1") - //view with SelectFieldExpr + // view with SelectFieldExpr tk.MustExec("create view v2 as select b+1 from t1") - //view with SelectFieldExpr and AsName + // view with SelectFieldExpr and AsName tk.MustExec("create view v3 as select b+1 as c from t1") - //view with colList , SelectField and AsName + // view with colList , SelectField and AsName tk.MustExec("create view v4 (c) as select b+1 as d from t1") - //view with select wild card + // view with select wild card tk.MustExec("create view v5 as select * from t1") tk.MustExec("create view v6 (c,d) as select * from t1") _, err = tk.Exec("create view v7 (c,d,e) as select * from t1") c.Assert(err.Error(), Equals, ddl.ErrViewWrongList.Error()) - //drop multiple views in a statement + // drop multiple views in a statement tk.MustExec("drop view v1,v2,v3,v4,v5,v6") - //view with variable + // view with variable tk.MustExec("create view v1 (c,d) as select a,b+@@global.max_user_connections from t1") _, err = tk.Exec("create view v1 (c,d) as select a,b from t1 where a = @@global.max_user_connections") c.Assert(err.Error(), Equals, "[schema:1050]Table 'test.v1' already exists") tk.MustExec("drop view v1") - //view with different col counts + // view with different col counts _, err = tk.Exec("create view v1 (c,d,e) as select a,b from t1 ") c.Assert(err.Error(), Equals, ddl.ErrViewWrongList.Error()) _, err = tk.Exec("create view v1 (c) as select a,b from t1 ") c.Assert(err.Error(), Equals, ddl.ErrViewWrongList.Error()) - //view with or_replace flag + // view with or_replace flag tk.MustExec("drop view if exists v1") tk.MustExec("create view v1 (c,d) as select a,b from t1") tk.MustExec("create or replace view v1 (c,d) as select a,b from t1 ") @@ -278,6 +292,19 @@ func (s *testSuite6) TestCreateView(c *C) { tk.MustExec("drop view v_nested, v_nested2") } +func (s *testSuite6) TestViewRecursion(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table if not exists t(a int)") + tk.MustExec("create definer='root'@'localhost' view recursive_view1 as select * from t") + tk.MustExec("create definer='root'@'localhost' view recursive_view2 as select * from recursive_view1") + tk.MustExec("drop table t") + tk.MustExec("rename table recursive_view2 to t") + _, err := tk.Exec("select * from recursive_view1") + c.Assert(terror.ErrorEqual(err, plannercore.ErrViewRecursive), IsTrue) + tk.MustExec("drop view recursive_view1, t") +} + func (s *testSuite6) TestIssue16250(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -308,7 +335,7 @@ func (s *testSuite6) TestCreateViewWithOverlongColName(c *C) { tk.MustExec("create view v as select distinct'" + strings.Repeat("a", 65) + "', " + "max('" + strings.Repeat("b", 65) + "'), " + "'cccccccccc', '" + strings.Repeat("d", 65) + "';") - resultCreateStmt := "CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `v` (`name_exp_1`, `name_exp_2`, `cccccccccc`, `name_exp_4`) AS SELECT DISTINCT '" + strings.Repeat("a", 65) + "',MAX('" + strings.Repeat("b", 65) + "'),'cccccccccc','" + strings.Repeat("d", 65) + "'" + resultCreateStmt := "CREATE ALGORITHM=UNDEFINED DEFINER=``@`` SQL SECURITY DEFINER VIEW `v` (`name_exp_1`, `name_exp_2`, `cccccccccc`, `name_exp_4`) AS SELECT DISTINCT _UTF8MB4'" + strings.Repeat("a", 65) + "',MAX(_UTF8MB4'" + strings.Repeat("b", 65) + "'),_UTF8MB4'cccccccccc',_UTF8MB4'" + strings.Repeat("d", 65) + "'" tk.MustQuery("select * from v") tk.MustQuery("select name_exp_1, name_exp_2, cccccccccc, name_exp_4 from v") tk.MustQuery("show create view v").Check(testkit.Rows("v " + resultCreateStmt + " ")) @@ -320,7 +347,7 @@ func (s *testSuite6) TestCreateViewWithOverlongColName(c *C) { "union select '" + strings.Repeat("c", 65) + "', " + "count(distinct '" + strings.Repeat("b", 65) + "', " + "'c');") - resultCreateStmt = "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`, `name_exp_2`) AS SELECT 'a','" + strings.Repeat("b", 65) + "' FROM `test`.`t` UNION SELECT '" + strings.Repeat("c", 65) + "',COUNT(DISTINCT '" + strings.Repeat("b", 65) + "', 'c')" + resultCreateStmt = "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`a`, `name_exp_2`) AS SELECT _UTF8MB4'a',_UTF8MB4'" + strings.Repeat("b", 65) + "' FROM `test`.`t` UNION SELECT _UTF8MB4'" + strings.Repeat("c", 65) + "',COUNT(DISTINCT _UTF8MB4'" + strings.Repeat("b", 65) + "', _UTF8MB4'c')" tk.MustQuery("select * from v") tk.MustQuery("select a, name_exp_2 from v") tk.MustQuery("show create view v").Check(testkit.Rows("v " + resultCreateStmt + " ")) @@ -331,7 +358,7 @@ func (s *testSuite6) TestCreateViewWithOverlongColName(c *C) { tk.MustExec("create definer='root'@'localhost' view v as select 'a' as '" + strings.Repeat("b", 65) + "' from t;") tk.MustQuery("select * from v") tk.MustQuery("select name_exp_1 from v") - resultCreateStmt = "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`name_exp_1`) AS SELECT 'a' AS `" + strings.Repeat("b", 65) + "` FROM `test`.`t`" + resultCreateStmt = "CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v` (`name_exp_1`) AS SELECT _UTF8MB4'a' AS `" + strings.Repeat("b", 65) + "` FROM `test`.`t`" tk.MustQuery("show create view v").Check(testkit.Rows("v " + resultCreateStmt + " ")) tk.MustExec("drop view v;") tk.MustExec(resultCreateStmt) @@ -444,7 +471,7 @@ func (s *testSuite6) TestAlterTableAddColumn(c *C) { row := req.GetRow(0) c.Assert(row.Len(), Equals, 1) c.Assert(now, GreaterEqual, row.GetTime(0).String()) - r.Close() + c.Assert(r.Close(), IsNil) tk.MustExec("alter table alter_test add column c3 varchar(50) default 'CURRENT_TIMESTAMP'") tk.MustQuery("select c3 from alter_test").Check(testkit.Rows("CURRENT_TIMESTAMP")) tk.MustExec("create or replace view alter_view as select c1,c2 from alter_test") @@ -471,7 +498,7 @@ func (s *testSuite6) TestAlterTableAddColumns(c *C) { c.Assert(err, IsNil) row := req.GetRow(0) c.Assert(row.Len(), Equals, 1) - r.Close() + c.Assert(r.Close(), IsNil) tk.MustQuery("select c3 from alter_test").Check(testkit.Rows("CURRENT_TIMESTAMP")) tk.MustExec("create or replace view alter_view as select c1,c2 from alter_test") _, err = tk.Exec("alter table alter_view add column (c4 varchar(50), c5 varchar(50))") @@ -733,7 +760,7 @@ func (s *testSuite8) TestShardRowIDBits(c *C) { var hasShardedID bool var count int c.Assert(tk.Se.NewTxn(context.Background()), IsNil) - err = t.IterRecords(tk.Se, t.FirstKey(), nil, func(h kv.Handle, rec []types.Datum, cols []*table.Column) (more bool, err error) { + err = tables.IterRecords(t, tk.Se, nil, func(h kv.Handle, rec []types.Datum, cols []*table.Column) (more bool, err error) { c.Assert(h.IntValue(), GreaterEqual, int64(0)) first8bits := h.IntValue() >> 56 if first8bits > 0 { @@ -779,13 +806,14 @@ func (s *testSuite8) TestShardRowIDBits(c *C) { tblInfo.ShardRowIDBits = 5 tblInfo.MaxShardRowIDBits = 5 - kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) _, err = m.GenSchemaVersion() c.Assert(err, IsNil) c.Assert(m.UpdateTable(db.ID, tblInfo), IsNil) return nil }) + c.Assert(err, IsNil) err = dom.Reload() c.Assert(err, IsNil) @@ -1140,6 +1168,9 @@ func (s *testSuite6) TestSetDDLReorgWorkerCnt(c *C) { tk.MustExec("set @@global.tidb_ddl_reorg_worker_cnt = 100") res = tk.MustQuery("select @@global.tidb_ddl_reorg_worker_cnt") res.Check(testkit.Rows("100")) + + _, err = tk.Exec("set @@global.tidb_ddl_reorg_worker_cnt = 129") + c.Assert(terror.ErrorEqual(err, variable.ErrWrongValueForVar), IsTrue, Commentf("err %v", err)) } func (s *testSuite6) TestSetDDLReorgBatchSize(c *C) { @@ -1248,6 +1279,12 @@ func (s *testSuite6) TestGeneratedColumnRelatedDDL(c *C) { c.Assert(err.Error(), Equals, ddl.ErrBadField.GenWithStackByArgs("z", "generated column function").Error()) tk.MustExec("drop table t1;") + + tk.MustExec("create table t1(a int, b int as (a+1), c int as (b+1));") + tk.MustExec("insert into t1 (a) values (1);") + tk.MustGetErrCode("alter table t1 modify column c int as (b+1) first;", mysql.ErrGeneratedColumnNonPrior) + tk.MustGetErrCode("alter table t1 modify column b int as (a+1) after c;", mysql.ErrGeneratedColumnNonPrior) + tk.MustQuery("select * from t1").Check(testkit.Rows("1 2 3")) } func (s *testSuite6) TestSetDDLErrorCountLimit(c *C) { @@ -1439,3 +1476,56 @@ func (s *testSuite6) TestAutoIncrementColumnErrorMessage(c *C) { _, err = tk.Exec("CREATE INDEX idx1 ON t1 ((t1_id + t1_id));") c.Assert(err.Error(), Equals, ddl.ErrExpressionIndexCanNotRefer.GenWithStackByArgs("idx1").Error()) } + +func (s *testRecoverTable) TestRenameMultiTables(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange"), IsNil) + }() + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("create database rename1") + tk.MustExec("create database rename2") + tk.MustExec("create database rename3") + tk.MustExec("create database rename4") + tk.MustExec("create table rename1.t1 (a int primary key auto_increment)") + tk.MustExec("create table rename3.t3 (a int primary key auto_increment)") + tk.MustExec("insert rename1.t1 values ()") + tk.MustExec("insert rename3.t3 values ()") + tk.MustExec("rename table rename1.t1 to rename2.t2, rename3.t3 to rename4.t4") + // Make sure the drop old database doesn't affect t2,t4's operations. + tk.MustExec("drop database rename1") + tk.MustExec("insert rename2.t2 values ()") + tk.MustExec("drop database rename3") + tk.MustExec("insert rename4.t4 values ()") + tk.MustQuery("select * from rename2.t2").Check(testkit.Rows("1", "2")) + tk.MustQuery("select * from rename4.t4").Check(testkit.Rows("1", "2")) + // Rename a table to another table in the same database. + tk.MustExec("rename table rename2.t2 to rename2.t1, rename4.t4 to rename4.t3") + tk.MustExec("insert rename2.t1 values ()") + tk.MustQuery("select * from rename2.t1").Check(testkit.Rows("1", "2", "3")) + tk.MustExec("insert rename4.t3 values ()") + tk.MustQuery("select * from rename4.t3").Check(testkit.Rows("1", "2", "3")) + tk.MustExec("drop database rename2") + tk.MustExec("drop database rename4") + + tk.MustExec("create database rename1") + tk.MustExec("create database rename2") + tk.MustExec("create database rename3") + tk.MustExec("create table rename1.t1 (a int primary key auto_increment)") + tk.MustExec("create table rename3.t3 (a int primary key auto_increment)") + tk.MustGetErrCode("rename table rename1.t1 to rename2.t2, rename3.t3 to rename2.t2", errno.ErrTableExists) + tk.MustExec("rename table rename1.t1 to rename2.t2, rename2.t2 to rename1.t1") + tk.MustExec("rename table rename1.t1 to rename2.t2, rename3.t3 to rename1.t1") + tk.MustExec("use rename1") + tk.MustQuery("show tables").Check(testkit.Rows("t1")) + tk.MustExec("use rename2") + tk.MustQuery("show tables").Check(testkit.Rows("t2")) + tk.MustExec("use rename3") + tk.MustExec("create table rename3.t3 (a int primary key auto_increment)") + tk.MustGetErrCode("rename table rename1.t1 to rename1.t2, rename1.t1 to rename3.t3", errno.ErrTableExists) + tk.MustGetErrCode("rename table rename1.t1 to rename1.t2, rename1.t1 to rename3.t4", errno.ErrFileNotFound) + tk.MustExec("drop database rename1") + tk.MustExec("drop database rename2") + tk.MustExec("drop database rename3") +} diff --git a/executor/delete.go b/executor/delete.go index 03e2558f55f2b..1fe9c26b8ac82 100644 --- a/executor/delete.go +++ b/executor/delete.go @@ -102,10 +102,8 @@ func (e *DeleteExec) deleteSingleTableByChunk(ctx context.Context) error { e.memTracker.Consume(memUsageOfChk) for chunkRow := iter.Begin(); chunkRow != iter.End(); chunkRow = iter.Next() { if batchDelete && rowCount >= batchDMLSize { - e.ctx.StmtCommit() - if err = e.ctx.NewTxn(ctx); err != nil { - // We should return a special error for batch insert. - return ErrBatchInsertFail.GenWithStack("BatchDelete failed with error: %v", err) + if err := e.doBatchDelete(ctx); err != nil { + return err } rowCount = 0 } @@ -123,6 +121,20 @@ func (e *DeleteExec) deleteSingleTableByChunk(ctx context.Context) error { return nil } +func (e *DeleteExec) doBatchDelete(ctx context.Context) error { + txn, err := e.ctx.Txn(false) + if err != nil { + return ErrBatchInsertFail.GenWithStack("BatchDelete failed with error: %v", err) + } + e.memTracker.Consume(-int64(txn.Size())) + e.ctx.StmtCommit() + if err := e.ctx.NewTxn(ctx); err != nil { + // We should return a special error for batch insert. + return ErrBatchInsertFail.GenWithStack("BatchDelete failed with error: %v", err) + } + return nil +} + func (e *DeleteExec) composeTblRowMap(tblRowMap tableRowMapType, colPosInfos []plannercore.TblColPosInfo, joinedRow []types.Datum) error { // iterate all the joined tables, and got the copresonding rows in joinedRow. for _, info := range colPosInfos { diff --git a/executor/delete_test.go b/executor/delete_test.go new file mode 100644 index 0000000000000..278692acdb717 --- /dev/null +++ b/executor/delete_test.go @@ -0,0 +1,124 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor_test + +import ( + "sync" + "time" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/util/testkit" +) + +func (s *testSuite8) TestDeleteLockKey(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec(`drop table if exists t1, t2, t3, t4, t5, t6;`) + + cases := []struct { + ddl string + pre string + tk1Stmt string + tk2Stmt string + }{ + { + "create table t1(k int, kk int, val int, primary key(k, kk), unique key(val))", + "insert into t1 values(1, 2, 3)", + "delete from t1 where val = 3", + "insert into t1 values(1, 3, 3)", + }, + { + "create table t2(k int, kk int, val int, primary key(k, kk))", + "insert into t2 values(1, 1, 1)", + "delete from t2 where k = 1", + "insert into t2 values(1, 1, 2)", + }, + { + "create table t3(k int, kk int, val int, vv int, primary key(k, kk), unique key(val))", + "insert into t3 values(1, 2, 3, 4)", + "delete from t3 where vv = 4", + "insert into t3 values(1, 2, 3, 5)", + }, + { + "create table t4(k int, kk int, val int, vv int, primary key(k, kk), unique key(val))", + "insert into t4 values(1, 2, 3, 4)", + "delete from t4 where 1", + "insert into t4 values(1, 2, 3, 5)", + }, + { + "create table t5(k int, kk int, val int, vv int, primary key(k, kk), unique key(val))", + "insert into t5 values(1, 2, 3, 4), (2, 3, 4, 5)", + "delete from t5 where k in (1, 2, 3, 4)", + "insert into t5 values(1, 2, 3, 5)", + }, + { + "create table t6(k int, kk int, val int, vv int, primary key(k, kk), unique key(val))", + "insert into t6 values(1, 2, 3, 4), (2, 3, 4, 5)", + "delete from t6 where kk between 0 and 10", + "insert into t6 values(1, 2, 3, 5), (2, 3, 4, 6)", + }, + } + var wg sync.WaitGroup + for _, t := range cases { + wg.Add(1) + go func(t struct { + ddl string + pre string + tk1Stmt string + tk2Stmt string + }) { + tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + tk1.MustExec("use test") + tk2.MustExec("use test") + tk1.Se.GetSessionVars().EnableClusteredIndex = false + tk1.MustExec(t.ddl) + tk1.MustExec(t.pre) + tk1.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk1.MustExec(t.tk1Stmt) + doneCh := make(chan struct{}, 1) + go func() { + tk2.MustExec(t.tk2Stmt) + doneCh <- struct{}{} + }() + time.Sleep(50 * time.Millisecond) + tk1.MustExec("commit") + <-doneCh + tk2.MustExec("commit") + wg.Done() + }(t) + } + wg.Wait() +} + +func (s *testSuite8) TestIssue21200(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists TEST1") + tk.MustExec("create database TEST1") + tk.MustExec("use TEST1") + tk.MustExec("create table t(a int)") + tk.MustExec("create table t1(a int)") + tk.MustExec("insert into t values(1)") + tk.MustExec("insert into t1 values(1)") + tk.MustExec("delete a from t a where exists (select 1 from t1 where t1.a=a.a)") + tk.MustQuery("select * from t").Check(testkit.Rows()) + + tk.MustExec("insert into t values(1), (2)") + tk.MustExec("insert into t1 values(2)") + tk.MustExec("prepare stmt from 'delete a from t a where exists (select 1 from t1 where a.a=t1.a and t1.a=?)'") + tk.MustExec("set @a=1") + tk.MustExec("execute stmt using @a") + tk.MustQuery("select * from t").Check(testkit.Rows("2")) +} diff --git a/executor/distsql.go b/executor/distsql.go index 85184cc9f2c01..9f95de0b8775a 100644 --- a/executor/distsql.go +++ b/executor/distsql.go @@ -14,16 +14,18 @@ package executor import ( + "bytes" "context" "fmt" - "math" "runtime" "runtime/trace" "sort" "sync" "sync/atomic" + "time" "unsafe" + "github.com/cznic/mathutil" "github.com/pingcap/errors" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/model" @@ -31,9 +33,11 @@ import ( "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" @@ -42,6 +46,7 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/ranger" @@ -138,54 +143,6 @@ func handleIsExtra(col *expression.Column) bool { return false } -func splitRanges(ranges []*ranger.Range, keepOrder bool, desc bool) ([]*ranger.Range, []*ranger.Range) { - if len(ranges) == 0 || ranges[0].LowVal[0].Kind() == types.KindInt64 { - return ranges, nil - } - idx := sort.Search(len(ranges), func(i int) bool { return ranges[i].HighVal[0].GetUint64() > math.MaxInt64 }) - if idx == len(ranges) { - return ranges, nil - } - if ranges[idx].LowVal[0].GetUint64() > math.MaxInt64 { - signedRanges := ranges[0:idx] - unsignedRanges := ranges[idx:] - if !keepOrder { - return append(unsignedRanges, signedRanges...), nil - } - if desc { - return unsignedRanges, signedRanges - } - return signedRanges, unsignedRanges - } - signedRanges := make([]*ranger.Range, 0, idx+1) - unsignedRanges := make([]*ranger.Range, 0, len(ranges)-idx) - signedRanges = append(signedRanges, ranges[0:idx]...) - if !(ranges[idx].LowVal[0].GetUint64() == math.MaxInt64 && ranges[idx].LowExclude) { - signedRanges = append(signedRanges, &ranger.Range{ - LowVal: ranges[idx].LowVal, - LowExclude: ranges[idx].LowExclude, - HighVal: []types.Datum{types.NewUintDatum(math.MaxInt64)}, - }) - } - if !(ranges[idx].HighVal[0].GetUint64() == math.MaxInt64+1 && ranges[idx].HighExclude) { - unsignedRanges = append(unsignedRanges, &ranger.Range{ - LowVal: []types.Datum{types.NewUintDatum(math.MaxInt64 + 1)}, - HighVal: ranges[idx].HighVal, - HighExclude: ranges[idx].HighExclude, - }) - } - if idx < len(ranges) { - unsignedRanges = append(unsignedRanges, ranges[idx+1:]...) - } - if !keepOrder { - return append(unsignedRanges, signedRanges...), nil - } - if desc { - return unsignedRanges, signedRanges - } - return signedRanges, unsignedRanges -} - // rebuildIndexRanges will be called if there's correlated column in access conditions. We will rebuild the range // by substitute correlated column with the constant. func rebuildIndexRanges(ctx sessionctx.Context, is *plannercore.PhysicalIndexScan, idxCols []*expression.Column, colLens []int) (ranges []*ranger.Range, err error) { @@ -211,6 +168,8 @@ type IndexReaderExecutor struct { index *model.IndexInfo physicalTableID int64 ranges []*ranger.Range + partitions []table.PhysicalTable + // kvRanges are only used for union scan. kvRanges []kv.KeyRange dagPB *tipb.DAGRequest @@ -257,6 +216,20 @@ func (e *IndexReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) error return err } +func (e *IndexReaderExecutor) buildKeyRanges(sc *stmtctx.StatementContext, physicalID int64) ([]kv.KeyRange, error) { + if e.index.ID == -1 { + return distsql.CommonHandleRangesToKVRanges(sc, []int64{physicalID}, e.ranges) + } + return distsql.IndexRangesToKVRanges(sc, physicalID, e.index.ID, e.ranges, e.feedback) +} + +func (e *IndexReaderExecutor) buildPartitionTableKeyRanges(sc *stmtctx.StatementContext, physicalIDs []int64) ([]kv.KeyRange, error) { + if e.index.ID == -1 { + return distsql.CommonHandleRangesToKVRanges(sc, physicalIDs, e.ranges) + } + return distsql.IndexRangesToKVRangesForTables(sc, physicalIDs, e.index.ID, e.ranges, e.feedback) +} + // Open implements the Executor Open interface. func (e *IndexReaderExecutor) Open(ctx context.Context) error { var err error @@ -266,11 +239,23 @@ func (e *IndexReaderExecutor) Open(ctx context.Context) error { return err } } - kvRanges, err := distsql.IndexRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, e.physicalTableID, e.index.ID, e.ranges, e.feedback) + + sc := e.ctx.GetSessionVars().StmtCtx + var kvRanges []kv.KeyRange + if len(e.partitions) > 0 { + physicalIDs := make([]int64, 0, len(e.partitions)) + for _, p := range e.partitions { + pid := p.GetPhysicalID() + physicalIDs = append(physicalIDs, pid) + } + kvRanges, err = e.buildPartitionTableKeyRanges(sc, physicalIDs) + } else { + kvRanges, err = e.buildKeyRanges(sc, e.physicalTableID) + } if err != nil { - e.feedback.Invalidate() return err } + return e.open(ctx, kvRanges) } @@ -300,6 +285,7 @@ func (e *IndexReaderExecutor) open(ctx context.Context, kvRanges []kv.KeyRange) SetStreaming(e.streaming). SetFromSessionVars(e.ctx.GetSessionVars()). SetMemTracker(e.memTracker). + SetFromInfoSchema(infoschema.GetInfoSchema(e.ctx)). Build() if err != nil { e.feedback.Invalidate() @@ -365,6 +351,8 @@ type IndexLookUpExecutor struct { colLens []int // PushedLimit is used to skip the preceding and tailing handles when Limit is sunk into IndexLookUpReader. PushedLimit *plannercore.PushedDownLimit + + stats *IndexLookUpRunTimeStats } type getHandleType int8 @@ -411,6 +399,7 @@ func (e *IndexLookUpExecutor) open(ctx context.Context) error { // instead of in function "Open", because this "IndexLookUpExecutor" may be // constructed by a "IndexLookUpJoin" and "Open" will not be called in that // situation. + e.initRuntimeStats() e.memTracker = memory.NewTracker(e.id, -1) e.memTracker.AttachTo(e.ctx.GetSessionVars().StmtCtx.MemTracker) @@ -474,7 +463,6 @@ func (e *IndexLookUpExecutor) startIndexWorker(ctx context.Context, kvRanges []k collExec := true e.dagPB.CollectExecutionSummaries = &collExec } - tracker := memory.NewTracker(memory.LabelForIndexWorker, -1) tracker.AttachTo(e.memTracker) var builder distsql.RequestBuilder @@ -486,13 +474,15 @@ func (e *IndexLookUpExecutor) startIndexWorker(ctx context.Context, kvRanges []k SetStreaming(e.indexStreaming). SetFromSessionVars(e.ctx.GetSessionVars()). SetMemTracker(tracker). + SetFromInfoSchema(infoschema.GetInfoSchema(e.ctx)). Build() if err != nil { return err } tps := e.getRetTpsByHandle() + idxID := e.getIndexPlanRootID() // Since the first read only need handle information. So its returned col is only 1. - result, err := distsql.SelectWithRuntimeStats(ctx, e.ctx, kvReq, tps, e.feedback, getPhysicalPlanIDs(e.idxPlans), e.id) + result, err := distsql.SelectWithRuntimeStats(ctx, e.ctx, kvReq, tps, e.feedback, getPhysicalPlanIDs(e.idxPlans), idxID) if err != nil { return err } @@ -552,7 +542,11 @@ func (e *IndexLookUpExecutor) startTableWorker(ctx context.Context, workCh <-cha ctx1, cancel := context.WithCancel(ctx) go func() { defer trace.StartRegion(ctx1, "IndexLookUpTableWorker").End() + startTime := time.Now() worker.pickAndExecTask(ctx1) + if e.stats != nil { + atomic.AddInt64(&e.stats.TableRowScan, int64(time.Since(startTime))) + } cancel() e.tblWorkerWg.Done() }() @@ -561,7 +555,7 @@ func (e *IndexLookUpExecutor) startTableWorker(ctx context.Context, workCh <-cha func (e *IndexLookUpExecutor) buildTableReader(ctx context.Context, handles []kv.Handle) (Executor, error) { tableReaderExec := &TableReaderExecutor{ - baseExecutor: newBaseExecutor(e.ctx, e.schema, 0), + baseExecutor: newBaseExecutor(e.ctx, e.schema, e.getTableRootPlanID()), table: e.table, dagPB: e.tableRequest, startTS: e.startTS, @@ -616,9 +610,10 @@ func (e *IndexLookUpExecutor) Next(ctx context.Context, req *chunk.Chunk) error if resultTask == nil { return nil } - for resultTask.cursor < len(resultTask.rows) { - req.AppendRow(resultTask.rows[resultTask.cursor]) - resultTask.cursor++ + if resultTask.cursor < len(resultTask.rows) { + numToAppend := mathutil.Min(len(resultTask.rows)-resultTask.cursor, req.RequiredRows()-req.NumRows()) + req.AppendRows(resultTask.rows[resultTask.cursor : resultTask.cursor+numToAppend]) + resultTask.cursor += numToAppend if req.IsFull() { return nil } @@ -646,6 +641,32 @@ func (e *IndexLookUpExecutor) getResultTask() (*lookupTableTask, error) { return e.resultCurr, nil } +func (e *IndexLookUpExecutor) initRuntimeStats() { + if e.runtimeStats != nil { + if e.stats == nil { + e.stats = &IndexLookUpRunTimeStats{ + indexScanBasicStats: &execdetails.BasicRuntimeStats{}, + Concurrency: e.ctx.GetSessionVars().IndexLookupConcurrency(), + } + e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } + } +} + +func (e *IndexLookUpExecutor) getIndexPlanRootID() int { + if len(e.idxPlans) > 0 { + return e.idxPlans[len(e.idxPlans)-1].ID() + } + return e.id +} + +func (e *IndexLookUpExecutor) getTableRootPlanID() int { + if len(e.tblPlans) > 0 { + return e.tblPlans[len(e.tblPlans)-1].ID() + } + return e.id +} + // indexWorker is used by IndexLookUpExecutor to maintain index lookup background goroutines. type indexWorker struct { idxLookup *IndexLookUpExecutor @@ -688,8 +709,16 @@ func (w *indexWorker) fetchHandles(ctx context.Context, result distsql.SelectRes }() retTps := w.idxLookup.getRetTpsByHandle() chk := chunk.NewChunkWithCapacity(retTps, w.idxLookup.maxChunkSize) + idxID := w.idxLookup.getIndexPlanRootID() + if w.idxLookup.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl != nil { + if idxID != w.idxLookup.id && w.idxLookup.stats != nil { + w.idxLookup.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(idxID, w.idxLookup.stats.indexScanBasicStats) + } + } for { + startTime := time.Now() handles, retChunk, scannedKeys, err := w.extractTaskHandles(ctx, chk, result, count) + finishFetch := time.Now() if err != nil { doneCh := make(chan error, 1) doneCh <- err @@ -703,6 +732,7 @@ func (w *indexWorker) fetchHandles(ctx context.Context, result distsql.SelectRes return count, nil } task := w.buildTableTask(handles, retChunk) + finishBuild := time.Now() select { case <-ctx.Done(): return count, nil @@ -711,6 +741,11 @@ func (w *indexWorker) fetchHandles(ctx context.Context, result distsql.SelectRes case w.workCh <- task: w.resultCh <- task } + if w.idxLookup.stats != nil { + atomic.AddInt64(&w.idxLookup.stats.FetchHandle, int64(finishFetch.Sub(startTime))) + atomic.AddInt64(&w.idxLookup.stats.TaskWait, int64(time.Since(finishBuild))) + atomic.AddInt64(&w.idxLookup.stats.FetchHandleTotal, int64(time.Since(startTime))) + } } } @@ -742,10 +777,14 @@ func (w *indexWorker) extractTaskHandles(ctx context.Context, chk *chunk.Chunk, } } chk.SetRequiredRows(requiredRows, w.maxChunkSize) + startTime := time.Now() err = errors.Trace(idxResult.Next(ctx, chk)) if err != nil { return handles, nil, scannedKeys, err } + if w.idxLookup.stats != nil { + w.idxLookup.stats.indexScanBasicStats.Record(time.Since(startTime), chk.NumRows()) + } if chk.NumRows() == 0 { return handles, retChk, scannedKeys, nil } @@ -858,6 +897,9 @@ func (w *tableWorker) pickAndExecTask(ctx context.Context) { return } err := w.executeTask(ctx, task) + if w.idxLookup.stats != nil { + atomic.AddInt64(&w.idxLookup.stats.TableTaskNum, 1) + } task.doneCh <- err } } @@ -873,9 +915,8 @@ func (e *IndexLookUpExecutor) getHandle(row chunk.Row, handleIdx []int, // original value(the primary key) here. // We use a trick to avoid encoding the "sortKey" again by changing the charset // collation to `binary`. - // TODO: Add the restore value to the secondary index to remove this trick. rtp := e.handleCols[i].RetType - if collate.NewCollationEnabled() && rtp.EvalType() == types.ETString && + if collate.NewCollationEnabled() && e.table.Meta().CommonHandleVersion == 0 && rtp.EvalType() == types.ETString && !mysql.HasBinaryFlag(rtp.Flag) && tp == getHandleFromIndex { rtp = rtp.Clone() rtp.Collate = charset.CollationBin @@ -910,6 +951,67 @@ func (e *IndexLookUpExecutor) getHandle(row chunk.Row, handleIdx []int, return } +// IndexLookUpRunTimeStats record the indexlookup runtime stat +type IndexLookUpRunTimeStats struct { + // indexScanBasicStats uses to record basic runtime stats for index scan. + indexScanBasicStats *execdetails.BasicRuntimeStats + FetchHandleTotal int64 + FetchHandle int64 + TaskWait int64 + TableRowScan int64 + TableTaskNum int64 + Concurrency int +} + +func (e *IndexLookUpRunTimeStats) String() string { + var buf bytes.Buffer + fetchHandle := atomic.LoadInt64(&e.FetchHandleTotal) + indexScan := atomic.LoadInt64(&e.FetchHandle) + taskWait := atomic.LoadInt64(&e.TaskWait) + tableScan := atomic.LoadInt64(&e.TableRowScan) + tableTaskNum := atomic.LoadInt64(&e.TableTaskNum) + concurrency := e.Concurrency + if indexScan != 0 { + buf.WriteString(fmt.Sprintf("index_task: {total_time: %s, fetch_handle: %s, build: %s, wait: %s}", + execdetails.FormatDuration(time.Duration(fetchHandle)), + execdetails.FormatDuration(time.Duration(indexScan)), + execdetails.FormatDuration(time.Duration(fetchHandle-indexScan-taskWait)), + execdetails.FormatDuration(time.Duration(taskWait)))) + } + if tableScan != 0 { + if buf.Len() > 0 { + buf.WriteByte(',') + } + buf.WriteString(fmt.Sprintf(" table_task: {total_time: %v, num: %d, concurrency: %d}", execdetails.FormatDuration(time.Duration(tableScan)), tableTaskNum, concurrency)) + } + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (e *IndexLookUpRunTimeStats) Clone() execdetails.RuntimeStats { + newRs := *e + return &newRs +} + +// Merge implements the RuntimeStats interface. +func (e *IndexLookUpRunTimeStats) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*IndexLookUpRunTimeStats) + if !ok { + return + } + e.FetchHandleTotal += tmp.FetchHandleTotal + e.FetchHandle += tmp.FetchHandle + e.TaskWait += tmp.TaskWait + e.TableRowScan += tmp.TableRowScan + e.TableTaskNum += tmp.TableTaskNum + e.Concurrency += tmp.Concurrency +} + +// Tp implements the RuntimeStats interface. +func (e *IndexLookUpRunTimeStats) Tp() int { + return execdetails.TpIndexLookUpRunTimeStats +} + func (w *tableWorker) compareData(ctx context.Context, task *lookupTableTask, tableReader Executor) error { chk := newFirstChunk(tableReader) tblInfo := w.idxLookup.table.Meta() @@ -949,17 +1051,24 @@ func (w *tableWorker) compareData(ctx context.Context, task *lookupTableTask, ta vals = append(vals, row.GetDatum(i, &col.FieldType)) } tablecodec.TruncateIndexValues(tblInfo, w.idxLookup.index, vals) + sctx := w.idxLookup.ctx.GetSessionVars().StmtCtx for i, val := range vals { col := w.idxTblCols[i] tp := &col.FieldType - ret := chunk.Compare(idxRow, i, &val) - if ret != 0 { - return errors.Errorf("col %s, handle %#v, index:%#v != record:%#v", col.Name, handle, idxRow.GetDatum(i, tp), val) + idxVal := idxRow.GetDatum(i, tp) + tablecodec.TruncateIndexValue(&idxVal, w.idxLookup.index.Columns[i], col.ColumnInfo) + cmpRes, err := idxVal.CompareDatum(sctx, &val) + if err != nil { + return errors.Errorf("col %s, handle %#v, index:%#v != record:%#v, compare err:%#v", col.Name, + handle, idxRow.GetDatum(i, tp), val, err) + } + if cmpRes != 0 { + return errors.Errorf("col %s, handle %#v, index:%#v != record:%#v", col.Name, + handle, idxRow.GetDatum(i, tp), val) } } } } - return nil } diff --git a/executor/distsql_test.go b/executor/distsql_test.go index ce2013a04ac2c..c98f7f9e2f70c 100644 --- a/executor/distsql_test.go +++ b/executor/distsql_test.go @@ -19,13 +19,14 @@ import ( "fmt" "runtime/pprof" "strings" + "time" . "github.com/pingcap/check" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -36,14 +37,17 @@ import ( func checkGoroutineExists(keyword string) bool { buf := new(bytes.Buffer) profile := pprof.Lookup("goroutine") - profile.WriteTo(buf, 1) + err := profile.WriteTo(buf, 1) + if err != nil { + panic(err) + } str := buf.String() return strings.Contains(str, keyword) } func (s *testSuite3) TestCopClientSend(c *C) { c.Skip("not stable") - if _, ok := s.store.GetClient().(*tikv.CopClient); !ok { + if _, ok := s.store.GetClient().(*copr.CopClient); !ok { // Make sure the store is tikv store. return } @@ -76,7 +80,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { err = rs.Next(ctx, req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetMyDecimal(0).String(), Equals, "499500") - rs.Close() + c.Assert(rs.Close(), IsNil) // Split one region. key := tablecodec.EncodeRowKeyWithHandle(tblID, kv.IntHandle(500)) @@ -91,7 +95,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { err = rs.Next(ctx, req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetMyDecimal(0).String(), Equals, "499500") - rs.Close() + c.Assert(rs.Close(), IsNil) // Check there is no goroutine leak. rs, err = tk.Exec("select * from copclient order by id") @@ -99,7 +103,7 @@ func (s *testSuite3) TestCopClientSend(c *C) { req = rs.NewChunk() err = rs.Next(ctx, req) c.Assert(err, IsNil) - rs.Close() + c.Assert(rs.Close(), IsNil) keyword := "(*copIterator).work" c.Check(checkGoroutineExists(keyword), IsFalse) } @@ -217,7 +221,7 @@ func (s *testSuite3) TestInconsistentIndex(c *C) { for i := 0; i < 10; i++ { txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = idxOp.Create(ctx, txn.GetUnionStore(), types.MakeDatums(i+10), kv.IntHandle(100+i)) + _, err = idxOp.Create(ctx, txn, types.MakeDatums(i+10), kv.IntHandle(100+i), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -234,7 +238,7 @@ func (s *testSuite3) TestInconsistentIndex(c *C) { for i := 0; i < 10; i++ { txn, err := s.store.Begin() c.Assert(err, IsNil) - err = idxOp.Delete(ctx.GetSessionVars().StmtCtx, txn, types.MakeDatums(i+10), kv.IntHandle(100+i)) + err = idxOp.Delete(ctx.GetSessionVars().StmtCtx, txn.GetUnionStore(), types.MakeDatums(i+10), kv.IntHandle(100+i)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -255,3 +259,30 @@ func (s *testSuite3) TestPushLimitDownIndexLookUpReader(c *C) { tk.MustQuery("select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1").Check(testkit.Rows("3 3 3")) tk.MustQuery("select * from tbl use index(idx_b_c) where b > 1 and c > 1 limit 2,1").Check(testkit.Rows("4 4 4")) } + +func (s *testSuite3) TestIndexLookUpStats(c *C) { + stats := &executor.IndexLookUpRunTimeStats{ + FetchHandleTotal: int64(5 * time.Second), + FetchHandle: int64(2 * time.Second), + TaskWait: int64(2 * time.Second), + TableRowScan: int64(2 * time.Second), + TableTaskNum: 2, + Concurrency: 1, + } + c.Assert(stats.String(), Equals, "index_task: {total_time: 5s, fetch_handle: 2s, build: 1s, wait: 2s}, table_task: {total_time: 2s, num: 2, concurrency: 1}") + c.Assert(stats.String(), Equals, stats.Clone().String()) + stats.Merge(stats.Clone()) + c.Assert(stats.String(), Equals, "index_task: {total_time: 10s, fetch_handle: 4s, build: 2s, wait: 4s}, table_task: {total_time: 4s, num: 4, concurrency: 2}") +} + +func (s *testSuite3) TestIndexLookUpGetResultChunk(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tbl") + tk.MustExec("create table tbl(a int, b int, c int, key idx_a(a))") + for i := 0; i < 101; i++ { + tk.MustExec(fmt.Sprintf("insert into tbl values(%d,%d,%d)", i, i, i)) + } + tk.MustQuery("select * from tbl use index(idx_a) where a > 99 order by a asc limit 1").Check(testkit.Rows("100 100 100")) + tk.MustQuery("select * from tbl use index(idx_a) where a > 10 order by a asc limit 4,1").Check(testkit.Rows("15 15 15")) +} diff --git a/executor/errors.go b/executor/errors.go index df9dbed68e2e4..bbd8859270261 100644 --- a/executor/errors.go +++ b/executor/errors.go @@ -14,37 +14,40 @@ package executor import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // Error instances. var ( - ErrGetStartTS = terror.ClassExecutor.New(mysql.ErrGetStartTS, mysql.MySQLErrName[mysql.ErrGetStartTS]) - ErrUnknownPlan = terror.ClassExecutor.New(mysql.ErrUnknownPlan, mysql.MySQLErrName[mysql.ErrUnknownPlan]) - ErrPrepareMulti = terror.ClassExecutor.New(mysql.ErrPrepareMulti, mysql.MySQLErrName[mysql.ErrPrepareMulti]) - ErrPrepareDDL = terror.ClassExecutor.New(mysql.ErrPrepareDDL, mysql.MySQLErrName[mysql.ErrPrepareDDL]) - ErrResultIsEmpty = terror.ClassExecutor.New(mysql.ErrResultIsEmpty, mysql.MySQLErrName[mysql.ErrResultIsEmpty]) - ErrBuildExecutor = terror.ClassExecutor.New(mysql.ErrBuildExecutor, mysql.MySQLErrName[mysql.ErrBuildExecutor]) - ErrBatchInsertFail = terror.ClassExecutor.New(mysql.ErrBatchInsertFail, mysql.MySQLErrName[mysql.ErrBatchInsertFail]) + ErrGetStartTS = dbterror.ClassExecutor.NewStd(mysql.ErrGetStartTS) + ErrUnknownPlan = dbterror.ClassExecutor.NewStd(mysql.ErrUnknownPlan) + ErrPrepareMulti = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareMulti) + ErrPrepareDDL = dbterror.ClassExecutor.NewStd(mysql.ErrPrepareDDL) + ErrResultIsEmpty = dbterror.ClassExecutor.NewStd(mysql.ErrResultIsEmpty) + ErrBuildExecutor = dbterror.ClassExecutor.NewStd(mysql.ErrBuildExecutor) + ErrBatchInsertFail = dbterror.ClassExecutor.NewStd(mysql.ErrBatchInsertFail) + ErrUnsupportedPs = dbterror.ClassExecutor.NewStd(mysql.ErrUnsupportedPs) + ErrSubqueryMoreThan1Row = dbterror.ClassExecutor.NewStd(mysql.ErrSubqueryNo1Row) - ErrCantCreateUserWithGrant = terror.ClassExecutor.New(mysql.ErrCantCreateUserWithGrant, mysql.MySQLErrName[mysql.ErrCantCreateUserWithGrant]) - ErrPasswordNoMatch = terror.ClassExecutor.New(mysql.ErrPasswordNoMatch, mysql.MySQLErrName[mysql.ErrPasswordNoMatch]) - ErrCannotUser = terror.ClassExecutor.New(mysql.ErrCannotUser, mysql.MySQLErrName[mysql.ErrCannotUser]) - ErrPasswordFormat = terror.ClassExecutor.New(mysql.ErrPasswordFormat, mysql.MySQLErrName[mysql.ErrPasswordFormat]) - ErrCantChangeTxCharacteristics = terror.ClassExecutor.New(mysql.ErrCantChangeTxCharacteristics, mysql.MySQLErrName[mysql.ErrCantChangeTxCharacteristics]) - ErrPsManyParam = terror.ClassExecutor.New(mysql.ErrPsManyParam, mysql.MySQLErrName[mysql.ErrPsManyParam]) - ErrAdminCheckTable = terror.ClassExecutor.New(mysql.ErrAdminCheckTable, mysql.MySQLErrName[mysql.ErrAdminCheckTable]) - ErrDBaccessDenied = terror.ClassExecutor.New(mysql.ErrDBaccessDenied, mysql.MySQLErrName[mysql.ErrDBaccessDenied]) - ErrTableaccessDenied = terror.ClassExecutor.New(mysql.ErrTableaccessDenied, mysql.MySQLErrName[mysql.ErrTableaccessDenied]) - ErrBadDB = terror.ClassExecutor.New(mysql.ErrBadDB, mysql.MySQLErrName[mysql.ErrBadDB]) - ErrWrongObject = terror.ClassExecutor.New(mysql.ErrWrongObject, mysql.MySQLErrName[mysql.ErrWrongObject]) - ErrRoleNotGranted = terror.ClassPrivilege.New(mysql.ErrRoleNotGranted, mysql.MySQLErrName[mysql.ErrRoleNotGranted]) - ErrDeadlock = terror.ClassExecutor.New(mysql.ErrLockDeadlock, mysql.MySQLErrName[mysql.ErrLockDeadlock]) - ErrQueryInterrupted = terror.ClassExecutor.New(mysql.ErrQueryInterrupted, mysql.MySQLErrName[mysql.ErrQueryInterrupted]) + ErrCantCreateUserWithGrant = dbterror.ClassExecutor.NewStd(mysql.ErrCantCreateUserWithGrant) + ErrPasswordNoMatch = dbterror.ClassExecutor.NewStd(mysql.ErrPasswordNoMatch) + ErrCannotUser = dbterror.ClassExecutor.NewStd(mysql.ErrCannotUser) + ErrPasswordFormat = dbterror.ClassExecutor.NewStd(mysql.ErrPasswordFormat) + ErrCantChangeTxCharacteristics = dbterror.ClassExecutor.NewStd(mysql.ErrCantChangeTxCharacteristics) + ErrPsManyParam = dbterror.ClassExecutor.NewStd(mysql.ErrPsManyParam) + ErrAdminCheckTable = dbterror.ClassExecutor.NewStd(mysql.ErrAdminCheckTable) + ErrDBaccessDenied = dbterror.ClassExecutor.NewStd(mysql.ErrDBaccessDenied) + ErrTableaccessDenied = dbterror.ClassExecutor.NewStd(mysql.ErrTableaccessDenied) + ErrBadDB = dbterror.ClassExecutor.NewStd(mysql.ErrBadDB) + ErrWrongObject = dbterror.ClassExecutor.NewStd(mysql.ErrWrongObject) + ErrRoleNotGranted = dbterror.ClassPrivilege.NewStd(mysql.ErrRoleNotGranted) + ErrDeadlock = dbterror.ClassExecutor.NewStd(mysql.ErrLockDeadlock) + ErrQueryInterrupted = dbterror.ClassExecutor.NewStd(mysql.ErrQueryInterrupted) + ErrInvalidSplitRegionRanges = dbterror.ClassExecutor.NewStd(mysql.ErrInvalidSplitRegionRanges) - ErrBRIEBackupFailed = terror.ClassExecutor.New(mysql.ErrBRIEBackupFailed, mysql.MySQLErrName[mysql.ErrBRIEBackupFailed]) - ErrBRIERestoreFailed = terror.ClassExecutor.New(mysql.ErrBRIERestoreFailed, mysql.MySQLErrName[mysql.ErrBRIERestoreFailed]) - ErrBRIEImportFailed = terror.ClassExecutor.New(mysql.ErrBRIEImportFailed, mysql.MySQLErrName[mysql.ErrBRIEImportFailed]) - ErrBRIEExportFailed = terror.ClassExecutor.New(mysql.ErrBRIEExportFailed, mysql.MySQLErrName[mysql.ErrBRIEExportFailed]) + ErrBRIEBackupFailed = dbterror.ClassExecutor.NewStd(mysql.ErrBRIEBackupFailed) + ErrBRIERestoreFailed = dbterror.ClassExecutor.NewStd(mysql.ErrBRIERestoreFailed) + ErrBRIEImportFailed = dbterror.ClassExecutor.NewStd(mysql.ErrBRIEImportFailed) + ErrBRIEExportFailed = dbterror.ClassExecutor.NewStd(mysql.ErrBRIEExportFailed) ) diff --git a/executor/executor.go b/executor/executor.go index 4eb6c7f9f0413..201ef2e248f56 100644 --- a/executor/executor.go +++ b/executor/executor.go @@ -47,6 +47,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + tikvutil "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" @@ -112,6 +113,7 @@ const ( // globalPanicOnExceed panics when GlobalDisTracker storage usage exceeds storage quota. type globalPanicOnExceed struct { + memory.BaseOOMAction mutex sync.Mutex // For synchronization. } @@ -142,8 +144,10 @@ func (a *globalPanicOnExceed) Action(t *memory.Tracker) { panic(msg) } -// SetFallback sets a fallback action. -func (a *globalPanicOnExceed) SetFallback(memory.ActionOnExceed) {} +// GetPriority get the priority of the Action +func (a *globalPanicOnExceed) GetPriority() int64 { + return memory.DefPanicPriority +} // base returns the baseExecutor of an executor, don't override this method! func (e *baseExecutor) base() *baseExecutor { @@ -203,6 +207,11 @@ func (e *baseExecutor) Next(ctx context.Context, req *chunk.Chunk) error { return nil } +func (e *baseExecutor) updateDeltaForTableID(id int64) { + txnCtx := e.ctx.GetSessionVars().TxnCtx + txnCtx.UpdateDeltaForTable(id, 0, 0, map[int64]int64{}) +} + func newBaseExecutor(ctx sessionctx.Context, schema *expression.Schema, id int, children ...Executor) baseExecutor { e := baseExecutor{ children: children, @@ -943,6 +952,18 @@ func (e *SelectLockExec) Next(ctx context.Context, req *chunk.Chunk) error { lockWaitTime = int64(e.Lock.WaitSec) * 1000 } + if len(e.tblID2Handle) > 0 { + for id := range e.tblID2Handle { + e.updateDeltaForTableID(id) + } + } + if len(e.partitionedTable) > 0 { + for _, p := range e.partitionedTable { + pid := p.Meta().ID + e.updateDeltaForTableID(pid) + } + } + return doLockKeys(ctx, e.ctx, newLockCtx(e.ctx.GetSessionVars(), lockWaitTime), e.keys...) } @@ -975,7 +996,7 @@ func doLockKeys(ctx context.Context, se sessionctx.Context, lockCtx *kv.LockCtx, } var lockKeyStats *execdetails.LockKeysDetails ctx = context.WithValue(ctx, execdetails.LockKeysDetailCtxKey, &lockKeyStats) - err = txn.LockKeys(sessionctx.SetCommitCtx(ctx, se), lockCtx, keys...) + err = txn.LockKeys(tikvutil.SetSessionID(ctx, se.GetSessionVars().ConnectionID), lockCtx, keys...) if lockKeyStats != nil { sctx.MergeLockKeysExecDetails(lockKeyStats) } @@ -995,6 +1016,9 @@ type LimitExec struct { meetFirstBatch bool childResult *chunk.Chunk + + // columnIdxsUsedByChild keep column indexes of child executor used for inline projection + columnIdxsUsedByChild []int } // Next implements the Executor Next interface. @@ -1025,26 +1049,42 @@ func (e *LimitExec) Next(ctx context.Context, req *chunk.Chunk) error { if begin == end { break } - req.Append(e.childResult, int(begin), int(end)) + if e.columnIdxsUsedByChild != nil { + req.Append(e.childResult.Prune(e.columnIdxsUsedByChild), int(begin), int(end)) + } else { + req.Append(e.childResult, int(begin), int(end)) + } return nil } e.cursor += batchSize } - e.adjustRequiredRows(req) - err := Next(ctx, e.children[0], req) + e.childResult.Reset() + e.childResult = e.childResult.SetRequiredRows(req.RequiredRows(), e.maxChunkSize) + e.adjustRequiredRows(e.childResult) + err := Next(ctx, e.children[0], e.childResult) if err != nil { return err } - batchSize := uint64(req.NumRows()) + batchSize := uint64(e.childResult.NumRows()) // no more data. if batchSize == 0 { return nil } if e.cursor+batchSize > e.end { - req.TruncateTo(int(e.end - e.cursor)) + e.childResult.TruncateTo(int(e.end - e.cursor)) batchSize = e.end - e.cursor } e.cursor += batchSize + + if e.columnIdxsUsedByChild != nil { + for i, childIdx := range e.columnIdxsUsedByChild { + if err = req.SwapColumn(i, e.childResult, childIdx); err != nil { + return err + } + } + } else { + req.SwapColumns(e.childResult) + } return nil } @@ -1111,17 +1151,16 @@ func init() { return nil, err } chk := newFirstChunk(exec) - for { - err = Next(ctx, exec, chk) - if err != nil { - return nil, err - } - if chk.NumRows() == 0 { - return nil, nil - } - row := chk.GetRow(0).GetDatumRow(retTypes(exec)) - return row, err + + err = Next(ctx, exec, chk) + if err != nil { + return nil, err } + if chk.NumRows() == 0 { + return nil, nil + } + row := chk.GetRow(0).GetDatumRow(retTypes(exec)) + return row, err } } @@ -1292,7 +1331,10 @@ func (e *TableScanExec) nextChunk4InfoSchema(ctx context.Context, chk *chunk.Chu columns[i] = table.ToColumn(colInfo) } mutableRow := chunk.MutRowFromTypes(retTypes(e)) - err := e.t.IterRecords(e.ctx, nil, columns, func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { + type tableIter interface { + IterRecords(sessionctx.Context, []*table.Column, table.RecordIterFunc) error + } + err := (e.t.(tableIter)).IterRecords(e.ctx, columns, func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { mutableRow.SetDatums(rec...) e.virtualTableChunkList.AppendRow(mutableRow.ToRow()) return true, nil @@ -1352,7 +1394,7 @@ func (e *MaxOneRowExec) Next(ctx context.Context, req *chunk.Chunk) error { } return nil } else if num != 1 { - return errors.New("subquery returns more than 1 row") + return ErrSubqueryMoreThan1Row } childChunk := newFirstChunk(e.children[0]) @@ -1361,7 +1403,7 @@ func (e *MaxOneRowExec) Next(ctx context.Context, req *chunk.Chunk) error { return err } if childChunk.NumRows() != 0 { - return errors.New("subquery returns more than 1 row") + return ErrSubqueryMoreThan1Row } return nil @@ -1567,6 +1609,7 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.OriginalSQL = s.Text() if explainStmt, ok := s.(*ast.ExplainStmt); ok { sc.InExplainStmt = true + sc.IgnoreExplainIDSuffix = (strings.ToLower(explainStmt.Format) == ast.ExplainFormatBrief) s = explainStmt.Stmt } if _, ok := s.(*ast.ExplainForStmt); ok { @@ -1586,27 +1629,31 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { sc.TruncateAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.AllowInvalidDate = vars.SQLMode.HasAllowInvalidDatesMode() - sc.IgnoreZeroInDate = !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate + sc.IgnoreZeroInDate = !vars.SQLMode.HasNoZeroInDateMode() || !vars.SQLMode.HasNoZeroDateMode() || !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate sc.Priority = stmt.Priority case *ast.InsertStmt: sc.InInsertStmt = true // For insert statement (not for update statement), disabling the StrictSQLMode // should make TruncateAsWarning and DividedByZeroAsWarning, - // but should not make DupKeyAsWarning or BadNullAsWarning, + // but should not make DupKeyAsWarning. sc.DupKeyAsWarning = stmt.IgnoreErr - sc.BadNullAsWarning = stmt.IgnoreErr + sc.BadNullAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr + sc.IgnoreNoPartition = stmt.IgnoreErr sc.TruncateAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.AllowInvalidDate = vars.SQLMode.HasAllowInvalidDatesMode() - sc.IgnoreZeroInDate = !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate + sc.IgnoreZeroInDate = !vars.SQLMode.HasNoZeroInDateMode() || !vars.SQLMode.HasNoZeroDateMode() || !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate sc.Priority = stmt.Priority case *ast.CreateTableStmt, *ast.AlterTableStmt: // Make sure the sql_mode is strict when checking column default value. + sc.InCreateOrAlterStmt = true case *ast.LoadDataStmt: sc.DupKeyAsWarning = true sc.BadNullAsWarning = true sc.TruncateAsWarning = !vars.StrictSQLMode sc.InLoadDataStmt = true + // return warning instead of error when load data meet no partition for value + sc.IgnoreNoPartition = true case *ast.SelectStmt: sc.InSelectStmt = true @@ -1673,6 +1720,9 @@ func ResetContextOfStmt(ctx sessionctx.Context, s ast.StmtNode) (err error) { vars.StmtCtx = sc vars.PrevFoundInPlanCache = vars.FoundInPlanCache vars.FoundInPlanCache = false + vars.ClearStmtVars() + vars.PrevFoundInBinding = vars.FoundInBinding + vars.FoundInBinding = false return } @@ -1684,8 +1734,9 @@ func ResetUpdateStmtCtx(sc *stmtctx.StatementContext, stmt *ast.UpdateStmt, vars sc.TruncateAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.DividedByZeroAsWarning = !vars.StrictSQLMode || stmt.IgnoreErr sc.AllowInvalidDate = vars.SQLMode.HasAllowInvalidDatesMode() - sc.IgnoreZeroInDate = !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate + sc.IgnoreZeroInDate = !vars.SQLMode.HasNoZeroInDateMode() || !vars.SQLMode.HasNoZeroDateMode() || !vars.StrictSQLMode || stmt.IgnoreErr || sc.AllowInvalidDate sc.Priority = stmt.Priority + sc.IgnoreNoPartition = stmt.IgnoreErr } // FillVirtualColumnValue will calculate the virtual column value by evaluating generated diff --git a/executor/executor_pkg_test.go b/executor/executor_pkg_test.go index bca52e2632bb5..d8315bc180a84 100644 --- a/executor/executor_pkg_test.go +++ b/executor/executor_pkg_test.go @@ -16,6 +16,10 @@ package executor import ( "context" "crypto/tls" + "runtime" + "strconv" + "time" + "unsafe" . "github.com/pingcap/check" "github.com/pingcap/failpoint" @@ -23,6 +27,7 @@ import ( "github.com/pingcap/parser/auth" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/executor/aggfuncs" "github.com/pingcap/tidb/expression" plannerutil "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx/variable" @@ -51,7 +56,8 @@ type testExecSerialSuite struct { // mockSessionManager is a mocked session manager which is used for test. type mockSessionManager struct { - PS []*util.ProcessInfo + PS []*util.ProcessInfo + serverID uint64 } // ShowProcessList implements the SessionManager.ShowProcessList interface. @@ -74,12 +80,22 @@ func (msm *mockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, boo // Kill implements the SessionManager.Kill interface. func (msm *mockSessionManager) Kill(cid uint64, query bool) { +} +func (msm *mockSessionManager) KillAllConnections() { } func (msm *mockSessionManager) UpdateTLSConfig(cfg *tls.Config) { } +func (msm *mockSessionManager) ServerID() uint64 { + return msm.serverID +} + +func (msm *mockSessionManager) SetServerID(serverID uint64) { + msm.serverID = serverID +} + func (s *testExecSuite) TestShowProcessList(c *C) { // Compose schema. names := []string{"Id", "User", "Host", "db", "Command", "Time", "State", "Info"} @@ -234,6 +250,7 @@ func (s *testExecSuite) TestGetFieldsFromLine(c *C) { FieldsInfo: &ast.FieldsClause{ Enclosed: '"', Terminated: ",", + Escaped: '\\', }, } @@ -247,6 +264,33 @@ func (s *testExecSuite) TestGetFieldsFromLine(c *C) { c.Assert(err, IsNil) } +func (s *testExecSerialSuite) TestLoadDataWithDifferentEscapeChar(c *C) { + tests := []struct { + input string + escapeChar byte + expected []string + }{ + { + `"{""itemRangeType"":0,""itemContainType"":0,""shopRangeType"":1,""shopJson"":""[{\""id\"":\""A1234\"",\""shopName\"":\""AAAAAA\""}]""}"`, + byte(0), // escaped by '' + []string{`{"itemRangeType":0,"itemContainType":0,"shopRangeType":1,"shopJson":"[{\"id\":\"A1234\",\"shopName\":\"AAAAAA\"}]"}`}, + }, + } + + for _, test := range tests { + ldInfo := LoadDataInfo{ + FieldsInfo: &ast.FieldsClause{ + Enclosed: '"', + Terminated: ",", + Escaped: test.escapeChar, + }, + } + got, err := ldInfo.getFieldsFromLine([]byte(test.input)) + c.Assert(err, IsNil, Commentf("failed: %s", test.input)) + assertEqualStrings(c, got, test.expected) + } +} + func assertEqualStrings(c *C, got []field, expect []string) { c.Assert(len(got), Equals, len(expect)) for i := 0; i < len(got); i++ { @@ -390,3 +434,150 @@ func (s *testExecSerialSuite) TestSortSpillDisk(c *C) { err = exec.Close() c.Assert(err, IsNil) } + +func (s *pkgTestSuite) TestSlowQueryRuntimeStats(c *C) { + stats := &slowQueryRuntimeStats{ + totalFileNum: 2, + readFileNum: 2, + readFile: time.Second, + initialize: time.Millisecond, + readFileSize: 1024 * 1024 * 1024, + parseLog: int64(time.Millisecond * 100), + concurrent: 15, + } + c.Assert(stats.String(), Equals, "initialize: 1ms, read_file: 1s, parse_log: {time:100ms, concurrency:15}, total_file: 2, read_file: 2, read_size: 1024 MB") + c.Assert(stats.String(), Equals, stats.Clone().String()) + stats.Merge(stats.Clone()) + c.Assert(stats.String(), Equals, "initialize: 2ms, read_file: 2s, parse_log: {time:200ms, concurrency:15}, total_file: 4, read_file: 4, read_size: 2 GB") +} + +// Test whether the actual buckets in Golang Map is same with the estimated number. +// The test relies the implement of Golang Map. ref https://github.com/golang/go/blob/go1.13/src/runtime/map.go#L114 +func (s *pkgTestSuite) TestAggPartialResultMapperB(c *C) { + if runtime.Version() < `go1.13` { + c.Skip("Unsupported version") + } + type testCase struct { + rowNum int + expectedB int + expectedGrowing bool + } + cases := []testCase{ + { + rowNum: 0, + expectedB: 0, + expectedGrowing: false, + }, + { + rowNum: 100, + expectedB: 4, + expectedGrowing: false, + }, + { + rowNum: 10000, + expectedB: 11, + expectedGrowing: false, + }, + { + rowNum: 1000000, + expectedB: 18, + expectedGrowing: false, + }, + { + rowNum: 851968, // 6.5 * (1 << 17) + expectedB: 17, + expectedGrowing: false, + }, + { + rowNum: 851969, // 6.5 * (1 << 17) + 1 + expectedB: 18, + expectedGrowing: true, + }, + { + rowNum: 425984, // 6.5 * (1 << 16) + expectedB: 16, + expectedGrowing: false, + }, + { + rowNum: 425985, // 6.5 * (1 << 16) + 1 + expectedB: 17, + expectedGrowing: true, + }, + } + + for _, tc := range cases { + aggMap := make(aggPartialResultMapper) + tempSlice := make([]aggfuncs.PartialResult, 10) + for num := 0; num < tc.rowNum; num++ { + aggMap[strconv.Itoa(num)] = tempSlice + } + + c.Assert(getB(aggMap), Equals, tc.expectedB) + c.Assert(getGrowing(aggMap), Equals, tc.expectedGrowing) + } +} + +// A header for a Go map. +// nolint:structcheck +type hmap struct { + // Note: the format of the hmap is also encoded in cmd/compile/internal/gc/reflect.go. + // Make sure this stays in sync with the compiler's definition. + count int // # live cells == size of map. Must be first (used by len() builtin) + flags uint8 + B uint8 // log_2 of # of buckets (can hold up to loadFactor * 2^B items) + noverflow uint16 // approximate number of overflow buckets; see incrnoverflow for details + hash0 uint32 // hash seed + + buckets unsafe.Pointer // array of 2^B Buckets. may be nil if count==0. + oldbuckets unsafe.Pointer // previous bucket array of half the size, non-nil only when growing + nevacuate uintptr // progress counter for evacuation (buckets less than this have been evacuated) + + extra *mapextra // optional fields +} + +// mapextra holds fields that are not present on all maps. +type mapextra struct { + // If both key and elem do not contain pointers and are inline, then we mark bucket + // type as containing no pointers. This avoids scanning such maps. + // However, bmap.overflow is a pointer. In order to keep overflow buckets + // alive, we store pointers to all overflow buckets in hmap.extra.overflow and hmap.extra.oldoverflow. + // overflow and oldoverflow are only used if key and elem do not contain pointers. + // overflow contains overflow buckets for hmap.buckets. + // oldoverflow contains overflow buckets for hmap.oldbuckets. + // The indirection allows to store a pointer to the slice in hiter. + overflow *[]*bmap + oldoverflow *[]*bmap + + // nextOverflow holds a pointer to a free overflow bucket. + nextOverflow *bmap +} + +const ( + bucketCntBits = 3 + bucketCnt = 1 << bucketCntBits +) + +// A bucket for a Go map. +type bmap struct { + // tophash generally contains the top byte of the hash value + // for each key in this bucket. If tophash[0] < minTopHash, + // tophash[0] is a bucket evacuation state instead. + tophash [bucketCnt]uint8 + // Followed by bucketCnt keys and then bucketCnt elems. + // NOTE: packing all the keys together and then all the elems together makes the + // code a bit more complicated than alternating key/elem/key/elem/... but it allows + // us to eliminate padding which would be needed for, e.g., map[int64]int8. + // Followed by an overflow pointer. +} + +func getB(m aggPartialResultMapper) int { + point := (**hmap)(unsafe.Pointer(&m)) + value := *point + return int(value.B) +} + +func getGrowing(m aggPartialResultMapper) bool { + point := (**hmap)(unsafe.Pointer(&m)) + value := *point + return value.oldbuckets != nil +} diff --git a/executor/executor_required_rows_test.go b/executor/executor_required_rows_test.go index 787a3a2d5bbf4..720b5300677c9 100644 --- a/executor/executor_required_rows_test.go +++ b/executor/executor_required_rows_test.go @@ -665,7 +665,7 @@ func (s *testExecSuite) TestStreamAggRequiredRows(c *C) { aggFunc, err := aggregation.NewAggFuncDesc(sctx, testCase.aggFunc, []expression.Expression{childCols[0]}, true) c.Assert(err, IsNil) aggFuncs := []*aggregation.AggFuncDesc{aggFunc} - exec := buildStreamAggExecutor(sctx, ds, schema, aggFuncs, groupBy) + exec := buildStreamAggExecutor(sctx, ds, schema, aggFuncs, groupBy, 1, true) c.Assert(exec.Open(ctx), IsNil) chk := newFirstChunk(exec) for i := range testCase.requiredRows { diff --git a/executor/executor_test.go b/executor/executor_test.go index b4a6d97a42ed3..51cf16173365b 100644 --- a/executor/executor_test.go +++ b/executor/executor_test.go @@ -34,6 +34,7 @@ import ( "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser" + "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -41,6 +42,7 @@ import ( "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" @@ -55,9 +57,10 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/table" @@ -68,6 +71,7 @@ import ( "github.com/pingcap/tidb/util/admin" "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/testkit" @@ -82,11 +86,17 @@ func TestT(t *testing.T) { CustomVerboseFlag = true *CustomParallelSuiteFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } autoid.SetStep(5000) config.UpdateGlobal(func(conf *config.Config) { conf.Log.SlowThreshold = 30000 // 30s + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + conf.Experimental.AllowsExpressionIndex = true }) tmpDir := config.GetGlobalConfig().TempStoragePath _ = os.RemoveAll(tmpDir) // clean the uncleared temp file during the last run. @@ -100,6 +110,7 @@ var _ = Suite(&testSuite{&baseTestSuite{}}) var _ = Suite(&testSuiteP1{&baseTestSuite{}}) var _ = Suite(&testSuiteP2{&baseTestSuite{}}) var _ = Suite(&testSuite1{}) +var _ = SerialSuites(&testSerialSuite2{}) var _ = Suite(&testSuite2{&baseTestSuite{}}) var _ = Suite(&testSuite3{&baseTestSuite{}}) var _ = Suite(&testSuite4{&baseTestSuite{}}) @@ -112,7 +123,6 @@ var _ = Suite(&testSuiteAgg{baseTestSuite: &baseTestSuite{}}) var _ = Suite(&testSuite6{&baseTestSuite{}}) var _ = Suite(&testSuite7{&baseTestSuite{}}) var _ = Suite(&testSuite8{&baseTestSuite{}}) -var _ = Suite(&testClusteredSuite{&baseTestSuite{}}) var _ = SerialSuites(&testShowStatsSuite{&baseTestSuite{}}) var _ = Suite(&testBypassSuite{}) var _ = Suite(&testUpdateSuite{}) @@ -132,6 +142,8 @@ var _ = Suite(&partitionTableSuite{&baseTestSuite{}}) var _ = SerialSuites(&tiflashTestSuite{}) var _ = SerialSuites(&globalIndexSuite{&baseTestSuite{}}) var _ = SerialSuites(&testSerialSuite{&baseTestSuite{}}) +var _ = SerialSuites(&testCoprCache{}) +var _ = SerialSuites(&testPrepareSuite{}) type testSuite struct{ *baseTestSuite } type testSuiteP1 struct{ *baseTestSuite } @@ -145,13 +157,19 @@ type testSlowQuery struct{ *baseTestSuite } type partitionTableSuite struct{ *baseTestSuite } type globalIndexSuite struct{ *baseTestSuite } type testSerialSuite struct{ *baseTestSuite } +type testCoprCache struct { + store kv.Storage + dom *domain.Domain + cls cluster.Cluster +} +type testPrepareSuite struct{ testData testutil.TestData } type baseTestSuite struct { cluster cluster.Cluster store kv.Storage domain *domain.Domain *parser.Parser - ctx *mock.Context + ctx *mock.Context // nolint:structcheck } var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") @@ -193,6 +211,16 @@ func (s *testSuiteWithData) TearDownSuite(c *C) { c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) } +func (s *testPrepareSuite) SetUpSuite(c *C) { + var err error + s.testData, err = testutil.LoadTestSuiteData("testdata", "prepare_suite") + c.Assert(err, IsNil) +} + +func (s *testPrepareSuite) TearDownSuite(c *C) { + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) +} + func (s *baseTestSuite) TearDownSuite(c *C) { s.domain.Close() s.store.Close() @@ -429,7 +457,7 @@ func (s *testSuite3) TestAdmin(c *C) { tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("admin_test")) c.Assert(err, IsNil) c.Assert(tb.Indices(), HasLen, 1) - _, err = tb.Indices()[0].Create(mock.NewContext(), txn.GetUnionStore(), types.MakeDatums(int64(10)), kv.IntHandle(1)) + _, err = tb.Indices()[0].Create(mock.NewContext(), txn, types.MakeDatums(int64(10)), kv.IntHandle(1), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -500,7 +528,7 @@ func (s *testSuiteP2) TestAdminShowDDLJobs(c *C) { jobID, err := strconv.Atoi(row[0].(string)) c.Assert(err, IsNil) - err = kv.RunInNewTxn(s.store, true, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) job, err := t.GetHistoryDDLJob(int64(jobID)) c.Assert(err, IsNil) @@ -623,6 +651,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields := rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "NULL") + c.Assert(rs.Close(), IsNil) sql = `select "\N";` r = tk.MustQuery(sql) @@ -632,6 +661,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `N`) + c.Assert(rs.Close(), IsNil) tk.MustExec("use test;") tk.MustExec("create table test (`\\N` int);") @@ -645,6 +675,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `\N`) + c.Assert(rs.Close(), IsNil) sql = `select \N from test;` r = tk.MustQuery(sql) @@ -655,6 +686,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { c.Check(err, IsNil) c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `NULL`) + c.Assert(rs.Close(), IsNil) sql = `select (\N) from test;` r = tk.MustQuery(sql) @@ -664,6 +696,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `NULL`) + c.Assert(rs.Close(), IsNil) sql = "select `\\N` from test;" r = tk.MustQuery(sql) @@ -673,6 +706,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `\N`) + c.Assert(rs.Close(), IsNil) sql = "select (`\\N`) from test;" r = tk.MustQuery(sql) @@ -682,6 +716,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `\N`) + c.Assert(rs.Close(), IsNil) sql = `select '\N' from test;` r = tk.MustQuery(sql) @@ -691,6 +726,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `N`) + c.Assert(rs.Close(), IsNil) sql = `select ('\N') from test;` r = tk.MustQuery(sql) @@ -700,6 +736,7 @@ func (s *testSuiteP1) TestSelectBackslashN(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `N`) + c.Assert(rs.Close(), IsNil) } // TestSelectNull Issue #4053. @@ -714,6 +751,7 @@ func (s *testSuiteP1) TestSelectNull(c *C) { fields := rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `NULL`) + c.Assert(rs.Close(), IsNil) sql = `select (null);` r = tk.MustQuery(sql) @@ -723,6 +761,7 @@ func (s *testSuiteP1) TestSelectNull(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `NULL`) + c.Assert(rs.Close(), IsNil) sql = `select null+NULL;` r = tk.MustQuery(sql) @@ -733,6 +772,7 @@ func (s *testSuiteP1) TestSelectNull(c *C) { c.Check(err, IsNil) c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `null+NULL`) + c.Assert(rs.Close(), IsNil) } // TestSelectStringLiteral Issue #3686. @@ -747,6 +787,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields := rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `abc`) + c.Assert(rs.Close(), IsNil) sql = `select (('abc'));` r = tk.MustQuery(sql) @@ -756,6 +797,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `abc`) + c.Assert(rs.Close(), IsNil) sql = `select 'abc'+'def';` r = tk.MustQuery(sql) @@ -765,6 +807,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, `'abc'+'def'`) + c.Assert(rs.Close(), IsNil) // Below checks whether leading invalid chars are trimmed. sql = "select '\n';" @@ -775,6 +818,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "") + c.Assert(rs.Close(), IsNil) sql = "select '\t col';" // Lowercased letter is a valid char. rs, err = tk.Exec(sql) @@ -782,6 +826,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "col") + c.Assert(rs.Close(), IsNil) sql = "select '\t Col';" // Uppercased letter is a valid char. rs, err = tk.Exec(sql) @@ -789,6 +834,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "Col") + c.Assert(rs.Close(), IsNil) sql = "select '\n\t 中文 col';" // Chinese char is a valid char. rs, err = tk.Exec(sql) @@ -796,6 +842,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "中文 col") + c.Assert(rs.Close(), IsNil) sql = "select ' \r\n .col';" // Punctuation is a valid char. rs, err = tk.Exec(sql) @@ -803,6 +850,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, ".col") + c.Assert(rs.Close(), IsNil) sql = "select ' 😆col';" // Emoji is a valid char. rs, err = tk.Exec(sql) @@ -810,6 +858,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "😆col") + c.Assert(rs.Close(), IsNil) // Below checks whether trailing invalid chars are preserved. sql = `select 'abc ';` @@ -818,6 +867,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "abc ") + c.Assert(rs.Close(), IsNil) sql = `select ' abc 123 ';` rs, err = tk.Exec(sql) @@ -825,6 +875,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "abc 123 ") + c.Assert(rs.Close(), IsNil) // Issue #4239. sql = `select 'a' ' ' 'string';` @@ -835,6 +886,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "a") + c.Assert(rs.Close(), IsNil) sql = `select 'a' " " "string";` r = tk.MustQuery(sql) @@ -844,6 +896,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "a") + c.Assert(rs.Close(), IsNil) sql = `select 'string' 'string';` r = tk.MustQuery(sql) @@ -853,6 +906,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "string") + c.Assert(rs.Close(), IsNil) sql = `select "ss" "a";` r = tk.MustQuery(sql) @@ -862,6 +916,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "ss") + c.Assert(rs.Close(), IsNil) sql = `select "ss" "a" "b";` r = tk.MustQuery(sql) @@ -871,6 +926,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "ss") + c.Assert(rs.Close(), IsNil) sql = `select "ss" "a" ' ' "b";` r = tk.MustQuery(sql) @@ -880,6 +936,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "ss") + c.Assert(rs.Close(), IsNil) sql = `select "ss" "a" ' ' "b" ' ' "d";` r = tk.MustQuery(sql) @@ -889,6 +946,7 @@ func (s *testSuiteP1) TestSelectStringLiteral(c *C) { fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.O, Equals, "ss") + c.Assert(rs.Close(), IsNil) } func (s *testSuiteP1) TestSelectLimit(c *C) { @@ -1084,7 +1142,7 @@ func (s *testSuiteP1) TestIssue2612(c *C) { err = rs.Next(context.Background(), req) c.Assert(err, IsNil) c.Assert(req.GetRow(0).GetDuration(0, 0).String(), Equals, "-46:09:02") - rs.Close() + c.Assert(rs.Close(), IsNil) } // TestIssue345 is related with https://github.com/pingcap/tidb/issues/345 @@ -1189,6 +1247,32 @@ func (s *testSuiteWithData) TestSetOperationOnDiffColType(c *C) { } } +// issue-23038: wrong key range of index scan for year column +func (s *testSuiteWithData) TestIndexScanWithYearCol(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c1 year(4), c2 int, key(c1));") + tk.MustExec("insert into t values(2001, 1);") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) + }) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) + } +} + func (s *testSuiteP2) TestUnion(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -1763,9 +1847,9 @@ func (s *testSuiteP1) TestJSON(c *C) { // Check cast json to decimal. // NOTE: this test case contains a bug, it should be uncommented after the bug is fixed. // TODO: Fix bug https://github.com/pingcap/tidb/issues/12178 - //tk.MustExec("drop table if exists test_json") - //tk.MustExec("create table test_json ( a decimal(60,2) as (JSON_EXTRACT(b,'$.c')), b json );") - //tk.MustExec(`insert into test_json (b) values + // tk.MustExec("drop table if exists test_json") + // tk.MustExec("create table test_json ( a decimal(60,2) as (JSON_EXTRACT(b,'$.c')), b json );") + // tk.MustExec(`insert into test_json (b) values // ('{"c": "1267.1"}'), // ('{"c": "1267.01"}'), // ('{"c": "1267.1234"}'), @@ -1773,7 +1857,7 @@ func (s *testSuiteP1) TestJSON(c *C) { // ('{"c": "1234567890123456789012345678901234567890123456789012345"}'), // ('{"c": "1234567890123456789012345678901234567890123456789012345.12345"}');`) // - //tk.MustQuery("select a from test_json;").Check(testkit.Rows("1267.10", "1267.01", "1267.12", + // tk.MustQuery("select a from test_json;").Check(testkit.Rows("1267.10", "1267.01", "1267.12", // "1267.35", "1234567890123456789012345678901234567890123456789012345.00", // "1234567890123456789012345678901234567890123456789012345.12")) } @@ -1796,15 +1880,15 @@ func (s *testSuiteP1) TestMultiUpdate(c *C) { // Test UPDATE ... set_lists. tk.MustExec(`UPDATE test_mu SET b = 0, c = b WHERE a = 4`) result = tk.MustQuery(`SELECT * FROM test_mu ORDER BY a`) - result.Check(testkit.Rows(`1 7 2`, `4 0 0`, `7 8 9`)) + result.Check(testkit.Rows(`1 7 2`, `4 0 5`, `7 8 9`)) tk.MustExec(`UPDATE test_mu SET c = 8, b = c WHERE a = 4`) result = tk.MustQuery(`SELECT * FROM test_mu ORDER BY a`) - result.Check(testkit.Rows(`1 7 2`, `4 8 8`, `7 8 9`)) + result.Check(testkit.Rows(`1 7 2`, `4 5 8`, `7 8 9`)) tk.MustExec(`UPDATE test_mu SET c = b, b = c WHERE a = 7`) result = tk.MustQuery(`SELECT * FROM test_mu ORDER BY a`) - result.Check(testkit.Rows(`1 7 2`, `4 8 8`, `7 8 8`)) + result.Check(testkit.Rows(`1 7 2`, `4 5 8`, `7 9 8`)) } func (s *testSuiteP1) TestGeneratedColumnWrite(c *C) { @@ -1964,16 +2048,16 @@ func (s *testSuiteP1) TestGeneratedColumnRead(c *C) { result.Check(testkit.Rows(`0 `, `1 3 2 6`, `3 7 12 14`, `8 16 64 32`)) // Test multi-update on generated columns. - tk.MustExec(`UPDATE test_gc_read m, test_gc_read n SET m.a = m.a + 10, n.a = n.a + 10`) + tk.MustExec(`UPDATE test_gc_read m, test_gc_read n SET m.b = m.b + 10, n.b = n.b + 10`) result = tk.MustQuery(`SELECT * FROM test_gc_read ORDER BY a`) - result.Check(testkit.Rows(`10 `, `11 2 13 22 26`, `13 4 17 52 34`, `18 8 26 144 52`)) + result.Check(testkit.Rows(`0 `, `1 12 13 12 26`, `3 14 17 42 34`, `8 18 26 144 52`)) tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") - tk.MustExec("insert into t values(18)") + tk.MustExec("insert into t values(8)") tk.MustExec("update test_gc_read set a = a+1 where a in (select a from t)") result = tk.MustQuery("select * from test_gc_read order by a") - result.Check(testkit.Rows(`10 `, `11 2 13 22 26`, `13 4 17 52 34`, `19 8 27 152 54`)) + result.Check(testkit.Rows(`0 `, `1 12 13 12 26`, `3 14 17 42 34`, `9 18 27 162 54`)) // Test different types between generation expression and generated column. tk.MustExec(`CREATE TABLE test_gc_read_cast(a VARCHAR(255), b VARCHAR(255), c INT AS (JSON_EXTRACT(a, b)), d INT AS (JSON_EXTRACT(a, b)) STORED)`) @@ -2151,14 +2235,14 @@ func (s *testSuiteP2) TestSQLMode(c *C) { tk.MustExec("set sql_mode = ''") tk.MustExec("insert t values ()") tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1364 Field 'a' doesn't have a default value")) - _, err = tk.Exec("insert t values (null)") - c.Check(err, NotNil) + tk.MustExec("insert t values (null)") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'a' cannot be null")) tk.MustExec("insert ignore t values (null)") tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'a' cannot be null")) tk.MustExec("insert t select null") tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'a' cannot be null")) tk.MustExec("insert t values (1000)") - tk.MustQuery("select * from t order by a").Check(testkit.Rows("0", "0", "0", "127")) + tk.MustQuery("select * from t order by a").Check(testkit.Rows("0", "0", "0", "0", "127")) tk.MustExec("insert tdouble values (10.23)") tk.MustQuery("select * from tdouble").Check(testkit.Rows("9.99")) @@ -2267,7 +2351,7 @@ func (s *testSuiteP2) TestClusteredIndexIsPointGet(c *C) { tk.MustExec("create database test_cluster_index_is_point_get;") tk.MustExec("use test_cluster_index_is_point_get;") - tk.MustExec("set tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t;") tk.MustExec("create table t (a varchar(255), b int, c char(10), primary key (c, a));") ctx := tk.Se.(sessionctx.Context) @@ -2363,7 +2447,7 @@ func (s *testSerialSuite) TestBatchPointGetRepeatableRead(c *C) { } func (s *testSerialSuite) TestSplitRegionTimeout(c *C) { - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/MockSplitRegionTimeout", `return(true)`), IsNil) + c.Assert(tikv.MockSplitRegionTimeout.Enable(`return(true)`), IsNil) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -2372,22 +2456,25 @@ func (s *testSerialSuite) TestSplitRegionTimeout(c *C) { tk.MustExec(`set @@tidb_wait_split_region_timeout=1`) // result 0 0 means split 0 region and 0 region finish scatter regions before timeout. tk.MustQuery(`split table t between (0) and (10000) regions 10`).Check(testkit.Rows("0 0")) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/MockSplitRegionTimeout"), IsNil) + err := tikv.MockSplitRegionTimeout.Disable() + c.Assert(err, IsNil) // Test scatter regions timeout. - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/MockScatterRegionTimeout", `return(true)`), IsNil) + c.Assert(tikv.MockScatterRegionTimeout.Enable(`return(true)`), IsNil) tk.MustQuery(`split table t between (0) and (10000) regions 10`).Check(testkit.Rows("10 1")) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/MockScatterRegionTimeout"), IsNil) + err = tikv.MockScatterRegionTimeout.Disable() + c.Assert(err, IsNil) // Test pre-split with timeout. tk.MustExec("drop table if exists t") tk.MustExec("set @@global.tidb_scatter_region=1;") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/MockScatterRegionTimeout", `return(true)`), IsNil) + c.Assert(tikv.MockScatterRegionTimeout.Enable(`return(true)`), IsNil) atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) start := time.Now() tk.MustExec("create table t (a int, b int) partition by hash(a) partitions 5;") c.Assert(time.Since(start).Seconds(), Less, 10.0) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/MockScatterRegionTimeout"), IsNil) + err = tikv.MockScatterRegionTimeout.Disable() + c.Assert(err, IsNil) } func (s *testSuiteP2) TestRow(c *C) { @@ -2437,6 +2524,32 @@ func (s *testSuiteP2) TestRow(c *C) { result.Check(testkit.Rows("0")) result = tk.MustQuery("select (select 1)") result.Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("insert t1 values (1,2),(1,null)") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2 (c int, d int)") + tk.MustExec("insert t2 values (0,0)") + + tk.MustQuery("select * from t2 where (1,2) in (select * from t1)").Check(testkit.Rows("0 0")) + tk.MustQuery("select * from t2 where (1,2) not in (select * from t1)").Check(testkit.Rows()) + tk.MustQuery("select * from t2 where (1,1) not in (select * from t1)").Check(testkit.Rows()) + tk.MustQuery("select * from t2 where (1,null) in (select * from t1)").Check(testkit.Rows()) + tk.MustQuery("select * from t2 where (null,null) in (select * from t1)").Check(testkit.Rows()) + + tk.MustExec("delete from t1 where a=1 and b=2") + tk.MustQuery("select (1,1) in (select * from t2) from t1").Check(testkit.Rows("0")) + tk.MustQuery("select (1,1) not in (select * from t2) from t1").Check(testkit.Rows("1")) + tk.MustQuery("select (1,1) in (select 1,1 from t2) from t1").Check(testkit.Rows("1")) + tk.MustQuery("select (1,1) not in (select 1,1 from t2) from t1").Check(testkit.Rows("0")) + + // MySQL 5.7 returns 1 for these 2 queries, which is wrong. + tk.MustQuery("select (1,null) not in (select 1,1 from t2) from t1").Check(testkit.Rows("")) + tk.MustQuery("select (t1.a,null) not in (select 1,1 from t2) from t1").Check(testkit.Rows("")) + + tk.MustQuery("select (1,null) in (select * from t1)").Check(testkit.Rows("")) + tk.MustQuery("select (1,null) not in (select * from t1)").Check(testkit.Rows("")) } func (s *testSuiteP2) TestColumnName(c *C) { @@ -2454,14 +2567,14 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Check(fields[0].ColumnAsName.L, Equals, "1 + c") c.Check(fields[1].Column.Name.L, Equals, "count(*)") c.Check(fields[1].ColumnAsName.L, Equals, "count(*)") - rs.Close() + c.Assert(rs.Close(), IsNil) rs, err = tk.Exec("select (c) > all (select c from t) from t") c.Check(err, IsNil) fields = rs.Fields() c.Check(len(fields), Equals, 1) c.Check(fields[0].Column.Name.L, Equals, "(c) > all (select c from t)") c.Check(fields[0].ColumnAsName.L, Equals, "(c) > all (select c from t)") - rs.Close() + c.Assert(rs.Close(), IsNil) tk.MustExec("begin") tk.MustExec("insert t values(1,1)") rs, err = tk.Exec("select c d, d c from t") @@ -2472,7 +2585,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Check(fields[0].ColumnAsName.L, Equals, "d") c.Check(fields[1].Column.Name.L, Equals, "d") c.Check(fields[1].ColumnAsName.L, Equals, "c") - rs.Close() + c.Assert(rs.Close(), IsNil) // Test case for query a column of a table. // In this case, all attributes have values. rs, err = tk.Exec("select c as a from t as t2") @@ -2483,7 +2596,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Check(fields[0].Table.Name.L, Equals, "t") c.Check(fields[0].TableAsName.L, Equals, "t2") c.Check(fields[0].DBName.L, Equals, "test") - rs.Close() + c.Assert(rs.Close(), IsNil) // Test case for query a expression which only using constant inputs. // In this case, the table, org_table and database attributes will all be empty. rs, err = tk.Exec("select hour(1) as a from t as t2") @@ -2494,7 +2607,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Check(fields[0].Table.Name.L, Equals, "") c.Check(fields[0].TableAsName.L, Equals, "") c.Check(fields[0].DBName.L, Equals, "") - rs.Close() + c.Assert(rs.Close(), IsNil) // Test case for query a column wrapped with parentheses and unary plus. // In this case, the column name should be its original name. rs, err = tk.Exec("select (c), (+c), +(c), +(+(c)), ++c from t") @@ -2504,7 +2617,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Check(fields[i].Column.Name.L, Equals, "c") c.Check(fields[i].ColumnAsName.L, Equals, "c") } - rs.Close() + c.Assert(rs.Close(), IsNil) // Test issue https://github.com/pingcap/tidb/issues/9639 . // Both window function and expression appear in final result field. @@ -2517,7 +2630,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Assert(fields[1].Column.Name.L, Equals, "num") c.Assert(fields[1].ColumnAsName.L, Equals, "num") tk.MustExec("set @@tidb_enable_window_function = 0") - rs.Close() + c.Assert(rs.Close(), IsNil) rs, err = tk.Exec("select if(1,c,c) from t;") c.Check(err, IsNil) @@ -2525,6 +2638,7 @@ func (s *testSuiteP2) TestColumnName(c *C) { c.Assert(fields[0].Column.Name.L, Equals, "if(1,c,c)") // It's a compatibility issue. Should be empty instead. c.Assert(fields[0].ColumnAsName.L, Equals, "if(1,c,c)") + c.Assert(rs.Close(), IsNil) } func (s *testSuiteP2) TestSelectVar(c *C) { @@ -2564,11 +2678,11 @@ func (s *testSuiteP2) TestHistoryRead(c *C) { // SnapshotTS Is not updated if check failed. c.Assert(tk.Se.GetSessionVars().SnapshotTS, Equals, uint64(0)) - curVer1, _ := s.store.CurrentVersion() + curVer1, _ := s.store.CurrentVersion(oracle.GlobalTxnScope) time.Sleep(time.Millisecond) snapshotTime := time.Now() time.Sleep(time.Millisecond) - curVer2, _ := s.store.CurrentVersion() + curVer2, _ := s.store.CurrentVersion(oracle.GlobalTxnScope) tk.MustExec("insert history_read values (2)") tk.MustQuery("select * from history_read").Check(testkit.Rows("1", "2")) tk.MustExec("set @@tidb_snapshot = '" + snapshotTime.Format("2006-01-02 15:04:05.999999") + "'") @@ -2616,12 +2730,13 @@ func (s *testSuite2) TestLowResolutionTSORead(c *C) { // enable low resolution tso c.Assert(tk.Se.GetSessionVars().LowResolutionTSO, IsFalse) - tk.Exec("set @@tidb_low_resolution_tso = 'on'") + _, err := tk.Exec("set @@tidb_low_resolution_tso = 'on'") + c.Assert(err, IsNil) c.Assert(tk.Se.GetSessionVars().LowResolutionTSO, IsTrue) time.Sleep(3 * time.Second) tk.MustQuery("select * from low_resolution_tso").Check(testkit.Rows("1")) - _, err := tk.Exec("update low_resolution_tso set a = 2") + _, err = tk.Exec("update low_resolution_tso set a = 2") c.Assert(err, NotNil) tk.MustExec("set @@tidb_low_resolution_tso = 'off'") tk.MustExec("update low_resolution_tso set a = 2") @@ -2842,7 +2957,7 @@ func (s *testSuite) TestTiDBCurrentTS(c *C) { tk.MustQuery("select @@tidb_current_ts").Check(testkit.Rows("0")) _, err = tk.Exec("set @@tidb_current_ts = '1'") - c.Assert(terror.ErrorEqual(err, variable.ErrReadOnly), IsTrue, Commentf("err %v", err)) + c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) } func (s *testSuite) TestTiDBLastTxnInfo(c *C) { @@ -2896,7 +3011,66 @@ func (s *testSuite) TestTiDBLastTxnInfo(c *C) { c.Assert(strings.Contains(err.Error(), rows7[0][1].(string)), IsTrue) _, err = tk.Exec("set @@tidb_last_txn_info = '{}'") - c.Assert(terror.ErrorEqual(err, variable.ErrReadOnly), IsTrue, Commentf("err %v", err)) + c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) +} + +func (s *testSuite) TestTiDBLastQueryInfo(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key, v int)") + tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.start_ts')").Check(testkit.Rows("0 0")) + + toUint64 := func(str interface{}) uint64 { + res, err := strconv.ParseUint(str.(string), 10, 64) + c.Assert(err, IsNil) + return res + } + + tk.MustExec("select * from t") + rows := tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(rows[0][0], Equals, rows[0][1]) + + tk.MustExec("insert into t values (1, 10)") + rows = tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(rows[0][0], Equals, rows[0][1]) + // tidb_last_txn_info is still valid after checking query info. + rows = tk.MustQuery("select json_extract(@@tidb_last_txn_info, '$.start_ts'), json_extract(@@tidb_last_txn_info, '$.commit_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(rows[0][0].(string), Less, rows[0][1].(string)) + + tk.MustExec("begin pessimistic") + tk.MustExec("select * from t") + rows = tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(rows[0][0], Equals, rows[0][1]) + + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test") + tk2.MustExec("update t set v = 11 where a = 1") + + tk.MustExec("select * from t") + rows = tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(rows[0][0], Equals, rows[0][1]) + + tk.MustExec("update t set v = 12 where a = 1") + rows = tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(toUint64(rows[0][0]), Less, toUint64(rows[0][1])) + + tk.MustExec("commit") + + tk.MustExec("set transaction isolation level read committed") + tk.MustExec("begin pessimistic") + tk.MustExec("select * from t") + rows = tk.MustQuery("select json_extract(@@tidb_last_query_info, '$.start_ts'), json_extract(@@tidb_last_query_info, '$.for_update_ts')").Rows() + c.Assert(toUint64(rows[0][0]), Greater, uint64(0)) + c.Assert(toUint64(rows[0][0]), Less, toUint64(rows[0][1])) + + tk.MustExec("rollback") } func (s *testSuite) TestSelectForUpdate(c *C) { @@ -3076,6 +3250,10 @@ type testSuite1 struct { testSuiteWithCliBase } +type testSerialSuite2 struct { + testSuiteWithCliBase +} + func (s *testSuiteWithCliBase) SetUpSuite(c *C) { cli := &checkRequestClient{} hijackClient := func(c tikv.Client) tikv.Client { @@ -3125,7 +3303,8 @@ func (s *testSuite2) TestAddIndexPriority(c *C) { c.Assert(err, IsNil) defer func() { dom.Close() - store.Close() + err = store.Close() + c.Assert(err, IsNil) }() tk := testkit.NewTestKit(c, store) @@ -3211,10 +3390,12 @@ func (s *testSuite) TestTimezonePushDown(c *C) { c.Assert(err, IsNil) c.Assert(dagReq.GetTimeZoneName(), Equals, systemTZ.String()) }) - tk.Se.Execute(ctx1, `select * from t where ts = "2018-09-13 10:02:06"`) + _, err := tk.Se.Execute(ctx1, `select * from t where ts = "2018-09-13 10:02:06"`) + c.Assert(err, IsNil) tk.MustExec(`set time_zone="System"`) - tk.Se.Execute(ctx1, `select * from t where ts = "2018-09-13 10:02:06"`) + _, err = tk.Se.Execute(ctx1, `select * from t where ts = "2018-09-13 10:02:06"`) + c.Assert(err, IsNil) c.Assert(count, Equals, 2) // Make sure the hook function is called. } @@ -3464,6 +3645,22 @@ func (s *testSuite) TestUnsignedPk(c *C) { tk.MustQuery("select * from t use index(idx) where b = 1 order by b, a").Check(testkit.Rows("1 1", "9223372036854775808 1")) } +func (s *testSuite) TestSignedCommonHandle(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(k1 int, k2 int, primary key(k1, k2))") + tk.MustExec("insert into t(k1, k2) value(-100, 1), (-50, 1), (0, 0), (1, 1), (3, 3)") + tk.MustQuery("select k1 from t order by k1").Check(testkit.Rows("-100", "-50", "0", "1", "3")) + tk.MustQuery("select k1 from t order by k1 desc").Check(testkit.Rows("3", "1", "0", "-50", "-100")) + tk.MustQuery("select k1 from t where k1 < -51").Check(testkit.Rows("-100")) + tk.MustQuery("select k1 from t where k1 < -1").Check(testkit.Rows("-100", "-50")) + tk.MustQuery("select k1 from t where k1 <= 0").Check(testkit.Rows("-100", "-50", "0")) + tk.MustQuery("select k1 from t where k1 < 2").Check(testkit.Rows("-100", "-50", "0", "1")) + tk.MustQuery("select k1 from t where k1 < -1 and k1 > -90").Check(testkit.Rows("-50")) +} + func (s *testSuite) TestIssue5666(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("set @@profiling=1") @@ -3551,7 +3748,7 @@ func (s *testSuite) TestCheckIndex(c *C) { // table data (handle, data): (1, 10), (2, 20), (4, 40) txn, err = s.store.Begin() c.Assert(err, IsNil) - _, err = idx.Create(mockCtx, txn.GetUnionStore(), types.MakeDatums(int64(30)), kv.IntHandle(3)) + _, err = idx.Create(mockCtx, txn, types.MakeDatums(int64(30)), kv.IntHandle(3), nil) c.Assert(err, IsNil) key := tablecodec.EncodeRowKey(tb.Meta().ID, kv.IntHandle(4).Encoded()) setColValue(c, txn, key, types.NewDatum(int64(40))) @@ -3566,7 +3763,7 @@ func (s *testSuite) TestCheckIndex(c *C) { // table data (handle, data): (1, 10), (2, 20), (4, 40) txn, err = s.store.Begin() c.Assert(err, IsNil) - _, err = idx.Create(mockCtx, txn.GetUnionStore(), types.MakeDatums(int64(40)), kv.IntHandle(4)) + _, err = idx.Create(mockCtx, txn, types.MakeDatums(int64(40)), kv.IntHandle(4), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -3578,9 +3775,9 @@ func (s *testSuite) TestCheckIndex(c *C) { // table data (handle, data): (1, 10), (2, 20), (4, 40) txn, err = s.store.Begin() c.Assert(err, IsNil) - err = idx.Delete(sc, txn, types.MakeDatums(int64(30)), kv.IntHandle(3)) + err = idx.Delete(sc, txn.GetUnionStore(), types.MakeDatums(int64(30)), kv.IntHandle(3)) c.Assert(err, IsNil) - err = idx.Delete(sc, txn, types.MakeDatums(int64(20)), kv.IntHandle(2)) + err = idx.Delete(sc, txn.GetUnionStore(), types.MakeDatums(int64(20)), kv.IntHandle(2)) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -3619,7 +3816,7 @@ func (s *testSuite) TestCheckTableClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") - tk.MustExec("set @@tidb_enable_clustered_index = 1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists admin_test;") tk.MustExec("create table admin_test (c1 int, c2 int, c3 int default 1, primary key (c1, c2), index (c1), unique key(c2));") tk.MustExec("insert admin_test (c1, c2) values (1, 1), (2, 2), (3, 3);") @@ -3685,44 +3882,86 @@ func (s *testSuite) TestLimit(c *C) { tk.MustExec(`use test;`) tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a bigint, b bigint);`) - tk.MustExec(`insert into t values(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6);`) + tk.MustExec(`insert into t values(1, 1), (2, 2), (3, 30), (4, 40), (5, 5), (6, 6);`) tk.MustQuery(`select * from t order by a limit 1, 1;`).Check(testkit.Rows( "2 2", )) tk.MustQuery(`select * from t order by a limit 1, 2;`).Check(testkit.Rows( "2 2", - "3 3", + "3 30", )) tk.MustQuery(`select * from t order by a limit 1, 3;`).Check(testkit.Rows( "2 2", - "3 3", - "4 4", + "3 30", + "4 40", )) tk.MustQuery(`select * from t order by a limit 1, 4;`).Check(testkit.Rows( "2 2", - "3 3", - "4 4", + "3 30", + "4 40", "5 5", )) + + // test inline projection + tk.MustQuery(`select a from t where a > 0 limit 1, 1;`).Check(testkit.Rows( + "2", + )) + tk.MustQuery(`select a from t where a > 0 limit 1, 2;`).Check(testkit.Rows( + "2", + "3", + )) + tk.MustQuery(`select b from t where a > 0 limit 1, 3;`).Check(testkit.Rows( + "2", + "30", + "40", + )) + tk.MustQuery(`select b from t where a > 0 limit 1, 4;`).Check(testkit.Rows( + "2", + "30", + "40", + "5", + )) + + // test @@tidb_init_chunk_size=2 tk.MustExec(`set @@tidb_init_chunk_size=2;`) - tk.MustQuery(`select * from t order by a limit 2, 1;`).Check(testkit.Rows( - "3 3", + tk.MustQuery(`select * from t where a > 0 limit 2, 1;`).Check(testkit.Rows( + "3 30", )) - tk.MustQuery(`select * from t order by a limit 2, 2;`).Check(testkit.Rows( - "3 3", - "4 4", + tk.MustQuery(`select * from t where a > 0 limit 2, 2;`).Check(testkit.Rows( + "3 30", + "4 40", )) - tk.MustQuery(`select * from t order by a limit 2, 3;`).Check(testkit.Rows( - "3 3", - "4 4", + tk.MustQuery(`select * from t where a > 0 limit 2, 3;`).Check(testkit.Rows( + "3 30", + "4 40", "5 5", )) - tk.MustQuery(`select * from t order by a limit 2, 4;`).Check(testkit.Rows( - "3 3", - "4 4", + tk.MustQuery(`select * from t where a > 0 limit 2, 4;`).Check(testkit.Rows( + "3 30", + "4 40", "5 5", "6 6", )) + + // test inline projection + tk.MustQuery(`select a from t order by a limit 2, 1;`).Check(testkit.Rows( + "3", + )) + tk.MustQuery(`select b from t order by a limit 2, 2;`).Check(testkit.Rows( + "30", + "40", + )) + tk.MustQuery(`select a from t order by a limit 2, 3;`).Check(testkit.Rows( + "3", + "4", + "5", + )) + tk.MustQuery(`select b from t order by a limit 2, 4;`).Check(testkit.Rows( + "30", + "40", + "5", + "6", + )) } func (s *testSuite) TestCoprocessorStreamingWarning(c *C) { @@ -3818,7 +4057,7 @@ func (s *testSuite3) TestUnsignedDecimalOverflow(c *C) { c.Assert(err, IsNil) } if res != nil { - res.Close() + c.Assert(res.Close(), IsNil) } } @@ -3835,7 +4074,8 @@ func (s *testSuite3) TestIndexJoinTableDualPanic(c *C) { tk.MustExec("drop table if exists a") tk.MustExec("create table a (f1 int, f2 varchar(32), primary key (f1))") tk.MustExec("insert into a (f1,f2) values (1,'a'), (2,'b'), (3,'c')") - tk.MustQuery("select a.* from a inner join (select 1 as k1,'k2-1' as k2) as k on a.f1=k.k1;"). + // TODO here: index join cause the data race of txn. + tk.MustQuery("select /*+ inl_merge_join(a) */ a.* from a inner join (select 1 as k1,'k2-1' as k2) as k on a.f1=k.k1;"). Check(testkit.Rows("1 a")) } @@ -3977,10 +4217,9 @@ func (s *testSuite3) TestMaxOneRow(c *C) { c.Assert(err, IsNil) err = rs.Next(context.TODO(), rs.NewChunk()) - c.Assert(err.Error(), Equals, "subquery returns more than 1 row") + c.Assert(err.Error(), Equals, "[executor:1242]Subquery returns more than 1 row") - err = rs.Close() - c.Assert(err, IsNil) + c.Assert(rs.Close(), IsNil) } func (s *testSuiteP2) TestCurrentTimestampValueSelection(c *C) { @@ -4021,7 +4260,7 @@ func (s *testSuite3) TestRowID(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) tk.MustExec(`drop table if exists t`) - tk.MustExec(`set @@tidb_enable_clustered_index=0;`) + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec(`create table t(a varchar(10), b varchar(10), c varchar(1), index idx(a, b, c));`) tk.MustExec(`insert into t values('a', 'b', 'c');`) tk.MustExec(`insert into t values('a', 'b', 'c');`) @@ -4111,32 +4350,43 @@ func (s *testSuite3) TestSelectHashPartitionTable(c *C) { func (s *testSuiteP1) TestSelectPartition(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) - tk.MustExec(`drop table if exists th, tr`) - tk.MustExec("set @@session.tidb_enable_table_partition = '1';") + tk.MustExec(`drop table if exists th, tr, tl`) + tk.MustExec("set @@session.tidb_enable_list_partition = ON;") tk.MustExec(`create table th (a int, b int) partition by hash(a) partitions 3;`) tk.MustExec(`create table tr (a int, b int) partition by range (a) ( partition r0 values less than (4), partition r1 values less than (7), partition r3 values less than maxvalue)`) - defer tk.MustExec(`drop table if exists th, tr`) + tk.MustExec(`create table tl (a int, b int, unique index idx(a)) partition by list (a) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null));`) + defer tk.MustExec(`drop table if exists th, tr, tl`) tk.MustExec(`insert into th values (0,0),(1,1),(2,2),(3,3),(4,4),(5,5),(6,6),(7,7),(8,8);`) tk.MustExec("insert into th values (-1,-1),(-2,-2),(-3,-3),(-4,-4),(-5,-5),(-6,-6),(-7,-7),(-8,-8);") tk.MustExec(`insert into tr values (-3,-3),(3,3),(4,4),(7,7),(8,8);`) + tk.MustExec(`insert into tl values (3,3),(1,1),(4,4),(7,7),(8,8),(null,null);`) // select 1 partition. tk.MustQuery("select b from th partition (p0) order by a").Check(testkit.Rows("-6", "-3", "0", "3", "6")) tk.MustQuery("select b from tr partition (r0) order by a").Check(testkit.Rows("-3", "3")) + tk.MustQuery("select b from tl partition (p0) order by a").Check(testkit.Rows("3")) tk.MustQuery("select b from th partition (p0,P0) order by a").Check(testkit.Rows("-6", "-3", "0", "3", "6")) tk.MustQuery("select b from tr partition (r0,R0,r0) order by a").Check(testkit.Rows("-3", "3")) + tk.MustQuery("select b from tl partition (p0,P0,p0) order by a").Check(testkit.Rows("3")) // select multi partition. tk.MustQuery("select b from th partition (P2,p0) order by a").Check(testkit.Rows("-8", "-6", "-5", "-3", "-2", "0", "2", "3", "5", "6", "8")) tk.MustQuery("select b from tr partition (r1,R3) order by a").Check(testkit.Rows("4", "7", "8")) + tk.MustQuery("select b from tl partition (p0,P3) order by a").Check(testkit.Rows("", "3", "7", "8")) // test select unknown partition error err := tk.ExecToErr("select b from th partition (p0,p4)") c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p4' in table 'th'") err = tk.ExecToErr("select b from tr partition (r1,r4)") c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'r4' in table 'tr'") + err = tk.ExecToErr("select b from tl partition (p0,p4)") + c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p4' in table 'tl'") // test select partition table in transaction. tk.MustExec("begin") @@ -4144,6 +4394,23 @@ func (s *testSuiteP1) TestSelectPartition(c *C) { tk.MustQuery("select a, b from th where b>10").Check(testkit.Rows("11 11")) tk.MustExec("commit") tk.MustQuery("select a, b from th where b>10").Check(testkit.Rows("11 11")) + + // test partition function is scalar func + tk.MustExec("drop table if exists tscalar") + tk.MustExec(`create table tscalar (c1 int) partition by range (c1 % 30) ( + partition p0 values less than (0), + partition p1 values less than (10), + partition p2 values less than (20), + partition pm values less than (maxvalue));`) + tk.MustExec("insert into tscalar values(0), (10), (40), (50), (55)") + // test IN expression + tk.MustExec("insert into tscalar values(-0), (-10), (-40), (-50), (-55)") + tk.MustQuery("select * from tscalar where c1 in (55, 55)").Check(testkit.Rows("55")) + tk.MustQuery("select * from tscalar where c1 in (40, 40)").Check(testkit.Rows("40")) + tk.MustQuery("select * from tscalar where c1 in (40)").Check(testkit.Rows("40")) + tk.MustQuery("select * from tscalar where c1 in (-40)").Check(testkit.Rows("-40")) + tk.MustQuery("select * from tscalar where c1 in (-40, -40)").Check(testkit.Rows("-40")) + tk.MustQuery("select * from tscalar where c1 in (-1)").Check(testkit.Rows()) } func (s *testSuiteP1) TestDeletePartition(c *C) { @@ -4174,9 +4441,11 @@ func (s *testSuite) TestSelectView(c *C) { tk.MustExec("create definer='root'@'localhost' view view1 as select * from view_t") tk.MustExec("create definer='root'@'localhost' view view2(c,d) as select * from view_t") tk.MustExec("create definer='root'@'localhost' view view3(c,d) as select a,b from view_t") + tk.MustExec("create definer='root'@'localhost' view view4 as select * from (select * from (select * from view_t) tb1) tb;") tk.MustQuery("select * from view1;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view2;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select * from view4;").Check(testkit.Rows("1 2")) tk.MustExec("drop table view_t;") tk.MustExec("create table view_t(c int,d int)") err := tk.ExecToErr("select * from view1") @@ -4191,14 +4460,16 @@ func (s *testSuite) TestSelectView(c *C) { tk.MustQuery("select * from view1;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view2;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select * from view4;").Check(testkit.Rows("1 2")) tk.MustExec("alter table view_t drop column a") tk.MustExec("alter table view_t add column a int after b") tk.MustExec("update view_t set a=1;") tk.MustQuery("select * from view1;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view2;").Check(testkit.Rows("1 2")) tk.MustQuery("select * from view3;").Check(testkit.Rows("1 2")) + tk.MustQuery("select * from view4;").Check(testkit.Rows("1 2")) tk.MustExec("drop table view_t;") - tk.MustExec("drop view view1,view2,view3;") + tk.MustExec("drop view view1,view2,view3,view4;") tk.MustExec("set @@tidb_enable_window_function = 1") defer func() { @@ -4419,6 +4690,22 @@ func (s *testSuiteP2) TestStrToDateBuiltin(c *C) { tk.MustQuery(`SELECT STR_TO_DATE('2020-07-04 00:22:33', '%Y-%m-%d %T')`).Check(testkit.Rows("2020-07-04 00:22:33")) } +func (s *testSuiteP2) TestAddDateBuiltinWithWarnings(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@sql_mode='NO_ZERO_DATE'") + result := tk.MustQuery(`select date_add('2001-01-00', interval -2 hour);`) + result.Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '2001-01-00'")) +} + +func (s *testSuiteP2) TestStrToDateBuiltinWithWarnings(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@sql_mode='NO_ZERO_DATE'") + tk.MustExec("use test") + tk.MustQuery(`SELECT STR_TO_DATE('0000-1-01', '%Y-%m-%d');`).Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1411 Incorrect datetime value: '0000-1-01' for function str_to_date")) +} + func (s *testSuiteP2) TestReadPartitionedTable(c *C) { // Test three reader on partitioned table. tk := testkit.NewTestKit(c, s.store) @@ -4450,9 +4737,7 @@ func (s *testSplitTable) TestSplitRegion(c *C) { // Test for split index region. // Check min value is more than max value. tk.MustExec(`split table t index idx1 between (0) and (1000000000) regions 10`) - _, err = tk.Exec(`split table t index idx1 between (2,'a') and (1,'c') regions 10`) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Split index `idx1` region lower value (2,a) should less than the upper value (1,c)") + tk.MustGetErrCode(`split table t index idx1 between (2,'a') and (1,'c') regions 10`, errno.ErrInvalidSplitRegionRanges) // Check min value is invalid. _, err = tk.Exec(`split table t index idx1 between () and (1) regions 10`) @@ -4482,9 +4767,7 @@ func (s *testSplitTable) TestSplitRegion(c *C) { // Test for split table region. tk.MustExec(`split table t between (0) and (1000000000) regions 10`) // Check the lower value is more than the upper value. - _, err = tk.Exec(`split table t between (2) and (1) regions 10`) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Split table `t` region lower value 2 should less than the upper value 1") + tk.MustGetErrCode(`split table t between (2) and (1) regions 10`, errno.ErrInvalidSplitRegionRanges) // Check the lower value is invalid. _, err = tk.Exec(`split table t between () and (1) regions 10`) @@ -4512,9 +4795,7 @@ func (s *testSplitTable) TestSplitRegion(c *C) { c.Assert(err.Error(), Equals, "[types:1265]Incorrect value: 'aa' for column '_tidb_rowid'") // Test split table region step is too small. - _, err = tk.Exec(`split table t between (0) and (100) regions 10`) - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "Split table `t` region step value should more than 1000, step 10 is invalid") + tk.MustGetErrCode(`split table t between (0) and (100) regions 10`, errno.ErrInvalidSplitRegionRanges) // Test split region by syntax. tk.MustExec(`split table t by (0),(1000),(1000000)`) @@ -4537,12 +4818,25 @@ func (s *testSplitTable) TestSplitRegion(c *C) { tk.MustQuery("split region for partition table t partition (p3,p4) between (100000000) and (1000000000) regions 5;").Check(testkit.Rows("8 1")) } +func (s *testSplitTable) TestSplitRegionEdgeCase(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a bigint(20) auto_increment primary key);") + tk.MustExec("split table t between (-9223372036854775808) and (9223372036854775807) regions 16;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int(20) auto_increment primary key);") + tk.MustGetErrCode("split table t between (-9223372036854775808) and (9223372036854775807) regions 16;", errno.ErrDataOutOfRange) +} + func (s *testSplitTable) TestClusterIndexSplitTableIntegration(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("drop database if exists test_cluster_index_index_split_table_integration;") tk.MustExec("create database test_cluster_index_index_split_table_integration;") tk.MustExec("use test_cluster_index_index_split_table_integration;") - tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a varchar(255), b double, c int, primary key (a, b));") @@ -4557,15 +4851,20 @@ func (s *testSplitTable) TestClusterIndexSplitTableIntegration(c *C) { tk.MustGetErrMsg("split table t between ('aaa', 0.0) and (100.0, 'aaa') regions 10;", errMsg) // lower bound >= upper bound. - errMsg = "Split table `t` region lower value (aaa,0) should less than the upper value (aaa,0)" + errMsg = "[executor:8212]Failed to split region ranges: Split table `t` region lower value (aaa,0) should less than the upper value (aaa,0)" tk.MustGetErrMsg("split table t between ('aaa', 0.0) and ('aaa', 0.0) regions 10;", errMsg) - errMsg = "Split table `t` region lower value (bbb,0) should less than the upper value (aaa,0)" + errMsg = "[executor:8212]Failed to split region ranges: Split table `t` region lower value (bbb,0) should less than the upper value (aaa,0)" tk.MustGetErrMsg("split table t between ('bbb', 0.0) and ('aaa', 0.0) regions 10;", errMsg) // Exceed limit 1000. errMsg = "Split table region num exceeded the limit 1000" tk.MustGetErrMsg("split table t between ('aaa', 0.0) and ('aaa', 0.1) regions 100000;", errMsg) + // Split on null values. + errMsg = "[planner:1048]Column 'a' cannot be null" + tk.MustGetErrMsg("split table t between (null, null) and (null, null) regions 1000;", errMsg) + tk.MustGetErrMsg("split table t by (null, null);", errMsg) + // Success. tk.MustExec("split table t between ('aaa', 0.0) and ('aaa', 100.0) regions 10;") tk.MustExec("split table t by ('aaa', 0.0), ('aaa', 20.0), ('aaa', 100.0);") @@ -4578,6 +4877,11 @@ func (s *testSplitTable) TestClusterIndexSplitTableIntegration(c *C) { tk.MustExec("drop table t;") tk.MustExec("create table t (a int, b int, c int, d int, primary key(d, a, c));") tk.MustQuery("split table t by (0, 0, 0), (1, 2, 3), (65535, 65535, 65535);").Check(testkit.Rows("3 1")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255), b decimal, c int, primary key (a, b));") + errMsg = "[types:1265]Incorrect value: '' for column 'b'" + tk.MustGetErrMsg("split table t by ('aaa', '')", errMsg) } func (s *testSplitTable) TestClusterIndexShowTableRegion(c *C) { @@ -4587,7 +4891,7 @@ func (s *testSplitTable) TestClusterIndexShowTableRegion(c *C) { tk.MustExec("drop database if exists cluster_index_regions;") tk.MustExec("create database cluster_index_regions;") tk.MustExec("use cluster_index_regions;") - tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a int, b int, c int, primary key(a, b));") tk.MustExec("insert t values (1, 1, 1), (2, 2, 2);") tk.MustQuery("split table t between (1, 0) and (2, 3) regions 2;").Check(testkit.Rows("1 1")) @@ -4609,10 +4913,10 @@ func (s *testSplitTable) TestClusterIndexShowTableRegion(c *C) { func (s *testSuiteWithData) TestClusterIndexOuterJoinElimination(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index = 1`) tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a int, b int, c int, primary key(a,b))") - rows := tk.MustQuery(`explain select t1.a from t t1 left join t t2 on t1.a = t2.a and t1.b = t2.b`).Rows() + rows := tk.MustQuery(`explain format = 'brief' select t1.a from t t1 left join t t2 on t1.a = t2.a and t1.b = t2.b`).Rows() rowStrs := s.testData.ConvertRowsToStrings(rows) for _, row := range rowStrs { // outer join has been eliminated. @@ -5007,6 +5311,30 @@ func (s *testSuiteP2) TestUnsignedFeedback(c *C) { c.Assert(result.Rows()[2][6], Equals, "range:[0,+inf], keep order:false") } +func (s *testSuite) TestSummaryFailedUpdate(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int as(-a))") + tk.MustExec("insert into t(a) values(1), (3), (7)") + sm := &mockSessionManager1{ + PS: make([]*util.ProcessInfo, 0), + } + tk.Se.SetSessionManager(sm) + s.domain.ExpensiveQueryHandle().SetSessionManager(sm) + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk.MustExec("set @@tidb_mem_quota_query=1") + err := tk.ExecToErr("update t set t.a = t.a - 1 where t.a in (select a from t where a < 4)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota!.*") + tk.MustExec("set @@tidb_mem_quota_query=1000000000") + tk.MustQuery("select stmt_type from information_schema.statements_summary where digest_text = 'update `t` set `t` . `a` = `t` . `a` - ? where `t` . `a` in ( select `a` from `t` where `a` < ? )'").Check(testkit.Rows("Update")) +} + func (s *testSuite) TestOOMPanicAction(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -5058,6 +5386,8 @@ func (s *testSuite) TestOOMPanicAction(c *C) { tk.MustExec("insert into t values (1),(2),(3),(4),(5);") tk.MustExec("set @@tidb_mem_quota_query=244;") _, err = tk.Exec("delete t, t1 from t join t1 on t.a = t1.a") + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota!.*") tk.MustExec("set @@tidb_mem_quota_query=100000;") tk.MustExec("truncate table t") @@ -5105,7 +5435,8 @@ func (s *testRecoverTable) TearDownSuite(c *C) { func (s *testRecoverTable) TestRecoverTable(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange", `return(true)`), IsNil) defer func() { - failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange") + err := failpoint.Disable("github.com/pingcap/tidb/meta/autoid/mockAutoIDChange") + c.Assert(err, IsNil) }() tk := testkit.NewTestKit(c, s.store) tk.MustExec("create database if not exists test_recover") @@ -5142,10 +5473,9 @@ func (s *testRecoverTable) TestRecoverTable(c *C) { // set GC safe point tk.MustExec(fmt.Sprintf(safePointSQL, timeBeforeDrop)) - // if GC enable is not exists in mysql.tidb - _, err = tk.Exec("recover table t_recover") - c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[ddl:-1]can not get 'tikv_gc_enable'") + // Should recover, and we can drop it straight away. + tk.MustExec("recover table t_recover") + tk.MustExec("drop table t_recover") err = gcutil.EnableGC(tk.Se) c.Assert(err, IsNil) @@ -5818,15 +6148,12 @@ func (s *testClusterTableSuite) TearDownSuite(c *C) { s.testSuiteWithCliBase.TearDownSuite(c) } -func (s *testClusterTableSuite) TestSlowQuery(c *C) { - writeFile := func(file string, data string) { - f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - c.Assert(err, IsNil) - _, err = f.Write([]byte(data)) - c.Assert(f.Close(), IsNil) - c.Assert(err, IsNil) - } +func (s *testSuiteP1) TestPrepareLoadData(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustGetErrCode(`prepare stmt from "load data local infile '/tmp/load_data_test.csv' into table test";`, mysql.ErrUnsupportedPs) +} +func (s *testClusterTableSuite) TestSlowQuery(c *C) { logData0 := "" logData1 := ` # Time: 2020-02-15T18:00:01.000000+08:00 @@ -5846,23 +6173,18 @@ select 6;` logData4 := ` # Time: 2020-05-14T19:03:54.314615176+08:00 select 7;` + logData := []string{logData0, logData1, logData2, logData3, logData4} fileName0 := "tidb-slow-2020-02-14T19-04-05.01.log" fileName1 := "tidb-slow-2020-02-15T19-04-05.01.log" fileName2 := "tidb-slow-2020-02-16T19-04-05.01.log" fileName3 := "tidb-slow-2020-02-17T18-00-05.01.log" fileName4 := "tidb-slow.log" - writeFile(fileName0, logData0) - writeFile(fileName1, logData1) - writeFile(fileName2, logData2) - writeFile(fileName3, logData3) - writeFile(fileName4, logData4) + fileNames := []string{fileName0, fileName1, fileName2, fileName3, fileName4} + + prepareLogs(c, logData, fileNames) defer func() { - os.Remove(fileName0) - os.Remove(fileName1) - os.Remove(fileName2) - os.Remove(fileName3) - os.Remove(fileName4) + removeFiles(fileNames) }() tk := testkit.NewTestKitWithInit(c, s.store) loc, err := time.LoadLocation("Asia/Shanghai") @@ -5935,6 +6257,121 @@ select 7;` } } +func (s *testClusterTableSuite) TestIssue20236(c *C) { + logData0 := "" + logData1 := ` +# Time: 2020-02-15T18:00:01.000000+08:00 +select 1; +# Time: 2020-02-15T19:00:05.000000+08:00 +select 2; +# Time: 2020-02-15T20:00:05.000000+08:00` + logData2 := `select 3; +# Time: 2020-02-16T18:00:01.000000+08:00 +select 4; +# Time: 2020-02-16T18:00:05.000000+08:00 +select 5;` + logData3 := ` +# Time: 2020-02-16T19:00:00.000000+08:00 +select 6; +# Time: 2020-02-17T18:00:05.000000+08:00 +select 7; +# Time: 2020-02-17T19:00:00.000000+08:00` + logData4 := `select 8; +# Time: 2020-02-17T20:00:00.000000+08:00 +select 9 +# Time: 2020-05-14T19:03:54.314615176+08:00 +select 10;` + logData := []string{logData0, logData1, logData2, logData3, logData4} + + fileName0 := "tidb-slow-2020-02-14T19-04-05.01.log" + fileName1 := "tidb-slow-2020-02-15T19-04-05.01.log" + fileName2 := "tidb-slow-2020-02-16T19-04-05.01.log" + fileName3 := "tidb-slow-2020-02-17T18-00-05.01.log" + fileName4 := "tidb-slow.log" + fileNames := []string{fileName0, fileName1, fileName2, fileName3, fileName4} + prepareLogs(c, logData, fileNames) + defer func() { + removeFiles(fileNames) + }() + tk := testkit.NewTestKitWithInit(c, s.store) + loc, err := time.LoadLocation("Asia/Shanghai") + c.Assert(err, IsNil) + tk.Se.GetSessionVars().TimeZone = loc + tk.MustExec("use information_schema") + cases := []struct { + prepareSQL string + sql string + result []string + }{ + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select time from cluster_slow_query where time > '2020-02-17 12:00:05.000000' and time < '2020-05-14 20:00:00.000000'", + result: []string{"2020-02-17 18:00:05.000000", "2020-02-17 19:00:00.000000", "2020-05-14 19:03:54.314615"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select time from cluster_slow_query where time > '2020-02-17 12:00:05.000000' and time < '2020-05-14 20:00:00.000000' order by time desc", + result: []string{"2020-05-14 19:03:54.314615", "2020-02-17 19:00:00.000000", "2020-02-17 18:00:05.000000"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select time from cluster_slow_query where (time > '2020-02-15 18:00:00' and time < '2020-02-15 20:01:00') or (time > '2020-02-17 18:00:00' and time < '2020-05-14 20:00:00') order by time", + result: []string{"2020-02-15 18:00:01.000000", "2020-02-15 19:00:05.000000", "2020-02-17 18:00:05.000000", "2020-02-17 19:00:00.000000", "2020-05-14 19:03:54.314615"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select time from cluster_slow_query where (time > '2020-02-15 18:00:00' and time < '2020-02-15 20:01:00') or (time > '2020-02-17 18:00:00' and time < '2020-05-14 20:00:00') order by time desc", + result: []string{"2020-05-14 19:03:54.314615", "2020-02-17 19:00:00.000000", "2020-02-17 18:00:05.000000", "2020-02-15 19:00:05.000000", "2020-02-15 18:00:01.000000"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select count(*) from cluster_slow_query where time > '2020-02-15 18:00:00.000000' and time < '2020-05-14 20:00:00.000000' order by time desc", + result: []string{"9"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select count(*) from cluster_slow_query where (time > '2020-02-16 18:00:00' and time < '2020-05-14 20:00:00') or (time > '2020-02-17 18:00:00' and time < '2020-05-17 20:00:00')", + result: []string{"6"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select count(*) from cluster_slow_query where time > '2020-02-16 18:00:00.000000' and time < '2020-02-17 20:00:00.000000' order by time desc", + result: []string{"5"}, + }, + { + prepareSQL: "set @@time_zone = '+08:00'", + sql: "select time from cluster_slow_query where time > '2020-02-16 18:00:00.000000' and time < '2020-05-14 20:00:00.000000' order by time desc limit 3", + result: []string{"2020-05-14 19:03:54.314615", "2020-02-17 19:00:00.000000", "2020-02-17 18:00:05.000000"}, + }, + } + for _, cas := range cases { + if len(cas.prepareSQL) > 0 { + tk.MustExec(cas.prepareSQL) + } + tk.MustQuery(cas.sql).Check(testutil.RowsWithSep("|", cas.result...)) + } +} + +func prepareLogs(c *C, logData []string, fileNames []string) { + writeFile := func(file string, data string) { + f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + c.Assert(err, IsNil) + _, err = f.Write([]byte(data)) + c.Assert(f.Close(), IsNil) + c.Assert(err, IsNil) + } + + for i, log := range logData { + writeFile(fileNames[i], log) + } +} + +func removeFiles(fileNames []string) { + for _, fileName := range fileNames { + os.Remove(fileName) + } +} + func (s *testSuite1) TestIssue15718(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") @@ -6091,27 +6528,18 @@ func (s *testSuite1) TestInsertIntoGivenPartitionSet(c *C) { tk.MustExec("insert into t1 partition(p0, p1) values(3, 'c'), (4, 'd')") tk.MustQuery("select * from t1 partition(p1)").Check(testkit.Rows()) - err := tk.ExecToErr("insert into t1 values(1, 'a')") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx_a'") - - err = tk.ExecToErr("insert into t1 partition(p0, p_non_exist) values(1, 'a')") - c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p_non_exist' in table 't1'") - - err = tk.ExecToErr("insert into t1 partition(p0, p1) values(40, 'a')") - c.Assert(err.Error(), Equals, "[table:1748]Found a row not matching the given partition set") + tk.MustGetErrMsg("insert into t1 values(1, 'a')", "[kv:1062]Duplicate entry '1' for key 'idx_a'") + tk.MustGetErrMsg("insert into t1 partition(p0, p_non_exist) values(1, 'a')", "[table:1735]Unknown partition 'p_non_exist' in table 't1'") + tk.MustGetErrMsg("insert into t1 partition(p0, p1) values(40, 'a')", "[table:1748]Found a row not matching the given partition set") // replace into tk.MustExec("replace into t1 partition(p0) values(1, 'replace')") tk.MustExec("replace into t1 partition(p0, p1) values(3, 'replace'), (4, 'replace')") - - err = tk.ExecToErr("replace into t1 values(1, 'a')") + tk.MustExec("replace into t1 values(1, 'a')") tk.MustQuery("select * from t1 partition (p0) order by a").Check(testkit.Rows("1 a", "2 b", "3 replace", "4 replace")) - err = tk.ExecToErr("replace into t1 partition(p0, p_non_exist) values(1, 'a')") - c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p_non_exist' in table 't1'") - - err = tk.ExecToErr("replace into t1 partition(p0, p1) values(40, 'a')") - c.Assert(err.Error(), Equals, "[table:1748]Found a row not matching the given partition set") + tk.MustGetErrMsg("replace into t1 partition(p0, p_non_exist) values(1, 'a')", "[table:1735]Unknown partition 'p_non_exist' in table 't1'") + tk.MustGetErrMsg("replace into t1 partition(p0, p1) values(40, 'a')", "[table:1748]Found a row not matching the given partition set") tk.MustExec("truncate table t1") @@ -6120,8 +6548,7 @@ func (s *testSuite1) TestInsertIntoGivenPartitionSet(c *C) { defer tk.MustExec("drop table if exists t") // insert into general table - err = tk.ExecToErr("insert into t partition(p0, p1) values(1, 'a')") - c.Assert(err.Error(), Equals, "[planner:1747]PARTITION () clause on non partitioned table") + tk.MustGetErrMsg("insert into t partition(p0, p1) values(1, 'a')", "[planner:1747]PARTITION () clause on non partitioned table") // insert into from select tk.MustExec("insert into t values(1, 'a'), (2, 'b')") @@ -6134,14 +6561,9 @@ func (s *testSuite1) TestInsertIntoGivenPartitionSet(c *C) { tk.MustQuery("select * from t1 partition(p1) order by a").Check(testkit.Rows()) tk.MustQuery("select * from t1 partition(p0) order by a").Check(testkit.Rows("1 a", "2 b", "3 c", "4 d")) - err = tk.ExecToErr("insert into t1 select 1, 'a'") - c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx_a'") - - err = tk.ExecToErr("insert into t1 partition(p0, p_non_exist) select 1, 'a'") - c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p_non_exist' in table 't1'") - - err = tk.ExecToErr("insert into t1 partition(p0, p1) select 40, 'a'") - c.Assert(err.Error(), Equals, "[table:1748]Found a row not matching the given partition set") + tk.MustGetErrMsg("insert into t1 select 1, 'a'", "[kv:1062]Duplicate entry '1' for key 'idx_a'") + tk.MustGetErrMsg("insert into t1 partition(p0, p_non_exist) select 1, 'a'", "[table:1735]Unknown partition 'p_non_exist' in table 't1'") + tk.MustGetErrMsg("insert into t1 partition(p0, p1) select 40, 'a'", "[table:1748]Found a row not matching the given partition set") // replace into from select tk.MustExec("replace into t1 partition(p0) select 1, 'replace'") @@ -6149,14 +6571,10 @@ func (s *testSuite1) TestInsertIntoGivenPartitionSet(c *C) { tk.MustExec("insert into t values(3, 'replace'), (4, 'replace')") tk.MustExec("replace into t1 partition(p0, p1) select * from t") - err = tk.ExecToErr("replace into t1 values select 1, 'a'") - tk.MustQuery("select * from t1 partition (p0) order by a").Check(testkit.Rows("1 replace", "2 b", "3 replace", "4 replace")) - - err = tk.ExecToErr("replace into t1 partition(p0, p_non_exist) select 1, 'a'") - c.Assert(err.Error(), Equals, "[table:1735]Unknown partition 'p_non_exist' in table 't1'") - - err = tk.ExecToErr("replace into t1 partition(p0, p1) select 40, 'a'") - c.Assert(err.Error(), Equals, "[table:1748]Found a row not matching the given partition set") + tk.MustExec("replace into t1 select 1, 'a'") + tk.MustQuery("select * from t1 partition (p0) order by a").Check(testkit.Rows("1 a", "2 b", "3 replace", "4 replace")) + tk.MustGetErrMsg("replace into t1 partition(p0, p_non_exist) select 1, 'a'", "[table:1735]Unknown partition 'p_non_exist' in table 't1'") + tk.MustGetErrMsg("replace into t1 partition(p0, p1) select 40, 'a'", "[table:1748]Found a row not matching the given partition set") } func (s *testSuite1) TestUpdateGivenPartitionSet(c *C) { @@ -6225,7 +6643,7 @@ func (s *testSuiteP2) TestApplyCache(c *C) { tk.MustExec("insert into t values (1),(1),(1),(1),(1),(1),(1),(1),(1);") tk.MustExec("analyze table t;") result := tk.MustQuery("explain analyze SELECT count(1) FROM (SELECT (SELECT min(a) FROM t as t2 WHERE t2.a > t1.a) AS a from t as t1) t;") - c.Assert(result.Rows()[1][0], Equals, "└─Apply_41") + c.Assert(result.Rows()[1][0], Equals, "└─Apply_38") var ( ind int flag bool @@ -6245,7 +6663,7 @@ func (s *testSuiteP2) TestApplyCache(c *C) { tk.MustExec("insert into t values (1),(2),(3),(4),(5),(6),(7),(8),(9);") tk.MustExec("analyze table t;") result = tk.MustQuery("explain analyze SELECT count(1) FROM (SELECT (SELECT min(a) FROM t as t2 WHERE t2.a > t1.a) AS a from t as t1) t;") - c.Assert(result.Rows()[1][0], Equals, "└─Apply_41") + c.Assert(result.Rows()[1][0], Equals, "└─Apply_38") flag = false value = (result.Rows()[1][5]).(string) for ind = 0; ind < len(value)-5; ind++ { @@ -6298,7 +6716,8 @@ func (s *testSlowQuery) TestSlowQuerySensitiveQuery(c *C) { defer func() { tk.MustExec("set tidb_slow_log_threshold=300;") config.StoreGlobalConfig(originCfg) - os.Remove(newCfg.Log.SlowQueryFile) + err = os.Remove(newCfg.Log.SlowQueryFile) + c.Assert(err, IsNil) }() err = logutil.InitLogger(newCfg.Log.ToLogConfig()) c.Assert(err, IsNil) @@ -6318,15 +6737,72 @@ func (s *testSlowQuery) TestSlowQuerySensitiveQuery(c *C) { )) } -func (s *testSerialSuite) TestKillTableReader(c *C) { - var retry = "github.com/pingcap/tidb/store/tikv/mockRetrySendReqToRegion" - defer func() { - c.Assert(failpoint.Disable(retry), IsNil) - }() +func (s *testSlowQuery) TestLogSlowLogIndex(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test;") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int)") + f, err := ioutil.TempFile("", "tidb-slow-*.log") + c.Assert(err, IsNil) + f.Close() + + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.Log.SlowQueryFile = f.Name() + }) + err = logutil.InitLogger(config.GetGlobalConfig().Log.ToLogConfig()) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("create table t (a int, b int,index idx(a));") + tk.MustExec("set tidb_slow_log_threshold=0;") + tk.MustQuery("select * from t use index (idx) where a in (1) union select * from t use index (idx) where a in (2,3);") + tk.MustExec("set tidb_slow_log_threshold=300;") + tk.MustQuery("select index_names from `information_schema`.`slow_query` " + + "where query like 'select%union%' limit 1"). + Check(testkit.Rows( + "[t:idx]", + )) +} + +func (s *testSlowQuery) TestSlowQuery(c *C) { + tk := testkit.NewTestKit(c, s.store) + + f, err := ioutil.TempFile("", "tidb-slow-*.log") + c.Assert(err, IsNil) + _, err = f.WriteString(` +# Time: 2020-10-13T20:08:13.970563+08:00 +select * from t; +# Time: 2020-10-16T20:08:13.970563+08:00 +select * from t; +`) + c.Assert(err, IsNil) + err = f.Close() + c.Assert(err, IsNil) + executor.ParseSlowLogBatchSize = 1 + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + newCfg.Log.SlowQueryFile = f.Name() + config.StoreGlobalConfig(&newCfg) + defer func() { + executor.ParseSlowLogBatchSize = 64 + config.StoreGlobalConfig(originCfg) + err = os.Remove(newCfg.Log.SlowQueryFile) + c.Assert(err, IsNil) + }() + err = logutil.InitLogger(newCfg.Log.ToLogConfig()) + c.Assert(err, IsNil) + + tk.MustQuery("select count(*) from `information_schema`.`slow_query` where time > '2020-10-16 20:08:13' and time < '2020-10-16 21:08:13'").Check(testkit.Rows("1")) + tk.MustQuery("select count(*) from `information_schema`.`slow_query` where time > '2019-10-13 20:08:13' and time < '2020-10-16 21:08:13'").Check(testkit.Rows("2")) +} + +func (s *testSerialSuite) TestKillTableReader(c *C) { + var retry = "github.com/pingcap/tidb/store/tikv/mockRetrySendReqToRegion" + defer func() { + c.Assert(failpoint.Disable(retry), IsNil) + }() + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int)") tk.MustExec("insert into t values (1),(2),(3)") tk.MustExec("set @@tidb_distsql_scan_concurrency=1") atomic.StoreUint32(&tk.Se.GetSessionVars().Killed, 0) @@ -6347,16 +6823,14 @@ func (s *testSerialSuite) TestKillTableReader(c *C) { func (s *testSerialSuite) TestPrevStmtDesensitization(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") - oriCfg := config.GetGlobalConfig() - defer config.StoreGlobalConfig(oriCfg) - newCfg := *oriCfg - newCfg.EnableRedactLog = 1 - config.StoreGlobalConfig(&newCfg) + tk.MustExec(fmt.Sprintf("set @@session.%v=1", variable.TiDBRedactLog)) + defer tk.MustExec(fmt.Sprintf("set @@session.%v=0", variable.TiDBRedactLog)) tk.MustExec("drop table if exists t") - tk.MustExec("create table t (a int)") + tk.MustExec("create table t (a int, unique key (a))") tk.MustExec("begin") tk.MustExec("insert into t values (1),(2)") - c.Assert(tk.Se.GetSessionVars().PrevStmt.String(), Equals, "insert into t values ( ? ) , ( ? )") + c.Assert(tk.Se.GetSessionVars().PrevStmt.String(), Equals, "insert into `t` values ( ? ) , ( ? )") + c.Assert(tk.ExecToErr("insert into t values (1)").Error(), Equals, `[kv:1062]Duplicate entry '?' for key 'a'`) } func (s *testSuite) TestIssue19372(c *C) { @@ -6384,6 +6858,61 @@ func (s *testSerialSuite1) TestCollectCopRuntimeStats(c *C) { c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/tikvStoreRespResult"), IsNil) } +func (s *testSerialSuite1) TestIndexLookupRuntimeStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int, b int, index(a))") + tk.MustExec("insert into t1 values (1,2),(2,3),(3,4)") + sql := "explain analyze select * from t1 use index(a) where a > 1;" + rows := tk.MustQuery(sql).Rows() + c.Assert(len(rows), Equals, 3) + explain := fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*time:.*loops:.*index_task:.*table_task: {total_time.*num.*concurrency.*}.*") + indexExplain := fmt.Sprintf("%v", rows[1]) + tableExplain := fmt.Sprintf("%v", rows[2]) + c.Assert(indexExplain, Matches, ".*time:.*loops:.*cop_task:.*") + c.Assert(tableExplain, Matches, ".*time:.*loops:.*cop_task:.*") +} + +func (s *testSerialSuite1) TestHashAggRuntimeStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("insert into t1 values (1,2),(2,3),(3,4)") + sql := "explain analyze SELECT /*+ HASH_AGG() */ count(*) FROM t1 WHERE a < 10;" + rows := tk.MustQuery(sql).Rows() + c.Assert(len(rows), Equals, 5) + explain := fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*time:.*loops:.*partial_worker:{wall_time:.*concurrency:.*task_num:.*tot_wait:.*tot_exec:.*tot_time:.*max:.*p95:.*}.*final_worker:{wall_time:.*concurrency:.*task_num:.*tot_wait:.*tot_exec:.*tot_time:.*max:.*p95:.*}.*") +} + +func (s *testSerialSuite1) TestIndexMergeRuntimeStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1") + tk.MustExec("set @@tidb_enable_index_merge = 1") + tk.MustExec("create table t1(id int primary key, a int, b int, c int, d int)") + tk.MustExec("create index t1a on t1(a)") + tk.MustExec("create index t1b on t1(b)") + tk.MustExec("insert into t1 values(1,1,1,1,1),(2,2,2,2,2),(3,3,3,3,3),(4,4,4,4,4),(5,5,5,5,5)") + sql := "explain analyze select /*+ use_index_merge(t1, primary, t1a) */ * from t1 where id < 2 or a > 4;" + rows := tk.MustQuery(sql).Rows() + c.Assert(len(rows), Equals, 4) + explain := fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*time:.*loops:.*index_task:{fetch_handle:.*, merge:.*}.*table_task:{num.*concurrency.*fetch_row.*wait_time.*}.*") + tableRangeExplain := fmt.Sprintf("%v", rows[1]) + indexExplain := fmt.Sprintf("%v", rows[2]) + tableExplain := fmt.Sprintf("%v", rows[3]) + c.Assert(tableRangeExplain, Matches, ".*time:.*loops:.*cop_task:.*") + c.Assert(indexExplain, Matches, ".*time:.*loops:.*cop_task:.*") + c.Assert(tableExplain, Matches, ".*time:.*loops:.*cop_task:.*") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + sql = "select /*+ use_index_merge(t1, primary, t1a) */ * from t1 where id < 2 or a > 4 order by a" + tk.MustQuery(sql).Check(testkit.Rows("1 1 1 1 1", "5 5 5 5 5")) +} + func (s *testSuite) TestCollectDMLRuntimeStats(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -6423,12 +6952,12 @@ func (s *testSuite) TestCollectDMLRuntimeStats(c *C) { tk.MustExec("begin pessimistic") tk.MustExec("insert ignore into t1 values (9,9)") - c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}}}.*") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert: {total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}}}.*") tk.MustExec("rollback") tk.MustExec("begin pessimistic") tk.MustExec("insert into t1 values (10,10) on duplicate key update a=a+1") - c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}.*") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert: {total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:{BatchGet:{num_rpc:.*, total_time:.*}.*") tk.MustExec("rollback") tk.MustExec("begin pessimistic") @@ -6438,7 +6967,7 @@ func (s *testSuite) TestCollectDMLRuntimeStats(c *C) { tk.MustExec("begin pessimistic") tk.MustExec("insert ignore into t1 values(11,11) on duplicate key update `a`=`a`+1") - c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert:{total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:.*}") + c.Assert(getRootStats(), Matches, "time:.*, loops:.*, prepare:.*, check_insert: {total_time:.*, mem_insert_time:.*, prefetch:.*, rpc:.*}") tk.MustExec("rollback") tk.MustExec("begin pessimistic") @@ -6461,8 +6990,77 @@ func (s *testSuite) TestIssue13758(c *C) { )) } -func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { - // Assert Coprocessor OOMAction +func (s *testCoprCache) SetUpSuite(c *C) { + originConfig := config.GetGlobalConfig() + config.StoreGlobalConfig(config.NewConfig()) + defer config.StoreGlobalConfig(originConfig) + cli := ®ionProperityClient{} + hijackClient := func(c tikv.Client) tikv.Client { + cli.Client = c + return cli + } + var err error + s.store, err = mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c cluster.Cluster) { + mockstore.BootstrapWithSingleStore(c) + s.cls = c + }), + mockstore.WithClientHijacker(hijackClient), + ) + c.Assert(err, IsNil) + s.dom, err = session.BootstrapSession(s.store) + c.Assert(err, IsNil) +} + +func (s *testCoprCache) TearDownSuite(c *C) { + s.dom.Close() + s.store.Close() +} + +func (s *testCoprCache) TestIntegrationCopCache(c *C) { + originConfig := config.GetGlobalConfig() + config.StoreGlobalConfig(config.NewConfig()) + defer config.StoreGlobalConfig(originConfig) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key)") + tblInfo, err := s.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tid := tblInfo.Meta().ID + tk.MustExec(`insert into t values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)`) + s.cls.SplitTable(tid, 6) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/cophandler/mockCopCacheInUnistore", `return(123)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/cophandler/mockCopCacheInUnistore"), IsNil) + }() + + rows := tk.MustQuery("explain analyze select * from t where t.a < 10").Rows() + c.Assert(rows[0][2], Equals, "9") + c.Assert(strings.Contains(rows[0][5].(string), "cop_task: {num: 5"), Equals, true) + c.Assert(strings.Contains(rows[0][5].(string), "copr_cache_hit_ratio: 0.00"), Equals, true) + + rows = tk.MustQuery("explain analyze select * from t").Rows() + c.Assert(rows[0][2], Equals, "12") + c.Assert(strings.Contains(rows[0][5].(string), "cop_task: {num: 6"), Equals, true) + hitRatioIdx := strings.Index(rows[0][5].(string), "copr_cache_hit_ratio:") + len("copr_cache_hit_ratio: ") + c.Assert(hitRatioIdx >= len("copr_cache_hit_ratio: "), Equals, true) + hitRatio, err := strconv.ParseFloat(rows[0][5].(string)[hitRatioIdx:hitRatioIdx+4], 64) + c.Assert(err, IsNil) + c.Assert(hitRatio > 0, Equals, true) + + // Test for cop cache disabled. + cfg := config.NewConfig() + cfg.TiKVClient.CoprCache.CapacityMB = 0 + config.StoreGlobalConfig(cfg) + rows = tk.MustQuery("explain analyze select * from t where t.a < 10").Rows() + c.Assert(rows[0][2], Equals, "9") + c.Assert(strings.Contains(rows[0][5].(string), "copr_cache: disabled"), Equals, true) +} + +func (s *testSerialSuite) TestCoprocessorOOMTicase(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec(`set @@tidb_wait_split_region_finish=1`) @@ -6480,7 +7078,10 @@ func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { tk.MustExec(fmt.Sprintf("insert into t5 (id) values (%v)", i)) tk.MustExec(fmt.Sprintf("insert into t6 (id) values (%v)", i)) } - + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionLog + }) testcases := []struct { name string sql string @@ -6494,73 +7095,729 @@ func (s *testSerialSuite) TestCoprocessorOOMAction(c *C) { sql: "select id from t5", }, } - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.OOMAction = config.OOMActionCancel - }) - failpoint.Enable("github.com/pingcap/tidb/store/tikv/testRateLimitActionMockConsume", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/store/tikv/testRateLimitActionMockConsume") - // assert oom action + + f := func() { + for _, testcase := range testcases { + c.Log(testcase.name) + // larger than one copResponse, smaller than 2 copResponse + quota := 2*copr.MockResponseSizeForTest - 100 + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + var expect []string + for i := 0; i < count; i++ { + expect = append(expect, fmt.Sprintf("%v", i)) + } + tk.MustQuery(testcase.sql).Sort().Check(testkit.Rows(expect...)) + // assert oom action worked by max consumed > memory quota + c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.MaxConsumed(), Greater, int64(quota)) + se.Close() + } + } + + // ticase-4169, trigger oom action twice after workers consuming all the data + err := failpoint.Enable("github.com/pingcap/tidb/store/copr/ticase-4169", `return(true)`) + c.Assert(err, IsNil) + f() + err = failpoint.Disable("github.com/pingcap/tidb/store/copr/ticase-4169") + c.Assert(err, IsNil) + // ticase-4170, trigger oom action twice after iterator receiving all the data. + err = failpoint.Enable("github.com/pingcap/tidb/store/copr/ticase-4170", `return(true)`) + c.Assert(err, IsNil) + f() + err = failpoint.Disable("github.com/pingcap/tidb/store/copr/ticase-4170") + c.Assert(err, IsNil) + // ticase-4171, trigger oom before reading or consuming any data + err = failpoint.Enable("github.com/pingcap/tidb/store/copr/ticase-4171", `return(true)`) + c.Assert(err, IsNil) + f() + err = failpoint.Disable("github.com/pingcap/tidb/store/copr/ticase-4171") + c.Assert(err, IsNil) +} + +func (s *testSuite) TestIssue20237(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, s") + tk.MustExec("create table t(a date, b float)") + tk.MustExec("create table s(b float)") + tk.MustExec(`insert into t values(NULL,-37), ("2011-11-04",105), ("2013-03-02",-22), ("2006-07-02",-56), (NULL,124), (NULL,111), ("2018-03-03",-5);`) + tk.MustExec(`insert into s values(-37),(105),(-22),(-56),(124),(105),(111),(-5);`) + tk.MustQuery(`select count(distinct t.a, t.b) from t join s on t.b= s.b;`).Check(testkit.Rows("4")) +} + +func (s *testSerialSuite) TestIssue19148(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a decimal(16, 2));") + tk.MustExec("select * from t where a > any_value(a);") + ctx := tk.Se.(sessionctx.Context) + is := domain.GetDomain(ctx).InfoSchema() + tblInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + c.Assert(int(tblInfo.Meta().Columns[0].Flag), Equals, 0) +} + +func (s *testSuite) TestIssue19667(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (a DATETIME)") + tk.MustExec("INSERT INTO t VALUES('1988-04-17 01:59:59')") + tk.MustQuery(`SELECT DATE_ADD(a, INTERVAL 1 SECOND) FROM t`).Check(testkit.Rows("1988-04-17 02:00:00")) +} + +func issue20975Prepare(c *C, store kv.Storage) (*testkit.TestKit, *testkit.TestKit) { + tk1 := testkit.NewTestKit(c, store) + tk2 := testkit.NewTestKit(c, store) + tk1.MustExec("use test") + tk1.MustExec("drop table if exists t1, t2") + tk2.MustExec("use test") + tk1.MustExec("create table t1(id int primary key, c int)") + tk1.MustExec("insert into t1 values(1, 10), (2, 20)") + return tk1, tk2 +} + +func (s *testSuite) TestIssue20975UpdateNoChange(c *C) { + tk1, tk2 := issue20975Prepare(c, s.store) + tk1.MustExec("begin pessimistic") + tk1.MustExec("update t1 set c=c") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdate(c *C) { + tk1, tk2 := issue20975Prepare(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdatePointGet(c *C) { + tk1, tk2 := issue20975Prepare(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id=1 for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id=1 for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdateBatchPointGet(c *C) { + tk1, tk2 := issue20975Prepare(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id in (1, 2) for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id in (1, 2) for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func issue20975PreparePartitionTable(c *C, store kv.Storage) (*testkit.TestKit, *testkit.TestKit) { + tk1 := testkit.NewTestKit(c, store) + tk2 := testkit.NewTestKit(c, store) + tk1.MustExec("use test") + tk1.MustExec("drop table if exists t1, t2") + tk2.MustExec("use test") + tk1.MustExec(`create table t1(id int primary key, c int) partition by range (id) ( + partition p1 values less than (10), + partition p2 values less than (20) + )`) + tk1.MustExec("insert into t1 values(1, 10), (2, 20), (11, 30), (12, 40)") + return tk1, tk2 +} + +func (s *testSuite) TestIssue20975UpdateNoChangeWithPartitionTable(c *C) { + tk1, tk2 := issue20975PreparePartitionTable(c, s.store) + tk1.MustExec("begin pessimistic") + tk1.MustExec("update t1 set c=c") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdateWithPartitionTable(c *C) { + tk1, tk2 := issue20975PreparePartitionTable(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdatePointGetWithPartitionTable(c *C) { + tk1, tk2 := issue20975PreparePartitionTable(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id=1 for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id=12 for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id=1 for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id=12 for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20975SelectForUpdateBatchPointGetWithPartitionTable(c *C) { + tk1, tk2 := issue20975PreparePartitionTable(c, s.store) + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id in (1, 2) for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id in (11, 12) for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") + + tk1.MustExec("begin") + tk1.MustExec("select * from t1 where id in (1, 11) for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id in (1, 2) for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id in (11, 12) for update") + tk2.MustExec("create table t2(a int)") + tk1.MustExec("commit") + + tk1.MustExec("begin pessimistic") + tk1.MustExec("select * from t1 where id in (1, 11) for update") + tk2.MustExec("drop table t2") + tk1.MustExec("commit") +} + +func (s *testSuite) TestIssue20305(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t2 (a year(4))") + tk.MustExec("insert into t2 values(69)") + tk.MustQuery("select * from t2 where a <= 69").Check(testkit.Rows("2069")) + // the following test is a regression test that matches MySQL's behavior. + tk.MustExec("drop table if exists t3") + tk.MustExec("CREATE TABLE `t3` (`y` year DEFAULT NULL, `a` int DEFAULT NULL)") + tk.MustExec("INSERT INTO `t3` VALUES (2069, 70), (2010, 11), (2155, 2156), (2069, 69)") + tk.MustQuery("SELECT * FROM `t3` where y <= a").Check(testkit.Rows("2155 2156")) +} + +func (s *testSuite) TestIssue22817(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t3") + tk.MustExec("create table t3 (a year)") + tk.MustExec("insert into t3 values (1991), (\"1992\"), (\"93\"), (94)") + tk.MustQuery("select * from t3 where a >= NULL").Check(testkit.Rows()) +} + +func (s *testSuite) TestIssue13953(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE `t` (`id` int(11) DEFAULT NULL, `tp_bigint` bigint(20) DEFAULT NULL )") + tk.MustExec("insert into t values(0,1),(1,9215570218099803537)") + tk.MustQuery("select A.tp_bigint,B.id from t A join t B on A.id < B.id * 16 where A.tp_bigint = B.id;").Check( + testkit.Rows("1 1")) +} + +func (s *testSuite) TestZeroDateTimeCompatibility(c *C) { + SQLs := []string{ + `select YEAR(0000-00-00), YEAR("0000-00-00")`, + `select MONTH(0000-00-00), MONTH("0000-00-00")`, + `select DAYOFWEEK(0000-00-00), DAYOFWEEK("0000-00-00")`, + `select DAYOFMONTH(0000-00-00), DAYOFMONTH("0000-00-00")`, + `select DAYOFYEAR(0000-00-00), DAYOFYEAR("0000-00-00")`, + `select QUARTER(0000-00-00), QUARTER("0000-00-00")`, + `select EXTRACT(DAY FROM 0000-00-00), EXTRACT(DAY FROM "0000-00-00")`, + `select EXTRACT(MONTH FROM 0000-00-00), EXTRACT(MONTH FROM "0000-00-00")`, + `select EXTRACT(YEAR FROM 0000-00-00), EXTRACT(YEAR FROM "0000-00-00")`, + `select EXTRACT(WEEK FROM 0000-00-00), EXTRACT(WEEK FROM "0000-00-00")`, + `select EXTRACT(QUARTER FROM 0000-00-00), EXTRACT(QUARTER FROM "0000-00-00")`, + } + tk := testkit.NewTestKit(c, s.store) + + for _, t := range SQLs { + fmt.Println(t) + tk.MustQuery(t).Check(testkit.Rows("0 ")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) + } +} + +func (s *testSuite) TestOOMActionPriority(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t0") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t3") + tk.MustExec("drop table if exists t4") + tk.MustExec("create table t0(a int)") + tk.MustExec("insert into t0 values(1)") + tk.MustExec("create table t1(a int)") + tk.MustExec("insert into t1 values(1)") + tk.MustExec("create table t2(a int)") + tk.MustExec("insert into t2 values(1)") + tk.MustExec("create table t3(a int)") + tk.MustExec("insert into t3 values(1)") + tk.MustExec("create table t4(a int)") + tk.MustExec("insert into t4 values(1)") + tk.MustQuery("select * from t0 join t1 join t2 join t3 join t4 order by t0.a").Check(testkit.Rows("1 1 1 1 1")) + action := tk.Se.GetSessionVars().StmtCtx.MemTracker.GetFallbackForTest() + // check the first 5 actions is rate limit. + for i := 0; i < 5; i++ { + c.Assert(action.GetPriority(), Equals, int64(memory.DefRateLimitPriority)) + action = action.GetFallback() + } + for action.GetFallback() != nil { + c.Assert(action.GetPriority(), Equals, int64(memory.DefSpillPriority)) + action = action.GetFallback() + } + c.Assert(action.GetPriority(), Equals, int64(memory.DefLogPriority)) +} + +func (s *testSuite) Test17780(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t0") + tk.MustExec("create table t0 (c0 double)") + tk.MustExec("insert into t0 values (1e30)") + tk.MustExec("update t0 set c0=0 where t0.c0 like 0") + // the update should not affect c0 + tk.MustQuery("select count(*) from t0 where c0 = 0").Check(testkit.Rows("0")) +} + +func (s *testSuite) TestIssue9918(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a year)") + tk.MustExec("insert into t values(0)") + tk.MustQuery("select cast(a as char) from t").Check(testkit.Rows("0000")) +} + +func (s *testSuite) Test13004(c *C) { + tk := testkit.NewTestKit(c, s.store) + // see https://dev.mysql.com/doc/refman/5.6/en/date-and-time-literals.html, timestamp here actually produces a datetime + tk.MustQuery("SELECT TIMESTAMP '9999-01-01 00:00:00'").Check(testkit.Rows("9999-01-01 00:00:00")) +} + +func (s *testSuite) Test12178(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists ta") + tk.MustExec("create table ta(id decimal(60,2))") + tk.MustExec("insert into ta values (JSON_EXTRACT('{\"c\": \"1234567890123456789012345678901234567890123456789012345\"}', '$.c'))") + tk.MustQuery("select * from ta").Check(testkit.Rows("1234567890123456789012345678901234567890123456789012345.00")) +} + +func (s *testSuite) Test11883(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (f1 json)") + tk.MustExec("insert into t1(f1) values ('\"asd\"'),('\"asdf\"'),('\"asasas\"')") + tk.MustQuery("select f1 from t1 where json_extract(f1,\"$\") in (\"asd\",\"asasas\",\"asdf\")").Check(testkit.Rows("\"asd\"", "\"asdf\"", "\"asasas\"")) + tk.MustQuery("select f1 from t1 where json_extract(f1, '$') = 'asd'").Check(testkit.Rows("\"asd\"")) + // MySQL produces empty row for the following SQL, I doubt it should be MySQL's bug. + tk.MustQuery("select f1 from t1 where case json_extract(f1,\"$\") when \"asd\" then 1 else 0 end").Check(testkit.Rows("\"asd\"")) + tk.MustExec("delete from t1") + tk.MustExec("insert into t1 values ('{\"a\": 1}')") + // the first value in the tuple should be interpreted as string instead of JSON, so no row will be returned + tk.MustQuery("select f1 from t1 where f1 in ('{\"a\": 1}', 'asdf', 'asdf')").Check(testkit.Rows()) + // and if we explicitly cast it into a JSON value, the check will pass + tk.MustQuery("select f1 from t1 where f1 in (cast('{\"a\": 1}' as JSON), 'asdf', 'asdf')").Check(testkit.Rows("{\"a\": 1}")) + tk.MustQuery("select json_extract('\"asd\"', '$') = 'asd'").Check(testkit.Rows("1")) + tk.MustQuery("select json_extract('\"asd\"', '$') <=> 'asd'").Check(testkit.Rows("1")) + tk.MustQuery("select json_extract('\"asd\"', '$') <> 'asd'").Check(testkit.Rows("0")) + tk.MustQuery("select json_extract('{\"f\": 1.0}', '$.f') = 1.0").Check(testkit.Rows("1")) + tk.MustQuery("select json_extract('{\"f\": 1.0}', '$.f') = '1.0'").Check(testkit.Rows("0")) + tk.MustQuery("select json_extract('{\"n\": 1}', '$') = '{\"n\": 1}'").Check(testkit.Rows("0")) + tk.MustQuery("select json_extract('{\"n\": 1}', '$') <> '{\"n\": 1}'").Check(testkit.Rows("1")) +} + +func (s *testSuite) Test15492(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values (2, 20), (1, 10), (3, 30)") + tk.MustQuery("select a + 1 as field1, a as field2 from t order by field1, field2 limit 2").Check(testkit.Rows("2 1", "3 2")) +} + +func (s testSuite) TestTrackAggMemoryUsage(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1)") + + tk.MustExec("set tidb_track_aggregate_memory_usage = off;") + rows := tk.MustQuery("explain analyze select /*+ HASH_AGG() */ sum(a) from t").Rows() + c.Assert(rows[0][7], Equals, "N/A") + rows = tk.MustQuery("explain analyze select /*+ STREAM_AGG() */ sum(a) from t").Rows() + c.Assert(rows[0][7], Equals, "N/A") + tk.MustExec("set tidb_track_aggregate_memory_usage = on;") + rows = tk.MustQuery("explain analyze select /*+ HASH_AGG() */ sum(a) from t").Rows() + c.Assert(rows[0][7], Not(Equals), "N/A") + rows = tk.MustQuery("explain analyze select /*+ STREAM_AGG() */ sum(a) from t").Rows() + c.Assert(rows[0][7], Not(Equals), "N/A") +} + +func (s *testSuite) Test12201(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists e") + tk.MustExec("create table e (e enum('a', 'b'))") + tk.MustExec("insert into e values ('a'), ('b')") + tk.MustQuery("select * from e where case 1 when 0 then e end").Check(testkit.Rows()) + tk.MustQuery("select * from e where case 1 when 1 then e end").Check(testkit.Rows("a", "b")) + tk.MustQuery("select * from e where case e when 1 then e end").Check(testkit.Rows("a")) + tk.MustQuery("select * from e where case 1 when e then e end").Check(testkit.Rows("a")) +} + +func (s *testSuite) TestIssue21451(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (en enum('c', 'b', 'a'));") + tk.MustExec("insert into t values ('a'), ('b'), ('c');") + tk.MustQuery("select max(en) from t;").Check(testkit.Rows("c")) + tk.MustQuery("select min(en) from t;").Check(testkit.Rows("a")) + tk.MustQuery("select * from t order by en;").Check(testkit.Rows("c", "b", "a")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(s set('c', 'b', 'a'));") + tk.MustExec("insert into t values ('a'), ('b'), ('c');") + tk.MustQuery("select max(s) from t;").Check(testkit.Rows("c")) + tk.MustQuery("select min(s) from t;").Check(testkit.Rows("a")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(id int, en enum('c', 'b', 'a'))") + tk.MustExec("insert into t values (1, 'a'),(2, 'b'), (3, 'c'), (1, 'c');") + tk.MustQuery("select id, max(en) from t where id=1 group by id;").Check(testkit.Rows("1 c")) + tk.MustQuery("select id, min(en) from t where id=1 group by id;").Check(testkit.Rows("1 a")) + tk.MustExec("drop table t") + + tk.MustExec("create table t(id int, s set('c', 'b', 'a'));") + tk.MustExec("insert into t values (1, 'a'),(2, 'b'), (3, 'c'), (1, 'c');") + tk.MustQuery("select id, max(s) from t where id=1 group by id;").Check(testkit.Rows("1 c")) + tk.MustQuery("select id, min(s) from t where id=1 group by id;").Check(testkit.Rows("1 a")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(e enum('e','d','c','b','a'))") + tk.MustExec("insert into t values ('e'),('d'),('c'),('b'),('a');") + tk.MustQuery("select * from t order by e limit 1;").Check(testkit.Rows("e")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(s set('e', 'd', 'c', 'b', 'a'))") + tk.MustExec("insert into t values ('e'),('d'),('c'),('b'),('a');") + tk.MustQuery("select * from t order by s limit 1;").Check(testkit.Rows("e")) + tk.MustExec("drop table t") +} + +func (s *testSuite) TestIssue15563(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery("select distinct 0.7544678906163867 / 0.68234634;").Check(testkit.Rows("1.10569639842486251190")) +} + +func (s *testSerialSuite) TestStalenessTransaction(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + c.Assert(err, IsNil) + }() + + testcases := []struct { + name string + preSQL string + sql string + IsStaleness bool + expectPhysicalTS int64 + preSec int64 + txnScope string + zone string + }{ + { + name: "TimestampBoundExactStaleness", + preSQL: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:20';`, + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`, + IsStaleness: true, + expectPhysicalTS: 1599321600000, + txnScope: "local", + zone: "sh", + }, + { + name: "TimestampBoundReadTimestamp", + preSQL: "begin", + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`, + IsStaleness: true, + expectPhysicalTS: 1599321600000, + txnScope: "local", + zone: "bj", + }, + { + name: "TimestampBoundExactStaleness", + preSQL: "begin", + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:20';`, + IsStaleness: true, + preSec: 20, + txnScope: "local", + zone: "sh", + }, + { + name: "TimestampBoundExactStaleness", + preSQL: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`, + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:20';`, + IsStaleness: true, + preSec: 20, + txnScope: "local", + zone: "sz", + }, + { + name: "begin", + preSQL: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`, + sql: "begin", + IsStaleness: false, + txnScope: oracle.GlobalTxnScope, + zone: "", + }, + } + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") for _, testcase := range testcases { c.Log(testcase.name) - // larger than one copResponse, smaller than 2 copResponse - quota := 199 - se, err := session.CreateSession4Test(s.store) - c.Check(err, IsNil) - tk.Se = se - tk.MustExec("use test") - tk.MustExec("set @@tidb_distsql_scan_concurrency = 30") - tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) - var expect []string - for i := 0; i < count; i++ { - expect = append(expect, fmt.Sprintf("%v", i)) + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", + fmt.Sprintf(`return("%v")`, testcase.zone)) + tk.MustExec(fmt.Sprintf("set @@txn_scope=%v", testcase.txnScope)) + tk.MustExec(testcase.preSQL) + tk.MustExec(testcase.sql) + if testcase.expectPhysicalTS > 0 { + c.Assert(oracle.ExtractPhysical(tk.Se.GetSessionVars().TxnCtx.StartTS), Equals, testcase.expectPhysicalTS) + } else if testcase.preSec > 0 { + curSec := time.Now().Unix() + startTS := oracle.ExtractPhysical(tk.Se.GetSessionVars().TxnCtx.StartTS) + c.Assert(startTS, Greater, (curSec-testcase.preSec-2)*1000) + c.Assert(startTS, Less, (curSec-testcase.preSec+2)*1000) + } else if !testcase.IsStaleness { + curSec := time.Now().Unix() + startTS := oracle.ExtractPhysical(tk.Se.GetSessionVars().TxnCtx.StartTS) + c.Assert(curSec*1000-startTS, Less, time.Second/time.Millisecond) + c.Assert(startTS-curSec*1000, Less, time.Second/time.Millisecond) } - tk.MustQuery(testcase.sql).Sort().Check(testkit.Rows(expect...)) - // assert oom action worked by max consumed > memory quota - c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.MaxConsumed(), Greater, int64(quota)) - se.Close() + c.Assert(tk.Se.GetSessionVars().TxnCtx.IsStaleness, Equals, testcase.IsStaleness) + tk.MustExec("commit") + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") } +} - // assert oom fallback +func (s *testSerialSuite) TestStaleReadKVRequest(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int primary key);") + defer tk.MustExec(`drop table if exists t`) + testcases := []struct { + name string + sql string + txnScope string + zone string + }{ + { + name: "coprocessor read", + sql: "select * from t", + txnScope: "local", + zone: "sh", + }, + { + name: "point get read", + sql: "select * from t where id = 1", + txnScope: "local", + zone: "bj", + }, + { + name: "batch point get read", + sql: "select * from t where id in (1,2,3)", + txnScope: "local", + zone: "hz", + }, + } for _, testcase := range testcases { c.Log(testcase.name) - se, err := session.CreateSession4Test(s.store) - c.Check(err, IsNil) - tk.Se = se - tk.MustExec("use test") - tk.MustExec("set tidb_distsql_scan_concurrency = 2") - tk.MustExec("set @@tidb_mem_quota_query=1;") - err = tk.QueryToErr(testcase.sql) - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") - se.Close() + tk.MustExec(fmt.Sprintf("set @@txn_scope=%v", testcase.txnScope)) + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", fmt.Sprintf(`return("%v")`, testcase.zone)) + failpoint.Enable("github.com/pingcap/tidb/store/tikv/assertStoreLabels", fmt.Sprintf(`return("%v")`, testcase.txnScope)) + failpoint.Enable("github.com/pingcap/tidb/store/tikv/assertStaleReadFlag", `return(true)`) + tk.MustExec(`START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:20';`) + tk.MustQuery(testcase.sql) + tk.MustExec(`commit`) + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + failpoint.Disable("github.com/pingcap/tidb/store/tikv/assertStoreLabels") + failpoint.Disable("github.com/pingcap/tidb/store/tikv/assertStaleReadFlag") } +} + +func (s *testSuite) TestStalenessAndHistoryRead(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + c.Assert(err, IsNil) + }() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. + safePointName := "tikv_gc_safe_point" + safePointValue := "20160102-15:04:05 -0700" + safePointComment := "All versions after safe point can be accessed. (DO NOT EDIT)" + updateSafePoint := fmt.Sprintf(`INSERT INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') + ON DUPLICATE KEY + UPDATE variable_value = '%[2]s', comment = '%[3]s'`, safePointName, safePointValue, safePointComment) + tk.MustExec(updateSafePoint) + // set @@tidb_snapshot before staleness txn + tk.MustExec(`set @@tidb_snapshot="2016-10-08 16:45:26";`) + tk.MustExec(`START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`) + c.Assert(oracle.ExtractPhysical(tk.Se.GetSessionVars().TxnCtx.StartTS), Equals, int64(1599321600000)) + tk.MustExec("commit") + // set @@tidb_snapshot during staleness txn + tk.MustExec(`START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`) + tk.MustExec(`set @@tidb_snapshot="2016-10-08 16:45:26";`) + c.Assert(oracle.ExtractPhysical(tk.Se.GetSessionVars().TxnCtx.StartTS), Equals, int64(1599321600000)) + tk.MustExec("commit") +} + +func (s *testSuite) TestIssue22231(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t_issue_22231") + tk.MustExec("create table t_issue_22231(a datetime)") + tk.MustExec("insert into t_issue_22231 values('2020--05-20 01:22:12')") + tk.MustQuery("select * from t_issue_22231 where a >= '2020-05-13 00:00:00 00:00:00' and a <= '2020-05-28 23:59:59 00:00:00'").Check(testkit.Rows("2020-05-20 01:22:12")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '2020-05-13 00:00:00 00:00:00'", "Warning 1292 Truncated incorrect datetime value: '2020-05-28 23:59:59 00:00:00'")) + + tk.MustQuery("select cast('2020-10-22 10:31-10:12' as datetime)").Check(testkit.Rows("2020-10-22 10:31:10")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '2020-10-22 10:31-10:12'")) + tk.MustQuery("select cast('2020-05-28 23:59:59 00:00:00' as datetime)").Check(testkit.Rows("2020-05-28 23:59:59")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect datetime value: '2020-05-28 23:59:59 00:00:00'")) + tk.MustExec("drop table if exists t_issue_22231") +} + +func (s *testSuite) TestIssue22201(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustQuery("SELECT HEX(WEIGHT_STRING('ab' AS BINARY(1000000000000000000)));").Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1301 Result of cast_as_binary() was larger than max_allowed_packet (67108864) - truncated")) + tk.MustQuery("SELECT HEX(WEIGHT_STRING('ab' AS char(1000000000000000000)));").Check(testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1301 Result of weight_string() was larger than max_allowed_packet (67108864) - truncated")) +} - // assert disable - failpoint.Enable("github.com/pingcap/tidb/store/tikv/testRateLimitActionDisable", `return(true)`) - defer failpoint.Disable("github.com/pingcap/tidb/store/tikv/testRateLimitActionDisable") +func (s *testSerialSuite) TestStalenessTransactionSchemaVer(c *C) { + testcases := []struct { + name string + sql string + expectErr error + }{ + { + name: "ddl change before stale txn", + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:03'`, + expectErr: errors.New("schema version changed after the staleness startTS"), + }, + { + name: "ddl change before stale txn", + sql: fmt.Sprintf("START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '%v'", + time.Now().Truncate(3*time.Second).Format("2006-01-02 15:04:05")), + expectErr: errors.New(".*schema version changed after the staleness startTS.*"), + }, + { + name: "ddl change before stale txn", + sql: `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND EXACT STALENESS '00:00:03'`, + expectErr: nil, + }, + } + tk := testkit.NewTestKitWithInit(c, s.store) for _, testcase := range testcases { - c.Log(testcase.name) - se, err := session.CreateSession4Test(s.store) - c.Check(err, IsNil) - tk.Se = se - tk.MustExec("use test") - tk.MustExec("set @@tidb_distsql_scan_concurrency = 30") - tk.MustExec("set @@tidb_mem_quota_query=1") - err = tk.QueryToErr(testcase.sql) - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") - se.Close() + check := func() { + if testcase.expectErr != nil { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(true)"), IsNil) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + c.Assert(err, IsNil) + }() + + } else { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + c.Assert(err, IsNil) + }() + + } + _, err := tk.Exec(testcase.sql) + if testcase.expectErr != nil { + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, testcase.expectErr.Error()) + } else { + c.Assert(err, IsNil) + } + } + check() } } -func (s *testSuite) TestIssue20237(c *C) { +func (s *testSuiteP1) TestIssue22941(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("drop table if exists t, s") - tk.MustExec("create table t(a date, b float)") - tk.MustExec("create table s(b float)") - tk.MustExec(`insert into t values(NULL,-37), ("2011-11-04",105), ("2013-03-02",-22), ("2006-07-02",-56), (NULL,124), (NULL,111), ("2018-03-03",-5);`) - tk.MustExec(`insert into s values(-37),(105),(-22),(-56),(124),(105),(111),(-5);`) - tk.MustQuery(`select count(distinct t.a, t.b) from t join s on t.b= s.b;`).Check(testkit.Rows("4")) + tk.MustExec("drop table if exists m, mp") + tk.MustExec(`CREATE TABLE m ( + mid varchar(50) NOT NULL, + ParentId varchar(50) DEFAULT NULL, + PRIMARY KEY (mid), + KEY ind_bm_parent (ParentId,mid) + )`) + + tk.MustExec(`CREATE TABLE mp ( + mpid bigint(20) unsigned NOT NULL DEFAULT '0', + mid varchar(50) DEFAULT NULL COMMENT '模块主键', + PRIMARY KEY (mpid) + );`) + + tk.MustExec(`insert into mp values("1","1");`) + tk.MustExec(`insert into m values("0", "0");`) + rs := tk.MustQuery(`SELECT ( SELECT COUNT(1) FROM m WHERE ParentId = c.mid ) expand, bmp.mpid, bmp.mpid IS NULL,bmp.mpid IS NOT NULL FROM m c LEFT JOIN mp bmp ON c.mid = bmp.mid WHERE c.ParentId = '0'`) + rs.Check(testkit.Rows("1 1 0")) + + rs = tk.MustQuery(`SELECT bmp.mpid, bmp.mpid IS NULL,bmp.mpid IS NOT NULL FROM m c LEFT JOIN mp bmp ON c.mid = bmp.mid WHERE c.ParentId = '0'`) + rs.Check(testkit.Rows(" 1 0")) } diff --git a/executor/explain.go b/executor/explain.go index ac4c30e699f34..a584028b686ee 100644 --- a/executor/explain.go +++ b/executor/explain.go @@ -72,44 +72,36 @@ func (e *ExplainExec) Next(ctx context.Context, req *chunk.Chunk) error { return nil } -func (e *ExplainExec) generateExplainInfo(ctx context.Context) (rows [][]string, err error) { - closed := false - defer func() { - if !closed && e.analyzeExec != nil { - err = e.analyzeExec.Close() - closed = true - } - }() +func (e *ExplainExec) executeAnalyzeExec(ctx context.Context) (err error) { if e.analyzeExec != nil && !e.executed { + defer func() { + err1 := e.analyzeExec.Close() + if err1 != nil { + if err != nil { + err = errors.New(err.Error() + ", " + err1.Error()) + } else { + err = err1 + } + } + }() e.executed = true chk := newFirstChunk(e.analyzeExec) - var nextErr, closeErr error for { - nextErr = Next(ctx, e.analyzeExec, chk) - if nextErr != nil || chk.NumRows() == 0 { + err = Next(ctx, e.analyzeExec, chk) + if err != nil || chk.NumRows() == 0 { break } } - closeErr = e.analyzeExec.Close() - closed = true - if nextErr != nil { - if closeErr != nil { - err = errors.New(nextErr.Error() + ", " + closeErr.Error()) - } else { - err = nextErr - } - } else if closeErr != nil { - err = closeErr - } - if err != nil { - return nil, err - } } - if err = e.explain.RenderResult(); err != nil { + return err +} + +func (e *ExplainExec) generateExplainInfo(ctx context.Context) (rows [][]string, err error) { + if err = e.executeAnalyzeExec(ctx); err != nil { return nil, err } - if e.analyzeExec != nil { - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl = nil + if err = e.explain.RenderResult(); err != nil { + return nil, err } return e.explain.Rows, nil } diff --git a/executor/explain_test.go b/executor/explain_test.go index b73d33e4870f8..8a0b062ef68cb 100644 --- a/executor/explain_test.go +++ b/executor/explain_test.go @@ -49,15 +49,15 @@ func (s *testSuite1) TestExplainPrivileges(c *C) { tk1.MustExec("use explaindatabase") tk1.MustQuery("select * from v") - err = tk1.ExecToErr("explain select * from v") + err = tk1.ExecToErr("explain format = 'brief' select * from v") c.Assert(err.Error(), Equals, plannercore.ErrViewNoExplain.Error()) tk.MustExec(`grant show view on explaindatabase.v to 'explain'@'%'`) - tk1.MustQuery("explain select * from v") + tk1.MustQuery("explain format = 'brief' select * from v") tk.MustExec(`revoke select on explaindatabase.v from 'explain'@'%'`) - err = tk1.ExecToErr("explain select * from v") + err = tk1.ExecToErr("explain format = 'brief' select * from v") c.Assert(err.Error(), Equals, plannercore.ErrTableaccessDenied.GenWithStackByArgs("SELECT", "explain", "%", "v").Error()) } @@ -70,10 +70,10 @@ func (s *testSuite1) TestExplainCartesianJoin(c *C) { sql string isCartesianJoin bool }{ - {"explain select * from t t1, t t2", true}, - {"explain select * from t t1 where exists (select 1 from t t2 where t2.v > t1.v)", true}, - {"explain select * from t t1 where exists (select 1 from t t2 where t2.v in (t1.v+1, t1.v+2))", true}, - {"explain select * from t t1, t t2 where t1.v = t2.v", false}, + {"explain format = 'brief' select * from t t1, t t2", true}, + {"explain format = 'brief' select * from t t1 where exists (select 1 from t t2 where t2.v > t1.v)", true}, + {"explain format = 'brief' select * from t t1 where exists (select 1 from t t2 where t2.v in (t1.v+1, t1.v+2))", true}, + {"explain format = 'brief' select * from t t1, t t2 where t1.v = t2.v", false}, } for _, ca := range cases { rows := tk.MustQuery(ca.sql).Rows() @@ -93,14 +93,15 @@ func (s *testSuite1) TestExplainWrite(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("drop table if exists t") tk.MustExec("create table t (a int)") - tk.MustExec("explain analyze insert into t select 1") + tk.MustQuery("explain analyze insert into t select 1") tk.MustQuery("select * from t").Check(testkit.Rows("1")) - tk.MustExec("explain analyze update t set a=2 where a=1") + tk.MustQuery("explain analyze update t set a=2 where a=1") tk.MustQuery("select * from t").Check(testkit.Rows("2")) - tk.MustExec("explain insert into t select 1") + tk.MustQuery("explain format = 'brief' insert into t select 1") tk.MustQuery("select * from t").Check(testkit.Rows("2")) - tk.MustExec("explain analyze insert into t select 1") - tk.MustQuery("select * from t order by a").Check(testkit.Rows("1", "2")) + tk.MustQuery("explain analyze insert into t select 1") + tk.MustQuery("explain analyze replace into t values (3)") + tk.MustQuery("select * from t order by a").Check(testkit.Rows("1", "2", "3")) } func (s *testSuite1) TestExplainAnalyzeMemory(c *C) { @@ -258,3 +259,70 @@ func (s *testSuite2) checkActRowsNotEmpty(c *C, tk *testkit.TestKit, sql string) c.Assert(strs[actRowsCol], Not(Equals), "") } } + +func checkActRows(c *C, tk *testkit.TestKit, sql string, expected []string) { + actRowsCol := 2 + rows := tk.MustQuery("explain analyze " + sql).Rows() + c.Assert(len(rows), Equals, len(expected)) + for id, row := range rows { + strs := make([]string, len(row)) + for i, c := range row { + strs[i] = c.(string) + } + + c.Assert(strs[actRowsCol], Equals, expected[id]) + } +} + +func (s *testSuite1) TestCheckActRowsWithUnistore(c *C) { + // testSuite1 use default mockstore which is unistore + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t_unistore_act_rows") + tk.MustExec("create table t_unistore_act_rows(a int, b int, index(a, b))") + tk.MustExec("insert into t_unistore_act_rows values (1, 0), (1, 0), (2, 0), (2, 1)") + tk.MustExec("analyze table t_unistore_act_rows") + + type testStruct struct { + sql string + expected []string + } + + tests := []testStruct{ + { + sql: "select * from t_unistore_act_rows", + expected: []string{"4", "4"}, + }, + { + sql: "select * from t_unistore_act_rows where a > 1", + expected: []string{"2", "2"}, + }, + { + sql: "select * from t_unistore_act_rows where a > 1 and b > 0", + expected: []string{"1", "1", "2"}, + }, + { + sql: "select b from t_unistore_act_rows", + expected: []string{"4", "4"}, + }, + { + sql: "select * from t_unistore_act_rows where b > 0", + expected: []string{"1", "1", "4"}, + }, + { + sql: "select count(*) from t_unistore_act_rows", + expected: []string{"1", "1", "1", "4"}, + }, + { + sql: "select count(*) from t_unistore_act_rows group by a", + expected: []string{"2", "2", "2", "4"}, + }, + { + sql: "select count(*) from t_unistore_act_rows group by b", + expected: []string{"2", "2", "2", "4"}, + }, + } + + for _, test := range tests { + checkActRows(c, tk, test.sql, test.expected) + } +} diff --git a/executor/explain_unit_test.go b/executor/explain_unit_test.go index fa9b13bc66e48..1276575f47c28 100644 --- a/executor/explain_unit_test.go +++ b/executor/explain_unit_test.go @@ -81,6 +81,10 @@ func TestExplainAnalyzeInvokeNextAndClose(t *testing.T) { t.Errorf(err.Error()) } // mockErrorOperator panic + explainExec = &ExplainExec{ + baseExecutor: baseExec, + explain: nil, + } mockOpr = mockErrorOperator{baseExec, true, false} explainExec.analyzeExec = &mockOpr defer func() { diff --git a/executor/explainfor_test.go b/executor/explainfor_test.go index 33d4bde97c74f..06478ee0184a4 100644 --- a/executor/explainfor_test.go +++ b/executor/explainfor_test.go @@ -19,6 +19,7 @@ import ( "fmt" "math" "strconv" + "strings" "sync" . "github.com/pingcap/check" @@ -56,15 +57,22 @@ func (msm *mockSessionManager1) GetProcessInfo(id uint64) (*util.ProcessInfo, bo // Kill implements the SessionManager.Kill interface. func (msm *mockSessionManager1) Kill(cid uint64, query bool) { +} +func (msm *mockSessionManager1) KillAllConnections() { } func (msm *mockSessionManager1) UpdateTLSConfig(cfg *tls.Config) { } +func (msm *mockSessionManager1) ServerID() uint64 { + return 1 +} + func (s *testSerialSuite) TestExplainFor(c *C) { tkRoot := testkit.NewTestKitWithInit(c, s.store) tkUser := testkit.NewTestKitWithInit(c, s.store) + tkRoot.MustExec("drop table if exists t1, t2;") tkRoot.MustExec("create table t1(c1 int, c2 int)") tkRoot.MustExec("create table t2(c1 int, c2 int)") tkRoot.MustExec("create user tu@'%'") @@ -82,29 +90,34 @@ func (s *testSerialSuite) TestExplainFor(c *C) { "└─TableFullScan_4 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", )) tkRoot.MustExec("set @@tidb_enable_collect_execution_info=1;") - tkRoot.MustQuery("select * from t1;") - tkRootProcess = tkRoot.Se.ShowProcess() - ps = []*util.ProcessInfo{tkRootProcess} - tkRoot.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - tkUser.Se.SetSessionManager(&mockSessionManager1{PS: ps}) - rows := tkRoot.MustQuery(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)).Rows() - c.Assert(len(rows), Equals, 2) - c.Assert(len(rows[0]), Equals, 9) - buf := bytes.NewBuffer(nil) - for i, row := range rows { - if i > 0 { - buf.WriteString("\n") - } - for j, v := range row { - if j > 0 { - buf.WriteString(" ") + check := func() { + tkRootProcess = tkRoot.Se.ShowProcess() + ps = []*util.ProcessInfo{tkRootProcess} + tkRoot.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + tkUser.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + rows := tkRoot.MustQuery(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)).Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(len(rows[0]), Equals, 9) + buf := bytes.NewBuffer(nil) + for i, row := range rows { + if i > 0 { + buf.WriteString("\n") + } + for j, v := range row { + if j > 0 { + buf.WriteString(" ") + } + buf.WriteString(fmt.Sprintf("%v", v)) } - buf.WriteString(fmt.Sprintf("%v", v)) } + c.Assert(buf.String(), Matches, ""+ + "TableReader_5 10000.00 0 root time:.*, loops:1, cop_task: {num:.*, max:.*, proc_keys: 0, rpc_num: 1, rpc_time:.*} data:TableFullScan_4 N/A N/A\n"+ + "└─TableFullScan_4 10000.00 0 cop.* table:t1 tikv_task:{time:.*, loops:0}, scan_detail:.* keep order:false, stats:pseudo N/A N/A") } - c.Assert(buf.String(), Matches, ""+ - "TableReader_5 10000.00 0 root time:.*, loops:1, cop_task:.*num: 1, max:.*, proc_keys: 0, rpc_num: 1, rpc_time: .* data:TableFullScan_4 N/A N/A\n"+ - "└─TableFullScan_4 10000.00 0 cop.* table:t1 time:.*, loops:0 keep order:false, stats:pseudo N/A N/A") + tkRoot.MustQuery("select * from t1;") + check() + tkRoot.MustQuery("explain analyze select * from t1;") + check() err := tkUser.ExecToErr(fmt.Sprintf("explain for connection %d", tkRootProcess.ID)) c.Check(core.ErrAccessDenied.Equal(err), IsTrue) err = tkUser.ExecToErr("explain for connection 42") @@ -303,9 +316,9 @@ func (s *testPrepareSerialSuite) TestExplainDotForExplainPlan(c *C) { rows := tk.MustQuery("select connection_id()").Rows() c.Assert(len(rows), Equals, 1) connID := rows[0][0].(string) - tk.MustQuery("explain select 1").Check(testkit.Rows( - "Projection_3 1.00 root 1->Column#1", - "└─TableDual_4 1.00 root rows:1", + tk.MustQuery("explain format = 'brief' select 1").Check(testkit.Rows( + "Projection 1.00 root 1->Column#1", + "└─TableDual 1.00 root rows:1", )) tkProcess := tk.Se.ShowProcess() @@ -419,3 +432,54 @@ func (s *testSuite) TestExplainTiFlashSystemTables(c *C) { tk.MustQuery(fmt.Sprintf("desc select * from information_schema.TIFLASH_SEGMENTS where TIFLASH_INSTANCE = '%s' and TIDB_DATABASE = '%s' and TIDB_TABLE = '%s'", tiflashInstance, database, table)).Check(testkit.Rows( fmt.Sprintf("MemTableScan_5 10000.00 root table:TIFLASH_SEGMENTS tiflash_instances:[\"%s\"], tidb_databases:[\"%s\"], tidb_tables:[\"%s\"]", tiflashInstance, database, table))) } + +func (s *testPrepareSerialSuite) TestPointGetUserVarPlanCache(c *C) { + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk := testkit.NewTestKitWithInit(c, s.store) + tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop table if exists t1") + tk.MustExec("CREATE TABLE t1 (a BIGINT, b VARCHAR(40), PRIMARY KEY (a, b))") + tk.MustExec("INSERT INTO t1 VALUES (1,'3'),(2,'4')") + tk.MustExec("drop table if exists t2") + tk.MustExec("CREATE TABLE t2 (a BIGINT, b VARCHAR(40), UNIQUE KEY idx_a (a))") + tk.MustExec("INSERT INTO t2 VALUES (1,'1'),(2,'2')") + tk.MustExec("prepare stmt from 'select * from t1, t2 where t1.a = t2.a and t2.a = ?'") + tk.MustExec("set @a=1") + tk.MustQuery("execute stmt using @a").Check(testkit.Rows( + "1 3 1 1", + )) + tkProcess := tk.Se.ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + // t2 should use PointGet. + rows := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + c.Assert(strings.Contains(fmt.Sprintf("%v", rows[3][0]), "Point_Get"), IsTrue) + c.Assert(strings.Contains(fmt.Sprintf("%v", rows[3][3]), "table:t2"), IsTrue) + + tk.MustExec("set @a=2") + tk.MustQuery("execute stmt using @a").Check(testkit.Rows( + "2 4 2 2", + )) + tkProcess = tk.Se.ShowProcess() + ps = []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + // t2 should use PointGet, range is changed to [2,2]. + rows = tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)).Rows() + c.Assert(strings.Contains(fmt.Sprintf("%v", rows[3][0]), "Point_Get"), IsTrue) + c.Assert(strings.Contains(fmt.Sprintf("%v", rows[3][3]), "table:t2"), IsTrue) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows( + "2 4 2 2", + )) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows( + "1", + )) +} diff --git a/executor/grant.go b/executor/grant.go index 097e2d5dcc349..06cb3811481fd 100644 --- a/executor/grant.go +++ b/executor/grant.go @@ -16,7 +16,6 @@ package executor import ( "context" "encoding/json" - "fmt" "strings" "github.com/pingcap/errors" @@ -96,7 +95,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { if err := e.ctx.NewTxn(ctx); err != nil { return err } - defer func() { e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, false) }() + defer func() { e.ctx.GetSessionVars().SetInTxn(false) }() // Create internal session to start internal transaction. isCommit := false @@ -106,7 +105,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { } defer func() { if !isCommit { - _, err := internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "rollback") + _, err := internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "rollback") if err != nil { logutil.BgLogger().Error("rollback error occur at grant privilege", zap.Error(err)) } @@ -114,7 +113,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { e.releaseSysSession(internalSession) }() - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "begin") + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "begin") if err != nil { return err } @@ -132,9 +131,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { if !ok { return errors.Trace(ErrPasswordFormat) } - user := fmt.Sprintf(`('%s', '%s', '%s')`, user.User.Hostname, user.User.Username, pwd) - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, authentication_string) VALUES %s;`, mysql.SystemDB, mysql.UserTable, user) - _, err := internalSession.(sqlexec.SQLExecutor).Execute(ctx, sql) + _, err := internalSession.(sqlexec.SQLExecutor).ExecuteInternal(ctx, `INSERT INTO %n.%n (Host, User, authentication_string) VALUES (%?, %?, %?);`, mysql.SystemDB, mysql.UserTable, user.User.Hostname, user.User.Username, pwd) if err != nil { return err } @@ -193,7 +190,7 @@ func (e *GrantExec) Next(ctx context.Context, req *chunk.Chunk) error { } } - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "commit") + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "commit") if err != nil { return err } @@ -274,29 +271,25 @@ func (e *GrantExec) checkAndInitColumnPriv(user string, host string, cols []*ast // initGlobalPrivEntry inserts a new row into mysql.DB with empty privilege. func initGlobalPrivEntry(ctx sessionctx.Context, user string, host string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, PRIV) VALUES ('%s', '%s', '%s')`, mysql.SystemDB, mysql.GlobalPrivTable, host, user, "{}") - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `INSERT INTO %n.%n (Host, User, PRIV) VALUES (%?, %?, %?)`, mysql.SystemDB, mysql.GlobalPrivTable, host, user, "{}") return err } // initDBPrivEntry inserts a new row into mysql.DB with empty privilege. func initDBPrivEntry(ctx sessionctx.Context, user string, host string, db string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB) VALUES ('%s', '%s', '%s')`, mysql.SystemDB, mysql.DBTable, host, user, db) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `INSERT INTO %n.%n (Host, User, DB) VALUES (%?, %?, %?)`, mysql.SystemDB, mysql.DBTable, host, user, db) return err } // initTablePrivEntry inserts a new row into mysql.Tables_priv with empty privilege. func initTablePrivEntry(ctx sessionctx.Context, user string, host string, db string, tbl string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB, Table_name, Table_priv, Column_priv) VALUES ('%s', '%s', '%s', '%s', '', '')`, mysql.SystemDB, mysql.TablePrivTable, host, user, db, tbl) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `INSERT INTO %n.%n (Host, User, DB, Table_name, Table_priv, Column_priv) VALUES (%?, %?, %?, %?, '', '')`, mysql.SystemDB, mysql.TablePrivTable, host, user, db, tbl) return err } // initColumnPrivEntry inserts a new row into mysql.Columns_priv with empty privilege. func initColumnPrivEntry(ctx sessionctx.Context, user string, host string, db string, tbl string, col string) error { - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, DB, Table_name, Column_name, Column_priv) VALUES ('%s', '%s', '%s', '%s', '%s', '')`, mysql.SystemDB, mysql.ColumnPrivTable, host, user, db, tbl, col) - _, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `INSERT INTO %n.%n (Host, User, DB, Table_name, Column_name, Column_priv) VALUES (%?, %?, %?, %?, %?, '')`, mysql.SystemDB, mysql.ColumnPrivTable, host, user, db, tbl, col) return err } @@ -309,8 +302,7 @@ func (e *GrantExec) grantGlobalPriv(ctx sessionctx.Context, user *ast.UserSpec) if err != nil { return errors.Trace(err) } - sql := fmt.Sprintf(`UPDATE %s.%s SET PRIV = '%s' WHERE User='%s' AND Host='%s'`, mysql.SystemDB, mysql.GlobalPrivTable, priv, user.User.Username, user.User.Hostname) - _, err = ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + _, err = ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `UPDATE %n.%n SET PRIV=%? WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.GlobalPrivTable, priv, user.User.Username, user.User.Hostname) return err } @@ -412,46 +404,64 @@ func (e *GrantExec) grantLevelPriv(priv *ast.PrivElem, user *ast.UserSpec, inter // grantGlobalLevel manipulates mysql.user table. func (e *GrantExec) grantGlobalLevel(priv *ast.PrivElem, user *ast.UserSpec, internalSession sessionctx.Context) error { - if priv.Priv == 0 { + if priv.Priv == 0 || priv.Priv == mysql.UsagePriv { return nil } - asgns, err := composeGlobalPrivUpdate(priv.Priv, "Y") + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, `UPDATE %n.%n SET `, mysql.SystemDB, mysql.UserTable) + err := composeGlobalPrivUpdate(sql, priv.Priv, "Y") if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s'`, mysql.SystemDB, mysql.UserTable, asgns, user.User.Username, user.User.Hostname) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, ` WHERE User=%? AND Host=%?`, user.User.Username, user.User.Hostname) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } // grantDBLevel manipulates mysql.db table. func (e *GrantExec) grantDBLevel(priv *ast.PrivElem, user *ast.UserSpec, internalSession sessionctx.Context) error { + if priv.Priv == mysql.UsagePriv { + return nil + } dbName := e.Level.DBName if len(dbName) == 0 { dbName = e.ctx.GetSessionVars().CurrentDB } - asgns, err := composeDBPrivUpdate(priv.Priv, "Y") + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.DBTable) + err := composeDBPrivUpdate(sql, priv.Priv, "Y") if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s';`, mysql.SystemDB, mysql.DBTable, asgns, user.User.Username, user.User.Hostname, dbName) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%?", user.User.Username, user.User.Hostname, dbName) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } // grantTableLevel manipulates mysql.tables_priv table. func (e *GrantExec) grantTableLevel(priv *ast.PrivElem, user *ast.UserSpec, internalSession sessionctx.Context) error { + if priv.Priv == mysql.UsagePriv { + return nil + } dbName := e.Level.DBName if len(dbName) == 0 { dbName = e.ctx.GetSessionVars().CurrentDB } tblName := e.Level.TableName - asgns, err := composeTablePrivUpdateForGrant(internalSession, priv.Priv, user.User.Username, user.User.Hostname, dbName, tblName) + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.TablePrivTable) + err := composeTablePrivUpdateForGrant(internalSession, sql, priv.Priv, user.User.Username, user.User.Hostname, dbName, tblName) if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s';`, mysql.SystemDB, mysql.TablePrivTable, asgns, user.User.Username, user.User.Hostname, dbName, tblName) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%?", user.User.Username, user.User.Hostname, dbName, tblName) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } @@ -467,12 +477,16 @@ func (e *GrantExec) grantColumnLevel(priv *ast.PrivElem, user *ast.UserSpec, int if col == nil { return errors.Errorf("Unknown column: %s", c) } - asgns, err := composeColumnPrivUpdateForGrant(internalSession, priv.Priv, user.User.Username, user.User.Hostname, dbName, tbl.Meta().Name.O, col.Name.O) + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.ColumnPrivTable) + err := composeColumnPrivUpdateForGrant(internalSession, sql, priv.Priv, user.User.Username, user.User.Hostname, dbName, tbl.Meta().Name.O, col.Name.O) if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s' AND Column_name='%s';`, mysql.SystemDB, mysql.ColumnPrivTable, asgns, user.User.Username, user.User.Hostname, dbName, tbl.Meta().Name.O, col.Name.O) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%? AND Column_name=%?", user.User.Username, user.User.Hostname, dbName, tbl.Meta().Name.O, col.Name.O) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) if err != nil { return err } @@ -481,178 +495,143 @@ func (e *GrantExec) grantColumnLevel(priv *ast.PrivElem, user *ast.UserSpec, int } // composeGlobalPrivUpdate composes update stmt assignment list string for global scope privilege update. -func composeGlobalPrivUpdate(priv mysql.PrivilegeType, value string) (string, error) { - if priv == mysql.AllPriv { - strs := make([]string, 0, len(mysql.Priv2UserCol)) - for _, v := range mysql.AllGlobalPrivs { - strs = append(strs, fmt.Sprintf(`%s='%s'`, mysql.Priv2UserCol[v], value)) +func composeGlobalPrivUpdate(sql *strings.Builder, priv mysql.PrivilegeType, value string) error { + if priv != mysql.AllPriv { + col, ok := mysql.Priv2UserCol[priv] + if !ok { + return errors.Errorf("Unknown priv: %v", priv) } - return strings.Join(strs, ", "), nil + sqlexec.MustFormatSQL(sql, "%n=%?", col, value) + return nil } - col, ok := mysql.Priv2UserCol[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + + for i, v := range mysql.AllGlobalPrivs { + if i > 0 { + sqlexec.MustFormatSQL(sql, ",") + } + + k, ok := mysql.Priv2UserCol[v] + if !ok { + return errors.Errorf("Unknown priv %v", priv) + } + + sqlexec.MustFormatSQL(sql, "%n=%?", k, value) } - return fmt.Sprintf(`%s='%s'`, col, value), nil + return nil } // composeDBPrivUpdate composes update stmt assignment list for db scope privilege update. -func composeDBPrivUpdate(priv mysql.PrivilegeType, value string) (string, error) { - if priv == mysql.AllPriv { - strs := make([]string, 0, len(mysql.AllDBPrivs)) - for _, p := range mysql.AllDBPrivs { - v, ok := mysql.Priv2UserCol[p] - if !ok { - return "", errors.Errorf("Unknown db privilege %v", priv) - } - strs = append(strs, fmt.Sprintf(`%s='%s'`, v, value)) +func composeDBPrivUpdate(sql *strings.Builder, priv mysql.PrivilegeType, value string) error { + if priv != mysql.AllPriv { + col, ok := mysql.Priv2UserCol[priv] + if !ok { + return errors.Errorf("Unknown priv: %v", priv) } - return strings.Join(strs, ", "), nil - } - col, ok := mysql.Priv2UserCol[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + sqlexec.MustFormatSQL(sql, "%n=%?", col, value) + return nil } - return fmt.Sprintf(`%s='%s'`, col, value), nil -} -// composeTablePrivUpdateForGrant composes update stmt assignment list for table scope privilege update. -func composeTablePrivUpdateForGrant(ctx sessionctx.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string) (string, error) { - var newTablePriv, newColumnPriv string - if priv == mysql.AllPriv { - for _, p := range mysql.AllTablePrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown table privilege %v", p) - } - newTablePriv = addToSet(newTablePriv, v) - } - for _, p := range mysql.AllColumnPrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown column privilege %v", p) - } - newColumnPriv = addToSet(newColumnPriv, v) + for i, p := range mysql.AllDBPrivs { + if i > 0 { + sqlexec.MustFormatSQL(sql, ",") } - } else { - currTablePriv, currColumnPriv, err := getTablePriv(ctx, name, host, db, tbl) - if err != nil { - return "", err - } - p, ok := mysql.Priv2SetStr[priv] + + v, ok := mysql.Priv2UserCol[p] if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + return errors.Errorf("Unknown priv %v", priv) } - newTablePriv = addToSet(currTablePriv, p) - for _, cp := range mysql.AllColumnPrivs { - if priv == cp { - newColumnPriv = addToSet(currColumnPriv, p) - break - } - } + sqlexec.MustFormatSQL(sql, "%n=%?", v, value) } - return fmt.Sprintf(`Table_priv='%s', Column_priv='%s', Grantor='%s'`, newTablePriv, newColumnPriv, ctx.GetSessionVars().User), nil + return nil } -func composeTablePrivUpdateForRevoke(ctx sessionctx.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string) (string, error) { - var newTablePriv, newColumnPriv string - if priv == mysql.AllPriv { - newTablePriv = "" - newColumnPriv = "" - } else { +func privUpdateForGrant(cur []string, priv mysql.PrivilegeType) ([]string, error) { + p, ok := mysql.Priv2SetStr[priv] + if !ok { + return nil, errors.Errorf("Unknown priv: %v", priv) + } + cur = addToSet(cur, p) + return cur, nil +} + +// composeTablePrivUpdateForGrant composes update stmt assignment list for table scope privilege update. +func composeTablePrivUpdateForGrant(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string) error { + var newTablePriv, newColumnPriv []string + var tblPrivs, colPrivs []mysql.PrivilegeType + if priv != mysql.AllPriv { currTablePriv, currColumnPriv, err := getTablePriv(ctx, name, host, db, tbl) if err != nil { - return "", err - } - p, ok := mysql.Priv2SetStr[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + return err } - newTablePriv = deleteFromSet(currTablePriv, p) - + newTablePriv = setFromString(currTablePriv) + newColumnPriv = setFromString(currColumnPriv) + tblPrivs = []mysql.PrivilegeType{priv} for _, cp := range mysql.AllColumnPrivs { - if priv == cp { - newColumnPriv = deleteFromSet(currColumnPriv, p) + // in case it is not a column priv + if cp == priv { + colPrivs = []mysql.PrivilegeType{priv} break } } + } else { + tblPrivs = mysql.AllTablePrivs + colPrivs = mysql.AllColumnPrivs } - return fmt.Sprintf(`Table_priv='%s', Column_priv='%s', Grantor='%s'`, newTablePriv, newColumnPriv, ctx.GetSessionVars().User), nil -} -// addToSet add a value to the set, e.g: -// addToSet("Select,Insert", "Update") returns "Select,Insert,Update". -func addToSet(set string, value string) string { - if set == "" { - return value + var err error + for _, p := range tblPrivs { + newTablePriv, err = privUpdateForGrant(newTablePriv, p) + if err != nil { + return err + } } - return fmt.Sprintf("%s,%s", set, value) -} -// deleteFromSet delete the value from the set, e.g: -// deleteFromSet("Select,Insert,Update", "Update") returns "Select,Insert". -func deleteFromSet(set string, value string) string { - sets := strings.Split(set, ",") - res := make([]string, 0, len(sets)) - for _, v := range sets { - if v != value { - res = append(res, v) + for _, p := range colPrivs { + newColumnPriv, err = privUpdateForGrant(newColumnPriv, p) + if err != nil { + return err } } - return strings.Join(res, ",") + + sqlexec.MustFormatSQL(sql, `Table_priv=%?, Column_priv=%?, Grantor=%?`, strings.Join(newTablePriv, ","), strings.Join(newColumnPriv, ","), ctx.GetSessionVars().User.String()) + return nil } // composeColumnPrivUpdateForGrant composes update stmt assignment list for column scope privilege update. -func composeColumnPrivUpdateForGrant(ctx sessionctx.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) (string, error) { - newColumnPriv := "" - if priv == mysql.AllPriv { - for _, p := range mysql.AllColumnPrivs { - v, ok := mysql.Priv2SetStr[p] - if !ok { - return "", errors.Errorf("Unknown column privilege %v", p) - } - newColumnPriv = addToSet(newColumnPriv, v) - } - } else { +func composeColumnPrivUpdateForGrant(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) error { + var newColumnPriv []string + var colPrivs []mysql.PrivilegeType + if priv != mysql.AllPriv { currColumnPriv, err := getColumnPriv(ctx, name, host, db, tbl, col) if err != nil { - return "", err - } - p, ok := mysql.Priv2SetStr[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + return err } - newColumnPriv = addToSet(currColumnPriv, p) + newColumnPriv = setFromString(currColumnPriv) + colPrivs = []mysql.PrivilegeType{priv} + } else { + colPrivs = mysql.AllColumnPrivs } - return fmt.Sprintf(`Column_priv='%s'`, newColumnPriv), nil -} -func composeColumnPrivUpdateForRevoke(ctx sessionctx.Context, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) (string, error) { - newColumnPriv := "" - if priv == mysql.AllPriv { - newColumnPriv = "" - } else { - currColumnPriv, err := getColumnPriv(ctx, name, host, db, tbl, col) + var err error + for _, p := range colPrivs { + newColumnPriv, err = privUpdateForGrant(newColumnPriv, p) if err != nil { - return "", err - } - p, ok := mysql.Priv2SetStr[priv] - if !ok { - return "", errors.Errorf("Unknown priv: %v", priv) + return err } - newColumnPriv = deleteFromSet(currColumnPriv, p) } - return fmt.Sprintf(`Column_priv='%s'`, newColumnPriv), nil + + sqlexec.MustFormatSQL(sql, `Column_priv=%?`, strings.Join(newColumnPriv, ",")) + return nil } // recordExists is a helper function to check if the sql returns any row. -func recordExists(ctx sessionctx.Context, sql string) (bool, error) { - recordSets, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) +func recordExists(ctx sessionctx.Context, sql string, args ...interface{}) (bool, error) { + rs, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql, args...) if err != nil { return false, err } - rows, _, err := getRowsAndFields(ctx, recordSets) + rows, _, err := getRowsAndFields(ctx, rs) if err != nil { return false, err } @@ -661,43 +640,35 @@ func recordExists(ctx sessionctx.Context, sql string) (bool, error) { // globalPrivEntryExists checks if there is an entry with key user-host in mysql.global_priv. func globalPrivEntryExists(ctx sessionctx.Context, name string, host string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s';`, mysql.SystemDB, mysql.GlobalPrivTable, name, host) - return recordExists(ctx, sql) + return recordExists(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.GlobalPrivTable, name, host) } // dbUserExists checks if there is an entry with key user-host-db in mysql.DB. func dbUserExists(ctx sessionctx.Context, name string, host string, db string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s' AND DB='%s';`, mysql.SystemDB, mysql.DBTable, name, host, db) - return recordExists(ctx, sql) + return recordExists(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%? AND DB=%?;`, mysql.SystemDB, mysql.DBTable, name, host, db) } // tableUserExists checks if there is an entry with key user-host-db-tbl in mysql.Tables_priv. func tableUserExists(ctx sessionctx.Context, name string, host string, db string, tbl string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s';`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) - return recordExists(ctx, sql) + return recordExists(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%?;`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) } // columnPrivEntryExists checks if there is an entry with key user-host-db-tbl-col in mysql.Columns_priv. func columnPrivEntryExists(ctx sessionctx.Context, name string, host string, db string, tbl string, col string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s' AND Column_name='%s';`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) - return recordExists(ctx, sql) + return recordExists(ctx, `SELECT * FROM %n.%n WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%? AND Column_name=%?;`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) } // getTablePriv gets current table scope privilege set from mysql.Tables_priv. // Return Table_priv and Column_priv. func getTablePriv(ctx sessionctx.Context, name string, host string, db string, tbl string) (string, string, error) { - sql := fmt.Sprintf(`SELECT Table_priv, Column_priv FROM %s.%s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s';`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) - rs, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + rs, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `SELECT Table_priv, Column_priv FROM %n.%n WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%?`, mysql.SystemDB, mysql.TablePrivTable, name, host, db, tbl) if err != nil { return "", "", err } - if len(rs) < 1 { - return "", "", errors.Errorf("get table privilege fail for %s %s %s %s", name, host, db, tbl) - } var tPriv, cPriv string rows, fields, err := getRowsAndFields(ctx, rs) if err != nil { - return "", "", err + return "", "", errors.Errorf("get table privilege fail for %s %s %s %s: %v", name, host, db, tbl, err) } if len(rows) < 1 { return "", "", errors.Errorf("get table privilege fail for %s %s %s %s", name, host, db, tbl) @@ -717,17 +688,13 @@ func getTablePriv(ctx sessionctx.Context, name string, host string, db string, t // getColumnPriv gets current column scope privilege set from mysql.Columns_priv. // Return Column_priv. func getColumnPriv(ctx sessionctx.Context, name string, host string, db string, tbl string, col string) (string, error) { - sql := fmt.Sprintf(`SELECT Column_priv FROM %s.%s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s' AND Column_name='%s';`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) - rs, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + rs, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), `SELECT Column_priv FROM %n.%n WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%? AND Column_name=%?;`, mysql.SystemDB, mysql.ColumnPrivTable, name, host, db, tbl, col) if err != nil { return "", err } - if len(rs) < 1 { - return "", errors.Errorf("get column privilege fail for %s %s %s %s", name, host, db, tbl) - } rows, fields, err := getRowsAndFields(ctx, rs) if err != nil { - return "", err + return "", errors.Errorf("get column privilege fail for %s %s %s %s: %s", name, host, db, tbl, err) } if len(rows) < 1 { return "", errors.Errorf("get column privilege fail for %s %s %s %s %s", name, host, db, tbl, col) @@ -757,27 +724,18 @@ func getTargetSchemaAndTable(ctx sessionctx.Context, dbName, tableName string, i } // getRowsAndFields is used to extract rows from record sets. -func getRowsAndFields(ctx sessionctx.Context, recordSets []sqlexec.RecordSet) ([]chunk.Row, []*ast.ResultField, error) { - var ( - rows []chunk.Row - fields []*ast.ResultField - ) - - for i, rs := range recordSets { - tmp, err := getRowFromRecordSet(context.Background(), ctx, rs) - if err != nil { - return nil, nil, err - } - if err = rs.Close(); err != nil { - return nil, nil, err - } - - if i == 0 { - rows = tmp - fields = rs.Fields() - } +func getRowsAndFields(ctx sessionctx.Context, rs sqlexec.RecordSet) ([]chunk.Row, []*ast.ResultField, error) { + if rs == nil { + return nil, nil, errors.Errorf("nil recordset") + } + rows, err := getRowFromRecordSet(context.Background(), ctx, rs) + if err != nil { + return nil, nil, err + } + if err = rs.Close(); err != nil { + return nil, nil, err } - return rows, fields, nil + return rows, rs.Fields(), nil } func getRowFromRecordSet(ctx context.Context, se sessionctx.Context, rs sqlexec.RecordSet) ([]chunk.Row, error) { diff --git a/executor/grant_test.go b/executor/grant_test.go index a292aa7df8863..e264bb56fa006 100644 --- a/executor/grant_test.go +++ b/executor/grant_test.go @@ -54,7 +54,7 @@ func (s *testSuiteP1) TestGrantGlobal(c *C) { sql := fmt.Sprintf("SELECT %s FROM mysql.User WHERE User=\"testGlobal1\" and host=\"localhost\"", mysql.Priv2UserCol[v]) tk.MustQuery(sql).Check(testkit.Rows("Y")) } - //with grant option + // with grant option tk.MustExec("GRANT ALL ON *.* TO 'testGlobal1'@'localhost' WITH GRANT OPTION;") for _, v := range mysql.AllGlobalPrivs { sql := fmt.Sprintf("SELECT %s FROM mysql.User WHERE User=\"testGlobal1\" and host=\"localhost\"", mysql.Priv2UserCol[v]) @@ -384,3 +384,14 @@ func (s *testSuite3) TestGrantOnNonExistTable(c *C) { _, err = tk.Exec("grant Select,Update on test.xx to 'genius'") c.Assert(err, IsNil) } + +func (s *testSuite3) TestIssue22721(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table if not exists xx (id int)") + tk.MustExec("CREATE USER 'sync_ci_data'@'%' IDENTIFIED BY 'sNGNQo12fEHe0n3vU';") + tk.MustExec("GRANT USAGE ON *.* TO 'sync_ci_data'@'%';") + tk.MustExec("GRANT USAGE ON sync_ci_data.* TO 'sync_ci_data'@'%';") + tk.MustExec("GRANT USAGE ON test.* TO 'sync_ci_data'@'%';") + tk.MustExec("GRANT USAGE ON test.xx TO 'sync_ci_data'@'%';") +} diff --git a/executor/hash_table.go b/executor/hash_table.go index 1df5828abb146..cd356d0549a5f 100644 --- a/executor/hash_table.go +++ b/executor/hash_table.go @@ -27,27 +27,10 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/disk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/memory" ) -const ( - // estCountMaxFactor defines the factor of estCountMax with maxChunkSize. - // estCountMax is maxChunkSize * estCountMaxFactor, the maximum threshold of estCount. - // if estCount is larger than estCountMax, set estCount to estCountMax. - // Set this threshold to prevent buildSideEstCount being too large and causing a performance and memory regression. - estCountMaxFactor = 10 * 1024 - - // estCountMinFactor defines the factor of estCountMin with maxChunkSize. - // estCountMin is maxChunkSize * estCountMinFactor, the minimum threshold of estCount. - // If estCount is smaller than estCountMin, set estCount to 0. - // Set this threshold to prevent buildSideEstCount being too small and causing a performance regression. - estCountMinFactor = 8 - - // estCountDivisor defines the divisor of buildSideEstCount. - // Set this divisor to prevent buildSideEstCount being too large and causing a performance regression. - estCountDivisor = 8 -) - // hashContext keeps the needed hash context of a db table in hash join. type hashContext struct { allTypes []*types.FieldType @@ -82,7 +65,7 @@ type hashStatistic struct { } func (s *hashStatistic) String() string { - return fmt.Sprintf("probe_collision:%v, build:%v", s.probeCollision, s.buildTableElapse) + return fmt.Sprintf("probe_collision:%v, build:%v", s.probeCollision, execdetails.FormatDuration(s.buildTableElapse)) } // hashRowContainer handles the rows and the hash map of a table. @@ -193,18 +176,6 @@ func (c *hashRowContainer) PutChunkSelected(chk *chunk.Chunk, selected, ignoreNu return nil } -// getJoinKeyFromChkRow fetches join keys from row and calculate the hash value. -func (*hashRowContainer) getJoinKeyFromChkRow(sc *stmtctx.StatementContext, row chunk.Row, hCtx *hashContext) (hasNull bool, key uint64, err error) { - for _, i := range hCtx.keyColIdx { - if row.IsNull(i) { - return true, 0, nil - } - } - hCtx.initHash(1) - err = codec.HashChunkRow(sc, hCtx.hashVals[0], row, hCtx.allTypes, hCtx.keyColIdx, hCtx.buf) - return false, hCtx.hashVals[0].Sum64(), err -} - // NumChunks returns the number of chunks in the rowContainer func (c *hashRowContainer) NumChunks() int { return c.rowContainer.NumChunks() diff --git a/executor/index_lookup_hash_join.go b/executor/index_lookup_hash_join.go index c3a00996e4632..62fa460c39111 100644 --- a/executor/index_lookup_hash_join.go +++ b/executor/index_lookup_hash_join.go @@ -200,8 +200,12 @@ func (e *IndexNestedLoopHashJoin) startWorkers(ctx context.Context) { func (e *IndexNestedLoopHashJoin) finishJoinWorkers(r interface{}) { if r != nil { - e.resultCh <- &indexHashJoinResult{ - err: errors.New(fmt.Sprintf("%v", r)), + err := errors.New(fmt.Sprintf("%v", r)) + if !e.keepOuterOrder { + e.resultCh <- &indexHashJoinResult{err: err} + } else { + task := &indexHashJoinTask{err: err} + e.taskCh <- task } if e.cancelFunc != nil { e.cancelFunc() @@ -256,6 +260,9 @@ func (e *IndexNestedLoopHashJoin) runInOrder(ctx context.Context, req *chunk.Chu if e.isDryUpTasks(ctx) { return nil } + if e.curTask.err != nil { + return e.curTask.err + } select { case result, ok = <-e.curTask.resultCh: if !ok { @@ -338,6 +345,9 @@ func (ow *indexHashJoinOuterWorker) run(ctx context.Context) { return } if ow.keepOuterOrder { + failpoint.Inject("testIssue20779", func() { + panic("testIssue20779") + }) if finished := ow.pushToChan(ctx, task, ow.taskCh); finished { return } @@ -536,14 +546,14 @@ func (iw *indexHashJoinInnerWorker) buildHashTableForOuterResult(ctx context.Con continue } row := chk.GetRow(rowIdx) - keyColIdx := iw.outerCtx.keyCols - for _, i := range keyColIdx { + hashColIdx := iw.outerCtx.hashCols + for _, i := range hashColIdx { if row.IsNull(i) { continue OUTER } } h.Reset() - err := codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, row, iw.outerCtx.rowTypes, keyColIdx, buf) + err := codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, row, iw.outerCtx.rowTypes, hashColIdx, buf) failpoint.Inject("testIndexHashJoinBuildErr", func() { err = errors.New("mockIndexHashJoinBuildErr") }) @@ -634,7 +644,7 @@ func (iw *indexHashJoinInnerWorker) doJoinUnordered(ctx context.Context, task *i func (iw *indexHashJoinInnerWorker) getMatchedOuterRows(innerRow chunk.Row, task *indexHashJoinTask, h hash.Hash64, buf []byte) (matchedRows []chunk.Row, matchedRowPtr []chunk.RowPtr, err error) { h.Reset() - err = codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, innerRow, iw.rowTypes, iw.keyCols, buf) + err = codec.HashChunkRow(iw.ctx.GetSessionVars().StmtCtx, h, innerRow, iw.rowTypes, iw.hashCols, buf) if err != nil { return nil, nil, err } @@ -648,7 +658,7 @@ func (iw *indexHashJoinInnerWorker) getMatchedOuterRows(innerRow chunk.Row, task matchedRowPtr = make([]chunk.RowPtr, 0, len(iw.matchedOuterPtrs)) for _, ptr := range iw.matchedOuterPtrs { outerRow := task.outerResult.GetRow(ptr) - ok, err := codec.EqualChunkRow(iw.ctx.GetSessionVars().StmtCtx, innerRow, iw.rowTypes, iw.keyCols, outerRow, iw.outerCtx.rowTypes, iw.outerCtx.keyCols) + ok, err := codec.EqualChunkRow(iw.ctx.GetSessionVars().StmtCtx, innerRow, iw.rowTypes, iw.keyCols, outerRow, iw.outerCtx.rowTypes, iw.outerCtx.hashCols) if err != nil { return nil, nil, err } diff --git a/executor/index_lookup_join.go b/executor/index_lookup_join.go index be972aade587c..045f7ea142a49 100644 --- a/executor/index_lookup_join.go +++ b/executor/index_lookup_join.go @@ -87,6 +87,7 @@ type IndexLookUpJoin struct { type outerCtx struct { rowTypes []*types.FieldType keyCols []int + hashCols []int filter expression.CNFExprs } @@ -94,6 +95,7 @@ type innerCtx struct { readerBuilder *dataReaderBuilder rowTypes []*types.FieldType keyCols []int + hashCols []int colLens []int hasPrefixCol bool } @@ -148,29 +150,7 @@ type innerWorker struct { // Open implements the Executor interface. func (e *IndexLookUpJoin) Open(ctx context.Context) error { - // Be careful, very dirty hack in this line!!! - // IndexLookUpJoin need to rebuild executor (the dataReaderBuilder) during - // executing. However `executor.Next()` is lazy evaluation when the RecordSet - // result is drained. - // Lazy evaluation means the saved session context may change during executor's - // building and its running. - // A specific sequence for example: - // - // e := buildExecutor() // txn at build time - // recordSet := runStmt(e) - // session.CommitTxn() // txn closed - // recordSet.Next() - // e.dataReaderBuilder.Build() // txn is used again, which is already closed - // - // The trick here is `getSnapshotTS` will cache snapshot ts in the dataReaderBuilder, - // so even txn is destroyed later, the dataReaderBuilder could still use the - // cached snapshot ts to construct DAG. - _, err := e.innerCtx.readerBuilder.getSnapshotTS() - if err != nil { - return err - } - - err = e.children[0].Open(ctx) + err := e.children[0].Open(ctx) if err != nil { return err } @@ -533,17 +513,17 @@ func (iw *innerWorker) constructLookupContent(task *lookUpJoinTask) ([]*indexJoi chk := task.outerResult.GetChunk(chkIdx) numRows := chk.NumRows() for rowIdx := 0; rowIdx < numRows; rowIdx++ { - dLookUpKey, err := iw.constructDatumLookupKey(task, chkIdx, rowIdx) + dLookUpKey, dHashKey, err := iw.constructDatumLookupKey(task, chkIdx, rowIdx) if err != nil { return nil, err } - if dLookUpKey == nil { + if dHashKey == nil { // Append null to make looUpKeys the same length as outer Result. task.encodedLookUpKeys[chkIdx].AppendNull(0) continue } keyBuf = keyBuf[:0] - keyBuf, err = codec.EncodeKey(iw.ctx.GetSessionVars().StmtCtx, keyBuf, dLookUpKey...) + keyBuf, err = codec.EncodeKey(iw.ctx.GetSessionVars().StmtCtx, keyBuf, dHashKey...) if err != nil { return nil, err } @@ -570,45 +550,49 @@ func (iw *innerWorker) constructLookupContent(task *lookUpJoinTask) ([]*indexJoi return lookUpContents, nil } -func (iw *innerWorker) constructDatumLookupKey(task *lookUpJoinTask, chkIdx, rowIdx int) ([]types.Datum, error) { +func (iw *innerWorker) constructDatumLookupKey(task *lookUpJoinTask, chkIdx, rowIdx int) ([]types.Datum, []types.Datum, error) { if task.outerMatch != nil && !task.outerMatch[chkIdx][rowIdx] { - return nil, nil + return nil, nil, nil } outerRow := task.outerResult.GetChunk(chkIdx).GetRow(rowIdx) sc := iw.ctx.GetSessionVars().StmtCtx keyLen := len(iw.keyCols) dLookupKey := make([]types.Datum, 0, keyLen) - for i, keyCol := range iw.outerCtx.keyCols { - outerValue := outerRow.GetDatum(keyCol, iw.outerCtx.rowTypes[keyCol]) + dHashKey := make([]types.Datum, 0, len(iw.hashCols)) + for i, hashCol := range iw.outerCtx.hashCols { + outerValue := outerRow.GetDatum(hashCol, iw.outerCtx.rowTypes[hashCol]) // Join-on-condition can be promised to be equal-condition in // IndexNestedLoopJoin, thus the filter will always be false if // outerValue is null, and we don't need to lookup it. if outerValue.IsNull() { - return nil, nil + return nil, nil, nil } - innerColType := iw.rowTypes[iw.keyCols[i]] + innerColType := iw.rowTypes[iw.hashCols[i]] innerValue, err := outerValue.ConvertTo(sc, innerColType) if err != nil { // If the converted outerValue overflows, we don't need to lookup it. if terror.ErrorEqual(err, types.ErrOverflow) { - return nil, nil + return nil, nil, nil } if terror.ErrorEqual(err, types.ErrTruncated) && (innerColType.Tp == mysql.TypeSet || innerColType.Tp == mysql.TypeEnum) { - return nil, nil + return nil, nil, nil } - return nil, err + return nil, nil, err } cmp, err := outerValue.CompareDatum(sc, &innerValue) if err != nil { - return nil, err + return nil, nil, err } if cmp != 0 { // If the converted outerValue is not equal to the origin outerValue, we don't need to lookup it. - return nil, nil + return nil, nil, nil + } + if i < keyLen { + dLookupKey = append(dLookupKey, innerValue) } - dLookupKey = append(dLookupKey, innerValue) + dHashKey = append(dHashKey, innerValue) } - return dLookupKey, nil + return dLookupKey, dHashKey, nil } func (iw *innerWorker) sortAndDedupLookUpContents(lookUpContents []*indexJoinLookUpContent) []*indexJoinLookUpContent { @@ -655,10 +639,13 @@ func (iw *innerWorker) fetchInnerResults(ctx context.Context, task *lookUpJoinTa }() } innerExec, err := iw.readerBuilder.buildExecutorForIndexJoin(ctx, lookUpContent, iw.indexRanges, iw.keyOff2IdxOff, iw.nextColCompareFilters, true) + if innerExec != nil { + defer terror.Call(innerExec.Close) + } if err != nil { return err } - defer terror.Call(innerExec.Close) + innerResult := chunk.NewList(retTypes(innerExec), iw.ctx.GetSessionVars().MaxChunkSize, iw.ctx.GetSessionVars().MaxChunkSize) innerResult.GetMemTracker().SetLabel(memory.LabelForBuildSideResult) innerResult.GetMemTracker().AttachTo(task.memTracker) @@ -700,7 +687,7 @@ func (iw *innerWorker) buildLookUpMap(task *lookUpJoinTask) error { } keyBuf = keyBuf[:0] - for _, keyCol := range iw.keyCols { + for _, keyCol := range iw.hashCols { d := innerRow.GetDatum(keyCol, iw.rowTypes[keyCol]) var err error keyBuf, err = codec.EncodeKey(iw.ctx.GetSessionVars().StmtCtx, keyBuf, d) @@ -717,7 +704,7 @@ func (iw *innerWorker) buildLookUpMap(task *lookUpJoinTask) error { } func (iw *innerWorker) hasNullInJoinKey(row chunk.Row) bool { - for _, ordinal := range iw.keyCols { + for _, ordinal := range iw.hashCols { if row.IsNull(ordinal) { return true } @@ -755,7 +742,7 @@ func (e *indexLookUpJoinRuntimeStats) String() string { buf := bytes.NewBuffer(make([]byte, 0, 16)) if e.innerWorker.totalTime > 0 { buf.WriteString("inner:{total:") - buf.WriteString(time.Duration(e.innerWorker.totalTime).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.innerWorker.totalTime))) buf.WriteString(", concurrency:") if e.concurrency > 0 { buf.WriteString(strconv.Itoa(e.concurrency)) @@ -765,20 +752,20 @@ func (e *indexLookUpJoinRuntimeStats) String() string { buf.WriteString(", task:") buf.WriteString(strconv.FormatInt(e.innerWorker.task, 10)) buf.WriteString(", construct:") - buf.WriteString(time.Duration(e.innerWorker.construct).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.innerWorker.construct))) buf.WriteString(", fetch:") - buf.WriteString(time.Duration(e.innerWorker.fetch).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.innerWorker.fetch))) buf.WriteString(", build:") - buf.WriteString(time.Duration(e.innerWorker.build).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.innerWorker.build))) if e.innerWorker.join > 0 { buf.WriteString(", join:") - buf.WriteString(time.Duration(e.innerWorker.join).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.innerWorker.join))) } buf.WriteString("}") } if e.probe > 0 { buf.WriteString(", probe:") - buf.WriteString(time.Duration(e.probe).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.probe))) } return buf.String() } diff --git a/executor/index_lookup_join_test.go b/executor/index_lookup_join_test.go index 6242f4851f280..f7a4af1855b73 100644 --- a/executor/index_lookup_join_test.go +++ b/executor/index_lookup_join_test.go @@ -34,25 +34,31 @@ func (s *testSuite1) TestIndexLookupJoinHang(c *C) { c.Assert(err, IsNil) req := rs.NewChunk() for i := 0; i < 5; i++ { - rs.Next(context.Background(), req) + // FIXME: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' + _ = rs.Next(context.Background(), req) } - rs.Close() + err = rs.Close() + c.Assert(err, IsNil) rs, err = tk.Exec("select /*+ INL_HASH_JOIN(i)*/ * from idxJoinOuter o left join idxJoinInner i on o.a = i.a where o.a in (1, 2) and (i.a - 3) > 0") c.Assert(err, IsNil) req = rs.NewChunk() for i := 0; i < 5; i++ { - rs.Next(context.Background(), req) + // to fix: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' + _ = rs.Next(context.Background(), req) } - rs.Close() + err = rs.Close() + c.Assert(err, IsNil) rs, err = tk.Exec("select /*+ INL_MERGE_JOIN(i)*/ * from idxJoinOuter o left join idxJoinInner i on o.a = i.a where o.a in (1, 2) and (i.a - 3) > 0") c.Assert(err, IsNil) req = rs.NewChunk() for i := 0; i < 5; i++ { - rs.Next(context.Background(), req) + // to fix: cannot check err, since err exists, Panic: [tikv:1690]BIGINT UNSIGNED value is out of range in '(Column#0 - 3)' + _ = rs.Next(context.Background(), req) } - rs.Close() + err = rs.Close() + c.Assert(err, IsNil) } func (s *testSuite1) TestIndexJoinUnionScan(c *C) { diff --git a/executor/index_lookup_merge_join.go b/executor/index_lookup_merge_join.go index 73396875e6659..a16ffca0a771d 100644 --- a/executor/index_lookup_merge_join.go +++ b/executor/index_lookup_merge_join.go @@ -95,6 +95,7 @@ type innerMergeCtx struct { type lookUpMergeJoinTask struct { outerResult *chunk.List + outerMatch [][]bool outerOrderIdx []chunk.RowPtr innerResult *chunk.Chunk @@ -188,6 +189,12 @@ func (e *IndexLookUpMergeJoin) startWorkers(ctx context.Context) { // TODO: consider another session currency variable for index merge join. // Because its parallelization is not complete. concurrency := e.ctx.GetSessionVars().IndexLookupJoinConcurrency() + if e.runtimeStats != nil { + runtimeStats := &execdetails.RuntimeStatsWithConcurrencyInfo{} + runtimeStats.SetConcurrencyInfo(execdetails.NewConcurrencyInfo("Concurrency", concurrency)) + e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) + } + resultCh := make(chan *lookUpMergeJoinTask, concurrency) e.resultCh = resultCh e.joinChkResourceCh = make([]chan *chunk.Chunk, concurrency) @@ -432,25 +439,23 @@ func (imw *innerMergeWorker) run(ctx context.Context, wg *sync.WaitGroup, cancel func (imw *innerMergeWorker) handleTask(ctx context.Context, task *lookUpMergeJoinTask) (err error) { numOuterChks := task.outerResult.NumChunks() - var outerMatch [][]bool if imw.outerMergeCtx.filter != nil { - outerMatch = make([][]bool, numOuterChks) + task.outerMatch = make([][]bool, numOuterChks) for i := 0; i < numOuterChks; i++ { chk := task.outerResult.GetChunk(i) - outerMatch[i] = make([]bool, chk.NumRows()) - outerMatch[i], err = expression.VectorizedFilter(imw.ctx, imw.outerMergeCtx.filter, chunk.NewIterator4Chunk(chk), outerMatch[i]) + task.outerMatch[i] = make([]bool, chk.NumRows()) + task.outerMatch[i], err = expression.VectorizedFilter(imw.ctx, imw.outerMergeCtx.filter, chunk.NewIterator4Chunk(chk), task.outerMatch[i]) if err != nil { return err } } } + task.memTracker.Consume(int64(cap(task.outerMatch))) task.outerOrderIdx = make([]chunk.RowPtr, 0, task.outerResult.Len()) for i := 0; i < numOuterChks; i++ { numRow := task.outerResult.GetChunk(i).NumRows() for j := 0; j < numRow; j++ { - if len(outerMatch) == 0 || outerMatch[i][j] { - task.outerOrderIdx = append(task.outerOrderIdx, chunk.RowPtr{ChkIdx: uint32(i), RowIdx: uint32(j)}) - } + task.outerOrderIdx = append(task.outerOrderIdx, chunk.RowPtr{ChkIdx: uint32(i), RowIdx: uint32(j)}) } } task.memTracker.Consume(int64(cap(task.outerOrderIdx))) @@ -497,10 +502,12 @@ func (imw *innerMergeWorker) handleTask(ctx context.Context, task *lookUpMergeJo } } imw.innerExec, err = imw.readerBuilder.buildExecutorForIndexJoin(ctx, dLookUpKeys, imw.indexRanges, imw.keyOff2IdxOff, imw.nextColCompareFilters, false) + if imw.innerExec != nil { + defer terror.Call(imw.innerExec.Close) + } if err != nil { return err } - defer terror.Call(imw.innerExec.Close) _, err = imw.fetchNextInnerResult(ctx, task) if err != nil { return err @@ -532,7 +539,12 @@ func (imw *innerMergeWorker) fetchNewChunkWhenFull(ctx context.Context, task *lo } func (imw *innerMergeWorker) doMergeJoin(ctx context.Context, task *lookUpMergeJoinTask) (err error) { - chk := <-imw.joinChkResourceCh + var chk *chunk.Chunk + select { + case chk = <-imw.joinChkResourceCh: + case <-ctx.Done(): + return + } defer func() { if chk == nil { return @@ -557,6 +569,9 @@ func (imw *innerMergeWorker) doMergeJoin(ctx context.Context, task *lookUpMergeJ for _, outerIdx := range task.outerOrderIdx { outerRow := task.outerResult.GetRow(outerIdx) hasMatch, hasNull, cmpResult := false, false, initCmpResult + if task.outerMatch != nil && !task.outerMatch[outerIdx.ChkIdx][outerIdx.RowIdx] { + goto missMatch + } // If it has iterated out all inner rows and the inner rows with same key is empty, // that means the outer row needn't match any inner rows. if noneInnerRowsRemain && len(task.sameKeyInnerRows) == 0 { @@ -653,8 +668,11 @@ func (imw *innerMergeWorker) constructDatumLookupKeys(task *lookUpMergeJoinTask) return dLookUpKeys, nil } -func (imw *innerMergeWorker) constructDatumLookupKey(task *lookUpMergeJoinTask, rowIdx chunk.RowPtr) (*indexJoinLookUpContent, error) { - outerRow := task.outerResult.GetRow(rowIdx) +func (imw *innerMergeWorker) constructDatumLookupKey(task *lookUpMergeJoinTask, idx chunk.RowPtr) (*indexJoinLookUpContent, error) { + if task.outerMatch != nil && !task.outerMatch[idx.ChkIdx][idx.RowIdx] { + return nil, nil + } + outerRow := task.outerResult.GetRow(idx) sc := imw.ctx.GetSessionVars().StmtCtx keyLen := len(imw.keyCols) dLookupKey := make([]types.Datum, 0, keyLen) @@ -688,7 +706,7 @@ func (imw *innerMergeWorker) constructDatumLookupKey(task *lookUpMergeJoinTask, } dLookupKey = append(dLookupKey, innerValue) } - return &indexJoinLookUpContent{keys: dLookupKey, row: task.outerResult.GetRow(rowIdx)}, nil + return &indexJoinLookUpContent{keys: dLookupKey, row: task.outerResult.GetRow(idx)}, nil } func (imw *innerMergeWorker) dedupDatumLookUpKeys(lookUpContents []*indexJoinLookUpContent) []*indexJoinLookUpContent { @@ -732,11 +750,5 @@ func (e *IndexLookUpMergeJoin) Close() error { // cancelFunc control the outer worker and outer worker close the task channel. e.workerWg.Wait() e.memTracker = nil - if e.runtimeStats != nil { - concurrency := cap(e.resultCh) - runtimeStats := &execdetails.RuntimeStatsWithConcurrencyInfo{} - runtimeStats.SetConcurrencyInfo(execdetails.NewConcurrencyInfo("Concurrency", concurrency)) - e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) - } return e.baseExecutor.Close() } diff --git a/executor/index_lookup_merge_join_test.go b/executor/index_lookup_merge_join_test.go index f52b652d346a9..4f2bd6e1488b9 100644 --- a/executor/index_lookup_merge_join_test.go +++ b/executor/index_lookup_merge_join_test.go @@ -58,7 +58,7 @@ func (s *testSuite9) TestIssue18631(c *C) { tk.MustExec("create table t2(a int, b int, c int, d int, primary key(a,b,c))") tk.MustExec("insert into t1 values(1,1,1,1),(2,2,2,2),(3,3,3,3)") tk.MustExec("insert into t2 values(1,1,1,1),(2,2,2,2)") - firstOperator := tk.MustQuery("explain select /*+ inl_merge_join(t1,t2) */ * from t1 left join t2 on t1.a = t2.a and t1.c = t2.c and t1.b = t2.b order by t1.a desc").Rows()[0][0].(string) + firstOperator := tk.MustQuery("explain format = 'brief' select /*+ inl_merge_join(t1,t2) */ * from t1 left join t2 on t1.a = t2.a and t1.c = t2.c and t1.b = t2.b order by t1.a desc").Rows()[0][0].(string) c.Assert(strings.Index(firstOperator, plancodec.TypeIndexMergeJoin), Equals, 0) tk.MustQuery("select /*+ inl_merge_join(t1,t2) */ * from t1 left join t2 on t1.a = t2.a and t1.c = t2.c and t1.b = t2.b order by t1.a desc").Check(testkit.Rows( "3 3 3 3 ", @@ -109,7 +109,7 @@ func (s *testSuite9) TestIssue20137(c *C) { func (s *testSuiteWithData) TestIndexJoinOnSinglePartitionTable(c *C) { // For issue 19145 tk := testkit.NewTestKitWithInit(c, s.store) - for _, val := range []string{string(variable.StaticOnly), string(variable.DynamicOnly)} { + for _, val := range []string{string(variable.Static), string(variable.Dynamic)} { tk.MustExec("set @@tidb_partition_prune_mode= '" + val + "'") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key (c_int) ) partition by range (c_int) ( partition p0 values less than (10), partition p1 values less than maxvalue )") @@ -118,19 +118,43 @@ func (s *testSuiteWithData) TestIndexJoinOnSinglePartitionTable(c *C) { tk.MustExec("insert into t2 values (1, 'Bob')") sql := "select /*+ INL_MERGE_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str" tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob")) - rows := s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) + rows := s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + sql).Rows()) // Partition table can't be inner side of index merge join, because it can't keep order. c.Assert(strings.Index(rows[0], "IndexMergeJoin"), Equals, -1) c.Assert(len(tk.MustQuery("show warnings").Rows()) > 0, Equals, true) sql = "select /*+ INL_HASH_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str" tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob")) - rows = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) + rows = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + sql).Rows()) c.Assert(strings.Index(rows[0], "IndexHashJoin"), Equals, 0) sql = "select /*+ INL_JOIN(t1,t2) */ * from t1 join t2 partition(p0) on t1.c_int = t2.c_int and t1.c_str < t2.c_str" tk.MustQuery(sql).Check(testkit.Rows("1 Alice 1 Bob")) - rows = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) + rows = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + sql).Rows()) c.Assert(strings.Index(rows[0], "IndexJoin"), Equals, 0) } } + +func (s *testSuite9) TestIssue20400(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t, s") + tk.MustExec("create table s(a int, index(a))") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1)") + tk.MustQuery("select /*+ hash_join(t,s)*/ * from t left join s on t.a=s.a and t.a>1").Check( + testkit.Rows("1 ")) + tk.MustQuery("select /*+ inl_merge_join(t,s)*/ * from t left join s on t.a=s.a and t.a>1").Check( + testkit.Rows("1 ")) +} + +func (s *testSuite9) TestIssue20549(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("CREATE TABLE `t1` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `t2id` bigint(20) DEFAULT NULL, PRIMARY KEY (`id`), KEY `t2id` (`t2id`));") + tk.MustExec("INSERT INTO `t1` VALUES (1,NULL);") + tk.MustExec("CREATE TABLE `t2` (`id` bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`id`));") + tk.MustQuery("SELECT /*+ INL_MERGE_JOIN(t1,t2) */ 1 from t1 left outer join t2 on t1.t2id=t2.id;").Check( + testkit.Rows("1")) + tk.MustQuery("SELECT /*+ HASH_JOIN(t1,t2) */ 1 from t1 left outer join t2 on t1.t2id=t2.id;\n").Check( + testkit.Rows("1")) +} diff --git a/executor/index_merge_reader.go b/executor/index_merge_reader.go index 689e466e3659c..bc3109179c7c2 100644 --- a/executor/index_merge_reader.go +++ b/executor/index_merge_reader.go @@ -14,18 +14,23 @@ package executor import ( + "bytes" "context" + "fmt" "runtime/trace" "sync" "sync/atomic" + "time" "unsafe" + "github.com/cznic/mathutil" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" @@ -33,6 +38,7 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/ranger" @@ -93,20 +99,20 @@ type IndexMergeReaderExecutor struct { // checkIndexValue is used to check the consistency of the index data. *checkIndexValue - corColInIdxSide bool partialPlans [][]plannercore.PhysicalPlan corColInTblSide bool tblPlans []plannercore.PhysicalPlan - corColInAccess bool idxCols [][]*expression.Column colLens [][]int handleCols plannercore.HandleCols + stats *IndexMergeRuntimeStat } // Open implements the Executor Open interface func (e *IndexMergeReaderExecutor) Open(ctx context.Context) error { e.keyRanges = make([][]kv.KeyRange, 0, len(e.partialPlans)) + e.initRuntimeStats() for i, plan := range e.partialPlans { _, ok := plan[0].(*plannercore.PhysicalIndexScan) if !ok { @@ -169,7 +175,9 @@ func (e *IndexMergeReaderExecutor) waitPartialWorkersAndCloseFetchChan(partialWo } func (e *IndexMergeReaderExecutor) startIndexMergeProcessWorker(ctx context.Context, workCh chan<- *lookupTableTask, fetch <-chan *lookupTableTask) { - idxMergeProcessWorker := &indexMergeProcessWorker{} + idxMergeProcessWorker := &indexMergeProcessWorker{ + stats: e.stats, + } e.processWokerWg.Add(1) go func() { defer trace.StartRegion(ctx, "IndexMergeProcessWorker").End() @@ -188,7 +196,6 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, collExec := true e.dagPBs[workID].CollectExecutionSummaries = &collExec } - var builder distsql.RequestBuilder kvReq, err := builder.SetKeyRanges(keyRange). SetDAGRequest(e.dagPBs[workID]). @@ -198,18 +205,20 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, SetStreaming(e.partialStreamings[workID]). SetFromSessionVars(e.ctx.GetSessionVars()). SetMemTracker(e.memTracker). + SetFromInfoSchema(infoschema.GetInfoSchema(e.ctx)). Build() if err != nil { return err } - - result, err := distsql.SelectWithRuntimeStats(ctx, e.ctx, kvReq, e.handleCols.GetFieldsTypes(), e.feedbacks[workID], getPhysicalPlanIDs(e.partialPlans[workID]), e.id) + result, err := distsql.SelectWithRuntimeStats(ctx, e.ctx, kvReq, e.handleCols.GetFieldsTypes(), e.feedbacks[workID], getPhysicalPlanIDs(e.partialPlans[workID]), e.getPartitalPlanID(workID)) if err != nil { return err } result.Fetch(ctx) worker := &partialIndexWorker{ + stats: e.stats, + idxID: e.getPartitalPlanID(workID), sc: e.ctx, batchSize: e.maxChunkSize, maxBatchSize: e.ctx.GetSessionVars().IndexLookupSize, @@ -250,7 +259,7 @@ func (e *IndexMergeReaderExecutor) startPartialIndexWorker(ctx context.Context, func (e *IndexMergeReaderExecutor) buildPartialTableReader(ctx context.Context, workID int) Executor { tableReaderExec := &TableReaderExecutor{ - baseExecutor: newBaseExecutor(e.ctx, e.schema, 0), + baseExecutor: newBaseExecutor(e.ctx, e.schema, e.getPartitalPlanID(workID)), table: e.table, dagPB: e.dagPBs[workID], startTS: e.startTS, @@ -272,6 +281,7 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, } tableInfo := e.partialPlans[workID][0].(*plannercore.PhysicalTableScan).Table worker := &partialTableWorker{ + stats: e.stats, sc: e.ctx, batchSize: e.maxChunkSize, maxBatchSize: e.ctx.GetSessionVars().IndexLookupSize, @@ -306,7 +316,31 @@ func (e *IndexMergeReaderExecutor) startPartialTableWorker(ctx context.Context, return nil } +func (e *IndexMergeReaderExecutor) initRuntimeStats() { + if e.runtimeStats != nil && e.stats == nil { + e.stats = &IndexMergeRuntimeStat{ + Concurrency: e.ctx.GetSessionVars().IndexLookupConcurrency(), + } + e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, e.stats) + } +} + +func (e *IndexMergeReaderExecutor) getPartitalPlanID(workID int) int { + if len(e.partialPlans[workID]) > 0 { + return e.partialPlans[workID][len(e.partialPlans[workID])-1].ID() + } + return 0 +} + +func (e *IndexMergeReaderExecutor) getTablePlanRootID() int { + if len(e.tblPlans) > 0 { + return e.tblPlans[len(e.tblPlans)-1].ID() + } + return e.id +} + type partialTableWorker struct { + stats *IndexMergeRuntimeStat sc sessionctx.Context batchSize int maxBatchSize int @@ -318,7 +352,12 @@ type partialTableWorker struct { func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan struct{}, fetchCh chan<- *lookupTableTask, resultCh chan<- *lookupTableTask, finished <-chan struct{}, handleCols plannercore.HandleCols) (count int64, err error) { chk := chunk.NewChunkWithCapacity(retTypes(w.tableReader), w.maxChunkSize) + var basic *execdetails.BasicRuntimeStats + if be := w.tableReader.base(); be != nil && be.runtimeStats != nil { + basic = be.runtimeStats + } for { + start := time.Now() handles, retChunk, err := w.extractTaskHandles(ctx, chk, handleCols) if err != nil { doneCh := make(chan error, 1) @@ -333,6 +372,9 @@ func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan str } count += int64(len(handles)) task := w.buildTableTask(handles, retChunk) + if w.stats != nil { + atomic.AddInt64(&w.stats.FetchIdxTime, int64(time.Since(start))) + } select { case <-ctx.Done(): return count, ctx.Err() @@ -342,6 +384,9 @@ func (w *partialTableWorker) fetchHandles(ctx context.Context, exitCh <-chan str return count, nil case fetchCh <- task: } + if basic != nil { + basic.Record(time.Since(start), chk.NumRows()) + } } } @@ -387,6 +432,7 @@ func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Co e.tblWorkerWg.Add(lookupConcurrencyLimit) for i := 0; i < lookupConcurrencyLimit; i++ { worker := &indexMergeTableScanWorker{ + stats: e.stats, workCh: workCh, finished: e.finished, buildTblReader: e.buildFinalTableReader, @@ -409,7 +455,7 @@ func (e *IndexMergeReaderExecutor) startIndexMergeTableScanWorker(ctx context.Co func (e *IndexMergeReaderExecutor) buildFinalTableReader(ctx context.Context, handles []kv.Handle) (Executor, error) { tableReaderExec := &TableReaderExecutor{ - baseExecutor: newBaseExecutor(e.ctx, e.schema, 0), + baseExecutor: newBaseExecutor(e.ctx, e.schema, e.getTablePlanRootID()), table: e.table, dagPB: e.tableRequest, startTS: e.startTS, @@ -444,9 +490,10 @@ func (e *IndexMergeReaderExecutor) Next(ctx context.Context, req *chunk.Chunk) e if resultTask == nil { return nil } - for resultTask.cursor < len(resultTask.rows) { - req.AppendRow(resultTask.rows[resultTask.cursor]) - resultTask.cursor++ + if resultTask.cursor < len(resultTask.rows) { + numToAppend := mathutil.Min(len(resultTask.rows)-resultTask.cursor, e.maxChunkSize-req.NumRows()) + req.AppendRows(resultTask.rows[resultTask.cursor : resultTask.cursor+numToAppend]) + resultTask.cursor += numToAppend if req.NumRows() >= e.maxChunkSize { return nil } @@ -505,6 +552,7 @@ func (e *IndexMergeReaderExecutor) Close() error { } type indexMergeProcessWorker struct { + stats *IndexMergeRuntimeStat } func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan *lookupTableTask, @@ -515,8 +563,8 @@ func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan }() distinctHandles := kv.NewHandleMap() - for task := range fetchCh { + start := time.Now() handles := task.handles fhs := make([]kv.Handle, 0, 8) for _, h := range handles { @@ -532,6 +580,9 @@ func (w *indexMergeProcessWorker) fetchLoop(ctx context.Context, fetchCh <-chan handles: fhs, doneCh: make(chan error, 1), } + if w.stats != nil { + w.stats.IndexMergeProcess += time.Since(start) + } select { case <-ctx.Done(): return @@ -560,7 +611,9 @@ func (w *indexMergeProcessWorker) handleLoopFetcherPanic(ctx context.Context, re } type partialIndexWorker struct { + stats *IndexMergeRuntimeStat sc sessionctx.Context + idxID int batchSize int maxBatchSize int maxChunkSize int @@ -575,7 +628,15 @@ func (w *partialIndexWorker) fetchHandles( finished <-chan struct{}, handleCols plannercore.HandleCols) (count int64, err error) { chk := chunk.NewChunkWithCapacity(handleCols.GetFieldsTypes(), w.maxChunkSize) + var basicStats *execdetails.BasicRuntimeStats + if w.stats != nil { + if w.idxID != 0 { + basicStats = &execdetails.BasicRuntimeStats{} + w.sc.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(w.idxID, basicStats) + } + } for { + start := time.Now() handles, retChunk, err := w.extractTaskHandles(ctx, chk, result, handleCols) if err != nil { doneCh := make(chan error, 1) @@ -590,6 +651,9 @@ func (w *partialIndexWorker) fetchHandles( } count += int64(len(handles)) task := w.buildTableTask(handles, retChunk) + if w.stats != nil { + atomic.AddInt64(&w.stats.FetchIdxTime, int64(time.Since(start))) + } select { case <-ctx.Done(): return count, ctx.Err() @@ -599,6 +663,9 @@ func (w *partialIndexWorker) fetchHandles( return count, nil case fetchCh <- task: } + if basicStats != nil { + basicStats.Record(time.Since(start), chk.NumRows()) + } } } @@ -640,6 +707,7 @@ func (w *partialIndexWorker) buildTableTask(handles []kv.Handle, retChk *chunk.C } type indexMergeTableScanWorker struct { + stats *IndexMergeRuntimeStat workCh <-chan *lookupTableTask finished <-chan struct{} buildTblReader func(ctx context.Context, handles []kv.Handle) (Executor, error) @@ -652,6 +720,7 @@ type indexMergeTableScanWorker struct { func (w *indexMergeTableScanWorker) pickAndExecTask(ctx context.Context) (task *lookupTableTask) { var ok bool for { + waitStart := time.Now() select { case task, ok = <-w.workCh: if !ok { @@ -660,7 +729,13 @@ func (w *indexMergeTableScanWorker) pickAndExecTask(ctx context.Context) (task * case <-w.finished: return } + execStart := time.Now() err := w.executeTask(ctx, task) + if w.stats != nil { + atomic.AddInt64(&w.stats.WaitTime, int64(execStart.Sub(waitStart))) + atomic.AddInt64(&w.stats.FetchRow, int64(time.Since(execStart))) + atomic.AddInt64(&w.stats.TableTaskNum, 1) + } task.doneCh <- err } } @@ -717,3 +792,56 @@ func (w *indexMergeTableScanWorker) executeTask(ctx context.Context, task *looku } return nil } + +// IndexMergeRuntimeStat record the indexMerge runtime stat +type IndexMergeRuntimeStat struct { + IndexMergeProcess time.Duration + FetchIdxTime int64 + WaitTime int64 + FetchRow int64 + TableTaskNum int64 + Concurrency int +} + +func (e *IndexMergeRuntimeStat) String() string { + var buf bytes.Buffer + if e.FetchIdxTime != 0 { + buf.WriteString(fmt.Sprintf("index_task:{fetch_handle:%s", time.Duration(e.FetchIdxTime))) + if e.IndexMergeProcess != 0 { + buf.WriteString(fmt.Sprintf(", merge:%s", e.IndexMergeProcess)) + } + buf.WriteByte('}') + } + if e.FetchRow != 0 { + if buf.Len() > 0 { + buf.WriteByte(',') + } + buf.WriteString(fmt.Sprintf(" table_task:{num:%d, concurrency:%d, fetch_row:%s, wait_time:%s}", e.TableTaskNum, e.Concurrency, time.Duration(e.FetchRow), time.Duration(e.WaitTime))) + } + return buf.String() +} + +// Clone implements the RuntimeStats interface. +func (e *IndexMergeRuntimeStat) Clone() execdetails.RuntimeStats { + newRs := *e + return &newRs +} + +// Merge implements the RuntimeStats interface. +func (e *IndexMergeRuntimeStat) Merge(other execdetails.RuntimeStats) { + tmp, ok := other.(*IndexMergeRuntimeStat) + if !ok { + return + } + e.IndexMergeProcess += tmp.IndexMergeProcess + e.FetchIdxTime += tmp.FetchIdxTime + e.FetchRow += tmp.FetchRow + e.WaitTime += e.WaitTime + e.TableTaskNum += tmp.TableTaskNum + e.Concurrency += tmp.Concurrency +} + +// Tp implements the RuntimeStats interface. +func (e *IndexMergeRuntimeStat) Tp() int { + return execdetails.TpIndexMergeRunTimeStats +} diff --git a/executor/infoschema_reader.go b/executor/infoschema_reader.go index 137a29b8cde60..7abf159313a9e 100644 --- a/executor/infoschema_reader.go +++ b/executor/infoschema_reader.go @@ -14,6 +14,7 @@ package executor import ( + "bytes" "context" "encoding/json" "fmt" @@ -31,9 +32,12 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/privilege" @@ -41,7 +45,6 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/store/helper" - "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" binaryJson "github.com/pingcap/tidb/types/json" @@ -72,7 +75,7 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex return nil, nil } - //Cache the ret full rows in schemataRetriever + // Cache the ret full rows in schemataRetriever if !e.initialized { is := infoschema.GetInfoSchema(sctx) dbs := is.AllSchemas() @@ -138,6 +141,12 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex infoschema.ClusterTableStatementsSummary, infoschema.ClusterTableStatementsSummaryHistory: err = e.setDataForStatementsSummary(sctx, e.table.Name.O) + case infoschema.TablePlacementPolicy: + err = e.setDataForPlacementPolicy(sctx) + case infoschema.TableClientErrorsSummaryGlobal, + infoschema.TableClientErrorsSummaryByUser, + infoschema.TableClientErrorsSummaryByHost: + err = e.setDataForClientErrorsSummary(sctx, e.table.Name.O) } if err != nil { return nil, err @@ -145,7 +154,7 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex e.initialized = true } - //Adjust the amount of each return + // Adjust the amount of each return maxCount := 1024 retCount := maxCount if e.rowIdx+maxCount > len(e.rows) { @@ -161,10 +170,16 @@ func (e *memtableRetriever) retrieve(ctx context.Context, sctx sessionctx.Contex } func getRowCountAllTable(ctx sessionctx.Context) (map[int64]uint64, error) { - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL("select table_id, count from mysql.stats_meta") + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), "select table_id, count from mysql.stats_meta") if err != nil { return nil, err } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) + if err != nil { + return nil, err + } + rowCountMap := make(map[int64]uint64, len(rows)) for _, row := range rows { tableID := row.GetInt64(0) @@ -180,10 +195,16 @@ type tableHistID struct { } func getColLengthAllTables(ctx sessionctx.Context) (map[tableHistID]uint64, error) { - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL("select table_id, hist_id, tot_col_size from mysql.stats_histograms where is_index = 0") + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), "select table_id, hist_id, tot_col_size from mysql.stats_histograms where is_index = 0") if err != nil { return nil, err } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) + if err != nil { + return nil, err + } + colLengthMap := make(map[tableHistID]uint64, len(rows)) for _, row := range rows { tableID := row.GetInt64(0) @@ -470,10 +491,8 @@ func (e *memtableRetriever) setDataFromTables(ctx sessionctx.Context, schemas [] if util.IsSystemView(schema.Name.L) { tableType = "SYSTEM VIEW" } - if table.PKIsHandle { - pkType = "INT CLUSTERED" - } else if table.IsCommonHandle { - pkType = "COMMON CLUSTERED" + if table.PKIsHandle || table.IsCommonHandle { + pkType = "CLUSTERED" } shardingInfo := infoschema.GetShardingInfo(schema, table) record := types.MakeDatums( @@ -538,8 +557,8 @@ func (e *memtableRetriever) setDataFromTables(ctx sessionctx.Context, schemas [] return nil } -func (e *hugeMemTableRetriever) setDataForColumns(ctx sessionctx.Context) error { - checker := privilege.GetPrivilegeManager(ctx) +func (e *hugeMemTableRetriever) setDataForColumns(ctx context.Context, sctx sessionctx.Context) error { + checker := privilege.GetPrivilegeManager(sctx) e.rows = e.rows[:0] batch := 1024 for ; e.dbsIdx < len(e.dbs); e.dbsIdx++ { @@ -547,11 +566,11 @@ func (e *hugeMemTableRetriever) setDataForColumns(ctx sessionctx.Context) error for e.tblIdx < len(schema.Tables) { table := schema.Tables[e.tblIdx] e.tblIdx++ - if checker != nil && !checker.RequestVerification(ctx.GetSessionVars().ActiveRoles, schema.Name.L, table.Name.L, "", mysql.AllPrivMask) { + if checker != nil && !checker.RequestVerification(sctx.GetSessionVars().ActiveRoles, schema.Name.L, table.Name.L, "", mysql.AllPrivMask) { continue } - e.dataForColumnsInTable(schema, table) + e.dataForColumnsInTable(ctx, sctx, schema, table) if len(e.rows) >= batch { return nil } @@ -561,7 +580,11 @@ func (e *hugeMemTableRetriever) setDataForColumns(ctx sessionctx.Context) error return nil } -func (e *hugeMemTableRetriever) dataForColumnsInTable(schema *model.DBInfo, tbl *model.TableInfo) { +func (e *hugeMemTableRetriever) dataForColumnsInTable(ctx context.Context, sctx sessionctx.Context, schema *model.DBInfo, tbl *model.TableInfo) { + if err := tryFillViewColumnType(ctx, sctx, infoschema.GetInfoSchema(sctx), schema.Name, tbl); err != nil { + sctx.GetSessionVars().StmtCtx.AppendWarning(err) + return + } for i, col := range tbl.Columns { if col.Hidden { continue @@ -695,6 +718,7 @@ func (e *memtableRetriever) setDataFromPartitions(ctx sessionctx.Context, schema nil, // PARTITION_COMMENT nil, // NODEGROUP nil, // TABLESPACE_NAME + nil, // TIDB_PARTITION_ID ) rows = append(rows, record) } else { @@ -709,7 +733,29 @@ func (e *memtableRetriever) setDataFromPartitions(ctx sessionctx.Context, schema var partitionDesc string if table.Partition.Type == model.PartitionTypeRange { - partitionDesc = pi.LessThan[0] + partitionDesc = strings.Join(pi.LessThan, ",") + } else if table.Partition.Type == model.PartitionTypeList { + if len(pi.InValues) > 0 { + buf := bytes.NewBuffer(nil) + if len(pi.InValues[0]) == 1 { + for i, vs := range pi.InValues { + if i > 0 { + buf.WriteString(",") + } + buf.WriteString(vs[0]) + } + } else if len(pi.InValues[0]) > 1 { + for i, vs := range pi.InValues { + if i > 0 { + buf.WriteString(",") + } + buf.WriteString("(") + buf.WriteString(strings.Join(vs, ",")) + buf.WriteString(")") + } + } + partitionDesc = buf.String() + } } partitionMethod := table.Partition.Type.String() @@ -717,6 +763,16 @@ func (e *memtableRetriever) setDataFromPartitions(ctx sessionctx.Context, schema if table.Partition.Type == model.PartitionTypeRange && len(table.Partition.Columns) > 0 { partitionMethod = "RANGE COLUMNS" partitionExpr = table.Partition.Columns[0].String() + } else if table.Partition.Type == model.PartitionTypeList && len(table.Partition.Columns) > 0 { + partitionMethod = "LIST COLUMNS" + buf := bytes.NewBuffer(nil) + for i, col := range table.Partition.Columns { + if i > 0 { + buf.WriteString(",") + } + buf.WriteString(col.String()) + } + partitionExpr = buf.String() } record := types.MakeDatums( @@ -745,6 +801,7 @@ func (e *memtableRetriever) setDataFromPartitions(ctx sessionctx.Context, schema pi.Comment, // PARTITION_COMMENT nil, // NODEGROUP nil, // TABLESPACE_NAME + pi.ID, // TIDB_PARTITION_ID ) rows = append(rows, record) } @@ -871,7 +928,7 @@ func (e *memtableRetriever) setDataFromViews(ctx sessionctx.Context, schemas []* } func (e *memtableRetriever) dataForTiKVStoreStatus(ctx sessionctx.Context) (err error) { - tikvStore, ok := ctx.GetStore().(tikv.Storage) + tikvStore, ok := ctx.GetStore().(helper.Storage) if !ok { return errors.New("Information about TiKV store status can be gotten only when the storage is TiKV") } @@ -1054,6 +1111,7 @@ func (e *memtableRetriever) dataForTiDBClusterInfo(ctx sessionctx.Context) error server.GitHash, startTimeStr, upTimeStr, + server.ServerID, ) rows = append(rows, row) } @@ -1183,6 +1241,9 @@ func keyColumnUsageInTable(schema *model.DBInfo, table *model.TableInfo) [][]typ } for i, key := range index.Columns { col := nameToCol[key.Name.L] + if col.Hidden { + continue + } record := types.MakeDatums( infoschema.CatalogVal, // CONSTRAINT_CATALOG schema.Name.O, // CONSTRAINT_SCHEMA @@ -1228,7 +1289,7 @@ func keyColumnUsageInTable(schema *model.DBInfo, table *model.TableInfo) [][]typ } func (e *memtableRetriever) setDataForTiKVRegionStatus(ctx sessionctx.Context) error { - tikvStore, ok := ctx.GetStore().(tikv.Storage) + tikvStore, ok := ctx.GetStore().(helper.Storage) if !ok { return errors.New("Information about TiKV region status can be gotten only when the storage is TiKV") } @@ -1285,7 +1346,7 @@ func (e *memtableRetriever) setNewTiKVRegionStatusCol(region *helper.RegionInfo, } func (e *memtableRetriever) setDataForTikVRegionPeers(ctx sessionctx.Context) error { - tikvStore, ok := ctx.GetStore().(tikv.Storage) + tikvStore, ok := ctx.GetStore().(helper.Storage) if !ok { return errors.New("Information about TiKV region status can be gotten only when the storage is TiKV") } @@ -1348,7 +1409,7 @@ const ( ) func (e *memtableRetriever) setDataForTiDBHotRegions(ctx sessionctx.Context) error { - tikvStore, ok := ctx.GetStore().(tikv.Storage) + tikvStore, ok := ctx.GetStore().(helper.Storage) if !ok { return errors.New("Information about hot region can be gotten only when the storage is TiKV") } @@ -1513,7 +1574,7 @@ func (e *tableStorageStatsRetriever) initialize(sctx sessionctx.Context) error { // Filter the sys or memory schema. for schema := range schemas { - if !util.IsMemOrSysDB(schema) { + if !util.IsMemDB(schema) { databases = append(databases, schema) } } @@ -1537,7 +1598,7 @@ func (e *tableStorageStatsRetriever) initialize(sctx sessionctx.Context) error { } // Cache the helper and return an error if PD unavailable. - tikvStore, ok := sctx.GetStore().(tikv.Storage) + tikvStore, ok := sctx.GetStore().(helper.Storage) if !ok { return errors.Errorf("Information about TiKV region status can be gotten only when the storage is TiKV") } @@ -1779,6 +1840,126 @@ func (e *memtableRetriever) setDataForStatementsSummary(ctx sessionctx.Context, return nil } +func (e *memtableRetriever) setDataForPlacementPolicy(ctx sessionctx.Context) error { + checker := privilege.GetPrivilegeManager(ctx) + is := infoschema.GetInfoSchema(ctx) + var rows [][]types.Datum + for _, bundle := range is.RuleBundles() { + id, err := placement.ObjectIDFromGroupID(bundle.ID) + if err != nil { + return errors.Wrapf(err, "Restore bundle %s failed", bundle.ID) + } + if id == 0 { + continue + } + // Currently, only partitions have placement rules. + tb, db, part := is.FindTableByPartitionID(id) + if tb == nil { + return errors.Errorf("Can't find partition by id %d", id) + } + if checker != nil && !checker.RequestVerification(ctx.GetSessionVars().ActiveRoles, db.Name.L, tb.Meta().Name.L, "", mysql.SelectPriv) { + continue + } + for _, rule := range bundle.Rules { + constraint, err := placement.RestoreLabelConstraintList(rule.LabelConstraints) + if err != nil { + return errors.Wrapf(err, "Restore rule %s in bundle %s failed", rule.ID, bundle.ID) + } + row := types.MakeDatums( + bundle.ID, + bundle.Index, + rule.ID, + db.Name.L, + tb.Meta().Name.L, + part.Name.L, + nil, + string(rule.Role), + rule.Count, + constraint, + ) + rows = append(rows, row) + } + } + e.rows = rows + return nil +} + +func (e *memtableRetriever) setDataForClientErrorsSummary(ctx sessionctx.Context, tableName string) error { + // Seeing client errors should require the PROCESS privilege, with the exception of errors for your own user. + // This is similar to information_schema.processlist, which is the closest comparison. + var hasProcessPriv bool + loginUser := ctx.GetSessionVars().User + if pm := privilege.GetPrivilegeManager(ctx); pm != nil { + if pm.RequestVerification(ctx.GetSessionVars().ActiveRoles, "", "", "", mysql.ProcessPriv) { + hasProcessPriv = true + } + } + + var rows [][]types.Datum + switch tableName { + case infoschema.TableClientErrorsSummaryGlobal: + if !hasProcessPriv { + return plannercore.ErrSpecificAccessDenied.GenWithStackByArgs("PROCESS") + } + for code, summary := range errno.GlobalStats() { + firstSeen := types.NewTime(types.FromGoTime(summary.FirstSeen), mysql.TypeTimestamp, types.DefaultFsp) + lastSeen := types.NewTime(types.FromGoTime(summary.LastSeen), mysql.TypeTimestamp, types.DefaultFsp) + row := types.MakeDatums( + int(code), // ERROR_NUMBER + errno.MySQLErrName[code].Raw, // ERROR_MESSAGE + summary.ErrorCount, // ERROR_COUNT + summary.WarningCount, // WARNING_COUNT + firstSeen, // FIRST_SEEN + lastSeen, // LAST_SEEN + ) + rows = append(rows, row) + } + case infoschema.TableClientErrorsSummaryByUser: + for user, agg := range errno.UserStats() { + for code, summary := range agg { + // Allow anyone to see their own errors. + if !hasProcessPriv && loginUser != nil && loginUser.Username != user { + continue + } + firstSeen := types.NewTime(types.FromGoTime(summary.FirstSeen), mysql.TypeTimestamp, types.DefaultFsp) + lastSeen := types.NewTime(types.FromGoTime(summary.LastSeen), mysql.TypeTimestamp, types.DefaultFsp) + row := types.MakeDatums( + user, // USER + int(code), // ERROR_NUMBER + errno.MySQLErrName[code].Raw, // ERROR_MESSAGE + summary.ErrorCount, // ERROR_COUNT + summary.WarningCount, // WARNING_COUNT + firstSeen, // FIRST_SEEN + lastSeen, // LAST_SEEN + ) + rows = append(rows, row) + } + } + case infoschema.TableClientErrorsSummaryByHost: + if !hasProcessPriv { + return plannercore.ErrSpecificAccessDenied.GenWithStackByArgs("PROCESS") + } + for host, agg := range errno.HostStats() { + for code, summary := range agg { + firstSeen := types.NewTime(types.FromGoTime(summary.FirstSeen), mysql.TypeTimestamp, types.DefaultFsp) + lastSeen := types.NewTime(types.FromGoTime(summary.LastSeen), mysql.TypeTimestamp, types.DefaultFsp) + row := types.MakeDatums( + host, // HOST + int(code), // ERROR_NUMBER + errno.MySQLErrName[code].Raw, // ERROR_MESSAGE + summary.ErrorCount, // ERROR_COUNT + summary.WarningCount, // WARNING_COUNT + firstSeen, // FIRST_SEEN + lastSeen, // LAST_SEEN + ) + rows = append(rows, row) + } + } + } + e.rows = rows + return nil +} + type hugeMemTableRetriever struct { dummyCloser table *model.TableInfo @@ -1809,7 +1990,7 @@ func (e *hugeMemTableRetriever) retrieve(ctx context.Context, sctx sessionctx.Co var err error switch e.table.Name.O { case infoschema.TableColumns: - err = e.setDataForColumns(sctx) + err = e.setDataForColumns(ctx, sctx) } if err != nil { return nil, err @@ -1881,7 +2062,7 @@ type tiflashInstanceInfo struct { func (e *TiFlashSystemTableRetriever) initialize(sctx sessionctx.Context, tiflashInstances set.StringSet) error { store := sctx.GetStore() - if etcd, ok := store.(tikv.EtcdBackend); ok { + if etcd, ok := store.(kv.EtcdBackend); ok { var addrs []string var err error if addrs, err = etcd.EtcdAddrs(); err != nil { diff --git a/executor/infoschema_reader_test.go b/executor/infoschema_reader_test.go index e5328b2be1f06..903d42a02df29 100644 --- a/executor/infoschema_reader_test.go +++ b/executor/infoschema_reader_test.go @@ -41,7 +41,6 @@ import ( "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/stringutil" @@ -112,38 +111,38 @@ func (s *inspectionSuite) TearDownSuite(c *C) { func (s *inspectionSuite) TestInspectionTables(c *C) { tk := testkit.NewTestKit(c, s.store) instances := []string{ - "pd,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash", - "tidb,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash", - "tikv,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash", + "pd,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash,0", + "tidb,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash,1001", + "tikv,127.0.0.1:11080,127.0.0.1:10080,mock-version,mock-githash,0", } fpName := "github.com/pingcap/tidb/infoschema/mockClusterInfo" fpExpr := `return("` + strings.Join(instances, ";") + `")` c.Assert(failpoint.Enable(fpName, fpExpr), IsNil) defer func() { c.Assert(failpoint.Disable(fpName), IsNil) }() - tk.MustQuery("select type, instance, status_address, version, git_hash from information_schema.cluster_info").Check(testkit.Rows( - "pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", + tk.MustQuery("select type, instance, status_address, version, git_hash, server_id from information_schema.cluster_info").Check(testkit.Rows( + "pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", + "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 1001", + "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", )) // enable inspection mode inspectionTableCache := map[string]variable.TableSnapshot{} tk.Se.GetSessionVars().InspectionTableCache = inspectionTableCache - tk.MustQuery("select type, instance, status_address, version, git_hash from information_schema.cluster_info").Check(testkit.Rows( - "pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", + tk.MustQuery("select type, instance, status_address, version, git_hash, server_id from information_schema.cluster_info").Check(testkit.Rows( + "pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", + "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 1001", + "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", )) c.Assert(inspectionTableCache["cluster_info"].Err, IsNil) c.Assert(len(inspectionTableCache["cluster_info"].Rows), DeepEquals, 3) // check whether is obtain data from cache at the next time inspectionTableCache["cluster_info"].Rows[0][0].SetString("modified-pd", mysql.DefaultCollationName) - tk.MustQuery("select type, instance, status_address, version, git_hash from information_schema.cluster_info").Check(testkit.Rows( - "modified-pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", - "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash", + tk.MustQuery("select type, instance, status_address, version, git_hash, server_id from information_schema.cluster_info").Check(testkit.Rows( + "modified-pd 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", + "tidb 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 1001", + "tikv 127.0.0.1:11080 127.0.0.1:10080 mock-version mock-githash 0", )) tk.Se.GetSessionVars().InspectionTableCache = nil } @@ -275,7 +274,7 @@ func (s *testInfoschemaTableSuite) TestKeyColumnUsage(c *C) { tk.MustQuery("select * from information_schema.KEY_COLUMN_USAGE where TABLE_NAME='stats_meta' and COLUMN_NAME='table_id';").Check( testkit.Rows("def mysql tbl def mysql stats_meta table_id 1 ")) - //test the privilege of new user for information_schema.table_constraints + // test the privilege of new user for information_schema.table_constraints tk.MustExec("create user key_column_tester") keyColumnTester := testkit.NewTestKit(c, s.store) keyColumnTester.MustExec("use information_schema") @@ -283,9 +282,9 @@ func (s *testInfoschemaTableSuite) TestKeyColumnUsage(c *C) { Username: "key_column_tester", Hostname: "127.0.0.1", }, nil, nil), IsTrue) - keyColumnTester.MustQuery("select * from information_schema.KEY_COLUMN_USAGE;").Check([][]interface{}{}) + keyColumnTester.MustQuery("select * from information_schema.KEY_COLUMN_USAGE where TABLE_NAME != 'CLUSTER_SLOW_QUERY';").Check([][]interface{}{}) - //test the privilege of user with privilege of mysql.gc_delete_range for information_schema.table_constraints + // test the privilege of user with privilege of mysql.gc_delete_range for information_schema.table_constraints tk.MustExec("CREATE ROLE r_stats_meta ;") tk.MustExec("GRANT ALL PRIVILEGES ON mysql.stats_meta TO r_stats_meta;") tk.MustExec("GRANT r_stats_meta TO key_column_tester;") @@ -295,7 +294,7 @@ func (s *testInfoschemaTableSuite) TestKeyColumnUsage(c *C) { func (s *testInfoschemaTableSuite) TestUserPrivileges(c *C) { tk := testkit.NewTestKit(c, s.store) - //test the privilege of new user for information_schema.table_constraints + // test the privilege of new user for information_schema.table_constraints tk.MustExec("create user constraints_tester") constraintsTester := testkit.NewTestKit(c, s.store) constraintsTester.MustExec("use information_schema") @@ -303,9 +302,9 @@ func (s *testInfoschemaTableSuite) TestUserPrivileges(c *C) { Username: "constraints_tester", Hostname: "127.0.0.1", }, nil, nil), IsTrue) - constraintsTester.MustQuery("select * from information_schema.TABLE_CONSTRAINTS;").Check([][]interface{}{}) + constraintsTester.MustQuery("select * from information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME != 'CLUSTER_SLOW_QUERY';").Check([][]interface{}{}) - //test the privilege of user with privilege of mysql.gc_delete_range for information_schema.table_constraints + // test the privilege of user with privilege of mysql.gc_delete_range for information_schema.table_constraints tk.MustExec("CREATE ROLE r_gc_delete_range ;") tk.MustExec("GRANT ALL PRIVILEGES ON mysql.gc_delete_range TO r_gc_delete_range;") tk.MustExec("GRANT r_gc_delete_range TO constraints_tester;") @@ -313,7 +312,7 @@ func (s *testInfoschemaTableSuite) TestUserPrivileges(c *C) { c.Assert(len(constraintsTester.MustQuery("select * from information_schema.TABLE_CONSTRAINTS where TABLE_NAME='gc_delete_range';").Rows()), Greater, 0) constraintsTester.MustQuery("select * from information_schema.TABLE_CONSTRAINTS where TABLE_NAME='tables_priv';").Check([][]interface{}{}) - //test the privilege of new user for information_schema + // test the privilege of new user for information_schema tk.MustExec("create user tester1") tk1 := testkit.NewTestKit(c, s.store) tk1.MustExec("use information_schema") @@ -321,9 +320,9 @@ func (s *testInfoschemaTableSuite) TestUserPrivileges(c *C) { Username: "tester1", Hostname: "127.0.0.1", }, nil, nil), IsTrue) - tk1.MustQuery("select * from information_schema.STATISTICS;").Check([][]interface{}{}) + tk1.MustQuery("select * from information_schema.STATISTICS WHERE TABLE_NAME != 'CLUSTER_SLOW_QUERY';").Check([][]interface{}{}) - //test the privilege of user with some privilege for information_schema + // test the privilege of user with some privilege for information_schema tk.MustExec("create user tester2") tk.MustExec("CREATE ROLE r_columns_priv;") tk.MustExec("GRANT ALL PRIVILEGES ON mysql.columns_priv TO r_columns_priv;") @@ -340,7 +339,7 @@ func (s *testInfoschemaTableSuite) TestUserPrivileges(c *C) { tk2.MustQuery("select * from information_schema.STATISTICS where TABLE_NAME='tables_priv' and COLUMN_NAME='Host';").Check( [][]interface{}{}) - //test the privilege of user with all privilege for information_schema + // test the privilege of user with all privilege for information_schema tk.MustExec("create user tester3") tk.MustExec("CREATE ROLE r_all_priv;") tk.MustExec("GRANT ALL PRIVILEGES ON mysql.* TO r_all_priv;") @@ -372,7 +371,8 @@ func (s *testInfoschemaTableSerialSuite) TestDataForTableStatsField(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t (c int, d int, e char(5), index idx(e))") - h.HandleDDLEvent(<-h.DDLEventCh()) + err := h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) tk.MustQuery("select table_rows, avg_row_length, data_length, index_length from information_schema.tables where table_name='t'").Check( testkit.Rows("0 0 0 0")) tk.MustExec(`insert into t(c, d, e) values(1, 2, "c"), (2, 3, "d"), (3, 4, "e")`) @@ -399,7 +399,8 @@ func (s *testInfoschemaTableSerialSuite) TestDataForTableStatsField(c *C) { // Test partition table. tk.MustExec("drop table if exists t") tk.MustExec(`CREATE TABLE t (a int, b int, c varchar(5), primary key(a), index idx(c)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16))`) - h.HandleDDLEvent(<-h.DDLEventCh()) + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) tk.MustExec(`insert into t(a, b, c) values(1, 2, "c"), (7, 3, "d"), (12, 4, "e")`) c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(is), IsNil) @@ -418,37 +419,39 @@ func (s *testInfoschemaTableSerialSuite) TestPartitionsTable(c *C) { is := do.InfoSchema() tk := testkit.NewTestKit(c, s.store) - tk.MustExec("USE test;") - tk.MustExec("DROP TABLE IF EXISTS `test_partitions`;") - tk.MustExec(`CREATE TABLE test_partitions (a int, b int, c varchar(5), primary key(a), index idx(c)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16));`) - err := h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - tk.MustExec(`insert into test_partitions(a, b, c) values(1, 2, "c"), (7, 3, "d"), (12, 4, "e");`) - - tk.MustQuery("select PARTITION_NAME, PARTITION_DESCRIPTION from information_schema.PARTITIONS where table_name='test_partitions';").Check( - testkit.Rows("" + - "p0 6]\n" + - "[p1 11]\n" + - "[p2 16")) - - tk.MustQuery("select table_rows, avg_row_length, data_length, index_length from information_schema.PARTITIONS where table_name='test_partitions';").Check( - testkit.Rows("" + - "0 0 0 0]\n" + - "[0 0 0 0]\n" + - "[0 0 0 0")) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - tk.MustQuery("select table_rows, avg_row_length, data_length, index_length from information_schema.PARTITIONS where table_name='test_partitions';").Check( - testkit.Rows("" + - "1 18 18 2]\n" + - "[1 18 18 2]\n" + - "[1 18 18 2")) + testkit.WithPruneMode(tk, variable.Static, func() { + c.Assert(h.RefreshVars(), IsNil) + tk.MustExec("DROP TABLE IF EXISTS `test_partitions`;") + tk.MustExec(`CREATE TABLE test_partitions (a int, b int, c varchar(5), primary key(a), index idx(c)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16));`) + err := h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + tk.MustExec(`insert into test_partitions(a, b, c) values(1, 2, "c"), (7, 3, "d"), (12, 4, "e");`) + + tk.MustQuery("select PARTITION_NAME, PARTITION_DESCRIPTION from information_schema.PARTITIONS where table_name='test_partitions';").Check( + testkit.Rows("" + + "p0 6]\n" + + "[p1 11]\n" + + "[p2 16")) + + tk.MustQuery("select table_rows, avg_row_length, data_length, index_length from information_schema.PARTITIONS where table_name='test_partitions';").Check( + testkit.Rows("" + + "0 0 0 0]\n" + + "[0 0 0 0]\n" + + "[0 0 0 0")) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + tk.MustQuery("select table_rows, avg_row_length, data_length, index_length from information_schema.PARTITIONS where table_name='test_partitions';").Check( + testkit.Rows("" + + "1 18 18 2]\n" + + "[1 18 18 2]\n" + + "[1 18 18 2")) + }) // Test for table has no partitions. tk.MustExec("DROP TABLE IF EXISTS `test_partitions_1`;") tk.MustExec(`CREATE TABLE test_partitions_1 (a int, b int, c varchar(5), primary key(a), index idx(c));`) - err = h.HandleDDLEvent(<-h.DDLEventCh()) + err := h.HandleDDLEvent(<-h.DDLEventCh()) c.Assert(err, IsNil) tk.MustExec(`insert into test_partitions_1(a, b, c) values(1, 2, "c"), (7, 3, "d"), (12, 4, "e");`) c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) @@ -456,11 +459,26 @@ func (s *testInfoschemaTableSerialSuite) TestPartitionsTable(c *C) { tk.MustQuery("select PARTITION_NAME, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH, INDEX_LENGTH from information_schema.PARTITIONS where table_name='test_partitions_1';").Check( testkit.Rows(" 3 18 54 6")) - tk.MustExec("DROP TABLE `test_partitions`;") - + tk.MustExec("DROP TABLE IF EXISTS `test_partitions`;") tk.MustExec(`CREATE TABLE test_partitions1 (id int, b int, c varchar(5), primary key(id), index idx(c)) PARTITION BY RANGE COLUMNS(id) (PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16));`) tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions1';").Check(testkit.Rows("p0 RANGE COLUMNS id", "p1 RANGE COLUMNS id", "p2 RANGE COLUMNS id")) tk.MustExec("DROP TABLE test_partitions1") + + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("create table test_partitions (a int) partition by list (a) (partition p0 values in (1), partition p1 values in (2));") + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST `a`", "p1 LIST `a`")) + tk.MustExec("drop table test_partitions") + + tk.MustExec("create table test_partitions (a date) partition by list (year(a)) (partition p0 values in (1), partition p1 values in (2));") + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST YEAR(`a`)", "p1 LIST YEAR(`a`)")) + tk.MustExec("drop table test_partitions") + + tk.MustExec("create table test_partitions (a bigint, b date) partition by list columns (a,b) (partition p0 values in ((1,'2020-09-28'),(1,'2020-09-29')));") + tk.MustQuery("select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION from information_schema.partitions where table_name = 'test_partitions';").Check(testkit.Rows("p0 LIST COLUMNS a,b")) + pid, err := strconv.Atoi(tk.MustQuery("select TIDB_PARTITION_ID from information_schema.partitions where table_name = 'test_partitions';").Rows()[0][0].(string)) + c.Assert(err, IsNil) + c.Assert(pid, Greater, 0) + tk.MustExec("drop table test_partitions") } func (s *testInfoschemaTableSuite) TestMetricTables(c *C) { @@ -494,7 +512,7 @@ func (s *testInfoschemaTableSuite) TestForAnalyzeStatus(c *C) { tk.MustExec("analyze table analyze_test") tk.MustQuery("select distinct TABLE_NAME from information_schema.analyze_status where TABLE_NAME='analyze_test'").Check(testkit.Rows("analyze_test")) - //test the privilege of new user for information_schema.analyze_status + // test the privilege of new user for information_schema.analyze_status tk.MustExec("create user analyze_tester") analyzeTester := testkit.NewTestKit(c, s.store) analyzeTester.MustExec("use information_schema") @@ -505,7 +523,7 @@ func (s *testInfoschemaTableSuite) TestForAnalyzeStatus(c *C) { analyzeTester.MustQuery("show analyze status").Check([][]interface{}{}) analyzeTester.MustQuery("select * from information_schema.ANALYZE_STATUS;").Check([][]interface{}{}) - //test the privilege of user with privilege of test.t1 for information_schema.analyze_status + // test the privilege of user with privilege of test.t1 for information_schema.analyze_status tk.MustExec("create table t1 (a int, b int, index idx(a))") tk.MustExec("insert into t1 values (1,2),(3,4)") tk.MustExec("analyze table t1") @@ -538,7 +556,10 @@ func (s *testInfoschemaTableSerialSuite) TestForServersInfo(c *C) { func (s *testInfoschemaTableSerialSuite) TestForTableTiFlashReplica(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount", `return(true)`), IsNil) - defer failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + defer func() { + err := failpoint.Disable("github.com/pingcap/tidb/infoschema/mockTiFlashStoreCount") + c.Assert(err, IsNil) + }() tk := testkit.NewTestKit(c, s.store) statistics.ClearHistoryJobs() @@ -575,7 +596,10 @@ func (s *testInfoschemaClusterTableSuite) setUpRPCService(c *C, addr string) (*g lis, err := net.Listen("tcp", addr) c.Assert(err, IsNil) // Fix issue 9836 - sm := &mockSessionManager{make(map[uint64]*util.ProcessInfo, 1)} + sm := &mockSessionManager{ + processInfoMap: make(map[uint64]*util.ProcessInfo, 1), + serverID: 1, + } sm.processInfoMap[1] = &util.ProcessInfo{ ID: 1, User: "root", @@ -680,6 +704,7 @@ func (s *testInfoschemaClusterTableSuite) TearDownSuite(c *C) { type mockSessionManager struct { processInfoMap map[uint64]*util.ProcessInfo + serverID uint64 } func (sm *mockSessionManager) ShowProcessList() map[uint64]*util.ProcessInfo { @@ -693,21 +718,33 @@ func (sm *mockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, bool func (sm *mockSessionManager) Kill(connectionID uint64, query bool) {} +func (sm *mockSessionManager) KillAllConnections() {} + func (sm *mockSessionManager) UpdateTLSConfig(cfg *tls.Config) {} +func (sm *mockSessionManager) ServerID() uint64 { + return sm.serverID +} + +func (sm *mockSessionManager) SetServerID(serverID uint64) { + sm.serverID = serverID +} + type mockStore struct { - tikv.Storage + helper.Storage host string } func (s *mockStore) EtcdAddrs() ([]string, error) { return []string{s.host}, nil } func (s *mockStore) TLSConfig() *tls.Config { panic("not implemented") } func (s *mockStore) StartGCWorker() error { panic("not implemented") } +func (s *mockStore) Name() string { return "mockStore" } +func (s *mockStore) Describe() string { return "" } func (s *testInfoschemaClusterTableSuite) TestTiDBClusterInfo(c *C) { mockAddr := s.mockAddr store := &mockStore{ - s.store.(tikv.Storage), + s.store.(helper.Storage), mockAddr, } @@ -732,13 +769,18 @@ func (s *testInfoschemaClusterTableSuite) TestTiDBClusterInfo(c *C) { // information_schema.cluster_config instances := []string{ - "pd,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash", - "tidb,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash", - "tikv,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash", + "pd,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash,0", + "tidb,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash,1001", + "tikv,127.0.0.1:11080," + mockAddr + ",mock-version,mock-githash,0", } fpExpr := `return("` + strings.Join(instances, ";") + `")` c.Assert(failpoint.Enable("github.com/pingcap/tidb/infoschema/mockClusterInfo", fpExpr), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/infoschema/mockClusterInfo"), IsNil) }() + tk.MustQuery("select type, instance, status_address, version, git_hash, server_id from information_schema.cluster_info").Check(testkit.Rows( + row("pd", "127.0.0.1:11080", mockAddr, "mock-version", "mock-githash", "0"), + row("tidb", "127.0.0.1:11080", mockAddr, "mock-version", "mock-githash", "1001"), + row("tikv", "127.0.0.1:11080", mockAddr, "mock-version", "mock-githash", "0"), + )) tk.MustQuery("select * from information_schema.cluster_config").Check(testkit.Rows( "pd 127.0.0.1:11080 key1 value1", "pd 127.0.0.1:11080 key2.nest1 n-value1", @@ -775,7 +817,7 @@ func (s *testInfoschemaClusterTableSuite) TestTableStorageStats(c *C) { c.Assert(err.Error(), Equals, "pd unavailable") mockAddr := s.mockAddr store := &mockStore{ - s.store.(tikv.Storage), + s.store.(helper.Storage), mockAddr, } @@ -789,8 +831,7 @@ func (s *testInfoschemaClusterTableSuite) TestTableStorageStats(c *C) { // Test it would get null set when get the sys schema. tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'information_schema';").Check([][]interface{}{}) - tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Check([][]interface{}{}) - tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA in ('mysql', 'metrics_schema');").Check([][]interface{}{}) + tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA in ('information_schema', 'metrics_schema');").Check([][]interface{}{}) tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'information_schema' and TABLE_NAME='schemata';").Check([][]interface{}{}) tk.MustExec("use test") @@ -806,6 +847,7 @@ func (s *testInfoschemaClusterTableSuite) TestTableStorageStats(c *C) { tk.MustQuery("select TABLE_SCHEMA, sum(TABLE_SIZE) from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'test' group by TABLE_SCHEMA;").Check(testkit.Rows( "test 2", )) + c.Assert(len(tk.MustQuery("select TABLE_NAME from information_schema.TABLE_STORAGE_STATS where TABLE_SCHEMA = 'mysql';").Rows()), Equals, 23) } func (s *testInfoschemaTableSuite) TestSequences(c *C) { @@ -830,12 +872,12 @@ func (s *testInfoschemaTableSuite) TestTiFlashSystemTables(c *C) { func (s *testInfoschemaTableSuite) TestTablesPKType(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("create table t_int (a int primary key, b int)") - tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'test' and table_name = 't_int'").Check(testkit.Rows("INT CLUSTERED")) - tk.MustExec("set @@tidb_enable_clustered_index = 0") + tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'test' and table_name = 't_int'").Check(testkit.Rows("CLUSTERED")) + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t_implicit (a varchar(64) primary key, b int)") tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'test' and table_name = 't_implicit'").Check(testkit.Rows("NON-CLUSTERED")) - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t_common (a varchar(64) primary key, b int)") - tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'test' and table_name = 't_common'").Check(testkit.Rows("COMMON CLUSTERED")) + tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'test' and table_name = 't_common'").Check(testkit.Rows("CLUSTERED")) tk.MustQuery("SELECT TIDB_PK_TYPE FROM information_schema.tables where table_schema = 'INFORMATION_SCHEMA' and table_name = 'TABLES'").Check(testkit.Rows("NON-CLUSTERED")) } diff --git a/executor/insert.go b/executor/insert.go index a409c03c457b8..178aefed5fb8b 100644 --- a/executor/insert.go +++ b/executor/insert.go @@ -119,6 +119,9 @@ func prefetchUniqueIndices(ctx context.Context, txn kv.Transaction, rows []toBeC nKeys := 0 for _, r := range rows { + if r.ignored { + continue + } if r.handleKey != nil { nKeys++ } @@ -126,6 +129,9 @@ func prefetchUniqueIndices(ctx context.Context, txn kv.Transaction, rows []toBeC } batchKeys := make([]kv.Key, 0, nKeys) for _, r := range rows { + if r.ignored { + continue + } if r.handleKey != nil { batchKeys = append(batchKeys, r.handleKey.newKey) } @@ -151,7 +157,7 @@ func prefetchConflictedOldRows(ctx context.Context, txn kv.Transaction, rows []t if err != nil { return err } - batchKeys = append(batchKeys, r.t.RecordKey(handle)) + batchKeys = append(batchKeys, tablecodec.EncodeRecordKey(r.t.RecordPrefix(), handle)) } } } @@ -173,11 +179,16 @@ func prefetchDataCache(ctx context.Context, txn kv.Transaction, rows []toBeCheck } // updateDupRow updates a duplicate row to a new row. -func (e *InsertExec) updateDupRow(ctx context.Context, txn kv.Transaction, row toBeCheckedRow, handle kv.Handle, onDuplicate []*expression.Assignment) error { +func (e *InsertExec) updateDupRow(ctx context.Context, idxInBatch int, txn kv.Transaction, row toBeCheckedRow, handle kv.Handle, onDuplicate []*expression.Assignment) error { oldRow, err := getOldRow(ctx, e.ctx, txn, row.t, handle, e.GenExprs) if err != nil { return err } + // get the extra columns from the SELECT clause and get the final `oldRow`. + if len(e.ctx.GetSessionVars().CurrInsertBatchExtraCols) > 0 { + extraCols := e.ctx.GetSessionVars().CurrInsertBatchExtraCols[idxInBatch] + oldRow = append(oldRow, extraCols...) + } err = e.doDupRowUpdate(ctx, handle, oldRow, row.row, e.OnDuplicate) if e.ctx.GetSessionVars().StmtCtx.DupKeyAsWarning && kv.ErrKeyExists.Equal(err) { @@ -223,7 +234,7 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D return err } - err = e.updateDupRow(ctx, txn, r, handle, e.OnDuplicate) + err = e.updateDupRow(ctx, i, txn, r, handle, e.OnDuplicate) if err == nil { continue } @@ -245,7 +256,7 @@ func (e *InsertExec) batchUpdateDupRows(ctx context.Context, newRows [][]types.D return err } - err = e.updateDupRow(ctx, txn, r, handle, e.OnDuplicate) + err = e.updateDupRow(ctx, i, txn, r, handle, e.OnDuplicate) if err != nil { if kv.IsErrNotFound(err) { // Data index inconsistent? A unique key provide the handle information, but the @@ -291,6 +302,7 @@ func (e *InsertExec) Next(ctx context.Context, req *chunk.Chunk) error { // Close implements the Executor Close interface. func (e *InsertExec) Close() error { e.ctx.GetSessionVars().CurrInsertValues = chunk.Row{} + e.ctx.GetSessionVars().CurrInsertBatchExtraCols = e.ctx.GetSessionVars().CurrInsertBatchExtraCols[0:0:0] e.setMessage() if e.SelectExec != nil { return e.SelectExec.Close() @@ -321,12 +333,20 @@ func (e *InsertExec) initEvalBuffer4Dup() { // Use writable columns for old row for update. numWritableCols := len(e.Table.WritableCols()) - evalBufferTypes := make([]*types.FieldType, 0, numCols+numWritableCols) + extraLen := 0 + if e.SelectExec != nil { + extraLen = e.SelectExec.Schema().Len() - e.rowLen + } + + evalBufferTypes := make([]*types.FieldType, 0, numCols+numWritableCols+extraLen) // Append the old row before the new row, to be consistent with "Schema4OnDuplicate" in the "Insert" PhysicalPlan. for _, col := range e.Table.WritableCols() { evalBufferTypes = append(evalBufferTypes, &col.FieldType) } + if extraLen > 0 { + evalBufferTypes = append(evalBufferTypes, e.SelectExec.base().retFieldTypes[numWritableCols:]...) + } for _, col := range e.Table.Cols() { evalBufferTypes = append(evalBufferTypes, &col.FieldType) } @@ -392,7 +412,7 @@ func (e *InsertExec) setMessage() { numDuplicates = stmtCtx.UpdatedRows() } } - msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInsertInfo], numRecords, numDuplicates, numWarnings) + msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInsertInfo].Raw, numRecords, numDuplicates, numWarnings) stmtCtx.SetMessage(msg) } } diff --git a/executor/insert_common.go b/executor/insert_common.go index 6e0c944172ec5..1a1586c6e2341 100644 --- a/executor/insert_common.go +++ b/executor/insert_common.go @@ -18,6 +18,7 @@ import ( "context" "fmt" "math" + "sync" "time" "github.com/opentracing/opentracing-go" @@ -27,14 +28,17 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" @@ -42,6 +46,7 @@ import ( ) // InsertValues is the data to insert. +// nolint:structcheck type InsertValues struct { baseExecutor @@ -79,7 +84,15 @@ type InsertValues struct { lazyFillAutoID bool memTracker *memory.Tracker + rowLen int + stats *InsertRuntimeStat + + // LoadData use two goroutines. One for generate batch data, + // The other one for commit task, which will invalid txn. + // We use mutex to protect routine from using invalid txn. + isLoadData bool + txnInUse sync.Mutex } type defaultVal struct { @@ -150,7 +163,6 @@ func (e *InsertValues) initInsertColumns() error { return errors.Errorf("insert, update and replace statements for _tidb_rowid are not supported.") } e.hasExtraHandle = true - break } } @@ -291,10 +303,19 @@ func (e *InsertValues) handleErr(col *table.Column, val *types.Datum, rowIdx int err = types.ErrWarnDataOutOfRange.GenWithStackByArgs(colName, rowIdx+1) } else if types.ErrTruncated.Equal(err) { err = types.ErrTruncated.GenWithStackByArgs(colName, rowIdx+1) + } else if types.ErrTruncatedWrongVal.Equal(err) && (colTp == mysql.TypeDuration || colTp == mysql.TypeDatetime || colTp == mysql.TypeDate || colTp == mysql.TypeTimestamp) { + valStr, err1 := val.ToString() + if err1 != nil { + logutil.BgLogger().Debug("time truncated error", zap.Error(err1)) + } + err = dbterror.ClassTable.NewStdErr( + errno.ErrTruncatedWrongValue, + mysql.Message("Incorrect %-.32s value: '%-.128s' for column '%.192s' at row %d", nil), + ).GenWithStackByArgs(types.TypeStr(colTp), valStr, colName, rowIdx+1) } else if types.ErrTruncatedWrongVal.Equal(err) || types.ErrWrongValue.Equal(err) { valStr, err1 := val.ToString() if err1 != nil { - logutil.BgLogger().Warn("truncate value failed", zap.Error(err1)) + logutil.BgLogger().Debug("truncated/wrong value error", zap.Error(err1)) } err = table.ErrTruncatedWrongValueForField.GenWithStackByArgs(types.TypeStr(colTp), valStr, colName, rowIdx+1) } @@ -409,14 +430,12 @@ func insertRowsFromSelect(ctx context.Context, base insertCommon) error { rows := make([][]types.Datum, 0, chk.Capacity()) sessVars := e.ctx.GetSessionVars() - if !sessVars.StrictSQLMode { - // If StrictSQLMode is disabled and it is a insert-select statement, it also handle BadNullAsWarning. - sessVars.StmtCtx.BadNullAsWarning = true - } batchSize := sessVars.DMLBatchSize batchInsert := sessVars.BatchInsert && !sessVars.InTxn() && config.GetGlobalConfig().EnableBatchDML && batchSize > 0 memUsageOfRows := int64(0) + memUsageOfExtraCols := int64(0) memTracker := e.memTracker + extraColsInSel := make([][]types.Datum, 0, chk.Capacity()) for { err := Next(ctx, selectExec, chk) if err != nil { @@ -434,15 +453,20 @@ func insertRowsFromSelect(ctx context.Context, base insertCommon) error { if err != nil { return err } + extraColsInSel = append(extraColsInSel, innerRow[e.rowLen:]) rows = append(rows, row) if batchInsert && e.rowCount%uint64(batchSize) == 0 { memUsageOfRows = types.EstimatedMemUsage(rows[0], len(rows)) - memTracker.Consume(memUsageOfRows) + memUsageOfExtraCols = types.EstimatedMemUsage(extraColsInSel[0], len(extraColsInSel)) + memTracker.Consume(memUsageOfRows + memUsageOfExtraCols) + e.ctx.GetSessionVars().CurrInsertBatchExtraCols = extraColsInSel if err = base.exec(ctx, rows); err != nil { return err } rows = rows[:0] + extraColsInSel = extraColsInSel[:0] memTracker.Consume(-memUsageOfRows) + memTracker.Consume(-memUsageOfExtraCols) memUsageOfRows = 0 if err = e.doBatchInsert(ctx); err != nil { return err @@ -452,20 +476,29 @@ func insertRowsFromSelect(ctx context.Context, base insertCommon) error { if len(rows) != 0 { memUsageOfRows = types.EstimatedMemUsage(rows[0], len(rows)) - memTracker.Consume(memUsageOfRows) + memUsageOfExtraCols = types.EstimatedMemUsage(extraColsInSel[0], len(extraColsInSel)) + memTracker.Consume(memUsageOfRows + memUsageOfExtraCols) + e.ctx.GetSessionVars().CurrInsertBatchExtraCols = extraColsInSel } err = base.exec(ctx, rows) if err != nil { return err } rows = rows[:0] + extraColsInSel = extraColsInSel[:0] memTracker.Consume(-memUsageOfRows) + memTracker.Consume(-memUsageOfExtraCols) memTracker.Consume(-chkMemUsage) } return nil } func (e *InsertValues) doBatchInsert(ctx context.Context) error { + txn, err := e.ctx.Txn(false) + if err != nil { + return ErrBatchInsertFail.GenWithStack("BatchInsert failed with error: %v", err) + } + e.memTracker.Consume(-int64(txn.Size())) e.ctx.StmtCommit() if err := e.ctx.NewTxn(ctx); err != nil { // We should return a special error for batch insert. @@ -480,9 +513,9 @@ func (e *InsertValues) doBatchInsert(ctx context.Context) error { func (e *InsertValues) getRow(ctx context.Context, vals []types.Datum) ([]types.Datum, error) { row := make([]types.Datum, len(e.Table.Cols())) hasValue := make([]bool, len(e.Table.Cols())) - for i, v := range vals { - casted, err := table.CastValue(e.ctx, v, e.insertColumns[i].ToInfo(), false, false) - if e.handleErr(nil, &v, 0, err) != nil { + for i := 0; i < e.rowLen; i++ { + casted, err := table.CastValue(e.ctx, vals[i], e.insertColumns[i].ToInfo(), false, false) + if e.handleErr(nil, &vals[i], 0, err) != nil { return nil, err } @@ -543,6 +576,13 @@ func (e *InsertValues) fillColValue(ctx context.Context, datum types.Datum, idx } return d, nil } + if column.ID == model.ExtraHandleID && hasValue { + d, err := e.adjustImplicitRowID(ctx, datum, hasValue, column) + if err != nil { + return types.Datum{}, err + } + return d, nil + } if !hasValue { d, err := e.getColDefaultValue(idx, column) if e.handleErr(column, &datum, 0, err) != nil { @@ -561,7 +601,14 @@ func (e *InsertValues) fillColValue(ctx context.Context, datum types.Datum, idx // https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue []bool) ([]types.Datum, error) { gCols := make([]*table.Column, 0) - for i, c := range e.Table.Cols() { + tCols := e.Table.Cols() + if e.hasExtraHandle { + col := &table.Column{} + col.ColumnInfo = model.NewExtraHandleColInfo() + col.ColumnInfo.Offset = len(tCols) + tCols = append(tCols, col) + } + for i, c := range tCols { var err error // Evaluate the generated columns later after real columns set if c.IsGenerated() { @@ -581,7 +628,7 @@ func (e *InsertValues) fillRow(ctx context.Context, row []types.Datum, hasValue for i, gCol := range gCols { colIdx := gCol.ColumnInfo.Offset val, err := e.GenExprs[i].Eval(chunk.MutRowFromDatums(row).ToRow()) - if e.handleErr(gCol, &val, 0, err) != nil { + if e.ctx.GetSessionVars().StmtCtx.HandleTruncate(err) != nil { return nil, err } row[colIdx], err = table.CastValue(e.ctx, val, gCol.ToInfo(), false, false) @@ -619,41 +666,20 @@ func (e *InsertValues) isAutoNull(ctx context.Context, d types.Datum, col *table return false } -func (e *InsertValues) hasAutoIncrementColumn() (int, bool) { - colIdx := -1 - for i, c := range e.Table.Cols() { +func findAutoIncrementColumn(t table.Table) (col *table.Column, offsetInRow int, found bool) { + for i, c := range t.Cols() { if mysql.HasAutoIncrementFlag(c.Flag) { - colIdx = i - break + return c, i, true } } - return colIdx, colIdx != -1 + return nil, -1, false } -func (e *InsertValues) lazyAdjustAutoIncrementDatumInRetry(ctx context.Context, rows [][]types.Datum, colIdx int) ([][]types.Datum, error) { - // Get the autoIncrement column. - col := e.Table.Cols()[colIdx] - // Consider the colIdx of autoIncrement in row are the same. - length := len(rows) - for i := 0; i < length; i++ { - autoDatum := rows[i][colIdx] - - // autoID can be found in RetryInfo. - retryInfo := e.ctx.GetSessionVars().RetryInfo - if retryInfo.Retrying { - id, err := retryInfo.GetCurrAutoIncrementID() - if err != nil { - return nil, err - } - autoDatum.SetAutoID(id, col.Flag) - - if err = col.HandleBadNull(&autoDatum, e.ctx.GetSessionVars().StmtCtx); err != nil { - return nil, err - } - rows[i][colIdx] = autoDatum - } - } - return rows, nil +func setDatumAutoIDAndCast(ctx sessionctx.Context, d *types.Datum, id int64, col *table.Column) error { + d.SetAutoID(id, col.Flag) + var err error + *d, err = table.CastValue(ctx, *d, col.ToInfo(), false, false) + return err } // lazyAdjustAutoIncrementDatum is quite similar to adjustAutoIncrementDatum @@ -663,22 +689,14 @@ func (e *InsertValues) lazyAdjustAutoIncrementDatum(ctx context.Context, rows [] if !e.lazyFillAutoID { return rows, nil } - // No autoIncrement column means no need to fill. - colIdx, ok := e.hasAutoIncrementColumn() - if !ok { + col, idx, found := findAutoIncrementColumn(e.Table) + if !found { return rows, nil } - // autoID can be found in RetryInfo. retryInfo := e.ctx.GetSessionVars().RetryInfo - if retryInfo.Retrying { - return e.lazyAdjustAutoIncrementDatumInRetry(ctx, rows, colIdx) - } - // Get the autoIncrement column. - col := e.Table.Cols()[colIdx] - // Consider the colIdx of autoIncrement in row are the same. - length := len(rows) - for i := 0; i < length; i++ { - autoDatum := rows[i][colIdx] + rowCount := len(rows) + for processedIdx := 0; processedIdx < rowCount; processedIdx++ { + autoDatum := rows[processedIdx][idx] var err error var recordID int64 @@ -696,18 +714,32 @@ func (e *InsertValues) lazyAdjustAutoIncrementDatum(ctx context.Context, rows [] } e.ctx.GetSessionVars().StmtCtx.InsertID = uint64(recordID) retryInfo.AddAutoIncrementID(recordID) - rows[i][colIdx] = autoDatum continue } // Change NULL to auto id. // Change value 0 to auto id, if NoAutoValueOnZero SQL mode is not set. if autoDatum.IsNull() || e.ctx.GetSessionVars().SQLMode&mysql.ModeNoAutoValueOnZero == 0 { + // Consume the auto IDs in RetryInfo first. + for retryInfo.Retrying && processedIdx < rowCount { + nextID, ok := retryInfo.GetCurrAutoIncrementID() + if !ok { + break + } + err = setDatumAutoIDAndCast(e.ctx, &rows[processedIdx][idx], nextID, col) + if err != nil { + return nil, err + } + processedIdx++ + if processedIdx == rowCount { + return rows, nil + } + } // Find consecutive num. - start := i + start := processedIdx cnt := 1 - for i+1 < length && e.isAutoNull(ctx, rows[i+1][colIdx], col) { - i++ + for processedIdx+1 < rowCount && e.isAutoNull(ctx, rows[processedIdx+1][idx], col) { + processedIdx++ cnt++ } // AllocBatchAutoIncrementValue allocates batch N consecutive autoIDs. @@ -724,31 +756,21 @@ func (e *InsertValues) lazyAdjustAutoIncrementDatum(ctx context.Context, rows [] // Assign autoIDs to rows. for j := 0; j < cnt; j++ { offset := j + start - d := rows[offset][colIdx] - id := int64(uint64(min) + uint64(j)*uint64(increment)) - d.SetAutoID(id, col.Flag) - retryInfo.AddAutoIncrementID(id) - - // The value of d is adjusted by auto ID, so we need to cast it again. - d, err := table.CastValue(e.ctx, d, col.ToInfo(), false, false) + err = setDatumAutoIDAndCast(e.ctx, &rows[offset][idx], id, col) if err != nil { return nil, err } - rows[offset][colIdx] = d + retryInfo.AddAutoIncrementID(id) } continue } - autoDatum.SetAutoID(recordID, col.Flag) - retryInfo.AddAutoIncrementID(recordID) - - // the value of d is adjusted by auto ID, so we need to cast it again. - autoDatum, err = table.CastValue(e.ctx, autoDatum, col.ToInfo(), false, false) + err = setDatumAutoIDAndCast(e.ctx, &rows[processedIdx][idx], recordID, col) if err != nil { return nil, err } - rows[i][colIdx] = autoDatum + retryInfo.AddAutoIncrementID(recordID) } return rows, nil } @@ -756,12 +778,11 @@ func (e *InsertValues) lazyAdjustAutoIncrementDatum(ctx context.Context, rows [] func (e *InsertValues) adjustAutoIncrementDatum(ctx context.Context, d types.Datum, hasValue bool, c *table.Column) (types.Datum, error) { retryInfo := e.ctx.GetSessionVars().RetryInfo if retryInfo.Retrying { - id, err := retryInfo.GetCurrAutoIncrementID() - if err != nil { - return types.Datum{}, err + id, ok := retryInfo.GetCurrAutoIncrementID() + if ok { + d.SetAutoID(id, c.Flag) + return d, nil } - d.SetAutoID(id, c.Flag) - return d, nil } var err error @@ -800,20 +821,16 @@ func (e *InsertValues) adjustAutoIncrementDatum(ctx context.Context, d types.Dat } } - d.SetAutoID(recordID, c.Flag) - retryInfo.AddAutoIncrementID(recordID) - - // the value of d is adjusted by auto ID, so we need to cast it again. - casted, err := table.CastValue(e.ctx, d, c.ToInfo(), false, false) + err = setDatumAutoIDAndCast(e.ctx, &d, recordID, c) if err != nil { return types.Datum{}, err } - return casted, nil + retryInfo.AddAutoIncrementID(recordID) + return d, nil } func getAutoRecordID(d types.Datum, target *types.FieldType, isInsert bool) (int64, error) { var recordID int64 - switch target.Tp { case mysql.TypeFloat, mysql.TypeDouble: f := d.GetFloat64() @@ -834,12 +851,11 @@ func getAutoRecordID(d types.Datum, target *types.FieldType, isInsert bool) (int func (e *InsertValues) adjustAutoRandomDatum(ctx context.Context, d types.Datum, hasValue bool, c *table.Column) (types.Datum, error) { retryInfo := e.ctx.GetSessionVars().RetryInfo if retryInfo.Retrying { - autoRandomID, err := retryInfo.GetCurrAutoRandomID() - if err != nil { - return types.Datum{}, err + autoRandomID, ok := retryInfo.GetCurrAutoRandomID() + if ok { + d.SetAutoID(autoRandomID, c.Flag) + return d, nil } - d.SetAutoID(autoRandomID, c.Flag) - return d, nil } var err error @@ -871,11 +887,7 @@ func (e *InsertValues) adjustAutoRandomDatum(ctx context.Context, d types.Datum, // Change NULL to auto id. // Change value 0 to auto id, if NoAutoValueOnZero SQL mode is not set. if d.IsNull() || e.ctx.GetSessionVars().SQLMode&mysql.ModeNoAutoValueOnZero == 0 { - _, err := e.ctx.Txn(true) - if err != nil { - return types.Datum{}, errors.Trace(err) - } - recordID, err = e.allocAutoRandomID(&c.FieldType) + recordID, err = e.allocAutoRandomID(ctx, &c.FieldType) if err != nil { return types.Datum{}, err } @@ -886,30 +898,36 @@ func (e *InsertValues) adjustAutoRandomDatum(ctx context.Context, d types.Datum, } } - d.SetAutoID(recordID, c.Flag) - retryInfo.AddAutoRandomID(recordID) - - casted, err := table.CastValue(e.ctx, d, c.ToInfo(), false, false) + err = setDatumAutoIDAndCast(e.ctx, &d, recordID, c) if err != nil { return types.Datum{}, err } - return casted, nil + retryInfo.AddAutoRandomID(recordID) + return d, nil } // allocAutoRandomID allocates a random id for primary key column. It assumes tableInfo.AutoRandomBits > 0. -func (e *InsertValues) allocAutoRandomID(fieldType *types.FieldType) (int64, error) { +func (e *InsertValues) allocAutoRandomID(ctx context.Context, fieldType *types.FieldType) (int64, error) { alloc := e.Table.Allocators(e.ctx).Get(autoid.AutoRandomType) tableInfo := e.Table.Meta() increment := e.ctx.GetSessionVars().AutoIncrementIncrement offset := e.ctx.GetSessionVars().AutoIncrementOffset - _, autoRandomID, err := alloc.Alloc(tableInfo.ID, 1, int64(increment), int64(offset)) + _, autoRandomID, err := alloc.Alloc(ctx, tableInfo.ID, 1, int64(increment), int64(offset)) if err != nil { return 0, err } - layout := autoid.NewAutoRandomIDLayout(fieldType, tableInfo.AutoRandomBits) + layout := autoid.NewShardIDLayout(fieldType, tableInfo.AutoRandomBits) if tables.OverflowShardBits(autoRandomID, tableInfo.AutoRandomBits, layout.TypeBitsLength, layout.HasSignBit) { return 0, autoid.ErrAutoRandReadFailed } + if e.isLoadData { + e.txnInUse.Lock() + defer e.txnInUse.Unlock() + } + _, err = e.ctx.Txn(true) + if err != nil { + return 0, err + } shard := e.ctx.GetSessionVars().TxnCtx.GetShard(tableInfo.AutoRandomBits, layout.TypeBitsLength, layout.HasSignBit, 1) autoRandomID |= shard return autoRandomID, nil @@ -922,12 +940,66 @@ func (e *InsertValues) rebaseAutoRandomID(recordID int64, fieldType *types.Field alloc := e.Table.Allocators(e.ctx).Get(autoid.AutoRandomType) tableInfo := e.Table.Meta() - layout := autoid.NewAutoRandomIDLayout(fieldType, tableInfo.AutoRandomBits) + layout := autoid.NewShardIDLayout(fieldType, tableInfo.AutoRandomBits) autoRandomID := layout.IncrementalMask() & recordID return alloc.Rebase(tableInfo.ID, autoRandomID, true) } +func (e *InsertValues) adjustImplicitRowID(ctx context.Context, d types.Datum, hasValue bool, c *table.Column) (types.Datum, error) { + var err error + var recordID int64 + if !hasValue { + d.SetNull() + } + if !d.IsNull() { + recordID = d.GetInt64() + } + // Use the value if it's not null and not 0. + if recordID != 0 { + if !e.ctx.GetSessionVars().AllowWriteRowID { + return types.Datum{}, errors.Errorf("insert, update and replace statements for _tidb_rowid are not supported.") + } + err = e.rebaseImplicitRowID(recordID) + if err != nil { + return types.Datum{}, err + } + d.SetInt64(recordID) + return d, nil + } + // Change NULL to auto id. + // Change value 0 to auto id, if NoAutoValueOnZero SQL mode is not set. + if d.IsNull() || e.ctx.GetSessionVars().SQLMode&mysql.ModeNoAutoValueOnZero == 0 { + _, err := e.ctx.Txn(true) + if err != nil { + return types.Datum{}, errors.Trace(err) + } + intHandle, err := tables.AllocHandle(ctx, e.ctx, e.Table) + if err != nil { + return types.Datum{}, err + } + recordID = intHandle.IntValue() + } + err = setDatumAutoIDAndCast(e.ctx, &d, recordID, c) + if err != nil { + return types.Datum{}, err + } + return d, nil +} + +func (e *InsertValues) rebaseImplicitRowID(recordID int64) error { + if recordID < 0 { + return nil + } + alloc := e.Table.Allocators(e.ctx).Get(autoid.RowIDAllocType) + tableInfo := e.Table.Meta() + + layout := autoid.NewShardIDLayout(types.NewFieldType(mysql.TypeLonglong), tableInfo.ShardRowIDBits) + newTiDBRowIDBase := layout.IncrementalMask() & recordID + + return alloc.Rebase(tableInfo.ID, newTiDBRowIDBase, true) +} + func (e *InsertValues) handleWarning(err error) { sc := e.ctx.GetSessionVars().StmtCtx sc.AppendWarning(err) @@ -988,6 +1060,9 @@ func (e *InsertValues) batchCheckAndInsert(ctx context.Context, rows [][]types.D // append warnings and get no duplicated error rows for i, r := range toBeCheckedRows { + if r.ignored { + continue + } skip := false if r.handleKey != nil { _, err := txn.Get(ctx, r.handleKey.newKey) @@ -1047,6 +1122,7 @@ func (e *InsertValues) addRecordWithAutoIDHint(ctx context.Context, row []types. if err != nil { return err } + vars.StmtCtx.AddAffectedRows(1) if e.lastInsertID != 0 { vars.SetLastInsertID(e.lastInsertID) } @@ -1065,20 +1141,25 @@ func (e *InsertRuntimeStat) String() string { if e.CheckInsertTime == 0 { // For replace statement. if e.Prefetch > 0 && e.SnapshotRuntimeStats != nil { - return fmt.Sprintf("prefetch: %v, rpc:{%v}", e.Prefetch, e.SnapshotRuntimeStats.String()) + return fmt.Sprintf("prefetch: %v, rpc:{%v}", execdetails.FormatDuration(e.Prefetch), e.SnapshotRuntimeStats.String()) } return "" } buf := bytes.NewBuffer(make([]byte, 0, 32)) - buf.WriteString(fmt.Sprintf("prepare:%v, ", time.Duration(e.BasicRuntimeStats.GetTime())-e.CheckInsertTime)) + buf.WriteString(fmt.Sprintf("prepare:%v, ", execdetails.FormatDuration(time.Duration(e.BasicRuntimeStats.GetTime())-e.CheckInsertTime))) if e.Prefetch > 0 { - buf.WriteString(fmt.Sprintf("check_insert:{total_time:%v, mem_insert_time:%v, prefetch:%v", e.CheckInsertTime, e.CheckInsertTime-e.Prefetch, e.Prefetch)) + buf.WriteString(fmt.Sprintf("check_insert: {total_time: %v, mem_insert_time: %v, prefetch: %v", + execdetails.FormatDuration(e.CheckInsertTime), + execdetails.FormatDuration(e.CheckInsertTime-e.Prefetch), + execdetails.FormatDuration(e.Prefetch))) if e.SnapshotRuntimeStats != nil { - buf.WriteString(fmt.Sprintf(", rpc:{%s}", e.SnapshotRuntimeStats.String())) + if rpc := e.SnapshotRuntimeStats.String(); len(rpc) > 0 { + buf.WriteString(fmt.Sprintf(", rpc:{%s}", rpc)) + } } buf.WriteString("}") } else { - buf.WriteString(fmt.Sprintf("insert:%v", e.CheckInsertTime)) + buf.WriteString(fmt.Sprintf("insert:%v", execdetails.FormatDuration(e.CheckInsertTime))) } return buf.String() } diff --git a/executor/insert_test.go b/executor/insert_test.go index cf174760f5dd0..467e9e022c77e 100644 --- a/executor/insert_test.go +++ b/executor/insert_test.go @@ -198,6 +198,15 @@ func (s *testSuite8) TestInsertOnDuplicateKey(c *C) { c.Assert(tk.Se.AffectedRows(), Equals, uint64(7)) tk.CheckLastMessage("Records: 5 Duplicates: 2 Warnings: 0") + tk.MustExec("drop table if exists a, b") + tk.MustExec("create table a(x int primary key)") + tk.MustExec("create table b(x int, y int)") + tk.MustExec("insert into a values(1)") + tk.MustExec("insert into b values(1, 2)") + tk.MustExec("insert into a select x from b ON DUPLICATE KEY UPDATE a.x=b.y") + c.Assert(tk.Se.AffectedRows(), Equals, uint64(2)) + tk.MustQuery("select * from a").Check(testkit.Rows("2")) + // reproduce insert on duplicate key update bug under new row format. tk.MustExec(`drop table if exists t1`) tk.MustExec(`create table t1(c1 decimal(6,4), primary key(c1))`) @@ -211,7 +220,7 @@ func (s *testSuite8) TestClusterIndexInsertOnDuplicateKey(c *C) { tk.MustExec("drop database if exists cluster_index_duplicate_entry_error;") tk.MustExec("create database cluster_index_duplicate_entry_error;") tk.MustExec("use cluster_index_duplicate_entry_error;") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(a char(20), b int, primary key(a));") tk.MustExec("insert into t values('aa', 1), ('bb', 1);") @@ -228,7 +237,7 @@ func (s *testSuite8) TestClusterIndexInsertOnDuplicateKey(c *C) { func (s *testSuite10) TestPaddingCommonHandle(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`create table t1(c1 decimal(6,4), primary key(c1))`) tk.MustExec(`insert into t1 set c1 = 0.1`) tk.MustExec(`insert into t1 set c1 = 0.1 on duplicate key update c1 = 1`) @@ -321,7 +330,7 @@ func (s *testSuite3) TestInsertWrongValueForField(c *C) { tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a year);`) _, err = tk.Exec(`insert into t values(2156);`) - c.Assert(err.Error(), Equals, `[types:1264]Out of range value for column 'a' at row 1`) + c.Assert(err.Error(), Equals, `[types:8033]invalid year`) } func (s *testSuite3) TestInsertDateTimeWithTimeZone(c *C) { @@ -337,6 +346,93 @@ func (s *testSuite3) TestInsertDateTimeWithTimeZone(c *C) { tk.MustQuery(`select * from t;`).Check(testkit.Rows( `1 1970-01-01 09:20:34`, )) + + // test for ambiguous cases + cases := []struct { + lit string + expect string + }{ + {"2020-10-22", "2020-10-22 00:00:00"}, + {"2020-10-22-16", "2020-10-22 16:00:00"}, + {"2020-10-22 16-31", "2020-10-22 16:31:00"}, + {"2020-10-22 16:31-15", "2020-10-22 16:31:15"}, + {"2020-10-22T16:31:15-10", "2020-10-23 10:31:15"}, + + {"2020.10-22", "2020-10-22 00:00:00"}, + {"2020-10.22-16", "2020-10-22 16:00:00"}, + {"2020-10-22.16-31", "2020-10-22 16:31:00"}, + {"2020-10-22 16.31-15", "2020-10-22 16:31:15"}, + {"2020-10-22T16.31.15+14", "2020-10-22 10:31:15"}, + + {"2020-10:22", "2020-10-22 00:00:00"}, + {"2020-10-22:16", "2020-10-22 16:00:00"}, + {"2020-10-22-16:31", "2020-10-22 16:31:00"}, + {"2020-10-22 16-31:15", "2020-10-22 16:31:15"}, + {"2020-10-22T16.31.15+09:30", "2020-10-22 15:01:15"}, + + {"2020.10-22:16", "2020-10-22 16:00:00"}, + {"2020-10.22-16:31", "2020-10-22 16:31:00"}, + {"2020-10-22.16-31:15", "2020-10-22 16:31:15"}, + {"2020-10-22T16:31.15+09:30", "2020-10-22 15:01:15"}, + } + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t (dt datetime)`) + tk.MustExec(`set @@time_zone='+08:00'`) + for _, ca := range cases { + tk.MustExec(`delete from t`) + tk.MustExec(fmt.Sprintf("insert into t values ('%s')", ca.lit)) + tk.MustQuery(`select * from t`).Check(testkit.Rows(ca.expect)) + } + + // test for time zone change + tzcCases := []struct { + tz1 string + lit string + tz2 string + exp1 string + exp2 string + }{ + {"+08:00", "2020-10-22T16:53:40Z", "+00:00", "2020-10-23 00:53:40", "2020-10-22 16:53:40"}, + {"-08:00", "2020-10-22T16:53:40Z", "+08:00", "2020-10-22 08:53:40", "2020-10-23 00:53:40"}, + {"-03:00", "2020-10-22T16:53:40+03:00", "+08:00", "2020-10-22 10:53:40", "2020-10-22 21:53:40"}, + {"+08:00", "2020-10-22T16:53:40+08:00", "+08:00", "2020-10-22 16:53:40", "2020-10-22 16:53:40"}, + } + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (dt datetime, ts timestamp)") + for _, ca := range tzcCases { + tk.MustExec("delete from t") + tk.MustExec(fmt.Sprintf("set @@time_zone='%s'", ca.tz1)) + tk.MustExec(fmt.Sprintf("insert into t values ('%s', '%s')", ca.lit, ca.lit)) + tk.MustExec(fmt.Sprintf("set @@time_zone='%s'", ca.tz2)) + tk.MustQuery("select * from t").Check(testkit.Rows(ca.exp1 + " " + ca.exp2)) + } + + // test for datetime in compare + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (ts timestamp)") + tk.MustExec("insert into t values ('2020-10-22T12:00:00Z'), ('2020-10-22T13:00:00Z'), ('2020-10-22T14:00:00Z')") + tk.MustQuery(fmt.Sprintf("select count(*) from t where ts > '2020-10-22T12:00:00Z'")).Check(testkit.Rows("2")) + + // test for datetime with fsp + fspCases := []struct { + fsp uint + lit string + exp1 string + exp2 string + }{ + {2, "2020-10-27T14:39:10.10+00:00", "2020-10-27 22:39:10.10", "2020-10-27 22:39:10.10"}, + {1, "2020-10-27T14:39:10.3+0200", "2020-10-27 20:39:10.3", "2020-10-27 20:39:10.3"}, + {6, "2020-10-27T14:39:10.3-02", "2020-10-28 00:39:10.300000", "2020-10-28 00:39:10.300000"}, + {2, "2020-10-27T14:39:10.10Z", "2020-10-27 22:39:10.10", "2020-10-27 22:39:10.10"}, + } + + tk.MustExec("set @@time_zone='+08:00'") + for _, ca := range fspCases { + tk.MustExec("drop table if exists t") + tk.MustExec(fmt.Sprintf("create table t (dt datetime(%d), ts timestamp(%d))", ca.fsp, ca.fsp)) + tk.MustExec(fmt.Sprintf("insert into t values ('%s', '%s')", ca.lit, ca.lit)) + tk.MustQuery("select * from t").Check(testkit.Rows(ca.exp1 + " " + ca.exp2)) + } } func (s *testSuite3) TestInsertZeroYear(c *C) { @@ -945,12 +1041,19 @@ func (s *testSuite3) TestDMLCast(c *C) { func (s *testSuite3) TestInsertFloatOverflow(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec(`drop table if exists t;`) + tk.MustExec(`drop table if exists t,t1;`) tk.MustExec("create table t(col1 FLOAT, col2 FLOAT(10,2), col3 DOUBLE, col4 DOUBLE(10,2), col5 DECIMAL, col6 DECIMAL(10,2));") _, err := tk.Exec("insert into t values (-3.402823466E+68, -34028234.6611, -1.7976931348623157E+308, -17976921.34, -9999999999, -99999999.99);") c.Assert(err.Error(), Equals, "[types:1264]Out of range value for column 'col1' at row 1") _, err = tk.Exec("insert into t values (-34028234.6611, -3.402823466E+68, -1.7976931348623157E+308, -17976921.34, -9999999999, -99999999.99);") c.Assert(err.Error(), Equals, "[types:1264]Out of range value for column 'col2' at row 1") + _, err = tk.Exec("create table t1(id1 float,id2 float)") + c.Assert(err, IsNil) + _, err = tk.Exec("insert ignore into t1 values(999999999999999999999999999999999999999,-999999999999999999999999999999999999999)") + c.Assert(err, IsNil) + tk.MustQuery("select @@warning_count").Check(testutil.RowsWithSep("|", "2")) + tk.MustQuery("select convert(id1,decimal(65)),convert(id2,decimal(65)) from t1").Check(testkit.Rows("340282346638528860000000000000000000000 -340282346638528860000000000000000000000")) + tk.MustExec("drop table if exists t,t1") } // There is a potential issue in MySQL: when the value of auto_increment_offset is greater @@ -1204,7 +1307,7 @@ type testSuite10 struct { func (s *testSuite10) TestClusterPrimaryTablePlainInsert(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists t1pk`) tk.MustExec(`create table t1pk(id varchar(200) primary key, v int)`) @@ -1246,7 +1349,7 @@ func (s *testSuite10) TestClusterPrimaryTablePlainInsert(c *C) { func (s *testSuite10) TestClusterPrimaryTableInsertIgnore(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists it1pk`) tk.MustExec(`create table it1pk(id varchar(200) primary key, v int)`) @@ -1272,7 +1375,7 @@ func (s *testSuite10) TestClusterPrimaryTableInsertIgnore(c *C) { func (s *testSuite10) TestClusterPrimaryTableInsertDuplicate(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists dt1pi`) tk.MustExec(`create table dt1pi(id varchar(200) primary key, v int)`) @@ -1304,7 +1407,7 @@ func (s *testSuite10) TestClusterPrimaryTableInsertDuplicate(c *C) { func (s *testSuite10) TestClusterPrimaryKeyForIndexScan(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test`) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists pkt1;") tk.MustExec("CREATE TABLE pkt1 (a varchar(255), b int, index idx(b), primary key(a,b));") @@ -1341,10 +1444,10 @@ func (s *testSuite10) TestInsertRuntimeStat(c *C) { Prefetch: 1 * time.Second, } stats.BasicRuntimeStats.Record(5*time.Second, 1) - c.Assert(stats.String(), Equals, "prepare:3s, check_insert:{total_time:2s, mem_insert_time:1s, prefetch:1s}") + c.Assert(stats.String(), Equals, "prepare:3s, check_insert: {total_time: 2s, mem_insert_time: 1s, prefetch: 1s}") c.Assert(stats.String(), Equals, stats.Clone().String()) stats.Merge(stats.Clone()) - c.Assert(stats.String(), Equals, "prepare:6s, check_insert:{total_time:4s, mem_insert_time:2s, prefetch:2s}") + c.Assert(stats.String(), Equals, "prepare:6s, check_insert: {total_time: 4s, mem_insert_time: 2s, prefetch: 2s}") } func (s *testSerialSuite) TestDuplicateEntryMessage(c *C) { @@ -1353,8 +1456,8 @@ func (s *testSerialSuite) TestDuplicateEntryMessage(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test;") - for _, enable := range []int{0, 1} { - tk.MustExec(fmt.Sprintf("set session tidb_enable_clustered_index=%d;", enable)) + for _, enable := range []bool{true, false} { + tk.Se.GetSessionVars().EnableClusteredIndex = enable tk.MustExec("drop table if exists t;") tk.MustExec("create table t(a int, b char(10), unique key(b)) collate utf8mb4_general_ci;") tk.MustExec("insert into t value (34, '12Ak');") @@ -1394,9 +1497,59 @@ func (s *testSerialSuite) TestDuplicateEntryMessage(c *C) { tk.MustExec("create table t (a datetime, b int, c varchar(10), unique key (a, b, c)) collate utf8mb4_general_ci;") tk.MustExec("insert into t values ('2020-01-01', 1, 'aSDd');") tk.MustGetErrMsg("insert into t values ('2020-01-01', 1, 'ASDD');", "[kv:1062]Duplicate entry '2020-01-01 00:00:00-1-ASDD' for key 'a'") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a char(10) collate utf8mb4_unicode_ci, b char(20) collate utf8mb4_general_ci, c int(11), primary key (a, b, c), unique key (a));") + tk.MustExec("insert ignore into t values ('$', 'C', 10);") + tk.MustExec("insert ignore into t values ('$', 'C', 10);") + tk.MustQuery("show warnings;").Check(testutil.RowsWithSep("|", "Warning|1062|Duplicate entry '$-C-10' for key 'PRIMARY'")) + + tk.MustExec("begin pessimistic;") + tk.MustExec("insert into t values ('a7', 'a', 10);") + tk.MustGetErrMsg("insert into t values ('a7', 'a', 10);", "[kv:1062]Duplicate entry 'a7-a-10' for key 'PRIMARY'") + tk.MustExec("rollback;") + + // Test for large unsigned integer handle. + // See https://github.com/pingcap/tidb/issues/12420. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a bigint unsigned primary key);") + tk.MustExec("insert into t values(18446744073709551615);") + tk.MustGetErrMsg("insert into t values(18446744073709551615);", "[kv:1062]Duplicate entry '18446744073709551615' for key 'PRIMARY'") } } +func (s *testSerialSuite) TestIssue20768(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a year, primary key(a))") + tk.MustExec("insert ignore into t1 values(null)") + tk.MustExec("create table t2(a int, key(a))") + tk.MustExec("insert into t2 values(0)") + tk.MustQuery("select /*+ hash_join(t1) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) + tk.MustQuery("select /*+ inl_join(t1) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) + tk.MustQuery("select /*+ inl_join(t2) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) + tk.MustQuery("select /*+ inl_hash_join(t1) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) + tk.MustQuery("select /*+ inl_merge_join(t1) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) + tk.MustQuery("select /*+ merge_join(t1) */ * from t1 join t2 on t1.a = t2.a").Check(testkit.Rows("0 0")) +} + +func (s *testSuite9) TestIssue10402(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table vctt (v varchar(4), c char(4))") + tk.MustExec("insert into vctt values ('ab ', 'ab ')") + tk.MustQuery("select * from vctt").Check(testkit.Rows("ab ab")) + tk.MustExec("delete from vctt") + tk.Se.GetSessionVars().StmtCtx.SetWarnings(nil) + tk.MustExec("insert into vctt values ('ab\\n\\n\\n', 'ab\\n\\n\\n'), ('ab\\t\\t\\t', 'ab\\t\\t\\t'), ('ab ', 'ab '), ('ab\\r\\r\\r', 'ab\\r\\r\\r')") + c.Check(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(4)) + warns := tk.Se.GetSessionVars().StmtCtx.GetWarnings() + c.Check(fmt.Sprintf("%v", warns), Equals, "[{Warning [types:1265]Data truncated, field len 4, data len 5} {Warning [types:1265]Data truncated, field len 4, data len 5} {Warning [types:1265]Data truncated, field len 4, data len 6} {Warning [types:1265]Data truncated, field len 4, data len 5}]") + tk.MustQuery("select * from vctt").Check(testkit.Rows("ab\n\n ab\n\n", "ab\t\t ab\t\t", "ab ab", "ab\r\r ab\r\r")) + tk.MustQuery("select length(v), length(c) from vctt").Check(testkit.Rows("4 4", "4 4", "4 2", "4 4")) +} + func combination(items []string) func() []string { current := 1 buf := make([]string, len(items)) @@ -1414,3 +1567,23 @@ func combination(items []string) func() []string { return buf } } + +func (s *testSuite10) TestBinaryLiteralInsertToEnum(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec("drop table if exists bintest") + + tk.MustExec("create table bintest (h enum(0x61, '1', 'b')) character set utf8mb4") + tk.MustExec("insert into bintest(h) values(0x61)") + tk.MustQuery("select * from bintest").Check(testkit.Rows("a")) +} + +func (s *testSuite10) TestBinaryLiteralInsertToSet(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec("drop table if exists bintest") + + tk.MustExec("create table bintest (h set(0x61, '1', 'b')) character set utf8mb4") + tk.MustExec("insert into bintest(h) values(0x61)") + tk.MustQuery("select * from bintest").Check(testkit.Rows("a")) +} diff --git a/executor/inspection_common_test.go b/executor/inspection_common_test.go index ab6c382e38001..eb4f8db8ceca6 100644 --- a/executor/inspection_common_test.go +++ b/executor/inspection_common_test.go @@ -55,5 +55,6 @@ func (s *inspectionSummarySuite) TestInspectionRules(c *C) { rules, err := session.ResultSetToStringSlice(context.Background(), tk.Se, rs) c.Assert(err, IsNil) c.Assert(len(rules), Equals, ca.ruleCount) + c.Assert(rs.Close(), IsNil) } } diff --git a/executor/inspection_profile.go b/executor/inspection_profile.go index 56bf9153fa10f..478f0cc6aba42 100644 --- a/executor/inspection_profile.go +++ b/executor/inspection_profile.go @@ -165,7 +165,13 @@ func (n *metricNode) getLabelValue(label string) *metricValue { } func (n *metricNode) queryRowsByLabel(pb *profileBuilder, query string, handleRowFn func(label string, v float64)) error { - rows, _, err := pb.sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(context.Background(), query) + exec := pb.sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), query) + if err != nil { + return err + } + + rows, _, err := pb.sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return err } @@ -323,11 +329,16 @@ func NewProfileBuilder(sctx sessionctx.Context, start, end time.Time, tp string) // Collect uses to collect the related metric information. func (pb *profileBuilder) Collect() error { - pb.buf.WriteString(fmt.Sprintf(`digraph "%s" {`, "tidb_profile")) - pb.buf.WriteByte('\n') - pb.buf.WriteString(`node [style=filled fillcolor="#f8f8f8"]`) - pb.buf.WriteByte('\n') - err := pb.addMetricTree(pb.genTiDBQueryTree(), "tidb_query") + tidbQuery := pb.genTiDBQueryTree() + err := pb.init(tidbQuery, "tidb_query") + if err != nil { + return err + } + err = pb.traversal(tidbQuery) + if err != nil { + return err + } + err = pb.traversal(pb.genTiDBGCTree()) if err != nil { return err } @@ -350,8 +361,8 @@ func (pb *profileBuilder) getNameID(name string) uint64 { return id } -func (pb *profileBuilder) addMetricTree(root *metricNode, name string) error { - if root == nil { +func (pb *profileBuilder) init(total *metricNode, name string) error { + if total == nil { return nil } tp := "total_time" @@ -361,9 +372,13 @@ func (pb *profileBuilder) addMetricTree(root *metricNode, name string) error { case metricValueCnt: tp = "total_count" } + pb.buf.WriteString(fmt.Sprintf(`digraph "%s" {`, "tidb_profile")) + pb.buf.WriteByte('\n') + pb.buf.WriteString(`node [style=filled fillcolor="#f8f8f8"]`) + pb.buf.WriteByte('\n') pb.buf.WriteString(fmt.Sprintf(`subgraph %[1]s { "%[1]s" [shape=box fontsize=16 label="Type: %[1]s\lTime: %s\lDuration: %s\l"] }`, name+"_"+tp, pb.start.String(), pb.end.Sub(pb.start).String())) pb.buf.WriteByte('\n') - v, err := pb.GetTotalValue(root) + v, err := pb.GetTotalValue(total) if err != nil { return err } @@ -372,7 +387,7 @@ func (pb *profileBuilder) addMetricTree(root *metricNode, name string) error { } else { pb.totalValue = 1 } - return pb.traversal(root) + return nil } func (pb *profileBuilder) GetTotalValue(root *metricNode) (float64, error) { @@ -517,9 +532,12 @@ func (pb *profileBuilder) addNode(n *metricNode, selfCost, nodeTotal float64) er } func (pb *profileBuilder) addNodeDef(name, labelValue, comment string, fontWeight, colorWeight float64) { - baseFontSize, maxFontGrowth := 5, 18.0 + baseFontSize, maxFontSize, maxFontGrowth := 5, 64, 18.0 fontSize := baseFontSize fontSize += int(math.Ceil(maxFontGrowth * math.Sqrt(math.Abs(fontWeight)/pb.totalValue))) + if fontSize > maxFontSize { + fontSize = maxFontSize + } pb.buf.WriteString(fmt.Sprintf(`N%d [label="%s" tooltip="%s" fontsize=%d shape=box color="%s" fillcolor="%s"]`, pb.getNameID(name), labelValue, comment, fontSize, @@ -622,6 +640,21 @@ func (pb *profileBuilder) dotColor(score float64, isBackground bool) string { return fmt.Sprintf("#%02x%02x%02x", uint8(r*255.0), uint8(g*255.0), uint8(b*255.0)) } +func (pb *profileBuilder) genTiDBGCTree() *metricNode { + tidbGC := &metricNode{ + table: "tidb_gc", + isPartOfParent: true, + label: []string{"stage"}, + children: []*metricNode{ + { + table: "tidb_kv_request", + isPartOfParent: true, + }, + }, + } + return tidbGC +} + func (pb *profileBuilder) genTiDBQueryTree() *metricNode { tidbKVRequest := &metricNode{ table: "tidb_kv_request", @@ -630,6 +663,7 @@ func (pb *profileBuilder) genTiDBQueryTree() *metricNode { children: []*metricNode{ { table: "tidb_batch_client_wait", + unit: int64(10e8), }, { table: "tidb_batch_client_wait_conn", @@ -689,6 +723,10 @@ func (pb *profileBuilder) genTiDBQueryTree() *metricNode { }, }, }, + { + table: "tikv_gc_tasks", + label: []string{"task"}, + }, }, }, }, @@ -713,6 +751,9 @@ func (pb *profileBuilder) genTiDBQueryTree() *metricNode { { table: "tidb_owner_handle_syncer", }, + { + table: "tidb_meta_operation", + }, }, }, }, diff --git a/executor/inspection_result.go b/executor/inspection_result.go index b14284b3889c8..b0350ae2890d5 100644 --- a/executor/inspection_result.go +++ b/executor/inspection_result.go @@ -141,8 +141,12 @@ func (e *inspectionResultRetriever) retrieve(ctx context.Context, sctx sessionct // Get cluster info. e.instanceToStatusAddress = make(map[string]string) e.statusToInstanceAddress = make(map[string]string) - sql := "select instance,status_address from information_schema.cluster_info;" - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, "select instance,status_address from information_schema.cluster_info;") + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("get cluster info failed: %v", err)) } @@ -213,7 +217,7 @@ func (c configInspection) inspect(ctx context.Context, sctx sessionctx.Context, return results } -func (configInspection) inspectDiffConfig(_ context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { +func (configInspection) inspectDiffConfig(ctx context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { // check the configuration consistent ignoreConfigKey := []string{ // TiDB @@ -241,22 +245,29 @@ func (configInspection) inspectDiffConfig(_ context.Context, sctx sessionctx.Con // TiKV "server.addr", "server.advertise-addr", + "server.advertise-status-addr", "server.status-addr", "log-file", "raftstore.raftdb-path", "storage.data-dir", "storage.block-cache.capacity", } - sql := fmt.Sprintf("select type, `key`, count(distinct value) as c from information_schema.cluster_config where `key` not in ('%s') group by type, `key` having c > 1", - strings.Join(ignoreConfigKey, "','")) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, "select type, `key`, count(distinct value) as c from information_schema.cluster_config where `key` not in (%?) group by type, `key` having c > 1", ignoreConfigKey) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check configuration consistency failed: %v", err)) } generateDetail := func(tp, item string) string { - query := fmt.Sprintf("select value, instance from information_schema.cluster_config where type='%s' and `key`='%s';", tp, item) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(query) + var rows []chunk.Row + stmt, err := exec.ParseWithParams(ctx, "select value, instance from information_schema.cluster_config where type=%? and `key`=%?;", tp, item) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check configuration consistency failed: %v", err)) return fmt.Sprintf("the cluster has different config value of %[2]s, execute the sql to see more detail: select * from information_schema.cluster_config where type='%[1]s' and `key`='%[2]s'", @@ -298,44 +309,62 @@ func (configInspection) inspectDiffConfig(_ context.Context, sctx sessionctx.Con func (c configInspection) inspectCheckConfig(ctx context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { // check the configuration in reason. cases := []struct { + table string tp string key string - value string + expect string + cond string detail string }{ { - tp: "tidb", + table: "cluster_config", key: "log.slow-threshold", - value: "0", + expect: "> 0", + cond: "type = 'tidb' and `key` = 'log.slow-threshold' and value = '0'", detail: "slow-threshold = 0 will record every query to slow log, it may affect performance", }, { - tp: "tikv", + + table: "cluster_config", key: "raftstore.sync-log", - value: "false", + expect: "true", + cond: "type = 'tikv' and `key` = 'raftstore.sync-log' and value = 'false'", detail: "sync-log should be true to avoid recover region when the machine breaks down", }, + { + table: "cluster_systeminfo", + key: "transparent_hugepage_enabled", + expect: "always madvise [never]", + cond: "system_name = 'kernel' and name = 'transparent_hugepage_enabled' and value not like '%[never]%'", + detail: "Transparent HugePages can cause memory allocation delays during runtime, TiDB recommends that you disable Transparent HugePages on all TiDB servers", + }, } var results []inspectionResult + var rows []chunk.Row + sql := new(strings.Builder) + exec := sctx.(sqlexec.RestrictedSQLExecutor) for _, cas := range cases { if !filter.enable(cas.key) { continue } - sql := fmt.Sprintf("select instance from information_schema.cluster_config where type = '%s' and `key` = '%s' and value = '%s'", - cas.tp, cas.key, cas.value) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + sql.Reset() + fmt.Fprintf(sql, "select type,instance,value from information_schema.%s where %s", cas.table, cas.cond) + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check configuration in reason failed: %v", err)) } for _, row := range rows { results = append(results, inspectionResult{ - tp: cas.tp, - instance: row.GetString(0), + tp: row.GetString(0), + instance: row.GetString(1), item: cas.key, - actual: cas.value, - expected: "not " + cas.value, + actual: row.GetString(2), + expected: cas.expect, severity: "warning", detail: cas.detail, }) @@ -350,8 +379,12 @@ func (c configInspection) checkTiKVBlockCacheSizeConfig(ctx context.Context, sct if !filter.enable(item) { return nil } - sql := "select instance,value from information_schema.cluster_config where type='tikv' and `key` = 'storage.block-cache.capacity'" - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, "select instance,value from information_schema.cluster_config where type='tikv' and `key` = 'storage.block-cache.capacity'") + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check configuration in reason failed: %v", err)) } @@ -375,8 +408,10 @@ func (c configInspection) checkTiKVBlockCacheSizeConfig(ctx context.Context, sct ipToCount[ip]++ } - sql = "select instance, value from metrics_schema.node_total_memory where time=now()" - rows, _, err = sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + stmt, err = exec.ParseWithParams(ctx, "select instance, value from metrics_schema.node_total_memory where time=now()") + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check configuration in reason failed: %v", err)) } @@ -437,10 +472,14 @@ func (configInspection) convertReadableSizeToByteSize(sizeStr string) (uint64, e return uint64(size) * rate, nil } -func (versionInspection) inspect(_ context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { +func (versionInspection) inspect(ctx context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { + exec := sctx.(sqlexec.RestrictedSQLExecutor) + var rows []chunk.Row // check the configuration consistent - sql := "select type, count(distinct git_hash) as c from information_schema.cluster_info group by type having c > 1;" - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + stmt, err := exec.ParseWithParams(ctx, "select type, count(distinct git_hash) as c from information_schema.cluster_info group by type having c > 1;") + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("check version consistency failed: %v", err)) } @@ -594,6 +633,9 @@ func (criticalErrorInspection) inspectError(ctx context.Context, sctx sessionctx condition := filter.timeRange.Condition() var results []inspectionResult + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) + sql := new(strings.Builder) for _, rule := range rules { if filter.enable(rule.item) { def, found := infoschema.MetricTableMap[rule.tbl] @@ -601,9 +643,13 @@ func (criticalErrorInspection) inspectError(ctx context.Context, sctx sessionctx sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("metrics table: %s not found", rule.tbl)) continue } - sql := fmt.Sprintf("select `%[1]s`,sum(value) as total from `%[2]s`.`%[3]s` %[4]s group by `%[1]s` having total>=1.0", + sql.Reset() + fmt.Fprintf(sql, "select `%[1]s`,sum(value) as total from `%[2]s`.`%[3]s` %[4]s group by `%[1]s` having total>=1.0", strings.Join(def.Labels, "`,`"), util.MetricSchemaName.L, rule.tbl, condition) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) continue @@ -649,10 +695,16 @@ func (criticalErrorInspection) inspectForServerDown(ctx context.Context, sctx se return nil } condition := filter.timeRange.Condition() - sql := fmt.Sprintf(`select t1.job,t1.instance, t2.min_time from + exec := sctx.(sqlexec.RestrictedSQLExecutor) + sql := new(strings.Builder) + fmt.Fprintf(sql, `select t1.job,t1.instance, t2.min_time from (select instance,job from metrics_schema.up %[1]s group by instance,job having max(value)-min(value)>0) as t1 join (select instance,min(time) as min_time from metrics_schema.up %[1]s and value=0 group by instance,job) as t2 on t1.instance=t2.instance order by job`, condition) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + var rows []chunk.Row + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) } @@ -675,8 +727,12 @@ func (criticalErrorInspection) inspectForServerDown(ctx context.Context, sctx se results = append(results, result) } // Check from log. - sql = fmt.Sprintf("select type,instance,time from information_schema.cluster_log %s and level = 'info' and message like '%%Welcome to'", condition) - rows, _, err = sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + sql.Reset() + fmt.Fprintf(sql, "select type,instance,time from information_schema.cluster_log %s and level = 'info' and message like '%%Welcome to'", condition) + stmt, err = exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) } @@ -790,24 +846,30 @@ func (thresholdCheckInspection) inspectThreshold1(ctx context.Context, sctx sess condition := filter.timeRange.Condition() var results []inspectionResult + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) + sql := new(strings.Builder) for _, rule := range rules { if !filter.enable(rule.item) { continue } - var sql string + sql.Reset() if len(rule.configKey) > 0 { - sql = fmt.Sprintf("select t1.status_address, t1.cpu, (t2.value * %[2]f) as threshold, t2.value from "+ - "(select status_address, max(sum_value) as cpu from (select instance as status_address, sum(value) as sum_value from metrics_schema.tikv_thread_cpu %[4]s and name like '%[1]s' group by instance, time) as tmp group by tmp.status_address) as t1 join "+ - "(select instance, value from information_schema.cluster_config where type='tikv' and `key` = '%[3]s') as t2 join "+ - "(select instance,status_address from information_schema.cluster_info where type='tikv') as t3 "+ - "on t1.status_address=t3.status_address and t2.instance=t3.instance where t1.cpu > (t2.value * %[2]f)", rule.component, rule.threshold, rule.configKey, condition) + fmt.Fprintf(sql, `select t1.status_address, t1.cpu, (t2.value * %[2]f) as threshold, t2.value from + (select status_address, max(sum_value) as cpu from (select instance as status_address, sum(value) as sum_value from metrics_schema.tikv_thread_cpu %[4]s and name like '%[1]s' group by instance, time) as tmp group by tmp.status_address) as t1 join + (select instance, value from information_schema.cluster_config where type='tikv' and %[5]s = '%[3]s') as t2 join + (select instance,status_address from information_schema.cluster_info where type='tikv') as t3 + on t1.status_address=t3.status_address and t2.instance=t3.instance where t1.cpu > (t2.value * %[2]f)`, rule.component, rule.threshold, rule.configKey, condition, "`key`") } else { - sql = fmt.Sprintf("select t1.instance, t1.cpu, %[2]f from "+ - "(select instance, max(value) as cpu from metrics_schema.tikv_thread_cpu %[3]s and name like '%[1]s' group by instance) as t1 "+ - "where t1.cpu > %[2]f;", rule.component, rule.threshold, condition) + fmt.Fprintf(sql, `select t1.instance, t1.cpu, %[2]f from + (select instance, max(value) as cpu from metrics_schema.tikv_thread_cpu %[3]s and name like '%[1]s' group by instance) as t1 + where t1.cpu > %[2]f;`, rule.component, rule.threshold, condition) + } + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) } - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) continue @@ -957,11 +1019,13 @@ func (thresholdCheckInspection) inspectThreshold2(ctx context.Context, sctx sess condition := filter.timeRange.Condition() var results []inspectionResult + var rows []chunk.Row + sql := new(strings.Builder) + exec := sctx.(sqlexec.RestrictedSQLExecutor) for _, rule := range rules { if !filter.enable(rule.item) { continue } - var sql string cond := condition if len(rule.condition) > 0 { cond = fmt.Sprintf("%s and %s", cond, rule.condition) @@ -969,12 +1033,16 @@ func (thresholdCheckInspection) inspectThreshold2(ctx context.Context, sctx sess if rule.factor == 0 { rule.factor = 1 } + sql.Reset() if rule.isMin { - sql = fmt.Sprintf("select instance, min(value)/%.0f as min_value from metrics_schema.%s %s group by instance having min_value < %f;", rule.factor, rule.tbl, cond, rule.threshold) + fmt.Fprintf(sql, "select instance, min(value)/%.0f as min_value from metrics_schema.%s %s group by instance having min_value < %f;", rule.factor, rule.tbl, cond, rule.threshold) } else { - sql = fmt.Sprintf("select instance, max(value)/%.0f as max_value from metrics_schema.%s %s group by instance having max_value > %f;", rule.factor, rule.tbl, cond, rule.threshold) + fmt.Fprintf(sql, "select instance, max(value)/%.0f as max_value from metrics_schema.%s %s group by instance having max_value > %f;", rule.factor, rule.tbl, cond, rule.threshold) + } + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) } - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) continue @@ -1150,12 +1218,17 @@ func (thresholdCheckInspection) inspectThreshold3(ctx context.Context, sctx sess func checkRules(ctx context.Context, sctx sessionctx.Context, filter inspectionFilter, rules []ruleChecker) []inspectionResult { var results []inspectionResult + var rows []chunk.Row + exec := sctx.(sqlexec.RestrictedSQLExecutor) for _, rule := range rules { if !filter.enable(rule.getItem()) { continue } sql := rule.genSQL(filter.timeRange) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + stmt, err := exec.ParseWithParams(ctx, sql) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) continue @@ -1170,8 +1243,15 @@ func checkRules(ctx context.Context, sctx sessionctx.Context, filter inspectionF func (c thresholdCheckInspection) inspectForLeaderDrop(ctx context.Context, sctx sessionctx.Context, filter inspectionFilter) []inspectionResult { condition := filter.timeRange.Condition() threshold := 50.0 - sql := fmt.Sprintf(`select address,min(value) as mi,max(value) as mx from metrics_schema.pd_scheduler_store_status %s and type='leader_count' group by address having mx-mi>%v`, condition, threshold) - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + sql := new(strings.Builder) + fmt.Fprintf(sql, `select address,min(value) as mi,max(value) as mx from metrics_schema.pd_scheduler_store_status %s and type='leader_count' group by address having mx-mi>%v`, condition, threshold) + exec := sctx.(sqlexec.RestrictedSQLExecutor) + + var rows []chunk.Row + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + rows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) return nil @@ -1179,12 +1259,18 @@ func (c thresholdCheckInspection) inspectForLeaderDrop(ctx context.Context, sctx var results []inspectionResult for _, row := range rows { address := row.GetString(0) - sql := fmt.Sprintf(`select time, value from metrics_schema.pd_scheduler_store_status %s and type='leader_count' and address = '%s' order by time`, condition, address) - subRows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + sql.Reset() + fmt.Fprintf(sql, `select time, value from metrics_schema.pd_scheduler_store_status %s and type='leader_count' and address = '%s' order by time`, condition, address) + var subRows []chunk.Row + stmt, err := exec.ParseWithParams(ctx, sql.String()) + if err == nil { + subRows, _, err = exec.ExecRestrictedStmt(ctx, stmt) + } if err != nil { sctx.GetSessionVars().StmtCtx.AppendWarning(fmt.Errorf("execute '%s' failed: %v", sql, err)) continue } + lastValue := float64(0) for i, subRows := range subRows { v := subRows.GetFloat64(1) diff --git a/executor/inspection_result_test.go b/executor/inspection_result_test.go index 54a398898ac98..90714fc8ba00d 100644 --- a/executor/inspection_result_test.go +++ b/executor/inspection_result_test.go @@ -95,6 +95,14 @@ func (s *inspectionResultSuite) TestInspectionResult(c *C) { types.MakeDatums("pd", "192.168.1.33:1234", "cpu", "cpu", "cpu-logical-cores", "10"), }, } + // mock cluster system information + mockData[infoschema.TableClusterSystemInfo] = variable.TableSnapshot{ + Rows: [][]types.Datum{ + types.MakeDatums("pd", "pd-0", "system", "kernel", "transparent_hugepage_enabled", "always madvise [never]"), + types.MakeDatums("tikv", "tikv-2", "system", "kernel", "transparent_hugepage_enabled", "[always] madvise never"), + types.MakeDatums("tidb", "tidb-0", "system", "kernel", "transparent_hugepage_enabled", "always madvise [never]"), + }, + } datetime := func(str string) types.Time { return s.parseTime(c, tk.Se, str) @@ -120,9 +128,10 @@ func (s *inspectionResultSuite) TestInspectionResult(c *C) { rows: []string{ "config coprocessor.high tikv inconsistent consistent warning 192.168.3.32:26600,192.168.3.33:26600 config value is 8\n192.168.3.34:26600,192.168.3.35:26600 config value is 7", "config ddl.lease tidb inconsistent consistent warning 192.168.3.22:4000,192.168.3.24:4000,192.168.3.25:4000 config value is 1\n192.168.3.23:4000 config value is 2", - "config log.slow-threshold tidb 0 not 0 warning slow-threshold = 0 will record every query to slow log, it may affect performance", + "config log.slow-threshold tidb 0 > 0 warning slow-threshold = 0 will record every query to slow log, it may affect performance", "config log.slow-threshold tidb inconsistent consistent warning 192.168.3.24:4000 config value is 0\n192.168.3.25:4000 config value is 1", - "config raftstore.sync-log tikv false not false warning sync-log should be true to avoid recover region when the machine breaks down", + "config raftstore.sync-log tikv false true warning sync-log should be true to avoid recover region when the machine breaks down", + "config transparent_hugepage_enabled tikv [always] madvise never always madvise [never] warning Transparent HugePages can cause memory allocation delays during runtime, TiDB recommends that you disable Transparent HugePages on all TiDB servers", "version git_hash pd inconsistent consistent critical the cluster has 3 different pd versions, execute the sql to see more detail: select * from information_schema.cluster_info where type='pd'", "version git_hash tidb inconsistent consistent critical the cluster has 3 different tidb versions, execute the sql to see more detail: select * from information_schema.cluster_info where type='tidb'", "version git_hash tikv inconsistent consistent critical the cluster has 2 different tikv versions, execute the sql to see more detail: select * from information_schema.cluster_info where type='tikv'", @@ -140,9 +149,10 @@ func (s *inspectionResultSuite) TestInspectionResult(c *C) { rows: []string{ "config coprocessor.high tikv inconsistent consistent warning 192.168.3.32:26600,192.168.3.33:26600 config value is 8\n192.168.3.34:26600,192.168.3.35:26600 config value is 7", "config ddl.lease tidb inconsistent consistent warning 192.168.3.22:4000,192.168.3.24:4000,192.168.3.25:4000 config value is 1\n192.168.3.23:4000 config value is 2", - "config log.slow-threshold tidb 0 not 0 warning slow-threshold = 0 will record every query to slow log, it may affect performance", + "config log.slow-threshold tidb 0 > 0 warning slow-threshold = 0 will record every query to slow log, it may affect performance", "config log.slow-threshold tidb inconsistent consistent warning 192.168.3.24:4000 config value is 0\n192.168.3.25:4000 config value is 1", - "config raftstore.sync-log tikv false not false warning sync-log should be true to avoid recover region when the machine breaks down", + "config raftstore.sync-log tikv false true warning sync-log should be true to avoid recover region when the machine breaks down", + "config transparent_hugepage_enabled tikv [always] madvise never always madvise [never] warning Transparent HugePages can cause memory allocation delays during runtime, TiDB recommends that you disable Transparent HugePages on all TiDB servers", }, }, { @@ -208,6 +218,14 @@ func (s *inspectionResultSuite) setupForInspection(c *C, mockData map[string][][ types.MakeDatums("tikv", "tikv-2", "tikv-2s", "4.0", "a234c", "", ""), }, } + // mock cluster system information + configurations[infoschema.TableClusterSystemInfo] = variable.TableSnapshot{ + Rows: [][]types.Datum{ + types.MakeDatums("pd", "pd-0", "system", "kernel", "transparent_hugepage_enabled", "always madvise [never]"), + types.MakeDatums("tikv", "tikv-2", "system", "kernel", "transparent_hugepage_enabled", "always madvise [never]"), + types.MakeDatums("tidb", "tidb-0", "system", "kernel", "transparent_hugepage_enabled", "always madvise [never]"), + }, + } } fpName := "github.com/pingcap/tidb/executor/mockMergeMockInspectionTables" c.Assert(failpoint.Enable(fpName, "return"), IsNil) diff --git a/executor/inspection_summary.go b/executor/inspection_summary.go index 37aef042a62f9..2a01cab6dc402 100644 --- a/executor/inspection_summary.go +++ b/executor/inspection_summary.go @@ -458,7 +458,12 @@ func (e *inspectionSummaryRetriever) retrieve(ctx context.Context, sctx sessionc sql = fmt.Sprintf("select avg(value),min(value),max(value) from `%s`.`%s` %s", util.MetricSchemaName.L, name, cond) } - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, sql) + if err != nil { + return nil, errors.Errorf("execute '%s' failed: %v", sql, err) + } + rows, _, err := exec.ExecRestrictedStmt(ctx, stmt) if err != nil { return nil, errors.Errorf("execute '%s' failed: %v", sql, err) } diff --git a/executor/join.go b/executor/join.go index 15c7f71cb1e10..472df41ded441 100644 --- a/executor/join.go +++ b/executor/join.go @@ -579,6 +579,16 @@ func (e *HashJoinExec) join2Chunk(workerID uint, probeSideChk *chunk.Chunk, hCtx } for i := range selected { + killed := atomic.LoadUint32(&e.ctx.GetSessionVars().Killed) == 1 + failpoint.Inject("killedInJoin2Chunk", func(val failpoint.Value) { + if val.(bool) { + killed = true + } + }) + if killed { + joinResult.err = ErrQueryInterrupted + return false, joinResult + } if !selected[i] || hCtx.hasNull[i] { // process unmatched probe side rows e.joiners[workerID].onMissMatch(false, probeSideChk.GetRow(i), joinResult.chk) } else { // process matched probe side rows @@ -610,6 +620,16 @@ func (e *HashJoinExec) join2ChunkForOuterHashJoin(workerID uint, probeSideChk *c } } for i := 0; i < probeSideChk.NumRows(); i++ { + killed := atomic.LoadUint32(&e.ctx.GetSessionVars().Killed) == 1 + failpoint.Inject("killedInJoin2ChunkForOuterHashJoin", func(val failpoint.Value) { + if val.(bool) { + killed = true + } + }) + if killed { + joinResult.err = ErrQueryInterrupted + return false, joinResult + } probeKey, probeRow := hCtx.hashVals[i].Sum64(), probeSideChk.GetRow(i) ok, joinResult = e.joinMatchedProbeSideRow2ChunkForOuterHashJoin(workerID, probeKey, probeRow, hCtx, joinResult) if !ok { @@ -849,6 +869,39 @@ func (e *NestedLoopApplyExec) Open(ctx context.Context) error { return nil } +// aggExecutorTreeInputEmpty checks whether the executor tree returns empty if without aggregate operators. +// Note that, the prerequisite is that this executor tree has been executed already and it returns one row. +func aggExecutorTreeInputEmpty(e Executor) bool { + children := e.base().children + if len(children) == 0 { + return false + } + if len(children) > 1 { + _, ok := e.(*UnionExec) + if !ok { + // It is a Join executor. + return false + } + for _, child := range children { + if !aggExecutorTreeInputEmpty(child) { + return false + } + } + return true + } + // Single child executors. + if aggExecutorTreeInputEmpty(children[0]) { + return true + } + if hashAgg, ok := e.(*HashAggExec); ok { + return hashAgg.isChildReturnEmpty + } + if streamAgg, ok := e.(*StreamAggExec); ok { + return streamAgg.isChildReturnEmpty + } + return false +} + func (e *NestedLoopApplyExec) fetchSelectedOuterRow(ctx context.Context, chk *chunk.Chunk) (*chunk.Row, error) { outerIter := chunk.NewIterator4Chunk(e.outerChunk) for { @@ -864,6 +917,13 @@ func (e *NestedLoopApplyExec) fetchSelectedOuterRow(ctx context.Context, chk *ch if err != nil { return nil, err } + // For cases like `select count(1), (select count(1) from s where s.a > t.a) as sub from t where t.a = 1`, + // if outer child has no row satisfying `t.a = 1`, `sub` should be `null` instead of `0` theoretically; however, the + // outer `count(1)` produces one row <0, null> over the empty input, we should specially mark this outer row + // as not selected, to trigger the mismatch join procedure. + if e.outerChunkCursor == 0 && e.outerChunk.NumRows() == 1 && e.outerSelected[0] && aggExecutorTreeInputEmpty(e.outerExec) { + e.outerSelected[0] = false + } e.outerChunkCursor = 0 } outerRow := e.outerChunk.GetRow(e.outerChunkCursor) @@ -1069,24 +1129,24 @@ func (e *hashJoinRuntimeStats) String() string { buf := bytes.NewBuffer(make([]byte, 0, 128)) if e.fetchAndBuildHashTable > 0 { buf.WriteString("build_hash_table:{total:") - buf.WriteString(e.fetchAndBuildHashTable.String()) + buf.WriteString(execdetails.FormatDuration(e.fetchAndBuildHashTable)) buf.WriteString(", fetch:") - buf.WriteString((e.fetchAndBuildHashTable - e.hashStat.buildTableElapse).String()) + buf.WriteString(execdetails.FormatDuration((e.fetchAndBuildHashTable - e.hashStat.buildTableElapse))) buf.WriteString(", build:") - buf.WriteString(e.hashStat.buildTableElapse.String()) + buf.WriteString(execdetails.FormatDuration(e.hashStat.buildTableElapse)) buf.WriteString("}") } if e.probe > 0 { buf.WriteString(", probe:{concurrency:") buf.WriteString(strconv.Itoa(e.concurrent)) buf.WriteString(", total:") - buf.WriteString(time.Duration(e.fetchAndProbe).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.fetchAndProbe))) buf.WriteString(", max:") - buf.WriteString(time.Duration(atomic.LoadInt64(&e.maxFetchAndProbe)).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(atomic.LoadInt64(&e.maxFetchAndProbe)))) buf.WriteString(", probe:") - buf.WriteString(time.Duration(e.probe).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.probe))) buf.WriteString(", fetch:") - buf.WriteString(time.Duration(e.fetchAndProbe - e.probe).String()) + buf.WriteString(execdetails.FormatDuration(time.Duration(e.fetchAndProbe - e.probe))) if e.hashStat.probeCollision > 0 { buf.WriteString(", probe_collision:") buf.WriteString(strconv.Itoa(e.hashStat.probeCollision)) diff --git a/executor/join_test.go b/executor/join_test.go index 0a52aa8b94899..1edac17004362 100644 --- a/executor/join_test.go +++ b/executor/join_test.go @@ -23,6 +23,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/executor" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/util" @@ -581,21 +582,104 @@ func (s *testSuiteJoin1) TestUsing(c *C) { tk.MustExec("create table tt(b bigint, a int)") // Check whether this sql can execute successfully. tk.MustExec("select * from t join tt using(a)") + + tk.MustExec("drop table if exists t, s") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("create table s(b int, a int)") + tk.MustExec("insert into t values(1,1), (2,2), (3,3), (null,null)") + tk.MustExec("insert into s values(1,1), (3,3), (null,null)") + + // For issue 20477 + tk.MustQuery("select t.*, s.* from t join s using(a)").Check(testkit.Rows("1 1 1 1", "3 3 3 3")) + tk.MustQuery("select s.a from t join s using(a)").Check(testkit.Rows("1", "3")) + tk.MustQuery("select s.a from t join s using(a) where s.a > 1").Check(testkit.Rows("3")) + tk.MustQuery("select s.a from t join s using(a) order by s.a").Check(testkit.Rows("1", "3")) + tk.MustQuery("select s.a from t join s using(a) where s.a > 1 order by s.a").Check(testkit.Rows("3")) + tk.MustQuery("select s.a from t join s using(a) where s.a > 1 order by s.a limit 2").Check(testkit.Rows("3")) + + // For issue 20441 + tk.MustExec(`DROP TABLE if exists t1, t2, t3`) + tk.MustExec(`create table t1 (i int)`) + tk.MustExec(`create table t2 (i int)`) + tk.MustExec(`create table t3 (i int)`) + tk.MustExec(`select * from t1,t2 natural left join t3 order by t1.i,t2.i,t3.i`) + tk.MustExec(`select t1.i,t2.i,t3.i from t2 natural left join t3,t1 order by t1.i,t2.i,t3.i`) + tk.MustExec(`select * from t1,t2 natural right join t3 order by t1.i,t2.i,t3.i`) + tk.MustExec(`select t1.i,t2.i,t3.i from t2 natural right join t3,t1 order by t1.i,t2.i,t3.i`) + + // For issue 15844 + tk.MustExec(`DROP TABLE if exists t0, t1`) + tk.MustExec(`CREATE TABLE t0(c0 INT)`) + tk.MustExec(`CREATE TABLE t1(c0 INT)`) + tk.MustExec(`SELECT t0.c0 FROM t0 NATURAL RIGHT JOIN t1 WHERE t1.c0`) + + // For issue 20958 + tk.MustExec(`DROP TABLE if exists t1, t2`) + tk.MustExec(`create table t1(id int, name varchar(20));`) + tk.MustExec(`create table t2(id int, address varchar(30));`) + tk.MustExec(`insert into t1 values(1,'gangshen');`) + tk.MustExec(`insert into t2 values(1,'HangZhou');`) + tk.MustQuery(`select t2.* from t1 inner join t2 using (id) limit 1;`).Check(testkit.Rows("1 HangZhou")) + tk.MustQuery(`select t2.* from t1 inner join t2 on t1.id = t2.id limit 1;`).Check(testkit.Rows("1 HangZhou")) + + // For issue 20476 + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int)") + tk.MustExec("insert into t1 (a) values(1)") + tk.MustQuery("select t1.*, t2.* from t1 join t1 t2 using(a)").Check(testkit.Rows("1 1")) + tk.MustQuery("select * from t1 join t1 t2 using(a)").Check(testkit.Rows("1")) + + // For issue 18992 + tk.MustExec("drop table t") + tk.MustExec("CREATE TABLE t ( a varchar(55) NOT NULL, b varchar(55) NOT NULL, c int(11) DEFAULT NULL, d int(11) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") + tk.MustExec("update t t1 join t t2 using(a,b) set t1.c=t2.d;") + + // For issue 20467 + tk.MustExec(`DROP TABLE if exists t1,t2,t3,t4,t5`) + tk.MustExec(`CREATE TABLE t1 (a INT, b INT)`) + tk.MustExec(`CREATE TABLE t2 (a INT, b INT)`) + tk.MustExec(`CREATE TABLE t3 (a INT, b INT)`) + tk.MustExec(`INSERT INTO t1 VALUES (1,1)`) + tk.MustExec(`INSERT INTO t2 VALUES (1,1)`) + tk.MustExec(`INSERT INTO t3 VALUES (1,1)`) + tk.MustGetErrMsg(`SELECT * FROM t1 JOIN (t2 JOIN t3 USING (b)) USING (a)`, "[planner:1052]Column 'a' in from clause is ambiguous") + + // For issue 6712 + tk.MustExec("drop table if exists t1,t2") + tk.MustExec("create table t1 (t1 int , t0 int)") + tk.MustExec("create table t2 (t2 int, t0 int)") + tk.MustExec("insert into t1 select 11, 1") + tk.MustExec("insert into t2 select 22, 1") + tk.MustQuery("select t1.t0, t2.t0 from t1 join t2 using(t0) group by t1.t0").Check(testkit.Rows("1 1")) + tk.MustQuery("select t1.t0, t2.t0 from t1 join t2 using(t0) having t1.t0 > 0").Check(testkit.Rows("1 1")) } -func (s *testSuiteJoin1) TestNaturalJoin(c *C) { +func (s *testSuiteWithData) TestNaturalJoin(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") tk.MustExec("create table t1 (a int, b int)") tk.MustExec("create table t2 (a int, c int)") - tk.MustExec("insert t1 values (1, 2), (10, 20)") - tk.MustExec("insert t2 values (1, 3), (100, 200)") - - tk.MustQuery("select * from t1 natural join t2").Check(testkit.Rows("1 2 3")) - tk.MustQuery("select * from t1 natural left join t2 order by a").Check(testkit.Rows("1 2 3", "10 20 ")) - tk.MustQuery("select * from t1 natural right join t2 order by a").Check(testkit.Rows("1 3 2", "100 200 ")) + tk.MustExec("insert t1 values (1,2), (10,20), (0,0)") + tk.MustExec("insert t2 values (1,3), (100,200), (0,0)") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) + }) + tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) + } } func (s *testSuiteJoin3) TestMultiJoin(c *C) { @@ -879,6 +963,65 @@ func (s *testSuiteJoin3) TestSubquery(c *C) { tk.MustExec("insert into t2 values(1)") tk.MustQuery("select * from t1 where a in (select a from t2)").Check(testkit.Rows("1")) + tk.MustExec("insert into t2 value(null)") + tk.MustQuery("select * from t1 where 1 in (select b from t2)").Check(testkit.Rows("1")) + tk.MustQuery("select * from t1 where 1 not in (select b from t2)").Check(testkit.Rows()) + tk.MustQuery("select * from t1 where 2 not in (select b from t2)").Check(testkit.Rows()) + tk.MustQuery("select * from t1 where 2 in (select b from t2)").Check(testkit.Rows()) + tk.MustQuery("select 1 in (select b from t2) from t1").Check(testkit.Rows("1")) + tk.MustQuery("select 1 in (select 1 from t2) from t1").Check(testkit.Rows("1")) + tk.MustQuery("select 1 not in (select b from t2) from t1").Check(testkit.Rows("0")) + tk.MustQuery("select 1 not in (select 1 from t2) from t1").Check(testkit.Rows("0")) + + tk.MustExec("delete from t2 where b=1") + tk.MustQuery("select 1 in (select b from t2) from t1").Check(testkit.Rows("")) + tk.MustQuery("select 1 not in (select b from t2) from t1").Check(testkit.Rows("")) + tk.MustQuery("select 1 not in (select 1 from t2) from t1").Check(testkit.Rows("0")) + tk.MustQuery("select 1 in (select 1 from t2) from t1").Check(testkit.Rows("1")) + tk.MustQuery("select 1 not in (select null from t1) from t2").Check(testkit.Rows("")) + tk.MustQuery("select 1 in (select null from t1) from t2").Check(testkit.Rows("")) + + tk.MustExec("drop table if exists s") + tk.MustExec("create table s(a int not null, b int)") + tk.MustExec("set sql_mode = ''") + tk.MustQuery("select (2,0) in (select s.a, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) not in (select s.a, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) = any (select s.a, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) != all (select s.a, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) in (select s.b, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) not in (select s.b, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) = any (select s.b, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustQuery("select (2,0) != all (select s.b, min(s.b) from s) as f").Check(testkit.Rows("")) + tk.MustExec("insert into s values(1,null)") + tk.MustQuery("select 1 in (select b from s)").Check(testkit.Rows("")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1),(null)") + tk.MustQuery("select a not in (select 1) from t").Sort().Check(testkit.Rows( + "0", + "", + )) + tk.MustQuery("select 1 not in (select null from t t1) from t").Check(testkit.Rows( + "", + "", + )) + tk.MustQuery("select 1 in (select null from t t1) from t").Check(testkit.Rows( + "", + "", + )) + tk.MustQuery("select a in (select 0) xx from (select null as a) x").Check(testkit.Rows("")) + + tk.MustExec("drop table t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,null),(null, null),(null, 2)") + tk.MustQuery("select * from t t1 where (2 in (select a from t t2 where (t2.b=t1.b) is null))").Check(testkit.Rows()) + tk.MustQuery("select (t2.a in (select t1.a from t t1)) is true from t t2").Sort().Check(testkit.Rows( + "0", + "0", + "1", + )) + tk.MustExec("set @@tidb_hash_join_concurrency=5") } @@ -966,7 +1109,7 @@ func (s *testSuiteJoin1) TestJoinLeak(c *C) { err = result.Next(context.Background(), req) c.Assert(err, IsNil) time.Sleep(time.Millisecond) - result.Close() + c.Assert(result.Close(), IsNil) tk.MustExec("set @@tidb_hash_join_concurrency=5") } @@ -1173,42 +1316,42 @@ func (s *testSuiteJoin1) TestIndexLookupJoin(c *C) { tk.MustExec("analyze table t;") tk.MustExec("analyze table s;") - tk.MustQuery("desc select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)->Column#6", - "└─IndexJoin_16 64.00 root inner join, inner:IndexReader_15, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", - " ├─TableReader_26(Build) 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", - " │ └─TableFullScan_24 64.00 cop[tikv] table:t keep order:false", - " └─IndexReader_15(Probe) 1.00 root index:Selection_14", - " └─Selection_14 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", - " └─IndexRangeScan_13 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false")) + tk.MustQuery("desc format = 'brief' select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( + "HashAgg 1.00 root funcs:count(1)->Column#6", + "└─IndexJoin 64.00 root inner join, inner:IndexReader, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), other cond:lt(test.s.b, test.t.b)", + " ├─TableReader(Build) 64.00 root data:Selection", + " │ └─Selection 64.00 cop[tikv] not(isnull(test.t.b))", + " │ └─TableFullScan 64.00 cop[tikv] table:t keep order:false", + " └─IndexReader(Probe) 1.00 root index:Selection", + " └─Selection 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexRangeScan 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false")) tk.MustQuery("select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") tk.MustQuery("select /*+ TIDB_INLJ(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) - tk.MustQuery("desc select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)->Column#6", - "└─IndexMergeJoin_23 64.00 root inner join, inner:IndexReader_21, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", - " ├─TableReader_26(Build) 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", - " │ └─TableFullScan_24 64.00 cop[tikv] table:t keep order:false", - " └─IndexReader_21(Probe) 1.00 root index:Selection_20", - " └─Selection_20 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", - " └─IndexRangeScan_19 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:true", + tk.MustQuery("desc format = 'brief' select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( + "HashAgg 1.00 root funcs:count(1)->Column#6", + "└─IndexMergeJoin 64.00 root inner join, inner:IndexReader, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", + " ├─TableReader(Build) 64.00 root data:Selection", + " │ └─Selection 64.00 cop[tikv] not(isnull(test.t.b))", + " │ └─TableFullScan 64.00 cop[tikv] table:t keep order:false", + " └─IndexReader(Probe) 1.00 root index:Selection", + " └─Selection 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexRangeScan 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:true", )) tk.MustQuery("select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") tk.MustQuery("select /*+ INL_MERGE_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) - tk.MustQuery("desc select /*+ INL_HASH_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( - "HashAgg_9 1.00 root funcs:count(1)->Column#6", - "└─IndexHashJoin_18 64.00 root inner join, inner:IndexReader_15, outer key:test.t.a, inner key:test.s.a, other cond:lt(test.s.b, test.t.b)", - " ├─TableReader_26(Build) 64.00 root data:Selection_25", - " │ └─Selection_25 64.00 cop[tikv] not(isnull(test.t.b))", - " │ └─TableFullScan_24 64.00 cop[tikv] table:t keep order:false", - " └─IndexReader_15(Probe) 1.00 root index:Selection_14", - " └─Selection_14 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", - " └─IndexRangeScan_13 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false", + tk.MustQuery("desc format = 'brief' select /*+ INL_HASH_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows( + "HashAgg 1.00 root funcs:count(1)->Column#6", + "└─IndexHashJoin 64.00 root inner join, inner:IndexReader, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), other cond:lt(test.s.b, test.t.b)", + " ├─TableReader(Build) 64.00 root data:Selection", + " │ └─Selection 64.00 cop[tikv] not(isnull(test.t.b))", + " │ └─TableFullScan 64.00 cop[tikv] table:t keep order:false", + " └─IndexReader(Probe) 1.00 root index:Selection", + " └─Selection 1.00 cop[tikv] not(isnull(test.s.a)), not(isnull(test.s.b))", + " └─IndexRangeScan 1.00 cop[tikv] table:s, index:idx(a, b) range: decided by [eq(test.s.a, test.t.a) lt(test.s.b, test.t.b)], keep order:false", )) tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ count(*) from t join s use index(idx) on s.a = t.a and s.b < t.b").Check(testkit.Rows("64")) tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") @@ -1231,7 +1374,7 @@ func (s *testSuiteJoinSerial) TestIndexNestedLoopHashJoin(c *C) { tk.MustExec("set @@tidb_init_chunk_size=2") tk.MustExec("set @@tidb_index_join_batch_size=10") tk.MustExec("DROP TABLE IF EXISTS t, s") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t(pk int primary key, a int)") for i := 0; i < 100; i++ { tk.MustExec(fmt.Sprintf("insert into t values(%d, %d)", i, i)) @@ -1247,12 +1390,12 @@ func (s *testSuiteJoinSerial) TestIndexNestedLoopHashJoin(c *C) { tk.MustExec("analyze table t") tk.MustExec("analyze table s") // Test IndexNestedLoopHashJoin keepOrder. - tk.MustQuery("explain select /*+ INL_HASH_JOIN(s) */ * from t left join s on t.a=s.a order by t.pk").Check(testkit.Rows( - "IndexHashJoin_27 100.00 root left outer join, inner:TableReader_22, outer key:test.t.a, inner key:test.s.a", - "├─TableReader_30(Build) 100.00 root data:TableFullScan_29", - "│ └─TableFullScan_29 100.00 cop[tikv] table:t keep order:true", - "└─TableReader_22(Probe) 1.00 root data:TableRangeScan_21", - " └─TableRangeScan_21 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false", + tk.MustQuery("explain format = 'brief' select /*+ INL_HASH_JOIN(s) */ * from t left join s on t.a=s.a order by t.pk").Check(testkit.Rows( + "IndexHashJoin 100.00 root left outer join, inner:TableReader, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", + "├─TableReader(Build) 100.00 root data:TableFullScan", + "│ └─TableFullScan 100.00 cop[tikv] table:t keep order:true", + "└─TableReader(Probe) 1.00 root data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:s range: decided by [test.t.a], keep order:false", )) rs := tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t left join s on t.a=s.a order by t.pk") for i, row := range rs.Rows() { @@ -1282,27 +1425,27 @@ func (s *testSuiteJoinSerial) TestIndexNestedLoopHashJoin(c *C) { tk.Se.GetSessionVars().InitChunkSize = 2 tk.Se.GetSessionVars().MaxChunkSize = 2 tk.MustExec("set @@tidb_index_join_batch_size=2") - tk.MustQuery("desc select * from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey ) order by `l_orderkey`,`l_linenumber`;").Check(testkit.Rows( - "Sort_9 7.20 root test.t.l_orderkey, test.t.l_linenumber", - "└─IndexHashJoin_17 7.20 root semi join, inner:IndexLookUp_15, outer key:test.t.l_orderkey, inner key:test.t.l_orderkey, other cond:ne(test.t.l_suppkey, test.t.l_suppkey)", - " ├─TableReader_20(Build) 9.00 root data:Selection_19", - " │ └─Selection_19 9.00 cop[tikv] not(isnull(test.t.l_suppkey))", - " │ └─TableFullScan_18 9.00 cop[tikv] table:l1 keep order:false", - " └─IndexLookUp_15(Probe) 3.00 root ", - " ├─IndexRangeScan_12(Build) 3.00 cop[tikv] table:l2, index:PRIMARY(l_orderkey, l_linenumber) range: decided by [eq(test.t.l_orderkey, test.t.l_orderkey)], keep order:false", - " └─Selection_14(Probe) 3.00 cop[tikv] not(isnull(test.t.l_suppkey))", - " └─TableRowIDScan_13 3.00 cop[tikv] table:l2 keep order:false")) + tk.MustQuery("desc format = 'brief' select * from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey ) order by `l_orderkey`,`l_linenumber`;").Check(testkit.Rows( + "Sort 7.20 root test.t.l_orderkey, test.t.l_linenumber", + "└─IndexHashJoin 7.20 root semi join, inner:IndexLookUp, outer key:test.t.l_orderkey, inner key:test.t.l_orderkey, equal cond:eq(test.t.l_orderkey, test.t.l_orderkey), other cond:ne(test.t.l_suppkey, test.t.l_suppkey)", + " ├─TableReader(Build) 9.00 root data:Selection", + " │ └─Selection 9.00 cop[tikv] not(isnull(test.t.l_suppkey))", + " │ └─TableFullScan 9.00 cop[tikv] table:l1 keep order:false", + " └─IndexLookUp(Probe) 3.00 root ", + " ├─IndexRangeScan(Build) 3.00 cop[tikv] table:l2, index:PRIMARY(l_orderkey, l_linenumber) range: decided by [eq(test.t.l_orderkey, test.t.l_orderkey)], keep order:false", + " └─Selection(Probe) 3.00 cop[tikv] not(isnull(test.t.l_suppkey))", + " └─TableRowIDScan 3.00 cop[tikv] table:l2 keep order:false")) tk.MustQuery("select * from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey )order by `l_orderkey`,`l_linenumber`;").Check(testkit.Rows("0 0 0 0", "0 1 0 1", "0 2 0 0", "1 0 1 0", "1 1 1 1", "1 2 1 0", "2 0 0 0", "2 1 0 1", "2 2 0 0")) - tk.MustQuery("desc select count(*) from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey );").Check(testkit.Rows( - "StreamAgg_14 1.00 root funcs:count(1)->Column#11", - "└─IndexHashJoin_29 7.20 root semi join, inner:IndexLookUp_27, outer key:test.t.l_orderkey, inner key:test.t.l_orderkey, other cond:ne(test.t.l_suppkey, test.t.l_suppkey)", - " ├─TableReader_23(Build) 9.00 root data:Selection_22", - " │ └─Selection_22 9.00 cop[tikv] not(isnull(test.t.l_suppkey))", - " │ └─TableFullScan_21 9.00 cop[tikv] table:l1 keep order:false", - " └─IndexLookUp_27(Probe) 3.00 root ", - " ├─IndexRangeScan_24(Build) 3.00 cop[tikv] table:l2, index:PRIMARY(l_orderkey, l_linenumber) range: decided by [eq(test.t.l_orderkey, test.t.l_orderkey)], keep order:false", - " └─Selection_26(Probe) 3.00 cop[tikv] not(isnull(test.t.l_suppkey))", - " └─TableRowIDScan_25 3.00 cop[tikv] table:l2 keep order:false")) + tk.MustQuery("desc format = 'brief' select count(*) from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey );").Check(testkit.Rows( + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─IndexHashJoin 7.20 root semi join, inner:IndexLookUp, outer key:test.t.l_orderkey, inner key:test.t.l_orderkey, equal cond:eq(test.t.l_orderkey, test.t.l_orderkey), other cond:ne(test.t.l_suppkey, test.t.l_suppkey)", + " ├─TableReader(Build) 9.00 root data:Selection", + " │ └─Selection 9.00 cop[tikv] not(isnull(test.t.l_suppkey))", + " │ └─TableFullScan 9.00 cop[tikv] table:l1 keep order:false", + " └─IndexLookUp(Probe) 3.00 root ", + " ├─IndexRangeScan(Build) 3.00 cop[tikv] table:l2, index:PRIMARY(l_orderkey, l_linenumber) range: decided by [eq(test.t.l_orderkey, test.t.l_orderkey)], keep order:false", + " └─Selection(Probe) 3.00 cop[tikv] not(isnull(test.t.l_suppkey))", + " └─TableRowIDScan 3.00 cop[tikv] table:l2 keep order:false")) tk.MustQuery("select count(*) from t l1 where exists ( select * from t l2 where l2.l_orderkey = l1.l_orderkey and l2.l_suppkey <> l1.l_suppkey );").Check(testkit.Rows("9")) tk.MustExec("DROP TABLE IF EXISTS t, s") @@ -1390,13 +1533,13 @@ func (s *testSuiteJoin3) TestIssue13449(c *C) { tk.MustExec("set @@tidb_index_lookup_join_concurrency=1;") tk.MustExec("set @@tidb_index_join_batch_size=32;") - tk.MustQuery("desc select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;").Check(testkit.Rows( - "IndexHashJoin_30 12487.50 root inner join, inner:IndexReader_27, outer key:test.t.a, inner key:test.s.a", - "├─IndexReader_37(Build) 9990.00 root index:IndexFullScan_36", - "│ └─IndexFullScan_36 9990.00 cop[tikv] table:t, index:a(a) keep order:true, stats:pseudo", - "└─IndexReader_27(Probe) 1.25 root index:Selection_26", - " └─Selection_26 1.25 cop[tikv] not(isnull(test.s.a))", - " └─IndexRangeScan_25 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo")) + tk.MustQuery("desc format = 'brief' select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;").Check(testkit.Rows( + "IndexHashJoin 12487.50 root inner join, inner:IndexReader, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a)", + "├─IndexReader(Build) 9990.00 root index:IndexFullScan", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t, index:a(a) keep order:true, stats:pseudo", + "└─IndexReader(Probe) 1.25 root index:Selection", + " └─Selection 1.25 cop[tikv] not(isnull(test.s.a))", + " └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo")) tk.MustQuery("select /*+ INL_HASH_JOIN(s) */ * from t join s on t.a=s.a order by t.a;").Check(testkit.Rows("1 1", "128 128")) } @@ -1409,12 +1552,12 @@ func (s *testSuiteJoin3) TestMergejoinOrder(c *C) { tk.MustExec("insert into t1 values(1, 100), (2, 100), (3, 100), (4, 100), (5, 100);") tk.MustExec("insert into t2 select a*100, b*100 from t1;") - tk.MustQuery("explain select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a;").Check(testkit.Rows( - "MergeJoin_20 10000.00 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)]", - "├─TableReader_14(Build) 6666.67 root data:TableRangeScan_13", - "│ └─TableRangeScan_13 6666.67 cop[tikv] table:t2 range:[-inf,3), (3,+inf], keep order:true, stats:pseudo", - "└─TableReader_12(Probe) 10000.00 root data:TableFullScan_11", - " └─TableFullScan_11 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo", + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t2) */ * from t1 left outer join t2 on t1.a=t2.a and t1.a!=3 order by t1.a;").Check(testkit.Rows( + "MergeJoin 10000.00 root left outer join, left key:test.t1.a, right key:test.t2.a, left cond:[ne(test.t1.a, 3)]", + "├─TableReader(Build) 6666.67 root data:TableRangeScan", + "│ └─TableRangeScan 6666.67 cop[tikv] table:t2 range:[-inf,3), (3,+inf], keep order:true, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo", )) tk.MustExec("set @@tidb_init_chunk_size=1") @@ -1965,28 +2108,28 @@ func (s *testSuiteJoinSerial) TestOuterTableBuildHashTableIsuse13933(c *C) { tk.MustExec("insert into t values (11,11),(1,2)") tk.MustExec("insert into s values (1,2),(2,1),(11,11)") tk.MustQuery("select * from t left join s on s.a > t.a").Sort().Check(testkit.Rows("1 2 11 11", "1 2 2 1", "11 11 ")) - tk.MustQuery("explain select * from t left join s on s.a > t.a").Check(testkit.Rows( - "HashJoin_6 99900000.00 root CARTESIAN left outer join, other cond:gt(test.s.a, test.t.a)", - "├─TableReader_8(Build) 10000.00 root data:TableFullScan_7", - "│ └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 9990.00 root data:Selection_10", - " └─Selection_10 9990.00 cop[tikv] not(isnull(test.s.a))", - " └─TableFullScan_9 10000.00 cop[tikv] table:s keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select * from t left join s on s.a > t.a").Check(testkit.Rows( + "HashJoin 99900000.00 root CARTESIAN left outer join, other cond:gt(test.s.a, test.t.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.s.a))", + " └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo")) tk.MustExec("drop table if exists t, s") tk.MustExec("Create table s (a int, b int, key(b))") tk.MustExec("Create table t (a int, b int, key(b))") tk.MustExec("Insert into s values (1,2),(2,1),(11,11)") tk.MustExec("Insert into t values (11,2),(1,2),(5,2)") tk.MustQuery("select /*+ INL_HASH_JOIN(s)*/ * from t left join s on s.b=t.b and s.a < t.a;").Sort().Check(testkit.Rows("1 2 ", "11 2 1 2", "5 2 1 2")) - tk.MustQuery("explain select /*+ INL_HASH_JOIN(s)*/ * from t left join s on s.b=t.b and s.a < t.a;").Check(testkit.Rows( - "IndexHashJoin_14 12475.01 root left outer join, inner:IndexLookUp_11, outer key:test.t.b, inner key:test.s.b, other cond:lt(test.s.a, test.t.a)", - "├─TableReader_24(Build) 10000.00 root data:TableFullScan_23", - "│ └─TableFullScan_23 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "└─IndexLookUp_11(Probe) 1.25 root ", - " ├─Selection_9(Build) 1.25 cop[tikv] not(isnull(test.s.b))", - " │ └─IndexRangeScan_7 1.25 cop[tikv] table:s, index:b(b) range: decided by [eq(test.s.b, test.t.b)], keep order:false, stats:pseudo", - " └─Selection_10(Probe) 1.25 cop[tikv] not(isnull(test.s.a))", - " └─TableRowIDScan_8 1.25 cop[tikv] table:s keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select /*+ INL_HASH_JOIN(s)*/ * from t left join s on s.b=t.b and s.a < t.a;").Check(testkit.Rows( + "IndexHashJoin 12475.01 root left outer join, inner:IndexLookUp, outer key:test.t.b, inner key:test.s.b, equal cond:eq(test.t.b, test.s.b), other cond:lt(test.s.a, test.t.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.b))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:b(b) range: decided by [eq(test.s.b, test.t.b)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.s.a))", + " └─TableRowIDScan 1.25 cop[tikv] table:s keep order:false, stats:pseudo")) } func (s *testSuiteJoin1) TestIssue13177(c *C) { @@ -2068,6 +2211,7 @@ func (s *testSuiteJoinSerial) TestInlineProjection4HashJoinIssue15316(c *C) { defer func() { plannercore.ForcedHashLeftJoin4Test = false }() tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + tk.MustExec("drop table if exists S, T") tk.MustExec("create table S (a int not null, b int, c int);") tk.MustExec("create table T (a int not null, b int, c int);") tk.MustExec("insert into S values (0,1,2),(0,1,null),(0,1,2);") @@ -2081,16 +2225,16 @@ func (s *testSuiteJoinSerial) TestInlineProjection4HashJoinIssue15316(c *C) { "0 0 2", )) // NOTE: the HashLeftJoin should be kept - tk.MustQuery("explain select T.a,T.a,T.c from S join T on T.a = S.a where S.b t1.a) as field from t1 where t1.a = 100").Check(testkit.Rows( + "0 ", + )) + tk.MustQuery("select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 100").Check(testkit.Rows( + "0 ", + )) + tk.MustQuery("select count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1").Check(testkit.Rows( + "1 0", + )) + tk.MustQuery("select /*+ agg_to_cop() */ count(1), (select count(1) from t2 where t2.a > t1.a) as field from t1 where t1.a = 1").Check(testkit.Rows( + "1 0", + )) } func (s *testSuite9) TestIssue19112(c *C) { @@ -2320,4 +2503,91 @@ func (s *testSuiteJoinSerial) TestExplainAnalyzeJoin(c *C) { c.Assert(len(rows), Equals, 7) c.Assert(rows[0][0], Matches, "HashJoin.*") c.Assert(rows[0][5], Matches, "time:.*, loops:.*, build_hash_table:{total:.*, fetch:.*, build:.*}, probe:{concurrency:5, total:.*, max:.*, probe:.*, fetch:.*}") + // Test for index merge join. + rows = tk.MustQuery("explain analyze select /*+ INL_MERGE_JOIN(t1, t2) */ * from t1,t2 where t1.a=t2.a;").Rows() + c.Assert(len(rows), Equals, 9) + c.Assert(rows[0][0], Matches, "IndexMergeJoin_.*") + c.Assert(rows[0][5], Matches, fmt.Sprintf(".*Concurrency:%v.*", tk.Se.GetSessionVars().IndexLookupJoinConcurrency())) +} + +func (s *testSuiteJoinSerial) TestIssue20270(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + err := failpoint.Enable("github.com/pingcap/tidb/executor/killedInJoin2Chunk", "return(true)") + c.Assert(err, IsNil) + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t(c1 int, c2 int)") + tk.MustExec("create table t1(c1 int, c2 int)") + tk.MustExec("insert into t values(1,1),(2,2)") + tk.MustExec("insert into t1 values(2,3),(4,4)") + err = tk.QueryToErr("select /*+ TIDB_HJ(t, t1) */ * from t left join t1 on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + c.Assert(err, Equals, executor.ErrQueryInterrupted) + err = failpoint.Disable("github.com/pingcap/tidb/executor/killedInJoin2Chunk") + c.Assert(err, IsNil) + plannercore.ForceUseOuterBuild4Test = true + defer func() { + plannercore.ForceUseOuterBuild4Test = false + }() + err = failpoint.Enable("github.com/pingcap/tidb/executor/killedInJoin2ChunkForOuterHashJoin", "return(true)") + c.Assert(err, IsNil) + tk.MustExec("insert into t1 values(1,30),(2,40)") + err = tk.QueryToErr("select /*+ TIDB_HJ(t, t1) */ * from t left outer join t1 on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + c.Assert(err, Equals, executor.ErrQueryInterrupted) + err = failpoint.Disable("github.com/pingcap/tidb/executor/killedInJoin2ChunkForOuterHashJoin") + c.Assert(err, IsNil) +} + +func (s *testSuiteJoinSerial) TestIssue20710(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists s;") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("create table s(a int, b int, index(a))") + tk.MustExec("insert into t values(1,1),(1,2),(2,2)") + tk.MustExec("insert into s values(1,1),(2,2),(2,1)") + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b").Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a").Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b").Sort().Check(testkit.Rows("1 1 1 1", "1 2 1 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b").Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a").Sort().Check(testkit.Rows("1 1 1 1", "2 2 2 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b").Sort().Check(testkit.Rows("1 1 1 1", "1 2 1 1", "2 2 2 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) +} + +func (s *testSuiteJoinSerial) TestIssue20779(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int, b int, index idx(b));") + tk.MustExec("insert into t1 values(1, 1);") + tk.MustExec("insert into t1 select * from t1;") + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/testIssue20779", "return"), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/testIssue20779"), IsNil) + }() + + rs, err := tk.Exec("select /*+ inl_hash_join(t2) */ t1.b from t1 left join t1 t2 on t1.b=t2.b order by t1.b;") + c.Assert(err, IsNil) + _, err = session.GetRows4Test(context.Background(), nil, rs) + c.Assert(err.Error(), Matches, "testIssue20779") + c.Assert(rs.Close(), IsNil) +} + +func (s *testSuiteJoinSerial) TestIssue20219(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t,s ") + tk.MustExec("CREATE TABLE `t` ( `a` set('a','b','c','d','e','f','g','h','i','j') DEFAULT NULL );") + tk.MustExec("insert into t values('i'), ('j');") + tk.MustExec("CREATE TABLE `s` ( `a` char(1) DEFAULT NULL, KEY `a` (`a`) )") + tk.MustExec("insert into s values('i'), ('j');") + tk.MustQuery("select /*+ inl_hash_join(s)*/ t.a from t left join s on t.a = s.a;").Check(testkit.Rows("i", "j")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select /*+ inl_join(s)*/ t.a from t left join s on t.a = s.a;").Check(testkit.Rows("i", "j")) + tk.MustQuery("show warnings").Check(testkit.Rows()) } diff --git a/executor/load_data.go b/executor/load_data.go index a17820309dd0f..2cc71557c831e 100644 --- a/executor/load_data.go +++ b/executor/load_data.go @@ -50,17 +50,6 @@ type LoadDataExec struct { loadDataInfo *LoadDataInfo } -// NewLoadDataInfo returns a LoadDataInfo structure, and it's only used for tests now. -func NewLoadDataInfo(ctx sessionctx.Context, row []types.Datum, tbl table.Table, cols []*table.Column) *LoadDataInfo { - insertVal := &InsertValues{baseExecutor: newBaseExecutor(ctx, nil, 0), Table: tbl} - return &LoadDataInfo{ - row: row, - InsertValues: insertVal, - Table: tbl, - Ctx: ctx, - } -} - // Next implements the Executor Next interface. func (e *LoadDataExec) Next(ctx context.Context, req *chunk.Chunk) error { req.GrowAndReset(e.maxChunkSize) @@ -101,6 +90,8 @@ func (e *LoadDataExec) Open(ctx context.Context) error { if e.loadDataInfo.insertColumns != nil { e.loadDataInfo.initEvalBuffer() } + // Init for runtime stats. + e.loadDataInfo.collectRuntimeStatsEnabled() return nil } @@ -171,7 +162,7 @@ func (e *LoadDataInfo) initLoadColumns(columnNames []string) error { break } } - + e.rowLen = len(e.insertColumns) // Check column whether is specified only once. err = table.CheckOnce(cols) if err != nil { @@ -298,6 +289,9 @@ func (e *LoadDataInfo) CommitOneTask(ctx context.Context, task CommitTask) error return errors.New("mock commit one task error") }) e.Ctx.StmtCommit() + // Make sure process stream routine never use invalid txn + e.txnInUse.Lock() + defer e.txnInUse.Unlock() // Make sure that there are no retries when committing. if err = e.Ctx.RefreshTxnCtx(ctx); err != nil { logutil.Logger(ctx).Error("commit error refresh", zap.Error(err)) @@ -410,9 +404,93 @@ func (e *LoadDataInfo) getValidData(prevData, curData []byte) ([]byte, []byte) { return nil, curData } +// indexOfTerminator return index of terminator, if not, return -1. +// normally, the field terminator and line terminator is short, so we just use brute force algorithm. +func (e *LoadDataInfo) indexOfTerminator(bs []byte) int { + fieldTerm := []byte(e.FieldsInfo.Terminated) + fieldTermLen := len(fieldTerm) + lineTerm := []byte(e.LinesInfo.Terminated) + lineTermLen := len(lineTerm) + type termType int + const ( + notTerm termType = iota + fieldTermType + lineTermType + ) + // likely, fieldTermLen should equal to lineTermLen, compare fieldTerm first can avoid useless lineTerm comparison. + cmpTerm := func(restLen int, bs []byte) (typ termType) { + if restLen >= fieldTermLen && bytes.Equal(bs[:fieldTermLen], fieldTerm) { + typ = fieldTermType + return + } + if restLen >= lineTermLen && bytes.Equal(bs[:lineTermLen], lineTerm) { + typ = lineTermType + return + } + return + } + if lineTermLen > fieldTermLen && bytes.HasPrefix(lineTerm, fieldTerm) { + // unlikely, fieldTerm is prefix of lineTerm, we should compare lineTerm first. + cmpTerm = func(restLen int, bs []byte) (typ termType) { + if restLen >= lineTermLen && bytes.Equal(bs[:lineTermLen], lineTerm) { + typ = lineTermType + return + } + if restLen >= fieldTermLen && bytes.Equal(bs[:fieldTermLen], fieldTerm) { + typ = fieldTermType + return + } + return + } + } + atFieldStart := true + inQuoter := false +loop: + for i := 0; i < len(bs); i++ { + if atFieldStart && bs[i] == e.FieldsInfo.Enclosed { + inQuoter = true + atFieldStart = false + continue + } + restLen := len(bs) - i - 1 + if inQuoter && bs[i] == e.FieldsInfo.Enclosed { + // look ahead to see if it is end of line or field. + switch cmpTerm(restLen, bs[i+1:]) { + case lineTermType: + return i + 1 + case fieldTermType: + i += fieldTermLen + inQuoter = false + atFieldStart = true + continue loop + default: + } + } + if !inQuoter { + // look ahead to see if it is end of line or field. + switch cmpTerm(restLen+1, bs[i:]) { + case lineTermType: + return i + case fieldTermType: + i += fieldTermLen - 1 + inQuoter = false + atFieldStart = true + continue loop + default: + } + } + // if it is escaped char, skip next char. + if bs[i] == e.FieldsInfo.Escaped { + i++ + } + atFieldStart = false + } + return -1 +} + // getLine returns a line, curData, the next data start index and a bool value. // If it has starting symbol the bool is true, otherwise is false. -func (e *LoadDataInfo) getLine(prevData, curData []byte) ([]byte, []byte, bool) { +func (e *LoadDataInfo) getLine(prevData, curData []byte, ignore bool) ([]byte, []byte, bool) { startingLen := len(e.LinesInfo.Starting) prevData, curData = e.getValidData(prevData, curData) if prevData == nil && len(curData) < startingLen { @@ -427,7 +505,11 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte) ([]byte, []byte, bool) } endIdx := -1 if len(curData) >= curStartIdx { - endIdx = strings.Index(string(hack.String(curData[curStartIdx:])), e.LinesInfo.Terminated) + if ignore { + endIdx = strings.Index(string(hack.String(curData[curStartIdx:])), e.LinesInfo.Terminated) + } else { + endIdx = e.indexOfTerminator(curData[curStartIdx:]) + } } if endIdx == -1 { // no terminated symbol @@ -437,7 +519,11 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte) ([]byte, []byte, bool) // terminated symbol in the middle of prevData and curData curData = append(prevData, curData...) - endIdx = strings.Index(string(hack.String(curData[startingLen:])), e.LinesInfo.Terminated) + if ignore { + endIdx = strings.Index(string(hack.String(curData[startingLen:])), e.LinesInfo.Terminated) + } else { + endIdx = e.indexOfTerminator(curData[startingLen:]) + } if endIdx != -1 { nextDataIdx := startingLen + endIdx + terminatedLen return curData[startingLen : startingLen+endIdx], curData[nextDataIdx:], true @@ -454,7 +540,11 @@ func (e *LoadDataInfo) getLine(prevData, curData []byte) ([]byte, []byte, bool) // terminated symbol in the curData prevData = append(prevData, curData[:nextDataIdx]...) - endIdx = strings.Index(string(hack.String(prevData[startingLen:])), e.LinesInfo.Terminated) + if ignore { + endIdx = strings.Index(string(hack.String(prevData[startingLen:])), e.LinesInfo.Terminated) + } else { + endIdx = e.indexOfTerminator(prevData[startingLen:]) + } if endIdx >= prevLen { return prevData[startingLen : startingLen+endIdx], curData[nextDataIdx:], true } @@ -479,7 +569,7 @@ func (e *LoadDataInfo) InsertData(ctx context.Context, prevData, curData []byte) prevData, curData = curData, prevData } for len(curData) > 0 { - line, curData, hasStarting = e.getLine(prevData, curData) + line, curData, hasStarting = e.getLine(prevData, curData, e.IgnoreLines > 0) prevData = nil // If it doesn't find the terminated symbol and this data isn't the last data, // the data can't be inserted. @@ -523,6 +613,14 @@ func (e *LoadDataInfo) InsertData(ctx context.Context, prevData, curData []byte) // CheckAndInsertOneBatch is used to commit one transaction batch full filled data func (e *LoadDataInfo) CheckAndInsertOneBatch(ctx context.Context, rows [][]types.Datum, cnt uint64) error { + if e.stats != nil && e.stats.BasicRuntimeStats != nil { + // Since this method will not call by executor Next, + // so we need record the basic executor runtime stats by ourself. + start := time.Now() + defer func() { + e.stats.BasicRuntimeStats.Record(time.Since(start), 0) + }() + } var err error if cnt == 0 { return err @@ -543,7 +641,7 @@ func (e *LoadDataInfo) SetMessage() { numDeletes := 0 numSkipped := numRecords - stmtCtx.CopiedRows() numWarnings := stmtCtx.WarningCount() - msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrLoadInfo], numRecords, numDeletes, numSkipped, numWarnings) + msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrLoadInfo].Raw, numRecords, numDeletes, numSkipped, numWarnings) e.ctx.GetSessionVars().StmtCtx.SetMessage(msg) } @@ -628,17 +726,19 @@ type fieldWriter struct { term string enclosedChar byte fieldTermChar byte + escapeChar byte isEnclosed bool isLineStart bool isFieldStart bool } -func (w *fieldWriter) Init(enclosedChar byte, fieldTermChar byte, readBuf []byte, term string) { +func (w *fieldWriter) Init(enclosedChar, escapeChar, fieldTermChar byte, readBuf []byte, term string) { w.isEnclosed = false w.isLineStart = true w.isFieldStart = true w.ReadBuf = readBuf w.enclosedChar = enclosedChar + w.escapeChar = escapeChar w.fieldTermChar = fieldTermChar w.term = term } @@ -744,13 +844,12 @@ func (w *fieldWriter) GetField() (bool, field) { w.OutputBuf = append(w.OutputBuf, w.enclosedChar) w.putback() } - } else if ch == '\\' { - // TODO: escape only support '\' + } else if ch == w.escapeChar { // When the escaped character is interpreted as if // it was not escaped, backslash is ignored. flag, ch = w.getChar() if flag { - w.OutputBuf = append(w.OutputBuf, '\\') + w.OutputBuf = append(w.OutputBuf, w.escapeChar) w.OutputBuf = append(w.OutputBuf, ch) } } else { @@ -772,10 +871,10 @@ func (e *LoadDataInfo) getFieldsFromLine(line []byte) ([]field, error) { return fields, nil } - reader.Init(e.FieldsInfo.Enclosed, e.FieldsInfo.Terminated[0], line, e.FieldsInfo.Terminated) + reader.Init(e.FieldsInfo.Enclosed, e.FieldsInfo.Escaped, e.FieldsInfo.Terminated[0], line, e.FieldsInfo.Terminated) for { eol, f := reader.GetField() - f = f.escape() + f = f.escape(reader.escapeChar) if bytes.Equal(f.str, null) && !f.enclosed { f.str = []byte{'N'} f.maybeNull = true @@ -790,12 +889,11 @@ func (e *LoadDataInfo) getFieldsFromLine(line []byte) ([]field, error) { // escape handles escape characters when running load data statement. // See http://dev.mysql.com/doc/refman/5.7/en/load-data.html -// TODO: escape only support '\' as the `ESCAPED BY` character, it should support specify characters. -func (f *field) escape() field { +func (f *field) escape(escapeChar byte) field { pos := 0 for i := 0; i < len(f.str); i++ { c := f.str[i] - if i+1 < len(f.str) && f.str[i] == '\\' { + if i+1 < len(f.str) && f.str[i] == escapeChar { c = f.escapeChar(f.str[i+1]) i++ } diff --git a/executor/mem_reader.go b/executor/mem_reader.go index 56c2ccb309f14..79bcc7d96288f 100644 --- a/executor/mem_reader.go +++ b/executor/mem_reader.go @@ -120,15 +120,8 @@ func (m *memIndexReader) decodeIndexKeyValue(key, value []byte, tps []*types.Fie if mysql.HasUnsignedFlag(tps[len(tps)-1].Flag) { hdStatus = tablecodec.HandleIsUnsigned } - colInfos := make([]rowcodec.ColInfo, 0, len(m.index.Columns)) - for _, idxCol := range m.index.Columns { - col := m.table.Columns[idxCol.Offset] - colInfos = append(colInfos, rowcodec.ColInfo{ - ID: col.ID, - IsPKHandle: m.table.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), - Ft: rowcodec.FieldTypeFromModelColumn(col), - }) - } + colInfos := tables.BuildRowcodecColInfoForIndexColumns(m.index, m.table) + colInfos = tables.TryAppendCommonHandleRowcodecColInfos(colInfos, m.table) values, err := tablecodec.DecodeIndexKV(key, value, len(m.index.Columns), hdStatus, colInfos) if err != nil { return nil, errors.Trace(err) @@ -279,14 +272,17 @@ func (m *memTableReader) getRowData(handle kv.Handle, value []byte) ([][]byte, e offset := colIDs[id] if m.table.IsCommonHandle { for i, colID := range m.pkColIDs { - if colID == col.ID { - values[offset] = handle.EncodedCol(i) - break + if colID == col.ID && !types.CommonHandleNeedRestoredData(&col.FieldType) { + // Only try to decode handle when there is no corresponding column in the value. + // This is because the information in handle may be incomplete in some cases. + // For example, prefixed clustered index like 'primary key(col1(1))' only store the leftmost 1 char in the handle. + if values[offset] == nil { + values[offset] = handle.EncodedCol(i) + break + } } } - continue - } - if (pkIsHandle && mysql.HasPriKeyFlag(col.Flag)) || id == model.ExtraHandleID { + } else if (pkIsHandle && mysql.HasPriKeyFlag(col.Flag)) || id == model.ExtraHandleID { var handleDatum types.Datum if mysql.HasUnsignedFlag(col.Flag) { // PK column is Unsigned. @@ -433,16 +429,11 @@ func (m *memIndexLookUpReader) getMemRows() ([][]types.Datum, error) { Ft: rowcodec.FieldTypeFromModelColumn(col), }) } - handleColIDs := []int64{-1} - if tblInfo.IsCommonHandle { - handleColIDs = handleColIDs[:0] - pkIdx := tables.FindPrimaryIndex(tblInfo) - for _, idxCol := range pkIdx.Columns { - colID := tblInfo.Columns[idxCol.Offset].ID - handleColIDs = append(handleColIDs, colID) - } + pkColIDs := tables.TryGetCommonPkColumnIds(tblInfo) + if len(pkColIDs) == 0 { + pkColIDs = []int64{-1} } - rd := rowcodec.NewByteDecoder(colInfos, handleColIDs, nil, nil) + rd := rowcodec.NewByteDecoder(colInfos, pkColIDs, nil, nil) memTblReader := &memTableReader{ ctx: m.ctx, table: m.table.Meta(), @@ -452,6 +443,7 @@ func (m *memIndexLookUpReader) getMemRows() ([][]types.Datum, error) { addedRows: make([][]types.Datum, 0, len(handles)), retFieldTypes: m.retFieldTypes, colIDs: colIDs, + pkColIDs: pkColIDs, buffer: allocBuf{ handleBytes: make([]byte, 0, 16), rd: rd, diff --git a/executor/memtable_reader.go b/executor/memtable_reader.go index 1f5a88e516982..75f7760a50e13 100644 --- a/executor/memtable_reader.go +++ b/executor/memtable_reader.go @@ -40,6 +40,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/pdapi" "github.com/pingcap/tidb/util/set" "go.uber.org/zap" @@ -53,9 +54,12 @@ type dummyCloser struct{} func (dummyCloser) close() error { return nil } +func (dummyCloser) getRuntimeStats() execdetails.RuntimeStats { return nil } + type memTableRetriever interface { retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) close() error + getRuntimeStats() execdetails.RuntimeStats } // MemTableReaderExec executes memTable information retrieving from the MemTable components @@ -127,6 +131,9 @@ func (e *MemTableReaderExec) Next(ctx context.Context, req *chunk.Chunk) error { // Close implements the Executor Close interface. func (e *MemTableReaderExec) Close() error { + if stats := e.retriever.getRuntimeStats(); stats != nil && e.runtimeStats != nil { + e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, stats) + } return e.retriever.close() } @@ -356,7 +363,8 @@ func getServerInfoByGRPC(ctx context.Context, address string, tp diagnosticspb.S opt := grpc.WithInsecure() security := config.GetGlobalConfig().Security if len(security.ClusterSSLCA) != 0 { - tlsConfig, err := security.ToTLSConfig() + clusterSecurity := security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() if err != nil { return nil, errors.Trace(err) } @@ -520,7 +528,8 @@ func (e *clusterLogRetriever) startRetrieving( opt := grpc.WithInsecure() security := config.GetGlobalConfig().Security if len(security.ClusterSSLCA) != 0 { - tlsConfig, err := security.ToTLSConfig() + clusterSecurity := security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() if err != nil { return nil, errors.Trace(err) } @@ -661,3 +670,7 @@ func (e *clusterLogRetriever) close() error { } return nil } + +func (e *clusterLogRetriever) getRuntimeStats() execdetails.RuntimeStats { + return nil +} diff --git a/executor/memtable_reader_test.go b/executor/memtable_reader_test.go index 4c5f70224dba4..cbcd8e98fd9b9 100644 --- a/executor/memtable_reader_test.go +++ b/executor/memtable_reader_test.go @@ -909,6 +909,7 @@ func (s *testMemTableReaderSuite) TestTiDBClusterLogError(c *C) { _, err = session.ResultSetToStringSlice(context.Background(), tk.Se, rs) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "denied to scan logs, please specified the start time, such as `time > '2020-01-01 00:00:00'`") + c.Assert(rs.Close(), IsNil) // Test without end time error. rs, err = tk.Exec("select * from information_schema.cluster_log where time>='2019/08/26 06:18:13.011'") @@ -916,6 +917,7 @@ func (s *testMemTableReaderSuite) TestTiDBClusterLogError(c *C) { _, err = session.ResultSetToStringSlice(context.Background(), tk.Se, rs) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "denied to scan logs, please specified the end time, such as `time < '2020-01-01 00:00:00'`") + c.Assert(rs.Close(), IsNil) // Test without specified message error. rs, err = tk.Exec("select * from information_schema.cluster_log where time>='2019/08/26 06:18:13.011' and time<'2019/08/26 16:18:13.011'") @@ -923,4 +925,5 @@ func (s *testMemTableReaderSuite) TestTiDBClusterLogError(c *C) { _, err = session.ResultSetToStringSlice(context.Background(), tk.Se, rs) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "denied to scan full logs (use `SELECT * FROM cluster_log WHERE message LIKE '%'` explicitly if intentionally)") + c.Assert(rs.Close(), IsNil) } diff --git a/executor/merge_join.go b/executor/merge_join.go index 54c54d8973466..d6374910a53b9 100644 --- a/executor/merge_join.go +++ b/executor/merge_join.go @@ -15,7 +15,6 @@ package executor import ( "context" - "fmt" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" @@ -24,7 +23,6 @@ import ( "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/disk" "github.com/pingcap/tidb/util/memory" - "github.com/pingcap/tidb/util/stringutil" ) // MergeJoinExec implements the merge join algorithm. @@ -53,11 +51,6 @@ type MergeJoinExec struct { diskTracker *disk.Tracker } -var ( - innerTableLabel fmt.Stringer = stringutil.StringerStr("innerTable") - outerTableLabel fmt.Stringer = stringutil.StringerStr("outerTable") -) - type mergeJoinTable struct { isInner bool childIndex int diff --git a/executor/merge_join_test.go b/executor/merge_join_test.go index 595871351f430..d3ce3efeadd45 100644 --- a/executor/merge_join_test.go +++ b/executor/merge_join_test.go @@ -220,7 +220,7 @@ const plan3 = `[[TableScan_12 { } ]]` func checkMergeAndRun(tk *testkit.TestKit, c *C, sql string) *testkit.Result { - explainedSQL := "explain " + sql + explainedSQL := "explain format = 'brief' " + sql result := tk.MustQuery(explainedSQL) resultStr := fmt.Sprintf("%v", result.Rows()) if !strings.ContainsAny(resultStr, "MergeJoin") { @@ -230,7 +230,7 @@ func checkMergeAndRun(tk *testkit.TestKit, c *C, sql string) *testkit.Result { } func checkPlanAndRun(tk *testkit.TestKit, c *C, plan string, sql string) *testkit.Result { - explainedSQL := "explain " + sql + explainedSQL := "explain format = 'brief' " + sql tk.MustQuery(explainedSQL) // TODO: Reopen it after refactoring explain. @@ -241,6 +241,43 @@ func checkPlanAndRun(tk *testkit.TestKit, c *C, plan string, sql string) *testki return tk.MustQuery(sql) } +func (s *testSerialSuite1) TestShuffleMergeJoinInDisk(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMUseTmpStorage = true + }) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/testMergeJoinRowContainerSpill", "return(true)"), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/testMergeJoinRowContainerSpill"), IsNil) + }() + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + sm := &mockSessionManager1{ + PS: make([]*util.ProcessInfo, 0), + } + tk.Se.SetSessionManager(sm) + s.domain.ExpensiveQueryHandle().SetSessionManager(sm) + + tk.MustExec("set @@tidb_mem_quota_query=1;") + tk.MustExec("set @@tidb_merge_join_concurrency=4;") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(c1 int, c2 int)") + tk.MustExec("create table t1(c1 int, c2 int)") + tk.MustExec("insert into t values(1,1)") + tk.MustExec("insert into t1 values(1,3),(4,4)") + + result := checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t1 left outer join t on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + result.Check(testkit.Rows("1 3 1 1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.BytesConsumed(), Equals, int64(0)) + c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.MaxConsumed(), Greater, int64(0)) + c.Assert(tk.Se.GetSessionVars().StmtCtx.DiskTracker.BytesConsumed(), Equals, int64(0)) + c.Assert(tk.Se.GetSessionVars().StmtCtx.DiskTracker.MaxConsumed(), Greater, int64(0)) + return +} func (s *testSerialSuite1) TestMergeJoinInDisk(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { @@ -370,13 +407,174 @@ func (s *testSuite2) TestMergeJoin(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") tk.MustExec("insert into t value(1),(2)") - tk.MustQuery("explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( - "Sort_6 100000000.00 root test.t.a, test.t.a", - "└─MergeJoin_9 100000000.00 root inner join", - " ├─TableReader_13(Build) 10000.00 root data:TableFullScan_12", - " │ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_11(Probe) 10000.00 root data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( + "Sort 100000000.00 root test.t.a, test.t.a", + "└─MergeJoin 100000000.00 root inner join", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( + "1 1", + "1 2", + "2 1", + "2 2", + )) + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists s") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1),(1,2)") + tk.MustExec("create table s(a int, b int)") + tk.MustExec("insert into s values(1,1)") + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( + "MergeJoin 10000.00 root left outer semi join, other cond:eq(test.t.a, test.s.a), ge(test.s.b, test.t.b)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( + "1", + "0", + )) + + // Test TIDB_SMJ for join with order by desc, see https://github.com/pingcap/tidb/issues/14483 + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t (a int, key(a))") + tk.MustExec("create table t1 (a int, key(a))") + tk.MustExec("insert into t values (1), (2), (3)") + tk.MustExec("insert into t1 values (1), (2), (3)") + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t.a from t, t1 where t.a = t1.a order by t1.a desc").Check(testkit.Rows( + "3", "2", "1")) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, key(a), key(b))") + tk.MustExec("insert into t values (1,1),(1,2),(1,3),(2,1),(2,2),(3,1),(3,2),(3,3)") + tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a desc").Check(testkit.Rows( + "3", "3", "3", "3", "3", "3", + "2", "2", "2", "2", "2", "2", + "1", "1", "1", "1", "1", "1", "1", "1", "1")) + + tk.MustExec("drop table if exists s") + tk.MustExec("create table s (a int)") + tk.MustExec("insert into s values (4), (1), (3), (2)") + tk.MustQuery("explain format = 'brief' select s1.a1 from (select a as a1 from s order by s.a desc) as s1 join (select a as a2 from s order by s.a desc) as s2 on s1.a1 = s2.a2 order by s1.a1 desc").Check(testkit.Rows( + "MergeJoin 12487.50 root inner join, left key:test.s.a, right key:test.s.a", + "├─Sort(Build) 9990.00 root test.s.a:desc", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.s.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.s.a:desc", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.s.a))", + " └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + )) + tk.MustQuery("select s1.a1 from (select a as a1 from s order by s.a desc) as s1 join (select a as a2 from s order by s.a desc) as s2 on s1.a1 = s2.a2 order by s1.a1 desc").Check(testkit.Rows( + "4", "3", "2", "1")) +} + +func (s *testSuite2) TestShuffleMergeJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_merge_join_concurrency = 4;") + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(c1 int, c2 int)") + tk.MustExec("create table t1(c1 int, c2 int)") + tk.MustExec("insert into t values(1,1),(2,2)") + tk.MustExec("insert into t1 values(2,3),(4,4)") + + result := checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t left outer join t1 on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + result.Check(testkit.Rows("1 1 ")) + result = checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t1 right outer join t on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + result.Check(testkit.Rows(" 1 1")) + result = checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t right outer join t1 on t.c1 = t1.c1 where t.c1 = 1 or t1.c2 > 20") + result.Check(testkit.Rows()) + result = checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t left outer join t1 on t.c1 = t1.c1 where t1.c1 = 3 or false") + result.Check(testkit.Rows()) + result = checkMergeAndRun(tk, c, "select /*+ TIDB_SMJ(t) */ * from t left outer join t1 on t.c1 = t1.c1 and t.c1 != 1 order by t1.c1") + result.Check(testkit.Rows("1 1 ", "2 2 2 3")) + + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t3") + + tk.MustExec("create table t1 (c1 int, c2 int)") + tk.MustExec("create table t2 (c1 int, c2 int)") + tk.MustExec("create table t3 (c1 int, c2 int)") + + tk.MustExec("insert into t1 values (1,1), (2,2), (3,3)") + tk.MustExec("insert into t2 values (1,1), (3,3), (5,5)") + tk.MustExec("insert into t3 values (1,1), (5,5), (9,9)") + + result = tk.MustQuery("select /*+ TIDB_SMJ(t1,t2,t3) */ * from t1 left join t2 on t1.c1 = t2.c1 right join t3 on t2.c1 = t3.c1 order by t1.c1, t1.c2, t2.c1, t2.c2, t3.c1, t3.c2;") + result.Check(testkit.Rows(" 5 5", " 9 9", "1 1 1 1 1 1")) + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (c1 int)") + tk.MustExec("insert into t1 values (1), (1), (1)") + result = tk.MustQuery("select/*+ TIDB_SMJ(t) */ * from t1 a join t1 b on a.c1 = b.c1;") + result.Check(testkit.Rows("1 1", "1 1", "1 1", "1 1", "1 1", "1 1", "1 1", "1 1", "1 1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(c1 int, index k(c1))") + tk.MustExec("create table t1(c1 int)") + tk.MustExec("insert into t values (1),(2),(3),(4),(5),(6),(7)") + tk.MustExec("insert into t1 values (1),(2),(3),(4),(5),(6),(7)") + result = tk.MustQuery("select /*+ TIDB_SMJ(a,b) */ a.c1 from t a , t1 b where a.c1 = b.c1 order by a.c1;") + result.Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + result = tk.MustQuery("select /*+ TIDB_SMJ(a, b) */ a.c1 from t a , (select * from t1 limit 3) b where a.c1 = b.c1 order by b.c1;") + result.Check(testkit.Rows("1", "2", "3")) + // Test LogicalSelection under LogicalJoin. + result = tk.MustQuery("select /*+ TIDB_SMJ(a, b) */ a.c1 from t a , (select * from t1 limit 3) b where a.c1 = b.c1 and b.c1 is not null order by b.c1;") + result.Check(testkit.Rows("1", "2", "3")) + tk.MustExec("begin;") + // Test LogicalLock under LogicalJoin. + result = tk.MustQuery("select /*+ TIDB_SMJ(a, b) */ a.c1 from t a , (select * from t1 for update) b where a.c1 = b.c1 order by a.c1;") + result.Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + // Test LogicalUnionScan under LogicalJoin. + tk.MustExec("insert into t1 values(8);") + result = tk.MustQuery("select /*+ TIDB_SMJ(a, b) */ a.c1 from t a , t1 b where a.c1 = b.c1;") + result.Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7")) + tk.MustExec("rollback;") + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(c1 int)") + tk.MustExec("create table t1(c1 int unsigned)") + tk.MustExec("insert into t values (1)") + tk.MustExec("insert into t1 values (1)") + result = tk.MustQuery("select /*+ TIDB_SMJ(t,t1) */ t.c1 from t , t1 where t.c1 = t1.c1") + result.Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, index a(a), index b(b))") + tk.MustExec("insert into t values(1, 2)") + tk.MustQuery("select /*+ TIDB_SMJ(t, t1) */ t.a, t1.b from t right join t t1 on t.a = t1.b order by t.a").Check(testkit.Rows(" 2")) + + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists s") + tk.MustExec("create table t(a int, b int, primary key(a, b))") + tk.MustExec("insert into t value(1,1),(1,2),(1,3),(1,4)") + tk.MustExec("create table s(a int, primary key(a))") + tk.MustExec("insert into s value(1)") + tk.MustQuery("select /*+ TIDB_SMJ(t, s) */ count(*) from t join s on t.a = s.a").Check(testkit.Rows("4")) + + // Test TIDB_SMJ for cartesian product. + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t value(1),(2)") + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( + "Sort 100000000.00 root test.t.a, test.t.a", + "└─MergeJoin 100000000.00 root inner join", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", )) tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t t1 join t t2 order by t1.a, t2.a").Check(testkit.Rows( "1 1", @@ -391,12 +589,12 @@ func (s *testSuite2) TestMergeJoin(c *C) { tk.MustExec("insert into t values(1,1),(1,2)") tk.MustExec("create table s(a int, b int)") tk.MustExec("insert into s values(1,1)") - tk.MustQuery("explain select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( - "MergeJoin_8 10000.00 root left outer semi join, other cond:eq(test.t.a, test.s.a), ge(test.s.b, test.t.b)", - "├─TableReader_12(Build) 10000.00 root data:TableFullScan_11", - "│ └─TableFullScan_11 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", - "└─TableReader_10(Probe) 10000.00 root data:TableFullScan_9", - " └─TableFullScan_9 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( + "MergeJoin 10000.00 root left outer semi join, other cond:eq(test.t.a, test.s.a), ge(test.s.b, test.t.b)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", )) tk.MustQuery("select /*+ TIDB_SMJ(t, s) */ a in (select a from s where s.b >= t.b) from t").Check(testkit.Rows( "1", @@ -423,16 +621,16 @@ func (s *testSuite2) TestMergeJoin(c *C) { tk.MustExec("drop table if exists s") tk.MustExec("create table s (a int)") tk.MustExec("insert into s values (4), (1), (3), (2)") - tk.MustQuery("explain select s1.a1 from (select a as a1 from s order by s.a desc) as s1 join (select a as a2 from s order by s.a desc) as s2 on s1.a1 = s2.a2 order by s1.a1 desc").Check(testkit.Rows( - "MergeJoin_28 12487.50 root inner join, left key:test.s.a, right key:test.s.a", - "├─Sort_31(Build) 9990.00 root test.s.a:desc", - "│ └─TableReader_26 9990.00 root data:Selection_25", - "│ └─Selection_25 9990.00 cop[tikv] not(isnull(test.s.a))", - "│ └─TableFullScan_24 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", - "└─Sort_29(Probe) 9990.00 root test.s.a:desc", - " └─TableReader_21 9990.00 root data:Selection_20", - " └─Selection_20 9990.00 cop[tikv] not(isnull(test.s.a))", - " └─TableFullScan_19 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + tk.MustQuery("explain format = 'brief' select s1.a1 from (select a as a1 from s order by s.a desc) as s1 join (select a as a2 from s order by s.a desc) as s2 on s1.a1 = s2.a2 order by s1.a1 desc").Check(testkit.Rows( + "MergeJoin 12487.50 root inner join, left key:test.s.a, right key:test.s.a", + "├─Sort(Build) 9990.00 root test.s.a:desc", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.s.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", + "└─Sort(Probe) 9990.00 root test.s.a:desc", + " └─TableReader 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.s.a))", + " └─TableFullScan 10000.00 cop[tikv] table:s keep order:false, stats:pseudo", )) tk.MustQuery("select s1.a1 from (select a as a1 from s order by s.a desc) as s1 join (select a as a2 from s order by s.a desc) as s2 on s1.a1 = s2.a2 order by s1.a1 desc").Check(testkit.Rows( "4", "3", "2", "1")) @@ -463,6 +661,32 @@ func (s *testSuite2) Test3WaysMergeJoin(c *C) { result.Check(testkit.Rows("2 2 2 3 2 4", "3 3 3 4 3 10")) } +func (s *testSuite2) Test3WaysShuffleMergeJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_merge_join_concurrency = 4;") + + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("drop table if exists t3") + tk.MustExec("create table t1(c1 int, c2 int, PRIMARY KEY (c1))") + tk.MustExec("create table t2(c1 int, c2 int, PRIMARY KEY (c1))") + tk.MustExec("create table t3(c1 int, c2 int, PRIMARY KEY (c1))") + tk.MustExec("insert into t1 values(1,1),(2,2),(3,3)") + tk.MustExec("insert into t2 values(2,3),(3,4),(4,5)") + tk.MustExec("insert into t3 values(1,2),(2,4),(3,10)") + result := checkPlanAndRun(tk, c, plan1, "select /*+ TIDB_SMJ(t1,t2,t3) */ * from t1 join t2 on t1.c1 = t2.c1 join t3 on t2.c1 = t3.c1 order by 1") + result.Check(testkit.Rows("2 2 2 3 2 4", "3 3 3 4 3 10")) + + result = checkPlanAndRun(tk, c, plan2, "select /*+ TIDB_SMJ(t1,t2,t3) */ * from t1 right outer join t2 on t1.c1 = t2.c1 join t3 on t2.c1 = t3.c1 order by 1") + result.Check(testkit.Rows("2 2 2 3 2 4", "3 3 3 4 3 10")) + + // In below case, t1 side filled with null when no matched join, so that order is not kept and sort appended + // On the other hand, t1 order kept so no final sort appended + result = checkPlanAndRun(tk, c, plan3, "select /*+ TIDB_SMJ(t1,t2,t3) */ * from t1 right outer join t2 on t1.c1 = t2.c1 join t3 on t1.c1 = t3.c1 order by 1") + result.Check(testkit.Rows("2 2 2 3 2 4", "3 3 3 4 3 10")) +} + func (s *testSuite2) TestMergeJoinDifferentTypes(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("set @@session.tidb_executor_concurrency = 4;") @@ -530,25 +754,124 @@ func (s *testSuiteJoin3) TestVectorizedMergeJoin(c *C) { insert("t1", t1) insert("t2", t2) - tk.MustQuery("explain select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( - `MergeJoin_7 4150.01 root inner join, left key:test.t1.a, right key:test.t2.a`, - `├─Sort_15(Build) 3320.01 root test.t2.a`, - `│ └─TableReader_14 3320.01 root data:Selection_13`, - `│ └─Selection_13 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, - `│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, - `└─Sort_11(Probe) 3330.00 root test.t1.a`, - ` └─TableReader_10 3330.00 root data:Selection_9`, - ` └─Selection_9 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, - ` └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( + `MergeJoin 4150.01 root inner join, left key:test.t1.a, right key:test.t2.a`, + `├─Sort(Build) 3320.01 root test.t2.a`, + `│ └─TableReader 3320.01 root data:Selection`, + `│ └─Selection 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, + `│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, + `└─Sort(Probe) 3330.00 root test.t1.a`, + ` └─TableReader 3330.00 root data:Selection`, + ` └─Selection 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, + ` └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, + )) + tk.MustQuery("explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( + `HashJoin 4150.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]`, + `├─TableReader(Build) 3320.01 root data:Selection`, + `│ └─Selection 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, + `│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, + `└─TableReader(Probe) 3330.00 root data:Selection`, + ` └─Selection 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, + ` └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, + )) + + r1 := tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Sort() + r2 := tk.MustQuery("select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Sort() + c.Assert(len(r1.Rows()), Equals, len(r2.Rows())) + + i := 0 + n := len(r1.Rows()) + for i < n { + c.Assert(len(r1.Rows()[i]), Equals, len(r2.Rows()[i])) + for j := range r1.Rows()[i] { + c.Assert(r1.Rows()[i][j], Equals, r2.Rows()[i][j]) + } + i += rand.Intn((n-i)/5+1) + 1 // just compare parts of results to speed up + } + } + + tk.Se.GetSessionVars().MaxChunkSize = variable.DefInitChunkSize + chunkSize := tk.Se.GetSessionVars().MaxChunkSize + cases := []struct { + t1 []int + t2 []int + }{ + {[]int{0}, []int{chunkSize}}, + {[]int{0}, []int{chunkSize - 1}}, + {[]int{0}, []int{chunkSize + 1}}, + {[]int{1}, []int{chunkSize}}, + {[]int{1}, []int{chunkSize - 1}}, + {[]int{1}, []int{chunkSize + 1}}, + {[]int{chunkSize - 1}, []int{chunkSize}}, + {[]int{chunkSize - 1}, []int{chunkSize - 1}}, + {[]int{chunkSize - 1}, []int{chunkSize + 1}}, + {[]int{chunkSize}, []int{chunkSize}}, + {[]int{chunkSize}, []int{chunkSize - 1}}, + {[]int{chunkSize}, []int{chunkSize + 1}}, + {[]int{chunkSize + 1}, []int{chunkSize}}, + {[]int{chunkSize + 1}, []int{chunkSize - 1}}, + {[]int{chunkSize + 1}, []int{chunkSize + 1}}, + {[]int{1, 1, 1}, []int{chunkSize + 1, chunkSize*5 + 5, chunkSize - 5}}, + {[]int{0, 0, chunkSize}, []int{chunkSize + 1, chunkSize*5 + 5, chunkSize - 5}}, + {[]int{chunkSize + 1, 0, chunkSize}, []int{chunkSize + 1, chunkSize*5 + 5, chunkSize - 5}}, + } + for _, ca := range cases { + runTest(ca.t1, ca.t2) + runTest(ca.t2, ca.t1) + } +} + +// TestVectorizedShuffleMergeJoin is used to test vectorized shuffle merge join with some corner cases. +func (s *testSuiteJoin3) TestVectorizedShuffleMergeJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@session.tidb_merge_join_concurrency = 4;") + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("create table t2 (a int, b int)") + runTest := func(t1, t2 []int) { + tk.MustExec("truncate table t1") + tk.MustExec("truncate table t2") + insert := func(tName string, ts []int) { + for i, n := range ts { + if n == 0 { + continue + } + var buf bytes.Buffer + buf.WriteString(fmt.Sprintf("insert into %v values ", tName)) + for j := 0; j < n; j++ { + if j > 0 { + buf.WriteString(", ") + } + buf.WriteString(fmt.Sprintf("(%v, %v)", i, rand.Intn(10))) + } + tk.MustExec(buf.String()) + } + } + insert("t1", t1) + insert("t2", t2) + + tk.MustQuery("explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( + `Shuffle 4150.01 root execution info: concurrency:4, data sources:[TableReader TableReader]`, + `└─MergeJoin 4150.01 root inner join, left key:test.t1.a, right key:test.t2.a`, + ` ├─Sort(Build) 3320.01 root test.t2.a`, + ` │ └─TableReader 3320.01 root data:Selection`, + ` │ └─Selection 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, + ` │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, + ` └─Sort(Probe) 3330.00 root test.t1.a`, + ` └─TableReader 3330.00 root data:Selection`, + ` └─Selection 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, + ` └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, )) - tk.MustQuery("explain select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( - `HashJoin_7 4150.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]`, - `├─TableReader_14(Build) 3320.01 root data:Selection_13`, - `│ └─Selection_13 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, - `│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, - `└─TableReader_11(Probe) 3330.00 root data:Selection_10`, - ` └─Selection_10 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, - ` └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, + tk.MustQuery("explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Check(testkit.Rows( + `HashJoin 4150.01 root inner join, equal:[eq(test.t1.a, test.t2.a)]`, + `├─TableReader(Build) 3320.01 root data:Selection`, + `│ └─Selection 3320.01 cop[tikv] lt(test.t2.b, 5), not(isnull(test.t2.a))`, + `│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo`, + `└─TableReader(Probe) 3330.00 root data:Selection`, + ` └─Selection 3330.00 cop[tikv] gt(test.t1.b, 5), not(isnull(test.t1.a))`, + ` └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo`, )) r1 := tk.MustQuery("select /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a=t2.a and t1.b>5 and t2.b<5").Sort() @@ -613,3 +936,21 @@ func (s *testSuite2) TestMergeJoinWithOtherConditions(c *C) { `2`, )) } + +func (s *testSuite2) TestShuffleMergeJoinWithOtherConditions(c *C) { + // more than one inner tuple should be filtered on other conditions + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec("set @@session.tidb_merge_join_concurrency = 4;") + tk.MustExec(`drop table if exists R;`) + tk.MustExec(`drop table if exists Y;`) + tk.MustExec(`create table Y (a int primary key, b int, index id_b(b));`) + tk.MustExec(`insert into Y values (0,2),(2,2);`) + tk.MustExec(`create table R (a int primary key, b int);`) + tk.MustExec(`insert into R values (2,2);`) + // the max() limits the required rows at most one + // TODO(fangzhuhe): specify Y as the build side using hints + tk.MustQuery(`select /*+tidb_smj(R)*/ max(Y.a) from R join Y on R.a=Y.b where R.b <= Y.a;`).Check(testkit.Rows( + `2`, + )) +} diff --git a/executor/metrics_reader.go b/executor/metrics_reader.go index 91cb8159bfc27..ff582c23b9935 100644 --- a/executor/metrics_reader.go +++ b/executor/metrics_reader.go @@ -189,7 +189,7 @@ type MetricsSummaryRetriever struct { retrieved bool } -func (e *MetricsSummaryRetriever) retrieve(_ context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { +func (e *MetricsSummaryRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { if e.retrieved || e.extractor.SkipRequest { return nil, nil } @@ -229,7 +229,12 @@ func (e *MetricsSummaryRetriever) retrieve(_ context.Context, sctx sessionctx.Co name, util.MetricSchemaName.L, condition) } - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, sql) + if err != nil { + return nil, errors.Errorf("execute '%s' failed: %v", sql, err) + } + rows, _, err := exec.ExecRestrictedStmt(ctx, stmt) if err != nil { return nil, errors.Errorf("execute '%s' failed: %v", sql, err) } @@ -306,7 +311,12 @@ func (e *MetricsSummaryByLabelRetriever) retrieve(ctx context.Context, sctx sess sql = fmt.Sprintf("select sum(value),avg(value),min(value),max(value) from `%s`.`%s` %s", util.MetricSchemaName.L, name, cond) } - rows, _, err := sctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithContext(ctx, sql) + exec := sctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(ctx, sql) + if err != nil { + return nil, errors.Errorf("execute '%s' failed: %v", sql, err) + } + rows, _, err := exec.ExecRestrictedStmt(ctx, stmt) if err != nil { return nil, errors.Errorf("execute '%s' failed: %v", sql, err) } diff --git a/executor/mpp_gather.go b/executor/mpp_gather.go new file mode 100644 index 0000000000000..107d3501c6d5f --- /dev/null +++ b/executor/mpp_gather.go @@ -0,0 +1,146 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import ( + "context" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/distsql" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tipb/go-tipb" + "go.uber.org/zap" +) + +func useMPPExecution(ctx sessionctx.Context, tr *plannercore.PhysicalTableReader) bool { + if !ctx.GetSessionVars().AllowMPPExecution || collate.NewCollationEnabled() { + return false + } + _, ok := tr.GetTablePlan().(*plannercore.PhysicalExchangeSender) + return ok +} + +// MPPGather dispatch MPP tasks and read data from root tasks. +type MPPGather struct { + // following fields are construct needed + baseExecutor + is infoschema.InfoSchema + originalPlan plannercore.PhysicalPlan + startTS uint64 + + allocTaskID *int64 + mppReqs []*kv.MPPDispatchRequest + + respIter distsql.SelectResult +} + +func (e *MPPGather) appendMPPDispatchReq(pf *plannercore.Fragment, tasks []*kv.MPPTask, isRoot bool) error { + dagReq, _, err := constructDAGReq(e.ctx, []plannercore.PhysicalPlan{pf.ExchangeSender}, kv.TiFlash) + if err != nil { + return errors.Trace(err) + } + for i := range pf.ExchangeSender.Schema().Columns { + dagReq.OutputOffsets = append(dagReq.OutputOffsets, uint32(i)) + } + if !isRoot { + dagReq.EncodeType = tipb.EncodeType_TypeCHBlock + } else { + dagReq.EncodeType = tipb.EncodeType_TypeChunk + } + for _, mppTask := range tasks { + err := updateExecutorTableID(context.Background(), dagReq.RootExecutor, mppTask.TableID, true) + if err != nil { + return errors.Trace(err) + } + pbData, err := dagReq.Marshal() + if err != nil { + return errors.Trace(err) + } + logutil.BgLogger().Info("Dispatch mpp task", zap.Uint64("timestamp", mppTask.StartTs), zap.Int64("ID", mppTask.ID), zap.String("address", mppTask.Meta.GetAddress()), zap.String("plan", plannercore.ToString(pf.ExchangeSender))) + req := &kv.MPPDispatchRequest{ + Data: pbData, + Meta: mppTask.Meta, + ID: mppTask.ID, + IsRoot: isRoot, + Timeout: 10, + SchemaVar: e.is.SchemaMetaVersion(), + StartTs: e.startTS, + State: kv.MppTaskReady, + } + e.mppReqs = append(e.mppReqs, req) + } + for _, r := range pf.ExchangeReceivers { + err = e.appendMPPDispatchReq(r.ChildPf, r.Tasks, false) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + +func collectPlanIDS(plan plannercore.PhysicalPlan, ids []int) []int { + ids = append(ids, plan.ID()) + for _, child := range plan.Children() { + ids = collectPlanIDS(child, ids) + } + return ids +} + +// Open decides the task counts and locations and generate exchange operators for every plan fragment. +// Then dispatch tasks to tiflash stores. If any task fails, it would cancel the rest tasks. +func (e *MPPGather) Open(ctx context.Context) (err error) { + // TODO: Move the construct tasks logic to planner, so we can see the explain results. + sender := e.originalPlan.(*plannercore.PhysicalExchangeSender) + planIDs := collectPlanIDS(e.originalPlan, nil) + rootTasks, err := plannercore.GenerateRootMPPTasks(e.ctx, e.startTS, sender, e.allocTaskID, e.is) + if err != nil { + return errors.Trace(err) + } + err = e.appendMPPDispatchReq(sender.Fragment, rootTasks, true) + if err != nil { + return errors.Trace(err) + } + failpoint.Inject("checkTotalMPPTasks", func(val failpoint.Value) { + if val.(int) != len(e.mppReqs) { + failpoint.Return(errors.Errorf("The number of tasks is not right, expect %d tasks but actually there are %d tasks", val.(int), len(e.mppReqs))) + } + }) + e.respIter, err = distsql.DispatchMPPTasks(ctx, e.ctx, e.mppReqs, e.retFieldTypes, planIDs, e.id) + if err != nil { + return errors.Trace(err) + } + e.respIter.Fetch(ctx) + return nil +} + +// Next fills data into the chunk passed by its caller. +func (e *MPPGather) Next(ctx context.Context, chk *chunk.Chunk) error { + err := e.respIter.Next(ctx, chk) + return errors.Trace(err) +} + +// Close and release the used resources. +func (e *MPPGather) Close() error { + if e.respIter != nil { + return e.respIter.Close() + } + return nil +} diff --git a/executor/opt_rule_blacklist.go b/executor/opt_rule_blacklist.go index 8bb55c16f52e5..76cdc74ea1d11 100644 --- a/executor/opt_rule_blacklist.go +++ b/executor/opt_rule_blacklist.go @@ -35,8 +35,12 @@ func (e *ReloadOptRuleBlacklistExec) Next(ctx context.Context, _ *chunk.Chunk) e // LoadOptRuleBlacklist loads the latest data from table mysql.opt_rule_blacklist. func LoadOptRuleBlacklist(ctx sessionctx.Context) (err error) { - sql := "select HIGH_PRIORITY name from mysql.opt_rule_blacklist" - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), "select HIGH_PRIORITY name from mysql.opt_rule_blacklist") + if err != nil { + return err + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return err } diff --git a/executor/parallel_apply.go b/executor/parallel_apply.go index 7b16ab3404b00..8c215e0bddb60 100644 --- a/executor/parallel_apply.go +++ b/executor/parallel_apply.go @@ -20,6 +20,7 @@ import ( "sync/atomic" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/util/chunk" @@ -81,7 +82,6 @@ type ParallelNestedLoopApplyExec struct { useCache bool cacheHitCounter int64 cacheAccessCounter int64 - cacheLock sync.RWMutex memTracker *memory.Tracker // track memory usage. } @@ -197,6 +197,7 @@ func (e *ParallelNestedLoopApplyExec) outerWorker(ctx context.Context) { var selected []bool var err error for { + failpoint.Inject("parallelApplyOuterWorkerPanic", nil) chk := newFirstChunk(e.outerExec) if err := Next(ctx, e.outerExec, chk); err != nil { e.putResult(nil, err) @@ -234,6 +235,7 @@ func (e *ParallelNestedLoopApplyExec) innerWorker(ctx context.Context, id int) { case <-e.exit: return } + failpoint.Inject("parallelApplyInnerWorkerPanic", nil) err := e.fillInnerChunk(ctx, id, chk) if err == nil && chk.NumRows() == 0 { // no more data, this goroutine can exit return @@ -277,9 +279,8 @@ func (e *ParallelNestedLoopApplyExec) fetchAllInners(ctx context.Context, id int } if e.useCache { // look up the cache atomic.AddInt64(&e.cacheAccessCounter, 1) - e.cacheLock.RLock() + failpoint.Inject("parallelApplyGetCachePanic", nil) value, err := e.cache.Get(key) - e.cacheLock.RUnlock() if err != nil { return err } @@ -325,8 +326,7 @@ func (e *ParallelNestedLoopApplyExec) fetchAllInners(ctx context.Context, id int } if e.useCache { // update the cache - e.cacheLock.Lock() - defer e.cacheLock.Unlock() + failpoint.Inject("parallelApplySetCachePanic", nil) if _, err := e.cache.Set(key, e.innerList[id]); err != nil { return err } diff --git a/executor/parallel_apply_test.go b/executor/parallel_apply_test.go index 21ae0471621ca..6db533b971fee 100644 --- a/executor/parallel_apply_test.go +++ b/executor/parallel_apply_test.go @@ -18,23 +18,30 @@ import ( "strings" . "github.com/pingcap/check" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/testkit" ) -func checkApplyPlan(c *C, tk *testkit.TestKit, sql string, enabled bool) { +func checkApplyPlan(c *C, tk *testkit.TestKit, sql string, parallel int) { results := tk.MustQuery("explain analyze " + sql) - first := true + containApply := false for _, row := range results.Rows() { line := fmt.Sprintf("%v", row) if strings.Contains(line, "Apply") { - if enabled && first { - c.Assert(strings.Contains(line, "Concurrency"), IsTrue) - first = false - } else { - c.Assert(strings.Contains(line, "Concurrency"), IsFalse) + if parallel > 0 { // check the concurrency if parallel is larger than 0 + str := "Concurrency:" + if parallel > 1 { + str += fmt.Sprintf("%v", parallel) + } + c.Assert(strings.Contains(line, str), IsTrue) } + containApply = true + break } } + c.Assert(containApply, IsTrue) return } @@ -45,13 +52,547 @@ func (s *testSuite) TestParallelApply(c *C) { tk.MustExec("insert into t values (0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (null, null)") q1 := "select t1.b from t t1 where t1.b > (select max(b) from t t2 where t1.a > t2.a)" - checkApplyPlan(c, tk, q1, false) + checkApplyPlan(c, tk, q1, 0) tk.MustQuery(q1).Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) tk.MustExec("set tidb_enable_parallel_apply=true") - checkApplyPlan(c, tk, q1, true) + checkApplyPlan(c, tk, q1, 1) tk.MustQuery(q1).Sort().Check(testkit.Rows("1", "2", "3", "4", "5", "6", "7", "8", "9")) q2 := "select * from t t0 where t0.b <= (select max(t1.b) from t t1 where t1.b > (select max(b) from t t2 where t1.a > t2.a and t0.a > t2.a));" - checkApplyPlan(c, tk, q2, true) // only the outside apply can be parallel + checkApplyPlan(c, tk, q2, 1) // only the outside apply can be parallel tk.MustQuery(q2).Sort().Check(testkit.Rows("1 1", "2 2", "3 3", "4 4", "5 5", "6 6", "7 7", "8 8", "9 9")) } + +func (s *testSuite) TestApplyColumnType(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // int + tk.MustExec("create table t(a int, b int)") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("insert into t values(1,1), (2,2), (5,5), (2, 4), (5, 2), (9, 4)") + tk.MustExec("insert into t1 values(2, 3), (4, 9), (10, 4), (1, 10)") + sql := "select * from t where t.b > (select min(t1.b) from t1 where t1.a > t.a)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("5 5")) + + // varchar + tk.MustExec("drop table t, t1") + tk.MustExec("create table t1(a varchar(255), b varchar(255))") + tk.MustExec("create table t2(a varchar(255))") + tk.MustExec(`insert into t1 values("aa", "bb"), ("aa", "tikv"), ("bb", "cc"), ("bb", "ee")`) + tk.MustExec(`insert into t2 values("kk"), ("aa"), ("dd"), ("bb")`) + sql = "select (select min(t2.a) from t2 where t2.a > t1.a) from t1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("bb", "bb", "dd", "dd")) + + // bit + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a bit(10), b int)") + tk.MustExec("create table t2(a bit(10), b int)") + tk.MustExec(`insert into t1 values ('1', 1), ('2', 2), ('3', 3), ('4', 4), ('1', 1), ('2', 2), ('3', 3), ('4', 4)`) + tk.MustExec(`insert into t2 values ('1', 1), ('2', 2), ('3', 3), ('4', 4), ('1', 1), ('2', 2), ('3', 3), ('4', 4)`) + sql = "select b from t1 where t1.b > (select min(t2.b) from t2 where t2.a < t1.a)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("2", "2", "3", "3", "4", "4")) + + // char + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a char(25), b int)") + tk.MustExec("create table t2(a char(10), b int)") + tk.MustExec(`insert into t1 values("abc", 1), ("abc", "5"), ("fff", 4), ("fff", 9), ("tidb", 6), ("tidb", 5)`) + tk.MustExec(`insert into t2 values()`) + sql = "select t1.b from t1 where t1.b > (select max(t2.b) from t2 where t2.a > t1.a)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows()) + + // double + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a int, b double)") + tk.MustExec("create table t2(a int, b double)") + tk.MustExec("insert into t1 values(1, 2.12), (1, 1.11), (2, 3), (2, 4.56), (5, 55), (5, -4)") + tk.MustExec("insert into t2 values(1, 3.22), (3, 4.5), (5, 2.3), (4, 5.55)") + sql = "select * from t1 where t1.a < (select avg(t2.a) from t2 where t2.b > t1.b)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 1.11", "1 2.12", "2 3", "2 4.56")) + + // date + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a date, b int, c int)") + tk.MustExec("create table t2(a date, b int)") + tk.MustExec(`insert into t1 values("2020-01-01", 3, 4), ("2020-01-01", 4, 5), ("2020-01-01", 4, 3), ("2020-02-01", 7, 7), ("2020-02-01", 6, 6)`) + tk.MustExec(`insert into t2 values("2020-01-02", 4), ("2020-02-02", 8), ("2020-02-02", 7)`) + sql = "select * from t1 where t1.b >= (select min(t2.b) from t2 where t2.a > t1.a) and t1.c >= (select min(t2.b) from t2 where t2.a > t1.a)" + tk.MustQuery(sql).Sort().Check(testkit.Rows("2020-01-01 4 5", "2020-02-01 7 7")) + + // datetime + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a datetime, b int)") + tk.MustExec("create table t2(a datetime, b int)") + tk.MustExec(`insert into t1 values("2020-01-01 00:00:00", 1), ("2020-01-01 00:00:00", 2), ("2020-06-06 00:00:00", 3), ("2020-06-06 00:00:00", 4), ("2020-09-08 00:00:00", 4)`) + tk.MustExec(`insert into t2 values("2020-01-01 00:00:00", 1), ("2020-01-01 00:00:01", 2), ("2020-08-20 00:00:00", 4)`) + sql = "select b from t1 where t1.b >= (select max(t2.b) from t2 where t2.a > t1.a)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("4")) + + // timestamp + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a timestamp, b int)") + tk.MustExec("create table t2(a timestamp, b int)") + tk.MustExec(`insert into t1 values("2020-01-01 00:00:00", 1), ("2020-01-01 00:00:00", 2), ("2020-06-06 00:00:00", 3), ("2020-06-06 00:00:00", 4), ("2020-09-08 00:00:00", 4)`) + tk.MustExec(`insert into t2 values("2020-01-01 00:00:00", 1), ("2020-01-01 00:00:01", 2), ("2020-08-20 00:00:00", 4)`) + sql = "select b from t1 where t1.b >= (select max(t2.b) from t2 where t2.a > t1.a)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("4")) +} + +func (s *testSuite) TestApplyMultiColumnType(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // int & int + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 1), (1, 1), (2, 2), (2, 3), (2, 3), (1, 1), (1, 1), (2, 2), (2, 3), (2, 3)") + tk.MustExec("insert into t2 values (2, 2), (3,3), (-1, 1), (5, 4), (2, 2), (3,3), (-1, 1), (5, 4)") + sql := "select (select count(*) from t2 where t2.a > t1.a and t2.b > t1.a) from t1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("4", "4", "4", "4", "4", "4", "6", "6", "6", "6")) + + // int & char + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a int, b char(20))") + tk.MustExec("create table t2(a int, b char(20))") + tk.MustExec(`insert into t1 values (1, "a"), (2, "b"), (3, "c"), (1, "a"), (2, "b"), (3, "c")`) + tk.MustExec(`insert into t2 values (1, "a"), (2, "b"), (3, "c"), (1, "a"), (2, "b"), (3, "c")`) + sql = "select (select sum(t2.a) from t2 where t2.a > t1.a or t2.b < t1.b) from t1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("10", "10", "6", "6", "8", "8")) + + // int & bit + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a int, b bit(10), c int)") + tk.MustExec("create table t2(a int, b int, c int)") + tk.MustExec(`insert into t1 values (1, '1', 1), (2, '2', 4), (3, '3', 6), (4, '4', 8), (1, '1', 1), (2, '2', 4), (3, '3', 6), (4, '4', 8)`) + tk.MustExec(`insert into t2 values (1, 1111, 11), (2, 2222, 22), (1, 1111, 11), (2, 2222, 22)`) + sql = "select a, c from t1 where (select max(t2.c) from t2 where t2.a > t1.a and t2.b > t1.b) > 4" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 1", "1 1")) + + // char & char + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a char(20), b varchar(255))") + tk.MustExec("create table t2(a char(20), b varchar(255))") + tk.MustExec(`insert into t1 values ('7', '7'), ('8', '8'), ('9', '9'), ('7', '7'), ('8', '8'), ('9', '9')`) + tk.MustExec(`insert into t2 values ('7', '7'), ('8', '8'), ('9', '9'), ('7', '7'), ('8', '8'), ('9', '9')`) + sql = "select count(*) from t1 where (select sum(t2.a) from t2 where t2.a >= t1.a and t2.b >= t1.b) > 4" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("6")) + + // enum & char + tk.MustExec("drop table t1, t2") + tk.MustExec(`create table t1(a varchar(20), b enum("a", "b", "c", "d", "e","f"))`) + tk.MustExec("create table t2(a varchar(20), b int)") + tk.MustExec(`insert into t1 values ('1', 'a'), ('2', 'b'), ('3', 'c'), ('1', 'a'), ('2', 'b'), ('3', 'c')`) + tk.MustExec(`insert into t2 values ('1', 100), ('2', 200), ('3', 300), ('4', 400), ('1', 100), ('2', 200), ('3', 300), ('4', 400)`) + sql = "select * from t1 where (select sum(t2.b) from t2 where t2.a > t1.a and t2.b * 2 > t1.b) > 0" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 a", "1 a", "2 b", "2 b", "3 c", "3 c")) + + // char & bit + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a varchar(20), b bit(10))") + tk.MustExec("create table t2(a varchar(20), b int)") + tk.MustExec("insert into t1 values ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')") + tk.MustExec("insert into t2 values ('1', 1), ('2', 2), ('3', 3), ('4', 4), ('1', 1), ('2', 2), ('3', 3), ('4', 4)") + sql = "select a from t1 where (select sum(t2.b) from t2 where t2.a > t1.a and t2.b < t1.b) > 4" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1", "1", "2", "2", "3", "3")) + + // int & double + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1 (a int, b double)") + tk.MustExec("create table t2 (a int, b double)") + tk.MustExec("insert into t1 values (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4)") + tk.MustExec("insert into t2 values (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4)") + sql = "select * from t1 where (select min(t2.a) from t2 where t2.a < t1.a and t2.a > 1 and t2.b < t1.b) > 0" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("3 3.3", "3 3.3", "4 4.4", "4 4.4")) + + // int & datetime + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a int, b datetime)") + tk.MustExec("create table t2(a int, b datetime)") + tk.MustExec(`insert into t1 values (1, "2020-01-01"), (2, "2020-02-02"), (3, "2020-03-03"), (1, "2020-01-01"), (2, "2020-02-02"), (3, "2020-03-03")`) + tk.MustExec(`insert into t2 values (1, "2020-01-01"), (2, "2020-02-02"), (3, "2020-03-03"), (1, "2020-01-01"), (2, "2020-02-02"), (3, "2020-03-03")`) + sql = `select * from t1 where (select count(*) from t2 where t2.a >= t1.a and t2.b between t1.b and "2020-09-07 00:00:00") > 1` + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 2020-01-01 00:00:00", "1 2020-01-01 00:00:00", "2 2020-02-02 00:00:00", "2 2020-02-02 00:00:00", "3 2020-03-03 00:00:00", "3 2020-03-03 00:00:00")) + + // int & int & char + tk.MustExec("drop table t1, t2") + tk.MustExec("create table t1(a int, b int, c varchar(20))") + tk.MustExec("create table t2(a int, b int, c varchar(20))") + tk.MustExec("insert into t1 values (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (1, 1, '1'), (2, 2, '2'), (3, 3, '3')") + tk.MustExec("insert into t2 values (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (1, 1, '1'), (2, 2, '2'), (3, 3, '3')") + sql = "select (select min(t2.a) from t2 where t2.a > t1.a and t2.b > t1.b and t2.c > t1.c) from t1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("2", "2", "3", "3", "", "")) +} + +func (s *testSuite) TestSetTiDBEnableParallelApply(c *C) { + // validate the tidb_enable_parallel_apply's value + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=0") + tk.MustQuery("select @@tidb_enable_parallel_apply").Check(testkit.Rows("0")) + tk.MustExec("set tidb_enable_parallel_apply=1") + tk.MustQuery("select @@tidb_enable_parallel_apply").Check(testkit.Rows("1")) + tk.MustExec("set tidb_enable_parallel_apply=on") + tk.MustQuery("select @@tidb_enable_parallel_apply").Check(testkit.Rows("1")) + tk.MustExec("set tidb_enable_parallel_apply=off") + tk.MustQuery("select @@tidb_enable_parallel_apply").Check(testkit.Rows("0")) + c.Assert(tk.ExecToErr("set tidb_enable_parallel_apply=-1"), NotNil) + c.Assert(tk.ExecToErr("set tidb_enable_parallel_apply=2"), NotNil) + c.Assert(tk.ExecToErr("set tidb_enable_parallel_apply=1000"), NotNil) + c.Assert(tk.ExecToErr("set tidb_enable_parallel_apply='onnn'"), NotNil) +} + +func (s *testSuite) TestMultipleApply(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // compare apply with constant values + tk.MustExec("drop table if exists t1, t2") + tk.MustExec(`create table t1(a varchar(20), b enum("a", "b", "c", "d", "e","f"))`) + tk.MustExec("create table t2(a varchar(20), b int)") + tk.MustExec(`insert into t1 values ("1", "a"), ("2", "b"), ("3", "c"), ("4", "d"), ("1", "a"), ("2", "b"), ("3", "c"), ("4", "d")`) + tk.MustExec(`insert into t2 values ("1", 1), ("2", 2), ("3", 3), ("4", 4), ("1", 1), ("2", 2), ("3", 3), ("4", 4)`) + sql := "select * from t1 where (select sum(t2.b) from t2 where t2.a > t1.a) >= (select sum(t2.b) from t2 where t2.b > t1.b)" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 a", "1 a", "2 b", "2 b", "3 c", "3 c")) + + // 2 apply operators in where conditions + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b double)") + tk.MustExec("create table t2(a int, b double)") + tk.MustExec("insert into t1 values (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4)") + tk.MustExec("insert into t2 values (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4), (1, 1.1), (2, 2.2), (3, 3.3), (4, 4.4)") + sql = "select * from t1 where (select min(t2.a) from t2 where t2.a < t1.a and t2.a > 1) * (select min(t2.a) from t2 where t2.b < t1.b) > 1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("3 3.3", "3 3.3", "4 4.4", "4 4.4")) + + // 2 apply operators and compare it with constant values + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a varchar(20), b bit(10))") + tk.MustExec("create table t2(a varchar(20), b int)") + tk.MustExec("insert into t1 values ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4'), ('1', '1'), ('2', '2'), ('3', '3'), ('4', '4')") + tk.MustExec("insert into t2 values ('1', 1111), ('2', 2222), ('3', 3333), ('4', 4444), ('1', 1111), ('2', 2222), ('3', 3333), ('4', 4444)") + sql = "select a from t1 where (select sum(t2.b) from t2 where t2.a > t1.a) > 4 and (select sum(t2.b) from t2 where t2.b > t1.b) > 4" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1", "1", "2", "2", "3", "3")) + + // multiple fields and where conditions + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c varchar(20))") + tk.MustExec("create table t2(a int, b int, c varchar(20))") + tk.MustExec("insert into t1 values (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (4, 4, '4'), (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (4, 4, '4')") + tk.MustExec("insert into t2 values (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (4, 4, '4'), (1, 1, '1'), (2, 2, '2'), (3, 3, '3'), (4, 4, '4')") + sql = "select (select min(t2.a) from t2 where t2.a > t1.a and t2.b > t1.b), (select max(t2.a) from t2 where t2.a > t1.a and t2.b > t1.b) from t1 where (select count(*) from t2 where t2.c > t1.c) > 3" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("2 4", "2 4", "3 4", "3 4")) +} + +func (s *testSuite) TestApplyWithOtherOperators(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // hash join + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + sql := "select /*+ hash_join(t1) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "0", "0", "2", "2", "2", "2", "4", "4", "4", "4")) + + // merge join + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a double, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + sql = "select /*+ merge_join(t1) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "0", "0", "2", "2", "2", "2", "4", "4", "4", "4")) + + // index merge join + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int primary key, b int)") + tk.MustExec("create table t2(a int, b int, index idx(a))") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + sql = "select /*+ inl_merge_join(t1) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "2", "2", "4", "4")) + sql = "select /*+ inl_merge_join(t2) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "2", "2", "4", "4")) + + // index hash join + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, index idx(a, b))") + tk.MustExec("create table t2(a int, b int, index idx(a))") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + sql = "select /*+ inl_hash_join(t1) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "0", "0", "2", "2", "2", "2", "4", "4", "4", "4")) + sql = "select /*+ inl_hash_join(t2) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "0", "0", "0", "2", "2", "2", "2", "4", "4", "4", "4")) + + // index join + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int , b int, unique index idx(a))") + tk.MustExec("create table t2(a int, b int, unique index idx(a))") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3)") + sql = "select /*+ inl_join(t1) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "1", "2")) + sql = "select /*+ inl_join(t2) */ (select count(t2.b) from t2 where t1.a > t2.a) from t1, t2 where t1.a = t2.a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("0", "1", "2")) + + // index merge + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, index idxa(a), unique index idxb(b))") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (1, 5, 1), (2, 6, 2), (3, 7, 3), (4, 8, 4)") + sql = "select /*+ use_index_merge(t) */ * from t where (a > 0 or b < 0) and (select count(*) from t t1 where t1.c > t.a) > 0" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 1 1", "1 5 1", "2 2 2", "2 6 2", "3 3 3", "3 7 3")) + + // aggregation + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4), (1, 1), (2, 2), (3, 3), (4, 4)") + sql = "select /*+ stream_agg() */ a from t where (select count(*) from t1 where t1.b > t.a) > 1 group by a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1")) + sql = "select /*+ hash_agg() */ a from t where (select count(*) from t1 where t1.b > t.a) > 1 group by a" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("1")) +} + +func (s *testSerialSuite) TestApplyWithOtherFeatures(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // collation 1 + collate.SetNewCollationEnabledForTest(true) + tk.MustExec("drop table if exists t, t1") + tk.MustExec("create table t(a varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, b int)") + tk.MustExec("create table t1(a varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci, b int)") + tk.MustExec("insert into t values ('a', 1), ('A', 2), ('a', 3), ('A', 4)") + tk.MustExec("insert into t1 values ('a', 1), ('A', 2), ('a', 3), ('A', 4)") + sql := "select (select min(t1.b) from t1 where t1.a >= t.a), (select sum(t1.b) from t1 where t1.a >= t.a) from t" + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 10", "1 10", "1 10", "1 10")) + + // collation 2 + sql = "select (select min(t1.b) from t1 where t1.a >= t.a and t1.b >= t.b), (select sum(t1.b) from t1 where t1.a >= t.a and t1.b >= t.b) from t" + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 10", "2 9", "3 7", "4 4")) + collate.SetNewCollationEnabledForTest(false) + + // plan cache + orgEnable := core.PreparedPlanCacheEnabled() + core.SetPreparedPlanCache(true) + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 1), (1, 5), (2, 3), (2, 4), (3, 3)") + tk.MustExec("insert into t2 values (0, 1), (2, -1), (3, 2)") + tk.MustExec(`prepare stmt from "select * from t1 where t1.b >= (select sum(t2.b) from t2 where t2.a > t1.a and t2.a > ?)"`) + tk.MustExec("set @a=1") + tk.MustQuery("execute stmt using @a").Sort().Check(testkit.Rows("1 1", "1 5", "2 3", "2 4")) + tk.MustExec("set @a=2") + tk.MustQuery("execute stmt using @a").Sort().Check(testkit.Rows("1 5", "2 3", "2 4")) + tk.MustQuery(" select @@last_plan_from_cache").Check(testkit.Rows("0")) // sub-queries are not cacheable + core.SetPreparedPlanCache(orgEnable) + + // cluster index + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop table if exists t, t2") + tk.MustExec("create table t(a int, b int, c int, primary key(a, b))") + tk.MustExec("create table t2(a int, b int, c int, primary key(a, c))") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)") + tk.MustExec("insert into t2 values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)") + sql = "select * from t where (select min(t2.b) from t2 where t2.a > t.a) > 0" + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 1 1", "2 2 2", "3 3 3")) + tk.Se.GetSessionVars().EnableClusteredIndex = false + + // partitioning table + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int) partition by range(a) (partition p0 values less than(10), partition p1 values less than(20), partition p2 values less than(30), partition p3 values less than(40))") + tk.MustExec("create table t2(a int, b int) partition by hash(a) partitions 4") + tk.MustExec("insert into t1 values (5, 5), (15, 15), (25, 25), (35, 35)") + tk.MustExec("insert into t2 values (5, 5), (15, 15), (25, 25), (35, 35)") + sql = "select (select count(*) from t2 where t2.a > t1.b and t2.a=20), (select max(t2.b) from t2 where t2.a between t1.a and 20) from t1 where t1.a > 10" + tk.MustQuery(sql).Sort().Check(testkit.Rows("0 15", "0 ", "0 ")) +} + +func (s *testSuite) TestApplyInDML(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // delete + tk.MustExec("drop table if exists t, t2") + tk.MustExec("create table t(a bigint, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4), (1, 1), (2, 2), (3, 3), (4, 4)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (4, 4), (1, 1), (2, 2), (3, 3), (4, 4)") + tk.MustExec("delete from t where (select min(t2.a) * 2 from t2 where t2.a < t.a) > 1") + tk.MustQuery("select * from t").Sort().Check(testkit.Rows("1 1", "1 1")) + + // insert + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int)") + tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (1, 1, 1), (2, 2, 2), (3, 3, 3)") + tk.MustExec("insert into t (select * from t where (select count(*) from t t1 where t1.b > t.a) > 2)") + tk.MustQuery("select * from t").Sort().Check(testkit.Rows("1 1 1", "1 1 1", "1 1 1", "1 1 1", "2 2 2", "2 2 2", "3 3 3", "3 3 3")) + + // update + tk.MustExec("drop table if exists t, t2") + tk.MustExec("create table t(a smallint, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("update t set a = a + 1 where (select count(*) from t2 where t2.a <= t.a) in (1, 2)") + tk.MustQuery("select * from t").Sort().Check(testkit.Rows("2 1", "2 1", "2 2", "2 2", "3 3", "3 3")) + + // replace + tk.MustExec("drop table if exists t, t2") + tk.MustExec("create table t(a tinyint, b int, unique index idx(a))") + tk.MustExec("create table t2(a tinyint, b int)") + tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4)") + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (1, 1), (2, 2), (3, 3)") + tk.MustExec("replace into t (select pow(t2.a, 2), t2.b from t2 where (select min(t.a) from t where t.a > t2.a) between 1 and 5)") + tk.MustQuery("select * from t").Sort().Check(testkit.Rows("1 1", "2 2", "3 3", "4 2", "9 3")) + + // Transaction + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 2), (1, 3)") + tk.MustExec("begin") + tk.MustExec("insert into t1 values (1, 4), (2, 3), (2, 5)") + tk.MustExec("insert into t2 values (2, 3), (3, 4)") + sql := "select * from t1 where t1.b > any (select t2.b from t2 where t2.b < t1.b)" + tk.MustQuery(sql).Sort().Check(testkit.Rows("1 4", "2 5")) + tk.MustExec("delete from t1 where a = 1") + tk.MustQuery(sql).Sort().Check(testkit.Rows("2 5")) + tk.MustExec("commit") + tk.MustQuery(sql).Sort().Check(testkit.Rows("2 5")) +} + +func (s *testSuite) TestApplyConcurrency(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + + // tidb_executor_concurrency + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + sql := "select * from t1 where t1.b > (select sum(t2.b) from t2 where t2.a > t1.a)" + tk.MustExec("set tidb_executor_concurrency = 3") + checkApplyPlan(c, tk, sql, 3) + tk.MustExec("set tidb_executor_concurrency = 5") + checkApplyPlan(c, tk, sql, 5) + + // concurrency + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int)") + vals := "" + n := 100 + for i := 1; i <= n; i++ { + if i > 1 { + vals += "," + } + vals = vals + fmt.Sprintf("(%v)", i) + } + tk.MustExec(fmt.Sprintf("insert into t values %v", vals)) + sql = "select sum(a) from t where t.a >= (select max(a) from t t1 where t1.a <= t.a)" + for cc := 1; cc <= 10; cc += 3 { + tk.MustExec(fmt.Sprintf("set tidb_executor_concurrency = %v", cc)) + tk.MustQuery(sql).Check(testkit.Rows(fmt.Sprintf("%v", (n*(n+1))/2))) + } +} + +func (s *testSuite) TestApplyCacheRatio(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + sql := "select * from t1 where (select min(t2.b) from t2 where t2.a> t1.a) > 10" + tk.MustExec("insert into t2 values (1, 1), (2, 2), (3, 3), (4, 4), (5, 5)") + + checkRatio := func(ratio string) bool { + rows := tk.MustQuery("explain analyze " + sql).Rows() + for _, r := range rows { + line := fmt.Sprintf("%v", r) + if strings.Contains(line, "cacheHitRatio:"+ratio) { + return true + } + } + return false + } + // 10% + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (9, 9), (1, 1)") + c.Assert(checkRatio("10.000%"), IsTrue) + tk.MustExec("set tidb_mem_quota_apply_cache = 0") + c.Assert(checkRatio(""), IsFalse) + tk.MustExec("set tidb_mem_quota_apply_cache = 33554432") + + // 20% + tk.MustExec("truncate t1") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7), (8, 8), (2, 2), (1, 1)") + c.Assert(checkRatio("20.000%"), IsTrue) + tk.MustExec("set tidb_mem_quota_apply_cache = 0") + c.Assert(checkRatio(""), IsFalse) + tk.MustExec("set tidb_mem_quota_apply_cache = 33554432") + // 50% + tk.MustExec("truncate t1") + tk.MustExec("insert into t1 values (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5)") + c.Assert(checkRatio("50.000%"), IsTrue) + tk.MustExec("set tidb_mem_quota_apply_cache = 0") + c.Assert(checkRatio(""), IsFalse) +} + +func (s *testSuite) TestApplyGoroutinePanic(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_parallel_apply=true") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int)") + tk.MustExec("create table t2(a int, b int)") + tk.MustExec("insert into t1 values (1, 1), (1, 1), (2, 2), (2, 3), (2, 3), (1, 1), (1, 1), (2, 2), (2, 3), (2, 3)") + tk.MustExec("insert into t2 values (2, 2), (3,3), (-1, 1), (5, 4), (2, 2), (3,3), (-1, 1), (5, 4)") + + // no panic + sql := "select (select count(*) from t2 where t2.a > t1.a and t2.b > t1.a) from t1" + checkApplyPlan(c, tk, sql, 1) + tk.MustQuery(sql).Sort().Check(testkit.Rows("4", "4", "4", "4", "4", "4", "6", "6", "6", "6")) + + // panic in a inner worker + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/parallelApplyInnerWorkerPanic", "panic"), IsNil) + err := tk.QueryToErr(sql) + c.Assert(err, NotNil) // verify errors are not be ignored + c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/parallelApplyInnerWorkerPanic"), IsNil) + + for _, panicName := range []string{"parallelApplyInnerWorkerPanic", "parallelApplyOuterWorkerPanic", "parallelApplyGetCachePanic", "parallelApplySetCachePanic"} { + panicPath := fmt.Sprintf("github.com/pingcap/tidb/executor/%v", panicName) + c.Assert(failpoint.Enable(panicPath, "panic"), IsNil) + err := tk.QueryToErr(sql) + c.Assert(err, NotNil) // verify errors are not be ignored + c.Assert(failpoint.Disable(panicPath), IsNil) + } +} diff --git a/executor/partition_table.go b/executor/partition_table.go index 88ac2ad769b4c..806e7b116e9fe 100644 --- a/executor/partition_table.go +++ b/executor/partition_table.go @@ -41,6 +41,7 @@ type nextPartition interface { nextPartition(context.Context, table.PhysicalTable) (Executor, error) } +// nolint:structcheck type innerPartitionInfo struct { isFullPartition bool nextRange map[int64][]*ranger.Range @@ -67,7 +68,7 @@ func (n nextPartitionForTableReader) nextPartition(ctx context.Context, tbl tabl if n.innerPartitionInfo != nil && !n.isFullPartition { n.exec.kvRangeBuilder = n.rangeBuilders[tbl.GetPhysicalID()] } - if err := updateDAGRequestTableID(ctx, n.exec.dagPB, tbl.Meta().ID, tbl.GetPhysicalID()); err != nil { + if err := updateDAGRequestTableID(ctx, n.exec.dagPB, tbl.GetPhysicalID()); err != nil { return nil, err } return n.exec, nil @@ -150,14 +151,14 @@ func nextPartitionWithTrace(ctx context.Context, n nextPartition, tbl table.Phys // updateDAGRequestTableID update the table ID in the DAG request to partition ID. // TiKV only use that table ID for log, but TiFlash use it. -func updateDAGRequestTableID(ctx context.Context, dag *tipb.DAGRequest, tableID, partitionID int64) error { +func updateDAGRequestTableID(ctx context.Context, dag *tipb.DAGRequest, partitionID int64) error { // TiFlash set RootExecutor field and ignore Executors field. if dag.RootExecutor != nil { - return updateExecutorTableID(ctx, dag.RootExecutor, tableID, partitionID, true) + return updateExecutorTableID(ctx, dag.RootExecutor, partitionID, true) } for i := 0; i < len(dag.Executors); i++ { exec := dag.Executors[i] - err := updateExecutorTableID(ctx, exec, tableID, partitionID, false) + err := updateExecutorTableID(ctx, exec, partitionID, false) if err != nil { return err } @@ -165,7 +166,7 @@ func updateDAGRequestTableID(ctx context.Context, dag *tipb.DAGRequest, tableID, return nil } -func updateExecutorTableID(ctx context.Context, exec *tipb.Executor, tableID, partitionID int64, recursive bool) error { +func updateExecutorTableID(ctx context.Context, exec *tipb.Executor, partitionID int64, recursive bool) error { var child *tipb.Executor switch exec.Tp { case tipb.ExecType_TypeTableScan: @@ -185,16 +186,19 @@ func updateExecutorTableID(ctx context.Context, exec *tipb.Executor, tableID, pa child = exec.TopN.Child case tipb.ExecType_TypeLimit: child = exec.Limit.Child + case tipb.ExecType_TypeExchangeSender: + child = exec.ExchangeSender.Child + case tipb.ExecType_TypeExchangeReceiver: + child = nil case tipb.ExecType_TypeJoin: - // TiFlash currently does not support Join on partition table. - // The planner should not generate this kind of plan. - // So the code should never run here. - return errors.New("wrong plan, join on partition table is not supported on TiFlash") + child = exec.Join.Children[1-exec.Join.InnerIdx] + case tipb.ExecType_TypeProjection: + child = exec.Projection.Child default: return errors.Trace(fmt.Errorf("unknown new tipb protocol %d", exec.Tp)) } if child != nil && recursive { - return updateExecutorTableID(ctx, child, tableID, partitionID, recursive) + return updateExecutorTableID(ctx, child, partitionID, recursive) } return nil } diff --git a/executor/partition_table_test.go b/executor/partition_table_test.go index 920fa09a5acef..daa292a672c8e 100644 --- a/executor/partition_table_test.go +++ b/executor/partition_table_test.go @@ -14,8 +14,6 @@ package executor_test import ( - "context" - . "github.com/pingcap/check" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/testkit" @@ -58,19 +56,36 @@ partition p2 values less than (10))`) func (s *partitionTableSuite) TestPartitionIndexJoin(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustExec("drop table if exists p, t") - tk.MustExec(`create table p (id int, c int, key i_id(id), key i_c(c)) partition by range (c) ( -partition p0 values less than (4), -partition p1 values less than (7), -partition p2 values less than (10))`) - tk.MustExec("create table t (id int)") - tk.MustExec("insert into p values (3,3), (4,4), (6,6), (9,9)") - tk.MustExec("insert into t values (4), (9)") - - // Build indexLookUp in index join - tk.MustQuery("select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id").Sort().Check(testkit.Rows("4 4 4", "9 9 9")) - // Build index reader in index join - tk.MustQuery("select /*+ INL_JOIN(p) */ p.id from p, t where p.id = t.id").Check(testkit.Rows("4", "9")) + tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec("set @@session.tidb_enable_list_partition = 1") + for i := 0; i < 3; i++ { + tk.MustExec("drop table if exists p, t") + if i == 0 { + // Test for range partition + tk.MustExec(`create table p (id int, c int, key i_id(id), key i_c(c)) partition by range (c) ( + partition p0 values less than (4), + partition p1 values less than (7), + partition p2 values less than (10))`) + } else if i == 1 { + // Test for list partition + tk.MustExec(`create table p (id int, c int, key i_id(id), key i_c(c)) partition by list (c) ( + partition p0 values in (1,2,3,4), + partition p1 values in (5,6,7), + partition p2 values in (8, 9,10))`) + } else { + // Test for hash partition + tk.MustExec(`create table p (id int, c int, key i_id(id), key i_c(c)) partition by hash(c) partitions 5;`) + } + + tk.MustExec("create table t (id int)") + tk.MustExec("insert into p values (3,3), (4,4), (6,6), (9,9)") + tk.MustExec("insert into t values (4), (9)") + + // Build indexLookUp in index join + tk.MustQuery("select /*+ INL_JOIN(p) */ * from p, t where p.id = t.id").Sort().Check(testkit.Rows("4 4 4", "9 9 9")) + // Build index reader in index join + tk.MustQuery("select /*+ INL_JOIN(p) */ p.id from p, t where p.id = t.id").Check(testkit.Rows("4", "9")) + } } func (s *partitionTableSuite) TestPartitionUnionScanIndexJoin(c *C) { @@ -88,22 +103,6 @@ func (s *partitionTableSuite) TestPartitionUnionScanIndexJoin(c *C) { tk.MustExec("commit") } -func (s *partitionTableSuite) TestDAGTableID(c *C) { - // This test checks the table ID in the DAG is changed to partition ID in the nextPartition function. - tk := testkit.NewTestKitWithInit(c, s.store) - tk.MustExec("use test") - tk.MustExec("create table employees (id int,store_id int not null)partition by hash(store_id) partitions 4;") - sql := "select * from test.employees" - rs, err := tk.Exec(sql) - c.Assert(err, IsNil) - - m := make(map[int64]struct{}) - ctx := context.WithValue(context.Background(), "nextPartitionUpdateDAGReq", m) - tk.ResultSetToResultWithCtx(ctx, rs, Commentf("sql:%s, args:%v", sql)) - // Check table ID is changed to partition ID for each partition. - c.Assert(m, HasLen, 4) -} - func (s *partitionTableSuite) TestPartitionReaderUnderApply(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("use test") @@ -152,7 +151,7 @@ func (s *partitionTableSuite) TestPartitionReaderUnderApply(c *C) { "5 naughty swartz 9.524000")) // For issue 19450 release-4.0 - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) tk.MustQuery("select * from t1 where c_decimal in (select c_decimal from t2 where t1.c_int = t2.c_int or t1.c_int = t2.c_int and t1.c_str > t2.c_str)").Check(testkit.Rows( "1 romantic robinson 4.436000", "2 stoic chaplygin 9.826000", @@ -172,7 +171,7 @@ PRIMARY KEY (pk1,pk2)) partition by hash(pk2) partitions 4;`) tk.MustExec("create table coverage_dt (pk1 varchar(35), pk2 int)") tk.MustExec("insert into coverage_rr values ('ios', 3, 2),('android', 4, 7),('linux',5,1)") tk.MustExec("insert into coverage_dt values ('apple',3),('ios',3),('linux',5)") - tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic-only'") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") tk.MustQuery("select /*+ INL_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);").Sort().Check(testkit.Rows("ios 3 ios 3 2", "linux 5 linux 5 1")) tk.MustQuery("select /*+ INL_MERGE_JOIN(dt, rr) */ * from coverage_dt dt join coverage_rr rr on (dt.pk1 = rr.pk1 and dt.pk2 = rr.pk2);").Sort().Check(testkit.Rows("ios 3 ios 3 2", "linux 5 linux 5 1")) } @@ -200,3 +199,9 @@ partition p2 values less than (10))`) tk.MustExec("insert into p values (1,3), (3,4), (5,6), (7,9)") tk.MustQuery("select * from p use index (idx)").Check(testkit.Rows("1 3", "3 4", "5 6", "7 9")) } + +func (s *globalIndexSuite) TestIssue21731(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists p") + tk.MustExec("create table t (a int, b int, unique index idx(a)) partition by list columns(b) (partition p0 values in (1), partition p1 values in (2));") +} diff --git a/executor/point_get.go b/executor/point_get.go index ab0f13c9be6ee..6f2449fcfecfa 100644 --- a/executor/point_get.go +++ b/executor/point_get.go @@ -15,16 +15,23 @@ package executor import ( "context" + "fmt" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/ddl/placement" + "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/tablecodec" @@ -36,12 +43,6 @@ import ( ) func (b *executorBuilder) buildPointGet(p *plannercore.PointGetPlan) Executor { - if b.ctx.GetSessionVars().IsPessimisticReadConsistency() { - if err := b.refreshForUpdateTSForRC(); err != nil { - b.err = err - return nil - } - } startTS, err := b.getSnapshotTS() if err != nil { b.err = err @@ -132,10 +133,10 @@ func (e *PointGetExecutor) Open(context.Context) error { if e.txn.Valid() && txnCtx.StartTS == txnCtx.GetForUpdateTS() { e.snapshot = e.txn.GetSnapshot() } else { - e.snapshot, err = e.ctx.GetStore().GetSnapshot(kv.Version{Ver: snapshotTS}) - if err != nil { - return err - } + e.snapshot = e.ctx.GetStore().GetSnapshot(kv.Version{Ver: snapshotTS}) + } + if err := e.verifyTxnScope(); err != nil { + return err } if e.runtimeStats != nil { snapshotStats := &tikv.SnapshotRuntimeStats{} @@ -149,6 +150,16 @@ func (e *PointGetExecutor) Open(context.Context) error { e.snapshot.SetOption(kv.ReplicaRead, kv.ReplicaReadFollower) } e.snapshot.SetOption(kv.TaskID, e.ctx.GetSessionVars().StmtCtx.TaskID) + isStaleness := e.ctx.GetSessionVars().TxnCtx.IsStaleness + e.snapshot.SetOption(kv.IsStalenessReadOnly, isStaleness) + if isStaleness && e.ctx.GetSessionVars().TxnCtx.TxnScope != oracle.GlobalTxnScope { + e.snapshot.SetOption(kv.MatchStoreLabels, []*metapb.StoreLabel{ + { + Key: placement.DCLabelKey, + Value: e.ctx.GetSessionVars().TxnCtx.TxnScope, + }, + }) + } return nil } @@ -157,6 +168,13 @@ func (e *PointGetExecutor) Close() error { if e.runtimeStats != nil && e.snapshot != nil { e.snapshot.DelOption(kv.CollectRuntimeStats) } + if e.idxInfo != nil && e.tblInfo != nil { + actRows := int64(0) + if e.runtimeStats != nil { + actRows = e.runtimeStats.GetActRows() + } + e.ctx.StoreIndexUsage(e.tblInfo.ID, e.idxInfo.ID, actRows) + } e.done = false return nil } @@ -176,6 +194,9 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { } else { tblID = e.tblInfo.ID } + if e.lock { + e.updateDeltaForTableID(tblID) + } if e.idxInfo != nil { if isCommonHandleRead(e.tblInfo, e.idxInfo) { handleBytes, err := EncodeUniqueIndexValuesForKey(e.ctx, e.tblInfo, e.idxInfo, e.idxVals) @@ -198,13 +219,19 @@ func (e *PointGetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { return err } } - if len(e.handleVal) == 0 { - // handle is not found, try lock the index key if isolation level is not read consistency - if e.ctx.GetSessionVars().IsPessimisticReadConsistency() { - return nil + + // try lock the index key if isolation level is not read consistency + // also lock key if read consistency read a value + if !e.ctx.GetSessionVars().IsPessimisticReadConsistency() || len(e.handleVal) > 0 { + err = e.lockKeyIfNeeded(ctx, e.idxKey) + if err != nil { + return err } - return e.lockKeyIfNeeded(ctx, e.idxKey) } + if len(e.handleVal) == 0 { + return nil + } + var iv kv.Handle iv, err = tablecodec.DecodeHandleInUniqueIndexValue(e.handleVal, e.tblInfo.IsCommonHandle) if err != nil { @@ -285,6 +312,9 @@ func (e *PointGetExecutor) getAndLock(ctx context.Context, key kv.Key) (val []by } func (e *PointGetExecutor) lockKeyIfNeeded(ctx context.Context, key []byte) error { + if len(key) == 0 { + return nil + } if e.lock { seVars := e.ctx.GetSessionVars() lockCtx := newLockCtx(seVars, e.lockWaitTime) @@ -314,10 +344,16 @@ func (e *PointGetExecutor) get(ctx context.Context, key kv.Key) ([]byte, error) if len(key) == 0 { return nil, kv.ErrNotExist } + + var ( + val []byte + err error + ) + if e.txn.Valid() && !e.txn.IsReadOnly() { // We cannot use txn.Get directly here because the snapshot in txn and the snapshot of e.snapshot may be // different for pessimistic transaction. - val, err := e.txn.GetMemBuffer().Get(ctx, key) + val, err = e.txn.GetMemBuffer().Get(ctx, key) if err == nil { return val, err } @@ -325,16 +361,62 @@ func (e *PointGetExecutor) get(ctx context.Context, key kv.Key) ([]byte, error) return nil, err } // key does not exist in mem buffer, check the lock cache - var ok bool - val, ok = e.ctx.GetSessionVars().TxnCtx.GetKeyInPessimisticLockCache(key) - if ok { - return val, nil + if e.lock { + var ok bool + val, ok = e.ctx.GetSessionVars().TxnCtx.GetKeyInPessimisticLockCache(key) + if ok { + return val, nil + } } // fallthrough to snapshot get. } + + lock := e.tblInfo.Lock + if lock != nil && (lock.Tp == model.TableLockRead || lock.Tp == model.TableLockReadOnly) { + if e.ctx.GetSessionVars().EnablePointGetCache { + cacheDB := e.ctx.GetStore().GetMemCache() + val, err = cacheDB.UnionGet(ctx, e.tblInfo.ID, e.snapshot, key) + if err != nil { + return nil, err + } + return val, nil + } + } + // if not read lock or table was unlock then snapshot get return e.snapshot.Get(ctx, key) } +func (e *PointGetExecutor) verifyTxnScope() error { + txnScope := e.txn.GetUnionStore().GetOption(kv.TxnScope).(string) + if txnScope == "" || txnScope == oracle.GlobalTxnScope { + return nil + } + var tblID int64 + var tblName string + var partName string + is := infoschema.GetInfoSchema(e.ctx) + if e.partInfo != nil { + tblID = e.partInfo.ID + tblInfo, _, partInfo := is.FindTableByPartitionID(tblID) + tblName = tblInfo.Meta().Name.String() + partName = partInfo.Name.String() + } else { + tblID = e.tblInfo.ID + tblInfo, _ := is.TableByID(tblID) + tblName = tblInfo.Meta().Name.String() + } + valid := distsql.VerifyTxnScope(txnScope, tblID, is) + if valid { + return nil + } + if len(partName) > 0 { + return ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs( + fmt.Sprintf("table %v's partition %v can not be read by %v txn_scope", tblName, partName, txnScope)) + } + return ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs( + fmt.Sprintf("table %v can not be read by %v txn_scope", tblName, txnScope)) +} + // EncodeUniqueIndexKey encodes a unique index key. func EncodeUniqueIndexKey(ctx sessionctx.Context, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, idxVals []types.Datum, tID int64) (_ []byte, err error) { encodedIdxVals, err := EncodeUniqueIndexValuesForKey(ctx, tblInfo, idxInfo, idxVals) @@ -357,8 +439,11 @@ func EncodeUniqueIndexValuesForKey(ctx sessionctx.Context, tblInfo *model.TableI str, err = idxVals[i].ToString() idxVals[i].SetString(str, colInfo.FieldType.Collate) } else { + // If a truncated error or an overflow error is thrown when converting the type of `idxVal[i]` to + // the type of `colInfo`, the `idxVal` does not exist in the `idxInfo` for sure. idxVals[i], err = table.CastValue(ctx, idxVals[i], colInfo, true, false) - if types.ErrOverflow.Equal(err) { + if types.ErrOverflow.Equal(err) || types.ErrDataTooLong.Equal(err) || + types.ErrTruncated.Equal(err) || types.ErrTruncatedWrongVal.Equal(err) { return nil, kv.ErrNotExist } } @@ -431,20 +516,20 @@ func decodeOldRowValToChunk(sctx sessionctx.Context, schema *expression.Schema, return nil } -func tryDecodeFromHandle(tblInfo *model.TableInfo, i int, col *expression.Column, handle kv.Handle, chk *chunk.Chunk, decoder *codec.Decoder, pkCols []int64) (bool, error) { +func tryDecodeFromHandle(tblInfo *model.TableInfo, schemaColIdx int, col *expression.Column, handle kv.Handle, chk *chunk.Chunk, decoder *codec.Decoder, pkCols []int64) (bool, error) { if tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.RetType.Flag) { - chk.AppendInt64(i, handle.IntValue()) + chk.AppendInt64(schemaColIdx, handle.IntValue()) return true, nil } if col.ID == model.ExtraHandleID { - chk.AppendInt64(i, handle.IntValue()) + chk.AppendInt64(schemaColIdx, handle.IntValue()) return true, nil } // Try to decode common handle. if mysql.HasPriKeyFlag(col.RetType.Flag) { for i, hid := range pkCols { if col.ID == hid { - _, err := decoder.DecodeOne(handle.EncodedCol(i), i, col.RetType) + _, err := decoder.DecodeOne(handle.EncodedCol(i), schemaColIdx, col.RetType) if err != nil { return false, errors.Trace(err) } diff --git a/executor/point_get_test.go b/executor/point_get_test.go index d514455fad8e4..485f15d9f33ca 100644 --- a/executor/point_get_test.go +++ b/executor/point_get_test.go @@ -16,10 +16,13 @@ package executor_test import ( "context" "fmt" + "strings" + "sync" "time" . "github.com/pingcap/check" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" @@ -88,7 +91,7 @@ func (s *testPointGetSuite) TestPointGet(c *C) { c.Assert(err, IsNil) fields := result.Fields() c.Assert(fields[0].ColumnAsName.O, Equals, "ident") - result.Close() + c.Assert(result.Close(), IsNil) tk.MustExec("CREATE TABLE tab3(pk INTEGER PRIMARY KEY, col0 INTEGER, col1 FLOAT, col2 TEXT, col3 INTEGER, col4 FLOAT, col5 TEXT);") tk.MustExec("CREATE UNIQUE INDEX idx_tab3_0 ON tab3 (col4);") @@ -130,6 +133,25 @@ func (s *testPointGetSuite) TestPointGetOverflow(c *C) { tk.MustQuery("SELECT t0.c1 FROM t0 WHERE t0.c1=127").Check(testkit.Rows("127")) } +// Close issue #22839 +func (s *testPointGetSuite) TestPointGetDataTooLong(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists PK_1389;") + tk.MustExec("CREATE TABLE `PK_1389` ( " + + " `COL1` bit(1) NOT NULL," + + " `COL2` varchar(20) DEFAULT NULL," + + " `COL3` datetime DEFAULT NULL," + + " `COL4` bigint(20) DEFAULT NULL," + + " `COL5` float DEFAULT NULL," + + " PRIMARY KEY (`COL1`)" + + ");") + tk.MustExec("insert into PK_1389 values(0, \"皟钹糁泅埞礰喾皑杏灚暋蛨歜檈瓗跾咸滐梀揉\", \"7701-12-27 23:58:43\", 4806951672419474695, -1.55652e38);") + tk.MustQuery("select count(1) from PK_1389 where col1 = 0x30;").Check(testkit.Rows("0")) + tk.MustQuery("select count(1) from PK_1389 where col1 in ( 0x30);").Check(testkit.Rows("0")) + tk.MustExec("drop table if exists PK_1389;") +} + func (s *testPointGetSuite) TestPointGetCharPK(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec(`use test;`) @@ -461,7 +483,8 @@ func (s *testPointGetSuite) TestIssue10677(c *C) { func (s *testPointGetSuite) TestForUpdateRetry(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) - tk.Exec("drop table if exists t") + _, err := tk.Exec("drop table if exists t") + c.Assert(err, IsNil) tk.MustExec("create table t(pk int primary key, c int)") tk.MustExec("insert into t values (1, 1), (2, 2)") tk.MustExec("set @@tidb_disable_txn_auto_retry = 0") @@ -470,7 +493,7 @@ func (s *testPointGetSuite) TestForUpdateRetry(c *C) { tk2 := testkit.NewTestKitWithInit(c, s.store) tk2.MustExec("update t set c = c + 1 where pk = 1") tk.MustExec("update t set c = c + 1 where pk = 2") - _, err := tk.Exec("commit") + _, err = tk.Exec("commit") c.Assert(session.ErrForUpdateCantRetry.Equal(err), IsTrue) } @@ -480,8 +503,8 @@ func (s *testPointGetSuite) TestPointGetByRowID(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (a varchar(20), b int)") tk.MustExec("insert into t values(\"aaa\", 12)") - tk.MustQuery("explain select * from t where t._tidb_rowid = 1").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t handle:1")) + tk.MustQuery("explain format = 'brief' select * from t where t._tidb_rowid = 1").Check(testkit.Rows( + "Point_Get 1.00 root table:t handle:1")) tk.MustQuery("select * from t where t._tidb_rowid = 1").Check(testkit.Rows("aaa 12")) } @@ -521,7 +544,7 @@ func (s *testPointGetSuite) TestReturnValues(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t (a varchar(64) primary key, b int)") tk.MustExec("insert t values ('a', 1), ('b', 2), ('c', 3)") tk.MustExec("begin pessimistic") @@ -543,8 +566,8 @@ func (s *testPointGetSuite) TestReturnValues(c *C) { func (s *testPointGetSuite) TestClusterIndexPointGet(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists pgt") tk.MustExec("create table pgt (a varchar(64), b varchar(64), uk int, v int, primary key(a, b), unique key uuk(uk))") tk.MustExec("insert pgt values ('a', 'a1', 1, 11), ('b', 'b1', 2, 22), ('c', 'c1', 3, 33)") @@ -557,17 +580,17 @@ func (s *testPointGetSuite) TestClusterIndexPointGet(c *C) { tk.MustExec(`drop table if exists snp`) tk.MustExec(`create table snp(id1 int, id2 int, v int, primary key(id1, id2))`) tk.MustExec(`insert snp values (1, 1, 1), (2, 2, 2), (2, 3, 3)`) - tk.MustQuery(`explain select * from snp where id1 = 1`).Check(testkit.Rows("TableReader_6 10.00 root data:TableRangeScan_5", - "└─TableRangeScan_5 10.00 cop[tikv] table:snp range:[1,1], keep order:false, stats:pseudo")) - tk.MustQuery(`explain select * from snp where id1 in (1, 100)`).Check(testkit.Rows("TableReader_6 20.00 root data:TableRangeScan_5", - "└─TableRangeScan_5 20.00 cop[tikv] table:snp range:[1,1], [100,100], keep order:false, stats:pseudo")) + tk.MustQuery(`explain format = 'brief' select * from snp where id1 = 1`).Check(testkit.Rows("TableReader 10.00 root data:TableRangeScan", + "└─TableRangeScan 10.00 cop[tikv] table:snp range:[1,1], keep order:false, stats:pseudo")) + tk.MustQuery(`explain format = 'brief' select * from snp where id1 in (1, 100)`).Check(testkit.Rows("TableReader 20.00 root data:TableRangeScan", + "└─TableRangeScan 20.00 cop[tikv] table:snp range:[1,1], [100,100], keep order:false, stats:pseudo")) tk.MustQuery("select * from snp where id1 = 2").Check(testkit.Rows("2 2 2", "2 3 3")) } func (s *testPointGetSuite) TestClusterIndexCBOPointGet(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t1, t2") tk.MustExec(`create table t1 (a int, b decimal(10,0), c int, primary key(a,b))`) tk.MustExec(`create table t2 (a varchar(20), b int, primary key(a), unique key(b))`) @@ -583,7 +606,7 @@ func (s *testPointGetSuite) TestClusterIndexCBOPointGet(c *C) { } s.testData.GetTestCases(c, &input, &output) for i, tt := range input { - plan := tk.MustQuery("explain " + tt) + plan := tk.MustQuery("explain format = 'brief' " + tt) res := tk.MustQuery(tt).Sort() s.testData.OnRecord(func() { output[i].SQL = tt @@ -594,3 +617,323 @@ func (s *testPointGetSuite) TestClusterIndexCBOPointGet(c *C) { res.Check(testkit.Rows(output[i].Res...)) } } + +func (s *testSerialSuite) mustExecDDL(tk *testkit.TestKit, c *C, sql string) { + tk.MustExec(sql) + c.Assert(s.domain.Reload(), IsNil) +} + +func (s *testSerialSuite) TestMemCacheReadLock(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.Se.GetSessionVars().EnablePointGetCache = true + defer func() { + tk.Se.GetSessionVars().EnablePointGetCache = false + tk.MustExec("drop table if exists point") + }() + + tk.MustExec("drop table if exists point") + tk.MustExec("create table point (id int primary key, c int, d varchar(10), unique c_d (c, d))") + tk.MustExec("insert point values (1, 1, 'a')") + tk.MustExec("insert point values (2, 2, 'b')") + + // Simply check the cached results. + s.mustExecDDL(tk, c, "lock tables point read") + tk.MustQuery("select id from point where id = 1").Check(testkit.Rows("1")) + tk.MustQuery("select id from point where id = 1").Check(testkit.Rows("1")) + s.mustExecDDL(tk, c, "unlock tables") + + cases := []struct { + sql string + r1 bool + r2 bool + }{ + {"explain analyze select * from point where id = 1", false, false}, + {"explain analyze select * from point where id in (1, 2)", false, false}, + + // Cases for not exist keys. + {"explain analyze select * from point where id = 3", true, true}, + {"explain analyze select * from point where id in (1, 3)", true, true}, + {"explain analyze select * from point where id in (3, 4)", true, true}, + } + + for _, ca := range cases { + s.mustExecDDL(tk, c, "lock tables point read") + + rows := tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1, Commentf("%v", ca.sql)) + explain := fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + + rows = tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + ok := strings.Contains(explain, "num_rpc") + c.Assert(ok, Equals, ca.r1, Commentf("%v", ca.sql)) + s.mustExecDDL(tk, c, "unlock tables") + + rows = tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + + // Test cache release after unlocking tables. + s.mustExecDDL(tk, c, "lock tables point read") + rows = tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + + rows = tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + ok = strings.Contains(explain, "num_rpc") + c.Assert(ok, Equals, ca.r2, Commentf("%v", ca.sql)) + + s.mustExecDDL(tk, c, "unlock tables") + s.mustExecDDL(tk, c, "lock tables point read") + + rows = tk.MustQuery(ca.sql).Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + + s.mustExecDDL(tk, c, "unlock tables") + } +} + +func (s *testSerialSuite) TestPartitionMemCacheReadLock(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.Se.GetSessionVars().EnablePointGetCache = true + defer func() { + tk.Se.GetSessionVars().EnablePointGetCache = false + tk.MustExec("drop table if exists point") + }() + + tk.MustExec("drop table if exists point") + tk.MustExec("create table point (id int unique key, c int, d varchar(10)) partition by hash (id) partitions 4") + tk.MustExec("insert point values (1, 1, 'a')") + tk.MustExec("insert point values (2, 2, 'b')") + + // Confirm _tidb_rowid will not be duplicated. + tk.MustQuery("select distinct(_tidb_rowid) from point order by _tidb_rowid").Check(testkit.Rows("1", "2")) + + s.mustExecDDL(tk, c, "lock tables point read") + + tk.MustQuery("select _tidb_rowid from point where id = 1").Check(testkit.Rows("1")) + s.mustExecDDL(tk, c, "unlock tables") + + tk.MustQuery("select _tidb_rowid from point where id = 1").Check(testkit.Rows("1")) + tk.MustExec("update point set id = -id") + + // Test cache release after unlocking tables. + s.mustExecDDL(tk, c, "lock tables point read") + tk.MustQuery("select _tidb_rowid from point where id = 1").Check(testkit.Rows()) + + tk.MustQuery("select _tidb_rowid from point where id = -1").Check(testkit.Rows("1")) + tk.MustQuery("select _tidb_rowid from point where id = -1").Check(testkit.Rows("1")) + tk.MustQuery("select _tidb_rowid from point where id = -2").Check(testkit.Rows("2")) + + s.mustExecDDL(tk, c, "unlock tables") +} + +func (s *testPointGetSuite) TestPointGetWriteLock(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table point (id int primary key, c int, d varchar(10), unique c_d (c, d))") + tk.MustExec("insert point values (1, 1, 'a')") + tk.MustExec("insert point values (2, 2, 'b')") + tk.MustExec("lock tables point write") + tk.MustQuery(`select * from point where id = 1;`).Check(testkit.Rows( + `1 1 a`, + )) + rows := tk.MustQuery("explain analyze select * from point where id = 1").Rows() + c.Assert(len(rows), Equals, 1) + explain := fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + tk.MustExec("unlock tables") + + tk.MustExec("update point set c = 3 where id = 1") + tk.MustExec("lock tables point write") + tk.MustQuery(`select * from point where id = 1;`).Check(testkit.Rows( + `1 3 a`, + )) + rows = tk.MustQuery("explain analyze select * from point where id = 1").Rows() + c.Assert(len(rows), Equals, 1) + explain = fmt.Sprintf("%v", rows[0]) + c.Assert(explain, Matches, ".*num_rpc.*") + tk.MustExec("unlock tables") +} + +func (s *testPointGetSuite) TestPointGetLockExistKey(c *C) { + var wg sync.WaitGroup + errCh := make(chan error) + + testLock := func(rc bool, key string, tableName string) { + doneCh := make(chan struct{}, 1) + tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + + errCh <- tk1.ExecToErr("use test") + errCh <- tk2.ExecToErr("use test") + tk1.Se.GetSessionVars().EnableClusteredIndex = false + + errCh <- tk1.ExecToErr(fmt.Sprintf("drop table if exists %s", tableName)) + errCh <- tk1.ExecToErr(fmt.Sprintf("create table %s(id int, v int, k int, %s key0(id, v))", tableName, key)) + errCh <- tk1.ExecToErr(fmt.Sprintf("insert into %s values(1, 1, 1)", tableName)) + + if rc { + errCh <- tk1.ExecToErr("set tx_isolation = 'READ-COMMITTED'") + errCh <- tk2.ExecToErr("set tx_isolation = 'READ-COMMITTED'") + } + + // select for update + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + // lock exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("select * from %s where id = 1 and v = 1 for update", tableName)) + // read committed will not lock non-exist key + if rc { + errCh <- tk1.ExecToErr(fmt.Sprintf("select * from %s where id = 2 and v = 2 for update", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(2, 2, 2)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(1, 1, 10)", tableName)) + // tk2.MustExec(fmt.Sprintf("insert into %s values(1, 1, 10)", tableName)) + doneCh <- struct{}{} + }() + time.Sleep(150 * time.Millisecond) + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v = 2 where id = 1 and v = 1", tableName)) + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 2 2", + "1 1 10", + )) + + // update + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + // lock exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v = 3 where id = 2 and v = 2", tableName)) + // read committed will not lock non-exist key + if rc { + errCh <- tk1.ExecToErr(fmt.Sprintf("update %s set v =4 where id = 3 and v = 3", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(3, 3, 3)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(2, 2, 20)", tableName)) + doneCh <- struct{}{} + }() + time.Sleep(150 * time.Millisecond) + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 3 2", + "1 1 10", + "3 3 3", + "2 2 20", + )) + + // delete + errCh <- tk1.ExecToErr("begin pessimistic") + errCh <- tk2.ExecToErr("begin pessimistic") + // lock exist key + errCh <- tk1.ExecToErr(fmt.Sprintf("delete from %s where id = 3 and v = 3", tableName)) + // read committed will not lock non-exist key + if rc { + errCh <- tk1.ExecToErr(fmt.Sprintf("delete from %s where id = 4 and v = 4", tableName)) + } + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(4, 4, 4)", tableName)) + go func() { + errCh <- tk2.ExecToErr(fmt.Sprintf("insert into %s values(3, 3, 30)", tableName)) + doneCh <- struct{}{} + }() + time.Sleep(50 * time.Millisecond) + errCh <- tk1.ExecToErr("commit") + <-doneCh + errCh <- tk2.ExecToErr("commit") + tk1.MustQuery(fmt.Sprintf("select * from %s", tableName)).Check(testkit.Rows( + "1 2 1", + "2 3 2", + "1 1 10", + "2 2 20", + "4 4 4", + "3 3 30", + )) + wg.Done() + } + + for i, one := range []struct { + rc bool + key string + }{ + {rc: false, key: "primary key"}, + {rc: false, key: "unique key"}, + {rc: true, key: "primary key"}, + {rc: true, key: "unique key"}, + } { + wg.Add(1) + tableName := fmt.Sprintf("t_%d", i) + go testLock(one.rc, one.key, tableName) + } + + go func() { + wg.Wait() + close(errCh) + }() + for err := range errCh { + c.Assert(err, IsNil) + } +} + +func (s *testPointGetSuite) TestWithTiDBSnapshot(c *C) { + // Fix issue https://github.com/pingcap/tidb/issues/22436 + // Point get should not use math.MaxUint64 when variable @@tidb_snapshot is set. + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists xx") + tk.MustExec(`create table xx (id int key)`) + tk.MustExec(`insert into xx values (1), (7)`) + + // Unrelated code, to make this test pass in the unit test. + // The `tikv_gc_safe_point` global variable must be there, otherwise the 'set @@tidb_snapshot' operation fails. + timeSafe := time.Now().Add(-48 * 60 * 60 * time.Second).Format("20060102-15:04:05 -0700 MST") + safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', '') + ON DUPLICATE KEY + UPDATE variable_value = '%[1]s'` + tk.MustExec(fmt.Sprintf(safePointSQL, timeSafe)) + + // Record the current tso. + tk.MustExec("begin") + tso := tk.Se.GetSessionVars().TxnCtx.StartTS + tk.MustExec("rollback") + c.Assert(tso > 0, IsTrue) + + // Insert data. + tk.MustExec("insert into xx values (8)") + + // Change the snapshot before the tso, the inserted data should not be seen. + tk.MustExec(fmt.Sprintf("set @@tidb_snapshot = '%d'", tso)) + tk.MustQuery("select * from xx where id = 8").Check(testkit.Rows()) + + tk.MustQuery("select * from xx").Check(testkit.Rows("1", "7")) +} diff --git a/executor/prepared.go b/executor/prepared.go index 278fd84d4dad0..cef541a757c91 100644 --- a/executor/prepared.go +++ b/executor/prepared.go @@ -116,10 +116,11 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { err error ) if sqlParser, ok := e.ctx.(sqlexec.SQLParser); ok { + // FIXME: ok... yet another parse API, may need some api interface clean. stmts, err = sqlParser.ParseSQL(e.sqlText, charset, collation) } else { p := parser.New() - p.EnableWindowFunc(vars.EnableWindowFunction) + p.SetParserConfig(vars.BuildParserConfig()) var warns []error stmts, warns, err = p.Parse(e.sqlText, charset, collation) for _, warn := range warns { @@ -147,6 +148,11 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { return ErrPrepareDDL } + switch stmt.(type) { + case *ast.LoadDataStmt, *ast.PrepareStmt, *ast.ExecuteStmt, *ast.DeallocateStmt: + return ErrUnsupportedPs + } + // Prepare parameters should NOT over 2 bytes(MaxUint16) // https://dev.mysql.com/doc/internals/en/com-stmt-prepare-response.html#packet-COM_STMT_PREPARE_OK. if len(extractor.markers) > math.MaxUint16 { @@ -193,7 +199,7 @@ func (e *PrepareExec) Next(ctx context.Context, req *chunk.Chunk) error { var p plannercore.Plan e.ctx.GetSessionVars().PlanID = 0 e.ctx.GetSessionVars().PlanColumnID = 0 - destBuilder := plannercore.NewPlanBuilder(e.ctx, e.is, &hint.BlockHintProcessor{}) + destBuilder, _ := plannercore.NewPlanBuilder(e.ctx, e.is, &hint.BlockHintProcessor{}) p, err = destBuilder.Build(ctx, stmt) if err != nil { return err @@ -243,15 +249,21 @@ func (e *ExecuteExec) Next(ctx context.Context, req *chunk.Chunk) error { // Build builds a prepared statement into an executor. // After Build, e.StmtExec will be used to do the real execution. func (e *ExecuteExec) Build(b *executorBuilder) error { - ok, err := plannercore.IsPointGetWithPKOrUniqueKeyByAutoCommit(e.ctx, e.plan) - if err != nil { - return err - } - if ok { - err = e.ctx.InitTxnWithStartTS(math.MaxUint64) - } - if err != nil { - return err + if snapshotTS := e.ctx.GetSessionVars().SnapshotTS; snapshotTS != 0 { + if err := e.ctx.InitTxnWithStartTS(snapshotTS); err != nil { + return err + } + } else { + ok, err := plannercore.IsPointGetWithPKOrUniqueKeyByAutoCommit(e.ctx, e.plan) + if err != nil { + return err + } + if ok { + err = e.ctx.InitTxnWithStartTS(math.MaxUint64) + if err != nil { + return err + } + } } stmtExec := b.build(e.plan) if b.err != nil { diff --git a/executor/prepared_test.go b/executor/prepared_test.go index 8b8c7e7cba60c..52e6157835424 100644 --- a/executor/prepared_test.go +++ b/executor/prepared_test.go @@ -22,6 +22,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" @@ -50,6 +51,16 @@ func (s *testSuite1) TestPreparedDDL(c *C) { tk.MustExec("prepare stmt from 'create table t (id int, KEY id (id))'") } +// TestUnsupportedStmtForPrepare is related to https://github.com/pingcap/tidb/issues/17412 +func (s *testSuite1) TestUnsupportedStmtForPrepare(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`prepare stmt0 from "create table t0(a int primary key)"`) + tk.MustGetErrCode(`prepare stmt1 from "execute stmt0"`, mysql.ErrUnsupportedPs) + tk.MustGetErrCode(`prepare stmt2 from "deallocate prepare stmt0"`, mysql.ErrUnsupportedPs) + tk.MustGetErrCode(`prepare stmt4 from "prepare stmt3 from 'create table t1(a int, b int)'"`, mysql.ErrUnsupportedPs) +} + func (s *testSuite1) TestIgnorePlanCache(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -69,6 +80,12 @@ func (s *testSerialSuite) TestPrepareStmtAfterIsolationReadChange(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.Se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost", CurrentUser: true, AuthUsername: "root", AuthHostname: "%"}, nil, []byte("012345678901234567890")) + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(false) // requires plan cache disabled + tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int)") // create virtual tiflash replica. @@ -104,7 +121,7 @@ func (s *testSerialSuite) TestPrepareStmtAfterIsolationReadChange(c *C) { c.Assert(rows[len(rows)-1][2], Equals, "cop[tiflash]") c.Assert(len(tk.Se.GetSessionVars().PreparedStmts), Equals, 1) - c.Assert(tk.Se.GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedSQL, Equals, "select * from t") + c.Assert(tk.Se.GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedSQL, Equals, "select * from `t`") c.Assert(tk.Se.GetSessionVars().PreparedStmts[1].(*plannercore.CachedPrepareStmt).NormalizedPlan, Equals, "") } @@ -132,7 +149,11 @@ func (sm *mockSessionManager2) Kill(connectionID uint64, query bool) { sm.killed = true atomic.StoreUint32(&sm.se.GetSessionVars().Killed, 1) } +func (sm *mockSessionManager2) KillAllConnections() {} func (sm *mockSessionManager2) UpdateTLSConfig(cfg *tls.Config) {} +func (sm *mockSessionManager2) ServerID() uint64 { + return 1 +} var _ = SerialSuites(&testSuite12{&baseTestSuite{}}) @@ -179,23 +200,23 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { plannercore.SetPreparedPlanCache(true) tk.MustExec("use test") tk.MustExec("drop table if exists t1") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("set @@tidb_enable_collect_execution_info=0;") tk.MustExec("create table t1(a varchar(20), b varchar(20), c varchar(20), primary key(a, b))") tk.MustExec("insert into t1 values('1','1','111'),('2','2','222'),('3','3','333')") // For table scan tk.MustExec(`prepare stmt1 from "select * from t1 where t1.a = ? and t1.b > ?"`) - tk.MustExec("set @v1 = 1") - tk.MustExec("set @v2 = 0") + tk.MustExec("set @v1 = '1'") + tk.MustExec("set @v2 = '0'") tk.MustQuery("execute stmt1 using @v1,@v2").Check(testkit.Rows("1 1 111")) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustExec("set @v1 = 2") - tk.MustExec("set @v2 = 1") + tk.MustExec("set @v1 = '2'") + tk.MustExec("set @v2 = '1'") tk.MustQuery("execute stmt1 using @v1,@v2").Check(testkit.Rows("2 2 222")) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) - tk.MustExec("set @v1 = 3") - tk.MustExec("set @v2 = 2") + tk.MustExec("set @v1 = '3'") + tk.MustExec("set @v2 = '2'") tk.MustQuery("execute stmt1 using @v1,@v2").Check(testkit.Rows("3 3 333")) tkProcess := tk.Se.ShowProcess() ps := []*util.ProcessInfo{tkProcess} @@ -205,16 +226,16 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { // For point get tk.MustExec(`prepare stmt2 from "select * from t1 where t1.a = ? and t1.b = ?"`) - tk.MustExec("set @v1 = 1") - tk.MustExec("set @v2 = 1") + tk.MustExec("set @v1 = '1'") + tk.MustExec("set @v2 = '1'") tk.MustQuery("execute stmt2 using @v1,@v2").Check(testkit.Rows("1 1 111")) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustExec("set @v1 = 2") - tk.MustExec("set @v2 = 2") + tk.MustExec("set @v1 = '2'") + tk.MustExec("set @v2 = '2'") tk.MustQuery("execute stmt2 using @v1,@v2").Check(testkit.Rows("2 2 222")) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) - tk.MustExec("set @v1 = 3") - tk.MustExec("set @v2 = 3") + tk.MustExec("set @v1 = '3'") + tk.MustExec("set @v2 = '3'") tk.MustQuery("execute stmt2 using @v1,@v2").Check(testkit.Rows("3 3 333")) tkProcess = tk.Se.ShowProcess() ps = []*util.ProcessInfo{tkProcess} @@ -268,7 +289,7 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustQuery(`execute stmt2 using @v2, @v2, @v3, @v3`).Check(testkit.Rows("b b 2 2 2", "c c 3 3 3")) // For issue 19002 - tk.MustExec(`set @@tidb_enable_clustered_index = 1`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists t1`) tk.MustExec(`create table t1(a int, b int, c int, primary key(a, b))`) tk.MustExec(`insert into t1 values(1,1,111),(2,2,222),(3,3,333)`) @@ -287,3 +308,91 @@ func (s *testSerialSuite) TestPlanCacheClusterIndex(c *C) { tk.MustQuery(`execute stmt2 using @v1,@v2,@v3,@v4`).Check(testkit.Rows("2 2 222", "3 3 333")) tk.MustQuery(`select @@last_plan_from_cache`).Check(testkit.Rows("1")) } + +func (s *testPrepareSuite) TestPlanCacheWithDifferentVariableTypes(c *C) { + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("set @@tidb_enable_collect_execution_info=0;") + tk.MustExec("create table t1(a varchar(20), b int, c float, key(b, a))") + tk.MustExec("insert into t1 values('1',1,1.1),('2',2,222),('3',3,333)") + tk.MustExec("create table t2(a varchar(20), b int, c float, key(b, a))") + tk.MustExec("insert into t2 values('3',3,3.3),('2',2,222),('3',3,333)") + + var input []struct { + PrepareStmt string + Executes []struct { + Vars []struct { + Name string + Value string + } + ExecuteSQL string + } + } + var output []struct { + PrepareStmt string + Executes []struct { + SQL string + Vars []struct { + Name string + Value string + } + Plan []string + LastPlanUseCache string + Result []string + } + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + tk.MustExec(tt.PrepareStmt) + s.testData.OnRecord(func() { + output[i].PrepareStmt = tt.PrepareStmt + output[i].Executes = make([]struct { + SQL string + Vars []struct { + Name string + Value string + } + Plan []string + LastPlanUseCache string + Result []string + }, len(tt.Executes)) + }) + c.Assert(output[i].PrepareStmt, Equals, tt.PrepareStmt) + for j, exec := range tt.Executes { + for _, v := range exec.Vars { + tk.MustExec(fmt.Sprintf(`set @%s = %s`, v.Name, v.Value)) + } + res := tk.MustQuery(exec.ExecuteSQL) + lastPlanUseCache := tk.MustQuery("select @@last_plan_from_cache").Rows()[0][0] + tk.MustQuery(exec.ExecuteSQL) + tkProcess := tk.Se.ShowProcess() + ps := []*util.ProcessInfo{tkProcess} + tk.Se.SetSessionManager(&mockSessionManager1{PS: ps}) + plan := tk.MustQuery(fmt.Sprintf("explain for connection %d", tkProcess.ID)) + s.testData.OnRecord(func() { + output[i].Executes[j].SQL = exec.ExecuteSQL + output[i].Executes[j].Plan = s.testData.ConvertRowsToStrings(plan.Rows()) + output[i].Executes[j].Vars = exec.Vars + output[i].Executes[j].LastPlanUseCache = lastPlanUseCache.(string) + output[i].Executes[j].Result = s.testData.ConvertRowsToStrings(res.Rows()) + }) + c.Assert(output[i].Executes[j].SQL, Equals, exec.ExecuteSQL) + plan.Check(testkit.Rows(output[i].Executes[j].Plan...)) + c.Assert(output[i].Executes[j].Vars, DeepEquals, exec.Vars) + c.Assert(output[i].Executes[j].LastPlanUseCache, Equals, lastPlanUseCache.(string)) + res.Check(testkit.Rows(output[i].Executes[j].Result...)) + } + } +} diff --git a/executor/reload_expr_pushdown_blacklist.go b/executor/reload_expr_pushdown_blacklist.go index 32a2b3ed96c92..384c522f8c4a2 100644 --- a/executor/reload_expr_pushdown_blacklist.go +++ b/executor/reload_expr_pushdown_blacklist.go @@ -37,8 +37,12 @@ func (e *ReloadExprPushdownBlacklistExec) Next(ctx context.Context, _ *chunk.Chu // LoadExprPushdownBlacklist loads the latest data from table mysql.expr_pushdown_blacklist. func LoadExprPushdownBlacklist(ctx sessionctx.Context) (err error) { - sql := "select HIGH_PRIORITY name, store_type from mysql.expr_pushdown_blacklist" - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), "select HIGH_PRIORITY name, store_type from mysql.expr_pushdown_blacklist") + if err != nil { + return err + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return err } diff --git a/executor/replace.go b/executor/replace.go index a3f54733c4885..8f35be4d05dbd 100644 --- a/executor/replace.go +++ b/executor/replace.go @@ -20,8 +20,10 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -72,7 +74,7 @@ func (e *ReplaceExec) removeRow(ctx context.Context, txn kv.Transaction, handle return false, err } - rowUnchanged, err := types.EqualDatums(e.ctx.GetSessionVars().StmtCtx, oldRow, newRow) + rowUnchanged, err := e.EqualDatumsAsBinary(e.ctx.GetSessionVars().StmtCtx, oldRow, newRow) if err != nil { return false, err } @@ -89,6 +91,27 @@ func (e *ReplaceExec) removeRow(ctx context.Context, txn kv.Transaction, handle return false, nil } +// EqualDatumsAsBinary compare if a and b contains the same datum values in binary collation. +func (e *ReplaceExec) EqualDatumsAsBinary(sc *stmtctx.StatementContext, a []types.Datum, b []types.Datum) (bool, error) { + if len(a) != len(b) { + return false, nil + } + for i, ai := range a { + collation := ai.Collation() + // We should use binary collation to compare datum, otherwise the result will be incorrect + ai.SetCollation(charset.CollationBin) + v, err := ai.CompareDatum(sc, &b[i]) + ai.SetCollation(collation) + if err != nil { + return false, errors.Trace(err) + } + if v != 0 { + return false, nil + } + } + return true, nil +} + // replaceRow removes all duplicate rows for one row, then inserts it. func (e *ReplaceExec) replaceRow(ctx context.Context, r toBeCheckedRow) error { txn, err := e.ctx.Txn(true) @@ -237,7 +260,7 @@ func (e *ReplaceExec) setMessage() { if e.SelectExec != nil || numRecords > 1 { numWarnings := stmtCtx.WarningCount() numDuplicates := stmtCtx.AffectedRows() - numRecords - msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInsertInfo], numRecords, numDuplicates, numWarnings) + msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrInsertInfo].Raw, numRecords, numDuplicates, numWarnings) stmtCtx.SetMessage(msg) } } diff --git a/executor/revoke.go b/executor/revoke.go index 7e51aa8ac82a4..bce0299bc56f5 100644 --- a/executor/revoke.go +++ b/executor/revoke.go @@ -15,7 +15,7 @@ package executor import ( "context" - "fmt" + "strings" "github.com/pingcap/errors" "github.com/pingcap/parser/ast" @@ -63,7 +63,7 @@ func (e *RevokeExec) Next(ctx context.Context, req *chunk.Chunk) error { if err := e.ctx.NewTxn(ctx); err != nil { return err } - defer func() { e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, false) }() + defer func() { e.ctx.GetSessionVars().SetInTxn(false) }() // Create internal session to start internal transaction. isCommit := false @@ -73,7 +73,7 @@ func (e *RevokeExec) Next(ctx context.Context, req *chunk.Chunk) error { } defer func() { if !isCommit { - _, err := internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "rollback") + _, err := internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "rollback") if err != nil { logutil.BgLogger().Error("rollback error occur at grant privilege", zap.Error(err)) } @@ -81,7 +81,7 @@ func (e *RevokeExec) Next(ctx context.Context, req *chunk.Chunk) error { e.releaseSysSession(internalSession) }() - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "begin") + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "begin") if err != nil { return err } @@ -103,7 +103,7 @@ func (e *RevokeExec) Next(ctx context.Context, req *chunk.Chunk) error { } } - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), "commit") + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), "commit") if err != nil { return err } @@ -166,12 +166,15 @@ func (e *RevokeExec) revokePriv(internalSession sessionctx.Context, priv *ast.Pr } func (e *RevokeExec) revokeGlobalPriv(internalSession sessionctx.Context, priv *ast.PrivElem, user, host string) error { - asgns, err := composeGlobalPrivUpdate(priv.Priv, "N") + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.UserTable) + err := composeGlobalPrivUpdate(sql, priv.Priv, "N") if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s'`, mysql.SystemDB, mysql.UserTable, asgns, user, host) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%?", user, host) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } @@ -180,12 +183,16 @@ func (e *RevokeExec) revokeDBPriv(internalSession sessionctx.Context, priv *ast. if len(dbName) == 0 { dbName = e.ctx.GetSessionVars().CurrentDB } - asgns, err := composeDBPrivUpdate(priv.Priv, "N") + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.DBTable) + err := composeDBPrivUpdate(sql, priv.Priv, "N") if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s';`, mysql.SystemDB, mysql.DBTable, asgns, userName, host, dbName) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%?", userName, host, dbName) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } @@ -194,12 +201,16 @@ func (e *RevokeExec) revokeTablePriv(internalSession sessionctx.Context, priv *a if err != nil { return err } - asgns, err := composeTablePrivUpdateForRevoke(internalSession, priv.Priv, user, host, dbName, tbl.Meta().Name.O) + + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.TablePrivTable) + err = composeTablePrivUpdateForRevoke(internalSession, sql, priv.Priv, user, host, dbName, tbl.Meta().Name.O) if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s';`, mysql.SystemDB, mysql.TablePrivTable, asgns, user, host, dbName, tbl.Meta().Name.O) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%?", user, host, dbName, tbl.Meta().Name.O) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) return err } @@ -208,20 +219,80 @@ func (e *RevokeExec) revokeColumnPriv(internalSession sessionctx.Context, priv * if err != nil { return err } + sql := new(strings.Builder) for _, c := range priv.Cols { col := table.FindCol(tbl.Cols(), c.Name.L) if col == nil { return errors.Errorf("Unknown column: %s", c) } - asgns, err := composeColumnPrivUpdateForRevoke(internalSession, priv.Priv, user, host, dbName, tbl.Meta().Name.O, col.Name.O) + + sql.Reset() + sqlexec.MustFormatSQL(sql, "UPDATE %n.%n SET ", mysql.SystemDB, mysql.ColumnPrivTable) + err = composeColumnPrivUpdateForRevoke(internalSession, sql, priv.Priv, user, host, dbName, tbl.Meta().Name.O, col.Name.O) + if err != nil { + return err + } + sqlexec.MustFormatSQL(sql, " WHERE User=%? AND Host=%? AND DB=%? AND Table_name=%? AND Column_name=%?", user, host, dbName, tbl.Meta().Name.O, col.Name.O) + + _, err = internalSession.(sqlexec.SQLExecutor).ExecuteInternal(context.Background(), sql.String()) + if err != nil { + return err + } + } + return nil +} + +func privUpdateForRevoke(cur []string, priv mysql.PrivilegeType) ([]string, error) { + p, ok := mysql.Priv2SetStr[priv] + if !ok { + return nil, errors.Errorf("Unknown priv: %v", priv) + } + cur = deleteFromSet(cur, p) + return cur, nil +} + +func composeTablePrivUpdateForRevoke(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string) error { + var newTablePriv, newColumnPriv []string + + if priv != mysql.AllPriv { + currTablePriv, currColumnPriv, err := getTablePriv(ctx, name, host, db, tbl) + if err != nil { + return err + } + + newTablePriv = setFromString(currTablePriv) + newTablePriv, err = privUpdateForRevoke(newTablePriv, priv) + if err != nil { + return err + } + + newColumnPriv = setFromString(currColumnPriv) + newColumnPriv, err = privUpdateForRevoke(newColumnPriv, priv) + if err != nil { + return err + } + } + + sqlexec.MustFormatSQL(sql, `Table_priv=%?, Column_priv=%?, Grantor=%?`, strings.Join(newTablePriv, ","), strings.Join(newColumnPriv, ","), ctx.GetSessionVars().User.String()) + return nil +} + +func composeColumnPrivUpdateForRevoke(ctx sessionctx.Context, sql *strings.Builder, priv mysql.PrivilegeType, name string, host string, db string, tbl string, col string) error { + var newColumnPriv []string + + if priv != mysql.AllPriv { + currColumnPriv, err := getColumnPriv(ctx, name, host, db, tbl, col) if err != nil { return err } - sql := fmt.Sprintf(`UPDATE %s.%s SET %s WHERE User='%s' AND Host='%s' AND DB='%s' AND Table_name='%s' AND Column_name='%s';`, mysql.SystemDB, mysql.ColumnPrivTable, asgns, user, host, dbName, tbl.Meta().Name.O, col.Name.O) - _, err = internalSession.(sqlexec.SQLExecutor).Execute(context.Background(), sql) + + newColumnPriv = setFromString(currColumnPriv) + newColumnPriv, err = privUpdateForRevoke(newColumnPriv, priv) if err != nil { return err } } + + sqlexec.MustFormatSQL(sql, `Column_priv=%?`, strings.Join(newColumnPriv, ",")) return nil } diff --git a/executor/rowid_test.go b/executor/rowid_test.go index 00b5bed0c3441..4873c637b9cb7 100644 --- a/executor/rowid_test.go +++ b/executor/rowid_test.go @@ -64,7 +64,7 @@ func (s *testSuite1) TestExportRowID(c *C) { func (s *testSuite1) TestNotAllowWriteRowID(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table tt(id binary(10), c int, primary key(id));") tk.MustExec("insert tt values (1, 10);") // select statement @@ -87,3 +87,52 @@ func (s *testSuite1) TestNotAllowWriteRowID(c *C) { // tk.MustExec("insert into tt (id, c, _tidb_rowid) values(30000,10,1);") // tk.MustExec("admin check table tt;") } + +// Test for https://github.com/pingcap/tidb/issues/22029. +func (s *testSuite3) TestExplicitInsertRowID(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists test_explicit_insert_rowid;") + tk.MustExec("create database test_explicit_insert_rowid;") + tk.MustExec("use test_explicit_insert_rowid;") + tk.MustExec("create table t (a int);") + tk.MustExec("set @@tidb_opt_write_row_id = true;") + + // Check that _tidb_rowid insertion success. + tk.MustExec("insert into t (_tidb_rowid, a) values (1, 1), (2, 2);") + tk.MustQuery("select *, _tidb_rowid from t;").Check(testkit.Rows("1 1", "2 2")) + // Test that explicitly insert _tidb_rowid will trigger rebase. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(id varchar(10), c int);") + tk.MustExec("insert t values('one', 101), ('two', 102);") + tk.MustQuery("select *, _tidb_rowid from t;"). + Check(testkit.Rows("one 101 1", "two 102 2")) + // check that _tidb_rowid takes the values from the insert statement + tk.MustExec("insert t (id, c, _tidb_rowid) values ('three', 103, 9), ('four', 104, 16), ('five', 105, 5);") + tk.MustQuery("select *, _tidb_rowid from t where c > 102;"). + Check(testkit.Rows("five 105 5", "three 103 9", "four 104 16")) + // check that the new _tidb_rowid is rebased + tk.MustExec("insert t values ('six', 106), ('seven', 107);") + tk.MustQuery("select *, _tidb_rowid from t where c > 105;"). + Check(testkit.Rows("six 106 17", "seven 107 18")) + + // Check that shard_row_id_bits are ignored during rebase. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int) shard_row_id_bits = 5;") + tk.MustExec("insert into t values (1);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("1 1")) + tk.MustExec("insert into t (a, _tidb_rowid) values (2, (1<<62)+5);") + tk.MustExec("insert into t values (3);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("1 1", "2 5", "3 6")) + tk.MustExec("insert into t (a, _tidb_rowid) values (4, null);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("1 1", "2 5", "3 6", "4 7")) + + tk.MustExec("delete from t;") + tk.MustExec("SET sql_mode=(SELECT CONCAT(@@sql_mode,',NO_AUTO_VALUE_ON_ZERO'));") + tk.MustExec("insert into t (a, _tidb_rowid) values (5, 0);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("5 0")) + tk.MustExec("SET sql_mode=(SELECT REPLACE(@@sql_mode,'NO_AUTO_VALUE_ON_ZERO',''));") + tk.MustExec("insert into t (a, _tidb_rowid) values (6, 0);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("5 0", "6 8")) + tk.MustExec("insert into t (_tidb_rowid, a) values (0, 7);") + tk.MustQuery("select *, ((1 << (64-5-1)) - 1) & _tidb_rowid from t order by a;").Check(testkit.Rows("5 0", "6 8", "7 9")) +} diff --git a/executor/sample.go b/executor/sample.go new file mode 100644 index 0000000000000..2edd189c02cc9 --- /dev/null +++ b/executor/sample.go @@ -0,0 +1,405 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import ( + "context" + "sort" + "time" + + "github.com/opentracing/opentracing-go" + "github.com/pingcap/errors" + "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" + plannercore "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + decoder "github.com/pingcap/tidb/util/rowDecoder" +) + +var _ Executor = &TableSampleExecutor{} + +const sampleMethodRegionConcurrency = 5 + +// TableSampleExecutor fetches a few rows through kv.Scan +// according to the specific sample method. +type TableSampleExecutor struct { + baseExecutor + + table table.Table + startTS uint64 + tablePlan plannercore.PhysicalPlan + + sampler rowSampler +} + +// Open initializes necessary variables for using this executor. +func (e *TableSampleExecutor) Open(ctx context.Context) error { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("TableSampleExecutor.Open", opentracing.ChildOf(span.Context())) + defer span1.Finish() + } + return nil +} + +// Next fills data into the chunk passed by its caller. +// The task was actually done by sampler. +func (e *TableSampleExecutor) Next(ctx context.Context, req *chunk.Chunk) error { + req.Reset() + if e.sampler.finished() { + return nil + } + // TODO(tangenta): add runtime stat & memory tracing + return e.sampler.writeChunk(req) +} + +// Close implements the Executor Close interface. +func (e *TableSampleExecutor) Close() error { + return nil +} + +type rowSampler interface { + writeChunk(req *chunk.Chunk) error + finished() bool +} + +type tableRegionSampler struct { + ctx sessionctx.Context + table table.Table + startTS uint64 + partTables []table.PartitionedTable + schema *expression.Schema + fullSchema *expression.Schema + isDesc bool + retTypes []*types.FieldType + + rowMap map[int64]types.Datum + restKVRanges []kv.KeyRange + isFinished bool +} + +func newTableRegionSampler(ctx sessionctx.Context, t table.Table, startTs uint64, partTables []table.PartitionedTable, + schema *expression.Schema, fullSchema *expression.Schema, retTypes []*types.FieldType, desc bool) *tableRegionSampler { + return &tableRegionSampler{ + ctx: ctx, + table: t, + startTS: startTs, + partTables: partTables, + schema: schema, + fullSchema: fullSchema, + isDesc: desc, + retTypes: retTypes, + rowMap: make(map[int64]types.Datum), + } +} + +func (s *tableRegionSampler) writeChunk(req *chunk.Chunk) error { + err := s.initRanges() + if err != nil { + return err + } + expectedRowCount := req.RequiredRows() + for expectedRowCount > 0 && len(s.restKVRanges) > 0 { + ranges, err := s.pickRanges(expectedRowCount) + if err != nil { + return err + } + err = s.writeChunkFromRanges(ranges, req) + if err != nil { + return err + } + expectedRowCount = req.RequiredRows() - req.NumRows() + } + if len(s.restKVRanges) == 0 { + s.isFinished = true + } + return nil +} + +func (s *tableRegionSampler) initRanges() error { + if s.restKVRanges == nil { + var err error + s.restKVRanges, err = s.splitTableRanges() + if err != nil { + return err + } + sortRanges(s.restKVRanges, s.isDesc) + } + return nil +} + +func (s *tableRegionSampler) pickRanges(count int) ([]kv.KeyRange, error) { + var regionKeyRanges []kv.KeyRange + cutPoint := count + if len(s.restKVRanges) < cutPoint { + cutPoint = len(s.restKVRanges) + } + regionKeyRanges, s.restKVRanges = s.restKVRanges[:cutPoint], s.restKVRanges[cutPoint:] + return regionKeyRanges, nil +} + +func (s *tableRegionSampler) writeChunkFromRanges(ranges []kv.KeyRange, req *chunk.Chunk) error { + decLoc, sysLoc := s.ctx.GetSessionVars().TimeZone, time.UTC + cols, decColMap, err := s.buildSampleColAndDecodeColMap() + if err != nil { + return err + } + rowDecoder := decoder.NewRowDecoder(s.table, cols, decColMap) + err = s.scanFirstKVForEachRange(ranges, func(handle kv.Handle, value []byte) error { + _, err := rowDecoder.DecodeAndEvalRowWithMap(s.ctx, handle, value, decLoc, sysLoc, s.rowMap) + if err != nil { + return err + } + currentRow := rowDecoder.CurrentRowWithDefaultVal() + mutRow := chunk.MutRowFromTypes(s.retTypes) + for i, col := range s.schema.Columns { + offset := decColMap[col.ID].Col.Offset + target := currentRow.GetDatum(offset, s.retTypes[i]) + mutRow.SetDatum(i, target) + } + req.AppendRow(mutRow.ToRow()) + s.resetRowMap() + return nil + }) + return err +} + +func (s *tableRegionSampler) splitTableRanges() ([]kv.KeyRange, error) { + if len(s.partTables) != 0 { + var ranges []kv.KeyRange + for _, t := range s.partTables { + for _, pid := range t.GetAllPartitionIDs() { + start := tablecodec.GenTableRecordPrefix(pid) + end := start.PrefixNext() + rs, err := splitIntoMultiRanges(s.ctx.GetStore(), start, end) + if err != nil { + return nil, err + } + ranges = append(ranges, rs...) + } + } + return ranges, nil + } + startKey, endKey := s.table.RecordPrefix(), s.table.RecordPrefix().PrefixNext() + return splitIntoMultiRanges(s.ctx.GetStore(), startKey, endKey) +} + +func splitIntoMultiRanges(store kv.Storage, startKey, endKey kv.Key) ([]kv.KeyRange, error) { + kvRange := kv.KeyRange{StartKey: startKey, EndKey: endKey} + + s, ok := store.(tikv.Storage) + if !ok { + return []kv.KeyRange{kvRange}, nil + } + + maxSleep := 10000 // ms + bo := tikv.NewBackofferWithVars(context.Background(), maxSleep, nil) + var ranges []kv.KeyRange + regions, err := s.GetRegionCache().LoadRegionsInKeyRange(bo, startKey, endKey) + if err != nil { + return nil, errors.Trace(err) + } + for _, r := range regions { + start, end := r.StartKey(), r.EndKey() + if kv.Key(start).Cmp(startKey) < 0 { + start = startKey + } + if kv.Key(end).Cmp(endKey) > 0 { + end = endKey + } + ranges = append(ranges, kv.KeyRange{StartKey: start, EndKey: end}) + } + if len(ranges) == 0 { + return nil, errors.Trace(errors.Errorf("no regions found")) + } + return ranges, nil +} + +func sortRanges(ranges []kv.KeyRange, isDesc bool) { + sort.Slice(ranges, func(i, j int) bool { + ir, jr := ranges[i].StartKey, ranges[j].StartKey + if !isDesc { + return ir.Cmp(jr) < 0 + } + return ir.Cmp(jr) > 0 + }) +} + +func (s *tableRegionSampler) buildSampleColAndDecodeColMap() ([]*table.Column, map[int64]decoder.Column, error) { + schemaCols := s.schema.Columns + cols := make([]*table.Column, 0, len(schemaCols)) + colMap := make(map[int64]decoder.Column, len(schemaCols)) + tableCols := s.table.Cols() + + for _, schemaCol := range schemaCols { + for _, tableCol := range tableCols { + if tableCol.ID != schemaCol.ID { + continue + } + // The `MutRow` produced by `DecodeAndEvalRowWithMap` used `ColumnInfo.Offset` as indices. + // To evaluate the columns in virtual generated expression properly, + // indices of column(Column.Index) needs to be resolved against full column's schema. + if schemaCol.VirtualExpr != nil { + var err error + schemaCol.VirtualExpr, err = schemaCol.VirtualExpr.ResolveIndices(s.fullSchema) + if err != nil { + return nil, nil, err + } + } + colMap[tableCol.ID] = decoder.Column{ + Col: tableCol, + GenExpr: schemaCol.VirtualExpr, + } + cols = append(cols, tableCol) + } + } + // Schema columns contain _tidb_rowid, append extra handle column info. + if len(cols) < len(schemaCols) && schemaCols[len(schemaCols)-1].ID == model.ExtraHandleID { + extraHandle := model.NewExtraHandleColInfo() + extraHandle.Offset = len(cols) + tableCol := &table.Column{ColumnInfo: extraHandle} + colMap[model.ExtraHandleID] = decoder.Column{ + Col: tableCol, + } + cols = append(cols, tableCol) + } + return cols, colMap, nil +} + +func (s *tableRegionSampler) scanFirstKVForEachRange(ranges []kv.KeyRange, + fn func(handle kv.Handle, value []byte) error) error { + ver := kv.Version{Ver: s.startTS} + snap := s.ctx.GetStore().GetSnapshot(ver) + concurrency := sampleMethodRegionConcurrency + if len(ranges) < concurrency { + concurrency = len(ranges) + } + + fetchers := make([]*sampleFetcher, concurrency) + for i := 0; i < concurrency; i++ { + fetchers[i] = &sampleFetcher{ + workerID: i, + concurrency: concurrency, + kvChan: make(chan *sampleKV), + snapshot: snap, + ranges: ranges, + } + go fetchers[i].run() + } + syncer := sampleSyncer{ + fetchers: fetchers, + totalCount: len(ranges), + consumeFn: fn, + } + return syncer.sync() +} + +func (s *tableRegionSampler) resetRowMap() { + if s.rowMap == nil { + colLen := len(s.schema.Columns) + s.rowMap = make(map[int64]types.Datum, colLen) + return + } + for id := range s.rowMap { + delete(s.rowMap, id) + } +} + +func (s *tableRegionSampler) finished() bool { + return s.isFinished +} + +type sampleKV struct { + handle kv.Handle + value []byte +} + +type sampleFetcher struct { + workerID int + concurrency int + kvChan chan *sampleKV + err error + snapshot kv.Snapshot + ranges []kv.KeyRange +} + +func (s *sampleFetcher) run() { + defer close(s.kvChan) + for i, r := range s.ranges { + if i%s.concurrency != s.workerID { + continue + } + it, err := s.snapshot.Iter(r.StartKey, r.EndKey) + if err != nil { + s.err = err + return + } + hasValue := false + for it.Valid() { + if !tablecodec.IsRecordKey(it.Key()) { + if err = it.Next(); err != nil { + s.err = err + return + } + continue + } + handle, err := tablecodec.DecodeRowKey(it.Key()) + if err != nil { + s.err = err + return + } + hasValue = true + s.kvChan <- &sampleKV{handle: handle, value: it.Value()} + break + } + if !hasValue { + s.kvChan <- nil + } + } +} + +type sampleSyncer struct { + fetchers []*sampleFetcher + totalCount int + consumeFn func(handle kv.Handle, value []byte) error +} + +func (s *sampleSyncer) sync() error { + defer func() { + for _, f := range s.fetchers { + // Cleanup channels to terminate fetcher goroutines. + for _, ok := <-f.kvChan; ok; { + } + } + }() + for i := 0; i < s.totalCount; i++ { + f := s.fetchers[i%len(s.fetchers)] + v, ok := <-f.kvChan + if f.err != nil { + return f.err + } + if ok && v != nil { + err := s.consumeFn(v.handle, v.value) + if err != nil { + return err + } + } + } + return nil +} diff --git a/executor/sample_test.go b/executor/sample_test.go new file mode 100644 index 0000000000000..262df100077bc --- /dev/null +++ b/executor/sample_test.go @@ -0,0 +1,261 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor_test + +import ( + "flag" + "sync/atomic" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/util/testkit" +) + +var _ = SerialSuites(&testTableSampleSuite{}) + +type testTableSampleSuite struct { + cluster cluster.Cluster + store kv.Storage + domain *domain.Domain +} + +func (s *testTableSampleSuite) SetUpSuite(c *C) { + flag.Lookup("mockTikv") + useMockTikv := *mockTikv + if useMockTikv { + store, err := mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c cluster.Cluster) { + mockstore.BootstrapWithSingleStore(c) + s.cluster = c + }), + ) + c.Assert(err, IsNil) + s.store = store + session.SetSchemaLease(0) + session.DisableStats4Test() + } + d, err := session.BootstrapSession(s.store) + c.Assert(err, IsNil) + d.SetStatsUpdating(true) + s.domain = d +} + +func (s *testTableSampleSuite) initSampleTest(c *C) *testkit.TestKit { + atomic.StoreUint32(&ddl.EnableSplitTableRegion, 1) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists test_table_sample;") + tk.MustExec("create database test_table_sample;") + tk.MustExec("use test_table_sample;") + tk.MustExec("set @@global.tidb_scatter_region=1;") + return tk +} + +func (s *testTableSampleSuite) TestTableSampleBasic(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int);") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows()) + + tk.MustExec("insert into t values (0), (1000), (2000);") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("0")) + tk.MustExec("alter table t add column b varchar(255) not null default 'abc';") + tk.MustQuery("select b from t tablesample regions();").Check(testkit.Rows("abc")) + tk.MustExec("alter table t add column c int as (a + 1);") + tk.MustQuery("select c from t tablesample regions();").Check(testkit.Rows("1")) + tk.MustQuery("select c, _tidb_rowid from t tablesample regions();").Check(testkit.Rows("1 1")) + c.Assert(tk.HasPlan("select * from t tablesample regions();", "TableSample"), IsTrue) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a BIGINT PRIMARY KEY AUTO_RANDOM(3), b int auto_increment, key(b)) pre_split_regions=8;") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows()) + for i := 0; i < 1000; i++ { + tk.MustExec("insert into t values();") + } + tk.MustQuery("select count(*) from t tablesample regions();").Check(testkit.Rows("8")) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a varchar(30) collate utf8mb4_general_ci primary key);") + tk.MustQuery("split table t between ('a') and ('z') regions 100;").Check(testkit.Rows("99 1")) + tk.MustExec("insert into t values ('a'), ('b'), ('c'), ('d'), ('e');") + tk.MustQuery("select a from t tablesample regions() limit 2;").Check(testkit.Rows("a", "b")) +} + +func (s *testTableSampleSuite) TestTableSampleMultiRegions(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int) shard_row_id_bits = 2 pre_split_regions = 2;") + for i := 0; i < 100; i++ { + tk.MustExec("insert into t values (?);", i) + } + rows := tk.MustQuery("select * from t tablesample regions();").Rows() + c.Assert(len(rows), Equals, 4) + tk.MustQuery("select a from t tablesample regions() order by a limit 1;").Check(testkit.Rows("0")) + tk.MustQuery("select a from t tablesample regions() where a = 0;").Check(testkit.Rows("0")) + + tk.MustExec("create table t2 (a int) shard_row_id_bits = 2 pre_split_regions = 2;") + for i := 0; i < 100; i++ { + tk.MustExec("insert into t2 values (?);", i) + } + rows = tk.MustQuery("select * from t tablesample regions(), t2 tablesample regions();").Rows() + c.Assert(len(rows), Equals, 16) + tk.MustQuery("select count(*) from t tablesample regions();").Check(testkit.Rows("4")) + tk.MustExec("drop table t2;") +} + +func (s *testTableSampleSuite) TestTableSampleSchema(c *C) { + tk := s.initSampleTest(c) + tk.Se.GetSessionVars().EnableClusteredIndex = true + // Clustered index + tk.MustExec("create table t (a varchar(255) primary key, b bigint);") + tk.MustExec("insert into t values ('b', 100), ('y', 100);") + tk.MustQuery("split table t between ('a') and ('z') regions 2;").Check(testkit.Rows("1 1")) + tk.MustQuery("select a from t tablesample regions();").Check(testkit.Rows("b", "y")) + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a varchar(255), b int, c decimal, primary key (a, b, c));") + tk.MustQuery("split table t between ('a', 0, 0) and ('z', 100, 100) regions 2;").Check(testkit.Rows("1 1")) + tk.MustExec("insert into t values ('b', 10, 100), ('y', 100, 10);") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("b 10 100", "y 100 10")) + + // PKIsHandle + tk.MustExec("drop table t;") + tk.MustExec("create table t (a bigint primary key, b int default 10);") + tk.MustQuery("split table t between (1) and (100000) regions 4;").Check(testkit.Rows("3 1")) + tk.MustExec("insert into t(a) values (200), (25600), (50300), (99900), (99901)") + tk.MustQuery("select a from t tablesample regions();").Check(testkit.Rows("200", "25600", "50300", "99900")) + + // _tidb_rowid + tk.MustExec("drop table t;") + tk.MustExec("create table t (a bigint, b int default 10);") + tk.MustQuery("split table t between (0) and (100000) regions 4;").Check(testkit.Rows("3 1")) + tk.MustExec("insert into t(a) values (1), (2), (3);") + tk.MustQuery("select a from t tablesample regions();").Check(testkit.Rows("1")) +} + +func (s *testTableSampleSuite) TestTableSampleInvalid(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int, b varchar(255));") + tk.MustExec("insert into t values (1, 'abc');") + tk.MustExec("create view v as select * from t;") + tk.MustGetErrCode("select * from v tablesample regions();", errno.ErrInvalidTableSample) + tk.MustGetErrCode("select * from information_schema.tables tablesample regions();", errno.ErrInvalidTableSample) + + tk.MustGetErrCode("select a from t tablesample system();", errno.ErrInvalidTableSample) + tk.MustGetErrCode("select a from t tablesample bernoulli(10 percent);", errno.ErrInvalidTableSample) + tk.MustGetErrCode("select a from t as t1 tablesample regions(), t as t2 tablesample system();", errno.ErrInvalidTableSample) + tk.MustGetErrCode("select a from t tablesample ();", errno.ErrInvalidTableSample) +} + +func (s *testTableSampleSuite) TestTableSampleWithTiDBRowID(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int, b varchar(255));") + tk.MustExec("insert into t values (1, 'abc');") + tk.MustQuery("select _tidb_rowid from t tablesample regions();").Check(testkit.Rows("1")) + tk.MustQuery("select a, _tidb_rowid from t tablesample regions();").Check(testkit.Rows("1 1")) + tk.MustQuery("select _tidb_rowid, b from t tablesample regions();").Check(testkit.Rows("1 abc")) + tk.MustQuery("select b, _tidb_rowid, a from t tablesample regions();").Check(testkit.Rows("abc 1 1")) +} + +func (s *testTableSampleSuite) TestTableSampleWithPartition(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int, b varchar(255), primary key (a)) partition by hash(a) partitions 2;") + tk.MustExec("insert into t values (1, '1'), (2, '2'), (3, '3');") + rows := tk.MustQuery("select * from t tablesample regions();").Rows() + c.Assert(len(rows), Equals, 2) + + tk.MustExec("delete from t;") + tk.MustExec("insert into t values (1, '1');") + rows = tk.MustQuery("select * from t partition (p0) tablesample regions();").Rows() + c.Assert(len(rows), Equals, 0) + rows = tk.MustQuery("select * from t partition (p1) tablesample regions();").Rows() + c.Assert(len(rows), Equals, 1) +} + +func (s *testTableSampleSuite) TestTableSampleGeneratedColumns(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int primary key, b int as (a + 1), c int as (b + 1), d int as (c + 1));") + tk.MustQuery("split table t between (0) and (10000) regions 4;").Check(testkit.Rows("3 1")) + tk.MustExec("insert into t(a) values (1), (2), (2999), (4999), (9999);") + tk.MustQuery("select a from t tablesample regions()").Check(testkit.Rows("1", "2999", "9999")) + tk.MustQuery("select c from t tablesample regions()").Check(testkit.Rows("3", "3001", "10001")) + tk.MustQuery("select a, b from t tablesample regions()").Check( + testkit.Rows("1 2", "2999 3000", "9999 10000")) + tk.MustQuery("select d, c from t tablesample regions()").Check( + testkit.Rows("4 3", "3002 3001", "10002 10001")) + tk.MustQuery("select a, d from t tablesample regions()").Check( + testkit.Rows("1 4", "2999 3002", "9999 10002")) +} + +func (s *testTableSampleSuite) TestTableSampleUnionScanIgnorePendingKV(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int primary key);") + tk.MustQuery("split table t between (0) and (40000) regions 4;").Check(testkit.Rows("3 1")) + tk.MustExec("insert into t values (1), (1000), (10002);") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002")) + + tk.MustExec("begin;") + tk.MustExec("insert into t values (20006), (50000);") + // The memory DB values in transactions are ignored. + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002")) + tk.MustExec("delete from t where a = 1;") + // The memory DB values in transactions are ignored. + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002")) + tk.MustExec("commit;") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1000", "10002", "20006", "50000")) +} + +func (s *testTableSampleSuite) TestTableSampleTransactionConsistency(c *C) { + tk := s.initSampleTest(c) + tk2 := s.initSampleTest(c) + tk.MustExec("create table t (a int primary key);") + tk.MustQuery("split table t between (0) and (40000) regions 4;").Check(testkit.Rows("3 1")) + tk.MustExec("insert into t values (1), (1000), (10002);") + + tk.MustExec("begin;") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002")) + tk2.MustExec("insert into t values (20006), (50000);") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002")) + tk.MustExec("commit;") + tk.MustQuery("select * from t tablesample regions();").Check(testkit.Rows("1", "10002", "20006", "50000")) +} + +func (s *testTableSampleSuite) TestTableSampleNotSupportedPlanWarning(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int primary key, b int, c varchar(255));") + tk.MustQuery("split table t between (0) and (10000) regions 5;").Check(testkit.Rows("4 1")) + tk.MustExec("insert into t values (1000, 1, '1'), (1001, 1, '1'), (2100, 2, '2'), (4500, 3, '3');") + + tk.MustExec("create index idx_0 on t (b);") + tk.MustQuery("select a from t tablesample regions() order by a;").Check( + testkit.Rows("1000", "2100", "4500")) + tk.MustQuery("select a from t use index (idx_0) tablesample regions() order by a;").Check( + testkit.Rows("1000", "1001", "2100", "4500")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 8128 Invalid TABLESAMPLE: plan not supported")) +} + +func (s *testTableSampleSuite) TestMaxChunkSize(c *C) { + tk := s.initSampleTest(c) + tk.MustExec("create table t (a int) shard_row_id_bits = 2 pre_split_regions = 2;") + for i := 0; i < 100; i++ { + tk.MustExec("insert into t values (?);", i) + } + tk.Se.GetSessionVars().MaxChunkSize = 1 + rows := tk.MustQuery("select * from t tablesample regions();").Rows() + c.Assert(len(rows), Equals, 4) +} diff --git a/executor/select_into.go b/executor/select_into.go index 9541ce98eefea..6afe7c66dde10 100644 --- a/executor/select_into.go +++ b/executor/select_into.go @@ -162,7 +162,7 @@ func (s *SelectIntoExec) dumpToOutfile() error { } s.fieldBuf = s.fieldBuf[:0] switch col.GetType().Tp { - case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong: + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeYear: s.fieldBuf = strconv.AppendInt(s.fieldBuf, row.GetInt64(j), 10) case mysql.TypeLonglong: if mysql.HasUnsignedFlag(col.GetType().Flag) { @@ -170,7 +170,9 @@ func (s *SelectIntoExec) dumpToOutfile() error { } else { s.fieldBuf = strconv.AppendInt(s.fieldBuf, row.GetInt64(j), 10) } - case mysql.TypeFloat, mysql.TypeDouble: + case mysql.TypeFloat: + s.realBuf, s.fieldBuf = DumpRealOutfile(s.realBuf, s.fieldBuf, float64(row.GetFloat32(j)), col.RetType) + case mysql.TypeDouble: s.realBuf, s.fieldBuf = DumpRealOutfile(s.realBuf, s.fieldBuf, row.GetFloat64(j), col.RetType) case mysql.TypeNewDecimal: s.fieldBuf = append(s.fieldBuf, row.GetMyDecimal(j).String()...) @@ -191,7 +193,13 @@ func (s *SelectIntoExec) dumpToOutfile() error { case mysql.TypeJSON: s.fieldBuf = append(s.fieldBuf, row.GetJSON(j).String()...) } - s.lineBuf = append(s.lineBuf, s.escapeField(s.fieldBuf)...) + + switch col.GetType().EvalType() { + case types.ETString, types.ETJson: + s.lineBuf = append(s.lineBuf, s.escapeField(s.fieldBuf)...) + default: + s.lineBuf = append(s.lineBuf, s.fieldBuf...) + } if (encloseFlag && !encloseOpt) || (encloseFlag && encloseOpt && s.considerEncloseOpt(et)) { s.lineBuf = append(s.lineBuf, encloseByte) diff --git a/executor/select_into_test.go b/executor/select_into_test.go index 41ba595c89a69..c499db9bdd322 100644 --- a/executor/select_into_test.go +++ b/executor/select_into_test.go @@ -85,6 +85,16 @@ func (s *testSuite1) TestSelectIntoOutfileTypes(c *C) { tk.MustExec(fmt.Sprintf("SELECT * FROM t INTO OUTFILE %q", outfile)) cmpAndRm(`0 1 +`, outfile, c) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id float(16,2)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("insert into t values (3.4), (1), (10.1), (2.00)") + tk.MustExec(fmt.Sprintf("SELECT * FROM t ORDER BY id INTO OUTFILE %q", outfile)) + cmpAndRm(`1.00 +2.00 +3.40 +10.10 `, outfile, c) } @@ -236,3 +246,36 @@ func (s *testSuite1) TestDumpReal(c *C) { c.Assert(string(buf), Equals, testCase.result) } } + +func (s *testSuite1) TestEscapeType(c *C) { + outfile := randomSelectFilePath("TestEscapeType") + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t ( + a int, + b double, + c varchar(10), + d blob, + e json, + f set('1', '2', '3'), + g enum('1', '2', '3'))`) + tk.MustExec(`insert into t values (1, 1, "1", "1", '{"key": 1}', "1", "1")`) + + tk.MustExec(fmt.Sprintf("select * from t into outfile '%v' fields terminated by ',' escaped by '1'", outfile)) + cmpAndRm(`1,1,11,11,{"key": 11},11,11 +`, outfile, c) +} + +func (s *testSuite1) TestYearType(c *C) { + outfile := randomSelectFilePath("TestYearType") + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(time1 year(4) default '2030');") + tk.MustExec("insert into t values (2010), (2011), (2012);") + tk.MustExec("insert into t values ();") + + tk.MustExec(fmt.Sprintf("select * from t into outfile '%v' fields terminated by ',' optionally enclosed by '\"' lines terminated by '\\n';", outfile)) + cmpAndRm("2010\n2011\n2012\n2030\n", outfile, c) +} diff --git a/executor/seqtest/prepared_test.go b/executor/seqtest/prepared_test.go index 65d23c8c27304..32bf549751d1f 100644 --- a/executor/seqtest/prepared_test.go +++ b/executor/seqtest/prepared_test.go @@ -159,7 +159,8 @@ func (s *seqTestSuite) TestPrepared(c *C) { // Make schema change. tk.MustExec("drop table if exists prepare2") - tk.Exec("create table prepare2 (a int)") + _, err = tk.Exec("create table prepare2 (a int)") + c.Assert(err, IsNil) // Should success as the changed schema do not affect the prepared statement. _, err = tk.Se.ExecutePreparedStmt(ctx, stmtID, []types.Datum{types.NewDatum(1)}) @@ -252,8 +253,10 @@ func (s *seqTestSuite) TestPrepared(c *C) { // Coverage. exec := &executor.ExecuteExec{} - exec.Next(ctx, nil) - exec.Close() + err = exec.Next(ctx, nil) + c.Assert(err, IsNil) + err = exec.Close() + c.Assert(err, IsNil) // issue 8065 stmtID, _, _, err = tk.Se.PrepareStmt("select ? from dual") @@ -447,19 +450,22 @@ func (s *seqTestSuite) TestPreparedInsert(c *C) { tk.MustExec(`prepare stmt_insert from 'insert into prepare_test values (?, ?)'`) tk.MustExec(`set @a=1,@b=1; execute stmt_insert using @a, @b;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(0)) } tk.MustExec(`set @a=2,@b=2; execute stmt_insert using @a, @b;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(1)) } tk.MustExec(`set @a=3,@b=3; execute stmt_insert using @a, @b;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(2)) } @@ -474,19 +480,22 @@ func (s *seqTestSuite) TestPreparedInsert(c *C) { tk.MustExec(`prepare stmt_insert_select from 'insert into prepare_test (id, c1) select id + 100, c1 + 100 from prepare_test where id = ?'`) tk.MustExec(`set @a=1; execute stmt_insert_select using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(2)) } tk.MustExec(`set @a=2; execute stmt_insert_select using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(3)) } tk.MustExec(`set @a=3; execute stmt_insert_select using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(4)) } @@ -529,19 +538,22 @@ func (s *seqTestSuite) TestPreparedUpdate(c *C) { tk.MustExec(`prepare stmt_update from 'update prepare_test set c1 = c1 + ? where id = ?'`) tk.MustExec(`set @a=1,@b=100; execute stmt_update using @b,@a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(2)) } tk.MustExec(`set @a=2,@b=200; execute stmt_update using @b,@a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(3)) } tk.MustExec(`set @a=3,@b=300; execute stmt_update using @b,@a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(4)) } @@ -584,19 +596,22 @@ func (s *seqTestSuite) TestPreparedDelete(c *C) { tk.MustExec(`prepare stmt_delete from 'delete from prepare_test where id = ?'`) tk.MustExec(`set @a=1; execute stmt_delete using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(0)) } tk.MustExec(`set @a=2; execute stmt_delete using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(1)) } tk.MustExec(`set @a=3; execute stmt_delete using @a;`) if flag { - counter.Write(pb) + err = counter.Write(pb) + c.Assert(err, IsNil) hit := pb.GetCounter().GetValue() c.Check(hit, Equals, float64(2)) } @@ -716,19 +731,39 @@ func (s *seqTestSuite) TestPreparedIssue8644(c *C) { c.Assert(err, IsNil) tk.MustExec("use test") + tk.MustExec("drop table if exists t") tk.MustExec("create table t(data mediumblob)") - - tk.MustExec(`prepare stmt1 from 'insert t (data) values (?)'`) - + tk.MustExec(`prepare stmt from 'insert t (data) values (?)'`) tk.MustExec(`set @a = 'a'`) - tk.MustExec(`execute stmt1 using @a;`) - + tk.MustExec(`execute stmt using @a;`) tk.MustExec(`set @b = 'aaaaaaaaaaaaaaaaaa'`) - tk.MustExec(`execute stmt1 using @b;`) + tk.MustExec(`execute stmt using @b;`) r := tk.MustQuery(`select * from t`) r.Check(testkit.Rows("a", "aaaaaaaaaaaaaaaaaa")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(data decimal)") + tk.MustExec(`prepare stmt from 'insert t (data) values (?)'`) + tk.MustExec(`set @a = '1'`) + tk.MustExec(`execute stmt using @a;`) + tk.MustExec(`set @b = '11111.11111'`) // '.11111' will be truncated. + tk.MustExec(`execute stmt using @b;`) + + r = tk.MustQuery(`select * from t`) + r.Check(testkit.Rows("1", "11111")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(data decimal(10,3));") + tk.MustExec("prepare stmt from 'insert t (data) values (?)';") + tk.MustExec("set @a = 1.1;") + tk.MustExec("execute stmt using @a;") + tk.MustExec("set @b = 11.11;") + tk.MustExec("execute stmt using @b;") + + r = tk.MustQuery(`select * from t`) + r.Check(testkit.Rows("1.100", "11.110")) } } @@ -751,6 +786,12 @@ func (msm *mockSessionManager1) GetProcessInfo(id uint64) (*util.ProcessInfo, bo // Kill implements the SessionManager.Kill interface. func (msm *mockSessionManager1) Kill(cid uint64, query bool) {} +func (msm *mockSessionManager1) KillAllConnections() {} + +func (msm *mockSessionManager1) ServerID() uint64 { + return 1 +} + func (msm *mockSessionManager1) UpdateTLSConfig(cfg *tls.Config) {} func (s *seqTestSuite) TestPreparedIssue17419(c *C) { diff --git a/executor/seqtest/seq_executor_test.go b/executor/seqtest/seq_executor_test.go index d792ac8829706..ef1909bfad487 100644 --- a/executor/seqtest/seq_executor_test.go +++ b/executor/seqtest/seq_executor_test.go @@ -50,14 +50,14 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics/handle" + "github.com/pingcap/tidb/store/copr" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -65,7 +65,14 @@ import ( func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) TestingT(t) } @@ -77,7 +84,6 @@ type seqTestSuite struct { store kv.Storage domain *domain.Domain *parser.Parser - ctx *mock.Context } var mockTikv = flag.Bool("mockTikv", true, "use mock tikv store in executor test") @@ -144,9 +150,9 @@ func (s *seqTestSuite) TestEarlyClose(c *C) { } // Goroutine should not leak when error happen. - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/handleTaskOnceError", `return(true)`), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/copr/handleTaskOnceError", `return(true)`), IsNil) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/handleTaskOnceError"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/copr/handleTaskOnceError"), IsNil) }() rss, err := tk.Se.Execute(ctx, "select * from earlyclose") c.Assert(err, IsNil) @@ -173,6 +179,9 @@ func (s stats) Stats(vars *variable.SessionVars) (map[string]interface{}, error) } func (s *seqTestSuite) TestShow(c *C) { + config.UpdateGlobal(func(conf *config.Config) { + conf.Experimental.AllowsExpressionIndex = true + }) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -191,7 +200,7 @@ func (s *seqTestSuite) TestShow(c *C) { row := result.Rows()[0] // For issue https://github.com/pingcap/tidb/issues/1061 expectedRow := []interface{}{ - "SHOW_test", "CREATE TABLE `SHOW_test` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `c1` int(11) DEFAULT NULL COMMENT 'c1_comment',\n `c2` int(11) DEFAULT NULL,\n `c3` int(11) DEFAULT 1,\n `c4` text DEFAULT NULL,\n `c5` tinyint(1) DEFAULT NULL,\n PRIMARY KEY (`id`),\n KEY `idx_wide_c4` (`c3`,`c4`(10))\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=28934 COMMENT='table_comment'"} + "SHOW_test", "CREATE TABLE `SHOW_test` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `c1` int(11) DEFAULT NULL COMMENT 'c1_comment',\n `c2` int(11) DEFAULT NULL,\n `c3` int(11) DEFAULT '1',\n `c4` text DEFAULT NULL,\n `c5` tinyint(1) DEFAULT NULL,\n PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n KEY `idx_wide_c4` (`c3`,`c4`(10))\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=28934 COMMENT='table_comment'"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } @@ -211,7 +220,7 @@ func (s *seqTestSuite) TestShow(c *C) { c.Check(result.Rows(), HasLen, 1) row = result.Rows()[0] expectedRow = []interface{}{ - "ptest", "CREATE TABLE `ptest` (\n `a` int(11) NOT NULL,\n `b` double NOT NULL DEFAULT 2.0,\n `c` varchar(10) NOT NULL,\n `d` time DEFAULT NULL,\n `e` timestamp NULL DEFAULT NULL,\n `f` timestamp NULL DEFAULT NULL,\n PRIMARY KEY (`a`),\n UNIQUE KEY `d` (`d`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"} + "ptest", "CREATE TABLE `ptest` (\n `a` int(11) NOT NULL,\n `b` double NOT NULL DEFAULT '2.0',\n `c` varchar(10) NOT NULL,\n `d` time DEFAULT NULL,\n `e` timestamp NULL DEFAULT NULL,\n `f` timestamp NULL DEFAULT NULL,\n PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n UNIQUE KEY `d` (`d`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) } @@ -252,7 +261,7 @@ func (s *seqTestSuite) TestShow(c *C) { row = result.Rows()[0] expectedRow = []interface{}{ "decimalschema", "CREATE TABLE `decimalschema` (\n" + - " `c1` decimal(11,0) DEFAULT NULL\n" + + " `c1` decimal(10,0) DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin"} for i, r := range row { c.Check(r, Equals, expectedRow[i]) @@ -316,15 +325,15 @@ func (s *seqTestSuite) TestShow(c *C) { tk.MustQuery(testSQL).Check(testutil.RowsWithSep("|", "show_index|0|PRIMARY|1|id|A|0||||BTREE| |YES|NULL", "show_index|1|cIdx|1|c|A|0|||YES|HASH||index_comment_for_cIdx|YES|NULL", - "show_index|1|idx1|1|id|A|0|||YES|HASH| |YES|NULL", - "show_index|1|idx2|1|id|A|0|||YES|BTREE||idx|YES|NULL", - "show_index|1|idx3|1|id|A|0|||YES|HASH||idx|YES|NULL", - "show_index|1|idx4|1|id|A|0|||YES|BTREE||idx|YES|NULL", - "show_index|1|idx5|1|id|A|0|||YES|BTREE||idx|YES|NULL", - "show_index|1|idx6|1|id|A|0|||YES|HASH| |YES|NULL", - "show_index|1|idx7|1|id|A|0|||YES|BTREE| |YES|NULL", - "show_index|1|idx8|1|id|A|0|||YES|BTREE| |YES|NULL", - "show_index|1|idx9|1|id|A|0|||YES|BTREE| |NO|NULL", + "show_index|1|idx1|1|id|A|0||||HASH| |YES|NULL", + "show_index|1|idx2|1|id|A|0||||BTREE||idx|YES|NULL", + "show_index|1|idx3|1|id|A|0||||HASH||idx|YES|NULL", + "show_index|1|idx4|1|id|A|0||||BTREE||idx|YES|NULL", + "show_index|1|idx5|1|id|A|0||||BTREE||idx|YES|NULL", + "show_index|1|idx6|1|id|A|0||||HASH| |YES|NULL", + "show_index|1|idx7|1|id|A|0||||BTREE| |YES|NULL", + "show_index|1|idx8|1|id|A|0||||BTREE| |YES|NULL", + "show_index|1|idx9|1|id|A|0||||BTREE| |NO|NULL", "show_index|1|expr_idx|1|NULL|A|0|||YES|BTREE| |YES|(`id` * 2 + 1)", )) @@ -394,7 +403,7 @@ func (s *seqTestSuite) TestShow(c *C) { ""+ "show_auto_increment CREATE TABLE `show_auto_increment` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`id`)\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=4", )) // for issue https://github.com/pingcap/tidb/issues/4678 @@ -405,7 +414,7 @@ func (s *seqTestSuite) TestShow(c *C) { ""+ "show_auto_increment CREATE TABLE `show_auto_increment` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`id`)\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT="+strconv.Itoa(int(autoID)), )) tk.MustExec(`drop table show_auto_increment`) @@ -414,7 +423,7 @@ func (s *seqTestSuite) TestShow(c *C) { ""+ "show_auto_increment CREATE TABLE `show_auto_increment` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`id`)\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) tk.MustExec("insert into show_auto_increment values(10)") @@ -423,7 +432,7 @@ func (s *seqTestSuite) TestShow(c *C) { ""+ "show_auto_increment CREATE TABLE `show_auto_increment` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`id`)\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT="+strconv.Itoa(int(autoID)), )) @@ -587,7 +596,7 @@ func (s *seqTestSuite) TestShow(c *C) { "t CREATE TABLE `t` (\n"+ " `y` year(4) NOT NULL,\n"+ " `x` int(11) DEFAULT NULL,\n"+ - " PRIMARY KEY (`y`)\n"+ + " PRIMARY KEY (`y`) /*T![clustered_index] NONCLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) // Test show create table with zerofill flag @@ -597,7 +606,7 @@ func (s *seqTestSuite) TestShow(c *C) { "t CREATE TABLE `t` (\n"+ " `id` int(11) NOT NULL,\n"+ " `val` tinyint(10) unsigned zerofill DEFAULT NULL,\n"+ - " PRIMARY KEY (`id`)\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) // Test show columns with different types of default value @@ -612,7 +621,8 @@ func (s *seqTestSuite) TestShow(c *C) { c6 enum('s', 'm', 'l', 'xl') default 'xl', c7 set('a', 'b', 'c', 'd') default 'a,c,c', c8 datetime default current_timestamp on update current_timestamp, - c9 year default '2014' + c9 year default '2014', + c10 enum('2', '3', '4') default 2 );`) tk.MustQuery(`show columns from t`).Check(testutil.RowsWithSep("|", "c0|int(11)|YES||1|", @@ -625,6 +635,7 @@ func (s *seqTestSuite) TestShow(c *C) { "c7|set('a','b','c','d')|YES||a,c|", "c8|datetime|YES||CURRENT_TIMESTAMP|DEFAULT_GENERATED on update CURRENT_TIMESTAMP", "c9|year(4)|YES||2014|", + "c10|enum('2','3','4')|YES||3|", )) // Test if 'show [status|variables]' is sorted by Variable_name (#14542) @@ -653,25 +664,30 @@ func (s *seqTestSuite) TestShowStatsHealthy(c *C) { tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("insert into t values (1), (2)") do, _ := session.GetDomain(s.store) - do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) + err := do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) + c.Assert(err, IsNil) tk.MustExec("analyze table t") tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("insert into t values (3), (4), (5), (6), (7), (8), (9), (10)") - do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) - do.StatsHandle().Update(do.InfoSchema()) + err = do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) + c.Assert(err, IsNil) + err = do.StatsHandle().Update(do.InfoSchema()) + c.Assert(err, IsNil) tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 19")) tk.MustExec("analyze table t") tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 100")) tk.MustExec("delete from t") - do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) - do.StatsHandle().Update(do.InfoSchema()) + err = do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll) + c.Assert(err, IsNil) + err = do.StatsHandle().Update(do.InfoSchema()) + c.Assert(err, IsNil) tk.MustQuery("show stats_healthy").Check(testkit.Rows("test t 0")) } // TestIndexDoubleReadClose checks that when a index double read returns before reading all the rows, the goroutine doesn't // leak. For testing distsql with multiple regions, we need to manually split a mock TiKV. func (s *seqTestSuite) TestIndexDoubleReadClose(c *C) { - if _, ok := s.store.GetClient().(*tikv.CopClient); !ok { + if _, ok := s.store.GetClient().(*copr.CopClient); !ok { // Make sure the store is tikv store. return } @@ -696,7 +712,7 @@ func (s *seqTestSuite) TestIndexDoubleReadClose(c *C) { c.Assert(err, IsNil) c.Assert(err, IsNil) keyword := "pickAndExecTask" - rs.Close() + c.Assert(rs.Close(), IsNil) time.Sleep(time.Millisecond * 10) c.Check(checkGoroutineExists(keyword), IsFalse) atomic.StoreInt32(&executor.LookupTableTaskChannelSize, originSize) @@ -770,7 +786,10 @@ func (s *seqTestSuite) TestUnparallelHashAggClose(c *C) { func checkGoroutineExists(keyword string) bool { buf := new(bytes.Buffer) profile := pprof.Lookup("goroutine") - profile.WriteTo(buf, 1) + err := profile.WriteTo(buf, 1) + if err != nil { + panic(err) + } str := buf.String() return strings.Contains(str, keyword) } @@ -1236,6 +1255,7 @@ func (s *seqTestSuite) TestShowForNewCollations(c *C) { "utf8mb4_bin utf8mb4 46 Yes Yes 1", "utf8mb4_general_ci utf8mb4 45 Yes 1", "utf8mb4_unicode_ci utf8mb4 224 Yes 1", + "utf8mb4_zh_pinyin_tidb_as_cs utf8mb4 2048 Yes 1", ) tk.MustQuery("show collation").Check(expectRows) tk.MustQuery("select * from information_schema.COLLATIONS").Check(expectRows) @@ -1312,6 +1332,52 @@ func (s *seqTestSuite) TestPessimisticConflictRetryAutoID(c *C) { } } +func (s *seqTestSuite) TestInsertFromSelectConflictRetryAutoID(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id int not null auto_increment unique key, idx int unique key, c int);") + tk.MustExec("create table src (a int);") + concurrency := 2 + var wg sync.WaitGroup + var err []error + wgCount := concurrency + 1 + wg.Add(wgCount) + err = make([]error, concurrency) + for i := 0; i < concurrency; i++ { + tk := testkit.NewTestKitWithInit(c, s.store) + go func(idx int) { + for i := 0; i < 10; i++ { + sql := fmt.Sprintf("insert into t(idx, c) select 1 as idx, 1 as c from src on duplicate key update c = %[1]d", i) + _, e := tk.Exec(sql) + if e != nil { + err[idx] = e + wg.Done() + return + } + } + wg.Done() + }(i) + } + var insertErr error + go func() { + tk := testkit.NewTestKitWithInit(c, s.store) + for i := 0; i < 10; i++ { + _, e := tk.Exec("insert into src values (null);") + if e != nil { + insertErr = e + wg.Done() + return + } + } + wg.Done() + }() + wg.Wait() + for _, e := range err { + c.Assert(e, IsNil) + } + c.Assert(insertErr, IsNil) +} + func (s *seqTestSuite) TestAutoRandIDRetry(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) diff --git a/executor/set.go b/executor/set.go index 08744aeb47a26..503871fbe4a55 100644 --- a/executor/set.go +++ b/executor/set.go @@ -33,7 +33,6 @@ import ( "github.com/pingcap/tidb/util/gcutil" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/stmtsummary" - "github.com/pingcap/tidb/util/stringutil" "go.uber.org/zap" ) @@ -91,17 +90,15 @@ func (e *SetExecutor) Next(ctx context.Context, req *chunk.Chunk) error { if err != nil { return err } - + sessionVars.UsersLock.Lock() if value.IsNull() { delete(sessionVars.Users, name) + delete(sessionVars.UserVarTypes, name) } else { - svalue, err1 := value.ToString() - if err1 != nil { - return err1 - } - - sessionVars.SetUserVar(name, stringutil.Copy(svalue), value.Collation()) + sessionVars.Users[name] = value + sessionVars.UserVarTypes[name] = v.Expr.GetType() } + sessionVars.UsersLock.Unlock() continue } @@ -183,10 +180,6 @@ func (e *SetExecutor) setSysVariable(name string, v *expression.VarAssignment) e if name == variable.TxnIsolationOneShot && sessionVars.InTxn() { return errors.Trace(ErrCantChangeTxCharacteristics) } - if name == variable.TiDBFoundInPlanCache { - sessionVars.StmtCtx.AppendWarning(fmt.Errorf("Set operation for '%s' will not take effect", variable.TiDBFoundInPlanCache)) - return nil - } err = variable.SetSessionSystemVar(sessionVars, name, value) if err != nil { return err @@ -220,6 +213,8 @@ func (e *SetExecutor) setSysVariable(name string, v *expression.VarAssignment) e logutil.BgLogger().Debug(fmt.Sprintf("set %s var", scopeStr), zap.Uint64("conn", sessionVars.ConnectionID), zap.String("name", name), zap.String("val", valStr)) } + valStrToBoolStr := variable.BoolToOnOff(variable.TiDBOptOn(valStr)) + switch name { case variable.TiDBEnableStmtSummary: return stmtsummary.StmtSummaryByDigestMap.SetEnabled(valStr, !v.IsGlobal) @@ -234,7 +229,7 @@ func (e *SetExecutor) setSysVariable(name string, v *expression.VarAssignment) e case variable.TiDBStmtSummaryMaxSQLLength: return stmtsummary.StmtSummaryByDigestMap.SetMaxSQLLength(valStr, !v.IsGlobal) case variable.TiDBCapturePlanBaseline: - variable.CapturePlanBaseline.Set(strings.ToLower(valStr), !v.IsGlobal) + variable.CapturePlanBaseline.Set(valStrToBoolStr, !v.IsGlobal) } return nil diff --git a/executor/set_test.go b/executor/set_test.go index 975d65237cccb..b55ed2328af74 100644 --- a/executor/set_test.go +++ b/executor/set_test.go @@ -37,7 +37,7 @@ import ( "github.com/pingcap/tidb/util/testutil" ) -func (s *testSuite5) TestSetVar(c *C) { +func (s *testSerialSuite1) TestSetVar(c *C) { tk := testkit.NewTestKit(c, s.store) testSQL := "SET @a = 1;" tk.MustExec(testSQL) @@ -120,7 +120,8 @@ func (s *testSuite5) TestSetVar(c *C) { // Test session variable states. vars := tk.Se.(sessionctx.Context).GetSessionVars() - tk.Se.CommitTxn(context.TODO()) + err = tk.Se.CommitTxn(context.TODO()) + c.Assert(err, IsNil) tk.MustExec("set @@autocommit = 1") c.Assert(vars.InTxn(), IsFalse) c.Assert(vars.IsAutocommit(), IsTrue) @@ -260,8 +261,12 @@ func (s *testSuite5) TestSetVar(c *C) { tk.MustExec("set @@sql_log_bin = on") tk.MustQuery(`select @@session.sql_log_bin;`).Check(testkit.Rows("1")) - tk.MustQuery(`select @@global.log_bin;`).Check(testkit.Rows(variable.BoolToIntStr(config.GetGlobalConfig().Binlog.Enable))) - tk.MustQuery(`select @@log_bin;`).Check(testkit.Rows(variable.BoolToIntStr(config.GetGlobalConfig().Binlog.Enable))) + binlogValue := "0" + if config.GetGlobalConfig().Binlog.Enable { + binlogValue = "1" + } + tk.MustQuery(`select @@global.log_bin;`).Check(testkit.Rows(binlogValue)) + tk.MustQuery(`select @@log_bin;`).Check(testkit.Rows(binlogValue)) tk.MustExec("set @@tidb_general_log = 1") tk.MustExec("set @@tidb_general_log = 0") @@ -375,7 +380,7 @@ func (s *testSuite5) TestSetVar(c *C) { tk.MustQuery(`select @@session.tidb_wait_split_region_timeout;`).Check(testkit.Rows("1")) _, err = tk.Exec("set tidb_wait_split_region_timeout = 0") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "tidb_wait_split_region_timeout(0) cannot be smaller than 1") + c.Assert(err, ErrorMatches, ".*Variable 'tidb_wait_split_region_timeout' can't be set to the value of '0'") tk.MustQuery(`select @@session.tidb_wait_split_region_timeout;`).Check(testkit.Rows("1")) tk.MustExec("set session tidb_backoff_weight = 3") @@ -404,24 +409,30 @@ func (s *testSuite5) TestSetVar(c *C) { tk.MustQuery("select @@session.tidb_store_limit;").Check(testkit.Rows("0")) tk.MustQuery("select @@global.tidb_store_limit;").Check(testkit.Rows("100")) - tk.MustQuery("select @@tidb_enable_change_column_type;").Check(testkit.Rows("0")) + tk.MustQuery("select @@global.tidb_enable_change_column_type;").Check(testkit.Rows("0")) tk.MustExec("set global tidb_enable_change_column_type = 1") - tk.MustQuery("select @@tidb_enable_change_column_type;").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_enable_change_column_type;").Check(testkit.Rows("1")) tk.MustExec("set global tidb_enable_change_column_type = off") - tk.MustQuery("select @@tidb_enable_change_column_type;").Check(testkit.Rows("0")) + tk.MustQuery("select @@global.tidb_enable_change_column_type;").Check(testkit.Rows("0")) + // test tidb_enable_change_column_type in session scope. + tk.MustQuery("select @@session.tidb_enable_change_column_type;").Check(testkit.Rows("0")) + tk.MustExec("set @@session.tidb_enable_change_column_type = 1") + tk.MustQuery("select @@session.tidb_enable_change_column_type;").Check(testkit.Rows("1")) + tk.MustExec("set @@session.tidb_enable_change_column_type = off") + tk.MustQuery("select @@session.tidb_enable_change_column_type;").Check(testkit.Rows("0")) tk.MustQuery("select @@session.tidb_metric_query_step;").Check(testkit.Rows("60")) tk.MustExec("set @@session.tidb_metric_query_step = 120") _, err = tk.Exec("set @@session.tidb_metric_query_step = 9") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "tidb_metric_query_step(9) cannot be smaller than 10 or larger than 216000") + c.Assert(err, ErrorMatches, ".*Variable 'tidb_metric_query_step' can't be set to the value of '9'") tk.MustQuery("select @@session.tidb_metric_query_step;").Check(testkit.Rows("120")) tk.MustQuery("select @@session.tidb_metric_query_range_duration;").Check(testkit.Rows("60")) tk.MustExec("set @@session.tidb_metric_query_range_duration = 120") _, err = tk.Exec("set @@session.tidb_metric_query_range_duration = 9") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "tidb_metric_query_range_duration(9) cannot be smaller than 10 or larger than 216000") + c.Assert(err, ErrorMatches, ".*Variable 'tidb_metric_query_range_duration' can't be set to the value of '9'") tk.MustQuery("select @@session.tidb_metric_query_range_duration;").Check(testkit.Rows("120")) // test for tidb_slow_log_masking @@ -430,10 +441,10 @@ func (s *testSuite5) TestSetVar(c *C) { tk.MustQuery(`select @@global.tidb_slow_log_masking;`).Check(testkit.Rows("1")) tk.MustExec("set global tidb_slow_log_masking = 0") tk.MustQuery(`select @@global.tidb_slow_log_masking;`).Check(testkit.Rows("0")) - _, err = tk.Exec("set session tidb_slow_log_masking = 0") - c.Assert(err, NotNil) - _, err = tk.Exec(`select @@session.tidb_slow_log_masking;`) - c.Assert(err, NotNil) + tk.MustExec("set session tidb_slow_log_masking = 0") + tk.MustQuery(`select @@session.tidb_slow_log_masking;`).Check(testkit.Rows("0")) + tk.MustExec("set session tidb_slow_log_masking = 1") + tk.MustQuery(`select @@session.tidb_slow_log_masking;`).Check(testkit.Rows("1")) tk.MustQuery("select @@tidb_dml_batch_size;").Check(testkit.Rows("0")) tk.MustExec("set @@session.tidb_dml_batch_size = 120") @@ -444,6 +455,88 @@ func (s *testSuite5) TestSetVar(c *C) { _, err = tk.Exec("set tidb_enable_parallel_apply=-1") c.Assert(terror.ErrorEqual(err, variable.ErrWrongValueForVar), IsTrue) + + // test for tidb_mem_quota_apply_cache + defVal := fmt.Sprintf("%v", variable.DefTiDBMemQuotaApplyCache) + tk.MustQuery(`select @@tidb_mem_quota_apply_cache`).Check(testkit.Rows(defVal)) + tk.MustExec(`set global tidb_mem_quota_apply_cache = 1`) + tk.MustQuery(`select @@global.tidb_mem_quota_apply_cache`).Check(testkit.Rows("1")) + tk.MustExec(`set global tidb_mem_quota_apply_cache = 0`) + tk.MustQuery(`select @@global.tidb_mem_quota_apply_cache`).Check(testkit.Rows("0")) + tk.MustExec(`set tidb_mem_quota_apply_cache = 123`) + tk.MustQuery(`select @@global.tidb_mem_quota_apply_cache`).Check(testkit.Rows("0")) + tk.MustQuery(`select @@tidb_mem_quota_apply_cache`).Check(testkit.Rows("123")) + + // test for tidb_enable_parallel_apply + tk.MustQuery(`select @@tidb_enable_parallel_apply`).Check(testkit.Rows("0")) + tk.MustExec(`set global tidb_enable_parallel_apply = 1`) + tk.MustQuery(`select @@global.tidb_enable_parallel_apply`).Check(testkit.Rows("1")) + tk.MustExec(`set global tidb_enable_parallel_apply = 0`) + tk.MustQuery(`select @@global.tidb_enable_parallel_apply`).Check(testkit.Rows("0")) + tk.MustExec(`set tidb_enable_parallel_apply=1`) + tk.MustQuery(`select @@global.tidb_enable_parallel_apply`).Check(testkit.Rows("0")) + tk.MustQuery(`select @@tidb_enable_parallel_apply`).Check(testkit.Rows("1")) + + tk.MustQuery(`select @@session.tidb_general_log;`).Check(testkit.Rows("0")) + tk.MustQuery(`show variables like 'tidb_general_log';`).Check(testkit.Rows("tidb_general_log OFF")) + tk.MustExec("set tidb_general_log = 1") + tk.MustQuery(`select @@session.tidb_general_log;`).Check(testkit.Rows("1")) + tk.MustQuery(`show variables like 'tidb_general_log';`).Check(testkit.Rows("tidb_general_log ON")) + tk.MustExec("set tidb_general_log = 0") + tk.MustQuery(`select @@session.tidb_general_log;`).Check(testkit.Rows("0")) + tk.MustQuery(`show variables like 'tidb_general_log';`).Check(testkit.Rows("tidb_general_log OFF")) + tk.MustExec("set tidb_general_log = on") + tk.MustQuery(`select @@session.tidb_general_log;`).Check(testkit.Rows("1")) + tk.MustQuery(`show variables like 'tidb_general_log';`).Check(testkit.Rows("tidb_general_log ON")) + tk.MustExec("set tidb_general_log = off") + tk.MustQuery(`select @@session.tidb_general_log;`).Check(testkit.Rows("0")) + tk.MustQuery(`show variables like 'tidb_general_log';`).Check(testkit.Rows("tidb_general_log OFF")) + c.Assert(tk.ExecToErr("set tidb_general_log = abc"), NotNil) + c.Assert(tk.ExecToErr("set tidb_general_log = 123"), NotNil) + + tk.MustExec(`SET @@character_set_results = NULL;`) + tk.MustQuery(`select @@character_set_results;`).Check(testkit.Rows("")) + + varList := []string{"character_set_server", "character_set_client", "character_set_filesystem", "character_set_database"} + for _, v := range varList { + tk.MustGetErrCode(fmt.Sprintf("SET @@global.%s = @global_start_value;", v), mysql.ErrWrongValueForVar) + tk.MustGetErrCode(fmt.Sprintf("SET @@%s = @global_start_value;", v), mysql.ErrWrongValueForVar) + tk.MustGetErrCode(fmt.Sprintf("SET @@%s = NULL;", v), mysql.ErrWrongValueForVar) + tk.MustGetErrCode(fmt.Sprintf("SET @@%s = \"\";", v), mysql.ErrWrongValueForVar) + tk.MustGetErrMsg(fmt.Sprintf("SET @@%s = \"somecharset\";", v), "Unknown charset somecharset") + // we do not support set character_set_xxx or collation_xxx to a collation id. + tk.MustGetErrMsg(fmt.Sprintf("SET @@global.%s = 46;", v), "Unknown charset 46") + tk.MustGetErrMsg(fmt.Sprintf("SET @@%s = 46;", v), "Unknown charset 46") + } + + tk.MustExec("SET SESSION tidb_enable_extended_stats = on") + tk.MustQuery("select @@session.tidb_enable_extended_stats").Check(testkit.Rows("1")) + tk.MustExec("SET SESSION tidb_enable_extended_stats = off") + tk.MustQuery("select @@session.tidb_enable_extended_stats").Check(testkit.Rows("0")) + tk.MustExec("SET GLOBAL tidb_enable_extended_stats = on") + tk.MustQuery("select @@global.tidb_enable_extended_stats").Check(testkit.Rows("1")) + tk.MustExec("SET GLOBAL tidb_enable_extended_stats = off") + tk.MustQuery("select @@global.tidb_enable_extended_stats").Check(testkit.Rows("0")) + + tk.MustExec("SET SESSION tidb_allow_fallback_to_tikv = 'tiflash'") + tk.MustQuery("select @@session.tidb_allow_fallback_to_tikv").Check(testkit.Rows("tiflash")) + tk.MustExec("SET SESSION tidb_allow_fallback_to_tikv = ''") + tk.MustQuery("select @@session.tidb_allow_fallback_to_tikv").Check(testkit.Rows("")) + tk.MustExec("SET GLOBAL tidb_allow_fallback_to_tikv = 'tiflash'") + tk.MustQuery("select @@global.tidb_allow_fallback_to_tikv").Check(testkit.Rows("tiflash")) + tk.MustExec("SET GLOBAL tidb_allow_fallback_to_tikv = ''") + tk.MustQuery("select @@global.tidb_allow_fallback_to_tikv").Check(testkit.Rows("")) + tk.MustExec("set @@tidb_allow_fallback_to_tikv = 'tiflash, tiflash, tiflash'") + tk.MustQuery("select @@tidb_allow_fallback_to_tikv").Check(testkit.Rows("tiflash")) + + tk.MustGetErrMsg("SET SESSION tidb_allow_fallback_to_tikv = 'tikv,tiflash'", "[variable:1231]Variable 'tidb_allow_fallback_to_tikv' can't be set to the value of 'tikv,tiflash'") + tk.MustGetErrMsg("SET GLOBAL tidb_allow_fallback_to_tikv = 'tikv,tiflash'", "[variable:1231]Variable 'tidb_allow_fallback_to_tikv' can't be set to the value of 'tikv,tiflash'") + tk.MustGetErrMsg("set @@tidb_allow_fallback_to_tikv = 'tidb, tiflash, tiflash'", "[variable:1231]Variable 'tidb_allow_fallback_to_tikv' can't be set to the value of 'tidb, tiflash, tiflash'") + tk.MustGetErrMsg("set @@tidb_allow_fallback_to_tikv = 'unknown, tiflash, tiflash'", "[variable:1231]Variable 'tidb_allow_fallback_to_tikv' can't be set to the value of 'unknown, tiflash, tiflash'") + + // Test issue #22145 + tk.MustExec(`set global sync_relay_log = "'"`) + } func (s *testSuite5) TestTruncateIncorrectIntSessionVar(c *C) { @@ -578,6 +671,47 @@ func (s *testSuite5) TestSetCharset(c *C) { ) } +func (s *testSuite5) TestSetCollationAndCharset(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + ctx := tk.Se.(sessionctx.Context) + sessionVars := ctx.GetSessionVars() + + cases := []struct { + charset string + collation string + expectCharset string + expectCollation string + }{ + {variable.CharacterSetConnection, variable.CollationConnection, "utf8", "utf8_bin"}, + {variable.CharsetDatabase, variable.CollationDatabase, "utf8", "utf8_bin"}, + {variable.CharacterSetServer, variable.CollationServer, "utf8", "utf8_bin"}, + } + + for _, t := range cases { + tk.MustExec(fmt.Sprintf("set %s = %s;", t.charset, t.expectCharset)) + sVar, ok := sessionVars.GetSystemVar(t.charset) + c.Assert(ok, IsTrue) + c.Assert(sVar, Equals, t.expectCharset) + sVar, ok = sessionVars.GetSystemVar(t.collation) + c.Assert(ok, IsTrue) + c.Assert(sVar, Equals, t.expectCollation) + } + + tk = testkit.NewTestKitWithInit(c, s.store) + ctx = tk.Se.(sessionctx.Context) + sessionVars = ctx.GetSessionVars() + + for _, t := range cases { + tk.MustExec(fmt.Sprintf("set %s = %s;", t.collation, t.expectCollation)) + sVar, ok := sessionVars.GetSystemVar(t.charset) + c.Assert(ok, IsTrue) + c.Assert(sVar, Equals, t.expectCharset) + sVar, ok = sessionVars.GetSystemVar(t.collation) + c.Assert(ok, IsTrue) + c.Assert(sVar, Equals, t.expectCollation) + } +} + func (s *testSuite5) TestValidateSetVar(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -648,10 +782,10 @@ func (s *testSuite5) TestValidateSetVar(c *C) { result.Check(testkit.Rows("7")) _, err = tk.Exec("set @@error_count = 0") - c.Assert(terror.ErrorEqual(err, variable.ErrReadOnly), IsTrue, Commentf("err %v", err)) + c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) _, err = tk.Exec("set @@warning_count = 0") - c.Assert(terror.ErrorEqual(err, variable.ErrReadOnly), IsTrue, Commentf("err %v", err)) + c.Assert(terror.ErrorEqual(err, variable.ErrIncorrectScope), IsTrue, Commentf("err %v", err)) tk.MustExec("set time_zone='SySTeM'") result = tk.MustQuery("select @@time_zone;") @@ -968,6 +1102,7 @@ func (s *testSuite5) TestSetConcurrency(c *C) { tk.MustQuery("select @@tidb_hashagg_partial_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.ConcurrencyUnset))) tk.MustQuery("select @@tidb_hashagg_final_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.ConcurrencyUnset))) tk.MustQuery("select @@tidb_window_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.ConcurrencyUnset))) + tk.MustQuery("select @@tidb_streamagg_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.DefTiDBStreamAggConcurrency))) tk.MustQuery("select @@tidb_projection_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.ConcurrencyUnset))) tk.MustQuery("select @@tidb_distsql_scan_concurrency;").Check(testkit.Rows(strconv.Itoa(variable.DefDistSQLScanConcurrency))) @@ -981,6 +1116,7 @@ func (s *testSuite5) TestSetConcurrency(c *C) { c.Assert(vars.HashAggPartialConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.HashAggFinalConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.WindowConcurrency(), Equals, variable.DefExecutorConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, variable.DefTiDBStreamAggConcurrency) c.Assert(vars.ProjectionConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.DistSQLScanConcurrency(), Equals, variable.DefDistSQLScanConcurrency) @@ -1016,6 +1152,9 @@ func (s *testSuite5) TestSetConcurrency(c *C) { checkSet(variable.TiDBWindowConcurrency) c.Assert(vars.WindowConcurrency(), Equals, 1) + checkSet(variable.TiDBStreamAggConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, 1) + tk.MustExec(fmt.Sprintf("set @@%s=1;", variable.TiDBDistSQLScanConcurrency)) tk.MustQuery(fmt.Sprintf("select @@%s;", variable.TiDBDistSQLScanConcurrency)).Check(testkit.Rows("1")) c.Assert(vars.DistSQLScanConcurrency(), Equals, 1) @@ -1032,6 +1171,7 @@ func (s *testSuite5) TestSetConcurrency(c *C) { tk.MustExec("set @@tidb_hashagg_partial_concurrency=-1;") tk.MustExec("set @@tidb_hashagg_final_concurrency=-1;") tk.MustExec("set @@tidb_window_concurrency=-1;") + tk.MustExec("set @@tidb_streamagg_concurrency=-1;") tk.MustExec("set @@tidb_projection_concurrency=-1;") c.Assert(vars.IndexLookupConcurrency(), Equals, variable.DefExecutorConcurrency) @@ -1040,6 +1180,7 @@ func (s *testSuite5) TestSetConcurrency(c *C) { c.Assert(vars.HashAggPartialConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.HashAggFinalConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.WindowConcurrency(), Equals, variable.DefExecutorConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, variable.DefExecutorConcurrency) c.Assert(vars.ProjectionConcurrency(), Equals, variable.DefExecutorConcurrency) _, err := tk.Exec("set @@tidb_executor_concurrency=-1;") diff --git a/executor/show.go b/executor/show.go index d06a135418970..71e0afeefa092 100644 --- a/executor/show.go +++ b/executor/show.go @@ -50,7 +50,7 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" @@ -177,12 +177,16 @@ func (e *ShowExec) fetchAll(ctx context.Context) error { return e.fetchShowProcessList() case ast.ShowEvents: // empty result + case ast.ShowStatsExtended: + return e.fetchShowStatsExtended() case ast.ShowStatsMeta: return e.fetchShowStatsMeta() case ast.ShowStatsHistograms: return e.fetchShowStatsHistogram() case ast.ShowStatsBuckets: return e.fetchShowStatsBuckets() + case ast.ShowStatsTopN: + return e.fetchShowStatsTopN() case ast.ShowStatsHealthy: e.fetchShowStatsHealthy() return nil @@ -286,15 +290,18 @@ func (e *ShowExec) fetchShowBind() error { } func (e *ShowExec) fetchShowEngines() error { - sql := `SELECT * FROM information_schema.engines` - rows, _, err := e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT * FROM information_schema.engines`) if err != nil { return errors.Trace(err) } - for _, row := range rows { - e.result.AppendRow(row) + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) + if err != nil { + return errors.Trace(err) } + + e.result.AppendRows(rows) return nil } @@ -414,16 +421,32 @@ func (e *ShowExec) fetchShowTableStatus() error { return ErrBadDB.GenWithStackByArgs(e.DBName) } - sql := fmt.Sprintf(`SELECT - table_name, engine, version, row_format, table_rows, - avg_row_length, data_length, max_data_length, index_length, - data_free, auto_increment, create_time, update_time, check_time, - table_collation, IFNULL(checksum,''), create_options, table_comment - FROM information_schema.tables - WHERE table_schema='%s' ORDER BY table_name`, e.DBName) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) - rows, _, err := e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithSnapshot(sql) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT + table_name, engine, version, row_format, table_rows, + avg_row_length, data_length, max_data_length, index_length, + data_free, auto_increment, create_time, update_time, check_time, + table_collation, IFNULL(checksum,''), create_options, table_comment + FROM information_schema.tables + WHERE table_schema=%? ORDER BY table_name`, e.DBName.L) + if err != nil { + return errors.Trace(err) + } + + var snapshot uint64 + txn, err := e.ctx.Txn(false) + if err != nil { + return errors.Trace(err) + } + if txn.Valid() { + snapshot = txn.StartTS() + } + if e.ctx.GetSessionVars().SnapshotTS != 0 { + snapshot = e.ctx.GetSessionVars().SnapshotTS + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt, sqlexec.ExecOptionWithSnapshot(snapshot)) if err != nil { return errors.Trace(err) } @@ -459,25 +482,8 @@ func (e *ShowExec) fetchShowColumns(ctx context.Context) error { } else { cols = tb.VisibleCols() } - if tb.Meta().IsView() { - // Because view's undertable's column could change or recreate, so view's column type may change overtime. - // To avoid this situation we need to generate a logical plan and extract current column types from Schema. - planBuilder := plannercore.NewPlanBuilder(e.ctx, e.is, &hint.BlockHintProcessor{}) - viewLogicalPlan, err := planBuilder.BuildDataSourceFromView(ctx, e.DBName, tb.Meta()) - if err != nil { - return err - } - viewSchema := viewLogicalPlan.Schema() - viewOutputNames := viewLogicalPlan.OutputNames() - for _, col := range cols { - idx := expression.FindFieldNameIdxByColName(viewOutputNames, col.Name.L) - if idx >= 0 { - col.FieldType = *viewSchema.Columns[idx].GetType() - } - if col.Tp == mysql.TypeVarString { - col.Tp = mysql.TypeVarchar - } - } + if err := tryFillViewColumnType(ctx, e.ctx, e.is, e.DBName, tb.Meta()); err != nil { + return err } for _, col := range cols { if e.Column != nil && e.Column.Name.L != col.Name.L { @@ -587,8 +593,9 @@ func (e *ShowExec) fetchShowIndex() error { subPart = col.Length } + tblCol := tb.Meta().Columns[col.Offset] nullVal := "YES" - if idx.Meta().Name.O == mysql.PrimaryKeyName { + if mysql.HasNotNullFlag(tblCol.Flag) { nullVal = "" } @@ -599,7 +606,6 @@ func (e *ShowExec) fetchShowIndex() error { colName := col.Name.O expression := "NULL" - tblCol := tb.Meta().Columns[col.Offset] if tblCol.Hidden { colName = "NULL" expression = fmt.Sprintf("(%s)", tblCol.GeneratedExprString) @@ -650,45 +656,41 @@ func (e *ShowExec) fetchShowMasterStatus() error { func (e *ShowExec) fetchShowVariables() (err error) { var ( - value string - ok bool - sessionVars = e.ctx.GetSessionVars() - unreachedVars = make([]string, 0, len(variable.GetSysVars())) + value string + sessionVars = e.ctx.GetSessionVars() ) - for _, v := range variable.GetSysVars() { - if !e.GlobalScope { - // For a session scope variable, - // 1. try to fetch value from SessionVars.Systems; - // 2. if this variable is session-only, fetch value from SysVars - // otherwise, fetch the value from table `mysql.Global_Variables`. - value, ok, err = variable.GetSessionOnlySysVars(sessionVars, v.Name) - } else { - // If the scope of a system variable is ScopeNone, - // it's a read-only variable, so we return the default value of it. - // Otherwise, we have to fetch the values from table `mysql.Global_Variables` for global variable names. - value, ok, err = variable.GetScopeNoneSystemVar(v.Name) - } - if err != nil { - return errors.Trace(err) + if e.GlobalScope { + // Collect global scope variables, + // 1. Exclude the variables of ScopeSession in variable.SysVars; + // 2. If the variable is ScopeNone, it's a read-only variable, return the default value of it, + // otherwise, fetch the value from table `mysql.Global_Variables`. + for _, v := range variable.GetSysVars() { + if v.Scope != variable.ScopeSession { + if variable.FilterImplicitFeatureSwitch(v) { + continue + } + value, err = variable.GetGlobalSystemVar(sessionVars, v.Name) + if err != nil { + return errors.Trace(err) + } + e.appendRow([]interface{}{v.Name, value}) + } } - if !ok { - unreachedVars = append(unreachedVars, v.Name) + return nil + } + + // Collect session scope variables, + // If it is a session only variable, use the default value defined in code, + // otherwise, fetch the value from table `mysql.Global_Variables`. + for _, v := range variable.GetSysVars() { + if variable.FilterImplicitFeatureSwitch(v) { continue } - e.appendRow([]interface{}{v.Name, value}) - } - if len(unreachedVars) != 0 { - systemVars, err := sessionVars.GlobalVarsAccessor.GetAllSysVars() + value, err = variable.GetSessionSystemVar(sessionVars, v.Name) if err != nil { return errors.Trace(err) } - for _, varName := range unreachedVars { - varValue, ok := systemVars[varName] - if !ok { - varValue = variable.GetSysVar(varName).Value - } - e.appendRow([]interface{}{varName, varValue}) - } + e.appendRow([]interface{}{v.Name, value}) } return nil } @@ -818,7 +820,7 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T if col.Tp == mysql.TypeBit { defaultValBinaryLiteral := types.BinaryLiteral(defaultValStr) fmt.Fprintf(buf, " DEFAULT %s", defaultValBinaryLiteral.ToBitLiteralString(true)) - } else if types.IsTypeNumeric(col.Tp) || col.DefaultIsExpr { + } else if col.DefaultIsExpr { fmt.Fprintf(buf, " DEFAULT %s", format.OutputFormat(defaultValStr)) } else { fmt.Fprintf(buf, " DEFAULT '%s'", format.OutputFormat(defaultValStr)) @@ -848,6 +850,7 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T // If PKIsHanle, pk info is not in tb.Indices(). We should handle it here. buf.WriteString(",\n") fmt.Fprintf(buf, " PRIMARY KEY (%s)", stringutil.Escape(pkCol.Name.O, sqlMode)) + buf.WriteString(fmt.Sprintf(" /*T![clustered_index] CLUSTERED */")) } publicIndices := make([]*model.IndexInfo, 0, len(tableInfo.Indices)) @@ -886,6 +889,13 @@ func ConstructResultOfShowCreateTable(ctx sessionctx.Context, tableInfo *model.T if idxInfo.Invisible { fmt.Fprintf(buf, ` /*!80000 INVISIBLE */`) } + if idxInfo.Primary { + if tableInfo.PKIsHandle || tableInfo.IsCommonHandle { + buf.WriteString(fmt.Sprintf(" /*T![clustered_index] CLUSTERED */")) + } else { + buf.WriteString(fmt.Sprintf(" /*T![clustered_index] NONCLUSTERED */")) + } + } if i != len(publicIndices)-1 { buf.WriteString(",\n") } @@ -1123,19 +1133,57 @@ func appendPartitionInfo(partitionInfo *model.PartitionInfo, buf *bytes.Buffer) } } buf.WriteString(") (\n") + } else if partitionInfo.Type == model.PartitionTypeList { + if len(partitionInfo.Columns) == 0 { + fmt.Fprintf(buf, "\nPARTITION BY %s (%s) (\n", partitionInfo.Type.String(), partitionInfo.Expr) + } else { + colsName := "" + for _, col := range partitionInfo.Columns { + if len(colsName) > 0 { + colsName += "," + } + colsName += col.L + } + fmt.Fprintf(buf, "\nPARTITION BY LIST COLUMNS(%s) (\n", colsName) + } } else { fmt.Fprintf(buf, "\nPARTITION BY %s ( %s ) (\n", partitionInfo.Type.String(), partitionInfo.Expr) } - for i, def := range partitionInfo.Definitions { - lessThans := strings.Join(def.LessThan, ",") - fmt.Fprintf(buf, " PARTITION `%s` VALUES LESS THAN (%s)", def.Name, lessThans) - if i < len(partitionInfo.Definitions)-1 { - buf.WriteString(",\n") - } else { - buf.WriteString("\n") + if partitionInfo.Type == model.PartitionTypeRange { + for i, def := range partitionInfo.Definitions { + lessThans := strings.Join(def.LessThan, ",") + fmt.Fprintf(buf, " PARTITION `%s` VALUES LESS THAN (%s)", def.Name, lessThans) + if i < len(partitionInfo.Definitions)-1 { + buf.WriteString(",\n") + } else { + buf.WriteString("\n") + } + } + buf.WriteString(")") + } else if partitionInfo.Type == model.PartitionTypeList { + for i, def := range partitionInfo.Definitions { + values := bytes.NewBuffer(nil) + for j, inValues := range def.InValues { + if j > 0 { + values.WriteString(",") + } + if len(inValues) > 1 { + values.WriteString("(") + values.WriteString(strings.Join(inValues, ",")) + values.WriteString(")") + } else { + values.WriteString(strings.Join(inValues, ",")) + } + } + fmt.Fprintf(buf, " PARTITION `%s` VALUES IN (%s)", def.Name, values.String()) + if i < len(partitionInfo.Definitions)-1 { + buf.WriteString(",\n") + } else { + buf.WriteString("\n") + } } + buf.WriteString(")") } - buf.WriteString(")") } // ConstructResultOfShowCreateDatabase constructs the result for show create database. @@ -1237,22 +1285,32 @@ func (e *ShowExec) fetchShowCreateUser() error { } } - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s';`, - mysql.SystemDB, mysql.UserTable, userName, hostName) - rows, _, err := e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT * FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.UserTable, userName, hostName) if err != nil { return errors.Trace(err) } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) + if err != nil { + return errors.Trace(err) + } + if len(rows) == 0 { + // FIXME: the error returned is not escaped safely return ErrCannotUser.GenWithStackByArgs("SHOW CREATE USER", fmt.Sprintf("'%s'@'%s'", e.User.Username, e.User.Hostname)) } - sql = fmt.Sprintf(`SELECT PRIV FROM %s.%s WHERE User='%s' AND Host='%s'`, - mysql.SystemDB, mysql.GlobalPrivTable, userName, hostName) - rows, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + + stmt, err = exec.ParseWithParams(context.TODO(), `SELECT Priv FROM %n.%n WHERE User=%? AND Host=%?`, mysql.SystemDB, mysql.GlobalPrivTable, userName, hostName) if err != nil { return errors.Trace(err) } + rows, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) + if err != nil { + return errors.Trace(err) + } + require := "NONE" if len(rows) == 1 { privData := rows[0].GetString(0) @@ -1263,6 +1321,7 @@ func (e *ShowExec) fetchShowCreateUser() error { } require = privValue.RequireStr() } + // FIXME: the returned string is not escaped safely showStr := fmt.Sprintf("CREATE USER '%s'@'%s' IDENTIFIED WITH 'mysql_native_password' AS '%s' REQUIRE %s PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK", e.User.Username, e.User.Hostname, checker.GetEncodedPassword(e.User.Username, e.User.Hostname), require) e.appendRow([]interface{}{showStr}) @@ -1496,7 +1555,7 @@ func (e *ShowExec) appendRow(row []interface{}) { func (e *ShowExec) fetchShowTableRegions() error { store := e.ctx.GetStore() - tikvStore, ok := store.(tikv.Storage) + tikvStore, ok := store.(helper.Storage) if !ok { return nil } @@ -1550,7 +1609,7 @@ func (e *ShowExec) fetchShowTableRegions() error { return nil } -func getTableRegions(tb table.Table, physicalIDs []int64, tikvStore tikv.Storage, splitStore kv.SplittableStore) ([]regionMeta, error) { +func getTableRegions(tb table.Table, physicalIDs []int64, tikvStore helper.Storage, splitStore kv.SplittableStore) ([]regionMeta, error) { regions := make([]regionMeta, 0, len(physicalIDs)) uniqueRegionMap := make(map[uint64]struct{}) for _, id := range physicalIDs { @@ -1563,7 +1622,7 @@ func getTableRegions(tb table.Table, physicalIDs []int64, tikvStore tikv.Storage return regions, nil } -func getTableIndexRegions(indexInfo *model.IndexInfo, physicalIDs []int64, tikvStore tikv.Storage, splitStore kv.SplittableStore) ([]regionMeta, error) { +func getTableIndexRegions(indexInfo *model.IndexInfo, physicalIDs []int64, tikvStore helper.Storage, splitStore kv.SplittableStore) ([]regionMeta, error) { regions := make([]regionMeta, 0, len(physicalIDs)) uniqueRegionMap := make(map[uint64]struct{}) for _, id := range physicalIDs { @@ -1611,3 +1670,29 @@ func (e *ShowExec) fetchShowBuiltins() error { } return nil } + +// tryFillViewColumnType fill the columns type info of a view. +// Because view's underlying table's column could change or recreate, so view's column type may change over time. +// To avoid this situation we need to generate a logical plan and extract current column types from Schema. +func tryFillViewColumnType(ctx context.Context, sctx sessionctx.Context, is infoschema.InfoSchema, dbName model.CIStr, tbl *model.TableInfo) error { + if tbl.IsView() { + // Retrieve view columns info. + planBuilder, _ := plannercore.NewPlanBuilder(sctx, is, &hint.BlockHintProcessor{}) + if viewLogicalPlan, err := planBuilder.BuildDataSourceFromView(ctx, dbName, tbl); err == nil { + viewSchema := viewLogicalPlan.Schema() + viewOutputNames := viewLogicalPlan.OutputNames() + for _, col := range tbl.Columns { + idx := expression.FindFieldNameIdxByColName(viewOutputNames, col.Name.L) + if idx >= 0 { + col.FieldType = *viewSchema.Columns[idx].GetType() + } + if col.Tp == mysql.TypeVarString { + col.Tp = mysql.TypeVarchar + } + } + } else { + return err + } + } + return nil +} diff --git a/executor/show_stats.go b/executor/show_stats.go index 79b1c97a7dfb7..2fde248c999e6 100644 --- a/executor/show_stats.go +++ b/executor/show_stats.go @@ -14,9 +14,14 @@ package executor import ( + "fmt" + "sort" + "strings" "time" "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/statistics" @@ -24,6 +29,73 @@ import ( "github.com/pingcap/tidb/types" ) +func (e *ShowExec) fetchShowStatsExtended() error { + do := domain.GetDomain(e.ctx) + h := do.StatsHandle() + dbs := do.InfoSchema().AllSchemas() + for _, db := range dbs { + for _, tblInfo := range db.Tables { + pi := tblInfo.GetPartitionInfo() + // Extended statistics for partitioned table is not supported now. + if pi != nil { + continue + } + e.appendTableForStatsExtended(db.Name.L, tblInfo, h.GetTableStats(tblInfo)) + } + } + return nil +} + +func (e *ShowExec) appendTableForStatsExtended(dbName string, tbl *model.TableInfo, statsTbl *statistics.Table) { + if statsTbl.Pseudo || statsTbl.ExtendedStats == nil || len(statsTbl.ExtendedStats.Stats) == 0 { + return + } + colID2Name := make(map[int64]string, len(tbl.Columns)) + for _, col := range tbl.Columns { + colID2Name[col.ID] = col.Name.L + } + var sb strings.Builder + for statsName, item := range statsTbl.ExtendedStats.Stats { + sb.WriteString("[") + for i, colID := range item.ColIDs { + name, ok := colID2Name[colID] + if ok { + sb.WriteString(name) + } else { + sb.WriteString("?") + } + if i != len(item.ColIDs)-1 { + sb.WriteString(",") + } + } + sb.WriteString("]") + colNames := sb.String() + sb.Reset() + var statsType, statsVal string + switch item.Tp { + case ast.StatsTypeCorrelation: + statsType = "correlation" + statsVal = fmt.Sprintf("%f", item.ScalarVals) + case ast.StatsTypeDependency: + statsType = "dependency" + statsVal = item.StringVals + case ast.StatsTypeCardinality: + statsType = "cardinality" + statsVal = item.StringVals + } + e.appendRow([]interface{}{ + dbName, + tbl.Name.L, + statsName, + colNames, + statsType, + statsVal, + // Same LastUpdateVersion for records of the same table, mainly for debug purpose on product env. + statsTbl.ExtendedStats.LastUpdateVersion, + }) + } +} + func (e *ShowExec) fetchShowStatsMeta() error { do := domain.GetDomain(e.ctx) h := do.StatsHandle() @@ -31,8 +103,17 @@ func (e *ShowExec) fetchShowStatsMeta() error { for _, db := range dbs { for _, tbl := range db.Tables { pi := tbl.GetPartitionInfo() - if pi == nil { - e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { + partitionName := "" + if pi != nil { + partitionName = "global" + } + e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, partitionName, h.GetTableStats(tbl)) + if pi != nil { + for _, def := range pi.Definitions { + e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) + } + } } else { for _, def := range pi.Definitions { e.appendTableForStatsMeta(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) @@ -64,8 +145,17 @@ func (e *ShowExec) fetchShowStatsHistogram() error { for _, db := range dbs { for _, tbl := range db.Tables { pi := tbl.GetPartitionInfo() - if pi == nil { - e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { + partitionName := "" + if pi != nil { + partitionName = "global" + } + e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, partitionName, h.GetTableStats(tbl)) + if pi != nil { + for _, def := range pi.Definitions { + e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) + } + } } else { for _, def := range pi.Definitions { e.appendTableForStatsHistograms(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) @@ -80,14 +170,14 @@ func (e *ShowExec) appendTableForStatsHistograms(dbName, tblName, partitionName if statsTbl.Pseudo { return } - for _, col := range statsTbl.Columns { + for _, col := range stableColsStats(statsTbl.Columns) { // Pass a nil StatementContext to avoid column stats being marked as needed. if col.IsInvalid(nil, false) { continue } e.histogramToRow(dbName, tblName, partitionName, col.Info.Name.O, 0, col.Histogram, col.AvgColSize(statsTbl.Count, false)) } - for _, idx := range statsTbl.Indices { + for _, idx := range stableIdxsStats(statsTbl.Indices) { e.histogramToRow(dbName, tblName, partitionName, idx.Info.Name.O, 1, idx.Histogram, 0) } } @@ -119,10 +209,21 @@ func (e *ShowExec) fetchShowStatsBuckets() error { for _, db := range dbs { for _, tbl := range db.Tables { pi := tbl.GetPartitionInfo() - if pi == nil { - if err := e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)); err != nil { + if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { + partitionName := "" + if pi != nil { + partitionName = "global" + } + if err := e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, partitionName, h.GetTableStats(tbl)); err != nil { return err } + if pi != nil { + for _, def := range pi.Definitions { + if err := e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)); err != nil { + return err + } + } + } } else { for _, def := range pi.Definitions { if err := e.appendTableForStatsBuckets(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)); err != nil { @@ -140,14 +241,14 @@ func (e *ShowExec) appendTableForStatsBuckets(dbName, tblName, partitionName str return nil } colNameToType := make(map[string]byte, len(statsTbl.Columns)) - for _, col := range statsTbl.Columns { + for _, col := range stableColsStats(statsTbl.Columns) { err := e.bucketsToRows(dbName, tblName, partitionName, col.Info.Name.O, 0, col.Histogram, nil) if err != nil { return errors.Trace(err) } colNameToType[col.Info.Name.O] = col.Histogram.Tp.Tp } - for _, idx := range statsTbl.Indices { + for _, idx := range stableIdxsStats(statsTbl.Indices) { idxColumnTypes := make([]byte, 0, len(idx.Info.Columns)) for i := 0; i < len(idx.Info.Columns); i++ { idxColumnTypes = append(idxColumnTypes, colNameToType[idx.Info.Columns[i].Name.O]) @@ -160,6 +261,105 @@ func (e *ShowExec) appendTableForStatsBuckets(dbName, tblName, partitionName str return nil } +func (e *ShowExec) fetchShowStatsTopN() error { + do := domain.GetDomain(e.ctx) + h := do.StatsHandle() + dbs := do.InfoSchema().AllSchemas() + for _, db := range dbs { + for _, tbl := range db.Tables { + pi := tbl.GetPartitionInfo() + if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { + partitionName := "" + if pi != nil { + partitionName = "global" + } + if err := e.appendTableForStatsTopN(db.Name.O, tbl.Name.O, partitionName, h.GetTableStats(tbl)); err != nil { + return err + } + if pi != nil { + for _, def := range pi.Definitions { + if err := e.appendTableForStatsTopN(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)); err != nil { + return err + } + } + } + } else { + for _, def := range pi.Definitions { + if err := e.appendTableForStatsTopN(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)); err != nil { + return err + } + } + } + } + } + return nil +} + +func (e *ShowExec) appendTableForStatsTopN(dbName, tblName, partitionName string, statsTbl *statistics.Table) error { + if statsTbl.Pseudo { + return nil + } + colNameToType := make(map[string]byte, len(statsTbl.Columns)) + for _, col := range stableColsStats(statsTbl.Columns) { + err := e.topNToRows(dbName, tblName, partitionName, col.Info.Name.O, 1, 0, col.TopN, []byte{col.Histogram.Tp.Tp}) + if err != nil { + return errors.Trace(err) + } + colNameToType[col.Info.Name.O] = col.Histogram.Tp.Tp + } + for _, idx := range stableIdxsStats(statsTbl.Indices) { + idxColumnTypes := make([]byte, 0, len(idx.Info.Columns)) + for i := 0; i < len(idx.Info.Columns); i++ { + idxColumnTypes = append(idxColumnTypes, colNameToType[idx.Info.Columns[i].Name.O]) + } + err := e.topNToRows(dbName, tblName, partitionName, idx.Info.Name.O, len(idx.Info.Columns), 1, idx.TopN, idxColumnTypes) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + +func stableColsStats(colStats map[int64]*statistics.Column) (cols []*statistics.Column) { + for _, col := range colStats { + cols = append(cols, col) + } + sort.Slice(cols, func(i, j int) bool { return cols[i].ID < cols[j].ID }) + return +} + +func stableIdxsStats(idxStats map[int64]*statistics.Index) (idxs []*statistics.Index) { + for _, idx := range idxStats { + idxs = append(idxs, idx) + } + sort.Slice(idxs, func(i, j int) bool { return idxs[i].ID < idxs[j].ID }) + return +} + +func (e *ShowExec) topNToRows(dbName, tblName, partitionName, colName string, numOfCols int, isIndex int, topN *statistics.TopN, columnTypes []byte) error { + if topN == nil { + return nil + } + var tmpDatum types.Datum + for i := 0; i < len(topN.TopN); i++ { + tmpDatum.SetBytes(topN.TopN[i].Encoded) + valStr, err := statistics.ValueToString(e.ctx.GetSessionVars(), &tmpDatum, numOfCols, columnTypes) + if err != nil { + return err + } + e.appendRow([]interface{}{ + dbName, + tblName, + partitionName, + colName, + isIndex, + valStr, + topN.TopN[i].Count, + }) + } + return nil +} + // bucketsToRows converts histogram buckets to rows. If the histogram is built from index, then numOfCols equals to number // of index columns, else numOfCols is 0. func (e *ShowExec) bucketsToRows(dbName, tblName, partitionName, colName string, numOfCols int, hist statistics.Histogram, idxColumnTypes []byte) error { @@ -187,6 +387,7 @@ func (e *ShowExec) bucketsToRows(dbName, tblName, partitionName, colName string, hist.Buckets[i].Repeat, lowerBoundStr, upperBoundStr, + hist.Buckets[i].NDV, }) } return nil @@ -199,8 +400,17 @@ func (e *ShowExec) fetchShowStatsHealthy() { for _, db := range dbs { for _, tbl := range db.Tables { pi := tbl.GetPartitionInfo() - if pi == nil { - e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, "", h.GetTableStats(tbl)) + if pi == nil || e.ctx.GetSessionVars().UseDynamicPartitionPrune() { + partitionName := "" + if pi != nil { + partitionName = "global" + } + e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, partitionName, h.GetTableStats(tbl)) + if pi != nil { + for _, def := range pi.Definitions { + e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) + } + } } else { for _, def := range pi.Definitions { e.appendTableForStatsHealthy(db.Name.O, tbl.Name.O, def.Name.O, h.GetPartitionStats(tbl, def.ID)) diff --git a/executor/show_stats_test.go b/executor/show_stats_test.go index 270c35f5abf2d..d673499193651 100644 --- a/executor/show_stats_test.go +++ b/executor/show_stats_test.go @@ -80,36 +80,36 @@ func (s *testShowStatsSuite) TestShowStatsBuckets(c *C) { tk.MustExec("insert into t values (1,1)") tk.MustExec("analyze table t") result := tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t a 0 0 1 1 1 1", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (1, 1) (1, 1)")) + result.Check(testkit.Rows("test t a 0 0 1 1 1 1 0", "test t b 0 0 1 1 1 1 0", "test t idx 1 0 1 1 (1, 1) (1, 1) 0")) result = tk.MustQuery("show stats_buckets where column_name = 'idx'") - result.Check(testkit.Rows("test t idx 1 0 1 1 (1, 1) (1, 1)")) + result.Check(testkit.Rows("test t idx 1 0 1 1 (1, 1) (1, 1) 0")) tk.MustExec("drop table t") tk.MustExec("create table t (`a` datetime, `b` int, key `idx`(`a`, `b`))") tk.MustExec("insert into t values (\"2020-01-01\", 1)") tk.MustExec("analyze table t") result = tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 00:00:00 2020-01-01 00:00:00", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1)")) + result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 00:00:00 2020-01-01 00:00:00 0", "test t b 0 0 1 1 1 1 0", "test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) result = tk.MustQuery("show stats_buckets where column_name = 'idx'") - result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1)")) + result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) tk.MustExec("drop table t") tk.MustExec("create table t (`a` date, `b` int, key `idx`(`a`, `b`))") tk.MustExec("insert into t values (\"2020-01-01\", 1)") tk.MustExec("analyze table t") result = tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 2020-01-01", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (2020-01-01, 1) (2020-01-01, 1)")) + result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 2020-01-01 0", "test t b 0 0 1 1 1 1 0", "test t idx 1 0 1 1 (2020-01-01, 1) (2020-01-01, 1) 0")) result = tk.MustQuery("show stats_buckets where column_name = 'idx'") - result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01, 1) (2020-01-01, 1)")) + result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01, 1) (2020-01-01, 1) 0")) tk.MustExec("drop table t") tk.MustExec("create table t (`a` timestamp, `b` int, key `idx`(`a`, `b`))") tk.MustExec("insert into t values (\"2020-01-01\", 1)") tk.MustExec("analyze table t") result = tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 00:00:00 2020-01-01 00:00:00", "test t b 0 0 1 1 1 1", "test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1)")) + result.Check(testkit.Rows("test t a 0 0 1 1 2020-01-01 00:00:00 2020-01-01 00:00:00 0", "test t b 0 0 1 1 1 1 0", "test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) result = tk.MustQuery("show stats_buckets where column_name = 'idx'") - result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1)")) + result.Check(testkit.Rows("test t idx 1 0 1 1 (2020-01-01 00:00:00, 1) (2020-01-01 00:00:00, 1) 0")) } func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { @@ -124,14 +124,14 @@ func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { tk.MustExec("insert into t values(1)") tk.MustExec("analyze table t") tk.MustQuery("show stats_buckets").Sort().Check(testkit.Rows( - "test t a 0 0 1 1 1 1", - "test t idx 1 0 1 1 1 1", + "test t a 0 0 1 1 1 1 0", + "test t idx 1 0 1 1 1 1 0", )) tk.MustExec("drop table t") tk.MustExec("create table t (a int, b int, index idx(a, b))") tk.MustExec("insert into t values(NULL, NULL)") tk.MustExec("analyze table t") - tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t idx 1 0 1 1 (NULL, NULL) (NULL, NULL)")) + tk.MustQuery("show stats_buckets").Check(testkit.Rows("test t idx 1 0 1 1 (NULL, NULL) (NULL, NULL) 0")) tk.MustExec("drop table t") tk.MustExec("create table t(a int, b int, c int, index idx_b(b), index idx_c_a(c, a))") @@ -175,7 +175,7 @@ func (s *testShowStatsSuite) TestShowStatsHasNullValue(c *C) { func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { tk := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(tk, variable.StaticOnly, func() { + testkit.WithPruneMode(tk, variable.Static, func() { tk.MustExec("set @@session.tidb_enable_table_partition=1") tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -201,7 +201,7 @@ func (s *testShowStatsSuite) TestShowPartitionStats(c *C) { c.Assert(result.Rows()[2][3], Equals, "idx") result = tk.MustQuery("show stats_buckets").Sort() - result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1", "test t p0 b 0 0 1 1 1 1", "test t p0 idx 1 0 1 1 1 1")) + result.Check(testkit.Rows("test t p0 a 0 0 1 1 1 1 0", "test t p0 b 0 0 1 1 1 1 0", "test t p0 idx 1 0 1 1 1 1 0")) result = tk.MustQuery("show stats_healthy") result.Check(testkit.Rows("test t p0 100")) @@ -261,3 +261,53 @@ func (s *testShowStatsSuite) TestShowStatusSnapshot(c *C) { result := tk.MustQuery("show table status;") c.Check(result.Rows()[0][0], Matches, "t") } + +func (s *testShowStatsSuite) TestShowStatsExtended(c *C) { + tk := testkit.NewTestKit(c, s.store) + s.domain.StatsHandle().Clear() + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("insert into t values(1,1,3),(2,2,2),(3,3,1)") + + tk.MustExec("set session tidb_enable_extended_stats = on") + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") + tk.MustExec("alter table t add stats_extended s2 correlation(a,c)") + tk.MustQuery("select name, status from mysql.stats_extended where name like 's%'").Sort().Check(testkit.Rows( + "s1 0", + "s2 0", + )) + result := tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") + c.Assert(len(result.Rows()), Equals, 0) + + tk.MustExec("analyze table t") + tk.MustQuery("select name, status from mysql.stats_extended where name like 's%'").Sort().Check(testkit.Rows( + "s1 1", + "s2 1", + )) + result = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][0], Equals, "test") + c.Assert(result.Rows()[0][1], Equals, "t") + c.Assert(result.Rows()[0][2], Equals, "s1") + c.Assert(result.Rows()[0][3], Equals, "[a,b]") + c.Assert(result.Rows()[0][4], Equals, "correlation") + c.Assert(result.Rows()[0][5], Equals, "1.000000") + c.Assert(result.Rows()[1][0], Equals, "test") + c.Assert(result.Rows()[1][1], Equals, "t") + c.Assert(result.Rows()[1][2], Equals, "s2") + c.Assert(result.Rows()[1][3], Equals, "[a,c]") + c.Assert(result.Rows()[1][4], Equals, "correlation") + c.Assert(result.Rows()[1][5], Equals, "-1.000000") + c.Assert(result.Rows()[1][6], Equals, result.Rows()[0][6]) + + tk.MustExec("alter table t drop stats_extended s1") + tk.MustExec("alter table t drop stats_extended s2") + tk.MustQuery("select name, status from mysql.stats_extended where name like 's%'").Sort().Check(testkit.Rows( + "s1 2", + "s2 2", + )) + s.domain.StatsHandle().Update(s.domain.InfoSchema()) + result = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") + c.Assert(len(result.Rows()), Equals, 0) +} diff --git a/executor/show_test.go b/executor/show_test.go index 4f239f6b0aaec..b6d0c2937872a 100644 --- a/executor/show_test.go +++ b/executor/show_test.go @@ -16,6 +16,7 @@ package executor_test import ( "context" "fmt" + "strings" . "github.com/pingcap/check" "github.com/pingcap/errors" @@ -30,6 +31,7 @@ import ( "github.com/pingcap/tidb/privilege/privileges" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" @@ -110,7 +112,8 @@ func (s *testSuite5) TestShowWarnings(c *C) { // Test Warning level 'Error' testSQL = `create table show_warnings (a int)` - tk.Exec(testSQL) + _, _ = tk.Exec(testSQL) + // FIXME: Table 'test.show_warnings' already exists c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Error|1050|Table 'test.show_warnings' already exists")) tk.MustQuery("select @@error_count").Check(testutil.RowsWithSep("|", "1")) @@ -119,7 +122,8 @@ func (s *testSuite5) TestShowWarnings(c *C) { testSQL = `create table show_warnings_2 (a int)` tk.MustExec(testSQL) testSQL = `create table if not exists show_warnings_2 like show_warnings` - tk.Exec(testSQL) + _, err := tk.Exec(testSQL) + c.Assert(err, IsNil) c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Note|1050|Table 'test.show_warnings_2' already exists")) tk.MustQuery("select @@warning_count").Check(testutil.RowsWithSep("|", "1")) @@ -132,11 +136,22 @@ func (s *testSuite5) TestShowErrors(c *C) { testSQL := `create table if not exists show_errors (a int)` tk.MustExec(testSQL) testSQL = `create table show_errors (a int)` - tk.Exec(testSQL) + // FIXME: 'test.show_errors' already exists + _, _ = tk.Exec(testSQL) tk.MustQuery("show errors").Check(testutil.RowsWithSep("|", "Error|1050|Table 'test.show_errors' already exists")) } +func (s *testSuite5) TestShowWarningsForExprPushdown(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + testSQL := `create table if not exists show_warnings_expr_pushdown (a int, value date)` + tk.MustExec(testSQL) + tk.MustExec("explain select * from show_warnings_expr_pushdown where date_add(value, interval 1 day) = '2020-01-01'") + c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1105|Scalar function 'date_add'(signature: AddDateDatetimeInt) can not be pushed to tikv")) +} + func (s *testSuite5) TestShowGrantsPrivilege(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("create user show_grants") @@ -262,11 +277,10 @@ func (s *testSuite5) TestShow2(c *C) { tk.MustExec("set global autocommit=0") tk1 := testkit.NewTestKit(c, s.store) - tk1.MustQuery("show global variables where variable_name = 'autocommit'").Check(testkit.Rows("autocommit 0")) + tk1.MustQuery("show global variables where variable_name = 'autocommit'").Check(testkit.Rows("autocommit OFF")) tk.MustExec("set global autocommit = 1") tk2 := testkit.NewTestKit(c, s.store) - // TODO: In MySQL, the result is "autocommit ON". - tk2.MustQuery("show global variables where variable_name = 'autocommit'").Check(testkit.Rows("autocommit 1")) + tk2.MustQuery("show global variables where variable_name = 'autocommit'").Check(testkit.Rows("autocommit ON")) // TODO: Specifying the charset for national char/varchar should not be supported. tk.MustExec("drop table if exists test_full_column") @@ -540,7 +554,7 @@ func (s *testSuite5) TestShowCreateTable(c *C) { tk.MustExec("drop view if exists v") tk.MustExec("create or replace definer=`root`@`127.0.0.1` view v as select JSON_MERGE('{}', '{}') as col;") - tk.MustQuery("show create view v").Check(testutil.RowsWithSep("|", "v|CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` SQL SECURITY DEFINER VIEW `v` (`col`) AS SELECT JSON_MERGE('{}', '{}') AS `col` ")) + tk.MustQuery("show create view v").Check(testutil.RowsWithSep("|", "v|CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`127.0.0.1` SQL SECURITY DEFINER VIEW `v` (`col`) AS SELECT JSON_MERGE(_UTF8MB4'{}', _UTF8MB4'{}') AS `col` ")) tk.MustExec("drop view if exists v") tk.MustExec("drop table if exists t1") @@ -626,6 +640,17 @@ func (s *testSuite5) TestShowCreateTable(c *C) { )) tk.MustExec("drop table t") + // for issue #20446 + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(c int unsigned default 0);") + tk.MustQuery("show create table `t1`").Check(testutil.RowsWithSep("|", + ""+ + "t1 CREATE TABLE `t1` (\n"+ + " `c` int(10) unsigned DEFAULT '0'\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", + )) + tk.MustExec("drop table t1") + tk.MustExec("CREATE TABLE `log` (" + "`LOG_ID` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT," + "`ROUND_ID` bigint(20) UNSIGNED NOT NULL," + @@ -661,7 +686,7 @@ func (s *testSuite5) TestShowCreateTable(c *C) { " `END_TIME` datetime NOT NULL,\n"+ " `USER_TYPE` int(11) DEFAULT NULL,\n"+ " `APP_ID` int(11) DEFAULT NULL,\n"+ - " PRIMARY KEY (`LOG_ID`,`END_TIME`),\n"+ + " PRIMARY KEY (`LOG_ID`,`END_TIME`) /*T![clustered_index] NONCLUSTERED */,\n"+ " KEY `IDX_EndTime` (`END_TIME`),\n"+ " KEY `IDX_RoundId` (`ROUND_ID`),\n"+ " KEY `IDX_UserId_EndTime` (`USER_ID`,`END_TIME`)\n"+ @@ -746,7 +771,7 @@ func (s *testSuite5) TestShowCreateTable(c *C) { tk.MustQuery("show create table default_num").Check(testutil.RowsWithSep("|", ""+ "default_num CREATE TABLE `default_num` (\n"+ - " `a` int(11) DEFAULT 11\n"+ + " `a` int(11) DEFAULT '11'\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) tk.MustExec(`drop table if exists default_varchar`) @@ -777,7 +802,7 @@ func (s *testSuite5) TestShowCreateTable(c *C) { "child CREATE TABLE `child` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ " `parent_id` int(11) NOT NULL,\n"+ - " PRIMARY KEY (`id`),\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ " KEY `par_ind` (`parent_id`),\n"+ " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", @@ -791,12 +816,77 @@ func (s *testSuite5) TestShowCreateTable(c *C) { "child CREATE TABLE `child` (\n"+ " `id` int(11) NOT NULL AUTO_INCREMENT,\n"+ " `parent_id` int(11) NOT NULL,\n"+ - " PRIMARY KEY (`id`),\n"+ + " PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,\n"+ " KEY `par_ind` (`parent_id`),\n"+ " CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE SET NULL ON UPDATE CASCADE\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) + // Test issue #20327 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b char(10) as ('a'));") + result := tk.MustQuery("show create table t;").Rows()[0][1] + c.Assert(result, Matches, `(?s).*GENERATED ALWAYS AS \(_utf8mb4'a'\).*`) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b char(10) as (_utf8'a'));") + result = tk.MustQuery("show create table t;").Rows()[0][1] + c.Assert(result, Matches, `(?s).*GENERATED ALWAYS AS \(_utf8'a'\).*`) + + // Test show list partition table + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", + "t CREATE TABLE `t` (\n"+ + " `id` int(11) DEFAULT NULL,\n"+ + " `name` varchar(10) DEFAULT NULL,\n"+ + " UNIQUE KEY `idx` (`id`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY LIST (`id`) (\n"+ + " PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ + " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ + " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ + " PARTITION `p3` VALUES IN (7,8,15,16,NULL)\n"+ + ")")) + // Test show list column partition table + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", + "t CREATE TABLE `t` (\n"+ + " `id` int(11) DEFAULT NULL,\n"+ + " `name` varchar(10) DEFAULT NULL,\n"+ + " UNIQUE KEY `idx` (`id`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY LIST COLUMNS(id) (\n"+ + " PARTITION `p0` VALUES IN (3,5,6,9,17),\n"+ + " PARTITION `p1` VALUES IN (1,2,10,11,19,20),\n"+ + " PARTITION `p2` VALUES IN (4,12,13,14,18),\n"+ + " PARTITION `p3` VALUES IN (7,8,15,16,NULL)\n"+ + ")")) + tk.MustExec(`DROP TABLE IF EXISTS t`) + tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id, name)) partition by list columns (id, name) ( + partition p0 values in ((3, '1'), (5, '5')), + partition p1 values in ((1, '1')));`) + tk.MustQuery(`show create table t`).Check(testutil.RowsWithSep("|", + "t CREATE TABLE `t` (\n"+ + " `id` int(11) DEFAULT NULL,\n"+ + " `name` varchar(10) DEFAULT NULL,\n"+ + " UNIQUE KEY `idx` (`id`,`name`)\n"+ + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin\n"+ + "PARTITION BY LIST COLUMNS(id,name) (\n"+ + " PARTITION `p0` VALUES IN ((3,\"1\"),(5,\"5\")),\n"+ + " PARTITION `p1` VALUES IN ((1,\"1\"))\n"+ + ")")) } func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { @@ -810,7 +900,7 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { "auto_random_tbl1 CREATE TABLE `auto_random_tbl1` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(3) */,\n"+ " `b` varchar(255) DEFAULT NULL,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -821,7 +911,7 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { "auto_random_tbl2 CREATE TABLE `auto_random_tbl2` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ " `b` char(1) DEFAULT NULL,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -831,7 +921,7 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { ""+ "auto_random_tbl3 CREATE TABLE `auto_random_tbl3` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) // Test show auto_random table option. @@ -841,7 +931,7 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { "auto_random_tbl4 CREATE TABLE `auto_random_tbl4` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ " `b` varchar(255) DEFAULT NULL,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=100 */", )) // Test implicit auto_random with auto_random table option. @@ -851,7 +941,7 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { "auto_random_tbl5 CREATE TABLE `auto_random_tbl5` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ " `b` char(1) DEFAULT NULL,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=50 */", )) // Test auto_random table option already with special comment. @@ -860,12 +950,12 @@ func (s *testAutoRandomSuite) TestShowCreateTableAutoRandom(c *C) { ""+ "auto_random_tbl6 CREATE TABLE `auto_random_tbl6` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_rand_base] AUTO_RANDOM_BASE=200 */", )) } -// Override testAutoRandomSuite to test auto id cache. +// TestAutoIdCache overrides testAutoRandomSuite to test auto id cache. func (s *testAutoRandomSuite) TestAutoIdCache(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -876,7 +966,7 @@ func (s *testAutoRandomSuite) TestAutoIdCache(c *C) { ""+ "t CREATE TABLE `t` (\n"+ " `a` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=10 */", )) tk.MustExec("drop table if exists t") @@ -886,7 +976,7 @@ func (s *testAutoRandomSuite) TestAutoIdCache(c *C) { "t CREATE TABLE `t` (\n"+ " `a` int(11) NOT NULL AUTO_INCREMENT,\n"+ " `b` int(11) NOT NULL,\n"+ - " PRIMARY KEY (`b`),\n"+ + " PRIMARY KEY (`b`) /*T![clustered_index] CLUSTERED */,\n"+ " UNIQUE KEY `a` (`a`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=100 */", )) @@ -896,7 +986,7 @@ func (s *testAutoRandomSuite) TestAutoIdCache(c *C) { ""+ "t CREATE TABLE `t` (\n"+ " `a` int(11) NOT NULL,\n"+ - " PRIMARY KEY (`a`)\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T![auto_id_cache] AUTO_ID_CACHE=5 */", )) } @@ -918,7 +1008,7 @@ func (s *testAutoRandomSuite) TestAutoRandomBase(c *C) { "t CREATE TABLE `t` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ " `b` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`a`),\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n"+ " UNIQUE KEY `b` (`b`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=100 /*T![auto_rand_base] AUTO_RANDOM_BASE=100 */", )) @@ -929,12 +1019,33 @@ func (s *testAutoRandomSuite) TestAutoRandomBase(c *C) { "t CREATE TABLE `t` (\n"+ " `a` bigint(20) NOT NULL /*T![auto_rand] AUTO_RANDOM(5) */,\n"+ " `b` int(11) NOT NULL AUTO_INCREMENT,\n"+ - " PRIMARY KEY (`a`),\n"+ + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */,\n"+ " UNIQUE KEY `b` (`b`)\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=5100 /*T![auto_rand_base] AUTO_RANDOM_BASE=6001 */", )) } +func (s *testSerialSuite) TestAutoRandomWithLargeSignedShowTableRegions(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database if not exists auto_random_db;") + defer tk.MustExec("drop database if exists auto_random_db;") + tk.MustExec("use auto_random_db;") + tk.MustExec("drop table if exists t;") + + testutil.ConfigTestUtils.SetupAutoRandomTestConfig() + defer testutil.ConfigTestUtils.RestoreAutoRandomTestConfig() + tk.MustExec("create table t (a bigint unsigned auto_random primary key);") + tk.MustExec("set @@global.tidb_scatter_region=1;") + // 18446744073709541615 is MaxUint64 - 10000. + // 18446744073709551615 is the MaxUint64. + tk.MustQuery("split table t between (18446744073709541615) and (18446744073709551615) regions 2;"). + Check(testkit.Rows("1 1")) + startKey := tk.MustQuery("show table t regions;").Rows()[1][1].(string) + idx := strings.Index(startKey, "_r_") + c.Assert(idx == -1, IsFalse) + c.Assert(startKey[idx+3] == '-', IsFalse, Commentf("actual key: %s", startKey)) +} + func (s *testSuite5) TestShowEscape(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -945,7 +1056,7 @@ func (s *testSuite5) TestShowEscape(c *C) { ""+ "t`abl\"e CREATE TABLE `t``abl\"e` (\n"+ " `c``olum\"n` int(11) NOT NULL,\n"+ - " PRIMARY KEY (`c``olum\"n`)\n"+ + " PRIMARY KEY (`c``olum\"n`) /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -956,7 +1067,7 @@ func (s *testSuite5) TestShowEscape(c *C) { ""+ "t`abl\"e CREATE TABLE \"t`abl\"\"e\" (\n"+ " \"c`olum\"\"n\" int(11) NOT NULL,\n"+ - " PRIMARY KEY (\"c`olum\"\"n\")\n"+ + " PRIMARY KEY (\"c`olum\"\"n\") /*T![clustered_index] CLUSTERED */\n"+ ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin", )) @@ -969,9 +1080,9 @@ func (s *testSuite5) TestShowBuiltin(c *C) { res := tk.MustQuery("show builtins;") c.Assert(res, NotNil) rows := res.Rows() - c.Assert(268, Equals, len(rows)) + c.Assert(267, Equals, len(rows)) c.Assert("abs", Equals, rows[0][0].(string)) - c.Assert("yearweek", Equals, rows[267][0].(string)) + c.Assert("yearweek", Equals, rows[266][0].(string)) } func (s *testSuite5) TestShowClusterConfig(c *C) { @@ -1008,6 +1119,20 @@ func (s *testSuite5) TestShowClusterConfig(c *C) { c.Assert(tk.QueryToErr("show config"), ErrorMatches, confErr.Error()) } +func (s *testSuite5) TestInvisibleCoprCacheConfig(c *C) { + se1, err := session.CreateSession(s.store) + c.Assert(err, IsNil) + tk := testkit.NewTestKitWithSession(c, s.store, se1) + rows := tk.MustQuery("show variables like '%config%'").Rows() + c.Assert(len(rows), Equals, 1) + configValue := rows[0][1].(string) + coprCacheVal := + "\t\t\"copr-cache\": {\n" + + "\t\t\t\"capacity-mb\": 1000\n" + + "\t\t},\n" + c.Assert(strings.Contains(configValue, coprCacheVal), Equals, true) +} + func (s *testSerialSuite1) TestShowCreateTableWithIntegerDisplayLengthWarnings(c *C) { parsertypes.TiDBStrictIntegerDisplayWidth = true defer func() { @@ -1071,3 +1196,68 @@ func (s *testSerialSuite1) TestShowCreateTableWithIntegerDisplayLengthWarnings(c " `e` bigint DEFAULT NULL\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) } + +func (s *testSuite5) TestShowVar(c *C) { + tk := testkit.NewTestKit(c, s.store) + var showSQL string + for _, v := range variable.GetSysVars() { + if variable.FilterImplicitFeatureSwitch(v) { + continue + } + // When ScopeSession only. `show global variables` must return empty. + if v.Scope == variable.ScopeSession { + showSQL = "show variables like '" + v.Name + "'" + res := tk.MustQuery(showSQL) + c.Check(res.Rows(), HasLen, 1) + showSQL = "show global variables like '" + v.Name + "'" + res = tk.MustQuery(showSQL) + c.Check(res.Rows(), HasLen, 0) + } else { + showSQL = "show global variables like '" + v.Name + "'" + res := tk.MustQuery(showSQL) + c.Check(res.Rows(), HasLen, 1) + showSQL = "show variables like '" + v.Name + "'" + res = tk.MustQuery(showSQL) + c.Check(res.Rows(), HasLen, 1) + } + } + // Test for switch variable which shouldn't seen by users. + for _, one := range variable.FeatureSwitchVariables { + res := tk.MustQuery("show variables like '" + one + "'") + c.Check(res.Rows(), HasLen, 0) + res = tk.MustQuery("show global variables like '" + one + "'") + c.Check(res.Rows(), HasLen, 0) + } +} + +func (s *testSuite5) TestIssue19507(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("CREATE TABLE t2(a int primary key, b int unique, c int not null, unique index (c));") + tk.MustQuery("SHOW INDEX IN t2;").Check( + testutil.RowsWithSep("|", "t2|0|PRIMARY|1|a|A|0||||BTREE|||YES|NULL", + "t2|0|c|1|c|A|0||||BTREE|||YES|NULL", + "t2|0|b|1|b|A|0|||YES|BTREE|||YES|NULL")) + + tk.MustExec("CREATE INDEX t2_b_c_index ON t2 (b, c);") + tk.MustExec("CREATE INDEX t2_c_b_index ON t2 (c, b);") + tk.MustQuery("SHOW INDEX IN t2;").Check( + testutil.RowsWithSep("|", "t2|0|PRIMARY|1|a|A|0||||BTREE|||YES|NULL", + "t2|0|c|1|c|A|0||||BTREE|||YES|NULL", + "t2|0|b|1|b|A|0|||YES|BTREE|||YES|NULL", + "t2|1|t2_b_c_index|1|b|A|0|||YES|BTREE|||YES|NULL", + "t2|1|t2_b_c_index|2|c|A|0||||BTREE|||YES|NULL", + "t2|1|t2_c_b_index|1|c|A|0||||BTREE|||YES|NULL", + "t2|1|t2_c_b_index|2|b|A|0|||YES|BTREE|||YES|NULL")) +} + +// TestShowPerformanceSchema tests for Issue 19231 +func (s *testSuite5) TestShowPerformanceSchema(c *C) { + tk := testkit.NewTestKit(c, s.store) + // Ideally we should create a new performance_schema table here with indices that we run the tests on. + // However, its not possible to create a new performance_schema table since its a special in memory table. + // Instead the test below uses the default index on the table. + tk.MustQuery("SHOW INDEX FROM performance_schema.events_statements_summary_by_digest").Check( + testkit.Rows("events_statements_summary_by_digest 0 SCHEMA_NAME 1 SCHEMA_NAME A 0 YES BTREE YES NULL", + "events_statements_summary_by_digest 0 SCHEMA_NAME 2 DIGEST A 0 YES BTREE YES NULL")) +} diff --git a/executor/shuffle.go b/executor/shuffle.go index fd4ab99130cf5..9ad4ff522e4cd 100644 --- a/executor/shuffle.go +++ b/executor/shuffle.go @@ -29,10 +29,11 @@ import ( ) // ShuffleExec is the executor to run other executors in a parallel manner. -// 1. It fetches chunks from `DataSource`. -// 2. It splits tuples from `DataSource` into N partitions (Only "split by hash" is implemented so far). -// 3. It invokes N workers in parallel, assign each partition as input to each worker and execute child executors. -// 4. It collects outputs from each worker, then sends outputs to its parent. +// 1. It fetches chunks from M `DataSources` (value of M depends on the actual executor, e.g. M = 1 for WindowExec, M = 2 for MergeJoinExec). +// 2. It splits tuples from each `DataSource` into N partitions (Only "split by hash" is implemented so far). +// 3. It invokes N workers in parallel, each one has M `receiver` to receive partitions from `DataSources` +// 4. It assigns partitions received as input to each worker and executes child executors. +// 5. It collects outputs from each worker, then sends outputs to its parent. // // +-------------+ // +-------| Main Thread | @@ -71,7 +72,7 @@ import ( // +----------> | fetch data from DataSource | // +---------------------------------+ // -//////////////////////////////////////////////////////////////////////////////////////// +// type ShuffleExec struct { baseExecutor concurrency int @@ -80,8 +81,9 @@ type ShuffleExec struct { prepared bool executed bool - splitter partitionSplitter - dataSource Executor + // each dataSource has a corresponding spliter + splitters []partitionSplitter + dataSources []Executor finishCh chan struct{} outputCh chan *shuffleOutput @@ -95,8 +97,11 @@ type shuffleOutput struct { // Open implements the Executor Open interface. func (e *ShuffleExec) Open(ctx context.Context) error { - if err := e.dataSource.Open(ctx); err != nil { - return err + for _, s := range e.dataSources { + if err := s.Open(ctx); err != nil { + return err + } + } if err := e.baseExecutor.Open(ctx); err != nil { return err @@ -109,8 +114,11 @@ func (e *ShuffleExec) Open(ctx context.Context) error { for _, w := range e.workers { w.finishCh = e.finishCh - w.inputCh = make(chan *chunk.Chunk, 1) - w.inputHolderCh = make(chan *chunk.Chunk, 1) + for _, r := range w.receivers { + r.inputCh = make(chan *chunk.Chunk, 1) + r.inputHolderCh = make(chan *chunk.Chunk, 1) + } + w.outputCh = e.outputCh w.outputHolderCh = make(chan *chunk.Chunk, 1) @@ -118,7 +126,9 @@ func (e *ShuffleExec) Open(ctx context.Context) error { return err } - w.inputHolderCh <- newFirstChunk(e.dataSource) + for i, r := range w.receivers { + r.inputHolderCh <- newFirstChunk(e.dataSources[i]) + } w.outputHolderCh <- newFirstChunk(e) } @@ -127,17 +137,26 @@ func (e *ShuffleExec) Open(ctx context.Context) error { // Close implements the Executor Close interface. func (e *ShuffleExec) Close() error { + var firstErr error if !e.prepared { for _, w := range e.workers { - close(w.inputHolderCh) - close(w.inputCh) + for _, r := range w.receivers { + close(r.inputHolderCh) + close(r.inputCh) + } close(w.outputHolderCh) } close(e.outputCh) } close(e.finishCh) for _, w := range e.workers { - for range w.inputCh { + for _, r := range w.receivers { + for range r.inputCh { + } + } + // close child executor of each worker + if err := w.childExec.Close(); err != nil && firstErr == nil { + firstErr = err } } for range e.outputCh { // workers exit before `e.outputCh` is closed. @@ -150,16 +169,24 @@ func (e *ShuffleExec) Close() error { e.ctx.GetSessionVars().StmtCtx.RuntimeStatsColl.RegisterStats(e.id, runtimeStats) } - err := e.dataSource.Close() - err1 := e.baseExecutor.Close() - if err != nil { - return errors.Trace(err) + // close dataSources + for _, dataSource := range e.dataSources { + if err := dataSource.Close(); err != nil && firstErr == nil { + firstErr = err + } } - return errors.Trace(err1) + // close baseExecutor + if err := e.baseExecutor.Close(); err != nil && firstErr == nil { + firstErr = err + } + return errors.Trace(firstErr) } func (e *ShuffleExec) prepare4ParallelExec(ctx context.Context) { - go e.fetchDataAndSplit(ctx) + // create a goroutine for each dataSource to fetch and split data + for i := range e.dataSources { + go e.fetchDataAndSplit(ctx, i) + } waitGroup := &sync.WaitGroup{} waitGroup.Add(len(e.workers)) @@ -213,25 +240,25 @@ func recoveryShuffleExec(output chan *shuffleOutput, r interface{}) { logutil.BgLogger().Error("shuffle panicked", zap.Error(err), zap.Stack("stack")) } -func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context) { +func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context, dataSourceIndex int) { var ( err error workerIndices []int ) results := make([]*chunk.Chunk, len(e.workers)) - chk := newFirstChunk(e.dataSource) + chk := newFirstChunk(e.dataSources[dataSourceIndex]) defer func() { if r := recover(); r != nil { recoveryShuffleExec(e.outputCh, r) } for _, w := range e.workers { - close(w.inputCh) + close(w.receivers[dataSourceIndex].inputCh) } }() for { - err = Next(ctx, e.dataSource, chk) + err = Next(ctx, e.dataSources[dataSourceIndex], chk) if err != nil { e.outputCh <- &shuffleOutput{err: err} return @@ -240,7 +267,7 @@ func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context) { break } - workerIndices, err = e.splitter.split(e.ctx, chk, workerIndices) + workerIndices, err = e.splitters[dataSourceIndex].split(e.ctx, chk, workerIndices) if err != nil { e.outputCh <- &shuffleOutput{err: err} return @@ -254,47 +281,40 @@ func (e *ShuffleExec) fetchDataAndSplit(ctx context.Context) { select { case <-e.finishCh: return - case results[workerIdx] = <-w.inputHolderCh: + case results[workerIdx] = <-w.receivers[dataSourceIndex].inputHolderCh: break } } results[workerIdx].AppendRow(chk.GetRow(i)) if results[workerIdx].IsFull() { - w.inputCh <- results[workerIdx] + w.receivers[dataSourceIndex].inputCh <- results[workerIdx] results[workerIdx] = nil } } } for i, w := range e.workers { if results[i] != nil { - w.inputCh <- results[i] + w.receivers[dataSourceIndex].inputCh <- results[i] results[i] = nil } } } -var _ Executor = &shuffleWorker{} +var _ Executor = &shuffleReceiver{} -// shuffleWorker is the multi-thread worker executing child executors within "partition". -type shuffleWorker struct { +// shuffleReceiver receives chunk from dataSource through inputCh +type shuffleReceiver struct { baseExecutor - childExec Executor finishCh <-chan struct{} executed bool - // Workers get inputs from dataFetcherThread by `inputCh`, - // and output results to main thread by `outputCh`. - // `inputHolderCh` and `outputHolderCh` are "Chunk Holder" channels of `inputCh` and `outputCh` respectively, - // which give the `*Chunk` back, to implement the data transport in a streaming manner. - inputCh chan *chunk.Chunk - inputHolderCh chan *chunk.Chunk - outputCh chan *shuffleOutput - outputHolderCh chan *chunk.Chunk + inputCh chan *chunk.Chunk + inputHolderCh chan *chunk.Chunk } // Open implements the Executor Open interface. -func (e *shuffleWorker) Open(ctx context.Context) error { +func (e *shuffleReceiver) Open(ctx context.Context) error { if err := e.baseExecutor.Open(ctx); err != nil { return err } @@ -303,13 +323,13 @@ func (e *shuffleWorker) Open(ctx context.Context) error { } // Close implements the Executor Close interface. -func (e *shuffleWorker) Close() error { +func (e *shuffleReceiver) Close() error { return errors.Trace(e.baseExecutor.Close()) } // Next implements the Executor Next interface. // It is called by `Tail` executor within "shuffle", to fetch data from `DataSource` by `inputCh`. -func (e *shuffleWorker) Next(ctx context.Context, req *chunk.Chunk) error { +func (e *shuffleReceiver) Next(ctx context.Context, req *chunk.Chunk) error { req.Reset() if e.executed { return nil @@ -329,6 +349,19 @@ func (e *shuffleWorker) Next(ctx context.Context, req *chunk.Chunk) error { } } +// shuffleWorker is the multi-thread worker executing child executors within "partition". +type shuffleWorker struct { + childExec Executor + + finishCh <-chan struct{} + + // each receiver corresponse to a dataSource + receivers []*shuffleReceiver + + outputCh chan *shuffleOutput + outputHolderCh chan *chunk.Chunk +} + func (e *shuffleWorker) run(ctx context.Context, waitGroup *sync.WaitGroup) { defer func() { if r := recover(); r != nil { @@ -357,6 +390,7 @@ func (e *shuffleWorker) run(ctx context.Context, waitGroup *sync.WaitGroup) { } var _ partitionSplitter = &partitionHashSplitter{} +var _ partitionSplitter = &partitionRangeSplitter{} type partitionSplitter interface { split(ctx sessionctx.Context, input *chunk.Chunk, workerIndices []int) ([]int, error) @@ -381,3 +415,47 @@ func (s *partitionHashSplitter) split(ctx sessionctx.Context, input *chunk.Chunk } return workerIndices, nil } + +func buildPartitionHashSplitter(concurrency int, byItems []expression.Expression) *partitionHashSplitter { + return &partitionHashSplitter{ + byItems: byItems, + numWorkers: concurrency, + } +} + +type partitionRangeSplitter struct { + byItems []expression.Expression + numWorkers int + groupChecker *vecGroupChecker + idx int +} + +func buildPartitionRangeSplitter(ctx sessionctx.Context, concurrency int, byItems []expression.Expression) *partitionRangeSplitter { + return &partitionRangeSplitter{ + byItems: byItems, + numWorkers: concurrency, + groupChecker: newVecGroupChecker(ctx, byItems), + idx: 0, + } +} + +// This method is supposed to be used for shuffle with sorted `dataSource` +// the caller of this method should guarantee that `input` is grouped, +// which means that rows with the same byItems should be continuous, the order does not matter. +func (s *partitionRangeSplitter) split(ctx sessionctx.Context, input *chunk.Chunk, workerIndices []int) ([]int, error) { + _, err := s.groupChecker.splitIntoGroups(input) + if err != nil { + return workerIndices, err + } + + workerIndices = workerIndices[:0] + for !s.groupChecker.isExhausted() { + begin, end := s.groupChecker.getNextGroup() + for i := begin; i < end; i++ { + workerIndices = append(workerIndices, s.idx) + } + s.idx = (s.idx + 1) % s.numWorkers + } + + return workerIndices, nil +} diff --git a/executor/shuffle_test.go b/executor/shuffle_test.go new file mode 100644 index 0000000000000..59ce06b4e26dc --- /dev/null +++ b/executor/shuffle_test.go @@ -0,0 +1,67 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/mock" +) + +var _ = SerialSuites(&testPartitionSuite{}) + +type testPartitionSuite struct { +} + +func (s *testPartitionSuite) TestPartitionRangeSplitter(c *C) { + ctx := mock.NewContext() + concurrency := 2 + + tp := &types.FieldType{Tp: mysql.TypeVarchar} + col0 := &expression.Column{ + RetType: tp, + Index: 0, + } + byItems := []expression.Expression{col0} + + input := chunk.New([]*types.FieldType{tp}, 1024, 1024) + input.Reset() + input.Column(0).AppendString("a") + input.Column(0).AppendString("a") + input.Column(0).AppendString("a") + input.Column(0).AppendString("a") + input.Column(0).AppendString("c") + input.Column(0).AppendString("c") + input.Column(0).AppendString("b") + input.Column(0).AppendString("b") + input.Column(0).AppendString("b") + input.Column(0).AppendString("q") + input.Column(0).AppendString("eee") + input.Column(0).AppendString("eee") + input.Column(0).AppendString("ddd") + + expected := []int{0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 1} + obtained := make([]int, 0) + + splitter := buildPartitionRangeSplitter(ctx, concurrency, byItems) + obtained, err := splitter.split(ctx, input, obtained) + c.Assert(err, IsNil) + c.Assert(len(obtained), Equals, len(expected)) + for i := 0; i < len(obtained); i++ { + c.Assert(obtained[i], Equals, expected[i]) + } +} diff --git a/executor/simple.go b/executor/simple.go index 21b04b9c16532..f0d3135d21e6e 100644 --- a/executor/simple.go +++ b/executor/simple.go @@ -22,13 +22,15 @@ import ( "github.com/ngaut/pools" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" @@ -37,12 +39,17 @@ import ( "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/store/tikv/oracle" + tikvutil "github.com/pingcap/tidb/store/tikv/util" + "github.com/pingcap/tidb/types" + driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/util/timeutil" + "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" ) @@ -60,8 +67,12 @@ type SimpleExec struct { baseExecutor Statement ast.StmtNode - done bool - is infoschema.InfoSchema + // IsFromRemote indicates whether the statement IS FROM REMOTE TiDB instance in cluster, + // and executing in coprocessor. + // Used for `global kill`. See https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-01-global-kill.md. + IsFromRemote bool + done bool + is infoschema.InfoSchema } func (e *baseExecutor) getSysSession() (sessionctx.Context, error) { @@ -82,7 +93,7 @@ func (e *baseExecutor) releaseSysSession(ctx sessionctx.Context) { } dom := domain.GetDomain(e.ctx) sysSessionPool := dom.SysSessionPool() - if _, err := ctx.(sqlexec.SQLExecutor).Execute(context.Background(), "rollback"); err != nil { + if _, err := ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), "rollback"); err != nil { ctx.(pools.Resource).Close() return } @@ -100,7 +111,7 @@ func (e *SimpleExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { if err := e.ctx.NewTxn(ctx); err != nil { return err } - defer func() { e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, false) }() + defer func() { e.ctx.GetSessionVars().SetInTxn(false) }() } switch x := e.Statement.(type) { @@ -127,7 +138,7 @@ func (e *SimpleExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { case *ast.SetPwdStmt: err = e.executeSetPwd(x) case *ast.KillStmt: - err = e.executeKillStmt(x) + err = e.executeKillStmt(ctx, x) case *ast.BinlogStmt: // We just ignore it. return nil @@ -141,10 +152,6 @@ func (e *SimpleExec) Next(ctx context.Context, req *chunk.Chunk) (err error) { err = e.executeSetDefaultRole(x) case *ast.ShutdownStmt: err = e.executeShutdown(x) - case *ast.CreateStatisticsStmt: - err = e.executeCreateStatistics(x) - case *ast.DropStatisticsStmt: - err = e.executeDropStatistics(x) case *ast.AdminStmt: err = e.executeAdminReloadStatistics(x) } @@ -159,23 +166,25 @@ func (e *SimpleExec) setDefaultRoleNone(s *ast.SetDefaultRoleStmt) error { } defer e.releaseSysSession(restrictedCtx) sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } + sql := new(strings.Builder) for _, u := range s.UserList { if u.Hostname == "" { u.Hostname = "%" } - sql := fmt.Sprintf("DELETE IGNORE FROM mysql.default_roles WHERE USER='%s' AND HOST='%s';", u.Username, u.Hostname) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, "DELETE IGNORE FROM mysql.default_roles WHERE USER=%? AND HOST=%?;", u.Username, u.Hostname) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } return nil @@ -207,42 +216,45 @@ func (e *SimpleExec) setDefaultRoleRegular(s *ast.SetDefaultRoleStmt) error { } defer e.releaseSysSession(restrictedCtx) sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } + sql := new(strings.Builder) for _, user := range s.UserList { if user.Hostname == "" { user.Hostname = "%" } - sql := fmt.Sprintf("DELETE IGNORE FROM mysql.default_roles WHERE USER='%s' AND HOST='%s';", user.Username, user.Hostname) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, "DELETE IGNORE FROM mysql.default_roles WHERE USER=%? AND HOST=%?;", user.Username, user.Hostname) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } for _, role := range s.RoleList { - sql := fmt.Sprintf("INSERT IGNORE INTO mysql.default_roles values('%s', '%s', '%s', '%s');", user.Hostname, user.Username, role.Hostname, role.Username) checker := privilege.GetPrivilegeManager(e.ctx) ok := checker.FindEdge(e.ctx, role, user) if ok { - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO mysql.default_roles values(%?, %?, %?, %?);", user.Hostname, user.Username, role.Hostname, role.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } } else { - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return ErrRoleNotGranted.GenWithStackByArgs(role.String(), user.String()) } } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } return nil @@ -264,31 +276,34 @@ func (e *SimpleExec) setDefaultRoleAll(s *ast.SetDefaultRoleStmt) error { } defer e.releaseSysSession(restrictedCtx) sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } + sql := new(strings.Builder) for _, user := range s.UserList { if user.Hostname == "" { user.Hostname = "%" } - sql := fmt.Sprintf("DELETE IGNORE FROM mysql.default_roles WHERE USER='%s' AND HOST='%s';", user.Username, user.Hostname) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, "DELETE IGNORE FROM mysql.default_roles WHERE USER=%? AND HOST=%?;", user.Username, user.Hostname) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } - sql = fmt.Sprintf("INSERT IGNORE INTO mysql.default_roles(HOST,USER,DEFAULT_ROLE_HOST,DEFAULT_ROLE_USER) "+ - "SELECT TO_HOST,TO_USER,FROM_HOST,FROM_USER FROM mysql.role_edges WHERE TO_HOST='%s' AND TO_USER='%s';", user.Hostname, user.Username) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO mysql.default_roles(HOST,USER,DEFAULT_ROLE_HOST,DEFAULT_ROLE_USER) SELECT TO_HOST,TO_USER,FROM_HOST,FROM_USER FROM mysql.role_edges WHERE TO_HOST=%? AND TO_USER=%?;", user.Hostname, user.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { + logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } return nil @@ -296,29 +311,10 @@ func (e *SimpleExec) setDefaultRoleAll(s *ast.SetDefaultRoleStmt) error { func (e *SimpleExec) setDefaultRoleForCurrentUser(s *ast.SetDefaultRoleStmt) (err error) { checker := privilege.GetPrivilegeManager(e.ctx) - user, sql := s.UserList[0], "" + user := s.UserList[0] if user.Hostname == "" { user.Hostname = "%" } - switch s.SetRoleOpt { - case ast.SetRoleNone: - sql = fmt.Sprintf("DELETE IGNORE FROM mysql.default_roles WHERE USER='%s' AND HOST='%s';", user.Username, user.Hostname) - case ast.SetRoleAll: - sql = fmt.Sprintf("INSERT IGNORE INTO mysql.default_roles(HOST,USER,DEFAULT_ROLE_HOST,DEFAULT_ROLE_USER) "+ - "SELECT TO_HOST,TO_USER,FROM_HOST,FROM_USER FROM mysql.role_edges WHERE TO_HOST='%s' AND TO_USER='%s';", user.Hostname, user.Username) - case ast.SetRoleRegular: - sql = "INSERT IGNORE INTO mysql.default_roles values" - for i, role := range s.RoleList { - ok := checker.FindEdge(e.ctx, role, user) - if !ok { - return ErrRoleNotGranted.GenWithStackByArgs(role.String(), user.String()) - } - sql += fmt.Sprintf("('%s', '%s', '%s', '%s')", user.Hostname, user.Username, role.Hostname, role.Username) - if i != len(s.RoleList)-1 { - sql += "," - } - } - } restrictedCtx, err := e.getSysSession() if err != nil { @@ -327,27 +323,48 @@ func (e *SimpleExec) setDefaultRoleForCurrentUser(s *ast.SetDefaultRoleStmt) (er defer e.releaseSysSession(restrictedCtx) sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } - deleteSQL := fmt.Sprintf("DELETE IGNORE FROM mysql.default_roles WHERE USER='%s' AND HOST='%s';", user.Username, user.Hostname) - if _, err := sqlExecutor.Execute(context.Background(), deleteSQL); err != nil { + sql := new(strings.Builder) + sqlexec.MustFormatSQL(sql, "DELETE IGNORE FROM mysql.default_roles WHERE USER=%? AND HOST=%?;", user.Username, user.Hostname) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + switch s.SetRoleOpt { + case ast.SetRoleNone: + sqlexec.MustFormatSQL(sql, "DELETE IGNORE FROM mysql.default_roles WHERE USER=%? AND HOST=%?;", user.Username, user.Hostname) + case ast.SetRoleAll: + sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO mysql.default_roles(HOST,USER,DEFAULT_ROLE_HOST,DEFAULT_ROLE_USER) SELECT TO_HOST,TO_USER,FROM_HOST,FROM_USER FROM mysql.role_edges WHERE TO_HOST=%? AND TO_USER=%?;", user.Hostname, user.Username) + case ast.SetRoleRegular: + sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO mysql.default_roles values") + for i, role := range s.RoleList { + if i > 0 { + sqlexec.MustFormatSQL(sql, ",") + } + ok := checker.FindEdge(e.ctx, role, user) + if !ok { + return ErrRoleNotGranted.GenWithStackByArgs(role.String(), user.String()) + } + sqlexec.MustFormatSQL(sql, "(%?, %?, %?, %?)", user.Hostname, user.Username, role.Hostname, role.Username) + } + } + + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } return nil @@ -550,10 +567,18 @@ func (e *SimpleExec) executeUse(s *ast.UseStmt) error { } func (e *SimpleExec) executeBegin(ctx context.Context, s *ast.BeginStmt) error { + // If `START TRANSACTION READ ONLY WITH TIMESTAMP BOUND` is the first statement in TxnCtx, we should + // always create a new Txn instead of reusing it. + if s.ReadOnly && s.Bound != nil { + return e.executeStartTransactionReadOnlyWithTimestampBound(ctx, s) + } + // If BEGIN is the first statement in TxnCtx, we can reuse the existing transaction, without the // need to call NewTxn, which commits the existing transaction and begins a new one. + // If the last un-committed/un-rollback transaction is a time-bounded read-only transaction, we should + // always create a new transaction. txnCtx := e.ctx.GetSessionVars().TxnCtx - if txnCtx.History != nil { + if txnCtx.History != nil || txnCtx.IsStaleness { err := e.ctx.NewTxn(ctx) if err != nil { return err @@ -562,7 +587,7 @@ func (e *SimpleExec) executeBegin(ctx context.Context, s *ast.BeginStmt) error { // With START TRANSACTION, autocommit remains disabled until you end // the transaction with COMMIT or ROLLBACK. The autocommit mode then // reverts to its previous state. - e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, true) + e.ctx.GetSessionVars().SetInTxn(true) // Call ctx.Txn(true) to active pending txn. txnMode := s.Mode if txnMode == "" { @@ -578,6 +603,73 @@ func (e *SimpleExec) executeBegin(ctx context.Context, s *ast.BeginStmt) error { if e.ctx.GetSessionVars().TxnCtx.IsPessimistic { txn.SetOption(kv.Pessimistic, true) } + if s.CausalConsistencyOnly { + txn.SetOption(kv.GuaranteeLinearizability, false) + } + return nil +} + +func (e *SimpleExec) executeStartTransactionReadOnlyWithTimestampBound(ctx context.Context, s *ast.BeginStmt) error { + opt := sessionctx.StalenessTxnOption{} + opt.Mode = s.Bound.Mode + switch s.Bound.Mode { + case ast.TimestampBoundReadTimestamp: + // TODO: support funcCallExpr in future + v, ok := s.Bound.Timestamp.(*driver.ValueExpr) + if !ok { + return errors.New("Invalid value for Bound Timestamp") + } + t, err := types.ParseTime(e.ctx.GetSessionVars().StmtCtx, v.GetString(), v.GetType().Tp, types.GetFsp(v.GetString())) + if err != nil { + return err + } + gt, err := t.GoTime(e.ctx.GetSessionVars().TimeZone) + if err != nil { + return err + } + startTS := oracle.ComposeTS(gt.Unix()*1000, 0) + opt.StartTS = startTS + case ast.TimestampBoundExactStaleness: + // TODO: support funcCallExpr in future + v, ok := s.Bound.Timestamp.(*driver.ValueExpr) + if !ok { + return errors.New("Invalid value for Bound Timestamp") + } + d, err := types.ParseDuration(e.ctx.GetSessionVars().StmtCtx, v.GetString(), types.GetFsp(v.GetString())) + if err != nil { + return err + } + opt.PrevSec = uint64(d.Seconds()) + } + err := e.ctx.NewTxnWithStalenessOption(ctx, opt) + if err != nil { + return err + } + dom := domain.GetDomain(e.ctx) + m, err := dom.GetSnapshotMeta(e.ctx.GetSessionVars().TxnCtx.StartTS) + if err != nil { + return err + } + staleVer, err := m.GetSchemaVersion() + if err != nil { + return err + } + failpoint.Inject("mockStalenessTxnSchemaVer", func(val failpoint.Value) { + if val.(bool) { + staleVer = e.ctx.GetSessionVars().TxnCtx.SchemaVersion - 1 + } else { + staleVer = e.ctx.GetSessionVars().TxnCtx.SchemaVersion + } + }) + // TODO: currently we directly check the schema version. In future, we can cache the stale infoschema instead. + if e.ctx.GetSessionVars().TxnCtx.SchemaVersion > staleVer { + return errors.New("schema version changed after the staleness startTS") + } + + // With START TRANSACTION, autocommit remains disabled until you end + // the transaction with COMMIT or ROLLBACK. The autocommit mode then + // reverts to its previous state. + e.ctx.GetSessionVars().SetInTxn(true) return nil } @@ -600,16 +692,17 @@ func (e *SimpleExec) executeRevokeRole(s *ast.RevokeRoleStmt) error { sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) // begin a transaction to insert role graph edges. - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return errors.Trace(err) } + sql := new(strings.Builder) for _, user := range s.Users { exists, err := userExists(e.ctx, user.Username, user.Hostname) if err != nil { return errors.Trace(err) } if !exists { - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return errors.Trace(err) } return ErrCannotUser.GenWithStackByArgs("REVOKE ROLE", user.String()) @@ -618,23 +711,26 @@ func (e *SimpleExec) executeRevokeRole(s *ast.RevokeRoleStmt) error { if role.Hostname == "" { role.Hostname = "%" } - sql := fmt.Sprintf(`DELETE IGNORE FROM %s.%s WHERE FROM_HOST='%s' and FROM_USER='%s' and TO_HOST='%s' and TO_USER='%s'`, mysql.SystemDB, mysql.RoleEdgeTable, role.Hostname, role.Username, user.Hostname, user.Username) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE IGNORE FROM %n.%n WHERE FROM_HOST=%? and FROM_USER=%? and TO_HOST=%? and TO_USER=%?`, mysql.SystemDB, mysql.RoleEdgeTable, role.Hostname, role.Username, user.Hostname, user.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return errors.Trace(err) } return ErrCannotUser.GenWithStackByArgs("REVOKE ROLE", role.String()) } - sql = fmt.Sprintf(`DELETE IGNORE FROM %s.%s WHERE DEFAULT_ROLE_HOST='%s' and DEFAULT_ROLE_USER='%s' and HOST='%s' and USER='%s'`, mysql.SystemDB, mysql.DefaultRoleTable, role.Hostname, role.Username, user.Hostname, user.Username) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE IGNORE FROM %n.%n WHERE DEFAULT_ROLE_HOST=%? and DEFAULT_ROLE_USER=%? and HOST=%? and USER=%?`, mysql.SystemDB, mysql.DefaultRoleTable, role.Hostname, role.Username, user.Hostname, user.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return errors.Trace(err) } return ErrCannotUser.GenWithStackByArgs("REVOKE ROLE", role.String()) } } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } domain.GetDomain(e.ctx).NotifyUpdatePrivilege(e.ctx) @@ -642,13 +738,13 @@ func (e *SimpleExec) executeRevokeRole(s *ast.RevokeRoleStmt) error { } func (e *SimpleExec) executeCommit(s *ast.CommitStmt) { - e.ctx.GetSessionVars().SetStatusFlag(mysql.ServerStatusInTrans, false) + e.ctx.GetSessionVars().SetInTxn(false) } func (e *SimpleExec) executeRollback(s *ast.RollbackStmt) error { sessVars := e.ctx.GetSessionVars() logutil.BgLogger().Debug("execute rollback statement", zap.Uint64("conn", sessVars.ConnectionID)) - sessVars.SetStatusFlag(mysql.ServerStatusInTrans, false) + sessVars.SetInTxn(false) txn, err := e.ctx.Txn(false) if err != nil { return err @@ -692,9 +788,18 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm return err } - users := make([]string, 0, len(s.Specs)) - privs := make([]string, 0, len(s.Specs)) + sql := new(strings.Builder) + if s.IsCreateRole { + sqlexec.MustFormatSQL(sql, `INSERT INTO %n.%n (Host, User, authentication_string, Account_locked) VALUES `, mysql.SystemDB, mysql.UserTable) + } else { + sqlexec.MustFormatSQL(sql, `INSERT INTO %n.%n (Host, User, authentication_string) VALUES `, mysql.SystemDB, mysql.UserTable) + } + + users := make([]*auth.UserIdentity, 0, len(s.Specs)) for _, spec := range s.Specs { + if len(users) > 0 { + sqlexec.MustFormatSQL(sql, ",") + } exists, err1 := userExists(e.ctx, spec.User.Username, spec.User.Hostname) if err1 != nil { return err1 @@ -715,26 +820,17 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm if !ok { return errors.Trace(ErrPasswordFormat) } - user := fmt.Sprintf(`('%s', '%s', '%s')`, spec.User.Hostname, spec.User.Username, pwd) if s.IsCreateRole { - user = fmt.Sprintf(`('%s', '%s', '%s', 'Y')`, spec.User.Hostname, spec.User.Username, pwd) - } - users = append(users, user) - - if len(privData) != 0 { - priv := fmt.Sprintf(`('%s', '%s', '%s')`, spec.User.Hostname, spec.User.Username, hack.String(privData)) - privs = append(privs, priv) + sqlexec.MustFormatSQL(sql, `(%?, %?, %?, %?)`, spec.User.Hostname, spec.User.Username, pwd, "Y") + } else { + sqlexec.MustFormatSQL(sql, `(%?, %?, %?)`, spec.User.Hostname, spec.User.Username, pwd) } + users = append(users, spec.User) } if len(users) == 0 { return nil } - sql := fmt.Sprintf(`INSERT INTO %s.%s (Host, User, authentication_string) VALUES %s;`, mysql.SystemDB, mysql.UserTable, strings.Join(users, ", ")) - if s.IsCreateRole { - sql = fmt.Sprintf(`INSERT INTO %s.%s (Host, User, authentication_string, Account_locked) VALUES %s;`, mysql.SystemDB, mysql.UserTable, strings.Join(users, ", ")) - } - restrictedCtx, err := e.getSysSession() if err != nil { return err @@ -742,27 +838,34 @@ func (e *SimpleExec) executeCreateUser(ctx context.Context, s *ast.CreateUserStm defer e.releaseSysSession(restrictedCtx) sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return errors.Trace(err) } - _, err = sqlExecutor.Execute(context.Background(), sql) + _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()) if err != nil { - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } - if len(privs) != 0 { - sql = fmt.Sprintf("INSERT IGNORE INTO %s.%s (Host, User, Priv) VALUES %s", mysql.SystemDB, mysql.GlobalPrivTable, strings.Join(privs, ", ")) - _, err = sqlExecutor.Execute(context.Background(), sql) + if len(privData) != 0 { + sql.Reset() + sqlexec.MustFormatSQL(sql, "INSERT IGNORE INTO %n.%n (Host, User, Priv) VALUES ", mysql.SystemDB, mysql.GlobalPrivTable) + for i, user := range users { + if i > 0 { + sqlexec.MustFormatSQL(sql, ",") + } + sqlexec.MustFormatSQL(sql, `(%?, %?, %?)`, user.Hostname, user.Username, string(hack.String(privData))) + } + _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()) if err != nil { - if _, rollbackErr := sqlExecutor.Execute(context.Background(), "rollback"); rollbackErr != nil { + if _, rollbackErr := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); rollbackErr != nil { return rollbackErr } return err } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return errors.Trace(err) } domain.GetDomain(e.ctx).NotifyUpdatePrivilege(e.ctx) @@ -811,17 +914,22 @@ func (e *SimpleExec) executeAlterUser(s *ast.AlterUserStmt) error { if !ok { return errors.Trace(ErrPasswordFormat) } - sql := fmt.Sprintf(`UPDATE %s.%s SET authentication_string = '%s' WHERE Host = '%s' and User = '%s';`, - mysql.SystemDB, mysql.UserTable, pwd, spec.User.Hostname, spec.User.Username) - _, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `UPDATE %n.%n SET authentication_string=%? WHERE Host=%? and User=%?;`, mysql.SystemDB, mysql.UserTable, pwd, spec.User.Hostname, spec.User.Username) + if err != nil { + return err + } + _, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { failedUsers = append(failedUsers, spec.User.String()) } if len(privData) > 0 { - sql = fmt.Sprintf("INSERT INTO %s.%s (Host, User, Priv) VALUES ('%s','%s','%s') ON DUPLICATE KEY UPDATE Priv = values(Priv)", - mysql.SystemDB, mysql.GlobalPrivTable, spec.User.Hostname, spec.User.Username, hack.String(privData)) - _, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + stmt, err = exec.ParseWithParams(context.TODO(), "INSERT INTO %n.%n (Host, User, Priv) VALUES (%?,%?,%?) ON DUPLICATE KEY UPDATE Priv = values(Priv)", mysql.SystemDB, mysql.GlobalPrivTable, spec.User.Hostname, spec.User.Username, string(hack.String(privData))) + if err != nil { + return err + } + _, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { failedUsers = append(failedUsers, spec.User.String()) } @@ -833,7 +941,7 @@ func (e *SimpleExec) executeAlterUser(s *ast.AlterUserStmt) error { if err != nil { return err } - err = txn.Commit(sessionctx.SetCommitCtx(context.Background(), e.ctx)) + err = txn.Commit(tikvutil.SetSessionID(context.TODO(), e.ctx.GetSessionVars().ConnectionID)) if err != nil { return err } @@ -885,23 +993,25 @@ func (e *SimpleExec) executeGrantRole(s *ast.GrantRoleStmt) error { sqlExecutor := restrictedCtx.(sqlexec.SQLExecutor) // begin a transaction to insert role graph edges. - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } + sql := new(strings.Builder) for _, user := range s.Users { for _, role := range s.Roles { - sql := fmt.Sprintf(`INSERT IGNORE INTO %s.%s (FROM_HOST, FROM_USER, TO_HOST, TO_USER) VALUES ('%s','%s','%s','%s')`, mysql.SystemDB, mysql.RoleEdgeTable, role.Hostname, role.Username, user.Hostname, user.Username) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `INSERT IGNORE INTO %n.%n (FROM_HOST, FROM_USER, TO_HOST, TO_USER) VALUES (%?,%?,%?,%?)`, mysql.SystemDB, mysql.RoleEdgeTable, role.Hostname, role.Username, user.Hostname, user.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { logutil.BgLogger().Error(fmt.Sprintf("Error occur when executing %s", sql)) - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return err } return ErrCannotUser.GenWithStackByArgs("GRANT ROLE", user.String()) } } } - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } domain.GetDomain(e.ctx).NotifyUpdatePrivilege(e.ctx) @@ -938,10 +1048,11 @@ func (e *SimpleExec) executeDropUser(s *ast.DropUserStmt) error { } sqlExecutor := sysSession.(sqlexec.SQLExecutor) - if _, err := sqlExecutor.Execute(context.Background(), "begin"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "begin"); err != nil { return err } + sql := new(strings.Builder) for _, user := range s.UserList { exists, err := userExists(e.ctx, user.Username, user.Hostname) if err != nil { @@ -957,58 +1068,66 @@ func (e *SimpleExec) executeDropUser(s *ast.DropUserStmt) error { } // begin a transaction to delete a user. - sql := fmt.Sprintf(`DELETE FROM %s.%s WHERE Host = '%s' and User = '%s';`, mysql.SystemDB, mysql.UserTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.UserTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } // delete privileges from mysql.global_priv - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE Host = '%s' and User = '%s';`, mysql.SystemDB, mysql.GlobalPrivTable, user.Hostname, user.Username) - if _, err := sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.GlobalPrivTable, user.Hostname, user.Username) + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return err } continue } // delete privileges from mysql.db - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE Host = '%s' and User = '%s';`, mysql.SystemDB, mysql.DBTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.DBTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } // delete privileges from mysql.tables_priv - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE Host = '%s' and User = '%s';`, mysql.SystemDB, mysql.TablePrivTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE Host = %? and User = %?;`, mysql.SystemDB, mysql.TablePrivTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } // delete relationship from mysql.role_edges - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE TO_HOST = '%s' and TO_USER = '%s';`, mysql.SystemDB, mysql.RoleEdgeTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE TO_HOST = %? and TO_USER = %?;`, mysql.SystemDB, mysql.RoleEdgeTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE FROM_HOST = '%s' and FROM_USER = '%s';`, mysql.SystemDB, mysql.RoleEdgeTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE FROM_HOST = %? and FROM_USER = %?;`, mysql.SystemDB, mysql.RoleEdgeTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } // delete relationship from mysql.default_roles - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE DEFAULT_ROLE_HOST = '%s' and DEFAULT_ROLE_USER = '%s';`, mysql.SystemDB, mysql.DefaultRoleTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE DEFAULT_ROLE_HOST = %? and DEFAULT_ROLE_USER = %?;`, mysql.SystemDB, mysql.DefaultRoleTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } - sql = fmt.Sprintf(`DELETE FROM %s.%s WHERE HOST = '%s' and USER = '%s';`, mysql.SystemDB, mysql.DefaultRoleTable, user.Hostname, user.Username) - if _, err = sqlExecutor.Execute(context.Background(), sql); err != nil { + sql.Reset() + sqlexec.MustFormatSQL(sql, `DELETE FROM %n.%n WHERE HOST = %? and USER = %?;`, mysql.SystemDB, mysql.DefaultRoleTable, user.Hostname, user.Username) + if _, err = sqlExecutor.ExecuteInternal(context.TODO(), sql.String()); err != nil { failedUsers = append(failedUsers, user.String()) break } @@ -1016,11 +1135,11 @@ func (e *SimpleExec) executeDropUser(s *ast.DropUserStmt) error { } if len(failedUsers) == 0 { - if _, err := sqlExecutor.Execute(context.Background(), "commit"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "commit"); err != nil { return err } } else { - if _, err := sqlExecutor.Execute(context.Background(), "rollback"); err != nil { + if _, err := sqlExecutor.ExecuteInternal(context.TODO(), "rollback"); err != nil { return err } if s.IsDropRole { @@ -1033,8 +1152,12 @@ func (e *SimpleExec) executeDropUser(s *ast.DropUserStmt) error { } func userExists(ctx sessionctx.Context, name string, host string) (bool, error) { - sql := fmt.Sprintf(`SELECT * FROM %s.%s WHERE User='%s' AND Host='%s';`, mysql.SystemDB, mysql.UserTable, name, host) - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT * FROM %n.%n WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, name, host) + if err != nil { + return false, err + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return false, err } @@ -1067,27 +1190,113 @@ func (e *SimpleExec) executeSetPwd(s *ast.SetPwdStmt) error { } // update mysql.user - sql := fmt.Sprintf(`UPDATE %s.%s SET authentication_string='%s' WHERE User='%s' AND Host='%s';`, mysql.SystemDB, mysql.UserTable, auth.EncodePassword(s.Password), u, h) - _, _, err = e.ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := e.ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `UPDATE %n.%n SET authentication_string=%? WHERE User=%? AND Host=%?;`, mysql.SystemDB, mysql.UserTable, auth.EncodePassword(s.Password), u, h) + if err != nil { + return err + } + _, _, err = exec.ExecRestrictedStmt(context.TODO(), stmt) domain.GetDomain(e.ctx).NotifyUpdatePrivilege(e.ctx) return err } -func (e *SimpleExec) executeKillStmt(s *ast.KillStmt) error { - conf := config.GetGlobalConfig() - if s.TiDBExtension || conf.CompatibleKillQuery { - sm := e.ctx.GetSessionManager() - if sm == nil { - return nil +func (e *SimpleExec) executeKillStmt(ctx context.Context, s *ast.KillStmt) error { + if !config.GetGlobalConfig().Experimental.EnableGlobalKill { + conf := config.GetGlobalConfig() + if s.TiDBExtension || conf.CompatibleKillQuery { + sm := e.ctx.GetSessionManager() + if sm == nil { + return nil + } + sm.Kill(s.ConnectionID, s.Query) + } else { + err := errors.New("Invalid operation. Please use 'KILL TIDB [CONNECTION | QUERY] connectionID' instead") + e.ctx.GetSessionVars().StmtCtx.AppendWarning(err) } + return nil + } + + sm := e.ctx.GetSessionManager() + if sm == nil { + return nil + } + if e.IsFromRemote { + logutil.BgLogger().Info("Killing connection in current instance redirected from remote TiDB", zap.Uint64("connID", s.ConnectionID), zap.Bool("query", s.Query), + zap.String("sourceAddr", e.ctx.GetSessionVars().SourceAddr.IP.String())) sm.Kill(s.ConnectionID, s.Query) - } else { - err := errors.New("Invalid operation. Please use 'KILL TIDB [CONNECTION | QUERY] connectionID' instead") + return nil + } + + connID, isTruncated, err := util.ParseGlobalConnID(s.ConnectionID) + if err != nil { + err1 := errors.New("Parse ConnectionID failed: " + err.Error()) + e.ctx.GetSessionVars().StmtCtx.AppendWarning(err1) + return nil + } + if isTruncated { + message := "Kill failed: Received a 32bits truncated ConnectionID, expect 64bits. Please execute 'KILL [CONNECTION | QUERY] ConnectionID' to send a Kill without truncating ConnectionID." + logutil.BgLogger().Warn(message, zap.Uint64("connID", s.ConnectionID)) + // Notice that this warning cannot be seen if KILL is triggered by "CTRL-C" of mysql client, + // as the KILL is sent by a new connection. + err := errors.New(message) e.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return nil + } + + if connID.ServerID != sm.ServerID() { + if err := killRemoteConn(ctx, e.ctx, &connID, s.Query); err != nil { + err1 := errors.New("KILL remote connection failed: " + err.Error()) + e.ctx.GetSessionVars().StmtCtx.AppendWarning(err1) + } + } else { + sm.Kill(s.ConnectionID, s.Query) } + return nil } +func killRemoteConn(ctx context.Context, sctx sessionctx.Context, connID *util.GlobalConnID, query bool) error { + if connID.ServerID == 0 { + return errors.New("Unexpected ZERO ServerID. Please file a bug to the TiDB Team") + } + + killExec := &tipb.Executor{ + Tp: tipb.ExecType_TypeKill, + Kill: &tipb.Kill{ConnID: connID.ID(), Query: query}, + } + + dagReq := &tipb.DAGRequest{} + dagReq.TimeZoneName, dagReq.TimeZoneOffset = timeutil.Zone(sctx.GetSessionVars().Location()) + sc := sctx.GetSessionVars().StmtCtx + if sc.RuntimeStatsColl != nil { + collExec := true + dagReq.CollectExecutionSummaries = &collExec + } + dagReq.Flags = sc.PushDownFlags() + dagReq.Executors = []*tipb.Executor{killExec} + + var builder distsql.RequestBuilder + kvReq, err := builder. + SetDAGRequest(dagReq). + SetFromSessionVars(sctx.GetSessionVars()). + SetStoreType(kv.TiDB). + SetTiDBServerID(connID.ServerID). + Build() + if err != nil { + return err + } + + resp := sctx.GetClient().Send(ctx, kvReq, sctx.GetSessionVars().KVVars, sctx.GetSessionVars().StmtCtx.MemTracker, false) + if resp == nil { + err := errors.New("client returns nil response") + return err + } + + logutil.BgLogger().Info("Killed remote connection", zap.Uint64("serverID", connID.ServerID), + zap.Uint64("connID", connID.ID()), zap.Bool("query", query)) + return err +} + func (e *SimpleExec) executeFlush(s *ast.FlushStmt) error { switch s.Tp { case ast.FlushTables: @@ -1119,6 +1328,8 @@ func (e *SimpleExec) executeFlush(s *ast.FlushStmt) error { return err } } + case ast.FlushClientErrorsSummary: + errno.FlushStats() } return nil } @@ -1143,10 +1354,17 @@ func (e *SimpleExec) executeAlterInstance(s *ast.AlterInstanceStmt) error { return nil } -func (e *SimpleExec) executeDropStats(s *ast.DropStatsStmt) error { +func (e *SimpleExec) executeDropStats(s *ast.DropStatsStmt) (err error) { h := domain.GetDomain(e.ctx).StatsHandle() - err := h.DeleteTableStatsFromKV(s.Table.TableInfo.ID) - if err != nil { + var statsIDs []int64 + if s.IsGlobalStats { + statsIDs = []int64{s.Table.TableInfo.ID} + } else { + if statsIDs, _, err = core.GetPhysicalIDsAndPartitionNames(s.Table.TableInfo, s.PartitionNames); err != nil { + return err + } + } + if err := h.DeleteTableStatsFromKV(statsIDs); err != nil { return err } return h.Update(infoschema.GetInfoSchema(e.ctx)) @@ -1186,59 +1404,12 @@ func asyncDelayShutdown(p *os.Process, delay time.Duration) { } } -func (e *SimpleExec) executeCreateStatistics(s *ast.CreateStatisticsStmt) (err error) { - // Not support Cardinality and Dependency statistics type for now. - if s.StatsType == ast.StatsTypeCardinality || s.StatsType == ast.StatsTypeDependency { - return terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("Cardinality and Dependency statistics types are not supported") - } - if _, ok := e.is.SchemaByName(s.Table.Schema); !ok { - return infoschema.ErrDatabaseNotExists.GenWithStackByArgs(s.Table.Schema) - } - t, err := e.is.TableByName(s.Table.Schema, s.Table.Name) - if err != nil { - return infoschema.ErrTableNotExists.GenWithStackByArgs(s.Table.Schema, s.Table.Name) - } - tblInfo := t.Meta() - colIDs := make([]int64, 0, 2) - // Check whether columns exist. - for _, colName := range s.Columns { - col := table.FindCol(t.VisibleCols(), colName.Name.L) - if col == nil { - return terror.ClassDDL.New(mysql.ErrKeyColumnDoesNotExits, mysql.MySQLErrName[mysql.ErrKeyColumnDoesNotExits]).GenWithStack("column does not exist: %s", colName.Name.L) - } - if s.StatsType == ast.StatsTypeCorrelation && tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag) { - warn := errors.New("No need to create correlation statistics on the integer primary key column") - e.ctx.GetSessionVars().StmtCtx.AppendWarning(warn) - return nil - } - colIDs = append(colIDs, col.ID) - } - if len(colIDs) != 2 && (s.StatsType == ast.StatsTypeCorrelation || s.StatsType == ast.StatsTypeDependency) { - return terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("Only support Correlation and Dependency statistics types on 2 columns") - } - if len(colIDs) < 1 && s.StatsType == ast.StatsTypeCardinality { - return terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("Only support Cardinality statistics type on at least 2 columns") - } - // TODO: check whether covering index exists for cardinality / dependency types. - - // Call utilities of statistics.Handle to modify system tables instead of doing DML directly, - // because locking in Handle can guarantee the correctness of `version` in system tables. - return domain.GetDomain(e.ctx).StatsHandle().InsertExtendedStats(s.StatsName, s.Table.Schema.L, colIDs, int(s.StatsType), tblInfo.ID, s.IfNotExists) -} - -func (e *SimpleExec) executeDropStatistics(s *ast.DropStatisticsStmt) error { - db := e.ctx.GetSessionVars().CurrentDB - if db == "" { - return core.ErrNoDB - } - // Call utilities of statistics.Handle to modify system tables instead of doing DML directly, - // because locking in Handle can guarantee the correctness of `version` in system tables. - return domain.GetDomain(e.ctx).StatsHandle().MarkExtendedStatsDeleted(s.StatsName, db, -1) -} - func (e *SimpleExec) executeAdminReloadStatistics(s *ast.AdminStmt) error { if s.Tp != ast.AdminReloadStatistics { - return terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]).GenWithStack("This AdminStmt is not ADMIN RELOAD STATISTICS") + return errors.New("This AdminStmt is not ADMIN RELOAD STATS_EXTENDED") + } + if !e.ctx.GetSessionVars().EnableExtendedStats { + return errors.New("Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") } return domain.GetDomain(e.ctx).StatsHandle().ReloadExtendedStatistics() } diff --git a/executor/simple_test.go b/executor/simple_test.go index 926534468bf88..47cf5dd73ab42 100644 --- a/executor/simple_test.go +++ b/executor/simple_test.go @@ -15,6 +15,7 @@ package executor_test import ( "context" + "strconv" . "github.com/pingcap/check" "github.com/pingcap/errors" @@ -28,7 +29,9 @@ import ( "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testutil" ) @@ -56,6 +59,16 @@ func (s *testSuite3) TestDo(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("do 1, @a:=1") tk.MustQuery("select @a").Check(testkit.Rows("1")) + + tk.MustExec("use test") + tk.MustExec("create table t (i int)") + tk.MustExec("insert into t values (1)") + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test") + tk.MustQuery("select * from t").Check(testkit.Rows("1")) + tk.MustExec("do @a := (select * from t where i = 1)") + tk2.MustExec("insert into t values (2)") + tk.MustQuery("select * from t").Check(testkit.Rows("1", "2")) } func (s *testSuite3) TestSetRoleAllCorner(c *C) { @@ -502,10 +515,43 @@ func (s *testSuite3) TestSetPwd(c *C) { func (s *testSuite3) TestKillStmt(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + sm := &mockSessionManager{ + serverID: 0, + } + tk.Se.SetSessionManager(sm) tk.MustExec("kill 1") - result := tk.MustQuery("show warnings") result.Check(testkit.Rows("Warning 1105 Invalid operation. Please use 'KILL TIDB [CONNECTION | QUERY] connectionID' instead")) + + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + newCfg.Experimental.EnableGlobalKill = true + config.StoreGlobalConfig(&newCfg) + + // ZERO serverID, treated as truncated. + tk.MustExec("kill 1") + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows("Warning 1105 Kill failed: Received a 32bits truncated ConnectionID, expect 64bits. Please execute 'KILL [CONNECTION | QUERY] ConnectionID' to send a Kill without truncating ConnectionID.")) + + // truncated + sm.SetServerID(1) + tk.MustExec("kill 101") + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows("Warning 1105 Kill failed: Received a 32bits truncated ConnectionID, expect 64bits. Please execute 'KILL [CONNECTION | QUERY] ConnectionID' to send a Kill without truncating ConnectionID.")) + + // excceed int64 + tk.MustExec("kill 9223372036854775808") // 9223372036854775808 == 2^63 + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows("Warning 1105 Parse ConnectionID failed: Unexpected connectionID excceeds int64")) + + // local kill + connID := util.GlobalConnID{Is64bits: true, ServerID: 1, LocalConnID: 101} + tk.MustExec("kill " + strconv.FormatUint(connID.ID(), 10)) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows()) + + config.StoreGlobalConfig(originCfg) + // remote kill is tested in `tests/globalkilltest` } func (s *testSuite3) TestFlushPrivileges(c *C) { @@ -539,7 +585,10 @@ func (s *testFlushSuite) TestFlushPrivilegesPanic(c *C) { // Run in a separate suite because this test need to set SkipGrantTable config. store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { @@ -554,6 +603,54 @@ func (s *testFlushSuite) TestFlushPrivilegesPanic(c *C) { tk.MustExec("FLUSH PRIVILEGES") } +func (s *testSuite3) TestDropPartitionStats(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`create table t ( + a int, + key(a) +) +partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition global values less than (30) +)`) + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("insert into t values (1), (5), (11), (15), (21), (25)") + c.Assert(s.domain.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + checkPartitionStats := func(names ...string) { + rs := tk.MustQuery("show stats_meta").Rows() + c.Assert(len(rs), Equals, len(names)) + for i := range names { + c.Assert(rs[i][2].(string), Equals, names[i]) + } + } + + tk.MustExec("analyze table t") + checkPartitionStats("global", "p0", "p1", "global") + + tk.MustExec("drop stats t partition p0") + checkPartitionStats("global", "p1", "global") + + err := tk.ExecToErr("drop stats t partition abcde") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "can not found the specified partition name abcde in the table definition") + + tk.MustExec("drop stats t partition global") + checkPartitionStats("global", "p1") + + tk.MustExec("drop stats t global") + checkPartitionStats("p1") + + tk.MustExec("analyze table t") + checkPartitionStats("global", "p0", "p1", "global") + + tk.MustExec("drop stats t partition p0, p1, global") + checkPartitionStats("global") +} + func (s *testSuite3) TestDropStats(c *C) { testKit := testkit.NewTestKit(c, s.store) testKit.MustExec("use test") @@ -599,17 +696,10 @@ func (s *testSuite3) TestDropStatsFromKV(c *C) { testkit.Rows("0 16")) tk.MustQuery("select hist_id from mysql.stats_histograms where table_id = " + tblID).Check( testkit.Rows("1", "2")) - tk.MustQuery("select hist_id, bucket_id from mysql.stats_buckets where table_id = " + tblID).Check( - testkit.Rows("1 0", - "1 1", - "1 2", - "1 3", - "2 0", - "2 1", - "2 2", - "2 3")) - tk.MustQuery("select hist_id from mysql.stats_top_n where table_id = " + tblID).Check( - testkit.Rows("1", "1", "1", "1", "2", "2", "2", "2")) + ret := tk.MustQuery("select hist_id, bucket_id from mysql.stats_buckets where table_id = " + tblID) + c.Assert(len(ret.Rows()) > 0, IsTrue) + ret = tk.MustQuery("select hist_id from mysql.stats_top_n where table_id = " + tblID) + c.Assert(len(ret.Rows()) > 0, IsTrue) tk.MustExec("drop stats t") tk.MustQuery("select modify_count, count from mysql.stats_meta where table_id = " + tblID).Check( @@ -734,24 +824,30 @@ func (s *testSuite3) TestExtendedStatsPrivileges(c *C) { defer se.Close() c.Assert(se.Auth(&auth.UserIdentity{Username: "u1", Hostname: "%"}, nil, nil), IsTrue) ctx := context.Background() - _, err = se.Execute(ctx, "create statistics s1(correlation) on test.t(a,b)") + _, err = se.Execute(ctx, "set session tidb_enable_extended_stats = on") + c.Assert(err, IsNil) + _, err = se.Execute(ctx, "alter table test.t add stats_extended s1 correlation(a,b)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[planner:1142]ALTER command denied to user 'u1'@'%' for table 't'") + tk.MustExec("grant alter on test.* to 'u1'@'%'") + _, err = se.Execute(ctx, "alter table test.t add stats_extended s1 correlation(a,b)") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[planner:1142]CREATE STATISTICS command denied to user 'u1'@'%' for table 't'") + c.Assert(err.Error(), Equals, "[planner:1142]ADD STATS_EXTENDED command denied to user 'u1'@'%' for table 't'") tk.MustExec("grant select on test.* to 'u1'@'%'") - _, err = se.Execute(ctx, "create statistics s1(correlation) on test.t(a,b)") + _, err = se.Execute(ctx, "alter table test.t add stats_extended s1 correlation(a,b)") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[planner:1142]CREATE STATISTICS command denied to user 'u1'@'%' for table 'stats_extended'") + c.Assert(err.Error(), Equals, "[planner:1142]ADD STATS_EXTENDED command denied to user 'u1'@'%' for table 'stats_extended'") tk.MustExec("grant insert on mysql.stats_extended to 'u1'@'%'") - _, err = se.Execute(ctx, "create statistics s1(correlation) on test.t(a,b)") + _, err = se.Execute(ctx, "alter table test.t add stats_extended s1 correlation(a,b)") c.Assert(err, IsNil) _, err = se.Execute(ctx, "use test") c.Assert(err, IsNil) - _, err = se.Execute(ctx, "drop statistics s1") + _, err = se.Execute(ctx, "alter table t drop stats_extended s1") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[planner:1142]DROP STATISTICS command denied to user 'u1'@'%' for table 'stats_extended'") + c.Assert(err.Error(), Equals, "[planner:1142]DROP STATS_EXTENDED command denied to user 'u1'@'%' for table 'stats_extended'") tk.MustExec("grant update on mysql.stats_extended to 'u1'@'%'") - _, err = se.Execute(ctx, "drop statistics s1") + _, err = se.Execute(ctx, "alter table t drop stats_extended s1") c.Assert(err, IsNil) tk.MustExec("drop user 'u1'@'%'") } diff --git a/executor/slow_query.go b/executor/slow_query.go old mode 100644 new mode 100755 index fab505f431910..c6a5f8872f0e3 --- a/executor/slow_query.go +++ b/executor/slow_query.go @@ -18,12 +18,14 @@ import ( "context" "fmt" "io" + "io/ioutil" "os" "path/filepath" "sort" "strconv" "strings" "sync" + "sync/atomic" "time" "github.com/pingcap/errors" @@ -41,11 +43,15 @@ import ( "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tidb/util/plancodec" "go.uber.org/zap" ) -//slowQueryRetriever is used to read slow log data. +// ParseSlowLogBatchSize is the batch size of slow-log lines for a worker to parse, exported for testing. +var ParseSlowLogBatchSize = 64 + +// slowQueryRetriever is used to read slow log data. type slowQueryRetriever struct { table *model.TableInfo outputCols []*model.ColumnInfo @@ -56,12 +62,13 @@ type slowQueryRetriever struct { fileLine int checker *slowLogChecker - parsedSlowLogCh chan parsedSlowLog + taskList chan slowLogTask + stats *slowQueryRuntimeStats } func (e *slowQueryRetriever) retrieve(ctx context.Context, sctx sessionctx.Context) ([][]types.Datum, error) { if !e.initialized { - err := e.initialize(sctx) + err := e.initialize(ctx, sctx) if err != nil { return nil, err } @@ -88,7 +95,7 @@ func (e *slowQueryRetriever) retrieve(ctx context.Context, sctx sessionctx.Conte return retRows, nil } -func (e *slowQueryRetriever) initialize(sctx sessionctx.Context) error { +func (e *slowQueryRetriever) initialize(ctx context.Context, sctx sessionctx.Context) error { var err error var hasProcessPriv bool if pm := privilege.GetPrivilegeManager(sctx); pm != nil { @@ -98,16 +105,36 @@ func (e *slowQueryRetriever) initialize(sctx sessionctx.Context) error { hasProcessPriv: hasProcessPriv, user: sctx.GetSessionVars().User, } + e.stats = &slowQueryRuntimeStats{} if e.extractor != nil { e.checker.enableTimeCheck = e.extractor.Enable - e.checker.startTime = types.NewTime(types.FromGoTime(e.extractor.StartTime), mysql.TypeDatetime, types.MaxFsp) - e.checker.endTime = types.NewTime(types.FromGoTime(e.extractor.EndTime), mysql.TypeDatetime, types.MaxFsp) + for _, tr := range e.extractor.TimeRanges { + startTime := types.NewTime(types.FromGoTime(tr.StartTime), mysql.TypeDatetime, types.MaxFsp) + endTime := types.NewTime(types.FromGoTime(tr.EndTime), mysql.TypeDatetime, types.MaxFsp) + timeRange := &timeRange{ + startTime: startTime, + endTime: endTime, + } + e.checker.timeRanges = append(e.checker.timeRanges, timeRange) + } + } else { + e.extractor = &plannercore.SlowQueryExtractor{} } e.initialized = true - e.files, err = e.getAllFiles(sctx, sctx.GetSessionVars().SlowQueryFile) + e.files, err = e.getAllFiles(ctx, sctx, sctx.GetSessionVars().SlowQueryFile) + if e.extractor.Desc { + e.reverseLogFiles() + } return err } +func (e *slowQueryRetriever) reverseLogFiles() { + for i := 0; i < len(e.files)/2; i++ { + j := len(e.files) - i - 1 + e.files[i], e.files[j] = e.files[j], e.files[i] + } +} + func (e *slowQueryRetriever) close() error { for _, f := range e.files { err := f.file.Close() @@ -123,31 +150,65 @@ type parsedSlowLog struct { err error } +func (e *slowQueryRetriever) getNextFile() *os.File { + if e.fileIdx >= len(e.files) { + return nil + } + file := e.files[e.fileIdx].file + e.fileIdx++ + if e.stats != nil { + stat, err := file.Stat() + if err == nil { + // ignore the err will be ok. + e.stats.readFileSize += stat.Size() + e.stats.readFileNum++ + } + } + return file +} + +func (e *slowQueryRetriever) getPreviousFile() *os.File { + fileIdx := e.fileIdx + // fileIdx refer to the next file which should be read + // so we need to set fileIdx to fileIdx - 2 to get the previous file. + fileIdx = fileIdx - 2 + if fileIdx < 0 { + return nil + } + file := e.files[fileIdx].file + _, err := file.Seek(0, io.SeekStart) + if err != nil { + return nil + } + return file +} + func (e *slowQueryRetriever) parseDataForSlowLog(ctx context.Context, sctx sessionctx.Context) { - if len(e.files) == 0 { - close(e.parsedSlowLogCh) + file := e.getNextFile() + if file == nil { + close(e.taskList) return } - reader := bufio.NewReader(e.files[0].file) - e.parseSlowLog(ctx, sctx, reader, 64) - close(e.parsedSlowLogCh) + reader := bufio.NewReader(file) + e.parseSlowLog(ctx, sctx, reader, ParseSlowLogBatchSize) } func (e *slowQueryRetriever) dataForSlowLog(ctx context.Context) ([][]types.Datum, bool, error) { var ( - slowLog parsedSlowLog - ok bool + task slowLogTask + ok bool ) for { select { - case slowLog, ok = <-e.parsedSlowLogCh: + case task, ok = <-e.taskList: case <-ctx.Done(): return nil, false, ctx.Err() } if !ok { return nil, true, nil } - rows, err := slowLog.rows, slowLog.err + result := <-task.resultCh + rows, err := result.rows, result.err if err != nil { return nil, false, err } @@ -168,8 +229,12 @@ type slowLogChecker struct { user *auth.UserIdentity // Below fields is used to check slow log time valid. enableTimeCheck bool - startTime types.Time - endTime types.Time + timeRanges []*timeRange +} + +type timeRange struct { + startTime types.Time + endTime types.Time } func (sc *slowLogChecker) hasPrivilege(userName string) bool { @@ -177,10 +242,12 @@ func (sc *slowLogChecker) hasPrivilege(userName string) bool { } func (sc *slowLogChecker) isTimeValid(t types.Time) bool { - if sc.enableTimeCheck && (t.Compare(sc.startTime) < 0 || t.Compare(sc.endTime) > 0) { - return false + for _, tr := range sc.timeRanges { + if sc.enableTimeCheck && (t.Compare(tr.startTime) >= 0 && t.Compare(tr.endTime) <= 0) { + return true + } } - return true + return !sc.enableTimeCheck } func getOneLine(reader *bufio.Reader) ([]byte, error) { @@ -218,80 +285,202 @@ type offset struct { length int } -func (e *slowQueryRetriever) getBatchLog(reader *bufio.Reader, offset *offset, num int) ([]string, error) { +type slowLogTask struct { + resultCh chan parsedSlowLog +} + +type slowLogBlock []string + +func (e *slowQueryRetriever) getBatchLog(ctx context.Context, reader *bufio.Reader, offset *offset, num int) ([][]string, error) { var line string log := make([]string, 0, num) var err error for i := 0; i < num; i++ { for { + if isCtxDone(ctx) { + return nil, ctx.Err() + } e.fileLine++ lineByte, err := getOneLine(reader) if err != nil { if err == io.EOF { - e.fileIdx++ e.fileLine = 0 - if e.fileIdx >= len(e.files) { - return log, nil + file := e.getNextFile() + if file == nil { + return [][]string{log}, nil } offset.length = len(log) - reader.Reset(e.files[e.fileIdx].file) + reader.Reset(file) continue } - return log, err + return [][]string{log}, err } line = string(hack.String(lineByte)) log = append(log, line) if strings.HasSuffix(line, variable.SlowLogSQLSuffixStr) { - if strings.HasPrefix(line, "use") { + if strings.HasPrefix(line, "use") || strings.HasPrefix(line, variable.SlowLogRowPrefixStr) { continue } break } } } - return log, err + return [][]string{log}, err +} + +func (e *slowQueryRetriever) getBatchLogForReversedScan(ctx context.Context, reader *bufio.Reader, offset *offset, num int) ([][]string, error) { + // reader maybe change when read previous file. + inputReader := reader + defer func() { + file := e.getNextFile() + if file != nil { + inputReader.Reset(file) + } + }() + var line string + var logs []slowLogBlock + var log []string + var err error + hasStartFlag := false + scanPreviousFile := false + for { + if isCtxDone(ctx) { + return nil, ctx.Err() + } + e.fileLine++ + lineByte, err := getOneLine(reader) + if err != nil { + if err == io.EOF { + if len(log) == 0 { + decomposedSlowLogTasks := decomposeToSlowLogTasks(logs, num) + offset.length = len(decomposedSlowLogTasks) + return decomposedSlowLogTasks, nil + } + e.fileLine = 0 + file := e.getPreviousFile() + if file == nil { + return decomposeToSlowLogTasks(logs, num), nil + } + reader = bufio.NewReader(file) + scanPreviousFile = true + continue + } + return nil, err + } + line = string(hack.String(lineByte)) + if !hasStartFlag && strings.HasPrefix(line, variable.SlowLogStartPrefixStr) { + hasStartFlag = true + } + if hasStartFlag { + log = append(log, line) + if strings.HasSuffix(line, variable.SlowLogSQLSuffixStr) { + if strings.HasPrefix(line, "use") || strings.HasPrefix(line, variable.SlowLogRowPrefixStr) { + continue + } + logs = append(logs, log) + if scanPreviousFile { + break + } + log = make([]string, 0, 8) + hasStartFlag = false + } + } + } + return decomposeToSlowLogTasks(logs, num), err +} + +func decomposeToSlowLogTasks(logs []slowLogBlock, num int) [][]string { + if len(logs) == 0 { + return nil + } + + //In reversed scan, We should reverse the blocks. + last := len(logs) - 1 + for i := 0; i < len(logs)/2; i++ { + logs[i], logs[last-i] = logs[last-i], logs[i] + } + + decomposedSlowLogTasks := make([][]string, 0) + log := make([]string, 0, num*len(logs[0])) + for i := range logs { + log = append(log, logs[i]...) + if i > 0 && i%num == 0 { + decomposedSlowLogTasks = append(decomposedSlowLogTasks, log) + log = make([]string, 0, len(log)) + } + } + if len(log) > 0 { + decomposedSlowLogTasks = append(decomposedSlowLogTasks, log) + } + return decomposedSlowLogTasks } func (e *slowQueryRetriever) parseSlowLog(ctx context.Context, sctx sessionctx.Context, reader *bufio.Reader, logNum int) { + defer close(e.taskList) var wg sync.WaitGroup offset := offset{offset: 0, length: 0} // To limit the num of go routine - ch := make(chan int, sctx.GetSessionVars().Concurrency.DistSQLScanConcurrency()) + concurrent := sctx.GetSessionVars().Concurrency.DistSQLScanConcurrency() + ch := make(chan int, concurrent) + if e.stats != nil { + e.stats.concurrent = concurrent + } defer close(ch) for { - log, err := e.getBatchLog(reader, &offset, logNum) + startTime := time.Now() + var logs [][]string + var err error + if !e.extractor.Desc { + logs, err = e.getBatchLog(ctx, reader, &offset, logNum) + } else { + logs, err = e.getBatchLogForReversedScan(ctx, reader, &offset, logNum) + } if err != nil { - e.parsedSlowLogCh <- parsedSlowLog{nil, err} - break + t := slowLogTask{} + t.resultCh = make(chan parsedSlowLog, 1) + e.taskList <- t + e.sendParsedSlowLogCh(ctx, t, parsedSlowLog{nil, err}) } - start := offset - wg.Add(1) - ch <- 1 - go func() { - defer wg.Done() - result, err := e.parseLog(sctx, log, start) - if err != nil { - e.parsedSlowLogCh <- parsedSlowLog{nil, err} - } else { - e.parsedSlowLogCh <- parsedSlowLog{result, err} - } - <-ch - }() - // Read the next file, offset = 0 - if e.fileIdx >= len(e.files) { + if len(logs) == 0 || len(logs[0]) == 0 { break } - offset.offset = e.fileLine - offset.length = 0 - select { - case <-ctx.Done(): - break - default: + if e.stats != nil { + e.stats.readFile += time.Since(startTime) + } + for i := range logs { + log := logs[i] + t := slowLogTask{} + t.resultCh = make(chan parsedSlowLog, 1) + start := offset + wg.Add(1) + ch <- 1 + e.taskList <- t + go func() { + defer wg.Done() + result, err := e.parseLog(ctx, sctx, log, start) + e.sendParsedSlowLogCh(ctx, t, parsedSlowLog{result, err}) + <-ch + }() + offset.offset = e.fileLine + offset.length = 0 + select { + case <-ctx.Done(): + return + default: + } } } wg.Wait() } +func (e *slowQueryRetriever) sendParsedSlowLogCh(ctx context.Context, t slowLogTask, re parsedSlowLog) { + select { + case t.resultCh <- re: + case <-ctx.Done(): + return + } +} + func getLineIndex(offset offset, index int) int { var fileLine int if offset.length <= index { @@ -302,11 +491,15 @@ func getLineIndex(offset offset, index int) int { return fileLine } -func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offset offset) (data [][]types.Datum, err error) { +func (e *slowQueryRetriever) parseLog(ctx context.Context, sctx sessionctx.Context, log []string, offset offset) (data [][]types.Datum, err error) { + start := time.Now() defer func() { if r := recover(); r != nil { err = fmt.Errorf("%s", r) } + if e.stats != nil { + atomic.AddInt64(&e.stats.parseLog, int64(time.Since(start))) + } }() failpoint.Inject("errorMockParseSlowLogPanic", func(val failpoint.Value) { if val.(bool) { @@ -314,15 +507,18 @@ func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offs } }) var st *slowQueryTuple - tz := ctx.GetSessionVars().Location() + tz := sctx.GetSessionVars().Location() startFlag := false for index, line := range log { + if isCtxDone(ctx) { + return nil, ctx.Err() + } fileLine := getLineIndex(offset, index) if !startFlag && strings.HasPrefix(line, variable.SlowLogStartPrefixStr) { st = &slowQueryTuple{} valid, err := st.setFieldValue(tz, variable.SlowLogTimeStr, line[len(variable.SlowLogStartPrefixStr):], fileLine, e.checker) if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(err) + sctx.GetSessionVars().StmtCtx.AppendWarning(err) continue } if valid { @@ -339,7 +535,16 @@ func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offs value := line[len(variable.SlowLogUserAndHostStr+variable.SlowLogSpaceMarkStr):] valid, err := st.setFieldValue(tz, variable.SlowLogUserAndHostStr, value, fileLine, e.checker) if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(err) + sctx.GetSessionVars().StmtCtx.AppendWarning(err) + continue + } + if !valid { + startFlag = false + } + } else if strings.HasPrefix(line, variable.SlowLogCopBackoffPrefix) { + valid, err := st.setFieldValue(tz, variable.SlowLogBackoffDetail, line, fileLine, e.checker) + if err != nil { + sctx.GetSessionVars().StmtCtx.AppendWarning(err) continue } if !valid { @@ -354,7 +559,7 @@ func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offs } valid, err := st.setFieldValue(tz, field, fieldValues[i+1], fileLine, e.checker) if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(err) + sctx.GetSessionVars().StmtCtx.AppendWarning(err) continue } if !valid { @@ -372,7 +577,7 @@ func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offs // Get the sql string, and mark the start flag to false. _, err := st.setFieldValue(tz, variable.SlowLogQuerySQLStr, string(hack.Slice(line)), fileLine, e.checker) if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(err) + sctx.GetSessionVars().StmtCtx.AppendWarning(err) continue } if e.checker.hasPrivilege(st.user) { @@ -388,62 +593,74 @@ func (e *slowQueryRetriever) parseLog(ctx sessionctx.Context, log []string, offs } type slowQueryTuple struct { - time types.Time - txnStartTs uint64 - user string - host string - connID uint64 - execRetryCount uint64 - execRetryTime float64 - queryTime float64 - parseTime float64 - compileTime float64 - rewriteTime float64 - preprocSubqueries uint64 - preprocSubQueryTime float64 - optimizeTime float64 - waitTSTime float64 - preWriteTime float64 - waitPrewriteBinlogTime float64 - commitTime float64 - getCommitTSTime float64 - commitBackoffTime float64 - backoffTypes string - resolveLockTime float64 - localLatchWaitTime float64 - writeKeys uint64 - writeSize uint64 - prewriteRegion uint64 - txnRetry uint64 - copTime float64 - processTime float64 - waitTime float64 - backOffTime float64 - lockKeysTime float64 - requestCount uint64 - totalKeys uint64 - processKeys uint64 - db string - indexIDs string - digest string - statsInfo string - avgProcessTime float64 - p90ProcessTime float64 - maxProcessTime float64 - maxProcessAddress string - avgWaitTime float64 - p90WaitTime float64 - maxWaitTime float64 - maxWaitAddress string - memMax int64 - diskMax int64 - prevStmt string - sql string - isInternal bool - succ bool - planFromCache bool - plan string - planDigest string + time types.Time + txnStartTs uint64 + user string + host string + connID uint64 + execRetryCount uint64 + execRetryTime float64 + queryTime float64 + parseTime float64 + compileTime float64 + rewriteTime float64 + preprocSubqueries uint64 + preprocSubQueryTime float64 + optimizeTime float64 + waitTSTime float64 + preWriteTime float64 + waitPrewriteBinlogTime float64 + commitTime float64 + getCommitTSTime float64 + commitBackoffTime float64 + backoffTypes string + resolveLockTime float64 + localLatchWaitTime float64 + writeKeys uint64 + writeSize uint64 + prewriteRegion uint64 + txnRetry uint64 + copTime float64 + processTime float64 + waitTime float64 + backOffTime float64 + lockKeysTime float64 + requestCount uint64 + totalKeys uint64 + processKeys uint64 + db string + indexIDs string + digest string + statsInfo string + avgProcessTime float64 + p90ProcessTime float64 + maxProcessTime float64 + maxProcessAddress string + avgWaitTime float64 + p90WaitTime float64 + maxWaitTime float64 + maxWaitAddress string + memMax int64 + diskMax int64 + prevStmt string + sql string + isInternal bool + succ bool + planFromCache bool + planFromBinding bool + prepared bool + kvTotal float64 + pdTotal float64 + backoffTotal float64 + writeSQLRespTotal float64 + plan string + planDigest string + backoffDetail string + rocksdbDeleteSkippedCount uint64 + rocksdbKeySkippedCount uint64 + rocksdbBlockCacheCount uint64 + rocksdbBlockReadCount uint64 + rocksdbBlockReadByte uint64 } func (st *slowQueryTuple) setFieldValue(tz *time.Location, field, value string, lineNum int, checker *slowLogChecker) (valid bool, err error) { @@ -547,6 +764,16 @@ func (st *slowQueryTuple) setFieldValue(tz *time.Location, field, value string, st.totalKeys, err = strconv.ParseUint(value, 10, 64) case execdetails.ProcessKeysStr: st.processKeys, err = strconv.ParseUint(value, 10, 64) + case execdetails.RocksdbDeleteSkippedCountStr: + st.rocksdbDeleteSkippedCount, err = strconv.ParseUint(value, 10, 64) + case execdetails.RocksdbKeySkippedCountStr: + st.rocksdbKeySkippedCount, err = strconv.ParseUint(value, 10, 64) + case execdetails.RocksdbBlockCacheHitCountStr: + st.rocksdbBlockCacheCount, err = strconv.ParseUint(value, 10, 64) + case execdetails.RocksdbBlockReadCountStr: + st.rocksdbBlockReadCount, err = strconv.ParseUint(value, 10, 64) + case execdetails.RocksdbBlockReadByteStr: + st.rocksdbBlockReadByte, err = strconv.ParseUint(value, 10, 64) case variable.SlowLogDBStr: st.db = value case variable.SlowLogIndexNamesStr: @@ -579,6 +806,8 @@ func (st *slowQueryTuple) setFieldValue(tz *time.Location, field, value string, st.succ, err = strconv.ParseBool(value) case variable.SlowLogPlanFromCache: st.planFromCache, err = strconv.ParseBool(value) + case variable.SlowLogPlanFromBinding: + st.planFromBinding, err = strconv.ParseBool(value) case variable.SlowLogPlan: st.plan = value case variable.SlowLogPlanDigest: @@ -587,12 +816,27 @@ func (st *slowQueryTuple) setFieldValue(tz *time.Location, field, value string, st.sql = value case variable.SlowLogDiskMax: st.diskMax, err = strconv.ParseInt(value, 10, 64) + case variable.SlowLogKVTotal: + st.kvTotal, err = strconv.ParseFloat(value, 64) + case variable.SlowLogPDTotal: + st.pdTotal, err = strconv.ParseFloat(value, 64) + case variable.SlowLogBackoffTotal: + st.backoffTotal, err = strconv.ParseFloat(value, 64) + case variable.SlowLogWriteSQLRespTotal: + st.writeSQLRespTotal, err = strconv.ParseFloat(value, 64) + case variable.SlowLogPrepared: + st.prepared, err = strconv.ParseBool(value) case variable.SlowLogRewriteTimeStr: st.rewriteTime, err = strconv.ParseFloat(value, 64) case variable.SlowLogPreprocSubQueriesStr: st.preprocSubqueries, err = strconv.ParseUint(value, 10, 64) case variable.SlowLogPreProcSubQueryTimeStr: st.preprocSubQueryTime, err = strconv.ParseFloat(value, 64) + case variable.SlowLogBackoffDetail: + if len(st.backoffDetail) > 0 { + st.backoffDetail += " " + } + st.backoffDetail += value } if err != nil { return valid, fmt.Errorf("Parse slow log at line " + strconv.FormatInt(int64(lineNum), 10) + " failed. Field: `" + field + "`, error: " + err.Error()) @@ -638,6 +882,11 @@ func (st *slowQueryTuple) convertToDatumRow() []types.Datum { record = append(record, types.NewUintDatum(st.requestCount)) record = append(record, types.NewUintDatum(st.totalKeys)) record = append(record, types.NewUintDatum(st.processKeys)) + record = append(record, types.NewUintDatum(st.rocksdbDeleteSkippedCount)) + record = append(record, types.NewUintDatum(st.rocksdbKeySkippedCount)) + record = append(record, types.NewUintDatum(st.rocksdbBlockCacheCount)) + record = append(record, types.NewUintDatum(st.rocksdbBlockReadCount)) + record = append(record, types.NewUintDatum(st.rocksdbBlockReadByte)) record = append(record, types.NewStringDatum(st.db)) record = append(record, types.NewStringDatum(st.indexIDs)) record = append(record, types.NewDatum(st.isInternal)) @@ -653,6 +902,16 @@ func (st *slowQueryTuple) convertToDatumRow() []types.Datum { record = append(record, types.NewStringDatum(st.maxWaitAddress)) record = append(record, types.NewIntDatum(st.memMax)) record = append(record, types.NewIntDatum(st.diskMax)) + record = append(record, types.NewFloat64Datum(st.kvTotal)) + record = append(record, types.NewFloat64Datum(st.pdTotal)) + record = append(record, types.NewFloat64Datum(st.backoffTotal)) + record = append(record, types.NewFloat64Datum(st.writeSQLRespTotal)) + record = append(record, types.NewStringDatum(st.backoffDetail)) + if st.prepared { + record = append(record, types.NewIntDatum(1)) + } else { + record = append(record, types.NewIntDatum(0)) + } if st.succ { record = append(record, types.NewIntDatum(1)) } else { @@ -663,6 +922,11 @@ func (st *slowQueryTuple) convertToDatumRow() []types.Datum { } else { record = append(record, types.NewIntDatum(0)) } + if st.planFromBinding { + record = append(record, types.NewIntDatum(1)) + } else { + record = append(record, types.NewIntDatum(0)) + } record = append(record, types.NewStringDatum(parsePlan(st.plan))) record = append(record, types.NewStringDatum(st.planDigest)) record = append(record, types.NewStringDatum(st.prevStmt)) @@ -703,8 +967,17 @@ type logFile struct { } // getAllFiles is used to get all slow-log needed to parse, it is exported for test. -func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath string) ([]logFile, error) { +func (e *slowQueryRetriever) getAllFiles(ctx context.Context, sctx sessionctx.Context, logFilePath string) ([]logFile, error) { + totalFileNum := 0 + if e.stats != nil { + startTime := time.Now() + defer func() { + e.stats.initialize = time.Since(startTime) + e.stats.totalFileNum = totalFileNum + }() + } if e.extractor == nil || !e.extractor.Enable { + totalFileNum = 1 file, err := os.Open(logFilePath) if err != nil { if os.IsNotExist(err) { @@ -725,10 +998,11 @@ func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath st } return nil } - err := filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error { - if err != nil { - return handleErr(err) - } + files, err := ioutil.ReadDir(logDir) + if err != nil { + return nil, err + } + walkFn := func(path string, info os.FileInfo) error { if info.IsDir() { return nil } @@ -736,6 +1010,10 @@ func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath st if !strings.HasPrefix(path, prefix) { return nil } + if isCtxDone(ctx) { + return ctx.Err() + } + totalFileNum++ file, err := os.OpenFile(path, os.O_RDONLY, os.ModePerm) if err != nil { return handleErr(err) @@ -747,22 +1025,36 @@ func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath st } }() // Get the file start time. - fileStartTime, err := e.getFileStartTime(file) + fileStartTime, err := e.getFileStartTime(ctx, file) if err != nil { return handleErr(err) } start := types.NewTime(types.FromGoTime(fileStartTime), mysql.TypeDatetime, types.MaxFsp) - if start.Compare(e.checker.endTime) > 0 { + notInAllTimeRanges := true + for _, tr := range e.checker.timeRanges { + if start.Compare(tr.endTime) <= 0 { + notInAllTimeRanges = false + break + } + } + if notInAllTimeRanges { return nil } // Get the file end time. - fileEndTime, err := e.getFileEndTime(file) + fileEndTime, err := e.getFileEndTime(ctx, file) if err != nil { return handleErr(err) } end := types.NewTime(types.FromGoTime(fileEndTime), mysql.TypeDatetime, types.MaxFsp) - if end.Compare(e.checker.startTime) < 0 { + inTimeRanges := false + for _, tr := range e.checker.timeRanges { + if !(start.Compare(tr.endTime) > 0 || end.Compare(tr.startTime) < 0) { + inTimeRanges = true + break + } + } + if !inTimeRanges { return nil } _, err = file.Seek(0, io.SeekStart) @@ -776,7 +1068,13 @@ func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath st }) skip = true return nil - }) + } + for _, file := range files { + err := walkFn(filepath.Join(logDir, file.Name()), file) + if err != nil { + return nil, err + } + } // Sort by start time sort.Slice(logFiles, func(i, j int) bool { return logFiles[i].start.Before(logFiles[j].start) @@ -784,7 +1082,7 @@ func (e *slowQueryRetriever) getAllFiles(sctx sessionctx.Context, logFilePath st return logFiles, err } -func (e *slowQueryRetriever) getFileStartTime(file *os.File) (time.Time, error) { +func (e *slowQueryRetriever) getFileStartTime(ctx context.Context, file *os.File) (time.Time, error) { var t time.Time _, err := file.Seek(0, io.SeekStart) if err != nil { @@ -805,61 +1103,153 @@ func (e *slowQueryRetriever) getFileStartTime(file *os.File) (time.Time, error) if maxNum <= 0 { break } + if isCtxDone(ctx) { + return t, ctx.Err() + } } return t, errors.Errorf("malform slow query file %v", file.Name()) } -func (e *slowQueryRetriever) getFileEndTime(file *os.File) (time.Time, error) { + +func (e *slowQueryRetriever) getRuntimeStats() execdetails.RuntimeStats { + return e.stats +} + +type slowQueryRuntimeStats struct { + totalFileNum int + readFileNum int + readFile time.Duration + initialize time.Duration + readFileSize int64 + parseLog int64 + concurrent int +} + +// String implements the RuntimeStats interface. +func (s *slowQueryRuntimeStats) String() string { + return fmt.Sprintf("initialize: %s, read_file: %s, parse_log: {time:%s, concurrency:%v}, total_file: %v, read_file: %v, read_size: %s", + execdetails.FormatDuration(s.initialize), execdetails.FormatDuration(s.readFile), + execdetails.FormatDuration(time.Duration(s.parseLog)), s.concurrent, + s.totalFileNum, s.readFileNum, memory.FormatBytes(s.readFileSize)) +} + +// Merge implements the RuntimeStats interface. +func (s *slowQueryRuntimeStats) Merge(rs execdetails.RuntimeStats) { + tmp, ok := rs.(*slowQueryRuntimeStats) + if !ok { + return + } + s.totalFileNum += tmp.totalFileNum + s.readFileNum += tmp.readFileNum + s.readFile += tmp.readFile + s.initialize += tmp.initialize + s.readFileSize += tmp.readFileSize + s.parseLog += tmp.parseLog +} + +// Clone implements the RuntimeStats interface. +func (s *slowQueryRuntimeStats) Clone() execdetails.RuntimeStats { + newRs := *s + return &newRs +} + +// Tp implements the RuntimeStats interface. +func (s *slowQueryRuntimeStats) Tp() int { + return execdetails.TpSlowQueryRuntimeStat +} + +func (e *slowQueryRetriever) getFileEndTime(ctx context.Context, file *os.File) (time.Time, error) { var t time.Time + var tried int stat, err := file.Stat() if err != nil { return t, err } - fileSize := stat.Size() - cursor := int64(0) - line := make([]byte, 0, 64) + endCursor := stat.Size() maxLineNum := 128 - tryGetTime := func(line []byte) string { - for i, j := 0, len(line)-1; i < j; i, j = i+1, j-1 { - line[i], line[j] = line[j], line[i] + for { + lines, readBytes, err := readLastLines(ctx, file, endCursor) + if err != nil { + return t, err } - lineStr := string(line) - lineStr = strings.TrimSpace(lineStr) - if strings.HasPrefix(lineStr, variable.SlowLogStartPrefixStr) { - return lineStr[len(variable.SlowLogStartPrefixStr):] + // read out the file + if readBytes == 0 { + break + } + endCursor -= int64(readBytes) + for i := len(lines) - 1; i >= 0; i-- { + if strings.HasPrefix(lines[i], variable.SlowLogStartPrefixStr) { + return ParseTime(lines[i][len(variable.SlowLogStartPrefixStr):]) + } + } + tried += len(lines) + if tried >= maxLineNum { + break + } + if isCtxDone(ctx) { + return t, ctx.Err() } - return "" } + return t, errors.Errorf("invalid slow query file %v", file.Name()) +} + +const maxReadCacheSize = 1024 * 1024 * 64 + +// Read lines from the end of a file +// endCursor initial value should be the filesize +func readLastLines(ctx context.Context, file *os.File, endCursor int64) ([]string, int, error) { + var lines []byte + var firstNonNewlinePos int + var cursor = endCursor + var size int64 = 2048 for { - cursor -= 1 - _, err := file.Seek(cursor, io.SeekEnd) - if err != nil { - return t, err + // stop if we are at the beginning + // check it in the start to avoid read beyond the size + if cursor <= 0 { + break + } + if size < maxReadCacheSize { + size = size * 2 + } + if cursor < size { + size = cursor } + cursor -= size - char := make([]byte, 1) - _, err = file.Read(char) + _, err := file.Seek(cursor, io.SeekStart) if err != nil { - return t, err + return nil, 0, err } - // If find a line. - if cursor != -1 && (char[0] == '\n' || char[0] == '\r') { - if timeStr := tryGetTime(line); len(timeStr) > 0 { - return ParseTime(timeStr) - } - line = line[:0] - maxLineNum -= 1 + chars := make([]byte, size) + _, err = file.Read(chars) + if err != nil { + return nil, 0, err } - line = append(line, char[0]) - if cursor == -fileSize || maxLineNum <= 0 { - if timeStr := tryGetTime(line); len(timeStr) > 0 { - return ParseTime(timeStr) + lines = append(chars, lines...) + + // find first '\n' or '\r' + for i := 0; i < len(chars); i++ { + // reach the line end + // the first newline may be in the line end at the first round + if i >= len(lines)-1 { + break } - return t, errors.Errorf("malform slow query file %v", file.Name()) + if (chars[i] == 10 || chars[i] == 13) && chars[i+1] != 10 && chars[i+1] != 13 { + firstNonNewlinePos = i + 1 + break + } + } + if firstNonNewlinePos > 0 { + break + } + if isCtxDone(ctx) { + return nil, 0, ctx.Err() } } + finalStr := string(lines[firstNonNewlinePos:]) + return strings.Split(strings.ReplaceAll(finalStr, "\r\n", "\n"), "\n"), len(finalStr), nil } func (e *slowQueryRetriever) initializeAsyncParsing(ctx context.Context, sctx sessionctx.Context) { - e.parsedSlowLogCh = make(chan parsedSlowLog, 100) + e.taskList = make(chan slowLogTask, 100) go e.parseDataForSlowLog(ctx, sctx) } diff --git a/executor/slow_query_test.go b/executor/slow_query_test.go index c6447cee540c1..607d0bae5d59b 100644 --- a/executor/slow_query_test.go +++ b/executor/slow_query_test.go @@ -17,7 +17,6 @@ import ( "bufio" "bytes" "context" - "io" "os" "strings" "time" @@ -33,23 +32,26 @@ import ( "github.com/pingcap/tidb/util/mock" ) -func parseLog(retriever *slowQueryRetriever, sctx sessionctx.Context, reader *bufio.Reader) ([][]types.Datum, error) { - retriever.parsedSlowLogCh = make(chan parsedSlowLog, 100) +func parseLog(retriever *slowQueryRetriever, sctx sessionctx.Context, reader *bufio.Reader, logNum int) ([][]types.Datum, error) { + retriever.taskList = make(chan slowLogTask, 100) ctx := context.Background() retriever.parseSlowLog(ctx, sctx, reader, 64) - slowLog := <-retriever.parsedSlowLogCh - rows, err := slowLog.rows, slowLog.err - if err == io.EOF { - err = nil + task, ok := <-retriever.taskList + if !ok { + return nil, nil } + var rows [][]types.Datum + var err error + result := <-task.resultCh + rows, err = result.rows, result.err return rows, err } -func parseSlowLog(sctx sessionctx.Context, reader *bufio.Reader) ([][]types.Datum, error) { +func parseSlowLog(sctx sessionctx.Context, reader *bufio.Reader, logNum int) ([][]types.Datum, error) { retriever := &slowQueryRetriever{} // Ignore the error is ok for test. - terror.Log(retriever.initialize(sctx)) - rows, err := parseLog(retriever, sctx, reader) + terror.Log(retriever.initialize(context.Background(), sctx)) + rows, err := parseLog(retriever, sctx, reader, logNum) return rows, err } @@ -68,6 +70,7 @@ func (s *testExecSerialSuite) TestParseSlowLogPanic(c *C) { # Mem_max: 70724 # Disk_max: 65536 # Plan_from_cache: true +# Plan_from_binding: true # Succ: false # Plan_digest: 60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4 # Prev_stmt: update t set i = 1; @@ -82,7 +85,7 @@ select * from t;` c.Assert(err, IsNil) sctx := mock.NewContext() sctx.GetSessionVars().TimeZone = loc - _, err = parseSlowLog(sctx, reader) + _, err = parseSlowLog(sctx, reader, 64) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "panic test") } @@ -95,14 +98,19 @@ func (s *testExecSuite) TestParseSlowLogFile(c *C) { # Exec_retry_time: 0.12 Exec_retry_count: 57 # Query_time: 0.216905 # Cop_time: 0.38 Process_time: 0.021 Request_count: 1 Total_keys: 637 Processed_keys: 436 +# Rocksdb_delete_skipped_count: 10 Rocksdb_key_skipped_count: 10 Rocksdb_block_cache_hit_count: 10 Rocksdb_block_read_count: 10 Rocksdb_block_read_byte: 100 # Is_internal: true # Digest: 42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772 # Stats: t1:1,t2:2 # Cop_proc_avg: 0.1 Cop_proc_p90: 0.2 Cop_proc_max: 0.03 Cop_proc_addr: 127.0.0.1:20160 # Cop_wait_avg: 0.05 Cop_wait_p90: 0.6 Cop_wait_max: 0.8 Cop_wait_addr: 0.0.0.0:20160 +# Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 +# Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 +# Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2 # Mem_max: 70724 # Disk_max: 65536 # Plan_from_cache: true +# Plan_from_binding: true # Succ: false # Plan_digest: 60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4 # Prev_stmt: update t set i = 1; @@ -113,7 +121,7 @@ select * from t;` c.Assert(err, IsNil) ctx := mock.NewContext() ctx.GetSessionVars().TimeZone = loc - rows, err := parseSlowLog(ctx, reader) + rows, err := parseSlowLog(ctx, reader, 64) c.Assert(err, IsNil) c.Assert(len(rows), Equals, 1) recordString := "" @@ -125,7 +133,36 @@ select * from t;` } recordString += str } - expectRecordString := "2019-04-28 15:24:04.309074,405888132465033227,root,localhost,0,57,0.12,0.216905,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,update t set i = 1;,select * from t;" + expectRecordString := `2019-04-28 15:24:04.309074,` + + `405888132465033227,root,localhost,0,57,0.12,0.216905,` + + `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,` + + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + + `0,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `update t set i = 1;,select * from t;` + c.Assert(expectRecordString, Equals, recordString) + + // Issue 20928 + reader = bufio.NewReader(bytes.NewBufferString(slowLogStr)) + rows, err = parseSlowLog(ctx, reader, 1) + c.Assert(err, IsNil) + c.Assert(len(rows), Equals, 1) + recordString = "" + for i, value := range rows[0] { + str, err := value.ToString() + c.Assert(err, IsNil) + if i > 0 { + recordString += "," + } + recordString += str + } + expectRecordString = `2019-04-28 15:24:04.309074,` + + `405888132465033227,root,localhost,0,57,0.12,0.216905,` + + `0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0.38,0.021,0,0,0,1,637,0,10,10,10,10,100,,,1,42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772,t1:1,t2:2,` + + `0.1,0.2,0.03,127.0.0.1:20160,0.05,0.6,0.8,0.0.0.0:20160,70724,65536,0,0,0,0,` + + `Cop_backoff_regionMiss_total_times: 200 Cop_backoff_regionMiss_total_time: 0.2 Cop_backoff_regionMiss_max_time: 0.2 Cop_backoff_regionMiss_max_addr: 127.0.0.1 Cop_backoff_regionMiss_avg_time: 0.2 Cop_backoff_regionMiss_p90_time: 0.2 Cop_backoff_rpcPD_total_times: 200 Cop_backoff_rpcPD_total_time: 0.2 Cop_backoff_rpcPD_max_time: 0.2 Cop_backoff_rpcPD_max_addr: 127.0.0.1 Cop_backoff_rpcPD_avg_time: 0.2 Cop_backoff_rpcPD_p90_time: 0.2 Cop_backoff_rpcTiKV_total_times: 200 Cop_backoff_rpcTiKV_total_time: 0.2 Cop_backoff_rpcTiKV_max_time: 0.2 Cop_backoff_rpcTiKV_max_addr: 127.0.0.1 Cop_backoff_rpcTiKV_avg_time: 0.2 Cop_backoff_rpcTiKV_p90_time: 0.2,` + + `0,0,1,1,,60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4,` + + `update t set i = 1;,select * from t;` c.Assert(expectRecordString, Equals, recordString) // fix sql contain '# ' bug @@ -143,7 +180,7 @@ select a# from t; select * from t; `) reader = bufio.NewReader(slowLog) - _, err = parseSlowLog(ctx, reader) + _, err = parseSlowLog(ctx, reader, 64) c.Assert(err, IsNil) // test for time format compatibility. @@ -154,7 +191,7 @@ select * from t; select * from t; `) reader = bufio.NewReader(slowLog) - rows, err = parseSlowLog(ctx, reader) + rows, err = parseSlowLog(ctx, reader, 64) c.Assert(err, IsNil) c.Assert(len(rows) == 2, IsTrue) t0Str, err := rows[0][0].ToString() @@ -171,7 +208,7 @@ select * from t; select * from t; `) reader = bufio.NewReader(slowLog) - _, err = parseSlowLog(ctx, reader) + _, err = parseSlowLog(ctx, reader, 64) c.Assert(err, IsNil) warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() c.Assert(warnings, HasLen, 1) @@ -195,13 +232,13 @@ select * from t; sql := strings.Repeat("x", int(variable.MaxOfMaxAllowedPacket+1)) slowLog.WriteString(sql) reader := bufio.NewReader(slowLog) - _, err = parseSlowLog(ctx, reader) + _, err = parseSlowLog(ctx, reader, 64) c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "single line length exceeds limit: 65536") variable.MaxOfMaxAllowedPacket = originValue reader = bufio.NewReader(slowLog) - _, err = parseSlowLog(ctx, reader) + _, err = parseSlowLog(ctx, reader, 64) c.Assert(err, IsNil) } @@ -252,17 +289,17 @@ select * from t;`) c.Assert(err, IsNil) ctx := mock.NewContext() ctx.GetSessionVars().TimeZone = loc - _, err = parseSlowLog(ctx, scanner) + _, err = parseSlowLog(ctx, scanner, 64) c.Assert(err, IsNil) // Test parser error. slowLog = bytes.NewBufferString( `# Time: 2019-05-12-11:23:29.614327491 +0800 # Txn_start_ts: 405888132465033227# +select * from t; `) - scanner = bufio.NewReader(slowLog) - _, err = parseSlowLog(ctx, scanner) + _, err = parseSlowLog(ctx, scanner, 64) c.Assert(err, IsNil) warnings := ctx.GetSessionVars().StmtCtx.GetWarnings() c.Assert(warnings, HasLen, 1) @@ -271,14 +308,6 @@ select * from t;`) } func (s *testExecSuite) TestSlowQueryRetriever(c *C) { - writeFile := func(file string, data string) { - f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) - c.Assert(err, IsNil) - _, err = f.Write([]byte(data)) - c.Assert(f.Close(), IsNil) - c.Assert(err, IsNil) - } - logData0 := "" logData1 := ` # Time: 2020-02-15T18:00:01.000000+08:00 @@ -297,20 +326,16 @@ select 5; select 6; # Time: 2020-04-15T18:00:05.299063744+08:00 select 7;` + logData := []string{logData0, logData1, logData2, logData3} fileName0 := "tidb-slow-2020-02-14T19-04-05.01.log" fileName1 := "tidb-slow-2020-02-15T19-04-05.01.log" fileName2 := "tidb-slow-2020-02-16T19-04-05.01.log" fileName3 := "tidb-slow.log" - writeFile(fileName0, logData0) - writeFile(fileName1, logData1) - writeFile(fileName2, logData2) - writeFile(fileName3, logData3) + fileNames := []string{fileName0, fileName1, fileName2, fileName3} + prepareLogs(c, logData, fileNames) defer func() { - os.Remove(fileName0) - os.Remove(fileName1) - os.Remove(fileName2) - os.Remove(fileName3) + removeFiles(fileNames) }() cases := []struct { @@ -410,18 +435,16 @@ select 7;` c.Assert(err, IsNil) endTime, err := ParseTime(cas.endTime) c.Assert(err, IsNil) - extractor.StartTime = startTime - extractor.EndTime = endTime - + extractor.TimeRanges = []*plannercore.TimeRange{{StartTime: startTime, EndTime: endTime}} } retriever := &slowQueryRetriever{extractor: extractor} - err := retriever.initialize(sctx) + err := retriever.initialize(context.Background(), sctx) c.Assert(err, IsNil) comment := Commentf("case id: %v", i) c.Assert(retriever.files, HasLen, len(cas.files), comment) if len(retriever.files) > 0 { reader := bufio.NewReader(retriever.files[0].file) - rows, err := parseLog(retriever, sctx, reader) + rows, err := parseLog(retriever, sctx, reader, 64) c.Assert(err, IsNil) c.Assert(len(rows), Equals, len(cas.querys), comment) for i, row := range rows { @@ -436,3 +459,144 @@ select 7;` c.Assert(retriever.close(), IsNil) } } + +func (s *testExecSuite) TestBatchLogForReversedScan(c *C) { + logData0 := "" + logData1 := ` +# Time: 2020-02-15T18:00:01.000000+08:00 +select 1; +# Time: 2020-02-15T19:00:05.000000+08:00 +select 2; +# Time: 2020-02-15T20:00:05.000000+08:00` + logData2 := `select 3; +# Time: 2020-02-16T18:00:01.000000+08:00 +select 4; +# Time: 2020-02-16T18:00:05.000000+08:00 +select 5;` + logData3 := ` +# Time: 2020-02-16T19:00:00.000000+08:00 +select 6; +# Time: 2020-02-17T18:00:05.000000+08:00 +select 7; +# Time: 2020-04-15T18:00:05.299063744+08:00` + logData4 := `select 8; +# Time: 2020-04-15T19:00:05.299063744+08:00 +select 9;` + logData := []string{logData0, logData1, logData2, logData3, logData4} + + fileName0 := "tidb-slow-2020-02-14T19-04-05.01.log" + fileName1 := "tidb-slow-2020-02-15T19-04-05.01.log" + fileName2 := "tidb-slow-2020-02-16T19-04-05.01.log" + fileName3 := "tidb-slow-2020-02-17T19-04-05.01.log" + fileName4 := "tidb-slow.log" + fileNames := []string{fileName0, fileName1, fileName2, fileName3, fileName4} + prepareLogs(c, logData, fileNames) + defer func() { + removeFiles(fileNames) + }() + + cases := []struct { + startTime string + endTime string + files []string + logs [][]string + }{ + { + startTime: "2020-02-15T18:00:00.000000+08:00", + endTime: "2020-02-15T19:00:00.000000+08:00", + files: []string{fileName1}, + logs: [][]string{ + {"# Time: 2020-02-15T19:00:05.000000+08:00", + "select 2;", + "# Time: 2020-02-15T18:00:01.000000+08:00", + "select 1;"}, + }, + }, + { + startTime: "2020-02-15T20:00:05.000000+08:00", + endTime: "2020-02-17T19:00:00.000000+08:00", + files: []string{fileName1, fileName2, fileName3}, + logs: [][]string{ + {"# Time: 2020-02-17T18:00:05.000000+08:00", + "select 7;", + "# Time: 2020-02-16T19:00:00.000000+08:00", + "select 6;", + "# Time: 2020-02-16T18:00:05.000000+08:00", + "select 5;", + "# Time: 2020-02-16T18:00:01.000000+08:00", + "select 4;", + "# Time: 2020-02-16T18:00:01.000000+08:00", + "select 3;"}, + }, + }, + { + startTime: "2020-02-16T19:00:00.000000+08:00", + endTime: "2020-04-15T20:00:00.000000+08:00", + files: []string{fileName3, fileName4}, + logs: [][]string{ + {"# Time: 2020-04-15T19:00:05.299063744+08:00", + "select 9;", + "Time: 2020-04-15T18:00:05.299063744+08:00", + "select 8;", + "# Time: 2020-02-17T18:00:05.000000+08:00", + "select 7;", + "# Time: 2020-02-16T19:00:00.000000+08:00", + "select 6;"}, + }, + }, + } + + loc, err := time.LoadLocation("Asia/Shanghai") + c.Assert(err, IsNil) + sctx := mock.NewContext() + sctx.GetSessionVars().TimeZone = loc + sctx.GetSessionVars().SlowQueryFile = fileName3 + for i, cas := range cases { + extractor := &plannercore.SlowQueryExtractor{Enable: (len(cas.startTime) > 0 && len(cas.endTime) > 0), Desc: true} + if extractor.Enable { + startTime, err := ParseTime(cas.startTime) + c.Assert(err, IsNil) + endTime, err := ParseTime(cas.endTime) + c.Assert(err, IsNil) + extractor.TimeRanges = []*plannercore.TimeRange{{StartTime: startTime, EndTime: endTime}} + } + retriever := &slowQueryRetriever{extractor: extractor} + sctx.GetSessionVars().SlowQueryFile = fileName4 + err := retriever.initialize(context.Background(), sctx) + c.Assert(err, IsNil) + comment := Commentf("case id: %v", i) + c.Assert(retriever.files, HasLen, len(cas.files), comment) + if len(retriever.files) > 0 { + reader := bufio.NewReader(retriever.files[0].file) + offset := &offset{length: 0, offset: 0} + rows, err := retriever.getBatchLogForReversedScan(context.Background(), reader, offset, 3) + c.Assert(err, IsNil) + for _, row := range rows { + for j, log := range row { + c.Assert(log, Equals, cas.logs[0][j], comment) + } + } + } + c.Assert(retriever.close(), IsNil) + } +} + +func prepareLogs(c *C, logData []string, fileNames []string) { + writeFile := func(file string, data string) { + f, err := os.OpenFile(file, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) + c.Assert(err, IsNil) + _, err = f.Write([]byte(data)) + c.Assert(f.Close(), IsNil) + c.Assert(err, IsNil) + } + + for i, log := range logData { + writeFile(fileNames[i], log) + } +} + +func removeFiles(fileNames []string) { + for _, fileName := range fileNames { + os.Remove(fileName) + } +} diff --git a/executor/sort.go b/executor/sort.go index 5589224abe70b..5259ae0041e6e 100644 --- a/executor/sort.go +++ b/executor/sort.go @@ -19,12 +19,12 @@ import ( "errors" "sort" + "github.com/cznic/mathutil" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/expression" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/planner/util" - "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/disk" "github.com/pingcap/tidb/util/memory" @@ -39,8 +39,6 @@ type SortExec struct { fetched bool schema *expression.Schema - keyExprs []expression.Expression - keyTypes []*types.FieldType // keyColumns is the column index of the by items. keyColumns []int // keyCmpFuncs is used to compare each ByItem. @@ -407,10 +405,14 @@ func (e *TopNExec) Next(ctx context.Context, req *chunk.Chunk) error { if e.Idx >= len(e.rowPtrs) { return nil } - for !req.IsFull() && e.Idx < len(e.rowPtrs) { - row := e.rowChunks.GetRow(e.rowPtrs[e.Idx]) - req.AppendRow(row) - e.Idx++ + if !req.IsFull() { + numToAppend := mathutil.Min(len(e.rowPtrs)-e.Idx, req.RequiredRows()-req.NumRows()) + rows := make([]chunk.Row, numToAppend) + for index := 0; index < numToAppend; index++ { + rows[index] = e.rowChunks.GetRow(e.rowPtrs[e.Idx]) + e.Idx++ + } + req.AppendRows(rows) } return nil } diff --git a/executor/sort_test.go b/executor/sort_test.go index d1c20e2a6b7ca..32ded8ff0da71 100644 --- a/executor/sort_test.go +++ b/executor/sort_test.go @@ -21,6 +21,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/testkit" ) @@ -85,6 +86,10 @@ func (s *testSerialSuite1) TestIssue16696(c *C) { config.UpdateGlobal(func(conf *config.Config) { conf.OOMUseTmpStorage = true }) + alarmRatio := variable.MemoryUsageAlarmRatio.Load() + variable.MemoryUsageAlarmRatio.Store(0.0) + defer variable.MemoryUsageAlarmRatio.Store(alarmRatio) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill", "return(true)"), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/testSortedRowContainerSpill"), IsNil) diff --git a/executor/split.go b/executor/split.go old mode 100755 new mode 100644 index 992e7a4fdd67a..6cdd953772834 --- a/executor/split.go +++ b/executor/split.go @@ -22,7 +22,6 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -58,6 +57,7 @@ type SplitIndexRegionExec struct { splitRegionResult } +// nolint:structcheck type splitRegionResult struct { splitRegions int finishScatterNum int @@ -237,12 +237,11 @@ func (e *SplitIndexRegionExec) getSplitIdxPhysicalKeysFromBound(physicalID int64 } if bytes.Compare(lowerIdxKey, upperIdxKey) >= 0 { - lowerStr, err1 := datumSliceToString(e.lower) - upperStr, err2 := datumSliceToString(e.upper) - if err1 != nil || err2 != nil { - return nil, errors.Errorf("Split index `%v` region lower value %v should less than the upper value %v", e.indexInfo.Name, e.lower, e.upper) - } - return nil, errors.Errorf("Split index `%v` region lower value %v should less than the upper value %v", e.indexInfo.Name, lowerStr, upperStr) + lowerStr := datumSliceToString(e.lower) + upperStr := datumSliceToString(e.upper) + errMsg := fmt.Sprintf("Split index `%v` region lower value %v should less than the upper value %v", + e.indexInfo.Name, lowerStr, upperStr) + return nil, ErrInvalidSplitRegionRanges.GenWithStackByArgs(errMsg) } return getValuesList(lowerIdxKey, upperIdxKey, e.num, keys), nil } @@ -303,12 +302,12 @@ func getUint64FromBytes(bs []byte, pad byte) uint64 { return binary.BigEndian.Uint64(buf) } -func datumSliceToString(ds []types.Datum) (string, error) { +func datumSliceToString(ds []types.Datum) string { str := "(" for i, d := range ds { s, err := d.ToString() if err != nil { - return str, err + return fmt.Sprintf("%v", ds) } if i > 0 { str += "," @@ -316,7 +315,7 @@ func datumSliceToString(ds []types.Datum) (string, error) { str += s } str += ")" - return str, nil + return str } // SplitTableRegionExec represents a split table regions executor. @@ -546,7 +545,8 @@ func (e *SplitTableRegionExec) calculateIntBoundValue() (lowerValue int64, step lowerRecordID := e.lower[0].GetUint64() upperRecordID := e.upper[0].GetUint64() if upperRecordID <= lowerRecordID { - return 0, 0, errors.Errorf("Split table `%s` region lower value %v should less than the upper value %v", e.tableInfo.Name, lowerRecordID, upperRecordID) + errMsg := fmt.Sprintf("lower value %v should less than the upper value %v", lowerRecordID, upperRecordID) + return 0, 0, ErrInvalidSplitRegionRanges.GenWithStackByArgs(errMsg) } step = int64((upperRecordID - lowerRecordID) / uint64(e.num)) lowerValue = int64(lowerRecordID) @@ -554,13 +554,15 @@ func (e *SplitTableRegionExec) calculateIntBoundValue() (lowerValue int64, step lowerRecordID := e.lower[0].GetInt64() upperRecordID := e.upper[0].GetInt64() if upperRecordID <= lowerRecordID { - return 0, 0, errors.Errorf("Split table `%s` region lower value %v should less than the upper value %v", e.tableInfo.Name, lowerRecordID, upperRecordID) + errMsg := fmt.Sprintf("lower value %v should less than the upper value %v", lowerRecordID, upperRecordID) + return 0, 0, ErrInvalidSplitRegionRanges.GenWithStackByArgs(errMsg) } - step = (upperRecordID - lowerRecordID) / int64(e.num) + step = int64(uint64(upperRecordID-lowerRecordID) / uint64(e.num)) lowerValue = lowerRecordID } if step < minRegionStepValue { - return 0, 0, errors.Errorf("Split table `%s` region step value should more than %v, step %v is invalid", e.tableInfo.Name, minRegionStepValue, step) + errMsg := fmt.Sprintf("the region size is too small, expected at least %d, but got %d", step, minRegionStepValue) + return 0, 0, ErrInvalidSplitRegionRanges.GenWithStackByArgs(errMsg) } return lowerValue, step, nil } @@ -595,14 +597,11 @@ func (e *SplitTableRegionExec) getSplitTablePhysicalKeysFromBound(physicalID int return nil, err } if lowerHandle.Compare(upperHandle) >= 0 { - lowerStr, err1 := datumSliceToString(e.lower) - upperStr, err2 := datumSliceToString(e.upper) - if err1 != nil || err2 != nil { - return nil, errors.Errorf("Split table `%v` region lower value %v should less than the upper value %v", - e.tableInfo.Name.O, e.lower, e.upper) - } - return nil, errors.Errorf("Split table `%v` region lower value %v should less than the upper value %v", + lowerStr := datumSliceToString(e.lower) + upperStr := datumSliceToString(e.upper) + errMsg := fmt.Sprintf("Split table `%v` region lower value %v should less than the upper value %v", e.tableInfo.Name.O, lowerStr, upperStr) + return nil, ErrInvalidSplitRegionRanges.GenWithStackByArgs(errMsg) } low := tablecodec.EncodeRecordKey(recordPrefix, lowerHandle) up := tablecodec.EncodeRecordKey(recordPrefix, upperHandle) @@ -623,10 +622,15 @@ type regionMeta struct { approximateKeys int64 } -func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo, tikvStore tikv.Storage, s kv.SplittableStore, uniqueRegionMap map[uint64]struct{}) ([]regionMeta, error) { +func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo, tikvStore helper.Storage, s kv.SplittableStore, uniqueRegionMap map[uint64]struct{}) ([]regionMeta, error) { if uniqueRegionMap == nil { uniqueRegionMap = make(map[uint64]struct{}) } + // This is used to decode the int handle properly. + var hasUnsignedIntHandle bool + if pkInfo := tableInfo.GetPkColInfo(); pkInfo != nil { + hasUnsignedIntHandle = mysql.HasUnsignedFlag(pkInfo.Flag) + } // for record startKey, endKey := tablecodec.GetTableHandleKeyRange(physicalTableID) regionCache := tikvStore.GetRegionCache() @@ -636,7 +640,7 @@ func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo, } recordPrefix := tablecodec.GenTableRecordPrefix(physicalTableID) tablePrefix := tablecodec.GenTablePrefix(physicalTableID) - recordRegions, err := getRegionMeta(tikvStore, recordRegionMetas, uniqueRegionMap, tablePrefix, recordPrefix, nil, physicalTableID, 0) + recordRegions, err := getRegionMeta(tikvStore, recordRegionMetas, uniqueRegionMap, tablePrefix, recordPrefix, nil, physicalTableID, 0, hasUnsignedIntHandle) if err != nil { return nil, err } @@ -653,7 +657,7 @@ func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo, return nil, err } indexPrefix := tablecodec.EncodeTableIndexPrefix(physicalTableID, index.ID) - indexRegions, err := getRegionMeta(tikvStore, regionMetas, uniqueRegionMap, tablePrefix, recordPrefix, indexPrefix, physicalTableID, index.ID) + indexRegions, err := getRegionMeta(tikvStore, regionMetas, uniqueRegionMap, tablePrefix, recordPrefix, indexPrefix, physicalTableID, index.ID, hasUnsignedIntHandle) if err != nil { return nil, err } @@ -666,7 +670,7 @@ func getPhysicalTableRegions(physicalTableID int64, tableInfo *model.TableInfo, return regions, nil } -func getPhysicalIndexRegions(physicalTableID int64, indexInfo *model.IndexInfo, tikvStore tikv.Storage, s kv.SplittableStore, uniqueRegionMap map[uint64]struct{}) ([]regionMeta, error) { +func getPhysicalIndexRegions(physicalTableID int64, indexInfo *model.IndexInfo, tikvStore helper.Storage, s kv.SplittableStore, uniqueRegionMap map[uint64]struct{}) ([]regionMeta, error) { if uniqueRegionMap == nil { uniqueRegionMap = make(map[uint64]struct{}) } @@ -680,7 +684,7 @@ func getPhysicalIndexRegions(physicalTableID int64, indexInfo *model.IndexInfo, recordPrefix := tablecodec.GenTableRecordPrefix(physicalTableID) tablePrefix := tablecodec.GenTablePrefix(physicalTableID) indexPrefix := tablecodec.EncodeTableIndexPrefix(physicalTableID, indexInfo.ID) - indexRegions, err := getRegionMeta(tikvStore, regions, uniqueRegionMap, tablePrefix, recordPrefix, indexPrefix, physicalTableID, indexInfo.ID) + indexRegions, err := getRegionMeta(tikvStore, regions, uniqueRegionMap, tablePrefix, recordPrefix, indexPrefix, physicalTableID, indexInfo.ID, false) if err != nil { return nil, err } @@ -702,13 +706,15 @@ func checkRegionsStatus(store kv.SplittableStore, regions []regionMeta) error { return nil } -func decodeRegionsKey(regions []regionMeta, tablePrefix, recordPrefix, indexPrefix []byte, physicalTableID, indexID int64) { +func decodeRegionsKey(regions []regionMeta, tablePrefix, recordPrefix, indexPrefix []byte, + physicalTableID, indexID int64, hasUnsignedIntHandle bool) { d := ®ionKeyDecoder{ - physicalTableID: physicalTableID, - tablePrefix: tablePrefix, - recordPrefix: recordPrefix, - indexPrefix: indexPrefix, - indexID: indexID, + physicalTableID: physicalTableID, + tablePrefix: tablePrefix, + recordPrefix: recordPrefix, + indexPrefix: indexPrefix, + indexID: indexID, + hasUnsignedIntHandle: hasUnsignedIntHandle, } for i := range regions { regions[i].start = d.decodeRegionKey(regions[i].region.StartKey) @@ -717,11 +723,12 @@ func decodeRegionsKey(regions []regionMeta, tablePrefix, recordPrefix, indexPref } type regionKeyDecoder struct { - physicalTableID int64 - tablePrefix []byte - recordPrefix []byte - indexPrefix []byte - indexID int64 + physicalTableID int64 + tablePrefix []byte + recordPrefix []byte + indexPrefix []byte + indexID int64 + hasUnsignedIntHandle bool } func (d *regionKeyDecoder) decodeRegionKey(key []byte) string { @@ -735,6 +742,9 @@ func (d *regionKeyDecoder) decodeRegionKey(key []byte) string { if isIntHandle { _, handle, err := codec.DecodeInt(key[len(d.recordPrefix):]) if err == nil { + if d.hasUnsignedIntHandle { + return fmt.Sprintf("t_%d_r_%d", d.physicalTableID, uint64(handle)) + } return fmt.Sprintf("t_%d_r_%d", d.physicalTableID, handle) } } @@ -765,7 +775,9 @@ func (d *regionKeyDecoder) decodeRegionKey(key []byte) string { return fmt.Sprintf("%x", key) } -func getRegionMeta(tikvStore tikv.Storage, regionMetas []*tikv.Region, uniqueRegionMap map[uint64]struct{}, tablePrefix, recordPrefix, indexPrefix []byte, physicalTableID, indexID int64) ([]regionMeta, error) { +func getRegionMeta(tikvStore helper.Storage, regionMetas []*tikv.Region, uniqueRegionMap map[uint64]struct{}, + tablePrefix, recordPrefix, indexPrefix []byte, physicalTableID, indexID int64, + hasUnsignedIntHandle bool) ([]regionMeta, error) { regions := make([]regionMeta, 0, len(regionMetas)) for _, r := range regionMetas { if _, ok := uniqueRegionMap[r.GetID()]; ok { @@ -782,13 +794,13 @@ func getRegionMeta(tikvStore tikv.Storage, regionMetas []*tikv.Region, uniqueReg if err != nil { return regions, err } - decodeRegionsKey(regions, tablePrefix, recordPrefix, indexPrefix, physicalTableID, indexID) + decodeRegionsKey(regions, tablePrefix, recordPrefix, indexPrefix, physicalTableID, indexID, hasUnsignedIntHandle) return regions, nil } -func getRegionInfo(store tikv.Storage, regions []regionMeta) ([]regionMeta, error) { +func getRegionInfo(store helper.Storage, regions []regionMeta) ([]regionMeta, error) { // check pd server exists. - etcd, ok := store.(tikv.EtcdBackend) + etcd, ok := store.(kv.EtcdBackend) if !ok { return regions, nil } diff --git a/executor/split_test.go b/executor/split_test.go index 5476e57f9c899..b457a08a560da 100644 --- a/executor/split_test.go +++ b/executor/split_test.go @@ -368,9 +368,10 @@ func (s *testSplitIndex) TestSplitTable(c *C) { func (s *testSplitIndex) TestClusterIndexSplitTable(c *C) { tbInfo := &model.TableInfo{ - Name: model.NewCIStr("t"), - ID: 1, - IsCommonHandle: true, + Name: model.NewCIStr("t"), + ID: 1, + IsCommonHandle: true, + CommonHandleVersion: 1, Indices: []*model.IndexInfo{ { ID: 1, diff --git a/executor/table_reader.go b/executor/table_reader.go index 9167993c8fc50..651dfa1213712 100644 --- a/executor/table_reader.go +++ b/executor/table_reader.go @@ -21,11 +21,13 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" @@ -63,7 +65,7 @@ type TableReaderExecutor struct { table table.Table // The source of key ranges varies from case to case. - // It may be calculated from PyhsicalPlan by executorBuilder, or calculated from argument by dataBuilder; + // It may be calculated from PhysicalPlan by executorBuilder, or calculated from argument by dataBuilder; // It may be calculated from ranger.Ranger, or calculated from handles. // The table ID may also change because of the partition table, and causes the key range to change. // So instead of keeping a `range` struct field, it's better to define a interface. @@ -105,7 +107,7 @@ type TableReaderExecutor struct { batchCop bool } -// Open initialzes necessary variables for using this executor. +// Open initializes necessary variables for using this executor. func (e *TableReaderExecutor) Open(ctx context.Context) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("TableReaderExecutor.Open", opentracing.ChildOf(span.Context())) @@ -138,10 +140,27 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { if e.corColInAccess { ts := e.plans[0].(*plannercore.PhysicalTableScan) access := ts.AccessCondition - pkTP := ts.Table.GetPkColInfo().FieldType - e.ranges, err = ranger.BuildTableRange(access, e.ctx.GetSessionVars().StmtCtx, &pkTP) - if err != nil { - return err + if e.table.Meta().IsCommonHandle { + pkIdx := tables.FindPrimaryIndex(ts.Table) + idxCols, idxColLens := expression.IndexInfo2PrefixCols(ts.Columns, ts.Schema().Columns, pkIdx) + for _, cond := range access { + newCond, err1 := expression.SubstituteCorCol2Constant(cond) + if err1 != nil { + return err1 + } + access = append(access, newCond) + } + res, err := ranger.DetachCondAndBuildRangeForIndex(e.ctx, access, idxCols, idxColLens) + if err != nil { + return err + } + e.ranges = res.Ranges + } else { + pkTP := ts.Table.GetPkColInfo().FieldType + e.ranges, err = ranger.BuildTableRange(access, e.ctx.GetSessionVars().StmtCtx, &pkTP) + if err != nil { + return err + } } } @@ -154,7 +173,7 @@ func (e *TableReaderExecutor) Open(ctx context.Context) error { e.feedback.Invalidate() } } - firstPartRanges, secondPartRanges := splitRanges(e.ranges, e.keepOrder, e.desc) + firstPartRanges, secondPartRanges := distsql.SplitRangesBySign(e.ranges, e.keepOrder, e.desc, e.table.Meta() != nil && e.table.Meta().IsCommonHandle) firstResult, err := e.buildResp(ctx, firstPartRanges) if err != nil { e.feedback.Invalidate() @@ -219,10 +238,8 @@ func (e *TableReaderExecutor) buildResp(ctx context.Context, ranges []*ranger.Ra return nil, err } reqBuilder = builder.SetKeyRanges(kvRange) - } else if e.table.Meta() != nil && e.table.Meta().IsCommonHandle { - reqBuilder = builder.SetCommonHandleRanges(e.ctx.GetSessionVars().StmtCtx, getPhysicalTableID(e.table), ranges) } else { - reqBuilder = builder.SetTableRanges(getPhysicalTableID(e.table), ranges, e.feedback) + reqBuilder = builder.SetHandleRanges(e.ctx.GetSessionVars().StmtCtx, getPhysicalTableID(e.table), e.table.Meta() != nil && e.table.Meta().IsCommonHandle, ranges, e.feedback) } kvReq, err := reqBuilder. SetDAGRequest(e.dagPB). @@ -234,6 +251,7 @@ func (e *TableReaderExecutor) buildResp(ctx context.Context, ranges []*ranger.Ra SetMemTracker(e.memTracker). SetStoreType(e.storeType). SetAllowBatchCop(e.batchCop). + SetFromInfoSchema(infoschema.GetInfoSchema(e.ctx)). Build() if err != nil { return nil, err diff --git a/executor/table_readers_required_rows_test.go b/executor/table_readers_required_rows_test.go index ac1e8d4ba5406..ef7ef625d7d0f 100644 --- a/executor/table_readers_required_rows_test.go +++ b/executor/table_readers_required_rows_test.go @@ -89,16 +89,24 @@ func (r *requiredRowsSelectResult) genValue(valType *types.FieldType) interface{ } } +type totalRowsContextKey struct{} + +var totalRowsKey = totalRowsContextKey{} + +type expectedRowsRetContextKey struct{} + +var expectedRowsRetKey = expectedRowsRetContextKey{} + func mockDistsqlSelectCtxSet(totalRows int, expectedRowsRet []int) context.Context { ctx := context.Background() - ctx = context.WithValue(ctx, "totalRows", totalRows) - ctx = context.WithValue(ctx, "expectedRowsRet", expectedRowsRet) + ctx = context.WithValue(ctx, totalRowsKey, totalRows) + ctx = context.WithValue(ctx, expectedRowsRetKey, expectedRowsRet) return ctx } func mockDistsqlSelectCtxGet(ctx context.Context) (totalRows int, expectedRowsRet []int) { - totalRows = ctx.Value("totalRows").(int) - expectedRowsRet = ctx.Value("expectedRowsRet").([]int) + totalRows = ctx.Value(totalRowsKey).(int) + expectedRowsRet = ctx.Value(expectedRowsRetKey).([]int) return } @@ -123,8 +131,7 @@ func buildTableReader(sctx sessionctx.Context) Executor { } func buildMockDAGRequest(sctx sessionctx.Context) *tipb.DAGRequest { - builder := newExecutorBuilder(sctx, nil) - req, _, err := builder.constructDAGReq([]core.PhysicalPlan{&core.PhysicalTableScan{ + req, _, err := constructDAGReq(sctx, []core.PhysicalPlan{&core.PhysicalTableScan{ Columns: []*model.ColumnInfo{}, Table: &model.TableInfo{ID: 12345, PKIsHandle: false}, Desc: false, diff --git a/executor/testdata/agg_suite_in.json b/executor/testdata/agg_suite_in.json index d6d251ea979f2..d53b8e044c656 100644 --- a/executor/testdata/agg_suite_in.json +++ b/executor/testdata/agg_suite_in.json @@ -2,9 +2,9 @@ { "name": "TestInjectProjBelowTopN", "cases": [ - "explain select * from t order by i + 1", + "explain format = 'brief' select * from t order by i + 1", "select * from t order by i + 1", - "explain select * from t order by i + 1 limit 2", + "explain format = 'brief' select * from t order by i + 1 limit 2", "select * from t order by i + 1 limit 2", "select i, i, i from t order by i + 1" ] @@ -13,7 +13,7 @@ "name": "TestIssue12759HashAggCalledByApply", "cases": [ // make sure the plan is Apply -> Apply -> Apply -> HashAgg, and the count of Apply is equal to HashAggFinalConcurrency-1. - "explain select /*+ hash_agg() */ sum(a), (select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1) from test tt" + "explain format = 'brief' select /*+ hash_agg() */ sum(a), (select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1),(select NULL from test where tt.a = test.a limit 1) from test tt" ] } -] \ No newline at end of file +] diff --git a/executor/testdata/agg_suite_out.json b/executor/testdata/agg_suite_out.json index e08615e35c570..325f9dd48972c 100644 --- a/executor/testdata/agg_suite_out.json +++ b/executor/testdata/agg_suite_out.json @@ -3,11 +3,11 @@ "Name": "TestInjectProjBelowTopN", "Cases": [ [ - "Projection_10 10000.00 root test.t.i", - "└─Sort_4 10000.00 root Column#3", - " └─Projection_11 10000.00 root test.t.i, plus(test.t.i, 1)->Column#3", - " └─TableReader_8 10000.00 root data:TableFullScan_7", - " └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 10000.00 root test.t.i", + "└─Sort 10000.00 root Column#3", + " └─Projection 10000.00 root test.t.i, plus(test.t.i, 1)->Column#3", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], [ "1", @@ -21,12 +21,12 @@ "3" ], [ - "Projection_15 2.00 root test.t.i", - "└─TopN_7 2.00 root Column#3, offset:0, count:2", - " └─Projection_16 2.00 root test.t.i, plus(test.t.i, 1)->Column#3", - " └─TableReader_12 2.00 root data:TopN_11", - " └─TopN_11 2.00 cop[tikv] plus(test.t.i, 1), offset:0, count:2", - " └─TableFullScan_10 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 2.00 root test.t.i", + "└─TopN 2.00 root Column#3, offset:0, count:2", + " └─Projection 2.00 root test.t.i, plus(test.t.i, 1)->Column#3", + " └─TableReader 2.00 root data:TopN", + " └─TopN 2.00 cop[tikv] plus(test.t.i, 1), offset:0, count:2", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], [ "1", @@ -49,32 +49,32 @@ "Name": "TestIssue12759HashAggCalledByApply", "Cases": [ [ - "Projection_28 1.00 root Column#3, Column#6, Column#9, Column#12", - "└─Apply_30 1.00 root CARTESIAN left outer join", - " ├─Apply_32(Build) 1.00 root CARTESIAN left outer join", - " │ ├─Apply_34(Build) 1.00 root CARTESIAN left outer join", - " │ │ ├─HashAgg_39(Build) 1.00 root funcs:sum(Column#22)->Column#3, funcs:firstrow(Column#23)->test.test.a", - " │ │ │ └─TableReader_40 1.00 root data:HashAgg_35", - " │ │ │ └─HashAgg_35 1.00 cop[tikv] funcs:sum(test.test.a)->Column#22, funcs:firstrow(test.test.a)->Column#23", - " │ │ │ └─TableFullScan_38 10000.00 cop[tikv] table:tt keep order:false, stats:pseudo", - " │ │ └─Projection_43(Probe) 1.00 root ->Column#6", - " │ │ └─Limit_44 1.00 root offset:0, count:1", - " │ │ └─TableReader_50 1.00 root data:Limit_49", - " │ │ └─Limit_49 1.00 cop[tikv] offset:0, count:1", - " │ │ └─Selection_48 1.00 cop[tikv] eq(test.test.a, test.test.a)", - " │ │ └─TableFullScan_47 1000.00 cop[tikv] table:test keep order:false, stats:pseudo", - " │ └─Projection_54(Probe) 1.00 root ->Column#9", - " │ └─Limit_55 1.00 root offset:0, count:1", - " │ └─TableReader_61 1.00 root data:Limit_60", - " │ └─Limit_60 1.00 cop[tikv] offset:0, count:1", - " │ └─Selection_59 1.00 cop[tikv] eq(test.test.a, test.test.a)", - " │ └─TableFullScan_58 1000.00 cop[tikv] table:test keep order:false, stats:pseudo", - " └─Projection_65(Probe) 1.00 root ->Column#12", - " └─Limit_66 1.00 root offset:0, count:1", - " └─TableReader_72 1.00 root data:Limit_71", - " └─Limit_71 1.00 cop[tikv] offset:0, count:1", - " └─Selection_70 1.00 cop[tikv] eq(test.test.a, test.test.a)", - " └─TableFullScan_69 1000.00 cop[tikv] table:test keep order:false, stats:pseudo" + "Projection 1.00 root Column#9, Column#10, Column#11, Column#12", + "└─Apply 1.00 root CARTESIAN left outer join", + " ├─Apply(Build) 1.00 root CARTESIAN left outer join", + " │ ├─Apply(Build) 1.00 root CARTESIAN left outer join", + " │ │ ├─HashAgg(Build) 1.00 root funcs:sum(Column#22)->Column#9, funcs:firstrow(Column#23)->test.test.a", + " │ │ │ └─Projection 10000.00 root cast(test.test.a, decimal(32,0) BINARY)->Column#22, test.test.a", + " │ │ │ └─TableReader 10000.00 root data:TableFullScan", + " │ │ │ └─TableFullScan 10000.00 cop[tikv] table:tt keep order:false, stats:pseudo", + " │ │ └─Projection(Probe) 1.00 root ->Column#10", + " │ │ └─Limit 1.00 root offset:0, count:1", + " │ │ └─TableReader 1.00 root data:Limit", + " │ │ └─Limit 1.00 cop[tikv] offset:0, count:1", + " │ │ └─Selection 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " │ │ └─TableFullScan 1000.00 cop[tikv] table:test keep order:false, stats:pseudo", + " │ └─Projection(Probe) 1.00 root ->Column#11", + " │ └─Limit 1.00 root offset:0, count:1", + " │ └─TableReader 1.00 root data:Limit", + " │ └─Limit 1.00 cop[tikv] offset:0, count:1", + " │ └─Selection 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " │ └─TableFullScan 1000.00 cop[tikv] table:test keep order:false, stats:pseudo", + " └─Projection(Probe) 1.00 root ->Column#12", + " └─Limit 1.00 root offset:0, count:1", + " └─TableReader 1.00 root data:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─Selection 1.00 cop[tikv] eq(test.test.a, test.test.a)", + " └─TableFullScan 1000.00 cop[tikv] table:test keep order:false, stats:pseudo" ] ] } diff --git a/executor/testdata/executor_suite_in.json b/executor/testdata/executor_suite_in.json index c4ba3926468d8..6abd20c740a80 100644 --- a/executor/testdata/executor_suite_in.json +++ b/executor/testdata/executor_suite_in.json @@ -30,5 +30,26 @@ "select * from t1 union all select * from t2 intersect select * from t3", "select * from t1 except select * from t2 intersect select * from t3" ] + }, + { + "name": "TestNaturalJoin", + "cases": [ + "select * from t1 natural join t2", + "select * from t1 natural left join t2 order by a", + "select * from t1 natural right join t2 order by a", + "SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a)" + ] + }, + { + "name": "TestIndexScanWithYearCol", + "cases": [ + "select t1.c1, t2.c1 from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select * from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select count(*) from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select t1.c1, t2.c1 from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select * from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select count(*) from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "select * from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 is not NULL" + ] } ] diff --git a/executor/testdata/executor_suite_out.json b/executor/testdata/executor_suite_out.json index f147eed700107..ba85bc0a8ca62 100644 --- a/executor/testdata/executor_suite_out.json +++ b/executor/testdata/executor_suite_out.json @@ -5,12 +5,12 @@ { "SQL": "select * from t3 union select * from t1", "Plan": [ - "HashAgg_11 16000.00 root group by:Column#5, funcs:firstrow(Column#5)->Column#5", - "└─Union_12 20000.00 root ", - " ├─TableReader_15 10000.00 root data:TableFullScan_14", - " │ └─TableFullScan_14 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─TableReader_18 10000.00 root data:TableFullScan_17", - " └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashAgg_9 16000.00 root group by:Column#5, funcs:firstrow(Column#5)->Column#5", + "└─Union_10 20000.00 root ", + " ├─TableReader_13 10000.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─TableReader_16 10000.00 root data:TableFullScan_15", + " └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Res": [ "1", @@ -100,14 +100,14 @@ "SQL": "select * from t1 union all select * from t2 except select * from t3", "Plan": [ "HashJoin_12 12800.00 root anti semi join, equal:[nulleq(Column#7, test.t3.a)]", - "├─TableReader_25(Build) 10000.00 root data:TableFullScan_24", - "│ └─TableFullScan_24 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─HashAgg_15(Probe) 16000.00 root group by:Column#7, funcs:firstrow(Column#7)->Column#7", - " └─Union_16 20000.00 root ", - " ├─TableReader_19 10000.00 root data:TableFullScan_18", - " │ └─TableFullScan_18 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader_22 10000.00 root data:TableFullScan_21", - " └─TableFullScan_21 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "├─TableReader_23(Build) 10000.00 root data:TableFullScan_22", + "│ └─TableFullScan_22 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashAgg_13(Probe) 16000.00 root group by:Column#7, funcs:firstrow(Column#7)->Column#7", + " └─Union_14 20000.00 root ", + " ├─TableReader_17 10000.00 root data:TableFullScan_16", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader_20 10000.00 root data:TableFullScan_19", + " └─TableFullScan_19 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Res": [ "1", @@ -220,15 +220,15 @@ { "SQL": "select * from t1 union (select * from t2 union all select * from t3)", "Plan": [ - "HashAgg_16 24000.00 root group by:Column#8, funcs:firstrow(Column#8)->Column#8", - "└─Union_17 30000.00 root ", - " ├─TableReader_20 10000.00 root data:TableFullScan_19", - " │ └─TableFullScan_19 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─Union_22 20000.00 root ", - " ├─TableReader_25 10000.00 root data:TableFullScan_24", - " │ └─TableFullScan_24 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_28 10000.00 root data:TableFullScan_27", - " └─TableFullScan_27 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + "HashAgg_14 24000.00 root group by:Column#8, funcs:firstrow(Column#8)->Column#8", + "└─Union_15 30000.00 root ", + " ├─TableReader_18 10000.00 root data:TableFullScan_17", + " │ └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─Union_20 20000.00 root ", + " ├─TableReader_23 10000.00 root data:TableFullScan_22", + " │ └─TableFullScan_22 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader_26 10000.00 root data:TableFullScan_25", + " └─TableFullScan_25 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], "Res": [ "1", @@ -241,12 +241,12 @@ "SQL": "(select * from t1 intersect select * from t1) except (select * from t2 union select * from t3)", "Plan": [ "HashJoin_18 5120.00 root anti semi join, equal:[nulleq(test.t1.a, Column#9)]", - "├─HashAgg_33(Build) 16000.00 root group by:Column#9, funcs:firstrow(Column#9)->Column#9", - "│ └─Union_34 20000.00 root ", - "│ ├─TableReader_37 10000.00 root data:TableFullScan_36", - "│ │ └─TableFullScan_36 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "│ └─TableReader_40 10000.00 root data:TableFullScan_39", - "│ └─TableFullScan_39 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "├─HashAgg_31(Build) 16000.00 root group by:Column#9, funcs:firstrow(Column#9)->Column#9", + "│ └─Union_32 20000.00 root ", + "│ ├─TableReader_35 10000.00 root data:TableFullScan_34", + "│ │ └─TableFullScan_34 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─TableReader_38 10000.00 root data:TableFullScan_37", + "│ └─TableFullScan_37 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", "└─HashJoin_20(Probe) 6400.00 root semi join, equal:[nulleq(test.t1.a, test.t1.a)]", " ├─TableReader_30(Build) 10000.00 root data:TableFullScan_29", " │ └─TableFullScan_29 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", @@ -264,13 +264,13 @@ { "SQL": "select * from t3 union select * from t1", "Plan": [ - "HashAgg_11 16000.00 root group by:Column#7, Column#8, funcs:firstrow(Column#7)->Column#7, funcs:firstrow(Column#8)->Column#8", - "└─Union_12 20000.00 root ", - " ├─TableReader_15 10000.00 root data:TableFullScan_14", - " │ └─TableFullScan_14 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─Projection_16 10000.00 root test.t1.a, cast(test.t1.b, decimal(30,10) BINARY)->Column#8", - " └─TableReader_18 10000.00 root data:TableFullScan_17", - " └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashAgg_9 16000.00 root group by:Column#7, Column#8, funcs:firstrow(Column#7)->Column#7, funcs:firstrow(Column#8)->Column#8", + "└─Union_10 20000.00 root ", + " ├─TableReader_13 10000.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─Projection_14 10000.00 root test.t1.a, cast(test.t1.b, decimal(30,10) BINARY)->Column#8", + " └─TableReader_16 10000.00 root data:TableFullScan_15", + " └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Res": [ "1 1.0000000000", @@ -338,13 +338,13 @@ "SQL": "select * from t1 union all select * from t2 union all select * from t3", "Plan": [ "Union_11 30000.00 root ", - "├─Projection_12 10000.00 root test.t1.a, cast(test.t1.b, varbinary(30) BINARY)->Column#11", + "├─Projection_12 10000.00 root test.t1.a, cast(test.t1.b, varchar(30) BINARY CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#11", "│ └─TableReader_14 10000.00 root data:TableFullScan_13", "│ └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "├─Projection_15 10000.00 root test.t2.a, cast(test.t2.b, varbinary(30) BINARY)->Column#11", + "├─Projection_15 10000.00 root test.t2.a, cast(test.t2.b, varchar(30) BINARY CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#11", "│ └─TableReader_17 10000.00 root data:TableFullScan_16", "│ └─TableFullScan_16 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─Projection_18 10000.00 root test.t3.a, cast(test.t3.b, varbinary(30) BINARY)->Column#11", + "└─Projection_18 10000.00 root test.t3.a, cast(test.t3.b, varchar(30) BINARY CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#11", " └─TableReader_20 10000.00 root data:TableFullScan_19", " └─TableFullScan_19 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" ], @@ -366,16 +366,15 @@ "SQL": "select * from t1 union all select * from t2 except select * from t3", "Plan": [ "HashJoin_12 12800.00 root anti semi join, equal:[nulleq(Column#10, test.t3.a)], other cond:nulleq(cast(Column#11), cast(test.t3.b))", - "├─TableReader_25(Build) 10000.00 root data:TableFullScan_24", - "│ └─TableFullScan_24 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─HashAgg_15(Probe) 16000.00 root group by:Column#10, Column#11, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", - " └─Union_16 20000.00 root ", - " ├─Projection_17 10000.00 root test.t1.a, cast(test.t1.b, varbinary(20))->Column#11", - " │ └─TableReader_19 10000.00 root data:TableFullScan_18", - " │ └─TableFullScan_18 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─Projection_20 10000.00 root test.t2.a, cast(test.t2.b, varbinary(20))->Column#11", - " └─TableReader_22 10000.00 root data:TableFullScan_21", - " └─TableFullScan_21 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "├─TableReader_23(Build) 10000.00 root data:TableFullScan_22", + "│ └─TableFullScan_22 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─HashAgg_13(Probe) 16000.00 root group by:Column#10, Column#11, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + " └─Union_14 20000.00 root ", + " ├─Projection_15 10000.00 root test.t1.a, cast(test.t1.b, varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#11", + " │ └─TableReader_17 10000.00 root data:TableFullScan_16", + " │ └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader_20 10000.00 root data:TableFullScan_19", + " └─TableFullScan_19 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Res": [ "1 1", @@ -407,16 +406,15 @@ "SQL": "select * from t1 union all select * from t2 intersect select * from t3", "Plan": [ "Union_12 16400.00 root ", - "├─Projection_13 10000.00 root test.t1.a, cast(test.t1.b, varbinary(20))->Column#11", + "├─Projection_13 10000.00 root test.t1.a, cast(test.t1.b, varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#11", "│ └─TableReader_15 10000.00 root data:TableFullScan_14", "│ └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─Projection_16 6400.00 root test.t2.a, cast(test.t2.b, varbinary(20))->Column#11", - " └─HashJoin_17 6400.00 root semi join, equal:[nulleq(test.t2.a, test.t3.a)], other cond:nulleq(cast(test.t2.b), cast(test.t3.b))", - " ├─TableReader_27(Build) 10000.00 root data:TableFullScan_26", - " │ └─TableFullScan_26 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - " └─HashAgg_20(Probe) 8000.00 root group by:test.t2.a, test.t2.b, funcs:firstrow(test.t2.a)->test.t2.a, funcs:firstrow(test.t2.b)->test.t2.b", - " └─TableReader_25 10000.00 root data:TableFullScan_24", - " └─TableFullScan_24 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "└─HashJoin_17 6400.00 root semi join, equal:[nulleq(test.t2.a, test.t3.a)], other cond:nulleq(cast(test.t2.b), cast(test.t3.b))", + " ├─TableReader_27(Build) 10000.00 root data:TableFullScan_26", + " │ └─TableFullScan_26 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + " └─HashAgg_20(Probe) 8000.00 root group by:test.t2.a, test.t2.b, funcs:firstrow(test.t2.a)->test.t2.a, funcs:firstrow(test.t2.b)->test.t2.b", + " └─TableReader_25 10000.00 root data:TableFullScan_24", + " └─TableFullScan_24 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Res": [ "1 1", @@ -448,5 +446,161 @@ ] } ] + }, + { + "Name": "TestNaturalJoin", + "Cases": [ + { + "SQL": "select * from t1 natural join t2", + "Plan": [ + "HashJoin 12487.50 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "0 0 0", + "1 2 3" + ] + }, + { + "SQL": "select * from t1 natural left join t2 order by a", + "Plan": [ + "Sort 12487.50 root test.t1.a", + "└─HashJoin 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "0 0 0", + "1 2 3", + "10 20 " + ] + }, + { + "SQL": "select * from t1 natural right join t2 order by a", + "Plan": [ + "Sort 12487.50 root test.t2.a", + "└─Projection 12487.50 root test.t2.a, test.t2.c, test.t1.b", + " └─HashJoin 12487.50 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Res": [ + "0 0 0", + "1 3 2", + "100 200 " + ] + }, + { + "SQL": "SELECT * FROM t1 NATURAL LEFT JOIN t2 WHERE not(t1.a <=> t2.a)", + "Plan": [ + "Projection 9990.00 root test.t1.a, test.t1.b, test.t2.c", + "└─Selection 9990.00 root not(nulleq(test.t1.a, test.t2.a))", + " └─HashJoin 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "10 20 " + ] + } + ] + }, + { + "Name": "TestIndexScanWithYearCol", + "Cases": [ + { + "SQL": "select t1.c1, t2.c1 from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "MergeJoin_9 0.00 root inner join, left key:test.t.c1, right key:test.t.c1", + "├─TableDual_35(Build) 0.00 root rows:0", + "└─TableDual_34(Probe) 0.00 root rows:0" + ], + "Res": [ + ] + }, + { + "SQL": "select * from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "MergeJoin_9 0.00 root inner join, left key:test.t.c1, right key:test.t.c1", + "├─TableDual_41(Build) 0.00 root rows:0", + "└─TableDual_40(Probe) 0.00 root rows:0" + ], + "Res": [ + ] + }, + { + "SQL": "select count(*) from t as t1 inner join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "StreamAgg_11 1.00 root funcs:count(1)->Column#7", + "└─MergeJoin_12 0.00 root inner join, left key:test.t.c1, right key:test.t.c1", + " ├─TableDual_38(Build) 0.00 root rows:0", + " └─TableDual_37(Probe) 0.00 root rows:0" + ], + "Res": [ + "0" + ] + }, + { + "SQL": "select t1.c1, t2.c1 from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "MergeJoin_7 0.00 root left outer join, left key:test.t.c1, right key:test.t.c1", + "├─TableDual_22(Build) 0.00 root rows:0", + "└─TableDual_21(Probe) 0.00 root rows:0" + ], + "Res": [ + ] + }, + { + "SQL": "select * from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "MergeJoin_7 0.00 root left outer join, left key:test.t.c1, right key:test.t.c1", + "├─TableDual_25(Build) 0.00 root rows:0", + "└─TableDual_24(Probe) 0.00 root rows:0" + ], + "Res": [ + ] + }, + { + "SQL": "select count(*) from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 != NULL", + "Plan": [ + "StreamAgg_9 1.00 root funcs:count(1)->Column#7", + "└─MergeJoin_10 0.00 root left outer join, left key:test.t.c1, right key:test.t.c1", + " ├─TableDual_25(Build) 0.00 root rows:0", + " └─TableDual_24(Probe) 0.00 root rows:0" + ], + "Res": [ + "0" + ] + }, + { + "SQL": "select * from t as t1 left join t as t2 on t1.c1 = t2.c1 where t1.c1 is not NULL", + "Plan": [ + "HashJoin_22 12487.50 root left outer join, equal:[eq(test.t.c1, test.t.c1)]", + "├─TableReader_40(Build) 9990.00 root data:Selection_39", + "│ └─Selection_39 9990.00 cop[tikv] not(isnull(test.t.c1))", + "│ └─TableFullScan_38 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader_34(Probe) 9990.00 root data:Selection_33", + " └─Selection_33 9990.00 cop[tikv] not(isnull(test.t.c1))", + " └─TableFullScan_32 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "2001 1 2001 1" + ] + } + ] } ] diff --git a/executor/testdata/point_get_suite_out.json b/executor/testdata/point_get_suite_out.json index 2106045e762d2..175cbc7cb7b55 100644 --- a/executor/testdata/point_get_suite_out.json +++ b/executor/testdata/point_get_suite_out.json @@ -5,8 +5,8 @@ { "SQL": "select * from t1 where a = 1 and b = 1 and c = 1", "Plan": [ - "Selection_6 0.33 root eq(test.t1.c, 1)", - "└─Point_Get_5 1.00 root table:t1, clustered index:PRIMARY(a, b) " + "Selection 0.33 root eq(test.t1.c, 1)", + "└─Point_Get 1.00 root table:t1, clustered index:PRIMARY(a, b) " ], "Res": [ "1 1 1" @@ -15,8 +15,8 @@ { "SQL": "select * from t2 where t2.a = '111' and t2.b = 1", "Plan": [ - "Selection_6 0.33 root eq(test.t2.b, 1)", - "└─Point_Get_5 1.00 root table:t2, clustered index:PRIMARY(a) " + "Selection 0.33 root eq(test.t2.b, 1)", + "└─Point_Get 1.00 root table:t2, clustered index:PRIMARY(a) " ], "Res": [ "111 1" @@ -25,10 +25,10 @@ { "SQL": "select * from t1 join t2 on t1.a = t2.b where t1.a = 1", "Plan": [ - "HashJoin_8 1.00 root CARTESIAN inner join", - "├─Point_Get_12(Build) 1.00 root table:t2, index:b(b) ", - "└─TableReader_11(Probe) 1.00 root data:TableRangeScan_10", - " └─TableRangeScan_10 1.00 cop[tikv] table:t1 range:[1,1], keep order:false" + "HashJoin 1.00 root CARTESIAN inner join", + "├─Point_Get(Build) 1.00 root table:t2, index:b(b) ", + "└─TableReader(Probe) 1.00 root data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:false" ], "Res": [ "1 1 1 111 1" @@ -37,8 +37,8 @@ { "SQL": "select * from t1 where (a,b) in ((1,1),(2,2)) and c = 2", "Plan": [ - "Selection_6 0.67 root eq(test.t1.c, 2)", - "└─Batch_Point_Get_5 2.00 root table:t1, clustered index:PRIMARY(a, b) keep order:false, desc:false" + "Selection 0.67 root eq(test.t1.c, 2)", + "└─Batch_Point_Get 2.00 root table:t1, clustered index:PRIMARY(a, b) keep order:false, desc:false" ], "Res": [ "2 2 2" @@ -47,8 +47,8 @@ { "SQL": "select * from t2 where a in ('111','222') and b = 2", "Plan": [ - "Selection_6 0.67 root eq(test.t2.b, 2)", - "└─Batch_Point_Get_5 2.00 root table:t2, clustered index:PRIMARY(a) keep order:false, desc:false" + "Selection 0.67 root eq(test.t2.b, 2)", + "└─Batch_Point_Get 2.00 root table:t2, clustered index:PRIMARY(a) keep order:false, desc:false" ], "Res": [ "222 2" @@ -57,10 +57,10 @@ { "SQL": "select * from t2 where a in ('111','222') union all select a,c from t1 where (a,b) in ((1,1),(2,2))", "Plan": [ - "Union_10 4.00 root ", - "├─Batch_Point_Get_12 2.00 root table:t2, clustered index:PRIMARY(a) keep order:false, desc:false", - "└─Projection_13 2.00 root cast(test.t1.a, varchar(20) BINARY CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#6, test.t1.c", - " └─Batch_Point_Get_14 2.00 root table:t1, clustered index:PRIMARY(a, b) keep order:false, desc:false" + "Union 4.00 root ", + "├─Batch_Point_Get 2.00 root table:t2, clustered index:PRIMARY(a) keep order:false, desc:false", + "└─Projection 2.00 root cast(test.t1.a, varchar(20) BINARY CHARACTER SET utf8mb4 COLLATE utf8mb4_bin)->Column#6, test.t1.c", + " └─Batch_Point_Get 2.00 root table:t1, clustered index:PRIMARY(a, b) keep order:false, desc:false" ], "Res": [ "1 1", diff --git a/executor/testdata/prepare_suite_in.json b/executor/testdata/prepare_suite_in.json new file mode 100644 index 0000000000000..a592b6ec327c0 --- /dev/null +++ b/executor/testdata/prepare_suite_in.json @@ -0,0 +1,58 @@ +[ + { + "name": "TestPlanCacheWithDifferentVariableTypes", + "cases": [ + { + "PrepareStmt": "prepare stmt from \"select ?, ?\"", + "Executes": [ + { + "Vars": [{"Name": "v1", "Value": "1"}, {"Name": "v2", "Value": "2"}], + "ExecuteSQL": "execute stmt using @v1, @v2" + }, + { + "Vars": [{"Name": "v1", "Value": "1"}, {"Name": "v2", "Value": "\"abc\""}], + "ExecuteSQL": "execute stmt using @v1, @v2" + }, + { + "Vars": [{"Name": "v1", "Value": "10"}, {"Name": "v2", "Value": "\"cba\""}], + "ExecuteSQL": "execute stmt using @v1, @v2" + } + ] + }, + { + "PrepareStmt": "prepare stmt from \"select a from t1 where t1.b = ?\"", + "Executes": [ + { + "Vars": [{"Name": "v1", "Value": "3"}], + "ExecuteSQL": "execute stmt using @v1" + }, + { + "Vars": [{"Name": "v1", "Value": "2"}], + "ExecuteSQL": "execute stmt using @v1" + }, + { + "Vars": [{"Name": "v1", "Value": "\"abc\""}], + "ExecuteSQL": "execute stmt using @v1" + } + ] + }, + { + "PrepareStmt": "prepare stmt from \"select t1.c, t2.c from t1 join t2 on t1.b = t2.b and t1.a = t2.a where t1.b = ?\"", + "Executes": [ + { + "Vars": [{"Name": "v1", "Value": "1"}], + "ExecuteSQL": "execute stmt using @v1" + }, + { + "Vars": [{"Name": "v1", "Value": "2"}], + "ExecuteSQL": "execute stmt using @v1" + }, + { + "Vars": [{"Name": "v1", "Value": "\"abc\""}], + "ExecuteSQL": "execute stmt using @v1" + } + ] + } + ] + } +] diff --git a/executor/testdata/prepare_suite_out.json b/executor/testdata/prepare_suite_out.json new file mode 100644 index 0000000000000..aa1e06d2ab465 --- /dev/null +++ b/executor/testdata/prepare_suite_out.json @@ -0,0 +1,204 @@ +[ + { + "Name": "TestPlanCacheWithDifferentVariableTypes", + "Cases": [ + { + "PrepareStmt": "prepare stmt from \"select ?, ?\"", + "Executes": [ + { + "SQL": "execute stmt using @v1, @v2", + "Vars": [ + { + "Name": "v1", + "Value": "1" + }, + { + "Name": "v2", + "Value": "2" + } + ], + "Plan": [ + "Projection_3 1.00 root 1->Column#1, 2->Column#2", + "└─TableDual_4 1.00 root rows:1" + ], + "LastPlanUseCache": "0", + "Result": [ + "1 2" + ] + }, + { + "SQL": "execute stmt using @v1, @v2", + "Vars": [ + { + "Name": "v1", + "Value": "1" + }, + { + "Name": "v2", + "Value": "\"abc\"" + } + ], + "Plan": [ + "Projection_3 1.00 root 1->Column#1, abc->Column#2", + "└─TableDual_4 1.00 root rows:1" + ], + "LastPlanUseCache": "0", + "Result": [ + "1 abc" + ] + }, + { + "SQL": "execute stmt using @v1, @v2", + "Vars": [ + { + "Name": "v1", + "Value": "10" + }, + { + "Name": "v2", + "Value": "\"cba\"" + } + ], + "Plan": [ + "Projection_3 1.00 root 10->Column#1, cba->Column#2", + "└─TableDual_4 1.00 root rows:1" + ], + "LastPlanUseCache": "0", + "Result": [ + "10 cba" + ] + } + ] + }, + { + "PrepareStmt": "prepare stmt from \"select a from t1 where t1.b = ?\"", + "Executes": [ + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "3" + } + ], + "Plan": [ + "Projection_4 10.00 root test.t1.a", + "└─IndexReader_6 10.00 root index:IndexRangeScan_5", + " └─IndexRangeScan_5 10.00 cop[tikv] table:t1, index:b(b, a) range:[3,3], keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "0", + "Result": [ + "3" + ] + }, + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "2" + } + ], + "Plan": [ + "Projection_4 10.00 root test.t1.a", + "└─IndexReader_6 10.00 root index:IndexRangeScan_5", + " └─IndexRangeScan_5 10.00 cop[tikv] table:t1, index:b(b, a) range:[2,2], keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "1", + "Result": [ + "2" + ] + }, + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "\"abc\"" + } + ], + "Plan": [ + "Projection_4 8000.00 root test.t1.a", + "└─IndexReader_10 8000.00 root index:Selection_9", + " └─Selection_9 8000.00 cop[tikv] eq(cast(test.t1.b), 0)", + " └─IndexFullScan_8 10000.00 cop[tikv] table:t1, index:b(b, a) keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "0", + "Result": null + } + ] + }, + { + "PrepareStmt": "prepare stmt from \"select t1.c, t2.c from t1 join t2 on t1.b = t2.b and t1.a = t2.a where t1.b = ?\"", + "Executes": [ + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "1" + } + ], + "Plan": [ + "HashJoin_38 6387.21 root inner join, equal:[eq(test.t1.b, test.t2.b) eq(test.t1.a, test.t2.a)]", + "├─IndexLookUp_63(Build) 99.80 root ", + "│ ├─Selection_62(Build) 99.80 cop[tikv] not(isnull(test.t2.b))", + "│ │ └─IndexRangeScan_60 99.90 cop[tikv] table:t2, index:b(b, a) range:[1 -inf,1 +inf], keep order:false, stats:pseudo", + "│ └─TableRowIDScan_61(Probe) 99.80 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─IndexLookUp_56(Probe) 99.80 root ", + " ├─Selection_55(Build) 99.80 cop[tikv] not(isnull(test.t1.b))", + " │ └─IndexRangeScan_53 99.90 cop[tikv] table:t1, index:b(b, a) range:[1 -inf,1 +inf], keep order:false, stats:pseudo", + " └─TableRowIDScan_54(Probe) 99.80 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "0", + "Result": null + }, + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "2" + } + ], + "Plan": [ + "HashJoin_38 6387.21 root inner join, equal:[eq(test.t1.b, test.t2.b) eq(test.t1.a, test.t2.a)]", + "├─IndexLookUp_63(Build) 99.80 root ", + "│ ├─Selection_62(Build) 99.80 cop[tikv] not(isnull(test.t2.b))", + "│ │ └─IndexRangeScan_60 99.90 cop[tikv] table:t2, index:b(b, a) range:[2 -inf,2 +inf], keep order:false, stats:pseudo", + "│ └─TableRowIDScan_61(Probe) 99.80 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─IndexLookUp_56(Probe) 99.80 root ", + " ├─Selection_55(Build) 99.80 cop[tikv] not(isnull(test.t1.b))", + " │ └─IndexRangeScan_53 99.90 cop[tikv] table:t1, index:b(b, a) range:[2 -inf,2 +inf], keep order:false, stats:pseudo", + " └─TableRowIDScan_54(Probe) 99.80 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "1", + "Result": [ + "222 222" + ] + }, + { + "SQL": "execute stmt using @v1", + "Vars": [ + { + "Name": "v1", + "Value": "\"abc\"" + } + ], + "Plan": [ + "HashJoin_38 63744383.74 root inner join, equal:[eq(test.t1.b, test.t2.b) eq(test.t1.a, test.t2.a)]", + "├─TableReader_59(Build) 7984.01 root data:Selection_58", + "│ └─Selection_58 7984.01 cop[tikv] eq(cast(test.t2.b), 0), not(isnull(test.t2.a)), not(isnull(test.t2.b))", + "│ └─TableFullScan_57 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader_52(Probe) 7984.01 root data:Selection_51", + " └─Selection_51 7984.01 cop[tikv] eq(cast(test.t1.b), 0), not(isnull(test.t1.a)), not(isnull(test.t1.b))", + " └─TableFullScan_50 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "LastPlanUseCache": "0", + "Result": null + } + ] + } + ] + } +] diff --git a/executor/tiflash_test.go b/executor/tiflash_test.go index 559ed0957c880..78b745fb62dfe 100644 --- a/executor/tiflash_test.go +++ b/executor/tiflash_test.go @@ -15,46 +15,49 @@ package executor_test import ( "fmt" + "sync" + "sync/atomic" + "time" . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/store/mockstore/mocktikv" - "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/testkit" ) type tiflashTestSuite struct { - cluster cluster.Cluster - store kv.Storage - dom *domain.Domain + store kv.Storage + dom *domain.Domain *parser.Parser - ctx *mock.Context } func (s *tiflashTestSuite) SetUpSuite(c *C) { var err error s.store, err = mockstore.NewMockStore( mockstore.WithClusterInspector(func(c cluster.Cluster) { - mockCluster := c.(*mocktikv.Cluster) + mockCluster := c.(*unistore.Cluster) _, _, region1 := mockstore.BootstrapWithSingleStore(c) tiflashIdx := 0 for tiflashIdx < 2 { store2 := c.AllocID() peer2 := c.AllocID() addr2 := fmt.Sprintf("tiflash%d", tiflashIdx) - mockCluster.AddStore(store2, addr2) - mockCluster.UpdateStoreAddr(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) + mockCluster.AddStore(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) mockCluster.AddPeer(region1, store2, peer2) tiflashIdx++ } }), - mockstore.WithStoreType(mockstore.MockTiKV), + mockstore.WithStoreType(mockstore.EmbedUnistore), ) c.Assert(err, IsNil) @@ -70,6 +73,7 @@ func (s *tiflashTestSuite) SetUpSuite(c *C) { func (s *tiflashTestSuite) TestReadPartitionTable(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int not null primary key, b int not null) partition by hash(a) partitions 2") tk.MustExec("alter table t set tiflash replica 1") tb := testGetTableByName(c, tk.Se, "test", "t") @@ -90,4 +94,273 @@ func (s *tiflashTestSuite) TestReadPartitionTable(c *C) { tk.MustQuery("select /*+ STREAM_AGG() */ count(*) from t").Check(testkit.Rows("5")) tk.MustExec("insert into t values(6,0)") tk.MustQuery("select /*+ STREAM_AGG() */ count(*) from t").Check(testkit.Rows("6")) + tk.MustExec("commit") +} + +func (s *tiflashTestSuite) TestReadUnsigedPK(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t(a bigint unsigned not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + tk.MustExec("insert into t values(3,0)") + tk.MustExec("insert into t values(18446744073709551606,0)") + tk.MustExec("insert into t values(9223372036854775798,0)") + + tk.MustExec("create table t1(a bigint unsigned not null primary key, b int not null)") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t1") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t1 values(1,0)") + tk.MustExec("insert into t1 values(2,0)") + tk.MustExec("insert into t1 values(3,0)") + tk.MustExec("insert into t1 values(18446744073709551606,0)") + tk.MustExec("insert into t1 values(9223372036854775798,0)") + + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + tk.MustExec("set @@session.tidb_opt_broadcast_join=ON") + + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a").Check(testkit.Rows("5")) + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a and ((t1.a < 9223372036854775800 and t1.a > 2) or (t1.a <= 1 and t1.a > -1))").Check(testkit.Rows("3")) +} + +func (s *tiflashTestSuite) TestMppExecution(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + tk.MustExec("insert into t values(3,0)") + + tk.MustExec("create table t1(a int not null primary key, b int not null)") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t1") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t1 values(1,0)") + tk.MustExec("insert into t1 values(2,0)") + tk.MustExec("insert into t1 values(3,0)") + + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + for i := 0; i < 20; i++ { + // test if it is stable. + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a").Check(testkit.Rows("3")) + } + // test multi-way join + tk.MustExec("create table t2(a int not null primary key, b int not null)") + tk.MustExec("alter table t2 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t2") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + + tk.MustExec("insert into t2 values(1,0)") + tk.MustExec("insert into t2 values(2,0)") + tk.MustExec("insert into t2 values(3,0)") + tk.MustQuery("select count(*) from t1 , t, t2 where t1.a = t.a and t2.a = t.a").Check(testkit.Rows("3")) + + // test avg + tk.MustQuery("select avg(t1.a) from t1 , t where t1.a = t.a").Check(testkit.Rows("2.0000")) + // test proj and selection + tk.MustQuery("select count(*) from (select a * 2 as a from t1) t1 , (select b + 4 as a from t)t where t1.a = t.a").Check(testkit.Rows("3")) + + // test shuffle hash join. + tk.MustExec("set @@session.tidb_broadcast_join_threshold_size=1") + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a").Check(testkit.Rows("3")) + tk.MustQuery("select count(*) from t1 , t, t2 where t1.a = t.a and t2.a = t.a").Check(testkit.Rows("3")) + + tk.MustExec("insert into t1 values(4,0)") + tk.MustQuery("select count(*) k, t2.b from t1 left join t2 on t1.a = t2.a group by t2.b order by k").Check(testkit.Rows("1 ", "3 0")) + tk.MustQuery("select count(*) k, t2.b+1 from t1 left join t2 on t1.a = t2.a group by t2.b+1 order by k").Check(testkit.Rows("1 ", "3 1")) + tk.MustQuery("select count(*) k, t2.b * t2.a from t2 group by t2.b * t2.a").Check(testkit.Rows("3 0")) + tk.MustQuery("select count(*) k, t2.a/2 m from t2 group by t2.a / 2 order by m").Check(testkit.Rows("1 0.5000", "1 1.0000", "1 1.5000")) + tk.MustQuery("select count(*) k, t2.a div 2 from t2 group by t2.a div 2 order by k").Check(testkit.Rows("1 0", "2 1")) +} + +func (s *tiflashTestSuite) TestPartitionTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("drop table if exists t1") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t(a int not null primary key, b int not null) partition by hash(a+1) partitions 4") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + tk.MustExec("insert into t values(3,0)") + tk.MustExec("insert into t values(4,0)") + failpoint.Enable("github.com/pingcap/tidb/executor/checkUseMPP", `return(true)`) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(4)`) + tk.MustQuery("select count(*) from t").Check(testkit.Rows("4")) + failpoint.Disable("github.com/pingcap/tidb/executor/checkTotalMPPTasks") + tk.MustExec("set @@session.tidb_partition_prune_mode='static-only'") + failpoint.Enable("github.com/pingcap/tidb/executor/checkUseMPP", `return(false)`) + tk.MustQuery("select count(*) from t").Check(testkit.Rows("4")) + tk.MustExec("set @@session.tidb_partition_prune_mode='dynamic-only'") + failpoint.Enable("github.com/pingcap/tidb/executor/checkUseMPP", `return(true)`) + + tk.MustExec("create table t1(a int not null primary key, b int not null) partition by hash(a) partitions 4") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t1") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t1 values(1,4)") + tk.MustExec("insert into t1 values(2,3)") + tk.MustExec("insert into t1 values(3,2)") + tk.MustExec("insert into t1 values(4,1)") + + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + tk.MustExec("set @@session.tidb_opt_broadcast_join=ON") + // test if it is really work. + failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(8)`) + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a").Check(testkit.Rows("4")) + // test partition prune + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a and t1.a < 2 and t.a < 2").Check(testkit.Rows("1")) + tk.MustQuery("select count(*) from t1 , t where t1.a = t.a and t1.a < -1 and t.a < 2").Check(testkit.Rows("0")) + failpoint.Disable("github.com/pingcap/tidb/executor/checkTotalMPPTasks") + // test multi-way join + tk.MustExec("create table t2(a int not null primary key, b int not null)") + tk.MustExec("alter table t2 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t2") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + + tk.MustExec("insert into t2 values(1,0)") + tk.MustExec("insert into t2 values(2,0)") + tk.MustExec("insert into t2 values(3,0)") + tk.MustExec("insert into t2 values(4,0)") + // test with no partition table + failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(9)`) + tk.MustQuery("select count(*) from t1 , t, t2 where t1.a = t.a and t2.a = t.a").Check(testkit.Rows("4")) + failpoint.Disable("github.com/pingcap/tidb/executor/checkTotalMPPTasks") + + tk.MustExec(`create table t3(a int not null, b int not null) PARTITION BY RANGE (b) ( + PARTITION p0 VALUES LESS THAN (1), + PARTITION p1 VALUES LESS THAN (3), + PARTITION p2 VALUES LESS THAN (5), + PARTITION p3 VALUES LESS THAN (7) + );`) + tk.MustExec("alter table t3 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t3") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + + tk.MustExec("insert into t3 values(1,0)") + tk.MustExec("insert into t3 values(2,2)") + tk.MustExec("insert into t3 values(3,4)") + tk.MustExec("insert into t3 values(4,6)") + + failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(7)`) + tk.MustQuery("select count(*) from t, t3 where t3.a = t.a and t3.b <= 4").Check(testkit.Rows("3")) + failpoint.Disable("github.com/pingcap/tidb/executor/checkTotalMPPTasks") + failpoint.Enable("github.com/pingcap/tidb/executor/checkTotalMPPTasks", `return(5)`) + tk.MustQuery("select count(*) from t, t3 where t3.a = t.a and t3.b > 10").Check(testkit.Rows("0")) + failpoint.Disable("github.com/pingcap/tidb/executor/checkTotalMPPTasks") + failpoint.Disable("github.com/pingcap/tidb/executor/checkUseMPP") +} + +func (s *tiflashTestSuite) TestMppEnum(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b enum('aca','bca','zca'))") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1,'aca')") + tk.MustExec("insert into t values(2,'bca')") + tk.MustExec("insert into t values(3,'zca')") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + tk.MustQuery("select t1.b from t t1 join t t2 on t1.a = t2.a order by t1.b").Check(testkit.Rows("aca", "bca", "zca")) +} + +func (s *tiflashTestSuite) TestCancelMppTasks(c *C) { + var hang = "github.com/pingcap/tidb/store/mockstore/unistore/mppRecvHang" + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + tk.MustExec("insert into t values(3,0)") + tk.MustExec("insert into t values(4,0)") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + atomic.StoreUint32(&tk.Se.GetSessionVars().Killed, 0) + c.Assert(failpoint.Enable(hang, `return(true)`), IsNil) + wg := &sync.WaitGroup{} + wg.Add(1) + go func() { + defer wg.Done() + err := tk.QueryToErr("select count(*) from t as t1 , t where t1.a = t.a") + c.Assert(err, NotNil) + c.Assert(int(terror.ToSQLError(errors.Cause(err).(*terror.Error)).Code), Equals, int(executor.ErrQueryInterrupted.Code())) + }() + time.Sleep(1 * time.Second) + atomic.StoreUint32(&tk.Se.GetSessionVars().Killed, 1) + wg.Wait() + c.Assert(failpoint.Disable(hang), IsNil) +} + +// all goroutines exit if one goroutine hangs but another return errors +func (s *tiflashTestSuite) TestMppGoroutinesExitFromErrors(c *C) { + // mock non-root tasks return error + var mppNonRootTaskError = "github.com/pingcap/tidb/store/copr/mppNonRootTaskError" + // mock root tasks hang + var hang = "github.com/pingcap/tidb/store/mockstore/unistore/mppRecvHang" + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1,0)") + tk.MustExec("insert into t values(2,0)") + tk.MustExec("insert into t values(3,0)") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a int not null primary key, b int not null)") + tk.MustExec("alter table t1 set tiflash replica 1") + tb = testGetTableByName(c, tk.Se, "test", "t1") + err = domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + tk.MustExec("insert into t1 values(1,0)") + tk.MustExec("insert into t1 values(2,0)") + tk.MustExec("insert into t1 values(3,0)") + tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") + tk.MustExec("set @@session.tidb_allow_mpp=ON") + c.Assert(failpoint.Enable(mppNonRootTaskError, `return(true)`), IsNil) + c.Assert(failpoint.Enable(hang, `return(true)`), IsNil) + + // generate 2 root tasks, one will hang and another will return errors + err = tk.QueryToErr("select count(*) from t as t1 , t where t1.a = t.a") + c.Assert(err, NotNil) + c.Assert(failpoint.Disable(mppNonRootTaskError), IsNil) + c.Assert(failpoint.Disable(hang), IsNil) } diff --git a/executor/trace.go b/executor/trace.go index bf9150f357081..8eb6592c4822f 100644 --- a/executor/trace.go +++ b/executor/trace.go @@ -132,24 +132,21 @@ func (e *TraceExec) nextRowJSON(ctx context.Context, se sqlexec.SQLExecutor, req } func (e *TraceExec) executeChild(ctx context.Context, se sqlexec.SQLExecutor) { - recordSets, err := se.Execute(ctx, e.stmtNode.Text()) - if len(recordSets) == 0 { - if err != nil { - var errCode uint16 - if te, ok := err.(*terror.Error); ok { - errCode = terror.ToSQLError(te).Code - } - logutil.Eventf(ctx, "execute with error(%d): %s", errCode, err.Error()) - } else { - logutil.Eventf(ctx, "execute done, modify row: %d", e.ctx.GetSessionVars().StmtCtx.AffectedRows()) + rs, err := se.ExecuteStmt(ctx, e.stmtNode) + if err != nil { + var errCode uint16 + if te, ok := err.(*terror.Error); ok { + errCode = terror.ToSQLError(te).Code } + logutil.Eventf(ctx, "execute with error(%d): %s", errCode, err.Error()) } - for _, rs := range recordSets { + if rs != nil { drainRecordSet(ctx, e.ctx, rs) if err = rs.Close(); err != nil { logutil.Logger(ctx).Error("run trace close result with error", zap.Error(err)) } } + logutil.Eventf(ctx, "execute done, modify row: %d", e.ctx.GetSessionVars().StmtCtx.AffectedRows()) } func drainRecordSet(ctx context.Context, sctx sessionctx.Context, rs sqlexec.RecordSet) { diff --git a/executor/union_scan.go b/executor/union_scan.go index cdc13e19c8f8b..45aeb2231a74f 100644 --- a/executor/union_scan.go +++ b/executor/union_scan.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/tidb/kv" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" ) @@ -219,7 +220,7 @@ func (us *UnionScanExec) getSnapshotRow(ctx context.Context) ([]types.Datum, err if err != nil { return nil, err } - checkKey := us.table.RecordKey(snapshotHandle) + checkKey := tablecodec.EncodeRecordKey(us.table.RecordPrefix(), snapshotHandle) if _, err := us.memBufSnap.Get(context.TODO(), checkKey); err == nil { // If src handle appears in added rows, it means there is conflict and the transaction will fail to // commit, but for simplicity, we don't handle it here. diff --git a/executor/union_scan_test.go b/executor/union_scan_test.go index 235fc0e1c6616..48a5768a10be8 100644 --- a/executor/union_scan_test.go +++ b/executor/union_scan_test.go @@ -383,7 +383,7 @@ func (s *testSuite7) TestForApplyAndUnionScan(c *C) { // See https://github.com/pingcap/tidb/issues/19431 tk.MustExec("DROP TABLE IF EXISTS `t`") - tk.MustExec("CREATE TABLE `t` ( `c_int` int(11) NOT NULL, `c_str` varchar(40) NOT NULL, `c_datetime` datetime NOT NULL, PRIMARY KEY (`c_int`,`c_str`,`c_datetime`), KEY `c_str` (`c_str`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; /*!40101 SET character_set_client = @saved_cs_client */") + tk.MustExec("CREATE TABLE `t` ( `c_int` int(11) NOT NULL, `c_str` varchar(40) NOT NULL, `c_datetime` datetime NOT NULL, PRIMARY KEY (`c_int`,`c_str`,`c_datetime`), KEY `c_str` (`c_str`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;") tk.MustExec("INSERT INTO `t` VALUES (1,'cool pasteur','2020-04-21 19:01:04'),(3,'friendly stonebraker','2020-06-09 18:58:00'),(5,'happy shannon','2020-02-29 21:39:08'),(6,'competent torvalds','2020-05-24 04:18:45'),(7,'fervent kapitsa','2020-05-21 16:58:12'),(8,'quirky jennings','2020-03-12 12:52:58'),(9,'adoring swartz','2020-04-19 02:20:32'),(14,'intelligent keller','2020-01-08 09:47:42'),(15,'vibrant zhukovsky','2020-04-15 15:15:55'),(18,'keen chatterjee','2020-02-09 06:39:31'),(20,'elastic gauss','2020-03-01 13:34:06'),(21,'affectionate margulis','2020-06-20 10:20:29'),(27,'busy keldysh','2020-05-21 09:10:45'),(31,'flamboyant banach','2020-03-04 21:28:44'),(39,'keen banach','2020-06-09 03:07:57'),(41,'nervous gagarin','2020-06-12 23:43:04'),(47,'wonderful chebyshev','2020-04-15 14:51:17'),(50,'reverent brahmagupta','2020-06-25 21:50:52'),(52,'suspicious elbakyan','2020-05-28 04:55:34'),(55,'epic lichterman','2020-05-16 19:24:09'),(57,'determined taussig','2020-06-18 22:51:37')") tk.MustExec("DROP TABLE IF EXISTS `t1`") tk.MustExec("CREATE TABLE `t1` ( `c_int` int(11) DEFAULT NULL, `c_str` varchar(40) NOT NULL, `c_datetime` datetime DEFAULT NULL, PRIMARY KEY (`c_str`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") diff --git a/executor/update.go b/executor/update.go index e5ac00b9fd19b..6e27b3fc99f31 100644 --- a/executor/update.go +++ b/executor/update.go @@ -36,10 +36,14 @@ type UpdateExec struct { OrderedList []*expression.Assignment - // updatedRowKeys is a map for unique (Table, handle) pair. + // updatedRowKeys is a map for unique (TableAlias, handle) pair. // The value is true if the row is changed, or false otherwise - updatedRowKeys map[int64]*kv.HandleMap + updatedRowKeys map[int]*kv.HandleMap tblID2table map[int64]table.Table + // mergedRowData is a map for unique (Table, handle) pair. + // The value is cached table row + mergedRowData map[int64]*kv.HandleMap + multiUpdateOnSameTable map[int64]bool matched uint64 // a counter of matched rows during update // tblColPosInfos stores relationship between column ordinal to its table handle. @@ -47,63 +51,139 @@ type UpdateExec struct { tblColPosInfos plannercore.TblColPosInfoSlice evalBuffer chunk.MutRow allAssignmentsAreConstant bool + virtualAssignmentsOffset int drained bool memTracker *memory.Tracker stats *runtimeStatsWithSnapshot + + handles []kv.Handle + updatable []bool + changed []bool + matches []bool + assignFlag []bool } -func (e *UpdateExec) exec(ctx context.Context, schema *expression.Schema, row, newData []types.Datum) error { - defer trace.StartRegion(ctx, "UpdateExec").End() - assignFlag, err := plannercore.GetUpdateColumns(e.ctx, e.OrderedList, schema.Len()) +// prepare `handles`, `updatable`, `changed` and `assignFlag` to avoid re-computations. +func (e *UpdateExec) prepare(ctx context.Context, schema *expression.Schema, row []types.Datum) (err error) { + e.assignFlag, err = plannercore.GetUpdateColumns(e.ctx, e.OrderedList, schema.Len()) if err != nil { return err } if e.updatedRowKeys == nil { - e.updatedRowKeys = make(map[int64]*kv.HandleMap) + e.updatedRowKeys = make(map[int]*kv.HandleMap) } + e.handles = e.handles[:0] + e.updatable = e.updatable[:0] + e.changed = e.changed[:0] + e.matches = e.matches[:0] for _, content := range e.tblColPosInfos { - tbl := e.tblID2table[content.TblID] - if e.updatedRowKeys[content.TblID] == nil { - e.updatedRowKeys[content.TblID] = kv.NewHandleMap() + if e.updatedRowKeys[content.Start] == nil { + e.updatedRowKeys[content.Start] = kv.NewHandleMap() } - var handle kv.Handle - handle, err = content.HandleCols.BuildHandleByDatums(row) + handle, err := content.HandleCols.BuildHandleByDatums(row) if err != nil { return err } + e.handles = append(e.handles, handle) - oldData := row[content.Start:content.End] - newTableData := newData[content.Start:content.End] updatable := false - flags := assignFlag[content.Start:content.End] + flags := e.assignFlag[content.Start:content.End] for _, flag := range flags { if flag { updatable = true break } } - if !updatable { + e.updatable = append(e.updatable, updatable) + + changed, ok := e.updatedRowKeys[content.Start].Get(handle) + if ok { + e.changed = append(e.changed, changed.(bool)) + e.matches = append(e.matches, false) + } else { + e.changed = append(e.changed, false) + e.matches = append(e.matches, true) + } + } + return nil +} + +func (e *UpdateExec) merge(ctx context.Context, row, newData []types.Datum, mergeGenerated bool) error { + if e.mergedRowData == nil { + e.mergedRowData = make(map[int64]*kv.HandleMap) + } + var mergedData []types.Datum + // merge updates from and into mergedRowData + for i, content := range e.tblColPosInfos { + if !e.multiUpdateOnSameTable[content.TblID] { + // No need to merge if not multi-updated + continue + } + if !e.updatable[i] { // If there's nothing to update, we can just skip current row continue } - var changed bool - v, ok := e.updatedRowKeys[content.TblID].Get(handle) - if !ok { - // Row is matched for the first time, increment `matched` counter - e.matched++ + if e.changed[i] { + // Each matched row is updated once, even if it matches the conditions multiple times. + continue + } + handle := e.handles[i] + flags := e.assignFlag[content.Start:content.End] + + if e.mergedRowData[content.TblID] == nil { + e.mergedRowData[content.TblID] = kv.NewHandleMap() + } + tbl := e.tblID2table[content.TblID] + oldData := row[content.Start:content.End] + newTableData := newData[content.Start:content.End] + if v, ok := e.mergedRowData[content.TblID].Get(handle); ok { + mergedData = v.([]types.Datum) + for i, flag := range flags { + if tbl.WritableCols()[i].IsGenerated() != mergeGenerated { + continue + } + mergedData[i].Copy(&oldData[i]) + if flag { + newTableData[i].Copy(&mergedData[i]) + } else { + mergedData[i].Copy(&newTableData[i]) + } + } } else { - changed = v.(bool) + mergedData = append([]types.Datum{}, newTableData...) + } + e.mergedRowData[content.TblID].Set(handle, mergedData) + } + return nil +} + +func (e *UpdateExec) exec(ctx context.Context, schema *expression.Schema, row, newData []types.Datum) error { + defer trace.StartRegion(ctx, "UpdateExec").End() + for i, content := range e.tblColPosInfos { + if !e.updatable[i] { + // If there's nothing to update, we can just skip current row + continue } - if changed { + if e.changed[i] { // Each matched row is updated once, even if it matches the conditions multiple times. continue } + if e.matches[i] { + // Row is matched for the first time, increment `matched` counter + e.matched++ + } + tbl := e.tblID2table[content.TblID] + handle := e.handles[i] + + oldData := row[content.Start:content.End] + newTableData := newData[content.Start:content.End] + flags := e.assignFlag[content.Start:content.End] // Update row changed, err1 := updateRecord(ctx, e.ctx, handle, oldData, newTableData, flags, tbl, false, e.memTracker) if err1 == nil { - e.updatedRowKeys[content.TblID].Set(handle, changed) + e.updatedRowKeys[content.Start].Set(handle, changed) continue } @@ -182,10 +262,31 @@ func (e *UpdateExec) updateRows(ctx context.Context) (int, error) { for rowIdx := 0; rowIdx < chk.NumRows(); rowIdx++ { chunkRow := chk.GetRow(rowIdx) datumRow := chunkRow.GetDatumRow(fields) - newRow, err1 := composeFunc(globalRowIdx, datumRow, colsInfo) - if err1 != nil { - return 0, err1 + // precomputes handles + if err := e.prepare(ctx, e.children[0].Schema(), datumRow); err != nil { + return 0, err } + // compose non-generated columns + newRow, err := composeFunc(globalRowIdx, datumRow, colsInfo) + if err != nil { + return 0, err + } + // merge non-generated columns + if err := e.merge(ctx, datumRow, newRow, false); err != nil { + return 0, err + } + if e.virtualAssignmentsOffset < len(e.OrderedList) { + // compose generated columns + newRow, err = e.composeGeneratedColumns(globalRowIdx, newRow, colsInfo) + if err != nil { + return 0, err + } + // merge generated columns + if err := e.merge(ctx, datumRow, newRow, true); err != nil { + return 0, err + } + } + // write to table if err := e.exec(ctx, e.children[0].Schema(), datumRow, newRow); err != nil { return 0, err } @@ -243,12 +344,41 @@ func (e *UpdateExec) fastComposeNewRow(rowIdx int, oldRow []types.Datum, cols [] func (e *UpdateExec) composeNewRow(rowIdx int, oldRow []types.Datum, cols []*table.Column) ([]types.Datum, error) { newRowData := types.CloneRow(oldRow) e.evalBuffer.SetDatums(newRowData...) - for _, assign := range e.OrderedList { + for _, assign := range e.OrderedList[:e.virtualAssignmentsOffset] { handleIdx, handleFound := e.tblColPosInfos.FindHandle(assign.Col.Index) if handleFound && e.canNotUpdate(oldRow[handleIdx]) { continue } val, err := assign.Expr.Eval(e.evalBuffer.ToRow()) + if err != nil { + return nil, err + } + + // info of `_tidb_rowid` column is nil. + // No need to cast `_tidb_rowid` column value. + if cols[assign.Col.Index] != nil { + val, err = table.CastValue(e.ctx, val, cols[assign.Col.Index].ColumnInfo, false, false) + if err = e.handleErr(assign.ColName, rowIdx, err); err != nil { + return nil, err + } + } + + val.Copy(&newRowData[assign.Col.Index]) + } + return newRowData, nil +} + +func (e *UpdateExec) composeGeneratedColumns(rowIdx int, newRowData []types.Datum, cols []*table.Column) ([]types.Datum, error) { + if e.allAssignmentsAreConstant { + return newRowData, nil + } + e.evalBuffer.SetDatums(newRowData...) + for _, assign := range e.OrderedList[e.virtualAssignmentsOffset:] { + handleIdx, handleFound := e.tblColPosInfos.FindHandle(assign.Col.Index) + if handleFound && e.canNotUpdate(newRowData[handleIdx]) { + continue + } + val, err := assign.Expr.Eval(e.evalBuffer.ToRow()) if err = e.handleErr(assign.ColName, rowIdx, err); err != nil { return nil, err } @@ -294,7 +424,7 @@ func (e *UpdateExec) setMessage() { numMatched := e.matched numChanged := stmtCtx.UpdatedRows() numWarnings := stmtCtx.WarningCount() - msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUpdateInfo], numMatched, numChanged, numWarnings) + msg := fmt.Sprintf(mysql.MySQLErrName[mysql.ErrUpdateInfo].Raw, numMatched, numChanged, numWarnings) stmtCtx.SetMessage(msg) } diff --git a/executor/update_test.go b/executor/update_test.go index 164b1f5eef45f..1811d0f913ffe 100644 --- a/executor/update_test.go +++ b/executor/update_test.go @@ -24,8 +24,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/testkit" ) @@ -34,7 +33,6 @@ type testUpdateSuite struct { store kv.Storage domain *domain.Domain *parser.Parser - ctx *mock.Context } func (s *testUpdateSuite) SetUpSuite(c *C) { @@ -235,6 +233,99 @@ func (s *testUpdateSuite) TestUpdateMultiDatabaseTable(c *C) { tk.MustExec("update t, test2.t set test.t.a=1") } +func (s *testUpdateSuite) TestUpdateSwapColumnValues(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1 (c_str varchar(40))") + tk.MustExec("create table t2 (c_str varchar(40))") + tk.MustExec("insert into t1 values ('Alice')") + tk.MustExec("insert into t2 values ('Bob')") + tk.MustQuery("select t1.c_str, t2.c_str from t1, t2 where t1.c_str <= t2.c_str").Check(testkit.Rows("Alice Bob")) + tk.MustExec("update t1, t2 set t1.c_str = t2.c_str, t2.c_str = t1.c_str where t1.c_str <= t2.c_str") + tk.MustQuery("select t1.c_str, t2.c_str from t1, t2 where t1.c_str <= t2.c_str").Check(testkit.Rows()) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values(1, 2)") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2")) + tk.MustExec("update t set a=b, b=a") + tk.MustQuery("select * from t").Check(testkit.Rows("2 1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values (1,3)") + tk.MustQuery("select * from t").Check(testkit.Rows("1 3")) + tk.MustExec("update t set a=b, b=a") + tk.MustQuery("select * from t").Check(testkit.Rows("3 1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int as (-a) virtual, d int as (-b) stored)") + tk.MustExec("insert into t(a, b) values (10, 11), (20, 22)") + tk.MustQuery("select * from t").Check(testkit.Rows("10 11 -10 -11", "20 22 -20 -22")) + tk.MustExec("update t set a=b, b=a") + tk.MustQuery("select * from t").Check(testkit.Rows("11 10 -11 -10", "22 20 -22 -20")) + tk.MustExec("update t set b=30, a=b") + tk.MustQuery("select * from t").Check(testkit.Rows("10 30 -10 -30", "20 30 -20 -30")) +} + +func (s *testUpdateSuite) TestMultiUpdateOnSameTable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(x int, y int)") + tk.MustExec("insert into t values()") + tk.MustExec("update t t1, t t2 set t2.y=1, t1.x=2") + tk.MustQuery("select * from t").Check(testkit.Rows("2 1")) + tk.MustExec("update t t1, t t2 set t1.x=t2.y, t2.y=t1.x") + tk.MustQuery("select * from t").Check(testkit.Rows("1 2")) + + // Update generated columns + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(x int, y int, z int as (x+10) stored, w int as (y-10) virtual)") + tk.MustExec("insert into t(x, y) values(1, 2), (3, 4)") + tk.MustExec("update t t1, t t2 set t2.y=1, t1.x=2 where t1.x=1") + tk.MustQuery("select * from t").Check(testkit.Rows("2 1 12 -9", "3 1 13 -9")) + + tk.MustExec("update t t1, t t2 set t1.x=5, t2.y=t1.x where t1.x=3") + tk.MustQuery("select * from t").Check(testkit.Rows("2 3 12 -7", "5 3 15 -7")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int as (a+b) stored)") + tk.MustExec("insert into t(a, b) values (1, 2)") + tk.MustExec("update t t1, t t2 set t2.a=3") + tk.MustQuery("select * from t").Check(testkit.Rows("3 2 5")) + + tk.MustExec("update t t1, t t2 set t1.a=4, t2.b=5") + tk.MustQuery("select * from t").Check(testkit.Rows("4 5 9")) + + // Update primary keys + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key)") + tk.MustExec("insert into t values (1), (2)") + tk.MustExec("update t set a=a+2") + tk.MustQuery("select * from t").Check(testkit.Rows("3", "4")) + tk.MustExec("update t m, t n set m.a = n.a+10 where m.a=n.a") + tk.MustQuery("select * from t").Check(testkit.Rows("13", "14")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key, b int)") + tk.MustExec("insert into t values (1,3), (2,4)") + tk.MustGetErrMsg("update t m, t n set m.a = n.a+10, n.b = m.b+1 where m.a=n.a", + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, primary key(a, b))") + tk.MustExec("insert into t values (1,3,5), (2,4,6)") + tk.MustExec("update t m, t n set m.a = n.a+10, m.b = n.b+10 where m.a=n.a") + tk.MustQuery("select * from t").Check(testkit.Rows("11 13 5", "12 14 6")) + tk.MustExec("update t m, t n, t q set q.c=m.a+n.b, n.c = m.a+1, m.c = n.b+1 where m.b=n.b AND m.a=q.a") + tk.MustQuery("select * from t").Check(testkit.Rows("11 13 24", "12 14 26")) + tk.MustGetErrMsg("update t m, t n, t q set m.a = m.a+1, n.c = n.c-1, q.c = q.a+q.b where m.b=n.b and n.b=q.b", + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) +} + var _ = SerialSuites(&testSuite11{&baseTestSuite{}}) type testSuite11 struct { @@ -243,8 +334,8 @@ type testSuite11 struct { func (s *testSuite11) TestUpdateClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) tk.MustExec(`use test`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists t`) tk.MustExec(`create table t(id varchar(200) primary key, v int)`) @@ -295,8 +386,8 @@ func (s *testSuite11) TestUpdateClusterIndex(c *C) { func (s *testSuite11) TestDeleteClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) tk.MustExec(`use test`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists t`) tk.MustExec(`create table t(id varchar(200) primary key, v int)`) @@ -330,8 +421,8 @@ func (s *testSuite11) TestDeleteClusterIndex(c *C) { func (s *testSuite11) TestReplaceClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec(`set @@tidb_enable_clustered_index=true`) tk.MustExec(`use test`) + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec(`drop table if exists rt1pk`) tk.MustExec(`create table rt1pk(id varchar(200) primary key, v int)`) @@ -362,7 +453,7 @@ func (s *testSuite11) TestPessimisticUpdatePKLazyCheck(c *C) { } func (s *testSuite11) testUpdatePKLazyCheck(c *C, tk *testkit.TestKit, clusteredIndex bool) { - tk.MustExec(fmt.Sprintf(`set @@tidb_enable_clustered_index=%v`, clusteredIndex)) + tk.Se.GetSessionVars().EnableClusteredIndex = clusteredIndex tk.MustExec(`drop table if exists upk`) tk.MustExec(`create table upk (a int, b int, c int, primary key (a, b))`) tk.MustExec(`insert upk values (1, 1, 1), (2, 2, 2), (3, 3, 3)`) @@ -392,3 +483,37 @@ func getPresumeExistsCount(c *C, se session.Session) int { } return presumeNotExistsCnt } + +func (s *testSuite11) TestOutOfRangeWithUnsigned(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test`) + tk.MustExec(`drop table if exists t`) + tk.MustExec(`create table t(ts int(10) unsigned NULL DEFAULT NULL)`) + tk.MustExec(`insert into t values(1)`) + _, err := tk.Exec("update t set ts = IF(ts < (0 - ts), 1,1) where ts>0") + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(0 - test.t.ts)'") +} + +func (s *testPointGetSuite) TestIssue21447(c *C) { + tk1, tk2 := testkit.NewTestKit(c, s.store), testkit.NewTestKit(c, s.store) + tk1.MustExec("use test") + tk2.MustExec("use test") + + tk1.MustExec("drop table if exists t1") + tk1.MustExec("create table t1(id int primary key, name varchar(40))") + tk1.MustExec("insert into t1 values(1, 'abc')") + + tk1.MustExec("begin pessimistic") + tk2.MustExec("begin pessimistic") + tk2.MustExec("update t1 set name='xyz' where id=1") + tk2.CheckExecResult(1, 0) + tk2.MustQuery("select * from t1 where id = 1").Check(testkit.Rows("1 xyz")) + tk2.MustExec("commit") + tk1.MustExec("update t1 set name='xyz' where id=1") + tk1.CheckExecResult(0, 0) + tk1.MustQuery("select * from t1 where id = 1").Check(testkit.Rows("1 abc")) + tk1.MustQuery("select * from t1 where id = 1 for update").Check(testkit.Rows("1 xyz")) + tk1.MustQuery("select * from t1 where id in (1, 2)").Check(testkit.Rows("1 abc")) + tk1.MustQuery("select * from t1 where id in (1, 2) for update").Check(testkit.Rows("1 xyz")) + tk1.MustExec("commit") +} diff --git a/executor/utils.go b/executor/utils.go new file mode 100644 index 0000000000000..fbc9ab4dcff30 --- /dev/null +++ b/executor/utils.go @@ -0,0 +1,46 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package executor + +import "strings" + +func setFromString(value string) []string { + if len(value) == 0 { + return nil + } + return strings.Split(value, ",") +} + +// addToSet add a value to the set, e.g: +// addToSet("Select,Insert,Update", "Update") returns "Select,Insert,Update". +func addToSet(set []string, value string) []string { + for _, v := range set { + if v == value { + return set + } + } + return append(set, value) +} + +// deleteFromSet delete the value from the set, e.g: +// deleteFromSet("Select,Insert,Update", "Update") returns "Select,Insert". +func deleteFromSet(set []string, value string) []string { + for i, v := range set { + if v == value { + copy(set[i:], set[i+1:]) + return set[:len(set)-1] + } + } + return set +} diff --git a/executor/write.go b/executor/write.go index abb6c1318d0d2..3e86844897bb4 100644 --- a/executor/write.go +++ b/executor/write.go @@ -18,8 +18,12 @@ import ( "strings" "github.com/opentracing/opentracing-go" + "github.com/pingcap/errors" "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -92,7 +96,11 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old // 3. Compare datum, then handle some flags. for i, col := range t.Cols() { + collation := newData[i].Collation() + // We should use binary collation to compare datum, otherwise the result will be incorrect. + newData[i].SetCollation(charset.CollationBin) cmp, err := newData[i].CompareDatum(sc, &oldData[i]) + newData[i].SetCollation(collation) if err != nil { return false, err } @@ -187,6 +195,9 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old // If the new handle exists, this will avoid to remove the record. err = tables.CheckHandleExists(ctx, sctx, t, newHandle, newData) if err != nil { + if terr, ok := errors.Cause(err).(*terror.Error); sctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { + return false, nil + } return false, err } } @@ -203,19 +214,20 @@ func updateRecord(ctx context.Context, sctx sessionctx.Context, h kv.Handle, old if err != nil { return false, err } - if onDup { - sc.AddAffectedRows(1) - } } else { // Update record to new value and update index. if err = t.UpdateRecord(ctx, sctx, h, oldData, newData, modified); err != nil { + if terr, ok := errors.Cause(err).(*terror.Error); sctx.GetSessionVars().StmtCtx.IgnoreNoPartition && ok && terr.Code() == errno.ErrNoPartitionForGivenValue { + return false, nil + } return false, err } - if onDup { - sc.AddAffectedRows(2) - } else { - sc.AddAffectedRows(1) - } + + } + if onDup { + sc.AddAffectedRows(2) + } else { + sc.AddAffectedRows(1) } sc.AddUpdatedRows(1) sc.AddCopiedRows(1) @@ -235,7 +247,7 @@ func rebaseAutoRandomValue(sctx sessionctx.Context, t table.Table, newData *type if recordID < 0 { return nil } - layout := autoid.NewAutoRandomIDLayout(&col.FieldType, tableInfo.AutoRandomBits) + layout := autoid.NewShardIDLayout(&col.FieldType, tableInfo.AutoRandomBits) // Set bits except incremental_bits to zero. recordID = recordID & (1<= -8388608 AND c1 < -9 ORDER BY c1 LIMIT 2") - c.Assert(err.Error(), Equals, "[types:1690]DECIMAL value is out of range in '(4, 0)'") + c.Assert(err, IsNil) tk.MustExec("update (select * from t) t set c1 = 1111111") @@ -1518,7 +1560,7 @@ func (s *testSuite8) TestUpdate(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a datetime not null, b datetime)") tk.MustExec("insert into t value('1999-12-12', '1999-12-13')") - tk.MustExec(" set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") + tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") tk.MustQuery("select * from t").Check(testkit.Rows("1999-12-12 00:00:00 1999-12-13 00:00:00")) tk.MustExec("update t set a = ''") tk.MustQuery("select * from t").Check(testkit.Rows("0000-00-00 00:00:00 1999-12-13 00:00:00")) @@ -1608,7 +1650,7 @@ func (s *testSuite4) TestPartitionedTableUpdate(c *C) { // update partition column, old and new record locates on different partitions tk.MustExec(`update t set id = 20 where id = 8`) - tk.CheckExecResult(2, 0) + tk.CheckExecResult(1, 0) tk.CheckLastMessage("Rows matched: 1 Changed: 1 Warnings: 0") r = tk.MustQuery(`SELECT * from t order by id limit 2;`) r.Check(testkit.Rows("2 abc", "20 abc")) @@ -2002,6 +2044,38 @@ func (s *testSuite8) TestLoadDataMissingColumn(c *C) { } +func (s *testSuite4) TestIssue18681(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + createSQL := `drop table if exists load_data_test; + create table load_data_test (a bit(1),b bit(1),c bit(1),d bit(1));` + tk.MustExec(createSQL) + tk.MustExec("load data local infile '/tmp/nonexistence.csv' ignore into table load_data_test") + ctx := tk.Se.(sessionctx.Context) + ld, ok := ctx.Value(executor.LoadDataVarKey).(*executor.LoadDataInfo) + c.Assert(ok, IsTrue) + defer ctx.SetValue(executor.LoadDataVarKey, nil) + c.Assert(ld, NotNil) + + deleteSQL := "delete from load_data_test" + selectSQL := "select bin(a), bin(b), bin(c), bin(d) from load_data_test;" + ctx.GetSessionVars().StmtCtx.DupKeyAsWarning = true + ctx.GetSessionVars().StmtCtx.BadNullAsWarning = true + ld.SetMaxRowsInBatch(20000) + + sc := ctx.GetSessionVars().StmtCtx + originIgnoreTruncate := sc.IgnoreTruncate + defer func() { + sc.IgnoreTruncate = originIgnoreTruncate + }() + sc.IgnoreTruncate = false + tests := []testCase{ + {nil, []byte("true\tfalse\t0\t1\n"), []string{"1|0|0|1"}, nil, "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0"}, + } + checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + c.Assert(sc.WarningCount(), Equals, uint16(0)) +} + func (s *testSuite4) TestLoadData(c *C) { trivialMsg := "Records: 1 Deleted: 0 Skipped: 0 Warnings: 0" tk := testkit.NewTestKit(c, s.store) @@ -2171,6 +2245,33 @@ func (s *testSuite4) TestLoadData(c *C) { []string{"10|2|3|4", "40|||"}, []byte("xxx"), "Records: 2 Deleted: 0 Skipped: 0 Warnings: 1"}, } checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + + // test line terminator in field quoter + ld.LinesInfo.Terminated = "\n" + ld.FieldsInfo.Enclosed = '"' + tests = []testCase{ + {[]byte("xxx1\\1\\\"2\n\"\\3\nxxx4\\4\\\"5\n5\"\\6"), nil, []string{"1|1|2\n|3", "4|4|5\n5|6"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + } + checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + + ld.LinesInfo.Terminated = "#\n" + ld.FieldsInfo.Terminated = "#" + tests = []testCase{ + {[]byte("xxx1#\nxxx2#\n"), nil, []string{"1|||", "2|||"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + {[]byte("xxx1#2#3#4#\nnxxx2#3#4#5#\n"), nil, []string{"1|2|3|4", "2|3|4|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + {[]byte("xxx1#2#\"3#\"#\"4\n\"#\nxxx2#3#\"#4#\n\"#5#\n"), nil, []string{"1|2|3#|4", "2|3|#4#\n|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + } + checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) + + ld.LinesInfo.Terminated = "#" + ld.FieldsInfo.Terminated = "##" + ld.LinesInfo.Starting = "" + tests = []testCase{ + {[]byte("1#2#"), nil, []string{"1|||", "2|||"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + {[]byte("1##2##3##4#2##3##4##5#"), nil, []string{"1|2|3|4", "2|3|4|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + {[]byte("1##2##\"3##\"##\"4\n\"#2##3##\"##4#\"##5#"), nil, []string{"1|2|3##|4", "2|3|##4#|5"}, nil, "Records: 2 Deleted: 0 Skipped: 0 Warnings: 0"}, + } + checkCases(tests, ld, c, tk, ctx, selectSQL, deleteSQL) } func (s *testSuite4) TestLoadDataEscape(c *C) { @@ -2321,7 +2422,10 @@ func (s *testBypassSuite) TestLatch(c *C) { mockstore.WithTxnLocalLatches(64), ) c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() dom, err1 := session.BootstrapSession(store) c.Assert(err1, IsNil) @@ -2585,7 +2689,7 @@ func (s *testSuite7) TestReplaceLog(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - _, err = indexOpr.Create(s.ctx, txn.GetUnionStore(), types.MakeDatums(1), kv.IntHandle(1)) + _, err = indexOpr.Create(s.ctx, txn, types.MakeDatums(1), kv.IntHandle(1), nil) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) @@ -2820,7 +2924,7 @@ func (s *testSuite7) TestSetWithCurrentTimestampAndNow(c *C) { tk.MustExec("use test") tk.MustExec(`drop table if exists tbl;`) tk.MustExec(`create table t1(c1 timestamp default current_timestamp, c2 int, c3 timestamp default current_timestamp);`) - //c1 insert using now() function result, c3 using default value calculation, should be same + // c1 insert using now() function result, c3 using default value calculation, should be same tk.MustExec(`insert into t1 set c1 = current_timestamp, c2 = sleep(2);`) tk.MustQuery("select c1 = c3 from t1").Check(testkit.Rows("1")) tk.MustExec(`insert into t1 set c1 = current_timestamp, c2 = sleep(1);`) @@ -2867,3 +2971,1001 @@ from t order by c_str;`).Check(testkit.Rows("10")) tk.MustQuery(`select sum((select t1.c_str from t t1 where t1.c_int in (11, 10086) and t1.c_str > t.c_str order by t1.c_decimal limit 1) is null) nulls from t order by c_str;`).Check(testkit.Rows("10")) } + +func (s *testSuite4) TestWriteListPartitionTable(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + + // Test insert,update,delete + tk.MustExec("insert into t values (1, 'a')") + tk.MustExec("update t set name='b' where id=2;") + tk.MustQuery("select * from t").Check(testkit.Rows("1 a")) + tk.MustExec("update t set name='b' where id=1;") + tk.MustQuery("select * from t").Check(testkit.Rows("1 b")) + tk.MustExec("replace into t values (1, 'c')") + tk.MustQuery("select * from t").Check(testkit.Rows("1 c")) + tk.MustExec("insert into t values (1, 'd') on duplicate key update name='e'") + tk.MustQuery("select * from t").Check(testkit.Rows("1 e")) + tk.MustExec("delete from t where id=1") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (2, 'f')") + tk.MustExec("delete from t where name='f'") + tk.MustQuery("select * from t").Check(testkit.Rows()) + + // Test insert error + tk.MustExec("insert into t values (1, 'a')") + _, err := tk.Exec("insert into t values (1, 'd')") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + _, err = tk.Exec("insert into t values (100, 'd')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + tk.MustExec("admin check table t;") + + // Test select partition + tk.MustExec("insert into t values (2,'b'),(3,'c'),(4,'d'),(7,'f'), (null,null)") + tk.MustQuery("select * from t partition (p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition (p1,p3) order by id").Check(testkit.Rows(" ", "1 a", "2 b", "7 f")) + tk.MustQuery("select * from t partition (p1,p3,p0,p2) order by id").Check(testkit.Rows(" ", "1 a", "2 b", "3 c", "4 d", "7 f")) + tk.MustQuery("select * from t order by id").Check(testkit.Rows(" ", "1 a", "2 b", "3 c", "4 d", "7 f")) + tk.MustExec("delete from t partition (p0)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows(" ", "1 a", "2 b", "4 d", "7 f")) + tk.MustExec("delete from t partition (p3,p2)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 b")) +} + +func (s *testSuite4) TestWriteListColumnsPartitionTable(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int, name varchar(10), unique index idx (id)) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + + // Test insert,update,delete + tk.MustExec("insert into t values (1, 'a')") + tk.MustExec("update t set name='b' where id=2;") + tk.MustQuery("select * from t").Check(testkit.Rows("1 a")) + tk.MustExec("update t set name='b' where id=1;") + tk.MustQuery("select * from t").Check(testkit.Rows("1 b")) + tk.MustExec("replace into t values (1, 'c')") + tk.MustQuery("select * from t").Check(testkit.Rows("1 c")) + tk.MustExec("insert into t values (1, 'd') on duplicate key update name='e'") + tk.MustQuery("select * from t").Check(testkit.Rows("1 e")) + tk.MustExec("delete from t where id=1") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (2, 'f')") + tk.MustExec("delete from t where name='f'") + tk.MustQuery("select * from t").Check(testkit.Rows()) + + // Test insert error + tk.MustExec("insert into t values (1, 'a')") + _, err := tk.Exec("insert into t values (1, 'd')") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + _, err = tk.Exec("insert into t values (100, 'd')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + tk.MustExec("admin check table t;") + + // Test select partition + tk.MustExec("insert into t values (2,'b'),(3,'c'),(4,'d'),(7,'f'), (null,null)") + tk.MustQuery("select * from t partition (p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition (p1,p3) order by id").Check(testkit.Rows(" ", "1 a", "2 b", "7 f")) + tk.MustQuery("select * from t partition (p1,p3,p0,p2) order by id").Check(testkit.Rows(" ", "1 a", "2 b", "3 c", "4 d", "7 f")) + tk.MustQuery("select * from t order by id").Check(testkit.Rows(" ", "1 a", "2 b", "3 c", "4 d", "7 f")) + tk.MustExec("delete from t partition (p0)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows(" ", "1 a", "2 b", "4 d", "7 f")) + tk.MustExec("delete from t partition (p3,p2)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 b")) +} + +// TestWriteListPartitionTable1 test for write list partition when the partition expression is simple. +func (s *testSuite4) TestWriteListPartitionTable1(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int, name varchar(10)) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + + // Test add unique index failed. + tk.MustExec("insert into t values (1, 'a'),(1,'b')") + _, err := tk.Exec("alter table t add unique index idx (id)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + // Test add unique index success. + tk.MustExec("delete from t where name='b'") + tk.MustExec("alter table t add unique index idx (id)") + + // --------------------------Test insert--------------------------- + // Test insert 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(2,'b'),(10,'c')") + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b", "10 c")) + // Test insert multi-partitions. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(3,'c'),(4,'e')") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate. + tk.MustExec("insert into t values (1, 'd'), (3,'f'),(5,'g') on duplicate key update name='x'") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate error + _, err = tk.Exec("insert into t values (3, 'a'), (11,'x') on duplicate key update id=id+1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) + // Test insert ignore with duplicate + tk.MustExec("insert ignore into t values (1, 'b'), (5,'a'),(null,'y')") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '5' for key 'idx'")) + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows(" y")) + // Test insert ignore without duplicate + tk.MustExec("insert ignore into t values (15, 'a'),(17,'a')") + tk.MustQuery("select * from t partition(p0,p1,p2) order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g", "17 a")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows(" y", "15 a")) + // Test insert meet no partition error. + _, err = tk.Exec("insert into t values (100, 'd')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + + // --------------------------Test update--------------------------- + // Test update 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(2,'b'),(3,'c')") + tk.MustExec("update t set name='b' where id=2;") + tk.MustQuery("select * from t partition(p1)").Check(testkit.Rows("1 a", "2 b")) + tk.MustExec("update t set name='x' where id in (1,2)") + tk.MustQuery("select * from t partition(p1)").Check(testkit.Rows("1 x", "2 x")) + tk.MustExec("update t set name='y' where id < 3") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=2 where id = 1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + + // Test update multi-partitions + tk.MustExec("update t set name='z' where id in (1,2,3);") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 z", "2 z", "3 z")) + tk.MustExec("update t set name='a' limit 3") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 a", "3 a")) + tk.MustExec("update t set id=id*10 where id in (1,2)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=id+17 where id in (3,10)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet no partition error. + _, err = tk.Exec("update t set id=id*2 where id in (3,20)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 40") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + + // --------------------------Test replace--------------------------- + // Test replace 1 partition. + tk.MustExec("delete from t") + tk.MustExec("replace into t values (1, 'a'),(2,'b')") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 b")) + // Test replace multi-partitions. + tk.MustExec("replace into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 d")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows("7 f")) + // Test replace on duplicate. + tk.MustExec("replace into t values (1, 'x'),(7,'x')") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + // Test replace meet no partition error. + _, err = tk.Exec("replace into t values (10,'x'),(50,'x')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 50") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + + // --------------------------Test delete--------------------------- + // Test delete 1 partition. + tk.MustExec("delete from t where id = 3") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows()) + tk.MustExec("delete from t where id in (1,2)") + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows()) + // Test delete multi-partitions. + tk.MustExec("delete from t where id in (4,7,10,11)") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t where id < 10") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t limit 3") + tk.MustQuery("select * from t").Check(testkit.Rows()) +} + +// TestWriteListPartitionTable2 test for write list partition when the partition expression is complicated and contain generated column. +func (s *testSuite4) TestWriteListPartitionTable2(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int, name varchar(10),b int generated always as (length(name)+1) virtual) + partition by list (id*2 + b*b + b*b - b*b*2 - abs(id)) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + + // Test add unique index failed. + tk.MustExec("insert into t (id,name) values (1, 'a'),(1,'b')") + _, err := tk.Exec("alter table t add unique index idx (id,b)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1-2' for key 'idx'") + // Test add unique index success. + tk.MustExec("delete from t where name='b'") + tk.MustExec("alter table t add unique index idx (id,b)") + + // --------------------------Test insert--------------------------- + // Test insert 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t (id,name) values (1, 'a'),(2,'b'),(10,'c')") + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b", "10 c")) + // Test insert multi-partitions. + tk.MustExec("delete from t") + tk.MustExec("insert into t (id,name) values (1, 'a'),(3,'c'),(4,'e')") + tk.MustQuery("select id,name from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows("1 a")) + tk.MustQuery("select id,name from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate. + tk.MustExec("insert into t (id,name) values (1, 'd'), (3,'f'),(5,'g') on duplicate key update name='x'") + tk.MustQuery("select id,name from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select id,name from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate error + _, err = tk.Exec("insert into t (id,name) values (3, 'a'), (11,'x') on duplicate key update id=id+1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4-2' for key 'idx'") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) + // Test insert ignore with duplicate + tk.MustExec("insert ignore into t (id,name) values (1, 'b'), (5,'a'),(null,'y')") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry '1-2' for key 'idx'", "Warning 1062 Duplicate entry '5-2' for key 'idx'")) + tk.MustQuery("select id,name from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select id,name from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows(" y")) + // Test insert ignore without duplicate + tk.MustExec("insert ignore into t (id,name) values (15, 'a'),(17,'a')") + tk.MustQuery("select id,name from t partition(p0,p1,p2) order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g", "17 a")) + tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows(" y", "15 a")) + // Test insert meet no partition error. + _, err = tk.Exec("insert into t (id,name) values (100, 'd')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 100") + + // --------------------------Test update--------------------------- + // Test update 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t (id,name) values (1, 'a'),(2,'b'),(3,'c')") + tk.MustExec("update t set name='b' where id=2;") + tk.MustQuery("select id,name from t partition(p1)").Check(testkit.Rows("1 a", "2 b")) + tk.MustExec("update t set name='x' where id in (1,2)") + tk.MustQuery("select id,name from t partition(p1)").Check(testkit.Rows("1 x", "2 x")) + tk.MustExec("update t set name='y' where id < 3") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=2 where id = 1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2-2' for key 'idx'") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + + // Test update multi-partitions + tk.MustExec("update t set name='z' where id in (1,2,3);") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 z", "2 z", "3 z")) + tk.MustExec("update t set name='a' limit 3") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 a", "2 a", "3 a")) + tk.MustExec("update t set id=id*10 where id in (1,2)") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=id+17 where id in (3,10)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20-2' for key 'idx'") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet no partition error. + _, err = tk.Exec("update t set id=id*2 where id in (3,20)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 40") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + + // --------------------------Test replace--------------------------- + // Test replace 1 partition. + tk.MustExec("delete from t") + tk.MustExec("replace into t (id,name) values (1, 'a'),(2,'b')") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 a", "2 b")) + // Test replace multi-partitions. + tk.MustExec("replace into t (id,name) values (3, 'c'),(4,'d'),(7,'f')") + tk.MustQuery("select id,name from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b")) + tk.MustQuery("select id,name from t partition(p2) order by id").Check(testkit.Rows("4 d")) + tk.MustQuery("select id,name from t partition(p3) order by id").Check(testkit.Rows("7 f")) + // Test replace on duplicate. + tk.MustExec("replace into t (id,name) values (1, 'x'),(7,'x')") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + // Test replace meet no partition error. + _, err = tk.Exec("replace into t (id,name) values (10,'x'),(50,'x')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 50") + tk.MustQuery("select id,name from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + + // --------------------------Test delete--------------------------- + // Test delete 1 partition. + tk.MustExec("delete from t where id = 3") + tk.MustQuery("select id,name from t partition(p0) order by id").Check(testkit.Rows()) + tk.MustExec("delete from t where id in (1,2)") + tk.MustQuery("select id,name from t partition(p1) order by id").Check(testkit.Rows()) + // Test delete multi-partitions. + tk.MustExec("delete from t where id in (4,7,10,11)") + tk.MustQuery("select id,name from t").Check(testkit.Rows()) + tk.MustExec("insert into t (id,name) values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t where id < 10") + tk.MustQuery("select id,name from t").Check(testkit.Rows()) + tk.MustExec("insert into t (id,name) values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t limit 3") + tk.MustQuery("select id,name from t").Check(testkit.Rows()) +} + +func (s *testSuite4) TestWriteListColumnsPartitionTable1(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int, name varchar(10)) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + + // Test add unique index failed. + tk.MustExec("insert into t values (1, 'a'),(1,'b')") + _, err := tk.Exec("alter table t add unique index idx (id)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1' for key 'idx'") + // Test add unique index success. + tk.MustExec("delete from t where name='b'") + tk.MustExec("alter table t add unique index idx (id)") + + // --------------------------Test insert--------------------------- + // Test insert 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(2,'b'),(10,'c')") + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b", "10 c")) + // Test insert multi-partitions. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(3,'c'),(4,'e')") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate. + tk.MustExec("insert into t values (1, 'd'), (3,'f'),(5,'g') on duplicate key update name='x'") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows()) + // Test insert on duplicate error + _, err = tk.Exec("insert into t values (3, 'a'), (11,'x') on duplicate key update id=id+1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '4' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g")) + // Test insert ignore with duplicate + tk.MustExec("insert ignore into t values (1, 'b'), (5,'a'),(null,'y')") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry '1' for key 'idx'", "Warning 1062 Duplicate entry '5' for key 'idx'")) + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 x", "5 g")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 x")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 e")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows(" y")) + // Test insert ignore without duplicate + tk.MustExec("insert ignore into t values (15, 'a'),(17,'a')") + tk.MustQuery("select * from t partition(p0,p1,p2) order by id").Check(testkit.Rows("1 x", "3 x", "4 e", "5 g", "17 a")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows(" y", "15 a")) + // Test insert meet no partition error. + _, err = tk.Exec("insert into t values (100, 'd')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + + // --------------------------Test update--------------------------- + // Test update 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values (1, 'a'),(2,'b'),(3,'c')") + tk.MustExec("update t set name='b' where id=2;") + tk.MustQuery("select * from t partition(p1)").Check(testkit.Rows("1 a", "2 b")) + tk.MustExec("update t set name='x' where id in (1,2)") + tk.MustQuery("select * from t partition(p1)").Check(testkit.Rows("1 x", "2 x")) + tk.MustExec("update t set name='y' where id < 3") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=2 where id = 1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '2' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 y", "2 y", "3 c")) + + // Test update multi-partitions + tk.MustExec("update t set name='z' where id in (1,2,3);") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 z", "2 z", "3 z")) + tk.MustExec("update t set name='a' limit 3") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 a", "3 a")) + tk.MustExec("update t set id=id*10 where id in (1,2)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=id+17 where id in (3,10)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '20' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + // Test update meet no partition error. + _, err = tk.Exec("update t set id=id*2 where id in (3,20)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("3 a", "10 a", "20 a")) + + // --------------------------Test replace--------------------------- + // Test replace 1 partition. + tk.MustExec("delete from t") + tk.MustExec("replace into t values (1, 'a'),(2,'b')") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 a", "2 b")) + // Test replace multi-partitions. + tk.MustExec("replace into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows("3 c")) + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows("1 a", "2 b")) + tk.MustQuery("select * from t partition(p2) order by id").Check(testkit.Rows("4 d")) + tk.MustQuery("select * from t partition(p3) order by id").Check(testkit.Rows("7 f")) + // Test replace on duplicate. + tk.MustExec("replace into t values (1, 'x'),(7,'x')") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + // Test replace meet no partition error. + _, err = tk.Exec("replace into t values (10,'x'),(100,'x')") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("1 x", "2 b", "3 c", "4 d", "7 x")) + + // --------------------------Test delete--------------------------- + // Test delete 1 partition. + tk.MustExec("delete from t where id = 3") + tk.MustQuery("select * from t partition(p0) order by id").Check(testkit.Rows()) + tk.MustExec("delete from t where id in (1,2)") + tk.MustQuery("select * from t partition(p1) order by id").Check(testkit.Rows()) + // Test delete multi-partitions. + tk.MustExec("delete from t where id in (4,7,10,11)") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t where id < 10") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("insert into t values (3, 'c'),(4,'d'),(7,'f')") + tk.MustExec("delete from t limit 3") + tk.MustQuery("select * from t").Check(testkit.Rows()) +} + +// TestWriteListColumnsPartitionTable2 test for write list partition when the partition by multi-columns. +func (s *testSuite4) TestWriteListColumnsPartitionTable2(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (location varchar(10), id int, a int) partition by list columns (location,id) ( + partition p_west values in (('w', 1),('w', 2),('w', 3),('w', 4)), + partition p_east values in (('e', 5),('e', 6),('e', 7),('e', 8)), + partition p_north values in (('n', 9),('n',10),('n',11),('n',12)), + partition p_south values in (('s',13),('s',14),('s',15),('s',16)) + );`) + + // Test add unique index failed. + tk.MustExec("insert into t values ('w', 1, 1),('w', 1, 2)") + _, err := tk.Exec("alter table t add unique index idx (location,id)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") + // Test add unique index success. + tk.MustExec("delete from t where a=2") + tk.MustExec("alter table t add unique index idx (location,id)") + + // --------------------------Test insert--------------------------- + // Test insert 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values ('w', 1, 1),('w', 2, 2),('w', 3, 3)") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2", "w 3 3")) + // Test insert multi-partitions. + tk.MustExec("delete from t") + tk.MustExec("insert into t values ('w', 1, 1),('e', 5, 5),('n', 9, 9)") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1")) + tk.MustQuery("select * from t partition(p_east) order by id").Check(testkit.Rows("e 5 5")) + tk.MustQuery("select * from t partition(p_north) order by id").Check(testkit.Rows("n 9 9")) + tk.MustQuery("select * from t partition(p_south) order by id").Check(testkit.Rows()) + // Test insert on duplicate. + tk.MustExec("insert into t values ('w', 1, 1) on duplicate key update a=a+1") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 2")) + // Test insert on duplicate and move from partition 1 to partition 2 + tk.MustExec("insert into t values ('w', 1, 1) on duplicate key update location='s', id=13") + tk.MustQuery("select * from t partition(p_south) order by id").Check(testkit.Rows("s 13 2")) + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows()) + // Test insert on duplicate error + tk.MustExec("insert into t values ('w', 2, 2), ('w', 1, 1)") + _, err = tk.Exec("insert into t values ('w', 2, 3) on duplicate key update id=1") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-1' for key 'idx'") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2")) + // Test insert ignore with duplicate + tk.MustExec("insert ignore into t values ('w', 2, 2), ('w', 3, 3), ('n', 10, 10)") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry 'w-2' for key 'idx'")) + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2", "w 3 3")) + tk.MustQuery("select * from t partition(p_north) order by id").Check(testkit.Rows("n 9 9", "n 10 10")) + // Test insert ignore without duplicate + tk.MustExec("insert ignore into t values ('w', 4, 4), ('s', 14, 14)") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2", "w 3 3", "w 4 4")) + tk.MustQuery("select * from t partition(p_south) order by id").Check(testkit.Rows("s 13 2", "s 14 14")) + // Test insert meet no partition error. + _, err = tk.Exec("insert into t values ('w', 5, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("insert into t values ('s', 5, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("insert into t values ('s', 100, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("insert into t values ('x', 1, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + + // --------------------------Test update--------------------------- + // Test update 1 partition. + tk.MustExec("delete from t") + tk.MustExec("insert into t values ('w', 1, 1),('w', 2, 2),('w', 3, 3)") + tk.MustExec("update t set a=2 where a=1") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 2", "w 2 2", "w 3 3")) + tk.MustExec("update t set a=3 where location='w'") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 3", "w 2 3", "w 3 3")) + tk.MustExec("update t set a=4 where location='w' and id=1") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 4", "w 2 3", "w 3 3")) + tk.MustExec("update t set a=5 where id=1") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 5", "w 2 3", "w 3 3")) + tk.MustExec("update t set a=a+id where id>1") + tk.MustQuery("select * from t partition(p_west) order by id,a").Check(testkit.Rows("w 1 5", "w 2 5", "w 3 6")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=id+1 where location='w' and id<2") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") + tk.MustQuery("select * from t partition(p_west) order by id,a").Check(testkit.Rows("w 1 5", "w 2 5", "w 3 6")) + + // Test update multi-partitions + tk.MustExec("delete from t") + tk.MustExec("insert into t values ('w', 1, 1), ('w', 2, 2), ('e', 8, 8),('n', 11, 11)") + tk.MustExec("update t set a=a+1 where id < 20") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 2", "w 2 3", "e 8 9", "n 11 12")) + tk.MustExec("update t set a=a+1 where location in ('w','s','n')") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 3", "w 2 4", "e 8 9", "n 11 13")) + tk.MustExec("update t set a=a+1 where location in ('w','s','n') and id in (1,3,5,7,8,9,11)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 14")) + tk.MustExec("update t set a=a+1 where location='n' and id=12") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 14")) + tk.MustExec("update t set a=a+1 where location='n' and id=11") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) + // Test update meet duplicate error. + _, err = tk.Exec("update t set id=id+1 where location='w' and id in (1,2)") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry 'w-2' for key 'idx'") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) + // Test update meet no partition error. + _, err = tk.Exec("update t set id=id+3 where location='w' and id in (1,2)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "e 8 9", "n 11 15")) + // Test update that move from partition 1 to partition 2. + // TODO: fix this + tk.MustExec("update t set location='s', id=14 where location='e' and id=8") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 4", "w 2 4", "n 11 15", "s 14 9")) + + // --------------------------Test replace--------------------------- + // Test replace 1 partition. + tk.MustExec("delete from t") + tk.MustExec("replace into t values ('w', 1, 1),('w', 2, 2),('w', 3, 3)") + tk.MustQuery("select * from t partition(p_west) order by id").Check(testkit.Rows("w 1 1", "w 2 2", "w 3 3")) + // Test replace multi-partitions. + tk.MustExec("delete from t") + tk.MustExec("replace into t values ('w', 1, 1),('e', 5, 5),('n', 9, 9)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 1", "e 5 5", "n 9 9")) + // Test replace on duplicate. + tk.MustExec("replace into t values ('w', 1, 2),('n', 10, 10)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 2", "e 5 5", "n 9 9", "n 10 10")) + // Test replace meet no partition error. + _, err = tk.Exec("replace into t values ('w', 5, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("replace into t values ('s', 5, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("replace into t values ('s', 100, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + _, err = tk.Exec("replace into t values ('x', 1, 5)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value from column_list") + + // --------------------------Test delete--------------------------- + // Test delete 1 partition. + tk.MustExec("delete from t where location='w' and id=2") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("w 1 2", "e 5 5", "n 9 9", "n 10 10")) + tk.MustExec("delete from t where location='w' and id=1") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("e 5 5", "n 9 9", "n 10 10")) + // Test delete multi-partitions. + tk.MustExec("delete from t where location in ('w','e','n') and id in (1,2,3,4,5,8,9)") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("n 10 10")) + tk.MustExec("delete from t where a=10") + tk.MustQuery("select * from t order by id").Check(testkit.Rows()) + tk.MustExec("replace into t values ('w', 1, 1),('e', 5, 5),('n', 11, 11)") + tk.MustExec("delete from t where id < 10") + tk.MustQuery("select * from t order by id").Check(testkit.Rows("n 11 11")) + tk.MustExec("delete from t limit 1") + tk.MustQuery("select * from t order by id").Check(testkit.Rows()) +} + +// TestWriteListColumnsPartitionTable2 test for write list partition when the partition by multi-columns. +func (s *testSuite4) TestWriteListPartitionTableIssue21437(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (a int) partition by list (a%10) (partition p0 values in (0,1));`) + _, err := tk.Exec("replace into t values (null)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value NULL") +} + +func (s *testSuite4) TestListPartitionWithAutoRandom(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (a bigint key auto_random (3), b int) partition by list (a%5) (partition p0 values in (0,1,2), partition p1 values in (3,4));`) + tk.MustExec("set @@allow_auto_random_explicit_insert = true") + tk.MustExec("replace into t values (1,1)") + result := []string{"1"} + for i := 2; i < 100; i++ { + sql := fmt.Sprintf("insert into t (b) values (%v)", i) + tk.MustExec(sql) + result = append(result, strconv.Itoa(i)) + } + tk.MustQuery("select b from t order by b").Check(testkit.Rows(result...)) + tk.MustExec("update t set b=b+1 where a=1") + tk.MustQuery("select b from t where a=1").Check(testkit.Rows("2")) + tk.MustExec("update t set b=b+1 where a<2") + tk.MustQuery("select b from t where a<2").Check(testkit.Rows("3")) + tk.MustExec("insert into t values (1, 1) on duplicate key update b=b+1") + tk.MustQuery("select b from t where a=1").Check(testkit.Rows("4")) +} + +func (s *testSuite4) TestListPartitionWithAutoIncrement(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (a bigint key auto_increment, b int) partition by list (a%5) (partition p0 values in (0,1,2), partition p1 values in (3,4));`) + tk.MustExec("set @@allow_auto_random_explicit_insert = true") + tk.MustExec("replace into t values (1,1)") + result := []string{"1"} + for i := 2; i < 100; i++ { + sql := fmt.Sprintf("insert into t (b) values (%v)", i) + tk.MustExec(sql) + result = append(result, strconv.Itoa(i)) + } + tk.MustQuery("select b from t order by b").Check(testkit.Rows(result...)) + tk.MustExec("update t set b=b+1 where a=1") + tk.MustQuery("select b from t where a=1").Check(testkit.Rows("2")) + tk.MustExec("update t set b=b+1 where a<2") + tk.MustQuery("select b from t where a<2").Check(testkit.Rows("3")) + tk.MustExec("insert into t values (1, 1) on duplicate key update b=b+1") + tk.MustQuery("select b from t where a=1").Check(testkit.Rows("4")) +} + +func (s *testSuite4) TestListPartitionWithGeneratedColumn(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + // Test for generated column with bigint type. + tableDefs := []string{ + // Test for virtual generated column for list partition + `create table t (a bigint, b bigint GENERATED ALWAYS AS (3*a - 2*a) VIRTUAL, index idx(a)) partition by list (5*b - 4*b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10));`, + // Test for stored generated column for list partition + `create table t (a bigint, b bigint GENERATED ALWAYS AS (3*a - 2*a) STORED, index idx(a)) partition by list (5*b - 4*b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10));`, + // Test for virtual generated column for list columns partition + `create table t (a bigint, b bigint GENERATED ALWAYS AS (3*a - 2*a) VIRTUAL, index idx(a)) partition by list columns(b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10));`, + // Test for stored generated column for list columns partition + `create table t (a bigint, b bigint GENERATED ALWAYS AS (3*a - 2*a) STORED, index idx(a)) partition by list columns(b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10));`, + } + for _, tbl := range tableDefs { + tk.MustExec("drop table if exists t") + tk.MustExec(tbl) + // Test for insert + tk.MustExec("insert into t (a) values (1),(3),(5),(7),(9)") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("1", "3", "5")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("7", "9")) + tk.MustQuery("select * from t where a = 1").Check(testkit.Rows("1 1")) + // Test for update + tk.MustExec("update t set a=a+1 where a = 1") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("2", "3", "5")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("7", "9")) + tk.MustQuery("select * from t where a = 1").Check(testkit.Rows()) + tk.MustQuery("select * from t where a = 2").Check(testkit.Rows("2 2")) + // Test for delete + tk.MustExec("delete from t where a>10") + tk.MustQuery("select count(1) from t").Check(testkit.Rows("5")) + tk.MustExec("delete from t where a=9") + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("7")) + tk.MustQuery("select count(1) from t").Check(testkit.Rows("4")) + + // Test for insert meet no partition error + _, err := tk.Exec("insert into t (a) values (11)") + c.Assert(table.ErrNoPartitionForGivenValue.Equal(err), IsTrue) + // Test for update meet no partition error + _, err = tk.Exec("update t set a=a+10 where a = 2") + c.Assert(table.ErrNoPartitionForGivenValue.Equal(err), IsTrue) + } +} + +func (s *testSuite4) TestListPartitionWithGeneratedColumn1(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + // Test for generated column with year type. + tableDefs := []string{ + // Test for virtual generated column for list partition + `create table t (a year, b year GENERATED ALWAYS AS (3*a - 2*a) VIRTUAL, index idx(a)) partition by list (1 + b - 1) (partition p0 values in (2001,2002,2003,2004,2005), partition p1 values in (2006,2007,2008,2009));`, + // Test for stored generated column for list partition + `create table t (a year, b year GENERATED ALWAYS AS (3*a - 2*a) STORED, index idx(a)) partition by list (1 + b - 1) (partition p0 values in (2001,2002,2003,2004,2005), partition p1 values in (2006,2007,2008,2009));`, + } + for _, tbl := range tableDefs { + tk.MustExec("drop table if exists t") + tk.MustExec(tbl) + // Test for insert + tk.MustExec("insert into t (a) values (1),(3),(5),(7),(9)") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("2001", "2003", "2005")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007", "2009")) + tk.MustQuery("select * from t where a = 1").Check(testkit.Rows("2001 2001")) + // Test for update + tk.MustExec("update t set a=a+1 where a = 1") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("2002", "2003", "2005")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007", "2009")) + tk.MustQuery("select * from t where a = 1").Check(testkit.Rows()) + tk.MustQuery("select * from t where a = 2").Check(testkit.Rows("2002 2002")) + // Test for delete + tk.MustExec("delete from t where a>10") + tk.MustQuery("select count(1) from t").Check(testkit.Rows("5")) + tk.MustExec("delete from t where a=9") + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007")) + tk.MustQuery("select count(1) from t").Check(testkit.Rows("4")) + + // Test for insert meet no partition error + _, err := tk.Exec("insert into t (a) values (11)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2011") + // Test for update meet no partition error + _, err = tk.Exec("update t set a=a+10 where a = 2") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2012") + + tk.MustExec("delete from t") + + // Test for insert + tk.MustExec("insert into t (a) values (2001),(2003),(2005),(2007),(2009)") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("2001", "2003", "2005")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007", "2009")) + tk.MustQuery("select * from t where a = 2001").Check(testkit.Rows("2001 2001")) + // Test for update + tk.MustExec("update t set a=a+1 where a = 2001") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("2002", "2003", "2005")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007", "2009")) + tk.MustQuery("select * from t where a = 2001").Check(testkit.Rows()) + tk.MustQuery("select * from t where a = 2002").Check(testkit.Rows("2002 2002")) + // Test for delete + tk.MustExec("delete from t where a>2010") + tk.MustQuery("select count(1) from t").Check(testkit.Rows("5")) + tk.MustExec("delete from t where a=2009") + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2007")) + tk.MustQuery("select count(1) from t").Check(testkit.Rows("4")) + + // Test for insert meet no partition error + _, err = tk.Exec("insert into t (a) values (2011)") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2011") + // Test for update meet no partition error + _, err = tk.Exec("update t set a=a+10 where a = 2002") + c.Assert(err.Error(), Equals, "[table:1526]Table has no partition for value 2012") + } +} + +func (s *testSuite4) TestListPartitionWithGeneratedColumn2(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tableDefs := []string{ + // Test for virtual generated column for datetime type in list partition. + `create table t (a datetime, b bigint GENERATED ALWAYS AS (to_seconds(a)) VIRTUAL, index idx(a)) partition by list (1 + b - 1) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + // Test for stored generated column for datetime type in list partition. + `create table t (a datetime, b bigint GENERATED ALWAYS AS (to_seconds(a)) STORED, index idx(a)) partition by list (1 + b - 1) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + // Test for virtual generated column for timestamp type in list partition. + `create table t (a timestamp, b bigint GENERATED ALWAYS AS (to_seconds(a)) VIRTUAL, index idx(a)) partition by list (1 + b - 1) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + // Test for stored generated column for timestamp type in list partition. + `create table t (a timestamp, b bigint GENERATED ALWAYS AS (to_seconds(a)) STORED, index idx(a)) partition by list (1 + b - 1) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + // Test for virtual generated column for timestamp type in list columns partition. + `create table t (a timestamp, b bigint GENERATED ALWAYS AS (to_seconds(a)) VIRTUAL, index idx(a)) partition by list columns(b) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + // Test for stored generated column for timestamp type in list columns partition. + `create table t (a timestamp, b bigint GENERATED ALWAYS AS (to_seconds(a)) STORED, index idx(a)) partition by list columns(b) ( + partition p0 values in (to_seconds('2020-09-28 17:03:38'),to_seconds('2020-09-28 17:03:39')), + partition p1 values in (to_seconds('2020-09-28 17:03:40'),to_seconds('2020-09-28 17:03:41')));`, + } + for _, tbl := range tableDefs { + tk.MustExec("drop table if exists t") + tk.MustExec(tbl) + tk.MustExec("insert into t (a) values ('2020-09-28 17:03:38'),('2020-09-28 17:03:40')") + tk.MustQuery("select a from t partition (p0)").Check(testkit.Rows("2020-09-28 17:03:38")) + tk.MustQuery("select a from t where a = '2020-09-28 17:03:40'").Check(testkit.Rows("2020-09-28 17:03:40")) + tk.MustExec("update t set a='2020-09-28 17:03:41' where a = '2020-09-28 17:03:38'") + tk.MustQuery("select a from t partition (p0)").Check(testkit.Rows()) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("2020-09-28 17:03:40", "2020-09-28 17:03:41")) + } +} + +func (s *testSuite4) TestListColumnsPartitionWithGeneratedColumn(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + // Test for generated column with substr expression. + tableDefs := []string{ + // Test for virtual generated column + `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) VIRTUAL, index idx(a)) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, + // Test for stored generated column + `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) STORED, index idx(a)) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, + } + for _, tbl := range tableDefs { + tk.MustExec("drop table if exists t") + tk.MustExec(tbl) + tk.MustExec("insert into t (a) values ('aaa'),('abc'),('acd')") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("aaa", "abc", "acd")) + tk.MustQuery("select * from t where a = 'abc' order by a").Check(testkit.Rows("abc a")) + tk.MustExec("update t set a='bbb' where a = 'aaa'") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("abc", "acd")) + tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("bbb")) + tk.MustQuery("select * from t where a = 'bbb' order by a").Check(testkit.Rows("bbb b")) + } +} + +func (s *testSerialSuite2) TestListColumnsPartitionWithGlobalIndex(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + // Test generated column with global index + restoreConfig := config.RestoreFunc() + defer restoreConfig() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableGlobalIndex = true + }) + tableDefs := []string{ + // Test for virtual generated column with global index + `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) VIRTUAL) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, + // Test for stored generated column with global index + `create table t (a varchar(10), b varchar(1) GENERATED ALWAYS AS (substr(a,1,1)) STORED) partition by list columns(b) (partition p0 values in ('a','c'), partition p1 values in ('b','d'));`, + } + for _, tbl := range tableDefs { + tk.MustExec("drop table if exists t") + tk.MustExec(tbl) + tk.MustExec("alter table t add unique index (a)") + tk.MustExec("insert into t (a) values ('aaa'),('abc'),('acd')") + tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("aaa", "abc", "acd")) + tk.MustQuery("select * from t where a = 'abc' order by a").Check(testkit.Rows("abc a")) + tk.MustExec("update t set a='bbb' where a = 'aaa'") + tk.MustExec("admin check table t") + tk.MustQuery("select a from t order by a").Check(testkit.Rows("abc", "acd", "bbb")) + // TODO: fix below test. + //tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("abc", "acd")) + //tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("bbb")) + tk.MustQuery("select * from t where a = 'bbb' order by a").Check(testkit.Rows("bbb b")) + // Test insert meet duplicate error. + _, err := tk.Exec("insert into t (a) values ('abc')") + c.Assert(err, NotNil) + // Test insert on duplicate update + tk.MustExec("insert into t (a) values ('abc') on duplicate key update a='bbc'") + tk.MustQuery("select a from t order by a").Check(testkit.Rows("acd", "bbb", "bbc")) + tk.MustQuery("select * from t where a = 'bbc'").Check(testkit.Rows("bbc b")) + // TODO: fix below test. + //tk.MustQuery("select a from t partition (p0) order by a").Check(testkit.Rows("acd")) + //tk.MustQuery("select a from t partition (p1) order by a").Check(testkit.Rows("bbb", "bbc")) + } +} + +func (s *testSerialSuite) TestIssue20724(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(a varchar(10) collate utf8mb4_general_ci)") + tk.MustExec("insert into t1 values ('a')") + tk.MustExec("update t1 set a = 'A'") + tk.MustQuery("select * from t1").Check(testkit.Rows("A")) + tk.MustExec("drop table t1") +} + +func (s *testSerialSuite) TestIssue20840(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.Se.GetSessionVars().EnableClusteredIndex = false + tk.MustExec("create table t1 (i varchar(20) unique key) collate=utf8mb4_general_ci") + tk.MustExec("insert into t1 values ('a')") + tk.MustExec("replace into t1 values ('A')") + tk.MustQuery("select * from t1").Check(testkit.Rows("A")) + tk.MustExec("drop table t1") +} + +func (s *testSerialSuite) TestIssue22496(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t12") + tk.MustExec("create table t12(d decimal(15,2));") + _, err := tk.Exec("insert into t12 values('1,9999.00')") + c.Assert(err, NotNil) + tk.MustExec("set sql_mode=''") + tk.MustExec("insert into t12 values('1,999.00');") + tk.MustQuery("SELECT * FROM t12;").Check(testkit.Rows("1.00")) + tk.MustExec("drop table t12") +} + +func (s *testSuite) TestEqualDatumsAsBinary(c *C) { + tests := []struct { + a []interface{} + b []interface{} + same bool + }{ + // Positive cases + {[]interface{}{1}, []interface{}{1}, true}, + {[]interface{}{1, "aa"}, []interface{}{1, "aa"}, true}, + {[]interface{}{1, "aa", 1}, []interface{}{1, "aa", 1}, true}, + + // negative cases + {[]interface{}{1}, []interface{}{2}, false}, + {[]interface{}{1, "a"}, []interface{}{1, "aaaaaa"}, false}, + {[]interface{}{1, "aa", 3}, []interface{}{1, "aa", 2}, false}, + + // Corner cases + {[]interface{}{}, []interface{}{}, true}, + {[]interface{}{nil}, []interface{}{nil}, true}, + {[]interface{}{}, []interface{}{1}, false}, + {[]interface{}{1}, []interface{}{1, 1}, false}, + {[]interface{}{nil}, []interface{}{1}, false}, + } + for _, tt := range tests { + testEqualDatumsAsBinary(c, tt.a, tt.b, tt.same) + } +} + +func (s *testSuite) TestIssue21232(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t, t1") + tk.MustExec("create table t(a varchar(1), index idx(a))") + tk.MustExec("create table t1(a varchar(5), index idx(a))") + tk.MustExec("insert into t values('a'), ('b')") + tk.MustExec("insert into t1 values('a'), ('bbbbb')") + tk.MustExec("update /*+ INL_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) + tk.MustExec("update /*+ INL_HASH_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) + tk.MustExec("update /*+ INL_MERGE_JOIN(t) */ t, t1 set t.a='a' where t.a=t1.a") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select * from t").Check(testkit.Rows("a", "b")) +} + +func testEqualDatumsAsBinary(c *C, a []interface{}, b []interface{}, same bool) { + sc := new(stmtctx.StatementContext) + re := new(executor.ReplaceExec) + sc.IgnoreTruncate = true + res, err := re.EqualDatumsAsBinary(sc, types.MakeDatums(a...), types.MakeDatums(b...)) + c.Assert(err, IsNil) + c.Assert(res, Equals, same, Commentf("a: %v, b: %v", a, b)) +} diff --git a/expression/aggregation/agg_to_pb.go b/expression/aggregation/agg_to_pb.go index 8a4473ac32ea8..e07c598bcf005 100644 --- a/expression/aggregation/agg_to_pb.go +++ b/expression/aggregation/agg_to_pb.go @@ -80,7 +80,7 @@ func AggFuncToPBExpr(sc *stmtctx.StatementContext, client kv.Client, aggFunc *Ag } children = append(children, pbArg) } - return &tipb.Expr{Tp: tp, Children: children, FieldType: expression.ToPBFieldType(aggFunc.RetTp)} + return &tipb.Expr{Tp: tp, Children: children, FieldType: expression.ToPBFieldType(aggFunc.RetTp), HasDistinct: aggFunc.HasDistinct} } // PBExprToAggFuncDesc converts pb to aggregate function. diff --git a/expression/aggregation/agg_to_pb_test.go b/expression/aggregation/agg_to_pb_test.go index ec2af4f31c2b5..5030959eed08b 100644 --- a/expression/aggregation/agg_to_pb_test.go +++ b/expression/aggregation/agg_to_pb_test.go @@ -15,6 +15,7 @@ package aggregation import ( "encoding/json" + "fmt" "testing" . "github.com/pingcap/check" @@ -76,13 +77,13 @@ func (s *testEvaluatorSuite) TestAggFunc2Pb(c *C) { } jsons := []string{ - `{"tp":3002,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, - `{"tp":3001,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":8,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, - `{"tp":3003,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, + `{"tp":3002,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, + `{"tp":3001,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":8,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, + `{"tp":3003,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, "null", - `{"tp":3005,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, - `{"tp":3004,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, - `{"tp":3006,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""}}`, + `{"tp":3005,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, + `{"tp":3004,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, + `{"tp":3006,"children":[{"tp":201,"val":"gAAAAAAAAAE=","sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":false}],"sig":0,"field_type":{"tp":5,"flag":0,"flen":-1,"decimal":-1,"collate":63,"charset":""},"has_distinct":%v}`, } for i, funcName := range funcNames { for _, hasDistinct := range []bool{true, false} { @@ -93,7 +94,11 @@ func (s *testEvaluatorSuite) TestAggFunc2Pb(c *C) { pbExpr := AggFuncToPBExpr(sc, client, aggFunc) js, err := json.Marshal(pbExpr) c.Assert(err, IsNil) - c.Assert(string(js), Equals, jsons[i]) + if funcName != ast.AggFuncGroupConcat { + c.Assert(string(js), Equals, fmt.Sprintf(jsons[i], hasDistinct)) + } else { + c.Assert(string(js), Equals, "null") + } } } } diff --git a/expression/aggregation/base_func.go b/expression/aggregation/base_func.go index 9cac708aba9ab..a0c609b374dac 100644 --- a/expression/aggregation/base_func.go +++ b/expression/aggregation/base_func.go @@ -181,10 +181,16 @@ func (a *baseFuncDesc) typeInfer4Sum(ctx sessionctx.Context) { switch a.Args[0].GetType().Tp { case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear: a.RetTp = types.NewFieldType(mysql.TypeNewDecimal) - a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxDecimalWidth, 0 + a.RetTp.Flen, a.RetTp.Decimal = mathutil.Min(a.Args[0].GetType().Flen+21, mysql.MaxDecimalWidth), 0 + if a.Args[0].GetType().Flen < 0 || a.RetTp.Flen > mysql.MaxDecimalWidth { + a.RetTp.Flen = mysql.MaxDecimalWidth + } case mysql.TypeNewDecimal: a.RetTp = types.NewFieldType(mysql.TypeNewDecimal) - a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxDecimalWidth, a.Args[0].GetType().Decimal + a.RetTp.Flen, a.RetTp.Decimal = a.Args[0].GetType().Flen+22, a.Args[0].GetType().Decimal + if a.Args[0].GetType().Flen < 0 || a.RetTp.Flen > mysql.MaxDecimalWidth { + a.RetTp.Flen = mysql.MaxDecimalWidth + } if a.RetTp.Decimal < 0 || a.RetTp.Decimal > mysql.MaxDecimalScale { a.RetTp.Decimal = mysql.MaxDecimalScale } @@ -209,10 +215,16 @@ func (a *baseFuncDesc) typeInfer4Avg(ctx sessionctx.Context) { } else { a.RetTp.Decimal = mathutil.Min(a.Args[0].GetType().Decimal+types.DivFracIncr, mysql.MaxDecimalScale) } - a.RetTp.Flen = mysql.MaxDecimalWidth + a.RetTp.Flen = mathutil.Min(mysql.MaxDecimalWidth, a.Args[0].GetType().Flen+types.DivFracIncr) + if a.Args[0].GetType().Flen < 0 { + a.RetTp.Flen = mysql.MaxDecimalWidth + } case mysql.TypeDouble, mysql.TypeFloat: a.RetTp = types.NewFieldType(mysql.TypeDouble) a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxRealWidth, a.Args[0].GetType().Decimal + case mysql.TypeDate, mysql.TypeDuration, mysql.TypeDatetime, mysql.TypeTimestamp: + a.RetTp = types.NewFieldType(mysql.TypeDouble) + a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxRealWidth, 4 default: a.RetTp = types.NewFieldType(mysql.TypeDouble) a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxRealWidth, types.UnspecifiedLength @@ -297,7 +309,7 @@ func (a *baseFuncDesc) typeInfer4LeadLag(ctx sessionctx.Context) { } func (a *baseFuncDesc) typeInfer4PopOrSamp(ctx sessionctx.Context) { - //var_pop/std/var_samp/stddev_samp's return value type is double + // var_pop/std/var_samp/stddev_samp's return value type is double a.RetTp = types.NewFieldType(mysql.TypeDouble) a.RetTp.Flen, a.RetTp.Decimal = mysql.MaxRealWidth, types.UnspecifiedLength } @@ -348,6 +360,18 @@ var noNeedCastAggFuncs = map[string]struct{}{ ast.AggFuncJsonObjectAgg: {}, } +// WrapCastAsDecimalForAggArgs wraps the args of some specific aggregate functions +// with a cast as decimal function. See issue #19426 +func (a *baseFuncDesc) WrapCastAsDecimalForAggArgs(ctx sessionctx.Context) { + if a.Name == ast.AggFuncGroupConcat { + for i := 0; i < len(a.Args)-1; i++ { + if tp := a.Args[i].GetType(); tp.Tp == mysql.TypeNewDecimal { + a.Args[i] = expression.BuildCastFunction(ctx, a.Args[i], tp) + } + } + } +} + // WrapCastForAggArgs wraps the args of an aggregate function with a cast function. func (a *baseFuncDesc) WrapCastForAggArgs(ctx sessionctx.Context) { if len(a.Args) == 0 { diff --git a/expression/aggregation/base_func_test.go b/expression/aggregation/base_func_test.go index bf6e96364fe39..ba7fd757fdbaa 100644 --- a/expression/aggregation/base_func_test.go +++ b/expression/aggregation/base_func_test.go @@ -39,14 +39,3 @@ func (s *testBaseFuncSuite) TestClone(c *check.C) { c.Assert(desc.Args[0], check.Equals, col) c.Assert(desc.equal(s.ctx, cloned), check.IsFalse) } - -func (s *testBaseFuncSuite) TestMaxMin(c *check.C) { - col := &expression.Column{ - UniqueID: 0, - RetType: types.NewFieldType(mysql.TypeLonglong), - } - col.RetType.Flag |= mysql.NotNullFlag - desc, err := newBaseFuncDesc(s.ctx, ast.AggFuncMax, []expression.Expression{col}) - c.Assert(err, check.IsNil) - c.Assert(mysql.HasNotNullFlag(desc.RetTp.Flag), check.IsFalse) -} diff --git a/expression/aggregation/descriptor.go b/expression/aggregation/descriptor.go index 0c08c48f03961..af16d26b1f81a 100644 --- a/expression/aggregation/descriptor.go +++ b/expression/aggregation/descriptor.go @@ -19,6 +19,7 @@ import ( "math" "strconv" + "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" @@ -272,3 +273,43 @@ func (a *AggFuncDesc) evalNullValueInOuterJoin4BitOr(ctx sessionctx.Context, sch } return con.Value, true } + +// UpdateNotNullFlag4RetType checks if we should remove the NotNull flag for the return type of the agg. +func (a *AggFuncDesc) UpdateNotNullFlag4RetType(hasGroupBy, allAggsFirstRow bool) error { + var removeNotNull bool + switch a.Name { + case ast.AggFuncCount, ast.AggFuncApproxCountDistinct, ast.AggFuncApproxPercentile, + ast.AggFuncBitAnd, ast.AggFuncBitOr, ast.AggFuncBitXor, + ast.WindowFuncFirstValue, ast.WindowFuncLastValue, ast.WindowFuncNthValue, ast.WindowFuncRowNumber, + ast.WindowFuncRank, ast.WindowFuncDenseRank, ast.WindowFuncCumeDist, ast.WindowFuncNtile, ast.WindowFuncPercentRank, + ast.WindowFuncLead, ast.WindowFuncLag, ast.AggFuncJsonObjectAgg, + ast.AggFuncVarSamp, ast.AggFuncVarPop, ast.AggFuncStddevPop, ast.AggFuncStddevSamp: + removeNotNull = false + case ast.AggFuncSum, ast.AggFuncAvg, ast.AggFuncGroupConcat: + if !hasGroupBy { + removeNotNull = true + } + // `select max(a) from empty_tbl` returns `null`, while `select max(a) from empty_tbl group by b` returns empty. + case ast.AggFuncMax, ast.AggFuncMin: + if !hasGroupBy && a.RetTp.Tp != mysql.TypeBit { + removeNotNull = true + } + // `select distinct a from empty_tbl` returns empty + // `select a from empty_tbl group by b` returns empty + // `select a, max(a) from empty_tbl` returns `(null, null)` + // `select a, max(a) from empty_tbl group by b` returns empty + // `select a, count(a) from empty_tbl` returns `(null, 0)` + // `select a, count(a) from empty_tbl group by b` returns empty + case ast.AggFuncFirstRow: + if !allAggsFirstRow && !hasGroupBy { + removeNotNull = true + } + default: + return errors.Errorf("unsupported agg function: %s", a.Name) + } + if removeNotNull { + a.RetTp = a.RetTp.Clone() + a.RetTp.Flag &^= mysql.NotNullFlag + } + return nil +} diff --git a/expression/bench_test.go b/expression/bench_test.go index 133639f5486d9..f3b71abce94cd 100644 --- a/expression/bench_test.go +++ b/expression/bench_test.go @@ -706,10 +706,6 @@ type dateTimeGener struct { randGen *defaultRandGen } -func newDateTimeGener(fsp, year, month, day int) *dateTimeGener { - return &dateTimeGener{fsp, year, month, day, newDefaultRandGen()} -} - func (g *dateTimeGener) gen() interface{} { if g.Year == 0 { g.Year = 1970 + g.randGen.Intn(100) @@ -780,10 +776,10 @@ func (g *dateStrGener) gen() interface{} { g.Year = 1970 + g.randGen.Intn(100) } if g.Month == 0 { - g.Month = g.randGen.Intn(10) + 1 + g.Month = g.randGen.Intn(10) } if g.Day == 0 { - g.Day = g.randGen.Intn(20) + 1 + g.Day = g.randGen.Intn(20) } return fmt.Sprintf("%d-%d-%d", g.Year, g.Month, g.Day) @@ -1244,6 +1240,20 @@ func genVecBuiltinFuncBenchCase(ctx sessionctx.Context, funcName string, testCas fc = &castAsStringFunctionClass{baseFunctionClass{ast.Cast, 1, 1}, tp} } baseFunc, err = fc.getFunction(ctx, cols) + } else if funcName == ast.GetVar { + var fc functionClass + tp := eType2FieldType(testCase.retEvalType) + switch testCase.retEvalType { + case types.ETInt: + fc = &getIntVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, tp}} + case types.ETDecimal: + fc = &getDecimalVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, tp}} + case types.ETReal: + fc = &getRealVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, tp}} + default: + fc = &getStringVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, tp}} + } + baseFunc, err = fc.getFunction(ctx, cols) } else { baseFunc, err = funcs[funcName].getFunction(ctx, cols) } diff --git a/expression/builtin.go b/expression/builtin.go index 8df6a37587b20..46c61220f8ce5 100644 --- a/expression/builtin.go +++ b/expression/builtin.go @@ -241,6 +241,9 @@ func newBaseBuiltinFuncWithTp(ctx sessionctx.Context, funcName string, args []Ex if mysql.HasBinaryFlag(fieldType.Flag) && fieldType.Tp != mysql.TypeJSON { fieldType.Charset, fieldType.Collate = charset.CharsetBin, charset.CollationBin } + if _, ok := booleanFunctions[funcName]; ok { + fieldType.Flag |= mysql.IsBooleanFlag + } bf = baseBuiltinFunc{ bufAllocator: newLocalSliceBuffer(len(args)), childrenVectorizedOnce: new(sync.Once), @@ -550,17 +553,32 @@ type baseFunctionClass struct { } func (b *baseFunctionClass) verifyArgs(args []Expression) error { - l := len(args) + return b.verifyArgsByCount(len(args)) +} + +func (b *baseFunctionClass) verifyArgsByCount(l int) error { if l < b.minArgs || (b.maxArgs != -1 && l > b.maxArgs) { return ErrIncorrectParameterCount.GenWithStackByArgs(b.funcName) } return nil } +// VerifyArgsWrapper verifies a function by its name and the count of the arguments. +// Note that this function assumes that the function is supported. +func VerifyArgsWrapper(name string, l int) error { + f, ok := funcs[name] + if !ok { + return nil + } + return f.verifyArgsByCount(l) +} + // functionClass is the interface for a function which may contains multiple functions. type functionClass interface { // getFunction gets a function signature by the types and the counts of given arguments. getFunction(ctx sessionctx.Context, args []Expression) (builtinFunc, error) + // verifyArgsByCount verifies the count of parameters. + verifyArgsByCount(l int) error } // funcs holds all registered builtin functions. When new function is added, @@ -808,7 +826,6 @@ var funcs = map[string]functionClass{ ast.Case: &caseWhenFunctionClass{baseFunctionClass{ast.Case, 1, -1}}, ast.RowFunc: &rowFunctionClass{baseFunctionClass{ast.RowFunc, 2, -1}}, ast.SetVar: &setVarFunctionClass{baseFunctionClass{ast.SetVar, 2, 2}}, - ast.GetVar: &getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}}, ast.BitCount: &bitCountFunctionClass{baseFunctionClass{ast.BitCount, 1, 1}}, ast.GetParam: &getParamFunctionClass{baseFunctionClass{ast.GetParam, 1, 1}}, diff --git a/expression/builtin_arithmetic.go b/expression/builtin_arithmetic.go index e1f964bcf8f94..aae5fe1db9907 100644 --- a/expression/builtin_arithmetic.go +++ b/expression/builtin_arithmetic.go @@ -416,45 +416,71 @@ func (s *builtinArithmeticMinusIntSig) evalInt(row chunk.Row) (val int64, isNull return 0, isNull, err } forceToSigned := s.ctx.GetSessionVars().SQLMode.HasNoUnsignedSubtractionMode() - isLHSUnsigned := !forceToSigned && mysql.HasUnsignedFlag(s.args[0].GetType().Flag) - isRHSUnsigned := !forceToSigned && mysql.HasUnsignedFlag(s.args[1].GetType().Flag) + isLHSUnsigned := mysql.HasUnsignedFlag(s.args[0].GetType().Flag) + isRHSUnsigned := mysql.HasUnsignedFlag(s.args[1].GetType().Flag) - if forceToSigned && mysql.HasUnsignedFlag(s.args[0].GetType().Flag) { - if a < 0 { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) - } + errType := "BIGINT UNSIGNED" + signed := forceToSigned || (!isLHSUnsigned && !isRHSUnsigned) + if signed { + errType = "BIGINT" } - if forceToSigned && mysql.HasUnsignedFlag(s.args[1].GetType().Flag) { - if b < 0 { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) - } + overflow := s.overflowCheck(isLHSUnsigned, isRHSUnsigned, signed, a, b) + if overflow { + return 0, true, types.ErrOverflow.GenWithStackByArgs(errType, fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) } - switch { - case isLHSUnsigned && isRHSUnsigned: - if uint64(a) < uint64(b) { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) - } - case isLHSUnsigned && !isRHSUnsigned: - if b >= 0 && uint64(a) < uint64(b) { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) - } - if b < 0 && uint64(a) > math.MaxUint64-uint64(-b) { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) - } - case !isLHSUnsigned && isRHSUnsigned: - if a < 0 || uint64(a) < uint64(b) { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) + return a - b, false, nil +} + +// returns true when overflowed +func (s *builtinArithmeticMinusIntSig) overflowCheck(isLHSUnsigned, isRHSUnsigned, signed bool, a, b int64) bool { + res := a - b + ua, ub := uint64(a), uint64(b) + resUnsigned := false + if isLHSUnsigned { + if isRHSUnsigned { + if ua < ub { + if res >= 0 { + return true + } + } else { + resUnsigned = true + } + } else { + if b >= 0 { + if ua > ub { + resUnsigned = true + } + } else { + if testIfSumOverflowsUll(ua, uint64(-b)) { + return true + } + resUnsigned = true + } } - case !isLHSUnsigned && !isRHSUnsigned: - // We need `(a >= 0 && b == math.MinInt64)` due to `-(math.MinInt64) == math.MinInt64`. - // If `a<0 && b<=0`: `a-b` will not overflow even though b==math.MinInt64. - // If `a<0 && b>0`: `a-b` will not overflow only if `math.MinInt64<=a-b` satisfied - if (a >= 0 && b == math.MinInt64) || (a > 0 && -b > math.MaxInt64-a) || (a < 0 && -b < math.MinInt64-a) { - return 0, true, types.ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%s - %s)", s.args[0].String(), s.args[1].String())) + } else { + if isRHSUnsigned { + if uint64(a-math.MinInt64) < ub { + return true + } + } else { + if a > 0 && b < 0 { + resUnsigned = true + } else if a < 0 && b > 0 && res >= 0 { + return true + } } } - return a - b, false, nil + + if (!signed && !resUnsigned && res < 0) || (signed && resUnsigned && uint64(res) > uint64(math.MaxInt64)) { + return true + } + + return false +} + +func testIfSumOverflowsUll(a, b uint64) bool { + return math.MaxUint64-a < b } type arithmeticMultiplyFunctionClass struct { diff --git a/expression/builtin_arithmetic_vec.go b/expression/builtin_arithmetic_vec.go index c713265af292d..21209bf5b384c 100644 --- a/expression/builtin_arithmetic_vec.go +++ b/expression/builtin_arithmetic_vec.go @@ -349,152 +349,25 @@ func (b *builtinArithmeticMinusIntSig) vecEvalInt(input *chunk.Chunk, result *ch isLHSUnsigned := mysql.HasUnsignedFlag(b.args[0].GetType().Flag) isRHSUnsigned := mysql.HasUnsignedFlag(b.args[1].GetType().Flag) - switch { - case forceToSigned && isLHSUnsigned && isRHSUnsigned: - err = b.minusFUU(result, lhi64s, rhi64s, resulti64s) - case forceToSigned && isLHSUnsigned && !isRHSUnsigned: - err = b.minusFUS(result, lhi64s, rhi64s, resulti64s) - case forceToSigned && !isLHSUnsigned && isRHSUnsigned: - err = b.minusFSU(result, lhi64s, rhi64s, resulti64s) - case forceToSigned && !isLHSUnsigned && !isRHSUnsigned: - err = b.minusSS(result, lhi64s, rhi64s, resulti64s) - case !forceToSigned && isLHSUnsigned && isRHSUnsigned: - err = b.minusUU(result, lhi64s, rhi64s, resulti64s) - case !forceToSigned && isLHSUnsigned && !isRHSUnsigned: - err = b.minusUS(result, lhi64s, rhi64s, resulti64s) - case !forceToSigned && !isLHSUnsigned && isRHSUnsigned: - err = b.minusSU(result, lhi64s, rhi64s, resulti64s) - case !forceToSigned && !isLHSUnsigned && !isRHSUnsigned: - err = b.minusSS(result, lhi64s, rhi64s, resulti64s) - } - return err -} -func (b *builtinArithmeticMinusIntSig) minusFUU(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if lh < 0 { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - if rh < 0 { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - if (lh > 0 && -rh > math.MaxInt64-lh) || (lh < 0 && -rh < math.MinInt64-lh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%s + %s)", b.args[0].String(), b.args[1].String())) - } - - resulti64s[i] = lh - rh + errType := "BIGINT UNSIGNED" + signed := forceToSigned || (!isLHSUnsigned && !isRHSUnsigned) + if signed { + errType = "BIGINT" } - return nil -} - -func (b *builtinArithmeticMinusIntSig) minusFUS(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { for i := 0; i < len(lhi64s); i++ { if result.IsNull(i) { continue } lh, rh := lhi64s[i], rhi64s[i] - if lh < 0 { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - if (lh > 0 && -rh > math.MaxInt64-lh) || (lh < 0 && -rh < math.MinInt64-lh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%s + %s)", b.args[0].String(), b.args[1].String())) + overflow := b.overflowCheck(isLHSUnsigned, isRHSUnsigned, signed, lh, rh) + if overflow { + return types.ErrOverflow.GenWithStackByArgs(errType, fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) } resulti64s[i] = lh - rh } - return nil -} - -func (b *builtinArithmeticMinusIntSig) minusFSU(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if rh < 0 { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - if (lh > 0 && -rh > math.MaxInt64-lh) || (lh < 0 && -rh < math.MinInt64-lh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%s + %s)", b.args[0].String(), b.args[1].String())) - } - resulti64s[i] = lh - rh - } - return nil -} -func (b *builtinArithmeticMinusIntSig) minusUU(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if uint64(lh) < uint64(rh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - resulti64s[i] = lh - rh - } - return nil -} - -func (b *builtinArithmeticMinusIntSig) minusUS(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if rh >= 0 && uint64(lh) < uint64(rh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - if rh < 0 && uint64(lh) > math.MaxUint64-uint64(-rh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - resulti64s[i] = lh - rh - } - return nil -} - -func (b *builtinArithmeticMinusIntSig) minusSU(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if uint64(lh-math.MinInt64) < uint64(rh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - resulti64s[i] = lh - rh - } - return nil -} -func (b *builtinArithmeticMinusIntSig) minusSS(result *chunk.Column, lhi64s, rhi64s, resulti64s []int64) error { - for i := 0; i < len(lhi64s); i++ { - if result.IsNull(i) { - continue - } - lh, rh := lhi64s[i], rhi64s[i] - - if (lh > 0 && -rh > math.MaxInt64-lh) || (lh < 0 && -rh < math.MinInt64-lh) { - return types.ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%s - %s)", b.args[0].String(), b.args[1].String())) - } - - resulti64s[i] = lh - rh - } return nil } @@ -515,11 +388,11 @@ func (b *builtinArithmeticModRealSig) vecEvalReal(input *chunk.Chunk, result *ch if err := b.args[0].VecEvalReal(b.ctx, input, result); err != nil { return err } + result.MergeNulls(buf) x := result.Float64s() y := buf.Float64s() for i := 0; i < n; i++ { if buf.IsNull(i) { - result.SetNull(i, true) continue } if y[i] == 0 { @@ -529,9 +402,6 @@ func (b *builtinArithmeticModRealSig) vecEvalReal(input *chunk.Chunk, result *ch result.SetNull(i, true) continue } - if result.IsNull(i) { - continue - } x[i] = math.Mod(x[i], y[i]) } diff --git a/expression/builtin_cast.go b/expression/builtin_cast.go index 5782e22a432d8..9f55331f2fd46 100644 --- a/expression/builtin_cast.go +++ b/expression/builtin_cast.go @@ -546,11 +546,15 @@ func (b *builtinCastIntAsStringSig) evalString(row chunk.Row) (res string, isNul if isNull || err != nil { return res, isNull, err } - if !mysql.HasUnsignedFlag(b.args[0].GetType().Flag) { + tp := b.args[0].GetType() + if !mysql.HasUnsignedFlag(tp.Flag) { res = strconv.FormatInt(val, 10) } else { res = strconv.FormatUint(uint64(val), 10) } + if tp.Tp == mysql.TypeYear && res == "0" { + res = "0000" + } res, err = types.ProduceStrWithSpecifiedTp(res, b.tp, b.ctx.GetSessionVars().StmtCtx, false) if err != nil { return res, false, err @@ -573,7 +577,13 @@ func (b *builtinCastIntAsTimeSig) evalTime(row chunk.Row) (res types.Time, isNul if isNull || err != nil { return res, isNull, err } - res, err = types.ParseTimeFromNum(b.ctx.GetSessionVars().StmtCtx, val, b.tp.Tp, int8(b.tp.Decimal)) + + if b.args[0].GetType().Tp == mysql.TypeYear { + res, err = types.ParseTimeFromYear(b.ctx.GetSessionVars().StmtCtx, val) + } else { + res, err = types.ParseTimeFromNum(b.ctx.GetSessionVars().StmtCtx, val, b.tp.Tp, int8(b.tp.Decimal)) + } + if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } @@ -604,6 +614,9 @@ func (b *builtinCastIntAsDurationSig) evalDuration(row chunk.Row) (res types.Dur if types.ErrOverflow.Equal(err) { err = b.ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) } + if types.ErrTruncatedWrongVal.Equal(err) { + err = b.ctx.GetSessionVars().StmtCtx.HandleTruncate(err) + } return res, true, err } return dur, false, err @@ -1133,6 +1146,12 @@ func (b *builtinCastStringAsIntSig) evalInt(row chunk.Row) (res int64, isNull bo if b.args[0].GetType().Hybrid() || IsBinaryLiteral(b.args[0]) { return b.args[0].EvalInt(b.ctx, row) } + + // Take the implicit evalInt path if possible. + if CanImplicitEvalInt(b.args[0]) { + return b.args[0].EvalInt(b.ctx, row) + } + val, isNull, err := b.args[0].EvalString(b.ctx, row) if isNull || err != nil { return res, isNull, err @@ -1181,14 +1200,16 @@ func (b *builtinCastStringAsRealSig) evalReal(row chunk.Row) (res float64, isNul if IsBinaryLiteral(b.args[0]) { return b.args[0].EvalReal(b.ctx, row) } + + // Take the implicit evalReal path if possible. + if CanImplicitEvalReal(b.args[0]) { + return b.args[0].EvalReal(b.ctx, row) + } + val, isNull, err := b.args[0].EvalString(b.ctx, row) if isNull || err != nil { return res, isNull, err } - sctx := b.ctx.GetSessionVars().StmtCtx - if val == "" && (sctx.InInsertStmt || sctx.InUpdateStmt) { - return 0, false, nil - } sc := b.ctx.GetSessionVars().StmtCtx res, err = types.StrToFloat(sc, val, true) if err != nil { @@ -1608,7 +1629,7 @@ func (b *builtinCastJSONAsIntSig) evalInt(row chunk.Row) (res int64, isNull bool return res, isNull, err } sc := b.ctx.GetSessionVars().StmtCtx - res, err = types.ConvertJSONToInt(sc, val, mysql.HasUnsignedFlag(b.tp.Flag)) + res, err = types.ConvertJSONToInt64(sc, val, mysql.HasUnsignedFlag(b.tp.Flag)) return } @@ -1745,18 +1766,31 @@ func (i inCastContext) String() string { // @see BuildCastFunction4Union const inUnionCastContext inCastContext = 0 -// hasSpecialCast checks if this expr has its own special cast function. -// for example(#9713): when doing arithmetic using results of function DayName, -// "Monday" should be regarded as 0, "Tuesday" should be regarded as 1 and so on. -func hasSpecialCast(ctx sessionctx.Context, expr Expression, tp *types.FieldType) bool { +// CanImplicitEvalInt represents the builtin functions that have an implicit path to evaluate as integer, +// regardless of the type that type inference decides it to be. +// This is a nasty way to match the weird behavior of MySQL functions like `dayname()` being implicitly evaluated as integer. +// See https://github.com/mysql/mysql-server/blob/ee4455a33b10f1b1886044322e4893f587b319ed/sql/item_timefunc.h#L423 for details. +func CanImplicitEvalInt(expr Expression) bool { switch f := expr.(type) { case *ScalarFunction: switch f.FuncName.L { case ast.DayName: - switch tp.EvalType() { - case types.ETInt, types.ETReal: - return true - } + return true + } + } + return false +} + +// CanImplicitEvalReal represents the builtin functions that have an implicit path to evaluate as real, +// regardless of the type that type inference decides it to be. +// This is a nasty way to match the weird behavior of MySQL functions like `dayname()` being implicitly evaluated as real. +// See https://github.com/mysql/mysql-server/blob/ee4455a33b10f1b1886044322e4893f587b319ed/sql/item_timefunc.h#L423 for details. +func CanImplicitEvalReal(expr Expression) bool { + switch f := expr.(type) { + case *ScalarFunction: + switch f.FuncName.L { + case ast.DayName: + return true } } return false @@ -1774,10 +1808,6 @@ func BuildCastFunction4Union(ctx sessionctx.Context, expr Expression, tp *types. // BuildCastFunction builds a CAST ScalarFunction from the Expression. func BuildCastFunction(ctx sessionctx.Context, expr Expression, tp *types.FieldType) (res Expression) { - if hasSpecialCast(ctx, expr, tp) { - return expr - } - var fc functionClass switch tp.EvalType() { case types.ETInt: @@ -1871,6 +1901,10 @@ func WrapWithCastAsString(ctx sessionctx.Context, expr Expression) Expression { if exprTp.EvalType() == types.ETInt { argLen = mysql.MaxIntWidth } + // because we can't control the length of cast(float as char) for now, we can't determine the argLen + if exprTp.Tp == mysql.TypeFloat || exprTp.Tp == mysql.TypeDouble { + argLen = -1 + } tp := types.NewFieldType(mysql.TypeVarString) tp.Charset, tp.Collate = expr.CharsetAndCollation(ctx) tp.Flen, tp.Decimal = argLen, types.UnspecifiedLength diff --git a/expression/builtin_cast_test.go b/expression/builtin_cast_test.go index d5c6e6b055f00..57bdeed1afaec 100644 --- a/expression/builtin_cast_test.go +++ b/expression/builtin_cast_test.go @@ -223,7 +223,8 @@ func (s *testEvaluatorSuite) TestCastXXX(c *C) { res, err = f.Eval(chunk.Row{}) c.Assert(err, IsNil) resDecimal := new(types.MyDecimal) - resDecimal.FromString([]byte("99999.99")) + err = resDecimal.FromString([]byte("99999.99")) + c.Assert(err, IsNil) c.Assert(res.GetMysqlDecimal().Compare(resDecimal), Equals, 0) warnings = sc.GetWarnings() @@ -488,8 +489,8 @@ func (s *testEvaluatorSuite) TestCastFuncSig(c *C) { // cast real as int. { &Column{RetType: types.NewFieldType(mysql.TypeDouble), Index: 0}, - 1, - chunk.MutRowFromDatums([]types.Datum{types.NewFloat64Datum(1)}), + 2, + chunk.MutRowFromDatums([]types.Datum{types.NewFloat64Datum(2.5)}), }, // cast Time as int. { diff --git a/expression/builtin_cast_vec.go b/expression/builtin_cast_vec.go index 40bab4d432af4..4ec1d138f8f41 100644 --- a/expression/builtin_cast_vec.go +++ b/expression/builtin_cast_vec.go @@ -48,6 +48,9 @@ func (b *builtinCastIntAsDurationSig) vecEvalDuration(input *chunk.Chunk, result if types.ErrOverflow.Equal(err) { err = b.ctx.GetSessionVars().StmtCtx.HandleOverflow(err, err) } + if types.ErrTruncatedWrongVal.Equal(err) { + err = b.ctx.GetSessionVars().StmtCtx.HandleTruncate(err) + } if err != nil { return err } @@ -373,11 +376,19 @@ func (b *builtinCastIntAsTimeSig) vecEvalTime(input *chunk.Chunk, result *chunk. i64s := buf.Int64s() stmt := b.ctx.GetSessionVars().StmtCtx fsp := int8(b.tp.Decimal) + + var tm types.Time for i := 0; i < n; i++ { if buf.IsNull(i) { continue } - tm, err := types.ParseTimeFromNum(stmt, i64s[i], b.tp.Tp, fsp) + + if b.args[0].GetType().Tp == mysql.TypeYear { + tm, err = types.ParseTimeFromYear(stmt, i64s[i]) + } else { + tm, err = types.ParseTimeFromNum(stmt, i64s[i], b.tp.Tp, fsp) + } + if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err @@ -636,7 +647,9 @@ func (b *builtinCastIntAsStringSig) vecEvalString(input *chunk.Chunk, result *ch return err } - isUnsigned := mysql.HasUnsignedFlag(b.args[0].GetType().Flag) + tp := b.args[0].GetType() + isUnsigned := mysql.HasUnsignedFlag(tp.Flag) + isYearType := tp.Tp == mysql.TypeYear result.ReserveString(n) i64s := buf.Int64s() for i := 0; i < n; i++ { @@ -650,6 +663,9 @@ func (b *builtinCastIntAsStringSig) vecEvalString(input *chunk.Chunk, result *ch } else { str = strconv.FormatUint(uint64(i64s[i]), 10) } + if isYearType && str == "0" { + str = "0000" + } str, err = types.ProduceStrWithSpecifiedTp(str, b.tp, b.ctx.GetSessionVars().StmtCtx, false) if err != nil { return err @@ -847,6 +863,12 @@ func (b *builtinCastStringAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk if b.args[0].GetType().Hybrid() || IsBinaryLiteral(b.args[0]) { return b.args[0].VecEvalInt(b.ctx, input, result) } + + // Take the implicit evalInt path if possible. + if CanImplicitEvalInt(b.args[0]) { + return b.args[0].VecEvalInt(b.ctx, input, result) + } + result.ResizeInt64(n, false) buf, err := b.bufAllocator.get(types.ETString, n) if err != nil { @@ -1160,7 +1182,7 @@ func (b *builtinCastJSONAsIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.C if result.IsNull(i) { continue } - i64s[i], err = types.ConvertJSONToInt(sc, buf.GetJSON(i), mysql.HasUnsignedFlag(b.tp.Flag)) + i64s[i], err = types.ConvertJSONToInt64(sc, buf.GetJSON(i), mysql.HasUnsignedFlag(b.tp.Flag)) if err != nil { return err } @@ -1552,6 +1574,12 @@ func (b *builtinCastStringAsRealSig) vecEvalReal(input *chunk.Chunk, result *chu if IsBinaryLiteral(b.args[0]) { return b.args[0].VecEvalReal(b.ctx, input, result) } + + // Take the implicit evalReal path if possible. + if CanImplicitEvalReal(b.args[0]) { + return b.args[0].VecEvalReal(b.ctx, input, result) + } + n := input.NumRows() buf, err := b.bufAllocator.get(types.ETString, n) if err != nil { diff --git a/expression/builtin_cast_vec_test.go b/expression/builtin_cast_vec_test.go index 1b402c624a249..4cbcfd9aa1a1b 100644 --- a/expression/builtin_cast_vec_test.go +++ b/expression/builtin_cast_vec_test.go @@ -16,6 +16,7 @@ package expression import ( "math" "math/rand" + "strconv" "testing" "time" @@ -37,7 +38,7 @@ var vecBuiltinCastCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETReal}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDecimal}}, - {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETJson}}, + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETJson}, geners: []dataGenerator{&constJSONGener{strconv.Itoa(rand.Int())}}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDuration}}, { @@ -55,7 +56,7 @@ var vecBuiltinCastCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETDuration, childrenTypes: []types.EvalType{types.ETReal}, geners: []dataGenerator{newRandDurReal()}}, {retEvalType: types.ETDuration, childrenTypes: []types.EvalType{types.ETDecimal}, geners: []dataGenerator{newRandDurDecimal()}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal}}, - {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETJson}}, + {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETJson}, geners: []dataGenerator{newDecimalJSONGener(0)}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETDecimal}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETString}, geners: []dataGenerator{newRealStringGener()}}, {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETDatetime}}, diff --git a/expression/builtin_compare.go b/expression/builtin_compare.go index 8f590a6fc5ad7..7ee32a040585c 100644 --- a/expression/builtin_compare.go +++ b/expression/builtin_compare.go @@ -15,6 +15,7 @@ package expression import ( "math" + "strings" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" @@ -367,53 +368,74 @@ func (b *builtinCoalesceJSONSig) evalJSON(row chunk.Row) (res json.BinaryJSON, i return res, isNull, err } -// temporalWithDateAsNumEvalType makes DATE, DATETIME, TIMESTAMP pretend to be numbers rather than strings. -func temporalWithDateAsNumEvalType(argTp *types.FieldType) (argEvalType types.EvalType, isStr bool, isTemporalWithDate bool) { - argEvalType = argTp.EvalType() - isStr, isTemporalWithDate = argEvalType.IsStringKind(), types.IsTemporalWithDate(argTp.Tp) - if !isTemporalWithDate { - return +func aggregateType(args []Expression) *types.FieldType { + fieldTypes := make([]*types.FieldType, len(args)) + for i := range fieldTypes { + fieldTypes[i] = args[i].GetType() } - if argTp.Decimal > 0 { - argEvalType = types.ETDecimal - } else { - argEvalType = types.ETInt - } - return + return types.AggFieldType(fieldTypes) } -// GetCmpTp4MinMax gets compare type for GREATEST and LEAST and BETWEEN (mainly for datetime). -func GetCmpTp4MinMax(args []Expression) (argTp types.EvalType) { - datetimeFound, isAllStr := false, true - cmpEvalType, isStr, isTemporalWithDate := temporalWithDateAsNumEvalType(args[0].GetType()) - if !isStr { - isAllStr = false +// ResolveType4Between resolves eval type for between expression. +func ResolveType4Between(args [3]Expression) types.EvalType { + cmpTp := args[0].GetType().EvalType() + for i := 1; i < 3; i++ { + cmpTp = getBaseCmpType(cmpTp, args[i].GetType().EvalType(), nil, nil) } - if isTemporalWithDate { - datetimeFound = true + + hasTemporal := false + if cmpTp == types.ETString { + if args[0].GetType().Tp == mysql.TypeDuration { + cmpTp = types.ETDuration + } else { + for _, arg := range args { + if types.IsTypeTemporal(arg.GetType().Tp) { + hasTemporal = true + break + } + } + if hasTemporal { + cmpTp = types.ETDatetime + } + } } - lft := args[0].GetType() - for i := range args { - rft := args[i].GetType() - var tp types.EvalType - tp, isStr, isTemporalWithDate = temporalWithDateAsNumEvalType(rft) - if isTemporalWithDate { - datetimeFound = true + + return cmpTp +} + +// resolveType4Extremum gets compare type for GREATEST and LEAST and BETWEEN (mainly for datetime). +func resolveType4Extremum(args []Expression) types.EvalType { + aggType := aggregateType(args) + + var temporalItem *types.FieldType + if aggType.EvalType().IsStringKind() { + for i := range args { + item := args[i].GetType() + // Find the temporal value in the arguments but prefer DateTime value. + if types.IsTypeTemporal(item.Tp) { + if temporalItem == nil || item.Tp == mysql.TypeDatetime { + temporalItem = item + } + } } - if !isStr { - isAllStr = false + + if !types.IsTypeTemporal(aggType.Tp) && temporalItem != nil { + aggType.Tp = temporalItem.Tp } - cmpEvalType = getBaseCmpType(cmpEvalType, tp, lft, rft) - lft = rft - } - argTp = cmpEvalType - if cmpEvalType.IsStringKind() { - argTp = types.ETString + // TODO: String charset, collation checking are needed. } - if isAllStr && datetimeFound { - argTp = types.ETDatetime + return aggType.EvalType() +} + +// unsupportedJSONComparison reports warnings while there is a JSON type in least/greatest function's arguments +func unsupportedJSONComparison(ctx sessionctx.Context, args []Expression) { + for _, arg := range args { + tp := arg.GetType().Tp + if tp == mysql.TypeJSON { + ctx.GetSessionVars().StmtCtx.AppendWarning(errUnsupportedJSONComparison) + break + } } - return argTp } type greatestFunctionClass struct { @@ -424,10 +446,16 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err = c.verifyArgs(args); err != nil { return nil, err } - tp, cmpAsDatetime := GetCmpTp4MinMax(args), false - if tp == types.ETDatetime { + tp := resolveType4Extremum(args) + cmpAsDatetime := false + if tp == types.ETDatetime || tp == types.ETTimestamp { cmpAsDatetime = true tp = types.ETString + } else if tp == types.ETDuration { + tp = types.ETString + } else if tp == types.ETJson { + unsupportedJSONComparison(ctx, args) + tp = types.ETString } argTps := make([]types.EvalType, len(args)) for i := range args { @@ -453,7 +481,7 @@ func (c *greatestFunctionClass) getFunction(ctx sessionctx.Context, args []Expre case types.ETString: sig = &builtinGreatestStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestString) - case types.ETDatetime: + case types.ETDatetime, types.ETTimestamp: sig = &builtinGreatestTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_GreatestTime) } @@ -592,30 +620,39 @@ func (b *builtinGreatestTimeSig) Clone() builtinFunc { // evalString evals a builtinGreatestTimeSig. // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_greatest -func (b *builtinGreatestTimeSig) evalString(row chunk.Row) (_ string, isNull bool, err error) { +func (b *builtinGreatestTimeSig) evalString(row chunk.Row) (res string, isNull bool, err error) { var ( - v string - t types.Time + strRes string + timeRes types.Time ) - max := types.ZeroDatetime sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { - v, isNull, err = b.args[i].EvalString(b.ctx, row) + v, isNull, err := b.args[i].EvalString(b.ctx, row) if isNull || err != nil { return "", true, err } - t, err = types.ParseDatetime(sc, v) + t, err := types.ParseDatetime(sc, v) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return v, true, err } - continue + } else { + v = t.String() + } + // In MySQL, if the compare result is zero, than we will try to use the string comparison result + if i == 0 || strings.Compare(v, strRes) > 0 { + strRes = v } - if t.Compare(max) > 0 { - max = t + if i == 0 || t.Compare(timeRes) > 0 { + timeRes = t } } - return max.String(), false, nil + if timeRes.IsZero() { + res = strRes + } else { + res = timeRes.String() + } + return res, false, nil } type leastFunctionClass struct { @@ -626,10 +663,16 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi if err = c.verifyArgs(args); err != nil { return nil, err } - tp, cmpAsDatetime := GetCmpTp4MinMax(args), false - if tp == types.ETDatetime { + tp := resolveType4Extremum(args) + cmpAsDatetime := false + if tp == types.ETDatetime || tp == types.ETTimestamp { cmpAsDatetime = true tp = types.ETString + } else if tp == types.ETDuration { + tp = types.ETString + } else if tp == types.ETJson { + unsupportedJSONComparison(ctx, args) + tp = types.ETString } argTps := make([]types.EvalType, len(args)) for i := range args { @@ -655,7 +698,7 @@ func (c *leastFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi case types.ETString: sig = &builtinLeastStringSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastString) - case types.ETDatetime: + case types.ETDatetime, types.ETTimestamp: sig = &builtinLeastTimeSig{bf} sig.setPbCode(tipb.ScalarFuncSig_LeastTime) } @@ -796,32 +839,36 @@ func (b *builtinLeastTimeSig) Clone() builtinFunc { // See http://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#functionleast func (b *builtinLeastTimeSig) evalString(row chunk.Row) (res string, isNull bool, err error) { var ( - v string - t types.Time + // timeRes will be converted to a strRes only when the arguments is a valid datetime value. + strRes string // Record the strRes of each arguments. + timeRes types.Time // Record the time representation of a valid arguments. ) - min := types.NewTime(types.MaxDatetime, mysql.TypeDatetime, types.MaxFsp) - findInvalidTime := false sc := b.ctx.GetSessionVars().StmtCtx for i := 0; i < len(b.args); i++ { - v, isNull, err = b.args[i].EvalString(b.ctx, row) + v, isNull, err := b.args[i].EvalString(b.ctx, row) if isNull || err != nil { return "", true, err } - t, err = types.ParseDatetime(sc, v) + t, err := types.ParseDatetime(sc, v) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return v, true, err - } else if !findInvalidTime { - res = v - findInvalidTime = true } + } else { + v = t.String() + } + if i == 0 || strings.Compare(v, strRes) < 0 { + strRes = v } - if t.Compare(min) < 0 { - min = t + if i == 0 || t.Compare(timeRes) < 0 { + timeRes = t } } - if !findInvalidTime { - res = min.String() + + if timeRes.IsZero() { + res = strRes + } else { + res = timeRes.String() } return res, false, nil } @@ -1042,7 +1089,7 @@ type compareFunctionClass struct { // getBaseCmpType gets the EvalType that the two args will be treated as when comparing. func getBaseCmpType(lhs, rhs types.EvalType, lft, rft *types.FieldType) types.EvalType { - if lft.Tp == mysql.TypeUnspecified || rft.Tp == mysql.TypeUnspecified { + if lft != nil && rft != nil && (lft.Tp == mysql.TypeUnspecified || rft.Tp == mysql.TypeUnspecified) { if lft.Tp == rft.Tp { return types.ETString } @@ -1054,11 +1101,16 @@ func getBaseCmpType(lhs, rhs types.EvalType, lft, rft *types.FieldType) types.Ev } if lhs.IsStringKind() && rhs.IsStringKind() { return types.ETString - } else if (lhs == types.ETInt || lft.Hybrid()) && (rhs == types.ETInt || rft.Hybrid()) { + } else if (lhs == types.ETInt || (lft != nil && lft.Hybrid())) && (rhs == types.ETInt || (rft != nil && rft.Hybrid())) { return types.ETInt - } else if ((lhs == types.ETInt || lft.Hybrid()) || lhs == types.ETDecimal) && - ((rhs == types.ETInt || rft.Hybrid()) || rhs == types.ETDecimal) { + } else if (lhs == types.ETDecimal && rhs == types.ETString) || (lhs == types.ETString && rhs == types.ETDecimal) { + return types.ETReal + } else if ((lhs == types.ETInt || (lft != nil && lft.Hybrid())) || lhs == types.ETDecimal) && + ((rhs == types.ETInt || (rft != nil && rft.Hybrid())) || rhs == types.ETDecimal) { return types.ETDecimal + } else if lft != nil && rft != nil && (types.IsTemporalWithDate(lft.Tp) && rft.Tp == mysql.TypeYear || + lft.Tp == mysql.TypeYear && types.IsTemporalWithDate(rft.Tp)) { + return types.ETDatetime } return types.ETReal } @@ -1113,8 +1165,6 @@ func GetAccurateCmpType(lhs, rhs Expression) types.EvalType { } if col.GetType().Tp == mysql.TypeDuration { cmpType = types.ETDuration - } else { - cmpType = types.ETDatetime } } } @@ -1282,7 +1332,8 @@ func RefineComparedConstant(ctx sessionctx.Context, targetFieldType types.FieldT } // refineArgs will rewrite the arguments if the compare expression is `int column non-int constant` or -// `non-int constant int column`. E.g., `a < 1.1` will be rewritten to `a < 2`. +// `non-int constant int column`. E.g., `a < 1.1` will be rewritten to `a < 2`. It also handles comparing year type +// with int constant if the int constant falls into a sensible year representation. func (c *compareFunctionClass) refineArgs(ctx sessionctx.Context, args []Expression) []Expression { if ContainMutableConst(ctx, args) { return args @@ -1325,6 +1376,22 @@ func (c *compareFunctionClass) refineArgs(ctx sessionctx.Context, args []Express } } } + // int constant [cmp] year type + if arg0IsCon && arg0IsInt && arg1Type.Tp == mysql.TypeYear && !arg0.Value.IsNull() { + adjusted, failed := types.AdjustYear(arg0.Value.GetInt64(), false) + if failed == nil { + arg0.Value.SetInt64(adjusted) + finalArg0 = arg0 + } + } + // year type [cmp] int constant + if arg1IsCon && arg1IsInt && arg0Type.Tp == mysql.TypeYear && !arg1.Value.IsNull() { + adjusted, failed := types.AdjustYear(arg1.Value.GetInt64(), false) + if failed == nil { + arg1.Value.SetInt64(adjusted) + finalArg1 = arg1 + } + } if isExceptional && (c.op == opcode.EQ || c.op == opcode.NullEQ) { // This will always be false. return []Expression{NewZero(), NewOne()} @@ -1371,6 +1438,18 @@ func (c *compareFunctionClass) refineArgsByUnsignedFlag(ctx sessionctx.Context, if err != nil || isNull || v > 0 { return args } + if mysql.HasUnsignedFlag(con.RetType.Flag) && !mysql.HasUnsignedFlag(col.RetType.Flag) { + op := c.op + if i == 1 { + op = symmetricOp[c.op] + } + if op == opcode.EQ || op == opcode.NullEQ { + if _, err := types.ConvertUintToInt(uint64(v), types.IntergerSignedUpperBound(col.RetType.Tp), col.RetType.Tp); err != nil { + args[i], args[1-i] = NewOne(), NewZero() + return args + } + } + } if mysql.HasUnsignedFlag(col.RetType.Flag) && mysql.HasNotNullFlag(col.RetType.Flag) && !mysql.HasUnsignedFlag(con.RetType.Flag) { op := c.op if i == 1 { diff --git a/expression/builtin_compare_test.go b/expression/builtin_compare_test.go index 5acfad1a950c8..4e8f16415f06b 100644 --- a/expression/builtin_compare_test.go +++ b/expression/builtin_compare_test.go @@ -258,7 +258,8 @@ func (s *testEvaluatorSuite) TestIntervalFunc(c *C) { } } -func (s *testEvaluatorSuite) TestGreatestLeastFuncs(c *C) { +// greatest/least function is compatible with MySQL 8.0 +func (s *testEvaluatorSuite) TestGreatestLeastFunc(c *C) { sc := s.ctx.GetSessionVars().StmtCtx originIgnoreTruncate := sc.IgnoreTruncate sc.IgnoreTruncate = true @@ -283,7 +284,7 @@ func (s *testEvaluatorSuite) TestGreatestLeastFuncs(c *C) { }, { []interface{}{"123a", "b", "c", 12}, - float64(123), float64(0), false, false, + "c", "12", false, false, }, { []interface{}{tm, "123"}, @@ -291,15 +292,15 @@ func (s *testEvaluatorSuite) TestGreatestLeastFuncs(c *C) { }, { []interface{}{tm, 123}, - curTimeInt, int64(123), false, false, + curTimeString, "123", false, false, }, { []interface{}{tm, "invalid_time_1", "invalid_time_2", tmWithFsp}, - curTimeWithFspString, "invalid_time_1", false, false, + curTimeWithFspString, curTimeString, false, false, }, { []interface{}{tm, "invalid_time_2", "invalid_time_1", tmWithFsp}, - curTimeWithFspString, "invalid_time_2", false, false, + curTimeWithFspString, curTimeString, false, false, }, { []interface{}{tm, "invalid_time", nil, tmWithFsp}, @@ -309,6 +310,10 @@ func (s *testEvaluatorSuite) TestGreatestLeastFuncs(c *C) { []interface{}{duration, "123"}, "12:59:59", "123", false, false, }, + { + []interface{}{duration, duration}, + "12:59:59", "12:59:59", false, false, + }, { []interface{}{"123", nil, "123"}, nil, nil, true, false, @@ -317,6 +322,14 @@ func (s *testEvaluatorSuite) TestGreatestLeastFuncs(c *C) { []interface{}{errors.New("must error"), 123}, nil, nil, false, true, }, + { + []interface{}{794755072.0, 4556, "2000-01-09"}, + "794755072", "2000-01-09", false, false, + }, + { + []interface{}{905969664.0, 4556, "1990-06-16 17:22:56.005534"}, + "905969664", "1990-06-16 17:22:56.005534", false, false, + }, } { f0, err := newFunctionForTest(s.ctx, ast.Greatest, s.primitiveValsToConstants(t.args)...) c.Assert(err, IsNil) diff --git a/expression/builtin_compare_vec.go b/expression/builtin_compare_vec.go index d13b7fb07a988..043f77cfa193a 100644 --- a/expression/builtin_compare_vec.go +++ b/expression/builtin_compare_vec.go @@ -14,6 +14,8 @@ package expression import ( + "strings" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -37,12 +39,10 @@ func (b *builtinGreatestDecimalSig) vecEvalDecimal(input *chunk.Chunk, result *c if err := b.args[j].VecEvalDecimal(b.ctx, input, buf); err != nil { return err } + result.MergeNulls(buf) for i := 0; i < n; i++ { if result.IsNull(i) { continue - } else if buf.IsNull(i) { - result.SetNull(i, true) - continue } v := buf.GetDecimal(i) if v.Compare(&d64s[i]) > 0 { @@ -614,7 +614,7 @@ func vecResOfGE(res []int64) { } } -//vecCompareInt is vectorized CompareInt() +// vecCompareInt is vectorized CompareInt() func vecCompareInt(isUnsigned0, isUnsigned1 bool, largs, rargs, result *chunk.Column) { switch { case isUnsigned0 && isUnsigned1: @@ -633,47 +633,46 @@ func (b *builtinGreatestTimeSig) vectorized() bool { } func (b *builtinGreatestTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { + sc := b.ctx.GetSessionVars().StmtCtx n := input.NumRows() - dst, err := b.bufAllocator.get(types.ETTimestamp, n) - if err != nil { - return err - } - defer b.bufAllocator.put(dst) - sc := b.ctx.GetSessionVars().StmtCtx - dst.ResizeTime(n, false) - dstTimes := dst.Times() - for i := 0; i < n; i++ { - dstTimes[i] = types.ZeroDatetime - } - var argTime types.Time + dstStrings := make([]string, n) + // TODO: use Column.MergeNulls instead, however, it doesn't support var-length type currently. + dstNullMap := make([]bool, n) + for j := 0; j < len(b.args); j++ { if err := b.args[j].VecEvalString(b.ctx, input, result); err != nil { return err } for i := 0; i < n; i++ { - if result.IsNull(i) || dst.IsNull(i) { - dst.SetNull(i, true) + if dstNullMap[i] = dstNullMap[i] || result.IsNull(i); dstNullMap[i] { continue } - argTime, err = types.ParseDatetime(sc, result.GetString(i)) + + // NOTE: can't use Column.GetString because it returns an unsafe string, copy the row instead. + argTimeStr := string(result.GetBytes(i)) + + argTime, err := types.ParseDatetime(sc, argTimeStr) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err } - continue + } else { + argTimeStr = argTime.String() } - if argTime.Compare(dstTimes[i]) > 0 { - dstTimes[i] = argTime + if j == 0 || strings.Compare(argTimeStr, dstStrings[i]) > 0 { + dstStrings[i] = argTimeStr } } } + + // Aggregate the NULL and String value into result result.ReserveString(n) for i := 0; i < n; i++ { - if dst.IsNull(i) { + if dstNullMap[i] { result.AppendNull() } else { - result.AppendString(dstTimes[i].String()) + result.AppendString(dstStrings[i]) } } return nil @@ -719,60 +718,46 @@ func (b *builtinLeastTimeSig) vectorized() bool { } func (b *builtinLeastTimeSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { - n := input.NumRows() - dst, err := b.bufAllocator.get(types.ETTimestamp, n) - if err != nil { - return err - } - defer b.bufAllocator.put(dst) - sc := b.ctx.GetSessionVars().StmtCtx - dst.ResizeTime(n, false) - dstTimes := dst.Times() - for i := 0; i < n; i++ { - dstTimes[i] = types.NewTime(types.MaxDatetime, mysql.TypeDatetime, types.DefaultFsp) - } - var argTime types.Time + n := input.NumRows() - findInvalidTime := make([]bool, n) - invalidValue := make([]string, n) + dstStrings := make([]string, n) + // TODO: use Column.MergeNulls instead, however, it doesn't support var-length type currently. + dstNullMap := make([]bool, n) for j := 0; j < len(b.args); j++ { if err := b.args[j].VecEvalString(b.ctx, input, result); err != nil { return err } - dst.MergeNulls(result) for i := 0; i < n; i++ { - if dst.IsNull(i) { + if dstNullMap[i] = dstNullMap[i] || result.IsNull(i); dstNullMap[i] { continue } - argTime, err = types.ParseDatetime(sc, result.GetString(i)) + + // NOTE: can't use Column.GetString because it returns an unsafe string, copy the row instead. + argTimeStr := string(result.GetBytes(i)) + + argTime, err := types.ParseDatetime(sc, argTimeStr) if err != nil { if err = handleInvalidTimeError(b.ctx, err); err != nil { return err - } else if !findInvalidTime[i] { - // Make a deep copy here. - // Otherwise invalidValue will internally change with result. - invalidValue[i] = string(result.GetBytes(i)) - findInvalidTime[i] = true } - continue + } else { + argTimeStr = argTime.String() } - if argTime.Compare(dstTimes[i]) < 0 { - dstTimes[i] = argTime + if j == 0 || strings.Compare(argTimeStr, dstStrings[i]) < 0 { + dstStrings[i] = argTimeStr } } } + + // Aggregate the NULL and String value into result result.ReserveString(n) for i := 0; i < n; i++ { - if dst.IsNull(i) { + if dstNullMap[i] { result.AppendNull() - continue - } - if findInvalidTime[i] { - result.AppendString(invalidValue[i]) } else { - result.AppendString(dstTimes[i].String()) + result.AppendString(dstStrings[i]) } } return nil diff --git a/expression/builtin_control.go b/expression/builtin_control.go index cfba5f3bb32fd..13f539648e049 100644 --- a/expression/builtin_control.go +++ b/expression/builtin_control.go @@ -54,12 +54,22 @@ var ( _ builtinFunc = &builtinIfJSONSig{} ) +func maxlen(lhsFlen, rhsFlen int) int { + // -1 indicates that the length is unknown, such as the case for expressions. + if lhsFlen < 0 || rhsFlen < 0 { + return mysql.MaxRealWidth + } + return mathutil.Max(lhsFlen, rhsFlen) +} + // InferType4ControlFuncs infer result type for builtin IF, IFNULL, NULLIF, LEAD and LAG. func InferType4ControlFuncs(lexp, rexp Expression) *types.FieldType { lhs, rhs := lexp.GetType(), rexp.GetType() resultFieldType := &types.FieldType{} if lhs.Tp == mysql.TypeNull { *resultFieldType = *rhs + // If any of arg is NULL, result type need unset NotNullFlag. + types.SetTypeFlag(&resultFieldType.Flag, mysql.NotNullFlag, false) // If both arguments are NULL, make resulting type BINARY(0). if rhs.Tp == mysql.TypeNull { resultFieldType.Tp = mysql.TypeString @@ -68,6 +78,7 @@ func InferType4ControlFuncs(lexp, rexp Expression) *types.FieldType { } } else if rhs.Tp == mysql.TypeNull { *resultFieldType = *lhs + types.SetTypeFlag(&resultFieldType.Flag, mysql.NotNullFlag, false) } else { resultFieldType = types.AggFieldType([]*types.FieldType{lhs, rhs}) evalType := types.AggregateEvalType([]*types.FieldType{lhs, rhs}, &resultFieldType.Flag) @@ -114,9 +125,10 @@ func InferType4ControlFuncs(lexp, rexp Expression) *types.FieldType { if lhs.Decimal != types.UnspecifiedLength { rhsFlen -= rhs.Decimal } - resultFieldType.Flen = mathutil.Max(lhsFlen, rhsFlen) + resultFieldType.Decimal + 1 + flen := maxlen(lhsFlen, rhsFlen) + resultFieldType.Decimal + 1 // account for -1 len fields + resultFieldType.Flen = mathutil.Min(flen, mysql.MaxDecimalWidth) // make sure it doesn't overflow } else { - resultFieldType.Flen = mathutil.Max(lhs.Flen, rhs.Flen) + resultFieldType.Flen = maxlen(lhs.Flen, rhs.Flen) } } // Fix decimal for int and string. @@ -167,6 +179,9 @@ func (c *caseWhenFunctionClass) getFunction(ctx sessionctx.Context, args []Expre } fieldTp := types.AggFieldType(fieldTps) + // Here we turn off NotNullFlag. Because if all when-clauses are false, + // the result of case-when expr is NULL. + types.SetTypeFlag(&fieldTp.Flag, mysql.NotNullFlag, false) tp := fieldTp.EvalType() if tp == types.ETInt { diff --git a/expression/builtin_encryption.go b/expression/builtin_encryption.go index 9f423814d232d..0424f50db1976 100644 --- a/expression/builtin_encryption.go +++ b/expression/builtin_encryption.go @@ -84,7 +84,7 @@ type aesModeAttr struct { } var aesModes = map[string]*aesModeAttr{ - //TODO support more modes, permitted mode values are: ECB, CBC, CFB1, CFB8, CFB128, OFB + // TODO support more modes, permitted mode values are: ECB, CBC, CFB1, CFB8, CFB128, OFB "aes-128-ecb": {"ecb", 16, false}, "aes-192-ecb": {"ecb", 24, false}, "aes-256-ecb": {"ecb", 32, false}, diff --git a/expression/builtin_encryption_test.go b/expression/builtin_encryption_test.go index c3b7f34878ab4..eedaeea0bd2b0 100644 --- a/expression/builtin_encryption_test.go +++ b/expression/builtin_encryption_test.go @@ -120,7 +120,8 @@ var aesTests = []struct { func (s *testEvaluatorSuite) TestAESEncrypt(c *C) { fc := funcs[ast.AesEncrypt] for _, tt := range aesTests { - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum(tt.mode)) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum(tt.mode)) + c.Assert(err, IsNil) args := []types.Datum{types.NewDatum(tt.origin)} for _, param := range tt.params { args = append(args, types.NewDatum(param)) @@ -131,7 +132,8 @@ func (s *testEvaluatorSuite) TestAESEncrypt(c *C) { c.Assert(err, IsNil) c.Assert(toHex(crypt), DeepEquals, types.NewDatum(tt.crypt)) } - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + c.Assert(err, IsNil) s.testNullInput(c, ast.AesEncrypt) s.testAmbiguousInput(c, ast.AesEncrypt) } @@ -139,7 +141,8 @@ func (s *testEvaluatorSuite) TestAESEncrypt(c *C) { func (s *testEvaluatorSuite) TestAESDecrypt(c *C) { fc := funcs[ast.AesDecrypt] for _, tt := range aesTests { - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum(tt.mode)) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum(tt.mode)) + c.Assert(err, IsNil) args := []types.Datum{fromHex(tt.crypt)} for _, param := range tt.params { args = append(args, types.NewDatum(param)) @@ -154,13 +157,15 @@ func (s *testEvaluatorSuite) TestAESDecrypt(c *C) { } c.Assert(str, DeepEquals, types.NewCollationStringDatum(tt.origin.(string), charset.CollationBin, collate.DefaultLen)) } - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + c.Assert(err, IsNil) s.testNullInput(c, ast.AesDecrypt) s.testAmbiguousInput(c, ast.AesDecrypt) } func (s *testEvaluatorSuite) testNullInput(c *C, fnName string) { - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + c.Assert(err, IsNil) fc := funcs[fnName] arg := types.NewStringDatum("str") var argNull types.Datum @@ -181,8 +186,9 @@ func (s *testEvaluatorSuite) testAmbiguousInput(c *C, fnName string) { fc := funcs[fnName] arg := types.NewStringDatum("str") // test for modes that require init_vector - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-cbc")) - _, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg})) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-cbc")) + c.Assert(err, IsNil) + _, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg})) c.Assert(err, NotNil) f, err := fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg, types.NewStringDatum("iv < 16 bytes")})) c.Assert(err, IsNil) @@ -190,7 +196,8 @@ func (s *testEvaluatorSuite) testAmbiguousInput(c *C, fnName string) { c.Assert(err, NotNil) // test for modes that do not require init_vector - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), variable.BlockEncryptionMode, types.NewDatum("aes-128-ecb")) + c.Assert(err, IsNil) f, err = fc.getFunction(s.ctx, s.datumsToConstants([]types.Datum{arg, arg, arg})) c.Assert(err, IsNil) _, err = evalBuiltinFunc(f, chunk.Row{}) diff --git a/expression/builtin_info.go b/expression/builtin_info.go index 29345d8605e14..6a41b20ef75af 100644 --- a/expression/builtin_info.go +++ b/expression/builtin_info.go @@ -18,9 +18,7 @@ package expression import ( - "encoding/hex" "sort" - "strconv" "strings" "github.com/pingcap/errors" @@ -28,11 +26,9 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/plancodec" "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tipb/go-tipb" @@ -673,6 +669,7 @@ func (c *collationFunctionClass) getFunction(ctx sessionctx.Context, args []Expr return nil, err } bf.tp.Charset, bf.tp.Collate = ctx.GetSessionVars().GetCharsetInfo() + bf.tp.Flen = 64 sig := &builtinCollationSig{bf} return sig, nil } @@ -757,38 +754,24 @@ func (b *builtinTiDBDecodeKeySig) evalString(row chunk.Row) (string, bool, error if isNull || err != nil { return "", isNull, err } - return decodeKey(b.ctx, s), false, nil + decode := func(ctx sessionctx.Context, s string) string { return s } + if fn := b.ctx.Value(TiDBDecodeKeyFunctionKey); fn != nil { + decode = fn.(func(ctx sessionctx.Context, s string) string) + } + return decode(b.ctx, s), false, nil } -func decodeKey(ctx sessionctx.Context, s string) string { - key, err := hex.DecodeString(s) - if err != nil { - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) - return s - } - // Auto decode byte if needed. - _, bs, err := codec.DecodeBytes(key, nil) - if err == nil { - key = bs - } - // Try to decode it as a record key. - tableID, handle, err := tablecodec.DecodeRecordKey(key) - if err == nil { - if handle.IsInt() { - return "tableID=" + strconv.FormatInt(tableID, 10) + ", _tidb_rowid=" + strconv.FormatInt(handle.IntValue(), 10) - } - return "tableID=" + strconv.FormatInt(tableID, 10) + ", clusterHandle=" + handle.String() - } - // Try decode as table index key. - tableID, indexID, indexValues, err := tablecodec.DecodeIndexKey(key) - if err == nil { - return "tableID=" + strconv.FormatInt(tableID, 10) + ", indexID=" + strconv.FormatInt(indexID, 10) + ", indexValues=" + strings.Join(indexValues, ",") - } - // TODO: try to decode other type key. - ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) - return s +// TiDBDecodeKeyFunctionKeyType is used to identify the decoder function in context. +type TiDBDecodeKeyFunctionKeyType int + +// String() implements Stringer. +func (k TiDBDecodeKeyFunctionKeyType) String() string { + return "tidb_decode_key" } +// TiDBDecodeKeyFunctionKey is used to identify the decoder function in context. +const TiDBDecodeKeyFunctionKey TiDBDecodeKeyFunctionKeyType = 0 + type tidbDecodePlanFunctionClass struct { baseFunctionClass } @@ -821,7 +804,10 @@ func (b *builtinTiDBDecodePlanSig) evalString(row chunk.Row) (string, bool, erro return "", isNull, err } planTree, err := plancodec.DecodePlan(planString) - return planTree, false, err + if err != nil { + return planString, false, nil + } + return planTree, false, nil } type nextValFunctionClass struct { @@ -1004,7 +990,7 @@ func (c *formatBytesFunctionClass) getFunction(ctx sessionctx.Context, args []Ex if err != nil { return nil, err } - bf.tp.Flag |= mysql.UnsignedFlag + bf.tp.Charset, bf.tp.Collate = ctx.GetSessionVars().GetCharsetInfo() sig := &builtinFormatBytesSig{bf} return sig, nil } @@ -1041,7 +1027,7 @@ func (c *formatNanoTimeFunctionClass) getFunction(ctx sessionctx.Context, args [ if err != nil { return nil, err } - bf.tp.Flag |= mysql.UnsignedFlag + bf.tp.Charset, bf.tp.Collate = ctx.GetSessionVars().GetCharsetInfo() sig := &builtinFormatNanoTimeSig{bf} return sig, nil } diff --git a/expression/builtin_info_test.go b/expression/builtin_info_test.go index 54f5305a8b442..e1dfc5cddc62d 100644 --- a/expression/builtin_info_test.go +++ b/expression/builtin_info_test.go @@ -194,6 +194,7 @@ func (s *testEvaluatorSuite) TestCollation(c *C) { f, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(nil))) c.Assert(f, NotNil) c.Assert(err, IsNil) + c.Assert(f.getRetTp().Flen, Equals, 64) } func (s *testEvaluatorSuite) TestRowCount(c *C) { diff --git a/expression/builtin_info_vec.go b/expression/builtin_info_vec.go index 272dc1833a167..0c0a6ea2dcd06 100644 --- a/expression/builtin_info_vec.go +++ b/expression/builtin_info_vec.go @@ -19,6 +19,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/printer" @@ -340,12 +341,16 @@ func (b *builtinTiDBDecodeKeySig) vecEvalString(input *chunk.Chunk, result *chun return err } result.ReserveString(n) + decode := func(ctx sessionctx.Context, s string) string { return s } + if fn := b.ctx.Value(TiDBDecodeKeyFunctionKey); fn != nil { + decode = fn.(func(ctx sessionctx.Context, s string) string) + } for i := 0; i < n; i++ { if buf.IsNull(i) { result.AppendNull() continue } - result.AppendString(decodeKey(b.ctx, buf.GetString(i))) + result.AppendString(decode(b.ctx, buf.GetString(i))) } return nil } diff --git a/expression/builtin_json_vec.go b/expression/builtin_json_vec.go index db512fc81359f..953da67458040 100644 --- a/expression/builtin_json_vec.go +++ b/expression/builtin_json_vec.go @@ -448,10 +448,14 @@ func (b *builtinJSONSearchSig) vecEvalJSON(input *chunk.Chunk, result *chunk.Col pathExprs = append(pathExprs, pathExpr) } } - bj, _, err := jsonBuf.GetJSON(i).Search(containType, searchBuf.GetString(i), escape, pathExprs) + bj, isNull, err := jsonBuf.GetJSON(i).Search(containType, searchBuf.GetString(i), escape, pathExprs) if err != nil { return err } + if isNull { + result.AppendNull() + continue + } result.AppendJSON(bj) } return nil diff --git a/expression/builtin_math.go b/expression/builtin_math.go index abef8821eff00..c2a33c4fd86f6 100644 --- a/expression/builtin_math.go +++ b/expression/builtin_math.go @@ -26,6 +26,7 @@ import ( "sync" "github.com/cznic/mathutil" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" @@ -273,6 +274,14 @@ func (c *roundFunctionClass) getFunction(ctx sessionctx.Context, args []Expressi bf.tp.Flen = argFieldTp.Flen bf.tp.Decimal = calculateDecimal4RoundAndTruncate(ctx, args, argTp) + if bf.tp.Decimal != types.UnspecifiedLength { + if argFieldTp.Decimal != types.UnspecifiedLength { + decimalDelta := bf.tp.Decimal - argFieldTp.Decimal + bf.tp.Flen += mathutil.Max(decimalDelta, 0) + } else { + bf.tp.Flen = argFieldTp.Flen + bf.tp.Decimal + } + } var sig builtinFunc if len(args) > 1 { @@ -634,9 +643,7 @@ func getEvalTp4FloorAndCeil(arg Expression) (retTp, argTp types.EvalType) { retTp, argTp = types.ETInt, fieldTp.EvalType() switch argTp { case types.ETInt: - if fieldTp.Tp == mysql.TypeLonglong { - retTp = types.ETDecimal - } + retTp = types.ETInt case types.ETDecimal: if fieldTp.Flen-fieldTp.Decimal > mysql.MaxIntWidth-2 { // len(math.MaxInt64) - 1 retTp = types.ETDecimal @@ -650,7 +657,7 @@ func getEvalTp4FloorAndCeil(arg Expression) (retTp, argTp types.EvalType) { // setFlag4FloorAndCeil sets return flag of FLOOR and CEIL. func setFlag4FloorAndCeil(tp *types.FieldType, arg Expression) { fieldTp := arg.GetType() - if (fieldTp.Tp == mysql.TypeLong || fieldTp.Tp == mysql.TypeNewDecimal) && mysql.HasUnsignedFlag(fieldTp.Flag) { + if (fieldTp.Tp == mysql.TypeLong || fieldTp.Tp == mysql.TypeLonglong || fieldTp.Tp == mysql.TypeNewDecimal) && mysql.HasUnsignedFlag(fieldTp.Flag) { tp.Flag |= mysql.UnsignedFlag } // TODO: when argument type is timestamp, add not null flag. @@ -1163,11 +1170,25 @@ func (b *builtinConvSig) Clone() builtinFunc { // evalString evals CONV(N,from_base,to_base). // See https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_conv. func (b *builtinConvSig) evalString(row chunk.Row) (res string, isNull bool, err error) { - str, isNull, err := b.args[0].EvalString(b.ctx, row) - if isNull || err != nil { - return res, isNull, err + var str string + switch x := b.args[0].(type) { + case *Constant: + if x.Value.Kind() == types.KindBinaryLiteral { + str = x.Value.GetBinaryLiteral().ToBitLiteralString(true) + } + case *ScalarFunction: + if x.FuncName.L == ast.Cast { + arg0 := x.GetArgs()[0] + if arg0.GetType().Hybrid() || IsBinaryLiteral(arg0) { + str, isNull, err = arg0.EvalString(b.ctx, row) + if isNull || err != nil { + return str, isNull, err + } + d := types.NewStringDatum(str) + str = d.GetBinaryLiteral().ToBitLiteralString(true) + } + } } - fromBase, isNull, err := b.args[1].EvalInt(b.ctx, row) if isNull || err != nil { return res, isNull, err @@ -1177,6 +1198,17 @@ func (b *builtinConvSig) evalString(row chunk.Row) (res string, isNull bool, err if isNull || err != nil { return res, isNull, err } + if len(str) == 0 { + str, isNull, err = b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return res, isNull, err + } + } else { + str, isNull, err = b.conv(str[2:], 2, fromBase) + if err != nil { + return str, isNull, err + } + } return b.conv(str, fromBase, toBase) } func (b *builtinConvSig) conv(str string, fromBase, toBase int64) (res string, isNull bool, err error) { diff --git a/expression/builtin_math_test.go b/expression/builtin_math_test.go index f8c6b7c65df44..a19bb7048f10c 100644 --- a/expression/builtin_math_test.go +++ b/expression/builtin_math_test.go @@ -431,6 +431,8 @@ func (s *testEvaluatorSuite) TestRound(c *C) { {[]interface{}{1.298, 1}, 1.3}, {[]interface{}{1.298}, 1}, {[]interface{}{1.298, 0}, 1}, + {[]interface{}{-1.5, 0}, -2}, + {[]interface{}{1.5, 0}, 2}, {[]interface{}{23.298, -1}, 20}, {[]interface{}{newDec("-1.23")}, newDec("-1")}, {[]interface{}{newDec("-1.23"), 1}, newDec("-1.2")}, @@ -949,7 +951,7 @@ func (s *testEvaluatorSuite) TestTan(c *C) { {int64(0), float64(0), false, false}, {math.Pi / 4, float64(1), false, false}, {-math.Pi / 4, float64(-1), false, false}, - {math.Pi * 3 / 4, math.Tan(math.Pi * 3 / 4), false, false}, //in mysql and golang, it equals -1.0000000000000002, not -1 + {math.Pi * 3 / 4, math.Tan(math.Pi * 3 / 4), false, false}, // in mysql and golang, it equals -1.0000000000000002, not -1 {"0.000", float64(0), false, false}, {"sdfgsdfg", 0, false, true}, } diff --git a/expression/builtin_math_vec.go b/expression/builtin_math_vec.go index b233c9c9acf09..b28b1a655ba79 100644 --- a/expression/builtin_math_vec.go +++ b/expression/builtin_math_vec.go @@ -1070,7 +1070,8 @@ func (b *builtinSignSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) er } func (b *builtinConvSig) vectorized() bool { - return true + // TODO: change the vecEval match hybrid type fixing. Then open the vectorized evaluation. + return false } func (b *builtinConvSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { diff --git a/expression/builtin_math_vec_test.go b/expression/builtin_math_vec_test.go index fe240d053017f..5c9f8aa4dd010 100644 --- a/expression/builtin_math_vec_test.go +++ b/expression/builtin_math_vec_test.go @@ -23,12 +23,14 @@ import ( ) var vecBuiltinMathCases = map[string][]vecExprBenchCase{ + /* TODO: Because of https://github.com/pingcap/tidb/issues/5817, we don't enable it now. ast.Conv: { { retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETInt, types.ETInt}, }, }, + */ ast.Sign: { {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETReal}}, }, @@ -99,15 +101,15 @@ var vecBuiltinMathCases = map[string][]vecExprBenchCase{ {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal}, geners: nil}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeInt24}}, geners: nil}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDecimal}, geners: nil}, - {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETInt}, geners: nil}, - {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETInt}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeLonglong, Flag: mysql.UnsignedFlag}}, geners: nil}, + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}, geners: nil}, + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeLonglong, Flag: mysql.UnsignedFlag}}, geners: nil}, {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeNewDecimal, Flen: 32, Decimal: 2}}, geners: nil}, }, ast.Ceil: { {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETReal}, geners: nil}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeInt24}}, geners: nil}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDecimal}, geners: nil}, - {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETInt}, geners: nil}, + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETInt}, geners: nil}, {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETDecimal}, childrenFieldTypes: []*types.FieldType{{Tp: mysql.TypeNewDecimal, Flen: 32, Decimal: 2}}, geners: nil}, }, ast.PI: { diff --git a/expression/builtin_miscellaneous.go b/expression/builtin_miscellaneous.go index 9e40a70f11e3e..25b4ddb3c4fbb 100644 --- a/expression/builtin_miscellaneous.go +++ b/expression/builtin_miscellaneous.go @@ -222,8 +222,9 @@ func (c *anyValueFunctionClass) getFunction(ctx sessionctx.Context, args []Expre if err != nil { return nil, err } - args[0].GetType().Flag |= bf.tp.Flag - *bf.tp = *args[0].GetType() + ft := args[0].GetType().Clone() + ft.Flag |= bf.tp.Flag + *bf.tp = *ft var sig builtinFunc switch argTp { case types.ETDecimal: @@ -490,14 +491,14 @@ func (b *builtinInetNtoaSig) evalString(row chunk.Row) (string, bool, error) { } if val < 0 || uint64(val) > math.MaxUint32 { - //not an IPv4 address. + // not an IPv4 address. return "", true, nil } ip := make(net.IP, net.IPv4len) binary.BigEndian.PutUint32(ip, uint32(val)) ipv4 := ip.To4() if ipv4 == nil { - //Not a vaild ipv4 address. + // Not a vaild ipv4 address. return "", true, nil } @@ -552,7 +553,7 @@ func (b *builtinInet6AtonSig) evalString(row chunk.Row) (string, bool, error) { var isMappedIpv6 bool if ip.To4() != nil && strings.Contains(val, ":") { - //mapped ipv6 address. + // mapped ipv6 address. isMappedIpv6 = true } @@ -736,7 +737,7 @@ func (b *builtinIsIPv4CompatSig) evalInt(row chunk.Row) (int64, bool, error) { ipAddress := []byte(val) if len(ipAddress) != net.IPv6len { - //Not an IPv6 address, return false + // Not an IPv6 address, return false return 0, false, nil } @@ -784,7 +785,7 @@ func (b *builtinIsIPv4MappedSig) evalInt(row chunk.Row) (int64, bool, error) { ipAddress := []byte(val) if len(ipAddress) != net.IPv6len { - //Not an IPv6 address, return false + // Not an IPv6 address, return false return 0, false, nil } @@ -1012,6 +1013,7 @@ func (c *uuidFunctionClass) getFunction(ctx sessionctx.Context, args []Expressio bf.tp.Charset, bf.tp.Collate = ctx.GetSessionVars().GetCharsetInfo() bf.tp.Flen = 36 sig := &builtinUUIDSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_UUID) return sig, nil } diff --git a/expression/builtin_miscellaneous_vec.go b/expression/builtin_miscellaneous_vec.go index f591336ba7220..8780920c13a04 100644 --- a/expression/builtin_miscellaneous_vec.go +++ b/expression/builtin_miscellaneous_vec.go @@ -52,7 +52,7 @@ func (b *builtinInetNtoaSig) vecEvalString(input *chunk.Chunk, result *chunk.Col binary.BigEndian.PutUint32(ip, uint32(val)) ipv4 := ip.To4() if ipv4 == nil { - //Not a vaild ipv4 address. + // Not a vaild ipv4 address. result.AppendNull() continue } @@ -256,7 +256,7 @@ func (b *builtinIsIPv4CompatSig) vecEvalInt(input *chunk.Chunk, result *chunk.Co // See example https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv4-compat ipAddress := buf.GetBytes(i) if len(ipAddress) != net.IPv6len || !bytes.HasPrefix(ipAddress, prefixCompat) { - //Not an IPv6 address, return false + // Not an IPv6 address, return false i64s[i] = 0 } else { i64s[i] = 1 @@ -381,7 +381,7 @@ func (b *builtinIsIPv4MappedSig) vecEvalInt(input *chunk.Chunk, result *chunk.Co // See example https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_is-ipv4-mapped ipAddress := buf.GetBytes(i) if len(ipAddress) != net.IPv6len || !bytes.HasPrefix(ipAddress, prefixMapped) { - //Not an IPv6 address, return false + // Not an IPv6 address, return false i64s[i] = 0 } else { i64s[i] = 1 @@ -448,7 +448,7 @@ func (b *builtinInet6AtonSig) vecEvalString(input *chunk.Chunk, result *chunk.Co var isMappedIpv6 bool ipTo4 := ip.To4() if ipTo4 != nil && strings.Contains(val, ":") { - //mapped ipv6 address. + // mapped ipv6 address. isMappedIpv6 = true } @@ -517,7 +517,7 @@ func (b *builtinInetAtonSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column result.SetNull(i, true) continue } - //reset + // reset byteResult = 0 res = 0 dotCount = 0 diff --git a/expression/builtin_miscellaneous_vec_test.go b/expression/builtin_miscellaneous_vec_test.go index 74cafecb7ba48..85a329b8f41b8 100644 --- a/expression/builtin_miscellaneous_vec_test.go +++ b/expression/builtin_miscellaneous_vec_test.go @@ -43,7 +43,7 @@ var vecBuiltinMiscellaneousCases = map[string][]vecExprBenchCase{ newSelectStringGener( []string{ "192.168.0.1", - "2001:db8::68", //ipv6 + "2001:db8::68", // ipv6 }, )}}, }, @@ -187,7 +187,7 @@ func (s *testEvaluatorSuite) TestSleepVectorized(c *C) { c.Assert(err, NotNil) c.Assert(result.GetInt64(0), Equals, int64(0)) - //// strict model + // strict model input.Reset() input.AppendFloat64(0, 0.5) start := time.Now() diff --git a/expression/builtin_op.go b/expression/builtin_op.go index 867aebbb25660..ea5441627c524 100644 --- a/expression/builtin_op.go +++ b/expression/builtin_op.go @@ -444,9 +444,7 @@ func (c *isTrueOrFalseFunctionClass) getFunction(ctx sessionctx.Context, args [] } argTp := args[0].GetType().EvalType() - if argTp == types.ETTimestamp || argTp == types.ETDatetime || argTp == types.ETDuration { - argTp = types.ETInt - } else if argTp == types.ETJson || argTp == types.ETString { + if argTp == types.ETTimestamp || argTp == types.ETDatetime || argTp == types.ETDuration || argTp == types.ETJson || argTp == types.ETString { argTp = types.ETReal } diff --git a/expression/builtin_op_test.go b/expression/builtin_op_test.go index 33fc5a471598d..cc87e0cbef863 100644 --- a/expression/builtin_op_test.go +++ b/expression/builtin_op_test.go @@ -19,6 +19,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/testutil" @@ -540,6 +541,26 @@ func (s *testEvaluatorSuite) TestIsTrueOrFalse(c *C) { isTrue: 0, isFalse: 0, }, + { + args: []interface{}{types.NewDuration(0, 0, 0, 1000, 3)}, + isTrue: 1, + isFalse: 0, + }, + { + args: []interface{}{types.NewDuration(0, 0, 0, 0, 3)}, + isTrue: 0, + isFalse: 1, + }, + { + args: []interface{}{types.NewTime(types.FromDate(0, 0, 0, 0, 0, 0, 1000), mysql.TypeDatetime, 3)}, + isTrue: 1, + isFalse: 0, + }, + { + args: []interface{}{types.NewTime(types.CoreTime(0), mysql.TypeTimestamp, 3)}, + isTrue: 0, + isFalse: 1, + }, } for _, tc := range testCases { diff --git a/expression/builtin_other.go b/expression/builtin_other.go index 6574054964b8d..faa41cd0a256a 100644 --- a/expression/builtin_other.go +++ b/expression/builtin_other.go @@ -18,6 +18,8 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" @@ -33,7 +35,10 @@ var ( _ functionClass = &inFunctionClass{} _ functionClass = &rowFunctionClass{} _ functionClass = &setVarFunctionClass{} - _ functionClass = &getVarFunctionClass{} + _ functionClass = &getIntVarFunctionClass{} + _ functionClass = &getRealVarFunctionClass{} + _ functionClass = &getDecimalVarFunctionClass{} + _ functionClass = &getStringVarFunctionClass{} _ functionClass = &lockFunctionClass{} _ functionClass = &releaseLockFunctionClass{} _ functionClass = &valuesFunctionClass{} @@ -51,8 +56,14 @@ var ( _ builtinFunc = &builtinInDurationSig{} _ builtinFunc = &builtinInJSONSig{} _ builtinFunc = &builtinRowSig{} - _ builtinFunc = &builtinSetVarSig{} - _ builtinFunc = &builtinGetVarSig{} + _ builtinFunc = &builtinSetStringVarSig{} + _ builtinFunc = &builtinSetIntVarSig{} + _ builtinFunc = &builtinSetRealVarSig{} + _ builtinFunc = &builtinSetDecimalVarSig{} + _ builtinFunc = &builtinGetStringVarSig{} + _ builtinFunc = &builtinGetIntVarSig{} + _ builtinFunc = &builtinGetRealVarSig{} + _ builtinFunc = &builtinGetDecimalVarSig{} _ builtinFunc = &builtinLockSig{} _ builtinFunc = &builtinReleaseLockSig{} _ builtinFunc = &builtinValuesIntSig{} @@ -82,6 +93,9 @@ func (c *inFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) if err != nil { return nil, err } + for i := 1; i < len(args); i++ { + DisableParseJSONFlag4Expr(args[i]) + } bf.tp.Flen = 1 switch args[0].GetType().EvalType() { case types.ETInt: @@ -141,8 +155,10 @@ func (c *inFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) type baseInSig struct { baseBuiltinFunc - nonConstArgs []Expression - hasNull bool + // nonConstArgsIdx stores the indices of non-constant args in the baseBuiltinFunc.args (the first arg is not included). + // It works with builtinInXXXSig.hashset to accelerate 'eval'. + nonConstArgsIdx []int + hasNull bool } // builtinInIntSig see https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in @@ -153,7 +169,7 @@ type builtinInIntSig struct { } func (b *builtinInIntSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} + b.nonConstArgsIdx = make([]int, 0) b.hashSet = make(map[int64]bool, len(b.args)-1) for i := 1; i < len(b.args); i++ { if b.args[i].ConstItem(b.ctx.GetSessionVars().StmtCtx) { @@ -167,7 +183,7 @@ func (b *builtinInIntSig) buildHashMapForConstArgs(ctx sessionctx.Context) error } b.hashSet[val] = mysql.HasUnsignedFlag(b.args[i].GetType().Flag) } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } return nil @@ -176,10 +192,8 @@ func (b *builtinInIntSig) buildHashMapForConstArgs(ctx sessionctx.Context) error func (b *builtinInIntSig) Clone() builtinFunc { newSig := &builtinInIntSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -192,9 +206,8 @@ func (b *builtinInIntSig) evalInt(row chunk.Row) (int64, bool, error) { } isUnsigned0 := mysql.HasUnsignedFlag(b.args[0].GetType().Flag) - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs if isUnsigned, ok := b.hashSet[arg0]; ok { if (isUnsigned0 && isUnsigned) || (!isUnsigned0 && !isUnsigned) { return 1, false, nil @@ -203,10 +216,14 @@ func (b *builtinInIntSig) evalInt(row chunk.Row) (int64, bool, error) { return 1, false, nil } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalInt(b.ctx, row) if err != nil { return 0, true, err @@ -244,7 +261,7 @@ type builtinInStringSig struct { } func (b *builtinInStringSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} + b.nonConstArgsIdx = make([]int, 0) b.hashSet = set.NewStringSet() collator := collate.GetCollator(b.collation) for i := 1; i < len(b.args); i++ { @@ -259,7 +276,7 @@ func (b *builtinInStringSig) buildHashMapForConstArgs(ctx sessionctx.Context) er } b.hashSet.Insert(string(collator.Key(val))) // should do memory copy here } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } @@ -269,10 +286,8 @@ func (b *builtinInStringSig) buildHashMapForConstArgs(ctx sessionctx.Context) er func (b *builtinInStringSig) Clone() builtinFunc { newSig := &builtinInStringSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -284,17 +299,20 @@ func (b *builtinInStringSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull0, err } - args := b.args + args := b.args[1:] collator := collate.GetCollator(b.collation) if len(b.hashSet) != 0 { - args = b.nonConstArgs if b.hashSet.Exist(string(collator.Key(arg0))) { return 1, false, nil } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalString(b.ctx, row) if err != nil { return 0, true, err @@ -317,7 +335,7 @@ type builtinInRealSig struct { } func (b *builtinInRealSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} + b.nonConstArgsIdx = make([]int, 0) b.hashSet = set.NewFloat64Set() for i := 1; i < len(b.args); i++ { if b.args[i].ConstItem(b.ctx.GetSessionVars().StmtCtx) { @@ -331,7 +349,7 @@ func (b *builtinInRealSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro } b.hashSet.Insert(val) } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } @@ -341,10 +359,8 @@ func (b *builtinInRealSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro func (b *builtinInRealSig) Clone() builtinFunc { newSig := &builtinInRealSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -355,15 +371,19 @@ func (b *builtinInRealSig) evalInt(row chunk.Row) (int64, bool, error) { if isNull0 || err != nil { return 0, isNull0, err } - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs if b.hashSet.Exist(arg0) { return 1, false, nil } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } + hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalReal(b.ctx, row) if err != nil { return 0, true, err @@ -386,7 +406,7 @@ type builtinInDecimalSig struct { } func (b *builtinInDecimalSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} + b.nonConstArgsIdx = make([]int, 0) b.hashSet = set.NewStringSet() for i := 1; i < len(b.args); i++ { if b.args[i].ConstItem(b.ctx.GetSessionVars().StmtCtx) { @@ -404,7 +424,7 @@ func (b *builtinInDecimalSig) buildHashMapForConstArgs(ctx sessionctx.Context) e } b.hashSet.Insert(string(key)) } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } @@ -414,10 +434,8 @@ func (b *builtinInDecimalSig) buildHashMapForConstArgs(ctx sessionctx.Context) e func (b *builtinInDecimalSig) Clone() builtinFunc { newSig := &builtinInDecimalSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -429,20 +447,23 @@ func (b *builtinInDecimalSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull0, err } - args := b.args + args := b.args[1:] key, err := arg0.ToHashKey() if err != nil { return 0, true, err } if len(b.hashSet) != 0 { - args = b.nonConstArgs if b.hashSet.Exist(string(key)) { return 1, false, nil } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalDecimal(b.ctx, row) if err != nil { return 0, true, err @@ -461,12 +482,12 @@ func (b *builtinInDecimalSig) evalInt(row chunk.Row) (int64, bool, error) { // builtinInTimeSig see https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#function_in type builtinInTimeSig struct { baseInSig - hashSet map[types.Time]struct{} + hashSet map[types.CoreTime]struct{} } func (b *builtinInTimeSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} - b.hashSet = make(map[types.Time]struct{}, len(b.args)-1) + b.nonConstArgsIdx = make([]int, 0) + b.hashSet = make(map[types.CoreTime]struct{}, len(b.args)-1) for i := 1; i < len(b.args); i++ { if b.args[i].ConstItem(b.ctx.GetSessionVars().StmtCtx) { val, isNull, err := b.args[i].EvalTime(ctx, chunk.Row{}) @@ -477,9 +498,9 @@ func (b *builtinInTimeSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro b.hasNull = true continue } - b.hashSet[val] = struct{}{} + b.hashSet[val.CoreTime()] = struct{}{} } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } @@ -489,10 +510,8 @@ func (b *builtinInTimeSig) buildHashMapForConstArgs(ctx sessionctx.Context) erro func (b *builtinInTimeSig) Clone() builtinFunc { newSig := &builtinInTimeSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -503,15 +522,19 @@ func (b *builtinInTimeSig) evalInt(row chunk.Row) (int64, bool, error) { if isNull0 || err != nil { return 0, isNull0, err } - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs - if _, ok := b.hashSet[arg0]; ok { + if _, ok := b.hashSet[arg0.CoreTime()]; ok { return 1, false, nil } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } + hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalTime(b.ctx, row) if err != nil { return 0, true, err @@ -534,7 +557,7 @@ type builtinInDurationSig struct { } func (b *builtinInDurationSig) buildHashMapForConstArgs(ctx sessionctx.Context) error { - b.nonConstArgs = []Expression{b.args[0]} + b.nonConstArgsIdx = make([]int, 0) b.hashSet = make(map[time.Duration]struct{}, len(b.args)-1) for i := 1; i < len(b.args); i++ { if b.args[i].ConstItem(b.ctx.GetSessionVars().StmtCtx) { @@ -548,7 +571,7 @@ func (b *builtinInDurationSig) buildHashMapForConstArgs(ctx sessionctx.Context) } b.hashSet[val.Duration] = struct{}{} } else { - b.nonConstArgs = append(b.nonConstArgs, b.args[i]) + b.nonConstArgsIdx = append(b.nonConstArgsIdx, i) } } @@ -558,10 +581,8 @@ func (b *builtinInDurationSig) buildHashMapForConstArgs(ctx sessionctx.Context) func (b *builtinInDurationSig) Clone() builtinFunc { newSig := &builtinInDurationSig{} newSig.cloneFrom(&b.baseBuiltinFunc) - newSig.nonConstArgs = make([]Expression, 0, len(b.nonConstArgs)) - for _, arg := range b.nonConstArgs { - newSig.nonConstArgs = append(newSig.nonConstArgs, arg.Clone()) - } + newSig.nonConstArgsIdx = make([]int, len(b.nonConstArgsIdx)) + copy(newSig.nonConstArgsIdx, b.nonConstArgsIdx) newSig.hashSet = b.hashSet newSig.hasNull = b.hasNull return newSig @@ -572,15 +593,19 @@ func (b *builtinInDurationSig) evalInt(row chunk.Row) (int64, bool, error) { if isNull0 || err != nil { return 0, isNull0, err } - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs if _, ok := b.hashSet[arg0.Duration]; ok { return 1, false, nil } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } + hasNull := b.hasNull - for _, arg := range args[1:] { + for _, arg := range args { evaledArg, isNull, err := arg.EvalDuration(b.ctx, row) if err != nil { return 0, true, err @@ -673,45 +698,56 @@ func (c *setVarFunctionClass) getFunction(ctx sessionctx.Context, args []Express if err = c.verifyArgs(args); err != nil { return nil, err } - bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString, types.ETString) + argTp := args[1].GetType().EvalType() + if argTp == types.ETTimestamp || argTp == types.ETDatetime || argTp == types.ETDuration || argTp == types.ETJson { + argTp = types.ETString + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, argTp, types.ETString, argTp) if err != nil { return nil, err } bf.tp.Flen = args[1].GetType().Flen - // TODO: we should consider the type of the argument, but not take it as string for all situations. - sig = &builtinSetVarSig{bf} - return sig, err + switch argTp { + case types.ETString: + sig = &builtinSetStringVarSig{bf} + case types.ETReal: + sig = &builtinSetRealVarSig{bf} + case types.ETDecimal: + sig = &builtinSetDecimalVarSig{bf} + case types.ETInt: + sig = &builtinSetIntVarSig{bf} + default: + return nil, errors.Errorf("unexpected types.EvalType %v", argTp) + } + return sig, nil } -type builtinSetVarSig struct { +type builtinSetStringVarSig struct { baseBuiltinFunc } -func (b *builtinSetVarSig) Clone() builtinFunc { - newSig := &builtinSetVarSig{} +func (b *builtinSetStringVarSig) Clone() builtinFunc { + newSig := &builtinSetStringVarSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -func (b *builtinSetVarSig) evalString(row chunk.Row) (res string, isNull bool, err error) { +func (b *builtinSetStringVarSig) evalString(row chunk.Row) (res string, isNull bool, err error) { var varName string sessionVars := b.ctx.GetSessionVars() varName, isNull, err = b.args[0].EvalString(b.ctx, row) if isNull || err != nil { return "", isNull, err } - datum, err := b.args[1].Eval(row) isNull = datum.IsNull() if isNull || err != nil { return "", isNull, err } - res, err = datum.ToString() if err != nil { return "", isNull, err } - varName = strings.ToLower(varName) sessionVars.UsersLock.Lock() sessionVars.SetUserVar(varName, stringutil.Copy(res), datum.Collation()) @@ -719,72 +755,309 @@ func (b *builtinSetVarSig) evalString(row chunk.Row) (res string, isNull bool, e return res, false, nil } +type builtinSetRealVarSig struct { + baseBuiltinFunc +} + +func (b *builtinSetRealVarSig) Clone() builtinFunc { + newSig := &builtinSetRealVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinSetRealVarSig) evalReal(row chunk.Row) (res float64, isNull bool, err error) { + var varName string + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err = b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return 0, isNull, err + } + datum, err := b.args[1].Eval(row) + isNull = datum.IsNull() + if isNull || err != nil { + return 0, isNull, err + } + res = datum.GetFloat64() + varName = strings.ToLower(varName) + sessionVars.UsersLock.Lock() + sessionVars.Users[varName] = datum + sessionVars.UsersLock.Unlock() + return res, false, nil +} + +type builtinSetDecimalVarSig struct { + baseBuiltinFunc +} + +func (b *builtinSetDecimalVarSig) Clone() builtinFunc { + newSig := &builtinSetDecimalVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinSetDecimalVarSig) evalDecimal(row chunk.Row) (*types.MyDecimal, bool, error) { + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return nil, isNull, err + } + datum, err := b.args[1].Eval(row) + isNull = datum.IsNull() + if isNull || err != nil { + return nil, isNull, err + } + res := datum.GetMysqlDecimal() + varName = strings.ToLower(varName) + sessionVars.UsersLock.Lock() + sessionVars.Users[varName] = datum + sessionVars.UsersLock.Unlock() + return res, false, nil +} + +type builtinSetIntVarSig struct { + baseBuiltinFunc +} + +func (b *builtinSetIntVarSig) Clone() builtinFunc { + newSig := &builtinSetIntVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinSetIntVarSig) evalInt(row chunk.Row) (int64, bool, error) { + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return 0, isNull, err + } + datum, err := b.args[1].Eval(row) + isNull = datum.IsNull() + if isNull || err != nil { + return 0, isNull, err + } + res := datum.GetInt64() + varName = strings.ToLower(varName) + sessionVars.UsersLock.Lock() + sessionVars.Users[varName] = datum + sessionVars.UsersLock.Unlock() + return res, false, nil +} + +// BuildGetVarFunction builds a GetVar ScalarFunction from the Expression. +func BuildGetVarFunction(ctx sessionctx.Context, expr Expression, retType *types.FieldType) (Expression, error) { + var fc functionClass + switch retType.EvalType() { + case types.ETInt: + fc = &getIntVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, retType}} + case types.ETDecimal: + fc = &getDecimalVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, retType}} + case types.ETReal: + fc = &getRealVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, retType}} + default: + fc = &getStringVarFunctionClass{getVarFunctionClass{baseFunctionClass{ast.GetVar, 1, 1}, retType}} + } + f, err := fc.getFunction(ctx, []Expression{expr}) + if err != nil { + return nil, err + } + if builtinRetTp := f.getRetTp(); builtinRetTp.Tp != mysql.TypeUnspecified || retType.Tp == mysql.TypeUnspecified { + retType = builtinRetTp + } + return &ScalarFunction{ + FuncName: model.NewCIStr(ast.GetVar), + RetType: retType, + Function: f, + }, nil +} + type getVarFunctionClass struct { baseFunctionClass + + tp *types.FieldType } -func (c *getVarFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { +type getStringVarFunctionClass struct { + getVarFunctionClass +} + +func (c *getStringVarFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { if err = c.verifyArgs(args); err != nil { return nil, err } - // TODO: we should consider the type of the argument, but not take it as string for all situations. bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETString, types.ETString) if err != nil { return nil, err } - bf.tp.Flen = mysql.MaxFieldVarCharLength - if err := c.resolveCollation(ctx, args, &bf); err != nil { - return nil, err + bf.tp.Flen = c.tp.Flen + if len(c.tp.Charset) > 0 { + bf.tp.Charset = c.tp.Charset + bf.tp.Collate = c.tp.Collate } - sig = &builtinGetVarSig{bf} + sig = &builtinGetStringVarSig{bf} return sig, nil } -func (c *getVarFunctionClass) resolveCollation(ctx sessionctx.Context, args []Expression, bf *baseBuiltinFunc) (err error) { - if constant, ok := args[0].(*Constant); ok { - varName, err := constant.Value.ToString() +type builtinGetStringVarSig struct { + baseBuiltinFunc +} + +func (b *builtinGetStringVarSig) Clone() builtinFunc { + newSig := &builtinGetStringVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinGetStringVarSig) evalString(row chunk.Row) (string, bool, error) { + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return "", isNull, err + } + varName = strings.ToLower(varName) + sessionVars.UsersLock.RLock() + defer sessionVars.UsersLock.RUnlock() + if v, ok := sessionVars.Users[varName]; ok { + // We cannot use v.GetString() here, because the datum may be in KindMysqlTime, which + // stores the data in datum.x. + // This seems controversial with https://dev.mysql.com/doc/refman/8.0/en/user-variables.html: + // > User variables can be assigned a value from a limited set of data types: integer, decimal, + // > floating-point, binary or nonbinary string, or NULL value. + // However, MySQL actually does support query like `set @p = now()`, so we should not assume the datum stored + // must be of one of the following types: string, decimal, int, float. + res, err := v.ToString() if err != nil { - return err - } - varName = strings.ToLower(varName) - ctx.GetSessionVars().UsersLock.RLock() - defer ctx.GetSessionVars().UsersLock.RUnlock() - if v, ok := ctx.GetSessionVars().Users[varName]; ok { - bf.tp.Collate = v.Collation() - if len(bf.tp.Charset) <= 0 { - charset, _ := ctx.GetSessionVars().GetCharsetInfo() - bf.tp.Charset = charset - } - return nil + return "", false, err } + return res, false, nil } + return "", true, nil +} - return nil +type getIntVarFunctionClass struct { + getVarFunctionClass +} + +func (c *getIntVarFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { + if err = c.verifyArgs(args); err != nil { + return nil, err + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString) + if err != nil { + return nil, err + } + bf.tp.Flen = c.tp.Flen + bf.tp.Flag = c.tp.Flag + sig = &builtinGetIntVarSig{bf} + return sig, nil } -type builtinGetVarSig struct { +type builtinGetIntVarSig struct { baseBuiltinFunc } -func (b *builtinGetVarSig) Clone() builtinFunc { - newSig := &builtinGetVarSig{} +func (b *builtinGetIntVarSig) Clone() builtinFunc { + newSig := &builtinGetIntVarSig{} newSig.cloneFrom(&b.baseBuiltinFunc) return newSig } -func (b *builtinGetVarSig) evalString(row chunk.Row) (string, bool, error) { +func (b *builtinGetIntVarSig) evalInt(row chunk.Row) (int64, bool, error) { sessionVars := b.ctx.GetSessionVars() varName, isNull, err := b.args[0].EvalString(b.ctx, row) if isNull || err != nil { - return "", isNull, err + return 0, isNull, err } varName = strings.ToLower(varName) sessionVars.UsersLock.RLock() defer sessionVars.UsersLock.RUnlock() if v, ok := sessionVars.Users[varName]; ok { - return v.GetString(), false, nil + return v.GetInt64(), false, nil } - return "", true, nil + return 0, true, nil +} + +type getRealVarFunctionClass struct { + getVarFunctionClass +} + +func (c *getRealVarFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { + if err = c.verifyArgs(args); err != nil { + return nil, err + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETReal, types.ETString) + if err != nil { + return nil, err + } + bf.tp.Flen = c.tp.Flen + sig = &builtinGetRealVarSig{bf} + return sig, nil +} + +type builtinGetRealVarSig struct { + baseBuiltinFunc +} + +func (b *builtinGetRealVarSig) Clone() builtinFunc { + newSig := &builtinGetRealVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinGetRealVarSig) evalReal(row chunk.Row) (float64, bool, error) { + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return 0, isNull, err + } + varName = strings.ToLower(varName) + sessionVars.UsersLock.RLock() + defer sessionVars.UsersLock.RUnlock() + if v, ok := sessionVars.Users[varName]; ok { + return v.GetFloat64(), false, nil + } + return 0, true, nil +} + +type getDecimalVarFunctionClass struct { + getVarFunctionClass +} + +func (c *getDecimalVarFunctionClass) getFunction(ctx sessionctx.Context, args []Expression) (sig builtinFunc, err error) { + if err = c.verifyArgs(args); err != nil { + return nil, err + } + bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETDecimal, types.ETString) + if err != nil { + return nil, err + } + bf.tp.Flen = c.tp.Flen + sig = &builtinGetDecimalVarSig{bf} + return sig, nil +} + +type builtinGetDecimalVarSig struct { + baseBuiltinFunc +} + +func (b *builtinGetDecimalVarSig) Clone() builtinFunc { + newSig := &builtinGetDecimalVarSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +func (b *builtinGetDecimalVarSig) evalDecimal(row chunk.Row) (*types.MyDecimal, bool, error) { + sessionVars := b.ctx.GetSessionVars() + varName, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return nil, isNull, err + } + varName = strings.ToLower(varName) + sessionVars.UsersLock.RLock() + defer sessionVars.UsersLock.RUnlock() + if v, ok := sessionVars.Users[varName]; ok { + return v.GetMysqlDecimal(), false, nil + } + return nil, true, nil } type valuesFunctionClass struct { @@ -837,12 +1110,9 @@ func (b *builtinValuesIntSig) Clone() builtinFunc { // evalInt evals a builtinValuesIntSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesIntSig) evalInt(_ chunk.Row) (int64, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return 0, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return 0, true, errors.New("Session current insert values is nil") + return 0, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { @@ -881,12 +1151,9 @@ func (b *builtinValuesRealSig) Clone() builtinFunc { // evalReal evals a builtinValuesRealSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesRealSig) evalReal(_ chunk.Row) (float64, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return 0, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return 0, true, errors.New("Session current insert values is nil") + return 0, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { @@ -915,12 +1182,9 @@ func (b *builtinValuesDecimalSig) Clone() builtinFunc { // evalDecimal evals a builtinValuesDecimalSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesDecimalSig) evalDecimal(_ chunk.Row) (*types.MyDecimal, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return nil, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return nil, true, errors.New("Session current insert values is nil") + return &types.MyDecimal{}, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { @@ -946,12 +1210,9 @@ func (b *builtinValuesStringSig) Clone() builtinFunc { // evalString evals a builtinValuesStringSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesStringSig) evalString(_ chunk.Row) (string, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return "", true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return "", true, errors.New("Session current insert values is nil") + return "", true, nil } if b.offset >= row.Len() { return "", true, errors.Errorf("Session current insert values len %d and column's offset %v don't match", row.Len(), b.offset) @@ -986,12 +1247,9 @@ func (b *builtinValuesTimeSig) Clone() builtinFunc { // evalTime evals a builtinValuesTimeSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesTimeSig) evalTime(_ chunk.Row) (types.Time, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return types.ZeroTime, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return types.ZeroTime, true, errors.New("Session current insert values is nil") + return types.ZeroTime, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { @@ -1017,12 +1275,9 @@ func (b *builtinValuesDurationSig) Clone() builtinFunc { // evalDuration evals a builtinValuesDurationSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesDurationSig) evalDuration(_ chunk.Row) (types.Duration, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return types.Duration{}, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return types.Duration{}, true, errors.New("Session current insert values is nil") + return types.Duration{}, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { @@ -1049,12 +1304,9 @@ func (b *builtinValuesJSONSig) Clone() builtinFunc { // evalJSON evals a builtinValuesJSONSig. // See https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values func (b *builtinValuesJSONSig) evalJSON(_ chunk.Row) (json.BinaryJSON, bool, error) { - if !b.ctx.GetSessionVars().StmtCtx.InInsertStmt { - return json.BinaryJSON{}, true, nil - } row := b.ctx.GetSessionVars().CurrInsertValues if row.IsEmpty() { - return json.BinaryJSON{}, true, errors.New("Session current insert values is nil") + return json.BinaryJSON{}, true, nil } if b.offset < row.Len() { if row.IsNull(b.offset) { diff --git a/expression/builtin_other_test.go b/expression/builtin_other_test.go index 05e921216d367..d43e3438c5276 100644 --- a/expression/builtin_other_test.go +++ b/expression/builtin_other_test.go @@ -151,47 +151,54 @@ func (s *testEvaluatorSuite) TestRowFunc(c *C) { func (s *testEvaluatorSuite) TestSetVar(c *C) { fc := funcs[ast.SetVar] + dec := types.NewDecFromInt(5) testCases := []struct { args []interface{} res interface{} }{ {[]interface{}{"a", "12"}, "12"}, {[]interface{}{"b", "34"}, "34"}, - {[]interface{}{"c", nil}, ""}, + {[]interface{}{"c", nil}, nil}, {[]interface{}{"c", "ABC"}, "ABC"}, {[]interface{}{"c", "dEf"}, "dEf"}, + {[]interface{}{"d", int64(3)}, int64(3)}, + {[]interface{}{"e", float64(2.5)}, float64(2.5)}, + {[]interface{}{"f", dec}, dec}, } for _, tc := range testCases { fn, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) c.Assert(err, IsNil) d, err := evalBuiltinFunc(fn, chunk.MutRowFromDatums(types.MakeDatums(tc.args...)).ToRow()) c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, tc.res) + c.Assert(d.GetValue(), Equals, tc.res) if tc.args[1] != nil { key, ok := tc.args[0].(string) c.Assert(ok, Equals, true) - val, ok := tc.res.(string) - c.Assert(ok, Equals, true) sessionVar, ok := s.ctx.GetSessionVars().Users[key] c.Assert(ok, Equals, true) - c.Assert(sessionVar.GetString(), Equals, val) + c.Assert(sessionVar.GetValue(), Equals, tc.res) } } } func (s *testEvaluatorSuite) TestGetVar(c *C) { - fc := funcs[ast.GetVar] - + dec := types.NewDecFromInt(5) sessionVars := []struct { key string - val string + val interface{} }{ {"a", "中"}, {"b", "文字符chuan"}, {"c", ""}, + {"e", int64(3)}, + {"f", float64(2.5)}, + {"g", dec}, } for _, kv := range sessionVars { - s.ctx.GetSessionVars().Users[kv.key] = types.NewStringDatum(kv.val) + s.ctx.GetSessionVars().Users[kv.key] = types.NewDatum(kv.val) + tp := types.NewFieldType(mysql.TypeVarString) + types.DefaultParamTypeForValue(kv.val, tp) + s.ctx.GetSessionVars().UserVarTypes[kv.key] = tp } testCases := []struct { @@ -201,24 +208,25 @@ func (s *testEvaluatorSuite) TestGetVar(c *C) { {[]interface{}{"a"}, "中"}, {[]interface{}{"b"}, "文字符chuan"}, {[]interface{}{"c"}, ""}, - {[]interface{}{"d"}, ""}, + {[]interface{}{"d"}, nil}, + {[]interface{}{"e"}, int64(3)}, + {[]interface{}{"f"}, float64(2.5)}, + {[]interface{}{"g"}, dec}, } for _, tc := range testCases { - fn, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))) + tp, ok := s.ctx.GetSessionVars().UserVarTypes[tc.args[0].(string)] + if !ok { + tp = types.NewFieldType(mysql.TypeVarString) + } + fn, err := BuildGetVarFunction(s.ctx, s.datumsToConstants(types.MakeDatums(tc.args...))[0], tp) c.Assert(err, IsNil) - d, err := evalBuiltinFunc(fn, chunk.MutRowFromDatums(types.MakeDatums(tc.args...)).ToRow()) + d, err := fn.Eval(chunk.Row{}) c.Assert(err, IsNil) - c.Assert(d.GetString(), Equals, tc.res) + c.Assert(d.GetValue(), Equals, tc.res) } } func (s *testEvaluatorSuite) TestValues(c *C) { - origin := s.ctx.GetSessionVars().StmtCtx.InInsertStmt - s.ctx.GetSessionVars().StmtCtx.InInsertStmt = false - defer func() { - s.ctx.GetSessionVars().StmtCtx.InInsertStmt = origin - }() - fc := &valuesFunctionClass{baseFunctionClass{ast.Values, 0, 0}, 1, types.NewFieldType(mysql.TypeVarchar)} _, err := fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(""))) c.Assert(err, ErrorMatches, "*Incorrect parameter count in the call to native function 'values'") @@ -232,11 +240,10 @@ func (s *testEvaluatorSuite) TestValues(c *C) { s.ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(types.MakeDatums("1")).ToRow() ret, err = evalBuiltinFunc(sig, chunk.Row{}) - c.Assert(err, IsNil) - c.Assert(ret.IsNull(), IsTrue) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Session current insert values len.*") currInsertValues := types.MakeDatums("1", "2") - s.ctx.GetSessionVars().StmtCtx.InInsertStmt = true s.ctx.GetSessionVars().CurrInsertValues = chunk.MutRowFromDatums(currInsertValues).ToRow() ret, err = evalBuiltinFunc(sig, chunk.Row{}) c.Assert(err, IsNil) diff --git a/expression/builtin_other_vec.go b/expression/builtin_other_vec.go index 7bbbd8260857e..17f2ce12bcb0f 100644 --- a/expression/builtin_other_vec.go +++ b/expression/builtin_other_vec.go @@ -155,11 +155,11 @@ func (b *builtinGetParamStringSig) vecEvalString(input *chunk.Chunk, result *chu return nil } -func (b *builtinSetVarSig) vectorized() bool { +func (b *builtinSetStringVarSig) vectorized() bool { return true } -func (b *builtinSetVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinSetStringVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get(types.ETString, n) if err != nil { @@ -195,6 +195,126 @@ func (b *builtinSetVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Colum return nil } +func (b *builtinSetIntVarSig) vectorized() bool { + return true +} + +func (b *builtinSetIntVarSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + buf1, err := b.bufAllocator.get(types.ETInt, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf1) + if err := b.args[1].VecEvalInt(b.ctx, input, buf1); err != nil { + return err + } + result.ResizeInt64(n, false) + i64s := result.Int64s() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if buf0.IsNull(i) || buf1.IsNull(i) { + result.SetNull(i, true) + continue + } + varName := strings.ToLower(buf0.GetString(i)) + res := buf1.GetInt64(i) + sessionVars.Users[varName] = types.NewIntDatum(res) + i64s[i] = res + } + return nil +} + +func (b *builtinSetRealVarSig) vectorized() bool { + return true +} + +func (b *builtinSetRealVarSig) vecEvalReal(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + buf1, err := b.bufAllocator.get(types.ETReal, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf1) + if err := b.args[1].VecEvalReal(b.ctx, input, buf1); err != nil { + return err + } + result.ResizeFloat64(n, false) + f64s := result.Float64s() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if buf0.IsNull(i) || buf1.IsNull(i) { + result.SetNull(i, true) + continue + } + varName := strings.ToLower(buf0.GetString(i)) + res := buf1.GetFloat64(i) + sessionVars.Users[varName] = types.NewFloat64Datum(res) + f64s[i] = res + } + return nil +} + +func (b *builtinSetDecimalVarSig) vectorized() bool { + return true +} + +func (b *builtinSetDecimalVarSig) vecEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + buf1, err := b.bufAllocator.get(types.ETDecimal, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf1) + if err := b.args[1].VecEvalDecimal(b.ctx, input, buf1); err != nil { + return err + } + result.ResizeDecimal(n, false) + decs := result.Decimals() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if buf0.IsNull(i) || buf1.IsNull(i) { + result.SetNull(i, true) + continue + } + varName := strings.ToLower(buf0.GetString(i)) + res := buf1.GetDecimal(i) + sessionVars.Users[varName] = types.NewDecimalDatum(res) + decs[i] = *res + } + return nil +} + func (b *builtinValuesDecimalSig) vectorized() bool { return false } @@ -203,11 +323,11 @@ func (b *builtinValuesDecimalSig) vecEvalDecimal(input *chunk.Chunk, result *chu return errors.Errorf("not implemented") } -func (b *builtinGetVarSig) vectorized() bool { +func (b *builtinGetStringVarSig) vectorized() bool { return true } -func (b *builtinGetVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinGetStringVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf0, err := b.bufAllocator.get(types.ETString, n) if err != nil { @@ -228,10 +348,116 @@ func (b *builtinGetVarSig) vecEvalString(input *chunk.Chunk, result *chunk.Colum } varName := strings.ToLower(buf0.GetString(i)) if v, ok := sessionVars.Users[varName]; ok { - result.AppendString(v.GetString()) + res, err := v.ToString() + if err != nil { + return err + } + result.AppendString(res) continue } result.AppendNull() } return nil } + +func (b *builtinGetIntVarSig) vectorized() bool { + return true +} + +func (b *builtinGetIntVarSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + result.ResizeInt64(n, false) + result.MergeNulls(buf0) + i64s := result.Int64s() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + varName := strings.ToLower(buf0.GetString(i)) + if v, ok := sessionVars.Users[varName]; ok { + i64s[i] = v.GetInt64() + continue + } + result.SetNull(i, true) + } + return nil +} + +func (b *builtinGetRealVarSig) vectorized() bool { + return true +} + +func (b *builtinGetRealVarSig) vecEvalReal(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + result.ResizeFloat64(n, false) + result.MergeNulls(buf0) + f64s := result.Float64s() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + varName := strings.ToLower(buf0.GetString(i)) + if v, ok := sessionVars.Users[varName]; ok { + f64s[i] = v.GetFloat64() + continue + } + result.SetNull(i, true) + } + return nil +} + +func (b *builtinGetDecimalVarSig) vectorized() bool { + return true +} + +func (b *builtinGetDecimalVarSig) vecEvalDecimal(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + buf0, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(buf0) + if err := b.args[0].VecEvalString(b.ctx, input, buf0); err != nil { + return err + } + result.ResizeDecimal(n, false) + result.MergeNulls(buf0) + decs := result.Decimals() + sessionVars := b.ctx.GetSessionVars() + sessionVars.UsersLock.Lock() + defer sessionVars.UsersLock.Unlock() + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + varName := strings.ToLower(buf0.GetString(i)) + if v, ok := sessionVars.Users[varName]; ok { + decs[i] = *v.GetMysqlDecimal() + continue + } + result.SetNull(i, true) + } + return nil +} diff --git a/expression/builtin_other_vec_generated.go b/expression/builtin_other_vec_generated.go index b19676230f6a7..0cdf900f0793d 100644 --- a/expression/builtin_other_vec_generated.go +++ b/expression/builtin_other_vec_generated.go @@ -53,9 +53,8 @@ func (b *builtinInIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) e } isUnsigned0 := mysql.HasUnsignedFlag(b.args[0].GetType().Flag) var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -73,9 +72,13 @@ func (b *builtinInIntSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) e } } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalInt(b.ctx, input, buf1); err != nil { return err } @@ -153,10 +156,9 @@ func (b *builtinInStringSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column } } var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { collator := collate.GetCollator(b.collation) - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -168,9 +170,13 @@ func (b *builtinInStringSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column result.SetNull(i, false) } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalString(b.ctx, input, buf1); err != nil { return err } @@ -232,9 +238,8 @@ func (b *builtinInDecimalSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum } } var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -250,9 +255,13 @@ func (b *builtinInDecimalSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum result.SetNull(i, false) } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalDecimal(b.ctx, input, buf1); err != nil { return err } @@ -319,9 +328,8 @@ func (b *builtinInRealSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) } } var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -333,9 +341,13 @@ func (b *builtinInRealSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) result.SetNull(i, false) } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalReal(b.ctx, input, buf1); err != nil { return err } @@ -399,23 +411,26 @@ func (b *builtinInTimeSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) } } var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true continue } arg0 := args0[i] - if _, ok := b.hashSet[arg0]; ok { + if _, ok := b.hashSet[arg0.CoreTime()]; ok { r64s[i] = 1 result.SetNull(i, false) } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalTime(b.ctx, input, buf1); err != nil { return err } @@ -479,9 +494,8 @@ func (b *builtinInDurationSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colu } } var compareResult int - args := b.args + args := b.args[1:] if len(b.hashSet) != 0 { - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -493,9 +507,13 @@ func (b *builtinInDurationSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colu result.SetNull(i, false) } } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalDuration(b.ctx, input, buf1); err != nil { return err } @@ -553,9 +571,9 @@ func (b *builtinInJSONSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) } hasNull := make([]bool, n) var compareResult int - args := b.args + args := b.args[1:] - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEvalJSON(b.ctx, input, buf1); err != nil { return err } diff --git a/expression/builtin_other_vec_test.go b/expression/builtin_other_vec_test.go index 55541186822d0..b042de216115d 100644 --- a/expression/builtin_other_vec_test.go +++ b/expression/builtin_other_vec_test.go @@ -36,6 +36,9 @@ func dateTimeFromString(s string) types.Time { var vecBuiltinOtherCases = map[string][]vecExprBenchCase{ ast.SetVar: { {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString, types.ETString}}, + {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString, types.ETInt}}, + {retEvalType: types.ETReal, childrenTypes: []types.EvalType{types.ETString, types.ETReal}}, + {retEvalType: types.ETDecimal, childrenTypes: []types.EvalType{types.ETString, types.ETDecimal}}, }, ast.GetVar: { {retEvalType: types.ETString, childrenTypes: []types.EvalType{types.ETString}}, diff --git a/expression/builtin_regexp_vec_const_test.go b/expression/builtin_regexp_vec_const_test.go index 5cd2c41c3269e..cf01dc4d1894e 100644 --- a/expression/builtin_regexp_vec_const_test.go +++ b/expression/builtin_regexp_vec_const_test.go @@ -44,7 +44,7 @@ func genVecBuiltinRegexpBenchCaseForConstants() (baseFunc builtinFunc, childrenF args := make([]Expression, numArgs) args[0] = &Column{Index: 0, RetType: childrenFieldTypes[0]} - args[1] = DatumToConstant(types.NewStringDatum(rePat), mysql.TypeString) + args[1] = DatumToConstant(types.NewStringDatum(rePat), mysql.TypeString, 0) var err error baseFunc, err = funcs[ast.Regexp].getFunction(mock.NewContext(), args) diff --git a/expression/builtin_string.go b/expression/builtin_string.go index 93630d6a8fa10..c60522e40e294 100644 --- a/expression/builtin_string.go +++ b/expression/builtin_string.go @@ -436,9 +436,9 @@ func (b *builtinConcatWSSig) evalString(row chunk.Row) (string, bool, error) { str := strings.Join(strs, sep) // todo check whether the length of result is larger than Flen - //if b.tp.Flen != types.UnspecifiedLength && len(str) > b.tp.Flen { + // if b.tp.Flen != types.UnspecifiedLength && len(str) > b.tp.Flen { // return "", true, nil - //} + // } return str, false, nil } @@ -3370,8 +3370,10 @@ func (b *builtinFormatWithLocaleSig) evalString(row chunk.Row) (string, bool, er } if isNull { b.ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) - locale = "en_US" + } else if !strings.EqualFold(locale, "en_US") { // TODO: support other locales. + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(locale)) } + locale = "en_US" formatString, err := mysql.GetLocaleFormatFunction(locale)(x, d) return formatString, false, err } @@ -3549,13 +3551,13 @@ func (b *builtinToBase64Sig) evalString(row chunk.Row) (d string, isNull bool, e return "", true, nil } if b.tp.Flen == -1 || b.tp.Flen > mysql.MaxBlobWidth { - return "", true, nil + b.tp.Flen = mysql.MaxBlobWidth } - //encode + // encode strBytes := []byte(str) result := base64.StdEncoding.EncodeToString(strBytes) - //A newline is added after each 76 characters of encoded output to divide long output into multiple lines. + // A newline is added after each 76 characters of encoded output to divide long output into multiple lines. count := len(result) if count > 76 { resultArr := splitToSubN(result, 76) @@ -3883,7 +3885,12 @@ func (c *weightStringFunctionClass) getFunction(ctx sessionctx.Context, args []E if padding == weightStringPaddingNull { sig = &builtinWeightStringNullSig{bf} } else { - sig = &builtinWeightStringSig{bf, padding, length} + valStr, _ := ctx.GetSessionVars().GetSystemVar(variable.MaxAllowedPacket) + maxAllowedPacket, err := strconv.ParseUint(valStr, 10, 64) + if err != nil { + return nil, errors.Trace(err) + } + sig = &builtinWeightStringSig{bf, padding, length, maxAllowedPacket} } return sig, nil } @@ -3907,8 +3914,9 @@ func (b *builtinWeightStringNullSig) evalString(row chunk.Row) (string, bool, er type builtinWeightStringSig struct { baseBuiltinFunc - padding weightStringPadding - length int + padding weightStringPadding + length int + maxAllowedPacket uint64 } func (b *builtinWeightStringSig) Clone() builtinFunc { @@ -3916,6 +3924,7 @@ func (b *builtinWeightStringSig) Clone() builtinFunc { newSig.cloneFrom(&b.baseBuiltinFunc) newSig.padding = b.padding newSig.length = b.length + newSig.maxAllowedPacket = b.maxAllowedPacket return newSig } @@ -3939,6 +3948,10 @@ func (b *builtinWeightStringSig) evalString(row chunk.Row) (string, bool, error) if b.length < lenRunes { str = string(runes[:b.length]) } else if b.length > lenRunes { + if uint64(b.length-lenRunes) > b.maxAllowedPacket { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnAllowedPacketOverflowed.GenWithStackByArgs("weight_string", b.maxAllowedPacket)) + return "", true, nil + } str += strings.Repeat(" ", b.length-lenRunes) } ctor = collate.GetCollator(b.args[0].GetType().Collate) @@ -3949,6 +3962,10 @@ func (b *builtinWeightStringSig) evalString(row chunk.Row) (string, bool, error) b.ctx.GetSessionVars().StmtCtx.AppendWarning(errTruncatedWrongValue.GenWithStackByArgs(tpInfo, str)) str = str[:b.length] } else if b.length > lenStr { + if uint64(b.length-lenStr) > b.maxAllowedPacket { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errWarnAllowedPacketOverflowed.GenWithStackByArgs("cast_as_binary", b.maxAllowedPacket)) + return "", true, nil + } str += strings.Repeat("\x00", b.length-lenStr) } ctor = collate.GetCollator(charset.CollationBin) diff --git a/expression/builtin_string_test.go b/expression/builtin_string_test.go index 003ccee4cb15e..57eb867ab6498 100644 --- a/expression/builtin_string_test.go +++ b/expression/builtin_string_test.go @@ -1688,7 +1688,7 @@ func (s *testEvaluatorSuite) TestOct(c *C) { {1025, "2001"}, {"8a8", "10"}, {"abc", "0"}, - //overflow uint64 + // overflow uint64 {"9999999999999999999999999", "1777777777777777777777"}, {"-9999999999999999999999999", "1777777777777777777777"}, {types.NewBinaryLiteralFromUint(255, -1), "377"}, // b'11111111' @@ -1770,13 +1770,13 @@ func (s *testEvaluatorSuite) TestFormat(c *C) { precision interface{} locale string ret interface{} - }{-12332.123456, -4, "zh_CN", nil} + }{-12332.123456, -4, "zh_CN", "-12,332"} formatTests3 := struct { number interface{} precision interface{} locale string ret interface{} - }{"-12332.123456", "4", "de_GE", nil} + }{"-12332.123456", "4", "de_GE", "-12,332.1235"} formatTests4 := struct { number interface{} precision interface{} @@ -1835,8 +1835,10 @@ func (s *testEvaluatorSuite) TestFormat(c *C) { c.Assert(err, IsNil) c.Assert(r4, testutil.DatumEquals, types.NewDatum(formatTests4.ret)) warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, 1) - c.Assert(terror.ErrorEqual(errUnknownLocale, warnings[0].Err), IsTrue) + c.Assert(len(warnings), Equals, 3) + for i := 0; i < 3; i++ { + c.Assert(terror.ErrorEqual(errUnknownLocale, warnings[i].Err), IsTrue) + } s.ctx.GetSessionVars().StmtCtx.SetWarnings([]stmtctx.SQLWarn{}) } diff --git a/expression/builtin_string_vec.go b/expression/builtin_string_vec.go index 0a98118600192..c5511cc2cdeb9 100644 --- a/expression/builtin_string_vec.go +++ b/expression/builtin_string_vec.go @@ -646,10 +646,10 @@ func (b *builtinConcatWSSig) vecEvalString(input *chunk.Chunk, result *chunk.Col } str := strings.Join(strs[i], seps[i]) // todo check whether the length of result is larger than Flen - //if b.tp.Flen != types.UnspecifiedLength && len(str) > b.tp.Flen { + // if b.tp.Flen != types.UnspecifiedLength && len(str) > b.tp.Flen { // result.AppendNull() // continue - //} + // } result.AppendString(str) } return nil @@ -2420,12 +2420,11 @@ func (b *builtinToBase64Sig) vecEvalString(input *chunk.Chunk, result *chunk.Col result.AppendNull() continue } else if b.tp.Flen == -1 || b.tp.Flen > mysql.MaxBlobWidth { - result.AppendNull() - continue + b.tp.Flen = mysql.MaxBlobWidth } newStr := base64.StdEncoding.EncodeToString([]byte(str)) - //A newline is added after each 76 characters of encoded output to divide long output into multiple lines. + // A newline is added after each 76 characters of encoded output to divide long output into multiple lines. count := len(newStr) if count > 76 { newStr = strings.Join(splitToSubN(newStr, 76), "\n") @@ -2865,16 +2864,15 @@ func formatDecimal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, d = formatMaxDecimals } - var locale string + locale := "en_US" if localeBuf == nil { // FORMAT(x, d) - locale = "en_US" } else if localeBuf.IsNull(i) { // FORMAT(x, d, NULL) sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) - locale = "en_US" - } else { - locale = localeBuf.GetString(i) + } else if !strings.EqualFold(localeBuf.GetString(i), "en_US") { + // TODO: support other locales. + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(localeBuf.GetString(i))) } xStr := roundFormatArgs(x.String(), int(d)) @@ -2906,16 +2904,15 @@ func formatReal(sctx sessionctx.Context, xBuf *chunk.Column, dInt64s []int64, re d = formatMaxDecimals } - var locale string + locale := "en_US" if localeBuf == nil { // FORMAT(x, d) - locale = "en_US" } else if localeBuf.IsNull(i) { // FORMAT(x, d, NULL) sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs("NULL")) - locale = "en_US" - } else { - locale = localeBuf.GetString(i) + } else if !strings.EqualFold(localeBuf.GetString(i), "en_US") { + // TODO: support other locales. + sctx.GetSessionVars().StmtCtx.AppendWarning(errUnknownLocale.GenWithStackByArgs(localeBuf.GetString(i))) } xStr := roundFormatArgs(strconv.FormatFloat(x, 'f', -1, 64), int(d)) diff --git a/expression/builtin_time.go b/expression/builtin_time.go index 8a36c40668020..1d52cf6adc2c3 100644 --- a/expression/builtin_time.go +++ b/expression/builtin_time.go @@ -27,6 +27,7 @@ import ( "github.com/cznic/mathutil" "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/sessionctx" @@ -216,6 +217,7 @@ var ( _ builtinFunc = &builtinStrToDateDurationSig{} _ builtinFunc = &builtinFromUnixTime1ArgSig{} _ builtinFunc = &builtinFromUnixTime2ArgSig{} + _ builtinFunc = &builtinExtractDatetimeFromStringSig{} _ builtinFunc = &builtinExtractDatetimeSig{} _ builtinFunc = &builtinExtractDurationSig{} _ builtinFunc = &builtinAddDateStringStringSig{} @@ -1078,7 +1080,8 @@ func (b *builtinMonthSig) evalInt(row chunk.Row) (int64, bool, error) { if date.IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, date.String())) + isNull, err = handleInvalidZeroTime(b.ctx, date) + return 0, isNull, err } return 0, false, nil } @@ -1237,7 +1240,8 @@ func (b *builtinDayOfMonthSig) evalInt(row chunk.Row) (int64, bool, error) { } if arg.IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, arg.String())) + isNull, err = handleInvalidZeroTime(b.ctx, arg) + return 0, isNull, err } return 0, false, nil } @@ -1280,7 +1284,8 @@ func (b *builtinDayOfWeekSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, true, handleInvalidTimeError(b.ctx, err) } if arg.InvalidZero() { - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, arg.String())) + isNull, err = handleInvalidZeroTime(b.ctx, arg) + return 0, isNull, err } // 1 is Sunday, 2 is Monday, .... 7 is Saturday return int64(arg.Weekday() + 1), false, nil @@ -1322,7 +1327,8 @@ func (b *builtinDayOfYearSig) evalInt(row chunk.Row) (int64, bool, error) { return 0, isNull, handleInvalidTimeError(b.ctx, err) } if arg.InvalidZero() { - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, arg.String())) + isNull, err := handleInvalidZeroTime(b.ctx, arg) + return 0, isNull, err } return int64(arg.YearDay()), false, nil @@ -1556,7 +1562,8 @@ func (b *builtinYearSig) evalInt(row chunk.Row) (int64, bool, error) { if date.IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, date.String())) + isNull, err := handleInvalidZeroTime(b.ctx, date) + return 0, isNull, err } return 0, false, nil } @@ -1936,7 +1943,7 @@ func (b *builtinStrToDateDateSig) evalTime(row chunk.Row) (types.Time, bool, err return types.ZeroTime, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) } if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() && (t.Year() == 0 || t.Month() == 0 || t.Day() == 0) { - return types.ZeroTime, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) + return types.ZeroTime, true, handleInvalidTimeError(b.ctx, types.ErrWrongValueForType.GenWithStackByArgs(types.DateTimeStr, date, ast.StrToDate)) } t.SetType(mysql.TypeDate) t.SetFsp(types.MinFsp) @@ -2004,9 +2011,6 @@ func (b *builtinStrToDateDurationSig) evalDuration(row chunk.Row) (types.Duratio if !succ { return types.Duration{}, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) } - if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() && (t.Year() == 0 || t.Month() == 0 || t.Day() == 0) { - return types.Duration{}, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) - } t.SetFsp(int8(b.tp.Decimal)) dur, err := t.ConvertToDuration() return dur, err != nil, err @@ -2628,12 +2632,22 @@ func (c *extractFunctionClass) getFunction(ctx sessionctx.Context, args []Expres } var bf baseBuiltinFunc if isDatetimeUnit { - bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDatetime) - if err != nil { - return nil, err + if args[1].GetType().EvalType() != types.ETString { + bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDatetime) + if err != nil { + return nil, err + } + sig = &builtinExtractDatetimeSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetime) + } else { + bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETString) + if err != nil { + return nil, err + } + bf.args[1].GetType().Decimal = int(types.MaxFsp) + sig = &builtinExtractDatetimeFromStringSig{bf} + sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetimeFromString) } - sig = &builtinExtractDatetimeSig{bf} - sig.setPbCode(tipb.ScalarFuncSig_ExtractDatetime) } else { bf, err = newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETInt, types.ETString, types.ETDuration) if err != nil { @@ -2645,6 +2659,65 @@ func (c *extractFunctionClass) getFunction(ctx sessionctx.Context, args []Expres return sig, nil } +type builtinExtractDatetimeFromStringSig struct { + baseBuiltinFunc +} + +func (b *builtinExtractDatetimeFromStringSig) Clone() builtinFunc { + newSig := &builtinExtractDatetimeFromStringSig{} + newSig.cloneFrom(&b.baseBuiltinFunc) + return newSig +} + +// evalInt evals a builtinExtractDatetimeSig. +// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_extract +func (b *builtinExtractDatetimeFromStringSig) evalInt(row chunk.Row) (int64, bool, error) { + unit, isNull, err := b.args[0].EvalString(b.ctx, row) + if isNull || err != nil { + return 0, isNull, err + } + dtStr, isNull, err := b.args[1].EvalString(b.ctx, row) + if isNull || err != nil { + return 0, isNull, err + } + sc := b.ctx.GetSessionVars().StmtCtx + switch strings.ToUpper(unit) { + case "DAY_MICROSECOND", "DAY_SECOND", "DAY_MINUTE", "DAY_HOUR": + dur, err := types.ParseDuration(sc, dtStr, types.GetFsp(dtStr)) + if err != nil { + return 0, true, err + } + res, err := types.ExtractDurationNum(&dur, unit) + if err != nil { + return 0, true, err + } + dt, err := types.ParseDatetime(sc, dtStr) + if err != nil { + return res, false, nil + } + if dt.Hour() == dur.Hour() && dt.Minute() == dur.Minute() && dt.Second() == dur.Second() && dt.Year() > 0 { + res, err = types.ExtractDatetimeNum(&dt, unit) + } + return res, err != nil, err + } + dt, err := types.ParseDatetime(sc, dtStr) + if err != nil { + if !terror.ErrorEqual(err, types.ErrWrongValue) { + return 0, true, err + } + } + if dt.IsZero() { + dt.SetFsp(int8(b.args[1].GetType().Decimal)) + if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { + isNull, err := handleInvalidZeroTime(b.ctx, dt) + return 0, isNull, err + } + return 0, false, nil + } + res, err := types.ExtractDatetimeNum(&dt, unit) + return res, err != nil, err +} + type builtinExtractDatetimeSig struct { baseBuiltinFunc } @@ -2721,7 +2794,16 @@ func (du *baseDateArithmitical) getDateFromString(ctx sessionctx.Context, args [ sc := ctx.GetSessionVars().StmtCtx date, err := types.ParseTime(sc, dateStr, dateTp, types.MaxFsp) - return date, err != nil, handleInvalidTimeError(ctx, err) + if err != nil { + err = handleInvalidTimeError(ctx, err) + if err != nil { + return types.ZeroTime, true, err + } + return date, true, handleInvalidTimeError(ctx, err) + } else if ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() && (date.Year() == 0 || date.Month() == 0 || date.Day() == 0) { + return types.ZeroTime, true, handleInvalidTimeError(ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, dateStr)) + } + return date, false, handleInvalidTimeError(ctx, err) } func (du *baseDateArithmitical) getDateFromInt(ctx sessionctx.Context, args []Expression, row chunk.Row, unit string) (types.Time, bool, error) { @@ -2750,11 +2832,9 @@ func (du *baseDateArithmitical) getDateFromDatetime(ctx sessionctx.Context, args return types.ZeroTime, true, err } - dateTp := mysql.TypeDate - if date.Type() == mysql.TypeDatetime || date.Type() == mysql.TypeTimestamp || types.IsClockUnit(unit) { - dateTp = mysql.TypeDatetime + if types.IsClockUnit(unit) { + date.SetType(mysql.TypeDatetime) } - date.SetType(dateTp) return date, false, nil } @@ -2855,7 +2935,7 @@ func (du *baseDateArithmitical) add(ctx sessionctx.Context, date types.Time, int } func (du *baseDateArithmitical) addDate(ctx sessionctx.Context, date types.Time, year, month, day, nano int64) (types.Time, bool, error) { - goTime, err := date.GoTime(time.Local) + goTime, err := date.GoTime(time.UTC) if err := handleInvalidTimeError(ctx, err); err != nil { return types.ZeroTime, true, err } @@ -2999,6 +3079,8 @@ func (du *baseDateArithmitical) vecGetDateFromString(b *baseBuiltinFunc, input * return err } result.SetNull(i, true) + } else if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() && (date.Year() == 0 || date.Month() == 0 || date.Day() == 0) { + return handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, dateStr)) } else { dates[i] = date } @@ -3021,11 +3103,9 @@ func (du *baseDateArithmitical) vecGetDateFromDatetime(b *baseBuiltinFunc, input continue } - dateTp := mysql.TypeDate - if dates[i].Type() == mysql.TypeDatetime || dates[i].Type() == mysql.TypeTimestamp || isClockUnit { - dateTp = mysql.TypeDatetime + if isClockUnit { + dates[i].SetType(mysql.TypeDatetime) } - dates[i].SetType(dateTp) } return nil } @@ -4851,7 +4931,7 @@ func (c *timestampFunctionClass) getFunction(ctx sessionctx.Context, args []Expr } isFloat := false switch args[0].GetType().Tp { - case mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal: + case mysql.TypeFloat, mysql.TypeDouble, mysql.TypeNewDecimal, mysql.TypeLonglong: isFloat = true } bf, err := newBaseBuiltinFuncWithTp(ctx, c.funcName, args, types.ETDatetime, evalTps...) @@ -4934,6 +5014,11 @@ func (b *builtinTimestamp2ArgsSig) evalTime(row chunk.Row) (types.Time, bool, er if err != nil { return types.ZeroTime, true, handleInvalidTimeError(b.ctx, err) } + if tm.Year() == 0 { + // MySQL won't evaluate add for date with zero year. + // See https://github.com/mysql/mysql-server/blob/5.7/sql/item_timefunc.cc#L2805 + return types.ZeroTime, true, nil + } arg1, isNull, err := b.args[1].EvalString(b.ctx, row) if isNull || err != nil { return types.ZeroTime, isNull, err @@ -4975,7 +5060,7 @@ func (c *timestampLiteralFunctionClass) getFunction(ctx sessionctx.Context, args if !timestampPattern.MatchString(str) { return nil, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, str) } - tm, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, str, mysql.TypeTimestamp, types.GetFsp(str)) + tm, err := types.ParseTime(ctx.GetSessionVars().StmtCtx, str, mysql.TypeDatetime, types.GetFsp(str)) if err != nil { return nil, err } @@ -5079,21 +5164,23 @@ func isDuration(str string) bool { } // strDatetimeAddDuration adds duration to datetime string, returns a string value. -func strDatetimeAddDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (string, error) { +func strDatetimeAddDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (result string, isNull bool, err error) { arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp) if err != nil { - return "", err + // Return a warning regardless of the sql_mode, this is compatible with MySQL. + sc.AppendWarning(err) + return "", true, nil } ret, err := arg0.Add(sc, arg1) if err != nil { - return "", err + return "", false, err } fsp := types.MaxFsp if ret.Microsecond() == 0 { fsp = types.MinFsp } ret.SetFsp(fsp) - return ret.String(), nil + return ret.String(), false, nil } // strDurationAddDuration adds duration to duration string, returns a string value. @@ -5114,14 +5201,16 @@ func strDurationAddDuration(sc *stmtctx.StatementContext, d string, arg1 types.D } // strDatetimeSubDuration subtracts duration from datetime string, returns a string value. -func strDatetimeSubDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (string, error) { +func strDatetimeSubDuration(sc *stmtctx.StatementContext, d string, arg1 types.Duration) (result string, isNull bool, err error) { arg0, err := types.ParseTime(sc, d, mysql.TypeDatetime, types.MaxFsp) if err != nil { - return "", err + // Return a warning regardless of the sql_mode, this is compatible with MySQL. + sc.AppendWarning(err) + return "", true, nil } arg1time, err := arg1.ConvertToTime(sc, uint8(types.GetFsp(arg1.String()))) if err != nil { - return "", err + return "", false, err } tmpDuration := arg0.Sub(sc, &arg1time) fsp := types.MaxFsp @@ -5130,10 +5219,10 @@ func strDatetimeSubDuration(sc *stmtctx.StatementContext, d string, arg1 types.D } resultDuration, err := tmpDuration.ConvertToTime(sc, mysql.TypeDatetime) if err != nil { - return "", err + return "", false, err } resultDuration.SetFsp(fsp) - return resultDuration.String(), nil + return resultDuration.String(), false, nil } // strDurationSubDuration subtracts duration from duration string, returns a string value. @@ -5434,8 +5523,8 @@ func (b *builtinAddStringAndDurationSig) evalString(row chunk.Row) (result strin } return result, false, nil } - result, err = strDatetimeAddDuration(sc, arg0, arg1) - return result, err != nil, err + result, isNull, err = strDatetimeAddDuration(sc, arg0, arg1) + return result, isNull, err } type builtinAddStringAndStringSig struct { @@ -5487,8 +5576,8 @@ func (b *builtinAddStringAndStringSig) evalString(row chunk.Row) (result string, } return result, false, nil } - result, err = strDatetimeAddDuration(sc, arg0, arg1) - return result, err != nil, err + result, isNull, err = strDatetimeAddDuration(sc, arg0, arg1) + return result, isNull, err } type builtinAddDateAndDurationSig struct { @@ -5794,10 +5883,8 @@ func (b *builtinMakeTimeSig) makeTime(hour int64, minute int64, second float64, hour = 838 overflow = true } - if hour == -838 || hour == 838 { - if second > 59 { - second = 59 - } + if (hour == -838 || hour == 838) && minute == 59 && second > 59 { + overflow = true } if overflow { minute = 59 @@ -6015,16 +6102,8 @@ func (b *builtinQuarterSig) evalInt(row chunk.Row) (int64, bool, error) { } if date.IsZero() { - // MySQL compatibility, #11203 - // 0 | 0.0 should be converted to 0 value (not null) - n, err := date.ToNumber().ToInt() - isOriginalIntOrDecimalZero := err == nil && n == 0 - // Args like "0000-00-00", "0000-00-00 00:00:00" set Fsp to 6 - isOriginalStringZero := date.Fsp() > 0 - if isOriginalIntOrDecimalZero && !isOriginalStringZero { - return 0, false, nil - } - return 0, true, handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, date.String())) + isNull, err := handleInvalidZeroTime(b.ctx, date) + return 0, isNull, err } return int64((date.Month() + 2) / 3), false, nil @@ -6083,9 +6162,9 @@ func (b *builtinSecToTimeSig) evalDuration(row chunk.Row) (types.Duration, bool, return types.Duration{}, isNull, err } var ( - hour int64 - minute int64 - second int64 + hour uint64 + minute uint64 + second uint64 demical float64 secondDemical float64 negative string @@ -6095,7 +6174,7 @@ func (b *builtinSecToTimeSig) evalDuration(row chunk.Row) (types.Duration, bool, negative = "-" secondsFloat = math.Abs(secondsFloat) } - seconds := int64(secondsFloat) + seconds := uint64(secondsFloat) demical = secondsFloat - float64(seconds) hour = seconds / 3600 @@ -6103,6 +6182,11 @@ func (b *builtinSecToTimeSig) evalDuration(row chunk.Row) (types.Duration, bool, hour = 838 minute = 59 second = 59 + demical = 0 + err = b.ctx.GetSessionVars().StmtCtx.HandleTruncate(errTruncatedWrongValue.GenWithStackByArgs("time", strconv.FormatFloat(secondsFloat, 'f', -1, 64))) + if err != nil { + return types.Duration{}, err != nil, err + } } else { minute = seconds % 3600 / 60 second = seconds % 60 @@ -6312,8 +6396,8 @@ func (b *builtinSubStringAndDurationSig) evalString(row chunk.Row) (result strin } return result, false, nil } - result, err = strDatetimeSubDuration(sc, arg0, arg1) - return result, err != nil, err + result, isNull, err = strDatetimeSubDuration(sc, arg0, arg1) + return result, isNull, err } type builtinSubStringAndStringSig struct { @@ -6365,8 +6449,8 @@ func (b *builtinSubStringAndStringSig) evalString(row chunk.Row) (result string, } return result, false, nil } - result, err = strDatetimeSubDuration(sc, arg0, arg1) - return result, err != nil, err + result, isNull, err = strDatetimeSubDuration(sc, arg0, arg1) + return result, isNull, err } type builtinSubTimeStringNullSig struct { @@ -6674,7 +6758,8 @@ func (b *builtinTimestampAddSig) evalString(row chunk.Row) (string, bool, error) } tm1, err := arg.GoTime(time.Local) if err != nil { - return "", isNull, err + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return "", true, nil } var tb time.Time fsp := types.DefaultFsp @@ -7015,3 +7100,16 @@ func (b *builtinTidbParseTsoSig) evalTime(row chunk.Row) (types.Time, bool, erro } return result, false, nil } + +func handleInvalidZeroTime(ctx sessionctx.Context, t types.Time) (bool, error) { + // MySQL compatibility, #11203 + // 0 | 0.0 should be converted to null without warnings + n, err := t.ToNumber().ToInt() + isOriginalIntOrDecimalZero := err == nil && n == 0 + // Args like "0000-00-00", "0000-00-00 00:00:00" set Fsp to 6 + isOriginalStringZero := t.Fsp() > 0 + if isOriginalIntOrDecimalZero && !isOriginalStringZero { + return false, nil + } + return true, handleInvalidTimeError(ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, t.String())) +} diff --git a/expression/builtin_time_test.go b/expression/builtin_time_test.go index 8725bee7d50d5..5d80735091553 100644 --- a/expression/builtin_time_test.go +++ b/expression/builtin_time_test.go @@ -335,7 +335,8 @@ func (s *testEvaluatorSuite) TestDate(c *C) { } dtblNil = tblToDtbl(tblNil) - s.ctx.GetSessionVars().SetSystemVar("sql_mode", "NO_ZERO_DATE") + err := s.ctx.GetSessionVars().SetSystemVar("sql_mode", "NO_ZERO_DATE") + c.Assert(err, IsNil) for _, t := range dtblNil { fc := funcs[ast.Year] f, err := fc.getFunction(s.ctx, s.datumsToConstants(t["Input"])) @@ -838,7 +839,7 @@ func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { // we canot use a constant value to check timestamp funcs, so here // just to check the fractional seconds part and the time delta. c.Assert(strings.Contains(t.String(), "."), IsFalse) - c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, time.Second) + c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, 3*time.Second) f, err = x.fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(6))) c.Assert(err, IsNil) @@ -848,7 +849,7 @@ func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { c.Assert(err, IsNil) t = v.GetMysqlTime() c.Assert(strings.Contains(t.String(), "."), IsTrue) - c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, time.Second) + c.Assert(ts.Sub(gotime(t, ts.Location())), LessEqual, 3*time.Second) resetStmtContext(s.ctx) f, err = x.fc.getFunction(s.ctx, s.datumsToConstants(types.MakeDatums(8))) @@ -864,8 +865,10 @@ func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { } // Test that "timestamp" and "time_zone" variable may affect the result of Now() builtin function. - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", types.NewDatum("+00:00")) - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", types.NewDatum(1234)) + err := variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", types.NewDatum("+00:00")) + c.Assert(err, IsNil) + err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", types.NewDatum(1234)) + c.Assert(err, IsNil) fc := funcs[ast.Now] resetStmtContext(s.ctx) f, err := fc.getFunction(s.ctx, s.datumsToConstants(nil)) @@ -875,8 +878,10 @@ func (s *testEvaluatorSuite) TestNowAndUTCTimestamp(c *C) { result, err := v.ToString() c.Assert(err, IsNil) c.Assert(result, Equals, "1970-01-01 00:20:34") - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", types.NewDatum(0)) - variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", types.NewDatum("system")) + err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "timestamp", types.NewDatum(0)) + c.Assert(err, IsNil) + err = variable.SetSessionSystemVar(s.ctx.GetSessionVars(), "time_zone", types.NewDatum("system")) + c.Assert(err, IsNil) } func (s *testEvaluatorSuite) TestIsDuration(c *C) { @@ -915,6 +920,8 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {"2017-12-31 23:59:59", "1", "2018-01-01 00:00:00"}, {"2007-12-31 23:59:59.999999", "2 1:1:1.000002", "2008-01-03 01:01:01.000001"}, {"2018-08-16 20:21:01", "00:00:00.000001", "2018-08-16 20:21:01.000001"}, + {"1", "xxcvadfgasd", ""}, + {"xxcvadfgasd", "1", ""}, } fc := funcs[ast.AddTime] for _, t := range tbl { @@ -992,7 +999,10 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { {types.CurrentTime(mysql.TypeTimestamp), "-32073", types.ErrTruncatedWrongVal}, {types.CurrentTime(mysql.TypeDate), "-32073", types.ErrTruncatedWrongVal}, {types.CurrentTime(mysql.TypeDatetime), "-32073", types.ErrTruncatedWrongVal}, + {"1", "xxcvadfgasd", types.ErrTruncatedWrongVal}, + {"xxcvadfgasd", "1", types.ErrTruncatedWrongVal}, } + beforeWarnCnt := int(s.ctx.GetSessionVars().StmtCtx.WarningCount()) for i, t := range tblWarning { tmpInput := types.NewDatum(t.Input) tmpInputDuration := types.NewDatum(t.InputDuration) @@ -1004,7 +1014,7 @@ func (s *testEvaluatorSuite) TestAddTimeSig(c *C) { c.Assert(result, Equals, "") c.Assert(d.IsNull(), Equals, true) warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, i+1) + c.Assert(len(warnings), Equals, i+1+beforeWarnCnt) c.Assert(terror.ErrorEqual(t.warning, warnings[i].Err), IsTrue, Commentf("err %v", warnings[i].Err)) } } @@ -1019,6 +1029,8 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {"110:00:00", "1 02:00:00", "84:00:00"}, {"2017-01-01 01:01:01.11", "01:01:01.11111", "2016-12-31 23:59:59.998890"}, {"2007-12-31 23:59:59.999999", "1 1:1:1.000002", "2007-12-30 22:58:58.999997"}, + {"1", "xxcvadfgasd", ""}, + {"xxcvadfgasd", "1", ""}, } fc := funcs[ast.SubTime] for _, t := range tbl { @@ -1084,7 +1096,10 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { {types.CurrentTime(mysql.TypeTimestamp), "-32073", types.ErrTruncatedWrongVal}, {types.CurrentTime(mysql.TypeDate), "-32073", types.ErrTruncatedWrongVal}, {types.CurrentTime(mysql.TypeDatetime), "-32073", types.ErrTruncatedWrongVal}, + {"1", "xxcvadfgasd", types.ErrTruncatedWrongVal}, + {"xxcvadfgasd", "1", types.ErrTruncatedWrongVal}, } + beforeWarnCnt := int(s.ctx.GetSessionVars().StmtCtx.WarningCount()) for i, t := range tblWarning { tmpInput := types.NewDatum(t.Input) tmpInputDuration := types.NewDatum(t.InputDuration) @@ -1096,7 +1111,7 @@ func (s *testEvaluatorSuite) TestSubTimeSig(c *C) { c.Assert(result, Equals, "") c.Assert(d.IsNull(), Equals, true) warnings := s.ctx.GetSessionVars().StmtCtx.GetWarnings() - c.Assert(len(warnings), Equals, i+1) + c.Assert(len(warnings), Equals, i+1+beforeWarnCnt) c.Assert(terror.ErrorEqual(t.warning, warnings[i].Err), IsTrue, Commentf("err %v", warnings[i].Err)) } } @@ -1109,7 +1124,8 @@ func (s *testEvaluatorSuite) TestSysDate(c *C) { timezones := []types.Datum{types.NewDatum(1234), types.NewDatum(0)} for _, timezone := range timezones { // sysdate() result is not affected by "timestamp" session variable. - variable.SetSessionSystemVar(ctx.GetSessionVars(), "timestamp", timezone) + err := variable.SetSessionSystemVar(ctx.GetSessionVars(), "timestamp", timezone) + c.Assert(err, IsNil) f, err := fc.getFunction(ctx, s.datumsToConstants(nil)) c.Assert(err, IsNil) resetStmtContext(s.ctx) @@ -1401,6 +1417,15 @@ func (s *testEvaluatorSuite) TestStrToDate(c *C) { {"15-01-2001 1:9:8.999", "%d-%m-%Y %H:%i:%S.%f", true, time.Date(2001, 1, 15, 1, 9, 8, 999000000, time.Local)}, {"2003-01-02 10:11:12 PM", "%Y-%m-%d %H:%i:%S %p", false, time.Time{}}, {"10:20:10AM", "%H:%i:%S%p", false, time.Time{}}, + // test %@(skip alpha), %#(skip number), %.(skip punct) + {"2020-10-10ABCD", "%Y-%m-%d%@", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"2020-10-101234", "%Y-%m-%d%#", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"2020-10-10....", "%Y-%m-%d%.", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"2020-10-10.1", "%Y-%m-%d%.%#%@", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"abcd2020-10-10.1", "%@%Y-%m-%d%.%#%@", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"abcd-2020-10-10.1", "%@-%Y-%m-%d%.%#%@", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"2020-10-10", "%Y-%m-%d%@", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, + {"2020-10-10abcde123abcdef", "%Y-%m-%d%@%#", true, time.Date(2020, 10, 10, 0, 0, 0, 0, time.Local)}, } fc := funcs[ast.StrToDate] @@ -1612,8 +1637,8 @@ func (s *testEvaluatorSuite) TestWeekWithoutModeSig(c *C) { }{ {"2008-02-20", 7}, {"2000-12-31", 53}, - {"2000-12-31", 1}, //set default week mode - {"2005-12-3", 48}, //set default week mode + {"2000-12-31", 1}, // set default week mode + {"2005-12-3", 48}, // set default week mode {"2008-02-20", 7}, } @@ -1626,9 +1651,11 @@ func (s *testEvaluatorSuite) TestWeekWithoutModeSig(c *C) { c.Assert(err, IsNil) c.Assert(result.GetInt64(), Equals, test.expect) if i == 1 { - s.ctx.GetSessionVars().SetSystemVar("default_week_format", "6") + err = s.ctx.GetSessionVars().SetSystemVar("default_week_format", "6") + c.Assert(err, IsNil) } else if i == 3 { - s.ctx.GetSessionVars().SetSystemVar("default_week_format", "") + err = s.ctx.GetSessionVars().SetSystemVar("default_week_format", "") + c.Assert(err, IsNil) } } } @@ -1778,9 +1805,9 @@ func (s *testEvaluatorSuite) TestUnixTimestamp(c *C) { {0, types.NewStringDatum("1969-12-31 23:59:59.999999"), types.KindMysqlDecimal, "0"}, // Invalid timestamp {0, types.NewStringDatum("2038-01-19 03:14:08"), types.KindInt64, "0"}, // Invalid timestamp // Below tests irregular inputs. - //{0, types.NewIntDatum(0), types.KindInt64, "0"}, - //{0, types.NewIntDatum(-1), types.KindInt64, "0"}, - //{0, types.NewIntDatum(12345), types.KindInt64, "0"}, + // {0, types.NewIntDatum(0), types.KindInt64, "0"}, + // {0, types.NewIntDatum(-1), types.KindInt64, "0"}, + // {0, types.NewIntDatum(12345), types.KindInt64, "0"}, } for _, test := range tests { @@ -2058,6 +2085,7 @@ func (s *testEvaluatorSuite) TestTimestamp(c *C) { {[]types.Datum{types.NewStringDatum("2017-01-18"), types.NewStringDatum("12:30:59")}, "2017-01-18 12:30:59"}, {[]types.Datum{types.NewStringDatum("2017-01-18 01:01:01"), types.NewStringDatum("12:30:50")}, "2017-01-18 13:31:51"}, {[]types.Datum{types.NewStringDatum("2017-01-18 01:01:01"), types.NewStringDatum("838:59:59")}, "2017-02-22 00:01:00"}, + {[]types.Datum{types.NewStringDatum("0000-01-01"), types.NewStringDatum("1")}, ""}, {[]types.Datum{types.NewDecimalDatum(types.NewDecFromStringForTest("20170118123950.123"))}, "2017-01-18 12:39:50.123"}, {[]types.Datum{types.NewDecimalDatum(types.NewDecFromStringForTest("20170118123950.999"))}, "2017-01-18 12:39:50.999"}, @@ -2155,7 +2183,7 @@ func (s *testEvaluatorSuite) TestMakeTime(c *C) { {[]interface{}{0, 58.4, 0}, "00:58:00"}, {[]interface{}{0, "58.4", 0}, "00:58:00"}, - {[]interface{}{0, 58.5, 1}, "00:59:01"}, + {[]interface{}{0, 58.5, 1}, "00:58:01"}, {[]interface{}{0, "58.5", 1}, "00:58:01"}, {[]interface{}{0, 59.5, 1}, nil}, {[]interface{}{0, "59.5", 1}, "00:59:01"}, @@ -2169,7 +2197,10 @@ func (s *testEvaluatorSuite) TestMakeTime(c *C) { {[]interface{}{0, 0, 0}, "00:00:00"}, {[]interface{}{837, 59, 59.1}, "837:59:59.100000"}, - {[]interface{}{838, 59, 59.1}, "838:59:59.000000"}, + {[]interface{}{838, 0, 59.1}, "838:00:59.100000"}, + {[]interface{}{838, 50, 59.999}, "838:50:59.999000"}, + {[]interface{}{838, 58, 59.1}, "838:58:59.100000"}, + {[]interface{}{838, 58, 59.999}, "838:58:59.999000"}, {[]interface{}{838, 59, 59.1}, "838:59:59.000000"}, {[]interface{}{-838, 59, 59.1}, "-838:59:59.000000"}, {[]interface{}{1000, 1, 1}, "838:59:59"}, {[]interface{}{-1000, 1, 1.23}, "-838:59:59.000000"}, @@ -2410,6 +2441,7 @@ func (s *testEvaluatorSuite) TestTimestampAdd(c *C) { {"MINUTE", 1, "2003-01-02", "2003-01-02 00:01:00"}, {"WEEK", 1, "2003-01-02 23:59:59", "2003-01-09 23:59:59"}, {"MICROSECOND", 1, 950501, "1995-05-01 00:00:00.000001"}, + {"DAY", 28768, 0, ""}, } fc := funcs[ast.TimestampAdd] diff --git a/expression/builtin_time_vec.go b/expression/builtin_time_vec.go index cf91b12b7835e..94c1cd8b6f0c4 100644 --- a/expression/builtin_time_vec.go +++ b/expression/builtin_time_vec.go @@ -50,10 +50,11 @@ func (b *builtinMonthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) e } if ds[i].IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, ds[i].String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = 0 @@ -89,10 +90,11 @@ func (b *builtinYearSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) er } if ds[i].IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, ds[i].String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = 0 @@ -203,11 +205,12 @@ func (b *builtinSysDateWithoutFspSig) vecEvalTime(input *chunk.Chunk, result *ch return nil } -func (b *builtinExtractDatetimeSig) vectorized() bool { - return true +func (b *builtinExtractDatetimeFromStringSig) vectorized() bool { + // TODO: to fix https://github.com/pingcap/tidb/issues/9716 in vectorized evaluation. + return false } -func (b *builtinExtractDatetimeSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { +func (b *builtinExtractDatetimeFromStringSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() buf, err := b.bufAllocator.get(types.ETString, n) if err != nil { @@ -235,6 +238,17 @@ func (b *builtinExtractDatetimeSig) vecEvalInt(input *chunk.Chunk, result *chunk if result.IsNull(i) { continue } + if ds[i].IsZero() { + i64s[i] = 0 + if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { + return err + } + result.SetNull(i, isNull) + } + continue + } res, err := types.ExtractDatetimeNum(&ds[i], buf.GetString(i)) if err != nil { return err @@ -923,10 +937,11 @@ func (b *builtinQuarterSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) } date := ds[i] if date.IsZero() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, date.String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = int64((date.Month() + 2) / 3) @@ -986,6 +1001,47 @@ func (b *builtinWeekWithModeSig) vecEvalInt(input *chunk.Chunk, result *chunk.Co return nil } +func (b *builtinExtractDatetimeSig) vectorized() bool { + return true +} + +func (b *builtinExtractDatetimeSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { + n := input.NumRows() + unit, err := b.bufAllocator.get(types.ETString, n) + if err != nil { + return err + } + defer b.bufAllocator.put(unit) + if err := b.args[0].VecEvalString(b.ctx, input, unit); err != nil { + return err + } + dt, err := b.bufAllocator.get(types.ETDatetime, n) + if err != nil { + return err + } + defer b.bufAllocator.put(dt) + if err = b.args[1].VecEvalTime(b.ctx, input, dt); err != nil { + return err + } + result.ResizeInt64(n, false) + result.MergeNulls(unit, dt) + i64s := result.Int64s() + tmIs := dt.Times() + var t types.Time + for i := 0; i < n; i++ { + if result.IsNull(i) { + continue + } + unitI := unit.GetString(i) + t = tmIs[i] + i64s[i], err = types.ExtractDatetimeNum(&t, unitI) + if err != nil { + return err + } + } + return nil +} + func (b *builtinExtractDurationSig) vectorized() bool { return true } @@ -1654,7 +1710,9 @@ func (b *builtinTimestampAddSig) vecEvalString(input *chunk.Chunk, result *chunk tm1, err := arg.GoTime(time.Local) if err != nil { - return err + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + result.AppendNull() + continue } var tb time.Time fsp := types.DefaultFsp @@ -1858,14 +1916,19 @@ func (b *builtinSecToTimeSig) vecEvalDuration(input *chunk.Chunk, result *chunk. negative = "-" secondsFloat = math.Abs(secondsFloat) } - seconds := int64(secondsFloat) + seconds := uint64(secondsFloat) demical := secondsFloat - float64(seconds) - var minute, second int64 + var minute, second uint64 hour := seconds / 3600 if hour > 838 { hour = 838 minute = 59 second = 59 + demical = 0 + err = b.ctx.GetSessionVars().StmtCtx.HandleTruncate(errTruncatedWrongValue.GenWithStackByArgs("time", strconv.FormatFloat(secondsFloat, 'f', -1, 64))) + if err != nil { + return err + } } else { minute = seconds % 3600 / 60 second = seconds % 60 @@ -2068,10 +2131,11 @@ func (b *builtinDayOfYearSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum continue } if ds[i].InvalidZero() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, ds[i].String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = int64(ds[i].YearDay()) @@ -2452,10 +2516,11 @@ func (b *builtinDayOfWeekSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colum continue } if ds[i].InvalidZero() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, ds[i].String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = int64(ds[i].Weekday() + 1) @@ -2656,6 +2721,12 @@ func (b *builtinTimestamp2ArgsSig) vecEvalTime(input *chunk.Chunk, result *chunk result.SetNull(i, true) continue } + if tm.Year() == 0 { + // MySQL won't evaluate add for date with zero year. + // See https://github.com/mysql/mysql-server/blob/5.7/sql/item_timefunc.cc#L2805 + result.SetNull(i, true) + continue + } if !isDuration(arg1) { result.SetNull(i, true) @@ -2703,10 +2774,11 @@ func (b *builtinDayOfMonthSig) vecEvalInt(input *chunk.Chunk, result *chunk.Colu } if ds[i].IsZero() { if b.ctx.GetSessionVars().SQLMode.HasNoZeroDateMode() { - if err := handleInvalidTimeError(b.ctx, types.ErrWrongValue.GenWithStackByArgs(types.DateTimeStr, ds[i].String())); err != nil { + isNull, err := handleInvalidZeroTime(b.ctx, ds[i]) + if err != nil { return err } - result.SetNull(i, true) + result.SetNull(i, isNull) continue } i64s[i] = 0 diff --git a/expression/builtin_time_vec_generated.go b/expression/builtin_time_vec_generated.go index f9f5292597818..d440aaa1a01ad 100644 --- a/expression/builtin_time_vec_generated.go +++ b/expression/builtin_time_vec_generated.go @@ -318,6 +318,7 @@ func (b *builtinAddStringAndDurationSig) vecEvalString(input *chunk.Chunk, resul fsp1 := int8(b.args[1].GetType().Decimal) arg1Duration := types.Duration{Duration: arg1, Fsp: fsp1} var output string + var isNull bool if isDuration(arg0) { output, err = strDurationAddDuration(sc, arg0, arg1Duration) @@ -332,11 +333,16 @@ func (b *builtinAddStringAndDurationSig) vecEvalString(input *chunk.Chunk, resul } } else { - output, err = strDatetimeAddDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeAddDuration(sc, arg0, arg1Duration) if err != nil { return err } + if isNull { + sc.AppendWarning(err) + result.AppendNull() // fixed: false + continue + } } // commit result @@ -410,6 +416,7 @@ func (b *builtinAddStringAndStringSig) vecEvalString(input *chunk.Chunk, result } var output string + var isNull bool if isDuration(arg0) { output, err = strDurationAddDuration(sc, arg0, arg1Duration) @@ -424,11 +431,16 @@ func (b *builtinAddStringAndStringSig) vecEvalString(input *chunk.Chunk, result } } else { - output, err = strDatetimeAddDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeAddDuration(sc, arg0, arg1Duration) if err != nil { return err } + if isNull { + sc.AppendWarning(err) + result.AppendNull() // fixed: false + continue + } } // commit result @@ -930,6 +942,7 @@ func (b *builtinSubStringAndDurationSig) vecEvalString(input *chunk.Chunk, resul fsp1 := int8(b.args[1].GetType().Decimal) arg1Duration := types.Duration{Duration: arg1, Fsp: fsp1} var output string + var isNull bool if isDuration(arg0) { output, err = strDurationSubDuration(sc, arg0, arg1Duration) @@ -944,11 +957,16 @@ func (b *builtinSubStringAndDurationSig) vecEvalString(input *chunk.Chunk, resul } } else { - output, err = strDatetimeSubDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeSubDuration(sc, arg0, arg1Duration) if err != nil { return err } + if isNull { + sc.AppendWarning(err) + result.AppendNull() // fixed: false + continue + } } // commit result @@ -1022,6 +1040,7 @@ func (b *builtinSubStringAndStringSig) vecEvalString(input *chunk.Chunk, result } var output string + var isNull bool if isDuration(arg0) { output, err = strDurationSubDuration(sc, arg0, arg1Duration) @@ -1036,11 +1055,16 @@ func (b *builtinSubStringAndStringSig) vecEvalString(input *chunk.Chunk, result } } else { - output, err = strDatetimeSubDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeSubDuration(sc, arg0, arg1Duration) if err != nil { return err } + if isNull { + sc.AppendWarning(err) + result.AppendNull() // fixed: false + continue + } } // commit result diff --git a/expression/builtin_time_vec_test.go b/expression/builtin_time_vec_test.go index 706caba69e824..5cb99af440060 100644 --- a/expression/builtin_time_vec_test.go +++ b/expression/builtin_time_vec_test.go @@ -68,10 +68,6 @@ type dateTimeUnitStrGener struct { randGen *defaultRandGen } -func newDateTimeUnitStrGener() *dateTimeUnitStrGener { - return &dateTimeUnitStrGener{newDefaultRandGen()} -} - // tzStrGener is used to generate strings which are timezones type tzStrGener struct{} @@ -205,13 +201,13 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ }, // This test case may fail due to the issue: https://github.com/pingcap/tidb/issues/13638. // We remove this case to stabilize CI, and will reopen this when we fix the issue above. - //ast.TimestampAdd: { - // { - // retEvalType: types.ETString, - // childrenTypes: []types.EvalType{types.ETString, types.ETInt, types.ETDatetime}, - // geners: []dataGenerator{&unitStrGener{newDefaultRandGen()}, nil, nil}, - // }, - //}, + // ast.TimestampAdd: { + // { + // retEvalType: types.ETString, + // childrenTypes: []types.EvalType{types.ETString, types.ETInt, types.ETDatetime}, + // geners: []dataGenerator{&unitStrGener{newDefaultRandGen()}, nil, nil}, + // }, + // }, ast.UnixTimestamp: { { retEvalType: types.ETInt, @@ -240,8 +236,150 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ constants: []*Constant{{Value: types.NewStringDatum("2019-12-04 00:00:00"), RetType: types.NewFieldType(mysql.TypeString)}}, }, }, - ast.SubDate: {}, - ast.AddDate: {}, + ast.SubDate: { + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + &numStrGener{rangeInt64Gener{math.MinInt32 + 1, math.MaxInt32, newDefaultRandGen()}}, + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETInt, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + newDefaultGener(0.2, types.ETInt), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETReal, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + newDefaultGener(0.2, types.ETReal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETString, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + &numStrGener{rangeInt64Gener{math.MinInt32 + 1, math.MaxInt32, newDefaultRandGen()}}, + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETInt, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + newDefaultGener(0.2, types.ETInt), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETReal, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + newDefaultGener(0.2, types.ETReal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETDecimal, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + newDefaultGener(0.2, types.ETDecimal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + }, + ast.AddDate: { + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETString, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + &numStrGener{rangeInt64Gener{math.MinInt32 + 1, math.MaxInt32, newDefaultRandGen()}}, + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETInt, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + newDefaultGener(0.2, types.ETInt), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETReal, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + newDefaultGener(0.2, types.ETReal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETString, types.ETDecimal, types.ETString}, + geners: []dataGenerator{ + &dateStrGener{NullRation: 0.2, randGen: newDefaultRandGen()}, + newDefaultGener(0.2, types.ETDecimal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETString, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + &numStrGener{rangeInt64Gener{math.MinInt32 + 1, math.MaxInt32, newDefaultRandGen()}}, + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETInt, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + newDefaultGener(0.2, types.ETInt), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + { + retEvalType: types.ETDatetime, + childrenTypes: []types.EvalType{types.ETInt, types.ETReal, types.ETString}, + geners: []dataGenerator{ + &dateTimeIntGener{dateTimeGener: dateTimeGener{randGen: newDefaultRandGen()}, nullRation: 0.2}, + newDefaultGener(0.2, types.ETReal), + }, + constants: []*Constant{nil, nil, {Value: types.NewStringDatum("MICROSECOND"), RetType: types.NewFieldType(mysql.TypeString)}}, + chunkSize: 128, + }, + }, ast.SubTime: { { retEvalType: types.ETString, @@ -406,6 +544,7 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ ast.LastDay: { {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime}}, }, + /* TODO: to fix https://github.com/pingcap/tidb/issues/9716 in vectorized evaluation. ast.Extract: { {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString, types.ETDatetime}, geners: []dataGenerator{newDateTimeUnitStrGener(), nil}}, {retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETString, types.ETDuration}, @@ -439,6 +578,7 @@ var vecBuiltinTimeCases = map[string][]vecExprBenchCase{ constants: []*Constant{{Value: types.NewStringDatum("HOUR_MINUTE"), RetType: types.NewFieldType(mysql.TypeString)}}, }, }, + */ ast.ConvertTz: { {retEvalType: types.ETDatetime, childrenTypes: []types.EvalType{types.ETDatetime, types.ETString, types.ETString}, geners: []dataGenerator{nil, newNullWrappedGener(0.2, &tzStrGener{}), newNullWrappedGener(0.2, &tzStrGener{})}}, @@ -474,9 +614,9 @@ func (s *testEvaluatorSuite) TestVecMonth(c *C) { f, _, _, result := genVecBuiltinFuncBenchCase(ctx, ast.Month, vecExprBenchCase{retEvalType: types.ETInt, childrenTypes: []types.EvalType{types.ETDatetime}}) c.Assert(ctx.GetSessionVars().StrictSQLMode, IsTrue) c.Assert(f.vecEvalInt(input, result), IsNil) - c.Assert(len(ctx.GetSessionVars().StmtCtx.GetWarnings()), Equals, 2) + c.Assert(len(ctx.GetSessionVars().StmtCtx.GetWarnings()), Equals, 0) ctx.GetSessionVars().StmtCtx.InInsertStmt = true ctx.GetSessionVars().StmtCtx.TruncateAsWarning = false - c.Assert(f.vecEvalInt(input, result), NotNil) + c.Assert(f.vecEvalInt(input, result), IsNil) } diff --git a/expression/collation.go b/expression/collation.go index d8bae9f8c45c3..3d187143fe000 100644 --- a/expression/collation.go +++ b/expression/collation.go @@ -16,6 +16,7 @@ package expression import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/logutil" @@ -90,7 +91,7 @@ const ( CoercibilityExplicit Coercibility = 0 // CoercibilityNone is derived from the concatenation of two strings with different collations. CoercibilityNone Coercibility = 1 - // CoercibilityImplicit is derived from a column or a stored routine parameter or local variable. + // CoercibilityImplicit is derived from a column or a stored routine parameter or local variable or cast() function. CoercibilityImplicit Coercibility = 2 // CoercibilitySysconst is derived from a “system constant” (the string returned by functions such as USER() or VERSION()). CoercibilitySysconst Coercibility = 3 @@ -177,6 +178,10 @@ func deriveCoercibilityForConstant(c *Constant) Coercibility { } func deriveCoercibilityForColumn(c *Column) Coercibility { + // For specified type null, it should return CoercibilityIgnorable, which means it got the lowest priority in DeriveCollationFromExprs. + if c.RetType.Tp == mysql.TypeNull { + return CoercibilityIgnorable + } if c.RetType.EvalType() != types.ETString { return CoercibilityNumeric } diff --git a/expression/column.go b/expression/column.go index 1306982c3c8bb..006b9a3867cda 100644 --- a/expression/column.go +++ b/expression/column.go @@ -201,6 +201,13 @@ type Column struct { OrigName string IsHidden bool + // IsPrefix indicates whether this column is a prefix column in index. + // + // for example: + // pk(col1, col2), index(col1(10)), key: col1(10)_col1_col2 => index's col1 will be true + // pk(col1(10), col2), index(col1), key: col1_col1(10)_col2 => pk's col1 will be true + IsPrefix bool + // InOperand indicates whether this column is the inner operand of column equal condition converted // from `[not] in (subq)`. InOperand bool @@ -257,13 +264,12 @@ func (col *Column) VecEvalReal(ctx sessionctx.Context, input *chunk.Chunk, resul } return nil } + result.MergeNulls(src) for i := range f32s { - // TODO(zhangyuanjia): speed up the way to manipulate null-bitmaps. - if src.IsNull(i) { - result.SetNull(i, true) - } else { - f64s[i] = float64(f32s[i]) + if result.IsNull(i) { + continue } + f64s[i] = float64(f32s[i]) } return nil } @@ -509,6 +515,11 @@ func ColInfo2Col(cols []*Column, col *model.ColumnInfo) *Column { func indexCol2Col(colInfos []*model.ColumnInfo, cols []*Column, col *model.IndexColumn) *Column { for i, info := range colInfos { if info.Name.L == col.Name.L { + if col.Length > 0 && info.FieldType.Flen > col.Length { + c := *cols[i] + c.IsPrefix = true + return &c + } return cols[i] } } diff --git a/expression/constant.go b/expression/constant.go index d8c61a8d4523b..f7fd64eebf3e9 100644 --- a/expression/constant.go +++ b/expression/constant.go @@ -28,17 +28,21 @@ import ( // NewOne stands for a number 1. func NewOne() *Constant { + retT := types.NewFieldType(mysql.TypeTiny) + retT.Flag |= mysql.UnsignedFlag // shrink range to avoid integral promotion return &Constant{ Value: types.NewDatum(1), - RetType: types.NewFieldType(mysql.TypeTiny), + RetType: retT, } } // NewZero stands for a number 0. func NewZero() *Constant { + retT := types.NewFieldType(mysql.TypeTiny) + retT.Flag |= mysql.UnsignedFlag // shrink range to avoid integral promotion return &Constant{ Value: types.NewDatum(0), - RetType: types.NewFieldType(mysql.TypeTiny), + RetType: retT, } } diff --git a/expression/constant_fold.go b/expression/constant_fold.go index 1b4dcaf00c3ad..c698d4a0a9536 100644 --- a/expression/constant_fold.go +++ b/expression/constant_fold.go @@ -16,6 +16,7 @@ package expression import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -122,7 +123,7 @@ func caseWhenHandler(expr *ScalarFunction) (Expression, bool) { foldedExpr.GetType().Decimal = expr.GetType().Decimal return foldedExpr, isDeferredConst } - return BuildCastFunction(expr.GetCtx(), foldedExpr, foldedExpr.GetType()), isDeferredConst + return foldedExpr, isDeferredConst } } else { // for no-const, here should return directly, because the following branches are unknown to be run or not @@ -191,28 +192,40 @@ func foldConstant(expr Expression) (Expression, bool) { return expr, isDeferredConst } if value.IsNull() { - if isDeferredConst { - return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x}, true - } + // This Constant is created to compose the result expression of EvaluateExprWithNull when InNullRejectCheck + // is true. We just check whether the result expression is null or false and then let it die. Basically, + // the constant is used once briefly and will not be retained for a long time. Hence setting DeferredExpr + // of Constant to nil is ok. return &Constant{Value: value, RetType: x.RetType}, false } if isTrue, err := value.ToBool(sc); err == nil && isTrue == 0 { - if isDeferredConst { - return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x}, true - } + // This Constant is created to compose the result expression of EvaluateExprWithNull when InNullRejectCheck + // is true. We just check whether the result expression is null or false and then let it die. Basically, + // the constant is used once briefly and will not be retained for a long time. Hence setting DeferredExpr + // of Constant to nil is ok. return &Constant{Value: value, RetType: x.RetType}, false } return expr, isDeferredConst } value, err := x.Eval(chunk.Row{}) + retType := x.RetType.Clone() + if !hasNullArg { + // set right not null flag for constant value + switch value.Kind() { + case types.KindNull: + retType.Flag &= ^mysql.NotNullFlag + default: + retType.Flag |= mysql.NotNullFlag + } + } if err != nil { logutil.BgLogger().Debug("fold expression to constant", zap.String("expression", x.ExplainInfo()), zap.Error(err)) return expr, isDeferredConst } if isDeferredConst { - return &Constant{Value: value, RetType: x.RetType, DeferredExpr: x}, true + return &Constant{Value: value, RetType: retType, DeferredExpr: x}, true } - return &Constant{Value: value, RetType: x.RetType}, false + return &Constant{Value: value, RetType: retType}, false case *Constant: if x.ParamMarker != nil { return &Constant{ diff --git a/expression/constant_propagation.go b/expression/constant_propagation.go index f236ad722b3d0..f5e8bca8a30fd 100644 --- a/expression/constant_propagation.go +++ b/expression/constant_propagation.go @@ -20,7 +20,6 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/disjointset" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" @@ -88,7 +87,7 @@ func validEqualCondHelper(ctx sessionctx.Context, eq *ScalarFunction, colIsLeft if ContainMutableConst(ctx, []Expression{con}) { return nil, nil } - if !collate.CompatibleCollate(col.GetType().Collate, con.GetType().Collate) { + if col.GetType().Collate != con.GetType().Collate { return nil, nil } return col, con @@ -119,7 +118,10 @@ func validEqualCond(ctx sessionctx.Context, cond Expression) (*Column, *Constant // for 'a, b, a < 3', it returns 'true, false, b < 3' // for 'a, b, sin(a) + cos(a) = 5', it returns 'true, false, returns sin(b) + cos(b) = 5' // for 'a, b, cast(a) < rand()', it returns 'false, true, cast(a) < rand()' -func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Expression, rejectControl bool) (bool, bool, Expression) { +func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Expression, nullAware bool) (bool, bool, Expression) { + if src.RetType.Tp != tgt.RetType.Tp { + return false, false, cond + } sf, ok := cond.(*ScalarFunction) if !ok { return false, false, cond @@ -132,11 +134,18 @@ func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Exp if _, ok := inequalFunctions[sf.FuncName.L]; ok { return false, true, cond } - // See https://github.com/pingcap/tidb/issues/15782. The control function's result may rely on the original nullable - // information of the outer side column. Its args cannot be replaced easily. + // See + // https://github.com/pingcap/tidb/issues/15782 + // https://github.com/pingcap/tidb/issues/17817 + // The null sensitive function's result may rely on the original nullable information of the outer side column. + // Its args cannot be replaced easily. // A more strict check is that after we replace the arg. We check the nullability of the new expression. // But we haven't maintained it yet, so don't replace the arg of the control function currently. - if rejectControl && (sf.FuncName.L == ast.Ifnull || sf.FuncName.L == ast.If || sf.FuncName.L == ast.Case) { + if nullAware && + (sf.FuncName.L == ast.Ifnull || + sf.FuncName.L == ast.If || + sf.FuncName.L == ast.Case || + sf.FuncName.L == ast.NullEQ) { return false, false, cond } for idx, expr := range sf.GetArgs() { @@ -152,7 +161,7 @@ func tryToReplaceCond(ctx sessionctx.Context, src *Column, tgt *Column, cond Exp } args[idx] = tgt } else { - subReplaced, isNonDeterministic, subExpr := tryToReplaceCond(ctx, src, tgt, expr, rejectControl) + subReplaced, isNonDeterministic, subExpr := tryToReplaceCond(ctx, src, tgt, expr, nullAware) if isNonDeterministic { return false, true, cond } else if subReplaced { diff --git a/expression/constant_test.go b/expression/constant_test.go index e79ead10037e1..b0d6abbb5f3c6 100644 --- a/expression/constant_test.go +++ b/expression/constant_test.go @@ -50,23 +50,6 @@ func newLonglong(value int64) *Constant { } } -func newDate(year, month, day int) *Constant { - return newTimeConst(year, month, day, 0, 0, 0, mysql.TypeDate) -} - -func newTimestamp(yy, mm, dd, hh, min, ss int) *Constant { - return newTimeConst(yy, mm, dd, hh, min, ss, mysql.TypeTimestamp) -} - -func newTimeConst(yy, mm, dd, hh, min, ss int, tp uint8) *Constant { - var tmp types.Datum - tmp.SetMysqlTime(types.NewTime(types.FromDate(yy, mm, dd, 0, 0, 0, 0), tp, types.DefaultFsp)) - return &Constant{ - Value: tmp, - RetType: types.NewFieldType(tp), - } -} - func newFunction(funcName string, args ...Expression) Expression { typeLong := types.NewFieldType(mysql.TypeLonglong) return NewFunctionInternal(mock.NewContext(), funcName, typeLong, args...) @@ -234,33 +217,6 @@ func (*testExpressionSuite) TestConstantFolding(c *C) { } } -func (*testExpressionSuite) TestDeferredExprNullConstantFold(c *C) { - nullConst := &Constant{ - Value: types.NewDatum(nil), - RetType: types.NewFieldType(mysql.TypeTiny), - DeferredExpr: NewNull(), - } - tests := []struct { - condition Expression - deferred string - }{ - { - condition: newFunction(ast.LT, newColumn(0), nullConst), - deferred: "lt(Column#0, )", - }, - } - for _, tt := range tests { - comment := Commentf("different for expr %s", tt.condition) - sf, ok := tt.condition.(*ScalarFunction) - c.Assert(ok, IsTrue, comment) - sf.GetCtx().GetSessionVars().StmtCtx.InNullRejectCheck = true - newConds := FoldConstant(tt.condition) - newConst, ok := newConds.(*Constant) - c.Assert(ok, IsTrue, comment) - c.Assert(newConst.DeferredExpr.String(), Equals, tt.deferred, comment) - } -} - func (*testExpressionSuite) TestDeferredParamNotNull(c *C) { ctx := mock.NewContext() testTime := time.Now() diff --git a/expression/distsql_builtin.go b/expression/distsql_builtin.go index a5e707cadf29e..6b3446273a666 100644 --- a/expression/distsql_builtin.go +++ b/expression/distsql_builtin.go @@ -372,7 +372,7 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinLog2Sig{base} case tipb.ScalarFuncSig_Log10: f = &builtinLog10Sig{base} - //case tipb.ScalarFuncSig_Rand: + // case tipb.ScalarFuncSig_Rand: case tipb.ScalarFuncSig_RandWithSeedFirstGen: f = &builtinRandWithSeedFirstGenSig{base} case tipb.ScalarFuncSig_Pow: @@ -445,7 +445,7 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinTimeIsNullSig{base} case tipb.ScalarFuncSig_IntIsNull: f = &builtinIntIsNullSig{base} - //case tipb.ScalarFuncSig_JsonIsNull: + // case tipb.ScalarFuncSig_JsonIsNull: case tipb.ScalarFuncSig_BitAndSig: f = &builtinBitAndSig{base} case tipb.ScalarFuncSig_BitOrSig: @@ -487,24 +487,24 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti case tipb.ScalarFuncSig_GetParamString: f = &builtinGetParamStringSig{base} case tipb.ScalarFuncSig_GetVar: - f = &builtinGetVarSig{base} - //case tipb.ScalarFuncSig_RowSig: + f = &builtinGetStringVarSig{base} + // case tipb.ScalarFuncSig_RowSig: case tipb.ScalarFuncSig_SetVar: - f = &builtinSetVarSig{base} - //case tipb.ScalarFuncSig_ValuesDecimal: - // f = &builtinValuesDecimalSig{base} - //case tipb.ScalarFuncSig_ValuesDuration: - // f = &builtinValuesDurationSig{base} - //case tipb.ScalarFuncSig_ValuesInt: - // f = &builtinValuesIntSig{base} - //case tipb.ScalarFuncSig_ValuesJSON: - // f = &builtinValuesJSONSig{base} - //case tipb.ScalarFuncSig_ValuesReal: - // f = &builtinValuesRealSig{base} - //case tipb.ScalarFuncSig_ValuesString: - // f = &builtinValuesStringSig{base} - //case tipb.ScalarFuncSig_ValuesTime: - // f = &builtinValuesTimeSig{base} + f = &builtinSetStringVarSig{base} + // case tipb.ScalarFuncSig_ValuesDecimal: + // f = &builtinValuesDecimalSig{base} + // case tipb.ScalarFuncSig_ValuesDuration: + // f = &builtinValuesDurationSig{base} + // case tipb.ScalarFuncSig_ValuesInt: + // f = &builtinValuesIntSig{base} + // case tipb.ScalarFuncSig_ValuesJSON: + // f = &builtinValuesJSONSig{base} + // case tipb.ScalarFuncSig_ValuesReal: + // f = &builtinValuesRealSig{base} + // case tipb.ScalarFuncSig_ValuesString: + // f = &builtinValuesStringSig{base} + // case tipb.ScalarFuncSig_ValuesTime: + // f = &builtinValuesTimeSig{base} case tipb.ScalarFuncSig_InInt: f = &builtinInIntSig{baseInSig: baseInSig{baseBuiltinFunc: base}} case tipb.ScalarFuncSig_InReal: @@ -561,10 +561,10 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinCaseWhenDurationSig{base} case tipb.ScalarFuncSig_CaseWhenJson: f = &builtinCaseWhenJSONSig{base} - //case tipb.ScalarFuncSig_AesDecrypt: - // f = &builtinAesDecryptSig{base} - //case tipb.ScalarFuncSig_AesEncrypt: - // f = &builtinAesEncryptSig{base} + // case tipb.ScalarFuncSig_AesDecrypt: + // f = &builtinAesDecryptSig{base} + // case tipb.ScalarFuncSig_AesEncrypt: + // f = &builtinAesEncryptSig{base} case tipb.ScalarFuncSig_Compress: f = &builtinCompressSig{base} case tipb.ScalarFuncSig_MD5: @@ -641,10 +641,10 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinUUIDSig{base} case tipb.ScalarFuncSig_LikeSig: f = &builtinLikeSig{base, nil, false, sync.Once{}} - //case tipb.ScalarFuncSig_RegexpSig: - // f = &builtinRegexpSig{base} - //case tipb.ScalarFuncSig_RegexpUTF8Sig: - // f = &builtinRegexpUTF8Sig{base} + // case tipb.ScalarFuncSig_RegexpSig: + // f = &builtinRegexpSig{base} + // case tipb.ScalarFuncSig_RegexpUTF8Sig: + // f = &builtinRegexpUTF8Sig{base} case tipb.ScalarFuncSig_JsonExtractSig: f = &builtinJSONExtractSig{base} case tipb.ScalarFuncSig_JsonUnquoteSig: @@ -673,12 +673,12 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinJSONArrayAppendSig{base} case tipb.ScalarFuncSig_JsonArrayInsertSig: f = &builtinJSONArrayInsertSig{base} - //case tipb.ScalarFuncSig_JsonMergePatchSig: + // case tipb.ScalarFuncSig_JsonMergePatchSig: case tipb.ScalarFuncSig_JsonMergePreserveSig: f = &builtinJSONMergeSig{base} case tipb.ScalarFuncSig_JsonContainsPathSig: f = &builtinJSONContainsPathSig{base} - //case tipb.ScalarFuncSig_JsonPrettySig: + // case tipb.ScalarFuncSig_JsonPrettySig: case tipb.ScalarFuncSig_JsonQuoteSig: f = &builtinJSONQuoteSig{base} case tipb.ScalarFuncSig_JsonSearchSig: @@ -699,8 +699,8 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinJSONValidOthersSig{base} case tipb.ScalarFuncSig_DateFormatSig: f = &builtinDateFormatSig{base} - //case tipb.ScalarFuncSig_DateLiteral: - // f = &builtinDateLiteralSig{base} + // case tipb.ScalarFuncSig_DateLiteral: + // f = &builtinDateLiteralSig{base} case tipb.ScalarFuncSig_DateDiff: f = &builtinDateDiffSig{base} case tipb.ScalarFuncSig_NullTimeDiff: @@ -773,8 +773,8 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinCurrentTime1ArgSig{base} case tipb.ScalarFuncSig_Time: f = &builtinTimeSig{base} - //case tipb.ScalarFuncSig_TimeLiteral: - // f = &builtinTimeLiteralSig{base} + // case tipb.ScalarFuncSig_TimeLiteral: + // f = &builtinTimeLiteralSig{base} case tipb.ScalarFuncSig_UTCDate: f = &builtinUTCDateSig{base} case tipb.ScalarFuncSig_UTCTimestampWithArg: @@ -831,8 +831,8 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinUnixTimestampIntSig{base} case tipb.ScalarFuncSig_UnixTimestampDec: f = &builtinUnixTimestampDecSig{base} - //case tipb.ScalarFuncSig_ConvertTz: - // f = &builtinConvertTzSig{base} + // case tipb.ScalarFuncSig_ConvertTz: + // f = &builtinConvertTzSig{base} case tipb.ScalarFuncSig_MakeDate: f = &builtinMakeDateSig{base} case tipb.ScalarFuncSig_MakeTime: @@ -857,12 +857,12 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinUTCTimeWithArgSig{base} case tipb.ScalarFuncSig_UTCTimeWithoutArg: f = &builtinUTCTimeWithoutArgSig{base} - //case tipb.ScalarFuncSig_Timestamp1Arg: - // f = &builtinTimestamp1ArgSig{base} - //case tipb.ScalarFuncSig_Timestamp2Args: - // f = &builtinTimestamp2ArgsSig{base} - //case tipb.ScalarFuncSig_TimestampLiteral: - // f = &builtinTimestampLiteralSig{base} + // case tipb.ScalarFuncSig_Timestamp1Arg: + // f = &builtinTimestamp1ArgSig{base} + // case tipb.ScalarFuncSig_Timestamp2Args: + // f = &builtinTimestamp2ArgsSig{base} + // case tipb.ScalarFuncSig_TimestampLiteral: + // f = &builtinTimestampLiteralSig{base} case tipb.ScalarFuncSig_LastDay: f = &builtinLastDaySig{base} case tipb.ScalarFuncSig_StrToDateDate: @@ -875,38 +875,40 @@ func getSignatureByPB(ctx sessionctx.Context, sigCode tipb.ScalarFuncSig, tp *ti f = &builtinFromUnixTime1ArgSig{base} case tipb.ScalarFuncSig_FromUnixTime2Arg: f = &builtinFromUnixTime2ArgSig{base} + case tipb.ScalarFuncSig_ExtractDatetimeFromString: + f = &builtinExtractDatetimeFromStringSig{base} case tipb.ScalarFuncSig_ExtractDatetime: f = &builtinExtractDatetimeSig{base} case tipb.ScalarFuncSig_ExtractDuration: f = &builtinExtractDurationSig{base} - //case tipb.ScalarFuncSig_AddDateStringString: - // f = &builtinAddDateStringStringSig{base} - //case tipb.ScalarFuncSig_AddDateStringInt: - // f = &builtinAddDateStringIntSig{base} - //case tipb.ScalarFuncSig_AddDateStringDecimal: - // f = &builtinAddDateStringDecimalSig{base} - //case tipb.ScalarFuncSig_AddDateIntString: - // f = &builtinAddDateIntStringSig{base} - //case tipb.ScalarFuncSig_AddDateIntInt: - // f = &builtinAddDateIntIntSig{base} - //case tipb.ScalarFuncSig_AddDateDatetimeString: - // f = &builtinAddDateDatetimeStringSig{base} - //case tipb.ScalarFuncSig_AddDateDatetimeInt: - // f = &builtinAddDateDatetimeIntSig{base} - //case tipb.ScalarFuncSig_SubDateStringString: - // f = &builtinSubDateStringStringSig{base} - //case tipb.ScalarFuncSig_SubDateStringInt: - // f = &builtinSubDateStringIntSig{base} - //case tipb.ScalarFuncSig_SubDateStringDecimal: - // f = &builtinSubDateStringDecimalSig{base} - //case tipb.ScalarFuncSig_SubDateIntString: - // f = &builtinSubDateIntStringSig{base} - //case tipb.ScalarFuncSig_SubDateIntInt: - // f = &builtinSubDateIntIntSig{base} - //case tipb.ScalarFuncSig_SubDateDatetimeString: - // f = &builtinSubDateDatetimeStringSig{base} - //case tipb.ScalarFuncSig_SubDateDatetimeInt: - // f = &builtinSubDateDatetimeIntSig{base} + // case tipb.ScalarFuncSig_AddDateStringString: + // f = &builtinAddDateStringStringSig{base} + // case tipb.ScalarFuncSig_AddDateStringInt: + // f = &builtinAddDateStringIntSig{base} + // case tipb.ScalarFuncSig_AddDateStringDecimal: + // f = &builtinAddDateStringDecimalSig{base} + // case tipb.ScalarFuncSig_AddDateIntString: + // f = &builtinAddDateIntStringSig{base} + // case tipb.ScalarFuncSig_AddDateIntInt: + // f = &builtinAddDateIntIntSig{base} + // case tipb.ScalarFuncSig_AddDateDatetimeString: + // f = &builtinAddDateDatetimeStringSig{base} + // case tipb.ScalarFuncSig_AddDateDatetimeInt: + // f = &builtinAddDateDatetimeIntSig{base} + // case tipb.ScalarFuncSig_SubDateStringString: + // f = &builtinSubDateStringStringSig{base} + // case tipb.ScalarFuncSig_SubDateStringInt: + // f = &builtinSubDateStringIntSig{base} + // case tipb.ScalarFuncSig_SubDateStringDecimal: + // f = &builtinSubDateStringDecimalSig{base} + // case tipb.ScalarFuncSig_SubDateIntString: + // f = &builtinSubDateIntStringSig{base} + // case tipb.ScalarFuncSig_SubDateIntInt: + // f = &builtinSubDateIntIntSig{base} + // case tipb.ScalarFuncSig_SubDateDatetimeString: + // f = &builtinSubDateDatetimeStringSig{base} + // case tipb.ScalarFuncSig_SubDateDatetimeInt: + // f = &builtinSubDateDatetimeIntSig{base} case tipb.ScalarFuncSig_FromDays: f = &builtinFromDaysSig{base} case tipb.ScalarFuncSig_TimeFormat: diff --git a/expression/distsql_builtin_test.go b/expression/distsql_builtin_test.go index a438ea80a65d7..68951d28d3e98 100644 --- a/expression/distsql_builtin_test.go +++ b/expression/distsql_builtin_test.go @@ -56,6 +56,7 @@ func (s *testEvalSerialSuite) TestPBToExprWithNewCollation(c *C) { {"some_error_collation", "utf8mb4_bin", 46, 46}, {"utf8_unicode_ci", "utf8_unicode_ci", 192, 192}, {"utf8mb4_unicode_ci", "utf8mb4_unicode_ci", 224, 224}, + {"utf8mb4_zh_pinyin_tidb_as_cs", "utf8mb4_zh_pinyin_tidb_as_cs", 2048, 2048}, } for _, cs := range cases { @@ -576,11 +577,11 @@ func (s *testEvalSuite) TestEval(c *C) { toPBFieldType(newIntFieldType()), datumExpr(c, types.NewStringDatum("1")), datumExpr(c, types.NewStringDatum("1"))), types.NewIntDatum(1), }, - //{ - // scalarFunctionExpr(tipb.ScalarFuncSig_InTime, - // toPBFieldType(newIntFieldType()), datumExpr(c, types.NewTimeDatum(types.ZeroDate)), datumExpr(c, types.NewTimeDatum(types.ZeroDate))), - // types.NewIntDatum(1), - //}, + // { + // scalarFunctionExpr(tipb.ScalarFuncSig_InTime, + // toPBFieldType(newIntFieldType()), datumExpr(c, types.NewTimeDatum(types.ZeroDate)), datumExpr(c, types.NewTimeDatum(types.ZeroDate))), + // types.NewIntDatum(1), + // }, { scalarFunctionExpr(tipb.ScalarFuncSig_InDuration, toPBFieldType(newIntFieldType()), datumExpr(c, types.NewDurationDatum(newDuration(time.Second))), datumExpr(c, types.NewDurationDatum(newDuration(time.Second)))), diff --git a/expression/errors.go b/expression/errors.go index d4171fe64957a..9efd5b8cc518b 100644 --- a/expression/errors.go +++ b/expression/errors.go @@ -14,46 +14,49 @@ package expression import ( - "github.com/pingcap/parser/terror" + pmysql "github.com/pingcap/parser/mysql" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/dbterror" ) // Error instances. var ( // All the exported errors are defined here: - ErrIncorrectParameterCount = terror.ClassExpression.New(mysql.ErrWrongParamcountToNativeFct, mysql.MySQLErrName[mysql.ErrWrongParamcountToNativeFct]) - ErrDivisionByZero = terror.ClassExpression.New(mysql.ErrDivisionByZero, mysql.MySQLErrName[mysql.ErrDivisionByZero]) - ErrRegexp = terror.ClassExpression.New(mysql.ErrRegexp, mysql.MySQLErrName[mysql.ErrRegexp]) - ErrOperandColumns = terror.ClassExpression.New(mysql.ErrOperandColumns, mysql.MySQLErrName[mysql.ErrOperandColumns]) - ErrCutValueGroupConcat = terror.ClassExpression.New(mysql.ErrCutValueGroupConcat, mysql.MySQLErrName[mysql.ErrCutValueGroupConcat]) - ErrFunctionsNoopImpl = terror.ClassExpression.New(mysql.ErrNotSupportedYet, "function %s has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions") - ErrInvalidArgumentForLogarithm = terror.ClassExpression.New(mysql.ErrInvalidArgumentForLogarithm, mysql.MySQLErrName[mysql.ErrInvalidArgumentForLogarithm]) - ErrIncorrectType = terror.ClassExpression.New(mysql.ErrIncorrectType, mysql.MySQLErrName[mysql.ErrIncorrectType]) + ErrIncorrectParameterCount = dbterror.ClassExpression.NewStd(mysql.ErrWrongParamcountToNativeFct) + ErrDivisionByZero = dbterror.ClassExpression.NewStd(mysql.ErrDivisionByZero) + ErrRegexp = dbterror.ClassExpression.NewStd(mysql.ErrRegexp) + ErrOperandColumns = dbterror.ClassExpression.NewStd(mysql.ErrOperandColumns) + ErrCutValueGroupConcat = dbterror.ClassExpression.NewStd(mysql.ErrCutValueGroupConcat) + ErrFunctionsNoopImpl = dbterror.ClassExpression.NewStdErr(mysql.ErrNotSupportedYet, pmysql.Message("function %s has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions", nil)) + ErrInvalidArgumentForLogarithm = dbterror.ClassExpression.NewStd(mysql.ErrInvalidArgumentForLogarithm) + ErrIncorrectType = dbterror.ClassExpression.NewStd(mysql.ErrIncorrectType) + ErrInvalidTableSample = dbterror.ClassExpression.NewStd(mysql.ErrInvalidTableSample) // All the un-exported errors are defined here: - errFunctionNotExists = terror.ClassExpression.New(mysql.ErrSpDoesNotExist, mysql.MySQLErrName[mysql.ErrSpDoesNotExist]) - errZlibZData = terror.ClassExpression.New(mysql.ErrZlibZData, mysql.MySQLErrName[mysql.ErrZlibZData]) - errZlibZBuf = terror.ClassExpression.New(mysql.ErrZlibZBuf, mysql.MySQLErrName[mysql.ErrZlibZBuf]) - errIncorrectArgs = terror.ClassExpression.New(mysql.ErrWrongArguments, mysql.MySQLErrName[mysql.ErrWrongArguments]) - errUnknownCharacterSet = terror.ClassExpression.New(mysql.ErrUnknownCharacterSet, mysql.MySQLErrName[mysql.ErrUnknownCharacterSet]) - errDefaultValue = terror.ClassExpression.New(mysql.ErrInvalidDefault, "invalid default value") - errDeprecatedSyntaxNoReplacement = terror.ClassExpression.New(mysql.ErrWarnDeprecatedSyntaxNoReplacement, mysql.MySQLErrName[mysql.ErrWarnDeprecatedSyntaxNoReplacement]) - errBadField = terror.ClassExpression.New(mysql.ErrBadField, mysql.MySQLErrName[mysql.ErrBadField]) - errWarnAllowedPacketOverflowed = terror.ClassExpression.New(mysql.ErrWarnAllowedPacketOverflowed, mysql.MySQLErrName[mysql.ErrWarnAllowedPacketOverflowed]) - errWarnOptionIgnored = terror.ClassExpression.New(mysql.WarnOptionIgnored, mysql.MySQLErrName[mysql.WarnOptionIgnored]) - errTruncatedWrongValue = terror.ClassExpression.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrTruncatedWrongValue]) - errUnknownLocale = terror.ClassExpression.New(mysql.ErrUnknownLocale, mysql.MySQLErrName[mysql.ErrUnknownLocale]) - errNonUniq = terror.ClassExpression.New(mysql.ErrNonUniq, mysql.MySQLErrName[mysql.ErrNonUniq]) + errFunctionNotExists = dbterror.ClassExpression.NewStd(mysql.ErrSpDoesNotExist) + errZlibZData = dbterror.ClassExpression.NewStd(mysql.ErrZlibZData) + errZlibZBuf = dbterror.ClassExpression.NewStd(mysql.ErrZlibZBuf) + errIncorrectArgs = dbterror.ClassExpression.NewStd(mysql.ErrWrongArguments) + errUnknownCharacterSet = dbterror.ClassExpression.NewStd(mysql.ErrUnknownCharacterSet) + errDefaultValue = dbterror.ClassExpression.NewStdErr(mysql.ErrInvalidDefault, pmysql.Message("invalid default value", nil)) + errDeprecatedSyntaxNoReplacement = dbterror.ClassExpression.NewStd(mysql.ErrWarnDeprecatedSyntaxNoReplacement) + errWarnAllowedPacketOverflowed = dbterror.ClassExpression.NewStd(mysql.ErrWarnAllowedPacketOverflowed) + errWarnOptionIgnored = dbterror.ClassExpression.NewStd(mysql.WarnOptionIgnored) + errTruncatedWrongValue = dbterror.ClassExpression.NewStd(mysql.ErrTruncatedWrongValue) + errUnknownLocale = dbterror.ClassExpression.NewStd(mysql.ErrUnknownLocale) + errNonUniq = dbterror.ClassExpression.NewStd(mysql.ErrNonUniq) // Sequence usage privilege check. - errSequenceAccessDenied = terror.ClassExpression.New(mysql.ErrTableaccessDenied, mysql.MySQLErrName[mysql.ErrTableaccessDenied]) + errSequenceAccessDenied = dbterror.ClassExpression.NewStd(mysql.ErrTableaccessDenied) + errUnsupportedJSONComparison = dbterror.ClassExpression.NewStdErr(mysql.ErrNotSupportedYet, + pmysql.Message("comparison of JSON in the LEAST and GREATEST operators", nil)) ) // handleInvalidTimeError reports error or warning depend on the context. func handleInvalidTimeError(ctx sessionctx.Context, err error) error { - if err == nil || !(types.ErrWrongValue.Equal(err) || + if err == nil || !(types.ErrWrongValue.Equal(err) || types.ErrWrongValueForType.Equal(err) || types.ErrTruncatedWrongVal.Equal(err) || types.ErrInvalidWeekModeFormat.Equal(err) || types.ErrDatetimeFunctionOverflow.Equal(err)) { return err diff --git a/expression/evaluator_test.go b/expression/evaluator_test.go index a0ea2c9f43775..db9905e259716 100644 --- a/expression/evaluator_test.go +++ b/expression/evaluator_test.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -37,6 +38,11 @@ var _ = Suite(&testVectorizeSuite1{}) var _ = Suite(&testVectorizeSuite2{}) func TestT(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) + testleak.BeforeTest() defer testleak.AfterTestT(t)() @@ -78,7 +84,8 @@ func (s *testEvaluatorSuiteBase) SetUpTest(c *C) { s.ctx.GetSessionVars().StmtCtx.TimeZone = time.Local sc := s.ctx.GetSessionVars().StmtCtx sc.TruncateAsWarning = true - s.ctx.GetSessionVars().SetSystemVar("max_allowed_packet", "67108864") + err := s.ctx.GetSessionVars().SetSystemVar("max_allowed_packet", "67108864") + c.Assert(err, IsNil) s.ctx.GetSessionVars().PlanColumnID = 0 } diff --git a/expression/explain.go b/expression/explain.go index 1bfe29827aacd..296b1c9de28d9 100644 --- a/expression/explain.go +++ b/expression/explain.go @@ -95,6 +95,16 @@ func ExplainExpressionList(exprs []Expression, schema *Schema) string { switch expr.(type) { case *Column, *CorrelatedColumn: builder.WriteString(expr.String()) + case *Constant: + v := expr.String() + length := 64 + if len(v) < length { + builder.WriteString(v) + } else { + builder.WriteString(fmt.Sprintf("%s(len:%d)", v[:length], len(v))) + } + builder.WriteString("->") + builder.WriteString(schema.Columns[i].String()) default: builder.WriteString(expr.String()) builder.WriteString("->") diff --git a/expression/expr_to_pb.go b/expression/expr_to_pb.go index a68673f1b4a19..5dcefc47aab16 100644 --- a/expression/expr_to_pb.go +++ b/expression/expr_to_pb.go @@ -17,14 +17,15 @@ import ( "github.com/gogo/protobuf/proto" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" @@ -36,7 +37,7 @@ func ExpressionsToPBList(sc *stmtctx.StatementContext, exprs []Expression, clien for _, expr := range exprs { v := pc.ExprToPB(expr) if v == nil { - return nil, terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]). + return nil, dbterror.ClassOptimizer.NewStd(mysql.ErrInternal). GenWithStack("expression %v cannot be pushed down", expr) } pbExpr = append(pbExpr, v) @@ -63,9 +64,6 @@ func (pc PbConverter) ExprToPB(expr Expression) *tipb.Expr { if pbExpr == nil { return nil } - if !x.Value.IsNull() { - pbExpr.FieldType.Flag |= uint32(mysql.NotNullFlag) - } return pbExpr case *CorrelatedColumn: return pc.conOrCorColToPBExpr(expr) @@ -174,8 +172,8 @@ func FieldTypeFromPB(ft *tipb.FieldType) *types.FieldType { } func collationToProto(c string) int32 { - if v, ok := mysql.CollationNames[c]; ok { - return collate.RewriteNewCollationIDIfNeeded(int32(v)) + if coll, err := charset.GetCollationByName(c); err == nil { + return collate.RewriteNewCollationIDIfNeeded(int32(coll.ID)) } v := collate.RewriteNewCollationIDIfNeeded(int32(mysql.DefaultCollationID)) logutil.BgLogger().Warn( @@ -188,9 +186,9 @@ func collationToProto(c string) int32 { } func protoToCollation(c int32) string { - v, ok := mysql.Collations[uint8(collate.RestoreCollationIDIfNeeded(c))] - if ok { - return v + coll, err := charset.GetCollationByID(int(collate.RestoreCollationIDIfNeeded(c))) + if err == nil { + return coll.Name } logutil.BgLogger().Warn( "Unable to get collation name from ID, use name of the default collation instead", diff --git a/expression/expr_to_pb_test.go b/expression/expr_to_pb_test.go index 4daeb88e0939a..b215fc499cd1f 100644 --- a/expression/expr_to_pb_test.go +++ b/expression/expr_to_pb_test.go @@ -187,28 +187,28 @@ func (s *testEvaluatorSuite) TestColumn2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, colExprs, client) c.Assert(err, IsNil) jsons := []string{ - "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":2,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":4,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":6,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAc=\",\"sig\":0,\"field_type\":{\"tp\":7,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAg=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAk=\",\"sig\":0,\"field_type\":{\"tp\":9,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAo=\",\"sig\":0,\"field_type\":{\"tp\":10,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAs=\",\"sig\":0,\"field_type\":{\"tp\":11,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAw=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAA0=\",\"sig\":0,\"field_type\":{\"tp\":13,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAA8=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABA=\",\"sig\":0,\"field_type\":{\"tp\":245,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABE=\",\"sig\":0,\"field_type\":{\"tp\":246,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABI=\",\"sig\":0,\"field_type\":{\"tp\":249,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABM=\",\"sig\":0,\"field_type\":{\"tp\":250,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABQ=\",\"sig\":0,\"field_type\":{\"tp\":251,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABU=\",\"sig\":0,\"field_type\":{\"tp\":252,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABY=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAABc=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"}}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":2,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":4,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":6,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAc=\",\"sig\":0,\"field_type\":{\"tp\":7,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAg=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAk=\",\"sig\":0,\"field_type\":{\"tp\":9,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAo=\",\"sig\":0,\"field_type\":{\"tp\":10,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAs=\",\"sig\":0,\"field_type\":{\"tp\":11,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAw=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAA0=\",\"sig\":0,\"field_type\":{\"tp\":13,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAA8=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABA=\",\"sig\":0,\"field_type\":{\"tp\":245,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABE=\",\"sig\":0,\"field_type\":{\"tp\":246,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABI=\",\"sig\":0,\"field_type\":{\"tp\":249,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABM=\",\"sig\":0,\"field_type\":{\"tp\":250,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABQ=\",\"sig\":0,\"field_type\":{\"tp\":251,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABU=\",\"sig\":0,\"field_type\":{\"tp\":252,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABY=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAABc=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { c.Assert(pbExprs, NotNil) @@ -248,13 +248,13 @@ func (s *testEvaluatorSuite) TestCompareFunc2Pb(c *C) { c.Assert(err, IsNil) c.Assert(len(pbExprs), Equals, len(compareExprs)) jsons := []string{ - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":100,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":110,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":120,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":130,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":140,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":150,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":160,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":100,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":110,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":120,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":130,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":140,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":150,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":8,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":160,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { c.Assert(pbExprs, NotNil) @@ -270,6 +270,7 @@ func (s *testEvaluatorSuite) TestLikeFunc2Pb(c *C) { client := new(mock.Client) retTp := types.NewFieldType(mysql.TypeString) + retTp.Flag |= mysql.NotNullFlag retTp.Charset = charset.CharsetUTF8 retTp.Collate = charset.CollationUTF8 args := []Expression{ @@ -291,8 +292,8 @@ func (s *testEvaluatorSuite) TestLikeFunc2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, likeFuncs, client) c.Assert(err, IsNil) results := []string{ - `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}},{"tp":5,"val":"cGF0dGVybg==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"}}],"sig":4310,"field_type":{"tp":8,"flag":128,"flen":1,"decimal":0,"collate":63,"charset":"binary"}}`, - `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}},{"tp":5,"val":"JWFiYyU=","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"}}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"}}],"sig":4310,"field_type":{"tp":8,"flag":128,"flen":1,"decimal":0,"collate":63,"charset":"binary"}}`, + `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":5,"val":"cGF0dGVybg==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}],"sig":4310,"field_type":{"tp":8,"flag":524416,"flen":1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}`, + `{"tp":10000,"children":[{"tp":5,"val":"c3RyaW5n","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":5,"val":"JWFiYyU=","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false},{"tp":10000,"val":"CAA=","children":[{"tp":5,"val":"XA==","sig":0,"field_type":{"tp":254,"flag":1,"flen":-1,"decimal":-1,"collate":83,"charset":"utf8"},"has_distinct":false}],"sig":30,"field_type":{"tp":8,"flag":128,"flen":-1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}],"sig":4310,"field_type":{"tp":8,"flag":524416,"flen":1,"decimal":0,"collate":63,"charset":"binary"},"has_distinct":false}`, } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) @@ -320,10 +321,10 @@ func (s *testEvaluatorSuite) TestArithmeticalFunc2Pb(c *C) { } jsons := make(map[string]string) - jsons[ast.Plus] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":200,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"}}" - jsons[ast.Minus] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":204,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"}}" - jsons[ast.Mul] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":208,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"}}" - jsons[ast.Div] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":211,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":23,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"}}" + jsons[ast.Plus] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":200,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}" + jsons[ast.Minus] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":204,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}" + jsons[ast.Mul] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":208,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}" + jsons[ast.Div] = "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":211,\"field_type\":{\"tp\":5,\"flag\":128,\"flen\":23,\"decimal\":-1,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}" pbExprs, err := ExpressionsToPBList(sc, arithmeticalFuncs, client) c.Assert(err, IsNil) @@ -365,7 +366,7 @@ func (s *testEvaluatorSuite) TestDateFunc2Pb(c *C) { c.Assert(pbExprs[0], NotNil) js, err := json.Marshal(pbExprs[0]) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"}}],\"sig\":6001,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":0,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"}}") + c.Assert(string(js), Equals, "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":12,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":46,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":6001,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":0,\"decimal\":-1,\"collate\":46,\"charset\":\"utf8mb4\"},\"has_distinct\":false}") } func (s *testEvaluatorSuite) TestLogicalFunc2Pb(c *C) { @@ -393,10 +394,10 @@ func (s *testEvaluatorSuite) TestLogicalFunc2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, logicalFuncs, client) c.Assert(err, IsNil) jsons := []string{ - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3101,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3102,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3103,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3104,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3101,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3102,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3103,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":1,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3104,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) @@ -430,12 +431,12 @@ func (s *testEvaluatorSuite) TestBitwiseFunc2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, bitwiseFuncs, client) c.Assert(err, IsNil) jsons := []string{ - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3118,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3119,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3120,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3129,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3130,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3121,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3118,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3119,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3120,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3129,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3130,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3121,\"field_type\":{\"tp\":8,\"flag\":160,\"flen\":20,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) @@ -557,9 +558,9 @@ func (s *testEvaluatorSuite) TestControlFunc2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, controlFuncs, client) c.Assert(err, IsNil) jsons := []string{ - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":4208,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":-1,\"decimal\":0,\"collate\":63,\"charset\":\"\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":4107,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":-1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", - "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":4101,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":-1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":4208,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":-1,\"decimal\":0,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":4107,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":24,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", + "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":4101,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":24,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", "null", } for i, pbExpr := range pbExprs { @@ -590,8 +591,8 @@ func (s *testEvaluatorSuite) TestOtherFunc2Pb(c *C) { pbExprs, err := ExpressionsToPBList(sc, otherFuncs, client) c.Assert(err, IsNil) jsons := map[string]string{ - ast.Coalesce: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":4201,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":0,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}", - ast.IsNull: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}}],\"sig\":3116,\"field_type\":{\"tp\":8,\"flag\":128,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"}}", + ast.Coalesce: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":4201,\"field_type\":{\"tp\":3,\"flag\":128,\"flen\":0,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}", + ast.IsNull: "{\"tp\":10000,\"children\":[{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":3,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false}],\"sig\":3116,\"field_type\":{\"tp\":8,\"flag\":524416,\"flen\":1,\"decimal\":0,\"collate\":63,\"charset\":\"binary\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { js, err := json.Marshal(pbExpr) @@ -608,6 +609,10 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { jsonColumn := dg.genColumn(mysql.TypeJSON, 1) intColumn := dg.genColumn(mysql.TypeLonglong, 2) + realColumn := dg.genColumn(mysql.TypeDouble, 3) + decimalColumn := dg.genColumn(mysql.TypeNewDecimal, 4) + stringColumn := dg.genColumn(mysql.TypeString, 5) + datetimeColumn := dg.genColumn(mysql.TypeDatetime, 6) function, err := NewFunction(mock.NewContext(), ast.JSONLength, types.NewFieldType(mysql.TypeLonglong), jsonColumn) c.Assert(err, IsNil) exprs = append(exprs, function) @@ -624,15 +629,116 @@ func (s *testEvaluatorSuite) TestExprPushDownToFlash(c *C) { c.Assert(err, IsNil) exprs = append(exprs, function) + // ExtractDatetime: can be pushed + function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, datetimeColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastIntAsInt + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastRealAsInt + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastDecimalAsInt + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), decimalColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastStringAsInt + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastTimeAsInt + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeLonglong), datetimeColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastIntAsDecimal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastRealAsDecimal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastDecimalAsDecimal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), decimalColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastStringAsDecimal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastTimeAsDecimal + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeNewDecimal), datetimeColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastIntAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastRealAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastDecimalAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), decimalColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastStringAsString + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeString), stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastIntAsTime + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), intColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastRealAsTime + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), realColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastDecimalAsTime + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), decimalColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + + // CastTimeAsTime + function, err = NewFunction(mock.NewContext(), ast.Cast, types.NewFieldType(mysql.TypeDatetime), datetimeColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + canPush := CanExprsPushDown(sc, exprs, client, kv.TiFlash) c.Assert(canPush, Equals, true) function, err = NewFunction(mock.NewContext(), ast.JSONDepth, types.NewFieldType(mysql.TypeLonglong), jsonColumn) c.Assert(err, IsNil) exprs = append(exprs, function) + + // ExtractDatetimeFromString: can not be pushed + function, err = NewFunction(mock.NewContext(), ast.Extract, types.NewFieldType(mysql.TypeLonglong), stringColumn, stringColumn) + c.Assert(err, IsNil) + exprs = append(exprs, function) + pushed, remained := PushDownExprs(sc, exprs, client, kv.TiFlash) - c.Assert(len(pushed), Equals, len(exprs)-1) - c.Assert(len(remained), Equals, 1) + c.Assert(len(pushed), Equals, len(exprs)-2) + c.Assert(len(remained), Equals, 2) } func (s *testEvaluatorSuite) TestExprOnlyPushDownToFlash(c *C) { @@ -697,13 +803,13 @@ func (s *testEvaluatorSuite) TestGroupByItem2Pb(c *C) { pbByItem := GroupByItemToPB(sc, client, item) js, err := json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},\"desc\":false}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},\"desc\":false}") item = dg.genColumn(mysql.TypeDouble, 1) pbByItem = GroupByItemToPB(sc, client, item) js, err = json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},\"desc\":false}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},\"desc\":false}") } func (s *testEvaluatorSuite) TestSortByItem2Pb(c *C) { @@ -714,19 +820,19 @@ func (s *testEvaluatorSuite) TestSortByItem2Pb(c *C) { pbByItem := SortByItemToPB(sc, client, item, false) js, err := json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},\"desc\":false}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},\"desc\":false}") item = dg.genColumn(mysql.TypeDouble, 1) pbByItem = SortByItemToPB(sc, client, item, false) js, err = json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},\"desc\":false}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},\"desc\":false}") item = dg.genColumn(mysql.TypeDouble, 1) pbByItem = SortByItemToPB(sc, client, item, true) js, err = json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"}},\"desc\":true}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":63,\"charset\":\"\"},\"has_distinct\":false},\"desc\":true}") } func (s *testEvaluatorSerialSuites) TestMetadata(c *C) { @@ -789,17 +895,19 @@ func (s *testEvaluatorSerialSuites) TestNewCollationsEnabled(c *C) { colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeString, 4), "utf8mb4_0900_ai_ci")) colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 5), "utf8_bin")) colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 6), "utf8_unicode_ci")) + colExprs = append(colExprs, columnCollation(dg.genColumn(mysql.TypeVarchar, 7), "utf8mb4_zh_pinyin_tidb_as_cs")) pushed, _ := PushDownExprs(sc, colExprs, client, kv.UnSpecified) c.Assert(len(pushed), Equals, len(colExprs)) pbExprs, err := ExpressionsToPBList(sc, colExprs, client) c.Assert(err, IsNil) jsons := []string{ - "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-45,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-83,\"charset\":\"\"}}", - "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-192,\"charset\":\"\"}}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAE=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAI=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-46,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAM=\",\"sig\":0,\"field_type\":{\"tp\":253,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-45,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAQ=\",\"sig\":0,\"field_type\":{\"tp\":254,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAU=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-83,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAY=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-192,\"charset\":\"\"},\"has_distinct\":false}", + "{\"tp\":201,\"val\":\"gAAAAAAAAAc=\",\"sig\":0,\"field_type\":{\"tp\":15,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-2048,\"charset\":\"\"},\"has_distinct\":false}", } for i, pbExpr := range pbExprs { c.Assert(pbExprs, NotNil) @@ -812,7 +920,7 @@ func (s *testEvaluatorSerialSuites) TestNewCollationsEnabled(c *C) { pbByItem := GroupByItemToPB(sc, client, item) js, err := json.Marshal(pbByItem) c.Assert(err, IsNil) - c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"\"}},\"desc\":false}") + c.Assert(string(js), Equals, "{\"expr\":{\"tp\":201,\"val\":\"gAAAAAAAAAA=\",\"sig\":0,\"field_type\":{\"tp\":5,\"flag\":0,\"flen\":-1,\"decimal\":-1,\"collate\":-255,\"charset\":\"\"},\"has_distinct\":false},\"desc\":false}") } func (s *testEvalSerialSuite) TestPushCollationDown(c *C) { diff --git a/expression/expression.go b/expression/expression.go index 91e9a691d3789..26bf0fb6e18bf 100644 --- a/expression/expression.go +++ b/expression/expression.go @@ -48,9 +48,13 @@ const ( ) // EvalAstExpr evaluates ast expression directly. +// Note: initialized in planner/core +// import expression and planner/core together to use EvalAstExpr var EvalAstExpr func(sctx sessionctx.Context, expr ast.ExprNode) (types.Datum, error) // RewriteAstExpr rewrites ast expression directly. +// Note: initialized in planner/core +// import expression and planner/core together to use EvalAstExpr var RewriteAstExpr func(sctx sessionctx.Context, expr ast.ExprNode, schema *Schema, names types.NameSlice) (Expression, error) // VecExpr contains all vectorized evaluation methods. @@ -200,6 +204,16 @@ func IsEQCondFromIn(expr Expression) bool { return len(cols) > 0 } +// ExprNotNull checks if an expression is possible to be null. +func ExprNotNull(expr Expression) bool { + if c, ok := expr.(*Constant); ok { + return !c.Value.IsNull() + } + // For ScalarFunction, the result would not be correct until we support maintaining + // NotNull flag for it. + return mysql.HasNotNullFlag(expr.GetType().Flag) +} + // HandleOverflowOnSelection handles Overflow errors when evaluating selection filters. // We should ignore overflow errors when evaluating selection conditions: // INSERT INTO t VALUES ("999999999999999999"); @@ -321,20 +335,26 @@ func VecEvalBool(ctx sessionctx.Context, exprList CNFExprs, input *chunk.Chunk, isZero := allocZeroSlice(n) defer deallocateZeroSlice(isZero) for _, expr := range exprList { - eType := expr.GetType().EvalType() - if expr.GetType().Hybrid() { - eType = types.ETInt + tp := expr.GetType() + eType := tp.EvalType() + if CanImplicitEvalReal(expr) { + eType = types.ETReal } buf, err := globalColumnAllocator.get(eType, n) if err != nil { return nil, nil, err } - if err := EvalExpr(ctx, expr, eType, input, buf); err != nil { + // Take the implicit evalReal path if possible. + if CanImplicitEvalReal(expr) { + if err := implicitEvalReal(ctx, expr, input, buf); err != nil { + return nil, nil, err + } + } else if err := EvalExpr(ctx, expr, eType, input, buf); err != nil { return nil, nil, err } - err = toBool(ctx.GetSessionVars().StmtCtx, eType, buf, sel, isZero) + err = toBool(ctx.GetSessionVars().StmtCtx, tp, eType, buf, sel, isZero) if err != nil { return nil, nil, err } @@ -374,7 +394,7 @@ func VecEvalBool(ctx sessionctx.Context, exprList CNFExprs, input *chunk.Chunk, return selected, nulls, nil } -func toBool(sc *stmtctx.StatementContext, eType types.EvalType, buf *chunk.Column, sel []int, isZero []int8) error { +func toBool(sc *stmtctx.StatementContext, tp *types.FieldType, eType types.EvalType, buf *chunk.Column, sel []int, isZero []int8) error { switch eType { case types.ETInt: i64s := buf.Int64s() @@ -433,11 +453,40 @@ func toBool(sc *stmtctx.StatementContext, eType types.EvalType, buf *chunk.Colum if buf.IsNull(i) { isZero[i] = -1 } else { - iVal, err := types.StrToFloat(sc, buf.GetString(i), false) - if err != nil { - return err + var fVal float64 + var err error + sVal := buf.GetString(i) + if tp.Hybrid() { + switch tp.Tp { + case mysql.TypeSet, mysql.TypeEnum: + fVal = float64(len(sVal)) + if fVal == 0 { + // The elements listed in the column specification are assigned index numbers, beginning + // with 1. The index value of the empty string error value (distinguish from a "normal" + // empty string) is 0. Thus we need to check whether it's an empty string error value when + // `fVal==0`. + for idx, elem := range tp.Elems { + if elem == sVal { + fVal = float64(idx + 1) + break + } + } + } + case mysql.TypeBit: + var bl types.BinaryLiteral = buf.GetBytes(i) + iVal, err := bl.ToInt(sc) + if err != nil { + return err + } + fVal = float64(iVal) + } + } else { + fVal, err = types.StrToFloat(sc, sVal, false) + if err != nil { + return err + } } - if iVal == 0 { + if fVal == 0 { isZero[i] = 0 } else { isZero[i] = 1 @@ -473,6 +522,30 @@ func toBool(sc *stmtctx.StatementContext, eType types.EvalType, buf *chunk.Colum return nil } +func implicitEvalReal(ctx sessionctx.Context, expr Expression, input *chunk.Chunk, result *chunk.Column) (err error) { + if expr.Vectorized() && ctx.GetSessionVars().EnableVectorizedExpression { + err = expr.VecEvalReal(ctx, input, result) + } else { + ind, n := 0, input.NumRows() + iter := chunk.NewIterator4Chunk(input) + result.ResizeFloat64(n, false) + f64s := result.Float64s() + for it := iter.Begin(); it != iter.End(); it = iter.Next() { + value, isNull, err := expr.EvalReal(ctx, it) + if err != nil { + return err + } + if isNull { + result.SetNull(ind, isNull) + } else { + f64s[ind] = value + } + ind++ + } + } + return +} + // EvalExpr evaluates this expr according to its type. // And it selects the method for evaluating expression based on // the environment variables and whether the expression can be vectorized. @@ -709,11 +782,18 @@ func SplitDNFItems(onExpr Expression) []Expression { // EvaluateExprWithNull sets columns in schema as null and calculate the final result of the scalar function. // If the Expression is a non-constant value, it means the result is unknown. func EvaluateExprWithNull(ctx sessionctx.Context, schema *Schema, expr Expression) Expression { + if ContainMutableConst(ctx, []Expression{expr}) { + ctx.GetSessionVars().StmtCtx.OptimDependOnMutableConst = true + } + return evaluateExprWithNull(ctx, schema, expr) +} + +func evaluateExprWithNull(ctx sessionctx.Context, schema *Schema, expr Expression) Expression { switch x := expr.(type) { case *ScalarFunction: args := make([]Expression, len(x.GetArgs())) for i, arg := range x.GetArgs() { - args[i] = EvaluateExprWithNull(ctx, schema, arg) + args[i] = evaluateExprWithNull(ctx, schema, arg) } return NewFunctionInternal(ctx, x.FuncName.L, x.RetType, args...) case *Column: @@ -789,7 +869,7 @@ func ColumnInfos2ColumnsAndNames(ctx sessionctx.Context, dbName, tblName model.C ColName: col.Name, }) newCol := &Column{ - RetType: &col.FieldType, + RetType: col.FieldType.Clone(), ID: col.ID, UniqueID: ctx.GetSessionVars().AllocPlanColumnID(), Index: col.Offset, @@ -990,6 +1070,7 @@ func canFuncBePushed(sf *ScalarFunction, storeType kv.StoreType) bool { ast.TimestampDiff, ast.DateAdd, ast.FromUnixTime, + ast.Extract, // encryption functions. ast.MD5, @@ -1006,7 +1087,8 @@ func canFuncBePushed(sf *ScalarFunction, storeType kv.StoreType) bool { ast.IsIPv4, ast.IsIPv4Compat, ast.IsIPv4Mapped, - ast.IsIPv6: + ast.IsIPv6, + ast.UUID: ret = true // A special case: Only push down Round by signature @@ -1092,6 +1174,13 @@ func canScalarFuncPushDown(scalarFunc *ScalarFunction, pc PbConverter, storeType // Check whether this function can be pushed. if !canFuncBePushed(scalarFunc, storeType) { + if pc.sc.InExplainStmt { + storageName := storeType.Name() + if storeType == kv.UnSpecified { + storageName = "storage layer" + } + pc.sc.AppendWarning(errors.New("Scalar function '" + scalarFunc.FuncName.L + "'(signature: " + scalarFunc.Function.PbCode().String() + ") can not be pushed to " + storageName)) + } return false } @@ -1115,6 +1204,9 @@ func canScalarFuncPushDown(scalarFunc *ScalarFunction, pc PbConverter, storeType func canExprPushDown(expr Expression, pc PbConverter, storeType kv.StoreType) bool { if storeType == kv.TiFlash && expr.GetType().Tp == mysql.TypeDuration { + if pc.sc.InExplainStmt { + pc.sc.AppendWarning(errors.New("Expr '" + expr.String() + "' can not be pushed to TiFlash because it contains Duration type")) + } return false } switch x := expr.(type) { @@ -1152,7 +1244,7 @@ func CanExprsPushDown(sc *stmtctx.StatementContext, exprs []Expression, client k func scalarExprSupportedByTiKV(function *ScalarFunction) bool { switch function.FuncName.L { case ast.Substr, ast.Substring, ast.DateAdd, ast.TimestampDiff, - ast.FromUnixTime: + ast.FromUnixTime, ast.Extract: return false default: return true @@ -1180,7 +1272,11 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { return true case ast.Cast: switch function.Function.PbCode() { - case tipb.ScalarFuncSig_CastIntAsDecimal: + case tipb.ScalarFuncSig_CastIntAsInt, tipb.ScalarFuncSig_CastIntAsDecimal, tipb.ScalarFuncSig_CastIntAsString, tipb.ScalarFuncSig_CastIntAsTime, + tipb.ScalarFuncSig_CastRealAsInt, tipb.ScalarFuncSig_CastRealAsDecimal, tipb.ScalarFuncSig_CastRealAsString, tipb.ScalarFuncSig_CastRealAsTime, + tipb.ScalarFuncSig_CastStringAsInt, tipb.ScalarFuncSig_CastStringAsDecimal, tipb.ScalarFuncSig_CastStringAsString, tipb.ScalarFuncSig_CastStringAsTime, + tipb.ScalarFuncSig_CastDecimalAsInt, tipb.ScalarFuncSig_CastDecimalAsDecimal, tipb.ScalarFuncSig_CastDecimalAsString, tipb.ScalarFuncSig_CastDecimalAsTime, + tipb.ScalarFuncSig_CastTimeAsInt, tipb.ScalarFuncSig_CastTimeAsDecimal, tipb.ScalarFuncSig_CastTimeAsTime: return true default: return false @@ -1200,6 +1296,13 @@ func scalarExprSupportedByFlash(function *ScalarFunction) bool { default: return false } + case ast.Extract: + switch function.Function.PbCode() { + case tipb.ScalarFuncSig_ExtractDatetime: + return true + default: + return false + } default: return false } diff --git a/expression/function_traits.go b/expression/function_traits.go index 12631d357e6ff..7bf2730a6f360 100644 --- a/expression/function_traits.go +++ b/expression/function_traits.go @@ -15,6 +15,7 @@ package expression import ( "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/opcode" ) // UnCacheableFunctions stores functions which can not be cached to plan cache. @@ -60,9 +61,13 @@ var DisableFoldFunctions = map[string]struct{}{ // otherwise, the child functions do not fold constant. // Note: the function itself should fold constant. var TryFoldFunctions = map[string]struct{}{ - ast.If: {}, - ast.Ifnull: {}, - ast.Case: {}, + ast.If: {}, + ast.Ifnull: {}, + ast.Case: {}, + ast.LogicAnd: {}, + ast.LogicOr: {}, + ast.Coalesce: {}, + ast.Interval: {}, } // IllegalFunctions4GeneratedColumns stores functions that is illegal for generated columns. @@ -129,6 +134,50 @@ var DeferredFunctions = map[string]struct{}{ ast.UTCDate: {}, } +// AllowedPartitionFuncMap stores functions which can be used in the partition expression. +var AllowedPartitionFuncMap = map[string]struct{}{ + ast.ToDays: {}, + ast.ToSeconds: {}, + ast.DayOfMonth: {}, + ast.Month: {}, + ast.DayOfYear: {}, + ast.Quarter: {}, + ast.YearWeek: {}, + ast.Year: {}, + ast.Weekday: {}, + ast.DayOfWeek: {}, + ast.Day: {}, + ast.Hour: {}, + ast.Minute: {}, + ast.Second: {}, + ast.TimeToSec: {}, + ast.MicroSecond: {}, + ast.UnixTimestamp: {}, + ast.FromDays: {}, + ast.Extract: {}, + ast.Abs: {}, + ast.Ceiling: {}, + ast.DateDiff: {}, + ast.Floor: {}, + ast.Mod: {}, +} + +// AllowedPartition4BinaryOpMap store the operator for Binary Expr +// See https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations.html for more details +var AllowedPartition4BinaryOpMap = map[opcode.Op]struct{}{ + opcode.Plus: {}, + opcode.Minus: {}, + opcode.Mul: {}, + opcode.IntDiv: {}, + opcode.Mod: {}, +} + +// AllowedPartition4UnaryOpMap store the operator for Unary Expr +var AllowedPartition4UnaryOpMap = map[opcode.Op]struct{}{ + opcode.Plus: {}, + opcode.Minus: {}, +} + // inequalFunctions stores functions which cannot be propagated from column equal condition. var inequalFunctions = map[string]struct{}{ ast.IsNull: {}, @@ -182,3 +231,29 @@ var noopFuncs = map[string]struct{}{ ast.GetLock: {}, ast.ReleaseLock: {}, } + +// booleanFunctions stores boolean functions +var booleanFunctions = map[string]struct{}{ + ast.UnaryNot: {}, + ast.EQ: {}, + ast.NE: {}, + ast.NullEQ: {}, + ast.LT: {}, + ast.LE: {}, + ast.GT: {}, + ast.GE: {}, + ast.In: {}, + ast.LogicAnd: {}, + ast.LogicOr: {}, + ast.LogicXor: {}, + ast.IsTruthWithNull: {}, + ast.IsTruthWithoutNull: {}, + ast.IsFalsity: {}, + ast.IsNull: {}, + ast.Like: {}, + ast.Regexp: {}, + ast.IsIPv4: {}, + ast.IsIPv4Compat: {}, + ast.IsIPv4Mapped: {}, + ast.IsIPv6: {}, +} diff --git a/expression/generator/other_vec.go b/expression/generator/other_vec.go index f65eed482d1e0..8016ba7619766 100644 --- a/expression/generator/other_vec.go +++ b/expression/generator/other_vec.go @@ -120,6 +120,7 @@ var builtinInTmpl = template.Must(template.New("builtinInTmpl").Parse(` {{ $InputString := (eq .Input.TypeName "String") }} {{ $InputFixed := ( .Input.Fixed ) }} {{ $UseHashKey := ( or (eq .Input.TypeName "Decimal") (eq .Input.TypeName "JSON") )}} +{{ $InputTime := (eq .Input.TypeName "Time") }} func (b *{{.SigName}}) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error { n := input.NumRows() {{- template "BufAllocator" . }} @@ -143,13 +144,12 @@ func (b *{{.SigName}}) vecEvalInt(input *chunk.Chunk, result *chunk.Column) erro isUnsigned0 := mysql.HasUnsignedFlag(b.args[0].GetType().Flag) {{- end }} var compareResult int - args := b.args + args := b.args[1:] {{- if not $InputJSON}} if len(b.hashSet) != 0 { {{- if $InputString }} collator := collate.GetCollator(b.collation) {{- end }} - args = b.nonConstArgs for i := 0; i < n; i++ { if buf0.IsNull(i) { hasNull[i] = true @@ -188,6 +188,11 @@ func (b *{{.SigName}}) vecEvalInt(input *chunk.Chunk, result *chunk.Column) erro r64s[i] = 1 result.SetNull(i, false) } + {{- else if $InputTime }} + if _, ok := b.hashSet[arg0.CoreTime()]; ok { + r64s[i] = 1 + result.SetNull(i, false) + } {{- else }} if _, ok := b.hashSet[arg0]; ok { r64s[i] = 1 @@ -196,10 +201,14 @@ func (b *{{.SigName}}) vecEvalInt(input *chunk.Chunk, result *chunk.Column) erro {{- end }} {{- end }} } + args = args[:0] + for _, i := range b.nonConstArgsIdx { + args = append(args, b.args[i]) + } } {{- end }} - for j := 1; j < len(args); j++ { + for j := 0; j < len(args); j++ { if err := args[j].VecEval{{ .Input.TypeName }}(b.ctx, input, buf1); err != nil { return err } diff --git a/expression/generator/time_vec.go b/expression/generator/time_vec.go index 7587a3a21f25f..b6c13dc1af760 100644 --- a/expression/generator/time_vec.go +++ b/expression/generator/time_vec.go @@ -182,7 +182,7 @@ func (b *{{.SigName}}) vecEval{{ .Output.TypeName }}(input *chunk.Chunk, result if err != nil { return err } - + {{ else if or (eq .SigName "builtinAddDatetimeAndStringSig") (eq .SigName "builtinSubDatetimeAndStringSig") }} {{ if eq $.FuncName "AddTime" }} {{ template "ConvertStringToDuration" . }} @@ -242,6 +242,7 @@ func (b *{{.SigName}}) vecEval{{ .Output.TypeName }}(input *chunk.Chunk, result fsp1 := int8(b.args[1].GetType().Decimal) arg1Duration := types.Duration{Duration: arg1, Fsp: fsp1} var output string + var isNull bool if isDuration(arg0) { {{ if eq $.FuncName "AddTime" }} output, err = strDurationAddDuration(sc, arg0, arg1Duration) @@ -258,17 +259,23 @@ func (b *{{.SigName}}) vecEval{{ .Output.TypeName }}(input *chunk.Chunk, result } } else { {{ if eq $.FuncName "AddTime" }} - output, err = strDatetimeAddDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeAddDuration(sc, arg0, arg1Duration) {{ else }} - output, err = strDatetimeSubDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeSubDuration(sc, arg0, arg1Duration) {{ end }} if err != nil { return err } + if isNull { + sc.AppendWarning(err) + {{ template "SetNull" . }} + continue + } } {{ else if or (eq .SigName "builtinAddStringAndStringSig") (eq .SigName "builtinSubStringAndStringSig") }} {{ template "ConvertStringToDuration" . }} var output string + var isNull bool if isDuration(arg0) { {{ if eq $.FuncName "AddTime" }} output, err = strDurationAddDuration(sc, arg0, arg1Duration) @@ -285,13 +292,18 @@ func (b *{{.SigName}}) vecEval{{ .Output.TypeName }}(input *chunk.Chunk, result } } else { {{ if eq $.FuncName "AddTime" }} - output, err = strDatetimeAddDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeAddDuration(sc, arg0, arg1Duration) {{ else }} - output, err = strDatetimeSubDuration(sc, arg0, arg1Duration) + output, isNull, err = strDatetimeSubDuration(sc, arg0, arg1Duration) {{ end }} if err != nil { return err } + if isNull { + sc.AppendWarning(err) + {{ template "SetNull" . }} + continue + } } {{ else if or (eq .SigName "builtinAddDateAndDurationSig") (eq .SigName "builtinSubDateAndDurationSig") }} fsp0 := int8(b.args[0].GetType().Decimal) diff --git a/expression/helper_test.go b/expression/helper_test.go index 369333e37a6e9..c22834c26ce9b 100644 --- a/expression/helper_test.go +++ b/expression/helper_test.go @@ -37,7 +37,8 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { timeValue := v.GetMysqlTime() c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") sessionVars := ctx.GetSessionVars() - variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("")) + err = variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("")) + c.Assert(err, IsNil) v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) c.Assert(err, IsNil) @@ -45,7 +46,8 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { timeValue = v.GetMysqlTime() c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") - variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("0")) + err = variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("0")) + c.Assert(err, IsNil) v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) c.Assert(err, IsNil) @@ -53,7 +55,8 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { timeValue = v.GetMysqlTime() c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") - variable.SetSessionSystemVar(sessionVars, "timestamp", types.Datum{}) + err = variable.SetSessionSystemVar(sessionVars, "timestamp", types.Datum{}) + c.Assert(err, IsNil) v, err = GetTimeValue(ctx, "2012-12-12 00:00:00", mysql.TypeTimestamp, types.MinFsp) c.Assert(err, IsNil) @@ -61,7 +64,8 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { timeValue = v.GetMysqlTime() c.Assert(timeValue.String(), Equals, "2012-12-12 00:00:00") - variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("1234")) + err = variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("1234")) + c.Assert(err, IsNil) tbl := []struct { Expr interface{} @@ -74,7 +78,7 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { {ast.NewValueExpr(int64(0), "", ""), "0000-00-00 00:00:00"}, {ast.NewValueExpr(nil, "", ""), nil}, {&ast.FuncCallExpr{FnName: model.NewCIStr(ast.CurrentTimestamp)}, strings.ToUpper(ast.CurrentTimestamp)}, - //{&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(0))}, "0000-00-00 00:00:00"}, + // {&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(0))}, "0000-00-00 00:00:00"}, } for i, t := range tbl { @@ -97,7 +101,7 @@ func (s *testExpressionSuite) TestGetTimeValue(c *C) { {ast.NewValueExpr("2012-13-12 00:00:00", charset.CharsetUTF8MB4, charset.CollationUTF8MB4)}, {ast.NewValueExpr(int64(1), "", "")}, {&ast.FuncCallExpr{FnName: model.NewCIStr("xxx")}}, - //{&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(1))}}, + // {&ast.UnaryOperationExpr{Op: opcode.Minus, V: ast.NewValueExpr(int64(1))}}, } for _, t := range errTbl { @@ -135,8 +139,10 @@ func (s *testExpressionSuite) TestCurrentTimestampTimeZone(c *C) { ctx := mock.NewContext() sessionVars := ctx.GetSessionVars() - variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("1234")) - variable.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+00:00")) + err := variable.SetSessionSystemVar(sessionVars, "timestamp", types.NewStringDatum("1234")) + c.Assert(err, IsNil) + err = variable.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+00:00")) + c.Assert(err, IsNil) v, err := GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) c.Assert(err, IsNil) c.Assert(v.GetMysqlTime(), DeepEquals, types.NewTime( @@ -145,7 +151,8 @@ func (s *testExpressionSuite) TestCurrentTimestampTimeZone(c *C) { // CurrentTimestamp from "timestamp" session variable is based on UTC, so change timezone // would get different value. - variable.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+08:00")) + err = variable.SetSessionSystemVar(sessionVars, "time_zone", types.NewStringDatum("+08:00")) + c.Assert(err, IsNil) v, err = GetTimeValue(ctx, ast.CurrentTimestamp, mysql.TypeTimestamp, types.MinFsp) c.Assert(err, IsNil) c.Assert(v.GetMysqlTime(), DeepEquals, types.NewTime( diff --git a/expression/integration_test.go b/expression/integration_test.go old mode 100755 new mode 100644 index 5ccf9fc3fd633..f19afccb3d906 --- a/expression/integration_test.go +++ b/expression/integration_test.go @@ -16,6 +16,7 @@ package expression_test import ( "bytes" "context" + "encoding/hex" "fmt" "math" "sort" @@ -25,10 +26,12 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" @@ -38,7 +41,10 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/kvcache" "github.com/pingcap/tidb/util/mock" @@ -136,6 +142,19 @@ func (s *testIntegrationSuite) Test19654(c *C) { tk.MustQuery("select /*+ inl_join(t2)*/ * from t1, t2 where t1.b=t2.b;").Check(testkit.Rows("a a")) } +func (s *testIntegrationSuite) Test19387(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a decimal(16, 2));") + tk.MustExec("select sum(case when 1 then a end) from t group by a;") + res := tk.MustQuery("show create table t") + c.Assert(len(res.Rows()), Equals, 1) + str := res.Rows()[0][1].(string) + c.Assert(strings.Contains(str, "decimal(16,2)"), IsTrue) +} + func (s *testIntegrationSuite) TestFuncREPEAT(c *C) { tk := testkit.NewTestKit(c, s.store) defer s.cleanEnv(c) @@ -364,7 +383,7 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { result = tk.MustQuery("select log10(NULL)") result.Check(testkit.Rows("")) - //for log + // for log result = tk.MustQuery("select log(0.0)") result.Check(testkit.Rows("")) result = tk.MustQuery("select log(100)") @@ -478,7 +497,7 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { c.Assert(terr.Code(), Equals, errors.ErrCode(mysql.ErrDataOutOfRange)) c.Assert(rs.Close(), IsNil) - //for exp + // for exp result = tk.MustQuery("select exp(0), exp(1), exp(-1), exp(1.2), exp(NULL)") result.Check(testkit.Rows("1 2.718281828459045 0.36787944117144233 3.3201169227365472 ")) result = tk.MustQuery("select exp('tidb'), exp('1tidb')") @@ -515,6 +534,42 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { result.Check(testkit.Rows("")) result = tk.MustQuery("SELECT CONV('a', 37, 10);") result.Check(testkit.Rows("")) + result = tk.MustQuery("SELECT CONV(0x0020, 2, 2);") + result.Check(testkit.Rows("100000")) + result = tk.MustQuery("SELECT CONV(0b10, 16, 2)") + result.Check(testkit.Rows("10")) + result = tk.MustQuery("SELECT CONV(0b10, 16, 8)") + result.Check(testkit.Rows("2")) + tk.MustExec("drop table if exists bit") + tk.MustExec("create table bit(b bit(10))") + tk.MustExec(`INSERT INTO bit (b) VALUES + (0b0000010101), + (0b0000010101), + (NULL), + (0b0000000001), + (0b0000000000), + (0b1111111111), + (0b1111111111), + (0b1111111111), + (0b0000000000), + (0b0000000000), + (0b0000000000), + (0b0000000000), + (0b0000100000);`) + tk.MustQuery("select conv(b, 2, 2) from `bit`").Check(testkit.Rows( + "10101", + "10101", + "", + "1", + "0", + "1111111111", + "1111111111", + "1111111111", + "0", + "0", + "0", + "0", + "100000")) // for abs result = tk.MustQuery("SELECT ABS(-1);") @@ -543,7 +598,7 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { // for round result = tk.MustQuery("SELECT ROUND(2.5), ROUND(-2.5), ROUND(25E-1);") - result.Check(testkit.Rows("3 -3 3")) // TODO: Should be 3 -3 2 + result.Check(testkit.Rows("3 -3 2")) result = tk.MustQuery("SELECT ROUND(2.5, NULL), ROUND(NULL, 4), ROUND(NULL, NULL), ROUND(NULL);") result.Check(testkit.Rows(" ")) result = tk.MustQuery("SELECT ROUND('123.4'), ROUND('123e-2');") @@ -554,6 +609,10 @@ func (s *testIntegrationSuite2) TestMathBuiltin(c *C) { result.Check(testkit.Rows("123 123.5 123.46 123.456 123.4560 120 100 0 0")) result = tk.MustQuery("SELECT ROUND(123456E-3, 0), ROUND(123456E-3, 1), ROUND(123456E-3, 2), ROUND(123456E-3, 3), ROUND(123456E-3, 4), ROUND(123456E-3, -1), ROUND(123456E-3, -2), ROUND(123456E-3, -3), ROUND(123456E-3, -4);") result.Check(testkit.Rows("123 123.5 123.46 123.456 123.456 120 100 0 0")) // TODO: Column 5 should be 123.4560 + result = tk.MustQuery("SELECT ROUND(1e14, 1), ROUND(1e15, 1), ROUND(1e308, 1)") + result.Check(testkit.Rows("100000000000000 1000000000000000 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")) + result = tk.MustQuery("SELECT ROUND(1e-14, 1), ROUND(1e-15, 1), ROUND(1e-308, 1)") + result.Check(testkit.Rows("0 0 0")) // for truncate result = tk.MustQuery("SELECT truncate(123, -2), truncate(123, 2), truncate(123, 1), truncate(123, -1);") @@ -658,7 +717,6 @@ func (s *testIntegrationSuite2) TestStringBuiltin(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - ctx := context.Background() var err error // for length @@ -1054,12 +1112,9 @@ func (s *testIntegrationSuite2) TestStringBuiltin(c *C) { result.Check(testkit.Rows("12,332.1000 12,332 12,332.20")) result = tk.MustQuery(`select format(NULL, 4), format(12332.2, NULL);`) result.Check(testkit.Rows(" ")) - rs, err := tk.Exec(`select format(12332.2, 2,'es_EC');`) - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) - c.Assert(err.Error(), Matches, "not support for the specific locale") - c.Assert(rs.Close(), IsNil) + result = tk.MustQuery(`select format(12332.2, 2,'es_EC');`) + result.Check(testkit.Rows("12,332.20")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1649 Unknown locale: 'es_EC'")) // for field result = tk.MustQuery(`select field(1, 2, 1), field(1, 0, NULL), field(1, NULL, 2, 1), field(NULL, 1, 2, NULL);`) @@ -1468,6 +1523,9 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { result.Check(testkit.Rows("2003-12-31 00:00:00 2004-01-01 00:00:00")) result = tk.MustQuery("select timestamp(20170118123950.123), timestamp(20170118123950.999);") result.Check(testkit.Rows("2017-01-18 12:39:50.123 2017-01-18 12:39:50.999")) + // Issue https://github.com/pingcap/tidb/issues/20003 + result = tk.MustQuery("select timestamp(0.0001, 0.00001);") + result.Check(testkit.Rows("")) result = tk.MustQuery("select timestamp('2003-12-31', '01:01:01.01'), timestamp('2003-12-31 12:34', '01:01:01.01')," + " timestamp('2008-12-31','00:00:00.0'), timestamp('2008-12-31 00:00:00.000');") @@ -1641,7 +1699,11 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { // result = tk.MustQuery("select time('2003-12-10-10 01:02:03.000123')") // result.Check(testkit.Rows("00:20:03") - //for hour + // Issue 20995 + result = tk.MustQuery("select time('0.1234567')") + result.Check(testkit.Rows("00:00:00.123457")) + + // for hour result = tk.MustQuery(`SELECT hour("12:13:14.123456"), hour("12:13:14.000010"), hour("272:59:55"), hour(020005), hour(null), hour("27aaaa2:59:55");`) result.Check(testkit.Rows("12 12 272 2 ")) @@ -1740,7 +1802,7 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { result.Check(testkit.Rows(" 0")) tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect time value: '0'", - "Warning|1292|Incorrect time value: '0.0'")) + "Warning|1292|Incorrect datetime value: '0.0'")) result = tk.MustQuery(`SELECT DATE_FORMAT(0, '%W %M %e %Y %r %y'), DATE_FORMAT(0.0, '%W %M %e %Y %r %y');`) result.Check(testkit.Rows(" ")) tk.MustQuery("show warnings").Check(testkit.Rows()) @@ -1781,8 +1843,7 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { _, err = tk.Exec(`delete from t where a = dayOfWeek(123)`) c.Assert(err, IsNil) - _, err = tk.Exec("insert into t value(dayOfMonth('2017-00-00'))") - c.Assert(table.ErrTruncatedWrongValueForField.Equal(err), IsTrue) + tk.MustExec("insert into t value(dayOfMonth('2017-00-00'))") tk.MustExec("insert into t value(dayOfMonth('0000-00-00'))") tk.MustExec(`update t set a = dayOfMonth("0000-00-00")`) tk.MustExec("set sql_mode = 'NO_ZERO_DATE';") @@ -1842,10 +1903,10 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { result.Check(testkit.Rows("0")) result = tk.MustQuery("SELECT UNIX_TIMESTAMP(0);") result.Check(testkit.Rows("0")) - //result = tk.MustQuery("SELECT UNIX_TIMESTAMP(-1);") - //result.Check(testkit.Rows("0")) - //result = tk.MustQuery("SELECT UNIX_TIMESTAMP(12345);") - //result.Check(testkit.Rows("0")) + // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(-1);") + // result.Check(testkit.Rows("0")) + // result = tk.MustQuery("SELECT UNIX_TIMESTAMP(12345);") + // result.Check(testkit.Rows("0")) result = tk.MustQuery("SELECT UNIX_TIMESTAMP('2017-01-01')") result.Check(testkit.Rows("1483228800")) // Test different time zone. @@ -1907,6 +1968,21 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00.000000'", "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'", "Warning|1292|Incorrect datetime value: '0000-01-00 00:00:00.000000'")) + // for dayname implicit cast to boolean and real + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07')`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is true`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-07') is false`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08')`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is true`) + result.Check(testkit.Rows("1")) + result = tk.MustQuery(`select 1 from dual where dayname('2016-03-08') is false`) + result.Check(testkit.Rows()) + result = tk.MustQuery(`select cast(dayname("2016-03-07") as double), cast(dayname("2016-03-08") as double)`) + result.Check(testkit.Rows("0 1")) // for sec_to_time result = tk.MustQuery("select sec_to_time(NULL)") @@ -1935,13 +2011,28 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) result = tk.MustQuery("select str_to_date('aaa01-01-2017', 'aaa%d-%m-%Y'), str_to_date('59:20:12 aaa01-01-2017', '%s:%i:%H aaa%d-%m-%Y'), str_to_date('59:20:12aaa', '%s:%i:%Haaa')") result.Check(testkit.Rows("2017-01-01 2017-01-01 12:20:59 12:20:59")) + result = tk.MustQuery("select str_to_date('01-01-2017', '%d'), str_to_date('59', '%d-%Y')") // TODO: MySQL returns " ". result.Check(testkit.Rows("0000-00-01 ")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00'")) + result = tk.MustQuery("show warnings") + result.Sort().Check(testutil.RowsWithSep("|", + "Warning|1292|Incorrect datetime value: '0000-00-00 00:00:00'", + "Warning|1292|Truncated incorrect datetime value: '01-01-2017'")) + result = tk.MustQuery("select str_to_date('2018-6-1', '%Y-%m-%d'), str_to_date('2018-6-1', '%Y-%c-%d'), str_to_date('59:20:1', '%s:%i:%k'), str_to_date('59:20:1', '%s:%i:%l')") result.Check(testkit.Rows("2018-06-01 2018-06-01 01:20:59 01:20:59")) + result = tk.MustQuery("select str_to_date('2020-07-04 11:22:33 PM c', '%Y-%m-%d %r')") + result.Check(testkit.Rows("2020-07-04 23:22:33")) + result = tk.MustQuery("show warnings") + result.Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect datetime value: '2020-07-04 11:22:33 PM c'")) + + result = tk.MustQuery("select str_to_date('11:22:33 PM', ' %r')") + result.Check(testkit.Rows("23:22:33")) + result = tk.MustQuery("show warnings") + result.Check(testkit.Rows()) + // for maketime tk.MustExec(`drop table if exists t`) tk.MustExec(`create table t(a double, b float, c decimal(10,4));`) @@ -1988,6 +2079,16 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { // for extract result = tk.MustQuery(`select extract(day from '800:12:12'), extract(hour from '800:12:12'), extract(month from 20170101), extract(day_second from '2017-01-01 12:12:12')`) result.Check(testkit.Rows("12 800 1 1121212")) + result = tk.MustQuery("select extract(day_microsecond from '2017-01-01 12:12:12'), extract(day_microsecond from '01 12:12:12'), extract(day_microsecond from '12:12:12'), extract(day_microsecond from '01 00:00:00.89')") + result.Check(testkit.Rows("1121212000000 361212000000 121212000000 240000890000")) + result = tk.MustQuery("select extract(day_second from '2017-01-01 12:12:12'), extract(day_second from '01 12:12:12'), extract(day_second from '12:12:12'), extract(day_second from '01 00:00:00.89')") + result.Check(testkit.Rows("1121212 361212 121212 240000")) + result = tk.MustQuery("select extract(day_minute from '2017-01-01 12:12:12'), extract(day_minute from '01 12:12:12'), extract(day_minute from '12:12:12'), extract(day_minute from '01 00:00:00.89')") + result.Check(testkit.Rows("11212 3612 1212 2400")) + result = tk.MustQuery("select extract(day_hour from '2017-01-01 12:12:12'), extract(day_hour from '01 12:12:12'), extract(day_hour from '12:12:12'), extract(day_hour from '01 00:00:00.89')") + result.Check(testkit.Rows("112 36 12 24")) + result = tk.MustQuery("select extract(day_microsecond from cast('2017-01-01 12:12:12' as datetime)), extract(day_second from cast('2017-01-01 12:12:12' as datetime)), extract(day_minute from cast('2017-01-01 12:12:12' as datetime)), extract(day_hour from cast('2017-01-01 12:12:12' as datetime))") + result.Check(testkit.Rows("1121212000000 1121212 11212 112")) // for adddate, subdate dateArithmeticalTests := []struct { @@ -2101,7 +2202,7 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { {"\"2009-01-01\"", "6/4", "HOUR_MINUTE", "2009-01-04 12:20:00", "2008-12-28 11:40:00"}, {"\"2009-01-01\"", "6/0", "HOUR_MINUTE", "", ""}, {"\"1970-01-01 12:00:00\"", "CAST(6/4 AS DECIMAL(3,1))", "HOUR_MINUTE", "1970-01-01 13:05:00", "1970-01-01 10:55:00"}, - //for issue #8077 + // for issue #8077 {"\"2012-01-02\"", "\"prefix8\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, {"\"2012-01-02\"", "\"prefix8prefix\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, {"\"2012-01-02\"", "\"8:00\"", "HOUR", "2012-01-02 08:00:00", "2012-01-01 16:00:00"}, @@ -2170,6 +2271,44 @@ func (s *testIntegrationSuite2) TestTimeBuiltin(c *C) { result = tk.MustQuery("select time(\"-- --1\");") result.Check(testkit.Rows("00:00:00")) tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '-- --1'")) + + // fix issue #15185 + result = tk.MustQuery(`select timestamp(11111.1111)`) + result.Check(testkit.Rows("2001-11-11 00:00:00.0000")) + result = tk.MustQuery(`select timestamp(cast(11111.1111 as decimal(60, 5)))`) + result.Check(testkit.Rows("2001-11-11 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(1021121141105.4324)`) + result.Check(testkit.Rows("0102-11-21 14:11:05.4324")) + result = tk.MustQuery(`select timestamp(cast(1021121141105.4324 as decimal(60, 5)))`) + result.Check(testkit.Rows("0102-11-21 14:11:05.43240")) + result = tk.MustQuery(`select timestamp(21121141105.101)`) + result.Check(testkit.Rows("2002-11-21 14:11:05.101")) + result = tk.MustQuery(`select timestamp(cast(21121141105.101 as decimal(60, 5)))`) + result.Check(testkit.Rows("2002-11-21 14:11:05.10100")) + result = tk.MustQuery(`select timestamp(1121141105.799055)`) + result.Check(testkit.Rows("2000-11-21 14:11:05.799055")) + result = tk.MustQuery(`select timestamp(cast(1121141105.799055 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-11-21 14:11:05.79906")) + result = tk.MustQuery(`select timestamp(121141105.123)`) + result.Check(testkit.Rows("2000-01-21 14:11:05.123")) + result = tk.MustQuery(`select timestamp(cast(121141105.123 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-01-21 14:11:05.12300")) + result = tk.MustQuery(`select timestamp(1141105)`) + result.Check(testkit.Rows("0114-11-05 00:00:00")) + result = tk.MustQuery(`select timestamp(cast(1141105 as decimal(60, 5)))`) + result.Check(testkit.Rows("0114-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(41105.11)`) + result.Check(testkit.Rows("2004-11-05 00:00:00.00")) + result = tk.MustQuery(`select timestamp(cast(41105.11 as decimal(60, 5)))`) + result.Check(testkit.Rows("2004-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(1105.3)`) + result.Check(testkit.Rows("2000-11-05 00:00:00.0")) + result = tk.MustQuery(`select timestamp(cast(1105.3 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-11-05 00:00:00.00000")) + result = tk.MustQuery(`select timestamp(105)`) + result.Check(testkit.Rows("2000-01-05 00:00:00")) + result = tk.MustQuery(`select timestamp(cast(105 as decimal(60, 5)))`) + result.Check(testkit.Rows("2000-01-05 00:00:00.00000")) } func (s *testIntegrationSuite) TestOpBuiltin(c *C) { @@ -2248,7 +2387,7 @@ func (s *testIntegrationSuite) TestDatetimeOverflow(c *C) { } tk.MustQuery("select * from t1").Check(testkit.Rows(rows...)) - //Fix ISSUE 11256 + // Fix ISSUE 11256 tk.MustQuery(`select DATE_ADD('2000-04-13 07:17:02',INTERVAL -1465647104 YEAR);`).Check(testkit.Rows("")) tk.MustQuery(`select DATE_ADD('2008-11-23 22:47:31',INTERVAL 266076160 QUARTER);`).Check(testkit.Rows("")) tk.MustQuery(`select DATE_SUB('2000-04-13 07:17:02',INTERVAL 1465647104 YEAR);`).Check(testkit.Rows("")) @@ -2259,7 +2398,6 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - ctx := context.Background() // for is true && is false tk.MustExec("drop table if exists t") @@ -2279,6 +2417,21 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { result.Check(testkit.Rows("1 0 0 0 0 1 0 1")) result = tk.MustQuery(`select 1 is false, 0 is false, null is false, "aaa" is false, "" is false, -12.00 is false, 0.0 is false, 0.0000001 is false;`) result.Check(testkit.Rows("0 1 0 1 1 0 1 0")) + // Issue https://github.com/pingcap/tidb/issues/19986 + result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where sec_to_time(2/10) is false") + result.Check(nil) + // Issue https://github.com/pingcap/tidb/issues/19999 + result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where timediff((7/'2014-07-07 02:30:02'),'2012-01-16') is false") + result.Check(nil) + // Issue https://github.com/pingcap/tidb/issues/20001 + result = tk.MustQuery("select 1 from dual where time(0.0001) is true") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select 1 from dual where time(0.0001) is false") + result.Check(nil) // for in result = tk.MustQuery("select * from t where b in (a)") @@ -2331,7 +2484,7 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { tk.MustExec(`insert into tb5 (a, b) select * from (select cast(a as json) as a1, b from tb5) as t where t.a1 = t.b;`) tk.MustExec(`drop table tb5;`) - tk.MustExec(`create table tb5(a float(64));`) + tk.MustExec(`create table tb5(a float(53));`) tk.MustExec(`insert into tb5(a) values (13835058055282163712);`) tk.MustQuery(`select convert(t.a1, signed int) from (select convert(a, json) as a1 from tb5) as t`) tk.MustExec(`drop table tb5;`) @@ -2698,12 +2851,9 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { c.Assert(err, NotNil) // test case decimal precision less than the scale. - rs, err := tk.Exec("select cast(12.1 as decimal(3, 4));") - c.Assert(err, IsNil) - _, err = session.GetRows4Test(ctx, tk.Se, rs) + _, err = tk.Exec("select cast(12.1 as decimal(3, 4));") c.Assert(err, NotNil) - c.Assert(err.Error(), Equals, "[types:1427]For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '').") - c.Assert(rs.Close(), IsNil) + c.Assert(err.Error(), Equals, "[types:1427]For float(M,D), double(M,D) or decimal(M,D), M must be >= D (column '12.1').") // test unhex and hex result = tk.MustQuery("select unhex('4D7953514C')") @@ -2811,6 +2961,16 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { result.Check(testkit.Rows(" 4")) result = tk.MustQuery("select * from t where b = case when a is null then 4 when a = 'str5' then 7 else 9 end") result.Check(testkit.Rows(" 4")) + + // return type of case when expr should not include NotNullFlag. issue-23036 + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1(c1 int not null)") + tk.MustExec("insert into t1 values(1)") + result = tk.MustQuery("select (case when null then c1 end) is null from t1") + result.Check(testkit.Rows("1")) + result = tk.MustQuery("select (case when null then c1 end) is not null from t1") + result.Check(testkit.Rows("0")) + // test warnings tk.MustQuery("select case when b=0 then 1 else 1/b end from t") tk.MustQuery("show warnings").Check(testkit.Rows()) @@ -2843,6 +3003,15 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { tk.MustQuery("select 1 or b/0 from t") tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select 1 or 1/0") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select 0 and 1/0") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select COALESCE(1, 1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select interval(1,0,1,2,1/0)") + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustQuery("select case 2.0 when 2.0 then 3.0 when 3.0 then 2.0 end").Check(testkit.Rows("3.0")) tk.MustQuery("select case 2.0 when 3.0 then 2.0 when 4.0 then 3.0 else 5.0 end").Check(testkit.Rows("5.0")) tk.MustQuery("select case cast('2011-01-01' as date) when cast('2011-01-01' as date) then cast('2011-02-02' as date) end").Check(testkit.Rows("2011-02-02")) @@ -2978,6 +3147,17 @@ func (s *testIntegrationSuite2) TestBuiltin(c *C) { result.Check(testkit.Rows("0")) } +func (s *testIntegrationSuite2) TestIssue11648(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int NOT NULL DEFAULT 8);") + tk.MustExec("SET sql_mode = '';") + tk.MustExec("insert into t values (1), (NULL), (2);") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1048 Column 'id' cannot be null")) + tk.MustQuery("select * from t").Check(testkit.Rows("1", "0", "2")) +} + func (s *testIntegrationSuite) TestInfoBuiltin(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) @@ -3245,41 +3425,62 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { result.Check(testkit.Rows("-10.001 1.989 1.99899 -10.00101", "-12.100 -0.110 -0.10001 -12.10001")) result = tk.MustQuery("SELECT 1-12, 21-0.01, 89-\"11\", 12-\"a\", 12-NULL, NULL-1, NULL-NULL;") result.Check(testkit.Rows("-11 20.99 78 12 ")) + tk.MustExec("DROP TABLE IF EXISTS t;") tk.MustExec("CREATE TABLE t(a BIGINT UNSIGNED, b BIGINT UNSIGNED);") tk.MustExec("INSERT INTO t SELECT 1, 4;") - rs, err = tk.Exec("SELECT a-b FROM t;") - c.Assert(errors.ErrorStack(err), Equals, "") - c.Assert(rs, NotNil) - rows, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) + err = tk.QueryToErr("SELECT a-b FROM t;") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(test.t.a - test.t.b)'") - c.Assert(rs.Close(), IsNil) - rs, err = tk.Exec("select cast(-1 as signed) - cast(-1 as unsigned);") - c.Assert(errors.ErrorStack(err), Equals, "") - c.Assert(rs, NotNil) - rows, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) + + err = tk.QueryToErr("select cast(1 as unsigned) - cast(4 as unsigned);") + c.Assert(err, NotNil) + // TODO: make error compatible with MySQL, should be BIGINT UNSIGNED value is out of range in '(cast(1 as unsigned) - cast(4 as unsigned)) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 4)'") + + err = tk.QueryToErr("select cast(-1 as signed) - cast(-1 as unsigned);") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(-1 - 18446744073709551615)'") - c.Assert(rs.Close(), IsNil) - rs, err = tk.Exec("select cast(-1 as unsigned) - cast(-1 as signed);") - c.Assert(errors.ErrorStack(err), Equals, "") - c.Assert(rs, NotNil) - rows, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(rows, IsNil) + + err = tk.QueryToErr("select cast(1 as signed) - cast(-1 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(1 - 18446744073709551615)'") + + err = tk.QueryToErr("select cast(-1 as unsigned) - cast(-1 as signed);") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(18446744073709551615 - -1)'") - c.Assert(rs.Close(), IsNil) - tk.MustQuery(`select cast(-3 as unsigned) - cast(-1 as signed);`).Check(testkit.Rows("18446744073709551614")) - tk.MustQuery("select 1.11 - 1.11;").Check(testkit.Rows("0.00")) + + err = tk.QueryToErr("select cast(-9223372036854775808 as unsigned) - (-9223372036854775808);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(9223372036854775808 - -9223372036854775808)'") + + err = tk.QueryToErr("select cast(12 as unsigned) - (14);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(12 - 14)'") + + err = tk.QueryToErr("select cast(9223372036854775807 as signed) - cast(-1 as signed);") + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(9223372036854775807 - -1)'") + + err = tk.QueryToErr("select cast(-9223372036854775808 as signed) - cast(1 as signed);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-9223372036854775808 - 1)'") + + err = tk.QueryToErr("select cast(12 as signed) - cast(-9223372036854775808 as signed);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(12 - -9223372036854775808)'") + tk.MustExec(`create table tb5(a int(10));`) tk.MustExec(`insert into tb5 (a) values (10);`) e := tk.QueryToErr(`select * from tb5 where a - -9223372036854775808;`) c.Assert(e, NotNil) c.Assert(strings.HasSuffix(e.Error(), `BIGINT value is out of range in '(Column#0 - -9223372036854775808)'`), IsTrue, Commentf("err: %v", err)) + tk.MustExec(`drop table tb5`) + tk.MustQuery("select cast(-9223372036854775808 as unsigned) - (-9223372036854775807);").Check(testkit.Rows("18446744073709551615")) + tk.MustQuery("select cast(-3 as unsigned) - cast(-1 as signed);").Check(testkit.Rows("18446744073709551614")) + tk.MustQuery("select 1.11 - 1.11;").Check(testkit.Rows("0.00")) + tk.MustQuery("select cast(-1 as unsigned) - cast(-12 as unsigned);").Check(testkit.Rows("11")) + tk.MustQuery("select cast(-1 as unsigned) - cast(0 as unsigned);").Check(testkit.Rows("18446744073709551615")) // for multiply tk.MustQuery("select 1234567890 * 1234567890").Check(testkit.Rows("1524157875019052100")) @@ -3296,8 +3497,8 @@ func (s *testIntegrationSuite) TestArithmeticBuiltin(c *C) { c.Assert(terror.ErrorEqual(err, types.ErrOverflow), IsTrue) c.Assert(rs.Close(), IsNil) // FIXME: There is something wrong in showing float number. - //tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * 1").Check(testkit.Rows("1.7976931348623157e308")) - //tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * -1").Check(testkit.Rows("-1.7976931348623157e308")) + // tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * 1").Check(testkit.Rows("1.7976931348623157e308")) + // tk.MustQuery("select 1.797693134862315708145274237317043567981e+308 * -1").Check(testkit.Rows("-1.7976931348623157e308")) rs, err = tk.Exec("select 1.797693134862315708145274237317043567981e+308 * 1.1") c.Assert(err, IsNil) _, err = session.GetRows4Test(ctx, tk.Se, rs) @@ -3556,8 +3757,8 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { // for greatest result = tk.MustQuery(`select greatest(1, 2, 3), greatest("a", "b", "c"), greatest(1.1, 1.2, 1.3), greatest("123a", 1, 2)`) - result.Check(testkit.Rows("3 c 1.3 123")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect FLOAT value: '123a'")) + result.Check(testkit.Rows("3 c 1.3 2")) + tk.MustQuery("show warnings").Check(testkit.Rows()) result = tk.MustQuery(`select greatest(cast("2017-01-01" as datetime), "123", "234", cast("2018-01-01" as date)), greatest(cast("2017-01-01" as date), "123", null)`) // todo: MySQL returns "2018-01-01 " result.Check(testkit.Rows("2018-01-01 00:00:00 ")) @@ -3565,7 +3766,7 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { // for least result = tk.MustQuery(`select least(1, 2, 3), least("a", "b", "c"), least(1.1, 1.2, 1.3), least("123a", 1, 2)`) result.Check(testkit.Rows("1 a 1.1 1")) - tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Truncated incorrect FLOAT value: '123a'")) + tk.MustQuery("show warnings").Check(testkit.Rows()) result = tk.MustQuery(`select least(cast("2017-01-01" as datetime), "123", "234", cast("2018-01-01" as date)), least(cast("2017-01-01" as date), "123", null)`) result.Check(testkit.Rows("123 ")) tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning|1292|Incorrect time value: '123'", "Warning|1292|Incorrect time value: '234'", "Warning|1292|Incorrect time value: '123'")) @@ -3605,10 +3806,22 @@ func (s *testIntegrationSuite) TestCompareBuiltin(c *C) { result.Check(testkit.Rows("0")) } +// #23157: make sure if Nullif expr is correct combined with IsNull expr. +func (s *testIntegrationSuite) TestNullifWithIsNull(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null);") + tk.MustExec("insert into t values(1),(2);") + rows := tk.MustQuery("select * from t where nullif(a,a) is null;") + rows.Check(testkit.Rows("1", "2")) +} + func (s *testIntegrationSuite) TestAggregationBuiltin(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") + tk.MustExec("drop table if exists t") tk.MustExec("create table t(a decimal(7, 6))") tk.MustExec("insert into t values(1.123456), (1.123456)") result := tk.MustQuery("select avg(a) from t") @@ -3633,6 +3846,8 @@ func (s *testIntegrationSuite) TestAggregationBuiltin(c *C) { result.Check(testkit.Rows("0")) result = tk.MustQuery("select bit_and(a) from t") result.Check(testkit.Rows("18446744073709551615")) + result = tk.MustQuery("select count(1) from (select count(1) from t) as t1") + result.Check(testkit.Rows("1")) } func (s *testIntegrationSuite) TestAggregationBuiltinBitOr(c *C) { @@ -3728,7 +3943,8 @@ func (s *testIntegrationSuite) TestAggregationBuiltinGroupConcat(c *C) { _, err := tk.Exec("insert into d select group_concat(a) from t") c.Assert(errors.Cause(err).(*terror.Error).Code(), Equals, errors.ErrCode(mysql.ErrCutValueGroupConcat)) - tk.Exec("set sql_mode=''") + _, err = tk.Exec("set sql_mode=''") + c.Assert(err, IsNil) tk.MustExec("insert into d select group_concat(a) from t") tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", "Warning 1260 Some rows were cut by GROUPCONCAT(test.t.a)")) tk.MustQuery("select * from d").Check(testkit.Rows("hello,h")) @@ -3752,7 +3968,7 @@ func (s *testIntegrationSuite) TestAggregationBuiltinJSONObjectAgg(c *C) { i char(36), j text(50));`) - tk.MustExec(`insert into t values(1, 'ab', 5.5, '{"id": 1}', '2020-01-10', '11:12:13', '2020-01-11', '0000-00-00 00:00:00', 'first', 'json_objectagg_test');`) + tk.MustExec(`insert into t values(1, 'ab', 5.5, '{"id": 1}', '2020-01-10', '11:12:13', '2020-01-11', '2020-10-18 00:00:00', 'first', 'json_objectagg_test');`) result := tk.MustQuery("select json_objectagg(a, b) from t group by a order by a;") result.Check(testkit.Rows(`{"1": "ab"}`)) @@ -3763,9 +3979,9 @@ func (s *testIntegrationSuite) TestAggregationBuiltinJSONObjectAgg(c *C) { result = tk.MustQuery("select json_objectagg(f, g) from t group by f order by f;") result.Check(testkit.Rows(`{"11:12:13": "2020-01-11 00:00:00"}`)) result = tk.MustQuery("select json_objectagg(g, h) from t group by g order by g;") - result.Check(testkit.Rows(`{"2020-01-11 00:00:00": "0000-00-00 00:00:00"}`)) + result.Check(testkit.Rows(`{"2020-01-11 00:00:00": "2020-10-18 00:00:00"}`)) result = tk.MustQuery("select json_objectagg(h, i) from t group by h order by h;") - result.Check(testkit.Rows(`{"0000-00-00 00:00:00": "first"}`)) + result.Check(testkit.Rows(`{"2020-10-18 00:00:00": "first"}`)) result = tk.MustQuery("select json_objectagg(i, j) from t group by i order by i;") result.Check(testkit.Rows(`{"first": "json_objectagg_test"}`)) result = tk.MustQuery("select json_objectagg(a, null) from t group by a order by a;") @@ -4260,6 +4476,13 @@ func (s *testIntegrationSuite) TestFuncJSON(c *C) { // #16267 tk.MustQuery(`select json_array(922337203685477580) = json_array(922337203685477581);`).Check(testkit.Rows("0")) + + // #10461 + tk.MustExec("drop table if exists tx1") + tk.MustExec("create table tx1(id int key, a double, b double, c double, d double)") + tk.MustExec("insert into tx1 values (1, 0.1, 0.2, 0.3, 0.0)") + tk.MustQuery("select a+b, c from tx1").Check(testkit.Rows("0.30000000000000004 0.3")) + tk.MustQuery("select json_array(a+b) = json_array(c) from tx1").Check(testkit.Rows("0")) } func (s *testIntegrationSuite) TestColumnInfoModified(c *C) { @@ -4521,6 +4744,10 @@ func (s *testIntegrationSuite) TestTiDBDecodePlanFunc(c *C) { "\t └─IndexReader_28 \troot\t1 \tindex:Limit_27 \t1 \ttime:216.85µs, loops:1, rpc num: 1, rpc time:150.824µs, proc keys:0\t198 Bytes\tN/A\n" + "\t └─Limit_27 \tcop \t1 \toffset:0, count:1 \t1 \ttime:57.396µs, loops:2 \tN/A \tN/A\n" + "\t └─IndexScan_26\tcop \t1 \ttable:t, index:idx(a), range:(0,+inf], keep order:true, desc\t1 \ttime:56.661µs, loops:1 \tN/A \tN/A")) + + // Test issue16939 + tk.MustQuery("select tidb_decode_plan(query), time from information_schema.slow_query order by time desc limit 1;") + tk.MustQuery("select tidb_decode_plan('xxx')").Check(testkit.Rows("xxx")) } func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { @@ -4528,14 +4755,14 @@ func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { defer s.cleanEnv(c) var result *testkit.Result result = tk.MustQuery("select tidb_decode_key( '74800000000000002B5F72800000000000A5D3' )") - result.Check(testkit.Rows("tableID=43, _tidb_rowid=42451")) + result.Check(testkit.Rows(`{"_tidb_rowid":42451,"table_id":"43"}`)) result = tk.MustQuery("select tidb_decode_key( '7480000000000000325f7205bff199999999999a013131000000000000f9' )") - result.Check(testkit.Rows("tableID=50, clusterHandle={1.1, 11}")) + result.Check(testkit.Rows(`{"handle":"{1.1, 11}","table_id":50}`)) result = tk.MustQuery("select tidb_decode_key( '74800000000000019B5F698000000000000001015257303100000000FB013736383232313130FF3900000000000000F8010000000000000000F7' )") - result.Check(testkit.Rows("tableID=411, indexID=1, indexValues=RW01,768221109,")) + result.Check(testkit.Rows(`{"index_id":1,"index_vals":"RW01, 768221109, ","table_id":411}`)) result = tk.MustQuery("select tidb_decode_key( '7480000000000000695F698000000000000001038000000000004E20' )") - result.Check(testkit.Rows("tableID=105, indexID=1, indexValues=20000")) + result.Check(testkit.Rows(`{"index_id":1,"index_vals":"20000","table_id":105}`)) // Test invalid record/index key. result = tk.MustQuery("select tidb_decode_key( '7480000000000000FF2E5F728000000011FFE1A3000000000000' )") @@ -4543,6 +4770,69 @@ func (s *testIntegrationSuite) TestTiDBInternalFunc(c *C) { warns := tk.Se.GetSessionVars().StmtCtx.GetWarnings() c.Assert(warns, HasLen, 1) c.Assert(warns[0].Err.Error(), Equals, "invalid record/index key: 7480000000000000FF2E5F728000000011FFE1A3000000000000") + + // Test in real tables. + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255), b int, c datetime, primary key (a, b, c));") + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + getTime := func(year, month, day int, timeType byte) types.Time { + ret := types.NewTime(types.FromDate(year, month, day, 0, 0, 0, 0), timeType, types.DefaultFsp) + return ret + } + buildCommonKeyFromData := func(tableID int64, data []types.Datum) string { + k, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, data...) + c.Assert(err, IsNil) + h, err := kv.NewCommonHandle(k) + c.Assert(err, IsNil) + k = tablecodec.EncodeRowKeyWithHandle(tableID, h) + hexKey := hex.EncodeToString(codec.EncodeBytes(nil, k)) + return hexKey + } + // split table t by ('bbbb', 10, '2020-01-01'); + data := []types.Datum{types.NewStringDatum("bbbb"), types.NewIntDatum(10), types.NewTimeDatum(getTime(2020, 1, 1, mysql.TypeDatetime))} + hexKey := buildCommonKeyFromData(tbl.Meta().ID, data) + sql := fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + result = tk.MustQuery(sql) + rs := fmt.Sprintf(`{"handle":{"a":"bbbb","b":"10","c":"2020-01-01 00:00:00"},"table_id":%d}`, tbl.Meta().ID) + result.Check(testkit.Rows(rs)) + + // split table t by ('bbbb', 10, null); + data = []types.Datum{types.NewStringDatum("bbbb"), types.NewIntDatum(10), types.NewDatum(nil)} + hexKey = buildCommonKeyFromData(tbl.Meta().ID, data) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + tk.MustQuery(sql).Check(testkit.Rows(hexKey)) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255), b int, c datetime, index idx(a, b, c));") + dom = domain.GetDomain(tk.Se) + is = dom.InfoSchema() + tbl, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + buildIndexKeyFromData := func(tableID, indexID int64, data []types.Datum) string { + k, err := codec.EncodeKey(tk.Se.GetSessionVars().StmtCtx, nil, data...) + c.Assert(err, IsNil) + k = tablecodec.EncodeIndexSeekKey(tableID, indexID, k) + hexKey := hex.EncodeToString(codec.EncodeBytes(nil, k)) + return hexKey + } + // split table t index idx by ('aaaaa', 100, '2000-01-01'); + data = []types.Datum{types.NewStringDatum("aaaaa"), types.NewIntDatum(100), types.NewTimeDatum(getTime(2000, 1, 1, mysql.TypeDatetime))} + hexKey = buildIndexKeyFromData(tbl.Meta().ID, tbl.Indices()[0].Meta().ID, data) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + result = tk.MustQuery(sql) + rs = fmt.Sprintf(`{"index_id":1,"index_vals":{"a":"aaaaa","b":"100","c":"2000-01-01 00:00:00"},"table_id":%d}`, tbl.Meta().ID) + result.Check(testkit.Rows(rs)) + // split table t index idx by (null, null, null); + data = []types.Datum{types.NewDatum(nil), types.NewDatum(nil), types.NewDatum(nil)} + hexKey = buildIndexKeyFromData(tbl.Meta().ID, tbl.Indices()[0].Meta().ID, data) + sql = fmt.Sprintf("select tidb_decode_key( '%s' )", hexKey) + result = tk.MustQuery(sql) + rs = fmt.Sprintf(`{"index_id":1,"index_vals":{"a":null,"b":null,"c":null},"table_id":%d}`, tbl.Meta().ID) + result.Check(testkit.Rows(rs)) } func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { @@ -5022,10 +5312,10 @@ func (s *testIntegrationSuite) TestTimestampDatumEncode(c *C) { tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t (a bigint primary key, b timestamp)`) tk.MustExec(`insert into t values (1, "2019-04-29 11:56:12")`) - tk.MustQuery(`explain select * from t where b = (select max(b) from t)`).Check(testkit.Rows( - "TableReader_43 10.00 root data:Selection_42", - "└─Selection_42 10.00 cop[tikv] eq(test.t.b, 2019-04-29 11:56:12)", - " └─TableFullScan_41 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + tk.MustQuery(`explain format = 'brief' select * from t where b = (select max(b) from t)`).Check(testkit.Rows( + "TableReader 10.00 root data:Selection", + "└─Selection 10.00 cop[tikv] eq(test.t.b, 2019-04-29 11:56:12)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", )) tk.MustQuery(`select * from t where b = (select max(b) from t)`).Check(testkit.Rows(`1 2019-04-29 11:56:12`)) } @@ -5071,7 +5361,7 @@ func (s *testIntegrationSuite) TestExprPushdown(c *C) { "(4,'511111','611',7,8,9),(5,'611111','711',8,9,10)") // case 1, index scan without double read, some filters can not be pushed to cop task - rows := tk.MustQuery("explain select col2, col1 from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() + rows := tk.MustQuery("explain format = 'brief' select col2, col1 from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\")") c.Assert(fmt.Sprintf("%v", rows[3][2]), Equals, "cop[tikv]") @@ -5080,14 +5370,14 @@ func (s *testIntegrationSuite) TestExprPushdown(c *C) { tk.MustQuery("select count(col2) from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 2, index scan without double read, none of the filters can be pushed to cop task - rows = tk.MustQuery("explain select col1, col2 from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() + rows = tk.MustQuery("explain format = 'brief' select col1, col2 from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() c.Assert(fmt.Sprintf("%v", rows[0][2]), Equals, "root") c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")") tk.MustQuery("select col1, col2 from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("411111 511")) tk.MustQuery("select count(col1) from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 3, index scan with double read, some filters can not be pushed to cop task - rows = tk.MustQuery("explain select id from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() + rows = tk.MustQuery("explain format = 'brief' select id from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Rows() c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\")") c.Assert(fmt.Sprintf("%v", rows[3][2]), Equals, "cop[tikv]") @@ -5096,7 +5386,7 @@ func (s *testIntegrationSuite) TestExprPushdown(c *C) { tk.MustQuery("select count(id) from t use index(key1) where col2 like '5%' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("1")) // case 4, index scan with double read, none of the filters can be pushed to cop task - rows = tk.MustQuery("explain select id from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() + rows = tk.MustQuery("explain format = 'brief' select id from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Rows() c.Assert(fmt.Sprintf("%v", rows[1][2]), Equals, "root") c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(substr(test.t.col1, 1, 1), \"4\"), eq(substr(test.t.col2, 1, 1), \"5\")") tk.MustQuery("select id from t use index(key2) where substr(col2, 1, 1) = '5' and substr(col1, 1, 1) = '4'").Check(testkit.Rows("3")) @@ -5106,7 +5396,7 @@ func (s *testIntegrationSuite) TestIssue16973(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t1") - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t1(id varchar(36) not null primary key, org_id varchar(36) not null, " + "status tinyint default 1 not null, ns varchar(36) default '' not null);") tk.MustExec("create table t2(id varchar(36) not null primary key, order_id varchar(36) not null, " + @@ -5117,7 +5407,7 @@ func (s *testIntegrationSuite) TestIssue16973(c *C) { tk.MustExec("insert into t1 value (3,1,3,'a');") tk.MustExec("insert into t2 value (1,2,date'2020-05-08');") - rows := tk.MustQuery("explain SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) " + + rows := tk.MustQuery("explain format = 'brief' SELECT /*+ INL_MERGE_JOIN(t1,t2) */ COUNT(*) FROM t1 LEFT JOIN t2 ON t1.id = t2.order_id WHERE t1.ns = 'a' AND t1.org_id IN (1) " + "AND t1.status IN (2,6,10) AND timestampdiff(month, t2.begin_time, date'2020-05-06') = 0;").Rows() c.Assert(fmt.Sprintf("%v", rows[1][0]), Matches, ".*IndexMergeJoin.*") c.Assert(fmt.Sprintf("%v", rows[4][3]), Equals, "table:t1") @@ -5130,8 +5420,7 @@ func (s *testIntegrationSuite) TestIssue16973(c *C) { func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustQuery(`select * from mysql.expr_pushdown_blacklist`).Check(testkit.Rows( - "date_add tiflash DST(daylight saving time) does not take effect in TiFlash date_add", - "cast tiflash Behavior of some corner cases(overflow, truncate etc) is different in TiFlash and TiDB")) + "date_add tiflash DST(daylight saving time) does not take effect in TiFlash date_add")) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -5152,21 +5441,21 @@ func (s *testIntegrationSuite) TestExprPushdownBlacklist(c *C) { } tk.MustExec("insert into mysql.expr_pushdown_blacklist " + - "values('<', 'tikv,tiflash,tidb', 'for test'),('date_format', 'tikv', 'for test')") + "values('<', 'tikv,tiflash,tidb', 'for test'),('cast', 'tiflash', 'for test'),('date_format', 'tikv', 'for test')") tk.MustExec("admin reload expr_pushdown_blacklist") tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") // < not pushed, cast only pushed to TiKV, date_format only pushed to TiFlash, // > pushed to both TiKV and TiFlash - rows := tk.MustQuery("explain select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + + rows := tk.MustQuery("explain format = 'brief' select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + "and cast(a as decimal(10,2)) > 10.10 and date_format(b,'%m') = '11'").Rows() c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "lt(test.t.b, 1994-01-01)") c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "gt(cast(test.t.a), 10.10)") c.Assert(fmt.Sprintf("%v", rows[3][4]), Equals, "eq(date_format(test.t.b, \"%m\"), \"11\"), gt(test.t.b, 1988-01-01)") tk.MustExec("set @@session.tidb_isolation_read_engines = 'tikv'") - rows = tk.MustQuery("explain select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + + rows = tk.MustQuery("explain format = 'brief' select * from test.t where b > date'1988-01-01' and b < date'1994-01-01' " + "and cast(a as decimal(10,2)) > 10.10 and date_format(b,'%m') = '11'").Rows() c.Assert(fmt.Sprintf("%v", rows[0][4]), Equals, "lt(test.t.b, 1994-01-01)") c.Assert(fmt.Sprintf("%v", rows[1][4]), Equals, "eq(date_format(test.t.b, \"%m\"), \"11\")") @@ -5340,8 +5629,8 @@ func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { testkit.Rows("2007-03-28 22:06:26")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR_SECOND);`).Check( testkit.Rows("2007-03-28 22:06:26")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" SECOND);`).Check( - // testkit.Rows("2007-03-28 22:08:25.800000")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:25.800000")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" YEAR);`).Check( testkit.Rows("2005-03-28 22:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" QUARTER);`).Check( @@ -5350,10 +5639,10 @@ func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { testkit.Rows("2007-01-28 22:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" WEEK);`).Check( testkit.Rows("2007-03-14 22:08:28")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY);`).Check( - // testkit.Rows("2007-03-26 22:08:28")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR);`).Check( - // testkit.Rows("2007-03-28 20:08:28")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" DAY);`).Check( + testkit.Rows("2007-03-26 22:08:28")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" HOUR);`).Check( + testkit.Rows("2007-03-28 20:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MINUTE);`).Check( testkit.Rows("2007-03-28 22:06:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.2" MICROSECOND);`).Check( @@ -5372,8 +5661,16 @@ func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { testkit.Rows("2007-03-28 22:06:26")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR_SECOND);`).Check( testkit.Rows("2007-03-28 22:06:26")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" SECOND);`).Check( - // testkit.Rows("2007-03-28 22:08:26")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:26")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.+2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:26")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.*2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:26")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2./2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:26")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.a2" SECOND);`).Check( + testkit.Rows("2007-03-28 22:08:26")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" YEAR);`).Check( testkit.Rows("2005-03-28 22:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" QUARTER);`).Check( @@ -5382,10 +5679,10 @@ func (s *testIntegrationSuite) TestDatetimeMicrosecond(c *C) { testkit.Rows("2007-01-28 22:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" WEEK);`).Check( testkit.Rows("2007-03-14 22:08:28")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY);`).Check( - // testkit.Rows("2007-03-26 22:08:28")) - // tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR);`).Check( - // testkit.Rows("2007-03-28 20:08:28")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" DAY);`).Check( + testkit.Rows("2007-03-26 22:08:28")) + tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" HOUR);`).Check( + testkit.Rows("2007-03-28 20:08:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MINUTE);`).Check( testkit.Rows("2007-03-28 22:06:28")) tk.MustQuery(`select DATE_ADD('2007-03-28 22:08:28',INTERVAL "-2.-2" MICROSECOND);`).Check( @@ -5593,6 +5890,34 @@ func (s *testIntegrationSuite) TestCastStrToInt(c *C) { } } +func (s *testIntegrationSerialSuite) TestPreparePlanCache(c *C) { + tk := testkit.NewTestKit(c, s.store) + + // Plan cache should now be off by default + c.Assert(plannercore.PreparedPlanCacheEnabled(), Equals, false) + + orgEnable := plannercore.PreparedPlanCacheEnabled() + defer func() { + plannercore.SetPreparedPlanCache(orgEnable) + }() + plannercore.SetPreparedPlanCache(true) + var err error + tk.Se, err = session.CreateSession4TestWithOpt(s.store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + // Use the example from the docs https://docs.pingcap.com/tidb/stable/sql-prepare-plan-cache + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("prepare stmt from 'select * from t where a = ?';") + tk.MustExec("set @a = 1;") + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("0")) + tk.MustExec("execute stmt using @a;") + tk.MustQuery("select @@last_plan_from_cache;").Check(testkit.Rows("1")) +} + func (s *testIntegrationSerialSuite) TestIssue16205(c *C) { tk := testkit.NewTestKit(c, s.store) orgEnable := plannercore.PreparedPlanCacheEnabled() @@ -5674,6 +5999,12 @@ func (s *testIntegrationSuite) TestIssue14146(c *C) { tk.MustQuery("select * from tt").Check(testkit.Rows("")) } +func (s *testIntegrationSuite) TestIssue15346(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustQuery("select collation(format_bytes(1024)) != 'binary';").Check(testkit.Rows("1")) + tk.MustQuery("select collation(format_nano_time(234)) != 'binary';").Check(testkit.Rows("1")) +} + func (s *testIntegrationSerialSuite) TestCacheRegexpr(c *C) { tk := testkit.NewTestKit(c, s.store) orgEnable := plannercore.PreparedPlanCacheEnabled() @@ -5832,9 +6163,6 @@ func (s *testIntegrationSuite) TestCollation(c *C) { tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci") tk.MustExec("set @test_collate_var = 'a'") tk.MustQuery("select collation(@test_collate_var)").Check(testkit.Rows("utf8mb4_general_ci")) - tk.MustExec("set names utf8mb4 collate utf8mb4_general_ci") - tk.MustExec("set @test_collate_var = 1") - tk.MustQuery("select collation(@test_collate_var)").Check(testkit.Rows("utf8mb4_general_ci")) tk.MustExec("set @test_collate_var = concat(\"a\", \"b\" collate utf8mb4_bin)") tk.MustQuery("select collation(@test_collate_var)").Check(testkit.Rows("utf8mb4_bin")) } @@ -5910,6 +6238,28 @@ func (s *testIntegrationSerialSuite) TestCacheConstEval(c *C) { tk.MustExec("admin reload expr_pushdown_blacklist") } +func (s *testSuite) TestIssue20071(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists table_30_utf8_4") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1)") + tk.MustExec("create table table_30_utf8_4 ( `pk` int primary key, `col_int_key_unsigned` int unsigned , `col_int_key_signed` int, `col_float_key_signed` float , `col_float_key_unsigned` float unsigned) character set utf8 partition by hash(pk) partitions 4;") + tk.MustExec("insert ignore into table_30_utf8_4 values (0,91, 10, 14,19.0495)") + tk.MustExec("alter table table_30_utf8_4 add column a int as (col_int_key_signed * 2)") + tk.MustExec("SELECT count(1) AS val FROM table_30_utf8_4 WHERE table_30_utf8_4.col_int_key_unsigned!=table_30_utf8_4.a OR (SELECT count(1) AS val FROM t WHERE table_30_utf8_4.col_float_key_signed!=table_30_utf8_4.col_float_key_unsigned )!=7984764426240273913;") + tk.MustExec("select a from table_30_utf8_4 order by a") +} + +func (s *testSuite) TestVirtualGeneratedColumnAndLimit(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int as (a + 1));") + tk.MustExec("insert into t(a) values (1);") + tk.MustQuery("select /*+ LIMIT_TO_COP() */ b from t limit 1;").Check(testkit.Rows("2")) + tk.MustQuery("select /*+ LIMIT_TO_COP() */ b from t order by b limit 1;").Check(testkit.Rows("2")) +} + func (s *testIntegrationSerialSuite) TestCollationBasic(c *C) { tk := testkit.NewTestKit(c, s.store) collate.SetNewCollationEnabledForTest(true) @@ -5951,6 +6301,15 @@ func (s *testIntegrationSerialSuite) TestCollationBasic(c *C) { tk.MustQuery("select a from t_ci where a='A'").Check(testkit.Rows("a")) tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) tk.MustQuery("select a from t_ci where a='a '").Check(testkit.Rows("a")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(c set('A', 'B') collate utf8mb4_general_ci);") + tk.MustExec("insert into t values('a');") + tk.MustExec("insert into t values('B');") + tk.MustQuery("select c from t where c = 'a';").Check(testkit.Rows("A")) + tk.MustQuery("select c from t where c = 'A';").Check(testkit.Rows("A")) + tk.MustQuery("select c from t where c = 'b';").Check(testkit.Rows("B")) + tk.MustQuery("select c from t where c = 'B';").Check(testkit.Rows("B")) } func (s *testIntegrationSerialSuite) TestWeightString(c *C) { @@ -6116,6 +6475,28 @@ func (s *testIntegrationSerialSuite) TestCollateConstantPropagation(c *C) { tk.MustExec("insert into t1 values ('ß', 's');") tk.MustExec("insert into t2 values ('s', 's')") tk.MustQuery("select * from t1 left join t2 on t1.a = t2.a collate utf8mb4_unicode_ci where t1.a = 's';").Check(testkit.Rows("ß s ")) + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1(a char(10) collate utf8mb4_general_ci, index (a));") + tk.MustExec("create table t2(a char(10) collate utf8_bin, index (a));") + tk.MustExec("insert into t1 values ('a');") + tk.MustExec("insert into t2 values ('A');") + tk.MustExec("set names utf8 collate utf8_general_ci;") + tk.MustQuery("select * from t1, t2 where t1.a=t2.a and t1.a= 'a';").Check(testkit.Rows("a A")) +} + +func (s *testIntegrationSuite2) TestIssue17791(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("SET sql_mode=DEFAULT;") + tk.MustExec("CREATE TABLE t1 (" + + " id INT NOT NULL PRIMARY KEY auto_increment," + + " pad VARCHAR(10) NOT NULL," + + " expr varchar(100) AS (NOT 1 BETWEEN -5 AND 5)" + + ");") + tk.MustExec("INSERT INTO t1 (pad) VALUES ('a'), ('b');") + tk.MustQuery("SELECT id, pad, expr, NOT 1 BETWEEN -5 AND 5 as expr_in_select FROM t1;").Check(testkit.Rows("1 a 0 0", "2 b 0 0")) } func (s *testIntegrationSerialSuite) TestMixCollation(c *C) { @@ -6599,7 +6980,7 @@ func (s *testIntegrationSerialSuite) TestNewCollationCheckClusterIndexTable(c *C tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") - tk.MustExec("set tidb_enable_clustered_index=1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(name char(255) primary key, b int, c int, index idx(name), unique index uidx(name))") tk.MustExec("insert into t values(\"aaaa\", 1, 1), (\"bbb\", 2, 2), (\"ccc\", 3, 3)") tk.MustExec("admin check table t") @@ -6707,7 +7088,7 @@ func (s *testIntegrationSerialSuite) TestNewCollationWithClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") - tk.MustExec("set tidb_enable_clustered_index=1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(d double primary key, a int, name varchar(255), index idx(name(2)), index midx(a, name))") tk.MustExec("insert into t values(2.11, 1, \"aa\"), (-1, 0, \"abcd\"), (9.99, 0, \"aaaa\")") tk.MustQuery("select d from t use index(idx) where name=\"aa\"").Check(testkit.Rows("2.11")) @@ -6855,6 +7236,41 @@ func (s *testIntegrationSuite) TestIssue16505(c *C) { tk.MustExec("drop table t;") } +func (s *testIntegrationSuite) TestIssue20121(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + // testcase for Datetime vs Year + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime, b year)") + tk.MustExec("insert into t values('2000-05-03 16:44:44', 2018)") + tk.MustExec("insert into t values('2020-10-01 11:11:11', 2000)") + tk.MustExec("insert into t values('2020-10-01 11:11:11', 2070)") + tk.MustExec("insert into t values('2020-10-01 11:11:11', 1999)") + + tk.MustQuery("select * from t where t.a < t.b").Check(testkit.Rows("2000-05-03 16:44:44 2018", "2020-10-01 11:11:11 2070")) + tk.MustQuery("select * from t where t.a > t.b").Check(testkit.Rows("2020-10-01 11:11:11 2000", "2020-10-01 11:11:11 1999")) + + // testcase for Date vs Year + tk.MustExec("drop table if exists tt") + tk.MustExec("create table tt(a date, b year)") + tk.MustExec("insert into tt values('2019-11-11', 2000)") + tk.MustExec("insert into tt values('2019-11-11', 2020)") + tk.MustExec("insert into tt values('2019-11-11', 2022)") + + tk.MustQuery("select * from tt where tt.a > tt.b").Check(testkit.Rows("2019-11-11 2000")) + tk.MustQuery("select * from tt where tt.a < tt.b").Check(testkit.Rows("2019-11-11 2020", "2019-11-11 2022")) + + // testcase for Timestamp vs Year + tk.MustExec("drop table if exists ttt") + tk.MustExec("create table ttt(a timestamp, b year)") + tk.MustExec("insert into ttt values('2019-11-11 11:11:11', 2019)") + tk.MustExec("insert into ttt values('2019-11-11 11:11:11', 2000)") + tk.MustExec("insert into ttt values('2019-11-11 11:11:11', 2022)") + + tk.MustQuery("select * from ttt where ttt.a > ttt.b").Check(testkit.Rows("2019-11-11 11:11:11 2019", "2019-11-11 11:11:11 2000")) + tk.MustQuery("select * from ttt where ttt.a < ttt.b").Check(testkit.Rows("2019-11-11 11:11:11 2022")) +} + func (s *testIntegrationSuite) TestIssue16779(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -7183,6 +7599,20 @@ func (s *testIntegrationSerialSuite) TestIssue17989(c *C) { tk.MustExec("admin check table t") } +func (s *testIntegrationSuite2) TestSchemaDMLNotChange(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk2 := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk2.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int primary key, c_json json);") + tk.MustExec("insert into t values (1, '{\"k\": 1}');") + tk.MustExec("begin") + tk.MustExec("update t set c_json = '{\"k\": 2}' where id = 1;") + tk2.MustExec("alter table t rename column c_json to cc_json;") + tk.MustExec("commit") +} + func (s *testIntegrationSerialSuite) TestIssue18638(c *C) { collate.SetNewCollationEnabledForTest(true) defer collate.SetNewCollationEnabledForTest(false) @@ -7196,6 +7626,20 @@ func (s *testIntegrationSerialSuite) TestIssue18638(c *C) { tk.MustQuery("select * from t t1 left join t t2 on t1.a = t2.b collate utf8mb4_general_ci;").Check(testkit.Rows("a A a A")) } +func (s *testIntegrationSerialSuite) TestCollationText(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a TINYTEXT collate UTF8MB4_GENERAL_CI, UNIQUE KEY `a`(`a`(10)));") + tk.MustExec("insert into t (a) values ('A');") + tk.MustQuery("select * from t t1 inner join t t2 on t1.a = t2.a where t1.a = 'A';").Check(testkit.Rows("A A")) + tk.MustExec("update t set a = 'B';") + tk.MustExec("admin check table t;") +} + func (s *testIntegrationSuite) TestIssue18850(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -7303,21 +7747,28 @@ func (s *testIntegrationSerialSuite) TestIssue19116(c *C) { tk.MustQuery("select coercibility(1=1);").Check(testkit.Rows("5")) } -func (s *testIntegrationSerialSuite) TestIssue14448and19383(c *C) { +// issues 14448, 19383, 17734 +func (s *testIntegrationSerialSuite) TestNoopFunctions(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("DROP TABLE IF EXISTS t1") tk.MustExec("CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY)") tk.MustExec("INSERT INTO t1 VALUES (1),(2),(3)") - _, err := tk.Exec("SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1") - message := `function SQL_CALC_FOUND_ROWS has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions` - c.Assert(strings.Contains(err.Error(), message), IsTrue) - _, err = tk.Exec("SELECT * FROM t1 LOCK IN SHARE MODE") - message = `function LOCK IN SHARE MODE has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions` - c.Assert(strings.Contains(err.Error(), message), IsTrue) - tk.MustExec("SET tidb_enable_noop_functions=1") - tk.MustExec("SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1") - tk.MustExec("SELECT * FROM t1 LOCK IN SHARE MODE") + + message := `.* has only noop implementation in tidb now, use tidb_enable_noop_functions to enable these functions` + stmts := []string{ + "SELECT SQL_CALC_FOUND_ROWS * FROM t1 LIMIT 1", + "SELECT * FROM t1 LOCK IN SHARE MODE", + "SELECT * FROM t1 GROUP BY a DESC", + "SELECT * FROM t1 GROUP BY a ASC", + } + for _, stmt := range stmts { + tk.MustExec("SET tidb_enable_noop_functions=1") + tk.MustExec(stmt) + tk.MustExec("SET tidb_enable_noop_functions=0") + _, err := tk.Exec(stmt) + c.Assert(err.Error(), Matches, message) + } } func (s *testIntegrationSerialSuite) TestIssue19315(c *C) { @@ -7364,6 +7815,21 @@ func (s *testIntegrationSerialSuite) TestIssue17063(c *C) { tk.MustQuery(`select coercibility(lag(b, 1, 'B') over w) from t window w as (order by b);`).Check(testkit.Rows("2", "2")) } +func (s *testIntegrationSerialSuite) TestIssue11177(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery("SELECT 'lvuleck' BETWEEN '2008-09-16 22:23:50' AND 0;").Check(testkit.Rows("0")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect FLOAT value: 'lvuleck'", "Warning 1292 Truncated incorrect FLOAT value: '2008-09-16 22:23:50'")) + tk.MustQuery("SELECT 'aa' BETWEEN 'bb' AND 0;").Check(testkit.Rows("1")) + tk.MustQuery("show warnings;").Check(testkit.Rows("Warning 1292 Truncated incorrect FLOAT value: 'aa'", "Warning 1292 Truncated incorrect FLOAT value: 'bb'")) + tk.MustQuery("select 1 between 0 and b'110';").Check(testkit.Rows("1")) + tk.MustQuery("show warnings;").Check(testkit.Rows()) + tk.MustQuery("select 'b' between 'a' and b'110';").Check(testkit.Rows("0")) + tk.MustQuery("show warnings;").Check(testkit.Rows()) +} + func (s *testIntegrationSuite) TestIssue19504(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -7375,6 +7841,8 @@ func (s *testIntegrationSuite) TestIssue19504(c *C) { tk.MustExec("insert into t2 values (1);") tk.MustQuery("select (select count(c_int) from t2 where c_int = t1.c_int) c1, (select count(1) from t2 where c_int = t1.c_int) c2 from t1;"). Check(testkit.Rows("1 1", "0 0", "0 0")) + tk.MustQuery("select (select count(c_int*c_int) from t2 where c_int = t1.c_int) c1, (select count(1) from t2 where c_int = t1.c_int) c2 from t1;"). + Check(testkit.Rows("1 1", "0 0", "0 0")) } func (s *testIntegrationSerialSuite) TestIssue19804(c *C) { @@ -7392,7 +7860,19 @@ func (s *testIntegrationSerialSuite) TestIssue19804(c *C) { tk.MustExec(`drop table if exists t;`) tk.MustExec(`create table t(a set('a', 'b', 'c'));`) tk.MustExec(`alter table t change a a set('a', 'b', 'c', 'd');`) - tk.MustGetErrMsg(`alter table t change a a set('a', 'b', 'c', 'e', 'f');`, "[ddl:8200]Unsupported modify column: cannot modify set column value d to e") + tk.MustExec(`insert into t values('d');`) + tk.MustGetErrMsg(`alter table t change a a set('a', 'b', 'c', 'e', 'f');`, "[ddl:8200]Unsupported modify column: cannot modify set column value d to e, and tidb_enable_change_column_type is false") +} + +func (s *testIntegrationSerialSuite) TestIssue20209(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test;`) + tk.MustExec(`set @@character_set_client=utf8mb4;`) + tk.MustExec(`set @@collation_connection=utf8_bin;`) + tk.MustExec("CREATE VIEW tview_1 AS SELECT 'a' AS `id`;") } func (s *testIntegrationSerialSuite) TestIssue18949(c *C) { @@ -7459,6 +7939,76 @@ func (s *testIntegrationSuite) TestIssue17476(c *C) { tk.MustQuery(`SELECT * FROM (table_int_float_varchar AS tmp3) WHERE (col_varchar_6 AND NULL) IS NULL AND col_int_6=0;`).Check(testkit.Rows("13 0 -0.1 ")) } +func (s *testIntegrationSerialSuite) TestClusteredIndexAndNewCollationIndexEncodeDecodeV5(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.MustExec("create table t(a int, b char(10) collate utf8mb4_bin, c char(10) collate utf8mb4_general_ci," + + "d varchar(10) collate utf8mb4_bin, e varchar(10) collate utf8mb4_general_ci, f char(10) collate utf8mb4_unicode_ci, g varchar(10) collate utf8mb4_unicode_ci, " + + "primary key(a, b, c, d, e, f, g), key a(a), unique key ua(a), key b(b), unique key ub(b), key c(c), unique key uc(c)," + + "key d(d), unique key ud(d),key e(e), unique key ue(e), key f(f), key g(g), unique key uf(f), unique key ug(g))") + + tk.MustExec("insert into t values (1, '啊 ', '啊 ', '啊 ', '啊 ', '啊 ', '啊 ')") + // Single Read. + tk.MustQuery("select * from t ").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + + tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(f)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(uf)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(g)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + tk.MustQuery("select * from t use index(ug)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ")) + + tk.MustExec("alter table t add column h varchar(10) collate utf8mb4_general_ci default '🐸'") + tk.MustExec("alter table t add column i varchar(10) collate utf8mb4_general_ci default '🐸'") + tk.MustExec("alter table t add index h(h)") + tk.MustExec("alter table t add unique index uh(h)") + + tk.MustQuery("select * from t use index(h)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(uh)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + + // Double read. + tk.MustQuery("select * from t use index(a)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ua)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(b)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ub)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(c)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(uc)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(d)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ud)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(e)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustQuery("select * from t use index(ue)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸")) + tk.MustExec("admin check table t") + tk.MustExec("admin recover index t a") + tk.MustExec("alter table t add column n char(10) COLLATE utf8mb4_unicode_ci") + tk.MustExec("alter table t add index n(n)") + tk.MustExec("update t set n = '吧';") + tk.MustQuery("select * from t").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) + tk.MustQuery("select * from t use index(n)").Check(testutil.RowsWithSep(",", "1,啊,啊,啊 ,啊 ,啊,啊 ,🐸,🐸,吧")) + tk.MustExec("admin check table t") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255) COLLATE utf8_general_ci primary key clustered, b int) partition by range columns(a) " + + "(partition p0 values less than ('0'), partition p1 values less than MAXVALUE);") + tk.MustExec("alter table t add index b(b);") + tk.MustExec("insert into t values ('0', 1);") + tk.MustQuery("select * from t use index(b);").Check(testkit.Rows("0 1")) + tk.MustQuery("select * from t use index();").Check(testkit.Rows("0 1")) + tk.MustExec("admin check table t") +} + func (s *testIntegrationSuite) TestIssue11645(c *C) { defer s.cleanEnv(c) tk := testkit.NewTestKit(c, s.store) @@ -7474,6 +8024,19 @@ func (s *testIntegrationSuite) TestIssue11645(c *C) { tk.MustQuery(`SELECT DATE_ADD('0001-01-02 00:00:00', INTERVAL -8785 HOUR);`).Check(testkit.Rows("0000-00-00 23:00:00")) } +func (s *testIntegrationSuite) TestIssue14349(c *C) { + defer s.cleanEnv(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists papers;") + tk.MustExec("create table papers(title text, content longtext)") + tk.MustExec("insert into papers values('title', 'content')") + tk.MustQuery(`select to_base64(title), to_base64(content) from papers;`).Check(testkit.Rows("dGl0bGU= Y29udGVudA==")) + tk.MustExec("set tidb_enable_vectorized_expression = 0;") + tk.MustQuery(`select to_base64(title), to_base64(content) from papers;`).Check(testkit.Rows("dGl0bGU= Y29udGVudA==")) + tk.MustExec("set tidb_enable_vectorized_expression = 1;") +} + func (s *testIntegrationSuite) TestIssue20180(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -7492,3 +8055,865 @@ func (s *testIntegrationSuite) TestIssue20180(c *C) { tk.MustExec("insert into t values('b');") tk.MustQuery("select * from t where a > 1 and a = \"b\";").Check(testkit.Rows("b")) } + +func (s *testIntegrationSuite) TestIssue11755(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists lt;") + tk.MustExec("create table lt (d decimal(10, 4));") + tk.MustExec("insert into lt values(0.2),(0.2);") + tk.MustQuery("select LEAD(d,1,1) OVER(), LAG(d,1,1) OVER() from lt;").Check(testkit.Rows("0.2000 1.0000", "1.0000 0.2000")) +} + +func (s *testIntegrationSuite) TestIssue20369(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int);") + tk.MustExec("insert into t values (1);") + tk.MustExec("insert into t select values(a) from t;") + tk.MustQuery("select * from t").Check(testkit.Rows("1", "")) +} + +func (s *testIntegrationSuite) TestIssue20730(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("DROP TABLE IF EXISTS tmp;") + tk.MustExec("CREATE TABLE tmp (id int(11) NOT NULL,value int(1) NOT NULL,PRIMARY KEY (id))") + tk.MustExec("INSERT INTO tmp VALUES (1, 1),(2,2),(3,3),(4,4),(5,5)") + tk.MustExec("SET @sum := 10") + tk.MustQuery("SELECT @sum := IF(@sum=20,4,@sum + tmp.value) sum FROM tmp ORDER BY tmp.id").Check(testkit.Rows("11", "13", "16", "20", "4")) +} + +func (s *testIntegrationSerialSuite) TestClusteredIndexAndNewCollation(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("CREATE TABLE `t` (" + + "`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + + "`b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + + "`c` int(11) NOT NULL," + + "PRIMARY KEY (`a`,`b`,`c`)," + + "KEY `idx` (`a`))") + + tk.MustExec("begin") + tk.MustExec("insert into t values ('a6', 'b6', 3)") + tk.MustQuery("select * from t").Check(testkit.Rows("a6 b6 3")) + tk.MustQuery("select * from t where a='a6'").Check(testkit.Rows("a6 b6 3")) + tk.MustExec("delete from t") + tk.MustQuery("select * from t").Check(testkit.Rows()) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows()) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(`a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL key)") + tk.MustExec("insert into t values ('&');") + tk.MustExec("replace into t values ('&');") + tk.MustQuery("select * from t").Check(testkit.Rows("&")) +} + +func (s *testIntegrationSuite) TestIssue20860(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(id int primary key, c int, d timestamp null default null)") + tk.MustExec("insert into t values(1, 2, '2038-01-18 20:20:30')") + c.Assert(tk.ExecToErr("update t set d = adddate(d, interval 1 day) where id < 10"), NotNil) +} + +func (s *testIntegrationSerialSuite) TestIssue20608(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery("select '䇇Հ' collate utf8mb4_bin like '___Հ';").Check(testkit.Rows("0")) +} + +func (s *testIntegrationSuite2) TestIssue15847(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop view if exists t15847") + tk.MustExec("CREATE VIEW t15847(c0) AS SELECT NULL;") + tk.MustQuery("SELECT * FROM t15847 WHERE (NOT (IF(t15847.c0, NULL, NULL)));").Check(testkit.Rows()) + tk.MustExec("drop view if exists t15847") +} + +func (s *testIntegrationSerialSuite) TestIssue20161(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec(`use test;`) + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(raw JSON);`) + tk.MustExec(`insert into t(raw) values('["a","ab"]'), ('["a"]'), (null);`) + tk.MustQuery(`SELECT JSON_SEARCH(raw,'one','c') FROM t;`). + Check(testkit.Rows("", "", "")) +} + +func (s *testIntegrationSuite) TestIssue10462(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustQuery("select json_array(true)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1=2)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array(1!=2)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1<2)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1<=2)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1>2)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array(1>=2)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_object(true, null <=> null)").Check(testkit.Rows("{\"1\": true}")) + tk.MustQuery("select json_object(false, 1 and 2)").Check(testkit.Rows("{\"0\": true}")) + tk.MustQuery("select json_object(false, 1 and 0)").Check(testkit.Rows("{\"0\": false}")) + tk.MustQuery("select json_object(false, 1 or 0)").Check(testkit.Rows("{\"0\": true}")) + tk.MustQuery("select json_object(false, 1 xor 0)").Check(testkit.Rows("{\"0\": true}")) + tk.MustQuery("select json_object(false, 1 xor 1)").Check(testkit.Rows("{\"0\": false}")) + tk.MustQuery("select json_object(false, not 1)").Check(testkit.Rows("{\"0\": false}")) + tk.MustQuery("select json_array(null and 1)").Check(testkit.Rows("[null]")) + tk.MustQuery("select json_array(null and 0)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array(null or 1)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(null or 0)").Check(testkit.Rows("[null]")) + tk.MustQuery("select json_array(1.15 or 0)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array('abc' or 0)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array('1abc' or 0)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(null is true)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array(null is null)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1 in (1, 2))").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(0 in (1, 2))").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array(0 not in (1, 2))").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1 between 0 and 2)").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(1 not between 0 and 2)").Check(testkit.Rows("[false]")) + tk.MustQuery("select json_array('123' like '123')").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array('abcdef' rlike 'a.*c.*')").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(is_ipv4('127.0.0.1'))").Check(testkit.Rows("[true]")) + tk.MustQuery("select json_array(is_ipv6('1a6b:8888:ff66:77ee:0000:1234:5678:bcde'))").Check(testkit.Rows("[true]")) +} + +func (s *testIntegrationSerialSuite) TestJsonObjectCompare(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustQuery("select json_object('k', -1) > json_object('k', 2)").Check(testkit.Rows("0")) + tk.MustQuery("select json_object('k', -1) < json_object('k', 2)").Check(testkit.Rows("1")) + + tk.MustExec("drop table if exists tx") + tk.MustExec("create table tx(a double, b int)") + tk.MustExec("insert into tx values (3.0, 3)") + tk.MustQuery("select json_object('k', a) = json_object('k', b) from tx").Check(testkit.Rows("1")) +} + +func (s *testIntegrationSerialSuite) TestIssue21290(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a date);") + tk.MustExec("insert into t1 values (20100202);") + tk.MustQuery("select a in ('2020-02-02', 20100202) from t1;").Check(testkit.Rows("1")) +} + +func (s *testIntegrationSuite) TestIssue17868(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t7") + tk.MustExec("create table t7 (col0 SMALLINT, col1 VARBINARY(1), col2 DATE, col3 BIGINT, col4 BINARY(166))") + tk.MustExec("insert into t7 values ('32767', '', '1000-01-03', '-0', '11101011')") + tk.MustQuery("select col2 = 1 from t7").Check(testkit.Rows("0")) + tk.MustQuery("select col2 != 1 from t7").Check(testkit.Rows("1")) +} + +func (s *testIntegrationSuite) TestIssue21619(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustQuery(`select CAST("9223372036854775808" as json)`).Check(testkit.Rows("9223372036854775808")) + tk.MustQuery(`select json_type(CAST("9223372036854775808" as json))`).Check(testkit.Rows("UNSIGNED INTEGER")) + tk.MustQuery(`select CAST(9223372036854775808 as json)`).Check(testkit.Rows("9223372036854775808")) + tk.MustQuery(`select json_type(CAST(9223372036854775808 as json))`).Check(testkit.Rows("UNSIGNED INTEGER")) + tk.MustQuery(`select CAST(-9223372036854775808 as json)`).Check(testkit.Rows("-9223372036854775808")) + tk.MustQuery(`select json_type(CAST(-9223372036854775808 as json))`).Check(testkit.Rows("INTEGER")) +} + +func (s *testIntegrationSuite) TestIssue10467(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists tx2;") + tk.MustExec("create table tx2 (col json);") + tk.MustExec(`insert into tx2 values (json_array("3")),(json_array("3")),(json_array("3")),(json_array("3"));`) + tk.MustExec(`insert into tx2 values (json_array(3.0));`) + tk.MustExec(`insert into tx2 values (json_array(3));`) + tk.MustExec(`insert into tx2 values (json_array(3.0));`) + tk.MustExec(`insert into tx2 values (json_array(-3));`) + tk.MustExec(`insert into tx2 values (json_array(-3.0));`) + tk.MustExec(`insert into tx2 values (json_array(922337203685477580));`) + tk.MustExec(`insert into tx2 values (json_array(922337203685477581)),(json_array(922337203685477581)),(json_array(922337203685477581)),(json_array(922337203685477581)),(json_array(922337203685477581));`) + + // TODO: in MySQL these values will hash the same because the first is stored as JSON type DECIMAL. + // Currently TiDB does not support JSON type DECIMAL. + // See: https://github.com/pingcap/tidb/issues/9988 + // insert into tx2 values (json_array(9223372036854775808.0)); + // insert into tx2 values (json_array(9223372036854775808)); + + // ordering by a JSON col is not supported in MySQL, and the order is a bit questionable in TiDB. + // sort by count for test result stability. + tk.MustQuery("select col, count(1) c from tx2 group by col order by c desc;").Check(testkit.Rows("[922337203685477581] 5", `["3"] 4`, "[3] 3", "[-3] 2", "[922337203685477580] 1")) +} + +func (s *testIntegrationSerialSuite) TestCollationIndexJoin(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b char(10), key(b)) collate utf8mb4_general_ci") + tk.MustExec("create table t2(a int, b char(10), key(b)) collate ascii_bin") + tk.MustExec("insert into t1 values (1, 'a')") + tk.MustExec("insert into t2 values (1, 'A')") + + tk.MustQuery("select /*+ inl_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_hash_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_hash_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_HASH_JOIN(t2) */ is inapplicable")) + tk.MustQuery("select /*+ inl_merge_join(t1) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("select /*+ inl_merge_join(t2) */ t1.b, t2.b from t1 join t2 where t1.b=t2.b").Check(testkit.Rows("a A")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1815 Optimizer Hint /*+ INL_MERGE_JOIN(t2) */ is inapplicable")) +} + +func (s *testIntegrationSuite) TestIssue19892(c *C) { + defer s.cleanEnv(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test") + tk.MustExec("CREATE TABLE dd(a date, b datetime, c timestamp)") + + // check NO_ZERO_DATE + { + tk.MustExec("SET sql_mode=''") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('0000-00-00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("0000-00-00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('2000-10-01')") + tk.MustExec("UPDATE dd SET b = '0000-00-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('0000-00-00 20:00:00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-00-00 20:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-10-01 20:00:00')") + tk.MustExec("UPDATE dd SET c = '0000-00-00 20:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-00-00 20:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + + tk.MustExec("SET sql_mode='NO_ZERO_DATE'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('0000-0-00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '0000-0-00'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('2000-10-01')") + tk.MustExec("UPDATE dd SET a = '0000-00-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect date value: '0000-00-00'")) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("0000-00-00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-10-01 10:00:00')") + tk.MustExec("UPDATE dd SET c = '0000-00-00 10:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-00-00 10:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + + tk.MustExec("SET sql_mode='NO_ZERO_DATE,STRICT_TRANS_TABLES'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustGetErrMsg("INSERT INTO dd(c) VALUES ('0000-00-00 20:00:00')", "[table:1292]Incorrect timestamp value: '0000-00-00 20:00:00' for column 'c' at row 1") + tk.MustExec("INSERT IGNORE INTO dd(c) VALUES ('0000-00-00 20:00:00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-00-00 20:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('2000-10-01')") + tk.MustGetErrMsg("UPDATE dd SET b = '0000-00-00'", "[types:1292]Incorrect datetime value: '0000-00-00'") + tk.MustExec("UPDATE IGNORE dd SET b = '0000-00-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '0000-00-00'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-10-01 10:00:00')") + tk.MustGetErrMsg("UPDATE dd SET c = '0000-00-00 00:00:00'", "[types:1292]Incorrect timestamp value: '0000-00-00 00:00:00'") + tk.MustExec("UPDATE IGNORE dd SET c = '0000-00-00 00:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-00-00 00:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + } + + // check NO_ZERO_IN_DATE + { + tk.MustExec("SET sql_mode=''") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('2000-01-00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("2000-01-00")) + tk.MustExec("INSERT INTO dd(a) values('2000-00-01')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("2000-01-00", "2000-00-01")) + tk.MustExec("INSERT INTO dd(a) values('0-01-02')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("2000-01-00", "2000-00-01", "0000-01-02")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('2000-01-02')") + tk.MustExec("UPDATE dd SET b = '2000-00-02'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("2000-00-02 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-01-02 20:00:00')") + tk.MustExec("UPDATE dd SET c = '0000-01-02 20:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-01-02 20:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + + tk.MustExec("SET sql_mode='NO_ZERO_IN_DATE'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('2000-01-00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect date value: '2000-01-00'")) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("0000-00-00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('2000-01-02')") + tk.MustExec("UPDATE dd SET a = '2000-00-02'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect date value: '2000-00-02'")) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("0000-00-00")) + tk.MustExec("UPDATE dd SET b = '2000-01-0'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-01-0'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + // consistent with Mysql8 + tk.MustExec("UPDATE dd SET b = '0-01-02'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-01-02 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-01-02 20:00:00')") + tk.MustExec("UPDATE dd SET c = '2000-00-02 20:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '2000-00-02 20:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + + tk.MustExec("SET sql_mode='NO_ZERO_IN_DATE,STRICT_TRANS_TABLES'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustGetErrMsg("INSERT INTO dd(b) VALUES ('2000-01-00')", "[table:1292]Incorrect datetime value: '2000-01-00' for column 'b' at row 1") + tk.MustExec("INSERT IGNORE INTO dd(b) VALUES ('2000-00-01')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-00-01'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) VALUES ('2000-01-02')") + tk.MustGetErrMsg("UPDATE dd SET b = '2000-01-00'", "[types:1292]Incorrect datetime value: '2000-01-00'") + tk.MustExec("UPDATE IGNORE dd SET b = '2000-01-0'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-01-0'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + tk.MustExec("UPDATE dd SET b = '0000-1-2'") + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-01-02 00:00:00")) + tk.MustGetErrMsg("UPDATE dd SET c = '0000-01-05'", "[types:1292]Incorrect timestamp value: '0000-01-05'") + tk.MustExec("UPDATE IGNORE dd SET c = '0000-01-5'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-01-5'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustGetErrMsg("INSERT INTO dd(c) VALUES ('2000-01-00 20:00:00')", "[table:1292]Incorrect timestamp value: '2000-01-00 20:00:00' for column 'c' at row 1") + tk.MustExec("INSERT INTO dd(c) VALUES ('2000-01-02')") + tk.MustGetErrMsg("UPDATE dd SET c = '2000-01-00 20:00:00'", "[types:1292]Incorrect timestamp value: '2000-01-00 20:00:00'") + tk.MustExec("UPDATE IGNORE dd SET b = '2000-01-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-01-00'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + } + + // check !NO_ZERO_DATE + tk.MustExec("SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('0000-00-00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("0000-00-00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('2000-10-01')") + tk.MustExec("UPDATE dd SET b = '0000-00-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('0000-00-00 00:00:00')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-10-01 10:00:00')") + tk.MustExec("UPDATE dd SET c = '0000-00-00 00:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustGetErrMsg("INSERT INTO dd(b) VALUES ('2000-01-00')", "[table:1292]Incorrect datetime value: '2000-01-00' for column 'b' at row 1") + tk.MustExec("INSERT IGNORE INTO dd(b) VALUES ('2000-00-01')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-00-01'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) VALUES ('2000-01-02')") + tk.MustGetErrMsg("UPDATE dd SET b = '2000-01-00'", "[types:1292]Incorrect datetime value: '2000-01-00'") + tk.MustExec("UPDATE IGNORE dd SET b = '2000-01-0'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-01-0'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + tk.MustExec("UPDATE dd SET b = '0000-1-2'") + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-01-02 00:00:00")) + tk.MustGetErrMsg("UPDATE dd SET c = '0000-01-05'", "[types:1292]Incorrect timestamp value: '0000-01-05'") + tk.MustExec("UPDATE IGNORE dd SET c = '0000-01-5'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '0000-01-5'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustGetErrMsg("INSERT INTO dd(c) VALUES ('2000-01-00 20:00:00')", "[table:1292]Incorrect timestamp value: '2000-01-00 20:00:00' for column 'c' at row 1") + tk.MustExec("INSERT INTO dd(c) VALUES ('2000-01-02')") + tk.MustGetErrMsg("UPDATE dd SET c = '2000-01-00 20:00:00'", "[types:1292]Incorrect timestamp value: '2000-01-00 20:00:00'") + tk.MustExec("UPDATE IGNORE dd SET b = '2000-01-00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect datetime value: '2000-01-00'")) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } + + // check !NO_ZERO_IN_DATE + tk.MustExec("SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'") + { + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(a) values('2000-00-10')") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT a FROM dd").Check(testkit.Rows("2000-00-10")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(b) values('2000-10-01')") + tk.MustExec("UPDATE dd SET b = '2000-00-10'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows()) + tk.MustQuery("SELECT b FROM dd").Check(testkit.Rows("2000-00-10 00:00:00")) + + tk.MustExec("TRUNCATE TABLE dd") + tk.MustExec("INSERT INTO dd(c) values('2000-10-01 10:00:00')") + tk.MustGetErrMsg("UPDATE dd SET c = '2000-00-10 00:00:00'", "[types:1292]Incorrect timestamp value: '2000-00-10 00:00:00'") + tk.MustExec("UPDATE IGNORE dd SET c = '2000-01-00 00:00:00'") + tk.MustQuery("SHOW WARNINGS").Check(testkit.Rows("Warning 1292 Incorrect timestamp value: '2000-01-00 00:00:00'")) + tk.MustQuery("SELECT c FROM dd").Check(testkit.Rows("0000-00-00 00:00:00")) + } +} + +func (s *testIntegrationSerialSuite) TestIssue20876(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (" + + " `a` char(10) COLLATE utf8mb4_unicode_ci NOT NULL," + + " `b` char(20) COLLATE utf8mb4_general_ci NOT NULL," + + " `c` int(11) NOT NULL," + + " PRIMARY KEY (`a`,`b`,`c`)," + + " KEY `idx` (`a`)" + + ")") + tk.MustExec("insert into t values ('#', 'C', 10), ('$', 'c', 20), ('$', 'c', 30), ('a', 'a', 10), ('A', 'A', 30)") + tk.MustExec("analyze table t") + tk.MustQuery("select * from t where a='#';").Check(testkit.Rows("# C 10")) +} + +// The actual results do not agree with the test results, It should be modified after the test suite is updated +func (s *testIntegrationSuite) TestIssue17726(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t0") + tk.MustExec("create table t0 (c1 DATE, c2 TIME, c3 DATETIME, c4 TIMESTAMP)") + tk.MustExec("insert into t0 values ('1000-01-01', '-838:59:59', '1000-01-01 00:00:00', '1970-01-01 08:00:01')") + tk.MustExec("insert into t0 values ('9999-12-31', '838:59:59', '9999-12-31 23:59:59', '2038-01-19 11:14:07')") + result := tk.MustQuery("select avg(c1), avg(c2), avg(c3), avg(c4) from t0") + result.Check(testkit.Rows("54995666 0 54995666117979.5 20040110095704")) +} + +func (s *testIntegrationSuite) TestDatetimeUserVariable(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @p = now()") + tk.MustExec("set @@tidb_enable_vectorized_expression = false") + c.Check(tk.MustQuery("select @p").Rows()[0][0] != "", IsTrue) + tk.MustExec("set @@tidb_enable_vectorized_expression = true") + c.Check(tk.MustQuery("select @p").Rows()[0][0] != "", IsTrue) +} + +func (s *testIntegrationSuite) TestIssue12205(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t12205;") + tk.MustExec("create table t12205(\n `col_varchar_64` varchar(64) DEFAULT NULL,\n `col_varchar_64_key` varchar(64) DEFAULT NULL\n);") + tk.MustExec("insert into t12205 values('-1038024704','-527892480');") + tk.MustQuery("select SEC_TO_TIME( ( `col_varchar_64` & `col_varchar_64_key` ) ),`col_varchar_64` & `col_varchar_64_key` from t12205; ").Check( + testkit.Rows("838:59:59 18446744072635875328")) + tk.MustQuery("show warnings;").Check( + testkit.Rows("Warning 1292 Truncated incorrect time value: '18446744072635875000'")) +} + +// for issue 20128 +func (s *testIntegrationSerialSuite) TestIssue20128(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(b enum('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z') DEFAULT NULL, c decimal(40,20));") + tk.MustExec("insert into t values('z', 19.18040000000000000000);") + tk.MustExec("insert into t values('z', 26.18040000000000000000);") + tk.MustExec("insert into t values('z', 25.18040000000000000000);") + tk.MustQuery("select * from t where t.b > t.c;").Check(testkit.Rows("z 19.18040000000000000000", "z 25.18040000000000000000")) + tk.MustQuery("select * from t where t.b < t.c;").Check(testkit.Rows("z 26.18040000000000000000")) +} + +func (s *testIntegrationSuite) TestIssue21677(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(1e int);") + tk.MustExec("insert into t values (1);") + tk.MustQuery("select t.1e from test.t;").Check(testkit.Rows("1")) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(99e int, r10 int);") + tk.MustExec("insert into t values (1, 10), (2, 2);") + tk.MustQuery("select 99e+r10 from t;").Check(testkit.Rows("11", "4")) + tk.MustQuery("select .78$123;").Check(testkit.Rows("0.78")) + tk.MustGetErrCode("select .78$421+1;", mysql.ErrParse) + tk.MustQuery("select t. `r10` > 3 from t;").Check(testkit.Rows("1", "0")) + tk.MustQuery("select * from t where t. `r10` > 3;").Check(testkit.Rows("1 10")) +} + +func (s *testIntegrationSerialSuite) TestLikeWithCollation(c *C) { + tk := testkit.NewTestKit(c, s.store) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + + tk.MustQuery(`select 'a' like 'A' collate utf8mb4_unicode_ci;`).Check(testkit.Rows("1")) + tk.MustGetErrMsg(`select 'a' collate utf8mb4_bin like 'A' collate utf8mb4_unicode_ci;`, "[expression:1270]Illegal mix of collations (utf8mb4_bin,EXPLICIT), (utf8mb4_unicode_ci,EXPLICIT), (utf8mb4_bin,NUMERIC) for operation 'like'") + tk.MustQuery(`select '😛' collate utf8mb4_general_ci like '😋';`).Check(testkit.Rows("1")) + tk.MustQuery(`select '😛' collate utf8mb4_general_ci = '😋';`).Check(testkit.Rows("1")) + tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci like '😋';`).Check(testkit.Rows("0")) + tk.MustQuery(`select '😛' collate utf8mb4_unicode_ci = '😋';`).Check(testkit.Rows("1")) +} + +func (s *testIntegrationSuite) TestIssue11333(c *C) { + defer s.cleanEnv(c) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t(col1 decimal);") + tk.MustExec(" insert into t values(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);") + tk.MustQuery(`select * from t;`).Check(testkit.Rows("0")) + tk.MustExec("create table t1(col1 decimal(65,30));") + tk.MustExec(" insert into t1 values(0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000);") + tk.MustQuery(`select * from t1;`).Check(testkit.Rows("0.000000000000000000000000000000")) + tk.MustQuery(`select 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000;`).Check(testkit.Rows("0.000000000000000000000000000000000000000000000000000000000000000000000000")) + tk.MustQuery(`select 0.0000000000000000000000000000000000000000000000000000000000000000000000012;`).Check(testkit.Rows("0.000000000000000000000000000000000000000000000000000000000000000000000001")) + tk.MustQuery(`select 0.000000000000000000000000000000000000000000000000000000000000000000000001;`).Check(testkit.Rows("0.000000000000000000000000000000000000000000000000000000000000000000000001")) +} + +func (s *testSuite) TestIssue12206(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t12206;") + tk.MustExec("create table t12206(\n `col_tinyint_unsigned` tinyint(3) unsigned DEFAULT NULL,\n `col_double_unsigned` double unsigned DEFAULT NULL,\n `col_year_key` year(4) DEFAULT NULL\n);") + tk.MustExec("insert into t12206 values(73,0,0000);") + tk.MustQuery("SELECT TIME_FORMAT( `col_tinyint_unsigned`, ( IFNULL( `col_double_unsigned`, `col_year_key` ) ) ) AS field1 FROM `t12206`;").Check( + testkit.Rows("")) + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1292 Truncated incorrect time value: '73'")) +} + +func (s *testIntegrationSuite2) TestCastCoer(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustQuery("select coercibility(binary('a'))").Check(testkit.Rows("2")) + tk.MustQuery("select coercibility(cast('a' as char(10)))").Check(testkit.Rows("2")) + tk.MustQuery("select coercibility(convert('abc', char(10)));").Check(testkit.Rows("2")) +} + +func (s *testIntegrationSuite) TestIssue12209(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t12209;") + tk.MustExec("create table t12209(a bigint(20));") + tk.MustExec("insert into t12209 values(1);") + tk.MustQuery("select `a` DIV ( ROUND( ( SCHEMA() ), '1978-05-18 03:35:52.043591' ) ) from `t12209`;").Check( + testkit.Rows("")) +} + +func (s *testIntegrationSerialSuite) TestCrossDCQuery(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1") + tk.MustExec(`create table t1 (c int primary key, d int,e int,index idx_d(d),index idx_e(e)) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (6), + PARTITION p1 VALUES LESS THAN (11) +);`) + + tk.MustExec(`insert into t1 (c,d,e) values (1,1,1);`) + tk.MustExec(`insert into t1 (c,d,e) values (2,3,5);`) + tk.MustExec(`insert into t1 (c,d,e) values (3,5,7);`) + + is := s.dom.InfoSchema() + + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + setBundle := func(parName, dc string) { + pid, err := tables.FindPartitionByName(tb.Meta(), parName) + c.Assert(err, IsNil) + groupID := placement.GroupID(pid) + is.SetBundle(&placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Leader, + Count: 1, + LabelConstraints: []placement.LabelConstraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{dc}, + }, + }, + }, + }, + }) + } + setBundle("p0", "sh") + setBundle("p1", "bj") + + testcases := []struct { + name string + txnScope string + zone string + sql string + expectErr error + }{ + // FIXME: block by https://github.com/pingcap/tidb/issues/21872 + //{ + // name: "cross dc read to sh by holding bj, IndexReader", + // txnScope: "bj", + // sql: "select /*+ USE_INDEX(t1, idx_d) */ d from t1 where c < 5 and d < 1;", + // expectErr: fmt.Errorf(".*can not be read by.*"), + //}, + // FIXME: block by https://github.com/pingcap/tidb/issues/21847 + //{ + // name: "cross dc read to sh by holding bj, BatchPointGet", + // txnScope: "bj", + // sql: "select * from t1 where c in (1,2,3,4);", + // expectErr: fmt.Errorf(".*can not be read by.*"), + //}, + { + name: "cross dc read to sh by holding bj, PointGet", + txnScope: "local", + zone: "bj", + sql: "select * from t1 where c = 1", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, IndexLookUp", + txnScope: "local", + zone: "bj", + sql: "select * from t1 use index (idx_d) where c < 5 and d < 5;", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, IndexMerge", + txnScope: "local", + zone: "bj", + sql: "select /*+ USE_INDEX_MERGE(t1, idx_d, idx_e) */ * from t1 where c <5 and (d =5 or e=5);", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to sh by holding bj, TableReader", + txnScope: "local", + zone: "bj", + sql: "select * from t1 where c < 6", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "cross dc read to global by holding bj", + txnScope: "local", + zone: "bj", + sql: "select * from t1", + expectErr: fmt.Errorf(".*can not be read by.*"), + }, + { + name: "read sh dc by holding sh", + txnScope: "local", + zone: "sh", + sql: "select * from t1 where c < 6", + expectErr: nil, + }, + { + name: "read sh dc by holding global", + txnScope: "global", + zone: "", + sql: "select * from t1 where c < 6", + expectErr: nil, + }, + } + for _, testcase := range testcases { + c.Log(testcase.name) + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", + fmt.Sprintf(`return("%v")`, testcase.zone)) + _, err = tk.Exec(fmt.Sprintf("set @@txn_scope='%v'", testcase.txnScope)) + c.Assert(err, IsNil) + res, err := tk.Exec(testcase.sql) + _, resErr := session.GetRows4Test(context.Background(), tk.Se, res) + var checkErr error + if err != nil { + checkErr = err + } else { + checkErr = resErr + } + if testcase.expectErr != nil { + c.Assert(checkErr, NotNil) + c.Assert(checkErr.Error(), Matches, ".*can not be read by.*") + } else { + c.Assert(checkErr, IsNil) + } + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + } +} + +func (s *testIntegrationSerialSuite) TestCollationUnion(c *C) { + // For issue 19694. + tk := testkit.NewTestKit(c, s.store) + + tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ' order by a;").Check(testkit.Rows("2010-09-09", "2010-09-09 ")) + res := tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") + c.Check(len(res.Rows()), Equals, 2) + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + res = tk.MustQuery("select cast('2010-09-09' as date) a union select '2010-09-09 ';") + c.Check(len(res.Rows()), Equals, 1) +} + +func (s *testIntegrationSuite) TestIssue22098(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("CREATE TABLE `ta` (" + + " `k` varchar(32) NOT NULL DEFAULT ' '," + + " `c0` varchar(32) NOT NULL DEFAULT ' '," + + " `c` varchar(18) NOT NULL DEFAULT ' '," + + " `e0` varchar(1) NOT NULL DEFAULT ' '," + + " PRIMARY KEY (`k`,`c0`,`c`)," + + " KEY `idx` (`c`,`e0`)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("CREATE TABLE `tb` (" + + " `k` varchar(32) NOT NULL DEFAULT ' '," + + " `e` int(11) NOT NULL DEFAULT '0'," + + " `i` int(11) NOT NULL DEFAULT '0'," + + " `s` varchar(1) NOT NULL DEFAULT ' '," + + " `c` varchar(50) NOT NULL DEFAULT ' '," + + " PRIMARY KEY (`k`)" + + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin") + tk.MustExec("prepare stmt from \"select a.* from ta a left join tb b on a.k = b.k where (a.k <> '000000' and ((b.s = ? and i = ? ) or (b.s = ? and e = ?) or (b.s not in(?, ?))) and b.c like '%1%') or (a.c <> '000000' and a.k = '000000')\"") + tk.MustExec("set @a=3;set @b=20200414;set @c='a';set @d=20200414;set @e=3;set @f='a';") + tk.MustQuery("execute stmt using @a,@b,@c,@d,@e,@f").Check(testkit.Rows()) +} + +func (s *testIntegrationSerialSuite) TestCollationUnion2(c *C) { + // For issue 22179 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a varchar(10))") + tk.MustExec("insert into t values('aaaaaaaaa'),('天王盖地虎宝塔镇河妖')") + tk.MustQuery("select * from t").Check(testkit.Rows("aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + + // check the collation of sub query of union statement. + tk.MustQuery("select collation(a) from (select null as a) aaa").Check(testkit.Rows("binary")) + tk.MustQuery("select collation(a) from (select a from t limit 1) aaa").Check(testkit.Rows("utf8mb4_bin")) + + // Reverse sub query of union statement. + tk.MustQuery("select * from (select null as a union all select a from t) aaa order by a").Check(testkit.Rows("", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + tk.MustQuery("select * from (select a from t) aaa union all select null as a order by a").Check(testkit.Rows("", "aaaaaaaaa", "天王盖地虎宝塔镇河妖")) + tk.MustExec("drop table if exists t") +} + +func (s *testIntegrationSuite) Test22717(c *C) { + // For issue 22717 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t( + a enum('a','','c'), + b enum('0','1','2'), + c set('a','','c'), + d set('0','1','2') + )`) + tk.MustExec("insert into t values(1,1,1,1),(2,2,2,2),(3,3,3,3)") + tk.MustExec("set @@sql_mode = ''") + tk.MustExec("insert into t values('','','','')") + tk.MustQuery("select * from t").Check(testkit.Rows("a 0 a 0", " 1 1", "c 2 a, 0,1", " ")) + tk.MustQuery("select a from t where a").Check(testkit.Rows("a", "", "c", "")) + tk.MustQuery("select b from t where b").Check(testkit.Rows("0", "1", "2")) + tk.MustQuery("select c from t where c").Check(testkit.Rows("a", "", "a,", "")) + tk.MustQuery("select d from t where d").Check(testkit.Rows("0", "1", "0,1")) +} + +func (s *testIntegrationSerialSuite) TestPartitionPruningRelaxOP(c *C) { + // Discovered while looking at issue 19941 (not completely related) + // relaxOP relax the op > to >= and < to <= + // Sometime we need to relax the condition, for example: + // col < const => f(col) <= const + // datetime < 2020-02-11 16:18:42 => to_days(datetime) <= to_days(2020-02-11) + // We can't say: + // datetime < 2020-02-11 16:18:42 => to_days(datetime) < to_days(2020-02-11) + + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("DROP TABLE IF EXISTS t1;") + tk.MustExec(`CREATE TABLE t1 (d date NOT NULL) PARTITION BY RANGE (YEAR(d)) + (PARTITION p2016 VALUES LESS THAN (2017), PARTITION p2017 VALUES LESS THAN (2018), PARTITION p2018 VALUES LESS THAN (2019), + PARTITION p2019 VALUES LESS THAN (2020), PARTITION pmax VALUES LESS THAN MAXVALUE)`) + + tk.MustExec(`INSERT INTO t1 VALUES ('2016-01-01'), ('2016-06-01'), ('2016-09-01'), ('2017-01-01'), + ('2017-06-01'), ('2017-09-01'), ('2018-01-01'), ('2018-06-01'), ('2018-09-01'), ('2018-10-01'), + ('2018-11-01'), ('2018-12-01'), ('2018-12-31'), ('2019-01-01'), ('2019-06-01'), ('2019-09-01'), + ('2020-01-01'), ('2020-06-01'), ('2020-09-01');`) + + tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d < '2018-01-01'").Check(testkit.Rows("6")) + tk.MustQuery("SELECT COUNT(*) FROM t1 WHERE d > '2018-01-01'").Check(testkit.Rows("12")) +} + +func (s *testIntegrationSuite) TestClusteredIndexCorCol(c *C) { + // For issue 23076 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.MustExec("drop table if exists t1, t2;") + tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key (c_int, c_str) , key(c_int) );") + tk.MustExec("create table t2 like t1 ;") + tk.MustExec("insert into t1 values (1, 'crazy lumiere'), (10, 'goofy mestorf');") + tk.MustExec("insert into t2 select * from t1 ;") + tk.MustQuery("select (select t2.c_str from t2 where t2.c_str = t1.c_str and t2.c_int = 10 order by t2.c_str limit 1) x from t1;").Check(testkit.Rows("", "goofy mestorf")) +} diff --git a/expression/partition_pruner_test.go b/expression/partition_pruner_test.go deleted file mode 100644 index 604cd82f4c31c..0000000000000 --- a/expression/partition_pruner_test.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2019 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package expression_test - -import ( - "fmt" - - . "github.com/pingcap/check" - "github.com/pingcap/tidb/domain" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/util/mock" - "github.com/pingcap/tidb/util/testkit" - "github.com/pingcap/tidb/util/testutil" -) - -var _ = Suite(&testSuite2{}) - -type testSuite2 struct { - store kv.Storage - dom *domain.Domain - ctx sessionctx.Context - testData testutil.TestData -} - -func (s *testSuite2) cleanEnv(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test_partition") - r := tk.MustQuery("show tables") - for _, tb := range r.Rows() { - tableName := tb[0] - tk.MustExec(fmt.Sprintf("drop table %v", tableName)) - } -} - -func (s *testSuite2) SetUpSuite(c *C) { - var err error - s.store, s.dom, err = newStoreWithBootstrap() - c.Assert(err, IsNil) - s.ctx = mock.NewContext() - s.testData, err = testutil.LoadTestSuiteData("testdata", "partition_pruner") - c.Assert(err, IsNil) -} - -func (s *testSuite2) TearDownSuite(c *C) { - c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) - s.dom.Close() - s.store.Close() -} - -func (s *testSuite2) TestHashPartitionPruner(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("create database test_partition") - tk.MustExec("use test_partition") - tk.MustExec("drop table if exists t1, t2;") - tk.MustExec("set @@tidb_enable_clustered_index=0;") - tk.MustExec("create table t2(id int, a int, b int, primary key(id, a)) partition by hash(id + a) partitions 10;") - tk.MustExec("create table t1(id int primary key, a int, b int) partition by hash(id) partitions 10;") - tk.MustExec("create table t3(id int, a int, b int, primary key(id, a)) partition by hash(id) partitions 10;") - tk.MustExec("create table t4(d datetime, a int, b int, primary key(d, a)) partition by hash(year(d)) partitions 10;") - tk.MustExec("create table t5(d date, a int, b int, primary key(d, a)) partition by hash(month(d)) partitions 10;") - tk.MustExec("create table t6(a int, b int) partition by hash(a) partitions 3;") - tk.MustExec("create table t7(a int, b int) partition by hash(a + b) partitions 10;") - - var input []string - var output []struct { - SQL string - Result []string - } - s.testData.GetTestCases(c, &input, &output) - for i, tt := range input { - s.testData.OnRecord(func() { - output[i].SQL = tt - output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) - }) - tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) - } -} diff --git a/expression/scalar_function.go b/expression/scalar_function.go old mode 100755 new mode 100644 index 15f713099b39b..57e0419c26a63 --- a/expression/scalar_function.go +++ b/expression/scalar_function.go @@ -28,12 +28,13 @@ import ( "github.com/pingcap/tidb/types/json" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/hack" ) // error definitions. var ( - ErrNoDB = terror.ClassOptimizer.New(mysql.ErrNoDB, mysql.MySQLErrName[mysql.ErrNoDB]) + ErrNoDB = dbterror.ClassOptimizer.NewStd(mysql.ErrNoDB) ) // ScalarFunction is the function that returns a value. @@ -152,10 +153,10 @@ func typeInferForNull(args []Expression) { // Infer the actual field type of the NULL constant. var retFieldTp *types.FieldType var hasNullArg bool - for _, arg := range args { - isNullArg := isNull(arg) + for i := len(args) - 1; i >= 0; i-- { + isNullArg := isNull(args[i]) if !isNullArg && retFieldTp == nil { - retFieldTp = arg.GetType() + retFieldTp = args[i].GetType() } hasNullArg = hasNullArg || isNullArg // Break if there are both NULL and non-NULL expression @@ -180,8 +181,11 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType if retType == nil { return nil, errors.Errorf("RetType cannot be nil for ScalarFunction.") } - if funcName == ast.Cast { + switch funcName { + case ast.Cast: return BuildCastFunction(ctx, args[0], retType), nil + case ast.GetVar: + return BuildGetVarFunction(ctx, args[0], retType) } fc, ok := funcs[funcName] if !ok { @@ -199,7 +203,13 @@ func newFunctionImpl(ctx sessionctx.Context, fold int, funcName string, retType } funcArgs := make([]Expression, len(args)) copy(funcArgs, args) - typeInferForNull(funcArgs) + switch funcName { + case ast.If, ast.Ifnull, ast.Nullif: + // Do nothing. Because it will call InferType4ControlFuncs. + default: + typeInferForNull(funcArgs) + } + f, err := fc.getFunction(ctx, funcArgs) if err != nil { return nil, err @@ -418,29 +428,6 @@ func (sf *ScalarFunction) ResolveIndices(schema *Schema) (Expression, error) { } func (sf *ScalarFunction) resolveIndices(schema *Schema) error { - if sf.FuncName.L == ast.In { - args := []Expression{} - switch inFunc := sf.Function.(type) { - case *builtinInIntSig: - args = inFunc.nonConstArgs - case *builtinInStringSig: - args = inFunc.nonConstArgs - case *builtinInTimeSig: - args = inFunc.nonConstArgs - case *builtinInDurationSig: - args = inFunc.nonConstArgs - case *builtinInRealSig: - args = inFunc.nonConstArgs - case *builtinInDecimalSig: - args = inFunc.nonConstArgs - } - for _, arg := range args { - err := arg.resolveIndices(schema) - if err != nil { - return err - } - } - } for _, arg := range sf.GetArgs() { err := arg.resolveIndices(schema) if err != nil { diff --git a/expression/scalar_function_test.go b/expression/scalar_function_test.go old mode 100755 new mode 100644 diff --git a/expression/schema.go b/expression/schema.go index 998ac2df0d0e0..cc9ad648fadba 100644 --- a/expression/schema.go +++ b/expression/schema.go @@ -33,6 +33,9 @@ func (ki KeyInfo) Clone() KeyInfo { type Schema struct { Columns []*Column Keys []KeyInfo + // UniqueKeys stores those unique indexes that allow null values, but Keys does not allow null values. + // since equivalence conditions can filter out null values, in this case a unique index with null values can be a Key. + UniqueKeys []KeyInfo } // String implements fmt.Stringer interface. @@ -104,14 +107,34 @@ func (s *Schema) IsUniqueKey(col *Column) bool { return false } +// IsUnique checks if this column is a unique key which may contain duplicate nulls . +func (s *Schema) IsUnique(col *Column) bool { + for _, key := range s.UniqueKeys { + if len(key) == 1 && key[0].Equal(nil, col) { + return true + } + } + return false +} + // ColumnIndex finds the index for a column. func (s *Schema) ColumnIndex(col *Column) int { + backupIdx := -1 for i, c := range s.Columns { if c.UniqueID == col.UniqueID { + backupIdx = i + if c.IsPrefix { + // instead of returning a prefix column + // prefer to find a full column + // only clustered index table can meet this: + // same column `c1` maybe appear in both primary key and secondary index + // so secondary index itself can have two `c1` column one for indexKey and one for handle + continue + } return i } } - return -1 + return backupIdx } // Contains checks if the schema contains the column. diff --git a/expression/testdata/expression_suite_in.json b/expression/testdata/expression_suite_in.json index e67f1efc580fc..a059793e76982 100644 --- a/expression/testdata/expression_suite_in.json +++ b/expression/testdata/expression_suite_in.json @@ -3,39 +3,39 @@ "name": "TestOuterJoinPropConst", "cases": [ // Positive tests. - "explain select * from t1 left join t2 on t1.a > t2.a and t1.a = 1", - "explain select * from t1 left join t2 on t1.a > t2.a where t1.a = 1", - "explain select * from t1 left join t2 on t1.a = t2.a and t1.a > 1", - "explain select * from t1 left join t2 on t1.a = t2.a where t1.a > 1", - "explain select * from t1 right join t2 on t1.a > t2.a where t2.a = 1", - "explain select * from t1 right join t2 on t1.a = t2.a where t2.a > 1", - "explain select * from t1 right join t2 on t1.a = t2.a and t2.a > 1", - "explain select * from t1 right join t2 on t1.a > t2.a and t2.a = 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a and t1.a = 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a where t1.a = 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a and t1.a > 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a where t1.a > 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a where t2.a = 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a where t2.a > 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a and t2.a > 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a and t2.a = 1", // Negative tests. - "explain select * from t1 left join t2 on t1.a = t2.a and t2.a > 1", - "explain select * from t1 left join t2 on t1.a > t2.a and t2.a = 1", - "explain select * from t1 right join t2 on t1.a > t2.a and t1.a = 1", - "explain select * from t1 right join t2 on t1.a = t2.a and t1.a > 1", - "explain select * from t1 left join t2 on t1.a = t1.b and t1.a > 1", - "explain select * from t1 left join t2 on t2.a = t2.b and t2.a > 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a and t2.a > 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a and t2.a = 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a and t1.a = 1", + "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a and t1.a > 1", + "explain format = 'brief' select * from t1 left join t2 on t1.a = t1.b and t1.a > 1", + "explain format = 'brief' select * from t1 left join t2 on t2.a = t2.b and t2.a > 1", // Constant equal condition merge in outer join. - "explain select * from t1 left join t2 on true where t1.a = 1 and false", - "explain select * from t1 left join t2 on true where t1.a = 1 and null", - "explain select * from t1 left join t2 on true where t1.a = null", - "explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 2", - "explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 1", - "explain select * from t1 left join t2 on false", - "explain select * from t1 right join t2 on false", - "explain select * from t1 left join t2 on t1.a = 1 and t1.a = 2", - "explain select * from t1 left join t2 on t1.a =1 where t1.a = 2", - "explain select * from t1 left join t2 on t2.a = 1 and t2.a = 2", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and false", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and null", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = null", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and t1.a = 2", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and t1.a = 1", + "explain format = 'brief' select * from t1 left join t2 on false", + "explain format = 'brief' select * from t1 right join t2 on false", + "explain format = 'brief' select * from t1 left join t2 on t1.a = 1 and t1.a = 2", + "explain format = 'brief' select * from t1 left join t2 on t1.a =1 where t1.a = 2", + "explain format = 'brief' select * from t1 left join t2 on t2.a = 1 and t2.a = 2", // Constant propagation for DNF in outer join. - "explain select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3)", - "explain select * from t1 left join t2 on true where t1.a = 1 or (t1.a = 2 and t1.a = 3)", + "explain format = 'brief' select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3)", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 or (t1.a = 2 and t1.a = 3)", // Constant propagation over left outer semi join, filter with aux column should not be derived. - "explain select * from t1 where t1.b > 1 or t1.b in (select b from t2)", + "explain format = 'brief' select * from t1 where t1.b > 1 or t1.b in (select b from t2)", // Don't propagate for the control function. - "explain select * from t1 left join t2 on t1.a = t2.a where ifnull(t2.b, t1.a) = 1" + "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a where ifnull(t2.b, t1.a) = 1" ] } ] diff --git a/expression/testdata/expression_suite_out.json b/expression/testdata/expression_suite_out.json index ddbd8c6678d88..ea36fc2923764 100644 --- a/expression/testdata/expression_suite_out.json +++ b/expression/testdata/expression_suite_out.json @@ -3,288 +3,286 @@ "Name": "TestOuterJoinPropConst", "Cases": [ { - "SQL": "explain select * from t1 left join t2 on t1.a > t2.a and t1.a = 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a and t1.a = 1", "Result": [ - "HashJoin_6 33233333.33 root CARTESIAN left outer join, left cond:[eq(test.t1.a, 1)]", - "├─TableReader_12(Build) 3323.33 root data:Selection_11", - "│ └─Selection_11 3323.33 cop[tikv] gt(1, test.t2.a)", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 33233333.33 root CARTESIAN left outer join, left cond:[eq(test.t1.a, 1)]", + "├─TableReader(Build) 3323.33 root data:Selection", + "│ └─Selection 3323.33 cop[tikv] gt(1, test.t2.a)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a > t2.a where t1.a = 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a where t1.a = 1", "Result": [ - "HashJoin_8 33233.33 root CARTESIAN left outer join", - "├─TableReader_11(Build) 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 1)", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_14(Probe) 3323.33 root data:Selection_13", - " └─Selection_13 3323.33 cop[tikv] gt(1, test.t2.a)", - " └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 33233.33 root CARTESIAN left outer join", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t1.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 3323.33 root data:Selection", + " └─Selection 3323.33 cop[tikv] gt(1, test.t2.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = t2.a and t1.a > 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a and t1.a > 1", "Result": [ - "HashJoin_6 10000.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)], left cond:[gt(test.t1.a, 1)]", - "├─TableReader_12(Build) 3333.33 root data:Selection_11", - "│ └─Selection_11 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 10000.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)], left cond:[gt(test.t1.a, 1)]", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = t2.a where t1.a > 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a where t1.a > 1", "Result": [ - "HashJoin_7 4166.67 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_14(Build) 3333.33 root data:Selection_13", - "│ └─Selection_13 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 3333.33 root data:Selection_10", - " └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1)", - " └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 4166.67 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 3333.33 root data:Selection", + " └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a > t2.a where t2.a = 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a where t2.a = 1", "Result": [ - "HashJoin_8 33333.33 root CARTESIAN right outer join", - "├─TableReader_14(Build) 10.00 root data:Selection_13", - "│ └─Selection_13 10.00 cop[tikv] eq(test.t2.a, 1)", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 3333.33 root data:Selection_10", - " └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1)", - " └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 33333.33 root CARTESIAN right outer join", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t2.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 3333.33 root data:Selection", + " └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a = t2.a where t2.a > 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a where t2.a > 1", "Result": [ - "HashJoin_7 4166.67 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 3333.33 root data:Selection_10", - "│ └─Selection_10 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_14(Probe) 3333.33 root data:Selection_13", - " └─Selection_13 3333.33 cop[tikv] gt(test.t2.a, 1)", - " └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 4166.67 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 3333.33 root data:Selection", + " └─Selection 3333.33 cop[tikv] gt(test.t2.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a = t2.a and t2.a > 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a and t2.a > 1", "Result": [ - "HashJoin_6 10000.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)], right cond:gt(test.t2.a, 1)", - "├─TableReader_10(Build) 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", - "│ └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 10000.00 root data:TableFullScan_11", - " └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 10000.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)], right cond:gt(test.t2.a, 1)", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a > t2.a and t2.a = 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a and t2.a = 1", "Result": [ - "HashJoin_6 33333333.33 root CARTESIAN right outer join, right cond:eq(test.t2.a, 1)", - "├─TableReader_10(Build) 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1)", - "│ └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 10000.00 root data:TableFullScan_11", - " └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 33333333.33 root CARTESIAN right outer join, right cond:eq(test.t2.a, 1)", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = t2.a and t2.a > 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a and t2.a > 1", "Result": [ - "HashJoin_6 10000.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_12(Build) 3333.33 root data:Selection_11", - "│ └─Selection_11 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 10000.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t2.a, 1), not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a > t2.a and t2.a = 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a > t2.a and t2.a = 1", "Result": [ - "HashJoin_6 100000.00 root CARTESIAN left outer join, other cond:gt(test.t1.a, test.t2.a)", - "├─TableReader_12(Build) 10.00 root data:Selection_11", - "│ └─Selection_11 10.00 cop[tikv] eq(test.t2.a, 1), not(isnull(test.t2.a))", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 100000.00 root CARTESIAN left outer join, other cond:gt(test.t1.a, test.t2.a)", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t2.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a > t2.a and t1.a = 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a > t2.a and t1.a = 1", "Result": [ - "HashJoin_6 100000.00 root CARTESIAN right outer join, other cond:gt(test.t1.a, test.t2.a)", - "├─TableReader_10(Build) 10.00 root data:Selection_9", - "│ └─Selection_9 10.00 cop[tikv] eq(test.t1.a, 1), not(isnull(test.t1.a))", - "│ └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 10000.00 root data:TableFullScan_11", - " └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 100000.00 root CARTESIAN right outer join, other cond:gt(test.t1.a, test.t2.a)", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t1.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on t1.a = t2.a and t1.a > 1", + "SQL": "explain format = 'brief' select * from t1 right join t2 on t1.a = t2.a and t1.a > 1", "Result": [ - "HashJoin_6 10000.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_10(Build) 3333.33 root data:Selection_9", - "│ └─Selection_9 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", - "│ └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 10000.00 root data:TableFullScan_11", - " └─TableFullScan_11 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 10000.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 3333.33 root data:Selection", + "│ └─Selection 3333.33 cop[tikv] gt(test.t1.a, 1), not(isnull(test.t1.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = t1.b and t1.a > 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = t1.b and t1.a > 1", "Result": [ - "HashJoin_6 100000000.00 root CARTESIAN left outer join, left cond:[eq(test.t1.a, test.t1.b) gt(test.t1.a, 1)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_10", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 100000000.00 root CARTESIAN left outer join, left cond:[eq(test.t1.a, test.t1.b) gt(test.t1.a, 1)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t2.a = t2.b and t2.a > 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t2.a = t2.b and t2.a > 1", "Result": [ - "HashJoin_6 26666666.67 root CARTESIAN left outer join", - "├─TableReader_12(Build) 2666.67 root data:Selection_11", - "│ └─Selection_11 2666.67 cop[tikv] eq(test.t2.a, test.t2.b), gt(test.t2.a, 1)", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 8888888.89 root CARTESIAN left outer join", + "├─TableReader(Build) 888.89 root data:Selection", + "│ └─Selection 888.89 cop[tikv] eq(test.t2.a, test.t2.b), gt(test.t2.a, 1), gt(test.t2.b, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and false", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and false", "Result": [ - "TableDual_8 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and null", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and null", "Result": [ - "TableDual_8 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = null", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = null", "Result": [ - "TableDual_8 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 2", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and t1.a = 2", "Result": [ - "TableDual_8 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and t1.a = 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and t1.a = 1", "Result": [ - "HashJoin_8 80000.00 root CARTESIAN left outer join", - "├─TableReader_11(Build) 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 1)", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_12", - " └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 80000.00 root CARTESIAN left outer join", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t1.a, 1)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on false", + "SQL": "explain format = 'brief' select * from t1 left join t2 on false", "Result": [ - "HashJoin_6 80000000.00 root CARTESIAN left outer join", - "├─TableDual_10(Build) 8000.00 root rows:0", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 80000000.00 root CARTESIAN left outer join", + "├─TableDual(Build) 8000.00 root rows:0", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 right join t2 on false", + "SQL": "explain format = 'brief' select * from t1 right join t2 on false", "Result": [ - "HashJoin_6 80000000.00 root CARTESIAN right outer join", - "├─TableDual_8(Build) 8000.00 root rows:0", - "└─TableReader_10(Probe) 10000.00 root data:TableFullScan_9", - " └─TableFullScan_9 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 80000000.00 root CARTESIAN right outer join", + "├─TableDual(Build) 8000.00 root rows:0", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = 1 and t1.a = 2", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = 1 and t1.a = 2", "Result": [ - "HashJoin_6 80000000.00 root CARTESIAN left outer join", - "├─TableDual_10(Build) 8000.00 root rows:0", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 80000000.00 root CARTESIAN left outer join", + "├─TableDual(Build) 8000.00 root rows:0", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a =1 where t1.a = 2", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a =1 where t1.a = 2", "Result": [ - "HashJoin_8 80000.00 root CARTESIAN left outer join", - "├─TableReader_11(Build) 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] eq(test.t1.a, 2)", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableDual_12(Probe) 8000.00 root rows:0" + "HashJoin 80000.00 root CARTESIAN left outer join", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] eq(test.t1.a, 2)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableDual(Probe) 8000.00 root rows:0" ] }, { - "SQL": "explain select * from t1 left join t2 on t2.a = 1 and t2.a = 2", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t2.a = 1 and t2.a = 2", "Result": [ - "HashJoin_6 10000.00 root CARTESIAN left outer join", - "├─TableReader_12(Build) 0.00 root data:Selection_11", - "│ └─Selection_11 0.00 cop[tikv] eq(test.t2.a, 1), eq(test.t2.a, 2)", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 80000000.00 root CARTESIAN left outer join", + "├─TableDual(Build) 8000.00 root rows:0", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3)", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = 1 or (t1.a = 2 and t1.a = 3)", "Result": [ - "HashJoin_6 100000000.00 root CARTESIAN left outer join, left cond:[or(eq(test.t1.a, 1), 0)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_10", - "│ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_9(Probe) 10000.00 root data:TableFullScan_8", - " └─TableFullScan_8 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 100000000.00 root CARTESIAN left outer join, left cond:[or(eq(test.t1.a, 1), 0)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 or (t1.a = 2 and t1.a = 3)", + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 or (t1.a = 2 and t1.a = 3)", "Result": [ - "HashJoin_8 80000.00 root CARTESIAN left outer join", - "├─TableReader_11(Build) 10.00 root data:Selection_10", - "│ └─Selection_10 10.00 cop[tikv] or(eq(test.t1.a, 1), 0)", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_12", - " └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 80000.00 root CARTESIAN left outer join", + "├─TableReader(Build) 10.00 root data:Selection", + "│ └─Selection 10.00 cop[tikv] or(eq(test.t1.a, 1), 0)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 where t1.b > 1 or t1.b in (select b from t2)", + "SQL": "explain format = 'brief' select * from t1 where t1.b > 1 or t1.b in (select b from t2)", "Result": [ - "Projection_7 8000.00 root test.t1.id, test.t1.a, test.t1.b", - "└─Selection_8 8000.00 root or(gt(test.t1.b, 1), Column#7)", - " └─HashJoin_9 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.b, test.t2.b)", - " ├─TableReader_13(Build) 10000.00 root data:TableFullScan_12", - " │ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_11(Probe) 10000.00 root data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 8000.00 root test.t1.id, test.t1.a, test.t1.b", + "└─Selection 8000.00 root or(gt(test.t1.b, 1), Column#7)", + " └─HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.b, test.t2.b)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t1 left join t2 on t1.a = t2.a where ifnull(t2.b, t1.a) = 1", + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.a = t2.a where ifnull(t2.b, t1.a) = 1", "Result": [ - "Selection_7 9990.00 root eq(ifnull(test.t2.b, test.t1.a), 1)", - "└─HashJoin_8 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader_14(Build) 9990.00 root data:Selection_13", - " │ └─Selection_13 9990.00 cop[tikv] not(isnull(test.t2.a))", - " │ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_11(Probe) 10000.00 root data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Selection 9990.00 root eq(ifnull(test.t2.b, test.t1.a), 1)", + "└─HashJoin 12487.50 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] } ] diff --git a/expression/testdata/flag_simplify_in.json b/expression/testdata/flag_simplify_in.json index 807a2e59984aa..96c89a8cc5bef 100644 --- a/expression/testdata/flag_simplify_in.json +++ b/expression/testdata/flag_simplify_in.json @@ -2,27 +2,27 @@ { "name": "TestSimplifyExpressionByFlag", "cases": [ - "explain select * from t where a is null", - "explain select * from t where a is not null", - "explain select * from t where a > -1", - "explain select * from t where a <= -1", - "explain select * from t where a < 0", - "explain select * from t where a >= 0", - "explain select * from t where a = -1", - "explain select * from t where a <=> -1", - "explain select * from t where a != -1", - "explain select * from t where 0 > a", - "explain select * from t where 0 <= a", - "explain select * from t where -1 < a", - "explain select * from t where -1 >= a", - "explain select * from t where -1 = a", - "explain select * from t where -1 <=> a", - "explain select * from t where -1 != a", + "explain format = 'brief' select * from t where a is null", + "explain format = 'brief' select * from t where a is not null", + "explain format = 'brief' select * from t where a > -1", + "explain format = 'brief' select * from t where a <= -1", + "explain format = 'brief' select * from t where a < 0", + "explain format = 'brief' select * from t where a >= 0", + "explain format = 'brief' select * from t where a = -1", + "explain format = 'brief' select * from t where a <=> -1", + "explain format = 'brief' select * from t where a != -1", + "explain format = 'brief' select * from t where 0 > a", + "explain format = 'brief' select * from t where 0 <= a", + "explain format = 'brief' select * from t where -1 < a", + "explain format = 'brief' select * from t where -1 >= a", + "explain format = 'brief' select * from t where -1 = a", + "explain format = 'brief' select * from t where -1 <=> a", + "explain format = 'brief' select * from t where -1 != a", // Tuples with null b should be filered out. - "explain select * from t where b >= 0", - "explain select * from t where b != -1", + "explain format = 'brief' select * from t where b >= 0", + "explain format = 'brief' select * from t where b != -1", // Int64 overflow corner case. - "explain select * from t where a = 0xFFFFFFFFFFFFFFFF" + "explain format = 'brief' select * from t where a = 0xFFFFFFFFFFFFFFFF" ] } ] diff --git a/expression/testdata/flag_simplify_out.json b/expression/testdata/flag_simplify_out.json index 62090584486ba..9d0986f903be8 100644 --- a/expression/testdata/flag_simplify_out.json +++ b/expression/testdata/flag_simplify_out.json @@ -3,130 +3,130 @@ "Name": "TestSimplifyExpressionByFlag", "Cases": [ { - "SQL": "explain select * from t where a is null", + "SQL": "explain format = 'brief' select * from t where a is null", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a is not null", + "SQL": "explain format = 'brief' select * from t where a is not null", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a > -1", + "SQL": "explain format = 'brief' select * from t where a > -1", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a <= -1", + "SQL": "explain format = 'brief' select * from t where a <= -1", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a < 0", + "SQL": "explain format = 'brief' select * from t where a < 0", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a >= 0", + "SQL": "explain format = 'brief' select * from t where a >= 0", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a = -1", + "SQL": "explain format = 'brief' select * from t where a = -1", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a <=> -1", + "SQL": "explain format = 'brief' select * from t where a <=> -1", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a != -1", + "SQL": "explain format = 'brief' select * from t where a != -1", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where 0 > a", + "SQL": "explain format = 'brief' select * from t where 0 > a", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where 0 <= a", + "SQL": "explain format = 'brief' select * from t where 0 <= a", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where -1 < a", + "SQL": "explain format = 'brief' select * from t where -1 < a", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where -1 >= a", + "SQL": "explain format = 'brief' select * from t where -1 >= a", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where -1 = a", + "SQL": "explain format = 'brief' select * from t where -1 = a", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where -1 <=> a", + "SQL": "explain format = 'brief' select * from t where -1 <=> a", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where -1 != a", + "SQL": "explain format = 'brief' select * from t where -1 != a", "Plan": [ - "TableReader_6 10000.00 root data:TableFullScan_5", - "└─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where b >= 0", + "SQL": "explain format = 'brief' select * from t where b >= 0", "Plan": [ - "TableReader_7 3333.33 root data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] ge(test.t.b, 0)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 3333.33 root data:Selection", + "└─Selection 3333.33 cop[tikv] ge(test.t.b, 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where b != -1", + "SQL": "explain format = 'brief' select * from t where b != -1", "Plan": [ - "TableReader_7 3333.33 root data:Selection_6", - "└─Selection_6 3333.33 cop[tikv] ne(test.t.b, -1)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 3333.33 root data:Selection", + "└─Selection 3333.33 cop[tikv] ne(test.t.b, -1)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a = 0xFFFFFFFFFFFFFFFF", + "SQL": "explain format = 'brief' select * from t where a = 0xFFFFFFFFFFFFFFFF", "Plan": [ - "TableReader_7 10.00 root data:Selection_6", - "└─Selection_6 10.00 cop[tikv] eq(test.t.a, 18446744073709551615)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10.00 root data:Selection", + "└─Selection 10.00 cop[tikv] eq(test.t.a, 18446744073709551615)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] } ] diff --git a/expression/testdata/partition_pruner_in.json b/expression/testdata/partition_pruner_in.json deleted file mode 100644 index ba9d6eb43f333..0000000000000 --- a/expression/testdata/partition_pruner_in.json +++ /dev/null @@ -1,29 +0,0 @@ -[ - { - "name": "TestHashPartitionPruner", - "cases": [ - "explain select * from t1 where id = 7 and a = 6", - "explain select * from t3 where id = 9 and a = 1", - "explain select * from t2 where id = 9 and a = -110", - "explain select * from t1 where id = -17", - "explain select * from t1 join t2 on (t1.id = t2.id) where t1.id = 5 and t2.a = 7", - "explain select * from t1 left join t2 on t1.id = 1 and t2.a = 2 where t2.id = 7", - "explain select * from t2 join t1 on t1.id = t2.id and t2.a = t1.id and t2.id = 12", - "explain select * from t1 left join t2 on true where t1.a = 1 and false", - "explain select * from t1 left join t2 on true where t1.a = 1 and null", - "explain select * from t1 left join t2 on true where t1.a = null", - "explain select * from t4 where d = '2019-10-07 10:40:00' and a = 1", - "explain select * from t5 where d = '2019-10-07'", - "explain select * from t6 where a is null", - "explain select * from t6 where b is null", - "explain select * from t6 where a = 7 or a = 6", - "explain select * from t6 where a in (6, 7)", - "explain select * from t5 where d is null", - "explain select * from t7 where b = -3 and a is null", - "explain select * from t7 where (a, b) in ((3, 4), (5, 6))", - "explain select * from t7 where (a = 1 and b = 2) or (a = 3 and b = 4)", - "explain select * from t7 where (a = 1 and b = 2) or (a = 1 and b = 2)", - "explain select * from t7 partition(p0) where (a = 1 and b = 2) or (a = 3 and b = 4)" - ] - } -] diff --git a/expression/testdata/partition_pruner_out.json b/expression/testdata/partition_pruner_out.json deleted file mode 100644 index 02d188697d8a5..0000000000000 --- a/expression/testdata/partition_pruner_out.json +++ /dev/null @@ -1,181 +0,0 @@ -[ - { - "Name": "TestHashPartitionPruner", - "Cases": [ - { - "SQL": "explain select * from t1 where id = 7 and a = 6", - "Result": [ - "TableReader_7 0.00 root partition:p7 data:Selection_6", - "└─Selection_6 0.00 cop[tikv] eq(test_partition.t1.a, 6)", - " └─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[7,7], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t3 where id = 9 and a = 1", - "Result": [ - "Point_Get_1 1.00 root table:t3, partition:p9, index:PRIMARY(id, a) " - ] - }, - { - "SQL": "explain select * from t2 where id = 9 and a = -110", - "Result": [ - "IndexLookUp_7 1.00 root partition:p1 ", - "├─IndexRangeScan_5(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[9 -110,9 -110], keep order:false, stats:pseudo", - "└─TableRowIDScan_6(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t1 where id = -17", - "Result": [ - "TableReader_6 1.00 root partition:p7 data:TableRangeScan_5", - "└─TableRangeScan_5 1.00 cop[tikv] table:t1 range:[-17,-17], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t1 join t2 on (t1.id = t2.id) where t1.id = 5 and t2.a = 7", - "Result": [ - "HashJoin_8 1.00 root CARTESIAN inner join", - "├─IndexLookUp_14(Build) 1.00 root partition:p2 ", - "│ ├─IndexRangeScan_12(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[5 7,5 7], keep order:false, stats:pseudo", - "│ └─TableRowIDScan_13(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 1.00 root partition:p5 data:TableRangeScan_10", - " └─TableRangeScan_10 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t1 left join t2 on t1.id = 1 and t2.a = 2 where t2.id = 7", - "Result": [ - "HashJoin_7 1.00 root CARTESIAN inner join", - "├─IndexLookUp_13(Build) 1.00 root partition:p9 ", - "│ ├─IndexRangeScan_11(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[7 2,7 2], keep order:false, stats:pseudo", - "│ └─TableRowIDScan_12(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_10(Probe) 1.00 root partition:p1 data:TableRangeScan_9", - " └─TableRangeScan_9 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t2 join t1 on t1.id = t2.id and t2.a = t1.id and t2.id = 12", - "Result": [ - "HashJoin_7 1.00 root CARTESIAN inner join", - "├─TableReader_13(Build) 1.00 root partition:p2 data:TableRangeScan_12", - "│ └─TableRangeScan_12 1.00 cop[tikv] table:t1 range:[12,12], keep order:false, stats:pseudo", - "└─IndexLookUp_11(Probe) 1.00 root partition:p4 ", - " ├─IndexRangeScan_9(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[12 12,12 12], keep order:false, stats:pseudo", - " └─TableRowIDScan_10(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and false", - "Result": [ - "TableDual_8 0.00 root rows:0" - ] - }, - { - "SQL": "explain select * from t1 left join t2 on true where t1.a = 1 and null", - "Result": [ - "TableDual_8 0.00 root rows:0" - ] - }, - { - "SQL": "explain select * from t1 left join t2 on true where t1.a = null", - "Result": [ - "TableDual_8 0.00 root rows:0" - ] - }, - { - "SQL": "explain select * from t4 where d = '2019-10-07 10:40:00' and a = 1", - "Result": [ - "IndexLookUp_7 1.00 root partition:p9 ", - "├─IndexRangeScan_5(Build) 1.00 cop[tikv] table:t4, index:PRIMARY(d, a) range:[2019-10-07 10:40:00 1,2019-10-07 10:40:00 1], keep order:false, stats:pseudo", - "└─TableRowIDScan_6(Probe) 1.00 cop[tikv] table:t4 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t5 where d = '2019-10-07'", - "Result": [ - "IndexLookUp_10 10.00 root partition:p0 ", - "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t5, index:PRIMARY(d, a) range:[2019-10-07,2019-10-07], keep order:false, stats:pseudo", - "└─TableRowIDScan_9(Probe) 10.00 cop[tikv] table:t5 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t6 where a is null", - "Result": [ - "TableReader_7 10.00 root partition:p0 data:Selection_6", - "└─Selection_6 10.00 cop[tikv] isnull(test_partition.t6.a)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t6 where b is null", - "Result": [ - "TableReader_7 10.00 root partition:all data:Selection_6", - "└─Selection_6 10.00 cop[tikv] isnull(test_partition.t6.b)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t6 where a = 7 or a = 6", - "Result": [ - "TableReader_7 20.00 root partition:p0,p1 data:Selection_6", - "└─Selection_6 20.00 cop[tikv] or(eq(test_partition.t6.a, 7), eq(test_partition.t6.a, 6))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t6 where a in (6, 7)", - "Result": [ - "TableReader_7 20.00 root partition:p0,p1 data:Selection_6", - "└─Selection_6 20.00 cop[tikv] in(test_partition.t6.a, 6, 7)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t5 where d is null", - "Result": [ - "TableDual_6 0.00 root rows:0" - ] - }, - { - "SQL": "explain select * from t7 where b = -3 and a is null", - "Result": [ - "TableReader_7 0.01 root partition:p0 data:Selection_6", - "└─Selection_6 0.01 cop[tikv] eq(test_partition.t7.b, -3), isnull(test_partition.t7.a)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t7 where (a, b) in ((3, 4), (5, 6))", - "Result": [ - "TableReader_7 0.02 root partition:p1,p7 data:Selection_6", - "└─Selection_6 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)), and(eq(test_partition.t7.a, 5), eq(test_partition.t7.b, 6)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t7 where (a = 1 and b = 2) or (a = 3 and b = 4)", - "Result": [ - "TableReader_7 0.02 root partition:p3,p7 data:Selection_6", - "└─Selection_6 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t7 where (a = 1 and b = 2) or (a = 1 and b = 2)", - "Result": [ - "TableReader_7 0.02 root partition:p3 data:Selection_6", - "└─Selection_6 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" - ] - }, - { - "SQL": "explain select * from t7 partition(p0) where (a = 1 and b = 2) or (a = 3 and b = 4)", - "Result": [ - "TableReader_7 0.02 root partition:dual data:Selection_6", - "└─Selection_6 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" - ] - } - ] - } -] diff --git a/expression/typeinfer_test.go b/expression/typeinfer_test.go index cc937c645014b..aac2eabee5632 100644 --- a/expression/typeinfer_test.go +++ b/expression/typeinfer_test.go @@ -156,26 +156,26 @@ func (s *testInferTypeSuite) TestInferType(c *C) { func (s *testInferTypeSuite) createTestCase4Constants() []typeInferTestCase { return []typeInferTestCase{ - {"1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"-1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, - {"1.23", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 4, 2}, - {"-1.23", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 5, 2}, - {"123e5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 8, types.UnspecifiedLength}, - {"-123e5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 9, types.UnspecifiedLength}, - {"123e-5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 7, types.UnspecifiedLength}, - {"-123e-5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 8, types.UnspecifiedLength}, + {"1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 1, 0}, + {"-1", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 2, 0}, + {"1.23", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 4, 2}, + {"-1.23", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 5, 2}, + {"123e5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 8, types.UnspecifiedLength}, + {"-123e5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 9, types.UnspecifiedLength}, + {"123e-5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 7, types.UnspecifiedLength}, + {"-123e-5", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 8, types.UnspecifiedLength}, {"NULL", mysql.TypeNull, charset.CharsetBin, mysql.BinaryFlag, 0, 0}, - {"TRUE", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, - {"FALSE", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, - {"'1234'", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 4, types.UnspecifiedLength}, - {"_utf8'1234'", mysql.TypeVarString, charset.CharsetUTF8, 0, 4, types.UnspecifiedLength}, - {"_binary'1234'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 4, types.UnspecifiedLength}, - {"b'0001'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"b'000100001'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, - {"b'0000000000010000'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, - {"x'10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, 3, 0}, - {"x'ff10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, 6, 0}, - {"x'0000000000000000ff10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, 30, 0}, + {"TRUE", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, + {"FALSE", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, + {"'1234'", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 4, types.UnspecifiedLength}, + {"_utf8'1234'", mysql.TypeVarString, charset.CharsetUTF8, 0 | mysql.NotNullFlag, 4, types.UnspecifiedLength}, + {"_binary'1234'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 4, types.UnspecifiedLength}, + {"b'0001'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 1, 0}, + {"b'000100001'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 2, 0}, + {"b'0000000000010000'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 2, 0}, + {"x'10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, 3, 0}, + {"x'ff10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, 6, 0}, + {"x'0000000000000000ff10'", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, 30, 0}, } } @@ -213,8 +213,8 @@ func (s *testInferTypeSuite) createTestCase4Columns() []typeInferTestCase { {"c_udouble_d ", mysql.TypeDouble, charset.CharsetBin, mysql.UnsignedFlag, 22, types.UnspecifiedLength}, {"c_decimal ", mysql.TypeNewDecimal, charset.CharsetBin, 0, 6, 3}, // TODO: Flen should be 8 {"c_udecimal ", mysql.TypeNewDecimal, charset.CharsetBin, mysql.UnsignedFlag, 10, 3}, // TODO: Flen should be 11 - {"c_decimal_d ", mysql.TypeNewDecimal, charset.CharsetBin, 0, 11, 0}, - {"c_udecimal_d ", mysql.TypeNewDecimal, charset.CharsetBin, mysql.UnsignedFlag, 11, 0}, // TODO: Flen should be 10 + {"c_decimal_d ", mysql.TypeNewDecimal, charset.CharsetBin, 0, 10, 0}, + {"c_udecimal_d ", mysql.TypeNewDecimal, charset.CharsetBin, mysql.UnsignedFlag, 10, 0}, {"c_datetime ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 22, 2}, {"c_datetime_d ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, {"c_time ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 14, 3}, @@ -241,9 +241,9 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"space(c_int_d)", mysql.TypeLongBlob, mysql.DefaultCharset, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, {"CONCAT(c_binary, c_int_d)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 40, types.UnspecifiedLength}, {"CONCAT(c_bchar, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, - {"CONCAT('T', 'i', 'DB')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 4, types.UnspecifiedLength}, + {"CONCAT('T', 'i', 'DB')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 4, types.UnspecifiedLength}, {"CONCAT('T', 'i', 'DB', c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 24, types.UnspecifiedLength}, - {"CONCAT_WS('-', 'T', 'i', 'DB')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 6, types.UnspecifiedLength}, + {"CONCAT_WS('-', 'T', 'i', 'DB')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 6, types.UnspecifiedLength}, {"CONCAT_WS(',', 'TiDB', c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 25, types.UnspecifiedLength}, {"left(c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"right(c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, @@ -251,7 +251,7 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"lower(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"upper(c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"upper(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, - {"replace(1234, 2, 55)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, + {"replace(1234, 2, 55)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 20, types.UnspecifiedLength}, {"replace(c_binary, 1, 2)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"to_base64(c_binary)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 28, types.UnspecifiedLength}, {"substr(c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, @@ -272,15 +272,15 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"trim(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"ascii(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 3, 0}, {"ord(c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {`c_int_d like 'abc%'`, mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"tidb_version()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, len(printer.GetTiDBInfo()), types.UnspecifiedLength}, - {"tidb_is_ddl_owner()", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, + {`c_int_d like 'abc%'`, mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"tidb_version()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, len(printer.GetTiDBInfo()), types.UnspecifiedLength}, + {"tidb_is_ddl_owner()", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxIntWidth, 0}, {"password(c_char)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.PWDHashLen + 1, types.UnspecifiedLength}, {"elt(c_int_d, c_char, c_char, c_char)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"elt(c_int_d, c_char, c_char, c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"elt(c_int_d, c_char, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, - {"elt(c_int_d, c_char, c_double_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 22, types.UnspecifiedLength}, - {"elt(c_int_d, c_char, c_double_d, c_int_d, c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 22, types.UnspecifiedLength}, + {"elt(c_int_d, c_char, c_double_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, + {"elt(c_int_d, c_char, c_double_d, c_int_d, c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, {"locate(c_char, c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"locate(c_binary, c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, @@ -291,11 +291,11 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"locate(c_binary, c_char, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"locate(c_binary, c_binary, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, - {"lpad('TiDB', 12, 'go' )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 48, types.UnspecifiedLength}, + {"lpad('TiDB', 12, 'go' )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 48, types.UnspecifiedLength}, {"lpad(c_binary, 12, 'go' )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 12, types.UnspecifiedLength}, {"lpad(c_char, c_int_d, c_binary)", mysql.TypeLongBlob, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxBlobWidth, types.UnspecifiedLength}, {"lpad(c_char, c_int_d, c_char )", mysql.TypeLongBlob, charset.CharsetUTF8MB4, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, - {"rpad('TiDB', 12, 'go' )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 48, types.UnspecifiedLength}, + {"rpad('TiDB', 12, 'go' )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 48, types.UnspecifiedLength}, {"rpad(c_binary, 12, 'go' )", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 12, types.UnspecifiedLength}, {"rpad(c_char, c_int_d, c_binary)", mysql.TypeLongBlob, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxBlobWidth, types.UnspecifiedLength}, {"rpad(c_char, c_int_d, c_char )", mysql.TypeLongBlob, charset.CharsetUTF8MB4, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, @@ -405,8 +405,8 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"reverse(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"reverse(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, - {"reverse(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 12, types.UnspecifiedLength}, - {"reverse(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 22, types.UnspecifiedLength}, + {"reverse(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, + {"reverse(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, {"reverse(c_decimal )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 8, types.UnspecifiedLength}, {"reverse(c_char )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, {"reverse(c_varchar )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, @@ -456,8 +456,8 @@ func (s *testInferTypeSuite) createTestCase4StrFuncs() []typeInferTestCase { {"quote(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 42, types.UnspecifiedLength}, {"quote(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 42, types.UnspecifiedLength}, - {"quote(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 26, types.UnspecifiedLength}, - {"quote(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 46, types.UnspecifiedLength}, + {"quote(c_float_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 0, types.UnspecifiedLength}, + {"quote(c_double_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 0, types.UnspecifiedLength}, {"convert(c_double_d using utf8mb4)", mysql.TypeLongBlob, charset.CharsetUTF8MB4, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, {"convert(c_binary using utf8mb4)", mysql.TypeLongBlob, charset.CharsetUTF8MB4, 0, mysql.MaxBlobWidth, types.UnspecifiedLength}, @@ -493,9 +493,9 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"exp(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"exp(c_timestamp_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"exp(c_binary)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, - {"pi()", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 8, 6}, + {"pi()", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 8, 6}, {"~c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, - {"!c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"!c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"c_int_d & c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, {"c_int_d | c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, {"c_int_d ^ c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, @@ -522,8 +522,8 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"floor(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"floor(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"floor(c_bigint_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"floor(c_ubigint_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 + {"floor(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 + {"floor(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 {"floor(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, {"floor(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, @@ -535,13 +535,13 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"floor(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"floor(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"floor(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"floor(18446744073709551615)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, - {"floor(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, + {"floor(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag | mysql.NotNullFlag, 20, 0}, + {"floor(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 22, 0}, {"ceil(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"ceil(c_uint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, - {"ceil(c_bigint_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 - {"ceil(c_ubigint_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 + {"ceil(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 + {"ceil(c_ubigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 20, 0}, // TODO: Flen should be 17 {"ceil(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, {"floor(c_udecimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag, 10, 0}, {"ceil(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, @@ -553,8 +553,8 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"ceil(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"ceil(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"ceil(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceil(18446744073709551615)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, - {"ceil(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, + {"ceil(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag | mysql.NotNullFlag, 20, 0}, + {"ceil(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 22, 0}, {"ceiling(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"ceiling(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 6, 0}, @@ -564,8 +564,8 @@ func (s *testInferTypeSuite) createTestCase4MathFuncs() []typeInferTestCase { {"ceiling(c_time_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"ceiling(c_enum)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, {"ceiling(c_text_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, 0}, - {"ceiling(18446744073709551615)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, - {"ceiling(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 22, 0}, + {"ceiling(18446744073709551615)", mysql.TypeLonglong, charset.CharsetBin, mysql.UnsignedFlag | mysql.BinaryFlag | mysql.NotNullFlag, 20, 0}, + {"ceiling(18446744073709551615.1)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 22, 0}, {"conv(c_char, c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, {"conv(c_int_d, c_int_d, c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, @@ -782,11 +782,11 @@ func (s *testInferTypeSuite) createTestCase4ArithmeticFuncs() []typeInferTestCas func (s *testInferTypeSuite) createTestCase4LogicalFuncs() []typeInferTestCase { return []typeInferTestCase{ - {"c_int_d and c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_int_d xor c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"c_int_d and c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_int_d xor c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, - {"c_int_d && c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_int_d || c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"c_int_d && c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_int_d || c_int_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, } } @@ -820,18 +820,20 @@ func (s *testInferTypeSuite) createTestCase4ControlFuncs() []typeInferTestCase { func (s *testInferTypeSuite) createTestCase4Aggregations() []typeInferTestCase { return []typeInferTestCase{ - {"sum(c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 0}, + {"sum(c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 32, 0}, {"sum(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"sum(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, - {"sum(c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 3}, - {"sum(1.0)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 1}, + {"sum(c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 28, 3}, + {"sum(cast(c_decimal as decimal(65,3)))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 65, 3}, + {"sum(1.0)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 25, 1}, {"sum(1.2e2)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"sum(c_char)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, - {"avg(c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 4}, + {"avg(c_int_d)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 15, 4}, {"avg(c_float_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"avg(c_double_d)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, - {"avg(c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 7}, - {"avg(1.0)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDecimalWidth, 5}, + {"avg(c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 10, 7}, + {"avg(cast(c_decimal as decimal(65,3)))", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 65, 7}, + {"avg(1.0)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 7, 5}, {"avg(1.2e2)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"avg(c_char)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxRealWidth, types.UnspecifiedLength}, {"group_concat(c_int_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, mysql.MaxBlobWidth, 0}, @@ -841,15 +843,15 @@ func (s *testInferTypeSuite) createTestCase4Aggregations() []typeInferTestCase { func (s *testInferTypeSuite) createTestCase4InfoFunc() []typeInferTestCase { return []typeInferTestCase{ - {"last_insert_id( )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, + {"last_insert_id( )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, mysql.MaxIntWidth, 0}, {"last_insert_id(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, {"found_rows()", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, - {"database()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, + {"database()", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 64, types.UnspecifiedLength}, {"current_user()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, - {"current_role()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, + {"current_role()", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 64, types.UnspecifiedLength}, {"user()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, - {"connection_id()", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag, mysql.MaxIntWidth, 0}, - {"version()", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 64, types.UnspecifiedLength}, + {"connection_id()", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.UnsignedFlag | mysql.NotNullFlag, mysql.MaxIntWidth, 0}, + {"version()", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 64, types.UnspecifiedLength}, } } @@ -871,8 +873,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"md5(c_blob_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, {"md5(c_set )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, {"md5(c_enum )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, - {"md5('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, - {"md5(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 32, types.UnspecifiedLength}, + {"md5('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 32, types.UnspecifiedLength}, + {"md5(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 32, types.UnspecifiedLength}, {"sha(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, @@ -890,8 +892,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"sha(c_blob_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha(c_set )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha(c_enum )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, - {"sha('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, - {"sha(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, + {"sha('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 40, types.UnspecifiedLength}, + {"sha(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 40, types.UnspecifiedLength}, {"sha1(c_int_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha1(c_bigint_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, @@ -909,8 +911,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"sha1(c_blob_d )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha1(c_set )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, {"sha1(c_enum )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, - {"sha1('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, - {"sha1(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 40, types.UnspecifiedLength}, + {"sha1('1234' )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 40, types.UnspecifiedLength}, + {"sha1(1234 )", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 40, types.UnspecifiedLength}, {"sha2(c_int_d , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_bigint_d , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, @@ -928,8 +930,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"sha2(c_blob_d , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_set , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_enum , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, - {"sha2('1234' , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, - {"sha2(1234 , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, + {"sha2('1234' , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 128, types.UnspecifiedLength}, + {"sha2(1234 , 0)", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 128, types.UnspecifiedLength}, {"sha2(c_int_d , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_bigint_d , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, @@ -947,20 +949,19 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"sha2(c_blob_d , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_set , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, {"sha2(c_enum , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, - {"sha2('1234' , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, - {"sha2(1234 , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 128, types.UnspecifiedLength}, + {"sha2('1234' , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 128, types.UnspecifiedLength}, + {"sha2(1234 , '256')", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 128, types.UnspecifiedLength}, {"AES_ENCRYPT(c_int_d, 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, {"AES_ENCRYPT(c_char, 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, {"AES_ENCRYPT(c_varchar, 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, {"AES_ENCRYPT(c_binary, 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, {"AES_ENCRYPT(c_varbinary, 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, - {"AES_ENCRYPT('', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 16, types.UnspecifiedLength}, - {"AES_ENCRYPT('111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 16, types.UnspecifiedLength}, - {"AES_ENCRYPT('111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 16, types.UnspecifiedLength}, - {"AES_ENCRYPT('1111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, - {"AES_ENCRYPT('11111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, - + {"AES_ENCRYPT('', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 16, types.UnspecifiedLength}, + {"AES_ENCRYPT('111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 16, types.UnspecifiedLength}, + {"AES_ENCRYPT('111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 16, types.UnspecifiedLength}, + {"AES_ENCRYPT('1111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 32, types.UnspecifiedLength}, + {"AES_ENCRYPT('11111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 32, types.UnspecifiedLength}, {"AES_DECRYPT('1111111111111111', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 16, types.UnspecifiedLength}, {"AES_DECRYPT('11111111111111112222222222222222', 'key')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 32, types.UnspecifiedLength}, @@ -970,8 +971,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"COMPRESS(c_varchar)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 33, types.UnspecifiedLength}, {"COMPRESS(c_binary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 33, types.UnspecifiedLength}, {"COMPRESS(c_varbinary)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 33, types.UnspecifiedLength}, - {"COMPRESS('')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 13, types.UnspecifiedLength}, - {"COMPRESS('abcde')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 18, types.UnspecifiedLength}, + {"COMPRESS('')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 13, types.UnspecifiedLength}, + {"COMPRESS('abcde')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 18, types.UnspecifiedLength}, {"UNCOMPRESS(c_int_d)", mysql.TypeLongBlob, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxBlobWidth, types.UnspecifiedLength}, {"UNCOMPRESS(c_char)", mysql.TypeLongBlob, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxBlobWidth, types.UnspecifiedLength}, @@ -980,8 +981,8 @@ func (s *testInferTypeSuite) createTestCase4EncryptionFuncs() []typeInferTestCas {"UNCOMPRESSED_LENGTH(c_varchar)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, {"UNCOMPRESSED_LENGTH(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {"RANDOM_BYTES(5)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 1024, types.UnspecifiedLength}, - {"RANDOM_BYTES('123')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 1024, types.UnspecifiedLength}, + {"RANDOM_BYTES(5)", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 1024, types.UnspecifiedLength}, + {"RANDOM_BYTES('123')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 1024, types.UnspecifiedLength}, {"RANDOM_BYTES('abc')", mysql.TypeVarString, charset.CharsetBin, mysql.BinaryFlag, 1024, types.UnspecifiedLength}, } } @@ -993,37 +994,37 @@ func (s *testInferTypeSuite) createTestCase4CompareFuncs() []typeInferTestCase { {"coalesce(c_int_d, c_decimal)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 15, 3}, {"coalesce(c_int_d, c_datetime)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 22, types.UnspecifiedLength}, - {"isnull(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_time_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_varbinary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"isnull(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"nullif(c_int_d , 123)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, + {"isnull(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_float_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_double_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_decimal )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_datetime )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_time_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_char )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_varchar )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_text_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_binary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_varbinary )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_blob_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"isnull(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + + {"nullif(c_int_d , 123)", mysql.TypeLong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"nullif(c_bigint_d , 123)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, - {"nullif(c_float_d , 123)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 12, types.UnspecifiedLength}, + {"nullif(c_float_d , 123)", mysql.TypeFloat, charset.CharsetBin, mysql.BinaryFlag, 12, types.UnspecifiedLength}, {"nullif(c_double_d , 123)", mysql.TypeDouble, charset.CharsetBin, mysql.BinaryFlag, 22, types.UnspecifiedLength}, {"nullif(c_decimal , 123)", mysql.TypeNewDecimal, charset.CharsetBin, mysql.BinaryFlag, 6, 3}, - {"nullif(c_datetime , 123)", mysql.TypeVarchar, charset.CharsetUTF8MB4, 0, 22, types.UnspecifiedLength}, - {"nullif(c_time_d , 123)", mysql.TypeVarchar, charset.CharsetUTF8MB4, 0, 10, types.UnspecifiedLength}, - {"nullif(c_timestamp_d, 123)", mysql.TypeVarchar, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, - {"nullif(c_char , 123)", mysql.TypeString, charset.CharsetUTF8MB4, mysql.BinaryFlag, 20, types.UnspecifiedLength}, - {"nullif(c_varchar , 123)", mysql.TypeVarchar, charset.CharsetUTF8MB4, mysql.BinaryFlag, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString - {"nullif(c_text_d , 123)", mysql.TypeBlob, charset.CharsetUTF8MB4, mysql.BinaryFlag, 65535, types.UnspecifiedLength}, // TODO: tp should be TypeMediumBlob - {"nullif(c_binary , 123)", mysql.TypeString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString - {"nullif(c_varbinary , 123)", mysql.TypeVarchar, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString - {"nullif(c_blob_d , 123)", mysql.TypeBlob, charset.CharsetBin, mysql.BinaryFlag, 65535, types.UnspecifiedLength}, // TODO: tp should be TypeVarString + {"nullif(c_datetime , 123)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 22, 2}, + {"nullif(c_time_d , 123)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, + {"nullif(c_timestamp_d, 123)", mysql.TypeTimestamp, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, + {"nullif(c_char , 123)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, + {"nullif(c_varchar , 123)", mysql.TypeVarchar, charset.CharsetUTF8MB4, 0, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString + {"nullif(c_text_d , 123)", mysql.TypeBlob, charset.CharsetUTF8MB4, 0, 65535, types.UnspecifiedLength}, // TODO: tp should be TypeMediumBlob + {"nullif(c_binary , 123)", mysql.TypeString, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString + {"nullif(c_varbinary , 123)", mysql.TypeVarchar, charset.CharsetBin, mysql.BinaryFlag, 20, types.UnspecifiedLength}, // TODO: tp should be TypeVarString + {"nullif(c_blob_d , 123)", mysql.TypeBlob, charset.CharsetBin, mysql.BinaryFlag, 65535, types.UnspecifiedLength}, // TODO: tp should be TypeVarString {"interval(c_int_d, c_int_d, c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"interval(c_int_d, c_float_d, c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, @@ -1077,41 +1078,41 @@ func (s *testInferTypeSuite) createTestCase4Miscellaneous() []typeInferTestCase {"inet6_ntoa(c_timestamp_d)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 117, 0}, {"inet6_ntoa(c_binary)", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 117, 0}, - {"is_ipv4(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"is_ipv4_compat(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_compat(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"is_ipv4_mapped(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv4_mapped(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"is_ipv6(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"is_ipv6(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"is_ipv4(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + + {"is_ipv4_compat(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_compat(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + + {"is_ipv4_mapped(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv4_mapped(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + + {"is_ipv6(c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_timestamp_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"is_ipv6(c_binary)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"any_value(c_int_d)", mysql.TypeLong, charset.CharsetBin, mysql.BinaryFlag, 11, 0}, {"any_value(c_bigint_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 20, 0}, @@ -1135,40 +1136,40 @@ func (s *testInferTypeSuite) createTestCase4Miscellaneous() []typeInferTestCase func (s *testInferTypeSuite) createTestCase4OpFuncs() []typeInferTestCase { return []typeInferTestCase{ - {"c_int_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_decimal is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_double_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_float_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_datetime is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_time_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_enum is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_text_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"18446 is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1844674.1 is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"c_int_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_decimal is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_double_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_float_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_datetime is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_time_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_enum is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_text_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"18446 is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1844674.1 is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"c_int_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_decimal is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_double_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_float_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_datetime is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_time_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_enum is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_text_d is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"18446 is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, + {"1844674.1 is true", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, + + {"c_int_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_decimal is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_double_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_float_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_datetime is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_time_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_enum is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_text_d is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"18446 is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, + {"1844674.1 is false", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag | mysql.NotNullFlag, 1, 0}, } } func (s *testInferTypeSuite) createTestCase4OtherFuncs() []typeInferTestCase { return []typeInferTestCase{ - {"1 in (c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_enum)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"1 in (c_text_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"1 in (c_int_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_decimal)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_double_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_float_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_datetime)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_time_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_enum)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"1 in (c_text_d)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, {"bit_count(c_int_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, {"bit_count(c_bigint_d )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 2, 0}, @@ -1193,14 +1194,14 @@ func (s *testInferTypeSuite) createTestCase4OtherFuncs() []typeInferTestCase { func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { return []typeInferTestCase{ - {`time_format('150:02:28', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, - {`time_format(123456, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, + {`time_format('150:02:28', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 44, types.UnspecifiedLength}, + {`time_format(123456, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 44, types.UnspecifiedLength}, {`time_format('bad string', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, {`time_format(null, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, {`date_format(null, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, - {`date_format('2017-06-15', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, - {`date_format(151113102019.12, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 44, types.UnspecifiedLength}, + {`date_format('2017-06-15', '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 44, types.UnspecifiedLength}, + {`date_format(151113102019.12, '%r%r%r%r')`, mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, 44, types.UnspecifiedLength}, {"timestampadd(HOUR, c_int_d, c_timestamp_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, {"timestampadd(minute, c_double_d, c_timestamp_d)", mysql.TypeString, charset.CharsetUTF8MB4, 0, 19, types.UnspecifiedLength}, @@ -1664,38 +1665,38 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { {"dayName(c_set )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 10, types.UnspecifiedLength}, {"dayName(c_enum )", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 10, types.UnspecifiedLength}, - {"now() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, - {"now(0) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, - {"now(1) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 21, 1}, - {"now(2) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 22, 2}, - {"now(3) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 23, 3}, - {"now(4) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 24, 4}, - {"now(5) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 25, 5}, - {"now(6) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 26, 6}, + {"now() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 19, 0}, + {"now(0) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 19, 0}, + {"now(1) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 21, 1}, + {"now(2) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 22, 2}, + {"now(3) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 3}, + {"now(4) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 24, 4}, + {"now(5) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 25, 5}, + {"now(6) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 26, 6}, {"now(7) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 26, 6}, - {"utc_timestamp() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, - {"utc_timestamp(0) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, - {"utc_timestamp(1) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 21, 1}, - {"utc_timestamp(2) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 22, 2}, - {"utc_timestamp(3) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 23, 3}, - {"utc_timestamp(4) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 24, 4}, - {"utc_timestamp(5) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 25, 5}, - {"utc_timestamp(6) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 26, 6}, + {"utc_timestamp() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 19, 0}, + {"utc_timestamp(0) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 19, 0}, + {"utc_timestamp(1) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 21, 1}, + {"utc_timestamp(2) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 22, 2}, + {"utc_timestamp(3) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 3}, + {"utc_timestamp(4) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 24, 4}, + {"utc_timestamp(5) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 25, 5}, + {"utc_timestamp(6) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 26, 6}, {"utc_timestamp(7) ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 26, 6}, - {"utc_time() ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 8, 0}, - {"utc_time(0) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 8, 0}, - {"utc_time(1) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 1}, - {"utc_time(2) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 11, 2}, - {"utc_time(3) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 12, 3}, - {"utc_time(4) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 13, 4}, - {"utc_time(5) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 14, 5}, - {"utc_time(6) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 15, 6}, + {"utc_time() ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 8, 0}, + {"utc_time(0) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 8, 0}, + {"utc_time(1) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 1}, + {"utc_time(2) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 11, 2}, + {"utc_time(3) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 12, 3}, + {"utc_time(4) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 13, 4}, + {"utc_time(5) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 14, 5}, + {"utc_time(6) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 15, 6}, {"utc_time(7) ", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 15, 6}, - {"utc_date() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {"curdate()", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, + {"utc_date() ", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, + {"curdate()", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, {"sysdate(4)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 19, 0}, {"date(c_int_d )", mysql.TypeDate, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, @@ -1766,9 +1767,9 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { {"quarter(c_set )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, {"quarter(c_enum )", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"current_time()", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDurationWidthNoFsp, int(types.MinFsp)}, - {"current_time(0)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDurationWidthWithFsp, int(types.MinFsp)}, - {"current_time(6)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDurationWidthWithFsp, int(types.MaxFsp)}, + {"current_time()", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDurationWidthNoFsp, int(types.MinFsp)}, + {"current_time(0)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDurationWidthWithFsp, int(types.MinFsp)}, + {"current_time(6)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDurationWidthWithFsp, int(types.MaxFsp)}, {"sec_to_time(c_int_d )", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, {"sec_to_time(c_bigint_d )", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, @@ -1857,14 +1858,14 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { {"maketime(c_int_d, c_int_d, c_varchar)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 17, 6}, {"maketime(c_int_d, c_int_d, 1.2345)", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 15, 4}, - {"get_format(DATE, 'USA')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, 17, types.UnspecifiedLength}, + {"get_format(DATE, 'USA')", mysql.TypeVarString, charset.CharsetUTF8MB4, mysql.NotNullFlag, 17, types.UnspecifiedLength}, {"convert_tz(c_time_d, c_text_d, c_text_d)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, - {"from_unixtime(20170101.999)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, 3}, - {"from_unixtime(20170101.1234567)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, - {"from_unixtime('20170101.999')", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, - {"from_unixtime(20170101.123, '%H')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0, -1, types.UnspecifiedLength}, + {"from_unixtime(20170101.999)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDatetimeWidthWithFsp, 3}, + {"from_unixtime(20170101.1234567)", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, + {"from_unixtime('20170101.999')", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDatetimeWidthWithFsp, int(types.MaxFsp)}, + {"from_unixtime(20170101.123, '%H')", mysql.TypeVarString, charset.CharsetUTF8MB4, 0 | mysql.NotNullFlag, -1, types.UnspecifiedLength}, {"extract(day from c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, {"extract(hour from c_char)", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxIntWidth, 0}, @@ -1873,51 +1874,51 @@ func (s *testInferTypeSuite) createTestCase4TimeFuncs() []typeInferTestCase { func (s *testInferTypeSuite) createTestCase4LikeFuncs() []typeInferTestCase { return []typeInferTestCase{ - {"c_int_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_bigint_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_float_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_double_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_decimal rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_datetime rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_time_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_timestamp_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_char rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_varchar rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_text_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_binary rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_varbinary rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_blob_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_set rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_enum rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - - {"c_int_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_bigint_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_float_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_double_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_decimal regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_datetime regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_time_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_timestamp_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_char regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_varchar regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_text_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_binary regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_varbinary regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_blob_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_set regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, - {"c_enum regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag, 1, 0}, + {"c_int_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_bigint_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_float_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_double_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_decimal rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_datetime rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_time_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_timestamp_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_char rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_varchar rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_text_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_binary rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_varbinary rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_blob_d rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_set rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_enum rlike c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + + {"c_int_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_bigint_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_float_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_double_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_decimal regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_datetime regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_time_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_timestamp_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_char regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_varchar regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_text_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_binary regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_varbinary regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_blob_d regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_set regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, + {"c_enum regexp c_text_d", mysql.TypeLonglong, charset.CharsetBin, mysql.BinaryFlag | mysql.IsBooleanFlag, 1, 0}, } } func (s *testInferTypeSuite) createTestCase4Literals() []typeInferTestCase { return []typeInferTestCase{ - {"time '00:00:00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {"time '00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {"time '3 00:00:00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, - {"time '3 00:00:00.1234'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag, 15, 4}, - {"timestamp '2017-01-01 01:01:01'", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, mysql.MaxDatetimeWidthNoFsp, 0}, - {"timestamp '2017-01-00000000001 01:01:01.001'", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag, 23, 3}, - {"date '2017-01-01'", mysql.TypeDate, charset.CharsetBin, mysql.BinaryFlag, 10, 0}, + {"time '00:00:00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, + {"time '00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, + {"time '3 00:00:00'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, + {"time '3 00:00:00.1234'", mysql.TypeDuration, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 15, 4}, + {"timestamp '2017-01-01 01:01:01'", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, mysql.MaxDatetimeWidthNoFsp, 0}, + {"timestamp '2017-01-00000000001 01:01:01.001'", mysql.TypeDatetime, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 23, 3}, + {"date '2017-01-01'", mysql.TypeDate, charset.CharsetBin, mysql.BinaryFlag | mysql.NotNullFlag, 10, 0}, } } diff --git a/expression/util.go b/expression/util.go index 5faff464fd877..d13f7f1e446e3 100644 --- a/expression/util.go +++ b/expression/util.go @@ -693,8 +693,10 @@ func (s *exprStack) len() int { } // DatumToConstant generates a Constant expression from a Datum. -func DatumToConstant(d types.Datum, tp byte) *Constant { - return &Constant{Value: d, RetType: types.NewFieldType(tp)} +func DatumToConstant(d types.Datum, tp byte, flag uint) *Constant { + t := types.NewFieldType(tp) + t.Flag |= flag + return &Constant{Value: d, RetType: t} } // ParamMarkerExpression generate a getparam function expression. @@ -897,6 +899,21 @@ func ContainVirtualColumn(exprs []Expression) bool { return false } +// ContainCorrelatedColumn checks if the expressions contain a correlated column +func ContainCorrelatedColumn(exprs []Expression) bool { + for _, expr := range exprs { + switch v := expr.(type) { + case *CorrelatedColumn: + return true + case *ScalarFunction: + if ContainCorrelatedColumn(v.GetArgs()) { + return true + } + } + } + return false +} + // ContainMutableConst checks if the expressions contain a lazy constant. func ContainMutableConst(ctx sessionctx.Context, exprs []Expression) bool { // Treat all constants immutable if plan cache is not enabled for this query. diff --git a/expression/util_test.go b/expression/util_test.go index 172a66e59d1e0..e0fc2ad25e7e0 100644 --- a/expression/util_test.go +++ b/expression/util_test.go @@ -124,7 +124,8 @@ func (s *testUtilSuite) TestClone(c *check.C) { &builtinUnaryMinusIntSig{}, &builtinDecimalIsNullSig{}, &builtinDurationIsNullSig{}, &builtinIntIsNullSig{}, &builtinRealIsNullSig{}, &builtinStringIsNullSig{}, &builtinTimeIsNullSig{}, &builtinUnaryNotRealSig{}, &builtinUnaryNotDecimalSig{}, &builtinUnaryNotIntSig{}, &builtinSleepSig{}, &builtinInIntSig{}, &builtinInStringSig{}, &builtinInDecimalSig{}, &builtinInRealSig{}, &builtinInTimeSig{}, &builtinInDurationSig{}, - &builtinInJSONSig{}, &builtinRowSig{}, &builtinSetVarSig{}, &builtinGetVarSig{}, &builtinLockSig{}, + &builtinInJSONSig{}, &builtinRowSig{}, &builtinSetStringVarSig{}, &builtinSetIntVarSig{}, &builtinSetRealVarSig{}, &builtinSetDecimalVarSig{}, + &builtinGetIntVarSig{}, &builtinGetRealVarSig{}, &builtinGetDecimalVarSig{}, &builtinGetStringVarSig{}, &builtinLockSig{}, &builtinReleaseLockSig{}, &builtinValuesIntSig{}, &builtinValuesRealSig{}, &builtinValuesDecimalSig{}, &builtinValuesStringSig{}, &builtinValuesTimeSig{}, &builtinValuesDurationSig{}, &builtinValuesJSONSig{}, &builtinBitCountSig{}, &builtinGetParamStringSig{}, &builtinLengthSig{}, &builtinASCIISig{}, &builtinConcatSig{}, &builtinConcatWSSig{}, &builtinLeftSig{}, @@ -157,7 +158,7 @@ func (s *testUtilSuite) TestClone(c *check.C) { &builtinQuarterSig{}, &builtinSecToTimeSig{}, &builtinTimeToSecSig{}, &builtinTimestampAddSig{}, &builtinToDaysSig{}, &builtinToSecondsSig{}, &builtinUTCTimeWithArgSig{}, &builtinUTCTimeWithoutArgSig{}, &builtinTimestamp1ArgSig{}, &builtinTimestamp2ArgsSig{}, &builtinTimestampLiteralSig{}, &builtinLastDaySig{}, &builtinStrToDateDateSig{}, &builtinStrToDateDatetimeSig{}, &builtinStrToDateDurationSig{}, - &builtinFromUnixTime1ArgSig{}, &builtinFromUnixTime2ArgSig{}, &builtinExtractDatetimeSig{}, &builtinExtractDurationSig{}, &builtinAddDateStringStringSig{}, + &builtinFromUnixTime1ArgSig{}, &builtinFromUnixTime2ArgSig{}, &builtinExtractDatetimeFromStringSig{}, &builtinExtractDatetimeSig{}, &builtinExtractDurationSig{}, &builtinAddDateStringStringSig{}, &builtinAddDateStringIntSig{}, &builtinAddDateStringRealSig{}, &builtinAddDateStringDecimalSig{}, &builtinAddDateIntStringSig{}, &builtinAddDateIntIntSig{}, &builtinAddDateIntRealSig{}, &builtinAddDateIntDecimalSig{}, &builtinAddDateDatetimeStringSig{}, &builtinAddDateDatetimeIntSig{}, &builtinAddDateDatetimeRealSig{}, &builtinAddDateDatetimeDecimalSig{}, &builtinSubDateStringStringSig{}, &builtinSubDateStringIntSig{}, &builtinSubDateStringRealSig{}, &builtinSubDateStringDecimalSig{}, diff --git a/go.mod b/go.mod index 74c870fed9007..30bfb7bb5e87c 100644 --- a/go.mod +++ b/go.mod @@ -2,68 +2,86 @@ module github.com/pingcap/tidb require ( github.com/BurntSushi/toml v0.3.1 + github.com/HdrHistogram/hdrhistogram-go v0.9.0 // indirect github.com/Jeffail/gabs/v2 v2.5.1 github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d + github.com/cheggaaa/pb/v3 v3.0.4 // indirect + github.com/codahale/hdrhistogram v0.9.0 // indirect + github.com/coocood/freecache v1.1.1 github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 github.com/dgraph-io/ristretto v0.0.1 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 + github.com/frankban/quicktest v1.11.1 // indirect + github.com/fsouza/fake-gcs-server v1.17.0 // indirect github.com/go-sql-driver/mysql v1.5.0 - github.com/gogo/protobuf v1.3.1 + github.com/go-yaml/yaml v2.1.0+incompatible + github.com/gogo/protobuf v1.3.2 github.com/golang/protobuf v1.3.4 - github.com/golang/snappy v0.0.1 + github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf github.com/google/btree v1.0.0 github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9 github.com/google/uuid v1.1.1 - github.com/gorilla/mux v1.7.3 - github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 + github.com/gorilla/mux v1.7.4 + github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 - github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 + github.com/klauspost/compress v1.10.5 // indirect github.com/klauspost/cpuid v1.2.1 + github.com/kr/text v0.2.0 // indirect github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef - github.com/ngaut/unistore v0.0.0-20200918091209-68a2db6bb775 + github.com/ngaut/unistore v0.0.0-20210310131351-7ad6a204de87 + github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect github.com/opentracing/basictracer-go v1.0.0 github.com/opentracing/opentracing-go v1.1.0 github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 + github.com/pierrec/lz4 v2.5.2+incompatible // indirect github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 - github.com/pingcap/br v0.0.0-20200923023944-7456456854e4 + github.com/pingcap/br v4.0.0-beta.2.0.20210302095941-59e4efeaeb47+incompatible github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 - github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d + github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3 github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce - github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d + github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 - github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a - github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 - github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb - github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a - github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible - github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3 + github.com/pingcap/kvproto v0.0.0-20210223121704-3cd2fc5fad22 + github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8 + github.com/pingcap/parser v0.0.0-20210310110710-c7333a4927e6 + github.com/pingcap/sysutil v0.0.0-20210221112134-a07bda3bde99 + github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible + github.com/pingcap/tipb v0.0.0-20210309080453-72c4feaa6da7 github.com/prometheus/client_golang v1.5.1 github.com/prometheus/client_model v0.2.0 github.com/prometheus/common v0.9.1 - github.com/shirou/gopsutil v2.19.10+incompatible + github.com/shirou/gopsutil v3.20.12+incompatible github.com/sirupsen/logrus v1.6.0 github.com/soheilhy/cmux v0.1.4 + github.com/stretchr/testify v1.6.1 // indirect github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 - github.com/tikv/pd v1.1.0-beta.0.20200907085700-5b04bec39b99 + github.com/tikv/pd v1.1.0-beta.0.20210225143804-1f200cbcd647 github.com/twmb/murmur3 v1.1.3 - github.com/uber-go/atomic v1.3.2 + github.com/uber-go/atomic v1.4.0 github.com/uber/jaeger-client-go v2.22.1+incompatible - go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 + github.com/uber/jaeger-lib v2.4.0+incompatible // indirect + github.com/zhangjinpeng1987/raft v0.0.0-20200819064223-df31bb68a018 // indirect + go.etcd.io/etcd v0.5.0-alpha.5.0.20200824191128-ae9734ed278b go.uber.org/atomic v1.7.0 go.uber.org/automaxprocs v1.2.0 go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.16.0 - golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc - golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 - golang.org/x/sys v0.0.0-20200819171115-d785dc25833f - golang.org/x/text v0.3.3 - golang.org/x/tools v0.0.0-20200820010801-b793a1359eac - google.golang.org/grpc v1.26.0 + golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a // indirect + golang.org/x/mod v0.4.1 // indirect + golang.org/x/net v0.0.0-20201110031124-69a78807bb2b + golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 + golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b + golang.org/x/text v0.3.5 + golang.org/x/tools v0.1.0 + google.golang.org/grpc v1.27.1 + gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b // indirect gopkg.in/natefinch/lumberjack.v2 v2.0.0 - sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 + gopkg.in/yaml.v2 v2.3.0 // indirect + honnef.co/go/tools v0.1.3 // indirect + sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 ) diff --git a/go.sum b/go.sum index 64d2e1dcd7886..3212d3d49a49b 100644 --- a/go.sum +++ b/go.sum @@ -16,28 +16,28 @@ cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2k cloud.google.com/go/pubsub v1.1.0 h1:9/vpR43S4aJaROxqQHQ3nH9lfyKKV0dC3vOmnw8ebQQ= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.4.0/go.mod h1:ZusYJWlOshgSBGbt6K3GnB3MT3H1xs2id9+TCl4fDBA= cloud.google.com/go/storage v1.5.0 h1:RPUcBvDeYgQFMfQu1eBMq6piD1SXmLH+vK3qjewZPus= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= 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/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= +github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= github.com/Jeffail/gabs/v2 v2.5.1 h1:ANfZYjpMlfTTKebycu4X1AgkVWumFVDYQl7JwOr4mDk= github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= -github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc= github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/VividCortex/mysqlerr v0.0.0-20200629151747-c28746d985dd/go.mod h1:f3HiCrHjHBdcm6E83vGaXh1KomZMA2P6aeo3hKx/wg0= +github.com/Xeoncross/go-aesctr-with-hmac v0.0.0-20200623134604-12b17a7ff502/go.mod h1:pmnBM9bxWSiHvC/gSWunUIyDvGn33EkP2CUjxFKtTTM= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -46,9 +46,8 @@ github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQY github.com/appleboy/gin-jwt/v2 v2.6.3/go.mod h1:MfPYA4ogzvOcVkRwAxT7quHOtQmVKDpTwxyUrC2DNw0= github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aws/aws-sdk-go v1.26.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go v1.30.24 h1:y3JPD51VuEmVqN3BEDVm4amGpDma2cKJcDPuAU1OR58= -github.com/aws/aws-sdk-go v1.30.24/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aws/aws-sdk-go v1.35.3 h1:r0puXncSaAfRt7Btml2swUo74Kao+vKhO3VLjwDjK54= +github.com/aws/aws-sdk-go v1.35.3/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -62,24 +61,23 @@ github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheggaaa/pb/v3 v3.0.1/go.mod h1:SqqeMF/pMOIu3xgGoxtPYhMNQP258xE4x/XRTYua+KU= github.com/cheggaaa/pb/v3 v3.0.4 h1:QZEPYOj2ix6d5oEg63fbHmpolrnNiwjUsk+h74Yt4bM= github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20171208011716-f6d7a1f6fbf3/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= -github.com/coocood/badger v1.5.1-0.20200515070411-e02af0688441/go.mod h1:klY8SfH2lNZ/23/SIxwHoJw+T6wYGB12YPCF9MUoiu0= -github.com/coocood/badger v1.5.1-0.20200528065104-c02ac3616d04/go.mod h1:klY8SfH2lNZ/23/SIxwHoJw+T6wYGB12YPCF9MUoiu0= +github.com/codahale/hdrhistogram v0.9.0 h1:9GjrtRI+mLEFPtTfR/AZhcxp+Ii8NZYWq5104FbZQY0= +github.com/codahale/hdrhistogram v0.9.0/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64 h1:W1SHiII3e0jVwvaQFglwu3kS9NLxOeTpvik7MbKCyuQ= github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64/go.mod h1:F86k/6c7aDUdwSUevnLpHS/3Q9hzYCE99jGk2xsHnt0= +github.com/coocood/freecache v1.1.1 h1:uukNF7QKCZEdZ9gAV7WQzvh0SbjwdMF6m3x3rxEkaPc= +github.com/coocood/freecache v1.1.1/go.mod h1:OKrEjkGVoxZhyWAJoeFi5BMLUJm2Tit0kpGkIr7NGYY= github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 h1:NnLfQ77q0G4k2Of2c1ceQ0ec6MkLQyDp+IGdVM0D8XM= github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2/go.mod h1:7qG7YFnOALvsx6tKTNmQot8d7cGFXM9TidzvRFLWYwM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -89,21 +87,17 @@ github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20181031085051-9002847aa142/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= 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/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= @@ -129,11 +123,9 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8 github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v0.0.0-20180421182945-02af3965c54e/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= @@ -141,17 +133,15 @@ github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/frankban/quicktest v1.11.1 h1:stwUsXhUGliQs9t0ZS39BWCltFdOHgABiIlihop8AD4= +github.com/frankban/quicktest v1.11.1/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsouza/fake-gcs-server v1.15.0/go.mod h1:HNxAJ/+FY/XSsxuwz8iIYdp2GtMmPbJ8WQjjGMxd6Qk= github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7gIh9+5fvk= github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32 h1:Mn26/9ZMNWSw9C9ERFA1PUxfmGpolnw2v0bKOREu5ew= -github.com/ghodss/yaml v1.0.1-0.20190212211648-25d852aebe32/go.mod h1:GIjDIg/heH5DOkXY3YJ/wNhfHsQHoXGjl8G8amsYQ1I= github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= @@ -159,8 +149,8 @@ github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-echarts/go-echarts v1.0.0/go.mod h1:qbmyAb/Rl1f2w7wKba1D4LoNq4U164yO4/wedFbcWyo= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= @@ -172,50 +162,45 @@ github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3 h1:gihV7YNZK1iK6Tgwwsxo2rJbD1GTbdm72325Bq8FI3w= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3 h1:5cxNfTy0UVC3X8JL5ymxzyoUZmo8iZb+jeTWn7tUa8o= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/spec v0.19.7 h1:0xWSeMd35y5avQAThZR2PkEuqSosoS5t6gDH4L8n11M= -github.com/go-openapi/spec v0.19.7/go.mod h1:Hm2Jr4jv8G1ciIAo+frC/Ft+rR2kQDh8JHKHb3gWUSk= github.com/go-openapi/swag v0.17.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.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.8 h1:vfK6jLhs7OI4tAXkvkooviaE1JEPcw3mutyegLHHjmk= -github.com/go-openapi/swag v0.19.8/go.mod h1:ao+8BpOPyKdpQz3AOJfbeEVpLmWAvlT1IfTe5McPyhY= github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c h1:3bjbKXoj7jBYdHpQFbKL2546c4dtltTHzjo+5i4CHBU= github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w= github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-yaml/yaml v2.1.0+incompatible h1:RYi2hDdss1u4YE7GwixGzWwVo47T8UQwnTLB6vQiq+o= +github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= github.com/goccy/go-graphviz v0.0.5/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +github.com/gogo/protobuf v0.0.0-20171007142547-342cbe0a0415/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20181024230925-c65c006176ff/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -223,23 +208,23 @@ github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf h1:gFVkHXmVAhEbxZVDln5V9GKrLaluNoFHDbrZwAWZgws= +github.com/golang/snappy v0.0.2-0.20190904063534-ff6b7dc882cf/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190930153522-6ce02741cba3/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9 h1:K+lX49/3eURCE1IjlaZN//u6c+9nfDAMnyQ9E2dsJbY= github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= @@ -252,23 +237,22 @@ 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/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= -github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc= +github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0 h1:THDBEeQ9xZ8JEaCLyLQqXMMdRqNr0QAUJTIkQAUtFjg= +github.com/grpc-ecosystem/go-grpc-middleware v1.1.0/go.mod h1:f5nM7jw/oeRSadq3xCzHAvxcr8HZnzsqU6ILg/0NiiE= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= -github.com/grpc-ecosystem/grpc-gateway v1.14.3 h1:OCJlWkOUoTnl0neNGlf4fUm3TmbEtguw7vR+nGtnDjY= -github.com/grpc-ecosystem/grpc-gateway v1.14.3/go.mod h1:6CwZWGDSPRJidgKAtJVvND6soZe6fT7iteq8wDPdhb0= github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69/go.mod h1:YLEMZOtU+AZ7dhN9T/IpGhXVGly2bvkJQ+zxj3WeVQo= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -285,9 +269,10 @@ github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJS github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= -github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -300,53 +285,36 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/juju/clock v0.0.0-20180524022203-d293bb356ca4/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA= -github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5 h1:rhqTjzJlm7EbkELJDKMTU7udov+Se0xZkWmugr6zGok= -github.com/juju/errors v0.0.0-20181118221551-089d3ea4e4d5/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= -github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9 h1:Y+lzErDTURqeXqlqYi4YBYbDd7ycU74gW1ADt57/bgY= -github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY= github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= -github.com/juju/retry v0.0.0-20160928201858-1998d01ba1c3/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= -github.com/juju/testing v0.0.0-20200510222523-6c8c298c77a0/go.mod h1:hpGvhGHPVbNBraRLZEhoQwFLMrjK8PSlO4D3nDjKYXo= -github.com/juju/testing v0.0.0-20200608005635-e4eedbc6f7aa h1:v1ZEHRVaUgTIkxzYaT78fJ+3bV3vjxj9jfNJcYzi9pY= -github.com/juju/testing v0.0.0-20200608005635-e4eedbc6f7aa/go.mod h1:hpGvhGHPVbNBraRLZEhoQwFLMrjK8PSlO4D3nDjKYXo= -github.com/juju/testing v0.0.0-20200706033705-4c23f9c453cd h1:4MRI5TGW0cRgovUipCGLF4uF+31Fo8VzkV2753OAfEE= -github.com/juju/testing v0.0.0-20200706033705-4c23f9c453cd/go.mod h1:hpGvhGHPVbNBraRLZEhoQwFLMrjK8PSlO4D3nDjKYXo= -github.com/juju/utils v0.0.0-20180808125547-9dfc6dbfb02b/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= -github.com/juju/version v0.0.0-20161031051906-1f41e27e54f2/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/kevinburke/go-bindata v3.18.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/compress v1.10.5 h1:7q6vHIqubShURwQz8cQK6yIe/xC3IF0Vm7TGfqjewrc= +github.com/klauspost/compress v1.10.5/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= -github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.1 h1:mdxE1MF9o53iCb2Ghj1VfWvh7ZOwHpnVG/xwXrV90U8= -github.com/mailru/easyjson v0.7.1/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= @@ -359,18 +327,14 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81 h1:QASJXOGm2RZ5Ardbc86qNFvby9AqkLDibfChMtAg5QM= github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= -github.com/mgechev/revive v1.0.2 h1:v0NxxQ7fSFz/u1NQydPo6EGdq7va0J1BtsZmae6kzUg= github.com/mgechev/revive v1.0.2/go.mod h1:rb0dQy1LVAxW9SWy5R3LPUjevzUbUS316U5MFySA2lo= -github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -379,9 +343,6 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb h1:bsjNADsjHq0gjU7KO7zwoX5k3HtFdf6TDzB3ncl5iUs= -github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= -github.com/montanaflynn/stats v0.0.0-20180911141734-db72e6cae808/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/montanaflynn/stats v0.5.0 h1:2EkzeTSqBB4V4bJwWrt5gIIrZmpJBcoIRGS2kWLgzmk= github.com/montanaflynn/stats v0.5.0/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -392,32 +353,22 @@ github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 h1:7KAv7KMGTTqSmYZtNdc github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7/go.mod h1:iWMfgwqYW+e8n5lC/jjNEhwcjbRDpl5NT7n2h+4UNcI= github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef h1:K0Fn+DoFqNqktdZtdV3bPQ/0cuYh2H4rkg0tytX/07k= github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo6LNmIvEWzsW1hbBQfpUO4JWnuQRmva8= -github.com/ngaut/unistore v0.0.0-20200521040325-2af94f1b0c83/go.mod h1:odn0MiR+DNxnxOiCskG4wWacBIW2GBmJOf/TAnMZfWE= -github.com/ngaut/unistore v0.0.0-20200603091253-e0b717679796/go.mod h1:9mpqZeS1CkNlgZwJ0LZXb+Qd7xVO5o55ngys7T1/oH8= -github.com/ngaut/unistore v0.0.0-20200604043635-5004cdad650f/go.mod h1:5Vec+R2BwOyugVQ8Id8uDmlIYbqodCvykM50IpaAjk4= -github.com/ngaut/unistore v0.0.0-20200604061006-d8e9dc0ad154/go.mod h1:YGQzxn9cVy0q2puXVt1X8l5OohRHv2djR/ziz1k14XQ= -github.com/ngaut/unistore v0.0.0-20200630072006-0c4035925f69/go.mod h1:Hxlp5VAoPOHwcXLUw/E+P3XjJX1EP38NWjXPpc4nuOE= -github.com/ngaut/unistore v0.0.0-20200803051709-607d96233b1d/go.mod h1:2QAH8tXCjeHuCSLEWKLYAzHPz2dB59VnhpPA2IDVeW4= -github.com/ngaut/unistore v0.0.0-20200806113332-5b9f73333a19/go.mod h1:RtZJKyiaHRiII+b9/g/4339rSikSvfrUJmIbrUkYVi4= -github.com/ngaut/unistore v0.0.0-20200820080223-c734bcc4ea53/go.mod h1:85S5ZgzoHtTMyaEYhaWnxv9OWMBfyhTNuWypXCfVn/0= -github.com/ngaut/unistore v0.0.0-20200828072424-1c0ede06a3fc/go.mod h1:iSlx5Ub/926GvQn6+d2B2C16wJJwgQIsi6k/bEU0vl4= -github.com/ngaut/unistore v0.0.0-20200918091209-68a2db6bb775 h1:9z7ZQ//+b6DjI79ak0sNf7RMgmjYh/BTB+NkipfdLiM= -github.com/ngaut/unistore v0.0.0-20200918091209-68a2db6bb775/go.mod h1:ZR3NH+HzqfiYetwdoAivApnIy8iefPZHTMLfrFNm8g4= +github.com/ngaut/unistore v0.0.0-20210310131351-7ad6a204de87 h1:lVRrhmqIT2zMbmoalrgxQLwWzFd3VtFaaWy0fnMwPro= +github.com/ngaut/unistore v0.0.0-20210310131351-7ad6a204de87/go.mod h1:ZR3NH+HzqfiYetwdoAivApnIy8iefPZHTMLfrFNm8g4= github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/oleiade/reflections v1.0.0/go.mod h1:RbATFBbKYkVdqmSFtx13Bb/tVhR0lgOBXunWTZKeL4w= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.7.0 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.4.3 h1:RE1xgDvH7imwFD45h+u2SgIfERHlS2yNG4DObb5BSKU= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= @@ -427,126 +378,52 @@ github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2 h1:JhzVVoYvbOACxoU github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g= github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8= -github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200407064406-b2b8ad403d01/go.mod h1:77fCh8d3oKzC5ceOJWeZXAS/mLzVgdZ7rKniwmOyFuo= -github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200514075710-eecc9a4525b5/go.mod h1:8q+yDx0STBPri8xS4A2duS1dAf+xO0cMtjwe0t6MWJk= -github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200710045508-523e95bc5ec9/go.mod h1:9yaAM77sPfa5/f6sdxr3jSkKfIz463KRHyiFHiGjdes= -github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200715070228-47f5de8a6992/go.mod h1:9yaAM77sPfa5/f6sdxr3jSkKfIz463KRHyiFHiGjdes= -github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200807020752-01f0abe88e93/go.mod h1:9yaAM77sPfa5/f6sdxr3jSkKfIz463KRHyiFHiGjdes= -github.com/pingcap/badger v1.5.1-0.20200604041313-19c397305fcc/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= -github.com/pingcap/badger v1.5.1-0.20200714132513-80ba2000f159/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= -github.com/pingcap/badger v1.5.1-0.20200810065601-8c92a97807f9/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= +github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= +github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap-incubator/tidb-dashboard v0.0.0-20210104140916-41a0a3a87e75/go.mod h1:EONGys2gM5n14pII2vjmU/5VG3Dtj6kpqUT1GUZ4ysw= github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 h1:IXpGy7y9HyoShAFmzW2OPF0xCA5EOoSTyZHwsgYk9Ro= github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= -github.com/pingcap/br v0.0.0-20200426093517-dd11ae28b885/go.mod h1:4w3meMnk7HDNpNgjuRAxavruTeKJvUiXxoEWTjzXPnA= -github.com/pingcap/br v0.0.0-20200521085655-53201addd4ad/go.mod h1:SlSUHWY7QUoooiYxOKuJ8kUh2KjI29ogBh89YXz2dLA= -github.com/pingcap/br v0.0.0-20200610051721-b057d65ff579/go.mod h1:Gq6o66nDReG0fMxqSdl8JHLZhMnxKhVxtHxqubUWAyg= -github.com/pingcap/br v0.0.0-20200617120402-56e151ad8b67/go.mod h1:/3QzpDG7YTPrDsrg8i1lwdYUrplJ0jVD+9pxhh19+k4= -github.com/pingcap/br v0.0.0-20200727092753-a475692725db/go.mod h1:4iTqZAMbEPmjBggYixqIg2FwIHBQtyImTM/QYlpTBGk= -github.com/pingcap/br v0.0.0-20200803052654-e6f63fc1807a/go.mod h1:8j7vGUfHCETYbeBfASLTDywC3NFSx90z9nuk0PV9rpo= -github.com/pingcap/br v0.0.0-20200805121136-181c081ba6ac/go.mod h1:9P24mNzNmXjggYBm4pnb08slSbua8FA6QIyg68GpuhQ= -github.com/pingcap/br v0.0.0-20200820083933-d9d6207c0aa7/go.mod h1:5ri8663t7CtJuG0kiOKKoBmwk9HOCX5MoKpmh1fW4CE= -github.com/pingcap/br v0.0.0-20200923023944-7456456854e4 h1:f1e1xbBAMc6mOrnBtrPRke52Zxv8zVlyr5g0Tz/pySQ= -github.com/pingcap/br v0.0.0-20200923023944-7456456854e4/go.mod h1:DGsMcZVYt2haeDF/xGerf77c2RpTymgYY5+bMg8uArA= +github.com/pingcap/br v4.0.0-beta.2.0.20210302095941-59e4efeaeb47+incompatible h1:0B1CQlmaky9VEa1STBH/WM81wLOuFJ2Rmb5APHzPefU= +github.com/pingcap/br v4.0.0-beta.2.0.20210302095941-59e4efeaeb47+incompatible/go.mod h1:ymVmo50lQydxib0tmK5hHk4oteB7hZ0IMCArunwy3UQ= github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390= github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= -github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= +github.com/pingcap/errcode v0.3.0/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pingcap/errors v0.11.5-0.20200729012136-4e113ddee29e/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= -github.com/pingcap/errors v0.11.5-0.20200902104258-eba4f1d8f6de/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= -github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d h1:TH18wFO5Nq/zUQuWu9ms2urgZnLP69XJYiI2JZAkUGc= -github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= +github.com/pingcap/errors v0.11.5-0.20201029093017-5a7df2af2ac7/go.mod h1:G7x87le1poQzLB/TqvTJI2ILrSgobnq4Ut7luOwvfvI= +github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3 h1:LllgC9eGfqzkfubMgjKIDyZYaa609nNWAyNZtpy2B3M= +github.com/pingcap/errors v0.11.5-0.20201126102027-b0a155152ca3/go.mod h1:G7x87le1poQzLB/TqvTJI2ILrSgobnq4Ut7luOwvfvI= github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI= -github.com/pingcap/failpoint v0.0.0-20200210140405-f8f9fb234798/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI= -github.com/pingcap/failpoint v0.0.0-20200506114213-c17f16071c53/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= -github.com/pingcap/failpoint v0.0.0-20200603062251-b230c36c413c/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce h1:Y1kCxlCtlPTMtVcOkjUcuQKh+YrluSo7+7YMCQSzy30= github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= -github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d h1:rCmRK0lCRrHMUbS99BKFYhK9YxJDNw0xB033cQbYo0s= -github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d/go.mod h1:fMRU1BA1y+r89AxUoaAar4JjrhUkVDt0o0Np6V8XbDQ= +github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059 h1:Pe2LbxRmbTfAoKJ65bZLmhahmvHm7n9DUxGRQT00208= +github.com/pingcap/fn v0.0.0-20200306044125-d5540d389059/go.mod h1:fMRU1BA1y+r89AxUoaAar4JjrhUkVDt0o0Np6V8XbDQ= github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E= github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= -github.com/pingcap/kvproto v0.0.0-20190227013052-e71ca0165a5f/go.mod h1:QMdbTAXCHzzygQzqcG9uVUgU2fKeSN1GmfMiykdSzzY= github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= -github.com/pingcap/kvproto v0.0.0-20200214064158-62d31900d88e/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200417092353-efbe03bcffbd/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200420075417-e0c6e8842f22/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200423020121-038e31959c2a/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200424032552-6650270c39c3/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200428135407-0f5ffe459677/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200518112156-d4aeb467de29/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200608081027-d02a6f65e956/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200701055533-4ef28cac01f8/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200706115936-1e0910aabe6c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200715040832-c3e2e0b163ee/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200803054707-ebd5de15093f/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= github.com/pingcap/kvproto v0.0.0-20200810113304-6157337686b1/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200827082727-23dedec2339b/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= -github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a h1:/FW9upn9/MJ8e6SdiGZcJ4MeZLXdYUG+L5RHp1OhPR4= -github.com/pingcap/kvproto v0.0.0-20200828054126-d677e6fd224a/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20210219064844-c1844a4775d6/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20210223121704-3cd2fc5fad22 h1:O95vOUHHmAcjdw01D233Cvn5YsxsBDBCMGb3RZcHzgM= +github.com/pingcap/kvproto v0.0.0-20210223121704-3cd2fc5fad22/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/log v0.0.0-20200511115504-543df19646ad h1:SveG82rmu/GFxYanffxsSF503SiQV+2JLnWEiGiF+Tc= github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 h1:Jboj+s4jSCp5E1WDgmRUv5rIFKFHaaSWuSZ4wMwXIcc= -github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= -github.com/pingcap/parser v0.0.0-20200424075042-8222d8b724a4/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4= -github.com/pingcap/parser v0.0.0-20200507022230-f3bf29096657/go.mod h1:9v0Edh8IbgjGYW2ArJr19E+bvL8zKahsFp+ixWeId+4= -github.com/pingcap/parser v0.0.0-20200518090819-ec1e13b948b1/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200522094936-3b720a0512a6/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200609110328-c65941b9fbb3/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200623082809-b74301ac298b/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200730092557-34a468e9b774/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200731033026-84f62115187c/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200813083329-a4bff035d3e2/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200821073936-cf85e80665c4/go.mod h1:vQdbJqobJAgFyiRNNtXahpMoGWwPEuWciVEK5A20NS0= -github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb h1:Nlswd41UZDaedHNysE/lb8dc3EpmWAApf480qU2N3nU= -github.com/pingcap/parser v0.0.0-20200929032957-9678b2b7cefb/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= -github.com/pingcap/pd/v4 v4.0.0-rc.1.0.20200422143320-428acd53eba2/go.mod h1:s+utZtXDznOiL24VK0qGmtoHjjXNsscJx3m1n8cC56s= -github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200520083007-2c251bd8f181/go.mod h1:q4HTx/bA8aKBa4S7L+SQKHvjRPXCRV0tA0yRw0qkZSA= -github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200714122454-1a64f969cb3c/go.mod h1:v/dY4mVkt3dh/Liphhk0E4ScOkZpIk0m0GvWJ9FapDs= -github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200715061836-4971825321cf/go.mod h1:Ikvk5tw09nV6ZR4vHgrmAIAbZJttZ2cKQvOjN5lekBk= -github.com/pingcap/pd/v4 v4.0.0-rc.2.0.20200730093003-dc8c75cf7ca0/go.mod h1:szYFB2rf8yrSGJuI8hm9RLWvsK+xt1exLTj511WPCnE= +github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8 h1:M+DNpOu/I3uDmwee6vcnoPd6GgSMqND4gxvDQ/W584U= +github.com/pingcap/log v0.0.0-20201112100606-8f1e84a3abc8/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/parser v0.0.0-20210310110710-c7333a4927e6 h1:V/6ioJmVUN4q6/aUpNdnT6OOPc48R3tnojcVfTrt4QU= +github.com/pingcap/parser v0.0.0-20210310110710-c7333a4927e6/go.mod h1:GbEr2PgY72/4XqPZzmzstlOU/+il/wrjeTNFs6ihsSE= github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= -github.com/pingcap/sysutil v0.0.0-20200408114249-ed3bd6f7fdb1/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= -github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a h1:i2RElJ2aykSqZKeY+3SK18NHhajil8cQdG77wHe+P1Y= -github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= -github.com/pingcap/tidb v1.1.0-beta.0.20200424154252-5ede18f10eed/go.mod h1:m2VDlJDbUeHPCXAfKPajqLmB1uLvWpkKk3zALNqDYdw= -github.com/pingcap/tidb v1.1.0-beta.0.20200509133407-a9dc72cf2558/go.mod h1:cXNbVSQAkwwmjFQmEnEPI00Z2/Y/KOhouttUPERiInE= -github.com/pingcap/tidb v1.1.0-beta.0.20200513065557-5a0787dfa915/go.mod h1:khS9Z9YlbtxsaZsSsSahelgh5L16EtP30QADFmPiI/I= -github.com/pingcap/tidb v1.1.0-beta.0.20200521154755-134e691d6f5f/go.mod h1:HobvT8ySGq9gkwPoyz/+V6TKWMRGEzFQobJOvLc2Oy8= -github.com/pingcap/tidb v1.1.0-beta.0.20200603101356-552e7709de0d/go.mod h1:wgu4vP3wq+x/l1X3ckOZFvyGKcVIBkq30NQVh0Y+qYA= -github.com/pingcap/tidb v1.1.0-beta.0.20200604055950-efc1c154d098/go.mod h1:UMxsNE326wyfgFJCx6aerPRLj1/tGPYDBKS9T9NOHI8= -github.com/pingcap/tidb v1.1.0-beta.0.20200610060912-f12cdc42010f/go.mod h1:jyXOvS9k0PTxYHju2OgySOe9FtydA52TiQ5bXAaKyQE= -github.com/pingcap/tidb v1.1.0-beta.0.20200721005019-f5c6e59f0daf/go.mod h1:dYCOFXJsoqBumpxAyBqCG3WZriIY7JgeBZHgvfARDa8= -github.com/pingcap/tidb v1.1.0-beta.0.20200803035726-41c23700d8d1/go.mod h1:YFuuPMuceYoXIr4sCrtv1FUyJLvtYp9KisDsTk5dxlE= -github.com/pingcap/tidb v1.1.0-beta.0.20200803051932-e291f8fbd1e0/go.mod h1:YFuuPMuceYoXIr4sCrtv1FUyJLvtYp9KisDsTk5dxlE= -github.com/pingcap/tidb v1.1.0-beta.0.20200805053026-cd3e5ed82671/go.mod h1:+r9tlyUKG2zYzs2ajvEHiQlTx6WM0K2L1yabCHZwgGw= -github.com/pingcap/tidb v1.1.0-beta.0.20200806060043-574540aa06ba/go.mod h1:NHcZH46dkYwDd2IWUJaLOB0m54j7v2P5WdS4FvPR81w= -github.com/pingcap/tidb v1.1.0-beta.0.20200810064414-d81150394f9d/go.mod h1:vLYo4E7Q6kzKYTskhP2MHBsodmZIRRUU63qdiFjlULA= -github.com/pingcap/tidb v1.1.0-beta.0.20200820085534-0d997f2b8b3c/go.mod h1:z7Hn1KY8Crt9cHhWtbGPKMBcjvmSJXIoOjO4rMk165w= -github.com/pingcap/tidb v1.1.0-beta.0.20200831085451-438945d2948e/go.mod h1:VXxiC2f+HY3/5phR1841YJrX4on56kTEXrtEzRezcj4= -github.com/pingcap/tidb-tools v4.0.0-beta.1.0.20200306084441-875bd09aa3d5+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.0-rc.1.0.20200421113014-507d2bb3a15e+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.0-rc.1.0.20200514040632-f76b3e428e19+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.0+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.1+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.5-0.20200820082341-afeaaaaaa153+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible h1:qPppnsXVh3KswqRZdSAShGLLPd7dB+5w4lXDnpYn0SQ= -github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= -github.com/pingcap/tipb v0.0.0-20190428032612-535e1abaa330/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pingcap/tipb v0.0.0-20200417094153-7316d94df1ee/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pingcap/tipb v0.0.0-20200604070248-508f03b0b342/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pingcap/tipb v0.0.0-20200615034523-dcfcea0b5965/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= -github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3 h1:ESL3eIt1kUt8IMvR1011ejZlAyDcOzw89ARvVHvpD5k= -github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= +github.com/pingcap/sysutil v0.0.0-20210221112134-a07bda3bde99 h1:/ogXgm4guJzow4UafiyXZ6ciAIPzxImaXYiFvTpKzKY= +github.com/pingcap/sysutil v0.0.0-20210221112134-a07bda3bde99/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= +github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible h1:ceznmu/lLseGHP/jKyOa/3u/5H3wtLLLqkH2V3ssSjg= +github.com/pingcap/tidb-tools v4.0.9-0.20201127090955-2707c97b3853+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= +github.com/pingcap/tipb v0.0.0-20210309080453-72c4feaa6da7 h1:j8MkWmy5tduhHVsdsgZJugN1U9OWTMSBQoZIpn8kqPc= +github.com/pingcap/tipb v0.0.0-20210309080453-72c4feaa6da7/go.mod h1:nsEhnMokcn7MRqd2J60yxpn/ac3ZH8A6GOJ9NslabUo= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -557,6 +434,7 @@ github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXP github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.2.1/go.mod h1:XMU6Z2MjaRKVu/dC1qupJI9SiNkDYzz3xecMgSW/F+U= github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -568,11 +446,13 @@ github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7q github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= 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/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -586,17 +466,15 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44 h1:tB9NOR21++IjLyVx3/PCPhWMwqGNCMQEH96A6dMZ/gc= github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/shirou/gopsutil v2.19.10+incompatible h1:lA4Pi29JEVIQIgATSeftHSY0rMGI9CLrl2ZvDLiahto= github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= +github.com/shirou/gopsutil v3.20.12+incompatible h1:6VEGkOXP/eP4o2Ilk8cSsX0PhOEfX6leqAnD+urrp9M= +github.com/shirou/gopsutil v3.20.12+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/shurcooL/vfsgen v0.0.0-20181020040650-a97a25d856ca/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -626,42 +504,37 @@ github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoH github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI= -github.com/swaggo/http-swagger v0.0.0-20200103000832-0e9263c4b516/go.mod h1:O1lAbCgAAX/KZ80LM/OXwtWFI/5TvZlwxSg8Cq08PV0= github.com/swaggo/http-swagger v0.0.0-20200308142732-58ac5e232fba/go.mod h1:O1lAbCgAAX/KZ80LM/OXwtWFI/5TvZlwxSg8Cq08PV0= github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= github.com/swaggo/swag v1.6.3/go.mod h1:wcc83tB4Mb2aNiL/HP4MFeQdpHUrca+Rp/DRNgWAUio= -github.com/swaggo/swag v1.6.5/go.mod h1:Y7ZLSS0d0DdxhWGVhQdu+Bu1QhaF5k0RD7FKdiAykeY= -github.com/swaggo/swag v1.6.6-0.20200323071853-8e21f4cefeea/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= github.com/swaggo/swag v1.6.6-0.20200529100950-7c765ddd0476/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= -github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= -github.com/syndtr/goleveldb v1.0.1-0.20190625010220-02440ea7a285 h1:uSDYjYejelKyceA6DiCsngFof9jAyeaSyX9XC5a1a7Q= -github.com/syndtr/goleveldb v1.0.1-0.20190625010220-02440ea7a285/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965 h1:1oFLiOyVl+W7bnBzGhf7BbIv9loSFQcieWWYIjLqcAw= +github.com/syndtr/goleveldb v1.0.1-0.20190318030020-c3a204f8e965/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= +github.com/thoas/go-funk v0.7.0/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ= github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tikv/pd v1.1.0-beta.0.20200818122340-ef1a4e920b2f/go.mod h1:mwZ3Lip1YXgtgBx6blADUPMxrqPGCfwABlreDzuJul8= -github.com/tikv/pd v1.1.0-beta.0.20200907085700-5b04bec39b99 h1:p2EYnx1jl7VJ5AuYoit0bDxGndYmsiUquDSAph5Ao1Q= -github.com/tikv/pd v1.1.0-beta.0.20200907085700-5b04bec39b99/go.mod h1:h0GTvNPZrjA06ToexaL13DxlzAvm/6kkJWz12baD68M= +github.com/tikv/pd v1.1.0-beta.0.20210225143804-1f200cbcd647 h1:0PcqV7HGMVzvduQy50bBRtA0z63YRQSFr8htHwsYLHw= +github.com/tikv/pd v1.1.0-beta.0.20210225143804-1f200cbcd647/go.mod h1:5jBduz1ubjCugOgPk5HobPK1RpwdFBcE0PYa4wSSef4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20171017195756-830351dc03c6/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/twmb/murmur3 v1.1.3 h1:D83U0XYKcHRYwYIpBKf3Pks91Z0Byda/9SJ8B6EMRcA= github.com/twmb/murmur3 v1.1.3/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= -github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= -github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= +github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM= github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= -github.com/uber/jaeger-lib v1.5.0/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= -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/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= +github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= @@ -669,28 +542,28 @@ github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljT github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/unrolled/render v1.0.1/go.mod h1:gN9T0NhL4Bfbwu8ann7Ry/TGHYfosul+J0obPf6NBdM= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vmihailenco/msgpack/v4 v4.3.11/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1/go.mod h1:xlngVLeyQ/Qi05oQxhQ+oTuqa03RjMwMfk/7/TCs+QI= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/zhangjinpeng1987/raft v0.0.0-20190624145930-deeb32d6553d/go.mod h1:1KDQ09J8MRHEtHze4at7BJZDW/doUAgkJ8w9KjEUhSo= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zhangjinpeng1987/raft v0.0.0-20200819064223-df31bb68a018 h1:T3OrqVdcH6z6SakR7WkECvGpdkfB0MAur/6zf66GPxQ= github.com/zhangjinpeng1987/raft v0.0.0-20200819064223-df31bb68a018/go.mod h1:rTSjwgeYU2on64W50csWDlhyy0x9UYVYJUovHlYdt5s= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5 h1:XAzx9gjCb0Rxj7EoqcClPD1d5ZBxZJk0jbuoPHenBt0= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 h1:lWF4f9Nypl1ZqSb4gLeh/DGvBYVaUYHuiB93teOmwgc= go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200824191128-ae9734ed278b h1:3kC4J3eQF6p1UEfQTkC67eEeb3rTk+shQqdX6tFyq9Q= +go.etcd.io/etcd v0.5.0-alpha.5.0.20200824191128-ae9734ed278b/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= @@ -698,7 +571,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0 h1:Ezj3JGmsOnG1MoRWQkPBsKLe9DwWD9QeXzTRzzldNVk= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -711,22 +583,18 @@ go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0 h1:KCa4XfM8CWFCpxXRGok+Q0SS/0XBhMDbHHGABQLvD2A= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -go.uber.org/zap v1.14.1/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -golang.org/x/crypto v0.0.0-20180214000028-650f4a345ab4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -736,10 +604,10 @@ golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -758,18 +626,17 @@ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= 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.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180406214816-61147c48b25b/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/mod v0.4.1 h1:Kvvh58BN8Y9/lBi7hTekvtMpm07eUZ0ck5pRHpsMWrY= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -794,11 +661,11 @@ golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc h1:zK/HqS5bZxDptfPJNq8v7vJfXtkU7r9TLIoSr1bXaP4= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b h1:uwuIcX0g4Yl1NC5XAz37xsr2lTtcqevgzYNVt49waME= +golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -810,8 +677,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9 h1:SQFwaSi55rU7vdNs9Yr0Z324VNlrF+0wMqRXT4St8ck= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -835,20 +702,23 @@ golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7w 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-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191010194322-b09406accb47/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= -golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b h1:ggRgirZABFolTmi3sn6Ivd9SipZwLedQ5wR0aAKnFxU= +golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ= +golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= @@ -882,30 +752,28 @@ golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtn 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-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200325203130-f53864d0dba1/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200521211927-2b542361a4fc/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac h1:DugppSxw0LSF8lcjaODPJZoDzq0ElTGskTst3ZaBkHI= -golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0 h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 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= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0 h1:yzlyyDW/J0w8yNFJIhiAJy4kq74S+1DOLdawELNxFMA= google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.1 h1:5mMS6mYvK5LVB8+ujVBC33Y8gltBo/kT6HBm6kU80G4= -google.golang.org/api v0.15.1/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -936,16 +804,17 @@ google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyac google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= @@ -953,15 +822,12 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= -gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4 h1:hILp2hNrRnYjZpmIbx70psAHbBSEcQ1NIzDcUbJ1b6g= -gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/oleiade/reflections.v1 v1.0.0/go.mod h1:SpA8pv+LUnF0FbB2hyRxc8XSng78D6iLBZ11PDb8Z5g= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -969,22 +835,23 @@ gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.5 h1:nI5egYTGJakVyOryqLs1cQO5dO0ksin5XXs2pspk75k= -honnef.co/go/tools v0.0.1-2020.1.5/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 h1:VO9oZbbkvTwqLimlQt15QNdOOBArT2dw/bvzsMZBiqQ= -sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= +sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI= sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k= diff --git a/infoschema/builder.go b/infoschema/builder.go index 146dd6298b764..d73c15ca99c46 100644 --- a/infoschema/builder.go +++ b/infoschema/builder.go @@ -14,6 +14,7 @@ package infoschema import ( + "context" "fmt" "sort" "strings" @@ -46,8 +47,7 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro case model.ActionCreateSchema: return nil, b.applyCreateSchema(m, diff) case model.ActionDropSchema: - tblIDs := b.applyDropSchema(diff.SchemaID) - return tblIDs, nil + return b.applyDropSchema(diff.SchemaID), nil case model.ActionModifySchemaCharsetAndCollate: return nil, b.applyModifySchemaCharsetAndCollate(m, diff) } @@ -70,6 +70,24 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro oldTableID = diff.TableID newTableID = diff.TableID } + // handle placement rule cache + switch diff.Type { + case model.ActionDropTable: + b.applyPlacementDelete(placement.GroupID(oldTableID)) + case model.ActionTruncateTable: + b.applyPlacementDelete(placement.GroupID(oldTableID)) + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) + } + case model.ActionRecoverTable: + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) + } + case model.ActionExchangeTablePartition: + if err := b.applyPlacementUpdate(placement.GroupID(newTableID)); err != nil { + return nil, errors.Trace(err) + } + } dbInfo := b.copySchemaTables(roDBInfo.Name.L) b.copySortedTables(oldTableID, newTableID) @@ -83,13 +101,15 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro // For normal node's information schema, repaired table is existed. // For repair node's information schema, repaired table is filtered (couldn't find it in `is`). // So here skip to reserve the allocators when repairing table. - diff.Type != model.ActionRepairTable { + diff.Type != model.ActionRepairTable && + // Alter sequence will change the sequence info in the allocator, so the old allocator is not valid any more. + diff.Type != model.ActionAlterSequence { oldAllocs, _ := b.is.AllocByID(oldTableID) allocs = filterAllocators(diff, oldAllocs) } tmpIDs := tblIDs - if diff.Type == model.ActionRenameTable && diff.OldSchemaID != diff.SchemaID { + if (diff.Type == model.ActionRenameTable || diff.Type == model.ActionRenameTables) && diff.OldSchemaID != diff.SchemaID { oldRoDBInfo, ok := b.is.SchemaByID(diff.OldSchemaID) if !ok { return nil, ErrDatabaseNotExists.GenWithStackByArgs( @@ -117,11 +137,37 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro } if diff.AffectedOpts != nil { for _, opt := range diff.AffectedOpts { - // Reduce the impact on DML when executing partition DDL. eg. - // While session 1 performs the DML operation associated with partition 1, - // the TRUNCATE operation of session 2 on partition 2 does not cause the operation of session 1 to fail. - if diff.Type == model.ActionTruncateTablePartition { + switch diff.Type { + case model.ActionAlterTableAlterPartition: + partitionID := opt.TableID + // TODO: enhancement: If the leader Placement Policy isn't updated, maybe we can omit the diff. + return []int64{partitionID}, b.applyPlacementUpdate(placement.GroupID(partitionID)) + case model.ActionTruncateTablePartition: + // Reduce the impact on DML when executing partition DDL. eg. + // While session 1 performs the DML operation associated with partition 1, + // the TRUNCATE operation of session 2 on partition 2 does not cause the operation of session 1 to fail. tblIDs = append(tblIDs, opt.OldTableID) + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) + if err != nil { + return nil, errors.Trace(err) + } + continue + case model.ActionDropTable, model.ActionDropTablePartition: + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + continue + case model.ActionTruncateTable: + b.applyPlacementDelete(placement.GroupID(opt.OldTableID)) + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) + if err != nil { + return nil, errors.Trace(err) + } + continue + case model.ActionRecoverTable: + err := b.applyPlacementUpdate(placement.GroupID(opt.TableID)) + if err != nil { + return nil, errors.Trace(err) + } continue } var err error @@ -139,6 +185,12 @@ func (b *Builder) ApplyDiff(m *meta.Meta, diff *model.SchemaDiff) ([]int64, erro } tblIDs = append(tblIDs, affectedIDs...) } + } else { + switch diff.Type { + case model.ActionAlterTableAlterPartition: + // If there is no AffectedOpts, It means the job is in Public -> GlobalTxnState phase + return []int64{}, nil + } } return tblIDs, nil } @@ -228,6 +280,7 @@ func (b *Builder) applyDropSchema(schemaID int64) []int64 { return nil } delete(b.is.schemaMap, di.Name.L) + b.applyPlacementDelete(placement.GroupID(schemaID)) // Copy the sortedTables that contain the table we are going to drop. tableIDs := make([]int64, 0, len(di.Tables)) @@ -243,6 +296,7 @@ func (b *Builder) applyDropSchema(schemaID int64) []int64 { di = di.Clone() for _, id := range tableIDs { + b.applyPlacementDelete(placement.GroupID(id)) b.applyDropTable(di, id, nil) } return tableIDs @@ -269,12 +323,17 @@ func (b *Builder) applyCreateTable(m *meta.Meta, dbInfo *model.DBInfo, tableID i ) } - pi := tblInfo.GetPartitionInfo() - if pi != nil { - for _, partition := range pi.Definitions { - err = b.applyPlacementUpdate(placement.GroupID(partition.ID)) - if err != nil { - return nil, err + switch tp { + case model.ActionDropTablePartition: + case model.ActionTruncateTablePartition: + default: + pi := tblInfo.GetPartitionInfo() + if pi != nil { + for _, partition := range pi.Definitions { + err = b.applyPlacementUpdate(placement.GroupID(partition.ID)) + if err != nil { + return nil, err + } } } } @@ -387,14 +446,20 @@ func (b *Builder) applyDropTable(dbInfo *model.DBInfo, tableID int64, affected [ return affected } +func (b *Builder) applyPlacementDelete(id string) { + b.is.deleteBundle(id) +} + func (b *Builder) applyPlacementUpdate(id string) error { - bundle, err := infosync.GetRuleBundle(nil, id) + bundle, err := infosync.GetRuleBundle(context.TODO(), id) if err != nil { return err } if !bundle.IsEmpty() { - b.is.ruleBundleMap[id] = bundle + b.is.SetBundle(bundle) + } else { + b.applyPlacementDelete(id) } return nil } @@ -416,8 +481,9 @@ func (b *Builder) copySchemasMap(oldIS *infoSchema) { } func (b *Builder) copyBundlesMap(oldIS *infoSchema) { - for k, v := range oldIS.ruleBundleMap { - b.is.ruleBundleMap[k] = v + is := b.is + for _, v := range oldIS.RuleBundles() { + is.SetBundle(v) } } @@ -441,9 +507,8 @@ func (b *Builder) copySchemaTables(dbName string) *model.DBInfo { func (b *Builder) InitWithDBInfos(dbInfos []*model.DBInfo, bundles []*placement.Bundle, schemaVersion int64) (*Builder, error) { info := b.is info.schemaMetaVersion = schemaVersion - info.ruleBundleMap = make(map[string]*placement.Bundle, len(bundles)) for _, bundle := range bundles { - info.ruleBundleMap[bundle.ID] = bundle + info.SetBundle(bundle) } for _, di := range dbInfos { diff --git a/infoschema/error.go b/infoschema/error.go index 7eb164a5210e6..a0ef7ab9c8760 100644 --- a/infoschema/error.go +++ b/infoschema/error.go @@ -14,59 +14,59 @@ package infoschema import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) var ( // ErrDatabaseExists returns for database already exists. - ErrDatabaseExists = terror.ClassSchema.New(mysql.ErrDBCreateExists, mysql.MySQLErrName[mysql.ErrDBCreateExists]) + ErrDatabaseExists = dbterror.ClassSchema.NewStd(mysql.ErrDBCreateExists) // ErrDatabaseDropExists returns for dropping a non-existent database. - ErrDatabaseDropExists = terror.ClassSchema.New(mysql.ErrDBDropExists, mysql.MySQLErrName[mysql.ErrDBDropExists]) + ErrDatabaseDropExists = dbterror.ClassSchema.NewStd(mysql.ErrDBDropExists) // ErrAccessDenied return when the user doesn't have the permission to access the table. - ErrAccessDenied = terror.ClassSchema.New(mysql.ErrAccessDenied, mysql.MySQLErrName[mysql.ErrAccessDenied]) + ErrAccessDenied = dbterror.ClassSchema.NewStd(mysql.ErrAccessDenied) // ErrDatabaseNotExists returns for database not exists. - ErrDatabaseNotExists = terror.ClassSchema.New(mysql.ErrBadDB, mysql.MySQLErrName[mysql.ErrBadDB]) + ErrDatabaseNotExists = dbterror.ClassSchema.NewStd(mysql.ErrBadDB) // ErrTableExists returns for table already exists. - ErrTableExists = terror.ClassSchema.New(mysql.ErrTableExists, mysql.MySQLErrName[mysql.ErrTableExists]) + ErrTableExists = dbterror.ClassSchema.NewStd(mysql.ErrTableExists) // ErrTableDropExists returns for dropping a non-existent table. - ErrTableDropExists = terror.ClassSchema.New(mysql.ErrBadTable, mysql.MySQLErrName[mysql.ErrBadTable]) + ErrTableDropExists = dbterror.ClassSchema.NewStd(mysql.ErrBadTable) // ErrSequenceDropExists returns for dropping a non-exist sequence. - ErrSequenceDropExists = terror.ClassSchema.New(mysql.ErrUnknownSequence, mysql.MySQLErrName[mysql.ErrUnknownSequence]) + ErrSequenceDropExists = dbterror.ClassSchema.NewStd(mysql.ErrUnknownSequence) // ErrColumnNotExists returns for column not exists. - ErrColumnNotExists = terror.ClassSchema.New(mysql.ErrBadField, mysql.MySQLErrName[mysql.ErrBadField]) + ErrColumnNotExists = dbterror.ClassSchema.NewStd(mysql.ErrBadField) // ErrColumnExists returns for column already exists. - ErrColumnExists = terror.ClassSchema.New(mysql.ErrDupFieldName, mysql.MySQLErrName[mysql.ErrDupFieldName]) + ErrColumnExists = dbterror.ClassSchema.NewStd(mysql.ErrDupFieldName) // ErrKeyNameDuplicate returns for index duplicate when rename index. - ErrKeyNameDuplicate = terror.ClassSchema.New(mysql.ErrDupKeyName, mysql.MySQLErrName[mysql.ErrDupKeyName]) + ErrKeyNameDuplicate = dbterror.ClassSchema.NewStd(mysql.ErrDupKeyName) // ErrNonuniqTable returns when none unique tables errors. - ErrNonuniqTable = terror.ClassSchema.New(mysql.ErrNonuniqTable, mysql.MySQLErrName[mysql.ErrNonuniqTable]) + ErrNonuniqTable = dbterror.ClassSchema.NewStd(mysql.ErrNonuniqTable) // ErrMultiplePriKey returns for multiple primary keys. - ErrMultiplePriKey = terror.ClassSchema.New(mysql.ErrMultiplePriKey, mysql.MySQLErrName[mysql.ErrMultiplePriKey]) + ErrMultiplePriKey = dbterror.ClassSchema.NewStd(mysql.ErrMultiplePriKey) // ErrTooManyKeyParts returns for too many key parts. - ErrTooManyKeyParts = terror.ClassSchema.New(mysql.ErrTooManyKeyParts, mysql.MySQLErrName[mysql.ErrTooManyKeyParts]) + ErrTooManyKeyParts = dbterror.ClassSchema.NewStd(mysql.ErrTooManyKeyParts) // ErrForeignKeyNotExists returns for foreign key not exists. - ErrForeignKeyNotExists = terror.ClassSchema.New(mysql.ErrCantDropFieldOrKey, mysql.MySQLErrName[mysql.ErrCantDropFieldOrKey]) + ErrForeignKeyNotExists = dbterror.ClassSchema.NewStd(mysql.ErrCantDropFieldOrKey) // ErrTableNotLockedForWrite returns for write tables when only hold the table read lock. - ErrTableNotLockedForWrite = terror.ClassSchema.New(mysql.ErrTableNotLockedForWrite, mysql.MySQLErrName[mysql.ErrTableNotLockedForWrite]) + ErrTableNotLockedForWrite = dbterror.ClassSchema.NewStd(mysql.ErrTableNotLockedForWrite) // ErrTableNotLocked returns when session has explicitly lock tables, then visit unlocked table will return this error. - ErrTableNotLocked = terror.ClassSchema.New(mysql.ErrTableNotLocked, mysql.MySQLErrName[mysql.ErrTableNotLocked]) + ErrTableNotLocked = dbterror.ClassSchema.NewStd(mysql.ErrTableNotLocked) // ErrTableNotExists returns for table not exists. - ErrTableNotExists = terror.ClassSchema.New(mysql.ErrNoSuchTable, mysql.MySQLErrName[mysql.ErrNoSuchTable]) + ErrTableNotExists = dbterror.ClassSchema.NewStd(mysql.ErrNoSuchTable) // ErrKeyNotExists returns for index not exists. - ErrKeyNotExists = terror.ClassSchema.New(mysql.ErrKeyDoesNotExist, mysql.MySQLErrName[mysql.ErrKeyDoesNotExist]) + ErrKeyNotExists = dbterror.ClassSchema.NewStd(mysql.ErrKeyDoesNotExist) // ErrCannotAddForeign returns for foreign key exists. - ErrCannotAddForeign = terror.ClassSchema.New(mysql.ErrCannotAddForeign, mysql.MySQLErrName[mysql.ErrCannotAddForeign]) + ErrCannotAddForeign = dbterror.ClassSchema.NewStd(mysql.ErrCannotAddForeign) // ErrForeignKeyNotMatch returns for foreign key not match. - ErrForeignKeyNotMatch = terror.ClassSchema.New(mysql.ErrWrongFkDef, mysql.MySQLErrName[mysql.ErrWrongFkDef]) + ErrForeignKeyNotMatch = dbterror.ClassSchema.NewStd(mysql.ErrWrongFkDef) // ErrIndexExists returns for index already exists. - ErrIndexExists = terror.ClassSchema.New(mysql.ErrDupIndex, mysql.MySQLErrName[mysql.ErrDupIndex]) + ErrIndexExists = dbterror.ClassSchema.NewStd(mysql.ErrDupIndex) // ErrUserDropExists returns for dropping a non-existent user. - ErrUserDropExists = terror.ClassSchema.New(mysql.ErrBadUser, mysql.MySQLErrName[mysql.ErrBadUser]) + ErrUserDropExists = dbterror.ClassSchema.NewStd(mysql.ErrBadUser) // ErrUserAlreadyExists return for creating a existent user. - ErrUserAlreadyExists = terror.ClassSchema.New(mysql.ErrUserAlreadyExists, mysql.MySQLErrName[mysql.ErrUserAlreadyExists]) + ErrUserAlreadyExists = dbterror.ClassSchema.NewStd(mysql.ErrUserAlreadyExists) // ErrTableLocked returns when the table was locked by other session. - ErrTableLocked = terror.ClassSchema.New(mysql.ErrTableLocked, mysql.MySQLErrName[mysql.ErrTableLocked]) + ErrTableLocked = dbterror.ClassSchema.NewStd(mysql.ErrTableLocked) // ErrWrongObject returns when the table/view/sequence is not the expected object. - ErrWrongObject = terror.ClassSchema.New(mysql.ErrWrongObject, mysql.MySQLErrName[mysql.ErrWrongObject]) + ErrWrongObject = dbterror.ClassSchema.NewStd(mysql.ErrWrongObject) ) diff --git a/infoschema/infoschema.go b/infoschema/infoschema.go index f2e1033ad7464..4fcbdc042de85 100644 --- a/infoschema/infoschema.go +++ b/infoschema/infoschema.go @@ -16,6 +16,7 @@ package infoschema import ( "fmt" "sort" + "sync" "sync/atomic" "github.com/pingcap/parser/model" @@ -53,9 +54,13 @@ type InfoSchema interface { TableIsView(schema, table model.CIStr) bool // TableIsSequence indicates whether the schema.table is a sequence. TableIsSequence(schema, table model.CIStr) bool - FindTableByPartitionID(partitionID int64) (table.Table, *model.DBInfo) + FindTableByPartitionID(partitionID int64) (table.Table, *model.DBInfo, *model.PartitionDefinition) // BundleByName is used to get a rule bundle. BundleByName(name string) (*placement.Bundle, bool) + // SetBundle is used internally to update rule bundles or mock tests. + SetBundle(*placement.Bundle) + // RuleBundles will return a copy of all rule bundles. + RuleBundles() []*placement.Bundle } type sortedTables []table.Table @@ -91,7 +96,8 @@ const bucketCount = 512 type infoSchema struct { // ruleBundleMap stores all placement rules - ruleBundleMap map[string]*placement.Bundle + ruleBundleMutex sync.RWMutex + ruleBundleMap map[string]*placement.Bundle schemaMap map[string]*schemaTables @@ -106,6 +112,7 @@ type infoSchema struct { func MockInfoSchema(tbList []*model.TableInfo) InfoSchema { result := &infoSchema{} result.schemaMap = make(map[string]*schemaTables) + result.ruleBundleMap = make(map[string]*placement.Bundle) result.sortedTablesBuckets = make([]sortedTables, bucketCount) dbInfo := &model.DBInfo{ID: 0, Name: model.NewCIStr("test"), Tables: tbList} tableNames := &schemaTables{ @@ -129,6 +136,7 @@ func MockInfoSchema(tbList []*model.TableInfo) InfoSchema { func MockInfoSchemaWithSchemaVer(tbList []*model.TableInfo, schemaVer int64) InfoSchema { result := &infoSchema{} result.schemaMap = make(map[string]*schemaTables) + result.ruleBundleMap = make(map[string]*placement.Bundle) result.sortedTablesBuckets = make([]sortedTables, bucketCount) dbInfo := &model.DBInfo{ID: 0, Name: model.NewCIStr("test"), Tables: tbList} tableNames := &schemaTables{ @@ -271,7 +279,7 @@ func (is *infoSchema) SchemaTables(schema model.CIStr) (tables []table.Table) { // FindTableByPartitionID finds the partition-table info by the partitionID. // FindTableByPartitionID will traverse all the tables to find the partitionID partition in which partition-table. -func (is *infoSchema) FindTableByPartitionID(partitionID int64) (table.Table, *model.DBInfo) { +func (is *infoSchema) FindTableByPartitionID(partitionID int64) (table.Table, *model.DBInfo, *model.PartitionDefinition) { for _, v := range is.schemaMap { for _, tbl := range v.tables { pi := tbl.Meta().GetPartitionInfo() @@ -280,12 +288,12 @@ func (is *infoSchema) FindTableByPartitionID(partitionID int64) (table.Table, *m } for _, p := range pi.Definitions { if p.ID == partitionID { - return tbl, v.dbInfo + return tbl, v.dbInfo, &p } } } } - return nil, nil + return nil, nil, nil } func (is *infoSchema) Clone() (result []*model.DBInfo) { @@ -392,12 +400,68 @@ func GetInfoSchemaBySessionVars(sessVar *variable.SessionVars) InfoSchema { is = snap.(InfoSchema) logutil.BgLogger().Info("use snapshot schema", zap.Uint64("conn", sessVar.ConnectionID), zap.Int64("schemaVersion", is.SchemaMetaVersion())) } else { + if sessVar.TxnCtx == nil || sessVar.TxnCtx.InfoSchema == nil { + return nil + } is = sessVar.TxnCtx.InfoSchema.(InfoSchema) } return is } func (is *infoSchema) BundleByName(name string) (*placement.Bundle, bool) { + is.ruleBundleMutex.RLock() + defer is.ruleBundleMutex.RUnlock() t, r := is.ruleBundleMap[name] return t, r } + +func (is *infoSchema) RuleBundles() []*placement.Bundle { + is.ruleBundleMutex.RLock() + defer is.ruleBundleMutex.RUnlock() + bundles := make([]*placement.Bundle, 0, len(is.ruleBundleMap)) + for _, bundle := range is.ruleBundleMap { + bundles = append(bundles, bundle) + } + return bundles +} + +func (is *infoSchema) SetBundle(bundle *placement.Bundle) { + is.ruleBundleMutex.Lock() + defer is.ruleBundleMutex.Unlock() + is.ruleBundleMap[bundle.ID] = bundle +} + +func (is *infoSchema) deleteBundle(id string) { + is.ruleBundleMutex.Lock() + defer is.ruleBundleMutex.Unlock() + delete(is.ruleBundleMap, id) +} + +// GetBundle get the first available bundle by array of IDs, possibbly fallback to the default. +// If fallback to the default, only rules applied to all regions(empty keyrange) will be returned. +// If the default bundle is unavailable, an empty bundle with an GroupID(ids[0]) is returned. +func GetBundle(h InfoSchema, ids []int64) *placement.Bundle { + for _, id := range ids { + b, ok := h.BundleByName(placement.GroupID(id)) + if ok { + return b.Clone() + } + } + + newRules := []*placement.Rule{} + + b, ok := h.BundleByName(placement.PDBundleID) + if ok { + for _, rule := range b.Rules { + if rule.StartKeyHex == "" && rule.EndKeyHex == "" { + newRules = append(newRules, rule.Clone()) + } + } + } + + id := int64(-1) + if len(ids) > 0 { + id = ids[0] + } + return &placement.Bundle{ID: placement.GroupID(id), Rules: newRules} +} diff --git a/infoschema/infoschema_test.go b/infoschema/infoschema_test.go index 5c2e9241c066a..c3892e6527962 100644 --- a/infoschema/infoschema_test.go +++ b/infoschema/infoschema_test.go @@ -14,6 +14,7 @@ package infoschema_test import ( + "context" "sync" "testing" @@ -21,6 +22,7 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -46,7 +48,10 @@ func (*testSuite) TestT(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() // Make sure it calls perfschema.Init(). dom, err := session.BootstrapSession(store) c.Assert(err, IsNil) @@ -104,8 +109,9 @@ func (*testSuite) TestT(c *C) { } dbInfos := []*model.DBInfo{dbInfo} - err = kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - meta.NewMeta(txn).CreateDatabase(dbInfo) + err = kv.RunInNewTxn(context.Background(), store, true, func(ctx context.Context, txn kv.Transaction) error { + err := meta.NewMeta(txn).CreateDatabase(dbInfo) + c.Assert(err, IsNil) return errors.Trace(err) }) c.Assert(err, IsNil) @@ -117,7 +123,8 @@ func (*testSuite) TestT(c *C) { c.Assert(err, IsNil) checkApplyCreateNonExistsSchemaDoesNotPanic(c, txn, builder) checkApplyCreateNonExistsTableDoesNotPanic(c, txn, builder, dbID) - txn.Rollback() + err = txn.Rollback() + c.Assert(err, IsNil) builder.Build() is := handle.Get() @@ -194,8 +201,9 @@ func (*testSuite) TestT(c *C) { c.Assert(err, IsNil) c.Assert(tb, NotNil) - err = kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { - meta.NewMeta(txn).CreateTableOrView(dbID, tblInfo) + err = kv.RunInNewTxn(context.Background(), store, true, func(ctx context.Context, txn kv.Transaction) error { + err := meta.NewMeta(txn).CreateTableOrView(dbID, tblInfo) + c.Assert(err, IsNil) return errors.Trace(err) }) c.Assert(err, IsNil) @@ -203,7 +211,8 @@ func (*testSuite) TestT(c *C) { c.Assert(err, IsNil) _, err = builder.ApplyDiff(meta.NewMeta(txn), &model.SchemaDiff{Type: model.ActionRenameTable, SchemaID: dbID, TableID: tbID, OldSchemaID: dbID}) c.Assert(err, IsNil) - txn.Rollback() + err = txn.Rollback() + c.Assert(err, IsNil) builder.Build() is = handle.Get() schema, ok = is.SchemaByID(dbID) @@ -280,7 +289,10 @@ func (*testSuite) TestInfoTables(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() handle := infoschema.NewHandle(store) builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(nil, nil, 0) c.Assert(err, IsNil) @@ -330,10 +342,89 @@ func (*testSuite) TestInfoTables(c *C) { func genGlobalID(store kv.Storage) (int64, error) { var globalID int64 - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, true, func(ctx context.Context, txn kv.Transaction) error { var err error globalID, err = meta.NewMeta(txn).GenGlobalID() return errors.Trace(err) }) return globalID, errors.Trace(err) } + +func (*testSuite) TestGetBundle(c *C) { + defer testleak.AfterTest(c)() + store, err := mockstore.NewMockStore() + c.Assert(err, IsNil) + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() + + handle := infoschema.NewHandle(store) + builder, err := infoschema.NewBuilder(handle).InitWithDBInfos(nil, nil, 0) + c.Assert(err, IsNil) + builder.Build() + + is := handle.Get() + + bundle := &placement.Bundle{ + ID: placement.PDBundleID, + Rules: []*placement.Rule{ + { + GroupID: placement.PDBundleID, + ID: "default", + Role: "voter", + Count: 3, + }, + }, + } + is.SetBundle(bundle) + + b := infoschema.GetBundle(is, []int64{}) + c.Assert(b.Rules, DeepEquals, bundle.Rules) + + // bundle itself is cloned + b.ID = "test" + c.Assert(bundle.ID, Equals, placement.PDBundleID) + + ptID := placement.GroupID(3) + bundle = &placement.Bundle{ + ID: ptID, + Rules: []*placement.Rule{ + { + GroupID: ptID, + ID: "default", + Role: "voter", + Count: 4, + }, + }, + } + is.SetBundle(bundle) + + b = infoschema.GetBundle(is, []int64{2, 3}) + c.Assert(b, DeepEquals, bundle) + + // bundle itself is cloned + b.ID = "test" + c.Assert(bundle.ID, Equals, ptID) + + ptID = placement.GroupID(1) + bundle = &placement.Bundle{ + ID: ptID, + Rules: []*placement.Rule{ + { + GroupID: ptID, + ID: "default", + Role: "voter", + Count: 4, + }, + }, + } + is.SetBundle(bundle) + + b = infoschema.GetBundle(is, []int64{1, 2, 3}) + c.Assert(b, DeepEquals, bundle) + + // bundle itself is cloned + b.ID = "test" + c.Assert(bundle.ID, Equals, ptID) +} diff --git a/infoschema/metric_table_def.go b/infoschema/metric_table_def.go index f74820d6f1055..f971e8b225ff3 100644 --- a/infoschema/metric_table_def.go +++ b/infoschema/metric_table_def.go @@ -82,6 +82,22 @@ var MetricTableMap = map[string]MetricTableDef{ Labels: []string{"instance"}, Comment: "TiDB current connection counts", }, + "tidb_connection_idle_duration": { + PromQL: `histogram_quantile($QUANTILE, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (le,in_txn,instance))`, + Labels: []string{"instance", "in_txn"}, + Quantile: 0.90, + Comment: "The quantile of TiDB connection idle durations(second)", + }, + "tidb_connection_idle_total_count": { + PromQL: `sum(increase(tidb_server_conn_idle_duration_seconds_count{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (in_txn,instance)`, + Labels: []string{"instance", "in_txn"}, + Comment: "The total count of TiDB connection idle", + }, + "tidb_connection_idle_total_time": { + PromQL: `sum(increase(tidb_server_conn_idle_duration_seconds_sum{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (in_txn,instance)`, + Labels: []string{"instance", "in_txn"}, + Comment: "The total time of TiDB connection idle", + }, "node_process_open_fd_count": { PromQL: "process_open_fds{$LABEL_CONDITIONS}", Labels: []string{"instance", "job"}, @@ -605,8 +621,8 @@ var MetricTableMap = map[string]MetricTableDef{ }, "tidb_gc_duration": { Comment: "The quantile of kv storage garbage collection time durations", - PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_tikvclient_gc_seconds_bucket{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (le,instance))", - Labels: []string{"instance"}, + PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_tikvclient_gc_seconds_bucket{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (le,instance,stage))", + Labels: []string{"instance", "stage"}, Quantile: 0.95, }, "tidb_gc_config": { @@ -650,7 +666,7 @@ var MetricTableMap = map[string]MetricTableDef{ Labels: []string{"instance", "store"}, }, "tidb_batch_client_wait_duration": { - Comment: "The quantile of kv storage batch processing durations", + Comment: "The quantile of kv storage batch processing durations, the unit is nanosecond", PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_tikvclient_batch_wait_duration_bucket{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (le, instance))", Labels: []string{"instance"}, Quantile: 0.95, @@ -1827,7 +1843,7 @@ var MetricTableMap = map[string]MetricTableDef{ Comment: "The flow rate of compaction operations per type", }, "tikv_compaction_pending_bytes": { - PromQL: `sum(rate(tikv_engine_pending_compaction_bytes{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (cf,instance,db)`, + PromQL: `tikv_engine_pending_compaction_bytes{$LABEL_CONDITIONS}`, Labels: []string{"instance", "cf", "db"}, Comment: "The pending bytes to be compacted", }, @@ -2413,7 +2429,7 @@ var MetricTableMap = map[string]MetricTableDef{ "tidb_batch_client_wait_total_time": { PromQL: "sum(increase(tidb_tikvclient_batch_wait_duration_sum{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance)", Labels: []string{"instance"}, - Comment: "The total time of kv storage batch processing durations", + Comment: "The total time of kv storage batch processing durations, the unit is nanosecond", }, "tidb_compile_total_count": { PromQL: "sum(increase(tidb_session_compile_duration_seconds_count{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance,sql_type)", @@ -2497,7 +2513,7 @@ var MetricTableMap = map[string]MetricTableDef{ }, "tidb_distsql_copr_cache": { Comment: "The quantile of TiDB distsql coprocessor cache", - PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_distsql_copr_cache_buckets{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (type,instance))", + PromQL: "histogram_quantile($QUANTILE, sum(rate(tidb_distsql_copr_cache_bucket{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (type,instance))", Labels: []string{"instance", "type"}, Quantile: 0.95, }, @@ -2522,13 +2538,13 @@ var MetricTableMap = map[string]MetricTableDef{ Comment: "The total time of kv storage range worker processing one task duration", }, "tidb_gc_total_count": { - PromQL: "sum(increase(tidb_tikvclient_gc_seconds_count{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance)", - Labels: []string{"instance"}, + PromQL: "sum(increase(tidb_tikvclient_gc_seconds_count{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance,stage)", + Labels: []string{"instance", "stage"}, Comment: "The total count of kv storage garbage collection", }, "tidb_gc_total_time": { - PromQL: "sum(increase(tidb_tikvclient_gc_seconds_sum{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance)", - Labels: []string{"instance"}, + PromQL: "sum(increase(tidb_tikvclient_gc_seconds_sum{$LABEL_CONDITIONS}[$RANGE_DURATION])) by (instance,stage)", + Labels: []string{"instance", "stage"}, Comment: "The total time of kv storage garbage collection time durations", }, "tidb_get_token_total_count": { diff --git a/infoschema/perfschema/const.go b/infoschema/perfschema/const.go index 86a5f1766739f..157ce4c7ae7c9 100644 --- a/infoschema/perfschema/const.go +++ b/infoschema/perfschema/const.go @@ -415,6 +415,7 @@ const tableEventsStatementsSummaryByDigest = "CREATE TABLE if not exists perform "LAST_SEEN timestamp(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000'," + "PLAN_IN_CACHE bool NOT NULL," + "PLAN_CACHE_HITS bigint unsigned NOT NULL," + + "PLAN_IN_BINDING bool NOT NULL," + "QUANTILE_95 bigint unsigned NOT NULL," + "QUANTILE_99 bigint unsigned NOT NULL," + "QUANTILE_999 bigint unsigned NOT NULL," + diff --git a/infoschema/perfschema/tables.go b/infoschema/perfschema/tables.go index 35ba8b709389f..f9fa6a68a44df 100644 --- a/infoschema/perfschema/tables.go +++ b/infoschema/perfschema/tables.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/profile" @@ -104,9 +105,10 @@ var tableIDMap = map[string]int64{ // perfSchemaTable stands for the fake table all its data is in the memory. type perfSchemaTable struct { infoschema.VirtualTable - meta *model.TableInfo - cols []*table.Column - tp table.Type + meta *model.TableInfo + cols []*table.Column + tp table.Type + indices []table.Index } var pluginTable = make(map[string]func(autoid.Allocators, *model.TableInfo) (table.Table, error)) @@ -129,11 +131,11 @@ func tableFromMeta(allocs autoid.Allocators, meta *model.TableInfo) (table.Table ret, err := f(allocs, meta) return ret, err } - return createPerfSchemaTable(meta), nil + return createPerfSchemaTable(meta) } // createPerfSchemaTable creates all perfSchemaTables -func createPerfSchemaTable(meta *model.TableInfo) *perfSchemaTable { +func createPerfSchemaTable(meta *model.TableInfo) (*perfSchemaTable, error) { columns := make([]*table.Column, 0, len(meta.Columns)) for _, colInfo := range meta.Columns { col := table.ToColumn(colInfo) @@ -145,7 +147,10 @@ func createPerfSchemaTable(meta *model.TableInfo) *perfSchemaTable { cols: columns, tp: tp, } - return t + if err := initTableIndices(t); err != nil { + return nil, err + } + return t, nil } // Cols implements table.Table Type interface. @@ -173,7 +178,7 @@ func (vt *perfSchemaTable) FullHiddenColsAndVisibleCols() []*table.Column { return vt.cols } -// GetID implements table.Table GetID interface. +// GetPhysicalID implements table.Table GetID interface. func (vt *perfSchemaTable) GetPhysicalID() int64 { return vt.meta.ID } @@ -188,6 +193,24 @@ func (vt *perfSchemaTable) Type() table.Type { return vt.tp } +// Indices implements table.Table Indices interface. +func (vt *perfSchemaTable) Indices() []table.Index { + return vt.indices +} + +// initTableIndices initializes the indices of the perfSchemaTable. +func initTableIndices(t *perfSchemaTable) error { + tblInfo := t.meta + for _, idxInfo := range tblInfo.Indices { + if idxInfo.State == model.StateNone { + return table.ErrIndexStateCantNone.GenWithStackByArgs(idxInfo.Name) + } + idx := tables.NewIndex(t.meta.ID, tblInfo, idxInfo) + t.indices = append(t.indices, idx) + } + return nil +} + func (vt *perfSchemaTable) getRows(ctx sessionctx.Context, cols []*table.Column) (fullRows [][]types.Datum, err error) { switch vt.meta.Name.O { case tableNameTiDBProfileCPU: @@ -237,11 +260,8 @@ func (vt *perfSchemaTable) getRows(ctx sessionctx.Context, cols []*table.Column) } // IterRecords implements table.Table IterRecords interface. -func (vt *perfSchemaTable) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols []*table.Column, +func (vt *perfSchemaTable) IterRecords(ctx sessionctx.Context, cols []*table.Column, fn table.RecordIterFunc) error { - if len(startKey) != 0 { - return table.ErrUnsupportedOp - } rows, err := vt.getRows(ctx, cols) if err != nil { return err diff --git a/infoschema/tables.go b/infoschema/tables.go old mode 100755 new mode 100644 index 91fedafc7e52b..ac70c62f9efe8 --- a/infoschema/tables.go +++ b/infoschema/tables.go @@ -18,6 +18,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "net/http" "sort" "strconv" @@ -31,6 +32,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -151,6 +153,14 @@ const ( TableTiFlashTables = "TIFLASH_TABLES" // TableTiFlashSegments is the string constant of tiflash segments table. TableTiFlashSegments = "TIFLASH_SEGMENTS" + // TablePlacementPolicy is the string constant of placement policy table. + TablePlacementPolicy = "PLACEMENT_POLICY" + // TableClientErrorsSummaryGlobal is the string constant of client errors table. + TableClientErrorsSummaryGlobal = "CLIENT_ERRORS_SUMMARY_GLOBAL" + // TableClientErrorsSummaryByUser is the string constant of client errors table. + TableClientErrorsSummaryByUser = "CLIENT_ERRORS_SUMMARY_BY_USER" + // TableClientErrorsSummaryByHost is the string constant of client errors table. + TableClientErrorsSummaryByHost = "CLIENT_ERRORS_SUMMARY_BY_HOST" ) var tableIDMap = map[string]int64{ @@ -219,6 +229,10 @@ var tableIDMap = map[string]int64{ TableStorageStats: autoid.InformationSchemaDBID + 63, TableTiFlashTables: autoid.InformationSchemaDBID + 64, TableTiFlashSegments: autoid.InformationSchemaDBID + 65, + TablePlacementPolicy: autoid.InformationSchemaDBID + 66, + TableClientErrorsSummaryGlobal: autoid.InformationSchemaDBID + 67, + TableClientErrorsSummaryByUser: autoid.InformationSchemaDBID + 68, + TableClientErrorsSummaryByHost: autoid.InformationSchemaDBID + 69, } type columnInfo struct { @@ -257,19 +271,41 @@ func buildColumnInfo(col columnInfo) *model.ColumnInfo { func buildTableMeta(tableName string, cs []columnInfo) *model.TableInfo { cols := make([]*model.ColumnInfo, 0, len(cs)) - for _, c := range cs { - cols = append(cols, buildColumnInfo(c)) - } - for i, col := range cols { - col.Offset = i - } - return &model.TableInfo{ + primaryIndices := make([]*model.IndexInfo, 0, 1) + tblInfo := &model.TableInfo{ Name: model.NewCIStr(tableName), - Columns: cols, State: model.StatePublic, Charset: mysql.DefaultCharset, Collate: mysql.DefaultCollationName, } + for offset, c := range cs { + if tblInfo.Name.O == ClusterTableSlowLog && mysql.HasPriKeyFlag(c.flag) { + switch c.tp { + case mysql.TypeLong, mysql.TypeLonglong, + mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24: + tblInfo.PKIsHandle = true + default: + tblInfo.IsCommonHandle = true + tblInfo.CommonHandleVersion = 1 + index := &model.IndexInfo{ + Name: model.NewCIStr("primary"), + State: model.StatePublic, + Primary: true, + Unique: true, + Columns: []*model.IndexColumn{ + {Name: model.NewCIStr(c.name), Offset: offset, Length: types.UnspecifiedLength}}, + } + primaryIndices = append(primaryIndices, index) + tblInfo.Indices = primaryIndices + } + } + cols = append(cols, buildColumnInfo(c)) + } + for i, col := range cols { + col.Offset = i + } + tblInfo.Columns = cols + return tblInfo } var schemataCols = []columnInfo{ @@ -475,6 +511,7 @@ var partitionsCols = []columnInfo{ {name: "PARTITION_COMMENT", tp: mysql.TypeVarchar, size: 80}, {name: "NODEGROUP", tp: mysql.TypeVarchar, size: 12}, {name: "TABLESPACE_NAME", tp: mysql.TypeVarchar, size: 64}, + {name: "TIDB_PARTITION_ID", tp: mysql.TypeLonglong, size: 21}, } var tableConstraintsCols = []columnInfo{ @@ -697,6 +734,7 @@ var tableProcesslistCols = []columnInfo{ {name: "INFO", tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: "DIGEST", tp: mysql.TypeVarchar, size: 64, deflt: ""}, {name: "MEM", tp: mysql.TypeLonglong, size: 21, flag: mysql.UnsignedFlag}, + {name: "DISK", tp: mysql.TypeLonglong, size: 21, flag: mysql.UnsignedFlag}, {name: "TxnStart", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag, deflt: ""}, } @@ -715,7 +753,7 @@ var tableTiDBIndexesCols = []columnInfo{ } var slowQueryCols = []columnInfo{ - {name: variable.SlowLogTimeStr, tp: mysql.TypeTimestamp, size: 26, decimal: 6}, + {name: variable.SlowLogTimeStr, tp: mysql.TypeTimestamp, size: 26, decimal: 6, flag: mysql.PriKeyFlag | mysql.NotNullFlag | mysql.BinaryFlag}, {name: variable.SlowLogTxnStartTSStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, {name: variable.SlowLogUserStr, tp: mysql.TypeVarchar, size: 64}, {name: variable.SlowLogHostStr, tp: mysql.TypeVarchar, size: 64}, @@ -750,6 +788,11 @@ var slowQueryCols = []columnInfo{ {name: execdetails.RequestCountStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, {name: execdetails.TotalKeysStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, {name: execdetails.ProcessKeysStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, + {name: execdetails.RocksdbDeleteSkippedCountStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, + {name: execdetails.RocksdbKeySkippedCountStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, + {name: execdetails.RocksdbBlockCacheHitCountStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, + {name: execdetails.RocksdbBlockReadCountStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, + {name: execdetails.RocksdbBlockReadByteStr, tp: mysql.TypeLonglong, size: 20, flag: mysql.UnsignedFlag}, {name: variable.SlowLogDBStr, tp: mysql.TypeVarchar, size: 64}, {name: variable.SlowLogIndexNamesStr, tp: mysql.TypeVarchar, size: 100}, {name: variable.SlowLogIsInternalStr, tp: mysql.TypeTiny, size: 1}, @@ -765,8 +808,15 @@ var slowQueryCols = []columnInfo{ {name: variable.SlowLogCopWaitAddr, tp: mysql.TypeVarchar, size: 64}, {name: variable.SlowLogMemMax, tp: mysql.TypeLonglong, size: 20}, {name: variable.SlowLogDiskMax, tp: mysql.TypeLonglong, size: 20}, + {name: variable.SlowLogKVTotal, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogPDTotal, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogBackoffTotal, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogWriteSQLRespTotal, tp: mysql.TypeDouble, size: 22}, + {name: variable.SlowLogBackoffDetail, tp: mysql.TypeVarchar, size: 4096}, + {name: variable.SlowLogPrepared, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogSucc, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlanFromCache, tp: mysql.TypeTiny, size: 1}, + {name: variable.SlowLogPlanFromBinding, tp: mysql.TypeTiny, size: 1}, {name: variable.SlowLogPlan, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, {name: variable.SlowLogPlanDigest, tp: mysql.TypeVarchar, size: 128}, {name: variable.SlowLogPrevStmt, tp: mysql.TypeLongBlob, size: types.UnspecifiedLength}, @@ -955,6 +1005,7 @@ var tableClusterInfoCols = []columnInfo{ {name: "GIT_HASH", tp: mysql.TypeVarchar, size: 64}, {name: "START_TIME", tp: mysql.TypeVarchar, size: 32}, {name: "UPTIME", tp: mysql.TypeVarchar, size: 32}, + {name: "SERVER_ID", tp: mysql.TypeLonglong, size: 21, comment: "invalid if the configuration item `enable-global-kill` is set to FALSE"}, } var tableTableTiFlashReplicaCols = []columnInfo{ @@ -1092,6 +1143,16 @@ var tableStatementsSummaryCols = []columnInfo{ {name: "MAX_TOTAL_KEYS", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of scanned keys"}, {name: "AVG_PROCESSED_KEYS", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of processed keys"}, {name: "MAX_PROCESSED_KEYS", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of processed keys"}, + {name: "AVG_ROCKSDB_DELETE_SKIPPED_COUNT", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rocksdb delete skipped count"}, + {name: "MAX_ROCKSDB_DELETE_SKIPPED_COUNT", tp: mysql.TypeLong, size: 11, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of rocksdb delete skipped count"}, + {name: "AVG_ROCKSDB_KEY_SKIPPED_COUNT", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rocksdb key skipped count"}, + {name: "MAX_ROCKSDB_KEY_SKIPPED_COUNT", tp: mysql.TypeLong, size: 11, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of rocksdb key skipped count"}, + {name: "AVG_ROCKSDB_BLOCK_CACHE_HIT_COUNT", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rocksdb block cache hit count"}, + {name: "MAX_ROCKSDB_BLOCK_CACHE_HIT_COUNT", tp: mysql.TypeLong, size: 11, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of rocksdb block cache hit count"}, + {name: "AVG_ROCKSDB_BLOCK_READ_COUNT", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rocksdb block read count"}, + {name: "MAX_ROCKSDB_BLOCK_READ_COUNT", tp: mysql.TypeLong, size: 11, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of rocksdb block read count"}, + {name: "AVG_ROCKSDB_BLOCK_READ_BYTE", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rocksdb block read byte"}, + {name: "MAX_ROCKSDB_BLOCK_READ_BYTE", tp: mysql.TypeLong, size: 11, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max number of rocksdb block read byte"}, {name: "AVG_PREWRITE_TIME", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of prewrite phase"}, {name: "MAX_PREWRITE_TIME", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max time of prewrite phase"}, {name: "AVG_COMMIT_TIME", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of commit phase"}, @@ -1120,11 +1181,17 @@ var tableStatementsSummaryCols = []columnInfo{ {name: "MAX_MEM", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max memory(byte) used"}, {name: "AVG_DISK", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average disk space(byte) used"}, {name: "MAX_DISK", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Max disk space(byte) used"}, + {name: "AVG_KV_TIME", tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of TiKV used"}, + {name: "AVG_PD_TIME", tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of PD used"}, + {name: "AVG_BACKOFF_TOTAL_TIME", tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of Backoff used"}, + {name: "AVG_WRITE_SQL_RESP_TIME", tp: mysql.TypeLonglong, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average time of write sql resp used"}, + {name: "PREPARED", tp: mysql.TypeTiny, size: 1, flag: mysql.NotNullFlag, comment: "Whether prepared"}, {name: "AVG_AFFECTED_ROWS", tp: mysql.TypeDouble, size: 22, flag: mysql.NotNullFlag | mysql.UnsignedFlag, comment: "Average number of rows affected"}, {name: "FIRST_SEEN", tp: mysql.TypeTimestamp, size: 26, flag: mysql.NotNullFlag, comment: "The time these statements are seen for the first time"}, {name: "LAST_SEEN", tp: mysql.TypeTimestamp, size: 26, flag: mysql.NotNullFlag, comment: "The time these statements are seen for the last time"}, {name: "PLAN_IN_CACHE", tp: mysql.TypeTiny, size: 1, flag: mysql.NotNullFlag, comment: "Whether the last statement hit plan cache"}, {name: "PLAN_CACHE_HITS", tp: mysql.TypeLonglong, size: 20, flag: mysql.NotNullFlag, comment: "The number of times these statements hit plan cache"}, + {name: "PLAN_IN_BINDING", tp: mysql.TypeTiny, size: 1, flag: mysql.NotNullFlag, comment: "Whether the last statement is matched with the hints in the binding"}, {name: "QUERY_SAMPLE_TEXT", tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "Sampled original statement"}, {name: "PREV_SAMPLE_TEXT", tp: mysql.TypeBlob, size: types.UnspecifiedLength, comment: "The previous statement before commit"}, {name: "PLAN_DIGEST", tp: mysql.TypeVarchar, size: 64, comment: "Digest of its execution plan"}, @@ -1221,6 +1288,48 @@ var tableTableTiFlashSegmentsCols = []columnInfo{ {name: "TIFLASH_INSTANCE", tp: mysql.TypeVarchar, size: 64}, } +var tablePlacementPolicyCols = []columnInfo{ + {name: "GROUP_ID", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag}, + {name: "GROUP_INDEX", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag | mysql.UnsignedFlag}, + {name: "RULE_ID", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag}, + {name: "SCHEMA_NAME", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag}, + {name: "TABLE_NAME", tp: mysql.TypeVarchar, size: 64}, + {name: "PARTITION_NAME", tp: mysql.TypeVarchar, size: 64}, + {name: "INDEX_NAME", tp: mysql.TypeVarchar, size: 64}, + {name: "ROLE", tp: mysql.TypeVarchar, size: 16, flag: mysql.NotNullFlag}, + {name: "REPLICAS", tp: mysql.TypeLonglong, size: 64, flag: mysql.UnsignedFlag}, + {name: "CONSTRAINTS", tp: mysql.TypeVarchar, size: 1024}, +} + +var tableClientErrorsSummaryGlobalCols = []columnInfo{ + {name: "ERROR_NUMBER", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "ERROR_MESSAGE", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "ERROR_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "WARNING_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "FIRST_SEEN", tp: mysql.TypeTimestamp, size: 26}, + {name: "LAST_SEEN", tp: mysql.TypeTimestamp, size: 26}, +} + +var tableClientErrorsSummaryByUserCols = []columnInfo{ + {name: "USER", tp: mysql.TypeVarchar, size: 64, flag: mysql.NotNullFlag}, + {name: "ERROR_NUMBER", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "ERROR_MESSAGE", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "ERROR_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "WARNING_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "FIRST_SEEN", tp: mysql.TypeTimestamp, size: 26}, + {name: "LAST_SEEN", tp: mysql.TypeTimestamp, size: 26}, +} + +var tableClientErrorsSummaryByHostCols = []columnInfo{ + {name: "HOST", tp: mysql.TypeVarchar, size: 255, flag: mysql.NotNullFlag}, + {name: "ERROR_NUMBER", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "ERROR_MESSAGE", tp: mysql.TypeVarchar, size: 1024, flag: mysql.NotNullFlag}, + {name: "ERROR_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "WARNING_COUNT", tp: mysql.TypeLonglong, size: 64, flag: mysql.NotNullFlag}, + {name: "FIRST_SEEN", tp: mysql.TypeTimestamp, size: 26}, + {name: "LAST_SEEN", tp: mysql.TypeTimestamp, size: 26}, +} + // GetShardingInfo returns a nil or description string for the sharding information of given TableInfo. // The returned description string may be: // - "NOT_SHARDED": for tables that SHARD_ROW_ID_BITS is not specified. @@ -1263,6 +1372,35 @@ type ServerInfo struct { Version string GitHash string StartTimestamp int64 + ServerID uint64 +} + +func (s *ServerInfo) isLoopBackOrUnspecifiedAddr(addr string) bool { + tcpAddr, err := net.ResolveTCPAddr("", addr) + if err != nil { + return false + } + ip := net.ParseIP(tcpAddr.IP.String()) + return ip != nil && (ip.IsUnspecified() || ip.IsLoopback()) +} + +// ResolveLoopBackAddr exports for testing. +func (s *ServerInfo) ResolveLoopBackAddr() { + if s.isLoopBackOrUnspecifiedAddr(s.Address) && !s.isLoopBackOrUnspecifiedAddr(s.StatusAddr) { + addr, err1 := net.ResolveTCPAddr("", s.Address) + statusAddr, err2 := net.ResolveTCPAddr("", s.StatusAddr) + if err1 == nil && err2 == nil { + addr.IP = statusAddr.IP + s.Address = addr.String() + } + } else if !s.isLoopBackOrUnspecifiedAddr(s.Address) && s.isLoopBackOrUnspecifiedAddr(s.StatusAddr) { + addr, err1 := net.ResolveTCPAddr("", s.Address) + statusAddr, err2 := net.ResolveTCPAddr("", s.StatusAddr) + if err1 == nil && err2 == nil { + statusAddr.IP = addr.IP + s.StatusAddr = statusAddr.String() + } + } } // GetClusterServerInfo returns all components information of cluster @@ -1274,12 +1412,17 @@ func GetClusterServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { var servers []ServerInfo for _, server := range strings.Split(s, ";") { parts := strings.Split(server, ",") + serverID, err := strconv.ParseUint(parts[5], 10, 64) + if err != nil { + panic("convert parts[5] to uint64 failed") + } servers = append(servers, ServerInfo{ ServerType: parts[0], Address: parts[1], StatusAddr: parts[2], Version: parts[3], GitHash: parts[4], + ServerID: serverID, }) } failpoint.Return(servers, nil) @@ -1293,6 +1436,9 @@ func GetClusterServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { if err != nil { return nil, err } + for i := range nodes { + nodes[i].ResolveLoopBackAddr() + } servers = append(servers, nodes...) } return servers, nil @@ -1318,6 +1464,7 @@ func GetTiDBServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { Version: FormatVersion(node.Version, isDefaultVersion), GitHash: node.GitHash, StartTimestamp: node.StartTimestamp, + ServerID: node.ServerIDGetter(), }) } return servers, nil @@ -1351,7 +1498,7 @@ func FormatVersion(TiDBVersion string, isDefaultVersion bool) string { func GetPDServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { // Get PD servers info. store := ctx.GetStore() - etcd, ok := store.(tikv.EtcdBackend) + etcd, ok := store.(kv.EtcdBackend) if !ok { return nil, errors.Errorf("%T not an etcd backend", store) } @@ -1412,14 +1559,12 @@ func GetPDServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { return servers, nil } -const tiflashLabel = "tiflash" - // GetStoreServerInfo returns all store nodes(TiKV or TiFlash) cluster information func GetStoreServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { isTiFlashStore := func(store *metapb.Store) bool { isTiFlash := false for _, label := range store.Labels { - if label.GetKey() == "engine" && label.GetValue() == tiflashLabel { + if label.GetKey() == placement.EngineLabelKey && label.GetValue() == placement.EngineLabelTiFlash { isTiFlash = true } } @@ -1453,7 +1598,7 @@ func GetStoreServerInfo(ctx sessionctx.Context) ([]ServerInfo, error) { } var tp string if isTiFlashStore(store) { - tp = tiflashLabel + tp = kv.TiFlash.Name() } else { tp = tikv.GetStoreTypeByMeta(store).Name() } @@ -1482,7 +1627,7 @@ func GetTiFlashStoreCount(ctx sessionctx.Context) (cnt uint64, err error) { return cnt, err } for _, store := range stores { - if store.ServerType == tiflashLabel { + if store.ServerType == kv.TiFlash.Name() { cnt++ } } @@ -1550,6 +1695,10 @@ var tableNameToColumns = map[string][]columnInfo{ TableStorageStats: tableStorageStatsCols, TableTiFlashTables: tableTableTiFlashTablesCols, TableTiFlashSegments: tableTableTiFlashSegmentsCols, + TablePlacementPolicy: tablePlacementPolicyCols, + TableClientErrorsSummaryGlobal: tableClientErrorsSummaryGlobalCols, + TableClientErrorsSummaryByUser: tableClientErrorsSummaryByUserCols, + TableClientErrorsSummaryByHost: tableClientErrorsSummaryByHostCols, } func createInfoSchemaTable(_ autoid.Allocators, meta *model.TableInfo) (table.Table, error) { @@ -1624,11 +1773,8 @@ func (it *infoschemaTable) getRows(ctx sessionctx.Context, cols []*table.Column) } // IterRecords implements table.Table IterRecords interface. -func (it *infoschemaTable) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols []*table.Column, +func (it *infoschemaTable) IterRecords(ctx sessionctx.Context, cols []*table.Column, fn table.RecordIterFunc) error { - if len(startKey) != 0 { - return table.ErrUnsupportedOp - } rows, err := it.getRows(ctx, cols) if err != nil { return err @@ -1645,16 +1791,6 @@ func (it *infoschemaTable) IterRecords(ctx sessionctx.Context, startKey kv.Key, return nil } -// RowWithCols implements table.Table RowWithCols interface. -func (it *infoschemaTable) RowWithCols(ctx sessionctx.Context, h kv.Handle, cols []*table.Column) ([]types.Datum, error) { - return nil, table.ErrUnsupportedOp -} - -// Row implements table.Table Row interface. -func (it *infoschemaTable) Row(ctx sessionctx.Context, h kv.Handle) ([]types.Datum, error) { - return nil, table.ErrUnsupportedOp -} - // Cols implements table.Table Cols interface. func (it *infoschemaTable) Cols() []*table.Column { return it.cols @@ -1685,36 +1821,11 @@ func (it *infoschemaTable) Indices() []table.Index { return nil } -// WritableIndices implements table.Table WritableIndices interface. -func (it *infoschemaTable) WritableIndices() []table.Index { - return nil -} - -// DeletableIndices implements table.Table DeletableIndices interface. -func (it *infoschemaTable) DeletableIndices() []table.Index { - return nil -} - // RecordPrefix implements table.Table RecordPrefix interface. func (it *infoschemaTable) RecordPrefix() kv.Key { return nil } -// IndexPrefix implements table.Table IndexPrefix interface. -func (it *infoschemaTable) IndexPrefix() kv.Key { - return nil -} - -// FirstKey implements table.Table FirstKey interface. -func (it *infoschemaTable) FirstKey() kv.Key { - return nil -} - -// RecordKey implements table.Table RecordKey interface. -func (it *infoschemaTable) RecordKey(h kv.Handle) kv.Key { - return nil -} - // AddRecord implements table.Table AddRecord interface. func (it *infoschemaTable) AddRecord(ctx sessionctx.Context, r []types.Datum, opts ...table.AddRecordOption) (recordID kv.Handle, err error) { return nil, table.ErrUnsupportedOp @@ -1750,11 +1861,6 @@ func (it *infoschemaTable) GetPhysicalID() int64 { return it.meta.ID } -// Seek implements table.Table Seek interface. -func (it *infoschemaTable) Seek(ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) { - return nil, false, table.ErrUnsupportedOp -} - // Type implements table.Table Type interface. func (it *infoschemaTable) Type() table.Type { return it.tp @@ -1763,25 +1869,6 @@ func (it *infoschemaTable) Type() table.Type { // VirtualTable is a dummy table.Table implementation. type VirtualTable struct{} -// IterRecords implements table.Table IterRecords interface. -func (vt *VirtualTable) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols []*table.Column, - _ table.RecordIterFunc) error { - if len(startKey) != 0 { - return table.ErrUnsupportedOp - } - return nil -} - -// RowWithCols implements table.Table RowWithCols interface. -func (vt *VirtualTable) RowWithCols(ctx sessionctx.Context, h kv.Handle, cols []*table.Column) ([]types.Datum, error) { - return nil, table.ErrUnsupportedOp -} - -// Row implements table.Table Row interface. -func (vt *VirtualTable) Row(ctx sessionctx.Context, h kv.Handle) ([]types.Datum, error) { - return nil, table.ErrUnsupportedOp -} - // Cols implements table.Table Cols interface. func (vt *VirtualTable) Cols() []*table.Column { return nil @@ -1812,36 +1899,11 @@ func (vt *VirtualTable) Indices() []table.Index { return nil } -// WritableIndices implements table.Table WritableIndices interface. -func (vt *VirtualTable) WritableIndices() []table.Index { - return nil -} - -// DeletableIndices implements table.Table DeletableIndices interface. -func (vt *VirtualTable) DeletableIndices() []table.Index { - return nil -} - // RecordPrefix implements table.Table RecordPrefix interface. func (vt *VirtualTable) RecordPrefix() kv.Key { return nil } -// IndexPrefix implements table.Table IndexPrefix interface. -func (vt *VirtualTable) IndexPrefix() kv.Key { - return nil -} - -// FirstKey implements table.Table FirstKey interface. -func (vt *VirtualTable) FirstKey() kv.Key { - return nil -} - -// RecordKey implements table.Table RecordKey interface. -func (vt *VirtualTable) RecordKey(h kv.Handle) kv.Key { - return nil -} - // AddRecord implements table.Table AddRecord interface. func (vt *VirtualTable) AddRecord(ctx sessionctx.Context, r []types.Datum, opts ...table.AddRecordOption) (recordID kv.Handle, err error) { return nil, table.ErrUnsupportedOp @@ -1877,11 +1939,6 @@ func (vt *VirtualTable) GetPhysicalID() int64 { return 0 } -// Seek implements table.Table Seek interface. -func (vt *VirtualTable) Seek(ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) { - return nil, false, table.ErrUnsupportedOp -} - // Type implements table.Table Type interface. func (vt *VirtualTable) Type() table.Type { return table.VirtualTable diff --git a/infoschema/tables_test.go b/infoschema/tables_test.go index 2b84ae0bf1a3a..699a2caa2caed 100644 --- a/infoschema/tables_test.go +++ b/infoschema/tables_test.go @@ -33,7 +33,9 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -225,7 +227,7 @@ func (s *testTableSuite) TestInfoschemaFieldValue(c *C) { tk.MustQuery("select CHARACTER_MAXIMUM_LENGTH,CHARACTER_OCTET_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,DATETIME_PRECISION from information_schema.COLUMNS where table_name='timeschema'"). Check(testkit.Rows(" ", " 3", " 3", " 4", " ")) tk.MustQuery("select CHARACTER_MAXIMUM_LENGTH,CHARACTER_OCTET_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,DATETIME_PRECISION from information_schema.COLUMNS where table_name='strschema'"). - Check(testkit.Rows("3 3 ", "3 3 ", "3 3 ", "3 3 ")) // FIXME: for mysql last two will be "255 255 ", "255 255 " + Check(testkit.Rows("3 3 ", "3 3 ", "255 255 ", "255 255 ")) tk.MustQuery("select NUMERIC_SCALE from information_schema.COLUMNS where table_name='floatschema'"). Check(testkit.Rows("", "3")) @@ -243,7 +245,7 @@ func (s *testTableSuite) TestInfoschemaFieldValue(c *C) { "t CREATE TABLE `t` (\n" + " `c` int(11) NOT NULL AUTO_INCREMENT,\n" + " `d` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`c`)\n" + + " PRIMARY KEY (`c`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=30002")) // Test auto_increment for table without auto_increment column @@ -293,16 +295,17 @@ func (s *testTableSuite) TestInfoschemaFieldValue(c *C) { tk.MustQuery("show create table information_schema.PROCESSLIST").Check( testkit.Rows("" + "PROCESSLIST CREATE TABLE `PROCESSLIST` (\n" + - " `ID` bigint(21) unsigned NOT NULL DEFAULT 0,\n" + + " `ID` bigint(21) unsigned NOT NULL DEFAULT '0',\n" + " `USER` varchar(16) NOT NULL DEFAULT '',\n" + " `HOST` varchar(64) NOT NULL DEFAULT '',\n" + " `DB` varchar(64) DEFAULT NULL,\n" + " `COMMAND` varchar(16) NOT NULL DEFAULT '',\n" + - " `TIME` int(7) NOT NULL DEFAULT 0,\n" + + " `TIME` int(7) NOT NULL DEFAULT '0',\n" + " `STATE` varchar(7) DEFAULT NULL,\n" + " `INFO` longtext DEFAULT NULL,\n" + " `DIGEST` varchar(64) DEFAULT '',\n" + " `MEM` bigint(21) unsigned DEFAULT NULL,\n" + + " `DISK` bigint(21) unsigned DEFAULT NULL,\n" + " `TxnStart` varchar(64) NOT NULL DEFAULT ''\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustQuery("show create table information_schema.cluster_log").Check( @@ -443,8 +446,14 @@ func (sm *mockSessionManager) GetProcessInfo(id uint64) (*util.ProcessInfo, bool func (sm *mockSessionManager) Kill(connectionID uint64, query bool) {} +func (sm *mockSessionManager) KillAllConnections() {} + func (sm *mockSessionManager) UpdateTLSConfig(cfg *tls.Config) {} +func (sm *mockSessionManager) ServerID() uint64 { + return 1 +} + func (s *testTableSuite) TestSomeTables(c *C) { se, err := session.CreateSession4Test(s.store) c.Assert(err, IsNil) @@ -455,6 +464,7 @@ func (s *testTableSuite) TestSomeTables(c *C) { ID: 1, User: "user-1", Host: "localhost", + Port: "", DB: "information_schema", Command: byte(1), Digest: "abc1", @@ -466,6 +476,7 @@ func (s *testTableSuite) TestSomeTables(c *C) { ID: 2, User: "user-2", Host: "localhost", + Port: "", DB: "test", Command: byte(2), Digest: "abc2", @@ -473,21 +484,36 @@ func (s *testTableSuite) TestSomeTables(c *C) { Info: strings.Repeat("x", 101), StmtCtx: tk.Se.GetSessionVars().StmtCtx, } + sm.processInfoMap[3] = &util.ProcessInfo{ + ID: 3, + User: "user-3", + Host: "127.0.0.1", + Port: "12345", + DB: "test", + Command: byte(2), + Digest: "abc3", + State: 1, + Info: "check port", + StmtCtx: tk.Se.GetSessionVars().StmtCtx, + } tk.Se.SetSessionManager(sm) tk.MustQuery("select * from information_schema.PROCESSLIST order by ID;").Sort().Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 ", "in transaction", "do something"), - fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s abc2 0 ", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", "do something"), + fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s abc2 0 0 ", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("3 user-3 127.0.0.1:12345 test Init DB 9223372036 %s %s abc3 0 0 ", "in transaction", "check port"), )) tk.MustQuery("SHOW PROCESSLIST;").Sort().Check( testkit.Rows( fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s", "in transaction", "do something"), fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s", "autocommit", strings.Repeat("x", 100)), + fmt.Sprintf("3 user-3 127.0.0.1:12345 test Init DB 9223372036 %s %s", "in transaction", "check port"), )) tk.MustQuery("SHOW FULL PROCESSLIST;").Sort().Check( testkit.Rows( fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s", "in transaction", "do something"), fmt.Sprintf("2 user-2 localhost test Init DB 9223372036 %s %s", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("3 user-3 127.0.0.1:12345 test Init DB 9223372036 %s %s", "in transaction", "check port"), )) sm = &mockSessionManager{make(map[uint64]*util.ProcessInfo, 2)} @@ -516,8 +542,8 @@ func (s *testTableSuite) TestSomeTables(c *C) { tk.Se.GetSessionVars().TimeZone = time.UTC tk.MustQuery("select * from information_schema.PROCESSLIST order by ID;").Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 ", "in transaction", ""), - fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", ""), + fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), )) tk.MustQuery("SHOW PROCESSLIST;").Sort().Check( testkit.Rows( @@ -531,11 +557,11 @@ func (s *testTableSuite) TestSomeTables(c *C) { )) tk.MustQuery("select * from information_schema.PROCESSLIST where db is null;").Check( testkit.Rows( - fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), + fmt.Sprintf("2 user-2 localhost Init DB 9223372036 %s %s abc2 0 0 07-29 03:26:05.158(410090409861578752)", "autocommit", strings.Repeat("x", 101)), )) tk.MustQuery("select * from information_schema.PROCESSLIST where Info is null;").Check( testkit.Rows( - fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 ", "in transaction", ""), + fmt.Sprintf("1 user-1 localhost information_schema Quit 9223372036 %s %s abc1 0 0 ", "in transaction", ""), )) } @@ -555,6 +581,7 @@ func prepareSlowLogfile(c *C, slowLogFileName string) { # Wait_TS: 0.000000003 # LockKeys_time: 1.71 Request_count: 1 Prewrite_time: 0.19 Wait_prewrite_binlog_time: 0.21 Commit_time: 0.01 Commit_backoff_time: 0.18 Backoff_types: [txnLock] Resolve_lock_time: 0.03 Write_keys: 15 Write_size: 480 Prewrite_region: 1 Txn_retry: 8 # Cop_time: 0.3824278 Process_time: 0.161 Request_count: 1 Total_keys: 100001 Process_keys: 100000 +# Rocksdb_delete_skipped_count: 100 Rocksdb_key_skipped_count: 10 Rocksdb_block_cache_hit_count: 10 Rocksdb_block_read_count: 10 Rocksdb_block_read_byte: 100 # Wait_time: 0.101 # Backoff_time: 0.092 # DB: test @@ -637,10 +664,10 @@ func (s *testTableSuite) TestSlowQuery(c *C) { tk.MustExec("set time_zone = '+08:00';") re := tk.MustQuery("select * from information_schema.slow_query") re.Check(testutil.RowsWithSep("|", - "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|1|1|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;")) + "2019-02-12 19:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0||0|1|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;")) tk.MustExec("set time_zone = '+00:00';") re = tk.MustQuery("select * from information_schema.slow_query") - re.Check(testutil.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|1|1|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;")) + re.Check(testutil.RowsWithSep("|", "2019-02-12 11:33:56.571953|406315658548871171|root|localhost|6|57|0.12|4.895492|0.4|0.2|0.000000003|2|0.000000002|0.00000001|0.000000003|0.19|0.21|0.01|0|0.18|[txnLock]|0.03|0|15|480|1|8|0.3824278|0.161|0.101|0.092|1.71|1|100001|100000|100|10|10|10|100|test||0|42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772|t1:1,t2:2|0.1|0.2|0.03|127.0.0.1:20160|0.05|0.6|0.8|0.0.0.0:20160|70724|65536|0|0|0|0||0|1|1|0|abcd|60e9378c746d9a2be1c791047e008967cf252eb6de9167ad3aa6098fa2d523f4|update t set i = 2;|select * from t_slim;")) // Test for long query. f, err := os.OpenFile(slowLogFileName, os.O_CREATE|os.O_WRONLY, 0644) @@ -689,9 +716,9 @@ func (s *testTableSuite) TestReloadDropDatabase(c *C) { func (s *testClusterTableSuite) TestForClusterServerInfo(c *C) { tk := testkit.NewTestKit(c, s.store) instances := []string{ - strings.Join([]string{"tidb", s.listenAddr, s.listenAddr, "mock-version,mock-githash"}, ","), - strings.Join([]string{"pd", s.listenAddr, s.listenAddr, "mock-version,mock-githash"}, ","), - strings.Join([]string{"tikv", s.listenAddr, s.listenAddr, "mock-version,mock-githash"}, ","), + strings.Join([]string{"tidb", s.listenAddr, s.listenAddr, "mock-version,mock-githash,1001"}, ","), + strings.Join([]string{"pd", s.listenAddr, s.listenAddr, "mock-version,mock-githash,0"}, ","), + strings.Join([]string{"tikv", s.listenAddr, s.listenAddr, "mock-version,mock-githash,0"}, ","), } fpExpr := `return("` + strings.Join(instances, ";") + `")` @@ -795,13 +822,15 @@ func (s *testClusterTableSuite) TestSelectClusterTable(c *C) { tk.MustExec("use information_schema") tk.MustExec(fmt.Sprintf("set @@tidb_enable_streaming=%d", i)) tk.MustExec("set @@global.tidb_enable_stmt_summary=1") + tk.MustExec("set time_zone = '+08:00';") tk.MustQuery("select count(*) from `CLUSTER_SLOW_QUERY`").Check(testkit.Rows("1")) tk.MustQuery("select time from `CLUSTER_SLOW_QUERY` where time='2019-02-12 19:33:56.571953'").Check(testutil.RowsWithSep("|", "2019-02-12 19:33:56.571953")) tk.MustQuery("select count(*) from `CLUSTER_PROCESSLIST`").Check(testkit.Rows("1")) - tk.MustQuery("select * from `CLUSTER_PROCESSLIST`").Check(testkit.Rows(fmt.Sprintf(":10080 1 root 127.0.0.1 Query 9223372036 %s 0 ", ""))) + tk.MustQuery("select * from `CLUSTER_PROCESSLIST`").Check(testkit.Rows(fmt.Sprintf(":10080 1 root 127.0.0.1 Query 9223372036 %s 0 0 ", ""))) tk.MustQuery("select query_time, conn_id from `CLUSTER_SLOW_QUERY` order by time limit 1").Check(testkit.Rows("4.895492 6")) tk.MustQuery("select count(*) from `CLUSTER_SLOW_QUERY` group by digest").Check(testkit.Rows("1")) tk.MustQuery("select digest, count(*) from `CLUSTER_SLOW_QUERY` group by digest").Check(testkit.Rows("42a1c8aae6f133e934d4bf0147491709a8812ea05ff8819ec522780fe657b772 1")) + tk.MustQuery(`select length(query) as l,time from information_schema.cluster_slow_query where time > "2019-02-12 19:33:56" order by abs(l) desc limit 10;`).Check(testkit.Rows("21 2019-02-12 19:33:56.571953")) tk.MustQuery("select count(*) from `CLUSTER_SLOW_QUERY` where time > now() group by digest").Check(testkit.Rows()) re := tk.MustQuery("select * from `CLUSTER_statements_summary`") c.Assert(re, NotNil) @@ -848,7 +877,7 @@ select * from t3; tk.MustQuery("select count(*) from `CLUSTER_SLOW_QUERY`").Check(testkit.Rows("4")) tk.MustQuery("select count(*) from `SLOW_QUERY`").Check(testkit.Rows("4")) tk.MustQuery("select count(*) from `CLUSTER_PROCESSLIST`").Check(testkit.Rows("1")) - tk.MustQuery("select * from `CLUSTER_PROCESSLIST`").Check(testkit.Rows(fmt.Sprintf(":10080 1 root 127.0.0.1 Query 9223372036 %s 0 ", ""))) + tk.MustQuery("select * from `CLUSTER_PROCESSLIST`").Check(testkit.Rows(fmt.Sprintf(":10080 1 root 127.0.0.1 Query 9223372036 %s 0 0 ", ""))) tk.MustExec("create user user1") tk.MustExec("create user user2") user1 := testkit.NewTestKit(c, s.store) @@ -946,12 +975,13 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { tk.MustExec("insert into t values(2, 'b')") tk.MustExec("insert into t VALUES(3, 'c')") tk.MustExec("/**/insert into t values(4, 'd')") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text - from information_schema.statements_summary - where digest_text like 'insert into t%'`, - ).Check(testkit.Rows("Insert test test.t 4 0 0 0 0 0 2 2 1 1 1 insert into t values(1, 'a')")) + + sql := "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text " + + "from information_schema.statements_summary " + + "where digest_text like 'insert into `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Insert test test.t 4 0 0 0 0 0 2 2 1 1 1 insert into t values(1, 'a')")) // Test point get. tk.MustExec("drop table if exists p") @@ -960,21 +990,30 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { tk.MustQuery("select b from p where a=1") expectedResult := fmt.Sprintf("%d \tid \ttask\testRows\toperator info\n\tPoint_Get_1\troot\t1 \ttable:p, handle:1 %s", i, "test.p") // Also make sure that the plan digest is not empty - tk.MustQuery(`select exec_count, plan, table_names - from information_schema.statements_summary - where digest_text like 'select b from p%' and plan_digest != ''`, - ).Check(testkit.Rows(expectedResult)) + sql = "select exec_count, plan, table_names from information_schema.statements_summary " + + "where digest_text like 'select `b` from `p`%' and plan_digest != ''" + tk.MustQuery(sql).Check(testkit.Rows(expectedResult)) } // Point get another database. tk.MustQuery("select variable_value from mysql.tidb where variable_name = 'system_tz'") - tk.MustQuery(`select table_names - from information_schema.statements_summary - where digest_text like 'select variable_value%' and schema_name='test'`, - ).Check(testkit.Rows("mysql.tidb")) + // Test for Encode plan cache. + p1 := tk.Se.GetSessionVars().StmtCtx.GetEncodedPlan() + c.Assert(len(p1) > 0, IsTrue) + rows := tk.MustQuery("select tidb_decode_plan('" + p1 + "');").Rows() + c.Assert(len(rows), Equals, 1) + c.Assert(len(rows[0]), Equals, 1) + c.Assert(rows[0][0], Matches, ".*\n.*Point_Get.*table.tidb, index.PRIMARY.VARIABLE_NAME.*") + + sql = "select table_names from information_schema.statements_summary " + + "where digest_text like 'select `variable_value`%' and `schema_name`='test'" + tk.MustQuery(sql).Check(testkit.Rows("mysql.tidb")) // Test `create database`. tk.MustExec("create database if not exists test") + // Test for Encode plan cache. + p2 := tk.Se.GetSessionVars().StmtCtx.GetEncodedPlan() + c.Assert(p2, Equals, "") tk.MustQuery(`select table_names from information_schema.statements_summary where digest_text like 'create database%' and schema_name='test'`, @@ -985,15 +1024,16 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { c.Assert(failpoint.Enable(failpointName, "return(100)"), IsNil) defer func() { c.Assert(failpoint.Disable(failpointName), IsNil) }() tk.MustQuery("select * from t where a=2") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text, plan - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ).Check(testkit.Rows("Select test test.t t:k 1 2 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10\troot \t100 \t\n" + - "\t├─IndexScan_8 \tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableScan_9 \tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 2 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) // select ... order by tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, @@ -1006,15 +1046,16 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { // Test different plans with same digest. c.Assert(failpoint.Enable(failpointName, "return(1000)"), IsNil) tk.MustQuery("select * from t where a=3") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text, plan - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ).Check(testkit.Rows("Select test test.t t:k 2 4 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10\troot \t100 \t\n" + - "\t├─IndexScan_8 \tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableScan_9 \tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows( + "Select test test.t t:k 2 4 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t100 \t\n" + + "\t├─IndexRangeScan_8\tcop[tikv]\t100 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9\tcop[tikv]\t100 \ttable:t, keep order:false, stats:pseudo")) // Disable it again. tk.MustExec("set global tidb_enable_stmt_summary = false") @@ -1042,12 +1083,12 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { tk.MustExec("begin") tk.MustExec("insert into t values(1, 'a')") tk.MustExec("commit") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text, prev_sample_text - from information_schema.statements_summary - where digest_text like 'insert into t%'`, - ).Check(testkit.Rows("Insert test test.t 1 0 0 0 0 0 0 0 0 0 1 insert into t values(1, 'a') ")) + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, prev_sample_text " + + "from information_schema.statements_summary " + + "where digest_text like 'insert into `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Insert test test.t 1 0 0 0 0 0 0 0 0 0 1 insert into t values(1, 'a') ")) tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, max_prewrite_regions, avg_affected_rows, query_sample_text, prev_sample_text @@ -1056,15 +1097,15 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { ).Check(testkit.Rows("Commit test 1 0 0 0 0 0 2 2 1 1 0 commit insert into t values(1, 'a')")) tk.MustQuery("select * from t where a=2") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text, plan - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ).Check(testkit.Rows("Select test test.t t:k 1 2 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10\troot \t1000 \t\n" + - "\t├─IndexScan_8 \tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableScan_9 \tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 1 2 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t1000 \t\n" + + "\t├─IndexRangeScan_8\tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9\tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) // Disable it in global scope. tk.MustExec("set global tidb_enable_stmt_summary = false") @@ -1075,15 +1116,15 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { tk.MustQuery("select * from t where a=2") // Statement summary is still enabled. - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text, plan - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ).Check(testkit.Rows("Select test test.t t:k 2 4 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + - "\tIndexLookUp_10\troot \t1000 \t\n" + - "\t├─IndexScan_8 \tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + - "\t└─TableScan_9 \tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) + sql = "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, " + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, " + + "max_prewrite_regions, avg_affected_rows, query_sample_text, plan " + + "from information_schema.statements_summary " + + "where digest_text like 'select * from `t`%'" + tk.MustQuery(sql).Check(testkit.Rows("Select test test.t t:k 2 4 0 0 0 0 0 0 0 0 0 select * from t where a=2 \tid \ttask \testRows\toperator info\n" + + "\tIndexLookUp_10 \troot \t1000 \t\n" + + "\t├─IndexRangeScan_8\tcop[tikv]\t1000 \ttable:t, index:k(a), range:[2,2], keep order:false, stats:pseudo\n" + + "\t└─TableRowIDScan_9\tcop[tikv]\t1000 \ttable:t, keep order:false, stats:pseudo")) // Unset session variable. tk.MustExec("set session tidb_enable_stmt_summary = ''") @@ -1112,16 +1153,10 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { AuthHostname: "%", }, nil, nil) tk.MustExec("select * from t where a=1") - result := tk.MustQuery(`select * - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ) + result := tk.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") // Super user can query all records. c.Assert(len(result.Rows()), Equals, 1) - result = tk.MustQuery(`select * - from information_schema.statements_summary_history - where digest_text like 'select * from t%'`, - ) + result = tk.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") c.Assert(len(result.Rows()), Equals, 1) tk.Se.Auth(&auth.UserIdentity{ Username: "test_user", @@ -1129,28 +1164,16 @@ func (s *testTableSuite) TestStmtSummaryTable(c *C) { AuthUsername: "test_user", AuthHostname: "localhost", }, nil, nil) - result = tk.MustQuery(`select * - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ) + result = tk.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") // Ordinary users can not see others' records c.Assert(len(result.Rows()), Equals, 0) - result = tk.MustQuery(`select * - from information_schema.statements_summary_history - where digest_text like 'select * from t%'`, - ) + result = tk.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") c.Assert(len(result.Rows()), Equals, 0) tk.MustExec("select * from t where a=1") - result = tk.MustQuery(`select * - from information_schema.statements_summary - where digest_text like 'select * from t%'`, - ) + result = tk.MustQuery("select * from information_schema.statements_summary where digest_text like 'select * from `t`%'") c.Assert(len(result.Rows()), Equals, 1) tk.MustExec("select * from t where a=1") - result = tk.MustQuery(`select * - from information_schema.statements_summary_history - where digest_text like 'select * from t%'`, - ) + result = tk.MustQuery("select * from information_schema.statements_summary_history where digest_text like 'select * from `t`%'") c.Assert(len(result.Rows()), Equals, 1) // use root user to set variables back tk.Se.Auth(&auth.UserIdentity{ @@ -1174,7 +1197,7 @@ func (s *testTableSuite) TestIssue18845(c *C) { } // Test statements_summary_history. -func (s *testTableSuite) TestStmtSummaryHistoryTable(c *C) { +func (s *testClusterTableSuite) TestStmtSummaryHistoryTable(c *C) { tk := s.newTestKitWithRoot(c) tk.MustExec("drop table if exists test_summary") tk.MustExec("create table test_summary(a int, b varchar(10), key k(a))") @@ -1196,12 +1219,13 @@ func (s *testTableSuite) TestStmtSummaryHistoryTable(c *C) { tk.MustExec("insert into test_summary values(2, 'b')") tk.MustExec("insert into TEST_SUMMARY VALUES(3, 'c')") tk.MustExec("/**/insert into test_summary values(4, 'd')") - tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, - max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions, - max_prewrite_regions, avg_affected_rows, query_sample_text - from information_schema.statements_summary_history - where digest_text like 'insert into test_summary%'`, - ).Check(testkit.Rows("Insert test test.test_summary 4 0 0 0 0 0 2 2 1 1 1 insert into test_summary values(1, 'a')")) + + sql := "select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys," + + "max_total_keys, avg_processed_keys, max_processed_keys, avg_write_keys, max_write_keys, avg_prewrite_regions," + + "max_prewrite_regions, avg_affected_rows, query_sample_text " + + "from information_schema.statements_summary_history " + + "where digest_text like 'insert into `test_summary`%'" + tk.MustQuery(sql).Check(testkit.Rows("Insert test test.test_summary 4 0 0 0 0 0 2 2 1 1 1 insert into test_summary values(1, 'a')")) tk.MustExec("set global tidb_stmt_summary_history_size = 0") tk.MustQuery(`select stmt_type, schema_name, table_names, index_names, exec_count, sum_cop_task_num, avg_total_keys, @@ -1209,6 +1233,20 @@ func (s *testTableSuite) TestStmtSummaryHistoryTable(c *C) { max_prewrite_regions, avg_affected_rows, query_sample_text, plan from information_schema.statements_summary_history`, ).Check(testkit.Rows()) + + tk.MustExec("set global tidb_enable_stmt_summary = 0") + tk.MustExec("drop table if exists `table`") + tk.MustExec("set global tidb_stmt_summary_history_size = 1") + tk.MustExec("set global tidb_enable_stmt_summary = 1") + tk.MustExec("create table `table`(`insert` int)") + tk.MustExec("select `insert` from `table`") + + sql = "select digest_text from information_schema.statements_summary_history;" + tk.MustQuery(sql).Check(testkit.Rows( + "select `insert` from `table`", + "create table `table` ( `insert` int )", + "set global `tidb_enable_stmt_summary` = ?", + )) } // Test statements_summary_history. @@ -1251,11 +1289,17 @@ func (s *testTableSuite) TestStmtSummaryInternalQuery(c *C) { tk.MustExec("admin evolve bindings") // `exec_count` may be bigger than 1 because other cases are also running. - tk.MustQuery(`select digest_text - from information_schema.statements_summary - where digest_text like "select original_sql , bind_sql , default_db , status%"`).Check(testkit.Rows( - "select original_sql , bind_sql , default_db , status , create_time , update_time , charset , collation , source from mysql . bind_info" + - " where update_time > ? order by update_time")) + sql := "select digest_text " + + "from information_schema.statements_summary " + + "where digest_text like \"select `original_sql` , `bind_sql` , `default_db` , status%\"" + tk.MustQuery(sql).Check(testkit.Rows( + "select `original_sql` , `bind_sql` , `default_db` , status , `create_time` , `update_time` , charset , " + + "collation , source from `mysql` . `bind_info` where `update_time` > ? order by `update_time`")) + + // Test for issue #21642. + tk.MustQuery(`select tidb_version()`) + rows := tk.MustQuery("select plan from information_schema.statements_summary where digest_text like \"select `tidb_version`%\"").Rows() + c.Assert(strings.Contains(rows[0][0].(string), "Projection"), IsTrue) } // Test error count and warning count. @@ -1273,14 +1317,12 @@ func (s *testTableSuite) TestStmtSummaryErrorCount(c *C) { _, err := tk.Exec("insert into stmt_summary_test values(1)") c.Assert(err, NotNil) - tk.MustQuery(`select exec_count, sum_errors, sum_warnings - from information_schema.statements_summary - where digest_text like "insert into stmt_summary_test%"`).Check(testkit.Rows("2 1 0")) + sql := "select exec_count, sum_errors, sum_warnings from information_schema.statements_summary where digest_text like \"insert into `stmt_summary_test`%\"" + tk.MustQuery(sql).Check(testkit.Rows("2 1 0")) tk.MustExec("insert ignore into stmt_summary_test values(1)") - tk.MustQuery(`select exec_count, sum_errors, sum_warnings - from information_schema.statements_summary - where digest_text like "insert ignore into stmt_summary_test%"`).Check(testkit.Rows("1 0 1")) + sql = "select exec_count, sum_errors, sum_warnings from information_schema.statements_summary where digest_text like \"insert ignore into `stmt_summary_test`%\"" + tk.MustQuery(sql).Check(testkit.Rows("1 0 1")) } func (s *testTableSuite) TestStmtSummaryPreparedStatements(c *C) { @@ -1339,11 +1381,121 @@ func (s *testTableSuite) TestPerformanceSchemaforPlanCache(c *C) { tk.MustExec("create table t(a int)") tk.MustExec("prepare stmt from 'select * from t'") tk.MustExec("execute stmt") - tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from t'").Check( + tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( testkit.Rows("0 0")) tk.MustExec("execute stmt") tk.MustExec("execute stmt") tk.MustExec("execute stmt") - tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from t'").Check( + tk.MustQuery("select plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( testkit.Rows("3 1")) } + +func (s *testTableSuite) TestServerInfoResolveLoopBackAddr(c *C) { + nodes := []infoschema.ServerInfo{ + {Address: "127.0.0.1:4000", StatusAddr: "192.168.130.22:10080"}, + {Address: "0.0.0.0:4000", StatusAddr: "192.168.130.22:10080"}, + {Address: "localhost:4000", StatusAddr: "192.168.130.22:10080"}, + {Address: "192.168.130.22:4000", StatusAddr: "0.0.0.0:10080"}, + {Address: "192.168.130.22:4000", StatusAddr: "127.0.0.1:10080"}, + {Address: "192.168.130.22:4000", StatusAddr: "localhost:10080"}, + } + for i := range nodes { + nodes[i].ResolveLoopBackAddr() + } + for _, n := range nodes { + c.Assert(n.Address, Equals, "192.168.130.22:4000") + c.Assert(n.StatusAddr, Equals, "192.168.130.22:10080") + } +} + +func (s *testTableSuite) TestPlacementPolicy(c *C) { + tk := s.newTestKitWithRoot(c) + tk.MustExec("use test") + tk.MustExec("create table test_placement(id int primary key) partition by hash(id) partitions 2") + + is := s.dom.InfoSchema() + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("test_placement")) + c.Assert(err, IsNil) + partDefs := tb.Meta().GetPartitionInfo().Definitions + + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows()) + + bundleID := "pd" + is.SetBundle(&placement.Bundle{ + ID: bundleID, + Rules: []*placement.Rule{ + { + GroupID: bundleID, + ID: "default", + Role: "voter", + Count: 3, + }, + }, + }) + tk.MustQuery("select * from information_schema.placement_policy").Check(testkit.Rows()) + + bundleID = fmt.Sprintf("%s%d", placement.BundleIDPrefix, partDefs[0].ID) + bundle := &placement.Bundle{ + ID: bundleID, + Index: 3, + Override: true, + Rules: []*placement.Rule{ + { + GroupID: bundleID, + ID: "0", + Role: "voter", + Count: 3, + LabelConstraints: []placement.LabelConstraint{ + { + Key: "zone", + Op: "in", + Values: []string{"bj"}, + }, + }, + }, + }, + } + is.SetBundle(bundle) + expected := fmt.Sprintf(`%s 3 0 test test_placement p0 voter 3 "+zone=bj"`, bundleID) + tk.MustQuery(`select group_id, group_index, rule_id, schema_name, table_name, partition_name, index_name, + role, replicas, constraints from information_schema.placement_policy`).Check(testkit.Rows(expected)) + + rule1 := bundle.Rules[0].Clone() + rule1.ID = "1" + bundle.Rules = append(bundle.Rules, rule1) + tk.MustQuery("select rule_id, schema_name, table_name, partition_name from information_schema.placement_policy order by rule_id").Check(testkit.Rows( + "0 test test_placement p0", "1 test test_placement p0")) + + bundleID = fmt.Sprintf("%s%d", placement.BundleIDPrefix, partDefs[1].ID) + bundle1 := bundle.Clone() + bundle1.ID = bundleID + bundle1.Rules[0].GroupID = bundleID + bundle1.Rules[1].GroupID = bundleID + is.SetBundle(bundle1) + tk.MustQuery("select rule_id, schema_name, table_name, partition_name from information_schema.placement_policy order by partition_name, rule_id").Check(testkit.Rows( + "0 test test_placement p0", "1 test test_placement p0", "0 test test_placement p1", "1 test test_placement p1")) +} + +func (s *testTableSuite) TestInfoschemaClientErrors(c *C) { + tk := s.newTestKitWithRoot(c) + + tk.MustExec("FLUSH CLIENT_ERRORS_SUMMARY") + + errno.IncrementError(1365, "root", "localhost") + errno.IncrementError(1365, "infoschematest", "localhost") + errno.IncrementError(1365, "root", "localhost") + + tk.MustExec("CREATE USER 'infoschematest'@'localhost'") + c.Assert(tk.Se.Auth(&auth.UserIdentity{Username: "infoschematest", Hostname: "localhost"}, nil, nil), IsTrue) + + err := tk.QueryToErr("SELECT * FROM information_schema.client_errors_summary_global") + c.Assert(err.Error(), Equals, "[planner:1227]Access denied; you need (at least one of) the PROCESS privilege(s) for this operation") + + err = tk.QueryToErr("SELECT * FROM information_schema.client_errors_summary_by_host") + c.Assert(err.Error(), Equals, "[planner:1227]Access denied; you need (at least one of) the PROCESS privilege(s) for this operation") + + tk.MustQuery("SELECT error_number, error_count, warning_count FROM information_schema.client_errors_summary_by_user ORDER BY error_number").Check(testkit.Rows("1365 1 0")) + + err = tk.ExecToErr("FLUSH CLIENT_ERRORS_SUMMARY") + c.Assert(err.Error(), Equals, "[planner:1227]Access denied; you need (at least one of) the RELOAD privilege(s) for this operation") +} diff --git a/kv/cachedb.go b/kv/cachedb.go new file mode 100644 index 0000000000000..c5ca2ded60b8e --- /dev/null +++ b/kv/cachedb.go @@ -0,0 +1,98 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package kv + +import ( + "context" + "sync" + + "github.com/coocood/freecache" +) + +type ( + cacheDB struct { + mu sync.RWMutex + memTables map[int64]*freecache.Cache + } + + // MemManager adds a cache between transaction buffer and the storage to reduce requests to the storage. + // Beware, it uses table ID for partition tables, because the keys are unique for partition tables. + // no matter the physical IDs are the same or not. + MemManager interface { + // UnionGet gets the value from cacheDB first, if it not exists, + // it gets the value from the snapshot, then caches the value in cacheDB. + UnionGet(ctx context.Context, tid int64, snapshot Snapshot, key Key) ([]byte, error) + // Delete releases the cache by tableID. + Delete(tableID int64) + } +) + +// Set set the key/value in cacheDB. +func (c *cacheDB) set(tableID int64, key Key, value []byte) error { + c.mu.Lock() + defer c.mu.Unlock() + table, ok := c.memTables[tableID] + if !ok { + table = freecache.NewCache(100 * 1024 * 1024) + c.memTables[tableID] = table + } + return table.Set(key, value, 0) +} + +// Get gets the value from cacheDB. +func (c *cacheDB) get(tableID int64, key Key) []byte { + c.mu.RLock() + defer c.mu.RUnlock() + if table, ok := c.memTables[tableID]; ok { + if val, err := table.Get(key); err == nil { + return val + } + } + return nil +} + +// UnionGet implements MemManager UnionGet interface. +func (c *cacheDB) UnionGet(ctx context.Context, tid int64, snapshot Snapshot, key Key) (val []byte, err error) { + val = c.get(tid, key) + // key does not exist then get from snapshot and set to cache + if val == nil { + val, err = snapshot.Get(ctx, key) + if err != nil { + return nil, err + } + + err = c.set(tid, key, val) + if err != nil { + return nil, err + } + } + return val, nil +} + +// Delete delete and reset table from tables in cacheDB by tableID +func (c *cacheDB) Delete(tableID int64) { + c.mu.Lock() + if k, ok := c.memTables[tableID]; ok { + k.Clear() + delete(c.memTables, tableID) + } + c.mu.Unlock() +} + +// NewCacheDB news the cacheDB. +func NewCacheDB() MemManager { + mm := new(cacheDB) + mm.memTables = make(map[int64]*freecache.Cache) + return mm +} diff --git a/kv/error.go b/kv/error.go index c36dd89c0adbe..32c76e3bfa8d8 100644 --- a/kv/error.go +++ b/kv/error.go @@ -16,9 +16,9 @@ package kv import ( "strings" - "github.com/pingcap/parser/terror" + pmysql "github.com/pingcap/parser/mysql" mysql "github.com/pingcap/tidb/errno" - "github.com/pingcap/tidb/util/redact" + "github.com/pingcap/tidb/util/dbterror" ) // TxnRetryableMark is used to uniform the commit error messages which could retry the transaction. @@ -27,30 +27,30 @@ const TxnRetryableMark = "[try again later]" var ( // ErrNotExist is used when try to get an entry with an unexist key from KV store. - ErrNotExist = terror.ClassKV.New(mysql.ErrNotExist, mysql.MySQLErrName[mysql.ErrNotExist]) + ErrNotExist = dbterror.ClassKV.NewStd(mysql.ErrNotExist) // ErrTxnRetryable is used when KV store occurs retryable error which SQL layer can safely retry the transaction. // When using TiKV as the storage node, the error is returned ONLY when lock not found (txnLockNotFound) in Commit, // subject to change it in the future. - ErrTxnRetryable = terror.ClassKV.New(mysql.ErrTxnRetryable, - mysql.MySQLErrName[mysql.ErrTxnRetryable]+TxnRetryableMark) + ErrTxnRetryable = dbterror.ClassKV.NewStdErr(mysql.ErrTxnRetryable, + pmysql.Message(mysql.MySQLErrName[mysql.ErrTxnRetryable].Raw+TxnRetryableMark, []int{0})) // ErrCannotSetNilValue is the error when sets an empty value. - ErrCannotSetNilValue = terror.ClassKV.New(mysql.ErrCannotSetNilValue, mysql.MySQLErrName[mysql.ErrCannotSetNilValue]) + ErrCannotSetNilValue = dbterror.ClassKV.NewStd(mysql.ErrCannotSetNilValue) // ErrInvalidTxn is the error when commits or rollbacks in an invalid transaction. - ErrInvalidTxn = terror.ClassKV.New(mysql.ErrInvalidTxn, mysql.MySQLErrName[mysql.ErrInvalidTxn]) + ErrInvalidTxn = dbterror.ClassKV.NewStd(mysql.ErrInvalidTxn) // ErrTxnTooLarge is the error when transaction is too large, lock time reached the maximum value. - ErrTxnTooLarge = terror.ClassKV.New(mysql.ErrTxnTooLarge, mysql.MySQLErrName[mysql.ErrTxnTooLarge]) + ErrTxnTooLarge = dbterror.ClassKV.NewStd(mysql.ErrTxnTooLarge) // ErrEntryTooLarge is the error when a key value entry is too large. - ErrEntryTooLarge = terror.ClassKV.New(mysql.ErrEntryTooLarge, mysql.MySQLErrName[mysql.ErrEntryTooLarge]) + ErrEntryTooLarge = dbterror.ClassKV.NewStd(mysql.ErrEntryTooLarge) // ErrKeyExists returns when key is already exist. - ErrKeyExists = redact.NewRedactError(terror.ClassKV.New(mysql.ErrDupEntry, mysql.MySQLErrName[mysql.ErrDupEntry]), 0, 1) + ErrKeyExists = dbterror.ClassKV.NewStd(mysql.ErrDupEntry) // ErrNotImplemented returns when a function is not implemented yet. - ErrNotImplemented = terror.ClassKV.New(mysql.ErrNotImplemented, mysql.MySQLErrName[mysql.ErrNotImplemented]) + ErrNotImplemented = dbterror.ClassKV.NewStd(mysql.ErrNotImplemented) // ErrWriteConflict is the error when the commit meets an write conflict error. - ErrWriteConflict = terror.ClassKV.New(mysql.ErrWriteConflict, - mysql.MySQLErrName[mysql.ErrWriteConflict]+" "+TxnRetryableMark) + ErrWriteConflict = dbterror.ClassKV.NewStdErr(mysql.ErrWriteConflict, + pmysql.Message(mysql.MySQLErrName[mysql.ErrWriteConflict].Raw+" "+TxnRetryableMark, []int{3})) // ErrWriteConflictInTiDB is the error when the commit meets an write conflict error when local latch is enabled. - ErrWriteConflictInTiDB = terror.ClassKV.New(mysql.ErrWriteConflictInTiDB, - mysql.MySQLErrName[mysql.ErrWriteConflictInTiDB]+" "+TxnRetryableMark) + ErrWriteConflictInTiDB = dbterror.ClassKV.NewStdErr(mysql.ErrWriteConflictInTiDB, + pmysql.Message(mysql.MySQLErrName[mysql.ErrWriteConflictInTiDB].Raw+" "+TxnRetryableMark, nil)) ) // IsTxnRetryableError checks if the error could safely retry the transaction. diff --git a/kv/fault_injection.go b/kv/fault_injection.go index ca187d36bb190..218ca9cbd6966 100644 --- a/kv/fault_injection.go +++ b/kv/fault_injection.go @@ -63,9 +63,9 @@ func (s *InjectedStore) Begin() (Transaction, error) { }, err } -// BeginWithStartTS creates an injected Transaction with startTS. -func (s *InjectedStore) BeginWithStartTS(startTS uint64) (Transaction, error) { - txn, err := s.Storage.BeginWithStartTS(startTS) +// BeginWithOption creates an injected Transaction with given option. +func (s *InjectedStore) BeginWithOption(option TransactionOption) (Transaction, error) { + txn, err := s.Storage.BeginWithOption(option) return &InjectedTransaction{ Transaction: txn, cfg: s.cfg, @@ -73,12 +73,12 @@ func (s *InjectedStore) BeginWithStartTS(startTS uint64) (Transaction, error) { } // GetSnapshot creates an injected Snapshot. -func (s *InjectedStore) GetSnapshot(ver Version) (Snapshot, error) { - snapshot, err := s.Storage.GetSnapshot(ver) +func (s *InjectedStore) GetSnapshot(ver Version) Snapshot { + snapshot := s.Storage.GetSnapshot(ver) return &InjectedSnapshot{ Snapshot: snapshot, cfg: s.cfg, - }, err + } } // InjectedTransaction wraps a Transaction with injections. diff --git a/kv/fault_injection_test.go b/kv/fault_injection_test.go index 004664d5bfede..33b6535214b2c 100644 --- a/kv/fault_injection_test.go +++ b/kv/fault_injection_test.go @@ -19,6 +19,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/store/tikv/oracle" ) type testFaultInjectionSuite struct{} @@ -34,11 +35,10 @@ func (s testFaultInjectionSuite) TestFaultInjectionBasic(c *C) { storage := NewInjectedStore(newMockStorage(), &cfg) txn, err := storage.Begin() c.Assert(err, IsNil) - _, err = storage.BeginWithStartTS(0) + _, err = storage.BeginWithOption(TransactionOption{}.SetTxnScope(oracle.GlobalTxnScope).SetStartTs(0)) c.Assert(err, IsNil) ver := Version{Ver: 1} - snap, err := storage.GetSnapshot(ver) - c.Assert(err, IsNil) + snap := storage.GetSnapshot(ver) b, err := txn.Get(context.TODO(), []byte{'a'}) c.Assert(err.Error(), Equals, err1.Error()) c.Assert(b, IsNil) @@ -63,8 +63,7 @@ func (s testFaultInjectionSuite) TestFaultInjectionBasic(c *C) { storage = NewInjectedStore(newMockStorage(), &cfg) txn, err = storage.Begin() c.Assert(err, IsNil) - snap, err = storage.GetSnapshot(ver) - c.Assert(err, IsNil) + snap = storage.GetSnapshot(ver) b, err = txn.Get(context.TODO(), []byte{'a'}) c.Assert(err, IsNil) diff --git a/kv/interface_mock_test.go b/kv/interface_mock_test.go index 33fc7e7287a92..9ca599e262727 100644 --- a/kv/interface_mock_test.go +++ b/kv/interface_mock_test.go @@ -16,6 +16,7 @@ package kv import ( "context" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/store/tikv/oracle" ) @@ -133,6 +134,14 @@ func (t *mockTxn) GetVars() *Variables { return nil } +func (t *mockTxn) CacheTableInfo(id int64, info *model.TableInfo) { + +} + +func (t *mockTxn) GetTableInfo(id int64) *model.TableInfo { + return nil +} + // newMockTxn new a mockTxn. func newMockTxn() Transaction { return &mockTxn{ @@ -149,19 +158,18 @@ func (s *mockStorage) Begin() (Transaction, error) { return newMockTxn(), nil } -func (*mockTxn) IsPessimistic() bool { - return false +func (s *mockStorage) BeginWithOption(option TransactionOption) (Transaction, error) { + return newMockTxn(), nil } -// BeginWithStartTS begins a transaction with startTS. -func (s *mockStorage) BeginWithStartTS(startTS uint64) (Transaction, error) { - return s.Begin() +func (*mockTxn) IsPessimistic() bool { + return false } -func (s *mockStorage) GetSnapshot(ver Version) (Snapshot, error) { +func (s *mockStorage) GetSnapshot(ver Version) Snapshot { return &mockSnapshot{ store: newMemDB(), - }, nil + } } func (s *mockStorage) Close() error { @@ -173,7 +181,7 @@ func (s *mockStorage) UUID() string { } // CurrentVersion returns current max committed version. -func (s *mockStorage) CurrentVersion() (Version, error) { +func (s *mockStorage) CurrentVersion(txnScope string) (Version, error) { return NewVersion(1), nil } @@ -181,6 +189,10 @@ func (s *mockStorage) GetClient() Client { return nil } +func (s *mockStorage) GetMPPClient() MPPClient { + return nil +} + func (s *mockStorage) GetOracle() oracle.Oracle { return nil } @@ -201,6 +213,10 @@ func (s *mockStorage) ShowStatus(ctx context.Context, key string) (interface{}, return nil, nil } +func (s *mockStorage) GetMemCache() MemManager { + return nil +} + // newMockStorage creates a new mockStorage. func newMockStorage() Storage { return &mockStorage{} diff --git a/kv/key.go b/kv/key.go index 53eacf05a8a3d..8fdf57a169b84 100644 --- a/kv/key.go +++ b/kv/key.go @@ -20,7 +20,6 @@ import ( "strconv" "strings" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" ) @@ -413,23 +412,6 @@ func (m *HandleMap) Range(fn func(h Handle, val interface{}) bool) { } } -// BuildHandleFromDatumRow builds kv.Handle from cols in row. -func BuildHandleFromDatumRow(sctx *stmtctx.StatementContext, row []types.Datum, handleOrdinals []int) (Handle, error) { - pkDts := make([]types.Datum, 0, len(handleOrdinals)) - for _, ordinal := range handleOrdinals { - pkDts = append(pkDts, row[ordinal]) - } - handleBytes, err := codec.EncodeKey(sctx, nil, pkDts...) - if err != nil { - return nil, err - } - handle, err := NewCommonHandle(handleBytes) - if err != nil { - return nil, err - } - return handle, nil -} - // PartitionHandle combines a handle and a PartitionID, used to location a row in partioned table. // Now only used in global index. // TODO: support PartitionHandle in HandleMap. diff --git a/kv/kv.go b/kv/kv.go index eb8d9dfdf84b4..bcebff808ca1f 100644 --- a/kv/kv.go +++ b/kv/kv.go @@ -15,9 +15,12 @@ package kv import ( "context" + "crypto/tls" "sync" "time" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/model" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util/execdetails" @@ -58,6 +61,18 @@ const ( SampleStep // CommitHook is a callback function called right after the transaction gets committed CommitHook + // EnableAsyncCommit indicates whether async commit is enabled + EnableAsyncCommit + // Enable1PC indicates whether one-phase commit is enabled + Enable1PC + // GuaranteeLinearizability indicates whether to guarantee linearizability at the cost of an extra tso request before prewrite + GuaranteeLinearizability + // TxnScope indicates which @@txn_scope this transaction will work with. + TxnScope + // StalenessReadOnly indicates whether the transaction is staleness read only transaction + IsStalenessReadOnly + // MatchStoreLabels indicates the labels the store should be matched + MatchStoreLabels ) // Priority value for transaction priority. @@ -170,6 +185,7 @@ type MemBufferIterator interface { HasValue() bool Flags() KeyFlags UpdateFlags(...FlagsOp) + Handle() MemKeyHandle } // MemBuffer is an in-memory kv collection, can be used to buffer write operations. @@ -194,6 +210,11 @@ type MemBuffer interface { SetWithFlags(Key, []byte, ...FlagsOp) error // UpdateFlags update the flags associated with key. UpdateFlags(Key, ...FlagsOp) + // DeleteWithFlags delete key with the given KeyFlags + DeleteWithFlags(Key, ...FlagsOp) error + + GetKeyByHandle(MemKeyHandle) []byte + GetValueByHandle(MemKeyHandle) ([]byte, bool) // Reset reset the MemBuffer to initial states. Reset() @@ -249,6 +270,8 @@ type Transaction interface { // SetOption sets an option with a value, when val is nil, uses the default // value of this option. SetOption(opt Option, val interface{}) + // GetOption returns the option + GetOption(opt Option) interface{} // DelOption deletes an option. DelOption(opt Option) // IsReadOnly checks if the transaction has only performed read operations. @@ -273,6 +296,12 @@ type Transaction interface { // If a key doesn't exist, there shouldn't be any corresponding entry in the result map. BatchGet(ctx context.Context, keys []Key) (map[string][]byte, error) IsPessimistic() bool + // CacheIndexName caches the index name. + // PresumeKeyNotExists will use this to help decode error message. + CacheTableInfo(id int64, info *model.TableInfo) + // GetIndexName returns the cached index name. + // If there is no such index already inserted through CacheIndexName, it will return UNKNOWN. + GetTableInfo(id int64) *model.TableInfo } // LockCtx contains information for LockKeys method. @@ -300,7 +329,7 @@ type ReturnedValue struct { // Client is used to send request to KV layer. type Client interface { // Send sends request to KV layer, returns a Response. - Send(ctx context.Context, req *Request, vars *Variables, sessionMemTracker *memory.Tracker) Response + Send(ctx context.Context, req *Request, vars *Variables, sessionMemTracker *memory.Tracker, enabledRateLimitAction bool) Response // IsRequestTypeSupported checks if reqType and subType is supported. IsRequestTypeSupported(reqType, subType int64) bool @@ -390,6 +419,12 @@ type Request struct { BatchCop bool // TaskID is an unique ID for an execution of a statement TaskID uint64 + // TiDBServerID is the specified TiDB serverID to execute request. `0` means all TiDB instances. + TiDBServerID uint64 + // IsStaleness indicates whether the request read staleness data + IsStaleness bool + // MatchStoreLabels indicates the labels the store should be matched + MatchStoreLabels []*metapb.StoreLabel } // ResultSubset represents a result subset from a single storage unit. @@ -439,24 +474,51 @@ type Driver interface { Open(path string) (Storage, error) } +// TransactionOption indicates the option when beginning a transaction +type TransactionOption struct { + TxnScope string + StartTS *uint64 + PrevSec *uint64 +} + +// SetStartTs set startTS +func (to TransactionOption) SetStartTs(startTS uint64) TransactionOption { + to.StartTS = &startTS + return to +} + +// SetPrevSec set prevSec +func (to TransactionOption) SetPrevSec(prevSec uint64) TransactionOption { + to.PrevSec = &prevSec + return to +} + +// SetTxnScope set txnScope +func (to TransactionOption) SetTxnScope(txnScope string) TransactionOption { + to.TxnScope = txnScope + return to +} + // Storage defines the interface for storage. // Isolation should be at least SI(SNAPSHOT ISOLATION) type Storage interface { - // Begin transaction + // Begin a global transaction Begin() (Transaction, error) - // BeginWithStartTS begins transaction with startTS. - BeginWithStartTS(startTS uint64) (Transaction, error) + // Begin a transaction with given option + BeginWithOption(option TransactionOption) (Transaction, error) // GetSnapshot gets a snapshot that is able to read any data which data is <= ver. // if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. - GetSnapshot(ver Version) (Snapshot, error) + GetSnapshot(ver Version) Snapshot // GetClient gets a client instance. GetClient() Client + // GetMPPClient gets a mpp client instance. + GetMPPClient() MPPClient // Close store Close() error // UUID return a unique ID which represents a Storage. UUID() string - // CurrentVersion returns current max committed version. - CurrentVersion() (Version, error) + // CurrentVersion returns current max committed version with the given txnScope (local or global). + CurrentVersion(txnScope string) (Version, error) // GetOracle gets a timestamp oracle client. GetOracle() oracle.Oracle // SupportDeleteRange gets the storage support delete range or not. @@ -467,6 +529,15 @@ type Storage interface { Describe() string // ShowStatus returns the specified status of the storage ShowStatus(ctx context.Context, key string) (interface{}, error) + // GetMemCache return memory manager of the storage. + GetMemCache() MemManager +} + +// EtcdBackend is used for judging a storage is a real TiKV. +type EtcdBackend interface { + EtcdAddrs() ([]string, error) + TLSConfig() *tls.Config + StartGCWorker() error } // FnKeyCmp is the function for iterator the keys diff --git a/kv/memdb.go b/kv/memdb.go index c00822d8b7c51..5e972bf904856 100644 --- a/kv/memdb.go +++ b/kv/memdb.go @@ -25,6 +25,7 @@ import ( const ( flagPresumeKNE KeyFlags = 1 << iota flagKeyLocked + flagNeedLocked flagKeyLockedValExist flagNeedCheckExists flagPrewriteOnly @@ -49,6 +50,11 @@ func (f KeyFlags) HasLocked() bool { return f&flagKeyLocked != 0 } +// HasNeedLocked return whether the key needed to be locked +func (f KeyFlags) HasNeedLocked() bool { + return f&flagNeedLocked != 0 +} + // HasLockedValueExists returns whether the value exists when key locked. func (f KeyFlags) HasLockedValueExists() bool { return f&flagKeyLockedValExist != 0 @@ -82,6 +88,10 @@ const ( SetKeyLocked // DelKeyLocked reverts SetKeyLocked. DelKeyLocked + // SetNeedLocked marks the associated key need to be acquired lock. + SetNeedLocked + // DelNeedLocked reverts SetKeyNeedLocked. + DelNeedLocked // SetKeyLockedValueExists marks the value exists when key has been locked in Transaction.LockKeys. SetKeyLockedValueExists // SetKeyLockedValueNotExists marks the value doesn't exists when key has been locked in Transaction.LockKeys. @@ -105,6 +115,10 @@ func applyFlagsOps(origin KeyFlags, ops ...FlagsOp) KeyFlags { origin |= flagKeyLocked case DelKeyLocked: origin &= ^flagKeyLocked + case SetNeedLocked: + origin |= flagNeedLocked + case DelNeedLocked: + origin &= ^flagNeedLocked case SetKeyLockedValueExists: origin |= flagKeyLockedValExist case DelNeedCheckExists: @@ -125,6 +139,18 @@ var tombstone = []byte{} // IsTombstone returns whether the value is a tombstone. func IsTombstone(val []byte) bool { return len(val) == 0 } +// MemKeyHandle represents a pointer for key in MemBuffer. +type MemKeyHandle struct { + // Opaque user data + UserData uint16 + idx uint16 + off uint32 +} + +func (h MemKeyHandle) toAddr() memdbArenaAddr { + return memdbArenaAddr{idx: uint32(h.idx), off: h.off} +} + // memdb is rollbackable Red-Black Tree optimized for TiDB's transaction states buffer use scenario. // You can think memdb is a combination of two separate tree map, one for key => value and another for key => keyFlags. // @@ -299,6 +325,26 @@ func (db *memdb) Delete(key Key) error { return db.set(key, tombstone) } +func (db *memdb) DeleteWithFlags(key Key, ops ...FlagsOp) error { + return db.set(key, tombstone, ops...) +} + +func (db *memdb) GetKeyByHandle(handle MemKeyHandle) []byte { + x := db.getNode(handle.toAddr()) + return x.getKey() +} + +func (db *memdb) GetValueByHandle(handle MemKeyHandle) ([]byte, bool) { + if db.vlogInvalid { + return nil, false + } + x := db.getNode(handle.toAddr()) + if x.vptr.isNull() { + return nil, false + } + return db.vlog.getValue(x.vptr), true +} + func (db *memdb) Len() int { return db.count } diff --git a/kv/memdb_iterator.go b/kv/memdb_iterator.go index 77d32d9276623..b89c8197331e1 100644 --- a/kv/memdb_iterator.go +++ b/kv/memdb_iterator.go @@ -112,6 +112,13 @@ func (i *memdbIterator) Key() Key { return i.curr.getKey() } +func (i *memdbIterator) Handle() MemKeyHandle { + return MemKeyHandle{ + idx: uint16(i.curr.addr.idx), + off: i.curr.addr.off, + } +} + func (i *memdbIterator) Value() []byte { return i.db.vlog.getValue(i.curr.vptr) } diff --git a/kv/mock_test.go b/kv/mock_test.go index 52d972263fcbc..f95640c1caf80 100644 --- a/kv/mock_test.go +++ b/kv/mock_test.go @@ -17,6 +17,7 @@ import ( "context" . "github.com/pingcap/check" + "github.com/pingcap/tidb/store/tikv/oracle" ) var _ = Suite(testMockSuite{}) @@ -28,10 +29,9 @@ func (s testMockSuite) TestInterface(c *C) { storage := newMockStorage() storage.GetClient() storage.UUID() - version, err := storage.CurrentVersion() - c.Check(err, IsNil) - snapshot, err := storage.GetSnapshot(version) + version, err := storage.CurrentVersion(oracle.GlobalTxnScope) c.Check(err, IsNil) + snapshot := storage.GetSnapshot(version) _, err = snapshot.BatchGet(context.Background(), []Key{Key("abc"), Key("def")}) c.Check(err, IsNil) snapshot.SetOption(Priority, PriorityNormal) @@ -80,7 +80,7 @@ func (s testMockSuite) TestInterface(c *C) { c.Assert(storage.Describe(), Equals, "KVMockStorage is a mock Store implementation, only for unittests in KV package") c.Assert(storage.SupportDeleteRange(), IsFalse) - status, err := storage.ShowStatus(nil, "") + status, err := storage.ShowStatus(context.Background(), "") c.Assert(status, IsNil) c.Assert(err, IsNil) diff --git a/kv/mpp.go b/kv/mpp.go new file mode 100644 index 0000000000000..df38894d0c5d1 --- /dev/null +++ b/kv/mpp.go @@ -0,0 +1,90 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package kv + +import ( + "context" + + "github.com/pingcap/kvproto/pkg/mpp" +) + +// MPPTaskMeta means the meta info such as location of a mpp task. +type MPPTaskMeta interface { + // GetAddress indicates which node this task should execute on. + GetAddress() string +} + +// MPPTask means the minimum execution unit of a mpp computation job. +type MPPTask struct { + Meta MPPTaskMeta // on which store this task will execute + ID int64 // mppTaskID + StartTs uint64 + TableID int64 // physical table id +} + +// ToPB generates the pb structure. +func (t *MPPTask) ToPB() *mpp.TaskMeta { + meta := &mpp.TaskMeta{ + StartTs: t.StartTs, + TaskId: t.ID, + } + if t.ID != -1 { + meta.Address = t.Meta.GetAddress() + } + return meta +} + +//MppTaskStates denotes the state of mpp tasks +type MppTaskStates uint8 + +const ( + // MppTaskReady means the task is ready + MppTaskReady MppTaskStates = iota + // MppTaskRunning means the task is running + MppTaskRunning + // MppTaskCancelled means the task is cancelled + MppTaskCancelled + // MppTaskDone means the task is done + MppTaskDone +) + +// MPPDispatchRequest stands for a dispatching task. +type MPPDispatchRequest struct { + Data []byte // data encodes the dag coprocessor request. + Meta MPPTaskMeta // mpp store is the location of tiflash store. + IsRoot bool // root task returns data to tidb directly. + Timeout uint64 // If task is assigned but doesn't receive a connect request during timeout, the task should be destroyed. + // SchemaVer is for any schema-ful storage (like tiflash) to validate schema correctness if necessary. + SchemaVar int64 + StartTs uint64 + ID int64 // identify a single task + State MppTaskStates +} + +// MPPClient accepts and processes mpp requests. +type MPPClient interface { + // ConstructMPPTasks schedules task for a plan fragment. + // TODO:: This interface will be refined after we support more executors. + ConstructMPPTasks(context.Context, *MPPBuildTasksRequest) ([]MPPTaskMeta, error) + + // DispatchMPPTasks dispatches ALL mpp requests at once, and returns an iterator that transfers the data. + DispatchMPPTasks(context.Context, *Variables, []*MPPDispatchRequest) Response +} + +// MPPBuildTasksRequest request the stores allocation for a mpp plan fragment. +// However, the request doesn't contain the particular plan, because only key ranges take effect on the location assignment. +type MPPBuildTasksRequest struct { + KeyRanges []KeyRange + StartTS uint64 +} diff --git a/kv/txn.go b/kv/txn.go index 4592282f96f90..00dad8a7d3b19 100644 --- a/kv/txn.go +++ b/kv/txn.go @@ -26,7 +26,7 @@ import ( ) // RunInNewTxn will run the f in a new transaction environment. -func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) error { +func RunInNewTxn(ctx context.Context, store Storage, retryable bool, f func(ctx context.Context, txn Transaction) error) error { var ( err error originalTxnTS uint64 @@ -44,7 +44,7 @@ func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) e originalTxnTS = txn.StartTS() } - err = f(txn) + err = f(ctx, txn) if err != nil { err1 := txn.Rollback() terror.Log(err1) @@ -58,7 +58,7 @@ func RunInNewTxn(store Storage, retryable bool, f func(txn Transaction) error) e return err } - err = txn.Commit(context.Background()) + err = txn.Commit(ctx) if err == nil { break } @@ -114,6 +114,7 @@ func IsMockCommitErrorEnable() bool { // TxnInfo is used to keep track the info of a committed transaction (mainly for diagnosis and testing) type TxnInfo struct { + TxnScope string `json:"txn_scope"` StartTS uint64 `json:"start_ts"` CommitTS uint64 `json:"commit_ts"` ErrMsg string `json:"error,omitempty"` diff --git a/kv/txn_test.go b/kv/txn_test.go index b81e5f024235d..38e85ad354bfd 100644 --- a/kv/txn_test.go +++ b/kv/txn_test.go @@ -14,6 +14,7 @@ package kv import ( + "context" "errors" "time" @@ -51,17 +52,17 @@ func (s *testTxnSuite) TestRetryExceedCountError(c *C) { }(maxRetryCnt) maxRetryCnt = 5 - err := RunInNewTxn(&mockStorage{}, true, func(txn Transaction) error { + err := RunInNewTxn(context.Background(), &mockStorage{}, true, func(ctx context.Context, txn Transaction) error { return nil }) c.Assert(err, NotNil) - err = RunInNewTxn(&mockStorage{}, true, func(txn Transaction) error { + err = RunInNewTxn(context.Background(), &mockStorage{}, true, func(ctx context.Context, txn Transaction) error { return ErrTxnRetryable }) c.Assert(err, NotNil) - err = RunInNewTxn(&mockStorage{}, true, func(txn Transaction) error { + err = RunInNewTxn(context.Background(), &mockStorage{}, true, func(ctx context.Context, txn Transaction) error { return errors.New("do not retry") }) c.Assert(err, NotNil) @@ -71,7 +72,7 @@ func (s *testTxnSuite) TestRetryExceedCountError(c *C) { cfg.SetGetError(err1) cfg.SetCommitError(err1) storage := NewInjectedStore(newMockStorage(), &cfg) - err = RunInNewTxn(storage, true, func(txn Transaction) error { + err = RunInNewTxn(context.Background(), storage, true, func(ctx context.Context, txn Transaction) error { return nil }) c.Assert(err, NotNil) diff --git a/kv/union_store.go b/kv/union_store.go index 669048a9d0bf7..96ff6c8965a4b 100644 --- a/kv/union_store.go +++ b/kv/union_store.go @@ -15,8 +15,6 @@ package kv import ( "context" - - "github.com/pingcap/parser/model" ) // UnionStore is a store that wraps a snapshot for read and a MemBuffer for buffered write. @@ -28,12 +26,6 @@ type UnionStore interface { HasPresumeKeyNotExists(k Key) bool // UnmarkPresumeKeyNotExists deletes the key presume key not exists error flag for the lazy check. UnmarkPresumeKeyNotExists(k Key) - // CacheIndexName caches the index name. - // PresumeKeyNotExists will use this to help decode error message. - CacheTableInfo(id int64, info *model.TableInfo) - // GetIndexName returns the cached index name. - // If there is no such index already inserted through CacheIndexName, it will return UNKNOWN. - GetTableInfo(id int64) *model.TableInfo // SetOption sets an option with a value, when val is nil, uses the default // value of this option. @@ -68,19 +60,17 @@ type Options interface { // unionStore is an in-memory Store which contains a buffer for write and a // snapshot for read. type unionStore struct { - memBuffer *memdb - snapshot Snapshot - idxNameCache map[int64]*model.TableInfo - opts options + memBuffer *memdb + snapshot Snapshot + opts options } // NewUnionStore builds a new unionStore. func NewUnionStore(snapshot Snapshot) UnionStore { return &unionStore{ - snapshot: snapshot, - memBuffer: newMemDB(), - idxNameCache: make(map[int64]*model.TableInfo), - opts: make(map[Option]interface{}), + snapshot: snapshot, + memBuffer: newMemDB(), + opts: make(map[Option]interface{}), } } @@ -144,14 +134,6 @@ func (us *unionStore) UnmarkPresumeKeyNotExists(k Key) { us.memBuffer.UpdateFlags(k, DelPresumeKeyNotExists) } -func (us *unionStore) GetTableInfo(id int64) *model.TableInfo { - return us.idxNameCache[id] -} - -func (us *unionStore) CacheTableInfo(id int64, info *model.TableInfo) { - us.idxNameCache[id] = info -} - // SetOption implements the unionStore SetOption interface. func (us *unionStore) SetOption(opt Option, val interface{}) { us.opts[opt] = val diff --git a/lock/lock.go b/lock/lock.go index 8e92e2a62ccc5..ecfc8093a5243 100644 --- a/lock/lock.go +++ b/lock/lock.go @@ -34,7 +34,7 @@ func NewChecker(ctx sessionctx.Context, is infoschema.InfoSchema) *Checker { } // CheckTableLock uses to check table lock. -func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType) error { +func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType, alterWriteable bool) error { if db == "" && table == "" { return nil } @@ -43,7 +43,7 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType return nil } // check operation on database. - if table == "" { + if !alterWriteable && table == "" { return c.CheckLockInDB(db, privilege) } switch privilege { @@ -67,7 +67,7 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType if err != nil { return err } - if c.ctx.HasLockedTables() { + if !alterWriteable && c.ctx.HasLockedTables() { if locked, tp := c.ctx.CheckTableLocked(tb.Meta().ID); locked { if checkLockTpMeetPrivilege(tp, privilege) { return nil @@ -83,19 +83,24 @@ func (c *Checker) CheckTableLock(db, table string, privilege mysql.PrivilegeType if privilege == mysql.SelectPriv { switch tb.Meta().Lock.Tp { - case model.TableLockRead, model.TableLockWriteLocal: + case model.TableLockRead, model.TableLockWriteLocal, model.TableLockReadOnly: return nil } } + if alterWriteable && tb.Meta().Lock.Tp == model.TableLockReadOnly { + return nil + } + return infoschema.ErrTableLocked.GenWithStackByArgs(tb.Meta().Name.L, tb.Meta().Lock.Tp, tb.Meta().Lock.Sessions[0]) } func checkLockTpMeetPrivilege(tp model.TableLockType, privilege mysql.PrivilegeType) bool { + // TableLockReadOnly doesn't need to check in this, because it is session unrelated. switch tp { case model.TableLockWrite, model.TableLockWriteLocal: return true case model.TableLockRead: - // ShowDBPriv, AllPrivMask,CreatePriv, CreateViewPriv already checked before. + // ShowDBPriv, AllPrivMask, CreatePriv, CreateViewPriv already checked before. // The other privilege in read lock was not allowed. if privilege == mysql.SelectPriv { return true @@ -117,7 +122,7 @@ func (c *Checker) CheckLockInDB(db string, privilege mysql.PrivilegeType) error } tables := c.is.SchemaTables(model.NewCIStr(db)) for _, tbl := range tables { - err := c.CheckTableLock(db, tbl.Meta().Name.L, privilege) + err := c.CheckTableLock(db, tbl.Meta().Name.L, privilege, false) if err != nil { return err } diff --git a/meta/autoid/autoid.go b/meta/autoid/autoid.go old mode 100755 new mode 100644 index 3444537bda050..5115e1b4e5b3e --- a/meta/autoid/autoid.go +++ b/meta/autoid/autoid.go @@ -20,6 +20,7 @@ import ( "time" "github.com/cznic/mathutil" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/model" @@ -105,7 +106,7 @@ type Allocator interface { // The returned range is (min, max]: // case increment=1 & offset=1: you can derive the ids like min+1, min+2... max. // case increment=x & offset=y: you firstly need to seek to firstID by `SeekToFirstAutoIDXXX`, then derive the IDs like firstID, firstID + increment * 2... in the caller. - Alloc(tableID int64, n uint64, increment, offset int64) (int64, int64, error) + Alloc(ctx context.Context, tableID int64, n uint64, increment, offset int64) (int64, int64, error) // AllocSeqCache allocs sequence batch value cached in table level(rather than in alloc), the returned range covering // the size of sequence cache with it's increment. The returned round indicates the sequence cycle times if it is with @@ -186,7 +187,7 @@ func (alloc *allocator) End() int64 { func (alloc *allocator) NextGlobalAutoID(tableID int64) (int64, error) { var autoID int64 startTime := time.Now() - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { var err1 error m := meta.NewMeta(txn) autoID, err1 = getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) @@ -214,7 +215,7 @@ func (alloc *allocator) rebase4Unsigned(tableID int64, requiredBase uint64, allo } var newBase, newEnd uint64 startTime := time.Now() - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) currentEnd, err1 := getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) if err1 != nil { @@ -260,7 +261,7 @@ func (alloc *allocator) rebase4Signed(tableID, requiredBase int64, allocIDs bool } var newBase, newEnd int64 startTime := time.Now() - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) currentEnd, err1 := getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) if err1 != nil { @@ -297,7 +298,7 @@ func (alloc *allocator) rebase4Signed(tableID, requiredBase int64, allocIDs bool func (alloc *allocator) rebase4Sequence(tableID, requiredBase int64) (int64, bool, error) { startTime := time.Now() alreadySatisfied := false - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) currentEnd, err := getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) if err != nil { @@ -458,7 +459,7 @@ func NewAllocatorsFromTblInfo(store kv.Storage, schemaID int64, tblInfo *model.T // but actually we don't care about it, all we need is to calculate the new autoID corresponding to the // increment and offset at this time now. To simplify the rule is like (ID - offset) % increment = 0, // so the first autoID should be 9, then add increment to it to get 13. -func (alloc *allocator) Alloc(tableID int64, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) Alloc(ctx context.Context, tableID int64, n uint64, increment, offset int64) (int64, int64, error) { if tableID == 0 { return 0, 0, errInvalidTableID.GenWithStackByArgs("Invalid tableID") } @@ -473,9 +474,9 @@ func (alloc *allocator) Alloc(tableID int64, n uint64, increment, offset int64) alloc.mu.Lock() defer alloc.mu.Unlock() if alloc.isUnsigned { - return alloc.alloc4Unsigned(tableID, n, increment, offset) + return alloc.alloc4Unsigned(ctx, tableID, n, increment, offset) } - return alloc.alloc4Signed(tableID, n, increment, offset) + return alloc.alloc4Signed(ctx, tableID, n, increment, offset) } func (alloc *allocator) AllocSeqCache(tableID int64) (int64, int64, int64, error) { @@ -625,7 +626,7 @@ func SeekToFirstAutoIDUnSigned(base, increment, offset uint64) uint64 { return nr } -func (alloc *allocator) alloc4Signed(tableID int64, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) alloc4Signed(ctx context.Context, tableID int64, n uint64, increment, offset int64) (int64, int64, error) { // Check offset rebase if necessary. if offset-1 > alloc.base { if err := alloc.rebase4Signed(tableID, offset-1, true); err != nil { @@ -649,7 +650,13 @@ func (alloc *allocator) alloc4Signed(tableID int64, n uint64, increment, offset consumeDur := startTime.Sub(alloc.lastAllocTime) nextStep = NextStep(alloc.step, consumeDur) } - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(ctx, alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("alloc.alloc4Signed", opentracing.ChildOf(span.Context())) + defer span1.Finish() + opentracing.ContextWithSpan(ctx, span1) + } + m := meta.NewMeta(txn) var err1 error newBase, err1 = getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) @@ -694,7 +701,7 @@ func (alloc *allocator) alloc4Signed(tableID int64, n uint64, increment, offset return min, alloc.base, nil } -func (alloc *allocator) alloc4Unsigned(tableID int64, n uint64, increment, offset int64) (int64, int64, error) { +func (alloc *allocator) alloc4Unsigned(ctx context.Context, tableID int64, n uint64, increment, offset int64) (int64, int64, error) { // Check offset rebase if necessary. if uint64(offset-1) > uint64(alloc.base) { if err := alloc.rebase4Unsigned(tableID, uint64(offset-1), true); err != nil { @@ -718,7 +725,13 @@ func (alloc *allocator) alloc4Unsigned(tableID int64, n uint64, increment, offse consumeDur := startTime.Sub(alloc.lastAllocTime) nextStep = NextStep(alloc.step, consumeDur) } - err := kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(ctx, alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("alloc.alloc4Unsigned", opentracing.ChildOf(span.Context())) + defer span1.Finish() + opentracing.ContextWithSpan(ctx, span1) + } + m := meta.NewMeta(txn) var err1 error newBase, err1 = getAutoIDByAllocType(m, alloc.dbID, tableID, alloc.allocType) @@ -782,7 +795,7 @@ func (alloc *allocator) alloc4Sequence(tableID int64) (min int64, max int64, rou var newBase, newEnd int64 startTime := time.Now() - err = kv.RunInNewTxn(alloc.store, true, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), alloc.store, true, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) var ( err1 error @@ -917,17 +930,13 @@ func TestModifyBaseAndEndInjection(alloc Allocator, base, end int64) { alloc.(*allocator).mu.Unlock() } -// AutoRandomIDLayout is used to calculate the bits length of different section in auto_random id. -// The primary key with auto_random can only be `bigint` column, the total layout length of auto random is 64 bits. -// These are two type of layout: -// 1. Signed bigint: -// | [sign_bit] | [shard_bits] | [incremental_bits] | -// sign_bit(1 fixed) + shard_bits(15 max) + incremental_bits(the rest) = total_layout_bits(64 fixed) -// 2. Unsigned bigint: -// | [shard_bits] | [incremental_bits] | -// shard_bits(15 max) + incremental_bits(the rest) = total_layout_bits(64 fixed) -// Please always use NewAutoRandomIDLayout() to instantiate. -type AutoRandomIDLayout struct { +// ShardIDLayout is used to calculate the bits length of different segments in auto id. +// Generally, an auto id is consist of 3 segments: sign bit, shard bits and incremental bits. +// Take ``a BIGINT AUTO_INCREMENT PRIMARY KEY`` as an example, assume that the `shard_row_id_bits` = 5, +// the layout is like +// | [sign_bit] (1 bit) | [shard_bits] (5 bits) | [incremental_bits] (64-1-5=58 bits) | +// Please always use NewShardIDLayout() to instantiate. +type ShardIDLayout struct { FieldType *types.FieldType ShardBits uint64 // Derived fields. @@ -936,15 +945,15 @@ type AutoRandomIDLayout struct { HasSignBit bool } -// NewAutoRandomIDLayout create an instance of AutoRandomIDLayout. -func NewAutoRandomIDLayout(fieldType *types.FieldType, shardBits uint64) *AutoRandomIDLayout { +// NewShardIDLayout create an instance of ShardIDLayout. +func NewShardIDLayout(fieldType *types.FieldType, shardBits uint64) *ShardIDLayout { typeBitsLength := uint64(mysql.DefaultLengthOfMysqlTypes[mysql.TypeLonglong] * 8) incrementalBits := typeBitsLength - shardBits hasSignBit := !mysql.HasUnsignedFlag(fieldType.Flag) if hasSignBit { incrementalBits -= 1 } - return &AutoRandomIDLayout{ + return &ShardIDLayout{ FieldType: fieldType, ShardBits: shardBits, TypeBitsLength: typeBitsLength, @@ -954,11 +963,11 @@ func NewAutoRandomIDLayout(fieldType *types.FieldType, shardBits uint64) *AutoRa } // IncrementalBitsCapacity returns the max capacity of incremental section of the current layout. -func (l *AutoRandomIDLayout) IncrementalBitsCapacity() uint64 { +func (l *ShardIDLayout) IncrementalBitsCapacity() uint64 { return uint64(math.Pow(2, float64(l.IncrementalBits))) - 1 } // IncrementalMask returns 00..0[11..1], where [xxx] is the incremental section of the current layout. -func (l *AutoRandomIDLayout) IncrementalMask() int64 { +func (l *ShardIDLayout) IncrementalMask() int64 { return (1 << l.IncrementalBits) - 1 } diff --git a/meta/autoid/autoid_test.go b/meta/autoid/autoid_test.go index a7e3cf490fd78..40a97eafd8894 100644 --- a/meta/autoid/autoid_test.go +++ b/meta/autoid/autoid_test.go @@ -14,6 +14,7 @@ package autoid_test import ( + "context" "fmt" "math" "math/rand" @@ -49,9 +50,12 @@ func (*testSuite) TestT(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -73,16 +77,17 @@ func (*testSuite) TestT(c *C) { alloc := autoid.NewAllocator(store, 1, false, autoid.RowIDAllocType) c.Assert(alloc, NotNil) + ctx := context.Background() globalAutoID, err := alloc.NextGlobalAutoID(1) c.Assert(err, IsNil) c.Assert(globalAutoID, Equals, int64(1)) - _, id, err := alloc.Alloc(1, 1, 1, 1) + _, id, err := alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(1)) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(2)) - _, _, err = alloc.Alloc(0, 1, 1, 1) + _, _, err = alloc.Alloc(ctx, 0, 1, 1, 1) c.Assert(err, NotNil) globalAutoID, err = alloc.NextGlobalAutoID(1) c.Assert(err, IsNil) @@ -91,28 +96,28 @@ func (*testSuite) TestT(c *C) { // rebase err = alloc.Rebase(1, int64(1), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3)) err = alloc.Rebase(1, int64(3), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(4)) err = alloc.Rebase(1, int64(10), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(11)) err = alloc.Rebase(1, int64(3010), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3011)) alloc = autoid.NewAllocator(store, 1, false, autoid.RowIDAllocType) c.Assert(alloc, NotNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, autoid.GetStep()+1) @@ -120,7 +125,7 @@ func (*testSuite) TestT(c *C) { c.Assert(alloc, NotNil) err = alloc.Rebase(2, int64(1), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(2, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 2, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(2)) @@ -132,19 +137,19 @@ func (*testSuite) TestT(c *C) { c.Assert(alloc, NotNil) err = alloc.Rebase(3, int64(3000), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(3, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3211)) err = alloc.Rebase(3, int64(6543), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(3, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(6544)) // Test the MaxInt64 is the upper bound of `alloc` function but not `rebase`. err = alloc.Rebase(3, int64(math.MaxInt64-1), true) c.Assert(err, IsNil) - _, _, err = alloc.Alloc(3, 1, 1, 1) + _, _, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(alloc, NotNil) err = alloc.Rebase(3, int64(math.MaxInt64), true) c.Assert(err, IsNil) @@ -155,18 +160,18 @@ func (*testSuite) TestT(c *C) { globalAutoID, err = alloc.NextGlobalAutoID(4) c.Assert(err, IsNil) c.Assert(globalAutoID, Equals, int64(1)) - min, max, err := alloc.Alloc(4, 1, 1, 1) + min, max, err := alloc.Alloc(ctx, 4, 1, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(1)) c.Assert(min+1, Equals, int64(1)) - min, max, err = alloc.Alloc(4, 2, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 2, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(2)) c.Assert(min+1, Equals, int64(2)) c.Assert(max, Equals, int64(3)) - min, max, err = alloc.Alloc(4, 100, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 100, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(100)) expected := int64(4) @@ -177,7 +182,7 @@ func (*testSuite) TestT(c *C) { err = alloc.Rebase(4, int64(1000), false) c.Assert(err, IsNil) - min, max, err = alloc.Alloc(4, 3, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 3, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(3)) c.Assert(min+1, Equals, int64(1001)) @@ -187,7 +192,7 @@ func (*testSuite) TestT(c *C) { lastRemainOne := alloc.End() err = alloc.Rebase(4, alloc.End()-2, false) c.Assert(err, IsNil) - min, max, err = alloc.Alloc(4, 5, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 5, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(5)) c.Assert(min+1, Greater, lastRemainOne) @@ -200,12 +205,12 @@ func (*testSuite) TestT(c *C) { offset := int64(100) c.Assert(err, IsNil) c.Assert(globalAutoID, Equals, int64(1)) - min, max, err = alloc.Alloc(5, 1, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 1, increment, offset) c.Assert(err, IsNil) c.Assert(min, Equals, int64(99)) c.Assert(max, Equals, int64(100)) - min, max, err = alloc.Alloc(5, 2, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 2, increment, offset) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(4)) c.Assert(max-min, Equals, autoid.CalcNeededBatchSize(100, 2, increment, offset, false)) @@ -213,7 +218,7 @@ func (*testSuite) TestT(c *C) { c.Assert(max, Equals, int64(104)) increment = int64(5) - min, max, err = alloc.Alloc(5, 3, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 3, increment, offset) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(11)) c.Assert(max-min, Equals, autoid.CalcNeededBatchSize(104, 3, increment, offset, false)) @@ -223,7 +228,7 @@ func (*testSuite) TestT(c *C) { c.Assert(firstID, Equals, int64(105)) increment = int64(15) - min, max, err = alloc.Alloc(5, 2, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 2, increment, offset) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(30)) c.Assert(max-min, Equals, autoid.CalcNeededBatchSize(115, 2, increment, offset, false)) @@ -233,7 +238,7 @@ func (*testSuite) TestT(c *C) { c.Assert(firstID, Equals, int64(130)) offset = int64(200) - min, max, err = alloc.Alloc(5, 2, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 2, increment, offset) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(16)) // offset-1 > base will cause alloc rebase to offset-1. @@ -252,9 +257,12 @@ func (*testSuite) TestUnsignedAutoid(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -275,16 +283,17 @@ func (*testSuite) TestUnsignedAutoid(c *C) { alloc := autoid.NewAllocator(store, 1, true, autoid.RowIDAllocType) c.Assert(alloc, NotNil) + ctx := context.Background() globalAutoID, err := alloc.NextGlobalAutoID(1) c.Assert(err, IsNil) c.Assert(globalAutoID, Equals, int64(1)) - _, id, err := alloc.Alloc(1, 1, 1, 1) + _, id, err := alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(1)) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(2)) - _, _, err = alloc.Alloc(0, 1, 1, 1) + _, _, err = alloc.Alloc(ctx, 0, 1, 1, 1) c.Assert(err, NotNil) globalAutoID, err = alloc.NextGlobalAutoID(1) c.Assert(err, IsNil) @@ -293,28 +302,28 @@ func (*testSuite) TestUnsignedAutoid(c *C) { // rebase err = alloc.Rebase(1, int64(1), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3)) err = alloc.Rebase(1, int64(3), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(4)) err = alloc.Rebase(1, int64(10), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(11)) err = alloc.Rebase(1, int64(3010), true) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3011)) alloc = autoid.NewAllocator(store, 1, true, autoid.RowIDAllocType) c.Assert(alloc, NotNil) - _, id, err = alloc.Alloc(1, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 1, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, autoid.GetStep()+1) @@ -322,7 +331,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { c.Assert(alloc, NotNil) err = alloc.Rebase(2, int64(1), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(2, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 2, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(2)) @@ -334,12 +343,12 @@ func (*testSuite) TestUnsignedAutoid(c *C) { c.Assert(alloc, NotNil) err = alloc.Rebase(3, int64(3000), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(3, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(3211)) err = alloc.Rebase(3, int64(6543), false) c.Assert(err, IsNil) - _, id, err = alloc.Alloc(3, 1, 1, 1) + _, id, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(err, IsNil) c.Assert(id, Equals, int64(6544)) @@ -348,7 +357,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { un := int64(n) err = alloc.Rebase(3, un, true) c.Assert(err, IsNil) - _, _, err = alloc.Alloc(3, 1, 1, 1) + _, _, err = alloc.Alloc(ctx, 3, 1, 1, 1) c.Assert(err, NotNil) un = int64(n + 1) err = alloc.Rebase(3, un, true) @@ -361,7 +370,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { c.Assert(err, IsNil) c.Assert(globalAutoID, Equals, int64(1)) - min, max, err := alloc.Alloc(4, 2, 1, 1) + min, max, err := alloc.Alloc(ctx, 4, 2, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(2)) c.Assert(min+1, Equals, int64(1)) @@ -369,7 +378,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { err = alloc.Rebase(4, int64(500), true) c.Assert(err, IsNil) - min, max, err = alloc.Alloc(4, 2, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 2, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(2)) c.Assert(min+1, Equals, int64(501)) @@ -378,7 +387,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { lastRemainOne := alloc.End() err = alloc.Rebase(4, alloc.End()-2, false) c.Assert(err, IsNil) - min, max, err = alloc.Alloc(4, 5, 1, 1) + min, max, err = alloc.Alloc(ctx, 4, 5, 1, 1) c.Assert(err, IsNil) c.Assert(max-min, Equals, int64(5)) c.Assert(min+1, Greater, lastRemainOne) @@ -393,7 +402,7 @@ func (*testSuite) TestUnsignedAutoid(c *C) { n = math.MaxUint64 - 100 offset := int64(n) - min, max, err = alloc.Alloc(5, 2, increment, offset) + min, max, err = alloc.Alloc(ctx, 5, 2, increment, offset) c.Assert(err, IsNil) c.Assert(uint64(min), Equals, uint64(math.MaxUint64-101)) c.Assert(uint64(max), Equals, uint64(math.MaxUint64-98)) @@ -409,7 +418,10 @@ func (*testSuite) TestUnsignedAutoid(c *C) { func (*testSuite) TestConcurrentAlloc(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() autoid.SetStep(100) defer func() { autoid.SetStep(5000) @@ -417,7 +429,7 @@ func (*testSuite) TestConcurrentAlloc(c *C) { dbID := int64(2) tblID := int64(100) - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: dbID, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -434,9 +446,10 @@ func (*testSuite) TestConcurrentAlloc(c *C) { errCh := make(chan error, count) allocIDs := func() { + ctx := context.Background() alloc := autoid.NewAllocator(store, dbID, false, autoid.RowIDAllocType) for j := 0; j < int(autoid.GetStep())+5; j++ { - _, id, err1 := alloc.Alloc(tblID, 1, 1, 1) + _, id, err1 := alloc.Alloc(ctx, tblID, 1, 1, 1) if err1 != nil { errCh <- err1 break @@ -451,9 +464,9 @@ func (*testSuite) TestConcurrentAlloc(c *C) { m[id] = struct{}{} mu.Unlock() - //test Alloc N + // test Alloc N N := rand.Uint64() % 100 - min, max, err1 := alloc.Alloc(tblID, N, 1, 1) + min, max, err1 := alloc.Alloc(ctx, tblID, N, 1, 1) if err1 != nil { errCh <- err1 break @@ -496,10 +509,13 @@ func (*testSuite) TestConcurrentAlloc(c *C) { func (*testSuite) TestRollbackAlloc(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() dbID := int64(1) tblID := int64(2) - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: dbID, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -509,11 +525,12 @@ func (*testSuite) TestRollbackAlloc(c *C) { }) c.Assert(err, IsNil) + ctx := context.Background() injectConf := new(kv.InjectionConfig) injectConf.SetCommitError(errors.New("injected")) injectedStore := kv.NewInjectedStore(store, injectConf) alloc := autoid.NewAllocator(injectedStore, 1, false, autoid.RowIDAllocType) - _, _, err = alloc.Alloc(2, 1, 1, 1) + _, _, err = alloc.Alloc(ctx, 2, 1, 1, 1) c.Assert(err, NotNil) c.Assert(alloc.Base(), Equals, int64(0)) c.Assert(alloc.End(), Equals, int64(0)) @@ -540,10 +557,15 @@ func BenchmarkAllocator_Alloc(b *testing.B) { if err != nil { return } - defer store.Close() + defer func() { + err := store.Close() + if err != nil { + b.Fatal(err) + } + }() dbID := int64(1) tblID := int64(2) - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: dbID, Name: model.NewCIStr("a")}) if err != nil { @@ -558,10 +580,14 @@ func BenchmarkAllocator_Alloc(b *testing.B) { if err != nil { return } + ctx := context.Background() alloc := autoid.NewAllocator(store, 1, false, autoid.RowIDAllocType) b.StartTimer() for i := 0; i < b.N; i++ { - alloc.Alloc(2, 1, 1, 1) + _, _, err := alloc.Alloc(ctx, 2, 1, 1, 1) + if err != nil { + b.Fatal(err) + } } } @@ -571,10 +597,15 @@ func BenchmarkAllocator_SequenceAlloc(b *testing.B) { if err != nil { return } - defer store.Close() + defer func() { + err := store.Close() + if err != nil { + b.Fatal(err) + } + }() var seq *model.SequenceInfo var sequenceBase int64 - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) if err != nil { @@ -617,18 +648,24 @@ func BenchmarkAllocator_Seek(b *testing.B) { increment := int64(3) b.StartTimer() for i := 0; i < b.N; i++ { - autoid.CalcSequenceBatchSize(base, 3, increment, offset, math.MinInt64, math.MaxInt64) + _, err := autoid.CalcSequenceBatchSize(base, 3, increment, offset, math.MinInt64, math.MaxInt64) + if err != nil { + b.Fatal(err) + } } } func (*testSuite) TestSequenceAutoid(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() var seq *model.SequenceInfo var sequenceBase int64 - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -745,11 +782,14 @@ func (*testSuite) TestSequenceAutoid(c *C) { func (*testSuite) TestConcurrentAllocSequence(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() var seq *model.SequenceInfo var sequenceBase int64 - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err1 := m.CreateDatabase(&model.DBInfo{ID: 2, Name: model.NewCIStr("a")}) c.Assert(err1, IsNil) @@ -835,9 +875,12 @@ func (*testSuite) TestAllocComputationIssue(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() - err = kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) err = m.CreateDatabase(&model.DBInfo{ID: 1, Name: model.NewCIStr("a")}) c.Assert(err, IsNil) @@ -866,12 +909,13 @@ func (*testSuite) TestAllocComputationIssue(c *C) { // Simulate the rest cache is not enough for next batch, assuming 10 & 13, batch size = 4. autoid.TestModifyBaseAndEndInjection(signedAlloc, 4, 6) + ctx := context.Background() // Here will recompute the new allocator batch size base on new base = 10, which will get 6. - min, max, err := unsignedAlloc.Alloc(1, 2, 3, 1) + min, max, err := unsignedAlloc.Alloc(ctx, 1, 2, 3, 1) c.Assert(err, IsNil) c.Assert(min, Equals, int64(10)) c.Assert(max, Equals, int64(16)) - min, max, err = signedAlloc.Alloc(2, 2, 3, 1) + min, max, err = signedAlloc.Alloc(ctx, 2, 2, 3, 1) c.Assert(err, IsNil) c.Assert(min, Equals, int64(7)) c.Assert(max, Equals, int64(13)) diff --git a/meta/autoid/errors.go b/meta/autoid/errors.go index 66c847f96fa63..ad0b1bcf5d12b 100644 --- a/meta/autoid/errors.go +++ b/meta/autoid/errors.go @@ -14,18 +14,18 @@ package autoid import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // Error instances. var ( - errInvalidTableID = terror.ClassAutoid.New(mysql.ErrInvalidTableID, mysql.MySQLErrName[mysql.ErrInvalidTableID]) - errInvalidIncrementAndOffset = terror.ClassAutoid.New(mysql.ErrInvalidIncrementAndOffset, mysql.MySQLErrName[mysql.ErrInvalidIncrementAndOffset]) - ErrAutoincReadFailed = terror.ClassAutoid.New(mysql.ErrAutoincReadFailed, mysql.MySQLErrName[mysql.ErrAutoincReadFailed]) - ErrWrongAutoKey = terror.ClassAutoid.New(mysql.ErrWrongAutoKey, mysql.MySQLErrName[mysql.ErrWrongAutoKey]) - ErrInvalidAllocatorType = terror.ClassAutoid.New(mysql.ErrUnknownAllocatorType, mysql.MySQLErrName[mysql.ErrUnknownAllocatorType]) - ErrAutoRandReadFailed = terror.ClassAutoid.New(mysql.ErrAutoRandReadFailed, mysql.MySQLErrName[mysql.ErrAutoRandReadFailed]) + errInvalidTableID = dbterror.ClassAutoid.NewStd(mysql.ErrInvalidTableID) + errInvalidIncrementAndOffset = dbterror.ClassAutoid.NewStd(mysql.ErrInvalidIncrementAndOffset) + ErrAutoincReadFailed = dbterror.ClassAutoid.NewStd(mysql.ErrAutoincReadFailed) + ErrWrongAutoKey = dbterror.ClassAutoid.NewStd(mysql.ErrWrongAutoKey) + ErrInvalidAllocatorType = dbterror.ClassAutoid.NewStd(mysql.ErrUnknownAllocatorType) + ErrAutoRandReadFailed = dbterror.ClassAutoid.NewStd(mysql.ErrAutoRandReadFailed) ) const ( diff --git a/meta/meta.go b/meta/meta.go index 539a39f1cb730..96d54b4086c88 100644 --- a/meta/meta.go +++ b/meta/meta.go @@ -27,11 +27,11 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/structure" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -72,15 +72,15 @@ var ( var ( // ErrDBExists is the error for db exists. - ErrDBExists = terror.ClassMeta.New(mysql.ErrDBCreateExists, mysql.MySQLErrName[mysql.ErrDBCreateExists]) + ErrDBExists = dbterror.ClassMeta.NewStd(mysql.ErrDBCreateExists) // ErrDBNotExists is the error for db not exists. - ErrDBNotExists = terror.ClassMeta.New(mysql.ErrBadDB, mysql.MySQLErrName[mysql.ErrBadDB]) + ErrDBNotExists = dbterror.ClassMeta.NewStd(mysql.ErrBadDB) // ErrTableExists is the error for table exists. - ErrTableExists = terror.ClassMeta.New(mysql.ErrTableExists, mysql.MySQLErrName[mysql.ErrTableExists]) + ErrTableExists = dbterror.ClassMeta.NewStd(mysql.ErrTableExists) // ErrTableNotExists is the error for table not exists. - ErrTableNotExists = terror.ClassMeta.New(mysql.ErrNoSuchTable, mysql.MySQLErrName[mysql.ErrNoSuchTable]) + ErrTableNotExists = dbterror.ClassMeta.NewStd(mysql.ErrNoSuchTable) // ErrDDLReorgElementNotExist is the error for reorg element not exists. - ErrDDLReorgElementNotExist = terror.ClassMeta.New(errno.ErrDDLReorgElementNotExist, errno.MySQLErrName[errno.ErrDDLReorgElementNotExist]) + ErrDDLReorgElementNotExist = dbterror.ClassMeta.NewStd(errno.ErrDDLReorgElementNotExist) ) // Meta is for handling meta information in a transaction. @@ -381,6 +381,22 @@ func (m *Meta) CreateSequenceAndSetSeqValue(dbID int64, tableInfo *model.TableIn return errors.Trace(err) } +// RestartSequenceValue resets the the sequence value. +func (m *Meta) RestartSequenceValue(dbID int64, tableInfo *model.TableInfo, seqValue int64) error { + // Check if db exists. + dbKey := m.dbKey(dbID) + if err := m.checkDBExists(dbKey); err != nil { + return errors.Trace(err) + } + + // Check if table exists. + tableKey := m.tableKey(tableInfo.ID) + if err := m.checkTableExists(dbKey, tableKey); err != nil { + return errors.Trace(err) + } + return errors.Trace(m.txn.HSet(m.dbKey(dbID), m.sequenceKey(tableInfo.ID), []byte(strconv.FormatInt(seqValue, 10)))) +} + // DropDatabase drops whole database. func (m *Meta) DropDatabase(dbID int64) error { // Check if db exists. @@ -944,45 +960,42 @@ func DecodeElement(b []byte) (*Element, error) { } // UpdateDDLReorgStartHandle saves the job reorganization latest processed element and start handle for later resuming. -func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, element *Element, startHandle kv.Handle) error { +func (m *Meta) UpdateDDLReorgStartHandle(job *model.Job, element *Element, startKey kv.Key) error { err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) if err != nil { return errors.Trace(err) } - return setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), startHandle) + if startKey != nil { + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element), startKey) + if err != nil { + return errors.Trace(err) + } + } + return nil } // UpdateDDLReorgHandle saves the job reorganization latest processed information for later resuming. -func (m *Meta) UpdateDDLReorgHandle(job *model.Job, startHandle, endHandle kv.Handle, physicalTableID int64, element *Element) error { +func (m *Meta) UpdateDDLReorgHandle(job *model.Job, startKey, endKey kv.Key, physicalTableID int64, element *Element) error { err := m.txn.HSet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID), element.EncodeElement()) if err != nil { return errors.Trace(err) } - err = setReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), startHandle) - if err != nil { - return errors.Trace(err) + if startKey != nil { + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobStartHandle(job.ID, element), startKey) + if err != nil { + return errors.Trace(err) + } } - err = setReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element), endHandle) - if err != nil { - return errors.Trace(err) + if endKey != nil { + err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobEndHandle(job.ID, element), endKey) + if err != nil { + return errors.Trace(err) + } } err = m.txn.HSet(mDDLJobReorgKey, m.reorgJobPhysicalTableID(job.ID, element), []byte(strconv.FormatInt(physicalTableID, 10))) return errors.Trace(err) } -func setReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte, handle kv.Handle) error { - if handle == nil { - return nil - } - var handleEncodedBytes []byte - if handle.IsInt() { - handleEncodedBytes = []byte(strconv.FormatInt(handle.IntValue(), 10)) - } else { - handleEncodedBytes = handle.Encoded() - } - return t.HSet(mDDLJobReorgKey, reorgJobField, handleEncodedBytes) -} - // RemoveReorgElement removes the element of the reorganization information. // It's used for testing. func (m *Meta) RemoveReorgElement(job *model.Job) error { @@ -1020,7 +1033,7 @@ func (m *Meta) RemoveDDLReorgHandle(job *model.Job, elements []*Element) error { } // GetDDLReorgHandle gets the latest processed DDL reorganize position. -func (m *Meta) GetDDLReorgHandle(job *model.Job, isCommonHandle bool) (element *Element, startHandle, endHandle kv.Handle, physicalTableID int64, err error) { +func (m *Meta) GetDDLReorgHandle(job *model.Job) (element *Element, startKey, endKey kv.Key, physicalTableID int64, err error) { elementBytes, err := m.txn.HGet(mDDLJobReorgKey, m.reorgJobCurrentElement(job.ID)) if err != nil { return nil, nil, nil, 0, errors.Trace(err) @@ -1033,11 +1046,11 @@ func (m *Meta) GetDDLReorgHandle(job *model.Job, isCommonHandle bool) (element * return nil, nil, nil, 0, errors.Trace(err) } - startHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element), isCommonHandle) + startKey, err = getReorgJobFieldHandle(m.txn, m.reorgJobStartHandle(job.ID, element)) if err != nil { return nil, nil, nil, 0, errors.Trace(err) } - endHandle, err = getReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element), isCommonHandle) + endKey, err = getReorgJobFieldHandle(m.txn, m.reorgJobEndHandle(job.ID, element)) if err != nil { return nil, nil, nil, 0, errors.Trace(err) } @@ -1052,20 +1065,20 @@ func (m *Meta) GetDDLReorgHandle(job *model.Job, isCommonHandle bool) (element * // update them to table's in this case. if physicalTableID == 0 { if job.ReorgMeta != nil { - endHandle = kv.IntHandle(job.ReorgMeta.EndHandle) + endKey = kv.IntHandle(job.ReorgMeta.EndHandle).Encoded() } else { - endHandle = kv.IntHandle(math.MaxInt64) + endKey = kv.IntHandle(math.MaxInt64).Encoded() } physicalTableID = job.TableID logutil.BgLogger().Warn("new TiDB binary running on old TiDB DDL reorg data", zap.Int64("partition ID", physicalTableID), - zap.Stringer("startHandle", startHandle), - zap.Stringer("endHandle", endHandle)) + zap.Stringer("startHandle", startKey), + zap.Stringer("endHandle", endKey)) } return } -func getReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte, isCommonHandle bool) (kv.Handle, error) { +func getReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte) (kv.Key, error) { bs, err := t.HGet(mDDLJobReorgKey, reorgJobField) if err != nil { return nil, errors.Trace(err) @@ -1074,15 +1087,7 @@ func getReorgJobFieldHandle(t *structure.TxStructure, reorgJobField []byte, isCo if keyNotFound { return nil, nil } - if isCommonHandle { - return kv.NewCommonHandle(bs) - } - var n int64 - n, err = strconv.ParseInt(string(bs), 10, 64) - if err != nil { - return nil, err - } - return kv.IntHandle(n), nil + return bs, nil } func (m *Meta) schemaDiffKey(schemaVersion int64) []byte { diff --git a/meta/meta_test.go b/meta/meta_test.go index 17a6c8f735e8f..590e85fc2a21e 100644 --- a/meta/meta_test.go +++ b/meta/meta_test.go @@ -26,10 +26,8 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" - "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util/testleak" . "github.com/pingcap/tidb/util/testutil" ) @@ -49,11 +47,13 @@ func (s *testSuite) TestMeta(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() txn, err := store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() t := meta.NewMeta(txn) @@ -277,25 +277,32 @@ func (s *testSuite) TestSnapshot(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() txn, _ := store.Begin() m := meta.NewMeta(txn) - m.GenGlobalID() + _, err = m.GenGlobalID() + c.Assert(err, IsNil) n, _ := m.GetGlobalID() c.Assert(n, Equals, int64(1)) - txn.Commit(context.Background()) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) - ver1, _ := store.CurrentVersion() + ver1, _ := store.CurrentVersion(oracle.GlobalTxnScope) time.Sleep(time.Millisecond) txn, _ = store.Begin() m = meta.NewMeta(txn) - m.GenGlobalID() + _, err = m.GenGlobalID() + c.Assert(err, IsNil) n, _ = m.GetGlobalID() c.Assert(n, Equals, int64(2)) - txn.Commit(context.Background()) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) - snapshot, _ := store.GetSnapshot(ver1) + snapshot := store.GetSnapshot(ver1) snapMeta := meta.NewSnapshotMeta(snapshot) n, _ = snapMeta.GetGlobalID() c.Assert(n, Equals, int64(1)) @@ -333,13 +340,14 @@ func (s *testSuite) TestDDL(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() txn, err := store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() - t := meta.NewMeta(txn) job := &model.Job{ID: 1} @@ -363,37 +371,37 @@ func (s *testSuite) TestDDL(c *C) { // There are 3 meta key relate to index reorganization: // start_handle, end_handle and physical_table_id. // Only start_handle is initialized. - err = t.UpdateDDLReorgStartHandle(job, element, kv.IntHandle(1)) + err = t.UpdateDDLReorgStartHandle(job, element, kv.IntHandle(1).Encoded()) c.Assert(err, IsNil) // Since physical_table_id is uninitialized, we simulate older TiDB version that doesn't store them. // In this case GetDDLReorgHandle always return maxInt64 as end_handle. - e, i, j, k, err := t.GetDDLReorgHandle(job, false) + e, i, j, k, err := t.GetDDLReorgHandle(job) c.Assert(err, IsNil) c.Assert(e, DeepEquals, element) - c.Assert(i, HandleEquals, kv.IntHandle(1)) - c.Assert(j, HandleEquals, kv.IntHandle(math.MaxInt64)) + c.Assert(i, DeepEquals, kv.Key(kv.IntHandle(1).Encoded())) + c.Assert(j, DeepEquals, kv.Key(kv.IntHandle(math.MaxInt64).Encoded())) c.Assert(k, Equals, int64(0)) startHandle := s.NewHandle().Int(1).Common("abc", 1222, "string") endHandle := s.NewHandle().Int(2).Common("dddd", 1222, "string") element = &meta.Element{ID: 222, TypeKey: meta.ColumnElementKey} - err = t.UpdateDDLReorgHandle(job, startHandle, endHandle, 3, element) + err = t.UpdateDDLReorgHandle(job, startHandle.Encoded(), endHandle.Encoded(), 3, element) c.Assert(err, IsNil) element1 := &meta.Element{ID: 223, TypeKey: meta.IndexElementKey} - err = t.UpdateDDLReorgHandle(job, startHandle, endHandle, 3, element1) + err = t.UpdateDDLReorgHandle(job, startHandle.Encoded(), endHandle.Encoded(), 3, element1) c.Assert(err, IsNil) - e, i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + e, i, j, k, err = t.GetDDLReorgHandle(job) c.Assert(err, IsNil) c.Assert(e, DeepEquals, element1) - c.Assert(i, HandleEquals, startHandle) - c.Assert(j, HandleEquals, endHandle) + c.Assert(i, DeepEquals, kv.Key(startHandle.Encoded())) + c.Assert(j, DeepEquals, kv.Key(endHandle.Encoded())) c.Assert(k, Equals, int64(3)) err = t.RemoveDDLReorgHandle(job, []*meta.Element{element, element1}) c.Assert(err, IsNil) - e, i, j, k, err = t.GetDDLReorgHandle(job, false) + e, i, j, k, err = t.GetDDLReorgHandle(job) c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) c.Assert(e, IsNil) c.Assert(i, IsNil) @@ -401,7 +409,7 @@ func (s *testSuite) TestDDL(c *C) { c.Assert(k, Equals, int64(0)) // new TiDB binary running on old TiDB DDL reorg data. - e, i, j, k, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + e, i, j, k, err = t.GetDDLReorgHandle(job) c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) c.Assert(e, IsNil) c.Assert(i, IsNil) @@ -409,7 +417,7 @@ func (s *testSuite) TestDDL(c *C) { c.Assert(k, Equals, int64(0)) // Test GetDDLReorgHandle failed. - _, _, _, _, err = t.GetDDLReorgHandle(job, s.IsCommonHandle) + _, _, _, _, err = t.GetDDLReorgHandle(job) c.Assert(meta.ErrDDLReorgElementNotExist.Equal(err), IsTrue) v, err = t.DeQueueDDLJob() @@ -439,7 +447,8 @@ func (s *testSuite) TestDDL(c *C) { c.Assert(job.ID, Greater, lastID) lastID = job.ID arg1 := "" - job.DecodeArgs(&arg1) + err := job.DecodeArgs(&arg1) + c.Assert(err, IsNil) if job.ID == historyJob1.ID { c.Assert(*(job.Args[0].(*string)), Equals, historyJob1.Args[0]) } else { @@ -471,7 +480,6 @@ func (s *testSuite) TestDDL(c *C) { // Test for add index job. txn1, err := store.Begin() c.Assert(err, IsNil) - defer txn1.Rollback() m := meta.NewMeta(txn1, meta.AddIndexJobListKey) err = m.EnQueueDDLJob(job) @@ -500,11 +508,17 @@ func (s *testSuite) BenchmarkGenGlobalIDs(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() txn, err := store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() + defer func() { + err := txn.Rollback() + c.Assert(err, IsNil) + }() t := meta.NewMeta(txn) @@ -521,11 +535,17 @@ func (s *testSuite) BenchmarkGenGlobalIDOneByOne(c *C) { defer testleak.AfterTest(c)() store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() txn, err := store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() + defer func() { + err := txn.Rollback() + c.Assert(err, IsNil) + }() t := meta.NewMeta(txn) @@ -556,11 +576,3 @@ OUTER: } c.Assert(match, IsTrue) } - -func mustNewCommonHandle(c *C, values ...interface{}) *kv.CommonHandle { - encoded, err := codec.EncodeKey(new(stmtctx.StatementContext), nil, types.MakeDatums(values...)...) - c.Assert(err, IsNil) - ch, err := kv.NewCommonHandle(encoded) - c.Assert(err, IsNil) - return ch -} diff --git a/metrics/ddl.go b/metrics/ddl.go index 2662b6f4166d5..c92a8f72379fb 100644 --- a/metrics/ddl.go +++ b/metrics/ddl.go @@ -81,6 +81,7 @@ var ( }, []string{LblType, LblResult}) // Metrics for ddl_worker.go. + WorkerNotifyDDLJob = "notify_job" WorkerAddDDLJob = "add_job" WorkerRunDDLJob = "run_job" WorkerFinishDDLJob = "finish_job" @@ -114,16 +115,24 @@ var ( Help: "Speed of add index", }, []string{LblType}) - AddIndexProgress = prometheus.NewGauge( + BackfillProgressGauge = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: "tidb", Subsystem: "ddl", - Name: "add_index_percentage_progress", - Help: "Percentage progress of add index", - }) + Name: "backfill_percentage_progress", + Help: "Percentage progress of backfill", + }, []string{LblType}) ) // Label constants. const ( LblAction = "action" + + LblAddIndex = "add_index" + LblModifyColumn = "modify_column" ) + +// GetBackfillProgressByLabel returns the Gauge showing the percentage progress for the given type label. +func GetBackfillProgressByLabel(lbl string) prometheus.Gauge { + return BackfillProgressGauge.WithLabelValues(lbl) +} diff --git a/metrics/grafana/overview.json b/metrics/grafana/overview.json index 6cda103de0a77..13fd49e024895 100644 --- a/metrics/grafana/overview.json +++ b/metrics/grafana/overview.json @@ -153,91 +153,91 @@ ], "targets": [ { - "expr": "\ncount(probe_success{group=\"tidb\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tidb\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiDB", "refId": "A" }, { - "expr": "\ncount(probe_success{group=\"pd\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"pd\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "PD", "refId": "B" }, { - "expr": "\ncount(probe_success{group=\"tikv\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tikv\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiKV", "refId": "C" }, { - "expr": "\ncount(probe_success{group=\"tiflash\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tiflash\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiFlash", "refId": "D" }, { - "expr": "\ncount(probe_success{group=\"pump\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"pump\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Pump", "refId": "E" }, { - "expr": "\ncount(probe_success{group=\"drainer\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"drainer\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Drainer", "refId": "F" }, { - "expr": "\ncount(probe_success{group=\"kafka\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"kafka\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Kafka", "refId": "G" }, { - "expr": "\ncount(probe_success{group=\"zookeeper\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"zookeeper\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Zookeeper", "refId": "H" }, { - "expr": "\ncount(probe_success{group=\"node_exporter\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"node_exporter\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Node_exporter", "refId": "I" }, { - "expr": "\ncount(probe_success{group=\"blackbox_exporter\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"blackbox_exporter\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Blackbox_exporter", "refId": "J" }, { - "expr": "\ncount(probe_success{group=\"grafana\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"grafana\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Grafana", "refId": "K" }, { - "expr": "\ncount(probe_success{job=\"blackbox_exporter_http\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", job=\"blackbox_exporter_http\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Pushgateway", "refId": "L" }, { - "expr": "\ncount(probe_success{group=\"kafka_exporter\"} == 1)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"kafka_exporter\"} == 1)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Kafka_exporter", @@ -331,91 +331,91 @@ ], "targets": [ { - "expr": "\ncount(probe_success{group=\"tidb\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tidb\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiDB", "refId": "A" }, { - "expr": "\ncount(probe_success{group=\"pd\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"pd\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "PD", "refId": "B" }, { - "expr": "\ncount(probe_success{group=\"tikv\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tikv\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiKV", "refId": "C" }, { - "expr": "\ncount(probe_success{group=\"tiflash\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"tiflash\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "TiFlash", "refId": "D" }, { - "expr": "\ncount(probe_success{group=\"pump\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"pump\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Pump", "refId": "E" }, { - "expr": "\ncount(probe_success{group=\"drainer\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"drainer\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Drainer", "refId": "F" }, { - "expr": "\ncount(probe_success{group=\"kafka\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"kafka\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Kafka", "refId": "G" }, { - "expr": "\ncount(probe_success{group=\"zookeeper\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"zookeeper\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Zookeeper", "refId": "H" }, { - "expr": "\ncount(probe_success{group=\"node_exporter\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"node_exporter\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Node_exporter", "refId": "I" }, { - "expr": "\ncount(probe_success{group=\"blackbox_exporter\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"blackbox_exporter\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Blackbox_exporter", "refId": "J" }, { - "expr": "\ncount(probe_success{group=\"grafana\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"grafana\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Grafana", "refId": "K" }, { - "expr": "\ncount(probe_success{job=\"blackbox_exporter_http\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", job=\"blackbox_exporter_http\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Pushgateway", "refId": "L" }, { - "expr": "\ncount(probe_success{group=\"kafka_exporter\"} == 0)", + "expr": "\ncount(probe_success{tidb_cluster=\"$tidb_cluster\", group=\"kafka_exporter\"} == 0)", "format": "time_series", "intervalFactor": 2, "legendFormat": "Kafka_exporter", @@ -497,7 +497,7 @@ "tableColumn": "", "targets": [ { - "expr": "delta(pd_tso_events{type=\"save\",instance=\"$instance\"}[1m]) > bool 0", + "expr": "delta(pd_tso_events{tidb_cluster=\"$tidb_cluster\", type=\"save\",instance=\"$instance\"}[1m]) > bool 0", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -589,7 +589,7 @@ "tableColumn": "", "targets": [ { - "expr": "pd_cluster_status{instance=\"$instance\",type=\"storage_capacity\"}", + "expr": "pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\",type=\"storage_capacity\"}", "format": "time_series", "intervalFactor": 2, "refId": "A", @@ -674,7 +674,7 @@ "tableColumn": "", "targets": [ { - "expr": "pd_cluster_status{instance=\"$instance\",type=\"storage_size\"}", + "expr": "pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\",type=\"storage_size\"}", "intervalFactor": 2, "refId": "A", "step": 60 @@ -754,7 +754,7 @@ "tableColumn": "", "targets": [ { - "expr": "pd_cluster_status{instance=\"$instance\", type=\"leader_count\"}", + "expr": "pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"leader_count\"}", "intervalFactor": 2, "refId": "A", "step": 60 @@ -834,7 +834,7 @@ "tableColumn": "", "targets": [ { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_up_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_up_count\"})", "format": "time_series", "interval": "15s", "intervalFactor": 2, @@ -907,7 +907,7 @@ ], "targets": [ { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_disconnected_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_disconnected_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Disconnect Stores", @@ -915,7 +915,7 @@ "step": 20 }, { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_unhealth_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_unhealth_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Unhealth Stores", @@ -923,7 +923,7 @@ "step": 20 }, { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_low_space_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_low_space_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "LowSpace Stores", @@ -931,7 +931,7 @@ "step": 20 }, { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_down_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_down_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Down Stores", @@ -939,7 +939,7 @@ "step": 20 }, { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_offline_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_offline_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Offline Stores", @@ -947,7 +947,7 @@ "step": 20 }, { - "expr": "sum(pd_cluster_status{instance=\"$instance\", type=\"store_tombstone_count\"})", + "expr": "sum(pd_cluster_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"store_tombstone_count\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "Tombstone Stores", @@ -1007,7 +1007,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{instance=\"$instance\"}[5m])) by (grpc_method, le))", + "expr": "histogram_quantile(0.99, sum(rate(grpc_server_handling_seconds_bucket{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\"}[5m])) by (grpc_method, le))", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1101,7 +1101,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.98, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket[30s])) by (type, le))", + "expr": "histogram_quantile(0.98, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (type, le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-98%", @@ -1109,7 +1109,7 @@ "step": 10 }, { - "expr": "avg(rate(pd_client_request_handle_requests_duration_seconds_sum[30s])) by (type) / avg(rate(pd_client_request_handle_requests_duration_seconds_count[30s])) by (type)", + "expr": "avg(rate(pd_client_request_handle_requests_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\"}[30s])) by (type) / avg(rate(pd_client_request_handle_requests_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[30s])) by (type)", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1199,14 +1199,14 @@ "steppedLine": false, "targets": [ { - "expr": "pd_regions_status{instance=\"$instance\"}", + "expr": "pd_regions_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", "refId": "A" }, { - "expr": "sum(pd_regions_status) by (instance, type)", + "expr": "sum(pd_regions_status{tidb_cluster=\"$tidb_cluster\"}) by (instance, type)", "format": "time_series", "hide": true, "intervalFactor": 2, @@ -1297,7 +1297,7 @@ "steppedLine": false, "targets": [ { - "expr": "pd_hotspot_status{instance=\"$instance\",type=\"hot_write_region_as_leader\"}", + "expr": "pd_hotspot_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\",type=\"hot_write_region_as_leader\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -1388,7 +1388,7 @@ "steppedLine": false, "targets": [ { - "expr": "pd_hotspot_status{instance=\"$instance\",type=\"hot_read_region_as_leader\"}", + "expr": "pd_hotspot_status{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\",type=\"hot_read_region_as_leader\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -1478,7 +1478,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(delta(pd_scheduler_region_heartbeat{instance=\"$instance\", type=\"report\", status=\"ok\"}[1m])) by (store)", + "expr": "sum(delta(pd_scheduler_region_heartbeat{tidb_cluster=\"$tidb_cluster\", instance=\"$instance\", type=\"report\", status=\"ok\"}[1m])) by (store)", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -1570,7 +1570,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(pd_scheduler_region_heartbeat_latency_seconds_bucket[5m])) by (store, le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_scheduler_region_heartbeat_latency_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[5m])) by (store, le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -1681,7 +1681,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_executor_statement_total[1m])) by (type)", + "expr": "sum(rate(tidb_executor_statement_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -1770,7 +1770,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -1778,7 +1778,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 3, "legendFormat": "99", @@ -1786,14 +1786,14 @@ "step": 15 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95", "refId": "C" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -1882,7 +1882,7 @@ "steppedLine": false, "targets": [ { - "expr": "rate(tidb_server_query_total[1m])", + "expr": "rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} {{type}} {{result}}", @@ -1972,7 +1972,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_server_execute_error_total[1m])) by (type)", + "expr": "sum(increase(tidb_server_execute_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": " {{type}}", @@ -2068,7 +2068,7 @@ "steppedLine": true, "targets": [ { - "expr": "tidb_server_connections", + "expr": "tidb_server_connections{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2076,7 +2076,7 @@ "step": 10 }, { - "expr": "sum(tidb_server_connections)", + "expr": "sum(tidb_server_connections{tidb_cluster=\"$tidb_cluster\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "total", @@ -2167,7 +2167,7 @@ "steppedLine": false, "targets": [ { - "expr": "process_resident_memory_bytes{job=\"tidb\"}", + "expr": "process_resident_memory_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "process-{{instance}}", @@ -2175,7 +2175,7 @@ "step": 10 }, { - "expr": "go_memstats_heap_inuse_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_inuse_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "legendFormat": "HeapInuse-{{instance}}", "format": "time_series", "intervalFactor": 2, @@ -2261,7 +2261,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_transaction_duration_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2346,21 +2346,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -2449,7 +2449,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2540,7 +2540,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2628,7 +2628,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{type=\"tso\"}[1m]))", + "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "cmd", @@ -2636,7 +2636,7 @@ "step": 10 }, { - "expr": "sum(rate(pd_client_request_handle_requests_duration_seconds_count{type=\"tso\"}[1m]))", + "expr": "sum(rate(pd_client_request_handle_requests_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "request", @@ -2725,7 +2725,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -2733,14 +2733,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -2830,7 +2830,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_region_err_total[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_region_err_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2921,11 +2921,11 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_lock_resolver_actions_total[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_lock_resolver_actions_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", - "metric": "tidb_tikvclient_lock_resolver_actions_total", + "metric": "tidb_tikvclient_lock_resolver_actions_total{}", "refId": "A", "step": 10 } @@ -3016,7 +3016,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_domain_load_schema_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_domain_load_schema_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3108,7 +3108,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_backoff_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_backoff_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -3220,7 +3220,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tikv_raftstore_region_count{type=\"leader\"}) by (instance)", + "expr": "sum(tikv_raftstore_region_count{tidb_cluster=\"$tidb_cluster\", type=\"leader\"}) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3229,7 +3229,7 @@ "step": 10 }, { - "expr": "delta(tikv_raftstore_region_count{type=\"leader\"}[30s]) < -10", + "expr": "delta(tikv_raftstore_region_count{tidb_cluster=\"$tidb_cluster\", type=\"leader\"}[30s]) < -10", "format": "time_series", "hide": true, "intervalFactor": 2, @@ -3323,7 +3323,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tikv_raftstore_region_count{type=\"region\"}) by (instance)", + "expr": "sum(tikv_raftstore_region_count{tidb_cluster=\"$tidb_cluster\", type=\"region\"}) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3413,7 +3413,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_thread_cpu_seconds_total{job=\"tikv\"}[1m])) by (instance)", + "expr": "sum(rate(tikv_thread_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", job=\"tikv\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3500,7 +3500,7 @@ "steppedLine": false, "targets": [ { - "expr": "avg(process_resident_memory_bytes{job=\"tikv\"}) by (instance)", + "expr": "avg(process_resident_memory_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tikv\"}) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3589,7 +3589,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tikv_engine_size_bytes) by (instance)", + "expr": "sum(tikv_engine_size_bytes{tidb_cluster=\"$tidb_cluster\"}) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3678,7 +3678,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tikv_engine_size_bytes) by (type)", + "expr": "sum(tikv_engine_size_bytes{tidb_cluster=\"$tidb_cluster\"}) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -3772,7 +3772,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_channel_full_total[1m])) by (instance, type)", + "expr": "sum(rate(tikv_channel_full_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance, type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} - {{type}}", @@ -3871,7 +3871,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_server_report_failure_msg_total[1m])) by (type,instance,store_id)", + "expr": "sum(rate(tikv_server_report_failure_msg_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type,instance,store_id)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} - {{type}} - to - {{store_id}}", @@ -3962,7 +3962,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tikv_scheduler_contex_total) by (instance)", + "expr": "sum(tikv_scheduler_contex_total{tidb_cluster=\"$tidb_cluster\"}) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -4052,7 +4052,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_coprocessor_executor_count[1m])) by (type)", + "expr": "sum(rate(tikv_coprocessor_executor_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -4143,7 +4143,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tikv_coprocessor_request_duration_seconds_bucket[1m])) by (le,req))", + "expr": "histogram_quantile(0.99, sum(rate(tikv_coprocessor_request_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,req))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{req}}-99%", @@ -4151,7 +4151,7 @@ "step": 10 }, { - "expr": "histogram_quantile(0.95, sum(rate(tikv_coprocessor_request_duration_seconds_bucket[1m])) by (le,req))", + "expr": "histogram_quantile(0.95, sum(rate(tikv_coprocessor_request_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,req))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{req}}-95%", @@ -4159,7 +4159,7 @@ "step": 10 }, { - "expr": " sum(rate(tikv_coprocessor_request_duration_seconds_sum{req=\"select\"}[1m])) / sum(rate(tikv_coprocessor_request_duration_seconds_count{req=\"select\"}[1m]))", + "expr": " sum(rate(tikv_coprocessor_request_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\", req=\"select\"}[1m])) / sum(rate(tikv_coprocessor_request_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", req=\"select\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "select-avg", @@ -4167,7 +4167,7 @@ "step": 10 }, { - "expr": " sum(rate(tikv_coprocessor_request_duration_seconds_sum{req=\"index\"}[1m])) / sum(rate(tikv_coprocessor_request_duration_seconds_count{req=\"index\"}[1m]))", + "expr": " sum(rate(tikv_coprocessor_request_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\", req=\"index\"}[1m])) / sum(rate(tikv_coprocessor_request_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", req=\"index\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "index-avg", @@ -4256,7 +4256,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_thread_cpu_seconds_total{name=~\"raftstore_.*\"}[1m])) by (instance)", + "expr": "sum(rate(tikv_thread_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", name=~\"raftstore_.*\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -4346,11 +4346,11 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tikv_thread_cpu_seconds_total{name=~\"cop_.*\"}[1m])) by (instance)", + "expr": "sum(rate(tikv_thread_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", name=~\"cop_.*\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", - "metric": "tikv_coprocessor_request_duration_seconds_bucket", + "metric": "tikv_coprocessor_request_duration_seconds_bucket{}", "refId": "A", "step": 10 } @@ -4485,7 +4485,7 @@ ], "targets": [ { - "expr": "count(node_cpu_seconds_total{mode=\"user\"}) by (instance)", + "expr": "count(node_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", mode=\"user\"}) by (instance)", "format": "table", "instant": true, "intervalFactor": 2, @@ -4597,7 +4597,7 @@ ], "targets": [ { - "expr": "node_memory_MemTotal_bytes", + "expr": "node_memory_MemTotal_bytes{tidb_cluster=\"$tidb_cluster\"}", "format": "table", "instant": true, "intervalFactor": 2, @@ -4651,7 +4651,7 @@ "steppedLine": false, "targets": [ { - "expr": "100 - avg by (instance) (irate(node_cpu_seconds_total{mode=\"idle\"}[1m]) ) * 100", + "expr": "100 - avg by (instance) (irate(node_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", mode=\"idle\"}[1m]) ) * 100", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -4741,7 +4741,7 @@ "steppedLine": false, "targets": [ { - "expr": "node_load1", + "expr": "node_load1{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -4828,7 +4828,7 @@ "steppedLine": false, "targets": [ { - "expr": "node_memory_MemAvailable_bytes", + "expr": "node_memory_MemAvailable_bytes{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{ instance }}", @@ -4916,14 +4916,14 @@ "steppedLine": false, "targets": [ { - "expr": "irate(node_network_receive_bytes_total{device!=\"lo\"}[5m])", + "expr": "irate(node_network_receive_bytes_total{tidb_cluster=\"$tidb_cluster\", device!=\"lo\"}[5m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "Inbound: {{instance}}", "refId": "A" }, { - "expr": "irate(node_network_transmit_bytes_total{device!=\"lo\"}[5m])", + "expr": "irate(node_network_transmit_bytes_total{tidb_cluster=\"$tidb_cluster\", device!=\"lo\"}[5m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "Outbound: {{instance}}", @@ -5012,7 +5012,7 @@ "steppedLine": false, "targets": [ { - "expr": "irate(node_netstat_Tcp_RetransSegs[1m])", + "expr": "irate(node_netstat_Tcp_RetransSegs{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} - TCPSlowStartRetrans", @@ -5102,7 +5102,7 @@ "steppedLine": false, "targets": [ { - "expr": "irate(node_disk_io_time_seconds_total[1m])", + "expr": "irate(node_disk_io_time_seconds_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} - {{device}}", @@ -5163,6 +5163,31 @@ "tags": [], "templating": { "list": [ + { + "allValue": null, + "current": { + }, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "tidb_cluster", + "multi": false, + "name": "tidb_cluster", + "options": [ + + ], + "query": "label_values(pd_cluster_status, tidb_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [ + + ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { "allValue": null, "current": {}, @@ -5174,7 +5199,7 @@ "multi": false, "name": "instance", "options": [], - "query": "label_values(pd_cluster_status, instance)", + "query": "label_values(pd_cluster_status{tidb_cluster=\"$tidb_cluster\"}, instance)", "refresh": 1, "regex": "", "skipUrlSync": false, diff --git a/metrics/grafana/tidb.json b/metrics/grafana/tidb.json index acd1539761e5f..c09e802892304 100644 --- a/metrics/grafana/tidb.json +++ b/metrics/grafana/tidb.json @@ -106,28 +106,28 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", "refId": "A" }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95", "refId": "C" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -224,7 +224,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_query_total[1m])) by (result)", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (result)", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -233,7 +233,7 @@ "step": 60 }, { - "expr": "sum(rate(tidb_server_query_total{result=\"OK\"}[1m] offset 1d))", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\", result=\"OK\"}[1m] offset 1d))", "format": "time_series", "hide": true, "instant": false, @@ -243,7 +243,7 @@ "step": 90 }, { - "expr": "sum(tidb_server_connections) * sum(rate(tidb_server_handle_query_duration_seconds_count[1m])) / sum(rate(tidb_server_handle_query_duration_seconds_sum[1m]))", + "expr": "sum(tidb_server_connections{tidb_cluster=\"$tidb_cluster\"}) * sum(rate(tidb_server_handle_query_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) / sum(rate(tidb_server_handle_query_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "hide": true, "instant": false, @@ -343,7 +343,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_executor_statement_total[1m])) by (type)", + "expr": "sum(rate(tidb_executor_statement_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -351,7 +351,7 @@ "step": 30 }, { - "expr": "sum(rate(tidb_executor_statement_total[1m]))", + "expr": "sum(rate(tidb_executor_statement_total{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "total", @@ -454,7 +454,7 @@ "steppedLine": false, "targets": [ { - "expr": "rate(tidb_server_query_total[1m])", + "expr": "rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} {{type}} {{result}}", @@ -548,7 +548,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_server_execute_error_total[1m])) by (type, instance)", + "expr": "sum(increase(tidb_server_execute_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": " {{type}}-{{instance}}", @@ -606,9 +606,9 @@ "fill": 1, "gridPos": { "h": 6, - "w": 24, + "w": 12, "x": 0, - "y": 19 + "y": 25 }, "id": 112, "legend": { @@ -634,24 +634,24 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_process_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_process_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, - "legendFormat": "all_proc", + "legendFormat": "all_proc_{{sql_type}}", "refId": "A" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_cop_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_cop_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, - "legendFormat": "all_cop_proc", + "legendFormat": "all_cop_proc_{{sql_type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_wait_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_slow_query_wait_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, - "legendFormat": "all_cop_wait", + "legendFormat": "all_cop_wait_{{sql_type}}", "refId": "C" } ], @@ -696,6 +696,134 @@ "alignLevel": null } }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_TEST-CLUSTER}", + "description": "TiDB connection idle durations", + "fill": 1, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 25 + }, + "id": 218, + "legend": { + "avg": false, + "current": false, + "max": false, + "min": false, + "show": true, + "total": false, + "values": false + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "null as zero", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='1'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "99-in-txn", + "refId": "A" + }, + { + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='0'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "99-not-in-txn", + "refId": "B" + }, + { + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='1'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "90-in-txn", + "refId": "C" + }, + { + "expr": "histogram_quantile(0.90, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='0'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "90-not-in-txn", + "refId": "D" + }, + { + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='1'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "80-in-txn", + "refId": "E" + }, + { + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_conn_idle_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", in_txn='0'}[1m])) by (le,in_txn))", + "format": "time_series", + "interval": "", + "intervalFactor": 2, + "legendFormat": "80-not-in-txn", + "refId": "F" + } + ], + "thresholds": [], + "timeFrom": null, + "timeRegions": [], + "timeShift": null, + "title": "Connection Idle Duration", + "tooltip": { + "shared": true, + "sort": 0, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "$$hashKey": "object:518", + "format": "s", + "label": null, + "logBase": 2, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + } + ], + "yaxis": { + "align": false, + "alignLevel": null + } + }, { "aliasColors": {}, "bars": false, @@ -734,7 +862,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le,sql_type))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{sql_type}}", @@ -820,7 +948,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le,sql_type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{sql_type}}", @@ -906,7 +1034,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le,sql_type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{sql_type}}", @@ -992,7 +1120,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le,sql_type))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le,sql_type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{sql_type}}", @@ -1098,7 +1226,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1194,7 +1322,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{ instance }}", @@ -1289,7 +1417,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -1382,7 +1510,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -1475,7 +1603,7 @@ "steppedLine": false, "targets": [ { - "expr": "increase(tidb_server_execute_error_total[1m])", + "expr": "increase(tidb_server_execute_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}} @ {{instance}}", @@ -1566,7 +1694,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_restricted_sql_total[30s]))", + "expr": "sum(rate(tidb_session_restricted_sql_total{tidb_cluster=\"$tidb_cluster\"}[30s]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "", @@ -1682,7 +1810,7 @@ "steppedLine": false, "targets": [ { - "expr": "(time() - process_start_time_seconds{job=\"tidb\"})", + "expr": "(time() - process_start_time_seconds{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"})", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -1779,14 +1907,14 @@ "steppedLine": false, "targets": [ { - "expr": "process_resident_memory_bytes{job=\"tidb\"}", + "expr": "process_resident_memory_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "process-{{instance}}", "refId": "A" }, { - "expr": "go_memstats_heap_sys_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_sys_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -1794,14 +1922,14 @@ "refId": "B" }, { - "expr": "go_memstats_heap_inuse_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_inuse_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "HeapInuse-{{instance}}", "refId": "C" }, { - "expr": "go_memstats_heap_alloc_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_alloc_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -1809,7 +1937,7 @@ "refId": "D" }, { - "expr": "go_memstats_heap_idle_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_idle_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -1817,14 +1945,14 @@ "refId": "E" }, { - "expr": "go_memstats_heap_released_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_released_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "hide": true, "interval": "", "legendFormat": "HeapReleased-{{instance}}", "refId": "F" }, { - "expr": "go_memstats_next_gc_bytes{job=\"tidb\"}", + "expr": "go_memstats_next_gc_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "hide": true, "interval": "", "legendFormat": "GCTrigger-{{instance}}", @@ -1928,7 +2056,7 @@ "steppedLine": false, "targets": [ { - "expr": "irate(process_cpu_seconds_total{job=\"tidb\"}[30s])", + "expr": "irate(process_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}[30s])", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -1937,7 +2065,7 @@ "step": 40 }, { - "expr": "tidb_server_maxprocs{job=\"tidb\"}", + "expr": "tidb_server_maxprocs{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "legendFormat": "limit-{{instance}}", "refId": "B" } @@ -2033,7 +2161,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_server_connections", + "expr": "tidb_server_connections{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2041,7 +2169,7 @@ "step": 40 }, { - "expr": "sum(tidb_server_connections)", + "expr": "sum(tidb_server_connections{tidb_cluster=\"$tidb_cluster\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "total", @@ -2131,7 +2259,7 @@ "steppedLine": false, "targets": [ { - "expr": "process_open_fds{job=\"tidb\"}", + "expr": "process_open_fds{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2228,7 +2356,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tidb_server_disconnection_total) by (instance, result)", + "expr": "sum(tidb_server_disconnection_total{tidb_cluster=\"$tidb_cluster\"}) by (instance, result)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{result}}", @@ -2318,7 +2446,7 @@ "steppedLine": false, "targets": [ { - "expr": " go_goroutines{job=~\"tidb.*\"}", + "expr": " go_goroutines{tidb_cluster=\"$tidb_cluster\", job=~\"tidb.*\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2406,7 +2534,7 @@ "steppedLine": false, "targets": [ { - "expr": "increase(tidb_server_event_total[10m])", + "expr": "increase(tidb_server_event_total{tidb_cluster=\"$tidb_cluster\"}[10m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-server {{type}}", @@ -2503,7 +2631,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_server_prepared_stmts", + "expr": "tidb_server_prepared_stmts{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2511,7 +2639,7 @@ "step": 40 }, { - "expr": "sum(tidb_server_prepared_stmts)", + "expr": "sum(tidb_server_prepared_stmts{tidb_cluster=\"$tidb_cluster\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "total", @@ -2601,7 +2729,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_monitor_keep_alive_total[1m])) by (instance)", + "expr": "sum(increase(tidb_monitor_keep_alive_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2689,7 +2817,7 @@ "steppedLine": false, "targets": [ { - "expr": "increase(tidb_server_panic_total[1m])", + "expr": "increase(tidb_server_panic_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -2697,7 +2825,7 @@ "refId": "A" }, { - "expr": "increase(tidb_server_critical_error_total[1m])", + "expr": "increase(tidb_server_critical_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -2786,7 +2914,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_monitor_time_jump_back_total[1m])) by (instance)", + "expr": "sum(increase(tidb_monitor_time_jump_back_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2872,7 +3000,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_get_token_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_get_token_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "99", @@ -2960,7 +3088,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_server_critical_error_total", + "expr": "tidb_server_critical_error_total{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -3052,14 +3180,14 @@ "steppedLine": false, "targets": [ { - "expr": "rate(tidb_server_packet_io_bytes_sum[1m])", + "expr": "rate(tidb_server_packet_io_bytes_sum{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-{{type}}-rate", "refId": "A" }, { - "expr": "tidb_server_packet_io_bytes_sum", + "expr": "tidb_server_packet_io_bytes_sum{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-{{type}}-total", @@ -3147,7 +3275,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_server_handshake_error_total[1m])) by (instance)", + "expr": "sum(increase(tidb_server_handshake_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3258,7 +3386,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_transaction_duration_seconds_count[1m])) by (type, txn_mode)", + "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, txn_mode)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{txn_mode}}", @@ -3352,21 +3480,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{txn_mode}}", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95-{{txn_mode}}", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80-{{txn_mode}}", @@ -3463,19 +3591,19 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, - "format": "short", - "logBase": 1, - "max": null, - "min": null, + "format": "short", + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null - }, + }, "yBucketBound": "auto", "yBucketNumber": null, "yBucketSize": null @@ -3530,19 +3658,19 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, - "format": "short", - "logBase": 1, - "max": null, - "min": null, + "format": "short", + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null - }, + }, "yBucketBound": "auto", "yBucketNumber": null, "yBucketSize": null @@ -3592,7 +3720,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_retry_error_total[30s])) by (type, sql_type)", + "expr": "sum(rate(tidb_session_retry_error_total{tidb_cluster=\"$tidb_cluster\"}[30s])) by (type, sql_type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{sql_type}}", @@ -3686,21 +3814,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_batch_executor_token_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -3795,7 +3923,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count[1m])) by (instance)", + "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -3889,21 +4017,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{type}}", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95-{{type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80-{{type}}", @@ -4001,19 +4129,19 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, - "format": "short", - "logBase": 1, - "max": null, - "min": null, + "format": "short", + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null - }, + }, "yBucketBound": "auto", "yBucketNumber": null, "yBucketSize": null @@ -4072,14 +4200,14 @@ "steppedLine": false, "targets": [ { - "expr": "rate(tidb_tikvclient_txn_write_kv_num_sum[30s])", + "expr": "rate(tidb_tikvclient_txn_write_kv_num_sum{tidb_cluster=\"$tidb_cluster\"}[30s])", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-rate", "refId": "A" }, { - "expr": "tidb_tikvclient_txn_write_kv_num_sum", + "expr": "tidb_tikvclient_txn_write_kv_num_sum{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-sum", @@ -4178,16 +4306,16 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, "format": "short", - "logBase": 1, - "max": null, - "min": null, + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null }, @@ -4246,19 +4374,19 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, - "format": "short", - "logBase": 1, - "max": null, - "min": null, + "format": "short", + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null - }, + }, "yBucketBound": "auto", "yBucketNumber": null, "yBucketSize": null @@ -4312,7 +4440,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_txn_heart_beat_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_txn_heart_beat_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80-{{type}}", @@ -4320,14 +4448,14 @@ "step": 40 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_txn_heart_beat_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_txn_heart_beat_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 1, "legendFormat": "95-{{type}}", "refId": "A" }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_heart_beat_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_txn_heart_beat_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 1, "legendFormat": "99-{{type}}", @@ -4430,7 +4558,7 @@ "steppedLine": false, "targets": [ { - "expr": "rate(tidb_tikvclient_txn_write_size_bytes_sum[30s])", + "expr": "rate(tidb_tikvclient_txn_write_size_bytes_sum{tidb_cluster=\"$tidb_cluster\"}[30s])", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-rate", @@ -4438,7 +4566,7 @@ "step": 40 }, { - "expr": "tidb_tikvclient_txn_write_size_bytes_sum", + "expr": "tidb_tikvclient_txn_write_size_bytes_sum{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}-sum", @@ -4603,7 +4731,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -4611,14 +4739,14 @@ "step": 40 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "95", "refId": "A" }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_pessimistic_lock_keys_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "99", @@ -4714,7 +4842,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_ttl_lifetime_reach_total[1m])) by (instance)", + "expr": "sum(rate(tidb_tikvclient_ttl_lifetime_reach_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}", @@ -4812,7 +4940,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_load_safepoint_total{type=\"ok\"}[1m])) by (instance)", + "expr": "sum(rate(tidb_tikvclient_load_safepoint_total{tidb_cluster=\"$tidb_cluster\", type=\"ok\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -4912,16 +5040,16 @@ }, "type": "heatmap", "xAxis": { - "show": true - }, + "show": true + }, "xBucketNumber": null, "xBucketSize": null, "yAxis": { "decimals": 0, - "format": "short", - "logBase": 1, - "max": null, - "min": null, + "format": "short", + "logBase": 1, + "max": null, + "min": null, "show": true, "splitFactor": null }, @@ -4976,11 +5104,18 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_async_commit_txn_counter[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_async_commit_txn_counter{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 1, - "legendFormat": "{{type}}", + "legendFormat": "async commit-{{type}}", "refId": "A" + }, + { + "refId": "B", + "expr": "sum(rate(tidb_tikvclient_one_pc_txn_counter{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", + "intervalFactor": 1, + "format": "time_series", + "legendFormat": "1PC-{{type}}" } ], "thresholds": [], @@ -5089,7 +5224,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_parse_duration_seconds_bucket[1m])) by (le, sql_type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_parse_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, sql_type))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -5190,7 +5325,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_compile_duration_seconds_bucket[1m])) by (le, sql_type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_compile_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, sql_type))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -5291,7 +5426,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_execute_duration_seconds_bucket[1m])) by (le, sql_type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_execute_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, sql_type))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -5391,7 +5526,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_executor_expensive_total[1m])) by (type)", + "expr": "sum(rate(tidb_executor_expensive_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -5489,7 +5624,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_plan_cache_total[1m])) by (type)", + "expr": "sum(rate(tidb_server_plan_cache_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -5601,31 +5736,31 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999-{{type}}", "refId": "D" }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "hide": false, "intervalFactor": 2, "legendFormat": "99-{{type}}", - "metric": "tidb_distsql_handle_query_duration_seconds_bucket", + "metric": "tidb_distsql_handle_query_duration_seconds_bucket{}", "refId": "A", "step": 4 }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90-{{type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "interval": "", "intervalFactor": 2, @@ -5717,7 +5852,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_distsql_handle_query_duration_seconds_count[1m]))", + "expr": "sum(rate(tidb_distsql_handle_query_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "", @@ -5810,7 +5945,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_distsql_scan_keys_partial_num_count[1m]))", + "expr": "sum(rate(tidb_distsql_scan_keys_partial_num_count{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "", @@ -5899,21 +6034,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_distsql_scan_keys_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(1, sum(rate(tidb_distsql_scan_keys_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "100", "refId": "A" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_scan_keys_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_scan_keys_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", "refId": "B" }, { - "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_scan_keys_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_scan_keys_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "50", @@ -5999,21 +6134,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_distsql_scan_keys_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(1, sum(rate(tidb_distsql_scan_keys_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "100", "refId": "A" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_scan_keys_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_scan_keys_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_distsql_scan_keys_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_distsql_scan_keys_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "50", @@ -6099,21 +6234,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_distsql_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(1, sum(rate(tidb_distsql_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "100", "refId": "A" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_distsql_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", "refId": "B" }, { - "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_partial_num_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.50, sum(rate(tidb_distsql_partial_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "50", @@ -6206,7 +6341,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_distsql_copr_cache_buckets[1m])) by (type))", + "expr": "histogram_quantile(1, sum(rate(tidb_distsql_copr_cache_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -6301,7 +6436,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_cop_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_cop_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -6411,7 +6546,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_backoff_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_backoff_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -6419,14 +6554,14 @@ "step": 40 }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_backoff_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_backoff_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_backoff_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_tikvclient_backoff_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80", @@ -6521,7 +6656,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_region_err_total[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_region_err_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -6530,7 +6665,7 @@ "step": 40 }, { - "expr": "sum(rate(tidb_tikvclient_region_err_total{type=\"server_is_busy\"}[1m]))", + "expr": "sum(rate(tidb_tikvclient_region_err_total{tidb_cluster=\"$tidb_cluster\"}{EXTERNAL_LABELtype=\"server_is_busy\"}[1m]))", "format": "time_series", "hide": true, "intervalFactor": 2, @@ -6622,7 +6757,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_backoff_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_backoff_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -6715,11 +6850,11 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_lock_resolver_actions_total[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_lock_resolver_actions_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", - "metric": "tidb_tikvclient_lock_resolver_actions_total", + "metric": "tidb_tikvclient_lock_resolver_actions_total{}", "refId": "A", "step": 40 } @@ -6811,16 +6946,16 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_lock_cleanup_task_total[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_lock_cleanup_task_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "cleanup_secondary_failure_{{type}}", - "metric": "tidb_tikvclient_lock_resolver_actions_total", + "metric": "tidb_tikvclient_lock_resolver_actions_total{}", "refId": "A", "step": 40 }, { - "expr": "sum(rate(tidb_tikvclient_load_safepoint_total{type=\"fail\"}[1m]))", + "expr": "sum(rate(tidb_tikvclient_load_safepoint_total{tidb_cluster=\"$tidb_cluster\", type=\"fail\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "load_safepoint_failure", @@ -6927,7 +7062,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_request_seconds_count[1m])) by (instance, type)", + "expr": "sum(rate(tidb_tikvclient_request_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance, type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{type}}", @@ -7022,7 +7157,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\"}[1m])) by (le, store))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{tidb_cluster=\"$tidb_cluster\", store!=\"0\"}[1m])) by (le, store))", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -7117,7 +7252,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\"}[1m])) by (le,type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{tidb_cluster=\"$tidb_cluster\", store!=\"0\"}[1m])) by (le,type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -7225,7 +7360,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{type!=\"tso\"}[1m])) by (type)", + "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", type!=\"tso\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -7318,7 +7453,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999-{{type}}", @@ -7326,14 +7461,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!~\"tso|tso_async_wait\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90-{{type}}", @@ -7425,7 +7560,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(pd_client_cmd_handle_failed_cmds_duration_seconds_count[1m])) by (type)", + "expr": "sum(rate(pd_client_cmd_handle_failed_cmds_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -7516,14 +7651,14 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{type=\"tso\"}[1m]))", + "expr": "sum(rate(pd_client_cmd_handle_cmds_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "cmd", "refId": "C" }, { - "expr": "sum(rate(pd_client_request_handle_requests_duration_seconds_count{type=\"tso\"}[1m]))", + "expr": "sum(rate(pd_client_request_handle_requests_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "request", @@ -7613,7 +7748,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -7621,14 +7756,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -7718,7 +7853,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -7726,14 +7861,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -7823,7 +7958,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -7831,14 +7966,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_pdclient_ts_future_wait_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -7945,7 +8080,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_domain_load_schema_duration_seconds_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_domain_load_schema_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -8044,7 +8179,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_domain_load_schema_total[1m])) by (instance,type)", + "expr": "sum(rate(tidb_domain_load_schema_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance,type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{type}}", @@ -8141,7 +8276,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_session_schema_lease_error_total[1m])) by (instance)", + "expr": "sum(increase(tidb_session_schema_lease_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -8240,7 +8375,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_domain_load_privilege_total[1m])) by (instance,type)", + "expr": "sum(rate(tidb_domain_load_privilege_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance,type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{type}}", @@ -8349,7 +8484,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_ddl_handle_job_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_ddl_handle_job_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -8441,14 +8576,14 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_ddl_batch_add_idx_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(1, sum(rate(tidb_ddl_batch_add_idx_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", "refId": "A" }, { - "expr": "sum(rate(tidb_ddl_add_index_total[1m])) by (type)", + "expr": "sum(rate(tidb_ddl_add_index_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -8538,7 +8673,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_ddl_waiting_jobs", + "expr": "tidb_ddl_waiting_jobs{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{type}}", @@ -8626,7 +8761,7 @@ "steppedLine": false, "targets": [ { - "expr": "increase(tidb_ddl_worker_operation_total[1m])", + "expr": "increase(tidb_ddl_worker_operation_total{tidb_cluster=\"$tidb_cluster\"}[1m])", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{type}}", @@ -8716,7 +8851,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(increase(tidb_ddl_worker_operation_duration_seconds_bucket[1m])) by (le, type, action, result))", + "expr": "histogram_quantile(0.99, sum(increase(tidb_ddl_worker_operation_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type, action, result))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{action}}-{{result}}", @@ -8804,7 +8939,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_ddl_deploy_syncer_duration_seconds_bucket[2m])) by (le, type, result))", + "expr": "histogram_quantile(1, sum(rate(tidb_ddl_deploy_syncer_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[2m])) by (le, type, result))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{result}}", @@ -8892,7 +9027,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_ddl_owner_handle_syncer_duration_seconds_bucket[2m])) by (le, type, result))", + "expr": "histogram_quantile(1, sum(rate(tidb_ddl_owner_handle_syncer_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[2m])) by (le, type, result))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{result}}", @@ -8980,7 +9115,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_ddl_update_self_ver_duration_seconds_bucket[2m])) by (le, result))", + "expr": "histogram_quantile(1, sum(rate(tidb_ddl_update_self_ver_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[2m])) by (le, result))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{result}}", @@ -9066,14 +9201,14 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_ddl_handle_job_duration_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_ddl_handle_job_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{ type }}", "refId": "A" }, { - "expr": "sum(rate(tidb_ddl_handle_job_duration_seconds_count[1m]))", + "expr": "sum(rate(tidb_ddl_handle_job_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 1, "legendFormat": "total", @@ -9127,7 +9262,7 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "TiDB DDL add index progress in percentage. The value is [0,100]", + "description": "TiDB DDL backfill progress in percentage. The value is [0,100]", "fill": 1, "gridPos": { "h": 8, @@ -9162,18 +9297,25 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_ddl_add_index_percentage_progress", + "expr": "irate(tidb_ddl_add_index_percentage_progress{tidb_cluster=\"$tidb_cluster\", type=\"add_index\"}[1m])", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}", "refId": "A" + }, + { + "expr": "irate(tidb_ddl_add_index_percentage_progress{tidb_cluster=\"$tidb_cluster\", type=\"modify_column\"}[1m])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "{{instance}}", + "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "DDL add index progress in percentage", + "title": "DDL backfill progress in percentage", "tooltip": { "shared": true, "sort": 0, @@ -9263,7 +9405,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_statistics_auto_analyze_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_statistics_auto_analyze_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "auto analyze duration", @@ -9350,7 +9492,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_auto_analyze_total[1m])) by (type)", + "expr": "sum(rate(tidb_statistics_auto_analyze_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -9437,7 +9579,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", @@ -9445,14 +9587,14 @@ "step": 30 }, { - "expr": "histogram_quantile(0.90, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", "refId": "B" }, { - "expr": "histogram_quantile(0.50, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.50, sum(rate(tidb_statistics_stats_inaccuracy_rate_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "50", @@ -9538,10 +9680,10 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_pseudo_estimation_total[1m]))", + "expr": "sum(rate(tidb_statistics_pseudo_estimation_total{tidb_cluster=\"$tidb_cluster\"}[30s])) by (type)", "format": "time_series", "intervalFactor": 2, - "legendFormat": "Pseudo OPS", + "legendFormat": "{{type}}", "refId": "A", "step": 30 } @@ -9625,7 +9767,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_dump_feedback_total[1m])) by (type)", + "expr": "sum(rate(tidb_statistics_dump_feedback_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -9712,7 +9854,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_store_query_feedback_total[1m])) by (type) ", + "expr": "sum(rate(tidb_statistics_store_query_feedback_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type) ", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -9799,7 +9941,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_high_error_rate_feedback_total[1m]))", + "expr": "sum(rate(tidb_statistics_high_error_rate_feedback_total{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -9886,7 +10028,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_statistics_update_stats_total[1m])) by (type)", + "expr": "sum(rate(tidb_statistics_update_stats_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -9980,7 +10122,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_statistics_fast_analyze_status_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(1, sum(rate(tidb_statistics_fast_analyze_status_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -10088,7 +10230,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_owner_new_session_duration_seconds_bucket[1m])) by (le, instance, result))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_owner_new_session_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance, result))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}-{{result}}", @@ -10176,7 +10318,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_owner_watch_owner_total[1m])) by (type, result, instance)", + "expr": "sum(rate(tidb_owner_watch_owner_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, result, instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{result}}-{{instance}}", @@ -10262,7 +10404,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_owner_watch_owner_total[1m])) by (type, result, instance)", + "expr": "sum(rate(tidb_owner_watch_owner_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, result, instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{result}}-{{instance}}", @@ -10365,7 +10507,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_autoid_operation_duration_seconds_count[1m]))", + "expr": "sum(rate(tidb_autoid_operation_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "AutoID QPS", @@ -10453,14 +10595,14 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_autoid_operation_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_autoid_operation_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{type}}", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_autoid_operation_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_autoid_operation_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80-{{type}}", @@ -10546,7 +10688,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_region_cache_operations_total{result=\"err\"}[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_region_cache_operations_total{tidb_cluster=\"$tidb_cluster\", result=\"err\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -10635,7 +10777,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_meta_operation_duration_seconds_bucket[1m])) by (le, type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_meta_operation_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -10738,7 +10880,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_tikvclient_gc_worker_actions_total[1m])) by (type)", + "expr": "sum(increase(tidb_tikvclient_gc_worker_actions_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -10827,7 +10969,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_gc_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_gc_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", @@ -10915,7 +11057,7 @@ "steppedLine": false, "targets": [ { - "expr": "max(tidb_tikvclient_gc_config) by (type)", + "expr": "max(tidb_tikvclient_gc_config{tidb_cluster=\"$tidb_cluster\"}) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -11001,7 +11143,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_tikvclient_gc_failure[1m])) by (type)", + "expr": "sum(increase(tidb_tikvclient_gc_failure{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -11089,7 +11231,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_tikvclient_gc_unsafe_destroy_range_failures[1m])) by (type)", + "expr": "sum(increase(tidb_tikvclient_gc_unsafe_destroy_range_failures{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -11175,7 +11317,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_tikvclient_gc_region_too_many_locks[1m]))", + "expr": "sum(increase(tidb_tikvclient_gc_region_too_many_locks{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "Locks Error OPM", @@ -11261,7 +11403,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_tikvclient_gc_action_result[1m])) by (type)", + "expr": "sum(increase(tidb_tikvclient_gc_action_result{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -11358,7 +11500,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(tidb_tikvclient_range_task_stats) by (type, result)", + "expr": "sum(tidb_tikvclient_range_task_stats{tidb_cluster=\"$tidb_cluster\"}) by (type, result)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{result}}", @@ -11451,7 +11593,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_range_task_push_duration_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_range_task_push_duration_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -11518,68 +11660,55 @@ "panels": [ { "aliasColors": {}, - "bars": false, + "bars": true, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "kv storage batch requests in queue", - "editable": true, - "error": false, + "description": "Metrics for 'no available connection'.\nThere should be no data here if the connection between TiDB and TiKV is healthy.", "fill": 1, - "grid": {}, "gridPos": { "h": 7, "w": 8, "x": 0, "y": 16 }, - "id": 176, + "id": 203, "legend": { - "alignAsTable": true, "avg": false, - "current": true, + "current": false, "max": false, "min": false, - "rightSide": true, "show": true, "total": false, - "values": true + "values": false }, - "lines": true, + "lines": false, "linewidth": 1, "links": [], "nullPointMode": "null as zero", "percentage": false, - "pointradius": 5, + "pointradius": 2, "points": false, "renderer": "flot", - "seriesOverrides": [ - { - "alias": "total", - "fill": 0, - "lines": false - } - ], + "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "sum(tidb_tikvclient_pending_batch_requests) by (store)", + "expr": "delta(tidb_tikvclient_batch_client_no_available_connection_total{tidb_cluster=\"$tidb_cluster\"}[30s])", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{store}}", - "refId": "A", - "step": 40 + "intervalFactor": 1, + "legendFormat": "{{instance}}", + "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Pending Request Count by TiKV", + "title": "No Available Connection Counter", "tooltip": { - "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" @@ -11607,7 +11736,7 @@ "logBase": 1, "max": null, "min": null, - "show": true + "show": false } ], "yaxis": { @@ -11621,7 +11750,7 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "kv storage batch processing durations", + "description": "kv storage batch processing unvailable durations", "editable": true, "error": false, "fill": 1, @@ -11632,14 +11761,14 @@ "x": 8, "y": 16 }, - "id": 179, + "id": 180, "legend": { - "alignAsTable": true, + "alignAsTable": false, "avg": false, "current": false, "max": false, "min": false, - "rightSide": true, + "rightSide": false, "show": true, "total": false, "values": false @@ -11658,9 +11787,10 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_wait_duration_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_client_unavailable_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (le, instance))", "format": "time_series", - "intervalFactor": 2, + "hide": false, + "intervalFactor": 1, "legendFormat": "{{instance}}", "refId": "A", "step": 10 @@ -11670,7 +11800,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Wait Duration 95", + "title": "Batch Client Unavailable Duration 95", "tooltip": { "msResolution": false, "shared": true, @@ -11687,7 +11817,7 @@ }, "yaxes": [ { - "format": "ns", + "format": "s", "label": null, "logBase": 1, "max": null, @@ -11727,12 +11857,12 @@ }, "id": 204, "legend": { - "alignAsTable": true, + "alignAsTable": false, "avg": false, "current": false, "max": false, "min": false, - "rightSide": true, + "rightSide": false, "show": true, "total": false, "values": false @@ -11751,190 +11881,10 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.9999, sum(rate(tidb_tikvclient_batch_client_wait_connection_establish_bucket[1m])) by (le, instance))", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{instance}}", - "refId": "A", - "step": 10 - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "Wait Connection Establish Duration", - "tooltip": { - "msResolution": false, - "shared": true, - "sort": 0, - "value_type": "cumulative" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "s", - "label": null, - "logBase": 1, - "max": null, - "min": "0", - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_TEST-CLUSTER}", - "description": "Metrics for 'no available connection'.\nThere should be no data here if the connection between TiDB and TiKV is healthy.", - "fill": 1, - "gridPos": { - "h": 7, - "w": 16, - "x": 0, - "y": 23 - }, - "id": 203, - "legend": { - "avg": false, - "current": false, - "max": false, - "min": false, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 1, - "links": [], - "nullPointMode": "null", - "percentage": false, - "pointradius": 2, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "tidb_tikvclient_batch_client_no_available_connection_total", + "expr": "histogram_quantile(0.9999, sum(rate(tidb_tikvclient_batch_client_wait_connection_establish_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (le, instance))", "format": "time_series", "intervalFactor": 1, "legendFormat": "{{instance}}", - "refId": "A" - } - ], - "thresholds": [], - "timeFrom": null, - "timeRegions": [], - "timeShift": null, - "title": "No Available Connection Counter", - "tooltip": { - "shared": true, - "sort": 0, - "value_type": "individual" - }, - "type": "graph", - "xaxis": { - "buckets": null, - "mode": "time", - "name": null, - "show": true, - "values": [] - }, - "yaxes": [ - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - }, - { - "format": "short", - "label": null, - "logBase": 1, - "max": null, - "min": null, - "show": true - } - ], - "yaxis": { - "align": false, - "alignLevel": null - } - }, - { - "aliasColors": {}, - "bars": false, - "dashLength": 10, - "dashes": false, - "datasource": "${DS_TEST-CLUSTER}", - "description": "kv storage batch processing unvailable durations", - "editable": true, - "error": false, - "fill": 1, - "grid": {}, - "gridPos": { - "h": 7, - "w": 8, - "x": 16, - "y": 23 - }, - "id": 180, - "legend": { - "alignAsTable": true, - "avg": false, - "current": false, - "max": false, - "min": false, - "rightSide": true, - "show": true, - "total": false, - "values": false - }, - "lines": true, - "linewidth": 2, - "links": [], - "nullPointMode": "null as zero", - "percentage": false, - "pointradius": 5, - "points": false, - "renderer": "flot", - "seriesOverrides": [], - "spaceLength": 10, - "stack": false, - "steppedLine": false, - "targets": [ - { - "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_client_unavailable_seconds_bucket[1m])) by (le, instance))", - "format": "time_series", - "hide": false, - "intervalFactor": 2, - "legendFormat": "{{instance}}", "refId": "A", "step": 10 } @@ -11943,7 +11893,7 @@ "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Batch Client Unavailable Duration 95", + "title": "Wait Connection Establish Duration", "tooltip": { "msResolution": false, "shared": true, @@ -11990,6 +11940,30 @@ "schemaVersion": 18, "style": "dark", "tags": [], + "templating": { + "list": [ + { + "allValue": null, + "current": {}, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "tidb_cluster", + "multi": false, + "name": "tidb_cluster", + "options": [], + "query": "label_values(pd_cluster_status, tidb_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] + }, "time": { "from": "now-1h", "to": "now" diff --git a/metrics/grafana/tidb_runtime.json b/metrics/grafana/tidb_runtime.json index 364a4f55ef898..63136f16d0b02 100644 --- a/metrics/grafana/tidb_runtime.json +++ b/metrics/grafana/tidb_runtime.json @@ -134,7 +134,7 @@ "steppedLine": false, "targets": [ { - "expr": "process_resident_memory_bytes{instance=~\"$instance\"}", + "expr": "process_resident_memory_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -142,7 +142,7 @@ "refId": "A" }, { - "expr": "go_memstats_next_gc_bytes{instance=~\"$instance\"} / (1 + tidb_server_gogc{instance=~\"$instance\"} / 100)", + "expr": "go_memstats_next_gc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} / (1 + tidb_server_gogc{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} / 100)", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -150,7 +150,7 @@ "refId": "H" }, { - "expr": "go_memstats_heap_alloc_bytes{instance=~\"$instance\"} - go_memstats_next_gc_bytes{instance=~\"$instance\"} / (1 + tidb_server_gogc{instance=~\"$instance\"} / 100)", + "expr": "go_memstats_heap_alloc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} - go_memstats_next_gc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} / (1 + tidb_server_gogc{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} / 100)", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -158,7 +158,7 @@ "refId": "C" }, { - "expr": "go_memstats_heap_idle_bytes{instance=~\"$instance\"} - go_memstats_heap_released_bytes{instance=~\"$instance\"} + go_memstats_heap_inuse_bytes{instance=~\"$instance\"} - go_memstats_heap_alloc_bytes{instance=~\"$instance\"}", + "expr": "go_memstats_heap_idle_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} - go_memstats_heap_released_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_heap_inuse_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} - go_memstats_heap_alloc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -166,7 +166,7 @@ "refId": "B" }, { - "expr": "go_memstats_stack_sys_bytes{instance=~\"$instance\"} + go_memstats_mspan_sys_bytes{instance=~\"$instance\"} + go_memstats_mcache_sys_bytes{instance=~\"$instance\"} + go_memstats_buck_hash_sys_bytes{instance=~\"$instance\"} + go_memstats_gc_sys_bytes{instance=~\"$instance\"} + go_memstats_other_sys_bytes{instance=~\"$instance\"}", + "expr": "go_memstats_stack_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_mspan_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_mcache_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_buck_hash_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_gc_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} + go_memstats_other_sys_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -174,7 +174,7 @@ "refId": "D" }, { - "expr": "go_memstats_next_gc_bytes{instance=~\"$instance\"}", + "expr": "go_memstats_next_gc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -182,7 +182,7 @@ "refId": "E" }, { - "expr": "(clamp_max(idelta(go_memstats_last_gc_time_seconds{instance=~\"$instance\"}[1m]), 1) * go_memstats_next_gc_bytes{instance=~\"$instance\"}) > 0", + "expr": "(clamp_max(idelta(go_memstats_last_gc_time_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[1m]), 1) * go_memstats_next_gc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}) > 0", "format": "time_series", "hide": false, "intervalFactor": 1, @@ -233,76 +233,97 @@ } }, { - "type": "graph", - "title": "Estimated Live Objects", - "gridPos": { - "x": 12, - "y": 1, - "w": 12, - "h": 7 - }, "aliasColors": {}, "bars": false, - "cacheTimeout": null, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "Count of live objects.", + "description": "TiDB cpu usage calculated with process cpu running seconds", "editable": true, "error": false, - "fill": 0, + "fill": 1, "grid": {}, - "id": 21, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 6, "legend": { "alignAsTable": false, "avg": false, - "current": false, - "hideEmpty": true, - "hideZero": true, + "current": true, "max": false, "min": false, "rightSide": false, "show": true, - "sideWidth": null, "total": false, - "values": false + "values": true }, "lines": true, "linewidth": 1, "links": [], - "maxPerRow": 3, - "nullPointMode": "null", + "nullPointMode": "null as zero", "percentage": false, - "pluginVersion": "6.1.6", "pointradius": 5, "points": false, "renderer": "flot", - "repeat": null, - "repeatDirection": "h", - "seriesOverrides": [], + "seriesOverrides": [ + { + "alias": "total", + "fill": 0, + "lines": false + }, + { + "alias": "/limit/", + "color": "#C4162A", + "fill": 0, + "nullPointMode": "null" + } + ], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "go_memstats_heap_objects{instance=~\"$instance\"}", + "expr": "irate(process_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])", "format": "time_series", "hide": false, + "interval": "", "intervalFactor": 1, - "legendFormat": "objects", - "refId": "A" + "legendFormat": "cpu-usage", + "refId": "A", + "step": 40 + }, + { + "expr": "(idelta((go_memstats_gc_cpu_fraction{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} * (go_memstats_last_gc_time_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} - process_start_time_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}) * tidb_server_maxprocs{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"})[30s:]) > 0) / 15", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "gc-cpu", + "refId": "C" + }, + { + "expr": "tidb_server_maxprocs{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", + "format": "time_series", + "interval": "", + "intervalFactor": 1, + "legendFormat": "limit", + "refId": "B" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, + "title": "CPU Usage", "tooltip": { - "msResolution": true, + "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" }, + "type": "graph", "xaxis": { "buckets": null, "mode": "time", @@ -312,8 +333,8 @@ }, "yaxes": [ { - "format": "short", - "label": "", + "format": "percentunit", + "label": null, "logBase": 1, "max": null, "min": "0", @@ -321,11 +342,11 @@ }, { "format": "short", - "label": "", + "label": null, "logBase": 1, "max": null, "min": null, - "show": false + "show": true } ], "yaxis": { @@ -340,10 +361,10 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "TiDB process Go garbage collection STW pause duration", + "description": "Count of live objects.", "editable": true, "error": false, - "fill": 1, + "fill": 0, "grid": {}, "gridPos": { "h": 7, @@ -351,70 +372,56 @@ "x": 12, "y": 1 }, - "id": 8, + "id": 21, "legend": { "alignAsTable": false, "avg": false, - "current": true, + "current": false, + "hideEmpty": true, + "hideZero": true, "max": false, "min": false, "rightSide": false, "show": true, + "sideWidth": null, "total": false, - "values": true + "values": false }, "lines": true, "linewidth": 1, "links": [], - "nullPointMode": "null as zero", + "maxPerRow": 3, + "nullPointMode": "null", "percentage": false, "pluginVersion": "6.1.6", "pointradius": 5, "points": false, "renderer": "flot", - "seriesOverrides": [ - {} - ], + "repeat": null, + "repeatDirection": "h", + "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "go_gc_duration_seconds{instance=~\"$instance\", quantile=\"0\"}", + "expr": "go_memstats_heap_objects{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "hide": false, - "instant": false, - "intervalFactor": 1, - "legendFormat": "min", - "refId": "A", - "step": 40 - }, - { - "expr": "go_gc_duration_seconds{instance=~\"$instance\", quantile!~\"0|1\"}", - "format": "time_series", - "instant": false, - "intervalFactor": 1, - "legendFormat": "{{quantile}}", - "refId": "B" - }, - { - "expr": "go_gc_duration_seconds{instance=~\"$instance\", quantile=\"1\"}", - "format": "time_series", - "instant": false, "intervalFactor": 1, - "legendFormat": "max", - "refId": "C" + "legendFormat": "objects", + "refId": "A" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "GC STW Duration (last 256 GC cycles)", + "title": "Estimated Live Objects", "tooltip": { - "msResolution": false, + "msResolution": true, "shared": true, - "sort": 1, + "sort": 0, "value_type": "individual" }, "type": "graph", @@ -427,8 +434,8 @@ }, "yaxes": [ { - "format": "s", - "label": null, + "format": "short", + "label": "", "logBase": 1, "max": null, "min": "0", @@ -436,7 +443,7 @@ }, { "format": "short", - "label": null, + "label": "", "logBase": 1, "max": null, "min": null, @@ -451,10 +458,11 @@ { "aliasColors": {}, "bars": false, + "cacheTimeout": null, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "TiDB cpu usage calculated with process cpu running seconds", + "description": "TiDB process Go garbage collection STW pause duration", "editable": true, "error": false, "fill": 1, @@ -462,10 +470,10 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, + "x": 12, "y": 8 }, - "id": 6, + "id": 8, "legend": { "alignAsTable": false, "avg": false, @@ -482,54 +490,53 @@ "links": [], "nullPointMode": "null as zero", "percentage": false, + "pluginVersion": "6.1.6", "pointradius": 5, "points": false, "renderer": "flot", "seriesOverrides": [ - { - "alias": "total", - "fill": 0, - "lines": false - }, - { - "alias": "/limit/", - "color": "#C4162A", - "fill": 0, - "nullPointMode": "null" - } + {} ], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "irate(process_cpu_seconds_total{instance=~\"$instance\"}[30s])", + "expr": "go_gc_duration_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", quantile=\"0\"}", "format": "time_series", "hide": false, - "interval": "", + "instant": false, "intervalFactor": 1, - "legendFormat": "cpu-usage", + "legendFormat": "min", "refId": "A", "step": 40 }, { - "expr": "tidb_server_maxprocs{instance=~\"$instance\"}", + "expr": "go_gc_duration_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", quantile!~\"0|1\"}", "format": "time_series", - "interval": "", + "instant": false, "intervalFactor": 1, - "legendFormat": "limit", + "legendFormat": "{{quantile}}", "refId": "B" + }, + { + "expr": "go_gc_duration_seconds{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\", quantile=\"1\"}", + "format": "time_series", + "instant": false, + "intervalFactor": 1, + "legendFormat": "max", + "refId": "C" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "CPU Usage", + "title": "GC STW Duration (last 256 GC cycles)", "tooltip": { "msResolution": false, "shared": true, - "sort": 0, + "sort": 1, "value_type": "individual" }, "type": "graph", @@ -542,7 +549,7 @@ }, "yaxes": [ { - "format": "percentunit", + "format": "s", "label": null, "logBase": 1, "max": null, @@ -555,7 +562,7 @@ "logBase": 1, "max": null, "min": null, - "show": true + "show": false } ], "yaxis": { @@ -569,18 +576,15 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "The CPU time (aggregated) used by grabage collector.", - "editable": true, - "error": false, + "description": "The throughput of Go's memory allocator.", "fill": 1, - "grid": {}, "gridPos": { "h": 7, "w": 12, "x": 12, - "y": 8 + "y": 22 }, - "id": 14, + "id": 16, "legend": { "alignAsTable": false, "avg": false, @@ -595,32 +599,65 @@ "lines": true, "linewidth": 1, "links": [], - "nullPointMode": "null as zero", + "nullPointMode": "null", "percentage": false, "pointradius": 5, "points": false, "renderer": "flot", - "seriesOverrides": [], + "seriesOverrides": [ + { + "alias": "sweep", + "transform": "negative-Y" + }, + { + "alias": "alloc-ops", + "yaxis": 2 + }, + { + "alias": "swepp-ops", + "transform": "negative-Y", + "yaxis": 2 + } + ], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "(idelta((go_memstats_gc_cpu_fraction{instance=~\"$instance\"} * (go_memstats_last_gc_time_seconds{instance=~\"$instance\"} - process_start_time_seconds{instance=~\"$instance\"}) * tidb_server_maxprocs{instance=~\"$instance\"})[30s:]) / idelta(go_gc_duration_seconds_count{instance=~\"$instance\"}[30s])) > 0", + "expr": "irate(go_memstats_alloc_bytes_total{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])", "format": "time_series", - "hide": false, "intervalFactor": 1, - "legendFormat": "cpu-time", + "legendFormat": "alloc", + "refId": "A" + }, + { + "expr": "irate((go_memstats_alloc_bytes_total{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"} - go_memstats_heap_alloc_bytes{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"})[30s:])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "sweep", "refId": "B" + }, + { + "expr": "irate(go_memstats_mallocs_total{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "alloc-ops", + "refId": "C" + }, + { + "expr": "irate(go_memstats_frees_total{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "swepp-ops", + "refId": "D" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "GC CPU Time", + "title": "Allocator Throughput", "tooltip": { - "msResolution": false, "shared": true, "sort": 0, "value_type": "individual" @@ -635,15 +672,15 @@ }, "yaxes": [ { - "format": "s", + "format": "Bps", "label": null, "logBase": 1, "max": null, - "min": "0", + "min": null, "show": true }, { - "format": "none", + "format": "ops", "label": null, "logBase": 1, "max": null, @@ -652,7 +689,7 @@ } ], "yaxis": { - "align": false, + "align": true, "alignLevel": null } }, @@ -702,14 +739,14 @@ "steppedLine": false, "targets": [ { - "expr": " go_goroutines{instance=~\"$instance\"}", + "expr": " go_goroutines{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "goroutines", "refId": "A" }, { - "expr": "go_threads{instance=~\"$instance\"}", + "expr": "go_threads{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "threads", @@ -763,22 +800,21 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "The throughput of Go's memory allocator.", + "description": "TiDB side and TiKV side RPC duration.", "fill": 1, "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 15 + "x": 0, + "y": 29 }, - "id": 16, + "id": 19, "legend": { - "alignAsTable": false, "avg": false, - "current": true, + "current": false, + "hideEmpty": true, "max": true, "min": false, - "rightSide": false, "show": true, "total": false, "values": true @@ -788,62 +824,34 @@ "links": [], "nullPointMode": "null", "percentage": false, - "pointradius": 5, + "pointradius": 2, "points": false, "renderer": "flot", - "seriesOverrides": [ - { - "alias": "sweep", - "transform": "negative-Y" - }, - { - "alias": "alloc-ops", - "yaxis": 2 - }, - { - "alias": "swepp-ops", - "transform": "negative-Y", - "yaxis": 2 - } - ], + "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "irate(go_memstats_alloc_bytes_total{instance=~\"$instance\"}[30s])", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{tidb_cluster=\"$tidb_cluster\", store!=\"0\",instance=~\"$instance\"}[30s])) by (le, store))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "alloc", + "legendFormat": "tidb-to-store{{store}}", "refId": "A" }, { - "expr": "irate((go_memstats_alloc_bytes_total{instance=~\"$instance\"} - go_memstats_heap_alloc_bytes{instance=~\"$instance\"})[30s:])", + "expr": "histogram_quantile(0.99, sum(rate(tikv_grpc_msg_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!=\"kv_gc\"}[30s])) by (le, instance))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "sweep", + "legendFormat": "tikv-{{instance}}-side", "refId": "B" - }, - { - "expr": "irate(go_memstats_mallocs_total{instance=~\"$instance\"}[30s])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "alloc-ops", - "refId": "C" - }, - { - "expr": "irate(go_memstats_frees_total{instance=~\"$instance\"}[30s])", - "format": "time_series", - "intervalFactor": 1, - "legendFormat": "swepp-ops", - "refId": "D" } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "Allocator Throughput", + "title": "KV RPC Latency", "tooltip": { "shared": true, "sort": 0, @@ -859,7 +867,7 @@ }, "yaxes": [ { - "format": "Bps", + "format": "s", "label": null, "logBase": 1, "max": null, @@ -867,7 +875,7 @@ "show": true }, { - "format": "ops", + "format": "short", "label": null, "logBase": 1, "max": null, @@ -876,7 +884,7 @@ } ], "yaxis": { - "align": true, + "align": false, "alignLevel": null } }, @@ -891,8 +899,8 @@ "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 22 + "x": 12, + "y": 29 }, "id": 18, "legend": { @@ -912,19 +920,20 @@ "pointradius": 2, "points": false, "renderer": "flot", + "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[30s])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[30s])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "tidb-side", "refId": "A" }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_server_handle_tso_duration_seconds_bucket[30s])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_server_handle_tso_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "pd-side", @@ -972,36 +981,171 @@ "alignLevel": null } }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateSpectral", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": "${DS_TEST-CLUSTER}", + "description": "Number of requests in each batch", + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 36 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 23, + "legend": { + "show": false + }, + "links": [], + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(tidb_tikvclient_batch_requests_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le)", + "format": "heatmap", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "A", + "step": 40 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Requests Batch Size", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "none", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, + { + "cards": { + "cardPadding": null, + "cardRound": null + }, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateSpectral", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "tsbuckets", + "datasource": "${DS_TEST-CLUSTER}", + "description": "Number of requests in queue", + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 36 + }, + "heatmap": {}, + "hideZeroBuckets": true, + "highlightCards": true, + "id": 24, + "legend": { + "show": false + }, + "links": [], + "reverseYBuckets": false, + "targets": [ + { + "expr": "sum(increase(tidb_tikvclient_batch_pending_requests_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le)", + "format": "heatmap", + "intervalFactor": 1, + "legendFormat": "{{le}}", + "refId": "A", + "step": 40 + } + ], + "timeFrom": null, + "timeShift": null, + "title": "Pending Requests", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "xBucketNumber": null, + "xBucketSize": null, + "yAxis": { + "decimals": null, + "format": "none", + "logBase": 1, + "max": null, + "min": null, + "show": true, + "splitFactor": null + }, + "yBucketBound": "auto", + "yBucketNumber": null, + "yBucketSize": null + }, { "aliasColors": {}, - "bars": true, + "bars": false, "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "The Go garbage collection counts in the last 15s", + "description": "The time spend on enqueue request", + "editable": true, + "error": false, "fill": 1, + "grid": {}, "gridPos": { "h": 7, "w": 12, - "x": 12, - "y": 22 + "x": 0, + "y": 43 }, - "id": 10, + "id": 26, "legend": { "alignAsTable": false, "avg": false, - "current": true, - "max": true, + "current": false, + "max": false, "min": false, "rightSide": false, "show": true, "total": false, - "values": true + "values": false }, - "lines": false, - "linewidth": 1, + "lines": true, + "linewidth": 2, "links": [], - "nullPointMode": "null", + "nullPointMode": "null as zero", "percentage": false, "pointradius": 5, "points": false, @@ -1012,22 +1156,40 @@ "steppedLine": false, "targets": [ { - "expr": "idelta(go_gc_duration_seconds_count{instance=~\"$instance\"}[30s]) > 0", + "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_batch_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "count", - "refId": "A" + "legendFormat": "999", + "refId": "A", + "step": 10 + }, + { + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_batch_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "99", + "refId": "B", + "step": 10 + }, + { + "expr": "histogram_quantile(0.95, sum(rate(tidb_tikvclient_batch_wait_duration_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "95", + "refId": "C", + "step": 10 } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "GC Count (in the last 15s)", + "title": "Request Enqueue Duration", "tooltip": { + "msResolution": false, "shared": true, "sort": 0, - "value_type": "individual" + "value_type": "cumulative" }, "type": "graph", "xaxis": { @@ -1039,11 +1201,11 @@ }, "yaxes": [ { - "format": "none", + "format": "ns", "label": null, "logBase": 1, "max": null, - "min": null, + "min": "0", "show": true }, { @@ -1066,61 +1228,77 @@ "dashLength": 10, "dashes": false, "datasource": "${DS_TEST-CLUSTER}", - "description": "TiDB side and TiKV side RPC duration.", + "description": "Time spend on enqueue batch into gRPC", + "editable": true, + "error": false, "fill": 1, + "grid": {}, "gridPos": { "h": 7, "w": 12, - "x": 0, - "y": 29 + "x": 12, + "y": 43 }, - "id": 19, + "id": 28, "legend": { + "alignAsTable": false, "avg": false, "current": false, - "hideEmpty": true, - "max": true, + "max": false, "min": false, + "rightSide": false, "show": true, "total": false, - "values": true + "values": false }, "lines": true, - "linewidth": 1, + "linewidth": 2, "links": [], - "nullPointMode": "null", + "nullPointMode": "null as zero", "percentage": false, - "pointradius": 2, + "pointradius": 5, "points": false, "renderer": "flot", + "seriesOverrides": [], "spaceLength": 10, "stack": false, "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{store!=\"0\",instance=~\"$instance\"}[30s])) by (le, store))", + "expr": "histogram_quantile(0.9999, sum(rate(tidb_tikvclient_batch_send_latency_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "tidb-to-store{{store}}", - "refId": "A" + "legendFormat": "9999", + "refId": "A", + "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(tikv_grpc_msg_duration_seconds_bucket{type!=\"kv_gc\"}[30s])) by (le, instance))", + "expr": "histogram_quantile(0.999, sum(rate(tidb_tikvclient_batch_send_latency_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", "format": "time_series", "intervalFactor": 1, - "legendFormat": "tikv-{{instance}}-side", - "refId": "B" + "legendFormat": "999", + "refId": "B", + "step": 10 + }, + { + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_batch_send_latency_bucket{tidb_cluster=\"$tidb_cluster\", instance=~\"$instance\"}[30s])) by (le, instance))", + "format": "time_series", + "intervalFactor": 1, + "legendFormat": "99", + "refId": "C", + "step": 10 } ], "thresholds": [], "timeFrom": null, "timeRegions": [], "timeShift": null, - "title": "KV RPC Latency", + "title": "Batch Enqueue Duration", "tooltip": { + "msResolution": false, "shared": true, "sort": 0, - "value_type": "individual" + "value_type": "cumulative" }, "type": "graph", "xaxis": { @@ -1132,11 +1310,11 @@ }, "yaxes": [ { - "format": "s", + "format": "ns", "label": null, "logBase": 1, "max": null, - "min": null, + "min": "0", "show": true }, { @@ -1165,18 +1343,43 @@ "tags": [], "templating": { "list": [ + { + "allValue": null, + "current": { + }, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "tidb_cluster", + "multi": false, + "name": "tidb_cluster", + "options": [ + + ], + "query": "label_values(pd_cluster_status, tidb_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [ + + ], + "tagsQuery": "", + "type": "query", + "useTags": false + }, { "allValue": null, "current": {}, "datasource": "${DS_TEST-CLUSTER}", - "definition": "label_values(process_start_time_seconds{job=\"tidb\"}, instance)", + "definition": "label_values(process_start_time_seconds{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}, instance)", "hide": 0, "includeAll": true, "label": "instance", "multi": false, "name": "instance", "options": [], - "query": "label_values(process_start_time_seconds{job=\"tidb\"}, instance)", + "query": "label_values(process_start_time_seconds{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}, instance)", "refresh": 1, "regex": "", "skipUrlSync": false, diff --git a/metrics/grafana/tidb_summary.json b/metrics/grafana/tidb_summary.json index 6c86b3964f78d..0d12628605f2e 100644 --- a/metrics/grafana/tidb_summary.json +++ b/metrics/grafana/tidb_summary.json @@ -109,7 +109,7 @@ "steppedLine": false, "targets": [ { - "expr": "(time() - process_start_time_seconds{job=\"tidb\"})", + "expr": "(time() - process_start_time_seconds{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"})", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -209,7 +209,7 @@ "steppedLine": false, "targets": [ { - "expr": "tidb_server_connections", + "expr": "tidb_server_connections{tidb_cluster=\"$tidb_cluster\"}", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -217,7 +217,7 @@ "step": 40 }, { - "expr": "sum(tidb_server_connections)", + "expr": "sum(tidb_server_connections{tidb_cluster=\"$tidb_cluster\"})", "format": "time_series", "intervalFactor": 2, "legendFormat": "total", @@ -317,7 +317,7 @@ "steppedLine": false, "targets": [ { - "expr": "rate(process_cpu_seconds_total{job=\"tidb\"}[1m])", + "expr": "rate(process_cpu_seconds_total{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}[1m])", "format": "time_series", "hide": false, "intervalFactor": 2, @@ -415,14 +415,14 @@ "steppedLine": false, "targets": [ { - "expr": "process_resident_memory_bytes{job=\"tidb\"}", + "expr": "process_resident_memory_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "process-{{instance}}", "refId": "A" }, { - "expr": "go_memstats_heap_sys_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_sys_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -430,14 +430,14 @@ "refId": "B" }, { - "expr": "go_memstats_heap_inuse_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_inuse_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "intervalFactor": 1, "legendFormat": "HeapInuse-{{instance}}", "refId": "C" }, { - "expr": "go_memstats_heap_alloc_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_alloc_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -445,7 +445,7 @@ "refId": "D" }, { - "expr": "go_memstats_heap_idle_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_idle_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "format": "time_series", "hide": true, "intervalFactor": 1, @@ -453,7 +453,7 @@ "refId": "E" }, { - "expr": "go_memstats_heap_released_bytes{job=\"tidb\"}", + "expr": "go_memstats_heap_released_bytes{tidb_cluster=\"$tidb_cluster\", job=\"tidb\"}", "hide": true, "interval": "", "legendFormat": "HeapReleased-{{instance}}", @@ -558,21 +558,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{sql_type!=\"internal\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type!=\"internal\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{sql_type!=\"internal\"}[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_server_handle_query_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type!=\"internal\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95", "refId": "C" }, { - "expr": "sum(rate(tidb_server_handle_query_duration_seconds_sum{sql_type!=\"internal\"}[30s])) / sum(rate(tidb_server_handle_query_duration_seconds_count{sql_type!=\"internal\"}[30s]))", + "expr": "sum(rate(tidb_server_handle_query_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\", sql_type!=\"internal\"}[30s])) / sum(rate(tidb_server_handle_query_duration_seconds_count{tidb_cluster=\"$tidb_cluster\", sql_type!=\"internal\"}[30s]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "avg", @@ -664,7 +664,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(increase(tidb_server_execute_error_total[1m])) by (type, instance)", + "expr": "sum(increase(tidb_server_execute_error_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": " {{type}}-{{instance}}", @@ -762,7 +762,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_query_total[1m])) by (result)", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (result)", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -771,7 +771,7 @@ "step": 60 }, { - "expr": "sum(rate(tidb_server_query_total{result=\"OK\"}[1m] offset 1d))", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\", result=\"OK\"}[1m] offset 1d))", "format": "time_series", "hide": true, "instant": false, @@ -781,7 +781,7 @@ "step": 90 }, { - "expr": "sum(tidb_server_connections) * sum(rate(tidb_server_handle_query_duration_seconds_count[1m])) / sum(rate(tidb_server_handle_query_duration_seconds_sum[1m]))", + "expr": "sum(tidb_server_connections{tidb_cluster=\"$tidb_cluster\"}) * sum(rate(tidb_server_handle_query_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) / sum(rate(tidb_server_handle_query_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "hide": true, "instant": false, @@ -888,7 +888,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_query_total[1m])) by (instance)", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}} ", @@ -987,7 +987,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_executor_statement_total[1m])) by (type)", + "expr": "sum(rate(tidb_executor_statement_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -995,7 +995,7 @@ "step": 30 }, { - "expr": "sum(rate(tidb_executor_statement_total[1m]))", + "expr": "sum(rate(tidb_executor_statement_total{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 1, "legendFormat": "total", @@ -1089,7 +1089,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_query_total[1m])) by (type)", + "expr": "sum(rate(tidb_server_query_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": " {{type}}", @@ -1201,7 +1201,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_parse_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_parse_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -1210,7 +1210,7 @@ "step": 30 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_parse_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_parse_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "95", @@ -1309,7 +1309,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_compile_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_compile_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -1318,7 +1318,7 @@ "step": 30 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_compile_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_compile_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "95", @@ -1417,7 +1417,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_execute_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_execute_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "instant": false, "intervalFactor": 2, @@ -1426,7 +1426,7 @@ "step": 30 }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_execute_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_execute_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 1, "legendFormat": "95", @@ -1524,7 +1524,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_server_plan_cache_total[1m])) by (type)", + "expr": "sum(rate(tidb_server_plan_cache_total{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -1632,7 +1632,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_session_transaction_duration_seconds_count[1m])) by (type, txn_mode)", + "expr": "sum(rate(tidb_session_transaction_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type, txn_mode)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}-{{txn_mode}}", @@ -1723,21 +1723,21 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99-{{txn_mode}}", "refId": "A" }, { - "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.95, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "95-{{txn_mode}}", "refId": "B" }, { - "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket{sql_type=\"general\"}[1m])) by (le, txn_mode))", + "expr": "histogram_quantile(0.80, sum(rate(tidb_session_transaction_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", sql_type=\"general\"}[1m])) by (le, txn_mode))", "format": "time_series", "intervalFactor": 2, "legendFormat": "80-{{txn_mode}}", @@ -1825,7 +1825,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_session_transaction_statement_num_bucket[30s])) by (le))", + "expr": "histogram_quantile(1, sum(rate(tidb_session_transaction_statement_num_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "max", @@ -1917,7 +1917,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1.0, sum(rate(tidb_session_retry_num_bucket[30s])) by (le))", + "expr": "histogram_quantile(1.0, sum(rate(tidb_session_retry_num_bucket{tidb_cluster=\"$tidb_cluster\"}[30s])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "max", @@ -2027,7 +2027,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{type!=\"GC\"}[1m])) by (le, store))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!=\"GC\"}[1m])) by (le, store))", "format": "time_series", "intervalFactor": 2, "legendFormat": "store-{{store}}", @@ -2122,7 +2122,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{type!=\"GC\"}[1m])) by (le,type))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_tikvclient_request_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type!=\"GC\"}[1m])) by (le,type))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2215,7 +2215,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_request_seconds_count[1m])) by (type)", + "expr": "sum(rate(tidb_tikvclient_request_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (type)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{type}}", @@ -2309,7 +2309,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count[1m])) by (instance)", + "expr": "sum(rate(tidb_tikvclient_txn_cmd_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2405,7 +2405,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_write_size_bytes_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_write_size_bytes_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2500,7 +2500,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_write_kv_num_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_write_kv_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2594,7 +2594,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_regions_num_bucket[1m])) by (le, instance))", + "expr": "histogram_quantile(1, sum(rate(tidb_tikvclient_txn_regions_num_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le, instance))", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2686,7 +2686,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -2694,14 +2694,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{type=\"wait\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_cmd_handle_cmds_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"wait\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -2791,7 +2791,7 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.999, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.999, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "999", @@ -2799,14 +2799,14 @@ "step": 10 }, { - "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "histogram_quantile(0.90, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{type=\"tso\"}[1m])) by (le))", + "expr": "histogram_quantile(0.90, sum(rate(pd_client_request_handle_requests_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\", type=\"tso\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "90", @@ -2895,7 +2895,7 @@ "steppedLine": false, "targets": [ { - "expr": "sum(rate(tidb_autoid_operation_duration_seconds_count[1m])) by (instance)", + "expr": "sum(rate(tidb_autoid_operation_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m])) by (instance)", "format": "time_series", "intervalFactor": 2, "legendFormat": "{{instance}}", @@ -2984,14 +2984,14 @@ "steppedLine": false, "targets": [ { - "expr": "histogram_quantile(0.99, sum(rate(tidb_autoid_operation_duration_seconds_bucket[1m])) by (le))", + "expr": "histogram_quantile(0.99, sum(rate(tidb_autoid_operation_duration_seconds_bucket{tidb_cluster=\"$tidb_cluster\"}[1m])) by (le))", "format": "time_series", "intervalFactor": 2, "legendFormat": "99", "refId": "B" }, { - "expr": "sum(rate(tidb_autoid_operation_duration_seconds_sum[1m])) / sum(rate(tidb_autoid_operation_duration_seconds_count[1m]))", + "expr": "sum(rate(tidb_autoid_operation_duration_seconds_sum{tidb_cluster=\"$tidb_cluster\"}[1m])) / sum(rate(tidb_autoid_operation_duration_seconds_count{tidb_cluster=\"$tidb_cluster\"}[1m]))", "format": "time_series", "intervalFactor": 2, "legendFormat": "avg", @@ -3050,7 +3050,33 @@ "style": "dark", "tags": [], "templating": { - "list": [] + "list": [ + { + "allValue": null, + "current": { + }, + "datasource": "${DS_TEST-CLUSTER}", + "hide": 2, + "includeAll": false, + "label": "tidb_cluster", + "multi": false, + "name": "tidb_cluster", + "options": [ + + ], + "query": "label_values(pd_cluster_status, tidb_cluster)", + "refresh": 2, + "regex": "", + "sort": 1, + "tagValuesQuery": "", + "tags": [ + + ], + "tagsQuery": "", + "type": "query", + "useTags": false + } + ] }, "time": { "from": "now-1h", diff --git a/metrics/metrics.go b/metrics/metrics.go index be843ad6f02f0..daa5ffbc7bb14 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -13,7 +13,10 @@ package metrics -import "github.com/prometheus/client_golang/prometheus" +import ( + tikvmetrics "github.com/pingcap/tidb/store/tikv/metrics" + "github.com/prometheus/client_golang/prometheus" +) var ( // PanicCounter measures the count of panics. @@ -73,7 +76,7 @@ func RegisterMetrics() { prometheus.MustRegister(CriticalErrorCounter) prometheus.MustRegister(DDLCounter) prometheus.MustRegister(BackfillTotalCounter) - prometheus.MustRegister(AddIndexProgress) + prometheus.MustRegister(BackfillProgressGauge) prometheus.MustRegister(DDLWorkerHistogram) prometheus.MustRegister(DeploySyncerHistogram) prometheus.MustRegister(DistSQLPartialCountHistogram) @@ -116,22 +119,6 @@ func RegisterMetrics() { prometheus.MustRegister(StmtNodeCounter) prometheus.MustRegister(DbStmtNodeCounter) prometheus.MustRegister(StoreQueryFeedbackCounter) - prometheus.MustRegister(GetStoreLimitErrorCounter) - prometheus.MustRegister(TiKVBackoffHistogram) - prometheus.MustRegister(TiKVCoprocessorHistogram) - prometheus.MustRegister(TiKVLoadSafepointCounter) - prometheus.MustRegister(TiKVLockResolverCounter) - prometheus.MustRegister(TiKVRawkvCmdHistogram) - prometheus.MustRegister(TiKVRawkvSizeHistogram) - prometheus.MustRegister(TiKVRegionCacheCounter) - prometheus.MustRegister(TiKVRegionErrorCounter) - prometheus.MustRegister(TiKVSecondaryLockCleanupFailureCounter) - prometheus.MustRegister(TiKVSendReqHistogram) - prometheus.MustRegister(TiKVTxnCmdHistogram) - prometheus.MustRegister(TiKVTxnRegionsNumHistogram) - prometheus.MustRegister(TiKVTxnWriteKVCountHistogram) - prometheus.MustRegister(TiKVTxnWriteSizeHistogram) - prometheus.MustRegister(TiKVLocalLatchWaitTimeHistogram) prometheus.MustRegister(TimeJumpBackCounter) prometheus.MustRegister(TransactionDuration) prometheus.MustRegister(StatementDeadlockDetectDuration) @@ -151,22 +138,15 @@ func RegisterMetrics() { prometheus.MustRegister(TotalQueryProcHistogram) prometheus.MustRegister(TotalCopProcHistogram) prometheus.MustRegister(TotalCopWaitHistogram) - prometheus.MustRegister(TiKVPendingBatchRequests) - prometheus.MustRegister(TiKVStatusDuration) - prometheus.MustRegister(TiKVStatusCounter) - prometheus.MustRegister(TiKVBatchWaitDuration) - prometheus.MustRegister(TiKVBatchClientUnavailable) - prometheus.MustRegister(TiKVBatchClientWaitEstablish) - prometheus.MustRegister(TiKVRangeTaskStats) - prometheus.MustRegister(TiKVRangeTaskPushDuration) prometheus.MustRegister(HandleSchemaValidate) - prometheus.MustRegister(TiKVTokenWaitDuration) - prometheus.MustRegister(TiKVTxnHeartBeatHistogram) - prometheus.MustRegister(TiKVPessimisticLockKeysDuration) prometheus.MustRegister(GRPCConnTransientFailureCounter) - prometheus.MustRegister(TiKVTTLLifeTimeReachCounter) - prometheus.MustRegister(TiKVNoAvailableConnectionCounter) - prometheus.MustRegister(TiKVAsyncCommitTxnCounter) prometheus.MustRegister(MaxProcs) prometheus.MustRegister(GOGC) + prometheus.MustRegister(ConnIdleDurationHistogram) + prometheus.MustRegister(ServerInfo) + prometheus.MustRegister(TokenGauge) + prometheus.MustRegister(ConfigStatus) + + tikvmetrics.InitMetrics("tidb", "tikvclient") + tikvmetrics.RegisterMetrics() } diff --git a/metrics/server.go b/metrics/server.go index 7091c0f997fc0..7ce2296117b92 100644 --- a/metrics/server.go +++ b/metrics/server.go @@ -146,30 +146,30 @@ var ( Buckets: prometheus.ExponentialBuckets(1, 2, 30), // 1us ~ 528s }) - TotalQueryProcHistogram = prometheus.NewHistogram( + TotalQueryProcHistogram = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "tidb", Subsystem: "server", Name: "slow_query_process_duration_seconds", Help: "Bucketed histogram of processing time (s) of of slow queries.", Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - }) - TotalCopProcHistogram = prometheus.NewHistogram( + }, []string{LblSQLType}) + TotalCopProcHistogram = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "tidb", Subsystem: "server", Name: "slow_query_cop_duration_seconds", Help: "Bucketed histogram of all cop processing time (s) of of slow queries.", Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - }) - TotalCopWaitHistogram = prometheus.NewHistogram( + }, []string{LblSQLType}) + TotalCopWaitHistogram = prometheus.NewHistogramVec( prometheus.HistogramOpts{ Namespace: "tidb", Subsystem: "server", Name: "slow_query_wait_duration_seconds", Help: "Bucketed histogram of all cop waiting time (s) of of slow queries.", Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - }) + }, []string{LblSQLType}) MaxProcs = prometheus.NewGauge( prometheus.GaugeOpts{ @@ -186,6 +186,40 @@ var ( Name: "gogc", Help: "The value of GOGC", }) + + ConnIdleDurationHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "conn_idle_duration_seconds", + Help: "Bucketed histogram of connection idle time (s).", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }, []string{LblInTxn}) + + ServerInfo = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "info", + Help: "Indicate the tidb server info, and the value is the start timestamp (s).", + }, []string{LblVersion, LblHash}) + + TokenGauge = prometheus.NewGauge( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "server", + Name: "tokens", + Help: "The number of concurrent executing session", + }, + ) + + ConfigStatus = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: "tidb", + Subsystem: "config", + Name: "status", + Help: "Status of the TiDB server configurations.", + }, []string{LblType}) ) // ExecuteErrorToLabel converts an execute error to label. diff --git a/metrics/session.go b/metrics/session.go index 4838ee771ac8b..f2d682a6dd22b 100644 --- a/metrics/session.go +++ b/metrics/session.go @@ -142,4 +142,8 @@ const ( LblAddress = "address" LblBatchGet = "batch_get" LblGet = "get" + LblLockKeys = "lock_keys" + LblInTxn = "in_txn" + LblVersion = "version" + LblHash = "hash" ) diff --git a/metrics/stats.go b/metrics/stats.go index 25e219a97da11..a37bb08232bb2 100644 --- a/metrics/stats.go +++ b/metrics/stats.go @@ -45,13 +45,13 @@ var ( Buckets: prometheus.ExponentialBuckets(0.01, 2, 14), }) - PseudoEstimation = prometheus.NewCounter( + PseudoEstimation = prometheus.NewCounterVec( prometheus.CounterOpts{ Namespace: "tidb", Subsystem: "statistics", Name: "pseudo_estimation_total", Help: "Counter of pseudo estimation caused by outdated stats.", - }) + }, []string{LblType}) DumpFeedbackCounter = prometheus.NewCounterVec( prometheus.CounterOpts{ @@ -77,14 +77,6 @@ var ( Help: "Counter of storing query feedback.", }, []string{LblType}) - GetStoreLimitErrorCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "statistics", - Name: "get_store_limit_token_error", - Help: "store token is up to the limit, probably because one of the stores is the hotspot or unavailable", - }, []string{LblAddress, LblStore}) - SignificantFeedbackCounter = prometheus.NewCounter( prometheus.CounterOpts{ Namespace: "tidb", diff --git a/metrics/tikvclient.go b/metrics/tikvclient.go deleted file mode 100644 index 73747ba04225b..0000000000000 --- a/metrics/tikvclient.go +++ /dev/null @@ -1,267 +0,0 @@ -// Copyright 2018 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package metrics - -import "github.com/prometheus/client_golang/prometheus" - -// TiKVClient metrics. -var ( - TiKVTxnCmdHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "txn_cmd_duration_seconds", - Help: "Bucketed histogram of processing time of txn cmds.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days - }, []string{LblType}) - - TiKVBackoffHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "backoff_seconds", - Help: "total backoff seconds of a single backoffer.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days - }, []string{LblType}) - - TiKVSendReqHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "request_seconds", - Help: "Bucketed histogram of sending request duration.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days - }, []string{LblType, LblStore}) - - TiKVCoprocessorHistogram = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "cop_duration_seconds", - Help: "Run duration of a single coprocessor task, includes backoff time.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days - }) - - TiKVLockResolverCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "lock_resolver_actions_total", - Help: "Counter of lock resolver actions.", - }, []string{LblType}) - - TiKVRegionErrorCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "region_err_total", - Help: "Counter of region errors.", - }, []string{LblType}) - - TiKVTxnWriteKVCountHistogram = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "txn_write_kv_num", - Help: "Count of kv pairs to write in a transaction.", - Buckets: prometheus.ExponentialBuckets(1, 4, 17), // 1 ~ 4G - }) - - TiKVTxnWriteSizeHistogram = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "txn_write_size_bytes", - Help: "Size of kv pairs to write in a transaction.", - Buckets: prometheus.ExponentialBuckets(16, 4, 17), // 16Bytes ~ 64GB - }) - - TiKVRawkvCmdHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "rawkv_cmd_seconds", - Help: "Bucketed histogram of processing time of rawkv cmds.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days - }, []string{LblType}) - - TiKVRawkvSizeHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "rawkv_kv_size_bytes", - Help: "Size of key/value to put, in bytes.", - Buckets: prometheus.ExponentialBuckets(1, 2, 30), // 1Byte ~ 512MB - }, []string{LblType}) - - TiKVTxnRegionsNumHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "txn_regions_num", - Help: "Number of regions in a transaction.", - Buckets: prometheus.ExponentialBuckets(1, 2, 25), // 1 ~ 16M - }, []string{LblType}) - - TiKVLoadSafepointCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "load_safepoint_total", - Help: "Counter of load safepoint.", - }, []string{LblType}) - - TiKVSecondaryLockCleanupFailureCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "lock_cleanup_task_total", - Help: "failure statistic of secondary lock cleanup task.", - }, []string{LblType}) - - TiKVRegionCacheCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "region_cache_operations_total", - Help: "Counter of region cache.", - }, []string{LblType, LblResult}) - - TiKVLocalLatchWaitTimeHistogram = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "local_latch_wait_seconds", - Help: "Wait time of a get local latch.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 20), // 0.5ms ~ 262s - }) - - // TiKVPendingBatchRequests indicates the number of requests pending in the batch channel. - TiKVPendingBatchRequests = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "pending_batch_requests", - Help: "Pending batch requests", - }, []string{"store"}) - - TiKVStatusDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "kv_status_api_duration", - Help: "duration for kv status api.", - Buckets: prometheus.ExponentialBuckets(0.0005, 2, 20), // 0.5ms ~ 262s - }, []string{"store"}) - - TiKVStatusCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "kv_status_api_count", - Help: "Counter of access kv status api.", - }, []string{LblResult}) - - TiKVBatchWaitDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "batch_wait_duration", - Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s - Help: "batch wait duration", - }) - - TiKVBatchClientUnavailable = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "batch_client_unavailable_seconds", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - Help: "batch client unavailable", - }) - TiKVBatchClientWaitEstablish = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "batch_client_wait_connection_establish", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days - Help: "batch client wait new connection establish", - }) - - TiKVRangeTaskStats = prometheus.NewGaugeVec( - prometheus.GaugeOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "range_task_stats", - Help: "stat of range tasks", - }, []string{LblType, LblResult}) - - TiKVRangeTaskPushDuration = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "range_task_push_duration", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s - Help: "duration to push sub tasks to range task workers", - }, []string{LblType}) - TiKVTokenWaitDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "batch_executor_token_wait_duration", - Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s - Help: "tidb txn token wait duration to process batches", - }) - - TiKVTxnHeartBeatHistogram = prometheus.NewHistogramVec( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "txn_heart_beat", - Help: "Bucketed histogram of the txn_heartbeat request duration.", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s - }, []string{LblType}) - TiKVPessimisticLockKeysDuration = prometheus.NewHistogram( - prometheus.HistogramOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "pessimistic_lock_keys_duration", - Buckets: prometheus.ExponentialBuckets(0.001, 2, 24), // 1ms ~ 8389s - Help: "tidb txn pessimistic lock keys duration", - }) - - TiKVTTLLifeTimeReachCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "ttl_lifetime_reach_total", - Help: "Counter of ttlManager live too long.", - }) - - TiKVNoAvailableConnectionCounter = prometheus.NewCounter( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "batch_client_no_available_connection_total", - Help: "Counter of no available batch client.", - }) - - TiKVAsyncCommitTxnCounter = prometheus.NewCounterVec( - prometheus.CounterOpts{ - Namespace: "tidb", - Subsystem: "tikvclient", - Name: "async_commit_txn_counter", - Help: "Counter of async commit transactions.", - }, []string{LblType}) -) diff --git a/owner/fail_test.go b/owner/fail_test.go index 63130d2b3b464..dbb97b98193ad 100644 --- a/owner/fail_test.go +++ b/owner/fail_test.go @@ -16,6 +16,7 @@ package owner import ( "context" + "fmt" "math" "net" "os" @@ -37,7 +38,10 @@ import ( func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, "", "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Fatal(err) + } TestingT(t) } @@ -53,13 +57,14 @@ func (s *testSuite) TearDownSuite(c *C) { } var ( - endpoints = []string{"unix://new_session:12379"} dialTimeout = 5 * time.Second retryCnt = math.MaxInt32 ) func (s *testSuite) TestFailNewSession(c *C) { ln, err := net.Listen("unix", "new_session:0") + addr := ln.Addr() + endpoints := []string{fmt.Sprintf("%s://%s", addr.Network(), addr.String())} c.Assert(err, IsNil) srv := grpc.NewServer(grpc.ConnectionTimeout(time.Minute)) var stop sync.WaitGroup diff --git a/owner/manager_test.go b/owner/manager_test.go index 920dff8d10208..e25b204e6bbb4 100644 --- a/owner/manager_test.go +++ b/owner/manager_test.go @@ -61,7 +61,12 @@ func TestSingle(t *testing.T) { if err != nil { t.Fatal(err) } - defer store.Close() + defer func() { + err := store.Close() + if err != nil { + t.Fatal(err) + } + }() clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 1}) defer clus.Terminate(t) @@ -77,7 +82,9 @@ func TestSingle(t *testing.T) { if err != nil { t.Fatalf("DDL start failed %v", err) } - defer d.Stop() + defer func() { + _ = d.Stop() + }() isOwner := checkOwner(d, true) if !isOwner { @@ -125,7 +132,12 @@ func TestCluster(t *testing.T) { if err != nil { t.Fatal(err) } - defer store.Close() + defer func() { + err := store.Close() + if err != nil { + t.Fatal(err) + } + }() clus := integration.NewClusterV3(t, &integration.ClusterConfig{Size: 4}) defer clus.Terminate(t) @@ -170,7 +182,10 @@ func TestCluster(t *testing.T) { if isOwner { t.Fatalf("expect false, got isOwner:%v", isOwner) } - d.Stop() + err = d.Stop() + if err != nil { + t.Fatal(err, IsNil) + } // d3 (not owner) stop cli3 := clus.Client(3) @@ -184,15 +199,26 @@ func TestCluster(t *testing.T) { if err != nil { t.Fatalf("DDL start failed %v", err) } - defer d3.Stop() + defer func() { + err = d3.Stop() + if err != nil { + t.Fatal(err, IsNil) + } + }() isOwner = checkOwner(d3, false) if isOwner { t.Fatalf("expect false, got isOwner:%v", isOwner) } - d3.Stop() + err = d3.Stop() + if err != nil { + t.Fatal(err, IsNil) + } // Cancel the owner context, there is no owner. - d1.Stop() + err = d1.Stop() + if err != nil { + t.Fatal(err, IsNil) + } time.Sleep(time.Duration(tmpTTL+1) * time.Second) session, err := concurrency.NewSession(cliRW) if err != nil { diff --git a/planner/cascades/enforcer_rules.go b/planner/cascades/enforcer_rules.go index 183169ffa3913..5d80845769c5e 100644 --- a/planner/cascades/enforcer_rules.go +++ b/planner/cascades/enforcer_rules.go @@ -63,9 +63,9 @@ func (e *OrderEnforcer) NewProperty(prop *property.PhysicalProperty) (newProp *p func (e *OrderEnforcer) OnEnforce(reqProp *property.PhysicalProperty, child memo.Implementation) (impl memo.Implementation) { childPlan := child.GetPlan() sort := plannercore.PhysicalSort{ - ByItems: make([]*util.ByItems, 0, len(reqProp.Items)), + ByItems: make([]*util.ByItems, 0, len(reqProp.SortItems)), }.Init(childPlan.SCtx(), childPlan.Stats(), childPlan.SelectBlockOffset(), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) - for _, item := range reqProp.Items { + for _, item := range reqProp.SortItems { item := &util.ByItems{ Expr: item.Col, Desc: item.Desc, diff --git a/planner/cascades/enforcer_rules_test.go b/planner/cascades/enforcer_rules_test.go index 94cc96bd31991..adfdba887b51d 100644 --- a/planner/cascades/enforcer_rules_test.go +++ b/planner/cascades/enforcer_rules_test.go @@ -26,7 +26,7 @@ func (s *testCascadesSuite) TestGetEnforcerRules(c *C) { enforcers := GetEnforcerRules(group, prop) c.Assert(enforcers, IsNil) col := &expression.Column{} - prop.Items = append(prop.Items, property.Item{Col: col}) + prop.SortItems = append(prop.SortItems, property.SortItem{Col: col}) enforcers = GetEnforcerRules(group, prop) c.Assert(enforcers, NotNil) c.Assert(len(enforcers), Equals, 1) @@ -38,9 +38,9 @@ func (s *testCascadesSuite) TestNewProperties(c *C) { prop := &property.PhysicalProperty{} col := &expression.Column{} group := memo.NewGroupWithSchema(nil, expression.NewSchema()) - prop.Items = append(prop.Items, property.Item{Col: col}) + prop.SortItems = append(prop.SortItems, property.SortItem{Col: col}) enforcers := GetEnforcerRules(group, prop) orderEnforcer, _ := enforcers[0].(*OrderEnforcer) newProp := orderEnforcer.NewProperty(prop) - c.Assert(newProp.Items, IsNil) + c.Assert(newProp.SortItems, IsNil) } diff --git a/planner/cascades/implementation_rules.go b/planner/cascades/implementation_rules.go index 7596af0eea9fd..d7a08b4fabaab 100644 --- a/planner/cascades/implementation_rules.go +++ b/planner/cascades/implementation_rules.go @@ -194,7 +194,7 @@ type ImplTableScan struct { // Match implements ImplementationRule Match interface. func (r *ImplTableScan) Match(expr *memo.GroupExpr, prop *property.PhysicalProperty) (matched bool) { ts := expr.ExprNode.(*plannercore.LogicalTableScan) - return prop.IsEmpty() || (len(prop.Items) == 1 && ts.HandleCols != nil && prop.Items[0].Col.Equal(nil, ts.HandleCols.GetCol(0))) + return prop.IsEmpty() || (len(prop.SortItems) == 1 && ts.HandleCols != nil && prop.SortItems[0].Col.Equal(nil, ts.HandleCols.GetCol(0))) } // OnImplement implements ImplementationRule OnImplement interface. @@ -204,7 +204,7 @@ func (r *ImplTableScan) OnImplement(expr *memo.GroupExpr, reqProp *property.Phys ts := logicalScan.GetPhysicalScan(logicProp.Schema, logicProp.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt)) if !reqProp.IsEmpty() { ts.KeepOrder = true - ts.Desc = reqProp.Items[0].Desc + ts.Desc = reqProp.SortItems[0].Desc } tblCols, tblColHists := logicalScan.Source.TblCols, logicalScan.Source.TblColHists return []memo.Implementation{impl.NewTableScanImpl(ts, tblCols, tblColHists)}, nil @@ -226,7 +226,7 @@ func (r *ImplIndexScan) OnImplement(expr *memo.GroupExpr, reqProp *property.Phys is := logicalScan.GetPhysicalIndexScan(expr.Group.Prop.Schema, expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt)) if !reqProp.IsEmpty() { is.KeepOrder = true - if reqProp.Items[0].Desc { + if reqProp.SortItems[0].Desc { is.Desc = true } } @@ -272,7 +272,7 @@ func (r *ImplSelection) OnImplement(expr *memo.GroupExpr, reqProp *property.Phys logicalSel := expr.ExprNode.(*plannercore.LogicalSelection) physicalSel := plannercore.PhysicalSelection{ Conditions: logicalSel.Conditions, - }.Init(logicalSel.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicalSel.SelectBlockOffset(), reqProp.Clone()) + }.Init(logicalSel.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), logicalSel.SelectBlockOffset(), reqProp.CloneEssentialFields()) switch expr.Group.EngineType { case memo.EngineTiDB: return []memo.Implementation{impl.NewTiDBSelectionImpl(physicalSel)}, nil @@ -414,10 +414,10 @@ func (r *ImplTopNAsLimit) Match(expr *memo.GroupExpr, prop *property.PhysicalPro func (r *ImplTopNAsLimit) OnImplement(expr *memo.GroupExpr, reqProp *property.PhysicalProperty) ([]memo.Implementation, error) { lt := expr.ExprNode.(*plannercore.LogicalTopN) newProp := &property.PhysicalProperty{ExpectedCnt: float64(lt.Count + lt.Offset)} - newProp.Items = make([]property.Item, len(lt.ByItems)) + newProp.SortItems = make([]property.SortItem, len(lt.ByItems)) for i, item := range lt.ByItems { - newProp.Items[i].Col = item.Expr.(*expression.Column) - newProp.Items[i].Desc = item.Desc + newProp.SortItems[i].Col = item.Expr.(*expression.Column) + newProp.SortItems[i].Desc = item.Desc } physicalLimit := plannercore.PhysicalLimit{ Offset: lt.Offset, @@ -563,7 +563,7 @@ func (r *ImplApply) OnImplement(expr *memo.GroupExpr, reqProp *property.Physical la.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), la.SelectBlockOffset(), - &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, Items: reqProp.Items}, + &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: reqProp.SortItems}, &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) physicalApply.SetSchema(expr.Group.Prop.Schema) return []memo.Implementation{impl.NewApplyImpl(physicalApply)}, nil @@ -596,17 +596,17 @@ type ImplWindow struct { // Match implements ImplementationRule Match interface. func (w *ImplWindow) Match(expr *memo.GroupExpr, prop *property.PhysicalProperty) (matched bool) { lw := expr.ExprNode.(*plannercore.LogicalWindow) - var byItems []property.Item + var byItems []property.SortItem byItems = append(byItems, lw.PartitionBy...) byItems = append(byItems, lw.OrderBy...) - childProperty := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, Items: byItems} + childProperty := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: byItems} return prop.IsPrefix(childProperty) } // OnImplement implements ImplementationRule OnImplement interface. func (w *ImplWindow) OnImplement(expr *memo.GroupExpr, reqProp *property.PhysicalProperty) ([]memo.Implementation, error) { lw := expr.ExprNode.(*plannercore.LogicalWindow) - var byItems []property.Item + var byItems []property.SortItem byItems = append(byItems, lw.PartitionBy...) byItems = append(byItems, lw.OrderBy...) physicalWindow := plannercore.PhysicalWindow{ @@ -618,7 +618,7 @@ func (w *ImplWindow) OnImplement(expr *memo.GroupExpr, reqProp *property.Physica lw.SCtx(), expr.Group.Prop.Stats.ScaleByExpectCnt(reqProp.ExpectedCnt), lw.SelectBlockOffset(), - &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, Items: byItems}, + &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: byItems}, ) physicalWindow.SetSchema(expr.Group.Prop.Schema) return []memo.Implementation{impl.NewWindowImpl(physicalWindow)}, nil diff --git a/planner/cascades/integration_test.go b/planner/cascades/integration_test.go index 16a8103c10847..78a9d4aacc111 100644 --- a/planner/cascades/integration_test.go +++ b/planner/cascades/integration_test.go @@ -284,10 +284,10 @@ func (s *testIntegrationSuite) TestJoin(c *C) { for i, sql := range input { s.testData.OnRecord(func() { output[i].SQL = sql - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + sql).Rows()) output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(sql).Rows()) }) - tk.MustQuery("explain " + sql).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + sql).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(sql).Check(testkit.Rows(output[i].Result...)) } } @@ -411,10 +411,10 @@ func (s *testIntegrationSuite) TestInlineProjection(c *C) { for i, sql := range input { s.testData.OnRecord(func() { output[i].SQL = sql - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + sql).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + sql).Rows()) output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(sql).Rows()) }) - tk.MustQuery("explain " + sql).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + sql).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(sql).Check(testkit.Rows(output[i].Result...)) } } diff --git a/planner/cascades/optimize.go b/planner/cascades/optimize.go index b407eef9ac788..8e9ea74dba72d 100644 --- a/planner/cascades/optimize.go +++ b/planner/cascades/optimize.go @@ -366,7 +366,7 @@ func preparePossibleProperties(g *memo.Group, propertyMap map[*memo.Group][][]*e exprProperties := expr.ExprNode.PreparePossibleProperties(expr.Schema(), childrenProperties...) for _, newPropCols := range exprProperties { // Check if the prop has already been in `groupPropertyMap`. - newProp := property.PhysicalProperty{Items: property.ItemsFromCols(newPropCols, true)} + newProp := property.PhysicalProperty{SortItems: property.SortItemsFromCols(newPropCols, true)} key := newProp.HashCode() if _, ok := groupPropertyMap[string(key)]; !ok { groupPropertyMap[string(key)] = newPropCols diff --git a/planner/cascades/stringer_test.go b/planner/cascades/stringer_test.go index 85314983548c9..c9a64772d8145 100644 --- a/planner/cascades/stringer_test.go +++ b/planner/cascades/stringer_test.go @@ -86,6 +86,6 @@ func (s *testStringerSuite) TestGroupStringer(c *C) { output[i].SQL = sql output[i].Result = ToString(group) }) - c.Assert(ToString(group), DeepEquals, output[i].Result) + c.Assert(ToString(group), DeepEquals, output[i].Result, Commentf("case:%v, sql:%s", i, sql)) } } diff --git a/planner/cascades/testdata/integration_suite_in.json b/planner/cascades/testdata/integration_suite_in.json index 2aabcbf039913..b4f563265813c 100644 --- a/planner/cascades/testdata/integration_suite_in.json +++ b/planner/cascades/testdata/integration_suite_in.json @@ -109,7 +109,8 @@ "select t1.a, t1.b from t1 left join t2 on t1.a = t2.a where t1.a > 2 and t2.b > 200", "select t2.a, t2.b from t1 right join t2 on t1.a = t2.a where t1.a > 2 and t2.b > 200", "select t1.a, t1.b from t1, t2 where t1.a = t2.a order by t1.a", - "select * from t1 join t2 on t1.a = t2.a" + "select * from t1 join t2 on t1.a = t2.a", + "select * from t1 join t2 on t1.a = t2.a and t1.a > 2" ] }, { diff --git a/planner/cascades/testdata/integration_suite_out.json b/planner/cascades/testdata/integration_suite_out.json index 827bf56ab129c..3de732f419ed1 100644 --- a/planner/cascades/testdata/integration_suite_out.json +++ b/planner/cascades/testdata/integration_suite_out.json @@ -197,7 +197,7 @@ " └─Sort_29 6400.00 root test.t.b", " └─Selection_28 6400.00 root gt(Column#4, 1)", " └─HashAgg_19 8000.00 root group by:test.t.b, funcs:avg(Column#11)->Column#3, funcs:sum(Column#12)->Column#4, funcs:firstrow(test.t.b)->test.t.b", - " └─Projection_20 10000.00 root cast(test.t.a, decimal(65,4) BINARY)->Column#11, cast(test.t.a, decimal(65,0) BINARY)->Column#12, test.t.b, test.t.b", + " └─Projection_20 10000.00 root cast(test.t.a, decimal(15,4) BINARY)->Column#11, cast(test.t.a, decimal(32,0) BINARY)->Column#12, test.t.b, test.t.b", " └─TableReader_21 10000.00 root data:TableFullScan_22", " └─TableFullScan_22 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], @@ -223,7 +223,7 @@ "SQL": "select sum(a) from t group by a, a+b order by a", "Plan": [ "Projection_10 10000.00 root Column#3", - "└─Projection_12 10000.00 root cast(test.t.a, decimal(65,0) BINARY)->Column#3, test.t.a", + "└─Projection_12 10000.00 root cast(test.t.a, decimal(32,0) BINARY)->Column#3, test.t.a", " └─TableReader_13 10000.00 root data:TableFullScan_14", " └─TableFullScan_14 10000.00 cop[tikv] table:t keep order:true, stats:pseudo" ], @@ -273,11 +273,11 @@ { "SQL": "select max(a.a) from t a left join t b on a.a = b.a", "Plan": [ - "HashAgg_33 1.00 root funcs:max(test.t.a)->Column#5", - "└─Limit_35 1.00 root offset:0, count:1", - " └─TableReader_40 1.00 root data:Limit_41", - " └─Limit_41 1.00 cop[tikv] offset:0, count:1", - " └─TableFullScan_39 1.00 cop[tikv] table:a keep order:true, desc, stats:pseudo" + "HashAgg_36 1.00 root funcs:max(test.t.a)->Column#5", + "└─Limit_38 1.00 root offset:0, count:1", + " └─TableReader_43 1.00 root data:Limit_44", + " └─Limit_44 1.00 cop[tikv] offset:0, count:1", + " └─TableFullScan_42 1.00 cop[tikv] table:a keep order:true, desc, stats:pseudo" ], "Result": [ "4" @@ -286,10 +286,10 @@ { "SQL": "select avg(a.b) from t a left join t b on a.a = b.a", "Plan": [ - "HashAgg_16 1.00 root funcs:avg(Column#6, Column#7)->Column#5", - "└─TableReader_17 1.00 root data:HashAgg_18", - " └─HashAgg_18 1.00 cop[tikv] funcs:count(test.t.b)->Column#6, funcs:sum(test.t.b)->Column#7", - " └─TableFullScan_15 10000.00 cop[tikv] table:a keep order:false, stats:pseudo" + "HashAgg_17 1.00 root funcs:avg(Column#6, Column#7)->Column#5", + "└─TableReader_18 1.00 root data:HashAgg_19", + " └─HashAgg_19 1.00 cop[tikv] funcs:count(test.t.b)->Column#6, funcs:sum(test.t.b)->Column#7", + " └─TableFullScan_16 10000.00 cop[tikv] table:a keep order:false, stats:pseudo" ], "Result": [ "27.5000" @@ -298,9 +298,9 @@ { "SQL": "select t1.a, max(t1.b) from t as t1 left join (select * from t) as t2 on t1.a = t2.a and t1.b = 3 group by t1.a order by a", "Plan": [ - "Projection_14 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", - "└─TableReader_15 10000.00 root data:TableFullScan_16", - " └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "Projection_15 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", + "└─TableReader_16 10000.00 root data:TableFullScan_17", + " └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -312,9 +312,9 @@ { "SQL": "select t1.a, sum(distinct t1.b) from t as t1 left join (select * from t) as t2 on t1.b = t2.b group by t1.a order by a", "Plan": [ - "Projection_13 10000.00 root test.t.a, cast(test.t.b, decimal(65,0) BINARY)->Column#5", - "└─TableReader_14 10000.00 root data:TableFullScan_15", - " └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "Projection_15 10000.00 root test.t.a, cast(test.t.b, decimal(32,0) BINARY)->Column#5", + "└─TableReader_16 10000.00 root data:TableFullScan_17", + " └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -326,9 +326,9 @@ { "SQL": "select t2.a, max(t2.b) from t as t1 right join (select * from t) as t2 on t1.a = t2.a group by t2.a order by a", "Plan": [ - "Projection_14 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", - "└─TableReader_15 10000.00 root data:TableFullScan_16", - " └─TableFullScan_16 10000.00 cop[tikv] table:t keep order:true, stats:pseudo" + "Projection_15 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", + "└─TableReader_16 10000.00 root data:TableFullScan_17", + " └─TableFullScan_17 10000.00 cop[tikv] table:t keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -340,9 +340,9 @@ { "SQL": "select t3.a, max(t3.b) from (select t1.a, t1.b from t as t1 left join t as t2 on t1.b = t2.b) t3 group by t3.a order by a", "Plan": [ - "Projection_13 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", - "└─TableReader_14 10000.00 root data:TableFullScan_15", - " └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "Projection_18 10000.00 root test.t.a, cast(test.t.b, int(11))->Column#5", + "└─TableReader_19 10000.00 root data:TableFullScan_20", + " └─TableFullScan_20 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -450,7 +450,7 @@ "SQL": "select count(b), sum(b), avg(b), b, max(b), min(b), bit_and(b), bit_or(b), bit_xor(b) from t group by a having sum(b) >= 0 and count(b) >= 0 order by b", "Plan": [ "Projection_13 8000.00 root Column#3, Column#4, Column#5, test.t.b, Column#6, Column#7, Column#8, Column#9, Column#10", - "└─Projection_15 8000.00 root if(isnull(test.t.b), 0, 1)->Column#3, cast(test.t.b, decimal(65,0) BINARY)->Column#4, cast(test.t.b, decimal(65,4) BINARY)->Column#5, test.t.b, cast(test.t.b, int(11))->Column#6, cast(test.t.b, int(11))->Column#7, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 18446744073709551615)->Column#8, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 0)->Column#9, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 0)->Column#10, cast(test.t.b, decimal(65,0) BINARY)->Column#4, if(isnull(test.t.b), 0, 1)->Column#3", + "└─Projection_15 8000.00 root if(isnull(test.t.b), 0, 1)->Column#3, cast(test.t.b, decimal(32,0) BINARY)->Column#4, cast(test.t.b, decimal(15,4) BINARY)->Column#5, test.t.b, cast(test.t.b, int(11))->Column#6, cast(test.t.b, int(11))->Column#7, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 18446744073709551615)->Column#8, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 0)->Column#9, ifnull(cast(test.t.b, bigint(21) UNSIGNED BINARY), 0)->Column#10, cast(test.t.b, decimal(32,0) BINARY)->Column#4, if(isnull(test.t.b), 0, 1)->Column#3", " └─Sort_22 8000.00 root test.t.b", " └─TableReader_19 8000.00 root data:Selection_20", " └─Selection_20 8000.00 cop[tikv] ge(cast(test.t.b), 0), ge(if(isnull(test.t.b), 0, 1), 0)", @@ -501,7 +501,7 @@ "SQL": "select /*+ HASH_AGG() */ avg(distinct a) from t;", "Plan": [ "HashAgg_16 1.00 root funcs:avg(distinct Column#7)->Column#5", - "└─Projection_17 8000.00 root cast(test.t.a, decimal(65,4) BINARY)->Column#7", + "└─Projection_17 8000.00 root cast(test.t.a, decimal(15,4) BINARY)->Column#7", " └─TableReader_18 8000.00 root data:HashAgg_19", " └─HashAgg_19 8000.00 cop[tikv] group by:test.t.a, ", " └─TableFullScan_15 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" @@ -611,7 +611,7 @@ "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ avg(distinct a) from t;", "Plan": [ "HashAgg_8 1.00 root funcs:avg(distinct Column#6)->Column#5", - "└─Projection_9 10000.00 root cast(test.t.a, decimal(65,4) BINARY)->Column#6", + "└─Projection_9 10000.00 root cast(test.t.a, decimal(15,4) BINARY)->Column#6", " └─TableReader_10 10000.00 root data:TableFullScan_11", " └─TableFullScan_11 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], @@ -636,7 +636,7 @@ "Plan": [ "Projection_8 8000.00 root Column#5, test.t.c, Column#5, Column#6, Column#7, Column#8, Column#9", "└─HashAgg_9 8000.00 root group by:test.t.c, funcs:avg(Column#10)->Column#5, funcs:count(distinct test.t.a, test.t.b)->Column#6, funcs:count(distinct test.t.a)->Column#7, funcs:count(distinct test.t.c)->Column#8, funcs:sum(Column#11)->Column#9, funcs:firstrow(test.t.c)->test.t.c", - " └─Projection_10 10000.00 root cast(test.t.b, decimal(65,4) BINARY)->Column#10, test.t.a, test.t.b, test.t.a, test.t.c, cast(test.t.b, decimal(65,0) BINARY)->Column#11, test.t.c, test.t.c", + " └─Projection_10 10000.00 root cast(test.t.b, decimal(15,4) BINARY)->Column#10, test.t.a, test.t.b, test.t.a, test.t.c, cast(test.t.b, decimal(32,0) BINARY)->Column#11, test.t.c, test.t.c", " └─TableReader_11 10000.00 root data:TableFullScan_12", " └─TableFullScan_12 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], @@ -808,8 +808,8 @@ { "SQL": "select t1.a, t1.b from t as t1 left join t as t2 on t1.a = t2.a and t1.b = 3 order by a", "Plan": [ - "TableReader_24 12500.00 root data:TableFullScan_25", - "└─TableFullScan_25 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "TableReader_26 12500.00 root data:TableFullScan_27", + "└─TableFullScan_27 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -915,12 +915,12 @@ { "SQL": "select t1.a, t1.b from t1, t2 where t1.a = t2.a and t1.a > 2", "Plan": [ - "Projection_16 4166.67 root test.t1.a, test.t1.b", - "└─MergeJoin_19 4166.67 root inner join, left key:test.t1.a, right key:test.t2.a", - " ├─TableReader_27(Build) 3333.33 root data:TableRangeScan_28", - " │ └─TableRangeScan_28 3333.33 cop[tikv] table:t2 range:(2,+inf], keep order:true, stats:pseudo", - " └─TableReader_24(Probe) 3333.33 root data:TableRangeScan_25", - " └─TableRangeScan_25 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:true, stats:pseudo" + "Projection 4166.67 root test.t1.a, test.t1.b", + "└─MergeJoin 4166.67 root inner join, left key:test.t1.a, right key:test.t2.a", + " ├─TableReader(Build) 3333.33 root data:TableRangeScan", + " │ └─TableRangeScan 3333.33 cop[tikv] table:t2 range:(2,+inf], keep order:true, stats:pseudo", + " └─TableReader(Probe) 3333.33 root data:TableRangeScan", + " └─TableRangeScan 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:true, stats:pseudo" ], "Result": [ "3 33" @@ -929,13 +929,13 @@ { "SQL": "select t1.a, t1.b from t1, t2 where t1.a > t2.a and t2.b > 200", "Plan": [ - "Projection_12 80000000.00 root test.t1.a, test.t1.b", - "└─HashJoin_14 80000000.00 root CARTESIAN inner join, other cond:gt(test.t1.a, test.t2.a)", - " ├─TableReader_17(Build) 8000.00 root data:Selection_18", - " │ └─Selection_18 8000.00 cop[tikv] gt(test.t2.b, 200)", - " │ └─TableFullScan_19 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_15(Probe) 10000.00 root data:TableFullScan_16", - " └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 80000000.00 root test.t1.a, test.t1.b", + "└─HashJoin 80000000.00 root CARTESIAN inner join, other cond:gt(test.t1.a, test.t2.a)", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] gt(test.t2.b, 200)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Result": [ "3 33", @@ -946,13 +946,13 @@ { "SQL": "select t1.a, t1.b from t1 left join t2 on t1.a = t2.a where t1.a > 2 and t2.b > 200", "Plan": [ - "Projection_17 3333.33 root test.t1.a, test.t1.b", - "└─Selection_18 3333.33 root gt(test.t2.b, 200)", - " └─MergeJoin_21 4166.67 root left outer join, left key:test.t1.a, right key:test.t2.a", - " ├─TableReader_29(Build) 3333.33 root data:TableRangeScan_30", - " │ └─TableRangeScan_30 3333.33 cop[tikv] table:t2 range:(2,+inf], keep order:true, stats:pseudo", - " └─TableReader_26(Probe) 3333.33 root data:TableRangeScan_27", - " └─TableRangeScan_27 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:true, stats:pseudo" + "Projection 3333.33 root test.t1.a, test.t1.b", + "└─Selection 3333.33 root gt(test.t2.b, 200)", + " └─MergeJoin 4166.67 root left outer join, left key:test.t1.a, right key:test.t2.a", + " ├─TableReader(Build) 3333.33 root data:TableRangeScan", + " │ └─TableRangeScan 3333.33 cop[tikv] table:t2 range:(2,+inf], keep order:true, stats:pseudo", + " └─TableReader(Probe) 3333.33 root data:TableRangeScan", + " └─TableRangeScan 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:true, stats:pseudo" ], "Result": [ "3 33" @@ -961,14 +961,14 @@ { "SQL": "select t2.a, t2.b from t1 right join t2 on t1.a = t2.a where t1.a > 2 and t2.b > 200", "Plan": [ - "Projection_13 8000.00 root test.t2.a, test.t2.b", - "└─Selection_14 8000.00 root gt(test.t1.a, 2)", - " └─MergeJoin_17 10000.00 root right outer join, left key:test.t1.a, right key:test.t2.a", - " ├─TableReader_23(Build) 10000.00 root data:TableFullScan_24", - " │ └─TableFullScan_24 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo", - " └─TableReader_26(Probe) 8000.00 root data:Selection_27", - " └─Selection_27 8000.00 cop[tikv] gt(test.t2.b, 200)", - " └─TableFullScan_28 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo" + "Projection 8000.00 root test.t2.a, test.t2.b", + "└─Selection 8000.00 root gt(test.t1.a, 2)", + " └─MergeJoin 10000.00 root right outer join, left key:test.t1.a, right key:test.t2.a", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] gt(test.t2.b, 200)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo" ], "Result": [ "3 333" @@ -977,12 +977,12 @@ { "SQL": "select t1.a, t1.b from t1, t2 where t1.a = t2.a order by t1.a", "Plan": [ - "Projection_12 12500.00 root test.t1.a, test.t1.b", - "└─MergeJoin_13 12500.00 root inner join, left key:test.t1.a, right key:test.t2.a", - " ├─TableReader_19(Build) 10000.00 root data:TableFullScan_20", - " │ └─TableFullScan_20 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", - " └─TableReader_14(Probe) 10000.00 root data:TableFullScan_15", - " └─TableFullScan_15 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "Projection 12500.00 root test.t1.a, test.t1.b", + "└─MergeJoin 12500.00 root inner join, left key:test.t1.a, right key:test.t2.a", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11", @@ -993,17 +993,30 @@ { "SQL": "select * from t1 join t2 on t1.a = t2.a", "Plan": [ - "MergeJoin_11 12500.00 root inner join, left key:test.t1.a, right key:test.t2.a", - "├─TableReader_19(Build) 10000.00 root data:TableFullScan_20", - "│ └─TableFullScan_20 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", - "└─TableReader_16(Probe) 10000.00 root data:TableFullScan_17", - " └─TableFullScan_17 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "MergeJoin 12500.00 root inner join, left key:test.t1.a, right key:test.t2.a", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1 11 1 111", "2 22 2 222", "3 33 3 333" ] + }, + { + "SQL": "select * from t1 join t2 on t1.a = t2.a and t1.a > 2", + "Plan": [ + "MergeJoin 4166.67 root inner join, left key:test.t1.a, right key:test.t2.a", + "├─TableReader(Build) 3333.33 root data:TableRangeScan", + "│ └─TableRangeScan 3333.33 cop[tikv] table:t2 range:(2,+inf], keep order:true, stats:pseudo", + "└─TableReader(Probe) 3333.33 root data:TableRangeScan", + " └─TableRangeScan 3333.33 cop[tikv] table:t1 range:(2,+inf], keep order:true, stats:pseudo" + ], + "Result": [ + "3 33 3 333" + ] } ] }, @@ -1035,10 +1048,10 @@ { "SQL": "select sum(a), (select t1.a from t1 where t1.a = t2.a limit 1), (select t1.b from t1 where t1.b = t2.b limit 1) from t2", "Plan": [ - "Projection_30 1.00 root Column#3, test.t1.a, test.t1.b", + "Projection_30 1.00 root Column#7, test.t1.a, test.t1.b", "└─Apply_32 1.00 root CARTESIAN left outer join", " ├─Apply_34(Build) 1.00 root CARTESIAN left outer join", - " │ ├─HashAgg_39(Build) 1.00 root funcs:sum(Column#8)->Column#3, funcs:firstrow(Column#9)->test.t2.a, funcs:firstrow(Column#10)->test.t2.b", + " │ ├─HashAgg_39(Build) 1.00 root funcs:sum(Column#8)->Column#7, funcs:firstrow(Column#9)->test.t2.a, funcs:firstrow(Column#10)->test.t2.b", " │ │ └─TableReader_40 1.00 root data:HashAgg_41", " │ │ └─HashAgg_41 1.00 cop[tikv] funcs:sum(test.t2.a)->Column#8, funcs:firstrow(test.t2.a)->Column#9, funcs:firstrow(test.t2.b)->Column#10", " │ │ └─TableFullScan_38 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", @@ -1062,11 +1075,11 @@ { "SQL": "select a from t1 where exists(select 1 from t2 where t1.a = t2.a)", "Plan": [ - "MergeJoin_27 10000.00 root semi join, left key:test.t1.a, right key:test.t2.a", - "├─TableReader_32(Build) 10000.00 root data:TableFullScan_33", - "│ └─TableFullScan_33 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", - "└─TableReader_29(Probe) 10000.00 root data:TableFullScan_30", - " └─TableFullScan_30 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" + "MergeJoin_30 10000.00 root semi join, left key:test.t1.a, right key:test.t2.a", + "├─TableReader_35(Build) 10000.00 root data:TableFullScan_36", + "│ └─TableFullScan_36 10000.00 cop[tikv] table:t2 keep order:true, stats:pseudo", + "└─TableReader_32(Probe) 10000.00 root data:TableFullScan_33", + " └─TableFullScan_33 10000.00 cop[tikv] table:t1 keep order:true, stats:pseudo" ], "Result": [ "1", @@ -1205,14 +1218,14 @@ { "SQL": "select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1, t2 where t1.a = t2.a;", "Plan": [ - "Projection_14 10000.00 root test.t1.b, test.t2.b", - "└─HashJoin_15 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - " ├─TableReader_17(Build) 8000.00 root data:Selection_18", - " │ └─Selection_18 8000.00 cop[tikv] not(isnull(test.t1.a))", - " │ └─TableFullScan_19 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader_20(Probe) 8000.00 root data:Selection_21", - " └─Selection_21 8000.00 cop[tikv] not(isnull(test.t2.a))", - " └─TableFullScan_22 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" @@ -1221,11 +1234,14 @@ { "SQL": "select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_12", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" @@ -1234,11 +1250,12 @@ { "SQL": "select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 left outer join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_10 12500.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_13(Build) 10000.00 root data:TableFullScan_14", - "│ └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 10000.00 root data:TableFullScan_12", - " └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 10000.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Result": [ "1 1", @@ -1248,11 +1265,12 @@ { "SQL": "select /*+ HASH_JOIN(t1) */ t1.b, t2.b from t1 right outer join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_12", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 10000.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1", @@ -1262,12 +1280,12 @@ { "SQL": "select 1 from (select /*+ HASH_JOIN(t1) */ t1.a in (select t2.a from t2) from t1) x;", "Plan": [ - "Projection_17 10000.00 root 1->Column#8", - "└─HashJoin_18 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.a, test.t2.a)", - " ├─IndexReader_25(Build) 10000.00 root index:IndexFullScan_26", - " │ └─IndexFullScan_26 10000.00 cop[tikv] table:t2, index:idx_a(a) keep order:false, stats:pseudo", - " └─IndexReader_21(Probe) 10000.00 root index:IndexFullScan_22", - " └─IndexFullScan_22 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo" + "Projection 10000.00 root 1->Column#8", + "└─HashJoin 10000.00 root CARTESIAN left outer semi join, other cond:eq(test.t1.a, test.t2.a)", + " ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + " │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:idx_a(a) keep order:false, stats:pseudo", + " └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo" ], "Result": [ "1", @@ -1277,12 +1295,12 @@ { "SQL": "select 1 from (select /*+ HASH_JOIN(t1) */ t1.a not in (select t2.a from t2) from t1) x;", "Plan": [ - "Projection_17 10000.00 root 1->Column#8", - "└─HashJoin_18 10000.00 root CARTESIAN anti left outer semi join, other cond:eq(test.t1.a, test.t2.a)", - " ├─IndexReader_25(Build) 10000.00 root index:IndexFullScan_26", - " │ └─IndexFullScan_26 10000.00 cop[tikv] table:t2, index:idx_a(a) keep order:false, stats:pseudo", - " └─IndexReader_21(Probe) 10000.00 root index:IndexFullScan_22", - " └─IndexFullScan_22 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo" + "Projection 10000.00 root 1->Column#8", + "└─HashJoin 10000.00 root CARTESIAN anti left outer semi join, other cond:eq(test.t1.a, test.t2.a)", + " ├─IndexReader(Build) 10000.00 root index:IndexFullScan", + " │ └─IndexFullScan 10000.00 cop[tikv] table:t2, index:idx_a(a) keep order:false, stats:pseudo", + " └─IndexReader(Probe) 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo" ], "Result": [ "1", @@ -1292,11 +1310,14 @@ { "SQL": "select /*+ INL_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_12", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" @@ -1305,11 +1326,14 @@ { "SQL": "select /*+ INL_HASH_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_12", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" @@ -1318,11 +1342,14 @@ { "SQL": "select /*+ INL_MERGE_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_11(Build) 10000.00 root data:TableFullScan_12", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_14", - " └─TableFullScan_14 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" @@ -1331,11 +1358,14 @@ { "SQL": "select /*+ MERGE_JOIN(t1, t2) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": [ - "HashJoin_9 12500.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_12(Build) 10000.00 root data:TableFullScan_13", - "│ └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_14(Probe) 10000.00 root data:TableFullScan_15", - " └─TableFullScan_15 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Projection 10000.00 root test.t1.b, test.t2.b", + "└─HashJoin 10000.00 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(test.t1.a)), not(isnull(test.t1.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 8000.00 root data:Selection", + " └─Selection 8000.00 cop[tikv] not(isnull(test.t2.a)), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Result": [ "1 1" diff --git a/planner/cascades/testdata/stringer_suite_out.json b/planner/cascades/testdata/stringer_suite_out.json index b1d595ded9090..4a3335854ac88 100644 --- a/planner/cascades/testdata/stringer_suite_out.json +++ b/planner/cascades/testdata/stringer_suite_out.json @@ -290,7 +290,7 @@ "SQL": "select a = (select a from t t2 where t1.b = t2.b order by a limit 1) from t t1", "Result": [ "Group#0 Schema:[Column#25]", - " Projection_2 input:[Group#1], eq(test.t.a, test.t.a)->Column#25", + " Projection_3 input:[Group#1], eq(test.t.a, test.t.a)->Column#25", "Group#1 Schema:[test.t.a,test.t.b,test.t.a]", " Apply_9 input:[Group#2,Group#3], left outer join", "Group#2 Schema:[test.t.a,test.t.b], UniqueKey:[test.t.a]", diff --git a/planner/cascades/testdata/transformation_rules_suite_in.json b/planner/cascades/testdata/transformation_rules_suite_in.json index 5a9351e3501bc..708ab631b8109 100644 --- a/planner/cascades/testdata/transformation_rules_suite_in.json +++ b/planner/cascades/testdata/transformation_rules_suite_in.json @@ -18,7 +18,8 @@ "select t1.a, t1.b from t t1, t t2 where t1.a = t2.a and t1.a = 10 and t2.a = 5", "select a, b from ((select a, b from t) union all(select c as a, d as b from t)) as t1 where a > 1", "select a, b from (select a, b, min(a) over(partition by b) as min_a from t)as tt where a < 10 and b > 10 and b = min_a", - "select b, c from (select b, c from t where b > 1 and c > 1) as t1 where b > 2 and c > 2" + "select b, c from (select b, c from t where b > 1 and c > 1) as t1 where b > 2 and c > 2", + "select * from t t1 join t t2 on t1.a = t2.a and t1.a > 2" ] }, { diff --git a/planner/cascades/testdata/transformation_rules_suite_out.json b/planner/cascades/testdata/transformation_rules_suite_out.json index 0c3ecf988592b..22e877c07c181 100644 --- a/planner/cascades/testdata/transformation_rules_suite_out.json +++ b/planner/cascades/testdata/transformation_rules_suite_out.json @@ -53,9 +53,9 @@ "SQL": "select b, @i:=@i+1 as ii from (select b, @i:=0 from t as t1) as t2 where @i < 10", "Result": [ "Group#0 Schema:[test.t.b,Column#14]", - " Projection_4 input:[Group#1], test.t.b, setvar(i, cast(plus(cast(getvar(i), double BINARY), 1), var_string(5)))->Column#14", + " Projection_4 input:[Group#1], test.t.b, setvar(i, plus(getvar(i), 1))->Column#14", "Group#1 Schema:[test.t.b,Column#13]", - " Selection_3 input:[Group#2], lt(cast(getvar(\"i\")), 10)", + " Selection_3 input:[Group#2], lt(getvar(\"i\"), 10)", "Group#2 Schema:[test.t.b,Column#13]", " Projection_2 input:[Group#3], test.t.b, setvar(i, 0)->Column#13", "Group#3 Schema:[test.t.b]", @@ -68,9 +68,9 @@ "SQL": "select b, @i:=@i+1 as ii from (select a, b, @i:=0 from t as t1) as t2 where @i < 10 and a > 10", "Result": [ "Group#0 Schema:[test.t.b,Column#14]", - " Projection_4 input:[Group#1], test.t.b, setvar(i, cast(plus(cast(getvar(i), double BINARY), 1), var_string(5)))->Column#14", + " Projection_4 input:[Group#1], test.t.b, setvar(i, plus(getvar(i), 1))->Column#14", "Group#1 Schema:[test.t.a,test.t.b,Column#13]", - " Selection_6 input:[Group#2], lt(cast(getvar(\"i\")), 10)", + " Selection_6 input:[Group#2], lt(getvar(\"i\"), 10)", "Group#2 Schema:[test.t.a,test.t.b,Column#13]", " Projection_2 input:[Group#3], test.t.a, test.t.b, setvar(i, 0)->Column#13", "Group#3 Schema:[test.t.a,test.t.b]", @@ -132,19 +132,19 @@ "Group#0 Schema:[test.t.a,test.t.b,test.t.b]", " Projection_5 input:[Group#1], test.t.a, test.t.b, test.t.b", "Group#1 Schema:[test.t.a,test.t.b,test.t.a,test.t.b]", - " Join_3 input:[Group#2,Group#3], inner join, equal:[eq(test.t.a, test.t.a) eq(test.t.b, test.t.b)], other cond:gt(test.t.a, test.t.b)", + " Join_9 input:[Group#2,Group#3], inner join, equal:[eq(test.t.a, test.t.a) eq(test.t.b, test.t.b)], other cond:gt(test.t.a, test.t.b)", "Group#2 Schema:[test.t.a,test.t.b]", - " TiKVSingleGather_9 input:[Group#4], table:t1", + " TiKVSingleGather_15 input:[Group#4], table:t1", "Group#4 Schema:[test.t.a,test.t.b]", - " Selection_12 input:[Group#5], gt(test.t.a, test.t.b), gt(test.t.b, 10)", + " Selection_18 input:[Group#5], gt(test.t.a, test.t.b), gt(test.t.a, test.t.b), gt(test.t.b, 10)", "Group#5 Schema:[test.t.a,test.t.b]", - " TableScan_11 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 10)]", + " TableScan_17 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 10)]", "Group#3 Schema:[test.t.a,test.t.b]", - " TiKVSingleGather_14 input:[Group#6], table:t2", + " TiKVSingleGather_20 input:[Group#6], table:t2", "Group#6 Schema:[test.t.a,test.t.b]", - " Selection_17 input:[Group#7], gt(test.t.a, test.t.b), gt(test.t.b, 10)", + " Selection_23 input:[Group#7], gt(test.t.a, test.t.b), gt(test.t.a, test.t.b), gt(test.t.b, 10)", "Group#7 Schema:[test.t.a,test.t.b]", - " TableScan_16 table:t2, pk col:test.t.a, cond:[gt(test.t.a, 10)]" + " TableScan_22 table:t2, pk col:test.t.a, cond:[gt(test.t.a, 10)]" ] }, { @@ -153,7 +153,7 @@ "Group#0 Schema:[test.t.a,test.t.b]", " Projection_5 input:[Group#1], test.t.a, test.t.b", "Group#1 Schema:[test.t.a,test.t.b,test.t.a]", - " TableDual_6 rowcount:0" + " TableDual_7 rowcount:0" ] }, { @@ -217,7 +217,7 @@ "Group#0 Schema:[test.t.a,test.t.b]", " Projection_5 input:[Group#1], test.t.a, test.t.b", "Group#1 Schema:[test.t.a,test.t.b,test.t.a]", - " TableDual_6 rowcount:0" + " TableDual_7 rowcount:0" ] }, { @@ -287,6 +287,23 @@ "Group#4 Schema:[test.t.b,test.t.c]", " TableScan_8 table:t" ] + }, + { + "SQL": "select * from t t1 join t t2 on t1.a = t2.a and t1.a > 2", + "Result": [ + "Group#0 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date,test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " Projection_5 input:[Group#1], test.t.a, test.t.b, test.t.c, test.t.d, test.t.e, test.t.c_str, test.t.d_str, test.t.e_str, test.t.f, test.t.g, test.t.h, test.t.i_date, test.t.a, test.t.b, test.t.c, test.t.d, test.t.e, test.t.c_str, test.t.d_str, test.t.e_str, test.t.f, test.t.g, test.t.h, test.t.i_date", + "Group#1 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date,test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " Join_9 input:[Group#2,Group#3], inner join, equal:[eq(test.t.a, test.t.a)]", + "Group#2 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " TiKVSingleGather_11 input:[Group#4], table:t1", + "Group#4 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " TableScan_13 table:t1, pk col:test.t.a, cond:[gt(test.t.a, 2)]", + "Group#3 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " TiKVSingleGather_15 input:[Group#5], table:t2", + "Group#5 Schema:[test.t.a,test.t.b,test.t.c,test.t.d,test.t.e,test.t.c_str,test.t.d_str,test.t.e_str,test.t.f,test.t.g,test.t.h,test.t.i_date]", + " TableScan_17 table:t2, pk col:test.t.a, cond:[gt(test.t.a, 2)]" + ] } ] }, @@ -352,7 +369,7 @@ "Result": [ "Group#0 Schema:[test.t.b]", " Projection_5 input:[Group#1], test.t.b", - "Group#1 Schema:[test.t.b,test.t.a]", + "Group#1 Schema:[test.t.b]", " Projection_2 input:[Group#2], test.t.b, test.t.a", "Group#2 Schema:[test.t.a,test.t.b]", " TopN_7 input:[Group#3], test.t.a, offset:0, count:2", @@ -384,7 +401,7 @@ "Result": [ "Group#0 Schema:[Column#14]", " Projection_5 input:[Group#1], Column#13", - "Group#1 Schema:[Column#13,test.t.a]", + "Group#1 Schema:[Column#13]", " Projection_2 input:[Group#2], plus(test.t.a, test.t.b)->Column#13, test.t.a", "Group#2 Schema:[test.t.a,test.t.b]", " TopN_7 input:[Group#3], test.t.a, offset:2, count:1", @@ -401,7 +418,7 @@ "Result": [ "Group#0 Schema:[test.t.c]", " Projection_5 input:[Group#1], test.t.c", - "Group#1 Schema:[test.t.c,test.t.a]", + "Group#1 Schema:[test.t.c]", " Projection_2 input:[Group#2], test.t.c, test.t.a", "Group#2 Schema:[test.t.a,test.t.c]", " TopN_7 input:[Group#3], test.t.a, offset:0, count:1", @@ -425,7 +442,7 @@ "Result": [ "Group#0 Schema:[test.t.c]", " Projection_5 input:[Group#1], test.t.c", - "Group#1 Schema:[test.t.c,test.t.a,test.t.b]", + "Group#1 Schema:[test.t.c]", " Projection_2 input:[Group#2], test.t.c, test.t.a, test.t.b", "Group#2 Schema:[test.t.a,test.t.b,test.t.c]", " TopN_7 input:[Group#3], plus(test.t.a, test.t.b), offset:0, count:1", @@ -473,7 +490,7 @@ " TableScan_15 table:t1, pk col:test.t.a", "Group#3 Schema:[test.t.a]", " Projection_9 input:[Group#5], test.t.a", - "Group#5 Schema:[test.t.a,Column#25]", + "Group#5 Schema:[test.t.a]", " Projection_6 input:[Group#6], test.t.a, Column#25", "Group#6 Schema:[test.t.a,Column#25]", " Projection_5 input:[Group#7], test.t.a, test.t.b", @@ -495,7 +512,7 @@ "Group#1 Schema:[Column#13,Column#14]", " TopN_7 input:[Group#2], Column#13:desc, offset:0, count:1", "Group#2 Schema:[Column#13,Column#14]", - " Projection_2 input:[Group#3], getvar(i)->Column#13, setvar(i, cast(plus(cast(getvar(i), double BINARY), 1), var_string(5)))->Column#14", + " Projection_2 input:[Group#3], getvar(i)->Column#13, setvar(i, plus(getvar(i), 1))->Column#14", "Group#3 Schema:[test.t.a]", " TiKVSingleGather_9 input:[Group#4], table:t", " TiKVSingleGather_21 input:[Group#5], table:t, index:e_d_c_str_prefix", @@ -1645,10 +1662,8 @@ "SQL": "select a from (select a, b from t order by b limit 10) as t1", "Result": [ "Group#0 Schema:[test.t.a]", - " Projection_5 input:[Group#1], test.t.a", + " TopN_6 input:[Group#1], test.t.b, offset:0, count:10", "Group#1 Schema:[test.t.a,test.t.b]", - " TopN_6 input:[Group#2], test.t.b, offset:0, count:10", - "Group#2 Schema:[test.t.a,test.t.b]", " DataSource_1 table:t" ] } diff --git a/planner/cascades/transformation_rules.go b/planner/cascades/transformation_rules.go index 8528979a57d87..6d23e063f5877 100644 --- a/planner/cascades/transformation_rules.go +++ b/planner/cascades/transformation_rules.go @@ -103,6 +103,9 @@ var TiDBLayerOptimizationBatch = TransformationRuleBatch{ NewRuleTransformApplyToJoin(), NewRulePullSelectionUpApply(), }, + memo.OperandJoin: { + NewRuleTransformJoinCondToSel(), + }, } // TiKVLayerOptimizationBatch does the optimization related to TiKV layer. @@ -440,7 +443,7 @@ func (r *PushAggDownGather) OnTransform(old *memo.ExprIter) (newExprs []*memo.Gr AggFuncs: aggFuncs, GroupByItems: gbyItems, Schema: aggSchema, - }, true) + }, true, false) // Remove unnecessary FirstRow. partialPref.AggFuncs = plannercore.RemoveUnnecessaryFirstRow(agg.SCtx(), finalPref.AggFuncs, finalPref.GroupByItems, partialPref.AggFuncs, partialPref.GroupByItems, partialPref.Schema, funcMap) @@ -590,10 +593,6 @@ func (r *PushSelDownAggregation) OnTransform(old *memo.ExprIter) (newExprs []*me aggSchema := old.Children[0].Prop.Schema var pushedExprs []expression.Expression var remainedExprs []expression.Expression - exprsOriginal := make([]expression.Expression, 0, len(agg.AggFuncs)) - for _, aggFunc := range agg.AggFuncs { - exprsOriginal = append(exprsOriginal, aggFunc.Args[0]) - } groupByColumns := expression.NewSchema(agg.GetGroupByCols()...) for _, cond := range sel.Conditions { switch cond.(type) { @@ -835,72 +834,40 @@ func (r *PushLimitDownUnionAll) OnTransform(old *memo.ExprIter) (newExprs []*mem return []*memo.GroupExpr{newLimitExpr}, true, false, nil } -// PushSelDownJoin pushes Selection through Join. -type PushSelDownJoin struct { - baseRule -} - -// NewRulePushSelDownJoin creates a new Transformation PushSelDownJoin. -// The pattern of this rule is `Selection -> Join`. -func NewRulePushSelDownJoin() Transformation { - rule := &PushSelDownJoin{} - rule.pattern = memo.BuildPattern( - memo.OperandSelection, - memo.EngineTiDBOnly, - memo.NewPattern(memo.OperandJoin, memo.EngineTiDBOnly), - ) - return rule -} - -// Match implements Transformation interface. -func (r *PushSelDownJoin) Match(expr *memo.ExprIter) bool { - return !expr.GetExpr().HasAppliedRule(r) -} - -// buildChildSelectionGroup builds a new childGroup if the pushed down condition is not empty. -func buildChildSelectionGroup( - oldSel *plannercore.LogicalSelection, - conditions []expression.Expression, - childGroup *memo.Group) *memo.Group { - if len(conditions) == 0 { - return childGroup - } - newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(oldSel.SCtx(), oldSel.SelectBlockOffset()) - groupExpr := memo.NewGroupExpr(newSel) - groupExpr.SetChildren(childGroup) - newChild := memo.NewGroupWithSchema(groupExpr, childGroup.Prop.Schema) - return newChild +type pushDownJoin struct { } -// OnTransform implements Transformation interface. -// This rule tries to pushes the Selection through Join. Besides, this rule fulfills the `XXXConditions` field of Join. -func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.GroupExpr, eraseOld bool, eraseAll bool, err error) { - sel := old.GetExpr().ExprNode.(*plannercore.LogicalSelection) - joinExpr := old.Children[0].GetExpr() - // TODO: we need to create a new LogicalJoin here. - join := joinExpr.ExprNode.(*plannercore.LogicalJoin) - sctx := sel.SCtx() - leftGroup := old.Children[0].GetExpr().Children[0] - rightGroup := old.Children[0].GetExpr().Children[1] +func (r *pushDownJoin) predicatePushDown( + sctx sessionctx.Context, + predicates []expression.Expression, + join *plannercore.LogicalJoin, + leftSchema *expression.Schema, + rightSchema *expression.Schema, +) ( + leftCond []expression.Expression, + rightCond []expression.Expression, + remainCond []expression.Expression, + dual plannercore.LogicalPlan, +) { var equalCond []*expression.ScalarFunction - var leftPushCond, rightPushCond, otherCond, leftCond, rightCond, remainCond []expression.Expression + var leftPushCond, rightPushCond, otherCond []expression.Expression switch join.JoinType { case plannercore.SemiJoin, plannercore.InnerJoin: tempCond := make([]expression.Expression, 0, - len(join.LeftConditions)+len(join.RightConditions)+len(join.EqualConditions)+len(join.OtherConditions)+len(sel.Conditions)) + len(join.LeftConditions)+len(join.RightConditions)+len(join.EqualConditions)+len(join.OtherConditions)+len(predicates)) tempCond = append(tempCond, join.LeftConditions...) tempCond = append(tempCond, join.RightConditions...) tempCond = append(tempCond, expression.ScalarFuncs2Exprs(join.EqualConditions)...) tempCond = append(tempCond, join.OtherConditions...) - tempCond = append(tempCond, sel.Conditions...) + tempCond = append(tempCond, predicates...) tempCond = expression.ExtractFiltersFromDNFs(sctx, tempCond) tempCond = expression.PropagateConstant(sctx, tempCond) // Return table dual when filter is constant false or null. dual := plannercore.Conds2TableDual(join, tempCond) if dual != nil { - return []*memo.GroupExpr{memo.NewGroupExpr(dual)}, false, true, nil + return leftCond, rightCond, remainCond, dual } - equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(tempCond, leftGroup.Prop.Schema, rightGroup.Prop.Schema, true, true) + equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(tempCond, leftSchema, rightSchema, true, true) join.LeftConditions = nil join.RightConditions = nil join.EqualConditions = equalCond @@ -921,28 +888,28 @@ func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou join.LeftConditions = nil join.RightConditions = nil join.OtherConditions = nil - remainCond = make([]expression.Expression, len(sel.Conditions)) - copy(remainCond, sel.Conditions) + remainCond = make([]expression.Expression, len(predicates)) + copy(remainCond, predicates) nullSensitive := join.JoinType == plannercore.AntiLeftOuterSemiJoin || join.JoinType == plannercore.LeftOuterSemiJoin if join.JoinType == plannercore.RightOuterJoin { - joinConds, remainCond = expression.PropConstOverOuterJoin(join.SCtx(), joinConds, remainCond, rightGroup.Prop.Schema, leftGroup.Prop.Schema, nullSensitive) + joinConds, remainCond = expression.PropConstOverOuterJoin(join.SCtx(), joinConds, remainCond, rightSchema, leftSchema, nullSensitive) } else { - joinConds, remainCond = expression.PropConstOverOuterJoin(join.SCtx(), joinConds, remainCond, leftGroup.Prop.Schema, rightGroup.Prop.Schema, nullSensitive) + joinConds, remainCond = expression.PropConstOverOuterJoin(join.SCtx(), joinConds, remainCond, leftSchema, rightSchema, nullSensitive) } - eq, left, right, other := join.ExtractOnCondition(joinConds, leftGroup.Prop.Schema, rightGroup.Prop.Schema, false, false) + eq, left, right, other := join.ExtractOnCondition(joinConds, leftSchema, rightSchema, false, false) join.AppendJoinConds(eq, left, right, other) // Return table dual when filter is constant false or null. dual := plannercore.Conds2TableDual(join, remainCond) if dual != nil { - return []*memo.GroupExpr{memo.NewGroupExpr(dual)}, false, true, nil + return leftCond, rightCond, remainCond, dual } if join.JoinType == plannercore.RightOuterJoin { remainCond = expression.ExtractFiltersFromDNFs(join.SCtx(), remainCond) // Only derive right where condition, because left where condition cannot be pushed down - equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(remainCond, leftGroup.Prop.Schema, rightGroup.Prop.Schema, false, true) + equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(remainCond, leftSchema, rightSchema, false, true) rightCond = rightPushCond // Handle join conditions, only derive left join condition, because right join condition cannot be pushed down - derivedLeftJoinCond, _ := plannercore.DeriveOtherConditions(join, true, false) + derivedLeftJoinCond, _ := plannercore.DeriveOtherConditions(join, leftSchema, rightSchema, true, false) leftCond = append(join.LeftConditions, derivedLeftJoinCond...) join.LeftConditions = nil remainCond = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) @@ -950,10 +917,10 @@ func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou } else { remainCond = expression.ExtractFiltersFromDNFs(join.SCtx(), remainCond) // Only derive left where condition, because right where condition cannot be pushed down - equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(remainCond, leftGroup.Prop.Schema, rightGroup.Prop.Schema, true, false) + equalCond, leftPushCond, rightPushCond, otherCond = join.ExtractOnCondition(remainCond, leftSchema, rightSchema, true, false) leftCond = leftPushCond - // Handle join conditions, only derive left join condition, because right join condition cannot be pushed down - _, derivedRightJoinCond := plannercore.DeriveOtherConditions(join, false, true) + // Handle join conditions, only derive right join condition, because left join condition cannot be pushed down + _, derivedRightJoinCond := plannercore.DeriveOtherConditions(join, leftSchema, rightSchema, false, true) rightCond = append(join.RightConditions, derivedRightJoinCond...) join.RightConditions = nil remainCond = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) @@ -964,10 +931,68 @@ func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou } leftCond = expression.RemoveDupExprs(sctx, leftCond) rightCond = expression.RemoveDupExprs(sctx, rightCond) + + return +} + +// PushSelDownJoin pushes Selection through Join. +type PushSelDownJoin struct { + baseRule + pushDownJoin +} + +// NewRulePushSelDownJoin creates a new Transformation PushSelDownJoin. +// The pattern of this rule is `Selection -> Join`. +func NewRulePushSelDownJoin() Transformation { + rule := &PushSelDownJoin{} + rule.pattern = memo.BuildPattern( + memo.OperandSelection, + memo.EngineTiDBOnly, + memo.NewPattern(memo.OperandJoin, memo.EngineTiDBOnly), + ) + return rule +} + +// Match implements Transformation interface. +func (r *PushSelDownJoin) Match(expr *memo.ExprIter) bool { + return !expr.GetExpr().HasAppliedRule(r) +} + +// buildChildSelectionGroup builds a new childGroup if the pushed down condition is not empty. +func buildChildSelectionGroup( + sctx sessionctx.Context, + blockOffset int, + conditions []expression.Expression, + childGroup *memo.Group) *memo.Group { + if len(conditions) == 0 { + return childGroup + } + newSel := plannercore.LogicalSelection{Conditions: conditions}.Init(sctx, blockOffset) + groupExpr := memo.NewGroupExpr(newSel) + groupExpr.SetChildren(childGroup) + newChild := memo.NewGroupWithSchema(groupExpr, childGroup.Prop.Schema) + return newChild +} + +// OnTransform implements Transformation interface. +// This rule tries to pushes the Selection through Join. Besides, this rule fulfills the `XXXConditions` field of Join. +func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.GroupExpr, eraseOld bool, eraseAll bool, err error) { + sel := old.GetExpr().ExprNode.(*plannercore.LogicalSelection) + joinExpr := old.Children[0].GetExpr() + join := joinExpr.ExprNode.(*plannercore.LogicalJoin) + newJoin := join.Shallow() + sctx := sel.SCtx() + leftGroup := old.Children[0].GetExpr().Children[0] + rightGroup := old.Children[0].GetExpr().Children[1] + leftCond, rightCond, remainCond, dual := r.predicatePushDown(sctx, sel.Conditions, newJoin, leftGroup.Prop.Schema, rightGroup.Prop.Schema) + if dual != nil { + return []*memo.GroupExpr{memo.NewGroupExpr(dual)}, true, true, nil + } + // TODO: Update EqualConditions like what we have done in the method join.updateEQCond() before. - leftGroup = buildChildSelectionGroup(sel, leftCond, leftGroup) - rightGroup = buildChildSelectionGroup(sel, rightCond, rightGroup) - newJoinExpr := memo.NewGroupExpr(join) + leftGroup = buildChildSelectionGroup(sctx, sel.SelectBlockOffset(), leftCond, leftGroup) + rightGroup = buildChildSelectionGroup(sctx, sel.SelectBlockOffset(), rightCond, rightGroup) + newJoinExpr := memo.NewGroupExpr(newJoin) newJoinExpr.SetChildren(leftGroup, rightGroup) if len(remainCond) > 0 { newSel := plannercore.LogicalSelection{Conditions: remainCond}.Init(sctx, sel.SelectBlockOffset()) @@ -980,6 +1005,51 @@ func (r *PushSelDownJoin) OnTransform(old *memo.ExprIter) (newExprs []*memo.Grou return []*memo.GroupExpr{newJoinExpr}, true, false, nil } +// TransformJoinCondToSel convert Join(len(cond) > 0) to Join-->(Sel, Sel). +type TransformJoinCondToSel struct { + baseRule + pushDownJoin +} + +// NewRuleTransformJoinCondToSel creates a new Transformation TransformJoinCondToSel. +// The pattern of this rule is: `Join`. +func NewRuleTransformJoinCondToSel() Transformation { + rule := &TransformJoinCondToSel{} + rule.pattern = memo.NewPattern(memo.OperandJoin, memo.EngineTiDBOnly) + return rule +} + +// Match implements Transformation interface. +func (r *TransformJoinCondToSel) Match(expr *memo.ExprIter) bool { + if expr.GetExpr().HasAppliedRule(r) { + return false + } + join := expr.GetExpr().ExprNode.(*plannercore.LogicalJoin) + return len(join.EqualConditions) > 0 || len(join.LeftConditions) > 0 || + len(join.RightConditions) > 0 || len(join.OtherConditions) > 0 +} + +// OnTransform implements Transformation interface. +// This rule tries to transform Join conditions to Selection. Besides, this rule fulfills the `XXXConditions` field of Join. +func (r *TransformJoinCondToSel) OnTransform(old *memo.ExprIter) (newExprs []*memo.GroupExpr, eraseOld bool, eraseAll bool, err error) { + join := old.GetExpr().ExprNode.(*plannercore.LogicalJoin) + newJoin := join.Shallow() + sctx := join.SCtx() + leftGroup := old.GetExpr().Children[0] + rightGroup := old.GetExpr().Children[1] + leftCond, rightCond, _, dual := r.predicatePushDown(sctx, []expression.Expression{}, newJoin, leftGroup.Prop.Schema, rightGroup.Prop.Schema) + if dual != nil { + return []*memo.GroupExpr{memo.NewGroupExpr(dual)}, true, true, nil + } + // TODO: Update EqualConditions like what we have done in the method join.updateEQCond() before. + leftGroup = buildChildSelectionGroup(sctx, join.SelectBlockOffset(), leftCond, leftGroup) + rightGroup = buildChildSelectionGroup(sctx, join.SelectBlockOffset(), rightCond, rightGroup) + newJoinExpr := memo.NewGroupExpr(newJoin) + newJoinExpr.SetChildren(leftGroup, rightGroup) + newJoinExpr.AddAppliedRule(r) + return []*memo.GroupExpr{newJoinExpr}, true, false, nil +} + // PushSelDownUnionAll pushes selection through union all. type PushSelDownUnionAll struct { baseRule @@ -2260,7 +2330,7 @@ func (r *InjectProjectionBelowAgg) OnTransform(old *memo.ExprIter) (newExprs []* copyFuncs := make([]*aggregation.AggFuncDesc, 0, len(agg.AggFuncs)) for _, aggFunc := range agg.AggFuncs { copyFunc := aggFunc.Clone() - //WrapCastForAggArgs will modify AggFunc, so we should clone AggFunc. + // WrapCastForAggArgs will modify AggFunc, so we should clone AggFunc. copyFunc.WrapCastForAggArgs(agg.SCtx()) copyFuncs = append(copyFuncs, copyFunc) for _, arg := range copyFunc.Args { diff --git a/planner/cascades/transformation_rules_test.go b/planner/cascades/transformation_rules_test.go index 421f815313945..2f3d0240cbcee 100644 --- a/planner/cascades/transformation_rules_test.go +++ b/planner/cascades/transformation_rules_test.go @@ -44,7 +44,7 @@ func (s *testTransformationRuleSuite) SetUpSuite(c *C) { var err error s.testData, err = testutil.LoadTestSuiteData("testdata", "transformation_rules_suite") c.Assert(err, IsNil) - s.Parser.EnableWindowFunc(true) + s.Parser.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) } func (s *testTransformationRuleSuite) TearDownSuite(c *C) { @@ -127,6 +127,9 @@ func (s *testTransformationRuleSuite) TestPredicatePushDown(c *C) { NewRulePushSelDownWindow(), NewRuleMergeAdjacentSelection(), }, + memo.OperandJoin: { + NewRuleTransformJoinCondToSel(), + }, }, TransformationRuleBatch{ // TiKV layer memo.OperandSelection: { diff --git a/planner/core/cache.go b/planner/core/cache.go index e4d62da5d58ba..1e87a984331b0 100644 --- a/planner/core/cache.go +++ b/planner/core/cache.go @@ -32,9 +32,8 @@ import ( var ( // preparedPlanCacheEnabledValue stores the global config "prepared-plan-cache-enabled". - // If the value of "prepared-plan-cache-enabled" is true, preparedPlanCacheEnabledValue's value is 1. - // Otherwise, preparedPlanCacheEnabledValue's value is 0. - preparedPlanCacheEnabledValue int32 + // The value is false unless "prepared-plan-cache-enabled" is true in configuration. + preparedPlanCacheEnabledValue int32 = 0 // PreparedPlanCacheCapacity stores the global config "prepared-plan-cache-capacity". PreparedPlanCacheCapacity uint = 100 // PreparedPlanCacheMemoryGuardRatio stores the global config "prepared-plan-cache-memory-guard-ratio". @@ -67,7 +66,6 @@ type pstmtPlanCacheKey struct { database string connID uint64 pstmtID uint32 - snapshot uint64 schemaVersion int64 sqlMode mysql.SQLMode timezoneOffset int @@ -90,7 +88,6 @@ func (key *pstmtPlanCacheKey) Hash() []byte { key.hash = append(key.hash, dbBytes...) key.hash = codec.EncodeInt(key.hash, int64(key.connID)) key.hash = codec.EncodeInt(key.hash, int64(key.pstmtID)) - key.hash = codec.EncodeInt(key.hash, int64(key.snapshot)) key.hash = codec.EncodeInt(key.hash, key.schemaVersion) key.hash = codec.EncodeInt(key.hash, int64(key.sqlMode)) key.hash = codec.EncodeInt(key.hash, int64(key.timezoneOffset)) @@ -134,7 +131,6 @@ func NewPSTMTPlanCacheKey(sessionVars *variable.SessionVars, pstmtID uint32, sch database: sessionVars.CurrentDB, connID: sessionVars.ConnectionID, pstmtID: pstmtID, - snapshot: sessionVars.SnapshotTS, schemaVersion: schemaVersion, sqlMode: sessionVars.SQLMode, timezoneOffset: timezoneOffset, @@ -147,23 +143,45 @@ func NewPSTMTPlanCacheKey(sessionVars *variable.SessionVars, pstmtID uint32, sch return key } +// FieldSlice is the slice of the types.FieldType +type FieldSlice []types.FieldType + +// Equal compares FieldSlice with []*types.FieldType +func (s FieldSlice) Equal(tps []*types.FieldType) bool { + if len(s) != len(tps) { + return false + } + for i := range tps { + if !s[i].Equal(tps[i]) { + return false + } + } + return true +} + // PSTMTPlanCacheValue stores the cached Statement and StmtNode. type PSTMTPlanCacheValue struct { Plan Plan OutPutNames []*types.FieldName TblInfo2UnionScan map[*model.TableInfo]bool + UserVarTypes FieldSlice } // NewPSTMTPlanCacheValue creates a SQLCacheValue. -func NewPSTMTPlanCacheValue(plan Plan, names []*types.FieldName, srcMap map[*model.TableInfo]bool) *PSTMTPlanCacheValue { +func NewPSTMTPlanCacheValue(plan Plan, names []*types.FieldName, srcMap map[*model.TableInfo]bool, userVarTps []*types.FieldType) *PSTMTPlanCacheValue { dstMap := make(map[*model.TableInfo]bool) for k, v := range srcMap { dstMap[k] = v } + userVarTypes := make([]types.FieldType, len(userVarTps)) + for i, tp := range userVarTps { + userVarTypes[i] = *tp + } return &PSTMTPlanCacheValue{ Plan: plan, OutPutNames: names, TblInfo2UnionScan: dstMap, + UserVarTypes: userVarTypes, } } diff --git a/planner/core/cache_test.go b/planner/core/cache_test.go index e95b21c3174b2..262497e50a24e 100644 --- a/planner/core/cache_test.go +++ b/planner/core/cache_test.go @@ -39,5 +39,5 @@ func (s *testCacheSuite) SetUpSuite(c *C) { func (s *testCacheSuite) TestCacheKey(c *C) { defer testleak.AfterTest(c)() key := NewPSTMTPlanCacheKey(s.ctx.GetSessionVars(), 1, 1) - c.Assert(key.Hash(), DeepEquals, []byte{0x74, 0x65, 0x73, 0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x69, 0x64, 0x62, 0x74, 0x69, 0x6b, 0x76, 0x74, 0x69, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) + c.Assert(key.Hash(), DeepEquals, []byte{0x74, 0x65, 0x73, 0x74, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x74, 0x69, 0x64, 0x62, 0x74, 0x69, 0x6b, 0x76, 0x74, 0x69, 0x66, 0x6c, 0x61, 0x73, 0x68, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}) } diff --git a/planner/core/cbo_test.go b/planner/core/cbo_test.go index 5ee932438bed0..ed309de916136 100644 --- a/planner/core/cbo_test.go +++ b/planner/core/cbo_test.go @@ -100,7 +100,7 @@ func (s *testAnalyzeSuite) TestExplainAnalyze(c *C) { c.Assert(strings.Contains(execInfo, "time"), Equals, true) c.Assert(strings.Contains(execInfo, "loops"), Equals, true) if strings.Contains(row[0].(string), "Reader") || strings.Contains(row[0].(string), "IndexLookUp") { - c.Assert(strings.Contains(execInfo, "copr_cache_hit_ratio"), Equals, true) + c.Assert(strings.Contains(execInfo, "cop_task"), Equals, true) } } } @@ -125,14 +125,14 @@ func (s *testAnalyzeSuite) TestCBOWithoutAnalyze(c *C) { testKit.MustExec("insert into t2 values (1), (2), (3), (4), (5), (6)") c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) - testKit.MustQuery("explain select * from t1, t2 where t1.a = t2.a").Check(testkit.Rows( - "HashJoin_8 7.49 root inner join, equal:[eq(test.t1.a, test.t2.a)]", - "├─TableReader_15(Build) 5.99 root data:Selection_14", - "│ └─Selection_14 5.99 cop[tikv] not(isnull(test.t2.a))", - "│ └─TableFullScan_13 6.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_12(Probe) 5.99 root data:Selection_11", - " └─Selection_11 5.99 cop[tikv] not(isnull(test.t1.a))", - " └─TableFullScan_10 6.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + testKit.MustQuery("explain format = 'brief' select * from t1, t2 where t1.a = t2.a").Check(testkit.Rows( + "HashJoin 7.49 root inner join, equal:[eq(test.t1.a, test.t2.a)]", + "├─TableReader(Build) 5.99 root data:Selection", + "│ └─Selection 5.99 cop[tikv] not(isnull(test.t2.a))", + "│ └─TableFullScan 6.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 5.99 root data:Selection", + " └─Selection 5.99 cop[tikv] not(isnull(test.t1.a))", + " └─TableFullScan 6.00 cop[tikv] table:t1 keep order:false, stats:pseudo", )) testKit.MustQuery("explain format = 'hint' select * from t1, t2 where t1.a = t2.a").Check(testkit.Rows( "use_index(@`sel_1` `test`.`t1` ), use_index(@`sel_1` `test`.`t2` ), hash_join(@`sel_1` `test`.`t1`)")) @@ -183,12 +183,12 @@ func (s *testAnalyzeSuite) TestTableDual(c *C) { c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) - testKit.MustQuery(`explain select * from t where 1 = 0`).Check(testkit.Rows( - `TableDual_6 0.00 root rows:0`, + testKit.MustQuery(`explain format = 'brief' select * from t where 1 = 0`).Check(testkit.Rows( + `TableDual 0.00 root rows:0`, )) - testKit.MustQuery(`explain select * from t where 1 = 1 limit 0`).Check(testkit.Rows( - `TableDual_5 0.00 root rows:0`, + testKit.MustQuery(`explain format = 'brief' select * from t where 1 = 1 limit 0`).Check(testkit.Rows( + `TableDual 0.00 root rows:0`, )) } @@ -217,11 +217,11 @@ func (s *testAnalyzeSuite) TestEstimation(c *C) { } c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) - testKit.MustQuery("explain select count(*) from t group by a").Check(testkit.Rows( - "HashAgg_9 2.00 root group by:test.t.a, funcs:count(Column#4)->Column#3", - "└─TableReader_10 2.00 root data:HashAgg_5", - " └─HashAgg_5 2.00 cop[tikv] group by:test.t.a, funcs:count(1)->Column#4", - " └─TableFullScan_8 8.00 cop[tikv] table:t keep order:false", + testKit.MustQuery("explain format = 'brief' select count(*) from t group by a").Check(testkit.Rows( + "HashAgg 2.00 root group by:test.t.a, funcs:count(Column#4)->Column#3", + "└─TableReader 2.00 root data:HashAgg", + " └─HashAgg 2.00 cop[tikv] group by:test.t.a, funcs:count(1)->Column#4", + " └─TableFullScan 8.00 cop[tikv] table:t keep order:false", )) } @@ -355,6 +355,7 @@ func (s *testAnalyzeSuite) TestAnalyze(c *C) { testKit.MustExec("create table t3 (a int, b int)") testKit.MustExec("create index a on t3 (a)") + testKit.MustExec("set @@tidb_partition_prune_mode = 'static';") testKit.MustExec("create table t4 (a int, b int) partition by range (a) (partition p1 values less than (2), partition p2 values less than (3))") testKit.MustExec("create index a on t4 (a)") testKit.MustExec("create index b on t4 (b)") @@ -419,16 +420,16 @@ func (s *testAnalyzeSuite) TestOutdatedAnalyze(c *C) { c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) c.Assert(h.Update(dom.InfoSchema()), IsNil) statistics.RatioOfPseudoEstimate.Store(10.0) - testKit.MustQuery("explain select * from t where a <= 5 and b <= 5").Check(testkit.Rows( - "TableReader_7 29.77 root data:Selection_6", - "└─Selection_6 29.77 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", - " └─TableFullScan_5 80.00 cop[tikv] table:t keep order:false", + testKit.MustQuery("explain format = 'brief' select * from t where a <= 5 and b <= 5").Check(testkit.Rows( + "TableReader 29.77 root data:Selection", + "└─Selection 29.77 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", + " └─TableFullScan 80.00 cop[tikv] table:t keep order:false", )) statistics.RatioOfPseudoEstimate.Store(0.7) - testKit.MustQuery("explain select * from t where a <= 5 and b <= 5").Check(testkit.Rows( - "TableReader_7 8.84 root data:Selection_6", - "└─Selection_6 8.84 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", - " └─TableFullScan_5 80.00 cop[tikv] table:t keep order:false, stats:pseudo", + testKit.MustQuery("explain format = 'brief' select * from t where a <= 5 and b <= 5").Check(testkit.Rows( + "TableReader 8.84 root data:Selection", + "└─Selection 8.84 cop[tikv] le(test.t.a, 5), le(test.t.b, 5)", + " └─TableFullScan 80.00 cop[tikv] table:t keep order:false, stats:pseudo", )) } @@ -556,12 +557,12 @@ func (s *testAnalyzeSuite) TestInconsistentEstimation(c *C) { dom.StatsHandle().Update(dom.InfoSchema()) // Using the histogram (a, b) to estimate `a = 5` will get 1.22, while using the CM Sketch to estimate // the `a = 5 and c = 5` will get 10, it is not consistent. - tk.MustQuery("explain select * from t use index(ab) where a = 5 and c = 5"). + tk.MustQuery("explain format = 'brief' select * from t use index(ab) where a = 5 and c = 5"). Check(testkit.Rows( - "IndexLookUp_8 10.00 root ", - "├─IndexRangeScan_5(Build) 12.50 cop[tikv] table:t, index:ab(a, b) range:[5,5], keep order:false", - "└─Selection_7(Probe) 10.00 cop[tikv] eq(test.t.c, 5)", - " └─TableRowIDScan_6 12.50 cop[tikv] table:t keep order:false", + "IndexLookUp 10.00 root ", + "├─IndexRangeScan(Build) 12.50 cop[tikv] table:t, index:ab(a, b) range:[5,5], keep order:false", + "└─Selection(Probe) 10.00 cop[tikv] eq(test.t.c, 5)", + " └─TableRowIDScan 12.50 cop[tikv] table:t keep order:false", )) } @@ -772,7 +773,7 @@ func (s *testAnalyzeSuite) TestIssue9805(c *C) { ) `) // Test when both tables are empty, EXPLAIN ANALYZE for IndexLookUp would not panic. - tk.MustExec("explain analyze select /*+ TIDB_INLJ(t2) */ t1.id, t2.a from t1 join t2 on t1.a = t2.d where t1.b = 't2' and t1.d = 4") + tk.MustQuery("explain analyze select /*+ TIDB_INLJ(t2) */ t1.id, t2.a from t1 join t2 on t1.a = t2.d where t1.b = 't2' and t1.d = 4") } func (s *testAnalyzeSuite) TestLimitCrossEstimation(c *C) { @@ -910,7 +911,7 @@ func (s *testAnalyzeSuite) TestIndexEqualUnknown(c *C) { }() testKit.MustExec("use test") testKit.MustExec("drop table if exists t, t1") - testKit.MustExec("set @@tidb_enable_clustered_index=0") + testKit.Se.GetSessionVars().EnableClusteredIndex = false testKit.MustExec("CREATE TABLE t(a bigint(20) NOT NULL, b bigint(20) NOT NULL, c bigint(20) NOT NULL, PRIMARY KEY (a,c,b), KEY (b))") err = s.loadTableStats("analyzeSuiteTestIndexEqualUnknownT.json", dom) c.Assert(err, IsNil) @@ -928,3 +929,36 @@ func (s *testAnalyzeSuite) TestIndexEqualUnknown(c *C) { testKit.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) } } + +func (s *testAnalyzeSuite) TestLimitIndexEstimation(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, key idx_a(a), key idx_b(b))") + tk.MustExec("set session tidb_enable_extended_stats = on") + // Values in column a are from 1 to 1000000, values in column b are from 1000000 to 1, + // these 2 columns are strictly correlated in reverse order. + err = s.loadTableStats("analyzeSuiteTestLimitIndexEstimationT.json", dom) + c.Assert(err, IsNil) + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/planner/core/common_plans.go b/planner/core/common_plans.go index f7d5a9a990148..8b856d10dffa6 100644 --- a/planner/core/common_plans.go +++ b/planner/core/common_plans.go @@ -270,7 +270,7 @@ func (e *Execute) checkPreparedPriv(ctx context.Context, sctx sessionctx.Context func (e *Execute) setFoundInPlanCache(sctx sessionctx.Context, opt bool) error { vars := sctx.GetSessionVars() - err := vars.SetSystemVar(variable.TiDBFoundInPlanCache, variable.BoolToIntStr(opt)) + err := vars.SetSystemVar(variable.TiDBFoundInPlanCache, variable.BoolToOnOff(opt)) return err } @@ -282,6 +282,14 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, if prepared.UseCache { cacheKey = NewPSTMTPlanCacheKey(sctx.GetSessionVars(), e.ExecID, prepared.SchemaVersion) } + tps := make([]*types.FieldType, len(e.UsingVars)) + for i, param := range e.UsingVars { + name := param.(*expression.ScalarFunction).GetArgs()[0].String() + tps[i] = sctx.GetSessionVars().UserVarTypes[name] + if tps[i] == nil { + tps[i] = types.NewFieldType(mysql.TypeNull) + } + } if prepared.CachedPlan != nil { // Rewriting the expression in the select.where condition will convert its // type from "paramMarker" to "Constant".When Point Select queries are executed, @@ -313,36 +321,42 @@ func (e *Execute) getPhysicalPlan(ctx context.Context, sctx sessionctx.Context, if err := e.checkPreparedPriv(ctx, sctx, preparedStmt, is); err != nil { return err } - cachedVal := cacheValue.(*PSTMTPlanCacheValue) - planValid := true - for tblInfo, unionScan := range cachedVal.TblInfo2UnionScan { - if !unionScan && tableHasDirtyContent(sctx, tblInfo) { - planValid = false - // TODO we can inject UnionScan into cached plan to avoid invalidating it, though - // rebuilding the filters in UnionScan is pretty trivial. - sctx.PreparedPlanCache().Delete(cacheKey) - break - } - } - if planValid { - err := e.rebuildRange(cachedVal.Plan) - if err != nil { - logutil.BgLogger().Debug("rebuild range failed", zap.Error(err)) - goto REBUILD + cachedVals := cacheValue.([]*PSTMTPlanCacheValue) + for _, cachedVal := range cachedVals { + if !cachedVal.UserVarTypes.Equal(tps) { + continue } - err = e.setFoundInPlanCache(sctx, true) - if err != nil { - return err + planValid := true + for tblInfo, unionScan := range cachedVal.TblInfo2UnionScan { + if !unionScan && tableHasDirtyContent(sctx, tblInfo) { + planValid = false + // TODO we can inject UnionScan into cached plan to avoid invalidating it, though + // rebuilding the filters in UnionScan is pretty trivial. + sctx.PreparedPlanCache().Delete(cacheKey) + break + } } - if metrics.ResettablePlanCacheCounterFortTest { - metrics.PlanCacheCounter.WithLabelValues("prepare").Inc() - } else { - planCacheCounter.Inc() + if planValid { + err := e.rebuildRange(cachedVal.Plan) + if err != nil { + logutil.BgLogger().Debug("rebuild range failed", zap.Error(err)) + goto REBUILD + } + err = e.setFoundInPlanCache(sctx, true) + if err != nil { + return err + } + if metrics.ResettablePlanCacheCounterFortTest { + metrics.PlanCacheCounter.WithLabelValues("prepare").Inc() + } else { + planCacheCounter.Inc() + } + e.names = cachedVal.OutPutNames + e.Plan = cachedVal.Plan + stmtCtx.SetPlanDigest(preparedStmt.NormalizedPlan, preparedStmt.PlanDigest) + return nil } - e.names = cachedVal.OutPutNames - e.Plan = cachedVal.Plan - stmtCtx.SetPlanDigest(preparedStmt.NormalizedPlan, preparedStmt.PlanDigest) - return nil + break } } } @@ -360,11 +374,26 @@ REBUILD: e.names = names e.Plan = p _, isTableDual := p.(*PhysicalTableDual) - if !isTableDual && prepared.UseCache { - cached := NewPSTMTPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan) + if !isTableDual && prepared.UseCache && !stmtCtx.OptimDependOnMutableConst { + cached := NewPSTMTPlanCacheValue(p, names, stmtCtx.TblInfo2UnionScan, tps) preparedStmt.NormalizedPlan, preparedStmt.PlanDigest = NormalizePlan(p) stmtCtx.SetPlanDigest(preparedStmt.NormalizedPlan, preparedStmt.PlanDigest) - sctx.PreparedPlanCache().Put(cacheKey, cached) + if cacheVals, exists := sctx.PreparedPlanCache().Get(cacheKey); exists { + hitVal := false + for i, cacheVal := range cacheVals.([]*PSTMTPlanCacheValue) { + if cacheVal.UserVarTypes.Equal(tps) { + hitVal = true + cacheVals.([]*PSTMTPlanCacheValue)[i] = cached + break + } + } + if !hitVal { + cacheVals = append(cacheVals.([]*PSTMTPlanCacheValue), cached) + } + sctx.PreparedPlanCache().Put(cacheKey, cacheVals) + } else { + sctx.PreparedPlanCache().Put(cacheKey, []*PSTMTPlanCacheValue{cached}) + } } err = e.setFoundInPlanCache(sctx, false) return err @@ -415,21 +444,27 @@ func (e *Execute) rebuildRange(p Plan) error { switch x := p.(type) { case *PhysicalTableReader: ts := x.TablePlans[0].(*PhysicalTableScan) - var pkCol *expression.Column if ts.Table.IsCommonHandle { pk := tables.FindPrimaryIndex(ts.Table) pkCols := make([]*expression.Column, 0, len(pk.Columns)) pkColsLen := make([]int, 0, len(pk.Columns)) for _, colInfo := range pk.Columns { - pkCols = append(pkCols, expression.ColInfo2Col(ts.schema.Columns, ts.Table.Columns[colInfo.Offset])) - pkColsLen = append(pkColsLen, colInfo.Length) + if pkCol := expression.ColInfo2Col(ts.schema.Columns, ts.Table.Columns[colInfo.Offset]); pkCol != nil { + pkCols = append(pkCols, pkCol) + pkColsLen = append(pkColsLen, colInfo.Length) + } } - res, err := ranger.DetachCondAndBuildRangeForIndex(p.SCtx(), ts.AccessCondition, pkCols, pkColsLen) - if err != nil { - return err + if len(pkCols) > 0 { + res, err := ranger.DetachCondAndBuildRangeForIndex(p.SCtx(), ts.AccessCondition, pkCols, pkColsLen) + if err != nil { + return err + } + ts.Ranges = res.Ranges + } else { + ts.Ranges = ranger.FullRange() } - ts.Ranges = res.Ranges } else { + var pkCol *expression.Column if ts.Table.PKIsHandle { if pkColInfo := ts.Table.GetPkColInfo(); pkColInfo != nil { pkCol = expression.ColInfo2Col(ts.schema.Columns, pkColInfo) @@ -649,6 +684,18 @@ type Simple struct { baseSchemaProducer Statement ast.StmtNode + + // IsFromRemote indicates whether the statement IS FROM REMOTE TiDB instance in cluster, + // and executing in co-processor. + // Used for `global kill`. See https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-01-global-kill.md. + IsFromRemote bool +} + +// PhysicalSimpleWrapper is a wrapper of `Simple` to implement physical plan interface. +// Used for simple statements executing in coprocessor. +type PhysicalSimpleWrapper struct { + basePhysicalPlan + Inner Simple } // InsertGeneratedColumns is for completing generated columns in Insert. @@ -684,6 +731,8 @@ type Insert struct { NeedFillDefaultValue bool AllAssignmentsAreConstant bool + + RowLen int } // Update represents Update plan. @@ -694,6 +743,8 @@ type Update struct { AllAssignmentsAreConstant bool + VirtualAssignmentsOffset int + SelectPlan PhysicalPlan TblColPosInfos TblColPosInfoSlice @@ -716,18 +767,30 @@ type Delete struct { // AnalyzeTableID is hybrid table id used to analyze table. type AnalyzeTableID struct { - PersistID int64 - CollectIDs []int64 + TableID int64 + // PartitionID is used for the construction of partition table statistics. It indicate the ID of the partition. + // If the table is not the partition table, the PartitionID will be equal to -1. + PartitionID int64 +} + +// GetStatisticsID is used to obtain the table ID to build statistics. +// If the 'PartitionID == -1', we use the TableID to build the statistics for non-partition tables. +// Otherwise, we use the PartitionID to build the statistics of the partitions in the partition tables. +func (h *AnalyzeTableID) GetStatisticsID() int64 { + statisticsID := h.TableID + if h.PartitionID != -1 { + statisticsID = h.PartitionID + } + return statisticsID } -// StoreAsCollectID indicates whether collect table id is same as persist table id. -// for new partition implementation is TRUE but FALSE for old partition implementation -func (h *AnalyzeTableID) StoreAsCollectID() bool { - return h.PersistID == h.CollectIDs[0] +// IsPartitionTable indicates whether the table is partition table. +func (h *AnalyzeTableID) IsPartitionTable() bool { + return h.PartitionID != -1 } func (h *AnalyzeTableID) String() string { - return fmt.Sprintf("%d => %v", h.CollectIDs, h.PersistID) + return fmt.Sprintf("%d => %v", h.PartitionID, h.TableID) } // Equals indicates whether two table id is equal. @@ -738,28 +801,7 @@ func (h *AnalyzeTableID) Equals(t *AnalyzeTableID) bool { if h == nil || t == nil { return false } - if h.PersistID != t.PersistID { - return false - } - if len(h.CollectIDs) != len(t.CollectIDs) { - return false - } - if len(h.CollectIDs) == 1 { - return h.CollectIDs[0] == t.CollectIDs[0] - } - for _, hp := range h.CollectIDs { - var matchOne bool - for _, tp := range t.CollectIDs { - if tp == hp { - matchOne = true - break - } - } - if !matchOne { - return false - } - } - return true + return h.TableID == t.TableID && h.PartitionID == t.PartitionID } // analyzeInfo is used to store the database name, table name and partition name of analyze task. @@ -769,13 +811,15 @@ type analyzeInfo struct { PartitionName string TableID AnalyzeTableID Incremental bool + StatsVersion int } // AnalyzeColumnsTask is used for analyze columns. type AnalyzeColumnsTask struct { - HandleCols HandleCols - ColsInfo []*model.ColumnInfo - TblInfo *model.TableInfo + HandleCols HandleCols + CommonHandleInfo *model.IndexInfo + ColsInfo []*model.ColumnInfo + TblInfo *model.TableInfo analyzeInfo } @@ -902,7 +946,7 @@ func (e *Explain) prepareSchema() error { format := strings.ToLower(e.Format) switch { - case format == ast.ExplainFormatROW && (!e.Analyze && e.RuntimeStatsColl == nil): + case (format == ast.ExplainFormatROW && (!e.Analyze && e.RuntimeStatsColl == nil)) || (format == ast.ExplainFormatBrief): fieldNames = []string{"id", "estRows", "task", "access object", "operator info"} case format == ast.ExplainFormatROW && (e.Analyze || e.RuntimeStatsColl != nil): fieldNames = []string{"id", "estRows", "actRows", "task", "access object", "execution info", "operator info", "memory", "disk"} @@ -933,7 +977,7 @@ func (e *Explain) RenderResult() error { return nil } switch strings.ToLower(e.Format) { - case ast.ExplainFormatROW: + case ast.ExplainFormatROW, ast.ExplainFormatBrief: if e.Rows == nil || e.Analyze { e.explainedPlans = map[int]bool{} err := e.explainPlanInRowFormat(e.TargetPlan, "root", "", "", true) @@ -990,8 +1034,6 @@ func (e *Explain) explainPlanInRowFormat(p Plan, taskType, driverSide, indent st buildSide = plan.InnerChildIdx ^ 1 case *PhysicalIndexHashJoin: buildSide = plan.InnerChildIdx ^ 1 - case *PhysicalBroadCastJoin: - buildSide = plan.InnerChildIdx } if buildSide != -1 { @@ -1023,15 +1065,25 @@ func (e *Explain) explainPlanInRowFormat(p Plan, taskType, driverSide, indent st return errors.Errorf("the store type %v is unknown", x.StoreType) } storeType = x.StoreType.Name() - err = e.explainPlanInRowFormat(x.tablePlan, "cop["+storeType+"]", "", childIndent, true) + taskName := "cop" + if x.BatchCop { + taskName = "batchCop" + } + err = e.explainPlanInRowFormat(x.tablePlan, taskName+"["+storeType+"]", "", childIndent, true) case *PhysicalIndexReader: err = e.explainPlanInRowFormat(x.indexPlan, "cop[tikv]", "", childIndent, true) case *PhysicalIndexLookUpReader: err = e.explainPlanInRowFormat(x.indexPlan, "cop[tikv]", "(Build)", childIndent, false) + if err != nil { + return + } err = e.explainPlanInRowFormat(x.tablePlan, "cop[tikv]", "(Probe)", childIndent, true) case *PhysicalIndexMergeReader: for _, pchild := range x.partialPlans { err = e.explainPlanInRowFormat(pchild, "cop[tikv]", "(Build)", childIndent, false) + if err != nil { + return + } } err = e.explainPlanInRowFormat(x.tablePlan, "cop[tikv]", "(Probe)", childIndent, true) case *Insert: @@ -1064,30 +1116,32 @@ func getRuntimeInfo(ctx sessionctx.Context, p Plan, runtimeStatsColl *execdetail explainID := p.ID() // There maybe some mock information for cop task to let runtimeStatsColl.Exists(p.ExplainID()) is true. - // So check copTaskEkxecDetail first and print the real cop task information if it's not empty. - if runtimeStatsColl.ExistsCopStats(explainID) { - copstats := runtimeStatsColl.GetCopStats(explainID) - analyzeInfo = copstats.String() - actRows = fmt.Sprint(copstats.GetActRows()) - } else if runtimeStatsColl.ExistsRootStats(explainID) { - rootstats := runtimeStatsColl.GetRootStats(explainID) - analyzeInfo = rootstats.String() - actRows = fmt.Sprint(rootstats.GetActRows()) + // So check copTaskExecDetail first and print the real cop task information if it's not empty. + if runtimeStatsColl.ExistsRootStats(explainID) { + rootStats := runtimeStatsColl.GetRootStats(explainID) + analyzeInfo = rootStats.String() + actRows = fmt.Sprint(rootStats.GetActRows()) } else { - analyzeInfo = "time:0ns, loops:0" actRows = "0" } - + if runtimeStatsColl.ExistsCopStats(explainID) { + if len(analyzeInfo) > 0 { + analyzeInfo += ", " + } + copStats := runtimeStatsColl.GetCopStats(explainID) + analyzeInfo += copStats.String() + actRows = fmt.Sprint(copStats.GetActRows()) + } memoryInfo = "N/A" memTracker := ctx.GetSessionVars().StmtCtx.MemTracker.SearchTrackerWithoutLock(p.ID()) if memTracker != nil { - memoryInfo = memTracker.BytesToString(memTracker.MaxConsumed()) + memoryInfo = memTracker.FormatBytes(memTracker.MaxConsumed()) } diskInfo = "N/A" diskTracker := ctx.GetSessionVars().StmtCtx.DiskTracker.SearchTrackerWithoutLock(p.ID()) if diskTracker != nil { - diskInfo = diskTracker.BytesToString(diskTracker.MaxConsumed()) + diskInfo = diskTracker.FormatBytes(diskTracker.MaxConsumed()) } return } @@ -1131,7 +1185,7 @@ func (e *Explain) getOperatorInfo(p Plan, id string) (string, string, string) { } var accessObject, operatorInfo string if plan, ok := p.(dataAccesser); ok { - accessObject = plan.AccessObject() + accessObject = plan.AccessObject(false) operatorInfo = plan.OperatorInfo(false) } else { if pa, ok := p.(partitionAccesser); ok && e.ctx != nil { @@ -1271,49 +1325,3 @@ func IsPointUpdateByAutoCommit(ctx sessionctx.Context, p Plan) (bool, error) { } return false, nil } - -func buildSchemaAndNameFromIndex(cols []*expression.Column, dbName model.CIStr, tblInfo *model.TableInfo, idxInfo *model.IndexInfo) (*expression.Schema, types.NameSlice) { - schema := expression.NewSchema(cols...) - idxCols := idxInfo.Columns - names := make([]*types.FieldName, 0, len(idxCols)) - tblName := tblInfo.Name - for _, col := range idxCols { - names = append(names, &types.FieldName{ - OrigTblName: tblName, - OrigColName: col.Name, - DBName: dbName, - TblName: tblName, - ColName: col.Name, - }) - } - return schema, names -} - -func buildSchemaAndNameFromPKCol(pkCol *expression.Column, dbName model.CIStr, tblInfo *model.TableInfo) (*expression.Schema, types.NameSlice) { - schema := expression.NewSchema([]*expression.Column{pkCol}...) - names := make([]*types.FieldName, 0, 1) - tblName := tblInfo.Name - col := tblInfo.GetPkColInfo() - names = append(names, &types.FieldName{ - OrigTblName: tblName, - OrigColName: col.Name, - DBName: dbName, - TblName: tblName, - ColName: col.Name, - }) - return schema, names -} - -func locateHashPartition(ctx sessionctx.Context, expr expression.Expression, pi *model.PartitionInfo, r []types.Datum) (int, error) { - ret, isNull, err := expr.EvalInt(ctx, chunk.MutRowFromDatums(r).ToRow()) - if err != nil { - return 0, err - } - if isNull { - return 0, nil - } - if ret < 0 { - ret = 0 - ret - } - return int(ret % int64(pi.Num)), nil -} diff --git a/planner/core/encode.go b/planner/core/encode.go index 390857fdecd58..2e9460a31e631 100644 --- a/planner/core/encode.go +++ b/planner/core/encode.go @@ -38,11 +38,14 @@ type planEncoder struct { // EncodePlan is used to encodePlan the plan to the plan tree with compressing. func EncodePlan(p Plan) string { - pn := encoderPool.Get().(*planEncoder) - defer encoderPool.Put(pn) + if explain, ok := p.(*Explain); ok { + p = explain.TargetPlan + } if p == nil || p.SCtx() == nil { return "" } + pn := encoderPool.Get().(*planEncoder) + defer encoderPool.Put(pn) selectPlan := getSelectPlan(p) if selectPlan != nil { failpoint.Inject("mockPlanRowCount", func(val failpoint.Value) { @@ -181,6 +184,8 @@ func getSelectPlan(p Plan) PhysicalPlan { selectPlan = x.SelectPlan case *Insert: selectPlan = x.SelectPlan + case *Explain: + selectPlan = getSelectPlan(x.TargetPlan) } } return selectPlan diff --git a/planner/core/errors.go b/planner/core/errors.go index 7e659ff646142..3b74485b96f29 100644 --- a/planner/core/errors.go +++ b/planner/core/errors.go @@ -14,72 +14,81 @@ package core import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // error definitions. var ( - ErrUnsupportedType = terror.ClassOptimizer.New(mysql.ErrUnsupportedType, mysql.MySQLErrName[mysql.ErrUnsupportedType]) - ErrAnalyzeMissIndex = terror.ClassOptimizer.New(mysql.ErrAnalyzeMissIndex, mysql.MySQLErrName[mysql.ErrAnalyzeMissIndex]) - ErrWrongParamCount = terror.ClassOptimizer.New(mysql.ErrWrongParamCount, mysql.MySQLErrName[mysql.ErrWrongParamCount]) - ErrSchemaChanged = terror.ClassOptimizer.New(mysql.ErrSchemaChanged, mysql.MySQLErrName[mysql.ErrSchemaChanged]) - ErrTablenameNotAllowedHere = terror.ClassOptimizer.New(mysql.ErrTablenameNotAllowedHere, mysql.MySQLErrName[mysql.ErrTablenameNotAllowedHere]) - ErrNotSupportedYet = terror.ClassOptimizer.New(mysql.ErrNotSupportedYet, mysql.MySQLErrName[mysql.ErrNotSupportedYet]) - ErrWrongUsage = terror.ClassOptimizer.New(mysql.ErrWrongUsage, mysql.MySQLErrName[mysql.ErrWrongUsage]) - ErrUnknown = terror.ClassOptimizer.New(mysql.ErrUnknown, mysql.MySQLErrName[mysql.ErrUnknown]) - ErrUnknownTable = terror.ClassOptimizer.New(mysql.ErrUnknownTable, mysql.MySQLErrName[mysql.ErrUnknownTable]) - ErrNoSuchTable = terror.ClassOptimizer.New(mysql.ErrNoSuchTable, mysql.MySQLErrName[mysql.ErrNoSuchTable]) - ErrWrongArguments = terror.ClassOptimizer.New(mysql.ErrWrongArguments, mysql.MySQLErrName[mysql.ErrWrongArguments]) - ErrWrongNumberOfColumnsInSelect = terror.ClassOptimizer.New(mysql.ErrWrongNumberOfColumnsInSelect, mysql.MySQLErrName[mysql.ErrWrongNumberOfColumnsInSelect]) - ErrBadGeneratedColumn = terror.ClassOptimizer.New(mysql.ErrBadGeneratedColumn, mysql.MySQLErrName[mysql.ErrBadGeneratedColumn]) - ErrFieldNotInGroupBy = terror.ClassOptimizer.New(mysql.ErrFieldNotInGroupBy, mysql.MySQLErrName[mysql.ErrFieldNotInGroupBy]) - ErrBadTable = terror.ClassOptimizer.New(mysql.ErrBadTable, mysql.MySQLErrName[mysql.ErrBadTable]) - ErrKeyDoesNotExist = terror.ClassOptimizer.New(mysql.ErrKeyDoesNotExist, mysql.MySQLErrName[mysql.ErrKeyDoesNotExist]) - ErrOperandColumns = terror.ClassOptimizer.New(mysql.ErrOperandColumns, mysql.MySQLErrName[mysql.ErrOperandColumns]) - ErrInvalidGroupFuncUse = terror.ClassOptimizer.New(mysql.ErrInvalidGroupFuncUse, mysql.MySQLErrName[mysql.ErrInvalidGroupFuncUse]) - ErrIllegalReference = terror.ClassOptimizer.New(mysql.ErrIllegalReference, mysql.MySQLErrName[mysql.ErrIllegalReference]) - ErrNoDB = terror.ClassOptimizer.New(mysql.ErrNoDB, mysql.MySQLErrName[mysql.ErrNoDB]) - ErrUnknownExplainFormat = terror.ClassOptimizer.New(mysql.ErrUnknownExplainFormat, mysql.MySQLErrName[mysql.ErrUnknownExplainFormat]) - ErrWrongGroupField = terror.ClassOptimizer.New(mysql.ErrWrongGroupField, mysql.MySQLErrName[mysql.ErrWrongGroupField]) - ErrDupFieldName = terror.ClassOptimizer.New(mysql.ErrDupFieldName, mysql.MySQLErrName[mysql.ErrDupFieldName]) - ErrNonUpdatableTable = terror.ClassOptimizer.New(mysql.ErrNonUpdatableTable, mysql.MySQLErrName[mysql.ErrNonUpdatableTable]) - ErrInternal = terror.ClassOptimizer.New(mysql.ErrInternal, mysql.MySQLErrName[mysql.ErrInternal]) - ErrNonUniqTable = terror.ClassOptimizer.New(mysql.ErrNonuniqTable, mysql.MySQLErrName[mysql.ErrNonuniqTable]) - ErrWindowInvalidWindowFuncUse = terror.ClassOptimizer.New(mysql.ErrWindowInvalidWindowFuncUse, mysql.MySQLErrName[mysql.ErrWindowInvalidWindowFuncUse]) - ErrWindowInvalidWindowFuncAliasUse = terror.ClassOptimizer.New(mysql.ErrWindowInvalidWindowFuncAliasUse, mysql.MySQLErrName[mysql.ErrWindowInvalidWindowFuncAliasUse]) - ErrWindowNoSuchWindow = terror.ClassOptimizer.New(mysql.ErrWindowNoSuchWindow, mysql.MySQLErrName[mysql.ErrWindowNoSuchWindow]) - ErrWindowCircularityInWindowGraph = terror.ClassOptimizer.New(mysql.ErrWindowCircularityInWindowGraph, mysql.MySQLErrName[mysql.ErrWindowCircularityInWindowGraph]) - ErrWindowNoChildPartitioning = terror.ClassOptimizer.New(mysql.ErrWindowNoChildPartitioning, mysql.MySQLErrName[mysql.ErrWindowNoChildPartitioning]) - ErrWindowNoInherentFrame = terror.ClassOptimizer.New(mysql.ErrWindowNoInherentFrame, mysql.MySQLErrName[mysql.ErrWindowNoInherentFrame]) - ErrWindowNoRedefineOrderBy = terror.ClassOptimizer.New(mysql.ErrWindowNoRedefineOrderBy, mysql.MySQLErrName[mysql.ErrWindowNoRedefineOrderBy]) - ErrWindowDuplicateName = terror.ClassOptimizer.New(mysql.ErrWindowDuplicateName, mysql.MySQLErrName[mysql.ErrWindowDuplicateName]) - ErrPartitionClauseOnNonpartitioned = terror.ClassOptimizer.New(mysql.ErrPartitionClauseOnNonpartitioned, mysql.MySQLErrName[mysql.ErrPartitionClauseOnNonpartitioned]) - ErrWindowFrameStartIllegal = terror.ClassOptimizer.New(mysql.ErrWindowFrameStartIllegal, mysql.MySQLErrName[mysql.ErrWindowFrameStartIllegal]) - ErrWindowFrameEndIllegal = terror.ClassOptimizer.New(mysql.ErrWindowFrameEndIllegal, mysql.MySQLErrName[mysql.ErrWindowFrameEndIllegal]) - ErrWindowFrameIllegal = terror.ClassOptimizer.New(mysql.ErrWindowFrameIllegal, mysql.MySQLErrName[mysql.ErrWindowFrameIllegal]) - ErrWindowRangeFrameOrderType = terror.ClassOptimizer.New(mysql.ErrWindowRangeFrameOrderType, mysql.MySQLErrName[mysql.ErrWindowRangeFrameOrderType]) - ErrWindowRangeFrameTemporalType = terror.ClassOptimizer.New(mysql.ErrWindowRangeFrameTemporalType, mysql.MySQLErrName[mysql.ErrWindowRangeFrameTemporalType]) - ErrWindowRangeFrameNumericType = terror.ClassOptimizer.New(mysql.ErrWindowRangeFrameNumericType, mysql.MySQLErrName[mysql.ErrWindowRangeFrameNumericType]) - ErrWindowRangeBoundNotConstant = terror.ClassOptimizer.New(mysql.ErrWindowRangeBoundNotConstant, mysql.MySQLErrName[mysql.ErrWindowRangeBoundNotConstant]) - ErrWindowRowsIntervalUse = terror.ClassOptimizer.New(mysql.ErrWindowRowsIntervalUse, mysql.MySQLErrName[mysql.ErrWindowRowsIntervalUse]) - ErrWindowFunctionIgnoresFrame = terror.ClassOptimizer.New(mysql.ErrWindowFunctionIgnoresFrame, mysql.MySQLErrName[mysql.ErrWindowFunctionIgnoresFrame]) - ErrUnsupportedOnGeneratedColumn = terror.ClassOptimizer.New(mysql.ErrUnsupportedOnGeneratedColumn, mysql.MySQLErrName[mysql.ErrUnsupportedOnGeneratedColumn]) - ErrPrivilegeCheckFail = terror.ClassOptimizer.New(mysql.ErrPrivilegeCheckFail, mysql.MySQLErrName[mysql.ErrPrivilegeCheckFail]) - ErrInvalidWildCard = terror.ClassOptimizer.New(mysql.ErrInvalidWildCard, mysql.MySQLErrName[mysql.ErrInvalidWildCard]) - ErrMixOfGroupFuncAndFields = terror.ClassOptimizer.New(mysql.ErrMixOfGroupFuncAndFieldsIncompatible, mysql.MySQLErrName[mysql.ErrMixOfGroupFuncAndFieldsIncompatible]) - errTooBigPrecision = terror.ClassExpression.New(mysql.ErrTooBigPrecision, mysql.MySQLErrName[mysql.ErrTooBigPrecision]) - ErrDBaccessDenied = terror.ClassOptimizer.New(mysql.ErrDBaccessDenied, mysql.MySQLErrName[mysql.ErrDBaccessDenied]) - ErrTableaccessDenied = terror.ClassOptimizer.New(mysql.ErrTableaccessDenied, mysql.MySQLErrName[mysql.ErrTableaccessDenied]) - ErrSpecificAccessDenied = terror.ClassOptimizer.New(mysql.ErrSpecificAccessDenied, mysql.MySQLErrName[mysql.ErrSpecificAccessDenied]) - ErrViewNoExplain = terror.ClassOptimizer.New(mysql.ErrViewNoExplain, mysql.MySQLErrName[mysql.ErrViewNoExplain]) - ErrWrongValueCountOnRow = terror.ClassOptimizer.New(mysql.ErrWrongValueCountOnRow, mysql.MySQLErrName[mysql.ErrWrongValueCountOnRow]) - ErrViewInvalid = terror.ClassOptimizer.New(mysql.ErrViewInvalid, mysql.MySQLErrName[mysql.ErrViewInvalid]) - ErrNoSuchThread = terror.ClassOptimizer.New(mysql.ErrNoSuchThread, mysql.MySQLErrName[mysql.ErrNoSuchThread]) - ErrUnknownColumn = terror.ClassOptimizer.New(mysql.ErrBadField, mysql.MySQLErrName[mysql.ErrBadField]) - ErrCartesianProductUnsupported = terror.ClassOptimizer.New(mysql.ErrCartesianProductUnsupported, mysql.MySQLErrName[mysql.ErrCartesianProductUnsupported]) - ErrStmtNotFound = terror.ClassOptimizer.New(mysql.ErrPreparedStmtNotFound, mysql.MySQLErrName[mysql.ErrPreparedStmtNotFound]) - ErrAmbiguous = terror.ClassOptimizer.New(mysql.ErrNonUniq, mysql.MySQLErrName[mysql.ErrNonUniq]) + ErrUnsupportedType = dbterror.ClassOptimizer.NewStd(mysql.ErrUnsupportedType) + ErrAnalyzeMissIndex = dbterror.ClassOptimizer.NewStd(mysql.ErrAnalyzeMissIndex) + ErrWrongParamCount = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongParamCount) + ErrSchemaChanged = dbterror.ClassOptimizer.NewStd(mysql.ErrSchemaChanged) + ErrTablenameNotAllowedHere = dbterror.ClassOptimizer.NewStd(mysql.ErrTablenameNotAllowedHere) + ErrNotSupportedYet = dbterror.ClassOptimizer.NewStd(mysql.ErrNotSupportedYet) + ErrWrongUsage = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongUsage) + ErrUnknown = dbterror.ClassOptimizer.NewStd(mysql.ErrUnknown) + ErrUnknownTable = dbterror.ClassOptimizer.NewStd(mysql.ErrUnknownTable) + ErrNoSuchTable = dbterror.ClassOptimizer.NewStd(mysql.ErrNoSuchTable) + ErrViewRecursive = dbterror.ClassOptimizer.NewStd(mysql.ErrViewRecursive) + ErrWrongArguments = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongArguments) + ErrWrongNumberOfColumnsInSelect = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongNumberOfColumnsInSelect) + ErrBadGeneratedColumn = dbterror.ClassOptimizer.NewStd(mysql.ErrBadGeneratedColumn) + ErrFieldNotInGroupBy = dbterror.ClassOptimizer.NewStd(mysql.ErrFieldNotInGroupBy) + ErrAggregateOrderNonAggQuery = dbterror.ClassOptimizer.NewStd(mysql.ErrAggregateOrderNonAggQuery) + ErrFieldInOrderNotSelect = dbterror.ClassOptimizer.NewStd(mysql.ErrFieldInOrderNotSelect) + ErrAggregateInOrderNotSelect = dbterror.ClassOptimizer.NewStd(mysql.ErrAggregateInOrderNotSelect) + ErrBadTable = dbterror.ClassOptimizer.NewStd(mysql.ErrBadTable) + ErrKeyDoesNotExist = dbterror.ClassOptimizer.NewStd(mysql.ErrKeyDoesNotExist) + ErrOperandColumns = dbterror.ClassOptimizer.NewStd(mysql.ErrOperandColumns) + ErrInvalidGroupFuncUse = dbterror.ClassOptimizer.NewStd(mysql.ErrInvalidGroupFuncUse) + ErrIllegalReference = dbterror.ClassOptimizer.NewStd(mysql.ErrIllegalReference) + ErrNoDB = dbterror.ClassOptimizer.NewStd(mysql.ErrNoDB) + ErrUnknownExplainFormat = dbterror.ClassOptimizer.NewStd(mysql.ErrUnknownExplainFormat) + ErrWrongGroupField = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongGroupField) + ErrDupFieldName = dbterror.ClassOptimizer.NewStd(mysql.ErrDupFieldName) + ErrNonUpdatableTable = dbterror.ClassOptimizer.NewStd(mysql.ErrNonUpdatableTable) + ErrMultiUpdateKeyConflict = dbterror.ClassOptimizer.NewStd(mysql.ErrMultiUpdateKeyConflict) + ErrInternal = dbterror.ClassOptimizer.NewStd(mysql.ErrInternal) + ErrNonUniqTable = dbterror.ClassOptimizer.NewStd(mysql.ErrNonuniqTable) + ErrWindowInvalidWindowFuncUse = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowInvalidWindowFuncUse) + ErrWindowInvalidWindowFuncAliasUse = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowInvalidWindowFuncAliasUse) + ErrWindowNoSuchWindow = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowNoSuchWindow) + ErrWindowCircularityInWindowGraph = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowCircularityInWindowGraph) + ErrWindowNoChildPartitioning = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowNoChildPartitioning) + ErrWindowNoInherentFrame = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowNoInherentFrame) + ErrWindowNoRedefineOrderBy = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowNoRedefineOrderBy) + ErrWindowDuplicateName = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowDuplicateName) + ErrPartitionClauseOnNonpartitioned = dbterror.ClassOptimizer.NewStd(mysql.ErrPartitionClauseOnNonpartitioned) + ErrWindowFrameStartIllegal = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowFrameStartIllegal) + ErrWindowFrameEndIllegal = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowFrameEndIllegal) + ErrWindowFrameIllegal = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowFrameIllegal) + ErrWindowRangeFrameOrderType = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowRangeFrameOrderType) + ErrWindowRangeFrameTemporalType = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowRangeFrameTemporalType) + ErrWindowRangeFrameNumericType = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowRangeFrameNumericType) + ErrWindowRangeBoundNotConstant = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowRangeBoundNotConstant) + ErrWindowRowsIntervalUse = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowRowsIntervalUse) + ErrWindowFunctionIgnoresFrame = dbterror.ClassOptimizer.NewStd(mysql.ErrWindowFunctionIgnoresFrame) + ErrUnsupportedOnGeneratedColumn = dbterror.ClassOptimizer.NewStd(mysql.ErrUnsupportedOnGeneratedColumn) + ErrPrivilegeCheckFail = dbterror.ClassOptimizer.NewStd(mysql.ErrPrivilegeCheckFail) + ErrInvalidWildCard = dbterror.ClassOptimizer.NewStd(mysql.ErrInvalidWildCard) + ErrMixOfGroupFuncAndFields = dbterror.ClassOptimizer.NewStd(mysql.ErrMixOfGroupFuncAndFieldsIncompatible) + errTooBigPrecision = dbterror.ClassExpression.NewStd(mysql.ErrTooBigPrecision) + ErrDBaccessDenied = dbterror.ClassOptimizer.NewStd(mysql.ErrDBaccessDenied) + ErrTableaccessDenied = dbterror.ClassOptimizer.NewStd(mysql.ErrTableaccessDenied) + ErrSpecificAccessDenied = dbterror.ClassOptimizer.NewStd(mysql.ErrSpecificAccessDenied) + ErrViewNoExplain = dbterror.ClassOptimizer.NewStd(mysql.ErrViewNoExplain) + ErrWrongValueCountOnRow = dbterror.ClassOptimizer.NewStd(mysql.ErrWrongValueCountOnRow) + ErrViewInvalid = dbterror.ClassOptimizer.NewStd(mysql.ErrViewInvalid) + ErrNoSuchThread = dbterror.ClassOptimizer.NewStd(mysql.ErrNoSuchThread) + ErrUnknownColumn = dbterror.ClassOptimizer.NewStd(mysql.ErrBadField) + ErrCartesianProductUnsupported = dbterror.ClassOptimizer.NewStd(mysql.ErrCartesianProductUnsupported) + ErrStmtNotFound = dbterror.ClassOptimizer.NewStd(mysql.ErrPreparedStmtNotFound) + ErrAmbiguous = dbterror.ClassOptimizer.NewStd(mysql.ErrNonUniq) + ErrUnresolvedHintName = dbterror.ClassOptimizer.NewStd(mysql.ErrUnresolvedHintName) + ErrNotHintUpdatable = dbterror.ClassOptimizer.NewStd(mysql.ErrNotHintUpdatable) + ErrWarnConflictingHint = dbterror.ClassOptimizer.NewStd(mysql.ErrWarnConflictingHint) // Since we cannot know if user logged in with a password, use message of ErrAccessDeniedNoPassword instead - ErrAccessDenied = terror.ClassOptimizer.New(mysql.ErrAccessDenied, mysql.MySQLErrName[mysql.ErrAccessDeniedNoPassword]) + ErrAccessDenied = dbterror.ClassOptimizer.NewStdErr(mysql.ErrAccessDenied, mysql.MySQLErrName[mysql.ErrAccessDeniedNoPassword]) + ErrBadNull = dbterror.ClassOptimizer.NewStd(mysql.ErrBadNull) ) diff --git a/planner/core/exhaust_physical_plans.go b/planner/core/exhaust_physical_plans.go index b6db7043b9c4b..bae99d548ae5f 100644 --- a/planner/core/exhaust_physical_plans.go +++ b/planner/core/exhaust_physical_plans.go @@ -29,6 +29,7 @@ import ( "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" @@ -40,10 +41,10 @@ import ( ) func (p *LogicalUnionScan) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return nil, true } - childProp := prop.Clone() + childProp := prop.CloneEssentialFields() us := PhysicalUnionScan{ Conditions: p.conditions, HandleCols: p.handleCols, @@ -153,7 +154,9 @@ func (p *LogicalJoin) GetMergeJoin(prop *property.PhysicalProperty, schema *expr } for _, lhsChildProperty := range p.leftProperties { offsets := getMaxSortPrefix(lhsChildProperty, leftJoinKeys) - if len(offsets) == 0 { + // If not all equal conditions hit properties. We ban merge join heuristically. Because in this case, merge join + // may get a very low performance. In executor, executes join results before other conditions filter it. + if len(offsets) < len(leftJoinKeys) { continue } @@ -265,7 +268,7 @@ func (p *LogicalJoin) getEnforcedMergeJoin(prop *property.PhysicalProperty, sche if !all { return nil } - for _, item := range prop.Items { + for _, item := range prop.SortItems { isExist := false for joinKeyPos := 0; joinKeyPos < len(leftJoinKeys); joinKeyPos++ { var key *expression.Column @@ -416,7 +419,7 @@ func (p *LogicalJoin) constructIndexJoin( return nil } chReqProps := make([]*property.PhysicalProperty, 2) - chReqProps[outerIdx] = &property.PhysicalProperty{TaskTp: property.RootTaskType, ExpectedCnt: math.MaxFloat64, Items: prop.Items} + chReqProps[outerIdx] = &property.PhysicalProperty{TaskTp: property.RootTaskType, ExpectedCnt: math.MaxFloat64, SortItems: prop.SortItems} if prop.ExpectedCnt < p.stats.RowCount { expCntScale := prop.ExpectedCnt / p.stats.RowCount chReqProps[outerIdx].ExpectedCnt = p.children[outerIdx].statsInfo().RowCount * expCntScale @@ -437,6 +440,35 @@ func (p *LogicalJoin) constructIndexJoin( newIsNullEQ = append(newIsNullEQ, isNullEQ[keyOff]) newKeyOff = append(newKeyOff, idxOff) } + + var outerHashKeys, innerHashKeys []*expression.Column + outerHashKeys, innerHashKeys = make([]*expression.Column, len(newOuterKeys)), make([]*expression.Column, len(newInnerKeys)) + copy(outerHashKeys, newOuterKeys) + copy(innerHashKeys, newInnerKeys) + // we can use the `col col` in `OtherCondition` to build the hashtable to avoid the unnecessary calculating. + for i := len(newOtherConds) - 1; i >= 0; i = i - 1 { + switch c := newOtherConds[i].(type) { + case *expression.ScalarFunction: + if c.FuncName.L == ast.EQ { + lhs, ok1 := c.GetArgs()[0].(*expression.Column) + rhs, ok2 := c.GetArgs()[1].(*expression.Column) + if ok1 && ok2 { + outerSchema, innerSchema := p.Children()[outerIdx].Schema(), p.Children()[1-outerIdx].Schema() + if outerSchema.Contains(lhs) && innerSchema.Contains(rhs) { + outerHashKeys = append(outerHashKeys, lhs) + innerHashKeys = append(innerHashKeys, rhs) + } else if innerSchema.Contains(lhs) && outerSchema.Contains(rhs) { + outerHashKeys = append(outerHashKeys, rhs) + innerHashKeys = append(innerHashKeys, lhs) + } + newOtherConds = append(newOtherConds[:i], newOtherConds[i+1:]...) + } + } + default: + continue + } + } + baseJoin := basePhysicalJoin{ InnerChildIdx: 1 - outerIdx, LeftConditions: p.LeftConditions, @@ -448,12 +480,24 @@ func (p *LogicalJoin) constructIndexJoin( IsNullEQ: newIsNullEQ, DefaultValues: p.DefaultValues, } + // Correct the collation used by hash. + for i := range outerHashKeys { + // Make compiler happy. + if len(innerHashKeys) == 0 { + return nil + } + chs, coll := expression.DeriveCollationFromExprs(nil, outerHashKeys[i], innerHashKeys[i]) + outerHashKeys[i].GetType().Charset, outerHashKeys[i].GetType().Collate = chs, coll + innerHashKeys[i].GetType().Charset, innerHashKeys[i].GetType().Collate = chs, coll + } join := PhysicalIndexJoin{ basePhysicalJoin: baseJoin, innerTask: innerTask, KeyOff2IdxOff: newKeyOff, Ranges: ranges, CompareFilters: compareFilters, + OuterHashKeys: outerHashKeys, + InnerHashKeys: innerHashKeys, }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, chReqProps...) if path != nil { join.IdxColLens = path.IdxColLens @@ -475,6 +519,10 @@ func (p *LogicalJoin) constructIndexMergeJoin( indexMergeJoins := make([]PhysicalPlan, 0, len(indexJoins)) for _, plan := range indexJoins { join := plan.(*PhysicalIndexJoin) + // Index merge join can't handle hash keys. So we ban it heuristically. + if len(join.InnerHashKeys) > len(join.InnerJoinKeys) { + return nil + } hasPrefixCol := false for _, l := range join.IdxColLens { if l != types.UnspecifiedLength { @@ -511,21 +559,21 @@ func (p *LogicalJoin) constructIndexMergeJoin( continue } // isOuterKeysPrefix means whether the outer join keys are the prefix of the prop items. - isOuterKeysPrefix := len(join.OuterJoinKeys) <= len(prop.Items) + isOuterKeysPrefix := len(join.OuterJoinKeys) <= len(prop.SortItems) compareFuncs := make([]expression.CompareFunc, 0, len(join.OuterJoinKeys)) outerCompareFuncs := make([]expression.CompareFunc, 0, len(join.OuterJoinKeys)) for i := range join.KeyOff2IdxOff { - if isOuterKeysPrefix && !prop.Items[i].Col.Equal(nil, join.OuterJoinKeys[keyOff2KeyOffOrderByIdx[i]]) { + if isOuterKeysPrefix && !prop.SortItems[i].Col.Equal(nil, join.OuterJoinKeys[keyOff2KeyOffOrderByIdx[i]]) { isOuterKeysPrefix = false } compareFuncs = append(compareFuncs, expression.GetCmpFunction(p.ctx, join.OuterJoinKeys[i], join.InnerJoinKeys[i])) outerCompareFuncs = append(outerCompareFuncs, expression.GetCmpFunction(p.ctx, join.OuterJoinKeys[i], join.OuterJoinKeys[i])) } // canKeepOuterOrder means whether the prop items are the prefix of the outer join keys. - canKeepOuterOrder := len(prop.Items) <= len(join.OuterJoinKeys) - for i := 0; canKeepOuterOrder && i < len(prop.Items); i++ { - if !prop.Items[i].Col.Equal(nil, join.OuterJoinKeys[keyOff2KeyOffOrderByIdx[i]]) { + canKeepOuterOrder := len(prop.SortItems) <= len(join.OuterJoinKeys) + for i := 0; canKeepOuterOrder && i < len(prop.SortItems); i++ { + if !prop.SortItems[i].Col.Equal(nil, join.OuterJoinKeys[keyOff2KeyOffOrderByIdx[i]]) { canKeepOuterOrder = false } } @@ -539,7 +587,7 @@ func (p *LogicalJoin) constructIndexMergeJoin( NeedOuterSort: !isOuterKeysPrefix, CompareFuncs: compareFuncs, OuterCompareFuncs: outerCompareFuncs, - Desc: !prop.IsEmpty() && prop.Items[0].Desc, + Desc: !prop.IsEmpty() && prop.SortItems[0].Desc, }.Init(p.ctx) indexMergeJoins = append(indexMergeJoins, indexMergeJoin) } @@ -620,12 +668,14 @@ func (p *LogicalJoin) getIndexJoinByOuterIdx(prop *property.PhysicalProperty, ou return p.buildIndexJoinInner2IndexScan(prop, ds, innerJoinKeys, outerJoinKeys, outerIdx, us, avgInnerRowCnt) } -func (p *LogicalJoin) getIndexJoinBuildHelper(ds *DataSource, innerJoinKeys []*expression.Column, - checkPathValid func(path *util.AccessPath) bool) (*indexJoinBuildHelper, []int) { - helper := &indexJoinBuildHelper{join: p} +func (p *LogicalJoin) getIndexJoinBuildHelper(ds *DataSource, innerJoinKeys []*expression.Column, checkPathValid func(path *util.AccessPath) bool, outerJoinKeys []*expression.Column) (*indexJoinBuildHelper, []int) { + helper := &indexJoinBuildHelper{ + join: p, + innerPlan: ds, + } for _, path := range ds.possibleAccessPaths { if checkPathValid(path) { - emptyRange, err := helper.analyzeLookUpFilters(path, ds, innerJoinKeys) + emptyRange, err := helper.analyzeLookUpFilters(path, ds, innerJoinKeys, outerJoinKeys) if emptyRange { return nil, nil } @@ -673,7 +723,7 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( var innerTask, innerTask2 task var helper *indexJoinBuildHelper if ds.tableInfo.IsCommonHandle { - helper, keyOff2IdxOff = p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return path.IsCommonHandlePath }) + helper, keyOff2IdxOff = p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return path.IsCommonHandlePath }, outerJoinKeys) if helper == nil { return nil } @@ -683,7 +733,7 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 = p.constructInnerTableScanTask(ds, nil, outerJoinKeys, us, true, !prop.IsEmpty() && prop.Items[0].Desc, avgInnerRowCnt) + innerTask2 = p.constructInnerTableScanTask(ds, nil, outerJoinKeys, us, true, !prop.IsEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) } ranges = helper.chosenRanges } else { @@ -712,21 +762,25 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 = p.constructInnerTableScanTask(ds, pkCol, outerJoinKeys, us, true, !prop.IsEmpty() && prop.Items[0].Desc, avgInnerRowCnt) + innerTask2 = p.constructInnerTableScanTask(ds, pkCol, outerJoinKeys, us, true, !prop.IsEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt) } } + var path *util.AccessPath + if helper != nil { + path = helper.chosenPath + } joins = make([]PhysicalPlan, 0, 3) failpoint.Inject("MockOnlyEnableIndexHashJoin", func(val failpoint.Value) { if val.(bool) { - failpoint.Return(p.constructIndexHashJoin(prop, outerIdx, innerTask, nil, keyOff2IdxOff, nil, nil)) + failpoint.Return(p.constructIndexHashJoin(prop, outerIdx, innerTask, nil, keyOff2IdxOff, path, nil)) } }) - joins = append(joins, p.constructIndexJoin(prop, outerIdx, innerTask, ranges, keyOff2IdxOff, nil, nil)...) + joins = append(joins, p.constructIndexJoin(prop, outerIdx, innerTask, ranges, keyOff2IdxOff, path, nil)...) // We can reuse the `innerTask` here since index nested loop hash join // do not need the inner child to promise the order. - joins = append(joins, p.constructIndexHashJoin(prop, outerIdx, innerTask, ranges, keyOff2IdxOff, nil, nil)...) + joins = append(joins, p.constructIndexHashJoin(prop, outerIdx, innerTask, ranges, keyOff2IdxOff, path, nil)...) if innerTask2 != nil { - joins = append(joins, p.constructIndexMergeJoin(prop, outerIdx, innerTask2, ranges, keyOff2IdxOff, nil, nil)...) + joins = append(joins, p.constructIndexMergeJoin(prop, outerIdx, innerTask2, ranges, keyOff2IdxOff, path, nil)...) } return joins } @@ -734,14 +788,14 @@ func (p *LogicalJoin) buildIndexJoinInner2TableScan( func (p *LogicalJoin) buildIndexJoinInner2IndexScan( prop *property.PhysicalProperty, ds *DataSource, innerJoinKeys, outerJoinKeys []*expression.Column, outerIdx int, us *LogicalUnionScan, avgInnerRowCnt float64) (joins []PhysicalPlan) { - helper, keyOff2IdxOff := p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return !path.IsTablePath() }) + helper, keyOff2IdxOff := p.getIndexJoinBuildHelper(ds, innerJoinKeys, func(path *util.AccessPath) bool { return !path.IsTablePath() }, outerJoinKeys) if helper == nil { return nil } joins = make([]PhysicalPlan, 0, 3) rangeInfo := helper.buildRangeDecidedByInformation(helper.chosenPath.IdxCols, outerJoinKeys) maxOneRow := false - if helper.chosenPath.Index.Unique && helper.maxUsedCols == len(helper.chosenPath.FullIdxCols) { + if helper.chosenPath.Index.Unique && helper.usedColsLen == len(helper.chosenPath.FullIdxCols) { l := len(helper.chosenAccess) if l == 0 { maxOneRow = true @@ -765,7 +819,7 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( // Because we can't keep order for union scan, if there is a union scan in inner task, // we can't construct index merge join. if us == nil { - innerTask2 := p.constructInnerIndexScanTask(ds, helper.chosenPath, helper.chosenRemained, outerJoinKeys, us, rangeInfo, true, !prop.IsEmpty() && prop.Items[0].Desc, avgInnerRowCnt, maxOneRow) + innerTask2 := p.constructInnerIndexScanTask(ds, helper.chosenPath, helper.chosenRemained, outerJoinKeys, us, rangeInfo, true, !prop.IsEmpty() && prop.SortItems[0].Desc, avgInnerRowCnt, maxOneRow) if innerTask2 != nil { joins = append(joins, p.constructIndexMergeJoin(prop, outerIdx, innerTask2, helper.chosenRanges, keyOff2IdxOff, helper.chosenPath, helper.lastColManager)...) } @@ -774,10 +828,12 @@ func (p *LogicalJoin) buildIndexJoinInner2IndexScan( } type indexJoinBuildHelper struct { - join *LogicalJoin + join *LogicalJoin + innerPlan *DataSource chosenIndexInfo *model.IndexInfo - maxUsedCols int + usedColsLen int + usedColsNDV float64 chosenAccess []expression.Expression chosenRemained []expression.Expression idxOff2KeyOff []int @@ -893,7 +949,7 @@ func (p *LogicalJoin) constructInnerTableScanTask( } selStats := ts.stats.Scale(selectivity) ts.addPushedDownSelection(copTask, selStats) - t := finishCopTask(ds.ctx, copTask).(*rootTask) + t := copTask.convertToRootTask(ds.ctx) reader := t.p t.p = p.constructInnerUnionScan(us, reader) return t @@ -970,6 +1026,16 @@ func (p *LogicalJoin) constructInnerIndexScanTask( physicalTableID: ds.physicalTableID, }.Init(ds.ctx, ds.blockOffset) ts.schema = is.dataSourceSchema.Clone() + if ds.tableInfo.IsCommonHandle { + commonHandle := ds.handleCols.(*CommonHandleCols) + for _, col := range commonHandle.columns { + if ts.schema.ColumnIndex(col) == -1 { + ts.Schema().Append(col) + ts.Columns = append(ts.Columns, col.ToInfo()) + cop.doubleReadNeedProj = true + } + } + } // If inner cop task need keep order, the extraHandleCol should be set. if cop.keepOrder && !ds.tableInfo.IsCommonHandle { cop.extraHandleCol, cop.doubleReadNeedProj = ts.appendExtraHandleCol(ds) @@ -981,16 +1047,6 @@ func (p *LogicalJoin) constructInnerIndexScanTask( } is.initSchema(append(path.FullIdxCols, ds.commonHandleCols...), cop.tablePlan != nil) indexConds, tblConds := ds.splitIndexFilterConditions(filterConds, path.FullIdxCols, path.FullIdxColLens, ds.tableInfo) - // Specially handle cases when input rowCount is 0, which can only happen in 2 scenarios: - // - estimated row count of outer plan is 0; - // - estimated row count of inner "DataSource + filters" is 0; - // if it is the first case, it does not matter what row count we set for inner task, since the cost of index join would - // always be 0 then; - // if it is the second case, HashJoin should always be cheaper than IndexJoin then, so we set row count of inner task - // to table size, to simply make it more expensive. - if rowCount <= 0 { - rowCount = ds.tableStats.RowCount - } if maxOneRow { // Theoretically, this line is unnecessary because row count estimation of join should guarantee rowCount is not larger // than 1.0; however, there may be rowCount larger than 1.0 in reality, e.g, pseudo statistics cases, which does not reflect @@ -1037,7 +1093,7 @@ func (p *LogicalJoin) constructInnerIndexScanTask( cop.cst = tmpPath.CountAfterAccess * rowSize * sessVars.ScanFactor finalStats := ds.tableStats.ScaleByExpectCnt(rowCount) is.addPushedDownSelection(cop, ds, tmpPath, finalStats) - t := finishCopTask(ds.ctx, cop).(*rootTask) + t := cop.convertToRootTask(ds.ctx) reader := t.p t.p = p.constructInnerUnionScan(us, reader) return t @@ -1208,16 +1264,16 @@ loopOtherConds: // It's clearly that the column c cannot be used to access data. So we need to remove it and reset the IdxOff2KeyOff to // [0 -1 -1]. // So that we can use t1.a=t2.a and t1.b > t2.b-10 and t1.b < t2.b+10 to build ranges then access data. -func (ijHelper *indexJoinBuildHelper) removeUselessEqAndInFunc( - idxCols []*expression.Column, - notKeyEqAndIn []expression.Expression) ( - usefulEqAndIn, uselessOnes []expression.Expression, -) { +func (ijHelper *indexJoinBuildHelper) removeUselessEqAndInFunc(idxCols []*expression.Column, notKeyEqAndIn []expression.Expression, outerJoinKeys []*expression.Column) (usefulEqAndIn, uselessOnes []expression.Expression) { ijHelper.curPossibleUsedKeys = make([]*expression.Column, 0, len(idxCols)) for idxColPos, notKeyColPos := 0, 0; idxColPos < len(idxCols); idxColPos++ { if ijHelper.curIdxOff2KeyOff[idxColPos] != -1 { - ijHelper.curPossibleUsedKeys = append(ijHelper.curPossibleUsedKeys, idxCols[idxColPos]) - continue + // Check collation is the new collation is enabled. + _, coll := expression.DeriveCollationFromExprs(nil, idxCols[idxColPos], outerJoinKeys[ijHelper.curIdxOff2KeyOff[idxColPos]]) + if !collate.NewCollationEnabled() || collate.CompatibleCollate(idxCols[idxColPos].GetType().Collate, coll) { + ijHelper.curPossibleUsedKeys = append(ijHelper.curPossibleUsedKeys, idxCols[idxColPos]) + continue + } } if notKeyColPos < len(notKeyEqAndIn) && ijHelper.curNotUsedIndexCols[notKeyColPos].Equal(nil, idxCols[idxColPos]) { notKeyColPos++ @@ -1234,7 +1290,7 @@ func (ijHelper *indexJoinBuildHelper) removeUselessEqAndInFunc( return notKeyEqAndIn, nil } -func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath, innerPlan *DataSource, innerJoinKeys []*expression.Column) (emptyRange bool, err error) { +func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath, innerPlan *DataSource, innerJoinKeys []*expression.Column, outerJoinKeys []*expression.Column) (emptyRange bool, err error) { if len(path.IdxCols) == 0 { return false, nil } @@ -1242,7 +1298,7 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath ijHelper.resetContextForIndex(innerJoinKeys, path.IdxCols, path.IdxColLens) notKeyEqAndIn, remained, rangeFilterCandidates := ijHelper.findUsefulEqAndInFilters(innerPlan) var remainedEqAndIn []expression.Expression - notKeyEqAndIn, remainedEqAndIn = ijHelper.removeUselessEqAndInFunc(path.IdxCols, notKeyEqAndIn) + notKeyEqAndIn, remainedEqAndIn = ijHelper.removeUselessEqAndInFunc(path.IdxCols, notKeyEqAndIn, outerJoinKeys) matchedKeyCnt := len(ijHelper.curPossibleUsedKeys) // If no join key is matched while join keys actually are not empty. We don't choose index join for now. if matchedKeyCnt <= 0 && len(innerJoinKeys) > 0 { @@ -1272,7 +1328,7 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath if emptyRange { return true, nil } - ijHelper.updateBestChoice(ranges, path, accesses, remained, nil) + ijHelper.updateBestChoice(ranges, path, accesses, remained, nil, lastColPos) return false, nil } lastPossibleCol := path.IdxCols[lastColPos] @@ -1311,7 +1367,10 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath remained = append(remained, colAccesses...) } accesses = append(accesses, colAccesses...) - ijHelper.updateBestChoice(ranges, path, accesses, remained, nil) + if len(colAccesses) > 0 { + lastColPos = lastColPos + 1 + } + ijHelper.updateBestChoice(ranges, path, accesses, remained, nil, lastColPos) return false, nil } accesses = append(accesses, lastColAccess...) @@ -1323,24 +1382,38 @@ func (ijHelper *indexJoinBuildHelper) analyzeLookUpFilters(path *util.AccessPath if emptyRange { return true, nil } - ijHelper.updateBestChoice(ranges, path, accesses, remained, lastColManager) + ijHelper.updateBestChoice(ranges, path, accesses, remained, lastColManager, lastColPos+1) return false, nil } func (ijHelper *indexJoinBuildHelper) updateBestChoice(ranges []*ranger.Range, path *util.AccessPath, accesses, - remained []expression.Expression, lastColManager *ColWithCmpFuncManager) { - // We choose the index by the number of used columns of the range, the much the better. - // Notice that there may be the cases like `t1.a=t2.a and b > 2 and b < 1`. So ranges can be nil though the conditions are valid. - // But obviously when the range is nil, we don't need index join. - if len(ranges) > 0 && len(ranges[0].LowVal) > ijHelper.maxUsedCols { - ijHelper.chosenPath = path - ijHelper.maxUsedCols = len(ranges[0].LowVal) - ijHelper.chosenRanges = ranges - ijHelper.chosenAccess = accesses - ijHelper.chosenRemained = remained - ijHelper.idxOff2KeyOff = ijHelper.curIdxOff2KeyOff - ijHelper.lastColManager = lastColManager + remained []expression.Expression, lastColManager *ColWithCmpFuncManager, usedColsLen int) { + // Notice that there may be the cases like `t1.a = t2.a and b > 2 and b < 1`, so ranges can be nil though the conditions are valid. + // Obviously when the range is nil, we don't need index join. + if len(ranges) == 0 { + return + } + var innerNDV float64 + if stats := ijHelper.innerPlan.statsInfo(); stats != nil && stats.StatsVersion != statistics.PseudoVersion { + innerNDV = getCardinality(path.IdxCols[:usedColsLen], ijHelper.innerPlan.Schema(), stats) + } + // We choose the index by the NDV of the used columns, the larger the better. + // If NDVs are same, we choose index which uses more columns. + // Note that these 2 heuristic rules are too simple to cover all cases, + // since the NDV of outer join keys are not considered, and the detached access conditions + // may contain expressions like `t1.a > t2.a`. It's pretty hard to evaluate the join selectivity + // of these non-column-equal conditions, so I prefer to keep these heuristic rules simple at least for now. + if innerNDV < ijHelper.usedColsNDV || (innerNDV == ijHelper.usedColsNDV && usedColsLen <= ijHelper.usedColsLen) { + return } + ijHelper.chosenPath = path + ijHelper.usedColsLen = len(ranges[0].LowVal) + ijHelper.usedColsNDV = innerNDV + ijHelper.chosenRanges = ranges + ijHelper.chosenAccess = accesses + ijHelper.chosenRemained = remained + ijHelper.idxOff2KeyOff = ijHelper.curIdxOff2KeyOff + ijHelper.lastColManager = lastColManager } func (ijHelper *indexJoinBuildHelper) buildTemplateRange(matchedKeyCnt int, eqAndInFuncs []expression.Expression, nextColRange []*ranger.Range, haveExtraCol bool) (ranges []*ranger.Range, emptyRange bool, err error) { @@ -1403,6 +1476,18 @@ func (ijHelper *indexJoinBuildHelper) buildTemplateRange(matchedKeyCnt int, eqAn return ranges, false, nil } +func filterIndexJoinBySessionVars(sc sessionctx.Context, indexJoins []PhysicalPlan) []PhysicalPlan { + if sc.GetSessionVars().EnableIndexMergeJoin { + return indexJoins + } + for i := len(indexJoins) - 1; i >= 0; i-- { + if _, ok := indexJoins[i].(*PhysicalIndexMergeJoin); ok { + indexJoins = append(indexJoins[:i], indexJoins[i+1:]...) + } + } + return indexJoins +} + // tryToGetIndexJoin will get index join by hints. If we can generate a valid index join by hint, the second return value // will be true, which means we force to choose this index join. Otherwise we will select a join algorithm with min-cost. func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJoins []PhysicalPlan, canForced bool) { @@ -1495,7 +1580,7 @@ func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJ } switch { case len(forcedLeftOuterJoins) == 0 && !supportRightOuter: - return allLeftOuterJoins, false + return filterIndexJoinBySessionVars(p.ctx, allLeftOuterJoins), false case len(forcedLeftOuterJoins) != 0 && (!supportRightOuter || (forceLeftOuter && !forceRightOuter)): return forcedLeftOuterJoins, true } @@ -1521,7 +1606,7 @@ func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJ } switch { case len(forcedRightOuterJoins) == 0 && !supportLeftOuter: - return allRightOuterJoins, false + return filterIndexJoinBySessionVars(p.ctx, allRightOuterJoins), false case len(forcedRightOuterJoins) != 0 && (!supportLeftOuter || (forceRightOuter && !forceLeftOuter)): return forcedRightOuterJoins, true } @@ -1533,7 +1618,30 @@ func (p *LogicalJoin) tryToGetIndexJoin(prop *property.PhysicalProperty) (indexJ if canForced { return append(forcedLeftOuterJoins, forcedRightOuterJoins...), true } - return append(allLeftOuterJoins, allRightOuterJoins...), false + return filterIndexJoinBySessionVars(p.ctx, append(allLeftOuterJoins, allRightOuterJoins...)), false +} + +func checkChildFitBC(p Plan) bool { + if p.statsInfo().HistColl == nil { + return p.statsInfo().Count() < p.SCtx().GetSessionVars().BroadcastJoinThresholdCount + } + avg := p.statsInfo().HistColl.GetAvgRowSize(p.SCtx(), p.Schema().Columns, false, false) + sz := avg * float64(p.statsInfo().Count()) + return sz < float64(p.SCtx().GetSessionVars().BroadcastJoinThresholdSize) +} + +// If we can use mpp broadcast join, that's our first choice. + +func (p *LogicalJoin) shouldUseMPPBCJ() bool { + if p.ctx.GetSessionVars().BroadcastJoinThresholdSize == 0 || p.ctx.GetSessionVars().BroadcastJoinThresholdCount == 0 { + return p.ctx.GetSessionVars().AllowBCJ + } + if p.JoinType == LeftOuterJoin || p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { + return checkChildFitBC(p.children[1]) + } else if p.JoinType == RightOuterJoin { + return checkChildFitBC(p.children[0]) + } + return checkChildFitBC(p.children[0]) || checkChildFitBC(p.children[1]) } // LogicalJoin can generates hash join, index join and sort merge join. @@ -1548,18 +1656,32 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P } }) - if prop.IsFlashOnlyProp() && ((p.preferJoinType&preferBCJoin) == 0 && p.preferJoinType > 0) { + if prop.IsFlashProp() && ((p.preferJoinType&preferBCJoin) == 0 && p.preferJoinType > 0) { + return nil, false + } + if prop.PartitionTp == property.BroadcastType { return nil, false } joins := make([]PhysicalPlan, 0, 8) - if p.ctx.GetSessionVars().AllowBCJ { + if p.ctx.GetSessionVars().AllowMPPExecution && !collate.NewCollationEnabled() { + if p.shouldUseMPPBCJ() { + mppJoins := p.tryToGetMppHashJoin(prop, true) + if (p.preferJoinType & preferBCJoin) > 0 { + return mppJoins, true + } + joins = append(joins, mppJoins...) + } else { + mppJoins := p.tryToGetMppHashJoin(prop, false) + joins = append(joins, mppJoins...) + } + } else if p.ctx.GetSessionVars().AllowBCJ { broadCastJoins := p.tryToGetBroadCastJoin(prop) if (p.preferJoinType & preferBCJoin) > 0 { return broadCastJoins, true } joins = append(joins, broadCastJoins...) } - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return joins, true } @@ -1590,15 +1712,128 @@ func (p *LogicalJoin) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P return joins, true } -func (p *LogicalJoin) tryToGetBroadCastJoin(prop *property.PhysicalProperty) []PhysicalPlan { - /// todo remove this restriction after join on new collation is supported in TiFlash - if collate.NewCollationEnabled() { +func canExprsInJoinPushdown(p *LogicalJoin, storeType kv.StoreType) bool { + equalExprs := make([]expression.Expression, 0, len(p.EqualConditions)) + for _, eqCondition := range p.EqualConditions { + if eqCondition.FuncName.L == ast.NullEQ { + return false + } + equalExprs = append(equalExprs, eqCondition) + } + if !expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, equalExprs, p.ctx.GetClient(), storeType) { + return false + } + if !expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, p.LeftConditions, p.ctx.GetClient(), storeType) { + return false + } + if !expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, p.RightConditions, p.ctx.GetClient(), storeType) { + return false + } + if !expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, p.OtherConditions, p.ctx.GetClient(), storeType) { + return false + } + return true +} + +func (p *LogicalJoin) tryToGetMppHashJoin(prop *property.PhysicalProperty, useBCJ bool) []PhysicalPlan { + if !prop.IsEmpty() { + return nil + } + if prop.TaskTp != property.RootTaskType && prop.TaskTp != property.MppTaskType { + return nil + } + + if (p.JoinType != InnerJoin && p.JoinType != LeftOuterJoin && p.JoinType != RightOuterJoin && p.JoinType != SemiJoin && p.JoinType != AntiSemiJoin) || len(p.EqualConditions) == 0 { + return nil + } + if prop.PartitionTp == property.BroadcastType { + return nil + } + if !canExprsInJoinPushdown(p, kv.TiFlash) { return nil } + lkeys, rkeys, _, _ := p.GetJoinKeys() + // check match property + baseJoin := basePhysicalJoin{ + JoinType: p.JoinType, + LeftConditions: p.LeftConditions, + RightConditions: p.RightConditions, + OtherConditions: p.OtherConditions, + DefaultValues: p.DefaultValues, + LeftJoinKeys: lkeys, + RightJoinKeys: rkeys, + } + // It indicates which side is the build side. + preferredBuildIndex := 0 + if p.JoinType == InnerJoin { + if p.children[0].statsInfo().Count() > p.children[1].statsInfo().Count() { + preferredBuildIndex = 1 + } + } else if p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin || p.JoinType == LeftOuterJoin { + preferredBuildIndex = 1 + } + baseJoin.InnerChildIdx = preferredBuildIndex + childrenProps := make([]*property.PhysicalProperty, 2) + if useBCJ { + childrenProps[preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.BroadcastType, CanAddEnforcer: true} + expCnt := math.MaxFloat64 + if prop.ExpectedCnt < p.stats.RowCount { + expCntScale := prop.ExpectedCnt / p.stats.RowCount + expCnt = p.children[1-preferredBuildIndex].statsInfo().RowCount * expCntScale + } + if prop.PartitionTp == property.HashType { + hashKeys := rkeys + if preferredBuildIndex == 1 { + hashKeys = lkeys + } + if matches := prop.IsSubsetOf(hashKeys); len(matches) != 0 { + childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, PartitionTp: property.HashType, PartitionCols: prop.PartitionCols} + } else { + return nil + } + } else { + childrenProps[1-preferredBuildIndex] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: expCnt, PartitionTp: property.AnyType} + } + } else { + if prop.PartitionTp == property.HashType { + var matches []int + if matches = prop.IsSubsetOf(lkeys); len(matches) == 0 { + matches = prop.IsSubsetOf(rkeys) + } + if len(matches) == 0 { + return nil + } + lkeys = chooseSubsetOfJoinKeys(lkeys, matches) + rkeys = chooseSubsetOfJoinKeys(rkeys, matches) + } + childrenProps[0] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.HashType, PartitionCols: lkeys, CanAddEnforcer: true} + childrenProps[1] = &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.HashType, PartitionCols: rkeys, CanAddEnforcer: true} + } + join := PhysicalHashJoin{ + basePhysicalJoin: baseJoin, + Concurrency: uint(p.ctx.GetSessionVars().CopTiFlashConcurrencyFactor), + EqualConditions: p.EqualConditions, + storeTp: kv.TiFlash, + }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, childrenProps...) + return []PhysicalPlan{join} +} + +func chooseSubsetOfJoinKeys(keys []*expression.Column, matches []int) []*expression.Column { + newKeys := make([]*expression.Column, 0, len(matches)) + for _, id := range matches { + newKeys = append(newKeys, keys[id]) + } + return newKeys +} + +func (p *LogicalJoin) tryToGetBroadCastJoin(prop *property.PhysicalProperty) []PhysicalPlan { if !prop.IsEmpty() { return nil } - if prop.TaskTp != property.RootTaskType && !prop.IsFlashOnlyProp() { + if prop.TaskTp != property.RootTaskType && !prop.IsFlashProp() { + return nil + } + if !canExprsInJoinPushdown(p, kv.TiFlash) { return nil } @@ -1611,13 +1846,13 @@ func (p *LogicalJoin) tryToGetBroadCastJoin(prop *property.PhysicalProperty) []P } } - // for left join the global idx must be 1, and for right join the global idx must be 0 - if (p.JoinType != InnerJoin && p.JoinType != LeftOuterJoin && p.JoinType != RightOuterJoin) || len(p.LeftConditions) != 0 || len(p.RightConditions) != 0 || len(p.OtherConditions) != 0 || len(p.EqualConditions) == 0 { + if (p.JoinType != InnerJoin && p.JoinType != LeftOuterJoin && p.JoinType != RightOuterJoin && p.JoinType != SemiJoin && p.JoinType != AntiSemiJoin) || len(p.EqualConditions) == 0 { return nil } + // for left/semi/anti-semi join the global idx must be 1, and for right join the global idx must be 0 if hasPrefer, idx := p.getPreferredBCJLocalIndex(); hasPrefer { - if (idx == 0 && p.JoinType == RightOuterJoin) || (idx == 1 && p.JoinType == LeftOuterJoin) { + if (idx == 0 && p.JoinType == RightOuterJoin) || (idx == 1 && (p.JoinType == LeftOuterJoin || p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin)) { return nil } return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1-idx) @@ -1626,7 +1861,7 @@ func (p *LogicalJoin) tryToGetBroadCastJoin(prop *property.PhysicalProperty) []P results := p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 0) results = append(results, p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1)...) return results - } else if p.JoinType == LeftOuterJoin { + } else if p.JoinType == LeftOuterJoin || p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 1) } return p.tryToGetBroadCastJoinByPreferGlobalIdx(prop, 0) @@ -1638,6 +1873,7 @@ func (p *LogicalJoin) tryToGetBroadCastJoinByPreferGlobalIdx(prop *property.Phys JoinType: p.JoinType, LeftConditions: p.LeftConditions, RightConditions: p.RightConditions, + OtherConditions: p.OtherConditions, DefaultValues: p.DefaultValues, LeftJoinKeys: lkeys, RightJoinKeys: rkeys, @@ -1647,6 +1883,19 @@ func (p *LogicalJoin) tryToGetBroadCastJoinByPreferGlobalIdx(prop *property.Phys if p.children[0].statsInfo().Count() > p.children[1].statsInfo().Count() { preferredBuildIndex = 1 } + if p.JoinType == SemiJoin || p.JoinType == AntiSemiJoin { + preferredBuildIndex = 1 + } + // TiFlash does not support Right out join with other conditions, if the join + // has other conditions, need to set the build side to make sure it will be + // executed as left join in TiFlash(In TiFlash the build side is always the right side) + if len(p.OtherConditions) != 0 { + if p.JoinType == RightOuterJoin { + preferredBuildIndex = 0 + } else if p.JoinType == LeftOuterJoin { + preferredBuildIndex = 1 + } + } baseJoin.InnerChildIdx = preferredBuildIndex childrenReqProps := make([]*property.PhysicalProperty, 2) childrenReqProps[preferredGlobalIndex] = &property.PhysicalProperty{TaskTp: property.CopTiFlashGlobalReadTaskType, ExpectedCnt: math.MaxFloat64} @@ -1660,8 +1909,11 @@ func (p *LogicalJoin) tryToGetBroadCastJoinByPreferGlobalIdx(prop *property.Phys childrenReqProps[1-baseJoin.InnerChildIdx].ExpectedCnt = p.children[1-baseJoin.InnerChildIdx].statsInfo().RowCount * expCntScale } - join := PhysicalBroadCastJoin{ + join := PhysicalHashJoin{ basePhysicalJoin: baseJoin, + Concurrency: uint(p.ctx.GetSessionVars().CopTiFlashConcurrencyFactor), + EqualConditions: p.EqualConditions, + storeTp: kv.TiFlash, globalChildIndex: preferredGlobalIndex, }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, childrenReqProps...) return []PhysicalPlan{join} @@ -1671,21 +1923,18 @@ func (p *LogicalJoin) tryToGetBroadCastJoinByPreferGlobalIdx(prop *property.Phys // When a sort column will be replaced by scalar function, we refuse it. // When a sort column will be replaced by a constant, we just remove it. func (p *LogicalProjection) TryToGetChildProp(prop *property.PhysicalProperty) (*property.PhysicalProperty, bool) { - if prop.IsFlashOnlyProp() { - return nil, false - } - newProp := &property.PhysicalProperty{TaskTp: property.RootTaskType, ExpectedCnt: prop.ExpectedCnt} - newCols := make([]property.Item, 0, len(prop.Items)) - for _, col := range prop.Items { + newProp := prop.CloneEssentialFields() + newCols := make([]property.SortItem, 0, len(prop.SortItems)) + for _, col := range prop.SortItems { idx := p.schema.ColumnIndex(col.Col) switch expr := p.Exprs[idx].(type) { case *expression.Column: - newCols = append(newCols, property.Item{Col: expr, Desc: col.Desc}) + newCols = append(newCols, property.SortItem{Col: expr, Desc: col.Desc}) case *expression.ScalarFunction: return nil, false } } - newProp.Items = newCols + newProp.SortItems = newCols return newProp, true } @@ -1704,13 +1953,7 @@ func (p *LogicalProjection) exhaustPhysicalPlans(prop *property.PhysicalProperty } func (lt *LogicalTopN) canPushToCop() bool { - // At present, only Aggregation, Limit, TopN can be pushed to cop task, and Projection will be supported in the future. - // When we push task to coprocessor, finishCopTask will close the cop task and create a root task in the current implementation. - // Thus, we can't push two different tasks to coprocessor now, and can only push task to coprocessor when the child is Datasource. - - // TODO: develop this function after supporting push several tasks to coprecessor and supporting Projection to coprocessor. - _, ok := lt.children[0].(*DataSource) - return ok + return lt.canChildPushDown() } func (lt *LogicalTopN) getPhysTopN(prop *property.PhysicalProperty) []PhysicalPlan { @@ -1760,7 +2003,7 @@ func (lt *LogicalTopN) getPhysLimits(prop *property.PhysicalProperty) []Physical } ret := make([]PhysicalPlan, 0, len(allTaskTypes)) for _, tp := range allTaskTypes { - resultProp := &property.PhysicalProperty{TaskTp: tp, ExpectedCnt: float64(lt.Count + lt.Offset), Items: p.Items} + resultProp := &property.PhysicalProperty{TaskTp: tp, ExpectedCnt: float64(lt.Count + lt.Offset), SortItems: p.SortItems} limit := PhysicalLimit{ Count: lt.Count, Offset: lt.Offset, @@ -1772,10 +2015,10 @@ func (lt *LogicalTopN) getPhysLimits(prop *property.PhysicalProperty) []Physical // MatchItems checks if this prop's columns can match by items totally. func MatchItems(p *property.PhysicalProperty, items []*util.ByItems) bool { - if len(items) < len(p.Items) { + if len(items) < len(p.SortItems) { return false } - for i, col := range p.Items { + for i, col := range p.SortItems { sortItem := items[i] if sortItem.Desc != col.Desc || !sortItem.Expr.Equal(nil, col.Col) { return false @@ -1797,9 +2040,10 @@ func (la *LogicalApply) GetHashJoin(prop *property.PhysicalProperty) *PhysicalHa } func (la *LogicalApply) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - if !prop.AllColsFromSchema(la.children[0].Schema()) || prop.IsFlashOnlyProp() { // for convenient, we don't pass through any prop + if !prop.AllColsFromSchema(la.children[0].Schema()) || prop.IsFlashProp() { // for convenient, we don't pass through any prop return nil, true } + disableAggPushDownToCop(la.children[0]) join := la.GetHashJoin(prop) var columns []*expression.Column for _, colColumn := range la.CorCols { @@ -1814,7 +2058,7 @@ func (la *LogicalApply) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ } var canUseCache bool - if cacheHitRatio > 0.1 && la.ctx.GetSessionVars().NestedLoopJoinCacheCapacity > 0 { + if cacheHitRatio > 0.1 && la.ctx.GetSessionVars().MemQuotaApplyCache > 0 { canUseCache = true } else { canUseCache = false @@ -1827,20 +2071,29 @@ func (la *LogicalApply) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ }.Init(la.ctx, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), la.blockOffset, - &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, Items: prop.Items}, + &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: prop.SortItems}, &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64}) apply.SetSchema(la.schema) return []PhysicalPlan{apply}, true } +func disableAggPushDownToCop(p LogicalPlan) { + for _, child := range p.Children() { + disableAggPushDownToCop(child) + } + if agg, ok := p.(*LogicalAggregation); ok { + agg.noCopPushDown = true + } +} + func (p *LogicalWindow) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return nil, true } - var byItems []property.Item + var byItems []property.SortItem byItems = append(byItems, p.PartitionBy...) byItems = append(byItems, p.OrderBy...) - childProperty := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, Items: byItems, Enforced: true} + childProperty := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, SortItems: byItems, CanAddEnforcer: true} if !prop.IsPrefix(childProperty) { return nil, true } @@ -1858,28 +2111,38 @@ func (p *LogicalWindow) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([ func (p *baseLogicalPlan) exhaustPhysicalPlans(_ *property.PhysicalProperty) ([]PhysicalPlan, bool) { panic("baseLogicalPlan.exhaustPhysicalPlans() should never be called.") } - -func (la *LogicalAggregation) canPushToCop() bool { - // At present, only Aggregation, Limit, TopN can be pushed to cop task, and Projection will be supported in the future. - // When we push task to coprocessor, finishCopTask will close the cop task and create a root task in the current implementation. +func (p *baseLogicalPlan) canChildPushDown() bool { + // At present for TiKV, only Aggregation, Limit, TopN can be pushed to cop task, and Projection will be supported in the future. + // When we push task to coprocessor, convertToRootTask will close the cop task and create a root task in the current implementation. // Thus, we can't push two different tasks to coprocessor now, and can only push task to coprocessor when the child is Datasource. + // But for TiFlash, Projection, Join and DataSource can also be pushed down in most cases. Other operators will be + // supported in the future, such as Aggregation, Limit, TopN. + switch p.children[0].(type) { + case *DataSource: + return true + case *LogicalJoin, *LogicalProjection: + // TiFlash supports pushing down more operators + return p.SCtx().GetSessionVars().AllowBCJ || (p.SCtx().GetSessionVars().AllowMPPExecution && !collate.NewCollationEnabled()) + default: + return false + } +} - // TODO: develop this function after supporting push several tasks to coprecessor and supporting Projection to coprocessor. - _, ok := la.children[0].(*DataSource) - return ok +func (la *LogicalAggregation) canPushToCop() bool { + return la.canChildPushDown() && !la.noCopPushDown } func (la *LogicalAggregation) getEnforcedStreamAggs(prop *property.PhysicalProperty) []PhysicalPlan { - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return nil } _, desc := prop.AllSameOrder() allTaskTypes := prop.GetAllPossibleChildTaskTypes() enforcedAggs := make([]PhysicalPlan, 0, len(allTaskTypes)) childProp := &property.PhysicalProperty{ - ExpectedCnt: math.Max(prop.ExpectedCnt*la.inputCount/la.stats.RowCount, prop.ExpectedCnt), - Enforced: true, - Items: property.ItemsFromCols(la.groupByCols, desc), + ExpectedCnt: math.Max(prop.ExpectedCnt*la.inputCount/la.stats.RowCount, prop.ExpectedCnt), + CanAddEnforcer: true, + SortItems: property.SortItemsFromCols(la.GetGroupByCols(), desc), } if !prop.IsPrefix(childProp) { return enforcedAggs @@ -1924,7 +2187,7 @@ func (la *LogicalAggregation) distinctArgsMeetsProperty() bool { func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []PhysicalPlan { // TODO: support CopTiFlash task type in stream agg - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return nil } all, desc := prop.AllSameOrder() @@ -1938,7 +2201,8 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P } } // group by a + b is not interested in any order. - if len(la.groupByCols) != len(la.GroupByItems) { + groupByCols := la.GetGroupByCols() + if len(groupByCols) != len(la.GroupByItems) { return nil } @@ -1949,7 +2213,7 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P } for _, possibleChildProperty := range la.possibleProperties { - childProp.Items = property.ItemsFromCols(possibleChildProperty[:len(la.groupByCols)], desc) + childProp.SortItems = property.SortItemsFromCols(possibleChildProperty[:len(groupByCols)], desc) if !prop.IsPrefix(childProp) { continue } @@ -1959,16 +2223,17 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P if la.HasDistinct() { // TODO: remove AllowDistinctAggPushDown after the cost estimation of distinct pushdown is implemented. // If AllowDistinctAggPushDown is set to true, we should not consider RootTask. - if !la.canPushToCop() || !la.ctx.GetSessionVars().AllowDistinctAggPushDown { + if !la.ctx.GetSessionVars().AllowDistinctAggPushDown { taskTypes = []property.TaskType{property.RootTaskType} - } else { - if !la.distinctArgsMeetsProperty() { - continue - } + } else if !la.distinctArgsMeetsProperty() { + continue } } else if !la.aggHints.preferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } + if !la.canPushToCop() { + taskTypes = []property.TaskType{property.RootTaskType} + } for _, taskTp := range taskTypes { copiedChildProperty := new(property.PhysicalProperty) *copiedChildProperty = *childProp // It's ok to not deep copy the "cols" field. @@ -1990,31 +2255,126 @@ func (la *LogicalAggregation) getStreamAggs(prop *property.PhysicalProperty) []P return streamAggs } +// TODO: support more operators and distinct later +func (la *LogicalAggregation) checkCanPushDownToMPP() bool { + for _, agg := range la.AggFuncs { + // MPP does not support distinct except count distinct now + if agg.HasDistinct { + if agg.Name != ast.AggFuncCount { + return false + } + } + // MPP does not support AggFuncApproxCountDistinct now + if agg.Name == ast.AggFuncApproxCountDistinct { + return false + } + } + return CheckAggCanPushCop(la.ctx, la.AggFuncs, la.GroupByItems, kv.TiFlash) +} + +func (la *LogicalAggregation) tryToGetMppHashAggs(prop *property.PhysicalProperty) (hashAggs []PhysicalPlan) { + if !prop.IsEmpty() { + return nil + } + if prop.TaskTp != property.RootTaskType && prop.TaskTp != property.MppTaskType { + return nil + } + if prop.PartitionTp == property.BroadcastType { + return nil + } + if len(la.GroupByItems) > 0 { + partitionCols := la.GetGroupByCols() + // trying to match the required parititions. + if prop.PartitionTp == property.HashType { + if matches := prop.IsSubsetOf(partitionCols); len(matches) != 0 { + partitionCols = chooseSubsetOfJoinKeys(partitionCols, matches) + } else { + // do not satisfy the property of its parent, so return empty + return nil + } + } + // TODO: permute various partition columns from group-by columns + // 1-phase agg + // If there are no available parititon cols, but still have group by items, that means group by items are all expressions or constants. + // To avoid mess, we don't do any one-phase aggregation in this case. + if len(partitionCols) != 0 { + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.HashType, PartitionCols: partitionCols, CanAddEnforcer: true} + agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) + agg.SetSchema(la.schema.Clone()) + agg.MppRunMode = Mpp1Phase + hashAggs = append(hashAggs, agg) + } + + // 2-phase agg + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.AnyType} + agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) + agg.SetSchema(la.schema.Clone()) + agg.MppRunMode = Mpp2Phase + hashAggs = append(hashAggs, agg) + + // agg runs on TiDB with a partial agg on TiFlash if possible + if prop.TaskTp == property.RootTaskType { + childProp := &property.PhysicalProperty{TaskTp: property.RootTaskType, ExpectedCnt: math.MaxFloat64} + agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) + agg.SetSchema(la.schema.Clone()) + agg.MppRunMode = MppTiDB + hashAggs = append(hashAggs, agg) + } + } else { + // TODO: support scalar agg in MPP, merge the final result to one node + childProp := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64} + agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), childProp) + agg.SetSchema(la.schema.Clone()) + agg.MppRunMode = MppTiDB + hashAggs = append(hashAggs, agg) + } + return +} + func (la *LogicalAggregation) getHashAggs(prop *property.PhysicalProperty) []PhysicalPlan { if !prop.IsEmpty() { return nil } + if prop.IsFlashProp() && !la.canPushToCop() { + return nil + } + if prop.TaskTp == property.MppTaskType && !la.checkCanPushDownToMPP() { + return nil + } hashAggs := make([]PhysicalPlan, 0, len(prop.GetAllPossibleChildTaskTypes())) taskTypes := []property.TaskType{property.CopSingleReadTaskType, property.CopDoubleReadTaskType} if la.ctx.GetSessionVars().AllowBCJ { taskTypes = append(taskTypes, property.CopTiFlashLocalReadTaskType) } + canPushDownToMPP := la.ctx.GetSessionVars().AllowMPPExecution && !collate.NewCollationEnabled() && la.checkCanPushDownToMPP() + if canPushDownToMPP { + taskTypes = append(taskTypes, property.MppTaskType) + } if la.HasDistinct() { - // TODO: remove AllowDistinctAggPushDown after the cost estimation of distinct pushdown is implemented. - // If AllowDistinctAggPushDown is set to true, we should not consider RootTask. - if !la.canPushToCop() || !la.ctx.GetSessionVars().AllowDistinctAggPushDown { + // TODO: remove after the cost estimation of distinct pushdown is implemented. + if !la.ctx.GetSessionVars().AllowDistinctAggPushDown && !canPushDownToMPP { taskTypes = []property.TaskType{property.RootTaskType} } } else if !la.aggHints.preferAggToCop { taskTypes = append(taskTypes, property.RootTaskType) } - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { taskTypes = []property.TaskType{prop.TaskTp} } + if !la.canPushToCop() { + taskTypes = []property.TaskType{property.RootTaskType} + } for _, taskTp := range taskTypes { - agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, TaskTp: taskTp}) - agg.SetSchema(la.schema.Clone()) - hashAggs = append(hashAggs, agg) + if taskTp == property.MppTaskType { + mppAggs := la.tryToGetMppHashAggs(prop) + if len(mppAggs) > 0 { + hashAggs = append(hashAggs, mppAggs...) + } + } else { + agg := NewPhysicalHashAgg(la, la.stats.ScaleByExpectCnt(prop.ExpectedCnt), &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64, TaskTp: taskTp}) + agg.SetSchema(la.schema.Clone()) + hashAggs = append(hashAggs, agg) + } } return hashAggs } @@ -2068,7 +2428,7 @@ func (la *LogicalAggregation) exhaustPhysicalPlans(prop *property.PhysicalProper } func (p *LogicalSelection) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - childProp := prop.Clone() + childProp := prop.CloneEssentialFields() sel := PhysicalSelection{ Conditions: p.Conditions, }.Init(p.ctx, p.stats.ScaleByExpectCnt(prop.ExpectedCnt), p.blockOffset, childProp) @@ -2076,20 +2436,14 @@ func (p *LogicalSelection) exhaustPhysicalPlans(prop *property.PhysicalProperty) } func (p *LogicalLimit) canPushToCop() bool { - // At present, only Aggregation, Limit, TopN can be pushed to cop task, and Projection will be supported in the future. - // When we push task to coprocessor, finishCopTask will close the cop task and create a root task in the current implementation. - // Thus, we can't push two different tasks to coprocessor now, and can only push task to coprocessor when the child is Datasource. - - // TODO: develop this function after supporting push several tasks to coprecessor and supporting Projection to coprocessor. - _, ok := p.children[0].(*DataSource) - return ok + return p.canChildPushDown() } func (p *LogicalLimit) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { if !prop.IsEmpty() { return nil, true } - // allTaskTypes := prop.GetAllPossibleChildTaskTypes() + if p.limitHints.preferLimitToCop { if !p.canPushToCop() { errMsg := "Optimizer Hint LIMIT_TO_COP is inapplicable" @@ -2110,16 +2464,17 @@ func (p *LogicalLimit) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([] Offset: p.Offset, Count: p.Count, }.Init(p.ctx, p.stats, p.blockOffset, resultProp) + limit.SetSchema(p.Schema()) ret = append(ret, limit) } return ret, true } func (p *LogicalLock) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - if prop.IsFlashOnlyProp() { + if prop.IsFlashProp() { return nil, true } - childProp := prop.Clone() + childProp := prop.CloneEssentialFields() lock := PhysicalLock{ Lock: p.Lock, TblID2Handle: p.tblID2Handle, @@ -2130,7 +2485,7 @@ func (p *LogicalLock) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]P func (p *LogicalUnionAll) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { // TODO: UnionAll can not pass any order, but we can change it to sort merge to keep order. - if !prop.IsEmpty() || prop.IsFlashOnlyProp() { + if !prop.IsEmpty() || prop.IsFlashProp() { return nil, true } chReqProps := make([]*property.PhysicalProperty, 0, len(p.children)) @@ -2180,7 +2535,7 @@ func (ls *LogicalSort) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([] } func (p *LogicalMaxOneRow) exhaustPhysicalPlans(prop *property.PhysicalProperty) ([]PhysicalPlan, bool) { - if !prop.IsEmpty() || prop.IsFlashOnlyProp() { + if !prop.IsEmpty() || prop.IsFlashProp() { return nil, true } mor := PhysicalMaxOneRow{}.Init(p.ctx, p.stats, p.blockOffset, &property.PhysicalProperty{ExpectedCnt: 2}) diff --git a/planner/core/exhaust_physical_plans_test.go b/planner/core/exhaust_physical_plans_test.go index c3569527df786..ed7a47b87cece 100644 --- a/planner/core/exhaust_physical_plans_test.go +++ b/planner/core/exhaust_physical_plans_test.go @@ -21,7 +21,9 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" + "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" ) @@ -82,6 +84,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { DBName: model.NewCIStr("test"), }) dataSourceNode.schema = dsSchema + dataSourceNode.stats = &property.StatsInfo{StatsVersion: statistics.PseudoVersion} outerChildSchema := expression.NewSchema() var outerChildNames types.NameSlice outerChildSchema.Append(&expression.Column{ @@ -197,7 +200,7 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { innerKeys: []*expression.Column{dsSchema.Columns[1]}, pushedDownConds: "a = 1 and c > 'a' and c < 'aaaaaa'", otherConds: "", - ranges: "[(1 NULL \"a\",1 NULL \"[97 97]\"]]", + ranges: "[(1 NULL \"a\",1 NULL 0x6161]]", idxOff2KeyOff: "[-1 0 -1 -1]", accesses: "[eq(Column#1, 1) gt(Column#3, a) lt(Column#3, aaaaaa)]", remained: "[gt(Column#3, a) lt(Column#3, aaaaaa)]", @@ -244,8 +247,8 @@ func (s *testUnitTestSuit) TestIndexJoinAnalyzeLookUpFilters(c *C) { others, err := s.rewriteSimpleExpr(tt.otherConds, joinNode.schema, joinColNames) c.Assert(err, IsNil) joinNode.OtherConditions = others - helper := &indexJoinBuildHelper{join: joinNode, lastColManager: nil} - _, err = helper.analyzeLookUpFilters(path, dataSourceNode, tt.innerKeys) + helper := &indexJoinBuildHelper{join: joinNode, lastColManager: nil, innerPlan: dataSourceNode} + _, err = helper.analyzeLookUpFilters(path, dataSourceNode, tt.innerKeys, tt.innerKeys) c.Assert(err, IsNil) c.Assert(fmt.Sprintf("%v", helper.chosenAccess), Equals, tt.accesses) c.Assert(fmt.Sprintf("%v", helper.chosenRanges), Equals, tt.ranges, Commentf("test case: #%v", i)) diff --git a/planner/core/explain.go b/planner/core/explain.go index 89dda15c1ecf0..e3e7e4e06d0b3 100644 --- a/planner/core/explain.go +++ b/planner/core/explain.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" @@ -28,7 +29,10 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/plancodec" "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tipb/go-tipb" ) // A plan is dataAccesser means it can access underlying data. @@ -37,7 +41,7 @@ import ( type dataAccesser interface { // AccessObject return plan's `table`, `partition` and `index`. - AccessObject() string + AccessObject(normalized bool) string // OperatorInfo return other operator information to be explained. OperatorInfo(normalized bool) string @@ -55,25 +59,33 @@ func (p *PhysicalLock) ExplainInfo() string { // ExplainID overrides the ExplainID in order to match different range. func (p *PhysicalIndexScan) ExplainID() fmt.Stringer { return stringutil.MemoizeStr(func() string { - if p.isFullScan() { - return "IndexFullScan_" + strconv.Itoa(p.id) + if p.ctx != nil && p.ctx.GetSessionVars().StmtCtx.IgnoreExplainIDSuffix { + return p.TP() } - return "IndexRangeScan_" + strconv.Itoa(p.id) + return p.TP() + "_" + strconv.Itoa(p.id) }) } +// TP overrides the TP in order to match different range. +func (p *PhysicalIndexScan) TP() string { + if p.isFullScan() { + return plancodec.TypeIndexFullScan + } + return plancodec.TypeIndexRangeScan +} + // ExplainInfo implements Plan interface. func (p *PhysicalIndexScan) ExplainInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(false) + return p.AccessObject(false) + ", " + p.OperatorInfo(false) } // ExplainNormalizedInfo implements Plan interface. func (p *PhysicalIndexScan) ExplainNormalizedInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(true) + return p.AccessObject(true) + ", " + p.OperatorInfo(true) } // AccessObject implements dataAccesser interface. -func (p *PhysicalIndexScan) AccessObject() string { +func (p *PhysicalIndexScan) AccessObject(normalized bool) string { buffer := bytes.NewBufferString("") tblName := p.Table.Name.O if p.TableAsName != nil && p.TableAsName.O != "" { @@ -81,7 +93,9 @@ func (p *PhysicalIndexScan) AccessObject() string { } fmt.Fprintf(buffer, "table:%s", tblName) if p.isPartition { - if pi := p.Table.GetPartitionInfo(); pi != nil { + if normalized { + fmt.Fprintf(buffer, ", partition:?") + } else if pi := p.Table.GetPartitionInfo(); pi != nil { partitionName := pi.GetNameByID(p.physicalTableID) fmt.Fprintf(buffer, ", partition:%s", partitionName) } @@ -89,7 +103,11 @@ func (p *PhysicalIndexScan) AccessObject() string { if len(p.Index.Columns) > 0 { buffer.WriteString(", index:" + p.Index.Name.O + "(") for i, idxCol := range p.Index.Columns { - buffer.WriteString(idxCol.Name.O) + if tblCol := p.Table.Columns[idxCol.Offset]; tblCol.Hidden { + buffer.WriteString(tblCol.GeneratedExprString) + } else { + buffer.WriteString(idxCol.Name.O) + } if i+1 < len(p.Index.Columns) { buffer.WriteString(", ") } @@ -157,27 +175,35 @@ func (p *PhysicalIndexScan) isFullScan() bool { // ExplainID overrides the ExplainID in order to match different range. func (p *PhysicalTableScan) ExplainID() fmt.Stringer { return stringutil.MemoizeStr(func() string { - if p.isChildOfIndexLookUp { - return "TableRowIDScan_" + strconv.Itoa(p.id) - } else if p.isFullScan() { - return "TableFullScan_" + strconv.Itoa(p.id) + if p.ctx != nil && p.ctx.GetSessionVars().StmtCtx.IgnoreExplainIDSuffix { + return p.TP() } - return "TableRangeScan_" + strconv.Itoa(p.id) + return p.TP() + "_" + strconv.Itoa(p.id) }) } +// TP overrides the TP in order to match different range. +func (p *PhysicalTableScan) TP() string { + if p.isChildOfIndexLookUp { + return plancodec.TypeTableRowIDScan + } else if p.isFullScan() { + return plancodec.TypeTableFullScan + } + return plancodec.TypeTableRangeScan +} + // ExplainInfo implements Plan interface. func (p *PhysicalTableScan) ExplainInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(false) + return p.AccessObject(false) + ", " + p.OperatorInfo(false) } // ExplainNormalizedInfo implements Plan interface. func (p *PhysicalTableScan) ExplainNormalizedInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(true) + return p.AccessObject(true) + ", " + p.OperatorInfo(true) } // AccessObject implements dataAccesser interface. -func (p *PhysicalTableScan) AccessObject() string { +func (p *PhysicalTableScan) AccessObject(normalized bool) string { buffer := bytes.NewBufferString("") tblName := p.Table.Name.O if p.TableAsName != nil && p.TableAsName.O != "" { @@ -185,7 +211,9 @@ func (p *PhysicalTableScan) AccessObject() string { } fmt.Fprintf(buffer, "table:%s", tblName) if p.isPartition { - if pi := p.Table.GetPartitionInfo(); pi != nil { + if normalized { + fmt.Fprintf(buffer, ", partition:?") + } else if pi := p.Table.GetPartitionInfo(); pi != nil { partitionName := pi.GetNameByID(p.physicalTableID) fmt.Fprintf(buffer, ", partition:%s", partitionName) } @@ -479,10 +507,15 @@ func (p *basePhysicalAgg) ExplainNormalizedInfo() string { // ExplainInfo implements Plan interface. func (p *PhysicalIndexJoin) ExplainInfo() string { - return p.explainInfo(false) + return p.explainInfo(false, false) +} + +// ExplainInfo implements Plan interface. +func (p *PhysicalIndexMergeJoin) ExplainInfo() string { + return p.explainInfo(false, true) } -func (p *PhysicalIndexJoin) explainInfo(normalized bool) string { +func (p *PhysicalIndexJoin) explainInfo(normalized bool, isIndexMergeJoin bool) string { sortedExplainExpressionList := expression.SortedExplainExpressionList if normalized { sortedExplainExpressionList = expression.SortedExplainNormalizedExpressionList @@ -502,6 +535,18 @@ func (p *PhysicalIndexJoin) explainInfo(normalized bool) string { fmt.Fprintf(buffer, ", inner key:%s", expression.ExplainColumnList(p.InnerJoinKeys)) } + + if len(p.OuterHashKeys) > 0 && !isIndexMergeJoin { + exprs := make([]expression.Expression, 0, len(p.OuterHashKeys)) + for i := range p.OuterHashKeys { + expr, err := expression.NewFunctionBase(MockContext(), ast.EQ, types.NewFieldType(mysql.TypeLonglong), p.OuterHashKeys[i], p.InnerHashKeys[i]) + if err != nil { + } + exprs = append(exprs, expr) + } + fmt.Fprintf(buffer, ", equal cond:%s", + sortedExplainExpressionList(exprs)) + } if len(p.LeftConditions) > 0 { fmt.Fprintf(buffer, ", left cond:%s", sortedExplainExpressionList(p.LeftConditions)) @@ -519,7 +564,12 @@ func (p *PhysicalIndexJoin) explainInfo(normalized bool) string { // ExplainNormalizedInfo implements Plan interface. func (p *PhysicalIndexJoin) ExplainNormalizedInfo() string { - return p.explainInfo(true) + return p.explainInfo(true, false) +} + +// ExplainNormalizedInfo implements Plan interface. +func (p *PhysicalIndexMergeJoin) ExplainNormalizedInfo() string { + return p.explainInfo(true, true) } // ExplainInfo implements Plan interface. @@ -614,32 +664,6 @@ func (p *PhysicalMergeJoin) ExplainNormalizedInfo() string { return p.explainInfo(true) } -// ExplainInfo implements Plan interface. -func (p *PhysicalBroadCastJoin) ExplainInfo() string { - return p.explainInfo() -} - -// ExplainNormalizedInfo implements Plan interface. -func (p *PhysicalBroadCastJoin) ExplainNormalizedInfo() string { - return p.explainInfo() -} - -func (p *PhysicalBroadCastJoin) explainInfo() string { - buffer := new(bytes.Buffer) - - buffer.WriteString(p.JoinType.String()) - - if len(p.LeftJoinKeys) > 0 { - fmt.Fprintf(buffer, ", left key:%s", - expression.ExplainColumnList(p.LeftJoinKeys)) - } - if len(p.RightJoinKeys) > 0 { - fmt.Fprintf(buffer, ", right key:%s", - expression.ExplainColumnList(p.RightJoinKeys)) - } - return buffer.String() -} - // ExplainInfo implements Plan interface. func (p *PhysicalTopN) ExplainInfo() string { buffer := bytes.NewBufferString("") @@ -736,8 +760,13 @@ func (p *PhysicalWindow) ExplainInfo() string { // ExplainInfo implements Plan interface. func (p *PhysicalShuffle) ExplainInfo() string { + explainIds := make([]fmt.Stringer, len(p.DataSources)) + for i := range p.DataSources { + explainIds[i] = p.DataSources[i].ExplainID() + } + buffer := bytes.NewBufferString("") - fmt.Fprintf(buffer, "execution info: concurrency:%v, data source:%v", p.Concurrency, p.DataSource.ExplainID()) + fmt.Fprintf(buffer, "execution info: concurrency:%v, data sources:%v", p.Concurrency, explainIds) return buffer.String() } @@ -829,6 +858,31 @@ func (p *DataSource) ExplainInfo() string { return buffer.String() } +// ExplainInfo implements Plan interface. +func (p *PhysicalExchangeSender) ExplainInfo() string { + buffer := bytes.NewBufferString("ExchangeType: ") + switch p.ExchangeType { + case tipb.ExchangeType_PassThrough: + fmt.Fprintf(buffer, "PassThrough") + case tipb.ExchangeType_Broadcast: + fmt.Fprintf(buffer, "Broadcast") + case tipb.ExchangeType_Hash: + fmt.Fprintf(buffer, "HashPartition") + fmt.Fprintf(buffer, ", Hash Cols: %s", expression.ExplainColumnList(p.HashCols)) + } + if len(p.Tasks) > 0 { + fmt.Fprintf(buffer, ", tasks: [") + for idx, task := range p.Tasks { + if idx != 0 { + fmt.Fprintf(buffer, ", ") + } + fmt.Fprintf(buffer, "%v", task.ID) + } + fmt.Fprintf(buffer, "]") + } + return buffer.String() +} + // ExplainInfo implements Plan interface. func (p *LogicalUnionScan) ExplainInfo() string { buffer := bytes.NewBufferString("") @@ -906,7 +960,11 @@ func (p *LogicalIndexScan) ExplainInfo() string { if len(index.Columns) > 0 { buffer.WriteString(", index:") for i, idxCol := range index.Columns { - buffer.WriteString(idxCol.Name.O) + if tblCol := p.Source.tableInfo.Columns[idxCol.Offset]; tblCol.Hidden { + buffer.WriteString(tblCol.GeneratedExprString) + } else { + buffer.WriteString(idxCol.Name.O) + } if i+1 < len(index.Columns) { buffer.WriteString(", ") } @@ -932,7 +990,7 @@ const MetricTableTimeFormat = "2006-01-02 15:04:05.999" // ExplainInfo implements Plan interface. func (p *PhysicalMemTable) ExplainInfo() string { - accessObject, operatorInfo := p.AccessObject(), p.OperatorInfo(false) + accessObject, operatorInfo := p.AccessObject(false), p.OperatorInfo(false) if len(operatorInfo) == 0 { return accessObject } @@ -940,7 +998,7 @@ func (p *PhysicalMemTable) ExplainInfo() string { } // AccessObject implements dataAccesser interface. -func (p *PhysicalMemTable) AccessObject() string { +func (p *PhysicalMemTable) AccessObject(_ bool) string { return "table:" + p.Table.Name.O } diff --git a/planner/core/expression_rewriter.go b/planner/core/expression_rewriter.go index 1df958dfdbc5e..f10134bb849c2 100644 --- a/planner/core/expression_rewriter.go +++ b/planner/core/expression_rewriter.go @@ -15,8 +15,11 @@ package core import ( "context" + "encoding/hex" + "encoding/json" "strconv" "strings" + "time" "github.com/pingcap/errors" "github.com/pingcap/parser/ast" @@ -24,15 +27,19 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/opcode" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/stringutil" @@ -59,7 +66,7 @@ func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expressi if sctx.GetSessionVars().TxnCtx.InfoSchema != nil { is = sctx.GetSessionVars().TxnCtx.InfoSchema.(infoschema.InfoSchema) } - b := NewPlanBuilder(sctx, is, &hint.BlockHintProcessor{}) + b, savedBlockNames := NewPlanBuilder(sctx, is, &hint.BlockHintProcessor{}) fakePlan := LogicalTableDual{}.Init(sctx, 0) if schema != nil { fakePlan.schema = schema @@ -70,6 +77,7 @@ func rewriteAstExpr(sctx sessionctx.Context, expr ast.ExprNode, schema *expressi if err != nil { return nil, err } + sctx.GetSessionVars().PlannerSelectBlockAsName = savedBlockNames return newExpr, nil } @@ -144,6 +152,7 @@ func (b *PlanBuilder) getExpressionRewriter(ctx context.Context, p LogicalPlan) if len(b.rewriterPool) < b.rewriterCounter { rewriter = &expressionRewriter{p: p, b: b, sctx: b.ctx, ctx: ctx} + rewriter.sctx.SetValue(expression.TiDBDecodeKeyFunctionKey, decodeKeyFromString) b.rewriterPool = append(b.rewriterPool, rewriter) return } @@ -329,11 +338,24 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { if er.aggrMap != nil { index, ok = er.aggrMap[v] } - if !ok { - er.err = ErrInvalidGroupFuncUse + if ok { + // index < 0 indicates this is a correlated aggregate belonging to outer query, + // for which a correlated column will be created later, so we append a null constant + // as a temporary result expression. + if index < 0 { + er.ctxStackAppend(expression.NewNull(), types.EmptyName) + } else { + // index >= 0 indicates this is a regular aggregate column + er.ctxStackAppend(er.schema.Columns[index], er.names[index]) + } return inNode, true } - er.ctxStackAppend(er.schema.Columns[index], er.names[index]) + // replace correlated aggregate in sub-query with its corresponding correlated column + if col, ok := er.b.correlatedAggMapper[v]; ok { + er.ctxStackAppend(col, types.EmptyName) + return inNode, true + } + er.err = ErrInvalidGroupFuncUse return inNode, true case *ast.ColumnNameExpr: if index, ok := er.b.colMapper[v]; ok { @@ -401,6 +423,7 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { er.ctxStackAppend(er.schema.Columns[index], er.names[index]) return inNode, true case *ast.FuncCallExpr: + er.asScalar = true if _, ok := expression.DisableFoldFunctions[v.FnName.L]; ok { er.disableFoldCounter++ } @@ -408,12 +431,18 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { er.tryFoldCounter++ } case *ast.CaseExpr: + er.asScalar = true if _, ok := expression.DisableFoldFunctions["case"]; ok { er.disableFoldCounter++ } if _, ok := expression.TryFoldFunctions["case"]; ok { er.tryFoldCounter++ } + case *ast.BinaryOperationExpr: + er.asScalar = true + if v.Op == opcode.LogicAnd || v.Op == opcode.LogicOr { + er.tryFoldCounter++ + } case *ast.SetCollationExpr: // Do nothing default: @@ -423,16 +452,41 @@ func (er *expressionRewriter) Enter(inNode ast.Node) (ast.Node, bool) { } func (er *expressionRewriter) buildSemiApplyFromEqualSubq(np LogicalPlan, l, r expression.Expression, not bool) { - var condition expression.Expression - if rCol, ok := r.(*expression.Column); ok && (er.asScalar || not) { - // If both input columns of `!= all / = any` expression are not null, we can treat the expression - // as normal column equal condition. - if lCol, ok := l.(*expression.Column); !ok || !mysql.HasNotNullFlag(lCol.GetType().Flag) || !mysql.HasNotNullFlag(rCol.GetType().Flag) { - rColCopy := *rCol - rColCopy.InOperand = true - r = &rColCopy + if er.asScalar || not { + if expression.GetRowLen(r) == 1 { + rCol := r.(*expression.Column) + // If both input columns of `!= all / = any` expression are not null, we can treat the expression + // as normal column equal condition. + if !expression.ExprNotNull(l) || !expression.ExprNotNull(rCol) { + rColCopy := *rCol + rColCopy.InOperand = true + r = &rColCopy + } + } else { + rowFunc := r.(*expression.ScalarFunction) + rargs := rowFunc.GetArgs() + args := make([]expression.Expression, 0, len(rargs)) + modified := false + for i, rarg := range rargs { + larg := expression.GetFuncArg(l, i) + if !expression.ExprNotNull(larg) || !expression.ExprNotNull(rarg) { + rCol := rarg.(*expression.Column) + rColCopy := *rCol + rColCopy.InOperand = true + rarg = &rColCopy + modified = true + } + args = append(args, rarg) + } + if modified { + r, er.err = er.newFunction(ast.RowFunc, args[0].GetType(), args...) + if er.err != nil { + return + } + } } } + var condition expression.Expression condition, er.err = er.constructBinaryOpFunction(l, r, ast.EQ) if er.err != nil { return @@ -488,6 +542,7 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. er.handleEQAll(lexpr, rexpr, np) } else { // `a = any(subq)` will be rewriten as `a in (subq)`. + er.asScalar = true er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, false) if er.err != nil { return v, true @@ -496,6 +551,7 @@ func (er *expressionRewriter) handleCompareSubquery(ctx context.Context, v *ast. } else if v.Op == opcode.NE { if v.All { // `a != all(subq)` will be rewriten as `a not in (subq)`. + er.asScalar = true er.buildSemiApplyFromEqualSubq(np, lexpr, rexpr, true) if er.err != nil { return v, true @@ -809,7 +865,7 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte if v.Not || asScalar { // If both input columns of `in` expression are not null, we can treat the expression // as normal column equal condition instead. - if !mysql.HasNotNullFlag(lexpr.GetType().Flag) || !mysql.HasNotNullFlag(rCol.GetType().Flag) { + if !expression.ExprNotNull(lexpr) || !expression.ExprNotNull(rCol) { rColCopy := *rCol rColCopy.InOperand = true rexpr = &rColCopy @@ -817,7 +873,13 @@ func (er *expressionRewriter) handleInSubquery(ctx context.Context, v *ast.Patte } } else { args := make([]expression.Expression, 0, np.Schema().Len()) - for _, col := range np.Schema().Columns { + for i, col := range np.Schema().Columns { + larg := expression.GetFuncArg(lexpr, i) + if !expression.ExprNotNull(larg) || !expression.ExprNotNull(col) { + rarg := *col + rarg.InOperand = true + col = &rarg + } args = append(args, col) } rexpr, er.err = er.newFunction(ast.RowFunc, args[0].GetType(), args...) @@ -954,8 +1016,16 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok case *ast.AggregateFuncExpr, *ast.ColumnNameExpr, *ast.ParenthesesExpr, *ast.WhenClause, *ast.SubqueryExpr, *ast.ExistsSubqueryExpr, *ast.CompareSubqueryExpr, *ast.ValuesExpr, *ast.WindowFuncExpr, *ast.TableNameExpr: case *driver.ValueExpr: - v.Datum.SetValue(v.Datum.GetValue(), &v.Type) - value := &expression.Constant{Value: v.Datum, RetType: &v.Type} + // set right not null flag for constant value + retType := v.Type.Clone() + switch v.Datum.Kind() { + case types.KindNull: + retType.Flag &= ^mysql.NotNullFlag + default: + retType.Flag |= mysql.NotNullFlag + } + v.Datum.SetValue(v.Datum.GetValue(), retType) + value := &expression.Constant{Value: v.Datum, RetType: retType} er.ctxStackAppend(value, types.EmptyName) case *driver.ParamMarkerExpr: var value expression.Expression @@ -981,6 +1051,9 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok case *ast.UnaryOperationExpr: er.unaryOpToExpression(v) case *ast.BinaryOperationExpr: + if v.Op == opcode.LogicAnd || v.Op == opcode.LogicOr { + er.tryFoldCounter-- + } er.binaryOpToExpression(v) case *ast.BetweenExpr: er.betweenToExpression(v) @@ -1005,6 +1078,10 @@ func (er *expressionRewriter) Leave(originInNode ast.Node) (retNode ast.Node, ok return retNode, false } + if v.Tp.EvalType() == types.ETString { + arg.SetCoercibility(expression.CoercibilityImplicit) + } + er.ctxStack[len(er.ctxStack)-1] = expression.BuildCastFunction(er.sctx, arg, v.Tp) er.ctxNameStk[len(er.ctxNameStk)-1] = types.EmptyName case *ast.PatternLikeExpr: @@ -1108,17 +1185,27 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { sessionVars := er.b.ctx.GetSessionVars() if !v.IsSystem { if v.Value != nil { - er.ctxStack[stkLen-1], er.err = er.newFunction(ast.SetVar, - er.ctxStack[stkLen-1].GetType(), - expression.DatumToConstant(types.NewDatum(name), mysql.TypeString), + tp := er.ctxStack[stkLen-1].GetType() + er.ctxStack[stkLen-1], er.err = er.newFunction(ast.SetVar, tp, + expression.DatumToConstant(types.NewDatum(name), mysql.TypeString, 0), er.ctxStack[stkLen-1]) er.ctxNameStk[stkLen-1] = types.EmptyName + // Store the field type of the variable into SessionVars.UserVarTypes. + // Normally we can infer the type from SessionVars.User, but we need SessionVars.UserVarTypes when + // GetVar has not been executed to fill the SessionVars.Users. + sessionVars.UsersLock.Lock() + sessionVars.UserVarTypes[name] = tp + sessionVars.UsersLock.Unlock() return } - f, err := er.newFunction(ast.GetVar, - // TODO: Here is wrong, the sessionVars should store a name -> Datum map. Will fix it later. - types.NewFieldType(mysql.TypeString), - expression.DatumToConstant(types.NewStringDatum(name), mysql.TypeString)) + sessionVars.UsersLock.RLock() + tp, ok := sessionVars.UserVarTypes[name] + sessionVars.UsersLock.RUnlock() + if !ok { + tp = types.NewFieldType(mysql.TypeVarString) + tp.Flen = mysql.MaxFieldVarCharLength + } + f, err := er.newFunction(ast.GetVar, tp, expression.DatumToConstant(types.NewStringDatum(name), mysql.TypeString, 0)) if err != nil { er.err = err return @@ -1151,7 +1238,8 @@ func (er *expressionRewriter) rewriteVariable(v *ast.VariableExpr) { er.err = err return } - e := expression.DatumToConstant(types.NewStringDatum(val), mysql.TypeVarString) + nativeVal, nativeType, nativeFlag := sysVar.GetNativeValType(val) + e := expression.DatumToConstant(nativeVal, nativeType, nativeFlag) e.GetType().Charset, _ = er.sctx.GetSessionVars().GetSystemVar(variable.CharacterSetConnection) e.GetType().Collate, _ = er.sctx.GetSessionVars().GetSystemVar(variable.CollationConnection) er.ctxStackAppend(e, types.EmptyName) @@ -1168,7 +1256,7 @@ func (er *expressionRewriter) unaryOpToExpression(v *ast.UnaryOperationExpr) { op = ast.UnaryMinus case opcode.BitNeg: op = ast.BitNeg - case opcode.Not: + case opcode.Not, opcode.Not2: op = ast.UnaryNot default: er.err = errors.Errorf("Unknown Unary Op %T", v.Op) @@ -1401,8 +1489,8 @@ func (er *expressionRewriter) patternLikeToExpression(v *ast.PatternLikeExpr) { var function expression.Expression fieldType := &types.FieldType{} isPatternExactMatch := false - // Treat predicate 'like' the same way as predicate '=' when it is an exact match. - if patExpression, ok := er.ctxStack[l-1].(*expression.Constant); ok { + // Treat predicate 'like' the same way as predicate '=' when it is an exact match and new collation is not enabled. + if patExpression, ok := er.ctxStack[l-1].(*expression.Constant); ok && !collate.NewCollationEnabled() { patString, isNull, err := patExpression.EvalString(nil, chunk.Row{}) if err != nil { er.err = err @@ -1460,6 +1548,45 @@ func (er *expressionRewriter) rowToScalarFunc(v *ast.RowExpr) { er.ctxStackAppend(function, types.EmptyName) } +func (er *expressionRewriter) wrapExpWithCast() (expr, lexp, rexp expression.Expression) { + stkLen := len(er.ctxStack) + expr, lexp, rexp = er.ctxStack[stkLen-3], er.ctxStack[stkLen-2], er.ctxStack[stkLen-1] + var castFunc func(sessionctx.Context, expression.Expression) expression.Expression + switch expression.ResolveType4Between([3]expression.Expression{expr, lexp, rexp}) { + case types.ETInt: + castFunc = expression.WrapWithCastAsInt + case types.ETReal: + castFunc = expression.WrapWithCastAsReal + case types.ETDecimal: + castFunc = expression.WrapWithCastAsDecimal + case types.ETString: + castFunc = func(ctx sessionctx.Context, e expression.Expression) expression.Expression { + // string kind expression do not need cast + if e.GetType().EvalType().IsStringKind() { + return e + } + return expression.WrapWithCastAsString(ctx, e) + } + case types.ETDuration: + expr = expression.WrapWithCastAsTime(er.sctx, expr, types.NewFieldType(mysql.TypeDuration)) + lexp = expression.WrapWithCastAsTime(er.sctx, lexp, types.NewFieldType(mysql.TypeDuration)) + rexp = expression.WrapWithCastAsTime(er.sctx, rexp, types.NewFieldType(mysql.TypeDuration)) + return + case types.ETDatetime: + expr = expression.WrapWithCastAsTime(er.sctx, expr, types.NewFieldType(mysql.TypeDatetime)) + lexp = expression.WrapWithCastAsTime(er.sctx, lexp, types.NewFieldType(mysql.TypeDatetime)) + rexp = expression.WrapWithCastAsTime(er.sctx, rexp, types.NewFieldType(mysql.TypeDatetime)) + return + default: + return + } + + expr = castFunc(er.sctx, expr) + lexp = castFunc(er.sctx, lexp) + rexp = castFunc(er.sctx, rexp) + return +} + func (er *expressionRewriter) betweenToExpression(v *ast.BetweenExpr) { stkLen := len(er.ctxStack) er.err = expression.CheckArgsNotMultiColumnRow(er.ctxStack[stkLen-3:]...) @@ -1467,13 +1594,7 @@ func (er *expressionRewriter) betweenToExpression(v *ast.BetweenExpr) { return } - expr, lexp, rexp := er.ctxStack[stkLen-3], er.ctxStack[stkLen-2], er.ctxStack[stkLen-1] - - if expression.GetCmpTp4MinMax([]expression.Expression{expr, lexp, rexp}) == types.ETDatetime { - expr = expression.WrapWithCastAsTime(er.sctx, expr, types.NewFieldType(mysql.TypeDatetime)) - lexp = expression.WrapWithCastAsTime(er.sctx, lexp, types.NewFieldType(mysql.TypeDatetime)) - rexp = expression.WrapWithCastAsTime(er.sctx, rexp, types.NewFieldType(mysql.TypeDatetime)) - } + expr, lexp, rexp := er.wrapExpWithCast() var op string var l, r expression.Expression @@ -1634,27 +1755,42 @@ func (er *expressionRewriter) toColumn(v *ast.ColumnName) { return } } - if join, ok := er.p.(*LogicalJoin); ok && join.redundantSchema != nil { - idx, err := expression.FindFieldName(join.redundantNames, v) - if err != nil { - er.err = err - return - } - if idx >= 0 { - er.ctxStackAppend(join.redundantSchema.Columns[idx], join.redundantNames[idx]) - return - } - } if _, ok := er.p.(*LogicalUnionAll); ok && v.Table.O != "" { er.err = ErrTablenameNotAllowedHere.GenWithStackByArgs(v.Table.O, "SELECT", clauseMsg[er.b.curClause]) return } + col, name, err := findFieldNameFromNaturalUsingJoin(er.p, v) + if err != nil { + er.err = err + return + } else if col != nil { + er.ctxStackAppend(col, name) + return + } if er.b.curClause == globalOrderByClause { er.b.curClause = orderByClause } er.err = ErrUnknownColumn.GenWithStackByArgs(v.String(), clauseMsg[er.b.curClause]) } +func findFieldNameFromNaturalUsingJoin(p LogicalPlan, v *ast.ColumnName) (col *expression.Column, name *types.FieldName, err error) { + switch x := p.(type) { + case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: + return findFieldNameFromNaturalUsingJoin(p.Children()[0], v) + case *LogicalJoin: + if x.redundantSchema != nil { + idx, err := expression.FindFieldName(x.redundantNames, v) + if err != nil { + return nil, nil, err + } + if idx >= 0 { + return x.redundantSchema.Columns[idx], x.redundantNames[idx], nil + } + } + } + return nil, nil, nil +} + func (er *expressionRewriter) evalDefaultExpr(v *ast.DefaultExpr) { var name *types.FieldName // Here we will find the corresponding column for default function. At the same time, we need to consider the issue @@ -1746,3 +1882,190 @@ func hasCurrentDatetimeDefault(col *table.Column) bool { } return strings.ToLower(x) == ast.CurrentTimestamp } + +func decodeKeyFromString(ctx sessionctx.Context, s string) string { + key, err := hex.DecodeString(s) + if err != nil { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) + return s + } + // Auto decode byte if needed. + _, bs, err := codec.DecodeBytes(key, nil) + if err == nil { + key = bs + } + tableID := tablecodec.DecodeTableID(key) + if tableID == 0 { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) + return s + } + dm := domain.GetDomain(ctx) + if dm == nil { + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("domain not found when decoding record/index key: %X", key)) + return s + } + tbl, _ := dm.InfoSchema().TableByID(tableID) + loc := ctx.GetSessionVars().Location() + if tablecodec.IsRecordKey(key) { + ret, err := decodeRecordKey(key, tableID, tbl, loc) + if err != nil { + ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return s + } + return ret + } else if tablecodec.IsIndexKey(key) { + ret, err := decodeIndexKey(key, tableID, tbl, loc) + if err != nil { + ctx.GetSessionVars().StmtCtx.AppendWarning(err) + return s + } + return ret + } + ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("invalid record/index key: %X", key)) + return s +} + +func decodeRecordKey(key []byte, tableID int64, tbl table.Table, loc *time.Location) (string, error) { + _, handle, err := tablecodec.DecodeRecordKey(key) + if err != nil { + return "", errors.Trace(err) + } + if handle.IsInt() { + ret := make(map[string]interface{}) + ret["table_id"] = strconv.FormatInt(tableID, 10) + ret["_tidb_rowid"] = handle.IntValue() + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil + } + if tbl != nil { + tblInfo := tbl.Meta() + idxInfo := tables.FindPrimaryIndex(tblInfo) + if idxInfo == nil { + return "", errors.Trace(errors.Errorf("primary key not found when decoding record key: %X", key)) + } + cols := make(map[int64]*types.FieldType, len(tblInfo.Columns)) + for _, col := range tblInfo.Columns { + cols[col.ID] = &col.FieldType + } + handleColIDs := make([]int64, 0, len(idxInfo.Columns)) + for _, col := range idxInfo.Columns { + handleColIDs = append(handleColIDs, tblInfo.Columns[col.Offset].ID) + } + + if len(handleColIDs) != handle.NumCols() { + return "", errors.Trace(errors.Errorf("primary key length not match handle columns number in key")) + } + datumMap, err := tablecodec.DecodeHandleToDatumMap(handle, handleColIDs, cols, loc, nil) + if err != nil { + return "", errors.Trace(err) + } + ret := make(map[string]interface{}) + ret["table_id"] = tableID + handleRet := make(map[string]interface{}) + for colID, dt := range datumMap { + dtStr, err := datumToJSONObject(&dt) + if err != nil { + return "", errors.Trace(err) + } + found := false + for _, colInfo := range tblInfo.Columns { + if colInfo.ID == colID { + found = true + handleRet[colInfo.Name.L] = dtStr + break + } + } + if !found { + return "", errors.Trace(errors.Errorf("column not found when decoding record key: %X", key)) + } + } + ret["handle"] = handleRet + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil + } + ret := make(map[string]interface{}) + ret["table_id"] = tableID + ret["handle"] = handle.String() + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil +} + +func decodeIndexKey(key []byte, tableID int64, tbl table.Table, loc *time.Location) (string, error) { + if tbl != nil { + _, indexID, _, err := tablecodec.DecodeKeyHead(key) + if err != nil { + return "", errors.Trace(errors.Errorf("invalid record/index key: %X", key)) + } + tblInfo := tbl.Meta() + var targetIndex *model.IndexInfo + for _, idx := range tblInfo.Indices { + if idx.ID == indexID { + targetIndex = idx + break + } + } + if targetIndex == nil { + return "", errors.Trace(errors.Errorf("index not found when decoding index key: %X", key)) + } + colInfos := tables.BuildRowcodecColInfoForIndexColumns(targetIndex, tblInfo) + tps := tables.BuildFieldTypesForIndexColumns(targetIndex, tblInfo) + values, err := tablecodec.DecodeIndexKV(key, []byte{0}, len(colInfos), tablecodec.HandleNotNeeded, colInfos) + if err != nil { + return "", errors.Trace(err) + } + ds := make([]types.Datum, 0, len(colInfos)) + for i := 0; i < len(colInfos); i++ { + d, err := tablecodec.DecodeColumnValue(values[i], tps[i], loc) + if err != nil { + return "", errors.Trace(err) + } + ds = append(ds, d) + } + ret := make(map[string]interface{}) + ret["table_id"] = tableID + ret["index_id"] = indexID + idxValMap := make(map[string]interface{}, len(targetIndex.Columns)) + for i := 0; i < len(targetIndex.Columns); i++ { + dtStr, err := datumToJSONObject(&ds[i]) + if err != nil { + return "", errors.Trace(err) + } + idxValMap[targetIndex.Columns[i].Name.L] = dtStr + } + ret["index_vals"] = idxValMap + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil + } + _, indexID, indexValues, err := tablecodec.DecodeIndexKey(key) + if err != nil { + return "", errors.Trace(errors.Errorf("invalid index key: %X", key)) + } + ret := make(map[string]interface{}) + ret["table_id"] = tableID + ret["index_id"] = indexID + ret["index_vals"] = strings.Join(indexValues, ", ") + retStr, err := json.Marshal(ret) + if err != nil { + return "", errors.Trace(err) + } + return string(retStr), nil +} + +func datumToJSONObject(d *types.Datum) (interface{}, error) { + if d.IsNull() { + return nil, nil + } + return d.ToString() +} diff --git a/planner/core/expression_rewriter_test.go b/planner/core/expression_rewriter_test.go index 54497936cb7df..66bb860a52f0b 100644 --- a/planner/core/expression_rewriter_test.go +++ b/planner/core/expression_rewriter_test.go @@ -307,3 +307,91 @@ func (s *testExpressionRewriterSuite) TestIssue20007(c *C) { testkit.Rows("2 epic wiles 2020-01-02 23:29:51", "3 silly burnell 2020-02-25 07:43:07")) } } + +func (s *testExpressionRewriterSuite) TestIssue9869(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1;") + tk.MustExec("create table t1(a int, b bigint unsigned);") + tk.MustExec("insert into t1 (a, b) values (1,4572794622775114594), (2,18196094287899841997),(3,11120436154190595086);") + tk.MustQuery("select (case t1.a when 0 then 0 else t1.b end), cast(t1.b as signed) from t1;").Check( + testkit.Rows("4572794622775114594 4572794622775114594", "18196094287899841997 -250649785809709619", "11120436154190595086 -7326307919518956530")) +} + +func (s *testExpressionRewriterSuite) TestIssue17652(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(x bigint unsigned);") + tk.MustExec("insert into t values( 9999999703771440633);") + tk.MustQuery("select ifnull(max(x), 0) from t").Check( + testkit.Rows("9999999703771440633")) +} + +func (s *testExpressionRewriterSuite) TestCompareMultiFieldsInSubquery(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + tk.MustExec("use test;") + tk.MustExec("drop table if exists t1, t2, t3, t4;") + tk.MustExec("CREATE TABLE t1(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t2(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t3(c1 int, c2 int);") + tk.MustExec("CREATE TABLE t4(c1 int, c2 int);") + tk.MustExec("INSERT INTO t1 VALUES (0, 0), (NULL, NULL);") + tk.MustExec("INSERT INTO t2 VALUES (0, 0), (NULL, NULL);") + tk.MustExec("INSERT INTO t3 VALUES (1, 2);") + // issue #13551 and #21674 + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows("0 0", " ")) + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1 FROM t2 LIMIT 1) = ANY (SELECT c1 FROM t1);").Check(testkit.Rows("0 0", " ")) + tk.MustQuery("SELECT * FROM t2 WHERE (SELECT c1, c2 FROM t2 order by c1 LIMIT 1) = ANY (SELECT c1, c2 FROM t1);").Check(testkit.Rows()) + + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustExec("INSERT INTO t4 VALUES (1, 3);") + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows()) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows("1 2")) + tk.MustExec("INSERT INTO t4 VALUES (1, 2);") + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1 FROM t3 LIMIT 1) != ALL(SELECT c1 FROM t4);").Check(testkit.Rows()) + tk.MustQuery("SELECT * FROM t3 WHERE (SELECT c1, c2 FROM t3 LIMIT 1) != ALL(SELECT c1, c2 FROM t4);").Check(testkit.Rows()) + +} + +func (s *testExpressionRewriterSuite) TestIssue22818(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a time);") + tk.MustExec("insert into t values(\"23:22:22\");") + tk.MustQuery("select * from t where a between \"23:22:22\" and \"23:22:22\"").Check( + testkit.Rows("23:22:22")) +} diff --git a/planner/core/expression_test.go b/planner/core/expression_test.go index 0f19b800a52ed..4461db382b47a 100644 --- a/planner/core/expression_test.go +++ b/planner/core/expression_test.go @@ -72,6 +72,7 @@ func (s *testExpressionSuite) TestBetween(c *C) { {exprStr: "1 not between 2 and 3", resultStr: "1"}, {exprStr: "'2001-04-10 12:34:56' between cast('2001-01-01 01:01:01' as datetime) and '01-05-01'", resultStr: "1"}, {exprStr: "20010410123456 between cast('2001-01-01 01:01:01' as datetime) and 010501", resultStr: "0"}, + {exprStr: "20010410123456 between cast('2001-01-01 01:01:01' as datetime) and 20010501123456", resultStr: "1"}, } s.runTests(c, tests) } diff --git a/planner/core/find_best_task.go b/planner/core/find_best_task.go index ec5e5192cfbfd..4c4d18a15ea2b 100644 --- a/planner/core/find_best_task.go +++ b/planner/core/find_best_task.go @@ -27,6 +27,7 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" + tidbutil "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" @@ -89,47 +90,43 @@ func (c *PlanCounterTp) IsForce() bool { return *c != -1 } -// wholeTaskTypes records all possible kinds of task that a plan can return. For Agg, TopN and Limit, we will try to get -// these tasks one by one. -var wholeTaskTypes = [...]property.TaskType{property.CopSingleReadTaskType, property.CopDoubleReadTaskType, property.RootTaskType} - var invalidTask = &rootTask{cst: math.MaxFloat64} // GetPropByOrderByItems will check if this sort property can be pushed or not. In order to simplify the problem, we only // consider the case that all expression are columns. func GetPropByOrderByItems(items []*util.ByItems) (*property.PhysicalProperty, bool) { - propItems := make([]property.Item, 0, len(items)) + propItems := make([]property.SortItem, 0, len(items)) for _, item := range items { col, ok := item.Expr.(*expression.Column) if !ok { return nil, false } - propItems = append(propItems, property.Item{Col: col, Desc: item.Desc}) + propItems = append(propItems, property.SortItem{Col: col, Desc: item.Desc}) } - return &property.PhysicalProperty{Items: propItems}, true + return &property.PhysicalProperty{SortItems: propItems}, true } // GetPropByOrderByItemsContainScalarFunc will check if this sort property can be pushed or not. In order to simplify the // problem, we only consider the case that all expression are columns or some special scalar functions. func GetPropByOrderByItemsContainScalarFunc(items []*util.ByItems) (*property.PhysicalProperty, bool, bool) { - propItems := make([]property.Item, 0, len(items)) + propItems := make([]property.SortItem, 0, len(items)) onlyColumn := true for _, item := range items { switch expr := item.Expr.(type) { case *expression.Column: - propItems = append(propItems, property.Item{Col: expr, Desc: item.Desc}) + propItems = append(propItems, property.SortItem{Col: expr, Desc: item.Desc}) case *expression.ScalarFunction: col, desc := expr.GetSingleColumn(item.Desc) if col == nil { return nil, false, false } - propItems = append(propItems, property.Item{Col: col, Desc: desc}) + propItems = append(propItems, property.SortItem{Col: col, Desc: desc}) onlyColumn = false default: return nil, false, false } } - return &property.PhysicalProperty{Items: propItems}, true, onlyColumn + return &property.PhysicalProperty{SortItems: propItems}, true, onlyColumn } func (p *LogicalTableDual) findBestTask(prop *property.PhysicalProperty, planCounter *PlanCounterTp) (task, int64, error) { @@ -199,7 +196,7 @@ func (p *baseLogicalPlan) rebuildChildTasks(childTasks *[]task, pp PhysicalPlan, return nil } -func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(physicalPlans []PhysicalPlan, prop *property.PhysicalProperty, planCounter *PlanCounterTp) (task, int64, error) { +func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(physicalPlans []PhysicalPlan, prop *property.PhysicalProperty, addEnforcer bool, planCounter *PlanCounterTp) (task, int64, error) { var bestTask task = invalidTask var curCntPlan, cntPlan int64 childTasks := make([]task, 0, len(p.children)) @@ -243,21 +240,24 @@ func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(physicalPlans []PhysicalPl // Combine best child tasks with parent physical plan. curTask := pp.attach2Task(childTasks...) - if prop.IsFlashOnlyProp() { - if _, ok := curTask.(*copTask); !ok { - continue - } + if curTask.invalid() { + continue + } + + // An optimal task could not satisfy the property, so it should be converted here. + if _, ok := curTask.(*rootTask); !ok && prop.TaskTp == property.RootTaskType { + curTask = curTask.convertToRootTask(p.ctx) } // Enforce curTask property - if prop.Enforced { + if addEnforcer { curTask = enforceProperty(prop, curTask, p.basePlan.ctx) } // Optimize by shuffle executor to running in parallel manner. if prop.IsEmpty() { // Currently, we do not regard shuffled plan as a new plan. - curTask = optimizeByShuffle(pp, curTask, p.basePlan.ctx) + curTask = optimizeByShuffle(curTask, p.basePlan.ctx) } cntPlan += curCntPlan @@ -267,7 +267,6 @@ func (p *baseLogicalPlan) enumeratePhysicalPlans4Task(physicalPlans []PhysicalPl bestTask = curTask break } - // Get the most efficient one. if curTask.cost() < bestTask.cost() || (bestTask.invalid() && !curTask.invalid()) { bestTask = curTask @@ -291,8 +290,10 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun return bestTask, 1, nil } - if prop.TaskTp != property.RootTaskType && prop.TaskTp != property.CopTiFlashLocalReadTaskType && prop.TaskTp != property.CopTiFlashGlobalReadTaskType { - // Currently all plan cannot totally push down. + canAddEnforcer := prop.CanAddEnforcer + + if prop.TaskTp != property.RootTaskType && !prop.IsFlashProp() { + // Currently all plan cannot totally push down to TiKV. p.storeTask(prop, invalidTask) return invalidTask, 0, nil } @@ -301,8 +302,7 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun cntPlan = 0 // prop should be read only because its cached hashcode might be not consistent // when it is changed. So we clone a new one for the temporary changes. - newProp := prop.Clone() - newProp.Enforced = prop.Enforced + newProp := prop.CloneEssentialFields() var plansFitsProp, plansNeedEnforce []PhysicalPlan var hintWorksWithProp bool // Maybe the plan can satisfy the required property, @@ -312,14 +312,16 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun // If there is a hint in the plan and the hint cannot satisfy the property, // we enforce this property and try to generate the PhysicalPlan again to // make sure the hint can work. - newProp.Enforced = true + canAddEnforcer = true } - if newProp.Enforced { + if canAddEnforcer { // Then, we use the empty property to get physicalPlans and // try to get the task with an enforced sort. - newProp.Items = []property.Item{} + newProp.SortItems = []property.SortItem{} newProp.ExpectedCnt = math.MaxFloat64 + newProp.PartitionCols = nil + newProp.PartitionTp = property.AnyType var hintCanWork bool plansNeedEnforce, hintCanWork = p.self.exhaustPhysicalPlans(newProp) if hintCanWork && !hintWorksWithProp { @@ -328,19 +330,17 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun // can work. plansFitsProp = nil } - if !hintCanWork && !hintWorksWithProp && !prop.Enforced { + if !hintCanWork && !hintWorksWithProp && !prop.CanAddEnforcer { // If the original property is not enforced and hint cannot // work anyway, we give up `plansNeedEnforce` for efficiency, plansNeedEnforce = nil } - newProp.Items = prop.Items - newProp.ExpectedCnt = prop.ExpectedCnt + newProp = prop } - newProp.Enforced = false var cnt int64 var curTask task - if bestTask, cnt, err = p.enumeratePhysicalPlans4Task(plansFitsProp, newProp, planCounter); err != nil { + if bestTask, cnt, err = p.enumeratePhysicalPlans4Task(plansFitsProp, newProp, false, planCounter); err != nil { return nil, 0, err } cntPlan += cnt @@ -348,8 +348,7 @@ func (p *baseLogicalPlan) findBestTask(prop *property.PhysicalProperty, planCoun goto END } - newProp.Enforced = true - curTask, cnt, err = p.enumeratePhysicalPlans4Task(plansNeedEnforce, newProp, planCounter) + curTask, cnt, err = p.enumeratePhysicalPlans4Task(plansNeedEnforce, newProp, true, planCounter) if err != nil { return nil, 0, err } @@ -468,10 +467,10 @@ func (ds *DataSource) getTableCandidate(path *util.AccessPath, prop *property.Ph candidate := &candidatePath{path: path} if path.IsIntHandlePath { pkCol := ds.getPKIsHandleCol() - if len(prop.Items) == 1 && pkCol != nil { - candidate.isMatchProp = prop.Items[0].Col.Equal(nil, pkCol) + if len(prop.SortItems) == 1 && pkCol != nil { + candidate.isMatchProp = prop.SortItems[0].Col.Equal(nil, pkCol) if path.StoreType == kv.TiFlash { - candidate.isMatchProp = candidate.isMatchProp && !prop.Items[0].Desc + candidate.isMatchProp = candidate.isMatchProp && !prop.SortItems[0].Desc } } } else { @@ -480,8 +479,8 @@ func (ds *DataSource) getTableCandidate(path *util.AccessPath, prop *property.Ph // it needs not to keep order for index scan. if !prop.IsEmpty() && all { for i, col := range path.IdxCols { - if col.Equal(nil, prop.Items[0].Col) { - candidate.isMatchProp = matchIndicesProp(path.IdxCols[i:], path.IdxColLens[i:], prop.Items) + if col.Equal(nil, prop.SortItems[0].Col) { + candidate.isMatchProp = matchIndicesProp(path.IdxCols[i:], path.IdxColLens[i:], prop.SortItems) break } else if i >= path.EqCondCount { break @@ -501,8 +500,8 @@ func (ds *DataSource) getIndexCandidate(path *util.AccessPath, prop *property.Ph // it needs not to keep order for index scan. if !prop.IsEmpty() && all { for i, col := range path.IdxCols { - if col.Equal(nil, prop.Items[0].Col) { - candidate.isMatchProp = matchIndicesProp(path.IdxCols[i:], path.IdxColLens[i:], prop.Items) + if col.Equal(nil, prop.SortItems[0].Col) { + candidate.isMatchProp = matchIndicesProp(path.IdxCols[i:], path.IdxColLens[i:], prop.SortItems) break } else if i >= path.EqCondCount { break @@ -545,7 +544,7 @@ func (ds *DataSource) skylinePruning(prop *property.PhysicalProperty) []*candida currentCandidate = ds.getTableCandidate(path, prop) } } else { - if !path.IsTiFlashGlobalRead && !prop.IsFlashOnlyProp() { + if !path.IsTiFlashGlobalRead && !prop.IsFlashProp() { currentCandidate = ds.getTableCandidate(path, prop) } } @@ -583,6 +582,19 @@ func (ds *DataSource) skylinePruning(prop *property.PhysicalProperty) []*candida candidates = append(candidates, currentCandidate) } } + + if ds.ctx.GetSessionVars().GetAllowPreferRangeScan() && len(candidates) > 1 { + // remove the table/index full scan path + for i, c := range candidates { + for _, ran := range c.path.Ranges { + if ran.IsFullRange() { + candidates = append(candidates[:i], candidates[i+1:]...) + return candidates + } + } + } + } + return candidates } @@ -605,32 +617,42 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter var cnt int64 // If prop.enforced is true, the prop.cols need to be set nil for ds.findBestTask. // Before function return, reset it for enforcing task prop and storing map. - oldPropCols := prop.Items - if prop.Enforced { + oldProp := prop.CloneEssentialFields() + if prop.CanAddEnforcer { // First, get the bestTask without enforced prop - prop.Enforced = false + prop.CanAddEnforcer = false t, cnt, err = ds.findBestTask(prop, planCounter) if err != nil { return nil, 0, err } - prop.Enforced = true + prop.CanAddEnforcer = true if t != invalidTask { ds.storeTask(prop, t) cntPlan = cnt return } // Next, get the bestTask with enforced prop - prop.Items = []property.Item{} + prop.SortItems = []property.SortItem{} + prop.PartitionTp = property.AnyType + } else if prop.PartitionTp != property.AnyType { + return invalidTask, 0, nil } defer func() { if err != nil { return } - if prop.Enforced { - prop.Items = oldPropCols + if prop.CanAddEnforcer { + prop = oldProp t = enforceProperty(prop, t, ds.basePlan.ctx) + prop.CanAddEnforcer = true } ds.storeTask(prop, t) + if ds.SampleInfo != nil && !t.invalid() { + if _, ok := t.plan().(*PhysicalTableSample); !ok { + warning := expression.ErrInvalidTableSample.GenWithStackByArgs("plan not supported") + ds.ctx.GetSessionVars().StmtCtx.AppendWarning(warning) + } + } }() t, err = ds.tryToGetDualTask() @@ -723,7 +745,12 @@ func (ds *DataSource) findBestTask(prop *property.PhysicalProperty, planCounter if ds.preferStoreType&preferTiKV != 0 && path.StoreType == kv.TiFlash { continue } - tblTask, err := ds.convertToTableScan(prop, candidate) + var tblTask task + if ds.SampleInfo != nil { + tblTask, err = ds.convertToSampleTable(prop, candidate) + } else { + tblTask, err = ds.convertToTableScan(prop, candidate) + } if err != nil { return nil, 0, err } @@ -802,7 +829,7 @@ func (ds *DataSource) convertToIndexMergeScan(prop *property.PhysicalProperty, c cop.tablePlan = ts cop.idxMergePartPlans = scans cop.cst = totalCost - task = finishCopTask(ds.ctx, cop) + task = cop.convertToRootTask(ds.ctx) return task, nil } @@ -935,11 +962,10 @@ func (ds *DataSource) isCoveringIndex(columns, indexColumns []*expression.Column if !coveredByPlainIndex && !coveredByClusteredIndex { return false } - isClusteredNewCollationIdx := collate.NewCollationEnabled() && col.GetType().EvalType() == types.ETString && !mysql.HasBinaryFlag(col.GetType().Flag) - if !coveredByPlainIndex && coveredByClusteredIndex && isClusteredNewCollationIdx { + if !coveredByPlainIndex && coveredByClusteredIndex && isClusteredNewCollationIdx && ds.table.Meta().CommonHandleVersion == 0 { return false } } @@ -1001,6 +1027,15 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, candid task = cop if cop.tablePlan != nil && ds.tableInfo.IsCommonHandle { cop.commonHandleCols = ds.commonHandleCols + commonHandle := ds.handleCols.(*CommonHandleCols) + for _, col := range commonHandle.columns { + if ds.schema.ColumnIndex(col) == -1 { + ts := cop.tablePlan.(*PhysicalTableScan) + ts.Schema().Append(col) + ts.Columns = append(ts.Columns, col.ToInfo()) + cop.doubleReadNeedProj = true + } + } } if candidate.isMatchProp { if cop.tablePlan != nil && !ds.tableInfo.IsCommonHandle { @@ -1019,7 +1054,7 @@ func (ds *DataSource) convertToIndexScan(prop *property.PhysicalProperty, candid finalStats := ds.stats.ScaleByExpectCnt(prop.ExpectedCnt) is.addPushedDownSelection(cop, ds, path, finalStats) if prop.TaskTp == property.RootTaskType { - task = finishCopTask(ds.ctx, task) + task = task.convertToRootTask(ds.ctx) } else if _, ok := task.(*rootTask); ok { return invalidTask, nil } @@ -1157,7 +1192,7 @@ func SplitSelCondsWithVirtualColumn(conds []expression.Expression) ([]expression return conds, filterConds } -func matchIndicesProp(idxCols []*expression.Column, colLens []int, propItems []property.Item) bool { +func matchIndicesProp(idxCols []*expression.Column, colLens []int, propItems []property.SortItem) bool { if len(idxCols) < len(propItems) { return false } @@ -1182,9 +1217,9 @@ func (ds *DataSource) splitIndexFilterConditions(conditions []expression.Express return indexConditions, tableConditions } -// getMostCorrColFromExprs checks if column in the condition is correlated enough with handle. If the condition +// getMostCorrCol4Handle checks if column in the condition is correlated enough with handle. If the condition // contains multiple columns, return nil and get the max correlation, which would be used in the heuristic estimation. -func getMostCorrColFromExprs(exprs []expression.Expression, histColl *statistics.Table, threshold float64) (*expression.Column, float64) { +func getMostCorrCol4Handle(exprs []expression.Expression, histColl *statistics.Table, threshold float64) (*expression.Column, float64) { var cols []*expression.Column cols = expression.ExtractColumnsFromExpressions(cols, exprs, nil) if len(cols) == 0 { @@ -1202,13 +1237,13 @@ func getMostCorrColFromExprs(exprs []expression.Expression, histColl *statistics if !ok { continue } - curCorr := math.Abs(hist.Correlation) - if corrCol == nil || corr < curCorr { + curCorr := hist.Correlation + if corrCol == nil || math.Abs(corr) < math.Abs(curCorr) { corrCol = col corr = curCorr } } - if len(colSet) == 1 && corr >= threshold { + if len(colSet) == 1 && math.Abs(corr) >= threshold { return corrCol, corr } return nil, corr @@ -1273,28 +1308,31 @@ func convertRangeFromExpectedCnt(ranges []*ranger.Range, rangeCounts []float64, return convertedRanges, count, false } -// crossEstimateRowCount estimates row count of table scan using histogram of another column which is in TableFilters +// crossEstimateTableRowCount estimates row count of table scan using histogram of another column which is in TableFilters // and has high order correlation with handle column. For example, if the query is like: // `select * from tbl where a = 1 order by pk limit 1` // if order of column `a` is strictly correlated with column `pk`, the row count of table scan should be: // `1 + row_count(a < 1 or a is null)` -func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, expectedCnt float64, desc bool) (float64, bool, float64) { +func (ds *DataSource) crossEstimateTableRowCount(path *util.AccessPath, expectedCnt float64, desc bool) (float64, bool, float64) { if ds.statisticTable.Pseudo || len(path.TableFilters) == 0 { return 0, false, 0 } - col, corr := getMostCorrColFromExprs(path.TableFilters, ds.statisticTable, ds.ctx.GetSessionVars().CorrelationThreshold) - // If table scan is not full range scan, we cannot use histogram of other columns for estimation, because + col, corr := getMostCorrCol4Handle(path.TableFilters, ds.statisticTable, ds.ctx.GetSessionVars().CorrelationThreshold) + return ds.crossEstimateRowCount(path, path.TableFilters, col, corr, expectedCnt, desc) +} + +// crossEstimateRowCount is the common logic of crossEstimateTableRowCount and crossEstimateIndexRowCount. +func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, conds []expression.Expression, col *expression.Column, corr, expectedCnt float64, desc bool) (float64, bool, float64) { + // If the scan is not full range scan, we cannot use histogram of other columns for estimation, because // the histogram reflects value distribution in the whole table level. if col == nil || len(path.AccessConds) > 0 { return 0, false, corr } - colInfoID := col.ID - colID := col.UniqueID - colHist := ds.statisticTable.Columns[colInfoID] - if colHist.Correlation < 0 { + colInfoID, colID := col.ID, col.UniqueID + if corr < 0 { desc = !desc } - accessConds, remained := ranger.DetachCondsForColumn(ds.ctx, path.TableFilters, col) + accessConds, remained := ranger.DetachCondsForColumn(ds.ctx, conds, col) if len(accessConds) == 0 { return 0, false, corr } @@ -1332,6 +1370,63 @@ func (ds *DataSource) crossEstimateRowCount(path *util.AccessPath, expectedCnt f return scanCount, true, 0 } +// crossEstimateIndexRowCount estimates row count of index scan using histogram of another column which is in TableFilters/IndexFilters +// and has high order correlation with the first index column. For example, if the query is like: +// `select * from tbl where a = 1 order by b limit 1` +// if order of column `a` is strictly correlated with column `b`, the row count of IndexScan(b) should be: +// `1 + row_count(a < 1 or a is null)` +func (ds *DataSource) crossEstimateIndexRowCount(path *util.AccessPath, expectedCnt float64, desc bool) (float64, bool, float64) { + filtersLen := len(path.TableFilters) + len(path.IndexFilters) + sessVars := ds.ctx.GetSessionVars() + if ds.statisticTable.Pseudo || filtersLen == 0 || !sessVars.EnableExtendedStats { + return 0, false, 0 + } + col, corr := getMostCorrCol4Index(path, ds.statisticTable, sessVars.CorrelationThreshold) + filters := make([]expression.Expression, 0, filtersLen) + filters = append(filters, path.TableFilters...) + filters = append(filters, path.IndexFilters...) + return ds.crossEstimateRowCount(path, filters, col, corr, expectedCnt, desc) +} + +// getMostCorrCol4Index checks if column in the condition is correlated enough with the first index column. If the condition +// contains multiple columns, return nil and get the max correlation, which would be used in the heuristic estimation. +func getMostCorrCol4Index(path *util.AccessPath, histColl *statistics.Table, threshold float64) (*expression.Column, float64) { + if histColl.ExtendedStats == nil || len(histColl.ExtendedStats.Stats) == 0 { + return nil, 0 + } + var cols []*expression.Column + cols = expression.ExtractColumnsFromExpressions(cols, path.TableFilters, nil) + cols = expression.ExtractColumnsFromExpressions(cols, path.IndexFilters, nil) + if len(cols) == 0 { + return nil, 0 + } + colSet := set.NewInt64Set() + var corr float64 + var corrCol *expression.Column + for _, col := range cols { + if colSet.Exist(col.UniqueID) { + continue + } + colSet.Insert(col.UniqueID) + curCorr := float64(0) + for _, item := range histColl.ExtendedStats.Stats { + if (col.ID == item.ColIDs[0] && path.FullIdxCols[0].ID == item.ColIDs[1]) || + (col.ID == item.ColIDs[1] && path.FullIdxCols[0].ID == item.ColIDs[0]) { + curCorr = item.ScalarVals + break + } + } + if corrCol == nil || math.Abs(corr) < math.Abs(curCorr) { + corrCol = col + corr = curCorr + } + } + if len(colSet) == 1 && math.Abs(corr) >= threshold { + return corrCol, corr + } + return nil, corr +} + // GetPhysicalScan returns PhysicalTableScan for the LogicalTableScan. func (s *LogicalTableScan) GetPhysicalScan(schema *expression.Schema, stats *property.StatsInfo) *PhysicalTableScan { ds := s.Source @@ -1389,6 +1484,26 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid return invalidTask, nil } ts, cost, _ := ds.getOriginalPhysicalTableScan(prop, candidate.path, candidate.isMatchProp) + if prop.TaskTp == property.MppTaskType { + if prop.PartitionTp != property.AnyType || ts.isPartition { + // If ts is a single partition, then this partition table is in static-only prune, then we should not choose mpp execution. + return &mppTask{}, nil + } + mppTask := &mppTask{ + p: ts, + cst: cost, + partTp: property.AnyType, + ts: ts, + } + ts.PartitionInfo = PartitionInfo{ + PruningConds: ds.allConds, + PartitionNames: ds.partitionNames, + Columns: ds.TblCols, + ColumnNames: ds.names, + } + mppTask = ts.addPushedDownSelectionToMppTask(mppTask, ds.stats) + return mppTask, nil + } copTask := &copTask{ tablePlan: ts, indexPlanFinished: true, @@ -1401,6 +1516,7 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid Columns: ds.TblCols, ColumnNames: ds.names, } + ts.PartitionInfo = copTask.partitionInfo task = copTask if candidate.isMatchProp { copTask.keepOrder = true @@ -1410,17 +1526,35 @@ func (ds *DataSource) convertToTableScan(prop *property.PhysicalProperty, candid } } ts.addPushedDownSelection(copTask, ds.stats.ScaleByExpectCnt(prop.ExpectedCnt)) - if prop.IsFlashOnlyProp() && len(copTask.rootTaskConds) != 0 { + if prop.IsFlashProp() && len(copTask.rootTaskConds) != 0 { return invalidTask, nil } if prop.TaskTp == property.RootTaskType { - task = finishCopTask(ds.ctx, task) + task = task.convertToRootTask(ds.ctx) } else if _, ok := task.(*rootTask); ok { return invalidTask, nil } return task, nil } +func (ds *DataSource) convertToSampleTable(prop *property.PhysicalProperty, candidate *candidatePath) (task task, err error) { + if prop.TaskTp == property.CopDoubleReadTaskType { + return invalidTask, nil + } + if !prop.IsEmpty() && !candidate.isMatchProp { + return invalidTask, nil + } + p := PhysicalTableSample{ + TableSampleInfo: ds.SampleInfo, + TableInfo: ds.table, + Desc: candidate.isMatchProp && prop.SortItems[0].Desc, + }.Init(ds.ctx, ds.SelectBlockOffset()) + p.schema = ds.schema + return &rootTask{ + p: p, + }, nil +} + func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candidate *candidatePath) task { if !prop.IsEmpty() && !candidate.isMatchProp { return invalidTask @@ -1430,6 +1564,10 @@ func (ds *DataSource) convertToPointGet(prop *property.PhysicalProperty, candida return invalidTask } + if tidbutil.IsMemDB(ds.DBName.L) { + return invalidTask + } + accessCnt := math.Min(candidate.path.CountAfterAccess, float64(1)) pointGetPlan := PointGetPlan{ ctx: ds.ctx, @@ -1517,7 +1655,7 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca Columns: ds.Columns, }.Init(ds.ctx, ds.tableStats.ScaleByExpectCnt(accessCnt), ds.schema.Clone(), ds.names, ds.blockOffset) if batchPointGetPlan.KeepOrder { - batchPointGetPlan.Desc = prop.Items[0].Desc + batchPointGetPlan.Desc = prop.SortItems[0].Desc } rTsk := &rootTask{p: batchPointGetPlan} var cost float64 @@ -1545,7 +1683,7 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca } if !prop.IsEmpty() { batchPointGetPlan.KeepOrder = true - batchPointGetPlan.Desc = prop.Items[0].Desc + batchPointGetPlan.Desc = prop.SortItems[0].Desc } if candidate.isSingleScan { cost = batchPointGetPlan.GetCost(candidate.path.IdxCols) @@ -1568,6 +1706,26 @@ func (ds *DataSource) convertToBatchPointGet(prop *property.PhysicalProperty, ca return rTsk } +func (ts *PhysicalTableScan) addPushedDownSelectionToMppTask(mpp *mppTask, stats *property.StatsInfo) *mppTask { + filterCondition, rootTaskConds := SplitSelCondsWithVirtualColumn(ts.filterCondition) + var newRootConds []expression.Expression + filterCondition, newRootConds = expression.PushDownExprs(ts.ctx.GetSessionVars().StmtCtx, filterCondition, ts.ctx.GetClient(), ts.StoreType) + rootTaskConds = append(rootTaskConds, newRootConds...) + if len(rootTaskConds) > 0 { + return &mppTask{} + } + ts.filterCondition = filterCondition + // Add filter condition to table plan now. + sessVars := ts.ctx.GetSessionVars() + if len(ts.filterCondition) > 0 { + mpp.cst += mpp.count() * sessVars.CopCPUFactor + sel := PhysicalSelection{Conditions: ts.filterCondition}.Init(ts.ctx, stats, ts.blockOffset) + sel.SetChildren(ts) + mpp.p = sel + } + return mpp +} + func (ts *PhysicalTableScan) addPushedDownSelection(copTask *copTask, stats *property.StatsInfo) { ts.filterCondition, copTask.rootTaskConds = SplitSelCondsWithVirtualColumn(ts.filterCondition) var newRootConds []expression.Expression @@ -1608,7 +1766,7 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper } rowCount := path.CountAfterAccess if prop.ExpectedCnt < ds.stats.RowCount { - count, ok, corr := ds.crossEstimateRowCount(path, prop.ExpectedCnt, isMatchProp && prop.Items[0].Desc) + count, ok, corr := ds.crossEstimateTableRowCount(path, prop.ExpectedCnt, isMatchProp && prop.SortItems[0].Desc) if ok { // TODO: actually, before using this count as the estimated row count of table scan, we need additionally // check if count < row_count(first_region | last_region), and use the larger one since we build one copTask @@ -1618,8 +1776,8 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper // Considering that when this scenario happens, the execution time is close between IndexScan and TableScan, // we do not add this check temporarily. rowCount = count - } else if corr < 1 { - correlationFactor := math.Pow(1-corr, float64(ds.ctx.GetSessionVars().CorrelationExpFactor)) + } else if abs := math.Abs(corr); abs < 1 { + correlationFactor := math.Pow(1-abs, float64(ds.ctx.GetSessionVars().CorrelationExpFactor)) selectivity := ds.stats.RowCount / rowCount rowCount = math.Min(prop.ExpectedCnt/selectivity/correlationFactor, rowCount) } @@ -1644,7 +1802,7 @@ func (ds *DataSource) getOriginalPhysicalTableScan(prop *property.PhysicalProper cost += rowCount * sessVars.NetworkFactor * rowSize } if isMatchProp { - if prop.Items[0].Desc { + if prop.SortItems[0].Desc { ts.Desc = true cost = rowCount * rowSize * sessVars.DescScanFactor } @@ -1681,19 +1839,22 @@ func (ds *DataSource) getOriginalPhysicalIndexScan(prop *property.PhysicalProper } rowCount := path.CountAfterAccess is.initSchema(append(path.FullIdxCols, ds.commonHandleCols...), !isSingleScan) - // Only use expectedCnt when it's smaller than the count we calculated. - // e.g. IndexScan(count1)->After Filter(count2). The `ds.stats.RowCount` is count2. count1 is the one we need to calculate - // If expectedCnt and count2 are both zero and we go into the below `if` block, the count1 will be set to zero though it's shouldn't be. if (isMatchProp || prop.IsEmpty()) && prop.ExpectedCnt < ds.stats.RowCount { - selectivity := ds.stats.RowCount / path.CountAfterAccess - rowCount = math.Min(prop.ExpectedCnt/selectivity, rowCount) + count, ok, corr := ds.crossEstimateIndexRowCount(path, prop.ExpectedCnt, isMatchProp && prop.SortItems[0].Desc) + if ok { + rowCount = count + } else if abs := math.Abs(corr); abs < 1 { + correlationFactor := math.Pow(1-abs, float64(ds.ctx.GetSessionVars().CorrelationExpFactor)) + selectivity := ds.stats.RowCount / rowCount + rowCount = math.Min(prop.ExpectedCnt/selectivity/correlationFactor, rowCount) + } } is.stats = ds.tableStats.ScaleByExpectCnt(rowCount) rowSize := is.indexScanRowSize(idx, ds, true) sessVars := ds.ctx.GetSessionVars() cost := rowCount * rowSize * sessVars.ScanFactor if isMatchProp { - if prop.Items[0].Desc { + if prop.SortItems[0].Desc { is.Desc = true cost = rowCount * rowSize * sessVars.DescScanFactor } diff --git a/planner/core/find_best_task_test.go b/planner/core/find_best_task_test.go index 0d799c879e890..dc83476d1cfac 100644 --- a/planner/core/find_best_task_test.go +++ b/planner/core/find_best_task_test.go @@ -84,7 +84,7 @@ func (p *mockLogicalPlan4Test) getPhysicalPlan1(prop *property.PhysicalProperty) physicalPlan1 := mockPhysicalPlan4Test{planType: 1, costOverflow: p.costOverflow}.Init(p.ctx) physicalPlan1.stats = &property.StatsInfo{RowCount: 1} physicalPlan1.childrenReqProps = make([]*property.PhysicalProperty, 1) - physicalPlan1.childrenReqProps[0] = prop.Clone() + physicalPlan1.childrenReqProps[0] = prop.CloneEssentialFields() return physicalPlan1 } @@ -170,13 +170,13 @@ func (s *testFindBestTaskSuite) TestEnforcedProperty(c *C) { col1 := &expression.Column{UniqueID: 2} // Use different order, so that mockLogicalPlan cannot generate any of the // physical plans. - item0 := property.Item{Col: col0, Desc: false} - item1 := property.Item{Col: col1, Desc: true} - items := []property.Item{item0, item1} + item0 := property.SortItem{Col: col0, Desc: false} + item1 := property.SortItem{Col: col1, Desc: true} + items := []property.SortItem{item0, item1} prop0 := &property.PhysicalProperty{ - Items: items, - Enforced: false, + SortItems: items, + CanAddEnforcer: false, } // should return invalid task because no physical plan can match this property. task, _, err := mockPlan.findBestTask(prop0, &PlanCounterDisabled) @@ -184,8 +184,8 @@ func (s *testFindBestTaskSuite) TestEnforcedProperty(c *C) { c.Assert(task.invalid(), IsTrue) prop1 := &property.PhysicalProperty{ - Items: items, - Enforced: true, + SortItems: items, + CanAddEnforcer: true, } // should return the valid task when the property is enforced. task, _, err = mockPlan.findBestTask(prop1, &PlanCounterDisabled) @@ -204,12 +204,12 @@ func (s *testFindBestTaskSuite) TestHintCannotFitProperty(c *C) { mockPlan0.SetChildren(mockDS) col0 := &expression.Column{UniqueID: 1} - item0 := property.Item{Col: col0} - items := []property.Item{item0} + item0 := property.SortItem{Col: col0} + items := []property.SortItem{item0} // case 1, The property is not empty and enforced, should enforce a sort. prop0 := &property.PhysicalProperty{ - Items: items, - Enforced: true, + SortItems: items, + CanAddEnforcer: true, } task, _, err := mockPlan0.findBestTask(prop0, &PlanCounterDisabled) c.Assert(err, IsNil) @@ -224,8 +224,8 @@ func (s *testFindBestTaskSuite) TestHintCannotFitProperty(c *C) { // case 2, The property is not empty but not enforced, still need to enforce a sort // to ensure the hint can work prop1 := &property.PhysicalProperty{ - Items: items, - Enforced: false, + SortItems: items, + CanAddEnforcer: false, } task, _, err = mockPlan0.findBestTask(prop1, &PlanCounterDisabled) c.Assert(err, IsNil) @@ -240,8 +240,8 @@ func (s *testFindBestTaskSuite) TestHintCannotFitProperty(c *C) { // case 3, The hint cannot work even if the property is empty, should return a warning // and generate physicalPlan1. prop2 := &property.PhysicalProperty{ - Items: items, - Enforced: false, + SortItems: items, + CanAddEnforcer: false, } mockPlan1 := mockLogicalPlan4Test{ hasHintForPlan2: true, @@ -261,8 +261,8 @@ func (s *testFindBestTaskSuite) TestHintCannotFitProperty(c *C) { // the same with case 3. ctx.GetSessionVars().StmtCtx.SetWarnings(nil) prop3 := &property.PhysicalProperty{ - Items: items, - Enforced: true, + SortItems: items, + CanAddEnforcer: true, } task, _, err = mockPlan1.findBestTask(prop3, &PlanCounterDisabled) c.Assert(err, IsNil) diff --git a/planner/core/fragment.go b/planner/core/fragment.go new file mode 100644 index 0000000000000..f5bdf781716b9 --- /dev/null +++ b/planner/core/fragment.go @@ -0,0 +1,174 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package core + +import ( + "context" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/distsql" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/table" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" +) + +// Fragment is cut from the whole pushed-down plan by network communication. +// Communication by pfs are always through shuffling / broadcasting / passing through. +type Fragment struct { + // following field are filled during getPlanFragment. + TableScan *PhysicalTableScan // result physical table scan + ExchangeReceivers []*PhysicalExchangeReceiver // data receivers + + // following fields are filled after scheduling. + ExchangeSender *PhysicalExchangeSender // data exporter +} + +type mppTaskGenerator struct { + ctx sessionctx.Context + startTS uint64 + allocTaskID *int64 + is infoschema.InfoSchema +} + +// GenerateRootMPPTasks generate all mpp tasks and return root ones. +func GenerateRootMPPTasks(ctx sessionctx.Context, startTs uint64, sender *PhysicalExchangeSender, allocTaskID *int64, is infoschema.InfoSchema) ([]*kv.MPPTask, error) { + g := &mppTaskGenerator{ctx: ctx, startTS: startTs, allocTaskID: allocTaskID, is: is} + return g.generateMPPTasks(sender) +} + +func (e *mppTaskGenerator) generateMPPTasks(s *PhysicalExchangeSender) ([]*kv.MPPTask, error) { + logutil.BgLogger().Info("Mpp will generate tasks", zap.String("plan", ToString(s))) + tidbTask := &kv.MPPTask{ + StartTs: e.startTS, + ID: -1, + } + rootTasks, err := e.generateMPPTasksForFragment(s.Fragment) + if err != nil { + return nil, errors.Trace(err) + } + s.TargetTasks = []*kv.MPPTask{tidbTask} + return rootTasks, nil +} + +func (e *mppTaskGenerator) generateMPPTasksForFragment(f *Fragment) (tasks []*kv.MPPTask, err error) { + for _, r := range f.ExchangeReceivers { + r.Tasks, err = e.generateMPPTasksForFragment(r.ChildPf) + if err != nil { + return nil, errors.Trace(err) + } + } + if f.TableScan != nil { + tasks, err = e.constructMPPTasksImpl(context.Background(), f.TableScan) + } else { + tasks, err = e.constructMPPTasksImpl(context.Background(), nil) + } + if err != nil { + return nil, errors.Trace(err) + } + if len(tasks) == 0 { + return nil, errors.New("cannot find mpp task") + } + for _, r := range f.ExchangeReceivers { + s := r.ChildPf.ExchangeSender + s.TargetTasks = tasks + } + f.ExchangeSender.Tasks = tasks + return tasks, nil +} + +func partitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds []expression.Expression, partitionNames []model.CIStr, + columns []*expression.Column, columnNames types.NameSlice) ([]table.PhysicalTable, error) { + idxArr, err := PartitionPruning(ctx, tbl, conds, partitionNames, columns, columnNames) + if err != nil { + return nil, err + } + + pi := tbl.Meta().GetPartitionInfo() + var ret []table.PhysicalTable + if len(idxArr) == 1 && idxArr[0] == FullRange { + ret = make([]table.PhysicalTable, 0, len(pi.Definitions)) + for _, def := range pi.Definitions { + p := tbl.GetPartition(def.ID) + ret = append(ret, p) + } + } else { + ret = make([]table.PhysicalTable, 0, len(idxArr)) + for _, idx := range idxArr { + pid := pi.Definitions[idx].ID + p := tbl.GetPartition(pid) + ret = append(ret, p) + } + } + if len(ret) == 0 { + ret = []table.PhysicalTable{tbl.GetPartition(pi.Definitions[0].ID)} + } + return ret, nil +} + +// single physical table means a table without partitions or a single partition in a partition table. +func (e *mppTaskGenerator) constructMPPTasksImpl(ctx context.Context, ts *PhysicalTableScan) ([]*kv.MPPTask, error) { + if ts != nil { + splitedRanges, _ := distsql.SplitRangesBySign(ts.Ranges, false, false, ts.Table.IsCommonHandle) + if ts.Table.GetPartitionInfo() != nil { + tmp, _ := e.is.TableByID(ts.Table.ID) + tbl := tmp.(table.PartitionedTable) + partitions, err := partitionPruning(e.ctx, tbl, ts.PartitionInfo.PruningConds, ts.PartitionInfo.PartitionNames, ts.PartitionInfo.Columns, ts.PartitionInfo.ColumnNames) + if err != nil { + return nil, errors.Trace(err) + } + var ret []*kv.MPPTask + for _, p := range partitions { + pid := p.GetPhysicalID() + meta := p.Meta() + kvRanges, err := distsql.TableHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, []int64{pid}, meta != nil && ts.Table.IsCommonHandle, splitedRanges, nil) + if err != nil { + return nil, errors.Trace(err) + } + tasks, err := e.constructMPPTasksForSinglePartitionTable(ctx, kvRanges, pid) + if err != nil { + return nil, errors.Trace(err) + } + ret = append(ret, tasks...) + } + return ret, nil + } + + kvRanges, err := distsql.TableHandleRangesToKVRanges(e.ctx.GetSessionVars().StmtCtx, []int64{ts.Table.ID}, ts.Table.IsCommonHandle, splitedRanges, nil) + if err != nil { + return nil, errors.Trace(err) + } + return e.constructMPPTasksForSinglePartitionTable(ctx, kvRanges, ts.Table.ID) + } + return e.constructMPPTasksForSinglePartitionTable(ctx, nil, -1) +} + +func (e *mppTaskGenerator) constructMPPTasksForSinglePartitionTable(ctx context.Context, kvRanges []kv.KeyRange, tableID int64) ([]*kv.MPPTask, error) { + req := &kv.MPPBuildTasksRequest{KeyRanges: kvRanges} + metas, err := e.ctx.GetMPPClient().ConstructMPPTasks(ctx, req) + if err != nil { + return nil, errors.Trace(err) + } + tasks := make([]*kv.MPPTask, 0, len(metas)) + for _, meta := range metas { + *e.allocTaskID++ + tasks = append(tasks, &kv.MPPTask{Meta: meta, ID: *e.allocTaskID, StartTs: e.startTS, TableID: tableID}) + } + return tasks, nil +} diff --git a/planner/core/handle_cols.go b/planner/core/handle_cols.go index b66aa964d5e51..57ce33a49b4d5 100644 --- a/planner/core/handle_cols.go +++ b/planner/core/handle_cols.go @@ -256,3 +256,18 @@ func (ib *IntHandleCols) GetFieldsTypes() []*types.FieldType { func NewIntHandleCols(col *expression.Column) HandleCols { return &IntHandleCols{col: col} } + +// GetCommonHandleDatum gets the original data for the common handle. +func GetCommonHandleDatum(cols HandleCols, row chunk.Row) []types.Datum { + if cols.IsInt() { + return nil + } + cb := cols.(*CommonHandleCols) + + datumBuf := make([]types.Datum, 0, 4) + for _, col := range cb.columns { + datumBuf = append(datumBuf, row.GetDatum(col.Index, col.RetType)) + } + + return datumBuf +} diff --git a/planner/core/hints.go b/planner/core/hints.go index 86019b204c334..d0c867068862f 100644 --- a/planner/core/hints.go +++ b/planner/core/hints.go @@ -31,6 +31,9 @@ func GenHintsFromPhysicalPlan(p Plan) []*ast.TableOptimizerHint { hints = genHintsFromPhysicalPlan(pp.SelectPlan, utilhint.TypeUpdate) case *Delete: hints = genHintsFromPhysicalPlan(pp.SelectPlan, utilhint.TypeDelete) + // For Insert, we only generate hints that would be used in select query block. + case *Insert: + hints = genHintsFromPhysicalPlan(pp.SelectPlan, utilhint.TypeSelect) case PhysicalPlan: hints = genHintsFromPhysicalPlan(pp, utilhint.TypeSelect) } @@ -45,6 +48,11 @@ func getTableName(tblName model.CIStr, asName *model.CIStr) model.CIStr { } func extractTableAsName(p PhysicalPlan) (*model.CIStr, *model.CIStr) { + _, isProj := p.(*PhysicalProjection) + _, isUnionScan := p.(*PhysicalUnionScan) + if isProj || isUnionScan { + return extractTableAsName(p.Children()[0]) + } if len(p.Children()) > 1 { return nil, nil } @@ -72,24 +80,35 @@ func extractTableAsName(p PhysicalPlan) (*model.CIStr, *model.CIStr) { } func getJoinHints(sctx sessionctx.Context, joinType string, parentOffset int, nodeType utilhint.NodeType, children ...PhysicalPlan) (res []*ast.TableOptimizerHint) { + if parentOffset == -1 { + return res + } for _, child := range children { blockOffset := child.SelectBlockOffset() if blockOffset == -1 { continue } var dbName, tableName *model.CIStr - if child.SelectBlockOffset() != parentOffset { - hintTable := sctx.GetSessionVars().PlannerSelectBlockAsName[child.SelectBlockOffset()] + if blockOffset != parentOffset { + blockAsNames := sctx.GetSessionVars().PlannerSelectBlockAsName + if blockOffset >= len(blockAsNames) { + continue + } + hintTable := blockAsNames[blockOffset] // For sub-queries like `(select * from t) t1`, t1 should belong to its surrounding select block. dbName, tableName, blockOffset = &hintTable.DBName, &hintTable.TableName, parentOffset } else { dbName, tableName = extractTableAsName(child) } - if tableName == nil { + if tableName == nil || tableName.L == "" { + continue + } + qbName, err := utilhint.GenerateQBName(nodeType, blockOffset) + if err != nil { continue } res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, blockOffset), + QBName: qbName, HintName: model.NewCIStr(joinType), Tables: []ast.HintTable{{DBName: *dbName, TableName: *tableName}}, }) @@ -99,20 +118,27 @@ func getJoinHints(sctx sessionctx.Context, joinType string, parentOffset int, no } func genHintsFromPhysicalPlan(p PhysicalPlan, nodeType utilhint.NodeType) (res []*ast.TableOptimizerHint) { + if p == nil { + return res + } for _, child := range p.Children() { res = append(res, genHintsFromPhysicalPlan(child, nodeType)...) } + qbName, err := utilhint.GenerateQBName(nodeType, p.SelectBlockOffset()) + if err != nil { + return res + } switch pp := p.(type) { case *PhysicalTableReader: tbl := pp.TablePlans[0].(*PhysicalTableScan) res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintUseIndex), Tables: []ast.HintTable{{DBName: tbl.DBName, TableName: getTableName(tbl.Table.Name, tbl.TableAsName)}}, }) if tbl.StoreType == kv.TiFlash { res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintReadFromStorage), HintData: model.NewCIStr(kv.TiFlash.Name()), Tables: []ast.HintTable{{DBName: tbl.DBName, TableName: getTableName(tbl.Table.Name, tbl.TableAsName)}}, @@ -121,7 +147,7 @@ func genHintsFromPhysicalPlan(p PhysicalPlan, nodeType utilhint.NodeType) (res [ case *PhysicalIndexLookUpReader: index := pp.IndexPlans[0].(*PhysicalIndexScan) res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintUseIndex), Tables: []ast.HintTable{{DBName: index.DBName, TableName: getTableName(index.Table.Name, index.TableAsName)}}, Indexes: []model.CIStr{index.Index.Name}, @@ -129,7 +155,7 @@ func genHintsFromPhysicalPlan(p PhysicalPlan, nodeType utilhint.NodeType) (res [ case *PhysicalIndexReader: index := pp.IndexPlans[0].(*PhysicalIndexScan) res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintUseIndex), Tables: []ast.HintTable{{DBName: index.DBName, TableName: getTableName(index.Table.Name, index.TableAsName)}}, Indexes: []model.CIStr{index.Index.Name}, @@ -149,25 +175,23 @@ func genHintsFromPhysicalPlan(p PhysicalPlan, nodeType utilhint.NodeType) (res [ } } res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintIndexMerge), Tables: []ast.HintTable{{TableName: getTableName(tableName, tableAsName)}}, Indexes: Indexs, }) case *PhysicalHashAgg: res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintHashAgg), }) case *PhysicalStreamAgg: res = append(res, &ast.TableOptimizerHint{ - QBName: utilhint.GenerateQBName(nodeType, pp.blockOffset), + QBName: qbName, HintName: model.NewCIStr(HintStreamAgg), }) case *PhysicalMergeJoin: res = append(res, getJoinHints(p.SCtx(), HintSMJ, p.SelectBlockOffset(), nodeType, pp.children...)...) - case *PhysicalBroadCastJoin: - res = append(res, getJoinHints(p.SCtx(), HintBCJ, p.SelectBlockOffset(), nodeType, pp.children...)...) case *PhysicalHashJoin: res = append(res, getJoinHints(p.SCtx(), HintHJ, p.SelectBlockOffset(), nodeType, pp.children...)...) case *PhysicalIndexJoin: diff --git a/planner/core/indexmerge_test.go b/planner/core/indexmerge_test.go index 8df97cb27ac28..9fdcf2f809acb 100644 --- a/planner/core/indexmerge_test.go +++ b/planner/core/indexmerge_test.go @@ -91,7 +91,7 @@ func (s *testIndexMergeSuite) TestIndexMergePathGeneration(c *C) { stmt, err := s.ParseOneStmt(tc, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) if err != nil { s.testdata.OnRecord(func() { diff --git a/planner/core/initialize.go b/planner/core/initialize.go index ff923cae70178..c63d4efa7ba31 100644 --- a/planner/core/initialize.go +++ b/planner/core/initialize.go @@ -15,6 +15,7 @@ package core import ( "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" @@ -216,9 +217,9 @@ func (p PhysicalShuffle) Init(ctx sessionctx.Context, stats *property.StatsInfo, return &p } -// Init initializes PhysicalShuffleDataSourceStub. -func (p PhysicalShuffleDataSourceStub) Init(ctx sessionctx.Context, stats *property.StatsInfo, offset int, props ...*property.PhysicalProperty) *PhysicalShuffleDataSourceStub { - p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeShuffleDataSourceStub, &p, offset) +// Init initializes PhysicalShuffleReceiverStub. +func (p PhysicalShuffleReceiverStub) Init(ctx sessionctx.Context, stats *property.StatsInfo, offset int, props ...*property.PhysicalProperty) *PhysicalShuffleReceiverStub { + p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeShuffleReceiver, &p, offset) p.childrenReqProps = props p.stats = stats return &p @@ -242,6 +243,12 @@ func (p Insert) Init(ctx sessionctx.Context) *Insert { return &p } +// Init initializes LoadData. +func (p LoadData) Init(ctx sessionctx.Context) *LoadData { + p.basePlan = newBasePlan(ctx, plancodec.TypeLoadData, 0) + return &p +} + // Init initializes LogicalShow. func (p LogicalShow) Init(ctx sessionctx.Context) *LogicalShow { p.baseLogicalPlan = newBaseLogicalPlan(ctx, plancodec.TypeShow, &p, 0) @@ -318,16 +325,6 @@ func (p PhysicalHashJoin) Init(ctx sessionctx.Context, stats *property.StatsInfo return &p } -// Init initializes BatchPointGetPlan. -func (p PhysicalBroadCastJoin) Init(ctx sessionctx.Context, stats *property.StatsInfo, offset int, props ...*property.PhysicalProperty) *PhysicalBroadCastJoin { - tp := plancodec.TypeBroadcastJoin - p.basePhysicalPlan = newBasePhysicalPlan(ctx, tp, &p, offset) - p.childrenReqProps = props - p.stats = stats - return &p - -} - // Init initializes PhysicalMergeJoin. func (p PhysicalMergeJoin) Init(ctx sessionctx.Context, stats *property.StatsInfo, offset int) *PhysicalMergeJoin { p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeMergeJoin, &p, offset) @@ -422,10 +419,32 @@ func (p PhysicalTableReader) Init(ctx sessionctx.Context, offset int) *PhysicalT if p.tablePlan != nil { p.TablePlans = flattenPushDownPlan(p.tablePlan) p.schema = p.tablePlan.Schema() + if p.StoreType == kv.TiFlash && !p.GetTableScan().KeepOrder { + // When allow batch cop is 1, only agg / topN uses batch cop. + // When allow batch cop is 2, every query uses batch cop. + switch ctx.GetSessionVars().AllowBatchCop { + case 1: + for _, plan := range p.TablePlans { + switch plan.(type) { + case *PhysicalHashAgg, *PhysicalStreamAgg, *PhysicalTopN: + p.BatchCop = true + } + } + case 2: + p.BatchCop = true + } + } } return &p } +// Init initializes PhysicalTableSample. +func (p PhysicalTableSample) Init(ctx sessionctx.Context, offset int) *PhysicalTableSample { + p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeTableSample, &p, offset) + p.stats = &property.StatsInfo{RowCount: 1} + return &p +} + // Init initializes PhysicalIndexReader. func (p PhysicalIndexReader) Init(ctx sessionctx.Context, offset int) *PhysicalIndexReader { p.basePhysicalPlan = newBasePhysicalPlan(ctx, plancodec.TypeIndexReader, &p, offset) @@ -477,6 +496,20 @@ func (p PointGetPlan) Init(ctx sessionctx.Context, stats *property.StatsInfo, of return &p } +// Init only assigns type and context. +func (p PhysicalExchangeSender) Init(ctx sessionctx.Context, stats *property.StatsInfo) *PhysicalExchangeSender { + p.basePlan = newBasePlan(ctx, plancodec.TypeExchangeSender, 0) + p.stats = stats + return &p +} + +// Init only assigns type and context. +func (p PhysicalExchangeReceiver) Init(ctx sessionctx.Context, stats *property.StatsInfo) *PhysicalExchangeReceiver { + p.basePlan = newBasePlan(ctx, plancodec.TypeExchangeReceiver, 0) + p.stats = stats + return &p +} + func flattenTreePlan(plan PhysicalPlan, plans []PhysicalPlan) []PhysicalPlan { plans = append(plans, plan) for _, child := range plan.Children() { diff --git a/planner/core/integration_test.go b/planner/core/integration_test.go index a6f2e58c00b96..e4e8d55975a6a 100644 --- a/planner/core/integration_test.go +++ b/planner/core/integration_test.go @@ -186,6 +186,22 @@ func (s *testIntegrationSuite) TestIsFromUnixtimeNullRejective(c *C) { s.runTestsWithTestData("TestIsFromUnixtimeNullRejective", tk, c) } +func (s *testIntegrationSuite) TestIssue22298(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`drop table if exists t;`) + tk.MustExec(`create table t(a int, b int);`) + tk.MustGetErrMsg(`select * from t where 0 and c = 10;`, "[planner:1054]Unknown column 'c' in 'where clause'") +} + +func (s *testIntegrationSuite) TestIssue22828(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`drop table if exists t1;`) + tk.MustExec(`create table t (c int);`) + tk.MustGetErrMsg(`select group_concat((select concat(c,group_concat(c)) FROM t where xxx=xxx)) FROM t;`, "[planner:1054]Unknown column 'xxx' in 'where clause'") +} + func (s *testIntegrationSuite) runTestsWithTestData(caseName string, tk *testkit.TestKit, c *C) { var input []string var output []struct { @@ -301,9 +317,9 @@ func (s *testIntegrationSerialSuite) TestNoneAccessPathsFoundByIsolationRead(c * tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") // Don't filter mysql.SystemDB by isolation read. - tk.MustQuery("explain select * from mysql.stats_meta").Check(testkit.Rows( - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tikv] table:stats_meta keep order:false, stats:pseudo")) + tk.MustQuery("explain format = 'brief' select * from mysql.stats_meta").Check(testkit.Rows( + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:stats_meta keep order:false, stats:pseudo")) _, err = tk.Exec("select * from t") c.Assert(err, NotNil) @@ -355,6 +371,118 @@ func (s *testIntegrationSerialSuite) TestSelPushDownTiFlash(c *C) { res.Check(testkit.Rows(output[i].Plan...)) } } +func (s *testIntegrationSerialSuite) TestMPPJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists d1_t") + tk.MustExec("create table d1_t(d1_k int, value int)") + tk.MustExec("insert into d1_t values(1,2),(2,3)") + tk.MustExec("analyze table d1_t") + tk.MustExec("drop table if exists d2_t") + tk.MustExec("create table d2_t(d2_k decimal(10,2), value int)") + tk.MustExec("insert into d2_t values(10.11,2),(10.12,3)") + tk.MustExec("analyze table d2_t") + tk.MustExec("drop table if exists d3_t") + tk.MustExec("create table d3_t(d3_k date, value int)") + tk.MustExec("insert into d3_t values(date'2010-01-01',2),(date'2010-01-02',3)") + tk.MustExec("analyze table d3_t") + tk.MustExec("drop table if exists fact_t") + tk.MustExec("create table fact_t(d1_k int, d2_k decimal(10,2), d3_k date, col1 int, col2 int, col3 int)") + tk.MustExec("insert into fact_t values(1,10.11,date'2010-01-01',1,2,3),(1,10.11,date'2010-01-02',1,2,3),(1,10.12,date'2010-01-01',1,2,3),(1,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("insert into fact_t values(2,10.11,date'2010-01-01',1,2,3),(2,10.11,date'2010-01-02',1,2,3),(2,10.12,date'2010-01-01',1,2,3),(2,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("analyze table fact_t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "fact_t" || tblInfo.Name.L == "d1_t" || tblInfo.Name.L == "d2_t" || tblInfo.Name.L == "d3_t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_mpp = 1") + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestMPPShuffledJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists d1_t") + tk.MustExec("create table d1_t(d1_k int, value int)") + tk.MustExec("insert into d1_t values(1,2),(2,3)") + tk.MustExec("insert into d1_t values(1,2),(2,3)") + tk.MustExec("analyze table d1_t") + tk.MustExec("drop table if exists d2_t") + tk.MustExec("create table d2_t(d2_k decimal(10,2), value int)") + tk.MustExec("insert into d2_t values(10.11,2),(10.12,3)") + tk.MustExec("insert into d2_t values(10.11,2),(10.12,3)") + tk.MustExec("analyze table d2_t") + tk.MustExec("drop table if exists d3_t") + tk.MustExec("create table d3_t(d3_k date, value int)") + tk.MustExec("insert into d3_t values(date'2010-01-01',2),(date'2010-01-02',3)") + tk.MustExec("insert into d3_t values(date'2010-01-01',2),(date'2010-01-02',3)") + tk.MustExec("analyze table d3_t") + tk.MustExec("drop table if exists fact_t") + tk.MustExec("create table fact_t(d1_k int, d2_k decimal(10,2), d3_k date, col1 int, col2 int, col3 int)") + tk.MustExec("insert into fact_t values(1,10.11,date'2010-01-01',1,2,3),(1,10.11,date'2010-01-02',1,2,3),(1,10.12,date'2010-01-01',1,2,3),(1,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("insert into fact_t values(2,10.11,date'2010-01-01',1,2,3),(2,10.11,date'2010-01-02',1,2,3),(2,10.12,date'2010-01-01',1,2,3),(2,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("insert into fact_t values(2,10.11,date'2010-01-01',1,2,3),(2,10.11,date'2010-01-02',1,2,3),(2,10.12,date'2010-01-01',1,2,3),(2,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("insert into fact_t values(2,10.11,date'2010-01-01',1,2,3),(2,10.11,date'2010-01-02',1,2,3),(2,10.12,date'2010-01-01',1,2,3),(2,10.12,date'2010-01-02',1,2,3)") + tk.MustExec("analyze table fact_t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "fact_t" || tblInfo.Name.L == "d1_t" || tblInfo.Name.L == "d2_t" || tblInfo.Name.L == "d3_t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_mpp = 1") + tk.MustExec("set @@session.tidb_broadcast_join_threshold_size = 1") + tk.MustExec("set @@session.tidb_broadcast_join_threshold_count = 1") + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} func (s *testIntegrationSerialSuite) TestBroadcastJoin(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -394,6 +522,8 @@ func (s *testIntegrationSerialSuite) TestBroadcastJoin(c *C) { tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") tk.MustExec("set @@session.tidb_allow_batch_cop = 1") tk.MustExec("set @@session.tidb_opt_broadcast_join = 1") + // make cbo force choose broadcast join since sql hint does not work for semi/anti-semi join + tk.MustExec("set @@session.tidb_opt_cpu_factor=10000000;") var input []string var output []struct { SQL string @@ -410,19 +540,133 @@ func (s *testIntegrationSerialSuite) TestBroadcastJoin(c *C) { } // out table of out join should not be global - _, err := tk.Exec("explain select /*+ broadcast_join(fact_t, d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k") + _, err := tk.Exec("explain format = 'brief' select /*+ broadcast_join(fact_t, d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[planner:1815]Internal : Can't find a proper physical plan for this query") + // nullEQ not supported + _, err = tk.Exec("explain format = 'brief' select /*+ broadcast_join(fact_t, d1_t) */ count(*) from fact_t join d1_t on fact_t.d1_k <=> d1_t.d1_k") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[planner:1815]Internal : Can't find a proper physical plan for this query") - // join with non-equal condition not supported - _, err = tk.Exec("explain select /*+ broadcast_join(fact_t, d1_t) */ count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value") + // not supported if join condition has unsupported expr + _, err = tk.Exec("explain format = 'brief' select /*+ broadcast_join(fact_t, d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and sqrt(fact_t.col1) > 2") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[planner:1815]Internal : Can't find a proper physical plan for this query") // cartsian join not supported - _, err = tk.Exec("explain select /*+ broadcast_join(fact_t, d1_t) */ count(*) from fact_t join d1_t") + _, err = tk.Exec("explain format = 'brief' select /*+ broadcast_join(fact_t, d1_t) */ count(*) from fact_t join d1_t") c.Assert(err, NotNil) c.Assert(err.Error(), Equals, "[planner:1815]Internal : Can't find a proper physical plan for this query") } +func (s *testIntegrationSerialSuite) TestJoinNotSupportedByTiFlash(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_1") + tk.MustExec("create table table_1(id int not null, bit_col bit(2) not null, datetime_col datetime not null)") + tk.MustExec("insert into table_1 values(1,b'1','2020-01-01 00:00:00'),(2,b'0','2020-01-01 00:00:00')") + tk.MustExec("analyze table table_1") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "table_1" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_mpp = 1") + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } + + tk.MustExec("set @@session.tidb_broadcast_join_threshold_size = 1") + tk.MustExec("set @@session.tidb_broadcast_join_threshold_count = 1") + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } + + tk.MustExec("set @@session.tidb_allow_mpp = 0") + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_batch_cop = 1") + tk.MustExec("set @@session.tidb_opt_broadcast_join = 1") + // make cbo force choose broadcast join since sql hint does not work for semi/anti-semi join + tk.MustExec("set @@session.tidb_opt_cpu_factor=10000000;") + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestMPPNotSupportedInNewCollation(c *C) { + defer collate.SetNewCollationEnabledForTest(false) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists table_1") + tk.MustExec("create table table_1(id int not null, value int)") + tk.MustExec("insert into table_1 values(1,1),(2,2)") + tk.MustExec("analyze table table_1") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "table_1" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + collate.SetNewCollationEnabledForTest(true) + tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") + tk.MustExec("set @@session.tidb_allow_mpp = 1") + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + func (s *testIntegrationSerialSuite) TestAggPushDownEngine(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -448,8 +692,8 @@ func (s *testIntegrationSerialSuite) TestAggPushDownEngine(c *C) { tk.MustQuery("desc select approx_count_distinct(a) from t").Check(testkit.Rows( "StreamAgg_16 1.00 root funcs:approx_count_distinct(Column#5)->Column#3", "└─TableReader_17 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:approx_count_distinct(test.t.a)->Column#5", - " └─TableFullScan_15 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo")) + " └─StreamAgg_8 1.00 batchCop[tiflash] funcs:approx_count_distinct(test.t.a)->Column#5", + " └─TableFullScan_15 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo")) tk.MustExec("set @@session.tidb_isolation_read_engines = 'tikv'") @@ -491,7 +735,7 @@ func (s *testIntegrationSerialSuite) TestIssue15110(c *C) { } tk.MustExec("set @@session.tidb_isolation_read_engines = 'tiflash'") - tk.MustExec("explain SELECT count(*) FROM crm_rd_150m dataset_48 WHERE (CASE WHEN (month(dataset_48.customer_first_date)) <= 30 THEN '新客' ELSE NULL END) IS NOT NULL;") + tk.MustExec("explain format = 'brief' SELECT count(*) FROM crm_rd_150m dataset_48 WHERE (CASE WHEN (month(dataset_48.customer_first_date)) <= 30 THEN '新客' ELSE NULL END) IS NOT NULL;") } func (s *testIntegrationSerialSuite) TestReadFromStorageHint(c *C) { @@ -672,7 +916,7 @@ func (s *testIntegrationSerialSuite) TestIsolationReadDoNotFilterSystemDB(c *C) func (s *testIntegrationSuite) TestPartitionTableStats(c *C) { tk := testkit.NewTestKit(c, s.store) { - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int)partition by range columns(a)(partition p0 values less than (10), partition p1 values less than(20), partition p2 values less than(30));") @@ -718,6 +962,20 @@ func (s *testIntegrationSuite) TestPartitionPruningForInExpr(c *C) { } } +func (s *testIntegrationSerialSuite) TestPartitionPruningWithDateType(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a datetime) partition by range columns (a) (partition p1 values less than ('20000101'), partition p2 values less than ('2000-10-01'));") + tk.MustExec("insert into t values ('20000201'), ('19000101');") + + // cannot get the statistical information immediately + // tk.MustQuery(`SELECT PARTITION_NAME,TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME = 't';`).Check(testkit.Rows("p1 1", "p2 1")) + str := tk.MustQuery(`desc select * from t where a < '2000-01-01';`).Rows()[0][3].(string) + c.Assert(strings.Contains(str, "partition:p1"), IsTrue) +} + func (s *testIntegrationSuite) TestPartitionPruningForEQ(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -758,7 +1016,7 @@ func (s *testIntegrationSuite) TestMaxMinEliminate(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key)") - tk.MustExec("set @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table cluster_index_t(a int, b int, c int, primary key (a, b));") var input []string @@ -785,7 +1043,7 @@ func (s *testIntegrationSuite) TestINLJHintSmallTable(c *C) { tk.MustExec("create table t2(a int not null, b int, key(a))") tk.MustExec("insert into t2 values(1,1),(2,2),(3,3),(4,4),(5,5)") tk.MustExec("analyze table t1, t2") - tk.MustExec("explain select /*+ TIDB_INLJ(t1) */ * from t1 join t2 on t1.a = t2.a") + tk.MustExec("explain format = 'brief' select /*+ TIDB_INLJ(t1) */ * from t1 join t2 on t1.a = t2.a") } func (s *testIntegrationSuite) TestIndexJoinUniqueCompositeIndex(c *C) { @@ -793,7 +1051,7 @@ func (s *testIntegrationSuite) TestIndexJoinUniqueCompositeIndex(c *C) { tk.MustExec("use test") tk.MustExec("drop table if exists t1, t2") - tk.MustExec("set @@tidb_enable_clustered_index=0") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t1(a int not null, c int not null)") tk.MustExec("create table t2(a int not null, b int not null, c int not null, primary key(a,b))") tk.MustExec("insert into t1 values(1,1)") @@ -837,6 +1095,28 @@ func (s *testIntegrationSuite) TestIndexMerge(c *C) { } } +func (s *testIntegrationSuite) TestIndexMergeHint4CNF(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, a int, b int, c int, key(a), key(b), key(c))") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + func (s *testIntegrationSuite) TestInvisibleIndex(c *C) { tk := testkit.NewTestKit(c, s.store) @@ -977,16 +1257,16 @@ func (s *testIntegrationSuite) TestApproxCountDistinctInPartitionTable(c *C) { tk.MustExec("create table t(a int(11), b int) partition by range (a) (partition p0 values less than (3), partition p1 values less than maxvalue);") tk.MustExec("insert into t values(1, 1), (2, 1), (3, 1), (4, 2), (4, 2)") tk.MustExec("set session tidb_opt_agg_push_down=1") - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) - tk.MustQuery("explain select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("Sort_12 16000.00 root test.t.b:desc", - "└─HashAgg_17 16000.00 root group by:test.t.b, funcs:approx_count_distinct(Column#5)->Column#4, funcs:firstrow(Column#6)->test.t.b", - " └─PartitionUnion_18 16000.00 root ", - " ├─HashAgg_19 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", - " │ └─TableReader_23 10000.00 root data:TableFullScan_22", - " │ └─TableFullScan_22 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_26 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", - " └─TableReader_30 10000.00 root data:TableFullScan_29", - " └─TableFullScan_29 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo")) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + tk.MustQuery("explain format = 'brief' select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("Sort 16000.00 root test.t.b:desc", + "└─HashAgg 16000.00 root group by:test.t.b, funcs:approx_count_distinct(Column#5)->Column#4, funcs:firstrow(Column#6)->test.t.b", + " └─PartitionUnion 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.t.b, funcs:approx_count_distinct(test.t.a)->Column#5, funcs:firstrow(test.t.b)->Column#6, funcs:firstrow(test.t.b)->test.t.b", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo")) tk.MustQuery("select approx_count_distinct(a), b from t group by b order by b desc").Check(testkit.Rows("1 2", "3 1")) } @@ -1198,42 +1478,132 @@ func (s *testIntegrationSuite) TestTableDualWithRequiredProperty(c *C) { tk.MustExec("select /*+ MERGE_JOIN(t1, t2) */ * from t1 partition (p0), t2 where t1.a > 100 and t1.a = t2.a") } -func (s *testIntegrationSerialSuite) TestIssue16837(c *C) { - tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int,b int,c int,d int,e int,unique key idx_ab(a,b),unique key(c),unique key(d))") - tk.MustQuery("explain select /*+ use_index_merge(t,c,idx_ab) */ * from t where a = 1 or (e = 1 and c = 1)").Check(testkit.Rows( - "TableReader_7 10.00 root data:Selection_6", - "└─Selection_6 10.00 cop[tikv] or(eq(test.t.a, 1), and(eq(test.t.e, 1), eq(test.t.c, 1)))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo")) - tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 IndexMerge is inapplicable or disabled")) - tk.MustExec("insert into t values (2, 1, 1, 1, 2)") - tk.MustQuery("select /*+ use_index_merge(t,c,idx_ab) */ * from t where a = 1 or (e = 1 and c = 1)").Check(testkit.Rows()) -} - -func (s *testIntegrationSuite) TestStreamAggProp(c *C) { +func (s *testIntegrationSuite) TestIndexJoinInnerIndexNDV(c *C) { tk := testkit.NewTestKit(c, s.store) - tk.MustExec("use test") - tk.MustExec("drop table if exists t") - tk.MustExec("create table t(a int)") - tk.MustExec("insert into t values(1),(1),(2)") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int not null, b int not null, c int not null)") + tk.MustExec("create table t2(a int not null, b int not null, c int not null, index idx1(a,b), index idx2(c))") + tk.MustExec("insert into t1 values(1,1,1),(1,1,1),(1,1,1)") + tk.MustExec("insert into t2 values(1,1,1),(1,1,2),(1,1,3)") + tk.MustExec("analyze table t1, t2") var input []string var output []struct { SQL string Plan []string - Res []string } s.testData.GetTestCases(c, &input, &output) for i, tt := range input { s.testData.OnRecord(func() { output[i].SQL = tt - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) - output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) }) - tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestIssue16837(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int,b int,c int,d int,e int,unique key idx_ab(a,b),unique key(c),unique key(d))") + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t,c,idx_ab) */ * from t where a = 1 or (e = 1 and c = 1)").Check(testkit.Rows( + "Projection 10.00 root test.t.a, test.t.b, test.t.c, test.t.d, test.t.e", + "└─IndexMerge 0.01 root ", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:idx_ab(a, b) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:c(c) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.01 cop[tikv] or(eq(test.t.a, 1), and(eq(test.t.e, 1), eq(test.t.c, 1)))", + " └─TableRowIDScan 11.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("insert into t values (2, 1, 1, 1, 2)") + tk.MustQuery("select /*+ use_index_merge(t,c,idx_ab) */ * from t where a = 1 or (e = 1 and c = 1)").Check(testkit.Rows()) +} + +func (s *testIntegrationSerialSuite) TestIndexMerge(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, unique key(a), unique key(b))") + tk.MustQuery("desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and b+2>1)").Check(testkit.Rows( + "Projection 8000.00 root test.t.a, test.t.b", + "└─IndexMerge 2.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─Selection(Build) 0.80 cop[tikv] 1", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("desc format='brief' select /*+ use_index_merge(t) */ * from t where a =1 or (b=1 and length(b)=1)").Check(testkit.Rows( + "Projection 1.80 root test.t.a, test.t.b", + "└─IndexMerge 2.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1)), 1)", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(a)=1) or (b=1 and length(b)=1)").Check(testkit.Rows( + "Projection 1.60 root test.t.a, test.t.b", + "└─IndexMerge 2.00 root ", + " ├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1)), 1)", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─Selection(Build) 0.80 cop[tikv] eq(length(cast(1)), 1)", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + + tk.MustQuery("desc format='brief' select /*+ use_index_merge(t) */ * from t where (a=1 and length(b)=1) or (b=1 and length(a)=1)").Check(testkit.Rows( + "Projection 1.60 root test.t.a, test.t.b", + "└─IndexMerge 0.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.00 cop[tikv] or(and(eq(test.t.a, 1), eq(length(cast(test.t.b)), 1)), and(eq(test.t.b, 1), eq(length(cast(test.t.a)), 1)))", + " └─TableRowIDScan 2.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustQuery("show warnings").Check(testkit.Rows()) +} + +func (s *testIntegrationSerialSuite) TestIssue16407(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int,b char(100),key(a),key(b(10)))") + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a=10 or b='x'").Check(testkit.Rows( + "Projection 19.99 root test.t.a, test.t.b", + "└─IndexMerge 0.04 root ", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[\"x\",\"x\"], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.04 cop[tikv] or(eq(test.t.a, 10), eq(test.t.b, \"x\"))", + " └─TableRowIDScan 19.99 cop[tikv] table:t keep order:false, stats:pseudo")) + tk.MustQuery("show warnings").Check(testkit.Rows()) + tk.MustExec("insert into t values (1, 'xx')") + tk.MustQuery("select /*+ use_index_merge(t) */ * from t where a=10 or b='x'").Check(testkit.Rows()) +} + +func (s *testIntegrationSuite) TestStreamAggProp(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int)") + tk.MustExec("insert into t values(1),(1),(2)") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(tt).Check(testkit.Rows(output[i].Res...)) } } @@ -1266,7 +1636,7 @@ func (s *testIntegrationSuite) TestOptimizeHintOnPartitionTable(c *C) { } } - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) var input []string var output []struct { @@ -1420,7 +1790,7 @@ func (s *testIntegrationSuite) TestIssue16935(c *C) { func (s *testIntegrationSuite) TestAccessPathOnClusterIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t1") tk.MustExec("create table t1 (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c))") tk.MustExec(`insert into t1 values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13)`) @@ -1449,7 +1819,7 @@ func (s *testIntegrationSuite) TestClusterIndexUniqueDoubleRead(c *C) { tk.MustExec("create database cluster_idx_unique_double_read;") tk.MustExec("use cluster_idx_unique_double_read;") defer tk.MustExec("drop database cluster_idx_unique_double_read;") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t") tk.MustExec("create table t (a varchar(64), b varchar(64), uk int, v int, primary key(a, b), unique key uuk(uk));") @@ -1460,7 +1830,7 @@ func (s *testIntegrationSuite) TestClusterIndexUniqueDoubleRead(c *C) { func (s *testIntegrationSuite) TestIndexJoinOnClusteredIndex(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("set @@tidb_enable_clustered_index = 1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t1") tk.MustExec("create table t (a int, b varchar(20), c decimal(40,10), d int, primary key(a,b), key(c))") tk.MustExec(`insert into t values (1,"111",1.1,11), (2,"222",2.2,12), (3,"333",3.3,13)`) @@ -1487,7 +1857,7 @@ func (s *testIntegrationSerialSuite) TestIssue18984(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t, t2") - tk.MustExec("set tidb_enable_clustered_index=1") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t(a int, b int, c int, primary key(a, b))") tk.MustExec("create table t2(a int, b int, c int, d int, primary key(a,b), index idx(c))") tk.MustExec("insert into t values(1,1,1), (2,2,2), (3,3,3)") @@ -1503,6 +1873,17 @@ func (s *testIntegrationSerialSuite) TestIssue18984(c *C) { "3 3 3 2 4 3 5")) } +func (s *testIntegrationSuite) TestDistinctScalarFunctionPushDown(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int not null, b int not null, c int not null, primary key (a,c)) partition by range (c) (partition p0 values less than (5), partition p1 values less than (10))") + tk.MustExec("insert into t values(1,1,1),(2,2,2),(3,1,3),(7,1,7),(8,2,8),(9,2,9)") + tk.MustQuery("select count(distinct b+1) as col from t").Check(testkit.Rows( + "2", + )) +} + func (s *testIntegrationSerialSuite) TestExplainAnalyzePointGet(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -1622,7 +2003,7 @@ func (s *testIntegrationSerialSuite) Test19942(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("SET @@tidb_enable_clustered_index=1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("CREATE TABLE test.`t` (" + " `a` int(11) NOT NULL," + " `b` varchar(10) COLLATE utf8_general_ci NOT NULL," + @@ -1660,3 +2041,843 @@ func (s *testIntegrationSerialSuite) Test19942(c *C) { tk.MustQuery("SELECT * FROM `test`.`t` FORCE INDEX(`d_idx`);").Check(mkr()) tk.MustExec("admin check table t") } + +func (s *testIntegrationSuite) TestPartitionUnionWithPPruningColumn(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("CREATE TABLE `t` (\n `fid` bigint(36) NOT NULL,\n `oty` varchar(30) DEFAULT NULL,\n `oid` int(11) DEFAULT NULL,\n `pid` bigint(20) DEFAULT NULL,\n `bid` int(11) DEFAULT NULL,\n `r5` varchar(240) DEFAULT '',\n PRIMARY KEY (`fid`)\n)PARTITION BY HASH( `fid` ) PARTITIONS 4;") + + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (59, 'm', 441, 1, 2143, 'LE1264_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (135, 'm', 1121, 1, 2423, 'LE2008_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (139, 'm', 1125, 1, 2432, 'LE2005_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (143, 'm', 1129, 1, 2438, 'LE2006_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (147, 'm', 1133, 1, 2446, 'LE2014_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (167, 'm', 1178, 1, 2512, 'LE2055_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (171, 'm', 1321, 1, 2542, 'LE1006_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (179, 'm', 1466, 1, 2648, 'LE2171_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (187, 'm', 1567, 1, 2690, 'LE1293_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (57, 'm', 341, 1, 2102, 'LE1001_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (137, 'm', 1123, 1, 2427, 'LE2003_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (145, 'm', 1131, 1, 2442, 'LE2048_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (138, 'm', 1124, 1, 2429, 'LE2004_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (142, 'm', 1128, 1, 2436, 'LE2049_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (174, 'm', 1381, 1, 2602, 'LE2170_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (28, 'm', 81, 1, 2023, 'LE1009_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (60, 'm', 442, 1, 2145, 'LE1263_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (136, 'm', 1122, 1, 2425, 'LE2002_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (140, 'm', 1126, 1, 2434, 'LE2001_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (168, 'm', 1179, 1, 2514, 'LE2052_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (196, 'm', 3380, 1, 2890, 'LE1300_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (208, 'm', 3861, 1, 3150, 'LE1323_r5');") + tk.MustExec("INSERT INTO t (fid, oty, oid, pid, bid, r5) VALUES (432, 'm', 4060, 1, 3290, 'LE1327_r5');") + + tk.MustQuery("SELECT DISTINCT t.bid, t.r5 FROM t left join t parent on parent.oid = t.pid WHERE t.oty = 'm';").Sort().Check( + testkit.Rows("2023 LE1009_r5", + "2102 LE1001_r5", + "2143 LE1264_r5", + "2145 LE1263_r5", + "2423 LE2008_r5", + "2425 LE2002_r5", + "2427 LE2003_r5", + "2429 LE2004_r5", + "2432 LE2005_r5", + "2434 LE2001_r5", + "2436 LE2049_r5", + "2438 LE2006_r5", + "2442 LE2048_r5", + "2446 LE2014_r5", + "2512 LE2055_r5", + "2514 LE2052_r5", + "2542 LE1006_r5", + "2602 LE2170_r5", + "2648 LE2171_r5", + "2690 LE1293_r5", + "2890 LE1300_r5", + "3150 LE1323_r5", + "3290 LE1327_r5")) +} + +func (s *testIntegrationSuite) TestIssue20139(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, c int) partition by range (id) (partition p0 values less than (4), partition p1 values less than (7))") + tk.MustExec("insert into t values(3, 3), (5, 5)") + plan := tk.MustQuery("explain format = 'brief' select * from t where c = 1 and id = c") + plan.Check(testkit.Rows( + "TableReader 0.01 root partition:p0 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test.t.c, 1), eq(test.t.id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustExec("drop table t") +} + +func (s *testIntegrationSuite) TestIssue14481(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int default null, b int default null, c int default null)") + plan := tk.MustQuery("explain format = 'brief' select * from t where a = 1 and a = 2") + plan.Check(testkit.Rows("TableDual 8000.00 root rows:0")) + tk.MustExec("drop table t") +} + +func (s *testIntegrationSerialSuite) TestIssue20710(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t;") + tk.MustExec("drop table if exists s;") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("create table s(a int, b int, index(a))") + tk.MustExec("insert into t values(1,1),(1,2),(2,2)") + tk.MustExec("insert into s values(1,1),(2,2),(2,1)") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestQueryBlockTableAliasInHint(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + c.Assert(tk.HasPlan("select /*+ HASH_JOIN(@sel_1 t2) */ * FROM (select 1) t1 NATURAL LEFT JOIN (select 2) t2", "HashJoin"), IsTrue) + tk.MustQuery("select /*+ HASH_JOIN(@sel_1 t2) */ * FROM (select 1) t1 NATURAL LEFT JOIN (select 2) t2").Check(testkit.Rows( + "1 2", + )) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) +} + +func (s *testIntegrationSuite) TestIssue10448(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + + tk.MustExec("create table t(pk int(11) primary key)") + tk.MustExec("insert into t values(1),(2),(3)") + tk.MustQuery("select a from (select pk as a from t) t1 where a = 18446744073709551615").Check(testkit.Rows()) +} + +func (s *testIntegrationSuite) TestMultiUpdateOnPrimaryKey(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int not null primary key)") + tk.MustExec("insert into t values (1)") + tk.MustGetErrMsg(`UPDATE t m, t n SET m.a = m.a + 10, n.a = n.a + 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a varchar(10) not null primary key)") + tk.MustExec("insert into t values ('abc')") + tk.MustGetErrMsg(`UPDATE t m, t n SET m.a = 'def', n.a = 'xyz'`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, primary key (a, b))") + tk.MustExec("insert into t values (1, 2)") + tk.MustGetErrMsg(`UPDATE t m, t n SET m.a = m.a + 10, n.b = n.b + 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int primary key, b int)") + tk.MustExec("insert into t values (1, 2)") + tk.MustGetErrMsg(`UPDATE t m, t n SET m.a = m.a + 10, n.a = n.a + 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + + tk.MustExec(`UPDATE t m, t n SET m.b = m.b + 10, n.b = n.b + 10`) + tk.MustQuery("SELECT * FROM t").Check(testkit.Rows("1 12")) + + tk.MustGetErrMsg(`UPDATE t m, t n SET m.a = m.a + 1, n.b = n.b + 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + tk.MustGetErrMsg(`UPDATE t m, t n, t q SET m.a = m.a + 1, n.b = n.b + 10, q.b = q.b - 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + tk.MustGetErrMsg(`UPDATE t m, t n, t q SET m.b = m.b + 1, n.a = n.a + 10, q.b = q.b - 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'n'.`) + tk.MustGetErrMsg(`UPDATE t m, t n, t q SET m.b = m.b + 1, n.b = n.b + 10, q.a = q.a - 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'm' and 'q'.`) + tk.MustGetErrMsg(`UPDATE t q, t n, t m SET m.b = m.b + 1, n.b = n.b + 10, q.a = q.a - 10`, + `[planner:1706]Primary key/partition key update is not allowed since the table is updated both as 'q' and 'n'.`) + + tk.MustExec("update t m, t n set m.a = n.a+10 where m.a=n.a") + tk.MustQuery("select * from t").Check(testkit.Rows("11 12")) +} + +func (s *testIntegrationSuite) TestOrderByHavingNotInSelect(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists ttest") + tk.MustExec("create table ttest (v1 int, v2 int)") + tk.MustExec("insert into ttest values(1, 2), (4,6), (1, 7)") + tk.MustGetErrMsg("select v1 from ttest order by count(v2)", + "[planner:3029]Expression #1 of ORDER BY contains aggregate function and applies to the result of a non-aggregated query") + tk.MustGetErrMsg("select v1 from ttest having count(v2)", + "[planner:8123]In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'v1'; this is incompatible with sql_mode=only_full_group_by") +} + +func (s *testIntegrationSuite) TestUpdateSetDefault(c *C) { + // #20598 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table tt (x int, z int as (x+10) stored)") + tk.MustExec("insert into tt(x) values (1)") + tk.MustExec("update tt set x=2, z = default") + tk.MustQuery("select * from tt").Check(testkit.Rows("2 12")) + + tk.MustGetErrMsg("update tt set z = 123", + "[planner:3105]The value specified for generated column 'z' in table 'tt' is not allowed.") + tk.MustGetErrMsg("update tt as ss set z = 123", + "[planner:3105]The value specified for generated column 'z' in table 'tt' is not allowed.") + tk.MustGetErrMsg("update tt as ss set x = 3, z = 13", + "[planner:3105]The value specified for generated column 'z' in table 'tt' is not allowed.") + tk.MustGetErrMsg("update tt as s1, tt as s2 set s1.z = default, s2.z = 456", + "[planner:3105]The value specified for generated column 'z' in table 'tt' is not allowed.") +} + +func (s *testIntegrationSuite) TestExtendedStatsSwitch(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null, b int not null, key(a), key(b))") + tk.MustExec("insert into t values(1,1),(2,2),(3,3),(4,4),(5,5),(6,6)") + + tk.MustExec("set session tidb_enable_extended_stats = off") + tk.MustGetErrMsg("alter table t add stats_extended s1 correlation(a,b)", + "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + tk.MustGetErrMsg("alter table t drop stats_extended s1", + "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + tk.MustGetErrMsg("admin reload stats_extended", + "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + + tk.MustExec("set session tidb_enable_extended_stats = on") + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") + tk.MustQuery("select stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + " 0", + )) + tk.MustExec("set session tidb_enable_extended_stats = off") + // Analyze should not collect extended stats. + tk.MustExec("analyze table t") + tk.MustQuery("select stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + " 0", + )) + tk.MustExec("set session tidb_enable_extended_stats = on") + // Analyze would collect extended stats. + tk.MustExec("analyze table t") + tk.MustQuery("select stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + "1.000000 1", + )) + // Estimated index scan count is 4 using extended stats. + tk.MustQuery("explain format = 'brief' select * from t use index(b) where a > 3 order by b limit 1").Check(testkit.Rows( + "Limit 1.00 root offset:0, count:1", + "└─Projection 1.00 root test.t.a, test.t.b", + " └─IndexLookUp 1.00 root ", + " ├─IndexFullScan(Build) 4.00 cop[tikv] table:t, index:b(b) keep order:true", + " └─Selection(Probe) 1.00 cop[tikv] gt(test.t.a, 3)", + " └─TableRowIDScan 4.00 cop[tikv] table:t keep order:false", + )) + tk.MustExec("set session tidb_enable_extended_stats = off") + // Estimated index scan count is 2 using independent assumption. + tk.MustQuery("explain format = 'brief' select * from t use index(b) where a > 3 order by b limit 1").Check(testkit.Rows( + "Limit 1.00 root offset:0, count:1", + "└─Projection 1.00 root test.t.a, test.t.b", + " └─IndexLookUp 1.00 root ", + " ├─IndexFullScan(Build) 2.00 cop[tikv] table:t, index:b(b) keep order:true", + " └─Selection(Probe) 1.00 cop[tikv] gt(test.t.a, 3)", + " └─TableRowIDScan 2.00 cop[tikv] table:t keep order:false", + )) +} + +func (s *testIntegrationSuite) TestOrderByNotInSelectDistinct(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + // #12442 + tk.MustExec("drop table if exists ttest") + tk.MustExec("create table ttest (v1 int, v2 int)") + tk.MustExec("insert into ttest values(1, 2), (4,6), (1, 7)") + + tk.MustGetErrMsg("select distinct v1 from ttest order by v2", + "[planner:3065]Expression #1 of ORDER BY clause is not in SELECT list, references column 'test.ttest.v2' which is not in SELECT list; this is incompatible with DISTINCT") + tk.MustGetErrMsg("select distinct v1+1 from ttest order by v1", + "[planner:3065]Expression #1 of ORDER BY clause is not in SELECT list, references column 'test.ttest.v1' which is not in SELECT list; this is incompatible with DISTINCT") + tk.MustGetErrMsg("select distinct v1+1 from ttest order by 1+v1", + "[planner:3065]Expression #1 of ORDER BY clause is not in SELECT list, references column 'test.ttest.v1' which is not in SELECT list; this is incompatible with DISTINCT") + tk.MustGetErrMsg("select distinct v1+1 from ttest order by v1+2", + "[planner:3065]Expression #1 of ORDER BY clause is not in SELECT list, references column 'test.ttest.v1' which is not in SELECT list; this is incompatible with DISTINCT") + tk.MustGetErrMsg("select distinct count(v1) from ttest group by v2 order by sum(v1)", + "[planner:3066]Expression #1 of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with DISTINCT") + tk.MustGetErrMsg("select distinct sum(v1)+1 from ttest group by v2 order by sum(v1)", + "[planner:3066]Expression #1 of ORDER BY clause is not in SELECT list, contains aggregate function; this is incompatible with DISTINCT") + + // Expressions in ORDER BY whole match some fields in DISTINCT. + tk.MustQuery("select distinct v1+1 from ttest order by v1+1").Check(testkit.Rows("2", "5")) + tk.MustQuery("select distinct count(v1) from ttest order by count(v1)").Check(testkit.Rows("3")) + tk.MustQuery("select distinct count(v1) from ttest group by v2 order by count(v1)").Check(testkit.Rows("1")) + tk.MustQuery("select distinct sum(v1) from ttest group by v2 order by sum(v1)").Check(testkit.Rows("1", "4")) + tk.MustQuery("select distinct v1, v2 from ttest order by 1, 2").Check(testkit.Rows("1 2", "1 7", "4 6")) + tk.MustQuery("select distinct v1, v2 from ttest order by 2, 1").Check(testkit.Rows("1 2", "4 6", "1 7")) + + // Referenced columns of expressions in ORDER BY whole match some fields in DISTINCT, + // both original expression and alias can be referenced. + tk.MustQuery("select distinct v1 from ttest order by v1+1").Check(testkit.Rows("1", "4")) + tk.MustQuery("select distinct v1, v2 from ttest order by v1+1, v2").Check(testkit.Rows("1 2", "1 7", "4 6")) + tk.MustQuery("select distinct v1+1 as z, v2 from ttest order by v1+1, z+v2").Check(testkit.Rows("2 2", "2 7", "5 6")) + tk.MustQuery("select distinct sum(v1) as z from ttest group by v2 order by z+1").Check(testkit.Rows("1", "4")) + tk.MustQuery("select distinct sum(v1)+1 from ttest group by v2 order by sum(v1)+1").Check(testkit.Rows("2", "5")) + tk.MustQuery("select distinct v1 as z from ttest order by v1+z").Check(testkit.Rows("1", "4")) +} + +func (s *testIntegrationSuite) TestInvalidNamedWindowSpec(c *C) { + // #12356 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("DROP TABLE IF EXISTS temptest") + tk.MustExec("create table temptest (val int, val1 int)") + tk.MustQuery("SELECT val FROM temptest WINDOW w AS (ORDER BY val RANGE 1 PRECEDING)").Check(testkit.Rows()) + tk.MustGetErrMsg("SELECT val FROM temptest WINDOW w AS (ORDER BY val, val1 RANGE 1 PRECEDING)", + "[planner:3587]Window 'w' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type") + tk.MustGetErrMsg("select val1, avg(val1) as a from temptest group by val1 window w as (order by a)", + "[planner:1054]Unknown column 'a' in 'window order by'") + tk.MustGetErrMsg("select val1, avg(val1) as a from temptest group by val1 window w as (partition by a)", + "[planner:1054]Unknown column 'a' in 'window partition by'") +} + +func (s *testIntegrationSuite) TestCorrelatedAggregate(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + + // #18350 + tk.MustExec("DROP TABLE IF EXISTS tab, tab2") + tk.MustExec("CREATE TABLE tab(i INT)") + tk.MustExec("CREATE TABLE tab2(j INT)") + tk.MustExec("insert into tab values(1),(2),(3)") + tk.MustExec("insert into tab2 values(1),(2),(3),(15)") + tk.MustQuery(`SELECT m.i, + (SELECT COUNT(n.j) + FROM tab2 WHERE j=15) AS o + FROM tab m, tab2 n GROUP BY 1 order by m.i`).Check(testkit.Rows("1 4", "2 4", "3 4")) + tk.MustQuery(`SELECT + (SELECT COUNT(n.j) + FROM tab2 WHERE j=15) AS o + FROM tab m, tab2 n order by m.i`).Check(testkit.Rows("12")) + + // #17748 + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1 (a int, b int)") + tk.MustExec("create table t2 (m int, n int)") + tk.MustExec("insert into t1 values (2,2), (2,2), (3,3), (3,3), (3,3), (4,4)") + tk.MustExec("insert into t2 values (1,11), (2,22), (3,32), (4,44), (4,44)") + tk.MustExec("set @@sql_mode='TRADITIONAL'") + + tk.MustQuery(`select count(*) c, a, + ( select group_concat(count(a)) from t2 where m = a ) + from t1 group by a order by a`). + Check(testkit.Rows("2 2 2", "3 3 3", "1 4 1,1")) + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int)") + tk.MustExec("insert into t values (1,1),(2,1),(2,2),(3,1),(3,2),(3,3)") + + // Sub-queries in SELECT fields + // from SELECT fields + tk.MustQuery("select (select count(a)) from t").Check(testkit.Rows("6")) + tk.MustQuery("select (select (select (select count(a)))) from t").Check(testkit.Rows("6")) + tk.MustQuery("select (select (select count(n.a)) from t m order by count(m.b)) from t n").Check(testkit.Rows("6")) + // from WHERE + tk.MustQuery("select (select count(n.a) from t where count(n.a)=3) from t n").Check(testkit.Rows("")) + tk.MustQuery("select (select count(a) from t where count(distinct n.a)=3) from t n").Check(testkit.Rows("6")) + // from HAVING + tk.MustQuery("select (select count(n.a) from t having count(n.a)=6 limit 1) from t n").Check(testkit.Rows("6")) + tk.MustQuery("select (select count(n.a) from t having count(distinct n.b)=3 limit 1) from t n").Check(testkit.Rows("6")) + tk.MustQuery("select (select sum(distinct n.a) from t having count(distinct n.b)=3 limit 1) from t n").Check(testkit.Rows("6")) + tk.MustQuery("select (select sum(distinct n.a) from t having count(distinct n.b)=6 limit 1) from t n").Check(testkit.Rows("")) + // from ORDER BY + tk.MustQuery("select (select count(n.a) from t order by count(n.b) limit 1) from t n").Check(testkit.Rows("6")) + tk.MustQuery("select (select count(distinct n.b) from t order by count(n.b) limit 1) from t n").Check(testkit.Rows("3")) + // from TableRefsClause + tk.MustQuery("select (select cnt from (select count(a) cnt) s) from t").Check(testkit.Rows("6")) + tk.MustQuery("select (select count(cnt) from (select count(a) cnt) s) from t").Check(testkit.Rows("1")) + // from sub-query inside aggregate + tk.MustQuery("select (select sum((select count(a)))) from t").Check(testkit.Rows("6")) + tk.MustQuery("select (select sum((select count(a))+sum(a))) from t").Check(testkit.Rows("20")) + // from GROUP BY + tk.MustQuery("select (select count(a) from t group by count(n.a)) from t n").Check(testkit.Rows("6")) + tk.MustQuery("select (select count(distinct a) from t group by count(n.a)) from t n").Check(testkit.Rows("3")) + + // Sub-queries in HAVING + tk.MustQuery("select sum(a) from t having (select count(a)) = 0").Check(testkit.Rows()) + tk.MustQuery("select sum(a) from t having (select count(a)) > 0").Check(testkit.Rows("14")) + + // Sub-queries in ORDER BY + tk.MustQuery("select count(a) from t group by b order by (select count(a))").Check(testkit.Rows("1", "2", "3")) + tk.MustQuery("select count(a) from t group by b order by (select -count(a))").Check(testkit.Rows("3", "2", "1")) + + // Nested aggregate (correlated aggregate inside aggregate) + tk.MustQuery("select (select sum(count(a))) from t").Check(testkit.Rows("6")) + tk.MustQuery("select (select sum(sum(a))) from t").Check(testkit.Rows("14")) + + // Combining aggregates + tk.MustQuery("select count(a), (select count(a)) from t").Check(testkit.Rows("6 6")) + tk.MustQuery("select sum(distinct b), count(a), (select count(a)), (select cnt from (select sum(distinct b) as cnt) n) from t"). + Check(testkit.Rows("6 6 6 6")) +} + +func (s *testIntegrationSuite) TestCorrelatedColumnAggFuncPushDown(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int);") + tk.MustExec("insert into t values (1,1);") + tk.MustQuery("select (select count(n.a + a) from t) from t n;").Check(testkit.Rows( + "1", + )) +} + +// Test for issue https://github.com/pingcap/tidb/issues/21607. +func (s *testIntegrationSuite) TestConditionColPruneInPhysicalUnionScan(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test;") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b int);") + tk.MustExec("begin;") + tk.MustExec("insert into t values (1, 2);") + tk.MustQuery("select count(*) from t where b = 1 and b in (3);"). + Check(testkit.Rows("0")) + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a int, b int as (a + 1), c int as (b + 1));") + tk.MustExec("begin;") + tk.MustExec("insert into t (a) values (1);") + tk.MustQuery("select count(*) from t where b = 1 and b in (3);"). + Check(testkit.Rows("0")) + tk.MustQuery("select count(*) from t where c = 1 and c in (3);"). + Check(testkit.Rows("0")) +} + +func (s *testIntegrationSuite) TestInvalidHint(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists tt") + tk.MustExec("create table tt(a int, key(a));") + + var input []string + var output []struct { + SQL string + Plan []string + Warnings []string + } + s.testData.GetTestCases(c, &input, &output) + warning := "show warnings;" + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Warnings = s.testData.ConvertRowsToStrings(tk.MustQuery(warning).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +// Test for issue https://github.com/pingcap/tidb/issues/18320 +func (s *testIntegrationSuite) TestNonaggregateColumnWithSingleValueInOnlyFullGroupByMode(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int)") + tk.MustExec("insert into t values (1, 2, 3), (4, 5, 6), (7, 8, 9)") + tk.MustQuery("select a, count(b) from t where a = 1").Check(testkit.Rows("1 1")) + tk.MustQuery("select a, count(b) from t where a = 10").Check(testkit.Rows(" 0")) + tk.MustQuery("select a, c, sum(b) from t where a = 1 group by c").Check(testkit.Rows("1 3 2")) + tk.MustGetErrMsg("select a from t where a = 1 order by count(b)", "[planner:3029]Expression #1 of ORDER BY contains aggregate function and applies to the result of a non-aggregated query") + tk.MustQuery("select a from t where a = 1 having count(b) > 0").Check(testkit.Rows("1")) +} + +func (s *testIntegrationSuite) TestConvertRangeToPoint(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t0") + tk.MustExec("create table t0 (a int, b int, index(a, b))") + tk.MustExec("insert into t0 values (1, 1)") + tk.MustExec("insert into t0 values (2, 2)") + tk.MustExec("insert into t0 values (2, 2)") + tk.MustExec("insert into t0 values (2, 2)") + tk.MustExec("insert into t0 values (2, 2)") + tk.MustExec("insert into t0 values (2, 2)") + tk.MustExec("insert into t0 values (3, 3)") + + tk.MustExec("drop table if exists t1") + tk.MustExec("create table t1 (a int, b int, c int, index(a, b, c))") + + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2 (a float, b float, index(a, b))") + + tk.MustExec("drop table if exists t3") + tk.MustExec("create table t3 (a char(10), b char(10), c char(10), index(a, b, c))") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestIssue22040(c *C) { + // #22040 + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, primary key(a,b))") + // valid case + tk.MustExec("select * from t where (a,b) in ((1,2),(1,2))") + // invalid case, column count doesn't match + { + err := tk.ExecToErr("select * from t where (a,b) in (1,2)") + c.Assert(errors.Cause(err), FitsTypeOf, expression.ErrOperandColumns) + } + { + err := tk.ExecToErr("select * from t where (a,b) in ((1,2),1)") + c.Assert(errors.Cause(err), FitsTypeOf, expression.ErrOperandColumns) + } +} + +func (s *testIntegrationSuite) TestIssue22105(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(`CREATE TABLE t1 ( + key1 int(11) NOT NULL, + key2 int(11) NOT NULL, + key3 int(11) NOT NULL, + key4 int(11) NOT NULL, + key5 int(11) DEFAULT NULL, + key6 int(11) DEFAULT NULL, + key7 int(11) NOT NULL, + key8 int(11) NOT NULL, + KEY i1 (key1), + KEY i2 (key2), + KEY i3 (key3), + KEY i4 (key4), + KEY i5 (key5), + KEY i6 (key6) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin`) + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestIssue22071(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t (a int);") + tk.MustExec("insert into t values(1),(2),(5)") + tk.MustQuery("select n in (1,2) from (select a in (1,2) as n from t) g;").Sort().Check(testkit.Rows("0", "1", "1")) + tk.MustQuery("select n in (1,n) from (select a in (1,2) as n from t) g;").Check(testkit.Rows("1", "1", "1")) +} + +func (s *testIntegrationSuite) TestIssue22199(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(i int primary key, j int, index idx_j(j))") + tk.MustExec("create table t2(i int primary key, j int, index idx_j(j))") + tk.MustGetErrMsg("select t1.*, (select t2.* from t1) from t1", "[planner:1051]Unknown table 't2'") +} + +func (s *testIntegrationSerialSuite) TestPushDownProjectionForTiFlash(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3))") + tk.MustExec("analyze table t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_opt_broadcast_join=1;") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestPushDownProjectionForMPP(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3))") + tk.MustExec("analyze table t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec("set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0;") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestReorderSimplifiedOuterJoins(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t1,t2,t3") + tk.MustExec("create table t1 (pk char(32) primary key, col1 char(32), col2 varchar(40), col3 char(32), key (col1), key (col3), key (col2,col3), key (col1,col3))") + tk.MustExec("create table t2 (pk char(32) primary key, col1 varchar(100))") + tk.MustExec("create table t3 (pk char(32) primary key, keycol varchar(100), pad1 tinyint(1) default null, pad2 varchar(40), key (keycol,pad1,pad2))") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestDeleteStmt(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + tk.MustExec("delete t from t;") + tk.MustExec("delete t from test.t as t;") + tk.MustGetErrCode("delete test.t from test.t as t;", mysql.ErrUnknownTable) + tk.MustExec("delete test.t from t;") + tk.MustExec("create database db1") + tk.MustExec("use db1") + tk.MustExec("create table t(a int)") + tk.MustGetErrCode("delete test.t from t;", mysql.ErrUnknownTable) +} + +func (s *testIntegrationSuite) TestIndexMergeConstantTrue(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int primary key, b int not null, key(b))") + tk.MustExec("delete /*+ use_index_merge(t) */ FROM t WHERE a=1 OR (b < SOME (SELECT /*+ use_index_merge(t)*/ b FROM t WHERE a<2 OR b<2))") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null, b int not null, key(a), key(b))") + tk.MustExec("delete /*+ use_index_merge(t) */ FROM t WHERE a=1 OR (b < SOME (SELECT /*+ use_index_merge(t)*/ b FROM t WHERE a<2 OR b<2))") + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b int not null, c int, key(a), key(b,c))") + tk.MustExec("delete /*+ use_index_merge(t) */ FROM t WHERE a=1 OR (a<2 and b<2)") +} + +func (s *testIntegrationSerialSuite) TestPushDownAggForMPP(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3))") + tk.MustExec("analyze table t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec(" set @@tidb_allow_mpp=1; set @@tidb_opt_broadcast_join=0; set @@tidb_broadcast_join_threshold_count = 1; set @@tidb_broadcast_join_threshold_size=1;") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSerialSuite) TestMppAggWithJoin(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int, value decimal(6,3))") + tk.MustExec("analyze table t") + + // Create virtual tiflash replica info. + dom := domain.GetDomain(tk.Se) + is := dom.InfoSchema() + db, exists := is.SchemaByName(model.NewCIStr("test")) + c.Assert(exists, IsTrue) + for _, tblInfo := range db.Tables { + if tblInfo.Name.L == "t" { + tblInfo.TiFlashReplica = &model.TiFlashReplicaInfo{ + Count: 1, + Available: true, + } + } + } + + tk.MustExec(" set @@tidb_allow_mpp=1;") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + res := tk.MustQuery(tt) + res.Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestDecorrelateInnerJoinInSubquery(c *C) { + tk := testkit.NewTestKit(c, s.store) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null, b int not null)") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } +} + +func (s *testIntegrationSuite) TestIndexMergeTableFilter(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(a int, b int, c int, d int, key(a), key(b));") + tk.MustExec("insert into t values(10,1,1,10)") + + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where a=10 or (b=10 and c=10)").Check(testkit.Rows( + "Projection 10.01 root test.t.a, test.t.b, test.t.c, test.t.d", + "└─IndexMerge 0.02 root ", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[10,10], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.02 cop[tikv] or(eq(test.t.a, 10), and(eq(test.t.b, 10), eq(test.t.c, 10)))", + " └─TableRowIDScan 19.99 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ use_index_merge(t) */ * from t where a=10 or (b=10 and c=10)").Check(testkit.Rows( + "10 1 1 10", + )) + tk.MustQuery("explain format = 'brief' select /*+ use_index_merge(t) */ * from t where (a=10 and d=10) or (b=10 and c=10)").Check(testkit.Rows( + "Projection 0.02 root test.t.a, test.t.b, test.t.c, test.t.d", + "└─IndexMerge 0.00 root ", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[10,10], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[10,10], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.00 cop[tikv] or(and(eq(test.t.a, 10), eq(test.t.d, 10)), and(eq(test.t.b, 10), eq(test.t.c, 10)))", + " └─TableRowIDScan 19.99 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk.MustQuery("select /*+ use_index_merge(t) */ * from t where (a=10 and d=10) or (b=10 and c=10)").Check(testkit.Rows( + "10 1 1 10", + )) +} diff --git a/planner/core/logical_plan_builder.go b/planner/core/logical_plan_builder.go index 0b2d79840e2f9..33b5abd46e06a 100644 --- a/planner/core/logical_plan_builder.go +++ b/planner/core/logical_plan_builder.go @@ -18,7 +18,6 @@ import ( "fmt" "math" "math/bits" - "reflect" "sort" "strconv" "strings" @@ -33,6 +32,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/opcode" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" @@ -50,8 +50,8 @@ import ( driver "github.com/pingcap/tidb/types/parser_driver" util2 "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" - utilhint "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/plancodec" + "github.com/pingcap/tidb/util/set" ) const ( @@ -113,15 +113,6 @@ const ( ErrExprInOrderBy = "ORDER BY" ) -func (la *LogicalAggregation) collectGroupByColumns() { - la.groupByCols = la.groupByCols[:0] - for _, item := range la.GroupByItems { - if col, ok := item.(*expression.Column); ok { - la.groupByCols = append(la.groupByCols, col) - } - } -} - // aggOrderByResolver is currently resolving expressions of order by clause // in aggregate function GROUP_CONCAT. type aggOrderByResolver struct { @@ -170,7 +161,8 @@ func (a *aggOrderByResolver) Leave(inNode ast.Node) (ast.Node, bool) { return inNode, true } -func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFuncList []*ast.AggregateFuncExpr, gbyItems []expression.Expression) (LogicalPlan, map[int]int, error) { +func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFuncList []*ast.AggregateFuncExpr, gbyItems []expression.Expression, + correlatedAggMap map[*ast.AggregateFuncExpr]int) (LogicalPlan, map[int]int, error) { b.optFlag |= flagBuildKeyInfo b.optFlag |= flagPushDownAgg // We may apply aggregation eliminate optimization. @@ -191,6 +183,7 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu // aggIdxMap maps the old index to new index after applying common aggregation functions elimination. aggIndexMap := make(map[int]int) + allAggsFirstRow := true for i, aggFunc := range aggFuncList { newArgList := make([]expression.Expression, 0, len(aggFunc.Args)) for _, arg := range aggFunc.Args { @@ -205,6 +198,9 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu if err != nil { return nil, nil, err } + if newFunc.Name != ast.AggFuncFirstRow { + allAggsFirstRow = false + } if aggFunc.Order != nil { trueArgs := aggFunc.Args[:len(aggFunc.Args)-1] // the last argument is SEPARATOR, remote it. resolver := &aggOrderByResolver{ @@ -226,23 +222,40 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu newFunc.OrderByItems = append(newFunc.OrderByItems, &util.ByItems{Expr: newByItem, Desc: byItem.Desc}) } } + // combine identical aggregate functions combined := false - for j, oldFunc := range plan4Agg.AggFuncs { + for j := 0; j < i; j++ { + oldFunc := plan4Agg.AggFuncs[aggIndexMap[j]] if oldFunc.Equal(b.ctx, newFunc) { - aggIndexMap[i] = j + aggIndexMap[i] = aggIndexMap[j] combined = true + if _, ok := correlatedAggMap[aggFunc]; ok { + if _, ok = b.correlatedAggMapper[aggFuncList[j]]; !ok { + b.correlatedAggMapper[aggFuncList[j]] = &expression.CorrelatedColumn{ + Column: *schema4Agg.Columns[aggIndexMap[j]], + } + } + b.correlatedAggMapper[aggFunc] = b.correlatedAggMapper[aggFuncList[j]] + } break } } + // create new columns for aggregate functions which show up first if !combined { position := len(plan4Agg.AggFuncs) aggIndexMap[i] = position plan4Agg.AggFuncs = append(plan4Agg.AggFuncs, newFunc) - schema4Agg.Append(&expression.Column{ + column := expression.Column{ UniqueID: b.ctx.GetSessionVars().AllocPlanColumnID(), RetType: newFunc.RetTp, - }) + } + schema4Agg.Append(&column) names = append(names, types.EmptyName) + if _, ok := correlatedAggMap[aggFunc]; ok { + b.correlatedAggMapper[aggFunc] = &expression.CorrelatedColumn{ + Column: column, + } + } } } for i, col := range p.Schema().Columns { @@ -256,14 +269,65 @@ func (b *PlanBuilder) buildAggregation(ctx context.Context, p LogicalPlan, aggFu schema4Agg.Append(newCol) names = append(names, p.OutputNames()[i]) } + if join, isJoin := p.(*LogicalJoin); isJoin && join.redundantSchema != nil { + for i, col := range join.redundantSchema.Columns { + if p.Schema().Contains(col) { + continue + } + newFunc, err := aggregation.NewAggFuncDesc(b.ctx, ast.AggFuncFirstRow, []expression.Expression{col}, false) + if err != nil { + return nil, nil, err + } + plan4Agg.AggFuncs = append(plan4Agg.AggFuncs, newFunc) + newCol, _ := col.Clone().(*expression.Column) + newCol.RetType = newFunc.RetTp + schema4Agg.Append(newCol) + names = append(names, join.redundantNames[i]) + } + } + hasGroupBy := len(gbyItems) > 0 + for i, aggFunc := range plan4Agg.AggFuncs { + err := aggFunc.UpdateNotNullFlag4RetType(hasGroupBy, allAggsFirstRow) + if err != nil { + return nil, nil, err + } + schema4Agg.Columns[i].RetType = aggFunc.RetTp + } plan4Agg.names = names plan4Agg.SetChildren(p) plan4Agg.GroupByItems = gbyItems plan4Agg.SetSchema(schema4Agg) - plan4Agg.collectGroupByColumns() return plan4Agg, aggIndexMap, nil } +func (b *PlanBuilder) buildTableRefsWithCache(ctx context.Context, from *ast.TableRefsClause) (p LogicalPlan, err error) { + return b.buildTableRefs(ctx, from, true) +} + +func (b *PlanBuilder) buildTableRefs(ctx context.Context, from *ast.TableRefsClause, useCache bool) (p LogicalPlan, err error) { + if from == nil { + p = b.buildTableDual() + return + } + if !useCache { + return b.buildResultSetNode(ctx, from.TableRefs) + } + var ok bool + p, ok = b.cachedResultSetNodes[from.TableRefs] + if ok { + m := b.cachedHandleHelperMap[from.TableRefs] + b.handleHelper.pushMap(m) + return + } + p, err = b.buildResultSetNode(ctx, from.TableRefs) + if err != nil { + return nil, err + } + b.cachedResultSetNodes[from.TableRefs] = p + b.cachedHandleHelperMap[from.TableRefs] = b.handleHelper.tailMap() + return +} + func (b *PlanBuilder) buildResultSetNode(ctx context.Context, node ast.ResultSetNode) (p LogicalPlan, err error) { switch x := node.(type) { case *ast.Join: @@ -368,6 +432,15 @@ func (p *LogicalJoin) ExtractOnCondition( deriveRight bool) (eqCond []*expression.ScalarFunction, leftCond []expression.Expression, rightCond []expression.Expression, otherCond []expression.Expression) { for _, expr := range conditions { + // For queries like `select a in (select a from s where s.b = t.b) from t`, + // if subquery is empty caused by `s.b = t.b`, the result should always be + // false even if t.a is null or s.a is null. To make this join "empty aware", + // we should differentiate `t.a = s.a` from other column equal conditions, so + // we put it into OtherConditions instead of EqualConditions of join. + if expression.IsEQCondFromIn(expr) { + otherCond = append(otherCond, expr) + continue + } binop, ok := expr.(*expression.ScalarFunction) if ok && len(binop.GetArgs()) == 2 { ctx := binop.GetCtx() @@ -394,12 +467,7 @@ func (p *LogicalJoin) ExtractOnCondition( rightCond = append(rightCond, notNullExpr) } } - // For queries like `select a in (select a from s where s.b = t.b) from t`, - // if subquery is empty caused by `s.b = t.b`, the result should always be - // false even if t.a is null or s.a is null. To make this join "empty aware", - // we should differentiate `t.a = s.a` from other column equal conditions, so - // we put it into OtherConditions instead of EqualConditions of join. - if binop.FuncName.L == ast.EQ && !arg0.InOperand && !arg1.InOperand { + if binop.FuncName.L == ast.EQ { cond := expression.NewFunctionInternal(ctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), arg0, arg1) eqCond = append(eqCond, cond.(*expression.ScalarFunction)) continue @@ -466,7 +534,11 @@ func extractTableAlias(p Plan, parentOffset int) *hintTableInfo { if blockOffset != parentOffset && blockAsNames != nil && blockAsNames[blockOffset].TableName.L != "" { blockOffset = parentOffset } - return &hintTableInfo{dbName: firstName.DBName, tblName: firstName.TblName, selectOffset: blockOffset} + dbName := firstName.DBName + if dbName.L == "" { + dbName = model.NewCIStr(p.SCtx().GetSessionVars().CurrentDB) + } + return &hintTableInfo{dbName: dbName, tblName: firstName.TblName, selectOffset: blockOffset} } return nil } @@ -605,6 +677,8 @@ func (b *PlanBuilder) buildJoin(ctx context.Context, joinNode *ast.Join) (Logica } b.optFlag = b.optFlag | flagPredicatePushDown + // Add join reorder flag regardless of inner join or outer join. + b.optFlag = b.optFlag | flagJoinReOrder leftPlan, err := b.buildResultSetNode(ctx, joinNode.Left) if err != nil { @@ -640,7 +714,6 @@ func (b *PlanBuilder) buildJoin(ctx context.Context, joinNode *ast.Join) (Logica joinPlan.JoinType = RightOuterJoin resetNotNullFlag(joinPlan.schema, 0, leftPlan.Schema().Len()) default: - b.optFlag = b.optFlag | flagJoinReOrder joinPlan.JoinType = InnerJoin } @@ -694,6 +767,13 @@ func (b *PlanBuilder) buildJoin(ctx context.Context, joinNode *ast.Join) (Logica return nil, errors.New("ON condition doesn't support subqueries yet") } onCondition := expression.SplitCNFItems(onExpr) + // Keep these expressions as a LogicalSelection upon the inner join, in order to apply + // possible decorrelate optimizations. The ON clause is actually treated as a WHERE clause now. + if joinPlan.JoinType == InnerJoin { + sel := LogicalSelection{Conditions: onCondition}.Init(b.ctx, b.getSelectOffset()) + sel.SetChildren(joinPlan) + return sel, nil + } joinPlan.AttachOnConds(onCondition) } else if joinPlan.JoinType == InnerJoin { // If a inner join without "ON" or "USING" clause, it's a cartesian @@ -717,7 +797,16 @@ func (b *PlanBuilder) buildUsingClause(p *LogicalJoin, leftPlan, rightPlan Logic for _, col := range join.Using { filter[col.Name.L] = true } - return b.coalesceCommonColumns(p, leftPlan, rightPlan, join.Tp, filter) + err := b.coalesceCommonColumns(p, leftPlan, rightPlan, join.Tp, filter) + if err != nil { + return err + } + // We do not need to coalesce columns for update and delete. + if b.inUpdateStmt || b.inDeleteStmt { + p.setSchemaAndNames(expression.MergeSchema(p.Children()[0].Schema(), p.Children()[1].Schema()), + append(p.Children()[0].OutputNames(), p.Children()[1].OutputNames()...)) + } + return nil } // buildNaturalJoin builds natural join output schema. It finds out all the common columns @@ -727,7 +816,16 @@ func (b *PlanBuilder) buildUsingClause(p *LogicalJoin, leftPlan, rightPlan Logic // Every column in the first (left) table that is not a common column // Every column in the second (right) table that is not a common column func (b *PlanBuilder) buildNaturalJoin(p *LogicalJoin, leftPlan, rightPlan LogicalPlan, join *ast.Join) error { - return b.coalesceCommonColumns(p, leftPlan, rightPlan, join.Tp, nil) + err := b.coalesceCommonColumns(p, leftPlan, rightPlan, join.Tp, nil) + if err != nil { + return err + } + // We do not need to coalesce columns for update and delete. + if b.inUpdateStmt || b.inDeleteStmt { + p.setSchemaAndNames(expression.MergeSchema(p.Children()[0].Schema(), p.Children()[1].Schema()), + append(p.Children()[0].OutputNames(), p.Children()[1].OutputNames()...)) + } + return nil } // coalesceCommonColumns is used by buildUsingClause and buildNaturalJoin. The filter is used by buildUsingClause. @@ -746,9 +844,38 @@ func (b *PlanBuilder) coalesceCommonColumns(p *LogicalJoin, leftPlan, rightPlan lColumns, rColumns = rsc.Columns, lsc.Columns } + // Check using clause with ambiguous columns. + if filter != nil { + checkAmbiguous := func(names types.NameSlice) error { + columnNameInFilter := set.StringSet{} + for _, name := range names { + if _, ok := filter[name.ColName.L]; !ok { + continue + } + if columnNameInFilter.Exist(name.ColName.L) { + return ErrAmbiguous.GenWithStackByArgs(name.ColName.L, "from clause") + } + columnNameInFilter.Insert(name.ColName.L) + } + return nil + } + err := checkAmbiguous(lNames) + if err != nil { + return err + } + err = checkAmbiguous(rNames) + if err != nil { + return err + } + } + // Find out all the common columns and put them ahead. commonLen := 0 for i, lName := range lNames { + // Natural join should ignore _tidb_rowid + if lName.ColName.L == "_tidb_rowid" { + continue + } for j := commonLen; j < len(rNames); j++ { if lName.ColName.L != rNames[j].ColName.L { continue @@ -810,8 +937,19 @@ func (b *PlanBuilder) coalesceCommonColumns(p *LogicalJoin, leftPlan, rightPlan p.SetSchema(expression.NewSchema(schemaCols...)) p.names = names - p.redundantSchema = expression.MergeSchema(p.redundantSchema, expression.NewSchema(rColumns[:commonLen]...)) - p.redundantNames = append(p.redundantNames.Shallow(), rNames[:commonLen]...) + if joinTp == ast.RightJoin { + leftPlan, rightPlan = rightPlan, leftPlan + } + // We record the full `rightPlan.Schema` as `redundantSchema` in order to + // record the redundant column in `rightPlan` and the output columns order + // of the `rightPlan`. + // For SQL like `select t1.*, t2.* from t1 left join t2 using(a)`, we can + // retrieve the column order of `t2.*` from the `redundantSchema`. + p.redundantSchema = expression.MergeSchema(p.redundantSchema, expression.NewSchema(rightPlan.Schema().Clone().Columns...)) + p.redundantNames = append(p.redundantNames.Shallow(), rightPlan.OutputNames().Shallow()...) + if joinTp == ast.RightJoin || joinTp == ast.LeftJoin { + resetNotNullFlag(p.redundantSchema, 0, p.redundantSchema.Len()) + } p.OtherConditions = append(conds, p.OtherConditions...) return nil @@ -835,6 +973,10 @@ func (b *PlanBuilder) buildSelection(ctx context.Context, p LogicalPlan, where a if expr == nil { continue } + expressions = append(expressions, expr) + } + cnfExpres := make([]expression.Expression, 0) + for _, expr := range expressions { cnfItems := expression.SplitCNFItems(expr) for _, item := range cnfItems { if con, ok := item.(*expression.Constant); ok && con.DeferredExpr == nil && con.ParamMarker == nil { @@ -848,13 +990,13 @@ func (b *PlanBuilder) buildSelection(ctx context.Context, p LogicalPlan, where a dual.SetSchema(p.Schema()) return dual, nil } - expressions = append(expressions, item) + cnfExpres = append(cnfExpres, item) } } - if len(expressions) == 0 { + if len(cnfExpres) == 0 { return p, nil } - selection.Conditions = expressions + selection.Conditions = cnfExpres selection.SetChildren(p) return selection, nil } @@ -952,12 +1094,8 @@ func (b *PlanBuilder) buildProjectionField(ctx context.Context, p LogicalPlan, f idx := p.Schema().ColumnIndex(col) var name *types.FieldName // The column maybe the one from join's redundant part. - // TODO: Fully support USING/NATURAL JOIN, refactor here. if idx == -1 { - if join, ok := p.(*LogicalJoin); ok { - idx = join.redundantSchema.ColumnIndex(col) - name = join.redundantNames[idx] - } + name = findColFromNaturalUsingJoin(p, col) } else { name = p.OutputNames()[idx] } @@ -989,8 +1127,76 @@ func (b *PlanBuilder) buildProjectionField(ctx context.Context, p LogicalPlan, f return newCol, name, nil } +type userVarTypeProcessor struct { + ctx context.Context + plan LogicalPlan + builder *PlanBuilder + mapper map[*ast.AggregateFuncExpr]int + err error +} + +func (p *userVarTypeProcessor) Enter(in ast.Node) (ast.Node, bool) { + v, ok := in.(*ast.VariableExpr) + if !ok { + return in, false + } + if v.IsSystem || v.Value == nil { + return in, true + } + _, p.plan, p.err = p.builder.rewrite(p.ctx, v, p.plan, p.mapper, true) + return in, true +} + +func (p *userVarTypeProcessor) Leave(in ast.Node) (ast.Node, bool) { + return in, p.err == nil +} + +func (b *PlanBuilder) preprocessUserVarTypes(ctx context.Context, p LogicalPlan, fields []*ast.SelectField, mapper map[*ast.AggregateFuncExpr]int) error { + aggMapper := make(map[*ast.AggregateFuncExpr]int) + for agg, i := range mapper { + aggMapper[agg] = i + } + processor := userVarTypeProcessor{ + ctx: ctx, + plan: p, + builder: b, + mapper: aggMapper, + } + for _, field := range fields { + field.Expr.Accept(&processor) + if processor.err != nil { + return processor.err + } + } + return nil +} + +// findColFromNaturalUsingJoin is used to recursively find the column from the +// underlying natural-using-join. +// e.g. For SQL like `select t2.a from t1 join t2 using(a) where t2.a > 0`, the +// plan will be `join->selection->projection`. The schema of the `selection` +// will be `[t1.a]`, thus we need to recursively retrieve the `t2.a` from the +// underlying join. +func findColFromNaturalUsingJoin(p LogicalPlan, col *expression.Column) (name *types.FieldName) { + switch x := p.(type) { + case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: + return findColFromNaturalUsingJoin(p.Children()[0], col) + case *LogicalJoin: + if x.redundantSchema != nil { + idx := x.redundantSchema.ColumnIndex(col) + return x.redundantNames[idx] + } + } + return nil +} + // buildProjection returns a Projection plan and non-aux columns length. -func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields []*ast.SelectField, mapper map[*ast.AggregateFuncExpr]int, windowMapper map[*ast.WindowFuncExpr]int, considerWindow bool, expandGenerateColumn bool) (LogicalPlan, int, error) { +func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields []*ast.SelectField, mapper map[*ast.AggregateFuncExpr]int, + windowMapper map[*ast.WindowFuncExpr]int, considerWindow bool, expandGenerateColumn bool) (LogicalPlan, []expression.Expression, int, error) { + err := b.preprocessUserVarTypes(ctx, p, fields, mapper) + if err != nil { + return nil, nil, 0, err + } b.optFlag |= flagEliminateProjection b.curClause = fieldList proj := LogicalProjection{Exprs: make([]expression.Expression, 0, len(fields))}.Init(b.ctx, b.getSelectOffset()) @@ -1019,7 +1225,7 @@ func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields proj.Exprs = append(proj.Exprs, expr) col, name, err := b.buildProjectionField(ctx, p, field, expr) if err != nil { - return nil, 0, err + return nil, nil, 0, err } schema.Append(col) newNames = append(newNames, name) @@ -1027,7 +1233,7 @@ func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields } newExpr, np, err := b.rewriteWithPreprocess(ctx, field.Expr, p, mapper, windowMapper, true, nil) if err != nil { - return nil, 0, err + return nil, nil, 0, err } // For window functions in the order by clause, we will append an field for it. @@ -1043,7 +1249,7 @@ func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields col, name, err := b.buildProjectionField(ctx, p, field, newExpr) if err != nil { - return nil, 0, err + return nil, nil, 0, err } schema.Append(col) newNames = append(newNames, name) @@ -1070,7 +1276,7 @@ func (b *PlanBuilder) buildProjection(ctx context.Context, p LogicalPlan, fields } } proj.SetChildren(p) - return proj, oldLen, nil + return proj, proj.Exprs, oldLen, nil } func (b *PlanBuilder) buildDistinct(child LogicalPlan, length int) (*LogicalAggregation, error) { @@ -1083,7 +1289,6 @@ func (b *PlanBuilder) buildDistinct(child LogicalPlan, length int) (*LogicalAggr if hint := b.TableHints(); hint != nil { plan4Agg.aggHints = hint.aggHints } - plan4Agg.collectGroupByColumns() for _, col := range child.Schema().Columns { aggDesc, err := aggregation.NewAggFuncDesc(b.ctx, ast.AggFuncFirstRow, []expression.Expression{col}, false) if err != nil { @@ -1103,6 +1308,7 @@ func (b *PlanBuilder) buildDistinct(child LogicalPlan, length int) (*LogicalAggr } // unionJoinFieldType finds the type which can carry the given types in Union. +// Note that unionJoinFieldType doesn't handle charset and collation, caller need to handle it by itself. func unionJoinFieldType(a, b *types.FieldType) *types.FieldType { resultTp := types.NewFieldType(types.MergeFieldType(a.Tp, b.Tp)) // This logic will be intelligible when it is associated with the buildProjection4Union logic. @@ -1119,8 +1325,6 @@ func unionJoinFieldType(a, b *types.FieldType) *types.FieldType { if resultTp.EvalType() != types.ETInt && (a.EvalType() == types.ETInt || b.EvalType() == types.ETInt) && resultTp.Flen < mysql.MaxIntWidth { resultTp.Flen = mysql.MaxIntWidth } - resultTp.Charset = a.Charset - resultTp.Collate = a.Collate expression.SetBinFlagOrBinStr(b, resultTp) return resultTp } @@ -1131,11 +1335,15 @@ func (b *PlanBuilder) buildProjection4Union(ctx context.Context, u *LogicalUnion // Infer union result types by its children's schema. for i, col := range u.children[0].Schema().Columns { + tmpExprs := make([]expression.Expression, 0, len(u.Children())) + tmpExprs = append(tmpExprs, col) resultTp := col.RetType for j := 1; j < len(u.children); j++ { + tmpExprs = append(tmpExprs, u.children[j].Schema().Columns[i]) childTp := u.children[j].Schema().Columns[i].RetType resultTp = unionJoinFieldType(resultTp, childTp) } + resultTp.Charset, resultTp.Collate = expression.DeriveCollationFromExprs(b.ctx, tmpExprs...) names = append(names, &types.FieldName{ColName: u.children[0].OutputNames()[i].ColName}) unionCols = append(unionCols, &expression.Column{ RetType: resultTp, @@ -1429,6 +1637,11 @@ func (t *itemTransformer) Leave(inNode ast.Node) (ast.Node, bool) { } func (b *PlanBuilder) buildSort(ctx context.Context, p LogicalPlan, byItems []*ast.ByItem, aggMapper map[*ast.AggregateFuncExpr]int, windowMapper map[*ast.WindowFuncExpr]int) (*LogicalSort, error) { + return b.buildSortWithCheck(ctx, p, byItems, aggMapper, windowMapper, nil, 0, false) +} + +func (b *PlanBuilder) buildSortWithCheck(ctx context.Context, p LogicalPlan, byItems []*ast.ByItem, aggMapper map[*ast.AggregateFuncExpr]int, windowMapper map[*ast.WindowFuncExpr]int, + projExprs []expression.Expression, oldLen int, hasDistinct bool) (*LogicalSort, error) { if _, isUnion := p.(*LogicalUnionAll); isUnion { b.curClause = globalOrderByClause } else { @@ -1437,7 +1650,7 @@ func (b *PlanBuilder) buildSort(ctx context.Context, p LogicalPlan, byItems []*a sort := LogicalSort{}.Init(b.ctx, b.getSelectOffset()) exprs := make([]*util.ByItems, 0, len(byItems)) transformer := &itemTransformer{} - for _, item := range byItems { + for i, item := range byItems { newExpr, _ := item.Expr.Accept(transformer) item.Expr = newExpr.(ast.ExprNode) it, np, err := b.rewriteWithPreprocess(ctx, item.Expr, p, aggMapper, windowMapper, true, nil) @@ -1445,6 +1658,14 @@ func (b *PlanBuilder) buildSort(ctx context.Context, p LogicalPlan, byItems []*a return nil, err } + // check whether ORDER BY items show up in SELECT DISTINCT fields, see #12442 + if hasDistinct && projExprs != nil { + err = b.checkOrderByInDistinct(item, i, it, p, projExprs, oldLen) + if err != nil { + return nil, err + } + } + p = np exprs = append(exprs, &util.ByItems{Expr: it, Desc: item.Desc}) } @@ -1453,6 +1674,48 @@ func (b *PlanBuilder) buildSort(ctx context.Context, p LogicalPlan, byItems []*a return sort, nil } +// checkOrderByInDistinct checks whether ORDER BY has conflicts with DISTINCT, see #12442 +func (b *PlanBuilder) checkOrderByInDistinct(byItem *ast.ByItem, idx int, expr expression.Expression, p LogicalPlan, originalExprs []expression.Expression, length int) error { + // Check if expressions in ORDER BY whole match some fields in DISTINCT. + // e.g. + // select distinct count(a) from t group by b order by count(a); ✔ + // select distinct a+1 from t order by a+1; ✔ + // select distinct a+1 from t order by a+2; ✗ + for j := 0; j < length; j++ { + // both check original expression & as name + if expr.Equal(b.ctx, originalExprs[j]) || expr.Equal(b.ctx, p.Schema().Columns[j]) { + return nil + } + } + + // Check if referenced columns of expressions in ORDER BY whole match some fields in DISTINCT, + // both original expression and alias can be referenced. + // e.g. + // select distinct a from t order by sin(a); ✔ + // select distinct a, b from t order by a+b; ✔ + // select distinct count(a), sum(a) from t group by b order by sum(a); ✔ + cols := expression.ExtractColumns(expr) +CheckReferenced: + for _, col := range cols { + for j := 0; j < length; j++ { + if col.Equal(b.ctx, originalExprs[j]) || col.Equal(b.ctx, p.Schema().Columns[j]) { + continue CheckReferenced + } + } + + // Failed cases + // e.g. + // select distinct sin(a) from t order by a; ✗ + // select distinct a from t order by a+b; ✗ + if _, ok := byItem.Expr.(*ast.AggregateFuncExpr); ok { + return ErrAggregateInOrderNotSelect.GenWithStackByArgs(idx+1, "DISTINCT") + } + // select distinct count(a) from t group by b order by sum(a); ✗ + return ErrFieldInOrderNotSelect.GenWithStackByArgs(idx+1, col.OrigName, "DISTINCT") + } + return nil +} + // getUintFromNode gets uint64 value from ast.Node. // For ordinary statement, node should be uint64 constant value. // For prepared statement, node is string. We should convert it to uint64. @@ -1619,6 +1882,17 @@ type havingWindowAndOrderbyExprResolver struct { outerSchemas []*expression.Schema outerNames [][]*types.FieldName curClause clauseCode + prevClause []clauseCode +} + +func (a *havingWindowAndOrderbyExprResolver) pushCurClause(newClause clauseCode) { + a.prevClause = append(a.prevClause, a.curClause) + a.curClause = newClause +} + +func (a *havingWindowAndOrderbyExprResolver) popCurClause() { + a.curClause = a.prevClause[len(a.prevClause)-1] + a.prevClause = a.prevClause[:len(a.prevClause)-1] } // Enter implements Visitor interface. @@ -1635,6 +1909,12 @@ func (a *havingWindowAndOrderbyExprResolver) Enter(n ast.Node) (node ast.Node, s // Enter a new context, skip it. // For example: select sum(c) + c + exists(select c from t) from t; return n, true + case *ast.PartitionByClause: + a.pushCurClause(partitionByClause) + case *ast.OrderByClause: + if a.inWindowSpec { + a.pushCurClause(windowOrderByClause) + } default: a.inExpr = true } @@ -1646,14 +1926,30 @@ func (a *havingWindowAndOrderbyExprResolver) resolveFromPlan(v *ast.ColumnNameEx if err != nil { return -1, err } + schemaCols, outputNames := p.Schema().Columns, p.OutputNames() if idx < 0 { - return -1, nil + // For SQL like `select t2.a from t1 join t2 using(a) where t2.a > 0 + // order by t2.a`, the query plan will be `join->selection->sort`. The + // schema of selection will be `[t1.a]`, thus we need to recursively + // retrieve the `t2.a` from the underlying join. + switch x := p.(type) { + case *LogicalLimit, *LogicalSelection, *LogicalTopN, *LogicalSort, *LogicalMaxOneRow: + return a.resolveFromPlan(v, p.Children()[0]) + case *LogicalJoin: + if len(x.redundantNames) != 0 { + idx, err = expression.FindFieldName(x.redundantNames, v.Name) + schemaCols, outputNames = x.redundantSchema.Columns, x.redundantNames + } + } + if err != nil || idx < 0 { + return -1, err + } } - col := p.Schema().Columns[idx] + col := schemaCols[idx] if col.IsHidden { return -1, ErrUnknownColumn.GenWithStackByArgs(v.Name, clauseMsg[a.curClause]) } - name := p.OutputNames()[idx] + name := outputNames[idx] newColName := &ast.ColumnName{ Schema: name.DBName, Table: name.TblName, @@ -1699,6 +1995,12 @@ func (a *havingWindowAndOrderbyExprResolver) Leave(n ast.Node) (node ast.Node, o } case *ast.WindowSpec: a.inWindowSpec = false + case *ast.PartitionByClause: + a.popCurClause() + case *ast.OrderByClause: + if a.inWindowSpec { + a.popCurClause() + } case *ast.ColumnNameExpr: resolveFieldsFirst := true if a.inAggFunc || a.inWindowFunc || a.inWindowSpec || (a.curClause == orderByClause && a.inExpr) || a.curClause == fieldList { @@ -1736,9 +2038,10 @@ func (a *havingWindowAndOrderbyExprResolver) Leave(n ast.Node) (node ast.Node, o if index != -1 { // For SQLs like: // select a+1 from t having t.a; - newV := v - newV.Name = &ast.ColumnName{Name: v.Name.Name} - index, a.err = resolveFromSelectFields(newV, a.selectFields, true) + field := a.selectFields[index] + if field.Auxiliary { // having can't use auxiliary field + index = -1 + } } } else { index, a.err = resolveFromSelectFields(v, a.selectFields, true) @@ -1750,7 +2053,8 @@ func (a *havingWindowAndOrderbyExprResolver) Leave(n ast.Node) (node ast.Node, o var err error index, err = a.resolveFromPlan(v, a.p) _ = err - if index == -1 && a.curClause != fieldList { + if index == -1 && a.curClause != fieldList && + a.curClause != windowOrderByClause && a.curClause != partitionByClause { index, a.err = resolveFromSelectFields(v, a.selectFields, false) if index != -1 && a.curClause == havingClause && ast.HasWindowFlag(a.selectFields[index].Expr) { a.err = ErrWindowInvalidWindowFuncAliasUse.GenWithStackByArgs(v.Name.Name.O) @@ -1830,8 +2134,8 @@ func (b *PlanBuilder) resolveHavingAndOrderBy(sel *ast.SelectStmt, p LogicalPlan return havingAggMapper, extractor.aggMapper, nil } -func (b *PlanBuilder) extractAggFuncs(fields []*ast.SelectField) ([]*ast.AggregateFuncExpr, map[*ast.AggregateFuncExpr]int) { - extractor := &AggregateFuncExtractor{} +func (b *PlanBuilder) extractAggFuncsInSelectFields(fields []*ast.SelectField) ([]*ast.AggregateFuncExpr, map[*ast.AggregateFuncExpr]int) { + extractor := &AggregateFuncExtractor{skipAggMap: b.correlatedAggMapper} for _, f := range fields { n, _ := f.Expr.Accept(extractor) f.Expr = n.(ast.ExprNode) @@ -1845,6 +2149,38 @@ func (b *PlanBuilder) extractAggFuncs(fields []*ast.SelectField) ([]*ast.Aggrega return aggList, totalAggMapper } +func (b *PlanBuilder) extractAggFuncsInByItems(byItems []*ast.ByItem) []*ast.AggregateFuncExpr { + extractor := &AggregateFuncExtractor{skipAggMap: b.correlatedAggMapper} + for _, f := range byItems { + n, _ := f.Expr.Accept(extractor) + f.Expr = n.(ast.ExprNode) + } + return extractor.AggFuncs +} + +// extractCorrelatedAggFuncs extracts correlated aggregates which belong to outer query from aggregate function list. +func (b *PlanBuilder) extractCorrelatedAggFuncs(ctx context.Context, p LogicalPlan, aggFuncs []*ast.AggregateFuncExpr) (outer []*ast.AggregateFuncExpr, err error) { + corCols := make([]*expression.CorrelatedColumn, 0, len(aggFuncs)) + cols := make([]*expression.Column, 0, len(aggFuncs)) + aggMapper := make(map[*ast.AggregateFuncExpr]int) + for _, agg := range aggFuncs { + for _, arg := range agg.Args { + expr, _, err := b.rewrite(ctx, arg, p, aggMapper, true) + if err != nil { + return nil, err + } + corCols = append(corCols, expression.ExtractCorColumns(expr)...) + cols = append(cols, expression.ExtractColumns(expr)...) + } + if len(corCols) > 0 && len(cols) == 0 { + outer = append(outer, agg) + } + aggMapper[agg] = -1 + corCols, cols = corCols[:0], cols[:0] + } + return +} + // resolveWindowFunction will process window functions and resolve the columns that don't exist in select fields. func (b *PlanBuilder) resolveWindowFunction(sel *ast.SelectStmt, p LogicalPlan) ( map[*ast.AggregateFuncExpr]int, error) { @@ -1890,15 +2226,236 @@ func (b *PlanBuilder) resolveWindowFunction(sel *ast.SelectStmt, p LogicalPlan) return extractor.aggMapper, nil } +// correlatedAggregateResolver visits Expr tree. +// It finds and collects all correlated aggregates which should be evaluated in the outer query. +type correlatedAggregateResolver struct { + ctx context.Context + err error + b *PlanBuilder + outerPlan LogicalPlan + + // correlatedAggFuncs stores aggregate functions which belong to outer query + correlatedAggFuncs []*ast.AggregateFuncExpr +} + +// Enter implements Visitor interface. +func (r *correlatedAggregateResolver) Enter(n ast.Node) (ast.Node, bool) { + switch v := n.(type) { + case *ast.SelectStmt: + if r.outerPlan != nil { + outerSchema := r.outerPlan.Schema() + r.b.outerSchemas = append(r.b.outerSchemas, outerSchema) + r.b.outerNames = append(r.b.outerNames, r.outerPlan.OutputNames()) + } + r.err = r.resolveSelect(v) + return n, true + } + return n, false +} + +// resolveSelect finds and collects correlated aggregates within the SELECT stmt. +// It resolves and builds FROM clause first to get a source plan, from which we can decide +// whether a column is correlated or not. +// Then it collects correlated aggregate from SELECT fields (including sub-queries), HAVING, +// ORDER BY, WHERE & GROUP BY. +// Finally it restore the original SELECT stmt. +func (r *correlatedAggregateResolver) resolveSelect(sel *ast.SelectStmt) (err error) { + // collect correlated aggregate from sub-queries inside FROM clause. + useCache, err := r.collectFromTableRefs(r.ctx, sel.From) + if err != nil { + return err + } + // do not use cache when for update read + if isForUpdateReadSelectLock(sel.LockInfo) { + useCache = false + } + // we cannot use cache if there are correlated aggregates inside FROM clause, + // since the plan we are building now is not correct and need to be rebuild later. + p, err := r.b.buildTableRefs(r.ctx, sel.From, useCache) + if err != nil { + return err + } + + // similar to process in PlanBuilder.buildSelect + originalFields := sel.Fields.Fields + sel.Fields.Fields, err = r.b.unfoldWildStar(p, sel.Fields.Fields) + if err != nil { + return err + } + if r.b.capFlag&canExpandAST != 0 { + originalFields = sel.Fields.Fields + } + + hasWindowFuncField := r.b.detectSelectWindow(sel) + if hasWindowFuncField { + _, err = r.b.resolveWindowFunction(sel, p) + if err != nil { + return err + } + } + + _, _, err = r.b.resolveHavingAndOrderBy(sel, p) + if err != nil { + return err + } + + // find and collect correlated aggregates recursively in sub-queries + _, err = r.b.resolveCorrelatedAggregates(r.ctx, sel, p) + if err != nil { + return err + } + + // collect from SELECT fields, HAVING, ORDER BY and window functions + if r.b.detectSelectAgg(sel) { + err = r.collectFromSelectFields(p, sel.Fields.Fields) + if err != nil { + return err + } + } + + // collect from WHERE + err = r.collectFromWhere(p, sel.Where) + if err != nil { + return err + } + + // collect from GROUP BY + err = r.collectFromGroupBy(p, sel.GroupBy) + if err != nil { + return err + } + + // restore the sub-query + sel.Fields.Fields = originalFields + r.b.handleHelper.popMap() + return nil +} + +func (r *correlatedAggregateResolver) collectFromTableRefs(ctx context.Context, from *ast.TableRefsClause) (canCache bool, err error) { + if from == nil { + return true, nil + } + subResolver := &correlatedAggregateResolver{ + ctx: r.ctx, + b: r.b, + } + _, ok := from.TableRefs.Accept(subResolver) + if !ok { + return false, subResolver.err + } + if len(subResolver.correlatedAggFuncs) == 0 { + return true, nil + } + r.correlatedAggFuncs = append(r.correlatedAggFuncs, subResolver.correlatedAggFuncs...) + return false, nil +} + +func (r *correlatedAggregateResolver) collectFromSelectFields(p LogicalPlan, fields []*ast.SelectField) error { + aggList, _ := r.b.extractAggFuncsInSelectFields(fields) + r.b.curClause = fieldList + outerAggFuncs, err := r.b.extractCorrelatedAggFuncs(r.ctx, p, aggList) + if err != nil { + return nil + } + r.correlatedAggFuncs = append(r.correlatedAggFuncs, outerAggFuncs...) + return nil +} + +func (r *correlatedAggregateResolver) collectFromGroupBy(p LogicalPlan, groupBy *ast.GroupByClause) error { + if groupBy == nil { + return nil + } + aggList := r.b.extractAggFuncsInByItems(groupBy.Items) + r.b.curClause = groupByClause + outerAggFuncs, err := r.b.extractCorrelatedAggFuncs(r.ctx, p, aggList) + if err != nil { + return nil + } + r.correlatedAggFuncs = append(r.correlatedAggFuncs, outerAggFuncs...) + return nil +} + +func (r *correlatedAggregateResolver) collectFromWhere(p LogicalPlan, where ast.ExprNode) error { + if where == nil { + return nil + } + extractor := &AggregateFuncExtractor{skipAggMap: r.b.correlatedAggMapper} + _, _ = where.Accept(extractor) + r.b.curClause = whereClause + outerAggFuncs, err := r.b.extractCorrelatedAggFuncs(r.ctx, p, extractor.AggFuncs) + if err != nil { + return err + } + r.correlatedAggFuncs = append(r.correlatedAggFuncs, outerAggFuncs...) + return nil +} + +// Leave implements Visitor interface. +func (r *correlatedAggregateResolver) Leave(n ast.Node) (ast.Node, bool) { + switch n.(type) { + case *ast.SelectStmt: + if r.outerPlan != nil { + r.b.outerSchemas = r.b.outerSchemas[0 : len(r.b.outerSchemas)-1] + r.b.outerNames = r.b.outerNames[0 : len(r.b.outerNames)-1] + } + } + return n, r.err == nil +} + +// resolveCorrelatedAggregates finds and collects all correlated aggregates which should be evaluated +// in the outer query from all the sub-queries inside SELECT fields. +func (b *PlanBuilder) resolveCorrelatedAggregates(ctx context.Context, sel *ast.SelectStmt, p LogicalPlan) (map[*ast.AggregateFuncExpr]int, error) { + resolver := &correlatedAggregateResolver{ + ctx: ctx, + b: b, + outerPlan: p, + } + correlatedAggList := make([]*ast.AggregateFuncExpr, 0) + for _, field := range sel.Fields.Fields { + _, ok := field.Expr.Accept(resolver) + if !ok { + return nil, resolver.err + } + correlatedAggList = append(correlatedAggList, resolver.correlatedAggFuncs...) + } + if sel.Having != nil { + _, ok := sel.Having.Expr.Accept(resolver) + if !ok { + return nil, resolver.err + } + correlatedAggList = append(correlatedAggList, resolver.correlatedAggFuncs...) + } + if sel.OrderBy != nil { + for _, item := range sel.OrderBy.Items { + _, ok := item.Expr.Accept(resolver) + if !ok { + return nil, resolver.err + } + correlatedAggList = append(correlatedAggList, resolver.correlatedAggFuncs...) + } + } + correlatedAggMap := make(map[*ast.AggregateFuncExpr]int) + for _, aggFunc := range correlatedAggList { + correlatedAggMap[aggFunc] = len(sel.Fields.Fields) + sel.Fields.Fields = append(sel.Fields.Fields, &ast.SelectField{ + Auxiliary: true, + Expr: aggFunc, + AsName: model.NewCIStr(fmt.Sprintf("sel_subq_agg_%d", len(sel.Fields.Fields))), + }) + } + return correlatedAggMap, nil +} + // gbyResolver resolves group by items from select fields. type gbyResolver struct { - ctx sessionctx.Context - fields []*ast.SelectField - schema *expression.Schema - names []*types.FieldName - err error - inExpr bool - isParam bool + ctx sessionctx.Context + fields []*ast.SelectField + schema *expression.Schema + names []*types.FieldName + err error + inExpr bool + isParam bool + skipAggMap map[*ast.AggregateFuncExpr]*expression.CorrelatedColumn exprDepth int // exprDepth is the depth of current expression in expression tree. } @@ -1926,7 +2483,7 @@ func (g *gbyResolver) Enter(inNode ast.Node) (ast.Node, bool) { } func (g *gbyResolver) Leave(inNode ast.Node) (ast.Node, bool) { - extractor := &AggregateFuncExtractor{} + extractor := &AggregateFuncExtractor{skipAggMap: g.skipAggMap} switch v := inNode.(type) { case *ast.ColumnNameExpr: idx, err := expression.FindFieldName(g.names, v.Name) @@ -2001,57 +2558,69 @@ func tblInfoFromCol(from ast.ResultSetNode, name *types.FieldName) *model.TableI return nil } -func buildFuncDependCol(p LogicalPlan, cond ast.ExprNode) (*types.FieldName, *types.FieldName) { +func buildFuncDependCol(p LogicalPlan, cond ast.ExprNode) (*types.FieldName, *types.FieldName, error) { binOpExpr, ok := cond.(*ast.BinaryOperationExpr) if !ok { - return nil, nil + return nil, nil, nil } if binOpExpr.Op != opcode.EQ { - return nil, nil + return nil, nil, nil } lColExpr, ok := binOpExpr.L.(*ast.ColumnNameExpr) if !ok { - return nil, nil + return nil, nil, nil } rColExpr, ok := binOpExpr.R.(*ast.ColumnNameExpr) if !ok { - return nil, nil + return nil, nil, nil } lIdx, err := expression.FindFieldName(p.OutputNames(), lColExpr.Name) if err != nil { - return nil, nil + return nil, nil, err } rIdx, err := expression.FindFieldName(p.OutputNames(), rColExpr.Name) if err != nil { - return nil, nil + return nil, nil, err + } + if lIdx == -1 { + return nil, nil, ErrUnknownColumn.GenWithStackByArgs(lColExpr.Name, "where clause") + } + if rIdx == -1 { + return nil, nil, ErrUnknownColumn.GenWithStackByArgs(rColExpr.Name, "where clause") } - return p.OutputNames()[lIdx], p.OutputNames()[rIdx] + return p.OutputNames()[lIdx], p.OutputNames()[rIdx], nil } -func buildWhereFuncDepend(p LogicalPlan, where ast.ExprNode) map[*types.FieldName]*types.FieldName { +func buildWhereFuncDepend(p LogicalPlan, where ast.ExprNode) (map[*types.FieldName]*types.FieldName, error) { whereConditions := splitWhere(where) colDependMap := make(map[*types.FieldName]*types.FieldName, 2*len(whereConditions)) for _, cond := range whereConditions { - lCol, rCol := buildFuncDependCol(p, cond) + lCol, rCol, err := buildFuncDependCol(p, cond) + if err != nil { + return nil, err + } if lCol == nil || rCol == nil { continue } colDependMap[lCol] = rCol colDependMap[rCol] = lCol } - return colDependMap + return colDependMap, nil } -func buildJoinFuncDepend(p LogicalPlan, from ast.ResultSetNode) map[*types.FieldName]*types.FieldName { +func buildJoinFuncDepend(p LogicalPlan, from ast.ResultSetNode) (map[*types.FieldName]*types.FieldName, error) { switch x := from.(type) { case *ast.Join: if x.On == nil { - return nil + return nil, nil } onConditions := splitWhere(x.On.Expr) colDependMap := make(map[*types.FieldName]*types.FieldName, len(onConditions)) for _, cond := range onConditions { - lCol, rCol := buildFuncDependCol(p, cond) + lCol, rCol, err := buildFuncDependCol(p, cond) + if err != nil { + return nil, err + } if lCol == nil || rCol == nil { continue } @@ -2069,9 +2638,9 @@ func buildJoinFuncDepend(p LogicalPlan, from ast.ResultSetNode) map[*types.Field colDependMap[lCol] = rCol } } - return colDependMap + return colDependMap, nil default: - return nil + return nil, nil } } @@ -2079,7 +2648,7 @@ func checkColFuncDepend( p LogicalPlan, name *types.FieldName, tblInfo *model.TableInfo, - gbyColNames map[*types.FieldName]struct{}, + gbyOrSingleValueColNames map[*types.FieldName]struct{}, whereDependNames, joinDependNames map[*types.FieldName]*types.FieldName, ) bool { for _, index := range tblInfo.Indices { @@ -2104,16 +2673,16 @@ func checkColFuncDepend( break } iName := p.OutputNames()[iIdx] - if _, ok := gbyColNames[iName]; ok { + if _, ok := gbyOrSingleValueColNames[iName]; ok { continue } if wCol, ok := whereDependNames[iName]; ok { - if _, ok = gbyColNames[wCol]; ok { + if _, ok = gbyOrSingleValueColNames[wCol]; ok { continue } } if jCol, ok := joinDependNames[iName]; ok { - if _, ok = gbyColNames[jCol]; ok { + if _, ok = gbyOrSingleValueColNames[jCol]; ok { continue } } @@ -2142,16 +2711,16 @@ func checkColFuncDepend( break } pCol := p.OutputNames()[pIdx] - if _, ok := gbyColNames[pCol]; ok { + if _, ok := gbyOrSingleValueColNames[pCol]; ok { continue } if wCol, ok := whereDependNames[pCol]; ok { - if _, ok = gbyColNames[wCol]; ok { + if _, ok = gbyOrSingleValueColNames[wCol]; ok { continue } } if jCol, ok := joinDependNames[pCol]; ok { - if _, ok = gbyColNames[jCol]; ok { + if _, ok = gbyOrSingleValueColNames[jCol]; ok { continue } } @@ -2167,21 +2736,21 @@ type ErrExprLoc struct { Loc string } -func checkExprInGroupBy( +func checkExprInGroupByOrIsSingleValue( p LogicalPlan, expr ast.ExprNode, offset int, loc string, - gbyColNames map[*types.FieldName]struct{}, + gbyOrSingleValueColNames map[*types.FieldName]struct{}, gbyExprs []ast.ExprNode, - notInGbyColNames map[*types.FieldName]ErrExprLoc, + notInGbyOrSingleValueColNames map[*types.FieldName]ErrExprLoc, ) { if _, ok := expr.(*ast.AggregateFuncExpr); ok { return } if _, ok := expr.(*ast.ColumnNameExpr); !ok { for _, gbyExpr := range gbyExprs { - if reflect.DeepEqual(gbyExpr, expr) { + if ast.ExpressionDeepEqual(gbyExpr, expr) { return } } @@ -2196,8 +2765,8 @@ func checkExprInGroupBy( colMap := make(map[*types.FieldName]struct{}, len(p.Schema().Columns)) allColFromExprNode(p, expr, colMap) for col := range colMap { - if _, ok := gbyColNames[col]; !ok { - notInGbyColNames[col] = ErrExprLoc{Offset: offset, Loc: loc} + if _, ok := gbyOrSingleValueColNames[col]; !ok { + notInGbyOrSingleValueColNames[col] = ErrExprLoc{Offset: offset, Loc: loc} } } } @@ -2206,33 +2775,60 @@ func (b *PlanBuilder) checkOnlyFullGroupBy(p LogicalPlan, sel *ast.SelectStmt) ( if sel.GroupBy != nil { err = b.checkOnlyFullGroupByWithGroupClause(p, sel) } else { - err = b.checkOnlyFullGroupByWithOutGroupClause(p, sel.Fields.Fields) + err = b.checkOnlyFullGroupByWithOutGroupClause(p, sel) } return err } +func addGbyOrSingleValueColName(p LogicalPlan, colName *ast.ColumnName, gbyOrSingleValueColNames map[*types.FieldName]struct{}) { + idx, err := expression.FindFieldName(p.OutputNames(), colName) + if err != nil || idx < 0 { + return + } + gbyOrSingleValueColNames[p.OutputNames()[idx]] = struct{}{} +} + +func extractSingeValueColNamesFromWhere(p LogicalPlan, where ast.ExprNode, gbyOrSingleValueColNames map[*types.FieldName]struct{}) { + whereConditions := splitWhere(where) + for _, cond := range whereConditions { + binOpExpr, ok := cond.(*ast.BinaryOperationExpr) + if !ok || binOpExpr.Op != opcode.EQ { + continue + } + if colExpr, ok := binOpExpr.L.(*ast.ColumnNameExpr); ok { + if _, ok := binOpExpr.R.(ast.ValueExpr); ok { + addGbyOrSingleValueColName(p, colExpr.Name, gbyOrSingleValueColNames) + } + } else if colExpr, ok := binOpExpr.R.(*ast.ColumnNameExpr); ok { + if _, ok := binOpExpr.L.(ast.ValueExpr); ok { + addGbyOrSingleValueColName(p, colExpr.Name, gbyOrSingleValueColNames) + } + } + } +} + func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *ast.SelectStmt) error { - gbyColNames := make(map[*types.FieldName]struct{}, len(sel.Fields.Fields)) + gbyOrSingleValueColNames := make(map[*types.FieldName]struct{}, len(sel.Fields.Fields)) gbyExprs := make([]ast.ExprNode, 0, len(sel.Fields.Fields)) for _, byItem := range sel.GroupBy.Items { expr := getInnerFromParenthesesAndUnaryPlus(byItem.Expr) if colExpr, ok := expr.(*ast.ColumnNameExpr); ok { - idx, err := expression.FindFieldName(p.OutputNames(), colExpr.Name) - if err != nil || idx < 0 { - continue - } - gbyColNames[p.OutputNames()[idx]] = struct{}{} + addGbyOrSingleValueColName(p, colExpr.Name, gbyOrSingleValueColNames) } else { gbyExprs = append(gbyExprs, expr) } } + // MySQL permits a nonaggregate column not named in a GROUP BY clause when ONLY_FULL_GROUP_BY SQL mode is enabled, + // provided that this column is limited to a single value. + // See https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html for details. + extractSingeValueColNamesFromWhere(p, sel.Where, gbyOrSingleValueColNames) - notInGbyColNames := make(map[*types.FieldName]ErrExprLoc, len(sel.Fields.Fields)) + notInGbyOrSingleValueColNames := make(map[*types.FieldName]ErrExprLoc, len(sel.Fields.Fields)) for offset, field := range sel.Fields.Fields { if field.Auxiliary { continue } - checkExprInGroupBy(p, getInnerFromParenthesesAndUnaryPlus(field.Expr), offset, ErrExprInSelect, gbyColNames, gbyExprs, notInGbyColNames) + checkExprInGroupByOrIsSingleValue(p, getInnerFromParenthesesAndUnaryPlus(field.Expr), offset, ErrExprInSelect, gbyOrSingleValueColNames, gbyExprs, notInGbyOrSingleValueColNames) } if sel.OrderBy != nil { @@ -2247,17 +2843,23 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *as continue } } - checkExprInGroupBy(p, item.Expr, offset, ErrExprInOrderBy, gbyColNames, gbyExprs, notInGbyColNames) + checkExprInGroupByOrIsSingleValue(p, item.Expr, offset, ErrExprInOrderBy, gbyOrSingleValueColNames, gbyExprs, notInGbyOrSingleValueColNames) } } - if len(notInGbyColNames) == 0 { + if len(notInGbyOrSingleValueColNames) == 0 { return nil } - whereDepends := buildWhereFuncDepend(p, sel.Where) - joinDepends := buildJoinFuncDepend(p, sel.From.TableRefs) - tblMap := make(map[*model.TableInfo]struct{}, len(notInGbyColNames)) - for name, errExprLoc := range notInGbyColNames { + whereDepends, err := buildWhereFuncDepend(p, sel.Where) + if err != nil { + return err + } + joinDepends, err := buildJoinFuncDepend(p, sel.From.TableRefs) + if err != nil { + return err + } + tblMap := make(map[*model.TableInfo]struct{}, len(notInGbyOrSingleValueColNames)) + for name, errExprLoc := range notInGbyOrSingleValueColNames { tblInfo := tblInfoFromCol(sel.From.TableRefs, name) if tblInfo == nil { continue @@ -2265,7 +2867,7 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *as if _, ok := tblMap[tblInfo]; ok { continue } - if checkColFuncDepend(p, name, tblInfo, gbyColNames, whereDepends, joinDepends) { + if checkColFuncDepend(p, name, tblInfo, gbyOrSingleValueColNames, whereDepends, joinDepends) { tblMap[tblInfo] = struct{}{} continue } @@ -2280,15 +2882,67 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithGroupClause(p LogicalPlan, sel *as return nil } -func (b *PlanBuilder) checkOnlyFullGroupByWithOutGroupClause(p LogicalPlan, fields []*ast.SelectField) error { - resolver := colResolverForOnlyFullGroupBy{} - for idx, field := range fields { +func (b *PlanBuilder) checkOnlyFullGroupByWithOutGroupClause(p LogicalPlan, sel *ast.SelectStmt) error { + resolver := colResolverForOnlyFullGroupBy{ + firstOrderByAggColIdx: -1, + } + resolver.curClause = fieldList + for idx, field := range sel.Fields.Fields { resolver.exprIdx = idx field.Accept(&resolver) - err := resolver.Check() - if err != nil { - return err + } + if len(resolver.nonAggCols) > 0 { + if sel.Having != nil { + sel.Having.Expr.Accept(&resolver) + } + if sel.OrderBy != nil { + resolver.curClause = orderByClause + for idx, byItem := range sel.OrderBy.Items { + resolver.exprIdx = idx + byItem.Expr.Accept(&resolver) + } + } + } + if resolver.firstOrderByAggColIdx != -1 && len(resolver.nonAggCols) > 0 { + // SQL like `select a from t where a = 1 order by count(b)` is illegal. + return ErrAggregateOrderNonAggQuery.GenWithStackByArgs(resolver.firstOrderByAggColIdx + 1) + } + if !resolver.hasAggFuncOrAnyValue || len(resolver.nonAggCols) == 0 { + return nil + } + singleValueColNames := make(map[*types.FieldName]struct{}, len(sel.Fields.Fields)) + extractSingeValueColNamesFromWhere(p, sel.Where, singleValueColNames) + whereDepends, err := buildWhereFuncDepend(p, sel.Where) + if err != nil { + return err + } + + joinDepends, err := buildJoinFuncDepend(p, sel.From.TableRefs) + if err != nil { + return err + } + tblMap := make(map[*model.TableInfo]struct{}, len(resolver.nonAggCols)) + for i, colName := range resolver.nonAggCols { + idx, err := expression.FindFieldName(p.OutputNames(), colName) + if err != nil || idx < 0 { + return ErrMixOfGroupFuncAndFields.GenWithStackByArgs(resolver.nonAggColIdxs[i]+1, colName.Name.O) + } + fieldName := p.OutputNames()[idx] + if _, ok := singleValueColNames[fieldName]; ok { + continue + } + tblInfo := tblInfoFromCol(sel.From.TableRefs, fieldName) + if tblInfo == nil { + continue } + if _, ok := tblMap[tblInfo]; ok { + continue + } + if checkColFuncDepend(p, fieldName, tblInfo, singleValueColNames, whereDepends, joinDepends) { + tblMap[tblInfo] = struct{}{} + continue + } + return ErrMixOfGroupFuncAndFields.GenWithStackByArgs(resolver.nonAggColIdxs[i]+1, colName.Name.O) } return nil } @@ -2296,16 +2950,21 @@ func (b *PlanBuilder) checkOnlyFullGroupByWithOutGroupClause(p LogicalPlan, fiel // colResolverForOnlyFullGroupBy visits Expr tree to find out if an Expr tree is an aggregation function. // If so, find out the first column name that not in an aggregation function. type colResolverForOnlyFullGroupBy struct { - firstNonAggCol *ast.ColumnName - exprIdx int - firstNonAggColIdx int - hasAggFuncOrAnyValue bool + nonAggCols []*ast.ColumnName + exprIdx int + nonAggColIdxs []int + hasAggFuncOrAnyValue bool + firstOrderByAggColIdx int + curClause clauseCode } func (c *colResolverForOnlyFullGroupBy) Enter(node ast.Node) (ast.Node, bool) { switch t := node.(type) { case *ast.AggregateFuncExpr: c.hasAggFuncOrAnyValue = true + if c.curClause == orderByClause { + c.firstOrderByAggColIdx = c.exprIdx + } return node, true case *ast.FuncCallExpr: // enable function `any_value` in aggregation even `ONLY_FULL_GROUP_BY` is set @@ -2314,9 +2973,8 @@ func (c *colResolverForOnlyFullGroupBy) Enter(node ast.Node) (ast.Node, bool) { return node, true } case *ast.ColumnNameExpr: - if c.firstNonAggCol == nil { - c.firstNonAggCol, c.firstNonAggColIdx = t.Name, c.exprIdx - } + c.nonAggCols = append(c.nonAggCols, t.Name) + c.nonAggColIdxs = append(c.nonAggColIdxs, c.exprIdx) return node, true case *ast.SubqueryExpr: return node, true @@ -2328,13 +2986,6 @@ func (c *colResolverForOnlyFullGroupBy) Leave(node ast.Node) (ast.Node, bool) { return node, true } -func (c *colResolverForOnlyFullGroupBy) Check() error { - if c.hasAggFuncOrAnyValue && c.firstNonAggCol != nil { - return ErrMixOfGroupFuncAndFields.GenWithStackByArgs(c.firstNonAggColIdx+1, c.firstNonAggCol.Name.O) - } - return nil -} - type colNameResolver struct { p LogicalPlan names map[*types.FieldName]struct{} @@ -2371,10 +3022,11 @@ func (b *PlanBuilder) resolveGbyExprs(ctx context.Context, p LogicalPlan, gby *a b.curClause = groupByClause exprs := make([]expression.Expression, 0, len(gby.Items)) resolver := &gbyResolver{ - ctx: b.ctx, - fields: fields, - schema: p.Schema(), - names: p.OutputNames(), + ctx: b.ctx, + fields: fields, + schema: p.Schema(), + names: p.OutputNames(), + skipAggMap: b.correlatedAggMapper, } for _, item := range gby.Items { resolver.inExpr = false @@ -2401,6 +3053,7 @@ func (b *PlanBuilder) resolveGbyExprs(ctx context.Context, p LogicalPlan, gby *a } func (b *PlanBuilder) unfoldWildStar(p LogicalPlan, selectFields []*ast.SelectField) (resultList []*ast.SelectField, err error) { + join, isJoin := p.(*LogicalJoin) for i, field := range selectFields { if field.WildCard == nil { resultList = append(resultList, field) @@ -2409,37 +3062,50 @@ func (b *PlanBuilder) unfoldWildStar(p LogicalPlan, selectFields []*ast.SelectFi if field.WildCard.Table.L == "" && i > 0 { return nil, ErrInvalidWildCard } - dbName := field.WildCard.Schema - tblName := field.WildCard.Table - findTblNameInSchema := false - for i, name := range p.OutputNames() { - col := p.Schema().Columns[i] - if col.IsHidden { - continue - } - if (dbName.L == "" || dbName.L == name.DBName.L) && - (tblName.L == "" || tblName.L == name.TblName.L) && - col.ID != model.ExtraHandleID { - findTblNameInSchema = true - colName := &ast.ColumnNameExpr{ - Name: &ast.ColumnName{ - Schema: name.DBName, - Table: name.TblName, - Name: name.ColName, - }} - colName.SetType(col.GetType()) - field := &ast.SelectField{Expr: colName} - field.SetText(name.ColName.O) - resultList = append(resultList, field) + list := unfoldWildStar(field, p.OutputNames(), p.Schema().Columns) + // For sql like `select t1.*, t2.* from t1 join t2 using(a)`, we should + // not coalesce the `t2.a` in the output result. Thus we need to unfold + // the wildstar from the underlying join.redundantSchema. + if isJoin && join.redundantSchema != nil && field.WildCard.Table.L != "" { + redundantList := unfoldWildStar(field, join.redundantNames, join.redundantSchema.Columns) + if len(redundantList) > len(list) { + list = redundantList } } - if !findTblNameInSchema { - return nil, ErrBadTable.GenWithStackByArgs(tblName) + if len(list) == 0 { + return nil, ErrBadTable.GenWithStackByArgs(field.WildCard.Table) } + resultList = append(resultList, list...) } return resultList, nil } +func unfoldWildStar(field *ast.SelectField, outputName types.NameSlice, column []*expression.Column) (resultList []*ast.SelectField) { + dbName := field.WildCard.Schema + tblName := field.WildCard.Table + for i, name := range outputName { + col := column[i] + if col.IsHidden { + continue + } + if (dbName.L == "" || dbName.L == name.DBName.L) && + (tblName.L == "" || tblName.L == name.TblName.L) && + col.ID != model.ExtraHandleID { + colName := &ast.ColumnNameExpr{ + Name: &ast.ColumnName{ + Schema: name.DBName, + Table: name.TblName, + Name: name.ColName, + }} + colName.SetType(col.GetType()) + field := &ast.SelectField{Expr: colName} + field.SetText(name.ColName.O) + resultList = append(resultList, field) + } + } + return resultList +} + func (b *PlanBuilder) pushHintWithoutTableWarning(hint *ast.TableOptimizerHint) { var sb strings.Builder ctx := format.NewRestoreCtx(0, &sb) @@ -2450,8 +3116,8 @@ func (b *PlanBuilder) pushHintWithoutTableWarning(hint *ast.TableOptimizerHint) b.ctx.GetSessionVars().StmtCtx.AppendWarning(ErrInternal.GenWithStack(errMsg)) } -func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, nodeType utilhint.NodeType, currentLevel int) { - hints = b.hintProcessor.GetCurrentStmtHints(hints, nodeType, currentLevel) +func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, currentLevel int) { + hints = b.hintProcessor.GetCurrentStmtHints(hints, currentLevel) var ( sortMergeTables, INLJTables, INLHJTables, INLMJTables, hashJoinTables, BCTables, BCJPreferLocalTables []hintTableInfo indexHintList, indexMergeHintList []indexHintInfo @@ -2473,19 +3139,19 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, nodeType u switch hint.HintName.L { case TiDBMergeJoin, HintSMJ: - sortMergeTables = append(sortMergeTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + sortMergeTables = append(sortMergeTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case TiDBBroadCastJoin, HintBCJ: - BCTables = append(BCTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + BCTables = append(BCTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintBCJPreferLocal: - BCJPreferLocalTables = append(BCJPreferLocalTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + BCJPreferLocalTables = append(BCJPreferLocalTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case TiDBIndexNestedLoopJoin, HintINLJ: - INLJTables = append(INLJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + INLJTables = append(INLJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintINLHJ: - INLHJTables = append(INLHJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + INLHJTables = append(INLHJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintINLMJ: - INLMJTables = append(INLMJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + INLMJTables = append(INLMJTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case TiDBHashJoin, HintHJ: - hashJoinTables = append(hashJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + hashJoinTables = append(hashJoinTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintHashAgg: aggHints.preferAggType |= preferHashAgg case HintStreamAgg: @@ -2525,9 +3191,9 @@ func (b *PlanBuilder) pushTableHints(hints []*ast.TableOptimizerHint, nodeType u case HintReadFromStorage: switch hint.HintData.(model.CIStr).L { case HintTiFlash: - tiflashTables = append(tiflashTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + tiflashTables = append(tiflashTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) case HintTiKV: - tikvTables = append(tikvTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, nodeType, currentLevel)...) + tikvTables = append(tikvTables, tableNames2HintTableInfo(b.ctx, hint.HintName.L, hint.Tables, b.hintProcessor, currentLevel)...) } case HintIndexMerge: dbName := hint.Tables[0].DBName @@ -2639,7 +3305,7 @@ func (b *PlanBuilder) TableHints() *tableHintInfo { func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p LogicalPlan, err error) { b.pushSelectOffset(sel.QueryBlockOffset) - b.pushTableHints(sel.TableHints, utilhint.TypeSelect, sel.QueryBlockOffset) + b.pushTableHints(sel.TableHints, sel.QueryBlockOffset) defer func() { b.popSelectOffset() // table hints are only visible in the current SELECT statement. @@ -2660,16 +3326,22 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L aggFuncs []*ast.AggregateFuncExpr havingMap, orderMap, totalMap map[*ast.AggregateFuncExpr]int windowAggMap map[*ast.AggregateFuncExpr]int + correlatedAggMap map[*ast.AggregateFuncExpr]int gbyCols []expression.Expression + projExprs []expression.Expression ) - if sel.From != nil { - p, err = b.buildResultSetNode(ctx, sel.From.TableRefs) - if err != nil { - return nil, err - } - } else { - p = b.buildTableDual() + // set for update read to true before building result set node + if isForUpdateReadSelectLock(sel.LockInfo) { + b.isForUpdateRead = true + } + + // For sub-queries, the FROM clause may have already been built in outer query when resolving correlated aggregates. + // If the ResultSetNode inside FROM clause has nothing to do with correlated aggregates, we can simply get the + // existing ResultSetNode from the cache. + p, err = b.buildTableRefsWithCache(ctx, sel.From) + if err != nil { + return nil, err } originalFields := sel.Fields.Fields @@ -2696,7 +3368,10 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } hasWindowFuncField := b.detectSelectWindow(sel) - if hasWindowFuncField { + // Some SQL statements define WINDOW but do not use them. But we also need to check the window specification list. + // For example: select id from t group by id WINDOW w AS (ORDER BY uids DESC) ORDER BY id; + // We don't use the WINDOW w, but if the 'uids' column is not in the table t, we still need to report an error. + if hasWindowFuncField || sel.WindowSpecs != nil { windowAggMap, err = b.resolveWindowFunction(sel, p) if err != nil { return nil, err @@ -2710,6 +3385,15 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L return nil, err } + // We have to resolve correlated aggregate inside sub-queries before building aggregation and building projection, + // for instance, count(a) inside the sub-query of "select (select count(a)) from t" should be evaluated within + // the context of the outer query. So we have to extract such aggregates from sub-queries and put them into + // SELECT field list. + correlatedAggMap, err = b.resolveCorrelatedAggregates(ctx, sel, p) + if err != nil { + return nil, err + } + // b.allNames will be used in evalDefaultExpr(). Default function is special because it needs to find the // corresponding column name, but does not need the value in the column. // For example, select a from t order by default(b), the column b will not be in select fields. Also because @@ -2726,7 +3410,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } } if sel.LockInfo != nil && sel.LockInfo.LockType != ast.SelectLockNone { - if sel.LockInfo.LockType == ast.SelectLockInShareMode && !enableNoopFuncs { + if sel.LockInfo.LockType == ast.SelectLockForShare && !enableNoopFuncs { err = expression.ErrFunctionsNoopImpl.GenWithStackByArgs("LOCK IN SHARE MODE") return nil, err } @@ -2737,21 +3421,29 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L hasAgg := b.detectSelectAgg(sel) if hasAgg { - aggFuncs, totalMap = b.extractAggFuncs(sel.Fields.Fields) + aggFuncs, totalMap = b.extractAggFuncsInSelectFields(sel.Fields.Fields) + // len(aggFuncs) == 0 and sel.GroupBy == nil indicates that all the aggregate functions inside the SELECT fields + // are actually correlated aggregates from the outer query, which have already been built in the outer query. + // The only thing we need to do is to find them from b.correlatedAggMap in buildProjection. + if len(aggFuncs) == 0 && sel.GroupBy == nil { + hasAgg = false + } + } + if hasAgg { var aggIndexMap map[int]int - p, aggIndexMap, err = b.buildAggregation(ctx, p, aggFuncs, gbyCols) + p, aggIndexMap, err = b.buildAggregation(ctx, p, aggFuncs, gbyCols, correlatedAggMap) if err != nil { return nil, err } - for k, v := range totalMap { - totalMap[k] = aggIndexMap[v] + for agg, idx := range totalMap { + totalMap[agg] = aggIndexMap[idx] } } var oldLen int // According to https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html, // we can only process window functions after having clause, so `considerWindow` is false now. - p, oldLen, err = b.buildProjection(ctx, p, sel.Fields.Fields, totalMap, nil, false, sel.OrderBy != nil) + p, projExprs, oldLen, err = b.buildProjection(ctx, p, sel.Fields.Fields, totalMap, nil, false, sel.OrderBy != nil) if err != nil { return nil, err } @@ -2770,7 +3462,7 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } var windowMapper map[*ast.WindowFuncExpr]int - if hasWindowFuncField { + if hasWindowFuncField || sel.WindowSpecs != nil { windowFuncs := extractWindowFuncs(sel.Fields.Fields) // we need to check the func args first before we check the window spec err := b.checkWindowFuncArgs(ctx, p, windowFuncs, windowAggMap) @@ -2785,10 +3477,14 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L if err != nil { return nil, err } - // Now we build the window function fields. - p, oldLen, err = b.buildProjection(ctx, p, sel.Fields.Fields, windowAggMap, windowMapper, true, false) - if err != nil { - return nil, err + // `hasWindowFuncField == false` means there's only unused named window specs without window functions. + // In such case plan `p` is not changed, so we don't have to build another projection. + if hasWindowFuncField { + // Now we build the window function fields. + p, projExprs, oldLen, err = b.buildProjection(ctx, p, sel.Fields.Fields, windowAggMap, windowMapper, true, false) + if err != nil { + return nil, err + } } } @@ -2800,7 +3496,11 @@ func (b *PlanBuilder) buildSelect(ctx context.Context, sel *ast.SelectStmt) (p L } if sel.OrderBy != nil { - p, err = b.buildSort(ctx, p, sel.OrderBy.Items, orderMap, windowMapper) + if b.ctx.GetSessionVars().SQLMode.HasOnlyFullGroupBy() { + p, err = b.buildSortWithCheck(ctx, p, sel.OrderBy.Items, orderMap, windowMapper, projExprs, oldLen, sel.Distinct) + } else { + p, err = b.buildSort(ctx, p, sel.OrderBy.Items, orderMap, windowMapper) + } if err != nil { return nil, err } @@ -2843,6 +3543,11 @@ func (ds *DataSource) newExtraHandleSchemaCol() *expression.Column { } } +var ( + pseudoEstimationNotAvailable = metrics.PseudoEstimation.WithLabelValues("nodata") + pseudoEstimationOutdate = metrics.PseudoEstimation.WithLabelValues("outdate") +) + // getStatsTable gets statistics information for a table specified by "tableID". // A pseudo statistics table is returned in any of the following scenario: // 1. tidb-server started and statistics handle has not been initialized. @@ -2857,14 +3562,15 @@ func getStatsTable(ctx sessionctx.Context, tblInfo *model.TableInfo, pid int64) } var statsTbl *statistics.Table - if pid != tblInfo.ID { - statsTbl = statsHandle.GetPartitionStats(tblInfo, pid) - } else { + if pid == tblInfo.ID || ctx.GetSessionVars().UseDynamicPartitionPrune() { statsTbl = statsHandle.GetTableStats(tblInfo) + } else { + statsTbl = statsHandle.GetPartitionStats(tblInfo, pid) } // 2. table row count from statistics is zero. if statsTbl.Count == 0 { + pseudoEstimationNotAvailable.Inc() return statistics.PseudoTable(tblInfo) } @@ -2873,7 +3579,7 @@ func getStatsTable(ctx sessionctx.Context, tblInfo *model.TableInfo, pid int64) tbl := *statsTbl tbl.Pseudo = true statsTbl = &tbl - metrics.PseudoEstimation.Inc() + pseudoEstimationOutdate.Inc() } return statsTbl } @@ -2898,12 +3604,15 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, dbName.L, tableInfo.Name.L, "", authErr) if tbl.Type().IsVirtualTable() { + if tn.TableSample != nil { + return nil, expression.ErrInvalidTableSample.GenWithStackByArgs("Unsupported TABLESAMPLE in virtual tables") + } return b.buildMemTable(ctx, dbName, tableInfo) } if tableInfo.IsView() { - if b.capFlag&collectUnderlyingViewName != 0 { - b.underlyingViewNames.Insert(dbName.L + "." + tn.Name.L) + if tn.TableSample != nil { + return nil, expression.ErrInvalidTableSample.GenWithStackByArgs("Unsupported TABLESAMPLE in views") } return b.BuildDataSourceFromView(ctx, dbName, tableInfo) } @@ -2936,7 +3645,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as if tblName.L == "" { tblName = tn.Name } - possiblePaths, err := getPossibleAccessPaths(b.ctx, b.TableHints(), tn.IndexHints, tbl, dbName, tblName) + possiblePaths, err := getPossibleAccessPaths(b.ctx, b.TableHints(), tn.IndexHints, tbl, dbName, tblName, b.isForUpdateRead, b.is.SchemaMetaVersion()) if err != nil { return nil, err } @@ -2976,7 +3685,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as columns = tbl.Cols() } var statisticTable *statistics.Table - if _, ok := tbl.(table.PartitionedTable); !ok { + if _, ok := tbl.(table.PartitionedTable); !ok || b.ctx.GetSessionVars().UseDynamicPartitionPrune() { statisticTable = getStatsTable(b.ctx, tbl.Meta(), tbl.Meta().ID) } @@ -3033,6 +3742,8 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as partitionNames: tn.PartitionNames, TblCols: make([]*expression.Column, 0, len(columns)), preferPartitions: make(map[int][]model.CIStr), + is: b.is, + isForUpdateRead: b.isForUpdateRead, }.Init(b.ctx, b.getSelectOffset()) var handleCols HandleCols schema := expression.NewSchema(make([]*expression.Column, 0, len(columns))...) @@ -3050,7 +3761,7 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as newCol := &expression.Column{ UniqueID: sessionVars.AllocPlanColumnID(), ID: col.ID, - RetType: &col.FieldType, + RetType: col.FieldType.Clone(), OrigName: names[i].String(), IsHidden: col.Hidden, } @@ -3087,6 +3798,8 @@ func (b *PlanBuilder) buildDataSource(ctx context.Context, tn *ast.TableName, as ds.SetSchema(schema) ds.names = names ds.setPreferredStoreType(b.TableHints()) + ds.SampleInfo = NewTableSampleInfo(tn.TableSample, schema.Clone(), b.partitionedTable) + b.isSampling = ds.SampleInfo != nil // Init commonHandleCols and commonHandleLens for data source. if tableInfo.IsCommonHandle { @@ -3235,11 +3948,36 @@ func (b *PlanBuilder) buildMemTable(_ context.Context, dbName model.CIStr, table return p, nil } +// checkRecursiveView checks whether this view is recursively defined. +func (b *PlanBuilder) checkRecursiveView(dbName model.CIStr, tableName model.CIStr) (func(), error) { + viewFullName := dbName.L + "." + tableName.L + if b.buildingViewStack == nil { + b.buildingViewStack = set.NewStringSet() + } + // If this view has already been on the building stack, it means + // this view contains a recursive definition. + if b.buildingViewStack.Exist(viewFullName) { + return nil, ErrViewRecursive.GenWithStackByArgs(dbName.O, tableName.O) + } + // If the view is being renamed, we return the mysql compatible error message. + if b.capFlag&renameView != 0 && viewFullName == b.renamingViewName { + return nil, ErrNoSuchTable.GenWithStackByArgs(dbName.O, tableName.O) + } + b.buildingViewStack.Insert(viewFullName) + return func() { delete(b.buildingViewStack, viewFullName) }, nil +} + // BuildDataSourceFromView is used to build LogicalPlan from view func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model.CIStr, tableInfo *model.TableInfo) (LogicalPlan, error) { + deferFunc, err := b.checkRecursiveView(dbName, tableInfo.Name) + if err != nil { + return nil, err + } + defer deferFunc() + charset, collation := b.ctx.GetSessionVars().GetCharsetInfo() viewParser := parser.New() - viewParser.EnableWindowFunc(b.ctx.GetSessionVars().EnableWindowFunction) + viewParser.SetParserConfig(b.ctx.GetSessionVars().BuildParserConfig()) selectNode, err := viewParser.ParseOneStmt(tableInfo.View.SelectStmt, charset, collation) if err != nil { return nil, err @@ -3248,7 +3986,10 @@ func (b *PlanBuilder) BuildDataSourceFromView(ctx context.Context, dbName model. b.visitInfo = make([]visitInfo, 0) selectLogicalPlan, err := b.Build(ctx, selectNode) if err != nil { - err = ErrViewInvalid.GenWithStackByArgs(dbName.O, tableInfo.Name.O) + if terror.ErrorNotEqual(err, ErrViewRecursive) && + terror.ErrorNotEqual(err, ErrNoSuchTable) { + err = ErrViewInvalid.GenWithStackByArgs(dbName.O, tableInfo.Name.O) + } return nil, err } @@ -3509,7 +4250,7 @@ func buildColumns2Handle( func (b *PlanBuilder) buildUpdate(ctx context.Context, update *ast.UpdateStmt) (Plan, error) { b.pushSelectOffset(0) - b.pushTableHints(update.TableHints, utilhint.TypeUpdate, 0) + b.pushTableHints(update.TableHints, 0) defer func() { b.popSelectOffset() // table hints are only visible in the current UPDATE statement. @@ -3528,6 +4269,7 @@ func (b *PlanBuilder) buildUpdate(ctx context.Context, update *ast.UpdateStmt) ( } b.inUpdateStmt = true + b.isForUpdateRead = true p, err := b.buildResultSetNode(ctx, update.TableRefs.TableRefs) if err != nil { @@ -3601,6 +4343,7 @@ func (b *PlanBuilder) buildUpdate(ctx context.Context, update *ast.UpdateStmt) ( updt := Update{ OrderedList: orderedList, AllAssignmentsAreConstant: allAssignmentsAreConstant, + VirtualAssignmentsOffset: len(update.List), }.Init(b.ctx) updt.names = p.OutputNames() // We cannot apply projection elimination when building the subplan, because @@ -3642,18 +4385,45 @@ func GetUpdateColumns(ctx sessionctx.Context, orderedList []*expression.Assignme return assignFlag, nil } +type tblUpdateInfo struct { + name string + pkUpdated bool +} + func checkUpdateList(ctx sessionctx.Context, tblID2table map[int64]table.Table, updt *Update) error { assignFlags, err := GetUpdateColumns(ctx, updt.OrderedList, updt.SelectPlan.Schema().Len()) if err != nil { return err } + updateFromOtherAlias := make(map[int64]tblUpdateInfo) for _, content := range updt.TblColPosInfos { tbl := tblID2table[content.TblID] flags := assignFlags[content.Start:content.End] + var update, updatePK bool for i, col := range tbl.WritableCols() { if flags[i] && col.State != model.StatePublic { return ErrUnknownColumn.GenWithStackByArgs(col.Name, clauseMsg[fieldList]) } + if flags[i] { + update = true + if mysql.HasPriKeyFlag(col.Flag) { + updatePK = true + } + } + } + if update { + // Check for multi-updates on primary key, + // see https://dev.mysql.com/doc/mysql-errors/5.7/en/server-error-reference.html#error_er_multi_update_key_conflict + if otherTable, ok := updateFromOtherAlias[tbl.Meta().ID]; ok { + if otherTable.pkUpdated || updatePK { + return ErrMultiUpdateKeyConflict.GenWithStackByArgs(otherTable.name, updt.names[content.Start].TblName.O) + } + } else { + updateFromOtherAlias[tbl.Meta().ID] = tblUpdateInfo{ + name: updt.names[content.Start].TblName.O, + pkUpdated: updatePK, + } + } } } return nil @@ -3715,7 +4485,7 @@ func (b *PlanBuilder) buildUpdateLists( if !colInfo.IsGenerated() { continue } - columnFullName := fmt.Sprintf("%s.%s.%s", tn.Schema.L, tn.Name.L, colInfo.Name.L) + columnFullName := fmt.Sprintf("%s.%s.%s", tn.DBInfo.Name.L, tn.Name.L, colInfo.Name.L) isDefault, ok := modifyColumns[columnFullName] if ok && colInfo.Hidden { return nil, nil, false, ErrUnknownColumn.GenWithStackByArgs(colInfo.Name, clauseMsg[fieldList]) @@ -3740,6 +4510,7 @@ func (b *PlanBuilder) buildUpdateLists( } allAssignments := append(list, virtualAssignments...) + dependentColumnsModified := make(map[int64]bool) for i, assign := range allAssignments { var idx int var err error @@ -3765,6 +4536,10 @@ func (b *PlanBuilder) buildUpdateLists( expr.Name = assign.Column } newExpr, np, err = b.rewrite(ctx, assign.Expr, p, nil, false) + if err != nil { + return nil, nil, false, err + } + dependentColumnsModified[col.UniqueID] = true } else { // rewrite with generation expression rewritePreprocess := func(expr ast.Node) ast.Node { @@ -3780,9 +4555,22 @@ func (b *PlanBuilder) buildUpdateLists( } } newExpr, np, err = b.rewriteWithPreprocess(ctx, assign.Expr, p, nil, nil, false, rewritePreprocess) - } - if err != nil { - return nil, nil, false, err + if err != nil { + return nil, nil, false, err + } + // check if the column is modified + dependentColumns := expression.ExtractDependentColumns(newExpr) + var isModified bool + for _, col := range dependentColumns { + if dependentColumnsModified[col.UniqueID] { + isModified = true + break + } + } + // skip unmodified generated columns + if !isModified { + continue + } } if _, isConst := newExpr.(*expression.Constant); !isConst { allAssignmentsAreConstant = false @@ -3814,7 +4602,7 @@ func extractDefaultExpr(node ast.ExprNode) *ast.DefaultExpr { func (b *PlanBuilder) buildDelete(ctx context.Context, delete *ast.DeleteStmt) (Plan, error) { b.pushSelectOffset(0) - b.pushTableHints(delete.TableHints, utilhint.TypeDelete, 0) + b.pushTableHints(delete.TableHints, 0) defer func() { b.popSelectOffset() // table hints are only visible in the current DELETE statement. @@ -3822,6 +4610,7 @@ func (b *PlanBuilder) buildDelete(ctx context.Context, delete *ast.DeleteStmt) ( }() b.inDeleteStmt = true + b.isForUpdateRead = true p, err := b.buildResultSetNode(ctx, delete.TableRefs.TableRefs) if err != nil { @@ -3894,53 +4683,50 @@ func (b *PlanBuilder) buildDelete(ctx context.Context, delete *ast.DeleteStmt) ( return nil, err } - var tableList []*ast.TableName - tableList = extractTableList(delete.TableRefs.TableRefs, tableList, true) - // Collect visitInfo. if delete.Tables != nil { // Delete a, b from a, b, c, d... add a and b. + updatableList := make(map[string]bool) + tbInfoList := make(map[string]*ast.TableName) + collectTableName(delete.TableRefs.TableRefs, &updatableList, &tbInfoList) for _, tn := range delete.Tables.Tables { - foundMatch := false - for _, v := range tableList { - dbName := v.Schema.L - if dbName == "" { - dbName = b.ctx.GetSessionVars().CurrentDB - } - if (tn.Schema.L == "" || tn.Schema.L == dbName) && tn.Name.L == v.Name.L { - tn.Schema.L = dbName - tn.DBInfo = v.DBInfo - tn.TableInfo = v.TableInfo - foundMatch = true - break - } + var canUpdate, foundMatch = false, false + name := tn.Name.L + if tn.Schema.L == "" { + canUpdate, foundMatch = updatableList[name] } + if !foundMatch { - var asNameList []string - asNameList = extractTableSourceAsNames(delete.TableRefs.TableRefs, asNameList, false) - for _, asName := range asNameList { - tblName := tn.Name.L - if tn.Schema.L != "" { - tblName = tn.Schema.L + "." + tblName - } - if asName == tblName { - // check sql like: `delete a from (select * from t) as a, t` - return nil, ErrNonUpdatableTable.GenWithStackByArgs(tn.Name.O, "DELETE") - } + if tn.Schema.L == "" { + name = model.NewCIStr(b.ctx.GetSessionVars().CurrentDB).L + "." + tn.Name.L + } else { + name = tn.Schema.L + "." + tn.Name.L } - // check sql like: `delete b from (select * from t) as a, t` + canUpdate, foundMatch = updatableList[name] + } + // check sql like: `delete b from (select * from t) as a, t` + if !foundMatch { return nil, ErrUnknownTable.GenWithStackByArgs(tn.Name.O, "MULTI DELETE") } + // check sql like: `delete a from (select * from t) as a, t` + if !canUpdate { + return nil, ErrNonUpdatableTable.GenWithStackByArgs(tn.Name.O, "DELETE") + } + tb := tbInfoList[name] + tn.DBInfo = tb.DBInfo + tn.TableInfo = tb.TableInfo if tn.TableInfo.IsView() { return nil, errors.Errorf("delete view %s is not supported now.", tn.Name.O) } if tn.TableInfo.IsSequence() { return nil, errors.Errorf("delete sequence %s is not supported now.", tn.Name.O) } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DeletePriv, tn.Schema.L, tn.TableInfo.Name.L, "", nil) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DeletePriv, tb.DBInfo.Name.L, tb.Name.L, "", nil) } } else { // Delete from a, b, c, d. + var tableList []*ast.TableName + tableList = extractTableList(delete.TableRefs.TableRefs, tableList, false) for _, v := range tableList { if v.TableInfo.IsView() { return nil, errors.Errorf("delete view %s is not supported now.", v.Name.O) @@ -4024,7 +4810,7 @@ func (p *Delete) cleanTblID2HandleMap( // matchingDeletingTable checks whether this column is from the table which is in the deleting list. func (p *Delete) matchingDeletingTable(names []*ast.TableName, name *types.FieldName) bool { for _, n := range names { - if (name.DBName.L == "" || name.DBName.L == n.Schema.L) && name.TblName.L == n.Name.L { + if (name.DBName.L == "" || name.DBName.L == n.DBInfo.Name.L) && name.TblName.L == n.Name.L { return true } } @@ -4040,7 +4826,7 @@ func getWindowName(name string) string { // buildProjectionForWindow builds the projection for expressions in the window specification that is not an column, // so after the projection, window functions only needs to deal with columns. -func (b *PlanBuilder) buildProjectionForWindow(ctx context.Context, p LogicalPlan, spec *ast.WindowSpec, args []ast.ExprNode, aggMap map[*ast.AggregateFuncExpr]int) (LogicalPlan, []property.Item, []property.Item, []expression.Expression, error) { +func (b *PlanBuilder) buildProjectionForWindow(ctx context.Context, p LogicalPlan, spec *ast.WindowSpec, args []ast.ExprNode, aggMap map[*ast.AggregateFuncExpr]int) (LogicalPlan, []property.SortItem, []property.SortItem, []expression.Expression, error) { b.optFlag |= flagEliminateProjection var partitionItems, orderItems []*ast.ByItem @@ -4061,7 +4847,7 @@ func (b *PlanBuilder) buildProjectionForWindow(ctx context.Context, p LogicalPla } copy(proj.names, p.OutputNames()) - propertyItems := make([]property.Item, 0, len(partitionItems)+len(orderItems)) + propertyItems := make([]property.SortItem, 0, len(partitionItems)+len(orderItems)) var err error p, propertyItems, err = b.buildByItemsForWindow(ctx, p, proj, partitionItems, propertyItems, aggMap) if err != nil { @@ -4132,9 +4918,9 @@ func (b *PlanBuilder) buildByItemsForWindow( p LogicalPlan, proj *LogicalProjection, items []*ast.ByItem, - retItems []property.Item, + retItems []property.SortItem, aggMap map[*ast.AggregateFuncExpr]int, -) (LogicalPlan, []property.Item, error) { +) (LogicalPlan, []property.SortItem, error) { transformer := &itemTransformer{} for _, item := range items { newExpr, _ := item.Expr.Accept(transformer) @@ -4148,7 +4934,7 @@ func (b *PlanBuilder) buildByItemsForWindow( continue } if col, ok := it.(*expression.Column); ok { - retItems = append(retItems, property.Item{Col: col, Desc: item.Desc}) + retItems = append(retItems, property.SortItem{Col: col, Desc: item.Desc}) continue } proj.Exprs = append(proj.Exprs, it) @@ -4158,7 +4944,7 @@ func (b *PlanBuilder) buildByItemsForWindow( RetType: it.GetType(), } proj.schema.Append(col) - retItems = append(retItems, property.Item{Col: col, Desc: item.Desc}) + retItems = append(retItems, property.SortItem{Col: col, Desc: item.Desc}) } return p, retItems, nil } @@ -4166,7 +4952,7 @@ func (b *PlanBuilder) buildByItemsForWindow( // buildWindowFunctionFrameBound builds the bounds of window function frames. // For type `Rows`, the bound expr must be an unsigned integer. // For type `Range`, the bound expr must be temporal or numeric types. -func (b *PlanBuilder) buildWindowFunctionFrameBound(ctx context.Context, spec *ast.WindowSpec, orderByItems []property.Item, boundClause *ast.FrameBound) (*FrameBound, error) { +func (b *PlanBuilder) buildWindowFunctionFrameBound(ctx context.Context, spec *ast.WindowSpec, orderByItems []property.SortItem, boundClause *ast.FrameBound) (*FrameBound, error) { frameType := spec.Frame.Type bound := &FrameBound{Type: boundClause.Type, UnBounded: boundClause.UnBounded} if bound.UnBounded { @@ -4276,7 +5062,7 @@ func (pc *paramMarkerInPrepareChecker) Leave(in ast.Node) (out ast.Node, ok bool // buildWindowFunctionFrame builds the window function frames. // See https://dev.mysql.com/doc/refman/8.0/en/window-functions-frames.html -func (b *PlanBuilder) buildWindowFunctionFrame(ctx context.Context, spec *ast.WindowSpec, orderByItems []property.Item) (*WindowFrame, error) { +func (b *PlanBuilder) buildWindowFunctionFrame(ctx context.Context, spec *ast.WindowSpec, orderByItems []property.SortItem) (*WindowFrame, error) { frameClause := spec.Frame if frameClause == nil { return nil, nil @@ -4382,7 +5168,16 @@ func (b *PlanBuilder) buildWindowFunctions(ctx context.Context, p LogicalPlan, g if err != nil { return nil, nil, err } - err = b.checkOriginWindowSpecs(funcs, orderBy) + if len(funcs) == 0 { + // len(funcs) == 0 indicates this an unused named window spec, + // so we just check for its validity and don't have to build plan for it. + err := b.checkOriginWindowSpec(spec, orderBy) + if err != nil { + return nil, nil, err + } + continue + } + err = b.checkOriginWindowFuncs(funcs, orderBy) if err != nil { return nil, nil, err } @@ -4427,9 +5222,9 @@ func (b *PlanBuilder) buildWindowFunctions(ctx context.Context, p LogicalPlan, g return p, windowMap, nil } -// checkOriginWindowSpecs checks the validation for origin window specifications for a group of functions. -// Because of the grouped specification is different from it, we should especially check them before build window frame. -func (b *PlanBuilder) checkOriginWindowSpecs(funcs []*ast.WindowFuncExpr, orderByItems []property.Item) error { +// checkOriginWindowFuncs checks the validity for original window specifications for a group of functions. +// Because the grouped specification is different from them, we should especially check them before build window frame. +func (b *PlanBuilder) checkOriginWindowFuncs(funcs []*ast.WindowFuncExpr, orderByItems []property.SortItem) error { for _, f := range funcs { if f.IgnoreNull { return ErrNotSupportedYet.GenWithStackByArgs("IGNORE NULLS") @@ -4444,39 +5239,47 @@ func (b *PlanBuilder) checkOriginWindowSpecs(funcs []*ast.WindowFuncExpr, orderB if f.Spec.Name.L != "" { spec = b.windowSpecs[f.Spec.Name.L] } - if spec.Frame == nil { - continue - } - if spec.Frame.Type == ast.Groups { - return ErrNotSupportedYet.GenWithStackByArgs("GROUPS") - } - start, end := spec.Frame.Extent.Start, spec.Frame.Extent.End - if start.Type == ast.Following && start.UnBounded { - return ErrWindowFrameStartIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) - } - if end.Type == ast.Preceding && end.UnBounded { - return ErrWindowFrameEndIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) - } - if start.Type == ast.Following && (end.Type == ast.Preceding || end.Type == ast.CurrentRow) { - return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) - } - if (start.Type == ast.Following || start.Type == ast.CurrentRow) && end.Type == ast.Preceding { - return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) - } - - err := b.checkOriginWindowFrameBound(&start, spec, orderByItems) - if err != nil { - return err - } - err = b.checkOriginWindowFrameBound(&end, spec, orderByItems) - if err != nil { + if err := b.checkOriginWindowSpec(spec, orderByItems); err != nil { return err } } return nil } -func (b *PlanBuilder) checkOriginWindowFrameBound(bound *ast.FrameBound, spec *ast.WindowSpec, orderByItems []property.Item) error { +// checkOriginWindowSpec checks the validity for given window specification. +func (b *PlanBuilder) checkOriginWindowSpec(spec *ast.WindowSpec, orderByItems []property.SortItem) error { + if spec.Frame == nil { + return nil + } + if spec.Frame.Type == ast.Groups { + return ErrNotSupportedYet.GenWithStackByArgs("GROUPS") + } + start, end := spec.Frame.Extent.Start, spec.Frame.Extent.End + if start.Type == ast.Following && start.UnBounded { + return ErrWindowFrameStartIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) + } + if end.Type == ast.Preceding && end.UnBounded { + return ErrWindowFrameEndIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) + } + if start.Type == ast.Following && (end.Type == ast.Preceding || end.Type == ast.CurrentRow) { + return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) + } + if (start.Type == ast.Following || start.Type == ast.CurrentRow) && end.Type == ast.Preceding { + return ErrWindowFrameIllegal.GenWithStackByArgs(getWindowName(spec.Name.O)) + } + + err := b.checkOriginWindowFrameBound(&start, spec, orderByItems) + if err != nil { + return err + } + err = b.checkOriginWindowFrameBound(&end, spec, orderByItems) + if err != nil { + return err + } + return nil +} + +func (b *PlanBuilder) checkOriginWindowFrameBound(bound *ast.FrameBound, spec *ast.WindowSpec, orderByItems []property.SortItem) error { if bound.Type == ast.CurrentRow || bound.UnBounded { return nil } @@ -4595,6 +5398,15 @@ func (b *PlanBuilder) groupWindowFuncs(windowFuncs []*ast.WindowFuncExpr) (map[* groupedWindow[updatedSpec] = append(groupedWindow[updatedSpec], windowFunc) } } + // Unused window specs should also be checked in b.buildWindowFunctions, + // so we add them to `groupedWindow` with empty window functions. + for _, spec := range b.windowSpecs { + if _, ok := groupedWindow[spec]; !ok { + if _, ok = updatedSpecMap[spec.Name.L]; !ok { + groupedWindow[spec] = nil + } + } + } return groupedWindow, nil } @@ -4680,6 +5492,25 @@ func extractTableList(node ast.ResultSetNode, input []*ast.TableName, asName boo return input } +func collectTableName(node ast.ResultSetNode, updatableName *map[string]bool, info *map[string]*ast.TableName) { + switch x := node.(type) { + case *ast.Join: + collectTableName(x.Left, updatableName, info) + collectTableName(x.Right, updatableName, info) + case *ast.TableSource: + name := x.AsName.L + var canUpdate bool + var s *ast.TableName + if s, canUpdate = x.Source.(*ast.TableName); canUpdate { + if name == "" { + name = s.Schema.L + "." + s.Name.L + } + (*info)[name] = s + } + (*updatableName)[name] = canUpdate + } +} + // extractTableSourceAsNames extracts TableSource.AsNames from node. // if onlySelectStmt is set to be true, only extracts AsNames when TableSource.Source.(type) == *ast.SelectStmt func extractTableSourceAsNames(node ast.ResultSetNode, input []string, onlySelectStmt bool) []string { diff --git a/planner/core/logical_plan_test.go b/planner/core/logical_plan_test.go index 704af732ea96d..d350477bddfb1 100644 --- a/planner/core/logical_plan_test.go +++ b/planner/core/logical_plan_test.go @@ -61,7 +61,7 @@ func (s *testPlanSuite) SetUpSuite(c *C) { s.ctx = MockContext() s.ctx.GetSessionVars().EnableWindowFunction = true s.Parser = parser.New() - s.Parser.EnableWindowFunc(true) + s.Parser.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) var err error s.testData, err = testutil.LoadTestSuiteData("testdata", "plan_suite_unexported") @@ -538,7 +538,7 @@ func (s *testPlanSuite) TestColumnPruning(c *C) { ctx := context.Background() for i, tt := range input { - comment := Commentf("for %s", tt) + comment := Commentf("case:%v sql:\"%s\"", i, tt) stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) @@ -612,26 +612,13 @@ func (s *testPlanSuite) TestAllocID(c *C) { } func (s *testPlanSuite) checkDataSourceCols(p LogicalPlan, c *C, ans map[int][]string, comment CommentInterface) { - switch p.(type) { - case *DataSource: + switch v := p.(type) { + case *DataSource, *LogicalUnionAll, *LogicalLimit: s.testData.OnRecord(func() { ans[p.ID()] = make([]string, p.Schema().Len()) }) colList, ok := ans[p.ID()] - c.Assert(ok, IsTrue, Commentf("For %v DataSource ID %d Not found", comment, p.ID())) - c.Assert(len(p.Schema().Columns), Equals, len(colList), comment) - for i, col := range p.Schema().Columns { - s.testData.OnRecord(func() { - colList[i] = col.String() - }) - c.Assert(col.String(), Equals, colList[i], comment) - } - case *LogicalUnionAll: - s.testData.OnRecord(func() { - ans[p.ID()] = make([]string, p.Schema().Len()) - }) - colList, ok := ans[p.ID()] - c.Assert(ok, IsTrue, Commentf("For %v UnionAll ID %d Not found", comment, p.ID())) + c.Assert(ok, IsTrue, Commentf("For %s %T ID %d Not found", comment.CheckCommentString(), v, p.ID())) c.Assert(len(p.Schema().Columns), Equals, len(colList), comment) for i, col := range p.Schema().Columns { s.testData.OnRecord(func() { @@ -804,6 +791,10 @@ func (s *testPlanSuite) TestValidate(c *C) { sql: "select a + 1 from t having a", err: ErrUnknownColumn, }, + { // issue (#20509) + sql: "select * from t left join t2 on t.a=t2.a having not (t.a <=> t2.a)", + err: nil, + }, { sql: "select a from t having sum(avg(a))", err: ErrInvalidGroupFuncUse, @@ -936,145 +927,145 @@ func (s *testPlanSuite) TestVisitInfo(c *C) { { sql: "insert into t (a) values (1)", ans: []visitInfo{ - {mysql.InsertPriv, "test", "t", "", nil}, + {mysql.InsertPriv, "test", "t", "", nil, false}, }, }, { sql: "delete from t where a = 1", ans: []visitInfo{ - {mysql.DeletePriv, "test", "t", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.DeletePriv, "test", "t", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "delete from a1 using t as a1 inner join t as a2 where a1.a = a2.a", ans: []visitInfo{ - {mysql.DeletePriv, "test", "t", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.DeletePriv, "test", "t", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "update t set a = 7 where a = 1", ans: []visitInfo{ - {mysql.UpdatePriv, "test", "t", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.UpdatePriv, "test", "t", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "update t, (select * from t) a1 set t.a = a1.a;", ans: []visitInfo{ - {mysql.UpdatePriv, "test", "t", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.UpdatePriv, "test", "t", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "update t a1 set a1.a = a1.a + 1", ans: []visitInfo{ - {mysql.UpdatePriv, "test", "t", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.UpdatePriv, "test", "t", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "select a, sum(e) from t group by a", ans: []visitInfo{ - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "truncate table t", ans: []visitInfo{ - {mysql.DropPriv, "test", "t", "", nil}, + {mysql.DropPriv, "test", "t", "", nil, false}, }, }, { sql: "drop table t", ans: []visitInfo{ - {mysql.DropPriv, "test", "t", "", nil}, + {mysql.DropPriv, "test", "t", "", nil, false}, }, }, { sql: "create table t (a int)", ans: []visitInfo{ - {mysql.CreatePriv, "test", "t", "", nil}, + {mysql.CreatePriv, "test", "t", "", nil, false}, }, }, { sql: "create table t1 like t", ans: []visitInfo{ - {mysql.CreatePriv, "test", "t1", "", nil}, - {mysql.SelectPriv, "test", "t", "", nil}, + {mysql.CreatePriv, "test", "t1", "", nil, false}, + {mysql.SelectPriv, "test", "t", "", nil, false}, }, }, { sql: "create database test", ans: []visitInfo{ - {mysql.CreatePriv, "test", "", "", nil}, + {mysql.CreatePriv, "test", "", "", nil, false}, }, }, { sql: "drop database test", ans: []visitInfo{ - {mysql.DropPriv, "test", "", "", nil}, + {mysql.DropPriv, "test", "", "", nil, false}, }, }, { sql: "create index t_1 on t (a)", ans: []visitInfo{ - {mysql.IndexPriv, "test", "t", "", nil}, + {mysql.IndexPriv, "test", "t", "", nil, false}, }, }, { sql: "drop index e on t", ans: []visitInfo{ - {mysql.IndexPriv, "test", "t", "", nil}, + {mysql.IndexPriv, "test", "t", "", nil, false}, }, }, { sql: `grant all privileges on test.* to 'test'@'%'`, ans: []visitInfo{ - {mysql.SelectPriv, "test", "", "", nil}, - {mysql.InsertPriv, "test", "", "", nil}, - {mysql.UpdatePriv, "test", "", "", nil}, - {mysql.DeletePriv, "test", "", "", nil}, - {mysql.CreatePriv, "test", "", "", nil}, - {mysql.DropPriv, "test", "", "", nil}, - {mysql.GrantPriv, "test", "", "", nil}, - {mysql.AlterPriv, "test", "", "", nil}, - {mysql.ExecutePriv, "test", "", "", nil}, - {mysql.IndexPriv, "test", "", "", nil}, - {mysql.CreateViewPriv, "test", "", "", nil}, - {mysql.ShowViewPriv, "test", "", "", nil}, + {mysql.SelectPriv, "test", "", "", nil, false}, + {mysql.InsertPriv, "test", "", "", nil, false}, + {mysql.UpdatePriv, "test", "", "", nil, false}, + {mysql.DeletePriv, "test", "", "", nil, false}, + {mysql.CreatePriv, "test", "", "", nil, false}, + {mysql.DropPriv, "test", "", "", nil, false}, + {mysql.GrantPriv, "test", "", "", nil, false}, + {mysql.AlterPriv, "test", "", "", nil, false}, + {mysql.ExecutePriv, "test", "", "", nil, false}, + {mysql.IndexPriv, "test", "", "", nil, false}, + {mysql.CreateViewPriv, "test", "", "", nil, false}, + {mysql.ShowViewPriv, "test", "", "", nil, false}, }, }, { sql: `grant select on test.ttt to 'test'@'%'`, ans: []visitInfo{ - {mysql.SelectPriv, "test", "ttt", "", nil}, - {mysql.GrantPriv, "test", "ttt", "", nil}, + {mysql.SelectPriv, "test", "ttt", "", nil, false}, + {mysql.GrantPriv, "test", "ttt", "", nil, false}, }, }, { sql: `grant select on ttt to 'test'@'%'`, ans: []visitInfo{ - {mysql.SelectPriv, "test", "ttt", "", nil}, - {mysql.GrantPriv, "test", "ttt", "", nil}, + {mysql.SelectPriv, "test", "ttt", "", nil, false}, + {mysql.GrantPriv, "test", "ttt", "", nil, false}, }, }, { sql: `revoke all privileges on test.* from 'test'@'%'`, ans: []visitInfo{ - {mysql.SelectPriv, "test", "", "", nil}, - {mysql.InsertPriv, "test", "", "", nil}, - {mysql.UpdatePriv, "test", "", "", nil}, - {mysql.DeletePriv, "test", "", "", nil}, - {mysql.CreatePriv, "test", "", "", nil}, - {mysql.DropPriv, "test", "", "", nil}, - {mysql.GrantPriv, "test", "", "", nil}, - {mysql.AlterPriv, "test", "", "", nil}, - {mysql.ExecutePriv, "test", "", "", nil}, - {mysql.IndexPriv, "test", "", "", nil}, - {mysql.CreateViewPriv, "test", "", "", nil}, - {mysql.ShowViewPriv, "test", "", "", nil}, + {mysql.SelectPriv, "test", "", "", nil, false}, + {mysql.InsertPriv, "test", "", "", nil, false}, + {mysql.UpdatePriv, "test", "", "", nil, false}, + {mysql.DeletePriv, "test", "", "", nil, false}, + {mysql.CreatePriv, "test", "", "", nil, false}, + {mysql.DropPriv, "test", "", "", nil, false}, + {mysql.GrantPriv, "test", "", "", nil, false}, + {mysql.AlterPriv, "test", "", "", nil, false}, + {mysql.ExecutePriv, "test", "", "", nil, false}, + {mysql.IndexPriv, "test", "", "", nil, false}, + {mysql.CreateViewPriv, "test", "", "", nil, false}, + {mysql.ShowViewPriv, "test", "", "", nil, false}, }, }, { @@ -1084,44 +1075,44 @@ func (s *testPlanSuite) TestVisitInfo(c *C) { { sql: `show create table test.ttt`, ans: []visitInfo{ - {mysql.AllPrivMask, "test", "ttt", "", nil}, + {mysql.AllPrivMask, "test", "ttt", "", nil, false}, }, }, { sql: "alter table t add column a int(4)", ans: []visitInfo{ - {mysql.AlterPriv, "test", "t", "", nil}, + {mysql.AlterPriv, "test", "t", "", nil, false}, }, }, { sql: "rename table t_old to t_new", ans: []visitInfo{ - {mysql.AlterPriv, "test", "t_old", "", nil}, - {mysql.DropPriv, "test", "t_old", "", nil}, - {mysql.CreatePriv, "test", "t_new", "", nil}, - {mysql.InsertPriv, "test", "t_new", "", nil}, + {mysql.AlterPriv, "test", "t_old", "", nil, false}, + {mysql.DropPriv, "test", "t_old", "", nil, false}, + {mysql.CreatePriv, "test", "t_new", "", nil, false}, + {mysql.InsertPriv, "test", "t_new", "", nil, false}, }, }, { sql: "alter table t_old rename to t_new", ans: []visitInfo{ - {mysql.AlterPriv, "test", "t_old", "", nil}, - {mysql.DropPriv, "test", "t_old", "", nil}, - {mysql.CreatePriv, "test", "t_new", "", nil}, - {mysql.InsertPriv, "test", "t_new", "", nil}, + {mysql.AlterPriv, "test", "t_old", "", nil, false}, + {mysql.DropPriv, "test", "t_old", "", nil, false}, + {mysql.CreatePriv, "test", "t_new", "", nil, false}, + {mysql.InsertPriv, "test", "t_new", "", nil, false}, }, }, { sql: "alter table t drop partition p0;", ans: []visitInfo{ - {mysql.AlterPriv, "test", "t", "", nil}, - {mysql.DropPriv, "test", "t", "", nil}, + {mysql.AlterPriv, "test", "t", "", nil, false}, + {mysql.DropPriv, "test", "t", "", nil, false}, }, }, { sql: "flush privileges", ans: []visitInfo{ - {mysql.ReloadPriv, "", "", "", ErrSpecificAccessDenied}, + {mysql.ReloadPriv, "", "", "", ErrSpecificAccessDenied, false}, }, }, } @@ -1131,7 +1122,7 @@ func (s *testPlanSuite) TestVisitInfo(c *C) { stmt, err := s.ParseOneStmt(tt.sql, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) builder.ctx.GetSessionVars().SetHashJoinConcurrency(1) _, err = builder.Build(context.TODO(), stmt) c.Assert(err, IsNil, comment) @@ -1211,7 +1202,7 @@ func (s *testPlanSuite) TestUnion(c *C) { stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) plan, err := builder.Build(ctx, stmt) s.testData.OnRecord(func() { output[i].Err = err != nil @@ -1243,7 +1234,7 @@ func (s *testPlanSuite) TestTopNPushDown(c *C) { stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1317,7 +1308,7 @@ func (s *testPlanSuite) TestOuterJoinEliminator(c *C) { stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1353,7 +1344,7 @@ func (s *testPlanSuite) TestSelectView(c *C) { stmt, err := s.ParseOneStmt(tt.sql, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1434,7 +1425,7 @@ func (s *testPlanSuite) optimize(ctx context.Context, sql string) (PhysicalPlan, return nil, nil, err } } - builder := NewPlanBuilder(sctx, s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(sctx, s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) if err != nil { return nil, nil, err @@ -1450,7 +1441,7 @@ func (s *testPlanSuite) optimize(ctx context.Context, sql string) (PhysicalPlan, func byItemsToProperty(byItems []*util.ByItems) *property.PhysicalProperty { pp := &property.PhysicalProperty{} for _, item := range byItems { - pp.Items = append(pp.Items, property.Item{Col: item.Expr.(*expression.Column), Desc: item.Desc}) + pp.SortItems = append(pp.SortItems, property.SortItem{Col: item.Expr.(*expression.Column), Desc: item.Desc}) } return pp } @@ -1516,7 +1507,7 @@ func (s *testPlanSuite) TestSkylinePruning(c *C) { stmt, err := s.ParseOneStmt(tt.sql, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) if err != nil { c.Assert(err.Error(), Equals, tt.result, comment) @@ -1581,6 +1572,7 @@ func (s *testPlanSuite) TestFastPlanContextTables(c *C) { false, }, } + s.ctx.GetSessionVars().SnapshotInfoschema = s.is for _, tt := range tests { stmt, err := s.ParseOneStmt(tt.sql, "", "") c.Assert(err, IsNil) @@ -1616,7 +1608,7 @@ func (s *testPlanSuite) TestUpdateEQCond(c *C) { stmt, err := s.ParseOneStmt(tt.sql, "", "") c.Assert(err, IsNil, comment) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1632,7 +1624,7 @@ func (s *testPlanSuite) TestConflictedJoinTypeHints(c *C) { stmt, err := s.ParseOneStmt(sql, "", "") c.Assert(err, IsNil) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1652,7 +1644,7 @@ func (s *testPlanSuite) TestSimplyOuterJoinWithOnlyOuterExpr(c *C) { stmt, err := s.ParseOneStmt(sql, "", "") c.Assert(err, IsNil) Preprocess(s.ctx, stmt, s.is) - builder := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), s.is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) p, err = logicalOptimize(ctx, builder.optFlag, p.(LogicalPlan)) @@ -1664,3 +1656,92 @@ func (s *testPlanSuite) TestSimplyOuterJoinWithOnlyOuterExpr(c *C) { // previous wrong JoinType is InnerJoin c.Assert(join.JoinType, Equals, RightOuterJoin) } + +func (s *testPlanSuite) TestResolvingCorrelatedAggregate(c *C) { + defer testleak.AfterTest(c)() + tests := []struct { + sql string + best string + }{ + { + sql: "select (select count(a)) from t", + best: "Apply{DataScan(t)->Aggr(count(test.t.a))->Dual->Projection->MaxOneRow}->Projection", + }, + { + sql: "select (select count(n.a) from t) from t n", + best: "Apply{DataScan(n)->Aggr(count(test.t.a))->DataScan(t)->Projection->MaxOneRow}->Projection", + }, + { + sql: "select (select sum(count(a))) from t", + best: "Apply{DataScan(t)->Aggr(count(test.t.a))->Dual->Aggr(sum(Column#13))->MaxOneRow}->Projection", + }, + { + sql: "select (select sum(count(n.a)) from t) from t n", + best: "Apply{DataScan(n)->Aggr(count(test.t.a))->DataScan(t)->Aggr(sum(Column#25))->MaxOneRow}->Projection", + }, + { + sql: "select (select cnt from (select count(a) as cnt) n) from t", + best: "Apply{DataScan(t)->Aggr(count(test.t.a))->Dual->Projection->MaxOneRow}->Projection", + }, + { + sql: "select sum(a), sum(a), count(a), (select count(a)) from t", + best: "Apply{DataScan(t)->Aggr(sum(test.t.a),count(test.t.a))->Dual->Projection->MaxOneRow}->Projection", + }, + } + + ctx := context.TODO() + for i, tt := range tests { + comment := Commentf("case:%v sql:%s", i, tt.sql) + stmt, err := s.ParseOneStmt(tt.sql, "", "") + c.Assert(err, IsNil, comment) + err = Preprocess(s.ctx, stmt, s.is) + c.Assert(err, IsNil, comment) + p, _, err := BuildLogicalPlan(ctx, s.ctx, stmt, s.is) + c.Assert(err, IsNil, comment) + p, err = logicalOptimize(context.TODO(), flagBuildKeyInfo|flagEliminateProjection|flagPrunColumns|flagPrunColumnsAgain, p.(LogicalPlan)) + c.Assert(err, IsNil, comment) + c.Assert(ToString(p), Equals, tt.best, comment) + } +} + +func (s *testPlanSuite) TestFastPathInvalidBatchPointGet(c *C) { + // #22040 + defer testleak.AfterTest(c)() + tt := []struct { + sql string + fastPlan bool + }{ + { + // column count doesn't match, not use idx + sql: "select * from t where (a,b) in ((1,2),1)", + fastPlan: false, + }, + { + // column count doesn't match, not use idx + sql: "select * from t where (a,b) in (1,2)", + fastPlan: false, + }, + { + // column count doesn't match, use idx + sql: "select * from t where (f,g) in ((1,2),1)", + fastPlan: false, + }, + { + // column count doesn't match, use idx + sql: "select * from t where (f,g) in (1,2)", + fastPlan: false, + }, + } + for i, tc := range tt { + comment := Commentf("case:%v sql:%s", i, tc.sql) + stmt, err := s.ParseOneStmt(tc.sql, "", "") + c.Assert(err, IsNil, comment) + c.Assert(Preprocess(s.ctx, stmt, s.is), IsNil, comment) + plan := TryFastPlan(s.ctx, stmt) + if tc.fastPlan { + c.Assert(plan, NotNil) + } else { + c.Assert(plan, IsNil) + } + } +} diff --git a/planner/core/logical_plans.go b/planner/core/logical_plans.go index 83e74590d6c70..e16d57fd399b8 100644 --- a/planner/core/logical_plans.go +++ b/planner/core/logical_plans.go @@ -22,6 +22,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/statistics" @@ -144,7 +145,7 @@ type LogicalJoin struct { DefaultValues []types.Datum // redundantSchema contains columns which are eliminated in join. - // For select * from a join b using (c); a.c will in output schema, and b.c will in redundantSchema. + // For select * from a join b using (c); a.c will in output schema, and b.c will only in redundantSchema. redundantSchema *expression.Schema redundantNames types.NameSlice @@ -307,14 +308,16 @@ type LogicalAggregation struct { AggFuncs []*aggregation.AggFuncDesc GroupByItems []expression.Expression - // groupByCols stores the columns that are group-by items. - groupByCols []*expression.Column // aggHints stores aggregation hint information. aggHints aggHintInfo possibleProperties [][]*expression.Column inputCount float64 // inputCount is the input count of this plan. + + // noCopPushDown indicates if planner must not push this agg down to coprocessor. + // It is true when the agg is in the outer child tree of apply. + noCopPushDown bool } // HasDistinct shows whether LogicalAggregation has functions with distinct. @@ -349,14 +352,16 @@ func (la *LogicalAggregation) IsCompleteModeAgg() bool { return la.AggFuncs[0].Mode == aggregation.CompleteMode } -// GetGroupByCols returns the groupByCols. If the groupByCols haven't be collected, -// this method would collect them at first. If the GroupByItems have been changed, -// we should explicitly collect GroupByColumns before this method. +// GetGroupByCols returns the columns that are group-by items. +// For example, `group by a, b, c+d` will return [a, b]. func (la *LogicalAggregation) GetGroupByCols() []*expression.Column { - if la.groupByCols == nil { - la.collectGroupByColumns() + groupByCols := make([]*expression.Column, 0, len(la.GroupByItems)) + for _, item := range la.GroupByItems { + if col, ok := item.(*expression.Column); ok { + groupByCols = append(groupByCols, col) + } } - return la.groupByCols + return groupByCols } // ExtractCorrelatedCols implements LogicalPlan interface. @@ -500,7 +505,7 @@ type DataSource struct { // handleCol represents the handle column for the datasource, either the // int primary key column or extra handle column. - //handleCol *expression.Column + // handleCol *expression.Column handleCols HandleCols // TblCols contains the original columns of table before being pruned, and it // is used for estimating table scan cost. @@ -515,6 +520,12 @@ type DataSource struct { preferStoreType int // preferPartitions store the map, the key represents store type, the value represents the partition name list. preferPartitions map[int][]model.CIStr + SampleInfo *TableSampleInfo + is infoschema.InfoSchema + // isForUpdateRead should be true in either of the following situations + // 1. use `inside insert`, `update`, `delete` or `select for update` statement + // 2. isolation level is RC + isForUpdateRead bool } // ExtractCorrelatedCols implements LogicalPlan interface. @@ -575,8 +586,8 @@ func (p *LogicalIndexScan) MatchIndexProp(prop *property.PhysicalProperty) (matc return false } for i, col := range p.IdxCols { - if col.Equal(nil, prop.Items[0].Col) { - return matchIndicesProp(p.IdxCols[i:], p.IdxColLens[i:], prop.Items) + if col.Equal(nil, prop.SortItems[0].Col) { + return matchIndicesProp(p.IdxCols[i:], p.IdxColLens[i:], prop.SortItems) } else if i >= p.EqCondCount { break } @@ -1007,7 +1018,7 @@ func (lt *LogicalTopN) isLimit() bool { // LogicalLimit represents offset and limit plan. type LogicalLimit struct { - baseLogicalPlan + logicalSchemaProducer Offset uint64 Count uint64 @@ -1048,8 +1059,8 @@ type LogicalWindow struct { logicalSchemaProducer WindowFuncDescs []*aggregation.WindowFuncDesc - PartitionBy []property.Item - OrderBy []property.Item + PartitionBy []property.SortItem + OrderBy []property.SortItem Frame *WindowFrame } diff --git a/planner/core/memtable_predicate_extractor.go b/planner/core/memtable_predicate_extractor.go index 6dece6b36f9a7..870875c311a7c 100644 --- a/planner/core/memtable_predicate_extractor.go +++ b/planner/core/memtable_predicate_extractor.go @@ -24,12 +24,18 @@ import ( "time" "github.com/cznic/mathutil" + "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tidb/util/set" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tipb/go-tipb" @@ -936,12 +942,18 @@ type SlowQueryExtractor struct { extractHelper SkipRequest bool - StartTime time.Time - EndTime time.Time + TimeRanges []*TimeRange // Enable is true means the executor should use the time range to locate the slow-log file that need to be parsed. // Enable is false, means the executor should keep the behavior compatible with before, which is only parse the // current slow-log file. Enable bool + Desc bool +} + +// TimeRange is used to check whether a given log should be extracted. +type TimeRange struct { + StartTime time.Time + EndTime time.Time } // Extract implements the MemTablePredicateExtractor Extract interface @@ -953,7 +965,7 @@ func (e *SlowQueryExtractor) Extract( ) []expression.Expression { remained, startTime, endTime := e.extractTimeRange(ctx, schema, names, predicates, "time", ctx.GetSessionVars().StmtCtx.TimeZone) e.setTimeRange(startTime, endTime) - e.SkipRequest = e.Enable && e.StartTime.After(e.EndTime) + e.SkipRequest = e.Enable && e.TimeRanges[0].StartTime.After(e.TimeRanges[0].EndTime) if e.SkipRequest { return nil } @@ -978,10 +990,63 @@ func (e *SlowQueryExtractor) setTimeRange(start, end int64) { if end == 0 { endTime = startTime.Add(defaultSlowQueryDuration) } - e.StartTime, e.EndTime = startTime, endTime + timeRange := &TimeRange{ + StartTime: startTime, + EndTime: endTime, + } + e.TimeRanges = append(e.TimeRanges, timeRange) e.Enable = true } +func (e *SlowQueryExtractor) buildTimeRangeFromKeyRange(keyRanges []*coprocessor.KeyRange) error { + for _, kr := range keyRanges { + startTime, err := e.decodeBytesToTime(kr.Start) + if err != nil { + return err + } + endTime, err := e.decodeBytesToTime(kr.End) + if err != nil { + return err + } + e.setTimeRange(startTime, endTime) + } + return nil +} + +func (e *SlowQueryExtractor) decodeBytesToTime(bs []byte) (int64, error) { + if len(bs) >= tablecodec.RecordRowKeyLen { + t, err := tablecodec.DecodeRowKey(bs) + if err != nil { + return 0, nil + } + return e.decodeToTime(t) + } + return 0, nil +} + +func (e *SlowQueryExtractor) decodeToTime(handle kv.Handle) (int64, error) { + tp := types.NewFieldType(mysql.TypeDatetime) + col := rowcodec.ColInfo{ID: 0, Ft: tp} + chk := chunk.NewChunkWithCapacity([]*types.FieldType{tp}, 1) + coder := codec.NewDecoder(chk, nil) + _, err := coder.DecodeOne(handle.EncodedCol(0), 0, col.Ft) + if err != nil { + return 0, err + } + datum := chk.GetRow(0).GetDatum(0, tp) + mysqlTime := (&datum).GetMysqlTime() + timestampInNano := time.Date(mysqlTime.Year(), + time.Month(mysqlTime.Month()), + mysqlTime.Day(), + mysqlTime.Hour(), + mysqlTime.Minute(), + mysqlTime.Second(), + mysqlTime.Microsecond()*1000, + time.UTC, + ).UnixNano() + return timestampInNano, err +} + // TableStorageStatsExtractor is used to extract some predicates of `disk_usage`. type TableStorageStatsExtractor struct { extractHelper @@ -1040,8 +1105,8 @@ func (e *SlowQueryExtractor) explainInfo(p *PhysicalMemTable) string { if !e.Enable { return fmt.Sprintf("only search in the current '%v' file", p.ctx.GetSessionVars().SlowQueryFile) } - startTime := e.StartTime.In(p.ctx.GetSessionVars().StmtCtx.TimeZone) - endTime := e.EndTime.In(p.ctx.GetSessionVars().StmtCtx.TimeZone) + startTime := e.TimeRanges[0].StartTime.In(p.ctx.GetSessionVars().StmtCtx.TimeZone) + endTime := e.TimeRanges[0].EndTime.In(p.ctx.GetSessionVars().StmtCtx.TimeZone) return fmt.Sprintf("start_time:%v, end_time:%v", types.NewTime(types.FromGoTime(startTime), mysql.TypeDatetime, types.MaxFsp).String(), types.NewTime(types.FromGoTime(endTime), mysql.TypeDatetime, types.MaxFsp).String()) diff --git a/planner/core/memtable_predicate_extractor_test.go b/planner/core/memtable_predicate_extractor_test.go index 48d59d047476f..dc36934d4dc1b 100644 --- a/planner/core/memtable_predicate_extractor_test.go +++ b/planner/core/memtable_predicate_extractor_test.go @@ -62,7 +62,7 @@ func (s *extractorSuite) getLogicalMemTable(c *C, se session.Session, parser *pa c.Assert(err, IsNil) ctx := context.Background() - builder := plannercore.NewPlanBuilder(se, s.dom.InfoSchema(), &hint.BlockHintProcessor{}) + builder, _ := plannercore.NewPlanBuilder(se, s.dom.InfoSchema(), &hint.BlockHintProcessor{}) plan, err := builder.Build(ctx, stmt) c.Assert(err, IsNil) diff --git a/planner/core/mock.go b/planner/core/mock.go index ba7c1145ccc38..8eee3c8647b68 100644 --- a/planner/core/mock.go +++ b/planner/core/mock.go @@ -14,6 +14,8 @@ package core import ( + "fmt" + "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -370,7 +372,9 @@ func MockContext() sessionctx.Context { } ctx.GetSessionVars().CurrentDB = "test" do := &domain.Domain{} - do.CreateStatsHandle(ctx) + if err := do.CreateStatsHandle(ctx); err != nil { + panic(fmt.Sprintf("create mock context panic: %+v", err)) + } domain.BindDomain(ctx, do) return ctx } diff --git a/planner/core/optimizer.go b/planner/core/optimizer.go index a6f59f95a9745..a81b0f3896d18 100644 --- a/planner/core/optimizer.go +++ b/planner/core/optimizer.go @@ -83,7 +83,7 @@ type logicalOptRule interface { func BuildLogicalPlan(ctx context.Context, sctx sessionctx.Context, node ast.Node, is infoschema.InfoSchema) (Plan, types.NameSlice, error) { sctx.GetSessionVars().PlanID = 0 sctx.GetSessionVars().PlanColumnID = 0 - builder := NewPlanBuilder(sctx, is, &utilhint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(sctx, is, &utilhint.BlockHintProcessor{}) p, err := builder.Build(ctx, node) if err != nil { return nil, nil, err @@ -111,7 +111,7 @@ func CheckTableLock(ctx sessionctx.Context, is infoschema.InfoSchema, vs []visit } checker := lock.NewChecker(ctx, is) for i := range vs { - err := checker.CheckTableLock(vs[i].db, vs[i].table, vs[i].privilege) + err := checker.CheckTableLock(vs[i].db, vs[i].table, vs[i].privilege, vs[i].alterWritable) if err != nil { return err } @@ -146,7 +146,7 @@ func DoOptimize(ctx context.Context, sctx sessionctx.Context, flag uint64, logic func postOptimize(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPlan { plan = eliminatePhysicalProjection(plan) - plan = injectExtraProjection(plan) + plan = InjectExtraProjection(plan) plan = eliminateUnionScanAndLock(sctx, plan) plan = enableParallelApply(sctx, plan) return plan @@ -164,7 +164,7 @@ func enableParallelApply(sctx sessionctx.Context, plan PhysicalPlan) PhysicalPla // while A3 is the inner child. Then A1 and A2 can be parallel and A3 cannot. if apply, ok := plan.(*PhysicalApply); ok { outerIdx := 1 - apply.InnerChildIdx - noOrder := len(apply.GetChildReqProps(outerIdx).Items) == 0 // limitation 1 + noOrder := len(apply.GetChildReqProps(outerIdx).SortItems) == 0 // limitation 1 _, err := SafeClone(apply.Children()[apply.InnerChildIdx]) supportClone := err == nil // limitation 2 if noOrder && supportClone { diff --git a/planner/core/partition_prune.go b/planner/core/partition_prune.go index d9642916c2539..80941c3de3edd 100644 --- a/planner/core/partition_prune.go +++ b/planner/core/partition_prune.go @@ -37,6 +37,8 @@ func PartitionPruning(ctx sessionctx.Context, tbl table.PartitionedTable, conds } ret := s.convertToIntSlice(rangeOr, pi, partitionNames) return ret, nil + case model.PartitionTypeList: + return s.pruneListPartition(ctx, tbl, partitionNames, conds) } return []int{FullRange}, nil } diff --git a/planner/core/partition_pruner_test.go b/planner/core/partition_pruner_test.go new file mode 100644 index 0000000000000..16f534e926fde --- /dev/null +++ b/planner/core/partition_pruner_test.go @@ -0,0 +1,499 @@ +// Copyright 2019 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package core_test + +import ( + "bytes" + "fmt" + "math/rand" + "sort" + "strings" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/mock" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testutil" +) + +var _ = Suite(&testPartitionPruneSuit{}) + +type testPartitionPruneSuit struct { + store kv.Storage + dom *domain.Domain + ctx sessionctx.Context + testData testutil.TestData +} + +func (s *testPartitionPruneSuit) cleanEnv(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test_partition") + r := tk.MustQuery("show tables") + for _, tb := range r.Rows() { + tableName := tb[0] + tk.MustExec(fmt.Sprintf("drop table %v", tableName)) + } +} + +func (s *testPartitionPruneSuit) SetUpSuite(c *C) { + var err error + s.store, s.dom, err = newStoreWithBootstrap() + c.Assert(err, IsNil) + s.ctx = mock.NewContext() + s.testData, err = testutil.LoadTestSuiteData("testdata", "partition_pruner") + c.Assert(err, IsNil) +} + +func (s *testPartitionPruneSuit) TearDownSuite(c *C) { + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) + s.dom.Close() + s.store.Close() +} + +func (s *testPartitionPruneSuit) TestHashPartitionPruner(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("create database test_partition") + tk.MustExec("use test_partition") + tk.MustExec("drop table if exists t1, t2;") + tk.Se.GetSessionVars().EnableClusteredIndex = false + tk.MustExec("create table t2(id int, a int, b int, primary key(id, a)) partition by hash(id + a) partitions 10;") + tk.MustExec("create table t1(id int primary key, a int, b int) partition by hash(id) partitions 10;") + tk.MustExec("create table t3(id int, a int, b int, primary key(id, a)) partition by hash(id) partitions 10;") + tk.MustExec("create table t4(d datetime, a int, b int, primary key(d, a)) partition by hash(year(d)) partitions 10;") + tk.MustExec("create table t5(d date, a int, b int, primary key(d, a)) partition by hash(month(d)) partitions 10;") + tk.MustExec("create table t6(a int, b int) partition by hash(a) partitions 3;") + tk.MustExec("create table t7(a int, b int) partition by hash(a + b) partitions 10;") + + var input []string + var output []struct { + SQL string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + }) + tk.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} + +func (s *testPartitionPruneSuit) TestListPartitionPruner(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("drop database if exists test_partition;") + tk.MustExec("create database test_partition") + tk.MustExec("use test_partition") + tk.Se.GetSessionVars().EnableClusteredIndex = false + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("create table t1 (id int, a int, b int ) partition by list ( a ) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") + tk.MustExec("create table t2 (a int, id int, b int) partition by list (a*3 + b - 2*a - b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") + tk.MustExec("create table t3 (b int, id int, a int) partition by list columns (a) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") + tk.MustExec("create table t4 (id int, a int, b int, primary key (a)) partition by list ( a ) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10));") + tk.MustExec("create table t5 (a int, id int, b int, unique key (a,b)) partition by list (a*3 + b - 2*a - b) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") + tk.MustExec("create table t6 (b int, id int, a int, unique key (a,b)) partition by list columns (a) (partition p0 values in (1,2,3,4,5), partition p1 values in (6,7,8,9,10,null));") + tk.MustExec("insert into t1 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk.MustExec("insert into t2 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk.MustExec("insert into t3 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk.MustExec("insert into t4 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10)") + tk.MustExec("insert into t5 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk.MustExec("insert into t6 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk.MustExec(`create table t7 (a int unsigned) partition by list (a)(partition p0 values in (0),partition p1 values in (1),partition pnull values in (null),partition p2 values in (2));`) + tk.MustExec("insert into t7 values (null),(0),(1),(2);") + + // tk2 use to compare the result with normal table. + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("drop database if exists test_partition_2;") + tk2.MustExec("create database test_partition_2") + tk2.MustExec("use test_partition_2") + tk2.MustExec("create table t1 (id int, a int, b int)") + tk2.MustExec("create table t2 (a int, id int, b int)") + tk2.MustExec("create table t3 (b int, id int, a int)") + tk2.MustExec("create table t4 (id int, a int, b int, primary key (a));") + tk2.MustExec("create table t5 (a int, id int, b int, unique key (a,b));") + tk2.MustExec("create table t6 (b int, id int, a int, unique key (a,b));") + tk2.MustExec("insert into t1 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk2.MustExec("insert into t2 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk2.MustExec("insert into t3 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk2.MustExec("insert into t4 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10)") + tk2.MustExec("insert into t5 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk2.MustExec("insert into t6 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + tk2.MustExec(`create table t7 (a int unsigned);`) + tk2.MustExec("insert into t7 values (null),(0),(1),(2);") + + var input []string + var output []struct { + SQL string + Result []string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + valid := false + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) + }) + tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) + result := tk.MustQuery(tt) + result.Check(testkit.Rows(output[i].Result...)) + // If the query doesn't specified the partition, compare the result with normal table + if !strings.Contains(tt, "partition(") { + result.Check(tk2.MustQuery(tt).Rows()) + valid = true + } + c.Assert(valid, IsTrue) + } +} + +func (s *testPartitionPruneSuit) TestListColumnsPartitionPruner(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("drop database if exists test_partition;") + tk.MustExec("create database test_partition") + tk.MustExec("use test_partition") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec("create table t1 (id int, a int, b int) partition by list columns (b,a) (partition p0 values in ((1,1),(2,2),(3,3),(4,4),(5,5)), partition p1 values in ((6,6),(7,7),(8,8),(9,9),(10,10),(null,10)));") + tk.MustExec("create table t2 (id int, a int, b int) partition by list columns (id,a,b) (partition p0 values in ((1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5)), partition p1 values in ((6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)));") + tk.MustExec("insert into t1 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,10,null)") + tk.MustExec("insert into t2 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + + // tk1 use to test partition table with index. + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("drop database if exists test_partition_1;") + tk1.MustExec("create database test_partition_1") + tk1.MustExec("use test_partition_1") + tk1.MustExec("set @@session.tidb_enable_list_partition = ON") + tk1.MustExec("create table t1 (id int, a int, b int, unique key (a,b,id)) partition by list columns (b,a) (partition p0 values in ((1,1),(2,2),(3,3),(4,4),(5,5)), partition p1 values in ((6,6),(7,7),(8,8),(9,9),(10,10),(null,10)));") + tk1.MustExec("create table t2 (id int, a int, b int, unique key (a,b,id)) partition by list columns (id,a,b) (partition p0 values in ((1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5)), partition p1 values in ((6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)));") + tk1.MustExec("insert into t1 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,10,null)") + tk1.MustExec("insert into t2 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + + // tk2 use to compare the result with normal table. + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("drop database if exists test_partition_2;") + tk2.MustExec("create database test_partition_2") + tk2.MustExec("use test_partition_2") + tk2.MustExec("create table t1 (id int, a int, b int)") + tk2.MustExec("create table t2 (id int, a int, b int)") + tk2.MustExec("insert into t1 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,10,null)") + tk2.MustExec("insert into t2 (id,a,b) values (1,1,1),(2,2,2),(3,3,3),(4,4,4),(5,5,5),(6,6,6),(7,7,7),(8,8,8),(9,9,9),(10,10,10),(null,null,null)") + + var input []struct { + SQL string + Pruner string + } + var output []struct { + SQL string + Result []string + Plan []string + IndexPlan []string + } + s.testData.GetTestCases(c, &input, &output) + valid := false + for i, tt := range input { + // Test for table without index. + plan := tk.MustQuery("explain format = 'brief' " + tt.SQL) + planTree := s.testData.ConvertRowsToStrings(plan.Rows()) + // Test for table with index. + indexPlan := tk1.MustQuery("explain format = 'brief' " + tt.SQL) + indexPlanTree := s.testData.ConvertRowsToStrings(indexPlan.Rows()) + s.testData.OnRecord(func() { + output[i].SQL = tt.SQL + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(tt.SQL).Rows()) + // Test for table without index. + output[i].Plan = planTree + // Test for table with index. + output[i].IndexPlan = indexPlanTree + }) + // compare the plan. + plan.Check(testkit.Rows(output[i].Plan...)) + indexPlan.Check(testkit.Rows(output[i].IndexPlan...)) + + // compare the pruner information. + s.checkPrunePartitionInfo(c, tt.SQL, tt.Pruner, planTree) + s.checkPrunePartitionInfo(c, tt.SQL, tt.Pruner, indexPlanTree) + + // compare the result. + result := tk.MustQuery(tt.SQL) + idxResult := tk1.MustQuery(tt.SQL) + result.Check(idxResult.Rows()) + result.Check(testkit.Rows(output[i].Result...)) + + // If the query doesn't specified the partition, compare the result with normal table + if !strings.Contains(tt.SQL, "partition(") { + result.Check(tk2.MustQuery(tt.SQL).Rows()) + valid = true + } + } + c.Assert(valid, IsTrue) +} + +func (s *testPartitionPruneSuit) checkPrunePartitionInfo(c *C, query string, infos1 string, plan []string) { + infos2 := s.getPartitionInfoFromPlan(plan) + c.Assert(infos1, Equals, infos2, Commentf("the query is: %v, the plan is:\n%v", query, strings.Join(plan, "\n"))) +} + +type testTablePartitionInfo struct { + Table string + Partitions string +} + +// getPartitionInfoFromPlan uses to extract table partition information from the plan tree string. Here is an example, the plan is like below: +// "Projection_7 80.00 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.id, test_partition.t2.a, test_partition.t2.b", +// "└─HashJoin_9 80.00 root CARTESIAN inner join", +// " ├─TableReader_12(Build) 8.00 root partition:p1 data:Selection_11", +// " │ └─Selection_11 8.00 cop[tikv] 1, eq(test_partition.t2.b, 6), in(test_partition.t2.a, 6, 7, 8)", +// " │ └─TableFullScan_10 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", +// " └─TableReader_15(Probe) 10.00 root partition:p0 data:Selection_14", +// " └─Selection_14 10.00 cop[tikv] 1, eq(test_partition.t1.a, 5)", +// " └─TableFullScan_13 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" +// +// The return table partition info is: t1: p0; t2: p1 +func (s *testPartitionPruneSuit) getPartitionInfoFromPlan(plan []string) string { + infos := make([]testTablePartitionInfo, 0, 2) + info := testTablePartitionInfo{} + for _, row := range plan { + partitions := s.getFieldValue("partition:", row) + if partitions != "" { + info.Partitions = partitions + continue + } + tbl := s.getFieldValue("table:", row) + if tbl != "" { + info.Table = tbl + infos = append(infos, info) + } + } + sort.Slice(infos, func(i, j int) bool { + if infos[i].Table != infos[j].Table { + return infos[i].Table < infos[j].Table + } + return infos[i].Partitions < infos[j].Partitions + }) + buf := bytes.NewBuffer(nil) + for i, info := range infos { + if i > 0 { + buf.WriteString("; ") + } + buf.WriteString(fmt.Sprintf("%v: %v", info.Table, info.Partitions)) + } + return buf.String() +} + +func (s *testPartitionPruneSuit) getFieldValue(prefix, row string) string { + if idx := strings.Index(row, prefix); idx > 0 { + start := idx + len(prefix) + end := strings.Index(row[start:], " ") + if end > 0 { + value := row[start : start+end] + value = strings.Trim(value, ",") + return value + } + } + return "" +} + +func (s *testPartitionPruneSuit) TestListColumnsPartitionPrunerRandom(c *C) { + tk := testkit.NewTestKit(c, s.store) + for count := 0; count < 5; count++ { + partitionNum := rand.Intn(10) + 1 + valueNum := rand.Intn(10) + 1 + condNum := 20 + + partitionDefs := make([][]string, partitionNum) + for id := 0; id < valueNum; id++ { + for a := 0; a < valueNum; a++ { + for b := 0; b < valueNum; b++ { + idx := rand.Intn(partitionNum) + partitionDefs[idx] = append(partitionDefs[idx], fmt.Sprintf("(%v,%v,%v)", b, id, a)) + } + } + } + validIdx := 0 + for _, def := range partitionDefs { + if len(def) > 0 { + partitionDefs[validIdx] = def + validIdx++ + } + } + partitionDefs = partitionDefs[:validIdx] + createSQL := bytes.NewBuffer(make([]byte, 0, 1024*1024)) + // Generate table definition. + colNames := []string{"id", "a", "b"} + createSQL.WriteString("create table t1 (id int, a int, b int") + // Generate Index definition. + if rand.Int()%2 == 0 { + createSQL.WriteString(", index (") + n := rand.Intn(len(colNames)) + 1 + cols := map[string]struct{}{} + for i := 0; i < n; i++ { + col := colNames[rand.Intn(len(colNames))] + cols[col] = struct{}{} + } + cnt := 0 + for col := range cols { + if cnt > 0 { + createSQL.WriteString(",") + } + createSQL.WriteString(col) + cnt++ + } + createSQL.WriteString(")") + } + createSQL.WriteString(" ) partition by list columns (b, id, a) (") + + for i := range partitionDefs { + if i > 0 { + createSQL.WriteString(",") + } + createSQL.WriteString(fmt.Sprintf("partition p%v values in (", i)) + for idx, v := range partitionDefs[i] { + if idx > 0 { + createSQL.WriteString(",") + } + createSQL.WriteString(v) + } + createSQL.WriteString(")") + } + createSQL.WriteString(")") + + // Create table. + tk.MustExec("drop database if exists test_partition;") + tk.MustExec("create database test_partition") + tk.MustExec("use test_partition") + tk.MustExec("set @@session.tidb_enable_list_partition = ON") + tk.MustExec(createSQL.String()) + + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("drop database if exists test_partition_1;") + tk1.MustExec("create database test_partition_1") + tk1.MustExec("use test_partition_1") + tk1.MustExec("create table t1 (id int, a int, b int)") + + // prepare data. + for _, def := range partitionDefs { + insert := fmt.Sprintf("insert into t1 (b,id,a) values %v", strings.Join(def, ",")) + tk.MustExec(insert) + tk1.MustExec(insert) + + // Test query without condition + query := fmt.Sprintf("select * from t1 order by id,a,b") + tk.MustQuery(query).Check(tk1.MustQuery(query).Rows()) + } + + // Test for single column condition. + for i := 0; i < valueNum+1; i++ { + query := fmt.Sprintf("select * from t1 where id = %v order by id,a,b", i) + tk.MustQuery(query).Check(tk1.MustQuery(query).Rows()) + query = fmt.Sprintf("select * from t1 where a = %v order by id,a,b", i) + tk.MustQuery(query).Check(tk1.MustQuery(query).Rows()) + query = fmt.Sprintf("select * from t1 where b = %v order by id,a,b", i) + tk.MustQuery(query).Check(tk1.MustQuery(query).Rows()) + } + // Test for multi-columns condition. + genCond := func() string { + col := colNames[rand.Intn(len(colNames))] + value := rand.Intn(valueNum + 2) + switch rand.Int() % 3 { + case 0: + return fmt.Sprintf(" %v = %v ", col, value) + case 1: + return fmt.Sprintf(" %v = %v ", value, col) + default: + buf := bytes.NewBuffer(nil) + buf.WriteString(fmt.Sprintf(" %v in (", col)) + n := rand.Intn(valueNum+5) + 1 + for i := 0; i < n; i++ { + if i > 0 { + buf.WriteString(",") + } + value := rand.Intn(valueNum + 2) + buf.WriteString(fmt.Sprintf("%v", value)) + } + buf.WriteString(")") + return buf.String() + } + } + for i := 0; i < 500; i++ { + condCnt := rand.Intn(condNum) + 1 + query := bytes.NewBuffer(nil) + query.WriteString("select * from t1 where ") + for j := 0; j < condCnt; j++ { + if j > 0 { + if rand.Int()%2 == 0 { + query.WriteString(" and ") + } else { + query.WriteString(" or ") + } + } + query.WriteString(genCond()) + } + query.WriteString(" order by id,a,b") + tk.MustQuery(query.String()).Check(tk1.MustQuery(query.String()).Rows()) + } + } +} + +func (s *testPartitionPruneSuit) TestIssue22635(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test;") + tk.MustExec("DROP TABLE IF EXISTS t1") + tk.MustExec(` +CREATE TABLE t1 ( + a int(11) DEFAULT NULL, + b int(11) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin +PARTITION BY HASH( a ) +PARTITIONS 4`) + tk.MustQuery("SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa").Check(testkit.Rows()) // work fine without any error + + tk.MustExec("insert into t1 values (1, 1)") + tk.MustQuery("SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa").Check(testkit.Rows("1 1")) + + tk.MustExec("insert into t1 values (2, 2), (2, 2)") + tk.MustQuery("SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa").Check(testkit.Rows("1 2")) + + tk.MustExec("insert into t1 values (3, 3), (3, 3), (3, 3)") + tk.MustQuery("SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa").Check(testkit.Rows("1 3")) + + tk.MustExec("insert into t1 values (4, 4), (4, 4), (4, 4), (4, 4)") + tk.MustQuery("SELECT (SELECT tt.a FROM t1 tt LIMIT 1) aa, COUNT(DISTINCT b) FROM t1 GROUP BY aa").Check(testkit.Rows("4 4")) +} + +func (s *testPartitionPruneSuit) TestIssue22898(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test;") + tk.MustExec("DROP TABLE IF EXISTS test;") + tk.MustExec("CREATE TABLE NT_RP3763 (COL1 TINYINT(8) SIGNED COMMENT \"NUMERIC NO INDEX\" DEFAULT 41,COL2 VARCHAR(20),COL3 DATETIME,COL4 BIGINT,COL5 FLOAT) PARTITION BY RANGE (COL1 * COL3) (PARTITION P0 VALUES LESS THAN (0),PARTITION P1 VALUES LESS THAN (10),PARTITION P2 VALUES LESS THAN (20),PARTITION P3 VALUES LESS THAN (30),PARTITION P4 VALUES LESS THAN (40),PARTITION P5 VALUES LESS THAN (50),PARTITION PMX VALUES LESS THAN MAXVALUE);") + tk.MustExec("insert into NT_RP3763 (COL1,COL2,COL3,COL4,COL5) values(-82,\"夐齏醕皆磹漋甓崘潮嵙燷渏艂朼洛炷鉢儝鱈肇\",\"5748\\-06\\-26\\ 20:48:49\",-3133527360541070260,-2.624880003397658e+38);") + tk.MustExec("insert into NT_RP3763 (COL1,COL2,COL3,COL4,COL5) values(48,\"簖鹩筈匹眜赖泽騈爷詵赺玡婙Ɇ郝鮙廛賙疼舢\",\"7228\\-12\\-13\\ 02:59:54\",-6181009269190017937,2.7731105531290494e+38);") + tk.MustQuery("select * from `NT_RP3763` where `COL1` in (10, 48, -82);").Check(testkit.Rows("-82 夐齏醕皆磹漋甓崘潮嵙燷渏艂朼洛炷鉢儝鱈肇 5748-06-26 20:48:49 -3133527360541070260 -262488000000000000000000000000000000000", "48 簖鹩筈匹眜赖泽騈爷詵赺玡婙Ɇ郝鮙廛賙疼舢 7228-12-13 02:59:54 -6181009269190017937 277311060000000000000000000000000000000")) + tk.MustQuery("select * from `NT_RP3763` where `COL1` in (48);").Check(testkit.Rows("48 簖鹩筈匹眜赖泽騈爷詵赺玡婙Ɇ郝鮙廛賙疼舢 7228-12-13 02:59:54 -6181009269190017937 277311060000000000000000000000000000000")) +} + +func (s *testPartitionPruneSuit) Test22396(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("USE test;") + tk.MustExec("DROP TABLE IF EXISTS test;") + tk.MustExec("CREATE TABLE test(a INT, b INT, PRIMARY KEY(a, b)) PARTITION BY RANGE (a + b) (PARTITION p0 VALUES LESS THAN (20),PARTITION p1 VALUES LESS THAN MAXVALUE);") + tk.MustExec("INSERT INTO test(a, b) VALUES(1, 11),(2, 22),(3, 33),(10, 44),(9, 55);") + tk.MustQuery("SELECT * FROM test WHERE a = 1;") + tk.MustQuery("SELECT * FROM test WHERE b = 1;") + tk.MustQuery("SELECT * FROM test WHERE a = 1 AND b = 1;") + tk.MustQuery("SELECT * FROM test WHERE a + b = 2;") +} diff --git a/planner/core/partition_pruning_test.go b/planner/core/partition_pruning_test.go index 19fce4c99e9ef..ecd536d15605d 100644 --- a/planner/core/partition_pruning_test.go +++ b/planner/core/partition_pruning_test.go @@ -21,10 +21,11 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/mock" ) -var _ = Suite(&testPartitionPruningSuite{}) +var _ = SerialSuites(&testPartitionPruningSuite{}) type testPartitionPruningSuite struct { partitionProcessor @@ -315,17 +316,63 @@ func (s *testPartitionPruningSuite) TestPartitionRangePrunner2VarChar(c *C) { } } +func (s *testPartitionPruningSuite) TestPartitionRangePrunner2CharWithCollation(c *C) { + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + tc := prepareTestCtx(c, + "create table t (a char(32) collate utf8mb4_unicode_ci)", + "a", + ) + lessThanDataInt := []string{"'c'", "'F'", "'h'", "'L'", "'t'"} + lessThan := make([]expression.Expression, len(lessThanDataInt)+1) // +1 for maxvalue + for i, str := range lessThanDataInt { + tmp, err := expression.ParseSimpleExprsWithNames(tc.sctx, str, tc.schema, tc.names) + c.Assert(err, IsNil) + lessThan[i] = tmp[0] + } + + prunner := &rangeColumnsPruner{lessThan, tc.columns[0], true} + cases := []struct { + input string + result partitionRangeOR + }{ + {"a > 'G'", partitionRangeOR{{2, 6}}}, + {"a > 'g'", partitionRangeOR{{2, 6}}}, + {"a < 'h'", partitionRangeOR{{0, 3}}}, + {"a >= 'M'", partitionRangeOR{{4, 6}}}, + {"a > 'm'", partitionRangeOR{{4, 6}}}, + {"a < 'F'", partitionRangeOR{{0, 2}}}, + {"a = 'C'", partitionRangeOR{{1, 2}}}, + {"a > 't'", partitionRangeOR{{5, 6}}}, + {"a > 'C' and a < 'q'", partitionRangeOR{{1, 5}}}, + {"a > 'c' and a < 'Q'", partitionRangeOR{{1, 5}}}, + {"a < 'l' or a >= 'W'", partitionRangeOR{{0, 4}, {5, 6}}}, + {"a is null", partitionRangeOR{{0, 1}}}, + {"'Mm' > a", partitionRangeOR{{0, 5}}}, + {"'f' <= a", partitionRangeOR{{2, 6}}}, + {"'f' >= a", partitionRangeOR{{0, 3}}}, + } + + for _, ca := range cases { + expr, err := expression.ParseSimpleExprsWithNames(tc.sctx, ca.input, tc.schema, tc.names) + c.Assert(err, IsNil) + result := fullRange(len(lessThan)) + result = partitionRangeForExpr(tc.sctx, expr[0], prunner, result) + c.Assert(equalPartitionRangeOR(ca.result, result), IsTrue, Commentf("unexpected:", ca.input)) + } +} + func (s *testPartitionPruningSuite) TestPartitionRangePrunner2Date(c *C) { tc := prepareTestCtx(c, "create table t (a date)", "a", ) lessThanDataInt := []string{ - "'1999-06-01'", + "'19990601'", "'2000-05-01'", - "'2008-04-01'", + "'20080401'", "'2010-03-01'", - "'2016-02-01'", + "'20160201'", "'2020-01-01'"} lessThan := make([]expression.Expression, len(lessThanDataInt)) for i, str := range lessThanDataInt { @@ -340,16 +387,16 @@ func (s *testPartitionPruningSuite) TestPartitionRangePrunner2Date(c *C) { result partitionRangeOR }{ {"a < '1943-02-12'", partitionRangeOR{{0, 1}}}, - {"a >= '1969-02-13'", partitionRangeOR{{0, 6}}}, + {"a >= '19690213'", partitionRangeOR{{0, 6}}}, {"a > '2003-03-13'", partitionRangeOR{{2, 6}}}, {"a < '2006-02-03'", partitionRangeOR{{0, 3}}}, - {"a = '2007-07-07'", partitionRangeOR{{2, 3}}}, + {"a = '20070707'", partitionRangeOR{{2, 3}}}, {"a > '1949-10-10'", partitionRangeOR{{0, 6}}}, - {"a > '2016-02-01' and a < '2000-01-03'", partitionRangeOR{}}, - {"a < '1969-11-12' or a >= '2019-09-18'", partitionRangeOR{{0, 1}, {5, 6}}}, + {"a > '2016-02-01' and a < '20000103'", partitionRangeOR{}}, + {"a < '19691112' or a >= '2019-09-18'", partitionRangeOR{{0, 1}, {5, 6}}}, {"a is null", partitionRangeOR{{0, 1}}}, {"'2003-02-27' >= a", partitionRangeOR{{0, 3}}}, - {"'2014-10-24' < a", partitionRangeOR{{4, 6}}}, + {"'20141024' < a", partitionRangeOR{{4, 6}}}, {"'2003-03-30' > a", partitionRangeOR{{0, 3}}}, } diff --git a/planner/core/pb_to_plan.go b/planner/core/pb_to_plan.go index 5ab1e76062b6f..3cfaf6708affe 100644 --- a/planner/core/pb_to_plan.go +++ b/planner/core/pb_to_plan.go @@ -17,10 +17,13 @@ import ( "strings" "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/planner/property" "github.com/pingcap/tidb/planner/util" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" @@ -29,14 +32,15 @@ import ( // PBPlanBuilder uses to build physical plan from dag protocol buffers. type PBPlanBuilder struct { - sctx sessionctx.Context - tps []*types.FieldType - is infoschema.InfoSchema + sctx sessionctx.Context + tps []*types.FieldType + is infoschema.InfoSchema + ranges []*coprocessor.KeyRange } // NewPBPlanBuilder creates a new pb plan builder. -func NewPBPlanBuilder(sctx sessionctx.Context, is infoschema.InfoSchema) *PBPlanBuilder { - return &PBPlanBuilder{sctx: sctx, is: is} +func NewPBPlanBuilder(sctx sessionctx.Context, is infoschema.InfoSchema, ranges []*coprocessor.KeyRange) *PBPlanBuilder { + return &PBPlanBuilder{sctx: sctx, is: is, ranges: ranges} } // Build builds physical plan from dag protocol buffers. @@ -47,7 +51,9 @@ func (b *PBPlanBuilder) Build(executors []*tipb.Executor) (p PhysicalPlan, err e if err != nil { return nil, errors.Trace(err) } - curr.SetChildren(src) + if src != nil { + curr.SetChildren(src) + } src = curr } _, src = b.predicatePushDown(src, nil) @@ -68,6 +74,8 @@ func (b *PBPlanBuilder) pbToPhysicalPlan(e *tipb.Executor) (p PhysicalPlan, err p, err = b.pbToAgg(e, false) case tipb.ExecType_TypeStreamAgg: p, err = b.pbToAgg(e, true) + case tipb.ExecType_TypeKill: + p, err = b.pbToKill(e) default: // TODO: Support other types. err = errors.Errorf("this exec type %v doesn't support yet.", e.GetTp()) @@ -98,10 +106,18 @@ func (b *PBPlanBuilder) pbToTableScan(e *tipb.Executor) (PhysicalPlan, error) { DBName: dbInfo.Name, Table: tbl.Meta(), Columns: columns, - }.Init(b.sctx, nil, 0) + }.Init(b.sctx, &property.StatsInfo{}, 0) p.SetSchema(schema) if strings.ToUpper(p.Table.Name.O) == infoschema.ClusterTableSlowLog { - p.Extractor = &SlowQueryExtractor{} + extractor := &SlowQueryExtractor{} + extractor.Desc = tblScan.Desc + if b.ranges != nil { + err := extractor.buildTimeRangeFromKeyRange(b.ranges) + if err != nil { + return nil, err + } + } + p.Extractor = extractor } return p, nil } @@ -131,7 +147,7 @@ func (b *PBPlanBuilder) pbToSelection(e *tipb.Executor) (PhysicalPlan, error) { } p := PhysicalSelection{ Conditions: conds, - }.Init(b.sctx, nil, 0) + }.Init(b.sctx, &property.StatsInfo{}, 0, &property.PhysicalProperty{}) return p, nil } @@ -149,14 +165,14 @@ func (b *PBPlanBuilder) pbToTopN(e *tipb.Executor) (PhysicalPlan, error) { p := PhysicalTopN{ ByItems: byItems, Count: topN.Limit, - }.Init(b.sctx, nil, 0) + }.Init(b.sctx, &property.StatsInfo{}, 0, &property.PhysicalProperty{}) return p, nil } func (b *PBPlanBuilder) pbToLimit(e *tipb.Executor) (PhysicalPlan, error) { p := PhysicalLimit{ Count: e.Limit.Limit, - }.Init(b.sctx, nil, 0) + }.Init(b.sctx, &property.StatsInfo{}, 0, &property.PhysicalProperty{}) return p, nil } @@ -173,9 +189,9 @@ func (b *PBPlanBuilder) pbToAgg(e *tipb.Executor, isStreamAgg bool) (PhysicalPla baseAgg.schema = schema var partialAgg PhysicalPlan if isStreamAgg { - partialAgg = baseAgg.initForStream(b.sctx, nil, 0) + partialAgg = baseAgg.initForStream(b.sctx, &property.StatsInfo{}, 0, &property.PhysicalProperty{}) } else { - partialAgg = baseAgg.initForHash(b.sctx, nil, 0) + partialAgg = baseAgg.initForHash(b.sctx, &property.StatsInfo{}, 0, &property.PhysicalProperty{}) } return partialAgg, nil } @@ -230,6 +246,15 @@ func (b *PBPlanBuilder) convertColumnInfo(tblInfo *model.TableInfo, pbColumns [] return columns, nil } +func (b *PBPlanBuilder) pbToKill(e *tipb.Executor) (PhysicalPlan, error) { + node := &ast.KillStmt{ + ConnectionID: e.Kill.ConnID, + Query: e.Kill.Query, + } + simple := Simple{Statement: node, IsFromRemote: true} + return &PhysicalSimpleWrapper{Inner: simple}, nil +} + func (b *PBPlanBuilder) predicatePushDown(p PhysicalPlan, predicates []expression.Expression) ([]expression.Expression, PhysicalPlan) { if p == nil { return predicates, p diff --git a/planner/core/physical_plan_test.go b/planner/core/physical_plan_test.go index 7fe637c1a8f5c..c33199ef377ec 100644 --- a/planner/core/physical_plan_test.go +++ b/planner/core/physical_plan_test.go @@ -48,7 +48,7 @@ type testPlanSuiteBase struct { func (s *testPlanSuiteBase) SetUpSuite(c *C) { s.is = infoschema.MockInfoSchema([]*model.TableInfo{core.MockSignedTable(), core.MockUnsignedTable()}) s.Parser = parser.New() - s.Parser.EnableWindowFunc(true) + s.Parser.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) } type testPlanSerialSuite struct { @@ -445,6 +445,42 @@ func (s *testPlanSuite) TestAggEliminator(c *C) { } } +func (s *testPlanSuite) TestEliminateMaxOneRow(c *C) { + var ( + input []string + output []struct { + SQL string + Plan []string + Result []string + } + ) + s.testData.GetTestCases(c, &input, &output) + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1;") + tk.MustExec("drop table if exists t2;") + tk.MustExec("drop table if exists t3;") + tk.MustExec("create table t1(a int(11) DEFAULT NULL, b int(11) DEFAULT NULL, UNIQUE KEY idx_a (a))") + tk.MustExec("create table t2(a int(11) DEFAULT NULL, b int(11) DEFAULT NULL)") + tk.MustExec("create table t3(a int(11) DEFAULT NULL, b int(11) DEFAULT NULL, c int(11) DEFAULT NULL, UNIQUE KEY idx_abc (a, b, c))") + + for i, ts := range input { + s.testData.OnRecord(func() { + output[i].SQL = ts + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) + output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(ts).Sort().Rows()) + }) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(ts).Check(testkit.Rows(output[i].Result...)) + } +} + type overrideStore struct{ kv.Storage } func (store overrideStore) GetClient() kv.Client { @@ -500,7 +536,49 @@ func (s *testPlanSuite) TestIndexJoinUnionScan(c *C) { tk.MustExec("create table t (a int primary key, b int, index idx(a))") tk.MustExec("create table tt (a int primary key) partition by range (a) (partition p0 values less than (100), partition p1 values less than (200))") - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + + s.testData.GetTestCases(c, &input, &output) + for i, ts := range input { + tk.MustExec("begin") + for j, tt := range ts { + if j != len(ts)-1 { + tk.MustExec(tt) + } + s.testData.OnRecord(func() { + output[i].SQL = ts + if j == len(ts)-1 { + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Rows()) + } + }) + if j == len(ts)-1 { + tk.MustQuery(tt).Check(testkit.Rows(output[i].Plan...)) + } + } + tk.MustExec("rollback") + } +} + +func (s *testPlanSuite) TestMergeJoinUnionScan(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + tk.MustExec("use test") + var input [][]string + var output []struct { + SQL []string + Plan []string + } + tk.MustExec("create table t1 (c_int int, c_str varchar(40), primary key (c_int))") + tk.MustExec("create table t2 (c_int int, c_str varchar(40), primary key (c_int))") + tk.MustExec("insert into t1 (`c_int`, `c_str`) values (11, 'keen williamson'), (10, 'gracious hermann')") + tk.MustExec("insert into t2 (`c_int`, `c_str`) values (10, 'gracious hermann')") s.testData.GetTestCases(c, &input, &output) for i, ts := range input { @@ -797,6 +875,26 @@ func (s *testPlanSuite) TestAggregationHints(c *C) { } } +func (s *testPlanSuite) TestExplainJoinHints(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, c int, key(b), key(c))") + tk.MustQuery("explain format='hint' select /*+ inl_merge_join(t2) */ * from t t1 inner join t t2 on t1.b = t2.b and t1.c = 1").Check(testkit.Rows( + "use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_merge_join(@`sel_1` `test`.`t2`), inl_merge_join(`t2`)", + )) + tk.MustQuery("explain format='hint' select /*+ inl_hash_join(t2) */ * from t t1 inner join t t2 on t1.b = t2.b and t1.c = 1").Check(testkit.Rows( + "use_index(@`sel_1` `test`.`t1` `c`), use_index(@`sel_1` `test`.`t2` `b`), inl_hash_join(@`sel_1` `test`.`t2`), inl_hash_join(`t2`)", + )) +} + func (s *testPlanSuite) TestAggToCopHint(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -876,7 +974,7 @@ func (s *testPlanSuite) TestLimitToCopHint(c *C) { output []struct { SQL string Plan []string - Warning string + Warning []string } ) @@ -885,23 +983,28 @@ func (s *testPlanSuite) TestLimitToCopHint(c *C) { for i, ts := range input { s.testData.OnRecord(func() { output[i].SQL = ts - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + ts).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) }) - tk.MustQuery("explain " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) comment := Commentf("case:%v sql:%s", i, ts) warnings := tk.Se.GetSessionVars().StmtCtx.GetWarnings() s.testData.OnRecord(func() { if len(warnings) > 0 { - output[i].Warning = warnings[0].Err.Error() + output[i].Warning = make([]string, len(warnings)) + for j, warning := range warnings { + output[i].Warning[j] = warning.Err.Error() + } } }) - if output[i].Warning == "" { + if len(output[i].Warning) == 0 { c.Assert(len(warnings), Equals, 0, comment) } else { - c.Assert(len(warnings), Equals, 1, comment) - c.Assert(warnings[0].Level, Equals, stmtctx.WarnLevelWarning, comment) - c.Assert(warnings[0].Err.Error(), Equals, output[i].Warning, comment) + c.Assert(len(warnings), Equals, len(output[i].Warning), comment) + for j, warning := range warnings { + c.Assert(warning.Level, Equals, stmtctx.WarnLevelWarning, comment) + c.Assert(warning.Err.Error(), Equals, output[i].Warning[j], comment) + } } } } @@ -984,6 +1087,9 @@ func (s *testPlanSuite) doTestPushdownDistinct(c *C, vars, input []string, outpu PARTITION p1 VALUES LESS THAN (100) );`) + tk.MustExec("drop table if exists tc;") + tk.MustExec("CREATE TABLE `tc`(`timestamp` timestamp NULL DEFAULT NULL, KEY `idx_timestamp` (`timestamp`)) PARTITION BY RANGE ( UNIX_TIMESTAMP(`timestamp`) ) (PARTITION `p2020072312` VALUES LESS THAN (1595480400),PARTITION `p2020072313` VALUES LESS THAN (1595484000));") + tk.MustExec("drop table if exists ta") tk.MustExec("create table ta(a int);") tk.MustExec("insert into ta values(1), (1);") @@ -995,7 +1101,7 @@ func (s *testPlanSuite) doTestPushdownDistinct(c *C, vars, input []string, outpu tk.MustExec(fmt.Sprintf("set session %s=1", variable.TiDBHashAggPartialConcurrency)) tk.MustExec(fmt.Sprintf("set session %s=1", variable.TiDBHashAggFinalConcurrency)) - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) for _, v := range vars { tk.MustExec(v) @@ -1004,10 +1110,10 @@ func (s *testPlanSuite) doTestPushdownDistinct(c *C, vars, input []string, outpu for i, ts := range input { s.testData.OnRecord(func() { output[i].SQL = ts - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + ts).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(ts).Sort().Rows()) }) - tk.MustQuery("explain " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(ts).Sort().Check(testkit.Rows(output[i].Result...)) } } @@ -1049,10 +1155,10 @@ func (s *testPlanSuite) TestGroupConcatOrderby(c *C) { for i, ts := range input { s.testData.OnRecord(func() { output[i].SQL = ts - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + ts).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(ts).Sort().Rows()) }) - tk.MustQuery("explain " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(ts).Check(testkit.Rows(output[i].Result...)) } } @@ -1487,10 +1593,10 @@ func (s *testPlanSuite) TestNominalSort(c *C) { for i, ts := range input { s.testData.OnRecord(func() { output[i].SQL = ts - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + ts).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) output[i].Result = s.testData.ConvertRowsToStrings(tk.MustQuery(ts).Rows()) }) - tk.MustQuery("explain " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) tk.MustQuery(ts).Check(testkit.Rows(output[i].Result...)) } } @@ -1565,7 +1671,7 @@ func (s *testPlanSuite) TestNthPlanHintWithExplain(c *C) { _, err = se.Execute(ctx, "insert into tt values (1, 1), (2, 2), (3, 4)") c.Assert(err, IsNil) - tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) var input []string var output []struct { @@ -1576,14 +1682,14 @@ func (s *testPlanSuite) TestNthPlanHintWithExplain(c *C) { for i, ts := range input { s.testData.OnRecord(func() { output[i].SQL = ts - output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + ts).Rows()) + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + ts).Rows()) }) - tk.MustQuery("explain " + ts).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery("explain format = 'brief' " + ts).Check(testkit.Rows(output[i].Plan...)) } // This assert makes sure a query with or without nth_plan() hint output exactly the same plan(including plan ID). // The query below is the same as queries in the testdata except for nth_plan() hint. // Currently its output is the same as the second test case in the testdata, which is `output[1]`. If this doesn't // hold in the future, you may need to modify this. - tk.MustQuery("explain select * from test.tt where a=1 and b=1").Check(testkit.Rows(output[1].Plan...)) + tk.MustQuery("explain format = 'brief' select * from test.tt where a=1 and b=1").Check(testkit.Rows(output[1].Plan...)) } diff --git a/planner/core/physical_plans.go b/planner/core/physical_plans.go index dc83337f46410..ed8e7ce626af6 100644 --- a/planner/core/physical_plans.go +++ b/planner/core/physical_plans.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/ranger" + "github.com/pingcap/tipb/go-tipb" ) var ( @@ -53,14 +54,14 @@ var ( _ PhysicalPlan = &PhysicalStreamAgg{} _ PhysicalPlan = &PhysicalApply{} _ PhysicalPlan = &PhysicalIndexJoin{} - _ PhysicalPlan = &PhysicalBroadCastJoin{} _ PhysicalPlan = &PhysicalHashJoin{} _ PhysicalPlan = &PhysicalMergeJoin{} _ PhysicalPlan = &PhysicalUnionScan{} _ PhysicalPlan = &PhysicalWindow{} _ PhysicalPlan = &PhysicalShuffle{} - _ PhysicalPlan = &PhysicalShuffleDataSourceStub{} + _ PhysicalPlan = &PhysicalShuffleReceiverStub{} _ PhysicalPlan = &BatchPointGetPlan{} + _ PhysicalPlan = &PhysicalTableSample{} ) // PhysicalTableReader is the table reader in tidb. @@ -74,6 +75,9 @@ type PhysicalTableReader struct { // StoreType indicates table read from which type of store. StoreType kv.StoreType + // BatchCop = true means the cop task in the physical table reader will be executed in batch mode(use in TiFlash only) + BatchCop bool + IsCommonHandle bool // Used by partition table. @@ -103,7 +107,7 @@ func (p *PhysicalTableReader) GetTableScan() *PhysicalTableScan { } else if chCnt == 1 { curPlan = curPlan.Children()[0] } else { - join := curPlan.(*PhysicalBroadCastJoin) + join := curPlan.(*PhysicalHashJoin) curPlan = join.children[1-join.globalChildIndex] } } @@ -142,6 +146,7 @@ func (p *PhysicalTableReader) Clone() (PhysicalPlan, error) { } cloned.physicalSchemaProducer = *base cloned.StoreType = p.StoreType + cloned.BatchCop = p.BatchCop cloned.IsCommonHandle = p.IsCommonHandle if cloned.tablePlan, err = p.tablePlan.Clone(); err != nil { return nil, err @@ -466,6 +471,10 @@ type PhysicalTableScan struct { Desc bool isChildOfIndexLookUp bool + + PartitionInfo PartitionInfo + + SampleInfo *TableSampleInfo } // Clone implements PhysicalPlan interface. @@ -544,7 +553,7 @@ func ExpandVirtualColumn(columns []*model.ColumnInfo, schema *expression.Schema, return copyColumn } -//SetIsChildOfIndexLookUp is to set the bool if is a child of IndexLookUpReader +// SetIsChildOfIndexLookUp is to set the bool if is a child of IndexLookUpReader func (ts *PhysicalTableScan) SetIsChildOfIndexLookUp(isIsChildOfIndexLookUp bool) { ts.isChildOfIndexLookUp = isIsChildOfIndexLookUp } @@ -715,6 +724,10 @@ type PhysicalHashJoin struct { // use the outer table to build a hash table when the outer table is smaller. UseOuterToBuild bool + + // on which store the join executes. + storeTp kv.StoreType + globalChildIndex int } // Clone implements PhysicalPlan interface. @@ -778,8 +791,7 @@ func NewPhysicalHashJoin(p *LogicalJoin, innerIdx int, useOuterToBuild bool, new type PhysicalIndexJoin struct { basePhysicalJoin - outerSchema *expression.Schema - innerTask task + innerTask task // Ranges stores the IndexRanges when the inner plan is index scan. Ranges []*ranger.Range @@ -793,6 +805,12 @@ type PhysicalIndexJoin struct { // need to be evaluated after we fetch the data of t1. // This struct stores them and evaluate them to ranges. CompareFilters *ColWithCmpFuncManager + // OuterHashKeys indicates the outer keys used to build hash table during + // execution. OuterJoinKeys is the prefix of OuterHashKeys. + OuterHashKeys []*expression.Column + // InnerHashKeys indicates the inner keys used to build hash table during + // execution. InnerJoinKeys is the prefix of InnerHashKeys. + InnerHashKeys []*expression.Column } // PhysicalIndexMergeJoin represents the plan of index look up merge join. @@ -829,10 +847,25 @@ type PhysicalMergeJoin struct { Desc bool } -// PhysicalBroadCastJoin only works for TiFlash Engine, which broadcast the small table to every replica of probe side of tables. -type PhysicalBroadCastJoin struct { - basePhysicalJoin - globalChildIndex int +// PhysicalExchangeReceiver accepts connection and receives data passively. +type PhysicalExchangeReceiver struct { + basePhysicalPlan + + Tasks []*kv.MPPTask + ChildPf *Fragment +} + +// PhysicalExchangeSender dispatches data to upstream tasks. That means push mode processing, +type PhysicalExchangeSender struct { + basePhysicalPlan + + TargetTasks []*kv.MPPTask + ExchangeType tipb.ExchangeType + HashCols []*expression.Column + // Tasks is the mpp task for current PhysicalExchangeSender + Tasks []*kv.MPPTask + + Fragment *Fragment } // Clone implements PhysicalPlan interface. @@ -862,7 +895,7 @@ type PhysicalLock struct { // PhysicalLimit is the physical operator of Limit. type PhysicalLimit struct { - basePhysicalPlan + physicalSchemaProducer Offset uint64 Count uint64 @@ -872,11 +905,11 @@ type PhysicalLimit struct { func (p *PhysicalLimit) Clone() (PhysicalPlan, error) { cloned := new(PhysicalLimit) *cloned = *p - base, err := p.basePhysicalPlan.cloneWithSelf(cloned) + base, err := p.physicalSchemaProducer.cloneWithSelf(cloned) if err != nil { return nil, err } - cloned.basePhysicalPlan = *base + cloned.physicalSchemaProducer = *base return cloned, nil } @@ -885,11 +918,35 @@ type PhysicalUnionAll struct { physicalSchemaProducer } +// AggMppRunMode defines the running mode of aggregation in MPP +type AggMppRunMode int + +const ( + // NoMpp means the default value which does not run in MPP + NoMpp AggMppRunMode = iota + // Mpp1Phase runs only 1 phase but requires its child's partition property + Mpp1Phase + // Mpp2Phase runs partial agg + final agg with hash partition + Mpp2Phase + // MppTiDB runs agg on TiDB (and a partial agg on TiFlash if in 2 phase agg) + MppTiDB +) + type basePhysicalAgg struct { physicalSchemaProducer AggFuncs []*aggregation.AggFuncDesc GroupByItems []expression.Expression + MppRunMode AggMppRunMode +} + +func (p *basePhysicalAgg) isFinalAgg() bool { + if len(p.AggFuncs) > 0 { + if p.AggFuncs[0].Mode == aggregation.FinalMode || p.AggFuncs[0].Mode == aggregation.CompleteMode { + return true + } + } + return false } func (p *basePhysicalAgg) cloneWithSelf(newSelf PhysicalPlan) (*basePhysicalAgg, error) { @@ -1117,8 +1174,8 @@ type PhysicalWindow struct { physicalSchemaProducer WindowFuncDescs []*aggregation.WindowFuncDesc - PartitionBy []property.Item - OrderBy []property.Item + PartitionBy []property.SortItem + OrderBy []property.SortItem Frame *WindowFrame } @@ -1146,7 +1203,7 @@ func (p *PhysicalWindow) ExtractCorrelatedCols() []*expression.CorrelatedColumn } // PhysicalShuffle represents a shuffle plan. -// `Tail` and `DataSource` are the last plan within and the first plan following the "shuffle", respectively, +// `Tails` and `DataSources` are the last plan within and the first plan following the "shuffle", respectively, // to build the child executors chain. // Take `Window` operator for example: // Shuffle -> Window -> Sort -> DataSource, will be separated into: @@ -1157,11 +1214,11 @@ type PhysicalShuffle struct { basePhysicalPlan Concurrency int - Tail PhysicalPlan - DataSource PhysicalPlan + Tails []PhysicalPlan + DataSources []PhysicalPlan SplitterType PartitionSplitterType - HashByItems []expression.Expression + ByItemArrays [][]expression.Expression } // PartitionSplitterType is the type of `Shuffle` executor splitter, which splits data source into partitions. @@ -1170,15 +1227,17 @@ type PartitionSplitterType int const ( // PartitionHashSplitterType is the splitter splits by hash. PartitionHashSplitterType = iota + // PartitionRangeSplitterType is the splitter that split sorted data into the same range + PartitionRangeSplitterType ) -// PhysicalShuffleDataSourceStub represents a data source stub of `PhysicalShuffle`, +// PhysicalShuffleReceiverStub represents a receiver stub of `PhysicalShuffle`, // and actually, is executed by `executor.shuffleWorker`. -type PhysicalShuffleDataSourceStub struct { +type PhysicalShuffleReceiverStub struct { physicalSchemaProducer - // Worker points to `executor.shuffleWorker`. - Worker unsafe.Pointer + // Worker points to `executor.shuffleReceiver`. + Receiver unsafe.Pointer } // CollectPlanStatsVersion uses to collect the statistics version of the plan. @@ -1238,3 +1297,31 @@ func SafeClone(v PhysicalPlan) (_ PhysicalPlan, err error) { }() return v.Clone() } + +// PhysicalTableSample represents a table sample plan. +// It returns the sample rows to its parent operand. +type PhysicalTableSample struct { + physicalSchemaProducer + TableSampleInfo *TableSampleInfo + TableInfo table.Table + Desc bool +} + +// TableSampleInfo contains the information for PhysicalTableSample. +type TableSampleInfo struct { + AstNode *ast.TableSample + FullSchema *expression.Schema + Partitions []table.PartitionedTable +} + +// NewTableSampleInfo creates a new TableSampleInfo. +func NewTableSampleInfo(node *ast.TableSample, fullSchema *expression.Schema, pt []table.PartitionedTable) *TableSampleInfo { + if node == nil { + return nil + } + return &TableSampleInfo{ + AstNode: node, + FullSchema: fullSchema, + Partitions: pt, + } +} diff --git a/planner/core/plan.go b/planner/core/plan.go index 5f9c853cf4f84..881bfb137febd 100644 --- a/planner/core/plan.go +++ b/planner/core/plan.go @@ -67,31 +67,43 @@ type Plan interface { } func enforceProperty(p *property.PhysicalProperty, tsk task, ctx sessionctx.Context) task { + if p.TaskTp == property.MppTaskType { + if mpp, ok := tsk.(*mppTask); ok && !mpp.invalid() { + return mpp.enforceExchanger(p) + } + return &mppTask{} + } if p.IsEmpty() || tsk.plan() == nil { return tsk } - tsk = finishCopTask(ctx, tsk) - sortReqProp := &property.PhysicalProperty{TaskTp: property.RootTaskType, Items: p.Items, ExpectedCnt: math.MaxFloat64} - sort := PhysicalSort{ByItems: make([]*util.ByItems, 0, len(p.Items))}.Init(ctx, tsk.plan().statsInfo(), tsk.plan().SelectBlockOffset(), sortReqProp) - for _, col := range p.Items { + tsk = tsk.convertToRootTask(ctx) + sortReqProp := &property.PhysicalProperty{TaskTp: property.RootTaskType, SortItems: p.SortItems, ExpectedCnt: math.MaxFloat64} + sort := PhysicalSort{ByItems: make([]*util.ByItems, 0, len(p.SortItems))}.Init(ctx, tsk.plan().statsInfo(), tsk.plan().SelectBlockOffset(), sortReqProp) + for _, col := range p.SortItems { sort.ByItems = append(sort.ByItems, &util.ByItems{Expr: col.Col, Desc: col.Desc}) } return sort.attach2Task(tsk) } // optimizeByShuffle insert `PhysicalShuffle` to optimize performance by running in a parallel manner. -func optimizeByShuffle(pp PhysicalPlan, tsk task, ctx sessionctx.Context) task { +func optimizeByShuffle(tsk task, ctx sessionctx.Context) task { if tsk.plan() == nil { return tsk } - // Don't use `tsk.plan()` here, which will probably be different from `pp`. - // Eg., when `pp` is `NominalSort`, `tsk.plan()` would be its child. - switch p := pp.(type) { + switch p := tsk.plan().(type) { case *PhysicalWindow: if shuffle := optimizeByShuffle4Window(p, ctx); shuffle != nil { return shuffle.attach2Task(tsk) } + case *PhysicalMergeJoin: + if shuffle := optimizeByShuffle4MergeJoin(p, ctx); shuffle != nil { + return shuffle.attach2Task(tsk) + } + case *PhysicalStreamAgg: + if shuffle := optimizeByShuffle4StreamAgg(p, ctx); shuffle != nil { + return shuffle.attach2Task(tsk) + } } return tsk } @@ -127,10 +139,86 @@ func optimizeByShuffle4Window(pp *PhysicalWindow, ctx sessionctx.Context) *Physi reqProp := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64} shuffle := PhysicalShuffle{ Concurrency: concurrency, - Tail: tail, - DataSource: dataSource, + Tails: []PhysicalPlan{tail}, + DataSources: []PhysicalPlan{dataSource}, SplitterType: PartitionHashSplitterType, - HashByItems: byItems, + ByItemArrays: [][]expression.Expression{byItems}, + }.Init(ctx, pp.statsInfo(), pp.SelectBlockOffset(), reqProp) + return shuffle +} + +func optimizeByShuffle4StreamAgg(pp *PhysicalStreamAgg, ctx sessionctx.Context) *PhysicalShuffle { + concurrency := ctx.GetSessionVars().StreamAggConcurrency() + if concurrency <= 1 { + return nil + } + + sort, ok := pp.Children()[0].(*PhysicalSort) + if !ok { + // Multi-thread executing on SORTED data source is not effective enough by current implementation. + // TODO: Implement a better one. + return nil + } + tail, dataSource := sort, sort.Children()[0] + + partitionBy := make([]*expression.Column, 0, len(pp.GroupByItems)) + for _, item := range pp.GroupByItems { + if col, ok := item.(*expression.Column); ok { + partitionBy = append(partitionBy, col) + } + } + NDV := int(getCardinality(partitionBy, dataSource.Schema(), dataSource.statsInfo())) + if NDV <= 1 { + return nil + } + concurrency = mathutil.Min(concurrency, NDV) + + reqProp := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64} + shuffle := PhysicalShuffle{ + Concurrency: concurrency, + Tails: []PhysicalPlan{tail}, + DataSources: []PhysicalPlan{dataSource}, + SplitterType: PartitionHashSplitterType, + ByItemArrays: [][]expression.Expression{cloneExprs(pp.GroupByItems)}, + }.Init(ctx, pp.statsInfo(), pp.SelectBlockOffset(), reqProp) + return shuffle +} + +func optimizeByShuffle4MergeJoin(pp *PhysicalMergeJoin, ctx sessionctx.Context) *PhysicalShuffle { + concurrency := ctx.GetSessionVars().MergeJoinConcurrency() + if concurrency <= 1 { + return nil + } + + children := pp.Children() + dataSources := make([]PhysicalPlan, len(children)) + tails := make([]PhysicalPlan, len(children)) + + for i := range children { + sort, ok := children[i].(*PhysicalSort) + if !ok { + // Multi-thread executing on SORTED data source is not effective enough by current implementation. + // TODO: Implement a better one. + return nil + } + tails[i], dataSources[i] = sort, sort.Children()[0] + } + + leftByItemArray := make([]expression.Expression, 0, len(pp.LeftJoinKeys)) + for _, col := range pp.LeftJoinKeys { + leftByItemArray = append(leftByItemArray, col.Clone()) + } + rightByItemArray := make([]expression.Expression, 0, len(pp.RightJoinKeys)) + for _, col := range pp.RightJoinKeys { + rightByItemArray = append(rightByItemArray, col.Clone()) + } + reqProp := &property.PhysicalProperty{ExpectedCnt: math.MaxFloat64} + shuffle := PhysicalShuffle{ + Concurrency: concurrency, + Tails: tails, + DataSources: dataSources, + SplitterType: PartitionHashSplitterType, + ByItemArrays: [][]expression.Expression{leftByItemArray, rightByItemArray}, }.Init(ctx, pp.statsInfo(), pp.SelectBlockOffset(), reqProp) return shuffle } @@ -300,7 +388,7 @@ func (p *basePhysicalPlan) cloneWithSelf(newSelf PhysicalPlan) (*basePhysicalPla base.children = append(base.children, cloned) } for _, prop := range p.childrenReqProps { - base.childrenReqProps = append(base.childrenReqProps, prop.Clone()) + base.childrenReqProps = append(base.childrenReqProps, prop.CloneEssentialFields()) } return base, nil } @@ -417,6 +505,22 @@ func (p *baseLogicalPlan) BuildKeyInfo(selfSchema *expression.Schema, childSchem func (p *logicalSchemaProducer) BuildKeyInfo(selfSchema *expression.Schema, childSchema []*expression.Schema) { selfSchema.Keys = nil p.baseLogicalPlan.BuildKeyInfo(selfSchema, childSchema) + + // default implementation for plans has only one child: proprgate child keys + // multi-children plans are likely to have particular implementation. + if len(childSchema) == 1 { + for _, key := range childSchema[0].Keys { + indices := selfSchema.ColumnsIndices(key) + if indices == nil { + continue + } + newKey := make([]*expression.Column, 0, len(key)) + for _, i := range indices { + newKey = append(newKey, selfSchema.Columns[i]) + } + selfSchema.Keys = append(selfSchema.Keys, newKey) + } + } } func newBasePlan(ctx sessionctx.Context, tp string, offset int) basePlan { @@ -497,6 +601,9 @@ func (p *basePlan) ExplainInfo() string { func (p *basePlan) ExplainID() fmt.Stringer { return stringutil.MemoizeStr(func() string { + if p.ctx != nil && p.ctx.GetSessionVars().StmtCtx.IgnoreExplainIDSuffix { + return p.tp + } return p.tp + "_" + strconv.Itoa(p.id) }) } diff --git a/planner/core/plan_test.go b/planner/core/plan_test.go index 43a7e0f68ac80..43b599ac7eaa3 100644 --- a/planner/core/plan_test.go +++ b/planner/core/plan_test.go @@ -17,13 +17,13 @@ import ( "bytes" "fmt" "strings" - "time" . "github.com/pingcap/check" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/planner/core" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util/israce" "github.com/pingcap/tidb/util/plancodec" "github.com/pingcap/tidb/util/testkit" @@ -58,12 +58,63 @@ func (s *testPlanNormalize) TearDownSuite(c *C) { testleak.AfterTest(c)() } +func (s *testPlanNormalize) TestPreferRangeScan(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists test;") + tk.MustExec("create table test(`id` int(10) NOT NULL AUTO_INCREMENT,`name` varchar(50) NOT NULL DEFAULT 'tidb',`age` int(11) NOT NULL,`addr` varchar(50) DEFAULT 'The ocean of stars',PRIMARY KEY (`id`),KEY `idx_age` (`age`))") + tk.MustExec("insert into test(age) values(5);") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("insert into test(name,age,addr) select name,age,addr from test;") + tk.MustExec("analyze table test;") + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + if i == 0 { + tk.MustExec("set session tidb_opt_prefer_range_scan=0") + } else if i == 1 { + tk.MustExec("set session tidb_opt_prefer_range_scan=1") + } + tk.Se.GetSessionVars().PlanID = 0 + tk.MustExec(tt) + info := tk.Se.ShowProcess() + c.Assert(info, NotNil) + p, ok := info.Plan.(core.Plan) + c.Assert(ok, IsTrue) + normalized, _ := core.NormalizePlan(p) + normalizedPlan, err := plancodec.DecodeNormalizedPlan(normalized) + normalizedPlanRows := getPlanRows(normalizedPlan) + c.Assert(err, IsNil) + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = normalizedPlanRows + }) + compareStringSlice(c, normalizedPlanRows, output[i].Plan) + } +} + func (s *testPlanNormalize) TestNormalizedPlan(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("drop table if exists t1,t2") + tk.MustExec("set @@tidb_partition_prune_mode='static';") + tk.MustExec("drop table if exists t1,t2,t3,t4") tk.MustExec("create table t1 (a int key,b int,c int, index (b));") tk.MustExec("create table t2 (a int key,b int,c int, index (b));") + tk.MustExec("create table t3 (a int key,b int) partition by hash(a) partitions 2;") + tk.MustExec("create table t4 (a int, b int, index(a)) partition by range(a) (partition p0 values less than (10),partition p1 values less than MAXVALUE);") var input []string var output []struct { SQL string @@ -165,9 +216,11 @@ func (s *testPlanNormalize) TestEncodeDecodePlan(c *C) { func (s *testPlanNormalize) TestNormalizedDigest(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") - tk.MustExec("drop table if exists t1,t2, bmsql_order_line, bmsql_district,bmsql_stock") + tk.MustExec("drop table if exists t1,t2,t3,t4, bmsql_order_line, bmsql_district,bmsql_stock") tk.MustExec("create table t1 (a int key,b int,c int, index (b));") tk.MustExec("create table t2 (a int key,b int,c int, index (b));") + tk.MustExec("create table t3 (a int, b int, index(a)) partition by range(a) (partition p0 values less than (10),partition p1 values less than MAXVALUE);") + tk.MustExec("create table t4 (a int key,b int) partition by hash(a) partitions 2;") tk.MustExec(`CREATE TABLE bmsql_order_line ( ol_w_id int(11) NOT NULL, ol_d_id int(11) NOT NULL, @@ -295,6 +348,16 @@ func (s *testPlanNormalize) TestNormalizedDigest(c *C) { sql2: "select count(1) as num,a from t1 where a=2 group by a union select count(1) as num,a from t1 where a=4 group by a;", isSame: true, }, + { // test for tablescan partition + sql1: "select * from t3 where a=5", + sql2: "select * from t3 where a=15", + isSame: true, + }, + { // test for point get partition + sql1: "select * from t4 where a=4", + sql2: "select * from t4 where a=30", + isSame: true, + }, { sql1: `SELECT COUNT(*) AS low_stock FROM @@ -360,6 +423,16 @@ func compareStringSlice(c *C, ss1, ss2 []string) { } } +func (s *testPlanNormalize) TestExplainFormatHint(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (c1 int not null, c2 int not null, key idx_c2(c2)) partition by range (c2) (partition p0 values less than (10), partition p1 values less than (20))") + + tk.MustQuery("explain format='hint' select /*+ use_index(@`sel_2` `test`.`t2` `idx_c2`), hash_agg(@`sel_2`), use_index(@`sel_1` `test`.`t1` `idx_c2`), hash_agg(@`sel_1`) */ count(1) from t t1 where c2 in (select c2 from t t2 where t2.c2 < 15 and t2.c2 > 12)").Check(testkit.Rows( + "use_index(@`sel_2` `test`.`t2` `idx_c2`), hash_agg(@`sel_2`), use_index(@`sel_1` `test`.`t1` `idx_c2`), hash_agg(@`sel_1`)")) +} + func (s *testPlanNormalize) TestNthPlanHint(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") @@ -418,7 +491,7 @@ func (s *testPlanNormalize) TestNthPlanHint(c *C) { "Warning 1105 The parameter of nth_plan() is out of range.")) } -func (s *testPlanNormalize) TestDecodePlanPerformance(c *C) { +func (s *testPlanNormalize) BenchmarkDecodePlan(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") @@ -443,8 +516,32 @@ func (s *testPlanNormalize) TestDecodePlanPerformance(c *C) { // TODO: optimize the encode plan performance when encode plan with runtimeStats tk.Se.GetSessionVars().StmtCtx.RuntimeStatsColl = nil encodedPlanStr := core.EncodePlan(p) - start := time.Now() - _, err := plancodec.DecodePlan(encodedPlanStr) - c.Assert(err, IsNil) - c.Assert(time.Since(start).Seconds(), Less, 3.0) + c.ResetTimer() + for i := 0; i < c.N; i++ { + _, err := plancodec.DecodePlan(encodedPlanStr) + c.Assert(err, IsNil) + } +} + +func (s *testPlanNormalize) BenchmarkEncodePlan(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists th") + tk.MustExec("set @@session.tidb_enable_table_partition = 1") + tk.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) + tk.MustExec("create table th (i int, a int,b int, c int, index (a)) partition by hash (a) partitions 8192;") + tk.MustExec("set @@tidb_slow_log_threshold=200000") + + query := "select count(*) from th t1 join th t2 join th t3 join th t4 join th t5 join th t6 where t1.i=t2.a and t1.i=t3.i and t3.i=t4.i and t4.i=t5.i and t5.i=t6.i" + tk.Se.GetSessionVars().PlanID = 0 + tk.MustExec(query) + info := tk.Se.ShowProcess() + c.Assert(info, NotNil) + p, ok := info.Plan.(core.PhysicalPlan) + c.Assert(ok, IsTrue) + tk.Se.GetSessionVars().StmtCtx.RuntimeStatsColl = nil + c.ResetTimer() + for i := 0; i < c.N; i++ { + core.EncodePlan(p) + } } diff --git a/planner/core/plan_to_pb.go b/planner/core/plan_to_pb.go index 97ec3dc8dd884..185e750c0974c 100644 --- a/planner/core/plan_to_pb.go +++ b/planner/core/plan_to_pb.go @@ -16,6 +16,7 @@ package core import ( "github.com/pingcap/errors" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/distsql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/expression/aggregation" @@ -110,6 +111,31 @@ func (p *PhysicalSelection) ToPB(ctx sessionctx.Context, storeType kv.StoreType) return &tipb.Executor{Tp: tipb.ExecType_TypeSelection, Selection: selExec, ExecutorId: &executorID}, nil } +// ToPB implements PhysicalPlan ToPB interface. +func (p *PhysicalProjection) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { + sc := ctx.GetSessionVars().StmtCtx + client := ctx.GetClient() + exprs, err := expression.ExpressionsToPBList(sc, p.Exprs, client) + if err != nil { + return nil, err + } + projExec := &tipb.Projection{ + Exprs: exprs, + } + executorID := "" + if storeType == kv.TiFlash { + var err error + projExec.Child, err = p.children[0].ToPB(ctx, storeType) + if err != nil { + return nil, errors.Trace(err) + } + executorID = p.ExplainID().String() + } else { + return nil, errors.Errorf("The projection can only be pushed down to TiFlash now, not %s.", storeType.Name()) + } + return &tipb.Executor{Tp: tipb.ExecType_TypeProjection, Projection: projExec, ExecutorId: &executorID}, nil +} + // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalTopN) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { sc := ctx.GetSessionVars().StmtCtx @@ -159,7 +185,11 @@ func (p *PhysicalTableScan) ToPB(ctx sessionctx.Context, storeType kv.StoreType) executorID := "" if storeType == kv.TiFlash && p.IsGlobalRead { tsExec.NextReadEngine = tipb.EngineType_TiFlash - ranges := distsql.TableRangesToKVRanges(tsExec.TableId, p.Ranges, nil) + splitedRanges, _ := distsql.SplitRangesBySign(p.Ranges, false, false, p.Table.IsCommonHandle) + ranges, err := distsql.TableHandleRangesToKVRanges(ctx.GetSessionVars().StmtCtx, []int64{tsExec.TableId}, p.Table.IsCommonHandle, splitedRanges, nil) + if err != nil { + return nil, err + } for _, keyRange := range ranges { tsExec.Ranges = append(tsExec.Ranges, tipb.KeyRange{Low: keyRange.StartKey, High: keyRange.EndKey}) } @@ -195,6 +225,77 @@ func findColumnInfoByID(infos []*model.ColumnInfo, id int64) *model.ColumnInfo { return nil } +// ToPB generates the pb structure. +func (e *PhysicalExchangeSender) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { + child, err := e.Children()[0].ToPB(ctx, kv.TiFlash) + if err != nil { + return nil, errors.Trace(err) + } + + encodedTask := make([][]byte, 0, len(e.TargetTasks)) + + for _, task := range e.TargetTasks { + encodedStr, err := task.ToPB().Marshal() + if err != nil { + return nil, errors.Trace(err) + } + encodedTask = append(encodedTask, encodedStr) + } + + hashCols := make([]expression.Expression, 0, len(e.HashCols)) + for _, col := range e.HashCols { + hashCols = append(hashCols, col) + } + hashColPb, err := expression.ExpressionsToPBList(ctx.GetSessionVars().StmtCtx, hashCols, ctx.GetClient()) + if err != nil { + return nil, errors.Trace(err) + } + ecExec := &tipb.ExchangeSender{ + Tp: e.ExchangeType, + EncodedTaskMeta: encodedTask, + PartitionKeys: hashColPb, + Child: child, + } + executorID := e.ExplainID().String() + return &tipb.Executor{ + Tp: tipb.ExecType_TypeExchangeSender, + ExchangeSender: ecExec, + ExecutorId: &executorID, + }, nil +} + +// ToPB generates the pb structure. +func (e *PhysicalExchangeReceiver) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { + encodedTask := make([][]byte, 0, len(e.Tasks)) + + for _, task := range e.Tasks { + encodedStr, err := task.ToPB().Marshal() + if err != nil { + return nil, errors.Trace(err) + } + encodedTask = append(encodedTask, encodedStr) + } + + fieldTypes := make([]*tipb.FieldType, 0, len(e.Schema().Columns)) + for _, column := range e.Schema().Columns { + pbType := expression.ToPBFieldType(column.RetType) + if column.RetType.Tp == mysql.TypeEnum { + pbType.Elems = append(pbType.Elems, column.RetType.Elems...) + } + fieldTypes = append(fieldTypes, pbType) + } + ecExec := &tipb.ExchangeReceiver{ + EncodedTaskMeta: encodedTask, + FieldTypes: fieldTypes, + } + executorID := e.ExplainID().String() + return &tipb.Executor{ + Tp: tipb.ExecType_TypeExchangeReceiver, + ExchangeReceiver: ecExec, + ExecutorId: &executorID, + }, nil +} + // ToPB implements PhysicalPlan ToPB interface. func (p *PhysicalIndexScan) ToPB(ctx sessionctx.Context, _ kv.StoreType) (*tipb.Executor, error) { columns := make([]*model.ColumnInfo, 0, p.schema.Len()) @@ -228,7 +329,7 @@ func (p *PhysicalIndexScan) ToPB(ctx sessionctx.Context, _ kv.StoreType) (*tipb. } // ToPB implements PhysicalPlan ToPB interface. -func (p *PhysicalBroadCastJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { +func (p *PhysicalHashJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreType) (*tipb.Executor, error) { sc := ctx.GetSessionVars().StmtCtx client := ctx.GetClient() leftJoinKeys := make([]expression.Expression, 0, len(p.LeftJoinKeys)) @@ -256,20 +357,57 @@ func (p *PhysicalBroadCastJoin) ToPB(ctx sessionctx.Context, storeType kv.StoreT if err != nil { return nil, err } + + leftConditions, err := expression.ExpressionsToPBList(sc, p.LeftConditions, client) + if err != nil { + return nil, err + } + rightConditions, err := expression.ExpressionsToPBList(sc, p.RightConditions, client) + if err != nil { + return nil, err + } + otherConditions, err := expression.ExpressionsToPBList(sc, p.OtherConditions, client) + if err != nil { + return nil, err + } + pbJoinType := tipb.JoinType_TypeInnerJoin switch p.JoinType { case LeftOuterJoin: pbJoinType = tipb.JoinType_TypeLeftOuterJoin case RightOuterJoin: pbJoinType = tipb.JoinType_TypeRightOuterJoin + case SemiJoin: + pbJoinType = tipb.JoinType_TypeSemiJoin + case AntiSemiJoin: + pbJoinType = tipb.JoinType_TypeAntiSemiJoin + case LeftOuterSemiJoin: + pbJoinType = tipb.JoinType_TypeLeftOuterSemiJoin + case AntiLeftOuterSemiJoin: + pbJoinType = tipb.JoinType_TypeAntiLeftOuterSemiJoin + } + probeFiledTypes := make([]*tipb.FieldType, 0, len(p.EqualConditions)) + buildFiledTypes := make([]*tipb.FieldType, 0, len(p.EqualConditions)) + for _, equalCondition := range p.EqualConditions { + retType := equalCondition.RetType.Clone() + chs, coll := equalCondition.CharsetAndCollation(ctx) + retType.Charset = chs + retType.Collate = coll + probeFiledTypes = append(probeFiledTypes, expression.ToPBFieldType(retType)) + buildFiledTypes = append(buildFiledTypes, expression.ToPBFieldType(retType)) } join := &tipb.Join{ - JoinType: pbJoinType, - JoinExecType: tipb.JoinExecType_TypeHashJoin, - InnerIdx: int64(p.InnerChildIdx), - LeftJoinKeys: left, - RightJoinKeys: right, - Children: []*tipb.Executor{lChildren, rChildren}, + JoinType: pbJoinType, + JoinExecType: tipb.JoinExecType_TypeHashJoin, + InnerIdx: int64(p.InnerChildIdx), + LeftJoinKeys: left, + RightJoinKeys: right, + ProbeTypes: probeFiledTypes, + BuildTypes: buildFiledTypes, + LeftConditions: leftConditions, + RightConditions: rightConditions, + OtherConditions: otherConditions, + Children: []*tipb.Executor{lChildren, rChildren}, } executorID := p.ExplainID().String() diff --git a/planner/core/planbuilder.go b/planner/core/planbuilder.go index 3b77a3daaa02f..7929df815721a 100644 --- a/planner/core/planbuilder.go +++ b/planner/core/planbuilder.go @@ -30,6 +30,7 @@ import ( "github.com/pingcap/parser/opcode" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" + "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -58,11 +59,12 @@ import ( ) type visitInfo struct { - privilege mysql.PrivilegeType - db string - table string - column string - err error + privilege mysql.PrivilegeType + db string + table string + column string + err error + alterWritable bool } type indexNestedLoopJoinTables struct { @@ -151,7 +153,7 @@ func (tr *QueryTimeRange) Condition() string { return fmt.Sprintf("where time>='%s' and time<='%s'", tr.From.Format(MetricTableTimeFormat), tr.To.Format(MetricTableTimeFormat)) } -func tableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTables []ast.HintTable, p *hint.BlockHintProcessor, nodeType hint.NodeType, currentOffset int) []hintTableInfo { +func tableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTables []ast.HintTable, p *hint.BlockHintProcessor, currentOffset int) []hintTableInfo { if len(hintTables) == 0 { return nil } @@ -163,7 +165,7 @@ func tableNames2HintTableInfo(ctx sessionctx.Context, hintName string, hintTable dbName: hintTable.DBName, tblName: hintTable.TableName, partitions: hintTable.PartitionList, - selectOffset: p.GetHintOffset(hintTable.QBName, nodeType, currentOffset), + selectOffset: p.GetHintOffset(hintTable.QBName, currentOffset), } if tableInfo.dbName.L == "" { tableInfo.dbName = defaultDBName @@ -372,6 +374,8 @@ const ( showStatement globalOrderByClause expressionClause + windowOrderByClause + partitionByClause ) var clauseMsg = map[clauseCode]string{ @@ -385,6 +389,8 @@ var clauseMsg = map[clauseCode]string{ showStatement: "show statement", globalOrderByClause: "global ORDER clause", expressionClause: "expression", + windowOrderByClause: "window order by", + partitionByClause: "window partition by", } type capFlagType = uint64 @@ -394,9 +400,9 @@ const ( // canExpandAST indicates whether the origin AST can be expanded during plan // building. ONLY used for `CreateViewStmt` now. canExpandAST - // collectUnderlyingViewName indicates whether to collect the underlying - // view names of a CreateViewStmt during plan building. - collectUnderlyingViewName + // renameView indicates a view is being renamed, so we cannot use the origin + // definition of that view. + renameView ) // PlanBuilder builds Plan from an ast.Node. @@ -446,12 +452,28 @@ type PlanBuilder struct { // SelectLock need this information to locate the lock on partitions. partitionedTable []table.PartitionedTable - // CreateView needs this information to check whether exists nested view. - underlyingViewNames set.StringSet + // buildingViewStack is used to check whether there is a recursive view. + buildingViewStack set.StringSet + // renamingViewName is the name of the view which is being renamed. + renamingViewName string // evalDefaultExpr needs this information to find the corresponding column. // It stores the OutputNames before buildProjection. allNames [][]*types.FieldName + + // isSampling indicates whether the query is sampling. + isSampling bool + + // correlatedAggMapper stores columns for correlated aggregates which should be evaluated in outer query. + correlatedAggMapper map[*ast.AggregateFuncExpr]*expression.CorrelatedColumn + + // cache ResultSetNodes and HandleHelperMap to avoid rebuilding. + cachedResultSetNodes map[*ast.Join]LogicalPlan + cachedHandleHelperMap map[*ast.Join]map[int64][]HandleCols + // isForUpdateRead should be true in either of the following situations + // 1. use `inside insert`, `update`, `delete` or `select for update` statement + // 2. isolation level is RC + isForUpdateRead bool } type handleColHelper struct { @@ -524,6 +546,11 @@ func (b *PlanBuilder) GetDBTableInfo() []stmtctx.TableEntry { // GetOptFlag gets the optFlag of the PlanBuilder. func (b *PlanBuilder) GetOptFlag() uint64 { + if b.isSampling { + // Disable logical optimization to avoid the optimizer + // push down/eliminate operands like Selection, Limit or Sort. + return 0 + } return b.optFlag } @@ -542,20 +569,26 @@ func (b *PlanBuilder) popSelectOffset() { b.selectOffset = b.selectOffset[:len(b.selectOffset)-1] } -// NewPlanBuilder creates a new PlanBuilder. -func NewPlanBuilder(sctx sessionctx.Context, is infoschema.InfoSchema, processor *hint.BlockHintProcessor) *PlanBuilder { +// NewPlanBuilder creates a new PlanBuilder. Return the original PlannerSelectBlockAsName as well, callers decide if +// PlannerSelectBlockAsName should be restored after using this builder. +func NewPlanBuilder(sctx sessionctx.Context, is infoschema.InfoSchema, processor *hint.BlockHintProcessor) (*PlanBuilder, []ast.HintTable) { + savedBlockNames := sctx.GetSessionVars().PlannerSelectBlockAsName if processor == nil { sctx.GetSessionVars().PlannerSelectBlockAsName = nil } else { sctx.GetSessionVars().PlannerSelectBlockAsName = make([]ast.HintTable, processor.MaxSelectStmtOffset()+1) } return &PlanBuilder{ - ctx: sctx, - is: is, - colMapper: make(map[*ast.ColumnNameExpr]int), - handleHelper: &handleColHelper{id2HandleMapStack: make([]map[int64][]HandleCols, 0)}, - hintProcessor: processor, - } + ctx: sctx, + is: is, + colMapper: make(map[*ast.ColumnNameExpr]int), + handleHelper: &handleColHelper{id2HandleMapStack: make([]map[int64][]HandleCols, 0)}, + hintProcessor: processor, + correlatedAggMapper: make(map[*ast.AggregateFuncExpr]*expression.CorrelatedColumn), + cachedResultSetNodes: make(map[*ast.Join]LogicalPlan), + cachedHandleHelperMap: make(map[*ast.Join]map[int64][]HandleCols), + isForUpdateRead: sctx.GetSessionVars().IsPessimisticReadConsistency(), + }, savedBlockNames } // Build builds the ast node to a Plan. @@ -608,8 +641,7 @@ func (b *PlanBuilder) Build(ctx context.Context, node ast.Node) (Plan, error) { case *ast.BinlogStmt, *ast.FlushStmt, *ast.UseStmt, *ast.BRIEStmt, *ast.BeginStmt, *ast.CommitStmt, *ast.RollbackStmt, *ast.CreateUserStmt, *ast.SetPwdStmt, *ast.AlterInstanceStmt, *ast.GrantStmt, *ast.DropUserStmt, *ast.AlterUserStmt, *ast.RevokeStmt, *ast.KillStmt, *ast.DropStatsStmt, - *ast.GrantRoleStmt, *ast.RevokeRoleStmt, *ast.SetRoleStmt, *ast.SetDefaultRoleStmt, *ast.ShutdownStmt, - *ast.CreateStatisticsStmt, *ast.DropStatisticsStmt: + *ast.GrantRoleStmt, *ast.RevokeRoleStmt, *ast.SetRoleStmt, *ast.SetDefaultRoleStmt, *ast.ShutdownStmt: return b.buildSimple(node.(ast.StmtNode)) case ast.DDLNode: return b.buildDDL(ctx, x) @@ -724,23 +756,52 @@ func (b *PlanBuilder) buildSet(ctx context.Context, v *ast.SetStmt) (Plan, error func (b *PlanBuilder) buildDropBindPlan(v *ast.DropBindingStmt) (Plan, error) { p := &SQLBindPlan{ SQLBindOp: OpSQLBindDrop, - NormdOrigSQL: parser.Normalize(v.OriginNode.Text()), + NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), IsGlobal: v.GlobalScope, Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), } if v.HintedNode != nil { - p.BindSQL = v.HintedNode.Text() + p.BindSQL = utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()) } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) return p, nil } +func checkHintedSQL(sql, charset, collation, db string) error { + p := parser.New() + hintsSet, _, warns, err := hint.ParseHintsSet(p, sql, charset, collation, db) + if err != nil { + return err + } + hintsStr, err := hintsSet.Restore() + if err != nil { + return err + } + // For `create global binding for select * from t using select * from t`, we allow it though hintsStr is empty. + // For `create global binding for select * from t using select /*+ non_exist_hint() */ * from t`, + // the hint is totally invalid, we escalate warning to error. + if hintsStr == "" && len(warns) > 0 { + return warns[0] + } + return nil +} + func (b *PlanBuilder) buildCreateBindPlan(v *ast.CreateBindingStmt) (Plan, error) { charSet, collation := b.ctx.GetSessionVars().GetCharsetInfo() + + // Because we use HintedNode.Restore instead of HintedNode.Text, so we need do some check here + // For example, if HintedNode.Text is `select /*+ non_exist_hint() */ * from t` and the current DB is `test`, + // the HintedNode.Restore will be `select * from test . t`. + // In other words, illegal hints will be deleted during restore. We can't check hinted SQL after restore. + // So we need check here. + if err := checkHintedSQL(v.HintedNode.Text(), charSet, collation, b.ctx.GetSessionVars().CurrentDB); err != nil { + return nil, err + } + p := &SQLBindPlan{ SQLBindOp: OpSQLBindCreate, - NormdOrigSQL: parser.Normalize(v.OriginNode.Text()), - BindSQL: v.HintedNode.Text(), + NormdOrigSQL: parser.Normalize(utilparser.RestoreWithDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB, v.OriginNode.Text())), + BindSQL: utilparser.RestoreWithDefaultDB(v.HintedNode, b.ctx.GetSessionVars().CurrentDB, v.HintedNode.Text()), IsGlobal: v.GlobalScope, BindStmt: v.HintedNode, Db: utilparser.GetDefaultDB(v.OriginNode, b.ctx.GetSessionVars().CurrentDB), @@ -757,6 +818,9 @@ func (b *PlanBuilder) detectSelectAgg(sel *ast.SelectStmt) bool { return true } for _, f := range sel.Fields.Fields { + if f.WildCard != nil { + continue + } if ast.HasAggFlag(f.Expr) { return true } @@ -833,7 +897,39 @@ func fillContentForTablePath(tablePath *util.AccessPath, tblInfo *model.TableInf } } -func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, indexHints []*ast.IndexHint, tbl table.Table, dbName, tblName model.CIStr) ([]*util.AccessPath, error) { +// isForUpdateReadSelectLock checks if the lock type need to use forUpdateRead +func isForUpdateReadSelectLock(lock *ast.SelectLockInfo) bool { + if lock == nil { + return false + } + return lock.LockType == ast.SelectLockForUpdate || + lock.LockType == ast.SelectLockForUpdateNoWait || + lock.LockType == ast.SelectLockForUpdateWaitN +} + +// getLatestIndexInfo gets the index info of latest schema version from given table id, +// it returns nil if the schema version is not changed +func getLatestIndexInfo(ctx sessionctx.Context, id int64, startVer int64) (map[int64]*model.IndexInfo, bool, error) { + dom := domain.GetDomain(ctx) + if dom == nil { + return nil, false, errors.New("domain not found for ctx") + } + is := dom.InfoSchema() + if is.SchemaMetaVersion() == startVer { + return nil, false, nil + } + latestIndexes := make(map[int64]*model.IndexInfo) + latestTbl, exist := is.TableByID(id) + if exist { + latestTblInfo := latestTbl.Meta() + for _, index := range latestTblInfo.Indices { + latestIndexes[index.ID] = index + } + } + return latestIndexes, true, nil +} + +func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, indexHints []*ast.IndexHint, tbl table.Table, dbName, tblName model.CIStr, check bool, startVer int64) ([]*util.AccessPath, error) { tblInfo := tbl.Meta() publicPaths := make([]*util.AccessPath, 0, len(tblInfo.Indices)+2) tp := kv.TiKV @@ -848,6 +944,11 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i publicPaths = append(publicPaths, genTiFlashPath(tblInfo, true)) } optimizerUseInvisibleIndexes := ctx.GetSessionVars().OptimizerUseInvisibleIndexes + + check = check && ctx.GetSessionVars().ConnectionID > 0 + var latestIndexes map[int64]*model.IndexInfo + var err error + for _, index := range tblInfo.Indices { if index.State == model.StatePublic { // Filter out invisible index, because they are not visible for optimizer @@ -857,6 +958,17 @@ func getPossibleAccessPaths(ctx sessionctx.Context, tableHints *tableHintInfo, i if tblInfo.IsCommonHandle && index.Primary { continue } + if check && latestIndexes == nil { + latestIndexes, check, err = getLatestIndexInfo(ctx, tblInfo.ID, 0) + if err != nil { + return nil, err + } + } + if check { + if latestIndex, ok := latestIndexes[index.ID]; !ok || latestIndex.State != model.StatePublic { + continue + } + } publicPaths = append(publicPaths, &util.AccessPath{Index: index}) } } @@ -1001,7 +1113,12 @@ func (b *PlanBuilder) buildPrepare(x *ast.PrepareStmt) Plan { } if x.SQLVar != nil { if v, ok := b.ctx.GetSessionVars().Users[strings.ToLower(x.SQLVar.Name)]; ok { - p.SQLText = v.GetString() + var err error + p.SQLText, err = v.ToString() + if err != nil { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(err) + p.SQLText = "NULL" + } } else { p.SQLText = "NULL" } @@ -1107,51 +1224,6 @@ func (b *PlanBuilder) buildAdmin(ctx context.Context, as *ast.AdminStmt) (Plan, return ret, nil } -// getGenExprs gets generated expressions map. -func (b *PlanBuilder) getGenExprs(ctx context.Context, dbName model.CIStr, tbl table.Table, idx *model.IndexInfo, exprCols *expression.Schema, names types.NameSlice) ( - map[model.TableColumnID]expression.Expression, error) { - tblInfo := tbl.Meta() - genExprsMap := make(map[model.TableColumnID]expression.Expression) - exprs := make([]expression.Expression, 0, len(tbl.Cols())) - genExprIdxs := make([]model.TableColumnID, len(tbl.Cols())) - mockTablePlan := LogicalTableDual{}.Init(b.ctx, b.getSelectOffset()) - mockTablePlan.SetSchema(exprCols) - mockTablePlan.names = names - for i, colExpr := range mockTablePlan.Schema().Columns { - col := tbl.Cols()[i] - var expr expression.Expression - expr = colExpr - if col.IsGenerated() && !col.GeneratedStored { - var err error - expr, _, err = b.rewrite(ctx, col.GeneratedExpr, mockTablePlan, nil, true) - if err != nil { - return nil, errors.Trace(err) - } - found := false - for _, column := range idx.Columns { - if strings.EqualFold(col.Name.L, column.Name.L) { - found = true - break - } - } - if found { - genColumnID := model.TableColumnID{TableID: tblInfo.ID, ColumnID: col.ColumnInfo.ID} - genExprsMap[genColumnID] = expr - genExprIdxs[i] = genColumnID - } - } - exprs = append(exprs, expr) - } - // Re-iterate expressions to handle those virtual generated columns that refers to the other generated columns. - for i, expr := range exprs { - exprs[i] = expression.ColumnSubstitute(expr, mockTablePlan.Schema(), exprs) - if _, ok := genExprsMap[genExprIdxs[i]]; ok { - genExprsMap[genExprIdxs[i]] = exprs[i] - } - } - return genExprsMap, nil -} - // FindColumnInfoByID finds ColumnInfo in cols by ID. func FindColumnInfoByID(colInfos []*model.ColumnInfo, id int64) *model.ColumnInfo { for _, info := range colInfos { @@ -1244,7 +1316,7 @@ func (b *PlanBuilder) buildPhysicalIndexLookUpReader(ctx context.Context, dbName extraHandleCol: extraCol, commonHandleCols: commonCols, } - rootT := finishCopTask(b.ctx, cop).(*rootTask) + rootT := cop.convertToRootTask(b.ctx) if err := rootT.p.ResolveIndices(); err != nil { return nil, err } @@ -1322,13 +1394,44 @@ func (b *PlanBuilder) buildPhysicalIndexLookUpReaders(ctx context.Context, dbNam // get index information indexInfos := make([]*model.IndexInfo, 0, len(tblInfo.Indices)) indexLookUpReaders := make([]Plan, 0, len(tblInfo.Indices)) + + check := b.isForUpdateRead && b.ctx.GetSessionVars().ConnectionID > 0 + var latestIndexes map[int64]*model.IndexInfo + var err error + for _, idx := range indices { idxInfo := idx.Meta() + if tblInfo.IsCommonHandle && idxInfo.Primary { + // Skip checking clustered index. + continue + } if idxInfo.State != model.StatePublic { - logutil.Logger(context.Background()).Info("build physical index lookup reader, the index isn't public", - zap.String("index", idxInfo.Name.O), zap.Stringer("state", idxInfo.State), zap.String("table", tblInfo.Name.O)) + logutil.Logger(ctx).Info("build physical index lookup reader, the index isn't public", + zap.String("index", idxInfo.Name.O), + zap.Stringer("state", idxInfo.State), + zap.String("table", tblInfo.Name.O)) continue } + if check && latestIndexes == nil { + latestIndexes, check, err = getLatestIndexInfo(b.ctx, tblInfo.ID, b.is.SchemaMetaVersion()) + if err != nil { + return nil, nil, err + } + } + if check { + if latestIndex, ok := latestIndexes[idxInfo.ID]; !ok || latestIndex.State != model.StatePublic { + forUpdateState := model.StateNone + if ok { + forUpdateState = latestIndex.State + } + logutil.Logger(ctx).Info("build physical index lookup reader, the index isn't public in forUpdateRead", + zap.String("index", idxInfo.Name.O), + zap.Stringer("state", idxInfo.State), + zap.Stringer("forUpdateRead state", forUpdateState), + zap.String("table", tblInfo.Name.O)) + continue + } + } indexInfos = append(indexInfos, idxInfo) // For partition tables. if pi := tbl.Meta().GetPartitionInfo(); pi != nil { @@ -1495,7 +1598,8 @@ func BuildHandleColsForAnalyze(ctx sessionctx.Context, tblInfo *model.TableInfo) return handleCols } -func getPhysicalIDsAndPartitionNames(tblInfo *model.TableInfo, partitionNames []model.CIStr) ([]int64, []string, error) { +// GetPhysicalIDsAndPartitionNames returns physical IDs and names of these partitions. +func GetPhysicalIDsAndPartitionNames(tblInfo *model.TableInfo, partitionNames []model.CIStr) ([]int64, []string, error) { pi := tblInfo.GetPartitionInfo() if pi == nil { if len(partitionNames) != 0 { @@ -1531,13 +1635,8 @@ func getPhysicalIDsAndPartitionNames(tblInfo *model.TableInfo, partitionNames [] return ids, names, nil } -func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { +func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64, version int) (Plan, error) { p := &Analyze{Opts: opts} - pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) - if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { - logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("partitions", as.PartitionNames[0].L)) - return p, nil - } for _, tbl := range as.TableNames { if tbl.TableInfo.IsView() { return nil, errors.Errorf("analyze view %s is not supported now.", tbl.Name.O) @@ -1546,25 +1645,41 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A return nil, errors.Errorf("analyze sequence %s is not supported now.", tbl.Name.O) } idxInfo, colInfo := getColsInfo(tbl) - physicalIDs, names, err := getPhysicalIDsAndPartitionNames(tbl.TableInfo, as.PartitionNames) + physicalIDs, names, err := GetPhysicalIDsAndPartitionNames(tbl.TableInfo, as.PartitionNames) if err != nil { return nil, err } + var commonHandleInfo *model.IndexInfo + // If we want to analyze this table with analyze version 2 but the existing stats is version 1 and stats feedback is enabled, + // we will switch back to analyze version 1. + if statistics.FeedbackProbability.Load() > 0 && version == 2 { + statsHandle := domain.GetDomain(b.ctx).StatsHandle() + versionIsSame := statsHandle.CheckAnalyzeVersion(tbl.TableInfo, physicalIDs, &version) + if !versionIsSame { + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(fmt.Sprintf("Use analyze version 1 on table `%s` ", tbl.Name) + + "because this table already has version 1 statistics and query feedback is also enabled. " + + "If you want to switch to version 2 statistics, please first disable query feedback by setting feedback-probability to 0.0 in the config file.")) + } + } for _, idx := range idxInfo { - if pruneMode == variable.StaticOnly || (pruneMode == variable.StaticButPrepareDynamic && !b.ctx.GetSessionVars().InRestrictedSQL) { - // static mode or static-but-prepare-dynamic mode not belong auto analyze need analyze each partition - // for static-but-prepare-dynamic mode with auto analyze, echo partition will be check before analyze partition. - for i, id := range physicalIDs { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{ - IndexInfo: idx, - analyzeInfo: info, - TblInfo: tbl.TableInfo, - }) - } + // For prefix common handle. We don't use analyze mixed to handle it with columns. Because the full value + // is read by coprocessor, the prefix index would get wrong stats in this case. + if idx.Primary && tbl.TableInfo.IsCommonHandle && !idx.HasPrefixIndex() { + commonHandleInfo = idx + continue } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, TableID: AnalyzeTableID{PersistID: tbl.TableInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} + for i, id := range physicalIDs { + if id == tbl.TableInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: tbl.Schema.O, + TableName: tbl.Name.O, + PartitionName: names[i], + TableID: AnalyzeTableID{TableID: tbl.TableInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, + } p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{ IndexInfo: idx, analyzeInfo: info, @@ -1574,24 +1689,24 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A } handleCols := BuildHandleColsForAnalyze(b.ctx, tbl.TableInfo) if len(colInfo) > 0 || handleCols != nil { - if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{ - HandleCols: handleCols, - ColsInfo: colInfo, - analyzeInfo: info, - TblInfo: tbl.TableInfo, - }) + for i, id := range physicalIDs { + if id == tbl.TableInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: tbl.Schema.O, + TableName: tbl.Name.O, + PartitionName: names[i], + TableID: AnalyzeTableID{TableID: tbl.TableInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, } - } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: tbl.Schema.O, TableName: tbl.Name.O, TableID: AnalyzeTableID{PersistID: tbl.TableInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{ - HandleCols: handleCols, - ColsInfo: colInfo, - analyzeInfo: info, - TblInfo: tbl.TableInfo, + HandleCols: handleCols, + CommonHandleInfo: commonHandleInfo, + ColsInfo: colInfo, + analyzeInfo: info, + TblInfo: tbl.TableInfo, }) } } @@ -1599,30 +1714,40 @@ func (b *PlanBuilder) buildAnalyzeTable(as *ast.AnalyzeTableStmt, opts map[ast.A return p, nil } -func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { +func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64, version int) (Plan, error) { p := &Analyze{Opts: opts} tblInfo := as.TableNames[0].TableInfo - pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) - if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { - logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("table", tblInfo.Name.L), zap.String("partitions", as.PartitionNames[0].L)) - return p, nil - } - physicalIDs, names, err := getPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) + physicalIDs, names, err := GetPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) if err != nil { return nil, err } + statsHandle := domain.GetDomain(b.ctx).StatsHandle() + if statsHandle == nil { + return nil, errors.Errorf("statistics hasn't been initialized, please try again later") + } + versionIsSame := statsHandle.CheckAnalyzeVersion(tblInfo, physicalIDs, &version) + if !versionIsSame { + if b.ctx.GetSessionVars().EnableFastAnalyze { + return nil, errors.Errorf("Fast analyze hasn't reached General Availability and only support analyze version 1 currently. But the existing statistics of the table is not version 1.") + } + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + } for _, idxName := range as.IndexNames { if isPrimaryIndex(idxName) { handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) - if handleCols != nil { - if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) + // Fast analyze use analyze column to solve int handle. + if handleCols != nil && handleCols.IsInt() && b.ctx.GetSessionVars().EnableFastAnalyze { + for i, id := range physicalIDs { + if id == tblInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: as.TableNames[0].Schema.O, + TableName: as.TableNames[0].Name.O, + PartitionName: names[i], TableID: AnalyzeTableID{TableID: tblInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, } - } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) } continue @@ -1632,69 +1757,88 @@ func (b *PlanBuilder) buildAnalyzeIndex(as *ast.AnalyzeTableStmt, opts map[ast.A if idx == nil || idx.State != model.StatePublic { return nil, ErrAnalyzeMissIndex.GenWithStackByArgs(idxName.O, tblInfo.Name.O) } - if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) + for i, id := range physicalIDs { + if id == tblInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: as.TableNames[0].Schema.O, + TableName: as.TableNames[0].Name.O, + PartitionName: names[i], + TableID: AnalyzeTableID{TableID: tblInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, } - } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) } } return p, nil } -func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64) (Plan, error) { +func (b *PlanBuilder) buildAnalyzeAllIndex(as *ast.AnalyzeTableStmt, opts map[ast.AnalyzeOptionType]uint64, version int) (Plan, error) { p := &Analyze{Opts: opts} tblInfo := as.TableNames[0].TableInfo - pruneMode := variable.PartitionPruneMode(b.ctx.GetSessionVars().PartitionPruneMode.Load()) - if len(as.PartitionNames) > 0 && pruneMode == variable.DynamicOnly { - logutil.BgLogger().Info("analyze partition didn't affect in dynamic-prune-mode", zap.String("table", tblInfo.Name.L), zap.String("partitions", as.PartitionNames[0].L)) - return p, nil - } - physicalIDs, names, err := getPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) + physicalIDs, names, err := GetPhysicalIDsAndPartitionNames(tblInfo, as.PartitionNames) if err != nil { return nil, err } + statsHandle := domain.GetDomain(b.ctx).StatsHandle() + if statsHandle == nil { + return nil, errors.Errorf("statistics hasn't been initialized, please try again later") + } + versionIsSame := statsHandle.CheckAnalyzeVersion(tblInfo, physicalIDs, &version) + if !versionIsSame { + if b.ctx.GetSessionVars().EnableFastAnalyze { + return nil, errors.Errorf("Fast analyze hasn't reached General Availability and only support analyze version 1 currently. But the existing statistics of the table is not version 1.") + } + b.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + } for _, idx := range tblInfo.Indices { if idx.State == model.StatePublic { - if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) + for i, id := range physicalIDs { + if id == tblInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: as.TableNames[0].Schema.O, + TableName: as.TableNames[0].Name.O, + PartitionName: names[i], + TableID: AnalyzeTableID{TableID: tblInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, } - } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.IdxTasks = append(p.IdxTasks, AnalyzeIndexTask{IndexInfo: idx, analyzeInfo: info, TblInfo: tblInfo}) } } } handleCols := BuildHandleColsForAnalyze(b.ctx, tblInfo) if handleCols != nil { - if pruneMode == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for i, id := range physicalIDs { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, PartitionName: names[i], TableID: AnalyzeTableID{PersistID: id, CollectIDs: []int64{id}}, Incremental: as.Incremental} - p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) + for i, id := range physicalIDs { + if id == tblInfo.ID { + id = -1 + } + info := analyzeInfo{ + DBName: as.TableNames[0].Schema.O, + TableName: as.TableNames[0].Name.O, + PartitionName: names[i], + TableID: AnalyzeTableID{TableID: tblInfo.ID, PartitionID: id}, + Incremental: as.Incremental, + StatsVersion: version, } - } - if pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { - info := analyzeInfo{DBName: as.TableNames[0].Schema.O, TableName: as.TableNames[0].Name.O, TableID: AnalyzeTableID{PersistID: tblInfo.ID, CollectIDs: physicalIDs}, Incremental: as.Incremental} p.ColTasks = append(p.ColTasks, AnalyzeColumnsTask{HandleCols: handleCols, analyzeInfo: info, TblInfo: tblInfo}) } } return p, nil } -var cmSketchSizeLimit = kv.TxnEntrySizeLimit / binary.MaxVarintLen32 +// CMSketchSizeLimit indicates the size limit of CMSketch. +var CMSketchSizeLimit = kv.TxnEntrySizeLimit / binary.MaxVarintLen32 var analyzeOptionLimit = map[ast.AnalyzeOptionType]uint64{ ast.AnalyzeOptNumBuckets: 1024, ast.AnalyzeOptNumTopN: 1024, - ast.AnalyzeOptCMSketchWidth: cmSketchSizeLimit, - ast.AnalyzeOptCMSketchDepth: cmSketchSizeLimit, + ast.AnalyzeOptCMSketchWidth: CMSketchSizeLimit, + ast.AnalyzeOptCMSketchDepth: CMSketchSizeLimit, ast.AnalyzeOptNumSamples: 100000, } @@ -1723,8 +1867,8 @@ func handleAnalyzeOptions(opts []ast.AnalyzeOpt) (map[ast.AnalyzeOptionType]uint } optMap[opt.Type] = opt.Value } - if optMap[ast.AnalyzeOptCMSketchWidth]*optMap[ast.AnalyzeOptCMSketchDepth] > cmSketchSizeLimit { - return nil, errors.Errorf("cm sketch size(depth * width) should not larger than %d", cmSketchSizeLimit) + if optMap[ast.AnalyzeOptCMSketchWidth]*optMap[ast.AnalyzeOptCMSketchDepth] > CMSketchSizeLimit { + return nil, errors.Errorf("cm sketch size(depth * width) should not larger than %d", CMSketchSizeLimit) } return optMap, nil } @@ -1734,6 +1878,10 @@ func (b *PlanBuilder) buildAnalyze(as *ast.AnalyzeTableStmt) (Plan, error) { if _, isTikvStorage := b.ctx.GetStore().(tikv.Storage); !isTikvStorage && b.ctx.GetSessionVars().EnableFastAnalyze { return nil, errors.Errorf("Only support fast analyze in tikv storage.") } + statsVersion := b.ctx.GetSessionVars().AnalyzeVersion + if b.ctx.GetSessionVars().EnableFastAnalyze && statsVersion == statistics.Version2 { + return nil, errors.Errorf("Fast analyze hasn't reached General Availability and only support analyze version 1 currently.") + } for _, tbl := range as.TableNames { user := b.ctx.GetSessionVars().User var insertErr, selectErr error @@ -1750,11 +1898,11 @@ func (b *PlanBuilder) buildAnalyze(as *ast.AnalyzeTableStmt) (Plan, error) { } if as.IndexFlag { if len(as.IndexNames) == 0 { - return b.buildAnalyzeAllIndex(as, opts) + return b.buildAnalyzeAllIndex(as, opts, statsVersion) } - return b.buildAnalyzeIndex(as, opts) + return b.buildAnalyzeIndex(as, opts, statsVersion) } - return b.buildAnalyzeTable(as, opts) + return b.buildAnalyzeTable(as, opts, statsVersion) } func buildShowNextRowID() (*expression.Schema, types.NameSlice) { @@ -1997,7 +2145,7 @@ func (b *PlanBuilder) buildShow(ctx context.Context, show *ast.ShowStmt) (Plan, p.setSchemaAndNames(buildShowNextRowID()) b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, show.Table.Schema.L, show.Table.Name.L, "", ErrPrivilegeCheckFail) return p, nil - case ast.ShowStatsBuckets, ast.ShowStatsHistograms, ast.ShowStatsMeta, ast.ShowStatsHealthy: + case ast.ShowStatsBuckets, ast.ShowStatsHistograms, ast.ShowStatsMeta, ast.ShowStatsExtended, ast.ShowStatsHealthy, ast.ShowStatsTopN: user := b.ctx.GetSessionVars().User var err error if user != nil { @@ -2104,28 +2252,6 @@ func (b *PlanBuilder) buildSimple(node ast.StmtNode) (Plan, error) { } case *ast.ShutdownStmt: b.visitInfo = appendVisitInfo(b.visitInfo, mysql.ShutdownPriv, "", "", "", nil) - case *ast.CreateStatisticsStmt: - var selectErr, insertErr error - user := b.ctx.GetSessionVars().User - if user != nil { - selectErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE STATISTICS", user.AuthUsername, - user.AuthHostname, raw.Table.Name.L) - insertErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE STATISTICS", user.AuthUsername, - user.AuthHostname, "stats_extended") - } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, raw.Table.Schema.L, - raw.Table.Name.L, "", selectErr) - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.InsertPriv, mysql.SystemDB, - "stats_extended", "", insertErr) - case *ast.DropStatisticsStmt: - var err error - user := b.ctx.GetSessionVars().User - if user != nil { - err = ErrTableaccessDenied.GenWithStackByArgs("DROP STATISTICS", user.AuthUsername, - user.AuthHostname, "stats_extended") - } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.UpdatePriv, mysql.SystemDB, - "stats_extended", "", err) } return p, nil } @@ -2606,18 +2732,92 @@ func (b *PlanBuilder) buildValuesListOfInsert(ctx context.Context, insert *ast.I return nil } +type colNameInOnDupExtractor struct { + colNameMap map[types.FieldName]*ast.ColumnNameExpr +} + +func (c *colNameInOnDupExtractor) Enter(node ast.Node) (ast.Node, bool) { + switch x := node.(type) { + case *ast.ColumnNameExpr: + fieldName := types.FieldName{ + DBName: x.Name.Schema, + TblName: x.Name.Table, + ColName: x.Name.Name, + } + c.colNameMap[fieldName] = x + return node, true + // We don't extract the column names from the sub select. + case *ast.SelectStmt, *ast.SetOprStmt: + return node, true + default: + return node, false + } +} + +func (c *colNameInOnDupExtractor) Leave(node ast.Node) (ast.Node, bool) { + return node, true +} + func (b *PlanBuilder) buildSelectPlanOfInsert(ctx context.Context, insert *ast.InsertStmt, insertPlan *Insert) error { + b.isForUpdateRead = true affectedValuesCols, err := b.getAffectCols(insert, insertPlan) if err != nil { return err } + actualColLen := -1 + // For MYSQL, it handles the case that the columns in ON DUPLICATE UPDATE is not the project column of the SELECT clause + // but just in the table occurs in the SELECT CLAUSE. + // e.g. insert into a select x from b ON DUPLICATE KEY UPDATE a.x=b.y; the `y` is not a column of select's output. + // MySQL won't throw error and will execute this SQL successfully. + // To make compatible with this strange feature, we add the variable `actualColLen` and the following IF branch. + if len(insert.OnDuplicate) > 0 { + // If the select has aggregation, it cannot see the columns not in the select field. + // e.g. insert into a select x from b ON DUPLICATE KEY UPDATE a.x=b.y; can be executed successfully. + // insert into a select x from b group by x ON DUPLICATE KEY UPDATE a.x=b.y; will report b.y not found. + if sel, ok := insert.Select.(*ast.SelectStmt); ok && !b.detectSelectAgg(sel) { + hasWildCard := false + for _, field := range sel.Fields.Fields { + if field.WildCard != nil { + hasWildCard = true + break + } + } + if !hasWildCard { + colExtractor := &colNameInOnDupExtractor{colNameMap: make(map[types.FieldName]*ast.ColumnNameExpr)} + for _, assign := range insert.OnDuplicate { + assign.Expr.Accept(colExtractor) + } + actualColLen = len(sel.Fields.Fields) + for _, colName := range colExtractor.colNameMap { + // If we found the name from the INSERT's table columns, we don't try to find it in select field anymore. + if insertPlan.tableColNames.FindAstColName(colName.Name) { + continue + } + found := false + for _, field := range sel.Fields.Fields { + if colField, ok := field.Expr.(*ast.ColumnNameExpr); ok && + (colName.Name.Schema.L == "" || colField.Name.Schema.L == "" || colName.Name.Schema.L == colField.Name.Schema.L) && + (colName.Name.Table.L == "" || colField.Name.Table.L == "" || colName.Name.Table.L == colField.Name.Table.L) && + colName.Name.Name.L == colField.Name.Name.L { + found = true + break + } + } + if found { + continue + } + sel.Fields.Fields = append(sel.Fields.Fields, &ast.SelectField{Expr: colName, Offset: len(sel.Fields.Fields)}) + } + } + } + } selectPlan, err := b.Build(ctx, insert.Select) if err != nil { return err } // Check to guarantee that the length of the row returned by select is equal to that of affectedValuesCols. - if selectPlan.Schema().Len() != len(affectedValuesCols) { + if (actualColLen == -1 && selectPlan.Schema().Len() != len(affectedValuesCols)) || (actualColLen != -1 && actualColLen != len(affectedValuesCols)) { return ErrWrongValueCountOnRow.GenWithStackByArgs(1) } @@ -2640,12 +2840,17 @@ func (b *PlanBuilder) buildSelectPlanOfInsert(ctx context.Context, insert *ast.I return err } + if actualColLen == -1 { + actualColLen = selectPlan.Schema().Len() + } + insertPlan.RowLen = actualColLen // schema4NewRow is the schema for the newly created data record based on // the result of the select statement. schema4NewRow := expression.NewSchema(make([]*expression.Column, len(insertPlan.Table.Cols()))...) names4NewRow := make(types.NameSlice, len(insertPlan.Table.Cols())) // TODO: don't clone it. - for i, selCol := range insertPlan.SelectPlan.Schema().Columns { + for i := 0; i < actualColLen; i++ { + selCol := insertPlan.SelectPlan.Schema().Columns[i] ordinal := affectedValuesCols[i].Offset schema4NewRow.Columns[ordinal] = &expression.Column{} *schema4NewRow.Columns[ordinal] = *selCol @@ -2661,13 +2866,16 @@ func (b *PlanBuilder) buildSelectPlanOfInsert(ctx context.Context, insert *ast.I names4NewRow[i] = types.EmptyName } } - insertPlan.Schema4OnDuplicate = expression.MergeSchema(insertPlan.tableSchema, schema4NewRow) - insertPlan.names4OnDuplicate = append(insertPlan.tableColNames.Shallow(), names4NewRow...) + insertPlan.Schema4OnDuplicate = expression.NewSchema(insertPlan.tableSchema.Columns...) + insertPlan.Schema4OnDuplicate.Append(insertPlan.SelectPlan.Schema().Columns[actualColLen:]...) + insertPlan.Schema4OnDuplicate.Append(schema4NewRow.Columns...) + insertPlan.names4OnDuplicate = append(insertPlan.tableColNames.Shallow(), names[actualColLen:]...) + insertPlan.names4OnDuplicate = append(insertPlan.names4OnDuplicate, names4NewRow...) return nil } func (b *PlanBuilder) buildLoadData(ctx context.Context, ld *ast.LoadDataStmt) (Plan, error) { - p := &LoadData{ + p := LoadData{ IsLocal: ld.IsLocal, OnDuplicate: ld.OnDuplicate, Path: ld.Path, @@ -2678,7 +2886,7 @@ func (b *PlanBuilder) buildLoadData(ctx context.Context, ld *ast.LoadDataStmt) ( IgnoreLines: ld.IgnoreLines, ColumnAssignments: ld.ColumnAssignments, ColumnsAndUserVars: ld.ColumnsAndUserVars, - } + }.Init(b.ctx) user := b.ctx.GetSessionVars().User var insertErr error if user != nil { @@ -2838,7 +3046,7 @@ func (b *PlanBuilder) convertValue(valueItem ast.ExprNode, mockTablePlan Logical } d, err = value.ConvertTo(b.ctx.GetSessionVars().StmtCtx, &col.FieldType) if err != nil { - if !types.ErrTruncated.Equal(err) && !types.ErrTruncatedWrongVal.Equal(err) { + if !types.ErrTruncated.Equal(err) && !types.ErrTruncatedWrongVal.Equal(err) && !types.ErrBadNumber.Equal(err) { return d, err } valStr, err1 := value.ToString() @@ -2943,6 +3151,9 @@ func convertValueListToData(valueList []ast.ExprNode, handleColInfos []*model.Co if err != nil { return nil, err } + if convertedDatum.IsNull() { + return nil, ErrBadNull.GenWithStackByArgs(handleColInfos[i].Name.O) + } data = append(data, convertedDatum) } return data, nil @@ -2999,8 +3210,38 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err } b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.Table.Schema.L, v.Table.Name.L, "", authErr) + } else if spec.Tp == ast.AlterTableWriteable { + b.visitInfo[0].alterWritable = true + } else if spec.Tp == ast.AlterTableAddStatistics { + var selectErr, insertErr error + user := b.ctx.GetSessionVars().User + if user != nil { + selectErr = ErrTableaccessDenied.GenWithStackByArgs("ADD STATS_EXTENDED", user.AuthUsername, + user.AuthHostname, v.Table.Name.L) + insertErr = ErrTableaccessDenied.GenWithStackByArgs("ADD STATS_EXTENDED", user.AuthUsername, + user.AuthHostname, "stats_extended") + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SelectPriv, v.Table.Schema.L, + v.Table.Name.L, "", selectErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.InsertPriv, mysql.SystemDB, + "stats_extended", "", insertErr) + } else if spec.Tp == ast.AlterTableDropStatistics { + user := b.ctx.GetSessionVars().User + if user != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("DROP STATS_EXTENDED", user.AuthUsername, + user.AuthHostname, "stats_extended") + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.UpdatePriv, mysql.SystemDB, + "stats_extended", "", authErr) } } + case *ast.AlterSequenceStmt: + if b.ctx.GetSessionVars().User != nil { + authErr = ErrTableaccessDenied.GenWithStackByArgs("ALTER", b.ctx.GetSessionVars().User.AuthUsername, + b.ctx.GetSessionVars().User.AuthHostname, v.Name.Name.L) + } + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.AlterPriv, v.Name.Schema.L, + v.Name.Name.L, "", authErr) case *ast.CreateDatabaseStmt: if b.ctx.GetSessionVars().User != nil { authErr = ErrDBaccessDenied.GenWithStackByArgs(b.ctx.GetSessionVars().User.AuthUsername, @@ -3031,20 +3272,16 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err v.ReferTable.Name.L, "", authErr) } case *ast.CreateViewStmt: - b.capFlag |= canExpandAST - b.capFlag |= collectUnderlyingViewName + b.capFlag |= canExpandAST | renameView + b.renamingViewName = v.ViewName.Schema.L + "." + v.ViewName.Name.L defer func() { b.capFlag &= ^canExpandAST - b.capFlag &= ^collectUnderlyingViewName + b.capFlag &= ^renameView }() - b.underlyingViewNames = set.NewStringSet() plan, err := b.Build(ctx, v.Select) if err != nil { return nil, err } - if b.underlyingViewNames.Exist(v.ViewName.Schema.L + "." + v.ViewName.Name.L) { - return nil, ErrNoSuchTable.GenWithStackByArgs(v.ViewName.Schema.O, v.ViewName.Name.O) - } schema := plan.Schema() names := plan.OutputNames() if v.Cols == nil { @@ -3120,31 +3357,31 @@ func (b *PlanBuilder) buildDDL(ctx context.Context, node ast.DDLNode) (Plan, err case *ast.RenameTableStmt: if b.ctx.GetSessionVars().User != nil { authErr = ErrTableaccessDenied.GenWithStackByArgs("ALTER", b.ctx.GetSessionVars().User.AuthUsername, - b.ctx.GetSessionVars().User.AuthHostname, v.OldTable.Name.L) + b.ctx.GetSessionVars().User.AuthHostname, v.TableToTables[0].OldTable.Name.L) } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.AlterPriv, v.OldTable.Schema.L, - v.OldTable.Name.L, "", authErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.AlterPriv, v.TableToTables[0].OldTable.Schema.L, + v.TableToTables[0].OldTable.Name.L, "", authErr) if b.ctx.GetSessionVars().User != nil { authErr = ErrTableaccessDenied.GenWithStackByArgs("DROP", b.ctx.GetSessionVars().User.AuthUsername, - b.ctx.GetSessionVars().User.AuthHostname, v.OldTable.Name.L) + b.ctx.GetSessionVars().User.AuthHostname, v.TableToTables[0].OldTable.Name.L) } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.OldTable.Schema.L, - v.OldTable.Name.L, "", authErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.DropPriv, v.TableToTables[0].OldTable.Schema.L, + v.TableToTables[0].OldTable.Name.L, "", authErr) if b.ctx.GetSessionVars().User != nil { authErr = ErrTableaccessDenied.GenWithStackByArgs("CREATE", b.ctx.GetSessionVars().User.AuthUsername, - b.ctx.GetSessionVars().User.AuthHostname, v.NewTable.Name.L) + b.ctx.GetSessionVars().User.AuthHostname, v.TableToTables[0].NewTable.Name.L) } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.NewTable.Schema.L, - v.NewTable.Name.L, "", authErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.CreatePriv, v.TableToTables[0].NewTable.Schema.L, + v.TableToTables[0].NewTable.Name.L, "", authErr) if b.ctx.GetSessionVars().User != nil { authErr = ErrTableaccessDenied.GenWithStackByArgs("INSERT", b.ctx.GetSessionVars().User.AuthUsername, - b.ctx.GetSessionVars().User.AuthHostname, v.NewTable.Name.L) + b.ctx.GetSessionVars().User.AuthHostname, v.TableToTables[0].NewTable.Name.L) } - b.visitInfo = appendVisitInfo(b.visitInfo, mysql.InsertPriv, v.NewTable.Schema.L, - v.NewTable.Name.L, "", authErr) + b.visitInfo = appendVisitInfo(b.visitInfo, mysql.InsertPriv, v.TableToTables[0].NewTable.Schema.L, + v.TableToTables[0].NewTable.Name.L, "", authErr) case *ast.RecoverTableStmt, *ast.FlashBackTableStmt: // Recover table command can only be executed by administrator. b.visitInfo = appendVisitInfo(b.visitInfo, mysql.SuperPriv, "", "", "", nil) @@ -3429,15 +3666,21 @@ func buildShowSchema(s *ast.ShowStmt, isView bool, isSequence bool) (schema *exp case ast.ShowStatsMeta: names = []string{"Db_name", "Table_name", "Partition_name", "Update_time", "Modify_count", "Row_count"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeDatetime, mysql.TypeLonglong, mysql.TypeLonglong} + case ast.ShowStatsExtended: + names = []string{"Db_name", "Table_name", "Stats_name", "Column_names", "Stats_type", "Stats_val", "Last_update_version"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} case ast.ShowStatsHistograms: names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Update_time", "Distinct_count", "Null_count", "Avg_col_size", "Correlation"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeDatetime, mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeDouble, mysql.TypeDouble} case ast.ShowStatsBuckets: names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Bucket_id", "Count", - "Repeats", "Lower_Bound", "Upper_Bound"} + "Repeats", "Lower_Bound", "Upper_Bound", "Ndv"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeLonglong, - mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar} + mysql.TypeLonglong, mysql.TypeLonglong, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} + case ast.ShowStatsTopN: + names = []string{"Db_name", "Table_name", "Partition_name", "Column_name", "Is_index", "Value", "Count"} + ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeTiny, mysql.TypeVarchar, mysql.TypeLonglong} case ast.ShowStatsHealthy: names = []string{"Db_name", "Table_name", "Partition_name", "Healthy"} ftypes = []byte{mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeVarchar, mysql.TypeLonglong} diff --git a/planner/core/planbuilder_test.go b/planner/core/planbuilder_test.go index 357a3a0115696..f3da2e6d0dba9 100644 --- a/planner/core/planbuilder_test.go +++ b/planner/core/planbuilder_test.go @@ -114,7 +114,7 @@ func (s *testPlanBuilderSuite) TestGetPathByIndexName(c *C) { } func (s *testPlanBuilderSuite) TestRewriterPool(c *C) { - builder := NewPlanBuilder(MockContext(), nil, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(MockContext(), nil, &hint.BlockHintProcessor{}) // Make sure PlanBuilder.getExpressionRewriter() provides clean rewriter from pool. // First, pick one rewriter from the pool and make it dirty. @@ -168,7 +168,7 @@ func (s *testPlanBuilderSuite) TestDisableFold(c *C) { stmt := st.(*ast.SelectStmt) expr := stmt.Fields.Fields[0].Expr - builder := NewPlanBuilder(ctx, nil, &hint.BlockHintProcessor{}) + builder, _ := NewPlanBuilder(ctx, nil, &hint.BlockHintProcessor{}) builder.rewriterCounter++ rewriter := builder.getExpressionRewriter(context.TODO(), nil) c.Assert(rewriter, NotNil) diff --git a/planner/core/point_get_plan.go b/planner/core/point_get_plan.go index 6a49a0c63e23a..0ec72814b934e 100644 --- a/planner/core/point_get_plan.go +++ b/planner/core/point_get_plan.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/opcode" "github.com/pingcap/parser/terror" + ptypes "github.com/pingcap/parser/types" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -34,11 +35,14 @@ import ( "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/types/parser_driver" + driver "github.com/pingcap/tidb/types/parser_driver" + tidbutil "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/math" "github.com/pingcap/tidb/util/plancodec" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tipb/go-tipb" + "go.uber.org/zap" ) // PointGetPlan is a fast plan for simple point get. @@ -97,7 +101,7 @@ func (p *PointGetPlan) Clone() (PhysicalPlan, error) { // ExplainInfo implements Plan interface. func (p *PointGetPlan) ExplainInfo() string { - accessObject, operatorInfo := p.AccessObject(), p.OperatorInfo(false) + accessObject, operatorInfo := p.AccessObject(false), p.OperatorInfo(false) if len(operatorInfo) == 0 { return accessObject } @@ -106,7 +110,7 @@ func (p *PointGetPlan) ExplainInfo() string { // ExplainNormalizedInfo implements Plan interface. func (p *PointGetPlan) ExplainNormalizedInfo() string { - accessObject, operatorInfo := p.AccessObject(), p.OperatorInfo(true) + accessObject, operatorInfo := p.AccessObject(true), p.OperatorInfo(true) if len(operatorInfo) == 0 { return accessObject } @@ -114,12 +118,16 @@ func (p *PointGetPlan) ExplainNormalizedInfo() string { } // AccessObject implements dataAccesser interface. -func (p *PointGetPlan) AccessObject() string { +func (p *PointGetPlan) AccessObject(normalized bool) string { buffer := bytes.NewBufferString("") tblName := p.TblInfo.Name.O fmt.Fprintf(buffer, "table:%s", tblName) if p.PartitionInfo != nil { - fmt.Fprintf(buffer, ", partition:%s", p.PartitionInfo.Name.L) + if normalized { + fmt.Fprintf(buffer, ", partition:?") + } else { + fmt.Fprintf(buffer, ", partition:%s", p.PartitionInfo.Name.L) + } } if p.IndexInfo != nil { if p.IndexInfo.Primary && p.TblInfo.IsCommonHandle { @@ -128,7 +136,11 @@ func (p *PointGetPlan) AccessObject() string { buffer.WriteString(", index:" + p.IndexInfo.Name.O + "(") } for i, idxCol := range p.IndexInfo.Columns { - buffer.WriteString(idxCol.Name.O) + if tblCol := p.TblInfo.Columns[idxCol.Offset]; tblCol.Hidden { + buffer.WriteString(tblCol.GeneratedExprString) + } else { + buffer.WriteString(idxCol.Name.O) + } if i+1 < len(p.IndexInfo.Columns) { buffer.WriteString(", ") } @@ -274,16 +286,16 @@ func (p *BatchPointGetPlan) ToPB(ctx sessionctx.Context, _ kv.StoreType) (*tipb. // ExplainInfo implements Plan interface. func (p *BatchPointGetPlan) ExplainInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(false) + return p.AccessObject(false) + ", " + p.OperatorInfo(false) } // ExplainNormalizedInfo implements Plan interface. func (p *BatchPointGetPlan) ExplainNormalizedInfo() string { - return p.AccessObject() + ", " + p.OperatorInfo(true) + return p.AccessObject(true) + ", " + p.OperatorInfo(true) } // AccessObject implements physicalScan interface. -func (p *BatchPointGetPlan) AccessObject() string { +func (p *BatchPointGetPlan) AccessObject(_ bool) string { buffer := bytes.NewBufferString("") tblName := p.TblInfo.Name.O fmt.Fprintf(buffer, "table:%s", tblName) @@ -294,7 +306,11 @@ func (p *BatchPointGetPlan) AccessObject() string { buffer.WriteString(", index:" + p.IndexInfo.Name.O + "(") } for i, idxCol := range p.IndexInfo.Columns { - buffer.WriteString(idxCol.Name.O) + if tblCol := p.TblInfo.Columns[idxCol.Offset]; tblCol.Hidden { + buffer.WriteString(tblCol.GeneratedExprString) + } else { + buffer.WriteString(idxCol.Name.O) + } if i+1 < len(p.IndexInfo.Columns) { buffer.WriteString(", ") } @@ -411,14 +427,20 @@ func TryFastPlan(ctx sessionctx.Context, node ast.Node) (p Plan) { if checkFastPlanPrivilege(ctx, fp.dbName, fp.TblInfo.Name.L, mysql.SelectPriv) != nil { return } + if tidbutil.IsMemDB(fp.dbName) { + return nil + } fp.Lock, fp.LockWaitTime = getLockWaitTime(ctx, x.LockInfo) p = fp return } - if fp := tryPointGetPlan(ctx, x); fp != nil { + if fp := tryPointGetPlan(ctx, x, isForUpdateReadSelectLock(x.LockInfo)); fp != nil { if checkFastPlanPrivilege(ctx, fp.dbName, fp.TblInfo.Name.L, mysql.SelectPriv) != nil { return nil } + if tidbutil.IsMemDB(fp.dbName) { + return nil + } if fp.IsTableDual { tableDual := PhysicalTableDual{} tableDual.names = fp.outputNames @@ -441,11 +463,12 @@ func TryFastPlan(ctx sessionctx.Context, node ast.Node) (p Plan) { // IsSelectForUpdateLockType checks if the select lock type is for update type. func IsSelectForUpdateLockType(lockType ast.SelectLockType) bool { if lockType == ast.SelectLockForUpdate || + lockType == ast.SelectLockForShare || lockType == ast.SelectLockForUpdateNoWait || lockType == ast.SelectLockForUpdateWaitN { return true } - return true + return false } func getLockWaitTime(ctx sessionctx.Context, lockInfo *ast.SelectLockInfo) (lock bool, waitTime int64) { @@ -505,6 +528,9 @@ func newBatchPointGetPlan( if d.IsNull() { return nil } + if !checkCanConvertInPointGet(handleCol, d) { + return nil + } intDatum, err := d.ConvertTo(ctx.GetSessionVars().StmtCtx, &handleCol.FieldType) if err != nil { return nil @@ -527,8 +553,16 @@ func newBatchPointGetPlan( // The columns in where clause should be covered by unique index var matchIdxInfo *model.IndexInfo permutations := make([]int, len(whereColNames)) + colInfos := make([]*model.ColumnInfo, len(whereColNames)) + for i, innerCol := range whereColNames { + for _, col := range tbl.Columns { + if col.Name.L == innerCol { + colInfos[i] = col + } + } + } for _, idxInfo := range tbl.Indices { - if !idxInfo.Unique || idxInfo.State != model.StatePublic { + if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible { continue } if len(idxInfo.Columns) != len(whereColNames) || idxInfo.HasPrefixIndex() { @@ -570,14 +604,23 @@ func newBatchPointGetPlan( switch x := item.(type) { case *ast.RowExpr: // The `len(values) == len(valuesParams)` should be satisfied in this mode + if len(x.Values) != len(whereColNames) { + return nil + } values = make([]types.Datum, len(x.Values)) valuesParams = make([]*driver.ParamMarkerExpr, len(x.Values)) for index, inner := range x.Values { permIndex := permutations[index] switch innerX := inner.(type) { case *driver.ValueExpr: + if !checkCanConvertInPointGet(colInfos[index], innerX.Datum) { + return nil + } values[permIndex] = innerX.Datum case *driver.ParamMarkerExpr: + if !checkCanConvertInPointGet(colInfos[index], innerX.Datum) { + return nil + } values[permIndex] = innerX.Datum valuesParams[permIndex] = innerX default: @@ -585,8 +628,22 @@ func newBatchPointGetPlan( } } case *driver.ValueExpr: + // if any item is `ValueExpr` type, `Expr` should contain only one column, + // otherwise column count doesn't match and no plan can be built. + if len(whereColNames) != 1 { + return nil + } + if !checkCanConvertInPointGet(colInfos[0], x.Datum) { + return nil + } values = []types.Datum{x.Datum} case *driver.ParamMarkerExpr: + if len(whereColNames) != 1 { + return nil + } + if !checkCanConvertInPointGet(colInfos[0], x.Datum) { + return nil + } values = []types.Datum{x.Datum} valuesParams = []*driver.ParamMarkerExpr{x} default: @@ -702,7 +759,7 @@ func tryWhereIn2BatchPointGet(ctx sessionctx.Context, selStmt *ast.SelectStmt) * // 2. It must be a single table select. // 3. All the columns must be public and generated. // 4. The condition is an access path that the range is a unique key. -func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt) *PointGetPlan { +func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt, check bool) *PointGetPlan { if selStmt.Having != nil { return nil } else if selStmt.Limit != nil { @@ -779,16 +836,31 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt) *PointGetP p.HandleParam = handlePair.param p.PartitionInfo = partitionInfo return p + } else if handlePair.value.Kind() != types.KindNull { + return nil } + check = check && ctx.GetSessionVars().ConnectionID > 0 + var latestIndexes map[int64]*model.IndexInfo + var err error + for _, idxInfo := range tbl.Indices { - if !idxInfo.Unique { - continue - } - if idxInfo.State != model.StatePublic { + if !idxInfo.Unique || idxInfo.State != model.StatePublic || idxInfo.Invisible { continue } if isTableDual { + if check && latestIndexes == nil { + latestIndexes, check, err = getLatestIndexInfo(ctx, tbl.ID, 0) + if err != nil { + logutil.BgLogger().Warn("get information schema failed", zap.Error(err)) + return nil + } + } + if check { + if latestIndex, ok := latestIndexes[idxInfo.ID]; !ok || latestIndex.State != model.StatePublic { + continue + } + } p := newPointGetPlan(ctx, tblName.Schema.O, schema, tbl, names) p.IsTableDual = true return p @@ -798,6 +870,18 @@ func tryPointGetPlan(ctx sessionctx.Context, selStmt *ast.SelectStmt) *PointGetP if idxValues == nil { continue } + if check && latestIndexes == nil { + latestIndexes, check, err = getLatestIndexInfo(ctx, tbl.ID, 0) + if err != nil { + logutil.BgLogger().Warn("get information schema failed", zap.Error(err)) + return nil + } + } + if check { + if latestIndex, ok := latestIndexes[idxInfo.ID]; !ok || latestIndex.State != model.StatePublic { + continue + } + } p := newPointGetPlan(ctx, dbName, schema, tbl, names) p.IndexInfo = idxInfo p.IndexValues = idxValues @@ -836,15 +920,24 @@ func newPointGetPlan(ctx sessionctx.Context, dbName string, schema *expression.S func checkFastPlanPrivilege(ctx sessionctx.Context, dbName, tableName string, checkTypes ...mysql.PrivilegeType) error { pm := privilege.GetPrivilegeManager(ctx) - if pm == nil { - return nil - } + var visitInfos []visitInfo for _, checkType := range checkTypes { - if !pm.RequestVerification(ctx.GetSessionVars().ActiveRoles, dbName, tableName, "", checkType) { + if pm != nil && !pm.RequestVerification(ctx.GetSessionVars().ActiveRoles, dbName, tableName, "", checkType) { return errors.New("privilege check fail") } + // This visitInfo is only for table lock check, so we do not need column field, + // just fill it empty string. + visitInfos = append(visitInfos, visitInfo{ + privilege: checkType, + db: dbName, + table: tableName, + column: "", + err: nil, + }) } - return nil + + infoSchema := infoschema.GetInfoSchema(ctx) + return CheckTableLock(ctx, infoSchema, visitInfos) } func buildSchemaFromFields( @@ -993,6 +1086,9 @@ func getNameValuePairs(stmtCtx *stmtctx.StatementContext, tbl *model.TableInfo, (col.Tp == mysql.TypeString && col.Collate == charset.CollationBin) { // This type we needn't to pad `\0` in here. return append(nvPairs, nameValuePair{colName: colName.Name.Name.L, value: d, param: param}), false } + if !checkCanConvertInPointGet(col, d) { + return nil, false + } dVal, err := d.ConvertTo(stmtCtx, &col.FieldType) if err != nil { if terror.ErrorEqual(types.ErrOverflow, err) { @@ -1004,7 +1100,8 @@ func getNameValuePairs(stmtCtx *stmtctx.StatementContext, tbl *model.TableInfo, } } // The converted result must be same as original datum. - cmp, err := d.CompareDatum(stmtCtx, &dVal) + // Compare them based on the dVal's type. + cmp, err := dVal.CompareDatum(stmtCtx, &d) if err != nil { return nil, false } else if cmp != 0 { @@ -1016,6 +1113,28 @@ func getNameValuePairs(stmtCtx *stmtctx.StatementContext, tbl *model.TableInfo, return nil, false } +func checkCanConvertInPointGet(col *model.ColumnInfo, d types.Datum) bool { + kind := d.Kind() + switch col.FieldType.EvalType() { + case ptypes.ETString: + switch kind { + case types.KindInt64, types.KindUint64, + types.KindFloat32, types.KindFloat64, types.KindMysqlDecimal: + // column type is String and constant type is numeric + return false + } + } + switch col.FieldType.Tp { + case mysql.TypeBit: + switch kind { + case types.KindString: + // column type is Bit and constant type is string + return false + } + } + return true +} + func findPKHandle(tblInfo *model.TableInfo, pairs []nameValuePair) (handlePair nameValuePair, fieldType *types.FieldType) { if !tblInfo.PKIsHandle { rowIDIdx := findInPairs("_tidb_rowid", pairs) @@ -1076,7 +1195,7 @@ func tryUpdatePointPlan(ctx sessionctx.Context, updateStmt *ast.UpdateStmt) Plan OrderBy: updateStmt.Order, Limit: updateStmt.Limit, } - pointGet := tryPointGetPlan(ctx, selStmt) + pointGet := tryPointGetPlan(ctx, selStmt, true) if pointGet != nil { if pointGet.IsTableDual { return PhysicalTableDual{ @@ -1120,6 +1239,7 @@ func buildPointUpdatePlan(ctx sessionctx.Context, pointPlan PhysicalPlan, dbName }, }, AllAssignmentsAreConstant: allAssignmentsAreConstant, + VirtualAssignmentsOffset: len(orderedList), }.Init(ctx) updatePlan.names = pointPlan.OutputNames() return updatePlan @@ -1169,7 +1289,7 @@ func tryDeletePointPlan(ctx sessionctx.Context, delStmt *ast.DeleteStmt) Plan { OrderBy: delStmt.Order, Limit: delStmt.Limit, } - if pointGet := tryPointGetPlan(ctx, selStmt); pointGet != nil { + if pointGet := tryPointGetPlan(ctx, selStmt, true); pointGet != nil { if pointGet.IsTableDual { return PhysicalTableDual{ names: pointGet.outputNames, @@ -1220,7 +1340,7 @@ func findCol(tbl *model.TableInfo, colName *ast.ColumnName) *model.ColumnInfo { func colInfoToColumn(col *model.ColumnInfo, idx int) *expression.Column { return &expression.Column{ - RetType: &col.FieldType, + RetType: col.FieldType.Clone(), ID: col.ID, UniqueID: int64(col.Offset), Index: idx, @@ -1248,23 +1368,6 @@ func buildHandleCols(ctx sessionctx.Context, tbl *model.TableInfo, schema *expre return &IntHandleCols{col: handleCol} } -func findHandleCol(tbl *model.TableInfo, schema *expression.Schema) *expression.Column { - // fields len is 0 for update and delete. - var handleCol *expression.Column - if tbl.PKIsHandle { - for i, col := range tbl.Columns { - if mysql.HasPriKeyFlag(col.Flag) && tbl.PKIsHandle { - handleCol = schema.Columns[i] - } - } - } - if !tbl.IsCommonHandle && handleCol == nil { - handleCol = colInfoToColumn(model.NewExtraHandleColInfo(), schema.Len()) - schema.Append(handleCol) - } - return handleCol -} - func getPartitionInfo(ctx sessionctx.Context, tbl *model.TableInfo, pairs []nameValuePair) (*model.PartitionDefinition, int) { partitionColName := getHashPartitionColumnName(ctx, tbl) if partitionColName == nil { diff --git a/planner/core/point_get_plan_test.go b/planner/core/point_get_plan_test.go index 05a8c9890cbfc..ed079646f5d8e 100644 --- a/planner/core/point_get_plan_test.go +++ b/planner/core/point_get_plan_test.go @@ -18,8 +18,10 @@ import ( "fmt" "math" "strings" + "time" . "github.com/pingcap/check" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" @@ -76,22 +78,22 @@ func (s *testPointGetSuite) TestPointGetPlanCache(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a bigint unsigned primary key, b int, c int, key idx_bc(b,c))") tk.MustExec("insert into t values(1, 1, 1), (2, 2, 2), (3, 3, 3)") - tk.MustQuery("explain select * from t where a = 1").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t handle:1", + tk.MustQuery("explain format = 'brief' select * from t where a = 1").Check(testkit.Rows( + "Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain select * from t where 1 = a").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t handle:1", + tk.MustQuery("explain format = 'brief' select * from t where 1 = a").Check(testkit.Rows( + "Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain update t set b=b+1, c=c+1 where a = 1").Check(testkit.Rows( - "Update_4 N/A root N/A", - "└─Point_Get_1 1.00 root table:t handle:1", + tk.MustQuery("explain format = 'brief' update t set b=b+1, c=c+1 where a = 1").Check(testkit.Rows( + "Update N/A root N/A", + "└─Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain delete from t where a = 1").Check(testkit.Rows( - "Delete_2 N/A root N/A", - "└─Point_Get_1 1.00 root table:t handle:1", + tk.MustQuery("explain format = 'brief' delete from t where a = 1").Check(testkit.Rows( + "Delete N/A root N/A", + "└─Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain select a from t where a = -1").Check(testkit.Rows( - "TableDual_6 0.00 root rows:0", + tk.MustQuery("explain format = 'brief' select a from t where a = -1").Check(testkit.Rows( + "TableDual 0.00 root rows:0", )) tk.MustExec(`prepare stmt0 from "select a from t where a = ?"`) tk.MustExec("set @p0 = -1") @@ -195,7 +197,7 @@ func (s *testPointGetSuite) TestPointGetForUpdate(c *C) { } func checkUseForUpdate(tk *testkit.TestKit, c *C, expectLock bool) { - res := tk.MustQuery("explain select * from fu where id = 6 for update") + res := tk.MustQuery("explain format = 'brief' select * from fu where id = 6 for update") // Point_Get_1 1.00 root table:fu, handle:6 opInfo := res.Rows()[0][4] selectLock := strings.Contains(fmt.Sprintf("%s", opInfo), "lock") @@ -216,35 +218,38 @@ func (s *testPointGetSuite) TestWhereIn2BatchPointGet(c *C) { "3 3 3", "4 4 5", )) - tk.MustQuery("explain select * from t where a = 1 and b = 1 and c = 1").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t, index:idx_abc(a, b, c) ", + tk.MustQuery("explain format = 'brief' select * from t where a = 1 and b = 1 and c = 1").Check(testkit.Rows( + "Selection 1.00 root eq(test.t.b, 1), eq(test.t.c, 1)", + "└─Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain select * from t where 1 = a and 1 = b and 1 = c").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t, index:idx_abc(a, b, c) ", + tk.MustQuery("explain format = 'brief' select * from t where 1 = a and 1 = b and 1 = c").Check(testkit.Rows( + "Selection 1.00 root eq(1, test.t.b), eq(1, test.t.c)", + "└─Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain select * from t where 1 = a and b = 1 and 1 = c").Check(testkit.Rows( - "Point_Get_1 1.00 root table:t, index:idx_abc(a, b, c) ", + tk.MustQuery("explain format = 'brief' select * from t where 1 = a and b = 1 and 1 = c").Check(testkit.Rows( + "Selection 1.00 root eq(1, test.t.c), eq(test.t.b, 1)", + "└─Point_Get 1.00 root table:t handle:1", )) - tk.MustQuery("explain select * from t where (a, b, c) in ((1, 1, 1), (2, 2, 2))").Check(testkit.Rows( - "Batch_Point_Get_1 2.00 root table:t, index:idx_abc(a, b, c) keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where (a, b, c) in ((1, 1, 1), (2, 2, 2))").Check(testkit.Rows( + "Batch_Point_Get 2.00 root table:t, index:idx_abc(a, b, c) keep order:false, desc:false", )) - tk.MustQuery("explain select * from t where a in (1, 2, 3, 4, 5)").Check(testkit.Rows( - "Batch_Point_Get_1 5.00 root table:t handle:[1 2 3 4 5], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where a in (1, 2, 3, 4, 5)").Check(testkit.Rows( + "Batch_Point_Get 5.00 root table:t handle:[1 2 3 4 5], keep order:false, desc:false", )) - tk.MustQuery("explain select * from t where a in (1, 2, 3, 1, 2)").Check(testkit.Rows( - "Batch_Point_Get_1 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where a in (1, 2, 3, 1, 2)").Check(testkit.Rows( + "Batch_Point_Get 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false", )) tk.MustExec("begin") - tk.MustQuery("explain select * from t where a in (1, 2, 3, 1, 2) FOR UPDATE").Check(testkit.Rows( - "Batch_Point_Get_1 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false, lock", + tk.MustQuery("explain format = 'brief' select * from t where a in (1, 2, 3, 1, 2) FOR UPDATE").Check(testkit.Rows( + "Batch_Point_Get 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false, lock", )) tk.MustExec("rollback") - tk.MustQuery("explain select * from t where (a) in ((1), (2), (3), (1), (2))").Check(testkit.Rows( - "Batch_Point_Get_1 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where (a) in ((1), (2), (3), (1), (2))").Check(testkit.Rows( + "Batch_Point_Get 5.00 root table:t handle:[1 2 3 1 2], keep order:false, desc:false", )) tk.MustExec("use test") @@ -257,8 +262,8 @@ func (s *testPointGetSuite) TestWhereIn2BatchPointGet(c *C) { "3 4 5", "4 5 6", )) - tk.MustQuery("explain select * from t where (a, b) in ((1, 2), (2, 3))").Check(testkit.Rows( - "Batch_Point_Get_1 2.00 root table:t, index:idx_ab(a, b) keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where (a, b) in ((1, 2), (2, 3))").Check(testkit.Rows( + "Batch_Point_Get 2.00 root table:t, index:idx_ab(a, b) keep order:false, desc:false", )) tk.MustQuery("select * from t where (a, b) in ((1, 2), (2, 3))").Check(testkit.Rows( "1 2 3", @@ -281,8 +286,8 @@ func (s *testPointGetSuite) TestWhereIn2BatchPointGet(c *C) { )) tk.MustExec("begin pessimistic") - tk.MustQuery("explain select * from t where (a, b) in ((1, 2), (2, 3)) FOR UPDATE").Check(testkit.Rows( - "Batch_Point_Get_1 2.00 root table:t, index:idx_ab(a, b) keep order:false, desc:false, lock", + tk.MustQuery("explain format = 'brief' select * from t where (a, b) in ((1, 2), (2, 3)) FOR UPDATE").Check(testkit.Rows( + "Batch_Point_Get 2.00 root table:t, index:idx_ab(a, b) keep order:false, desc:false, lock", )) tk.MustExec("rollback") } @@ -306,7 +311,7 @@ func (s *testPointGetSuite) TestPointGetId(c *C) { c.Assert(err, IsNil) p, _, err := planner.Optimize(context.TODO(), ctx, stmt, is) c.Assert(err, IsNil) - // Test explain result is useless, plan id will be reset when running `explain`. + // Test explain format = 'brief' result is useless, plan id will be reset when running `explain`. c.Assert(p.ID(), Equals, 1) } } @@ -315,7 +320,7 @@ func (s *testPointGetSuite) TestCBOPointGet(c *C) { tk := testkit.NewTestKit(c, s.store) tk.MustExec("use test") tk.MustExec("drop table if exists t") - tk.MustExec("set @@tidb_enable_clustered_index=0") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table t (a varchar(20), b int, c int, d int, primary key(a), unique key(b, c))") tk.MustExec("insert into t values('1',4,4,1), ('2',3,3,2), ('3',2,2,3), ('4',1,1,4)") @@ -327,7 +332,7 @@ func (s *testPointGetSuite) TestCBOPointGet(c *C) { } s.testData.GetTestCases(c, &input, &output) for i, sql := range input { - plan := tk.MustQuery("explain " + sql) + plan := tk.MustQuery("explain format = 'brief' " + sql) res := tk.MustQuery(sql) s.testData.OnRecord(func() { output[i].SQL = sql @@ -357,8 +362,8 @@ func (s *testPointGetSuite) TestBatchPointGetPlanCache(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key, b int)") tk.MustExec("insert into t values(1, 1), (2, 2), (3, 3), (4, 4)") - tk.MustQuery("explain select * from t where a in (1, 2)").Check(testkit.Rows( - "Batch_Point_Get_1 2.00 root table:t handle:[1 2], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where a in (1, 2)").Check(testkit.Rows( + "Batch_Point_Get 2.00 root table:t handle:[1 2], keep order:false, desc:false", )) tk.MustExec("prepare stmt from 'select * from t where a in (?,?)'") tk.MustExec("set @p1 = 1, @p2 = 2") @@ -388,22 +393,23 @@ func (s *testPointGetSuite) TestBatchPointGetPartition(c *C) { c.Assert(err, IsNil) tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int primary key, b int) PARTITION BY HASH(a) PARTITIONS 4") tk.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (4, 4)") - tk.MustQuery("explain select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows( - "Batch_Point_Get_1 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows( + "Batch_Point_Get 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", )) tk.MustQuery("select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows("1 1", "2 2", "3 3", "4 4")) - tk.MustQuery("explain update t set b = b + 1 where a in (1, 2, 3, 4)").Check(testkit.Rows( - "Update_3 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' update t set b = b + 1 where a in (1, 2, 3, 4)").Check(testkit.Rows( + "Update N/A root N/A]\n[└─Batch_Point_Get 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", )) tk.MustExec("update t set b = b + 1 where a in (1, 2, 3, 4)") tk.MustQuery("select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows("1 2", "2 3", "3 4", "4 5")) - tk.MustQuery("explain delete from t where a in (1, 2, 3, 4)").Check(testkit.Rows( - "Delete_2 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' delete from t where a in (1, 2, 3, 4)").Check(testkit.Rows( + "Delete N/A root N/A]\n[└─Batch_Point_Get 4.00 root table:t handle:[1 2 3 4], keep order:false, desc:false", )) tk.MustExec("delete from t where a in (1, 2, 3, 4)") tk.MustQuery("select * from t where a in (1, 2, 3, 4)").Check(testkit.Rows()) @@ -411,21 +417,21 @@ func (s *testPointGetSuite) TestBatchPointGetPartition(c *C) { tk.MustExec("drop table t") tk.MustExec("create table t(a int, b int, c int, primary key (a, b)) PARTITION BY HASH(a) PARTITIONS 4") tk.MustExec("insert into t values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)") - tk.MustQuery("explain select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))").Check(testkit.Rows( - "Batch_Point_Get_1 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))").Check(testkit.Rows( + "Batch_Point_Get 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", )) tk.MustQuery("select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))"). Check(testkit.Rows("1 1 1", "2 2 2", "3 3 3", "4 4 4")) - tk.MustQuery("explain update t set c = c + 1 where (a,b) in ((1,1),(2,2),(3,3),(4,4))").Check(testkit.Rows( - "Update_3 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' update t set c = c + 1 where (a,b) in ((1,1),(2,2),(3,3),(4,4))").Check(testkit.Rows( + "Update N/A root N/A]\n[└─Batch_Point_Get 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", )) tk.MustExec("update t set c = c + 1 where (a,b) in ((1,1),(2,2),(3,3),(4,4))") tk.MustQuery("select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))").Sort(). Check(testkit.Rows("1 1 2", "2 2 3", "3 3 4", "4 4 5")) - tk.MustQuery("explain delete from t where (a,b) in ((1,1),(2,2),(3,3),(4,4))").Check(testkit.Rows( - "Delete_2 N/A root N/A]\n[└─Batch_Point_Get_1 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", + tk.MustQuery("explain format = 'brief' delete from t where (a,b) in ((1,1),(2,2),(3,3),(4,4))").Check(testkit.Rows( + "Delete N/A root N/A]\n[└─Batch_Point_Get 4.00 root table:t, clustered index:PRIMARY(a, b) keep order:false, desc:false", )) tk.MustExec("delete from t where (a,b) in ((1,1),(2,2),(3,3),(4,4))") tk.MustQuery("select * from t where (a, b) in ((1, 1), (2, 2), (3, 3), (4, 4))").Check(testkit.Rows()) @@ -449,3 +455,146 @@ func (s *testPointGetSuite) TestIssue19141(c *C) { tk.MustExec("delete from t19141 partition (p0) where c_int in (2,3)") // No data changed tk.MustQuery("select * from t19141 order by c_int").Check(testkit.Rows("1", "2", "3", "4")) } + +func (s *testPointGetSuite) TestSelectInMultiColumns(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2(a int, b int, c int, primary key(a, b, c));") + tk.MustExec("insert into t2 values (1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4)") + tk.MustQuery("select * from t2 where (a, b, c) in ((1, 1, 1));").Check(testkit.Rows("1 1 1")) + + _, err := tk.Exec("select * from t2 where (a, b, c) in ((1, 1, 1, 1));") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[expression:1241]Operand should contain 3 column(s)") + + _, err = tk.Exec("select * from t2 where (a, b, c) in ((1, 1, 1), (2, 2, 2, 2));") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[expression:1241]Operand should contain 3 column(s)") + + _, err = tk.Exec("select * from t2 where (a, b, c) in ((1, 1), (2, 2, 2));") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[expression:1241]Operand should contain 3 column(s)") +} + +func (s *testPointGetSuite) TestUpdateWithTableReadLockWillFail(c *C) { + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.EnableTableLock = true + }) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table tbllock(id int, c int);") + tk.MustExec("insert into tbllock values(1, 2), (2, 2);") + tk.MustExec("lock table tbllock read;") + _, err := tk.Exec("update tbllock set c = 3 where id = 2;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[schema:1099]Table 'tbllock' was locked with a READ lock and can't be updated") +} + +func (s *testPointGetSuite) TestIssue20692(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (id int primary key, v int, vv int, vvv int, unique key u0(id, v, vv));") + tk.MustExec("insert into t values(1, 1, 1, 1);") + se1, err := session.CreateSession(s.store) + c.Assert(err, IsNil) + tk1 := testkit.NewTestKitWithSession(c, s.store, se1) + se2, err := session.CreateSession(s.store) + c.Assert(err, IsNil) + tk2 := testkit.NewTestKitWithSession(c, s.store, se2) + se3, err := session.CreateSession(s.store) + c.Assert(err, IsNil) + tk3 := testkit.NewTestKitWithSession(c, s.store, se3) + tk1.MustExec("begin pessimistic;") + tk1.MustExec("use test") + tk2.MustExec("begin pessimistic;") + tk2.MustExec("use test") + tk3.MustExec("begin pessimistic;") + tk3.MustExec("use test") + tk1.MustExec("delete from t where id = 1 and v = 1 and vv = 1;") + stop1, stop2 := make(chan struct{}), make(chan struct{}) + go func() { + tk2.MustExec("insert into t values(1, 2, 3, 4);") + stop1 <- struct{}{} + tk3.MustExec("update t set id = 10, v = 20, vv = 30, vvv = 40 where id = 1 and v = 2 and vv = 3;") + stop2 <- struct{}{} + }() + tk1.MustExec("commit;") + <-stop1 + + // wait 50ms to ensure tk3 is blocked by tk2 + select { + case <-stop2: + c.Fail() + case <-time.After(50 * time.Millisecond): + } + + tk2.MustExec("commit;") + <-stop2 + tk3.MustExec("commit;") + tk3.MustQuery("select * from t;").Check(testkit.Rows("10 20 30 40")) +} + +func (s *testPointGetSuite) TestPointGetWithInvisibleIndex(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (c1 int, unique(c1))") + tk.MustExec("alter table t alter index c1 invisible") + tk.MustQuery("explain format = 'brief' select * from t where c1 = 10").Check(testkit.Rows( + "TableReader 1.00 root data:Selection", + "└─Selection 1.00 cop[tikv] eq(test.t.c1, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) +} + +func (s *testPointGetSuite) TestBatchPointGetWithInvisibleIndex(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (c1 int, unique(c1))") + tk.MustExec("alter table t alter index c1 invisible") + tk.MustQuery("explain format = 'brief' select * from t where c1 in (10, 20)").Check(testkit.Rows( + "TableReader 2.00 root data:Selection", + "└─Selection 2.00 cop[tikv] in(test.t.c1, 10, 20)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) +} + +func (s *testPointGetSuite) TestCBOShouldNotUsePointGet(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop tables if exists t1, t2, t3, t4, t5") + tk.MustExec("create table t1(id varchar(20) primary key)") + tk.MustExec("create table t2(id varchar(20), unique(id))") + tk.MustExec("create table t3(id varchar(20), d varchar(20), unique(id, d))") + tk.MustExec("create table t4(id int, d varchar(20), c varchar(20), unique(id, d))") + tk.MustExec("create table t5(id bit(64) primary key)") + tk.MustExec("insert into t1 values('asdf'), ('1asdf')") + tk.MustExec("insert into t2 values('asdf'), ('1asdf')") + tk.MustExec("insert into t3 values('asdf', 't'), ('1asdf', 't')") + tk.MustExec("insert into t4 values(1, 'b', 'asdf'), (1, 'c', 'jkl'), (1, 'd', '1jkl')") + tk.MustExec("insert into t5 values(48)") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, sql := range input { + plan := tk.MustQuery("explain format = 'brief' " + sql) + res := tk.MustQuery(sql) + s.testData.OnRecord(func() { + output[i].SQL = sql + output[i].Plan = s.testData.ConvertRowsToStrings(plan.Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(res.Rows()) + }) + plan.Check(testkit.Rows(output[i].Plan...)) + res.Check(testkit.Rows(output[i].Res...)) + } +} diff --git a/planner/core/prepare_test.go b/planner/core/prepare_test.go index c12b5a6a6da44..6cdc6af508c56 100644 --- a/planner/core/prepare_test.go +++ b/planner/core/prepare_test.go @@ -15,6 +15,7 @@ package core_test import ( "context" + "fmt" "math" "strconv" "time" @@ -195,7 +196,7 @@ func (s *testPlanSerialSuite) TestPrepareCacheDeferredFunction(c *C) { stmt, err := s.ParseOneStmt(sql1, "", "") c.Check(err, IsNil) is := tk.Se.GetSessionVars().TxnCtx.InfoSchema.(infoschema.InfoSchema) - builder := core.NewPlanBuilder(tk.Se, is, &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder(tk.Se, is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Check(err, IsNil) execPlan, ok := p.(*core.Execute) @@ -367,6 +368,39 @@ func (s *testPrepareSuite) TestPrepareWithWindowFunction(c *C) { tk.MustQuery("execute stmt2 using @a, @b").Check(testkit.Rows("0", "0")) } +func (s *testPrepareSuite) TestPrepareWithSnapshot(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + + safePointName := "tikv_gc_safe_point" + safePointValue := "20060102-15:04:05 -0700" + safePointComment := "All versions after safe point can be accessed. (DO NOT EDIT)" + updateSafePoint := fmt.Sprintf(`INSERT INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') + ON DUPLICATE KEY + UPDATE variable_value = '%[2]s', comment = '%[3]s'`, safePointName, safePointValue, safePointComment) + tk.MustExec(updateSafePoint) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int primary key, v int)") + tk.MustExec("insert into t select 1, 2") + tk.MustExec("begin") + ts := tk.MustQuery("select @@tidb_current_ts").Rows()[0][0].(string) + tk.MustExec("commit") + tk.MustExec("update t set v = 3 where id = 1") + tk.MustExec("prepare s1 from 'select * from t where id = 1';") + tk.MustExec("prepare s2 from 'select * from t';") + tk.MustExec("set @@tidb_snapshot = " + ts) + tk.MustQuery("execute s1").Check(testkit.Rows("1 2")) + tk.MustQuery("execute s2").Check(testkit.Rows("1 2")) +} + func (s *testPrepareSuite) TestPrepareForGroupByItems(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -392,6 +426,25 @@ func (s *testPrepareSuite) TestPrepareForGroupByItems(c *C) { tk.MustQuery("execute s1 using @a;").Check(testkit.Rows("3")) } +func (s *testPrepareSuite) TestPrepareCacheForClusteredIndex(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + defer func() { + dom.Close() + store.Close() + }() + tk.MustExec("use test") + tk.MustExec("create table t1(k varchar(100) primary key clustered, v1 int, v2 int)") + tk.MustExec("insert into t1 (k, v1, v2) values('a', 1, 2), ('b', 1, 1)") + tk.MustExec("create table t2(k varchar(100) primary key clustered, v int)") + tk.MustExec("insert into t2 (k, v) values('c', 100)") + tk.MustExec(`prepare prepare_1 from " select v2, v from t1 left join t2 on v1 != v2 "`) + tk.MustQuery("execute prepare_1").Check(testkit.Rows("2 100", "1 ")) + tk.MustQuery("execute prepare_1").Check(testkit.Rows("2 100", "1 ")) +} + func (s *testPrepareSerialSuite) TestPrepareCacheForPartition(c *C) { defer testleak.AfterTest(c)() store, dom, err := newStoreWithBootstrap() @@ -411,7 +464,7 @@ func (s *testPrepareSerialSuite) TestPrepareCacheForPartition(c *C) { c.Assert(err, IsNil) tk.MustExec("use test") - for _, val := range []string{string(variable.StaticOnly), string(variable.DynamicOnly)} { + for _, val := range []string{string(variable.Static), string(variable.Dynamic)} { tk.MustExec("set @@tidb_partition_prune_mode = '" + val + "'") // Test for PointGet and IndexRead. tk.MustExec("drop table if exists t_index_read") @@ -477,6 +530,42 @@ func (s *testPrepareSerialSuite) TestPrepareCacheForPartition(c *C) { tk.MustQuery("execute stmt6 using @id").Check(testkit.Rows("xyz")) tk.MustExec("set @id=17") tk.MustQuery("execute stmt6 using @id").Check(testkit.Rows("hij")) + + // Test for list partition + tk.MustExec("drop table if exists t_list_index") + tk.MustExec("create table t_list_index (id int, k int, c varchar(10), primary key(id)) partition by list (id*2-id) ( PARTITION p0 VALUES IN (1,2,3,4), PARTITION p1 VALUES IN (5,6,7,8),PARTITION p2 VALUES IN (9,10,11,12))") + tk.MustExec("insert into t_list_index values (1, 1, 'abc'), (5, 5, 'def'), (9, 9, 'xyz'), (12, 12, 'hij')") + tk.MustExec("prepare stmt7 from 'select c from t_list_index where id = ?'") + tk.MustExec("set @id=1") + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("abc")) + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("abc")) + tk.MustExec("set @id=5") + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("def")) + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("def")) + tk.MustExec("set @id=9") + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("xyz")) + tk.MustExec("set @id=12") + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows("hij")) + tk.MustExec("set @id=100") + tk.MustQuery("execute stmt7 using @id").Check(testkit.Rows()) + + // Test for list columns partition + tk.MustExec("drop table if exists t_list_index") + tk.MustExec("create table t_list_index (id int, k int, c varchar(10), primary key(id)) partition by list columns (id) ( PARTITION p0 VALUES IN (1,2,3,4), PARTITION p1 VALUES IN (5,6,7,8),PARTITION p2 VALUES IN (9,10,11,12))") + tk.MustExec("insert into t_list_index values (1, 1, 'abc'), (5, 5, 'def'), (9, 9, 'xyz'), (12, 12, 'hij')") + tk.MustExec("prepare stmt8 from 'select c from t_list_index where id = ?'") + tk.MustExec("set @id=1") + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("abc")) + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("abc")) + tk.MustExec("set @id=5") + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("def")) + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("def")) + tk.MustExec("set @id=9") + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("xyz")) + tk.MustExec("set @id=12") + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows("hij")) + tk.MustExec("set @id=100") + tk.MustQuery("execute stmt8 using @id").Check(testkit.Rows()) } } @@ -781,15 +870,15 @@ func (s *testPlanSerialSuite) TestIssue18066(c *C) { tk.MustExec("create table t(a int)") tk.MustExec("prepare stmt from 'select * from t'") tk.MustQuery("execute stmt").Check(testkit.Rows()) - tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from t'").Check( + tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( testkit.Rows("1 0 0")) tk.MustQuery("execute stmt").Check(testkit.Rows()) - tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from t'").Check( + tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( testkit.Rows("2 1 1")) tk.MustExec("prepare stmt from 'select * from t'") tk.MustQuery("execute stmt").Check(testkit.Rows()) tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) - tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from t'").Check( + tk.MustQuery("select EXEC_COUNT,plan_cache_hits, plan_in_cache from information_schema.statements_summary where digest_text='select * from `t`'").Check( testkit.Rows("3 1 0")) } @@ -856,3 +945,82 @@ func (s *testPrepareSuite) TestInvisibleIndex(c *C) { c.Assert(len(tk.Se.GetSessionVars().StmtCtx.IndexNames), Equals, 1) c.Assert(tk.Se.GetSessionVars().StmtCtx.IndexNames[0], Equals, "t:idx_a") } + +// Test for issue https://github.com/pingcap/tidb/issues/22167 +func (s *testPrepareSerialSuite) TestPrepareCacheWithJoinTable(c *C) { + defer testleak.AfterTest(c)() + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + dom.Close() + store.Close() + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists ta, tb") + tk.MustExec("CREATE TABLE ta(k varchar(32) NOT NULL DEFAULT ' ')") + tk.MustExec("CREATE TABLE tb (k varchar(32) NOT NULL DEFAULT ' ', s varchar(1) NOT NULL DEFAULT ' ')") + tk.MustExec("insert into ta values ('a')") + tk.MustExec("set @a=2, @b=1") + tk.MustExec(`prepare stmt from "select * from ta a left join tb b on 1 where ? = 1 or b.s is not null"`) + tk.MustQuery("execute stmt using @a").Check(testkit.Rows()) + tk.MustQuery("execute stmt using @b").Check(testkit.Rows("a ")) +} + +func (s *testPlanSerialSuite) TestPlanCacheSnapshot(c *C) { + store, _, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + tk := testkit.NewTestKit(c, store) + orgEnable := core.PreparedPlanCacheEnabled() + defer func() { + store.Close() + core.SetPreparedPlanCache(orgEnable) + }() + core.SetPreparedPlanCache(true) + + tk.Se, err = session.CreateSession4TestWithOpt(store, &session.Opt{ + PreparedPlanCache: kvcache.NewSimpleLRUCache(100, 0.1, math.MaxUint64), + }) + c.Assert(err, IsNil) + + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(id int)") + tk.MustExec("insert into t values (1),(2),(3),(4)") + + // For mocktikv, safe point is not initialized, we manually insert it for snapshot to use. + timeSafe := time.Now().Add(-48 * 60 * 60 * time.Second).Format("20060102-15:04:05 -0700 MST") + safePointSQL := `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('tikv_gc_safe_point', '%[1]s', '') + ON DUPLICATE KEY + UPDATE variable_value = '%[1]s'` + tk.MustExec(fmt.Sprintf(safePointSQL, timeSafe)) + + tk.MustExec("prepare stmt from 'select * from t where id=?'") + tk.MustExec("set @p = 1") + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @p").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("0")) + tk.MustQuery("execute stmt using @p").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) + + // Record the current tso. + tk.MustExec("begin") + tso := tk.Se.GetSessionVars().TxnCtx.StartTS + tk.MustExec("rollback") + c.Assert(tso > 0, IsTrue) + // Insert one more row with id = 1. + tk.MustExec("insert into t values (1)") + + tk.MustExec(fmt.Sprintf("set @@tidb_snapshot = '%d'", tso)) + tk.MustQuery("select * from t where id = 1").Check(testkit.Rows("1")) + tk.MustQuery("execute stmt using @p").Check(testkit.Rows("1")) + tk.MustQuery("select @@last_plan_from_cache").Check(testkit.Rows("1")) +} diff --git a/planner/core/preprocess.go b/planner/core/preprocess.go index eb5cbad22d13e..7c00903139efc 100644 --- a/planner/core/preprocess.go +++ b/planner/core/preprocess.go @@ -21,17 +21,20 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser" "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/meta/autoid" + "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" driver "github.com/pingcap/tidb/types/parser_driver" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/domainutil" + utilparser "github.com/pingcap/tidb/util/parser" ) // PreprocessOpt presents optional parameters to `Preprocess` method. @@ -108,10 +111,11 @@ const ( // preprocessor is an ast.Visitor that preprocess // ast Nodes parsed from parser. type preprocessor struct { - is infoschema.InfoSchema - ctx sessionctx.Context - err error - flag preprocessorFlag + is infoschema.InfoSchema + ctx sessionctx.Context + err error + flag preprocessorFlag + stmtTp byte // tableAliasInJoin is a stack that keeps the table alias names for joins. // len(tableAliasInJoin) may bigger than 1 because the left/right child of join may be subquery that contains `JOIN` @@ -120,49 +124,70 @@ type preprocessor struct { func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { switch node := in.(type) { + case *ast.DeleteStmt: + p.stmtTp = TypeDelete + case *ast.SelectStmt: + p.stmtTp = TypeSelect + case *ast.UpdateStmt: + p.stmtTp = TypeUpdate + case *ast.InsertStmt: + p.stmtTp = TypeInsert case *ast.CreateTableStmt: + p.stmtTp = TypeCreate p.flag |= inCreateOrDropTable p.resolveCreateTableStmt(node) p.checkCreateTableGrammar(node) case *ast.CreateViewStmt: + p.stmtTp = TypeCreate p.flag |= inCreateOrDropTable p.checkCreateViewGrammar(node) p.checkCreateViewWithSelectGrammar(node) case *ast.DropTableStmt: p.flag |= inCreateOrDropTable + p.stmtTp = TypeDrop p.checkDropTableGrammar(node) case *ast.RenameTableStmt: + p.stmtTp = TypeRename p.flag |= inCreateOrDropTable p.checkRenameTableGrammar(node) case *ast.CreateIndexStmt: + p.stmtTp = TypeCreate p.checkCreateIndexGrammar(node) case *ast.AlterTableStmt: + p.stmtTp = TypeAlter p.resolveAlterTableStmt(node) p.checkAlterTableGrammar(node) case *ast.CreateDatabaseStmt: + p.stmtTp = TypeCreate p.checkCreateDatabaseGrammar(node) case *ast.AlterDatabaseStmt: + p.stmtTp = TypeAlter p.checkAlterDatabaseGrammar(node) case *ast.DropDatabaseStmt: + p.stmtTp = TypeDrop p.checkDropDatabaseGrammar(node) case *ast.ShowStmt: + p.stmtTp = TypeShow p.resolveShowStmt(node) case *ast.SetOprSelectList: p.checkSetOprSelectList(node) case *ast.DeleteTableList: + p.stmtTp = TypeDelete return in, true case *ast.Join: p.checkNonUniqTableAlias(node) case *ast.CreateBindingStmt: + p.stmtTp = TypeCreate EraseLastSemicolon(node.OriginNode) EraseLastSemicolon(node.HintedNode) - p.checkBindGrammar(node.OriginNode, node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode, p.ctx.GetSessionVars().CurrentDB) return in, true case *ast.DropBindingStmt: + p.stmtTp = TypeDrop EraseLastSemicolon(node.OriginNode) if node.HintedNode != nil { EraseLastSemicolon(node.HintedNode) - p.checkBindGrammar(node.OriginNode, node.HintedNode) + p.checkBindGrammar(node.OriginNode, node.HintedNode, p.ctx.GetSessionVars().CurrentDB) } return in, true case *ast.RecoverTableStmt, *ast.FlashBackTableStmt: @@ -171,15 +196,20 @@ func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { // table not exists error. But recover table statement is use to recover the dropped table. So skip children here. return in, true case *ast.RepairTableStmt: + p.stmtTp = TypeRepair // The RepairTable should consist of the logic for creating tables and renaming tables. p.flag |= inRepairTable p.checkRepairTableGrammar(node) case *ast.CreateSequenceStmt: + p.stmtTp = TypeCreate p.flag |= inCreateOrDropTable p.resolveCreateSequenceStmt(node) case *ast.DropSequenceStmt: + p.stmtTp = TypeDrop p.flag |= inCreateOrDropTable p.checkDropSequenceGrammar(node) + case *ast.FuncCastExpr: + p.checkFuncCastExpr(node) case *ast.FuncCallExpr: if node.FnName.L == ast.NextVal || node.FnName.L == ast.LastVal || node.FnName.L == ast.SetVal { p.flag |= inSequenceFunction @@ -193,8 +223,15 @@ func (p *preprocessor) Enter(in ast.Node) (out ast.Node, skipChildren bool) { if _, ok := node.Source.(*ast.SelectStmt); ok && !isModeOracle && len(node.AsName.L) == 0 { p.err = ddl.ErrDerivedMustHaveAlias.GenWithStackByArgs() } - case *ast.CreateStatisticsStmt, *ast.DropStatisticsStmt: - p.checkStatisticsOpGrammar(in) + if v, ok := node.Source.(*ast.TableName); ok && v.TableSample != nil { + switch v.TableSample.SampleMethod { + case ast.SampleMethodTypeTiDBRegion: + default: + p.err = expression.ErrInvalidTableSample.GenWithStackByArgs("Only supports REGIONS sampling method") + } + } + case *ast.GroupByClause: + p.checkGroupBy(node) default: p.flag &= ^parentIsJoin } @@ -209,18 +246,77 @@ func EraseLastSemicolon(stmt ast.StmtNode) { } } -func (p *preprocessor) checkBindGrammar(originNode, hintedNode ast.StmtNode) { - var originSQL, hintedSQL string - switch node := originNode.(type) { +// EraseLastSemicolonInSQL removes last semicolon of the SQL. +func EraseLastSemicolonInSQL(sql string) string { + if len(sql) > 0 && sql[len(sql)-1] == ';' { + return sql[:len(sql)-1] + } + return sql +} + +const ( + // TypeInvalid for unexpected types. + TypeInvalid byte = iota + // TypeSelect for SelectStmt. + TypeSelect + // TypeSetOpr for SetOprStmt. + TypeSetOpr + // TypeDelete for DeleteStmt. + TypeDelete + // TypeUpdate for UpdateStmt. + TypeUpdate + // TypeInsert for InsertStmt. + TypeInsert + // TypeDrop for DropStmt + TypeDrop + // TypeCreate for CreateStmt + TypeCreate + // TypeAlter for AlterStmt + TypeAlter + // TypeRename for RenameStmt + TypeRename + // TypeRepair for RepairStmt + TypeRepair + // TypeShow for ShowStmt + TypeShow +) + +func bindableStmtType(node ast.StmtNode) byte { + switch node.(type) { case *ast.SelectStmt: - originSQL = parser.Normalize(node.Text()) - hintedSQL = parser.Normalize(hintedNode.(*ast.SelectStmt).Text()) + return TypeSelect case *ast.SetOprStmt: - originSQL = parser.Normalize(node.Text()) - hintedSQL = parser.Normalize(hintedNode.(*ast.SetOprStmt).Text()) - default: + return TypeSetOpr + case *ast.DeleteStmt: + return TypeDelete + case *ast.UpdateStmt: + return TypeUpdate + case *ast.InsertStmt: + return TypeInsert + } + return TypeInvalid +} + +func (p *preprocessor) checkBindGrammar(originNode, hintedNode ast.StmtNode, defaultDB string) { + origTp := bindableStmtType(originNode) + hintedTp := bindableStmtType(hintedNode) + if origTp == TypeInvalid || hintedTp == TypeInvalid { p.err = errors.Errorf("create binding doesn't support this type of query") + return + } + if origTp != hintedTp { + p.err = errors.Errorf("hinted sql and original sql have different query types") + return + } + if origTp == TypeInsert { + origInsert, hintedInsert := originNode.(*ast.InsertStmt), hintedNode.(*ast.InsertStmt) + if origInsert.Select == nil || hintedInsert.Select == nil { + p.err = errors.Errorf("create binding only supports INSERT / REPLACE INTO SELECT") + return + } } + originSQL := parser.Normalize(utilparser.RestoreWithDefaultDB(originNode, defaultDB, originNode.Text())) + hintedSQL := parser.Normalize(utilparser.RestoreWithDefaultDB(hintedNode, defaultDB, hintedNode.Text())) if originSQL != hintedSQL { p.err = errors.Errorf("hinted sql and origin sql don't match when hinted sql erase the hint info, after erase hint info, originSQL:%s, hintedSQL:%s", originSQL, hintedSQL) } @@ -466,6 +562,11 @@ func (p *preprocessor) checkCreateTableGrammar(stmt *ast.CreateTableStmt) { p.err = ddl.ErrWrongTableName.GenWithStackByArgs(tName) return } + enableNoopFuncs := p.ctx.GetSessionVars().EnableNoopFuncs + if stmt.IsTemporary && !enableNoopFuncs { + p.err = expression.ErrFunctionsNoopImpl.GenWithStackByArgs("CREATE TEMPORARY TABLE") + return + } countPrimaryKey := 0 for _, colDef := range stmt.Cols { if err := checkColumn(colDef); err != nil { @@ -491,6 +592,10 @@ func (p *preprocessor) checkCreateTableGrammar(stmt *ast.CreateTableStmt) { p.err = err return } + if constraint.IsEmptyIndex { + p.err = ddl.ErrWrongNameForIndex.GenWithStackByArgs(constraint.Name) + return + } case ast.ConstraintPrimaryKey: if countPrimaryKey > 0 { p.err = infoschema.ErrMultiplePriKey @@ -569,6 +674,11 @@ func (p *preprocessor) checkDropSequenceGrammar(stmt *ast.DropSequenceStmt) { func (p *preprocessor) checkDropTableGrammar(stmt *ast.DropTableStmt) { p.checkDropTableNames(stmt.Tables) + enableNoopFuncs := p.ctx.GetSessionVars().EnableNoopFuncs + if stmt.IsTemporary && !enableNoopFuncs { + p.err = expression.ErrFunctionsNoopImpl.GenWithStackByArgs("DROP TEMPORARY TABLE") + return + } } func (p *preprocessor) checkDropTableNames(tables []*ast.TableName) { @@ -646,27 +756,26 @@ func (p *preprocessor) checkCreateIndexGrammar(stmt *ast.CreateIndexStmt) { p.err = ddl.ErrWrongTableName.GenWithStackByArgs(tName) return } + if stmt.IndexName == "" { + p.err = ddl.ErrWrongNameForIndex.GenWithStackByArgs(stmt.IndexName) + return + } p.err = checkIndexInfo(stmt.IndexName, stmt.IndexPartSpecifications) } -func (p *preprocessor) checkStatisticsOpGrammar(node ast.Node) { - var statsName string - switch stmt := node.(type) { - case *ast.CreateStatisticsStmt: - statsName = stmt.StatsName - case *ast.DropStatisticsStmt: - statsName = stmt.StatsName - } - if isIncorrectName(statsName) { - msg := fmt.Sprintf("Incorrect statistics name: %s", statsName) - p.err = ErrInternal.GenWithStack(msg) +func (p *preprocessor) checkGroupBy(stmt *ast.GroupByClause) { + enableNoopFuncs := p.ctx.GetSessionVars().EnableNoopFuncs + for _, item := range stmt.Items { + if !item.NullOrder && !enableNoopFuncs { + p.err = expression.ErrFunctionsNoopImpl.GenWithStackByArgs("GROUP BY expr ASC|DESC") + return + } } - return } func (p *preprocessor) checkRenameTableGrammar(stmt *ast.RenameTableStmt) { - oldTable := stmt.OldTable.Name.String() - newTable := stmt.NewTable.Name.String() + oldTable := stmt.TableToTables[0].OldTable.Name.String() + newTable := stmt.TableToTables[0].NewTable.Name.String() p.checkRenameTable(oldTable, newTable) } @@ -735,6 +844,13 @@ func (p *preprocessor) checkAlterTableGrammar(stmt *ast.AlterTableStmt) { default: // Nothing to do now. } + case ast.AlterTableAddStatistics, ast.AlterTableDropStatistics: + statsName := spec.Statistics.StatsName + if isIncorrectName(statsName) { + msg := fmt.Sprintf("Incorrect statistics name: %s", statsName) + p.err = ErrInternal.GenWithStack(msg) + return + } default: // Nothing to do now. } @@ -769,13 +885,41 @@ func checkIndexInfo(indexName string, IndexPartSpecifications []*ast.IndexPartSp // checkUnsupportedTableOptions checks if there exists unsupported table options func checkUnsupportedTableOptions(options []*ast.TableOption) error { + var err error = nil for _, option := range options { switch option.Tp { case ast.TableOptionUnion: - return ddl.ErrTableOptionUnionUnsupported + err = ddl.ErrTableOptionUnionUnsupported case ast.TableOptionInsertMethod: - return ddl.ErrTableOptionInsertMethodUnsupported + err = ddl.ErrTableOptionInsertMethodUnsupported + case ast.TableOptionEngine: + err = checkTableEngine(option.StrValue) } + if err != nil { + return err + } + } + return nil +} + +var mysqlValidTableEngineNames = map[string]struct{}{ + "archive": {}, + "blackhole": {}, + "csv": {}, + "example": {}, + "federated": {}, + "innodb": {}, + "memory": {}, + "merge": {}, + "mgr_myisam": {}, + "myisam": {}, + "ndb": {}, + "heap": {}, +} + +func checkTableEngine(engineName string) error { + if _, have := mysqlValidTableEngineNames[strings.ToLower(engineName)]; !have { + return ddl.ErrUnknownEngine.GenWithStackByArgs(engineName) } return nil } @@ -819,11 +963,27 @@ func checkColumn(colDef *ast.ColumnDef) error { return err } case mysql.TypeFloat, mysql.TypeDouble: - if tp.Decimal > mysql.MaxFloatingTypeScale { - return types.ErrTooBigScale.GenWithStackByArgs(tp.Decimal, colDef.Name.Name.O, mysql.MaxFloatingTypeScale) - } - if tp.Flen > mysql.MaxFloatingTypeWidth { - return types.ErrTooBigPrecision.GenWithStackByArgs(tp.Flen, colDef.Name.Name.O, mysql.MaxFloatingTypeWidth) + // For FLOAT, the SQL standard permits an optional specification of the precision. + // https://dev.mysql.com/doc/refman/8.0/en/floating-point-types.html + if tp.Decimal == -1 { + switch tp.Tp { + case mysql.TypeDouble: + // For Double type Flen and Decimal check is moved to parser component + default: + if tp.Flen > mysql.MaxDoublePrecisionLength { + return types.ErrWrongFieldSpec.GenWithStackByArgs(colDef.Name.Name.O) + } + } + } else { + if tp.Decimal > mysql.MaxFloatingTypeScale { + return types.ErrTooBigScale.GenWithStackByArgs(tp.Decimal, colDef.Name.Name.O, mysql.MaxFloatingTypeScale) + } + if tp.Flen > mysql.MaxFloatingTypeWidth || tp.Flen == 0 { + return types.ErrTooBigDisplayWidth.GenWithStackByArgs(colDef.Name.Name.O, mysql.MaxFloatingTypeWidth) + } + if tp.Flen < tp.Decimal { + return types.ErrMBiggerThanD.GenWithStackByArgs(colDef.Name.Name.O) + } } case mysql.TypeSet: if len(tp.Elems) > mysql.MaxTypeSetMembers { @@ -843,6 +1003,15 @@ func checkColumn(colDef *ast.ColumnDef) error { if tp.Flen > mysql.MaxDecimalWidth { return types.ErrTooBigPrecision.GenWithStackByArgs(tp.Flen, colDef.Name.Name.O, mysql.MaxDecimalWidth) } + + if tp.Flen < tp.Decimal { + return types.ErrMBiggerThanD.GenWithStackByArgs(colDef.Name.Name.O) + } + // If decimal and flen all equals 0, just set flen to default value. + if tp.Decimal == 0 && tp.Flen == 0 { + defaultFlen, _ := mysql.GetDefaultFieldLengthAndDecimal(mysql.TypeNewDecimal) + tp.Flen = defaultFlen + } case mysql.TypeBit: if tp.Flen <= 0 { return types.ErrInvalidFieldSize.GenWithStackByArgs(colDef.Name.Name.O) @@ -914,6 +1083,32 @@ func (p *preprocessor) checkContainDotColumn(stmt *ast.CreateTableStmt) { } } +func (p *preprocessor) stmtType() string { + + switch p.stmtTp { + case TypeDelete: + return "DELETE" + case TypeUpdate: + return "UPDATE" + case TypeInsert: + return "INSERT" + case TypeDrop: + return "DROP" + case TypeCreate: + return "CREATE" + case TypeAlter: + return "ALTER" + case TypeRename: + return "DROP, ALTER" + case TypeRepair: + return "SELECT, INSERT" + case TypeShow: + return "SHOW" + default: + return "SELECT" // matches Select and uncaught cases. + } +} + func (p *preprocessor) handleTableName(tn *ast.TableName) { if tn.Schema.L == "" { currentDB := p.ctx.GetSessionVars().CurrentDB @@ -944,6 +1139,22 @@ func (p *preprocessor) handleTableName(tn *ast.TableName) { table, err := p.is.TableByName(tn.Schema, tn.Name) if err != nil { + // We should never leak that the table doesn't exist (i.e. attach ErrTableNotExists) + // unless we know that the user has permissions to it, should it exist. + // By checking here, this makes all SELECT/SHOW/INSERT/UPDATE/DELETE statements safe. + currentUser, activeRoles := p.ctx.GetSessionVars().User, p.ctx.GetSessionVars().ActiveRoles + if pm := privilege.GetPrivilegeManager(p.ctx); pm != nil { + if !pm.RequestVerification(activeRoles, tn.Schema.L, tn.Name.O, "", mysql.AllPrivMask) { + u := currentUser.Username + h := currentUser.Hostname + if currentUser.AuthHostname != "" { + u = currentUser.AuthUsername + h = currentUser.AuthHostname + } + p.err = ErrTableaccessDenied.GenWithStackByArgs(p.stmtType(), u, h, tn.Name.O) + return + } + } p.err = err return } @@ -1042,3 +1253,31 @@ func (p *preprocessor) resolveCreateSequenceStmt(stmt *ast.CreateSequenceStmt) { return } } + +func (p *preprocessor) checkFuncCastExpr(node *ast.FuncCastExpr) { + if node.Tp.EvalType() == types.ETDecimal { + if node.Tp.Flen >= node.Tp.Decimal && node.Tp.Flen <= mysql.MaxDecimalWidth && node.Tp.Decimal <= mysql.MaxDecimalScale { + // valid + return + } + + var buf strings.Builder + restoreCtx := format.NewRestoreCtx(format.DefaultRestoreFlags, &buf) + if err := node.Expr.Restore(restoreCtx); err != nil { + p.err = err + return + } + if node.Tp.Flen < node.Tp.Decimal { + p.err = types.ErrMBiggerThanD.GenWithStackByArgs(buf.String()) + return + } + if node.Tp.Flen > mysql.MaxDecimalWidth { + p.err = types.ErrTooBigPrecision.GenWithStackByArgs(node.Tp.Flen, buf.String(), mysql.MaxDecimalWidth) + return + } + if node.Tp.Decimal > mysql.MaxDecimalScale { + p.err = types.ErrTooBigScale.GenWithStackByArgs(node.Tp.Decimal, buf.String(), mysql.MaxDecimalScale) + return + } + } +} diff --git a/planner/core/preprocess_test.go b/planner/core/preprocess_test.go index 082c4e296f0d3..14b006c836ca9 100644 --- a/planner/core/preprocess_test.go +++ b/planner/core/preprocess_test.go @@ -20,9 +20,11 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -58,7 +60,7 @@ func (s *testValidatorSuite) SetUpTest(c *C) { func (s *testValidatorSuite) runSQL(c *C, sql string, inPrepare bool, terr error) { stmts, err1 := session.Parse(s.ctx, sql) - c.Assert(err1, IsNil) + c.Assert(err1, IsNil, Commentf("sql: %s", sql)) c.Assert(stmts, HasLen, 1) stmt := stmts[0] var opts []core.PreprocessOpt @@ -218,11 +220,16 @@ func (s *testValidatorSuite) TestValidator(c *C) { {"CREATE TABLE t (a float(255, 30))", true, nil}, {"CREATE TABLE t (a double(255, 30))", true, nil}, - {"CREATE TABLE t (a float(256, 30))", false, types.ErrTooBigPrecision}, + {"CREATE TABLE t (a float(256, 30))", false, types.ErrTooBigDisplayWidth}, {"CREATE TABLE t (a float(255, 31))", false, types.ErrTooBigScale}, - {"CREATE TABLE t (a double(256, 30))", false, types.ErrTooBigPrecision}, + {"CREATE TABLE t (a double(256, 30))", false, types.ErrTooBigDisplayWidth}, {"CREATE TABLE t (a double(255, 31))", false, types.ErrTooBigScale}, + // issue 20447 + {"CREATE TABLE t (a float(53))", true, nil}, + {"CREATE TABLE t (a float(54))", false, types.ErrWrongFieldSpec}, + {"CREATE TABLE t (a double)", true, nil}, + // FIXME: temporary 'not implemented yet' test for 'CREATE TABLE ... SELECT' (issue 4754) {"CREATE TABLE t SELECT * FROM u", false, errors.New("'CREATE TABLE ... SELECT' is not implemented yet")}, {"CREATE TABLE t (m int) SELECT * FROM u", false, errors.New("'CREATE TABLE ... SELECT' is not implemented yet")}, @@ -255,6 +262,41 @@ func (s *testValidatorSuite) TestValidator(c *C) { {"CREATE TABLE origin (a int primary key auto_increment, b int);", false, nil}, {"CREATE TABLE origin (a int unique auto_increment, b int);", false, nil}, {"CREATE TABLE origin (a int key auto_increment, b int);", false, nil}, + + // issue 18149 + {"CREATE TABLE t (a int, index ``(a));", true, errors.New("[ddl:1280]Incorrect index name ''")}, + {"CREATE TABLE t (a int, b int, index ``((a+1), (b+1)));", true, errors.New("[ddl:1280]Incorrect index name ''")}, + {"CREATE TABLE t (a int, key ``(a));", true, errors.New("[ddl:1280]Incorrect index name ''")}, + {"CREATE TABLE t (a int, b int, key ``((a+1), (b+1)));", true, errors.New("[ddl:1280]Incorrect index name ''")}, + {"CREATE TABLE t (a int, index(a));", false, nil}, + {"CREATE INDEX `` on t (a);", true, errors.New("[ddl:1280]Incorrect index name ''")}, + {"CREATE INDEX `` on t ((lower(a)));", true, errors.New("[ddl:1280]Incorrect index name ''")}, + + // issue 21082 + {"CREATE TABLE t (a int) ENGINE=Unknown;", false, ddl.ErrUnknownEngine}, + {"CREATE TABLE t (a int) ENGINE=InnoDB;", false, nil}, + {"CREATE TABLE t (a int);", false, nil}, + {"ALTER TABLE t ENGINE=InnoDB;", false, nil}, + {"ALTER TABLE t ENGINE=Unknown;", false, ddl.ErrUnknownEngine}, + + // issue 20295 + // issue 11193 + {"select cast(1.23 as decimal(65,65))", true, types.ErrTooBigScale.GenWithStackByArgs(65, "1.23", mysql.MaxDecimalScale)}, + {"select CONVERT( 2, DECIMAL(62,60) )", true, types.ErrTooBigScale.GenWithStackByArgs(60, "2", mysql.MaxDecimalScale)}, + {"select CONVERT( 2, DECIMAL(66,29) )", true, types.ErrTooBigPrecision.GenWithStackByArgs(66, "2", mysql.MaxDecimalWidth)}, + {"select CONVERT( 2, DECIMAL(28,29) )", true, types.ErrMBiggerThanD.GenWithStackByArgs("2")}, + {"select CONVERT( 2, DECIMAL(30,65) )", true, types.ErrMBiggerThanD.GenWithStackByArgs("2")}, + {"select CONVERT( 2, DECIMAL(66,99) )", true, types.ErrMBiggerThanD.GenWithStackByArgs("2")}, + + // https://github.com/pingcap/parser/issues/609 + {"CREATE TEMPORARY TABLE t (a INT);", false, expression.ErrFunctionsNoopImpl.GenWithStackByArgs("CREATE TEMPORARY TABLE")}, + {"DROP TEMPORARY TABLE t;", false, expression.ErrFunctionsNoopImpl.GenWithStackByArgs("DROP TEMPORARY TABLE")}, + + // TABLESAMPLE + {"select * from t tablesample bernoulli();", false, expression.ErrInvalidTableSample}, + {"select * from t tablesample bernoulli(10 rows);", false, expression.ErrInvalidTableSample}, + {"select * from t tablesample bernoulli(23 percent) repeatable (23);", false, expression.ErrInvalidTableSample}, + {"select * from t tablesample system() repeatable (10);", false, expression.ErrInvalidTableSample}, } _, err := s.se.Execute(context.Background(), "use test") diff --git a/planner/core/property_cols_prune.go b/planner/core/property_cols_prune.go index a57a06993893e..c8296aa799283 100644 --- a/planner/core/property_cols_prune.go +++ b/planner/core/property_cols_prune.go @@ -200,10 +200,11 @@ func (la *LogicalAggregation) PreparePossibleProperties(schema *expression.Schem return nil } resultProperties := make([][]*expression.Column, 0, len(childProps)) + groupByCols := la.GetGroupByCols() for _, possibleChildProperty := range childProps { - sortColOffsets := getMaxSortPrefix(possibleChildProperty, la.groupByCols) - if len(sortColOffsets) == len(la.groupByCols) { - resultProperties = append(resultProperties, possibleChildProperty[:len(la.groupByCols)]) + sortColOffsets := getMaxSortPrefix(possibleChildProperty, groupByCols) + if len(sortColOffsets) == len(groupByCols) { + resultProperties = append(resultProperties, possibleChildProperty[:len(groupByCols)]) } } la.possibleProperties = resultProperties diff --git a/planner/core/resolve_indices.go b/planner/core/resolve_indices.go index fc2c85e0fc0d2..11766681eecae 100644 --- a/planner/core/resolve_indices.go +++ b/planner/core/resolve_indices.go @@ -113,49 +113,6 @@ func (p *PhysicalHashJoin) ResolveIndices() (err error) { return } -// ResolveIndices implements Plan interface. -func (p *PhysicalBroadCastJoin) ResolveIndices() (err error) { - err = p.physicalSchemaProducer.ResolveIndices() - if err != nil { - return err - } - lSchema := p.children[0].Schema() - rSchema := p.children[1].Schema() - for i, col := range p.LeftJoinKeys { - newKey, err := col.ResolveIndices(lSchema) - if err != nil { - return err - } - p.LeftJoinKeys[i] = newKey.(*expression.Column) - } - for i, col := range p.RightJoinKeys { - newKey, err := col.ResolveIndices(rSchema) - if err != nil { - return err - } - p.RightJoinKeys[i] = newKey.(*expression.Column) - } - for i, expr := range p.LeftConditions { - p.LeftConditions[i], err = expr.ResolveIndices(lSchema) - if err != nil { - return err - } - } - for i, expr := range p.RightConditions { - p.RightConditions[i], err = expr.ResolveIndices(rSchema) - if err != nil { - return err - } - } - for i, expr := range p.OtherConditions { - p.OtherConditions[i], err = expr.ResolveIndices(expression.MergeSchema(lSchema, rSchema)) - if err != nil { - return err - } - } - return -} - // ResolveIndices implements Plan interface. func (p *PhysicalMergeJoin) ResolveIndices() (err error) { err = p.physicalSchemaProducer.ResolveIndices() @@ -251,6 +208,17 @@ func (p *PhysicalIndexJoin) ResolveIndices() (err error) { p.CompareFilters.affectedColSchema.Columns[i] = resolvedCol.(*expression.Column) } } + for i := range p.OuterHashKeys { + outerKey, err := p.OuterHashKeys[i].ResolveIndices(p.children[1-p.InnerChildIdx].Schema()) + if err != nil { + return err + } + innerKey, err := p.InnerHashKeys[i].ResolveIndices(p.children[p.InnerChildIdx].Schema()) + if err != nil { + return err + } + p.OuterHashKeys[i], p.InnerHashKeys[i] = outerKey.(*expression.Column), innerKey.(*expression.Column) + } return } @@ -384,6 +352,22 @@ func (p *PhysicalSelection) ResolveIndices() (err error) { return } +// ResolveIndices implements Plan interface. +func (p *PhysicalExchangeSender) ResolveIndices() (err error) { + err = p.basePhysicalPlan.ResolveIndices() + if err != nil { + return err + } + for i, col := range p.HashCols { + colExpr, err1 := col.ResolveIndices(p.children[0].Schema()) + if err1 != nil { + return err1 + } + p.HashCols[i], _ = colExpr.(*expression.Column) + } + return err +} + // ResolveIndices implements Plan interface. func (p *basePhysicalAgg) ResolveIndices() (err error) { err = p.physicalSchemaProducer.ResolveIndices() @@ -487,11 +471,15 @@ func (p *PhysicalShuffle) ResolveIndices() (err error) { if err != nil { return err } - for i := range p.HashByItems { - // "Shuffle" get value of items from `DataSource`, other than children[0]. - p.HashByItems[i], err = p.HashByItems[i].ResolveIndices(p.DataSource.Schema()) - if err != nil { - return err + // There may be one or more DataSource + for i := range p.ByItemArrays { + // Each DataSource has an array of HashByItems + for j := range p.ByItemArrays[i] { + // "Shuffle" get value of items from `DataSource`, other than children[0]. + p.ByItemArrays[i][j], err = p.ByItemArrays[i][j].ResolveIndices(p.DataSources[i].Schema()) + if err != nil { + return err + } } } return err diff --git a/planner/core/rule_aggregation_elimination.go b/planner/core/rule_aggregation_elimination.go index 7af0511c12864..143649b1f1271 100644 --- a/planner/core/rule_aggregation_elimination.go +++ b/planner/core/rule_aggregation_elimination.go @@ -51,7 +51,7 @@ func (a *aggregationEliminateChecker) tryToEliminateAggregation(agg *LogicalAggr return nil } } - schemaByGroupby := expression.NewSchema(agg.groupByCols...) + schemaByGroupby := expression.NewSchema(agg.GetGroupByCols()...) coveredByUniqueKey := false for _, key := range agg.children[0].Schema().Keys { if schemaByGroupby.ColumnsIndices(key) != nil { diff --git a/planner/core/rule_aggregation_push_down.go b/planner/core/rule_aggregation_push_down.go index 0c796e4b0c3f4..800915e345448 100644 --- a/planner/core/rule_aggregation_push_down.go +++ b/planner/core/rule_aggregation_push_down.go @@ -269,7 +269,6 @@ func (a *aggregationPushDownSolver) checkAnyCountAndSum(aggFuncs []*aggregation. func (a *aggregationPushDownSolver) makeNewAgg(ctx sessionctx.Context, aggFuncs []*aggregation.AggFuncDesc, gbyCols []*expression.Column, aggHints aggHintInfo, blockOffset int) (*LogicalAggregation, error) { agg := LogicalAggregation{ GroupByItems: expression.Column2Exprs(gbyCols), - groupByCols: gbyCols, aggHints: aggHints, }.Init(ctx, blockOffset) aggLen := len(aggFuncs) + len(gbyCols) @@ -302,11 +301,10 @@ func (a *aggregationPushDownSolver) splitPartialAgg(agg *LogicalAggregation) (pu AggFuncs: agg.AggFuncs, GroupByItems: agg.GroupByItems, Schema: agg.schema, - }, false) + }, false, false) agg.SetSchema(final.Schema) agg.AggFuncs = final.AggFuncs agg.GroupByItems = final.GroupByItems - agg.collectGroupByColumns() pushedAgg = LogicalAggregation{ AggFuncs: partial.AggFuncs, @@ -314,7 +312,6 @@ func (a *aggregationPushDownSolver) splitPartialAgg(agg *LogicalAggregation) (pu aggHints: agg.aggHints, }.Init(agg.ctx, agg.blockOffset) pushedAgg.SetSchema(partial.Schema) - pushedAgg.collectGroupByColumns() return } @@ -347,8 +344,7 @@ func (a *aggregationPushDownSolver) pushAggCrossUnion(agg *LogicalAggregation, u } newAgg.AggFuncs = append(newAgg.AggFuncs, firstRow) } - newAgg.collectGroupByColumns() - tmpSchema := expression.NewSchema(newAgg.groupByCols...) + tmpSchema := expression.NewSchema(newAgg.GetGroupByCols()...) // e.g. Union distinct will add a aggregation like `select join_agg_0, join_agg_1, join_agg_2 from t group by a, b, c` above UnionAll. // And the pushed agg will be something like `select a, b, c, a, b, c from t group by a, b, c`. So if we just return child as join does, // this will cause error during executor phase. @@ -434,7 +430,6 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e for i, gbyItem := range agg.GroupByItems { agg.GroupByItems[i] = expression.ColumnSubstitute(gbyItem, proj.schema, proj.Exprs) } - agg.collectGroupByColumns() for _, aggFunc := range agg.AggFuncs { newArgs := make([]expression.Expression, 0, len(aggFunc.Args)) for _, arg := range aggFunc.Args { @@ -444,7 +439,12 @@ func (a *aggregationPushDownSolver) aggPushDown(p LogicalPlan) (_ LogicalPlan, e } projChild := proj.children[0] agg.SetChildren(projChild) - } else if union, ok1 := child.(*LogicalUnionAll); ok1 && p.SCtx().GetSessionVars().AllowAggPushDown { + // When the origin plan tree is `Aggregation->Projection->Union All->X`, we need to merge 'Aggregation' and 'Projection' first. + // And then push the new 'Aggregation' below the 'Union All' . + // The final plan tree should be 'Aggregation->Union All->Aggregation->X'. + child = projChild + } + if union, ok1 := child.(*LogicalUnionAll); ok1 && p.SCtx().GetSessionVars().AllowAggPushDown { err := a.tryAggPushDownForUnion(union, agg) if err != nil { return nil, err diff --git a/planner/core/rule_build_key_info.go b/planner/core/rule_build_key_info.go index 11c4e41aa24fa..14a0e42936253 100644 --- a/planner/core/rule_build_key_info.go +++ b/planner/core/rule_build_key_info.go @@ -47,19 +47,9 @@ func (la *LogicalAggregation) BuildKeyInfo(selfSchema *expression.Schema, childS return } la.logicalSchemaProducer.BuildKeyInfo(selfSchema, childSchema) - for _, key := range childSchema[0].Keys { - indices := selfSchema.ColumnsIndices(key) - if indices == nil { - continue - } - newKey := make([]*expression.Column, 0, len(key)) - for _, i := range indices { - newKey = append(newKey, selfSchema.Columns[i]) - } - selfSchema.Keys = append(selfSchema.Keys, newKey) - } - if len(la.groupByCols) == len(la.GroupByItems) && len(la.GroupByItems) > 0 { - indices := selfSchema.ColumnsIndices(la.groupByCols) + groupByCols := la.GetGroupByCols() + if len(groupByCols) == len(la.GroupByItems) && len(la.GroupByItems) > 0 { + indices := selfSchema.ColumnsIndices(groupByCols) if indices != nil { newKey := make([]*expression.Column, 0, len(indices)) for _, i := range indices { @@ -80,7 +70,7 @@ func (p *LogicalSelection) checkMaxOneRowCond(unique expression.Expression, cons if !ok { return false } - if !childSchema.IsUniqueKey(col) { + if !childSchema.IsUniqueKey(col) && !childSchema.IsUnique(col) { return false } _, okCon := constOrCorCol.(*expression.Constant) @@ -106,7 +96,7 @@ func (p *LogicalSelection) BuildKeyInfo(selfSchema *expression.Schema, childSche // BuildKeyInfo implements LogicalPlan BuildKeyInfo interface. func (p *LogicalLimit) BuildKeyInfo(selfSchema *expression.Schema, childSchema []*expression.Schema) { - p.baseLogicalPlan.BuildKeyInfo(selfSchema, childSchema) + p.logicalSchemaProducer.BuildKeyInfo(selfSchema, childSchema) if p.Count == 1 { p.maxOneRow = true } @@ -148,7 +138,10 @@ func (p *LogicalProjection) buildSchemaByExprs(selfSchema *expression.Schema) *e // BuildKeyInfo implements LogicalPlan BuildKeyInfo interface. func (p *LogicalProjection) BuildKeyInfo(selfSchema *expression.Schema, childSchema []*expression.Schema) { - p.logicalSchemaProducer.BuildKeyInfo(selfSchema, childSchema) + // `LogicalProjection` use schema from `Exprs` to build key info. See `buildSchemaByExprs`. + // So call `baseLogicalPlan.BuildKeyInfo` here to avoid duplicated building key info. + p.baseLogicalPlan.BuildKeyInfo(selfSchema, childSchema) + selfSchema.Keys = nil schema := p.buildSchemaByExprs(selfSchema) for _, key := range childSchema[0].Keys { indices := schema.ColumnsIndices(key) @@ -209,35 +202,43 @@ func (p *LogicalJoin) BuildKeyInfo(selfSchema *expression.Schema, childSchema [] } // checkIndexCanBeKey checks whether an Index can be a Key in schema. -func checkIndexCanBeKey(idx *model.IndexInfo, columns []*model.ColumnInfo, schema *expression.Schema) expression.KeyInfo { +func checkIndexCanBeKey(idx *model.IndexInfo, columns []*model.ColumnInfo, schema *expression.Schema) (uniqueKey, newKey expression.KeyInfo) { if !idx.Unique { - return nil + return nil, nil } - newKey := make([]*expression.Column, 0, len(idx.Columns)) - ok := true + newKeyOK := true + uniqueKeyOK := true for _, idxCol := range idx.Columns { // The columns of this index should all occur in column schema. // Since null value could be duplicate in unique key. So we check NotNull flag of every column. - find := false + findUniqueKey := false for i, col := range columns { if idxCol.Name.L == col.Name.L { - if !mysql.HasNotNullFlag(col.Flag) { + uniqueKey = append(uniqueKey, schema.Columns[i]) + findUniqueKey = true + if newKeyOK { + if !mysql.HasNotNullFlag(col.Flag) { + newKeyOK = false + break + } + newKey = append(newKey, schema.Columns[i]) break } - newKey = append(newKey, schema.Columns[i]) - find = true - break } } - if !find { - ok = false + if !findUniqueKey { + newKeyOK = false + uniqueKeyOK = false break } } - if ok { - return newKey + if newKeyOK { + return nil, newKey + } else if uniqueKeyOK { + return uniqueKey, nil } - return nil + + return nil, nil } // BuildKeyInfo implements LogicalPlan BuildKeyInfo interface. @@ -247,8 +248,10 @@ func (ds *DataSource) BuildKeyInfo(selfSchema *expression.Schema, childSchema [] if path.IsIntHandlePath { continue } - if newKey := checkIndexCanBeKey(path.Index, ds.Columns, selfSchema); newKey != nil { + if uniqueKey, newKey := checkIndexCanBeKey(path.Index, ds.Columns, selfSchema); newKey != nil { selfSchema.Keys = append(selfSchema.Keys, newKey) + } else if uniqueKey != nil { + selfSchema.UniqueKeys = append(selfSchema.UniqueKeys, uniqueKey) } } if ds.tableInfo.PKIsHandle { @@ -273,8 +276,10 @@ func (is *LogicalIndexScan) BuildKeyInfo(selfSchema *expression.Schema, childSch if path.IsTablePath() { continue } - if newKey := checkIndexCanBeKey(path.Index, is.Columns, selfSchema); newKey != nil { + if uniqueKey, newKey := checkIndexCanBeKey(path.Index, is.Columns, selfSchema); newKey != nil { selfSchema.Keys = append(selfSchema.Keys, newKey) + } else if uniqueKey != nil { + selfSchema.UniqueKeys = append(selfSchema.UniqueKeys, uniqueKey) } } handle := is.getPKIsHandleCol(selfSchema) diff --git a/planner/core/rule_column_pruning.go b/planner/core/rule_column_pruning.go index d482e41724e0b..c68e515770ef4 100644 --- a/planner/core/rule_column_pruning.go +++ b/planner/core/rule_column_pruning.go @@ -219,6 +219,8 @@ func (p *LogicalUnionScan) PruneColumns(parentUsedCols []*expression.Column) err for i := 0; i < p.handleCols.NumCols(); i++ { parentUsedCols = append(parentUsedCols, p.handleCols.GetCol(i)) } + condCols := expression.ExtractColumnsFromExpressions(nil, p.conditions, nil) + parentUsedCols = append(parentUsedCols, condCols...) return p.children[0].PruneColumns(parentUsedCols) } @@ -232,10 +234,6 @@ func (ds *DataSource) PruneColumns(parentUsedCols []*expression.Column) error { originSchemaColumns := ds.schema.Columns originColumns := ds.Columns for i := len(used) - 1; i >= 0; i-- { - if ds.tableInfo.IsCommonHandle && mysql.HasPriKeyFlag(ds.schema.Columns[i].RetType.Flag) { - // Do not prune common handle column. - continue - } if !used[i] && !exprUsed[i] { ds.schema.Columns = append(ds.schema.Columns[:i], ds.schema.Columns[i+1:]...) ds.Columns = append(ds.Columns[:i], ds.Columns[i+1:]...) @@ -253,10 +251,11 @@ func (ds *DataSource) PruneColumns(parentUsedCols []*expression.Column) error { } else { if ds.handleCols != nil { handleCol = ds.handleCols.GetCol(0) + handleColInfo = handleCol.ToInfo() } else { handleCol = ds.newExtraHandleSchemaCol() + handleColInfo = model.NewExtraHandleColInfo() } - handleColInfo = model.NewExtraHandleColInfo() } ds.Columns = append(ds.Columns, handleColInfo) ds.schema.Append(handleCol) @@ -315,6 +314,13 @@ func (p *LogicalJoin) mergeSchema() { p.schema.Append(joinCol) } else { p.schema = expression.MergeSchema(lChild.Schema(), rChild.Schema()) + switch p.JoinType { + case LeftOuterJoin: + resetNotNullFlag(p.schema, p.children[1].Schema().Len(), p.schema.Len()) + case RightOuterJoin: + resetNotNullFlag(p.schema, 0, p.children[0].Schema().Len()) + default: + } } } @@ -430,6 +436,16 @@ func (p *LogicalWindow) extractUsedCols(parentUsedCols []*expression.Column) []* return parentUsedCols } +// PruneColumns implements LogicalPlan interface. +func (p *LogicalLimit) PruneColumns(parentUsedCols []*expression.Column) error { + if len(parentUsedCols) == 0 { // happens when LIMIT appears in UPDATE. + return nil + } + + p.inlineProjection(parentUsedCols) + return p.children[0].PruneColumns(parentUsedCols) +} + func (*columnPruner) name() string { return "column_prune" } diff --git a/planner/core/rule_decorrelate.go b/planner/core/rule_decorrelate.go index 956d651f660ff..bf7e332c5eb33 100644 --- a/planner/core/rule_decorrelate.go +++ b/planner/core/rule_decorrelate.go @@ -189,12 +189,21 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica resetNotNullFlag(apply.schema, outerPlan.Schema().Len(), apply.schema.Len()) for i, aggFunc := range agg.AggFuncs { - if idx := apply.schema.ColumnIndex(aggFunc.Args[0].(*expression.Column)); idx != -1 { - desc, err := aggregation.NewAggFuncDesc(agg.ctx, agg.AggFuncs[i].Name, []expression.Expression{apply.schema.Columns[idx]}, false) - if err != nil { - return nil, err + switch expr := aggFunc.Args[0].(type) { + case *expression.Column: + if idx := apply.schema.ColumnIndex(expr); idx != -1 { + desc, err := aggregation.NewAggFuncDesc(agg.ctx, agg.AggFuncs[i].Name, []expression.Expression{apply.schema.Columns[idx]}, false) + if err != nil { + return nil, err + } + newAggFuncs = append(newAggFuncs, desc) } - newAggFuncs = append(newAggFuncs, desc) + case *expression.ScalarFunction: + expr.RetType = expr.RetType.Clone() + expr.RetType.Flag &= ^mysql.NotNullFlag + newAggFuncs = append(newAggFuncs, aggFunc) + default: + newAggFuncs = append(newAggFuncs, aggFunc) } } agg.AggFuncs = newAggFuncs @@ -205,7 +214,6 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica agg.SetChildren(np) // TODO: Add a Projection if any argument of aggregate funcs or group by items are scalar functions. // agg.buildProjectionIfNecessary() - agg.collectGroupByColumns() return agg, nil } // We can pull up the equal conditions below the aggregation as the join key of the apply, if only @@ -228,7 +236,7 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica sel.Conditions = remainedExpr apply.CorCols = extractCorColumnsBySchema4LogicalPlan(apply.children[1], apply.children[0].Schema()) // There's no other correlated column. - groupByCols := expression.NewSchema(agg.groupByCols...) + groupByCols := expression.NewSchema(agg.GetGroupByCols()...) if len(apply.CorCols) == 0 { join := &apply.LogicalJoin join.EqualConditions = append(join.EqualConditions, eqCondWithCorCol...) @@ -250,7 +258,6 @@ func (s *decorrelateSolver) optimize(ctx context.Context, p LogicalPlan) (Logica groupByCols.Append(clonedCol) } } - agg.collectGroupByColumns() // The selection may be useless, check and remove it. if len(sel.Conditions) == 0 { agg.SetChildren(sel.children[0]) diff --git a/planner/core/rule_eliminate_projection.go b/planner/core/rule_eliminate_projection.go index 404c5e01dd77c..832f31435b429 100644 --- a/planner/core/rule_eliminate_projection.go +++ b/planner/core/rule_eliminate_projection.go @@ -17,6 +17,7 @@ import ( "context" "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/kv" ) // canProjectionBeEliminatedLoose checks whether a projection can be eliminated, @@ -34,6 +35,27 @@ func canProjectionBeEliminatedLoose(p *LogicalProjection) bool { // canProjectionBeEliminatedStrict checks whether a projection can be // eliminated, returns true if the projection just copy its child's output. func canProjectionBeEliminatedStrict(p *PhysicalProjection) bool { + // This is due to the in-compatibility between TiFlash and TiDB: + // For TiDB, the output schema of final agg is all the aggregated functions and for + // TiFlash, the output schema of agg(TiFlash not aware of the aggregation mode) is + // aggregated functions + group by columns, so to make the things work, for final + // mode aggregation that need to be running in TiFlash, always add an extra Project + // the align the output schema. In the future, we can solve this in-compatibility by + // passing down the aggregation mode to TiFlash. + if physicalAgg, ok := p.Children()[0].(*PhysicalHashAgg); ok { + if physicalAgg.MppRunMode == Mpp1Phase || physicalAgg.MppRunMode == Mpp2Phase { + if physicalAgg.isFinalAgg() { + return false + } + } + } + if physicalAgg, ok := p.Children()[0].(*PhysicalStreamAgg); ok { + if physicalAgg.MppRunMode == Mpp1Phase || physicalAgg.MppRunMode == Mpp2Phase { + if physicalAgg.isFinalAgg() { + return false + } + } + } // If this projection is specially added for `DO`, we keep it. if p.CalculateNoDelay { return false @@ -82,6 +104,14 @@ func doPhysicalProjectionElimination(p PhysicalPlan) PhysicalPlan { p.Children()[i] = doPhysicalProjectionElimination(child) } + // eliminate projection in a coprocessor task + tableReader, isTableReader := p.(*PhysicalTableReader) + if isTableReader && tableReader.StoreType == kv.TiFlash { + tableReader.tablePlan = eliminatePhysicalProjection(tableReader.tablePlan) + tableReader.TablePlans = flattenPushDownPlan(tableReader.tablePlan) + return p + } + proj, isProj := p.(*PhysicalProjection) if !isProj || !canProjectionBeEliminatedStrict(proj) { return p @@ -206,7 +236,6 @@ func (la *LogicalAggregation) replaceExprColumns(replace map[string]*expression. for _, gbyItem := range la.GroupByItems { ResolveExprAndReplace(gbyItem, replace) } - la.collectGroupByColumns() } func (p *LogicalSelection) replaceExprColumns(replace map[string]*expression.Column) { diff --git a/planner/core/rule_generate_column_substitute.go b/planner/core/rule_generate_column_substitute.go index 5b65cefb93fae..bc4a31e0b88e8 100644 --- a/planner/core/rule_generate_column_substitute.go +++ b/planner/core/rule_generate_column_substitute.go @@ -136,28 +136,28 @@ func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToC } } // TODO: Uncomment these code after we support virtual generate column push down. - //case *LogicalAggregation: - // for _, aggFunc := range x.AggFuncs { - // for i := 0; i < len(aggFunc.Args); i++ { - // tp = aggFunc.Args[i].GetType().EvalType() - // for candidateExpr, column := range exprToColumn { - // if aggFunc.Args[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && - // x.Schema().ColumnIndex(column) != -1 { - // aggFunc.Args[i] = column - // } - // } - // } - // } - // for i := 0; i < len(x.GroupByItems); i++ { - // tp = x.GroupByItems[i].GetType().EvalType() - // for candidateExpr, column := range exprToColumn { - // if x.GroupByItems[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && - // x.Schema().ColumnIndex(column) != -1 { - // x.GroupByItems[i] = column - // x.groupByCols = append(x.groupByCols, column) - // } - // } - // } + // case *LogicalAggregation: + // for _, aggFunc := range x.AggFuncs { + // for i := 0; i < len(aggFunc.Args); i++ { + // tp = aggFunc.Args[i].GetType().EvalType() + // for candidateExpr, column := range exprToColumn { + // if aggFunc.Args[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && + // x.Schema().ColumnIndex(column) != -1 { + // aggFunc.Args[i] = column + // } + // } + // } + // } + // for i := 0; i < len(x.GroupByItems); i++ { + // tp = x.GroupByItems[i].GetType().EvalType() + // for candidateExpr, column := range exprToColumn { + // if x.GroupByItems[i].Equal(lp.SCtx(), candidateExpr) && candidateExpr.GetType().EvalType() == tp && + // x.Schema().ColumnIndex(column) != -1 { + // x.GroupByItems[i] = column + // x.groupByCols = append(x.groupByCols, column) + // } + // } + // } } for _, child := range lp.Children() { gc.substitute(ctx, child, exprToColumn) diff --git a/planner/core/rule_inject_extra_projection.go b/planner/core/rule_inject_extra_projection.go index a9e2b7ed11dad..f10bc52dc44bc 100644 --- a/planner/core/rule_inject_extra_projection.go +++ b/planner/core/rule_inject_extra_projection.go @@ -20,11 +20,15 @@ import ( "github.com/pingcap/tidb/sessionctx" ) -// injectExtraProjection is used to extract the expressions of specific +// InjectExtraProjection is used to extract the expressions of specific // operators into a physical Projection operator and inject the Projection below // the operators. Thus we can accelerate the expression evaluation by eager // evaluation. -func injectExtraProjection(plan PhysicalPlan) PhysicalPlan { +// This function will be called in two situations: +// 1. In postOptimize. +// 2. TiDB can be used as a coprocessor, when a plan tree been pushed down to +// TiDB, we need to inject extra projections for the plan tree as well. +func InjectExtraProjection(plan PhysicalPlan) PhysicalPlan { return NewProjInjector().inject(plan) } @@ -61,6 +65,7 @@ func (pe *projInjector) inject(plan PhysicalPlan) PhysicalPlan { // since the types of the args are already the expected. func wrapCastForAggFuncs(sctx sessionctx.Context, aggFuncs []*aggregation.AggFuncDesc) { for i := range aggFuncs { + aggFuncs[i].WrapCastAsDecimalForAggArgs(sctx) if aggFuncs[i].Mode != aggregation.FinalMode && aggFuncs[i].Mode != aggregation.Partial2Mode { aggFuncs[i].WrapCastForAggArgs(sctx) } @@ -144,7 +149,7 @@ func InjectProjBelowAgg(aggPlan PhysicalPlan, aggFuncs []*aggregation.AggFuncDes } child := aggPlan.Children()[0] - prop := aggPlan.GetChildReqProps(0).Clone() + prop := aggPlan.GetChildReqProps(0).CloneEssentialFields() proj := PhysicalProjection{ Exprs: projExprs, AvoidColumnEvaluator: false, @@ -211,7 +216,7 @@ func InjectProjBelowSort(p PhysicalPlan, orderByItems []*util.ByItems) PhysicalP item.Expr = newArg } - childProp := p.GetChildReqProps(0).Clone() + childProp := p.GetChildReqProps(0).CloneEssentialFields() bottomProj := PhysicalProjection{ Exprs: bottomProjExprs, AvoidColumnEvaluator: false, @@ -260,7 +265,7 @@ func TurnNominalSortIntoProj(p PhysicalPlan, onlyColumn bool, orderByItems []*ut bottomProjSchemaCols = append(bottomProjSchemaCols, newArg) } - childProp := p.GetChildReqProps(0).Clone() + childProp := p.GetChildReqProps(0).CloneEssentialFields() bottomProj := PhysicalProjection{ Exprs: bottomProjExprs, AvoidColumnEvaluator: false, diff --git a/planner/core/rule_join_reorder.go b/planner/core/rule_join_reorder.go index acaf32e354fcb..08aacdbc8683a 100644 --- a/planner/core/rule_join_reorder.go +++ b/planner/core/rule_join_reorder.go @@ -73,6 +73,7 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP ctx: ctx, otherConds: otherConds, } + originalSchema := p.Schema() if len(curJoinGroup) > ctx.GetSessionVars().TiDBOptJoinReorderThreshold { groupSolver := &joinReorderGreedySolver{ baseSingleGroupJoinOrderSolver: baseGroupSolver, @@ -89,6 +90,21 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP if err != nil { return nil, err } + schemaChanged := false + for i, col := range p.Schema().Columns { + if !col.Equal(nil, originalSchema.Columns[i]) { + schemaChanged = true + break + } + } + if schemaChanged { + proj := LogicalProjection{ + Exprs: expression.Column2Exprs(originalSchema.Columns), + }.Init(p.SCtx(), p.SelectBlockOffset()) + proj.SetSchema(originalSchema) + proj.SetChildren(p) + p = proj + } return p, nil } newChildren := make([]LogicalPlan, 0, len(p.Children())) @@ -103,6 +119,7 @@ func (s *joinReOrderSolver) optimizeRecursive(ctx sessionctx.Context, p LogicalP return p, nil } +// nolint:structcheck type baseSingleGroupJoinOrderSolver struct { ctx sessionctx.Context curJoinGroup []*jrNode diff --git a/planner/core/rule_join_reorder_dp.go b/planner/core/rule_join_reorder_dp.go index d77733759b21a..d6583a0423f45 100644 --- a/planner/core/rule_join_reorder_dp.go +++ b/planner/core/rule_join_reorder_dp.go @@ -281,10 +281,3 @@ func findNodeIndexInGroup(group []LogicalPlan, col *expression.Column) (int, err } return -1, ErrUnknownColumn.GenWithStackByArgs(col, "JOIN REORDER RULE") } - -func (s *joinReorderDPSolver) newJoinWithConds(leftPlan, rightPlan LogicalPlan, eqConds []*expression.ScalarFunction, otherConds []expression.Expression) LogicalPlan { - join := s.newCartesianJoin(leftPlan, rightPlan) - join.EqualConditions = eqConds - join.OtherConditions = otherConds - return join -} diff --git a/planner/core/rule_max_min_eliminate.go b/planner/core/rule_max_min_eliminate.go index 29619f083b6eb..b50c1129d0f49 100644 --- a/planner/core/rule_max_min_eliminate.go +++ b/planner/core/rule_max_min_eliminate.go @@ -210,6 +210,13 @@ func (a *maxMinEliminator) eliminateMaxMin(p LogicalPlan) LogicalPlan { return agg } } + // Limit+Sort operators are sorted by value, but ENUM/SET field types are sorted by name. + cols := agg.GetUsedCols() + for _, col := range cols { + if col.RetType.Tp == mysql.TypeEnum || col.RetType.Tp == mysql.TypeSet { + return agg + } + } if len(agg.AggFuncs) == 1 { // If there is only one aggFunc, we don't need to guarantee that the child of it is a data // source, or whether the sort can be eliminated. This transformation won't be worse than previous. diff --git a/planner/core/rule_partition_processor.go b/planner/core/rule_partition_processor.go index 6b329358290f9..47595281fb6b0 100644 --- a/planner/core/rule_partition_processor.go +++ b/planner/core/rule_partition_processor.go @@ -211,8 +211,48 @@ func (s *partitionProcessor) pruneHashPartition(ctx sessionctx.Context, tbl tabl return used, nil } +// reconstructTableColNames reconstructs FieldsNames according to ds.TblCols. +// ds.names may not match ds.TblCols since ds.names is pruned while ds.TblCols contains all original columns. +// please see https://github.com/pingcap/tidb/issues/22635 for more details. +func (s *partitionProcessor) reconstructTableColNames(ds *DataSource) ([]*types.FieldName, error) { + names := make([]*types.FieldName, 0, len(ds.TblCols)) + colsInfo := ds.table.FullHiddenColsAndVisibleCols() + colsInfoMap := make(map[int64]*table.Column, len(colsInfo)) + for _, c := range colsInfo { + colsInfoMap[c.ID] = c + } + for _, colExpr := range ds.TblCols { + if colExpr.ID == model.ExtraHandleID { + names = append(names, &types.FieldName{ + DBName: ds.DBName, + TblName: ds.tableInfo.Name, + ColName: model.ExtraHandleName, + OrigColName: model.ExtraHandleName, + }) + continue + } + if colInfo, found := colsInfoMap[colExpr.ID]; found { + names = append(names, &types.FieldName{ + DBName: ds.DBName, + TblName: ds.tableInfo.Name, + ColName: colInfo.Name, + OrigTblName: ds.tableInfo.Name, + OrigColName: colInfo.Name, + Hidden: colInfo.Hidden, + }) + continue + } + return nil, errors.New(fmt.Sprintf("information of column %v is not found", colExpr.String())) + } + return names, nil +} + func (s *partitionProcessor) processHashPartition(ds *DataSource, pi *model.PartitionInfo) (LogicalPlan, error) { - used, err := s.pruneHashPartition(ds.SCtx(), ds.table, ds.partitionNames, ds.allConds, ds.TblCols, ds.names) + names, err := s.reconstructTableColNames(ds) + if err != nil { + return nil, err + } + used, err := s.pruneHashPartition(ds.SCtx(), ds.table, ds.partitionNames, ds.allConds, ds.TblCols, names) if err != nil { return nil, err } @@ -224,17 +264,284 @@ func (s *partitionProcessor) processHashPartition(ds *DataSource, pi *model.Part return tableDual, nil } +// listPartitionPruner uses to prune partition for list partition. +type listPartitionPruner struct { + *partitionProcessor + ctx sessionctx.Context + pi *model.PartitionInfo + partitionNames []model.CIStr + colIDToUniqueID map[int64]int64 + fullRange map[int]struct{} + listPrune *tables.ForListPruning +} + +func newListPartitionPruner(ctx sessionctx.Context, tbl table.Table, partitionNames []model.CIStr, + s *partitionProcessor, conds []expression.Expression, pruneList *tables.ForListPruning) *listPartitionPruner { + colIDToUniqueID := make(map[int64]int64) + for _, cond := range conds { + condCols := expression.ExtractColumns(cond) + for _, c := range condCols { + colIDToUniqueID[c.ID] = c.UniqueID + } + } + fullRange := make(map[int]struct{}) + fullRange[FullRange] = struct{}{} + return &listPartitionPruner{ + partitionProcessor: s, + ctx: ctx, + pi: tbl.Meta().Partition, + partitionNames: partitionNames, + colIDToUniqueID: colIDToUniqueID, + fullRange: fullRange, + listPrune: pruneList, + } +} + +func (l *listPartitionPruner) locatePartition(cond expression.Expression) (tables.ListPartitionLocation, bool, error) { + switch sf := cond.(type) { + case *expression.Constant: + b, err := sf.Value.ToBool(l.ctx.GetSessionVars().StmtCtx) + if err == nil && b == 0 { + // A constant false expression. + return nil, false, nil + } + case *expression.ScalarFunction: + switch sf.FuncName.L { + case ast.LogicOr: + dnfItems := expression.FlattenDNFConditions(sf) + return l.locatePartitionByDNFCondition(dnfItems) + case ast.LogicAnd: + cnfItems := expression.FlattenCNFConditions(sf) + return l.locatePartitionByCNFCondition(cnfItems) + } + return l.locatePartitionByColumn(sf) + } + return nil, true, nil +} + +func (l *listPartitionPruner) locatePartitionByCNFCondition(conds []expression.Expression) (tables.ListPartitionLocation, bool, error) { + if len(conds) == 0 { + return nil, true, nil + } + countFull := 0 + helper := tables.NewListPartitionLocationHelper() + for _, cond := range conds { + cnfLoc, isFull, err := l.locatePartition(cond) + if err != nil { + return nil, false, err + } + if isFull { + countFull++ + continue + } + if cnfLoc.IsEmpty() { + // No partition for intersection, just return 0 partition. + return nil, false, nil + } + if !helper.Intersect(cnfLoc) { + return nil, false, nil + } + } + if countFull == len(conds) { + return nil, true, nil + } + return helper.GetLocation(), false, nil +} + +func (l *listPartitionPruner) locatePartitionByDNFCondition(conds []expression.Expression) (tables.ListPartitionLocation, bool, error) { + if len(conds) == 0 { + return nil, true, nil + } + helper := tables.NewListPartitionLocationHelper() + for _, cond := range conds { + dnfLoc, isFull, err := l.locatePartition(cond) + if err != nil || isFull { + return nil, isFull, err + } + helper.Union(dnfLoc) + } + return helper.GetLocation(), false, nil +} + +// locatePartitionByColumn uses to locate partition by the one of the list columns value. +// Such as: partition by list columns(a,b) (partition p0 values in ((1,1),(2,2)), partition p1 values in ((6,6),(7,7))); +// and if the condition is `a=1`, then we can use `a=1` and the expression `(a in (1,2))` to locate partition `p0`. +func (l *listPartitionPruner) locatePartitionByColumn(cond *expression.ScalarFunction) (tables.ListPartitionLocation, bool, error) { + condCols := expression.ExtractColumns(cond) + if len(condCols) != 1 { + return nil, true, nil + } + var colPrune *tables.ForListColumnPruning + for _, cp := range l.listPrune.ColPrunes { + if cp.ExprCol.ID == condCols[0].ID { + colPrune = cp + } + } + if colPrune == nil { + return nil, true, nil + } + return l.locateColumnPartitionsByCondition(cond, colPrune) +} + +func (l *listPartitionPruner) locateColumnPartitionsByCondition(cond expression.Expression, colPrune *tables.ForListColumnPruning) (tables.ListPartitionLocation, bool, error) { + ranges, err := l.detachCondAndBuildRange([]expression.Expression{cond}, colPrune.ExprCol) + if err != nil { + return nil, false, err + } + + sc := l.ctx.GetSessionVars().StmtCtx + helper := tables.NewListPartitionLocationHelper() + for _, r := range ranges { + if r.IsPointNullable(sc) { + if len(r.HighVal) != 1 { + return nil, true, nil + } + location, err := colPrune.LocatePartition(sc, r.HighVal[0]) + if err != nil { + return nil, false, err + } + if len(l.partitionNames) > 0 { + for _, pg := range location { + if l.findByName(l.partitionNames, l.pi.Definitions[pg.PartIdx].Name.L) { + helper.UnionPartitionGroup(pg) + } + } + } else { + helper.Union(location) + } + } else { + return nil, true, nil + } + } + return helper.GetLocation(), false, nil +} + +func (l *listPartitionPruner) detachCondAndBuildRange(conds []expression.Expression, exprCols ...*expression.Column) ([]*ranger.Range, error) { + cols := make([]*expression.Column, 0, len(exprCols)) + colLen := make([]int, 0, len(exprCols)) + for _, c := range exprCols { + c = c.Clone().(*expression.Column) + if uniqueID, ok := l.colIDToUniqueID[c.ID]; ok { + c.UniqueID = uniqueID + } + cols = append(cols, c) + colLen = append(colLen, types.UnspecifiedLength) + } + + detachedResult, err := ranger.DetachCondAndBuildRangeForPartition(l.ctx, conds, cols, colLen) + if err != nil { + return nil, err + } + return detachedResult.Ranges, nil +} + +func (l *listPartitionPruner) findUsedListColumnsPartitions(conds []expression.Expression) (map[int]struct{}, error) { + if len(conds) == 0 { + return l.fullRange, nil + } + location, isFull, err := l.locatePartitionByCNFCondition(conds) + if err != nil { + return nil, err + } + if isFull { + return l.fullRange, nil + } + used := make(map[int]struct{}, len(location)) + for _, pg := range location { + used[pg.PartIdx] = struct{}{} + } + return used, nil +} + +func (l *listPartitionPruner) findUsedListPartitions(conds []expression.Expression) (map[int]struct{}, error) { + if len(conds) == 0 { + return l.fullRange, nil + } + exprCols := l.listPrune.PruneExprCols + pruneExpr := l.listPrune.PruneExpr + ranges, err := l.detachCondAndBuildRange(conds, exprCols...) + if err != nil { + return nil, err + } + used := make(map[int]struct{}, len(ranges)) + for _, r := range ranges { + if r.IsPointNullable(l.ctx.GetSessionVars().StmtCtx) { + if len(r.HighVal) != len(exprCols) && !r.HighVal[0].IsNull() { + // For the list partition, if the first argument is null, + // then the list partition expression should also be null. + return l.fullRange, nil + } + value, isNull, err := pruneExpr.EvalInt(l.ctx, chunk.MutRowFromDatums(r.HighVal).ToRow()) + if err != nil { + return nil, err + } + partitionIdx := l.listPrune.LocatePartition(value, isNull) + if partitionIdx == -1 { + continue + } + if len(l.partitionNames) > 0 && !l.findByName(l.partitionNames, l.pi.Definitions[partitionIdx].Name.L) { + continue + } + used[partitionIdx] = struct{}{} + } else { + return l.fullRange, nil + } + } + return used, nil +} + +func (s *partitionProcessor) findUsedListPartitions(ctx sessionctx.Context, tbl table.Table, partitionNames []model.CIStr, + conds []expression.Expression) ([]int, error) { + pi := tbl.Meta().Partition + partExpr, err := tbl.(partitionTable).PartitionExpr() + if err != nil { + return nil, err + } + + listPruner := newListPartitionPruner(ctx, tbl, partitionNames, s, conds, partExpr.ForListPruning) + var used map[int]struct{} + if partExpr.ForListPruning.ColPrunes == nil { + used, err = listPruner.findUsedListPartitions(conds) + } else { + used, err = listPruner.findUsedListColumnsPartitions(conds) + } + if err != nil { + return nil, err + } + if _, ok := used[FullRange]; ok { + or := partitionRangeOR{partitionRange{0, len(pi.Definitions)}} + return s.convertToIntSlice(or, pi, partitionNames), nil + } + ret := make([]int, 0, len(used)) + for k := range used { + ret = append(ret, k) + } + sort.Ints(ret) + return ret, nil +} + +func (s *partitionProcessor) pruneListPartition(ctx sessionctx.Context, tbl table.Table, partitionNames []model.CIStr, + conds []expression.Expression) ([]int, error) { + used, err := s.findUsedListPartitions(ctx, tbl, partitionNames, conds) + if err != nil { + return nil, err + } + return used, nil +} + func (s *partitionProcessor) prune(ds *DataSource) (LogicalPlan, error) { pi := ds.tableInfo.GetPartitionInfo() if pi == nil { return ds, nil } // Try to locate partition directly for hash partition. - if pi.Type == model.PartitionTypeHash { - return s.processHashPartition(ds, pi) - } - if pi.Type == model.PartitionTypeRange { + switch pi.Type { + case model.PartitionTypeRange: return s.processRangePartition(ds, pi) + case model.PartitionTypeHash: + return s.processHashPartition(ds, pi) + case model.PartitionTypeList: + return s.processListPartition(ds, pi) } // We haven't implement partition by list and so on. @@ -449,6 +756,19 @@ func (s *partitionProcessor) processRangePartition(ds *DataSource, pi *model.Par return s.makeUnionAllChildren(ds, pi, used) } +func (s *partitionProcessor) processListPartition(ds *DataSource, pi *model.PartitionInfo) (LogicalPlan, error) { + used, err := s.pruneListPartition(ds.SCtx(), ds.table, ds.partitionNames, ds.allConds) + if err != nil { + return nil, err + } + if used != nil { + return s.makeUnionAllChildren(ds, pi, convertToRangeOr(used, pi)) + } + tableDual := LogicalTableDual{RowCount: 0}.Init(ds.SCtx(), ds.blockOffset) + tableDual.schema = ds.Schema() + return tableDual, nil +} + // makePartitionByFnCol extracts the column and function information in 'partition by ... fn(col)'. func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, names types.NameSlice, partitionExpr string) (*expression.Column, *expression.ScalarFunction, monotoneMode, error) { monotonous := monotoneModeInvalid @@ -462,13 +782,14 @@ func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, var fn *expression.ScalarFunction switch raw := partExpr.(type) { case *expression.ScalarFunction: + args := raw.GetArgs() // Special handle for floor(unix_timestamp(ts)) as partition expression. // This pattern is so common for timestamp(3) column as partition expression that it deserve an optimization. if raw.FuncName.L == ast.Floor { - if ut, ok := raw.GetArgs()[0].(*expression.ScalarFunction); ok && ut.FuncName.L == ast.UnixTimestamp { - args := ut.GetArgs() - if len(args) == 1 { - if c, ok1 := args[0].(*expression.Column); ok1 { + if ut, ok := args[0].(*expression.ScalarFunction); ok && ut.FuncName.L == ast.UnixTimestamp { + args1 := ut.GetArgs() + if len(args1) == 1 { + if c, ok1 := args1[0].(*expression.Column); ok1 { return c, raw, monotoneModeNonStrict, nil } } @@ -476,14 +797,14 @@ func makePartitionByFnCol(sctx sessionctx.Context, columns []*expression.Column, } fn = raw - args := fn.GetArgs() - if len(args) > 0 { - arg0 := args[0] - if c, ok1 := arg0.(*expression.Column); ok1 { - col = c + monotonous = getMonotoneMode(raw.FuncName.L) + // Check the partitionExpr is in the form: fn(col, ...) + // There should be only one column argument, and it should be the first parameter. + if expression.ExtractColumnSet(args).Len() == 1 { + if col1, ok := args[0].(*expression.Column); ok { + col = col1 } } - monotonous = getMonotoneMode(raw.FuncName.L) case *expression.Column: col = raw } @@ -595,7 +916,16 @@ func partitionRangeForInExpr(sctx sessionctx.Context, args []expression.Expressi default: return pruner.fullRange() } - val, err := constExpr.Value.ToInt64(sctx.GetSessionVars().StmtCtx) + + var val int64 + var err error + if pruner.partFn != nil { + // replace fn(col) to fn(const) + partFnConst := replaceColumnWithConst(pruner.partFn, constExpr) + val, _, err = partFnConst.EvalInt(sctx, chunk.Row{}) + } else { + val, err = constExpr.Value.ToInt64(sctx.GetSessionVars().StmtCtx) + } if err != nil { return pruner.fullRange() } @@ -621,6 +951,9 @@ var monotoneIncFuncs = map[string]monotoneMode{ ast.Year: monotoneModeNonStrict, ast.ToDays: monotoneModeNonStrict, ast.UnixTimestamp: monotoneModeStrict, + // Only when the function form is fn(column, const) + ast.Plus: monotoneModeStrict, + ast.Minus: monotoneModeStrict, } func getMonotoneMode(fnName string) monotoneMode { @@ -698,6 +1031,13 @@ func (p *rangePruner) extractDataForPrune(sctx sessionctx.Context, expr expressi // If the partition expression is col, use constExpr. constExpr = con } + // If the partition expression is related with more than one columns such as 'a + b' or 'a * b' or something else, + // the constExpr may not a really constant when coming here. + // Suppose the partition expression is 'a + b' and we have a condition 'a = 2', + // the constExpr is '2 + b' after the replacement which we can't evaluate. + if !constExpr.ConstItem(sctx.GetSessionVars().StmtCtx) { + return ret, false + } c, isNull, err := constExpr.EvalInt(sctx, chunk.Row{}) if err == nil && !isNull { ret.c = c @@ -812,7 +1152,7 @@ func pruneUseBinarySearch(lessThan lessThanDataInt, data dataForPrune, unsigned func (s *partitionProcessor) resolveAccessPaths(ds *DataSource) error { possiblePaths, err := getPossibleAccessPaths( ds.ctx, &tableHintInfo{indexMergeHintList: ds.indexMergeHints, indexHintList: ds.IndexHints}, - ds.astIndexHints, ds.table, ds.DBName, ds.tableInfo.Name) + ds.astIndexHints, ds.table, ds.DBName, ds.tableInfo.Name, ds.isForUpdateRead, ds.is.SchemaMetaVersion()) if err != nil { return err } @@ -939,6 +1279,8 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part newDataSource := *ds newDataSource.baseLogicalPlan = newBaseLogicalPlan(ds.SCtx(), plancodec.TypeTableScan, &newDataSource, ds.blockOffset) newDataSource.schema = ds.schema.Clone() + newDataSource.Columns = make([]*model.ColumnInfo, len(ds.Columns)) + copy(newDataSource.Columns, ds.Columns) newDataSource.isPartition = true newDataSource.physicalTableID = pi.Definitions[i].ID @@ -946,7 +1288,9 @@ func (s *partitionProcessor) makeUnionAllChildren(ds *DataSource, pi *model.Part // id as FromID. So we set the id of the newDataSource with the original one to // avoid traversing the whole plan tree to update the references. newDataSource.id = ds.id - newDataSource.statisticTable = getStatsTable(ds.SCtx(), ds.table.Meta(), pi.Definitions[i].ID) + if !ds.ctx.GetSessionVars().UseDynamicPartitionPrune() { + newDataSource.statisticTable = getStatsTable(ds.SCtx(), ds.table.Meta(), pi.Definitions[i].ID) + } err := s.resolveOptimizeHint(&newDataSource, pi.Definitions[i].Name) partitionNameSet.Insert(pi.Definitions[i].Name.L) if err != nil { @@ -1048,11 +1392,11 @@ func (p *rangeColumnsPruner) partitionRangeForExpr(sctx sessionctx.Context, expr return 0, len(p.data), false } - start, end := p.pruneUseBinarySearch(sctx, opName, con) + start, end := p.pruneUseBinarySearch(sctx, opName, con, op) return start, end, true } -func (p *rangeColumnsPruner) pruneUseBinarySearch(sctx sessionctx.Context, op string, data *expression.Constant) (start int, end int) { +func (p *rangeColumnsPruner) pruneUseBinarySearch(sctx sessionctx.Context, op string, data *expression.Constant, f *expression.ScalarFunction) (start int, end int) { var err error var isNull bool compare := func(ith int, op string, v *expression.Constant) bool { @@ -1062,7 +1406,8 @@ func (p *rangeColumnsPruner) pruneUseBinarySearch(sctx sessionctx.Context, op st } } var expr expression.Expression - expr, err = expression.NewFunction(sctx, op, types.NewFieldType(mysql.TypeLonglong), p.data[ith], v) + expr, err = expression.NewFunctionBase(sctx, op, types.NewFieldType(mysql.TypeLonglong), p.data[ith], v) + expr.SetCharsetAndCollation(f.CharsetAndCollation(sctx)) var val int64 val, isNull, err = expr.EvalInt(sctx, chunk.Row{}) return val > 0 diff --git a/planner/core/rule_predicate_push_down.go b/planner/core/rule_predicate_push_down.go index 417375bf31a4b..2b8862d8ae3a5 100644 --- a/planner/core/rule_predicate_push_down.go +++ b/planner/core/rule_predicate_push_down.go @@ -99,6 +99,7 @@ func (p *LogicalUnionScan) PredicatePushDown(predicates []expression.Expression) // PredicatePushDown implements LogicalPlan PredicatePushDown interface. func (ds *DataSource) PredicatePushDown(predicates []expression.Expression) ([]expression.Expression, LogicalPlan) { + predicates = expression.PropagateConstant(ds.ctx, predicates) ds.allConds = predicates ds.pushedDownConds, predicates = expression.PushDownExprs(ds.ctx.GetSessionVars().StmtCtx, predicates, ds.ctx.GetClient(), kv.UnSpecified) return predicates, ds @@ -127,7 +128,8 @@ func (p *LogicalJoin) PredicatePushDown(predicates []expression.Expression) (ret equalCond, leftPushCond, rightPushCond, otherCond = p.extractOnCondition(predicates, true, false) leftCond = leftPushCond // Handle join conditions, only derive right join condition, because left join condition cannot be pushed down - _, derivedRightJoinCond := DeriveOtherConditions(p, false, true) + _, derivedRightJoinCond := DeriveOtherConditions( + p, p.children[0].Schema(), p.children[1].Schema(), false, true) rightCond = append(p.RightConditions, derivedRightJoinCond...) p.RightConditions = nil ret = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) @@ -144,7 +146,8 @@ func (p *LogicalJoin) PredicatePushDown(predicates []expression.Expression) (ret equalCond, leftPushCond, rightPushCond, otherCond = p.extractOnCondition(predicates, false, true) rightCond = rightPushCond // Handle join conditions, only derive left join condition, because right join condition cannot be pushed down - derivedLeftJoinCond, _ := DeriveOtherConditions(p, true, false) + derivedLeftJoinCond, _ := DeriveOtherConditions( + p, p.children[0].Schema(), p.children[1].Schema(), true, false) leftCond = append(p.LeftConditions, derivedLeftJoinCond...) p.LeftConditions = nil ret = append(expression.ScalarFuncs2Exprs(equalCond), otherCond...) @@ -395,7 +398,7 @@ func (la *LogicalAggregation) PredicatePushDown(predicates []expression.Expressi for _, fun := range la.AggFuncs { exprsOriginal = append(exprsOriginal, fun.Args[0]) } - groupByColumns := expression.NewSchema(la.groupByCols...) + groupByColumns := expression.NewSchema(la.GetGroupByCols()...) for _, cond := range predicates { switch cond.(type) { case *expression.Constant: @@ -443,23 +446,25 @@ func (p *LogicalMaxOneRow) PredicatePushDown(predicates []expression.Expression) // DeriveOtherConditions given a LogicalJoin, check the OtherConditions to see if we can derive more // conditions for left/right child pushdown. -func DeriveOtherConditions(p *LogicalJoin, deriveLeft bool, deriveRight bool) (leftCond []expression.Expression, - rightCond []expression.Expression) { - leftPlan, rightPlan := p.children[0], p.children[1] +func DeriveOtherConditions( + p *LogicalJoin, leftSchema *expression.Schema, rightSchema *expression.Schema, + deriveLeft bool, deriveRight bool) ( + leftCond []expression.Expression, rightCond []expression.Expression) { + isOuterSemi := (p.JoinType == LeftOuterSemiJoin) || (p.JoinType == AntiLeftOuterSemiJoin) for _, expr := range p.OtherConditions { if deriveLeft { - leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, leftPlan.Schema()) + leftRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, leftSchema) if leftRelaxedCond != nil { leftCond = append(leftCond, leftRelaxedCond) } - notNullExpr := deriveNotNullExpr(expr, leftPlan.Schema()) + notNullExpr := deriveNotNullExpr(expr, leftSchema) if notNullExpr != nil { leftCond = append(leftCond, notNullExpr) } } if deriveRight { - rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, rightPlan.Schema()) + rightRelaxedCond := expression.DeriveRelaxedFiltersFromDNF(expr, rightSchema) if rightRelaxedCond != nil { rightCond = append(rightCond, rightRelaxedCond) } @@ -473,7 +478,7 @@ func DeriveOtherConditions(p *LogicalJoin, deriveLeft bool, deriveRight bool) (l if isOuterSemi { continue } - notNullExpr := deriveNotNullExpr(expr, rightPlan.Schema()) + notNullExpr := deriveNotNullExpr(expr, rightSchema) if notNullExpr != nil { rightCond = append(rightCond, notNullExpr) } diff --git a/planner/core/rule_topn_push_down.go b/planner/core/rule_topn_push_down.go index d96c124ddc3eb..755c7712e5b40 100644 --- a/planner/core/rule_topn_push_down.go +++ b/planner/core/rule_topn_push_down.go @@ -147,7 +147,7 @@ func (p *LogicalJoin) pushDownTopNToChild(topN *LogicalTopN, idx int) LogicalPla for _, by := range topN.ByItems { cols := expression.ExtractColumns(by.Expr) for _, col := range cols { - if p.children[1-idx].Schema().Contains(col) { + if !p.children[idx].Schema().Contains(col) { return p.children[idx].pushDownTopN(nil) } } diff --git a/planner/core/stats.go b/planner/core/stats.go index e33a87bf41291..b9c3f7563a47a 100644 --- a/planner/core/stats.go +++ b/planner/core/stats.go @@ -160,7 +160,7 @@ func (ds *DataSource) getColumnNDV(colID int64) (ndv float64) { hist, ok := ds.statisticTable.Columns[colID] if ok && hist.Count > 0 { factor := float64(ds.statisticTable.Count) / float64(hist.Count) - ndv = float64(hist.NDV) * factor + ndv = float64(hist.Histogram.NDV) * factor } else { ndv = float64(ds.statisticTable.Count) * distinctFactor } @@ -174,14 +174,19 @@ func (ds *DataSource) getGroupNDVs(colGroups [][]*expression.Column) []property. tbl := ds.tableStats.HistColl ndvs := make([]property.GroupNDV, 0, len(colGroups)) for idxID, idx := range tbl.Indices { - idxCols := make([]int64, len(tbl.Idx2ColumnIDs[idxID])) + colsLen := len(tbl.Idx2ColumnIDs[idxID]) + // tbl.Idx2ColumnIDs may only contain the prefix of index columns. + if colsLen != len(idx.Info.Columns) { + continue + } + idxCols := make([]int64, colsLen) copy(idxCols, tbl.Idx2ColumnIDs[idxID]) sort.Slice(idxCols, func(i, j int) bool { return idxCols[i] < idxCols[j] }) for _, g := range colGroups { // We only want those exact matches. - if len(g) != len(idxCols) { + if len(g) != colsLen { continue } match := true @@ -307,14 +312,19 @@ func (ds *DataSource) DeriveStats(childStats []*property.StatsInfo, selfSchema * sessionAndStmtPermission := (ds.ctx.GetSessionVars().GetEnableIndexMerge() || len(ds.indexMergeHints) > 0) && !ds.ctx.GetSessionVars().StmtCtx.NoIndexMergeHint // If there is an index path, we current do not consider `IndexMergePath`. needConsiderIndexMerge := true - for i := 1; i < len(ds.possibleAccessPaths); i++ { - if len(ds.possibleAccessPaths[i].AccessConds) != 0 { - needConsiderIndexMerge = false - break + if len(ds.indexMergeHints) == 0 { + for i := 1; i < len(ds.possibleAccessPaths); i++ { + if len(ds.possibleAccessPaths[i].AccessConds) != 0 { + needConsiderIndexMerge = false + break + } } } if isPossibleIdxMerge && sessionAndStmtPermission && needConsiderIndexMerge && isReadOnlyTxn { - ds.generateAndPruneIndexMergePath(ds.indexMergeHints != nil) + err := ds.generateAndPruneIndexMergePath(ds.indexMergeHints != nil) + if err != nil { + return nil, err + } } else if len(ds.indexMergeHints) > 0 { ds.indexMergeHints = nil ds.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("IndexMerge is inapplicable or disabled")) @@ -322,23 +332,27 @@ func (ds *DataSource) DeriveStats(childStats []*property.StatsInfo, selfSchema * return ds.stats, nil } -func (ds *DataSource) generateAndPruneIndexMergePath(needPrune bool) { +func (ds *DataSource) generateAndPruneIndexMergePath(needPrune bool) error { regularPathCount := len(ds.possibleAccessPaths) - ds.generateIndexMergeOrPaths() + err := ds.generateIndexMergeOrPaths() + if err != nil { + return err + } // If without hints, it means that `enableIndexMerge` is true if len(ds.indexMergeHints) == 0 { - return + return nil } // With hints and without generated IndexMerge paths if regularPathCount == len(ds.possibleAccessPaths) { ds.indexMergeHints = nil ds.ctx.GetSessionVars().StmtCtx.AppendWarning(errors.Errorf("IndexMerge is inapplicable or disabled")) - return + return nil } // Do not need to consider the regular paths in find_best_task(). if needPrune { ds.possibleAccessPaths = ds.possibleAccessPaths[regularPathCount:] } + return nil } // DeriveStats implements LogicalPlan DeriveStats interface. @@ -394,7 +408,7 @@ func (is *LogicalIndexScan) DeriveStats(childStats []*property.StatsInfo, selfSc } // getIndexMergeOrPath generates all possible IndexMergeOrPaths. -func (ds *DataSource) generateIndexMergeOrPaths() { +func (ds *DataSource) generateIndexMergeOrPaths() error { usedIndexCount := len(ds.possibleAccessPaths) for i, cond := range ds.pushedDownConds { sf, ok := cond.(*expression.ScalarFunction) @@ -410,16 +424,39 @@ func (ds *DataSource) generateIndexMergeOrPaths() { partialPaths = nil break } - partialPath := ds.buildIndexMergePartialPath(itemPaths) + partialPath, err := ds.buildIndexMergePartialPath(itemPaths) + if err != nil { + return err + } if partialPath == nil { partialPaths = nil break } partialPaths = append(partialPaths, partialPath) } + // If all of the partialPaths use the same index, we will not use the indexMerge. + singlePath := true + for i := len(partialPaths) - 1; i >= 1; i-- { + if partialPaths[i].Index != partialPaths[i-1].Index { + singlePath = false + break + } + } + if singlePath { + continue + } if len(partialPaths) > 1 { possiblePath := ds.buildIndexMergeOrPath(partialPaths, i) - sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, []expression.Expression{sf}, nil) + if possiblePath == nil { + return nil + } + + accessConds := make([]expression.Expression, 0, len(partialPaths)) + for _, p := range partialPaths { + accessConds = append(accessConds, p.AccessConds...) + } + accessDNF := expression.ComposeDNFCondition(ds.ctx, accessConds...) + sel, _, err := ds.tableStats.HistColl.Selectivity(ds.ctx, []expression.Expression{accessDNF}, nil) if err != nil { logutil.BgLogger().Debug("something wrong happened, use the default selectivity", zap.Error(err)) sel = SelectionFactor @@ -428,6 +465,7 @@ func (ds *DataSource) generateIndexMergeOrPaths() { ds.possibleAccessPaths = append(ds.possibleAccessPaths, possiblePath) } } + return nil } // isInIndexMergeHints checks whether current index or primary key is in IndexMerge hints. @@ -468,12 +506,10 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us logutil.BgLogger().Debug("can not derive statistics of a path", zap.Error(err)) continue } - if len(path.TableFilters) > 0 || len(path.AccessConds) == 0 { - // If AccessConds is empty or tableFilter is not empty, we ignore the access path. - // Now these conditions are too strict. - // For example, a sql `select * from t where a > 1 or (b < 2 and c > 3)` and table `t` with indexes - // on a and b separately. we can generate a `IndexMergePath` with table filter `a > 1 or (b < 2 and c > 3)`. - // TODO: solve the above case + // If `AccessConds` is empty, we ignore the access path. + // If the path contains a full range, ignore it also. This can happen when `AccessConds` is constant true, and + // it comes from the result of a subquery, so it is not folded. + if len(path.AccessConds) == 0 || ranger.HasFullRange(path.Ranges) { continue } // If we have point or empty range, just remove other possible paths. @@ -497,12 +533,10 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us continue } noIntervalRanges := ds.deriveIndexPathStats(path, conditions, true) - if len(path.TableFilters) > 0 || len(path.AccessConds) == 0 { - // If AccessConds is empty or tableFilter is not empty, we ignore the access path. - // Now these conditions are too strict. - // For example, a sql `select * from t where a > 1 or (b < 2 and c > 3)` and table `t` with indexes - // on a and b separately. we can generate a `IndexMergePath` with table filter `a > 1 or (b < 2 and c > 3)`. - // TODO: solve the above case + // If `AccessConds` is empty, we ignore the access path. + // If the path contains a full range, ignore it also. This can happen when `AccessConds` is constant true, and + // it comes from the result of a subquery, so it is not folded. + if len(path.AccessConds) == 0 || ranger.HasFullRange(path.Ranges) { continue } // If we have empty range, or point range on unique index, just remove other possible paths. @@ -522,26 +556,25 @@ func (ds *DataSource) accessPathsForConds(conditions []expression.Expression, us } // buildIndexMergePartialPath chooses the best index path from all possible paths. -// Now we just choose the index with most columns. -// We should improve this strategy, because it is not always better to choose index -// with most columns, e.g, filter is c > 1 and the input indexes are c and c_d_e, -// the former one is enough, and it is less expensive in execution compared with the latter one. -// TODO: improve strategy of the partial path selection -func (ds *DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) *util.AccessPath { +// Now we choose the index with minimal estimate row count. +func (ds *DataSource) buildIndexMergePartialPath(indexAccessPaths []*util.AccessPath) (*util.AccessPath, error) { if len(indexAccessPaths) == 1 { - return indexAccessPaths[0] + return indexAccessPaths[0], nil } - maxColsIndex := 0 - maxCols := len(indexAccessPaths[0].IdxCols) - for i := 1; i < len(indexAccessPaths); i++ { - current := len(indexAccessPaths[i].IdxCols) - if current > maxCols { - maxColsIndex = i - maxCols = current + minEstRowIndex := 0 + minEstRow := math.MaxFloat64 + for i := 0; i < len(indexAccessPaths); i++ { + rc := indexAccessPaths[i].CountAfterAccess + if len(indexAccessPaths[i].IndexFilters) > 0 { + rc = indexAccessPaths[i].CountAfterIndex + } + if rc < minEstRow { + minEstRowIndex = i + minEstRow = rc } } - return indexAccessPaths[maxColsIndex] + return indexAccessPaths[minEstRowIndex], nil } // buildIndexMergeOrPath generates one possible IndexMergePath. @@ -549,6 +582,13 @@ func (ds *DataSource) buildIndexMergeOrPath(partialPaths []*util.AccessPath, cur indexMergePath := &util.AccessPath{PartialIndexPaths: partialPaths} indexMergePath.TableFilters = append(indexMergePath.TableFilters, ds.pushedDownConds[:current]...) indexMergePath.TableFilters = append(indexMergePath.TableFilters, ds.pushedDownConds[current+1:]...) + for _, path := range partialPaths { + // If any partial path contains table filters, we need to keep the whole DNF filter in the Selection. + if len(path.TableFilters) > 0 { + indexMergePath.TableFilters = append(indexMergePath.TableFilters, ds.pushedDownConds[current]) + break + } + } return indexMergePath } @@ -608,17 +648,44 @@ func (lt *LogicalTopN) DeriveStats(childStats []*property.StatsInfo, selfSchema return lt.stats, nil } -// getCardinality will return the Cardinality of a couple of columns. We simply return the max one, because we cannot know -// the Cardinality for multi-dimension attributes properly. This is a simple and naive scheme of Cardinality estimation. +func getGroupNDV4Cols(cols []*expression.Column, stats *property.StatsInfo) *property.GroupNDV { + if len(cols) == 0 || len(stats.GroupNDVs) == 0 { + return nil + } + cols = expression.SortColumns(cols) + for _, groupNDV := range stats.GroupNDVs { + if len(cols) != len(groupNDV.Cols) { + continue + } + match := true + for i, col := range groupNDV.Cols { + if col != cols[i].UniqueID { + match = false + break + } + } + if match { + return &groupNDV + } + } + return nil +} + +// getCardinality returns the Cardinality of a couple of columns. +// If the columns match any GroupNDV maintained by child operator, we can get an accurate cardinality. +// Otherwise, we simply return the max cardinality among the columns, which is a lower bound. func getCardinality(cols []*expression.Column, schema *expression.Schema, profile *property.StatsInfo) float64 { cardinality := 1.0 + if groupNDV := getGroupNDV4Cols(cols, profile); groupNDV != nil { + return math.Max(groupNDV.NDV, cardinality) + } indices := schema.ColumnsIndices(cols) if indices == nil { logutil.BgLogger().Error("column not found in schema", zap.Any("columns", cols), zap.String("schema", schema.String())) return cardinality } for _, idx := range indices { - // It is a very elementary estimation. + // It is a very naive estimation. col := schema.Columns[idx] cardinality = math.Max(cardinality, profile.Cardinality[col.UniqueID]) } @@ -712,31 +779,19 @@ func (p *LogicalProjection) ExtractColGroups(colGroups [][]*expression.Column) [ return extracted } -func (la *LogicalAggregation) getGroupNDVs(colGroups [][]*expression.Column, childProfile *property.StatsInfo, selfSchema *expression.Schema, gbyCols []*expression.Column) []property.GroupNDV { - if len(colGroups) == 0 || len(childProfile.GroupNDVs) == 0 { +func (la *LogicalAggregation) getGroupNDVs(colGroups [][]*expression.Column, childProfile *property.StatsInfo, gbyCols []*expression.Column) []property.GroupNDV { + if len(colGroups) == 0 { return nil } // Check if the child profile provides GroupNDV for the GROUP BY columns. // Note that gbyCols may not be the exact GROUP BY columns, e.g, GROUP BY a+b, // but we have no other approaches for the cardinality estimation of these cases // except for using the independent assumption, unless we can use stats of expression index. - gbyCols = expression.SortColumns(gbyCols) - for _, groupNDV := range childProfile.GroupNDVs { - if len(gbyCols) != len(groupNDV.Cols) { - continue - } - match := true - for i, col := range groupNDV.Cols { - if col != gbyCols[i].UniqueID { - match = false - break - } - } - if match { - return []property.GroupNDV{groupNDV} - } + groupNDV := getGroupNDV4Cols(gbyCols, childProfile) + if groupNDV == nil { + return nil } - return nil + return []property.GroupNDV{*groupNDV} } // DeriveStats implement LogicalPlan DeriveStats interface. @@ -749,7 +804,7 @@ func (la *LogicalAggregation) DeriveStats(childStats []*property.StatsInfo, self } if la.stats != nil { // Reload GroupNDVs since colGroups may have changed. - la.stats.GroupNDVs = la.getGroupNDVs(colGroups, childProfile, selfSchema, gbyCols) + la.stats.GroupNDVs = la.getGroupNDVs(colGroups, childProfile, gbyCols) return la.stats, nil } cardinality := getCardinality(gbyCols, childSchema[0], childProfile) @@ -762,7 +817,7 @@ func (la *LogicalAggregation) DeriveStats(childStats []*property.StatsInfo, self la.stats.Cardinality[col.UniqueID] = cardinality } la.inputCount = childProfile.RowCount - la.stats.GroupNDVs = la.getGroupNDVs(colGroups, childProfile, selfSchema, gbyCols) + la.stats.GroupNDVs = la.getGroupNDVs(colGroups, childProfile, gbyCols) return la.stats, nil } @@ -778,7 +833,7 @@ func (la *LogicalAggregation) ExtractColGroups(_ [][]*expression.Column) [][]*ex cols := expression.ExtractColumns(gbyExpr) gbyCols = append(gbyCols, cols...) } - if len(gbyCols) > 0 { + if len(gbyCols) > 1 { return [][]*expression.Column{expression.SortColumns(gbyCols)} } return nil diff --git a/planner/core/stats_test.go b/planner/core/stats_test.go index 509100038d279..c38531990fb5e 100644 --- a/planner/core/stats_test.go +++ b/planner/core/stats_test.go @@ -34,7 +34,7 @@ type testStatsSuite struct { func (s *testStatsSuite) SetUpSuite(c *C) { s.Parser = parser.New() - s.Parser.EnableWindowFunc(true) + s.Parser.SetParserConfig(parser.ParserConfig{EnableWindowFunction: true, EnableStrictDoubleTypeCheck: true}) var err error s.testData, err = testutil.LoadTestSuiteData("testdata", "stats_suite") @@ -76,7 +76,7 @@ func (s *testStatsSuite) TestGroupNDVs(c *C) { stmt, err := s.ParseOneStmt(tt, "", "") c.Assert(err, IsNil, comment) core.Preprocess(tk.Se, stmt, is) - builder := core.NewPlanBuilder(tk.Se, is, &hint.BlockHintProcessor{}) + builder, _ := core.NewPlanBuilder(tk.Se, is, &hint.BlockHintProcessor{}) p, err := builder.Build(ctx, stmt) c.Assert(err, IsNil, comment) p, err = core.LogicalOptimize(ctx, builder.GetOptFlag(), p.(core.LogicalPlan)) @@ -136,3 +136,36 @@ func (s *testStatsSuite) TestGroupNDVs(c *C) { c.Assert(joinInput, Equals, output[i].JoinInput, comment) } } + +func (s *testStatsSuite) TestCardinalityGroupCols(c *C) { + store, dom, err := newStoreWithBootstrap() + c.Assert(err, IsNil) + defer func() { + dom.Close() + store.Close() + }() + tk := testkit.NewTestKit(c, store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int not null, b int not null, key(a,b))") + tk.MustExec("insert into t1 values(1,1),(1,2),(2,1),(2,2)") + tk.MustExec("create table t2(a int not null, b int not null, key(a,b))") + tk.MustExec("insert into t2 values(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)") + tk.MustExec("analyze table t1") + tk.MustExec("analyze table t2") + + var input []string + var output []struct { + SQL string + Plan []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain format = 'brief' " + tt).Rows()) + }) + // The test point is the row count estimation for aggregations and joins. + tk.MustQuery("explain format = 'brief' " + tt).Check(testkit.Rows(output[i].Plan...)) + } +} diff --git a/planner/core/stringer.go b/planner/core/stringer.go index b005d097ebb51..4c63f6ff244b9 100644 --- a/planner/core/stringer.go +++ b/planner/core/stringer.go @@ -37,6 +37,7 @@ func toString(in Plan, strs []string, idxs []int) ([]string, []int) { for _, c := range x.Children() { strs, idxs = toString(c, strs, idxs) } + case *PhysicalExchangeReceiver: // do nothing case PhysicalPlan: if len(x.Children()) > 1 { idxs = append(idxs, len(strs)) @@ -266,8 +267,8 @@ func toString(in Plan, strs []string, idxs []int) ([]string, []int) { str = fmt.Sprintf("Window(%s)", x.ExplainInfo()) case *PhysicalShuffle: str = fmt.Sprintf("Partition(%s)", x.ExplainInfo()) - case *PhysicalShuffleDataSourceStub: - str = fmt.Sprintf("PartitionDataSourceStub(%s)", x.ExplainInfo()) + case *PhysicalShuffleReceiverStub: + str = fmt.Sprintf("PartitionReceiverStub(%s)", x.ExplainInfo()) case *PointGetPlan: str = fmt.Sprintf("PointGet(") if x.IndexInfo != nil { @@ -282,6 +283,18 @@ func toString(in Plan, strs []string, idxs []int) ([]string, []int) { } else { str += fmt.Sprintf("Handle(%s.%s)%v)", x.TblInfo.Name.L, x.TblInfo.GetPkName().L, x.Handles) } + case *PhysicalExchangeReceiver: + str = fmt.Sprintf("Recv(") + for _, task := range x.Tasks { + str += fmt.Sprintf("%d, ", task.ID) + } + str += fmt.Sprintf(")") + case *PhysicalExchangeSender: + str = fmt.Sprintf("Send(") + for _, task := range x.TargetTasks { + str += fmt.Sprintf("%d, ", task.ID) + } + str += fmt.Sprintf(")") default: str = fmt.Sprintf("%T", in) } diff --git a/planner/core/task.go b/planner/core/task.go index 814ff7eff5343..59dc164239380 100644 --- a/planner/core/task.go +++ b/planner/core/task.go @@ -16,6 +16,7 @@ package core import ( "math" + "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" @@ -30,10 +31,17 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/plancodec" + "github.com/pingcap/tipb/go-tipb" +) + +var ( + _ task = &copTask{} + _ task = &rootTask{} + _ task = &mppTask{} ) // task is a new version of `PhysicalPlanInfo`. It stores cost information for a task. -// A task may be CopTask, RootTask, MPPTask or a ParallelTask. +// A task may be CopTask, RootTask, MPPTaskMeta or a ParallelTask. type task interface { count() float64 addCost(cost float64) @@ -41,6 +49,7 @@ type task interface { copy() task plan() PhysicalPlan invalid() bool + convertToRootTask(ctx sessionctx.Context) *rootTask } // copTask is a task that runs in a distributed kv store. @@ -122,6 +131,9 @@ func attachPlan2Task(p PhysicalPlan, t task) task { case *rootTask: p.SetChildren(v.p) v.p = p + case *mppTask: + p.SetChildren(v.p) + v.p = p } return t } @@ -167,18 +179,27 @@ func (t *copTask) getStoreType() kv.StoreType { } func (p *basePhysicalPlan) attach2Task(tasks ...task) task { - t := finishCopTask(p.ctx, tasks[0].copy()) + t := tasks[0].convertToRootTask(p.ctx) return attachPlan2Task(p.self, t) } func (p *PhysicalUnionScan) attach2Task(tasks ...task) task { + if pj, ok := tasks[0].plan().(*PhysicalProjection); ok { + // Convert unionScan->projection to projection->unionScan, because unionScan can't handle projection as its children. + p.SetChildren(pj.children...) + p.stats = tasks[0].plan().statsInfo() + rt, _ := tasks[0].(*rootTask) + rt.p = pj.children[0] + pj.SetChildren(p) + return pj.attach2Task(p.basePhysicalPlan.attach2Task(tasks...)) + } p.stats = tasks[0].plan().statsInfo() return p.basePhysicalPlan.attach2Task(tasks...) } func (p *PhysicalApply) attach2Task(tasks ...task) task { - lTask := finishCopTask(p.ctx, tasks[0].copy()) - rTask := finishCopTask(p.ctx, tasks[1].copy()) + lTask := tasks[0].convertToRootTask(p.ctx) + rTask := tasks[1].convertToRootTask(p.ctx) p.SetChildren(lTask.plan(), rTask.plan()) p.schema = BuildPhysicalJoinSchema(p.JoinType, p) return &rootTask{ @@ -216,7 +237,7 @@ func (p *PhysicalApply) GetCost(lCount, rCount, lCost, rCost float64) float64 { func (p *PhysicalIndexMergeJoin) attach2Task(tasks ...task) task { innerTask := p.innerTask - outerTask := finishCopTask(p.ctx, tasks[1-p.InnerChildIdx].copy()) + outerTask := tasks[1-p.InnerChildIdx].convertToRootTask(p.ctx) if p.InnerChildIdx == 1 { p.SetChildren(outerTask.plan(), innerTask.plan()) } else { @@ -293,7 +314,7 @@ func (p *PhysicalIndexMergeJoin) GetCost(outerTask, innerTask task) float64 { func (p *PhysicalIndexHashJoin) attach2Task(tasks ...task) task { innerTask := p.innerTask - outerTask := finishCopTask(p.ctx, tasks[1-p.InnerChildIdx].copy()) + outerTask := tasks[1-p.InnerChildIdx].convertToRootTask(p.ctx) if p.InnerChildIdx == 1 { p.SetChildren(outerTask.plan(), innerTask.plan()) } else { @@ -368,7 +389,7 @@ func (p *PhysicalIndexHashJoin) GetCost(outerTask, innerTask task) float64 { func (p *PhysicalIndexJoin) attach2Task(tasks ...task) task { innerTask := p.innerTask - outerTask := finishCopTask(p.ctx, tasks[1-p.InnerChildIdx].copy()) + outerTask := tasks[1-p.InnerChildIdx].convertToRootTask(p.ctx) if p.InnerChildIdx == 1 { p.SetChildren(outerTask.plan(), innerTask.plan()) } else { @@ -456,7 +477,7 @@ func (p *PhysicalHashJoin) GetCost(lCnt, rCnt float64) float64 { oomUseTmpStorage := config.GetGlobalConfig().OOMUseTmpStorage memQuota := sessVars.StmtCtx.MemTracker.GetBytesLimit() // sessVars.MemQuotaQuery && hint rowSize := getAvgRowSize(build.statsInfo(), build.Schema()) - spill := oomUseTmpStorage && memQuota > 0 && rowSize*buildCnt > float64(memQuota) + spill := oomUseTmpStorage && memQuota > 0 && rowSize*buildCnt > float64(memQuota) && p.storeTp != kv.TiFlash // Cost of building hash table. cpuCost := buildCnt * sessVars.CPUFactor memoryCost := buildCnt * sessVars.MemoryFactor @@ -523,8 +544,11 @@ func (p *PhysicalHashJoin) GetCost(lCnt, rCnt float64) float64 { } func (p *PhysicalHashJoin) attach2Task(tasks ...task) task { - lTask := finishCopTask(p.ctx, tasks[0].copy()) - rTask := finishCopTask(p.ctx, tasks[1].copy()) + if p.storeTp == kv.TiFlash { + return p.attach2TaskForTiFlash(tasks...) + } + lTask := tasks[0].convertToRootTask(p.ctx) + rTask := tasks[1].convertToRootTask(p.ctx) p.SetChildren(lTask.plan(), rTask.plan()) task := &rootTask{ p: p, @@ -533,43 +557,37 @@ func (p *PhysicalHashJoin) attach2Task(tasks ...task) task { return task } -// GetCost computes cost of broadcast join operator itself. -func (p *PhysicalBroadCastJoin) GetCost(lCnt, rCnt float64) float64 { - buildCnt := lCnt - if p.InnerChildIdx == 1 { - buildCnt = rCnt - } - sessVars := p.ctx.GetSessionVars() - // Cost of building hash table. - cpuCost := buildCnt * sessVars.CopCPUFactor - memoryCost := buildCnt * sessVars.MemoryFactor - // Number of matched row pairs regarding the equal join conditions. - helper := &fullJoinRowCountHelper{ - cartesian: false, - leftProfile: p.children[0].statsInfo(), - rightProfile: p.children[1].statsInfo(), - leftJoinKeys: p.LeftJoinKeys, - rightJoinKeys: p.RightJoinKeys, - leftSchema: p.children[0].Schema(), - rightSchema: p.children[1].Schema(), +func (p *PhysicalHashJoin) attach2TaskForMpp(tasks ...task) task { + lTask, lok := tasks[0].(*mppTask) + rTask, rok := tasks[1].(*mppTask) + if !lok || !rok { + return invalidTask } - numPairs := helper.estimate() - probeCost := numPairs * sessVars.CopCPUFactor - // should divided by the concurrency in tiflash, which should be the number of core in tiflash nodes. - probeCost /= float64(sessVars.CopTiFlashConcurrencyFactor) - cpuCost += probeCost + p.SetChildren(lTask.plan(), rTask.plan()) + p.schema = BuildPhysicalJoinSchema(p.JoinType, p) + lCost := lTask.cost() + rCost := rTask.cost() - // todo since TiFlash join is significant faster than TiDB join, maybe - // need to add a variable like 'tiflash_accelerate_factor', and divide - // the final cost by that factor - return cpuCost + memoryCost + outerTask := tasks[1-p.InnerChildIdx].(*mppTask) + receivers := make([]*PhysicalExchangeReceiver, 0) + receivers = append(receivers, lTask.receivers...) + receivers = append(receivers, rTask.receivers...) + task := &mppTask{ + cst: lCost + rCost + p.GetCost(lTask.count(), rTask.count()), + p: p, + partTp: outerTask.partTp, + hashCols: outerTask.hashCols, + ts: outerTask.ts, + receivers: receivers, + } + return task } -func (p *PhysicalBroadCastJoin) attach2Task(tasks ...task) task { +func (p *PhysicalHashJoin) attach2TaskForTiFlash(tasks ...task) task { lTask, lok := tasks[0].(*copTask) rTask, rok := tasks[1].(*copTask) - if !lok || !rok || (lTask.getStoreType() != kv.TiFlash && rTask.getStoreType() != kv.TiFlash) { - return invalidTask + if !lok || !rok { + return p.attach2TaskForMpp(tasks...) } p.SetChildren(lTask.plan(), rTask.plan()) p.schema = BuildPhysicalJoinSchema(p.JoinType, p) @@ -639,8 +657,8 @@ func (p *PhysicalMergeJoin) GetCost(lCnt, rCnt float64) float64 { } func (p *PhysicalMergeJoin) attach2Task(tasks ...task) task { - lTask := finishCopTask(p.ctx, tasks[0].copy()) - rTask := finishCopTask(p.ctx, tasks[1].copy()) + lTask := tasks[0].convertToRootTask(p.ctx) + rTask := tasks[1].convertToRootTask(p.ctx) p.SetChildren(lTask.plan(), rTask.plan()) return &rootTask{ p: p, @@ -700,12 +718,16 @@ func buildIndexLookUpTask(ctx sessionctx.Context, t *copTask) *rootTask { return newTask } -// finishCopTask means we close the coprocessor task and create a root task. -func finishCopTask(ctx sessionctx.Context, task task) task { - t, ok := task.(*copTask) - if !ok { - return task - } +func (t *rootTask) convertToRootTask(_ sessionctx.Context) *rootTask { + return t.copy().(*rootTask) +} + +func (t *copTask) convertToRootTask(ctx sessionctx.Context) *rootTask { + // copy one to avoid changing itself. + return t.copy().(*copTask).convertToRootTaskImpl(ctx) +} + +func (t *copTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { sessVars := ctx.GetSessionVars() // copTasks are run in parallel, to make the estimated cost closer to execution time, we amortize // the cost to cop iterator workers. According to `CopClient::Send`, the concurrency @@ -713,6 +735,8 @@ func finishCopTask(ctx sessionctx.Context, task task) task { // the number of regions involved, we simply use DistSQLScanConcurrency. copIterWorkers := float64(t.plan().SCtx().GetSessionVars().DistSQLScanConcurrency()) t.finishIndexPlan() + needExtraProj := false + var prevSchema *expression.Schema // Network cost of transferring rows of table scan to TiDB. if t.tablePlan != nil { t.cst += t.count() * sessVars.NetworkFactor * t.tblColHists.GetAvgRowSize(ctx, t.tablePlan.Schema().Columns, false, false) @@ -722,12 +746,18 @@ func finishCopTask(ctx sessionctx.Context, task task) task { if len(tp.Children()) == 1 { tp = tp.Children()[0] } else { - join := tp.(*PhysicalBroadCastJoin) + join := tp.(*PhysicalHashJoin) tp = join.children[1-join.InnerChildIdx] } } ts := tp.(*PhysicalTableScan) + prevColumnLen := len(ts.Columns) + prevSchema = ts.schema.Clone() ts.Columns = ExpandVirtualColumn(ts.Columns, ts.schema, ts.Table.Columns) + if len(ts.Columns) > prevColumnLen { + // Add an projection to make sure not to output extract columns. + needExtraProj = true + } } t.cst /= copIterWorkers newTask := &rootTask{ @@ -756,7 +786,7 @@ func finishCopTask(ctx sessionctx.Context, task task) task { if len(tp.Children()) == 1 { tp = tp.Children()[0] } else { - join := tp.(*PhysicalBroadCastJoin) + join := tp.(*PhysicalHashJoin) tp = join.children[1-join.InnerChildIdx] } } @@ -768,7 +798,14 @@ func finishCopTask(ctx sessionctx.Context, task task) task { }.Init(ctx, t.tablePlan.SelectBlockOffset()) p.PartitionInfo = t.partitionInfo p.stats = t.tablePlan.statsInfo() - newTask.p = p + if needExtraProj { + proj := PhysicalProjection{Exprs: expression.Column2Exprs(prevSchema.Columns)}.Init(ts.ctx, ts.stats, ts.SelectBlockOffset(), nil) + proj.SetSchema(prevSchema) + proj.SetChildren(p) + newTask.p = proj + } else { + newTask.p = p + } } if len(t.rootTaskConds) > 0 { @@ -835,8 +872,10 @@ func (p *PhysicalLimit) attach2Task(tasks ...task) task { stats := deriveLimitStats(childProfile, float64(newCount)) pushedDownLimit := PhysicalLimit{Count: newCount}.Init(p.ctx, stats, p.blockOffset) cop = attachPlan2Task(pushedDownLimit, cop).(*copTask) + // Don't use clone() so that Limit and its children share the same schema. Otherwise the virtual generated column may not be resolved right. + pushedDownLimit.SetSchema(pushedDownLimit.children[0].Schema()) } - t = finishCopTask(p.ctx, cop) + t = cop.convertToRootTask(p.ctx) sunk = p.sinkIntoIndexLookUp(t) } if sunk { @@ -988,10 +1027,9 @@ func (p *PhysicalTopN) attach2Task(tasks ...task) task { } copTask.addCost(pushedDownTopN.GetCost(inputCount, false)) } - rootTask := finishCopTask(p.ctx, t) + rootTask := t.convertToRootTask(p.ctx) rootTask.addCost(p.GetCost(rootTask.count(), true)) - rootTask = attachPlan2Task(p, rootTask) - return rootTask + return attachPlan2Task(p, rootTask) } // GetCost computes the cost of projection operator itself. @@ -1009,10 +1047,22 @@ func (p *PhysicalProjection) GetCost(count float64) float64 { func (p *PhysicalProjection) attach2Task(tasks ...task) task { t := tasks[0].copy() - if copTask, ok := t.(*copTask); ok { - // TODO: support projection push down. - t = finishCopTask(p.ctx, copTask) + if cop, ok := t.(*copTask); ok { + if len(cop.rootTaskConds) == 0 && cop.getStoreType() == kv.TiFlash && expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, p.Exprs, p.ctx.GetClient(), cop.getStoreType()) { + copTask := attachPlan2Task(p, cop) + copTask.addCost(p.GetCost(t.count())) + return copTask + } + } else if mpp, ok := t.(*mppTask); ok { + if expression.CanExprsPushDown(p.ctx.GetSessionVars().StmtCtx, p.Exprs, p.ctx.GetClient(), kv.TiFlash) { + p.SetChildren(mpp.p) + mpp.p = p + mpp.addCost(p.GetCost(t.count())) + return mpp + } } + // TODO: support projection push down for TiKV. + t = t.convertToRootTask(p.ctx) t = attachPlan2Task(p, t) t.addCost(p.GetCost(t.count())) return t @@ -1023,7 +1073,7 @@ func (p *PhysicalUnionAll) attach2Task(tasks ...task) task { childPlans := make([]PhysicalPlan, 0, len(tasks)) var childMaxCost float64 for _, task := range tasks { - task = finishCopTask(p.ctx, task) + task = task.convertToRootTask(p.ctx) childCost := task.cost() if childCost > childMaxCost { childMaxCost = childCost @@ -1039,10 +1089,15 @@ func (p *PhysicalUnionAll) attach2Task(tasks ...task) task { func (sel *PhysicalSelection) attach2Task(tasks ...task) task { sessVars := sel.ctx.GetSessionVars() - t := finishCopTask(sel.ctx, tasks[0].copy()) + if mppTask, _ := tasks[0].(*mppTask); mppTask != nil { // always push to mpp task. + sc := sel.ctx.GetSessionVars().StmtCtx + if expression.CanExprsPushDown(sc, sel.Conditions, sel.ctx.GetClient(), kv.TiFlash) { + return attachPlan2Task(sel, mppTask.copy()) + } + } + t := tasks[0].convertToRootTask(sel.ctx) t.addCost(t.count() * sessVars.CPUFactor) - t = attachPlan2Task(sel, t) - return t + return attachPlan2Task(sel, t) } // CheckAggCanPushCop checks whether the aggFuncs and groupByItems can @@ -1051,7 +1106,8 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc sc := sctx.GetSessionVars().StmtCtx client := sctx.GetClient() for _, aggFunc := range aggFuncs { - if expression.ContainVirtualColumn(aggFunc.Args) { + // if the aggFunc contain VirtualColumn or CorrelatedColumn, it can not be pushed down. + if expression.ContainVirtualColumn(aggFunc.Args) || expression.ContainCorrelatedColumn(aggFunc.Args) { return false } pb := aggregation.AggFuncToPBExpr(sc, client, aggFunc) @@ -1059,6 +1115,13 @@ func CheckAggCanPushCop(sctx sessionctx.Context, aggFuncs []*aggregation.AggFunc return false } if !aggregation.CheckAggPushDown(aggFunc, storeType) { + if sc.InExplainStmt { + storageName := storeType.Name() + if storeType == kv.UnSpecified { + storageName = "storage layer" + } + sc.AppendWarning(errors.New("Agg function '" + aggFunc.Name + "' can not be pushed to " + storageName)) + } return false } if !expression.CanExprsPushDown(sc, aggFunc.Args, client, storeType) { @@ -1082,7 +1145,7 @@ type AggInfo struct { // returns the information of partial and final agg. // partialIsCop means whether partial agg is a cop task. func BuildFinalModeAggregation( - sctx sessionctx.Context, original *AggInfo, partialIsCop bool) (partial, final *AggInfo, funcMap map[*aggregation.AggFuncDesc]*aggregation.AggFuncDesc) { + sctx sessionctx.Context, original *AggInfo, partialIsCop bool, isMPPTask bool) (partial, final *AggInfo, funcMap map[*aggregation.AggFuncDesc]*aggregation.AggFuncDesc) { funcMap = make(map[*aggregation.AggFuncDesc]*aggregation.AggFuncDesc, len(original.AggFuncs)) partial = &AggInfo{ @@ -1158,7 +1221,7 @@ func BuildFinalModeAggregation( // if partial agg is not cop, we must append firstrow function & schema, to output the group by // items. // maybe we can unify them sometime. - firstRow, err := aggregation.NewAggFuncDesc(sctx, ast.AggFuncFirstRow, []expression.Expression{gbyCol}, false) + firstRow, err := aggregation.NewAggFuncDesc(sctx, ast.AggFuncFirstRow, []expression.Expression{distinctArg}, false) if err != nil { panic("NewAggFuncDesc FirstRow meets error: " + err.Error()) } @@ -1176,14 +1239,21 @@ func BuildFinalModeAggregation( finalAggFunc.Mode = aggregation.CompleteMode } else { if aggregation.NeedCount(finalAggFunc.Name) { - ft := types.NewFieldType(mysql.TypeLonglong) - ft.Flen, ft.Charset, ft.Collate = 21, charset.CharsetBin, charset.CollationBin - partial.Schema.Append(&expression.Column{ - UniqueID: sctx.GetSessionVars().AllocPlanColumnID(), - RetType: ft, - }) - args = append(args, partial.Schema.Columns[partialCursor]) - partialCursor++ + if isMPPTask && finalAggFunc.Name == ast.AggFuncCount { + // For MPP Task, the final count() is changed to sum(). + // Note: MPP mode does not run avg() directly, instead, avg() -> sum()/(case when count() = 0 then 1 else count() end), + // so we do not process it here. + finalAggFunc.Name = ast.AggFuncSum + } else { + ft := types.NewFieldType(mysql.TypeLonglong) + ft.Flen, ft.Charset, ft.Collate = 21, charset.CharsetBin, charset.CollationBin + partial.Schema.Append(&expression.Column{ + UniqueID: sctx.GetSessionVars().AllocPlanColumnID(), + RetType: ft, + }) + args = append(args, partial.Schema.Columns[partialCursor]) + partialCursor++ + } } if finalAggFunc.Name == ast.AggFuncApproxCountDistinct { ft := types.NewFieldType(mysql.TypeString) @@ -1234,7 +1304,72 @@ func BuildFinalModeAggregation( return } -func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType) (partial, final PhysicalPlan) { +// convertAvgForMPP converts avg(arg) to sum(arg)/(case when count(arg)=0 then 1 else count(arg) end), in detail: +// 1.rewrite avg() in the final aggregation to count() and sum(), and reconstruct its schema. +// 2.replace avg() with sum(arg)/(case when count(arg)=0 then 1 else count(arg) end) and reuse the original schema of the final aggregation. +// If there is no avg, nothing is changed and return nil. +func (p *basePhysicalAgg) convertAvgForMPP() *PhysicalProjection { + newSchema := expression.NewSchema() + newSchema.Keys = p.schema.Keys + newSchema.UniqueKeys = p.schema.UniqueKeys + newAggFuncs := make([]*aggregation.AggFuncDesc, 0, 2*len(p.AggFuncs)) + ft := types.NewFieldType(mysql.TypeLonglong) + ft.Flen, ft.Decimal, ft.Charset, ft.Collate = 20, 0, charset.CharsetBin, charset.CollationBin + exprs := make([]expression.Expression, 0, 2*len(p.schema.Columns)) + // add agg functions schema + for i, aggFunc := range p.AggFuncs { + if aggFunc.Name == ast.AggFuncAvg { + // inset a count(column) + avgCount := *aggFunc + avgCount.Name = ast.AggFuncCount + newAggFuncs = append(newAggFuncs, &avgCount) + avgCount.RetTp = ft + avgCountCol := &expression.Column{ + UniqueID: p.SCtx().GetSessionVars().AllocPlanColumnID(), + RetType: ft, + } + newSchema.Append(avgCountCol) + // insert a sum(column) + avgSum := *aggFunc + avgSum.Name = ast.AggFuncSum + newAggFuncs = append(newAggFuncs, &avgSum) + newSchema.Append(p.schema.Columns[i]) + avgSumCol := p.schema.Columns[i] + // avgSumCol/(case when avgCountCol=0 then 1 else avgCountCol end) + eq := expression.NewFunctionInternal(p.ctx, ast.EQ, types.NewFieldType(mysql.TypeTiny), avgCountCol, expression.NewZero()) + caseWhen := expression.NewFunctionInternal(p.ctx, ast.Case, avgCountCol.RetType, eq, expression.NewOne(), avgCountCol) + divide := expression.NewFunctionInternal(p.ctx, ast.Div, avgSumCol.RetType, avgSumCol, caseWhen) + divide.(*expression.ScalarFunction).RetType = avgSumCol.RetType + exprs = append(exprs, divide) + } else { + newAggFuncs = append(newAggFuncs, aggFunc) + newSchema.Append(p.schema.Columns[i]) + exprs = append(exprs, p.schema.Columns[i]) + } + } + // no avgs + // for final agg, always add project due to in-compatibility between TiDB and TiFlash + if len(p.schema.Columns) == len(newSchema.Columns) && !p.isFinalAgg() { + return nil + } + // add remaining columns to exprs + for i := len(p.AggFuncs); i < len(p.schema.Columns); i++ { + exprs = append(exprs, p.schema.Columns[i]) + } + proj := PhysicalProjection{ + Exprs: exprs, + CalculateNoDelay: false, + AvoidColumnEvaluator: false, + }.Init(p.SCtx(), p.stats, p.SelectBlockOffset(), p.GetChildReqProps(0).CloneEssentialFields()) + proj.SetSchema(p.schema) + + p.AggFuncs = newAggFuncs + p.schema = newSchema + + return proj +} + +func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType, isMPPTask bool) (partial, final PhysicalPlan) { // Check if this aggregation can push down. if !CheckAggCanPushCop(p.ctx, p.AggFuncs, p.GroupByItems, copTaskType) { return nil, p.self @@ -1243,7 +1378,7 @@ func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType) (partial AggFuncs: p.AggFuncs, GroupByItems: p.GroupByItems, Schema: p.Schema().Clone(), - }, true) + }, true, isMPPTask) if p.tp == plancodec.TypeStreamAgg && len(partialPref.GroupByItems) != len(finalPref.GroupByItems) { return nil, p.self } @@ -1271,6 +1406,7 @@ func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType) (partial finalAgg := basePhysicalAgg{ AggFuncs: finalPref.AggFuncs, GroupByItems: finalPref.GroupByItems, + MppRunMode: p.MppRunMode, }.initForStream(p.ctx, p.stats, p.blockOffset, prop) finalAgg.schema = finalPref.Schema return partialAgg, finalAgg @@ -1279,6 +1415,7 @@ func (p *basePhysicalAgg) newPartialAggregate(copTaskType kv.StoreType) (partial finalAgg := basePhysicalAgg{ AggFuncs: finalPref.AggFuncs, GroupByItems: finalPref.GroupByItems, + MppRunMode: p.MppRunMode, }.initForHash(p.ctx, p.stats, p.blockOffset, prop) finalAgg.schema = finalPref.Schema return partialAgg, finalAgg @@ -1367,24 +1504,31 @@ func (p *PhysicalStreamAgg) attach2Task(tasks ...task) task { // The `extraHandleCol` is added if the double read needs to keep order. So we just use it to decided // whether the following plan is double read with order reserved. if cop.extraHandleCol != nil || len(cop.rootTaskConds) > 0 { - t = finishCopTask(p.ctx, cop) + t = cop.convertToRootTask(p.ctx) inputRows = t.count() attachPlan2Task(p, t) } else { copTaskType := cop.getStoreType() - partialAgg, finalAgg := p.newPartialAggregate(copTaskType) + partialAgg, finalAgg := p.newPartialAggregate(copTaskType, false) if partialAgg != nil { if cop.tablePlan != nil { cop.finishIndexPlan() partialAgg.SetChildren(cop.tablePlan) cop.tablePlan = partialAgg + // If doubleReadNeedProj is true, a projection will be created above the PhysicalIndexLookUpReader to make sure + // the schema is the same as the original DataSource schema. + // However, we pushed down the agg here, the partial agg was placed on the top of tablePlan, and the final + // agg will be placed above the PhysicalIndexLookUpReader, and the schema will be set correctly for them. + // If we add the projection again, the projection will be between the PhysicalIndexLookUpReader and + // the partial agg, and the schema will be broken. + cop.doubleReadNeedProj = false } else { partialAgg.SetChildren(cop.indexPlan) cop.indexPlan = partialAgg } cop.addCost(p.GetCost(inputRows, false)) } - t = finishCopTask(p.ctx, cop) + t = cop.convertToRootTask(p.ctx) inputRows = t.count() attachPlan2Task(finalAgg, t) } @@ -1428,18 +1572,84 @@ func (p *PhysicalHashAgg) cpuCostDivisor(hasDistinct bool) (float64, float64) { return math.Min(float64(finalCon), float64(partialCon)), float64(finalCon + partialCon) } +func (p *PhysicalHashAgg) attach2TaskForMpp(tasks ...task) task { + t := tasks[0].copy() + mpp, ok := t.(*mppTask) + if !ok { + return invalidTask + } + inputRows := mpp.count() + switch p.MppRunMode { + case Mpp1Phase: + // 1-phase agg: when the partition columns can be satisfied, where the plan does not need to enforce Exchange + // only push down the original agg + proj := p.convertAvgForMPP() + attachPlan2Task(p.self, mpp) + if proj != nil { + attachPlan2Task(proj, mpp) + } + mpp.addCost(p.GetCost(inputRows, false)) + return mpp + case Mpp2Phase: + proj := p.convertAvgForMPP() + partialAgg, finalAgg := p.newPartialAggregate(kv.TiFlash, true) + if partialAgg == nil { + return invalidTask + } + attachPlan2Task(partialAgg, mpp) + items := finalAgg.(*PhysicalHashAgg).GroupByItems + partitionCols := make([]*expression.Column, 0, len(items)) + for _, expr := range items { + col, ok := expr.(*expression.Column) + if !ok { + return invalidTask + } + partitionCols = append(partitionCols, col) + } + prop := &property.PhysicalProperty{TaskTp: property.MppTaskType, ExpectedCnt: math.MaxFloat64, PartitionTp: property.HashType, PartitionCols: partitionCols} + newMpp := mpp.enforceExchangerImpl(prop) + attachPlan2Task(finalAgg, newMpp) + if proj != nil { + attachPlan2Task(proj, newMpp) + } + // TODO: how to set 2-phase cost? + newMpp.addCost(p.GetCost(inputRows, false)) + return newMpp + case MppTiDB: + partialAgg, finalAgg := p.newPartialAggregate(kv.TiFlash, false) + if partialAgg != nil { + attachPlan2Task(partialAgg, mpp) + } + mpp.addCost(p.GetCost(inputRows, false)) + t = mpp.convertToRootTask(p.ctx) + inputRows = t.count() + attachPlan2Task(finalAgg, t) + t.addCost(p.GetCost(inputRows, true)) + return t + default: + return invalidTask + } +} + func (p *PhysicalHashAgg) attach2Task(tasks ...task) task { t := tasks[0].copy() inputRows := t.count() if cop, ok := t.(*copTask); ok { if len(cop.rootTaskConds) == 0 { copTaskType := cop.getStoreType() - partialAgg, finalAgg := p.newPartialAggregate(copTaskType) + partialAgg, finalAgg := p.newPartialAggregate(copTaskType, false) if partialAgg != nil { if cop.tablePlan != nil { cop.finishIndexPlan() partialAgg.SetChildren(cop.tablePlan) cop.tablePlan = partialAgg + // If doubleReadNeedProj is true, a projection will be created above the PhysicalIndexLookUpReader to make sure + // the schema is the same as the original DataSource schema. + // However, we pushed down the agg here, the partial agg was placed on the top of tablePlan, and the final + // agg will be placed above the PhysicalIndexLookUpReader, and the schema will be set correctly for them. + // If we add the projection again, the projection will be between the PhysicalIndexLookUpReader and + // the partial agg, and the schema will be broken. + cop.doubleReadNeedProj = false } else { partialAgg.SetChildren(cop.indexPlan) cop.indexPlan = partialAgg @@ -1452,14 +1662,16 @@ func (p *PhysicalHashAgg) attach2Task(tasks ...task) task { // column may be independent of the column used for region distribution, so a closer // estimation of network cost for hash aggregation may multiply the number of // regions involved in the `partialAgg`, which is unknown however. - t = finishCopTask(p.ctx, cop) + t = cop.convertToRootTask(p.ctx) inputRows = t.count() attachPlan2Task(finalAgg, t) } else { - t = finishCopTask(p.ctx, cop) + t = cop.convertToRootTask(p.ctx) inputRows = t.count() attachPlan2Task(p, t) } + } else if _, ok := t.(*mppTask); ok { + return p.attach2TaskForMpp(tasks...) } else { attachPlan2Task(p, t) } @@ -1503,3 +1715,122 @@ func (p *PhysicalHashAgg) GetCost(inputRows float64, isRoot bool) float64 { memoryCost += inputRows * distinctFactor * sessVars.MemoryFactor * float64(numDistinctFunc) return cpuCost + memoryCost } + +// mppTask can not : +// 1. keep order +// 2. support double read +// 3. consider virtual columns. +// 4. TODO: partition prune after close +type mppTask struct { + p PhysicalPlan + cst float64 + + partTp property.PartitionType + hashCols []*expression.Column + + ts *PhysicalTableScan + receivers []*PhysicalExchangeReceiver +} + +func (t *mppTask) count() float64 { + return t.p.statsInfo().RowCount +} + +func (t *mppTask) addCost(cst float64) { + t.cst += cst +} + +func (t *mppTask) cost() float64 { + return t.cst +} + +func (t *mppTask) copy() task { + nt := *t + return &nt +} + +func (t *mppTask) plan() PhysicalPlan { + return t.p +} + +func (t *mppTask) invalid() bool { + return t.p == nil +} + +func (t *mppTask) convertToRootTask(ctx sessionctx.Context) *rootTask { + return t.copy().(*mppTask).convertToRootTaskImpl(ctx) +} + +func (t *mppTask) convertToRootTaskImpl(ctx sessionctx.Context) *rootTask { + sender := PhysicalExchangeSender{ + ExchangeType: tipb.ExchangeType_PassThrough, + }.Init(ctx, t.p.statsInfo()) + sender.SetChildren(t.p) + sender.Fragment = &Fragment{ExchangeReceivers: t.receivers, ExchangeSender: sender, TableScan: t.ts} + + p := PhysicalTableReader{ + tablePlan: sender, + StoreType: kv.TiFlash, + }.Init(ctx, t.p.SelectBlockOffset()) + p.stats = t.p.statsInfo() + return &rootTask{ + p: p, + cst: t.cst / 20, // TODO: This is tricky because mpp doesn't run in a coprocessor way. + } +} + +func (t *mppTask) needEnforce(prop *property.PhysicalProperty) bool { + switch prop.PartitionTp { + case property.AnyType: + return false + case property.BroadcastType: + return true + default: + if t.partTp != property.HashType { + return true + } + // TODO: consider equalivant class + if len(prop.PartitionCols) != len(t.hashCols) { + return true + } + for i, col := range prop.PartitionCols { + if !col.Equal(nil, t.hashCols[i]) { + return true + } + } + return false + } +} + +func (t *mppTask) enforceExchanger(prop *property.PhysicalProperty) *mppTask { + if len(prop.SortItems) != 0 { + return &mppTask{} + } + if !t.needEnforce(prop) { + return t + } + return t.copy().(*mppTask).enforceExchangerImpl(prop) +} + +func (t *mppTask) enforceExchangerImpl(prop *property.PhysicalProperty) *mppTask { + ctx := t.p.SCtx() + sender := PhysicalExchangeSender{ + ExchangeType: tipb.ExchangeType(prop.PartitionTp), + HashCols: prop.PartitionCols, + }.Init(ctx, t.p.statsInfo()) + sender.SetChildren(t.p) + f := &Fragment{ExchangeSender: sender, TableScan: t.ts, ExchangeReceivers: t.receivers} + sender.Fragment = f + receiver := PhysicalExchangeReceiver{ + ChildPf: f, + }.Init(ctx, t.p.statsInfo()) + receiver.SetChildren(sender) + cst := t.cst + t.count()*ctx.GetSessionVars().NetworkFactor + return &mppTask{ + p: receiver, + cst: cst, + partTp: prop.PartitionTp, + hashCols: prop.PartitionCols, + receivers: []*PhysicalExchangeReceiver{receiver}, + } +} diff --git a/planner/core/testdata/analyzeSuiteTestLimitIndexEstimationT.json b/planner/core/testdata/analyzeSuiteTestLimitIndexEstimationT.json new file mode 100644 index 0000000000000..1ea31af5f7629 --- /dev/null +++ b/planner/core/testdata/analyzeSuiteTestLimitIndexEstimationT.json @@ -0,0 +1,46522 @@ +{ + "database_name": "test", + "table_name": "t", + "columns": { + "a": { + "histogram": { + "ndv": 1000000, + "buckets": [ + { + "count": 3998, + "lower_bound": "MTQwMw==", + "upper_bound": "MzY0MQ==", + "repeats": 1 + }, + { + "count": 7996, + "lower_bound": "MzgxNg==", + "upper_bound": "NjUyOQ==", + "repeats": 1 + }, + { + "count": 11994, + "lower_bound": "NjgyMw==", + "upper_bound": "MTE5MTk=", + "repeats": 1 + }, + { + "count": 15992, + "lower_bound": "MTIzNTE=", + "upper_bound": "MTc4NjI=", + "repeats": 1 + }, + { + "count": 19990, + "lower_bound": "MTgxNTE=", + "upper_bound": "MjUxNjI=", + "repeats": 1 + }, + { + "count": 23988, + "lower_bound": "MjY3NDU=", + "upper_bound": "Mjk2MzE=", + "repeats": 1 + }, + { + "count": 27986, + "lower_bound": "MzAzNzA=", + "upper_bound": "MzI3Njc=", + "repeats": 1 + }, + { + "count": 31984, + "lower_bound": "MzM0NjY=", + "upper_bound": "Mzg0MjE=", + "repeats": 1 + }, + { + "count": 35982, + "lower_bound": "Mzk0NzI=", + "upper_bound": "NDI0MzQ=", + "repeats": 1 + }, + { + "count": 39980, + "lower_bound": "NDI0Njk=", + "upper_bound": "NDQ3NDI=", + "repeats": 1 + }, + { + "count": 43978, + "lower_bound": "NDgyODA=", + "upper_bound": "NTIyMjk=", + "repeats": 1 + }, + { + "count": 47976, + "lower_bound": "NTIzNTM=", + "upper_bound": "NTcwNjQ=", + "repeats": 1 + }, + { + "count": 51974, + "lower_bound": "NTcxMzc=", + "upper_bound": "NjA5ODQ=", + "repeats": 1 + }, + { + "count": 55972, + "lower_bound": "NjEyODI=", + "upper_bound": "NjU1MTk=", + "repeats": 1 + }, + { + "count": 59970, + "lower_bound": "NjU2MzA=", + "upper_bound": "Njg2ODI=", + "repeats": 1 + }, + { + "count": 63968, + "lower_bound": "NjkyMDg=", + "upper_bound": "NzczMDA=", + "repeats": 1 + }, + { + "count": 67966, + "lower_bound": "NzgyMTc=", + "upper_bound": "ODMyODc=", + "repeats": 1 + }, + { + "count": 71964, + "lower_bound": "ODM4NjM=", + "upper_bound": "ODgyODQ=", + "repeats": 1 + }, + { + "count": 75962, + "lower_bound": "ODg3NDc=", + "upper_bound": "OTE1MTQ=", + "repeats": 1 + }, + { + "count": 79960, + "lower_bound": "OTE5NDk=", + "upper_bound": "OTc0MjY=", + "repeats": 1 + }, + { + "count": 83958, + "lower_bound": "OTc1NTA=", + "upper_bound": "MTAyMjU2", + "repeats": 1 + }, + { + "count": 87956, + "lower_bound": "MTAzODAy", + "upper_bound": "MTA4ODM5", + "repeats": 1 + }, + { + "count": 91954, + "lower_bound": "MTA5NDA0", + "upper_bound": "MTExODEy", + "repeats": 1 + }, + { + "count": 95952, + "lower_bound": "MTEyMjEw", + "upper_bound": "MTE4NTEx", + "repeats": 1 + }, + { + "count": 99950, + "lower_bound": "MTE5MDE2", + "upper_bound": "MTI0MjQw", + "repeats": 1 + }, + { + "count": 103948, + "lower_bound": "MTI0ODk1", + "upper_bound": "MTMwNDM0", + "repeats": 1 + }, + { + "count": 107946, + "lower_bound": "MTMwODU1", + "upper_bound": "MTMzODI1", + "repeats": 1 + }, + { + "count": 111944, + "lower_bound": "MTM1NDkz", + "upper_bound": "MTM3MzA3", + "repeats": 1 + }, + { + "count": 115942, + "lower_bound": "MTM4MjQ3", + "upper_bound": "MTM5Njk3", + "repeats": 1 + }, + { + "count": 119940, + "lower_bound": "MTQwMzQ2", + "upper_bound": "MTQyMTg4", + "repeats": 1 + }, + { + "count": 123938, + "lower_bound": "MTQyNzgy", + "upper_bound": "MTQ1NDIz", + "repeats": 1 + }, + { + "count": 127936, + "lower_bound": "MTQ2NjQ4", + "upper_bound": "MTUxMDk5", + "repeats": 1 + }, + { + "count": 131934, + "lower_bound": "MTUxNTM1", + "upper_bound": "MTU2MzI5", + "repeats": 1 + }, + { + "count": 135932, + "lower_bound": "MTU2NDI0", + "upper_bound": "MTY0MTMx", + "repeats": 1 + }, + { + "count": 139930, + "lower_bound": "MTY1NDE2", + "upper_bound": "MTY3NTY3", + "repeats": 1 + }, + { + "count": 143928, + "lower_bound": "MTY4Mzcw", + "upper_bound": "MTcyNzQz", + "repeats": 1 + }, + { + "count": 147926, + "lower_bound": "MTczMDU3", + "upper_bound": "MTc2MzI3", + "repeats": 1 + }, + { + "count": 151924, + "lower_bound": "MTc2MzYz", + "upper_bound": "MTgzMDIz", + "repeats": 1 + }, + { + "count": 155922, + "lower_bound": "MTgzNTI1", + "upper_bound": "MTkwMTg2", + "repeats": 1 + }, + { + "count": 159920, + "lower_bound": "MTkwNzQx", + "upper_bound": "MTk1MDcz", + "repeats": 1 + }, + { + "count": 163918, + "lower_bound": "MTk1MjQ5", + "upper_bound": "MTk4Mzk4", + "repeats": 1 + }, + { + "count": 167916, + "lower_bound": "MTk4NjQx", + "upper_bound": "MjA2OTYz", + "repeats": 1 + }, + { + "count": 171914, + "lower_bound": "MjA3MTM5", + "upper_bound": "MjEwNzg0", + "repeats": 1 + }, + { + "count": 175912, + "lower_bound": "MjExMzky", + "upper_bound": "MjE3OTk5", + "repeats": 1 + }, + { + "count": 179910, + "lower_bound": "MjE4MTU2", + "upper_bound": "MjI2Mzkw", + "repeats": 1 + }, + { + "count": 183908, + "lower_bound": "MjI3NDU2", + "upper_bound": "MjMwNDI1", + "repeats": 1 + }, + { + "count": 187906, + "lower_bound": "MjMwNDM4", + "upper_bound": "MjM0NjMy", + "repeats": 1 + }, + { + "count": 191904, + "lower_bound": "MjM1NjIw", + "upper_bound": "MjQxMDk3", + "repeats": 1 + }, + { + "count": 195902, + "lower_bound": "MjQxMTAy", + "upper_bound": "MjQ0MjYy", + "repeats": 1 + }, + { + "count": 199900, + "lower_bound": "MjQ1Njgx", + "upper_bound": "MjUzNTY1", + "repeats": 1 + }, + { + "count": 203898, + "lower_bound": "MjU0NTg4", + "upper_bound": "MjU5NzQx", + "repeats": 1 + }, + { + "count": 207896, + "lower_bound": "MjYwNTM3", + "upper_bound": "MjYzNzY4", + "repeats": 1 + }, + { + "count": 211894, + "lower_bound": "MjY0MDU5", + "upper_bound": "MjY5Mzk0", + "repeats": 1 + }, + { + "count": 215892, + "lower_bound": "MjY5NDU4", + "upper_bound": "MjczODc1", + "repeats": 1 + }, + { + "count": 219890, + "lower_bound": "MjczODk4", + "upper_bound": "MjgwNDk4", + "repeats": 1 + }, + { + "count": 223888, + "lower_bound": "MjgwNTg3", + "upper_bound": "Mjg2MDE3", + "repeats": 1 + }, + { + "count": 227886, + "lower_bound": "Mjg4ODI1", + "upper_bound": "MjkzNzIw", + "repeats": 1 + }, + { + "count": 231884, + "lower_bound": "Mjk0NjAz", + "upper_bound": "Mjk3Nzg3", + "repeats": 1 + }, + { + "count": 235882, + "lower_bound": "Mjk4Mjgz", + "upper_bound": "MzAzMzQ2", + "repeats": 1 + }, + { + "count": 239880, + "lower_bound": "MzA0OTcy", + "upper_bound": "MzA4OTgy", + "repeats": 1 + }, + { + "count": 243878, + "lower_bound": "MzA5NDky", + "upper_bound": "MzE1MjA4", + "repeats": 1 + }, + { + "count": 247876, + "lower_bound": "MzE2MjQx", + "upper_bound": "MzE5MDYz", + "repeats": 1 + }, + { + "count": 251874, + "lower_bound": "MzE5MTgy", + "upper_bound": "MzIxODcz", + "repeats": 1 + }, + { + "count": 255872, + "lower_bound": "MzIyODQ5", + "upper_bound": "MzI1NjQw", + "repeats": 1 + }, + { + "count": 259870, + "lower_bound": "MzI1OTQ2", + "upper_bound": "MzMxMTY3", + "repeats": 1 + }, + { + "count": 263868, + "lower_bound": "MzMxODU1", + "upper_bound": "MzM1NTMw", + "repeats": 1 + }, + { + "count": 267866, + "lower_bound": "MzM2Mjg1", + "upper_bound": "MzQyMzE3", + "repeats": 1 + }, + { + "count": 271864, + "lower_bound": "MzQyNjAw", + "upper_bound": "MzQ3MjU2", + "repeats": 1 + }, + { + "count": 275862, + "lower_bound": "MzQ4MTIw", + "upper_bound": "MzUxMjg4", + "repeats": 1 + }, + { + "count": 279860, + "lower_bound": "MzUzODc1", + "upper_bound": "MzU3NjI2", + "repeats": 1 + }, + { + "count": 283858, + "lower_bound": "MzU3NzAx", + "upper_bound": "MzYyMjIy", + "repeats": 1 + }, + { + "count": 287856, + "lower_bound": "MzYzNDgy", + "upper_bound": "MzcwNzQx", + "repeats": 1 + }, + { + "count": 291854, + "lower_bound": "MzcxMDk3", + "upper_bound": "Mzc0ODky", + "repeats": 1 + }, + { + "count": 295852, + "lower_bound": "Mzc1NDkw", + "upper_bound": "MzgwMzU3", + "repeats": 1 + }, + { + "count": 299850, + "lower_bound": "MzgxNDQ1", + "upper_bound": "Mzg0ODA0", + "repeats": 1 + }, + { + "count": 303848, + "lower_bound": "Mzg0ODYw", + "upper_bound": "Mzg5NDQz", + "repeats": 1 + }, + { + "count": 307846, + "lower_bound": "MzkwNDUw", + "upper_bound": "Mzk1MTU5", + "repeats": 1 + }, + { + "count": 311844, + "lower_bound": "Mzk2Nzgz", + "upper_bound": "NDAwNDUy", + "repeats": 1 + }, + { + "count": 315842, + "lower_bound": "NDAwNTIz", + "upper_bound": "NDAzNDc1", + "repeats": 1 + }, + { + "count": 319840, + "lower_bound": "NDAzOTQz", + "upper_bound": "NDEwNDg0", + "repeats": 1 + }, + { + "count": 323838, + "lower_bound": "NDEwODY0", + "upper_bound": "NDE1NDUy", + "repeats": 1 + }, + { + "count": 327836, + "lower_bound": "NDE2MTQ4", + "upper_bound": "NDE4MDkx", + "repeats": 1 + }, + { + "count": 331834, + "lower_bound": "NDE4MTM3", + "upper_bound": "NDI0NzIz", + "repeats": 1 + }, + { + "count": 335832, + "lower_bound": "NDI0NzI0", + "upper_bound": "NDI4OTAy", + "repeats": 1 + }, + { + "count": 339830, + "lower_bound": "NDI5MzE3", + "upper_bound": "NDMzNjI3", + "repeats": 1 + }, + { + "count": 343828, + "lower_bound": "NDMzODM4", + "upper_bound": "NDM3MjMz", + "repeats": 1 + }, + { + "count": 347826, + "lower_bound": "NDM4MDIz", + "upper_bound": "NDQyMzcz", + "repeats": 1 + }, + { + "count": 351824, + "lower_bound": "NDQzMzA1", + "upper_bound": "NDQ3Mzcx", + "repeats": 1 + }, + { + "count": 355822, + "lower_bound": "NDQ4MzM3", + "upper_bound": "NDUyODk0", + "repeats": 1 + }, + { + "count": 359820, + "lower_bound": "NDUzMzY4", + "upper_bound": "NDU2MTI4", + "repeats": 1 + }, + { + "count": 363818, + "lower_bound": "NDU2MzU5", + "upper_bound": "NDYwNzkz", + "repeats": 1 + }, + { + "count": 367816, + "lower_bound": "NDYxMzIx", + "upper_bound": "NDcxOTM4", + "repeats": 1 + }, + { + "count": 371814, + "lower_bound": "NDcyMjMz", + "upper_bound": "NDc5MDA3", + "repeats": 1 + }, + { + "count": 375812, + "lower_bound": "NDc5NDg1", + "upper_bound": "NDgyMTIx", + "repeats": 1 + }, + { + "count": 379810, + "lower_bound": "NDgzMjM1", + "upper_bound": "NDg2MTY1", + "repeats": 1 + }, + { + "count": 383808, + "lower_bound": "NDg4MjM2", + "upper_bound": "NDkxMTky", + "repeats": 1 + }, + { + "count": 387806, + "lower_bound": "NDkyNDA0", + "upper_bound": "NDk2OTA1", + "repeats": 1 + }, + { + "count": 391804, + "lower_bound": "NDk3ODY2", + "upper_bound": "NTAyNzk4", + "repeats": 1 + }, + { + "count": 395802, + "lower_bound": "NTAzODI1", + "upper_bound": "NTA2NTc0", + "repeats": 1 + }, + { + "count": 399800, + "lower_bound": "NTA2OTQw", + "upper_bound": "NTA5ODA1", + "repeats": 1 + }, + { + "count": 403798, + "lower_bound": "NTA5ODQx", + "upper_bound": "NTE2OTU3", + "repeats": 1 + }, + { + "count": 407796, + "lower_bound": "NTE3NTM3", + "upper_bound": "NTIwMTIz", + "repeats": 1 + }, + { + "count": 411794, + "lower_bound": "NTIwMjQ5", + "upper_bound": "NTI0Mzk4", + "repeats": 1 + }, + { + "count": 415792, + "lower_bound": "NTI2MTEy", + "upper_bound": "NTMyOTU0", + "repeats": 1 + }, + { + "count": 419790, + "lower_bound": "NTMzNjk1", + "upper_bound": "NTM2ODQ4", + "repeats": 1 + }, + { + "count": 423788, + "lower_bound": "NTM2OTEz", + "upper_bound": "NTQyMzU1", + "repeats": 1 + }, + { + "count": 427786, + "lower_bound": "NTQyNTQ2", + "upper_bound": "NTQ2ODE3", + "repeats": 1 + }, + { + "count": 431784, + "lower_bound": "NTQ4OTA3", + "upper_bound": "NTUyNDQw", + "repeats": 1 + }, + { + "count": 435782, + "lower_bound": "NTUyODI2", + "upper_bound": "NTU2MDE2", + "repeats": 1 + }, + { + "count": 439780, + "lower_bound": "NTU2MjMx", + "upper_bound": "NTYwNzU3", + "repeats": 1 + }, + { + "count": 443778, + "lower_bound": "NTYxMjI0", + "upper_bound": "NTY3ODg1", + "repeats": 1 + }, + { + "count": 447776, + "lower_bound": "NTY4MDAx", + "upper_bound": "NTczMjY4", + "repeats": 1 + }, + { + "count": 451774, + "lower_bound": "NTczMzYx", + "upper_bound": "NTc5MTA4", + "repeats": 1 + }, + { + "count": 455772, + "lower_bound": "NTc5MzQx", + "upper_bound": "NTg1ODk3", + "repeats": 1 + }, + { + "count": 459770, + "lower_bound": "NTg2ODE4", + "upper_bound": "NTkwMjQz", + "repeats": 1 + }, + { + "count": 463768, + "lower_bound": "NTkwNDYz", + "upper_bound": "NTkyNzEz", + "repeats": 1 + }, + { + "count": 467766, + "lower_bound": "NTkzNTEz", + "upper_bound": "NTk1NDgz", + "repeats": 1 + }, + { + "count": 471764, + "lower_bound": "NTk3MDEz", + "upper_bound": "NjAxMTU5", + "repeats": 1 + }, + { + "count": 475762, + "lower_bound": "NjAxMTk5", + "upper_bound": "NjA2MjI1", + "repeats": 1 + }, + { + "count": 479760, + "lower_bound": "NjA3NzU4", + "upper_bound": "NjEwNTMy", + "repeats": 1 + }, + { + "count": 483758, + "lower_bound": "NjEyOTI2", + "upper_bound": "NjE3ODcz", + "repeats": 1 + }, + { + "count": 487756, + "lower_bound": "NjE3OTQz", + "upper_bound": "NjIyMjI1", + "repeats": 1 + }, + { + "count": 491754, + "lower_bound": "NjIyNTg3", + "upper_bound": "NjI2NTI1", + "repeats": 1 + }, + { + "count": 495752, + "lower_bound": "NjI2NTQ2", + "upper_bound": "NjI5ODk4", + "repeats": 1 + }, + { + "count": 499750, + "lower_bound": "NjI5OTE0", + "upper_bound": "NjMzNzcy", + "repeats": 1 + }, + { + "count": 503748, + "lower_bound": "NjM0MDc3", + "upper_bound": "NjM2ODI4", + "repeats": 1 + }, + { + "count": 507746, + "lower_bound": "NjM2OTA2", + "upper_bound": "NjM5NDg3", + "repeats": 1 + }, + { + "count": 511744, + "lower_bound": "NjM5NjYz", + "upper_bound": "NjQwODE2", + "repeats": 1 + }, + { + "count": 515742, + "lower_bound": "NjQxMjY5", + "upper_bound": "NjQzNzcw", + "repeats": 1 + }, + { + "count": 519740, + "lower_bound": "NjQzODY0", + "upper_bound": "NjQ1NTEw", + "repeats": 1 + }, + { + "count": 523738, + "lower_bound": "NjQ2MjY0", + "upper_bound": "NjUwMzQ1", + "repeats": 1 + }, + { + "count": 527736, + "lower_bound": "NjUwNjY1", + "upper_bound": "NjUxODYx", + "repeats": 1 + }, + { + "count": 531734, + "lower_bound": "NjUyMDcy", + "upper_bound": "NjU2Mjgz", + "repeats": 1 + }, + { + "count": 535732, + "lower_bound": "NjU2NTYz", + "upper_bound": "NjU3ODk2", + "repeats": 1 + }, + { + "count": 539730, + "lower_bound": "NjU4NzQ3", + "upper_bound": "NjYxOTYy", + "repeats": 1 + }, + { + "count": 543728, + "lower_bound": "NjYzNDEw", + "upper_bound": "NjY2MDE3", + "repeats": 1 + }, + { + "count": 547726, + "lower_bound": "NjY2Mzg0", + "upper_bound": "NjY5NTkz", + "repeats": 1 + }, + { + "count": 551724, + "lower_bound": "NjY5NzI2", + "upper_bound": "NjcyOTEx", + "repeats": 1 + }, + { + "count": 555722, + "lower_bound": "NjczMDY1", + "upper_bound": "Njc1Njg0", + "repeats": 1 + }, + { + "count": 559720, + "lower_bound": "Njc1NzYx", + "upper_bound": "Njc4NDM1", + "repeats": 1 + }, + { + "count": 563718, + "lower_bound": "Njc4NTc4", + "upper_bound": "Njc5NzQ1", + "repeats": 1 + }, + { + "count": 567716, + "lower_bound": "NjgwMjc4", + "upper_bound": "NjgzMTA5", + "repeats": 1 + }, + { + "count": 571714, + "lower_bound": "NjgzMTEx", + "upper_bound": "Njg1MjA5", + "repeats": 1 + }, + { + "count": 575712, + "lower_bound": "Njg1Mzg2", + "upper_bound": "Njg2ODgy", + "repeats": 1 + }, + { + "count": 579710, + "lower_bound": "Njg2OTE3", + "upper_bound": "Njg5MjE5", + "repeats": 1 + }, + { + "count": 583708, + "lower_bound": "Njg5MjQ0", + "upper_bound": "NjkxMjkw", + "repeats": 1 + }, + { + "count": 587706, + "lower_bound": "NjkxNDgy", + "upper_bound": "Njk1Mzk0", + "repeats": 1 + }, + { + "count": 591704, + "lower_bound": "Njk2MTMw", + "upper_bound": "Njk4MDMw", + "repeats": 1 + }, + { + "count": 595702, + "lower_bound": "Njk4OTMx", + "upper_bound": "NzAyMzE4", + "repeats": 1 + }, + { + "count": 599700, + "lower_bound": "NzAzNzcx", + "upper_bound": "NzA3MjUw", + "repeats": 1 + }, + { + "count": 603698, + "lower_bound": "NzA3Mzkx", + "upper_bound": "NzA4MzA4", + "repeats": 1 + }, + { + "count": 607696, + "lower_bound": "NzA4NTUx", + "upper_bound": "NzExNjE1", + "repeats": 1 + }, + { + "count": 611694, + "lower_bound": "NzExNjM0", + "upper_bound": "NzE0OTMy", + "repeats": 1 + }, + { + "count": 615692, + "lower_bound": "NzE1MTAy", + "upper_bound": "NzE2MzUx", + "repeats": 1 + }, + { + "count": 619690, + "lower_bound": "NzE2NTkw", + "upper_bound": "NzE5MTA5", + "repeats": 1 + }, + { + "count": 623688, + "lower_bound": "NzE5NTQ2", + "upper_bound": "NzIyNzIw", + "repeats": 1 + }, + { + "count": 627686, + "lower_bound": "NzIyNzY3", + "upper_bound": "NzI4Mzk4", + "repeats": 1 + }, + { + "count": 631684, + "lower_bound": "NzI4NDc0", + "upper_bound": "NzMwODE1", + "repeats": 1 + }, + { + "count": 635682, + "lower_bound": "NzMwODIz", + "upper_bound": "NzMyMDg4", + "repeats": 1 + }, + { + "count": 639680, + "lower_bound": "NzMyOTI4", + "upper_bound": "NzM1OTM5", + "repeats": 1 + }, + { + "count": 643678, + "lower_bound": "NzM2MDIx", + "upper_bound": "NzM4NzI4", + "repeats": 1 + }, + { + "count": 647676, + "lower_bound": "NzM5NjU5", + "upper_bound": "NzQxMzc1", + "repeats": 1 + }, + { + "count": 651674, + "lower_bound": "NzQyNzcw", + "upper_bound": "NzQ0NDky", + "repeats": 1 + }, + { + "count": 655672, + "lower_bound": "NzQ1NDI2", + "upper_bound": "NzQ5MDc0", + "repeats": 1 + }, + { + "count": 659670, + "lower_bound": "NzQ5MTE4", + "upper_bound": "NzUxMDA5", + "repeats": 1 + }, + { + "count": 663668, + "lower_bound": "NzUxMzQ4", + "upper_bound": "NzU0Nzg2", + "repeats": 1 + }, + { + "count": 667666, + "lower_bound": "NzU0ODEz", + "upper_bound": "NzU3MDA3", + "repeats": 1 + }, + { + "count": 671664, + "lower_bound": "NzU3MDUz", + "upper_bound": "NzYwNjIy", + "repeats": 1 + }, + { + "count": 675662, + "lower_bound": "NzYwNjc3", + "upper_bound": "NzYzOTk3", + "repeats": 1 + }, + { + "count": 679660, + "lower_bound": "NzY0NTEx", + "upper_bound": "NzY2ODcw", + "repeats": 1 + }, + { + "count": 683658, + "lower_bound": "NzY3Mzcy", + "upper_bound": "NzcwOTU1", + "repeats": 1 + }, + { + "count": 687656, + "lower_bound": "NzcxMDU2", + "upper_bound": "NzczNDk2", + "repeats": 1 + }, + { + "count": 691654, + "lower_bound": "NzczNjU3", + "upper_bound": "Nzc2OTMz", + "repeats": 1 + }, + { + "count": 695652, + "lower_bound": "Nzc3MTE0", + "upper_bound": "Nzc5NDU0", + "repeats": 1 + }, + { + "count": 699650, + "lower_bound": "Nzc5NTA3", + "upper_bound": "NzgxMDgw", + "repeats": 1 + }, + { + "count": 703648, + "lower_bound": "NzgxMTkx", + "upper_bound": "NzgyOTIy", + "repeats": 1 + }, + { + "count": 707646, + "lower_bound": "NzgzMTMx", + "upper_bound": "Nzg1NTg2", + "repeats": 1 + }, + { + "count": 711644, + "lower_bound": "Nzg2MTY4", + "upper_bound": "NzkxODI5", + "repeats": 1 + }, + { + "count": 715642, + "lower_bound": "NzkxODgw", + "upper_bound": "Nzk0NDE3", + "repeats": 1 + }, + { + "count": 719640, + "lower_bound": "Nzk0Nzc2", + "upper_bound": "Nzk5MDE0", + "repeats": 1 + }, + { + "count": 723638, + "lower_bound": "Nzk5MDYw", + "upper_bound": "ODAxOTgw", + "repeats": 1 + }, + { + "count": 727636, + "lower_bound": "ODAyMDM5", + "upper_bound": "ODA0MjQ2", + "repeats": 1 + }, + { + "count": 731634, + "lower_bound": "ODA0NjE5", + "upper_bound": "ODA2OTMx", + "repeats": 1 + }, + { + "count": 735632, + "lower_bound": "ODA3MzMw", + "upper_bound": "ODA4NDc3", + "repeats": 1 + }, + { + "count": 739630, + "lower_bound": "ODA5MDU5", + "upper_bound": "ODEwOTY2", + "repeats": 1 + }, + { + "count": 743628, + "lower_bound": "ODEwOTcz", + "upper_bound": "ODEyMTEy", + "repeats": 1 + }, + { + "count": 747626, + "lower_bound": "ODEyNzcy", + "upper_bound": "ODE2ODI1", + "repeats": 1 + }, + { + "count": 751624, + "lower_bound": "ODE3MTY2", + "upper_bound": "ODIwMTU2", + "repeats": 1 + }, + { + "count": 755622, + "lower_bound": "ODIwNDUx", + "upper_bound": "ODIzMjc5", + "repeats": 1 + }, + { + "count": 759620, + "lower_bound": "ODIzNDM4", + "upper_bound": "ODI2MjEz", + "repeats": 1 + }, + { + "count": 763618, + "lower_bound": "ODI2NTMx", + "upper_bound": "ODI4MTgz", + "repeats": 1 + }, + { + "count": 767616, + "lower_bound": "ODI4MjUw", + "upper_bound": "ODI5MjQ5", + "repeats": 1 + }, + { + "count": 771614, + "lower_bound": "ODI5NDYy", + "upper_bound": "ODMxODU1", + "repeats": 1 + }, + { + "count": 775612, + "lower_bound": "ODMyMjc1", + "upper_bound": "ODM1NTI0", + "repeats": 1 + }, + { + "count": 779610, + "lower_bound": "ODM1Nzgz", + "upper_bound": "ODM3OTcx", + "repeats": 1 + }, + { + "count": 783608, + "lower_bound": "ODM4ODM4", + "upper_bound": "ODQwMjUw", + "repeats": 1 + }, + { + "count": 787606, + "lower_bound": "ODQwMzA3", + "upper_bound": "ODQyMTg0", + "repeats": 1 + }, + { + "count": 791604, + "lower_bound": "ODQyMjA3", + "upper_bound": "ODQ2NDcx", + "repeats": 1 + }, + { + "count": 795602, + "lower_bound": "ODQ3MDY3", + "upper_bound": "ODUyMDYz", + "repeats": 1 + }, + { + "count": 799600, + "lower_bound": "ODUyMDY1", + "upper_bound": "ODU0MDU2", + "repeats": 1 + }, + { + "count": 803598, + "lower_bound": "ODU0MTQ1", + "upper_bound": "ODU2NTY2", + "repeats": 1 + }, + { + "count": 807596, + "lower_bound": "ODU2NzMy", + "upper_bound": "ODU4MzUy", + "repeats": 1 + }, + { + "count": 811594, + "lower_bound": "ODU4NTY4", + "upper_bound": "ODYxOTg0", + "repeats": 1 + }, + { + "count": 815592, + "lower_bound": "ODYyMDEx", + "upper_bound": "ODY1Mjgx", + "repeats": 1 + }, + { + "count": 819590, + "lower_bound": "ODY1MzE4", + "upper_bound": "ODY4MTE5", + "repeats": 1 + }, + { + "count": 823588, + "lower_bound": "ODY4MzY2", + "upper_bound": "ODcwODY3", + "repeats": 1 + }, + { + "count": 827586, + "lower_bound": "ODcwOTYx", + "upper_bound": "ODcyMjYz", + "repeats": 1 + }, + { + "count": 831584, + "lower_bound": "ODcyNDQx", + "upper_bound": "ODc0MjE0", + "repeats": 1 + }, + { + "count": 835582, + "lower_bound": "ODc0ODA2", + "upper_bound": "ODc3MzEy", + "repeats": 1 + }, + { + "count": 839580, + "lower_bound": "ODc3NTEx", + "upper_bound": "ODgwNzQ2", + "repeats": 1 + }, + { + "count": 843578, + "lower_bound": "ODgxMjI5", + "upper_bound": "ODgyNTY1", + "repeats": 1 + }, + { + "count": 847576, + "lower_bound": "ODgzNjc4", + "upper_bound": "ODg1MTc1", + "repeats": 1 + }, + { + "count": 851574, + "lower_bound": "ODg2MzMx", + "upper_bound": "ODg3ODgx", + "repeats": 1 + }, + { + "count": 855572, + "lower_bound": "ODg3OTUz", + "upper_bound": "ODkwNTI0", + "repeats": 1 + }, + { + "count": 859570, + "lower_bound": "ODkwNjk0", + "upper_bound": "ODkzMDY2", + "repeats": 1 + }, + { + "count": 863568, + "lower_bound": "ODkzMTYy", + "upper_bound": "ODk3Mzcy", + "repeats": 1 + }, + { + "count": 867566, + "lower_bound": "ODk3NjIw", + "upper_bound": "ODk5OTY1", + "repeats": 1 + }, + { + "count": 871564, + "lower_bound": "ODk5OTk4", + "upper_bound": "OTAxOTA0", + "repeats": 1 + }, + { + "count": 875562, + "lower_bound": "OTAyMDY3", + "upper_bound": "OTA1MTU5", + "repeats": 1 + }, + { + "count": 879560, + "lower_bound": "OTA1MjY4", + "upper_bound": "OTA3Mjk2", + "repeats": 1 + }, + { + "count": 883558, + "lower_bound": "OTA4MjQ4", + "upper_bound": "OTEzODgy", + "repeats": 1 + }, + { + "count": 887556, + "lower_bound": "OTE1OTI1", + "upper_bound": "OTE4NDQ4", + "repeats": 1 + }, + { + "count": 891554, + "lower_bound": "OTE4NTU4", + "upper_bound": "OTIwMTc3", + "repeats": 1 + }, + { + "count": 895552, + "lower_bound": "OTIwNDgy", + "upper_bound": "OTIzNjY5", + "repeats": 1 + }, + { + "count": 899550, + "lower_bound": "OTIzNzkx", + "upper_bound": "OTI2NDg0", + "repeats": 1 + }, + { + "count": 903548, + "lower_bound": "OTI2NjA4", + "upper_bound": "OTI3NzQz", + "repeats": 1 + }, + { + "count": 907546, + "lower_bound": "OTI4NDY5", + "upper_bound": "OTMwMzMz", + "repeats": 1 + }, + { + "count": 911544, + "lower_bound": "OTMwNzEy", + "upper_bound": "OTMyNzE0", + "repeats": 1 + }, + { + "count": 915542, + "lower_bound": "OTMyOTI4", + "upper_bound": "OTM0MTU1", + "repeats": 1 + }, + { + "count": 919540, + "lower_bound": "OTM0Njc4", + "upper_bound": "OTM2NTM5", + "repeats": 1 + }, + { + "count": 923538, + "lower_bound": "OTM2OTMz", + "upper_bound": "OTM4NTU4", + "repeats": 1 + }, + { + "count": 927536, + "lower_bound": "OTM5NDc2", + "upper_bound": "OTQyNjY2", + "repeats": 1 + }, + { + "count": 931534, + "lower_bound": "OTQyNzkz", + "upper_bound": "OTQ1MDY5", + "repeats": 1 + }, + { + "count": 935532, + "lower_bound": "OTQ1OTMz", + "upper_bound": "OTQ4OTY5", + "repeats": 1 + }, + { + "count": 939530, + "lower_bound": "OTUwMDEz", + "upper_bound": "OTUzMTAz", + "repeats": 1 + }, + { + "count": 943528, + "lower_bound": "OTUzMTIx", + "upper_bound": "OTU1NzY3", + "repeats": 1 + }, + { + "count": 947526, + "lower_bound": "OTU2MzMy", + "upper_bound": "OTU3NTQ1", + "repeats": 1 + }, + { + "count": 951524, + "lower_bound": "OTU4MDk3", + "upper_bound": "OTY0OTA3", + "repeats": 1 + }, + { + "count": 955522, + "lower_bound": "OTY1NDQ0", + "upper_bound": "OTY3NDg4", + "repeats": 1 + }, + { + "count": 959520, + "lower_bound": "OTY3NjQ1", + "upper_bound": "OTcxNDI0", + "repeats": 1 + }, + { + "count": 963518, + "lower_bound": "OTcxNTEx", + "upper_bound": "OTczNDI5", + "repeats": 1 + }, + { + "count": 967516, + "lower_bound": "OTczNDk0", + "upper_bound": "OTc0NTk2", + "repeats": 1 + }, + { + "count": 971514, + "lower_bound": "OTc0ODAy", + "upper_bound": "OTc2ODQ5", + "repeats": 1 + }, + { + "count": 975512, + "lower_bound": "OTc3MjAz", + "upper_bound": "OTc4MjU4", + "repeats": 1 + }, + { + "count": 979510, + "lower_bound": "OTc4NDA3", + "upper_bound": "OTgxNDQw", + "repeats": 1 + }, + { + "count": 983508, + "lower_bound": "OTgxNTA3", + "upper_bound": "OTg3MTkw", + "repeats": 1 + }, + { + "count": 987506, + "lower_bound": "OTg3NjM3", + "upper_bound": "OTg5Mzc0", + "repeats": 1 + }, + { + "count": 991504, + "lower_bound": "OTg5NjUw", + "upper_bound": "OTkzMjk0", + "repeats": 1 + }, + { + "count": 995502, + "lower_bound": "OTkzMzUz", + "upper_bound": "OTk0Nzc1", + "repeats": 1 + }, + { + "count": 999500, + "lower_bound": "OTk1NDYz", + "upper_bound": "OTk4MDgw", + "repeats": 1 + }, + { + "count": 1000000, + "lower_bound": "OTk5NjU4", + "upper_bound": "OTk5NjU4", + "repeats": 1 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 495, + 474, + 474, + 471, + 509, + 474, + 509, + 527, + 490, + 509, + 475, + 503, + 506, + 489, + 472, + 504, + 513, + 469, + 508, + 480, + 476, + 529, + 488, + 486, + 513, + 477, + 507, + 477, + 514, + 533, + 456, + 512, + 460, + 474, + 473, + 489, + 472, + 517, + 459, + 516, + 489, + 491, + 497, + 492, + 472, + 508, + 498, + 496, + 438, + 472, + 485, + 452, + 484, + 493, + 477, + 471, + 534, + 500, + 466, + 499, + 476, + 458, + 493, + 481, + 497, + 473, + 479, + 490, + 469, + 519, + 471, + 483, + 482, + 489, + 506, + 544, + 504, + 492, + 457, + 506, + 479, + 477, + 491, + 464, + 496, + 509, + 492, + 471, + 440, + 479, + 476, + 505, + 522, + 498, + 442, + 471, + 492, + 499, + 516, + 494, + 477, + 493, + 500, + 478, + 496, + 482, + 508, + 500, + 495, + 490, + 456, + 501, + 541, + 469, + 507, + 497, + 477, + 450, + 515, + 472, + 501, + 500, + 514, + 480, + 459, + 476, + 470, + 491, + 493, + 520, + 535, + 508, + 494, + 549, + 501, + 489, + 528, + 511, + 488, + 449, + 455, + 452, + 482, + 474, + 514, + 472, + 445, + 476, + 505, + 484, + 466, + 489, + 510, + 495, + 489, + 479, + 467, + 521, + 480, + 500, + 501, + 495, + 457, + 457, + 487, + 487, + 502, + 477, + 472, + 498, + 473, + 489, + 486, + 480, + 531, + 480, + 500, + 510, + 505, + 499, + 477, + 473, + 506, + 475, + 494, + 496, + 447, + 490, + 500, + 474, + 513, + 512, + 470, + 480, + 480, + 539, + 476, + 506, + 503, + 481, + 526, + 493, + 449, + 500, + 467, + 497, + 461, + 497, + 502, + 468, + 475, + 497, + 501, + 510, + 469, + 477, + 439, + 497, + 469, + 494, + 492, + 482, + 495, + 470, + 438, + 512, + 485, + 525, + 460, + 541, + 500, + 476, + 502, + 510, + 476, + 482, + 520, + 435, + 447, + 487, + 487, + 461, + 485, + 461, + 488, + 531, + 519, + 476, + 444, + 490, + 510, + 506, + 492, + 465, + 507, + 512, + 517, + 492, + 481, + 490, + 488, + 487, + 453, + 490, + 536, + 494, + 515, + 504, + 504, + 510, + 511, + 489, + 478, + 461, + 522, + 503, + 495, + 508, + 469, + 454, + 522, + 537, + 482, + 506, + 493, + 501, + 513, + 450, + 493, + 476, + 499, + 491, + 468, + 504, + 524, + 488, + 469, + 478, + 457, + 473, + 481, + 469, + 479, + 491, + 488, + 483, + 509, + 523, + 517, + 497, + 520, + 491, + 453, + 520, + 508, + 486, + 488, + 489, + 543, + 469, + 498, + 471, + 472, + 495, + 507, + 473, + 497, + 487, + 493, + 462, + 475, + 474, + 490, + 518, + 492, + 462, + 488, + 497, + 474, + 502, + 550, + 490, + 452, + 492, + 465, + 488, + 467, + 490, + 513, + 448, + 510, + 490, + 459, + 477, + 487, + 500, + 501, + 505, + 491, + 506, + 443, + 482, + 466, + 482, + 459, + 461, + 523, + 502, + 466, + 469, + 504, + 494, + 483, + 440, + 497, + 499, + 483, + 500, + 484, + 500, + 527, + 454, + 493, + 445, + 474, + 486, + 507, + 490, + 479, + 493, + 459, + 474, + 492, + 482, + 497, + 483, + 516, + 499, + 462, + 522, + 482, + 498, + 486, + 464, + 504, + 496, + 498, + 493, + 481, + 462, + 508, + 484, + 485, + 479, + 487, + 489, + 493, + 471, + 495, + 541, + 495, + 472, + 482, + 461, + 471, + 501, + 480, + 460, + 503, + 500, + 511, + 492, + 491, + 450, + 520, + 462, + 510, + 499, + 460, + 515, + 519, + 455, + 495, + 470, + 464, + 509, + 479, + 456, + 466, + 523, + 478, + 461, + 496, + 500, + 469, + 506, + 512, + 490, + 523, + 485, + 452, + 528, + 486, + 458, + 468, + 476, + 510, + 500, + 499, + 485, + 478, + 526, + 526, + 493, + 478, + 491, + 503, + 467, + 506, + 478, + 501, + 453, + 520, + 499, + 469, + 479, + 479, + 497, + 483, + 492, + 476, + 511, + 469, + 510, + 508, + 457, + 482, + 475, + 504, + 462, + 508, + 455, + 518, + 516, + 485, + 505, + 478, + 504, + 476, + 486, + 484, + 495, + 510, + 476, + 491, + 469, + 450, + 472, + 497, + 470, + 491, + 504, + 469, + 479, + 481, + 521, + 470, + 524, + 508, + 487, + 466, + 427, + 544, + 489, + 491, + 471, + 505, + 497, + 469, + 478, + 490, + 461, + 462, + 446, + 487, + 492, + 493, + 484, + 521, + 545, + 457, + 490, + 470, + 471, + 522, + 494, + 483, + 468, + 487, + 490, + 472, + 470, + 471, + 484, + 488, + 500, + 496, + 465, + 483, + 477, + 499, + 465, + 446, + 495, + 472, + 468, + 461, + 513, + 493, + 467, + 481, + 488, + 481, + 507, + 503, + 494, + 500, + 487, + 492, + 516, + 484, + 433, + 524, + 507, + 522, + 506, + 482, + 464, + 503, + 460, + 502, + 511, + 490, + 517, + 520, + 523, + 520, + 478, + 486, + 511, + 508, + 487, + 495, + 511, + 466, + 478, + 504, + 485, + 480, + 483, + 482, + 469, + 488, + 513, + 517, + 501, + 452, + 482, + 466, + 471, + 460, + 476, + 478, + 514, + 487, + 473, + 507, + 520, + 487, + 484, + 484, + 487, + 468, + 465, + 439, + 469, + 485, + 494, + 488, + 508, + 477, + 495, + 465, + 525, + 502, + 501, + 475, + 487, + 456, + 512, + 515, + 476, + 444, + 470, + 526, + 521, + 550, + 517, + 523, + 456, + 465, + 486, + 477, + 475, + 479, + 481, + 513, + 550, + 505, + 488, + 467, + 518, + 493, + 485, + 452, + 506, + 483, + 495, + 497, + 500, + 465, + 502, + 500, + 468, + 480, + 491, + 487, + 461, + 490, + 452, + 467, + 462, + 472, + 510, + 477, + 494, + 481, + 500, + 476, + 494, + 485, + 496, + 520, + 474, + 455, + 484, + 517, + 492, + 506, + 498, + 495, + 518, + 466, + 467, + 487, + 511, + 506, + 523, + 481, + 453, + 475, + 472, + 501, + 511, + 480, + 509, + 475, + 466, + 479, + 464, + 492, + 485, + 455, + 490, + 478, + 482, + 461, + 481, + 501, + 506, + 479, + 498, + 485, + 451, + 510, + 475, + 482, + 473, + 459, + 443, + 496, + 449, + 447, + 459, + 451, + 527, + 469, + 509, + 464, + 450, + 476, + 496, + 494, + 493, + 479, + 532, + 505, + 487, + 425, + 462, + 484, + 475, + 478, + 510, + 486, + 509, + 479, + 498, + 522, + 552, + 449, + 507, + 531, + 514, + 454, + 476, + 496, + 482, + 494, + 479, + 519, + 500, + 495, + 536, + 447, + 487, + 533, + 524, + 495, + 466, + 475, + 547, + 525, + 485, + 499, + 477, + 457, + 515, + 447, + 489, + 435, + 480, + 485, + 492, + 483, + 496, + 458, + 447, + 475, + 491, + 487, + 481, + 489, + 482, + 487, + 489, + 485, + 485, + 458, + 480, + 474, + 496, + 523, + 491, + 457, + 488, + 503, + 490, + 525, + 451, + 502, + 481, + 499, + 478, + 491, + 510, + 487, + 500, + 493, + 458, + 485, + 504, + 500, + 455, + 519, + 478, + 477, + 486, + 481, + 488, + 499, + 492, + 510, + 489, + 487, + 493, + 452, + 505, + 464, + 489, + 476, + 463, + 483, + 471, + 468, + 475, + 447, + 468, + 448, + 502, + 481, + 489, + 512, + 507, + 451, + 475, + 502, + 484, + 496, + 517, + 482, + 499, + 453, + 515, + 481, + 474, + 518, + 493, + 462, + 481, + 507, + 507, + 476, + 474, + 484, + 487, + 484, + 537, + 508, + 552, + 486, + 476, + 500, + 481, + 458, + 508, + 510, + 474, + 469, + 518, + 449, + 462, + 511, + 466, + 459, + 507, + 474, + 448, + 467, + 484, + 519, + 478, + 481, + 501, + 507, + 485, + 483, + 489, + 477, + 517, + 504, + 511, + 468, + 506, + 445, + 529, + 507, + 518, + 467, + 494, + 493, + 464, + 499, + 488, + 484, + 490, + 515, + 525, + 492, + 463, + 494, + 454, + 528, + 455, + 479, + 470, + 474, + 491, + 509, + 479, + 477, + 450, + 485, + 492, + 494, + 468, + 454, + 513, + 488, + 463, + 425, + 486, + 498, + 517, + 457, + 521, + 459, + 508, + 526, + 490, + 500, + 457, + 450, + 484, + 504, + 511, + 512, + 447, + 542, + 430, + 496, + 482, + 485, + 501, + 487, + 486, + 477, + 471, + 541, + 456, + 484, + 514, + 503, + 488, + 480, + 489, + 484, + 470, + 468, + 467, + 491, + 466, + 492, + 516, + 479, + 510, + 522, + 485, + 473, + 488, + 477, + 482, + 448, + 475, + 528, + 476, + 459, + 529, + 492, + 501, + 479, + 507, + 483, + 435, + 486, + 537, + 455, + 496, + 489, + 466, + 508, + 494, + 507, + 502, + 483, + 501, + 498, + 552, + 463, + 519, + 460, + 496, + 456, + 475, + 519, + 491, + 506, + 502, + 491, + 498, + 435, + 500, + 514, + 484, + 490, + 513, + 492, + 461, + 505, + 488, + 455, + 465, + 512, + 495, + 438, + 481, + 494, + 501, + 472, + 461, + 527, + 521, + 505, + 479, + 512, + 516, + 485, + 506, + 493, + 460, + 447, + 469, + 502, + 472, + 470, + 499, + 483, + 477, + 465, + 502, + 509, + 492, + 468, + 504, + 457, + 519, + 477, + 503, + 485, + 479, + 508, + 481, + 517, + 477, + 480, + 474, + 473, + 477, + 463, + 471, + 504, + 495, + 481, + 490, + 515, + 472, + 478, + 446, + 483, + 507, + 452, + 461, + 504, + 491, + 514, + 479, + 516, + 479, + 476, + 491, + 491, + 494, + 513, + 505, + 491, + 473, + 518, + 512, + 497, + 515, + 442, + 497, + 513, + 453, + 482, + 471, + 549, + 459, + 507, + 516, + 460, + 496, + 503, + 495, + 474, + 493, + 464, + 553, + 486, + 497, + 468, + 473, + 508, + 551, + 547, + 438, + 467, + 483, + 488, + 463, + 479, + 500, + 517, + 497, + 498, + 498, + 491, + 456, + 472, + 525, + 533, + 479, + 491, + 480, + 450, + 505, + 463, + 487, + 451, + 495, + 512, + 466, + 498, + 498, + 510, + 523, + 496, + 478, + 468, + 513, + 508, + 512, + 465, + 509, + 500, + 500, + 488, + 504, + 459, + 495, + 463, + 515, + 480, + 510, + 495, + 468, + 487, + 514, + 487, + 479, + 447, + 492, + 490, + 508, + 457, + 476, + 503, + 485, + 486, + 535, + 462, + 510, + 474, + 475, + 484, + 487, + 515, + 485, + 493, + 502, + 456, + 486, + 543, + 509, + 500, + 461, + 504, + 503, + 447, + 488, + 445, + 458, + 458, + 508, + 466, + 477, + 479, + 503, + 453, + 511, + 535, + 532, + 497, + 490, + 495, + 496, + 472, + 451, + 502, + 482, + 479, + 468, + 464, + 484, + 537, + 439, + 474, + 482, + 502, + 472, + 492, + 517, + 488, + 481, + 506, + 485, + 486, + 459, + 468, + 478, + 446, + 464, + 506, + 434, + 558, + 491, + 514, + 474, + 482, + 472, + 471, + 484, + 523, + 473, + 467, + 518, + 516, + 443, + 457, + 513, + 451, + 483, + 485, + 501, + 491, + 490, + 480, + 457, + 493, + 493, + 518, + 521, + 485, + 481, + 504, + 495, + 491, + 483, + 514, + 500, + 460, + 469, + 514, + 484, + 480, + 515, + 498, + 494, + 496, + 506, + 487, + 480, + 483, + 503, + 496, + 492, + 432, + 442, + 482, + 514, + 492, + 485, + 488, + 467, + 480, + 458, + 482, + 529, + 528, + 456, + 528, + 485, + 517, + 457, + 501, + 490, + 471, + 455, + 513, + 460, + 502, + 505, + 498, + 476, + 508, + 484, + 500, + 487, + 499, + 478, + 473, + 483, + 500, + 496, + 485, + 506, + 450, + 487, + 537, + 470, + 461, + 486, + 492, + 511, + 473, + 482, + 511, + 484, + 494, + 492, + 485, + 498, + 511, + 477, + 488, + 487, + 474, + 500, + 454, + 515, + 477, + 507, + 505, + 485, + 527, + 456, + 493, + 484, + 509, + 526, + 473, + 458, + 493, + 524, + 511, + 497, + 481, + 504, + 484, + 486, + 489, + 477, + 515, + 489, + 520, + 506, + 475, + 517, + 465, + 490, + 504, + 480, + 461, + 504, + 524, + 477, + 465, + 507, + 471, + 486, + 503, + 453, + 481, + 493, + 490, + 482, + 495, + 508, + 482, + 431, + 487, + 503, + 479, + 495, + 493, + 501, + 515, + 516, + 469, + 460, + 448, + 530, + 468, + 510, + 472, + 491, + 464, + 501, + 502, + 483, + 508, + 499, + 494, + 456, + 425, + 489, + 548, + 484, + 489, + 505, + 481, + 497, + 495, + 465, + 490, + 475, + 494, + 505, + 530, + 479, + 506, + 489, + 529, + 462, + 502, + 478, + 487, + 464, + 471, + 477, + 496, + 479, + 462, + 500, + 507, + 481, + 489, + 509, + 519, + 504, + 511, + 470, + 428, + 482, + 526, + 502, + 465, + 448, + 460, + 449, + 509, + 480, + 491, + 493, + 485, + 461, + 474, + 432, + 488, + 508, + 500, + 451, + 468, + 473, + 501, + 495, + 454, + 510, + 478, + 506, + 511, + 517, + 463, + 477, + 466, + 517, + 478, + 464, + 477, + 493, + 526, + 489, + 471, + 511, + 488, + 499, + 512, + 484, + 494, + 544, + 482, + 487, + 492, + 506, + 520, + 484, + 493, + 485, + 504, + 512, + 469, + 478, + 480, + 504, + 511, + 487, + 509, + 480, + 502, + 464, + 468, + 486, + 484, + 493, + 532, + 441, + 520, + 499, + 523, + 467, + 462, + 488, + 482, + 470, + 511, + 532, + 490, + 515, + 490, + 487, + 479, + 485, + 505, + 504, + 530, + 434, + 472, + 488, + 485, + 506, + 456, + 500, + 533, + 467, + 513, + 455, + 442, + 470, + 521, + 479, + 492, + 477, + 490, + 501, + 478, + 503, + 469, + 476, + 440, + 482, + 484, + 471, + 511, + 492, + 513, + 524, + 493, + 505, + 466, + 515, + 495, + 466, + 466, + 490, + 471, + 481, + 468, + 492, + 519, + 457, + 464, + 507, + 528, + 468, + 465, + 517, + 475, + 488, + 481, + 490, + 472, + 430, + 477, + 516, + 498, + 508, + 489, + 487, + 522, + 478, + 473, + 538, + 533, + 497, + 475, + 482, + 521, + 504, + 503, + 494, + 503, + 467, + 467, + 475, + 462, + 495, + 526, + 495, + 478, + 491, + 459, + 493, + 491, + 534, + 531, + 478, + 502, + 490, + 473, + 477, + 475, + 476, + 494, + 505, + 487, + 462, + 494, + 468, + 502, + 433, + 523, + 450, + 495, + 455, + 479, + 506, + 488, + 500, + 499, + 498, + 463, + 531, + 488, + 477, + 455, + 480, + 480, + 514, + 507, + 483, + 495, + 521, + 491, + 497, + 510, + 524, + 463, + 468, + 501, + 450, + 492, + 456, + 498, + 471, + 500, + 491, + 497, + 501, + 479, + 502, + 526, + 484, + 461, + 487, + 533, + 464, + 468, + 494, + 487, + 465, + 471, + 506, + 510, + 451, + 501, + 478, + 458, + 496, + 502, + 492, + 512, + 482, + 469, + 491, + 519, + 519, + 491, + 518, + 507, + 463, + 473, + 487, + 507, + 442, + 484, + 446, + 450, + 454, + 498, + 482, + 487, + 492, + 484, + 548, + 494, + 470, + 458, + 503, + 481, + 492, + 488, + 531, + 487, + 450, + 468, + 440, + 476, + 460, + 474, + 497, + 526, + 518, + 489, + 501, + 524, + 503, + 464, + 464, + 537, + 489, + 469, + 500, + 525, + 469, + 479, + 491, + 450, + 523, + 444, + 487, + 458, + 472, + 514, + 473, + 493, + 480, + 486, + 517, + 510, + 458, + 468, + 480, + 467, + 513, + 530, + 505, + 461, + 436, + 491, + 472, + 479, + 531, + 493, + 468, + 464, + 540, + 493, + 502, + 496, + 490, + 490, + 462, + 513, + 506, + 504, + 497, + 508, + 503, + 477, + 500, + 512, + 490, + 480, + 496, + 467, + 517, + 473, + 476, + 486, + 505, + 498, + 532, + 513, + 452, + 498, + 448, + 508, + 526, + 488, + 488, + 488, + 479, + 542, + 493, + 507, + 496, + 491, + 493, + 482, + 441, + 462, + 503, + 512, + 475, + 500, + 508, + 496, + 506, + 470, + 477, + 511, + 480, + 452, + 453, + 489, + 473, + 507, + 488, + 473, + 494, + 492, + 489, + 491, + 457, + 481, + 493, + 494, + 451, + 503, + 489, + 475, + 477, + 473, + 494, + 499, + 499, + 475, + 478, + 488, + 489, + 475, + 451, + 512, + 525, + 514, + 504, + 480, + 482, + 486, + 481, + 480, + 497, + 465, + 503, + 473, + 465, + 487, + 468, + 481, + 499, + 450, + 496, + 521, + 447, + 462, + 485, + 519, + 498, + 491, + 462, + 489, + 492, + 485, + 473, + 519, + 503, + 540, + 539, + 482, + 482, + 531, + 532, + 461, + 473, + 542, + 503, + 532, + 420, + 490, + 453, + 491, + 471, + 477, + 470, + 490, + 485, + 499, + 482, + 500, + 517, + 489, + 500, + 511, + 452, + 453, + 486, + 452, + 502 + ] + }, + { + "counters": [ + 492, + 472, + 474, + 474, + 468, + 472, + 473, + 512, + 480, + 500, + 481, + 508, + 468, + 466, + 461, + 493, + 492, + 523, + 494, + 459, + 479, + 491, + 473, + 484, + 489, + 488, + 479, + 499, + 497, + 444, + 560, + 452, + 474, + 519, + 463, + 517, + 499, + 484, + 471, + 490, + 496, + 476, + 454, + 478, + 459, + 484, + 473, + 467, + 494, + 469, + 497, + 477, + 558, + 494, + 504, + 478, + 518, + 498, + 483, + 507, + 534, + 497, + 473, + 479, + 485, + 477, + 477, + 487, + 477, + 442, + 480, + 499, + 498, + 500, + 503, + 486, + 480, + 490, + 466, + 482, + 468, + 455, + 505, + 483, + 466, + 468, + 497, + 485, + 513, + 466, + 524, + 491, + 482, + 543, + 439, + 521, + 517, + 441, + 451, + 492, + 524, + 479, + 480, + 504, + 486, + 473, + 481, + 532, + 449, + 515, + 492, + 485, + 510, + 508, + 471, + 484, + 466, + 549, + 499, + 491, + 498, + 511, + 519, + 496, + 512, + 502, + 518, + 469, + 466, + 495, + 466, + 511, + 462, + 505, + 482, + 511, + 493, + 464, + 435, + 509, + 503, + 508, + 473, + 464, + 446, + 490, + 479, + 471, + 450, + 490, + 504, + 493, + 494, + 493, + 465, + 446, + 473, + 431, + 497, + 471, + 476, + 498, + 463, + 510, + 478, + 536, + 488, + 512, + 473, + 486, + 510, + 529, + 485, + 501, + 522, + 461, + 476, + 518, + 491, + 496, + 492, + 474, + 441, + 481, + 493, + 514, + 483, + 510, + 499, + 421, + 484, + 507, + 506, + 454, + 466, + 460, + 475, + 503, + 461, + 486, + 494, + 494, + 503, + 460, + 496, + 465, + 467, + 517, + 498, + 483, + 479, + 469, + 492, + 507, + 491, + 487, + 473, + 506, + 510, + 489, + 489, + 447, + 486, + 481, + 497, + 473, + 497, + 519, + 479, + 514, + 499, + 475, + 470, + 509, + 474, + 458, + 473, + 474, + 479, + 510, + 500, + 466, + 461, + 474, + 513, + 496, + 477, + 501, + 499, + 483, + 493, + 468, + 519, + 467, + 432, + 488, + 476, + 507, + 458, + 515, + 492, + 455, + 481, + 508, + 487, + 524, + 488, + 441, + 447, + 422, + 481, + 501, + 526, + 476, + 471, + 512, + 499, + 451, + 515, + 500, + 523, + 487, + 492, + 462, + 485, + 508, + 479, + 477, + 487, + 477, + 484, + 449, + 477, + 498, + 453, + 495, + 456, + 434, + 463, + 480, + 494, + 501, + 495, + 487, + 522, + 468, + 469, + 515, + 515, + 472, + 523, + 488, + 473, + 481, + 471, + 488, + 470, + 442, + 497, + 516, + 496, + 488, + 498, + 542, + 469, + 431, + 502, + 431, + 484, + 499, + 530, + 467, + 477, + 482, + 473, + 505, + 473, + 497, + 467, + 482, + 495, + 486, + 522, + 456, + 505, + 482, + 520, + 479, + 527, + 510, + 499, + 477, + 487, + 422, + 478, + 495, + 466, + 474, + 496, + 490, + 442, + 483, + 489, + 472, + 483, + 511, + 505, + 469, + 497, + 479, + 507, + 516, + 461, + 491, + 504, + 481, + 500, + 483, + 517, + 478, + 472, + 529, + 514, + 491, + 533, + 485, + 475, + 493, + 492, + 472, + 490, + 520, + 479, + 468, + 506, + 502, + 464, + 464, + 476, + 461, + 512, + 518, + 497, + 507, + 495, + 477, + 489, + 457, + 493, + 455, + 478, + 503, + 428, + 519, + 470, + 481, + 472, + 492, + 478, + 483, + 466, + 479, + 481, + 485, + 513, + 486, + 454, + 497, + 487, + 476, + 516, + 501, + 458, + 459, + 471, + 479, + 546, + 499, + 464, + 452, + 437, + 496, + 494, + 507, + 481, + 476, + 464, + 497, + 493, + 512, + 503, + 472, + 491, + 496, + 495, + 492, + 502, + 521, + 482, + 484, + 527, + 476, + 498, + 454, + 453, + 526, + 519, + 484, + 482, + 522, + 511, + 519, + 471, + 493, + 486, + 507, + 509, + 504, + 513, + 461, + 518, + 524, + 475, + 469, + 454, + 492, + 536, + 464, + 531, + 456, + 463, + 478, + 468, + 487, + 483, + 534, + 489, + 471, + 470, + 517, + 473, + 470, + 476, + 524, + 490, + 506, + 525, + 499, + 493, + 481, + 466, + 479, + 492, + 482, + 498, + 502, + 477, + 488, + 482, + 505, + 488, + 473, + 474, + 465, + 457, + 513, + 502, + 481, + 519, + 521, + 507, + 524, + 490, + 506, + 500, + 507, + 461, + 494, + 472, + 510, + 513, + 459, + 480, + 508, + 481, + 458, + 512, + 478, + 488, + 501, + 475, + 473, + 482, + 467, + 519, + 476, + 465, + 511, + 510, + 517, + 455, + 461, + 462, + 488, + 500, + 479, + 450, + 540, + 471, + 485, + 507, + 466, + 465, + 454, + 483, + 448, + 493, + 492, + 478, + 472, + 485, + 495, + 492, + 484, + 482, + 473, + 440, + 498, + 483, + 465, + 479, + 454, + 467, + 485, + 506, + 450, + 479, + 482, + 533, + 479, + 483, + 475, + 459, + 498, + 481, + 481, + 435, + 488, + 486, + 469, + 499, + 488, + 475, + 497, + 479, + 490, + 469, + 508, + 499, + 514, + 517, + 498, + 521, + 511, + 473, + 529, + 505, + 495, + 485, + 497, + 501, + 498, + 485, + 514, + 492, + 531, + 460, + 502, + 450, + 488, + 511, + 499, + 487, + 491, + 498, + 480, + 478, + 515, + 479, + 472, + 489, + 447, + 495, + 505, + 459, + 466, + 489, + 465, + 475, + 494, + 500, + 510, + 490, + 517, + 497, + 494, + 478, + 501, + 469, + 497, + 507, + 465, + 506, + 491, + 466, + 493, + 487, + 520, + 454, + 552, + 472, + 451, + 490, + 507, + 498, + 510, + 524, + 485, + 503, + 462, + 514, + 432, + 505, + 474, + 481, + 454, + 497, + 477, + 514, + 502, + 510, + 523, + 471, + 495, + 465, + 488, + 498, + 499, + 506, + 522, + 454, + 474, + 465, + 501, + 453, + 495, + 474, + 458, + 506, + 536, + 494, + 455, + 474, + 463, + 478, + 465, + 503, + 474, + 461, + 499, + 521, + 486, + 478, + 501, + 516, + 470, + 439, + 474, + 516, + 507, + 541, + 509, + 492, + 461, + 507, + 496, + 499, + 496, + 468, + 472, + 461, + 477, + 484, + 510, + 504, + 490, + 466, + 485, + 483, + 496, + 484, + 512, + 483, + 521, + 500, + 477, + 479, + 500, + 476, + 543, + 478, + 505, + 483, + 471, + 495, + 484, + 484, + 475, + 512, + 476, + 478, + 469, + 497, + 475, + 474, + 485, + 475, + 480, + 478, + 475, + 498, + 467, + 518, + 502, + 493, + 488, + 495, + 491, + 526, + 477, + 524, + 491, + 438, + 485, + 463, + 492, + 484, + 509, + 494, + 509, + 466, + 493, + 500, + 492, + 486, + 457, + 475, + 490, + 542, + 486, + 488, + 489, + 498, + 506, + 521, + 507, + 516, + 494, + 478, + 518, + 516, + 489, + 517, + 497, + 445, + 485, + 484, + 455, + 509, + 478, + 510, + 486, + 507, + 491, + 495, + 484, + 498, + 491, + 534, + 429, + 489, + 521, + 488, + 475, + 489, + 464, + 482, + 531, + 473, + 475, + 483, + 462, + 492, + 505, + 484, + 493, + 483, + 453, + 498, + 451, + 490, + 530, + 516, + 466, + 485, + 486, + 433, + 481, + 471, + 526, + 520, + 447, + 519, + 514, + 449, + 489, + 552, + 508, + 476, + 506, + 477, + 482, + 459, + 486, + 463, + 496, + 457, + 456, + 446, + 466, + 459, + 519, + 465, + 465, + 481, + 458, + 494, + 492, + 496, + 500, + 485, + 481, + 507, + 478, + 544, + 477, + 479, + 479, + 501, + 469, + 456, + 493, + 495, + 465, + 517, + 428, + 465, + 514, + 494, + 470, + 505, + 488, + 484, + 483, + 498, + 493, + 493, + 519, + 492, + 494, + 494, + 484, + 470, + 484, + 490, + 510, + 456, + 473, + 502, + 482, + 487, + 470, + 458, + 474, + 499, + 472, + 479, + 514, + 429, + 475, + 493, + 507, + 501, + 521, + 520, + 490, + 513, + 498, + 495, + 507, + 494, + 487, + 498, + 499, + 535, + 531, + 524, + 446, + 486, + 450, + 455, + 468, + 484, + 500, + 509, + 499, + 502, + 489, + 526, + 501, + 515, + 476, + 490, + 510, + 492, + 440, + 468, + 487, + 430, + 514, + 475, + 460, + 475, + 504, + 482, + 451, + 504, + 512, + 464, + 486, + 502, + 513, + 480, + 508, + 467, + 483, + 446, + 511, + 480, + 492, + 496, + 528, + 505, + 485, + 469, + 436, + 529, + 468, + 456, + 493, + 479, + 499, + 493, + 500, + 487, + 528, + 475, + 499, + 480, + 505, + 482, + 512, + 519, + 493, + 499, + 478, + 495, + 479, + 498, + 520, + 480, + 485, + 506, + 465, + 518, + 479, + 511, + 468, + 505, + 472, + 492, + 500, + 523, + 492, + 494, + 470, + 535, + 471, + 455, + 463, + 505, + 477, + 499, + 484, + 508, + 490, + 493, + 484, + 492, + 523, + 510, + 471, + 487, + 511, + 467, + 478, + 484, + 504, + 488, + 496, + 471, + 443, + 487, + 499, + 515, + 504, + 503, + 514, + 516, + 472, + 491, + 461, + 465, + 499, + 464, + 487, + 479, + 475, + 511, + 482, + 468, + 467, + 499, + 524, + 494, + 516, + 470, + 483, + 488, + 485, + 453, + 474, + 475, + 516, + 466, + 486, + 515, + 464, + 477, + 489, + 471, + 492, + 500, + 462, + 495, + 460, + 482, + 488, + 476, + 478, + 488, + 496, + 516, + 485, + 503, + 498, + 507, + 471, + 506, + 495, + 503, + 506, + 479, + 464, + 478, + 507, + 446, + 506, + 491, + 478, + 463, + 460, + 478, + 495, + 504, + 521, + 497, + 491, + 495, + 491, + 484, + 474, + 500, + 497, + 509, + 492, + 470, + 504, + 509, + 499, + 555, + 485, + 462, + 465, + 469, + 523, + 485, + 471, + 519, + 493, + 480, + 456, + 492, + 490, + 468, + 496, + 520, + 479, + 500, + 482, + 516, + 475, + 505, + 471, + 488, + 459, + 483, + 500, + 518, + 496, + 492, + 488, + 479, + 526, + 436, + 497, + 479, + 474, + 488, + 526, + 513, + 497, + 508, + 484, + 522, + 495, + 465, + 499, + 497, + 482, + 487, + 496, + 497, + 500, + 532, + 500, + 506, + 484, + 448, + 462, + 446, + 494, + 475, + 477, + 515, + 519, + 494, + 505, + 489, + 560, + 481, + 515, + 489, + 483, + 558, + 446, + 480, + 445, + 489, + 512, + 453, + 523, + 515, + 469, + 434, + 480, + 511, + 479, + 472, + 481, + 473, + 466, + 454, + 506, + 456, + 492, + 468, + 518, + 534, + 530, + 520, + 525, + 495, + 463, + 466, + 492, + 482, + 516, + 506, + 445, + 478, + 502, + 487, + 478, + 495, + 501, + 503, + 480, + 511, + 463, + 490, + 485, + 479, + 496, + 518, + 475, + 492, + 464, + 460, + 487, + 485, + 491, + 509, + 449, + 492, + 501, + 485, + 526, + 523, + 451, + 495, + 460, + 480, + 513, + 520, + 496, + 538, + 499, + 484, + 481, + 480, + 514, + 467, + 472, + 476, + 494, + 495, + 467, + 485, + 511, + 476, + 495, + 476, + 506, + 496, + 496, + 525, + 480, + 522, + 523, + 489, + 506, + 467, + 507, + 489, + 479, + 523, + 479, + 494, + 437, + 470, + 499, + 508, + 484, + 495, + 478, + 462, + 482, + 539, + 516, + 492, + 499, + 508, + 493, + 470, + 484, + 496, + 492, + 498, + 451, + 496, + 497, + 479, + 456, + 458, + 466, + 468, + 535, + 498, + 527, + 509, + 505, + 522, + 506, + 465, + 486, + 425, + 530, + 502, + 514, + 483, + 524, + 464, + 460, + 512, + 494, + 500, + 493, + 459, + 487, + 502, + 491, + 498, + 485, + 496, + 516, + 467, + 485, + 519, + 481, + 501, + 487, + 483, + 476, + 489, + 511, + 463, + 471, + 486, + 508, + 536, + 488, + 449, + 481, + 503, + 480, + 472, + 489, + 459, + 543, + 465, + 483, + 467, + 460, + 508, + 492, + 441, + 534, + 497, + 459, + 506, + 483, + 479, + 510, + 484, + 468, + 488, + 475, + 518, + 491, + 480, + 533, + 513, + 460, + 560, + 484, + 481, + 476, + 497, + 503, + 484, + 492, + 455, + 485, + 473, + 502, + 528, + 485, + 524, + 492, + 469, + 500, + 447, + 476, + 501, + 494, + 498, + 481, + 505, + 499, + 502, + 466, + 490, + 489, + 500, + 464, + 504, + 495, + 532, + 440, + 483, + 506, + 472, + 483, + 496, + 474, + 481, + 507, + 489, + 480, + 502, + 486, + 510, + 448, + 524, + 493, + 472, + 512, + 492, + 490, + 458, + 464, + 460, + 469, + 505, + 484, + 479, + 511, + 503, + 480, + 490, + 473, + 517, + 470, + 499, + 492, + 512, + 455, + 487, + 483, + 495, + 505, + 500, + 463, + 492, + 515, + 494, + 507, + 513, + 520, + 466, + 488, + 473, + 466, + 467, + 445, + 438, + 492, + 465, + 492, + 540, + 451, + 521, + 480, + 475, + 445, + 471, + 466, + 472, + 482, + 512, + 471, + 490, + 487, + 501, + 473, + 445, + 506, + 470, + 500, + 471, + 457, + 531, + 508, + 477, + 498, + 514, + 477, + 494, + 480, + 484, + 525, + 477, + 497, + 498, + 520, + 519, + 485, + 481, + 528, + 484, + 498, + 523, + 504, + 478, + 487, + 489, + 482, + 481, + 486, + 488, + 499, + 461, + 482, + 490, + 473, + 496, + 467, + 461, + 459, + 496, + 490, + 484, + 486, + 503, + 480, + 473, + 449, + 462, + 471, + 518, + 494, + 486, + 482, + 523, + 466, + 466, + 475, + 491, + 489, + 458, + 472, + 461, + 495, + 501, + 507, + 441, + 460, + 461, + 474, + 473, + 465, + 483, + 494, + 491, + 494, + 487, + 497, + 523, + 464, + 508, + 505, + 465, + 475, + 485, + 457, + 467, + 470, + 506, + 482, + 469, + 512, + 463, + 522, + 455, + 454, + 476, + 504, + 502, + 505, + 519, + 509, + 488, + 498, + 522, + 493, + 462, + 461, + 489, + 468, + 506, + 506, + 461, + 460, + 466, + 494, + 472, + 481, + 520, + 479, + 474, + 470, + 503, + 526, + 505, + 482, + 494, + 518, + 504, + 478, + 478, + 515, + 504, + 494, + 462, + 501, + 489, + 508, + 494, + 517, + 478, + 480, + 456, + 500, + 482, + 490, + 449, + 490, + 517, + 490, + 475, + 467, + 468, + 509, + 471, + 459, + 491, + 503, + 511, + 494, + 468, + 482, + 492, + 498, + 464, + 503, + 469, + 500, + 531, + 511, + 500, + 489, + 504, + 492, + 485, + 501, + 501, + 508, + 474, + 474, + 451, + 487, + 505, + 497, + 493, + 485, + 468, + 479, + 490, + 520, + 466, + 507, + 451, + 479, + 469, + 565, + 488, + 473, + 493, + 518, + 488, + 534, + 471, + 452, + 524, + 470, + 517, + 494, + 496, + 505, + 486, + 493, + 489, + 497, + 495, + 503, + 513, + 516, + 482, + 513, + 455, + 470, + 466, + 527, + 495, + 490, + 476, + 492, + 454, + 500, + 481, + 493, + 492, + 512, + 451, + 481, + 528, + 510, + 479, + 499, + 499, + 494, + 478, + 512, + 476, + 483, + 504, + 531, + 511, + 453, + 460, + 496, + 467, + 463, + 467, + 531, + 485, + 455, + 458, + 504, + 477, + 492, + 481, + 501, + 499, + 462, + 493, + 480, + 504, + 517, + 476, + 487, + 484, + 494, + 512, + 521, + 481, + 453, + 470, + 461, + 519, + 479, + 495, + 464, + 466, + 468, + 507, + 503, + 493, + 474, + 482, + 508, + 473, + 484, + 479, + 487, + 476, + 485, + 460, + 449, + 507, + 506, + 478, + 471, + 481, + 477, + 479, + 507, + 472, + 484, + 464, + 504, + 512, + 510, + 497, + 482, + 484, + 511, + 480, + 533, + 512, + 523, + 508, + 502, + 493, + 473, + 514, + 531, + 505, + 491, + 483, + 435, + 512, + 488, + 495, + 501, + 479, + 459, + 495, + 487, + 476, + 478, + 455, + 503, + 482, + 508, + 469, + 532, + 500, + 502, + 468, + 495, + 489, + 532, + 496, + 521, + 471, + 494, + 464, + 510, + 500, + 476, + 528, + 498, + 496, + 504, + 487, + 481, + 482, + 531, + 483, + 509, + 499, + 540, + 514, + 518, + 510, + 465, + 467, + 475, + 502, + 498, + 473, + 488, + 514, + 491, + 491, + 435, + 469, + 470, + 471, + 460, + 483, + 477, + 530, + 496, + 468, + 448, + 479, + 511, + 507, + 453, + 515, + 467, + 476, + 513, + 481, + 469, + 493, + 467, + 454, + 487, + 468, + 492, + 468, + 471, + 469, + 472, + 458, + 450, + 456, + 485, + 542, + 508, + 483, + 501, + 485, + 512, + 481, + 512, + 509, + 521, + 489, + 495, + 478, + 529, + 478, + 504, + 473, + 465, + 529, + 482, + 500, + 483, + 465, + 470, + 478, + 507, + 507, + 473, + 504, + 485, + 461, + 517, + 483, + 489, + 526, + 487, + 477, + 485, + 501, + 444, + 530, + 504, + 470, + 463, + 489, + 497 + ] + }, + { + "counters": [ + 486, + 470, + 490, + 485, + 472, + 508, + 468, + 498, + 490, + 487, + 516, + 485, + 486, + 519, + 497, + 503, + 474, + 490, + 491, + 477, + 483, + 473, + 474, + 478, + 483, + 459, + 503, + 478, + 524, + 464, + 472, + 486, + 492, + 449, + 455, + 486, + 458, + 477, + 491, + 482, + 493, + 505, + 498, + 506, + 516, + 450, + 499, + 455, + 469, + 466, + 542, + 548, + 519, + 482, + 487, + 479, + 491, + 477, + 505, + 465, + 478, + 460, + 452, + 488, + 470, + 481, + 522, + 519, + 471, + 470, + 528, + 499, + 518, + 511, + 493, + 521, + 489, + 477, + 478, + 519, + 502, + 511, + 490, + 466, + 494, + 446, + 503, + 468, + 468, + 467, + 489, + 504, + 474, + 508, + 500, + 449, + 486, + 490, + 530, + 467, + 481, + 485, + 511, + 488, + 521, + 470, + 508, + 525, + 510, + 504, + 511, + 502, + 513, + 461, + 501, + 485, + 476, + 504, + 489, + 486, + 488, + 497, + 541, + 482, + 487, + 494, + 482, + 499, + 506, + 452, + 484, + 495, + 470, + 453, + 482, + 489, + 494, + 485, + 475, + 491, + 481, + 498, + 523, + 493, + 483, + 505, + 493, + 503, + 475, + 491, + 517, + 502, + 473, + 505, + 456, + 509, + 486, + 484, + 489, + 496, + 485, + 500, + 521, + 470, + 540, + 482, + 470, + 471, + 504, + 445, + 487, + 470, + 488, + 472, + 470, + 500, + 511, + 484, + 458, + 489, + 503, + 484, + 543, + 502, + 481, + 486, + 494, + 514, + 473, + 491, + 497, + 502, + 482, + 482, + 472, + 512, + 503, + 494, + 531, + 517, + 470, + 534, + 491, + 476, + 482, + 503, + 478, + 469, + 495, + 508, + 487, + 490, + 494, + 476, + 493, + 490, + 464, + 539, + 471, + 498, + 489, + 435, + 459, + 464, + 453, + 498, + 523, + 494, + 518, + 512, + 447, + 451, + 492, + 516, + 496, + 484, + 478, + 512, + 484, + 469, + 518, + 505, + 482, + 493, + 434, + 465, + 503, + 499, + 454, + 502, + 489, + 485, + 521, + 507, + 499, + 483, + 475, + 507, + 504, + 529, + 502, + 500, + 463, + 514, + 517, + 495, + 448, + 517, + 496, + 488, + 532, + 464, + 449, + 509, + 454, + 501, + 500, + 500, + 488, + 503, + 451, + 506, + 481, + 445, + 438, + 485, + 500, + 474, + 499, + 487, + 504, + 474, + 512, + 507, + 470, + 495, + 477, + 465, + 474, + 514, + 492, + 508, + 465, + 477, + 478, + 426, + 505, + 485, + 478, + 501, + 477, + 486, + 446, + 461, + 499, + 483, + 501, + 484, + 483, + 502, + 502, + 464, + 500, + 464, + 479, + 459, + 560, + 467, + 481, + 505, + 496, + 498, + 413, + 512, + 451, + 508, + 443, + 485, + 442, + 480, + 552, + 476, + 487, + 546, + 495, + 518, + 450, + 502, + 502, + 492, + 519, + 497, + 485, + 464, + 445, + 496, + 454, + 501, + 486, + 510, + 501, + 534, + 495, + 466, + 466, + 492, + 482, + 489, + 517, + 437, + 497, + 493, + 423, + 481, + 468, + 481, + 506, + 439, + 439, + 450, + 493, + 489, + 524, + 476, + 512, + 472, + 475, + 504, + 521, + 481, + 500, + 522, + 514, + 486, + 495, + 533, + 464, + 513, + 440, + 499, + 469, + 495, + 454, + 479, + 549, + 514, + 481, + 503, + 468, + 477, + 476, + 492, + 465, + 528, + 493, + 499, + 480, + 491, + 459, + 470, + 476, + 476, + 492, + 474, + 517, + 504, + 466, + 463, + 517, + 453, + 471, + 456, + 508, + 482, + 465, + 475, + 548, + 485, + 483, + 482, + 500, + 549, + 444, + 504, + 481, + 441, + 477, + 496, + 515, + 490, + 532, + 490, + 489, + 444, + 485, + 473, + 453, + 498, + 534, + 467, + 486, + 517, + 499, + 488, + 492, + 499, + 461, + 478, + 484, + 515, + 515, + 486, + 497, + 464, + 523, + 483, + 468, + 491, + 513, + 525, + 489, + 476, + 494, + 486, + 543, + 475, + 474, + 470, + 495, + 466, + 515, + 503, + 514, + 520, + 485, + 485, + 469, + 518, + 493, + 486, + 505, + 457, + 484, + 476, + 502, + 511, + 527, + 481, + 510, + 492, + 525, + 502, + 433, + 490, + 471, + 481, + 527, + 502, + 496, + 470, + 513, + 505, + 458, + 477, + 445, + 545, + 453, + 479, + 484, + 483, + 498, + 494, + 499, + 447, + 486, + 482, + 493, + 474, + 483, + 499, + 454, + 485, + 455, + 473, + 522, + 533, + 463, + 463, + 481, + 495, + 491, + 482, + 528, + 485, + 434, + 450, + 473, + 482, + 501, + 492, + 518, + 468, + 498, + 513, + 498, + 472, + 486, + 531, + 487, + 466, + 501, + 459, + 481, + 497, + 491, + 465, + 494, + 493, + 524, + 490, + 508, + 509, + 437, + 489, + 505, + 480, + 488, + 486, + 501, + 460, + 515, + 472, + 470, + 476, + 442, + 480, + 485, + 504, + 477, + 494, + 473, + 475, + 513, + 506, + 457, + 481, + 482, + 472, + 496, + 475, + 490, + 486, + 470, + 497, + 515, + 471, + 446, + 463, + 518, + 490, + 461, + 509, + 477, + 441, + 486, + 475, + 444, + 501, + 486, + 471, + 513, + 496, + 484, + 511, + 498, + 487, + 478, + 496, + 485, + 443, + 469, + 483, + 460, + 484, + 492, + 493, + 487, + 483, + 527, + 459, + 437, + 496, + 492, + 475, + 457, + 503, + 469, + 509, + 481, + 489, + 465, + 472, + 472, + 488, + 482, + 480, + 512, + 466, + 456, + 458, + 490, + 498, + 488, + 500, + 447, + 496, + 513, + 482, + 494, + 488, + 501, + 495, + 466, + 483, + 491, + 475, + 490, + 505, + 527, + 448, + 501, + 515, + 416, + 493, + 491, + 481, + 475, + 484, + 445, + 486, + 504, + 499, + 545, + 488, + 497, + 469, + 479, + 456, + 508, + 477, + 481, + 538, + 503, + 498, + 444, + 508, + 484, + 490, + 484, + 497, + 509, + 458, + 497, + 458, + 488, + 494, + 456, + 491, + 491, + 489, + 490, + 505, + 520, + 511, + 490, + 458, + 477, + 471, + 481, + 492, + 482, + 504, + 526, + 503, + 507, + 483, + 491, + 504, + 487, + 499, + 551, + 476, + 513, + 467, + 483, + 497, + 529, + 521, + 455, + 473, + 500, + 415, + 474, + 559, + 518, + 512, + 483, + 502, + 462, + 547, + 514, + 503, + 476, + 491, + 488, + 471, + 488, + 451, + 509, + 486, + 503, + 483, + 450, + 461, + 486, + 478, + 508, + 501, + 520, + 513, + 499, + 493, + 467, + 494, + 492, + 506, + 481, + 474, + 498, + 499, + 508, + 481, + 503, + 490, + 484, + 472, + 486, + 505, + 469, + 506, + 499, + 489, + 454, + 487, + 526, + 465, + 458, + 504, + 464, + 517, + 490, + 465, + 503, + 488, + 482, + 495, + 526, + 489, + 477, + 507, + 494, + 525, + 505, + 496, + 491, + 536, + 469, + 506, + 438, + 482, + 517, + 464, + 472, + 507, + 499, + 447, + 465, + 460, + 466, + 484, + 476, + 467, + 484, + 474, + 462, + 516, + 471, + 500, + 511, + 517, + 460, + 512, + 484, + 461, + 458, + 519, + 481, + 505, + 472, + 475, + 488, + 543, + 539, + 511, + 489, + 450, + 516, + 492, + 500, + 452, + 500, + 521, + 519, + 470, + 461, + 467, + 458, + 501, + 496, + 482, + 456, + 500, + 496, + 504, + 481, + 499, + 480, + 477, + 559, + 499, + 522, + 491, + 482, + 480, + 493, + 513, + 485, + 463, + 460, + 501, + 507, + 480, + 503, + 511, + 484, + 461, + 443, + 477, + 464, + 486, + 523, + 493, + 465, + 489, + 510, + 467, + 471, + 498, + 482, + 450, + 483, + 498, + 520, + 484, + 509, + 512, + 454, + 461, + 497, + 465, + 466, + 510, + 451, + 496, + 489, + 478, + 516, + 529, + 492, + 490, + 476, + 505, + 487, + 523, + 489, + 495, + 509, + 475, + 501, + 472, + 479, + 501, + 493, + 475, + 510, + 511, + 462, + 472, + 487, + 487, + 516, + 474, + 512, + 498, + 451, + 484, + 493, + 497, + 544, + 461, + 475, + 525, + 487, + 465, + 490, + 493, + 463, + 477, + 525, + 486, + 484, + 494, + 485, + 490, + 521, + 495, + 494, + 518, + 487, + 501, + 468, + 492, + 449, + 461, + 480, + 500, + 497, + 470, + 479, + 521, + 490, + 520, + 508, + 508, + 495, + 481, + 513, + 502, + 516, + 480, + 471, + 483, + 496, + 487, + 497, + 475, + 492, + 513, + 491, + 550, + 487, + 514, + 510, + 513, + 494, + 483, + 479, + 518, + 468, + 485, + 484, + 469, + 494, + 495, + 527, + 487, + 503, + 486, + 468, + 508, + 528, + 478, + 480, + 463, + 508, + 491, + 454, + 472, + 458, + 500, + 488, + 469, + 500, + 489, + 483, + 476, + 496, + 454, + 466, + 486, + 501, + 470, + 509, + 482, + 486, + 494, + 490, + 463, + 463, + 496, + 525, + 489, + 476, + 490, + 513, + 491, + 500, + 545, + 481, + 492, + 500, + 501, + 483, + 467, + 515, + 499, + 457, + 494, + 478, + 495, + 504, + 472, + 494, + 504, + 532, + 456, + 458, + 480, + 477, + 504, + 484, + 494, + 473, + 488, + 466, + 450, + 475, + 484, + 481, + 478, + 500, + 492, + 466, + 505, + 480, + 497, + 462, + 486, + 480, + 463, + 494, + 437, + 477, + 468, + 469, + 510, + 502, + 509, + 499, + 465, + 530, + 511, + 485, + 465, + 489, + 490, + 490, + 490, + 491, + 509, + 514, + 481, + 481, + 498, + 491, + 493, + 514, + 453, + 505, + 480, + 492, + 471, + 498, + 476, + 496, + 461, + 520, + 469, + 467, + 493, + 453, + 495, + 489, + 507, + 442, + 495, + 468, + 462, + 512, + 505, + 477, + 466, + 453, + 475, + 484, + 498, + 509, + 537, + 479, + 480, + 478, + 470, + 465, + 495, + 464, + 485, + 447, + 508, + 478, + 491, + 494, + 471, + 477, + 514, + 453, + 454, + 517, + 526, + 489, + 491, + 457, + 519, + 483, + 522, + 479, + 522, + 514, + 491, + 491, + 494, + 482, + 463, + 503, + 491, + 471, + 508, + 476, + 472, + 500, + 514, + 500, + 458, + 500, + 474, + 497, + 497, + 514, + 526, + 501, + 493, + 519, + 516, + 474, + 478, + 524, + 467, + 473, + 500, + 486, + 490, + 491, + 487, + 468, + 501, + 540, + 493, + 482, + 492, + 502, + 474, + 486, + 512, + 493, + 483, + 457, + 487, + 486, + 502, + 460, + 459, + 466, + 495, + 469, + 525, + 518, + 518, + 517, + 469, + 463, + 459, + 511, + 495, + 490, + 452, + 511, + 486, + 515, + 482, + 464, + 487, + 513, + 479, + 484, + 468, + 499, + 482, + 496, + 494, + 505, + 475, + 470, + 471, + 497, + 464, + 520, + 506, + 518, + 477, + 498, + 465, + 462, + 478, + 496, + 495, + 490, + 486, + 516, + 503, + 483, + 489, + 508, + 481, + 479, + 533, + 491, + 477, + 482, + 514, + 485, + 488, + 531, + 522, + 481, + 480, + 498, + 485, + 490, + 489, + 510, + 512, + 497, + 517, + 499, + 465, + 453, + 467, + 474, + 507, + 496, + 485, + 497, + 492, + 488, + 505, + 464, + 458, + 509, + 479, + 466, + 490, + 535, + 484, + 497, + 469, + 493, + 498, + 518, + 483, + 449, + 480, + 473, + 523, + 504, + 441, + 503, + 451, + 509, + 497, + 509, + 497, + 511, + 470, + 476, + 499, + 517, + 511, + 463, + 504, + 498, + 476, + 480, + 501, + 513, + 507, + 516, + 461, + 486, + 482, + 504, + 466, + 498, + 457, + 487, + 462, + 475, + 471, + 481, + 493, + 475, + 483, + 473, + 473, + 472, + 508, + 453, + 480, + 459, + 491, + 477, + 504, + 497, + 503, + 504, + 488, + 448, + 528, + 509, + 506, + 477, + 502, + 492, + 519, + 488, + 503, + 503, + 510, + 472, + 498, + 503, + 511, + 512, + 481, + 502, + 464, + 510, + 524, + 435, + 499, + 549, + 463, + 479, + 498, + 438, + 492, + 482, + 512, + 497, + 498, + 494, + 494, + 468, + 508, + 510, + 513, + 456, + 476, + 485, + 517, + 479, + 501, + 466, + 492, + 530, + 470, + 493, + 488, + 498, + 506, + 478, + 478, + 476, + 489, + 496, + 490, + 494, + 493, + 478, + 503, + 482, + 475, + 475, + 444, + 482, + 502, + 476, + 463, + 490, + 455, + 486, + 503, + 504, + 476, + 514, + 514, + 503, + 469, + 463, + 512, + 460, + 467, + 461, + 495, + 469, + 471, + 528, + 458, + 511, + 463, + 514, + 472, + 462, + 469, + 458, + 477, + 476, + 492, + 507, + 510, + 425, + 484, + 457, + 475, + 483, + 498, + 528, + 498, + 503, + 501, + 475, + 451, + 525, + 495, + 482, + 454, + 487, + 481, + 462, + 458, + 473, + 451, + 482, + 483, + 486, + 464, + 522, + 483, + 491, + 493, + 503, + 488, + 505, + 525, + 460, + 520, + 488, + 502, + 525, + 492, + 485, + 454, + 498, + 501, + 457, + 535, + 474, + 527, + 484, + 504, + 476, + 491, + 478, + 494, + 502, + 507, + 484, + 472, + 517, + 457, + 479, + 510, + 529, + 485, + 481, + 482, + 501, + 498, + 516, + 462, + 478, + 505, + 516, + 472, + 511, + 486, + 489, + 485, + 493, + 538, + 486, + 496, + 499, + 483, + 513, + 501, + 465, + 500, + 508, + 481, + 485, + 494, + 481, + 488, + 495, + 506, + 456, + 541, + 473, + 488, + 449, + 528, + 481, + 488, + 457, + 476, + 495, + 461, + 517, + 522, + 452, + 472, + 555, + 502, + 497, + 505, + 512, + 506, + 474, + 463, + 463, + 500, + 452, + 488, + 465, + 475, + 510, + 492, + 454, + 514, + 502, + 482, + 473, + 512, + 454, + 492, + 512, + 468, + 483, + 492, + 465, + 466, + 504, + 514, + 478, + 483, + 473, + 509, + 494, + 508, + 521, + 448, + 472, + 461, + 470, + 452, + 504, + 501, + 489, + 495, + 498, + 490, + 525, + 494, + 490, + 532, + 490, + 506, + 540, + 496, + 489, + 462, + 499, + 496, + 510, + 489, + 461, + 486, + 477, + 474, + 492, + 464, + 498, + 479, + 506, + 472, + 501, + 466, + 480, + 454, + 462, + 478, + 542, + 449, + 472, + 506, + 491, + 509, + 459, + 488, + 511, + 479, + 540, + 475, + 520, + 506, + 515, + 493, + 475, + 464, + 491, + 508, + 462, + 475, + 502, + 498, + 480, + 458, + 482, + 505, + 471, + 501, + 498, + 474, + 496, + 473, + 477, + 515, + 533, + 483, + 482, + 484, + 506, + 519, + 514, + 480, + 483, + 493, + 508, + 492, + 468, + 483, + 468, + 496, + 469, + 489, + 524, + 526, + 477, + 484, + 456, + 479, + 464, + 477, + 479, + 511, + 481, + 471, + 481, + 483, + 498, + 488, + 462, + 489, + 455, + 480, + 500, + 443, + 438, + 465, + 465, + 495, + 452, + 521, + 467, + 462, + 483, + 494, + 521, + 464, + 461, + 463, + 496, + 476, + 487, + 463, + 479, + 489, + 449, + 473, + 480, + 478, + 463, + 473, + 493, + 492, + 500, + 469, + 493, + 486, + 489, + 515, + 506, + 454, + 508, + 481, + 465, + 499, + 477, + 522, + 461, + 483, + 473, + 449, + 495, + 516, + 488, + 470, + 503, + 489, + 500, + 469, + 509, + 482, + 500, + 509, + 512, + 485, + 486, + 523, + 486, + 493, + 503, + 495, + 493, + 451, + 491, + 529, + 504, + 472, + 481, + 493, + 466, + 472, + 496, + 497, + 494, + 489, + 490, + 512, + 495, + 482, + 491, + 495, + 448, + 495, + 454, + 483, + 482, + 482, + 506, + 525, + 494, + 497, + 530, + 460, + 506, + 539, + 505, + 488, + 480, + 474, + 480, + 470, + 486, + 486, + 503, + 496, + 489, + 469, + 462, + 457, + 500, + 449, + 442, + 476, + 448, + 508, + 498, + 507, + 465, + 481, + 476, + 465, + 476, + 517, + 477, + 453, + 490, + 502, + 478, + 479, + 454, + 459, + 482, + 492, + 506, + 441, + 492, + 481, + 482, + 478, + 449, + 478, + 503, + 505, + 474, + 524, + 483, + 503, + 492, + 496, + 479, + 496, + 464, + 492, + 506, + 490, + 494, + 483, + 500, + 531, + 486, + 469, + 517, + 502, + 488, + 487, + 497, + 433, + 462, + 516, + 493, + 474, + 500, + 516, + 497, + 475, + 497, + 487, + 481, + 470, + 469, + 499, + 450, + 501, + 494, + 538, + 490, + 511, + 491, + 504, + 481, + 468, + 499, + 473, + 479, + 471, + 499, + 494, + 488, + 475, + 493, + 506, + 478, + 478, + 502, + 461, + 474, + 490, + 520, + 476, + 473, + 451, + 485, + 454, + 475, + 497, + 509, + 474, + 516, + 473, + 464, + 497, + 497, + 458, + 458, + 481, + 453, + 514, + 521, + 513, + 511, + 490, + 486, + 507, + 498, + 504, + 509, + 485, + 502, + 491, + 481, + 478, + 480, + 448, + 499, + 502, + 499, + 522 + ] + }, + { + "counters": [ + 482, + 510, + 472, + 488, + 524, + 444, + 511, + 511, + 477, + 475, + 538, + 524, + 512, + 483, + 549, + 475, + 515, + 495, + 511, + 461, + 529, + 510, + 501, + 471, + 469, + 488, + 505, + 489, + 474, + 472, + 463, + 499, + 477, + 505, + 501, + 431, + 492, + 522, + 512, + 458, + 456, + 534, + 493, + 501, + 512, + 549, + 504, + 491, + 482, + 492, + 451, + 465, + 482, + 477, + 477, + 496, + 484, + 475, + 470, + 472, + 460, + 504, + 461, + 495, + 518, + 501, + 514, + 480, + 465, + 517, + 491, + 479, + 495, + 443, + 487, + 508, + 462, + 467, + 483, + 452, + 473, + 479, + 532, + 497, + 491, + 501, + 464, + 497, + 493, + 483, + 485, + 471, + 532, + 492, + 453, + 505, + 470, + 502, + 499, + 506, + 464, + 465, + 516, + 506, + 479, + 460, + 500, + 493, + 542, + 468, + 485, + 480, + 469, + 468, + 537, + 477, + 467, + 502, + 448, + 499, + 491, + 497, + 467, + 510, + 450, + 487, + 493, + 457, + 488, + 469, + 462, + 488, + 485, + 538, + 518, + 496, + 498, + 478, + 499, + 511, + 493, + 504, + 463, + 489, + 463, + 467, + 491, + 498, + 521, + 482, + 454, + 458, + 517, + 500, + 447, + 455, + 467, + 493, + 481, + 457, + 482, + 469, + 529, + 510, + 481, + 486, + 435, + 498, + 545, + 489, + 482, + 450, + 484, + 496, + 501, + 465, + 471, + 476, + 493, + 499, + 486, + 503, + 458, + 502, + 482, + 479, + 477, + 505, + 455, + 493, + 468, + 438, + 461, + 480, + 458, + 484, + 497, + 494, + 506, + 460, + 471, + 498, + 532, + 470, + 507, + 478, + 456, + 476, + 471, + 512, + 487, + 490, + 535, + 494, + 518, + 515, + 478, + 496, + 515, + 478, + 477, + 475, + 481, + 489, + 516, + 455, + 512, + 508, + 503, + 503, + 483, + 530, + 434, + 475, + 500, + 467, + 512, + 533, + 530, + 507, + 471, + 509, + 459, + 494, + 501, + 478, + 475, + 486, + 458, + 498, + 452, + 469, + 452, + 533, + 473, + 496, + 492, + 476, + 478, + 484, + 474, + 506, + 464, + 509, + 486, + 481, + 488, + 486, + 486, + 486, + 498, + 490, + 485, + 467, + 477, + 513, + 500, + 492, + 489, + 448, + 499, + 479, + 519, + 479, + 477, + 499, + 503, + 497, + 468, + 496, + 513, + 459, + 476, + 477, + 493, + 478, + 496, + 494, + 478, + 507, + 489, + 500, + 448, + 507, + 507, + 506, + 499, + 504, + 507, + 511, + 445, + 498, + 463, + 491, + 500, + 485, + 513, + 511, + 517, + 458, + 484, + 510, + 481, + 517, + 501, + 524, + 509, + 482, + 465, + 482, + 506, + 482, + 474, + 528, + 493, + 463, + 465, + 487, + 459, + 463, + 527, + 533, + 490, + 510, + 472, + 507, + 480, + 494, + 454, + 471, + 516, + 450, + 507, + 475, + 469, + 454, + 486, + 505, + 492, + 535, + 516, + 542, + 478, + 448, + 465, + 471, + 475, + 522, + 505, + 475, + 488, + 469, + 468, + 465, + 487, + 511, + 470, + 525, + 520, + 498, + 463, + 505, + 498, + 491, + 476, + 493, + 503, + 512, + 483, + 512, + 477, + 492, + 493, + 462, + 515, + 471, + 469, + 484, + 523, + 504, + 507, + 466, + 515, + 486, + 464, + 478, + 478, + 497, + 471, + 486, + 472, + 513, + 498, + 465, + 477, + 504, + 493, + 481, + 507, + 523, + 497, + 456, + 493, + 486, + 504, + 481, + 470, + 492, + 513, + 490, + 489, + 481, + 510, + 477, + 496, + 516, + 468, + 512, + 452, + 477, + 479, + 463, + 459, + 469, + 461, + 465, + 480, + 489, + 515, + 485, + 500, + 477, + 505, + 452, + 509, + 526, + 511, + 513, + 471, + 452, + 492, + 501, + 514, + 442, + 520, + 506, + 486, + 495, + 525, + 461, + 462, + 452, + 493, + 479, + 492, + 534, + 501, + 501, + 496, + 461, + 469, + 502, + 502, + 457, + 455, + 451, + 449, + 503, + 475, + 473, + 531, + 437, + 464, + 460, + 511, + 464, + 478, + 493, + 490, + 539, + 488, + 478, + 481, + 510, + 468, + 464, + 480, + 538, + 507, + 502, + 479, + 498, + 478, + 452, + 523, + 517, + 509, + 483, + 478, + 466, + 489, + 504, + 506, + 505, + 495, + 475, + 476, + 520, + 489, + 504, + 496, + 501, + 508, + 480, + 511, + 460, + 491, + 475, + 479, + 491, + 510, + 537, + 509, + 491, + 500, + 477, + 466, + 481, + 463, + 479, + 472, + 478, + 509, + 499, + 458, + 520, + 482, + 506, + 505, + 486, + 469, + 501, + 479, + 476, + 466, + 450, + 474, + 462, + 479, + 500, + 487, + 472, + 462, + 473, + 481, + 492, + 489, + 464, + 465, + 478, + 498, + 505, + 501, + 493, + 502, + 483, + 487, + 490, + 503, + 501, + 501, + 495, + 470, + 494, + 528, + 483, + 477, + 518, + 455, + 482, + 487, + 448, + 514, + 491, + 495, + 484, + 448, + 507, + 488, + 529, + 493, + 466, + 493, + 480, + 481, + 495, + 448, + 501, + 504, + 492, + 479, + 488, + 523, + 515, + 497, + 469, + 497, + 494, + 486, + 500, + 467, + 539, + 503, + 479, + 504, + 504, + 482, + 481, + 494, + 503, + 482, + 527, + 470, + 478, + 505, + 506, + 476, + 487, + 496, + 498, + 499, + 478, + 513, + 491, + 463, + 504, + 467, + 510, + 518, + 512, + 495, + 484, + 504, + 473, + 480, + 478, + 476, + 483, + 490, + 475, + 468, + 457, + 499, + 492, + 464, + 505, + 492, + 488, + 492, + 502, + 512, + 492, + 482, + 528, + 493, + 488, + 491, + 506, + 458, + 516, + 455, + 468, + 510, + 473, + 515, + 481, + 496, + 519, + 465, + 487, + 457, + 517, + 452, + 483, + 478, + 505, + 501, + 511, + 487, + 492, + 488, + 477, + 500, + 481, + 501, + 505, + 466, + 448, + 477, + 470, + 531, + 496, + 494, + 466, + 467, + 465, + 527, + 499, + 439, + 481, + 484, + 472, + 492, + 514, + 508, + 484, + 508, + 480, + 477, + 477, + 460, + 470, + 474, + 495, + 450, + 463, + 520, + 490, + 533, + 483, + 456, + 504, + 491, + 480, + 445, + 486, + 488, + 498, + 473, + 471, + 489, + 462, + 516, + 505, + 478, + 456, + 463, + 509, + 541, + 478, + 465, + 491, + 465, + 522, + 474, + 523, + 516, + 459, + 472, + 491, + 480, + 515, + 521, + 459, + 480, + 528, + 484, + 447, + 443, + 477, + 482, + 463, + 532, + 462, + 498, + 496, + 468, + 480, + 457, + 478, + 524, + 485, + 445, + 465, + 515, + 488, + 504, + 475, + 460, + 481, + 500, + 470, + 493, + 494, + 504, + 483, + 495, + 455, + 502, + 517, + 498, + 472, + 498, + 491, + 496, + 512, + 535, + 515, + 500, + 499, + 468, + 487, + 494, + 486, + 517, + 465, + 470, + 477, + 474, + 557, + 489, + 503, + 478, + 498, + 508, + 485, + 474, + 487, + 466, + 494, + 482, + 487, + 486, + 468, + 521, + 498, + 509, + 507, + 514, + 508, + 497, + 499, + 498, + 487, + 458, + 462, + 496, + 530, + 452, + 488, + 499, + 470, + 507, + 487, + 468, + 455, + 506, + 490, + 465, + 449, + 468, + 498, + 484, + 440, + 499, + 506, + 457, + 492, + 496, + 499, + 452, + 480, + 496, + 484, + 510, + 445, + 471, + 496, + 488, + 501, + 490, + 468, + 500, + 469, + 479, + 478, + 447, + 501, + 502, + 508, + 484, + 508, + 506, + 516, + 500, + 473, + 490, + 482, + 472, + 492, + 510, + 509, + 465, + 506, + 493, + 483, + 506, + 500, + 480, + 495, + 489, + 460, + 471, + 517, + 500, + 487, + 477, + 490, + 483, + 501, + 487, + 502, + 491, + 501, + 457, + 497, + 484, + 495, + 505, + 482, + 436, + 459, + 489, + 508, + 465, + 465, + 472, + 491, + 498, + 457, + 486, + 502, + 457, + 488, + 476, + 469, + 497, + 496, + 476, + 482, + 467, + 528, + 514, + 479, + 466, + 445, + 484, + 477, + 507, + 446, + 449, + 485, + 498, + 517, + 518, + 468, + 472, + 453, + 519, + 508, + 495, + 487, + 493, + 530, + 484, + 492, + 481, + 508, + 485, + 454, + 477, + 492, + 487, + 467, + 451, + 474, + 491, + 496, + 496, + 524, + 472, + 494, + 487, + 495, + 467, + 516, + 480, + 488, + 472, + 474, + 502, + 515, + 447, + 475, + 472, + 498, + 506, + 492, + 471, + 520, + 478, + 465, + 462, + 524, + 514, + 496, + 518, + 501, + 481, + 468, + 509, + 475, + 512, + 498, + 502, + 501, + 466, + 534, + 479, + 501, + 535, + 462, + 452, + 517, + 496, + 472, + 500, + 466, + 496, + 480, + 510, + 491, + 495, + 445, + 575, + 489, + 476, + 473, + 506, + 493, + 502, + 447, + 530, + 494, + 486, + 484, + 524, + 481, + 467, + 488, + 524, + 511, + 504, + 496, + 462, + 542, + 495, + 533, + 498, + 507, + 466, + 500, + 481, + 487, + 476, + 514, + 480, + 497, + 527, + 497, + 472, + 477, + 490, + 507, + 478, + 492, + 475, + 493, + 464, + 488, + 461, + 510, + 503, + 453, + 511, + 480, + 515, + 513, + 464, + 466, + 472, + 479, + 467, + 485, + 499, + 467, + 505, + 497, + 518, + 486, + 485, + 463, + 494, + 510, + 521, + 437, + 464, + 481, + 485, + 505, + 546, + 481, + 476, + 493, + 488, + 481, + 525, + 504, + 484, + 529, + 514, + 467, + 448, + 485, + 476, + 497, + 428, + 492, + 492, + 474, + 500, + 479, + 526, + 467, + 478, + 479, + 489, + 471, + 486, + 465, + 494, + 455, + 447, + 452, + 475, + 500, + 521, + 516, + 482, + 500, + 463, + 459, + 496, + 501, + 488, + 479, + 463, + 498, + 493, + 495, + 483, + 507, + 510, + 453, + 482, + 494, + 485, + 479, + 485, + 518, + 490, + 506, + 483, + 477, + 496, + 468, + 507, + 514, + 491, + 482, + 481, + 498, + 488, + 459, + 459, + 483, + 492, + 494, + 508, + 521, + 457, + 513, + 471, + 489, + 494, + 462, + 496, + 490, + 457, + 500, + 455, + 484, + 500, + 514, + 509, + 511, + 469, + 480, + 477, + 476, + 493, + 472, + 474, + 468, + 498, + 509, + 475, + 484, + 504, + 502, + 492, + 547, + 489, + 477, + 459, + 477, + 508, + 499, + 472, + 473, + 493, + 509, + 469, + 520, + 481, + 436, + 474, + 530, + 479, + 470, + 504, + 488, + 490, + 484, + 457, + 447, + 486, + 491, + 532, + 488, + 487, + 496, + 490, + 513, + 517, + 498, + 489, + 503, + 491, + 514, + 499, + 494, + 497, + 504, + 454, + 516, + 464, + 483, + 482, + 510, + 435, + 467, + 481, + 465, + 458, + 463, + 473, + 456, + 491, + 487, + 454, + 485, + 478, + 476, + 470, + 474, + 473, + 462, + 492, + 505, + 519, + 536, + 488, + 496, + 498, + 466, + 509, + 485, + 498, + 479, + 518, + 504, + 478, + 498, + 505, + 483, + 485, + 495, + 516, + 462, + 514, + 452, + 492, + 510, + 462, + 457, + 502, + 468, + 499, + 551, + 519, + 505, + 488, + 473, + 529, + 489, + 497, + 486, + 526, + 455, + 485, + 483, + 465, + 533, + 494, + 518, + 485, + 516, + 494, + 477, + 473, + 471, + 496, + 499, + 458, + 473, + 482, + 488, + 459, + 430, + 474, + 457, + 512, + 478, + 489, + 467, + 472, + 495, + 473, + 460, + 512, + 475, + 514, + 450, + 465, + 515, + 527, + 486, + 499, + 503, + 486, + 530, + 466, + 474, + 483, + 511, + 511, + 490, + 489, + 483, + 514, + 476, + 469, + 558, + 501, + 513, + 469, + 484, + 491, + 486, + 494, + 502, + 509, + 485, + 479, + 486, + 472, + 448, + 492, + 536, + 521, + 492, + 483, + 494, + 473, + 506, + 496, + 538, + 439, + 540, + 547, + 503, + 497, + 496, + 486, + 491, + 477, + 469, + 524, + 462, + 478, + 492, + 470, + 502, + 491, + 464, + 486, + 524, + 486, + 438, + 520, + 439, + 465, + 470, + 525, + 500, + 460, + 508, + 518, + 508, + 482, + 486, + 481, + 470, + 489, + 545, + 467, + 463, + 517, + 511, + 508, + 475, + 474, + 487, + 468, + 470, + 484, + 464, + 504, + 481, + 531, + 490, + 458, + 513, + 537, + 530, + 502, + 481, + 464, + 502, + 463, + 490, + 517, + 477, + 497, + 490, + 528, + 494, + 482, + 482, + 476, + 479, + 476, + 472, + 477, + 470, + 455, + 460, + 453, + 487, + 469, + 452, + 478, + 463, + 471, + 486, + 504, + 448, + 460, + 514, + 507, + 512, + 485, + 487, + 459, + 502, + 520, + 477, + 474, + 465, + 507, + 472, + 463, + 461, + 494, + 505, + 513, + 508, + 501, + 488, + 487, + 446, + 468, + 461, + 497, + 492, + 482, + 495, + 474, + 471, + 485, + 506, + 477, + 534, + 488, + 502, + 498, + 472, + 493, + 465, + 487, + 487, + 468, + 496, + 510, + 500, + 494, + 527, + 463, + 497, + 504, + 477, + 473, + 537, + 499, + 531, + 498, + 481, + 499, + 479, + 500, + 500, + 503, + 492, + 470, + 518, + 494, + 507, + 522, + 468, + 509, + 466, + 491, + 470, + 482, + 484, + 471, + 492, + 484, + 492, + 489, + 489, + 462, + 453, + 491, + 493, + 474, + 450, + 486, + 519, + 481, + 504, + 498, + 525, + 502, + 471, + 458, + 463, + 513, + 537, + 492, + 487, + 521, + 495, + 459, + 483, + 478, + 491, + 479, + 466, + 482, + 502, + 455, + 515, + 524, + 479, + 493, + 528, + 481, + 476, + 486, + 507, + 485, + 505, + 490, + 497, + 441, + 482, + 532, + 477, + 456, + 438, + 514, + 456, + 495, + 477, + 545, + 507, + 458, + 478, + 484, + 497, + 503, + 468, + 493, + 489, + 446, + 490, + 491, + 471, + 494, + 485, + 506, + 478, + 498, + 461, + 479, + 474, + 461, + 473, + 509, + 501, + 491, + 434, + 462, + 519, + 491, + 504, + 506, + 510, + 491, + 475, + 512, + 482, + 506, + 515, + 518, + 461, + 478, + 466, + 527, + 520, + 504, + 509, + 472, + 465, + 439, + 463, + 470, + 522, + 512, + 486, + 483, + 473, + 492, + 517, + 521, + 457, + 463, + 495, + 501, + 518, + 484, + 473, + 496, + 484, + 461, + 515, + 487, + 478, + 508, + 487, + 456, + 474, + 474, + 502, + 502, + 485, + 488, + 500, + 493, + 459, + 537, + 482, + 442, + 478, + 458, + 494, + 460, + 532, + 478, + 436, + 528, + 495, + 507, + 471, + 495, + 482, + 505, + 487, + 484, + 488, + 506, + 536, + 494, + 481, + 486, + 490, + 529, + 511, + 473, + 477, + 483, + 504, + 492, + 517, + 501, + 513, + 473, + 471, + 487, + 490, + 504, + 511, + 511, + 467, + 442, + 500, + 491, + 506, + 513, + 496, + 491, + 514, + 490, + 490, + 509, + 488, + 509, + 464, + 505, + 448, + 477, + 476, + 480, + 488, + 457, + 503, + 515, + 483, + 462, + 464, + 477, + 499, + 473, + 492, + 489, + 465, + 541, + 483, + 520, + 519, + 458, + 479, + 474, + 451, + 492, + 458, + 493, + 518, + 511, + 512, + 494, + 479, + 491, + 435, + 483, + 457, + 511, + 523, + 505, + 476, + 513, + 480, + 525, + 507, + 498, + 485, + 488, + 462, + 488, + 494, + 499, + 479, + 472, + 517, + 480, + 503, + 469, + 458, + 457, + 483, + 480, + 464, + 496, + 506, + 461, + 474, + 486, + 487, + 486, + 483, + 508, + 471, + 518, + 454, + 499, + 468, + 482, + 476, + 473, + 507, + 524, + 477, + 474, + 557, + 470, + 443, + 543, + 519, + 482, + 492, + 483, + 498, + 461, + 503, + 516, + 496, + 485, + 487, + 474, + 496, + 541, + 491, + 461, + 507, + 530, + 446, + 499, + 488, + 523, + 499, + 490, + 473, + 488, + 493, + 478, + 490, + 476, + 508, + 470, + 465, + 503, + 484, + 495, + 520, + 483, + 531, + 447, + 502, + 481, + 483, + 463, + 498, + 481, + 498, + 522, + 488, + 473, + 510, + 507, + 489, + 453, + 470, + 469, + 494, + 476, + 516, + 463, + 484, + 433, + 505, + 480, + 517, + 474, + 513, + 481, + 528, + 474, + 486, + 515, + 488, + 485, + 514, + 457, + 480, + 519, + 486, + 430, + 513, + 488, + 471, + 474, + 481, + 490, + 496, + 459, + 453, + 499, + 477, + 474, + 503, + 496, + 470, + 479, + 471, + 449, + 476, + 482, + 495, + 481, + 483, + 493, + 470, + 521, + 506, + 495, + 485, + 463, + 491, + 471, + 500, + 447, + 464, + 520, + 501, + 477, + 517, + 492, + 471, + 486, + 459, + 477, + 495, + 471, + 504, + 455, + 448, + 532, + 498, + 494, + 513, + 462, + 457, + 497, + 507, + 508, + 498, + 488, + 484, + 525, + 444, + 493, + 498, + 492, + 501, + 506, + 478 + ] + }, + { + "counters": [ + 495, + 433, + 458, + 465, + 476, + 491, + 493, + 463, + 501, + 466, + 487, + 490, + 482, + 435, + 458, + 487, + 483, + 500, + 521, + 516, + 476, + 527, + 486, + 452, + 482, + 513, + 478, + 500, + 491, + 473, + 496, + 464, + 489, + 498, + 479, + 526, + 511, + 547, + 489, + 504, + 457, + 522, + 501, + 513, + 463, + 516, + 466, + 462, + 500, + 505, + 533, + 473, + 444, + 508, + 504, + 495, + 488, + 504, + 488, + 502, + 509, + 447, + 473, + 494, + 516, + 481, + 465, + 497, + 475, + 517, + 451, + 477, + 470, + 483, + 446, + 486, + 517, + 495, + 481, + 505, + 487, + 487, + 493, + 527, + 474, + 500, + 458, + 497, + 513, + 521, + 468, + 491, + 496, + 502, + 468, + 492, + 436, + 483, + 491, + 478, + 505, + 516, + 489, + 508, + 500, + 438, + 491, + 471, + 454, + 475, + 507, + 507, + 503, + 449, + 463, + 465, + 462, + 483, + 467, + 482, + 473, + 471, + 526, + 461, + 461, + 488, + 460, + 468, + 449, + 483, + 485, + 471, + 476, + 490, + 508, + 486, + 489, + 492, + 526, + 481, + 452, + 493, + 463, + 472, + 480, + 492, + 537, + 466, + 537, + 478, + 489, + 468, + 512, + 480, + 512, + 479, + 473, + 477, + 472, + 471, + 468, + 477, + 475, + 486, + 490, + 506, + 500, + 490, + 508, + 496, + 455, + 479, + 507, + 449, + 521, + 474, + 507, + 484, + 531, + 485, + 488, + 508, + 506, + 450, + 464, + 481, + 493, + 487, + 460, + 450, + 487, + 493, + 452, + 459, + 526, + 492, + 497, + 484, + 487, + 527, + 500, + 517, + 485, + 504, + 485, + 484, + 469, + 530, + 469, + 453, + 493, + 485, + 472, + 531, + 475, + 490, + 480, + 504, + 495, + 508, + 496, + 528, + 458, + 484, + 468, + 536, + 495, + 473, + 455, + 513, + 477, + 485, + 459, + 499, + 479, + 461, + 477, + 517, + 502, + 490, + 460, + 499, + 475, + 484, + 505, + 502, + 470, + 482, + 530, + 503, + 478, + 481, + 488, + 490, + 493, + 490, + 481, + 492, + 436, + 485, + 505, + 489, + 513, + 518, + 531, + 474, + 479, + 476, + 495, + 460, + 516, + 473, + 470, + 505, + 467, + 472, + 567, + 474, + 482, + 513, + 457, + 502, + 522, + 476, + 483, + 471, + 506, + 458, + 467, + 472, + 460, + 444, + 533, + 509, + 516, + 505, + 495, + 462, + 499, + 507, + 493, + 453, + 458, + 474, + 475, + 476, + 508, + 494, + 469, + 477, + 462, + 468, + 510, + 502, + 495, + 421, + 499, + 459, + 542, + 481, + 481, + 503, + 487, + 458, + 465, + 510, + 482, + 466, + 468, + 468, + 485, + 486, + 478, + 448, + 493, + 524, + 540, + 529, + 470, + 494, + 481, + 478, + 500, + 495, + 487, + 529, + 484, + 508, + 467, + 531, + 477, + 509, + 466, + 473, + 481, + 497, + 500, + 524, + 468, + 505, + 542, + 457, + 493, + 463, + 495, + 515, + 492, + 521, + 496, + 486, + 466, + 478, + 499, + 489, + 464, + 475, + 458, + 526, + 505, + 498, + 499, + 457, + 491, + 497, + 500, + 478, + 494, + 521, + 513, + 492, + 533, + 460, + 507, + 493, + 486, + 502, + 513, + 481, + 512, + 523, + 487, + 498, + 475, + 472, + 536, + 509, + 491, + 449, + 500, + 477, + 516, + 474, + 484, + 488, + 490, + 469, + 493, + 495, + 473, + 454, + 472, + 478, + 497, + 491, + 527, + 491, + 493, + 473, + 475, + 488, + 466, + 468, + 486, + 502, + 454, + 476, + 476, + 495, + 476, + 485, + 445, + 464, + 505, + 501, + 486, + 525, + 538, + 478, + 487, + 495, + 506, + 487, + 484, + 496, + 525, + 491, + 493, + 502, + 452, + 506, + 504, + 491, + 517, + 472, + 466, + 516, + 466, + 486, + 464, + 517, + 516, + 480, + 508, + 493, + 499, + 518, + 515, + 507, + 469, + 517, + 494, + 475, + 457, + 471, + 482, + 490, + 502, + 483, + 492, + 499, + 486, + 487, + 514, + 478, + 507, + 513, + 500, + 512, + 487, + 460, + 519, + 523, + 483, + 469, + 478, + 462, + 492, + 474, + 431, + 478, + 482, + 479, + 510, + 486, + 514, + 480, + 533, + 495, + 446, + 486, + 506, + 482, + 498, + 475, + 487, + 541, + 478, + 464, + 528, + 505, + 485, + 530, + 476, + 489, + 497, + 491, + 493, + 501, + 449, + 522, + 483, + 482, + 463, + 507, + 477, + 443, + 457, + 467, + 477, + 480, + 501, + 486, + 516, + 484, + 460, + 508, + 501, + 493, + 494, + 497, + 460, + 456, + 520, + 492, + 496, + 479, + 458, + 480, + 449, + 501, + 482, + 457, + 483, + 498, + 505, + 535, + 479, + 462, + 535, + 503, + 457, + 510, + 502, + 510, + 492, + 503, + 493, + 492, + 453, + 479, + 486, + 436, + 489, + 494, + 504, + 517, + 484, + 475, + 477, + 436, + 491, + 478, + 477, + 493, + 529, + 482, + 436, + 513, + 513, + 491, + 526, + 481, + 456, + 490, + 469, + 501, + 482, + 480, + 494, + 520, + 502, + 460, + 463, + 488, + 496, + 501, + 462, + 493, + 486, + 523, + 482, + 482, + 478, + 475, + 473, + 507, + 460, + 491, + 461, + 524, + 498, + 479, + 477, + 513, + 492, + 478, + 475, + 510, + 517, + 468, + 488, + 492, + 473, + 468, + 482, + 512, + 483, + 512, + 473, + 468, + 509, + 497, + 480, + 494, + 482, + 551, + 499, + 471, + 472, + 473, + 477, + 508, + 492, + 508, + 441, + 497, + 498, + 481, + 488, + 526, + 483, + 502, + 507, + 484, + 516, + 506, + 473, + 479, + 505, + 538, + 456, + 455, + 479, + 506, + 465, + 456, + 510, + 447, + 498, + 493, + 459, + 503, + 492, + 496, + 524, + 494, + 474, + 482, + 503, + 507, + 496, + 482, + 484, + 499, + 499, + 513, + 442, + 514, + 478, + 475, + 483, + 487, + 484, + 497, + 537, + 478, + 515, + 496, + 494, + 461, + 490, + 494, + 464, + 481, + 465, + 455, + 494, + 506, + 469, + 490, + 470, + 492, + 475, + 491, + 450, + 469, + 458, + 496, + 489, + 491, + 481, + 492, + 471, + 452, + 512, + 480, + 496, + 500, + 516, + 494, + 504, + 496, + 485, + 524, + 461, + 499, + 478, + 516, + 497, + 481, + 488, + 499, + 474, + 498, + 487, + 467, + 483, + 505, + 468, + 498, + 474, + 475, + 509, + 468, + 502, + 471, + 505, + 469, + 477, + 493, + 476, + 477, + 441, + 470, + 479, + 487, + 452, + 540, + 530, + 535, + 527, + 512, + 469, + 520, + 488, + 472, + 461, + 468, + 514, + 505, + 494, + 511, + 492, + 517, + 541, + 488, + 477, + 509, + 454, + 503, + 495, + 518, + 521, + 476, + 506, + 488, + 464, + 479, + 457, + 515, + 470, + 473, + 504, + 521, + 489, + 469, + 460, + 529, + 524, + 499, + 470, + 480, + 494, + 486, + 509, + 510, + 508, + 439, + 475, + 497, + 510, + 474, + 500, + 481, + 477, + 515, + 464, + 498, + 523, + 491, + 492, + 485, + 512, + 481, + 492, + 437, + 474, + 486, + 519, + 470, + 483, + 475, + 489, + 521, + 482, + 482, + 532, + 494, + 534, + 502, + 487, + 496, + 487, + 511, + 507, + 502, + 499, + 506, + 477, + 463, + 493, + 525, + 534, + 484, + 500, + 511, + 518, + 488, + 510, + 428, + 471, + 482, + 461, + 500, + 509, + 462, + 479, + 512, + 471, + 461, + 468, + 469, + 501, + 494, + 470, + 486, + 507, + 511, + 433, + 520, + 535, + 497, + 473, + 450, + 535, + 492, + 471, + 473, + 507, + 429, + 427, + 510, + 458, + 413, + 470, + 478, + 490, + 470, + 496, + 468, + 492, + 483, + 464, + 488, + 532, + 462, + 476, + 516, + 459, + 488, + 497, + 505, + 497, + 457, + 474, + 448, + 489, + 502, + 468, + 509, + 506, + 521, + 466, + 484, + 521, + 476, + 492, + 476, + 481, + 490, + 468, + 497, + 477, + 462, + 467, + 497, + 475, + 521, + 490, + 470, + 471, + 507, + 486, + 481, + 511, + 501, + 499, + 508, + 460, + 478, + 491, + 487, + 520, + 497, + 478, + 472, + 458, + 465, + 496, + 482, + 493, + 492, + 486, + 491, + 527, + 474, + 495, + 511, + 471, + 486, + 485, + 494, + 495, + 478, + 465, + 507, + 479, + 508, + 507, + 500, + 482, + 516, + 498, + 492, + 521, + 524, + 503, + 488, + 493, + 463, + 518, + 537, + 483, + 480, + 465, + 527, + 495, + 493, + 508, + 482, + 495, + 521, + 492, + 494, + 481, + 475, + 443, + 490, + 479, + 477, + 494, + 471, + 484, + 431, + 452, + 436, + 501, + 480, + 477, + 467, + 490, + 484, + 474, + 483, + 508, + 507, + 507, + 530, + 525, + 489, + 497, + 502, + 507, + 485, + 478, + 516, + 472, + 473, + 485, + 477, + 465, + 513, + 463, + 487, + 514, + 489, + 454, + 476, + 480, + 484, + 479, + 513, + 462, + 486, + 520, + 504, + 515, + 458, + 513, + 526, + 491, + 451, + 489, + 520, + 515, + 454, + 463, + 481, + 493, + 498, + 508, + 482, + 474, + 489, + 457, + 461, + 481, + 499, + 482, + 524, + 509, + 511, + 447, + 509, + 482, + 473, + 478, + 507, + 471, + 486, + 532, + 516, + 474, + 489, + 540, + 510, + 514, + 477, + 497, + 463, + 492, + 507, + 515, + 495, + 510, + 469, + 487, + 482, + 472, + 504, + 506, + 503, + 522, + 501, + 491, + 482, + 487, + 530, + 474, + 498, + 478, + 477, + 491, + 495, + 460, + 512, + 474, + 460, + 483, + 518, + 532, + 487, + 483, + 509, + 529, + 490, + 515, + 483, + 487, + 448, + 488, + 494, + 474, + 454, + 495, + 473, + 479, + 472, + 462, + 502, + 439, + 464, + 519, + 456, + 501, + 436, + 487, + 490, + 502, + 468, + 442, + 483, + 504, + 473, + 495, + 528, + 475, + 498, + 483, + 529, + 476, + 489, + 509, + 474, + 457, + 470, + 487, + 480, + 451, + 475, + 459, + 485, + 490, + 493, + 492, + 421, + 501, + 480, + 446, + 482, + 486, + 501, + 497, + 512, + 482, + 456, + 502, + 451, + 489, + 515, + 462, + 494, + 475, + 496, + 502, + 495, + 471, + 490, + 440, + 491, + 489, + 506, + 487, + 490, + 459, + 491, + 459, + 469, + 468, + 445, + 487, + 494, + 491, + 490, + 474, + 454, + 480, + 503, + 476, + 491, + 459, + 444, + 480, + 497, + 423, + 512, + 508, + 528, + 460, + 501, + 495, + 518, + 477, + 506, + 498, + 496, + 507, + 468, + 462, + 462, + 508, + 502, + 468, + 485, + 472, + 475, + 487, + 493, + 522, + 484, + 513, + 513, + 525, + 491, + 513, + 479, + 414, + 494, + 473, + 450, + 494, + 474, + 497, + 525, + 465, + 507, + 505, + 456, + 492, + 458, + 465, + 457, + 534, + 537, + 475, + 481, + 481, + 470, + 500, + 507, + 487, + 469, + 463, + 473, + 509, + 497, + 456, + 485, + 490, + 494, + 486, + 501, + 481, + 529, + 492, + 517, + 488, + 501, + 493, + 486, + 481, + 547, + 509, + 505, + 507, + 480, + 510, + 491, + 524, + 519, + 469, + 488, + 493, + 464, + 467, + 519, + 441, + 493, + 505, + 496, + 481, + 470, + 528, + 467, + 495, + 499, + 490, + 487, + 480, + 537, + 495, + 471, + 469, + 497, + 487, + 494, + 447, + 454, + 453, + 493, + 523, + 473, + 453, + 510, + 499, + 465, + 508, + 509, + 499, + 446, + 493, + 511, + 520, + 484, + 503, + 458, + 447, + 454, + 459, + 474, + 461, + 483, + 507, + 455, + 464, + 498, + 485, + 492, + 472, + 456, + 468, + 525, + 508, + 459, + 493, + 472, + 501, + 503, + 485, + 471, + 510, + 439, + 494, + 494, + 500, + 490, + 468, + 497, + 516, + 467, + 481, + 473, + 474, + 501, + 512, + 487, + 517, + 461, + 495, + 475, + 508, + 480, + 497, + 515, + 530, + 489, + 490, + 454, + 483, + 475, + 492, + 521, + 488, + 495, + 492, + 480, + 524, + 484, + 479, + 457, + 481, + 526, + 502, + 480, + 476, + 452, + 530, + 481, + 518, + 498, + 509, + 439, + 472, + 492, + 490, + 517, + 508, + 502, + 508, + 511, + 488, + 510, + 504, + 491, + 509, + 462, + 457, + 474, + 508, + 523, + 488, + 481, + 539, + 492, + 454, + 523, + 511, + 500, + 493, + 436, + 461, + 450, + 515, + 497, + 462, + 490, + 483, + 419, + 510, + 475, + 461, + 468, + 506, + 492, + 464, + 469, + 501, + 481, + 512, + 473, + 513, + 462, + 500, + 513, + 475, + 462, + 484, + 491, + 470, + 452, + 459, + 516, + 529, + 539, + 479, + 486, + 489, + 508, + 515, + 502, + 465, + 471, + 486, + 479, + 464, + 492, + 481, + 490, + 478, + 458, + 514, + 502, + 506, + 477, + 478, + 505, + 466, + 531, + 474, + 475, + 498, + 517, + 504, + 480, + 537, + 481, + 480, + 471, + 487, + 480, + 466, + 484, + 499, + 465, + 466, + 503, + 420, + 496, + 525, + 512, + 520, + 451, + 495, + 502, + 482, + 484, + 492, + 507, + 495, + 479, + 505, + 489, + 513, + 466, + 464, + 482, + 511, + 467, + 483, + 514, + 483, + 490, + 522, + 478, + 455, + 473, + 511, + 485, + 479, + 499, + 499, + 487, + 499, + 444, + 493, + 491, + 477, + 511, + 456, + 507, + 529, + 506, + 476, + 441, + 508, + 495, + 477, + 494, + 461, + 516, + 525, + 490, + 488, + 496, + 515, + 479, + 582, + 513, + 463, + 496, + 498, + 442, + 477, + 509, + 499, + 473, + 495, + 490, + 525, + 474, + 496, + 458, + 501, + 471, + 474, + 501, + 477, + 503, + 465, + 517, + 520, + 469, + 506, + 492, + 508, + 481, + 488, + 507, + 491, + 531, + 526, + 463, + 517, + 452, + 474, + 488, + 503, + 492, + 505, + 442, + 474, + 461, + 493, + 466, + 493, + 461, + 486, + 475, + 480, + 507, + 502, + 493, + 490, + 490, + 483, + 479, + 484, + 507, + 451, + 465, + 450, + 517, + 502, + 502, + 485, + 481, + 471, + 498, + 465, + 462, + 484, + 437, + 460, + 495, + 438, + 462, + 462, + 510, + 529, + 484, + 485, + 488, + 509, + 453, + 499, + 500, + 499, + 479, + 528, + 487, + 483, + 481, + 474, + 489, + 478, + 475, + 471, + 486, + 476, + 479, + 534, + 480, + 494, + 482, + 507, + 530, + 487, + 497, + 473, + 473, + 472, + 458, + 442, + 440, + 459, + 505, + 502, + 498, + 467, + 500, + 505, + 517, + 522, + 479, + 494, + 487, + 457, + 472, + 480, + 517, + 483, + 514, + 486, + 471, + 457, + 504, + 471, + 466, + 494, + 508, + 465, + 487, + 522, + 500, + 484, + 487, + 482, + 450, + 494, + 527, + 483, + 479, + 472, + 521, + 464, + 486, + 512, + 489, + 503, + 478, + 492, + 527, + 507, + 528, + 507, + 478, + 462, + 461, + 462, + 497, + 543, + 498, + 477, + 492, + 493, + 466, + 480, + 509, + 530, + 448, + 522, + 475, + 484, + 455, + 444, + 477, + 491, + 494, + 450, + 494, + 507, + 515, + 447, + 512, + 506, + 486, + 452, + 491, + 472, + 513, + 511, + 503, + 504, + 477, + 501, + 516, + 494, + 480, + 516, + 482, + 480, + 483, + 440, + 492, + 464, + 501, + 498, + 506, + 500, + 497, + 472, + 527, + 520, + 459, + 504, + 495, + 474, + 489, + 452, + 499, + 485, + 466, + 512, + 500, + 485, + 516, + 495, + 476, + 514, + 494, + 497, + 492, + 476, + 501, + 501, + 465, + 510, + 502, + 476, + 525, + 517, + 526, + 521, + 491, + 481, + 480, + 455, + 469, + 477, + 523, + 515, + 511, + 429, + 481, + 522, + 515, + 473, + 481, + 511, + 492, + 479, + 478, + 479, + 526, + 499, + 438, + 491, + 535, + 497, + 426, + 495, + 489, + 465, + 467, + 485, + 443, + 461, + 466, + 462, + 467, + 553, + 502, + 504, + 496, + 481, + 454, + 454, + 458, + 528, + 493, + 482, + 505, + 495, + 522, + 473, + 494, + 442, + 499, + 484, + 496, + 561, + 438, + 512, + 468, + 514, + 472, + 464, + 503, + 526, + 480, + 512, + 467, + 465, + 444, + 504, + 503, + 486, + 490, + 492, + 490, + 524, + 474, + 491, + 488, + 497, + 514, + 483, + 452, + 472, + 532, + 491, + 481, + 487, + 509, + 512, + 507, + 490, + 456, + 511, + 507, + 477, + 452, + 510, + 469, + 481, + 467, + 497, + 461, + 510, + 487, + 491, + 508, + 467, + 463, + 433, + 500, + 488, + 483, + 460, + 508, + 512, + 447, + 470, + 466, + 492, + 502, + 510, + 481, + 537, + 515, + 524, + 506, + 501, + 535, + 526, + 537, + 492, + 466, + 518, + 502, + 528, + 494, + 416, + 483, + 465, + 505, + 472, + 518 + ] + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 2991746, + "last_update_version": 417600050985172992, + "correlation": 1 + }, + "b": { + "histogram": { + "ndv": 1000000, + "buckets": [ + { + "count": 3998, + "lower_bound": "ODQz", + "upper_bound": "MjkyMQ==", + "repeats": 1 + }, + { + "count": 7996, + "lower_bound": "NDAwOQ==", + "upper_bound": "NzQyOQ==", + "repeats": 1 + }, + { + "count": 11994, + "lower_bound": "NzUxOA==", + "upper_bound": "MTA0NTE=", + "repeats": 1 + }, + { + "count": 15992, + "lower_bound": "MTA5OTA=", + "upper_bound": "MTI2MTQ=", + "repeats": 1 + }, + { + "count": 19990, + "lower_bound": "MTM0MTY=", + "upper_bound": "MTYwNTA=", + "repeats": 1 + }, + { + "count": 23988, + "lower_bound": "MTY0OTE=", + "upper_bound": "MjA3MzY=", + "repeats": 1 + }, + { + "count": 27986, + "lower_bound": "MjA5ODY=", + "upper_bound": "MjM1MTA=", + "repeats": 1 + }, + { + "count": 31984, + "lower_bound": "MjQwNDI=", + "upper_bound": "Mjc4ODg=", + "repeats": 1 + }, + { + "count": 35982, + "lower_bound": "MjgwMjY=", + "upper_bound": "MzA0NTc=", + "repeats": 1 + }, + { + "count": 39980, + "lower_bound": "MzA3Mjg=", + "upper_bound": "MzQxNjU=", + "repeats": 1 + }, + { + "count": 43978, + "lower_bound": "MzQzMzI=", + "upper_bound": "MzY2NjI=", + "repeats": 1 + }, + { + "count": 47976, + "lower_bound": "MzcwODk=", + "upper_bound": "NDEyOTc=", + "repeats": 1 + }, + { + "count": 51974, + "lower_bound": "NDEzMzk=", + "upper_bound": "NDQxNzI=", + "repeats": 1 + }, + { + "count": 55972, + "lower_bound": "NDQzNzc=", + "upper_bound": "NDY1Nzc=", + "repeats": 1 + }, + { + "count": 59970, + "lower_bound": "NDc0NDM=", + "upper_bound": "NDg3NzI=", + "repeats": 1 + }, + { + "count": 63968, + "lower_bound": "NDkxNDg=", + "upper_bound": "NTI5OTE=", + "repeats": 1 + }, + { + "count": 67966, + "lower_bound": "NTM1NzQ=", + "upper_bound": "NTU5NjE=", + "repeats": 1 + }, + { + "count": 71964, + "lower_bound": "NTU5NjM=", + "upper_bound": "NTc2NzQ=", + "repeats": 1 + }, + { + "count": 75962, + "lower_bound": "NTc5Njg=", + "upper_bound": "NjEyODU=", + "repeats": 1 + }, + { + "count": 79960, + "lower_bound": "NjEzMDU=", + "upper_bound": "NjM4MTQ=", + "repeats": 1 + }, + { + "count": 83958, + "lower_bound": "NjM5MDY=", + "upper_bound": "NjYyNDc=", + "repeats": 1 + }, + { + "count": 87956, + "lower_bound": "NjY5MDY=", + "upper_bound": "NzA0Njk=", + "repeats": 1 + }, + { + "count": 91954, + "lower_bound": "NzA0ODQ=", + "upper_bound": "NzI2MTE=", + "repeats": 1 + }, + { + "count": 95952, + "lower_bound": "NzI4NzQ=", + "upper_bound": "NzU1MzE=", + "repeats": 1 + }, + { + "count": 99950, + "lower_bound": "NzU2NTc=", + "upper_bound": "NzY5MzY=", + "repeats": 1 + }, + { + "count": 103948, + "lower_bound": "NzcxNTU=", + "upper_bound": "NzkyMTc=", + "repeats": 1 + }, + { + "count": 107946, + "lower_bound": "NzkyOTc=", + "upper_bound": "ODIxMzQ=", + "repeats": 1 + }, + { + "count": 111944, + "lower_bound": "ODI2NDY=", + "upper_bound": "ODQwMTQ=", + "repeats": 1 + }, + { + "count": 115942, + "lower_bound": "ODQyNjA=", + "upper_bound": "ODYwNzQ=", + "repeats": 1 + }, + { + "count": 119940, + "lower_bound": "ODYyMTI=", + "upper_bound": "ODg2MjY=", + "repeats": 1 + }, + { + "count": 123938, + "lower_bound": "ODg4Njc=", + "upper_bound": "OTE3Mzg=", + "repeats": 1 + }, + { + "count": 127936, + "lower_bound": "OTI0NDA=", + "upper_bound": "OTUzNzY=", + "repeats": 1 + }, + { + "count": 131934, + "lower_bound": "OTU2MTA=", + "upper_bound": "OTk1OTU=", + "repeats": 1 + }, + { + "count": 135932, + "lower_bound": "OTk4Njc=", + "upper_bound": "MTAzMDE4", + "repeats": 1 + }, + { + "count": 139930, + "lower_bound": "MTAzMDQ5", + "upper_bound": "MTA0NDU0", + "repeats": 1 + }, + { + "count": 143928, + "lower_bound": "MTA0NTY5", + "upper_bound": "MTA5NTg0", + "repeats": 1 + }, + { + "count": 147926, + "lower_bound": "MTEwMDI0", + "upper_bound": "MTEzMzEy", + "repeats": 1 + }, + { + "count": 151924, + "lower_bound": "MTEzNDYx", + "upper_bound": "MTE1OTkz", + "repeats": 1 + }, + { + "count": 155922, + "lower_bound": "MTE2NzU0", + "upper_bound": "MTIwOTcx", + "repeats": 1 + }, + { + "count": 159920, + "lower_bound": "MTIxNDU3", + "upper_bound": "MTIzMzY1", + "repeats": 1 + }, + { + "count": 163918, + "lower_bound": "MTI0MTY4", + "upper_bound": "MTI2MTk0", + "repeats": 1 + }, + { + "count": 167916, + "lower_bound": "MTI2Mzc2", + "upper_bound": "MTI5OTk1", + "repeats": 1 + }, + { + "count": 171914, + "lower_bound": "MTMwMTg0", + "upper_bound": "MTM2MDAx", + "repeats": 1 + }, + { + "count": 175912, + "lower_bound": "MTM2MDM0", + "upper_bound": "MTM4ODY3", + "repeats": 1 + }, + { + "count": 179910, + "lower_bound": "MTM4OTM4", + "upper_bound": "MTQyNTMw", + "repeats": 1 + }, + { + "count": 183908, + "lower_bound": "MTQzNDI3", + "upper_bound": "MTQ1NDc0", + "repeats": 1 + }, + { + "count": 187906, + "lower_bound": "MTQ1OTcz", + "upper_bound": "MTQ4MDM4", + "repeats": 1 + }, + { + "count": 191904, + "lower_bound": "MTQ4MTAx", + "upper_bound": "MTUxMzM1", + "repeats": 1 + }, + { + "count": 195902, + "lower_bound": "MTUyMzY5", + "upper_bound": "MTU1NDc3", + "repeats": 1 + }, + { + "count": 199900, + "lower_bound": "MTU1NTc0", + "upper_bound": "MTU3MzM3", + "repeats": 1 + }, + { + "count": 203898, + "lower_bound": "MTU3NTEz", + "upper_bound": "MTU5NDE2", + "repeats": 1 + }, + { + "count": 207896, + "lower_bound": "MTU5NTE1", + "upper_bound": "MTY0OTg1", + "repeats": 1 + }, + { + "count": 211894, + "lower_bound": "MTY1Mjg4", + "upper_bound": "MTY3Mjcy", + "repeats": 1 + }, + { + "count": 215892, + "lower_bound": "MTY3Njcz", + "upper_bound": "MTcxMzU0", + "repeats": 1 + }, + { + "count": 219890, + "lower_bound": "MTcxOTAy", + "upper_bound": "MTc0MDkw", + "repeats": 1 + }, + { + "count": 223888, + "lower_bound": "MTc0MzUy", + "upper_bound": "MTc3Mzc4", + "repeats": 1 + }, + { + "count": 227886, + "lower_bound": "MTc3NTMw", + "upper_bound": "MTgwOTEy", + "repeats": 1 + }, + { + "count": 231884, + "lower_bound": "MTgxMzIx", + "upper_bound": "MTgzMDM1", + "repeats": 1 + }, + { + "count": 235882, + "lower_bound": "MTgzNDYw", + "upper_bound": "MTg0OTcw", + "repeats": 1 + }, + { + "count": 239880, + "lower_bound": "MTg1NTQ0", + "upper_bound": "MTg4NDg0", + "repeats": 1 + }, + { + "count": 243878, + "lower_bound": "MTg4NzU1", + "upper_bound": "MTkyODQ2", + "repeats": 1 + }, + { + "count": 247876, + "lower_bound": "MTkzMTk2", + "upper_bound": "MTk1NjA5", + "repeats": 1 + }, + { + "count": 251874, + "lower_bound": "MTk1NzQ1", + "upper_bound": "MTk3NjAy", + "repeats": 1 + }, + { + "count": 255872, + "lower_bound": "MTk3NzIy", + "upper_bound": "MjAxOTAw", + "repeats": 1 + }, + { + "count": 259870, + "lower_bound": "MjAyMDMy", + "upper_bound": "MjAzNjkz", + "repeats": 1 + }, + { + "count": 263868, + "lower_bound": "MjAzOTc0", + "upper_bound": "MjA1OTE1", + "repeats": 1 + }, + { + "count": 267866, + "lower_bound": "MjA2MzEz", + "upper_bound": "MjA4MDc3", + "repeats": 1 + }, + { + "count": 271864, + "lower_bound": "MjA4MTgw", + "upper_bound": "MjA5ODMx", + "repeats": 1 + }, + { + "count": 275862, + "lower_bound": "MjEwMjkw", + "upper_bound": "MjEyMTEw", + "repeats": 1 + }, + { + "count": 279860, + "lower_bound": "MjEyNDg1", + "upper_bound": "MjE1NTY5", + "repeats": 1 + }, + { + "count": 283858, + "lower_bound": "MjE1NTg0", + "upper_bound": "MjE4MzQz", + "repeats": 1 + }, + { + "count": 287856, + "lower_bound": "MjE4OTI3", + "upper_bound": "MjIwNTk4", + "repeats": 1 + }, + { + "count": 291854, + "lower_bound": "MjIwNjQ4", + "upper_bound": "MjIyNzM1", + "repeats": 1 + }, + { + "count": 295852, + "lower_bound": "MjIyODgx", + "upper_bound": "MjI0NDM4", + "repeats": 1 + }, + { + "count": 299850, + "lower_bound": "MjI0ODUz", + "upper_bound": "MjI4MjIz", + "repeats": 1 + }, + { + "count": 303848, + "lower_bound": "MjI4Mjkz", + "upper_bound": "MjMxNDMz", + "repeats": 1 + }, + { + "count": 307846, + "lower_bound": "MjMyNDgw", + "upper_bound": "MjMzNjQ0", + "repeats": 1 + }, + { + "count": 311844, + "lower_bound": "MjMzNzYw", + "upper_bound": "MjM1NjI4", + "repeats": 1 + }, + { + "count": 315842, + "lower_bound": "MjM1NjUy", + "upper_bound": "MjM5MTEw", + "repeats": 1 + }, + { + "count": 319840, + "lower_bound": "MjM5MzUy", + "upper_bound": "MjQxNDk2", + "repeats": 1 + }, + { + "count": 323838, + "lower_bound": "MjQxNzA0", + "upper_bound": "MjQzMTQ2", + "repeats": 1 + }, + { + "count": 327836, + "lower_bound": "MjQzMjM5", + "upper_bound": "MjQ1ODE0", + "repeats": 1 + }, + { + "count": 331834, + "lower_bound": "MjQ1ODYw", + "upper_bound": "MjQ3NjA1", + "repeats": 1 + }, + { + "count": 335832, + "lower_bound": "MjQ3NjU2", + "upper_bound": "MjQ5OTYw", + "repeats": 1 + }, + { + "count": 339830, + "lower_bound": "MjUwMzcz", + "upper_bound": "MjUzMzk3", + "repeats": 1 + }, + { + "count": 343828, + "lower_bound": "MjUzNDgy", + "upper_bound": "MjU1MjEx", + "repeats": 1 + }, + { + "count": 347826, + "lower_bound": "MjU1NzMy", + "upper_bound": "MjU5OTY4", + "repeats": 1 + }, + { + "count": 351824, + "lower_bound": "MjYwMTcw", + "upper_bound": "MjYyNzky", + "repeats": 1 + }, + { + "count": 355822, + "lower_bound": "MjYzMTU1", + "upper_bound": "MjY1MDkz", + "repeats": 1 + }, + { + "count": 359820, + "lower_bound": "MjY1NTU3", + "upper_bound": "MjY3MzA4", + "repeats": 1 + }, + { + "count": 363818, + "lower_bound": "MjY3MzMw", + "upper_bound": "MjcxMDI2", + "repeats": 1 + }, + { + "count": 367816, + "lower_bound": "MjcxODcz", + "upper_bound": "Mjc0NDM1", + "repeats": 1 + }, + { + "count": 371814, + "lower_bound": "Mjc0NTE2", + "upper_bound": "Mjc3MDQ1", + "repeats": 1 + }, + { + "count": 375812, + "lower_bound": "Mjc3Njc2", + "upper_bound": "MjgwOTk2", + "repeats": 1 + }, + { + "count": 379810, + "lower_bound": "MjgxMjE0", + "upper_bound": "Mjg0NzI0", + "repeats": 1 + }, + { + "count": 383808, + "lower_bound": "Mjg2NTU2", + "upper_bound": "Mjg3Nzg1", + "repeats": 1 + }, + { + "count": 387806, + "lower_bound": "Mjg4MTQy", + "upper_bound": "MjkwMjA2", + "repeats": 1 + }, + { + "count": 391804, + "lower_bound": "MjkwMjg1", + "upper_bound": "MjkyNTI4", + "repeats": 1 + }, + { + "count": 395802, + "lower_bound": "MjkyNTcx", + "upper_bound": "Mjk1MjA3", + "repeats": 1 + }, + { + "count": 399800, + "lower_bound": "Mjk1NDA2", + "upper_bound": "Mjk4MTMx", + "repeats": 1 + }, + { + "count": 403798, + "lower_bound": "Mjk4MTgx", + "upper_bound": "MzAwOTY2", + "repeats": 1 + }, + { + "count": 407796, + "lower_bound": "MzAwOTk1", + "upper_bound": "MzAzNzc3", + "repeats": 1 + }, + { + "count": 411794, + "lower_bound": "MzA0MDQ4", + "upper_bound": "MzA3OTg4", + "repeats": 1 + }, + { + "count": 415792, + "lower_bound": "MzA4MDM0", + "upper_bound": "MzEwMzcy", + "repeats": 1 + }, + { + "count": 419790, + "lower_bound": "MzEwNDM1", + "upper_bound": "MzE0NjQy", + "repeats": 1 + }, + { + "count": 423788, + "lower_bound": "MzE1Njg2", + "upper_bound": "MzE3NTk4", + "repeats": 1 + }, + { + "count": 427786, + "lower_bound": "MzE4Mzc5", + "upper_bound": "MzE5NDcx", + "repeats": 1 + }, + { + "count": 431784, + "lower_bound": "MzE5OTU2", + "upper_bound": "MzIxNDk1", + "repeats": 1 + }, + { + "count": 435782, + "lower_bound": "MzIxNTc3", + "upper_bound": "MzIzMDk1", + "repeats": 1 + }, + { + "count": 439780, + "lower_bound": "MzIzMDk4", + "upper_bound": "MzI0NjM0", + "repeats": 1 + }, + { + "count": 443778, + "lower_bound": "MzI0NzMx", + "upper_bound": "MzI3MDQx", + "repeats": 1 + }, + { + "count": 447776, + "lower_bound": "MzI3NTg5", + "upper_bound": "MzI5OTcy", + "repeats": 1 + }, + { + "count": 451774, + "lower_bound": "MzMwMTEy", + "upper_bound": "MzMzMjM0", + "repeats": 1 + }, + { + "count": 455772, + "lower_bound": "MzMzMzc2", + "upper_bound": "MzM1NjYz", + "repeats": 1 + }, + { + "count": 459770, + "lower_bound": "MzM2NDMy", + "upper_bound": "MzM4NzA4", + "repeats": 1 + }, + { + "count": 463768, + "lower_bound": "MzM4ODYz", + "upper_bound": "MzQwNjc5", + "repeats": 1 + }, + { + "count": 467766, + "lower_bound": "MzQwNzIw", + "upper_bound": "MzQzNDE0", + "repeats": 1 + }, + { + "count": 471764, + "lower_bound": "MzQzNzE2", + "upper_bound": "MzQ1NDEy", + "repeats": 1 + }, + { + "count": 475762, + "lower_bound": "MzQ1NTU4", + "upper_bound": "MzQ4NTA5", + "repeats": 1 + }, + { + "count": 479760, + "lower_bound": "MzQ5MzM3", + "upper_bound": "MzUwNjc5", + "repeats": 1 + }, + { + "count": 483758, + "lower_bound": "MzUwODAx", + "upper_bound": "MzUzMjU2", + "repeats": 1 + }, + { + "count": 487756, + "lower_bound": "MzUzMzMx", + "upper_bound": "MzU2MDk1", + "repeats": 1 + }, + { + "count": 491754, + "lower_bound": "MzU2NDcz", + "upper_bound": "MzU4MTUy", + "repeats": 1 + }, + { + "count": 495752, + "lower_bound": "MzU4NDAx", + "upper_bound": "MzYyMDcz", + "repeats": 1 + }, + { + "count": 499750, + "lower_bound": "MzYyNDky", + "upper_bound": "MzY1ODkx", + "repeats": 1 + }, + { + "count": 503748, + "lower_bound": "MzY1OTI0", + "upper_bound": "MzY4NTc3", + "repeats": 1 + }, + { + "count": 507746, + "lower_bound": "MzY5NDEy", + "upper_bound": "MzczNjQ0", + "repeats": 1 + }, + { + "count": 511744, + "lower_bound": "Mzc0MjIx", + "upper_bound": "Mzc3MjU3", + "repeats": 1 + }, + { + "count": 515742, + "lower_bound": "Mzc4NjAw", + "upper_bound": "Mzg5Njg1", + "repeats": 1 + }, + { + "count": 519740, + "lower_bound": "Mzg5ODI1", + "upper_bound": "Mzk0NTcx", + "repeats": 1 + }, + { + "count": 523738, + "lower_bound": "Mzk1ODc2", + "upper_bound": "NDAyNTg1", + "repeats": 1 + }, + { + "count": 527736, + "lower_bound": "NDAzODYy", + "upper_bound": "NDA4ODI1", + "repeats": 1 + }, + { + "count": 531734, + "lower_bound": "NDA5MTI4", + "upper_bound": "NDEzNDc5", + "repeats": 1 + }, + { + "count": 535732, + "lower_bound": "NDE0MTQ5", + "upper_bound": "NDE5MDc2", + "repeats": 1 + }, + { + "count": 539730, + "lower_bound": "NDE5MzUy", + "upper_bound": "NDI3MjE4", + "repeats": 1 + }, + { + "count": 543728, + "lower_bound": "NDI3MzU2", + "upper_bound": "NDMxNjA5", + "repeats": 1 + }, + { + "count": 547726, + "lower_bound": "NDMxNjM2", + "upper_bound": "NDM0MDk1", + "repeats": 1 + }, + { + "count": 551724, + "lower_bound": "NDM0Njk2", + "upper_bound": "NDM3Nzg0", + "repeats": 1 + }, + { + "count": 555722, + "lower_bound": "NDM4MjA3", + "upper_bound": "NDQ0MDk0", + "repeats": 1 + }, + { + "count": 559720, + "lower_bound": "NDQ0MTYz", + "upper_bound": "NDUxNjEy", + "repeats": 1 + }, + { + "count": 563718, + "lower_bound": "NDUxOTM5", + "upper_bound": "NDU1MjUw", + "repeats": 1 + }, + { + "count": 567716, + "lower_bound": "NDU1Nzgx", + "upper_bound": "NDY0MjQ1", + "repeats": 1 + }, + { + "count": 571714, + "lower_bound": "NDY1MDQz", + "upper_bound": "NDY4MDY1", + "repeats": 1 + }, + { + "count": 575712, + "lower_bound": "NDY5OTI4", + "upper_bound": "NDc4MDE2", + "repeats": 1 + }, + { + "count": 579710, + "lower_bound": "NDc4MDYx", + "upper_bound": "NDgzNTU4", + "repeats": 1 + }, + { + "count": 583708, + "lower_bound": "NDgzNTYx", + "upper_bound": "NDg3MjM0", + "repeats": 1 + }, + { + "count": 587706, + "lower_bound": "NDg3Mjc0", + "upper_bound": "NDkzMTc1", + "repeats": 1 + }, + { + "count": 591704, + "lower_bound": "NDkzNjc2", + "upper_bound": "NDk3MTk5", + "repeats": 1 + }, + { + "count": 595702, + "lower_bound": "NDk3MjM1", + "upper_bound": "NTAzMjMz", + "repeats": 1 + }, + { + "count": 599700, + "lower_bound": "NTAzOTU5", + "upper_bound": "NTA3MzAx", + "repeats": 1 + }, + { + "count": 603698, + "lower_bound": "NTA3NDY5", + "upper_bound": "NTEwMjMx", + "repeats": 1 + }, + { + "count": 607696, + "lower_bound": "NTExNzI0", + "upper_bound": "NTE3OTY1", + "repeats": 1 + }, + { + "count": 611694, + "lower_bound": "NTE4NTg5", + "upper_bound": "NTIxNzIy", + "repeats": 1 + }, + { + "count": 615692, + "lower_bound": "NTIxNzU2", + "upper_bound": "NTI2Mjgx", + "repeats": 1 + }, + { + "count": 619690, + "lower_bound": "NTI3OTU2", + "upper_bound": "NTMxNjMy", + "repeats": 1 + }, + { + "count": 623688, + "lower_bound": "NTMxNzgz", + "upper_bound": "NTM0Nzg0", + "repeats": 1 + }, + { + "count": 627686, + "lower_bound": "NTM1NTI4", + "upper_bound": "NTM4NTg3", + "repeats": 1 + }, + { + "count": 631684, + "lower_bound": "NTQwODQw", + "upper_bound": "NTQ0MzY5", + "repeats": 1 + }, + { + "count": 635682, + "lower_bound": "NTQ2MDc3", + "upper_bound": "NTUwNDg0", + "repeats": 1 + }, + { + "count": 639680, + "lower_bound": "NTUxMzgx", + "upper_bound": "NTU2MDM2", + "repeats": 1 + }, + { + "count": 643678, + "lower_bound": "NTU2OTkx", + "upper_bound": "NTU5MTg0", + "repeats": 1 + }, + { + "count": 647676, + "lower_bound": "NTU5NDc3", + "upper_bound": "NTYyODQw", + "repeats": 1 + }, + { + "count": 651674, + "lower_bound": "NTYzMzEz", + "upper_bound": "NTY1ODE0", + "repeats": 1 + }, + { + "count": 655672, + "lower_bound": "NTY4NzQ2", + "upper_bound": "NTczNjQ1", + "repeats": 1 + }, + { + "count": 659670, + "lower_bound": "NTczODMx", + "upper_bound": "NTc3MjA0", + "repeats": 1 + }, + { + "count": 663668, + "lower_bound": "NTc5NDYx", + "upper_bound": "NTg0MTQz", + "repeats": 1 + }, + { + "count": 667666, + "lower_bound": "NTg0NzI4", + "upper_bound": "NTg5NjI3", + "repeats": 1 + }, + { + "count": 671664, + "lower_bound": "NTg5NjQ2", + "upper_bound": "NTk1MjM3", + "repeats": 1 + }, + { + "count": 675662, + "lower_bound": "NTk1MzU4", + "upper_bound": "NjAwOTc2", + "repeats": 1 + }, + { + "count": 679660, + "lower_bound": "NjAyMDcz", + "upper_bound": "NjA0ODU1", + "repeats": 1 + }, + { + "count": 683658, + "lower_bound": "NjA1NDkx", + "upper_bound": "NjEwMTQz", + "repeats": 1 + }, + { + "count": 687656, + "lower_bound": "NjEwMTk2", + "upper_bound": "NjE0MTM5", + "repeats": 1 + }, + { + "count": 691654, + "lower_bound": "NjE0MzM3", + "upper_bound": "NjIxNzgz", + "repeats": 1 + }, + { + "count": 695652, + "lower_bound": "NjIzMTEy", + "upper_bound": "NjI1NDYz", + "repeats": 1 + }, + { + "count": 699650, + "lower_bound": "NjI1Nzkw", + "upper_bound": "NjI4NTQ2", + "repeats": 1 + }, + { + "count": 703648, + "lower_bound": "NjI4OTky", + "upper_bound": "NjM1ODk4", + "repeats": 1 + }, + { + "count": 707646, + "lower_bound": "NjM3NTk2", + "upper_bound": "NjQzMjgy", + "repeats": 1 + }, + { + "count": 711644, + "lower_bound": "NjQzMzc2", + "upper_bound": "NjQ3MDM3", + "repeats": 1 + }, + { + "count": 715642, + "lower_bound": "NjQ3NzY1", + "upper_bound": "NjUwOTEx", + "repeats": 1 + }, + { + "count": 719640, + "lower_bound": "NjUxNzM1", + "upper_bound": "NjU0NTE5", + "repeats": 1 + }, + { + "count": 723638, + "lower_bound": "NjU0OTA2", + "upper_bound": "NjU2Njg0", + "repeats": 1 + }, + { + "count": 727636, + "lower_bound": "NjU3MTUx", + "upper_bound": "NjYyMTQ5", + "repeats": 1 + }, + { + "count": 731634, + "lower_bound": "NjYyNjQw", + "upper_bound": "NjY1MjM3", + "repeats": 1 + }, + { + "count": 735632, + "lower_bound": "NjY2MDEx", + "upper_bound": "NjcyOTcx", + "repeats": 1 + }, + { + "count": 739630, + "lower_bound": "Njc0Nzcy", + "upper_bound": "NjgyMzc4", + "repeats": 1 + }, + { + "count": 743628, + "lower_bound": "NjgyNzY4", + "upper_bound": "Njg4MTU0", + "repeats": 1 + }, + { + "count": 747626, + "lower_bound": "Njg4MzMx", + "upper_bound": "NjkyNTE1", + "repeats": 1 + }, + { + "count": 751624, + "lower_bound": "NjkyNTQz", + "upper_bound": "Njk3ODA1", + "repeats": 1 + }, + { + "count": 755622, + "lower_bound": "Njk4NjQw", + "upper_bound": "NzAxNzQ0", + "repeats": 1 + }, + { + "count": 759620, + "lower_bound": "NzAyMDg3", + "upper_bound": "NzA0MTU1", + "repeats": 1 + }, + { + "count": 763618, + "lower_bound": "NzA0NTcx", + "upper_bound": "NzA4MjY1", + "repeats": 1 + }, + { + "count": 767616, + "lower_bound": "NzA4MzAz", + "upper_bound": "NzEyNzUz", + "repeats": 1 + }, + { + "count": 771614, + "lower_bound": "NzE0NDg1", + "upper_bound": "NzE4ODc5", + "repeats": 1 + }, + { + "count": 775612, + "lower_bound": "NzIwMDky", + "upper_bound": "NzIzMTk4", + "repeats": 1 + }, + { + "count": 779610, + "lower_bound": "NzIzOTYy", + "upper_bound": "NzI3Njg3", + "repeats": 1 + }, + { + "count": 783608, + "lower_bound": "NzI4MDQ3", + "upper_bound": "NzMyOTAw", + "repeats": 1 + }, + { + "count": 787606, + "lower_bound": "NzM0NTYx", + "upper_bound": "NzM5MTU0", + "repeats": 1 + }, + { + "count": 791604, + "lower_bound": "NzM5OTk5", + "upper_bound": "NzQ1NDg4", + "repeats": 1 + }, + { + "count": 795602, + "lower_bound": "NzQ1NDk3", + "upper_bound": "NzUwNzU0", + "repeats": 1 + }, + { + "count": 799600, + "lower_bound": "NzUwODk3", + "upper_bound": "NzU1NDA0", + "repeats": 1 + }, + { + "count": 803598, + "lower_bound": "NzU3NTI5", + "upper_bound": "NzYxMDgy", + "repeats": 1 + }, + { + "count": 807596, + "lower_bound": "NzYxMDkw", + "upper_bound": "NzY2ODM2", + "repeats": 1 + }, + { + "count": 811594, + "lower_bound": "NzY4MTMy", + "upper_bound": "NzcwNjE4", + "repeats": 1 + }, + { + "count": 815592, + "lower_bound": "NzcxODUx", + "upper_bound": "Nzc1MDI2", + "repeats": 1 + }, + { + "count": 819590, + "lower_bound": "Nzc2MDY5", + "upper_bound": "Nzc4ODcy", + "repeats": 1 + }, + { + "count": 823588, + "lower_bound": "Nzc5MTEz", + "upper_bound": "NzgyNjMy", + "repeats": 1 + }, + { + "count": 827586, + "lower_bound": "NzgyOTY4", + "upper_bound": "Nzg2NTAz", + "repeats": 1 + }, + { + "count": 831584, + "lower_bound": "Nzg2NTI2", + "upper_bound": "NzkyMDMy", + "repeats": 1 + }, + { + "count": 835582, + "lower_bound": "NzkyMTQ1", + "upper_bound": "Nzk2NzUz", + "repeats": 1 + }, + { + "count": 839580, + "lower_bound": "Nzk3MDEz", + "upper_bound": "ODAzNjUw", + "repeats": 1 + }, + { + "count": 843578, + "lower_bound": "ODAzOTU4", + "upper_bound": "ODA4MTAy", + "repeats": 1 + }, + { + "count": 847576, + "lower_bound": "ODA4Mjgw", + "upper_bound": "ODEzMDE3", + "repeats": 1 + }, + { + "count": 851574, + "lower_bound": "ODEzNDA0", + "upper_bound": "ODE3Njcy", + "repeats": 1 + }, + { + "count": 855572, + "lower_bound": "ODE3NzM4", + "upper_bound": "ODI1MTAx", + "repeats": 1 + }, + { + "count": 859570, + "lower_bound": "ODI1MTMy", + "upper_bound": "ODI5OTA4", + "repeats": 1 + }, + { + "count": 863568, + "lower_bound": "ODMwOTky", + "upper_bound": "ODM0Mjc0", + "repeats": 1 + }, + { + "count": 867566, + "lower_bound": "ODM1MDQ4", + "upper_bound": "ODM5NjI2", + "repeats": 1 + }, + { + "count": 871564, + "lower_bound": "ODM5Njc3", + "upper_bound": "ODQzNjUw", + "repeats": 1 + }, + { + "count": 875562, + "lower_bound": "ODQ2MzA3", + "upper_bound": "ODQ5NTQz", + "repeats": 1 + }, + { + "count": 879560, + "lower_bound": "ODQ5NTg1", + "upper_bound": "ODU3MTIx", + "repeats": 1 + }, + { + "count": 883558, + "lower_bound": "ODU3NDM1", + "upper_bound": "ODYyNTMy", + "repeats": 1 + }, + { + "count": 887556, + "lower_bound": "ODYyODY3", + "upper_bound": "ODY4MjEy", + "repeats": 1 + }, + { + "count": 891554, + "lower_bound": "ODY4NjAw", + "upper_bound": "ODcxMTMz", + "repeats": 1 + }, + { + "count": 895552, + "lower_bound": "ODcxMjAx", + "upper_bound": "ODc2OTI4", + "repeats": 1 + }, + { + "count": 899550, + "lower_bound": "ODc4MTIx", + "upper_bound": "ODgyNDIw", + "repeats": 1 + }, + { + "count": 903548, + "lower_bound": "ODgzODUy", + "upper_bound": "ODg4OTkz", + "repeats": 1 + }, + { + "count": 907546, + "lower_bound": "ODg5MzI1", + "upper_bound": "ODkyOTg1", + "repeats": 1 + }, + { + "count": 911544, + "lower_bound": "ODkzMTI3", + "upper_bound": "ODk3NDE4", + "repeats": 1 + }, + { + "count": 915542, + "lower_bound": "ODk3NTc3", + "upper_bound": "OTAxNDA3", + "repeats": 1 + }, + { + "count": 919540, + "lower_bound": "OTAyNTA0", + "upper_bound": "OTA0OTM3", + "repeats": 1 + }, + { + "count": 923538, + "lower_bound": "OTA1Mzg2", + "upper_bound": "OTA5MjY3", + "repeats": 1 + }, + { + "count": 927536, + "lower_bound": "OTA5NDky", + "upper_bound": "OTEzNDg5", + "repeats": 1 + }, + { + "count": 931534, + "lower_bound": "OTEzNjE3", + "upper_bound": "OTE2MDIy", + "repeats": 1 + }, + { + "count": 935532, + "lower_bound": "OTE2MTA5", + "upper_bound": "OTIwNzcw", + "repeats": 1 + }, + { + "count": 939530, + "lower_bound": "OTIxMzQ1", + "upper_bound": "OTMwNTg5", + "repeats": 1 + }, + { + "count": 943528, + "lower_bound": "OTMwNjM1", + "upper_bound": "OTMzNTIw", + "repeats": 1 + }, + { + "count": 947526, + "lower_bound": "OTM0MTk2", + "upper_bound": "OTM5MzM1", + "repeats": 1 + }, + { + "count": 951524, + "lower_bound": "OTM5NDM4", + "upper_bound": "OTQxODY2", + "repeats": 1 + }, + { + "count": 955522, + "lower_bound": "OTQyMjM3", + "upper_bound": "OTQ4Nzk4", + "repeats": 1 + }, + { + "count": 959520, + "lower_bound": "OTUwMDQ4", + "upper_bound": "OTUyNjUy", + "repeats": 1 + }, + { + "count": 963518, + "lower_bound": "OTUyOTg3", + "upper_bound": "OTU2MDI3", + "repeats": 1 + }, + { + "count": 967516, + "lower_bound": "OTU2MjM1", + "upper_bound": "OTYwNzU2", + "repeats": 1 + }, + { + "count": 971514, + "lower_bound": "OTYxMzY3", + "upper_bound": "OTY1Mzkw", + "repeats": 1 + }, + { + "count": 975512, + "lower_bound": "OTY1NzE5", + "upper_bound": "OTY4NTQz", + "repeats": 1 + }, + { + "count": 979510, + "lower_bound": "OTY5MjE5", + "upper_bound": "OTc0Nzkx", + "repeats": 1 + }, + { + "count": 983508, + "lower_bound": "OTc1MjU4", + "upper_bound": "OTc5MjQy", + "repeats": 1 + }, + { + "count": 987506, + "lower_bound": "OTc5MzEz", + "upper_bound": "OTgyODA2", + "repeats": 1 + }, + { + "count": 991504, + "lower_bound": "OTgzMjQ5", + "upper_bound": "OTg3ODcw", + "repeats": 1 + }, + { + "count": 995502, + "lower_bound": "OTg4MTMy", + "upper_bound": "OTkxMzI0", + "repeats": 1 + }, + { + "count": 999500, + "lower_bound": "OTkxNjgx", + "upper_bound": "OTk4NDg4", + "repeats": 1 + }, + { + "count": 1000000, + "lower_bound": "OTk5MTY2", + "upper_bound": "OTk5MTY2", + "repeats": 1 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 495, + 474, + 474, + 471, + 509, + 474, + 509, + 527, + 490, + 509, + 475, + 503, + 506, + 489, + 472, + 504, + 513, + 469, + 508, + 480, + 476, + 529, + 488, + 486, + 513, + 477, + 507, + 477, + 514, + 533, + 456, + 512, + 460, + 474, + 473, + 489, + 472, + 517, + 459, + 516, + 489, + 491, + 497, + 492, + 472, + 508, + 498, + 496, + 438, + 472, + 485, + 452, + 484, + 493, + 477, + 471, + 534, + 500, + 466, + 499, + 476, + 458, + 493, + 481, + 497, + 473, + 479, + 490, + 469, + 519, + 471, + 483, + 482, + 489, + 506, + 544, + 504, + 492, + 457, + 506, + 479, + 477, + 491, + 464, + 496, + 509, + 492, + 471, + 440, + 479, + 476, + 505, + 522, + 498, + 442, + 471, + 492, + 499, + 516, + 494, + 477, + 493, + 500, + 478, + 496, + 482, + 508, + 500, + 495, + 490, + 456, + 501, + 541, + 469, + 507, + 497, + 477, + 450, + 515, + 472, + 501, + 500, + 514, + 480, + 459, + 476, + 470, + 491, + 493, + 520, + 535, + 508, + 494, + 549, + 501, + 489, + 528, + 511, + 488, + 449, + 455, + 452, + 482, + 474, + 514, + 472, + 445, + 476, + 505, + 484, + 466, + 489, + 510, + 495, + 489, + 479, + 467, + 521, + 480, + 500, + 501, + 495, + 457, + 457, + 487, + 487, + 502, + 477, + 472, + 498, + 473, + 489, + 486, + 480, + 531, + 480, + 500, + 510, + 505, + 499, + 477, + 473, + 506, + 475, + 494, + 496, + 447, + 490, + 500, + 474, + 513, + 512, + 470, + 480, + 480, + 539, + 476, + 506, + 503, + 481, + 526, + 493, + 449, + 500, + 467, + 497, + 461, + 497, + 502, + 468, + 475, + 497, + 501, + 510, + 469, + 477, + 439, + 497, + 469, + 494, + 492, + 482, + 495, + 470, + 438, + 512, + 485, + 525, + 460, + 541, + 500, + 476, + 502, + 510, + 476, + 482, + 520, + 435, + 447, + 487, + 487, + 461, + 485, + 461, + 488, + 531, + 519, + 476, + 444, + 490, + 510, + 506, + 492, + 465, + 507, + 512, + 517, + 492, + 481, + 490, + 488, + 487, + 453, + 490, + 536, + 494, + 515, + 504, + 504, + 510, + 511, + 489, + 478, + 461, + 522, + 503, + 495, + 508, + 469, + 454, + 522, + 537, + 482, + 506, + 493, + 501, + 513, + 450, + 493, + 476, + 499, + 491, + 468, + 504, + 524, + 488, + 469, + 478, + 457, + 473, + 481, + 469, + 479, + 491, + 488, + 483, + 509, + 523, + 517, + 497, + 520, + 491, + 453, + 520, + 508, + 486, + 488, + 489, + 543, + 469, + 498, + 471, + 472, + 495, + 507, + 473, + 497, + 487, + 493, + 462, + 475, + 474, + 490, + 518, + 492, + 462, + 488, + 497, + 474, + 502, + 550, + 490, + 452, + 492, + 465, + 488, + 467, + 490, + 513, + 448, + 510, + 490, + 459, + 477, + 487, + 500, + 501, + 505, + 491, + 506, + 443, + 482, + 466, + 482, + 459, + 461, + 523, + 502, + 466, + 469, + 504, + 494, + 483, + 440, + 497, + 499, + 483, + 500, + 484, + 500, + 527, + 454, + 493, + 445, + 474, + 486, + 507, + 490, + 479, + 493, + 459, + 474, + 492, + 482, + 497, + 483, + 516, + 499, + 462, + 522, + 482, + 498, + 486, + 464, + 504, + 496, + 498, + 493, + 481, + 462, + 508, + 484, + 485, + 479, + 487, + 489, + 493, + 471, + 495, + 541, + 495, + 472, + 482, + 461, + 471, + 501, + 480, + 460, + 503, + 500, + 511, + 492, + 491, + 450, + 520, + 462, + 510, + 499, + 460, + 515, + 519, + 455, + 495, + 470, + 464, + 509, + 479, + 456, + 466, + 523, + 478, + 461, + 496, + 500, + 469, + 506, + 512, + 490, + 523, + 485, + 452, + 528, + 486, + 458, + 468, + 476, + 510, + 500, + 499, + 485, + 478, + 526, + 526, + 493, + 478, + 491, + 503, + 467, + 506, + 478, + 501, + 453, + 520, + 499, + 469, + 479, + 479, + 497, + 483, + 492, + 476, + 511, + 469, + 510, + 508, + 457, + 482, + 475, + 504, + 462, + 508, + 455, + 518, + 516, + 485, + 505, + 478, + 504, + 476, + 486, + 484, + 495, + 510, + 476, + 491, + 469, + 450, + 472, + 497, + 470, + 491, + 504, + 469, + 479, + 481, + 521, + 470, + 524, + 508, + 487, + 466, + 427, + 544, + 489, + 491, + 471, + 505, + 497, + 469, + 478, + 490, + 461, + 462, + 446, + 487, + 492, + 493, + 484, + 521, + 545, + 457, + 490, + 470, + 471, + 522, + 494, + 483, + 468, + 487, + 490, + 472, + 470, + 471, + 484, + 488, + 500, + 496, + 465, + 483, + 477, + 499, + 465, + 446, + 495, + 472, + 468, + 461, + 513, + 493, + 467, + 481, + 488, + 481, + 507, + 503, + 494, + 500, + 487, + 492, + 516, + 484, + 433, + 524, + 507, + 522, + 506, + 482, + 464, + 503, + 460, + 502, + 511, + 490, + 517, + 520, + 523, + 520, + 478, + 486, + 511, + 508, + 487, + 495, + 511, + 466, + 478, + 504, + 485, + 480, + 483, + 482, + 469, + 488, + 513, + 517, + 501, + 452, + 482, + 466, + 471, + 460, + 476, + 478, + 514, + 487, + 473, + 507, + 520, + 487, + 484, + 484, + 487, + 468, + 465, + 439, + 469, + 485, + 494, + 488, + 508, + 477, + 495, + 465, + 525, + 502, + 501, + 475, + 487, + 456, + 512, + 515, + 476, + 444, + 470, + 526, + 521, + 550, + 517, + 523, + 456, + 465, + 486, + 477, + 475, + 479, + 481, + 513, + 550, + 505, + 488, + 467, + 518, + 493, + 485, + 452, + 506, + 483, + 495, + 497, + 500, + 465, + 502, + 500, + 468, + 480, + 491, + 487, + 461, + 490, + 452, + 467, + 462, + 472, + 510, + 477, + 494, + 481, + 500, + 476, + 494, + 485, + 496, + 520, + 474, + 455, + 484, + 517, + 492, + 506, + 498, + 495, + 518, + 466, + 467, + 487, + 511, + 506, + 523, + 481, + 453, + 475, + 472, + 501, + 511, + 480, + 509, + 475, + 466, + 479, + 464, + 492, + 485, + 455, + 490, + 478, + 482, + 461, + 481, + 501, + 506, + 479, + 498, + 485, + 451, + 510, + 475, + 482, + 473, + 459, + 443, + 496, + 449, + 447, + 459, + 451, + 527, + 469, + 509, + 464, + 450, + 476, + 496, + 494, + 493, + 479, + 532, + 505, + 487, + 425, + 462, + 484, + 475, + 478, + 510, + 486, + 509, + 479, + 498, + 522, + 552, + 449, + 507, + 531, + 514, + 454, + 476, + 496, + 482, + 494, + 479, + 519, + 500, + 495, + 536, + 447, + 487, + 533, + 524, + 495, + 466, + 475, + 547, + 525, + 485, + 499, + 477, + 457, + 515, + 447, + 489, + 435, + 480, + 485, + 492, + 483, + 496, + 458, + 447, + 475, + 491, + 487, + 481, + 489, + 482, + 487, + 489, + 485, + 485, + 458, + 480, + 474, + 496, + 523, + 491, + 457, + 488, + 503, + 490, + 525, + 451, + 502, + 481, + 499, + 478, + 491, + 510, + 487, + 500, + 493, + 458, + 485, + 504, + 500, + 455, + 519, + 478, + 477, + 486, + 481, + 488, + 499, + 492, + 510, + 489, + 487, + 493, + 452, + 505, + 464, + 489, + 476, + 463, + 483, + 471, + 468, + 475, + 447, + 468, + 448, + 502, + 481, + 489, + 512, + 507, + 451, + 475, + 502, + 484, + 496, + 517, + 482, + 499, + 453, + 515, + 481, + 474, + 518, + 493, + 462, + 481, + 507, + 507, + 476, + 474, + 484, + 487, + 484, + 537, + 508, + 552, + 486, + 476, + 500, + 481, + 458, + 508, + 510, + 474, + 469, + 518, + 449, + 462, + 511, + 466, + 459, + 507, + 474, + 448, + 467, + 484, + 519, + 478, + 481, + 501, + 507, + 485, + 483, + 489, + 477, + 517, + 504, + 511, + 468, + 506, + 445, + 529, + 507, + 518, + 467, + 494, + 493, + 464, + 499, + 488, + 484, + 490, + 515, + 525, + 492, + 463, + 494, + 454, + 528, + 455, + 479, + 470, + 474, + 491, + 509, + 479, + 477, + 450, + 485, + 492, + 494, + 468, + 454, + 513, + 488, + 463, + 425, + 486, + 498, + 517, + 457, + 521, + 459, + 508, + 526, + 490, + 500, + 457, + 450, + 484, + 504, + 511, + 512, + 447, + 542, + 430, + 496, + 482, + 485, + 501, + 487, + 486, + 477, + 471, + 541, + 456, + 484, + 514, + 503, + 488, + 480, + 489, + 484, + 470, + 468, + 467, + 491, + 466, + 492, + 516, + 479, + 510, + 522, + 485, + 473, + 488, + 477, + 482, + 448, + 475, + 528, + 476, + 459, + 529, + 492, + 501, + 479, + 507, + 483, + 435, + 486, + 537, + 455, + 496, + 489, + 466, + 508, + 494, + 507, + 502, + 483, + 501, + 498, + 552, + 463, + 519, + 460, + 496, + 456, + 475, + 519, + 491, + 506, + 502, + 491, + 498, + 435, + 500, + 514, + 484, + 490, + 513, + 492, + 461, + 505, + 488, + 455, + 465, + 512, + 495, + 438, + 481, + 494, + 501, + 472, + 461, + 527, + 521, + 505, + 479, + 512, + 516, + 485, + 506, + 493, + 460, + 447, + 469, + 502, + 472, + 470, + 499, + 483, + 477, + 465, + 502, + 509, + 492, + 468, + 504, + 457, + 519, + 477, + 503, + 485, + 479, + 508, + 481, + 517, + 477, + 480, + 474, + 473, + 477, + 463, + 471, + 504, + 495, + 481, + 490, + 515, + 472, + 478, + 446, + 483, + 507, + 452, + 461, + 504, + 491, + 514, + 479, + 516, + 479, + 476, + 491, + 491, + 494, + 513, + 505, + 491, + 473, + 518, + 512, + 497, + 515, + 442, + 497, + 513, + 453, + 482, + 471, + 549, + 459, + 507, + 516, + 460, + 496, + 503, + 495, + 474, + 493, + 464, + 553, + 486, + 497, + 468, + 473, + 508, + 551, + 547, + 438, + 467, + 483, + 488, + 463, + 479, + 500, + 517, + 497, + 498, + 498, + 491, + 456, + 472, + 525, + 533, + 479, + 491, + 480, + 450, + 505, + 463, + 487, + 451, + 495, + 512, + 466, + 498, + 498, + 510, + 523, + 496, + 478, + 468, + 513, + 508, + 512, + 465, + 509, + 500, + 500, + 488, + 504, + 459, + 495, + 463, + 515, + 480, + 510, + 495, + 468, + 487, + 514, + 487, + 479, + 447, + 492, + 490, + 508, + 457, + 476, + 503, + 485, + 486, + 535, + 462, + 510, + 474, + 475, + 484, + 487, + 515, + 485, + 493, + 502, + 456, + 486, + 543, + 509, + 500, + 461, + 504, + 503, + 447, + 488, + 445, + 458, + 458, + 508, + 466, + 477, + 479, + 503, + 453, + 511, + 535, + 532, + 497, + 490, + 495, + 496, + 472, + 451, + 502, + 482, + 479, + 468, + 464, + 484, + 537, + 439, + 474, + 482, + 502, + 472, + 492, + 517, + 488, + 481, + 506, + 485, + 486, + 459, + 468, + 478, + 446, + 464, + 506, + 434, + 558, + 491, + 514, + 474, + 482, + 472, + 471, + 484, + 523, + 473, + 467, + 518, + 516, + 443, + 457, + 513, + 451, + 483, + 485, + 501, + 491, + 490, + 480, + 457, + 493, + 493, + 518, + 521, + 485, + 481, + 504, + 495, + 491, + 483, + 514, + 500, + 460, + 469, + 514, + 484, + 480, + 515, + 498, + 494, + 496, + 506, + 487, + 480, + 483, + 503, + 496, + 492, + 432, + 442, + 482, + 514, + 492, + 485, + 488, + 467, + 480, + 458, + 482, + 529, + 528, + 456, + 528, + 485, + 517, + 457, + 501, + 490, + 471, + 455, + 513, + 460, + 502, + 505, + 498, + 476, + 508, + 484, + 500, + 487, + 499, + 478, + 473, + 483, + 500, + 496, + 485, + 506, + 450, + 487, + 537, + 470, + 461, + 486, + 492, + 511, + 473, + 482, + 511, + 484, + 494, + 492, + 485, + 498, + 511, + 477, + 488, + 487, + 474, + 500, + 454, + 515, + 477, + 507, + 505, + 485, + 527, + 456, + 493, + 484, + 509, + 526, + 473, + 458, + 493, + 524, + 511, + 497, + 481, + 504, + 484, + 486, + 489, + 477, + 515, + 489, + 520, + 506, + 475, + 517, + 465, + 490, + 504, + 480, + 461, + 504, + 524, + 477, + 465, + 507, + 471, + 486, + 503, + 453, + 481, + 493, + 490, + 482, + 495, + 508, + 482, + 431, + 487, + 503, + 479, + 495, + 493, + 501, + 515, + 516, + 469, + 460, + 448, + 530, + 468, + 510, + 472, + 491, + 464, + 501, + 502, + 483, + 508, + 499, + 494, + 456, + 425, + 489, + 548, + 484, + 489, + 505, + 481, + 497, + 495, + 465, + 490, + 475, + 494, + 505, + 530, + 479, + 506, + 489, + 529, + 462, + 502, + 478, + 487, + 464, + 471, + 477, + 496, + 479, + 462, + 500, + 507, + 481, + 489, + 509, + 519, + 504, + 511, + 470, + 428, + 482, + 526, + 502, + 465, + 448, + 460, + 449, + 509, + 480, + 491, + 493, + 485, + 461, + 474, + 432, + 488, + 508, + 500, + 451, + 468, + 473, + 501, + 495, + 454, + 510, + 478, + 506, + 511, + 517, + 463, + 477, + 466, + 517, + 478, + 464, + 477, + 493, + 526, + 489, + 471, + 511, + 488, + 499, + 512, + 484, + 494, + 544, + 482, + 487, + 492, + 506, + 520, + 484, + 493, + 485, + 504, + 512, + 469, + 478, + 480, + 504, + 511, + 487, + 509, + 480, + 502, + 464, + 468, + 486, + 484, + 493, + 532, + 441, + 520, + 499, + 523, + 467, + 462, + 488, + 482, + 470, + 511, + 532, + 490, + 515, + 490, + 487, + 479, + 485, + 505, + 504, + 530, + 434, + 472, + 488, + 485, + 506, + 456, + 500, + 533, + 467, + 513, + 455, + 442, + 470, + 521, + 479, + 492, + 477, + 490, + 501, + 478, + 503, + 469, + 476, + 440, + 482, + 484, + 471, + 511, + 492, + 513, + 524, + 493, + 505, + 466, + 515, + 495, + 466, + 466, + 490, + 471, + 481, + 468, + 492, + 519, + 457, + 464, + 507, + 528, + 468, + 465, + 517, + 475, + 488, + 481, + 490, + 472, + 430, + 477, + 516, + 498, + 508, + 489, + 487, + 522, + 478, + 473, + 538, + 533, + 497, + 475, + 482, + 521, + 504, + 503, + 494, + 503, + 467, + 467, + 475, + 462, + 495, + 526, + 495, + 478, + 491, + 459, + 493, + 491, + 534, + 531, + 478, + 502, + 490, + 473, + 477, + 475, + 476, + 494, + 505, + 487, + 462, + 494, + 468, + 502, + 433, + 523, + 450, + 495, + 455, + 479, + 506, + 488, + 500, + 499, + 498, + 463, + 531, + 488, + 477, + 455, + 480, + 480, + 514, + 507, + 483, + 495, + 521, + 491, + 497, + 510, + 524, + 463, + 468, + 501, + 450, + 492, + 456, + 498, + 471, + 500, + 491, + 497, + 501, + 479, + 502, + 526, + 484, + 461, + 487, + 533, + 464, + 468, + 494, + 487, + 465, + 471, + 506, + 510, + 451, + 501, + 478, + 458, + 496, + 502, + 492, + 512, + 482, + 469, + 491, + 519, + 519, + 491, + 518, + 507, + 463, + 473, + 487, + 507, + 442, + 484, + 446, + 450, + 454, + 498, + 482, + 487, + 492, + 484, + 548, + 494, + 470, + 458, + 503, + 481, + 492, + 488, + 531, + 487, + 450, + 468, + 440, + 476, + 460, + 474, + 497, + 526, + 518, + 489, + 501, + 524, + 503, + 464, + 464, + 537, + 489, + 469, + 500, + 525, + 469, + 479, + 491, + 450, + 523, + 444, + 487, + 458, + 472, + 514, + 473, + 493, + 480, + 486, + 517, + 510, + 458, + 468, + 480, + 467, + 513, + 530, + 505, + 461, + 436, + 491, + 472, + 479, + 531, + 493, + 468, + 464, + 540, + 493, + 502, + 496, + 490, + 490, + 462, + 513, + 506, + 504, + 497, + 508, + 503, + 477, + 500, + 512, + 490, + 480, + 496, + 467, + 517, + 473, + 476, + 486, + 505, + 498, + 532, + 513, + 452, + 498, + 448, + 508, + 526, + 488, + 488, + 488, + 479, + 542, + 493, + 507, + 496, + 491, + 493, + 482, + 441, + 462, + 503, + 512, + 475, + 500, + 508, + 496, + 506, + 470, + 477, + 511, + 480, + 452, + 453, + 489, + 473, + 507, + 488, + 473, + 494, + 492, + 489, + 491, + 457, + 481, + 493, + 494, + 451, + 503, + 489, + 475, + 477, + 473, + 494, + 499, + 499, + 475, + 478, + 488, + 489, + 475, + 451, + 512, + 525, + 514, + 504, + 480, + 482, + 486, + 481, + 480, + 497, + 465, + 503, + 473, + 465, + 487, + 468, + 481, + 499, + 450, + 496, + 521, + 447, + 462, + 485, + 519, + 498, + 491, + 462, + 489, + 492, + 485, + 473, + 519, + 503, + 540, + 539, + 482, + 482, + 531, + 532, + 461, + 473, + 542, + 503, + 532, + 420, + 490, + 453, + 491, + 471, + 477, + 470, + 490, + 485, + 499, + 482, + 500, + 517, + 489, + 500, + 511, + 452, + 453, + 486, + 452, + 502 + ] + }, + { + "counters": [ + 492, + 472, + 474, + 474, + 468, + 472, + 473, + 512, + 480, + 500, + 481, + 508, + 468, + 466, + 461, + 493, + 492, + 523, + 494, + 459, + 479, + 491, + 473, + 484, + 489, + 488, + 479, + 499, + 497, + 444, + 560, + 452, + 474, + 519, + 463, + 517, + 499, + 484, + 471, + 490, + 496, + 476, + 454, + 478, + 459, + 484, + 473, + 467, + 494, + 469, + 497, + 477, + 558, + 494, + 504, + 478, + 518, + 498, + 483, + 507, + 534, + 497, + 473, + 479, + 485, + 477, + 477, + 487, + 477, + 442, + 480, + 499, + 498, + 500, + 503, + 486, + 480, + 490, + 466, + 482, + 468, + 455, + 505, + 483, + 466, + 468, + 497, + 485, + 513, + 466, + 524, + 491, + 482, + 543, + 439, + 521, + 517, + 441, + 451, + 492, + 524, + 479, + 480, + 504, + 486, + 473, + 481, + 532, + 449, + 515, + 492, + 485, + 510, + 508, + 471, + 484, + 466, + 549, + 499, + 491, + 498, + 511, + 519, + 496, + 512, + 502, + 518, + 469, + 466, + 495, + 466, + 511, + 462, + 505, + 482, + 511, + 493, + 464, + 435, + 509, + 503, + 508, + 473, + 464, + 446, + 490, + 479, + 471, + 450, + 490, + 504, + 493, + 494, + 493, + 465, + 446, + 473, + 431, + 497, + 471, + 476, + 498, + 463, + 510, + 478, + 536, + 488, + 512, + 473, + 486, + 510, + 529, + 485, + 501, + 522, + 461, + 476, + 518, + 491, + 496, + 492, + 474, + 441, + 481, + 493, + 514, + 483, + 510, + 499, + 421, + 484, + 507, + 506, + 454, + 466, + 460, + 475, + 503, + 461, + 486, + 494, + 494, + 503, + 460, + 496, + 465, + 467, + 517, + 498, + 483, + 479, + 469, + 492, + 507, + 491, + 487, + 473, + 506, + 510, + 489, + 489, + 447, + 486, + 481, + 497, + 473, + 497, + 519, + 479, + 514, + 499, + 475, + 470, + 509, + 474, + 458, + 473, + 474, + 479, + 510, + 500, + 466, + 461, + 474, + 513, + 496, + 477, + 501, + 499, + 483, + 493, + 468, + 519, + 467, + 432, + 488, + 476, + 507, + 458, + 515, + 492, + 455, + 481, + 508, + 487, + 524, + 488, + 441, + 447, + 422, + 481, + 501, + 526, + 476, + 471, + 512, + 499, + 451, + 515, + 500, + 523, + 487, + 492, + 462, + 485, + 508, + 479, + 477, + 487, + 477, + 484, + 449, + 477, + 498, + 453, + 495, + 456, + 434, + 463, + 480, + 494, + 501, + 495, + 487, + 522, + 468, + 469, + 515, + 515, + 472, + 523, + 488, + 473, + 481, + 471, + 488, + 470, + 442, + 497, + 516, + 496, + 488, + 498, + 542, + 469, + 431, + 502, + 431, + 484, + 499, + 530, + 467, + 477, + 482, + 473, + 505, + 473, + 497, + 467, + 482, + 495, + 486, + 522, + 456, + 505, + 482, + 520, + 479, + 527, + 510, + 499, + 477, + 487, + 422, + 478, + 495, + 466, + 474, + 496, + 490, + 442, + 483, + 489, + 472, + 483, + 511, + 505, + 469, + 497, + 479, + 507, + 516, + 461, + 491, + 504, + 481, + 500, + 483, + 517, + 478, + 472, + 529, + 514, + 491, + 533, + 485, + 475, + 493, + 492, + 472, + 490, + 520, + 479, + 468, + 506, + 502, + 464, + 464, + 476, + 461, + 512, + 518, + 497, + 507, + 495, + 477, + 489, + 457, + 493, + 455, + 478, + 503, + 428, + 519, + 470, + 481, + 472, + 492, + 478, + 483, + 466, + 479, + 481, + 485, + 513, + 486, + 454, + 497, + 487, + 476, + 516, + 501, + 458, + 459, + 471, + 479, + 546, + 499, + 464, + 452, + 437, + 496, + 494, + 507, + 481, + 476, + 464, + 497, + 493, + 512, + 503, + 472, + 491, + 496, + 495, + 492, + 502, + 521, + 482, + 484, + 527, + 476, + 498, + 454, + 453, + 526, + 519, + 484, + 482, + 522, + 511, + 519, + 471, + 493, + 486, + 507, + 509, + 504, + 513, + 461, + 518, + 524, + 475, + 469, + 454, + 492, + 536, + 464, + 531, + 456, + 463, + 478, + 468, + 487, + 483, + 534, + 489, + 471, + 470, + 517, + 473, + 470, + 476, + 524, + 490, + 506, + 525, + 499, + 493, + 481, + 466, + 479, + 492, + 482, + 498, + 502, + 477, + 488, + 482, + 505, + 488, + 473, + 474, + 465, + 457, + 513, + 502, + 481, + 519, + 521, + 507, + 524, + 490, + 506, + 500, + 507, + 461, + 494, + 472, + 510, + 513, + 459, + 480, + 508, + 481, + 458, + 512, + 478, + 488, + 501, + 475, + 473, + 482, + 467, + 519, + 476, + 465, + 511, + 510, + 517, + 455, + 461, + 462, + 488, + 500, + 479, + 450, + 540, + 471, + 485, + 507, + 466, + 465, + 454, + 483, + 448, + 493, + 492, + 478, + 472, + 485, + 495, + 492, + 484, + 482, + 473, + 440, + 498, + 483, + 465, + 479, + 454, + 467, + 485, + 506, + 450, + 479, + 482, + 533, + 479, + 483, + 475, + 459, + 498, + 481, + 481, + 435, + 488, + 486, + 469, + 499, + 488, + 475, + 497, + 479, + 490, + 469, + 508, + 499, + 514, + 517, + 498, + 521, + 511, + 473, + 529, + 505, + 495, + 485, + 497, + 501, + 498, + 485, + 514, + 492, + 531, + 460, + 502, + 450, + 488, + 511, + 499, + 487, + 491, + 498, + 480, + 478, + 515, + 479, + 472, + 489, + 447, + 495, + 505, + 459, + 466, + 489, + 465, + 475, + 494, + 500, + 510, + 490, + 517, + 497, + 494, + 478, + 501, + 469, + 497, + 507, + 465, + 506, + 491, + 466, + 493, + 487, + 520, + 454, + 552, + 472, + 451, + 490, + 507, + 498, + 510, + 524, + 485, + 503, + 462, + 514, + 432, + 505, + 474, + 481, + 454, + 497, + 477, + 514, + 502, + 510, + 523, + 471, + 495, + 465, + 488, + 498, + 499, + 506, + 522, + 454, + 474, + 465, + 501, + 453, + 495, + 474, + 458, + 506, + 536, + 494, + 455, + 474, + 463, + 478, + 465, + 503, + 474, + 461, + 499, + 521, + 486, + 478, + 501, + 516, + 470, + 439, + 474, + 516, + 507, + 541, + 509, + 492, + 461, + 507, + 496, + 499, + 496, + 468, + 472, + 461, + 477, + 484, + 510, + 504, + 490, + 466, + 485, + 483, + 496, + 484, + 512, + 483, + 521, + 500, + 477, + 479, + 500, + 476, + 543, + 478, + 505, + 483, + 471, + 495, + 484, + 484, + 475, + 512, + 476, + 478, + 469, + 497, + 475, + 474, + 485, + 475, + 480, + 478, + 475, + 498, + 467, + 518, + 502, + 493, + 488, + 495, + 491, + 526, + 477, + 524, + 491, + 438, + 485, + 463, + 492, + 484, + 509, + 494, + 509, + 466, + 493, + 500, + 492, + 486, + 457, + 475, + 490, + 542, + 486, + 488, + 489, + 498, + 506, + 521, + 507, + 516, + 494, + 478, + 518, + 516, + 489, + 517, + 497, + 445, + 485, + 484, + 455, + 509, + 478, + 510, + 486, + 507, + 491, + 495, + 484, + 498, + 491, + 534, + 429, + 489, + 521, + 488, + 475, + 489, + 464, + 482, + 531, + 473, + 475, + 483, + 462, + 492, + 505, + 484, + 493, + 483, + 453, + 498, + 451, + 490, + 530, + 516, + 466, + 485, + 486, + 433, + 481, + 471, + 526, + 520, + 447, + 519, + 514, + 449, + 489, + 552, + 508, + 476, + 506, + 477, + 482, + 459, + 486, + 463, + 496, + 457, + 456, + 446, + 466, + 459, + 519, + 465, + 465, + 481, + 458, + 494, + 492, + 496, + 500, + 485, + 481, + 507, + 478, + 544, + 477, + 479, + 479, + 501, + 469, + 456, + 493, + 495, + 465, + 517, + 428, + 465, + 514, + 494, + 470, + 505, + 488, + 484, + 483, + 498, + 493, + 493, + 519, + 492, + 494, + 494, + 484, + 470, + 484, + 490, + 510, + 456, + 473, + 502, + 482, + 487, + 470, + 458, + 474, + 499, + 472, + 479, + 514, + 429, + 475, + 493, + 507, + 501, + 521, + 520, + 490, + 513, + 498, + 495, + 507, + 494, + 487, + 498, + 499, + 535, + 531, + 524, + 446, + 486, + 450, + 455, + 468, + 484, + 500, + 509, + 499, + 502, + 489, + 526, + 501, + 515, + 476, + 490, + 510, + 492, + 440, + 468, + 487, + 430, + 514, + 475, + 460, + 475, + 504, + 482, + 451, + 504, + 512, + 464, + 486, + 502, + 513, + 480, + 508, + 467, + 483, + 446, + 511, + 480, + 492, + 496, + 528, + 505, + 485, + 469, + 436, + 529, + 468, + 456, + 493, + 479, + 499, + 493, + 500, + 487, + 528, + 475, + 499, + 480, + 505, + 482, + 512, + 519, + 493, + 499, + 478, + 495, + 479, + 498, + 520, + 480, + 485, + 506, + 465, + 518, + 479, + 511, + 468, + 505, + 472, + 492, + 500, + 523, + 492, + 494, + 470, + 535, + 471, + 455, + 463, + 505, + 477, + 499, + 484, + 508, + 490, + 493, + 484, + 492, + 523, + 510, + 471, + 487, + 511, + 467, + 478, + 484, + 504, + 488, + 496, + 471, + 443, + 487, + 499, + 515, + 504, + 503, + 514, + 516, + 472, + 491, + 461, + 465, + 499, + 464, + 487, + 479, + 475, + 511, + 482, + 468, + 467, + 499, + 524, + 494, + 516, + 470, + 483, + 488, + 485, + 453, + 474, + 475, + 516, + 466, + 486, + 515, + 464, + 477, + 489, + 471, + 492, + 500, + 462, + 495, + 460, + 482, + 488, + 476, + 478, + 488, + 496, + 516, + 485, + 503, + 498, + 507, + 471, + 506, + 495, + 503, + 506, + 479, + 464, + 478, + 507, + 446, + 506, + 491, + 478, + 463, + 460, + 478, + 495, + 504, + 521, + 497, + 491, + 495, + 491, + 484, + 474, + 500, + 497, + 509, + 492, + 470, + 504, + 509, + 499, + 555, + 485, + 462, + 465, + 469, + 523, + 485, + 471, + 519, + 493, + 480, + 456, + 492, + 490, + 468, + 496, + 520, + 479, + 500, + 482, + 516, + 475, + 505, + 471, + 488, + 459, + 483, + 500, + 518, + 496, + 492, + 488, + 479, + 526, + 436, + 497, + 479, + 474, + 488, + 526, + 513, + 497, + 508, + 484, + 522, + 495, + 465, + 499, + 497, + 482, + 487, + 496, + 497, + 500, + 532, + 500, + 506, + 484, + 448, + 462, + 446, + 494, + 475, + 477, + 515, + 519, + 494, + 505, + 489, + 560, + 481, + 515, + 489, + 483, + 558, + 446, + 480, + 445, + 489, + 512, + 453, + 523, + 515, + 469, + 434, + 480, + 511, + 479, + 472, + 481, + 473, + 466, + 454, + 506, + 456, + 492, + 468, + 518, + 534, + 530, + 520, + 525, + 495, + 463, + 466, + 492, + 482, + 516, + 506, + 445, + 478, + 502, + 487, + 478, + 495, + 501, + 503, + 480, + 511, + 463, + 490, + 485, + 479, + 496, + 518, + 475, + 492, + 464, + 460, + 487, + 485, + 491, + 509, + 449, + 492, + 501, + 485, + 526, + 523, + 451, + 495, + 460, + 480, + 513, + 520, + 496, + 538, + 499, + 484, + 481, + 480, + 514, + 467, + 472, + 476, + 494, + 495, + 467, + 485, + 511, + 476, + 495, + 476, + 506, + 496, + 496, + 525, + 480, + 522, + 523, + 489, + 506, + 467, + 507, + 489, + 479, + 523, + 479, + 494, + 437, + 470, + 499, + 508, + 484, + 495, + 478, + 462, + 482, + 539, + 516, + 492, + 499, + 508, + 493, + 470, + 484, + 496, + 492, + 498, + 451, + 496, + 497, + 479, + 456, + 458, + 466, + 468, + 535, + 498, + 527, + 509, + 505, + 522, + 506, + 465, + 486, + 425, + 530, + 502, + 514, + 483, + 524, + 464, + 460, + 512, + 494, + 500, + 493, + 459, + 487, + 502, + 491, + 498, + 485, + 496, + 516, + 467, + 485, + 519, + 481, + 501, + 487, + 483, + 476, + 489, + 511, + 463, + 471, + 486, + 508, + 536, + 488, + 449, + 481, + 503, + 480, + 472, + 489, + 459, + 543, + 465, + 483, + 467, + 460, + 508, + 492, + 441, + 534, + 497, + 459, + 506, + 483, + 479, + 510, + 484, + 468, + 488, + 475, + 518, + 491, + 480, + 533, + 513, + 460, + 560, + 484, + 481, + 476, + 497, + 503, + 484, + 492, + 455, + 485, + 473, + 502, + 528, + 485, + 524, + 492, + 469, + 500, + 447, + 476, + 501, + 494, + 498, + 481, + 505, + 499, + 502, + 466, + 490, + 489, + 500, + 464, + 504, + 495, + 532, + 440, + 483, + 506, + 472, + 483, + 496, + 474, + 481, + 507, + 489, + 480, + 502, + 486, + 510, + 448, + 524, + 493, + 472, + 512, + 492, + 490, + 458, + 464, + 460, + 469, + 505, + 484, + 479, + 511, + 503, + 480, + 490, + 473, + 517, + 470, + 499, + 492, + 512, + 455, + 487, + 483, + 495, + 505, + 500, + 463, + 492, + 515, + 494, + 507, + 513, + 520, + 466, + 488, + 473, + 466, + 467, + 445, + 438, + 492, + 465, + 492, + 540, + 451, + 521, + 480, + 475, + 445, + 471, + 466, + 472, + 482, + 512, + 471, + 490, + 487, + 501, + 473, + 445, + 506, + 470, + 500, + 471, + 457, + 531, + 508, + 477, + 498, + 514, + 477, + 494, + 480, + 484, + 525, + 477, + 497, + 498, + 520, + 519, + 485, + 481, + 528, + 484, + 498, + 523, + 504, + 478, + 487, + 489, + 482, + 481, + 486, + 488, + 499, + 461, + 482, + 490, + 473, + 496, + 467, + 461, + 459, + 496, + 490, + 484, + 486, + 503, + 480, + 473, + 449, + 462, + 471, + 518, + 494, + 486, + 482, + 523, + 466, + 466, + 475, + 491, + 489, + 458, + 472, + 461, + 495, + 501, + 507, + 441, + 460, + 461, + 474, + 473, + 465, + 483, + 494, + 491, + 494, + 487, + 497, + 523, + 464, + 508, + 505, + 465, + 475, + 485, + 457, + 467, + 470, + 506, + 482, + 469, + 512, + 463, + 522, + 455, + 454, + 476, + 504, + 502, + 505, + 519, + 509, + 488, + 498, + 522, + 493, + 462, + 461, + 489, + 468, + 506, + 506, + 461, + 460, + 466, + 494, + 472, + 481, + 520, + 479, + 474, + 470, + 503, + 526, + 505, + 482, + 494, + 518, + 504, + 478, + 478, + 515, + 504, + 494, + 462, + 501, + 489, + 508, + 494, + 517, + 478, + 480, + 456, + 500, + 482, + 490, + 449, + 490, + 517, + 490, + 475, + 467, + 468, + 509, + 471, + 459, + 491, + 503, + 511, + 494, + 468, + 482, + 492, + 498, + 464, + 503, + 469, + 500, + 531, + 511, + 500, + 489, + 504, + 492, + 485, + 501, + 501, + 508, + 474, + 474, + 451, + 487, + 505, + 497, + 493, + 485, + 468, + 479, + 490, + 520, + 466, + 507, + 451, + 479, + 469, + 565, + 488, + 473, + 493, + 518, + 488, + 534, + 471, + 452, + 524, + 470, + 517, + 494, + 496, + 505, + 486, + 493, + 489, + 497, + 495, + 503, + 513, + 516, + 482, + 513, + 455, + 470, + 466, + 527, + 495, + 490, + 476, + 492, + 454, + 500, + 481, + 493, + 492, + 512, + 451, + 481, + 528, + 510, + 479, + 499, + 499, + 494, + 478, + 512, + 476, + 483, + 504, + 531, + 511, + 453, + 460, + 496, + 467, + 463, + 467, + 531, + 485, + 455, + 458, + 504, + 477, + 492, + 481, + 501, + 499, + 462, + 493, + 480, + 504, + 517, + 476, + 487, + 484, + 494, + 512, + 521, + 481, + 453, + 470, + 461, + 519, + 479, + 495, + 464, + 466, + 468, + 507, + 503, + 493, + 474, + 482, + 508, + 473, + 484, + 479, + 487, + 476, + 485, + 460, + 449, + 507, + 506, + 478, + 471, + 481, + 477, + 479, + 507, + 472, + 484, + 464, + 504, + 512, + 510, + 497, + 482, + 484, + 511, + 480, + 533, + 512, + 523, + 508, + 502, + 493, + 473, + 514, + 531, + 505, + 491, + 483, + 435, + 512, + 488, + 495, + 501, + 479, + 459, + 495, + 487, + 476, + 478, + 455, + 503, + 482, + 508, + 469, + 532, + 500, + 502, + 468, + 495, + 489, + 532, + 496, + 521, + 471, + 494, + 464, + 510, + 500, + 476, + 528, + 498, + 496, + 504, + 487, + 481, + 482, + 531, + 483, + 509, + 499, + 540, + 514, + 518, + 510, + 465, + 467, + 475, + 502, + 498, + 473, + 488, + 514, + 491, + 491, + 435, + 469, + 470, + 471, + 460, + 483, + 477, + 530, + 496, + 468, + 448, + 479, + 511, + 507, + 453, + 515, + 467, + 476, + 513, + 481, + 469, + 493, + 467, + 454, + 487, + 468, + 492, + 468, + 471, + 469, + 472, + 458, + 450, + 456, + 485, + 542, + 508, + 483, + 501, + 485, + 512, + 481, + 512, + 509, + 521, + 489, + 495, + 478, + 529, + 478, + 504, + 473, + 465, + 529, + 482, + 500, + 483, + 465, + 470, + 478, + 507, + 507, + 473, + 504, + 485, + 461, + 517, + 483, + 489, + 526, + 487, + 477, + 485, + 501, + 444, + 530, + 504, + 470, + 463, + 489, + 497 + ] + }, + { + "counters": [ + 486, + 470, + 490, + 485, + 472, + 508, + 468, + 498, + 490, + 487, + 516, + 485, + 486, + 519, + 497, + 503, + 474, + 490, + 491, + 477, + 483, + 473, + 474, + 478, + 483, + 459, + 503, + 478, + 524, + 464, + 472, + 486, + 492, + 449, + 455, + 486, + 458, + 477, + 491, + 482, + 493, + 505, + 498, + 506, + 516, + 450, + 499, + 455, + 469, + 466, + 542, + 548, + 519, + 482, + 487, + 479, + 491, + 477, + 505, + 465, + 478, + 460, + 452, + 488, + 470, + 481, + 522, + 519, + 471, + 470, + 528, + 499, + 518, + 511, + 493, + 521, + 489, + 477, + 478, + 519, + 502, + 511, + 490, + 466, + 494, + 446, + 503, + 468, + 468, + 467, + 489, + 504, + 474, + 508, + 500, + 449, + 486, + 490, + 530, + 467, + 481, + 485, + 511, + 488, + 521, + 470, + 508, + 525, + 510, + 504, + 511, + 502, + 513, + 461, + 501, + 485, + 476, + 504, + 489, + 486, + 488, + 497, + 541, + 482, + 487, + 494, + 482, + 499, + 506, + 452, + 484, + 495, + 470, + 453, + 482, + 489, + 494, + 485, + 475, + 491, + 481, + 498, + 523, + 493, + 483, + 505, + 493, + 503, + 475, + 491, + 517, + 502, + 473, + 505, + 456, + 509, + 486, + 484, + 489, + 496, + 485, + 500, + 521, + 470, + 540, + 482, + 470, + 471, + 504, + 445, + 487, + 470, + 488, + 472, + 470, + 500, + 511, + 484, + 458, + 489, + 503, + 484, + 543, + 502, + 481, + 486, + 494, + 514, + 473, + 491, + 497, + 502, + 482, + 482, + 472, + 512, + 503, + 494, + 531, + 517, + 470, + 534, + 491, + 476, + 482, + 503, + 478, + 469, + 495, + 508, + 487, + 490, + 494, + 476, + 493, + 490, + 464, + 539, + 471, + 498, + 489, + 435, + 459, + 464, + 453, + 498, + 523, + 494, + 518, + 512, + 447, + 451, + 492, + 516, + 496, + 484, + 478, + 512, + 484, + 469, + 518, + 505, + 482, + 493, + 434, + 465, + 503, + 499, + 454, + 502, + 489, + 485, + 521, + 507, + 499, + 483, + 475, + 507, + 504, + 529, + 502, + 500, + 463, + 514, + 517, + 495, + 448, + 517, + 496, + 488, + 532, + 464, + 449, + 509, + 454, + 501, + 500, + 500, + 488, + 503, + 451, + 506, + 481, + 445, + 438, + 485, + 500, + 474, + 499, + 487, + 504, + 474, + 512, + 507, + 470, + 495, + 477, + 465, + 474, + 514, + 492, + 508, + 465, + 477, + 478, + 426, + 505, + 485, + 478, + 501, + 477, + 486, + 446, + 461, + 499, + 483, + 501, + 484, + 483, + 502, + 502, + 464, + 500, + 464, + 479, + 459, + 560, + 467, + 481, + 505, + 496, + 498, + 413, + 512, + 451, + 508, + 443, + 485, + 442, + 480, + 552, + 476, + 487, + 546, + 495, + 518, + 450, + 502, + 502, + 492, + 519, + 497, + 485, + 464, + 445, + 496, + 454, + 501, + 486, + 510, + 501, + 534, + 495, + 466, + 466, + 492, + 482, + 489, + 517, + 437, + 497, + 493, + 423, + 481, + 468, + 481, + 506, + 439, + 439, + 450, + 493, + 489, + 524, + 476, + 512, + 472, + 475, + 504, + 521, + 481, + 500, + 522, + 514, + 486, + 495, + 533, + 464, + 513, + 440, + 499, + 469, + 495, + 454, + 479, + 549, + 514, + 481, + 503, + 468, + 477, + 476, + 492, + 465, + 528, + 493, + 499, + 480, + 491, + 459, + 470, + 476, + 476, + 492, + 474, + 517, + 504, + 466, + 463, + 517, + 453, + 471, + 456, + 508, + 482, + 465, + 475, + 548, + 485, + 483, + 482, + 500, + 549, + 444, + 504, + 481, + 441, + 477, + 496, + 515, + 490, + 532, + 490, + 489, + 444, + 485, + 473, + 453, + 498, + 534, + 467, + 486, + 517, + 499, + 488, + 492, + 499, + 461, + 478, + 484, + 515, + 515, + 486, + 497, + 464, + 523, + 483, + 468, + 491, + 513, + 525, + 489, + 476, + 494, + 486, + 543, + 475, + 474, + 470, + 495, + 466, + 515, + 503, + 514, + 520, + 485, + 485, + 469, + 518, + 493, + 486, + 505, + 457, + 484, + 476, + 502, + 511, + 527, + 481, + 510, + 492, + 525, + 502, + 433, + 490, + 471, + 481, + 527, + 502, + 496, + 470, + 513, + 505, + 458, + 477, + 445, + 545, + 453, + 479, + 484, + 483, + 498, + 494, + 499, + 447, + 486, + 482, + 493, + 474, + 483, + 499, + 454, + 485, + 455, + 473, + 522, + 533, + 463, + 463, + 481, + 495, + 491, + 482, + 528, + 485, + 434, + 450, + 473, + 482, + 501, + 492, + 518, + 468, + 498, + 513, + 498, + 472, + 486, + 531, + 487, + 466, + 501, + 459, + 481, + 497, + 491, + 465, + 494, + 493, + 524, + 490, + 508, + 509, + 437, + 489, + 505, + 480, + 488, + 486, + 501, + 460, + 515, + 472, + 470, + 476, + 442, + 480, + 485, + 504, + 477, + 494, + 473, + 475, + 513, + 506, + 457, + 481, + 482, + 472, + 496, + 475, + 490, + 486, + 470, + 497, + 515, + 471, + 446, + 463, + 518, + 490, + 461, + 509, + 477, + 441, + 486, + 475, + 444, + 501, + 486, + 471, + 513, + 496, + 484, + 511, + 498, + 487, + 478, + 496, + 485, + 443, + 469, + 483, + 460, + 484, + 492, + 493, + 487, + 483, + 527, + 459, + 437, + 496, + 492, + 475, + 457, + 503, + 469, + 509, + 481, + 489, + 465, + 472, + 472, + 488, + 482, + 480, + 512, + 466, + 456, + 458, + 490, + 498, + 488, + 500, + 447, + 496, + 513, + 482, + 494, + 488, + 501, + 495, + 466, + 483, + 491, + 475, + 490, + 505, + 527, + 448, + 501, + 515, + 416, + 493, + 491, + 481, + 475, + 484, + 445, + 486, + 504, + 499, + 545, + 488, + 497, + 469, + 479, + 456, + 508, + 477, + 481, + 538, + 503, + 498, + 444, + 508, + 484, + 490, + 484, + 497, + 509, + 458, + 497, + 458, + 488, + 494, + 456, + 491, + 491, + 489, + 490, + 505, + 520, + 511, + 490, + 458, + 477, + 471, + 481, + 492, + 482, + 504, + 526, + 503, + 507, + 483, + 491, + 504, + 487, + 499, + 551, + 476, + 513, + 467, + 483, + 497, + 529, + 521, + 455, + 473, + 500, + 415, + 474, + 559, + 518, + 512, + 483, + 502, + 462, + 547, + 514, + 503, + 476, + 491, + 488, + 471, + 488, + 451, + 509, + 486, + 503, + 483, + 450, + 461, + 486, + 478, + 508, + 501, + 520, + 513, + 499, + 493, + 467, + 494, + 492, + 506, + 481, + 474, + 498, + 499, + 508, + 481, + 503, + 490, + 484, + 472, + 486, + 505, + 469, + 506, + 499, + 489, + 454, + 487, + 526, + 465, + 458, + 504, + 464, + 517, + 490, + 465, + 503, + 488, + 482, + 495, + 526, + 489, + 477, + 507, + 494, + 525, + 505, + 496, + 491, + 536, + 469, + 506, + 438, + 482, + 517, + 464, + 472, + 507, + 499, + 447, + 465, + 460, + 466, + 484, + 476, + 467, + 484, + 474, + 462, + 516, + 471, + 500, + 511, + 517, + 460, + 512, + 484, + 461, + 458, + 519, + 481, + 505, + 472, + 475, + 488, + 543, + 539, + 511, + 489, + 450, + 516, + 492, + 500, + 452, + 500, + 521, + 519, + 470, + 461, + 467, + 458, + 501, + 496, + 482, + 456, + 500, + 496, + 504, + 481, + 499, + 480, + 477, + 559, + 499, + 522, + 491, + 482, + 480, + 493, + 513, + 485, + 463, + 460, + 501, + 507, + 480, + 503, + 511, + 484, + 461, + 443, + 477, + 464, + 486, + 523, + 493, + 465, + 489, + 510, + 467, + 471, + 498, + 482, + 450, + 483, + 498, + 520, + 484, + 509, + 512, + 454, + 461, + 497, + 465, + 466, + 510, + 451, + 496, + 489, + 478, + 516, + 529, + 492, + 490, + 476, + 505, + 487, + 523, + 489, + 495, + 509, + 475, + 501, + 472, + 479, + 501, + 493, + 475, + 510, + 511, + 462, + 472, + 487, + 487, + 516, + 474, + 512, + 498, + 451, + 484, + 493, + 497, + 544, + 461, + 475, + 525, + 487, + 465, + 490, + 493, + 463, + 477, + 525, + 486, + 484, + 494, + 485, + 490, + 521, + 495, + 494, + 518, + 487, + 501, + 468, + 492, + 449, + 461, + 480, + 500, + 497, + 470, + 479, + 521, + 490, + 520, + 508, + 508, + 495, + 481, + 513, + 502, + 516, + 480, + 471, + 483, + 496, + 487, + 497, + 475, + 492, + 513, + 491, + 550, + 487, + 514, + 510, + 513, + 494, + 483, + 479, + 518, + 468, + 485, + 484, + 469, + 494, + 495, + 527, + 487, + 503, + 486, + 468, + 508, + 528, + 478, + 480, + 463, + 508, + 491, + 454, + 472, + 458, + 500, + 488, + 469, + 500, + 489, + 483, + 476, + 496, + 454, + 466, + 486, + 501, + 470, + 509, + 482, + 486, + 494, + 490, + 463, + 463, + 496, + 525, + 489, + 476, + 490, + 513, + 491, + 500, + 545, + 481, + 492, + 500, + 501, + 483, + 467, + 515, + 499, + 457, + 494, + 478, + 495, + 504, + 472, + 494, + 504, + 532, + 456, + 458, + 480, + 477, + 504, + 484, + 494, + 473, + 488, + 466, + 450, + 475, + 484, + 481, + 478, + 500, + 492, + 466, + 505, + 480, + 497, + 462, + 486, + 480, + 463, + 494, + 437, + 477, + 468, + 469, + 510, + 502, + 509, + 499, + 465, + 530, + 511, + 485, + 465, + 489, + 490, + 490, + 490, + 491, + 509, + 514, + 481, + 481, + 498, + 491, + 493, + 514, + 453, + 505, + 480, + 492, + 471, + 498, + 476, + 496, + 461, + 520, + 469, + 467, + 493, + 453, + 495, + 489, + 507, + 442, + 495, + 468, + 462, + 512, + 505, + 477, + 466, + 453, + 475, + 484, + 498, + 509, + 537, + 479, + 480, + 478, + 470, + 465, + 495, + 464, + 485, + 447, + 508, + 478, + 491, + 494, + 471, + 477, + 514, + 453, + 454, + 517, + 526, + 489, + 491, + 457, + 519, + 483, + 522, + 479, + 522, + 514, + 491, + 491, + 494, + 482, + 463, + 503, + 491, + 471, + 508, + 476, + 472, + 500, + 514, + 500, + 458, + 500, + 474, + 497, + 497, + 514, + 526, + 501, + 493, + 519, + 516, + 474, + 478, + 524, + 467, + 473, + 500, + 486, + 490, + 491, + 487, + 468, + 501, + 540, + 493, + 482, + 492, + 502, + 474, + 486, + 512, + 493, + 483, + 457, + 487, + 486, + 502, + 460, + 459, + 466, + 495, + 469, + 525, + 518, + 518, + 517, + 469, + 463, + 459, + 511, + 495, + 490, + 452, + 511, + 486, + 515, + 482, + 464, + 487, + 513, + 479, + 484, + 468, + 499, + 482, + 496, + 494, + 505, + 475, + 470, + 471, + 497, + 464, + 520, + 506, + 518, + 477, + 498, + 465, + 462, + 478, + 496, + 495, + 490, + 486, + 516, + 503, + 483, + 489, + 508, + 481, + 479, + 533, + 491, + 477, + 482, + 514, + 485, + 488, + 531, + 522, + 481, + 480, + 498, + 485, + 490, + 489, + 510, + 512, + 497, + 517, + 499, + 465, + 453, + 467, + 474, + 507, + 496, + 485, + 497, + 492, + 488, + 505, + 464, + 458, + 509, + 479, + 466, + 490, + 535, + 484, + 497, + 469, + 493, + 498, + 518, + 483, + 449, + 480, + 473, + 523, + 504, + 441, + 503, + 451, + 509, + 497, + 509, + 497, + 511, + 470, + 476, + 499, + 517, + 511, + 463, + 504, + 498, + 476, + 480, + 501, + 513, + 507, + 516, + 461, + 486, + 482, + 504, + 466, + 498, + 457, + 487, + 462, + 475, + 471, + 481, + 493, + 475, + 483, + 473, + 473, + 472, + 508, + 453, + 480, + 459, + 491, + 477, + 504, + 497, + 503, + 504, + 488, + 448, + 528, + 509, + 506, + 477, + 502, + 492, + 519, + 488, + 503, + 503, + 510, + 472, + 498, + 503, + 511, + 512, + 481, + 502, + 464, + 510, + 524, + 435, + 499, + 549, + 463, + 479, + 498, + 438, + 492, + 482, + 512, + 497, + 498, + 494, + 494, + 468, + 508, + 510, + 513, + 456, + 476, + 485, + 517, + 479, + 501, + 466, + 492, + 530, + 470, + 493, + 488, + 498, + 506, + 478, + 478, + 476, + 489, + 496, + 490, + 494, + 493, + 478, + 503, + 482, + 475, + 475, + 444, + 482, + 502, + 476, + 463, + 490, + 455, + 486, + 503, + 504, + 476, + 514, + 514, + 503, + 469, + 463, + 512, + 460, + 467, + 461, + 495, + 469, + 471, + 528, + 458, + 511, + 463, + 514, + 472, + 462, + 469, + 458, + 477, + 476, + 492, + 507, + 510, + 425, + 484, + 457, + 475, + 483, + 498, + 528, + 498, + 503, + 501, + 475, + 451, + 525, + 495, + 482, + 454, + 487, + 481, + 462, + 458, + 473, + 451, + 482, + 483, + 486, + 464, + 522, + 483, + 491, + 493, + 503, + 488, + 505, + 525, + 460, + 520, + 488, + 502, + 525, + 492, + 485, + 454, + 498, + 501, + 457, + 535, + 474, + 527, + 484, + 504, + 476, + 491, + 478, + 494, + 502, + 507, + 484, + 472, + 517, + 457, + 479, + 510, + 529, + 485, + 481, + 482, + 501, + 498, + 516, + 462, + 478, + 505, + 516, + 472, + 511, + 486, + 489, + 485, + 493, + 538, + 486, + 496, + 499, + 483, + 513, + 501, + 465, + 500, + 508, + 481, + 485, + 494, + 481, + 488, + 495, + 506, + 456, + 541, + 473, + 488, + 449, + 528, + 481, + 488, + 457, + 476, + 495, + 461, + 517, + 522, + 452, + 472, + 555, + 502, + 497, + 505, + 512, + 506, + 474, + 463, + 463, + 500, + 452, + 488, + 465, + 475, + 510, + 492, + 454, + 514, + 502, + 482, + 473, + 512, + 454, + 492, + 512, + 468, + 483, + 492, + 465, + 466, + 504, + 514, + 478, + 483, + 473, + 509, + 494, + 508, + 521, + 448, + 472, + 461, + 470, + 452, + 504, + 501, + 489, + 495, + 498, + 490, + 525, + 494, + 490, + 532, + 490, + 506, + 540, + 496, + 489, + 462, + 499, + 496, + 510, + 489, + 461, + 486, + 477, + 474, + 492, + 464, + 498, + 479, + 506, + 472, + 501, + 466, + 480, + 454, + 462, + 478, + 542, + 449, + 472, + 506, + 491, + 509, + 459, + 488, + 511, + 479, + 540, + 475, + 520, + 506, + 515, + 493, + 475, + 464, + 491, + 508, + 462, + 475, + 502, + 498, + 480, + 458, + 482, + 505, + 471, + 501, + 498, + 474, + 496, + 473, + 477, + 515, + 533, + 483, + 482, + 484, + 506, + 519, + 514, + 480, + 483, + 493, + 508, + 492, + 468, + 483, + 468, + 496, + 469, + 489, + 524, + 526, + 477, + 484, + 456, + 479, + 464, + 477, + 479, + 511, + 481, + 471, + 481, + 483, + 498, + 488, + 462, + 489, + 455, + 480, + 500, + 443, + 438, + 465, + 465, + 495, + 452, + 521, + 467, + 462, + 483, + 494, + 521, + 464, + 461, + 463, + 496, + 476, + 487, + 463, + 479, + 489, + 449, + 473, + 480, + 478, + 463, + 473, + 493, + 492, + 500, + 469, + 493, + 486, + 489, + 515, + 506, + 454, + 508, + 481, + 465, + 499, + 477, + 522, + 461, + 483, + 473, + 449, + 495, + 516, + 488, + 470, + 503, + 489, + 500, + 469, + 509, + 482, + 500, + 509, + 512, + 485, + 486, + 523, + 486, + 493, + 503, + 495, + 493, + 451, + 491, + 529, + 504, + 472, + 481, + 493, + 466, + 472, + 496, + 497, + 494, + 489, + 490, + 512, + 495, + 482, + 491, + 495, + 448, + 495, + 454, + 483, + 482, + 482, + 506, + 525, + 494, + 497, + 530, + 460, + 506, + 539, + 505, + 488, + 480, + 474, + 480, + 470, + 486, + 486, + 503, + 496, + 489, + 469, + 462, + 457, + 500, + 449, + 442, + 476, + 448, + 508, + 498, + 507, + 465, + 481, + 476, + 465, + 476, + 517, + 477, + 453, + 490, + 502, + 478, + 479, + 454, + 459, + 482, + 492, + 506, + 441, + 492, + 481, + 482, + 478, + 449, + 478, + 503, + 505, + 474, + 524, + 483, + 503, + 492, + 496, + 479, + 496, + 464, + 492, + 506, + 490, + 494, + 483, + 500, + 531, + 486, + 469, + 517, + 502, + 488, + 487, + 497, + 433, + 462, + 516, + 493, + 474, + 500, + 516, + 497, + 475, + 497, + 487, + 481, + 470, + 469, + 499, + 450, + 501, + 494, + 538, + 490, + 511, + 491, + 504, + 481, + 468, + 499, + 473, + 479, + 471, + 499, + 494, + 488, + 475, + 493, + 506, + 478, + 478, + 502, + 461, + 474, + 490, + 520, + 476, + 473, + 451, + 485, + 454, + 475, + 497, + 509, + 474, + 516, + 473, + 464, + 497, + 497, + 458, + 458, + 481, + 453, + 514, + 521, + 513, + 511, + 490, + 486, + 507, + 498, + 504, + 509, + 485, + 502, + 491, + 481, + 478, + 480, + 448, + 499, + 502, + 499, + 522 + ] + }, + { + "counters": [ + 482, + 510, + 472, + 488, + 524, + 444, + 511, + 511, + 477, + 475, + 538, + 524, + 512, + 483, + 549, + 475, + 515, + 495, + 511, + 461, + 529, + 510, + 501, + 471, + 469, + 488, + 505, + 489, + 474, + 472, + 463, + 499, + 477, + 505, + 501, + 431, + 492, + 522, + 512, + 458, + 456, + 534, + 493, + 501, + 512, + 549, + 504, + 491, + 482, + 492, + 451, + 465, + 482, + 477, + 477, + 496, + 484, + 475, + 470, + 472, + 460, + 504, + 461, + 495, + 518, + 501, + 514, + 480, + 465, + 517, + 491, + 479, + 495, + 443, + 487, + 508, + 462, + 467, + 483, + 452, + 473, + 479, + 532, + 497, + 491, + 501, + 464, + 497, + 493, + 483, + 485, + 471, + 532, + 492, + 453, + 505, + 470, + 502, + 499, + 506, + 464, + 465, + 516, + 506, + 479, + 460, + 500, + 493, + 542, + 468, + 485, + 480, + 469, + 468, + 537, + 477, + 467, + 502, + 448, + 499, + 491, + 497, + 467, + 510, + 450, + 487, + 493, + 457, + 488, + 469, + 462, + 488, + 485, + 538, + 518, + 496, + 498, + 478, + 499, + 511, + 493, + 504, + 463, + 489, + 463, + 467, + 491, + 498, + 521, + 482, + 454, + 458, + 517, + 500, + 447, + 455, + 467, + 493, + 481, + 457, + 482, + 469, + 529, + 510, + 481, + 486, + 435, + 498, + 545, + 489, + 482, + 450, + 484, + 496, + 501, + 465, + 471, + 476, + 493, + 499, + 486, + 503, + 458, + 502, + 482, + 479, + 477, + 505, + 455, + 493, + 468, + 438, + 461, + 480, + 458, + 484, + 497, + 494, + 506, + 460, + 471, + 498, + 532, + 470, + 507, + 478, + 456, + 476, + 471, + 512, + 487, + 490, + 535, + 494, + 518, + 515, + 478, + 496, + 515, + 478, + 477, + 475, + 481, + 489, + 516, + 455, + 512, + 508, + 503, + 503, + 483, + 530, + 434, + 475, + 500, + 467, + 512, + 533, + 530, + 507, + 471, + 509, + 459, + 494, + 501, + 478, + 475, + 486, + 458, + 498, + 452, + 469, + 452, + 533, + 473, + 496, + 492, + 476, + 478, + 484, + 474, + 506, + 464, + 509, + 486, + 481, + 488, + 486, + 486, + 486, + 498, + 490, + 485, + 467, + 477, + 513, + 500, + 492, + 489, + 448, + 499, + 479, + 519, + 479, + 477, + 499, + 503, + 497, + 468, + 496, + 513, + 459, + 476, + 477, + 493, + 478, + 496, + 494, + 478, + 507, + 489, + 500, + 448, + 507, + 507, + 506, + 499, + 504, + 507, + 511, + 445, + 498, + 463, + 491, + 500, + 485, + 513, + 511, + 517, + 458, + 484, + 510, + 481, + 517, + 501, + 524, + 509, + 482, + 465, + 482, + 506, + 482, + 474, + 528, + 493, + 463, + 465, + 487, + 459, + 463, + 527, + 533, + 490, + 510, + 472, + 507, + 480, + 494, + 454, + 471, + 516, + 450, + 507, + 475, + 469, + 454, + 486, + 505, + 492, + 535, + 516, + 542, + 478, + 448, + 465, + 471, + 475, + 522, + 505, + 475, + 488, + 469, + 468, + 465, + 487, + 511, + 470, + 525, + 520, + 498, + 463, + 505, + 498, + 491, + 476, + 493, + 503, + 512, + 483, + 512, + 477, + 492, + 493, + 462, + 515, + 471, + 469, + 484, + 523, + 504, + 507, + 466, + 515, + 486, + 464, + 478, + 478, + 497, + 471, + 486, + 472, + 513, + 498, + 465, + 477, + 504, + 493, + 481, + 507, + 523, + 497, + 456, + 493, + 486, + 504, + 481, + 470, + 492, + 513, + 490, + 489, + 481, + 510, + 477, + 496, + 516, + 468, + 512, + 452, + 477, + 479, + 463, + 459, + 469, + 461, + 465, + 480, + 489, + 515, + 485, + 500, + 477, + 505, + 452, + 509, + 526, + 511, + 513, + 471, + 452, + 492, + 501, + 514, + 442, + 520, + 506, + 486, + 495, + 525, + 461, + 462, + 452, + 493, + 479, + 492, + 534, + 501, + 501, + 496, + 461, + 469, + 502, + 502, + 457, + 455, + 451, + 449, + 503, + 475, + 473, + 531, + 437, + 464, + 460, + 511, + 464, + 478, + 493, + 490, + 539, + 488, + 478, + 481, + 510, + 468, + 464, + 480, + 538, + 507, + 502, + 479, + 498, + 478, + 452, + 523, + 517, + 509, + 483, + 478, + 466, + 489, + 504, + 506, + 505, + 495, + 475, + 476, + 520, + 489, + 504, + 496, + 501, + 508, + 480, + 511, + 460, + 491, + 475, + 479, + 491, + 510, + 537, + 509, + 491, + 500, + 477, + 466, + 481, + 463, + 479, + 472, + 478, + 509, + 499, + 458, + 520, + 482, + 506, + 505, + 486, + 469, + 501, + 479, + 476, + 466, + 450, + 474, + 462, + 479, + 500, + 487, + 472, + 462, + 473, + 481, + 492, + 489, + 464, + 465, + 478, + 498, + 505, + 501, + 493, + 502, + 483, + 487, + 490, + 503, + 501, + 501, + 495, + 470, + 494, + 528, + 483, + 477, + 518, + 455, + 482, + 487, + 448, + 514, + 491, + 495, + 484, + 448, + 507, + 488, + 529, + 493, + 466, + 493, + 480, + 481, + 495, + 448, + 501, + 504, + 492, + 479, + 488, + 523, + 515, + 497, + 469, + 497, + 494, + 486, + 500, + 467, + 539, + 503, + 479, + 504, + 504, + 482, + 481, + 494, + 503, + 482, + 527, + 470, + 478, + 505, + 506, + 476, + 487, + 496, + 498, + 499, + 478, + 513, + 491, + 463, + 504, + 467, + 510, + 518, + 512, + 495, + 484, + 504, + 473, + 480, + 478, + 476, + 483, + 490, + 475, + 468, + 457, + 499, + 492, + 464, + 505, + 492, + 488, + 492, + 502, + 512, + 492, + 482, + 528, + 493, + 488, + 491, + 506, + 458, + 516, + 455, + 468, + 510, + 473, + 515, + 481, + 496, + 519, + 465, + 487, + 457, + 517, + 452, + 483, + 478, + 505, + 501, + 511, + 487, + 492, + 488, + 477, + 500, + 481, + 501, + 505, + 466, + 448, + 477, + 470, + 531, + 496, + 494, + 466, + 467, + 465, + 527, + 499, + 439, + 481, + 484, + 472, + 492, + 514, + 508, + 484, + 508, + 480, + 477, + 477, + 460, + 470, + 474, + 495, + 450, + 463, + 520, + 490, + 533, + 483, + 456, + 504, + 491, + 480, + 445, + 486, + 488, + 498, + 473, + 471, + 489, + 462, + 516, + 505, + 478, + 456, + 463, + 509, + 541, + 478, + 465, + 491, + 465, + 522, + 474, + 523, + 516, + 459, + 472, + 491, + 480, + 515, + 521, + 459, + 480, + 528, + 484, + 447, + 443, + 477, + 482, + 463, + 532, + 462, + 498, + 496, + 468, + 480, + 457, + 478, + 524, + 485, + 445, + 465, + 515, + 488, + 504, + 475, + 460, + 481, + 500, + 470, + 493, + 494, + 504, + 483, + 495, + 455, + 502, + 517, + 498, + 472, + 498, + 491, + 496, + 512, + 535, + 515, + 500, + 499, + 468, + 487, + 494, + 486, + 517, + 465, + 470, + 477, + 474, + 557, + 489, + 503, + 478, + 498, + 508, + 485, + 474, + 487, + 466, + 494, + 482, + 487, + 486, + 468, + 521, + 498, + 509, + 507, + 514, + 508, + 497, + 499, + 498, + 487, + 458, + 462, + 496, + 530, + 452, + 488, + 499, + 470, + 507, + 487, + 468, + 455, + 506, + 490, + 465, + 449, + 468, + 498, + 484, + 440, + 499, + 506, + 457, + 492, + 496, + 499, + 452, + 480, + 496, + 484, + 510, + 445, + 471, + 496, + 488, + 501, + 490, + 468, + 500, + 469, + 479, + 478, + 447, + 501, + 502, + 508, + 484, + 508, + 506, + 516, + 500, + 473, + 490, + 482, + 472, + 492, + 510, + 509, + 465, + 506, + 493, + 483, + 506, + 500, + 480, + 495, + 489, + 460, + 471, + 517, + 500, + 487, + 477, + 490, + 483, + 501, + 487, + 502, + 491, + 501, + 457, + 497, + 484, + 495, + 505, + 482, + 436, + 459, + 489, + 508, + 465, + 465, + 472, + 491, + 498, + 457, + 486, + 502, + 457, + 488, + 476, + 469, + 497, + 496, + 476, + 482, + 467, + 528, + 514, + 479, + 466, + 445, + 484, + 477, + 507, + 446, + 449, + 485, + 498, + 517, + 518, + 468, + 472, + 453, + 519, + 508, + 495, + 487, + 493, + 530, + 484, + 492, + 481, + 508, + 485, + 454, + 477, + 492, + 487, + 467, + 451, + 474, + 491, + 496, + 496, + 524, + 472, + 494, + 487, + 495, + 467, + 516, + 480, + 488, + 472, + 474, + 502, + 515, + 447, + 475, + 472, + 498, + 506, + 492, + 471, + 520, + 478, + 465, + 462, + 524, + 514, + 496, + 518, + 501, + 481, + 468, + 509, + 475, + 512, + 498, + 502, + 501, + 466, + 534, + 479, + 501, + 535, + 462, + 452, + 517, + 496, + 472, + 500, + 466, + 496, + 480, + 510, + 491, + 495, + 445, + 575, + 489, + 476, + 473, + 506, + 493, + 502, + 447, + 530, + 494, + 486, + 484, + 524, + 481, + 467, + 488, + 524, + 511, + 504, + 496, + 462, + 542, + 495, + 533, + 498, + 507, + 466, + 500, + 481, + 487, + 476, + 514, + 480, + 497, + 527, + 497, + 472, + 477, + 490, + 507, + 478, + 492, + 475, + 493, + 464, + 488, + 461, + 510, + 503, + 453, + 511, + 480, + 515, + 513, + 464, + 466, + 472, + 479, + 467, + 485, + 499, + 467, + 505, + 497, + 518, + 486, + 485, + 463, + 494, + 510, + 521, + 437, + 464, + 481, + 485, + 505, + 546, + 481, + 476, + 493, + 488, + 481, + 525, + 504, + 484, + 529, + 514, + 467, + 448, + 485, + 476, + 497, + 428, + 492, + 492, + 474, + 500, + 479, + 526, + 467, + 478, + 479, + 489, + 471, + 486, + 465, + 494, + 455, + 447, + 452, + 475, + 500, + 521, + 516, + 482, + 500, + 463, + 459, + 496, + 501, + 488, + 479, + 463, + 498, + 493, + 495, + 483, + 507, + 510, + 453, + 482, + 494, + 485, + 479, + 485, + 518, + 490, + 506, + 483, + 477, + 496, + 468, + 507, + 514, + 491, + 482, + 481, + 498, + 488, + 459, + 459, + 483, + 492, + 494, + 508, + 521, + 457, + 513, + 471, + 489, + 494, + 462, + 496, + 490, + 457, + 500, + 455, + 484, + 500, + 514, + 509, + 511, + 469, + 480, + 477, + 476, + 493, + 472, + 474, + 468, + 498, + 509, + 475, + 484, + 504, + 502, + 492, + 547, + 489, + 477, + 459, + 477, + 508, + 499, + 472, + 473, + 493, + 509, + 469, + 520, + 481, + 436, + 474, + 530, + 479, + 470, + 504, + 488, + 490, + 484, + 457, + 447, + 486, + 491, + 532, + 488, + 487, + 496, + 490, + 513, + 517, + 498, + 489, + 503, + 491, + 514, + 499, + 494, + 497, + 504, + 454, + 516, + 464, + 483, + 482, + 510, + 435, + 467, + 481, + 465, + 458, + 463, + 473, + 456, + 491, + 487, + 454, + 485, + 478, + 476, + 470, + 474, + 473, + 462, + 492, + 505, + 519, + 536, + 488, + 496, + 498, + 466, + 509, + 485, + 498, + 479, + 518, + 504, + 478, + 498, + 505, + 483, + 485, + 495, + 516, + 462, + 514, + 452, + 492, + 510, + 462, + 457, + 502, + 468, + 499, + 551, + 519, + 505, + 488, + 473, + 529, + 489, + 497, + 486, + 526, + 455, + 485, + 483, + 465, + 533, + 494, + 518, + 485, + 516, + 494, + 477, + 473, + 471, + 496, + 499, + 458, + 473, + 482, + 488, + 459, + 430, + 474, + 457, + 512, + 478, + 489, + 467, + 472, + 495, + 473, + 460, + 512, + 475, + 514, + 450, + 465, + 515, + 527, + 486, + 499, + 503, + 486, + 530, + 466, + 474, + 483, + 511, + 511, + 490, + 489, + 483, + 514, + 476, + 469, + 558, + 501, + 513, + 469, + 484, + 491, + 486, + 494, + 502, + 509, + 485, + 479, + 486, + 472, + 448, + 492, + 536, + 521, + 492, + 483, + 494, + 473, + 506, + 496, + 538, + 439, + 540, + 547, + 503, + 497, + 496, + 486, + 491, + 477, + 469, + 524, + 462, + 478, + 492, + 470, + 502, + 491, + 464, + 486, + 524, + 486, + 438, + 520, + 439, + 465, + 470, + 525, + 500, + 460, + 508, + 518, + 508, + 482, + 486, + 481, + 470, + 489, + 545, + 467, + 463, + 517, + 511, + 508, + 475, + 474, + 487, + 468, + 470, + 484, + 464, + 504, + 481, + 531, + 490, + 458, + 513, + 537, + 530, + 502, + 481, + 464, + 502, + 463, + 490, + 517, + 477, + 497, + 490, + 528, + 494, + 482, + 482, + 476, + 479, + 476, + 472, + 477, + 470, + 455, + 460, + 453, + 487, + 469, + 452, + 478, + 463, + 471, + 486, + 504, + 448, + 460, + 514, + 507, + 512, + 485, + 487, + 459, + 502, + 520, + 477, + 474, + 465, + 507, + 472, + 463, + 461, + 494, + 505, + 513, + 508, + 501, + 488, + 487, + 446, + 468, + 461, + 497, + 492, + 482, + 495, + 474, + 471, + 485, + 506, + 477, + 534, + 488, + 502, + 498, + 472, + 493, + 465, + 487, + 487, + 468, + 496, + 510, + 500, + 494, + 527, + 463, + 497, + 504, + 477, + 473, + 537, + 499, + 531, + 498, + 481, + 499, + 479, + 500, + 500, + 503, + 492, + 470, + 518, + 494, + 507, + 522, + 468, + 509, + 466, + 491, + 470, + 482, + 484, + 471, + 492, + 484, + 492, + 489, + 489, + 462, + 453, + 491, + 493, + 474, + 450, + 486, + 519, + 481, + 504, + 498, + 525, + 502, + 471, + 458, + 463, + 513, + 537, + 492, + 487, + 521, + 495, + 459, + 483, + 478, + 491, + 479, + 466, + 482, + 502, + 455, + 515, + 524, + 479, + 493, + 528, + 481, + 476, + 486, + 507, + 485, + 505, + 490, + 497, + 441, + 482, + 532, + 477, + 456, + 438, + 514, + 456, + 495, + 477, + 545, + 507, + 458, + 478, + 484, + 497, + 503, + 468, + 493, + 489, + 446, + 490, + 491, + 471, + 494, + 485, + 506, + 478, + 498, + 461, + 479, + 474, + 461, + 473, + 509, + 501, + 491, + 434, + 462, + 519, + 491, + 504, + 506, + 510, + 491, + 475, + 512, + 482, + 506, + 515, + 518, + 461, + 478, + 466, + 527, + 520, + 504, + 509, + 472, + 465, + 439, + 463, + 470, + 522, + 512, + 486, + 483, + 473, + 492, + 517, + 521, + 457, + 463, + 495, + 501, + 518, + 484, + 473, + 496, + 484, + 461, + 515, + 487, + 478, + 508, + 487, + 456, + 474, + 474, + 502, + 502, + 485, + 488, + 500, + 493, + 459, + 537, + 482, + 442, + 478, + 458, + 494, + 460, + 532, + 478, + 436, + 528, + 495, + 507, + 471, + 495, + 482, + 505, + 487, + 484, + 488, + 506, + 536, + 494, + 481, + 486, + 490, + 529, + 511, + 473, + 477, + 483, + 504, + 492, + 517, + 501, + 513, + 473, + 471, + 487, + 490, + 504, + 511, + 511, + 467, + 442, + 500, + 491, + 506, + 513, + 496, + 491, + 514, + 490, + 490, + 509, + 488, + 509, + 464, + 505, + 448, + 477, + 476, + 480, + 488, + 457, + 503, + 515, + 483, + 462, + 464, + 477, + 499, + 473, + 492, + 489, + 465, + 541, + 483, + 520, + 519, + 458, + 479, + 474, + 451, + 492, + 458, + 493, + 518, + 511, + 512, + 494, + 479, + 491, + 435, + 483, + 457, + 511, + 523, + 505, + 476, + 513, + 480, + 525, + 507, + 498, + 485, + 488, + 462, + 488, + 494, + 499, + 479, + 472, + 517, + 480, + 503, + 469, + 458, + 457, + 483, + 480, + 464, + 496, + 506, + 461, + 474, + 486, + 487, + 486, + 483, + 508, + 471, + 518, + 454, + 499, + 468, + 482, + 476, + 473, + 507, + 524, + 477, + 474, + 557, + 470, + 443, + 543, + 519, + 482, + 492, + 483, + 498, + 461, + 503, + 516, + 496, + 485, + 487, + 474, + 496, + 541, + 491, + 461, + 507, + 530, + 446, + 499, + 488, + 523, + 499, + 490, + 473, + 488, + 493, + 478, + 490, + 476, + 508, + 470, + 465, + 503, + 484, + 495, + 520, + 483, + 531, + 447, + 502, + 481, + 483, + 463, + 498, + 481, + 498, + 522, + 488, + 473, + 510, + 507, + 489, + 453, + 470, + 469, + 494, + 476, + 516, + 463, + 484, + 433, + 505, + 480, + 517, + 474, + 513, + 481, + 528, + 474, + 486, + 515, + 488, + 485, + 514, + 457, + 480, + 519, + 486, + 430, + 513, + 488, + 471, + 474, + 481, + 490, + 496, + 459, + 453, + 499, + 477, + 474, + 503, + 496, + 470, + 479, + 471, + 449, + 476, + 482, + 495, + 481, + 483, + 493, + 470, + 521, + 506, + 495, + 485, + 463, + 491, + 471, + 500, + 447, + 464, + 520, + 501, + 477, + 517, + 492, + 471, + 486, + 459, + 477, + 495, + 471, + 504, + 455, + 448, + 532, + 498, + 494, + 513, + 462, + 457, + 497, + 507, + 508, + 498, + 488, + 484, + 525, + 444, + 493, + 498, + 492, + 501, + 506, + 478 + ] + }, + { + "counters": [ + 495, + 433, + 458, + 465, + 476, + 491, + 493, + 463, + 501, + 466, + 487, + 490, + 482, + 435, + 458, + 487, + 483, + 500, + 521, + 516, + 476, + 527, + 486, + 452, + 482, + 513, + 478, + 500, + 491, + 473, + 496, + 464, + 489, + 498, + 479, + 526, + 511, + 547, + 489, + 504, + 457, + 522, + 501, + 513, + 463, + 516, + 466, + 462, + 500, + 505, + 533, + 473, + 444, + 508, + 504, + 495, + 488, + 504, + 488, + 502, + 509, + 447, + 473, + 494, + 516, + 481, + 465, + 497, + 475, + 517, + 451, + 477, + 470, + 483, + 446, + 486, + 517, + 495, + 481, + 505, + 487, + 487, + 493, + 527, + 474, + 500, + 458, + 497, + 513, + 521, + 468, + 491, + 496, + 502, + 468, + 492, + 436, + 483, + 491, + 478, + 505, + 516, + 489, + 508, + 500, + 438, + 491, + 471, + 454, + 475, + 507, + 507, + 503, + 449, + 463, + 465, + 462, + 483, + 467, + 482, + 473, + 471, + 526, + 461, + 461, + 488, + 460, + 468, + 449, + 483, + 485, + 471, + 476, + 490, + 508, + 486, + 489, + 492, + 526, + 481, + 452, + 493, + 463, + 472, + 480, + 492, + 537, + 466, + 537, + 478, + 489, + 468, + 512, + 480, + 512, + 479, + 473, + 477, + 472, + 471, + 468, + 477, + 475, + 486, + 490, + 506, + 500, + 490, + 508, + 496, + 455, + 479, + 507, + 449, + 521, + 474, + 507, + 484, + 531, + 485, + 488, + 508, + 506, + 450, + 464, + 481, + 493, + 487, + 460, + 450, + 487, + 493, + 452, + 459, + 526, + 492, + 497, + 484, + 487, + 527, + 500, + 517, + 485, + 504, + 485, + 484, + 469, + 530, + 469, + 453, + 493, + 485, + 472, + 531, + 475, + 490, + 480, + 504, + 495, + 508, + 496, + 528, + 458, + 484, + 468, + 536, + 495, + 473, + 455, + 513, + 477, + 485, + 459, + 499, + 479, + 461, + 477, + 517, + 502, + 490, + 460, + 499, + 475, + 484, + 505, + 502, + 470, + 482, + 530, + 503, + 478, + 481, + 488, + 490, + 493, + 490, + 481, + 492, + 436, + 485, + 505, + 489, + 513, + 518, + 531, + 474, + 479, + 476, + 495, + 460, + 516, + 473, + 470, + 505, + 467, + 472, + 567, + 474, + 482, + 513, + 457, + 502, + 522, + 476, + 483, + 471, + 506, + 458, + 467, + 472, + 460, + 444, + 533, + 509, + 516, + 505, + 495, + 462, + 499, + 507, + 493, + 453, + 458, + 474, + 475, + 476, + 508, + 494, + 469, + 477, + 462, + 468, + 510, + 502, + 495, + 421, + 499, + 459, + 542, + 481, + 481, + 503, + 487, + 458, + 465, + 510, + 482, + 466, + 468, + 468, + 485, + 486, + 478, + 448, + 493, + 524, + 540, + 529, + 470, + 494, + 481, + 478, + 500, + 495, + 487, + 529, + 484, + 508, + 467, + 531, + 477, + 509, + 466, + 473, + 481, + 497, + 500, + 524, + 468, + 505, + 542, + 457, + 493, + 463, + 495, + 515, + 492, + 521, + 496, + 486, + 466, + 478, + 499, + 489, + 464, + 475, + 458, + 526, + 505, + 498, + 499, + 457, + 491, + 497, + 500, + 478, + 494, + 521, + 513, + 492, + 533, + 460, + 507, + 493, + 486, + 502, + 513, + 481, + 512, + 523, + 487, + 498, + 475, + 472, + 536, + 509, + 491, + 449, + 500, + 477, + 516, + 474, + 484, + 488, + 490, + 469, + 493, + 495, + 473, + 454, + 472, + 478, + 497, + 491, + 527, + 491, + 493, + 473, + 475, + 488, + 466, + 468, + 486, + 502, + 454, + 476, + 476, + 495, + 476, + 485, + 445, + 464, + 505, + 501, + 486, + 525, + 538, + 478, + 487, + 495, + 506, + 487, + 484, + 496, + 525, + 491, + 493, + 502, + 452, + 506, + 504, + 491, + 517, + 472, + 466, + 516, + 466, + 486, + 464, + 517, + 516, + 480, + 508, + 493, + 499, + 518, + 515, + 507, + 469, + 517, + 494, + 475, + 457, + 471, + 482, + 490, + 502, + 483, + 492, + 499, + 486, + 487, + 514, + 478, + 507, + 513, + 500, + 512, + 487, + 460, + 519, + 523, + 483, + 469, + 478, + 462, + 492, + 474, + 431, + 478, + 482, + 479, + 510, + 486, + 514, + 480, + 533, + 495, + 446, + 486, + 506, + 482, + 498, + 475, + 487, + 541, + 478, + 464, + 528, + 505, + 485, + 530, + 476, + 489, + 497, + 491, + 493, + 501, + 449, + 522, + 483, + 482, + 463, + 507, + 477, + 443, + 457, + 467, + 477, + 480, + 501, + 486, + 516, + 484, + 460, + 508, + 501, + 493, + 494, + 497, + 460, + 456, + 520, + 492, + 496, + 479, + 458, + 480, + 449, + 501, + 482, + 457, + 483, + 498, + 505, + 535, + 479, + 462, + 535, + 503, + 457, + 510, + 502, + 510, + 492, + 503, + 493, + 492, + 453, + 479, + 486, + 436, + 489, + 494, + 504, + 517, + 484, + 475, + 477, + 436, + 491, + 478, + 477, + 493, + 529, + 482, + 436, + 513, + 513, + 491, + 526, + 481, + 456, + 490, + 469, + 501, + 482, + 480, + 494, + 520, + 502, + 460, + 463, + 488, + 496, + 501, + 462, + 493, + 486, + 523, + 482, + 482, + 478, + 475, + 473, + 507, + 460, + 491, + 461, + 524, + 498, + 479, + 477, + 513, + 492, + 478, + 475, + 510, + 517, + 468, + 488, + 492, + 473, + 468, + 482, + 512, + 483, + 512, + 473, + 468, + 509, + 497, + 480, + 494, + 482, + 551, + 499, + 471, + 472, + 473, + 477, + 508, + 492, + 508, + 441, + 497, + 498, + 481, + 488, + 526, + 483, + 502, + 507, + 484, + 516, + 506, + 473, + 479, + 505, + 538, + 456, + 455, + 479, + 506, + 465, + 456, + 510, + 447, + 498, + 493, + 459, + 503, + 492, + 496, + 524, + 494, + 474, + 482, + 503, + 507, + 496, + 482, + 484, + 499, + 499, + 513, + 442, + 514, + 478, + 475, + 483, + 487, + 484, + 497, + 537, + 478, + 515, + 496, + 494, + 461, + 490, + 494, + 464, + 481, + 465, + 455, + 494, + 506, + 469, + 490, + 470, + 492, + 475, + 491, + 450, + 469, + 458, + 496, + 489, + 491, + 481, + 492, + 471, + 452, + 512, + 480, + 496, + 500, + 516, + 494, + 504, + 496, + 485, + 524, + 461, + 499, + 478, + 516, + 497, + 481, + 488, + 499, + 474, + 498, + 487, + 467, + 483, + 505, + 468, + 498, + 474, + 475, + 509, + 468, + 502, + 471, + 505, + 469, + 477, + 493, + 476, + 477, + 441, + 470, + 479, + 487, + 452, + 540, + 530, + 535, + 527, + 512, + 469, + 520, + 488, + 472, + 461, + 468, + 514, + 505, + 494, + 511, + 492, + 517, + 541, + 488, + 477, + 509, + 454, + 503, + 495, + 518, + 521, + 476, + 506, + 488, + 464, + 479, + 457, + 515, + 470, + 473, + 504, + 521, + 489, + 469, + 460, + 529, + 524, + 499, + 470, + 480, + 494, + 486, + 509, + 510, + 508, + 439, + 475, + 497, + 510, + 474, + 500, + 481, + 477, + 515, + 464, + 498, + 523, + 491, + 492, + 485, + 512, + 481, + 492, + 437, + 474, + 486, + 519, + 470, + 483, + 475, + 489, + 521, + 482, + 482, + 532, + 494, + 534, + 502, + 487, + 496, + 487, + 511, + 507, + 502, + 499, + 506, + 477, + 463, + 493, + 525, + 534, + 484, + 500, + 511, + 518, + 488, + 510, + 428, + 471, + 482, + 461, + 500, + 509, + 462, + 479, + 512, + 471, + 461, + 468, + 469, + 501, + 494, + 470, + 486, + 507, + 511, + 433, + 520, + 535, + 497, + 473, + 450, + 535, + 492, + 471, + 473, + 507, + 429, + 427, + 510, + 458, + 413, + 470, + 478, + 490, + 470, + 496, + 468, + 492, + 483, + 464, + 488, + 532, + 462, + 476, + 516, + 459, + 488, + 497, + 505, + 497, + 457, + 474, + 448, + 489, + 502, + 468, + 509, + 506, + 521, + 466, + 484, + 521, + 476, + 492, + 476, + 481, + 490, + 468, + 497, + 477, + 462, + 467, + 497, + 475, + 521, + 490, + 470, + 471, + 507, + 486, + 481, + 511, + 501, + 499, + 508, + 460, + 478, + 491, + 487, + 520, + 497, + 478, + 472, + 458, + 465, + 496, + 482, + 493, + 492, + 486, + 491, + 527, + 474, + 495, + 511, + 471, + 486, + 485, + 494, + 495, + 478, + 465, + 507, + 479, + 508, + 507, + 500, + 482, + 516, + 498, + 492, + 521, + 524, + 503, + 488, + 493, + 463, + 518, + 537, + 483, + 480, + 465, + 527, + 495, + 493, + 508, + 482, + 495, + 521, + 492, + 494, + 481, + 475, + 443, + 490, + 479, + 477, + 494, + 471, + 484, + 431, + 452, + 436, + 501, + 480, + 477, + 467, + 490, + 484, + 474, + 483, + 508, + 507, + 507, + 530, + 525, + 489, + 497, + 502, + 507, + 485, + 478, + 516, + 472, + 473, + 485, + 477, + 465, + 513, + 463, + 487, + 514, + 489, + 454, + 476, + 480, + 484, + 479, + 513, + 462, + 486, + 520, + 504, + 515, + 458, + 513, + 526, + 491, + 451, + 489, + 520, + 515, + 454, + 463, + 481, + 493, + 498, + 508, + 482, + 474, + 489, + 457, + 461, + 481, + 499, + 482, + 524, + 509, + 511, + 447, + 509, + 482, + 473, + 478, + 507, + 471, + 486, + 532, + 516, + 474, + 489, + 540, + 510, + 514, + 477, + 497, + 463, + 492, + 507, + 515, + 495, + 510, + 469, + 487, + 482, + 472, + 504, + 506, + 503, + 522, + 501, + 491, + 482, + 487, + 530, + 474, + 498, + 478, + 477, + 491, + 495, + 460, + 512, + 474, + 460, + 483, + 518, + 532, + 487, + 483, + 509, + 529, + 490, + 515, + 483, + 487, + 448, + 488, + 494, + 474, + 454, + 495, + 473, + 479, + 472, + 462, + 502, + 439, + 464, + 519, + 456, + 501, + 436, + 487, + 490, + 502, + 468, + 442, + 483, + 504, + 473, + 495, + 528, + 475, + 498, + 483, + 529, + 476, + 489, + 509, + 474, + 457, + 470, + 487, + 480, + 451, + 475, + 459, + 485, + 490, + 493, + 492, + 421, + 501, + 480, + 446, + 482, + 486, + 501, + 497, + 512, + 482, + 456, + 502, + 451, + 489, + 515, + 462, + 494, + 475, + 496, + 502, + 495, + 471, + 490, + 440, + 491, + 489, + 506, + 487, + 490, + 459, + 491, + 459, + 469, + 468, + 445, + 487, + 494, + 491, + 490, + 474, + 454, + 480, + 503, + 476, + 491, + 459, + 444, + 480, + 497, + 423, + 512, + 508, + 528, + 460, + 501, + 495, + 518, + 477, + 506, + 498, + 496, + 507, + 468, + 462, + 462, + 508, + 502, + 468, + 485, + 472, + 475, + 487, + 493, + 522, + 484, + 513, + 513, + 525, + 491, + 513, + 479, + 414, + 494, + 473, + 450, + 494, + 474, + 497, + 525, + 465, + 507, + 505, + 456, + 492, + 458, + 465, + 457, + 534, + 537, + 475, + 481, + 481, + 470, + 500, + 507, + 487, + 469, + 463, + 473, + 509, + 497, + 456, + 485, + 490, + 494, + 486, + 501, + 481, + 529, + 492, + 517, + 488, + 501, + 493, + 486, + 481, + 547, + 509, + 505, + 507, + 480, + 510, + 491, + 524, + 519, + 469, + 488, + 493, + 464, + 467, + 519, + 441, + 493, + 505, + 496, + 481, + 470, + 528, + 467, + 495, + 499, + 490, + 487, + 480, + 537, + 495, + 471, + 469, + 497, + 487, + 494, + 447, + 454, + 453, + 493, + 523, + 473, + 453, + 510, + 499, + 465, + 508, + 509, + 499, + 446, + 493, + 511, + 520, + 484, + 503, + 458, + 447, + 454, + 459, + 474, + 461, + 483, + 507, + 455, + 464, + 498, + 485, + 492, + 472, + 456, + 468, + 525, + 508, + 459, + 493, + 472, + 501, + 503, + 485, + 471, + 510, + 439, + 494, + 494, + 500, + 490, + 468, + 497, + 516, + 467, + 481, + 473, + 474, + 501, + 512, + 487, + 517, + 461, + 495, + 475, + 508, + 480, + 497, + 515, + 530, + 489, + 490, + 454, + 483, + 475, + 492, + 521, + 488, + 495, + 492, + 480, + 524, + 484, + 479, + 457, + 481, + 526, + 502, + 480, + 476, + 452, + 530, + 481, + 518, + 498, + 509, + 439, + 472, + 492, + 490, + 517, + 508, + 502, + 508, + 511, + 488, + 510, + 504, + 491, + 509, + 462, + 457, + 474, + 508, + 523, + 488, + 481, + 539, + 492, + 454, + 523, + 511, + 500, + 493, + 436, + 461, + 450, + 515, + 497, + 462, + 490, + 483, + 419, + 510, + 475, + 461, + 468, + 506, + 492, + 464, + 469, + 501, + 481, + 512, + 473, + 513, + 462, + 500, + 513, + 475, + 462, + 484, + 491, + 470, + 452, + 459, + 516, + 529, + 539, + 479, + 486, + 489, + 508, + 515, + 502, + 465, + 471, + 486, + 479, + 464, + 492, + 481, + 490, + 478, + 458, + 514, + 502, + 506, + 477, + 478, + 505, + 466, + 531, + 474, + 475, + 498, + 517, + 504, + 480, + 537, + 481, + 480, + 471, + 487, + 480, + 466, + 484, + 499, + 465, + 466, + 503, + 420, + 496, + 525, + 512, + 520, + 451, + 495, + 502, + 482, + 484, + 492, + 507, + 495, + 479, + 505, + 489, + 513, + 466, + 464, + 482, + 511, + 467, + 483, + 514, + 483, + 490, + 522, + 478, + 455, + 473, + 511, + 485, + 479, + 499, + 499, + 487, + 499, + 444, + 493, + 491, + 477, + 511, + 456, + 507, + 529, + 506, + 476, + 441, + 508, + 495, + 477, + 494, + 461, + 516, + 525, + 490, + 488, + 496, + 515, + 479, + 582, + 513, + 463, + 496, + 498, + 442, + 477, + 509, + 499, + 473, + 495, + 490, + 525, + 474, + 496, + 458, + 501, + 471, + 474, + 501, + 477, + 503, + 465, + 517, + 520, + 469, + 506, + 492, + 508, + 481, + 488, + 507, + 491, + 531, + 526, + 463, + 517, + 452, + 474, + 488, + 503, + 492, + 505, + 442, + 474, + 461, + 493, + 466, + 493, + 461, + 486, + 475, + 480, + 507, + 502, + 493, + 490, + 490, + 483, + 479, + 484, + 507, + 451, + 465, + 450, + 517, + 502, + 502, + 485, + 481, + 471, + 498, + 465, + 462, + 484, + 437, + 460, + 495, + 438, + 462, + 462, + 510, + 529, + 484, + 485, + 488, + 509, + 453, + 499, + 500, + 499, + 479, + 528, + 487, + 483, + 481, + 474, + 489, + 478, + 475, + 471, + 486, + 476, + 479, + 534, + 480, + 494, + 482, + 507, + 530, + 487, + 497, + 473, + 473, + 472, + 458, + 442, + 440, + 459, + 505, + 502, + 498, + 467, + 500, + 505, + 517, + 522, + 479, + 494, + 487, + 457, + 472, + 480, + 517, + 483, + 514, + 486, + 471, + 457, + 504, + 471, + 466, + 494, + 508, + 465, + 487, + 522, + 500, + 484, + 487, + 482, + 450, + 494, + 527, + 483, + 479, + 472, + 521, + 464, + 486, + 512, + 489, + 503, + 478, + 492, + 527, + 507, + 528, + 507, + 478, + 462, + 461, + 462, + 497, + 543, + 498, + 477, + 492, + 493, + 466, + 480, + 509, + 530, + 448, + 522, + 475, + 484, + 455, + 444, + 477, + 491, + 494, + 450, + 494, + 507, + 515, + 447, + 512, + 506, + 486, + 452, + 491, + 472, + 513, + 511, + 503, + 504, + 477, + 501, + 516, + 494, + 480, + 516, + 482, + 480, + 483, + 440, + 492, + 464, + 501, + 498, + 506, + 500, + 497, + 472, + 527, + 520, + 459, + 504, + 495, + 474, + 489, + 452, + 499, + 485, + 466, + 512, + 500, + 485, + 516, + 495, + 476, + 514, + 494, + 497, + 492, + 476, + 501, + 501, + 465, + 510, + 502, + 476, + 525, + 517, + 526, + 521, + 491, + 481, + 480, + 455, + 469, + 477, + 523, + 515, + 511, + 429, + 481, + 522, + 515, + 473, + 481, + 511, + 492, + 479, + 478, + 479, + 526, + 499, + 438, + 491, + 535, + 497, + 426, + 495, + 489, + 465, + 467, + 485, + 443, + 461, + 466, + 462, + 467, + 553, + 502, + 504, + 496, + 481, + 454, + 454, + 458, + 528, + 493, + 482, + 505, + 495, + 522, + 473, + 494, + 442, + 499, + 484, + 496, + 561, + 438, + 512, + 468, + 514, + 472, + 464, + 503, + 526, + 480, + 512, + 467, + 465, + 444, + 504, + 503, + 486, + 490, + 492, + 490, + 524, + 474, + 491, + 488, + 497, + 514, + 483, + 452, + 472, + 532, + 491, + 481, + 487, + 509, + 512, + 507, + 490, + 456, + 511, + 507, + 477, + 452, + 510, + 469, + 481, + 467, + 497, + 461, + 510, + 487, + 491, + 508, + 467, + 463, + 433, + 500, + 488, + 483, + 460, + 508, + 512, + 447, + 470, + 466, + 492, + 502, + 510, + 481, + 537, + 515, + 524, + 506, + 501, + 535, + 526, + 537, + 492, + 466, + 518, + 502, + 528, + 494, + 416, + 483, + 465, + 505, + 472, + 518 + ] + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 2991746, + "last_update_version": 417600051000901632, + "correlation": -1 + } + }, + "indices": { + "idx_a": { + "histogram": { + "ndv": 1000000, + "buckets": [ + { + "count": 4096, + "lower_bound": "A4AAAAAAAAAB", + "upper_bound": "A4AAAAAAABAA", + "repeats": 1 + }, + { + "count": 8192, + "lower_bound": "A4AAAAAAABAB", + "upper_bound": "A4AAAAAAACAA", + "repeats": 1 + }, + { + "count": 12288, + "lower_bound": "A4AAAAAAACAB", + "upper_bound": "A4AAAAAAADAA", + "repeats": 1 + }, + { + "count": 16384, + "lower_bound": "A4AAAAAAADAB", + "upper_bound": "A4AAAAAAAEAA", + "repeats": 1 + }, + { + "count": 20480, + "lower_bound": "A4AAAAAAAEAB", + "upper_bound": "A4AAAAAAAFAA", + "repeats": 1 + }, + { + "count": 24576, + "lower_bound": "A4AAAAAAAFAB", + "upper_bound": "A4AAAAAAAGAA", + "repeats": 1 + }, + { + "count": 28672, + "lower_bound": "A4AAAAAAAGAB", + "upper_bound": "A4AAAAAAAHAA", + "repeats": 1 + }, + { + "count": 32768, + "lower_bound": "A4AAAAAAAHAB", + "upper_bound": "A4AAAAAAAIAA", + "repeats": 1 + }, + { + "count": 36864, + "lower_bound": "A4AAAAAAAIAB", + "upper_bound": "A4AAAAAAAJAA", + "repeats": 1 + }, + { + "count": 40960, + "lower_bound": "A4AAAAAAAJAB", + "upper_bound": "A4AAAAAAAKAA", + "repeats": 1 + }, + { + "count": 45056, + "lower_bound": "A4AAAAAAAKAB", + "upper_bound": "A4AAAAAAALAA", + "repeats": 1 + }, + { + "count": 49152, + "lower_bound": "A4AAAAAAALAB", + "upper_bound": "A4AAAAAAAMAA", + "repeats": 1 + }, + { + "count": 53248, + "lower_bound": "A4AAAAAAAMAB", + "upper_bound": "A4AAAAAAANAA", + "repeats": 1 + }, + { + "count": 57344, + "lower_bound": "A4AAAAAAANAB", + "upper_bound": "A4AAAAAAAOAA", + "repeats": 1 + }, + { + "count": 61440, + "lower_bound": "A4AAAAAAAOAB", + "upper_bound": "A4AAAAAAAPAA", + "repeats": 1 + }, + { + "count": 65536, + "lower_bound": "A4AAAAAAAPAB", + "upper_bound": "A4AAAAAAAQAA", + "repeats": 1 + }, + { + "count": 69632, + "lower_bound": "A4AAAAAAAQAB", + "upper_bound": "A4AAAAAAARAA", + "repeats": 1 + }, + { + "count": 73728, + "lower_bound": "A4AAAAAAARAB", + "upper_bound": "A4AAAAAAASAA", + "repeats": 1 + }, + { + "count": 77824, + "lower_bound": "A4AAAAAAASAB", + "upper_bound": "A4AAAAAAATAA", + "repeats": 1 + }, + { + "count": 81920, + "lower_bound": "A4AAAAAAATAB", + "upper_bound": "A4AAAAAAAUAA", + "repeats": 1 + }, + { + "count": 86016, + "lower_bound": "A4AAAAAAAUAB", + "upper_bound": "A4AAAAAAAVAA", + "repeats": 1 + }, + { + "count": 90112, + "lower_bound": "A4AAAAAAAVAB", + "upper_bound": "A4AAAAAAAWAA", + "repeats": 1 + }, + { + "count": 94208, + "lower_bound": "A4AAAAAAAWAB", + "upper_bound": "A4AAAAAAAXAA", + "repeats": 1 + }, + { + "count": 98304, + "lower_bound": "A4AAAAAAAXAB", + "upper_bound": "A4AAAAAAAYAA", + "repeats": 1 + }, + { + "count": 102400, + "lower_bound": "A4AAAAAAAYAB", + "upper_bound": "A4AAAAAAAZAA", + "repeats": 1 + }, + { + "count": 106496, + "lower_bound": "A4AAAAAAAZAB", + "upper_bound": "A4AAAAAAAaAA", + "repeats": 1 + }, + { + "count": 110592, + "lower_bound": "A4AAAAAAAaAB", + "upper_bound": "A4AAAAAAAbAA", + "repeats": 1 + }, + { + "count": 114688, + "lower_bound": "A4AAAAAAAbAB", + "upper_bound": "A4AAAAAAAcAA", + "repeats": 1 + }, + { + "count": 118784, + "lower_bound": "A4AAAAAAAcAB", + "upper_bound": "A4AAAAAAAdAA", + "repeats": 1 + }, + { + "count": 122880, + "lower_bound": "A4AAAAAAAdAB", + "upper_bound": "A4AAAAAAAeAA", + "repeats": 1 + }, + { + "count": 126976, + "lower_bound": "A4AAAAAAAeAB", + "upper_bound": "A4AAAAAAAfAA", + "repeats": 1 + }, + { + "count": 131072, + "lower_bound": "A4AAAAAAAfAB", + "upper_bound": "A4AAAAAAAgAA", + "repeats": 1 + }, + { + "count": 135168, + "lower_bound": "A4AAAAAAAgAB", + "upper_bound": "A4AAAAAAAhAA", + "repeats": 1 + }, + { + "count": 139264, + "lower_bound": "A4AAAAAAAhAB", + "upper_bound": "A4AAAAAAAiAA", + "repeats": 1 + }, + { + "count": 143360, + "lower_bound": "A4AAAAAAAiAB", + "upper_bound": "A4AAAAAAAjAA", + "repeats": 1 + }, + { + "count": 147456, + "lower_bound": "A4AAAAAAAjAB", + "upper_bound": "A4AAAAAAAkAA", + "repeats": 1 + }, + { + "count": 151552, + "lower_bound": "A4AAAAAAAkAB", + "upper_bound": "A4AAAAAAAlAA", + "repeats": 1 + }, + { + "count": 155648, + "lower_bound": "A4AAAAAAAlAB", + "upper_bound": "A4AAAAAAAmAA", + "repeats": 1 + }, + { + "count": 159744, + "lower_bound": "A4AAAAAAAmAB", + "upper_bound": "A4AAAAAAAnAA", + "repeats": 1 + }, + { + "count": 163840, + "lower_bound": "A4AAAAAAAnAB", + "upper_bound": "A4AAAAAAAoAA", + "repeats": 1 + }, + { + "count": 167936, + "lower_bound": "A4AAAAAAAoAB", + "upper_bound": "A4AAAAAAApAA", + "repeats": 1 + }, + { + "count": 172032, + "lower_bound": "A4AAAAAAApAB", + "upper_bound": "A4AAAAAAAqAA", + "repeats": 1 + }, + { + "count": 176128, + "lower_bound": "A4AAAAAAAqAB", + "upper_bound": "A4AAAAAAArAA", + "repeats": 1 + }, + { + "count": 180224, + "lower_bound": "A4AAAAAAArAB", + "upper_bound": "A4AAAAAAAsAA", + "repeats": 1 + }, + { + "count": 184320, + "lower_bound": "A4AAAAAAAsAB", + "upper_bound": "A4AAAAAAAtAA", + "repeats": 1 + }, + { + "count": 188416, + "lower_bound": "A4AAAAAAAtAB", + "upper_bound": "A4AAAAAAAuAA", + "repeats": 1 + }, + { + "count": 192512, + "lower_bound": "A4AAAAAAAuAB", + "upper_bound": "A4AAAAAAAvAA", + "repeats": 1 + }, + { + "count": 196608, + "lower_bound": "A4AAAAAAAvAB", + "upper_bound": "A4AAAAAAAwAA", + "repeats": 1 + }, + { + "count": 200704, + "lower_bound": "A4AAAAAAAwAB", + "upper_bound": "A4AAAAAAAxAA", + "repeats": 1 + }, + { + "count": 204800, + "lower_bound": "A4AAAAAAAxAB", + "upper_bound": "A4AAAAAAAyAA", + "repeats": 1 + }, + { + "count": 208896, + "lower_bound": "A4AAAAAAAyAB", + "upper_bound": "A4AAAAAAAzAA", + "repeats": 1 + }, + { + "count": 212992, + "lower_bound": "A4AAAAAAAzAB", + "upper_bound": "A4AAAAAAA0AA", + "repeats": 1 + }, + { + "count": 217088, + "lower_bound": "A4AAAAAAA0AB", + "upper_bound": "A4AAAAAAA1AA", + "repeats": 1 + }, + { + "count": 221184, + "lower_bound": "A4AAAAAAA1AB", + "upper_bound": "A4AAAAAAA2AA", + "repeats": 1 + }, + { + "count": 225280, + "lower_bound": "A4AAAAAAA2AB", + "upper_bound": "A4AAAAAAA3AA", + "repeats": 1 + }, + { + "count": 229376, + "lower_bound": "A4AAAAAAA3AB", + "upper_bound": "A4AAAAAAA4AA", + "repeats": 1 + }, + { + "count": 233472, + "lower_bound": "A4AAAAAAA4AB", + "upper_bound": "A4AAAAAAA5AA", + "repeats": 1 + }, + { + "count": 237568, + "lower_bound": "A4AAAAAAA5AB", + "upper_bound": "A4AAAAAAA6AA", + "repeats": 1 + }, + { + "count": 241664, + "lower_bound": "A4AAAAAAA6AB", + "upper_bound": "A4AAAAAAA7AA", + "repeats": 1 + }, + { + "count": 245760, + "lower_bound": "A4AAAAAAA7AB", + "upper_bound": "A4AAAAAAA8AA", + "repeats": 1 + }, + { + "count": 249856, + "lower_bound": "A4AAAAAAA8AB", + "upper_bound": "A4AAAAAAA9AA", + "repeats": 1 + }, + { + "count": 253952, + "lower_bound": "A4AAAAAAA9AB", + "upper_bound": "A4AAAAAAA+AA", + "repeats": 1 + }, + { + "count": 258048, + "lower_bound": "A4AAAAAAA+AB", + "upper_bound": "A4AAAAAAA/AA", + "repeats": 1 + }, + { + "count": 262144, + "lower_bound": "A4AAAAAAA/AB", + "upper_bound": "A4AAAAAABAAA", + "repeats": 1 + }, + { + "count": 266240, + "lower_bound": "A4AAAAAABAAB", + "upper_bound": "A4AAAAAABBAA", + "repeats": 1 + }, + { + "count": 270336, + "lower_bound": "A4AAAAAABBAB", + "upper_bound": "A4AAAAAABCAA", + "repeats": 1 + }, + { + "count": 274432, + "lower_bound": "A4AAAAAABCAB", + "upper_bound": "A4AAAAAABDAA", + "repeats": 1 + }, + { + "count": 278528, + "lower_bound": "A4AAAAAABDAB", + "upper_bound": "A4AAAAAABEAA", + "repeats": 1 + }, + { + "count": 282624, + "lower_bound": "A4AAAAAABEAB", + "upper_bound": "A4AAAAAABFAA", + "repeats": 1 + }, + { + "count": 286720, + "lower_bound": "A4AAAAAABFAB", + "upper_bound": "A4AAAAAABGAA", + "repeats": 1 + }, + { + "count": 290816, + "lower_bound": "A4AAAAAABGAB", + "upper_bound": "A4AAAAAABHAA", + "repeats": 1 + }, + { + "count": 294912, + "lower_bound": "A4AAAAAABHAB", + "upper_bound": "A4AAAAAABIAA", + "repeats": 1 + }, + { + "count": 299008, + "lower_bound": "A4AAAAAABIAB", + "upper_bound": "A4AAAAAABJAA", + "repeats": 1 + }, + { + "count": 303104, + "lower_bound": "A4AAAAAABJAB", + "upper_bound": "A4AAAAAABKAA", + "repeats": 1 + }, + { + "count": 307200, + "lower_bound": "A4AAAAAABKAB", + "upper_bound": "A4AAAAAABLAA", + "repeats": 1 + }, + { + "count": 311296, + "lower_bound": "A4AAAAAABLAB", + "upper_bound": "A4AAAAAABMAA", + "repeats": 1 + }, + { + "count": 315392, + "lower_bound": "A4AAAAAABMAB", + "upper_bound": "A4AAAAAABNAA", + "repeats": 1 + }, + { + "count": 319488, + "lower_bound": "A4AAAAAABNAB", + "upper_bound": "A4AAAAAABOAA", + "repeats": 1 + }, + { + "count": 323584, + "lower_bound": "A4AAAAAABOAB", + "upper_bound": "A4AAAAAABPAA", + "repeats": 1 + }, + { + "count": 327680, + "lower_bound": "A4AAAAAABPAB", + "upper_bound": "A4AAAAAABQAA", + "repeats": 1 + }, + { + "count": 331776, + "lower_bound": "A4AAAAAABQAB", + "upper_bound": "A4AAAAAABRAA", + "repeats": 1 + }, + { + "count": 335872, + "lower_bound": "A4AAAAAABRAB", + "upper_bound": "A4AAAAAABSAA", + "repeats": 1 + }, + { + "count": 339968, + "lower_bound": "A4AAAAAABSAB", + "upper_bound": "A4AAAAAABTAA", + "repeats": 1 + }, + { + "count": 344064, + "lower_bound": "A4AAAAAABTAB", + "upper_bound": "A4AAAAAABUAA", + "repeats": 1 + }, + { + "count": 348160, + "lower_bound": "A4AAAAAABUAB", + "upper_bound": "A4AAAAAABVAA", + "repeats": 1 + }, + { + "count": 352256, + "lower_bound": "A4AAAAAABVAB", + "upper_bound": "A4AAAAAABWAA", + "repeats": 1 + }, + { + "count": 356352, + "lower_bound": "A4AAAAAABWAB", + "upper_bound": "A4AAAAAABXAA", + "repeats": 1 + }, + { + "count": 360448, + "lower_bound": "A4AAAAAABXAB", + "upper_bound": "A4AAAAAABYAA", + "repeats": 1 + }, + { + "count": 364544, + "lower_bound": "A4AAAAAABYAB", + "upper_bound": "A4AAAAAABZAA", + "repeats": 1 + }, + { + "count": 368640, + "lower_bound": "A4AAAAAABZAB", + "upper_bound": "A4AAAAAABaAA", + "repeats": 1 + }, + { + "count": 372736, + "lower_bound": "A4AAAAAABaAB", + "upper_bound": "A4AAAAAABbAA", + "repeats": 1 + }, + { + "count": 376832, + "lower_bound": "A4AAAAAABbAB", + "upper_bound": "A4AAAAAABcAA", + "repeats": 1 + }, + { + "count": 380928, + "lower_bound": "A4AAAAAABcAB", + "upper_bound": "A4AAAAAABdAA", + "repeats": 1 + }, + { + "count": 385024, + "lower_bound": "A4AAAAAABdAB", + "upper_bound": "A4AAAAAABeAA", + "repeats": 1 + }, + { + "count": 389120, + "lower_bound": "A4AAAAAABeAB", + "upper_bound": "A4AAAAAABfAA", + "repeats": 1 + }, + { + "count": 393216, + "lower_bound": "A4AAAAAABfAB", + "upper_bound": "A4AAAAAABgAA", + "repeats": 1 + }, + { + "count": 397312, + "lower_bound": "A4AAAAAABgAB", + "upper_bound": "A4AAAAAABhAA", + "repeats": 1 + }, + { + "count": 401408, + "lower_bound": "A4AAAAAABhAB", + "upper_bound": "A4AAAAAABiAA", + "repeats": 1 + }, + { + "count": 405504, + "lower_bound": "A4AAAAAABiAB", + "upper_bound": "A4AAAAAABjAA", + "repeats": 1 + }, + { + "count": 409600, + "lower_bound": "A4AAAAAABjAB", + "upper_bound": "A4AAAAAABkAA", + "repeats": 1 + }, + { + "count": 413696, + "lower_bound": "A4AAAAAABkAB", + "upper_bound": "A4AAAAAABlAA", + "repeats": 1 + }, + { + "count": 417792, + "lower_bound": "A4AAAAAABlAB", + "upper_bound": "A4AAAAAABmAA", + "repeats": 1 + }, + { + "count": 421888, + "lower_bound": "A4AAAAAABmAB", + "upper_bound": "A4AAAAAABnAA", + "repeats": 1 + }, + { + "count": 425984, + "lower_bound": "A4AAAAAABnAB", + "upper_bound": "A4AAAAAABoAA", + "repeats": 1 + }, + { + "count": 430080, + "lower_bound": "A4AAAAAABoAB", + "upper_bound": "A4AAAAAABpAA", + "repeats": 1 + }, + { + "count": 434176, + "lower_bound": "A4AAAAAABpAB", + "upper_bound": "A4AAAAAABqAA", + "repeats": 1 + }, + { + "count": 438272, + "lower_bound": "A4AAAAAABqAB", + "upper_bound": "A4AAAAAABrAA", + "repeats": 1 + }, + { + "count": 442368, + "lower_bound": "A4AAAAAABrAB", + "upper_bound": "A4AAAAAABsAA", + "repeats": 1 + }, + { + "count": 446464, + "lower_bound": "A4AAAAAABsAB", + "upper_bound": "A4AAAAAABtAA", + "repeats": 1 + }, + { + "count": 450560, + "lower_bound": "A4AAAAAABtAB", + "upper_bound": "A4AAAAAABuAA", + "repeats": 1 + }, + { + "count": 454656, + "lower_bound": "A4AAAAAABuAB", + "upper_bound": "A4AAAAAABvAA", + "repeats": 1 + }, + { + "count": 458752, + "lower_bound": "A4AAAAAABvAB", + "upper_bound": "A4AAAAAABwAA", + "repeats": 1 + }, + { + "count": 462848, + "lower_bound": "A4AAAAAABwAB", + "upper_bound": "A4AAAAAABxAA", + "repeats": 1 + }, + { + "count": 466944, + "lower_bound": "A4AAAAAABxAB", + "upper_bound": "A4AAAAAAByAA", + "repeats": 1 + }, + { + "count": 471040, + "lower_bound": "A4AAAAAAByAB", + "upper_bound": "A4AAAAAABzAA", + "repeats": 1 + }, + { + "count": 475136, + "lower_bound": "A4AAAAAABzAB", + "upper_bound": "A4AAAAAAB0AA", + "repeats": 1 + }, + { + "count": 479232, + "lower_bound": "A4AAAAAAB0AB", + "upper_bound": "A4AAAAAAB1AA", + "repeats": 1 + }, + { + "count": 483328, + "lower_bound": "A4AAAAAAB1AB", + "upper_bound": "A4AAAAAAB2AA", + "repeats": 1 + }, + { + "count": 487424, + "lower_bound": "A4AAAAAAB2AB", + "upper_bound": "A4AAAAAAB3AA", + "repeats": 1 + }, + { + "count": 491520, + "lower_bound": "A4AAAAAAB3AB", + "upper_bound": "A4AAAAAAB4AA", + "repeats": 1 + }, + { + "count": 495616, + "lower_bound": "A4AAAAAAB4AB", + "upper_bound": "A4AAAAAAB5AA", + "repeats": 1 + }, + { + "count": 499712, + "lower_bound": "A4AAAAAAB5AB", + "upper_bound": "A4AAAAAAB6AA", + "repeats": 1 + }, + { + "count": 503808, + "lower_bound": "A4AAAAAAB6AB", + "upper_bound": "A4AAAAAAB7AA", + "repeats": 1 + }, + { + "count": 507904, + "lower_bound": "A4AAAAAAB7AB", + "upper_bound": "A4AAAAAAB8AA", + "repeats": 1 + }, + { + "count": 512000, + "lower_bound": "A4AAAAAAB8AB", + "upper_bound": "A4AAAAAAB9AA", + "repeats": 1 + }, + { + "count": 516096, + "lower_bound": "A4AAAAAAB9AB", + "upper_bound": "A4AAAAAAB+AA", + "repeats": 1 + }, + { + "count": 520192, + "lower_bound": "A4AAAAAAB+AB", + "upper_bound": "A4AAAAAAB/AA", + "repeats": 1 + }, + { + "count": 524288, + "lower_bound": "A4AAAAAAB/AB", + "upper_bound": "A4AAAAAACAAA", + "repeats": 1 + }, + { + "count": 528384, + "lower_bound": "A4AAAAAACAAB", + "upper_bound": "A4AAAAAACBAA", + "repeats": 1 + }, + { + "count": 532480, + "lower_bound": "A4AAAAAACBAB", + "upper_bound": "A4AAAAAACCAA", + "repeats": 1 + }, + { + "count": 536576, + "lower_bound": "A4AAAAAACCAB", + "upper_bound": "A4AAAAAACDAA", + "repeats": 1 + }, + { + "count": 540672, + "lower_bound": "A4AAAAAACDAB", + "upper_bound": "A4AAAAAACEAA", + "repeats": 1 + }, + { + "count": 544768, + "lower_bound": "A4AAAAAACEAB", + "upper_bound": "A4AAAAAACFAA", + "repeats": 1 + }, + { + "count": 548864, + "lower_bound": "A4AAAAAACFAB", + "upper_bound": "A4AAAAAACGAA", + "repeats": 1 + }, + { + "count": 552960, + "lower_bound": "A4AAAAAACGAB", + "upper_bound": "A4AAAAAACHAA", + "repeats": 1 + }, + { + "count": 557056, + "lower_bound": "A4AAAAAACHAB", + "upper_bound": "A4AAAAAACIAA", + "repeats": 1 + }, + { + "count": 561152, + "lower_bound": "A4AAAAAACIAB", + "upper_bound": "A4AAAAAACJAA", + "repeats": 1 + }, + { + "count": 565248, + "lower_bound": "A4AAAAAACJAB", + "upper_bound": "A4AAAAAACKAA", + "repeats": 1 + }, + { + "count": 569344, + "lower_bound": "A4AAAAAACKAB", + "upper_bound": "A4AAAAAACLAA", + "repeats": 1 + }, + { + "count": 573440, + "lower_bound": "A4AAAAAACLAB", + "upper_bound": "A4AAAAAACMAA", + "repeats": 1 + }, + { + "count": 577536, + "lower_bound": "A4AAAAAACMAB", + "upper_bound": "A4AAAAAACNAA", + "repeats": 1 + }, + { + "count": 581632, + "lower_bound": "A4AAAAAACNAB", + "upper_bound": "A4AAAAAACOAA", + "repeats": 1 + }, + { + "count": 585728, + "lower_bound": "A4AAAAAACOAB", + "upper_bound": "A4AAAAAACPAA", + "repeats": 1 + }, + { + "count": 589824, + "lower_bound": "A4AAAAAACPAB", + "upper_bound": "A4AAAAAACQAA", + "repeats": 1 + }, + { + "count": 593920, + "lower_bound": "A4AAAAAACQAB", + "upper_bound": "A4AAAAAACRAA", + "repeats": 1 + }, + { + "count": 598016, + "lower_bound": "A4AAAAAACRAB", + "upper_bound": "A4AAAAAACSAA", + "repeats": 1 + }, + { + "count": 602112, + "lower_bound": "A4AAAAAACSAB", + "upper_bound": "A4AAAAAACTAA", + "repeats": 1 + }, + { + "count": 606208, + "lower_bound": "A4AAAAAACTAB", + "upper_bound": "A4AAAAAACUAA", + "repeats": 1 + }, + { + "count": 610304, + "lower_bound": "A4AAAAAACUAB", + "upper_bound": "A4AAAAAACVAA", + "repeats": 1 + }, + { + "count": 614400, + "lower_bound": "A4AAAAAACVAB", + "upper_bound": "A4AAAAAACWAA", + "repeats": 1 + }, + { + "count": 618496, + "lower_bound": "A4AAAAAACWAB", + "upper_bound": "A4AAAAAACXAA", + "repeats": 1 + }, + { + "count": 622592, + "lower_bound": "A4AAAAAACXAB", + "upper_bound": "A4AAAAAACYAA", + "repeats": 1 + }, + { + "count": 626688, + "lower_bound": "A4AAAAAACYAB", + "upper_bound": "A4AAAAAACZAA", + "repeats": 1 + }, + { + "count": 630784, + "lower_bound": "A4AAAAAACZAB", + "upper_bound": "A4AAAAAACaAA", + "repeats": 1 + }, + { + "count": 634880, + "lower_bound": "A4AAAAAACaAB", + "upper_bound": "A4AAAAAACbAA", + "repeats": 1 + }, + { + "count": 638976, + "lower_bound": "A4AAAAAACbAB", + "upper_bound": "A4AAAAAACcAA", + "repeats": 1 + }, + { + "count": 643072, + "lower_bound": "A4AAAAAACcAB", + "upper_bound": "A4AAAAAACdAA", + "repeats": 1 + }, + { + "count": 647168, + "lower_bound": "A4AAAAAACdAB", + "upper_bound": "A4AAAAAACeAA", + "repeats": 1 + }, + { + "count": 651264, + "lower_bound": "A4AAAAAACeAB", + "upper_bound": "A4AAAAAACfAA", + "repeats": 1 + }, + { + "count": 655360, + "lower_bound": "A4AAAAAACfAB", + "upper_bound": "A4AAAAAACgAA", + "repeats": 1 + }, + { + "count": 659456, + "lower_bound": "A4AAAAAACgAB", + "upper_bound": "A4AAAAAAChAA", + "repeats": 1 + }, + { + "count": 663552, + "lower_bound": "A4AAAAAAChAB", + "upper_bound": "A4AAAAAACiAA", + "repeats": 1 + }, + { + "count": 667648, + "lower_bound": "A4AAAAAACiAB", + "upper_bound": "A4AAAAAACjAA", + "repeats": 1 + }, + { + "count": 671744, + "lower_bound": "A4AAAAAACjAB", + "upper_bound": "A4AAAAAACkAA", + "repeats": 1 + }, + { + "count": 675840, + "lower_bound": "A4AAAAAACkAB", + "upper_bound": "A4AAAAAAClAA", + "repeats": 1 + }, + { + "count": 679936, + "lower_bound": "A4AAAAAAClAB", + "upper_bound": "A4AAAAAACmAA", + "repeats": 1 + }, + { + "count": 684032, + "lower_bound": "A4AAAAAACmAB", + "upper_bound": "A4AAAAAACnAA", + "repeats": 1 + }, + { + "count": 688128, + "lower_bound": "A4AAAAAACnAB", + "upper_bound": "A4AAAAAACoAA", + "repeats": 1 + }, + { + "count": 692224, + "lower_bound": "A4AAAAAACoAB", + "upper_bound": "A4AAAAAACpAA", + "repeats": 1 + }, + { + "count": 696320, + "lower_bound": "A4AAAAAACpAB", + "upper_bound": "A4AAAAAACqAA", + "repeats": 1 + }, + { + "count": 700416, + "lower_bound": "A4AAAAAACqAB", + "upper_bound": "A4AAAAAACrAA", + "repeats": 1 + }, + { + "count": 704512, + "lower_bound": "A4AAAAAACrAB", + "upper_bound": "A4AAAAAACsAA", + "repeats": 1 + }, + { + "count": 708608, + "lower_bound": "A4AAAAAACsAB", + "upper_bound": "A4AAAAAACtAA", + "repeats": 1 + }, + { + "count": 712704, + "lower_bound": "A4AAAAAACtAB", + "upper_bound": "A4AAAAAACuAA", + "repeats": 1 + }, + { + "count": 716800, + "lower_bound": "A4AAAAAACuAB", + "upper_bound": "A4AAAAAACvAA", + "repeats": 1 + }, + { + "count": 720896, + "lower_bound": "A4AAAAAACvAB", + "upper_bound": "A4AAAAAACwAA", + "repeats": 1 + }, + { + "count": 724992, + "lower_bound": "A4AAAAAACwAB", + "upper_bound": "A4AAAAAACxAA", + "repeats": 1 + }, + { + "count": 729088, + "lower_bound": "A4AAAAAACxAB", + "upper_bound": "A4AAAAAACyAA", + "repeats": 1 + }, + { + "count": 733184, + "lower_bound": "A4AAAAAACyAB", + "upper_bound": "A4AAAAAACzAA", + "repeats": 1 + }, + { + "count": 737280, + "lower_bound": "A4AAAAAACzAB", + "upper_bound": "A4AAAAAAC0AA", + "repeats": 1 + }, + { + "count": 741376, + "lower_bound": "A4AAAAAAC0AB", + "upper_bound": "A4AAAAAAC1AA", + "repeats": 1 + }, + { + "count": 745472, + "lower_bound": "A4AAAAAAC1AB", + "upper_bound": "A4AAAAAAC2AA", + "repeats": 1 + }, + { + "count": 749568, + "lower_bound": "A4AAAAAAC2AB", + "upper_bound": "A4AAAAAAC3AA", + "repeats": 1 + }, + { + "count": 753664, + "lower_bound": "A4AAAAAAC3AB", + "upper_bound": "A4AAAAAAC4AA", + "repeats": 1 + }, + { + "count": 757760, + "lower_bound": "A4AAAAAAC4AB", + "upper_bound": "A4AAAAAAC5AA", + "repeats": 1 + }, + { + "count": 761856, + "lower_bound": "A4AAAAAAC5AB", + "upper_bound": "A4AAAAAAC6AA", + "repeats": 1 + }, + { + "count": 765952, + "lower_bound": "A4AAAAAAC6AB", + "upper_bound": "A4AAAAAAC7AA", + "repeats": 1 + }, + { + "count": 770048, + "lower_bound": "A4AAAAAAC7AB", + "upper_bound": "A4AAAAAAC8AA", + "repeats": 1 + }, + { + "count": 774144, + "lower_bound": "A4AAAAAAC8AB", + "upper_bound": "A4AAAAAAC9AA", + "repeats": 1 + }, + { + "count": 778240, + "lower_bound": "A4AAAAAAC9AB", + "upper_bound": "A4AAAAAAC+AA", + "repeats": 1 + }, + { + "count": 782336, + "lower_bound": "A4AAAAAAC+AB", + "upper_bound": "A4AAAAAAC/AA", + "repeats": 1 + }, + { + "count": 786432, + "lower_bound": "A4AAAAAAC/AB", + "upper_bound": "A4AAAAAADAAA", + "repeats": 1 + }, + { + "count": 790528, + "lower_bound": "A4AAAAAADAAB", + "upper_bound": "A4AAAAAADBAA", + "repeats": 1 + }, + { + "count": 794624, + "lower_bound": "A4AAAAAADBAB", + "upper_bound": "A4AAAAAADCAA", + "repeats": 1 + }, + { + "count": 798720, + "lower_bound": "A4AAAAAADCAB", + "upper_bound": "A4AAAAAADDAA", + "repeats": 1 + }, + { + "count": 802816, + "lower_bound": "A4AAAAAADDAB", + "upper_bound": "A4AAAAAADEAA", + "repeats": 1 + }, + { + "count": 806912, + "lower_bound": "A4AAAAAADEAB", + "upper_bound": "A4AAAAAADFAA", + "repeats": 1 + }, + { + "count": 811008, + "lower_bound": "A4AAAAAADFAB", + "upper_bound": "A4AAAAAADGAA", + "repeats": 1 + }, + { + "count": 815104, + "lower_bound": "A4AAAAAADGAB", + "upper_bound": "A4AAAAAADHAA", + "repeats": 1 + }, + { + "count": 819200, + "lower_bound": "A4AAAAAADHAB", + "upper_bound": "A4AAAAAADIAA", + "repeats": 1 + }, + { + "count": 823296, + "lower_bound": "A4AAAAAADIAB", + "upper_bound": "A4AAAAAADJAA", + "repeats": 1 + }, + { + "count": 827392, + "lower_bound": "A4AAAAAADJAB", + "upper_bound": "A4AAAAAADKAA", + "repeats": 1 + }, + { + "count": 831488, + "lower_bound": "A4AAAAAADKAB", + "upper_bound": "A4AAAAAADLAA", + "repeats": 1 + }, + { + "count": 835584, + "lower_bound": "A4AAAAAADLAB", + "upper_bound": "A4AAAAAADMAA", + "repeats": 1 + }, + { + "count": 839680, + "lower_bound": "A4AAAAAADMAB", + "upper_bound": "A4AAAAAADNAA", + "repeats": 1 + }, + { + "count": 843776, + "lower_bound": "A4AAAAAADNAB", + "upper_bound": "A4AAAAAADOAA", + "repeats": 1 + }, + { + "count": 847872, + "lower_bound": "A4AAAAAADOAB", + "upper_bound": "A4AAAAAADPAA", + "repeats": 1 + }, + { + "count": 851968, + "lower_bound": "A4AAAAAADPAB", + "upper_bound": "A4AAAAAADQAA", + "repeats": 1 + }, + { + "count": 856064, + "lower_bound": "A4AAAAAADQAB", + "upper_bound": "A4AAAAAADRAA", + "repeats": 1 + }, + { + "count": 860160, + "lower_bound": "A4AAAAAADRAB", + "upper_bound": "A4AAAAAADSAA", + "repeats": 1 + }, + { + "count": 864256, + "lower_bound": "A4AAAAAADSAB", + "upper_bound": "A4AAAAAADTAA", + "repeats": 1 + }, + { + "count": 868352, + "lower_bound": "A4AAAAAADTAB", + "upper_bound": "A4AAAAAADUAA", + "repeats": 1 + }, + { + "count": 872448, + "lower_bound": "A4AAAAAADUAB", + "upper_bound": "A4AAAAAADVAA", + "repeats": 1 + }, + { + "count": 876544, + "lower_bound": "A4AAAAAADVAB", + "upper_bound": "A4AAAAAADWAA", + "repeats": 1 + }, + { + "count": 880640, + "lower_bound": "A4AAAAAADWAB", + "upper_bound": "A4AAAAAADXAA", + "repeats": 1 + }, + { + "count": 883011, + "lower_bound": "A4AAAAAADXAB", + "upper_bound": "A4AAAAAADXlD", + "repeats": 1 + }, + { + "count": 887107, + "lower_bound": "A4AAAAAADXlE", + "upper_bound": "A4AAAAAADYlD", + "repeats": 1 + }, + { + "count": 891203, + "lower_bound": "A4AAAAAADYlE", + "upper_bound": "A4AAAAAADZlD", + "repeats": 1 + }, + { + "count": 895299, + "lower_bound": "A4AAAAAADZlE", + "upper_bound": "A4AAAAAADalD", + "repeats": 1 + }, + { + "count": 899395, + "lower_bound": "A4AAAAAADalE", + "upper_bound": "A4AAAAAADblD", + "repeats": 1 + }, + { + "count": 903491, + "lower_bound": "A4AAAAAADblE", + "upper_bound": "A4AAAAAADclD", + "repeats": 1 + }, + { + "count": 907587, + "lower_bound": "A4AAAAAADclE", + "upper_bound": "A4AAAAAADdlD", + "repeats": 1 + }, + { + "count": 911683, + "lower_bound": "A4AAAAAADdlE", + "upper_bound": "A4AAAAAADelD", + "repeats": 1 + }, + { + "count": 915779, + "lower_bound": "A4AAAAAADelE", + "upper_bound": "A4AAAAAADflD", + "repeats": 1 + }, + { + "count": 919875, + "lower_bound": "A4AAAAAADflE", + "upper_bound": "A4AAAAAADglD", + "repeats": 1 + }, + { + "count": 923971, + "lower_bound": "A4AAAAAADglE", + "upper_bound": "A4AAAAAADhlD", + "repeats": 1 + }, + { + "count": 928067, + "lower_bound": "A4AAAAAADhlE", + "upper_bound": "A4AAAAAADilD", + "repeats": 1 + }, + { + "count": 932163, + "lower_bound": "A4AAAAAADilE", + "upper_bound": "A4AAAAAADjlD", + "repeats": 1 + }, + { + "count": 936259, + "lower_bound": "A4AAAAAADjlE", + "upper_bound": "A4AAAAAADklD", + "repeats": 1 + }, + { + "count": 940355, + "lower_bound": "A4AAAAAADklE", + "upper_bound": "A4AAAAAADllD", + "repeats": 1 + }, + { + "count": 944451, + "lower_bound": "A4AAAAAADllE", + "upper_bound": "A4AAAAAADmlD", + "repeats": 1 + }, + { + "count": 948547, + "lower_bound": "A4AAAAAADmlE", + "upper_bound": "A4AAAAAADnlD", + "repeats": 1 + }, + { + "count": 952643, + "lower_bound": "A4AAAAAADnlE", + "upper_bound": "A4AAAAAADolD", + "repeats": 1 + }, + { + "count": 956739, + "lower_bound": "A4AAAAAADolE", + "upper_bound": "A4AAAAAADplD", + "repeats": 1 + }, + { + "count": 960835, + "lower_bound": "A4AAAAAADplE", + "upper_bound": "A4AAAAAADqlD", + "repeats": 1 + }, + { + "count": 964931, + "lower_bound": "A4AAAAAADqlE", + "upper_bound": "A4AAAAAADrlD", + "repeats": 1 + }, + { + "count": 969027, + "lower_bound": "A4AAAAAADrlE", + "upper_bound": "A4AAAAAADslD", + "repeats": 1 + }, + { + "count": 973123, + "lower_bound": "A4AAAAAADslE", + "upper_bound": "A4AAAAAADtlD", + "repeats": 1 + }, + { + "count": 977219, + "lower_bound": "A4AAAAAADtlE", + "upper_bound": "A4AAAAAADulD", + "repeats": 1 + }, + { + "count": 981315, + "lower_bound": "A4AAAAAADulE", + "upper_bound": "A4AAAAAADvlD", + "repeats": 1 + }, + { + "count": 985411, + "lower_bound": "A4AAAAAADvlE", + "upper_bound": "A4AAAAAADwlD", + "repeats": 1 + }, + { + "count": 989507, + "lower_bound": "A4AAAAAADwlE", + "upper_bound": "A4AAAAAADxlD", + "repeats": 1 + }, + { + "count": 993603, + "lower_bound": "A4AAAAAADxlE", + "upper_bound": "A4AAAAAADylD", + "repeats": 1 + }, + { + "count": 997699, + "lower_bound": "A4AAAAAADylE", + "upper_bound": "A4AAAAAADzlD", + "repeats": 1 + }, + { + "count": 1000000, + "lower_bound": "A4AAAAAADzlE", + "upper_bound": "A4AAAAAAD0JA", + "repeats": 1 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 513, + 507, + 485, + 476, + 515, + 490, + 516, + 480, + 481, + 477, + 533, + 481, + 467, + 489, + 504, + 484, + 514, + 477, + 475, + 511, + 529, + 469, + 474, + 486, + 478, + 497, + 503, + 547, + 466, + 470, + 504, + 468, + 511, + 476, + 501, + 478, + 520, + 454, + 521, + 467, + 508, + 449, + 467, + 460, + 466, + 464, + 511, + 455, + 492, + 535, + 478, + 478, + 473, + 519, + 492, + 484, + 480, + 495, + 496, + 502, + 498, + 439, + 457, + 535, + 506, + 536, + 501, + 492, + 484, + 450, + 498, + 467, + 491, + 484, + 465, + 503, + 489, + 477, + 514, + 491, + 517, + 459, + 467, + 463, + 499, + 466, + 488, + 525, + 486, + 520, + 528, + 490, + 478, + 482, + 476, + 456, + 477, + 522, + 519, + 483, + 441, + 516, + 455, + 481, + 474, + 469, + 480, + 487, + 508, + 514, + 515, + 452, + 453, + 484, + 495, + 470, + 496, + 490, + 515, + 487, + 503, + 509, + 480, + 495, + 480, + 504, + 512, + 526, + 462, + 472, + 488, + 510, + 488, + 498, + 486, + 462, + 486, + 493, + 509, + 527, + 510, + 477, + 507, + 474, + 486, + 473, + 493, + 480, + 522, + 513, + 453, + 472, + 467, + 474, + 463, + 504, + 482, + 514, + 498, + 514, + 523, + 500, + 453, + 458, + 480, + 483, + 513, + 460, + 524, + 502, + 478, + 477, + 447, + 511, + 495, + 509, + 503, + 487, + 491, + 494, + 470, + 481, + 460, + 488, + 490, + 488, + 523, + 535, + 489, + 489, + 493, + 516, + 515, + 469, + 488, + 541, + 500, + 489, + 477, + 483, + 465, + 478, + 486, + 469, + 492, + 453, + 478, + 464, + 515, + 508, + 466, + 498, + 479, + 478, + 458, + 452, + 456, + 480, + 527, + 461, + 494, + 467, + 471, + 498, + 496, + 488, + 454, + 473, + 505, + 499, + 489, + 487, + 503, + 477, + 469, + 493, + 459, + 503, + 476, + 483, + 497, + 488, + 469, + 504, + 523, + 479, + 528, + 508, + 510, + 474, + 504, + 458, + 483, + 506, + 464, + 512, + 482, + 472, + 487, + 492, + 477, + 487, + 490, + 477, + 483, + 471, + 455, + 465, + 450, + 494, + 501, + 497, + 460, + 493, + 497, + 464, + 504, + 513, + 499, + 491, + 477, + 504, + 515, + 525, + 474, + 449, + 467, + 492, + 470, + 473, + 484, + 458, + 494, + 460, + 464, + 492, + 462, + 495, + 490, + 501, + 489, + 502, + 488, + 483, + 473, + 499, + 477, + 467, + 510, + 509, + 484, + 481, + 500, + 480, + 493, + 460, + 497, + 463, + 475, + 530, + 513, + 476, + 443, + 516, + 439, + 522, + 510, + 509, + 525, + 495, + 509, + 461, + 489, + 479, + 468, + 459, + 474, + 461, + 475, + 469, + 470, + 466, + 495, + 481, + 462, + 494, + 501, + 503, + 495, + 489, + 470, + 486, + 478, + 515, + 474, + 463, + 460, + 456, + 507, + 502, + 471, + 471, + 487, + 470, + 475, + 504, + 514, + 475, + 492, + 489, + 487, + 520, + 476, + 482, + 477, + 468, + 475, + 495, + 477, + 478, + 468, + 473, + 471, + 505, + 533, + 500, + 479, + 487, + 457, + 497, + 471, + 488, + 487, + 451, + 500, + 515, + 507, + 485, + 508, + 458, + 485, + 488, + 470, + 496, + 463, + 479, + 491, + 490, + 542, + 496, + 492, + 492, + 501, + 512, + 467, + 490, + 484, + 507, + 489, + 502, + 467, + 468, + 499, + 494, + 528, + 464, + 482, + 521, + 514, + 451, + 528, + 485, + 516, + 513, + 497, + 483, + 468, + 492, + 510, + 473, + 457, + 503, + 500, + 494, + 497, + 510, + 456, + 488, + 472, + 500, + 490, + 487, + 473, + 468, + 476, + 471, + 523, + 479, + 475, + 499, + 517, + 520, + 477, + 488, + 512, + 461, + 490, + 464, + 506, + 496, + 522, + 493, + 450, + 498, + 489, + 480, + 483, + 558, + 453, + 523, + 481, + 480, + 446, + 489, + 461, + 505, + 514, + 505, + 519, + 504, + 484, + 483, + 472, + 458, + 469, + 489, + 493, + 473, + 498, + 492, + 528, + 449, + 465, + 475, + 487, + 512, + 508, + 504, + 472, + 480, + 462, + 496, + 457, + 506, + 480, + 462, + 542, + 563, + 480, + 480, + 457, + 502, + 465, + 475, + 474, + 450, + 476, + 508, + 452, + 464, + 496, + 465, + 441, + 501, + 455, + 494, + 507, + 522, + 484, + 473, + 511, + 473, + 483, + 489, + 474, + 479, + 447, + 492, + 468, + 496, + 480, + 530, + 502, + 484, + 481, + 538, + 488, + 465, + 527, + 455, + 506, + 484, + 497, + 505, + 476, + 466, + 456, + 476, + 480, + 476, + 503, + 502, + 506, + 485, + 466, + 462, + 508, + 507, + 475, + 470, + 511, + 487, + 468, + 469, + 474, + 499, + 465, + 473, + 480, + 462, + 478, + 466, + 427, + 477, + 491, + 484, + 492, + 481, + 519, + 484, + 448, + 481, + 488, + 506, + 506, + 477, + 493, + 512, + 512, + 508, + 494, + 505, + 479, + 474, + 481, + 451, + 496, + 494, + 482, + 466, + 487, + 488, + 497, + 439, + 475, + 499, + 460, + 465, + 508, + 443, + 496, + 492, + 504, + 450, + 514, + 490, + 491, + 505, + 501, + 476, + 480, + 484, + 513, + 486, + 467, + 482, + 524, + 486, + 500, + 431, + 531, + 515, + 475, + 491, + 483, + 487, + 488, + 440, + 508, + 507, + 524, + 472, + 466, + 524, + 471, + 484, + 438, + 517, + 470, + 486, + 490, + 515, + 482, + 501, + 467, + 491, + 458, + 483, + 502, + 463, + 503, + 496, + 496, + 480, + 478, + 521, + 493, + 496, + 490, + 494, + 485, + 510, + 461, + 480, + 487, + 512, + 475, + 452, + 483, + 481, + 478, + 531, + 497, + 515, + 505, + 462, + 510, + 513, + 510, + 528, + 509, + 446, + 500, + 510, + 473, + 494, + 450, + 464, + 465, + 470, + 477, + 478, + 493, + 495, + 495, + 470, + 501, + 519, + 500, + 432, + 446, + 511, + 530, + 455, + 446, + 495, + 452, + 456, + 480, + 467, + 454, + 485, + 504, + 434, + 519, + 490, + 460, + 491, + 501, + 493, + 482, + 470, + 501, + 477, + 516, + 480, + 490, + 455, + 514, + 501, + 488, + 505, + 504, + 507, + 532, + 490, + 502, + 473, + 516, + 450, + 510, + 475, + 495, + 482, + 473, + 449, + 504, + 526, + 535, + 471, + 447, + 493, + 507, + 527, + 491, + 492, + 500, + 470, + 454, + 441, + 483, + 488, + 463, + 474, + 499, + 486, + 485, + 486, + 480, + 461, + 500, + 466, + 494, + 494, + 480, + 518, + 508, + 469, + 498, + 455, + 486, + 480, + 487, + 502, + 502, + 458, + 511, + 481, + 483, + 489, + 451, + 469, + 495, + 491, + 487, + 482, + 509, + 455, + 501, + 480, + 473, + 519, + 466, + 475, + 493, + 510, + 495, + 486, + 450, + 562, + 502, + 462, + 485, + 485, + 512, + 513, + 473, + 515, + 502, + 464, + 497, + 438, + 514, + 507, + 438, + 473, + 533, + 506, + 460, + 457, + 437, + 516, + 470, + 470, + 499, + 456, + 502, + 489, + 498, + 493, + 528, + 507, + 529, + 468, + 512, + 500, + 506, + 499, + 459, + 497, + 512, + 487, + 505, + 489, + 492, + 501, + 494, + 487, + 443, + 519, + 478, + 467, + 506, + 493, + 511, + 504, + 472, + 479, + 466, + 517, + 477, + 532, + 473, + 501, + 494, + 467, + 498, + 542, + 496, + 461, + 486, + 480, + 513, + 482, + 474, + 498, + 484, + 509, + 499, + 460, + 499, + 474, + 485, + 458, + 501, + 477, + 487, + 478, + 461, + 465, + 492, + 530, + 485, + 512, + 487, + 503, + 492, + 473, + 503, + 468, + 503, + 454, + 488, + 504, + 528, + 490, + 471, + 530, + 507, + 488, + 507, + 503, + 488, + 482, + 494, + 449, + 505, + 490, + 458, + 496, + 480, + 511, + 467, + 512, + 465, + 486, + 513, + 480, + 468, + 487, + 487, + 466, + 489, + 460, + 465, + 504, + 481, + 510, + 464, + 526, + 467, + 491, + 553, + 510, + 519, + 456, + 491, + 525, + 516, + 533, + 469, + 544, + 508, + 515, + 482, + 480, + 465, + 505, + 479, + 500, + 456, + 503, + 487, + 496, + 512, + 497, + 464, + 490, + 513, + 506, + 509, + 487, + 483, + 494, + 509, + 510, + 510, + 461, + 493, + 419, + 501, + 474, + 487, + 482, + 499, + 480, + 447, + 470, + 507, + 473, + 498, + 517, + 515, + 497, + 459, + 482, + 483, + 497, + 487, + 505, + 509, + 495, + 468, + 512, + 477, + 524, + 526, + 493, + 516, + 484, + 500, + 477, + 527, + 475, + 466, + 512, + 497, + 477, + 539, + 486, + 483, + 512, + 491, + 486, + 502, + 522, + 483, + 529, + 468, + 470, + 517, + 509, + 512, + 522, + 500, + 497, + 506, + 489, + 451, + 487, + 456, + 486, + 455, + 468, + 467, + 487, + 509, + 474, + 499, + 459, + 471, + 469, + 456, + 482, + 463, + 479, + 495, + 530, + 487, + 501, + 488, + 504, + 512, + 545, + 496, + 491, + 482, + 522, + 491, + 517, + 466, + 509, + 516, + 472, + 503, + 472, + 494, + 478, + 481, + 508, + 466, + 454, + 452, + 501, + 483, + 438, + 528, + 469, + 474, + 516, + 464, + 453, + 471, + 468, + 477, + 458, + 485, + 479, + 473, + 497, + 498, + 495, + 498, + 502, + 511, + 523, + 507, + 455, + 492, + 516, + 473, + 496, + 489, + 524, + 502, + 508, + 510, + 530, + 527, + 482, + 475, + 526, + 484, + 474, + 500, + 521, + 484, + 478, + 493, + 505, + 491, + 513, + 488, + 512, + 455, + 541, + 509, + 486, + 493, + 438, + 449, + 491, + 476, + 476, + 474, + 503, + 515, + 498, + 511, + 477, + 444, + 478, + 534, + 471, + 488, + 501, + 475, + 454, + 476, + 480, + 472, + 470, + 514, + 510, + 483, + 471, + 507, + 497, + 469, + 497, + 473, + 526, + 468, + 477, + 480, + 496, + 500, + 525, + 450, + 477, + 450, + 516, + 520, + 519, + 485, + 510, + 456, + 516, + 486, + 473, + 484, + 445, + 513, + 489, + 499, + 479, + 479, + 449, + 500, + 463, + 469, + 504, + 483, + 503, + 489, + 505, + 463, + 476, + 485, + 440, + 501, + 454, + 514, + 453, + 510, + 481, + 500, + 487, + 525, + 482, + 460, + 512, + 512, + 499, + 505, + 508, + 471, + 504, + 491, + 508, + 497, + 500, + 486, + 486, + 496, + 446, + 471, + 500, + 444, + 486, + 483, + 505, + 497, + 483, + 462, + 495, + 480, + 467, + 498, + 476, + 492, + 466, + 509, + 462, + 516, + 542, + 488, + 449, + 480, + 488, + 508, + 499, + 499, + 504, + 498, + 493, + 456, + 457, + 484, + 496, + 478, + 552, + 484, + 513, + 482, + 518, + 503, + 490, + 492, + 450, + 478, + 504, + 504, + 488, + 476, + 520, + 497, + 485, + 514, + 504, + 496, + 499, + 484, + 493, + 475, + 505, + 476, + 490, + 490, + 474, + 497, + 472, + 493, + 460, + 496, + 483, + 498, + 496, + 508, + 449, + 497, + 483, + 480, + 470, + 487, + 491, + 485, + 485, + 530, + 497, + 492, + 484, + 471, + 489, + 467, + 495, + 460, + 483, + 501, + 440, + 496, + 444, + 501, + 443, + 519, + 499, + 499, + 513, + 512, + 496, + 478, + 523, + 485, + 465, + 524, + 484, + 494, + 489, + 508, + 481, + 495, + 474, + 488, + 449, + 475, + 524, + 502, + 447, + 501, + 510, + 532, + 496, + 476, + 502, + 455, + 478, + 485, + 551, + 482, + 544, + 488, + 479, + 513, + 530, + 483, + 520, + 494, + 487, + 478, + 472, + 499, + 477, + 487, + 500, + 465, + 515, + 499, + 465, + 511, + 493, + 493, + 473, + 515, + 468, + 459, + 450, + 472, + 456, + 511, + 493, + 490, + 493, + 471, + 474, + 485, + 474, + 503, + 499, + 502, + 491, + 500, + 501, + 503, + 490, + 484, + 480, + 498, + 448, + 483, + 499, + 516, + 488, + 487, + 459, + 481, + 511, + 480, + 479, + 464, + 477, + 492, + 488, + 422, + 508, + 477, + 478, + 439, + 501, + 495, + 523, + 445, + 497, + 510, + 455, + 455, + 504, + 461, + 479, + 436, + 471, + 490, + 499, + 520, + 477, + 458, + 488, + 488, + 561, + 487, + 484, + 517, + 465, + 483, + 498, + 472, + 496, + 479, + 442, + 489, + 498, + 495, + 533, + 434, + 506, + 539, + 487, + 493, + 495, + 484, + 465, + 506, + 473, + 475, + 475, + 510, + 455, + 474, + 486, + 519, + 490, + 498, + 465, + 498, + 501, + 511, + 525, + 543, + 478, + 446, + 490, + 491, + 477, + 495, + 494, + 498, + 499, + 457, + 500, + 518, + 507, + 488, + 484, + 489, + 486, + 516, + 468, + 502, + 503, + 523, + 506, + 518, + 459, + 446, + 458, + 519, + 507, + 486, + 504, + 498, + 507, + 500, + 475, + 514, + 452, + 500, + 484, + 508, + 471, + 468, + 461, + 485, + 503, + 480, + 465, + 476, + 464, + 502, + 510, + 541, + 484, + 477, + 477, + 491, + 480, + 480, + 489, + 541, + 536, + 463, + 484, + 489, + 459, + 486, + 467, + 499, + 486, + 471, + 546, + 476, + 524, + 491, + 461, + 486, + 486, + 461, + 476, + 511, + 512, + 495, + 499, + 509, + 478, + 480, + 504, + 488, + 515, + 478, + 495, + 463, + 473, + 480, + 489, + 505, + 498, + 526, + 467, + 483, + 490, + 478, + 491, + 509, + 505, + 484, + 531, + 474, + 508, + 433, + 510, + 495, + 439, + 497, + 500, + 466, + 492, + 489, + 439, + 508, + 482, + 508, + 460, + 478, + 517, + 458, + 477, + 463, + 505, + 494, + 493, + 507, + 494, + 504, + 491, + 449, + 492, + 433, + 515, + 467, + 514, + 462, + 459, + 474, + 472, + 489, + 504, + 472, + 466, + 489, + 479, + 507, + 499, + 448, + 477, + 453, + 471, + 450, + 500, + 490, + 450, + 491, + 463, + 501, + 494, + 500, + 469, + 486, + 516, + 497, + 494, + 462, + 498, + 500, + 470, + 499, + 464, + 506, + 504, + 513, + 479, + 473, + 479, + 484, + 535, + 483, + 518, + 512, + 501, + 461, + 476, + 504, + 470, + 498, + 466, + 494, + 470, + 500, + 503, + 479, + 444, + 510, + 497, + 501, + 509, + 468, + 495, + 456, + 470, + 492, + 521, + 475, + 491, + 488, + 465, + 443, + 505, + 520, + 485, + 499, + 524, + 522, + 496, + 490, + 481, + 451, + 492, + 489, + 518, + 484, + 467, + 469, + 524, + 512, + 481, + 484, + 481, + 518, + 438, + 517, + 515, + 491, + 485, + 467, + 495, + 495, + 488, + 487, + 484, + 510, + 483, + 525, + 507, + 486, + 449, + 429, + 468, + 494, + 463, + 491, + 523, + 491, + 460, + 498, + 445, + 454, + 479, + 462, + 558, + 482, + 502, + 517, + 444, + 481, + 498, + 527, + 508, + 484, + 439, + 474, + 485, + 447, + 484, + 536, + 453, + 441, + 481, + 510, + 438, + 463, + 476, + 476, + 486, + 508, + 477, + 492, + 490, + 473, + 486, + 472, + 510, + 509, + 473, + 478, + 518, + 528, + 494, + 499, + 499, + 477, + 480, + 480, + 472, + 492, + 514, + 470, + 495, + 476, + 510, + 467, + 496, + 522, + 508, + 493, + 476, + 515, + 524, + 485, + 487, + 492, + 494, + 476, + 501, + 510, + 508, + 457, + 473, + 544, + 499, + 507, + 545, + 477, + 508, + 503, + 493, + 481, + 488, + 537, + 492, + 503, + 471, + 479, + 512, + 496, + 511, + 486, + 507, + 459, + 472, + 469, + 454, + 520, + 512, + 473, + 480, + 472, + 501, + 466, + 525, + 518, + 444, + 488, + 467, + 478, + 471, + 451, + 516, + 439, + 482, + 482, + 493, + 500, + 472, + 499, + 487, + 493, + 509, + 463, + 504, + 506, + 492, + 468, + 487, + 463, + 468, + 457, + 495, + 475, + 512, + 499, + 528, + 487, + 487, + 485, + 502, + 468, + 446, + 490, + 499, + 482, + 495, + 454, + 507, + 480, + 451, + 464, + 495, + 471, + 531, + 456, + 464, + 470, + 495, + 525, + 527, + 465, + 530, + 501, + 489, + 504, + 475, + 521, + 522, + 488, + 484, + 470, + 532, + 475, + 548, + 469, + 484, + 495, + 482, + 482, + 466, + 472, + 508, + 456, + 512, + 452, + 470, + 469, + 460, + 524, + 499, + 481, + 468, + 509, + 467, + 514, + 487, + 468, + 530, + 483, + 482, + 474, + 498, + 500, + 462, + 525, + 451, + 504, + 494, + 531, + 489, + 503, + 444, + 491, + 478, + 503, + 443, + 482, + 481, + 515, + 543, + 483, + 484, + 508, + 453, + 454, + 517, + 508, + 462, + 477, + 527, + 451, + 529, + 512, + 484, + 475, + 509, + 456, + 519, + 493, + 500, + 497, + 459, + 485, + 514, + 514, + 522 + ] + }, + { + "counters": [ + 472, + 498, + 470, + 465, + 475, + 525, + 470, + 465, + 469, + 495, + 486, + 460, + 487, + 480, + 495, + 479, + 448, + 477, + 477, + 486, + 461, + 456, + 504, + 474, + 482, + 473, + 492, + 509, + 465, + 523, + 451, + 513, + 502, + 462, + 461, + 488, + 523, + 469, + 513, + 501, + 484, + 521, + 463, + 487, + 510, + 446, + 528, + 529, + 467, + 514, + 493, + 513, + 476, + 490, + 461, + 476, + 483, + 488, + 445, + 482, + 516, + 529, + 471, + 454, + 499, + 496, + 483, + 467, + 504, + 481, + 495, + 488, + 489, + 474, + 498, + 510, + 486, + 497, + 510, + 479, + 491, + 472, + 492, + 500, + 505, + 502, + 519, + 461, + 490, + 514, + 498, + 492, + 524, + 492, + 473, + 474, + 520, + 470, + 444, + 509, + 483, + 510, + 508, + 476, + 484, + 484, + 475, + 468, + 475, + 469, + 466, + 471, + 439, + 493, + 479, + 499, + 468, + 487, + 460, + 513, + 480, + 531, + 500, + 527, + 460, + 490, + 475, + 497, + 508, + 484, + 486, + 487, + 488, + 492, + 520, + 477, + 504, + 470, + 509, + 485, + 496, + 466, + 476, + 479, + 501, + 494, + 495, + 485, + 510, + 499, + 514, + 485, + 494, + 474, + 495, + 465, + 480, + 475, + 479, + 548, + 466, + 517, + 507, + 507, + 458, + 460, + 507, + 471, + 493, + 472, + 497, + 509, + 504, + 498, + 488, + 484, + 470, + 453, + 495, + 485, + 467, + 525, + 485, + 522, + 469, + 500, + 441, + 467, + 509, + 469, + 513, + 452, + 489, + 498, + 497, + 435, + 476, + 500, + 510, + 520, + 475, + 461, + 501, + 513, + 488, + 480, + 494, + 481, + 493, + 501, + 470, + 504, + 475, + 500, + 499, + 471, + 469, + 519, + 484, + 478, + 434, + 448, + 522, + 445, + 489, + 515, + 463, + 511, + 483, + 484, + 468, + 480, + 488, + 482, + 476, + 469, + 462, + 470, + 477, + 500, + 475, + 503, + 480, + 539, + 473, + 498, + 522, + 475, + 502, + 526, + 474, + 464, + 493, + 449, + 527, + 464, + 510, + 511, + 466, + 489, + 493, + 512, + 478, + 498, + 469, + 515, + 529, + 506, + 488, + 506, + 535, + 460, + 509, + 489, + 473, + 478, + 503, + 461, + 484, + 517, + 426, + 469, + 473, + 470, + 477, + 454, + 505, + 495, + 476, + 462, + 495, + 486, + 468, + 488, + 498, + 463, + 468, + 503, + 530, + 541, + 488, + 475, + 497, + 502, + 464, + 516, + 492, + 505, + 476, + 454, + 514, + 492, + 463, + 506, + 488, + 487, + 493, + 497, + 498, + 511, + 517, + 490, + 499, + 474, + 458, + 485, + 490, + 504, + 489, + 487, + 468, + 503, + 483, + 504, + 484, + 499, + 489, + 537, + 507, + 509, + 527, + 521, + 471, + 501, + 459, + 539, + 470, + 491, + 474, + 511, + 479, + 474, + 525, + 510, + 478, + 474, + 476, + 481, + 519, + 462, + 492, + 471, + 504, + 472, + 478, + 483, + 448, + 504, + 519, + 479, + 442, + 472, + 492, + 477, + 545, + 472, + 498, + 420, + 500, + 469, + 495, + 508, + 485, + 502, + 492, + 470, + 468, + 472, + 481, + 470, + 493, + 466, + 496, + 482, + 500, + 513, + 522, + 484, + 496, + 476, + 487, + 503, + 491, + 507, + 461, + 503, + 496, + 478, + 515, + 470, + 505, + 542, + 487, + 502, + 503, + 482, + 454, + 509, + 510, + 460, + 514, + 521, + 465, + 491, + 444, + 471, + 470, + 488, + 495, + 492, + 492, + 514, + 521, + 479, + 492, + 538, + 454, + 482, + 486, + 472, + 505, + 523, + 514, + 516, + 488, + 523, + 505, + 480, + 477, + 503, + 487, + 513, + 463, + 509, + 480, + 515, + 497, + 460, + 532, + 474, + 445, + 450, + 501, + 530, + 507, + 495, + 499, + 492, + 495, + 477, + 487, + 478, + 506, + 476, + 510, + 493, + 440, + 490, + 450, + 522, + 484, + 497, + 494, + 487, + 477, + 482, + 460, + 445, + 474, + 481, + 510, + 504, + 478, + 503, + 484, + 497, + 467, + 537, + 469, + 523, + 521, + 472, + 489, + 464, + 476, + 482, + 527, + 491, + 483, + 476, + 500, + 496, + 505, + 462, + 472, + 453, + 493, + 506, + 458, + 446, + 499, + 477, + 473, + 532, + 495, + 466, + 498, + 484, + 491, + 485, + 486, + 478, + 460, + 513, + 482, + 474, + 470, + 482, + 463, + 490, + 479, + 513, + 496, + 499, + 458, + 458, + 490, + 483, + 508, + 475, + 485, + 486, + 491, + 538, + 493, + 486, + 516, + 496, + 498, + 490, + 483, + 509, + 476, + 497, + 463, + 489, + 488, + 496, + 498, + 475, + 510, + 487, + 457, + 451, + 515, + 554, + 488, + 467, + 461, + 463, + 486, + 488, + 482, + 500, + 512, + 509, + 468, + 467, + 474, + 523, + 488, + 480, + 471, + 479, + 502, + 487, + 465, + 472, + 499, + 478, + 478, + 487, + 479, + 479, + 520, + 520, + 491, + 472, + 511, + 499, + 492, + 469, + 491, + 500, + 497, + 465, + 530, + 492, + 450, + 490, + 451, + 505, + 538, + 491, + 493, + 513, + 468, + 452, + 491, + 487, + 514, + 496, + 461, + 471, + 504, + 488, + 504, + 511, + 502, + 439, + 526, + 483, + 491, + 506, + 503, + 505, + 498, + 498, + 477, + 487, + 456, + 447, + 522, + 517, + 492, + 478, + 485, + 522, + 526, + 491, + 447, + 465, + 491, + 457, + 451, + 490, + 455, + 436, + 435, + 468, + 480, + 491, + 503, + 512, + 472, + 524, + 458, + 502, + 443, + 476, + 483, + 495, + 490, + 490, + 463, + 508, + 476, + 466, + 508, + 479, + 516, + 518, + 513, + 455, + 490, + 532, + 490, + 487, + 453, + 485, + 527, + 480, + 508, + 500, + 459, + 471, + 455, + 519, + 488, + 487, + 492, + 468, + 485, + 488, + 460, + 486, + 502, + 520, + 508, + 483, + 473, + 497, + 486, + 488, + 452, + 434, + 493, + 526, + 483, + 467, + 476, + 488, + 469, + 501, + 500, + 464, + 480, + 526, + 475, + 526, + 422, + 519, + 468, + 503, + 528, + 499, + 500, + 470, + 523, + 504, + 493, + 474, + 482, + 485, + 480, + 527, + 498, + 472, + 516, + 439, + 481, + 474, + 505, + 491, + 482, + 453, + 477, + 514, + 539, + 491, + 506, + 533, + 510, + 490, + 514, + 472, + 518, + 492, + 467, + 504, + 520, + 460, + 496, + 532, + 511, + 500, + 473, + 476, + 448, + 500, + 461, + 467, + 500, + 549, + 488, + 507, + 477, + 494, + 464, + 467, + 511, + 515, + 461, + 483, + 485, + 485, + 493, + 509, + 510, + 426, + 486, + 521, + 503, + 509, + 452, + 495, + 506, + 524, + 480, + 452, + 510, + 485, + 506, + 482, + 519, + 481, + 508, + 492, + 503, + 475, + 494, + 487, + 485, + 483, + 502, + 524, + 500, + 476, + 522, + 500, + 514, + 454, + 489, + 494, + 509, + 510, + 496, + 521, + 477, + 483, + 499, + 424, + 454, + 477, + 485, + 510, + 496, + 519, + 521, + 506, + 503, + 485, + 423, + 495, + 507, + 465, + 490, + 490, + 494, + 515, + 501, + 508, + 498, + 460, + 455, + 495, + 510, + 510, + 504, + 505, + 475, + 467, + 488, + 479, + 421, + 503, + 506, + 455, + 454, + 499, + 475, + 510, + 500, + 490, + 507, + 510, + 480, + 483, + 504, + 503, + 450, + 495, + 508, + 477, + 493, + 474, + 519, + 466, + 489, + 479, + 513, + 481, + 444, + 469, + 504, + 498, + 491, + 463, + 450, + 506, + 516, + 482, + 494, + 480, + 530, + 492, + 512, + 479, + 491, + 468, + 486, + 474, + 471, + 471, + 502, + 524, + 493, + 508, + 487, + 492, + 489, + 508, + 471, + 500, + 503, + 495, + 461, + 482, + 462, + 496, + 473, + 459, + 498, + 508, + 509, + 504, + 488, + 473, + 486, + 492, + 484, + 509, + 485, + 482, + 464, + 532, + 485, + 492, + 466, + 464, + 491, + 520, + 496, + 480, + 473, + 494, + 449, + 478, + 503, + 479, + 482, + 483, + 479, + 506, + 462, + 491, + 475, + 483, + 488, + 475, + 468, + 508, + 501, + 464, + 501, + 492, + 492, + 461, + 513, + 479, + 534, + 477, + 476, + 470, + 517, + 466, + 470, + 485, + 454, + 477, + 424, + 468, + 507, + 485, + 425, + 514, + 467, + 500, + 474, + 491, + 501, + 478, + 482, + 483, + 501, + 463, + 492, + 466, + 488, + 460, + 451, + 465, + 476, + 479, + 513, + 468, + 471, + 472, + 488, + 505, + 502, + 469, + 472, + 469, + 520, + 514, + 453, + 498, + 487, + 514, + 526, + 451, + 473, + 527, + 516, + 482, + 542, + 491, + 464, + 470, + 533, + 464, + 473, + 468, + 532, + 509, + 459, + 520, + 488, + 446, + 520, + 492, + 459, + 494, + 491, + 519, + 487, + 491, + 496, + 430, + 499, + 507, + 492, + 514, + 506, + 486, + 499, + 463, + 493, + 486, + 447, + 508, + 504, + 523, + 493, + 481, + 468, + 503, + 481, + 454, + 483, + 498, + 518, + 488, + 462, + 477, + 518, + 476, + 466, + 485, + 489, + 514, + 461, + 503, + 470, + 458, + 464, + 488, + 501, + 508, + 484, + 474, + 479, + 488, + 518, + 510, + 520, + 495, + 505, + 500, + 503, + 450, + 447, + 512, + 486, + 489, + 486, + 530, + 473, + 508, + 472, + 507, + 472, + 483, + 519, + 485, + 490, + 464, + 499, + 489, + 447, + 481, + 479, + 455, + 470, + 474, + 463, + 487, + 457, + 469, + 502, + 495, + 512, + 482, + 501, + 483, + 469, + 523, + 482, + 521, + 473, + 480, + 521, + 504, + 498, + 513, + 492, + 506, + 499, + 509, + 503, + 464, + 495, + 470, + 481, + 457, + 458, + 496, + 493, + 490, + 491, + 505, + 496, + 467, + 470, + 481, + 470, + 507, + 532, + 520, + 462, + 482, + 488, + 425, + 466, + 493, + 492, + 503, + 482, + 474, + 465, + 461, + 468, + 495, + 513, + 533, + 486, + 495, + 491, + 466, + 494, + 487, + 463, + 489, + 503, + 494, + 514, + 503, + 482, + 455, + 501, + 536, + 521, + 493, + 474, + 490, + 502, + 482, + 492, + 476, + 482, + 479, + 521, + 514, + 443, + 526, + 484, + 498, + 457, + 479, + 502, + 437, + 502, + 497, + 501, + 482, + 457, + 450, + 481, + 457, + 517, + 518, + 512, + 491, + 494, + 490, + 470, + 482, + 500, + 479, + 491, + 512, + 500, + 526, + 505, + 483, + 495, + 480, + 535, + 482, + 511, + 511, + 463, + 472, + 503, + 511, + 505, + 496, + 448, + 508, + 492, + 481, + 461, + 466, + 484, + 475, + 471, + 464, + 475, + 482, + 463, + 483, + 545, + 469, + 486, + 491, + 528, + 517, + 491, + 504, + 451, + 476, + 467, + 487, + 503, + 480, + 474, + 506, + 491, + 473, + 518, + 425, + 482, + 467, + 521, + 471, + 494, + 454, + 472, + 535, + 476, + 494, + 516, + 496, + 489, + 495, + 448, + 520, + 482, + 520, + 498, + 472, + 504, + 502, + 463, + 485, + 477, + 520, + 506, + 470, + 466, + 497, + 511, + 482, + 457, + 491, + 516, + 495, + 512, + 447, + 472, + 474, + 507, + 516, + 513, + 515, + 462, + 485, + 480, + 471, + 520, + 467, + 527, + 467, + 475, + 509, + 484, + 464, + 487, + 507, + 504, + 519, + 484, + 445, + 490, + 499, + 477, + 497, + 548, + 466, + 476, + 505, + 487, + 501, + 509, + 488, + 489, + 510, + 474, + 500, + 516, + 492, + 501, + 477, + 525, + 530, + 503, + 498, + 467, + 480, + 476, + 517, + 523, + 497, + 469, + 457, + 466, + 472, + 469, + 481, + 487, + 451, + 488, + 482, + 504, + 481, + 489, + 490, + 492, + 499, + 505, + 517, + 496, + 517, + 477, + 427, + 473, + 506, + 475, + 486, + 507, + 472, + 467, + 520, + 474, + 452, + 476, + 494, + 478, + 481, + 485, + 477, + 441, + 508, + 519, + 477, + 490, + 460, + 466, + 517, + 470, + 468, + 525, + 497, + 519, + 475, + 492, + 466, + 482, + 523, + 476, + 502, + 483, + 466, + 475, + 487, + 479, + 498, + 472, + 463, + 479, + 488, + 460, + 477, + 478, + 451, + 465, + 484, + 503, + 521, + 522, + 476, + 503, + 477, + 476, + 477, + 513, + 506, + 465, + 481, + 462, + 485, + 509, + 498, + 510, + 483, + 511, + 510, + 500, + 478, + 488, + 487, + 526, + 506, + 525, + 489, + 527, + 484, + 442, + 506, + 481, + 506, + 502, + 498, + 435, + 486, + 495, + 487, + 496, + 487, + 457, + 513, + 540, + 469, + 496, + 494, + 488, + 499, + 471, + 471, + 485, + 505, + 453, + 486, + 491, + 507, + 475, + 512, + 482, + 462, + 486, + 476, + 466, + 445, + 490, + 519, + 484, + 492, + 496, + 489, + 509, + 520, + 468, + 510, + 505, + 473, + 486, + 538, + 495, + 484, + 477, + 481, + 491, + 535, + 474, + 494, + 496, + 497, + 475, + 472, + 485, + 510, + 481, + 564, + 487, + 466, + 502, + 496, + 498, + 514, + 483, + 495, + 514, + 497, + 482, + 492, + 479, + 487, + 482, + 471, + 506, + 488, + 515, + 464, + 511, + 511, + 502, + 504, + 451, + 505, + 470, + 498, + 488, + 498, + 502, + 444, + 464, + 480, + 500, + 503, + 521, + 473, + 482, + 469, + 472, + 538, + 470, + 492, + 491, + 482, + 488, + 497, + 499, + 465, + 462, + 496, + 469, + 492, + 481, + 501, + 456, + 498, + 439, + 533, + 490, + 449, + 473, + 491, + 476, + 501, + 492, + 489, + 461, + 448, + 481, + 486, + 456, + 484, + 492, + 474, + 515, + 471, + 458, + 523, + 483, + 513, + 484, + 472, + 486, + 518, + 443, + 463, + 507, + 487, + 451, + 490, + 485, + 488, + 495, + 525, + 484, + 500, + 478, + 504, + 470, + 491, + 449, + 471, + 477, + 472, + 468, + 506, + 507, + 520, + 473, + 520, + 465, + 507, + 480, + 475, + 491, + 487, + 495, + 473, + 440, + 495, + 473, + 433, + 505, + 506, + 516, + 466, + 462, + 505, + 472, + 482, + 494, + 512, + 497, + 476, + 515, + 466, + 491, + 466, + 511, + 477, + 496, + 535, + 513, + 458, + 509, + 477, + 522, + 485, + 471, + 440, + 504, + 480, + 479, + 485, + 474, + 485, + 490, + 518, + 507, + 508, + 511, + 454, + 475, + 502, + 480, + 476, + 490, + 507, + 485, + 484, + 494, + 530, + 486, + 484, + 523, + 458, + 476, + 473, + 452, + 472, + 461, + 474, + 500, + 518, + 487, + 508, + 505, + 474, + 484, + 532, + 462, + 462, + 472, + 445, + 489, + 508, + 517, + 474, + 484, + 483, + 456, + 482, + 488, + 452, + 511, + 449, + 501, + 489, + 454, + 477, + 537, + 484, + 485, + 516, + 463, + 507, + 500, + 479, + 480, + 483, + 491, + 473, + 443, + 483, + 482, + 497, + 486, + 502, + 497, + 530, + 515, + 552, + 477, + 517, + 478, + 513, + 490, + 536, + 501, + 486, + 503, + 499, + 502, + 514, + 521, + 493, + 514, + 471, + 459, + 503, + 466, + 465, + 516, + 532, + 496, + 495, + 513, + 469, + 476, + 476, + 501, + 501, + 491, + 479, + 469, + 463, + 468, + 505, + 520, + 509, + 474, + 489, + 483, + 504, + 494, + 497, + 493, + 506, + 516, + 503, + 472, + 456, + 518, + 467, + 458, + 487, + 458, + 493, + 525, + 480, + 453, + 485, + 484, + 491, + 493, + 478, + 482, + 529, + 484, + 486, + 471, + 465, + 481, + 498, + 511, + 530, + 486, + 464, + 461, + 470, + 489, + 516, + 507, + 495, + 493, + 492, + 445, + 483, + 517, + 518, + 460, + 481, + 478, + 498, + 480, + 494, + 505, + 516, + 460, + 448, + 477, + 460, + 490, + 490, + 465, + 496, + 535, + 476, + 507, + 468, + 480, + 508, + 505, + 534, + 537, + 464, + 502, + 481, + 497, + 481, + 477, + 487, + 467, + 483, + 491, + 512, + 479, + 489, + 507, + 484, + 478, + 451, + 472, + 470, + 509, + 486, + 464, + 478, + 481, + 520, + 492, + 480, + 459, + 489, + 437, + 495, + 479, + 489, + 486, + 474, + 458, + 470, + 479, + 464, + 481, + 468, + 516, + 479, + 509, + 501, + 477, + 523, + 481, + 487, + 507, + 517, + 487, + 518, + 508, + 518, + 484, + 496, + 487, + 507, + 479, + 460, + 491, + 460, + 523, + 520, + 471, + 505, + 490, + 451, + 468, + 494, + 482, + 491, + 462, + 490, + 434, + 485, + 496, + 466, + 482, + 490, + 480, + 452, + 487, + 471, + 468, + 481, + 538, + 475, + 482, + 495, + 491, + 489, + 493, + 469, + 483, + 480, + 508, + 516, + 473, + 487, + 513, + 493, + 506, + 489, + 478, + 480, + 469, + 455, + 487, + 509, + 473, + 490, + 512, + 510, + 488, + 517 + ] + }, + { + "counters": [ + 492, + 496, + 514, + 481, + 463, + 481, + 487, + 491, + 438, + 495, + 531, + 489, + 445, + 508, + 527, + 577, + 468, + 537, + 474, + 503, + 439, + 514, + 541, + 515, + 463, + 470, + 483, + 466, + 484, + 522, + 492, + 468, + 497, + 523, + 500, + 492, + 472, + 503, + 506, + 469, + 496, + 509, + 502, + 439, + 476, + 508, + 483, + 512, + 502, + 463, + 488, + 453, + 482, + 503, + 542, + 524, + 483, + 461, + 478, + 482, + 496, + 503, + 510, + 455, + 513, + 509, + 437, + 467, + 483, + 483, + 458, + 539, + 503, + 476, + 491, + 504, + 520, + 474, + 485, + 507, + 485, + 524, + 507, + 459, + 485, + 531, + 497, + 474, + 469, + 499, + 506, + 472, + 491, + 486, + 497, + 525, + 501, + 491, + 510, + 487, + 471, + 490, + 478, + 486, + 493, + 471, + 449, + 474, + 494, + 452, + 509, + 484, + 473, + 493, + 489, + 510, + 454, + 479, + 482, + 471, + 505, + 485, + 472, + 522, + 493, + 459, + 499, + 517, + 480, + 487, + 459, + 488, + 482, + 460, + 491, + 475, + 476, + 506, + 466, + 491, + 511, + 477, + 485, + 469, + 511, + 486, + 514, + 513, + 465, + 531, + 464, + 483, + 488, + 468, + 484, + 499, + 487, + 502, + 475, + 492, + 495, + 510, + 493, + 486, + 513, + 488, + 419, + 486, + 520, + 528, + 493, + 535, + 443, + 463, + 429, + 548, + 467, + 452, + 535, + 485, + 457, + 436, + 473, + 510, + 484, + 479, + 505, + 548, + 486, + 526, + 518, + 493, + 532, + 483, + 471, + 491, + 491, + 507, + 458, + 482, + 515, + 489, + 450, + 502, + 457, + 467, + 474, + 488, + 524, + 469, + 474, + 510, + 489, + 470, + 493, + 494, + 451, + 509, + 522, + 466, + 484, + 467, + 524, + 483, + 502, + 513, + 464, + 536, + 477, + 489, + 479, + 457, + 516, + 482, + 524, + 460, + 439, + 509, + 508, + 511, + 487, + 500, + 539, + 505, + 485, + 477, + 535, + 464, + 495, + 497, + 526, + 468, + 524, + 488, + 459, + 482, + 507, + 476, + 498, + 454, + 506, + 457, + 485, + 510, + 488, + 511, + 502, + 513, + 503, + 511, + 518, + 507, + 470, + 513, + 476, + 471, + 520, + 495, + 504, + 490, + 492, + 489, + 467, + 480, + 463, + 489, + 499, + 479, + 507, + 510, + 529, + 443, + 504, + 483, + 484, + 452, + 459, + 486, + 481, + 475, + 501, + 474, + 485, + 529, + 486, + 469, + 451, + 484, + 499, + 484, + 483, + 504, + 507, + 471, + 517, + 508, + 497, + 444, + 484, + 474, + 508, + 508, + 518, + 489, + 479, + 498, + 484, + 502, + 485, + 537, + 464, + 458, + 471, + 500, + 494, + 486, + 513, + 490, + 521, + 450, + 482, + 473, + 479, + 478, + 461, + 485, + 480, + 489, + 471, + 521, + 524, + 482, + 514, + 477, + 550, + 486, + 532, + 514, + 497, + 499, + 491, + 489, + 500, + 496, + 484, + 492, + 460, + 480, + 483, + 482, + 512, + 460, + 453, + 515, + 477, + 478, + 502, + 524, + 498, + 494, + 525, + 481, + 458, + 493, + 473, + 511, + 469, + 477, + 495, + 445, + 476, + 494, + 504, + 488, + 481, + 480, + 479, + 502, + 482, + 512, + 485, + 502, + 501, + 467, + 448, + 497, + 509, + 507, + 471, + 478, + 483, + 504, + 513, + 436, + 440, + 507, + 491, + 504, + 507, + 466, + 488, + 480, + 506, + 479, + 486, + 482, + 480, + 497, + 502, + 457, + 489, + 470, + 507, + 480, + 481, + 458, + 502, + 485, + 498, + 461, + 531, + 547, + 464, + 465, + 510, + 461, + 461, + 474, + 529, + 499, + 503, + 477, + 537, + 509, + 481, + 539, + 528, + 508, + 475, + 476, + 487, + 504, + 495, + 484, + 486, + 501, + 462, + 501, + 465, + 506, + 478, + 472, + 545, + 487, + 464, + 463, + 516, + 474, + 520, + 462, + 502, + 500, + 453, + 477, + 476, + 477, + 504, + 482, + 488, + 506, + 472, + 500, + 500, + 507, + 497, + 498, + 465, + 516, + 457, + 474, + 464, + 451, + 522, + 484, + 429, + 508, + 449, + 467, + 488, + 503, + 483, + 488, + 492, + 434, + 472, + 522, + 486, + 520, + 507, + 517, + 499, + 481, + 445, + 465, + 516, + 455, + 520, + 438, + 467, + 489, + 498, + 500, + 487, + 505, + 477, + 487, + 480, + 491, + 515, + 496, + 462, + 456, + 479, + 498, + 494, + 478, + 476, + 476, + 478, + 467, + 530, + 477, + 477, + 495, + 487, + 523, + 544, + 473, + 496, + 493, + 465, + 502, + 497, + 494, + 496, + 479, + 485, + 473, + 473, + 519, + 477, + 487, + 511, + 468, + 478, + 491, + 529, + 473, + 523, + 498, + 474, + 455, + 482, + 509, + 500, + 491, + 501, + 481, + 500, + 465, + 477, + 471, + 513, + 514, + 489, + 512, + 537, + 487, + 506, + 484, + 446, + 480, + 487, + 511, + 482, + 467, + 497, + 484, + 474, + 496, + 477, + 522, + 510, + 521, + 480, + 461, + 531, + 478, + 465, + 470, + 479, + 455, + 533, + 452, + 486, + 499, + 479, + 459, + 494, + 434, + 485, + 466, + 479, + 481, + 510, + 493, + 477, + 479, + 468, + 491, + 487, + 477, + 484, + 491, + 494, + 431, + 534, + 493, + 498, + 477, + 476, + 448, + 445, + 488, + 453, + 484, + 454, + 487, + 446, + 460, + 500, + 468, + 479, + 483, + 498, + 457, + 449, + 474, + 481, + 503, + 497, + 492, + 483, + 532, + 482, + 482, + 500, + 453, + 499, + 459, + 506, + 492, + 524, + 491, + 467, + 495, + 510, + 471, + 491, + 503, + 460, + 484, + 448, + 476, + 513, + 459, + 521, + 476, + 484, + 491, + 494, + 566, + 479, + 555, + 516, + 493, + 482, + 520, + 510, + 470, + 460, + 497, + 478, + 480, + 515, + 496, + 496, + 503, + 485, + 503, + 508, + 476, + 516, + 510, + 510, + 518, + 486, + 487, + 460, + 492, + 495, + 499, + 470, + 461, + 507, + 510, + 494, + 488, + 503, + 505, + 550, + 514, + 494, + 492, + 488, + 505, + 452, + 488, + 474, + 479, + 466, + 463, + 457, + 489, + 510, + 449, + 490, + 444, + 483, + 483, + 509, + 501, + 512, + 465, + 476, + 442, + 487, + 502, + 458, + 524, + 461, + 500, + 482, + 492, + 469, + 460, + 508, + 459, + 452, + 487, + 481, + 466, + 515, + 491, + 489, + 482, + 489, + 486, + 470, + 505, + 494, + 544, + 509, + 503, + 515, + 502, + 498, + 461, + 530, + 460, + 494, + 463, + 470, + 551, + 478, + 483, + 535, + 506, + 511, + 491, + 513, + 506, + 461, + 484, + 430, + 462, + 494, + 521, + 458, + 463, + 503, + 506, + 446, + 513, + 479, + 491, + 470, + 491, + 467, + 497, + 475, + 473, + 511, + 458, + 502, + 489, + 455, + 487, + 475, + 466, + 474, + 518, + 493, + 511, + 503, + 449, + 467, + 444, + 529, + 494, + 485, + 509, + 516, + 463, + 501, + 472, + 468, + 491, + 526, + 511, + 461, + 486, + 497, + 525, + 469, + 478, + 528, + 482, + 462, + 464, + 524, + 505, + 435, + 474, + 441, + 484, + 532, + 496, + 462, + 480, + 482, + 526, + 504, + 466, + 511, + 500, + 470, + 502, + 419, + 500, + 446, + 467, + 503, + 471, + 471, + 490, + 517, + 482, + 505, + 493, + 502, + 488, + 491, + 469, + 506, + 440, + 483, + 487, + 471, + 493, + 475, + 502, + 467, + 494, + 471, + 472, + 513, + 506, + 512, + 523, + 503, + 469, + 498, + 498, + 470, + 481, + 451, + 488, + 493, + 487, + 511, + 474, + 494, + 506, + 513, + 531, + 518, + 492, + 487, + 470, + 496, + 485, + 477, + 481, + 520, + 512, + 465, + 479, + 494, + 545, + 473, + 483, + 475, + 515, + 475, + 476, + 465, + 498, + 497, + 497, + 445, + 508, + 492, + 525, + 499, + 484, + 479, + 484, + 434, + 505, + 488, + 493, + 508, + 484, + 475, + 475, + 501, + 510, + 498, + 483, + 488, + 464, + 502, + 471, + 494, + 476, + 504, + 458, + 444, + 485, + 478, + 454, + 494, + 472, + 494, + 488, + 483, + 497, + 489, + 484, + 513, + 520, + 483, + 476, + 464, + 518, + 500, + 502, + 518, + 495, + 456, + 487, + 483, + 473, + 496, + 493, + 490, + 508, + 465, + 497, + 475, + 522, + 475, + 483, + 492, + 455, + 470, + 489, + 525, + 480, + 473, + 503, + 504, + 477, + 473, + 529, + 500, + 474, + 501, + 512, + 498, + 510, + 495, + 497, + 489, + 474, + 487, + 489, + 504, + 466, + 503, + 472, + 465, + 510, + 476, + 442, + 474, + 507, + 495, + 490, + 483, + 466, + 489, + 472, + 466, + 519, + 471, + 500, + 461, + 494, + 500, + 510, + 496, + 470, + 485, + 466, + 484, + 516, + 493, + 500, + 471, + 489, + 454, + 494, + 465, + 530, + 536, + 491, + 478, + 491, + 443, + 434, + 468, + 502, + 477, + 511, + 479, + 500, + 499, + 451, + 503, + 493, + 501, + 485, + 450, + 482, + 482, + 438, + 516, + 490, + 508, + 500, + 491, + 462, + 533, + 478, + 463, + 517, + 497, + 466, + 493, + 495, + 489, + 475, + 478, + 509, + 450, + 506, + 504, + 481, + 464, + 536, + 534, + 466, + 463, + 510, + 507, + 482, + 503, + 478, + 469, + 465, + 513, + 481, + 446, + 510, + 484, + 443, + 516, + 482, + 471, + 505, + 471, + 485, + 491, + 471, + 496, + 470, + 509, + 435, + 487, + 502, + 475, + 496, + 519, + 448, + 477, + 481, + 492, + 509, + 458, + 511, + 483, + 465, + 477, + 493, + 487, + 513, + 488, + 501, + 501, + 501, + 490, + 479, + 505, + 526, + 496, + 548, + 486, + 517, + 424, + 498, + 490, + 512, + 476, + 454, + 476, + 506, + 473, + 466, + 490, + 448, + 498, + 494, + 512, + 476, + 490, + 477, + 460, + 473, + 511, + 489, + 510, + 487, + 454, + 472, + 485, + 478, + 476, + 459, + 501, + 506, + 472, + 478, + 505, + 507, + 486, + 487, + 498, + 511, + 504, + 475, + 466, + 503, + 496, + 473, + 500, + 450, + 485, + 477, + 486, + 507, + 498, + 486, + 514, + 466, + 471, + 454, + 455, + 488, + 503, + 504, + 504, + 527, + 493, + 515, + 478, + 486, + 496, + 508, + 482, + 511, + 475, + 470, + 485, + 469, + 493, + 498, + 492, + 500, + 528, + 496, + 497, + 473, + 486, + 488, + 474, + 470, + 484, + 458, + 500, + 510, + 477, + 503, + 479, + 471, + 488, + 510, + 504, + 436, + 491, + 486, + 461, + 477, + 483, + 452, + 465, + 474, + 510, + 486, + 531, + 508, + 499, + 451, + 497, + 504, + 490, + 469, + 452, + 506, + 459, + 487, + 481, + 510, + 469, + 486, + 517, + 488, + 463, + 480, + 534, + 483, + 513, + 468, + 471, + 461, + 531, + 488, + 466, + 490, + 513, + 513, + 507, + 492, + 493, + 479, + 505, + 476, + 485, + 500, + 485, + 503, + 453, + 478, + 500, + 471, + 473, + 466, + 465, + 532, + 513, + 517, + 518, + 532, + 501, + 491, + 451, + 482, + 472, + 483, + 474, + 529, + 472, + 512, + 482, + 518, + 468, + 435, + 460, + 497, + 538, + 484, + 500, + 446, + 494, + 505, + 498, + 505, + 487, + 517, + 496, + 489, + 475, + 433, + 452, + 486, + 483, + 498, + 476, + 510, + 496, + 517, + 490, + 465, + 462, + 463, + 462, + 465, + 486, + 504, + 458, + 489, + 517, + 474, + 514, + 536, + 527, + 446, + 536, + 493, + 492, + 490, + 469, + 483, + 512, + 449, + 536, + 501, + 499, + 477, + 489, + 483, + 518, + 484, + 484, + 485, + 483, + 470, + 481, + 500, + 474, + 469, + 493, + 461, + 506, + 468, + 496, + 483, + 466, + 499, + 521, + 466, + 510, + 489, + 519, + 523, + 470, + 486, + 489, + 536, + 499, + 501, + 489, + 501, + 473, + 485, + 491, + 514, + 508, + 495, + 457, + 479, + 484, + 474, + 496, + 481, + 515, + 468, + 480, + 482, + 519, + 495, + 496, + 511, + 464, + 511, + 483, + 441, + 494, + 486, + 512, + 434, + 501, + 509, + 430, + 473, + 529, + 487, + 485, + 512, + 460, + 513, + 436, + 487, + 493, + 499, + 491, + 469, + 478, + 491, + 499, + 469, + 484, + 459, + 442, + 441, + 496, + 481, + 540, + 506, + 470, + 516, + 507, + 466, + 461, + 534, + 514, + 469, + 516, + 453, + 436, + 468, + 478, + 468, + 454, + 464, + 505, + 510, + 532, + 497, + 495, + 504, + 482, + 500, + 497, + 488, + 470, + 502, + 490, + 502, + 466, + 461, + 494, + 491, + 511, + 531, + 465, + 532, + 474, + 499, + 496, + 481, + 486, + 473, + 496, + 494, + 501, + 495, + 477, + 509, + 525, + 510, + 474, + 514, + 493, + 510, + 513, + 505, + 475, + 493, + 458, + 462, + 467, + 468, + 474, + 501, + 539, + 509, + 480, + 500, + 480, + 468, + 464, + 500, + 457, + 497, + 467, + 472, + 528, + 473, + 472, + 528, + 488, + 482, + 490, + 502, + 523, + 469, + 475, + 493, + 473, + 455, + 461, + 469, + 480, + 460, + 497, + 478, + 509, + 495, + 491, + 523, + 508, + 495, + 493, + 460, + 460, + 495, + 483, + 498, + 494, + 501, + 471, + 495, + 465, + 476, + 476, + 502, + 495, + 503, + 491, + 454, + 458, + 511, + 497, + 541, + 468, + 460, + 499, + 495, + 481, + 467, + 453, + 512, + 451, + 502, + 481, + 495, + 456, + 481, + 484, + 459, + 520, + 470, + 480, + 512, + 510, + 472, + 446, + 469, + 496, + 488, + 493, + 503, + 513, + 514, + 500, + 495, + 501, + 484, + 466, + 504, + 494, + 451, + 477, + 494, + 494, + 471, + 481, + 514, + 458, + 488, + 507, + 489, + 465, + 475, + 478, + 496, + 462, + 465, + 499, + 488, + 502, + 507, + 448, + 460, + 480, + 486, + 466, + 500, + 528, + 486, + 475, + 475, + 493, + 458, + 475, + 488, + 513, + 493, + 468, + 508, + 454, + 533, + 474, + 445, + 481, + 492, + 522, + 506, + 514, + 496, + 470, + 509, + 504, + 512, + 498, + 519, + 531, + 499, + 474, + 494, + 497, + 515, + 506, + 506, + 515, + 497, + 472, + 501, + 514, + 490, + 468, + 483, + 491, + 532, + 494, + 533, + 506, + 491, + 446, + 497, + 469, + 478, + 478, + 469, + 467, + 496, + 518, + 456, + 504, + 472, + 469, + 486, + 486, + 506, + 440, + 473, + 475, + 459, + 496, + 506, + 517, + 483, + 484, + 507, + 481, + 467, + 483, + 481, + 504, + 446, + 467, + 476, + 477, + 447, + 489, + 494, + 474, + 511, + 500, + 486, + 509, + 499, + 488, + 480, + 503, + 484, + 485, + 503, + 483, + 483, + 483, + 447, + 491, + 502, + 492, + 494, + 491, + 465, + 503, + 499, + 484, + 461, + 497, + 482, + 477, + 468, + 511, + 481, + 485, + 470, + 490, + 515, + 526, + 457, + 510, + 476, + 501, + 437, + 496, + 531, + 495, + 472, + 485, + 471, + 517, + 518, + 519, + 459, + 490, + 522, + 476, + 465, + 466, + 508, + 477, + 482, + 503, + 476, + 486, + 473, + 499, + 493, + 490, + 492, + 478, + 522, + 523, + 494, + 512, + 482, + 502, + 474, + 474, + 482, + 486, + 502, + 462, + 536, + 486, + 484, + 474, + 503, + 506, + 508, + 506, + 500, + 468, + 494, + 462, + 528, + 451, + 501, + 457, + 476, + 481, + 493, + 479, + 467, + 498, + 508, + 520, + 492, + 447, + 508, + 491, + 490, + 448, + 466, + 474, + 497, + 469, + 521, + 538, + 501, + 501, + 429, + 510, + 499, + 509, + 487, + 493, + 518, + 495, + 482, + 494, + 502, + 529, + 460, + 553, + 506, + 490, + 534, + 453, + 500, + 491, + 521, + 457, + 452, + 520, + 517, + 456, + 476, + 474, + 495, + 456, + 496, + 516, + 490, + 485, + 463, + 487, + 453, + 466, + 486, + 459, + 485, + 484, + 491, + 463, + 499, + 511, + 454, + 488, + 461, + 507, + 493, + 507, + 499, + 505, + 461, + 496, + 546, + 492, + 500, + 437, + 493, + 495, + 484, + 453, + 465, + 480, + 477, + 508, + 450, + 475, + 461, + 480, + 486, + 491, + 476, + 534, + 515, + 475, + 486, + 539, + 462, + 445, + 529, + 490, + 470, + 463, + 520, + 493, + 496, + 469, + 487, + 488, + 519, + 498, + 534, + 522, + 470, + 494, + 494, + 497, + 537, + 498, + 484, + 468, + 475, + 503, + 515, + 450, + 460, + 479, + 487, + 467, + 466, + 460, + 504, + 492, + 516, + 503, + 465, + 480, + 487, + 477, + 484, + 473, + 470, + 526, + 471, + 460, + 500, + 479, + 484, + 483, + 490, + 522, + 475, + 500, + 486, + 490, + 485, + 434, + 480 + ] + }, + { + "counters": [ + 489, + 519, + 466, + 483, + 484, + 514, + 505, + 495, + 485, + 472, + 525, + 511, + 497, + 486, + 478, + 481, + 483, + 502, + 468, + 473, + 546, + 482, + 497, + 456, + 471, + 501, + 479, + 480, + 489, + 513, + 499, + 481, + 507, + 472, + 503, + 467, + 503, + 535, + 502, + 492, + 518, + 487, + 482, + 469, + 515, + 488, + 475, + 512, + 514, + 491, + 478, + 485, + 478, + 476, + 499, + 447, + 491, + 534, + 493, + 491, + 471, + 465, + 500, + 455, + 505, + 484, + 461, + 480, + 497, + 463, + 497, + 488, + 467, + 507, + 504, + 465, + 503, + 492, + 503, + 486, + 497, + 494, + 527, + 485, + 478, + 514, + 471, + 477, + 493, + 502, + 493, + 489, + 505, + 504, + 483, + 508, + 473, + 503, + 520, + 520, + 460, + 467, + 509, + 490, + 467, + 466, + 497, + 484, + 490, + 494, + 498, + 453, + 454, + 469, + 529, + 462, + 491, + 513, + 499, + 520, + 456, + 494, + 507, + 515, + 504, + 474, + 489, + 495, + 483, + 467, + 468, + 479, + 510, + 488, + 461, + 484, + 482, + 492, + 482, + 468, + 497, + 554, + 503, + 457, + 496, + 483, + 464, + 447, + 446, + 518, + 449, + 531, + 511, + 494, + 497, + 512, + 483, + 486, + 476, + 499, + 506, + 481, + 511, + 505, + 518, + 506, + 506, + 508, + 501, + 502, + 511, + 493, + 464, + 515, + 488, + 494, + 488, + 513, + 503, + 440, + 451, + 495, + 451, + 437, + 516, + 495, + 524, + 493, + 485, + 490, + 464, + 504, + 456, + 481, + 517, + 486, + 485, + 471, + 506, + 492, + 531, + 468, + 529, + 495, + 486, + 512, + 494, + 484, + 488, + 476, + 486, + 499, + 504, + 452, + 488, + 469, + 467, + 479, + 474, + 446, + 473, + 473, + 465, + 501, + 487, + 499, + 488, + 487, + 502, + 514, + 469, + 483, + 487, + 469, + 490, + 486, + 446, + 445, + 509, + 480, + 500, + 478, + 490, + 496, + 514, + 464, + 512, + 468, + 480, + 503, + 530, + 494, + 488, + 493, + 535, + 508, + 483, + 475, + 488, + 478, + 483, + 491, + 455, + 509, + 473, + 500, + 514, + 458, + 488, + 473, + 524, + 496, + 477, + 477, + 497, + 512, + 476, + 435, + 474, + 497, + 513, + 500, + 496, + 475, + 464, + 514, + 496, + 528, + 501, + 476, + 489, + 456, + 455, + 481, + 498, + 456, + 489, + 455, + 469, + 477, + 466, + 491, + 485, + 466, + 490, + 462, + 456, + 470, + 479, + 494, + 495, + 514, + 514, + 495, + 478, + 457, + 456, + 472, + 496, + 514, + 501, + 500, + 486, + 508, + 528, + 472, + 488, + 475, + 475, + 458, + 437, + 502, + 468, + 464, + 498, + 511, + 496, + 504, + 457, + 489, + 494, + 478, + 466, + 479, + 482, + 497, + 497, + 472, + 456, + 540, + 489, + 484, + 470, + 514, + 498, + 492, + 493, + 481, + 471, + 477, + 477, + 472, + 514, + 498, + 496, + 473, + 498, + 510, + 528, + 502, + 467, + 502, + 492, + 490, + 465, + 513, + 504, + 500, + 498, + 508, + 501, + 499, + 499, + 501, + 459, + 491, + 491, + 494, + 504, + 464, + 506, + 468, + 499, + 499, + 492, + 474, + 484, + 464, + 492, + 451, + 490, + 500, + 465, + 472, + 526, + 447, + 498, + 485, + 495, + 489, + 505, + 479, + 452, + 470, + 512, + 496, + 489, + 486, + 474, + 510, + 477, + 468, + 467, + 496, + 448, + 469, + 506, + 443, + 505, + 488, + 461, + 493, + 464, + 510, + 504, + 476, + 504, + 520, + 468, + 495, + 500, + 499, + 487, + 469, + 481, + 480, + 468, + 500, + 455, + 479, + 449, + 459, + 452, + 485, + 462, + 533, + 487, + 493, + 501, + 513, + 473, + 473, + 486, + 463, + 499, + 463, + 463, + 463, + 513, + 474, + 508, + 533, + 459, + 494, + 496, + 455, + 490, + 490, + 480, + 477, + 474, + 463, + 508, + 493, + 502, + 492, + 493, + 490, + 510, + 497, + 480, + 502, + 456, + 479, + 458, + 477, + 499, + 500, + 457, + 451, + 459, + 475, + 495, + 471, + 482, + 472, + 473, + 489, + 488, + 445, + 462, + 504, + 496, + 453, + 503, + 484, + 488, + 491, + 501, + 481, + 477, + 485, + 492, + 507, + 469, + 495, + 525, + 532, + 452, + 482, + 520, + 504, + 456, + 509, + 471, + 503, + 504, + 476, + 488, + 445, + 471, + 501, + 477, + 502, + 503, + 481, + 487, + 465, + 459, + 500, + 459, + 493, + 504, + 503, + 499, + 500, + 472, + 547, + 503, + 463, + 463, + 489, + 482, + 534, + 487, + 484, + 456, + 502, + 481, + 507, + 482, + 502, + 491, + 473, + 477, + 477, + 471, + 516, + 471, + 496, + 469, + 479, + 500, + 473, + 479, + 492, + 500, + 463, + 487, + 499, + 481, + 494, + 489, + 497, + 469, + 457, + 493, + 462, + 488, + 493, + 527, + 508, + 502, + 462, + 473, + 457, + 453, + 498, + 483, + 475, + 466, + 480, + 500, + 499, + 491, + 453, + 487, + 458, + 477, + 504, + 492, + 521, + 473, + 485, + 424, + 471, + 472, + 445, + 491, + 488, + 484, + 435, + 490, + 513, + 486, + 476, + 499, + 495, + 446, + 509, + 481, + 473, + 488, + 490, + 488, + 482, + 506, + 481, + 497, + 503, + 519, + 522, + 486, + 518, + 480, + 492, + 507, + 479, + 524, + 512, + 498, + 511, + 490, + 527, + 519, + 475, + 469, + 537, + 448, + 466, + 535, + 481, + 522, + 514, + 485, + 488, + 492, + 508, + 485, + 497, + 481, + 495, + 502, + 472, + 487, + 448, + 464, + 485, + 566, + 514, + 430, + 491, + 469, + 425, + 512, + 497, + 528, + 498, + 466, + 477, + 505, + 483, + 498, + 477, + 455, + 491, + 526, + 468, + 464, + 504, + 502, + 491, + 488, + 482, + 477, + 452, + 432, + 459, + 521, + 422, + 513, + 488, + 470, + 519, + 522, + 471, + 503, + 496, + 502, + 496, + 548, + 497, + 504, + 486, + 488, + 505, + 511, + 474, + 466, + 489, + 457, + 492, + 509, + 483, + 509, + 464, + 478, + 492, + 511, + 476, + 458, + 465, + 485, + 482, + 463, + 485, + 492, + 470, + 479, + 472, + 463, + 512, + 484, + 498, + 487, + 485, + 468, + 493, + 455, + 483, + 474, + 497, + 484, + 452, + 472, + 515, + 461, + 460, + 503, + 503, + 449, + 479, + 435, + 525, + 478, + 453, + 472, + 462, + 484, + 492, + 475, + 525, + 498, + 432, + 488, + 461, + 483, + 502, + 530, + 497, + 477, + 483, + 497, + 495, + 478, + 490, + 471, + 476, + 507, + 500, + 466, + 511, + 484, + 513, + 487, + 514, + 466, + 478, + 510, + 505, + 505, + 502, + 469, + 515, + 495, + 506, + 493, + 511, + 469, + 472, + 512, + 471, + 486, + 490, + 492, + 468, + 515, + 531, + 489, + 516, + 468, + 515, + 488, + 462, + 470, + 456, + 522, + 467, + 457, + 479, + 478, + 521, + 519, + 520, + 436, + 427, + 503, + 514, + 518, + 512, + 492, + 454, + 489, + 492, + 506, + 499, + 502, + 470, + 468, + 456, + 498, + 448, + 502, + 517, + 509, + 482, + 519, + 525, + 501, + 514, + 478, + 485, + 504, + 502, + 481, + 484, + 525, + 502, + 497, + 497, + 485, + 492, + 452, + 421, + 449, + 502, + 517, + 474, + 479, + 478, + 493, + 483, + 459, + 441, + 465, + 509, + 473, + 455, + 518, + 433, + 473, + 507, + 498, + 472, + 489, + 504, + 482, + 490, + 491, + 533, + 487, + 480, + 504, + 526, + 519, + 496, + 468, + 466, + 493, + 518, + 528, + 501, + 480, + 479, + 472, + 481, + 480, + 507, + 457, + 519, + 507, + 468, + 518, + 464, + 492, + 478, + 473, + 539, + 466, + 515, + 465, + 489, + 461, + 476, + 457, + 482, + 491, + 491, + 474, + 464, + 478, + 519, + 487, + 503, + 482, + 474, + 468, + 459, + 432, + 474, + 469, + 493, + 485, + 504, + 486, + 506, + 492, + 489, + 489, + 530, + 503, + 499, + 509, + 499, + 488, + 514, + 440, + 545, + 487, + 452, + 500, + 509, + 485, + 517, + 496, + 513, + 513, + 483, + 494, + 514, + 474, + 502, + 509, + 524, + 520, + 444, + 475, + 488, + 505, + 493, + 489, + 474, + 451, + 487, + 490, + 499, + 481, + 494, + 465, + 454, + 479, + 487, + 486, + 477, + 495, + 501, + 471, + 479, + 469, + 464, + 502, + 486, + 439, + 478, + 501, + 505, + 444, + 505, + 481, + 514, + 494, + 463, + 472, + 473, + 472, + 452, + 488, + 526, + 494, + 476, + 522, + 514, + 502, + 479, + 487, + 496, + 483, + 481, + 481, + 476, + 514, + 511, + 484, + 457, + 502, + 539, + 489, + 464, + 506, + 465, + 446, + 528, + 459, + 455, + 478, + 520, + 472, + 440, + 490, + 533, + 487, + 494, + 492, + 488, + 526, + 521, + 492, + 485, + 481, + 439, + 459, + 495, + 472, + 477, + 490, + 511, + 452, + 511, + 480, + 496, + 527, + 483, + 479, + 479, + 476, + 481, + 462, + 515, + 440, + 487, + 498, + 484, + 468, + 475, + 518, + 486, + 508, + 499, + 465, + 487, + 497, + 467, + 484, + 533, + 505, + 491, + 520, + 459, + 495, + 527, + 463, + 480, + 473, + 542, + 503, + 441, + 472, + 462, + 486, + 496, + 516, + 462, + 537, + 511, + 499, + 493, + 495, + 447, + 489, + 517, + 435, + 476, + 492, + 475, + 485, + 493, + 471, + 496, + 514, + 492, + 477, + 500, + 518, + 488, + 539, + 468, + 536, + 471, + 491, + 488, + 507, + 511, + 496, + 450, + 486, + 520, + 514, + 474, + 477, + 464, + 472, + 474, + 464, + 496, + 462, + 457, + 439, + 510, + 462, + 469, + 508, + 459, + 494, + 509, + 466, + 511, + 523, + 466, + 495, + 454, + 512, + 469, + 467, + 478, + 453, + 520, + 491, + 483, + 493, + 500, + 444, + 492, + 473, + 502, + 455, + 494, + 549, + 508, + 466, + 494, + 479, + 508, + 473, + 463, + 483, + 471, + 525, + 517, + 479, + 500, + 500, + 473, + 478, + 496, + 444, + 500, + 495, + 513, + 507, + 491, + 453, + 498, + 464, + 476, + 523, + 460, + 492, + 525, + 517, + 483, + 480, + 485, + 465, + 512, + 490, + 506, + 547, + 486, + 462, + 484, + 524, + 476, + 471, + 479, + 496, + 546, + 489, + 473, + 468, + 492, + 490, + 494, + 481, + 488, + 457, + 520, + 495, + 492, + 476, + 471, + 494, + 518, + 519, + 502, + 510, + 499, + 507, + 477, + 500, + 491, + 492, + 500, + 496, + 490, + 519, + 474, + 434, + 482, + 482, + 501, + 486, + 456, + 510, + 502, + 488, + 503, + 473, + 521, + 517, + 464, + 506, + 462, + 471, + 497, + 472, + 495, + 507, + 481, + 478, + 477, + 421, + 528, + 509, + 534, + 511, + 513, + 487, + 536, + 502, + 532, + 512, + 461, + 480, + 499, + 456, + 504, + 478, + 496, + 485, + 467, + 507, + 491, + 482, + 483, + 479, + 478, + 523, + 469, + 516, + 497, + 500, + 478, + 461, + 503, + 480, + 480, + 468, + 507, + 473, + 500, + 503, + 488, + 486, + 497, + 481, + 523, + 482, + 488, + 489, + 517, + 493, + 528, + 489, + 481, + 510, + 470, + 467, + 490, + 476, + 489, + 465, + 482, + 487, + 498, + 497, + 515, + 470, + 487, + 472, + 522, + 468, + 495, + 477, + 438, + 474, + 532, + 525, + 452, + 495, + 474, + 496, + 524, + 473, + 499, + 519, + 505, + 507, + 484, + 434, + 484, + 490, + 537, + 519, + 462, + 484, + 479, + 457, + 460, + 512, + 487, + 503, + 502, + 463, + 489, + 497, + 494, + 506, + 495, + 518, + 473, + 446, + 486, + 462, + 515, + 473, + 502, + 514, + 518, + 476, + 498, + 455, + 517, + 492, + 424, + 490, + 485, + 502, + 499, + 479, + 468, + 460, + 450, + 464, + 482, + 478, + 494, + 530, + 498, + 475, + 483, + 505, + 482, + 500, + 470, + 496, + 458, + 460, + 524, + 435, + 490, + 494, + 516, + 491, + 487, + 482, + 480, + 498, + 487, + 479, + 503, + 470, + 477, + 468, + 500, + 489, + 447, + 495, + 490, + 501, + 494, + 516, + 475, + 461, + 510, + 489, + 467, + 499, + 485, + 483, + 520, + 486, + 488, + 515, + 494, + 516, + 517, + 509, + 503, + 475, + 511, + 449, + 510, + 497, + 506, + 474, + 506, + 516, + 534, + 487, + 485, + 455, + 487, + 499, + 506, + 481, + 496, + 505, + 497, + 504, + 502, + 488, + 496, + 483, + 521, + 528, + 479, + 471, + 498, + 504, + 491, + 476, + 482, + 472, + 486, + 478, + 480, + 534, + 463, + 494, + 487, + 497, + 473, + 496, + 465, + 515, + 498, + 453, + 516, + 474, + 463, + 502, + 516, + 496, + 475, + 503, + 478, + 510, + 479, + 518, + 479, + 519, + 499, + 464, + 475, + 469, + 480, + 483, + 492, + 468, + 507, + 474, + 452, + 509, + 439, + 478, + 510, + 521, + 522, + 498, + 525, + 499, + 489, + 485, + 514, + 501, + 506, + 466, + 462, + 457, + 490, + 538, + 462, + 489, + 451, + 499, + 481, + 468, + 509, + 508, + 517, + 533, + 469, + 497, + 513, + 511, + 523, + 482, + 492, + 507, + 512, + 477, + 487, + 490, + 495, + 462, + 491, + 505, + 500, + 484, + 475, + 515, + 490, + 471, + 547, + 480, + 501, + 483, + 469, + 476, + 513, + 506, + 494, + 462, + 494, + 490, + 466, + 493, + 509, + 476, + 492, + 483, + 442, + 512, + 475, + 502, + 521, + 467, + 469, + 458, + 476, + 467, + 474, + 517, + 485, + 502, + 507, + 473, + 488, + 464, + 483, + 469, + 537, + 464, + 509, + 498, + 489, + 471, + 479, + 520, + 525, + 490, + 454, + 519, + 475, + 472, + 475, + 517, + 513, + 502, + 493, + 485, + 524, + 488, + 511, + 483, + 496, + 502, + 462, + 485, + 505, + 469, + 526, + 484, + 523, + 482, + 477, + 470, + 485, + 469, + 480, + 509, + 485, + 486, + 524, + 510, + 503, + 457, + 464, + 492, + 473, + 480, + 503, + 493, + 517, + 491, + 471, + 480, + 530, + 457, + 469, + 494, + 500, + 489, + 506, + 462, + 455, + 494, + 472, + 481, + 481, + 527, + 523, + 440, + 502, + 447, + 469, + 479, + 515, + 495, + 522, + 494, + 513, + 537, + 507, + 501, + 506, + 438, + 501, + 486, + 441, + 498, + 486, + 498, + 498, + 513, + 521, + 502, + 474, + 519, + 477, + 521, + 492, + 505, + 488, + 485, + 519, + 457, + 492, + 470, + 484, + 473, + 499, + 516, + 479, + 506, + 476, + 455, + 472, + 476, + 471, + 490, + 482, + 517, + 463, + 466, + 485, + 502, + 486, + 472, + 469, + 502, + 537, + 452, + 528, + 485, + 497, + 472, + 530, + 485, + 458, + 477, + 547, + 519, + 485, + 466, + 463, + 534, + 512, + 491, + 483, + 502, + 512, + 478, + 482, + 496, + 476, + 483, + 487, + 484, + 473, + 526, + 485, + 440, + 498, + 507, + 499, + 493, + 480, + 471, + 494, + 496, + 477, + 490, + 465, + 451, + 508, + 469, + 427, + 500, + 484, + 493, + 493, + 478, + 468, + 508, + 539, + 508, + 481, + 517, + 485, + 469, + 475, + 494, + 508, + 473, + 481, + 502, + 481, + 470, + 493, + 485, + 471, + 505, + 495, + 487, + 461, + 520, + 500, + 469, + 488, + 489, + 495, + 480, + 479, + 461, + 452, + 487, + 501, + 490, + 474, + 488, + 490, + 517, + 506, + 496, + 510, + 542, + 482, + 474, + 490, + 492, + 475, + 496, + 479, + 485, + 503, + 511, + 474, + 504, + 482, + 518, + 517, + 483, + 479, + 493, + 445, + 477, + 497, + 491, + 505, + 488, + 458, + 511, + 517, + 498, + 490, + 467, + 528, + 466, + 481, + 487, + 484, + 503, + 459, + 474, + 503, + 476, + 494, + 453, + 482, + 512, + 490, + 467, + 509, + 475, + 469, + 463, + 494, + 447, + 478, + 507, + 520, + 497, + 502, + 564, + 456, + 466, + 513, + 507, + 498, + 526, + 464, + 496, + 495, + 486, + 462, + 469, + 506, + 494, + 500, + 506, + 457, + 515, + 497, + 471, + 491, + 483, + 476, + 520, + 479, + 473, + 493, + 481, + 447, + 502, + 541, + 444, + 467, + 459, + 497, + 502, + 490, + 465, + 502, + 463, + 480, + 473, + 457, + 470, + 487, + 529, + 494, + 467, + 495, + 488, + 479, + 484, + 533, + 485, + 458, + 490, + 502, + 473, + 493, + 473, + 480, + 494, + 514, + 503, + 470, + 454, + 496, + 500, + 506, + 461, + 498, + 489, + 484, + 458, + 474, + 472, + 488, + 481, + 517, + 511, + 485, + 518, + 499, + 485, + 478, + 498, + 502, + 483, + 468, + 463, + 455, + 499, + 491 + ] + }, + { + "counters": [ + 529, + 495, + 464, + 493, + 511, + 495, + 481, + 475, + 475, + 471, + 481, + 520, + 471, + 499, + 479, + 524, + 517, + 483, + 474, + 486, + 530, + 516, + 499, + 464, + 501, + 540, + 452, + 486, + 496, + 495, + 510, + 517, + 483, + 507, + 485, + 466, + 496, + 436, + 506, + 501, + 484, + 479, + 472, + 486, + 441, + 515, + 515, + 479, + 482, + 499, + 483, + 487, + 475, + 507, + 504, + 495, + 485, + 466, + 534, + 489, + 533, + 475, + 511, + 492, + 489, + 502, + 465, + 486, + 462, + 463, + 520, + 508, + 488, + 477, + 478, + 485, + 478, + 515, + 507, + 513, + 522, + 478, + 452, + 482, + 470, + 464, + 492, + 459, + 465, + 491, + 494, + 507, + 489, + 470, + 448, + 455, + 531, + 490, + 516, + 498, + 488, + 483, + 469, + 521, + 476, + 516, + 478, + 468, + 489, + 456, + 492, + 485, + 513, + 481, + 503, + 488, + 492, + 492, + 484, + 497, + 479, + 472, + 457, + 466, + 478, + 482, + 468, + 468, + 460, + 475, + 495, + 479, + 481, + 464, + 496, + 466, + 468, + 474, + 487, + 487, + 477, + 513, + 468, + 473, + 463, + 523, + 480, + 454, + 479, + 439, + 492, + 474, + 468, + 502, + 489, + 515, + 490, + 485, + 456, + 461, + 506, + 491, + 457, + 471, + 499, + 473, + 526, + 506, + 514, + 466, + 454, + 470, + 494, + 500, + 487, + 485, + 508, + 459, + 518, + 498, + 496, + 514, + 463, + 496, + 466, + 461, + 507, + 493, + 481, + 479, + 491, + 508, + 485, + 472, + 524, + 482, + 473, + 504, + 495, + 531, + 509, + 483, + 490, + 462, + 505, + 469, + 484, + 446, + 502, + 484, + 496, + 463, + 485, + 442, + 479, + 518, + 510, + 463, + 452, + 488, + 516, + 514, + 507, + 448, + 501, + 496, + 484, + 451, + 543, + 535, + 509, + 532, + 474, + 457, + 504, + 513, + 503, + 460, + 456, + 468, + 475, + 509, + 496, + 465, + 501, + 526, + 481, + 494, + 472, + 513, + 503, + 505, + 451, + 491, + 513, + 508, + 504, + 479, + 475, + 477, + 469, + 512, + 518, + 492, + 514, + 458, + 497, + 484, + 509, + 493, + 500, + 474, + 470, + 496, + 468, + 495, + 491, + 504, + 505, + 460, + 435, + 489, + 459, + 478, + 505, + 538, + 485, + 465, + 511, + 473, + 480, + 459, + 495, + 480, + 475, + 476, + 482, + 500, + 499, + 490, + 470, + 455, + 502, + 448, + 491, + 450, + 457, + 484, + 487, + 503, + 523, + 454, + 501, + 506, + 483, + 492, + 468, + 464, + 483, + 486, + 491, + 483, + 466, + 480, + 482, + 498, + 497, + 512, + 464, + 526, + 533, + 471, + 481, + 453, + 484, + 516, + 521, + 503, + 501, + 509, + 491, + 477, + 481, + 516, + 466, + 466, + 463, + 503, + 519, + 503, + 493, + 469, + 484, + 477, + 449, + 454, + 488, + 482, + 511, + 466, + 467, + 488, + 455, + 491, + 463, + 479, + 486, + 508, + 485, + 473, + 482, + 445, + 457, + 487, + 466, + 486, + 505, + 490, + 483, + 490, + 468, + 466, + 519, + 498, + 508, + 499, + 446, + 478, + 505, + 495, + 472, + 502, + 465, + 470, + 481, + 462, + 502, + 499, + 469, + 505, + 513, + 485, + 504, + 491, + 470, + 467, + 488, + 503, + 499, + 477, + 510, + 458, + 518, + 484, + 481, + 531, + 482, + 523, + 470, + 509, + 491, + 496, + 491, + 477, + 443, + 484, + 486, + 463, + 485, + 479, + 495, + 453, + 480, + 504, + 484, + 458, + 498, + 498, + 487, + 536, + 499, + 496, + 516, + 480, + 492, + 470, + 492, + 446, + 524, + 484, + 493, + 508, + 486, + 535, + 494, + 477, + 504, + 505, + 473, + 472, + 523, + 501, + 507, + 514, + 454, + 513, + 501, + 502, + 490, + 477, + 476, + 452, + 477, + 483, + 481, + 464, + 504, + 476, + 500, + 511, + 501, + 470, + 470, + 496, + 502, + 475, + 502, + 504, + 480, + 497, + 475, + 486, + 491, + 508, + 523, + 519, + 479, + 473, + 452, + 450, + 479, + 487, + 512, + 490, + 503, + 482, + 492, + 486, + 464, + 500, + 488, + 538, + 517, + 487, + 497, + 442, + 484, + 487, + 523, + 507, + 460, + 459, + 503, + 508, + 459, + 515, + 515, + 506, + 502, + 468, + 489, + 482, + 461, + 524, + 473, + 465, + 500, + 513, + 474, + 496, + 476, + 490, + 505, + 517, + 449, + 495, + 494, + 523, + 492, + 484, + 460, + 505, + 499, + 494, + 498, + 460, + 496, + 496, + 488, + 463, + 523, + 490, + 509, + 522, + 499, + 477, + 486, + 460, + 468, + 463, + 494, + 509, + 482, + 489, + 477, + 497, + 498, + 518, + 450, + 444, + 486, + 501, + 503, + 473, + 490, + 516, + 506, + 458, + 504, + 464, + 452, + 476, + 475, + 474, + 463, + 500, + 454, + 529, + 508, + 491, + 481, + 475, + 471, + 485, + 479, + 468, + 492, + 450, + 481, + 487, + 468, + 481, + 507, + 463, + 448, + 492, + 522, + 498, + 456, + 499, + 468, + 455, + 491, + 504, + 502, + 519, + 502, + 533, + 482, + 459, + 469, + 502, + 502, + 463, + 468, + 530, + 453, + 472, + 483, + 503, + 475, + 478, + 484, + 506, + 493, + 485, + 475, + 510, + 465, + 483, + 472, + 493, + 496, + 506, + 457, + 515, + 485, + 456, + 465, + 499, + 497, + 472, + 477, + 491, + 472, + 448, + 470, + 474, + 513, + 485, + 465, + 488, + 447, + 490, + 478, + 532, + 498, + 547, + 454, + 490, + 473, + 504, + 492, + 471, + 497, + 486, + 512, + 484, + 444, + 495, + 479, + 460, + 482, + 516, + 505, + 480, + 500, + 511, + 472, + 495, + 487, + 483, + 486, + 504, + 463, + 441, + 542, + 475, + 496, + 485, + 489, + 463, + 475, + 468, + 487, + 507, + 501, + 479, + 443, + 492, + 453, + 460, + 497, + 474, + 468, + 452, + 501, + 503, + 482, + 456, + 472, + 469, + 456, + 470, + 504, + 497, + 513, + 454, + 520, + 494, + 506, + 493, + 501, + 459, + 504, + 531, + 466, + 514, + 465, + 519, + 475, + 500, + 504, + 504, + 476, + 500, + 470, + 477, + 496, + 484, + 484, + 506, + 481, + 515, + 491, + 508, + 506, + 477, + 497, + 478, + 515, + 500, + 516, + 451, + 480, + 487, + 514, + 478, + 457, + 489, + 447, + 496, + 465, + 516, + 469, + 465, + 496, + 500, + 492, + 478, + 461, + 496, + 479, + 498, + 511, + 476, + 474, + 482, + 471, + 486, + 497, + 517, + 506, + 451, + 510, + 494, + 484, + 529, + 535, + 474, + 500, + 510, + 501, + 499, + 526, + 471, + 496, + 484, + 491, + 471, + 488, + 495, + 443, + 474, + 487, + 476, + 493, + 435, + 494, + 494, + 475, + 477, + 500, + 502, + 479, + 474, + 505, + 466, + 472, + 466, + 463, + 541, + 522, + 481, + 501, + 481, + 489, + 454, + 520, + 477, + 467, + 505, + 466, + 503, + 480, + 538, + 490, + 481, + 509, + 479, + 493, + 512, + 473, + 481, + 467, + 468, + 476, + 489, + 489, + 488, + 483, + 475, + 512, + 488, + 512, + 479, + 459, + 475, + 457, + 538, + 483, + 455, + 498, + 471, + 486, + 468, + 504, + 450, + 514, + 485, + 460, + 510, + 532, + 467, + 467, + 496, + 478, + 475, + 443, + 456, + 488, + 509, + 463, + 508, + 490, + 488, + 469, + 514, + 495, + 470, + 512, + 428, + 495, + 483, + 484, + 509, + 532, + 499, + 491, + 515, + 472, + 504, + 508, + 478, + 523, + 539, + 481, + 478, + 515, + 505, + 460, + 500, + 470, + 507, + 483, + 438, + 479, + 510, + 475, + 481, + 522, + 471, + 508, + 560, + 496, + 457, + 453, + 483, + 484, + 466, + 493, + 519, + 457, + 478, + 486, + 489, + 503, + 494, + 484, + 483, + 497, + 532, + 475, + 499, + 474, + 481, + 487, + 432, + 495, + 480, + 503, + 505, + 515, + 466, + 479, + 463, + 498, + 502, + 451, + 503, + 482, + 484, + 499, + 503, + 462, + 483, + 510, + 537, + 480, + 468, + 508, + 490, + 514, + 451, + 507, + 517, + 517, + 478, + 461, + 436, + 502, + 511, + 503, + 475, + 513, + 485, + 462, + 489, + 476, + 500, + 496, + 497, + 470, + 501, + 492, + 455, + 465, + 528, + 468, + 519, + 463, + 516, + 501, + 476, + 491, + 444, + 480, + 499, + 491, + 472, + 510, + 484, + 497, + 494, + 479, + 519, + 505, + 527, + 506, + 488, + 494, + 499, + 514, + 468, + 476, + 477, + 513, + 496, + 471, + 532, + 486, + 469, + 488, + 527, + 489, + 473, + 475, + 504, + 485, + 520, + 479, + 472, + 508, + 475, + 493, + 498, + 464, + 446, + 471, + 463, + 471, + 500, + 491, + 490, + 543, + 500, + 513, + 521, + 473, + 481, + 467, + 425, + 461, + 476, + 455, + 472, + 510, + 489, + 469, + 510, + 499, + 489, + 469, + 495, + 488, + 514, + 467, + 525, + 497, + 512, + 517, + 500, + 479, + 461, + 479, + 517, + 522, + 491, + 478, + 508, + 498, + 458, + 504, + 480, + 460, + 481, + 527, + 528, + 484, + 474, + 481, + 462, + 462, + 483, + 497, + 486, + 494, + 535, + 466, + 441, + 495, + 489, + 469, + 497, + 510, + 519, + 475, + 483, + 503, + 473, + 509, + 511, + 487, + 464, + 495, + 468, + 501, + 498, + 509, + 502, + 480, + 488, + 511, + 451, + 483, + 518, + 484, + 530, + 488, + 543, + 487, + 476, + 474, + 479, + 519, + 514, + 500, + 493, + 506, + 469, + 457, + 514, + 469, + 475, + 476, + 490, + 505, + 472, + 511, + 499, + 469, + 482, + 456, + 510, + 475, + 483, + 500, + 453, + 504, + 483, + 498, + 457, + 481, + 507, + 493, + 459, + 480, + 463, + 479, + 475, + 454, + 517, + 484, + 473, + 464, + 460, + 505, + 515, + 483, + 520, + 504, + 466, + 497, + 491, + 490, + 500, + 500, + 487, + 493, + 467, + 501, + 463, + 501, + 450, + 457, + 503, + 486, + 468, + 483, + 482, + 494, + 497, + 468, + 483, + 447, + 454, + 457, + 474, + 461, + 473, + 500, + 463, + 496, + 510, + 475, + 506, + 475, + 468, + 488, + 504, + 475, + 479, + 462, + 505, + 509, + 530, + 527, + 477, + 492, + 445, + 500, + 469, + 465, + 526, + 505, + 486, + 496, + 497, + 462, + 516, + 509, + 479, + 523, + 473, + 502, + 456, + 496, + 488, + 459, + 453, + 472, + 466, + 439, + 526, + 484, + 482, + 533, + 496, + 480, + 494, + 459, + 503, + 477, + 475, + 504, + 499, + 458, + 496, + 502, + 494, + 465, + 479, + 522, + 448, + 472, + 509, + 465, + 524, + 497, + 490, + 482, + 539, + 467, + 483, + 510, + 498, + 486, + 504, + 522, + 481, + 487, + 448, + 444, + 514, + 498, + 459, + 484, + 511, + 519, + 475, + 501, + 492, + 518, + 476, + 493, + 501, + 498, + 480, + 501, + 489, + 483, + 498, + 527, + 464, + 535, + 551, + 486, + 460, + 501, + 501, + 478, + 503, + 479, + 511, + 418, + 504, + 508, + 474, + 476, + 443, + 464, + 490, + 498, + 476, + 466, + 498, + 449, + 504, + 494, + 484, + 455, + 470, + 496, + 519, + 490, + 510, + 516, + 473, + 487, + 504, + 496, + 475, + 486, + 499, + 458, + 505, + 526, + 470, + 494, + 538, + 505, + 468, + 497, + 488, + 515, + 508, + 493, + 471, + 467, + 484, + 468, + 516, + 518, + 469, + 497, + 521, + 472, + 523, + 495, + 494, + 487, + 502, + 496, + 489, + 493, + 453, + 510, + 495, + 468, + 492, + 477, + 509, + 511, + 449, + 508, + 490, + 476, + 473, + 464, + 495, + 516, + 475, + 550, + 470, + 445, + 481, + 504, + 468, + 513, + 474, + 485, + 495, + 499, + 504, + 505, + 472, + 474, + 510, + 482, + 453, + 547, + 484, + 473, + 505, + 496, + 495, + 517, + 504, + 480, + 506, + 543, + 476, + 515, + 470, + 493, + 472, + 465, + 527, + 510, + 508, + 453, + 466, + 492, + 463, + 503, + 494, + 447, + 468, + 538, + 479, + 464, + 500, + 505, + 474, + 496, + 479, + 470, + 507, + 480, + 492, + 494, + 482, + 471, + 492, + 456, + 502, + 480, + 493, + 453, + 475, + 466, + 510, + 512, + 480, + 469, + 524, + 508, + 487, + 472, + 476, + 479, + 531, + 462, + 509, + 434, + 478, + 489, + 489, + 527, + 441, + 536, + 497, + 508, + 494, + 502, + 459, + 443, + 513, + 503, + 470, + 511, + 453, + 495, + 517, + 543, + 455, + 509, + 431, + 523, + 476, + 538, + 488, + 481, + 487, + 505, + 527, + 458, + 494, + 511, + 424, + 511, + 506, + 482, + 467, + 481, + 538, + 457, + 487, + 520, + 479, + 508, + 491, + 472, + 499, + 518, + 460, + 486, + 494, + 505, + 505, + 489, + 520, + 473, + 487, + 488, + 448, + 499, + 498, + 493, + 491, + 450, + 507, + 521, + 500, + 442, + 476, + 497, + 483, + 467, + 490, + 538, + 479, + 448, + 509, + 469, + 533, + 473, + 447, + 501, + 503, + 484, + 475, + 504, + 455, + 519, + 466, + 497, + 470, + 497, + 490, + 501, + 510, + 479, + 504, + 487, + 498, + 490, + 474, + 464, + 484, + 470, + 536, + 486, + 469, + 496, + 511, + 490, + 492, + 539, + 496, + 519, + 455, + 476, + 463, + 432, + 491, + 523, + 495, + 463, + 516, + 514, + 518, + 500, + 485, + 501, + 515, + 492, + 508, + 453, + 507, + 449, + 473, + 492, + 506, + 494, + 529, + 502, + 499, + 525, + 488, + 495, + 486, + 527, + 492, + 501, + 512, + 456, + 462, + 468, + 492, + 480, + 499, + 460, + 448, + 500, + 491, + 485, + 470, + 455, + 443, + 481, + 480, + 488, + 485, + 476, + 463, + 514, + 483, + 515, + 464, + 460, + 465, + 476, + 447, + 475, + 521, + 500, + 458, + 495, + 468, + 495, + 487, + 517, + 473, + 479, + 501, + 498, + 491, + 519, + 496, + 508, + 478, + 496, + 516, + 489, + 486, + 491, + 487, + 494, + 461, + 487, + 496, + 488, + 510, + 479, + 479, + 499, + 476, + 482, + 500, + 522, + 488, + 476, + 493, + 504, + 517, + 509, + 505, + 472, + 511, + 452, + 477, + 469, + 493, + 542, + 472, + 498, + 475, + 509, + 499, + 486, + 484, + 516, + 524, + 477, + 490, + 550, + 511, + 452, + 493, + 532, + 489, + 463, + 496, + 467, + 439, + 486, + 497, + 476, + 493, + 498, + 521, + 475, + 521, + 423, + 469, + 515, + 484, + 492, + 496, + 459, + 444, + 473, + 463, + 494, + 453, + 469, + 510, + 473, + 457, + 492, + 533, + 548, + 485, + 466, + 496, + 485, + 466, + 510, + 454, + 475, + 512, + 491, + 510, + 495, + 495, + 490, + 488, + 417, + 479, + 471, + 502, + 479, + 488, + 501, + 497, + 493, + 468, + 502, + 479, + 497, + 512, + 455, + 457, + 504, + 474, + 495, + 517, + 476, + 492, + 475, + 490, + 502, + 467, + 493, + 540, + 512, + 470, + 490, + 517, + 515, + 463, + 480, + 500, + 495, + 438, + 468, + 488, + 478, + 504, + 468, + 499, + 468, + 514, + 484, + 512, + 519, + 490, + 476, + 483, + 513, + 483, + 491, + 505, + 493, + 493, + 493, + 465, + 497, + 477, + 497, + 468, + 448, + 496, + 483, + 480, + 482, + 495, + 483, + 506, + 518, + 486, + 501, + 482, + 442, + 489, + 516, + 487, + 458, + 496, + 527, + 467, + 454, + 485, + 489, + 496, + 469, + 468, + 523, + 470, + 480, + 477, + 471, + 506, + 480, + 522, + 499, + 479, + 483, + 537, + 466, + 485, + 490, + 534, + 468, + 500, + 514, + 494, + 489, + 480, + 511, + 509, + 488, + 544, + 492, + 478, + 536, + 447, + 465, + 490, + 457, + 501, + 501, + 533, + 498, + 486, + 456, + 491, + 487, + 477, + 494, + 501, + 492, + 472, + 459, + 491, + 490, + 461, + 499, + 485, + 489, + 476, + 477, + 503, + 476, + 483, + 470, + 496, + 450, + 467, + 472, + 500, + 488, + 482, + 471, + 490, + 494, + 482, + 486, + 551, + 502, + 510, + 496, + 495, + 524, + 521, + 504, + 483, + 488, + 487, + 489, + 506, + 525, + 469, + 495, + 473, + 462, + 495, + 472, + 507, + 480, + 507, + 517, + 509, + 503, + 504, + 478, + 541, + 471, + 517, + 520, + 516, + 506, + 515, + 479, + 496, + 473, + 469, + 459, + 488, + 487, + 463, + 493, + 492, + 484, + 487, + 462, + 475, + 493, + 541, + 492, + 480, + 492, + 522, + 522, + 463, + 490, + 485, + 540, + 482, + 500, + 520, + 468, + 529, + 478, + 522, + 527, + 465, + 430, + 501, + 485, + 474, + 517, + 509, + 491, + 484, + 468, + 505 + ] + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 417600050861703168, + "correlation": 0 + }, + "idx_b": { + "histogram": { + "ndv": 1000000, + "buckets": [ + { + "count": 8192, + "lower_bound": "A4AAAAAAAAAB", + "upper_bound": "A4AAAAAAACAA", + "repeats": 1 + }, + { + "count": 16384, + "lower_bound": "A4AAAAAAACAB", + "upper_bound": "A4AAAAAAAEAA", + "repeats": 1 + }, + { + "count": 24576, + "lower_bound": "A4AAAAAAAEAB", + "upper_bound": "A4AAAAAAAGAA", + "repeats": 1 + }, + { + "count": 32768, + "lower_bound": "A4AAAAAAAGAB", + "upper_bound": "A4AAAAAAAIAA", + "repeats": 1 + }, + { + "count": 40960, + "lower_bound": "A4AAAAAAAIAB", + "upper_bound": "A4AAAAAAAKAA", + "repeats": 1 + }, + { + "count": 49152, + "lower_bound": "A4AAAAAAAKAB", + "upper_bound": "A4AAAAAAAMAA", + "repeats": 1 + }, + { + "count": 57344, + "lower_bound": "A4AAAAAAAMAB", + "upper_bound": "A4AAAAAAAOAA", + "repeats": 1 + }, + { + "count": 65536, + "lower_bound": "A4AAAAAAAOAB", + "upper_bound": "A4AAAAAAAQAA", + "repeats": 1 + }, + { + "count": 73728, + "lower_bound": "A4AAAAAAAQAB", + "upper_bound": "A4AAAAAAASAA", + "repeats": 1 + }, + { + "count": 81920, + "lower_bound": "A4AAAAAAASAB", + "upper_bound": "A4AAAAAAAUAA", + "repeats": 1 + }, + { + "count": 90112, + "lower_bound": "A4AAAAAAAUAB", + "upper_bound": "A4AAAAAAAWAA", + "repeats": 1 + }, + { + "count": 98304, + "lower_bound": "A4AAAAAAAWAB", + "upper_bound": "A4AAAAAAAYAA", + "repeats": 1 + }, + { + "count": 106496, + "lower_bound": "A4AAAAAAAYAB", + "upper_bound": "A4AAAAAAAaAA", + "repeats": 1 + }, + { + "count": 114688, + "lower_bound": "A4AAAAAAAaAB", + "upper_bound": "A4AAAAAAAcAA", + "repeats": 1 + }, + { + "count": 122880, + "lower_bound": "A4AAAAAAAcAB", + "upper_bound": "A4AAAAAAAeAA", + "repeats": 1 + }, + { + "count": 131072, + "lower_bound": "A4AAAAAAAeAB", + "upper_bound": "A4AAAAAAAgAA", + "repeats": 1 + }, + { + "count": 139264, + "lower_bound": "A4AAAAAAAgAB", + "upper_bound": "A4AAAAAAAiAA", + "repeats": 1 + }, + { + "count": 147456, + "lower_bound": "A4AAAAAAAiAB", + "upper_bound": "A4AAAAAAAkAA", + "repeats": 1 + }, + { + "count": 155648, + "lower_bound": "A4AAAAAAAkAB", + "upper_bound": "A4AAAAAAAmAA", + "repeats": 1 + }, + { + "count": 163840, + "lower_bound": "A4AAAAAAAmAB", + "upper_bound": "A4AAAAAAAoAA", + "repeats": 1 + }, + { + "count": 172032, + "lower_bound": "A4AAAAAAAoAB", + "upper_bound": "A4AAAAAAAqAA", + "repeats": 1 + }, + { + "count": 180224, + "lower_bound": "A4AAAAAAAqAB", + "upper_bound": "A4AAAAAAAsAA", + "repeats": 1 + }, + { + "count": 188416, + "lower_bound": "A4AAAAAAAsAB", + "upper_bound": "A4AAAAAAAuAA", + "repeats": 1 + }, + { + "count": 196608, + "lower_bound": "A4AAAAAAAuAB", + "upper_bound": "A4AAAAAAAwAA", + "repeats": 1 + }, + { + "count": 204800, + "lower_bound": "A4AAAAAAAwAB", + "upper_bound": "A4AAAAAAAyAA", + "repeats": 1 + }, + { + "count": 212992, + "lower_bound": "A4AAAAAAAyAB", + "upper_bound": "A4AAAAAAA0AA", + "repeats": 1 + }, + { + "count": 221184, + "lower_bound": "A4AAAAAAA0AB", + "upper_bound": "A4AAAAAAA2AA", + "repeats": 1 + }, + { + "count": 229376, + "lower_bound": "A4AAAAAAA2AB", + "upper_bound": "A4AAAAAAA4AA", + "repeats": 1 + }, + { + "count": 237568, + "lower_bound": "A4AAAAAAA4AB", + "upper_bound": "A4AAAAAAA6AA", + "repeats": 1 + }, + { + "count": 245760, + "lower_bound": "A4AAAAAAA6AB", + "upper_bound": "A4AAAAAAA8AA", + "repeats": 1 + }, + { + "count": 253952, + "lower_bound": "A4AAAAAAA8AB", + "upper_bound": "A4AAAAAAA+AA", + "repeats": 1 + }, + { + "count": 262144, + "lower_bound": "A4AAAAAAA+AB", + "upper_bound": "A4AAAAAABAAA", + "repeats": 1 + }, + { + "count": 270336, + "lower_bound": "A4AAAAAABAAB", + "upper_bound": "A4AAAAAABCAA", + "repeats": 1 + }, + { + "count": 278528, + "lower_bound": "A4AAAAAABCAB", + "upper_bound": "A4AAAAAABEAA", + "repeats": 1 + }, + { + "count": 286720, + "lower_bound": "A4AAAAAABEAB", + "upper_bound": "A4AAAAAABGAA", + "repeats": 1 + }, + { + "count": 294912, + "lower_bound": "A4AAAAAABGAB", + "upper_bound": "A4AAAAAABIAA", + "repeats": 1 + }, + { + "count": 303104, + "lower_bound": "A4AAAAAABIAB", + "upper_bound": "A4AAAAAABKAA", + "repeats": 1 + }, + { + "count": 311296, + "lower_bound": "A4AAAAAABKAB", + "upper_bound": "A4AAAAAABMAA", + "repeats": 1 + }, + { + "count": 319488, + "lower_bound": "A4AAAAAABMAB", + "upper_bound": "A4AAAAAABOAA", + "repeats": 1 + }, + { + "count": 327680, + "lower_bound": "A4AAAAAABOAB", + "upper_bound": "A4AAAAAABQAA", + "repeats": 1 + }, + { + "count": 335872, + "lower_bound": "A4AAAAAABQAB", + "upper_bound": "A4AAAAAABSAA", + "repeats": 1 + }, + { + "count": 344064, + "lower_bound": "A4AAAAAABSAB", + "upper_bound": "A4AAAAAABUAA", + "repeats": 1 + }, + { + "count": 352256, + "lower_bound": "A4AAAAAABUAB", + "upper_bound": "A4AAAAAABWAA", + "repeats": 1 + }, + { + "count": 360448, + "lower_bound": "A4AAAAAABWAB", + "upper_bound": "A4AAAAAABYAA", + "repeats": 1 + }, + { + "count": 368640, + "lower_bound": "A4AAAAAABYAB", + "upper_bound": "A4AAAAAABaAA", + "repeats": 1 + }, + { + "count": 376832, + "lower_bound": "A4AAAAAABaAB", + "upper_bound": "A4AAAAAABcAA", + "repeats": 1 + }, + { + "count": 385024, + "lower_bound": "A4AAAAAABcAB", + "upper_bound": "A4AAAAAABeAA", + "repeats": 1 + }, + { + "count": 393216, + "lower_bound": "A4AAAAAABeAB", + "upper_bound": "A4AAAAAABgAA", + "repeats": 1 + }, + { + "count": 401408, + "lower_bound": "A4AAAAAABgAB", + "upper_bound": "A4AAAAAABiAA", + "repeats": 1 + }, + { + "count": 409600, + "lower_bound": "A4AAAAAABiAB", + "upper_bound": "A4AAAAAABkAA", + "repeats": 1 + }, + { + "count": 417792, + "lower_bound": "A4AAAAAABkAB", + "upper_bound": "A4AAAAAABmAA", + "repeats": 1 + }, + { + "count": 425984, + "lower_bound": "A4AAAAAABmAB", + "upper_bound": "A4AAAAAABoAA", + "repeats": 1 + }, + { + "count": 434176, + "lower_bound": "A4AAAAAABoAB", + "upper_bound": "A4AAAAAABqAA", + "repeats": 1 + }, + { + "count": 442368, + "lower_bound": "A4AAAAAABqAB", + "upper_bound": "A4AAAAAABsAA", + "repeats": 1 + }, + { + "count": 450560, + "lower_bound": "A4AAAAAABsAB", + "upper_bound": "A4AAAAAABuAA", + "repeats": 1 + }, + { + "count": 458752, + "lower_bound": "A4AAAAAABuAB", + "upper_bound": "A4AAAAAABwAA", + "repeats": 1 + }, + { + "count": 466944, + "lower_bound": "A4AAAAAABwAB", + "upper_bound": "A4AAAAAAByAA", + "repeats": 1 + }, + { + "count": 475136, + "lower_bound": "A4AAAAAAByAB", + "upper_bound": "A4AAAAAAB0AA", + "repeats": 1 + }, + { + "count": 483328, + "lower_bound": "A4AAAAAAB0AB", + "upper_bound": "A4AAAAAAB2AA", + "repeats": 1 + }, + { + "count": 491520, + "lower_bound": "A4AAAAAAB2AB", + "upper_bound": "A4AAAAAAB4AA", + "repeats": 1 + }, + { + "count": 499712, + "lower_bound": "A4AAAAAAB4AB", + "upper_bound": "A4AAAAAAB6AA", + "repeats": 1 + }, + { + "count": 507904, + "lower_bound": "A4AAAAAAB6AB", + "upper_bound": "A4AAAAAAB8AA", + "repeats": 1 + }, + { + "count": 516096, + "lower_bound": "A4AAAAAAB8AB", + "upper_bound": "A4AAAAAAB+AA", + "repeats": 1 + }, + { + "count": 524288, + "lower_bound": "A4AAAAAAB+AB", + "upper_bound": "A4AAAAAACAAA", + "repeats": 1 + }, + { + "count": 532480, + "lower_bound": "A4AAAAAACAAB", + "upper_bound": "A4AAAAAACCAA", + "repeats": 1 + }, + { + "count": 540672, + "lower_bound": "A4AAAAAACCAB", + "upper_bound": "A4AAAAAACEAA", + "repeats": 1 + }, + { + "count": 548864, + "lower_bound": "A4AAAAAACEAB", + "upper_bound": "A4AAAAAACGAA", + "repeats": 1 + }, + { + "count": 557056, + "lower_bound": "A4AAAAAACGAB", + "upper_bound": "A4AAAAAACIAA", + "repeats": 1 + }, + { + "count": 565248, + "lower_bound": "A4AAAAAACIAB", + "upper_bound": "A4AAAAAACKAA", + "repeats": 1 + }, + { + "count": 573440, + "lower_bound": "A4AAAAAACKAB", + "upper_bound": "A4AAAAAACMAA", + "repeats": 1 + }, + { + "count": 581632, + "lower_bound": "A4AAAAAACMAB", + "upper_bound": "A4AAAAAACOAA", + "repeats": 1 + }, + { + "count": 589824, + "lower_bound": "A4AAAAAACOAB", + "upper_bound": "A4AAAAAACQAA", + "repeats": 1 + }, + { + "count": 598016, + "lower_bound": "A4AAAAAACQAB", + "upper_bound": "A4AAAAAACSAA", + "repeats": 1 + }, + { + "count": 606208, + "lower_bound": "A4AAAAAACSAB", + "upper_bound": "A4AAAAAACUAA", + "repeats": 1 + }, + { + "count": 614400, + "lower_bound": "A4AAAAAACUAB", + "upper_bound": "A4AAAAAACWAA", + "repeats": 1 + }, + { + "count": 622592, + "lower_bound": "A4AAAAAACWAB", + "upper_bound": "A4AAAAAACYAA", + "repeats": 1 + }, + { + "count": 630784, + "lower_bound": "A4AAAAAACYAB", + "upper_bound": "A4AAAAAACaAA", + "repeats": 1 + }, + { + "count": 638976, + "lower_bound": "A4AAAAAACaAB", + "upper_bound": "A4AAAAAACcAA", + "repeats": 1 + }, + { + "count": 647168, + "lower_bound": "A4AAAAAACcAB", + "upper_bound": "A4AAAAAACeAA", + "repeats": 1 + }, + { + "count": 655360, + "lower_bound": "A4AAAAAACeAB", + "upper_bound": "A4AAAAAACgAA", + "repeats": 1 + }, + { + "count": 663552, + "lower_bound": "A4AAAAAACgAB", + "upper_bound": "A4AAAAAACiAA", + "repeats": 1 + }, + { + "count": 671744, + "lower_bound": "A4AAAAAACiAB", + "upper_bound": "A4AAAAAACkAA", + "repeats": 1 + }, + { + "count": 679936, + "lower_bound": "A4AAAAAACkAB", + "upper_bound": "A4AAAAAACmAA", + "repeats": 1 + }, + { + "count": 688128, + "lower_bound": "A4AAAAAACmAB", + "upper_bound": "A4AAAAAACoAA", + "repeats": 1 + }, + { + "count": 696320, + "lower_bound": "A4AAAAAACoAB", + "upper_bound": "A4AAAAAACqAA", + "repeats": 1 + }, + { + "count": 704512, + "lower_bound": "A4AAAAAACqAB", + "upper_bound": "A4AAAAAACsAA", + "repeats": 1 + }, + { + "count": 712704, + "lower_bound": "A4AAAAAACsAB", + "upper_bound": "A4AAAAAACuAA", + "repeats": 1 + }, + { + "count": 720896, + "lower_bound": "A4AAAAAACuAB", + "upper_bound": "A4AAAAAACwAA", + "repeats": 1 + }, + { + "count": 729088, + "lower_bound": "A4AAAAAACwAB", + "upper_bound": "A4AAAAAACyAA", + "repeats": 1 + }, + { + "count": 737280, + "lower_bound": "A4AAAAAACyAB", + "upper_bound": "A4AAAAAAC0AA", + "repeats": 1 + }, + { + "count": 745472, + "lower_bound": "A4AAAAAAC0AB", + "upper_bound": "A4AAAAAAC2AA", + "repeats": 1 + }, + { + "count": 753664, + "lower_bound": "A4AAAAAAC2AB", + "upper_bound": "A4AAAAAAC4AA", + "repeats": 1 + }, + { + "count": 761856, + "lower_bound": "A4AAAAAAC4AB", + "upper_bound": "A4AAAAAAC6AA", + "repeats": 1 + }, + { + "count": 766022, + "lower_bound": "A4AAAAAAC6AB", + "upper_bound": "A4AAAAAAC7BG", + "repeats": 1 + }, + { + "count": 768071, + "lower_bound": "A4AAAAAAC7BH", + "upper_bound": "A4AAAAAAC7hH", + "repeats": 1 + }, + { + "count": 772167, + "lower_bound": "A4AAAAAAC7hI", + "upper_bound": "A4AAAAAAC8hH", + "repeats": 1 + }, + { + "count": 776263, + "lower_bound": "A4AAAAAAC8hI", + "upper_bound": "A4AAAAAAC9hH", + "repeats": 1 + }, + { + "count": 780359, + "lower_bound": "A4AAAAAAC9hI", + "upper_bound": "A4AAAAAAC+hH", + "repeats": 1 + }, + { + "count": 784455, + "lower_bound": "A4AAAAAAC+hI", + "upper_bound": "A4AAAAAAC/hH", + "repeats": 1 + }, + { + "count": 788551, + "lower_bound": "A4AAAAAAC/hI", + "upper_bound": "A4AAAAAADAhH", + "repeats": 1 + }, + { + "count": 792647, + "lower_bound": "A4AAAAAADAhI", + "upper_bound": "A4AAAAAADBhH", + "repeats": 1 + }, + { + "count": 796743, + "lower_bound": "A4AAAAAADBhI", + "upper_bound": "A4AAAAAADChH", + "repeats": 1 + }, + { + "count": 800839, + "lower_bound": "A4AAAAAADChI", + "upper_bound": "A4AAAAAADDhH", + "repeats": 1 + }, + { + "count": 804935, + "lower_bound": "A4AAAAAADDhI", + "upper_bound": "A4AAAAAADEhH", + "repeats": 1 + }, + { + "count": 809031, + "lower_bound": "A4AAAAAADEhI", + "upper_bound": "A4AAAAAADFhH", + "repeats": 1 + }, + { + "count": 813127, + "lower_bound": "A4AAAAAADFhI", + "upper_bound": "A4AAAAAADGhH", + "repeats": 1 + }, + { + "count": 817223, + "lower_bound": "A4AAAAAADGhI", + "upper_bound": "A4AAAAAADHhH", + "repeats": 1 + }, + { + "count": 821319, + "lower_bound": "A4AAAAAADHhI", + "upper_bound": "A4AAAAAADIhH", + "repeats": 1 + }, + { + "count": 825415, + "lower_bound": "A4AAAAAADIhI", + "upper_bound": "A4AAAAAADJhH", + "repeats": 1 + }, + { + "count": 829511, + "lower_bound": "A4AAAAAADJhI", + "upper_bound": "A4AAAAAADKhH", + "repeats": 1 + }, + { + "count": 833607, + "lower_bound": "A4AAAAAADKhI", + "upper_bound": "A4AAAAAADLhH", + "repeats": 1 + }, + { + "count": 837703, + "lower_bound": "A4AAAAAADLhI", + "upper_bound": "A4AAAAAADMhH", + "repeats": 1 + }, + { + "count": 841799, + "lower_bound": "A4AAAAAADMhI", + "upper_bound": "A4AAAAAADNhH", + "repeats": 1 + }, + { + "count": 845895, + "lower_bound": "A4AAAAAADNhI", + "upper_bound": "A4AAAAAADOhH", + "repeats": 1 + }, + { + "count": 849991, + "lower_bound": "A4AAAAAADOhI", + "upper_bound": "A4AAAAAADPhH", + "repeats": 1 + }, + { + "count": 854087, + "lower_bound": "A4AAAAAADPhI", + "upper_bound": "A4AAAAAADQhH", + "repeats": 1 + }, + { + "count": 858183, + "lower_bound": "A4AAAAAADQhI", + "upper_bound": "A4AAAAAADRhH", + "repeats": 1 + }, + { + "count": 862279, + "lower_bound": "A4AAAAAADRhI", + "upper_bound": "A4AAAAAADShH", + "repeats": 1 + }, + { + "count": 866375, + "lower_bound": "A4AAAAAADShI", + "upper_bound": "A4AAAAAADThH", + "repeats": 1 + }, + { + "count": 870471, + "lower_bound": "A4AAAAAADThI", + "upper_bound": "A4AAAAAADUhH", + "repeats": 1 + }, + { + "count": 874567, + "lower_bound": "A4AAAAAADUhI", + "upper_bound": "A4AAAAAADVhH", + "repeats": 1 + }, + { + "count": 878663, + "lower_bound": "A4AAAAAADVhI", + "upper_bound": "A4AAAAAADWhH", + "repeats": 1 + }, + { + "count": 882759, + "lower_bound": "A4AAAAAADWhI", + "upper_bound": "A4AAAAAADXhH", + "repeats": 1 + }, + { + "count": 886855, + "lower_bound": "A4AAAAAADXhI", + "upper_bound": "A4AAAAAADYhH", + "repeats": 1 + }, + { + "count": 890951, + "lower_bound": "A4AAAAAADYhI", + "upper_bound": "A4AAAAAADZhH", + "repeats": 1 + }, + { + "count": 895047, + "lower_bound": "A4AAAAAADZhI", + "upper_bound": "A4AAAAAADahH", + "repeats": 1 + }, + { + "count": 899143, + "lower_bound": "A4AAAAAADahI", + "upper_bound": "A4AAAAAADbhH", + "repeats": 1 + }, + { + "count": 903239, + "lower_bound": "A4AAAAAADbhI", + "upper_bound": "A4AAAAAADchH", + "repeats": 1 + }, + { + "count": 907335, + "lower_bound": "A4AAAAAADchI", + "upper_bound": "A4AAAAAADdhH", + "repeats": 1 + }, + { + "count": 911431, + "lower_bound": "A4AAAAAADdhI", + "upper_bound": "A4AAAAAADehH", + "repeats": 1 + }, + { + "count": 915527, + "lower_bound": "A4AAAAAADehI", + "upper_bound": "A4AAAAAADfhH", + "repeats": 1 + }, + { + "count": 919623, + "lower_bound": "A4AAAAAADfhI", + "upper_bound": "A4AAAAAADghH", + "repeats": 1 + }, + { + "count": 923719, + "lower_bound": "A4AAAAAADghI", + "upper_bound": "A4AAAAAADhhH", + "repeats": 1 + }, + { + "count": 927815, + "lower_bound": "A4AAAAAADhhI", + "upper_bound": "A4AAAAAADihH", + "repeats": 1 + }, + { + "count": 931911, + "lower_bound": "A4AAAAAADihI", + "upper_bound": "A4AAAAAADjhH", + "repeats": 1 + }, + { + "count": 936007, + "lower_bound": "A4AAAAAADjhI", + "upper_bound": "A4AAAAAADkhH", + "repeats": 1 + }, + { + "count": 940103, + "lower_bound": "A4AAAAAADkhI", + "upper_bound": "A4AAAAAADlhH", + "repeats": 1 + }, + { + "count": 944199, + "lower_bound": "A4AAAAAADlhI", + "upper_bound": "A4AAAAAADmhH", + "repeats": 1 + }, + { + "count": 948295, + "lower_bound": "A4AAAAAADmhI", + "upper_bound": "A4AAAAAADnhH", + "repeats": 1 + }, + { + "count": 952391, + "lower_bound": "A4AAAAAADnhI", + "upper_bound": "A4AAAAAADohH", + "repeats": 1 + }, + { + "count": 956487, + "lower_bound": "A4AAAAAADohI", + "upper_bound": "A4AAAAAADphH", + "repeats": 1 + }, + { + "count": 960583, + "lower_bound": "A4AAAAAADphI", + "upper_bound": "A4AAAAAADqhH", + "repeats": 1 + }, + { + "count": 964679, + "lower_bound": "A4AAAAAADqhI", + "upper_bound": "A4AAAAAADrhH", + "repeats": 1 + }, + { + "count": 968775, + "lower_bound": "A4AAAAAADrhI", + "upper_bound": "A4AAAAAADshH", + "repeats": 1 + }, + { + "count": 972871, + "lower_bound": "A4AAAAAADshI", + "upper_bound": "A4AAAAAADthH", + "repeats": 1 + }, + { + "count": 976967, + "lower_bound": "A4AAAAAADthI", + "upper_bound": "A4AAAAAADuhH", + "repeats": 1 + }, + { + "count": 981063, + "lower_bound": "A4AAAAAADuhI", + "upper_bound": "A4AAAAAADvhH", + "repeats": 1 + }, + { + "count": 985159, + "lower_bound": "A4AAAAAADvhI", + "upper_bound": "A4AAAAAADwhH", + "repeats": 1 + }, + { + "count": 989255, + "lower_bound": "A4AAAAAADwhI", + "upper_bound": "A4AAAAAADxhH", + "repeats": 1 + }, + { + "count": 993351, + "lower_bound": "A4AAAAAADxhI", + "upper_bound": "A4AAAAAADyhH", + "repeats": 1 + }, + { + "count": 997447, + "lower_bound": "A4AAAAAADyhI", + "upper_bound": "A4AAAAAADzhH", + "repeats": 1 + }, + { + "count": 1000000, + "lower_bound": "A4AAAAAADzhI", + "upper_bound": "A4AAAAAAD0JA", + "repeats": 1 + } + ] + }, + "cm_sketch": { + "rows": [ + { + "counters": [ + 513, + 507, + 485, + 476, + 515, + 490, + 516, + 480, + 481, + 477, + 533, + 481, + 467, + 489, + 504, + 484, + 514, + 477, + 475, + 511, + 529, + 469, + 474, + 486, + 478, + 497, + 503, + 547, + 466, + 470, + 504, + 468, + 511, + 476, + 501, + 478, + 520, + 454, + 521, + 467, + 508, + 449, + 467, + 460, + 466, + 464, + 511, + 455, + 492, + 535, + 478, + 478, + 473, + 519, + 492, + 484, + 480, + 495, + 496, + 502, + 498, + 439, + 457, + 535, + 506, + 536, + 501, + 492, + 484, + 450, + 498, + 467, + 491, + 484, + 465, + 503, + 489, + 477, + 514, + 491, + 517, + 459, + 467, + 463, + 499, + 466, + 488, + 525, + 486, + 520, + 528, + 490, + 478, + 482, + 476, + 456, + 477, + 522, + 519, + 483, + 441, + 516, + 455, + 481, + 474, + 469, + 480, + 487, + 508, + 514, + 515, + 452, + 453, + 484, + 495, + 470, + 496, + 490, + 515, + 487, + 503, + 509, + 480, + 495, + 480, + 504, + 512, + 526, + 462, + 472, + 488, + 510, + 488, + 498, + 486, + 462, + 486, + 493, + 509, + 527, + 510, + 477, + 507, + 474, + 486, + 473, + 493, + 480, + 522, + 513, + 453, + 472, + 467, + 474, + 463, + 504, + 482, + 514, + 498, + 514, + 523, + 500, + 453, + 458, + 480, + 483, + 513, + 460, + 524, + 502, + 478, + 477, + 447, + 511, + 495, + 509, + 503, + 487, + 491, + 494, + 470, + 481, + 460, + 488, + 490, + 488, + 523, + 535, + 489, + 489, + 493, + 516, + 515, + 469, + 488, + 541, + 500, + 489, + 477, + 483, + 465, + 478, + 486, + 469, + 492, + 453, + 478, + 464, + 515, + 508, + 466, + 498, + 479, + 478, + 458, + 452, + 456, + 480, + 527, + 461, + 494, + 467, + 471, + 498, + 496, + 488, + 454, + 473, + 505, + 499, + 489, + 487, + 503, + 477, + 469, + 493, + 459, + 503, + 476, + 483, + 497, + 488, + 469, + 504, + 523, + 479, + 528, + 508, + 510, + 474, + 504, + 458, + 483, + 506, + 464, + 512, + 482, + 472, + 487, + 492, + 477, + 487, + 490, + 477, + 483, + 471, + 455, + 465, + 450, + 494, + 501, + 497, + 460, + 493, + 497, + 464, + 504, + 513, + 499, + 491, + 477, + 504, + 515, + 525, + 474, + 449, + 467, + 492, + 470, + 473, + 484, + 458, + 494, + 460, + 464, + 492, + 462, + 495, + 490, + 501, + 489, + 502, + 488, + 483, + 473, + 499, + 477, + 467, + 510, + 509, + 484, + 481, + 500, + 480, + 493, + 460, + 497, + 463, + 475, + 530, + 513, + 476, + 443, + 516, + 439, + 522, + 510, + 509, + 525, + 495, + 509, + 461, + 489, + 479, + 468, + 459, + 474, + 461, + 475, + 469, + 470, + 466, + 495, + 481, + 462, + 494, + 501, + 503, + 495, + 489, + 470, + 486, + 478, + 515, + 474, + 463, + 460, + 456, + 507, + 502, + 471, + 471, + 487, + 470, + 475, + 504, + 514, + 475, + 492, + 489, + 487, + 520, + 476, + 482, + 477, + 468, + 475, + 495, + 477, + 478, + 468, + 473, + 471, + 505, + 533, + 500, + 479, + 487, + 457, + 497, + 471, + 488, + 487, + 451, + 500, + 515, + 507, + 485, + 508, + 458, + 485, + 488, + 470, + 496, + 463, + 479, + 491, + 490, + 542, + 496, + 492, + 492, + 501, + 512, + 467, + 490, + 484, + 507, + 489, + 502, + 467, + 468, + 499, + 494, + 528, + 464, + 482, + 521, + 514, + 451, + 528, + 485, + 516, + 513, + 497, + 483, + 468, + 492, + 510, + 473, + 457, + 503, + 500, + 494, + 497, + 510, + 456, + 488, + 472, + 500, + 490, + 487, + 473, + 468, + 476, + 471, + 523, + 479, + 475, + 499, + 517, + 520, + 477, + 488, + 512, + 461, + 490, + 464, + 506, + 496, + 522, + 493, + 450, + 498, + 489, + 480, + 483, + 558, + 453, + 523, + 481, + 480, + 446, + 489, + 461, + 505, + 514, + 505, + 519, + 504, + 484, + 483, + 472, + 458, + 469, + 489, + 493, + 473, + 498, + 492, + 528, + 449, + 465, + 475, + 487, + 512, + 508, + 504, + 472, + 480, + 462, + 496, + 457, + 506, + 480, + 462, + 542, + 563, + 480, + 480, + 457, + 502, + 465, + 475, + 474, + 450, + 476, + 508, + 452, + 464, + 496, + 465, + 441, + 501, + 455, + 494, + 507, + 522, + 484, + 473, + 511, + 473, + 483, + 489, + 474, + 479, + 447, + 492, + 468, + 496, + 480, + 530, + 502, + 484, + 481, + 538, + 488, + 465, + 527, + 455, + 506, + 484, + 497, + 505, + 476, + 466, + 456, + 476, + 480, + 476, + 503, + 502, + 506, + 485, + 466, + 462, + 508, + 507, + 475, + 470, + 511, + 487, + 468, + 469, + 474, + 499, + 465, + 473, + 480, + 462, + 478, + 466, + 427, + 477, + 491, + 484, + 492, + 481, + 519, + 484, + 448, + 481, + 488, + 506, + 506, + 477, + 493, + 512, + 512, + 508, + 494, + 505, + 479, + 474, + 481, + 451, + 496, + 494, + 482, + 466, + 487, + 488, + 497, + 439, + 475, + 499, + 460, + 465, + 508, + 443, + 496, + 492, + 504, + 450, + 514, + 490, + 491, + 505, + 501, + 476, + 480, + 484, + 513, + 486, + 467, + 482, + 524, + 486, + 500, + 431, + 531, + 515, + 475, + 491, + 483, + 487, + 488, + 440, + 508, + 507, + 524, + 472, + 466, + 524, + 471, + 484, + 438, + 517, + 470, + 486, + 490, + 515, + 482, + 501, + 467, + 491, + 458, + 483, + 502, + 463, + 503, + 496, + 496, + 480, + 478, + 521, + 493, + 496, + 490, + 494, + 485, + 510, + 461, + 480, + 487, + 512, + 475, + 452, + 483, + 481, + 478, + 531, + 497, + 515, + 505, + 462, + 510, + 513, + 510, + 528, + 509, + 446, + 500, + 510, + 473, + 494, + 450, + 464, + 465, + 470, + 477, + 478, + 493, + 495, + 495, + 470, + 501, + 519, + 500, + 432, + 446, + 511, + 530, + 455, + 446, + 495, + 452, + 456, + 480, + 467, + 454, + 485, + 504, + 434, + 519, + 490, + 460, + 491, + 501, + 493, + 482, + 470, + 501, + 477, + 516, + 480, + 490, + 455, + 514, + 501, + 488, + 505, + 504, + 507, + 532, + 490, + 502, + 473, + 516, + 450, + 510, + 475, + 495, + 482, + 473, + 449, + 504, + 526, + 535, + 471, + 447, + 493, + 507, + 527, + 491, + 492, + 500, + 470, + 454, + 441, + 483, + 488, + 463, + 474, + 499, + 486, + 485, + 486, + 480, + 461, + 500, + 466, + 494, + 494, + 480, + 518, + 508, + 469, + 498, + 455, + 486, + 480, + 487, + 502, + 502, + 458, + 511, + 481, + 483, + 489, + 451, + 469, + 495, + 491, + 487, + 482, + 509, + 455, + 501, + 480, + 473, + 519, + 466, + 475, + 493, + 510, + 495, + 486, + 450, + 562, + 502, + 462, + 485, + 485, + 512, + 513, + 473, + 515, + 502, + 464, + 497, + 438, + 514, + 507, + 438, + 473, + 533, + 506, + 460, + 457, + 437, + 516, + 470, + 470, + 499, + 456, + 502, + 489, + 498, + 493, + 528, + 507, + 529, + 468, + 512, + 500, + 506, + 499, + 459, + 497, + 512, + 487, + 505, + 489, + 492, + 501, + 494, + 487, + 443, + 519, + 478, + 467, + 506, + 493, + 511, + 504, + 472, + 479, + 466, + 517, + 477, + 532, + 473, + 501, + 494, + 467, + 498, + 542, + 496, + 461, + 486, + 480, + 513, + 482, + 474, + 498, + 484, + 509, + 499, + 460, + 499, + 474, + 485, + 458, + 501, + 477, + 487, + 478, + 461, + 465, + 492, + 530, + 485, + 512, + 487, + 503, + 492, + 473, + 503, + 468, + 503, + 454, + 488, + 504, + 528, + 490, + 471, + 530, + 507, + 488, + 507, + 503, + 488, + 482, + 494, + 449, + 505, + 490, + 458, + 496, + 480, + 511, + 467, + 512, + 465, + 486, + 513, + 480, + 468, + 487, + 487, + 466, + 489, + 460, + 465, + 504, + 481, + 510, + 464, + 526, + 467, + 491, + 553, + 510, + 519, + 456, + 491, + 525, + 516, + 533, + 469, + 544, + 508, + 515, + 482, + 480, + 465, + 505, + 479, + 500, + 456, + 503, + 487, + 496, + 512, + 497, + 464, + 490, + 513, + 506, + 509, + 487, + 483, + 494, + 509, + 510, + 510, + 461, + 493, + 419, + 501, + 474, + 487, + 482, + 499, + 480, + 447, + 470, + 507, + 473, + 498, + 517, + 515, + 497, + 459, + 482, + 483, + 497, + 487, + 505, + 509, + 495, + 468, + 512, + 477, + 524, + 526, + 493, + 516, + 484, + 500, + 477, + 527, + 475, + 466, + 512, + 497, + 477, + 539, + 486, + 483, + 512, + 491, + 486, + 502, + 522, + 483, + 529, + 468, + 470, + 517, + 509, + 512, + 522, + 500, + 497, + 506, + 489, + 451, + 487, + 456, + 486, + 455, + 468, + 467, + 487, + 509, + 474, + 499, + 459, + 471, + 469, + 456, + 482, + 463, + 479, + 495, + 530, + 487, + 501, + 488, + 504, + 512, + 545, + 496, + 491, + 482, + 522, + 491, + 517, + 466, + 509, + 516, + 472, + 503, + 472, + 494, + 478, + 481, + 508, + 466, + 454, + 452, + 501, + 483, + 438, + 528, + 469, + 474, + 516, + 464, + 453, + 471, + 468, + 477, + 458, + 485, + 479, + 473, + 497, + 498, + 495, + 498, + 502, + 511, + 523, + 507, + 455, + 492, + 516, + 473, + 496, + 489, + 524, + 502, + 508, + 510, + 530, + 527, + 482, + 475, + 526, + 484, + 474, + 500, + 521, + 484, + 478, + 493, + 505, + 491, + 513, + 488, + 512, + 455, + 541, + 509, + 486, + 493, + 438, + 449, + 491, + 476, + 476, + 474, + 503, + 515, + 498, + 511, + 477, + 444, + 478, + 534, + 471, + 488, + 501, + 475, + 454, + 476, + 480, + 472, + 470, + 514, + 510, + 483, + 471, + 507, + 497, + 469, + 497, + 473, + 526, + 468, + 477, + 480, + 496, + 500, + 525, + 450, + 477, + 450, + 516, + 520, + 519, + 485, + 510, + 456, + 516, + 486, + 473, + 484, + 445, + 513, + 489, + 499, + 479, + 479, + 449, + 500, + 463, + 469, + 504, + 483, + 503, + 489, + 505, + 463, + 476, + 485, + 440, + 501, + 454, + 514, + 453, + 510, + 481, + 500, + 487, + 525, + 482, + 460, + 512, + 512, + 499, + 505, + 508, + 471, + 504, + 491, + 508, + 497, + 500, + 486, + 486, + 496, + 446, + 471, + 500, + 444, + 486, + 483, + 505, + 497, + 483, + 462, + 495, + 480, + 467, + 498, + 476, + 492, + 466, + 509, + 462, + 516, + 542, + 488, + 449, + 480, + 488, + 508, + 499, + 499, + 504, + 498, + 493, + 456, + 457, + 484, + 496, + 478, + 552, + 484, + 513, + 482, + 518, + 503, + 490, + 492, + 450, + 478, + 504, + 504, + 488, + 476, + 520, + 497, + 485, + 514, + 504, + 496, + 499, + 484, + 493, + 475, + 505, + 476, + 490, + 490, + 474, + 497, + 472, + 493, + 460, + 496, + 483, + 498, + 496, + 508, + 449, + 497, + 483, + 480, + 470, + 487, + 491, + 485, + 485, + 530, + 497, + 492, + 484, + 471, + 489, + 467, + 495, + 460, + 483, + 501, + 440, + 496, + 444, + 501, + 443, + 519, + 499, + 499, + 513, + 512, + 496, + 478, + 523, + 485, + 465, + 524, + 484, + 494, + 489, + 508, + 481, + 495, + 474, + 488, + 449, + 475, + 524, + 502, + 447, + 501, + 510, + 532, + 496, + 476, + 502, + 455, + 478, + 485, + 551, + 482, + 544, + 488, + 479, + 513, + 530, + 483, + 520, + 494, + 487, + 478, + 472, + 499, + 477, + 487, + 500, + 465, + 515, + 499, + 465, + 511, + 493, + 493, + 473, + 515, + 468, + 459, + 450, + 472, + 456, + 511, + 493, + 490, + 493, + 471, + 474, + 485, + 474, + 503, + 499, + 502, + 491, + 500, + 501, + 503, + 490, + 484, + 480, + 498, + 448, + 483, + 499, + 516, + 488, + 487, + 459, + 481, + 511, + 480, + 479, + 464, + 477, + 492, + 488, + 422, + 508, + 477, + 478, + 439, + 501, + 495, + 523, + 445, + 497, + 510, + 455, + 455, + 504, + 461, + 479, + 436, + 471, + 490, + 499, + 520, + 477, + 458, + 488, + 488, + 561, + 487, + 484, + 517, + 465, + 483, + 498, + 472, + 496, + 479, + 442, + 489, + 498, + 495, + 533, + 434, + 506, + 539, + 487, + 493, + 495, + 484, + 465, + 506, + 473, + 475, + 475, + 510, + 455, + 474, + 486, + 519, + 490, + 498, + 465, + 498, + 501, + 511, + 525, + 543, + 478, + 446, + 490, + 491, + 477, + 495, + 494, + 498, + 499, + 457, + 500, + 518, + 507, + 488, + 484, + 489, + 486, + 516, + 468, + 502, + 503, + 523, + 506, + 518, + 459, + 446, + 458, + 519, + 507, + 486, + 504, + 498, + 507, + 500, + 475, + 514, + 452, + 500, + 484, + 508, + 471, + 468, + 461, + 485, + 503, + 480, + 465, + 476, + 464, + 502, + 510, + 541, + 484, + 477, + 477, + 491, + 480, + 480, + 489, + 541, + 536, + 463, + 484, + 489, + 459, + 486, + 467, + 499, + 486, + 471, + 546, + 476, + 524, + 491, + 461, + 486, + 486, + 461, + 476, + 511, + 512, + 495, + 499, + 509, + 478, + 480, + 504, + 488, + 515, + 478, + 495, + 463, + 473, + 480, + 489, + 505, + 498, + 526, + 467, + 483, + 490, + 478, + 491, + 509, + 505, + 484, + 531, + 474, + 508, + 433, + 510, + 495, + 439, + 497, + 500, + 466, + 492, + 489, + 439, + 508, + 482, + 508, + 460, + 478, + 517, + 458, + 477, + 463, + 505, + 494, + 493, + 507, + 494, + 504, + 491, + 449, + 492, + 433, + 515, + 467, + 514, + 462, + 459, + 474, + 472, + 489, + 504, + 472, + 466, + 489, + 479, + 507, + 499, + 448, + 477, + 453, + 471, + 450, + 500, + 490, + 450, + 491, + 463, + 501, + 494, + 500, + 469, + 486, + 516, + 497, + 494, + 462, + 498, + 500, + 470, + 499, + 464, + 506, + 504, + 513, + 479, + 473, + 479, + 484, + 535, + 483, + 518, + 512, + 501, + 461, + 476, + 504, + 470, + 498, + 466, + 494, + 470, + 500, + 503, + 479, + 444, + 510, + 497, + 501, + 509, + 468, + 495, + 456, + 470, + 492, + 521, + 475, + 491, + 488, + 465, + 443, + 505, + 520, + 485, + 499, + 524, + 522, + 496, + 490, + 481, + 451, + 492, + 489, + 518, + 484, + 467, + 469, + 524, + 512, + 481, + 484, + 481, + 518, + 438, + 517, + 515, + 491, + 485, + 467, + 495, + 495, + 488, + 487, + 484, + 510, + 483, + 525, + 507, + 486, + 449, + 429, + 468, + 494, + 463, + 491, + 523, + 491, + 460, + 498, + 445, + 454, + 479, + 462, + 558, + 482, + 502, + 517, + 444, + 481, + 498, + 527, + 508, + 484, + 439, + 474, + 485, + 447, + 484, + 536, + 453, + 441, + 481, + 510, + 438, + 463, + 476, + 476, + 486, + 508, + 477, + 492, + 490, + 473, + 486, + 472, + 510, + 509, + 473, + 478, + 518, + 528, + 494, + 499, + 499, + 477, + 480, + 480, + 472, + 492, + 514, + 470, + 495, + 476, + 510, + 467, + 496, + 522, + 508, + 493, + 476, + 515, + 524, + 485, + 487, + 492, + 494, + 476, + 501, + 510, + 508, + 457, + 473, + 544, + 499, + 507, + 545, + 477, + 508, + 503, + 493, + 481, + 488, + 537, + 492, + 503, + 471, + 479, + 512, + 496, + 511, + 486, + 507, + 459, + 472, + 469, + 454, + 520, + 512, + 473, + 480, + 472, + 501, + 466, + 525, + 518, + 444, + 488, + 467, + 478, + 471, + 451, + 516, + 439, + 482, + 482, + 493, + 500, + 472, + 499, + 487, + 493, + 509, + 463, + 504, + 506, + 492, + 468, + 487, + 463, + 468, + 457, + 495, + 475, + 512, + 499, + 528, + 487, + 487, + 485, + 502, + 468, + 446, + 490, + 499, + 482, + 495, + 454, + 507, + 480, + 451, + 464, + 495, + 471, + 531, + 456, + 464, + 470, + 495, + 525, + 527, + 465, + 530, + 501, + 489, + 504, + 475, + 521, + 522, + 488, + 484, + 470, + 532, + 475, + 548, + 469, + 484, + 495, + 482, + 482, + 466, + 472, + 508, + 456, + 512, + 452, + 470, + 469, + 460, + 524, + 499, + 481, + 468, + 509, + 467, + 514, + 487, + 468, + 530, + 483, + 482, + 474, + 498, + 500, + 462, + 525, + 451, + 504, + 494, + 531, + 489, + 503, + 444, + 491, + 478, + 503, + 443, + 482, + 481, + 515, + 543, + 483, + 484, + 508, + 453, + 454, + 517, + 508, + 462, + 477, + 527, + 451, + 529, + 512, + 484, + 475, + 509, + 456, + 519, + 493, + 500, + 497, + 459, + 485, + 514, + 514, + 522 + ] + }, + { + "counters": [ + 472, + 498, + 470, + 465, + 475, + 525, + 470, + 465, + 469, + 495, + 486, + 460, + 487, + 480, + 495, + 479, + 448, + 477, + 477, + 486, + 461, + 456, + 504, + 474, + 482, + 473, + 492, + 509, + 465, + 523, + 451, + 513, + 502, + 462, + 461, + 488, + 523, + 469, + 513, + 501, + 484, + 521, + 463, + 487, + 510, + 446, + 528, + 529, + 467, + 514, + 493, + 513, + 476, + 490, + 461, + 476, + 483, + 488, + 445, + 482, + 516, + 529, + 471, + 454, + 499, + 496, + 483, + 467, + 504, + 481, + 495, + 488, + 489, + 474, + 498, + 510, + 486, + 497, + 510, + 479, + 491, + 472, + 492, + 500, + 505, + 502, + 519, + 461, + 490, + 514, + 498, + 492, + 524, + 492, + 473, + 474, + 520, + 470, + 444, + 509, + 483, + 510, + 508, + 476, + 484, + 484, + 475, + 468, + 475, + 469, + 466, + 471, + 439, + 493, + 479, + 499, + 468, + 487, + 460, + 513, + 480, + 531, + 500, + 527, + 460, + 490, + 475, + 497, + 508, + 484, + 486, + 487, + 488, + 492, + 520, + 477, + 504, + 470, + 509, + 485, + 496, + 466, + 476, + 479, + 501, + 494, + 495, + 485, + 510, + 499, + 514, + 485, + 494, + 474, + 495, + 465, + 480, + 475, + 479, + 548, + 466, + 517, + 507, + 507, + 458, + 460, + 507, + 471, + 493, + 472, + 497, + 509, + 504, + 498, + 488, + 484, + 470, + 453, + 495, + 485, + 467, + 525, + 485, + 522, + 469, + 500, + 441, + 467, + 509, + 469, + 513, + 452, + 489, + 498, + 497, + 435, + 476, + 500, + 510, + 520, + 475, + 461, + 501, + 513, + 488, + 480, + 494, + 481, + 493, + 501, + 470, + 504, + 475, + 500, + 499, + 471, + 469, + 519, + 484, + 478, + 434, + 448, + 522, + 445, + 489, + 515, + 463, + 511, + 483, + 484, + 468, + 480, + 488, + 482, + 476, + 469, + 462, + 470, + 477, + 500, + 475, + 503, + 480, + 539, + 473, + 498, + 522, + 475, + 502, + 526, + 474, + 464, + 493, + 449, + 527, + 464, + 510, + 511, + 466, + 489, + 493, + 512, + 478, + 498, + 469, + 515, + 529, + 506, + 488, + 506, + 535, + 460, + 509, + 489, + 473, + 478, + 503, + 461, + 484, + 517, + 426, + 469, + 473, + 470, + 477, + 454, + 505, + 495, + 476, + 462, + 495, + 486, + 468, + 488, + 498, + 463, + 468, + 503, + 530, + 541, + 488, + 475, + 497, + 502, + 464, + 516, + 492, + 505, + 476, + 454, + 514, + 492, + 463, + 506, + 488, + 487, + 493, + 497, + 498, + 511, + 517, + 490, + 499, + 474, + 458, + 485, + 490, + 504, + 489, + 487, + 468, + 503, + 483, + 504, + 484, + 499, + 489, + 537, + 507, + 509, + 527, + 521, + 471, + 501, + 459, + 539, + 470, + 491, + 474, + 511, + 479, + 474, + 525, + 510, + 478, + 474, + 476, + 481, + 519, + 462, + 492, + 471, + 504, + 472, + 478, + 483, + 448, + 504, + 519, + 479, + 442, + 472, + 492, + 477, + 545, + 472, + 498, + 420, + 500, + 469, + 495, + 508, + 485, + 502, + 492, + 470, + 468, + 472, + 481, + 470, + 493, + 466, + 496, + 482, + 500, + 513, + 522, + 484, + 496, + 476, + 487, + 503, + 491, + 507, + 461, + 503, + 496, + 478, + 515, + 470, + 505, + 542, + 487, + 502, + 503, + 482, + 454, + 509, + 510, + 460, + 514, + 521, + 465, + 491, + 444, + 471, + 470, + 488, + 495, + 492, + 492, + 514, + 521, + 479, + 492, + 538, + 454, + 482, + 486, + 472, + 505, + 523, + 514, + 516, + 488, + 523, + 505, + 480, + 477, + 503, + 487, + 513, + 463, + 509, + 480, + 515, + 497, + 460, + 532, + 474, + 445, + 450, + 501, + 530, + 507, + 495, + 499, + 492, + 495, + 477, + 487, + 478, + 506, + 476, + 510, + 493, + 440, + 490, + 450, + 522, + 484, + 497, + 494, + 487, + 477, + 482, + 460, + 445, + 474, + 481, + 510, + 504, + 478, + 503, + 484, + 497, + 467, + 537, + 469, + 523, + 521, + 472, + 489, + 464, + 476, + 482, + 527, + 491, + 483, + 476, + 500, + 496, + 505, + 462, + 472, + 453, + 493, + 506, + 458, + 446, + 499, + 477, + 473, + 532, + 495, + 466, + 498, + 484, + 491, + 485, + 486, + 478, + 460, + 513, + 482, + 474, + 470, + 482, + 463, + 490, + 479, + 513, + 496, + 499, + 458, + 458, + 490, + 483, + 508, + 475, + 485, + 486, + 491, + 538, + 493, + 486, + 516, + 496, + 498, + 490, + 483, + 509, + 476, + 497, + 463, + 489, + 488, + 496, + 498, + 475, + 510, + 487, + 457, + 451, + 515, + 554, + 488, + 467, + 461, + 463, + 486, + 488, + 482, + 500, + 512, + 509, + 468, + 467, + 474, + 523, + 488, + 480, + 471, + 479, + 502, + 487, + 465, + 472, + 499, + 478, + 478, + 487, + 479, + 479, + 520, + 520, + 491, + 472, + 511, + 499, + 492, + 469, + 491, + 500, + 497, + 465, + 530, + 492, + 450, + 490, + 451, + 505, + 538, + 491, + 493, + 513, + 468, + 452, + 491, + 487, + 514, + 496, + 461, + 471, + 504, + 488, + 504, + 511, + 502, + 439, + 526, + 483, + 491, + 506, + 503, + 505, + 498, + 498, + 477, + 487, + 456, + 447, + 522, + 517, + 492, + 478, + 485, + 522, + 526, + 491, + 447, + 465, + 491, + 457, + 451, + 490, + 455, + 436, + 435, + 468, + 480, + 491, + 503, + 512, + 472, + 524, + 458, + 502, + 443, + 476, + 483, + 495, + 490, + 490, + 463, + 508, + 476, + 466, + 508, + 479, + 516, + 518, + 513, + 455, + 490, + 532, + 490, + 487, + 453, + 485, + 527, + 480, + 508, + 500, + 459, + 471, + 455, + 519, + 488, + 487, + 492, + 468, + 485, + 488, + 460, + 486, + 502, + 520, + 508, + 483, + 473, + 497, + 486, + 488, + 452, + 434, + 493, + 526, + 483, + 467, + 476, + 488, + 469, + 501, + 500, + 464, + 480, + 526, + 475, + 526, + 422, + 519, + 468, + 503, + 528, + 499, + 500, + 470, + 523, + 504, + 493, + 474, + 482, + 485, + 480, + 527, + 498, + 472, + 516, + 439, + 481, + 474, + 505, + 491, + 482, + 453, + 477, + 514, + 539, + 491, + 506, + 533, + 510, + 490, + 514, + 472, + 518, + 492, + 467, + 504, + 520, + 460, + 496, + 532, + 511, + 500, + 473, + 476, + 448, + 500, + 461, + 467, + 500, + 549, + 488, + 507, + 477, + 494, + 464, + 467, + 511, + 515, + 461, + 483, + 485, + 485, + 493, + 509, + 510, + 426, + 486, + 521, + 503, + 509, + 452, + 495, + 506, + 524, + 480, + 452, + 510, + 485, + 506, + 482, + 519, + 481, + 508, + 492, + 503, + 475, + 494, + 487, + 485, + 483, + 502, + 524, + 500, + 476, + 522, + 500, + 514, + 454, + 489, + 494, + 509, + 510, + 496, + 521, + 477, + 483, + 499, + 424, + 454, + 477, + 485, + 510, + 496, + 519, + 521, + 506, + 503, + 485, + 423, + 495, + 507, + 465, + 490, + 490, + 494, + 515, + 501, + 508, + 498, + 460, + 455, + 495, + 510, + 510, + 504, + 505, + 475, + 467, + 488, + 479, + 421, + 503, + 506, + 455, + 454, + 499, + 475, + 510, + 500, + 490, + 507, + 510, + 480, + 483, + 504, + 503, + 450, + 495, + 508, + 477, + 493, + 474, + 519, + 466, + 489, + 479, + 513, + 481, + 444, + 469, + 504, + 498, + 491, + 463, + 450, + 506, + 516, + 482, + 494, + 480, + 530, + 492, + 512, + 479, + 491, + 468, + 486, + 474, + 471, + 471, + 502, + 524, + 493, + 508, + 487, + 492, + 489, + 508, + 471, + 500, + 503, + 495, + 461, + 482, + 462, + 496, + 473, + 459, + 498, + 508, + 509, + 504, + 488, + 473, + 486, + 492, + 484, + 509, + 485, + 482, + 464, + 532, + 485, + 492, + 466, + 464, + 491, + 520, + 496, + 480, + 473, + 494, + 449, + 478, + 503, + 479, + 482, + 483, + 479, + 506, + 462, + 491, + 475, + 483, + 488, + 475, + 468, + 508, + 501, + 464, + 501, + 492, + 492, + 461, + 513, + 479, + 534, + 477, + 476, + 470, + 517, + 466, + 470, + 485, + 454, + 477, + 424, + 468, + 507, + 485, + 425, + 514, + 467, + 500, + 474, + 491, + 501, + 478, + 482, + 483, + 501, + 463, + 492, + 466, + 488, + 460, + 451, + 465, + 476, + 479, + 513, + 468, + 471, + 472, + 488, + 505, + 502, + 469, + 472, + 469, + 520, + 514, + 453, + 498, + 487, + 514, + 526, + 451, + 473, + 527, + 516, + 482, + 542, + 491, + 464, + 470, + 533, + 464, + 473, + 468, + 532, + 509, + 459, + 520, + 488, + 446, + 520, + 492, + 459, + 494, + 491, + 519, + 487, + 491, + 496, + 430, + 499, + 507, + 492, + 514, + 506, + 486, + 499, + 463, + 493, + 486, + 447, + 508, + 504, + 523, + 493, + 481, + 468, + 503, + 481, + 454, + 483, + 498, + 518, + 488, + 462, + 477, + 518, + 476, + 466, + 485, + 489, + 514, + 461, + 503, + 470, + 458, + 464, + 488, + 501, + 508, + 484, + 474, + 479, + 488, + 518, + 510, + 520, + 495, + 505, + 500, + 503, + 450, + 447, + 512, + 486, + 489, + 486, + 530, + 473, + 508, + 472, + 507, + 472, + 483, + 519, + 485, + 490, + 464, + 499, + 489, + 447, + 481, + 479, + 455, + 470, + 474, + 463, + 487, + 457, + 469, + 502, + 495, + 512, + 482, + 501, + 483, + 469, + 523, + 482, + 521, + 473, + 480, + 521, + 504, + 498, + 513, + 492, + 506, + 499, + 509, + 503, + 464, + 495, + 470, + 481, + 457, + 458, + 496, + 493, + 490, + 491, + 505, + 496, + 467, + 470, + 481, + 470, + 507, + 532, + 520, + 462, + 482, + 488, + 425, + 466, + 493, + 492, + 503, + 482, + 474, + 465, + 461, + 468, + 495, + 513, + 533, + 486, + 495, + 491, + 466, + 494, + 487, + 463, + 489, + 503, + 494, + 514, + 503, + 482, + 455, + 501, + 536, + 521, + 493, + 474, + 490, + 502, + 482, + 492, + 476, + 482, + 479, + 521, + 514, + 443, + 526, + 484, + 498, + 457, + 479, + 502, + 437, + 502, + 497, + 501, + 482, + 457, + 450, + 481, + 457, + 517, + 518, + 512, + 491, + 494, + 490, + 470, + 482, + 500, + 479, + 491, + 512, + 500, + 526, + 505, + 483, + 495, + 480, + 535, + 482, + 511, + 511, + 463, + 472, + 503, + 511, + 505, + 496, + 448, + 508, + 492, + 481, + 461, + 466, + 484, + 475, + 471, + 464, + 475, + 482, + 463, + 483, + 545, + 469, + 486, + 491, + 528, + 517, + 491, + 504, + 451, + 476, + 467, + 487, + 503, + 480, + 474, + 506, + 491, + 473, + 518, + 425, + 482, + 467, + 521, + 471, + 494, + 454, + 472, + 535, + 476, + 494, + 516, + 496, + 489, + 495, + 448, + 520, + 482, + 520, + 498, + 472, + 504, + 502, + 463, + 485, + 477, + 520, + 506, + 470, + 466, + 497, + 511, + 482, + 457, + 491, + 516, + 495, + 512, + 447, + 472, + 474, + 507, + 516, + 513, + 515, + 462, + 485, + 480, + 471, + 520, + 467, + 527, + 467, + 475, + 509, + 484, + 464, + 487, + 507, + 504, + 519, + 484, + 445, + 490, + 499, + 477, + 497, + 548, + 466, + 476, + 505, + 487, + 501, + 509, + 488, + 489, + 510, + 474, + 500, + 516, + 492, + 501, + 477, + 525, + 530, + 503, + 498, + 467, + 480, + 476, + 517, + 523, + 497, + 469, + 457, + 466, + 472, + 469, + 481, + 487, + 451, + 488, + 482, + 504, + 481, + 489, + 490, + 492, + 499, + 505, + 517, + 496, + 517, + 477, + 427, + 473, + 506, + 475, + 486, + 507, + 472, + 467, + 520, + 474, + 452, + 476, + 494, + 478, + 481, + 485, + 477, + 441, + 508, + 519, + 477, + 490, + 460, + 466, + 517, + 470, + 468, + 525, + 497, + 519, + 475, + 492, + 466, + 482, + 523, + 476, + 502, + 483, + 466, + 475, + 487, + 479, + 498, + 472, + 463, + 479, + 488, + 460, + 477, + 478, + 451, + 465, + 484, + 503, + 521, + 522, + 476, + 503, + 477, + 476, + 477, + 513, + 506, + 465, + 481, + 462, + 485, + 509, + 498, + 510, + 483, + 511, + 510, + 500, + 478, + 488, + 487, + 526, + 506, + 525, + 489, + 527, + 484, + 442, + 506, + 481, + 506, + 502, + 498, + 435, + 486, + 495, + 487, + 496, + 487, + 457, + 513, + 540, + 469, + 496, + 494, + 488, + 499, + 471, + 471, + 485, + 505, + 453, + 486, + 491, + 507, + 475, + 512, + 482, + 462, + 486, + 476, + 466, + 445, + 490, + 519, + 484, + 492, + 496, + 489, + 509, + 520, + 468, + 510, + 505, + 473, + 486, + 538, + 495, + 484, + 477, + 481, + 491, + 535, + 474, + 494, + 496, + 497, + 475, + 472, + 485, + 510, + 481, + 564, + 487, + 466, + 502, + 496, + 498, + 514, + 483, + 495, + 514, + 497, + 482, + 492, + 479, + 487, + 482, + 471, + 506, + 488, + 515, + 464, + 511, + 511, + 502, + 504, + 451, + 505, + 470, + 498, + 488, + 498, + 502, + 444, + 464, + 480, + 500, + 503, + 521, + 473, + 482, + 469, + 472, + 538, + 470, + 492, + 491, + 482, + 488, + 497, + 499, + 465, + 462, + 496, + 469, + 492, + 481, + 501, + 456, + 498, + 439, + 533, + 490, + 449, + 473, + 491, + 476, + 501, + 492, + 489, + 461, + 448, + 481, + 486, + 456, + 484, + 492, + 474, + 515, + 471, + 458, + 523, + 483, + 513, + 484, + 472, + 486, + 518, + 443, + 463, + 507, + 487, + 451, + 490, + 485, + 488, + 495, + 525, + 484, + 500, + 478, + 504, + 470, + 491, + 449, + 471, + 477, + 472, + 468, + 506, + 507, + 520, + 473, + 520, + 465, + 507, + 480, + 475, + 491, + 487, + 495, + 473, + 440, + 495, + 473, + 433, + 505, + 506, + 516, + 466, + 462, + 505, + 472, + 482, + 494, + 512, + 497, + 476, + 515, + 466, + 491, + 466, + 511, + 477, + 496, + 535, + 513, + 458, + 509, + 477, + 522, + 485, + 471, + 440, + 504, + 480, + 479, + 485, + 474, + 485, + 490, + 518, + 507, + 508, + 511, + 454, + 475, + 502, + 480, + 476, + 490, + 507, + 485, + 484, + 494, + 530, + 486, + 484, + 523, + 458, + 476, + 473, + 452, + 472, + 461, + 474, + 500, + 518, + 487, + 508, + 505, + 474, + 484, + 532, + 462, + 462, + 472, + 445, + 489, + 508, + 517, + 474, + 484, + 483, + 456, + 482, + 488, + 452, + 511, + 449, + 501, + 489, + 454, + 477, + 537, + 484, + 485, + 516, + 463, + 507, + 500, + 479, + 480, + 483, + 491, + 473, + 443, + 483, + 482, + 497, + 486, + 502, + 497, + 530, + 515, + 552, + 477, + 517, + 478, + 513, + 490, + 536, + 501, + 486, + 503, + 499, + 502, + 514, + 521, + 493, + 514, + 471, + 459, + 503, + 466, + 465, + 516, + 532, + 496, + 495, + 513, + 469, + 476, + 476, + 501, + 501, + 491, + 479, + 469, + 463, + 468, + 505, + 520, + 509, + 474, + 489, + 483, + 504, + 494, + 497, + 493, + 506, + 516, + 503, + 472, + 456, + 518, + 467, + 458, + 487, + 458, + 493, + 525, + 480, + 453, + 485, + 484, + 491, + 493, + 478, + 482, + 529, + 484, + 486, + 471, + 465, + 481, + 498, + 511, + 530, + 486, + 464, + 461, + 470, + 489, + 516, + 507, + 495, + 493, + 492, + 445, + 483, + 517, + 518, + 460, + 481, + 478, + 498, + 480, + 494, + 505, + 516, + 460, + 448, + 477, + 460, + 490, + 490, + 465, + 496, + 535, + 476, + 507, + 468, + 480, + 508, + 505, + 534, + 537, + 464, + 502, + 481, + 497, + 481, + 477, + 487, + 467, + 483, + 491, + 512, + 479, + 489, + 507, + 484, + 478, + 451, + 472, + 470, + 509, + 486, + 464, + 478, + 481, + 520, + 492, + 480, + 459, + 489, + 437, + 495, + 479, + 489, + 486, + 474, + 458, + 470, + 479, + 464, + 481, + 468, + 516, + 479, + 509, + 501, + 477, + 523, + 481, + 487, + 507, + 517, + 487, + 518, + 508, + 518, + 484, + 496, + 487, + 507, + 479, + 460, + 491, + 460, + 523, + 520, + 471, + 505, + 490, + 451, + 468, + 494, + 482, + 491, + 462, + 490, + 434, + 485, + 496, + 466, + 482, + 490, + 480, + 452, + 487, + 471, + 468, + 481, + 538, + 475, + 482, + 495, + 491, + 489, + 493, + 469, + 483, + 480, + 508, + 516, + 473, + 487, + 513, + 493, + 506, + 489, + 478, + 480, + 469, + 455, + 487, + 509, + 473, + 490, + 512, + 510, + 488, + 517 + ] + }, + { + "counters": [ + 492, + 496, + 514, + 481, + 463, + 481, + 487, + 491, + 438, + 495, + 531, + 489, + 445, + 508, + 527, + 577, + 468, + 537, + 474, + 503, + 439, + 514, + 541, + 515, + 463, + 470, + 483, + 466, + 484, + 522, + 492, + 468, + 497, + 523, + 500, + 492, + 472, + 503, + 506, + 469, + 496, + 509, + 502, + 439, + 476, + 508, + 483, + 512, + 502, + 463, + 488, + 453, + 482, + 503, + 542, + 524, + 483, + 461, + 478, + 482, + 496, + 503, + 510, + 455, + 513, + 509, + 437, + 467, + 483, + 483, + 458, + 539, + 503, + 476, + 491, + 504, + 520, + 474, + 485, + 507, + 485, + 524, + 507, + 459, + 485, + 531, + 497, + 474, + 469, + 499, + 506, + 472, + 491, + 486, + 497, + 525, + 501, + 491, + 510, + 487, + 471, + 490, + 478, + 486, + 493, + 471, + 449, + 474, + 494, + 452, + 509, + 484, + 473, + 493, + 489, + 510, + 454, + 479, + 482, + 471, + 505, + 485, + 472, + 522, + 493, + 459, + 499, + 517, + 480, + 487, + 459, + 488, + 482, + 460, + 491, + 475, + 476, + 506, + 466, + 491, + 511, + 477, + 485, + 469, + 511, + 486, + 514, + 513, + 465, + 531, + 464, + 483, + 488, + 468, + 484, + 499, + 487, + 502, + 475, + 492, + 495, + 510, + 493, + 486, + 513, + 488, + 419, + 486, + 520, + 528, + 493, + 535, + 443, + 463, + 429, + 548, + 467, + 452, + 535, + 485, + 457, + 436, + 473, + 510, + 484, + 479, + 505, + 548, + 486, + 526, + 518, + 493, + 532, + 483, + 471, + 491, + 491, + 507, + 458, + 482, + 515, + 489, + 450, + 502, + 457, + 467, + 474, + 488, + 524, + 469, + 474, + 510, + 489, + 470, + 493, + 494, + 451, + 509, + 522, + 466, + 484, + 467, + 524, + 483, + 502, + 513, + 464, + 536, + 477, + 489, + 479, + 457, + 516, + 482, + 524, + 460, + 439, + 509, + 508, + 511, + 487, + 500, + 539, + 505, + 485, + 477, + 535, + 464, + 495, + 497, + 526, + 468, + 524, + 488, + 459, + 482, + 507, + 476, + 498, + 454, + 506, + 457, + 485, + 510, + 488, + 511, + 502, + 513, + 503, + 511, + 518, + 507, + 470, + 513, + 476, + 471, + 520, + 495, + 504, + 490, + 492, + 489, + 467, + 480, + 463, + 489, + 499, + 479, + 507, + 510, + 529, + 443, + 504, + 483, + 484, + 452, + 459, + 486, + 481, + 475, + 501, + 474, + 485, + 529, + 486, + 469, + 451, + 484, + 499, + 484, + 483, + 504, + 507, + 471, + 517, + 508, + 497, + 444, + 484, + 474, + 508, + 508, + 518, + 489, + 479, + 498, + 484, + 502, + 485, + 537, + 464, + 458, + 471, + 500, + 494, + 486, + 513, + 490, + 521, + 450, + 482, + 473, + 479, + 478, + 461, + 485, + 480, + 489, + 471, + 521, + 524, + 482, + 514, + 477, + 550, + 486, + 532, + 514, + 497, + 499, + 491, + 489, + 500, + 496, + 484, + 492, + 460, + 480, + 483, + 482, + 512, + 460, + 453, + 515, + 477, + 478, + 502, + 524, + 498, + 494, + 525, + 481, + 458, + 493, + 473, + 511, + 469, + 477, + 495, + 445, + 476, + 494, + 504, + 488, + 481, + 480, + 479, + 502, + 482, + 512, + 485, + 502, + 501, + 467, + 448, + 497, + 509, + 507, + 471, + 478, + 483, + 504, + 513, + 436, + 440, + 507, + 491, + 504, + 507, + 466, + 488, + 480, + 506, + 479, + 486, + 482, + 480, + 497, + 502, + 457, + 489, + 470, + 507, + 480, + 481, + 458, + 502, + 485, + 498, + 461, + 531, + 547, + 464, + 465, + 510, + 461, + 461, + 474, + 529, + 499, + 503, + 477, + 537, + 509, + 481, + 539, + 528, + 508, + 475, + 476, + 487, + 504, + 495, + 484, + 486, + 501, + 462, + 501, + 465, + 506, + 478, + 472, + 545, + 487, + 464, + 463, + 516, + 474, + 520, + 462, + 502, + 500, + 453, + 477, + 476, + 477, + 504, + 482, + 488, + 506, + 472, + 500, + 500, + 507, + 497, + 498, + 465, + 516, + 457, + 474, + 464, + 451, + 522, + 484, + 429, + 508, + 449, + 467, + 488, + 503, + 483, + 488, + 492, + 434, + 472, + 522, + 486, + 520, + 507, + 517, + 499, + 481, + 445, + 465, + 516, + 455, + 520, + 438, + 467, + 489, + 498, + 500, + 487, + 505, + 477, + 487, + 480, + 491, + 515, + 496, + 462, + 456, + 479, + 498, + 494, + 478, + 476, + 476, + 478, + 467, + 530, + 477, + 477, + 495, + 487, + 523, + 544, + 473, + 496, + 493, + 465, + 502, + 497, + 494, + 496, + 479, + 485, + 473, + 473, + 519, + 477, + 487, + 511, + 468, + 478, + 491, + 529, + 473, + 523, + 498, + 474, + 455, + 482, + 509, + 500, + 491, + 501, + 481, + 500, + 465, + 477, + 471, + 513, + 514, + 489, + 512, + 537, + 487, + 506, + 484, + 446, + 480, + 487, + 511, + 482, + 467, + 497, + 484, + 474, + 496, + 477, + 522, + 510, + 521, + 480, + 461, + 531, + 478, + 465, + 470, + 479, + 455, + 533, + 452, + 486, + 499, + 479, + 459, + 494, + 434, + 485, + 466, + 479, + 481, + 510, + 493, + 477, + 479, + 468, + 491, + 487, + 477, + 484, + 491, + 494, + 431, + 534, + 493, + 498, + 477, + 476, + 448, + 445, + 488, + 453, + 484, + 454, + 487, + 446, + 460, + 500, + 468, + 479, + 483, + 498, + 457, + 449, + 474, + 481, + 503, + 497, + 492, + 483, + 532, + 482, + 482, + 500, + 453, + 499, + 459, + 506, + 492, + 524, + 491, + 467, + 495, + 510, + 471, + 491, + 503, + 460, + 484, + 448, + 476, + 513, + 459, + 521, + 476, + 484, + 491, + 494, + 566, + 479, + 555, + 516, + 493, + 482, + 520, + 510, + 470, + 460, + 497, + 478, + 480, + 515, + 496, + 496, + 503, + 485, + 503, + 508, + 476, + 516, + 510, + 510, + 518, + 486, + 487, + 460, + 492, + 495, + 499, + 470, + 461, + 507, + 510, + 494, + 488, + 503, + 505, + 550, + 514, + 494, + 492, + 488, + 505, + 452, + 488, + 474, + 479, + 466, + 463, + 457, + 489, + 510, + 449, + 490, + 444, + 483, + 483, + 509, + 501, + 512, + 465, + 476, + 442, + 487, + 502, + 458, + 524, + 461, + 500, + 482, + 492, + 469, + 460, + 508, + 459, + 452, + 487, + 481, + 466, + 515, + 491, + 489, + 482, + 489, + 486, + 470, + 505, + 494, + 544, + 509, + 503, + 515, + 502, + 498, + 461, + 530, + 460, + 494, + 463, + 470, + 551, + 478, + 483, + 535, + 506, + 511, + 491, + 513, + 506, + 461, + 484, + 430, + 462, + 494, + 521, + 458, + 463, + 503, + 506, + 446, + 513, + 479, + 491, + 470, + 491, + 467, + 497, + 475, + 473, + 511, + 458, + 502, + 489, + 455, + 487, + 475, + 466, + 474, + 518, + 493, + 511, + 503, + 449, + 467, + 444, + 529, + 494, + 485, + 509, + 516, + 463, + 501, + 472, + 468, + 491, + 526, + 511, + 461, + 486, + 497, + 525, + 469, + 478, + 528, + 482, + 462, + 464, + 524, + 505, + 435, + 474, + 441, + 484, + 532, + 496, + 462, + 480, + 482, + 526, + 504, + 466, + 511, + 500, + 470, + 502, + 419, + 500, + 446, + 467, + 503, + 471, + 471, + 490, + 517, + 482, + 505, + 493, + 502, + 488, + 491, + 469, + 506, + 440, + 483, + 487, + 471, + 493, + 475, + 502, + 467, + 494, + 471, + 472, + 513, + 506, + 512, + 523, + 503, + 469, + 498, + 498, + 470, + 481, + 451, + 488, + 493, + 487, + 511, + 474, + 494, + 506, + 513, + 531, + 518, + 492, + 487, + 470, + 496, + 485, + 477, + 481, + 520, + 512, + 465, + 479, + 494, + 545, + 473, + 483, + 475, + 515, + 475, + 476, + 465, + 498, + 497, + 497, + 445, + 508, + 492, + 525, + 499, + 484, + 479, + 484, + 434, + 505, + 488, + 493, + 508, + 484, + 475, + 475, + 501, + 510, + 498, + 483, + 488, + 464, + 502, + 471, + 494, + 476, + 504, + 458, + 444, + 485, + 478, + 454, + 494, + 472, + 494, + 488, + 483, + 497, + 489, + 484, + 513, + 520, + 483, + 476, + 464, + 518, + 500, + 502, + 518, + 495, + 456, + 487, + 483, + 473, + 496, + 493, + 490, + 508, + 465, + 497, + 475, + 522, + 475, + 483, + 492, + 455, + 470, + 489, + 525, + 480, + 473, + 503, + 504, + 477, + 473, + 529, + 500, + 474, + 501, + 512, + 498, + 510, + 495, + 497, + 489, + 474, + 487, + 489, + 504, + 466, + 503, + 472, + 465, + 510, + 476, + 442, + 474, + 507, + 495, + 490, + 483, + 466, + 489, + 472, + 466, + 519, + 471, + 500, + 461, + 494, + 500, + 510, + 496, + 470, + 485, + 466, + 484, + 516, + 493, + 500, + 471, + 489, + 454, + 494, + 465, + 530, + 536, + 491, + 478, + 491, + 443, + 434, + 468, + 502, + 477, + 511, + 479, + 500, + 499, + 451, + 503, + 493, + 501, + 485, + 450, + 482, + 482, + 438, + 516, + 490, + 508, + 500, + 491, + 462, + 533, + 478, + 463, + 517, + 497, + 466, + 493, + 495, + 489, + 475, + 478, + 509, + 450, + 506, + 504, + 481, + 464, + 536, + 534, + 466, + 463, + 510, + 507, + 482, + 503, + 478, + 469, + 465, + 513, + 481, + 446, + 510, + 484, + 443, + 516, + 482, + 471, + 505, + 471, + 485, + 491, + 471, + 496, + 470, + 509, + 435, + 487, + 502, + 475, + 496, + 519, + 448, + 477, + 481, + 492, + 509, + 458, + 511, + 483, + 465, + 477, + 493, + 487, + 513, + 488, + 501, + 501, + 501, + 490, + 479, + 505, + 526, + 496, + 548, + 486, + 517, + 424, + 498, + 490, + 512, + 476, + 454, + 476, + 506, + 473, + 466, + 490, + 448, + 498, + 494, + 512, + 476, + 490, + 477, + 460, + 473, + 511, + 489, + 510, + 487, + 454, + 472, + 485, + 478, + 476, + 459, + 501, + 506, + 472, + 478, + 505, + 507, + 486, + 487, + 498, + 511, + 504, + 475, + 466, + 503, + 496, + 473, + 500, + 450, + 485, + 477, + 486, + 507, + 498, + 486, + 514, + 466, + 471, + 454, + 455, + 488, + 503, + 504, + 504, + 527, + 493, + 515, + 478, + 486, + 496, + 508, + 482, + 511, + 475, + 470, + 485, + 469, + 493, + 498, + 492, + 500, + 528, + 496, + 497, + 473, + 486, + 488, + 474, + 470, + 484, + 458, + 500, + 510, + 477, + 503, + 479, + 471, + 488, + 510, + 504, + 436, + 491, + 486, + 461, + 477, + 483, + 452, + 465, + 474, + 510, + 486, + 531, + 508, + 499, + 451, + 497, + 504, + 490, + 469, + 452, + 506, + 459, + 487, + 481, + 510, + 469, + 486, + 517, + 488, + 463, + 480, + 534, + 483, + 513, + 468, + 471, + 461, + 531, + 488, + 466, + 490, + 513, + 513, + 507, + 492, + 493, + 479, + 505, + 476, + 485, + 500, + 485, + 503, + 453, + 478, + 500, + 471, + 473, + 466, + 465, + 532, + 513, + 517, + 518, + 532, + 501, + 491, + 451, + 482, + 472, + 483, + 474, + 529, + 472, + 512, + 482, + 518, + 468, + 435, + 460, + 497, + 538, + 484, + 500, + 446, + 494, + 505, + 498, + 505, + 487, + 517, + 496, + 489, + 475, + 433, + 452, + 486, + 483, + 498, + 476, + 510, + 496, + 517, + 490, + 465, + 462, + 463, + 462, + 465, + 486, + 504, + 458, + 489, + 517, + 474, + 514, + 536, + 527, + 446, + 536, + 493, + 492, + 490, + 469, + 483, + 512, + 449, + 536, + 501, + 499, + 477, + 489, + 483, + 518, + 484, + 484, + 485, + 483, + 470, + 481, + 500, + 474, + 469, + 493, + 461, + 506, + 468, + 496, + 483, + 466, + 499, + 521, + 466, + 510, + 489, + 519, + 523, + 470, + 486, + 489, + 536, + 499, + 501, + 489, + 501, + 473, + 485, + 491, + 514, + 508, + 495, + 457, + 479, + 484, + 474, + 496, + 481, + 515, + 468, + 480, + 482, + 519, + 495, + 496, + 511, + 464, + 511, + 483, + 441, + 494, + 486, + 512, + 434, + 501, + 509, + 430, + 473, + 529, + 487, + 485, + 512, + 460, + 513, + 436, + 487, + 493, + 499, + 491, + 469, + 478, + 491, + 499, + 469, + 484, + 459, + 442, + 441, + 496, + 481, + 540, + 506, + 470, + 516, + 507, + 466, + 461, + 534, + 514, + 469, + 516, + 453, + 436, + 468, + 478, + 468, + 454, + 464, + 505, + 510, + 532, + 497, + 495, + 504, + 482, + 500, + 497, + 488, + 470, + 502, + 490, + 502, + 466, + 461, + 494, + 491, + 511, + 531, + 465, + 532, + 474, + 499, + 496, + 481, + 486, + 473, + 496, + 494, + 501, + 495, + 477, + 509, + 525, + 510, + 474, + 514, + 493, + 510, + 513, + 505, + 475, + 493, + 458, + 462, + 467, + 468, + 474, + 501, + 539, + 509, + 480, + 500, + 480, + 468, + 464, + 500, + 457, + 497, + 467, + 472, + 528, + 473, + 472, + 528, + 488, + 482, + 490, + 502, + 523, + 469, + 475, + 493, + 473, + 455, + 461, + 469, + 480, + 460, + 497, + 478, + 509, + 495, + 491, + 523, + 508, + 495, + 493, + 460, + 460, + 495, + 483, + 498, + 494, + 501, + 471, + 495, + 465, + 476, + 476, + 502, + 495, + 503, + 491, + 454, + 458, + 511, + 497, + 541, + 468, + 460, + 499, + 495, + 481, + 467, + 453, + 512, + 451, + 502, + 481, + 495, + 456, + 481, + 484, + 459, + 520, + 470, + 480, + 512, + 510, + 472, + 446, + 469, + 496, + 488, + 493, + 503, + 513, + 514, + 500, + 495, + 501, + 484, + 466, + 504, + 494, + 451, + 477, + 494, + 494, + 471, + 481, + 514, + 458, + 488, + 507, + 489, + 465, + 475, + 478, + 496, + 462, + 465, + 499, + 488, + 502, + 507, + 448, + 460, + 480, + 486, + 466, + 500, + 528, + 486, + 475, + 475, + 493, + 458, + 475, + 488, + 513, + 493, + 468, + 508, + 454, + 533, + 474, + 445, + 481, + 492, + 522, + 506, + 514, + 496, + 470, + 509, + 504, + 512, + 498, + 519, + 531, + 499, + 474, + 494, + 497, + 515, + 506, + 506, + 515, + 497, + 472, + 501, + 514, + 490, + 468, + 483, + 491, + 532, + 494, + 533, + 506, + 491, + 446, + 497, + 469, + 478, + 478, + 469, + 467, + 496, + 518, + 456, + 504, + 472, + 469, + 486, + 486, + 506, + 440, + 473, + 475, + 459, + 496, + 506, + 517, + 483, + 484, + 507, + 481, + 467, + 483, + 481, + 504, + 446, + 467, + 476, + 477, + 447, + 489, + 494, + 474, + 511, + 500, + 486, + 509, + 499, + 488, + 480, + 503, + 484, + 485, + 503, + 483, + 483, + 483, + 447, + 491, + 502, + 492, + 494, + 491, + 465, + 503, + 499, + 484, + 461, + 497, + 482, + 477, + 468, + 511, + 481, + 485, + 470, + 490, + 515, + 526, + 457, + 510, + 476, + 501, + 437, + 496, + 531, + 495, + 472, + 485, + 471, + 517, + 518, + 519, + 459, + 490, + 522, + 476, + 465, + 466, + 508, + 477, + 482, + 503, + 476, + 486, + 473, + 499, + 493, + 490, + 492, + 478, + 522, + 523, + 494, + 512, + 482, + 502, + 474, + 474, + 482, + 486, + 502, + 462, + 536, + 486, + 484, + 474, + 503, + 506, + 508, + 506, + 500, + 468, + 494, + 462, + 528, + 451, + 501, + 457, + 476, + 481, + 493, + 479, + 467, + 498, + 508, + 520, + 492, + 447, + 508, + 491, + 490, + 448, + 466, + 474, + 497, + 469, + 521, + 538, + 501, + 501, + 429, + 510, + 499, + 509, + 487, + 493, + 518, + 495, + 482, + 494, + 502, + 529, + 460, + 553, + 506, + 490, + 534, + 453, + 500, + 491, + 521, + 457, + 452, + 520, + 517, + 456, + 476, + 474, + 495, + 456, + 496, + 516, + 490, + 485, + 463, + 487, + 453, + 466, + 486, + 459, + 485, + 484, + 491, + 463, + 499, + 511, + 454, + 488, + 461, + 507, + 493, + 507, + 499, + 505, + 461, + 496, + 546, + 492, + 500, + 437, + 493, + 495, + 484, + 453, + 465, + 480, + 477, + 508, + 450, + 475, + 461, + 480, + 486, + 491, + 476, + 534, + 515, + 475, + 486, + 539, + 462, + 445, + 529, + 490, + 470, + 463, + 520, + 493, + 496, + 469, + 487, + 488, + 519, + 498, + 534, + 522, + 470, + 494, + 494, + 497, + 537, + 498, + 484, + 468, + 475, + 503, + 515, + 450, + 460, + 479, + 487, + 467, + 466, + 460, + 504, + 492, + 516, + 503, + 465, + 480, + 487, + 477, + 484, + 473, + 470, + 526, + 471, + 460, + 500, + 479, + 484, + 483, + 490, + 522, + 475, + 500, + 486, + 490, + 485, + 434, + 480 + ] + }, + { + "counters": [ + 489, + 519, + 466, + 483, + 484, + 514, + 505, + 495, + 485, + 472, + 525, + 511, + 497, + 486, + 478, + 481, + 483, + 502, + 468, + 473, + 546, + 482, + 497, + 456, + 471, + 501, + 479, + 480, + 489, + 513, + 499, + 481, + 507, + 472, + 503, + 467, + 503, + 535, + 502, + 492, + 518, + 487, + 482, + 469, + 515, + 488, + 475, + 512, + 514, + 491, + 478, + 485, + 478, + 476, + 499, + 447, + 491, + 534, + 493, + 491, + 471, + 465, + 500, + 455, + 505, + 484, + 461, + 480, + 497, + 463, + 497, + 488, + 467, + 507, + 504, + 465, + 503, + 492, + 503, + 486, + 497, + 494, + 527, + 485, + 478, + 514, + 471, + 477, + 493, + 502, + 493, + 489, + 505, + 504, + 483, + 508, + 473, + 503, + 520, + 520, + 460, + 467, + 509, + 490, + 467, + 466, + 497, + 484, + 490, + 494, + 498, + 453, + 454, + 469, + 529, + 462, + 491, + 513, + 499, + 520, + 456, + 494, + 507, + 515, + 504, + 474, + 489, + 495, + 483, + 467, + 468, + 479, + 510, + 488, + 461, + 484, + 482, + 492, + 482, + 468, + 497, + 554, + 503, + 457, + 496, + 483, + 464, + 447, + 446, + 518, + 449, + 531, + 511, + 494, + 497, + 512, + 483, + 486, + 476, + 499, + 506, + 481, + 511, + 505, + 518, + 506, + 506, + 508, + 501, + 502, + 511, + 493, + 464, + 515, + 488, + 494, + 488, + 513, + 503, + 440, + 451, + 495, + 451, + 437, + 516, + 495, + 524, + 493, + 485, + 490, + 464, + 504, + 456, + 481, + 517, + 486, + 485, + 471, + 506, + 492, + 531, + 468, + 529, + 495, + 486, + 512, + 494, + 484, + 488, + 476, + 486, + 499, + 504, + 452, + 488, + 469, + 467, + 479, + 474, + 446, + 473, + 473, + 465, + 501, + 487, + 499, + 488, + 487, + 502, + 514, + 469, + 483, + 487, + 469, + 490, + 486, + 446, + 445, + 509, + 480, + 500, + 478, + 490, + 496, + 514, + 464, + 512, + 468, + 480, + 503, + 530, + 494, + 488, + 493, + 535, + 508, + 483, + 475, + 488, + 478, + 483, + 491, + 455, + 509, + 473, + 500, + 514, + 458, + 488, + 473, + 524, + 496, + 477, + 477, + 497, + 512, + 476, + 435, + 474, + 497, + 513, + 500, + 496, + 475, + 464, + 514, + 496, + 528, + 501, + 476, + 489, + 456, + 455, + 481, + 498, + 456, + 489, + 455, + 469, + 477, + 466, + 491, + 485, + 466, + 490, + 462, + 456, + 470, + 479, + 494, + 495, + 514, + 514, + 495, + 478, + 457, + 456, + 472, + 496, + 514, + 501, + 500, + 486, + 508, + 528, + 472, + 488, + 475, + 475, + 458, + 437, + 502, + 468, + 464, + 498, + 511, + 496, + 504, + 457, + 489, + 494, + 478, + 466, + 479, + 482, + 497, + 497, + 472, + 456, + 540, + 489, + 484, + 470, + 514, + 498, + 492, + 493, + 481, + 471, + 477, + 477, + 472, + 514, + 498, + 496, + 473, + 498, + 510, + 528, + 502, + 467, + 502, + 492, + 490, + 465, + 513, + 504, + 500, + 498, + 508, + 501, + 499, + 499, + 501, + 459, + 491, + 491, + 494, + 504, + 464, + 506, + 468, + 499, + 499, + 492, + 474, + 484, + 464, + 492, + 451, + 490, + 500, + 465, + 472, + 526, + 447, + 498, + 485, + 495, + 489, + 505, + 479, + 452, + 470, + 512, + 496, + 489, + 486, + 474, + 510, + 477, + 468, + 467, + 496, + 448, + 469, + 506, + 443, + 505, + 488, + 461, + 493, + 464, + 510, + 504, + 476, + 504, + 520, + 468, + 495, + 500, + 499, + 487, + 469, + 481, + 480, + 468, + 500, + 455, + 479, + 449, + 459, + 452, + 485, + 462, + 533, + 487, + 493, + 501, + 513, + 473, + 473, + 486, + 463, + 499, + 463, + 463, + 463, + 513, + 474, + 508, + 533, + 459, + 494, + 496, + 455, + 490, + 490, + 480, + 477, + 474, + 463, + 508, + 493, + 502, + 492, + 493, + 490, + 510, + 497, + 480, + 502, + 456, + 479, + 458, + 477, + 499, + 500, + 457, + 451, + 459, + 475, + 495, + 471, + 482, + 472, + 473, + 489, + 488, + 445, + 462, + 504, + 496, + 453, + 503, + 484, + 488, + 491, + 501, + 481, + 477, + 485, + 492, + 507, + 469, + 495, + 525, + 532, + 452, + 482, + 520, + 504, + 456, + 509, + 471, + 503, + 504, + 476, + 488, + 445, + 471, + 501, + 477, + 502, + 503, + 481, + 487, + 465, + 459, + 500, + 459, + 493, + 504, + 503, + 499, + 500, + 472, + 547, + 503, + 463, + 463, + 489, + 482, + 534, + 487, + 484, + 456, + 502, + 481, + 507, + 482, + 502, + 491, + 473, + 477, + 477, + 471, + 516, + 471, + 496, + 469, + 479, + 500, + 473, + 479, + 492, + 500, + 463, + 487, + 499, + 481, + 494, + 489, + 497, + 469, + 457, + 493, + 462, + 488, + 493, + 527, + 508, + 502, + 462, + 473, + 457, + 453, + 498, + 483, + 475, + 466, + 480, + 500, + 499, + 491, + 453, + 487, + 458, + 477, + 504, + 492, + 521, + 473, + 485, + 424, + 471, + 472, + 445, + 491, + 488, + 484, + 435, + 490, + 513, + 486, + 476, + 499, + 495, + 446, + 509, + 481, + 473, + 488, + 490, + 488, + 482, + 506, + 481, + 497, + 503, + 519, + 522, + 486, + 518, + 480, + 492, + 507, + 479, + 524, + 512, + 498, + 511, + 490, + 527, + 519, + 475, + 469, + 537, + 448, + 466, + 535, + 481, + 522, + 514, + 485, + 488, + 492, + 508, + 485, + 497, + 481, + 495, + 502, + 472, + 487, + 448, + 464, + 485, + 566, + 514, + 430, + 491, + 469, + 425, + 512, + 497, + 528, + 498, + 466, + 477, + 505, + 483, + 498, + 477, + 455, + 491, + 526, + 468, + 464, + 504, + 502, + 491, + 488, + 482, + 477, + 452, + 432, + 459, + 521, + 422, + 513, + 488, + 470, + 519, + 522, + 471, + 503, + 496, + 502, + 496, + 548, + 497, + 504, + 486, + 488, + 505, + 511, + 474, + 466, + 489, + 457, + 492, + 509, + 483, + 509, + 464, + 478, + 492, + 511, + 476, + 458, + 465, + 485, + 482, + 463, + 485, + 492, + 470, + 479, + 472, + 463, + 512, + 484, + 498, + 487, + 485, + 468, + 493, + 455, + 483, + 474, + 497, + 484, + 452, + 472, + 515, + 461, + 460, + 503, + 503, + 449, + 479, + 435, + 525, + 478, + 453, + 472, + 462, + 484, + 492, + 475, + 525, + 498, + 432, + 488, + 461, + 483, + 502, + 530, + 497, + 477, + 483, + 497, + 495, + 478, + 490, + 471, + 476, + 507, + 500, + 466, + 511, + 484, + 513, + 487, + 514, + 466, + 478, + 510, + 505, + 505, + 502, + 469, + 515, + 495, + 506, + 493, + 511, + 469, + 472, + 512, + 471, + 486, + 490, + 492, + 468, + 515, + 531, + 489, + 516, + 468, + 515, + 488, + 462, + 470, + 456, + 522, + 467, + 457, + 479, + 478, + 521, + 519, + 520, + 436, + 427, + 503, + 514, + 518, + 512, + 492, + 454, + 489, + 492, + 506, + 499, + 502, + 470, + 468, + 456, + 498, + 448, + 502, + 517, + 509, + 482, + 519, + 525, + 501, + 514, + 478, + 485, + 504, + 502, + 481, + 484, + 525, + 502, + 497, + 497, + 485, + 492, + 452, + 421, + 449, + 502, + 517, + 474, + 479, + 478, + 493, + 483, + 459, + 441, + 465, + 509, + 473, + 455, + 518, + 433, + 473, + 507, + 498, + 472, + 489, + 504, + 482, + 490, + 491, + 533, + 487, + 480, + 504, + 526, + 519, + 496, + 468, + 466, + 493, + 518, + 528, + 501, + 480, + 479, + 472, + 481, + 480, + 507, + 457, + 519, + 507, + 468, + 518, + 464, + 492, + 478, + 473, + 539, + 466, + 515, + 465, + 489, + 461, + 476, + 457, + 482, + 491, + 491, + 474, + 464, + 478, + 519, + 487, + 503, + 482, + 474, + 468, + 459, + 432, + 474, + 469, + 493, + 485, + 504, + 486, + 506, + 492, + 489, + 489, + 530, + 503, + 499, + 509, + 499, + 488, + 514, + 440, + 545, + 487, + 452, + 500, + 509, + 485, + 517, + 496, + 513, + 513, + 483, + 494, + 514, + 474, + 502, + 509, + 524, + 520, + 444, + 475, + 488, + 505, + 493, + 489, + 474, + 451, + 487, + 490, + 499, + 481, + 494, + 465, + 454, + 479, + 487, + 486, + 477, + 495, + 501, + 471, + 479, + 469, + 464, + 502, + 486, + 439, + 478, + 501, + 505, + 444, + 505, + 481, + 514, + 494, + 463, + 472, + 473, + 472, + 452, + 488, + 526, + 494, + 476, + 522, + 514, + 502, + 479, + 487, + 496, + 483, + 481, + 481, + 476, + 514, + 511, + 484, + 457, + 502, + 539, + 489, + 464, + 506, + 465, + 446, + 528, + 459, + 455, + 478, + 520, + 472, + 440, + 490, + 533, + 487, + 494, + 492, + 488, + 526, + 521, + 492, + 485, + 481, + 439, + 459, + 495, + 472, + 477, + 490, + 511, + 452, + 511, + 480, + 496, + 527, + 483, + 479, + 479, + 476, + 481, + 462, + 515, + 440, + 487, + 498, + 484, + 468, + 475, + 518, + 486, + 508, + 499, + 465, + 487, + 497, + 467, + 484, + 533, + 505, + 491, + 520, + 459, + 495, + 527, + 463, + 480, + 473, + 542, + 503, + 441, + 472, + 462, + 486, + 496, + 516, + 462, + 537, + 511, + 499, + 493, + 495, + 447, + 489, + 517, + 435, + 476, + 492, + 475, + 485, + 493, + 471, + 496, + 514, + 492, + 477, + 500, + 518, + 488, + 539, + 468, + 536, + 471, + 491, + 488, + 507, + 511, + 496, + 450, + 486, + 520, + 514, + 474, + 477, + 464, + 472, + 474, + 464, + 496, + 462, + 457, + 439, + 510, + 462, + 469, + 508, + 459, + 494, + 509, + 466, + 511, + 523, + 466, + 495, + 454, + 512, + 469, + 467, + 478, + 453, + 520, + 491, + 483, + 493, + 500, + 444, + 492, + 473, + 502, + 455, + 494, + 549, + 508, + 466, + 494, + 479, + 508, + 473, + 463, + 483, + 471, + 525, + 517, + 479, + 500, + 500, + 473, + 478, + 496, + 444, + 500, + 495, + 513, + 507, + 491, + 453, + 498, + 464, + 476, + 523, + 460, + 492, + 525, + 517, + 483, + 480, + 485, + 465, + 512, + 490, + 506, + 547, + 486, + 462, + 484, + 524, + 476, + 471, + 479, + 496, + 546, + 489, + 473, + 468, + 492, + 490, + 494, + 481, + 488, + 457, + 520, + 495, + 492, + 476, + 471, + 494, + 518, + 519, + 502, + 510, + 499, + 507, + 477, + 500, + 491, + 492, + 500, + 496, + 490, + 519, + 474, + 434, + 482, + 482, + 501, + 486, + 456, + 510, + 502, + 488, + 503, + 473, + 521, + 517, + 464, + 506, + 462, + 471, + 497, + 472, + 495, + 507, + 481, + 478, + 477, + 421, + 528, + 509, + 534, + 511, + 513, + 487, + 536, + 502, + 532, + 512, + 461, + 480, + 499, + 456, + 504, + 478, + 496, + 485, + 467, + 507, + 491, + 482, + 483, + 479, + 478, + 523, + 469, + 516, + 497, + 500, + 478, + 461, + 503, + 480, + 480, + 468, + 507, + 473, + 500, + 503, + 488, + 486, + 497, + 481, + 523, + 482, + 488, + 489, + 517, + 493, + 528, + 489, + 481, + 510, + 470, + 467, + 490, + 476, + 489, + 465, + 482, + 487, + 498, + 497, + 515, + 470, + 487, + 472, + 522, + 468, + 495, + 477, + 438, + 474, + 532, + 525, + 452, + 495, + 474, + 496, + 524, + 473, + 499, + 519, + 505, + 507, + 484, + 434, + 484, + 490, + 537, + 519, + 462, + 484, + 479, + 457, + 460, + 512, + 487, + 503, + 502, + 463, + 489, + 497, + 494, + 506, + 495, + 518, + 473, + 446, + 486, + 462, + 515, + 473, + 502, + 514, + 518, + 476, + 498, + 455, + 517, + 492, + 424, + 490, + 485, + 502, + 499, + 479, + 468, + 460, + 450, + 464, + 482, + 478, + 494, + 530, + 498, + 475, + 483, + 505, + 482, + 500, + 470, + 496, + 458, + 460, + 524, + 435, + 490, + 494, + 516, + 491, + 487, + 482, + 480, + 498, + 487, + 479, + 503, + 470, + 477, + 468, + 500, + 489, + 447, + 495, + 490, + 501, + 494, + 516, + 475, + 461, + 510, + 489, + 467, + 499, + 485, + 483, + 520, + 486, + 488, + 515, + 494, + 516, + 517, + 509, + 503, + 475, + 511, + 449, + 510, + 497, + 506, + 474, + 506, + 516, + 534, + 487, + 485, + 455, + 487, + 499, + 506, + 481, + 496, + 505, + 497, + 504, + 502, + 488, + 496, + 483, + 521, + 528, + 479, + 471, + 498, + 504, + 491, + 476, + 482, + 472, + 486, + 478, + 480, + 534, + 463, + 494, + 487, + 497, + 473, + 496, + 465, + 515, + 498, + 453, + 516, + 474, + 463, + 502, + 516, + 496, + 475, + 503, + 478, + 510, + 479, + 518, + 479, + 519, + 499, + 464, + 475, + 469, + 480, + 483, + 492, + 468, + 507, + 474, + 452, + 509, + 439, + 478, + 510, + 521, + 522, + 498, + 525, + 499, + 489, + 485, + 514, + 501, + 506, + 466, + 462, + 457, + 490, + 538, + 462, + 489, + 451, + 499, + 481, + 468, + 509, + 508, + 517, + 533, + 469, + 497, + 513, + 511, + 523, + 482, + 492, + 507, + 512, + 477, + 487, + 490, + 495, + 462, + 491, + 505, + 500, + 484, + 475, + 515, + 490, + 471, + 547, + 480, + 501, + 483, + 469, + 476, + 513, + 506, + 494, + 462, + 494, + 490, + 466, + 493, + 509, + 476, + 492, + 483, + 442, + 512, + 475, + 502, + 521, + 467, + 469, + 458, + 476, + 467, + 474, + 517, + 485, + 502, + 507, + 473, + 488, + 464, + 483, + 469, + 537, + 464, + 509, + 498, + 489, + 471, + 479, + 520, + 525, + 490, + 454, + 519, + 475, + 472, + 475, + 517, + 513, + 502, + 493, + 485, + 524, + 488, + 511, + 483, + 496, + 502, + 462, + 485, + 505, + 469, + 526, + 484, + 523, + 482, + 477, + 470, + 485, + 469, + 480, + 509, + 485, + 486, + 524, + 510, + 503, + 457, + 464, + 492, + 473, + 480, + 503, + 493, + 517, + 491, + 471, + 480, + 530, + 457, + 469, + 494, + 500, + 489, + 506, + 462, + 455, + 494, + 472, + 481, + 481, + 527, + 523, + 440, + 502, + 447, + 469, + 479, + 515, + 495, + 522, + 494, + 513, + 537, + 507, + 501, + 506, + 438, + 501, + 486, + 441, + 498, + 486, + 498, + 498, + 513, + 521, + 502, + 474, + 519, + 477, + 521, + 492, + 505, + 488, + 485, + 519, + 457, + 492, + 470, + 484, + 473, + 499, + 516, + 479, + 506, + 476, + 455, + 472, + 476, + 471, + 490, + 482, + 517, + 463, + 466, + 485, + 502, + 486, + 472, + 469, + 502, + 537, + 452, + 528, + 485, + 497, + 472, + 530, + 485, + 458, + 477, + 547, + 519, + 485, + 466, + 463, + 534, + 512, + 491, + 483, + 502, + 512, + 478, + 482, + 496, + 476, + 483, + 487, + 484, + 473, + 526, + 485, + 440, + 498, + 507, + 499, + 493, + 480, + 471, + 494, + 496, + 477, + 490, + 465, + 451, + 508, + 469, + 427, + 500, + 484, + 493, + 493, + 478, + 468, + 508, + 539, + 508, + 481, + 517, + 485, + 469, + 475, + 494, + 508, + 473, + 481, + 502, + 481, + 470, + 493, + 485, + 471, + 505, + 495, + 487, + 461, + 520, + 500, + 469, + 488, + 489, + 495, + 480, + 479, + 461, + 452, + 487, + 501, + 490, + 474, + 488, + 490, + 517, + 506, + 496, + 510, + 542, + 482, + 474, + 490, + 492, + 475, + 496, + 479, + 485, + 503, + 511, + 474, + 504, + 482, + 518, + 517, + 483, + 479, + 493, + 445, + 477, + 497, + 491, + 505, + 488, + 458, + 511, + 517, + 498, + 490, + 467, + 528, + 466, + 481, + 487, + 484, + 503, + 459, + 474, + 503, + 476, + 494, + 453, + 482, + 512, + 490, + 467, + 509, + 475, + 469, + 463, + 494, + 447, + 478, + 507, + 520, + 497, + 502, + 564, + 456, + 466, + 513, + 507, + 498, + 526, + 464, + 496, + 495, + 486, + 462, + 469, + 506, + 494, + 500, + 506, + 457, + 515, + 497, + 471, + 491, + 483, + 476, + 520, + 479, + 473, + 493, + 481, + 447, + 502, + 541, + 444, + 467, + 459, + 497, + 502, + 490, + 465, + 502, + 463, + 480, + 473, + 457, + 470, + 487, + 529, + 494, + 467, + 495, + 488, + 479, + 484, + 533, + 485, + 458, + 490, + 502, + 473, + 493, + 473, + 480, + 494, + 514, + 503, + 470, + 454, + 496, + 500, + 506, + 461, + 498, + 489, + 484, + 458, + 474, + 472, + 488, + 481, + 517, + 511, + 485, + 518, + 499, + 485, + 478, + 498, + 502, + 483, + 468, + 463, + 455, + 499, + 491 + ] + }, + { + "counters": [ + 529, + 495, + 464, + 493, + 511, + 495, + 481, + 475, + 475, + 471, + 481, + 520, + 471, + 499, + 479, + 524, + 517, + 483, + 474, + 486, + 530, + 516, + 499, + 464, + 501, + 540, + 452, + 486, + 496, + 495, + 510, + 517, + 483, + 507, + 485, + 466, + 496, + 436, + 506, + 501, + 484, + 479, + 472, + 486, + 441, + 515, + 515, + 479, + 482, + 499, + 483, + 487, + 475, + 507, + 504, + 495, + 485, + 466, + 534, + 489, + 533, + 475, + 511, + 492, + 489, + 502, + 465, + 486, + 462, + 463, + 520, + 508, + 488, + 477, + 478, + 485, + 478, + 515, + 507, + 513, + 522, + 478, + 452, + 482, + 470, + 464, + 492, + 459, + 465, + 491, + 494, + 507, + 489, + 470, + 448, + 455, + 531, + 490, + 516, + 498, + 488, + 483, + 469, + 521, + 476, + 516, + 478, + 468, + 489, + 456, + 492, + 485, + 513, + 481, + 503, + 488, + 492, + 492, + 484, + 497, + 479, + 472, + 457, + 466, + 478, + 482, + 468, + 468, + 460, + 475, + 495, + 479, + 481, + 464, + 496, + 466, + 468, + 474, + 487, + 487, + 477, + 513, + 468, + 473, + 463, + 523, + 480, + 454, + 479, + 439, + 492, + 474, + 468, + 502, + 489, + 515, + 490, + 485, + 456, + 461, + 506, + 491, + 457, + 471, + 499, + 473, + 526, + 506, + 514, + 466, + 454, + 470, + 494, + 500, + 487, + 485, + 508, + 459, + 518, + 498, + 496, + 514, + 463, + 496, + 466, + 461, + 507, + 493, + 481, + 479, + 491, + 508, + 485, + 472, + 524, + 482, + 473, + 504, + 495, + 531, + 509, + 483, + 490, + 462, + 505, + 469, + 484, + 446, + 502, + 484, + 496, + 463, + 485, + 442, + 479, + 518, + 510, + 463, + 452, + 488, + 516, + 514, + 507, + 448, + 501, + 496, + 484, + 451, + 543, + 535, + 509, + 532, + 474, + 457, + 504, + 513, + 503, + 460, + 456, + 468, + 475, + 509, + 496, + 465, + 501, + 526, + 481, + 494, + 472, + 513, + 503, + 505, + 451, + 491, + 513, + 508, + 504, + 479, + 475, + 477, + 469, + 512, + 518, + 492, + 514, + 458, + 497, + 484, + 509, + 493, + 500, + 474, + 470, + 496, + 468, + 495, + 491, + 504, + 505, + 460, + 435, + 489, + 459, + 478, + 505, + 538, + 485, + 465, + 511, + 473, + 480, + 459, + 495, + 480, + 475, + 476, + 482, + 500, + 499, + 490, + 470, + 455, + 502, + 448, + 491, + 450, + 457, + 484, + 487, + 503, + 523, + 454, + 501, + 506, + 483, + 492, + 468, + 464, + 483, + 486, + 491, + 483, + 466, + 480, + 482, + 498, + 497, + 512, + 464, + 526, + 533, + 471, + 481, + 453, + 484, + 516, + 521, + 503, + 501, + 509, + 491, + 477, + 481, + 516, + 466, + 466, + 463, + 503, + 519, + 503, + 493, + 469, + 484, + 477, + 449, + 454, + 488, + 482, + 511, + 466, + 467, + 488, + 455, + 491, + 463, + 479, + 486, + 508, + 485, + 473, + 482, + 445, + 457, + 487, + 466, + 486, + 505, + 490, + 483, + 490, + 468, + 466, + 519, + 498, + 508, + 499, + 446, + 478, + 505, + 495, + 472, + 502, + 465, + 470, + 481, + 462, + 502, + 499, + 469, + 505, + 513, + 485, + 504, + 491, + 470, + 467, + 488, + 503, + 499, + 477, + 510, + 458, + 518, + 484, + 481, + 531, + 482, + 523, + 470, + 509, + 491, + 496, + 491, + 477, + 443, + 484, + 486, + 463, + 485, + 479, + 495, + 453, + 480, + 504, + 484, + 458, + 498, + 498, + 487, + 536, + 499, + 496, + 516, + 480, + 492, + 470, + 492, + 446, + 524, + 484, + 493, + 508, + 486, + 535, + 494, + 477, + 504, + 505, + 473, + 472, + 523, + 501, + 507, + 514, + 454, + 513, + 501, + 502, + 490, + 477, + 476, + 452, + 477, + 483, + 481, + 464, + 504, + 476, + 500, + 511, + 501, + 470, + 470, + 496, + 502, + 475, + 502, + 504, + 480, + 497, + 475, + 486, + 491, + 508, + 523, + 519, + 479, + 473, + 452, + 450, + 479, + 487, + 512, + 490, + 503, + 482, + 492, + 486, + 464, + 500, + 488, + 538, + 517, + 487, + 497, + 442, + 484, + 487, + 523, + 507, + 460, + 459, + 503, + 508, + 459, + 515, + 515, + 506, + 502, + 468, + 489, + 482, + 461, + 524, + 473, + 465, + 500, + 513, + 474, + 496, + 476, + 490, + 505, + 517, + 449, + 495, + 494, + 523, + 492, + 484, + 460, + 505, + 499, + 494, + 498, + 460, + 496, + 496, + 488, + 463, + 523, + 490, + 509, + 522, + 499, + 477, + 486, + 460, + 468, + 463, + 494, + 509, + 482, + 489, + 477, + 497, + 498, + 518, + 450, + 444, + 486, + 501, + 503, + 473, + 490, + 516, + 506, + 458, + 504, + 464, + 452, + 476, + 475, + 474, + 463, + 500, + 454, + 529, + 508, + 491, + 481, + 475, + 471, + 485, + 479, + 468, + 492, + 450, + 481, + 487, + 468, + 481, + 507, + 463, + 448, + 492, + 522, + 498, + 456, + 499, + 468, + 455, + 491, + 504, + 502, + 519, + 502, + 533, + 482, + 459, + 469, + 502, + 502, + 463, + 468, + 530, + 453, + 472, + 483, + 503, + 475, + 478, + 484, + 506, + 493, + 485, + 475, + 510, + 465, + 483, + 472, + 493, + 496, + 506, + 457, + 515, + 485, + 456, + 465, + 499, + 497, + 472, + 477, + 491, + 472, + 448, + 470, + 474, + 513, + 485, + 465, + 488, + 447, + 490, + 478, + 532, + 498, + 547, + 454, + 490, + 473, + 504, + 492, + 471, + 497, + 486, + 512, + 484, + 444, + 495, + 479, + 460, + 482, + 516, + 505, + 480, + 500, + 511, + 472, + 495, + 487, + 483, + 486, + 504, + 463, + 441, + 542, + 475, + 496, + 485, + 489, + 463, + 475, + 468, + 487, + 507, + 501, + 479, + 443, + 492, + 453, + 460, + 497, + 474, + 468, + 452, + 501, + 503, + 482, + 456, + 472, + 469, + 456, + 470, + 504, + 497, + 513, + 454, + 520, + 494, + 506, + 493, + 501, + 459, + 504, + 531, + 466, + 514, + 465, + 519, + 475, + 500, + 504, + 504, + 476, + 500, + 470, + 477, + 496, + 484, + 484, + 506, + 481, + 515, + 491, + 508, + 506, + 477, + 497, + 478, + 515, + 500, + 516, + 451, + 480, + 487, + 514, + 478, + 457, + 489, + 447, + 496, + 465, + 516, + 469, + 465, + 496, + 500, + 492, + 478, + 461, + 496, + 479, + 498, + 511, + 476, + 474, + 482, + 471, + 486, + 497, + 517, + 506, + 451, + 510, + 494, + 484, + 529, + 535, + 474, + 500, + 510, + 501, + 499, + 526, + 471, + 496, + 484, + 491, + 471, + 488, + 495, + 443, + 474, + 487, + 476, + 493, + 435, + 494, + 494, + 475, + 477, + 500, + 502, + 479, + 474, + 505, + 466, + 472, + 466, + 463, + 541, + 522, + 481, + 501, + 481, + 489, + 454, + 520, + 477, + 467, + 505, + 466, + 503, + 480, + 538, + 490, + 481, + 509, + 479, + 493, + 512, + 473, + 481, + 467, + 468, + 476, + 489, + 489, + 488, + 483, + 475, + 512, + 488, + 512, + 479, + 459, + 475, + 457, + 538, + 483, + 455, + 498, + 471, + 486, + 468, + 504, + 450, + 514, + 485, + 460, + 510, + 532, + 467, + 467, + 496, + 478, + 475, + 443, + 456, + 488, + 509, + 463, + 508, + 490, + 488, + 469, + 514, + 495, + 470, + 512, + 428, + 495, + 483, + 484, + 509, + 532, + 499, + 491, + 515, + 472, + 504, + 508, + 478, + 523, + 539, + 481, + 478, + 515, + 505, + 460, + 500, + 470, + 507, + 483, + 438, + 479, + 510, + 475, + 481, + 522, + 471, + 508, + 560, + 496, + 457, + 453, + 483, + 484, + 466, + 493, + 519, + 457, + 478, + 486, + 489, + 503, + 494, + 484, + 483, + 497, + 532, + 475, + 499, + 474, + 481, + 487, + 432, + 495, + 480, + 503, + 505, + 515, + 466, + 479, + 463, + 498, + 502, + 451, + 503, + 482, + 484, + 499, + 503, + 462, + 483, + 510, + 537, + 480, + 468, + 508, + 490, + 514, + 451, + 507, + 517, + 517, + 478, + 461, + 436, + 502, + 511, + 503, + 475, + 513, + 485, + 462, + 489, + 476, + 500, + 496, + 497, + 470, + 501, + 492, + 455, + 465, + 528, + 468, + 519, + 463, + 516, + 501, + 476, + 491, + 444, + 480, + 499, + 491, + 472, + 510, + 484, + 497, + 494, + 479, + 519, + 505, + 527, + 506, + 488, + 494, + 499, + 514, + 468, + 476, + 477, + 513, + 496, + 471, + 532, + 486, + 469, + 488, + 527, + 489, + 473, + 475, + 504, + 485, + 520, + 479, + 472, + 508, + 475, + 493, + 498, + 464, + 446, + 471, + 463, + 471, + 500, + 491, + 490, + 543, + 500, + 513, + 521, + 473, + 481, + 467, + 425, + 461, + 476, + 455, + 472, + 510, + 489, + 469, + 510, + 499, + 489, + 469, + 495, + 488, + 514, + 467, + 525, + 497, + 512, + 517, + 500, + 479, + 461, + 479, + 517, + 522, + 491, + 478, + 508, + 498, + 458, + 504, + 480, + 460, + 481, + 527, + 528, + 484, + 474, + 481, + 462, + 462, + 483, + 497, + 486, + 494, + 535, + 466, + 441, + 495, + 489, + 469, + 497, + 510, + 519, + 475, + 483, + 503, + 473, + 509, + 511, + 487, + 464, + 495, + 468, + 501, + 498, + 509, + 502, + 480, + 488, + 511, + 451, + 483, + 518, + 484, + 530, + 488, + 543, + 487, + 476, + 474, + 479, + 519, + 514, + 500, + 493, + 506, + 469, + 457, + 514, + 469, + 475, + 476, + 490, + 505, + 472, + 511, + 499, + 469, + 482, + 456, + 510, + 475, + 483, + 500, + 453, + 504, + 483, + 498, + 457, + 481, + 507, + 493, + 459, + 480, + 463, + 479, + 475, + 454, + 517, + 484, + 473, + 464, + 460, + 505, + 515, + 483, + 520, + 504, + 466, + 497, + 491, + 490, + 500, + 500, + 487, + 493, + 467, + 501, + 463, + 501, + 450, + 457, + 503, + 486, + 468, + 483, + 482, + 494, + 497, + 468, + 483, + 447, + 454, + 457, + 474, + 461, + 473, + 500, + 463, + 496, + 510, + 475, + 506, + 475, + 468, + 488, + 504, + 475, + 479, + 462, + 505, + 509, + 530, + 527, + 477, + 492, + 445, + 500, + 469, + 465, + 526, + 505, + 486, + 496, + 497, + 462, + 516, + 509, + 479, + 523, + 473, + 502, + 456, + 496, + 488, + 459, + 453, + 472, + 466, + 439, + 526, + 484, + 482, + 533, + 496, + 480, + 494, + 459, + 503, + 477, + 475, + 504, + 499, + 458, + 496, + 502, + 494, + 465, + 479, + 522, + 448, + 472, + 509, + 465, + 524, + 497, + 490, + 482, + 539, + 467, + 483, + 510, + 498, + 486, + 504, + 522, + 481, + 487, + 448, + 444, + 514, + 498, + 459, + 484, + 511, + 519, + 475, + 501, + 492, + 518, + 476, + 493, + 501, + 498, + 480, + 501, + 489, + 483, + 498, + 527, + 464, + 535, + 551, + 486, + 460, + 501, + 501, + 478, + 503, + 479, + 511, + 418, + 504, + 508, + 474, + 476, + 443, + 464, + 490, + 498, + 476, + 466, + 498, + 449, + 504, + 494, + 484, + 455, + 470, + 496, + 519, + 490, + 510, + 516, + 473, + 487, + 504, + 496, + 475, + 486, + 499, + 458, + 505, + 526, + 470, + 494, + 538, + 505, + 468, + 497, + 488, + 515, + 508, + 493, + 471, + 467, + 484, + 468, + 516, + 518, + 469, + 497, + 521, + 472, + 523, + 495, + 494, + 487, + 502, + 496, + 489, + 493, + 453, + 510, + 495, + 468, + 492, + 477, + 509, + 511, + 449, + 508, + 490, + 476, + 473, + 464, + 495, + 516, + 475, + 550, + 470, + 445, + 481, + 504, + 468, + 513, + 474, + 485, + 495, + 499, + 504, + 505, + 472, + 474, + 510, + 482, + 453, + 547, + 484, + 473, + 505, + 496, + 495, + 517, + 504, + 480, + 506, + 543, + 476, + 515, + 470, + 493, + 472, + 465, + 527, + 510, + 508, + 453, + 466, + 492, + 463, + 503, + 494, + 447, + 468, + 538, + 479, + 464, + 500, + 505, + 474, + 496, + 479, + 470, + 507, + 480, + 492, + 494, + 482, + 471, + 492, + 456, + 502, + 480, + 493, + 453, + 475, + 466, + 510, + 512, + 480, + 469, + 524, + 508, + 487, + 472, + 476, + 479, + 531, + 462, + 509, + 434, + 478, + 489, + 489, + 527, + 441, + 536, + 497, + 508, + 494, + 502, + 459, + 443, + 513, + 503, + 470, + 511, + 453, + 495, + 517, + 543, + 455, + 509, + 431, + 523, + 476, + 538, + 488, + 481, + 487, + 505, + 527, + 458, + 494, + 511, + 424, + 511, + 506, + 482, + 467, + 481, + 538, + 457, + 487, + 520, + 479, + 508, + 491, + 472, + 499, + 518, + 460, + 486, + 494, + 505, + 505, + 489, + 520, + 473, + 487, + 488, + 448, + 499, + 498, + 493, + 491, + 450, + 507, + 521, + 500, + 442, + 476, + 497, + 483, + 467, + 490, + 538, + 479, + 448, + 509, + 469, + 533, + 473, + 447, + 501, + 503, + 484, + 475, + 504, + 455, + 519, + 466, + 497, + 470, + 497, + 490, + 501, + 510, + 479, + 504, + 487, + 498, + 490, + 474, + 464, + 484, + 470, + 536, + 486, + 469, + 496, + 511, + 490, + 492, + 539, + 496, + 519, + 455, + 476, + 463, + 432, + 491, + 523, + 495, + 463, + 516, + 514, + 518, + 500, + 485, + 501, + 515, + 492, + 508, + 453, + 507, + 449, + 473, + 492, + 506, + 494, + 529, + 502, + 499, + 525, + 488, + 495, + 486, + 527, + 492, + 501, + 512, + 456, + 462, + 468, + 492, + 480, + 499, + 460, + 448, + 500, + 491, + 485, + 470, + 455, + 443, + 481, + 480, + 488, + 485, + 476, + 463, + 514, + 483, + 515, + 464, + 460, + 465, + 476, + 447, + 475, + 521, + 500, + 458, + 495, + 468, + 495, + 487, + 517, + 473, + 479, + 501, + 498, + 491, + 519, + 496, + 508, + 478, + 496, + 516, + 489, + 486, + 491, + 487, + 494, + 461, + 487, + 496, + 488, + 510, + 479, + 479, + 499, + 476, + 482, + 500, + 522, + 488, + 476, + 493, + 504, + 517, + 509, + 505, + 472, + 511, + 452, + 477, + 469, + 493, + 542, + 472, + 498, + 475, + 509, + 499, + 486, + 484, + 516, + 524, + 477, + 490, + 550, + 511, + 452, + 493, + 532, + 489, + 463, + 496, + 467, + 439, + 486, + 497, + 476, + 493, + 498, + 521, + 475, + 521, + 423, + 469, + 515, + 484, + 492, + 496, + 459, + 444, + 473, + 463, + 494, + 453, + 469, + 510, + 473, + 457, + 492, + 533, + 548, + 485, + 466, + 496, + 485, + 466, + 510, + 454, + 475, + 512, + 491, + 510, + 495, + 495, + 490, + 488, + 417, + 479, + 471, + 502, + 479, + 488, + 501, + 497, + 493, + 468, + 502, + 479, + 497, + 512, + 455, + 457, + 504, + 474, + 495, + 517, + 476, + 492, + 475, + 490, + 502, + 467, + 493, + 540, + 512, + 470, + 490, + 517, + 515, + 463, + 480, + 500, + 495, + 438, + 468, + 488, + 478, + 504, + 468, + 499, + 468, + 514, + 484, + 512, + 519, + 490, + 476, + 483, + 513, + 483, + 491, + 505, + 493, + 493, + 493, + 465, + 497, + 477, + 497, + 468, + 448, + 496, + 483, + 480, + 482, + 495, + 483, + 506, + 518, + 486, + 501, + 482, + 442, + 489, + 516, + 487, + 458, + 496, + 527, + 467, + 454, + 485, + 489, + 496, + 469, + 468, + 523, + 470, + 480, + 477, + 471, + 506, + 480, + 522, + 499, + 479, + 483, + 537, + 466, + 485, + 490, + 534, + 468, + 500, + 514, + 494, + 489, + 480, + 511, + 509, + 488, + 544, + 492, + 478, + 536, + 447, + 465, + 490, + 457, + 501, + 501, + 533, + 498, + 486, + 456, + 491, + 487, + 477, + 494, + 501, + 492, + 472, + 459, + 491, + 490, + 461, + 499, + 485, + 489, + 476, + 477, + 503, + 476, + 483, + 470, + 496, + 450, + 467, + 472, + 500, + 488, + 482, + 471, + 490, + 494, + 482, + 486, + 551, + 502, + 510, + 496, + 495, + 524, + 521, + 504, + 483, + 488, + 487, + 489, + 506, + 525, + 469, + 495, + 473, + 462, + 495, + 472, + 507, + 480, + 507, + 517, + 509, + 503, + 504, + 478, + 541, + 471, + 517, + 520, + 516, + 506, + 515, + 479, + 496, + 473, + 469, + 459, + 488, + 487, + 463, + 493, + 492, + 484, + 487, + 462, + 475, + 493, + 541, + 492, + 480, + 492, + 522, + 522, + 463, + 490, + 485, + 540, + 482, + 500, + 520, + 468, + 529, + 478, + 522, + 527, + 465, + 430, + 501, + 485, + 474, + 517, + 509, + 491, + 484, + 468, + 505 + ] + } + ], + "default_value": 0 + }, + "null_count": 0, + "tot_col_size": 0, + "last_update_version": 417600050823954432, + "correlation": 0 + } + }, + "ext_stats": [ + { + "stats_name": "stats1", + "db": "test", + "cols": [ + 1, + 2 + ], + "type": 2, + "scalar_vals": -1, + "string_vals": "" + } + ], + "count": 1000000, + "modify_count": 0, + "partitions": null +} \ No newline at end of file diff --git a/planner/core/testdata/analyze_suite_in.json b/planner/core/testdata/analyze_suite_in.json index 1187de96f090e..4a9a640299a03 100644 --- a/planner/core/testdata/analyze_suite_in.json +++ b/planner/core/testdata/analyze_suite_in.json @@ -5,42 +5,42 @@ // Pseudo stats. [ "set session tidb_opt_correlation_exp_factor = 0", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1;" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1;" ], // Positive correlation. [ "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(13, 1),(14, 1),(15, 1),(16, 1),(17, 1),(18, 1),(19, 1),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], // Negative correlation. [ "truncate table t", "insert into t (a, b) values (1, 25),(2, 24),(3, 23),(4, 23),(5, 21),(6, 20),(7, 19),(8, 18),(9, 17),(10, 16),(11, 15),(12, 14),(13, 13),(14, 12),(15, 11),(16, 10),(17, 9),(18, 8),(19, 7),(20, 6),(21, 5),(22, 4),(23, 3),(24, 2),(25, 1)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b <= 6 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b <= 6 ORDER BY a limit 1" ], // Outer plan of index join (to test that correct column ID is used). [ - "EXPLAIN SELECT *, t1.a IN (SELECT t2.b FROM t t2) FROM t t1 WHERE t1.b <= 6 ORDER BY t1.a limit 1" + "explain format = 'brief' SELECT *, t1.a IN (SELECT t2.b FROM t t2) FROM t t1 WHERE t1.b <= 6 ORDER BY t1.a limit 1" ], // Desc TableScan. [ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 2),(8, 2),(9, 2),(10, 2),(11, 2),(12, 2),(13, 2),(14, 2),(15, 2),(16, 2),(17, 2),(18, 2),(19, 2),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 1 ORDER BY a desc limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 1 ORDER BY a desc limit 1" ], // Correlation threshold not met. [ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 2),(10, 1),(11, 1),(12, 1),(13, 1),(14, 2),(15, 2),(16, 1),(17, 2),(18, 1),(19, 2),(20, 1),(21, 2),(22, 1),(23, 1),(24, 1),(25, 1)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], [ "set session tidb_opt_correlation_exp_factor = 1", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], // TableScan has access conditions, but correlation is 1. [ @@ -48,7 +48,7 @@ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(13, 1),(14, 1),(15, 1),(16, 1),(17, 1),(18, 1),(19, 1),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 and a > 0 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 and a > 0 ORDER BY a limit 1" ], // Multi-column filter. [ @@ -56,7 +56,7 @@ "create table t(a int primary key, b int, c int, d bigint default 2147483648, e bigint default 2147483648, f bigint default 2147483648, index idx(b,d,a,c))", "insert into t(a, b, c) values (1, 1, 1),(2, 1, 2),(3, 1, 1),(4, 1, 2),(5, 1, 1),(6, 1, 2),(7, 1, 1),(8, 1, 2),(9, 1, 1),(10, 1, 2),(11, 1, 1),(12, 1, 2),(13, 1, 1),(14, 1, 2),(15, 1, 1),(16, 1, 2),(17, 1, 1),(18, 1, 2),(19, 1, 1),(20, 2, 2),(21, 2, 1),(22, 2, 2),(23, 2, 1),(24, 2, 2),(25, 2, 1)", "analyze table t", - "EXPLAIN SELECT a FROM t WHERE b = 2 and c > 0 ORDER BY a limit 1" + "explain format = 'brief' SELECT a FROM t WHERE b = 2 and c > 0 ORDER BY a limit 1" ] ] }, @@ -66,11 +66,11 @@ [ "create table t1(a bigint, b bigint, c bigint)", "create table t2(a bigint, b bigint, c bigint, index idx(a, b, c))", - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t2.a=t1.a and t2.b>t1.b-1 and t2.bt1.b-1 and t2.b= 999900 order by b limit 1" ] } ] diff --git a/planner/core/testdata/analyze_suite_out.json b/planner/core/testdata/analyze_suite_out.json index 8d42349bb20fc..d902165db2dfe 100644 --- a/planner/core/testdata/analyze_suite_out.json +++ b/planner/core/testdata/analyze_suite_out.json @@ -5,26 +5,26 @@ { "SQL": [ "set session tidb_opt_correlation_exp_factor = 0", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1;" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1;" ], "Plan": [ - "TopN_8 1.00 root test.t.a, offset:0, count:1", - "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─IndexRangeScan_14 10.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false, stats:pseudo" + "TopN 1.00 root test.t.a, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─IndexRangeScan 10.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false, stats:pseudo" ] }, { "SQL": [ "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(13, 1),(14, 1),(15, 1),(16, 1),(17, 1),(18, 1),(19, 1),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root test.t.a, offset:0, count:1", - "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─IndexRangeScan_14 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" + "TopN 1.00 root test.t.a, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" ] }, { @@ -32,28 +32,28 @@ "truncate table t", "insert into t (a, b) values (1, 25),(2, 24),(3, 23),(4, 23),(5, 21),(6, 20),(7, 19),(8, 18),(9, 17),(10, 16),(11, 15),(12, 14),(13, 13),(14, 12),(15, 11),(16, 10),(17, 9),(18, 8),(19, 7),(20, 6),(21, 5),(22, 4),(23, 3),(24, 2),(25, 1)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b <= 6 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b <= 6 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root test.t.a, offset:0, count:1", - "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─IndexRangeScan_14 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[-inf,6], keep order:false" + "TopN 1.00 root test.t.a, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[-inf,6], keep order:false" ] }, { "SQL": [ - "EXPLAIN SELECT *, t1.a IN (SELECT t2.b FROM t t2) FROM t t1 WHERE t1.b <= 6 ORDER BY t1.a limit 1" + "explain format = 'brief' SELECT *, t1.a IN (SELECT t2.b FROM t t2) FROM t t1 WHERE t1.b <= 6 ORDER BY t1.a limit 1" ], "Plan": [ - "Limit_17 1.00 root offset:0, count:1", - "└─IndexMergeJoin_72 1.00 root left outer semi join, inner:IndexReader_70, outer key:test.t.a, inner key:test.t.b", - " ├─TopN_29(Build) 1.00 root test.t.a, offset:0, count:1", - " │ └─IndexReader_37 1.00 root index:TopN_36", - " │ └─TopN_36 1.00 cop[tikv] test.t.a, offset:0, count:1", - " │ └─IndexRangeScan_35 6.00 cop[tikv] table:t1, index:idx_bc(b, c) range:[-inf,6], keep order:false", - " └─IndexReader_70(Probe) 1.04 root index:IndexRangeScan_69", - " └─IndexRangeScan_69 1.04 cop[tikv] table:t2, index:idx_bc(b, c) range: decided by [eq(test.t.b, test.t.a)], keep order:true" + "Limit 1.00 root offset:0, count:1", + "└─IndexJoin 1.00 root left outer semi join, inner:IndexReader, outer key:test.t.a, inner key:test.t.b, equal cond:eq(test.t.a, test.t.b)", + " ├─TopN(Build) 1.00 root test.t.a, offset:0, count:1", + " │ └─IndexReader 1.00 root index:TopN", + " │ └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " │ └─IndexRangeScan 6.00 cop[tikv] table:t1, index:idx_bc(b, c) range:[-inf,6], keep order:false", + " └─IndexReader(Probe) 1.04 root index:IndexRangeScan", + " └─IndexRangeScan 1.04 cop[tikv] table:t2, index:idx_bc(b, c) range: decided by [eq(test.t.b, test.t.a)], keep order:false" ] }, { @@ -61,13 +61,13 @@ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 2),(8, 2),(9, 2),(10, 2),(11, 2),(12, 2),(13, 2),(14, 2),(15, 2),(16, 2),(17, 2),(18, 2),(19, 2),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 1 ORDER BY a desc limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 1 ORDER BY a desc limit 1" ], "Plan": [ - "TopN_8 1.00 root test.t.a:desc, offset:0, count:1", - "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] test.t.a:desc, offset:0, count:1", - " └─IndexRangeScan_14 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[1,1], keep order:false" + "TopN 1.00 root test.t.a:desc, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a:desc, offset:0, count:1", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[1,1], keep order:false" ] }, { @@ -75,26 +75,26 @@ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 2),(10, 1),(11, 1),(12, 1),(13, 1),(14, 2),(15, 2),(16, 1),(17, 2),(18, 1),(19, 2),(20, 1),(21, 2),(22, 1),(23, 1),(24, 1),(25, 1)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], "Plan": [ - "Limit_11 1.00 root offset:0, count:1", - "└─TableReader_22 1.00 root data:Limit_21", - " └─Limit_21 1.00 cop[tikv] offset:0, count:1", - " └─Selection_20 1.00 cop[tikv] eq(test.t.b, 2)", - " └─TableFullScan_19 4.17 cop[tikv] table:t keep order:true" + "Limit 1.00 root offset:0, count:1", + "└─TableReader 1.00 root data:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─Selection 1.00 cop[tikv] eq(test.t.b, 2)", + " └─TableFullScan 4.17 cop[tikv] table:t keep order:true" ] }, { "SQL": [ "set session tidb_opt_correlation_exp_factor = 1", - "EXPLAIN SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root test.t.a, offset:0, count:1", - "└─IndexReader_16 1.00 root index:TopN_15", - " └─TopN_15 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─IndexRangeScan_14 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" + "TopN 1.00 root test.t.a, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" ] }, { @@ -103,14 +103,14 @@ "truncate table t", "insert into t (a, b) values (1, 1),(2, 1),(3, 1),(4, 1),(5, 1),(6, 1),(7, 1),(8, 1),(9, 1),(10, 1),(11, 1),(12, 1),(13, 1),(14, 1),(15, 1),(16, 1),(17, 1),(18, 1),(19, 1),(20, 2),(21, 2),(22, 2),(23, 2),(24, 2),(25, 2)", "analyze table t", - "EXPLAIN SELECT * FROM t WHERE b = 2 and a > 0 ORDER BY a limit 1" + "explain format = 'brief' SELECT * FROM t WHERE b = 2 and a > 0 ORDER BY a limit 1" ], "Plan": [ - "TopN_8 1.00 root test.t.a, offset:0, count:1", - "└─IndexReader_19 1.00 root index:TopN_18", - " └─TopN_18 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─Selection_17 6.00 cop[tikv] gt(test.t.a, 0)", - " └─IndexRangeScan_16 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" + "TopN 1.00 root test.t.a, offset:0, count:1", + "└─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─Selection 6.00 cop[tikv] gt(test.t.a, 0)", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx_bc(b, c) range:[2,2], keep order:false" ] }, { @@ -119,15 +119,15 @@ "create table t(a int primary key, b int, c int, d bigint default 2147483648, e bigint default 2147483648, f bigint default 2147483648, index idx(b,d,a,c))", "insert into t(a, b, c) values (1, 1, 1),(2, 1, 2),(3, 1, 1),(4, 1, 2),(5, 1, 1),(6, 1, 2),(7, 1, 1),(8, 1, 2),(9, 1, 1),(10, 1, 2),(11, 1, 1),(12, 1, 2),(13, 1, 1),(14, 1, 2),(15, 1, 1),(16, 1, 2),(17, 1, 1),(18, 1, 2),(19, 1, 1),(20, 2, 2),(21, 2, 1),(22, 2, 2),(23, 2, 1),(24, 2, 2),(25, 2, 1)", "analyze table t", - "EXPLAIN SELECT a FROM t WHERE b = 2 and c > 0 ORDER BY a limit 1" + "explain format = 'brief' SELECT a FROM t WHERE b = 2 and c > 0 ORDER BY a limit 1" ], "Plan": [ - "Projection_7 1.00 root test.t.a", - "└─TopN_8 1.00 root test.t.a, offset:0, count:1", - " └─IndexReader_17 1.00 root index:TopN_16", - " └─TopN_16 1.00 cop[tikv] test.t.a, offset:0, count:1", - " └─Selection_15 6.00 cop[tikv] gt(test.t.c, 0)", - " └─IndexRangeScan_14 6.00 cop[tikv] table:t, index:idx(b, d, a, c) range:[2,2], keep order:false" + "Projection 1.00 root test.t.a", + "└─TopN 1.00 root test.t.a, offset:0, count:1", + " └─IndexReader 1.00 root index:TopN", + " └─TopN 1.00 cop[tikv] test.t.a, offset:0, count:1", + " └─Selection 6.00 cop[tikv] gt(test.t.c, 0)", + " └─IndexRangeScan 6.00 cop[tikv] table:t, index:idx(b, d, a, c) range:[2,2], keep order:false" ] } ] @@ -139,32 +139,32 @@ "SQL": [ "create table t1(a bigint, b bigint, c bigint)", "create table t2(a bigint, b bigint, c bigint, index idx(a, b, c))", - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t2.a=t1.a and t2.b>t1.b-1 and t2.bt1.b-1 and t2.bColumn#13", - " └─HashJoin_23 1.00 root inner join, equal:[eq(test.t.a, test.t.a)]", - " ├─TableReader_33(Build) 1.00 root data:Selection_32", - " │ └─Selection_32 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", - " │ └─TableFullScan_31 10.00 cop[tikv] table:t1 keep order:false", - " └─TableReader_27(Probe) 1.00 root data:Selection_26", - " └─Selection_26 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", - " └─TableFullScan_25 10.00 cop[tikv] table:s keep order:false" + "Projection 10.00 root Column#14", + "└─Apply 10.00 root CARTESIAN left outer semi join, other cond:eq(test.t.c, Column#13)", + " ├─TableReader(Build) 10.00 root data:TableFullScan", + " │ └─TableFullScan 10.00 cop[tikv] table:t keep order:false", + " └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#13", + " └─HashJoin 1.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─TableReader(Build) 1.00 root data:Selection", + " │ └─Selection 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", + " │ └─TableFullScan 10.00 cop[tikv] table:t1 keep order:false", + " └─TableReader(Probe) 1.00 root data:Selection", + " └─Selection 1.00 cop[tikv] eq(test.t.a, test.t.a), not(isnull(test.t.a))", + " └─TableFullScan 10.00 cop[tikv] table:s keep order:false" ], [ - "Projection_8 10.00 root Column#9", - "└─Apply_10 10.00 root CARTESIAN left outer join", - " ├─TableReader_12(Build) 10.00 root data:TableFullScan_11", - " │ └─TableFullScan_11 10.00 cop[tikv] table:t keep order:false", - " └─MaxOneRow_15(Probe) 1.00 root ", - " └─Projection_16 0.10 root concat(cast(test.t.a, var_string(20)), ,, cast(test.t.b, var_string(20)))->Column#9", - " └─IndexReader_19 0.10 root index:Selection_18", - " └─Selection_18 0.10 cop[tikv] eq(test.t.a, test.t.a)", - " └─IndexRangeScan_17 1.00 cop[tikv] table:t1, index:idx(c, b, a) range: decided by [eq(test.t.c, test.t.c)], keep order:false" + "Projection 10.00 root Column#9", + "└─Apply 10.00 root CARTESIAN left outer join", + " ├─TableReader(Build) 10.00 root data:TableFullScan", + " │ └─TableFullScan 10.00 cop[tikv] table:t keep order:false", + " └─MaxOneRow(Probe) 1.00 root ", + " └─Projection 0.10 root concat(cast(test.t.a, var_string(20)), ,, cast(test.t.b, var_string(20)))->Column#9", + " └─IndexReader 0.10 root index:Selection", + " └─Selection 0.10 cop[tikv] eq(test.t.a, test.t.a)", + " └─IndexRangeScan 1.00 cop[tikv] table:t1, index:idx(c, b, a) range: decided by [eq(test.t.c, test.t.c)], keep order:false" ] ] }, @@ -294,14 +294,14 @@ "Name": "TestLowSelIndexGreedySearch", "Cases": [ { - "SQL": "explain select max(e) from t where a='T3382' and b='ECO' and c='TOPIC' and d='23660fa1ace9455cb7f3ee831e14a342'", + "SQL": "explain format = 'brief' select max(e) from t where a='T3382' and b='ECO' and c='TOPIC' and d='23660fa1ace9455cb7f3ee831e14a342'", "Plan": [ - "StreamAgg_14 1.00 root funcs:max(test.t.e)->Column#7", - "└─TopN_17 0.00 root test.t.e:desc, offset:0, count:1", - " └─IndexLookUp_49 0.00 root ", - " ├─IndexRangeScan_46(Build) 0.00 cop[tikv] table:t, index:idx2(a, c) range:[\"T3382\" \"TOPIC\",\"T3382\" \"TOPIC\"], keep order:false", - " └─Selection_48(Probe) 0.00 cop[tikv] eq(test.t.b, \"ECO\"), eq(test.t.d, \"23660fa1ace9455cb7f3ee831e14a342\"), not(isnull(test.t.e))", - " └─TableRowIDScan_47 0.00 cop[tikv] table:t keep order:false" + "StreamAgg 1.00 root funcs:max(test.t.e)->Column#7", + "└─TopN 0.00 root test.t.e:desc, offset:0, count:1", + " └─IndexLookUp 0.00 root ", + " ├─IndexRangeScan(Build) 0.00 cop[tikv] table:t, index:idx2(a, c) range:[\"T3382\" \"TOPIC\",\"T3382\" \"TOPIC\"], keep order:false", + " └─Selection(Probe) 0.00 cop[tikv] eq(test.t.b, \"ECO\"), eq(test.t.d, \"23660fa1ace9455cb7f3ee831e14a342\"), not(isnull(test.t.e))", + " └─TableRowIDScan 0.00 cop[tikv] table:t keep order:false" ] } ] @@ -352,8 +352,8 @@ "IndexLookUp(Index(t1.a)[[1,1]], Table(t1)->Sel([le(test.t1.b, 2)]))", "TableReader(Table(t2)->Sel([le(test.t2.a, 2)]))", "Analyze{Index(a),Index(b)}", - "TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))", - "IndexReader(Index(t4.b)[[-inf,2)])", + "PartitionUnionAll{TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))->TableReader(Table(t4)->Sel([le(test.t4.a, 2)]))}", + "PartitionUnionAll{IndexReader(Index(t4.b)[[-inf,2)])->IndexReader(Index(t4.b)[[-inf,2)])}", "TableReader(Table(t4)->Sel([eq(test.t4.a, 1) le(test.t4.b, 2)]))" ] }, @@ -361,20 +361,46 @@ "Name": "TestIndexEqualUnknown", "Cases": [ { - "SQL": "explain select * from t where a = 7639902", + "SQL": "explain format = 'brief' select * from t where a = 7639902", "Plan": [ - "IndexReader_6 6.68 root index:IndexRangeScan_5", - "└─IndexRangeScan_5 6.68 cop[tikv] table:t, index:PRIMARY(a, c, b) range:[7639902,7639902], keep order:false" + "IndexReader 6.68 root index:IndexRangeScan", + "└─IndexRangeScan 6.68 cop[tikv] table:t, index:PRIMARY(a, c, b) range:[7639902,7639902], keep order:false" ] }, { - "SQL": "explain select c, b from t where a = 7639902 order by b asc limit 6", + "SQL": "explain format = 'brief' select c, b from t where a = 7639902 order by b asc limit 6", "Plan": [ - "Projection_7 6.00 root test.t.c, test.t.b", - "└─TopN_8 6.00 root test.t.b, offset:0, count:6", - " └─IndexReader_16 6.00 root index:TopN_15", - " └─TopN_15 6.00 cop[tikv] test.t.b, offset:0, count:6", - " └─IndexRangeScan_14 6.68 cop[tikv] table:t, index:PRIMARY(a, c, b) range:[7639902,7639902], keep order:false" + "Projection 6.00 root test.t.c, test.t.b", + "└─TopN 6.00 root test.t.b, offset:0, count:6", + " └─IndexReader 6.00 root index:TopN", + " └─TopN 6.00 cop[tikv] test.t.b, offset:0, count:6", + " └─IndexRangeScan 6.68 cop[tikv] table:t, index:PRIMARY(a, c, b) range:[7639902,7639902], keep order:false" + ] + } + ] + }, + { + "Name": "TestLimitIndexEstimation", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where a <= 10000 order by b limit 1", + "Plan": [ + "TopN 1.00 root test.t.b, offset:0, count:1", + "└─IndexLookUp 1.00 root ", + " ├─IndexRangeScan(Build) 10000.00 cop[tikv] table:t, index:idx_a(a) range:[-inf,10000], keep order:false", + " └─TopN(Probe) 1.00 cop[tikv] test.t.b, offset:0, count:1", + " └─TableRowIDScan 10000.00 cop[tikv] table:t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where a >= 999900 order by b limit 1", + "Plan": [ + "Limit 1.00 root offset:0, count:1", + "└─Projection 1.00 root test.t.a, test.t.b", + " └─IndexLookUp 1.00 root ", + " ├─IndexFullScan(Build) 1.00 cop[tikv] table:t, index:idx_b(b) keep order:true", + " └─Selection(Probe) 1.00 cop[tikv] ge(test.t.a, 999900)", + " └─TableRowIDScan 1.00 cop[tikv] table:t keep order:false" ] } ] diff --git a/planner/core/testdata/index_merge_suite_out.json b/planner/core/testdata/index_merge_suite_out.json index c8bdfd58581a7..4fdd67789e205 100644 --- a/planner/core/testdata/index_merge_suite_out.json +++ b/planner/core/testdata/index_merge_suite_out.json @@ -4,10 +4,10 @@ "Cases": [ "[]", "[]", - "[{Idxs:[c_d_e,f_g],TbFilters:[]}]", - "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2))]}]", - "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(gt(test.t.c, 5), lt(test.t.f, 7))]}]", - "[{Idxs:[c_d_e,f_g],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.e, 1), gt(test.t.f, 2))]},{Idxs:[c_d_e,f_g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.e, 1), gt(test.t.f, 2))]}]" + "[{Idxs:[c_d_e,f],TbFilters:[]}]", + "[{Idxs:[c_d_e,f],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7))]},{Idxs:[c_d_e,f],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2))]}]", + "[{Idxs:[c_d_e,f],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,f],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.c, 1), gt(test.t.g, 2))]},{Idxs:[c_d_e,g],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(gt(test.t.c, 5), lt(test.t.f, 7))]}]", + "[{Idxs:[c_d_e,f],TbFilters:[or(gt(test.t.c, 5), lt(test.t.f, 7)),or(lt(test.t.e, 1), gt(test.t.f, 2))]},{Idxs:[c_d_e,f],TbFilters:[or(lt(test.t.c, 1), gt(test.t.f, 2)),or(lt(test.t.e, 1), gt(test.t.f, 2))]}]" ] } ] diff --git a/planner/core/testdata/integration_serial_suite_in.json b/planner/core/testdata/integration_serial_suite_in.json index f657c164539bd..3cf074702280d 100644 --- a/planner/core/testdata/integration_serial_suite_in.json +++ b/planner/core/testdata/integration_serial_suite_in.json @@ -2,72 +2,220 @@ { "name": "TestSelPushDownTiFlash", "cases": [ - "explain select * from t where t.a > 1 and t.b = \"flash\" or t.a + 3 * t.a = 5", - "explain select * from t where cast(t.a as float) + 3 = 5.1", - "explain select * from t where b > 'a' order by convert(b, unsigned) limit 2", - "explain select * from t where b > 'a' order by b limit 2" + "explain format = 'brief' select * from t where t.a > 1 and t.b = \"flash\" or t.a + 3 * t.a = 5", + "explain format = 'brief' select * from t where cast(t.a as float) + 3 = 5.1", + "explain format = 'brief' select * from t where b > 'a' order by convert(b, unsigned) limit 2", + "explain format = 'brief' select * from t where b > 'a' order by b limit 2" + ] + }, + { + "name": "TestMPPJoin", + "cases": [ + "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)" + ] + }, + { + "name": "TestMPPShuffledJoin", + "cases": [ + "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d1_k = d2_t.value and fact_t.d1_k = d3_t.value", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "explain format = 'brief' select count(*) from (select case when t1.col1 is null then t2.col1 + 5 else 10 end as col1, t2.d1_k as d1_k from fact_t t1 right join fact_t t2 on t1.d1_k = t2.d1_k) fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 5", + "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)" ] }, { "name": "TestBroadcastJoin", "cases": [ - "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", - "explain select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", - "explain select /*+ broadcast_join(fact_t,d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", - "explain select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t), broadcast_join_local(d2_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", - "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", - "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k" + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t), broadcast_join_local(d2_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)" + ] + }, + { + "name": "TestJoinNotSupportedByTiFlash", + "cases": [ + "explain format = 'brief' select * from table_1 a, table_1 b where a.bit_col = b.bit_col", + "explain format = 'brief' select * from table_1 a left join table_1 b on a.id = b.id and dayofmonth(a.datetime_col) > 100", + "explain format = 'brief' select * from table_1 a right join table_1 b on a.id = b.id and dayofmonth(b.datetime_col) > 100", + "explain format = 'brief' select * from table_1 a join table_1 b on a.id = b.id and dayofmonth(a.datetime_col) > dayofmonth(b.datetime_col)" + ] + }, + { + "name": "TestMPPNotSupportedInNewCollation", + "cases": [ + "explain format = 'brief' select * from table_1 a, table_1 b where a.id = b.id", + "explain format = 'brief' select /*+ agg_to_cop() */ count(*), id from table_1 group by id" ] }, { "name": "TestReadFromStorageHint", "cases": [ - "desc select avg(a) from t", - "desc select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", - "desc select /*+ read_from_storage(tiflash[t]) */ sum(a) from t", - "desc select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t", - "desc select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t", - "desc select /*+ READ_FROM_STORAGE(TIKV[t1], TIKV[t2]) */ * from t t1, t t2 where t1.a = t2.a", - "desc select /*+ READ_FROM_STORAGE(TIKV[t1], TIFLASH[t2]) */ * from t t1, t t2 where t1.a = t2.a", - "desc select * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", - "desc select /*+ read_from_storage(tiflash[tt]) */ * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", - "desc select * from ttt order by ttt.a desc", - "desc select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a desc", - "desc select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a", - "desc select /*+ read_from_storage(tikv[t, ttt]) */ * from ttt", - "desc select /*+ read_from_storage(tiflash[t, ttt], tikv[tt]) */ * from ttt" + "desc format = 'brief' select avg(a) from t", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a) from t", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t", + "desc format = 'brief' select /*+ READ_FROM_STORAGE(TIKV[t1], TIKV[t2]) */ * from t t1, t t2 where t1.a = t2.a", + "desc format = 'brief' select /*+ READ_FROM_STORAGE(TIKV[t1], TIFLASH[t2]) */ * from t t1, t t2 where t1.a = t2.a", + "desc format = 'brief' select * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", + "desc format = 'brief' select /*+ read_from_storage(tiflash[tt]) */ * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", + "desc format = 'brief' select * from ttt order by ttt.a desc", + "desc format = 'brief' select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a desc", + "desc format = 'brief' select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a", + "desc format = 'brief' select /*+ read_from_storage(tikv[t, ttt]) */ * from ttt", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t, ttt], tikv[tt]) */ * from ttt" ] }, { "name": "TestReadFromStorageHintAndIsolationRead", "cases": [ - "desc select /*+ read_from_storage(tikv[t], tiflash[t]) */ avg(a) from t", - "desc select /*+ read_from_storage(tikv[t]) */ avg(a) from t", - "desc select /*+ read_from_storage(tiflash[t]) */ avg(a) from t" + "desc format = 'brief' select /*+ read_from_storage(tikv[t], tiflash[t]) */ avg(a) from t", + "desc format = 'brief' select /*+ read_from_storage(tikv[t]) */ avg(a) from t", + "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ avg(a) from t" ] }, { "name": "TestIsolationReadDoNotFilterSystemDB", "cases": [ - "desc select * from metrics_schema.tidb_query_duration where time >= '2019-12-23 16:10:13' and time <= '2019-12-23 16:30:13'", - "desc select * from information_schema.tables", - "desc select * from mysql.stats_meta" + "desc format = 'brief' select * from metrics_schema.tidb_query_duration where time >= '2019-12-23 16:10:13' and time <= '2019-12-23 16:30:13'", + "desc format = 'brief' select * from information_schema.tables", + "desc format = 'brief' select * from mysql.stats_meta" ] }, { "name": "TestIsolationReadTiFlashNotChoosePointGet", "cases": [ - "explain select * from t where t.a = 1", - "explain select * from t where t.a in (1, 2)" + "explain format = 'brief' select * from t where t.a = 1", + "explain format = 'brief' select * from t where t.a in (1, 2)" ] }, { "name": "TestIsolationReadTiFlashUseIndexHint", "cases": [ - "explain select * from t", - "explain select * from t use index();", - "explain select /*+ use_index(t, idx)*/ * from t", - "explain select /*+ use_index(t)*/ * from t" + "explain format = 'brief' select * from t", + "explain format = 'brief' select * from t use index();", + "explain format = 'brief' select /*+ use_index(t, idx)*/ * from t", + "explain format = 'brief' select /*+ use_index(t)*/ * from t" + ] + }, + { + "name": "TestIssue20710", + "cases": [ + "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b", + "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a", + "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b", + "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.b = s.b", + "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.b = s.a", + "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.a = s.b" + ] + }, + { + "name": "TestPushDownProjectionForTiFlash", + "cases": [ + "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "desc format = 'brief' select A.id from t as A where exists (select 1 from t where t.id=A.id)", + "desc format = 'brief' select A.id from t as A where not exists (select 1 from t where t.id=A.id)" + ] + }, + { + "name": "TestPushDownProjectionForMPP", + "cases": [ + "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", + "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "desc format = 'brief' select id from t as A where exists (select 1 from t where t.id=A.id)", + "desc format = 'brief' select id from t as A where not exists (select 1 from t where t.id=A.id)" + ] + }, + { + "name": "TestPushDownAggForMPP", + "cases": [ + "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id+1 from t)A", + "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "desc format = 'brief' select count(*) from t", + "desc format = 'brief' select count(*), id from t group by id", + "desc format = 'brief' select count(*), id + 1 from t group by id + 1", + "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", + "desc format = 'brief' select * from t join ( select /*+ hash_agg()*/ count(*) as a from t) as A on A.a = t.id", + "desc format = 'brief' select avg(value) as b,id from t group by id", + "desc format = 'brief' select /*+hash_agg()*/ sum(b),id from (select avg(value) as b, id from t group by id)A", + "desc format = 'brief' select id from t group by id having avg(value)>0", + "desc format = 'brief' select avg(value),id from t group by id having avg(value)>0", + "desc format = 'brief' select avg(value) +1,id from t group by id", + "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", + "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id", + "desc format = 'brief' select count(distinct value),id from t group by id", + "desc format = 'brief' select count(distinct value),sum(distinct value),id from t group by id", + "desc format = 'brief' select * from t join ( select count(distinct value), id from t group by id) as A on A.id = t.id", + "desc format = 'brief' select * from t join ( select count(1/value), id from t group by id) as A on A.id = t.id" + ] + }, + { + "name": "TestMppAggWithJoin", + "cases": [ + "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", + "desc format = 'brief' select * from t join ( select count(*)+id as v from t group by id) as A on A.v = t.id", + "desc format = 'brief' select * from t join ( select count(*) as v, id from t group by value,id having value+v <10) as A on A.id = t.id", + "desc format = 'brief' select * from t join ( select /*+ hash_agg()*/ count(*) as a from t) as A on A.a = t.id", + "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", + "desc format = 'brief' select * from (select id from t group by id) C join (select sum(value),id from t group by id)B on C.id=B.id", + "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id" ] } ] diff --git a/planner/core/testdata/integration_serial_suite_out.json b/planner/core/testdata/integration_serial_suite_out.json index de270dae6feac..63fc11c2a2a59 100644 --- a/planner/core/testdata/integration_serial_suite_out.json +++ b/planner/core/testdata/integration_serial_suite_out.json @@ -3,40 +3,574 @@ "Name": "TestSelPushDownTiFlash", "Cases": [ { - "SQL": "explain select * from t where t.a > 1 and t.b = \"flash\" or t.a + 3 * t.a = 5", + "SQL": "explain format = 'brief' select * from t where t.a > 1 and t.b = \"flash\" or t.a + 3 * t.a = 5", "Plan": [ - "TableReader_7 8000.67 root data:Selection_6", - "└─Selection_6 8000.67 cop[tiflash] or(and(gt(test.t.a, 1), eq(test.t.b, \"flash\")), eq(plus(test.t.a, mul(3, test.t.a)), 5))", - " └─TableFullScan_5 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TableReader 8000.67 root data:Selection", + "└─Selection 8000.67 cop[tiflash] or(and(gt(test.t.a, 1), eq(test.t.b, \"flash\")), eq(plus(test.t.a, mul(3, test.t.a)), 5))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where cast(t.a as float) + 3 = 5.1", + "SQL": "explain format = 'brief' select * from t where cast(t.a as float) + 3 = 5.1", "Plan": [ - "Selection_7 10000.00 root eq(plus(cast(test.t.a), 3), 5.1)", - "└─TableReader_6 10000.00 root data:TableFullScan_5", - " └─TableFullScan_5 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "Selection 10000.00 root eq(plus(cast(test.t.a), 3), 5.1)", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where b > 'a' order by convert(b, unsigned) limit 2", + "SQL": "explain format = 'brief' select * from t where b > 'a' order by convert(b, unsigned) limit 2", "Plan": [ - "Projection_17 2.00 root test.t.a, test.t.b", - "└─TopN_8 2.00 root Column#3, offset:0, count:2", - " └─Projection_18 3333.33 root test.t.a, test.t.b, cast(test.t.b, bigint(22) UNSIGNED BINARY)->Column#3", - " └─TableReader_13 3333.33 root data:Selection_12", - " └─Selection_12 3333.33 cop[tiflash] gt(test.t.b, \"a\")", - " └─TableFullScan_11 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "Projection 2.00 root test.t.a, test.t.b", + "└─TopN 2.00 root Column#3, offset:0, count:2", + " └─Projection 2.00 root test.t.a, test.t.b, cast(test.t.b, bigint(22) UNSIGNED BINARY)->Column#3", + " └─TableReader 2.00 root data:TopN", + " └─TopN 2.00 batchCop[tiflash] cast(test.t.b), offset:0, count:2", + " └─Selection 3333.33 batchCop[tiflash] gt(test.t.b, \"a\")", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where b > 'a' order by b limit 2", + "SQL": "explain format = 'brief' select * from t where b > 'a' order by b limit 2", "Plan": [ - "TopN_8 2.00 root test.t.b, offset:0, count:2", - "└─TableReader_17 2.00 root data:TopN_16", - " └─TopN_16 2.00 cop[tiflash] test.t.b, offset:0, count:2", - " └─Selection_15 3333.33 cop[tiflash] gt(test.t.b, \"a\")", - " └─TableFullScan_14 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TopN 2.00 root test.t.b, offset:0, count:2", + "└─TableReader 2.00 root data:TopN", + " └─TopN 2.00 batchCop[tiflash] test.t.b, offset:0, count:2", + " └─Selection 3333.33 batchCop[tiflash] gt(test.t.b, \"a\")", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMPPJoin", + "Cases": [ + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#17", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d3_t keep order:false", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d2_t keep order:false", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 8.00 cop[tiflash] ", + " │ └─ExchangeSender 8.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 cop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 2.00 batchCop[tiflash] ", + " │ └─ExchangeSender 2.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", + " ├─ExchangeReceiver(Build) 8.00 cop[tiflash] ", + " │ └─ExchangeSender 8.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 cop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#11", + "└─TableReader 8.00 root data:ExchangeSender", + " └─ExchangeSender 8.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8.00 cop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 8.00 cop[tiflash] ", + " │ └─ExchangeSender 8.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 8.00 cop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false", + " └─TableFullScan(Probe) 2.00 cop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root data:ExchangeSender", + " └─ExchangeSender 6.40 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 cop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root data:ExchangeSender", + " └─ExchangeSender 6.40 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 cop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root data:ExchangeSender", + " └─ExchangeSender 6.40 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 cop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#12", + "└─TableReader 6.40 root data:ExchangeSender", + " └─ExchangeSender 6.40 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 6.40 cop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 2.00 cop[tiflash] ", + " │ └─ExchangeSender 2.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 2.00 cop[tiflash] table:d1_t keep order:false", + " └─TableFullScan(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + ] + } + ] + }, + { + "Name": "TestMPPShuffledJoin", + "Cases": [ + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#17", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", + " └─HashJoin 128.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d3_t.d3_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d3_t keep order:false", + " └─ExchangeReceiver(Probe) 64.00 batchCop[tiflash] ", + " └─ExchangeSender 64.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d3_k", + " └─HashJoin 64.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d2_t.d2_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d2_t keep order:false", + " └─ExchangeReceiver(Probe) 32.00 batchCop[tiflash] ", + " └─ExchangeSender 32.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d2_k", + " └─HashJoin 32.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d1_k = d2_t.value and fact_t.d1_k = d3_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#17", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", + " └─HashJoin 128.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d3_t.value)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d3_t.value", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d3_t.value))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d3_t keep order:false", + " └─HashJoin(Probe) 64.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d2_t.value)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d2_t.value", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d2_t.value))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d2_t keep order:false", + " └─HashJoin(Probe) 32.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 16.00 batchCop[tiflash] ", + " │ └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " │ └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false", + " └─ExchangeReceiver(Probe) 4.00 batchCop[tiflash] ", + " └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from (select case when t1.col1 is null then t2.col1 + 5 else 10 end as col1, t2.d1_k as d1_k from fact_t t1 right join fact_t t2 on t1.d1_k = t2.d1_k) fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 5", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#22)->Column#19", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#22", + " └─HashJoin 204.80 batchCop[tiflash] inner join, equal:[eq(test.d1_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Projection(Probe) 102.40 batchCop[tiflash] test.fact_t.d1_k", + " └─Selection 102.40 batchCop[tiflash] gt(case(isnull(test.fact_t.col1), plus(test.fact_t.col1, 5), 10), 5)", + " └─HashJoin 128.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.fact_t.d1_k)]", + " ├─ExchangeReceiver(Build) 16.00 batchCop[tiflash] ", + " │ └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " │ └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 16.00 batchCop[tiflash] table:t1 keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:t2 keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", + " ├─ExchangeReceiver(Build) 16.00 batchCop[tiflash] ", + " │ └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " │ └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false", + " └─ExchangeReceiver(Probe) 4.00 batchCop[tiflash] ", + " └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 32.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─ExchangeReceiver(Build) 16.00 batchCop[tiflash] ", + " │ └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " │ └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false", + " └─ExchangeReceiver(Probe) 4.00 batchCop[tiflash] ", + " └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 12.80 batchCop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 12.80 batchCop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─Selection 4.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─Selection 16.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 12.80 batchCop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 12.80 batchCop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─ExchangeReceiver(Build) 4.00 batchCop[tiflash] ", + " │ └─ExchangeSender 4.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.d1_t.d1_k", + " │ └─TableFullScan 4.00 batchCop[tiflash] table:d1_t keep order:false", + " └─ExchangeReceiver(Probe) 16.00 batchCop[tiflash] ", + " └─ExchangeSender 16.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.fact_t.d1_k", + " └─TableFullScan 16.00 batchCop[tiflash] table:fact_t keep order:false" ] } ] @@ -45,91 +579,269 @@ "Name": "TestBroadcastJoin", "Cases": [ { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#17", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d3_t keep order:false, global read", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d2_t keep order:false, global read", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false, global read" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t), broadcast_join_local(d2_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#18)->Column#17", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#18", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d3_k, test.d3_t.d3_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d3_t.d3_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d3_t keep order:false, global read", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d2_k, test.d2_t.d2_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d2_t.d2_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d2_t keep order:false", + " └─HashJoin(Probe) 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false, global read" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─TableFullScan(Probe) 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─TableFullScan(Build) 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false, global read" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] inner join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col1 > 10", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col1, 10)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─TableFullScan(Probe) 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k and fact_t.col2 > 10 and fact_t.col1 > d1_t.value", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] left outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], left cond:[gt(test.fact_t.col2, 10)], other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─TableFullScan(Probe) 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10)", + " ├─TableFullScan(Build) 2.00 batchCop[tiflash] table:d1_t keep order:false", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false, global read" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k and d1_t.value > 10 and fact_t.col1 > d1_t.value", "Plan": [ - "StreamAgg_32 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader_33 1.00 root data:StreamAgg_13", - " └─StreamAgg_13 1.00 cop[tiflash] funcs:count(1)->Column#14", - " └─BroadcastJoin_31 8.00 cop[tiflash] inner join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─Selection_23(Build) 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan_22 2.00 cop[tiflash] table:d1_t keep order:false, global read", - " └─Selection_21(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan_20 8.00 cop[tiflash] table:fact_t keep order:false" + "HashAgg 1.00 root funcs:count(Column#12)->Column#11", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#12", + " └─HashJoin 8.00 batchCop[tiflash] right outer join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], right cond:gt(test.d1_t.value, 10), other cond:gt(test.fact_t.col1, test.d1_t.value)", + " ├─Selection(Build) 8.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " │ └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false, global read", + " └─TableFullScan(Probe) 2.00 batchCop[tiflash] table:d1_t keep order:false" ] }, { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "StreamAgg_52 1.00 root funcs:count(Column#20)->Column#17", - "└─TableReader_53 1.00 root data:StreamAgg_17", - " └─StreamAgg_17 1.00 cop[tiflash] funcs:count(1)->Column#20", - " └─BroadcastJoin_51 8.00 cop[tiflash] inner join, left key:test.fact_t.d3_k, right key:test.d3_t.d3_k", - " ├─Selection_43(Build) 2.00 cop[tiflash] not(isnull(test.d3_t.d3_k))", - " │ └─TableFullScan_42 2.00 cop[tiflash] table:d3_t keep order:false, global read", - " └─BroadcastJoin_33(Probe) 8.00 cop[tiflash] inner join, left key:test.fact_t.d2_k, right key:test.d2_t.d2_k", - " ├─Selection_29(Build) 2.00 cop[tiflash] not(isnull(test.d2_t.d2_k))", - " │ └─TableFullScan_28 2.00 cop[tiflash] table:d2_t keep order:false, global read", - " └─BroadcastJoin_37(Probe) 8.00 cop[tiflash] inner join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─Selection_27(Build) 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan_26 2.00 cop[tiflash] table:d1_t keep order:false, global read", - " └─Selection_41(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", - " └─TableFullScan_40 8.00 cop[tiflash] table:fact_t keep order:false" + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 6.40 batchCop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" ] }, { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t), broadcast_join_local(d1_t) */ count(*) from fact_t, d1_t where fact_t.d1_k = d1_t.d1_k", + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "StreamAgg_25 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader_26 1.00 root data:StreamAgg_13", - " └─StreamAgg_13 1.00 cop[tiflash] funcs:count(1)->Column#14", - " └─BroadcastJoin_24 8.00 cop[tiflash] inner join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─Selection_18(Build) 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan_17 2.00 cop[tiflash] table:d1_t keep order:false", - " └─Selection_16(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan_15 8.00 cop[tiflash] table:fact_t keep order:false, global read" + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 6.40 batchCop[tiflash] semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─Selection(Build) 2.00 batchCop[tiflash] not(isnull(test.d1_t.d1_k)), not(isnull(test.d1_t.value))", + " │ └─TableFullScan 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─Selection(Probe) 8.00 batchCop[tiflash] not(isnull(test.fact_t.col1)), not(isnull(test.fact_t.d1_k))", + " └─TableFullScan 8.00 batchCop[tiflash] table:fact_t keep order:false" ] }, { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t,d2_t,d3_t), broadcast_join_local(d2_t) */ count(*) from fact_t, d1_t, d2_t, d3_t where fact_t.d1_k = d1_t.d1_k and fact_t.d2_k = d2_t.d2_k and fact_t.d3_k = d3_t.d3_k", + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k)", "Plan": [ - "StreamAgg_36 1.00 root funcs:count(Column#20)->Column#17", - "└─TableReader_37 1.00 root data:StreamAgg_17", - " └─StreamAgg_17 1.00 cop[tiflash] funcs:count(1)->Column#20", - " └─BroadcastJoin_35 8.00 cop[tiflash] inner join, left key:test.fact_t.d3_k, right key:test.d3_t.d3_k", - " ├─Selection_29(Build) 2.00 cop[tiflash] not(isnull(test.d3_t.d3_k))", - " │ └─TableFullScan_28 2.00 cop[tiflash] table:d3_t keep order:false, global read", - " └─BroadcastJoin_19(Probe) 8.00 cop[tiflash] inner join, left key:test.fact_t.d2_k, right key:test.d2_t.d2_k", - " ├─Selection_27(Build) 2.00 cop[tiflash] not(isnull(test.d2_t.d2_k))", - " │ └─TableFullScan_26 2.00 cop[tiflash] table:d2_t keep order:false", - " └─BroadcastJoin_20(Probe) 8.00 cop[tiflash] inner join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─Selection_25(Build) 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan_24 2.00 cop[tiflash] table:d1_t keep order:false, global read", - " └─Selection_23(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k)), not(isnull(test.fact_t.d2_k)), not(isnull(test.fact_t.d3_k))", - " └─TableFullScan_22 8.00 cop[tiflash] table:fact_t keep order:false, global read" + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 6.40 batchCop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)]", + " ├─TableFullScan(Build) 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─TableFullScan(Probe) 8.00 batchCop[tiflash] table:fact_t keep order:false" ] }, { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t left join d1_t on fact_t.d1_k = d1_t.d1_k", + "SQL": "explain format = 'brief' select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t where not exists (select 1 from d1_t where d1_k = fact_t.d1_k and value > fact_t.col1)", "Plan": [ - "StreamAgg_23 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader_24 1.00 root data:StreamAgg_12", - " └─StreamAgg_12 1.00 cop[tiflash] funcs:count(1)->Column#14", - " └─BroadcastJoin_22 8.00 cop[tiflash] left outer join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─Selection_16(Build) 2.00 cop[tiflash] not(isnull(test.d1_t.d1_k))", - " │ └─TableFullScan_15 2.00 cop[tiflash] table:d1_t keep order:false, global read", - " └─TableFullScan_14(Probe) 8.00 cop[tiflash] table:fact_t keep order:false" + "HashAgg 1.00 root funcs:count(Column#13)->Column#12", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#13", + " └─HashJoin 6.40 batchCop[tiflash] anti semi join, equal:[eq(test.fact_t.d1_k, test.d1_t.d1_k)], other cond:gt(test.d1_t.value, test.fact_t.col1)", + " ├─TableFullScan(Build) 2.00 batchCop[tiflash] table:d1_t keep order:false, global read", + " └─TableFullScan(Probe) 8.00 batchCop[tiflash] table:fact_t keep order:false" + ] + } + ] + }, + { + "Name": "TestJoinNotSupportedByTiFlash", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from table_1 a, table_1 b where a.bit_col = b.bit_col", + "Plan": [ + "HashJoin 2.00 root inner join, equal:[eq(test.table_1.bit_col, test.table_1.bit_col)]", + "├─TableReader(Build) 2.00 root data:TableFullScan", + "│ └─TableFullScan 2.00 cop[tiflash] table:b keep order:false", + "└─TableReader(Probe) 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tiflash] table:a keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from table_1 a left join table_1 b on a.id = b.id and dayofmonth(a.datetime_col) > 100", + "Plan": [ + "HashJoin 2.00 root left outer join, equal:[eq(test.table_1.id, test.table_1.id)], left cond:[gt(dayofmonth(test.table_1.datetime_col), 100)]", + "├─TableReader(Build) 2.00 root data:TableFullScan", + "│ └─TableFullScan 2.00 cop[tiflash] table:b keep order:false", + "└─TableReader(Probe) 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tiflash] table:a keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from table_1 a right join table_1 b on a.id = b.id and dayofmonth(b.datetime_col) > 100", + "Plan": [ + "HashJoin 2.00 root right outer join, equal:[eq(test.table_1.id, test.table_1.id)], right cond:gt(dayofmonth(test.table_1.datetime_col), 100)", + "├─TableReader(Build) 2.00 root data:TableFullScan", + "│ └─TableFullScan 2.00 cop[tiflash] table:a keep order:false", + "└─TableReader(Probe) 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tiflash] table:b keep order:false" + ] + }, + { + "SQL": "explain format = 'brief' select * from table_1 a join table_1 b on a.id = b.id and dayofmonth(a.datetime_col) > dayofmonth(b.datetime_col)", + "Plan": [ + "HashJoin 2.00 root inner join, equal:[eq(test.table_1.id, test.table_1.id)], other cond:gt(dayofmonth(test.table_1.datetime_col), dayofmonth(test.table_1.datetime_col))", + "├─TableReader(Build) 2.00 root data:TableFullScan", + "│ └─TableFullScan 2.00 cop[tiflash] table:b keep order:false", + "└─TableReader(Probe) 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tiflash] table:a keep order:false" + ] + } + ] + }, + { + "Name": "TestMPPNotSupportedInNewCollation", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from table_1 a, table_1 b where a.id = b.id", + "Plan": [ + "HashJoin 2.00 root inner join, equal:[eq(test.table_1.id, test.table_1.id)]", + "├─TableReader(Build) 2.00 root data:TableFullScan", + "│ └─TableFullScan 2.00 cop[tiflash] table:b keep order:false", + "└─TableReader(Probe) 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tiflash] table:a keep order:false" ] }, { - "SQL": "explain select /*+ broadcast_join(fact_t,d1_t) */ count(*) from fact_t right join d1_t on fact_t.d1_k = d1_t.d1_k", + "SQL": "explain format = 'brief' select /*+ agg_to_cop() */ count(*), id from table_1 group by id", "Plan": [ - "StreamAgg_23 1.00 root funcs:count(Column#14)->Column#11", - "└─TableReader_24 1.00 root data:StreamAgg_12", - " └─StreamAgg_12 1.00 cop[tiflash] funcs:count(1)->Column#14", - " └─BroadcastJoin_22 8.00 cop[tiflash] right outer join, left key:test.fact_t.d1_k, right key:test.d1_t.d1_k", - " ├─TableFullScan_16(Build) 2.00 cop[tiflash] table:d1_t keep order:false", - " └─Selection_15(Probe) 8.00 cop[tiflash] not(isnull(test.fact_t.d1_k))", - " └─TableFullScan_14 8.00 cop[tiflash] table:fact_t keep order:false, global read" + "HashAgg 2.00 root group by:test.table_1.id, funcs:count(Column#5)->Column#4, funcs:firstrow(test.table_1.id)->test.table_1.id", + "└─TableReader 2.00 root data:HashAgg", + " └─HashAgg 2.00 batchCop[tiflash] group by:test.table_1.id, funcs:count(1)->Column#5", + " └─TableFullScan 2.00 batchCop[tiflash] table:table_1 keep order:false" ] } ] @@ -138,137 +850,137 @@ "Name": "TestReadFromStorageHint", "Cases": [ { - "SQL": "desc select avg(a) from t", + "SQL": "desc format = 'brief' select avg(a) from t", "Plan": [ - "StreamAgg_24 1.00 root funcs:avg(Column#7, Column#8)->Column#4", - "└─TableReader_25 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", - " └─TableFullScan_22 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", "Plan": [ - "StreamAgg_16 1.00 root funcs:avg(Column#7, Column#8)->Column#4", - "└─TableReader_17 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", - " └─TableFullScan_15 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t]) */ sum(a) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a) from t", "Plan": [ - "StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4", - "└─TableReader_17 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(test.t.a)->Column#6", - " └─TableFullScan_15 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(test.t.a)->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(a+1) from t", "Plan": [ - "StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4", - "└─TableReader_17 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(plus(test.t.a, 1))->Column#6", - " └─TableFullScan_15 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(plus(test.t.a, 1))->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ sum(isnull(a)) from t", "Plan": [ - "StreamAgg_16 1.00 root funcs:sum(Column#6)->Column#4", - "└─TableReader_17 1.00 root data:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tiflash] funcs:sum(isnull(test.t.a))->Column#6", - " └─TableFullScan_15 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:sum(Column#6)->Column#4", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:sum(isnull(test.t.a))->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ READ_FROM_STORAGE(TIKV[t1], TIKV[t2]) */ * from t t1, t t2 where t1.a = t2.a", + "SQL": "desc format = 'brief' select /*+ READ_FROM_STORAGE(TIKV[t1], TIKV[t2]) */ * from t t1, t t2 where t1.a = t2.a", "Plan": [ - "HashJoin_37 12487.50 root inner join, equal:[eq(test.t.a, test.t.a)]", - "├─TableReader_55(Build) 9990.00 root data:Selection_54", - "│ └─Selection_54 9990.00 cop[tikv] not(isnull(test.t.a))", - "│ └─TableFullScan_53 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_49(Probe) 9990.00 root data:Selection_48", - " └─Selection_48 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan_47 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ READ_FROM_STORAGE(TIKV[t1], TIFLASH[t2]) */ * from t t1, t t2 where t1.a = t2.a", + "SQL": "desc format = 'brief' select /*+ READ_FROM_STORAGE(TIKV[t1], TIFLASH[t2]) */ * from t t1, t t2 where t1.a = t2.a", "Plan": [ - "HashJoin_23 12487.50 root inner join, equal:[eq(test.t.a, test.t.a)]", - "├─TableReader_31(Build) 9990.00 root data:Selection_30", - "│ └─Selection_30 9990.00 cop[tiflash] not(isnull(test.t.a))", - "│ └─TableFullScan_29 10000.00 cop[tiflash] table:t2 keep order:false, stats:pseudo", - "└─TableReader_34(Probe) 9990.00 root data:Selection_33", - " └─Selection_33 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan_32 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tiflash] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", + "SQL": "desc format = 'brief' select * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", "Plan": [ - "TableReader_8 44.00 root data:TableRangeScan_7", - "└─TableRangeScan_7 44.00 cop[tiflash] table:tt range:(1,20), [30,55), keep order:false, stats:pseudo" + "TableReader 44.00 root data:TableRangeScan", + "└─TableRangeScan 44.00 cop[tiflash] table:tt range:(1,20), [30,55), keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[tt]) */ * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[tt]) */ * from tt where (tt.a > 1 and tt.a < 20) or (tt.a >= 30 and tt.a < 55)", "Plan": [ - "TableReader_6 44.00 root data:TableRangeScan_5", - "└─TableRangeScan_5 44.00 cop[tiflash] table:tt range:(1,20), [30,55), keep order:false, stats:pseudo" + "TableReader 44.00 root data:TableRangeScan", + "└─TableRangeScan 44.00 cop[tiflash] table:tt range:(1,20), [30,55), keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select * from ttt order by ttt.a desc", + "SQL": "desc format = 'brief' select * from ttt order by ttt.a desc", "Plan": [ - "TableReader_13 10000.00 root data:TableFullScan_12", - "└─TableFullScan_12 10000.00 cop[tikv] table:ttt keep order:true, desc, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:ttt keep order:true, desc, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a desc", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a desc", "Plan": [ - "Sort_4 10000.00 root test.ttt.a:desc", - "└─TableReader_8 10000.00 root data:TableFullScan_7", - " └─TableFullScan_7 10000.00 cop[tiflash] table:ttt keep order:false, stats:pseudo" + "Sort 10000.00 root test.ttt.a:desc", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:ttt keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[ttt]) */ * from ttt order by ttt.a", "Plan": [ - "TableReader_11 10000.00 root data:TableFullScan_10", - "└─TableFullScan_10 10000.00 cop[tiflash] table:ttt keep order:true, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:ttt keep order:true, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tikv[t, ttt]) */ * from ttt", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tikv[t, ttt]) */ * from ttt", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tikv] table:ttt keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:ttt keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]There are no matching table names for (t) in optimizer hint /*+ READ_FROM_STORAGE(tikv[t, ttt]) */. Maybe you can use the table alias name" ] }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t, ttt], tikv[tt]) */ * from ttt", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t, ttt], tikv[tt]) */ * from ttt", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tiflash] table:ttt keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:ttt keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]There are no matching table names for (t, tt) in optimizer hint /*+ READ_FROM_STORAGE(tiflash[t, ttt], tikv[tt]) */. Maybe you can use the table alias name" @@ -280,34 +992,34 @@ "Name": "TestReadFromStorageHintAndIsolationRead", "Cases": [ { - "SQL": "desc select /*+ read_from_storage(tikv[t], tiflash[t]) */ avg(a) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tikv[t], tiflash[t]) */ avg(a) from t", "Plan": [ - "StreamAgg_20 1.00 root funcs:avg(Column#7, Column#8)->Column#4", - "└─IndexReader_21 1.00 root index:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", - " └─IndexFullScan_19 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]Storage hints are conflict, you can only specify one storage type of table test.t" ] }, { - "SQL": "desc select /*+ read_from_storage(tikv[t]) */ avg(a) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tikv[t]) */ avg(a) from t", "Plan": [ - "StreamAgg_20 1.00 root funcs:avg(Column#7, Column#8)->Column#4", - "└─IndexReader_21 1.00 root index:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", - " └─IndexFullScan_19 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "desc select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", + "SQL": "desc format = 'brief' select /*+ read_from_storage(tiflash[t]) */ avg(a) from t", "Plan": [ - "StreamAgg_20 1.00 root funcs:avg(Column#7, Column#8)->Column#4", - "└─IndexReader_21 1.00 root index:StreamAgg_8", - " └─StreamAgg_8 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", - " └─IndexFullScan_19 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:avg(Column#7, Column#8)->Column#4", + "└─IndexReader 1.00 root index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(test.t.a)->Column#7, funcs:sum(test.t.a)->Column#8", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:ia(a) keep order:false, stats:pseudo" ], "Warn": [ "[planner:1815]No available path for table test.t with the store type tiflash of the hint /*+ read_from_storage */, please check the status of the table replica and variable value of tidb_isolation_read_engines(map[0:{}])" @@ -319,22 +1031,22 @@ "Name": "TestIsolationReadDoNotFilterSystemDB", "Cases": [ { - "SQL": "desc select * from metrics_schema.tidb_query_duration where time >= '2019-12-23 16:10:13' and time <= '2019-12-23 16:30:13'", + "SQL": "desc format = 'brief' select * from metrics_schema.tidb_query_duration where time >= '2019-12-23 16:10:13' and time <= '2019-12-23 16:30:13'", "Plan": [ - "MemTableScan_5 10000.00 root table:tidb_query_duration PromQL:histogram_quantile(0.9, sum(rate(tidb_server_handle_query_duration_seconds_bucket{}[60s])) by (le,sql_type,instance)), start_time:2019-12-23 16:10:13, end_time:2019-12-23 16:30:13, step:1m0s" + "MemTableScan 10000.00 root table:tidb_query_duration PromQL:histogram_quantile(0.9, sum(rate(tidb_server_handle_query_duration_seconds_bucket{}[60s])) by (le,sql_type,instance)), start_time:2019-12-23 16:10:13, end_time:2019-12-23 16:30:13, step:1m0s" ] }, { - "SQL": "desc select * from information_schema.tables", + "SQL": "desc format = 'brief' select * from information_schema.tables", "Plan": [ - "MemTableScan_4 10000.00 root table:TABLES " + "MemTableScan 10000.00 root table:TABLES " ] }, { - "SQL": "desc select * from mysql.stats_meta", + "SQL": "desc format = 'brief' select * from mysql.stats_meta", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tikv] table:stats_meta keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:stats_meta keep order:false, stats:pseudo" ] } ] @@ -343,17 +1055,17 @@ "Name": "TestIsolationReadTiFlashNotChoosePointGet", "Cases": [ { - "SQL": "explain select * from t where t.a = 1", + "SQL": "explain format = 'brief' select * from t where t.a = 1", "Result": [ - "TableReader_6 1.00 root data:TableRangeScan_5", - "└─TableRangeScan_5 1.00 cop[tiflash] table:t range:[1,1], keep order:false, stats:pseudo" + "TableReader 1.00 root data:TableRangeScan", + "└─TableRangeScan 1.00 cop[tiflash] table:t range:[1,1], keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where t.a in (1, 2)", + "SQL": "explain format = 'brief' select * from t where t.a in (1, 2)", "Result": [ - "TableReader_6 2.00 root data:TableRangeScan_5", - "└─TableRangeScan_5 2.00 cop[tiflash] table:t range:[1,1], [2,2], keep order:false, stats:pseudo" + "TableReader 2.00 root data:TableRangeScan", + "└─TableRangeScan 2.00 cop[tiflash] table:t range:[1,1], [2,2], keep order:false, stats:pseudo" ] } ] @@ -362,39 +1074,870 @@ "Name": "TestIsolationReadTiFlashUseIndexHint", "Cases": [ { - "SQL": "explain select * from t", + "SQL": "explain format = 'brief' select * from t", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain select * from t use index();", + "SQL": "explain format = 'brief' select * from t use index();", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null }, { - "SQL": "explain select /*+ use_index(t, idx)*/ * from t", + "SQL": "explain format = 'brief' select /*+ use_index(t, idx)*/ * from t", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": [ "TiDB doesn't support index in the isolation read engines(value: 'tiflash')" ] }, { - "SQL": "explain select /*+ use_index(t)*/ * from t", + "SQL": "explain format = 'brief' select /*+ use_index(t)*/ * from t", "Plan": [ - "TableReader_5 10000.00 root data:TableFullScan_4", - "└─TableFullScan_4 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" ], "Warn": null } ] + }, + { + "Name": "TestIssue20710", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.b", + "Plan": [ + "IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.b, test.s.b)", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.s.b))", + " └─TableRowIDScan 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.b = s.a", + "Plan": [ + "IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.b, test.s.a)", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ inl_join(s) */ * from t join s on t.a=s.a and t.a = s.b", + "Plan": [ + "IndexJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.a, test.s.b)", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.s.b))", + " └─TableRowIDScan 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.b = s.b", + "Plan": [ + "IndexHashJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.b, test.s.b)", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.s.b))", + " └─TableRowIDScan 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.b = s.a", + "Plan": [ + "IndexHashJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.b, test.s.a)", + "├─TableReader(Build) 9980.01 root data:Selection", + "│ └─Selection 9980.01 cop[tikv] not(isnull(test.t.a)), not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ inl_hash_join(s) */ * from t join s on t.a=s.a and t.a = s.b", + "Plan": [ + "IndexHashJoin 12475.01 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.s.a, equal cond:eq(test.t.a, test.s.a), eq(test.t.a, test.s.b)", + "├─TableReader(Build) 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.s.a))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:s, index:a(a) range: decided by [eq(test.s.a, test.t.a)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.25 cop[tikv] not(isnull(test.s.b))", + " └─TableRowIDScan 1.25 cop[tikv] table:s keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestPushDownProjectionForTiFlash", + "Cases": [ + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#6)->Column#5", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:sum(Column#7)->Column#5", + "└─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#4)->Column#5", + "└─Projection 10000.00 root plus(test.t.id, 1)->Column#4", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#6)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:sum(Column#7)->Column#5", + "└─Projection 10000.00 root cast(Column#4, decimal(41,0) BINARY)->Column#7", + " └─Projection 10000.00 root plus(test.t.id, 1)->Column#4", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "Plan": [ + "TableReader 10000.00 root data:HashJoin", + "└─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#4, Column#8)]", + " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#4", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#8", + " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 10000.00 root data:HashJoin", + "└─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(test.t.id, Column#7)]", + " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 10000.00 root data:HashJoin", + "└─HashJoin 10000.00 cop[tiflash] left outer join, equal:[eq(test.t.id, Column#7)]", + " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 12487.50 root data:HashJoin", + "└─HashJoin 12487.50 cop[tiflash] right outer join, equal:[eq(test.t.id, Column#7)]", + " ├─Selection(Build) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─Projection(Probe) 10000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "Plan": [ + "Projection 10000.00 root Column#8, Column#4", + "└─TableReader 10000.00 root data:HashJoin", + " └─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#4, Column#8)]", + " ├─Projection(Build) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#4", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#8", + " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select A.id from t as A where exists (select 1 from t where t.id=A.id)", + "Plan": [ + "TableReader 7992.00 root data:HashJoin", + "└─HashJoin 7992.00 cop[tiflash] semi join, equal:[eq(test.t.id, test.t.id)]", + " ├─Selection(Build) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select A.id from t as A where not exists (select 1 from t where t.id=A.id)", + "Plan": [ + "TableReader 8000.00 root data:HashJoin", + "└─HashJoin 8000.00 cop[tiflash] anti semi join, equal:[eq(test.t.id, test.t.id)]", + " ├─TableFullScan(Build) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo, global read", + " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestPushDownProjectionForMPP", + "Cases": [ + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:sum(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(b) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#4)->Column#5", + "└─Projection 10000.00 root plus(test.t.id, 1)->Column#4", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ count(*) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#6)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ stream_agg()*/ sum(b) from (select id + 1 as b from t)A", + "Plan": [ + "StreamAgg 1.00 root funcs:sum(Column#7)->Column#5", + "└─Projection 10000.00 root cast(Column#4, decimal(41,0) BINARY)->Column#7", + " └─Projection 10000.00 root plus(test.t.id, 1)->Column#4", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "Plan": [ + "TableReader 10000.00 root data:ExchangeSender", + "└─ExchangeSender 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#4, Column#8)]", + " ├─ExchangeReceiver(Build) 8000.00 cop[tiflash] ", + " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#4", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#8", + " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 10000.00 root data:ExchangeSender", + "└─ExchangeSender 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(test.t.id, Column#7)]", + " ├─ExchangeReceiver(Build) 8000.00 cop[tiflash] ", + " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t left join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 10000.00 root data:ExchangeSender", + "└─ExchangeSender 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 10000.00 cop[tiflash] left outer join, equal:[eq(test.t.id, Column#7)]", + " ├─ExchangeReceiver(Build) 8000.00 cop[tiflash] ", + " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t right join (select id-2 as b from t) A on A.b=t.id", + "Plan": [ + "TableReader 12487.50 root data:ExchangeSender", + "└─ExchangeSender 12487.50 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 12487.50 cop[tiflash] right outer join, equal:[eq(test.t.id, Column#7)]", + " ├─ExchangeReceiver(Build) 9990.00 cop[tiflash] ", + " │ └─ExchangeSender 9990.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 10000.00 cop[tiflash] minus(test.t.id, 2)->Column#7", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select A.b, B.b from (select id-2 as b from t) B join (select id-2 as b from t) A on A.b=B.b", + "Plan": [ + "Projection 10000.00 root Column#8, Column#4", + "└─TableReader 10000.00 root data:ExchangeSender", + " └─ExchangeSender 10000.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 10000.00 cop[tiflash] inner join, equal:[eq(Column#4, Column#8)]", + " ├─ExchangeReceiver(Build) 8000.00 cop[tiflash] ", + " │ └─ExchangeSender 8000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#4", + " │ └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 8000.00 cop[tiflash] minus(test.t.id, 2)->Column#8", + " └─Selection 8000.00 cop[tiflash] not(isnull(minus(test.t.id, 2)))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select id from t as A where exists (select 1 from t where t.id=A.id)", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 cop[tiflash] semi join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 9990.00 cop[tiflash] ", + " │ └─ExchangeSender 9990.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select id from t as A where not exists (select 1 from t where t.id=A.id)", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 cop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8000.00 cop[tiflash] anti semi join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 10000.00 cop[tiflash] ", + " │ └─ExchangeSender 10000.00 cop[tiflash] ExchangeType: Broadcast", + " │ └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo", + " └─TableFullScan(Probe) 10000.00 cop[tiflash] table:A keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestPushDownAggForMPP", + "Cases": [ + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ count(*) from (select id+1 from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+ hash_agg()*/ sum(b) from (select id + 1 as b from t)A", + "Plan": [ + "HashAgg 1.00 root funcs:sum(Column#7)->Column#5", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:sum(Column#4)->Column#7", + " └─Projection 10000.00 batchCop[tiflash] plus(test.t.id, 1)->Column#4", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(*) from t", + "Plan": [ + "HashAgg 1.00 root funcs:count(Column#6)->Column#4", + "└─TableReader 1.00 root data:ExchangeSender", + " └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#6", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(*), id from t group by id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#7)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(1)->Column#7", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(*), id + 1 from t group by id + 1", + "Plan": [ + "Projection 8000.00 root Column#4, plus(test.t.id, 1)->Column#5", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:Column#10, funcs:sum(Column#11)->Column#4, funcs:firstrow(Column#12)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: Column#10", + " └─HashAgg 8000.00 batchCop[tiflash] group by:plus(test.t.id, 1), funcs:count(1)->Column#11, funcs:firstrow(test.t.id)->Column#12", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", + "Plan": [ + "TableReader 9990.00 root data:ExchangeSender", + "└─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─Projection(Build) 7992.00 batchCop[tiflash] Column#7, test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:count(1)->Column#8", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 batchCop[tiflash] ", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select /*+ hash_agg()*/ count(*) as a from t) as A on A.a = t.id", + "Plan": [ + "HashJoin 1.25 root inner join, equal:[eq(test.t.id, Column#7)]", + "├─HashAgg(Build) 1.00 root funcs:count(Column#11)->Column#7", + "│ └─TableReader 1.00 root data:ExchangeSender", + "│ └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + "│ └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#11", + "│ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select avg(value) as b,id from t group by id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#9, 0), 1, Column#9), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#10)->Column#9, funcs:sum(Column#11)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#10, funcs:sum(test.t.value)->Column#11", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select /*+hash_agg()*/ sum(b),id from (select avg(value) as b, id from t group by id)A", + "Plan": [ + "HashAgg 1.00 root funcs:sum(Column#4)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#10, 0), 1, Column#10), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#11)->Column#10, funcs:sum(Column#12)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#11, funcs:sum(test.t.value)->Column#12", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select id from t group by id having avg(value)>0", + "Plan": [ + "Projection 6400.00 root test.t.id", + "└─Selection 6400.00 root gt(Column#4, 0)", + " └─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#10, 0), 1, Column#10), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#11)->Column#10, funcs:sum(Column#12)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#11, funcs:sum(test.t.value)->Column#12", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select avg(value),id from t group by id having avg(value)>0", + "Plan": [ + "Selection 6400.00 root gt(Column#4, 0)", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#11, 0), 1, Column#11), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#12)->Column#11, funcs:sum(Column#13)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#12, funcs:sum(test.t.value)->Column#13", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select avg(value) +1,id from t group by id", + "Plan": [ + "Projection 8000.00 root plus(Column#4, 1)->Column#5, test.t.id", + "└─TableReader 8000.00 root data:ExchangeSender", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] div(Column#4, cast(case(eq(Column#11, 0), 1, Column#11), decimal(20,0) BINARY))->Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#12)->Column#11, funcs:sum(Column#13)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(test.t.value)->Column#12, funcs:sum(test.t.value)->Column#13", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 7992.00 batchCop[tiflash] Column#7", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(test.t.id)->Column#7", + " └─HashJoin 12487.50 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 batchCop[tiflash] ", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─Projection(Build) 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 7992.00 batchCop[tiflash] Column#11, test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(test.t.id)->Column#11, funcs:firstrow(test.t.id)->test.t.id", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─Projection(Build) 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 batchCop[tiflash] ", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(distinct value),id from t group by id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 8000.00 batchCop[tiflash] Column#4, test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(distinct test.t.value)->Column#4, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, test.t.value, ", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select count(distinct value),sum(distinct value),id from t group by id", + "Plan": [ + "HashAgg 8000.00 root group by:test.t.id, funcs:count(distinct test.t.value)->Column#4, funcs:sum(distinct test.t.value)->Column#5, funcs:firstrow(test.t.id)->test.t.id", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select count(distinct value), id from t group by id) as A on A.id = t.id", + "Plan": [ + "TableReader 9990.00 root data:ExchangeSender", + "└─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─Projection(Build) 7992.00 batchCop[tiflash] Column#7, test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:count(distinct test.t.value)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, test.t.value, ", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 batchCop[tiflash] ", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select count(1/value), id from t group by id) as A on A.id = t.id", + "Plan": [ + "TableReader 9990.00 root data:ExchangeSender", + "└─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─Projection(Build) 7992.00 batchCop[tiflash] Column#7, test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:count(div(1, test.t.value))->Column#8", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─ExchangeReceiver(Probe) 9990.00 batchCop[tiflash] ", + " └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMppAggWithJoin", + "Cases": [ + { + "SQL": "desc format = 'brief' select * from t join ( select count(*), id from t group by id) as A on A.id = t.id", + "Plan": [ + "TableReader 9990.00 root data:ExchangeSender", + "└─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 batchCop[tiflash] Column#7, test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:count(1)->Column#8", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select count(*)+id as v from t group by id) as A on A.v = t.id", + "Plan": [ + "TableReader 8000.00 root data:ExchangeSender", + "└─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 8000.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, Column#8)]", + " ├─ExchangeReceiver(Build) 6400.00 batchCop[tiflash] ", + " │ └─ExchangeSender 6400.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 6400.00 batchCop[tiflash] plus(Column#7, test.t.id)->Column#8", + " │ └─Selection 6400.00 batchCop[tiflash] not(isnull(plus(Column#7, test.t.id)))", + " │ └─Projection 8000.00 batchCop[tiflash] Column#7, test.t.id", + " │ └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#11)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 8000.00 batchCop[tiflash] ", + " │ └─ExchangeSender 8000.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─HashAgg 8000.00 batchCop[tiflash] group by:test.t.id, funcs:count(1)->Column#11", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select count(*) as v, id from t group by value,id having value+v <10) as A on A.id = t.id", + "Plan": [ + "Projection 7992.00 root test.t.id, test.t.value, Column#7, test.t.id", + "└─TableReader 7992.00 root data:ExchangeSender", + " └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 6393.60 batchCop[tiflash] ", + " │ └─ExchangeSender 6393.60 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 6393.60 batchCop[tiflash] lt(plus(test.t.value, cast(Column#7)), 10)", + " │ └─Projection 7992.00 batchCop[tiflash] Column#7, test.t.id, test.t.value", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, test.t.value, funcs:sum(Column#10)->Column#7, funcs:firstrow(test.t.id)->test.t.id, funcs:firstrow(test.t.value)->test.t.value", + " │ └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.value, test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, test.t.value, funcs:count(1)->Column#10", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from t join ( select /*+ hash_agg()*/ count(*) as a from t) as A on A.a = t.id", + "Plan": [ + "HashJoin 1.25 root inner join, equal:[eq(test.t.id, Column#7)]", + "├─HashAgg(Build) 1.00 root funcs:count(Column#10)->Column#7", + "│ └─TableReader 1.00 root data:ExchangeSender", + "│ └─ExchangeSender 1.00 batchCop[tiflash] ExchangeType: PassThrough", + "│ └─HashAgg 1.00 batchCop[tiflash] funcs:count(1)->Column#10", + "│ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + "└─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 cop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select sum(b) from (select t.id, t1.id as b from t join t t1 on t.id=t1.id)A group by id", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─Projection 7992.00 batchCop[tiflash] Column#7", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#8)->Column#7", + " └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(test.t.id)->Column#8", + " └─HashJoin 12487.50 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(value),id from t group by id)B on C.id=B.id", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 7992.00 batchCop[tiflash] Column#7, test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#9)->Column#7, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(test.t.value)->Column#9", + " └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select id from t group by id) C join (select sum(b),id from (select t.id, t1.id as b from t join (select id, count(*) as c from t group by id) t1 on t.id=t1.id)A group by id)B on C.id=b.id", + "Plan": [ + "TableReader 7992.00 root data:ExchangeSender", + "└─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: PassThrough", + " └─HashJoin 7992.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Projection(Probe) 7992.00 batchCop[tiflash] Column#11, test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(Column#14)->Column#11, funcs:firstrow(test.t.id)->test.t.id", + " └─ExchangeReceiver 7992.00 batchCop[tiflash] ", + " └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:sum(test.t.id)->Column#14", + " └─HashJoin 9990.00 batchCop[tiflash] inner join, equal:[eq(test.t.id, test.t.id)]", + " ├─ExchangeReceiver(Build) 7992.00 batchCop[tiflash] ", + " │ └─ExchangeSender 7992.00 batchCop[tiflash] ExchangeType: Broadcast", + " │ └─Projection 7992.00 batchCop[tiflash] test.t.id", + " │ └─HashAgg 7992.00 batchCop[tiflash] group by:test.t.id, funcs:firstrow(test.t.id)->test.t.id", + " │ └─ExchangeReceiver 9990.00 batchCop[tiflash] ", + " │ └─ExchangeSender 9990.00 batchCop[tiflash] ExchangeType: HashPartition, Hash Cols: test.t.id", + " │ └─Selection 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " │ └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo", + " └─Selection(Probe) 9990.00 batchCop[tiflash] not(isnull(test.t.id))", + " └─TableFullScan 10000.00 batchCop[tiflash] table:t keep order:false, stats:pseudo" + ] + } + ] } ] diff --git a/planner/core/testdata/integration_suite_in.json b/planner/core/testdata/integration_suite_in.json index 62930182da16d..3dbebbfefbfe0 100644 --- a/planner/core/testdata/integration_suite_in.json +++ b/planner/core/testdata/integration_suite_in.json @@ -3,90 +3,106 @@ "name": "TestPushLimitDownIndexLookUpReader", "cases": [ // Limit should be pushed down into IndexLookUpReader, row count of IndexLookUpReader and TableScan should be 1.00. - "explain select * from tbl use index(idx_b_c) where b > 1 limit 2,1", + "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 limit 2,1", // Projection atop IndexLookUpReader, Limit should be pushed down into IndexLookUpReader, and Projection should have row count 1.00 as well. - "explain select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1", + "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1", // Limit should be pushed down into IndexLookUpReader when Selection on top of IndexScan. - "explain select * from tbl use index(idx_b_c) where b > 1 and c > 1 limit 2,1", + "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 and c > 1 limit 2,1", // Limit should NOT be pushed down into IndexLookUpReader when Selection on top of TableScan. - "explain select * from tbl use index(idx_b_c) where b > 1 and a > 1 limit 2,1" + "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 and a > 1 limit 2,1" ] }, { "name": "TestIsFromUnixtimeNullRejective", "cases": [ // fix #12385 - "explain select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);" + "explain format = 'brief' select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);" + ] + }, + { + "name": "TestIndexJoinInnerIndexNDV", + "cases": [ + // t2 should use idx2 instead of idx1, since idx2 has larger NDV. + "explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c" ] }, { "name": "TestSimplifyOuterJoinWithCast", "cases": [ // LeftOuterJoin should no be simplified to InnerJoin. - "explain select * from t t1 left join t t2 on t1.a = t2.a where cast(t1.b as date) >= '2019-01-01'" + "explain format = 'brief' select * from t t1 left join t t2 on t1.a = t2.a where cast(t1.b as date) >= '2019-01-01'" ] }, { "name": "TestMaxMinEliminate", "cases": [ - "explain (select max(a) from t) union (select min(a) from t)", - "explain select min(a), max(a) from cluster_index_t", - "explain select min(b), max(b) from cluster_index_t where a = 1", - "explain select min(a), max(a) from cluster_index_t where b = 1", - "explain select min(b), max(b) from cluster_index_t where b = 1" + "explain format = 'brief' (select max(a) from t) union (select min(a) from t)", + "explain format = 'brief' select min(a), max(a) from cluster_index_t", + "explain format = 'brief' select min(b), max(b) from cluster_index_t where a = 1", + "explain format = 'brief' select min(a), max(a) from cluster_index_t where b = 1", + "explain format = 'brief' select min(b), max(b) from cluster_index_t where b = 1" ] }, { "name": "TestIndexJoinUniqueCompositeIndex", "cases": [ // Row count of IndexScan should be 2. - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", // Row count of IndexScan should be 2. - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", // Row count of IndexScan should be 1. - "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1" ] }, { "name": "TestPartitionTableStats", "cases": [ - "explain select * from t order by a", + "explain format = 'brief' select * from t order by a", "select * from t order by a", - "explain select * from t order by a limit 3", + "explain format = 'brief' select * from t order by a limit 3", "select * from t order by a limit 3" ] }, { "name": "TestIndexMerge", "cases": [ - "explain select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", - "explain select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", - "explain select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2" + "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", + "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", + "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2" + ] + }, + { + "name": "TestIndexMergeHint4CNF", + "cases": [ + "explain format = 'brief' select * from t where b = 1 and (a = 1 or c = 1)", + "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, c) */ * from t where b = 1 and (a = 1 or c = 1)" ] }, { "name": "TestSubqueryWithTopN", "cases": [ - "desc select t1.b from t t1 where t1.b in (select t2.a from t t2 order by t1.a+t2.a limit 1)" + "desc format = 'brief' select t1.b from t t1 where t1.b in (select t2.a from t t2 order by t1.a+t2.a limit 1)", + "desc format = 'brief' select t1.a from t t1 order by (t1.b = 1 and exists (select 1 from t t2 where t1.b = t2.b)) limit 1", + "desc format = 'brief' select * from (select b+b as x from t) t1, t t2 where t1.x=t2.b order by t1.x limit 1" ] }, { "name": "TestIndexJoinTableRange", "cases": [ - "desc select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", - "desc select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b" + "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", + "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b" ] }, { "name": "TestHintWithRequiredProperty", "cases": [ - "desc select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", - "desc select /*+ INL_HASH_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", - "desc select /*+ INL_MERGE_JOIN(t2)*/ t1.a, t2.a from t t1, t t2 ,t t3 where t1.a = t2.a and t3.a=t2.a", - "desc select * from t t1, (select /*+ HASH_AGG() */ b, max(a) from t t2 group by b) t2 where t1.b = t2.b order by t1.b", - "desc select /*+ INL_HASH_JOIN(t2) */ distinct t2.a from t t1 join t t2 on t1.a = t2.a", + "desc format = 'brief' select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", + "desc format = 'brief' select /*+ INL_HASH_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", + "desc format = 'brief' select /*+ INL_MERGE_JOIN(t2)*/ t1.a, t2.a from t t1, t t2 ,t t3 where t1.a = t2.a and t3.a=t2.a", + "desc format = 'brief' select * from t t1, (select /*+ HASH_AGG() */ b, max(a) from t t2 group by b) t2 where t1.b = t2.b order by t1.b", + "desc format = 'brief' select /*+ INL_HASH_JOIN(t2) */ distinct t2.a from t t1 join t t2 on t1.a = t2.a", // This hint cannot work, so choose another plan. - "desc select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.c order by t1.a" + "desc format = 'brief' select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.c order by t1.a" ] }, { @@ -123,13 +139,13 @@ { "name": "TestPartitionPruningForInExpr", "cases": [ - "explain select * from t where a in (1, 2,'11')", - "explain select * from t where a in (17, null)", - "explain select * from t where a in (16, 'abc')", - "explain select * from t where a in (15, 0.12, 3.47)", - "explain select * from t where a in (0.12, 3.47)", - "explain select * from t where a in (14, floor(3.47))", - "explain select * from t where b in (3, 4)" + "explain format = 'brief' select * from t where a in (1, 2,'11')", + "explain format = 'brief' select * from t where a in (17, null)", + "explain format = 'brief' select * from t where a in (16, 'abc')", + "explain format = 'brief' select * from t where a in (15, 0.12, 3.47)", + "explain format = 'brief' select * from t where a in (0.12, 3.47)", + "explain format = 'brief' select * from t where a in (14, floor(3.47))", + "explain format = 'brief' select * from t where b in (3, 4)" ] }, { @@ -179,7 +195,8 @@ "select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", "select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b", - "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c" + "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c", + "select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c;" ] }, { @@ -208,6 +225,13 @@ "select * from pt where id > 4 or c = 7" ] }, + { + "name": "TestInvalidHint", + "cases": [ + "explain format = 'brief' select /*+ use_index_merge(tt) */ * from tt where a=10 or a=20;", + "explain format = 'brief' select /*+ use_index_merge(tt) */ * from tt where a=15 or (a < 10 or a > 20);" + ] + }, { "name": "TestApproxPercentile", "cases": [ @@ -217,5 +241,36 @@ "select approx_percentile(a, 10*10) from t", "select approx_percentile(a, 50) from t group by b order by b" ] + }, + { + "name": "TestConvertRangeToPoint", + "cases": [ + "explain format = 'brief' select * from t0 where a > 1 and a < 3 order by b limit 2", + "explain format = 'brief' select * from t1 where a >= 2 and a <= 2 and b = 2 and c > 2", + "explain format = 'brief' select * from t2 where a >= 2.5 and a <= 2.5 order by b limit 2", + "explain format = 'brief' select * from t3 where a >= 'a' and a <= 'a' and b = 'b' and c > 'c'" + ] + }, + { + "name": "TestIssue22105", + "cases": [ + "explain format = 'brief' SELECT /*+ use_index_merge(t1)*/ COUNT(*) FROM t1 WHERE (key4=42 AND key6 IS NOT NULL) OR (key1=4 AND key3=6)" + ] + }, + { + "name": "TestReorderSimplifiedOuterJoins", + "cases": [ + // Query with INNER JOIN or LEFT JOIN should have the same plan. + "explain format = 'brief' SELECT t1.pk FROM t1 INNER JOIN t2 ON t1.col1 = t2.pk INNER JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'", + "explain format = 'brief' SELECT t1.pk FROM t1 LEFT JOIN t2 ON t1.col1 = t2.pk LEFT JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'" + ] + }, + { + "name": "TestDecorrelateInnerJoinInSubquery", + "cases": [ + // Query with WHERE or ON should have the same plan, i.e, the Apply has been decorrelated. + "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 where t1.a = t2.a and t1.a = t.a)", + "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)" + ] } ] diff --git a/planner/core/testdata/integration_suite_out.json b/planner/core/testdata/integration_suite_out.json index fcbd1959212e1..eec13a9ee1dd5 100644 --- a/planner/core/testdata/integration_suite_out.json +++ b/planner/core/testdata/integration_suite_out.json @@ -3,43 +3,43 @@ "Name": "TestPushLimitDownIndexLookUpReader", "Cases": [ { - "SQL": "explain select * from tbl use index(idx_b_c) where b > 1 limit 2,1", + "SQL": "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 limit 2,1", "Plan": [ - "IndexLookUp_14 1.00 root limit embedded(offset:2, count:1)", - "├─Limit_13(Build) 3.00 cop[tikv] offset:0, count:3", - "│ └─IndexRangeScan_11 3.00 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", - "└─TableRowIDScan_12(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" + "IndexLookUp 1.00 root limit embedded(offset:2, count:1)", + "├─Limit(Build) 3.00 cop[tikv] offset:0, count:3", + "│ └─IndexRangeScan 3.00 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", + "└─TableRowIDScan(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1", + "SQL": "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 order by b desc limit 2,1", "Plan": [ - "Projection_25 1.00 root test.tbl.a, test.tbl.b, test.tbl.c", - "└─IndexLookUp_24 1.00 root limit embedded(offset:2, count:1)", - " ├─Limit_23(Build) 3.00 cop[tikv] offset:0, count:3", - " │ └─IndexRangeScan_21 3.00 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:true, desc", - " └─TableRowIDScan_22(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" + "Projection 1.00 root test.tbl.a, test.tbl.b, test.tbl.c", + "└─IndexLookUp 1.00 root limit embedded(offset:2, count:1)", + " ├─Limit(Build) 3.00 cop[tikv] offset:0, count:3", + " │ └─IndexRangeScan 3.00 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:true, desc", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from tbl use index(idx_b_c) where b > 1 and c > 1 limit 2,1", + "SQL": "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 and c > 1 limit 2,1", "Plan": [ - "IndexLookUp_15 1.00 root limit embedded(offset:2, count:1)", - "├─Limit_14(Build) 3.00 cop[tikv] offset:0, count:3", - "│ └─Selection_13 3.00 cop[tikv] gt(test.tbl.c, 1)", - "│ └─IndexRangeScan_11 3.75 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", - "└─TableRowIDScan_12(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" + "IndexLookUp 1.00 root limit embedded(offset:2, count:1)", + "├─Limit(Build) 3.00 cop[tikv] offset:0, count:3", + "│ └─Selection 3.00 cop[tikv] gt(test.tbl.c, 1)", + "│ └─IndexRangeScan 3.75 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", + "└─TableRowIDScan(Probe) 1.00 cop[tikv] table:tbl keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from tbl use index(idx_b_c) where b > 1 and a > 1 limit 2,1", + "SQL": "explain format = 'brief' select * from tbl use index(idx_b_c) where b > 1 and a > 1 limit 2,1", "Plan": [ - "Limit_9 1.00 root offset:2, count:1", - "└─IndexLookUp_15 3.00 root ", - " ├─IndexRangeScan_11(Build) 3.75 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", - " └─Limit_14(Probe) 3.00 cop[tikv] offset:0, count:3", - " └─Selection_13 3.00 cop[tikv] gt(test.tbl.a, 1)", - " └─TableRowIDScan_12 3.75 cop[tikv] table:tbl keep order:false" + "Limit 1.00 root offset:2, count:1", + "└─IndexLookUp 3.00 root ", + " ├─IndexRangeScan(Build) 3.75 cop[tikv] table:tbl, index:idx_b_c(b, c) range:(1,+inf], keep order:false", + " └─Limit(Probe) 3.00 cop[tikv] offset:0, count:3", + " └─Selection 3.00 cop[tikv] gt(test.tbl.a, 1)", + " └─TableRowIDScan 3.75 cop[tikv] table:tbl keep order:false" ] } ] @@ -48,16 +48,33 @@ "Name": "TestIsFromUnixtimeNullRejective", "Cases": [ { - "SQL": "explain select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);", + "SQL": "explain format = 'brief' select * from t t1 left join t t2 on t1.a=t2.a where from_unixtime(t2.b);", "Plan": [ - "HashJoin_7 9990.00 root inner join, equal:[eq(test.t.a, test.t.a)]", - "├─Selection_15(Build) 7992.00 root from_unixtime(cast(test.t.b))", - "│ └─TableReader_14 7992.00 root data:Selection_13", - "│ └─Selection_13 7992.00 cop[tikv] not(isnull(test.t.a))", - "│ └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 9990.00 root data:Selection_10", - " └─Selection_10 9990.00 cop[tikv] not(isnull(test.t.a))", - " └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Projection 9990.00 root test.t.a, test.t.b, test.t.a, test.t.b", + "└─HashJoin 9990.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─Selection(Build) 7992.00 root from_unixtime(cast(test.t.b))", + " │ └─TableReader 7992.00 root data:Selection", + " │ └─Selection 7992.00 cop[tikv] not(isnull(test.t.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestIndexJoinInnerIndexNDV", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ inl_join(t2) */ * from t1, t2 where t1.a = t2.a and t1.b = t2.b and t1.c = t2.c", + "Plan": [ + "IndexJoin 3.00 root inner join, inner:IndexLookUp, outer key:test.t1.c, inner key:test.t2.c, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.b), eq(test.t1.c, test.t2.c)", + "├─TableReader(Build) 3.00 root data:TableFullScan", + "│ └─TableFullScan 3.00 cop[tikv] table:t1 keep order:false", + "└─IndexLookUp(Probe) 1.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:idx2(c) range: decided by [eq(test.t2.c, test.t1.c)], keep order:false", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false" ] } ] @@ -66,14 +83,14 @@ "Name": "TestSimplifyOuterJoinWithCast", "Cases": [ { - "SQL": "explain select * from t t1 left join t t2 on t1.a = t2.a where cast(t1.b as date) >= '2019-01-01'", + "SQL": "explain format = 'brief' select * from t t1 left join t t2 on t1.a = t2.a where cast(t1.b as date) >= '2019-01-01'", "Plan": [ - "HashJoin_8 10000.00 root left outer join, equal:[eq(test.t.a, test.t.a)]", - "├─TableReader_11(Build) 8000.00 root data:Selection_10", - "│ └─Selection_10 8000.00 cop[tikv] ge(cast(test.t.b), 2019-01-01 00:00:00.000000)", - "│ └─TableFullScan_9 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_13(Probe) 10000.00 root data:TableFullScan_12", - " └─TableFullScan_12 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "HashJoin 10000.00 root left outer join, equal:[eq(test.t.a, test.t.a)]", + "├─TableReader(Build) 8000.00 root data:Selection", + "│ └─Selection 8000.00 cop[tikv] ge(cast(test.t.b), 2019-01-01 00:00:00.000000)", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] } ] @@ -82,72 +99,72 @@ "Name": "TestMaxMinEliminate", "Cases": [ { - "SQL": "explain (select max(a) from t) union (select min(a) from t)", + "SQL": "explain format = 'brief' (select max(a) from t) union (select min(a) from t)", "Plan": [ - "HashAgg_19 2.00 root group by:Column#5, funcs:firstrow(Column#5)->Column#5", - "└─Union_20 2.00 root ", - " ├─StreamAgg_26 1.00 root funcs:max(test.t.a)->Column#2", - " │ └─Limit_30 1.00 root offset:0, count:1", - " │ └─TableReader_40 1.00 root data:Limit_39", - " │ └─Limit_39 1.00 cop[tikv] offset:0, count:1", - " │ └─TableFullScan_38 1.00 cop[tikv] table:t keep order:true, desc, stats:pseudo", - " └─StreamAgg_48 1.00 root funcs:min(test.t.a)->Column#4", - " └─Limit_52 1.00 root offset:0, count:1", - " └─TableReader_62 1.00 root data:Limit_61", - " └─Limit_61 1.00 cop[tikv] offset:0, count:1", - " └─TableFullScan_60 1.00 cop[tikv] table:t keep order:true, stats:pseudo" + "HashAgg 2.00 root group by:Column#5, funcs:firstrow(Column#5)->Column#5", + "└─Union 2.00 root ", + " ├─StreamAgg 1.00 root funcs:max(test.t.a)->Column#2", + " │ └─Limit 1.00 root offset:0, count:1", + " │ └─TableReader 1.00 root data:Limit", + " │ └─Limit 1.00 cop[tikv] offset:0, count:1", + " │ └─TableFullScan 1.00 cop[tikv] table:t keep order:true, desc, stats:pseudo", + " └─StreamAgg 1.00 root funcs:min(test.t.a)->Column#4", + " └─Limit 1.00 root offset:0, count:1", + " └─TableReader 1.00 root data:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─TableFullScan 1.00 cop[tikv] table:t keep order:true, stats:pseudo" ] }, { - "SQL": "explain select min(a), max(a) from cluster_index_t", + "SQL": "explain format = 'brief' select min(a), max(a) from cluster_index_t", "Plan": [ - "HashJoin_16 1.00 root CARTESIAN inner join", - "├─StreamAgg_43(Build) 1.00 root funcs:max(test.cluster_index_t.a)->Column#5", - "│ └─Limit_47 1.00 root offset:0, count:1", - "│ └─TableReader_57 1.00 root data:Limit_56", - "│ └─Limit_56 1.00 cop[tikv] offset:0, count:1", - "│ └─TableFullScan_55 1.00 cop[tikv] table:cluster_index_t keep order:true, desc, stats:pseudo", - "└─StreamAgg_22(Probe) 1.00 root funcs:min(test.cluster_index_t.a)->Column#4", - " └─Limit_26 1.00 root offset:0, count:1", - " └─TableReader_36 1.00 root data:Limit_35", - " └─Limit_35 1.00 cop[tikv] offset:0, count:1", - " └─TableFullScan_34 1.00 cop[tikv] table:cluster_index_t keep order:true, stats:pseudo" + "HashJoin 1.00 root CARTESIAN inner join", + "├─StreamAgg(Build) 1.00 root funcs:max(test.cluster_index_t.a)->Column#5", + "│ └─Limit 1.00 root offset:0, count:1", + "│ └─TableReader 1.00 root data:Limit", + "│ └─Limit 1.00 cop[tikv] offset:0, count:1", + "│ └─TableFullScan 1.00 cop[tikv] table:cluster_index_t keep order:true, desc, stats:pseudo", + "└─StreamAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.a)->Column#4", + " └─Limit 1.00 root offset:0, count:1", + " └─TableReader 1.00 root data:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─TableFullScan 1.00 cop[tikv] table:cluster_index_t keep order:true, stats:pseudo" ] }, { - "SQL": "explain select min(b), max(b) from cluster_index_t where a = 1", + "SQL": "explain format = 'brief' select min(b), max(b) from cluster_index_t where a = 1", "Plan": [ - "HashJoin_19 1.00 root CARTESIAN inner join", - "├─StreamAgg_46(Build) 1.00 root funcs:max(test.cluster_index_t.b)->Column#5", - "│ └─Limit_50 1.00 root offset:0, count:1", - "│ └─TableReader_60 1.00 root data:Limit_59", - "│ └─Limit_59 1.00 cop[tikv] offset:0, count:1", - "│ └─TableRangeScan_58 1.00 cop[tikv] table:cluster_index_t range:[1,1], keep order:true, desc, stats:pseudo", - "└─StreamAgg_25(Probe) 1.00 root funcs:min(test.cluster_index_t.b)->Column#4", - " └─Limit_29 1.00 root offset:0, count:1", - " └─TableReader_39 1.00 root data:Limit_38", - " └─Limit_38 1.00 cop[tikv] offset:0, count:1", - " └─TableRangeScan_37 1.00 cop[tikv] table:cluster_index_t range:[1,1], keep order:true, stats:pseudo" + "HashJoin 1.00 root CARTESIAN inner join", + "├─StreamAgg(Build) 1.00 root funcs:max(test.cluster_index_t.b)->Column#5", + "│ └─Limit 1.00 root offset:0, count:1", + "│ └─TableReader 1.00 root data:Limit", + "│ └─Limit 1.00 cop[tikv] offset:0, count:1", + "│ └─TableRangeScan 1.00 cop[tikv] table:cluster_index_t range:[1,1], keep order:true, desc, stats:pseudo", + "└─StreamAgg(Probe) 1.00 root funcs:min(test.cluster_index_t.b)->Column#4", + " └─Limit 1.00 root offset:0, count:1", + " └─TableReader 1.00 root data:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─TableRangeScan 1.00 cop[tikv] table:cluster_index_t range:[1,1], keep order:true, stats:pseudo" ] }, { - "SQL": "explain select min(a), max(a) from cluster_index_t where b = 1", + "SQL": "explain format = 'brief' select min(a), max(a) from cluster_index_t where b = 1", "Plan": [ - "StreamAgg_20 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", - "└─TableReader_21 1.00 root data:StreamAgg_9", - " └─StreamAgg_9 1.00 cop[tikv] funcs:min(test.cluster_index_t.a)->Column#8, funcs:max(test.cluster_index_t.a)->Column#9", - " └─Selection_19 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", - " └─TableFullScan_18 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.a)->Column#8, funcs:max(test.cluster_index_t.a)->Column#9", + " └─Selection 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select min(b), max(b) from cluster_index_t where b = 1", + "SQL": "explain format = 'brief' select min(b), max(b) from cluster_index_t where b = 1", "Plan": [ - "StreamAgg_20 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", - "└─TableReader_21 1.00 root data:StreamAgg_9", - " └─StreamAgg_9 1.00 cop[tikv] funcs:min(test.cluster_index_t.b)->Column#8, funcs:max(test.cluster_index_t.b)->Column#9", - " └─Selection_19 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", - " └─TableFullScan_18 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:min(Column#8)->Column#4, funcs:max(Column#9)->Column#5", + "└─TableReader 1.00 root data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:min(test.cluster_index_t.b)->Column#8, funcs:max(test.cluster_index_t.b)->Column#9", + " └─Selection 10.00 cop[tikv] eq(test.cluster_index_t.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:cluster_index_t keep order:false, stats:pseudo" ] } ] @@ -156,36 +173,36 @@ "Name": "TestIndexJoinUniqueCompositeIndex", "Cases": [ { - "SQL": "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", + "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c = t2.c", "Plan": [ - "IndexJoin_9 2.00 root inner join, inner:IndexLookUp_8, outer key:test.t1.a, inner key:test.t2.a, other cond:eq(test.t1.c, test.t2.c)", - "├─TableReader_19(Build) 1.00 root data:TableFullScan_18", - "│ └─TableFullScan_18 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp_8(Probe) 2.00 root ", - " ├─IndexRangeScan_6(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false", - " └─TableRowIDScan_7(Probe) 2.00 cop[tikv] table:t2 keep order:false" + "IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.c, test.t2.c)", + "├─TableReader(Build) 1.00 root data:TableFullScan", + "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", + "└─IndexLookUp(Probe) 2.00 root ", + " ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false", + " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false" ] }, { - "SQL": "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", + "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t1.c <= t2.b", "Plan": [ - "IndexJoin_9 2.00 root inner join, inner:IndexLookUp_8, outer key:test.t1.a, inner key:test.t2.a, other cond:le(test.t1.c, test.t2.b)", - "├─TableReader_19(Build) 1.00 root data:TableFullScan_18", - "│ └─TableFullScan_18 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp_8(Probe) 2.00 root ", - " ├─IndexRangeScan_6(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) le(test.t1.c, test.t2.b)], keep order:false", - " └─TableRowIDScan_7(Probe) 2.00 cop[tikv] table:t2 keep order:false" + "IndexJoin 2.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), other cond:le(test.t1.c, test.t2.b)", + "├─TableReader(Build) 1.00 root data:TableFullScan", + "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", + "└─IndexLookUp(Probe) 2.00 root ", + " ├─IndexRangeScan(Build) 2.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) le(test.t1.c, test.t2.b)], keep order:false", + " └─TableRowIDScan(Probe) 2.00 cop[tikv] table:t2 keep order:false" ] }, { - "SQL": "explain select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1", + "SQL": "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t1 join t2 on t1.a = t2.a and t2.b = 1", "Plan": [ - "IndexJoin_9 1.00 root inner join, inner:IndexLookUp_8, outer key:test.t1.a, inner key:test.t2.a", - "├─TableReader_19(Build) 1.00 root data:TableFullScan_18", - "│ └─TableFullScan_18 1.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp_8(Probe) 1.00 root ", - " ├─IndexRangeScan_6(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) eq(test.t2.b, 1)], keep order:false", - " └─TableRowIDScan_7(Probe) 1.00 cop[tikv] table:t2 keep order:false" + "IndexJoin 1.00 root inner join, inner:IndexLookUp, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + "├─TableReader(Build) 1.00 root data:TableFullScan", + "│ └─TableFullScan 1.00 cop[tikv] table:t1 keep order:false", + "└─IndexLookUp(Probe) 1.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(a, b) range: decided by [eq(test.t2.a, test.t1.a) eq(test.t2.b, 1)], keep order:false", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false" ] } ] @@ -194,16 +211,16 @@ "Name": "TestPartitionTableStats", "Cases": [ { - "SQL": "explain select * from t order by a", + "SQL": "explain format = 'brief' select * from t order by a", "Result": [ - "Sort_8 10005.00 root test.t.a", - "└─PartitionUnion_11 10005.00 root ", - " ├─TableReader_13 10000.00 root data:TableFullScan_12", - " │ └─TableFullScan_12 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", - " ├─TableReader_15 1.00 root data:TableFullScan_14", - " │ └─TableFullScan_14 1.00 cop[tikv] table:t, partition:p1 keep order:false", - " └─TableReader_17 4.00 root data:TableFullScan_16", - " └─TableFullScan_16 4.00 cop[tikv] table:t, partition:p2 keep order:false" + "Sort 10005.00 root test.t.a", + "└─PartitionUnion 10005.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader 1.00 root data:TableFullScan", + " │ └─TableFullScan 1.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader 4.00 root data:TableFullScan", + " └─TableFullScan 4.00 cop[tikv] table:t, partition:p2 keep order:false" ] }, { @@ -217,21 +234,21 @@ ] }, { - "SQL": "explain select * from t order by a limit 3", + "SQL": "explain format = 'brief' select * from t order by a limit 3", "Result": [ - "TopN_16 3.00 root test.t.a, offset:0, count:3", - "└─PartitionUnion_20 7.00 root ", - " ├─TopN_21 3.00 root test.t.a, offset:0, count:3", - " │ └─TableReader_29 3.00 root data:TopN_28", - " │ └─TopN_28 3.00 cop[tikv] test.t.a, offset:0, count:3", - " │ └─TableFullScan_27 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", - " ├─TopN_34 1.00 root test.t.a, offset:0, count:3", - " │ └─TableReader_42 1.00 root data:TableFullScan_41", - " │ └─TableFullScan_41 1.00 cop[tikv] table:t, partition:p1 keep order:false", - " └─TopN_43 3.00 root test.t.a, offset:0, count:3", - " └─TableReader_51 3.00 root data:TopN_50", - " └─TopN_50 3.00 cop[tikv] test.t.a, offset:0, count:3", - " └─TableFullScan_49 4.00 cop[tikv] table:t, partition:p2 keep order:false" + "TopN 3.00 root test.t.a, offset:0, count:3", + "└─PartitionUnion 7.00 root ", + " ├─TopN 3.00 root test.t.a, offset:0, count:3", + " │ └─TableReader 3.00 root data:TopN", + " │ └─TopN 3.00 cop[tikv] test.t.a, offset:0, count:3", + " │ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + " ├─TopN 1.00 root test.t.a, offset:0, count:3", + " │ └─TableReader 1.00 root data:TableFullScan", + " │ └─TableFullScan 1.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TopN 3.00 root test.t.a, offset:0, count:3", + " └─TableReader 3.00 root data:TopN", + " └─TopN 3.00 cop[tikv] test.t.a, offset:0, count:3", + " └─TableFullScan 4.00 cop[tikv] table:t, partition:p2 keep order:false" ] }, { @@ -248,29 +265,51 @@ "Name": "TestIndexMerge", "Cases": [ { - "SQL": "explain select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", + "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b) */ * from t where a = 1 or b = 2", "Plan": [ - "IndexMerge_8 2.00 root ", - "├─IndexRangeScan_5(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "├─IndexRangeScan_6(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" + "IndexMerge 2.00 root ", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t, index:b(b) range:[2,2], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 2.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", + "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, primary) */ * from t where 1 or t.c", "Plan": [ - "IndexMerge_8 10000.00 root ", - "├─TableFullScan_5(Build) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", - "├─TableRangeScan_6(Build) 6666.67 cop[tikv] table:t range:[-inf,0), (0,+inf], keep order:false, stats:pseudo", - "└─TableRowIDScan_7(Probe) 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10000.00 root data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2", + "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, b, c) */ * from t where 1 or t.a = 1 or t.b = 2", "Plan": [ - "TableReader_7 8000.40 root data:Selection_6", - "└─Selection_6 8000.40 cop[tikv] or(or(1, eq(test.t.a, 1)), eq(test.t.b, 2))", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 8000.40 root data:Selection", + "└─Selection 8000.40 cop[tikv] or(1, or(eq(test.t.a, 1), eq(test.t.b, 2)))", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestIndexMergeHint4CNF", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where b = 1 and (a = 1 or c = 1)", + "Plan": [ + "IndexLookUp 0.02 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:b(b) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.02 cop[tikv] or(eq(test.t.a, 1), eq(test.t.c, 1))", + " └─TableRowIDScan 10.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ USE_INDEX_MERGE(t, a, c) */ * from t where b = 1 and (a = 1 or c = 1)", + "Plan": [ + "IndexMerge 0.02 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:a(a) range:[1,1], keep order:false, stats:pseudo", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t, index:c(c) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.02 cop[tikv] eq(test.t.b, 1)", + " └─TableRowIDScan 19.99 cop[tikv] table:t keep order:false, stats:pseudo" ] } ] @@ -279,20 +318,49 @@ "Name": "TestSubqueryWithTopN", "Cases": [ { - "SQL": "desc select t1.b from t t1 where t1.b in (select t2.a from t t2 order by t1.a+t2.a limit 1)", - "Plan": [ - "Projection_11 9990.00 root test.t.b", - "└─Apply_13 9990.00 root semi join, equal:[eq(test.t.b, test.t.a)]", - " ├─TableReader_16(Build) 9990.00 root data:Selection_15", - " │ └─Selection_15 9990.00 cop[tikv] not(isnull(test.t.b))", - " │ └─TableFullScan_14 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─Selection_17(Probe) 0.80 root not(isnull(test.t.a))", - " └─Projection_26 1.00 root test.t.a", - " └─TopN_18 1.00 root Column#7, offset:0, count:1", - " └─Projection_27 1.00 root test.t.a, plus(test.t.a, test.t.a)->Column#7", - " └─TableReader_23 1.00 root data:TopN_22", - " └─TopN_22 1.00 cop[tikv] plus(test.t.a, test.t.a), offset:0, count:1", - " └─TableFullScan_21 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + "SQL": "desc format = 'brief' select t1.b from t t1 where t1.b in (select t2.a from t t2 order by t1.a+t2.a limit 1)", + "Plan": [ + "Projection 9990.00 root test.t.b", + "└─Apply 9990.00 root semi join, equal:[eq(test.t.b, test.t.a)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─Selection(Probe) 0.80 root not(isnull(test.t.a))", + " └─Projection 1.00 root test.t.a", + " └─TopN 1.00 root Column#7, offset:0, count:1", + " └─Projection 1.00 root test.t.a, plus(test.t.a, test.t.a)->Column#7", + " └─TableReader 1.00 root data:TopN", + " └─TopN 1.00 cop[tikv] plus(test.t.a, test.t.a), offset:0, count:1", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select t1.a from t t1 order by (t1.b = 1 and exists (select 1 from t t2 where t1.b = t2.b)) limit 1", + "Plan": [ + "Projection 1.00 root test.t.a", + "└─Projection 1.00 root test.t.a, test.t.b, Column#8", + " └─TopN 1.00 root Column#10, offset:0, count:1", + " └─Projection 10000.00 root test.t.a, test.t.b, Column#8, and(eq(test.t.b, 1), Column#8)->Column#10", + " └─HashJoin 10000.00 root left outer semi join, equal:[eq(test.t.b, test.t.b)]", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "desc format = 'brief' select * from (select b+b as x from t) t1, t t2 where t1.x=t2.b order by t1.x limit 1", + "Plan": [ + "TopN 1.00 root Column#4, offset:0, count:1", + "└─Projection 10000.00 root Column#4, test.t.a, test.t.b", + " └─HashJoin 10000.00 root inner join, equal:[eq(test.t.b, Column#4)]", + " ├─Projection(Build) 8000.00 root plus(test.t.b, test.t.b)->Column#4", + " │ └─TableReader 8000.00 root data:Selection", + " │ └─Selection 8000.00 cop[tikv] not(isnull(plus(test.t.b, test.t.b)))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" ] } ] @@ -301,25 +369,25 @@ "Name": "TestIndexJoinTableRange", "Cases": [ { - "SQL": "desc select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", + "SQL": "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.b", "Plan": [ - "IndexJoin_15 12487.50 root inner join, inner:TableReader_11, outer key:test.t1.a, inner key:test.t2.a, other cond:eq(test.t1.b, test.t2.b)", - "├─IndexReader_21(Build) 9990.00 root index:IndexFullScan_20", - "│ └─IndexFullScan_20 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 1.00 root data:Selection_10", - " └─Selection_10 1.00 cop[tikv] not(isnull(test.t2.b))", - " └─TableRangeScan_9 1.00 cop[tikv] table:t2 range: decided by [test.t1.a], keep order:false, stats:pseudo" + "IndexJoin 12487.50 root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.b)", + "├─IndexReader(Build) 9990.00 root index:IndexFullScan", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", + "└─TableReader(Probe) 1.00 root data:Selection", + " └─Selection 1.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableRangeScan 1.00 cop[tikv] table:t2 range: decided by [test.t1.a], keep order:false, stats:pseudo" ] }, { - "SQL": "desc select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b", + "SQL": "desc format = 'brief' select /*+ TIDB_INLJ(t2)*/ * from t1, t2 where t1.a = t2.a and t1.b = t2.a and t1.b = t2.b", "Plan": [ - "IndexJoin_15 12487.50 root inner join, inner:TableReader_11, outer key:test.t1.a, test.t1.b, inner key:test.t2.a, test.t2.a, other cond:eq(test.t1.b, test.t2.b)", - "├─IndexReader_20(Build) 9990.00 root index:IndexFullScan_19", - "│ └─IndexFullScan_19 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", - "└─TableReader_11(Probe) 1.00 root data:Selection_10", - " └─Selection_10 1.00 cop[tikv] not(isnull(test.t2.b))", - " └─TableRangeScan_9 1.00 cop[tikv] table:t2 range: decided by [test.t1.a test.t1.b], keep order:false, stats:pseudo" + "IndexJoin 12487.50 root inner join, inner:TableReader, outer key:test.t1.a, test.t1.b, inner key:test.t2.a, test.t2.a, equal cond:eq(test.t1.a, test.t2.a), eq(test.t1.b, test.t2.a), eq(test.t1.b, test.t2.b)", + "├─IndexReader(Build) 9990.00 root index:IndexFullScan", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_t1_b(b) keep order:false, stats:pseudo", + "└─TableReader(Probe) 1.00 root data:Selection", + " └─Selection 1.00 cop[tikv] not(isnull(test.t2.b))", + " └─TableRangeScan 1.00 cop[tikv] table:t2 range: decided by [test.t1.a test.t1.b], keep order:false, stats:pseudo" ] } ] @@ -328,84 +396,84 @@ "Name": "TestHintWithRequiredProperty", "Cases": [ { - "SQL": "desc select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", + "SQL": "desc format = 'brief' select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", "Plan": [ - "Sort_7 12487.50 root test.t.a", - "└─IndexJoin_15 12487.50 root inner join, inner:IndexLookUp_14, outer key:test.t.a, inner key:test.t.b", - " ├─TableReader_25(Build) 10000.00 root data:TableFullScan_24", - " │ └─TableFullScan_24 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─IndexLookUp_14(Probe) 1.25 root ", - " ├─Selection_13(Build) 1.25 cop[tikv] not(isnull(test.t.b))", - " │ └─IndexRangeScan_11 1.25 cop[tikv] table:t2, index:b(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo", - " └─TableRowIDScan_12(Probe) 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Sort 12487.50 root test.t.a", + "└─IndexJoin 12487.50 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.t.b, equal cond:eq(test.t.a, test.t.b)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.t.b))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:t2, index:b(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warnings": [] }, { - "SQL": "desc select /*+ INL_HASH_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", + "SQL": "desc format = 'brief' select /*+ INL_HASH_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.b order by t2.a", "Plan": [ - "Sort_7 12487.50 root test.t.a", - "└─IndexHashJoin_17 12487.50 root inner join, inner:IndexLookUp_14, outer key:test.t.a, inner key:test.t.b", - " ├─TableReader_25(Build) 10000.00 root data:TableFullScan_24", - " │ └─TableFullScan_24 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─IndexLookUp_14(Probe) 1.25 root ", - " ├─Selection_13(Build) 1.25 cop[tikv] not(isnull(test.t.b))", - " │ └─IndexRangeScan_11 1.25 cop[tikv] table:t2, index:b(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo", - " └─TableRowIDScan_12(Probe) 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo" + "Sort 12487.50 root test.t.a", + "└─IndexHashJoin 12487.50 root inner join, inner:IndexLookUp, outer key:test.t.a, inner key:test.t.b, equal cond:eq(test.t.a, test.t.b)", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─IndexLookUp(Probe) 1.25 root ", + " ├─Selection(Build) 1.25 cop[tikv] not(isnull(test.t.b))", + " │ └─IndexRangeScan 1.25 cop[tikv] table:t2, index:b(b) range: decided by [eq(test.t.b, test.t.a)], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 1.25 cop[tikv] table:t2 keep order:false, stats:pseudo" ], "Warnings": [] }, { - "SQL": "desc select /*+ INL_MERGE_JOIN(t2)*/ t1.a, t2.a from t t1, t t2 ,t t3 where t1.a = t2.a and t3.a=t2.a", + "SQL": "desc format = 'brief' select /*+ INL_MERGE_JOIN(t2)*/ t1.a, t2.a from t t1, t t2 ,t t3 where t1.a = t2.a and t3.a=t2.a", "Plan": [ - "HashJoin_21 15625.00 root inner join, equal:[eq(test.t.a, test.t.a)]", - "├─TableReader_60(Build) 10000.00 root data:TableFullScan_59", - "│ └─TableFullScan_59 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", - "└─IndexMergeJoin_58(Probe) 12500.00 root inner join, inner:TableReader_53, outer key:test.t.a, inner key:test.t.a", - " ├─TableReader_45(Build) 10000.00 root data:TableFullScan_44", - " │ └─TableFullScan_44 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - " └─TableReader_53(Probe) 1.00 root data:TableRangeScan_52", - " └─TableRangeScan_52 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:true, stats:pseudo" + "HashJoin 15625.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "└─IndexMergeJoin(Probe) 12500.00 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a", + " ├─TableReader(Build) 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 1.00 root data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:true, stats:pseudo" ], "Warnings": [] }, { - "SQL": "desc select * from t t1, (select /*+ HASH_AGG() */ b, max(a) from t t2 group by b) t2 where t1.b = t2.b order by t1.b", + "SQL": "desc format = 'brief' select * from t t1, (select /*+ HASH_AGG() */ b, max(a) from t t2 group by b) t2 where t1.b = t2.b order by t1.b", "Plan": [ - "Sort_10 9990.00 root test.t.b", - "└─Projection_12 9990.00 root test.t.a, test.t.b, test.t.c, test.t.b, Column#7", - " └─HashJoin_27 9990.00 root inner join, equal:[eq(test.t.b, test.t.b)]", - " ├─HashAgg_47(Build) 7992.00 root group by:test.t.b, funcs:max(Column#10)->Column#7, funcs:firstrow(test.t.b)->test.t.b", - " │ └─IndexReader_48 7992.00 root index:HashAgg_44", - " │ └─HashAgg_44 7992.00 cop[tikv] group by:test.t.b, funcs:max(test.t.a)->Column#10", - " │ └─IndexFullScan_37 9990.00 cop[tikv] table:t2, index:b(b) keep order:false, stats:pseudo", - " └─TableReader_51(Probe) 9990.00 root data:Selection_50", - " └─Selection_50 9990.00 cop[tikv] not(isnull(test.t.b))", - " └─TableFullScan_49 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Sort 9990.00 root test.t.b", + "└─Projection 9990.00 root test.t.a, test.t.b, test.t.c, test.t.b, Column#7", + " └─HashJoin 9990.00 root inner join, equal:[eq(test.t.b, test.t.b)]", + " ├─HashAgg(Build) 7992.00 root group by:test.t.b, funcs:max(Column#10)->Column#7, funcs:firstrow(test.t.b)->test.t.b", + " │ └─IndexReader 7992.00 root index:HashAgg", + " │ └─HashAgg 7992.00 cop[tikv] group by:test.t.b, funcs:max(test.t.a)->Column#10", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:b(b) keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test.t.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warnings": [] }, { - "SQL": "desc select /*+ INL_HASH_JOIN(t2) */ distinct t2.a from t t1 join t t2 on t1.a = t2.a", + "SQL": "desc format = 'brief' select /*+ INL_HASH_JOIN(t2) */ distinct t2.a from t t1 join t t2 on t1.a = t2.a", "Plan": [ - "IndexHashJoin_15 12500.00 root inner join, inner:TableReader_10, outer key:test.t.a, inner key:test.t.a", - "├─TableReader_19(Build) 10000.00 root data:TableFullScan_18", - "│ └─TableFullScan_18 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─TableReader_10(Probe) 1.00 root data:TableRangeScan_9", - " └─TableRangeScan_9 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false, stats:pseudo" + "IndexHashJoin 12500.00 root inner join, inner:TableReader, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", + "├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 1.00 root data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false, stats:pseudo" ], "Warnings": [] }, { - "SQL": "desc select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.c order by t1.a", + "SQL": "desc format = 'brief' select /*+ INL_JOIN(t2) */ * from t t1, t t2 where t1.a = t2.c order by t1.a", "Plan": [ - "Sort_7 12487.50 root test.t.a", - "└─HashJoin_19 12487.50 root inner join, equal:[eq(test.t.a, test.t.c)]", - " ├─TableReader_23(Build) 9990.00 root data:Selection_22", - " │ └─Selection_22 9990.00 cop[tikv] not(isnull(test.t.c))", - " │ └─TableFullScan_21 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - " └─TableReader_25(Probe) 10000.00 root data:TableFullScan_24", - " └─TableFullScan_24 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "Sort 12487.50 root test.t.a", + "└─HashJoin 12487.50 root inner join, equal:[eq(test.t.a, test.t.c)]", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t.c))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ], "Warnings": [ "[planner:1815]Optimizer Hint /*+ INL_JOIN(t2) */ or /*+ TIDB_INLJ(t2) */ is inapplicable", @@ -556,57 +624,57 @@ "Name": "TestPartitionPruningForInExpr", "Cases": [ { - "SQL": "explain select * from t where a in (1, 2,'11')", + "SQL": "explain format = 'brief' select * from t where a in (1, 2,'11')", "Plan": [ - "TableReader_7 30.00 root partition:p0,p2 data:Selection_6", - "└─Selection_6 30.00 cop[tikv] in(test.t.a, 1, 2, 11)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 30.00 root partition:p0,p2 data:Selection", + "└─Selection 30.00 cop[tikv] in(test.t.a, 1, 2, 11)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a in (17, null)", + "SQL": "explain format = 'brief' select * from t where a in (17, null)", "Plan": [ - "TableReader_7 10.00 root partition:p0,p2 data:Selection_6", - "└─Selection_6 10.00 cop[tikv] in(test.t.a, 17, NULL)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10.00 root partition:p0,p2 data:Selection", + "└─Selection 10.00 cop[tikv] in(test.t.a, 17, NULL)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a in (16, 'abc')", + "SQL": "explain format = 'brief' select * from t where a in (16, 'abc')", "Plan": [ - "TableReader_7 20.00 root partition:p0,p2 data:Selection_6", - "└─Selection_6 20.00 cop[tikv] in(test.t.a, 16, 0)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 20.00 root partition:p0,p2 data:Selection", + "└─Selection 20.00 cop[tikv] in(test.t.a, 16, 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a in (15, 0.12, 3.47)", + "SQL": "explain format = 'brief' select * from t where a in (15, 0.12, 3.47)", "Plan": [ - "TableReader_7 10.00 root partition:p2 data:Selection_6", - "└─Selection_6 10.00 cop[tikv] or(eq(test.t.a, 15), 0)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 10.00 root partition:p2 data:Selection", + "└─Selection 10.00 cop[tikv] or(eq(test.t.a, 15), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where a in (0.12, 3.47)", + "SQL": "explain format = 'brief' select * from t where a in (0.12, 3.47)", "Plan": [ - "TableDual_6 0.00 root rows:0" + "TableDual 0.00 root rows:0" ] }, { - "SQL": "explain select * from t where a in (14, floor(3.47))", + "SQL": "explain format = 'brief' select * from t where a in (14, floor(3.47))", "Plan": [ - "TableReader_7 20.00 root partition:p0,p2 data:Selection_6", - "└─Selection_6 20.00 cop[tikv] in(test.t.a, 14, 3)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 20.00 root partition:p0,p2 data:Selection", + "└─Selection 20.00 cop[tikv] in(test.t.a, 14, 3)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] }, { - "SQL": "explain select * from t where b in (3, 4)", + "SQL": "explain format = 'brief' select * from t where b in (3, 4)", "Plan": [ - "TableReader_7 20.00 root partition:all data:Selection_6", - "└─Selection_6 20.00 cop[tikv] in(test.t.b, 3, 4)", - " └─TableFullScan_5 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "TableReader 20.00 root partition:all data:Selection", + "└─Selection 20.00 cop[tikv] in(test.t.b, 3, 4)", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ] } ] @@ -745,21 +813,21 @@ { "SQL": "select /*+ hash_join(t1, t2 partition(p0)) */ * from t t1 join t t2 on t1.a = t2.a", "Plan": [ - "HashJoin_15 37500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", - "├─PartitionUnion_30(Build) 30000.00 root ", - "│ ├─TableReader_34 10000.00 root data:TableFullScan_33", - "│ │ └─TableFullScan_33 10000.00 cop[tiflash] table:t2, partition:p0 keep order:false, stats:pseudo", - "│ ├─TableReader_38 10000.00 root data:TableFullScan_37", - "│ │ └─TableFullScan_37 10000.00 cop[tiflash] table:t2, partition:p1 keep order:false, stats:pseudo", - "│ └─TableReader_42 10000.00 root data:TableFullScan_41", - "│ └─TableFullScan_41 10000.00 cop[tiflash] table:t2, partition:p2 keep order:false, stats:pseudo", - "└─PartitionUnion_17(Probe) 30000.00 root ", - " ├─TableReader_21 10000.00 root data:TableFullScan_20", - " │ └─TableFullScan_20 10000.00 cop[tiflash] table:t1, partition:p0 keep order:false, stats:pseudo", - " ├─TableReader_25 10000.00 root data:TableFullScan_24", - " │ └─TableFullScan_24 10000.00 cop[tiflash] table:t1, partition:p1 keep order:false, stats:pseudo", - " └─TableReader_29 10000.00 root data:TableFullScan_28", - " └─TableFullScan_28 10000.00 cop[tiflash] table:t1, partition:p2 keep order:false, stats:pseudo" + "HashJoin_16 37500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "├─PartitionUnion_31(Build) 30000.00 root ", + "│ ├─TableReader_35 10000.00 root data:TableFullScan_34", + "│ │ └─TableFullScan_34 10000.00 cop[tiflash] table:t2, partition:p0 keep order:false, stats:pseudo", + "│ ├─TableReader_39 10000.00 root data:TableFullScan_38", + "│ │ └─TableFullScan_38 10000.00 cop[tiflash] table:t2, partition:p1 keep order:false, stats:pseudo", + "│ └─TableReader_43 10000.00 root data:TableFullScan_42", + "│ └─TableFullScan_42 10000.00 cop[tiflash] table:t2, partition:p2 keep order:false, stats:pseudo", + "└─PartitionUnion_18(Probe) 30000.00 root ", + " ├─TableReader_22 10000.00 root data:TableFullScan_21", + " │ └─TableFullScan_21 10000.00 cop[tiflash] table:t1, partition:p0 keep order:false, stats:pseudo", + " ├─TableReader_26 10000.00 root data:TableFullScan_25", + " │ └─TableFullScan_25 10000.00 cop[tiflash] table:t1, partition:p1 keep order:false, stats:pseudo", + " └─TableReader_30 10000.00 root data:TableFullScan_29", + " └─TableFullScan_29 10000.00 cop[tiflash] table:t1, partition:p2 keep order:false, stats:pseudo" ], "Warn": [ "Warning 1105 Optimizer Hint /*+ HASH_JOIN(t1, t2 PARTITION(p0)) */ is inapplicable on specified partitions" @@ -877,9 +945,8 @@ { "SQL": "select t1.b, t1.c from t1 where t1.c = 2.2", "Plan": [ - "Projection_4 1.00 root test.t1.b, test.t1.c", - "└─IndexReader_6 1.00 root index:IndexRangeScan_5", - " └─IndexRangeScan_5 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false" + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:t1, index:c(c) range:[2.2000000000,2.2000000000], keep order:false" ], "Res": [ "222 2.2000000000" @@ -949,10 +1016,10 @@ { "SQL": "select /*+ use_index_merge(t1 primary, c) */ * from t1 where t1.a = 1 and t1.b = '111' or t1.c = 3.3", "Plan": [ - "IndexMerge_8 1.67 root ", + "IndexMerge_8 2.11 root ", "├─TableRangeScan_5(Build) 1.00 cop[tikv] table:t1 range:[1 \"111\",1 \"111\"], keep order:false", "├─IndexRangeScan_6(Build) 1.00 cop[tikv] table:t1, index:c(c) range:[3.3000000000,3.3000000000], keep order:false", - "└─TableRowIDScan_7(Probe) 1.67 cop[tikv] table:t1 keep order:false" + "└─TableRowIDScan_7(Probe) 2.11 cop[tikv] table:t1 keep order:false" ], "Res": [ "1 111 1.1000000000 11", @@ -967,11 +1034,11 @@ { "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", "Plan": [ - "IndexJoin_11 3.00 root inner join, inner:TableReader_8, outer key:test.t.a, inner key:test.t.a", - "├─TableReader_26(Build) 3.00 root data:TableFullScan_25", - "│ └─TableFullScan_25 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader_8(Probe) 1.00 root data:TableRangeScan_7", - " └─TableRangeScan_7 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false" + "IndexJoin_12 3.00 root inner join, inner:TableReader_9, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", + "├─TableReader_27(Build) 3.00 root data:TableFullScan_26", + "│ └─TableFullScan_26 3.00 cop[tikv] table:t1 keep order:false", + "└─TableReader_9(Probe) 1.00 root data:TableRangeScan_8", + " └─TableRangeScan_8 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false" ], "Res": [ "1 111 1.1000000000 11 1 111 1.1000000000 11", @@ -982,11 +1049,11 @@ { "SQL": "select /*+ inl_merge_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", "Plan": [ - "IndexMergeJoin_15 3.00 root inner join, inner:TableReader_10, outer key:test.t.a, inner key:test.t.a", - "├─TableReader_26(Build) 3.00 root data:TableFullScan_25", - "│ └─TableFullScan_25 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader_10(Probe) 1.00 root data:TableRangeScan_9", - " └─TableRangeScan_9 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:true" + "IndexMergeJoin_16 3.00 root inner join, inner:TableReader_11, outer key:test.t.a, inner key:test.t.a", + "├─TableReader_27(Build) 3.00 root data:TableFullScan_26", + "│ └─TableFullScan_26 3.00 cop[tikv] table:t1 keep order:false", + "└─TableReader_11(Probe) 1.00 root data:TableRangeScan_10", + " └─TableRangeScan_10 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:true" ], "Res": [ "1 111 1.1000000000 11 1 111 1.1000000000 11", @@ -997,11 +1064,11 @@ { "SQL": "select /*+ inl_hash_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a", "Plan": [ - "IndexHashJoin_13 3.00 root inner join, inner:TableReader_8, outer key:test.t.a, inner key:test.t.a", - "├─TableReader_26(Build) 3.00 root data:TableFullScan_25", - "│ └─TableFullScan_25 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader_8(Probe) 1.00 root data:TableRangeScan_7", - " └─TableRangeScan_7 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false" + "IndexHashJoin_14 3.00 root inner join, inner:TableReader_9, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", + "├─TableReader_27(Build) 3.00 root data:TableFullScan_26", + "│ └─TableFullScan_26 3.00 cop[tikv] table:t1 keep order:false", + "└─TableReader_9(Probe) 1.00 root data:TableRangeScan_8", + " └─TableRangeScan_8 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false" ], "Res": [ "1 111 1.1000000000 11 1 111 1.1000000000 11", @@ -1012,11 +1079,11 @@ { "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.a = t2.a and t1.b = t2.b", "Plan": [ - "IndexJoin_11 3.00 root inner join, inner:TableReader_8, outer key:test.t.a, test.t.b, inner key:test.t.a, test.t.b", - "├─TableReader_26(Build) 3.00 root data:TableFullScan_25", - "│ └─TableFullScan_25 3.00 cop[tikv] table:t1 keep order:false", - "└─TableReader_8(Probe) 1.00 root data:TableRangeScan_7", - " └─TableRangeScan_7 1.00 cop[tikv] table:t2 range: decided by [test.t.a test.t.b], keep order:false" + "IndexJoin_12 3.00 root inner join, inner:TableReader_9, outer key:test.t.a, test.t.b, inner key:test.t.a, test.t.b, equal cond:eq(test.t.a, test.t.a), eq(test.t.b, test.t.b)", + "├─TableReader_27(Build) 3.00 root data:TableFullScan_26", + "│ └─TableFullScan_26 3.00 cop[tikv] table:t1 keep order:false", + "└─TableReader_9(Probe) 1.00 root data:TableRangeScan_8", + " └─TableRangeScan_8 1.00 cop[tikv] table:t2 range: decided by [test.t.a test.t.b], keep order:false" ], "Res": [ "1 111 1.1000000000 11 1 111 1.1000000000 11", @@ -1027,20 +1094,38 @@ { "SQL": "select /*+ inl_join(t1, t2) */ * from t t1 join t t2 on t1.c = t2.c", "Plan": [ - "IndexJoin_11 3.00 root inner join, inner:IndexLookUp_10, outer key:test.t.c, inner key:test.t.c", - "├─TableReader_35(Build) 3.00 root data:Selection_34", - "│ └─Selection_34 3.00 cop[tikv] not(isnull(test.t.c))", - "│ └─TableFullScan_33 3.00 cop[tikv] table:t1 keep order:false", - "└─IndexLookUp_10(Probe) 1.00 root ", - " ├─Selection_9(Build) 1.00 cop[tikv] not(isnull(test.t.c))", - " │ └─IndexRangeScan_7 1.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(test.t.c, test.t.c)], keep order:false", - " └─TableRowIDScan_8(Probe) 1.00 cop[tikv] table:t2 keep order:false" + "IndexJoin_12 3.00 root inner join, inner:IndexLookUp_11, outer key:test.t.c, inner key:test.t.c, equal cond:eq(test.t.c, test.t.c)", + "├─TableReader_36(Build) 3.00 root data:Selection_35", + "│ └─Selection_35 3.00 cop[tikv] not(isnull(test.t.c))", + "│ └─TableFullScan_34 3.00 cop[tikv] table:t1 keep order:false", + "└─IndexLookUp_11(Probe) 1.00 root ", + " ├─Selection_10(Build) 1.00 cop[tikv] not(isnull(test.t.c))", + " │ └─IndexRangeScan_8 1.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(test.t.c, test.t.c)], keep order:false", + " └─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:t2 keep order:false" ], "Res": [ "1 111 1.1000000000 11 1 111 1.1000000000 11", "2 222 2.2000000000 12 2 222 2.2000000000 12", "3 333 3.3000000000 13 3 333 3.3000000000 13" ] + }, + { + "SQL": "select /*+ inl_merge_join(t1,t2) */ t2.a, t2.c, t2.d from t t1 left join t t2 on t1.a = t2.c;", + "Plan": [ + "IndexMergeJoin_19 3.00 root left outer join, inner:Projection_17, outer key:Column#9, inner key:test.t.c", + "├─Projection_20(Build) 3.00 root cast(test.t.a, decimal(20,0) BINARY)->Column#9", + "│ └─TableReader_22 3.00 root data:TableFullScan_21", + "│ └─TableFullScan_21 3.00 cop[tikv] table:t1 keep order:false", + "└─Projection_17(Probe) 1.00 root test.t.a, test.t.c, test.t.d", + " └─IndexLookUp_16 1.00 root ", + " ├─IndexRangeScan_14(Build) 1.00 cop[tikv] table:t2, index:c(c) range: decided by [eq(test.t.c, Column#9)], keep order:true", + " └─TableRowIDScan_15(Probe) 1.00 cop[tikv] table:t2 keep order:false" + ], + "Res": [ + " ", + " ", + " " + ] } ] }, @@ -1180,6 +1265,31 @@ } ] }, + { + "Name": "TestInvalidHint", + "Cases": [ + { + "SQL": "explain format = 'brief' select /*+ use_index_merge(tt) */ * from tt where a=10 or a=20;", + "Plan": [ + "IndexReader 20.00 root index:IndexRangeScan", + "└─IndexRangeScan 20.00 cop[tikv] table:tt, index:a(a) range:[10,10], [20,20], keep order:false, stats:pseudo" + ], + "Warnings": [ + "Warning 1105 IndexMerge is inapplicable or disabled" + ] + }, + { + "SQL": "explain format = 'brief' select /*+ use_index_merge(tt) */ * from tt where a=15 or (a < 10 or a > 20);", + "Plan": [ + "IndexReader 6666.67 root index:IndexRangeScan", + "└─IndexRangeScan 6666.67 cop[tikv] table:tt, index:a(a) range:[-inf,10), [15,15], (20,+inf], keep order:false, stats:pseudo" + ], + "Warnings": [ + "Warning 1105 IndexMerge is inapplicable or disabled" + ] + } + ] + }, { "Name": "TestApproxPercentile", "Cases": [ @@ -1242,5 +1352,134 @@ ] } ] + }, + { + "Name": "TestConvertRangeToPoint", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t0 where a > 1 and a < 3 order by b limit 2", + "Plan": [ + "Limit 2.00 root offset:0, count:2", + "└─IndexReader 2.00 root index:Limit", + " └─Limit 2.00 cop[tikv] offset:0, count:2", + " └─IndexRangeScan 2.50 cop[tikv] table:t0, index:a(a, b) range:[2,2], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 where a >= 2 and a <= 2 and b = 2 and c > 2", + "Plan": [ + "IndexReader 0.33 root index:IndexRangeScan", + "└─IndexRangeScan 0.33 cop[tikv] table:t1, index:a(a, b, c) range:(2 2 2,2 2 +inf], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t2 where a >= 2.5 and a <= 2.5 order by b limit 2", + "Plan": [ + "Limit 2.00 root offset:0, count:2", + "└─IndexReader 2.00 root index:Limit", + " └─Limit 2.00 cop[tikv] offset:0, count:2", + " └─IndexRangeScan 2.00 cop[tikv] table:t2, index:a(a, b) range:[2.5,2.5], keep order:true, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t3 where a >= 'a' and a <= 'a' and b = 'b' and c > 'c'", + "Plan": [ + "IndexReader 0.33 root index:IndexRangeScan", + "└─IndexRangeScan 0.33 cop[tikv] table:t3, index:a(a, b, c) range:(\"a\" \"b\" \"c\",\"a\" \"b\" +inf], keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestIssue22105", + "Cases": [ + { + "SQL": "explain format = 'brief' SELECT /*+ use_index_merge(t1)*/ COUNT(*) FROM t1 WHERE (key4=42 AND key6 IS NOT NULL) OR (key1=4 AND key3=6)", + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#10", + "└─IndexMerge 0.02 root ", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:i4(key4) range:[42,42], keep order:false, stats:pseudo", + " ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t1, index:i1(key1) range:[4,4], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.02 cop[tikv] or(and(eq(test.t1.key4, 42), not(isnull(test.t1.key6))), and(eq(test.t1.key1, 4), eq(test.t1.key3, 6)))", + " └─TableRowIDScan 19.99 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestReorderSimplifiedOuterJoins", + "Cases": [ + { + "SQL": "explain format = 'brief' SELECT t1.pk FROM t1 INNER JOIN t2 ON t1.col1 = t2.pk INNER JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'", + "Plan": [ + "IndexJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", + "├─IndexJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", + "│ ├─IndexLookUp(Build) 10.00 root ", + "│ │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t3, index:keycol(keycol, pad1, pad2) range:[\"c\",\"c\"], keep order:false, stats:pseudo", + "│ │ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─IndexLookUp(Probe) 1.25 root ", + "│ ├─Selection(Build) 1.81 cop[tikv] not(isnull(test.t1.col3))", + "│ │ └─IndexRangeScan 1.81 cop[tikv] table:t1, index:col2(col2, col3) range: decided by [eq(test.t1.col3, test.t3.pk) eq(test.t1.col2, a)], keep order:false, stats:pseudo", + "│ └─Selection(Probe) 1.25 cop[tikv] ne(test.t1.col1, \"aaaaaa\"), ne(test.t1.col1, \"abcdef\"), not(isnull(test.t1.col1))", + "│ └─TableRowIDScan 1.81 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.00 root ", + " ├─Selection(Build) 1.00 cop[tikv] ne(test.t2.pk, \"aaaaaa\"), ne(test.t2.pk, \"abcdef\")", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t2, index:PRIMARY(pk) range: decided by [eq(test.t2.pk, test.t1.col1)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.00 cop[tikv] in(test.t2.col1, \"a\", \"b\")", + " └─TableRowIDScan 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' SELECT t1.pk FROM t1 LEFT JOIN t2 ON t1.col1 = t2.pk LEFT JOIN t3 ON t1.col3 = t3.pk WHERE t2.col1 IN ('a' , 'b') AND t3.keycol = 'c' AND t1.col2 = 'a' AND t1.col1 != 'abcdef' AND t1.col1 != 'aaaaaa'", + "Plan": [ + "IndexJoin 13.81 root inner join, inner:IndexLookUp, outer key:test.t1.col1, inner key:test.t2.pk, equal cond:eq(test.t1.col1, test.t2.pk)", + "├─IndexJoin(Build) 12.50 root inner join, inner:IndexLookUp, outer key:test.t3.pk, inner key:test.t1.col3, equal cond:eq(test.t3.pk, test.t1.col3)", + "│ ├─IndexLookUp(Build) 10.00 root ", + "│ │ ├─IndexRangeScan(Build) 10.00 cop[tikv] table:t3, index:keycol(keycol, pad1, pad2) range:[\"c\",\"c\"], keep order:false, stats:pseudo", + "│ │ └─TableRowIDScan(Probe) 10.00 cop[tikv] table:t3 keep order:false, stats:pseudo", + "│ └─IndexLookUp(Probe) 1.25 root ", + "│ ├─Selection(Build) 1.81 cop[tikv] not(isnull(test.t1.col3))", + "│ │ └─IndexRangeScan 1.81 cop[tikv] table:t1, index:col2(col2, col3) range: decided by [eq(test.t1.col3, test.t3.pk) eq(test.t1.col2, a)], keep order:false, stats:pseudo", + "│ └─Selection(Probe) 1.25 cop[tikv] ne(test.t1.col1, \"aaaaaa\"), ne(test.t1.col1, \"abcdef\"), not(isnull(test.t1.col1))", + "│ └─TableRowIDScan 1.81 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.00 root ", + " ├─Selection(Build) 1.00 cop[tikv] ne(test.t2.pk, \"aaaaaa\"), ne(test.t2.pk, \"abcdef\")", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t2, index:PRIMARY(pk) range: decided by [eq(test.t2.pk, test.t1.col1)], keep order:false, stats:pseudo", + " └─Selection(Probe) 1.00 cop[tikv] in(test.t2.col1, \"a\", \"b\")", + " └─TableRowIDScan 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestDecorrelateInnerJoinInSubquery", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 where t1.a = t2.a and t1.a = t.a)", + "Plan": [ + "HashJoin 8000.00 root semi join, equal:[eq(test.t.a, test.t.a)]", + "├─HashJoin(Build) 12500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t where exists (select 1 from t t1 join t t2 on t1.a = t2.a and t1.a = t.a)", + "Plan": [ + "HashJoin 8000.00 root semi join, equal:[eq(test.t.a, test.t.a)]", + "├─HashJoin(Build) 12500.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + "│ ├─TableReader(Build) 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "│ └─TableReader(Probe) 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + ] + } + ] } ] diff --git a/planner/core/testdata/partition_pruner_in.json b/planner/core/testdata/partition_pruner_in.json new file mode 100644 index 0000000000000..70aee845cc168 --- /dev/null +++ b/planner/core/testdata/partition_pruner_in.json @@ -0,0 +1,315 @@ +[ + { + "name": "TestHashPartitionPruner", + "cases": [ + "explain format = 'brief' select * from t1 where id = 7 and a = 6", + "explain format = 'brief' select * from t3 where id = 9 and a = 1", + "explain format = 'brief' select * from t2 where id = 9 and a = -110", + "explain format = 'brief' select * from t1 where id = -17", + "explain format = 'brief' select * from t1 join t2 on (t1.id = t2.id) where t1.id = 5 and t2.a = 7", + "explain format = 'brief' select * from t1 left join t2 on t1.id = 1 and t2.a = 2 where t2.id = 7", + "explain format = 'brief' select * from t2 join t1 on t1.id = t2.id and t2.a = t1.id and t2.id = 12", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and false", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and null", + "explain format = 'brief' select * from t1 left join t2 on true where t1.a = null", + "explain format = 'brief' select * from t4 where d = '2019-10-07 10:40:00' and a = 1", + "explain format = 'brief' select * from t5 where d = '2019-10-07'", + "explain format = 'brief' select * from t6 where a is null", + "explain format = 'brief' select * from t6 where b is null", + "explain format = 'brief' select * from t6 where a = 7 or a = 6", + "explain format = 'brief' select * from t6 where a in (6, 7)", + "explain format = 'brief' select * from t5 where d is null", + "explain format = 'brief' select * from t7 where b = -3 and a is null", + "explain format = 'brief' select * from t7 where (a, b) in ((3, 4), (5, 6))", + "explain format = 'brief' select * from t7 where (a = 1 and b = 2) or (a = 3 and b = 4)", + "explain format = 'brief' select * from t7 where (a = 1 and b = 2) or (a = 1 and b = 2)", + "explain format = 'brief' select * from t7 partition(p0) where (a = 1 and b = 2) or (a = 3 and b = 4)" + ] + }, + { + "name": "TestListPartitionPruner", + "cases": [ + "select * from t1 where id = 6 and a = 6", + "select * from t2 where id = 6 and a = 6 and b = 6", + "select * from t3 where id = 6 and a = 6", + "select * from t1 where id = 6 and (a = 6 or a is null)", + "select * from t2 where id = 6 and (a = 6 and b = 6 ) or ( a is null and b = 6 )", + "select * from t3 where id = 6 and (a = 6 or a is null)", + "select * from t1 where id = 6 and (a = 1 or a is null)", + "select * from t2 where id = 6 and (a = 6 and b = 6) or ( a is null and b = 6)", + "select * from t3 where id = 6 and (a = 1 or a is null)", + "select * from t1 where (id = 1 and a = 1) or a is null", + "select * from t2 where (id = 1 and a = 1 and b = 1) or (a is null and b is null)", + "select * from t3 where (id = 1 and a = 1) or a is null", + "select * from t1 where (id = 1 and a = 1) or (a = 1 and id = 1)", + "select * from t2 where (id = 1 and a = 1 and b = 1) or (a = 1 and id = 1 and b=1)", + "select * from t3 where (id = 1 and a = 1) or (a = 1 and id = 1)", + "select * from t1 where a is null", + "select * from t2 where a is null and b is null", + "select * from t3 where a is null", + "select * from t1 where a=id and id >10", + "select * from t2 where a=id and id >10", + "select * from t3 where a=id and id >10", + "select * from t1 where a=id and id >10 or a is null", + "select * from t2 where a=id and id >10 or a is null", + "select * from t3 where a=id and id >10 or a is null", + "select * from t1 where a in (1,2) or a=4", + "select * from t2 where a in (1,2) or a=4", + "select * from t3 where a in (1,2) or a=4", + "select * from t1 where a in (1,2) or a=6", + "select * from t2 where (a in (1,2) or a=7) and b = 2", + "select * from t3 where a in (1,2) or a=8", + "select * from t1 where id = 1 or b = 1", + "select * from t2 where id = 1 or b = 1", + "select * from t3 where id = 1 or b = 1", + "select * from t1 where a = 100", + "select * from t2 where a = 100 and b = 100", + "select * from t3 where a = 100", + "select * from t1 partition(p0) where a in (1,3,5,7)", + "select * from t2 partition(p0) where b in (1,3,5,7)", + "select * from t1 partition(p1) where a in (1,3,5,7)", + "select * from t2 partition(p1) where a in (1,3,5,7)", + "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "select * from t1 left join t3 on t1.id = t3.id where (t1.a=1 or t1.a = 3) and t3.a in (6,7,8)", + "select * from t3 right join t2 on t3.id = t2.id where (t3.a=1 or t3.a = 3) and t2.a in (6,7,8) and t2.b = 6", + "select * from t1 join t2 on true where t1.a=5 and t2.a in (6,7,8) and t1.a-t2.a=1 and t2.b = 6", + "select * from t1 where a = 6 union select * from t1 where a = 1 order by a", + "select * from t4 join t5 on t4.id = t5.id where (t4.a=1 or t4.a = 3) and (t5.a = 1 or t5.a = 6) and t5.b in (1,6)", + "select * from t4 t1 join t4 t2 on t1.id = t2.id where t1.a in (1, 4) and t2.a in (1,3,9,100)", + "select * from t6 t1 join t6 t2 on t1.id = t2.id where t1.a in (1, 4) and t2.a in (1,3,9,100)", + "select count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "select /*+ INL_JOIN(t6,t5) */ count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "select /*+ INL_HASH_JOIN(t5,t6) */ count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "select * from t7 where a is null or a > 0 order by a;" + ] + }, + { + "name": "TestListColumnsPartitionPruner", + "cases": [ + { + "SQL": "select * from t1 order by id,a", + "Pruner": "t1: all" + }, + { + "SQL": "select count(1) from t1 order by id,a", + "Pruner": "t1: all" + }, + { + "SQL": "select * from t1 where a = 1 or b = 2", + "Pruner": "t1: p0" + }, + { + "SQL": "select count(1) from t1 where a = 1 or b = 2", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 and b = 2", + "Pruner": "t1: dual" + }, + { + "SQL": "select count(1) from t1 where a = 1 and b = 2", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a = 1 and b = 1", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a in (1,2,3) or b in (4,5,6)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (4,5,6)", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (3,4,6)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (1,2,3)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a in (1,2,3) or b in (1,2,3)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where ( a=1 and b=1) or (a=6 and b=6)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a = 100 and b = 100", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3 and t1.b in (3,5)) and t2.a in (6,7,8) and t2.b=7 and t2.id=7", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select * from t1 left join t2 on true where (t1.a=1 or t1.a = 3 and t1.b in (3,5)) and t2.a in (6,7,8) and t2.b=7 and t2.id = 7 order by t1.id,t1.a", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select * from t1 where a = 1", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where b = 1", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where b is null", + "Pruner": "t1: p1" + }, + { + "SQL": "select * from t1 where a is null", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a = 1 or b = 2", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 or (a = 2 and b = 2) or ((a,b) in ((4,4),(5,5)))", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 or (a is null and b = 10)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 or (a = 10 and b is null)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a = 8 or (a = 10 and b is null)", + "Pruner": "t1: p1" + }, + { + "SQL": "select * from t1 where a = 1 and false", + "Pruner": "" + }, + { + "SQL": "select * from t1 where a = 1 and true", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 or false", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 1 or true order by id,a", + "Pruner": "t1: all" + }, + { + "SQL": "select * from t1 where a = 1 or b in (100,200)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 100 or b in (1,2)", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 where a = 100 or b in (1,6)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a = 100 or b in (100,200)", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a in (1,6) or b in (1,2) or (a=3 and b =3)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a in (1,6)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a in (1,6) or (a=3 and b =3)", + "Pruner": "t1: p0,p1" + }, + { + "SQL": "select * from t1 where a in (1,6) and (a=3 and b =3)", + "Pruner": "" + }, + { + "SQL": "select * from t1 where a = 1 and (b=6 or a=6)", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a = 100 and (b=200 or a=200)", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 where a = 1 or (a+b=3)", + "Pruner": "t1: all" + }, + { + "SQL": "select * from t1 where id = 1 or id=2", + "Pruner": "t1: all" + }, + { + "SQL": "select * from t1 where id = 1 and a=1", + "Pruner": "t1: p0" + }, + { + "SQL": "select * from t1 partition(p1) where a = 1 or b = 2", + "Pruner": "t1: dual" + }, + { + "SQL": "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select * from t1 join t1 as t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select * from t1 where t1.a in (select b from t2 where a in (1,2)) order by a", + "Pruner": "t1: all; t2: p0" + }, + { + "SQL": "select * from t1 where t1.a in (select b from t1 where a in (1,2)) order by a", + "Pruner": "t1: all; t1: p0" + }, + { + "SQL": "select * from t1 left join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and t2.a in (6,7,8)", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select * from t1 right join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and t2.a in (1,2,3)", + "Pruner": "t1: p0; t2: p0" + }, + { + "SQL": "select * from t1 join t2 on true where t1.a=5 and t2.a in (6,7,8) and t2.b = 6", + "Pruner": "t1: p0; t2: p1" + }, + { + "SQL": "select count(*) from t1 join t2 on t1.b = t2.b where t1.a in (1,2) and t2.a in (1,6) and t1.b in (1,6)", + "Pruner": "t1: p0; t2: p0,p1" + }, + { + "SQL": "select /*+ INL_JOIN(t2,t1) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (1,6)", + "Pruner": "t1: p0,p1; t2: p0" + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (6,1)", + "Pruner": "t1: p0,p1; t2: p0" + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (100,9,6)", + "Pruner": "t1: p1; t2: dual" + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (100,9,6,1)", + "Pruner": "t1: p0,p1; t2: p0" + }, + { + "SQL": "select * from t1 where a in (1,2,3) union select * from t1 where b in (6,7,8) order by a", + "Pruner": "t1: p0; t1: p1" + } + ] + } +] diff --git a/planner/core/testdata/partition_pruner_out.json b/planner/core/testdata/partition_pruner_out.json new file mode 100644 index 0000000000000..9e2fc0d38ec42 --- /dev/null +++ b/planner/core/testdata/partition_pruner_out.json @@ -0,0 +1,1872 @@ +[ + { + "Name": "TestHashPartitionPruner", + "Cases": [ + { + "SQL": "explain format = 'brief' select * from t1 where id = 7 and a = 6", + "Result": [ + "TableReader 0.00 root partition:p7 data:Selection", + "└─Selection 0.00 cop[tikv] eq(test_partition.t1.a, 6)", + " └─TableRangeScan 1.00 cop[tikv] table:t1 range:[7,7], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t3 where id = 9 and a = 1", + "Result": [ + "Point_Get 1.00 root table:t3, partition:p9, index:PRIMARY(id, a) " + ] + }, + { + "SQL": "explain format = 'brief' select * from t2 where id = 9 and a = -110", + "Result": [ + "IndexLookUp 1.00 root partition:p1 ", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[9 -110,9 -110], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 where id = -17", + "Result": [ + "TableReader 1.00 root partition:p7 data:TableRangeScan", + "└─TableRangeScan 1.00 cop[tikv] table:t1 range:[-17,-17], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 join t2 on (t1.id = t2.id) where t1.id = 5 and t2.a = 7", + "Result": [ + "HashJoin 1.00 root CARTESIAN inner join", + "├─IndexLookUp(Build) 1.00 root partition:p2 ", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[5 7,5 7], keep order:false, stats:pseudo", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 1.00 root partition:p5 data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t1 range:[5,5], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 left join t2 on t1.id = 1 and t2.a = 2 where t2.id = 7", + "Result": [ + "HashJoin 1.00 root CARTESIAN inner join", + "├─IndexLookUp(Build) 1.00 root partition:p9 ", + "│ ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[7 2,7 2], keep order:false, stats:pseudo", + "│ └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─TableReader(Probe) 1.00 root partition:p1 data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t1 range:[1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t2 join t1 on t1.id = t2.id and t2.a = t1.id and t2.id = 12", + "Result": [ + "HashJoin 1.00 root CARTESIAN inner join", + "├─TableReader(Build) 1.00 root partition:p2 data:TableRangeScan", + "│ └─TableRangeScan 1.00 cop[tikv] table:t1 range:[12,12], keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 1.00 root partition:p4 ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t2, index:PRIMARY(id, a) range:[12 12,12 12], keep order:false, stats:pseudo", + " └─TableRowIDScan(Probe) 1.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and false", + "Result": [ + "TableDual 0.00 root rows:0" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = 1 and null", + "Result": [ + "TableDual 0.00 root rows:0" + ] + }, + { + "SQL": "explain format = 'brief' select * from t1 left join t2 on true where t1.a = null", + "Result": [ + "TableDual 0.00 root rows:0" + ] + }, + { + "SQL": "explain format = 'brief' select * from t4 where d = '2019-10-07 10:40:00' and a = 1", + "Result": [ + "IndexLookUp 1.00 root partition:p9 ", + "├─IndexRangeScan(Build) 1.00 cop[tikv] table:t4, index:PRIMARY(d, a) range:[2019-10-07 10:40:00 1,2019-10-07 10:40:00 1], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 1.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t5 where d = '2019-10-07'", + "Result": [ + "IndexLookUp 10.00 root partition:p0 ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:t5, index:PRIMARY(d, a) range:[2019-10-07,2019-10-07], keep order:false, stats:pseudo", + "└─TableRowIDScan(Probe) 10.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t6 where a is null", + "Result": [ + "TableReader 10.00 root partition:p0 data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t6.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t6 where b is null", + "Result": [ + "TableReader 10.00 root partition:all data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t6.b)", + " └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t6 where a = 7 or a = 6", + "Result": [ + "TableReader 20.00 root partition:p0,p1 data:Selection", + "└─Selection 20.00 cop[tikv] or(eq(test_partition.t6.a, 7), eq(test_partition.t6.a, 6))", + " └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t6 where a in (6, 7)", + "Result": [ + "TableReader 20.00 root partition:p0,p1 data:Selection", + "└─Selection 20.00 cop[tikv] in(test_partition.t6.a, 6, 7)", + " └─TableFullScan 10000.00 cop[tikv] table:t6 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t5 where d is null", + "Result": [ + "TableDual 0.00 root rows:0" + ] + }, + { + "SQL": "explain format = 'brief' select * from t7 where b = -3 and a is null", + "Result": [ + "TableReader 0.01 root partition:p0 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t7.b, -3), isnull(test_partition.t7.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t7 where (a, b) in ((3, 4), (5, 6))", + "Result": [ + "TableReader 0.02 root partition:p1,p7 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)), and(eq(test_partition.t7.a, 5), eq(test_partition.t7.b, 6)))", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t7 where (a = 1 and b = 2) or (a = 3 and b = 4)", + "Result": [ + "TableReader 0.02 root partition:p3,p7 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)))", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t7 where (a = 1 and b = 2) or (a = 1 and b = 2)", + "Result": [ + "TableReader 0.02 root partition:p3 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)))", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "explain format = 'brief' select * from t7 partition(p0) where (a = 1 and b = 2) or (a = 3 and b = 4)", + "Result": [ + "TableReader 0.02 root partition:dual data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t7.a, 1), eq(test_partition.t7.b, 2)), and(eq(test_partition.t7.a, 3), eq(test_partition.t7.b, 4)))", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestListPartitionPruner", + "Cases": [ + { + "SQL": "select * from t1 where id = 6 and a = 6", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.01 root partition:p1 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 6), eq(test_partition.t1.id, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where id = 6 and a = 6 and b = 6", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.00 root partition:p1 data:Selection", + "└─Selection 0.00 cop[tikv] eq(test_partition.t2.a, 6), eq(test_partition.t2.b, 6), eq(test_partition.t2.id, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where id = 6 and a = 6", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.01 root partition:p1 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t3.a, 6), eq(test_partition.t3.id, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where id = 6 and (a = 6 or a is null)", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.02 root partition:p1 data:Selection", + "└─Selection 0.02 cop[tikv] eq(test_partition.t1.id, 6), or(eq(test_partition.t1.a, 6), isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where id = 6 and (a = 6 and b = 6 ) or ( a is null and b = 6 )", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.01 root partition:p1 data:Selection", + "└─Selection 0.01 cop[tikv] or(and(eq(test_partition.t2.id, 6), and(eq(test_partition.t2.a, 6), eq(test_partition.t2.b, 6))), and(isnull(test_partition.t2.a), eq(test_partition.t2.b, 6)))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where id = 6 and (a = 6 or a is null)", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.02 root partition:p1 data:Selection", + "└─Selection 0.02 cop[tikv] eq(test_partition.t3.id, 6), or(eq(test_partition.t3.a, 6), isnull(test_partition.t3.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where id = 6 and (a = 1 or a is null)", + "Result": null, + "Plan": [ + "TableReader 0.02 root partition:p0,p1 data:Selection", + "└─Selection 0.02 cop[tikv] eq(test_partition.t1.id, 6), or(eq(test_partition.t1.a, 1), isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where id = 6 and (a = 6 and b = 6) or ( a is null and b = 6)", + "Result": [ + "6 6 6" + ], + "Plan": [ + "TableReader 0.01 root partition:p1 data:Selection", + "└─Selection 0.01 cop[tikv] or(and(eq(test_partition.t2.id, 6), and(eq(test_partition.t2.a, 6), eq(test_partition.t2.b, 6))), and(isnull(test_partition.t2.a), eq(test_partition.t2.b, 6)))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where id = 6 and (a = 1 or a is null)", + "Result": null, + "Plan": [ + "TableReader 0.02 root partition:p0,p1 data:Selection", + "└─Selection 0.02 cop[tikv] eq(test_partition.t3.id, 6), or(eq(test_partition.t3.a, 1), isnull(test_partition.t3.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where (id = 1 and a = 1) or a is null", + "Result": [ + "1 1 1", + " " + ], + "Plan": [ + "TableReader 10.01 root partition:p0,p1 data:Selection", + "└─Selection 10.01 cop[tikv] or(and(eq(test_partition.t1.id, 1), eq(test_partition.t1.a, 1)), isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where (id = 1 and a = 1 and b = 1) or (a is null and b is null)", + "Result": [ + "1 1 1", + " " + ], + "Plan": [ + "TableReader 0.01 root partition:p0,p1 data:Selection", + "└─Selection 0.01 cop[tikv] or(and(eq(test_partition.t2.id, 1), and(eq(test_partition.t2.a, 1), eq(test_partition.t2.b, 1))), and(isnull(test_partition.t2.a), isnull(test_partition.t2.b)))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where (id = 1 and a = 1) or a is null", + "Result": [ + "1 1 1", + " " + ], + "Plan": [ + "TableReader 10.01 root partition:p0,p1 data:Selection", + "└─Selection 10.01 cop[tikv] or(and(eq(test_partition.t3.id, 1), eq(test_partition.t3.a, 1)), isnull(test_partition.t3.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where (id = 1 and a = 1) or (a = 1 and id = 1)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 0.02 root partition:p0 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t1.id, 1), eq(test_partition.t1.a, 1)), and(eq(test_partition.t1.a, 1), eq(test_partition.t1.id, 1)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where (id = 1 and a = 1 and b = 1) or (a = 1 and id = 1 and b=1)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 0.00 root partition:p0 data:Selection", + "└─Selection 0.00 cop[tikv] or(and(eq(test_partition.t2.id, 1), and(eq(test_partition.t2.a, 1), eq(test_partition.t2.b, 1))), and(eq(test_partition.t2.a, 1), and(eq(test_partition.t2.id, 1), eq(test_partition.t2.b, 1))))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where (id = 1 and a = 1) or (a = 1 and id = 1)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 0.02 root partition:p0 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t3.id, 1), eq(test_partition.t3.a, 1)), and(eq(test_partition.t3.a, 1), eq(test_partition.t3.id, 1)))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 10.00 root partition:p1 data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t1.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where a is null and b is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 0.01 root partition:p1 data:Selection", + "└─Selection 0.01 cop[tikv] isnull(test_partition.t2.a), isnull(test_partition.t2.b)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 10.00 root partition:p1 data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t3.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a=id and id >10", + "Result": null, + "Plan": [ + "TableReader 888.89 root partition:all data:Selection", + "└─Selection 888.89 cop[tikv] eq(test_partition.t1.a, test_partition.t1.id), gt(test_partition.t1.a, 10), gt(test_partition.t1.id, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where a=id and id >10", + "Result": null, + "Plan": [ + "TableReader 888.89 root partition:all data:Selection", + "└─Selection 888.89 cop[tikv] eq(test_partition.t2.a, test_partition.t2.id), gt(test_partition.t2.a, 10), gt(test_partition.t2.id, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a=id and id >10", + "Result": null, + "Plan": [ + "TableReader 888.89 root partition:all data:Selection", + "└─Selection 888.89 cop[tikv] eq(test_partition.t3.a, test_partition.t3.id), gt(test_partition.t3.a, 10), gt(test_partition.t3.id, 10)", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a=id and id >10 or a is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 898.00 root partition:all data:Selection", + "└─Selection 898.00 cop[tikv] or(and(eq(test_partition.t1.a, test_partition.t1.id), and(gt(test_partition.t1.id, 10), gt(test_partition.t1.a, 10))), isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where a=id and id >10 or a is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 898.00 root partition:all data:Selection", + "└─Selection 898.00 cop[tikv] or(and(eq(test_partition.t2.a, test_partition.t2.id), and(gt(test_partition.t2.id, 10), gt(test_partition.t2.a, 10))), isnull(test_partition.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a=id and id >10 or a is null", + "Result": [ + " " + ], + "Plan": [ + "TableReader 898.00 root partition:all data:Selection", + "└─Selection 898.00 cop[tikv] or(and(eq(test_partition.t3.a, test_partition.t3.id), and(gt(test_partition.t3.id, 10), gt(test_partition.t3.a, 10))), isnull(test_partition.t3.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2) or a=4", + "Result": [ + "1 1 1", + "2 2 2", + "4 4 4" + ], + "Plan": [ + "TableReader 30.00 root partition:p0 data:Selection", + "└─Selection 30.00 cop[tikv] or(in(test_partition.t1.a, 1, 2), eq(test_partition.t1.a, 4))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where a in (1,2) or a=4", + "Result": [ + "1 1 1", + "2 2 2", + "4 4 4" + ], + "Plan": [ + "TableReader 30.00 root partition:all data:Selection", + "└─Selection 30.00 cop[tikv] or(in(test_partition.t2.a, 1, 2), eq(test_partition.t2.a, 4))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a in (1,2) or a=4", + "Result": [ + "1 1 1", + "2 2 2", + "4 4 4" + ], + "Plan": [ + "TableReader 30.00 root partition:p0 data:Selection", + "└─Selection 30.00 cop[tikv] or(in(test_partition.t3.a, 1, 2), eq(test_partition.t3.a, 4))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2) or a=6", + "Result": [ + "1 1 1", + "2 2 2", + "6 6 6" + ], + "Plan": [ + "TableReader 30.00 root partition:p0,p1 data:Selection", + "└─Selection 30.00 cop[tikv] or(in(test_partition.t1.a, 1, 2), eq(test_partition.t1.a, 6))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where (a in (1,2) or a=7) and b = 2", + "Result": [ + "2 2 2" + ], + "Plan": [ + "TableReader 0.03 root partition:p0,p1 data:Selection", + "└─Selection 0.03 cop[tikv] eq(test_partition.t2.b, 2), or(in(test_partition.t2.a, 1, 2), eq(test_partition.t2.a, 7))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a in (1,2) or a=8", + "Result": [ + "1 1 1", + "2 2 2", + "8 8 8" + ], + "Plan": [ + "TableReader 30.00 root partition:p0,p1 data:Selection", + "└─Selection 30.00 cop[tikv] or(in(test_partition.t3.a, 1, 2), eq(test_partition.t3.a, 8))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where id = 1 or b = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 19.99 root partition:all data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t1.id, 1), eq(test_partition.t1.b, 1))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where id = 1 or b = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 19.99 root partition:all data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t2.id, 1), eq(test_partition.t2.b, 1))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where id = 1 or b = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 19.99 root partition:all data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t3.id, 1), eq(test_partition.t3.b, 1))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100", + "Result": null, + "Plan": [ + "TableReader 10.00 root partition:dual data:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition.t1.a, 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 where a = 100 and b = 100", + "Result": null, + "Plan": [ + "TableReader 0.01 root partition:dual data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t2.a, 100), eq(test_partition.t2.b, 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 where a = 100", + "Result": null, + "Plan": [ + "TableReader 10.00 root partition:dual data:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition.t3.a, 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 partition(p0) where a in (1,3,5,7)", + "Result": [ + "1 1 1", + "3 3 3", + "5 5 5" + ], + "Plan": [ + "TableReader 40.00 root partition:p0 data:Selection", + "└─Selection 40.00 cop[tikv] in(test_partition.t1.a, 1, 3, 5, 7)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 partition(p0) where b in (1,3,5,7)", + "Result": [ + "1 1 1", + "3 3 3", + "5 5 5" + ], + "Plan": [ + "TableReader 40.00 root partition:p0 data:Selection", + "└─Selection 40.00 cop[tikv] in(test_partition.t2.b, 1, 3, 5, 7)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 partition(p1) where a in (1,3,5,7)", + "Result": [ + "7 7 7" + ], + "Plan": [ + "TableReader 40.00 root partition:p1 data:Selection", + "└─Selection 40.00 cop[tikv] in(test_partition.t1.a, 1, 3, 5, 7)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t2 partition(p1) where a in (1,3,5,7)", + "Result": [ + "7 7 7" + ], + "Plan": [ + "TableReader 40.00 root partition:p1 data:Selection", + "└─Selection 40.00 cop[tikv] in(test_partition.t2.a, 1, 3, 5, 7)", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "Result": null, + "Plan": [ + "Projection 0.01 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.a, test_partition.t2.id, test_partition.t2.b", + "└─HashJoin 0.01 root inner join, equal:[eq(test_partition.t2.id, test_partition.t1.id)]", + " ├─TableReader(Build) 0.01 root partition:p1 data:Selection", + " │ └─Selection 0.01 cop[tikv] eq(test_partition.t2.a, 6), eq(test_partition.t2.b, 6), not(isnull(test_partition.t2.id))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 19.98 root partition:p0 data:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 left join t3 on t1.id = t3.id where (t1.a=1 or t1.a = 3) and t3.a in (6,7,8)", + "Result": null, + "Plan": [ + "HashJoin 24.98 root inner join, equal:[eq(test_partition.t1.id, test_partition.t3.id)]", + "├─TableReader(Build) 19.98 root partition:p0 data:Selection", + "│ └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 29.97 root partition:p1 data:Selection", + " └─Selection 29.97 cop[tikv] in(test_partition.t3.a, 6, 7, 8), not(isnull(test_partition.t3.id))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t3 right join t2 on t3.id = t2.id where (t3.a=1 or t3.a = 3) and t2.a in (6,7,8) and t2.b = 6", + "Result": null, + "Plan": [ + "Projection 0.04 root test_partition.t3.b, test_partition.t3.id, test_partition.t3.a, test_partition.t2.a, test_partition.t2.id, test_partition.t2.b", + "└─HashJoin 0.04 root inner join, equal:[eq(test_partition.t2.id, test_partition.t3.id)]", + " ├─TableReader(Build) 0.03 root partition:p1 data:Selection", + " │ └─Selection 0.03 cop[tikv] eq(test_partition.t2.b, 6), in(test_partition.t2.a, 6, 7, 8), not(isnull(test_partition.t2.id))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 19.98 root partition:p0 data:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition.t3.id)), or(eq(test_partition.t3.a, 1), eq(test_partition.t3.a, 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t3 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t2 on true where t1.a=5 and t2.a in (6,7,8) and t1.a-t2.a=1 and t2.b = 6", + "Result": null, + "Plan": [ + "Projection 80.00 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.a, test_partition.t2.id, test_partition.t2.b", + "└─HashJoin 80.00 root CARTESIAN inner join", + " ├─TableReader(Build) 8.00 root partition:p1 data:Selection", + " │ └─Selection 8.00 cop[tikv] 1, eq(minus(5, test_partition.t2.a), 1), eq(test_partition.t2.b, 6), in(test_partition.t2.a, 6, 7, 8)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10.00 root partition:p0 data:Selection", + " └─Selection 10.00 cop[tikv] 1, eq(test_partition.t1.a, 5)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 6 union select * from t1 where a = 1 order by a", + "Result": [ + "1 1 1", + "6 6 6" + ], + "Plan": [ + "Sort 16.00 root Column#10", + "└─HashAgg 16.00 root group by:Column#10, Column#11, Column#9, funcs:firstrow(Column#9)->Column#9, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + " └─Union 20.00 root ", + " ├─TableReader 10.00 root partition:p1 data:Selection", + " │ └─Selection 10.00 cop[tikv] eq(test_partition.t1.a, 6)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader 10.00 root partition:p0 data:Selection", + " └─Selection 10.00 cop[tikv] eq(test_partition.t1.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t4 join t5 on t4.id = t5.id where (t4.a=1 or t4.a = 3) and (t5.a = 1 or t5.a = 6) and t5.b in (1,6)", + "Result": [ + "1 1 1 1 1 1" + ], + "Plan": [ + "HashJoin 2.50 root inner join, equal:[eq(test_partition.t4.id, test_partition.t5.id)]", + "├─TableReader(Build) 2.00 root partition:p0 data:Selection", + "│ └─Selection 2.00 cop[tikv] not(isnull(test_partition.t4.id))", + "│ └─TableRangeScan 2.00 cop[tikv] table:t4 range:[1,1], [3,3], keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 4.00 root partition:p0,p1 ", + " ├─IndexRangeScan(Build) 4.00 cop[tikv] table:t5, index:a(a, b) range:[1 1,1 1], [1 6,1 6], [6 1,6 1], [6 6,6 6], keep order:false, stats:pseudo", + " └─Selection(Probe) 4.00 cop[tikv] not(isnull(test_partition.t5.id))", + " └─TableRowIDScan 4.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t4 t1 join t4 t2 on t1.id = t2.id where t1.a in (1, 4) and t2.a in (1,3,9,100)", + "Result": [ + "1 1 1 1 1 1" + ], + "Plan": [ + "HashJoin 2.50 root inner join, equal:[eq(test_partition.t4.id, test_partition.t4.id)]", + "├─TableReader(Build) 2.00 root partition:p0 data:Selection", + "│ └─Selection 2.00 cop[tikv] not(isnull(test_partition.t4.id))", + "│ └─TableRangeScan 2.00 cop[tikv] table:t1 range:[1,1], [4,4], keep order:false, stats:pseudo", + "└─TableReader(Probe) 4.00 root partition:p0,p1 data:Selection", + " └─Selection 4.00 cop[tikv] not(isnull(test_partition.t4.id))", + " └─TableRangeScan 4.00 cop[tikv] table:t2 range:[1,1], [3,3], [9,9], [100,100], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t6 t1 join t6 t2 on t1.id = t2.id where t1.a in (1, 4) and t2.a in (1,3,9,100)", + "Result": [ + "1 1 1 1 1 1" + ], + "Plan": [ + "HashJoin 24.97 root inner join, equal:[eq(test_partition.t6.id, test_partition.t6.id)]", + "├─IndexLookUp(Build) 19.98 root partition:p0 ", + "│ ├─IndexRangeScan(Build) 20.00 cop[tikv] table:t1, index:a(a, b) range:[1,1], [4,4], keep order:false, stats:pseudo", + "│ └─Selection(Probe) 19.98 cop[tikv] not(isnull(test_partition.t6.id))", + "│ └─TableRowIDScan 20.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─IndexLookUp(Probe) 39.96 root partition:p0,p1 ", + " ├─IndexRangeScan(Build) 40.00 cop[tikv] table:t2, index:a(a, b) range:[1,1], [3,3], [9,9], [100,100], keep order:false, stats:pseudo", + " └─Selection(Probe) 39.96 cop[tikv] not(isnull(test_partition.t6.id))", + " └─TableRowIDScan 40.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 4.00 root inner join, equal:[eq(test_partition.t6.b, test_partition.t5.b)]", + " ├─IndexReader(Build) 4.00 root partition:p0,p1 index:Selection", + " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t5.b))", + " │ └─IndexRangeScan 4.00 cop[tikv] table:t5, index:a(a, b) range:[1 1,1 1], [1 6,1 6], [6 1,6 1], [6 6,6 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 4.00 root partition:p0 index:Selection", + " └─Selection 4.00 cop[tikv] not(isnull(test_partition.t6.b))", + " └─IndexRangeScan 4.00 cop[tikv] table:t6, index:a(a, b) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_JOIN(t6,t5) */ count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexJoin 4.00 root inner join, inner:IndexReader, outer key:test_partition.t6.b, inner key:test_partition.t5.b, equal cond:eq(test_partition.t6.b, test_partition.t5.b)", + " ├─IndexReader(Build) 4.00 root partition:p0 index:Selection", + " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t6.b))", + " │ └─IndexRangeScan 4.00 cop[tikv] table:t6, index:a(a, b) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 1.25 root partition:p0,p1 index:Selection", + " └─Selection 1.25 cop[tikv] in(test_partition.t5.b, 1, 6), not(isnull(test_partition.t5.b))", + " └─IndexRangeScan 625.00 cop[tikv] table:t5, index:a(a, b) range: decided by [eq(test_partition.t5.b, test_partition.t6.b) in(test_partition.t5.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t5,t6) */ count(*) from t6 join t5 on t6.b = t5.b where t6.a in (1,2) and t5.a in (1,6) and t5.b in (1,6)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexHashJoin 4.00 root inner join, inner:IndexReader, outer key:test_partition.t6.b, inner key:test_partition.t5.b, equal cond:eq(test_partition.t6.b, test_partition.t5.b)", + " ├─IndexReader(Build) 4.00 root partition:p0 index:Selection", + " │ └─Selection 4.00 cop[tikv] not(isnull(test_partition.t6.b))", + " │ └─IndexRangeScan 4.00 cop[tikv] table:t6, index:a(a, b) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 1.25 root partition:p0,p1 index:Selection", + " └─Selection 1.25 cop[tikv] in(test_partition.t5.b, 1, 6), not(isnull(test_partition.t5.b))", + " └─IndexRangeScan 625.00 cop[tikv] table:t5, index:a(a, b) range: decided by [eq(test_partition.t5.b, test_partition.t6.b) in(test_partition.t5.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t7 where a is null or a > 0 order by a;", + "Result": [ + "", + "1", + "2" + ], + "Plan": [ + "Sort 3343.33 root test_partition.t7.a", + "└─TableReader 3343.33 root partition:all data:Selection", + " └─Selection 3343.33 cop[tikv] or(isnull(test_partition.t7.a), gt(test_partition.t7.a, 0))", + " └─TableFullScan 10000.00 cop[tikv] table:t7 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestListColumnsPartitionPruner", + "Cases": [ + { + "SQL": "select * from t1 order by id,a", + "Result": [ + " 10 ", + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6", + "7 7 7", + "8 8 8", + "9 9 9", + "10 10 10" + ], + "Plan": [ + "Sort 10000.00 root test_partition.t1.id, test_partition.t1.a", + "└─TableReader 10000.00 root partition:all data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 10000.00 root test_partition_1.t1.id, test_partition_1.t1.a", + "└─IndexReader 10000.00 root partition:all index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select count(1) from t1 order by id,a", + "Result": [ + "11" + ], + "Plan": [ + "Projection 1.00 root Column#5", + "└─Sort 1.00 root test_partition.t1.id, test_partition.t1.a", + " └─StreamAgg 1.00 root funcs:count(Column#10)->Column#5, funcs:firstrow(Column#11)->test_partition.t1.id, funcs:firstrow(Column#12)->test_partition.t1.a", + " └─TableReader 1.00 root partition:all data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#10, funcs:firstrow(test_partition.t1.id)->Column#11, funcs:firstrow(test_partition.t1.a)->Column#12", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Projection 1.00 root Column#5", + "└─Sort 1.00 root test_partition_1.t1.id, test_partition_1.t1.a", + " └─StreamAgg 1.00 root funcs:count(Column#13)->Column#5, funcs:firstrow(Column#14)->test_partition_1.t1.id, funcs:firstrow(Column#15)->test_partition_1.t1.a", + " └─IndexReader 1.00 root partition:all index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#13, funcs:firstrow(test_partition_1.t1.id)->Column#14, funcs:firstrow(test_partition_1.t1.a)->Column#15", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or b = 2", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "TableReader 19.99 root partition:p0 data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 19.99 root partition:p0 index:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(test_partition_1.t1.b, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select count(1) from t1 where a = 1 or b = 2", + "Result": [ + "2" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(Column#7)->Column#5", + "└─TableReader 1.00 root partition:p0 data:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#7", + " └─Selection 19.99 cop[tikv] or(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(Column#10)->Column#5", + "└─IndexReader 1.00 root partition:p0 index:StreamAgg", + " └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#10", + " └─Selection 19.99 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(test_partition_1.t1.b, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 and b = 2", + "Result": null, + "Plan": [ + "TableReader 0.01 root partition:dual data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.10 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[1 2,1 2], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select count(1) from t1 where a = 1 and b = 2", + "Result": [ + "0" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#5", + "└─TableReader 0.01 root partition:dual data:Selection", + " └─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#5", + "└─IndexReader 0.10 root partition:dual index:IndexRangeScan", + " └─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[1 2,1 2], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 and b = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 0.01 root partition:p0 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.10 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[1 1,1 1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) or b in (4,5,6)", + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6" + ], + "Plan": [ + "TableReader 59.91 root partition:p0,p1 data:Selection", + "└─Selection 59.91 cop[tikv] or(in(test_partition.t1.a, 1, 2, 3), in(test_partition.t1.b, 4, 5, 6))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 59.91 root partition:p0,p1 index:Selection", + "└─Selection 59.91 cop[tikv] or(in(test_partition_1.t1.a, 1, 2, 3), in(test_partition_1.t1.b, 4, 5, 6))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (4,5,6)", + "Result": null, + "Plan": [ + "TableReader 0.09 root partition:dual data:Selection", + "└─Selection 0.09 cop[tikv] in(test_partition.t1.a, 1, 2, 3), in(test_partition.t1.b, 4, 5, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.90 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 0.90 cop[tikv] table:t1, index:a(a, b, id) range:[1 4,1 4], [1 5,1 5], [1 6,1 6], [2 4,2 4], [2 5,2 5], [2 6,2 6], [3 4,3 4], [3 5,3 5], [3 6,3 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (3,4,6)", + "Result": [ + "3 3 3" + ], + "Plan": [ + "TableReader 0.09 root partition:p0 data:Selection", + "└─Selection 0.09 cop[tikv] in(test_partition.t1.a, 1, 2, 3), in(test_partition.t1.b, 3, 4, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.90 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 0.90 cop[tikv] table:t1, index:a(a, b, id) range:[1 3,1 3], [1 4,1 4], [1 6,1 6], [2 3,2 3], [2 4,2 4], [2 6,2 6], [3 3,3 3], [3 4,3 4], [3 6,3 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) and b in (1,2,3)", + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3" + ], + "Plan": [ + "TableReader 0.09 root partition:p0 data:Selection", + "└─Selection 0.09 cop[tikv] in(test_partition.t1.a, 1, 2, 3), in(test_partition.t1.b, 1, 2, 3)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.90 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 0.90 cop[tikv] table:t1, index:a(a, b, id) range:[1 1,1 1], [1 2,1 2], [1 3,1 3], [2 1,2 1], [2 2,2 2], [2 3,2 3], [3 1,3 1], [3 2,3 2], [3 3,3 3], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) or b in (1,2,3)", + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3" + ], + "Plan": [ + "TableReader 59.91 root partition:p0 data:Selection", + "└─Selection 59.91 cop[tikv] or(in(test_partition.t1.a, 1, 2, 3), in(test_partition.t1.b, 1, 2, 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 59.91 root partition:p0 index:Selection", + "└─Selection 59.91 cop[tikv] or(in(test_partition_1.t1.a, 1, 2, 3), in(test_partition_1.t1.b, 1, 2, 3))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where ( a=1 and b=1) or (a=6 and b=6)", + "Result": [ + "1 1 1", + "6 6 6" + ], + "Plan": [ + "TableReader 0.02 root partition:p0,p1 data:Selection", + "└─Selection 0.02 cop[tikv] or(and(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 1)), and(eq(test_partition.t1.a, 6), eq(test_partition.t1.b, 6)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.20 root partition:p0,p1 index:IndexRangeScan", + "└─IndexRangeScan 0.20 cop[tikv] table:t1, index:a(a, b, id) range:[1 1,1 1], [6 6,6 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100 and b = 100", + "Result": null, + "Plan": [ + "TableReader 0.01 root partition:dual data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 100), eq(test_partition.t1.b, 100)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.10 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[100 100,100 100], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3 and t1.b in (3,5)) and t2.a in (6,7,8) and t2.b=7 and t2.id=7", + "Result": null, + "Plan": [ + "Projection 0.00 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.id, test_partition.t2.a, test_partition.t2.b", + "└─HashJoin 0.00 root CARTESIAN inner join", + " ├─TableReader(Build) 0.00 root partition:p1 data:Selection", + " │ └─Selection 0.00 cop[tikv] eq(test_partition.t2.b, 7), eq(test_partition.t2.id, 7), in(test_partition.t2.a, 6, 7, 8)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.01 root partition:p0 data:Selection", + " └─Selection 0.01 cop[tikv] eq(test_partition.t1.id, 7), or(eq(test_partition.t1.a, 1), and(eq(test_partition.t1.a, 3), in(test_partition.t1.b, 3, 5)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "HashJoin 0.03 root CARTESIAN inner join", + "├─IndexReader(Build) 0.01 root partition:p0 index:Selection", + "│ └─Selection 0.01 cop[tikv] eq(test_partition_1.t1.id, 7), or(eq(test_partition_1.t1.a, 1), and(eq(test_partition_1.t1.a, 3), in(test_partition_1.t1.b, 3, 5)))", + "│ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo", + "└─IndexReader(Probe) 3.00 root partition:p1 index:IndexRangeScan", + " └─IndexRangeScan 3.00 cop[tikv] table:t2, index:a(a, b, id) range:[6 7 7,6 7 7], [7 7 7,7 7 7], [8 7 7,8 7 7], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 left join t2 on true where (t1.a=1 or t1.a = 3 and t1.b in (3,5)) and t2.a in (6,7,8) and t2.b=7 and t2.id = 7 order by t1.id,t1.a", + "Result": [ + "1 1 1 7 7 7", + "3 3 3 7 7 7" + ], + "Plan": [ + "Sort 80.16 root test_partition.t1.id, test_partition.t1.a", + "└─Projection 80.16 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.id, test_partition.t2.a, test_partition.t2.b", + " └─HashJoin 80.16 root CARTESIAN inner join", + " ├─TableReader(Build) 8.00 root partition:p1 data:Selection", + " │ └─Selection 8.00 cop[tikv] 1, eq(test_partition.t2.b, 7), eq(test_partition.t2.id, 7), in(test_partition.t2.a, 6, 7, 8)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10.02 root partition:p0 data:Selection", + " └─Selection 10.02 cop[tikv] 1, or(eq(test_partition.t1.a, 1), and(eq(test_partition.t1.a, 3), in(test_partition.t1.b, 3, 5)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 0.05 root test_partition_1.t1.id, test_partition_1.t1.a", + "└─HashJoin 0.05 root CARTESIAN inner join", + " ├─IndexReader(Build) 0.02 root partition:p0 index:Selection", + " │ └─Selection 0.02 cop[tikv] or(eq(test_partition_1.t1.a, 1), and(eq(test_partition_1.t1.a, 3), in(test_partition_1.t1.b, 3, 5)))", + " │ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 2.40 root partition:p1 index:Selection", + " └─Selection 2.40 cop[tikv] 1", + " └─IndexRangeScan 3.00 cop[tikv] table:t2, index:a(a, b, id) range:[6 7 7,6 7 7], [7 7 7,7 7 7], [8 7 7,8 7 7], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 10.00 root partition:p0 data:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition.t1.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where b = 1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 10.00 root partition:p0 data:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition.t1.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:p0 index:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition_1.t1.b, 1)", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where b is null", + "Result": [ + " 10 " + ], + "Plan": [ + "TableReader 10.00 root partition:p1 data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t1.b)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:p1 index:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition_1.t1.b)", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a is null", + "Result": null, + "Plan": [ + "TableReader 10.00 root partition:dual data:Selection", + "└─Selection 10.00 cop[tikv] isnull(test_partition.t1.a)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a, b, id) range:[NULL,NULL], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or b = 2", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "TableReader 19.99 root partition:p0 data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 19.99 root partition:p0 index:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(test_partition_1.t1.b, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or (a = 2 and b = 2) or ((a,b) in ((4,4),(5,5)))", + "Result": [ + "1 1 1", + "2 2 2", + "4 4 4", + "5 5 5" + ], + "Plan": [ + "TableReader 10.03 root partition:p0 data:Selection", + "└─Selection 10.03 cop[tikv] or(or(eq(test_partition.t1.a, 1), and(eq(test_partition.t1.a, 2), eq(test_partition.t1.b, 2))), or(and(eq(test_partition.t1.a, 4), eq(test_partition.t1.b, 4)), and(eq(test_partition.t1.a, 5), eq(test_partition.t1.b, 5))))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.30 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 10.30 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [2 2,2 2], [4 4,4 4], [5 5,5 5], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or (a is null and b = 10)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 10.01 root partition:p0 data:Selection", + "└─Selection 10.01 cop[tikv] or(eq(test_partition.t1.a, 1), and(isnull(test_partition.t1.a), eq(test_partition.t1.b, 10)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 16.00 root partition:p0 index:Selection", + "└─Selection 16.00 cop[tikv] or(eq(test_partition_1.t1.a, 1), and(isnull(test_partition_1.t1.a), eq(test_partition_1.t1.b, 10)))", + " └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[NULL,NULL], [1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or (a = 10 and b is null)", + "Result": [ + "1 1 1", + " 10 " + ], + "Plan": [ + "TableReader 10.01 root partition:p0,p1 data:Selection", + "└─Selection 10.01 cop[tikv] or(eq(test_partition.t1.a, 1), and(eq(test_partition.t1.a, 10), isnull(test_partition.t1.b)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.10 root partition:p0,p1 index:IndexRangeScan", + "└─IndexRangeScan 10.10 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [10 NULL,10 NULL], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 8 or (a = 10 and b is null)", + "Result": [ + "8 8 8", + " 10 " + ], + "Plan": [ + "TableReader 10.01 root partition:p1 data:Selection", + "└─Selection 10.01 cop[tikv] or(eq(test_partition.t1.a, 8), and(eq(test_partition.t1.a, 10), isnull(test_partition.t1.b)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.10 root partition:p1 index:IndexRangeScan", + "└─IndexRangeScan 10.10 cop[tikv] table:t1, index:a(a, b, id) range:[8,8], [10 NULL,10 NULL], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 and false", + "Result": null, + "Plan": [ + "TableDual 0.00 root rows:0" + ], + "IndexPlan": [ + "TableDual 0.00 root rows:0" + ] + }, + { + "SQL": "select * from t1 where a = 1 and true", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 10.00 root partition:p0 data:Selection", + "└─Selection 10.00 cop[tikv] eq(test_partition.t1.a, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or false", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 10.00 root partition:p0 data:Selection", + "└─Selection 10.00 cop[tikv] or(eq(test_partition.t1.a, 1), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 10.00 root partition:p0 index:IndexRangeScan", + "└─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or true order by id,a", + "Result": [ + " 10 ", + "1 1 1", + "2 2 2", + "3 3 3", + "4 4 4", + "5 5 5", + "6 6 6", + "7 7 7", + "8 8 8", + "9 9 9", + "10 10 10" + ], + "Plan": [ + "Sort 10000.00 root test_partition.t1.id, test_partition.t1.a", + "└─TableReader 10000.00 root partition:all data:Selection", + " └─Selection 10000.00 cop[tikv] or(eq(test_partition.t1.a, 1), 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 10000.00 root test_partition_1.t1.id, test_partition_1.t1.a", + "└─IndexReader 10000.00 root partition:all index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or b in (100,200)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 29.98 root partition:p0 data:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition.t1.a, 1), in(test_partition.t1.b, 100, 200))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 29.98 root partition:p0 index:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition_1.t1.a, 1), in(test_partition_1.t1.b, 100, 200))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100 or b in (1,2)", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "TableReader 29.98 root partition:p0 data:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition.t1.a, 100), in(test_partition.t1.b, 1, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 29.98 root partition:p0 index:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition_1.t1.a, 100), in(test_partition_1.t1.b, 1, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100 or b in (1,6)", + "Result": [ + "1 1 1", + "6 6 6" + ], + "Plan": [ + "TableReader 29.98 root partition:p0,p1 data:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition.t1.a, 100), in(test_partition.t1.b, 1, 6))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 29.98 root partition:p0,p1 index:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition_1.t1.a, 100), in(test_partition_1.t1.b, 1, 6))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100 or b in (100,200)", + "Result": null, + "Plan": [ + "TableReader 29.98 root partition:dual data:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition.t1.a, 100), in(test_partition.t1.b, 100, 200))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 29.98 root partition:dual index:Selection", + "└─Selection 29.98 cop[tikv] or(eq(test_partition_1.t1.a, 100), in(test_partition_1.t1.b, 100, 200))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,6) or b in (1,2) or (a=3 and b =3)", + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "6 6 6" + ], + "Plan": [ + "TableReader 39.97 root partition:p0,p1 data:Selection", + "└─Selection 39.97 cop[tikv] or(in(test_partition.t1.a, 1, 6), or(in(test_partition.t1.b, 1, 2), and(eq(test_partition.t1.a, 3), eq(test_partition.t1.b, 3))))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 40.06 root partition:p0,p1 index:Selection", + "└─Selection 40.06 cop[tikv] or(in(test_partition_1.t1.a, 1, 6), or(in(test_partition_1.t1.b, 1, 2), and(eq(test_partition_1.t1.a, 3), eq(test_partition_1.t1.b, 3))))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,6)", + "Result": [ + "1 1 1", + "6 6 6" + ], + "Plan": [ + "TableReader 20.00 root partition:p0,p1 data:Selection", + "└─Selection 20.00 cop[tikv] in(test_partition.t1.a, 1, 6)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 20.00 root partition:p0,p1 index:IndexRangeScan", + "└─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [6,6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,6) or (a=3 and b =3)", + "Result": [ + "1 1 1", + "3 3 3", + "6 6 6" + ], + "Plan": [ + "TableReader 20.01 root partition:p0,p1 data:Selection", + "└─Selection 20.01 cop[tikv] or(in(test_partition.t1.a, 1, 6), and(eq(test_partition.t1.a, 3), eq(test_partition.t1.b, 3)))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 20.10 root partition:p0,p1 index:IndexRangeScan", + "└─IndexRangeScan 20.10 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3 3,3 3], [6,6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,6) and (a=3 and b =3)", + "Result": null, + "Plan": [ + "TableDual 8000.00 root rows:0" + ], + "IndexPlan": [ + "TableDual 8000.00 root rows:0" + ] + }, + { + "SQL": "select * from t1 where a = 1 and (b=6 or a=6)", + "Result": null, + "Plan": [ + "TableReader 0.01 root partition:dual data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 1), or(eq(test_partition.t1.b, 6), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.10 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[1 6,1 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 100 and (b=200 or a=200)", + "Result": null, + "Plan": [ + "TableReader 0.01 root partition:dual data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 100), or(eq(test_partition.t1.b, 200), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.10 root partition:dual index:IndexRangeScan", + "└─IndexRangeScan 0.10 cop[tikv] table:t1, index:a(a, b, id) range:[100 200,100 200], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a = 1 or (a+b=3)", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 8002.00 root partition:all data:Selection", + "└─Selection 8002.00 cop[tikv] or(eq(test_partition.t1.a, 1), eq(plus(test_partition.t1.a, test_partition.t1.b), 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 8002.00 root partition:all index:Selection", + "└─Selection 8002.00 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(plus(test_partition_1.t1.a, test_partition_1.t1.b), 3))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where id = 1 or id=2", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "TableReader 20.00 root partition:all data:Selection", + "└─Selection 20.00 cop[tikv] or(eq(test_partition.t1.id, 1), eq(test_partition.t1.id, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 20.00 root partition:all index:Selection", + "└─Selection 20.00 cop[tikv] or(eq(test_partition_1.t1.id, 1), eq(test_partition_1.t1.id, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where id = 1 and a=1", + "Result": [ + "1 1 1" + ], + "Plan": [ + "TableReader 0.01 root partition:p0 data:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 1), eq(test_partition.t1.id, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 0.01 root partition:p0 index:Selection", + "└─Selection 0.01 cop[tikv] eq(test_partition_1.t1.id, 1)", + " └─IndexRangeScan 10.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 partition(p1) where a = 1 or b = 2", + "Result": null, + "Plan": [ + "TableReader 19.99 root partition:dual data:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition.t1.a, 1), eq(test_partition.t1.b, 2))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "IndexReader 19.99 root partition:dual index:Selection", + "└─Selection 19.99 cop[tikv] or(eq(test_partition_1.t1.a, 1), eq(test_partition_1.t1.b, 2))", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "Result": null, + "Plan": [ + "Projection 0.01 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.id, test_partition.t2.a, test_partition.t2.b", + "└─HashJoin 0.01 root inner join, equal:[eq(test_partition.t2.id, test_partition.t1.id)]", + " ├─TableReader(Build) 0.01 root partition:p1 data:Selection", + " │ └─Selection 0.01 cop[tikv] eq(test_partition.t2.a, 6), eq(test_partition.t2.b, 6), not(isnull(test_partition.t2.id))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 19.98 root partition:p0 data:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Projection 1.25 root test_partition_1.t1.id, test_partition_1.t1.a, test_partition_1.t1.b, test_partition_1.t2.id, test_partition_1.t2.a, test_partition_1.t2.b", + "└─HashJoin 1.25 root inner join, equal:[eq(test_partition_1.t2.id, test_partition_1.t1.id)]", + " ├─IndexReader(Build) 1.00 root partition:p1 index:IndexRangeScan", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t2, index:a(a, b, id) range:[6 6 -inf,6 6 +inf], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 19.98 root partition:p0 index:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition_1.t1.id))", + " └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t1 as t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and (t2.a = 6 and t2.b = 6)", + "Result": null, + "Plan": [ + "Projection 0.01 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t1.id, test_partition.t1.a, test_partition.t1.b", + "└─HashJoin 0.01 root inner join, equal:[eq(test_partition.t1.id, test_partition.t1.id)]", + " ├─TableReader(Build) 0.01 root partition:p1 data:Selection", + " │ └─Selection 0.01 cop[tikv] eq(test_partition.t1.a, 6), eq(test_partition.t1.b, 6), not(isnull(test_partition.t1.id))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 19.98 root partition:p0 data:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Projection 1.25 root test_partition_1.t1.id, test_partition_1.t1.a, test_partition_1.t1.b, test_partition_1.t1.id, test_partition_1.t1.a, test_partition_1.t1.b", + "└─HashJoin 1.25 root inner join, equal:[eq(test_partition_1.t1.id, test_partition_1.t1.id)]", + " ├─IndexReader(Build) 1.00 root partition:p1 index:IndexRangeScan", + " │ └─IndexRangeScan 1.00 cop[tikv] table:t2, index:a(a, b, id) range:[6 6 -inf,6 6 +inf], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 19.98 root partition:p0 index:Selection", + " └─Selection 19.98 cop[tikv] not(isnull(test_partition_1.t1.id))", + " └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where t1.a in (select b from t2 where a in (1,2)) order by a", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "Sort 19.98 root test_partition.t1.a", + "└─HashJoin 19.98 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.a)]", + " ├─HashAgg(Build) 15.98 root group by:test_partition.t2.b, funcs:firstrow(test_partition.t2.b)->test_partition.t2.b", + " │ └─TableReader 15.98 root partition:p0 data:HashAgg", + " │ └─HashAgg 15.98 cop[tikv] group by:test_partition.t2.b, ", + " │ └─Selection 19.98 cop[tikv] in(test_partition.t2.a, 1, 2), not(isnull(test_partition.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 199.80 root test_partition_1.t1.a", + "└─IndexJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.a)", + " ├─HashAgg(Build) 159.84 root group by:test_partition_1.t2.b, funcs:firstrow(test_partition_1.t2.b)->test_partition_1.t2.b", + " │ └─IndexReader 159.84 root partition:p0 index:HashAgg", + " │ └─HashAgg 159.84 cop[tikv] group by:test_partition_1.t2.b, ", + " │ └─IndexRangeScan 199.80 cop[tikv] table:t2, index:a(a, b, id) range:[1 -inf,1 +inf], [2 -inf,2 +inf], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 1.25 root partition:all index:Selection", + " └─Selection 1.25 cop[tikv] not(isnull(test_partition_1.t1.a))", + " └─IndexRangeScan 1.25 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.a, test_partition_1.t2.b)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where t1.a in (select b from t1 where a in (1,2)) order by a", + "Result": [ + "1 1 1", + "2 2 2" + ], + "Plan": [ + "Sort 19.98 root test_partition.t1.a", + "└─HashJoin 19.98 root inner join, equal:[eq(test_partition.t1.b, test_partition.t1.a)]", + " ├─HashAgg(Build) 15.98 root group by:test_partition.t1.b, funcs:firstrow(test_partition.t1.b)->test_partition.t1.b", + " │ └─TableReader 15.98 root partition:p0 data:HashAgg", + " │ └─HashAgg 15.98 cop[tikv] group by:test_partition.t1.b, ", + " │ └─Selection 19.98 cop[tikv] in(test_partition.t1.a, 1, 2), not(isnull(test_partition.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 9990.00 root partition:all data:Selection", + " └─Selection 9990.00 cop[tikv] not(isnull(test_partition.t1.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 199.80 root test_partition_1.t1.a", + "└─IndexJoin 199.80 root inner join, inner:IndexReader, outer key:test_partition_1.t1.b, inner key:test_partition_1.t1.a, equal cond:eq(test_partition_1.t1.b, test_partition_1.t1.a)", + " ├─HashAgg(Build) 159.84 root group by:test_partition_1.t1.b, funcs:firstrow(test_partition_1.t1.b)->test_partition_1.t1.b", + " │ └─IndexReader 159.84 root partition:p0 index:HashAgg", + " │ └─HashAgg 159.84 cop[tikv] group by:test_partition_1.t1.b, ", + " │ └─IndexRangeScan 199.80 cop[tikv] table:t1, index:a(a, b, id) range:[1 -inf,1 +inf], [2 -inf,2 +inf], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 1.25 root partition:all index:Selection", + " └─Selection 1.25 cop[tikv] not(isnull(test_partition_1.t1.a))", + " └─IndexRangeScan 1.25 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.a, test_partition_1.t1.b)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 left join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and t2.a in (6,7,8)", + "Result": null, + "Plan": [ + "HashJoin 24.98 root inner join, equal:[eq(test_partition.t1.id, test_partition.t2.id)]", + "├─TableReader(Build) 19.98 root partition:p0 data:Selection", + "│ └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 29.97 root partition:p1 data:Selection", + " └─Selection 29.97 cop[tikv] in(test_partition.t2.a, 6, 7, 8), not(isnull(test_partition.t2.id))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "HashJoin 24.98 root inner join, equal:[eq(test_partition_1.t1.id, test_partition_1.t2.id)]", + "├─IndexReader(Build) 19.98 root partition:p0 index:Selection", + "│ └─Selection 19.98 cop[tikv] not(isnull(test_partition_1.t1.id))", + "│ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo", + "└─IndexReader(Probe) 29.97 root partition:p1 index:Selection", + " └─Selection 29.97 cop[tikv] not(isnull(test_partition_1.t2.id))", + " └─IndexRangeScan 30.00 cop[tikv] table:t2, index:a(a, b, id) range:[6,6], [7,7], [8,8], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 right join t2 on t1.id = t2.id where (t1.a=1 or t1.a = 3) and t2.a in (1,2,3)", + "Result": [ + "1 1 1 1 1 1", + "3 3 3 3 3 3" + ], + "Plan": [ + "HashJoin 24.98 root inner join, equal:[eq(test_partition.t1.id, test_partition.t2.id)]", + "├─TableReader(Build) 19.98 root partition:p0 data:Selection", + "│ └─Selection 19.98 cop[tikv] not(isnull(test_partition.t1.id)), or(eq(test_partition.t1.a, 1), eq(test_partition.t1.a, 3))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─TableReader(Probe) 29.97 root partition:p0 data:Selection", + " └─Selection 29.97 cop[tikv] in(test_partition.t2.a, 1, 2, 3), not(isnull(test_partition.t2.id))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "HashJoin 24.98 root inner join, equal:[eq(test_partition_1.t1.id, test_partition_1.t2.id)]", + "├─IndexReader(Build) 19.98 root partition:p0 index:Selection", + "│ └─Selection 19.98 cop[tikv] not(isnull(test_partition_1.t1.id))", + "│ └─IndexRangeScan 20.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [3,3], keep order:false, stats:pseudo", + "└─IndexReader(Probe) 29.97 root partition:p0 index:Selection", + " └─Selection 29.97 cop[tikv] not(isnull(test_partition_1.t2.id))", + " └─IndexRangeScan 30.00 cop[tikv] table:t2, index:a(a, b, id) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 join t2 on true where t1.a=5 and t2.a in (6,7,8) and t2.b = 6", + "Result": [ + "5 5 5 6 6 6" + ], + "Plan": [ + "Projection 80.00 root test_partition.t1.id, test_partition.t1.a, test_partition.t1.b, test_partition.t2.id, test_partition.t2.a, test_partition.t2.b", + "└─HashJoin 80.00 root CARTESIAN inner join", + " ├─TableReader(Build) 8.00 root partition:p1 data:Selection", + " │ └─Selection 8.00 cop[tikv] 1, eq(test_partition.t2.b, 6), in(test_partition.t2.a, 6, 7, 8)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 10.00 root partition:p0 data:Selection", + " └─Selection 10.00 cop[tikv] 1, eq(test_partition.t1.a, 5)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Projection 300.00 root test_partition_1.t1.id, test_partition_1.t1.a, test_partition_1.t1.b, test_partition_1.t2.id, test_partition_1.t2.a, test_partition_1.t2.b", + "└─HashJoin 300.00 root CARTESIAN inner join", + " ├─IndexReader(Build) 3.00 root partition:p1 index:IndexRangeScan", + " │ └─IndexRangeScan 3.00 cop[tikv] table:t2, index:a(a, b, id) range:[6 6 NULL,6 6 +inf], [7 6 NULL,7 6 +inf], [8 6 NULL,8 6 +inf], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 100.00 root partition:p0 index:IndexRangeScan", + " └─IndexRangeScan 100.00 cop[tikv] table:t1, index:a(a, b, id) range:[5 NULL,5 +inf], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select count(*) from t1 join t2 on t1.b = t2.b where t1.a in (1,2) and t2.a in (1,6) and t1.b in (1,6)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.00 root inner join, equal:[eq(test_partition.t1.b, test_partition.t2.b)]", + " ├─TableReader(Build) 0.04 root partition:p0,p1 data:Selection", + " │ └─Selection 0.04 cop[tikv] in(test_partition.t2.a, 1, 6), in(test_partition.t2.b, 1, 6), not(isnull(test_partition.t2.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.04 root partition:p0 data:Selection", + " └─Selection 0.04 cop[tikv] in(test_partition.t1.a, 1, 2), in(test_partition.t1.b, 1, 6), not(isnull(test_partition.t1.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.10 root inner join, equal:[eq(test_partition_1.t1.b, test_partition_1.t2.b)]", + " ├─IndexReader(Build) 0.40 root partition:p0,p1 index:Selection", + " │ └─Selection 0.40 cop[tikv] not(isnull(test_partition_1.t2.b))", + " │ └─IndexRangeScan 0.40 cop[tikv] table:t2, index:a(a, b, id) range:[1 1,1 1], [1 6,1 6], [6 1,6 1], [6 6,6 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 0.40 root partition:p0 index:Selection", + " └─Selection 0.40 cop[tikv] not(isnull(test_partition_1.t1.b))", + " └─IndexRangeScan 0.40 cop[tikv] table:t1, index:a(a, b, id) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_JOIN(t2,t1) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (1,6)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.00 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.b)]", + " ├─TableReader(Build) 0.04 root partition:p0,p1 data:Selection", + " │ └─Selection 0.04 cop[tikv] in(test_partition.t1.a, 1, 6), in(test_partition.t1.b, 1, 6), not(isnull(test_partition.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.04 root partition:p0 data:Selection", + " └─Selection 0.04 cop[tikv] in(test_partition.t2.a, 1, 2), in(test_partition.t2.b, 1, 6), not(isnull(test_partition.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexJoin 0.10 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.b, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.b)", + " ├─IndexReader(Build) 0.40 root partition:p0 index:Selection", + " │ └─Selection 0.40 cop[tikv] not(isnull(test_partition_1.t2.b))", + " │ └─IndexRangeScan 0.40 cop[tikv] table:t2, index:a(a, b, id) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 0.32 root partition:p0,p1 index:Selection", + " └─Selection 0.32 cop[tikv] in(test_partition_1.t1.b, 1, 6), not(isnull(test_partition_1.t1.b))", + " └─IndexRangeScan 160.00 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.b, test_partition_1.t2.b) in(test_partition_1.t1.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (6,1)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.00 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.b)]", + " ├─TableReader(Build) 0.04 root partition:p0,p1 data:Selection", + " │ └─Selection 0.04 cop[tikv] in(test_partition.t1.a, 1, 6), in(test_partition.t1.b, 6, 1), not(isnull(test_partition.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.04 root partition:p0 data:Selection", + " └─Selection 0.04 cop[tikv] in(test_partition.t2.a, 1, 2), in(test_partition.t2.b, 6, 1), not(isnull(test_partition.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexHashJoin 0.10 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.b, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.b)", + " ├─IndexReader(Build) 0.40 root partition:p0 index:Selection", + " │ └─Selection 0.40 cop[tikv] not(isnull(test_partition_1.t2.b))", + " │ └─IndexRangeScan 0.40 cop[tikv] table:t2, index:a(a, b, id) range:[1 1,1 1], [1 6,1 6], [2 1,2 1], [2 6,2 6], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 0.32 root partition:p0,p1 index:Selection", + " └─Selection 0.32 cop[tikv] in(test_partition_1.t1.b, 6, 1), not(isnull(test_partition_1.t1.b))", + " └─IndexRangeScan 160.00 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.b, test_partition_1.t2.b) in(test_partition_1.t1.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (100,9,6)", + "Result": [ + "0" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.00 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.b)]", + " ├─TableReader(Build) 0.06 root partition:p1 data:Selection", + " │ └─Selection 0.06 cop[tikv] in(test_partition.t1.a, 1, 6), in(test_partition.t1.b, 100, 9, 6), not(isnull(test_partition.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.06 root partition:dual data:Selection", + " └─Selection 0.06 cop[tikv] in(test_partition.t2.a, 1, 2), in(test_partition.t2.b, 100, 9, 6), not(isnull(test_partition.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexHashJoin 0.23 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.b, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.b)", + " ├─IndexReader(Build) 0.60 root partition:dual index:Selection", + " │ └─Selection 0.60 cop[tikv] not(isnull(test_partition_1.t2.b))", + " │ └─IndexRangeScan 0.60 cop[tikv] table:t2, index:a(a, b, id) range:[1 6,1 6], [1 9,1 9], [1 100,1 100], [2 6,2 6], [2 9,2 9], [2 100,2 100], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 0.48 root partition:p1 index:Selection", + " └─Selection 0.48 cop[tikv] in(test_partition_1.t1.b, 100, 9, 6), not(isnull(test_partition_1.t1.b))", + " └─IndexRangeScan 160.00 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.b, test_partition_1.t2.b) in(test_partition_1.t1.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select /*+ INL_HASH_JOIN(t1,t2) */ count(*) from t2 join t1 on t2.b = t1.b where t2.a in (1,2) and t1.a in (1,6) and t1.b in (100,9,6,1)", + "Result": [ + "1" + ], + "Plan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─HashJoin 0.01 root inner join, equal:[eq(test_partition.t2.b, test_partition.t1.b)]", + " ├─TableReader(Build) 0.08 root partition:p0,p1 data:Selection", + " │ └─Selection 0.08 cop[tikv] in(test_partition.t1.a, 1, 6), in(test_partition.t1.b, 100, 9, 6, 1), not(isnull(test_partition.t1.b))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader(Probe) 0.08 root partition:p0 data:Selection", + " └─Selection 0.08 cop[tikv] in(test_partition.t2.a, 1, 2), in(test_partition.t2.b, 100, 9, 6, 1), not(isnull(test_partition.t2.b))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "StreamAgg 1.00 root funcs:count(1)->Column#9", + "└─IndexHashJoin 0.41 root inner join, inner:IndexReader, outer key:test_partition_1.t2.b, inner key:test_partition_1.t1.b, equal cond:eq(test_partition_1.t2.b, test_partition_1.t1.b)", + " ├─IndexReader(Build) 0.80 root partition:p0 index:Selection", + " │ └─Selection 0.80 cop[tikv] not(isnull(test_partition_1.t2.b))", + " │ └─IndexRangeScan 0.80 cop[tikv] table:t2, index:a(a, b, id) range:[1 1,1 1], [1 6,1 6], [1 9,1 9], [1 100,1 100], [2 1,2 1], [2 6,2 6], [2 9,2 9], [2 100,2 100], keep order:false, stats:pseudo", + " └─IndexReader(Probe) 0.64 root partition:p0,p1 index:Selection", + " └─Selection 0.64 cop[tikv] in(test_partition_1.t1.b, 100, 9, 6, 1), not(isnull(test_partition_1.t1.b))", + " └─IndexRangeScan 160.00 cop[tikv] table:t1, index:a(a, b, id) range: decided by [eq(test_partition_1.t1.b, test_partition_1.t2.b) in(test_partition_1.t1.a, 1, 6)], keep order:false, stats:pseudo" + ] + }, + { + "SQL": "select * from t1 where a in (1,2,3) union select * from t1 where b in (6,7,8) order by a", + "Result": [ + "1 1 1", + "2 2 2", + "3 3 3", + "6 6 6", + "7 7 7", + "8 8 8" + ], + "Plan": [ + "Sort 48.00 root Column#10", + "└─HashAgg 48.00 root group by:Column#10, Column#11, Column#9, funcs:firstrow(Column#9)->Column#9, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + " └─Union 60.00 root ", + " ├─TableReader 30.00 root partition:p0 data:Selection", + " │ └─Selection 30.00 cop[tikv] in(test_partition.t1.a, 1, 2, 3)", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + " └─TableReader 30.00 root partition:p1 data:Selection", + " └─Selection 30.00 cop[tikv] in(test_partition.t1.b, 6, 7, 8)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "IndexPlan": [ + "Sort 48.00 root Column#10", + "└─HashAgg 48.00 root group by:Column#10, Column#11, Column#9, funcs:firstrow(Column#9)->Column#9, funcs:firstrow(Column#10)->Column#10, funcs:firstrow(Column#11)->Column#11", + " └─Union 60.00 root ", + " ├─IndexReader 30.00 root partition:p0 index:IndexRangeScan", + " │ └─IndexRangeScan 30.00 cop[tikv] table:t1, index:a(a, b, id) range:[1,1], [2,2], [3,3], keep order:false, stats:pseudo", + " └─IndexReader 30.00 root partition:p1 index:Selection", + " └─Selection 30.00 cop[tikv] in(test_partition_1.t1.b, 6, 7, 8)", + " └─IndexFullScan 10000.00 cop[tikv] table:t1, index:a(a, b, id) keep order:false, stats:pseudo" + ] + } + ] + } +] diff --git a/planner/core/testdata/plan_normalized_suite_in.json b/planner/core/testdata/plan_normalized_suite_in.json index 35be2bd8b28bb..f79b7a1ed3733 100644 --- a/planner/core/testdata/plan_normalized_suite_in.json +++ b/planner/core/testdata/plan_normalized_suite_in.json @@ -24,16 +24,28 @@ "delete from t1", "delete from t1 where a>0 and b=1 and c!=2", "create table t1_tmp (a int)", - "alter table t1_tmp add column c int" + "alter table t1_tmp add column c int", + "insert into t3 values (4,20),(30,30)", + "select * from t3 where a=4", + "select * from t3 where a=30", + "select * from t4 where a=10", + "select * from t4 where a=20" + ] + }, + { + "name": "TestPreferRangeScan", + "cases": [ + "select * from test where age=5;", + "select * from test where age=5;" ] }, { "name": "TestNormalizedPlanForDiffStore", "cases": [ - "explain select /*+ read_from_storage(tiflash[t1]) */ * from t1", - "explain select /*+ read_from_storage(tikv[t1]) */ * from t1", - "explain select /*+ read_from_storage(tiflash[t1]) */ a+b from t1 where a+b < 1", - "explain select /*+ read_from_storage(tikv[t1]) */ a+b from t1 where a+b < 1" + "explain format = 'brief' select /*+ read_from_storage(tiflash[t1]) */ * from t1", + "explain format = 'brief' select /*+ read_from_storage(tikv[t1]) */ * from t1", + "explain format = 'brief' select /*+ read_from_storage(tiflash[t1]) */ a+b from t1 where a+b < 1", + "explain format = 'brief' select /*+ read_from_storage(tikv[t1]) */ a+b from t1 where a+b < 1" ] } ] diff --git a/planner/core/testdata/plan_normalized_suite_out.json b/planner/core/testdata/plan_normalized_suite_out.json index 772df0dd67108..9c7c085610dd9 100644 --- a/planner/core/testdata/plan_normalized_suite_out.json +++ b/planner/core/testdata/plan_normalized_suite_out.json @@ -5,22 +5,22 @@ { "SQL": "select * from t1;", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableFullScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "select * from t1 where a<1;", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableRangeScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "select * from t1 where a>1", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableRangeScan cop table:t1, range:[?,?], keep order:false" ] }, { @@ -38,97 +38,97 @@ { "SQL": "select * from t1 where b=1", "Plan": [ - " IndexLookUp root ", - " ├─IndexScan cop table:t1, index:b(b), range:[?,?], keep order:false", - " └─TableScan cop table:t1, keep order:false" + " IndexLookUp root ", + " ├─IndexRangeScan cop table:t1, index:b(b), range:[?,?], keep order:false", + " └─TableRowIDScan cop table:t1, keep order:false" ] }, { "SQL": "select a+1,b+2 from t1 use index(b) where b=3", "Plan": [ - " Projection root plus(test.t1.a, ?), plus(test.t1.b, ?)", - " └─IndexReader root index:IndexRangeScan_5", - " └─IndexScan cop table:t1, index:b(b), range:[?,?], keep order:false" + " Projection root plus(test.t1.a, ?), plus(test.t1.b, ?)", + " └─IndexReader root index:IndexRangeScan_5", + " └─IndexRangeScan cop table:t1, index:b(b), range:[?,?], keep order:false" ] }, { "SQL": "select * from t1 where t1.b > 1 and t1.a in (select sum(t2.b) from t2 where t2.a=t1.a and t2.b is not null)", "Plan": [ - " Projection root test.t1.a, test.t1.b, test.t1.c", - " └─Apply root semi join, equal:eq(?, ?)", - " ├─Projection root cast(test.t1.a), test.t1.a, test.t1.b, test.t1.c", - " │ └─TableReader root ", - " │ └─Selection cop gt(test.t1.b, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:false", - " └─StreamAgg root funcs:sum(?)->?", - " └─TableReader root ", - " └─StreamAgg cop funcs:sum(test.t2.b)->?", - " └─Selection cop not(isnull(test.t2.b))", - " └─TableScan cop table:t2, range: decided by eq(test.t2.a, test.t1.a), keep order:false" + " Projection root test.t1.a, test.t1.b, test.t1.c", + " └─Apply root semi join, equal:eq(?, ?)", + " ├─Projection root cast(test.t1.a), test.t1.a, test.t1.b, test.t1.c", + " │ └─TableReader root ", + " │ └─Selection cop gt(test.t1.b, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:false", + " └─StreamAgg root funcs:sum(?)->?", + " └─TableReader root ", + " └─StreamAgg cop funcs:sum(test.t2.b)->?", + " └─Selection cop not(isnull(test.t2.b))", + " └─TableRangeScan cop table:t2, range: decided by eq(test.t2.a, test.t1.a), keep order:false" ] }, { "SQL": "SELECT * from t1 where a!=1 order by c limit 1", "Plan": [ - " TopN root test.t1.c", - " └─TableReader root ", - " └─TopN cop test.t1.c", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TopN root test.t1.c", + " └─TableReader root ", + " └─TopN cop test.t1.c", + " └─TableRangeScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "SELECT /*+ TIDB_SMJ(t1, t2) */ * from t1, t2 where t1.a = t2.a and t1.c>1;", "Plan": [ - " MergeJoin root inner join, left key:test.t1.a, right key:test.t2.a", - " ├─TableReader root ", - " │ └─Selection cop gt(test.t1.c, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:true", - " └─TableReader root ", - " └─TableScan cop table:t2, range:[?,?], keep order:true" + " MergeJoin root inner join, left key:test.t1.a, right key:test.t2.a", + " ├─TableReader root ", + " │ └─Selection cop gt(test.t1.c, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:true", + " └─TableReader root ", + " └─TableFullScan cop table:t2, range:[?,?], keep order:true" ] }, { "SQL": "SELECT /*+ TIDB_INLJ(t1, t2) */ * from t1, t2 where t1.a = t2.a and t1.c>1;", "Plan": [ - " IndexJoin root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a", - " ├─TableReader root ", - " │ └─Selection cop gt(test.t1.c, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:false", - " └─TableReader root ", - " └─TableScan cop table:t2, range: decided by [test.t1.a], keep order:false" + " IndexJoin root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + " ├─TableReader root ", + " │ └─Selection cop gt(test.t1.c, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:false", + " └─TableReader root ", + " └─TableRangeScan cop table:t2, range: decided by [test.t1.a], keep order:false" ] }, { "SQL": "SELECT /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a = t2.a and t1.c>1;", "Plan": [ - " HashJoin root inner join, equal:eq(test.t1.a, test.t2.a)", - " ├─TableReader root ", - " │ └─Selection cop gt(test.t1.c, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:false", - " └─TableReader root ", - " └─TableScan cop table:t2, range:[?,?], keep order:false" + " HashJoin root inner join, equal:eq(test.t1.a, test.t2.a)", + " ├─TableReader root ", + " │ └─Selection cop gt(test.t1.c, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:false", + " └─TableReader root ", + " └─TableFullScan cop table:t2, range:[?,?], keep order:false" ] }, { "SQL": "SELECT /*+ TIDB_HJ(t1, t2) */ * from t1, t2 where t1.a = t2.a and t1.c>1;", "Plan": [ - " HashJoin root inner join, equal:eq(test.t1.a, test.t2.a)", - " ├─TableReader root ", - " │ └─Selection cop gt(test.t1.c, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:false", - " └─TableReader root ", - " └─TableScan cop table:t2, range:[?,?], keep order:false" + " HashJoin root inner join, equal:eq(test.t1.a, test.t2.a)", + " ├─TableReader root ", + " │ └─Selection cop gt(test.t1.c, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:false", + " └─TableReader root ", + " └─TableFullScan cop table:t2, range:[?,?], keep order:false" ] }, { "SQL": "SELECT /*+ TIDB_INLJ(t1, t2) */ * from t1, t2 where t1.a = t2.a and t1.c>1;", "Plan": [ - " IndexJoin root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a", - " ├─TableReader root ", - " │ └─Selection cop gt(test.t1.c, ?)", - " │ └─TableScan cop table:t1, range:[?,?], keep order:false", - " └─TableReader root ", - " └─TableScan cop table:t2, range: decided by [test.t1.a], keep order:false" + " IndexJoin root inner join, inner:TableReader, outer key:test.t1.a, inner key:test.t2.a, equal cond:eq(test.t1.a, test.t2.a)", + " ├─TableReader root ", + " │ └─Selection cop gt(test.t1.c, ?)", + " │ └─TableFullScan cop table:t1, range:[?,?], keep order:false", + " └─TableReader root ", + " └─TableRangeScan cop table:t2, range: decided by [test.t1.a], keep order:false" ] }, { @@ -151,39 +151,39 @@ { "SQL": "insert into t1 select * from t2 where t2.a>0 and t2.b!=0", "Plan": [ - " TableReader root ", - " └─Selection cop ne(test.t2.b, ?)", - " └─TableScan cop table:t2, range:[?,?], keep order:false" + " TableReader root ", + " └─Selection cop ne(test.t2.b, ?)", + " └─TableRangeScan cop table:t2, range:[?,?], keep order:false" ] }, { "SQL": "update t1 set a=a+1", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableFullScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "update t1 set a=a+1 where a>0", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableRangeScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "delete from t1", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableFullScan cop table:t1, range:[?,?], keep order:false" ] }, { "SQL": "delete from t1 where a>0 and b=1 and c!=2", "Plan": [ - " IndexLookUp root ", - " ├─IndexScan cop table:t1, index:b(b), range:[?,?], keep order:false", - " └─Selection cop ne(test.t1.c, ?)", - " └─TableScan cop table:t1, keep order:false" + " IndexLookUp root ", + " ├─IndexRangeScan cop table:t1, index:b(b), range:[?,?], keep order:false", + " └─Selection cop ne(test.t1.c, ?)", + " └─TableRowIDScan cop table:t1, keep order:false" ] }, { @@ -197,6 +197,61 @@ "Plan": [ "" ] + }, + { + "SQL": "insert into t3 values (4,20),(30,30)", + "Plan": [ + "" + ] + }, + { + "SQL": "select * from t3 where a=4", + "Plan": [ + " Point_Get root table:t3, partition:?, handle:?" + ] + }, + { + "SQL": "select * from t3 where a=30", + "Plan": [ + " Point_Get root table:t3, partition:?, handle:?" + ] + }, + { + "SQL": "select * from t4 where a=10", + "Plan": [ + " IndexLookUp root ", + " ├─IndexRangeScan cop table:t4, partition:?, index:a(a), range:[?,?], keep order:false", + " └─TableRowIDScan cop table:t4, partition:?, keep order:false" + ] + }, + { + "SQL": "select * from t4 where a=20", + "Plan": [ + " IndexLookUp root ", + " ├─IndexRangeScan cop table:t4, partition:?, index:a(a), range:[?,?], keep order:false", + " └─TableRowIDScan cop table:t4, partition:?, keep order:false" + ] + } + ] + }, + { + "Name": "TestPreferRangeScan", + "Cases": [ + { + "SQL": "select * from test where age=5;", + "Plan": [ + " TableReader root ", + " └─Selection cop eq(test.test.age, ?)", + " └─TableFullScan cop table:test, range:[?,?], keep order:false" + ] + }, + { + "SQL": "select * from test where age=5;", + "Plan": [ + " IndexLookUp root ", + " ├─IndexRangeScan cop table:test, index:idx_age(age), range:[?,?], keep order:false", + " └─TableRowIDScan cop table:test, keep order:false" + ] } ] }, @@ -204,35 +259,35 @@ "Name": "TestNormalizedPlanForDiffStore", "Cases": [ { - "Digest": "63eab1c93f586cf9fbe71cbfa4ad212aadb019e3e477f2f6257d00d35e045980", + "Digest": "f970a867275a8e8878e3b0a7960a3d15e7fecda7cf31957ba2624b0afd91ddee", "Plan": [ - " TableReader root ", - " └─TableScan cop[tiflash] table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableFullScan cop[tiflash] table:t1, range:[?,?], keep order:false" ] }, { - "Digest": "6dc9f1500bbea92b2446d58c1510bca2e78f0e9a6c721c76495b0cf6bfc95faa", + "Digest": "70e316e5e20fbf2e292b74bfffe36219c403212e6ccd33f9c9c578f415e06743", "Plan": [ - " TableReader root ", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " TableReader root ", + " └─TableFullScan cop table:t1, range:[?,?], keep order:false" ] }, { - "Digest": "03f12d0f634596922b6ba2edab8d6565a36bc2264cea9613adeb506e32d6b901", + "Digest": "35da54afee3417b46607d9d836b9e3aea3a450537980d65abedda63498298784", "Plan": [ - " Projection root plus(test.t1.a, test.t1.b)", - " └─TableReader root ", - " └─Selection cop[tiflash] lt(plus(test.t1.a, test.t1.b), ?)", - " └─TableScan cop[tiflash] table:t1, range:[?,?], keep order:false" + " Projection root plus(test.t1.a, test.t1.b)", + " └─TableReader root ", + " └─Selection cop[tiflash] lt(plus(test.t1.a, test.t1.b), ?)", + " └─TableFullScan cop[tiflash] table:t1, range:[?,?], keep order:false" ] }, { - "Digest": "5f2f4343d1cf9bbd0893f78c01657307fdebadacbd0b9e60e4b5cca27656b739", + "Digest": "1065484bc4851767a2f412aa2133603defd7569bd09d83b70627c62cfb7dd0fa", "Plan": [ - " Projection root plus(test.t1.a, test.t1.b)", - " └─TableReader root ", - " └─Selection cop lt(plus(test.t1.a, test.t1.b), ?)", - " └─TableScan cop table:t1, range:[?,?], keep order:false" + " Projection root plus(test.t1.a, test.t1.b)", + " └─TableReader root ", + " └─Selection cop lt(plus(test.t1.a, test.t1.b), ?)", + " └─TableFullScan cop table:t1, range:[?,?], keep order:false" ] } ] diff --git a/planner/core/testdata/plan_suite_in.json b/planner/core/testdata/plan_suite_in.json index c642bd129f1b2..ea257f22a332c 100644 --- a/planner/core/testdata/plan_suite_in.json +++ b/planner/core/testdata/plan_suite_in.json @@ -126,7 +126,10 @@ "select * from ((SELECT 1 a,6 b) UNION (SELECT 2,5) UNION (SELECT 2, 4) ORDER BY 1) t order by 1, 2", "select * from (select *, NULL as xxx from t) t order by xxx", "select * from t use index(f) where f = 1 and a = 1", - "select * from t2 use index(b) where b = 1 and a = 1" + "select * from t2 use index(b) where b = 1 and a = 1", + // Test inline project for Limit + "select f from t where a > 1", + "select f from t where a > 1 limit 10" ] }, { @@ -247,8 +250,8 @@ // Test join hint for delete and update "delete /*+ TIDB_INLJ(t1, t2) */ t1 from t t1, t t2 where t1.c=t2.c", "delete /*+ TIDB_SMJ(t1, t2) */ from t1 using t t1, t t2 where t1.c=t2.c", - "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", - "update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", + "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.c=1 where t1.a=t2.a", + "update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.c=1 where t1.a=t2.a", // Test complex delete. "delete from t where b < 1 order by d limit 1", // Test simple delete. @@ -492,21 +495,32 @@ [ "insert into t values(1, 1)", // Test Index Join + UnionScan + TableScan. - "explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a" ], [ "insert into t values(1, 1)", // Test Index Join + UnionScan + DoubleRead. - "explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.b" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.b" ], [ "insert into t values(1, 1)", // Test Index Join + UnionScan + IndexScan. - "explain select /*+ TIDB_INLJ(t2) */ t1.a , t2.b from t t1, t t2 where t1.a = t2.b" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ t1.a , t2.b from t t1, t t2 where t1.a = t2.b" ], [ "insert into tt values(1)", - "explain select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a" + ] + ] + }, + { + "name": "TestMergeJoinUnionScan", + "cases": [ + [ + "insert into t2 values (11, 'amazing merkle')", + "insert into t2 values (12, 'amazing merkle')", + // Test Merge Join + UnionScan + TableScan. + "explain format = 'brief' select /*+ MERGE_JOIN(t1,t2) */ * from t1, t2 where t1.c_int = t2.c_int and t1.c_int = t2.c_int order by t1.c_int, t2.c_str;" ] ] }, @@ -558,7 +572,9 @@ "select count(distinct c) from t;", // should not use streamAgg because c is not in group by "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", - "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;" + "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;", + + "select distinct DATE_FORMAT(timestamp, '%Y-%m-%d %H') as tt from tc ;" ] }, { @@ -581,7 +597,8 @@ "name": "TestPushdownDistinctEnableAggPushDownDisable", "cases": [ "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", - "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;" + "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;", + "select distinct DATE_FORMAT(timestamp, '%Y-%m-%d %H') as tt from tc ;" ] }, { @@ -651,5 +668,13 @@ "select /*+nth_plan(2)*/ * from test.tt where a=1 and b=1;", "select * from test.tt where a=1 and b=1" ] + }, + { + "name": "TestEliminateMaxOneRow", + "cases": [ + "select a from t2 where t2.a < (select t1.a from t1 where t1.a = t2.a);", + "select a from t2 where t2.a < (select t1.a from t1 where t1.b = t2.b and t1.a is null);", + "select a from t2 where t2.a < (select t3.a from t3 where t3.a = t2.a);" + ] } ] diff --git a/planner/core/testdata/plan_suite_out.json b/planner/core/testdata/plan_suite_out.json index 4fba9a92251d2..161ed9bb69001 100644 --- a/planner/core/testdata/plan_suite_out.json +++ b/planner/core/testdata/plan_suite_out.json @@ -226,9 +226,9 @@ }, { "SQL": "select /*+ USE_INDEX_MERGE(t) USE_INDEX_MERGE(t) */ * from t where c < 1 or f > 2", - "Best": "IndexMergeReader(PartialPlans->[Index(t.c_d_e)[[-inf,1)], Index(t.f_g)[(2,+inf]]], TablePlan->Table(t))", + "Best": "IndexMergeReader(PartialPlans->[Index(t.c_d_e)[[-inf,1)], Index(t.f)[(2,+inf]]], TablePlan->Table(t))", "HasWarn": false, - "Hints": "use_index_merge(@`sel_1` `t` `c_d_e`, `f_g`)" + "Hints": "use_index_merge(@`sel_1` `t` `c_d_e`, `f`)" }, { "SQL": "select /*+ USE_INDEX_MERGE(db2.t) */ * from t where c < 1 or f > 2", @@ -261,7 +261,7 @@ }, { "SQL": "select * from t where (t.c > 0 and t.c < 2) or (t.c > 4 and t.c < 6) or (t.c > 8 and t.c < 10) or (t.c > 12 and t.c < 14) or (t.c > 16 and t.c < 18)", - "Best": "IndexLookUp(Index(t.c_d_e)[(0,2) (4,6) (8,10) (12,14) (16,18)], Table(t))" + "Best": "IndexLookUp(Index(t.c_d_e)[[1,1] [5,5] [9,9] [13,13] [17,17]], Table(t))" }, { "SQL": "select * from t where (t.c > 0 and t.c < 1) or (t.c > 2 and t.c < 3) or (t.c > 4 and t.c < 5) or (t.c > 6 and t.c < 7) or (t.c > 9 and t.c < 10)", @@ -357,7 +357,7 @@ }, { "SQL": "select * from (select * from t use index() order by b) t left join t t1 on t.a=t1.a limit 10", - "Best": "IndexMergeJoin{TableReader(Table(t)->TopN([test.t.b],0,10))->TopN([test.t.b],0,10)->TableReader(Table(t))}(test.t.a,test.t.a)->Limit" + "Best": "IndexJoin{TableReader(Table(t)->TopN([test.t.b],0,10))->TopN([test.t.b],0,10)->TableReader(Table(t))}(test.t.a,test.t.a)->Limit" }, { "SQL": "select * from ((SELECT 1 a,3 b) UNION (SELECT 2,1) ORDER BY (SELECT 2)) t order by a,b", @@ -378,6 +378,14 @@ { "SQL": "select * from t2 use index(b) where b = 1 and a = 1", "Best": "PointGet(Index(t2.b)[KindInt64 1])->Sel([eq(test.t2.a, 1)])" + }, + { + "SQL": "select f from t where a > 1", + "Best": "TableReader(Table(t))->Projection" + }, + { + "SQL": "select f from t where a > 1 limit 10", + "Best": "TableReader(Table(t)->Limit)->Limit" } ] }, @@ -414,11 +422,11 @@ }, { "SQL": "select * from t t1 left join t t2 on t1.b = t2.a where 1 = 1 limit 1", - "Best": "IndexMergeJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(test.t.b,test.t.a)->Limit" + "Best": "IndexJoin{TableReader(Table(t)->Limit)->Limit->TableReader(Table(t))}(test.t.b,test.t.a)->Limit" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.a and t1.c = 1 and t1.d = 1 and t1.e = 1 order by t1.a limit 1", - "Best": "IndexMergeJoin{PointGet(Index(t.c_d_e)[KindInt64 1 KindInt64 1 KindInt64 1])->TableReader(Table(t))}(test.t.b,test.t.a)->TopN([test.t.a],0,1)" + "Best": "IndexJoin{PointGet(Index(t.c_d_e)[KindInt64 1 KindInt64 1 KindInt64 1])->TableReader(Table(t))}(test.t.b,test.t.a)->TopN([test.t.a],0,1)" }, { "SQL": "select * from t t1 join t t2 on t1.b = t2.b join t t3 on t1.b = t3.b", @@ -434,11 +442,11 @@ }, { "SQL": "select * from t t1 join t t2 on t1.a = t2.a join t t3 on t1.a = t3.a and t1.b = 1 and t3.c = 1", - "Best": "IndexMergeJoin{IndexMergeJoin{TableReader(Table(t)->Sel([eq(test.t.b, 1)]))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)->Projection" + "Best": "IndexJoin{IndexJoin{TableReader(Table(t)->Sel([eq(test.t.b, 1)]))->IndexLookUp(Index(t.c_d_e)[[1,1]], Table(t))}(test.t.a,test.t.a)->TableReader(Table(t))}(test.t.a,test.t.a)->Projection" }, { "SQL": "select * from t where t.c in (select b from t s where s.a = t.a)", - "Best": "MergeSemiJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)" + "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)(test.t.c,test.t.b)" }, { "SQL": "select t.c in (select b from t s where s.a = t.a) from t", @@ -677,12 +685,12 @@ "Hints": "use_index(@`del_1` `test`.`t1` `c_d_e`), use_index(@`del_1` `test`.`t2` `c_d_e`), merge_join(@`del_1` `test`.`t1`)" }, { - "SQL": "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", + "SQL": "update /*+ TIDB_SMJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.c=1 where t1.a=t2.a", "Best": "MergeInnerJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Update", "Hints": "use_index(@`upd_1` `test`.`t1` ), use_index(@`upd_1` `test`.`t2` ), merge_join(@`upd_1` `test`.`t1`)" }, { - "SQL": "update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.a=1, t2.a=1 where t1.a=t2.a", + "SQL": "update /*+ TIDB_HJ(t1, t2) */ t t1, t t2 set t1.c=1, t2.c=1 where t1.a=t2.a", "Best": "LeftHashJoin{TableReader(Table(t))->TableReader(Table(t))}(test.t.a,test.t.a)->Update", "Hints": "use_index(@`upd_1` `test`.`t1` ), use_index(@`upd_1` `test`.`t2` ), hash_join(@`upd_1` `test`.`t1`)" }, @@ -704,7 +712,7 @@ { "SQL": "insert into t select * from t where b < 1 order by d limit 1", "Best": "TableReader(Table(t)->Sel([lt(test.t.b, 1)])->TopN([test.t.d],0,1))->TopN([test.t.d],0,1)->Insert", - "Hints": "" + "Hints": "use_index(@`sel_1` `test`.`t` )" }, { "SQL": "insert into t (a, b, c, e, f, g) values(0,0,0,0,0,0)", @@ -963,7 +971,7 @@ }, { "SQL": "select a from t where c in (1, 2, 3) and (d > 2 and d < 4 or d > 5 and d < 7)", - "Best": "IndexReader(Index(t.c_d_e)[(1 2,1 4) (1 5,1 7) (2 2,2 4) (2 5,2 7) (3 2,3 4) (3 5,3 7)])->Projection" + "Best": "IndexReader(Index(t.c_d_e)[[1 3,1 3] [1 6,1 6] [2 3,2 3] [2 6,2 6] [3 3,3 3] [3 6,3 6]])->Projection" }, { "SQL": "select a from t where c in (1, 2, 3)", @@ -1316,71 +1324,94 @@ { "SQL": [ "insert into t values(1, 1)", - "explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.a" ], "Plan": [ - "IndexJoin_12 12500.00 root inner join, inner:UnionScan_11, outer key:test.t.a, inner key:test.t.a", - "├─UnionScan_15(Build) 10000.00 root ", - "│ └─TableReader_17 10000.00 root data:TableFullScan_16", - "│ └─TableFullScan_16 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", - "└─UnionScan_11(Probe) 1.00 root ", - " └─TableReader_10 1.00 root data:TableRangeScan_9", - " └─TableRangeScan_9 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false, stats:pseudo" + "IndexJoin 12500.00 root inner join, inner:UnionScan, outer key:test.t.a, inner key:test.t.a, equal cond:eq(test.t.a, test.t.a)", + "├─UnionScan(Build) 10000.00 root ", + "│ └─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo", + "└─UnionScan(Probe) 1.00 root ", + " └─TableReader 1.00 root data:TableRangeScan", + " └─TableRangeScan 1.00 cop[tikv] table:t2 range: decided by [test.t.a], keep order:false, stats:pseudo" ] }, { "SQL": [ "insert into t values(1, 1)", - "explain select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.b" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from t t1, t t2 where t1.a = t2.b" ], "Plan": [ - "HashJoin_15 12487.50 root inner join, equal:[eq(test.t.a, test.t.b)]", - "├─UnionScan_17(Build) 9990.00 root not(isnull(test.t.b))", - "│ └─TableReader_20 9990.00 root data:Selection_19", - "│ └─Selection_19 9990.00 cop[tikv] not(isnull(test.t.b))", - "│ └─TableFullScan_18 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─UnionScan_21(Probe) 10000.00 root ", - " └─TableReader_23 10000.00 root data:TableFullScan_22", - " └─TableFullScan_22 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t.a, test.t.b)]", + "├─UnionScan(Build) 9990.00 root not(isnull(test.t.b))", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─UnionScan(Probe) 10000.00 root ", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { "SQL": [ "insert into t values(1, 1)", - "explain select /*+ TIDB_INLJ(t2) */ t1.a , t2.b from t t1, t t2 where t1.a = t2.b" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ t1.a , t2.b from t t1, t t2 where t1.a = t2.b" ], "Plan": [ - "HashJoin_15 12487.50 root inner join, equal:[eq(test.t.a, test.t.b)]", - "├─UnionScan_17(Build) 9990.00 root not(isnull(test.t.b))", - "│ └─TableReader_20 9990.00 root data:Selection_19", - "│ └─Selection_19 9990.00 cop[tikv] not(isnull(test.t.b))", - "│ └─TableFullScan_18 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", - "└─UnionScan_21(Probe) 10000.00 root ", - " └─TableReader_23 10000.00 root data:TableFullScan_22", - " └─TableFullScan_22 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + "HashJoin 12487.50 root inner join, equal:[eq(test.t.a, test.t.b)]", + "├─UnionScan(Build) 9990.00 root not(isnull(test.t.b))", + "│ └─TableReader 9990.00 root data:Selection", + "│ └─Selection 9990.00 cop[tikv] not(isnull(test.t.b))", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + "└─UnionScan(Probe) 10000.00 root ", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] }, { "SQL": [ "insert into tt values(1)", - "explain select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a" + "explain format = 'brief' select /*+ TIDB_INLJ(t2) */ * from tt t1, tt t2 where t1.a = t2.a" + ], + "Plan": [ + "HashJoin 25000.00 root inner join, equal:[eq(test.tt.a, test.tt.a)]", + "├─PartitionUnion(Build) 20000.00 root ", + "│ ├─UnionScan 10000.00 root ", + "│ │ └─TableReader 10000.00 root data:TableFullScan", + "│ │ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", + "│ └─UnionScan 10000.00 root ", + "│ └─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", + "└─PartitionUnion(Probe) 20000.00 root ", + " ├─UnionScan 10000.00 root ", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", + " └─UnionScan 10000.00 root ", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo" + ] + } + ] + }, + { + "Name": "TestMergeJoinUnionScan", + "Cases": [ + { + "SQL": [ + "insert into t2 values (11, 'amazing merkle')", + "insert into t2 values (12, 'amazing merkle')", + "explain format = 'brief' select /*+ MERGE_JOIN(t1,t2) */ * from t1, t2 where t1.c_int = t2.c_int and t1.c_int = t2.c_int order by t1.c_int, t2.c_str;" ], "Plan": [ - "HashJoin_21 25000.00 root inner join, equal:[eq(test.tt.a, test.tt.a)]", - "├─PartitionUnion_30(Build) 20000.00 root ", - "│ ├─UnionScan_31 10000.00 root ", - "│ │ └─TableReader_33 10000.00 root data:TableFullScan_32", - "│ │ └─TableFullScan_32 10000.00 cop[tikv] table:t2, partition:p0 keep order:false, stats:pseudo", - "│ └─UnionScan_34 10000.00 root ", - "│ └─TableReader_36 10000.00 root data:TableFullScan_35", - "│ └─TableFullScan_35 10000.00 cop[tikv] table:t2, partition:p1 keep order:false, stats:pseudo", - "└─PartitionUnion_23(Probe) 20000.00 root ", - " ├─UnionScan_24 10000.00 root ", - " │ └─TableReader_26 10000.00 root data:TableFullScan_25", - " │ └─TableFullScan_25 10000.00 cop[tikv] table:t1, partition:p0 keep order:false, stats:pseudo", - " └─UnionScan_27 10000.00 root ", - " └─TableReader_29 10000.00 root data:TableFullScan_28", - " └─TableFullScan_28 10000.00 cop[tikv] table:t1, partition:p1 keep order:false, stats:pseudo" + "Sort 12500.00 root test.t1.c_int, test.t2.c_str", + "└─MergeJoin 12500.00 root inner join, left key:test.t1.c_int, test.t1.c_int, right key:test.t2.c_int, test.t2.c_int", + " ├─Sort(Build) 10000.00 root test.t2.c_int, test.t2.c_int", + " │ └─UnionScan 10000.00 root ", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Sort(Probe) 10000.00 root test.t1.c_int, test.t1.c_int", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" ] } ] @@ -1390,7 +1421,7 @@ "Cases": [ { "SQL": "select t1.a, (select count(t2.a) from t t2 where t2.g in (select t3.d from t t3 where t3.c = t1.a)) as agg_col from t t1;", - "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexMergeJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,+inf]])}(test.t.d,test.t.g)}->HashAgg" + "Best": "Apply{IndexReader(Index(t.f)[[NULL,+inf]])->IndexJoin{IndexReader(Index(t.c_d_e)[[NULL,+inf]]->HashAgg)->HashAgg->IndexReader(Index(t.g)[[NULL,+inf]])}(test.t.d,test.t.g)}->HashAgg" } ] }, @@ -1450,43 +1481,46 @@ { "SQL": "select /*+ LIMIT_TO_COP() */ * from tn where a = 1 and b > 10 and b < 20 and c > 50 order by d limit 1", "Plan": [ - "TopN_8 0.83 root test.tn.d, offset:0, count:1", - "└─IndexReader_15 0.83 root index:TopN_14", - " └─TopN_14 0.83 cop[tikv] test.tn.d, offset:0, count:1", - " └─Selection_13 0.83 cop[tikv] gt(test.tn.c, 50)", - " └─IndexRangeScan_12 2.50 cop[tikv] table:tn, index:a(a, b, c, d) range:(1 10,1 20), keep order:false, stats:pseudo" + "TopN 0.83 root test.tn.d, offset:0, count:1", + "└─IndexReader 0.83 root index:TopN", + " └─TopN 0.83 cop[tikv] test.tn.d, offset:0, count:1", + " └─Selection 0.83 cop[tikv] gt(test.tn.c, 50)", + " └─IndexRangeScan 2.50 cop[tikv] table:tn, index:a(a, b, c, d) range:(1 10,1 20), keep order:false, stats:pseudo" ], - "Warning": "" + "Warning": null }, { "SQL": "select * from tn where a = 1 and b > 10 and b < 20 and c > 50 order by d limit 1", "Plan": [ - "TopN_10 0.83 root test.tn.d, offset:0, count:1", - "└─IndexReader_20 0.83 root index:Selection_19", - " └─Selection_19 0.83 cop[tikv] gt(test.tn.c, 50)", - " └─IndexRangeScan_18 2.50 cop[tikv] table:tn, index:a(a, b, c, d) range:(1 10,1 20), keep order:false, stats:pseudo" + "TopN 0.83 root test.tn.d, offset:0, count:1", + "└─IndexReader 0.83 root index:Selection", + " └─Selection 0.83 cop[tikv] gt(test.tn.c, 50)", + " └─IndexRangeScan 2.50 cop[tikv] table:tn, index:a(a, b, c, d) range:(1 10,1 20), keep order:false, stats:pseudo" ], - "Warning": "" + "Warning": null }, { "SQL": "select /*+ LIMIT_TO_COP() */ a from tn where mod(a, 2) order by a limit 1", "Plan": [ - "Limit_13 1.00 root offset:0, count:1", - "└─Selection_19 1.00 root mod(test.tn.a, 2)", - " └─IndexReader_21 1.00 root index:IndexFullScan_20", - " └─IndexFullScan_20 1.00 cop[tikv] table:tn, index:a(a, b, c, d) keep order:true, stats:pseudo" + "Limit 1.00 root offset:0, count:1", + "└─Selection 1.00 root mod(test.tn.a, 2)", + " └─IndexReader 1.00 root index:IndexFullScan", + " └─IndexFullScan 1.00 cop[tikv] table:tn, index:a(a, b, c, d) keep order:true, stats:pseudo" ], - "Warning": "[planner:1815]Optimizer Hint LIMIT_TO_COP is inapplicable" + "Warning": [ + "Scalar function 'mod'(signature: ModInt) can not be pushed to storage layer", + "[planner:1815]Optimizer Hint LIMIT_TO_COP is inapplicable" + ] }, { "SQL": "select /*+ LIMIT_TO_COP() */ a from tn where a > 10 limit 1", "Plan": [ - "Limit_8 1.00 root offset:0, count:1", - "└─IndexReader_12 1.00 root index:Limit_11", - " └─Limit_11 1.00 cop[tikv] offset:0, count:1", - " └─IndexRangeScan_10 1.00 cop[tikv] table:tn, index:a(a, b, c, d) range:(10,+inf], keep order:false, stats:pseudo" + "Limit 1.00 root offset:0, count:1", + "└─IndexReader 1.00 root index:Limit", + " └─Limit 1.00 cop[tikv] offset:0, count:1", + " └─IndexRangeScan 1.00 cop[tikv] table:tn, index:a(a, b, c, d) range:(10,+inf], keep order:false, stats:pseudo" ], - "Warning": "" + "Warning": null } ] }, @@ -1496,11 +1530,11 @@ { "SQL": "select /*+ HASH_AGG() */ avg(distinct a) from t;", "Plan": [ - "HashAgg_8 1.00 root funcs:avg(distinct Column#6)->Column#5", - "└─Projection_10 1.00 root cast(test.t.a, decimal(65,4) BINARY)->Column#6", - " └─TableReader_9 1.00 root data:HashAgg_5", - " └─HashAgg_5 1.00 cop[tikv] group by:test.t.a, ", - " └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:avg(distinct Column#6)->Column#5", + "└─Projection 1.00 root cast(test.t.a, decimal(15,4) BINARY)->Column#6", + " └─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 cop[tikv] group by:test.t.a, ", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1.5000" @@ -1509,11 +1543,11 @@ { "SQL": "select /*+ HASH_AGG() */ a, count(distinct a) from t;", "Plan": [ - "Projection_4 1.00 root test.t.a, Column#5", - "└─HashAgg_8 1.00 root funcs:count(distinct test.t.a)->Column#5, funcs:firstrow(Column#6)->test.t.a", - " └─TableReader_9 1.00 root data:HashAgg_5", - " └─HashAgg_5 1.00 cop[tikv] group by:test.t.a, funcs:firstrow(test.t.a)->Column#6", - " └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 1.00 root test.t.a, Column#5", + "└─HashAgg 1.00 root funcs:count(distinct test.t.a)->Column#5, funcs:firstrow(Column#6)->test.t.a", + " └─TableReader 1.00 root data:HashAgg", + " └─HashAgg 1.00 cop[tikv] group by:test.t.a, funcs:firstrow(test.t.a)->Column#6", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1 2" @@ -1522,11 +1556,11 @@ { "SQL": "select /*+ HASH_AGG() */ avg(b), c, avg(b), count(distinct A, B), count(distinct A), count(distinct c), sum(b) from t group by c;", "Plan": [ - "Projection_4 8000.00 root Column#5, test.t.c, Column#5, Column#6, Column#7, Column#8, Column#9", - "└─HashAgg_8 8000.00 root group by:test.t.c, funcs:avg(Column#10, Column#11)->Column#5, funcs:count(distinct test.t.a, test.t.b)->Column#6, funcs:count(distinct test.t.a)->Column#7, funcs:count(distinct test.t.c)->Column#8, funcs:sum(Column#12)->Column#9, funcs:firstrow(test.t.c)->test.t.c", - " └─TableReader_9 8000.00 root data:HashAgg_5", - " └─HashAgg_5 8000.00 cop[tikv] group by:test.t.a, test.t.b, test.t.c, funcs:count(test.t.b)->Column#10, funcs:sum(test.t.b)->Column#11, funcs:sum(test.t.b)->Column#12", - " └─TableFullScan_7 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 8000.00 root Column#5, test.t.c, Column#5, Column#6, Column#7, Column#8, Column#9", + "└─HashAgg 8000.00 root group by:test.t.c, funcs:avg(Column#10, Column#11)->Column#5, funcs:count(distinct test.t.a, test.t.b)->Column#6, funcs:count(distinct test.t.a)->Column#7, funcs:count(distinct test.t.c)->Column#8, funcs:sum(Column#12)->Column#9, funcs:firstrow(test.t.c)->test.t.c", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.t.a, test.t.b, test.t.c, funcs:count(test.t.b)->Column#10, funcs:sum(test.t.b)->Column#11, funcs:sum(test.t.b)->Column#12", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1.0000 1 1.0000 1 1 1 1", @@ -1537,10 +1571,10 @@ { "SQL": "select /*+ STREAM_AGG() */ count(distinct c) from t group by c;", "Plan": [ - "StreamAgg_11 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_12 8000.00 root index:StreamAgg_7", - " └─StreamAgg_7 8000.00 cop[tikv] group by:test.t.c, ", - " └─IndexFullScan_10 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" + "StreamAgg 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 8000.00 root index:StreamAgg", + " └─StreamAgg 8000.00 cop[tikv] group by:test.t.c, ", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" ], "Result": [ "0", @@ -1551,9 +1585,9 @@ { "SQL": "select /*+ STREAM_AGG() */ count(distinct c) from t;", "Plan": [ - "StreamAgg_7 1.00 root funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_11 10000.00 root index:IndexFullScan_10", - " └─IndexFullScan_10 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "2" @@ -1562,10 +1596,10 @@ { "SQL": "select /*+ HASH_AGG() */ count(distinct c) from t;", "Plan": [ - "HashAgg_9 1.00 root funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_10 1.00 root index:HashAgg_5", - " └─HashAgg_5 1.00 cop[tikv] group by:test.t.c, ", - " └─IndexFullScan_8 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 1.00 root index:HashAgg", + " └─HashAgg 1.00 cop[tikv] group by:test.t.c, ", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "2" @@ -1574,10 +1608,10 @@ { "SQL": "select count(distinct c) from t group by c;", "Plan": [ - "HashAgg_10 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_11 8000.00 root index:HashAgg_5", - " └─HashAgg_5 8000.00 cop[tikv] group by:test.t.c, ", - " └─IndexFullScan_9 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "HashAgg 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 8000.00 root index:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.t.c, ", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "0", @@ -1588,10 +1622,10 @@ { "SQL": "select count(distinct c) from t;", "Plan": [ - "HashAgg_9 1.00 root funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_10 1.00 root index:HashAgg_5", - " └─HashAgg_5 1.00 cop[tikv] group by:test.t.c, ", - " └─IndexFullScan_8 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 1.00 root index:HashAgg", + " └─HashAgg 1.00 cop[tikv] group by:test.t.c, ", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "2" @@ -1600,17 +1634,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_13 16000.00 root ", - " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_18 8000.00 root data:HashAgg_14", - " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_23 8000.00 root data:HashAgg_19", - " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection 16000.00 root cast(test.pt.b, decimal(32,0) BINARY)->Column#9", + " └─PartitionUnion 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader 8000.00 root data:HashAgg", + " │ └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" @@ -1619,20 +1653,36 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;", "Plan": [ - "HashAgg_14 1.00 root funcs:count(distinct Column#5)->Column#6", - "└─Union_15 16000.00 root ", - " ├─HashAgg_19 8000.00 root group by:test.ta.a, funcs:firstrow(test.ta.a)->Column#5, funcs:firstrow(test.ta.a)->Column#5", - " │ └─TableReader_20 8000.00 root data:HashAgg_16", - " │ └─HashAgg_16 8000.00 cop[tikv] group by:test.ta.a, ", - " │ └─TableFullScan_18 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", - " └─HashAgg_24 8000.00 root group by:test.tb.a, funcs:firstrow(test.tb.a)->Column#5, funcs:firstrow(test.tb.a)->Column#5", - " └─TableReader_25 8000.00 root data:HashAgg_21", - " └─HashAgg_21 8000.00 cop[tikv] group by:test.tb.a, ", - " └─TableFullScan_23 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct Column#5)->Column#6", + "└─Union 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.ta.a, funcs:firstrow(test.ta.a)->Column#5, funcs:firstrow(test.ta.a)->Column#5", + " │ └─TableReader 8000.00 root data:HashAgg", + " │ └─HashAgg 8000.00 cop[tikv] group by:test.ta.a, ", + " │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.tb.a, funcs:firstrow(test.tb.a)->Column#5, funcs:firstrow(test.tb.a)->Column#5", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.tb.a, ", + " └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" ], "Result": [ "1" ] + }, + { + "SQL": "select distinct DATE_FORMAT(timestamp, '%Y-%m-%d %H') as tt from tc ;", + "Plan": [ + "HashAgg 16000.00 root group by:Column#5, funcs:firstrow(Column#6)->Column#3", + "└─PartitionUnion 16000.00 root ", + " ├─HashAgg 8000.00 root group by:Column#15, funcs:firstrow(Column#13)->Column#6, funcs:firstrow(Column#14)->Column#5", + " │ └─Projection 10000.00 root date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#13, date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#14, date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#15", + " │ └─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:tc, partition:p2020072312 keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:Column#18, funcs:firstrow(Column#16)->Column#6, funcs:firstrow(Column#17)->Column#5", + " └─Projection 10000.00 root date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#16, date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#17, date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#18", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:tc, partition:p2020072313 keep order:false, stats:pseudo" + ], + "Result": null } ] }, @@ -1642,10 +1692,10 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ avg(distinct a) from t;", "Plan": [ - "HashAgg_5 1.00 root funcs:avg(distinct Column#6)->Column#5", - "└─Projection_8 10000.00 root cast(test.t.a, decimal(65,4) BINARY)->Column#6", - " └─TableReader_7 10000.00 root data:TableFullScan_6", - " └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:avg(distinct Column#6)->Column#5", + "└─Projection 10000.00 root cast(test.t.a, decimal(15,4) BINARY)->Column#6", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1.5000" @@ -1654,10 +1704,10 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ a, count(distinct a) from t;", "Plan": [ - "Projection_4 1.00 root test.t.a, Column#5", - "└─HashAgg_5 1.00 root funcs:count(distinct test.t.a)->Column#5, funcs:firstrow(test.t.a)->test.t.a", - " └─TableReader_7 10000.00 root data:TableFullScan_6", - " └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 1.00 root test.t.a, Column#5", + "└─HashAgg 1.00 root funcs:count(distinct test.t.a)->Column#5, funcs:firstrow(test.t.a)->test.t.a", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1 2" @@ -1666,11 +1716,11 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ avg(b), c, avg(b), count(distinct A, B), count(distinct A), count(distinct c), sum(b) from t group by c;", "Plan": [ - "Projection_4 8000.00 root Column#5, test.t.c, Column#5, Column#6, Column#7, Column#8, Column#9", - "└─HashAgg_5 8000.00 root group by:Column#17, funcs:avg(Column#10)->Column#5, funcs:count(distinct Column#11, Column#12)->Column#6, funcs:count(distinct Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:firstrow(Column#16)->test.t.c", - " └─Projection_8 10000.00 root cast(test.t.b, decimal(65,4) BINARY)->Column#10, test.t.a, test.t.b, test.t.a, test.t.c, cast(test.t.b, decimal(65,0) BINARY)->Column#15, test.t.c, test.t.c", - " └─TableReader_7 10000.00 root data:TableFullScan_6", - " └─TableFullScan_6 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" + "Projection 8000.00 root Column#5, test.t.c, Column#5, Column#6, Column#7, Column#8, Column#9", + "└─HashAgg 8000.00 root group by:Column#17, funcs:avg(Column#10)->Column#5, funcs:count(distinct Column#11, Column#12)->Column#6, funcs:count(distinct Column#13)->Column#7, funcs:count(distinct Column#14)->Column#8, funcs:sum(Column#15)->Column#9, funcs:firstrow(Column#16)->test.t.c", + " └─Projection 10000.00 root cast(test.t.b, decimal(15,4) BINARY)->Column#10, test.t.a, test.t.b, test.t.a, test.t.c, cast(test.t.b, decimal(32,0) BINARY)->Column#15, test.t.c, test.t.c", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo" ], "Result": [ "1.0000 1 1.0000 1 1 1 1", @@ -1681,9 +1731,9 @@ { "SQL": "select /*+ STREAM_AGG(), AGG_TO_COP() */ count(distinct c) from t group by c;", "Plan": [ - "StreamAgg_6 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_9 10000.00 root index:IndexFullScan_8", - " └─IndexFullScan_8 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" + "StreamAgg 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" ], "Result": [ "0", @@ -1694,9 +1744,9 @@ { "SQL": "select /*+ STREAM_AGG(), AGG_TO_COP() */ count(distinct c) from t;", "Plan": [ - "StreamAgg_6 1.00 root funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_11 10000.00 root index:IndexFullScan_10", - " └─IndexFullScan_10 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "StreamAgg 1.00 root funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "2" @@ -1705,9 +1755,9 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct c) from t;", "Plan": [ - "HashAgg_5 1.00 root funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_9 10000.00 root index:IndexFullScan_8", - " └─IndexFullScan_8 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:false, stats:pseudo" ], "Result": [ "2" @@ -1716,9 +1766,9 @@ { "SQL": "select /*+ AGG_TO_COP() */ count(distinct c) from t group by c;", "Plan": [ - "StreamAgg_6 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", - "└─IndexReader_12 10000.00 root index:IndexFullScan_11", - " └─IndexFullScan_11 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" + "StreamAgg 8000.00 root group by:test.t.c, funcs:count(distinct test.t.c)->Column#5", + "└─IndexReader 10000.00 root index:IndexFullScan", + " └─IndexFullScan 10000.00 cop[tikv] table:t, index:c(c) keep order:true, stats:pseudo" ], "Result": [ "0", @@ -1729,17 +1779,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_13 16000.00 root ", - " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_18 8000.00 root data:HashAgg_14", - " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_23 8000.00 root data:HashAgg_19", - " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection 16000.00 root cast(test.pt.b, decimal(32,0) BINARY)->Column#9", + " └─PartitionUnion 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader 8000.00 root data:HashAgg", + " │ └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" @@ -1748,16 +1798,16 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;", "Plan": [ - "HashAgg_14 1.00 root funcs:count(distinct Column#5)->Column#6", - "└─Union_15 16000.00 root ", - " ├─HashAgg_19 8000.00 root group by:test.ta.a, funcs:firstrow(test.ta.a)->Column#5, funcs:firstrow(test.ta.a)->Column#5", - " │ └─TableReader_20 8000.00 root data:HashAgg_16", - " │ └─HashAgg_16 8000.00 cop[tikv] group by:test.ta.a, ", - " │ └─TableFullScan_18 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", - " └─HashAgg_24 8000.00 root group by:test.tb.a, funcs:firstrow(test.tb.a)->Column#5, funcs:firstrow(test.tb.a)->Column#5", - " └─TableReader_25 8000.00 root data:HashAgg_21", - " └─HashAgg_21 8000.00 cop[tikv] group by:test.tb.a, ", - " └─TableFullScan_23 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct Column#5)->Column#6", + "└─Union 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.ta.a, funcs:firstrow(test.ta.a)->Column#5, funcs:firstrow(test.ta.a)->Column#5", + " │ └─TableReader 8000.00 root data:HashAgg", + " │ └─HashAgg 8000.00 cop[tikv] group by:test.ta.a, ", + " │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.tb.a, funcs:firstrow(test.tb.a)->Column#5, funcs:firstrow(test.tb.a)->Column#5", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.tb.a, ", + " └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" ], "Result": [ "1" @@ -1771,17 +1821,17 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ sum(distinct b) from pt;", "Plan": [ - "HashAgg_12 1.00 root funcs:sum(distinct Column#9)->Column#4", - "└─Projection_24 16000.00 root cast(test.pt.b, decimal(65,0) BINARY)->Column#9", - " └─PartitionUnion_13 16000.00 root ", - " ├─HashAgg_17 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " │ └─TableReader_18 8000.00 root data:HashAgg_14", - " │ └─HashAgg_14 8000.00 cop[tikv] group by:test.pt.b, ", - " │ └─TableFullScan_16 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", - " └─HashAgg_22 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", - " └─TableReader_23 8000.00 root data:HashAgg_19", - " └─HashAgg_19 8000.00 cop[tikv] group by:test.pt.b, ", - " └─TableFullScan_21 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:sum(distinct Column#9)->Column#4", + "└─Projection 16000.00 root cast(test.pt.b, decimal(32,0) BINARY)->Column#9", + " └─PartitionUnion 16000.00 root ", + " ├─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " │ └─TableReader 8000.00 root data:HashAgg", + " │ └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " │ └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p0 keep order:false, stats:pseudo", + " └─HashAgg 8000.00 root group by:test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b, funcs:firstrow(test.pt.b)->test.pt.b", + " └─TableReader 8000.00 root data:HashAgg", + " └─HashAgg 8000.00 cop[tikv] group by:test.pt.b, ", + " └─TableFullScan 10000.00 cop[tikv] table:pt, partition:p1 keep order:false, stats:pseudo" ], "Result": [ "" @@ -1790,16 +1840,29 @@ { "SQL": "select /*+ HASH_AGG(), AGG_TO_COP() */ count(distinct a) from (select * from ta union all select * from tb) t;", "Plan": [ - "HashAgg_11 1.00 root funcs:count(distinct Column#5)->Column#6", - "└─Union_12 20000.00 root ", - " ├─TableReader_15 10000.00 root data:TableFullScan_14", - " │ └─TableFullScan_14 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", - " └─TableReader_18 10000.00 root data:TableFullScan_17", - " └─TableFullScan_17 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:count(distinct Column#5)->Column#6", + "└─Union 20000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:ta keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:tb keep order:false, stats:pseudo" ], "Result": [ "1" ] + }, + { + "SQL": "select distinct DATE_FORMAT(timestamp, '%Y-%m-%d %H') as tt from tc ;", + "Plan": [ + "HashAgg 16000.00 root group by:Column#3, funcs:firstrow(Column#3)->Column#3", + "└─Projection 20000.00 root date_format(test.tc.timestamp, %Y-%m-%d %H)->Column#3", + " └─PartitionUnion 20000.00 root ", + " ├─TableReader 10000.00 root data:TableFullScan", + " │ └─TableFullScan 10000.00 cop[tikv] table:tc, partition:p2020072312 keep order:false, stats:pseudo", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:tc, partition:p2020072313 keep order:false, stats:pseudo" + ], + "Result": null } ] }, @@ -1809,10 +1872,10 @@ { "SQL": "select /*+ agg_to_cop */ group_concat(name ORDER BY name desc SEPARATOR '++'), group_concat(id ORDER BY name desc, id asc SEPARATOR '--') from test;", "Plan": [ - "HashAgg_5 1.00 root funcs:group_concat(Column#6 order by Column#7 desc separator \"++\")->Column#4, funcs:group_concat(Column#8 order by Column#9 desc, Column#10 separator \"--\")->Column#5", - "└─Projection_18 10000.00 root cast(test.test.name, var_string(20))->Column#6, test.test.name, cast(test.test.id, var_string(20))->Column#8, test.test.name, test.test.id", - " └─TableReader_11 10000.00 root data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:test keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:group_concat(Column#6 order by Column#7 desc separator \"++\")->Column#4, funcs:group_concat(Column#8 order by Column#9 desc, Column#10 separator \"--\")->Column#5", + "└─Projection 10000.00 root cast(test.test.name, var_string(20))->Column#6, test.test.name, cast(test.test.id, var_string(20))->Column#8, test.test.name, test.test.id", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:test keep order:false, stats:pseudo" ], "Result": [ "500++200++30++20++20++10 3--3--1--1--2--1" @@ -1821,10 +1884,10 @@ { "SQL": "select /*+ agg_to_cop */ group_concat(name ORDER BY name desc SEPARATOR '++'), group_concat(id ORDER BY name desc, id asc SEPARATOR '--') from ptest;", "Plan": [ - "HashAgg_5 1.00 root funcs:group_concat(Column#6 order by Column#7 desc separator \"++\")->Column#4, funcs:group_concat(Column#8 order by Column#9 desc, Column#10 separator \"--\")->Column#5", - "└─Projection_18 10000.00 root cast(test.ptest.name, var_string(20))->Column#6, test.ptest.name, cast(test.ptest.id, var_string(20))->Column#8, test.ptest.name, test.ptest.id", - " └─TableReader_11 10000.00 root partition:all data:TableFullScan_10", - " └─TableFullScan_10 10000.00 cop[tikv] table:ptest keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:group_concat(Column#6 order by Column#7 desc separator \"++\")->Column#4, funcs:group_concat(Column#8 order by Column#9 desc, Column#10 separator \"--\")->Column#5", + "└─Projection 10000.00 root cast(test.ptest.name, var_string(20))->Column#6, test.ptest.name, cast(test.ptest.id, var_string(20))->Column#8, test.ptest.name, test.ptest.id", + " └─TableReader 10000.00 root partition:all data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:ptest keep order:false, stats:pseudo" ], "Result": [ "500++200++30++20++20++10 3--3--1--1--2--1" @@ -1833,10 +1896,10 @@ { "SQL": "select /*+ agg_to_cop */ group_concat(distinct name order by name desc) from test;", "Plan": [ - "HashAgg_5 1.00 root funcs:group_concat(distinct Column#5 order by Column#6 desc separator \",\")->Column#4", - "└─Projection_9 10000.00 root cast(test.test.name, var_string(20))->Column#5, test.test.name", - " └─TableReader_8 10000.00 root data:TableFullScan_7", - " └─TableFullScan_7 10000.00 cop[tikv] table:test keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:group_concat(distinct Column#5 order by Column#6 desc separator \",\")->Column#4", + "└─Projection 10000.00 root cast(test.test.name, var_string(20))->Column#5, test.test.name", + " └─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:test keep order:false, stats:pseudo" ], "Result": [ "500,200,30,20,10" @@ -1845,10 +1908,10 @@ { "SQL": "select /*+ agg_to_cop */ group_concat(distinct name order by name desc) from ptest;", "Plan": [ - "HashAgg_5 1.00 root funcs:group_concat(distinct Column#5 order by Column#6 desc separator \",\")->Column#4", - "└─Projection_9 10000.00 root cast(test.ptest.name, var_string(20))->Column#5, test.ptest.name", - " └─TableReader_8 10000.00 root partition:all data:TableFullScan_7", - " └─TableFullScan_7 10000.00 cop[tikv] table:ptest keep order:false, stats:pseudo" + "HashAgg 1.00 root funcs:group_concat(distinct Column#5 order by Column#6 desc separator \",\")->Column#4", + "└─Projection 10000.00 root cast(test.ptest.name, var_string(20))->Column#5, test.ptest.name", + " └─TableReader 10000.00 root partition:all data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:ptest keep order:false, stats:pseudo" ], "Result": [ "500,200,30,20,10" @@ -1874,7 +1937,7 @@ }, { "SQL": "select lead(a, 1) over (partition by b) as c from t", - "Best": "TableReader(Table(t))->Sort->Window(lead(test.t.a, 1)->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data source:TableReader_10)->Projection" + "Best": "TableReader(Table(t))->Sort->Window(lead(test.t.a, 1)->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data sources:[TableReader_10])->Projection" } ] }, @@ -1884,11 +1947,11 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a", "Plan": [ - "MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - "├─IndexReader_15(Build) 9990.00 root index:IndexFullScan_14", - "│ └─IndexFullScan_14 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - "└─IndexReader_13(Probe) 9990.00 root index:IndexFullScan_12", - " └─IndexFullScan_12 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + "├─IndexReader(Build) 9990.00 root index:IndexFullScan", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + "└─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -1899,13 +1962,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a+1", "Plan": [ - "Projection_24 12487.50 root test.t.a", - "└─Projection_23 12487.50 root test.t.a, plus(test.t.a, 1)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_15(Build) 9990.00 root index:IndexFullScan_14", - " │ └─IndexFullScan_14 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─IndexReader_13(Probe) 9990.00 root index:IndexFullScan_12", - " └─IndexFullScan_12 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, plus(test.t.a, 1)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -1916,13 +1979,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by t1.a-1", "Plan": [ - "Projection_24 12487.50 root test.t.a", - "└─Projection_23 12487.50 root test.t.a, minus(test.t.a, 1)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_15(Build) 9990.00 root index:IndexFullScan_14", - " │ └─IndexFullScan_14 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─IndexReader_13(Probe) 9990.00 root index:IndexFullScan_12", - " └─IndexFullScan_12 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, minus(test.t.a, 1)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -1933,13 +1996,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by -t1.a", "Plan": [ - "Projection_32 12487.50 root test.t.a", - "└─Projection_31 12487.50 root test.t.a, unaryminus(test.t.a)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_26(Build) 9990.00 root index:IndexFullScan_25", - " │ └─IndexFullScan_25 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", - " └─IndexReader_24(Probe) 9990.00 root index:IndexFullScan_23", - " └─IndexFullScan_23 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, unaryminus(test.t.a)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" ], "Result": [ "2", @@ -1950,13 +2013,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by -t1.a+3", "Plan": [ - "Projection_32 12487.50 root test.t.a", - "└─Projection_31 12487.50 root test.t.a, plus(unaryminus(test.t.a), 3)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_26(Build) 9990.00 root index:IndexFullScan_25", - " │ └─IndexFullScan_25 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", - " └─IndexReader_24(Probe) 9990.00 root index:IndexFullScan_23", - " └─IndexFullScan_23 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, plus(unaryminus(test.t.a), 3)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" ], "Result": [ "2", @@ -1967,13 +2030,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1+t1.a", "Plan": [ - "Projection_24 12487.50 root test.t.a", - "└─Projection_23 12487.50 root test.t.a, plus(1, test.t.a)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_15(Build) 9990.00 root index:IndexFullScan_14", - " │ └─IndexFullScan_14 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─IndexReader_13(Probe) 9990.00 root index:IndexFullScan_12", - " └─IndexFullScan_12 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, plus(1, test.t.a)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -1984,13 +2047,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1-t1.a", "Plan": [ - "Projection_32 12487.50 root test.t.a", - "└─Projection_31 12487.50 root test.t.a, minus(1, test.t.a)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_26(Build) 9990.00 root index:IndexFullScan_25", - " │ └─IndexFullScan_25 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", - " └─IndexReader_24(Probe) 9990.00 root index:IndexFullScan_23", - " └─IndexFullScan_23 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, minus(1, test.t.a)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" ], "Result": [ "2", @@ -2001,13 +2064,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1-t1.a+3", "Plan": [ - "Projection_32 12487.50 root test.t.a", - "└─Projection_31 12487.50 root test.t.a, plus(minus(1, test.t.a), 3)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_26(Build) 9990.00 root index:IndexFullScan_25", - " │ └─IndexFullScan_25 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", - " └─IndexReader_24(Probe) 9990.00 root index:IndexFullScan_23", - " └─IndexFullScan_23 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, plus(minus(1, test.t.a), 3)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, desc, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, desc, stats:pseudo" ], "Result": [ "2", @@ -2018,13 +2081,13 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 1+t1.a+3", "Plan": [ - "Projection_24 12487.50 root test.t.a", - "└─Projection_23 12487.50 root test.t.a, plus(plus(1, test.t.a), 3)->Column#7", - " └─MergeJoin_21 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_15(Build) 9990.00 root index:IndexFullScan_14", - " │ └─IndexFullScan_14 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─IndexReader_13(Probe) 9990.00 root index:IndexFullScan_12", - " └─IndexFullScan_12 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Projection 12487.50 root test.t.a, plus(plus(1, test.t.a), 3)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -2035,14 +2098,14 @@ { "SQL": "select /*+ TIDB_SMJ(t1, t2) */ t1.a from t t1, t t2 where t1.a = t2.b order by 3*t1.a", "Plan": [ - "Projection_19 12487.50 root test.t.a", - "└─Sort_7 12487.50 root Column#7", - " └─Projection_20 12487.50 root test.t.a, mul(3, test.t.a)->Column#7", - " └─MergeJoin_9 12487.50 root inner join, left key:test.t.a, right key:test.t.b", - " ├─IndexReader_14(Build) 9990.00 root index:IndexFullScan_13", - " │ └─IndexFullScan_13 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", - " └─IndexReader_12(Probe) 9990.00 root index:IndexFullScan_11", - " └─IndexFullScan_11 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" + "Projection 12487.50 root test.t.a", + "└─Sort 12487.50 root Column#7", + " └─Projection 12487.50 root test.t.a, mul(3, test.t.a)->Column#7", + " └─MergeJoin 12487.50 root inner join, left key:test.t.a, right key:test.t.b", + " ├─IndexReader(Build) 9990.00 root index:IndexFullScan", + " │ └─IndexFullScan 9990.00 cop[tikv] table:t2, index:idx_b(b) keep order:true, stats:pseudo", + " └─IndexReader(Probe) 9990.00 root index:IndexFullScan", + " └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:true, stats:pseudo" ], "Result": [ "1", @@ -2078,12 +2141,12 @@ { "SQL": "select 1 from (select /*+ HASH_JOIN(t1) */ t1.a in (select t2.a from t2) from t1) x;", "Plan": "LeftHashJoin{IndexReader(Index(t1.idx_a)[[NULL,+inf]])->IndexReader(Index(t2.idx_a)[[NULL,+inf]])}->Projection", - "Hints": "use_index(@`sel_2` `test`.`t1` `idx_a`), use_index(@`sel_3` `test`.`t2` `idx_a`), hash_join(@`sel_2` `test`.`t1`)" + "Hints": "use_index(@`sel_2` `test`.`t1` `idx_a`), use_index(@`sel_2` `test`.`t2` `idx_a`), hash_join(@`sel_2` `test`.`t1`)" }, { "SQL": "select 1 from (select /*+ HASH_JOIN(t1) */ t1.a not in (select t2.a from t2) from t1) x;", "Plan": "LeftHashJoin{IndexReader(Index(t1.idx_a)[[NULL,+inf]])->IndexReader(Index(t2.idx_a)[[NULL,+inf]])}->Projection", - "Hints": "use_index(@`sel_2` `test`.`t1` `idx_a`), use_index(@`sel_3` `test`.`t2` `idx_a`), hash_join(@`sel_2` `test`.`t1`)" + "Hints": "use_index(@`sel_2` `test`.`t1` `idx_a`), use_index(@`sel_2` `test`.`t2` `idx_a`), hash_join(@`sel_2` `test`.`t1`)" }, { "SQL": "select /*+ INL_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", @@ -2093,17 +2156,17 @@ { "SQL": "select /*+ INL_HASH_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": "IndexHashJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(test.t1.a))]), Table(t1))->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))}(test.t2.a,test.t1.a)", - "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` ), inl_hash_join(@`sel_1` )" + "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` ), inl_hash_join(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ INL_MERGE_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": "IndexMergeJoin{IndexLookUp(Index(t1.idx_a)[[NULL,+inf]]->Sel([not(isnull(test.t1.a))]), Table(t1))->Projection->TableReader(Table(t2)->Sel([not(isnull(test.t2.a))]))}(test.t2.a,test.t1.a)", - "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` )" + "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` ), inl_merge_join(@`sel_1` `test`.`t1`)" }, { "SQL": "select /*+ MERGE_JOIN(t1) */ t1.b, t2.b from t1 inner join t2 on t1.a = t2.a;", "Plan": "MergeInnerJoin{IndexLookUp(Index(t1.idx_a)[[-inf,+inf]], Table(t1))->Projection->IndexLookUp(Index(t2.idx_a)[[-inf,+inf]], Table(t2))->Projection}(test.t1.a,test.t2.a)", - "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` `idx_a`)" + "Hints": "use_index(@`sel_1` `test`.`t1` `idx_a`), use_index(@`sel_1` `test`.`t2` `idx_a`), merge_join(@`sel_1` `test`.`t1`)" } ] }, @@ -2122,47 +2185,97 @@ { "SQL": "select /*+nth_plan(1)*/ * from test.tt where a=1 and b=1", "Plan": [ - "TableReader_7 0.01 root data:Selection_6", - "└─Selection_6 0.01 cop[tikv] eq(test.tt.a, 1), eq(test.tt.b, 1)", - " └─TableFullScan_5 10000.00 cop[tikv] table:tt keep order:false, stats:pseudo" + "TableReader 0.01 root data:Selection", + "└─Selection 0.01 cop[tikv] eq(test.tt.a, 1), eq(test.tt.b, 1)", + " └─TableFullScan 10000.00 cop[tikv] table:tt keep order:false, stats:pseudo" ] }, { "SQL": "select /*+nth_plan(2)*/ * from test.tt where a=1 and b=1;", "Plan": [ - "IndexLookUp_11 0.01 root ", - "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "└─Selection_10(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", - " └─TableRowIDScan_9 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" + "IndexLookUp 0.01 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", + " └─TableRowIDScan 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" ] }, { "SQL": "select /*+nth_plan(3)*/ * from test.tt where a=1 and b=1;", "Plan": [ - "IndexLookUp_15 0.01 root ", - "├─IndexRangeScan_12(Build) 10.00 cop[tikv] table:tt, index:b(b) range:[1,1], keep order:false, stats:pseudo", - "└─Selection_14(Probe) 0.01 cop[tikv] eq(test.tt.a, 1)", - " └─TableRowIDScan_13 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" + "IndexLookUp 0.01 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt, index:b(b) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.01 cop[tikv] eq(test.tt.a, 1)", + " └─TableRowIDScan 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" ] }, { "SQL": "select /*+nth_plan(2)*/ * from test.tt where a=1 and b=1;", "Plan": [ - "IndexLookUp_11 0.01 root ", - "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "└─Selection_10(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", - " └─TableRowIDScan_9 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" + "IndexLookUp 0.01 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", + " └─TableRowIDScan 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" ] }, { "SQL": "select * from test.tt where a=1 and b=1", "Plan": [ - "IndexLookUp_11 0.01 root ", - "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", - "└─Selection_10(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", - " └─TableRowIDScan_9 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" + "IndexLookUp 0.01 root ", + "├─IndexRangeScan(Build) 10.00 cop[tikv] table:tt, index:a(a) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 0.01 cop[tikv] eq(test.tt.b, 1)", + " └─TableRowIDScan 10.00 cop[tikv] table:tt keep order:false, stats:pseudo" ] } ] + }, + { + "Name": "TestEliminateMaxOneRow", + "Cases": [ + { + "SQL": "select a from t2 where t2.a < (select t1.a from t1 where t1.a = t2.a);", + "Plan": [ + "HashJoin 9990.00 root inner join, equal:[eq(test.t2.a, test.t1.a)], other cond:lt(test.t2.a, test.t1.a)", + "├─IndexReader(Build) 7992.00 root index:Selection", + "│ └─Selection 7992.00 cop[tikv] lt(test.t1.a, test.t1.a)", + "│ └─IndexFullScan 9990.00 cop[tikv] table:t1, index:idx_a(a) keep order:false, stats:pseudo", + "└─TableReader(Probe) 7992.00 root data:Selection", + " └─Selection 7992.00 cop[tikv] lt(test.t2.a, test.t2.a), not(isnull(test.t2.a))", + " └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Result": null + }, + { + "SQL": "select a from t2 where t2.a < (select t1.a from t1 where t1.b = t2.b and t1.a is null);", + "Plan": [ + "Projection 9990.00 root test.t2.a", + "└─Apply 9990.00 root CARTESIAN inner join, other cond:lt(test.t2.a, test.t1.a)", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 0.80 root not(isnull(test.t1.a))", + " └─MaxOneRow 1.00 root ", + " └─IndexLookUp 0.00 root ", + " ├─IndexRangeScan(Build) 1.00 cop[tikv] table:t1, index:idx_a(a) range:[NULL,NULL], keep order:false, stats:pseudo", + " └─Selection(Probe) 0.00 cop[tikv] eq(test.t1.b, test.t2.b)", + " └─TableRowIDScan 1.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Result": null + }, + { + "SQL": "select a from t2 where t2.a < (select t3.a from t3 where t3.a = t2.a);", + "Plan": [ + "Projection 9990.00 root test.t2.a", + "└─Apply 9990.00 root CARTESIAN inner join, other cond:lt(test.t2.a, test.t3.a)", + " ├─TableReader(Build) 9990.00 root data:Selection", + " │ └─Selection 9990.00 cop[tikv] not(isnull(test.t2.a))", + " │ └─TableFullScan 10000.00 cop[tikv] table:t2 keep order:false, stats:pseudo", + " └─Selection(Probe) 0.80 root not(isnull(test.t3.a))", + " └─MaxOneRow 1.00 root ", + " └─IndexReader 2.00 root index:IndexRangeScan", + " └─IndexRangeScan 2.00 cop[tikv] table:t3, index:idx_abc(a, b, c) range: decided by [eq(test.t3.a, test.t2.a)], keep order:false, stats:pseudo" + ], + "Result": null + } + ] } ] diff --git a/planner/core/testdata/plan_suite_unexported_in.json b/planner/core/testdata/plan_suite_unexported_in.json index 41aef7bec4ccc..c43c8c8547cf8 100644 --- a/planner/core/testdata/plan_suite_unexported_in.json +++ b/planner/core/testdata/plan_suite_unexported_in.json @@ -35,14 +35,14 @@ "select * from t for update", "update t set t.a = t.a * 1.5 where t.a >= 1000 order by t.a desc limit 10", "delete from t where t.a >= 1000 order by t.a desc limit 10", - "explain select * from t union all select * from t limit 1, 1", + "explain format = 'brief' select * from t union all select * from t limit 1, 1", // The correctness of explain result is checked at integration test. There is to improve coverage. - "explain select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", - "explain select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", - "explain select /*+ TIDB_SMJ(t1, t2) */ * from t t1 right join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", + "explain format = 'brief' select /*+ TIDB_INLJ(t1, t2) */ * from t t1 left join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", + "explain format = 'brief' select /*+ TIDB_HJ(t1, t2) */ * from t t1 left join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", + "explain format = 'brief' select /*+ TIDB_SMJ(t1, t2) */ * from t t1 right join t t2 on t1.a=t2.a where t1.b=1 and t2.b=1 and (t1.c=1 or t2.c=1)", "explain format=\"dot\" select /*+ TIDB_SMJ(t1, t2) */ * from t t1, t t2 where t1.a=t2.a", - "explain select * from t order by b", - "explain select * from t order by b limit 1", + "explain format = 'brief' select * from t order by b", + "explain format = 'brief' select * from t order by b limit 1", "explain format=\"dot\" select * from t order by a", "insert into t select * from t", "show columns from t where `Key` = 'pri' like 't*'", @@ -163,6 +163,8 @@ "select (select s.a from t s where t.a = s.a) from t order by t.a limit 5", // Test TopN + Left Semi Join Apply + Proj. "select exists (select s.a from t s where t.a = s.a) from t order by t.a limit 5", + // Test TopN + Left Semi Outer Join + Proj. + "select (exists (select s.a from t s where t.a = s.a)) as x from t order by x limit 5", // Test TopN + Semi Join Apply + Proj. "select * from t where exists (select s.a from t s where t.a = s.a) order by t.a limit 5", // Test TopN + Right Join + Proj. @@ -362,7 +364,9 @@ "select f, g, sum(a) from t", "select * from t t1 join t t2 on t1.a = t2.e", "select f from t having sum(a) > 0", - "select * from t t1 left join t t2 on t1.a = t2.a" + "select * from t t1 left join t t2 on t1.a = t2.a", + "select a from t where b > 0", + "select a from t where b > 0 limit 5" ] }, { @@ -399,7 +403,8 @@ "select t01.a from (select a from t t21 union all select a from t t22) t2 join t t01 on 1 left outer join t t3 on 1 join t t4 on 1", "select 1 from (select count(b) as cnt from t) t1", "select count(1) from (select count(b) as cnt from t) t1", - "select count(1) from (select count(b) as cnt from t group by c) t1" + "select count(1) from (select count(b) as cnt from t group by c) t1", + "select b from t where a > 0 limit 5, 10" ] }, { diff --git a/planner/core/testdata/plan_suite_unexported_out.json b/planner/core/testdata/plan_suite_unexported_out.json index 699b0d3214326..eab64f63a7ba8 100644 --- a/planner/core/testdata/plan_suite_unexported_out.json +++ b/planner/core/testdata/plan_suite_unexported_out.json @@ -101,7 +101,7 @@ "Cases": [ "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->Projection", "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,test.t.a)->Projection->Projection", - "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,test.t.a)->Aggr(firstrow(Column#13),count(test.t.b))->Projection->Projection", + "Join{DataScan(t)->Aggr(count(test.t.c),firstrow(test.t.a))->DataScan(s)}(test.t.a,test.t.a)->Aggr(firstrow(Column#25),count(test.t.b))->Projection->Projection", "Apply{DataScan(t)->DataScan(s)->Sel([eq(test.t.a, test.t.a)])->Aggr(count(test.t.b))}->Projection", "Join{DataScan(t)->DataScan(s)->Aggr(count(test.t.b),firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection->Projection", "Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(s)->Aggr(count(test.t.b),firstrow(test.t.a))}(test.t.a,test.t.a)->Projection->Projection->Projection", @@ -136,6 +136,7 @@ "Join{DataScan(t)->Limit->DataScan(s)}(test.t.a,test.t.a)->Limit->Projection", "Join{DataScan(t)->TopN([test.t.a],0,5)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", "Join{DataScan(t)->TopN([test.t.a],0,5)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", + "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->TopN([Column#25],0,5)->Projection", "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", "Join{DataScan(t)->DataScan(s)->TopN([test.t.a],0,5)}(test.t.a,test.t.a)->TopN([test.t.a],0,5)->Projection", "Join{DataScan(t)->DataScan(s)}(test.t.a,test.t.a)->TopN([test.t.a test.t.b],0,5)->Projection", @@ -184,7 +185,7 @@ "Cases": [ "TableReader(Table(t))->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.a))->Projection", "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.b))->Projection", - "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16, decimal(65,4) BINARY))->Column#17 over(partition by Column#15))->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16, decimal(24,4) BINARY))->Column#17 over(partition by Column#15))->Projection", "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(order by test.t.a, test.t.b desc range between unbounded preceding and current row))->Projection", "TableReader(Table(t))->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.a))->Projection", "[planner:1054]Unknown column 'z' in 'field list'", @@ -256,8 +257,8 @@ "Name": "TestWindowParallelFunction", "Cases": [ "TableReader(Table(t))->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.a))->Projection", - "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data source:TableReader_10)->Projection", - "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16, decimal(65,4) BINARY))->Column#17 over(partition by Column#15))->Partition(execution info: concurrency:4, data source:Projection_8)->Projection", + "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data sources:[TableReader_10])->Projection", + "IndexReader(Index(t.f)[[NULL,+inf]])->Projection->Sort->Window(avg(cast(Column#16, decimal(24,4) BINARY))->Column#17 over(partition by Column#15))->Partition(execution info: concurrency:4, data sources:[Projection_8])->Projection", "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(order by test.t.a, test.t.b desc range between unbounded preceding and current row))->Projection", "TableReader(Table(t))->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.a))->Projection", "[planner:1054]Unknown column 'z' in 'field list'", @@ -299,7 +300,7 @@ "[planner:1210]Incorrect arguments to nth_value", "[planner:1210]Incorrect arguments to ntile", "IndexReader(Index(t.f)[[NULL,+inf]])->Window(ntile()->Column#14 over())->Projection", - "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data source:TableReader_10)->Projection", + "TableReader(Table(t))->Sort->Window(avg(cast(test.t.a, decimal(65,30) BINARY))->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data sources:[TableReader_10])->Projection", "TableReader(Table(t))->Window(nth_value(test.t.i_date, 1)->Column#14 over())->Projection", "TableReader(Table(t))->Window(sum(cast(test.t.b, decimal(65,0) BINARY))->Column#15, sum(cast(test.t.c, decimal(65,0) BINARY))->Column#16 over(order by test.t.a range between unbounded preceding and current row))->Projection", "[planner:3593]You cannot use the window function 'sum' in this context.'", @@ -307,7 +308,7 @@ "[planner:3593]You cannot use the window function 'row_number' in this context.'", "TableReader(Table(t))->Sort->Window(sum(cast(test.t.c, decimal(65,0) BINARY))->Column#17 over(partition by test.t.a order by test.t.c range between unbounded preceding and current row))->Sort->Window(sum(cast(test.t.b, decimal(65,0) BINARY))->Column#18 over(order by test.t.a, test.t.b, test.t.c range between unbounded preceding and current row))->Window(sum(cast(test.t.a, decimal(65,0) BINARY))->Column#19 over(partition by test.t.a order by test.t.b range between unbounded preceding and current row))->Window(sum(cast(test.t.d, decimal(65,0) BINARY))->Column#20 over())->Projection", "[planner:3587]Window 'w1' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", - "TableReader(Table(t))->Sort->Window(dense_rank()->Column#14 over(partition by test.t.b order by test.t.a desc, test.t.b desc))->Partition(execution info: concurrency:4, data source:TableReader_9)->Projection", + "TableReader(Table(t))->Sort->Window(dense_rank()->Column#14 over(partition by test.t.b order by test.t.a desc, test.t.b desc))->Partition(execution info: concurrency:4, data sources:[TableReader_9])->Projection", "[planner:3587]Window 'w1' with RANGE N PRECEDING/FOLLOWING frame requires exactly one ORDER BY expression, of numeric or temporal type", "[planner:3585]Window 'w1': frame end cannot be UNBOUNDED PRECEDING.", "[planner:3584]Window 'w1': frame start cannot be UNBOUNDED FOLLOWING.", @@ -321,7 +322,7 @@ "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", "[planner:3586]Window 'w': frame start or end is negative, NULL or of non-integral type", - "TableReader(Table(t))->Sort->Window(row_number()->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data source:TableReader_10)->Projection" + "TableReader(Table(t))->Sort->Window(row_number()->Column#14 over(partition by test.t.b))->Partition(execution info: concurrency:4, data sources:[TableReader_10])->Projection" ] }, { @@ -460,18 +461,7 @@ "test.t.a" ] ], - "4": [ - [ - "test.t.f" - ], - [ - "test.t.f", - "test.t.g" - ], - [ - "test.t.a" - ] - ] + "5": [] }, { "1": [ @@ -552,6 +542,35 @@ "test.t.a" ] ] + }, + { + "1": [ + [ + "test.t.a" + ] + ], + "3": [ + [ + "test.t.a" + ] + ] + }, + { + "1": [ + [ + "test.t.a" + ] + ], + "3": [ + [ + "test.t.a" + ] + ], + "4": [ + [ + "test.t.a" + ] + ] } ] }, @@ -631,7 +650,7 @@ "1": [ "test.t.a" ], - "3": [ + "2": [ "test.t.a", "test.t.b" ] @@ -646,7 +665,7 @@ "test.t.a", "test.t.b" ], - "3": [ + "2": [ "test.t.b" ] }, @@ -654,7 +673,7 @@ "1": [ "test.t.a" ], - "3": [ + "2": [ "test.t.b" ] }, @@ -706,10 +725,10 @@ "1": [ "test.t.a" ], - "10": [ + "11": [ "test.t.a" ], - "12": [ + "13": [ "test.t.a" ], "3": [ @@ -736,6 +755,15 @@ "1": [ "test.t.c" ] + }, + { + "1": [ + "test.t.a", + "test.t.b" + ], + "4": [ + "test.t.b" + ] } ] }, @@ -896,7 +924,7 @@ }, { "Left": "[]", - "Right": "[or(or(eq(test.t.a, 3), eq(test.t.a, 4)), eq(test.t.a, 2))]" + "Right": "[or(eq(test.t.a, 3), or(eq(test.t.a, 4), eq(test.t.a, 2)))]" }, { "Left": "[gt(test.t.a, 1)]", @@ -908,10 +936,10 @@ "Name": "TestJoinReOrder", "Cases": [ "Join{Join{Join{Join{DataScan(t1)->DataScan(t2)}(test.t.a,test.t.b)->DataScan(t3)}(test.t.a,test.t.b)->DataScan(t4)}(test.t.c,test.t.a)(test.t.c,test.t.d)->Join{DataScan(t5)->DataScan(t6)}(test.t.d,test.t.d)}->Projection", - "Join{Join{Join{Join{DataScan(t1)->DataScan(t8)}(test.t.a,test.t.a)->DataScan(t2)}->Join{DataScan(t3)->DataScan(t4)}}->Join{Join{DataScan(t5)->DataScan(t6)}->DataScan(t7)}}->Projection", - "Join{Join{Join{Join{DataScan(t5)->DataScan(t1)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->DataScan(t3)}(test.t.a,test.t.a)(test.t.a,test.t.a)->DataScan(t4)}(test.t.a,test.t.a)(test.t.a,test.t.a)(test.t.a,test.t.a)->Projection", - "Join{Join{Join{DataScan(t3)->DataScan(t1)}->Join{DataScan(t2)->DataScan(t4)}}->DataScan(t5)}->Projection", - "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t3)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->Projection}->Projection", + "Join{Join{Join{Join{DataScan(t1)->DataScan(t8)}(test.t.a,test.t.a)->DataScan(t2)}->Join{DataScan(t3)->DataScan(t4)}}->Join{Join{DataScan(t5)->DataScan(t6)}->DataScan(t7)}}->Projection->Projection", + "Join{Join{Join{Join{DataScan(t5)->DataScan(t1)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->DataScan(t3)}(test.t.a,test.t.a)(test.t.a,test.t.a)->DataScan(t4)}(test.t.a,test.t.a)(test.t.a,test.t.a)(test.t.a,test.t.a)->Projection->Projection", + "Join{Join{Join{DataScan(t3)->DataScan(t1)}->Join{DataScan(t2)->DataScan(t4)}}->DataScan(t5)}->Projection->Projection", + "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t3)}(test.t.a,test.t.a)->DataScan(t2)}(test.t.a,test.t.a)->Projection->Projection}->Projection", "Apply{DataScan(o)->Join{Join{DataScan(t1)->DataScan(t2)}->DataScan(t3)}->Projection}->Projection" ] }, diff --git a/planner/core/testdata/point_get_plan_in.json b/planner/core/testdata/point_get_plan_in.json index 44fa5efa4eacd..5b8e22abeb8c5 100644 --- a/planner/core/testdata/point_get_plan_in.json +++ b/planner/core/testdata/point_get_plan_in.json @@ -9,5 +9,22 @@ "select * from t t1 join t t2 on t1.a = t2.a where t1.a = '4' and (t2.b, t2.c) in ((1,1),(2,2))", "select * from t where (t.b, t.c) in ((2,2), (3,3), (4,4)) order by t.b, t.c" ] + }, + { + "name": "TestCBOShouldNotUsePointGet", + "cases": [ + "select * from t1 where id = 0", + "select * from t1 where id = x'00'", + "select * from t1 where id = b'00'", + "select * from t1 where id = 0.0", + "select * from t1 where id = 1.0", + "select * from t1 where id in (0, 1)", + "select * from t2 where id = 0", + "select * from t2 where id in (0, 1)", + "select * from t3 where (id, d) in ((0, 't'), (1, 't'))", + "select * from t4 where (id, d, c) in ((1, 'b', 0))", + "select * from t4 where (id, d, c) in ((1, 0, 0))", + "select * from t5 where id in ('0')" + ] } ] diff --git a/planner/core/testdata/point_get_plan_out.json b/planner/core/testdata/point_get_plan_out.json index 5b9349a05e984..7681045160215 100644 --- a/planner/core/testdata/point_get_plan_out.json +++ b/planner/core/testdata/point_get_plan_out.json @@ -5,8 +5,8 @@ { "SQL": "select * from t where t.a in ('1','2','4') and t.a+1=2 order by t.a desc", "Plan": [ - "Selection_12 2.40 root eq(plus(cast(test.t.a), 1), 2)", - "└─Batch_Point_Get_11 3.00 root table:t, index:PRIMARY(a) keep order:true, desc:true" + "Selection 2.40 root eq(plus(cast(test.t.a), 1), 2)", + "└─Batch_Point_Get 3.00 root table:t, index:PRIMARY(a) keep order:true, desc:true" ], "Res": [ "1 4 4 1" @@ -15,8 +15,8 @@ { "SQL": "select b, c from t where t.b = 2 and t.c = 2 and t.b+1=3", "Plan": [ - "Selection_6 0.80 root eq(plus(test.t.b, 1), 3)", - "└─Point_Get_5 1.00 root table:t, index:b(b, c) " + "Selection 0.80 root 1", + "└─Point_Get 1.00 root table:t, index:b(b, c) " ], "Res": [ "2 2" @@ -25,8 +25,8 @@ { "SQL": "select * from t where t.a = '1' and t.b = 4", "Plan": [ - "Selection_6 0.00 root eq(test.t.b, 4)", - "└─Point_Get_5 1.00 root table:t, index:PRIMARY(a) " + "Selection 0.00 root eq(test.t.b, 4)", + "└─Point_Get 1.00 root table:t, index:PRIMARY(a) " ], "Res": [ "1 4 4 1" @@ -35,8 +35,8 @@ { "SQL": "select * from t where t.a in ('1','3') and t.d = 3", "Plan": [ - "Selection_6 0.00 root eq(test.t.d, 3)", - "└─Batch_Point_Get_5 2.00 root table:t, index:PRIMARY(a) keep order:false, desc:false" + "Selection 0.00 root eq(test.t.d, 3)", + "└─Batch_Point_Get 2.00 root table:t, index:PRIMARY(a) keep order:false, desc:false" ], "Res": [ "3 2 2 3" @@ -45,11 +45,11 @@ { "SQL": "select * from t t1 join t t2 on t1.a = t2.a where t1.a = '4' and (t2.b, t2.c) in ((1,1),(2,2))", "Plan": [ - "Projection_7 0.00 root test.t.a, test.t.b, test.t.c, test.t.d, test.t.a, test.t.b, test.t.c, test.t.d", - "└─HashJoin_9 0.00 root CARTESIAN inner join", - " ├─Selection_11(Build) 0.00 root or(and(eq(test.t.b, 1), eq(test.t.c, 1)), and(eq(test.t.b, 2), eq(test.t.c, 2)))", - " │ └─Point_Get_10 1.00 root table:t, index:PRIMARY(a) ", - " └─Point_Get_12(Probe) 1.00 root table:t, index:PRIMARY(a) " + "Projection 0.00 root test.t.a, test.t.b, test.t.c, test.t.d, test.t.a, test.t.b, test.t.c, test.t.d", + "└─HashJoin 0.00 root CARTESIAN inner join", + " ├─Selection(Build) 0.00 root or(and(eq(test.t.b, 1), eq(test.t.c, 1)), and(eq(test.t.b, 2), eq(test.t.c, 2)))", + " │ └─Point_Get 1.00 root table:t, index:PRIMARY(a) ", + " └─Point_Get(Probe) 1.00 root table:t, index:PRIMARY(a) " ], "Res": [ "4 1 1 4 4 1 1 4" @@ -58,7 +58,7 @@ { "SQL": "select * from t where (t.b, t.c) in ((2,2), (3,3), (4,4)) order by t.b, t.c", "Plan": [ - "Batch_Point_Get_10 3.00 root table:t, index:b(b, c) keep order:true, desc:false" + "Batch_Point_Get 3.00 root table:t, index:b(b, c) keep order:true, desc:false" ], "Res": [ "3 2 2 3", @@ -67,5 +67,137 @@ ] } ] + }, + { + "Name": "TestCBOShouldNotUsePointGet", + "Cases": [ + { + "SQL": "select * from t1 where id = 0", + "Plan": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] eq(cast(test.t1.id), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "asdf" + ] + }, + { + "SQL": "select * from t1 where id = x'00'", + "Plan": [ + "Point_Get 1.00 root table:t1, clustered index:PRIMARY(id) " + ], + "Res": null + }, + { + "SQL": "select * from t1 where id = b'00'", + "Plan": [ + "Point_Get 1.00 root table:t1, clustered index:PRIMARY(id) " + ], + "Res": null + }, + { + "SQL": "select * from t1 where id = 0.0", + "Plan": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] eq(cast(test.t1.id), 0)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "asdf" + ] + }, + { + "SQL": "select * from t1 where id = 1.0", + "Plan": [ + "TableReader 8000.00 root data:Selection", + "└─Selection 8000.00 cop[tikv] eq(cast(test.t1.id), 1)", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "1asdf" + ] + }, + { + "SQL": "select * from t1 where id in (0, 1)", + "Plan": [ + "TableReader 9600.00 root data:Selection", + "└─Selection 9600.00 cop[tikv] or(eq(cast(test.t1.id), 0), eq(cast(test.t1.id), 1))", + " └─TableFullScan 10000.00 cop[tikv] table:t1 keep order:false, stats:pseudo" + ], + "Res": [ + "1asdf", + "asdf" + ] + }, + { + "SQL": "select * from t2 where id = 0", + "Plan": [ + "IndexReader 8000.00 root index:Selection", + "└─Selection 8000.00 cop[tikv] eq(cast(test.t2.id), 0)", + " └─IndexFullScan 10000.00 cop[tikv] table:t2, index:id(id) keep order:false, stats:pseudo" + ], + "Res": [ + "asdf" + ] + }, + { + "SQL": "select * from t2 where id in (0, 1)", + "Plan": [ + "IndexReader 9600.00 root index:Selection", + "└─Selection 9600.00 cop[tikv] or(eq(cast(test.t2.id), 0), eq(cast(test.t2.id), 1))", + " └─IndexFullScan 10000.00 cop[tikv] table:t2, index:id(id) keep order:false, stats:pseudo" + ], + "Res": [ + "1asdf", + "asdf" + ] + }, + { + "SQL": "select * from t3 where (id, d) in ((0, 't'), (1, 't'))", + "Plan": [ + "IndexReader 15.99 root index:Selection", + "└─Selection 15.99 cop[tikv] or(and(eq(cast(test.t3.id), 0), eq(test.t3.d, \"t\")), and(eq(cast(test.t3.id), 1), eq(test.t3.d, \"t\")))", + " └─IndexFullScan 10000.00 cop[tikv] table:t3, index:id(id, d) keep order:false, stats:pseudo" + ], + "Res": [ + "1asdf t", + "asdf t" + ] + }, + { + "SQL": "select * from t4 where (id, d, c) in ((1, 'b', 0))", + "Plan": [ + "Selection 0.80 root eq(cast(test.t4.c), 0)", + "└─Point_Get 1.00 root table:t4, index:id(id, d) " + ], + "Res": [ + "1 b asdf" + ] + }, + { + "SQL": "select * from t4 where (id, d, c) in ((1, 0, 0))", + "Plan": [ + "IndexLookUp 8.00 root ", + "├─Selection(Build) 8.00 cop[tikv] eq(cast(test.t4.d), 0)", + "│ └─IndexRangeScan 10.00 cop[tikv] table:t4, index:id(id, d) range:[1,1], keep order:false, stats:pseudo", + "└─Selection(Probe) 8.00 cop[tikv] eq(cast(test.t4.c), 0)", + " └─TableRowIDScan 8.00 cop[tikv] table:t4 keep order:false, stats:pseudo" + ], + "Res": [ + "1 b asdf", + "1 c jkl" + ] + }, + { + "SQL": "select * from t5 where id in ('0')", + "Plan": [ + "Selection 8000.00 root eq(test.t5.id, 0)", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t5 keep order:false, stats:pseudo" + ], + "Res": null + } + ] } ] diff --git a/planner/core/testdata/stats_suite_in.json b/planner/core/testdata/stats_suite_in.json index 61a2d866597a3..54dd16a356f52 100644 --- a/planner/core/testdata/stats_suite_in.json +++ b/planner/core/testdata/stats_suite_in.json @@ -53,5 +53,38 @@ // DataSource -> Window -> Aggregation. "select count(tmp.a_sum) from (select t1.a as a, t1.b as b, sum(a) over() as a_sum from t1) tmp group by tmp.a, tmp.b" ] + }, + { + "name": "TestCardinalityGroupCols", + "cases": [ + // DataSource -> Aggregation. + "select count(1) from t1 group by a, b", + // DataSource -> Join. + "select * from t1, t2 where t1.a = t2.a and t1.b = t2.b", + // DataSource(Range) -> Aggregation. + "select count(1) from t1 where a > 0 group by a, b", + // DataSource(Selection) -> Aggregation. + "select count(1) from t1 where b > 0 group by a, b", + // DataSource -> Projection -> Aggregation. + "select count(c3) from (select a as c1, b as c2, a+1 as c3 from t1) as tmp group by c2, c1", + // DataSource -> Apply(LeftOuterJoin) -> Aggregation. + "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b > (select t2.b from t2 where t2.a = t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + // DataSource -> Apply(LeftOuterSemiJoin) -> Aggregation. + "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b in (select t2.b from t2 where t2.a = t1.a limit 3)) as cmp from t1) tmp group by tmp.a, tmp.b", + // DataSource -> Apply(AntiLeftOuterSemiJoin) -> Aggregation. + "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b not in (select t2.b from t2 where t2.a = t1.a limit 3)) as cmp from t1) tmp group by tmp.a, tmp.b", + // DataSource -> LeftOuterJoin -> Aggregation. + "select count(1) from t1 left join t2 on t1.a = t2.a group by t1.a, t1.b", + // DataSource -> RightOuterJoin -> Aggregation. + "select count(1) from t1 right join t2 on t1.a = t2.a group by t2.a, t2.b", + // DataSource -> LeftOuterSemiJoin -> Aggregation. + "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b in (select t2.b from t2 where t2.a > t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + // DataSource -> AntiLeftOuterSemiJoin -> Aggregation. + "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b not in (select t2.b from t2 where t2.a > t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + // DataSource -> Aggregation -> Join. + "select * from t1 left join (select t2.a as a, t2.b as b, count(1) as cnt from t2 group by t2.a, t2.b) as tmp on t1.a = tmp.a and t1.b = tmp.b", + // DataSource -> Window -> Aggregation. + "select count(tmp.a_sum) from (select t1.a as a, t1.b as b, sum(a) over() as a_sum from t1) tmp group by tmp.a, tmp.b" + ] } ] diff --git a/planner/core/testdata/stats_suite_out.json b/planner/core/testdata/stats_suite_out.json index 7f1513b5ec3c2..e284758839d89 100644 --- a/planner/core/testdata/stats_suite_out.json +++ b/planner/core/testdata/stats_suite_out.json @@ -128,5 +128,158 @@ "JoinInput": "" } ] + }, + { + "Name": "TestCardinalityGroupCols", + "Cases": [ + { + "SQL": "select count(1) from t1 group by a, b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(1)->Column#4", + "└─IndexReader 4.00 root index:IndexFullScan", + " └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true" + ] + }, + { + "SQL": "select * from t1, t2 where t1.a = t2.a and t1.b = t2.b", + "Plan": [ + "MergeJoin 4.00 root inner join, left key:test.t1.a, test.t1.b, right key:test.t2.a, test.t2.b", + "├─IndexReader(Build) 9.00 root index:IndexFullScan", + "│ └─IndexFullScan 9.00 cop[tikv] table:t2, index:a(a, b) keep order:true", + "└─IndexReader(Probe) 4.00 root index:IndexFullScan", + " └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true" + ] + }, + { + "SQL": "select count(1) from t1 where a > 0 group by a, b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(1)->Column#4", + "└─IndexReader 4.00 root index:IndexRangeScan", + " └─IndexRangeScan 4.00 cop[tikv] table:t1, index:a(a, b) range:(0,+inf], keep order:true" + ] + }, + { + "SQL": "select count(1) from t1 where b > 0 group by a, b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(1)->Column#4", + "└─IndexReader 4.00 root index:Selection", + " └─Selection 4.00 cop[tikv] gt(test.t1.b, 0)", + " └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true" + ] + }, + { + "SQL": "select count(c3) from (select a as c1, b as c2, a+1 as c3 from t1) as tmp group by c2, c1", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#4)->Column#5", + "└─Projection 4.00 root test.t1.a, test.t1.b, plus(test.t1.a, 1)->Column#4", + " └─IndexReader 4.00 root index:IndexFullScan", + " └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true" + ] + }, + { + "SQL": "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b > (select t2.b from t2 where t2.a = t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#7)->Column#8", + "└─Projection 4.00 root test.t1.a, test.t1.b, gt(test.t1.b, test.t2.b)->Column#7", + " └─Apply 4.00 root CARTESIAN left outer join", + " ├─IndexReader(Build) 4.00 root index:IndexFullScan", + " │ └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true", + " └─MaxOneRow(Probe) 1.00 root ", + " └─IndexReader 2.00 root index:IndexRangeScan", + " └─IndexRangeScan 2.00 cop[tikv] table:t2, index:a(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false" + ] + }, + { + "SQL": "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b in (select t2.b from t2 where t2.a = t1.a limit 3)) as cmp from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#7)->Column#8", + "└─Apply 4.00 root left outer semi join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─IndexReader(Build) 4.00 root index:IndexFullScan", + " │ └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true", + " └─Limit(Probe) 3.00 root offset:0, count:3", + " └─IndexReader 3.00 root index:Limit", + " └─Limit 3.00 cop[tikv] offset:0, count:3", + " └─IndexRangeScan 3.00 cop[tikv] table:t2, index:a(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false" + ] + }, + { + "SQL": "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b not in (select t2.b from t2 where t2.a = t1.a limit 3)) as cmp from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "StreamAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#7)->Column#8", + "└─Apply 4.00 root anti left outer semi join, equal:[eq(test.t1.b, test.t2.b)]", + " ├─IndexReader(Build) 4.00 root index:IndexFullScan", + " │ └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true", + " └─Limit(Probe) 3.00 root offset:0, count:3", + " └─IndexReader 3.00 root index:Limit", + " └─Limit 3.00 cop[tikv] offset:0, count:3", + " └─IndexRangeScan 3.00 cop[tikv] table:t2, index:a(a, b) range: decided by [eq(test.t2.a, test.t1.a)], keep order:false" + ] + }, + { + "SQL": "select count(1) from t1 left join t2 on t1.a = t2.a group by t1.a, t1.b", + "Plan": [ + "HashAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(1)->Column#7", + "└─HashJoin 12.00 root left outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 4.00 root data:TableFullScan", + " │ └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false", + " └─TableReader(Probe) 9.00 root data:TableFullScan", + " └─TableFullScan 9.00 cop[tikv] table:t2 keep order:false" + ] + }, + { + "SQL": "select count(1) from t1 right join t2 on t1.a = t2.a group by t2.a, t2.b", + "Plan": [ + "HashAgg 9.00 root group by:test.t2.a, test.t2.b, funcs:count(1)->Column#7", + "└─HashJoin 12.00 root right outer join, equal:[eq(test.t1.a, test.t2.a)]", + " ├─TableReader(Build) 4.00 root data:TableFullScan", + " │ └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false", + " └─TableReader(Probe) 9.00 root data:TableFullScan", + " └─TableFullScan 9.00 cop[tikv] table:t2 keep order:false" + ] + }, + { + "SQL": "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b in (select t2.b from t2 where t2.a > t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "HashAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#7)->Column#8", + "└─HashJoin 4.00 root left outer semi join, equal:[eq(test.t1.b, test.t2.b)], other cond:gt(test.t2.a, test.t1.a)", + " ├─TableReader(Build) 9.00 root data:TableFullScan", + " │ └─TableFullScan 9.00 cop[tikv] table:t2 keep order:false", + " └─TableReader(Probe) 4.00 root data:TableFullScan", + " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" + ] + }, + { + "SQL": "select count(tmp.cmp) from (select t1.a as a, t1.b as b, (t1.b not in (select t2.b from t2 where t2.a > t1.a)) as cmp from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "HashAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#7)->Column#8", + "└─HashJoin 4.00 root anti left outer semi join, equal:[eq(test.t1.b, test.t2.b)], other cond:gt(test.t2.a, test.t1.a)", + " ├─TableReader(Build) 9.00 root data:TableFullScan", + " │ └─TableFullScan 9.00 cop[tikv] table:t2 keep order:false", + " └─TableReader(Probe) 4.00 root data:TableFullScan", + " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" + ] + }, + { + "SQL": "select * from t1 left join (select t2.a as a, t2.b as b, count(1) as cnt from t2 group by t2.a, t2.b) as tmp on t1.a = tmp.a and t1.b = tmp.b", + "Plan": [ + "Projection 4.00 root test.t1.a, test.t1.b, test.t2.a, test.t2.b, Column#7", + "└─MergeJoin 4.00 root left outer join, left key:test.t1.a, test.t1.b, right key:test.t2.a, test.t2.b", + " ├─StreamAgg(Build) 9.00 root group by:test.t2.a, test.t2.b, funcs:count(1)->Column#7, funcs:firstrow(test.t2.a)->test.t2.a, funcs:firstrow(test.t2.b)->test.t2.b", + " │ └─IndexReader 9.00 root index:IndexFullScan", + " │ └─IndexFullScan 9.00 cop[tikv] table:t2, index:a(a, b) keep order:true", + " └─IndexReader(Probe) 4.00 root index:IndexFullScan", + " └─IndexFullScan 4.00 cop[tikv] table:t1, index:a(a, b) keep order:true" + ] + }, + { + "SQL": "select count(tmp.a_sum) from (select t1.a as a, t1.b as b, sum(a) over() as a_sum from t1) tmp group by tmp.a, tmp.b", + "Plan": [ + "HashAgg 4.00 root group by:test.t1.a, test.t1.b, funcs:count(Column#5)->Column#6", + "└─Window 4.00 root sum(cast(test.t1.a, decimal(32,0) BINARY))->Column#5 over()", + " └─TableReader 4.00 root data:TableFullScan", + " └─TableFullScan 4.00 cop[tikv] table:t1 keep order:false" + ] + } + ] } ] diff --git a/planner/core/util.go b/planner/core/util.go index e6a4985ec783e..753445f07ee42 100644 --- a/planner/core/util.go +++ b/planner/core/util.go @@ -28,9 +28,11 @@ import ( ) // AggregateFuncExtractor visits Expr tree. -// It converts ColunmNameExpr to AggregateFuncExpr and collects AggregateFuncExpr. +// It collects AggregateFuncExpr from AST Node. type AggregateFuncExtractor struct { - inAggregateFuncExpr bool + // skipAggMap stores correlated aggregate functions which have been built in outer query, + // so extractor in sub-query will skip these aggregate functions. + skipAggMap map[*ast.AggregateFuncExpr]*expression.CorrelatedColumn // AggFuncs is the collected AggregateFuncExprs. AggFuncs []*ast.AggregateFuncExpr } @@ -38,8 +40,6 @@ type AggregateFuncExtractor struct { // Enter implements Visitor interface. func (a *AggregateFuncExtractor) Enter(n ast.Node) (ast.Node, bool) { switch n.(type) { - case *ast.AggregateFuncExpr: - a.inAggregateFuncExpr = true case *ast.SelectStmt, *ast.SetOprStmt: return n, true } @@ -50,8 +50,9 @@ func (a *AggregateFuncExtractor) Enter(n ast.Node) (ast.Node, bool) { func (a *AggregateFuncExtractor) Leave(n ast.Node) (ast.Node, bool) { switch v := n.(type) { case *ast.AggregateFuncExpr: - a.inAggregateFuncExpr = false - a.AggFuncs = append(a.AggFuncs, v) + if _, ok := a.skipAggMap[v]; !ok { + a.AggFuncs = append(a.AggFuncs, v) + } } return n, true } @@ -91,12 +92,23 @@ type logicalSchemaProducer struct { // Schema implements the Plan.Schema interface. func (s *logicalSchemaProducer) Schema() *expression.Schema { if s.schema == nil { - s.schema = expression.NewSchema() + if len(s.Children()) == 1 { + // default implementation for plans has only one child: proprgate child schema. + // multi-children plans are likely to have particular implementation. + s.schema = s.Children()[0].Schema().Clone() + } else { + s.schema = expression.NewSchema() + } } return s.schema } func (s *logicalSchemaProducer) OutputNames() types.NameSlice { + if s.names == nil && len(s.Children()) == 1 { + // default implementation for plans has only one child: proprgate child `OutputNames`. + // multi-children plans are likely to have particular implementation. + s.names = s.Children()[0].OutputNames() + } return s.names } @@ -116,10 +128,10 @@ func (s *logicalSchemaProducer) setSchemaAndNames(schema *expression.Schema, nam // inlineProjection prunes unneeded columns inline a executor. func (s *logicalSchemaProducer) inlineProjection(parentUsedCols []*expression.Column) { - used := expression.GetUsedList(parentUsedCols, s.schema) + used := expression.GetUsedList(parentUsedCols, s.Schema()) for i := len(used) - 1; i >= 0; i-- { if !used[i] { - s.schema.Columns = append(s.schema.Columns[:i], s.schema.Columns[i+1:]...) + s.schema.Columns = append(s.Schema().Columns[:i], s.Schema().Columns[i+1:]...) } } } @@ -137,14 +149,20 @@ func (s *physicalSchemaProducer) cloneWithSelf(newSelf PhysicalPlan) (*physicalS } return &physicalSchemaProducer{ basePhysicalPlan: *base, - schema: s.schema.Clone(), + schema: s.Schema().Clone(), }, nil } // Schema implements the Plan.Schema interface. func (s *physicalSchemaProducer) Schema() *expression.Schema { if s.schema == nil { - s.schema = expression.NewSchema() + if len(s.Children()) == 1 { + // default implementation for plans has only one child: proprgate child schema. + // multi-children plans are likely to have particular implementation. + s.schema = s.Children()[0].Schema().Clone() + } else { + s.schema = expression.NewSchema() + } } return s.schema } @@ -216,15 +234,22 @@ func buildLogicalJoinSchema(joinType JoinType, join LogicalPlan) *expression.Sch // BuildPhysicalJoinSchema builds the schema of PhysicalJoin from it's children's schema. func BuildPhysicalJoinSchema(joinType JoinType, join PhysicalPlan) *expression.Schema { + leftSchema := join.Children()[0].Schema() switch joinType { case SemiJoin, AntiSemiJoin: - return join.Children()[0].Schema().Clone() + return leftSchema.Clone() case LeftOuterSemiJoin, AntiLeftOuterSemiJoin: - newSchema := join.Children()[0].Schema().Clone() + newSchema := leftSchema.Clone() newSchema.Append(join.Schema().Columns[join.Schema().Len()-1]) return newSchema } - return expression.MergeSchema(join.Children()[0].Schema(), join.Children()[1].Schema()) + newSchema := expression.MergeSchema(leftSchema, join.Children()[1].Schema()) + if joinType == LeftOuterJoin { + resetNotNullFlag(newSchema, leftSchema.Len(), newSchema.Len()) + } else if joinType == RightOuterJoin { + resetNotNullFlag(newSchema, 0, leftSchema.Len()) + } + return newSchema } // GetStatsInfo gets the statistics info from a physical plan tree. diff --git a/planner/memo/group.go b/planner/memo/group.go index 2d9148701f0b6..d3c7af9010e9a 100644 --- a/planner/memo/group.go +++ b/planner/memo/group.go @@ -109,7 +109,7 @@ type Group struct { // by a transformation rule batch in a certain round. ExploreMark - //hasBuiltKeyInfo indicates whether this group has called `BuildKeyInfo`. + // hasBuiltKeyInfo indicates whether this group has called `BuildKeyInfo`. // BuildKeyInfo is lazily called when a rule needs information of // unique key or maxOneRow (in LogicalProp). For each Group, we only need // to collect these information once. diff --git a/planner/memo/group_test.go b/planner/memo/group_test.go index eec9c7176ff96..7b3c86a20fb1f 100644 --- a/planner/memo/group_test.go +++ b/planner/memo/group_test.go @@ -194,7 +194,7 @@ func (impl *fakeImpl) GetCostLimit(float64, ...Implementation) float64 { return func (s *testMemoSuite) TestGetInsertGroupImpl(c *C) { g := NewGroupWithSchema(NewGroupExpr(plannercore.LogicalLimit{}.Init(s.sctx, 0)), s.schema) emptyProp := &property.PhysicalProperty{} - orderProp := &property.PhysicalProperty{Items: []property.Item{{Col: &expression.Column{}}}} + orderProp := &property.PhysicalProperty{SortItems: []property.SortItem{{Col: &expression.Column{}}}} impl := g.GetImpl(emptyProp) c.Assert(impl, IsNil) diff --git a/planner/optimize.go b/planner/optimize.go index 18f6dca5fb174..b8bac7a8c2cd8 100644 --- a/planner/optimize.go +++ b/planner/optimize.go @@ -15,6 +15,7 @@ package planner import ( "context" + "fmt" "math" "runtime/trace" "strings" @@ -37,6 +38,7 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/hint" "github.com/pingcap/tidb/util/logutil" + utilparser "github.com/pingcap/tidb/util/parser" "go.uber.org/zap" ) @@ -111,6 +113,13 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sctx.GetSessionVars().StmtCtx.AppendWarning(warn) } warns = warns[:0] + for name, val := range stmtHints.SetVars { + err := variable.SetStmtVar(sessVars, name, val) + if err != nil { + sctx.GetSessionVars().StmtCtx.AppendWarning(err) + } + } + bestPlan, names, _, err := optimize(ctx, sctx, node, is) if err != nil { return nil, nil, err @@ -122,7 +131,10 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in if !ok { return bestPlan, names, nil } - bindRecord, scope := getBindRecord(sctx, stmtNode) + bindRecord, scope, err := getBindRecord(sctx, stmtNode) + if err != nil { + return nil, nil, err + } if bindRecord == nil { return bestPlan, names, nil } @@ -130,6 +142,10 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sctx.GetSessionVars().StmtCtx.AppendWarning(errors.New("sql_select_limit is set, so plan binding is not activated")) return bestPlan, names, nil } + err = setFoundInBinding(sctx, true) + if err != nil { + return nil, nil, err + } bestPlanHint := plannercore.GenHintsFromPhysicalPlan(bestPlan) if len(bindRecord.Bindings) > 0 { orgBinding := bindRecord.Bindings[0] // the first is the original binding @@ -185,10 +201,12 @@ func Optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in bestPlanAmongHints = plan } } - // 1. If there is already a evolution task, we do not need to handle it again. - // 2. If the origin binding contain `read_from_storage` hint, we should ignore the evolve task. - // 3. If the best plan contain TiFlash hint, we should ignore the evolve task. - if sctx.GetSessionVars().EvolvePlanBaselines && binding == nil && + // 1. If it is a select query. + // 2. If there is already a evolution task, we do not need to handle it again. + // 3. If the origin binding contain `read_from_storage` hint, we should ignore the evolve task. + // 4. If the best plan contain TiFlash hint, we should ignore the evolve task. + if _, ok := stmtNode.(*ast.SelectStmt); ok && + sctx.GetSessionVars().EvolvePlanBaselines && binding == nil && !originHints.ContainTableHint(plannercore.HintReadFromStorage) && !bindRecord.Bindings[0].Hint.ContainTableHint(plannercore.HintReadFromStorage) { handleEvolveTasks(ctx, sctx, bindRecord, stmtNode, bestPlanHintStr) @@ -207,7 +225,7 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in sctx.GetSessionVars().PlanColumnID = 0 hintProcessor := &hint.BlockHintProcessor{Ctx: sctx} node.Accept(hintProcessor) - builder := plannercore.NewPlanBuilder(sctx, is, hintProcessor) + builder, _ := plannercore.NewPlanBuilder(sctx, is, hintProcessor) // reset fields about rewrite sctx.GetSessionVars().RewritePhaseInfo.Reset() @@ -259,20 +277,31 @@ func optimize(ctx context.Context, sctx sessionctx.Context, node ast.Node, is in return finalPlan, names, cost, err } -func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode) (ast.StmtNode, string, string) { +func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode, specifiledDB string) (ast.StmtNode, string, string, error) { switch x := stmtNode.(type) { case *ast.ExplainStmt: + // This function is only used to find bind record. + // For some SQLs, such as `explain select * from t`, they will be entered here many times, + // but some of them do not want to obtain bind record. + // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. + // For these cases, we need return "" as normalize SQL and hash. + if len(x.Text()) == 0 { + return x.Stmt, "", "", nil + } switch x.Stmt.(type) { - case *ast.SelectStmt: - plannercore.EraseLastSemicolon(x) - normalizeExplainSQL := parser.Normalize(x.Text()) - idx := strings.Index(normalizeExplainSQL, "select") - normalizeSQL := normalizeExplainSQL[idx:] + case *ast.SelectStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: + normalizeSQL := parser.Normalize(utilparser.RestoreWithDefaultDB(x.Stmt, specifiledDB, x.Text())) + normalizeSQL = plannercore.EraseLastSemicolonInSQL(normalizeSQL) hash := parser.DigestNormalized(normalizeSQL) - return x.Stmt, normalizeSQL, hash + return x.Stmt, normalizeSQL, hash, nil case *ast.SetOprStmt: plannercore.EraseLastSemicolon(x) - normalizeExplainSQL := parser.Normalize(x.Text()) + var normalizeExplainSQL string + if specifiledDB != "" { + normalizeExplainSQL = parser.Normalize(utilparser.RestoreWithDefaultDB(x, specifiledDB, x.Text())) + } else { + normalizeExplainSQL = parser.Normalize(x.Text()) + } idx := strings.Index(normalizeExplainSQL, "select") parenthesesIdx := strings.Index(normalizeExplainSQL, "(") if parenthesesIdx != -1 && parenthesesIdx < idx { @@ -280,45 +309,47 @@ func extractSelectAndNormalizeDigest(stmtNode ast.StmtNode) (ast.StmtNode, strin } normalizeSQL := normalizeExplainSQL[idx:] hash := parser.DigestNormalized(normalizeSQL) - return x.Stmt, normalizeSQL, hash + return x.Stmt, normalizeSQL, hash, nil } - case *ast.SelectStmt, *ast.SetOprStmt: + case *ast.SelectStmt, *ast.SetOprStmt, *ast.DeleteStmt, *ast.UpdateStmt, *ast.InsertStmt: plannercore.EraseLastSemicolon(x) - normalizedSQL, hash := parser.NormalizeDigest(x.Text()) - return x, normalizedSQL, hash + // This function is only used to find bind record. + // For some SQLs, such as `explain select * from t`, they will be entered here many times, + // but some of them do not want to obtain bind record. + // The difference between them is whether len(x.Text()) is empty. They cannot be distinguished by stmt.restore. + // For these cases, we need return "" as normalize SQL and hash. + if len(x.Text()) == 0 { + return x, "", "", nil + } + normalizedSQL, hash := parser.NormalizeDigest(utilparser.RestoreWithDefaultDB(x, specifiledDB, x.Text())) + return x, normalizedSQL, hash, nil } - return nil, "", "" + return nil, "", "", nil } -func getBindRecord(ctx sessionctx.Context, stmt ast.StmtNode) (*bindinfo.BindRecord, string) { +func getBindRecord(ctx sessionctx.Context, stmt ast.StmtNode) (*bindinfo.BindRecord, string, error) { // When the domain is initializing, the bind will be nil. if ctx.Value(bindinfo.SessionBindInfoKeyType) == nil { - return nil, "" + return nil, "", nil } - stmtNode, normalizedSQL, hash := extractSelectAndNormalizeDigest(stmt) - if stmtNode == nil { - return nil, "" + stmtNode, normalizedSQL, hash, err := extractSelectAndNormalizeDigest(stmt, ctx.GetSessionVars().CurrentDB) + if err != nil || stmtNode == nil { + return nil, "", err } sessionHandle := ctx.Value(bindinfo.SessionBindInfoKeyType).(*bindinfo.SessionHandle) - bindRecord := sessionHandle.GetBindRecord(normalizedSQL, ctx.GetSessionVars().CurrentDB) - if bindRecord == nil { - bindRecord = sessionHandle.GetBindRecord(normalizedSQL, "") - } + bindRecord := sessionHandle.GetBindRecord(normalizedSQL, "") if bindRecord != nil { if bindRecord.HasUsingBinding() { - return bindRecord, metrics.ScopeSession + return bindRecord, metrics.ScopeSession, nil } - return nil, "" + return nil, "", nil } globalHandle := domain.GetDomain(ctx).BindHandle() if globalHandle == nil { - return nil, "" + return nil, "", nil } - bindRecord = globalHandle.GetBindRecord(hash, normalizedSQL, ctx.GetSessionVars().CurrentDB) - if bindRecord == nil { - bindRecord = globalHandle.GetBindRecord(hash, normalizedSQL, "") - } - return bindRecord, metrics.ScopeGlobal + bindRecord = globalHandle.GetBindRecord(hash, normalizedSQL, "") + return bindRecord, metrics.ScopeGlobal, nil } func handleInvalidBindRecord(ctx context.Context, sctx sessionctx.Context, level string, bindRecord bindinfo.BindRecord) { @@ -336,7 +367,7 @@ func handleInvalidBindRecord(ctx context.Context, sctx sessionctx.Context, level } func handleEvolveTasks(ctx context.Context, sctx sessionctx.Context, br *bindinfo.BindRecord, stmtNode ast.StmtNode, planHint string) { - bindSQL := bindinfo.GenerateBindSQL(ctx, stmtNode, planHint) + bindSQL := bindinfo.GenerateBindSQL(ctx, stmtNode, planHint, false, br.Db) if bindSQL == "" { return } @@ -371,7 +402,7 @@ func OptimizeExecStmt(ctx context.Context, sctx sessionctx.Context, execAst *ast.ExecuteStmt, is infoschema.InfoSchema) (plannercore.Plan, error) { defer trace.StartRegion(ctx, "Optimize").End() var err error - builder := plannercore.NewPlanBuilder(sctx, is, nil) + builder, _ := plannercore.NewPlanBuilder(sctx, is, nil) p, err := builder.Build(ctx, execAst) if err != nil { return nil, err @@ -390,6 +421,7 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin } var memoryQuotaHint, useToJAHint, useCascadesHint, maxExecutionTime, forceNthPlan *ast.TableOptimizerHint var memoryQuotaHintCnt, useToJAHintCnt, useCascadesHintCnt, noIndexMergeHintCnt, readReplicaHintCnt, maxExecutionTimeCnt, forceNthPlanCnt int + setVars := make(map[string]string) for _, hint := range hints { switch hint.HintName.L { case "memory_quota": @@ -411,8 +443,30 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin case "nth_plan": forceNthPlanCnt++ forceNthPlan = hint + case "set_var": + setVarHint := hint.HintData.(ast.HintSetVar) + + // Not all session variables are permitted for use with SET_VAR + sysVar := variable.GetSysVar(setVarHint.VarName) + if sysVar == nil { + warns = append(warns, plannercore.ErrUnresolvedHintName.GenWithStackByArgs(setVarHint.VarName, hint.HintName.String())) + continue + } + if !sysVar.IsHintUpdatable { + warns = append(warns, plannercore.ErrNotHintUpdatable.GenWithStackByArgs(setVarHint.VarName)) + continue + } + // If several hints with the same variable name appear in the same statement, the first one is applied and the others are ignored with a warning + if _, ok := setVars[setVarHint.VarName]; ok { + msg := fmt.Sprintf("%s(%s=%s)", hint.HintName.String(), setVarHint.VarName, setVarHint.Value) + warns = append(warns, plannercore.ErrWarnConflictingHint.GenWithStackByArgs(msg)) + continue + } + setVars[setVarHint.VarName] = setVarHint.Value } } + stmtHints.SetVars = setVars + // Handle MEMORY_QUOTA if memoryQuotaHintCnt != 0 { if memoryQuotaHintCnt > 1 { @@ -494,6 +548,12 @@ func handleStmtHints(hints []*ast.TableOptimizerHint) (stmtHints stmtctx.StmtHin return } +func setFoundInBinding(sctx sessionctx.Context, opt bool) error { + vars := sctx.GetSessionVars() + err := vars.SetSystemVar(variable.TiDBFoundInBinding, variable.BoolToOnOff(opt)) + return err +} + func init() { plannercore.OptimizeAstNode = Optimize } diff --git a/planner/property/physical_property.go b/planner/property/physical_property.go index 1753031bd0bb5..8ddb1a6212437 100644 --- a/planner/property/physical_property.go +++ b/planner/property/physical_property.go @@ -24,16 +24,29 @@ import ( // these tasks one by one. var wholeTaskTypes = []TaskType{CopSingleReadTaskType, CopDoubleReadTaskType, RootTaskType} -// Item wraps the column and its order. -type Item struct { +// SortItem wraps the column and its order. +type SortItem struct { Col *expression.Column Desc bool } +// PartitionType is the way to partition during mpp data exchanging. +type PartitionType int + +const ( + // AnyType will not require any special partition types. + AnyType PartitionType = iota + // BroadcastType requires current task to broadcast its data. + BroadcastType + // HashType requires current task to shuffle its data according to some columns. + HashType +) + // PhysicalProperty stands for the required physical property by parents. // It contains the orders and the task types. type PhysicalProperty struct { - Items []Item + // SortItems contains the required sort attributes. + SortItems []SortItem // TaskTp means the type of task that an operator requires. // @@ -53,33 +66,61 @@ type PhysicalProperty struct { // calculated when function "HashCode()" being called. hashcode []byte - // whether need to enforce property. - Enforced bool + // indicates that whether we are allowed to add an enforcer. + CanAddEnforcer bool + + // If the partition type is hash, the data should be reshuffled by partition cols. + PartitionCols []*expression.Column + + // which types the exchange sender belongs to, only take effects when it's a mpp task. + PartitionTp PartitionType } // NewPhysicalProperty builds property from columns. func NewPhysicalProperty(taskTp TaskType, cols []*expression.Column, desc bool, expectCnt float64, enforced bool) *PhysicalProperty { return &PhysicalProperty{ - Items: ItemsFromCols(cols, desc), - TaskTp: taskTp, - ExpectedCnt: expectCnt, - Enforced: enforced, + SortItems: SortItemsFromCols(cols, desc), + TaskTp: taskTp, + ExpectedCnt: expectCnt, + CanAddEnforcer: enforced, } } -// ItemsFromCols builds property items from columns. -func ItemsFromCols(cols []*expression.Column, desc bool) []Item { - items := make([]Item, 0, len(cols)) +// SortItemsFromCols builds property items from columns. +func SortItemsFromCols(cols []*expression.Column, desc bool) []SortItem { + items := make([]SortItem, 0, len(cols)) for _, col := range cols { - items = append(items, Item{Col: col, Desc: desc}) + items = append(items, SortItem{Col: col, Desc: desc}) } return items } +// IsSubsetOf check if the keys can match the needs of partition. +func (p *PhysicalProperty) IsSubsetOf(keys []*expression.Column) []int { + if len(p.PartitionCols) > len(keys) { + return nil + } + matches := make([]int, 0, len(keys)) + for _, partCol := range p.PartitionCols { + found := false + for i, key := range keys { + if partCol.Equal(nil, key) { + found = true + matches = append(matches, i) + break + } + } + if !found { + return nil + } + } + return matches +} + // AllColsFromSchema checks whether all the columns needed by this physical // property can be found in the given schema. func (p *PhysicalProperty) AllColsFromSchema(schema *expression.Schema) bool { - for _, col := range p.Items { + for _, col := range p.SortItems { if schema.ColumnIndex(col.Col) == -1 { return false } @@ -87,9 +128,9 @@ func (p *PhysicalProperty) AllColsFromSchema(schema *expression.Schema) bool { return true } -// IsFlashOnlyProp return true if this physical property is only allowed to generate flash related task -func (p *PhysicalProperty) IsFlashOnlyProp() bool { - return p.TaskTp == CopTiFlashLocalReadTaskType || p.TaskTp == CopTiFlashGlobalReadTaskType +// IsFlashProp return true if this physical property is only allowed to generate flash related task +func (p *PhysicalProperty) IsFlashProp() bool { + return p.TaskTp == CopTiFlashLocalReadTaskType || p.TaskTp == CopTiFlashGlobalReadTaskType || p.TaskTp == MppTaskType } // GetAllPossibleChildTaskTypes enumrates the possible types of tasks for children. @@ -103,11 +144,11 @@ func (p *PhysicalProperty) GetAllPossibleChildTaskTypes() []TaskType { // IsPrefix checks whether the order property is the prefix of another. func (p *PhysicalProperty) IsPrefix(prop *PhysicalProperty) bool { - if len(p.Items) > len(prop.Items) { + if len(p.SortItems) > len(prop.SortItems) { return false } - for i := range p.Items { - if !p.Items[i].Col.Equal(nil, prop.Items[i].Col) || p.Items[i].Desc != prop.Items[i].Desc { + for i := range p.SortItems { + if !p.SortItems[i].Col.Equal(nil, prop.SortItems[i].Col) || p.SortItems[i].Desc != prop.SortItems[i].Desc { return false } } @@ -116,7 +157,7 @@ func (p *PhysicalProperty) IsPrefix(prop *PhysicalProperty) bool { // IsEmpty checks whether the order property is empty. func (p *PhysicalProperty) IsEmpty() bool { - return len(p.Items) == 0 + return len(p.SortItems) == 0 } // HashCode calculates hash code for a PhysicalProperty object. @@ -124,16 +165,16 @@ func (p *PhysicalProperty) HashCode() []byte { if p.hashcode != nil { return p.hashcode } - hashcodeSize := 8 + 8 + 8 + (16+8)*len(p.Items) + 8 + hashcodeSize := 8 + 8 + 8 + (16+8)*len(p.SortItems) + 8 p.hashcode = make([]byte, 0, hashcodeSize) - if p.Enforced { + if p.CanAddEnforcer { p.hashcode = codec.EncodeInt(p.hashcode, 1) } else { p.hashcode = codec.EncodeInt(p.hashcode, 0) } p.hashcode = codec.EncodeInt(p.hashcode, int64(p.TaskTp)) p.hashcode = codec.EncodeFloat(p.hashcode, p.ExpectedCnt) - for _, item := range p.Items { + for _, item := range p.SortItems { p.hashcode = append(p.hashcode, item.Col.HashCode(nil)...) if item.Desc { p.hashcode = codec.EncodeInt(p.hashcode, 1) @@ -141,36 +182,42 @@ func (p *PhysicalProperty) HashCode() []byte { p.hashcode = codec.EncodeInt(p.hashcode, 0) } } + if p.TaskTp == MppTaskType { + p.hashcode = codec.EncodeInt(p.hashcode, int64(p.PartitionTp)) + for _, col := range p.PartitionCols { + p.hashcode = append(p.hashcode, col.HashCode(nil)...) + } + } return p.hashcode } // String implements fmt.Stringer interface. Just for test. func (p *PhysicalProperty) String() string { - return fmt.Sprintf("Prop{cols: %v, TaskTp: %s, expectedCount: %v}", p.Items, p.TaskTp, p.ExpectedCnt) + return fmt.Sprintf("Prop{cols: %v, TaskTp: %s, expectedCount: %v}", p.SortItems, p.TaskTp, p.ExpectedCnt) } -// Clone returns a copy of PhysicalProperty. Currently, this function is only used to build new -// required property for children plan in `exhaustPhysicalPlans`, so we don't copy `Enforced` field -// because if `Enforced` is true, the `Items` must be empty now, this makes `Enforced` meaningless -// for children nodes. -func (p *PhysicalProperty) Clone() *PhysicalProperty { +// CloneEssentialFields returns a copy of PhysicalProperty. We only copy the essential fields that really indicate the +// property, specifically, `CanAddEnforcer` should not be included. +func (p *PhysicalProperty) CloneEssentialFields() *PhysicalProperty { prop := &PhysicalProperty{ - Items: p.Items, - TaskTp: p.TaskTp, - ExpectedCnt: p.ExpectedCnt, + SortItems: p.SortItems, + TaskTp: p.TaskTp, + ExpectedCnt: p.ExpectedCnt, + PartitionTp: p.PartitionTp, + PartitionCols: p.PartitionCols, } return prop } // AllSameOrder checks if all the items have same order. func (p *PhysicalProperty) AllSameOrder() (bool, bool) { - if len(p.Items) == 0 { + if len(p.SortItems) == 0 { return true, false } - for i := 1; i < len(p.Items); i++ { - if p.Items[i].Desc != p.Items[i-1].Desc { + for i := 1; i < len(p.SortItems); i++ { + if p.SortItems[i].Desc != p.SortItems[i-1].Desc { return false, false } } - return true, p.Items[0].Desc + return true, p.SortItems[0].Desc } diff --git a/planner/property/task_type.go b/planner/property/task_type.go index 3f91509ca710b..3e60947f4b02d 100644 --- a/planner/property/task_type.go +++ b/planner/property/task_type.go @@ -38,6 +38,9 @@ const ( // type is CopTiFlashGlobalReadTaskType, all its children prop's task type is // CopTiFlashGlobalReadTaskType CopTiFlashGlobalReadTaskType + + // MppTaskType stands for task that would run on Mpp nodes, currently meaning the tiflash node. + MppTaskType ) // String implements fmt.Stringer interface. @@ -53,6 +56,8 @@ func (t TaskType) String() string { return "copTiFlashLocalReadTask" case CopTiFlashGlobalReadTaskType: return "copTiFlashGlobalReadTask" + case MppTaskType: + return "mppTask" } return "UnknownTaskType" } diff --git a/plugin/errors.go b/plugin/errors.go index a0f4a792f89d3..c310fa4e6be7e 100644 --- a/plugin/errors.go +++ b/plugin/errors.go @@ -14,16 +14,16 @@ package plugin import ( - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) var ( - errInvalidPluginID = terror.ClassPlugin.NewStd(errno.ErrInvalidPluginID) - errInvalidPluginManifest = terror.ClassPlugin.NewStd(errno.ErrInvalidPluginManifest) - errInvalidPluginName = terror.ClassPlugin.NewStd(errno.ErrInvalidPluginName) - errInvalidPluginVersion = terror.ClassPlugin.NewStd(errno.ErrInvalidPluginVersion) - errDuplicatePlugin = terror.ClassPlugin.NewStd(errno.ErrDuplicatePlugin) - errInvalidPluginSysVarName = terror.ClassPlugin.NewStd(errno.ErrInvalidPluginSysVarName) - errRequireVersionCheckFail = terror.ClassPlugin.NewStd(errno.ErrRequireVersionCheckFail) + errInvalidPluginID = dbterror.ClassPlugin.NewStd(errno.ErrInvalidPluginID) + errInvalidPluginManifest = dbterror.ClassPlugin.NewStd(errno.ErrInvalidPluginManifest) + errInvalidPluginName = dbterror.ClassPlugin.NewStd(errno.ErrInvalidPluginName) + errInvalidPluginVersion = dbterror.ClassPlugin.NewStd(errno.ErrInvalidPluginVersion) + errDuplicatePlugin = dbterror.ClassPlugin.NewStd(errno.ErrDuplicatePlugin) + errInvalidPluginSysVarName = dbterror.ClassPlugin.NewStd(errno.ErrInvalidPluginSysVarName) + errRequireVersionCheckFail = dbterror.ClassPlugin.NewStd(errno.ErrRequireVersionCheckFail) ) diff --git a/plugin/spi_test.go b/plugin/spi_test.go index efdd8b53802cb..e619f9492a1bd 100644 --- a/plugin/spi_test.go +++ b/plugin/spi_test.go @@ -41,7 +41,10 @@ func TestExportManifest(t *testing.T) { }, } exported := plugin.ExportManifest(manifest) - exported.OnInit(context.Background(), exported) + err := exported.OnInit(context.Background(), exported) + if err != nil { + t.Fatal(err) + } audit := plugin.DeclareAuditManifest(exported) audit.OnGeneralEvent(context.Background(), nil, plugin.Log, "QUERY") if !callRecorder.NotifyEventCalled || !callRecorder.OnInitCalled { diff --git a/privilege/privileges/cache.go b/privilege/privileges/cache.go index e297137db36ec..96580f26d49d7 100644 --- a/privilege/privileges/cache.go +++ b/privilege/privileges/cache.go @@ -48,6 +48,23 @@ var ( const globalDBVisible = mysql.CreatePriv | mysql.SelectPriv | mysql.InsertPriv | mysql.UpdatePriv | mysql.DeletePriv | mysql.ShowDBPriv | mysql.DropPriv | mysql.AlterPriv | mysql.IndexPriv | mysql.CreateViewPriv | mysql.ShowViewPriv | mysql.GrantPriv | mysql.TriggerPriv | mysql.ReferencesPriv | mysql.ExecutePriv +const ( + sqlLoadRoleGraph = "SELECT HIGH_PRIORITY FROM_USER, FROM_HOST, TO_USER, TO_HOST FROM mysql.role_edges" + sqlLoadGlobalPrivTable = "SELECT HIGH_PRIORITY Host,User,Priv FROM mysql.global_priv" + sqlLoadDBTable = "SELECT HIGH_PRIORITY Host,DB,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,Index_priv,Alter_priv,Execute_priv,Create_view_priv,Show_view_priv FROM mysql.db ORDER BY host, db, user" + sqlLoadTablePrivTable = "SELECT HIGH_PRIORITY Host,DB,User,Table_name,Grantor,Timestamp,Table_priv,Column_priv FROM mysql.tables_priv" + sqlLoadColumnsPrivTable = "SELECT HIGH_PRIORITY Host,DB,User,Table_name,Column_name,Timestamp,Column_priv FROM mysql.columns_priv" + sqlLoadDefaultRoles = "SELECT HIGH_PRIORITY HOST, USER, DEFAULT_ROLE_HOST, DEFAULT_ROLE_USER FROM mysql.default_roles" + // list of privileges from mysql.Priv2UserCol + sqlLoadUserTable = `SELECT HIGH_PRIORITY Host,User,authentication_string, + Create_priv, Select_priv, Insert_priv, Update_priv, Delete_priv, Show_db_priv, Super_priv, + Create_user_priv,Create_tablespace_priv,Trigger_priv,Drop_priv,Process_priv,Grant_priv, + References_priv,Alter_priv,Execute_priv,Index_priv,Create_view_priv,Show_view_priv, + Create_role_priv,Drop_role_priv,Create_tmp_table_priv,Lock_tables_priv,Create_routine_priv, + Alter_routine_priv,Event_priv,Shutdown_priv,Reload_priv,File_priv,Config_priv,Repl_client_priv,Repl_slave_priv, + account_locked FROM mysql.user` +) + func computePrivMask(privs []mysql.PrivilegeType) mysql.PrivilegeType { var mask mysql.PrivilegeType for _, p := range privs { @@ -348,7 +365,7 @@ func noSuchTable(err error) bool { // LoadRoleGraph loads the mysql.role_edges table from database. func (p *MySQLPrivilege) LoadRoleGraph(ctx sessionctx.Context) error { p.RoleGraph = make(map[string]roleGraphEdgesTable) - err := p.loadTable(ctx, "select FROM_USER, FROM_HOST, TO_USER, TO_HOST from mysql.role_edges;", p.decodeRoleEdgesTable) + err := p.loadTable(ctx, sqlLoadRoleGraph, p.decodeRoleEdgesTable) if err != nil { return errors.Trace(err) } @@ -357,12 +374,7 @@ func (p *MySQLPrivilege) LoadRoleGraph(ctx sessionctx.Context) error { // LoadUserTable loads the mysql.user table from database. func (p *MySQLPrivilege) LoadUserTable(ctx sessionctx.Context) error { - userPrivCols := make([]string, 0, len(mysql.Priv2UserCol)) - for _, v := range mysql.Priv2UserCol { - userPrivCols = append(userPrivCols, v) - } - query := fmt.Sprintf("select HIGH_PRIORITY Host,User,authentication_string,%s,account_locked from mysql.user;", strings.Join(userPrivCols, ", ")) - err := p.loadTable(ctx, query, p.decodeUserTableRow) + err := p.loadTable(ctx, sqlLoadUserTable, p.decodeUserTableRow) if err != nil { return errors.Trace(err) } @@ -468,12 +480,12 @@ func (p MySQLPrivilege) SortUserTable() { // LoadGlobalPrivTable loads the mysql.global_priv table from database. func (p *MySQLPrivilege) LoadGlobalPrivTable(ctx sessionctx.Context) error { - return p.loadTable(ctx, "select HIGH_PRIORITY Host,User,Priv from mysql.global_priv", p.decodeGlobalPrivTableRow) + return p.loadTable(ctx, sqlLoadGlobalPrivTable, p.decodeGlobalPrivTableRow) } // LoadDBTable loads the mysql.db table from database. func (p *MySQLPrivilege) LoadDBTable(ctx sessionctx.Context) error { - err := p.loadTable(ctx, "select HIGH_PRIORITY Host,DB,User,Select_priv,Insert_priv,Update_priv,Delete_priv,Create_priv,Drop_priv,Grant_priv,Index_priv,Alter_priv,Execute_priv,Create_view_priv,Show_view_priv from mysql.db order by host, db, user;", p.decodeDBTableRow) + err := p.loadTable(ctx, sqlLoadDBTable, p.decodeDBTableRow) if err != nil { return err } @@ -491,7 +503,7 @@ func (p *MySQLPrivilege) buildDBMap() { // LoadTablesPrivTable loads the mysql.tables_priv table from database. func (p *MySQLPrivilege) LoadTablesPrivTable(ctx sessionctx.Context) error { - err := p.loadTable(ctx, "select HIGH_PRIORITY Host,DB,User,Table_name,Grantor,Timestamp,Table_priv,Column_priv from mysql.tables_priv", p.decodeTablesPrivTableRow) + err := p.loadTable(ctx, sqlLoadTablePrivTable, p.decodeTablesPrivTableRow) if err != nil { return err } @@ -509,24 +521,22 @@ func (p *MySQLPrivilege) buildTablesPrivMap() { // LoadColumnsPrivTable loads the mysql.columns_priv table from database. func (p *MySQLPrivilege) LoadColumnsPrivTable(ctx sessionctx.Context) error { - return p.loadTable(ctx, "select HIGH_PRIORITY Host,DB,User,Table_name,Column_name,Timestamp,Column_priv from mysql.columns_priv", p.decodeColumnsPrivTableRow) + return p.loadTable(ctx, sqlLoadColumnsPrivTable, p.decodeColumnsPrivTableRow) } // LoadDefaultRoles loads the mysql.columns_priv table from database. func (p *MySQLPrivilege) LoadDefaultRoles(ctx sessionctx.Context) error { - return p.loadTable(ctx, "select HOST, USER, DEFAULT_ROLE_HOST, DEFAULT_ROLE_USER from mysql.default_roles", p.decodeDefaultRoleTableRow) + return p.loadTable(ctx, sqlLoadDefaultRoles, p.decodeDefaultRoleTableRow) } func (p *MySQLPrivilege) loadTable(sctx sessionctx.Context, sql string, decodeTableRow func(chunk.Row, []*ast.ResultField) error) error { ctx := context.Background() - tmp, err := sctx.(sqlexec.SQLExecutor).Execute(ctx, sql) + rs, err := sctx.(sqlexec.SQLExecutor).ExecuteInternal(ctx, sql) if err != nil { return errors.Trace(err) } - rs := tmp[0] defer terror.Call(rs.Close) - fs := rs.Fields() req := rs.NewChunk() for { @@ -587,7 +597,7 @@ func (record *baseRecord) assignUserOrHost(row chunk.Row, i int, f *ast.ResultFi record.User = row.GetString(i) case "host": record.Host = row.GetString(i) - record.patChars, record.patTypes = stringutil.CompilePattern(record.Host, '\\') + record.patChars, record.patTypes = stringutil.CompilePatternBytes(record.Host, '\\') record.hostIPNet = parseHostIPNet(record.Host) } } @@ -663,7 +673,7 @@ func (p *MySQLPrivilege) decodeDBTableRow(row chunk.Row, fs []*ast.ResultField) switch { case f.ColumnAsName.L == "db": value.DB = row.GetString(i) - value.dbPatChars, value.dbPatTypes = stringutil.CompilePattern(strings.ToUpper(value.DB), '\\') + value.dbPatChars, value.dbPatTypes = stringutil.CompilePatternBytes(strings.ToUpper(value.DB), '\\') case f.Column.Tp == mysql.TypeEnum: if row.GetEnum(i).String() != "Y" { continue @@ -830,7 +840,7 @@ func (record *columnsPrivRecord) match(user, host, db, table, col string) bool { // patternMatch matches "%" the same way as ".*" in regular expression, for example, // "10.0.%" would match "10.0.1" "10.0.1.118" ... func patternMatch(str string, patChars, patTypes []byte) bool { - return stringutil.DoMatch(str, patChars, patTypes) + return stringutil.DoMatchBytes(str, patChars, patTypes) } // connectionVerification verifies the connection have access to TiDB server. @@ -909,6 +919,10 @@ func (p *MySQLPrivilege) matchColumns(user, host, db, table, column string) *col // RequestVerification checks whether the user have sufficient privileges to do the operation. func (p *MySQLPrivilege) RequestVerification(activeRoles []*auth.RoleIdentity, user, host, db, table, column string, priv mysql.PrivilegeType) bool { + if priv == mysql.UsagePriv { + return true + } + roleList := p.FindAllRole(activeRoles) roleList = append(roleList, &auth.RoleIdentity{Username: user, Hostname: host}) diff --git a/privilege/privileges/cache_test.go b/privilege/privileges/cache_test.go index 578712fcdf3ff..937920f2dc0e6 100644 --- a/privilege/privileges/cache_test.go +++ b/privilege/privileges/cache_test.go @@ -362,7 +362,10 @@ func (s *testCacheSuite) TestRoleGraphBFS(c *C) { func (s *testCacheSuite) TestAbnormalMySQLTable(c *C) { store, err := mockstore.NewMockStore() c.Assert(err, IsNil) - defer store.Close() + defer func() { + err := store.Close() + c.Assert(err, IsNil) + }() session.SetSchemaLease(0) session.DisableStats4Test() diff --git a/privilege/privileges/errors.go b/privilege/privileges/errors.go index a1fea3ce0c897..daadc33b43c2a 100644 --- a/privilege/privileges/errors.go +++ b/privilege/privileges/errors.go @@ -14,13 +14,13 @@ package privileges import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // error definitions. var ( - errInvalidPrivilegeType = terror.ClassPrivilege.New(mysql.ErrInvalidPrivilegeType, mysql.MySQLErrName[mysql.ErrInvalidPrivilegeType]) - ErrNonexistingGrant = terror.ClassPrivilege.New(mysql.ErrNonexistingGrant, mysql.MySQLErrName[mysql.ErrNonexistingGrant]) - errLoadPrivilege = terror.ClassPrivilege.New(mysql.ErrLoadPrivilege, mysql.MySQLErrName[mysql.ErrLoadPrivilege]) + errInvalidPrivilegeType = dbterror.ClassPrivilege.NewStd(mysql.ErrInvalidPrivilegeType) + ErrNonexistingGrant = dbterror.ClassPrivilege.NewStd(mysql.ErrNonexistingGrant) + errLoadPrivilege = dbterror.ClassPrivilege.NewStd(mysql.ErrLoadPrivilege) ) diff --git a/privilege/privileges/privileges_test.go b/privilege/privileges/privileges_test.go index db2702c2955ac..fd64f4e442895 100644 --- a/privilege/privileges/privileges_test.go +++ b/privilege/privileges/privileges_test.go @@ -150,12 +150,37 @@ func (s *testPrivilegeSuite) TestCheckPointGetDBPrivilege(c *C) { se := newSession(c, s.store, s.dbName) c.Assert(se.Auth(&auth.UserIdentity{Username: "tester", Hostname: "localhost"}, nil, nil), IsTrue) mustExec(c, se, `use test;`) - _, err := se.Execute(context.Background(), `select * from test2.t where id = 1`) + _, err := se.ExecuteInternal(context.Background(), `select * from test2.t where id = 1`) c.Assert(terror.ErrorEqual(err, core.ErrTableaccessDenied), IsTrue) - _, err = se.Execute(context.Background(), "update test2.t set v = 2 where id = 1") + _, err = se.ExecuteInternal(context.Background(), "update test2.t set v = 2 where id = 1") c.Assert(terror.ErrorEqual(err, core.ErrTableaccessDenied), IsTrue) } +func (s *testPrivilegeSuite) TestIssue22946(c *C) { + rootSe := newSession(c, s.store, s.dbName) + mustExec(c, rootSe, "create database db1;") + mustExec(c, rootSe, "create database db2;") + mustExec(c, rootSe, "use test;") + mustExec(c, rootSe, "create table a(id int);") + mustExec(c, rootSe, "use db1;") + mustExec(c, rootSe, "create table a(id int primary key,name varchar(20));") + mustExec(c, rootSe, "use db2;") + mustExec(c, rootSe, "create table b(id int primary key,address varchar(50));") + mustExec(c, rootSe, "CREATE USER 'delTest'@'localhost';") + mustExec(c, rootSe, "grant all on db1.* to delTest@'localhost';") + mustExec(c, rootSe, "grant all on db2.* to delTest@'localhost';") + mustExec(c, rootSe, "grant select on test.* to delTest@'localhost';") + mustExec(c, rootSe, "flush privileges;") + + se := newSession(c, s.store, s.dbName) + c.Assert(se.Auth(&auth.UserIdentity{Username: "delTest", Hostname: "localhost"}, nil, nil), IsTrue) + _, err := se.ExecuteInternal(context.Background(), `delete from db1.a as A where exists(select 1 from db2.b as B where A.id = B.id);`) + c.Assert(err, IsNil) + mustExec(c, rootSe, "use db1;") + _, err = se.ExecuteInternal(context.Background(), "delete from test.a as A;") + c.Assert(terror.ErrorEqual(err, core.ErrPrivilegeCheckFail), IsTrue) +} + func (s *testPrivilegeSuite) TestCheckTablePrivilege(c *C) { rootSe := newSession(c, s.store, s.dbName) mustExec(c, rootSe, `CREATE USER 'test1'@'localhost';`) @@ -410,7 +435,7 @@ func (s *testPrivilegeSuite) TestDropTablePriv(c *C) { // ctx.GetSessionVars().User = "drop@localhost" c.Assert(se.Auth(&auth.UserIdentity{Username: "drop", Hostname: "localhost"}, nil, nil), IsTrue) mustExec(c, se, `SELECT * FROM todrop;`) - _, err := se.Execute(context.Background(), "DROP TABLE todrop;") + _, err := se.ExecuteInternal(context.Background(), "DROP TABLE todrop;") c.Assert(err, NotNil) se = newSession(c, s.store, s.dbName) @@ -437,7 +462,7 @@ func (s *testPrivilegeSuite) TestSetPasswdStmt(c *C) { // low privileged user trying to set password for other user (fails) c.Assert(se.Auth(&auth.UserIdentity{Username: "nobodyuser", Hostname: "localhost", AuthUsername: "nobodyuser", AuthHostname: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), "SET PASSWORD for 'superuser' = 'newpassword'") + _, err := se.ExecuteInternal(context.Background(), "SET PASSWORD for 'superuser' = 'newpassword'") c.Assert(err, NotNil) } @@ -460,7 +485,7 @@ func (s *testPrivilegeSuite) TestSelectViewSecurity(c *C) { ctx.GetSessionVars().User = &auth.UserIdentity{Username: "root", Hostname: "localhost"} mustExec(c, se, "SELECT * FROM test.selectviewsecurity") mustExec(c, se, `REVOKE Select ON test.viewsecurity FROM 'selectusr'@'localhost';`) - _, err := se.Execute(context.Background(), "select * from test.selectviewsecurity") + _, err := se.ExecuteInternal(context.Background(), "select * from test.selectviewsecurity") c.Assert(err.Error(), Equals, core.ErrViewInvalid.GenWithStackByArgs("test", "selectviewsecurity").Error()) } @@ -479,7 +504,7 @@ func (s *testPrivilegeSuite) TestRoleAdminSecurity(c *C) { mustExec(c, se, `create role r_test1@localhost`) c.Assert(se.Auth(&auth.UserIdentity{Username: "ar2", Hostname: "localhost"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `create role r_test2@localhost`) + _, err := se.ExecuteInternal(context.Background(), `create role r_test2@localhost`) c.Assert(terror.ErrorEqual(err, core.ErrSpecificAccessDenied), IsTrue) } @@ -571,10 +596,11 @@ func (s *testPrivilegeSuite) TestCheckCertBasedAuth(c *C) { util.MockPkixAttribute(util.CommonName, "tester1"), }, }, - tls.TLS_AES_128_GCM_SHA256, func(c *x509.Certificate) { + tls.TLS_AES_128_GCM_SHA256, func(cert *x509.Certificate) { var url url.URL - url.UnmarshalBinary([]byte("spiffe://mesh.pingcap.com/ns/timesh/sa/me1")) - c.URIs = append(c.URIs, &url) + err := url.UnmarshalBinary([]byte("spiffe://mesh.pingcap.com/ns/timesh/sa/me1")) + c.Assert(err, IsNil) + cert.URIs = append(cert.URIs, &url) }) c.Assert(se.Auth(&auth.UserIdentity{Username: "r1", Hostname: "localhost"}, nil, nil), IsTrue) c.Assert(se.Auth(&auth.UserIdentity{Username: "r2", Hostname: "localhost"}, nil, nil), IsTrue) @@ -763,11 +789,11 @@ func (s *testPrivilegeSuite) TestUseDB(c *C) { mustExec(c, se, "CREATE USER 'usesuper'") mustExec(c, se, "CREATE USER 'usenobody'") mustExec(c, se, "GRANT ALL ON *.* TO 'usesuper'") - //without grant option + // without grant option c.Assert(se.Auth(&auth.UserIdentity{Username: "usesuper", Hostname: "localhost", AuthUsername: "usesuper", AuthHostname: "%"}, nil, nil), IsTrue) - _, e := se.Execute(context.Background(), "GRANT SELECT ON mysql.* TO 'usenobody'") + _, e := se.ExecuteInternal(context.Background(), "GRANT SELECT ON mysql.* TO 'usenobody'") c.Assert(e, NotNil) - //with grant option + // with grant option se = newSession(c, s.store, s.dbName) // high privileged user mustExec(c, se, "GRANT ALL ON *.* TO 'usesuper' WITH GRANT OPTION") @@ -775,14 +801,14 @@ func (s *testPrivilegeSuite) TestUseDB(c *C) { mustExec(c, se, "use mysql") // low privileged user c.Assert(se.Auth(&auth.UserIdentity{Username: "usenobody", Hostname: "localhost", AuthUsername: "usenobody", AuthHostname: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), "use mysql") + _, err := se.ExecuteInternal(context.Background(), "use mysql") c.Assert(err, NotNil) // try again after privilege granted c.Assert(se.Auth(&auth.UserIdentity{Username: "usesuper", Hostname: "localhost", AuthUsername: "usesuper", AuthHostname: "%"}, nil, nil), IsTrue) mustExec(c, se, "GRANT SELECT ON mysql.* TO 'usenobody'") c.Assert(se.Auth(&auth.UserIdentity{Username: "usenobody", Hostname: "localhost", AuthUsername: "usenobody", AuthHostname: "%"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "use mysql") + _, err = se.ExecuteInternal(context.Background(), "use mysql") c.Assert(err, IsNil) // test `use db` for role. @@ -794,9 +820,9 @@ func (s *testPrivilegeSuite) TestUseDB(c *C) { mustExec(c, se, `GRANT 'app_developer' TO 'dev'@'localhost'`) mustExec(c, se, `SET DEFAULT ROLE 'app_developer' TO 'dev'@'localhost'`) c.Assert(se.Auth(&auth.UserIdentity{Username: "dev", Hostname: "localhost", AuthUsername: "dev", AuthHostname: "localhost"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "use app_db") + _, err = se.ExecuteInternal(context.Background(), "use app_db") c.Assert(err, IsNil) - _, err = se.Execute(context.Background(), "use mysql") + _, err = se.ExecuteInternal(context.Background(), "use mysql") c.Assert(err, NotNil) } @@ -808,7 +834,7 @@ func (s *testPrivilegeSuite) TestRevokePrivileges(c *C) { mustExec(c, se, "GRANT ALL ON mysql.* TO 'withoutgrant'") // Without grant option c.Assert(se.Auth(&auth.UserIdentity{Username: "hasgrant", Hostname: "localhost", AuthUsername: "hasgrant", AuthHostname: "%"}, nil, nil), IsTrue) - _, e := se.Execute(context.Background(), "REVOKE SELECT ON mysql.* FROM 'withoutgrant'") + _, e := se.ExecuteInternal(context.Background(), "REVOKE SELECT ON mysql.* FROM 'withoutgrant'") c.Assert(e, NotNil) // With grant option se = newSession(c, s.store, s.dbName) @@ -828,7 +854,7 @@ func (s *testPrivilegeSuite) TestSetGlobal(c *C) { mustExec(c, se, `set global innodb_commit_concurrency=16`) c.Assert(se.Auth(&auth.UserIdentity{Username: "setglobal_b", Hostname: "localhost"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `set global innodb_commit_concurrency=16`) + _, err := se.ExecuteInternal(context.Background(), `set global innodb_commit_concurrency=16`) c.Assert(terror.ErrorEqual(err, core.ErrSpecificAccessDenied), IsTrue) } @@ -839,9 +865,9 @@ func (s *testPrivilegeSuite) TestCreateDropUser(c *C) { // should fail c.Assert(se.Auth(&auth.UserIdentity{Username: "tcd1", Hostname: "localhost", AuthUsername: "tcd1", AuthHostname: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `CREATE USER acdc`) + _, err := se.ExecuteInternal(context.Background(), `CREATE USER acdc`) c.Assert(terror.ErrorEqual(err, core.ErrSpecificAccessDenied), IsTrue) - _, err = se.Execute(context.Background(), `DROP USER tcd2`) + _, err = se.ExecuteInternal(context.Background(), `DROP USER tcd2`) c.Assert(terror.ErrorEqual(err, core.ErrSpecificAccessDenied), IsTrue) // should pass @@ -870,7 +896,7 @@ func (s *testPrivilegeSuite) TestConfigPrivilege(c *C) { c.Assert(se.Auth(&auth.UserIdentity{Username: "tcd1", Hostname: "localhost", AuthHostname: "tcd1", AuthUsername: "%"}, nil, nil), IsTrue) mustExec(c, se, `SET CONFIG TIKV testkey="testval"`) c.Assert(se.Auth(&auth.UserIdentity{Username: "tcd2", Hostname: "localhost", AuthHostname: "tcd2", AuthUsername: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `SET CONFIG TIKV testkey="testval"`) + _, err := se.ExecuteInternal(context.Background(), `SET CONFIG TIKV testkey="testval"`) c.Assert(err, ErrorMatches, ".*you need \\(at least one of\\) the CONFIG privilege\\(s\\) for this operation") mustExec(c, se, `DROP USER tcd1, tcd2`) } @@ -882,7 +908,7 @@ func (s *testPrivilegeSuite) TestShowCreateTable(c *C) { // should fail c.Assert(se.Auth(&auth.UserIdentity{Username: "tsct1", Hostname: "localhost", AuthUsername: "tsct1", AuthHostname: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `SHOW CREATE TABLE mysql.user`) + _, err := se.ExecuteInternal(context.Background(), `SHOW CREATE TABLE mysql.user`) c.Assert(terror.ErrorEqual(err, core.ErrTableaccessDenied), IsTrue) // should pass @@ -905,25 +931,25 @@ func (s *testPrivilegeSuite) TestAnalyzeTable(c *C) { mustExec(c, se, "analyze table mysql.user") // low privileged user c.Assert(se.Auth(&auth.UserIdentity{Username: "anobody", Hostname: "localhost", AuthUsername: "anobody", AuthHostname: "%"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), "analyze table t1") + _, err := se.ExecuteInternal(context.Background(), "analyze table t1") c.Assert(terror.ErrorEqual(err, core.ErrTableaccessDenied), IsTrue) c.Assert(err.Error(), Equals, "[planner:1142]INSERT command denied to user 'anobody'@'%' for table 't1'") - _, err = se.Execute(context.Background(), "select * from t1") + _, err = se.ExecuteInternal(context.Background(), "select * from t1") c.Assert(err.Error(), Equals, "[planner:1142]SELECT command denied to user 'anobody'@'%' for table 't1'") // try again after SELECT privilege granted c.Assert(se.Auth(&auth.UserIdentity{Username: "asuper", Hostname: "localhost", AuthUsername: "asuper", AuthHostname: "%"}, nil, nil), IsTrue) mustExec(c, se, "GRANT SELECT ON atest.* TO 'anobody'") c.Assert(se.Auth(&auth.UserIdentity{Username: "anobody", Hostname: "localhost", AuthUsername: "anobody", AuthHostname: "%"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "analyze table t1") + _, err = se.ExecuteInternal(context.Background(), "analyze table t1") c.Assert(terror.ErrorEqual(err, core.ErrTableaccessDenied), IsTrue) c.Assert(err.Error(), Equals, "[planner:1142]INSERT command denied to user 'anobody'@'%' for table 't1'") // Add INSERT privilege and it should work. c.Assert(se.Auth(&auth.UserIdentity{Username: "asuper", Hostname: "localhost", AuthUsername: "asuper", AuthHostname: "%"}, nil, nil), IsTrue) mustExec(c, se, "GRANT INSERT ON atest.* TO 'anobody'") c.Assert(se.Auth(&auth.UserIdentity{Username: "anobody", Hostname: "localhost", AuthUsername: "anobody", AuthHostname: "%"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "analyze table t1") + _, err = se.ExecuteInternal(context.Background(), "analyze table t1") c.Assert(err, IsNil) } @@ -935,34 +961,34 @@ func (s *testPrivilegeSuite) TestSystemSchema(c *C) { c.Assert(se.Auth(&auth.UserIdentity{Username: "u1", Hostname: "localhost"}, nil, nil), IsTrue) mustExec(c, se, `select * from information_schema.tables`) mustExec(c, se, `select * from information_schema.key_column_usage`) - _, err := se.Execute(context.Background(), "create table information_schema.t(a int)") + _, err := se.ExecuteInternal(context.Background(), "create table information_schema.t(a int)") c.Assert(strings.Contains(err.Error(), "denied to user"), IsTrue) - _, err = se.Execute(context.Background(), "drop table information_schema.tables") + _, err = se.ExecuteInternal(context.Background(), "drop table information_schema.tables") c.Assert(strings.Contains(err.Error(), "denied to user"), IsTrue) - _, err = se.Execute(context.Background(), "update information_schema.tables set table_name = 'tst' where table_name = 'mysql'") + _, err = se.ExecuteInternal(context.Background(), "update information_schema.tables set table_name = 'tst' where table_name = 'mysql'") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) // Test performance_schema. mustExec(c, se, `select * from performance_schema.events_statements_summary_by_digest`) - _, err = se.Execute(context.Background(), "drop table performance_schema.events_statements_summary_by_digest") + _, err = se.ExecuteInternal(context.Background(), "drop table performance_schema.events_statements_summary_by_digest") c.Assert(strings.Contains(err.Error(), "denied to user"), IsTrue) - _, err = se.Execute(context.Background(), "update performance_schema.events_statements_summary_by_digest set schema_name = 'tst'") + _, err = se.ExecuteInternal(context.Background(), "update performance_schema.events_statements_summary_by_digest set schema_name = 'tst'") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) - _, err = se.Execute(context.Background(), "delete from performance_schema.events_statements_summary_by_digest") + _, err = se.ExecuteInternal(context.Background(), "delete from performance_schema.events_statements_summary_by_digest") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) - _, err = se.Execute(context.Background(), "create table performance_schema.t(a int)") + _, err = se.ExecuteInternal(context.Background(), "create table performance_schema.t(a int)") c.Assert(err, NotNil) c.Assert(strings.Contains(err.Error(), "CREATE command denied"), IsTrue, Commentf(err.Error())) // Test metric_schema. mustExec(c, se, `select * from metrics_schema.tidb_query_duration`) - _, err = se.Execute(context.Background(), "drop table metrics_schema.tidb_query_duration") + _, err = se.ExecuteInternal(context.Background(), "drop table metrics_schema.tidb_query_duration") c.Assert(strings.Contains(err.Error(), "denied to user"), IsTrue) - _, err = se.Execute(context.Background(), "update metrics_schema.tidb_query_duration set instance = 'tst'") + _, err = se.ExecuteInternal(context.Background(), "update metrics_schema.tidb_query_duration set instance = 'tst'") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) - _, err = se.Execute(context.Background(), "delete from metrics_schema.tidb_query_duration") + _, err = se.ExecuteInternal(context.Background(), "delete from metrics_schema.tidb_query_duration") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) - _, err = se.Execute(context.Background(), "create table metric_schema.t(a int)") + _, err = se.ExecuteInternal(context.Background(), "create table metric_schema.t(a int)") c.Assert(err, NotNil) c.Assert(strings.Contains(err.Error(), "CREATE command denied"), IsTrue, Commentf(err.Error())) } @@ -974,16 +1000,58 @@ func (s *testPrivilegeSuite) TestAdminCommand(c *C) { mustExec(c, se, `CREATE TABLE t(a int)`) c.Assert(se.Auth(&auth.UserIdentity{Username: "test_admin", Hostname: "localhost"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), "ADMIN SHOW DDL JOBS") + _, err := se.ExecuteInternal(context.Background(), "ADMIN SHOW DDL JOBS") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) - _, err = se.Execute(context.Background(), "ADMIN CHECK TABLE t") + _, err = se.ExecuteInternal(context.Background(), "ADMIN CHECK TABLE t") c.Assert(strings.Contains(err.Error(), "privilege check fail"), IsTrue) c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "ADMIN SHOW DDL JOBS") + _, err = se.ExecuteInternal(context.Background(), "ADMIN SHOW DDL JOBS") c.Assert(err, IsNil) } +func (s *testPrivilegeSuite) TestTableNotExistNoPermissions(c *C) { + se := newSession(c, s.store, s.dbName) + c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil), IsTrue) + mustExec(c, se, `CREATE USER 'testnotexist'@'localhost';`) + mustExec(c, se, `CREATE DATABASE dbexists`) + mustExec(c, se, `CREATE TABLE dbexists.t1 (a int)`) + + c.Assert(se.Auth(&auth.UserIdentity{Username: "testnotexist", Hostname: "localhost"}, nil, nil), IsTrue) + + tests := []struct { + stmt string + stmtType string + }{ + { + "SELECT * FROM %s.%s", + "SELECT", + }, + { + "SHOW CREATE TABLE %s.%s", + "SHOW", + }, + { + "DELETE FROM %s.%s", + "DELETE", + }, + } + + for _, t := range tests { + + _, err1 := se.ExecuteInternal(context.Background(), fmt.Sprintf(t.stmt, "dbexists", "t1")) + _, err2 := se.ExecuteInternal(context.Background(), fmt.Sprintf(t.stmt, "dbnotexists", "t1")) + + // Check the error is the same whether table exists or not. + c.Assert(terror.ErrorEqual(err1, err2), IsTrue) + + // Check it is permission denied, not not found. + c.Assert(err2.Error(), Equals, fmt.Sprintf("[planner:1142]%s command denied to user 'testnotexist'@'localhost' for table 't1'", t.stmtType)) + + } + +} + func (s *testPrivilegeSuite) TestLoadDataPrivilege(c *C) { // Create file. path := "/tmp/load_data_priv.csv" @@ -996,7 +1064,8 @@ func (s *testPrivilegeSuite) TestLoadDataPrivilege(c *C) { err = os.Remove(path) c.Assert(err, IsNil) }() - fp.WriteString("1\n") + _, err = fp.WriteString("1\n") + c.Assert(err, IsNil) se := newSession(c, s.store, s.dbName) c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil), IsTrue) @@ -1004,12 +1073,12 @@ func (s *testPrivilegeSuite) TestLoadDataPrivilege(c *C) { mustExec(c, se, `CREATE TABLE t_load(a int)`) mustExec(c, se, `GRANT SELECT on *.* to 'test_load'@'localhost'`) c.Assert(se.Auth(&auth.UserIdentity{Username: "test_load", Hostname: "localhost"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") + _, err = se.ExecuteInternal(context.Background(), "LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") c.Assert(strings.Contains(err.Error(), "INSERT command denied to user 'test_load'@'localhost' for table 't_load'"), IsTrue) c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "localhost"}, nil, nil), IsTrue) mustExec(c, se, `GRANT INSERT on *.* to 'test_load'@'localhost'`) c.Assert(se.Auth(&auth.UserIdentity{Username: "test_load", Hostname: "localhost"}, nil, nil), IsTrue) - _, err = se.Execute(context.Background(), "LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") + _, err = se.ExecuteInternal(context.Background(), "LOAD DATA LOCAL INFILE '/tmp/load_data_priv.csv' INTO TABLE t_load") c.Assert(err, IsNil) } @@ -1017,7 +1086,7 @@ func (s *testPrivilegeSuite) TestSelectIntoNoPremissions(c *C) { se := newSession(c, s.store, s.dbName) mustExec(c, se, `CREATE USER 'nofile'@'localhost';`) c.Assert(se.Auth(&auth.UserIdentity{Username: "nofile", Hostname: "localhost"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), `select 1 into outfile '/tmp/doesntmatter-no-permissions'`) + _, err := se.ExecuteInternal(context.Background(), `select 1 into outfile '/tmp/doesntmatter-no-permissions'`) message := "Access denied; you need (at least one of) the FILE privilege(s) for this operation" c.Assert(strings.Contains(err.Error(), message), IsTrue) } @@ -1040,7 +1109,7 @@ func (s *testPrivilegeSuite) TestAuthHost(c *C) { mustExec(c, se, "GRANT SELECT ON *.* TO 'test_auth_host'@'192.168.%';") c.Assert(se.Auth(&auth.UserIdentity{Username: "test_auth_host", Hostname: "192.168.0.10"}, nil, nil), IsTrue) - _, err := se.Execute(context.Background(), "create user test_auth_host_a") + _, err := se.ExecuteInternal(context.Background(), "create user test_auth_host_a") c.Assert(err, NotNil) mustExec(c, rootSe, "DROP USER 'test_auth_host'@'192.168.%';") @@ -1106,7 +1175,7 @@ func (s *testPrivilegeSuite) TestFieldList(c *C) { // Issue #14237 List fields R } func mustExec(c *C, se session.Session, sql string) { - _, err := se.Execute(context.Background(), sql) + _, err := se.ExecuteInternal(context.Background(), sql) c.Assert(err, IsNil) } diff --git a/server/conn.go b/server/conn.go index 92bbea218b82b..b95f77cc06503 100644 --- a/server/conn.go +++ b/server/conn.go @@ -52,6 +52,8 @@ import ( "time" "unsafe" + goerr "errors" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" @@ -62,15 +64,18 @@ import ( "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/plugin" + "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/arena" "github.com/pingcap/tidb/util/chunk" @@ -78,7 +83,6 @@ import ( "github.com/pingcap/tidb/util/hack" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" - "github.com/pingcap/tidb/util/sqlexec" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" ) @@ -139,16 +143,20 @@ var ( disconnectNormal = metrics.DisconnectionCounter.WithLabelValues(metrics.LblOK) disconnectByClientWithError = metrics.DisconnectionCounter.WithLabelValues(metrics.LblError) disconnectErrorUndetermined = metrics.DisconnectionCounter.WithLabelValues("undetermined") + + connIdleDurationHistogramNotInTxn = metrics.ConnIdleDurationHistogram.WithLabelValues("0") + connIdleDurationHistogramInTxn = metrics.ConnIdleDurationHistogram.WithLabelValues("1") ) // newClientConn creates a *clientConn object. func newClientConn(s *Server) *clientConn { return &clientConn{ server: s, - connectionID: atomic.AddUint32(&baseConnID, 1), + connectionID: s.globalConnID.NextID(), collation: mysql.DefaultCollationID, alloc: arena.NewAllocator(32 * 1024), status: connStatusDispatching, + lastActive: time.Now(), } } @@ -160,7 +168,7 @@ type clientConn struct { tlsConn *tls.Conn // TLS connection, nil if not TLS. server *Server // a reference of server instance. capability uint32 // client capability affects the way server handles client request. - connectionID uint32 // atomically allocated by a global variable, unique in process scope. + connectionID uint64 // atomically allocated by a global variable, unique in process scope. user string // user of the client. dbname string // default database name. salt []byte // random bytes used for authentication. @@ -173,6 +181,13 @@ type clientConn struct { status int32 // dispatching/reading/shutdown/waitshutdown lastCode uint16 // last error code collation uint8 // collation used by client, may be different from the collation used by database. + lastActive time.Time + + // mu is used for cancelling the execution of current transaction. + mu struct { + sync.RWMutex + cancelFunc context.CancelFunc + } } func (cc *clientConn) String() string { @@ -187,10 +202,10 @@ func (cc *clientConn) String() string { // the client to switch, so lets ask for mysql_native_password // https://dev.mysql.com/doc/internals/en/connection-phase-packets.html#packet-Protocol::AuthSwitchRequest func (cc *clientConn) authSwitchRequest(ctx context.Context) ([]byte, error) { - enclen := 1 + len("mysql_native_password") + 1 + len(cc.salt) + 1 + enclen := 1 + len(mysql.AuthNativePassword) + 1 + len(cc.salt) + 1 data := cc.alloc.AllocWithLen(4, enclen) - data = append(data, 0xfe) // switch request - data = append(data, []byte("mysql_native_password")...) + data = append(data, mysql.AuthSwitchRequest) // switch request + data = append(data, []byte(mysql.AuthNativePassword)...) data = append(data, byte(0x00)) // requires null data = append(data, cc.salt...) data = append(data, 0) @@ -320,7 +335,7 @@ func (cc *clientConn) writeInitialHandshake(ctx context.Context) error { data = append(data, cc.salt[8:]...) data = append(data, 0) // auth-plugin name - data = append(data, []byte("mysql_native_password")...) + data = append(data, []byte(mysql.AuthNativePassword)...) data = append(data, 0) err := cc.writePacket(data) if err != nil { @@ -382,7 +397,7 @@ func parseOldHandshakeResponseHeader(ctx context.Context, packet *handshakeRespo packet.Capability = uint32(capability) // be compatible with Protocol::HandshakeResponse41 - packet.Capability = packet.Capability | mysql.ClientProtocol41 + packet.Capability |= mysql.ClientProtocol41 offset += 2 // skip max packet size @@ -616,7 +631,7 @@ func (cc *clientConn) readOptionalSSLRequestAndHandshakeResponse(ctx context.Con } // switching from other methods should work, but not tested - if resp.AuthPlugin == "caching_sha2_password" { + if resp.AuthPlugin == mysql.AuthCachingSha2Password { resp.Auth, err = cc.authSwitchRequest(ctx) if err != nil { logutil.Logger(ctx).Warn("attempt to send auth switch request packet failed", zap.Error(err)) @@ -657,7 +672,7 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte) error { tlsStatePtr = &tlsState } var err error - cc.ctx, err = cc.server.driver.OpenCtx(uint64(cc.connectionID), cc.capability, cc.collation, cc.dbname, tlsStatePtr) + cc.ctx, err = cc.server.driver.OpenCtx(cc.connectionID, cc.capability, cc.collation, cc.dbname, tlsStatePtr) if err != nil { return err } @@ -669,13 +684,14 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte) error { if len(authData) == 0 { hasPassword = "NO" } - host, err := cc.PeerHost(hasPassword) + host, port, err := cc.PeerHost(hasPassword) if err != nil { return err } if !cc.ctx.Auth(&auth.UserIdentity{Username: cc.user, Hostname: host}, authData, cc.salt) { return errAccessDenied.FastGenByArgs(cc.user, host, hasPassword) } + cc.ctx.SetPort(port) if cc.dbname != "" { err = cc.useDB(context.Background(), cc.dbname) if err != nil { @@ -686,9 +702,9 @@ func (cc *clientConn) openSessionAndDoAuth(authData []byte) error { return nil } -func (cc *clientConn) PeerHost(hasPassword string) (host string, err error) { +func (cc *clientConn) PeerHost(hasPassword string) (host, port string, err error) { if len(cc.peerHost) > 0 { - return cc.peerHost, nil + return cc.peerHost, "", nil } host = variable.DefHostname if cc.server.isUnixSocket() { @@ -696,7 +712,6 @@ func (cc *clientConn) PeerHost(hasPassword string) (host string, err error) { return } addr := cc.bufReadConn.RemoteAddr().String() - var port string host, port, err = net.SplitHostPort(addr) if err != nil { err = errAccessDenied.GenWithStackByArgs(cc.user, addr, hasPassword) @@ -738,7 +753,10 @@ func (cc *clientConn) Run(ctx context.Context) { // The client connection would detect the events when it fails to change status // by CAS operation, it would then take some actions accordingly. for { - if !atomic.CompareAndSwapInt32(&cc.status, connStatusDispatching, connStatusReading) { + if !atomic.CompareAndSwapInt32(&cc.status, connStatusDispatching, connStatusReading) || + // The judge below will not be hit by all means, + // But keep it stayed as a reminder and for the code reference for connStatusWaitShutdown. + atomic.LoadInt32(&cc.status) == connStatusWaitShutdown { return } @@ -797,7 +815,7 @@ func (cc *clientConn) Run(ctx context.Context) { zap.String("status", cc.SessionStatusToString()), zap.Stringer("sql", getLastStmtInConn{cc}), zap.String("txn_mode", txnMode), - zap.String("err", errStrForLog(err)), + zap.String("err", errStrForLog(err, cc.ctx.GetSessionVars().EnableRedactLog)), ) err1 := cc.writeError(ctx, err) terror.Log(err1) @@ -817,8 +835,8 @@ func (cc *clientConn) ShutdownOrNotify() bool { return true } // If the client connection status is dispatching, we can't shutdown it immediately, - // so set the status to WaitShutdown as a notification, the client will detect it - // and then exit. + // so set the status to WaitShutdown as a notification, the loop in clientConn.Run + // will detect it and then exit. atomic.StoreInt32(&cc.status, connStatusWaitShutdown) return false } @@ -831,7 +849,14 @@ func queryStrForLog(query string) string { return query } -func errStrForLog(err error) string { +func errStrForLog(err error, enableRedactLog bool) string { + if enableRedactLog { + // currently, only ErrParse is considered when enableRedactLog because it may contain sensitive information like + // password or accesskey + if parser.ErrParse.Equal(err) { + return "fail to parse SQL and can't redact when enable log redaction" + } + } if kv.ErrKeyExists.Equal(err) || parser.ErrParse.Equal(err) || infoschema.ErrTableNotExists.Equal(err) { // Do not log stack for duplicated entry error. return err.Error() @@ -909,10 +934,22 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { // reset killed for each request atomic.StoreUint32(&cc.ctx.GetSessionVars().Killed, 0) }() + t := time.Now() + if (cc.ctx.Status() & mysql.ServerStatusInTrans) > 0 { + connIdleDurationHistogramInTxn.Observe(t.Sub(cc.lastActive).Seconds()) + } else { + connIdleDurationHistogramNotInTxn.Observe(t.Sub(cc.lastActive).Seconds()) + } + span := opentracing.StartSpan("server.dispatch") ctx = opentracing.ContextWithSpan(ctx, span) - t := time.Now() + var cancelFunc context.CancelFunc + ctx, cancelFunc = context.WithCancel(ctx) + cc.mu.Lock() + cc.mu.cancelFunc = cancelFunc + cc.mu.Unlock() + cc.lastPacket = data cmd := data[0] data = data[1:] @@ -949,6 +986,7 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { cc.server.releaseToken(token) span.Finish() + cc.lastActive = time.Now() }() vars := cc.ctx.GetSessionVars() @@ -1000,7 +1038,9 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { return err } return cc.writeOK(ctx) - // ComStatistics, ComProcessInfo, ComConnect, ComProcessKill, ComDebug + case mysql.ComStatistics: + return cc.writeStats(ctx) + // ComProcessInfo, ComConnect, ComProcessKill, ComDebug case mysql.ComPing: return cc.writeOK(ctx) // ComTime, ComDelayedInsert @@ -1026,10 +1066,23 @@ func (cc *clientConn) dispatch(ctx context.Context, data []byte) error { return cc.handleResetConnection(ctx) // ComEnd default: - return mysql.NewErrf(mysql.ErrUnknown, "command %d not supported now", cmd) + return mysql.NewErrf(mysql.ErrUnknown, "command %d not supported now", nil, cmd) } } +func (cc *clientConn) writeStats(ctx context.Context) error { + msg := []byte("Uptime: 0 Threads: 0 Questions: 0 Slow queries: 0 Opens: 0 Flush tables: 0 Open tables: 0 Queries per second avg: 0.000") + data := cc.alloc.AllocWithLen(4, len(msg)) + data = append(data, msg...) + + err := cc.writePacket(data) + if err != nil { + return err + } + + return cc.flush(ctx) +} + func (cc *clientConn) useDB(ctx context.Context, db string) (err error) { // if input is "use `SELECT`", mysql client just send "SELECT" // so we add `` around db. @@ -1046,7 +1099,18 @@ func (cc *clientConn) useDB(ctx context.Context, db string) (err error) { } func (cc *clientConn) flush(ctx context.Context) error { - defer trace.StartRegion(ctx, "FlushClientConn").End() + defer func() { + trace.StartRegion(ctx, "FlushClientConn").End() + if cc.ctx != nil && cc.ctx.WarningCount() > 0 { + for _, err := range cc.ctx.GetWarnings() { + var warn *errors.Error + if ok := goerr.As(err.Err, &warn); ok { + code := uint16(warn.Code()) + errno.IncrementWarning(code, cc.user, cc.peerHost) + } + } + } + }() failpoint.Inject("FakeClientConn", func() { if cc.pkt == nil { failpoint.Return(nil) @@ -1103,11 +1167,12 @@ func (cc *clientConn) writeError(ctx context.Context, e error) error { case *terror.Error: m = terror.ToSQLError(y) default: - m = mysql.NewErrf(mysql.ErrUnknown, "%s", e.Error()) + m = mysql.NewErrf(mysql.ErrUnknown, "%s", nil, e.Error()) } } cc.lastCode = m.Code + defer errno.IncrementError(m.Code, cc.user, cc.peerHost) data := cc.alloc.AllocWithLen(4, 16+len(m.Message)) data = append(data, mysql.ErrHeader) data = append(data, byte(m.Code), byte(m.Code>>8)) @@ -1252,7 +1317,9 @@ func (cc *clientConn) handleLoadData(ctx context.Context, loadDataInfo *executor if loadDataInfo == nil { return errors.New("load data info is empty") } - + if !loadDataInfo.Table.Meta().IsBaseTable() { + return errors.New("can only load data into base tables") + } err := cc.writeReq(ctx, loadDataInfo.Path) if err != nil { return err @@ -1388,6 +1455,29 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { var pointPlans []plannercore.Plan if len(stmts) > 1 { + + // The client gets to choose if it allows multi-statements, and + // probably defaults OFF. This helps prevent against SQL injection attacks + // by early terminating the first statement, and then running an entirely + // new statement. + + capabilities := cc.ctx.GetSessionVars().ClientCapability + if capabilities&mysql.ClientMultiStatements < 1 { + // The client does not have multi-statement enabled. We now need to determine + // how to handle an unsafe sitution based on the multiStmt sysvar. + switch cc.ctx.GetSessionVars().MultiStatementMode { + case variable.OffInt: + err = errMultiStatementDisabled + metrics.ExecuteErrorCounter.WithLabelValues(metrics.ExecuteErrorToLabel(err)).Inc() + return err + case variable.OnInt: + // multi statement is fully permitted, do nothing + default: + warn := stmtctx.SQLWarn{Level: stmtctx.WarnLevelWarning, Err: errMultiStatementDisabled} + parserWarns = append(parserWarns, warn) + } + } + // Only pre-build point plans for multi-statement query pointPlans, err = cc.prefetchPointPlanKeys(ctx, stmts) if err != nil { @@ -1397,14 +1487,32 @@ func (cc *clientConn) handleQuery(ctx context.Context, sql string) (err error) { if len(pointPlans) > 0 { defer cc.ctx.ClearValue(plannercore.PointPlanKey) } + var retryable bool for i, stmt := range stmts { if len(pointPlans) > 0 { // Save the point plan in Session so we don't need to build the point plan again. cc.ctx.SetValue(plannercore.PointPlanKey, plannercore.PointPlanVal{Plan: pointPlans[i]}) } - err = cc.handleStmt(ctx, stmt, parserWarns, i == len(stmts)-1) + retryable, err = cc.handleStmt(ctx, stmt, parserWarns, i == len(stmts)-1) if err != nil { - break + _, allowTiFlashFallback := cc.ctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash] + if allowTiFlashFallback && errors.ErrorEqual(err, tikv.ErrTiFlashServerTimeout) && retryable { + // When the TiFlash server seems down, we append a warning to remind the user to check the status of the TiFlash + // server and fallback to TiKV. + warns := append(parserWarns, stmtctx.SQLWarn{Level: stmtctx.WarnLevelError, Err: err}) + func() { + delete(cc.ctx.GetSessionVars().IsolationReadEngines, kv.TiFlash) + defer func() { + cc.ctx.GetSessionVars().IsolationReadEngines[kv.TiFlash] = struct{}{} + }() + _, err = cc.handleStmt(ctx, stmt, warns, i == len(stmts)-1) + }() + if err != nil { + break + } + } else { + break + } } } if err != nil { @@ -1428,7 +1536,7 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm } vars := cc.ctx.GetSessionVars() if vars.TxnCtx.IsPessimistic { - if vars.IsReadConsistencyTxn() { + if vars.IsIsolation(ast.ReadCommitted) { // TODO: to support READ-COMMITTED, we need to avoid getting new TS for each statement in the query. return nil, nil } @@ -1507,7 +1615,9 @@ func (cc *clientConn) prefetchPointPlanKeys(ctx context.Context, stmts []ast.Stm return pointPlans, nil } -func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns []stmtctx.SQLWarn, lastStmt bool) error { +// The first return value indicates whether the call of handleStmt has no side effect and can be retried. +// Currently the first return value is used to fallback to TiKV when TiFlash is down. +func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns []stmtctx.SQLWarn, lastStmt bool) (bool, error) { ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) reg := trace.StartRegion(ctx, "ExecuteStmt") rs, err := cc.ctx.ExecuteStmt(ctx, stmt) @@ -1518,7 +1628,7 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ defer terror.Call(rs.Close) } if err != nil { - return err + return true, err } if lastStmt { @@ -1532,48 +1642,58 @@ func (cc *clientConn) handleStmt(ctx context.Context, stmt ast.StmtNode, warns [ if rs != nil { connStatus := atomic.LoadInt32(&cc.status) - if connStatus == connStatusShutdown || connStatus == connStatusWaitShutdown { - return executor.ErrQueryInterrupted + if connStatus == connStatusShutdown { + return false, executor.ErrQueryInterrupted } - err = cc.writeResultset(ctx, rs, false, status, 0) + retryable, err := cc.writeResultset(ctx, rs, false, status, 0) if err != nil { - return err + return retryable, err } } else { - err = cc.handleQuerySpecial(ctx, status) + handled, err := cc.handleQuerySpecial(ctx, status) + if handled { + execStmt := cc.ctx.Value(session.ExecStmtVarKey) + if execStmt != nil { + execStmt.(*executor.ExecStmt).FinishExecuteStmt(0, err == nil, false) + } + } if err != nil { - return err + return false, err } } - return nil + return false, nil } -func (cc *clientConn) handleQuerySpecial(ctx context.Context, status uint16) error { +func (cc *clientConn) handleQuerySpecial(ctx context.Context, status uint16) (bool, error) { + handled := false loadDataInfo := cc.ctx.Value(executor.LoadDataVarKey) if loadDataInfo != nil { + handled = true defer cc.ctx.SetValue(executor.LoadDataVarKey, nil) if err := cc.handleLoadData(ctx, loadDataInfo.(*executor.LoadDataInfo)); err != nil { - return err + return handled, err } } loadStats := cc.ctx.Value(executor.LoadStatsVarKey) if loadStats != nil { + handled = true defer cc.ctx.SetValue(executor.LoadStatsVarKey, nil) if err := cc.handleLoadStats(ctx, loadStats.(*executor.LoadStatsInfo)); err != nil { - return err + return handled, err } } indexAdvise := cc.ctx.Value(executor.IndexAdviseVarKey) if indexAdvise != nil { + handled = true defer cc.ctx.SetValue(executor.IndexAdviseVarKey, nil) if err := cc.handleIndexAdvise(ctx, indexAdvise.(*executor.IndexAdviseInfo)); err != nil { - return err + return handled, err } } - return cc.writeOkWith(ctx, cc.ctx.LastMessage(), cc.ctx.AffectedRows(), cc.ctx.LastInsertID(), status, cc.ctx.WarningCount()) + return handled, cc.writeOkWith(ctx, cc.ctx.LastMessage(), cc.ctx.AffectedRows(), cc.ctx.LastInsertID(), status, cc.ctx.WarningCount()) } // handleFieldList returns the field list for a table. @@ -1608,7 +1728,10 @@ func (cc *clientConn) handleFieldList(ctx context.Context, sql string) (err erro // If binary is true, the data would be encoded in BINARY format. // serverStatus, a flag bit represents server information. // fetchSize, the desired number of rows to be fetched each time when client uses cursor. -func (cc *clientConn) writeResultset(ctx context.Context, rs ResultSet, binary bool, serverStatus uint16, fetchSize int) (runErr error) { +// retryable indicates whether the call of writeResultset has no side effect and can be retried to correct error. The call +// has side effect in cursor mode or once data has been sent to client. Currently retryable is used to fallback to TiKV when +// TiFlash is down. +func (cc *clientConn) writeResultset(ctx context.Context, rs ResultSet, binary bool, serverStatus uint16, fetchSize int) (retryable bool, runErr error) { defer func() { // close ResultSet when cursor doesn't exist r := recover() @@ -1629,13 +1752,13 @@ func (cc *clientConn) writeResultset(ctx context.Context, rs ResultSet, binary b if mysql.HasCursorExistsFlag(serverStatus) { err = cc.writeChunksWithFetchSize(ctx, rs, serverStatus, fetchSize) } else { - err = cc.writeChunks(ctx, rs, binary, serverStatus) + retryable, err = cc.writeChunks(ctx, rs, binary, serverStatus) } if err != nil { - return err + return retryable, err } - return cc.flush(ctx) + return false, cc.flush(ctx) } func (cc *clientConn) writeColumnInfo(columns []*ColumnInfo, serverStatus uint16) error { @@ -1657,10 +1780,12 @@ func (cc *clientConn) writeColumnInfo(columns []*ColumnInfo, serverStatus uint16 // writeChunks writes data from a Chunk, which filled data by a ResultSet, into a connection. // binary specifies the way to dump data. It throws any error while dumping data. // serverStatus, a flag bit represents server information -func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool, serverStatus uint16) error { +// The first return value indicates whether error occurs at the first call of ResultSet.Next. +func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool, serverStatus uint16) (bool, error) { data := cc.alloc.AllocWithLen(4, 1024) req := rs.NewChunk() gotColumnInfo := false + firstNext := true var stmtDetail *execdetails.StmtExecDetails stmtDetailRaw := ctx.Value(execdetails.StmtExecDetailKey) if stmtDetailRaw != nil { @@ -1668,18 +1793,29 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool } for { + failpoint.Inject("fetchNextErr", func(value failpoint.Value) { + switch value.(string) { + case "firstNext": + failpoint.Return(firstNext, tikv.ErrTiFlashServerTimeout) + case "secondNext": + if !firstNext { + failpoint.Return(firstNext, tikv.ErrTiFlashServerTimeout) + } + } + }) // Here server.tidbResultSet implements Next method. err := rs.Next(ctx, req) if err != nil { - return err + return firstNext, err } + firstNext = false if !gotColumnInfo { // We need to call Next before we get columns. // Otherwise, we will get incorrect columns info. columns := rs.Columns() err = cc.writeColumnInfo(columns, serverStatus) if err != nil { - return err + return false, err } gotColumnInfo = true } @@ -1698,11 +1834,11 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool } if err != nil { reg.End() - return err + return false, err } if err = cc.writePacket(data); err != nil { reg.End() - return err + return false, err } } reg.End() @@ -1710,7 +1846,7 @@ func (cc *clientConn) writeChunks(ctx context.Context, rs ResultSet, binary bool stmtDetail.WriteSQLRespDuration += time.Since(start) } } - return cc.writeEOF(serverStatus) + return false, cc.writeEOF(serverStatus) } // writeChunksWithFetchSize writes data from a Chunk, which filled data by a ResultSet, into a connection. @@ -1754,7 +1890,7 @@ func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet curRows = fetchedRows[:fetchSize] fetchedRows = fetchedRows[fetchSize:] } else { - curRows = fetchedRows[:] + curRows = fetchedRows fetchedRows = fetchedRows[:0] } rs.StoreFetchedRows(fetchedRows) @@ -1786,30 +1922,6 @@ func (cc *clientConn) writeChunksWithFetchSize(ctx context.Context, rs ResultSet return cc.writeEOF(serverStatus) } -func (cc *clientConn) writeMultiResultset(ctx context.Context, rss []ResultSet, binary bool) error { - for i, rs := range rss { - lastRs := i == len(rss)-1 - if r, ok := rs.(*tidbResultSet).recordSet.(sqlexec.MultiQueryNoDelayResult); ok { - status := r.Status() - if !lastRs { - status |= mysql.ServerMoreResultsExists - } - if err := cc.writeOkWith(ctx, r.LastMessage(), r.AffectedRows(), r.LastInsertID(), status, r.WarnCount()); err != nil { - return err - } - continue - } - status := uint16(0) - if !lastRs { - status |= mysql.ServerMoreResultsExists - } - if err := cc.writeResultset(ctx, rs, binary, status, 0); err != nil { - return err - } - } - return nil -} - func (cc *clientConn) setConn(conn net.Conn) { cc.bufReadConn = newBufferedReadConn(conn) if cc.pkt == nil { @@ -1869,7 +1981,7 @@ func (cc *clientConn) handleResetConnection(ctx context.Context) error { tlsState := cc.tlsConn.ConnectionState() tlsStatePtr = &tlsState } - cc.ctx, err = cc.server.driver.OpenCtx(uint64(cc.connectionID), cc.capability, cc.collation, cc.dbname, tlsStatePtr) + cc.ctx, err = cc.server.driver.OpenCtx(cc.connectionID, cc.capability, cc.collation, cc.dbname, tlsStatePtr) if err != nil { return err } @@ -1937,8 +2049,8 @@ func (cc getLastStmtInConn) String() string { return "ListFields " + string(data) case mysql.ComQuery, mysql.ComStmtPrepare: sql := string(hack.String(data)) - if config.RedactLogEnabled() { - sql, _ = parser.NormalizeDigest(sql) + if cc.ctx.GetSessionVars().EnableRedactLog { + sql = parser.Normalize(sql) } return queryStrForLog(sql) case mysql.ComStmtExecute, mysql.ComStmtFetch: diff --git a/server/conn_stmt.go b/server/conn_stmt.go index bcc074af5afec..de2d3a074e1cd 100644 --- a/server/conn_stmt.go +++ b/server/conn_stmt.go @@ -46,9 +46,11 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" plannercore "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/hack" @@ -61,18 +63,18 @@ func (cc *clientConn) handleStmtPrepare(ctx context.Context, sql string) error { } data := make([]byte, 4, 128) - //status ok + // status ok data = append(data, 0) - //stmt id + // stmt id data = dumpUint32(data, uint32(stmt.ID())) - //number columns + // number columns data = dumpUint16(data, uint16(len(columns))) - //number params + // number params data = dumpUint16(data, uint16(len(params))) - //filter [00] + // filter [00] data = append(data, 0) - //warning count - data = append(data, 0, 0) //TODO support warning count + // warning count + data = append(data, 0, 0) // TODO support warning count if err := cc.writePacket(data); err != nil { return err @@ -113,6 +115,11 @@ func (cc *clientConn) handleStmtPrepare(ctx context.Context, sql string) error { func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err error) { defer trace.StartRegion(ctx, "HandleStmtExecute").End() + defer func() { + if err != nil { + metrics.ExecuteErrorCounter.WithLabelValues(metrics.ExecuteErrorToLabel(err)).Inc() + } + }() if len(data) < 9 { return mysql.ErrMalformPacket } @@ -142,7 +149,7 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e case 1: useCursor = true default: - return mysql.NewErrf(mysql.ErrUnknown, "unsupported flag %d", flag) + return mysql.NewErrf(mysql.ErrUnknown, "unsupported flag %d", nil, flag) } // skip iteration-count, always 1 @@ -187,12 +194,32 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e } } ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) + retryable, err := cc.executePreparedStmtAndWriteResult(ctx, stmt, args, useCursor) + _, allowTiFlashFallback := cc.ctx.GetSessionVars().AllowFallbackToTiKV[kv.TiFlash] + if allowTiFlashFallback && err != nil && errors.ErrorEqual(err, tikv.ErrTiFlashServerTimeout) && retryable { + // When the TiFlash server seems down, we append a warning to remind the user to check the status of the TiFlash + // server and fallback to TiKV. + prevErr := err + delete(cc.ctx.GetSessionVars().IsolationReadEngines, kv.TiFlash) + defer func() { + cc.ctx.GetSessionVars().IsolationReadEngines[kv.TiFlash] = struct{}{} + }() + _, err = cc.executePreparedStmtAndWriteResult(ctx, stmt, args, useCursor) + // We append warning after the retry because `ResetContextOfStmt` may be called during the retry, which clears warnings. + cc.ctx.GetSessionVars().StmtCtx.AppendError(prevErr) + } + return err +} + +// The first return value indicates whether the call of executePreparedStmtAndWriteResult has no side effect and can be retried. +// Currently the first return value is used to fallback to TiKV when TiFlash is down. +func (cc *clientConn) executePreparedStmtAndWriteResult(ctx context.Context, stmt PreparedStatement, args []types.Datum, useCursor bool) (bool, error) { rs, err := stmt.Execute(ctx, args) if err != nil { - return errors.Annotate(err, cc.preparedStmt2String(stmtID)) + return true, errors.Annotate(err, cc.preparedStmt2String(uint32(stmt.ID()))) } if rs == nil { - return cc.writeOK(ctx) + return false, cc.writeOK(ctx) } // if the client wants to use cursor @@ -202,20 +229,20 @@ func (cc *clientConn) handleStmtExecute(ctx context.Context, data []byte) (err e stmt.StoreResultSet(rs) err = cc.writeColumnInfo(rs.Columns(), mysql.ServerStatusCursorExists) if err != nil { - return err + return false, err } if cl, ok := rs.(fetchNotifier); ok { cl.OnFetchReturned() } // explicitly flush columnInfo to client. - return cc.flush(ctx) + return false, cc.flush(ctx) } defer terror.Call(rs.Close) - err = cc.writeResultset(ctx, rs, true, 0, 0) + retryable, err := cc.writeResultset(ctx, rs, true, 0, 0) if err != nil { - return errors.Annotate(err, cc.preparedStmt2String(stmtID)) + return retryable, errors.Annotate(err, cc.preparedStmt2String(uint32(stmt.ID()))) } - return nil + return false, nil } // maxFetchSize constants @@ -247,7 +274,7 @@ func (cc *clientConn) handleStmtFetch(ctx context.Context, data []byte) (err err strconv.FormatUint(uint64(stmtID), 10), "stmt_fetch_rs"), cc.preparedStmt2String(stmtID)) } - err = cc.writeResultset(ctx, rs, true, mysql.ServerStatusCursorExists, int(fetchSize)) + _, err = cc.writeResultset(ctx, rs, true, mysql.ServerStatusCursorExists, int(fetchSize)) if err != nil { return errors.Annotate(err, cc.preparedStmt2String(stmtID)) } @@ -640,7 +667,7 @@ func (cc *clientConn) preparedStmt2String(stmtID uint32) string { if sv == nil { return "" } - if config.RedactLogEnabled() { + if sv.EnableRedactLog { return cc.preparedStmt2StringNoArgs(stmtID) } return cc.preparedStmt2StringNoArgs(stmtID) + sv.PreparedParams.String() diff --git a/server/conn_test.go b/server/conn_test.go index dd4685e7c814a..320cc3e70a019 100644 --- a/server/conn_test.go +++ b/server/conn_test.go @@ -23,13 +23,19 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/arena" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" @@ -45,7 +51,17 @@ var _ = SerialSuites(&ConnTestSuite{}) func (ts *ConnTestSuite) SetUpSuite(c *C) { testleak.BeforeTest() var err error - ts.store, err = mockstore.NewMockStore() + ts.store, err = mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c cluster.Cluster) { + mockCluster := c.(*unistore.Cluster) + _, _, region1 := mockstore.BootstrapWithSingleStore(c) + store := c.AllocID() + peer := c.AllocID() + mockCluster.AddStore(store, "tiflash0", &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) + mockCluster.AddPeer(region1, store, peer) + }), + mockstore.WithStoreType(mockstore.EmbedUnistore), + ) c.Assert(err, IsNil) ts.dom, err = session.BootstrapSession(ts.store) c.Assert(err, IsNil) @@ -557,21 +573,21 @@ func mapBelong(m1, m2 map[string]string) bool { } func (ts *ConnTestSuite) TestConnExecutionTimeout(c *C) { - //There is no underlying netCon, use failpoint to avoid panic + // There is no underlying netCon, use failpoint to avoid panic c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/FakeClientConn", "return(1)"), IsNil) c.Parallel() se, err := session.CreateSession4Test(ts.store) c.Assert(err, IsNil) - connID := 1 - se.SetConnectionID(uint64(connID)) + connID := uint64(1) + se.SetConnectionID(connID) tc := &TiDBContext{ Session: se, stmts: make(map[int]*TiDBStatement), } cc := &clientConn{ - connectionID: uint32(connID), + connectionID: connID, server: &Server{ capability: defaultCapability, }, @@ -579,8 +595,8 @@ func (ts *ConnTestSuite) TestConnExecutionTimeout(c *C) { alloc: arena.NewAllocator(32 * 1024), } srv := &Server{ - clients: map[uint32]*clientConn{ - uint32(connID): cc, + clients: map[uint64]*clientConn{ + connID: cc, }, } handle := ts.dom.ExpensiveQueryHandle().SetSessionManager(srv) @@ -675,11 +691,16 @@ func (ts *ConnTestSuite) TestPrefetchPointKeys(c *C) { tk := testkit.NewTestKitWithInit(c, ts.store) cc.ctx = &TiDBContext{Session: tk.Se} ctx := context.Background() - tk.MustExec("set @@tidb_enable_clustered_index=0") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table prefetch (a int, b int, c int, primary key (a, b))") tk.MustExec("insert prefetch values (1, 1, 1), (2, 2, 2), (3, 3, 3)") tk.MustExec("begin optimistic") tk.MustExec("update prefetch set c = c + 1 where a = 2 and b = 2") + + // enable multi-statement + capabilities := cc.ctx.GetSessionVars().ClientCapability + capabilities ^= mysql.ClientMultiStatements + cc.ctx.SetClientCapability(capabilities) query := "update prefetch set c = c + 1 where a = 1 and b = 1;" + "update prefetch set c = c + 1 where a = 2 and b = 2;" + "update prefetch set c = c + 1 where a = 3 and b = 3;" @@ -689,7 +710,7 @@ func (ts *ConnTestSuite) TestPrefetchPointKeys(c *C) { c.Assert(err, IsNil) c.Assert(txn.Valid(), IsTrue) snap := txn.GetSnapshot() - c.Assert(tikv.SnapCacheHitCount(snap), Equals, 4) + c.Assert(snap.(*tikv.KVSnapshot).SnapCacheHitCount(), Equals, 4) tk.MustExec("commit") tk.MustQuery("select * from prefetch").Check(testkit.Rows("1 1 2", "2 2 4", "3 3 4")) @@ -705,3 +726,99 @@ func (ts *ConnTestSuite) TestPrefetchPointKeys(c *C) { tk.MustExec("commit") tk.MustQuery("select * from prefetch").Check(testkit.Rows("1 1 3", "2 2 6", "3 3 5")) } + +func testGetTableByName(c *C, ctx sessionctx.Context, db, table string) table.Table { + dom := domain.GetDomain(ctx) + // Make sure the table schema is the new schema. + err := dom.Reload() + c.Assert(err, IsNil) + tbl, err := dom.InfoSchema().TableByName(model.NewCIStr(db), model.NewCIStr(table)) + c.Assert(err, IsNil) + return tbl +} + +func (ts *ConnTestSuite) TestTiFlashFallback(c *C) { + cc := &clientConn{ + alloc: arena.NewAllocator(1024), + pkt: &packetIO{ + bufWriter: bufio.NewWriter(bytes.NewBuffer(nil)), + }, + } + tk := testkit.NewTestKitWithInit(c, ts.store) + cc.ctx = &TiDBContext{Session: tk.Se, stmts: make(map[int]*TiDBStatement)} + + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int not null primary key, b int not null)") + tk.MustExec("alter table t set tiflash replica 1") + tb := testGetTableByName(c, tk.Se, "test", "t") + err := domain.GetDomain(tk.Se).DDL().UpdateTableReplicaInfo(tk.Se, tb.Meta().ID, true) + c.Assert(err, IsNil) + for i := 0; i < 50; i++ { + tk.MustExec(fmt.Sprintf("insert into t values(%v, 0)", i)) + } + tk.MustQuery("select count(*) from t").Check(testkit.Rows("50")) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) + // test COM_STMT_EXECUTE + ctx := context.Background() + tk.MustExec("set @@tidb_allow_fallback_to_tikv='tiflash'") + c.Assert(cc.handleStmtPrepare(ctx, "select sum(a) from t"), IsNil) + c.Assert(cc.handleStmtExecute(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0}), IsNil) + tk.MustQuery("show warnings").Check(testkit.Rows("Error 9012 TiFlash server timeout")) + // test COM_STMT_FETCH (cursor mode) + c.Assert(cc.handleStmtExecute(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0}), IsNil) + c.Assert(cc.handleStmtFetch(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0}), NotNil) + tk.MustExec("set @@tidb_allow_fallback_to_tikv=''") + c.Assert(cc.handleStmtExecute(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0}), NotNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0"), IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/fetchNextErr", "return(\"firstNext\")"), IsNil) + // test COM_STMT_EXECUTE (cursor mode) + tk.MustExec("set @@tidb_allow_fallback_to_tikv='tiflash'") + c.Assert(cc.handleStmtExecute(ctx, []byte{0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0}), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/server/fetchNextErr"), IsNil) + + // test that TiDB would not retry if the first execution already sends data to client + c.Assert(failpoint.Enable("github.com/pingcap/tidb/server/fetchNextErr", "return(\"secondNext\")"), IsNil) + tk.MustExec("set @@tidb_allow_fallback_to_tikv='tiflash'") + c.Assert(cc.handleQuery(ctx, "select * from t t1 join t t2 on t1.a = t2.a"), NotNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/server/fetchNextErr"), IsNil) + + // simple TiFlash query (unary + non-streaming) + tk.MustExec("set @@tidb_allow_batch_cop=0; set @@tidb_allow_mpp=0;") + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/tikvStoreSendReqResult", "return(\"requestTiFlashError\")"), IsNil) + testFallbackWork(c, tk, cc, "select sum(a) from t") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/tikvStoreSendReqResult"), IsNil) + + // TiFlash query based on batch cop (batch + streaming) + tk.MustExec("set @@tidb_allow_batch_cop=1; set @@tidb_allow_mpp=0;") + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) + testFallbackWork(c, tk, cc, "select sum(a) from t") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0"), IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/batchCopRecvTimeout", "return(true)"), IsNil) + testFallbackWork(c, tk, cc, "select sum(a) from t") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/batchCopRecvTimeout"), IsNil) + + // TiFlash MPP query (MPP + streaming) + tk.MustExec("set @@tidb_allow_batch_cop=0; set @@tidb_allow_mpp=1;") + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/mppDispatchTimeout", "return(true)"), IsNil) + testFallbackWork(c, tk, cc, "select * from t t1 join t t2 on t1.a = t2.a") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/mppDispatchTimeout"), IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/mppRecvTimeout", "return(-1)"), IsNil) + testFallbackWork(c, tk, cc, "select * from t t1 join t t2 on t1.a = t2.a") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/mppRecvTimeout"), IsNil) +} + +func testFallbackWork(c *C, tk *testkit.TestKit, cc *clientConn, sql string) { + ctx := context.Background() + tk.MustExec("set @@tidb_allow_fallback_to_tikv=''") + c.Assert(tk.QueryToErr(sql), NotNil) + tk.MustExec("set @@tidb_allow_fallback_to_tikv='tiflash'") + + c.Assert(cc.handleQuery(ctx, sql), IsNil) + tk.MustQuery("show warnings").Check(testkit.Rows("Error 9012 TiFlash server timeout")) +} diff --git a/server/driver_tidb.go b/server/driver_tidb.go index 206d73dc735fb..ae8fe74b87878 100644 --- a/server/driver_tidb.go +++ b/server/driver_tidb.go @@ -18,6 +18,7 @@ import ( "crypto/tls" "sync/atomic" + "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" @@ -25,6 +26,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/sqlexec" @@ -148,10 +150,23 @@ func (ts *TiDBStatement) Reset() { // Close implements PreparedStatement Close method. func (ts *TiDBStatement) Close() error { - //TODO close at tidb level - err := ts.ctx.DropPreparedStmt(ts.id) - if err != nil { - return err + // TODO close at tidb level + if ts.ctx.GetSessionVars().TxnCtx != nil && ts.ctx.GetSessionVars().TxnCtx.CouldRetry { + err := ts.ctx.DropPreparedStmt(ts.id) + if err != nil { + return err + } + } else { + if core.PreparedPlanCacheEnabled() { + preparedPointer := ts.ctx.GetSessionVars().PreparedStmts[ts.id] + preparedObj, ok := preparedPointer.(*core.CachedPrepareStmt) + if !ok { + return errors.Errorf("invalid CachedPrepareStmt type") + } + ts.ctx.PreparedPlanCache().Delete(core.NewPSTMTPlanCacheKey( + ts.ctx.GetSessionVars(), ts.id, preparedObj.PreparedAst.SchemaVersion)) + } + ts.ctx.GetSessionVars().RemovePreparedStmt(ts.id) } delete(ts.ctx.stmts, int(ts.id)) @@ -183,6 +198,11 @@ func (qd *TiDBDriver) OpenCtx(connID uint64, capability uint32, collation uint8, return tc, nil } +// GetWarnings implements QueryCtx GetWarnings method. +func (tc *TiDBContext) GetWarnings() []stmtctx.SQLWarn { + return tc.GetSessionVars().StmtCtx.GetWarnings() +} + // CurrentDB implements QueryCtx CurrentDB method. func (tc *TiDBContext) CurrentDB() string { return tc.currentDB @@ -378,9 +398,9 @@ func convertColumnInfo(fld *ast.ResultField) (ci *ColumnInfo) { // client such as Navicat. Now we only allow string type enter this branch. charsetDesc, err := charset.GetCharsetDesc(fld.Column.Charset) if err != nil { - ci.ColumnLength = ci.ColumnLength * 4 + ci.ColumnLength *= 4 } else { - ci.ColumnLength = ci.ColumnLength * uint32(charsetDesc.Maxlen) + ci.ColumnLength *= uint32(charsetDesc.Maxlen) } } diff --git a/server/http_handler.go b/server/http_handler.go old mode 100755 new mode 100644 index aab0456bd71bd..d2705d721e3c2 --- a/server/http_handler.go +++ b/server/http_handler.go @@ -48,9 +48,9 @@ import ( "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/gcworker" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/store/tikv/gcworker" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/table/tables" @@ -122,13 +122,13 @@ type tikvHandlerTool struct { // newTikvHandlerTool checks and prepares for tikv handler. // It would panic when any error happens. func (s *Server) newTikvHandlerTool() *tikvHandlerTool { - var tikvStore tikv.Storage + var tikvStore helper.Storage store, ok := s.driver.(*TiDBDriver) if !ok { panic("Invalid KvStore with illegal driver") } - if tikvStore, ok = store.store.(tikv.Storage); !ok { + if tikvStore, ok = store.store.(helper.Storage); !ok { panic("Invalid KvStore with illegal store") } @@ -156,8 +156,46 @@ func (t *tikvHandlerTool) getRegionIDByKey(encodedKey []byte) (uint64, error) { return keyLocation.Region.GetID(), nil } -func (t *tikvHandlerTool) getMvccByHandle(tableID, handle int64) (*mvccKV, error) { - encodedKey := tablecodec.EncodeRowKeyWithHandle(tableID, kv.IntHandle(handle)) +func (t *tikvHandlerTool) getMvccByHandle(tb table.PhysicalTable, params map[string]string, values url.Values) (*mvccKV, error) { + var handle kv.Handle + if intHandleStr, ok := params[pHandle]; ok { + if tb.Meta().IsCommonHandle { + return nil, errors.BadRequestf("For clustered index tables, please use query strings to specify the column values.") + } + intHandle, err := strconv.ParseInt(intHandleStr, 0, 64) + if err != nil { + return nil, errors.Trace(err) + } + handle = kv.IntHandle(intHandle) + } else { + tblInfo := tb.Meta() + pkIdx := tables.FindPrimaryIndex(tblInfo) + if pkIdx == nil || !tblInfo.IsCommonHandle { + return nil, errors.BadRequestf("Clustered common handle not found.") + } + cols := tblInfo.Cols() + pkCols := make([]*model.ColumnInfo, 0, len(pkIdx.Columns)) + for _, idxCol := range pkIdx.Columns { + pkCols = append(pkCols, cols[idxCol.Offset]) + } + sc := new(stmtctx.StatementContext) + sc.TimeZone = time.UTC + pkDts, err := t.formValue2DatumRow(sc, values, pkCols) + if err != nil { + return nil, errors.Trace(err) + } + tablecodec.TruncateIndexValues(tblInfo, pkIdx, pkDts) + var handleBytes []byte + handleBytes, err = codec.EncodeKey(sc, nil, pkDts...) + if err != nil { + return nil, errors.Trace(err) + } + handle, err = kv.NewCommonHandle(handleBytes) + if err != nil { + return nil, errors.Trace(err) + } + } + encodedKey := tablecodec.EncodeRecordKey(tb.RecordPrefix(), handle) data, err := t.GetMvccByEncodedKey(encodedKey) if err != nil { return nil, err @@ -357,6 +395,7 @@ func (t *tikvHandlerTool) handleMvccGetByHex(params map[string]string) (*mvccKV, // settingsHandler is the handler for list tidb server settings. type settingsHandler struct { + *tikvHandlerTool } // binlogRecover is used to recover binlog service. @@ -417,6 +456,7 @@ type valueHandler struct { const ( opTableRegions = "regions" + opTableRanges = "ranges" opTableDiskUsage = "disk-usage" opTableScatter = "scatter-table" opStopTableScatter = "stop-scatter-table" @@ -429,10 +469,11 @@ type mvccTxnHandler struct { } const ( - opMvccGetByHex = "hex" - opMvccGetByKey = "key" - opMvccGetByIdx = "idx" - opMvccGetByTxn = "txn" + opMvccGetByHex = "hex" + opMvccGetByKey = "key" + opMvccGetByIdx = "idx" + opMvccGetByTxn = "txn" + opMvccGetByClusteredKey = "cls_key" ) // ServeHTTP handles request of list a database or table's schemas. @@ -521,6 +562,34 @@ type TableRegions struct { Indices []IndexRegions `json:"indices"` } +// RangeDetail contains detail information about a particular range +type RangeDetail struct { + StartKey []byte `json:"start_key"` + EndKey []byte `json:"end_key"` + StartKeyHex string `json:"start_key_hex"` + EndKeyHex string `json:"end_key_hex"` +} + +func createRangeDetail(start, end []byte) RangeDetail { + return RangeDetail{ + StartKey: start, + EndKey: end, + StartKeyHex: hex.EncodeToString(start), + EndKeyHex: hex.EncodeToString(end), + } +} + +// TableRanges is the response data for list table's ranges. +// It contains ranges list for record and indices as well as the whole table. +type TableRanges struct { + TableName string `json:"name"` + TableID int64 `json:"id"` + Range RangeDetail `json:"table"` + Record RangeDetail `json:"record"` + Index RangeDetail `json:"index"` + Indices map[string]RangeDetail `json:"indices,omitempty"` +} + // RegionMeta contains a region's peer detail type RegionMeta struct { ID uint64 `json:"region_id"` @@ -539,10 +608,9 @@ type IndexRegions struct { // RegionDetail is the response data for get region by ID // it includes indices and records detail in current region. type RegionDetail struct { - RegionID uint64 `json:"region_id"` - StartKey []byte `json:"start_key"` - EndKey []byte `json:"end_key"` - Frames []*helper.FrameItem `json:"frames"` + RangeDetail `json:",inline"` + RegionID uint64 `json:"region_id"` + Frames []*helper.FrameItem `json:"frames"` } // addTableInRange insert a table into RegionDetail @@ -562,12 +630,9 @@ func (rt *RegionDetail) addTableInRange(dbName string, curTable *model.TableInfo rt.Frames = append(rt.Frames, f) } } - } else { - if f := r.GetIndexFrame(tID, index.ID, dbName, tName, index.Name.String()); f != nil { - rt.Frames = append(rt.Frames, f) - } + } else if f := r.GetIndexFrame(tID, index.ID, dbName, tName, index.Name.String()); f != nil { + rt.Frames = append(rt.Frames, f) } - } if pi != nil { @@ -576,10 +641,8 @@ func (rt *RegionDetail) addTableInRange(dbName string, curTable *model.TableInfo rt.Frames = append(rt.Frames, f) } } - } else { - if f := r.GetRecordFrame(tID, dbName, tName, isCommonHandle); f != nil { - rt.Frames = append(rt.Frames, f) - } + } else if f := r.GetRecordFrame(tID, dbName, tName, isCommonHandle); f != nil { + rt.Frames = append(rt.Frames, f) } } @@ -595,13 +658,6 @@ type FrameItem struct { IndexValues []string `json:"index_values,omitempty"` } -// RegionFrameRange contains a frame range info which the region covered. -type RegionFrameRange struct { - first *FrameItem // start frame of the region - last *FrameItem // end frame of the region - region *tikv.KeyLocation // the region -} - func (t *tikvHandlerTool) getRegionsMeta(regionIDs []uint64) ([]RegionMeta, error) { regions := make([]RegionMeta, len(regionIDs)) for i, regionID := range regionIDs { @@ -657,13 +713,59 @@ func (h settingsHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { if generalLog := req.Form.Get("tidb_general_log"); generalLog != "" { switch generalLog { case "0": - atomic.StoreUint32(&variable.ProcessGeneralLog, 0) + variable.ProcessGeneralLog.Store(false) + case "1": + variable.ProcessGeneralLog.Store(true) + default: + writeError(w, errors.New("illegal argument")) + return + } + } + if asyncCommit := req.Form.Get("tidb_enable_async_commit"); asyncCommit != "" { + s, err := session.CreateSession(h.Store.(kv.Storage)) + if err != nil { + writeError(w, err) + return + } + if s != nil { + defer s.Close() + } + switch asyncCommit { + case "0": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnableAsyncCommit, variable.BoolOff) + case "1": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnableAsyncCommit, variable.BoolOn) + default: + writeError(w, errors.New("illegal argument")) + return + } + if err != nil { + writeError(w, err) + return + } + } + if onePC := req.Form.Get("tidb_enable_1pc"); onePC != "" { + s, err := session.CreateSession(h.Store.(kv.Storage)) + if err != nil { + writeError(w, err) + return + } + if s != nil { + defer s.Close() + } + switch onePC { + case "0": + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnable1PC, variable.BoolOff) case "1": - atomic.StoreUint32(&variable.ProcessGeneralLog, 1) + err = s.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBEnable1PC, variable.BoolOn) default: writeError(w, errors.New("illegal argument")) return } + if err != nil { + writeError(w, err) + return + } } if ddlSlowThreshold := req.Form.Get("ddl_slow_threshold"); ddlSlowThreshold != "" { threshold, err1 := strconv.Atoi(ddlSlowThreshold) @@ -968,6 +1070,8 @@ func (h tableHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { switch h.op { case opTableRegions: h.handleRegionRequest(schema, tableVal, w, req) + case opTableRanges: + h.handleRangeRequest(schema, tableVal, w, req) case opTableDiskUsage: h.handleDiskUsageRequest(tableVal, w) case opTableScatter: @@ -1085,7 +1189,7 @@ func (h ddlResignOwnerHandler) ServeHTTP(w http.ResponseWriter, req *http.Reques } func (h tableHandler) getPDAddr() ([]string, error) { - etcd, ok := h.Store.(tikv.EtcdBackend) + etcd, ok := h.Store.(kv.EtcdBackend) if !ok { return nil, errors.New("not implemented") } @@ -1223,6 +1327,45 @@ func (h tableHandler) handleRegionRequest(schema infoschema.InfoSchema, tbl tabl writeData(w, tableRegions) } +func createTableRanges(tblID int64, tblName string, indices []*model.IndexInfo) *TableRanges { + indexPrefix := tablecodec.GenTableIndexPrefix(tblID) + recordPrefix := tablecodec.GenTableRecordPrefix(tblID) + tableEnd := tablecodec.EncodeTablePrefix(tblID + 1) + ranges := &TableRanges{ + TableName: tblName, + TableID: tblID, + Range: createRangeDetail(tablecodec.EncodeTablePrefix(tblID), tableEnd), + Record: createRangeDetail(recordPrefix, tableEnd), + Index: createRangeDetail(indexPrefix, recordPrefix), + } + if len(indices) != 0 { + indexRanges := make(map[string]RangeDetail) + for _, index := range indices { + start := tablecodec.EncodeTableIndexPrefix(tblID, index.ID) + end := tablecodec.EncodeTableIndexPrefix(tblID, index.ID+1) + indexRanges[index.Name.String()] = createRangeDetail(start, end) + } + ranges.Indices = indexRanges + } + return ranges +} + +func (h tableHandler) handleRangeRequest(schema infoschema.InfoSchema, tbl table.Table, w http.ResponseWriter, req *http.Request) { + meta := tbl.Meta() + pi := meta.GetPartitionInfo() + if pi != nil { + // Partitioned table. + var data []*TableRanges + for _, def := range pi.Definitions { + data = append(data, createTableRanges(def.ID, def.Name.String(), meta.Indices)) + } + writeData(w, data) + return + } + + writeData(w, createTableRanges(meta.ID, meta.Name.String(), meta.Indices)) +} + func (h tableHandler) getRegionsByID(tbl table.Table, id int64, name string) (*TableRegions, error) { // for record startKey, endKey := tablecodec.GetTableHandleKeyRange(id) @@ -1287,24 +1430,6 @@ func (h tableHandler) handleDiskUsageRequest(tbl table.Table, w http.ResponseWri writeData(w, stats.StorageSize) } -type hotRegion struct { - helper.TblIndex - helper.RegionMetric -} -type hotRegions []hotRegion - -func (rs hotRegions) Len() int { - return len(rs) -} - -func (rs hotRegions) Less(i, j int) bool { - return rs[i].MaxHotDegree > rs[j].MaxHotDegree || (rs[i].MaxHotDegree == rs[j].MaxHotDegree && rs[i].FlowBytes > rs[j].FlowBytes) -} - -func (rs hotRegions) Swap(i, j int) { - rs[i], rs[j] = rs[j], rs[i] -} - // ServeHTTP handles request of get region by ID. func (h regionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { // parse and check params @@ -1376,9 +1501,8 @@ func (h regionHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { // create RegionDetail from RegionFrameRange regionDetail := &RegionDetail{ - RegionID: regionID, - StartKey: region.StartKey, - EndKey: region.EndKey, + RegionID: regionID, + RangeDetail: createRangeDetail(region.StartKey, region.EndKey), } schema, err := h.schema() if err != nil { @@ -1455,7 +1579,7 @@ func (h mvccTxnHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { switch h.op { case opMvccGetByHex: data, err = h.handleMvccGetByHex(params) - case opMvccGetByIdx: + case opMvccGetByIdx, opMvccGetByKey, opMvccGetByClusteredKey: if req.URL == nil { err = errors.BadRequestf("Invalid URL") break @@ -1463,11 +1587,12 @@ func (h mvccTxnHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { values := make(url.Values) err = parseQuery(req.URL.RawQuery, values, true) if err == nil { - data, err = h.handleMvccGetByIdx(params, values) + if h.op == opMvccGetByIdx { + data, err = h.handleMvccGetByIdx(params, values) + } else { + data, err = h.handleMvccGetByKey(params, values) + } } - case opMvccGetByKey: - decode := len(req.URL.Query().Get("decode")) > 0 - data, err = h.handleMvccGetByKey(params, decode) case opMvccGetByTxn: data, err = h.handleMvccGetByTxn(params) default: @@ -1522,21 +1647,18 @@ func (h mvccTxnHandler) handleMvccGetByIdx(params map[string]string, values url. return h.getMvccByIdxValue(idx, values, idxCols, handleStr) } -func (h mvccTxnHandler) handleMvccGetByKey(params map[string]string, decodeData bool) (interface{}, error) { - handle, err := strconv.ParseInt(params[pHandle], 0, 64) - if err != nil { - return nil, errors.Trace(err) - } - - tb, err := h.getTable(params[pDBName], params[pTableName]) +func (h mvccTxnHandler) handleMvccGetByKey(params map[string]string, values url.Values) (interface{}, error) { + dbName := params[pDBName] + tableName := params[pTableName] + tb, err := h.getTable(dbName, tableName) if err != nil { return nil, errors.Trace(err) } - resp, err := h.getMvccByHandle(tb.GetPhysicalID(), handle) + resp, err := h.getMvccByHandle(tb, params, values) if err != nil { return nil, err } - if !decodeData { + if len(values.Get("decode")) == 0 { return resp, nil } colMap := make(map[int64]*types.FieldType, 3) @@ -1729,7 +1851,7 @@ func (h dbTableHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { return } // The physicalID maybe a partition ID of the partition-table. - tbl, dbInfo := schema.FindTableByPartitionID(int64(physicalID)) + tbl, dbInfo, _ := schema.FindTableByPartitionID(int64(physicalID)) if tbl == nil { writeError(w, infoschema.ErrTableNotExists.GenWithStack("Table which ID = %s does not exist.", tableID)) return diff --git a/server/http_handler_test.go b/server/http_handler_test.go index f5dcc988893f7..734549b095391 100644 --- a/server/http_handler_test.go +++ b/server/http_handler_test.go @@ -279,6 +279,25 @@ func (ts *HTTPHandlerTestSuite) TestRegionsAPIForClusterIndex(c *C) { } } +func (ts *HTTPHandlerTestSuite) TestRangesAPI(c *C) { + ts.startServer(c) + defer ts.stopServer(c) + ts.prepareData(c) + resp, err := ts.fetchStatus("/tables/tidb/t/ranges") + c.Assert(err, IsNil) + c.Assert(resp.StatusCode, Equals, http.StatusOK) + defer resp.Body.Close() + decoder := json.NewDecoder(resp.Body) + + var data TableRanges + err = decoder.Decode(&data) + c.Assert(err, IsNil) + c.Assert(data.TableName, Equals, "t") + c.Assert(len(data.Indices), Equals, 1) + _, ok := data.Indices["PRIMARY"] + c.Assert(ok, IsTrue) +} + func (ts *HTTPHandlerTestSuite) regionContainsTable(c *C, regionID uint64, tableID int64) bool { resp, err := ts.fetchStatus(fmt.Sprintf("/regions/%d", regionID)) c.Assert(err, IsNil) @@ -320,6 +339,30 @@ func (ts *HTTPHandlerTestSuite) TestListTableRegions(c *C) { c.Assert(err, IsNil) } +func (ts *HTTPHandlerTestSuite) TestListTableRanges(c *C) { + ts.startServer(c) + defer ts.stopServer(c) + ts.prepareData(c) + // Test list table regions with error + resp, err := ts.fetchStatus("/tables/fdsfds/aaa/ranges") + c.Assert(err, IsNil) + defer resp.Body.Close() + c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) + + resp, err = ts.fetchStatus("/tables/tidb/pt/ranges") + c.Assert(err, IsNil) + defer resp.Body.Close() + + var data []*TableRanges + dec := json.NewDecoder(resp.Body) + err = dec.Decode(&data) + c.Assert(err, IsNil) + c.Assert(len(data), Equals, 3) + for i, partition := range data { + c.Assert(partition.TableName, Equals, fmt.Sprintf("p%d", i)) + } +} + func (ts *HTTPHandlerTestSuite) TestGetRegionByIDWithError(c *C) { ts.startServer(c) defer ts.stopServer(c) @@ -498,10 +541,8 @@ partition by range (a) txn2.Exec("insert into tidb.pt values (666, 'def')") err = txn2.Commit() c.Assert(err, IsNil) - - dbt.mustExec("set @@tidb_enable_clustered_index = 1") dbt.mustExec("drop table if exists t") - dbt.mustExec("create table t (a double, b varchar(20), c int, primary key(a,b))") + dbt.mustExec("create table t (a double, b varchar(20), c int, primary key(a,b) clustered)") dbt.mustExec("insert into t values(1.1,'111',1),(2.2,'222',2)") } @@ -581,7 +622,6 @@ func (ts *HTTPHandlerTestSuite) TestGetTableMVCC(c *C) { resp, err = ts.fetchStatus("/mvcc/key/tidb/pt(p0)/42?decode=true") c.Assert(err, IsNil) - defer resp.Body.Close() decoder = json.NewDecoder(resp.Body) var data4 map[string]interface{} err = decoder.Decode(&data4) @@ -590,6 +630,25 @@ func (ts *HTTPHandlerTestSuite) TestGetTableMVCC(c *C) { c.Assert(data4["info"], NotNil) c.Assert(data4["data"], NotNil) c.Assert(data4["decode_error"], IsNil) + c.Assert(resp.Body.Close(), IsNil) + + resp, err = ts.fetchStatus("/mvcc/key/tidb/t/42") + c.Assert(err, IsNil) + c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) + resp, err = ts.fetchStatus("/mvcc/key/tidb/t?a=1.1") + c.Assert(err, IsNil) + c.Assert(resp.StatusCode, Equals, http.StatusBadRequest) + resp, err = ts.fetchStatus("/mvcc/key/tidb/t?a=1.1&b=111&decode=1") + c.Assert(err, IsNil) + decoder = json.NewDecoder(resp.Body) + var data5 map[string]interface{} + err = decoder.Decode(&data5) + c.Assert(err, IsNil) + c.Assert(data4["key"], NotNil) + c.Assert(data4["info"], NotNil) + c.Assert(data4["data"], NotNil) + c.Assert(data4["decode_error"], IsNil) + c.Assert(resp.Body.Close(), IsNil) } func (ts *HTTPHandlerTestSuite) TestGetMVCCNotFound(c *C) { @@ -912,7 +971,13 @@ func (ts *HTTPHandlerTestSuite) TestGetSettings(c *C) { var settings *config.Config err = decoder.Decode(&settings) c.Assert(err, IsNil) - c.Assert(settings, DeepEquals, config.GetGlobalConfig()) + var configBytes []byte + configBytes, err = json.Marshal(config.GetGlobalConfig()) + c.Assert(err, IsNil) + var settingBytes []byte + settingBytes, err = json.Marshal(settings) + c.Assert(err, IsNil) + c.Assert(settingBytes, DeepEquals, configBytes) } func (ts *HTTPHandlerTestSuite) TestGetSchema(c *C) { @@ -1045,26 +1110,46 @@ func (ts *HTTPHandlerTestSuite) TestPostSettings(c *C) { ts.startServer(c) ts.prepareData(c) defer ts.stopServer(c) + se, err := session.CreateSession(ts.store.(kv.Storage)) + c.Assert(err, IsNil) + form := make(url.Values) form.Set("log_level", "error") form.Set("tidb_general_log", "1") + form.Set("tidb_enable_async_commit", "1") + form.Set("tidb_enable_1pc", "1") resp, err := ts.formStatus("/settings", form) c.Assert(err, IsNil) c.Assert(resp.StatusCode, Equals, http.StatusOK) c.Assert(log.GetLevel(), Equals, log.ErrorLevel) c.Assert(zaplog.GetLevel(), Equals, zap.ErrorLevel) c.Assert(config.GetGlobalConfig().Log.Level, Equals, "error") - c.Assert(atomic.LoadUint32(&variable.ProcessGeneralLog), Equals, uint32(1)) + c.Assert(variable.ProcessGeneralLog.Load(), IsTrue) + val, err := variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOn) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOn) + form = make(url.Values) form.Set("log_level", "fatal") form.Set("tidb_general_log", "0") + form.Set("tidb_enable_async_commit", "0") + form.Set("tidb_enable_1pc", "0") resp, err = ts.formStatus("/settings", form) c.Assert(err, IsNil) c.Assert(resp.StatusCode, Equals, http.StatusOK) - c.Assert(atomic.LoadUint32(&variable.ProcessGeneralLog), Equals, uint32(0)) + c.Assert(variable.ProcessGeneralLog.Load(), IsFalse) c.Assert(log.GetLevel(), Equals, log.FatalLevel) c.Assert(zaplog.GetLevel(), Equals, zap.FatalLevel) c.Assert(config.GetGlobalConfig().Log.Level, Equals, "fatal") + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnableAsyncCommit) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOff) + val, err = variable.GetGlobalSystemVar(se.GetSessionVars(), variable.TiDBEnable1PC) + c.Assert(err, IsNil) + c.Assert(val, Equals, variable.BoolOff) form.Set("log_level", os.Getenv("log_level")) // test ddl_slow_threshold diff --git a/server/http_status.go b/server/http_status.go index 38f79eec2c30a..4671da3b4bdd9 100644 --- a/server/http_status.go +++ b/server/http_status.go @@ -81,7 +81,8 @@ func (s *Server) listenStatusHTTPServer() error { } logutil.BgLogger().Info("for status and metrics report", zap.String("listening on addr", s.statusAddr)) - tlsConfig, err := s.cfg.Security.ToTLSConfig() + clusterSecurity := s.cfg.Security.ClusterSecurity() + tlsConfig, err := clusterSecurity.ToTLSConfig() if err != nil { logutil.BgLogger().Error("invalid TLS config", zap.Error(err)) return errors.Trace(err) @@ -115,10 +116,10 @@ func (s *Server) startHTTPServer() { router.Handle("/stats/dump/{db}/{table}", s.newStatsHandler()).Name("StatsDump") router.Handle("/stats/dump/{db}/{table}/{snapshot}", s.newStatsHistoryHandler()).Name("StatsHistoryDump") - router.Handle("/settings", settingsHandler{}).Name("Settings") + tikvHandlerTool := s.newTikvHandlerTool() + router.Handle("/settings", settingsHandler{tikvHandlerTool}).Name("Settings") router.Handle("/binlog/recover", binlogRecover{}).Name("BinlogRecover") - tikvHandlerTool := s.newTikvHandlerTool() router.Handle("/schema", schemaHandler{tikvHandlerTool}).Name("Schema") router.Handle("/schema/{db}", schemaHandler{tikvHandlerTool}) router.Handle("/schema/{db}/{table}", schemaHandler{tikvHandlerTool}) @@ -142,6 +143,7 @@ func (s *Server) startHTTPServer() { if s.cfg.Store == "tikv" { // HTTP path for tikv. router.Handle("/tables/{db}/{table}/regions", tableHandler{tikvHandlerTool, opTableRegions}) + router.Handle("/tables/{db}/{table}/ranges", tableHandler{tikvHandlerTool, opTableRanges}) router.Handle("/tables/{db}/{table}/scatter", tableHandler{tikvHandlerTool, opTableScatter}) router.Handle("/tables/{db}/{table}/stop-scatter", tableHandler{tikvHandlerTool, opStopTableScatter}) router.Handle("/tables/{db}/{table}/disk-usage", tableHandler{tikvHandlerTool, opTableDiskUsage}) @@ -151,6 +153,7 @@ func (s *Server) startHTTPServer() { } // HTTP path for get MVCC info + router.Handle("/mvcc/key/{db}/{table}", mvccTxnHandler{tikvHandlerTool, opMvccGetByClusteredKey}) router.Handle("/mvcc/key/{db}/{table}/{handle}", mvccTxnHandler{tikvHandlerTool, opMvccGetByKey}) router.Handle("/mvcc/txn/{startTS}/{db}/{table}", mvccTxnHandler{tikvHandlerTool, opMvccGetByTxn}) router.Handle("/mvcc/hex/{hexKey}", mvccTxnHandler{tikvHandlerTool, opMvccGetByHex}) @@ -389,7 +392,13 @@ type status struct { func (s *Server) handleStatus(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") - + // If the server is in the process of shutting down, return a non-200 status. + // It is important not to return status{} as acquiring the s.ConnectionCount() + // acquires a lock that may already be held by the shutdown process. + if s.inShutdownMode { + w.WriteHeader(http.StatusInternalServerError) + return + } st := status{ Connections: s.ConnectionCount(), Version: mysql.ServerVersion, @@ -399,8 +408,8 @@ func (s *Server) handleStatus(w http.ResponseWriter, req *http.Request) { if err != nil { w.WriteHeader(http.StatusInternalServerError) logutil.BgLogger().Error("encode json failed", zap.Error(err)) - } else { - _, err = w.Write(js) - terror.Log(errors.Trace(err)) + return } + _, err = w.Write(js) + terror.Log(errors.Trace(err)) } diff --git a/server/rpc_server.go b/server/rpc_server.go index fcc9c9df8cd7b..1bb777e171ffd 100644 --- a/server/rpc_server.go +++ b/server/rpc_server.go @@ -16,6 +16,7 @@ package server import ( "context" "fmt" + "net" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/diagnosticspb" @@ -35,6 +36,7 @@ import ( "github.com/pingcap/tidb/util/memory" "go.uber.org/zap" "google.golang.org/grpc" + "google.golang.org/grpc/peer" ) // NewRPCServer creates a new rpc server. @@ -54,10 +56,10 @@ func NewRPCServer(config *config.Config, dom *domain.Domain, sm util.SessionMana } // For redirection the cop task. mocktikv.GRPCClientFactory = func() mocktikv.Client { - return tikv.NewTestRPCClient(config.Security) + return tikv.NewTestRPCClient(config.Security.ClusterSecurity()) } unistore.GRPCClientFactory = func() unistore.Client { - return tikv.NewTestRPCClient(config.Security) + return tikv.NewTestRPCClient(config.Security.ClusterSecurity()) } diagnosticspb.RegisterDiagnosticsServer(s, rpcSrv) tikvpb.RegisterTikvServer(s, rpcSrv) @@ -185,6 +187,10 @@ func (s *rpcServer) handleCopRequest(ctx context.Context, req *coprocessor.Reque } defer se.Close() + if p, ok := peer.FromContext(ctx); ok { + se.GetSessionVars().SourceAddr = *p.Addr.(*net.TCPAddr) + } + h := executor.NewCoprocessorDAGHandler(se) return h.HandleRequest(ctx, req) } diff --git a/server/server.go b/server/server.go index 8954eca113a77..3900e1d06441c 100644 --- a/server/server.go +++ b/server/server.go @@ -57,7 +57,9 @@ import ( "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/plugin" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/fastrand" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sys/linux" @@ -67,7 +69,6 @@ import ( ) var ( - baseConnID uint32 serverPID int osUser string osVersion string @@ -90,13 +91,14 @@ func init() { } var ( - errUnknownFieldType = terror.ClassServer.New(errno.ErrUnknownFieldType, errno.MySQLErrName[errno.ErrUnknownFieldType]) - errInvalidSequence = terror.ClassServer.New(errno.ErrInvalidSequence, errno.MySQLErrName[errno.ErrInvalidSequence]) - errInvalidType = terror.ClassServer.New(errno.ErrInvalidType, errno.MySQLErrName[errno.ErrInvalidType]) - errNotAllowedCommand = terror.ClassServer.New(errno.ErrNotAllowedCommand, errno.MySQLErrName[errno.ErrNotAllowedCommand]) - errAccessDenied = terror.ClassServer.New(errno.ErrAccessDenied, errno.MySQLErrName[errno.ErrAccessDenied]) - errConCount = terror.ClassServer.New(errno.ErrConCount, errno.MySQLErrName[errno.ErrConCount]) - errSecureTransportRequired = terror.ClassServer.New(errno.ErrSecureTransportRequired, errno.MySQLErrName[errno.ErrSecureTransportRequired]) + errUnknownFieldType = dbterror.ClassServer.NewStd(errno.ErrUnknownFieldType) + errInvalidSequence = dbterror.ClassServer.NewStd(errno.ErrInvalidSequence) + errInvalidType = dbterror.ClassServer.NewStd(errno.ErrInvalidType) + errNotAllowedCommand = dbterror.ClassServer.NewStd(errno.ErrNotAllowedCommand) + errAccessDenied = dbterror.ClassServer.NewStd(errno.ErrAccessDenied) + errConCount = dbterror.ClassServer.NewStd(errno.ErrConCount) + errSecureTransportRequired = dbterror.ClassServer.NewStd(errno.ErrSecureTransportRequired) + errMultiStatementDisabled = dbterror.ClassServer.NewStd(errno.ErrMultiStatementDisabled) ) // DefaultCapability is the capability of the server when it is created using the default configuration. @@ -116,14 +118,16 @@ type Server struct { socket net.Listener rwlock sync.RWMutex concurrentLimiter *TokenLimiter - clients map[uint32]*clientConn + clients map[uint64]*clientConn capability uint32 dom *domain.Domain + globalConnID util.GlobalConnID statusAddr string statusListener net.Listener statusServer *http.Server grpcServer *grpc.Server + inShutdownMode bool } // ConnectionCount gets current connection count. @@ -137,6 +141,7 @@ func (s *Server) ConnectionCount() int { func (s *Server) getToken() *Token { start := time.Now() tok := s.concurrentLimiter.Get() + metrics.TokenGauge.Inc() // Note that data smaller than one microsecond is ignored, because that case can be viewed as non-block. metrics.GetTokenDurationHistogram.Observe(float64(time.Since(start).Nanoseconds() / 1e3)) return tok @@ -144,6 +149,7 @@ func (s *Server) getToken() *Token { func (s *Server) releaseToken(token *Token) { s.concurrentLimiter.Put(token) + metrics.TokenGauge.Dec() } // SetDomain use to set the server domain. @@ -151,15 +157,21 @@ func (s *Server) SetDomain(dom *domain.Domain) { s.dom = dom } +// InitGlobalConnID initialize global connection id. +func (s *Server) InitGlobalConnID(serverIDGetter func() uint64) { + s.globalConnID = util.GlobalConnID{ + ServerIDGetter: serverIDGetter, + Is64bits: true, + } +} + // newConn creates a new *clientConn from a net.Conn. // It allocates a connection ID and random salt data for authentication. func (s *Server) newConn(conn net.Conn) *clientConn { cc := newClientConn(s) - if s.cfg.Performance.TCPKeepAlive { - if tcpConn, ok := conn.(*net.TCPConn); ok { - if err := tcpConn.SetKeepAlive(true); err != nil { - logutil.BgLogger().Error("failed to set tcp keep alive option", zap.Error(err)) - } + if tcpConn, ok := conn.(*net.TCPConn); ok { + if err := tcpConn.SetKeepAlive(s.cfg.Performance.TCPKeepAlive); err != nil { + logutil.BgLogger().Error("failed to set tcp keep alive option", zap.Error(err)) } } cc.setConn(conn) @@ -180,10 +192,8 @@ func (s *Server) forwardUnixSocketToTCP() { if uconn, err := s.socket.Accept(); err == nil { logutil.BgLogger().Info("server socket forwarding", zap.String("from", s.cfg.Socket), zap.String("to", addr)) go s.handleForwardedConnection(uconn, addr) - } else { - if s.listener != nil { - logutil.BgLogger().Error("server failed to forward", zap.String("from", s.cfg.Socket), zap.String("to", addr), zap.Error(err)) - } + } else if s.listener != nil { + logutil.BgLogger().Error("server failed to forward", zap.String("from", s.cfg.Socket), zap.String("to", addr), zap.Error(err)) } } } @@ -210,9 +220,10 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { cfg: cfg, driver: driver, concurrentLimiter: NewTokenLimiter(cfg.TokenLimit), - clients: make(map[uint32]*clientConn), + clients: make(map[uint64]*clientConn), + globalConnID: util.GlobalConnID{ServerID: 0, Is64bits: true}, } - + setTxnScope() tlsConfig, err := util.LoadTLSCertificates(s.cfg.Security.SSLCA, s.cfg.Security.SSLKey, s.cfg.Security.SSLCert) if err != nil { logutil.BgLogger().Error("secure connection cert/key/ca load fail", zap.Error(err)) @@ -234,7 +245,11 @@ func NewServer(cfg *config.Config, driver IDriver) (*Server, error) { if s.cfg.Host != "" && (s.cfg.Port != 0 || runInGoTest) { addr := fmt.Sprintf("%s:%d", s.cfg.Host, s.cfg.Port) - if s.listener, err = net.Listen("tcp", addr); err == nil { + tcpProto := "tcp" + if s.cfg.EnableTCP4Only { + tcpProto = "tcp4" + } + if s.listener, err = net.Listen(tcpProto, addr); err == nil { logutil.BgLogger().Info("server is running MySQL protocol", zap.String("addr", addr)) if cfg.Socket != "" { if s.socket, err = net.Listen("unix", s.cfg.Socket); err == nil { @@ -285,9 +300,26 @@ func setSSLVariable(ca, key, cert string) { variable.SetSysVar("ssl_ca", ca) } +func setTxnScope() { + variable.SetSysVar("txn_scope", func() string { + if isGlobal, _ := config.GetTxnScopeFromConfig(); isGlobal { + return oracle.GlobalTxnScope + } + return oracle.LocalTxnScope + }()) +} + +// Export config-related metrics +func (s *Server) reportConfig() { + metrics.ConfigStatus.WithLabelValues("token-limit").Set(float64(s.cfg.TokenLimit)) + metrics.ConfigStatus.WithLabelValues("mem-quota-query").Set(float64(s.cfg.MemQuotaQuery)) + metrics.ConfigStatus.WithLabelValues("max-server-connections").Set(float64(s.cfg.MaxServerConnections)) +} + // Run runs the server. func (s *Server) Run() error { metrics.ServerEventCounter.WithLabelValues(metrics.EventStart).Inc() + s.reportConfig() // Start HTTP API to report tidb info such as TPS. if s.cfg.Status.ReportStatus { @@ -317,7 +349,7 @@ func (s *Server) Run() error { err = plugin.ForeachPlugin(plugin.Audit, func(p *plugin.Plugin) error { authPlugin := plugin.DeclareAuditManifest(p.Manifest) if authPlugin.OnConnectionEvent != nil { - host, err := clientConn.PeerHost("") + host, _, err := clientConn.PeerHost("") if err != nil { logutil.BgLogger().Error("get peer host failed", zap.Error(err)) terror.Log(clientConn.Close()) @@ -336,13 +368,34 @@ func (s *Server) Run() error { continue } + if s.dom != nil && s.dom.IsLostConnectionToPD() { + logutil.BgLogger().Warn("reject connection due to lost connection to PD") + terror.Log(clientConn.Close()) + continue + } + go s.onConn(clientConn) } } +func (s *Server) startShutdown() { + s.rwlock.RLock() + logutil.BgLogger().Info("setting tidb-server to report unhealthy (shutting-down)") + s.inShutdownMode = true + s.rwlock.RUnlock() + // give the load balancer a chance to receive a few unhealthy health reports + // before acquiring the s.rwlock and blocking connections. + waitTime := time.Duration(s.cfg.GracefulWaitBeforeShutdown) * time.Second + if waitTime > 0 { + logutil.BgLogger().Info("waiting for stray connections before starting shutdown process", zap.Duration("waitTime", waitTime)) + time.Sleep(waitTime) + } +} + // Close closes the server. func (s *Server) Close() { - s.rwlock.Lock() + s.startShutdown() + s.rwlock.Lock() // prevent new connections defer s.rwlock.Unlock() if s.listener != nil { @@ -486,9 +539,6 @@ func (s *Server) ShowProcessList() map[uint64]*util.ProcessInfo { defer s.rwlock.RUnlock() rs := make(map[uint64]*util.ProcessInfo, len(s.clients)) for _, client := range s.clients { - if atomic.LoadInt32(&client.status) == connStatusWaitShutdown { - continue - } if pi := client.ctx.ShowProcess(); pi != nil { rs[pi.ID] = pi } @@ -499,9 +549,9 @@ func (s *Server) ShowProcessList() map[uint64]*util.ProcessInfo { // GetProcessInfo implements the SessionManager interface. func (s *Server) GetProcessInfo(id uint64) (*util.ProcessInfo, bool) { s.rwlock.RLock() - conn, ok := s.clients[uint32(id)] + conn, ok := s.clients[id] s.rwlock.RUnlock() - if !ok || atomic.LoadInt32(&conn.status) == connStatusWaitShutdown { + if !ok { return &util.ProcessInfo{}, false } return conn.ctx.ShowProcess(), ok @@ -514,13 +564,13 @@ func (s *Server) Kill(connectionID uint64, query bool) { s.rwlock.RLock() defer s.rwlock.RUnlock() - conn, ok := s.clients[uint32(connectionID)] + conn, ok := s.clients[connectionID] if !ok { return } if !query { - // Mark the client connection status as WaitShutdown, when the goroutine detect + // Mark the client connection status as WaitShutdown, when clientConn.Run detect // this, it will end the dispatch loop and exit. atomic.StoreInt32(&conn.status, connStatusWaitShutdown) } @@ -539,6 +589,12 @@ func (s *Server) getTLSConfig() *tls.Config { func killConn(conn *clientConn) { sessVars := conn.ctx.GetSessionVars() atomic.StoreUint32(&sessVars.Killed, 1) + conn.mu.RLock() + cancelFunc := conn.mu.cancelFunc + conn.mu.RUnlock() + if cancelFunc != nil { + cancelFunc() + } } // KillAllConnections kills all connections when server is not gracefully shutdown. @@ -620,6 +676,11 @@ func (s *Server) kickIdleConnection() { } } +// ServerID implements SessionManager interface. +func (s *Server) ServerID() uint64 { + return s.dom.ServerID() +} + // setSysTimeZoneOnce is used for parallel run tests. When several servers are running, // only the first will actually do setSystemTimeZoneVariable, thus we can avoid data race. var setSysTimeZoneOnce = &sync.Once{} @@ -637,10 +698,3 @@ func setSystemTimeZoneVariable() { variable.SetSysVar("system_time_zone", tz) }) } - -// Server error codes. -const ( - codeUnknownFieldType = 1 - codeInvalidSequence = 3 - codeInvalidType = 4 -) diff --git a/server/server_test.go b/server/server_test.go index b400b54be69f5..d92aff484071c 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -14,6 +14,7 @@ package server import ( + "bytes" "database/sql" "encoding/json" "fmt" @@ -24,8 +25,10 @@ import ( "net/url" "os" "path/filepath" + "reflect" "regexp" "strconv" + "strings" "testing" "time" @@ -35,6 +38,7 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/log" tmysql "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/util/logutil" @@ -47,6 +51,12 @@ var ( ) func TestT(t *testing.T) { + defaultConfig := config.NewConfig() + globalConfig := config.GetGlobalConfig() + // Test for issue 22162. the global config shouldn't be changed by other pkg init function. + if !reflect.DeepEqual(defaultConfig, globalConfig) { + t.Fatalf("%#v != %#v\n", defaultConfig, globalConfig) + } CustomVerboseFlag = true logLevel := os.Getenv("log_level") logutil.InitZapLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) @@ -293,8 +303,7 @@ func (cli *testServerClient) runTestPrepareResultFieldType(t *C) { if err != nil { dbt.Fatal(err) } - switch { - case result != param: + if result != param { dbt.Fatal("Unexpected result value") } }) @@ -437,6 +446,365 @@ func (cli *testServerClient) runTestLoadDataWithSelectIntoOutfile(c *C, server * } }) } +func (cli *testServerClient) runTestLoadDataForSlowLog(c *C, server *Server) { + path := "/tmp/load_data_test.csv" + fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + c.Assert(err, IsNil) + c.Assert(fp, NotNil) + defer func() { + err = fp.Close() + c.Assert(err, IsNil) + err = os.Remove(path) + c.Assert(err, IsNil) + }() + _, err = fp.WriteString( + "1 1\n" + + "2 2\n" + + "3 3\n" + + "4 4\n" + + "5 5\n") + c.Assert(err, IsNil) + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_slow_query", func(dbt *DBTest) { + dbt.mustExec("create table t_slow (a int key, b int)") + defer func() { + dbt.mustExec("set tidb_slow_log_threshold=300;") + dbt.mustExec("set @@global.tidb_enable_stmt_summary=0") + }() + dbt.mustExec("set tidb_slow_log_threshold=0;") + dbt.mustExec("set @@global.tidb_enable_stmt_summary=1") + query := fmt.Sprintf("load data local infile %q into table t_slow", path) + dbt.mustExec(query) + dbt.mustExec("insert ignore into t_slow values (1,1);") + + checkPlan := func(rows *sql.Rows, expectPlan string) { + dbt.Check(rows.Next(), IsTrue, Commentf("unexpected data")) + var plan sql.NullString + err = rows.Scan(&plan) + dbt.Check(err, IsNil) + planStr := strings.ReplaceAll(plan.String, "\t", " ") + planStr = strings.ReplaceAll(planStr, "\n", " ") + c.Assert(planStr, Matches, expectPlan) + } + + // Test for record slow log for load data statement. + rows := dbt.mustQuery(fmt.Sprintf("select plan from information_schema.slow_query where query like 'load data local infile %% into table t_slow;' order by time desc limit 1")) + expectedPlan := ".*LoadData.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.* commit_txn.*" + checkPlan(rows, expectedPlan) + // Test for record statements_summary for load data statement. + rows = dbt.mustQuery(fmt.Sprintf("select plan from information_schema.STATEMENTS_SUMMARY where QUERY_SAMPLE_TEXT like 'load data local infile %%' limit 1")) + checkPlan(rows, expectedPlan) + // Test log normal statement after executing load date. + rows = dbt.mustQuery(fmt.Sprintf("select plan from information_schema.slow_query where query = 'insert ignore into t_slow values (1,1);' order by time desc limit 1")) + expectedPlan = ".*Insert.* time.* loops.* prepare.* check_insert.* mem_insert_time:.* prefetch.* rpc.*" + checkPlan(rows, expectedPlan) + }) +} + +func (cli *testServerClient) prepareLoadDataFile(c *C, path string, rows ...string) { + fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + c.Assert(err, IsNil) + c.Assert(fp, NotNil) + defer func() { + err = fp.Close() + c.Assert(err, IsNil) + }() + for _, row := range rows { + fields := strings.Split(row, " ") + _, err = fp.WriteString(strings.Join(fields, "\t")) + _, err = fp.WriteString("\n") + } + c.Assert(err, IsNil) +} + +func (cli *testServerClient) runTestLoadDataAutoRandom(c *C) { + path := "/tmp/load_data_txn_error.csv" + + fp, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600) + c.Assert(err, IsNil) + c.Assert(fp, NotNil) + + defer func() { + _ = os.Remove(path) + }() + + cksum1 := 0 + cksum2 := 0 + for i := 0; i < 50000; i++ { + n1 := rand.Intn(1000) + n2 := rand.Intn(1000) + str1 := strconv.Itoa(n1) + str2 := strconv.Itoa(n2) + row := str1 + "\t" + str2 + _, err := fp.WriteString(row) + c.Assert(err, IsNil) + _, err = fp.WriteString("\n") + c.Assert(err, IsNil) + + if i == 0 { + cksum1 = n1 + cksum2 = n2 + } else { + cksum1 = cksum1 ^ n1 + cksum2 = cksum2 ^ n2 + } + } + + err = fp.Close() + c.Assert(err, IsNil) + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_batch_dml", func(dbt *DBTest) { + // Set batch size, and check if load data got a invalid txn error. + dbt.mustExec("set @@session.tidb_dml_batch_size = 128") + dbt.mustExec("drop table if exists t") + dbt.mustExec("create table t(c1 bigint auto_random primary key, c2 bigint, c3 bigint)") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (c2, c3)", path)) + rows := dbt.mustQuery("select count(*) from t") + cli.checkRows(c, rows, "50000") + rows = dbt.mustQuery("select bit_xor(c2), bit_xor(c3) from t") + res := strconv.Itoa(cksum1) + res = res + " " + res = res + strconv.Itoa(cksum2) + cli.checkRows(c, rows, res) + }) +} + +func (cli *testServerClient) runTestLoadDataForListPartition(c *C) { + path := "/tmp/load_data_list_partition.csv" + defer func() { + _ = os.Remove(path) + }() + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_list_partition", func(dbt *DBTest) { + dbt.mustExec("set @@session.tidb_enable_list_partition = ON") + dbt.mustExec(`create table t (id int, name varchar(10), + unique index idx (id)) partition by list (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + // Test load data into 1 partition. + cli.prepareLoadDataFile(c, path, "1 a", "2 b") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.mustQuery("select * from t partition(p1) order by id") + cli.checkRows(c, rows, "1 a", "2 b") + // Test load data into multi-partitions. + dbt.mustExec("delete from t") + cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "1 a", "3 c", "4 e") + // Test load data meet duplicate error. + cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, + "Warning 1062 Duplicate entry '1' for key 'idx'", + "Warning 1062 Duplicate entry '2' for key 'idx'") + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + // Test load data meet no partition warning. + cli.prepareLoadDataFile(c, path, "5 a", "100 x") + _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 1526 Table has no partition for value 100") + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + }) +} + +func (cli *testServerClient) runTestLoadDataForListPartition2(c *C) { + path := "/tmp/load_data_list_partition.csv" + defer func() { + _ = os.Remove(path) + }() + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_list_partition", func(dbt *DBTest) { + dbt.mustExec("set @@session.tidb_enable_list_partition = ON") + dbt.mustExec(`create table t (id int, name varchar(10),b int generated always as (length(name)+1) virtual, + unique index idx (id,b)) partition by list (id*2 + b*b + b*b - b*b*2 - abs(id)) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + // Test load data into 1 partition. + cli.prepareLoadDataFile(c, path, "1 a", "2 b") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + rows := dbt.mustQuery("select id,name from t partition(p1) order by id") + cli.checkRows(c, rows, "1 a", "2 b") + // Test load data into multi-partitions. + dbt.mustExec("delete from t") + cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + rows = dbt.mustQuery("select id,name from t order by id") + cli.checkRows(c, rows, "1 a", "3 c", "4 e") + // Test load data meet duplicate error. + cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, + "Warning 1062 Duplicate entry '1-2' for key 'idx'", + "Warning 1062 Duplicate entry '2-2' for key 'idx'") + rows = dbt.mustQuery("select id,name from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + // Test load data meet no partition warning. + cli.prepareLoadDataFile(c, path, "5 a", "100 x") + _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t (id,name)", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 1526 Table has no partition for value 100") + rows = dbt.mustQuery("select id,name from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + }) +} + +func (cli *testServerClient) runTestLoadDataForListColumnPartition(c *C) { + path := "/tmp/load_data_list_partition.csv" + defer func() { + _ = os.Remove(path) + }() + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_list_partition", func(dbt *DBTest) { + dbt.mustExec("set @@session.tidb_enable_list_partition = ON") + dbt.mustExec(`create table t (id int, name varchar(10), + unique index idx (id)) partition by list columns (id) ( + partition p0 values in (3,5,6,9,17), + partition p1 values in (1,2,10,11,19,20), + partition p2 values in (4,12,13,14,18), + partition p3 values in (7,8,15,16,null) + );`) + // Test load data into 1 partition. + cli.prepareLoadDataFile(c, path, "1 a", "2 b") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.mustQuery("select * from t partition(p1) order by id") + cli.checkRows(c, rows, "1 a", "2 b") + // Test load data into multi-partitions. + dbt.mustExec("delete from t") + cli.prepareLoadDataFile(c, path, "1 a", "3 c", "4 e") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "1 a", "3 c", "4 e") + // Test load data meet duplicate error. + cli.prepareLoadDataFile(c, path, "1 x", "2 b", "2 x", "7 a") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, + "Warning 1062 Duplicate entry '1' for key 'idx'", + "Warning 1062 Duplicate entry '2' for key 'idx'") + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "7 a") + // Test load data meet no partition warning. + cli.prepareLoadDataFile(c, path, "5 a", "100 x") + _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 1526 Table has no partition for value from column_list") + rows = dbt.mustQuery("select id,name from t order by id") + cli.checkRows(c, rows, "1 a", "2 b", "3 c", "4 e", "5 a", "7 a") + }) +} + +func (cli *testServerClient) runTestLoadDataForListColumnPartition2(c *C) { + path := "/tmp/load_data_list_partition.csv" + defer func() { + _ = os.Remove(path) + }() + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.AllowAllFiles = true + config.Params = map[string]string{"sql_mode": "''"} + }, "load_data_list_partition", func(dbt *DBTest) { + dbt.mustExec("set @@session.tidb_enable_list_partition = ON") + dbt.mustExec(`create table t (location varchar(10), id int, a int, unique index idx (location,id)) partition by list columns (location,id) ( + partition p_west values in (('w', 1),('w', 2),('w', 3),('w', 4)), + partition p_east values in (('e', 5),('e', 6),('e', 7),('e', 8)), + partition p_north values in (('n', 9),('n',10),('n',11),('n',12)), + partition p_south values in (('s',13),('s',14),('s',15),('s',16)) + );`) + // Test load data into 1 partition. + cli.prepareLoadDataFile(c, path, "w 1 1", "w 2 2") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows := dbt.mustQuery("select * from t partition(p_west) order by id") + cli.checkRows(c, rows, "w 1 1", "w 2 2") + // Test load data into multi-partitions. + dbt.mustExec("delete from t") + cli.prepareLoadDataFile(c, path, "w 1 1", "e 5 5", "n 9 9") + dbt.mustExec(fmt.Sprintf("load data local infile %q into table t", path)) + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "w 1 1", "e 5 5", "n 9 9") + // Test load data meet duplicate error. + cli.prepareLoadDataFile(c, path, "w 1 2", "w 2 2") + _, err := dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 1062 Duplicate entry 'w-1' for key 'idx'") + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "w 1 1", "w 2 2", "e 5 5", "n 9 9") + // Test load data meet no partition warning. + cli.prepareLoadDataFile(c, path, "w 3 3", "w 5 5", "e 8 8") + _, err = dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 1526 Table has no partition for value from column_list") + cli.prepareLoadDataFile(c, path, "x 1 1", "w 1 1") + _, err = dbt.db.Exec(fmt.Sprintf("load data local infile %q into table t", path)) + c.Assert(err, IsNil) + rows = dbt.mustQuery("show warnings") + cli.checkRows(c, rows, + "Warning 1526 Table has no partition for value from column_list", + "Warning 1062 Duplicate entry 'w-1' for key 'idx'") + rows = dbt.mustQuery("select * from t order by id") + cli.checkRows(c, rows, "w 1 1", "w 2 2", "w 3 3", "e 5 5", "e 8 8", "n 9 9") + }) +} + +func (cli *testServerClient) checkRows(c *C, rows *sql.Rows, expectedRows ...string) { + buf := bytes.NewBuffer(nil) + result := make([]string, 0, 2) + for rows.Next() { + cols, err := rows.Columns() + c.Assert(err, IsNil) + rawResult := make([][]byte, len(cols)) + dest := make([]interface{}, len(cols)) + for i := range rawResult { + dest[i] = &rawResult[i] + } + + err = rows.Scan(dest...) + c.Assert(err, IsNil) + buf.Reset() + for i, raw := range rawResult { + if i > 0 { + buf.WriteString(" ") + } + if raw == nil { + buf.WriteString("") + } else { + buf.WriteString(string(raw)) + } + } + result = append(result, buf.String()) + } + c.Assert(strings.Join(result, "\n"), Equals, strings.Join(expectedRows, "\n")) +} func (cli *testServerClient) runTestLoadData(c *C, server *Server) { // create a file and write data. @@ -470,6 +838,17 @@ func (cli *testServerClient) runTestLoadData(c *C, server *Server) { }, "LoadData", func(dbt *DBTest) { dbt.mustExec("set @@tidb_dml_batch_size = 3") dbt.mustExec("create table test (a varchar(255), b varchar(255) default 'default value', c int not null auto_increment, primary key(c))") + dbt.mustExec("create view v1 as select 1") + dbt.mustExec("create sequence s1") + + // can't insert into views (in TiDB) or sequences. issue #20880 + _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table v1") + dbt.Assert(err, NotNil) + dbt.Assert(err.Error(), Equals, "Error 1105: can only load data into base tables") + _, err = dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table s1") + dbt.Assert(err, NotNil) + dbt.Assert(err.Error(), Equals, "Error 1105: can only load data into base tables") + rs, err1 := dbt.db.Exec("load data local infile '/tmp/load_data_test.csv' into table test") dbt.Assert(err1, IsNil) lastID, err1 := rs.LastInsertId() @@ -1000,6 +1379,28 @@ func (cli *testServerClient) runTestConcurrentUpdate(c *C) { }) } +func (cli *testServerClient) runTestExplainForConn(c *C) { + cli.runTestsOnNewDB(c, nil, "explain_for_conn", func(dbt *DBTest) { + dbt.mustExec("drop table if exists t") + dbt.mustExec("create table t (a int key, b int)") + dbt.mustExec("insert t values (1, 1)") + rows := dbt.mustQuery("select connection_id();") + c.Assert(rows.Next(), IsTrue) + var connID int64 + err := rows.Scan(&connID) + c.Assert(err, IsNil) + c.Assert(rows.Close(), IsNil) + dbt.mustQuery("select * from t where a=1") + rows = dbt.mustQuery("explain for connection " + strconv.Itoa(int(connID))) + c.Assert(rows.Next(), IsTrue) + row := make([]string, 9) + err = rows.Scan(&row[0], &row[1], &row[2], &row[3], &row[4], &row[5], &row[6], &row[7], &row[8]) + c.Assert(err, IsNil) + c.Assert(strings.Join(row, ","), Matches, "Point_Get_1,1.00,1,root,table:t,time.*loop.*handle:1.*") + c.Assert(rows.Close(), IsNil) + }) +} + func (cli *testServerClient) runTestErrorCode(c *C) { cli.runTestsOnNewDB(c, nil, "ErrorCode", func(dbt *DBTest) { dbt.mustExec("create table test (c int PRIMARY KEY);") @@ -1154,6 +1555,22 @@ func (cli *testServerClient) runTestIssue3680(c *C) { c.Assert(err.Error(), Equals, "Error 1045: Access denied for user 'non_existing_user'@'127.0.0.1' (using password: NO)") } +func (cli *testServerClient) runTestIssue22646(c *C) { + cli.runTests(c, nil, func(dbt *DBTest) { + c1 := make(chan string, 1) + go func() { + dbt.mustExec(``) // empty query. + c1 <- "success" + }() + select { + case res := <-c1: + fmt.Println(res) + case <-time.After(30 * time.Second): + panic("read empty query statement timed out.") + } + }) +} + func (cli *testServerClient) runTestIssue3682(c *C) { cli.runTests(c, nil, func(dbt *DBTest) { dbt.mustExec(`CREATE USER 'issue3682'@'%' IDENTIFIED BY '123';`) @@ -1212,8 +1629,76 @@ func (cli *testServerClient) runTestStatusAPI(c *C) { c.Assert(data.GitHash, Equals, versioninfo.TiDBGitHash) } +// The golang sql driver (and most drivers) should have multi-statement +// disabled by default for security reasons. Lets ensure that the behavior +// is correct. + +func (cli *testServerClient) runFailedTestMultiStatements(c *C) { + cli.runTestsOnNewDB(c, nil, "FailedMultiStatements", func(dbt *DBTest) { + + // Default is now OFF in new installations. + // It is still WARN in upgrade installations (for now) + _, err := dbt.db.Exec("SELECT 1; SELECT 1; SELECT 2; SELECT 3;") + c.Assert(err.Error(), Equals, "Error 8130: client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk") + + // Change to WARN (legacy mode) + dbt.mustExec("SET tidb_multi_statement_mode='WARN'") + dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") + res := dbt.mustExec("INSERT INTO test VALUES (1, 1)") + count, err := res.RowsAffected() + c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) + c.Assert(count, Equals, int64(1)) + res = dbt.mustExec("UPDATE test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") + count, err = res.RowsAffected() + c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) + c.Assert(count, Equals, int64(1)) + rows := dbt.mustQuery("show warnings") + cli.checkRows(c, rows, "Warning 8130 client has multi-statement capability disabled. Run SET GLOBAL tidb_multi_statement_mode='ON' after you understand the security risk") + var out int + rows = dbt.mustQuery("SELECT value FROM test WHERE id=1;") + if rows.Next() { + rows.Scan(&out) + c.Assert(out, Equals, 5) + + if rows.Next() { + dbt.Error("unexpected data") + } + } else { + dbt.Error("no data") + } + + // Change to ON = Fully supported, TiDB legacy. No warnings or Errors. + dbt.mustExec("SET tidb_multi_statement_mode='ON';") + dbt.mustExec("DROP TABLE IF EXISTS test") + dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") + res = dbt.mustExec("INSERT INTO test VALUES (1, 1)") + count, err = res.RowsAffected() + c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) + c.Assert(count, Equals, int64(1)) + res = dbt.mustExec("update test SET value = 3 WHERE id = 1; UPDATE test SET value = 4 WHERE id = 1; UPDATE test SET value = 5 WHERE id = 1;") + count, err = res.RowsAffected() + c.Assert(err, IsNil, Commentf("res.RowsAffected() returned error")) + c.Assert(count, Equals, int64(1)) + rows = dbt.mustQuery("SELECT value FROM test WHERE id=1;") + if rows.Next() { + rows.Scan(&out) + c.Assert(out, Equals, 5) + + if rows.Next() { + dbt.Error("unexpected data") + } + } else { + dbt.Error("no data") + } + + }) +} + func (cli *testServerClient) runTestMultiStatements(c *C) { - cli.runTestsOnNewDB(c, nil, "MultiStatements", func(dbt *DBTest) { + + cli.runTestsOnNewDB(c, func(config *mysql.Config) { + config.Params = map[string]string{"multiStatements": "true"} + }, "MultiStatements", func(dbt *DBTest) { // Create Table dbt.mustExec("CREATE TABLE `test` (`id` int(11) NOT NULL, `value` int(11) NOT NULL) ") @@ -1337,7 +1822,7 @@ func (cli *testServerClient) getMetrics(t *C) []byte { func getStmtCnt(content string) (stmtCnt map[string]int) { stmtCnt = make(map[string]int) - r, _ := regexp.Compile("tidb_executor_statement_total{type=\"([A-Z|a-z|-]+)\"} (\\d+)") + r := regexp.MustCompile("tidb_executor_statement_total{type=\"([A-Z|a-z|-]+)\"} (\\d+)") matchResult := r.FindAllStringSubmatch(content, -1) for _, v := range matchResult { cnt, _ := strconv.Atoi(v[2]) @@ -1377,3 +1862,64 @@ func (cli *testServerClient) waitUntilServerOnline() { log.Fatal("failed to connect HTTP status in every 10 ms", zap.Int("retryTime", retryTime)) } } + +// Client errors are only incremented when using the TiDB Server protocol, +// and not internal SQL statements. Thus, this test is in the server-test suite. +func (cli *testServerClient) runTestInfoschemaClientErrors(t *C) { + cli.runTestsOnNewDB(t, nil, "clientErrors", func(dbt *DBTest) { + + clientErrors := []struct { + stmt string + incrementWarnings bool + incrementErrors bool + errCode int + }{ + { + stmt: "SELECT 0/0", + incrementWarnings: true, + errCode: 1365, // div by zero + }, + { + stmt: "CREATE TABLE test_client_errors2 (a int primary key, b int primary key)", + incrementErrors: true, + errCode: 1068, // multiple pkeys + }, + { + stmt: "gibberish", + incrementErrors: true, + errCode: 1064, // parse error + }, + } + + sources := []string{"client_errors_summary_global", "client_errors_summary_by_user", "client_errors_summary_by_host"} + + for _, test := range clientErrors { + for _, tbl := range sources { + + var errors, warnings int + rows := dbt.mustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) + if rows.Next() { + rows.Scan(&errors, &warnings) + } + + if test.incrementErrors { + errors++ + } + if test.incrementWarnings { + warnings++ + } + + dbt.db.Query(test.stmt) // ignore results and errors (query table) + var newErrors, newWarnings int + rows = dbt.mustQuery("SELECT SUM(error_count), SUM(warning_count) FROM information_schema."+tbl+" WHERE error_number = ? GROUP BY error_number", test.errCode) + if rows.Next() { + rows.Scan(&newErrors, &newWarnings) + } + + dbt.Check(newErrors, Equals, errors) + dbt.Check(newWarnings, Equals, warnings) + } + } + + }) +} diff --git a/server/sql_info_fetcher.go b/server/sql_info_fetcher.go index a05dd50b36e72..a7be33ea00154 100644 --- a/server/sql_info_fetcher.go +++ b/server/sql_info_fetcher.go @@ -31,14 +31,14 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/statistics/handle" - "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/util/sqlexec" ) type sqlInfoFetcher struct { - store tikv.Storage + store kv.Storage do *domain.Domain s session.Session } @@ -88,7 +88,7 @@ func (sh *sqlInfoFetcher) zipInfoForSQL(w http.ResponseWriter, r *http.Request) timeoutString := r.FormValue("timeout") curDB := strings.ToLower(r.FormValue("current_db")) if curDB != "" { - _, err = sh.s.Execute(reqCtx, fmt.Sprintf("use %v", curDB)) + _, err = sh.s.ExecuteInternal(context.Background(), "use %n", curDB) if err != nil { serveError(w, http.StatusInternalServerError, fmt.Sprintf("use database %v failed, err: %v", curDB, err)) return diff --git a/server/statistics_handler.go b/server/statistics_handler.go index a40e1b19b321f..733a0559f4943 100644 --- a/server/statistics_handler.go +++ b/server/statistics_handler.go @@ -22,10 +22,9 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/gcutil" - "github.com/pingcap/tidb/util/sqlexec" ) // StatsHandler is the handler for dumping statistics. @@ -104,7 +103,7 @@ func (sh StatsHistoryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request writeError(w, err) return } - snapshot := variable.GoTimeToTS(t1) + snapshot := oracle.GoTimeToTS(t1) err = gcutil.ValidateSnapshot(se, snapshot) if err != nil { writeError(w, err) @@ -122,9 +121,7 @@ func (sh StatsHistoryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request writeError(w, err) return } - se.GetSessionVars().SnapshotInfoschema, se.GetSessionVars().SnapshotTS = is, snapshot - historyStatsExec := se.(sqlexec.RestrictedSQLExecutor) - js, err := h.DumpStatsToJSON(params[pDBName], tbl.Meta(), historyStatsExec) + js, err := h.DumpStatsToJSONBySnapshot(params[pDBName], tbl.Meta(), snapshot) if err != nil { writeError(w, err) } else { diff --git a/server/tidb_test.go b/server/tidb_test.go index 2cf4f07b7752a..2a727d2d30d3a 100644 --- a/server/tidb_test.go +++ b/server/tidb_test.go @@ -27,6 +27,7 @@ import ( "net/http" "os" "path/filepath" + "sync/atomic" "time" "github.com/go-sql-driver/mysql" @@ -38,8 +39,11 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/testkit" ) @@ -86,6 +90,8 @@ func (ts *tidbTestSuiteBase) SetUpSuite(c *C) { cfg.Status.ReportStatus = true cfg.Status.StatusPort = ts.statusPort cfg.Performance.TCPKeepAlive = true + err = logutil.InitLogger(cfg.Log.ToLogConfig()) + c.Assert(err, IsNil) server, err := NewServer(cfg, ts.tidbdrv) c.Assert(err, IsNil) @@ -134,11 +140,36 @@ func (ts *tidbTestSuite) TestPreparedTimestamp(c *C) { ts.runTestPreparedTimestamp(c) } +func (ts *tidbTestSerialSuite) TestConfigDefaultValue(c *C) { + ts.runTestsOnNewDB(c, nil, "config", func(dbt *DBTest) { + rows := dbt.mustQuery("select @@tidb_slow_log_threshold;") + ts.checkRows(c, rows, "300") + }) +} + // this test will change `kv.TxnTotalSizeLimit` which may affect other test suites, // so we must make it running in serial. func (ts *tidbTestSerialSuite) TestLoadData(c *C) { ts.runTestLoadData(c, ts.server) ts.runTestLoadDataWithSelectIntoOutfile(c, ts.server) + ts.runTestLoadDataForSlowLog(c, ts.server) +} + +func (ts *tidbTestSerialSuite) TestLoadDataListPartition(c *C) { + ts.runTestLoadDataForListPartition(c) + ts.runTestLoadDataForListPartition2(c) + ts.runTestLoadDataForListColumnPartition(c) + ts.runTestLoadDataForListColumnPartition2(c) +} + +// Fix issue#22540. Change tidb_dml_batch_size, +// then check if load data into table with auto random column works properly. +func (ts *tidbTestSerialSuite) TestLoadDataAutoRandom(c *C) { + ts.runTestLoadDataAutoRandom(c) +} + +func (ts *tidbTestSerialSuite) TestExplainFor(c *C) { + ts.runTestExplainForConn(c) } func (ts *tidbTestSerialSuite) TestStmtCount(c *C) { @@ -165,6 +196,7 @@ func (ts *tidbTestSuite) TestIssues(c *C) { c.Parallel() ts.runTestIssue3662(c) ts.runTestIssue3680(c) + ts.runTestIssue22646(c) } func (ts *tidbTestSuite) TestDBNameEscape(c *C) { @@ -311,6 +343,7 @@ func newTLSHttpClient(c *C, caFile, certFile, keyFile string) *http.Client { func (ts *tidbTestSuite) TestMultiStatements(c *C) { c.Parallel() + ts.runFailedTestMultiStatements(c) ts.runTestMultiStatements(c) } @@ -352,7 +385,7 @@ func (ts *tidbTestSuite) TestSocket(c *C) { time.Sleep(time.Millisecond * 100) defer server.Close() - //a fake server client, config is override, just used to run tests + // a fake server client, config is override, just used to run tests cli := newTestServerClient() cli.runTestRegression(c, func(config *mysql.Config) { config.User = "root" @@ -912,6 +945,10 @@ func (ts *tidbTestSuite) TestFieldList(c *C) { c.Assert(cols[0].Name, Equals, columnAsName) } +func (ts *tidbTestSuite) TestClientErrors(c *C) { + ts.runTestInfoschemaClientErrors(c) +} + func (ts *tidbTestSuite) TestSumAvg(c *C) { c.Parallel() ts.runTestSumAvg(c) @@ -930,3 +967,125 @@ func (ts *tidbTestSuite) TestNullFlag(c *C) { expectFlag := uint16(tmysql.NotNullFlag | tmysql.BinaryFlag) c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) } + +func (ts *tidbTestSuite) TestNO_DEFAULT_VALUEFlag(c *C) { + // issue #21465 + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) + c.Assert(err, IsNil) + + ctx := context.Background() + _, err = Execute(ctx, qctx, "use test") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "drop table if exists t") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "create table t(c1 int key, c2 int);") + c.Assert(err, IsNil) + rs, err := Execute(ctx, qctx, "select c1 from t;") + c.Assert(err, IsNil) + cols := rs.Columns() + c.Assert(len(cols), Equals, 1) + expectFlag := uint16(tmysql.NotNullFlag | tmysql.PriKeyFlag | tmysql.NoDefaultValueFlag) + c.Assert(dumpFlag(cols[0].Type, cols[0].Flag), Equals, expectFlag) +} + +func (ts *tidbTestSuite) TestGracefulShutdown(c *C) { + var err error + ts.store, err = mockstore.NewMockStore() + session.DisableStats4Test() + c.Assert(err, IsNil) + ts.domain, err = session.BootstrapSession(ts.store) + c.Assert(err, IsNil) + ts.tidbdrv = NewTiDBDriver(ts.store) + cli := newTestServerClient() + cfg := newTestConfig() + cfg.GracefulWaitBeforeShutdown = 2 // wait before shutdown + cfg.Port = 0 + cfg.Status.StatusPort = 0 + cfg.Status.ReportStatus = true + cfg.Performance.TCPKeepAlive = true + server, err := NewServer(cfg, ts.tidbdrv) + c.Assert(err, IsNil) + c.Assert(server, NotNil) + cli.port = getPortFromTCPAddr(server.listener.Addr()) + cli.statusPort = getPortFromTCPAddr(server.statusListener.Addr()) + go server.Run() + time.Sleep(time.Millisecond * 100) + + _, err = cli.fetchStatus("/status") // server is up + c.Assert(err, IsNil) + + go server.Close() + time.Sleep(time.Millisecond * 500) + + resp, _ := cli.fetchStatus("/status") // should return 5xx code + c.Assert(resp.StatusCode, Equals, 500) + + time.Sleep(time.Second * 2) + + _, err = cli.fetchStatus("/status") // status is gone + c.Assert(err, ErrorMatches, ".*connect: connection refused") +} + +func (ts *tidbTestSerialSuite) TestDefaultCharacterAndCollation(c *C) { + // issue #21194 + collate.SetNewCollationEnabledForTest(true) + defer collate.SetNewCollationEnabledForTest(false) + // 255 is the collation id of mysql client 8 default collation_connection + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(255), "test", nil) + c.Assert(err, IsNil) + testCase := []struct { + variable string + except string + }{ + {"collation_connection", "utf8mb4_bin"}, + {"character_set_connection", "utf8mb4"}, + {"character_set_client", "utf8mb4"}, + } + + for _, t := range testCase { + sVars, b := qctx.GetSessionVars().GetSystemVar(t.variable) + c.Assert(b, IsTrue) + c.Assert(sVars, Equals, t.except) + } +} + +func (ts *tidbTestSuite) TestPessimisticInsertSelectForUpdate(c *C) { + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) + c.Assert(err, IsNil) + ctx := context.Background() + _, err = Execute(ctx, qctx, "use test;") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "drop table if exists t1, t2") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "create table t1 (id int)") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "create table t2 (id int)") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "insert into t1 select 1") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "begin pessimistic") + c.Assert(err, IsNil) + rs, err := Execute(ctx, qctx, "INSERT INTO t2 (id) select id from t1 where id = 1 for update") + c.Assert(err, IsNil) + c.Assert(rs, IsNil) // should be no delay +} + +func (ts *tidbTestSerialSuite) TestPrepareCount(c *C) { + qctx, err := ts.tidbdrv.OpenCtx(uint64(0), 0, uint8(tmysql.DefaultCollationID), "test", nil) + c.Assert(err, IsNil) + prepareCnt := atomic.LoadInt64(&variable.PreparedStmtCount) + ctx := context.Background() + _, err = Execute(ctx, qctx, "use test;") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "drop table if exists t1") + c.Assert(err, IsNil) + _, err = Execute(ctx, qctx, "create table t1 (id int)") + c.Assert(err, IsNil) + stmt, _, _, err := qctx.Prepare("insert into t1 values (?)") + c.Assert(err, IsNil) + c.Assert(atomic.LoadInt64(&variable.PreparedStmtCount), Equals, prepareCnt+1) + c.Assert(err, IsNil) + err = qctx.GetStatement(stmt.ID()).Close() + c.Assert(err, IsNil) + c.Assert(atomic.LoadInt64(&variable.PreparedStmtCount), Equals, prepareCnt) +} diff --git a/server/util.go b/server/util.go index c3bee1b1122bb..561f352513a9d 100644 --- a/server/util.go +++ b/server/util.go @@ -199,19 +199,31 @@ func dumpBinaryDateTime(data []byte, t types.Time) []byte { switch t.Type() { case mysql.TypeTimestamp, mysql.TypeDatetime: if t.IsZero() { + // All zero. data = append(data, 0) - } else { + } else if t.Microsecond() != 0 { + // Has micro seconds. data = append(data, 11) data = dumpUint16(data, uint16(year)) data = append(data, byte(mon), byte(day), byte(t.Hour()), byte(t.Minute()), byte(t.Second())) data = dumpUint32(data, uint32(t.Microsecond())) + } else if t.Hour() != 0 || t.Minute() != 0 || t.Second() != 0 { + // Has HH:MM:SS + data = append(data, 7) + data = dumpUint16(data, uint16(year)) + data = append(data, byte(mon), byte(day), byte(t.Hour()), byte(t.Minute()), byte(t.Second())) + } else { + // Only YY:MM:DD + data = append(data, 4) + data = dumpUint16(data, uint16(year)) + data = append(data, byte(mon), byte(day)) } case mysql.TypeDate: if t.IsZero() { data = append(data, 0) } else { data = append(data, 4) - data = dumpUint16(data, uint16(year)) //year + data = dumpUint16(data, uint16(year)) // year data = append(data, byte(mon), byte(day)) } } @@ -296,14 +308,14 @@ func dumpTextRow(buffer []byte, columns []*ColumnInfo, row chunk.Row) ([]byte, e buffer = dumpLengthEncodedString(buffer, tmp) case mysql.TypeFloat: prec := -1 - if columns[i].Decimal > 0 && int(col.Decimal) != mysql.NotFixedDec { + if columns[i].Decimal > 0 && int(col.Decimal) != mysql.NotFixedDec && col.Table == "" { prec = int(col.Decimal) } tmp = appendFormatFloat(tmp[:0], float64(row.GetFloat32(i)), prec, 32) buffer = dumpLengthEncodedString(buffer, tmp) case mysql.TypeDouble: prec := types.UnspecifiedLength - if col.Decimal > 0 && int(col.Decimal) != mysql.NotFixedDec { + if col.Decimal > 0 && int(col.Decimal) != mysql.NotFixedDec && col.Table == "" { prec = int(col.Decimal) } tmp = appendFormatFloat(tmp[:0], row.GetFloat64(i), prec, 64) @@ -347,14 +359,27 @@ func lengthEncodedIntSize(n uint64) int { } const ( - expFormatBig = 1e15 - expFormatSmall = 1e-15 + expFormatBig = 1e15 + expFormatSmall = 1e-15 + defaultMySQLPrec = 5 ) func appendFormatFloat(in []byte, fVal float64, prec, bitSize int) []byte { absVal := math.Abs(fVal) + if absVal > math.MaxFloat64 || math.IsNaN(absVal) { + return []byte{'0'} + } + isEFormat := false + if bitSize == 32 { + isEFormat = float32(absVal) >= expFormatBig || (float32(absVal) != 0 && float32(absVal) < expFormatSmall) + } else { + isEFormat = absVal >= expFormatBig || (absVal != 0 && absVal < expFormatSmall) + } var out []byte - if prec == types.UnspecifiedLength && (absVal >= expFormatBig || (absVal != 0 && absVal < expFormatSmall)) { + if isEFormat { + if bitSize == 32 { + prec = defaultMySQLPrec + } out = strconv.AppendFloat(in, fVal, 'e', prec, bitSize) valStr := out[len(in):] // remove the '+' from the string for compatibility. @@ -363,6 +388,20 @@ func appendFormatFloat(in []byte, fVal float64, prec, bitSize int) []byte { plusPosInOut := len(in) + plusPos out = append(out[:plusPosInOut], out[plusPosInOut+1:]...) } + // remove extra '0' + ePos := bytes.IndexByte(valStr, 'e') + pointPos := bytes.IndexByte(valStr, '.') + ePosInOut := len(in) + ePos + pointPosInOut := len(in) + pointPos + validPos := ePosInOut + for i := ePosInOut - 1; i >= pointPosInOut; i-- { + if out[i] == '0' || out[i] == '.' { + validPos = i + } else { + break + } + } + out = append(out[:validPos], out[ePosInOut:]...) } else { out = strconv.AppendFloat(in, fVal, 'f', prec, bitSize) } diff --git a/server/util_test.go b/server/util_test.go index 50ac761f48e4c..1e1fe6d8e1115 100644 --- a/server/util_test.go +++ b/server/util_test.go @@ -14,6 +14,7 @@ package server import ( + "strconv" "time" . "github.com/pingcap/check" @@ -85,7 +86,7 @@ func (s *testUtilSuite) TestDumpBinaryTime(c *C) { c.Assert(err, IsNil) d = dumpBinaryDateTime(nil, t) // 201 & 7 composed to uint16 1993 (litter-endian) - c.Assert(d, DeepEquals, []byte{11, 201, 7, 7, 13, 1, 1, 1, 0, 0, 0, 0}) + c.Assert(d, DeepEquals, []byte{7, 201, 7, 7, 13, 1, 1, 1}) t, err = types.ParseDate(nil, "0000-00-00") c.Assert(err, IsNil) @@ -139,7 +140,7 @@ func (s *testUtilSuite) TestDumpTextValue(c *C) { c.Assert(err, IsNil) c.Assert(mustDecodeStr(c, bs), Equals, "11") - columns[0].Flag = columns[0].Flag | uint16(mysql.UnsignedFlag) + columns[0].Flag |= uint16(mysql.UnsignedFlag) bs, err = dumpTextRow(nil, columns, chunk.MutRowFromDatums([]types.Datum{types.NewUintDatum(11)}).ToRow()) c.Assert(err, IsNil) c.Assert(mustDecodeStr(c, bs), Equals, "11") @@ -251,6 +252,7 @@ func mustDecodeStr(c *C, b []byte) string { } func (s *testUtilSuite) TestAppendFormatFloat(c *C) { + infVal, _ := strconv.ParseFloat("+Inf", 64) tests := []struct { fVal float64 out string @@ -331,7 +333,7 @@ func (s *testUtilSuite) TestAppendFormatFloat(c *C) { }, { 0.0000000000000009, - "0.000", + "9e-16", 3, 64, }, @@ -341,6 +343,90 @@ func (s *testUtilSuite) TestAppendFormatFloat(c *C) { -1, 64, }, + { + -340282346638528860000000000000000000000, + "-3.40282e38", + -1, + 32, + }, + { + -34028236, + "-34028236.00", + 2, + 32, + }, + { + -17976921.34, + "-17976921.34", + 2, + 64, + }, + { + -3.402823466e+38, + "-3.40282e38", + -1, + 32, + }, + { + -1.7976931348623157e308, + "-1.7976931348623157e308", + -1, + 64, + }, + { + 10.0e20, + "1e21", + -1, + 32, + }, + { + 1e20, + "1e20", + -1, + 32, + }, + { + 10.0, + "10", + -1, + 32, + }, + { + 999999986991104, + "1e15", + -1, + 32, + }, + { + 1e15, + "1e15", + -1, + 32, + }, + { + infVal, + "0", + -1, + 64, + }, + { + -infVal, + "0", + -1, + 64, + }, + { + 1e14, + "100000000000000", + -1, + 64, + }, + { + 1e308, + "1e308", + -1, + 64, + }, } for _, t := range tests { c.Assert(string(appendFormatFloat(nil, t.fVal, t.prec, t.bitSize)), Equals, t.out) diff --git a/session/bootstrap.go b/session/bootstrap.go index 88bb3f62c56e3..b8c8d20b77489 100644 --- a/session/bootstrap.go +++ b/session/bootstrap.go @@ -28,17 +28,23 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/parser" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/bindinfo" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/logutil" + utilparser "github.com/pingcap/tidb/util/parser" + "github.com/pingcap/tidb/util/sqlexec" "github.com/pingcap/tidb/util/timeutil" "go.uber.org/zap" ) @@ -79,7 +85,9 @@ const ( Reload_priv ENUM('N','Y') NOT NULL DEFAULT 'N', FILE_priv ENUM('N','Y') NOT NULL DEFAULT 'N', Config_priv ENUM('N','Y') NOT NULL DEFAULT 'N', - Create_Tablespace_Priv ENUM('N','Y') NOT NULL DEFAULT 'N', + Create_Tablespace_Priv ENUM('N','Y') NOT NULL DEFAULT 'N', + Repl_slave_priv ENUM('N','Y') NOT NULL DEFAULT 'N', + Repl_client_priv ENUM('N','Y') NOT NULL DEFAULT 'N', PRIMARY KEY (Host, User));` // CreateGlobalPrivTable is the SQL statement creates Global scope privilege table in system db. CreateGlobalPrivTable = "CREATE TABLE IF NOT EXISTS mysql.global_priv (" + @@ -182,7 +190,7 @@ const ( tot_col_size BIGINT(64) NOT NULL DEFAULT 0, modify_count BIGINT(64) NOT NULL DEFAULT 0, version BIGINT(64) UNSIGNED NOT NULL DEFAULT 0, - cm_sketch BLOB, + cm_sketch BLOB(6291456), stats_ver BIGINT(64) NOT NULL DEFAULT 0, flag BIGINT(64) NOT NULL DEFAULT 0, correlation DOUBLE NOT NULL DEFAULT 0, @@ -200,6 +208,7 @@ const ( repeats BIGINT(64) NOT NULL, upper_bound BLOB NOT NULL, lower_bound BLOB , + ndv BIGINT NOT NULL DEFAULT 0, UNIQUE INDEX tbl(table_id, is_index, hist_id, bucket_id) );` @@ -234,15 +243,15 @@ const ( // CreateBindInfoTable stores the sql bind info which is used to update globalBindCache. CreateBindInfoTable = `CREATE TABLE IF NOT EXISTS mysql.bind_info ( - original_sql TEXT NOT NULL , - bind_sql TEXT NOT NULL , - default_db TEXT NOT NULL, - status TEXT NOT NULL, - create_time TIMESTAMP(3) NOT NULL, - update_time TIMESTAMP(3) NOT NULL, - charset TEXT NOT NULL, - collation TEXT NOT NULL, - source VARCHAR(10) NOT NULL DEFAULT 'unknown', + original_sql TEXT NOT NULL, + bind_sql TEXT NOT NULL, + default_db TEXT NOT NULL, + status TEXT NOT NULL, + create_time TIMESTAMP(3) NOT NULL, + update_time TIMESTAMP(3) NOT NULL, + charset TEXT NOT NULL, + collation TEXT NOT NULL, + source VARCHAR(10) NOT NULL DEFAULT 'unknown', INDEX sql_index(original_sql(1024),default_db(1024)) COMMENT "accelerate the speed when add global binding query", INDEX time_index(update_time) COMMENT "accelerate the speed when querying with last update time" ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;` @@ -276,6 +285,15 @@ const ( INDEX tbl(table_id, is_index, hist_id) );` + // CreateStatsFMSketchTable stores FMSketch data of a column histogram. + CreateStatsFMSketchTable = `CREATE TABLE IF NOT EXISTS mysql.stats_fm_sketch ( + table_id BIGINT(64) NOT NULL, + is_index TINYINT(2) NOT NULL, + hist_id BIGINT(64) NOT NULL, + value LONGBLOB, + INDEX tbl(table_id, is_index, hist_id) + );` + // CreateExprPushdownBlacklist stores the expressions which are not allowed to be pushed down. CreateExprPushdownBlacklist = `CREATE TABLE IF NOT EXISTS mysql.expr_pushdown_blacklist ( name CHAR(100) NOT NULL, @@ -290,30 +308,26 @@ const ( // CreateStatsExtended stores the registered extended statistics. CreateStatsExtended = `CREATE TABLE IF NOT EXISTS mysql.stats_extended ( - stats_name varchar(32) NOT NULL, - db varchar(32) NOT NULL, + name varchar(32) NOT NULL, type tinyint(4) NOT NULL, table_id bigint(64) NOT NULL, column_ids varchar(32) NOT NULL, - scalar_stats double DEFAULT NULL, - blob_stats blob DEFAULT NULL, + stats blob DEFAULT NULL, version bigint(64) unsigned NOT NULL, status tinyint(4) NOT NULL, - PRIMARY KEY(stats_name, db), + PRIMARY KEY(name, table_id), KEY idx_1 (table_id, status, version), KEY idx_2 (status, version) );` // CreateSchemaIndexUsageTable stores the index usage information. CreateSchemaIndexUsageTable = `CREATE TABLE IF NOT EXISTS mysql.schema_index_usage ( - TABLE_SCHEMA varchar(64), - TABLE_NAME varchar(64), - INDEX_NAME varchar(64), + TABLE_ID bigint(64), + INDEX_ID bigint(21), QUERY_COUNT bigint(64), ROWS_SELECTED bigint(64), LAST_USED_AT timestamp, - LAST_UPDATED_AT timestamp, - PRIMARY KEY(TABLE_SCHEMA, TABLE_NAME, INDEX_NAME) + PRIMARY KEY(TABLE_ID, INDEX_ID) );` ) @@ -364,6 +378,12 @@ const ( tidbSystemTZ = "system_tz" // The variable name in mysql.tidb table and it will indicate if the new collations are enabled in the TiDB cluster. tidbNewCollationEnabled = "new_collation_enabled" + // The variable name in mysql.tidb table and it records the default value of + // mem-quota-query when upgrade from v3.0.x to v4.0.9+. + tidbDefMemoryQuotaQuery = "default_memory_quota_query" + // The variable name in mysql.tidb table and it records the default value of + // oom-action when upgrade from v3.0.x to v4.0.11+. + tidbDefOOMAction = "default_oom_action" // Const for TiDB server version 2. version2 = 2 version3 = 3 @@ -402,7 +422,7 @@ const ( version36 = 36 version37 = 37 version38 = 38 - version39 = 39 + // version39 will be redone in version46 so it's skipped here. // version40 is the version that introduce new collation in TiDB, // see https://github.com/pingcap/tidb/pull/14574 for more details. version40 = 40 @@ -420,13 +440,46 @@ const ( // version47 add Source to bindings to indicate the way binding created. version47 = 47 // version48 reset all deprecated concurrency related system-variables if they were all default value. - version48 = 48 // version49 introduces mysql.stats_extended table. - version49 = 49 + // Both version48 and version49 will be redone in version55 and version56 so they're skipped here. // version50 add mysql.schema_index_usage table. version50 = 50 // version51 introduces CreateTablespacePriv to mysql.user. - version51 = 51 + // version51 will be redone in version63 so it's skipped here. + // version52 change mysql.stats_histograms cm_sketch column from blob to blob(6291456) + version52 = 52 + // version53 introduce Global variable tidb_enable_strict_double_type_check + version53 = 53 + // version54 writes a variable `mem_quota_query` to mysql.tidb if it's a cluster upgraded from v3.0.x to v4.0.9+. + version54 = 54 + // version55 fixes the bug that upgradeToVer48 would be missed when upgrading from v4.0 to a new version + version55 = 55 + // version56 fixes the bug that upgradeToVer49 would be missed when upgrading from v4.0 to a new version + version56 = 56 + // version57 fixes the bug of concurrent create / drop binding + version57 = 57 + // version58 add `Repl_client_priv` and `Repl_slave_priv` to `mysql.user` + // version58 will be redone in version64 so it's skipped here. + // version59 add writes a variable `oom-action` to mysql.tidb if it's a cluster upgraded from v3.0.x to v4.0.11+. + version59 = 59 + // version60 redesigns `mysql.stats_extended` + version60 = 60 + // version61 will be redone in version67 + // version62 add column ndv for mysql.stats_buckets. + version62 = 62 + // version63 fixes the bug that upgradeToVer51 would be missed when upgrading from v4.0 to a new version + version63 = 63 + // version64 is redone upgradeToVer58 after upgradeToVer63, this is to preserve the order of the columns in mysql.user + version64 = 64 + // version65 add mysql.stats_fm_sketch table. + version65 = 65 + // version66 enables the feature `track_aggregate_memory_usage` by default. + version66 = 66 + // version67 restore all SQL bindings. + version67 = 67 + + // please make sure this is the largest version + currentBootstrapVersion = version67 ) var ( @@ -468,7 +521,8 @@ var ( upgradeToVer36, upgradeToVer37, upgradeToVer38, - upgradeToVer39, + // We will redo upgradeToVer39 in upgradeToVer46, + // so upgradeToVer39 is skipped here. upgradeToVer40, upgradeToVer41, upgradeToVer42, @@ -477,16 +531,32 @@ var ( upgradeToVer45, upgradeToVer46, upgradeToVer47, - upgradeToVer48, - upgradeToVer49, + // We will redo upgradeToVer48 and upgradeToVer49 in upgradeToVer55 and upgradeToVer56, + // so upgradeToVer48 and upgradeToVer49 is skipped here. upgradeToVer50, - upgradeToVer51, + // We will redo upgradeToVer51 in upgradeToVer63, it is skipped here. + upgradeToVer52, + upgradeToVer53, + upgradeToVer54, + upgradeToVer55, + upgradeToVer56, + upgradeToVer57, + // We will redo upgradeToVer58 in upgradeToVer64, it is skipped here. + upgradeToVer59, + upgradeToVer60, + // We will redo upgradeToVer61 in upgradeToVer67, it is skipped here. + upgradeToVer62, + upgradeToVer63, + upgradeToVer64, + upgradeToVer65, + upgradeToVer66, + upgradeToVer67, } ) func checkBootstrapped(s Session) (bool, error) { // Check if system db exists. - _, err := s.Execute(context.Background(), fmt.Sprintf("USE %s;", mysql.SystemDB)) + _, err := s.ExecuteInternal(context.Background(), "USE %n", mysql.SystemDB) if err != nil && infoschema.ErrDatabaseNotExists.NotEqual(err) { logutil.BgLogger().Fatal("check bootstrap error", zap.Error(err)) @@ -512,20 +582,21 @@ func checkBootstrapped(s Session) (bool, error) { // getTiDBVar gets variable value from mysql.tidb table. // Those variables are used by TiDB server. func getTiDBVar(s Session, name string) (sVal string, isNull bool, e error) { - sql := fmt.Sprintf(`SELECT HIGH_PRIORITY VARIABLE_VALUE FROM %s.%s WHERE VARIABLE_NAME="%s"`, - mysql.SystemDB, mysql.TiDBTable, name) ctx := context.Background() - rs, err := s.Execute(ctx, sql) + rs, err := s.ExecuteInternal(ctx, `SELECT HIGH_PRIORITY VARIABLE_VALUE FROM %n.%n WHERE VARIABLE_NAME= %?`, + mysql.SystemDB, + mysql.TiDBTable, + name, + ) if err != nil { return "", true, errors.Trace(err) } - if len(rs) != 1 { + if rs == nil { return "", true, errors.New("Wrong number of Recordset") } - r := rs[0] - defer terror.Call(r.Close) - req := r.NewChunk() - err = r.Next(ctx, req) + defer terror.Call(rs.Close) + req := rs.NewChunk() + err = rs.Next(ctx, req) if err != nil || req.NumRows() == 0 { return "", true, errors.Trace(err) } @@ -551,7 +622,7 @@ func upgrade(s Session) { } updateBootstrapVer(s) - _, err = s.Execute(context.Background(), "COMMIT") + _, err = s.ExecuteInternal(context.Background(), "COMMIT") if err != nil { sleepTime := 1 * time.Second @@ -598,9 +669,7 @@ func upgradeToVer3(s Session, ver int64) { return } // Version 3 fix tx_read_only variable value. - sql := fmt.Sprintf("UPDATE HIGH_PRIORITY %s.%s SET variable_value = '0' WHERE variable_name = 'tx_read_only';", - mysql.SystemDB, mysql.GlobalVariablesTable) - mustExecute(s, sql) + mustExecute(s, "UPDATE HIGH_PRIORITY %n.%n SET variable_value = '0' WHERE variable_name = 'tx_read_only';", mysql.SystemDB, mysql.GlobalVariablesTable) } // upgradeToVer4 updates to version 4. @@ -608,8 +677,7 @@ func upgradeToVer4(s Session, ver int64) { if ver >= version4 { return } - sql := CreateStatsMetaTable - mustExecute(s, sql) + mustExecute(s, CreateStatsMetaTable) } func upgradeToVer5(s Session, ver int64) { @@ -643,7 +711,7 @@ func upgradeToVer8(s Session, ver int64) { return } // This is a dummy upgrade, it checks whether upgradeToVer7 success, if not, do it again. - if _, err := s.Execute(context.Background(), "SELECT HIGH_PRIORITY `Process_priv` FROM mysql.user LIMIT 0"); err == nil { + if _, err := s.ExecuteInternal(context.Background(), "SELECT HIGH_PRIORITY `Process_priv` FROM mysql.user LIMIT 0"); err == nil { return } upgradeToVer7(s, ver) @@ -659,7 +727,7 @@ func upgradeToVer9(s Session, ver int64) { } func doReentrantDDL(s Session, sql string, ignorableErrs ...error) { - _, err := s.Execute(context.Background(), sql) + _, err := s.ExecuteInternal(context.Background(), sql) for _, ignorableErr := range ignorableErrs { if terror.ErrorEqual(err, ignorableErr) { return @@ -685,7 +753,7 @@ func upgradeToVer11(s Session, ver int64) { if ver >= version11 { return } - _, err := s.Execute(context.Background(), "ALTER TABLE mysql.user ADD COLUMN `References_priv` ENUM('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' AFTER `Grant_priv`") + _, err := s.ExecuteInternal(context.Background(), "ALTER TABLE mysql.user ADD COLUMN `References_priv` ENUM('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' AFTER `Grant_priv`") if err != nil { if terror.ErrorEqual(err, infoschema.ErrColumnExists) { return @@ -700,21 +768,20 @@ func upgradeToVer12(s Session, ver int64) { return } ctx := context.Background() - _, err := s.Execute(ctx, "BEGIN") + _, err := s.ExecuteInternal(ctx, "BEGIN") terror.MustNil(err) sql := "SELECT HIGH_PRIORITY user, host, password FROM mysql.user WHERE password != ''" - rs, err := s.Execute(ctx, sql) + rs, err := s.ExecuteInternal(ctx, sql) if terror.ErrorEqual(err, core.ErrUnknownColumn) { sql := "SELECT HIGH_PRIORITY user, host, authentication_string FROM mysql.user WHERE authentication_string != ''" - rs, err = s.Execute(ctx, sql) + rs, err = s.ExecuteInternal(ctx, sql) } terror.MustNil(err) - r := rs[0] sqls := make([]string, 0, 1) - defer terror.Call(r.Close) - req := r.NewChunk() + defer terror.Call(rs.Close) + req := rs.NewChunk() it := chunk.NewIterator4Chunk(req) - err = r.Next(ctx, req) + err = rs.Next(ctx, req) for err == nil && req.NumRows() != 0 { for row := it.Begin(); row != it.End(); row = it.Next() { user := row.GetString(0) @@ -726,7 +793,7 @@ func upgradeToVer12(s Session, ver int64) { updateSQL := fmt.Sprintf(`UPDATE HIGH_PRIORITY mysql.user SET password = "%s" WHERE user="%s" AND host="%s"`, newPass, user, host) sqls = append(sqls, updateSQL) } - err = r.Next(ctx, req) + err = rs.Next(ctx, req) } terror.MustNil(err) @@ -756,7 +823,7 @@ func upgradeToVer13(s Session, ver int64) { } ctx := context.Background() for _, sql := range sqls { - _, err := s.Execute(ctx, sql) + _, err := s.ExecuteInternal(ctx, sql) if err != nil { if terror.ErrorEqual(err, infoschema.ErrColumnExists) { continue @@ -785,7 +852,7 @@ func upgradeToVer14(s Session, ver int64) { } ctx := context.Background() for _, sql := range sqls { - _, err := s.Execute(ctx, sql) + _, err := s.ExecuteInternal(ctx, sql) if err != nil { if terror.ErrorEqual(err, infoschema.ErrColumnExists) { continue @@ -800,7 +867,7 @@ func upgradeToVer15(s Session, ver int64) { return } var err error - _, err = s.Execute(context.Background(), CreateGCDeleteRangeTable) + _, err = s.ExecuteInternal(context.Background(), CreateGCDeleteRangeTable) if err != nil { logutil.BgLogger().Fatal("upgradeToVer15 error", zap.Error(err)) } @@ -870,9 +937,13 @@ func upgradeToVer23(s Session, ver int64) { // writeSystemTZ writes system timezone info into mysql.tidb func writeSystemTZ(s Session) { - sql := fmt.Sprintf(`INSERT HIGH_PRIORITY INTO %s.%s VALUES ("%s", "%s", "TiDB Global System Timezone.") ON DUPLICATE KEY UPDATE VARIABLE_VALUE="%s"`, - mysql.SystemDB, mysql.TiDBTable, tidbSystemTZ, timeutil.InferSystemTZ(), timeutil.InferSystemTZ()) - mustExecute(s, sql) + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, "TiDB Global System Timezone.") ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, + mysql.SystemDB, + mysql.TiDBTable, + tidbSystemTZ, + timeutil.InferSystemTZ(), + timeutil.InferSystemTZ(), + ) } // upgradeToVer24 initializes `System` timezone according to docs/design/2018-09-10-adding-tz-env.md @@ -1001,31 +1072,21 @@ func upgradeToVer38(s Session, ver int64) { return } var err error - _, err = s.Execute(context.Background(), CreateGlobalPrivTable) + _, err = s.ExecuteInternal(context.Background(), CreateGlobalPrivTable) if err != nil { logutil.BgLogger().Fatal("upgradeToVer38 error", zap.Error(err)) } } -func upgradeToVer39(s Session, ver int64) { - if ver >= version39 { - return - } - doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN `Reload_priv` ENUM('N','Y') DEFAULT 'N'", infoschema.ErrColumnExists) - doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN `File_priv` ENUM('N','Y') DEFAULT 'N'", infoschema.ErrColumnExists) - mustExecute(s, "UPDATE HIGH_PRIORITY mysql.user SET Reload_priv='Y' WHERE Super_priv='Y'") - mustExecute(s, "UPDATE HIGH_PRIORITY mysql.user SET File_priv='Y' WHERE Super_priv='Y'") -} - func writeNewCollationParameter(s Session, flag bool) { comment := "If the new collations are enabled. Do not edit it." b := varFalse if flag { b = varTrue } - sql := fmt.Sprintf(`INSERT HIGH_PRIORITY INTO %s.%s VALUES ("%s", '%s', '%s') ON DUPLICATE KEY UPDATE VARIABLE_VALUE='%s'`, - mysql.SystemDB, mysql.TiDBTable, tidbNewCollationEnabled, b, comment, b) - mustExecute(s, sql) + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE=%?`, + mysql.SystemDB, mysql.TiDBTable, tidbNewCollationEnabled, b, comment, b, + ) } func upgradeToVer40(s Session, ver int64) { @@ -1047,8 +1108,7 @@ func upgradeToVer41(s Session, ver int64) { // writeDefaultExprPushDownBlacklist writes default expr pushdown blacklist into mysql.expr_pushdown_blacklist func writeDefaultExprPushDownBlacklist(s Session) { mustExecute(s, "INSERT HIGH_PRIORITY INTO mysql.expr_pushdown_blacklist VALUES"+ - "('date_add','tiflash', 'DST(daylight saving time) does not take effect in TiFlash date_add'),"+ - "('cast','tiflash', 'Behavior of some corner cases(overflow, truncate etc) is different in TiFlash and TiDB')") + "('date_add','tiflash', 'DST(daylight saving time) does not take effect in TiFlash date_add')") } func upgradeToVer42(s Session, ver int64) { @@ -1062,14 +1122,14 @@ func upgradeToVer42(s Session, ver int64) { // Convert statement summary global variables to non-empty values. func writeStmtSummaryVars(s Session) { - sql := fmt.Sprintf("UPDATE %s.%s SET variable_value='%%s' WHERE variable_name='%%s' AND variable_value=''", mysql.SystemDB, mysql.GlobalVariablesTable) + sql := "UPDATE %n.%n SET variable_value= %? WHERE variable_name= %? AND variable_value=''" stmtSummaryConfig := config.GetGlobalConfig().StmtSummary - mustExecute(s, fmt.Sprintf(sql, variable.BoolToIntStr(stmtSummaryConfig.Enable), variable.TiDBEnableStmtSummary)) - mustExecute(s, fmt.Sprintf(sql, variable.BoolToIntStr(stmtSummaryConfig.EnableInternalQuery), variable.TiDBStmtSummaryInternalQuery)) - mustExecute(s, fmt.Sprintf(sql, strconv.Itoa(stmtSummaryConfig.RefreshInterval), variable.TiDBStmtSummaryRefreshInterval)) - mustExecute(s, fmt.Sprintf(sql, strconv.Itoa(stmtSummaryConfig.HistorySize), variable.TiDBStmtSummaryHistorySize)) - mustExecute(s, fmt.Sprintf(sql, strconv.FormatUint(uint64(stmtSummaryConfig.MaxStmtCount), 10), variable.TiDBStmtSummaryMaxStmtCount)) - mustExecute(s, fmt.Sprintf(sql, strconv.FormatUint(uint64(stmtSummaryConfig.MaxSQLLength), 10), variable.TiDBStmtSummaryMaxSQLLength)) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, variable.BoolToOnOff(stmtSummaryConfig.Enable), variable.TiDBEnableStmtSummary) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, variable.BoolToOnOff(stmtSummaryConfig.EnableInternalQuery), variable.TiDBStmtSummaryInternalQuery) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, strconv.Itoa(stmtSummaryConfig.RefreshInterval), variable.TiDBStmtSummaryRefreshInterval) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, strconv.Itoa(stmtSummaryConfig.HistorySize), variable.TiDBStmtSummaryHistorySize) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, strconv.FormatUint(uint64(stmtSummaryConfig.MaxStmtCount), 10), variable.TiDBStmtSummaryMaxStmtCount) + mustExecute(s, sql, mysql.SystemDB, mysql.GlobalVariablesTable, strconv.FormatUint(uint64(stmtSummaryConfig.MaxSQLLength), 10), variable.TiDBStmtSummaryMaxSQLLength) } func upgradeToVer43(s Session, ver int64) { @@ -1113,8 +1173,52 @@ func upgradeToVer47(s Session, ver int64) { doReentrantDDL(s, "ALTER TABLE mysql.bind_info ADD COLUMN `source` varchar(10) NOT NULL default 'unknown'", infoschema.ErrColumnExists) } -func upgradeToVer48(s Session, ver int64) { - if ver >= version48 { +func upgradeToVer50(s Session, ver int64) { + if ver >= version50 { + return + } + doReentrantDDL(s, CreateSchemaIndexUsageTable) +} + +func upgradeToVer52(s Session, ver int64) { + if ver >= version52 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.stats_histograms MODIFY cm_sketch BLOB(6291456)") +} + +func upgradeToVer53(s Session, ver int64) { + if ver >= version53 { + return + } + // when upgrade from old tidb and no `tidb_enable_strict_double_type_check` in GLOBAL_VARIABLES, init it with 1` + sql := fmt.Sprintf("INSERT IGNORE INTO %s.%s (`VARIABLE_NAME`, `VARIABLE_VALUE`) VALUES ('%s', '%d')", + mysql.SystemDB, mysql.GlobalVariablesTable, variable.TiDBEnableStrictDoubleTypeCheck, 0) + mustExecute(s, sql) +} + +func upgradeToVer54(s Session, ver int64) { + if ver >= version54 { + return + } + // The mem-query-quota default value is 32GB by default in v3.0, and 1GB by + // default in v4.0. + // If a cluster is upgraded from v3.0.x (bootstrapVer <= version38) to + // v4.0.9+, we'll write the default value to mysql.tidb. Thus we can get the + // default value of mem-quota-query, and promise the compatibility even if + // the tidb-server restarts. + // If it's a newly deployed cluster, we do not need to write the value into + // mysql.tidb, since no compatibility problem will happen. + if ver <= version38 { + writeMemoryQuotaQuery(s) + } +} + +// When cherry-pick upgradeToVer52 to v4.0, we wrongly name it upgradeToVer48. +// If we upgrade from v4.0 to a newer version, the real upgradeToVer48 will be missed. +// So we redo upgradeToVer48 here to make sure the upgrading from v4.0 succeeds. +func upgradeToVer55(s Session, ver int64) { + if ver >= version55 { return } defValues := map[string]string{ @@ -1133,13 +1237,12 @@ func upgradeToVer48(s Session, ver int64) { selectSQL := "select HIGH_PRIORITY * from mysql.global_variables where variable_name in ('" + strings.Join(names, quoteCommaQuote) + "')" ctx := context.Background() - rs, err := s.Execute(ctx, selectSQL) + rs, err := s.ExecuteInternal(ctx, selectSQL) terror.MustNil(err) - r := rs[0] - defer terror.Call(r.Close) - req := r.NewChunk() + defer terror.Call(rs.Close) + req := rs.NewChunk() it := chunk.NewIterator4Chunk(req) - err = r.Next(ctx, req) + err = rs.Next(ctx, req) for err == nil && req.NumRows() != 0 { for row := it.Begin(); row != it.End(); row = it.Next() { n := strings.ToLower(row.GetString(0)) @@ -1148,7 +1251,7 @@ func upgradeToVer48(s Session, ver int64) { return } } - err = r.Next(ctx, req) + err = rs.Next(ctx, req) } terror.MustNil(err) @@ -1161,34 +1264,215 @@ func upgradeToVer48(s Session, ver int64) { mustExecute(s, "COMMIT") } -func upgradeToVer49(s Session, ver int64) { - if ver >= version49 { +// When cherry-pick upgradeToVer54 to v4.0, we wrongly name it upgradeToVer49. +// If we upgrade from v4.0 to a newer version, the real upgradeToVer49 will be missed. +// So we redo upgradeToVer49 here to make sure the upgrading from v4.0 succeeds. +func upgradeToVer56(s Session, ver int64) { + if ver >= version56 { return } doReentrantDDL(s, CreateStatsExtended) } -func upgradeToVer50(s Session, ver int64) { - if ver >= version50 { +func upgradeToVer57(s Session, ver int64) { + if ver >= version57 { return } - doReentrantDDL(s, CreateSchemaIndexUsageTable) + insertBuiltinBindInfoRow(s) +} + +func initBindInfoTable(s Session) { + mustExecute(s, CreateBindInfoTable) + insertBuiltinBindInfoRow(s) +} + +func insertBuiltinBindInfoRow(s Session) { + mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.bind_info VALUES (%?, %?, "mysql", %?, "0000-00-00 00:00:00", "0000-00-00 00:00:00", "", "", %?)`, + bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.BuiltinPseudoSQL4BindLock, bindinfo.Builtin, bindinfo.Builtin, + ) } -func upgradeToVer51(s Session, ver int64) { - if ver >= version51 { +func upgradeToVer59(s Session, ver int64) { + if ver >= version59 { + return + } + // The oom-action default value is log by default in v3.0, and cancel by + // default in v4.0.11+. + // If a cluster is upgraded from v3.0.x (bootstrapVer <= version59) to + // v4.0.11+, we'll write the default value to mysql.tidb. Thus we can get + // the default value of oom-action, and promise the compatibility even if + // the tidb-server restarts. + // If it's a newly deployed cluster, we do not need to write the value into + // mysql.tidb, since no compatibility problem will happen. + writeOOMAction(s) +} + +func upgradeToVer60(s Session, ver int64) { + if ver >= version60 { + return + } + mustExecute(s, "DROP TABLE IF EXISTS mysql.stats_extended") + doReentrantDDL(s, CreateStatsExtended) +} + +type bindInfo struct { + bindSQL string + status string + createTime types.Time + charset string + collation string + source string +} + +func upgradeToVer67(s Session, ver int64) { + if ver >= version67 { + return + } + bindMap := make(map[string]bindInfo) + h := &bindinfo.BindHandle{} + var err error + mustExecute(s, "BEGIN PESSIMISTIC") + + defer func() { + if err != nil { + mustExecute(s, "ROLLBACK") + return + } + + mustExecute(s, "COMMIT") + }() + mustExecute(s, h.LockBindInfoSQL()) + var rs sqlexec.RecordSet + rs, err = s.ExecuteInternal(context.Background(), + `SELECT bind_sql, default_db, status, create_time, charset, collation, source + FROM mysql.bind_info + WHERE source != 'builtin' + ORDER BY update_time DESC`) + if err != nil { + logutil.BgLogger().Fatal("upgradeToVer67 error", zap.Error(err)) + } + if rs != nil { + defer terror.Call(rs.Close) + } + req := rs.NewChunk() + iter := chunk.NewIterator4Chunk(req) + p := parser.New() + now := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 3) + for { + err = rs.Next(context.TODO(), req) + if err != nil { + logutil.BgLogger().Fatal("upgradeToVer67 error", zap.Error(err)) + } + if req.NumRows() == 0 { + break + } + updateBindInfo(iter, p, bindMap) + } + + mustExecute(s, "DELETE FROM mysql.bind_info where source != 'builtin'") + for original, bind := range bindMap { + mustExecute(s, fmt.Sprintf("INSERT INTO mysql.bind_info VALUES(%s, %s, '', %s, %s, %s, %s, %s, %s)", + expression.Quote(original), + expression.Quote(bind.bindSQL), + expression.Quote(bind.status), + expression.Quote(bind.createTime.String()), + expression.Quote(now.String()), + expression.Quote(bind.charset), + expression.Quote(bind.collation), + expression.Quote(bind.source), + )) + } +} + +func updateBindInfo(iter *chunk.Iterator4Chunk, p *parser.Parser, bindMap map[string]bindInfo) { + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + bind := row.GetString(0) + db := row.GetString(1) + charset := row.GetString(4) + collation := row.GetString(5) + stmt, err := p.ParseOneStmt(bind, charset, collation) + if err != nil { + logutil.BgLogger().Fatal("updateBindInfo error", zap.Error(err)) + } + originWithDB := parser.Normalize(utilparser.RestoreWithDefaultDB(stmt, db, bind)) + if _, ok := bindMap[originWithDB]; ok { + // The results are sorted in descending order of time. + // And in the following cases, duplicate originWithDB may occur + // originalText |bindText |DB + // `select * from t` |`select /*+ use_index(t, idx) */ * from t` |`test` + // `select * from test.t` |`select /*+ use_index(t, idx) */ * from test.t`|`` + // Therefore, if repeated, we can skip to keep the latest binding. + continue + } + bindMap[originWithDB] = bindInfo{ + bindSQL: utilparser.RestoreWithDefaultDB(stmt, db, bind), + status: row.GetString(2), + createTime: row.GetTime(3), + charset: charset, + collation: collation, + source: row.GetString(6), + } + } +} + +func writeMemoryQuotaQuery(s Session) { + comment := "memory_quota_query is 32GB by default in v3.0.x, 1GB by default in v4.0.x+" + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE=%?`, + mysql.SystemDB, mysql.TiDBTable, tidbDefMemoryQuotaQuery, 32<<30, comment, 32<<30, + ) +} + +func upgradeToVer62(s Session, ver int64) { + if ver >= version62 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.stats_buckets ADD COLUMN `ndv` bigint not null default 0", infoschema.ErrColumnExists) +} + +func upgradeToVer63(s Session, ver int64) { + if ver >= version63 { return } doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN `Create_tablespace_priv` ENUM('N','Y') DEFAULT 'N'", infoschema.ErrColumnExists) mustExecute(s, "UPDATE HIGH_PRIORITY mysql.user SET Create_tablespace_priv='Y' where Super_priv='Y'") } +func upgradeToVer64(s Session, ver int64) { + if ver >= version64 { + return + } + doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN `Repl_slave_priv` ENUM('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' AFTER `Execute_priv`", infoschema.ErrColumnExists) + doReentrantDDL(s, "ALTER TABLE mysql.user ADD COLUMN `Repl_client_priv` ENUM('N','Y') CHARACTER SET utf8 NOT NULL DEFAULT 'N' AFTER `Repl_slave_priv`", infoschema.ErrColumnExists) + mustExecute(s, "UPDATE HIGH_PRIORITY mysql.user SET Repl_slave_priv='Y',Repl_client_priv='Y'") +} + +func upgradeToVer65(s Session, ver int64) { + if ver >= version65 { + return + } + doReentrantDDL(s, CreateStatsFMSketchTable) +} + +func upgradeToVer66(s Session, ver int64) { + if ver >= version66 { + return + } + mustExecute(s, "set @@global.tidb_track_aggregate_memory_usage = 1") +} + +func writeOOMAction(s Session) { + comment := "oom-action is `log` by default in v3.0.x, `cancel` by default in v4.0.11+" + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, %?) ON DUPLICATE KEY UPDATE VARIABLE_VALUE= %?`, + mysql.SystemDB, mysql.TiDBTable, tidbDefOOMAction, config.OOMActionLog, comment, config.OOMActionLog, + ) +} + // updateBootstrapVer updates bootstrap version variable in mysql.TiDB table. func updateBootstrapVer(s Session) { // Update bootstrap version. - sql := fmt.Sprintf(`INSERT HIGH_PRIORITY INTO %s.%s VALUES ("%s", "%d", "TiDB bootstrap version.") ON DUPLICATE KEY UPDATE VARIABLE_VALUE="%d"`, - mysql.SystemDB, mysql.TiDBTable, tidbServerVersionVar, currentBootstrapVersion, currentBootstrapVersion) - mustExecute(s, sql) + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES (%?, %?, "TiDB bootstrap version.") ON DUPLICATE KEY UPDATE VARIABLE_VALUE=%?`, + mysql.SystemDB, mysql.TiDBTable, tidbServerVersionVar, currentBootstrapVersion, currentBootstrapVersion, + ) } // getBootstrapVersion gets bootstrap version from mysql.tidb table; @@ -1208,7 +1492,7 @@ func doDDLWorks(s Session) { // Create a test database. mustExecute(s, "CREATE DATABASE IF NOT EXISTS test") // Create system db. - mustExecute(s, fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s;", mysql.SystemDB)) + mustExecute(s, "CREATE DATABASE IF NOT EXISTS %n", mysql.SystemDB) // Create user table. mustExecute(s, CreateUserTable) // Create privilege tables. @@ -1239,7 +1523,7 @@ func doDDLWorks(s Session) { // Create default_roles table. mustExecute(s, CreateDefaultRolesTable) // Create bind_info table. - mustExecute(s, CreateBindInfoTable) + initBindInfoTable(s) // Create stats_topn_store table. mustExecute(s, CreateStatsTopNTable) // Create expr_pushdown_blacklist table. @@ -1250,16 +1534,19 @@ func doDDLWorks(s Session) { mustExecute(s, CreateStatsExtended) // Create schema_index_usage. mustExecute(s, CreateSchemaIndexUsageTable) + // Create stats_fm_sketch table. + mustExecute(s, CreateStatsFMSketchTable) } // doDMLWorks executes DML statements in bootstrap stage. // All the statements run in a single transaction. +// TODO: sanitize. func doDMLWorks(s Session) { mustExecute(s, "BEGIN") // Insert a default user with empty password. mustExecute(s, `INSERT HIGH_PRIORITY INTO mysql.user VALUES - ("%", "root", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y")`) + ("%", "root", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y")`) // Init global system variables table. values := make([]string, 0, len(variable.GetSysVars())) @@ -1273,16 +1560,26 @@ func doDMLWorks(s Session) { if v.Name == variable.TiDBRowFormatVersion { vVal = strconv.Itoa(variable.DefTiDBRowFormatV2) } - if v.Name == variable.TiDBEnableClusteredIndex { - vVal = "1" - } if v.Name == variable.TiDBPartitionPruneMode { - vVal = string(variable.StaticOnly) + vVal = string(variable.Static) if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil || config.CheckTableBeforeDrop { // enable Dynamic Prune by default in test case. - vVal = string(variable.DynamicOnly) + vVal = string(variable.Dynamic) } } + if v.Name == variable.TiDBEnableChangeMultiSchema { + vVal = variable.BoolOff + if flag.Lookup("test.v") != nil || flag.Lookup("check.v") != nil { + // enable change multi schema in test case for compatibility with old cases. + vVal = variable.BoolOn + } + } + if v.Name == variable.TiDBEnableAsyncCommit && config.GetGlobalConfig().Store == "tikv" { + vVal = variable.BoolOn + } + if v.Name == variable.TiDBEnable1PC && config.GetGlobalConfig().Store == "tikv" { + vVal = variable.BoolOn + } value := fmt.Sprintf(`("%s", "%s")`, strings.ToLower(k), vVal) values = append(values, value) } @@ -1291,14 +1588,13 @@ func doDMLWorks(s Session) { strings.Join(values, ", ")) mustExecute(s, sql) - sql = fmt.Sprintf(`INSERT HIGH_PRIORITY INTO %s.%s VALUES("%s", "%s", "Bootstrap flag. Do not delete.") - ON DUPLICATE KEY UPDATE VARIABLE_VALUE="%s"`, - mysql.SystemDB, mysql.TiDBTable, bootstrappedVar, varTrue, varTrue) - mustExecute(s, sql) + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES(%?, %?, "Bootstrap flag. Do not delete.") ON DUPLICATE KEY UPDATE VARIABLE_VALUE=%?`, + mysql.SystemDB, mysql.TiDBTable, bootstrappedVar, varTrue, varTrue, + ) - sql = fmt.Sprintf(`INSERT HIGH_PRIORITY INTO %s.%s VALUES("%s", "%d", "Bootstrap version. Do not delete.")`, - mysql.SystemDB, mysql.TiDBTable, tidbServerVersionVar, currentBootstrapVersion) - mustExecute(s, sql) + mustExecute(s, `INSERT HIGH_PRIORITY INTO %n.%n VALUES(%?, %?, "Bootstrap version. Do not delete.")`, + mysql.SystemDB, mysql.TiDBTable, tidbServerVersionVar, currentBootstrapVersion, + ) writeSystemTZ(s) @@ -1308,7 +1604,7 @@ func doDMLWorks(s Session) { writeStmtSummaryVars(s) - _, err := s.Execute(context.Background(), "COMMIT") + _, err := s.ExecuteInternal(context.Background(), "COMMIT") if err != nil { sleepTime := 1 * time.Second logutil.BgLogger().Info("doDMLWorks failed", zap.Error(err), zap.Duration("sleeping time", sleepTime)) @@ -1325,8 +1621,8 @@ func doDMLWorks(s Session) { } } -func mustExecute(s Session, sql string) { - _, err := s.Execute(context.Background(), sql) +func mustExecute(s Session, sql string, args ...interface{}) { + _, err := s.ExecuteInternal(context.Background(), sql, args...) if err != nil { debug.PrintStack() logutil.BgLogger().Fatal("mustExecute error", zap.Error(err)) diff --git a/session/bootstrap_test.go b/session/bootstrap_test.go index a0c4c6d9127c5..60d2f537bf8eb 100644 --- a/session/bootstrap_test.go +++ b/session/bootstrap_test.go @@ -20,6 +20,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/parser" "github.com/pingcap/parser/auth" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" @@ -54,7 +55,7 @@ func (s *testBootstrapSuite) TestBootstrap(c *C) { c.Assert(err, IsNil) c.Assert(req.NumRows() == 0, IsFalse) datums := statistics.RowToDatums(req.GetRow(0), r.Fields()) - match(c, datums, `%`, "root", []byte(""), "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y") + match(c, datums, `%`, "root", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y") c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "anyhost"}, []byte(""), []byte("")), IsTrue) mustExecSQL(c, se, "USE test;") @@ -159,7 +160,7 @@ func (s *testBootstrapSuite) TestBootstrapWithError(c *C) { c.Assert(req.NumRows() == 0, IsFalse) row := req.GetRow(0) datums := statistics.RowToDatums(row, r.Fields()) - match(c, datums, `%`, "root", []byte(""), "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y") + match(c, datums, `%`, "root", "", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "Y", "N", "Y", "Y", "Y", "Y", "Y", "Y", "Y") c.Assert(r.Close(), IsNil) mustExecSQL(c, se, "USE test;") @@ -271,6 +272,174 @@ func (s *testBootstrapSuite) TestUpgrade(c *C) { c.Assert(r.Close(), IsNil) } +func (s *testBootstrapSuite) TestIssue17979_1(c *C) { + oomAction := config.GetGlobalConfig().OOMAction + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = oomAction + }) + }() + ctx := context.Background() + defer testleak.AfterTest(c)() + store, _ := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + + // test issue 20900, upgrade from v3.0 to v4.0.11+ + seV3 := newSession(c, store, s.dbName) + txn, err := store.Begin() + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(58)) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + mustExecSQL(c, seV3, "update mysql.tidb set variable_value='58' where variable_name='tidb_server_version'") + mustExecSQL(c, seV3, "delete from mysql.tidb where variable_name='default_oom_action'") + mustExecSQL(c, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(58)) + + domV4, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer domV4.Close() + seV4 := newSession(c, store, s.dbName) + ver, err = getBootstrapVersion(seV4) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(currentBootstrapVersion)) + r := mustExecSQL(c, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") + req := r.NewChunk() + r.Next(ctx, req) + c.Assert(req.GetRow(0).GetString(0), Equals, "log") + c.Assert(config.GetGlobalConfig().OOMAction, Equals, config.OOMActionLog) +} + +func (s *testBootstrapSuite) TestIssue17979_2(c *C) { + oomAction := config.GetGlobalConfig().OOMAction + defer func() { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = oomAction + }) + }() + ctx := context.Background() + defer testleak.AfterTest(c)() + store, _ := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + + // test issue 20900, upgrade from v4.0.11 to v4.0.11 + seV3 := newSession(c, store, s.dbName) + txn, err := store.Begin() + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(59)) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + mustExecSQL(c, seV3, "update mysql.tidb set variable_value=59 where variable_name='tidb_server_version'") + mustExecSQL(c, seV3, "delete from mysql.tidb where variable_name='default_iim_action'") + mustExecSQL(c, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(59)) + + domV4, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer domV4.Close() + seV4 := newSession(c, store, s.dbName) + ver, err = getBootstrapVersion(seV4) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(currentBootstrapVersion)) + r := mustExecSQL(c, seV4, "select variable_value from mysql.tidb where variable_name='default_oom_action'") + req := r.NewChunk() + r.Next(ctx, req) + c.Assert(req.NumRows(), Equals, 0) + c.Assert(config.GetGlobalConfig().OOMAction, Equals, config.OOMActionCancel) +} + +func (s *testBootstrapSuite) TestIssue20900_1(c *C) { + ctx := context.Background() + defer testleak.AfterTest(c)() + store, _ := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + + // test issue 20900, upgrade from v3.0 to v4.0.9+ + seV3 := newSession(c, store, s.dbName) + txn, err := store.Begin() + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(38)) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + mustExecSQL(c, seV3, "update mysql.tidb set variable_value=38 where variable_name='tidb_server_version'") + mustExecSQL(c, seV3, "delete from mysql.tidb where variable_name='default_memory_quota_query'") + mustExecSQL(c, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(38)) + + domV4, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer domV4.Close() + seV4 := newSession(c, store, s.dbName) + ver, err = getBootstrapVersion(seV4) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(currentBootstrapVersion)) + r := mustExecSQL(c, seV4, "select @@tidb_mem_quota_query") + req := r.NewChunk() + r.Next(ctx, req) + c.Assert(req.GetRow(0).GetString(0), Equals, "34359738368") + r = mustExecSQL(c, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") + req = r.NewChunk() + r.Next(ctx, req) + c.Assert(req.GetRow(0).GetString(0), Equals, "34359738368") + c.Assert(seV4.GetSessionVars().MemQuotaQuery, Equals, int64(34359738368)) +} + +func (s *testBootstrapSuite) TestIssue20900_2(c *C) { + ctx := context.Background() + defer testleak.AfterTest(c)() + store, _ := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + + // test issue 20900, upgrade from v4.0.8 to v4.0.9+ + seV3 := newSession(c, store, s.dbName) + txn, err := store.Begin() + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(52)) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + mustExecSQL(c, seV3, "update mysql.tidb set variable_value=52 where variable_name='tidb_server_version'") + mustExecSQL(c, seV3, "delete from mysql.tidb where variable_name='default_memory_quota_query'") + mustExecSQL(c, seV3, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV3) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(52)) + + domV4, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer domV4.Close() + seV4 := newSession(c, store, s.dbName) + ver, err = getBootstrapVersion(seV4) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(currentBootstrapVersion)) + r := mustExecSQL(c, seV4, "select @@tidb_mem_quota_query") + req := r.NewChunk() + r.Next(ctx, req) + c.Assert(req.GetRow(0).GetString(0), Equals, "1073741824") + c.Assert(seV4.GetSessionVars().MemQuotaQuery, Equals, int64(1073741824)) + r = mustExecSQL(c, seV4, "select variable_value from mysql.tidb where variable_name='default_memory_quota_query'") + req = r.NewChunk() + r.Next(ctx, req) + c.Assert(req.NumRows(), Equals, 0) +} + func (s *testBootstrapSuite) TestANSISQLMode(c *C) { defer testleak.AfterTest(c)() store, dom := newStoreWithBootstrap(c, s.dbName) @@ -315,7 +484,6 @@ func (s *testBootstrapSuite) TestBootstrapInitExpensiveQueryHandle(c *C) { dom := domain.GetDomain(se) c.Assert(dom, NotNil) defer dom.Close() - dom.InitExpensiveQueryHandle() c.Assert(dom.ExpensiveQueryHandle(), NotNil) } @@ -333,6 +501,148 @@ func (s *testBootstrapSuite) TestStmtSummary(c *C) { req := r.NewChunk() c.Assert(r.Next(ctx, req), IsNil) row := req.GetRow(0) - c.Assert(row.GetBytes(0), BytesEquals, []byte("1")) + c.Assert(row.GetBytes(0), BytesEquals, []byte("ON")) c.Assert(r.Close(), IsNil) } + +type bindTestStruct struct { + originText string + bindText string + db string + originWithDB string + bindWithDB string + deleteText string +} + +func (s *testBootstrapSuite) TestUpdateBindInfo(c *C) { + bindCases := []bindTestStruct{ + { + originText: "select * from t where a > ?", + bindText: "select /*+ use_index(t, idxb) */ * from t where a > 1", + db: "test", + originWithDB: "select * from `test` . `t` where `a` > ?", + bindWithDB: "SELECT /*+ use_index(`t` `idxb`)*/ * FROM `test`.`t` WHERE `a` > 1", + deleteText: "select * from test.t where a > 1", + }, + { + originText: "select count ( ? ), max ( a ) from t group by b", + bindText: "select /*+ use_index(t, idx) */ count(1), max(a) from t group by b", + db: "test", + originWithDB: "select count ( ? ) , max ( `a` ) from `test` . `t` group by `b`", + bindWithDB: "SELECT /*+ use_index(`t` `idx`)*/ count(1),max(`a`) FROM `test`.`t` GROUP BY `b`", + deleteText: "select count(1), max(a) from test.t group by b", + }, + { + originText: "select * from `test` . `t` where `a` = (_charset) ?", + bindText: "SELECT * FROM test.t WHERE a = _utf8\\'ab\\'", + db: "test", + originWithDB: "select * from `test` . `t` where `a` = ?", + bindWithDB: "SELECT * FROM `test`.`t` WHERE `a` = 'ab'", + deleteText: "select * from test.t where a = 'c'", + }, + } + defer testleak.AfterTest(c)() + ctx := context.Background() + store, dom := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + defer dom.Close() + se := newSession(c, store, s.dbName) + for _, bindCase := range bindCases { + sql := fmt.Sprintf("insert into mysql.bind_info values('%s', '%s', '%s', 'using', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')", + bindCase.originText, + bindCase.bindText, + bindCase.db, + ) + mustExecSQL(c, se, sql) + + upgradeToVer67(se, version66) + r := mustExecSQL(c, se, `select original_sql, bind_sql, default_db, status from mysql.bind_info where source != 'builtin'`) + req := r.NewChunk() + c.Assert(r.Next(ctx, req), IsNil) + row := req.GetRow(0) + c.Assert(row.GetString(0), Equals, bindCase.originWithDB) + c.Assert(row.GetString(1), Equals, bindCase.bindWithDB) + c.Assert(row.GetString(2), Equals, "") + c.Assert(row.GetString(3), Equals, "using") + c.Assert(r.Close(), IsNil) + sql = fmt.Sprintf("drop global binding for %s", bindCase.deleteText) + mustExecSQL(c, se, sql) + r = mustExecSQL(c, se, `select original_sql, bind_sql, status from mysql.bind_info where source != 'builtin'`) + c.Assert(r.Next(ctx, req), IsNil) + row = req.GetRow(0) + c.Assert(row.GetString(0), Equals, bindCase.originWithDB) + c.Assert(row.GetString(1), Equals, bindCase.bindWithDB) + c.Assert(row.GetString(2), Equals, "deleted") + c.Assert(r.Close(), IsNil) + sql = fmt.Sprintf("delete from mysql.bind_info where original_sql = '%s'", bindCase.originWithDB) + mustExecSQL(c, se, sql) + } +} + +func (s *testBootstrapSuite) TestUpdateDuplicateBindInfo(c *C) { + defer testleak.AfterTest(c)() + ctx := context.Background() + store, dom := newStoreWithBootstrap(c, s.dbName) + defer store.Close() + defer dom.Close() + se := newSession(c, store, s.dbName) + mustExecSQL(c, se, `insert into mysql.bind_info values('select * from t', 'select /*+ use_index(t, idx_a)*/ * from t', 'test', 'using', '2021-01-04 14:50:58.257', '2021-01-04 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) + // The latest one. + mustExecSQL(c, se, `insert into mysql.bind_info values('select * from test . t', 'select /*+ use_index(t, idx_b)*/ * from test.t', 'test', 'using', '2021-01-04 14:50:58.257', '2021-01-09 14:50:58.257', 'utf8', 'utf8_general_ci', 'manual')`) + + upgradeToVer67(se, version66) + + r := mustExecSQL(c, se, `select original_sql, bind_sql, default_db, status, create_time from mysql.bind_info where source != 'builtin'`) + req := r.NewChunk() + c.Assert(r.Next(ctx, req), IsNil) + c.Assert(req.NumRows(), Equals, 1) + row := req.GetRow(0) + c.Assert(row.GetString(0), Equals, "select * from `test` . `t`") + c.Assert(row.GetString(1), Equals, "SELECT /*+ use_index(`t` `idx_b`)*/ * FROM `test`.`t`") + c.Assert(row.GetString(2), Equals, "") + c.Assert(row.GetString(3), Equals, "using") + c.Assert(row.GetTime(4).String(), Equals, "2021-01-04 14:50:58.257") + c.Assert(r.Close(), IsNil) + mustExecSQL(c, se, "delete from mysql.bind_info where original_sql = 'select * from test . t'") +} + +func (s *testBootstrapSuite) TestUpgradeVersion66(c *C) { + var err error + defer testleak.AfterTest(c)() + ctx := context.Background() + store, _ := newStoreWithBootstrap(c, s.dbName) + defer func() { + c.Assert(store.Close(), IsNil) + }() + + seV65 := newSession(c, store, s.dbName) + txn, err := store.Begin() + c.Assert(err, IsNil) + m := meta.NewMeta(txn) + err = m.FinishBootstrap(int64(65)) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + mustExecSQL(c, seV65, "update mysql.tidb set variable_value='65' where variable_name='tidb_server_version'") + mustExecSQL(c, seV65, "set @@global.tidb_track_aggregate_memory_usage = 0") + mustExecSQL(c, seV65, "commit") + unsetStoreBootstrapped(store.UUID()) + ver, err := getBootstrapVersion(seV65) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(65)) + + domV66, err := BootstrapSession(store) + c.Assert(err, IsNil) + defer domV66.Close() + seV66 := newSession(c, store, s.dbName) + ver, err = getBootstrapVersion(seV66) + c.Assert(err, IsNil) + c.Assert(ver, Equals, int64(currentBootstrapVersion)) + r := mustExecSQL(c, seV66, `select @@global.tidb_track_aggregate_memory_usage, @@session.tidb_track_aggregate_memory_usage`) + req := r.NewChunk() + c.Assert(r.Next(ctx, req), IsNil) + c.Assert(req.NumRows(), Equals, 1) + row := req.GetRow(0) + c.Assert(row.GetInt64(0), Equals, int64(1)) + c.Assert(row.GetInt64(1), Equals, int64(1)) +} diff --git a/session/clustered_index_test.go b/session/clustered_index_test.go new file mode 100644 index 0000000000000..457a032f27c41 --- /dev/null +++ b/session/clustered_index_test.go @@ -0,0 +1,506 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package session_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testutil" +) + +type testClusteredSuiteBase struct{ testSessionSuiteBase } +type testClusteredSuite struct { + testClusteredSuiteBase + testData testutil.TestData +} +type testClusteredSerialSuite struct{ testClusteredSuiteBase } + +func (s *testClusteredSuiteBase) newTK(c *C) *testkit.TestKit { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.Se.GetSessionVars().EnableClusteredIndex = true + return tk +} + +func (s *testClusteredSuite) SetUpSuite(c *C) { + s.testClusteredSuiteBase.SetUpSuite(c) + var err error + s.testData, err = testutil.LoadTestSuiteData("testdata", "clustered_index_suite") + c.Assert(err, IsNil) +} + +func (s *testClusteredSuite) TearDownSuite(c *C) { + s.testClusteredSuiteBase.TearDownSuite(c) + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) +} + +func (s *testClusteredSuite) TestClusteredUnionScan(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b))") + tk.MustExec("insert t (a, b) values (1, 1)") + tk.MustExec("begin") + tk.MustExec("update t set c = 1") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1")) + tk.MustExec("rollback") + + // cover old row format. + tk = testkit.NewTestKitWithInit(c, s.store) + tk.Se.GetSessionVars().RowEncoder.Enable = false + tk.MustExec("begin") + tk.MustExec("update t set c = 1") + tk.MustQuery("select * from t").Check(testkit.Rows("1 1 1")) + tk.MustExec("rollback") +} + +func (s *testClusteredSuite) TestClusteredPrefixColumn(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t1(cb varchar(12), ci int, v int, primary key(cb(1)), key idx_1(cb))") + tk.MustExec("insert into t1 values('PvtYW2', 1, 1)") + tk.MustQuery("select cb from t1").Check(testkit.Rows("PvtYW2")) + tk.MustQuery("select * from t1").Check(testkit.Rows("PvtYW2 1 1")) + + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(c1 varchar(100), c2 varchar(100), c3 varchar(100), primary key (c1,c2), key idx1 (c2(1)))") + tk.MustExec("insert into t1 select 'a', 'cd', 'ef'") + tk.MustExec("create table t2(c1 varchar(100), c2 varchar(100), c3 varchar(100), primary key (c1,c2(1)), key idx1 (c1,c2))") + tk.MustExec("insert into t2 select 'a', 'cd', 'ef'") + + var input []string + var output []struct { + SQL string + Plan []string + Res []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(tk.MustQuery("explain " + tt).Rows()) + output[i].Res = s.testData.ConvertRowsToStrings(tk.MustQuery(tt).Sort().Rows()) + }) + tk.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + tk.MustQuery(tt).Sort().Check(testkit.Rows(output[i].Res...)) + } + + tk.MustExec("drop table if exists test1") + tk.MustExec("create table test1(c1 varchar(100) not null default 'xyza', c2 int, primary key(c1(3)) clustered)") + tk.MustExec("replace into test1(c2) values(1)") + tk.MustExec("replace into test1(c2) values(2)") + tk.MustQuery("select * from test1").Check(testkit.Rows("xyza 2")) + + tk.MustExec("drop table if exists test3") + tk.MustExec("create table test3(c1 varchar(100), c2 int, primary key(c1(1)) clustered)") + tk.MustExec("insert into test3 values('ab', 1) on duplicate key update c2 = 100") + tk.MustExec("insert into test3 values('ab', 1) on duplicate key update c2 = 100") + tk.MustQuery("select * from test3").Check(testkit.Rows("ab 100")) + tk.MustExec("insert into test3 values('ab', 1) on duplicate key update c1 = 'cc', c2 = '200'") + tk.MustQuery("select * from test3").Check(testkit.Rows("cc 200")) + + tk.MustExec("drop table if exists tbl_3") + tk.MustExec(`create table tbl_3 ( col_15 text(138) , col_16 varchar(37) default 'yGdboyZqIGDQhwRRc' not null , col_17 text(39) not null , col_18 char(58) default 'vBahOai' , col_19 varchar(470) , primary key idx_12 ( col_16(3),col_17(6),col_15(4)) clustered, key idx_13 ( col_19(2) ) , key idx_14 ( col_18(3),col_15(2) ) , unique key idx_15 ( col_16(4),col_18(6) ) , unique key idx_16 ( col_17(1) ) )`) + tk.MustExec("insert into tbl_3 values ( 'XJUDeSZplXx','TfZhIWnJPygn','HlZjQffSh','VDsepqNPkx','xqtMHHOqnLvcxDpL')") + tk.MustExec("insert into tbl_3 (col_15,col_17,col_19) values ( 'aeMrIjbfCxErg','HTZmtykzIkFMF','' ) on duplicate key update col_18 = values( col_18 )") + tk.MustQuery("select col_17 from tbl_3").Check(testkit.Rows("HlZjQffSh")) + + tk.MustExec("drop table if exists tbl_1") + tk.MustExec("CREATE TABLE `tbl_1`(`col_5` char(84) NOT NULL DEFAULT 'BnHWZQY', `col_6` char(138) DEFAULT NULL, `col_7` tinytext NOT NULL, `col_8` char(231) DEFAULT NULL, `col_9` varchar(393) NOT NULL DEFAULT 'lizgVQd', PRIMARY KEY (`col_5`(4),`col_7`(3)) clustered , KEY `idx_2` (`col_5`(6),`col_8`(5)), UNIQUE KEY `idx_3` (`col_7`(2)), UNIQUE KEY `idx_4` (`col_9`(6),`col_7`(4),`col_6`(3)), UNIQUE KEY `idx_5` (`col_9`(3)) );") + tk.MustExec("insert into tbl_1 values('BsXhVuVvPRcSOlkzuM','QXIEA','IHeTDzJJyfOhIOY','ddxnmRcIjVfosRVC','lizgVQd')") + tk.MustExec("replace into tbl_1 (col_6,col_7,col_8) values ( 'WzdD','S','UrQhNEUZy' )") + tk.MustExec("admin check table tbl_1") + + tk.MustExec("drop table if exists tbl_3") + tk.MustExec("create table tbl_3 ( col_15 char(167) not null , col_16 varchar(56) not null , col_17 text(25) not null , col_18 char , col_19 char(12) not null , primary key idx_21 ( col_16(5) ) clustered, key idx_22 ( col_19(2),col_16(4) ) , unique key idx_23 ( col_19(6),col_16(4) ) , unique key idx_24 ( col_19(1),col_18(1) ) , key idx_25 ( col_17(3),col_16(2),col_19(4) ) , key idx_26 ( col_18(1),col_17(3) ) , key idx_27 ( col_18(1) ) , unique key idx_28 ( col_16(4),col_15(3) ) , unique key idx_29 ( col_16(2) ) , key idx_30 ( col_18(1),col_16(2),col_19(4),col_17(6) ) , key idx_31 ( col_19(2) ) , key idx_32 ( col_16(6) ) , unique key idx_33 ( col_18(1) ) , unique key idx_34 ( col_15(4) ) , key idx_35 ( col_19(6) ) , key idx_36 ( col_19(4),col_17(4),col_18(1) ) )") + tk.MustExec("insert into tbl_3 values('auZELjkOUG','yhFUdsZphsWDFG','mNbCXHOWlIMQvXhY',' ','NpQwmX');") + tk.MustExec("insert into tbl_3 (col_15,col_16,col_17,col_18,col_19) values ( 'PboEJsnVPBknRhpEC','PwqzUThyDHhxhXAdJ','szolY','','pzZfZeOa' ) on duplicate key update col_16 = values( col_16 ) , col_19 = 'zgLlCUA'") + tk.MustExec("admin check table tbl_3") + + tk.MustExec("create table t (c_int int, c_str varchar(40), primary key(c_str(8)) clustered, unique key(c_int), key(c_str))") + tk.MustExec("insert into t values (1, 'determined varahamihira')") + tk.MustExec("insert into t values (1, 'pensive mendeleev') on duplicate key update c_int=values(c_int), c_str=values(c_str)") + tk.MustExec("admin check table t") +} + +func (s *testClusteredSuite) TestClusteredUnionScanIndexLookup(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, pk char(10), c int, primary key(pk), key(a));") + tk.MustExec("insert into t values (1, '111', 3);") + + tk.MustExec("begin") + tk.MustExec("update t set a = a + 1, pk = '222' where a = 1;") + sql := "select pk, c from t where a = 2;" + tk.HasPlan(sql, "IndexLookUp") + tk.MustQuery(sql).Check(testkit.Rows("222 3")) + + tk.MustExec("commit") + tk.MustQuery(sql).Check(testkit.Rows("222 3")) +} + +func (s *testClusteredSuite) TestClusteredIndexLookUp(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, b int, c int, d int, primary key (a, b))") + tk.MustExec("create index idx on t(c)") + tk.MustExec("insert t values (1, 1, 1, 1)") + tk.MustQuery("select d from t use index (idx)").Check(testkit.Rows("1")) +} + +func (s *testClusteredSuite) TestClusteredIndexLookUp2(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists c3") + createTable := ` +CREATE TABLE c3 ( + c_id int(11) NOT NULL, + c_d_id int(11) NOT NULL, + c_w_id int(11) NOT NULL, + c_first varchar(16) DEFAULT NULL, + c_middle char(2) DEFAULT NULL, + c_last varchar(16) DEFAULT NULL, + c_balance decimal(12,2) DEFAULT NULL, + PRIMARY KEY (c_w_id,c_d_id,c_id), + KEY idx (c_w_id,c_d_id,c_last,c_first) +);` + tk.MustExec(createTable) + tk.MustExec("insert c3 values (772,1,1,'aaa','OE','CALL',0),(1905,1,1,'bbb','OE','CALL',0);") + query := ` +SELECT c_balance, c_first, c_middle, c_id FROM c3 use index (idx) WHERE c_w_id = 1 AND c_d_id = 1 and c_last = 'CALL' ORDER BY c_first +` + tk.MustQuery(query).Check(testkit.Rows("0.00 aaa OE 772", "0.00 bbb OE 1905")) +} + +func (s *testClusteredSuite) TestClusteredTopN(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists o3") + createTables := ` + CREATE TABLE o3 ( + o_id int NOT NULL, + o_d_id int, + o_w_id int, + o_c_id int, + PRIMARY KEY (o_w_id,o_d_id,o_id), + KEY idx_order (o_w_id,o_d_id,o_c_id,o_id) +);` + tk.MustExec(createTables) + tk.MustExec("insert o3 values (1, 6, 9, 3), (2, 6, 9, 5), (3, 6, 9, 7)") + tk.MustQuery("SELECT max(o_id) max_order FROM o3 use index (idx_order)").Check(testkit.Rows("3")) +} + +func (s *testClusteredSuite) TestClusteredHint(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists ht") + tk.MustExec("create table ht (a varchar(64) primary key, b int)") + tk.MustQuery("select * from ht use index (`PRIMARY`)") +} + +func (s *testClusteredSuite) TestClusteredBatchPointGet(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (a int,b int,c int, PRIMARY KEY (a,b)) PARTITION BY HASH(a) PARTITIONS 3") + tk.MustExec("insert t values (1, 1, 1), (3, 3, 3), (5, 5, 5)") + tk.MustQuery("select * from t where (a, b) in ((1, 1), (3, 3), (5, 5))").Check( + testkit.Rows("1 1 1", "3 3 3", "5 5 5")) +} + +func (s *testClusteredSuite) TestClusteredInsertIgnoreBatchGetKeyCount(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t") + tk.MustExec("CREATE TABLE t (a varchar(10) primary key, b int)") + tk.MustExec("begin optimistic") + tk.MustExec("insert ignore t values ('a', 1)") + txn, err := tk.Se.Txn(false) + c.Assert(err, IsNil) + snapSize := 0 + if t, ok := txn.GetSnapshot().(*tikv.KVSnapshot); ok { + snapSize = t.SnapCacheSize() + } + c.Assert(snapSize, Equals, 1) + tk.MustExec("rollback") +} + +func (s *testClusteredSuite) TestClusteredPrefixingPrimaryKey(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(name varchar(255), b int, c int, primary key(name(2)), index idx(b));") + tk.MustExec("insert into t(name, b) values('aaaaa', 1), ('bbbbb', 2);") + tk.MustExec("admin check table t;") + + tk.MustGetErrCode("insert into t(name, b) values('aaa', 3);", errno.ErrDupEntry) + sql := "select * from t use index(primary) where name = 'aaaaa';" + tk.HasPlan(sql, "TableReader") + tk.HasPlan(sql, "TableRangeScan") + tk.MustQuery(sql).Check(testkit.Rows("aaaaa 1 ")) + tk.MustExec("admin check table t;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(name varchar(255), b int, c char(10), primary key(c(2), name(2)), index idx(b));") + tk.MustExec("insert into t values ('aaa', 1, 'aaa'), ('bbb', 1, 'bbb');") + tk.MustExec("insert into t values ('aa', 1, 'bbb'), ('bbb', 1, 'ccc');") + tk.MustGetErrCode("insert into t values ('aa', 1, 'aa');", errno.ErrDupEntry) + tk.MustGetErrCode("insert into t values ('aac', 1, 'aac');", errno.ErrDupEntry) + tk.MustGetErrCode("insert into t values ('bb', 1, 'bb');", errno.ErrDupEntry) + tk.MustGetErrCode("insert into t values ('bbc', 1, 'bbc');", errno.ErrDupEntry) + tk.MustGetErrCode("update t set name = 'aa', c = 'aa' where c = 'ccc'", errno.ErrDupEntry) + tk.MustExec("update t set name = 'ccc' where name = 'aa'") + tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). + Check(testkit.Rows("aaa.bbb.bbb.ccc")) + tk.MustExec("admin check table t;") + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(name varchar(255), b int, primary key(name(2)), index idx(b));") + tk.MustExec("insert into t values ('aaa', 1), ('bbb', 1);") + tk.MustQuery("select group_concat(name order by name separator '.') from t use index(idx);"). + Check(testkit.Rows("aaa.bbb")) + + tk.MustGetErrCode("update t set name = 'aaaaa' where name = 'bbb'", errno.ErrDupEntry) + tk.MustExec("update ignore t set name = 'aaaaa' where name = 'bbb'") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1062 Duplicate entry 'aaaaa' for key 'PRIMARY'")) + tk.MustExec("admin check table t;") + + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1 (c_str varchar(40), c_decimal decimal(12, 6) , primary key(c_str(8)))") + tk.MustExec("create table t2 like t1") + tk.MustExec("insert into t1 values ('serene ramanujan', 6.383), ('frosty hodgkin', 3.504), ('stupefied spence', 5.869)") + tk.MustExec("insert into t2 select * from t1") + tk.MustQuery("select /*+ INL_JOIN(t1,t2) */ * from t1 right join t2 on t1.c_str = t2.c_str").Check(testkit.Rows( + "frosty hodgkin 3.504000 frosty hodgkin 3.504000", + "serene ramanujan 6.383000 serene ramanujan 6.383000", + "stupefied spence 5.869000 stupefied spence 5.869000")) + tk.MustQuery("select /*+ INL_HASH_JOIN(t1,t2) */ * from t1 right join t2 on t1.c_str = t2.c_str").Check(testkit.Rows( + "frosty hodgkin 3.504000 frosty hodgkin 3.504000", + "serene ramanujan 6.383000 serene ramanujan 6.383000", + "stupefied spence 5.869000 stupefied spence 5.869000")) + tk.MustQuery("select /*+ INL_MERGE_JOIN(t1,t2) */ * from t1 right join t2 on t1.c_str = t2.c_str").Check(testkit.Rows( + "frosty hodgkin 3.504000 frosty hodgkin 3.504000", + "serene ramanujan 6.383000 serene ramanujan 6.383000", + "stupefied spence 5.869000 stupefied spence 5.869000")) +} + +// Test for union scan in prefixed clustered index table. +// See https://github.com/pingcap/tidb/issues/22069. +func (s *testClusteredSerialSuite) TestClusteredUnionScanOnPrefixingPrimaryKey(c *C) { + originCollate := collate.NewCollationEnabled() + collate.SetNewCollationEnabledForTest(false) + defer collate.SetNewCollationEnabledForTest(originCollate) + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (col_1 varchar(255), col_2 tinyint, primary key idx_1 (col_1(1)));") + tk.MustExec("insert into t values ('aaaaa', -38);") + tk.MustExec("insert into t values ('bbbbb', -48);") + + tk.MustExec("begin PESSIMISTIC;") + tk.MustExec("update t set col_2 = 47 where col_1 in ('aaaaa') order by col_1,col_2;") + tk.MustQuery("select * from t;").Check(testkit.Rows("aaaaa 47", "bbbbb -48")) + tk.MustGetErrCode("insert into t values ('bb', 0);", errno.ErrDupEntry) + tk.MustGetErrCode("insert into t values ('aa', 0);", errno.ErrDupEntry) + tk.MustExec("commit;") + tk.MustQuery("select * from t;").Check(testkit.Rows("aaaaa 47", "bbbbb -48")) + tk.MustExec("admin check table t;") +} + +func (s *testClusteredSuite) TestClusteredWithOldRowFormat(c *C) { + tk := s.newTK(c) + tk.Se.GetSessionVars().RowEncoder.Enable = false + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t(id varchar(255) primary key, a int, b int, unique index idx(b));") + tk.MustExec("insert into t values ('b568004d-afad-11ea-8e4d-d651e3a981b7', 1, -1);") + tk.MustQuery("select * from t use index(primary);").Check(testkit.Rows("b568004d-afad-11ea-8e4d-d651e3a981b7 1 -1")) + + // Test for issue https://github.com/pingcap/tidb/issues/21568 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c_int int, c_str varchar(40), c_decimal decimal(12, 6), primary key(c_str));") + tk.MustExec("begin;") + tk.MustExec("insert into t (c_int, c_str) values (13, 'dazzling torvalds'), (3, 'happy rhodes');") + tk.MustExec("delete from t where c_decimal <= 3.024 or (c_int, c_str) in ((5, 'happy saha'));") + + // Test for issue https://github.com/pingcap/tidb/issues/21502. + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c_int int, c_double double, c_decimal decimal(12, 6), primary key(c_decimal, c_double), unique key(c_int));") + tk.MustExec("begin;") + tk.MustExec("insert into t values (5, 55.068712, 8.256);") + tk.MustExec("delete from t where c_int = 5;") + + // Test for issue https://github.com/pingcap/tidb/issues/21568#issuecomment-741601887 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (c_int int, c_str varchar(40), c_timestamp timestamp, c_decimal decimal(12, 6), primary key(c_int, c_str), key(c_decimal));") + tk.MustExec("begin;") + tk.MustExec("insert into t values (11, 'abc', null, null);") + tk.MustExec("update t set c_str = upper(c_str) where c_decimal is null;") + tk.MustQuery("select * from t where c_decimal is null;").Check(testkit.Rows("11 ABC ")) + + // Test for issue https://github.com/pingcap/tidb/issues/22193 + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (col_0 blob(20), col_1 int, primary key(col_0(1)), unique key idx(col_0(2)));") + tk.MustExec("insert into t values('aaa', 1);") + tk.MustExec("begin;") + tk.MustExec("update t set col_0 = 'ccc';") + tk.MustExec("update t set col_0 = 'ddd';") + tk.MustExec("commit;") + tk.MustQuery("select cast(col_0 as char(20)) from t use index (`primary`);").Check(testkit.Rows("ddd")) + tk.MustQuery("select cast(col_0 as char(20)) from t use index (idx);").Check(testkit.Rows("ddd")) + tk.MustExec("admin check table t") +} + +func (s *testClusteredSuite) TestIssue20002(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t ( c_int int, c_str varchar(40), c_datetime datetime, primary key(c_str), unique key(c_datetime));") + tk.MustExec("insert into t values (1, 'laughing hertz', '2020-04-27 20:29:30'), (2, 'sharp yalow', '2020-04-01 05:53:36'), (3, 'pedantic hoover', '2020-03-10 11:49:00');") + tk.MustExec("begin;") + tk.MustExec("update t set c_str = 'amazing herschel' where c_int = 3;") + tk.MustExec("select c_int, c_str, c_datetime from t where c_datetime between '2020-01-09 22:00:28' and '2020-04-08 15:12:37';") + tk.MustExec("commit;") + tk.MustExec("admin check index t `c_datetime`;") +} + +// https://github.com/pingcap/tidb/issues/20727 +func (s *testClusteredSuite) TestClusteredIndexSplitAndAddIndex(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a varchar(255), b int, primary key(a));") + tk.MustExec("insert into t values ('a', 1), ('b', 2), ('c', 3), ('u', 1);") + tk.MustQuery("split table t between ('a') and ('z') regions 5;").Check(testkit.Rows("4 1")) + tk.MustExec("create index idx on t (b);") + tk.MustQuery("select a from t order by a;").Check(testkit.Rows("a", "b", "c", "u")) + tk.MustQuery("select a from t use index (idx) order by a;").Check(testkit.Rows("a", "b", "c", "u")) +} + +// https://github.com/pingcap/tidb/issues/22453 +func (s *testClusteredSerialSuite) TestClusteredIndexSplitAndAddIndex2(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a int, b enum('Alice'), c int, primary key (c, b));") + tk.MustExec("insert into t values (-1,'Alice',100);") + tk.MustExec("insert into t values (-1,'Alice',7000);") + tk.MustQuery("split table t between (0,'Alice') and (10000,'Alice') regions 2;").Check(testkit.Rows("1 1")) + tk.MustExec("set @@global.tidb_ddl_error_count_limit = 3;") + tk.MustExec("alter table t add index idx (c);") + tk.MustExec("admin check table t;") +} + +func (s *testClusteredSuite) TestClusteredIndexSelectWhereInNull(c *C) { + tk := s.newTK(c) + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (a datetime, b bigint, primary key (a));") + tk.MustQuery("select * from t where a in (null);").Check(testkit.Rows( /* empty result */ )) +} + +func (s *testClusteredSerialSuite) TestClusteredIndexSyntax(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + const showPKType = `select tidb_pk_type from information_schema.tables where table_schema = 'test' and table_name = 't';` + const nonClustered, clustered = `NON-CLUSTERED`, `CLUSTERED` + assertPkType := func(sql string, pkType string) { + tk.MustExec("drop table if exists t;") + tk.MustExec(sql) + tk.MustQuery(showPKType).Check(testkit.Rows(pkType)) + } + + defer config.RestoreFunc()() + for _, allowAlterPK := range []bool{true, false} { + config.UpdateGlobal(func(conf *config.Config) { + conf.AlterPrimaryKey = allowAlterPK + }) + // Test single integer column as the primary key. + clusteredDefault := clustered + if allowAlterPK { + clusteredDefault = nonClustered + } + assertPkType("create table t (a int primary key, b int);", clusteredDefault) + assertPkType("create table t (a int, b int, primary key(a) clustered);", clustered) + assertPkType("create table t (a int, b int, primary key(a) /*T![clustered_index] clustered */);", clustered) + assertPkType("create table t (a int, b int, primary key(a) nonclustered);", nonClustered) + assertPkType("create table t (a int, b int, primary key(a) /*T![clustered_index] nonclustered */);", nonClustered) + + // Test for clustered index. + tk.Se.GetSessionVars().EnableClusteredIndex = false + assertPkType("create table t (a int, b varchar(255), primary key(b, a));", nonClustered) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) nonclustered);", nonClustered) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) clustered);", clustered) + tk.Se.GetSessionVars().EnableClusteredIndex = true + assertPkType("create table t (a int, b varchar(255), primary key(b, a));", clusteredDefault) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) nonclustered);", nonClustered) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) /*T![clustered_index] nonclustered */);", nonClustered) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) clustered);", clustered) + assertPkType("create table t (a int, b varchar(255), primary key(b, a) /*T![clustered_index] clustered */);", clustered) + } +} + +func (s *testClusteredSerialSuite) TestPrefixClusteredIndexAddIndexAndRecover(c *C) { + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("use test;") + tk1.MustExec("drop table if exists t;") + defer func() { + tk1.MustExec("drop table if exists t;") + }() + + tk1.MustExec("create table t(a char(3), b char(3), primary key(a(1)) clustered)") + tk1.MustExec("insert into t values ('aaa', 'bbb')") + tk1.MustExec("alter table t add index idx(b)") + tk1.MustQuery("select * from t use index(idx)").Check(testkit.Rows("aaa bbb")) + tk1.MustExec("admin check table t") + tk1.MustExec("admin recover index t idx") + tk1.MustQuery("select * from t use index(idx)").Check(testkit.Rows("aaa bbb")) + tk1.MustExec("admin check table t") +} + +// https://github.com/pingcap/tidb/issues/23106 +func (s *testClusteredSerialSuite) TestClusteredIndexDecodeRestoredDataV5(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.AlterPrimaryKey = false + }) + defer collate.SetNewCollationEnabledForTest(false) + collate.SetNewCollationEnabledForTest(true) + tk.MustExec("use test") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id1 int, id2 varchar(10), a1 int, primary key(id1, id2) clustered) collate utf8mb4_general_ci;") + tk.MustExec("insert into t values (1, 'asd', 1), (1, 'dsa', 1);") + tk.MustGetErrCode("alter table t add unique index t_idx(id1, a1);", errno.ErrDupEntry) + + tk.MustExec("drop table if exists t;") + tk.MustExec("create table t (id1 int, id2 varchar(10), a1 int, primary key(id1, id2) clustered, unique key t_idx(id1, a1)) collate utf8mb4_general_ci;") + tk.MustExec("begin;") + tk.MustExec("insert into t values (1, 'asd', 1);") + tk.MustQuery("select * from t use index (t_idx);").Check(testkit.Rows("1 asd 1")) + tk.MustExec("commit;") + tk.MustExec("admin check table t;") + tk.MustExec("drop table t;") +} + +// https://github.com/pingcap/tidb/issues/23178 +func (s *testClusteredSerialSuite) TestPrefixedClusteredIndexUniqueKeyWithNewCollation(c *C) { + defer collate.SetNewCollationEnabledForTest(false) + collate.SetNewCollationEnabledForTest(true) + tk := testkit.NewTestKitWithInit(c, s.store) + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.AlterPrimaryKey = false + }) + tk.MustExec("use test;") + tk.Se.GetSessionVars().EnableClusteredIndex = true + tk.MustExec("create table t (a text collate utf8mb4_general_ci not null, b int(11) not null, " + + "primary key (a(10), b) clustered, key idx(a(2)) ) default charset=utf8mb4 collate=utf8mb4_bin;") + tk.MustExec("insert into t values ('aaa', 2);") + // Key-value content: sk = sortKey, p = prefixed + // row record: sk(aaa), 2 -> aaa + // index record: sk(p(aa)), {sk(aaa), 2} -> restore data(aaa) + tk.MustExec("admin check table t;") + tk.MustExec("drop table t;") +} diff --git a/session/pessimistic_test.go b/session/pessimistic_test.go index 66a2b405fff64..8cafb18621eb2 100644 --- a/session/pessimistic_test.go +++ b/session/pessimistic_test.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/testkit" @@ -38,6 +39,12 @@ import ( var _ = SerialSuites(&testPessimisticSuite{}) +func (s *testPessimisticSuite) newAsyncCommitTestKitWithInit(c *C) *testkit.TestKit { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.Se.GetSessionVars().EnableAsyncCommit = true + return tk +} + type testPessimisticSuite struct { testSessionSuiteBase } @@ -273,6 +280,13 @@ func (s *testPessimisticSuite) TestInsertOnDup(c *C) { tk.MustQuery("select * from dup").Check(testkit.Rows("1 2")) } +func (s *testPessimisticSuite) TestPointGetOverflow(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("create table t(k tinyint, v int, unique key(k))") + tk.MustExec("begin pessimistic") + tk.MustExec("update t set v = 100 where k = -200;") +} + func (s *testPessimisticSuite) TestPointGetKeyLock(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk2 := testkit.NewTestKitWithInit(c, s.store) @@ -377,6 +391,11 @@ func (s *testPessimisticSuite) TestLockUnchangedRowKey(c *C) { } func (s *testPessimisticSuite) TestOptimisticConflicts(c *C) { + // To avoid the resolve lock request arrives earlier before heartbeat request while lock expires. + atomic.StoreUint64(&tikv.ManagedLockTTL, 1000) + defer func() { + atomic.StoreUint64(&tikv.ManagedLockTTL, 300) + }() tk := testkit.NewTestKitWithInit(c, s.store) tk2 := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("drop table if exists conflict") @@ -489,7 +508,7 @@ func (s *testPessimisticSuite) TestSelectForUpdateNoWait(c *C) { tk3.MustQuery("select * from tk where c1 > 3 for update nowait").Check(testkit.Rows("4 14", "5 15")) tk3.MustExec("commit") - //delete + // delete tk3.MustExec("begin pessimistic") tk3.MustExec("delete from tk where c1 <= 2") tk.MustExec("begin pessimistic") @@ -524,15 +543,15 @@ func (s *testPessimisticSuite) TestAsyncRollBackNoWait(c *C) { // even though async rollback for pessimistic lock may rollback later locked key if get ts failed from pd // the txn correctness should be ensured c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/ExecStmtGetTsError", "return"), IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/AsyncRollBackSleep", "return"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/beforeAsyncPessimisticRollback", "sleep(100)"), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/executor/ExecStmtGetTsError"), IsNil) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/AsyncRollBackSleep"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/beforeAsyncPessimisticRollback"), IsNil) }() tk.MustExec("begin pessimistic") tk.MustExec("select * from tk where c1 > 0 for update nowait") tk2.MustExec("begin pessimistic") - // The lock rollback of this statement is delayed by failpoint AsyncRollBackSleep. + // The lock rollback of this statement is delayed by failpoint beforeAsyncPessimisticRollback. _, err := tk2.Exec("select * from tk where c1 > 0 for update nowait") c.Check(err, NotNil) tk.MustExec("commit") @@ -643,6 +662,11 @@ func (s *testPessimisticSuite) TestConcurrentInsert(c *C) { } func (s *testPessimisticSuite) TestInnodbLockWaitTimeout(c *C) { + // Increasing the ManagedLockTTL so that the lock may not be resolved testing with TiKV. + atomic.StoreUint64(&tikv.ManagedLockTTL, 5000) + defer func() { + atomic.StoreUint64(&tikv.ManagedLockTTL, 300) + }() tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("drop table if exists tk") tk.MustExec("create table tk (c1 int primary key, c2 int)") @@ -675,12 +699,13 @@ func (s *testPessimisticSuite) TestInnodbLockWaitTimeout(c *C) { // Parallel the blocking tests to accelerate CI. var wg sync.WaitGroup wg.Add(2) + timeoutErrCh := make(chan error, 2) go func() { defer wg.Done() // tk3 try lock c1 = 1 timeout 1sec tk3.MustExec("begin pessimistic") _, err := tk3.Exec("select * from tk where c1 = 1 for update") - c.Check(err.Error(), Equals, tikv.ErrLockWaitTimeout.Error()) + timeoutErrCh <- err tk3.MustExec("commit") }() @@ -691,10 +716,17 @@ func (s *testPessimisticSuite) TestInnodbLockWaitTimeout(c *C) { tk5.MustExec("set innodb_lock_wait_timeout = 2") tk5.MustExec("begin pessimistic") _, err := tk5.Exec("update tk set c2 = c2 - 1 where c1 = 1") - c.Check(err.Error(), Equals, tikv.ErrLockWaitTimeout.Error()) + timeoutErrCh <- err tk5.MustExec("rollback") }() + timeoutErr := <-timeoutErrCh + c.Assert(timeoutErr, NotNil) + c.Assert(timeoutErr.Error(), Equals, tikv.ErrLockWaitTimeout.Error()) + timeoutErr = <-timeoutErrCh + c.Assert(timeoutErr, NotNil) + c.Assert(timeoutErr.Error(), Equals, tikv.ErrLockWaitTimeout.Error()) + // tk4 lock c1 = 2 tk4.MustExec("begin pessimistic") tk4.MustExec("update tk set c2 = c2 + 1 where c1 = 2") // lock succ c1 = 2 by update @@ -759,6 +791,11 @@ func (s *testPessimisticSuite) TestPushConditionCheckForPessimisticTxn(c *C) { } func (s *testPessimisticSuite) TestInnodbLockWaitTimeoutWaitStart(c *C) { + // Increasing the ManagedLockTTL so that the lock may not be resolved testing with TiKV. + atomic.StoreUint64(&tikv.ManagedLockTTL, 5000) + defer func() { + atomic.StoreUint64(&tikv.ManagedLockTTL, 300) + }() // prepare work tk := testkit.NewTestKitWithInit(c, s.store) defer tk.MustExec("drop table if exists tk") @@ -815,6 +852,145 @@ func (s *testPessimisticSuite) TestBatchPointGetWriteConflict(c *C) { tk1.MustExec("commit") } +func (s *testPessimisticSuite) TestPessimisticSerializable(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("use test") + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("use test") + + tk.MustExec("set tidb_txn_mode = 'pessimistic'") + tk1.MustExec("set tidb_txn_mode = 'pessimistic'") + + tk.MustExec("drop table if exists test;") + tk.MustExec("create table test (id int not null primary key, value int);") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("set tidb_skip_isolation_level_check = 1") + tk1.MustExec("set tidb_skip_isolation_level_check = 1") + tk.MustExec("set tx_isolation = 'SERIALIZABLE'") + tk1.MustExec("set tx_isolation = 'SERIALIZABLE'") + + // Predicate-Many-Preceders (PMP) + tk.MustExec("begin") + tk1.MustExec("begin") + tk.MustQuery("select * from test where value = 30;").Check(testkit.Rows()) + tk1.MustExec("insert into test (id, value) values(3, 30);") + tk1.MustExec("commit") + tk.MustQuery("select * from test where mod(value, 3) = 0;").Check(testkit.Rows()) + tk.MustExec("commit") + + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustExec("update test set value = value + 10;") + + var wg sync.WaitGroup + wg.Add(1) + go func() { + tk1.ExecToErr("delete from test where value = 20;") + wg.Done() + }() + tk.MustExec("commit;") + wg.Wait() + tk1.MustExec("rollback;") + + // Lost Update (P4) + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where id = 1;").Check(testkit.Rows("1 10")) + tk1.MustQuery("select * from test where id = 1;").Check(testkit.Rows("1 10")) + tk.MustExec("update test set value = 11 where id = 1;") + + wg.Add(1) + go func() { + tk1.ExecToErr("update test set value = 11 where id = 1;") + wg.Done() + }() + tk.MustExec("commit;") + wg.Wait() + tk1.MustExec("rollback;") + + // Read Skew (G-single) + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where id = 1;").Check(testkit.Rows("1 10")) + tk1.MustQuery("select * from test where id = 1;").Check(testkit.Rows("1 10")) + tk1.MustQuery("select * from test where id = 2;").Check(testkit.Rows("2 20")) + tk1.MustExec("update test set value = 12 where id = 1;") + tk1.MustExec("update test set value = 18 where id = 1;") + tk1.MustExec("commit;") + tk.MustQuery("select * from test where id = 2;").Check(testkit.Rows("2 20")) + tk.MustExec("commit;") + + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where mod(value, 5) = 0;").Check(testkit.Rows("1 10", "2 20")) + tk1.MustExec("update test set value = 12 where value = 10;") + tk1.MustExec("commit;") + tk.MustQuery("select * from test where mod(value, 3) = 0;").Check(testkit.Rows()) + tk.MustExec("commit;") + + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where id = 1;").Check(testkit.Rows("1 10")) + tk1.MustQuery("select * from test;").Check(testkit.Rows("1 10", "2 20")) + tk1.MustExec("update test set value = 12 where id = 1;") + tk1.MustExec("update test set value = 18 where id = 1;") + tk1.MustExec("commit;") + tk.ExecToErr("delete from test where value = 20;") + tk.MustExec("rollback;") + + // Write Skew (G2-item) + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where id in (1,2);").Check(testkit.Rows("1 10", "2 20")) + tk1.MustQuery("select * from test where id in (1,2);").Check(testkit.Rows("1 10", "2 20")) + tk1.MustExec("update test set value = 11 where id = 1;") + tk1.MustExec("update test set value = 21 where id = 2;") + tk.MustExec("commit;") + tk1.MustExec("commit;") + tk.MustQuery("select * from test;").Check(testkit.Rows("1 11", "2 21")) + + // Anti-Dependency Cycles (G2) + tk.MustExec("truncate table test;") + tk.MustExec("insert into test (id, value) values (1, 10);") + tk.MustExec("insert into test (id, value) values (2, 20);") + + tk.MustExec("begin;") + tk1.MustExec("begin;") + tk.MustQuery("select * from test where mod(value, 3) = 0;").Check(testkit.Rows()) + tk1.MustQuery("select * from test where mod(value, 5) = 0;").Check(testkit.Rows("1 10", "2 20")) + tk.MustExec("insert into test (id, value) values(3, 30);") + tk1.MustExec("insert into test (id, value) values(4, 60);") + tk.MustExec("commit;") + tk1.MustExec("commit;") + tk.MustQuery("select * from test where mod(value, 3) = 0;").Check(testkit.Rows("3 30", "4 60")) +} + func (s *testPessimisticSuite) TestPessimisticReadCommitted(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("use test") @@ -1191,6 +1367,36 @@ func (s *testPessimisticSuite) TestRCSubQuery(c *C) { tk.MustExec("rollback") } +func (s *testPessimisticSuite) TestRCIndexMerge(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t") + tk.MustExec(`create table t (id int primary key, v int, a int not null, b int not null, + index ia (a), index ib (b))`) + tk.MustExec("insert into t values (1, 10, 1, 1)") + + tk.MustExec("set transaction isolation level read committed") + tk.MustExec("begin pessimistic") + tk.MustQuery("select /*+ USE_INDEX_MERGE(t, ia, ib) */ * from t where a > 0 or b > 0").Check( + testkit.Rows("1 10 1 1"), + ) + tk.MustQuery("select /*+ NO_INDEX_MERGE() */ * from t where a > 0 or b > 0").Check( + testkit.Rows("1 10 1 1"), + ) + + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk2.MustExec("update t set v = 11 where id = 1") + + // Make sure index merge plan is used. + plan := tk.MustQuery("explain select /*+ USE_INDEX_MERGE(t, ia, ib) */ * from t where a > 0 or b > 0").Rows()[0][0].(string) + c.Assert(strings.Contains(plan, "IndexMerge_"), IsTrue) + tk.MustQuery("select /*+ USE_INDEX_MERGE(t, ia, ib) */ * from t where a > 0 or b > 0").Check( + testkit.Rows("1 11 1 1"), + ) + tk.MustQuery("select /*+ NO_INDEX_MERGE() */ * from t where a > 0 or b > 0").Check( + testkit.Rows("1 11 1 1"), + ) +} + func (s *testPessimisticSuite) TestGenerateColPointGet(c *C) { atomic.StoreUint64(&tikv.ManagedLockTTL, 3000) defer atomic.StoreUint64(&tikv.ManagedLockTTL, 300) @@ -1417,6 +1623,7 @@ func (s *testPessimisticSuite) TestPessimisticTxnWithDDLAddDropColumn(c *C) { // tk2 starts a pessimistic transaction and make some changes on table t1. // tk executes some ddl statements add/drop column on table t1. + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") tk.MustExec("begin pessimistic") tk.MustExec("update t1 set c2 = c1 * 10") tk2.MustExec("alter table t1 add column c3 int after c1") @@ -1431,6 +1638,7 @@ func (s *testPessimisticSuite) TestPessimisticTxnWithDDLAddDropColumn(c *C) { tk.MustExec("commit") tk.MustQuery("select * from t1").Check(testkit.Rows("1", "2", "5")) } + func (s *testPessimisticSuite) TestPessimisticTxnWithDDLChangeColumn(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk2 := testkit.NewTestKitWithInit(c, s.store) @@ -1443,6 +1651,7 @@ func (s *testPessimisticSuite) TestPessimisticTxnWithDDLChangeColumn(c *C) { tk.MustExec("insert t1 values (1, 77, 'a'), (2, 88, 'b')") // Extend column field length is acceptable. + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") tk.MustExec("begin pessimistic") tk.MustExec("update t1 set c2 = c1 * 10") tk2.MustExec("alter table t1 modify column c2 bigint") @@ -1711,6 +1920,7 @@ func (s *testPessimisticSuite) TestAmendTxnVariable(c *C) { tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 0;") tk3.MustExec("begin pessimistic") tk3.MustExec("insert into t1 values(3, 3, 3)") + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") tk.MustExec("begin pessimistic") tk.MustExec("insert into t1 values(4, 4, 4)") tk2.MustExec("alter table t1 add column new_col int") @@ -1718,11 +1928,12 @@ func (s *testPessimisticSuite) TestAmendTxnVariable(c *C) { c.Assert(err, NotNil) tk.MustExec("commit") tk2.MustQuery("select * from t1").Check(testkit.Rows("1 1 1 ", "2 2 2 ", "4 4 4 ")) + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 0;") // Set off the global variable. tk2.MustExec("set global tidb_enable_amend_pessimistic_txn = 0;") tk4 := testkit.NewTestKitWithInit(c, s.store) - tk4.MustQuery(`show variables like "tidb_enable_amend_pessimistic_txn"`).Check(testkit.Rows("tidb_enable_amend_pessimistic_txn 0")) + tk4.MustQuery(`show variables like "tidb_enable_amend_pessimistic_txn"`).Check(testkit.Rows("tidb_enable_amend_pessimistic_txn OFF")) tk4.MustExec("use test_db") tk4.MustExec("begin pessimistic") tk4.MustExec("insert into t1 values(5, 5, 5, 5)") @@ -1735,9 +1946,6 @@ func (s *testPessimisticSuite) TestAmendTxnVariable(c *C) { tk2.MustExec("alter table t1 add column new_col2 int") tk4.MustExec("commit") tk2.MustQuery("select * from t1").Check(testkit.Rows("1 1 1 ", "2 2 2 ", "4 4 4 ", "5 5 5 ")) - - // Restore. - tk2.MustExec("set global tidb_enable_amend_pessimistic_txn = 1;") } func (s *testPessimisticSuite) TestSelectForUpdateWaitSeconds(c *C) { @@ -1792,15 +2000,16 @@ func (s *testPessimisticSuite) TestSelectForUpdateWaitSeconds(c *C) { func (s *testPessimisticSuite) TestSelectForUpdateConflictRetry(c *C) { defer config.RestoreFunc()() config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true + conf.TiKVClient.AsyncCommit.SafeWindow = 500 * time.Millisecond + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 }) - tk := testkit.NewTestKitWithInit(c, s.store) + tk := s.newAsyncCommitTestKitWithInit(c) tk.MustExec("drop table if exists tk") tk.MustExec("create table tk (c1 int primary key, c2 int)") tk.MustExec("insert into tk values(1,1),(2,2)") - tk2 := testkit.NewTestKitWithInit(c, s.store) - tk3 := testkit.NewTestKitWithInit(c, s.store) + tk2 := s.newAsyncCommitTestKitWithInit(c) + tk3 := s.newAsyncCommitTestKitWithInit(c) tk2.MustExec("begin pessimistic") tk3.MustExec("begin pessimistic") @@ -1809,13 +2018,14 @@ func (s *testPessimisticSuite) TestSelectForUpdateConflictRetry(c *C) { tsCh := make(chan uint64) go func() { tk3.MustExec("update tk set c2 = c2 + 1 where c1 = 1") - lastTS, err := s.store.GetOracle().GetLowResolutionTimestamp(context.Background()) + lastTS, err := s.store.GetOracle().GetLowResolutionTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) tsCh <- lastTS tk3.MustExec("commit") + tsCh <- lastTS }() // tk2LastTS should be its forUpdateTS - tk2LastTS, err := s.store.GetOracle().GetLowResolutionTimestamp(context.Background()) + tk2LastTS, err := s.store.GetOracle().GetLowResolutionTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) tk2.MustExec("commit") @@ -1823,4 +2033,428 @@ func (s *testPessimisticSuite) TestSelectForUpdateConflictRetry(c *C) { // it must get a new ts on pessimistic write conflict so the latest timestamp // should increase c.Assert(tk3LastTs, Greater, tk2LastTS) + // wait until the goroutine exists + <-tsCh +} + +func (s *testPessimisticSuite) TestAsyncCommitWithSchemaChange(c *C) { + // TODO: implement commit_ts calculation in unistore + if !*withTiKV { + return + } + + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = time.Second + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/beforeSchemaCheck", "return"), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/beforeSchemaCheck"), IsNil) + }() + + tk := s.newAsyncCommitTestKitWithInit(c) + tk.MustExec("drop table if exists tk") + tk.MustExec("create table tk (c1 int primary key, c2 int, c3 int)") + tk.MustExec("insert into tk values(1, 1, 1)") + tk2 := s.newAsyncCommitTestKitWithInit(c) + tk3 := s.newAsyncCommitTestKitWithInit(c) + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk2.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + + // The txn tk writes something but with failpoint the primary key is not committed. + tk.MustExec("begin pessimistic") + tk.MustExec("insert into tk values(2, 2, 2)") + tk.MustExec("update tk set c2 = 10 where c1 = 1") + ch := make(chan struct{}) + go func() { + // Add index for c2 before commit + tk2.MustExec("alter table tk add index k2(c2)") + ch <- struct{}{} + }() + // sleep 100ms to let add index run first + time.Sleep(100 * time.Millisecond) + // key for c2 should be amended + tk.MustExec("commit") + <-ch + tk3.MustQuery("select * from tk where c2 = 1").Check(testkit.Rows()) + tk3.MustQuery("select * from tk where c2 = 2").Check(testkit.Rows("2 2 2")) + tk3.MustQuery("select * from tk where c2 = 10").Check(testkit.Rows("1 10 1")) + tk3.MustExec("admin check table tk") + + tk.MustExec("begin pessimistic") + tk.MustExec("update tk set c3 = 20 where c1 = 2") + tk.MustExec("insert into tk values(3, 3, 3)") + tk.MustExec("commit") + // Add index for c3 after commit + tk2.MustExec("alter table tk add index k3(c3)") + tk3.MustQuery("select * from tk where c3 = 2").Check(testkit.Rows()) + tk3.MustQuery("select * from tk where c3 = 20").Check(testkit.Rows("2 2 20")) + tk3.MustQuery("select * from tk where c3 = 3").Check(testkit.Rows("3 3 3")) + tk3.MustExec("admin check table tk") + + tk.MustExec("drop table if exists tk") + tk.MustExec("create table tk (c1 int primary key, c2 int)") + tk.MustExec("begin pessimistic") + tk.MustExec("insert into tk values(1, 1)") + go func() { + time.Sleep(200 * time.Millisecond) + tk2.MustExec("alter table tk add index k2(c2)") + }() + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/beforePrewrite", "1*sleep(1200)"), IsNil) + tk.MustExec("commit") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/beforePrewrite"), IsNil) + tk3.MustExec("admin check table tk") +} + +func (s *testPessimisticSuite) Test1PCWithSchemaChange(c *C) { + // TODO: implement commit_ts calculation in unistore + if !*withTiKV { + return + } + + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = time.Second + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) + + tk := s.newAsyncCommitTestKitWithInit(c) + tk2 := s.newAsyncCommitTestKitWithInit(c) + tk3 := s.newAsyncCommitTestKitWithInit(c) + + tk.MustExec("drop table if exists tk") + tk.MustExec("create table tk (c1 int primary key, c2 int)") + tk.MustExec("insert into tk values (1, 1)") + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk2.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk3.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + + tk.MustExec("begin pessimistic") + tk.MustExec("insert into tk values(2, 2)") + tk.MustExec("update tk set c2 = 10 where c1 = 1") + ch := make(chan struct{}) + go func() { + // Add index for c2 before commit + tk2.MustExec("alter table tk add index k2(c2)") + ch <- struct{}{} + }() + // sleep 100ms to let add index run first + time.Sleep(100 * time.Millisecond) + // key for c2 should be amended + tk.MustExec("commit") + <-ch + tk3.MustQuery("select * from tk where c2 = 2").Check(testkit.Rows("2 2")) + tk3.MustQuery("select * from tk where c2 = 1").Check(testkit.Rows()) + tk3.MustQuery("select * from tk where c2 = 10").Check(testkit.Rows("1 10")) + tk3.MustExec("admin check table tk") + + tk.MustExec("drop table if exists tk") + tk.MustExec("create table tk (c1 int primary key, c2 int)") + tk.MustExec("begin pessimistic") + tk.MustExec("insert into tk values(1, 1)") + go func() { + time.Sleep(200 * time.Millisecond) + tk2.MustExec("alter table tk add index k2(c2)") + }() + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/beforePrewrite", "1*sleep(1000)"), IsNil) + tk.MustExec("commit") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/beforePrewrite"), IsNil) + tk3.MustExec("admin check table tk") +} + +func (s *testPessimisticSuite) TestAmendForUniqueIndex(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + tk.MustExec("drop database if exists test_db") + tk.MustExec("create database test_db") + tk.MustExec("use test_db") + tk2.MustExec("use test_db") + tk2.MustExec("drop table if exists t1") + tk2.MustExec("create table t1(c1 int primary key, c2 int, c3 int, unique key uk(c2));") + tk2.MustExec("insert into t1 values(1, 1, 1);") + tk2.MustExec("insert into t1 values(2, 2, 2);") + + // New value has duplicates. + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t1 values(3, 3, 3)") + tk.MustExec("insert into t1 values(4, 4, 3)") + tk2.MustExec("alter table t1 add unique index uk1(c3)") + err := tk.ExecToErr("commit") + c.Assert(err, NotNil) + tk2.MustExec("alter table t1 drop index uk1") + tk2.MustExec("admin check table t1") + + // New values has duplicates with old values. + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t1 values(3, 3, 3)") + tk.MustExec("insert into t1 values(4, 4, 1)") + tk2.MustExec("alter table t1 add unique index uk1(c3)") + err = tk.ExecToErr("commit") + c.Assert(err, NotNil) + tk2.MustExec("admin check table t1") + + // Put new values. + tk2.MustQuery("select * from t1 for update").Check(testkit.Rows("1 1 1", "2 2 2")) + tk2.MustExec("alter table t1 drop index uk1") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t1 add unique index uk1(c3)") + tk.MustExec("insert into t1 values(5, 5, 5)") + tk.MustExec("commit") + tk2.MustExec("admin check table t1") + + // Update the old value with same unique key value, should abort. + tk2.MustExec("drop table if exists t;") + tk2.MustExec("create table t (id int auto_increment primary key, c int);") + tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t add unique index uk(c);") + tk.MustExec("update t set c = 2 where id = 3;") + err = tk.ExecToErr("commit") + c.Assert(err, NotNil) + tk2.MustExec("admin check table t") + + // Update the old value with same unique key, but the row key has changed. + tk2.MustExec("drop table if exists t;") + tk2.MustExec("create table t (id int auto_increment primary key, c int);") + tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t values (3, 2) on duplicate key update id = values(id) and c = values(c)") + finishCh := make(chan error) + go func() { + err := tk2.ExecToErr("alter table t add unique index uk(c);") + finishCh <- err + }() + time.Sleep(300 * time.Millisecond) + tk.MustExec("commit") + err = <-finishCh + c.Assert(err, IsNil) + tk2.MustExec("admin check table t") + + // Update the old value with same unique key, but the row key has changed. + /* TODO this case could not pass using unistore because of https://github.com/ngaut/unistore/issues/428. + // Reopen it after fix the unistore issue. + tk2.MustExec("drop table if exists t;") + tk2.MustExec("create table t (id int auto_increment primary key, c int);") + tk2.MustExec("insert into t (id, c) values (1, 2), (3, 4);") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t add unique index uk(c);") + tk.MustExec("insert into t values (3, 2) on duplicate key update id = values(id) and c = values(c)") + tk.MustExec("commit") + tk2.MustExec("admin check table t") + */ + + // Test pessimistic retry for unique index amend. + tk2.MustExec("drop table if exists t;") + tk2.MustExec("create table t (id int key, c int);") + tk2.MustExec("insert into t (id, c) values (1, 1), (2, 2);") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t add unique index uk(c)") + tk.MustExec("insert into t values(3, 5)") + tk.MustExec("update t set c = 4 where c = 2") + errCh := make(chan error, 1) + go func() { + var err error + err = tk2.ExecToErr("begin pessimistic") + if err != nil { + errCh <- err + return + } + err = tk2.ExecToErr("insert into t values(5, 5)") + if err != nil { + errCh <- err + return + } + err = tk2.ExecToErr("delete from t where id = 5") + if err != nil { + errCh <- err + return + } + // let commit in tk start. + errCh <- err + time.Sleep(time.Millisecond * 100) + err = tk2.ExecToErr("commit") + errCh <- err + }() + err = <-errCh + c.Assert(err, Equals, nil) + tk.MustExec("commit") + tk2.MustExec("admin check table t") + err = <-errCh + c.Assert(err, Equals, nil) +} + +func (s *testPessimisticSuite) TestAmendWithColumnTypeChange(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set global tidb_enable_change_column_type = 1;") + defer func() { + tk.MustExec("set global tidb_enable_change_column_type = 0;") + }() + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop database if exists test_db") + tk.MustExec("create database test_db") + tk.MustExec("use test_db") + tk2.MustExec("use test_db") + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1;") + + tk2.MustExec("drop table if exists t") + tk2.MustExec("create table t (id int primary key, v varchar(10));") + tk.MustExec("begin pessimistic") + tk.MustExec("insert into t values (1, \"123456789\")") + tk2.MustExec("alter table t modify column v varchar(5);") + c.Assert(tk.ExecToErr("commit"), NotNil) +} + +func (s *testPessimisticSuite) TestIssue21498(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1") + + for _, partition := range []bool{false, true} { + //RC test + tk.MustExec("drop table if exists t, t1") + createTable := "create table t (id int primary key, v int, index iv (v))" + if partition { + createTable += " partition by range (id) (partition p0 values less than (0),partition p1 values less than (1),partition p2 values less than (2),partition p3 values less than (3),partition pn values less than MAXVALUE)" + } + tk.MustExec(createTable) + tk.MustExec("insert into t values (1, 10), (2, 20), (3, 30), (4, 40)") + tk.MustExec("create table t1(id int)") + tk.MustExec("insert into t1 values(1)") + + tk.MustExec("set tx_isolation = 'READ-COMMITTED'") + tk.MustExec("begin pessimistic") + tk.MustQuery("select * from t where v = 10").Check(testkit.Rows("1 10")) + + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 11 where id = 1") + + tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) + tk.MustQuery("select * from t where v = 11").Check(testkit.Rows("1 11")) + tk.MustQuery("select * from t where id = 1").Check(testkit.Rows("1 11")) + tk.MustExec("admin check table t") + tk.MustExec("commit") + + tk.MustExec("drop table if exists t") + createTable = "create table t (id int primary key, v int, index iv (v), v2 int)" + if partition { + createTable += " partition by range (id) (partition p0 values less than (0),partition p1 values less than (1),partition p2 values less than (2),partition p3 values less than (3),partition pn values less than MAXVALUE)" + } + tk.MustExec(createTable) + tk.MustExec("insert into t values (1, 10, 100), (2, 20, 200), (3, 30, 300), (4, 40, 400)") + + tk.MustExec("begin pessimistic") + tk.MustQuery("select * from t use index (iv) where v = 10").Check(testkit.Rows("1 10 100")) + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 11 where id = 1") + err := tk.ExecToErr("select * from t use index (iv) where v = 10") + c.Assert(err.Error(), Equals, "[planner:1176]Key 'iv' doesn't exist in table 't'") + tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) + tk2.MustExec("update t set id = 5 where id = 1") + err = tk.ExecToErr("select * from t use index (iv) where v = 10") // select with + c.Assert(err.Error(), Equals, "[planner:1176]Key 'iv' doesn't exist in table 't'") + tk.MustQuery("select * from t where v = 10").Check(testkit.Rows()) + if !partition { + // amend transaction does not support partition table + tk.MustExec("insert into t(id, v, v2) select 6, v + 20, v2 + 200 from t where id = 4") // insert ... select with index unchanged + } + err = tk.ExecToErr("insert into t(id, v, v2) select 7, v + 30, v2 + 300 from t use index (iv) where id = 4") // insert ... select with index changed + c.Assert(err.Error(), Equals, "[planner:1176]Key 'iv' doesn't exist in table 't'") + tk.MustExec("admin check table t") // check consistency inside txn + tk.MustExec("commit") + if !partition { + tk.MustQuery("select * from t").Check(testkit.Rows("2 20 200", "3 30 300", "4 40 400", "5 11 100", "6 60 600")) + } + tk.MustExec("admin check table t") // check consistency out of txn + + // RR test for non partition + if partition { + continue + } + + tk.MustExec("set tx_isolation = 'REPEATABLE-READ'") + tk2.MustExec("alter table t add unique index iv(v)") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 21 where v = 20") + tk2.MustExec("update t set v = 31 where v = 30") + tk.MustExec("update t set v = 22 where v = 21") // fast path + tk.CheckExecResult(1, 0) + tk.MustExec("update t set v = 23 where v = 22") + tk.CheckExecResult(1, 0) + tk.MustExec("update t set v = 32 where v >= 31 and v < 40") // common path + tk.CheckExecResult(1, 0) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("2 23 200", "3 32 300", "4 40 400", "5 11 100", "6 60 600")) + + tk2.MustExec("alter table t add unique index iv(v)") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 24 where v = 23") + tk2.MustExec("update t set v = 41 where v = 40") + // fast path + tk.MustQuery("select * from t where v = 23").Check(testkit.Rows("2 23 200")) + tk.MustQuery("select * from t where v = 24").Check(testkit.Rows()) + tk.MustQuery("select * from t where v = 23 for update").Check(testkit.Rows()) + tk.MustQuery("select * from t where v = 24 for update").Check(testkit.Rows("2 24 200")) + tk.MustQuery("select (select id from t where v = 23), id from t1 for update").Check(testkit.Rows("2 1")) + tk.MustQuery("select (select id from t where v = 24), id from t1 for update").Check(testkit.Rows(" 1")) + tk.MustQuery("select (select id from t where v = 23 for update), id from t1").Check(testkit.Rows(" 1")) + tk.MustQuery("select (select id from t where v = 24 for update), id from t1").Check(testkit.Rows("2 1")) + tk.MustQuery("select (select id + 1 from t where v = 24 for update), id from t1").Check(testkit.Rows("3 1")) + // sub queries + tk.MustQuery("select (select id from (select id from t where v = 24 for update) tmp for update), (select id from t where v = 23), id from t where v = 23").Check(testkit.Rows("2 2 2")) + tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp), id from t where v = 23").Check(testkit.Rows("4 2")) + tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp for update), id from t where v = 23").Check(testkit.Rows("4 2")) + tk.MustQuery("select (select id + (select id from t where v = 23 for update) from (select id from t where v = 24 for update) tmp), id from t where v = 23").Check(testkit.Rows(" 2")) + tk.MustQuery("select (select id + (select id from t where v = 23 for update) from (select id from t where v = 24 for update) tmp for update), id from t where v = 23").Check(testkit.Rows(" 2")) + tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 23) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) + tk.MustQuery("select (select id + (select id from t where v = 23) from (select id from t where v = 24 for update) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) + tk.MustQuery("select (select id + (select id from t where v = 24 for update) from (select id from t where v = 23) tmp), id from t where v = 24 for update").Check(testkit.Rows("4 2")) + + // test index look up + tk.MustQuery("select * from t s, t t1 where s.v = 23 and s.id = t1.id").Check(testkit.Rows("2 23 200 2 23 200")) + tk.MustQuery("select * from t s, t t1 where s.v = 24 and s.id = t1.id").Check(testkit.Rows()) + tk.MustQuery("select * from t s, t t1 where s.v = 23 and s.id = t1.id for update").Check(testkit.Rows()) + tk.MustQuery("select * from t s, t t1 where s.v = 24 and s.id = t1.id for update").Check(testkit.Rows("2 24 200 2 24 200")) + tk.MustExec("delete from t where v = 24") + tk.CheckExecResult(1, 0) + // common path + tk.MustQuery("select * from t where v >= 41 and v < 50").Check(testkit.Rows()) + tk.MustQuery("select * from t where v >= 41 and v < 50 for update").Check(testkit.Rows("4 41 400")) + tk.MustExec("delete from t where v >= 41 and v < 50") + tk.CheckExecResult(1, 0) + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("3 32 300", "5 11 100", "6 60 600")) + + tk2.MustExec("alter table t add unique index iv(v)") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 33 where v = 32") + tk.MustExec("insert into t(id, v, v2) select 3 * id, 3 * v, 3 * v2 from t where v = 33") + tk.CheckExecResult(1, 0) + tk.MustExec("insert into t(id, v, v2) select (select 4 * id from t where v = 32) id, 4 * v, 4 * v2 from t where v = 33") + tk.CheckExecResult(1, 0) + err = tk.ExecToErr("insert into t(id, v, v2) select (select 4 * id from t where v = 33) id, 4 * v, 4 * v2 from t where v = 33") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[table:1048]Column 'id' cannot be null") + tk.MustExec("commit") + tk.MustQuery("select * from t").Check(testkit.Rows("3 33 300", "5 11 100", "6 60 600", "9 99 900", "12 132 1200")) + + tk2.MustExec("alter table t add unique index iv(v)") + tk2.MustExec("drop table if exists t1") + tk2.MustExec("create table t1(id int primary key, v int, index iv (v), v2 int)") + tk.MustExec("begin pessimistic") + tk2.MustExec("alter table t drop index iv") + tk2.MustExec("update t set v = 34 where v = 33") + tk2.MustExec("update t set v = 12 where v = 11") + tk.MustExec("insert into t1(id, v, v2) select * from t where v = 33") + tk.CheckExecResult(0, 0) + tk.MustExec("insert into t1(id, v, v2) select * from t where v = 12") + tk.CheckExecResult(1, 0) + tk.MustExec("commit") + tk.MustQuery("select * from t1").Check(testkit.Rows("5 12 100")) + } } diff --git a/session/schema_amender.go b/session/schema_amender.go index a52a64a9bdf8a..5088bfb81e6e5 100644 --- a/session/schema_amender.go +++ b/session/schema_amender.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/errors" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/ddl" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/expression" @@ -169,7 +170,7 @@ func colChangeAmendable(colAtStart *model.ColumnInfo, colAtCommit *model.ColumnI if colAtStart.Charset != colAtCommit.Charset || colAtStart.Collate != colAtCommit.Collate { return errors.Trace(errors.Errorf("charset or collate is not matched for column=%v", colAtCommit.Name.String())) } - _, err := ddl.CheckModifyTypeCompatible(&colAtStart.FieldType, &colAtCommit.FieldType) + _, _, err := ddl.CheckModifyTypeCompatible(&colAtStart.FieldType, &colAtCommit.FieldType) if err != nil { return errors.Trace(err) } @@ -190,8 +191,8 @@ func colChangeAmendable(colAtStart *model.ColumnInfo, colAtCommit *model.ColumnI return nil } -// collectModifyColAmendOps is used to check if there is column change from nullable to not null by now. -// TODO allow column change from nullable to not null, and generate keys check operation. +// collectModifyColAmendOps is used to check if there is only column size increasing change.Other column type changes +// such as column change from nullable to not null or column type change are not supported by now. func (a *amendCollector) collectModifyColAmendOps(tblAtStart, tblAtCommit table.Table) ([]amendOp, error) { for _, colAtCommit := range tblAtCommit.Cols() { colAtStart := findColByID(tblAtStart, colAtCommit.ID) @@ -200,6 +201,13 @@ func (a *amendCollector) collectModifyColAmendOps(tblAtStart, tblAtCommit table. if err != nil { return nil, err } + } else { + // If the column could not be found in the original schema, it could not be decided if this column + // is newly added or modified from an original column.Report error to solve the issue + // https://github.com/pingcap/tidb/issues/21470. This change will make amend fail for adding column + // and modifying columns at the same time. + return nil, errors.Errorf("column=%v id=%v is not found for table=%v checking column modify", + colAtCommit.Name, colAtCommit.ID, tblAtCommit.Meta().Name.String()) } } return nil, nil @@ -218,11 +226,6 @@ func (a *amendCollector) collectIndexAmendOps(sctx sessionctx.Context, tblAtStar amendOpType = ConstOpAddIndex[idxInfoAtStart.Meta().State][idxInfoAtCommit.Meta().State] } if amendOpType != AmendNone { - // TODO unique index amend is not supported by now. - if idxInfoAtCommit.Meta().Unique { - return nil, errors.Trace(errors.Errorf("amend unique index=%v for table=%v is not supported now", - idxInfoAtCommit.Meta().Name, tblAtCommit.Meta().Name)) - } opInfo := &amendOperationAddIndexInfo{} opInfo.AmendOpType = amendOpType opInfo.tblInfoAtStart = tblAtStart @@ -245,18 +248,12 @@ func (a *amendCollector) collectIndexAmendOps(sctx sessionctx.Context, tblAtStar fieldTypes = append(fieldTypes, &col.FieldType) } opInfo.chk = chunk.NewChunkWithCapacity(fieldTypes, 4) - if addIndexNeedRemoveOp(amendOpType) { - removeIndexOp := &amendOperationDeleteOldIndex{ - info: opInfo, - } - res = append(res, removeIndexOp) - } - if addIndexNeedAddOp(amendOpType) { - addNewIndexOp := &amendOperationAddNewIndex{ - info: opInfo, - } - res = append(res, addNewIndexOp) + addNewIndexOp := &amendOperationAddIndex{ + info: opInfo, + insertedNewIndexKeys: make(map[string]struct{}), + deletedOldIndexKeys: make(map[string]struct{}), } + res = append(res, addNewIndexOp) } } return res, nil @@ -285,18 +282,20 @@ func (a *amendCollector) collectTblAmendOps(sctx sessionctx.Context, phyTblID in return nil } -func isDeleteOp(keyOp pb.Op) bool { +// mayGenDelIndexRowKeyOp returns if the row key op could generate Op_Del index key mutations. +func mayGenDelIndexRowKeyOp(keyOp pb.Op) bool { return keyOp == pb.Op_Del || keyOp == pb.Op_Put } -func isInsertOp(keyOp pb.Op) bool { +// mayGenPutIndexRowKeyOp returns if the row key op could generate Op_Put/Op_Insert index key mutations. +func mayGenPutIndexRowKeyOp(keyOp pb.Op) bool { return keyOp == pb.Op_Put || keyOp == pb.Op_Insert } // amendOp is an amend operation for a specific schema change, new mutations will be generated using input ones. type amendOp interface { genMutations(ctx context.Context, sctx sessionctx.Context, commitMutations tikv.CommitterMutations, kvMap *rowKvMap, - resultMutations *tikv.CommitterMutations) error + resultMutations *tikv.PlainMutations) error } // amendOperationAddIndex represents one amend operation related to a specific add index change. @@ -312,14 +311,14 @@ type amendOperationAddIndexInfo struct { chk *chunk.Chunk } -// amendOperationDeleteOldIndex represents the remove operation will be performed on old key values for add index amend. -type amendOperationDeleteOldIndex struct { +// amendOperationAddIndex represents the add operation will be performed on new key values for add index amend. +type amendOperationAddIndex struct { info *amendOperationAddIndexInfo -} -// amendOperationAddNewIndex represents the add operation will be performed on new key values for add index amend. -type amendOperationAddNewIndex struct { - info *amendOperationAddIndexInfo + // insertedNewIndexKeys is used to check duplicates for new index generated by unique key. + insertedNewIndexKeys map[string]struct{} + // deletedOldIndexKeys is used to check duplicates for deleted old index keys. + deletedOldIndexKeys map[string]struct{} } func (a *amendOperationAddIndexInfo) String() string { @@ -334,40 +333,91 @@ func (a *amendOperationAddIndexInfo) String() string { return res } -func (a *amendOperationDeleteOldIndex) genMutations(ctx context.Context, sctx sessionctx.Context, - commitMutations tikv.CommitterMutations, kvMap *rowKvMap, resAddMutations *tikv.CommitterMutations) error { +func (a *amendOperationAddIndex) genMutations(ctx context.Context, sctx sessionctx.Context, commitMutations tikv.CommitterMutations, + kvMap *rowKvMap, resAddMutations *tikv.PlainMutations) error { + // There should be no duplicate keys in deletedOldIndexKeys and insertedNewIndexKeys. + deletedMutations := tikv.NewPlainMutations(32) + insertedMutations := tikv.NewPlainMutations(32) for i, key := range commitMutations.GetKeys() { - keyOp := commitMutations.GetOps()[i] if tablecodec.IsIndexKey(key) || tablecodec.DecodeTableID(key) != a.info.tblInfoAtCommit.Meta().ID { continue } - if !isDeleteOp(keyOp) { - continue + var newIdxMutation *tikv.PlainMutation + var oldIdxMutation *tikv.PlainMutation + var err error + keyOp := commitMutations.GetOp(i) + if addIndexNeedRemoveOp(a.info.AmendOpType) { + if mayGenDelIndexRowKeyOp(keyOp) { + oldIdxMutation, err = a.genOldIdxKey(ctx, sctx, key, kvMap.oldRowKvMap) + if err != nil { + return err + } + } } - err := a.processRowKey(ctx, sctx, key, kvMap.oldRowKvMap, resAddMutations) - if err != nil { - return err + if addIndexNeedAddOp(a.info.AmendOpType) { + if mayGenPutIndexRowKeyOp(keyOp) { + newIdxMutation, err = a.genNewIdxKey(ctx, sctx, key, kvMap.newRowKvMap) + if err != nil { + return err + } + } } + skipMerge := false + if a.info.AmendOpType == AmendNeedAddDeleteAndInsert { + // If the old index key is the same with new index key, then the index related row value + // is not changed in this row, we don't need to add or remove index keys for this row. + if oldIdxMutation != nil && newIdxMutation != nil { + if bytes.Equal(oldIdxMutation.Key, newIdxMutation.Key) { + skipMerge = true + } + } + } + if !skipMerge { + if oldIdxMutation != nil { + deletedMutations.AppendMutation(*oldIdxMutation) + } + if newIdxMutation != nil { + insertedMutations.AppendMutation(*newIdxMutation) + } + } + } + // For unique index, there may be conflicts on the same unique index key from different rows.Consider a update statement, + // "Op_Del" on row_key = 3, row_val = 4, the "Op_Del" unique_key_4 -> nil will be generated. + // "Op_Put" on row_key = 0, row_val = 4, the "Op_Insert" unique_key_4 -> 0 will be generated. + // The "Op_Insert" should cover the "Op_Del" otherwise the new put row value will not have a correspond index value. + if a.info.indexInfoAtCommit.Meta().Unique { + for i := 0; i < len(deletedMutations.GetKeys()); i++ { + key := deletedMutations.GetKeys()[i] + if _, ok := a.insertedNewIndexKeys[string(key)]; !ok { + resAddMutations.Push(deletedMutations.GetOps()[i], key, deletedMutations.GetValues()[i], deletedMutations.GetPessimisticFlags()[i]) + } + } + for i := 0; i < len(insertedMutations.GetKeys()); i++ { + key := insertedMutations.GetKeys()[i] + destKeyOp := pb.Op_Insert + if _, ok := a.deletedOldIndexKeys[string(key)]; ok { + destKeyOp = pb.Op_Put + } + resAddMutations.Push(destKeyOp, key, insertedMutations.GetValues()[i], insertedMutations.GetPessimisticFlags()[i]) + } + } else { + resAddMutations.MergeMutations(deletedMutations) + resAddMutations.MergeMutations(insertedMutations) } return nil } -func (a *amendOperationAddNewIndex) genMutations(ctx context.Context, sctx sessionctx.Context, commitMutations tikv.CommitterMutations, - kvMap *rowKvMap, resAddMutations *tikv.CommitterMutations) error { - for i, key := range commitMutations.GetKeys() { - keyOp := commitMutations.GetOps()[i] - if tablecodec.IsIndexKey(key) || tablecodec.DecodeTableID(key) != a.info.tblInfoAtCommit.Meta().ID { - continue - } - if !isInsertOp(keyOp) { - continue - } - err := a.processRowKey(ctx, sctx, key, kvMap.newRowKvMap, resAddMutations) - if err != nil { - return err +func getCommonHandleDatum(tbl table.Table, row chunk.Row) []types.Datum { + if !tbl.Meta().IsCommonHandle { + return nil + } + datumBuf := make([]types.Datum, 0, 4) + for _, col := range tbl.Cols() { + if mysql.HasPriKeyFlag(col.Flag) { + datumBuf = append(datumBuf, row.GetDatum(col.Offset, &col.FieldType)) } } - return nil + return datumBuf } func (a *amendOperationAddIndexInfo) genIndexKeyValue(ctx context.Context, sctx sessionctx.Context, kvMap map[string][]byte, @@ -392,6 +442,8 @@ func (a *amendOperationAddIndexInfo) genIndexKeyValue(ctx context.Context, sctx idxVals = append(idxVals, chk.GetRow(0).GetDatum(oldCol.Offset, &oldCol.FieldType)) } + rsData := tables.TryGetHandleRestoredDataWrapper(a.tblInfoAtCommit, getCommonHandleDatum(a.tblInfoAtCommit, chk.GetRow(0)), nil) + // Generate index key buf. newIdxKey, distinct, err := tablecodec.GenIndexKey(sctx.GetSessionVars().StmtCtx, a.tblInfoAtCommit.Meta(), a.indexInfoAtCommit.Meta(), a.tblInfoAtCommit.Meta().ID, idxVals, kvHandle, nil) @@ -404,9 +456,8 @@ func (a *amendOperationAddIndexInfo) genIndexKeyValue(ctx context.Context, sctx } // Generate index value buf. - containsNonBinaryString := tables.ContainsNonBinaryString(a.indexInfoAtCommit.Meta().Columns, a.tblInfoAtCommit.Meta().Columns) - newIdxVal, err := tablecodec.GenIndexValue(sctx.GetSessionVars().StmtCtx, a.tblInfoAtCommit.Meta(), - a.indexInfoAtCommit.Meta(), containsNonBinaryString, distinct, false, idxVals, kvHandle) + needRsData := tables.NeedRestoredData(a.indexInfoAtCommit.Meta().Columns, a.tblInfoAtCommit.Meta().Columns) + newIdxVal, err := tablecodec.GenIndexValuePortal(sctx.GetSessionVars().StmtCtx, a.tblInfoAtCommit.Meta(), a.indexInfoAtCommit.Meta(), needRsData, distinct, false, idxVals, kvHandle, 0, rsData) if err != nil { logutil.Logger(ctx).Warn("amend generate index values failed", zap.Error(err)) return nil, nil, errors.Trace(err) @@ -414,39 +465,59 @@ func (a *amendOperationAddIndexInfo) genIndexKeyValue(ctx context.Context, sctx return newIdxKey, newIdxVal, nil } -func (a *amendOperationAddNewIndex) processRowKey(ctx context.Context, sctx sessionctx.Context, key []byte, - kvMap map[string][]byte, resAddMutations *tikv.CommitterMutations) error { +func (a *amendOperationAddIndex) genNewIdxKey(ctx context.Context, sctx sessionctx.Context, key []byte, + kvMap map[string][]byte) (*tikv.PlainMutation, error) { kvHandle, err := tablecodec.DecodeRowKey(key) if err != nil { logutil.Logger(ctx).Error("decode key error", zap.String("key", hex.EncodeToString(key)), zap.Error(err)) - return errors.Trace(err) + return nil, errors.Trace(err) } newIdxKey, newIdxValue, err := a.info.genIndexKeyValue(ctx, sctx, kvMap, key, kvHandle, false) if err != nil { - return errors.Trace(err) + return nil, errors.Trace(err) } - resAddMutations.Push(pb.Op_Put, newIdxKey, newIdxValue, false) - return nil + newIndexOp := pb.Op_Put + isPessimisticLock := false + if _, ok := a.insertedNewIndexKeys[string(newIdxKey)]; ok { + return nil, errors.Trace(errors.Errorf("amend process key same key=%v found for index=%v in table=%v", + newIdxKey, a.info.indexInfoAtCommit.Meta().Name, a.info.tblInfoAtCommit.Meta().Name)) + } + if a.info.indexInfoAtCommit.Meta().Unique { + newIndexOp = pb.Op_Insert + isPessimisticLock = true + } + a.insertedNewIndexKeys[string(newIdxKey)] = struct{}{} + newMutation := &tikv.PlainMutation{KeyOp: newIndexOp, Key: newIdxKey, Value: newIdxValue, IsPessimisticLock: isPessimisticLock} + return newMutation, nil } -func (a *amendOperationDeleteOldIndex) processRowKey(ctx context.Context, sctx sessionctx.Context, key []byte, - oldValKvMap map[string][]byte, resAddMutations *tikv.CommitterMutations) error { +func (a *amendOperationAddIndex) genOldIdxKey(ctx context.Context, sctx sessionctx.Context, key []byte, + oldValKvMap map[string][]byte) (*tikv.PlainMutation, error) { kvHandle, err := tablecodec.DecodeRowKey(key) if err != nil { logutil.Logger(ctx).Error("decode key error", zap.String("key", hex.EncodeToString(key)), zap.Error(err)) - return errors.Trace(err) + return nil, errors.Trace(err) } // Generated delete index key value. newIdxKey, emptyVal, err := a.info.genIndexKeyValue(ctx, sctx, oldValKvMap, key, kvHandle, true) if err != nil { - return errors.Trace(err) + return nil, errors.Trace(err) } // For Op_Put the key may not exist in old key value map. if len(newIdxKey) > 0 { - resAddMutations.Push(pb.Op_Del, newIdxKey, emptyVal, false) + isPessimisticLock := false + if _, ok := a.deletedOldIndexKeys[string(newIdxKey)]; ok { + return nil, errors.Trace(errors.Errorf("amend process key same key=%v found for index=%v in table=%v", + newIdxKey, a.info.indexInfoAtCommit.Meta().Name, a.info.tblInfoAtCommit.Meta().Name)) + } + if a.info.indexInfoAtCommit.Meta().Unique { + isPessimisticLock = true + } + a.deletedOldIndexKeys[string(newIdxKey)] = struct{}{} + return &tikv.PlainMutation{KeyOp: pb.Op_Del, Key: newIdxKey, Value: emptyVal, IsPessimisticLock: isPessimisticLock}, nil } - return nil + return nil, nil } // SchemaAmender is used to amend pessimistic transactions for schema change. @@ -467,15 +538,16 @@ func (s *SchemaAmender) getAmendableKeys(commitMutations tikv.CommitterMutations if tablecodec.IsIndexKey(byteKey) || !info.keyHasAmendOp(byteKey) { continue } - keyOp := commitMutations.GetOps()[i] - if pb.Op_Put == keyOp { + keyOp := commitMutations.GetOp(i) + switch keyOp { + case pb.Op_Put: addKeys = append(addKeys, byteKey) removeKeys = append(removeKeys, byteKey) - } else if pb.Op_Insert == keyOp { + case pb.Op_Insert: addKeys = append(addKeys, byteKey) - } else if pb.Op_Del == keyOp { + case pb.Op_Del: removeKeys = append(removeKeys, byteKey) - } // else Do nothing. + } } return addKeys, removeKeys } @@ -506,11 +578,7 @@ func (s *SchemaAmender) prepareKvMap(ctx context.Context, commitMutations tikv.C } // BatchGet the old key values, the Op_Del and Op_Put types keys in storage using forUpdateTS, the Op_put type is for // row update using the same row key, it may not exist. - snapshot, err := s.sess.GetStore().GetSnapshot(kv.Version{Ver: s.sess.sessionVars.TxnCtx.GetForUpdateTS()}) - if err != nil { - logutil.Logger(ctx).Warn("amend failed to get snapshot using forUpdateTS", zap.Error(err)) - return nil, errors.Trace(err) - } + snapshot := s.sess.GetStore().GetSnapshot(kv.Version{Ver: s.sess.sessionVars.TxnCtx.GetForUpdateTS()}) oldValKvMap, err := snapshot.BatchGet(ctx, removeKeys) if err != nil { logutil.Logger(ctx).Warn("amend failed to batch get kv old keys", zap.Error(err)) @@ -524,15 +592,35 @@ func (s *SchemaAmender) prepareKvMap(ctx context.Context, commitMutations tikv.C return res, nil } +func (s *SchemaAmender) checkDupKeys(ctx context.Context, mutations tikv.CommitterMutations) error { + // Check if there are duplicate key entries. + checkMap := make(map[string]pb.Op) + for i := 0; i < mutations.Len(); i++ { + key := mutations.GetKey(i) + keyOp := mutations.GetOp(i) + keyVal := mutations.GetValue(i) + if foundOp, ok := checkMap[string(key)]; ok { + logutil.Logger(ctx).Error("duplicate key found in amend result mutations", + zap.Stringer("key", kv.Key(key)), + zap.Stringer("foundKeyOp", foundOp), + zap.Stringer("thisKeyOp", keyOp), + zap.Stringer("thisKeyValue", kv.Key(keyVal))) + return errors.Trace(errors.Errorf("duplicate key=%s is found in mutations", kv.Key(key).String())) + } + checkMap[string(key)] = keyOp + } + return nil +} + // genAllAmendMutations generates CommitterMutations for all tables and related amend operations. func (s *SchemaAmender) genAllAmendMutations(ctx context.Context, commitMutations tikv.CommitterMutations, - info *amendCollector) (*tikv.CommitterMutations, error) { + info *amendCollector) (*tikv.PlainMutations, error) { rowKvMap, err := s.prepareKvMap(ctx, commitMutations, info) if err != nil { return nil, err } // Do generate add/remove mutations processing each key. - resultNewMutations := tikv.NewCommiterMutations(32) + resultNewMutations := tikv.NewPlainMutations(32) for _, amendOps := range info.tblAmendOpMap { for _, curOp := range amendOps { err := curOp.genMutations(ctx, s.sess, commitMutations, rowKvMap, &resultNewMutations) @@ -541,13 +629,17 @@ func (s *SchemaAmender) genAllAmendMutations(ctx context.Context, commitMutation } } } + err = s.checkDupKeys(ctx, &resultNewMutations) + if err != nil { + return nil, err + } return &resultNewMutations, nil } // AmendTxn does check and generate amend mutations based on input infoSchema and mutations, mutations need to prewrite // are returned, the input commitMutations will not be changed. func (s *SchemaAmender) AmendTxn(ctx context.Context, startInfoSchema tikv.SchemaVer, change *tikv.RelatedSchemaChange, - commitMutations tikv.CommitterMutations) (*tikv.CommitterMutations, error) { + commitMutations tikv.CommitterMutations) (tikv.CommitterMutations, error) { // Get info schema meta infoSchemaAtStart := startInfoSchema.(infoschema.InfoSchema) infoSchemaAtCheck := change.LatestInfoSchema.(infoschema.InfoSchema) diff --git a/session/schema_amender_test.go b/session/schema_amender_test.go index 73f48bcfcdcee..91ff6a3e29cc4 100644 --- a/session/schema_amender_test.go +++ b/session/schema_amender_test.go @@ -28,10 +28,13 @@ import ( "github.com/pingcap/tidb/planner/core" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/rowcodec" + "go.uber.org/zap" ) var _ = SerialSuites(&testSchemaAmenderSuite{}) @@ -51,14 +54,17 @@ func initTblColIdxID(metaInfo *model.TableInfo) { } for i, idx := range metaInfo.Indices { idx.ID = int64(i + 1) - // TODO unique index is not supported now. - idx.Unique = false + if idx.Name.L == "f_g" { + idx.Unique = true + } else { + idx.Unique = false + } } metaInfo.ID = 1 metaInfo.State = model.StatePublic } -func mutationsEqual(res *tikv.CommitterMutations, expected *tikv.CommitterMutations, c *C) { +func mutationsEqual(res *tikv.PlainMutations, expected *tikv.PlainMutations, c *C) { c.Assert(len(res.GetKeys()), Equals, len(expected.GetKeys())) for i := 0; i < len(res.GetKeys()); i++ { foundIdx := -1 @@ -83,8 +89,10 @@ type data struct { rowValue [][]types.Datum } -func prepareTestData(se *session, mutations *tikv.CommitterMutations, oldTblInfo table.Table, newTblInfo table.Table, - expecetedAmendOps []amendOp, c *C) (*data, *data, tikv.CommitterMutations) { +// Generate exist old data and new data in transaction to be amended. Also generate the expected amend mutations +// according to the old and new data and the full generated expected mutations. +func prepareTestData(se *session, mutations *tikv.PlainMutations, oldTblInfo table.Table, newTblInfo table.Table, + expectedAmendOps []amendOp, c *C) (*data, tikv.PlainMutations) { var err error // Generated test data. colIds := make([]int64, len(oldTblInfo.Meta().Columns)) @@ -99,29 +107,36 @@ func prepareTestData(se *session, mutations *tikv.CommitterMutations, oldTblInfo } KeyOps := []kvrpcpb.Op{kvrpcpb.Op_Put, kvrpcpb.Op_Del, kvrpcpb.Op_Lock, kvrpcpb.Op_Insert, kvrpcpb.Op_Put, kvrpcpb.Op_Del, kvrpcpb.Op_Insert, kvrpcpb.Op_Lock} - oldRowValues := make([][]types.Datum, len(KeyOps)) - newRowValues := make([][]types.Datum, len(KeyOps)) + numberOfRows := len(KeyOps) + oldRowValues := make([][]types.Datum, numberOfRows) + newRowValues := make([][]types.Datum, numberOfRows) rd := rowcodec.Encoder{Enable: true} - newData := &data{} oldData := &data{} - expecteMutations := tikv.NewCommiterMutations(8) + expecteMutations := tikv.NewPlainMutations(8) + oldRowKvMap := make(map[string][]types.Datum) + newRowKvMap := make(map[string][]types.Datum) + // colIdx: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. + // column: a, b, c, d, e, c_str, d_str, e_str, f, g. // Generate old data. - for i := 0; i < len(KeyOps); i++ { + for i := 0; i < numberOfRows; i++ { keyOp := KeyOps[i] thisRowValue := make([]types.Datum, len(basicRowValue)) copy(thisRowValue, basicRowValue) thisRowValue[0] = types.NewIntDatum(int64(i + 1)) thisRowValue[4] = types.NewIntDatum(int64(i + 1 + 4)) + // f_g has a unique index. + thisRowValue[8] = types.NewIntDatum(int64(i + 1 + 8)) - // Save old data. - rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(i+1)) + // Save old data, they will be put into db first. + rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(int64(i+1))) var rowValue []byte rowValue, err = rd.Encode(se.sessionVars.StmtCtx, colIds, thisRowValue, nil) c.Assert(err, IsNil) - if keyOp == kvrpcpb.Op_Del || keyOp == kvrpcpb.Op_Put { + if keyOp == kvrpcpb.Op_Del || keyOp == kvrpcpb.Op_Put || keyOp == kvrpcpb.Op_Lock { // Skip the last Op_put, it has no old row value. if i == 4 { + oldRowValues[i] = nil continue } oldData.keys = append(oldData.keys, rowKey) @@ -129,54 +144,48 @@ func prepareTestData(se *session, mutations *tikv.CommitterMutations, oldTblInfo oldData.ops = append(oldData.ops, keyOp) oldData.rowValue = append(oldData.rowValue, thisRowValue) if keyOp == kvrpcpb.Op_Del { - mutations.Push(keyOp, rowKey, nil, true) + mutations.Push(keyOp, rowKey, []byte{}, true) } } oldRowValues[i] = thisRowValue + oldRowKvMap[string(rowKey)] = thisRowValue } // Generate new data. - for i := 0; i < len(KeyOps); i++ { + for i := 0; i < numberOfRows; i++ { keyOp := KeyOps[i] thisRowValue := make([]types.Datum, len(basicRowValue)) copy(thisRowValue, basicRowValue) thisRowValue[0] = types.NewIntDatum(int64(i + 1)) // New column e value should be different from old row values. thisRowValue[4] = types.NewIntDatum(int64(i+1+4) * 20) + // New column f value should be different since it has a related unique index. + thisRowValue[8] = types.NewIntDatum(int64(i+1+4) * 20) var rowValue []byte // Save new data. - rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(i+1)) + rowKey := tablecodec.EncodeRowKeyWithHandle(oldTblInfo.Meta().ID, kv.IntHandle(int64(i+1))) if keyOp == kvrpcpb.Op_Insert { rowValue, err = tablecodec.EncodeOldRow(se.sessionVars.StmtCtx, thisRowValue, colIds, nil, nil) } else { rowValue, err = rd.Encode(se.sessionVars.StmtCtx, colIds, thisRowValue, nil) } + c.Assert(err, IsNil) if keyOp == kvrpcpb.Op_Put || keyOp == kvrpcpb.Op_Insert { - newData.keys = append(newData.keys, rowKey) - newData.values = append(newData.values, rowValue) - newData.ops = append(newData.ops, keyOp) - newData.rowValue = append(newData.rowValue, thisRowValue) mutations.Push(keyOp, rowKey, rowValue, true) } else if keyOp == kvrpcpb.Op_Lock { mutations.Push(keyOp, rowKey, []byte{}, true) } newRowValues[i] = thisRowValue + newRowKvMap[string(rowKey)] = thisRowValue } - // Prepare expected results. - for _, op := range expecetedAmendOps { - var oldOp *amendOperationDeleteOldIndex - var newOp *amendOperationAddNewIndex + // Prepare expected result mutations. + for _, op := range expectedAmendOps { var info *amendOperationAddIndexInfo - var ok bool - oldOp, ok = op.(*amendOperationDeleteOldIndex) - if ok { - info = oldOp.info - } else { - newOp = op.(*amendOperationAddNewIndex) - info = newOp.info - } + expectedOp, ok := op.(*amendOperationAddIndex) + c.Assert(ok, IsTrue) + info = expectedOp.info var idxVal []byte genIndexKV := func(inputRow []types.Datum) ([]byte, []byte) { indexDatums := make([]types.Datum, len(info.relatedOldIdxCols)) @@ -187,40 +196,57 @@ func prepareTestData(se *session, mutations *tikv.CommitterMutations, oldTblInfo idxKey, _, err := tablecodec.GenIndexKey(se.sessionVars.StmtCtx, newTblInfo.Meta(), info.indexInfoAtCommit.Meta(), newTblInfo.Meta().ID, indexDatums, kvHandle, nil) c.Assert(err, IsNil) - idxVal, err = tablecodec.GenIndexValue(se.sessionVars.StmtCtx, newTblInfo.Meta(), info.indexInfoAtCommit.Meta(), - false, info.indexInfoAtCommit.Meta().Unique, false, indexDatums, kvHandle) + idxVal, err = tablecodec.GenIndexValuePortal(se.sessionVars.StmtCtx, newTblInfo.Meta(), info.indexInfoAtCommit.Meta(), false, info.indexInfoAtCommit.Meta().Unique, false, indexDatums, kvHandle, 0, nil) c.Assert(err, IsNil) return idxKey, idxVal } - _, ok = op.(*amendOperationDeleteOldIndex) - if ok { - c.Assert(addIndexNeedRemoveOp(info.AmendOpType), IsTrue) - for i := range oldData.keys { - if addIndexNeedRemoveOp(info.AmendOpType) && isDeleteOp(oldData.ops[i]) { - thisRowValue := oldData.rowValue[i] + for i := 0; i < len(mutations.GetKeys()); i++ { + oldIdxKeyMutation := tikv.PlainMutations{} + newIdxKeyMutation := tikv.PlainMutations{} + key := mutations.GetKeys()[i] + keyOp := mutations.GetOps()[i] + if addIndexNeedRemoveOp(info.AmendOpType) && mayGenDelIndexRowKeyOp(keyOp) { + thisRowValue := oldRowKvMap[string(key)] + if len(thisRowValue) > 0 { idxKey, _ := genIndexKV(thisRowValue) - expecteMutations.Push(kvrpcpb.Op_Del, idxKey, []byte{}, false) + isPessimisticLock := false + if info.indexInfoAtCommit.Meta().Unique { + isPessimisticLock = true + } + oldIdxKeyMutation.Push(kvrpcpb.Op_Del, idxKey, []byte{}, isPessimisticLock) } } - } - _, ok = op.(*amendOperationAddNewIndex) - if ok { - c.Assert(addIndexNeedAddOp(info.AmendOpType), IsTrue) - for i := range newData.keys { - if addIndexNeedAddOp(info.AmendOpType) && isInsertOp(newData.ops[i]) { - thisRowValue := newData.rowValue[i] - idxKey, idxVal := genIndexKV(thisRowValue) - c.Assert(err, IsNil) - mutOp := kvrpcpb.Op_Put - if info.indexInfoAtCommit.Meta().Unique { - mutOp = kvrpcpb.Op_Insert + if addIndexNeedAddOp(info.AmendOpType) && mayGenPutIndexRowKeyOp(keyOp) { + thisRowValue := newRowKvMap[string(key)] + idxKey, idxVal := genIndexKV(thisRowValue) + mutOp := kvrpcpb.Op_Put + isPessimisticLock := false + if info.indexInfoAtCommit.Meta().Unique { + mutOp = kvrpcpb.Op_Insert + isPessimisticLock = true + } + newIdxKeyMutation.Push(mutOp, idxKey, idxVal, isPessimisticLock) + } + skipMerge := false + if info.AmendOpType == AmendNeedAddDeleteAndInsert { + if len(oldIdxKeyMutation.GetKeys()) > 0 && len(newIdxKeyMutation.GetKeys()) > 0 { + if bytes.Equal(oldIdxKeyMutation.GetKeys()[0], newIdxKeyMutation.GetKeys()[0]) { + skipMerge = true } - expecteMutations.Push(mutOp, idxKey, idxVal, false) + } + } + if !skipMerge { + if len(oldIdxKeyMutation.GetKeys()) > 0 { + expecteMutations.MergeMutations(oldIdxKeyMutation) + } + if len(newIdxKeyMutation.GetKeys()) > 0 { + expecteMutations.MergeMutations(newIdxKeyMutation) } } } } - return newData, oldData, expecteMutations + + return oldData, expecteMutations } func (s *testSchemaAmenderSuite) TestAmendCollectAndGenMutations(c *C) { @@ -232,7 +258,7 @@ func (s *testSchemaAmenderSuite) TestAmendCollectAndGenMutations(c *C) { parser: parser.New(), sessionVars: variable.NewSessionVars(), } - startStates := []model.SchemaState{model.StateNone, model.StateDeleteOnly} + startStates := []model.SchemaState{model.StateNone, model.StateDeleteOnly, model.StateWriteOnly, model.StateWriteReorganization} for _, startState := range startStates { endStatMap := ConstOpAddIndex[startState] var endStates []model.SchemaState @@ -241,6 +267,7 @@ func (s *testSchemaAmenderSuite) TestAmendCollectAndGenMutations(c *C) { } sort.Slice(endStates, func(i, j int) bool { return endStates[i] < endStates[j] }) for _, endState := range endStates { + logutil.BgLogger().Info("[TEST]>>>>>>new round test", zap.Stringer("start", startState), zap.Stringer("end", endState)) // column: a, b, c, d, e, c_str, d_str, e_str, f, g. // PK: a. // indices: c_d_e, e, f, g, f_g, c_d_e_str, c_d_e_str_prefix. @@ -252,6 +279,7 @@ func (s *testSchemaAmenderSuite) TestAmendCollectAndGenMutations(c *C) { c.Assert(err, IsNil) oldTblMeta.Indices[0].State = startState oldTblMeta.Indices[2].State = endState + oldTblMeta.Indices[3].State = startState newTblMeta := core.MockSignedTable() initTblColIdxID(newTblMeta) @@ -274,13 +302,15 @@ func (s *testSchemaAmenderSuite) TestAmendCollectAndGenMutations(c *C) { newTblMeta.Indices[1].State = endState // Indices[3] is dropped newTblMeta.Indices[3].State = startState + // Indices[4] is newly created unique index. + newTblMeta.Indices[4].State = endState // Only the add index amend operations is collected in the results. collector := newAmendCollector() tblID := int64(1) err = collector.collectTblAmendOps(se, tblID, oldTbInfo, newTblInfo, 1< its startTS > the commitTS + // of any previously committed transactions. + s.txn.SetOption(kv.GuaranteeLinearizability, + s.GetSessionVars().TxnCtx.IsExplicit && s.GetSessionVars().GuaranteeLinearizability) + } - return s.txn.Commit(sessionctx.SetCommitCtx(ctx, s)) + return s.txn.Commit(tikvutil.SetSessionID(ctx, s.GetSessionVars().ConnectionID)) } func (s *session) doCommitWithRetry(ctx context.Context) error { @@ -460,6 +516,7 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { // If the transaction is invalid, maybe it has already been rolled back by the client. return nil } + var err error txnSize := s.txn.Size() isPessimistic := s.txn.IsPessimistic() if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { @@ -467,7 +524,7 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { defer span1.Finish() ctx = opentracing.ContextWithSpan(ctx, span1) } - err := s.doCommit(ctx) + err = s.doCommit(ctx) if err != nil { commitRetryLimit := s.sessionVars.RetryLimit if !s.sessionVars.TxnCtx.CouldRetry { @@ -509,8 +566,10 @@ func (s *session) doCommitWithRetry(ctx context.Context) error { } mapper := s.GetSessionVars().TxnCtx.TableDeltaMap if s.statsCollector != nil && mapper != nil { - for id, item := range mapper { - s.statsCollector.Update(id, item.Delta, item.Count, &item.ColSize) + for _, item := range mapper { + if item.TableID > 0 { + s.statsCollector.Update(item.TableID, item.Delta, item.Count, &item.ColSize) + } } } return nil @@ -535,7 +594,6 @@ func (s *session) CommitTxn(ctx context.Context) error { failpoint.Return(err) } }) - s.sessionVars.TxnCtx.Cleanup() return err } @@ -554,13 +612,17 @@ func (s *session) RollbackTxn(ctx context.Context) { } s.txn.changeToInvalid() s.sessionVars.TxnCtx.Cleanup() - s.sessionVars.SetStatusFlag(mysql.ServerStatusInTrans, false) + s.sessionVars.SetInTxn(false) } func (s *session) GetClient() kv.Client { return s.client } +func (s *session) GetMPPClient() kv.MPPClient { + return s.mppClient +} + func (s *session) String() string { // TODO: how to print binded context in values appropriately? sessVars := s.sessionVars @@ -636,7 +698,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { s.sessionVars.RetryInfo.Retrying = false // retryCnt only increments on retryable error, so +1 here. metrics.SessionRetry.Observe(float64(retryCnt + 1)) - s.sessionVars.SetStatusFlag(mysql.ServerStatusInTrans, false) + s.sessionVars.SetInTxn(false) if err != nil { s.RollbackTxn(ctx) } @@ -672,7 +734,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { // We do not have to log the query every time. // We print the queries at the first try only. sql := sqlForLog(st.GetTextToLog()) - if !config.RedactLogEnabled() { + if !sessVars.EnableRedactLog { sql += sessVars.PreparedParams.String() } logutil.Logger(ctx).Warn("retrying", @@ -730,7 +792,7 @@ func (s *session) retry(ctx context.Context, maxCnt uint) (err error) { zap.String("txn", s.txn.GoString())) kv.BackOff(retryCnt) s.txn.changeToInvalid() - s.sessionVars.SetStatusFlag(mysql.ServerStatusInTrans, false) + s.sessionVars.SetInTxn(false) } return err } @@ -751,133 +813,6 @@ func (s *session) sysSessionPool() sessionPool { return domain.GetDomain(s).SysSessionPool() } -// ExecRestrictedSQL implements RestrictedSQLExecutor interface. -// This is used for executing some restricted sql statements, usually executed during a normal statement execution. -// Unlike normal Exec, it doesn't reset statement status, doesn't commit or rollback the current transaction -// and doesn't write binlog. -func (s *session) ExecRestrictedSQL(sql string) ([]chunk.Row, []*ast.ResultField, error) { - return s.ExecRestrictedSQLWithContext(context.TODO(), sql) -} - -// ExecRestrictedSQLWithContext implements RestrictedSQLExecutor interface. -func (s *session) ExecRestrictedSQLWithContext(ctx context.Context, sql string) ([]chunk.Row, []*ast.ResultField, error) { - // Use special session to execute the sql. - tmp, err := s.sysSessionPool().Get() - if err != nil { - return nil, nil, err - } - se := tmp.(*session) - // The special session will share the `InspectionTableCache` with current session - // if the current session in inspection mode. - if cache := s.sessionVars.InspectionTableCache; cache != nil { - se.sessionVars.InspectionTableCache = cache - defer func() { se.sessionVars.InspectionTableCache = nil }() - } - if ok := s.sessionVars.OptimizerUseInvisibleIndexes; ok { - se.sessionVars.OptimizerUseInvisibleIndexes = true - defer func() { se.sessionVars.OptimizerUseInvisibleIndexes = false }() - } - prePruneMode := se.sessionVars.PartitionPruneMode.Load() - defer func() { - if se != nil && se.GetSessionVars().StmtCtx.WarningCount() > 0 { - warnings := se.GetSessionVars().StmtCtx.GetWarnings() - s.GetSessionVars().StmtCtx.AppendWarnings(warnings) - } - se.sessionVars.PartitionPruneMode.Store(prePruneMode) - s.sysSessionPool().Put(tmp) - }() - se.sessionVars.PartitionPruneMode.Store(s.sessionVars.PartitionPruneMode.Load()) - metrics.SessionRestrictedSQLCounter.Inc() - - return execRestrictedSQL(ctx, se, sql) -} - -// ExecRestrictedSQLWithSnapshot implements RestrictedSQLExecutor interface. -// This is used for executing some restricted sql statements with snapshot. -// If current session sets the snapshot timestamp, then execute with this snapshot timestamp. -// Otherwise, execute with the current transaction start timestamp if the transaction is valid. -func (s *session) ExecRestrictedSQLWithSnapshot(sql string) ([]chunk.Row, []*ast.ResultField, error) { - ctx := context.TODO() - - // Use special session to execute the sql. - tmp, err := s.sysSessionPool().Get() - if err != nil { - return nil, nil, err - } - se := tmp.(*session) - // The special session will share the `InspectionTableCache` with current session - // if the current session in inspection mode. - if cache := s.sessionVars.InspectionTableCache; cache != nil { - se.sessionVars.InspectionTableCache = cache - defer func() { se.sessionVars.InspectionTableCache = nil }() - } - defer s.sysSessionPool().Put(tmp) - metrics.SessionRestrictedSQLCounter.Inc() - var snapshot uint64 - txn, err := s.Txn(false) - if err != nil { - return nil, nil, err - } - if txn.Valid() { - snapshot = s.txn.StartTS() - } - if s.sessionVars.SnapshotTS != 0 { - snapshot = s.sessionVars.SnapshotTS - } - // Set snapshot. - if snapshot != 0 { - se.sessionVars.SnapshotInfoschema, err = domain.GetDomain(s).GetSnapshotInfoSchema(snapshot) - if err != nil { - return nil, nil, err - } - if err := se.sessionVars.SetSystemVar(variable.TiDBSnapshot, strconv.FormatUint(snapshot, 10)); err != nil { - return nil, nil, err - } - defer func() { - if err := se.sessionVars.SetSystemVar(variable.TiDBSnapshot, ""); err != nil { - logutil.BgLogger().Error("set tidbSnapshot error", zap.Error(err)) - } - se.sessionVars.SnapshotInfoschema = nil - }() - } - if ok := s.sessionVars.OptimizerUseInvisibleIndexes; ok { - se.sessionVars.OptimizerUseInvisibleIndexes = true - defer func() { se.sessionVars.OptimizerUseInvisibleIndexes = false }() - } - return execRestrictedSQL(ctx, se, sql) -} - -func execRestrictedSQL(ctx context.Context, se *session, sql string) ([]chunk.Row, []*ast.ResultField, error) { - ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) - startTime := time.Now() - recordSets, err := se.Execute(ctx, sql) - if err != nil { - return nil, nil, err - } - - var ( - rows []chunk.Row - fields []*ast.ResultField - ) - // Execute all recordset, take out the first one as result. - for i, rs := range recordSets { - tmp, err := drainRecordSet(ctx, se, rs) - if err != nil { - return nil, nil, err - } - if err = rs.Close(); err != nil { - return nil, nil, err - } - - if i == 0 { - rows = tmp - fields = rs.Fields() - } - } - metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal).Observe(time.Since(startTime).Seconds()) - return rows, fields, nil -} - func createSessionFunc(store kv.Storage) pools.Factory { return func() (pools.Resource, error) { se, err := createSession(store) @@ -938,15 +873,19 @@ func drainRecordSet(ctx context.Context, se *session, rs sqlexec.RecordSet) ([]c } } -// getExecRet executes restricted sql and the result is one column. +// getTableValue executes restricted sql and the result is one column. // It returns a string value. -func (s *session) getExecRet(ctx sessionctx.Context, sql string) (string, error) { - rows, fields, err := s.ExecRestrictedSQL(sql) +func (s *session) getTableValue(ctx context.Context, tblName string, varName string) (string, error) { + stmt, err := s.ParseWithParams(ctx, "SELECT VARIABLE_VALUE FROM %n.%n WHERE VARIABLE_NAME=%?", mysql.SystemDB, tblName, varName) + if err != nil { + return "", err + } + rows, fields, err := s.ExecRestrictedStmt(ctx, stmt) if err != nil { return "", err } if len(rows) == 0 { - return "", executor.ErrResultIsEmpty + return "", errResultIsEmpty } d := rows[0].GetDatum(0, &fields[0].Column.FieldType) value, err := d.ToString() @@ -956,36 +895,54 @@ func (s *session) getExecRet(ctx sessionctx.Context, sql string) (string, error) return value, nil } -// GetAllSysVars implements GlobalVarAccessor.GetAllSysVars interface. -func (s *session) GetAllSysVars() (map[string]string, error) { - if s.Value(sessionctx.Initing) != nil { - return nil, nil +var gcVariableComments = map[string]string{ + variable.TiDBGCRunInterval: "GC run interval, at least 10m, in Go format.", + variable.TiDBGCLifetime: "All versions within life time will not be collected by GC, at least 10m, in Go format.", + variable.TiDBGCConcurrency: "How many goroutines used to do GC parallel, [1, 128], default 2", + variable.TiDBGCEnable: "Current GC enable status", + tiKVGCAutoConcurrency: "Let TiDB pick the concurrency automatically. If set false, tikv_gc_concurrency will be used", + variable.TiDBGCScanLockMode: "Mode of scanning locks, \"physical\" or \"legacy\"", +} + +// replaceTableValue executes restricted sql updates the variable value +func (s *session) replaceTableValue(ctx context.Context, tblName string, varName, val string) error { + if tblName == mysql.TiDBTable { // maintain comment metadata + comment := gcVariableComments[varName] + stmt, err := s.ParseWithParams(ctx, `REPLACE INTO %n.%n (variable_name, variable_value, comment) VALUES (%?, %?, %?)`, mysql.SystemDB, tblName, varName, val, comment) + if err != nil { + return err + } + _, _, err = s.ExecRestrictedStmt(ctx, stmt) + return err } - sql := `SELECT VARIABLE_NAME, VARIABLE_VALUE FROM %s.%s;` - sql = fmt.Sprintf(sql, mysql.SystemDB, mysql.GlobalVariablesTable) - rows, _, err := s.ExecRestrictedSQL(sql) + stmt, err := s.ParseWithParams(ctx, `REPLACE INTO %n.%n (variable_name, variable_value) VALUES (%?, %?)`, mysql.SystemDB, tblName, varName, val) if err != nil { - return nil, err + return err } - ret := make(map[string]string, len(rows)) - for _, r := range rows { - k, v := r.GetString(0), r.GetString(1) - ret[k] = v + _, _, err = s.ExecRestrictedStmt(ctx, stmt) + return err +} + +func (s *session) varFromTiDBTable(name string) bool { + switch name { + case variable.TiDBGCConcurrency, variable.TiDBGCEnable, variable.TiDBGCRunInterval, variable.TiDBGCLifetime, variable.TiDBGCScanLockMode: + return true } - return ret, nil + return false } // GetGlobalSysVar implements GlobalVarAccessor.GetGlobalSysVar interface. func (s *session) GetGlobalSysVar(name string) (string, error) { + if name == variable.TiDBSlowLogMasking { + name = variable.TiDBRedactLog + } if s.Value(sessionctx.Initing) != nil { // When running bootstrap or upgrade, we should not access global storage. return "", nil } - sql := fmt.Sprintf(`SELECT VARIABLE_VALUE FROM %s.%s WHERE VARIABLE_NAME="%s";`, - mysql.SystemDB, mysql.GlobalVariablesTable, name) - sysVar, err := s.getExecRet(s, sql) + sysVar, err := s.getTableValue(context.TODO(), mysql.GlobalVariablesTable, name) if err != nil { - if executor.ErrResultIsEmpty.Equal(err) { + if errResultIsEmpty.Equal(err) { sv := variable.GetSysVar(name) if sv != nil { return sv.Value, nil @@ -994,11 +951,18 @@ func (s *session) GetGlobalSysVar(name string) (string, error) { } return "", err } + // Fetch mysql.tidb values if required + if s.varFromTiDBTable(name) { + return s.getTiDBTableValue(name, sysVar) + } return sysVar, nil } // SetGlobalSysVar implements GlobalVarAccessor.SetGlobalSysVar interface. func (s *session) SetGlobalSysVar(name, value string) error { + if name == variable.TiDBSlowLogMasking { + name = variable.TiDBRedactLog + } if name == variable.SQLModeVar { value = mysql.FormatSQLModeStr(value) if _, err := mysql.GetSQLMode(value); err != nil { @@ -1012,13 +976,97 @@ func (s *session) SetGlobalSysVar(name, value string) error { return err } name = strings.ToLower(name) + // update mysql.tidb if required. + if s.varFromTiDBTable(name) { + if err = s.setTiDBTableValue(name, sVal); err != nil { + return err + } + } variable.CheckDeprecationSetSystemVar(s.sessionVars, name) - sql := fmt.Sprintf(`REPLACE %s.%s VALUES ('%s', '%s');`, - mysql.SystemDB, mysql.GlobalVariablesTable, name, sVal) - _, _, err = s.ExecRestrictedSQL(sql) + stmt, err := s.ParseWithParams(context.TODO(), "REPLACE %n.%n VALUES (%?, %?)", mysql.SystemDB, mysql.GlobalVariablesTable, name, sVal) + if err != nil { + return err + } + _, _, err = s.ExecRestrictedStmt(context.TODO(), stmt) + return err +} + +// setTiDBTableValue handles tikv_* sysvars which need to update mysql.tidb +// for backwards compatibility. Validation has already been performed. +func (s *session) setTiDBTableValue(name, val string) error { + if name == variable.TiDBGCConcurrency { + autoConcurrency := "false" + if val == "-1" { + autoConcurrency = "true" + } + err := s.replaceTableValue(context.TODO(), mysql.TiDBTable, tiKVGCAutoConcurrency, autoConcurrency) + if err != nil { + return err + } + } + val = onOffToTrueFalse(val) + err := s.replaceTableValue(context.TODO(), mysql.TiDBTable, gcVariableMap[name], val) return err } +// In mysql.tidb the convention has been to store the string value "true"/"false", +// but sysvars use the convention ON/OFF. +func trueFalseToOnOff(str string) string { + if strings.EqualFold("true", str) { + return variable.BoolOn + } else if strings.EqualFold("false", str) { + return variable.BoolOff + } + return str +} + +// In mysql.tidb the convention has been to store the string value "true"/"false", +// but sysvars use the convention ON/OFF. +func onOffToTrueFalse(str string) string { + if strings.EqualFold("ON", str) { + return "true" + } else if strings.EqualFold("OFF", str) { + return "false" + } + return str +} + +// getTiDBTableValue handles tikv_* sysvars which need +// to read from mysql.tidb for backwards compatibility. +func (s *session) getTiDBTableValue(name, val string) (string, error) { + if name == variable.TiDBGCConcurrency { + // Check if autoconcurrency is set + autoConcurrencyVal, err := s.getTableValue(context.TODO(), mysql.TiDBTable, tiKVGCAutoConcurrency) + if err == nil && strings.EqualFold(autoConcurrencyVal, "true") { + return "-1", nil // convention for "AUTO" + } + } + tblValue, err := s.getTableValue(context.TODO(), mysql.TiDBTable, gcVariableMap[name]) + if err != nil { + return val, nil // mysql.tidb value does not exist. + } + // Run validation on the tblValue. This will return an error if it can't be validated, + // but will also make it more consistent: disTribuTeD -> DISTRIBUTED etc + tblValue = trueFalseToOnOff(tblValue) + validatedVal, err := variable.ValidateSetSystemVar(s.sessionVars, name, tblValue, variable.ScopeGlobal) + if err != nil { + logutil.Logger(context.Background()).Warn("restoring sysvar value since validating mysql.tidb value failed", + zap.Error(err), + zap.String("name", name), + zap.String("tblName", gcVariableMap[name]), + zap.String("tblValue", tblValue), + zap.String("restoredValue", val)) + err = s.replaceTableValue(context.TODO(), mysql.TiDBTable, gcVariableMap[name], val) + return val, err + } + if validatedVal != val { + // The sysvar value is out of sync. + err = s.replaceTableValue(context.TODO(), mysql.GlobalVariablesTable, gcVariableMap[name], validatedVal) + return validatedVal, err + } + return validatedVal, nil +} + func (s *session) ParseSQL(ctx context.Context, sql, charset, collation string) ([]ast.StmtNode, []error, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.ParseSQL", opentracing.ChildOf(span.Context())) @@ -1026,7 +1074,7 @@ func (s *session) ParseSQL(ctx context.Context, sql, charset, collation string) } defer trace.StartRegion(ctx, "ParseSQL").End() s.parser.SetSQLMode(s.sessionVars.SQLMode) - s.parser.EnableWindowFunc(s.sessionVars.EnableWindowFunction) + s.parser.SetParserConfig(s.sessionVars.BuildParserConfig()) return s.parser.Parse(sql, charset, collation) } @@ -1041,12 +1089,17 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu if command != mysql.ComSleep || s.GetSessionVars().InTxn() { curTxnStartTS = s.sessionVars.TxnCtx.StartTS } + p := s.currentPlan + if explain, ok := p.(*plannercore.Explain); ok && explain.Analyze && explain.TargetPlan != nil { + p = explain.TargetPlan + } pi := util.ProcessInfo{ ID: s.sessionVars.ConnectionID, + Port: s.sessionVars.Port, DB: s.sessionVars.CurrentDB, Command: command, - Plan: s.currentPlan, - PlanExplainRows: plannercore.GetExplainRowsForPlan(s.currentPlan), + Plan: p, + PlanExplainRows: plannercore.GetExplainRowsForPlan(p), RuntimeStatsColl: s.sessionVars.StmtCtx.RuntimeStatsColl, Time: t, State: s.Status(), @@ -1055,9 +1108,28 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu StmtCtx: s.sessionVars.StmtCtx, StatsInfo: plannercore.GetStatsInfo, MaxExecutionTime: maxExecutionTime, + RedactSQL: s.sessionVars.EnableRedactLog, + } + oldPi := s.ShowProcess() + if p == nil { + // Store the last valid plan when the current plan is nil. + // This is for `explain for connection` statement has the ability to query the last valid plan. + if oldPi != nil && oldPi.Plan != nil && len(oldPi.PlanExplainRows) > 0 { + pi.Plan = oldPi.Plan + pi.PlanExplainRows = oldPi.PlanExplainRows + pi.RuntimeStatsColl = oldPi.RuntimeStatsColl + } + } + // We set process info before building plan, so we extended execution time. + if oldPi != nil && oldPi.Info == pi.Info { + pi.Time = oldPi.Time } _, pi.Digest = s.sessionVars.StmtCtx.SQLDigest() - s.currentPlan = nil + // DO NOT reset the currentPlan to nil until this query finishes execution, otherwise reentrant calls + // of SetProcessInfo would override Plan and PlanExplainRows to nil. + if command == mysql.ComSleep { + s.currentPlan = nil + } if s.sessionVars.User != nil { pi.User = s.sessionVars.User.Username pi.Host = s.sessionVars.User.Hostname @@ -1065,15 +1137,37 @@ func (s *session) SetProcessInfo(sql string, t time.Time, command byte, maxExecu s.processInfo.Store(&pi) } -func (s *session) ExecuteInternal(ctx context.Context, sql string) (recordSets []sqlexec.RecordSet, err error) { +func (s *session) ExecuteInternal(ctx context.Context, sql string, args ...interface{}) (rs sqlexec.RecordSet, err error) { origin := s.sessionVars.InRestrictedSQL s.sessionVars.InRestrictedSQL = true defer func() { s.sessionVars.InRestrictedSQL = origin }() - return s.Execute(ctx, sql) + + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("session.ExecuteInternal", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + logutil.Eventf(ctx, "execute: %s", sql) + } + + stmtNode, err := s.ParseWithParams(ctx, sql, args...) + if err != nil { + return nil, err + } + + rs, err = s.ExecuteStmt(ctx, stmtNode) + if err != nil { + s.sessionVars.StmtCtx.AppendError(err) + } + if rs == nil { + return nil, err + } + + return rs, err } +// Execute is deprecated, we can remove it as soon as plugins are migrated. func (s *session) Execute(ctx context.Context, sql string) (recordSets []sqlexec.RecordSet, err error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.Execute", opentracing.ChildOf(span.Context())) @@ -1111,7 +1205,11 @@ func (s *session) Parse(ctx context.Context, sql string) ([]ast.StmtNode, error) // Only print log message when this SQL is from the user. // Mute the warning for internal SQLs. if !s.sessionVars.InRestrictedSQL { - logutil.Logger(ctx).Warn("parse SQL failed", zap.Error(err), zap.String("SQL", sql)) + if s.sessionVars.EnableRedactLog { + logutil.Logger(ctx).Debug("parse SQL failed", zap.Error(err), zap.String("SQL", sql)) + } else { + logutil.Logger(ctx).Warn("parse SQL failed", zap.Error(err), zap.String("SQL", sql)) + } } return nil, util.SyntaxError(err) } @@ -1130,6 +1228,148 @@ func (s *session) Parse(ctx context.Context, sql string) ([]ast.StmtNode, error) return stmts, nil } +// ParseWithParams parses a query string, with arguments, to raw ast.StmtNode. +// Note that it will not do escaping if no variable arguments are passed. +func (s *session) ParseWithParams(ctx context.Context, sql string, args ...interface{}) (ast.StmtNode, error) { + var err error + if len(args) > 0 { + sql, err = sqlexec.EscapeSQL(sql, args...) + if err != nil { + return nil, err + } + } + + internal := s.isInternal() + + var stmts []ast.StmtNode + var warns []error + var parseStartTime time.Time + if internal { + // Do no respect the settings from clients, if it is for internal usage. + // Charsets from clients may give chance injections. + // Refer to https://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string/12118602. + parseStartTime = time.Now() + stmts, warns, err = s.ParseSQL(ctx, sql, mysql.UTF8MB4Charset, mysql.UTF8MB4DefaultCollation) + } else { + charsetInfo, collation := s.sessionVars.GetCharsetInfo() + parseStartTime = time.Now() + stmts, warns, err = s.ParseSQL(ctx, sql, charsetInfo, collation) + } + if len(stmts) != 1 { + err = errors.New("run multiple statements internally is not supported") + } + if err != nil { + s.rollbackOnError(ctx) + // Only print log message when this SQL is from the user. + // Mute the warning for internal SQLs. + if !s.sessionVars.InRestrictedSQL { + if s.sessionVars.EnableRedactLog { + logutil.Logger(ctx).Debug("parse SQL failed", zap.Error(err), zap.String("SQL", sql)) + } else { + logutil.Logger(ctx).Warn("parse SQL failed", zap.Error(err), zap.String("SQL", sql)) + } + } + return nil, util.SyntaxError(err) + } + durParse := time.Since(parseStartTime) + if s.isInternal() { + sessionExecuteParseDurationInternal.Observe(durParse.Seconds()) + } else { + sessionExecuteParseDurationGeneral.Observe(durParse.Seconds()) + } + for _, warn := range warns { + s.sessionVars.StmtCtx.AppendWarning(util.SyntaxWarn(warn)) + } + return stmts[0], nil +} + +// ExecRestrictedStmt implements RestrictedSQLExecutor interface. +func (s *session) ExecRestrictedStmt(ctx context.Context, stmtNode ast.StmtNode, opts ...sqlexec.OptionFuncAlias) ( + []chunk.Row, []*ast.ResultField, error) { + var execOption sqlexec.ExecOption + for _, opt := range opts { + opt(&execOption) + } + // Use special session to execute the sql. + tmp, err := s.sysSessionPool().Get() + if err != nil { + return nil, nil, err + } + defer s.sysSessionPool().Put(tmp) + se := tmp.(*session) + + startTime := time.Now() + // The special session will share the `InspectionTableCache` with current session + // if the current session in inspection mode. + if cache := s.sessionVars.InspectionTableCache; cache != nil { + se.sessionVars.InspectionTableCache = cache + defer func() { se.sessionVars.InspectionTableCache = nil }() + } + if ok := s.sessionVars.OptimizerUseInvisibleIndexes; ok { + se.sessionVars.OptimizerUseInvisibleIndexes = true + defer func() { se.sessionVars.OptimizerUseInvisibleIndexes = false }() + } + prePruneMode := se.sessionVars.PartitionPruneMode.Load() + defer func() { + if !execOption.IgnoreWarning { + if se != nil && se.GetSessionVars().StmtCtx.WarningCount() > 0 { + warnings := se.GetSessionVars().StmtCtx.GetWarnings() + s.GetSessionVars().StmtCtx.AppendWarnings(warnings) + } + } + se.sessionVars.PartitionPruneMode.Store(prePruneMode) + }() + + if execOption.SnapshotTS != 0 { + se.sessionVars.SnapshotInfoschema, err = domain.GetDomain(s).GetSnapshotInfoSchema(execOption.SnapshotTS) + if err != nil { + return nil, nil, err + } + if err := se.sessionVars.SetSystemVar(variable.TiDBSnapshot, strconv.FormatUint(execOption.SnapshotTS, 10)); err != nil { + return nil, nil, err + } + defer func() { + if err := se.sessionVars.SetSystemVar(variable.TiDBSnapshot, ""); err != nil { + logutil.BgLogger().Error("set tidbSnapshot error", zap.Error(err)) + } + se.sessionVars.SnapshotInfoschema = nil + }() + } + + if execOption.AnalyzeVer != 0 { + prevStatsVer := se.sessionVars.AnalyzeVersion + se.sessionVars.AnalyzeVersion = execOption.AnalyzeVer + defer func() { + se.sessionVars.AnalyzeVersion = prevStatsVer + }() + } + + // for analyze stmt we need let worker session follow user session that executing stmt. + se.sessionVars.PartitionPruneMode.Store(s.sessionVars.PartitionPruneMode.Load()) + metrics.SessionRestrictedSQLCounter.Inc() + + ctx = context.WithValue(ctx, execdetails.StmtExecDetailKey, &execdetails.StmtExecDetails{}) + rs, err := se.ExecuteStmt(ctx, stmtNode) + if err != nil { + se.sessionVars.StmtCtx.AppendError(err) + } + if rs == nil { + return nil, nil, err + } + defer func() { + if closeErr := rs.Close(); closeErr != nil { + err = closeErr + } + }() + var rows []chunk.Row + rows, err = drainRecordSet(ctx, se, rs) + if err != nil { + return nil, nil, err + } + metrics.QueryDurationHistogram.WithLabelValues(metrics.LblInternal).Observe(time.Since(startTime).Seconds()) + return rows, rs.Fields(), err +} + func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlexec.RecordSet, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("session.ExecuteStmt", opentracing.ChildOf(span.Context())) @@ -1149,6 +1389,13 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex if err := executor.ResetContextOfStmt(s, stmtNode); err != nil { return nil, err } + if err := s.validateStatementReadOnlyInStaleness(stmtNode); err != nil { + return nil, err + } + + // Uncorrelated subqueries will execute once when building plan, so we reset process info before building plan. + cmd32 := atomic.LoadUint32(&s.GetSessionVars().CommandValue) + s.SetProcessInfo(stmtNode.Text(), time.Now(), byte(cmd32), 0) // Transform abstract syntax tree to a physical plan(stored in executor.ExecStmt). compiler := executor.Compiler{Ctx: s} @@ -1187,6 +1434,51 @@ func (s *session) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlex return recordSet, nil } +func (s *session) validateStatementReadOnlyInStaleness(stmtNode ast.StmtNode) error { + vars := s.GetSessionVars() + if !vars.TxnCtx.IsStaleness { + return nil + } + errMsg := "only support read-only statement during read-only staleness transactions" + node := stmtNode.(ast.Node) + switch node.(type) { + case *ast.SplitRegionStmt: + return nil + case *ast.SelectStmt, *ast.ExplainStmt, *ast.DoStmt, *ast.ShowStmt, *ast.SetOprStmt, *ast.ExecuteStmt, *ast.SetOprSelectList: + if !planner.IsReadOnly(stmtNode, vars) { + return errors.New(errMsg) + } + return nil + default: + } + // covered DeleteStmt/InsertStmt/UpdateStmt/CallStmt/LoadDataStmt + if _, ok := stmtNode.(ast.DMLNode); ok { + return errors.New(errMsg) + } + return nil +} + +// querySpecialKeys contains the keys of special query, the special query will handled by handleQuerySpecial method. +var querySpecialKeys = []fmt.Stringer{ + executor.LoadDataVarKey, + executor.LoadStatsVarKey, + executor.IndexAdviseVarKey, +} + +func (s *session) hasQuerySpecial() bool { + found := false + s.mu.RLock() + for _, k := range querySpecialKeys { + v := s.mu.values[k] + if v != nil { + found = true + break + } + } + s.mu.RUnlock() + return found +} + // runStmt executes the sqlexec.Statement and commit or rollback the current transaction. func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec.RecordSet, err error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { @@ -1203,6 +1495,21 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. } sessVars := se.sessionVars + + // Record diagnostic information for DML statements + if _, ok := s.(*executor.ExecStmt).StmtNode.(ast.DMLNode); ok { + defer func() { + sessVars.LastQueryInfo = variable.QueryInfo{ + TxnScope: sessVars.CheckAndGetTxnScope(), + StartTS: sessVars.TxnCtx.StartTS, + ForUpdateTS: sessVars.TxnCtx.GetForUpdateTS(), + } + if err != nil { + sessVars.LastQueryInfo.ErrMsg = err.Error() + } + }() + } + // Save origTxnCtx here to avoid it reset in the transaction retry. origTxnCtx := sessVars.TxnCtx err = se.checkTxnAborted(s) @@ -1211,22 +1518,6 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. } rs, err = s.Exec(ctx) sessVars.TxnCtx.StatementCount++ - if !s.IsReadOnly(sessVars) { - // All the history should be added here. - if err == nil && sessVars.TxnCtx.CouldRetry { - GetHistory(se).Add(s, sessVars.StmtCtx) - } - - // Handle the stmt commit/rollback. - if se.txn.Valid() { - if err != nil { - se.StmtRollback() - } else { - se.StmtCommit() - } - } - err = finishStmt(ctx, se, err, s) - } if rs != nil { return &execStmtResult{ RecordSet: rs, @@ -1235,12 +1526,30 @@ func runStmt(ctx context.Context, se *session, s sqlexec.Statement) (rs sqlexec. }, err } - // If it is not a select statement, we record its slow log here, - // then it could include the transaction commit time. - s.(*executor.ExecStmt).FinishExecuteStmt(origTxnCtx.StartTS, err == nil, false) + err = finishStmt(ctx, se, err, s) + if se.hasQuerySpecial() { + // The special query will be handled later in handleQuerySpecial, + // then should call the ExecStmt.FinishExecuteStmt to finish this statement. + se.SetValue(ExecStmtVarKey, s.(*executor.ExecStmt)) + } else { + // If it is not a select statement or special query, we record its slow log here, + // then it could include the transaction commit time. + s.(*executor.ExecStmt).FinishExecuteStmt(origTxnCtx.StartTS, err == nil, false) + } return nil, err } +// ExecStmtVarKeyType is a dummy type to avoid naming collision in context. +type ExecStmtVarKeyType int + +// String defines a Stringer function for debugging and pretty printing. +func (k ExecStmtVarKeyType) String() string { + return "exec_stmt_var_key" +} + +// ExecStmtVarKey is a variable key for ExecStmt. +const ExecStmtVarKey ExecStmtVarKeyType = 0 + // execStmtResult is the return value of ExecuteStmt and it implements the sqlexec.RecordSet interface. // Why we need a struct to wrap a RecordSet and provide another RecordSet? // This is because there are so many session state related things that definitely not belongs to the original @@ -1457,7 +1766,7 @@ func (s *session) Txn(active bool) (kv.Transaction, error) { s.txn.SetOption(kv.Pessimistic, true) } if !s.sessionVars.IsAutocommit() { - s.sessionVars.SetStatusFlag(mysql.ServerStatusInTrans, true) + s.sessionVars.SetInTxn(true) } s.sessionVars.TxnCtx.CouldRetry = s.isTxnRetryable() s.txn.SetVars(s.sessionVars.KVVars) @@ -1508,6 +1817,7 @@ func (s *session) isTxnRetryable() bool { func (s *session) NewTxn(ctx context.Context) error { if s.txn.Valid() { txnID := s.txn.StartTS() + txnScope := s.GetSessionVars().TxnCtx.TxnScope err := s.CommitTxn(ctx) if err != nil { return err @@ -1515,10 +1825,11 @@ func (s *session) NewTxn(ctx context.Context) error { vars := s.GetSessionVars() logutil.Logger(ctx).Info("NewTxn() inside a transaction auto commit", zap.Int64("schemaVersion", vars.TxnCtx.SchemaVersion), - zap.Uint64("txnStartTS", txnID)) + zap.Uint64("txnStartTS", txnID), + zap.String("txnScope", txnScope)) } - txn, err := s.store.Begin() + txn, err := s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(s.sessionVars.CheckAndGetTxnScope())) if err != nil { return err } @@ -1534,6 +1845,8 @@ func (s *session) NewTxn(ctx context.Context) error { CreateTime: time.Now(), StartTS: txn.StartTS(), ShardStep: int(s.sessionVars.ShardAllocateStep), + IsStaleness: false, + TxnScope: s.sessionVars.CheckAndGetTxnScope(), } return nil } @@ -1577,6 +1890,9 @@ func (s *session) Close() { if s.statsCollector != nil { s.statsCollector.Delete() } + if s.idxUsageCollector != nil { + s.idxUsageCollector.Delete() + } bindValue := s.Value(bindinfo.SessionBindInfoKeyType) if bindValue != nil { bindValue.(*bindinfo.SessionHandle).Close() @@ -1728,16 +2044,12 @@ func CreateSessionWithOpt(store kv.Storage, opt *Opt) (Session, error) { // which periodically updates stats using the collected data. if do.StatsHandle() != nil && do.StatsUpdating() { s.statsCollector = do.StatsHandle().NewSessionStatsCollector() + s.idxUsageCollector = do.StatsHandle().NewSessionIndexUsageCollector() } return s, nil } -// loadSystemTZ loads systemTZ from mysql.tidb -func loadSystemTZ(se *session) (string, error) { - return loadParameter(se, "system_tz") -} - // loadCollationParameter loads collation parameter from mysql.tidb func loadCollationParameter(se *session) (bool, error) { para, err := loadParameter(se, tidbNewCollationEnabled) @@ -1755,24 +2067,45 @@ func loadCollationParameter(se *session) (bool, error) { return false, nil } -// loadParameter loads read-only parameter from mysql.tidb -func loadParameter(se *session, name string) (string, error) { - sql := "select variable_value from mysql.tidb where variable_name = '" + name + "'" - rss, errLoad := se.Execute(context.Background(), sql) - if errLoad != nil { - return "", errLoad +// loadDefMemQuotaQuery loads the default value of mem-quota-query. +// We'll read a tuple if the cluster is upgraded from v3.0.x to v4.0.9+. +// An empty result will be returned if it's a newly deployed cluster whose +// version is v4.0.9. +// See the comment upon the function `upgradeToVer54` for details. +func loadDefMemQuotaQuery(se *session) (int64, error) { + _, err := loadParameter(se, tidbDefMemoryQuotaQuery) + if err != nil { + if err == errResultIsEmpty { + return 1 << 30, nil + } + return 1 << 30, err } - // the record of mysql.tidb under where condition: variable_name = $name should shall only be one. - defer func() { - if err := rss[0].Close(); err != nil { - logutil.BgLogger().Error("close result set error", zap.Error(err)) + // If there is a tuple in mysql.tidb, the value must be 32 << 30. + return 32 << 30, nil +} + +func loadDefOOMAction(se *session) (string, error) { + defOOMAction, err := loadParameter(se, tidbDefOOMAction) + if err != nil { + if err == errResultIsEmpty { + return config.GetGlobalConfig().OOMAction, nil } - }() - req := rss[0].NewChunk() - if err := rss[0].Next(context.Background(), req); err != nil { - return "", err + return config.GetGlobalConfig().OOMAction, err + } + if defOOMAction != config.OOMActionLog { + logutil.BgLogger().Warn("Unexpected value of 'default_oom_action' in 'mysql.tidb', use 'log' instead", + zap.String("value", defOOMAction)) } - return req.GetRow(0).GetString(0), nil + return defOOMAction, nil +} + +var ( + errResultIsEmpty = dbterror.ClassExecutor.NewStd(errno.ErrResultIsEmpty) +) + +// loadParameter loads read-only parameter from mysql.tidb +func loadParameter(se *session, name string) (string, error) { + return se.getTableValue(context.TODO(), mysql.TiDBTable, name) } // BootstrapSession runs the first time when the TiDB server start. @@ -1789,8 +2122,6 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { } } - initLoadCommonGlobalVarsSQL() - ver := getStoreBootstrapVersion(store) if ver == notBootstrapped { runInBootstrapSession(store, bootstrap) @@ -1802,8 +2133,9 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { if err != nil { return nil, err } + // get system tz from mysql.tidb - tz, err := loadSystemTZ(se) + tz, err := se.getTableValue(context.TODO(), mysql.TiDBTable, "system_tz") if err != nil { return nil, err } @@ -1819,8 +2151,27 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { collate.EnableNewCollations() } + newMemoryQuotaQuery, err := loadDefMemQuotaQuery(se) + if err != nil { + return nil, err + } + if !config.IsMemoryQuotaQuerySetByUser { + newCfg := *(config.GetGlobalConfig()) + newCfg.MemQuotaQuery = newMemoryQuotaQuery + config.StoreGlobalConfig(&newCfg) + variable.SetSysVar(variable.TIDBMemQuotaQuery, strconv.FormatInt(newCfg.MemQuotaQuery, 10)) + } + newOOMAction, err := loadDefOOMAction(se) + if err != nil { + return nil, err + } + if !config.IsOOMActionSetByUser { + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = newOOMAction + }) + } + dom := domain.GetDomain(se) - dom.InitExpensiveQueryHandle() se2, err := createSession(store) if err != nil { @@ -1852,27 +2203,31 @@ func BootstrapSession(store kv.Storage) (*domain.Domain, error) { } } - err = executor.LoadExprPushdownBlacklist(se) + se4, err := createSession(store) + if err != nil { + return nil, err + } + err = executor.LoadExprPushdownBlacklist(se4) if err != nil { return nil, err } - err = executor.LoadOptRuleBlacklist(se) + err = executor.LoadOptRuleBlacklist(se4) if err != nil { return nil, err } - dom.TelemetryLoop(se) + dom.TelemetryLoop(se4) - se1, err := createSession(store) + se5, err := createSession(store) if err != nil { return nil, err } - err = dom.UpdateTableStatsLoop(se1) + err = dom.UpdateTableStatsLoop(se5) if err != nil { return nil, err } - if raw, ok := store.(tikv.EtcdBackend); ok { + if raw, ok := store.(kv.EtcdBackend); ok { err = raw.StartGCWorker() if err != nil { return nil, err @@ -1923,6 +2278,7 @@ func createSessionWithOpt(store kv.Storage, opt *Opt) (*session, error) { sessionVars: variable.NewSessionVars(), ddlOwnerChecker: dom.DDL().OwnerManager(), client: store.GetClient(), + mppClient: store.GetMPPClient(), } if plannercore.PreparedPlanCacheEnabled() { if opt != nil && opt.PreparedPlanCache != nil { @@ -1955,6 +2311,7 @@ func CreateSessionWithDomain(store kv.Storage, dom *domain.Domain) (*session, er parser: parser.New(), sessionVars: variable.NewSessionVars(), client: store.GetClient(), + mppClient: store.GetMPPClient(), } if plannercore.PreparedPlanCacheEnabled() { s.preparedPlanCache = kvcache.NewSimpleLRUCache(plannercore.PreparedPlanCacheCapacity, @@ -1970,8 +2327,7 @@ func CreateSessionWithDomain(store kv.Storage, dom *domain.Domain) (*session, er } const ( - notBootstrapped = 0 - currentBootstrapVersion = version51 + notBootstrapped = 0 ) func getStoreBootstrapVersion(store kv.Storage) int64 { @@ -1985,7 +2341,7 @@ func getStoreBootstrapVersion(store kv.Storage) int64 { var ver int64 // check in kv store - err := kv.RunInNewTxn(store, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, false, func(ctx context.Context, txn kv.Transaction) error { var err error t := meta.NewMeta(txn) ver, err = t.GetBootstrapVersion() @@ -2008,7 +2364,7 @@ func getStoreBootstrapVersion(store kv.Storage) int64 { func finishBootstrap(store kv.Storage) { setStoreBootstrapped(store.UUID()) - err := kv.RunInNewTxn(store, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), store, true, func(ctx context.Context, txn kv.Transaction) error { t := meta.NewMeta(txn) err := t.FinishBootstrap(currentBootstrapVersion) return err @@ -2047,6 +2403,7 @@ var builtinGlobalVariable = []string{ variable.InnodbLockWaitTimeout, variable.WindowingUseHighPrecision, variable.SQLSelectLimit, + variable.DefaultWeekFormat, /* TiDB specific global variables: */ variable.TiDBSkipASCIICheck, @@ -2061,6 +2418,8 @@ var builtinGlobalVariable = []string{ variable.TiDBHashAggPartialConcurrency, variable.TiDBHashAggFinalConcurrency, variable.TiDBWindowConcurrency, + variable.TiDBMergeJoinConcurrency, + variable.TiDBStreamAggConcurrency, variable.TiDBExecutorConcurrency, variable.TiDBBackoffLockFast, variable.TiDBBackOffWeight, @@ -2069,6 +2428,7 @@ var builtinGlobalVariable = []string{ variable.TiDBDDLReorgBatchSize, variable.TiDBDDLErrorCountLimit, variable.TiDBOptInSubqToJoinAndAgg, + variable.TiDBOptPreferRangeScan, variable.TiDBOptCorrelationThreshold, variable.TiDBOptCorrelationExpFactor, variable.TiDBOptCPUFactor, @@ -2086,6 +2446,7 @@ var builtinGlobalVariable = []string{ variable.TiDBRetryLimit, variable.TiDBDisableTxnAutoRetry, variable.TiDBEnableWindowFunction, + variable.TiDBEnableStrictDoubleTypeCheck, variable.TiDBEnableTablePartition, variable.TiDBEnableVectorizedExpression, variable.TiDBEnableFastAnalyze, @@ -2094,7 +2455,10 @@ var builtinGlobalVariable = []string{ variable.TiDBEnableIndexMerge, variable.TiDBTxnMode, variable.TiDBAllowBatchCop, + variable.TiDBAllowMPPExecution, variable.TiDBOptBCJ, + variable.TiDBBCJThresholdSize, + variable.TiDBBCJThresholdCount, variable.TiDBRowFormatVersion, variable.TiDBEnableStmtSummary, variable.TiDBStmtSummaryInternalQuery, @@ -2106,37 +2470,37 @@ var builtinGlobalVariable = []string{ variable.TiDBCapturePlanBaseline, variable.TiDBUsePlanBaselines, variable.TiDBEvolvePlanBaselines, + variable.TiDBEnableExtendedStats, variable.TiDBIsolationReadEngines, variable.TiDBStoreLimit, variable.TiDBAllowAutoRandExplicitInsert, variable.TiDBEnableClusteredIndex, variable.TiDBPartitionPruneMode, - variable.TiDBSlowLogMasking, variable.TiDBRedactLog, variable.TiDBEnableTelemetry, variable.TiDBShardAllocateStep, variable.TiDBEnableChangeColumnType, + variable.TiDBEnableChangeMultiSchema, + variable.TiDBEnablePointGetCache, + variable.TiDBEnableAlterPlacement, variable.TiDBEnableAmendPessimisticTxn, -} - -var ( - loadCommonGlobalVarsSQLOnce sync.Once - loadCommonGlobalVarsSQL string -) - -func initLoadCommonGlobalVarsSQL() { - loadCommonGlobalVarsSQLOnce.Do(func() { - vars := append(make([]string, 0, len(builtinGlobalVariable)+len(variable.PluginVarNames)), builtinGlobalVariable...) - if len(variable.PluginVarNames) > 0 { - vars = append(vars, variable.PluginVarNames...) - } - loadCommonGlobalVarsSQL = "select HIGH_PRIORITY * from mysql.global_variables where variable_name in ('" + strings.Join(vars, quoteCommaQuote) + "')" - }) + variable.TiDBMemQuotaApplyCache, + variable.TiDBEnableParallelApply, + variable.TiDBMemoryUsageAlarmRatio, + variable.TiDBEnableRateLimitAction, + variable.TiDBEnableAsyncCommit, + variable.TiDBEnable1PC, + variable.TiDBGuaranteeLinearizability, + variable.TiDBAnalyzeVersion, + variable.TiDBEnableIndexMergeJoin, + variable.TiDBTrackAggregateMemoryUsage, + variable.TiDBMultiStatementMode, + variable.TiDBEnableExchangePartition, + variable.TiDBAllowFallbackToTiKV, } // loadCommonGlobalVariablesIfNeeded loads and applies commonly used global variables for the session. func (s *session) loadCommonGlobalVariablesIfNeeded() error { - initLoadCommonGlobalVarsSQL() vars := s.sessionVars if vars.CommonGlobalLoaded { return nil @@ -2151,7 +2515,17 @@ func (s *session) loadCommonGlobalVariablesIfNeeded() error { // When a lot of connections connect to TiDB simultaneously, it can protect TiKV meta region from overload. gvc := domain.GetDomain(s).GetGlobalVarsCache() loadFunc := func() ([]chunk.Row, []*ast.ResultField, error) { - return s.ExecRestrictedSQL(loadCommonGlobalVarsSQL) + vars := append(make([]string, 0, len(builtinGlobalVariable)+len(variable.PluginVarNames)), builtinGlobalVariable...) + if len(variable.PluginVarNames) > 0 { + vars = append(vars, variable.PluginVarNames...) + } + + stmt, err := s.ParseWithParams(context.TODO(), "select HIGH_PRIORITY * from mysql.global_variables where variable_name in (%?)", vars) + if err != nil { + return nil, nil, errors.Trace(err) + } + + return s.ExecRestrictedStmt(context.TODO(), stmt) } rows, fields, err := gvc.LoadGlobalVariables(loadFunc) if err != nil { @@ -2199,6 +2573,7 @@ func (s *session) PrepareTxnCtx(ctx context.Context) { SchemaVersion: is.SchemaMetaVersion(), CreateTime: time.Now(), ShardStep: int(s.sessionVars.ShardAllocateStep), + TxnScope: s.GetSessionVars().CheckAndGetTxnScope(), } if !s.sessionVars.IsAutocommit() || s.sessionVars.RetryInfo.Retrying { if s.sessionVars.TxnMode == ast.Pessimistic { @@ -2209,6 +2584,11 @@ func (s *session) PrepareTxnCtx(ctx context.Context) { // PrepareTSFuture uses to try to get ts future. func (s *session) PrepareTSFuture(ctx context.Context) { + if s.sessionVars.SnapshotTS != 0 { + // Do nothing when @@tidb_snapshot is set. + // In case the latest tso is misused. + return + } if !s.txn.validOrPending() { // Prepare the transaction future if the transaction is invalid (at the beginning of the transaction). txnFuture := s.getTxnFuture(ctx) @@ -2221,7 +2601,13 @@ func (s *session) PrepareTSFuture(ctx context.Context) { // RefreshTxnCtx implements context.RefreshTxnCtx interface. func (s *session) RefreshTxnCtx(ctx context.Context) error { - if err := s.doCommit(ctx); err != nil { + var commitDetail *execdetails.CommitDetails + ctx = context.WithValue(ctx, execdetails.CommitDetailCtxKey, &commitDetail) + err := s.doCommit(ctx) + if commitDetail != nil { + s.GetSessionVars().StmtCtx.MergeExecDetails(nil, commitDetail) + } + if err != nil { return err } @@ -2235,7 +2621,7 @@ func (s *session) InitTxnWithStartTS(startTS uint64) error { } // no need to get txn from txnFutureCh since txn should init with startTs - txn, err := s.store.BeginWithStartTS(startTS) + txn, err := s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(s.GetSessionVars().CheckAndGetTxnScope()).SetStartTs(startTS)) if err != nil { return err } @@ -2248,6 +2634,56 @@ func (s *session) InitTxnWithStartTS(startTS uint64) error { return nil } +// NewTxnWithStalenessOption create a transaction with Staleness option +func (s *session) NewTxnWithStalenessOption(ctx context.Context, option sessionctx.StalenessTxnOption) error { + if s.txn.Valid() { + txnID := s.txn.StartTS() + txnScope := s.txn.GetUnionStore().GetOption(kv.TxnScope).(string) + err := s.CommitTxn(ctx) + if err != nil { + return err + } + vars := s.GetSessionVars() + logutil.Logger(ctx).Info("InitTxnWithExactStaleness() inside a transaction auto commit", + zap.Int64("schemaVersion", vars.TxnCtx.SchemaVersion), + zap.Uint64("txnStartTS", txnID), + zap.String("txnScope", txnScope)) + } + var txn kv.Transaction + var err error + txnScope := s.GetSessionVars().CheckAndGetTxnScope() + switch option.Mode { + case ast.TimestampBoundReadTimestamp: + txn, err = s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(txnScope).SetStartTs(option.StartTS)) + if err != nil { + return err + } + case ast.TimestampBoundExactStaleness: + txn, err = s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(txnScope).SetPrevSec(option.PrevSec)) + if err != nil { + return err + } + default: + // For unsupported staleness txn cases, fallback to NewTxn + return s.NewTxn(ctx) + } + txn.SetVars(s.sessionVars.KVVars) + txn.SetOption(kv.IsStalenessReadOnly, true) + txn.SetOption(kv.TxnScope, txnScope) + s.txn.changeInvalidToValid(txn) + is := domain.GetDomain(s).InfoSchema() + s.sessionVars.TxnCtx = &variable.TransactionContext{ + InfoSchema: is, + SchemaVersion: is.SchemaMetaVersion(), + CreateTime: time.Now(), + StartTS: txn.StartTS(), + ShardStep: int(s.sessionVars.ShardAllocateStep), + IsStaleness: true, + TxnScope: txnScope, + } + return nil +} + // GetStore gets the store of session. func (s *session) GetStore() kv.Storage { return s.store @@ -2291,10 +2727,10 @@ func logStmt(execStmt *executor.ExecStmt, vars *variable.SessionVars) { } func logQuery(query string, vars *variable.SessionVars) { - if atomic.LoadUint32(&variable.ProcessGeneralLog) != 0 && !vars.InRestrictedSQL { + if variable.ProcessGeneralLog.Load() && !vars.InRestrictedSQL { query = executor.QueryReplacer.Replace(query) - if !config.RedactLogEnabled() { - query = query + vars.PreparedParams.String() + if !vars.EnableRedactLog { + query += vars.PreparedParams.String() } logutil.BgLogger().Info("GENERAL_LOG", zap.Uint64("conn", vars.ConnectionID), @@ -2302,7 +2738,7 @@ func logQuery(query string, vars *variable.SessionVars) { zap.Int64("schemaVersion", vars.TxnCtx.SchemaVersion), zap.Uint64("txnStartTS", vars.TxnCtx.StartTS), zap.Uint64("forUpdateTS", vars.TxnCtx.GetForUpdateTS()), - zap.Bool("isReadConsistency", vars.IsReadConsistencyTxn()), + zap.Bool("isReadConsistency", vars.IsIsolation(ast.ReadCommitted)), zap.String("current_db", vars.CurrentDB), zap.String("txn_mode", vars.GetReadableTxnMode()), zap.String("sql", query)) @@ -2328,3 +2764,76 @@ func (s *session) recordOnTransactionExecution(err error, counter int, duration } } } + +func (s *session) checkPlacementPolicyBeforeCommit() error { + var err error + // Get the txnScope of the transaction we're going to commit. + txnScope := s.GetSessionVars().TxnCtx.TxnScope + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + if txnScope != oracle.GlobalTxnScope { + is := infoschema.GetInfoSchema(s) + deltaMap := s.GetSessionVars().TxnCtx.TableDeltaMap + for physicalTableID := range deltaMap { + var tableName string + var partitionName string + tblInfo, _, partInfo := is.FindTableByPartitionID(physicalTableID) + if tblInfo != nil && partInfo != nil { + tableName = tblInfo.Meta().Name.String() + partitionName = partInfo.Name.String() + } else { + tblInfo, _ := is.TableByID(physicalTableID) + tableName = tblInfo.Meta().Name.String() + } + bundle, ok := is.BundleByName(placement.GroupID(physicalTableID)) + if !ok { + errMsg := fmt.Sprintf("table %v doesn't have placement policies with txn_scope %v", + tableName, txnScope) + if len(partitionName) > 0 { + errMsg = fmt.Sprintf("table %v's partition %v doesn't have placement policies with txn_scope %v", + tableName, partitionName, txnScope) + } + err = ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs(errMsg) + break + } + dcLocation, ok := placement.GetLeaderDCByBundle(bundle, placement.DCLabelKey) + if !ok { + errMsg := fmt.Sprintf("table %v's leader placement policy is not defined", tableName) + if len(partitionName) > 0 { + errMsg = fmt.Sprintf("table %v's partition %v's leader placement policy is not defined", tableName, partitionName) + } + err = ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs(errMsg) + break + } + if dcLocation != txnScope { + errMsg := fmt.Sprintf("table %v's leader location %v is out of txn_scope %v", tableName, dcLocation, txnScope) + if len(partitionName) > 0 { + errMsg = fmt.Sprintf("table %v's partition %v's leader location %v is out of txn_scope %v", + tableName, partitionName, dcLocation, txnScope) + } + err = ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs(errMsg) + break + } + // FIXME: currently we assume the physicalTableID is the partition ID. In future, we should consider the situation + // if the physicalTableID belongs to a Table. + partitionID := physicalTableID + tbl, _, partitionDefInfo := is.FindTableByPartitionID(partitionID) + if tbl != nil { + tblInfo := tbl.Meta() + state := tblInfo.Partition.GetStateByID(partitionID) + if state == model.StateGlobalTxnOnly { + err = ddl.ErrInvalidPlacementPolicyCheck.GenWithStackByArgs( + fmt.Sprintf("partition %s of table %s can not be written by local transactions when its placement policy is being altered", + tblInfo.Name, partitionDefInfo.Name)) + break + } + } + } + } + return err +} + +func (s *session) SetPort(port string) { + s.sessionVars.Port = port +} diff --git a/session/session_fail_test.go b/session/session_fail_test.go index 661dabae718a4..8bf7e277cad57 100644 --- a/session/session_fail_test.go +++ b/session/session_fail_test.go @@ -103,3 +103,67 @@ func (s *testSessionSerialSuite) TestClusterTableSendError(c *C) { c.Assert(tk.Se.GetSessionVars().StmtCtx.WarningCount(), Equals, uint16(1)) c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err, ErrorMatches, ".*TiDB server timeout, address is.*") } + +func (s *testSessionSerialSuite) TestAutoCommitNeedNotLinearizability(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1;") + defer tk.MustExec("drop table if exists t1") + tk.MustExec(`create table t1 (c int)`) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/getMinCommitTSFromTSO", `panic`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/getMinCommitTSFromTSO"), IsNil) + }() + + c.Assert(tk.Se.GetSessionVars().SetSystemVar("tidb_enable_async_commit", "1"), IsNil) + c.Assert(tk.Se.GetSessionVars().SetSystemVar("tidb_guarantee_linearizability", "1"), IsNil) + + // Auto-commit transactions don't need to get minCommitTS from TSO + tk.MustExec("INSERT INTO t1 VALUES (1)") + + tk.MustExec("BEGIN") + tk.MustExec("INSERT INTO t1 VALUES (2)") + // An explicit transaction needs to get minCommitTS from TSO + func() { + defer func() { + err := recover() + c.Assert(err, NotNil) + }() + tk.MustExec("COMMIT") + }() + + tk.MustExec("set autocommit = 0") + tk.MustExec("INSERT INTO t1 VALUES (3)") + func() { + defer func() { + err := recover() + c.Assert(err, NotNil) + }() + tk.MustExec("COMMIT") + }() + + // Same for 1PC + tk.MustExec("set autocommit = 1") + c.Assert(tk.Se.GetSessionVars().SetSystemVar("tidb_enable_1pc", "1"), IsNil) + tk.MustExec("INSERT INTO t1 VALUES (4)") + + tk.MustExec("BEGIN") + tk.MustExec("INSERT INTO t1 VALUES (5)") + func() { + defer func() { + err := recover() + c.Assert(err, NotNil) + }() + tk.MustExec("COMMIT") + }() + + tk.MustExec("set autocommit = 0") + tk.MustExec("INSERT INTO t1 VALUES (6)") + func() { + defer func() { + err := recover() + c.Assert(err, NotNil) + }() + tk.MustExec("COMMIT") + }() +} diff --git a/session/session_test.go b/session/session_test.go index aee67f02d7d9e..ee0a68304499f 100644 --- a/session/session_test.go +++ b/session/session_test.go @@ -29,10 +29,12 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/parser" "github.com/pingcap/parser/auth" + "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/executor" "github.com/pingcap/tidb/kv" @@ -43,10 +45,13 @@ import ( "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/binloginfo" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/copr" + "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/table/tables" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/sqlexec" @@ -73,6 +78,8 @@ var _ = Suite(&testIsolationSuite{}) var _ = SerialSuites(&testSchemaSerialSuite{}) var _ = SerialSuites(&testSessionSerialSuite{}) var _ = SerialSuites(&testBackupRestoreSuite{}) +var _ = Suite(&testClusteredSuite{}) +var _ = SerialSuites(&testClusteredSerialSuite{}) type testSessionSuiteBase struct { cluster cluster.Cluster @@ -119,7 +126,7 @@ func clearStorage(store kv.Storage) error { return txn.Commit(context.Background()) } -func clearETCD(ebd tikv.EtcdBackend) error { +func clearETCD(ebd kv.EtcdBackend) error { endpoints, err := ebd.EtcdAddrs() if err != nil { return err @@ -175,15 +182,15 @@ func (s *testSessionSuiteBase) SetUpSuite(c *C) { if *withTiKV { initPdAddrs() s.pdAddr = <-pdAddrChan - var d tikv.Driver + var d driver.TiKVDriver config.UpdateGlobal(func(conf *config.Config) { conf.TxnLocalLatches.Enabled = false }) - store, err := d.Open(fmt.Sprintf("tikv://%s", s.pdAddr)) + store, err := d.Open(fmt.Sprintf("tikv://%s?disableGC=true", s.pdAddr)) c.Assert(err, IsNil) err = clearStorage(store) c.Assert(err, IsNil) - err = clearETCD(store.(tikv.EtcdBackend)) + err = clearETCD(store.(kv.EtcdBackend)) c.Assert(err, IsNil) session.ResetStoreForWithTiKVTest(store) s.store = store @@ -220,11 +227,12 @@ func (s *testSessionSuiteBase) TearDownTest(c *C) { for _, tb := range r.Rows() { tableName := tb[0] tableType := tb[1] - if tableType == "VIEW" { + switch tableType { + case "VIEW": tk.MustExec(fmt.Sprintf("drop view %v", tableName)) - } else if tableType == "BASE TABLE" { + case "BASE TABLE": tk.MustExec(fmt.Sprintf("drop table %v", tableName)) - } else { + default: panic(fmt.Sprintf("Unexpected table '%s' with type '%s'.", tableName, tableType)) } } @@ -366,7 +374,7 @@ func (s *testSessionSuite) TestAffectedRows(c *C) { tk.MustExec("drop table if exists t") tk.MustExec("create table t (id int, c1 timestamp);") - tk.MustExec(`insert t values(1, 0);`) + tk.MustExec(`insert t(id) values(1);`) tk.MustExec(`UPDATE t set id = 1 where id = 1;`) c.Assert(int(tk.Se.AffectedRows()), Equals, 0) @@ -862,13 +870,6 @@ func (s *testSessionSuite) TestDatabase(c *C) { tk.MustExec("drop schema if exists xxx") } -func (s *testSessionSuite) TestExecRestrictedSQL(c *C) { - tk := testkit.NewTestKitWithInit(c, s.store) - r, _, err := tk.Se.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL("select 1;") - c.Assert(err, IsNil) - c.Assert(len(r), Equals, 1) -} - // TestInTrans . See https://dev.mysql.com/doc/internals/en/status-flags.html func (s *testSessionSuite) TestInTrans(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) @@ -1021,8 +1022,10 @@ func (s *testSessionSuite) TestPrepareZero(c *C) { _, rs := tk.Exec("execute s1 using @v1") c.Assert(rs, NotNil) tk.MustExec("set @v2='" + types.ZeroDatetimeStr + "'") + tk.MustExec("set @orig_sql_mode=@@sql_mode; set @@sql_mode='';") tk.MustExec("execute s1 using @v2") tk.MustQuery("select v from t").Check(testkit.Rows("0000-00-00 00:00:00")) + tk.MustExec("set @@sql_mode=@orig_sql_mode;") } func (s *testSessionSuite) TestPrimaryKeyAutoIncrement(c *C) { @@ -1780,12 +1783,12 @@ func (s *testSessionSuite3) TestUnique(c *C) { c.Assert(err, NotNil) // Check error type and error message c.Assert(terror.ErrorEqual(err, kv.ErrKeyExists), IsTrue, Commentf("err %v", err)) - c.Assert(err.Error(), Equals, "previous statement: insert into test(id, val) values(1, 1);: [kv:1062]Duplicate entry '1' for key 'PRIMARY'") + c.Assert(err.Error(), Equals, "previous statement: insert into test(id, val) values(1, 1): [kv:1062]Duplicate entry '1' for key 'PRIMARY'") _, err = tk1.Exec("commit") c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, kv.ErrKeyExists), IsTrue, Commentf("err %v", err)) - c.Assert(err.Error(), Equals, "previous statement: insert into test(id, val) values(2, 2);: [kv:1062]Duplicate entry '2' for key 'val'") + c.Assert(err.Error(), Equals, "previous statement: insert into test(id, val) values(2, 2): [kv:1062]Duplicate entry '2' for key 'val'") // Test for https://github.com/pingcap/tidb/issues/463 tk.MustExec("drop table test;") @@ -2027,7 +2030,7 @@ func (s *testSchemaSerialSuite) TestLoadSchemaFailed(c *C) { _, err = tk1.Exec("commit") c.Check(err, NotNil) - ver, err := s.store.CurrentVersion() + ver, err := s.store.CurrentVersion(oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(ver, NotNil) @@ -2135,6 +2138,8 @@ func (s *testSchemaSuite) TestRetrySchemaChangeForEmptyChange(c *C) { tk.MustExec("insert into t1 values (1)") tk.MustExec("commit") + // TODO remove this enable after fixing table delta map. + tk.MustExec("set tidb_enable_amend_pessimistic_txn = 1") tk.MustExec("begin pessimistic") tk1.MustExec("alter table t add k int") tk.MustExec("select * from t for update") @@ -2691,17 +2696,26 @@ func (s *testSessionSuite2) TestCommitRetryCount(c *C) { func (s *testSessionSuite3) TestEnablePartition(c *C) { tk := testkit.NewTestKitWithInit(c, s.store) tk.MustExec("set tidb_enable_table_partition=off") - tk.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition off")) + tk.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition OFF")) tk.MustExec("set global tidb_enable_table_partition = on") - tk.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition off")) - tk.MustQuery("show global variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition on")) + tk.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition OFF")) + tk.MustQuery("show global variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition ON")) + + tk.MustExec("set tidb_enable_list_partition=off") + tk.MustQuery("show variables like 'tidb_enable_list_partition'").Check(testkit.Rows("tidb_enable_list_partition OFF")) + + tk.MustExec("set tidb_enable_list_partition=1") + tk.MustQuery("show variables like 'tidb_enable_list_partition'").Check(testkit.Rows("tidb_enable_list_partition ON")) + + tk.MustExec("set tidb_enable_list_partition=on") + tk.MustQuery("show variables like 'tidb_enable_list_partition'").Check(testkit.Rows("tidb_enable_list_partition ON")) // Disable global variable cache, so load global session variable take effect immediate. s.dom.GetGlobalVarsCache().Disable() tk1 := testkit.NewTestKitWithInit(c, s.store) - tk1.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition on")) + tk1.MustQuery("show variables like 'tidb_enable_table_partition'").Check(testkit.Rows("tidb_enable_table_partition ON")) } func (s *testSessionSerialSuite) TestTxnRetryErrMsg(c *C) { @@ -2712,9 +2726,9 @@ func (s *testSessionSerialSuite) TestTxnRetryErrMsg(c *C) { tk1.MustExec("begin") tk2.MustExec("update no_retry set id = id + 1") tk1.MustExec("update no_retry set id = id + 1") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/ErrMockRetryableOnly", `return(true)`), IsNil) + c.Assert(tikv.MockRetryableErrorResp.Enable(`return(true)`), IsNil) _, err := tk1.Se.Execute(context.Background(), "commit") - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/ErrMockRetryableOnly"), IsNil) + tikv.MockRetryableErrorResp.Disable() c.Assert(err, NotNil) c.Assert(kv.ErrTxnRetryable.Equal(err), IsTrue, Commentf("error: %s", err)) c.Assert(strings.Contains(err.Error(), "mock retryable error"), IsTrue, Commentf("error: %s", err)) @@ -3237,6 +3251,414 @@ func (s *testSessionSuite2) TestPerStmtTaskID(c *C) { c.Assert(taskID1 != taskID2, IsTrue) } +func (s *testSessionSerialSuite) TestSetTxnScope(c *C) { + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("")`) + tk := testkit.NewTestKitWithInit(c, s.store) + // assert default value + result := tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows(oracle.GlobalTxnScope)) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, oracle.GlobalTxnScope) + // assert set sys variable + tk.MustExec("set @@session.txn_scope = 'local';") + result = tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows(oracle.GlobalTxnScope)) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, oracle.GlobalTxnScope) + failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("bj")`) + defer failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + tk = testkit.NewTestKitWithInit(c, s.store) + // assert default value + result = tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows(oracle.LocalTxnScope)) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, "bj") + // assert set sys variable + tk.MustExec("set @@session.txn_scope = 'global';") + result = tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows(oracle.GlobalTxnScope)) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, oracle.GlobalTxnScope) + + // assert set invalid txn_scope + err := tk.ExecToErr("set @@txn_scope='foo'") + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, `.*txn_scope value should be global or local.*`) +} + +func (s *testSessionSerialSuite) TestGlobalAndLocalTxn(c *C) { + // Because the PD config of check_dev_2 test is not compatible with local/global txn yet, + // so we will skip this test for now. + if *withTiKV { + return + } + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists t1;") + defer tk.MustExec("drop table if exists t1") + tk.MustExec(`create table t1 (c int) +PARTITION BY RANGE (c) ( + PARTITION p0 VALUES LESS THAN (100), + PARTITION p1 VALUES LESS THAN (200) +);`) + // Config the Placement Rules + is := s.dom.InfoSchema() + tb, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + setBundle := func(parName, dc string) { + pid, err := tables.FindPartitionByName(tb.Meta(), parName) + c.Assert(err, IsNil) + groupID := placement.GroupID(pid) + is.SetBundle(&placement.Bundle{ + ID: groupID, + Rules: []*placement.Rule{ + { + GroupID: groupID, + Role: placement.Leader, + Count: 1, + LabelConstraints: []placement.LabelConstraint{ + { + Key: placement.DCLabelKey, + Op: placement.In, + Values: []string{dc}, + }, + { + Key: placement.EngineLabelKey, + Op: placement.NotIn, + Values: []string{placement.EngineLabelTiFlash}, + }, + }, + }, + }, + }) + } + setBundle("p0", "dc-1") + setBundle("p1", "dc-2") + + // set txn_scope to global + tk.MustExec(fmt.Sprintf("set @@session.txn_scope = '%s';", oracle.GlobalTxnScope)) + result := tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows(oracle.GlobalTxnScope)) + + // test global txn auto commit + tk.MustExec("insert into t1 (c) values (1)") // write dc-1 with global scope + result = tk.MustQuery("select * from t1") // read dc-1 and dc-2 with global scope + c.Assert(len(result.Rows()), Equals, 1) + + // begin and commit with global txn scope + tk.MustExec("begin") + txn, err := tk.Se.Txn(true) + c.Assert(err, IsNil) + c.Assert(tk.Se.GetSessionVars().TxnCtx.TxnScope, Equals, oracle.GlobalTxnScope) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("insert into t1 (c) values (1)") // write dc-1 with global scope + result = tk.MustQuery("select * from t1") // read dc-1 and dc-2 with global scope + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("commit") + result = tk.MustQuery("select * from t1") + c.Assert(len(result.Rows()), Equals, 2) + + // begin and rollback with global txn scope + tk.MustExec("begin") + txn, err = tk.Se.Txn(true) + c.Assert(err, IsNil) + c.Assert(tk.Se.GetSessionVars().TxnCtx.TxnScope, Equals, oracle.GlobalTxnScope) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("insert into t1 (c) values (101)") // write dc-2 with global scope + result = tk.MustQuery("select * from t1") // read dc-1 and dc-2 with global scope + c.Assert(len(result.Rows()), Equals, 3) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("rollback") + result = tk.MustQuery("select * from t1") + c.Assert(len(result.Rows()), Equals, 2) + + tk.MustExec("insert into t1 (c) values (101)") // write dc-2 with global scope + result = tk.MustQuery("select * from t1") // read dc-1 and dc-2 with global scope + c.Assert(len(result.Rows()), Equals, 3) + + failpoint.Enable("github.com/pingcap/tidb/config/injectTxnScope", `return("dc-1")`) + defer failpoint.Disable("github.com/pingcap/tidb/config/injectTxnScope") + // set txn_scope to local + tk.MustExec("set @@session.txn_scope = 'local';") + result = tk.MustQuery("select @@txn_scope;") + result.Check(testkit.Rows("local")) + + // test local txn auto commit + tk.MustExec("insert into t1 (c) values (1)") // write dc-1 with dc-1 scope + result = tk.MustQuery("select * from t1 where c < 100") // read dc-1 with dc-1 scope + c.Assert(len(result.Rows()), Equals, 3) + + // begin and commit with dc-1 txn scope + tk.MustExec("begin") + txn, err = tk.Se.Txn(true) + c.Assert(err, IsNil) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, "dc-1") + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("insert into t1 (c) values (1)") // write dc-1 with dc-1 scope + result = tk.MustQuery("select * from t1 where c < 100") // read dc-1 with dc-1 scope + c.Assert(len(result.Rows()), Equals, 4) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("commit") + result = tk.MustQuery("select * from t1 where c < 100") + c.Assert(len(result.Rows()), Equals, 4) + + // begin and rollback with dc-1 txn scope + tk.MustExec("begin") + txn, err = tk.Se.Txn(true) + c.Assert(err, IsNil) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, "dc-1") + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("insert into t1 (c) values (1)") // write dc-1 with dc-1 scope + result = tk.MustQuery("select * from t1 where c < 100") // read dc-1 with dc-1 scope + c.Assert(len(result.Rows()), Equals, 5) + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("rollback") + result = tk.MustQuery("select * from t1 where c < 100") + c.Assert(len(result.Rows()), Equals, 4) + + // test wrong scope local txn auto commit + _, err = tk.Exec("insert into t1 (c) values (101)") // write dc-2 with dc-1 scope + c.Assert(err.Error(), Matches, ".*out of txn_scope.*") + err = tk.ExecToErr("select * from t1 where c > 100") // read dc-2 with dc-1 scope + c.Assert(err.Error(), Matches, ".*can not be read by.*") + + // begin and commit reading & writing the data in dc-2 with dc-1 txn scope + tk.MustExec("begin") + txn, err = tk.Se.Txn(true) + c.Assert(err, IsNil) + c.Assert(tk.Se.GetSessionVars().CheckAndGetTxnScope(), Equals, "dc-1") + c.Assert(txn.Valid(), IsTrue) + tk.MustExec("insert into t1 (c) values (101)") // write dc-2 with dc-1 scope + err = tk.ExecToErr("select * from t1 where c > 100") // read dc-2 with dc-1 scope + c.Assert(err.Error(), Matches, ".*can not be read by.*") + tk.MustExec("insert into t1 (c) values (99)") // write dc-1 with dc-1 scope + result = tk.MustQuery("select * from t1 where c < 100") // read dc-1 with dc-1 scope + c.Assert(len(result.Rows()), Equals, 5) + c.Assert(txn.Valid(), IsTrue) + _, err = tk.Exec("commit") + c.Assert(err.Error(), Matches, ".*out of txn_scope.*") + // Won't read the value 99 because the previous commit failed + result = tk.MustQuery("select * from t1 where c < 100") // read dc-1 with dc-1 scope + c.Assert(len(result.Rows()), Equals, 4) +} + +func (s *testSessionSuite2) TestSetEnableRateLimitAction(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + // assert default value + result := tk.MustQuery("select @@tidb_enable_rate_limit_action;") + result.Check(testkit.Rows("1")) + + // assert set sys variable + tk.MustExec("set global tidb_enable_rate_limit_action= '0';") + tk.Se.Close() + + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + result = tk.MustQuery("select @@tidb_enable_rate_limit_action;") + result.Check(testkit.Rows("0")) +} + +func (s *testSessionSuite3) TestSetVarHint(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + tk.Se.GetSessionVars().SetSystemVar("sql_mode", mysql.DefaultSQLMode) + tk.MustQuery("SELECT /*+ SET_VAR(sql_mode=ALLOW_INVALID_DATES) */ @@sql_mode;").Check(testkit.Rows("ALLOW_INVALID_DATES")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sql_mode;").Check(testkit.Rows(mysql.DefaultSQLMode)) + + tk.Se.GetSessionVars().SetSystemVar("tmp_table_size", "16777216") + tk.MustQuery("SELECT /*+ SET_VAR(tmp_table_size=1024) */ @@tmp_table_size;").Check(testkit.Rows("1024")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@tmp_table_size;").Check(testkit.Rows("16777216")) + + tk.Se.GetSessionVars().SetSystemVar("range_alloc_block_size", "4096") + tk.MustQuery("SELECT /*+ SET_VAR(range_alloc_block_size=4294967295) */ @@range_alloc_block_size;").Check(testkit.Rows("4294967295")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@range_alloc_block_size;").Check(testkit.Rows("4096")) + + tk.Se.GetSessionVars().SetSystemVar("max_execution_time", "0") + tk.MustQuery("SELECT /*+ SET_VAR(max_execution_time=1) */ @@max_execution_time;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_execution_time;").Check(testkit.Rows("0")) + + tk.Se.GetSessionVars().SetSystemVar("time_zone", "SYSTEM") + tk.MustQuery("SELECT /*+ SET_VAR(time_zone='+12:00') */ @@time_zone;").Check(testkit.Rows("+12:00")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@time_zone;").Check(testkit.Rows("SYSTEM")) + + tk.Se.GetSessionVars().SetSystemVar("join_buffer_size", "262144") + tk.MustQuery("SELECT /*+ SET_VAR(join_buffer_size=128) */ @@join_buffer_size;").Check(testkit.Rows("128")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@join_buffer_size;").Check(testkit.Rows("262144")) + + tk.Se.GetSessionVars().SetSystemVar("max_length_for_sort_data", "1024") + tk.MustQuery("SELECT /*+ SET_VAR(max_length_for_sort_data=4) */ @@max_length_for_sort_data;").Check(testkit.Rows("4")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_length_for_sort_data;").Check(testkit.Rows("1024")) + + tk.Se.GetSessionVars().SetSystemVar("max_error_count", "64") + tk.MustQuery("SELECT /*+ SET_VAR(max_error_count=0) */ @@max_error_count;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_error_count;").Check(testkit.Rows("64")) + + tk.Se.GetSessionVars().SetSystemVar("sql_buffer_result", "OFF") + tk.MustQuery("SELECT /*+ SET_VAR(sql_buffer_result=ON) */ @@sql_buffer_result;").Check(testkit.Rows("ON")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sql_buffer_result;").Check(testkit.Rows("OFF")) + + tk.Se.GetSessionVars().SetSystemVar("max_heap_table_size", "16777216") + tk.MustQuery("SELECT /*+ SET_VAR(max_heap_table_size=16384) */ @@max_heap_table_size;").Check(testkit.Rows("16384")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_heap_table_size;").Check(testkit.Rows("16777216")) + + tk.Se.GetSessionVars().SetSystemVar("div_precision_increment", "4") + tk.MustQuery("SELECT /*+ SET_VAR(div_precision_increment=0) */ @@div_precision_increment;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@div_precision_increment;").Check(testkit.Rows("4")) + + tk.Se.GetSessionVars().SetSystemVar("sql_auto_is_null", "0") + tk.MustQuery("SELECT /*+ SET_VAR(sql_auto_is_null=1) */ @@sql_auto_is_null;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sql_auto_is_null;").Check(testkit.Rows("0")) + + tk.Se.GetSessionVars().SetSystemVar("sort_buffer_size", "262144") + tk.MustQuery("SELECT /*+ SET_VAR(sort_buffer_size=32768) */ @@sort_buffer_size;").Check(testkit.Rows("32768")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sort_buffer_size;").Check(testkit.Rows("262144")) + + tk.Se.GetSessionVars().SetSystemVar("max_join_size", "18446744073709551615") + tk.MustQuery("SELECT /*+ SET_VAR(max_join_size=1) */ @@max_join_size;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_join_size;").Check(testkit.Rows("18446744073709551615")) + + tk.Se.GetSessionVars().SetSystemVar("max_seeks_for_key", "18446744073709551615") + tk.MustQuery("SELECT /*+ SET_VAR(max_seeks_for_key=1) */ @@max_seeks_for_key;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_seeks_for_key;").Check(testkit.Rows("18446744073709551615")) + + tk.Se.GetSessionVars().SetSystemVar("max_sort_length", "1024") + tk.MustQuery("SELECT /*+ SET_VAR(max_sort_length=4) */ @@max_sort_length;").Check(testkit.Rows("4")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_sort_length;").Check(testkit.Rows("1024")) + + tk.Se.GetSessionVars().SetSystemVar("bulk_insert_buffer_size", "8388608") + tk.MustQuery("SELECT /*+ SET_VAR(bulk_insert_buffer_size=0) */ @@bulk_insert_buffer_size;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@bulk_insert_buffer_size;").Check(testkit.Rows("8388608")) + + tk.Se.GetSessionVars().SetSystemVar("sql_big_selects", "1") + tk.MustQuery("SELECT /*+ SET_VAR(sql_big_selects=0) */ @@sql_big_selects;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sql_big_selects;").Check(testkit.Rows("1")) + + tk.Se.GetSessionVars().SetSystemVar("read_rnd_buffer_size", "262144") + tk.MustQuery("SELECT /*+ SET_VAR(read_rnd_buffer_size=1) */ @@read_rnd_buffer_size;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@read_rnd_buffer_size;").Check(testkit.Rows("262144")) + + tk.Se.GetSessionVars().SetSystemVar("unique_checks", "1") + tk.MustQuery("SELECT /*+ SET_VAR(unique_checks=0) */ @@unique_checks;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@unique_checks;").Check(testkit.Rows("1")) + + tk.Se.GetSessionVars().SetSystemVar("read_buffer_size", "131072") + tk.MustQuery("SELECT /*+ SET_VAR(read_buffer_size=8192) */ @@read_buffer_size;").Check(testkit.Rows("8192")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@read_buffer_size;").Check(testkit.Rows("131072")) + + tk.Se.GetSessionVars().SetSystemVar("default_tmp_storage_engine", "InnoDB") + tk.MustQuery("SELECT /*+ SET_VAR(default_tmp_storage_engine='CSV') */ @@default_tmp_storage_engine;").Check(testkit.Rows("CSV")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@default_tmp_storage_engine;").Check(testkit.Rows("InnoDB")) + + tk.Se.GetSessionVars().SetSystemVar("optimizer_search_depth", "62") + tk.MustQuery("SELECT /*+ SET_VAR(optimizer_search_depth=1) */ @@optimizer_search_depth;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@optimizer_search_depth;").Check(testkit.Rows("62")) + + tk.Se.GetSessionVars().SetSystemVar("max_points_in_geometry", "65536") + tk.MustQuery("SELECT /*+ SET_VAR(max_points_in_geometry=3) */ @@max_points_in_geometry;").Check(testkit.Rows("3")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@max_points_in_geometry;").Check(testkit.Rows("65536")) + + tk.Se.GetSessionVars().SetSystemVar("updatable_views_with_limit", "YES") + tk.MustQuery("SELECT /*+ SET_VAR(updatable_views_with_limit=0) */ @@updatable_views_with_limit;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@updatable_views_with_limit;").Check(testkit.Rows("YES")) + + tk.Se.GetSessionVars().SetSystemVar("optimizer_prune_level", "1") + tk.MustQuery("SELECT /*+ SET_VAR(optimizer_prune_level=0) */ @@optimizer_prune_level;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@optimizer_prune_level;").Check(testkit.Rows("1")) + + tk.Se.GetSessionVars().SetSystemVar("group_concat_max_len", "1024") + tk.MustQuery("SELECT /*+ SET_VAR(group_concat_max_len=4) */ @@group_concat_max_len;").Check(testkit.Rows("4")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@group_concat_max_len;").Check(testkit.Rows("1024")) + + tk.Se.GetSessionVars().SetSystemVar("eq_range_index_dive_limit", "200") + tk.MustQuery("SELECT /*+ SET_VAR(eq_range_index_dive_limit=0) */ @@eq_range_index_dive_limit;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@eq_range_index_dive_limit;").Check(testkit.Rows("200")) + + tk.Se.GetSessionVars().SetSystemVar("sql_safe_updates", "0") + tk.MustQuery("SELECT /*+ SET_VAR(sql_safe_updates=1) */ @@sql_safe_updates;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@sql_safe_updates;").Check(testkit.Rows("0")) + + tk.Se.GetSessionVars().SetSystemVar("end_markers_in_json", "0") + tk.MustQuery("SELECT /*+ SET_VAR(end_markers_in_json=1) */ @@end_markers_in_json;").Check(testkit.Rows("1")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@end_markers_in_json;").Check(testkit.Rows("0")) + + tk.Se.GetSessionVars().SetSystemVar("windowing_use_high_precision", "ON") + tk.MustQuery("SELECT /*+ SET_VAR(windowing_use_high_precision=OFF) */ @@windowing_use_high_precision;").Check(testkit.Rows("0")) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + tk.MustQuery("SELECT @@windowing_use_high_precision;").Check(testkit.Rows("1")) + + tk.MustExec("SELECT /*+ SET_VAR(sql_safe_updates = 1) SET_VAR(max_heap_table_size = 1G) */ 1;") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 0) + + tk.MustExec("SELECT /*+ SET_VAR(collation_server = 'utf8') */ 1;") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "[planner:3637]Variable 'collation_server' cannot be set using SET_VAR hint.") + + tk.MustExec("SELECT /*+ SET_VAR(max_size = 1G) */ 1;") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "[planner:3128]Unresolved name 'max_size' for SET_VAR hint") + + tk.MustExec("SELECT /*+ SET_VAR(group_concat_max_len = 1024) SET_VAR(group_concat_max_len = 2048) */ 1;") + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings(), HasLen, 1) + c.Assert(tk.Se.GetSessionVars().StmtCtx.GetWarnings()[0].Err.Error(), Equals, "[planner:3126]Hint SET_VAR(group_concat_max_len=2048) is ignored as conflicting/duplicated.") +} + +// TestDeprecateSlowLogMasking should be in serial suite because it changes a global variable. +func (s *testSessionSerialSuite) TestDeprecateSlowLogMasking(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + tk.MustExec("set @@global.tidb_redact_log=0") + tk.MustQuery("select @@global.tidb_redact_log").Check(testkit.Rows("0")) + tk.MustQuery("select @@global.tidb_slow_log_masking").Check(testkit.Rows("0")) + + tk.MustExec("set @@global.tidb_redact_log=1") + tk.MustQuery("select @@global.tidb_redact_log").Check(testkit.Rows("1")) + tk.MustQuery("select @@global.tidb_slow_log_masking").Check(testkit.Rows("1")) + + tk.MustExec("set @@global.tidb_slow_log_masking=0") + tk.MustQuery("select @@global.tidb_redact_log").Check(testkit.Rows("0")) + tk.MustQuery("select @@global.tidb_slow_log_masking").Check(testkit.Rows("0")) + + tk.MustExec("set @@session.tidb_redact_log=0") + tk.MustQuery("select @@session.tidb_redact_log").Check(testkit.Rows("0")) + tk.MustQuery("select @@session.tidb_slow_log_masking").Check(testkit.Rows("0")) + + tk.MustExec("set @@session.tidb_redact_log=1") + tk.MustQuery("select @@session.tidb_redact_log").Check(testkit.Rows("1")) + tk.MustQuery("select @@session.tidb_slow_log_masking").Check(testkit.Rows("1")) + + tk.MustExec("set @@session.tidb_slow_log_masking=0") + tk.MustQuery("select @@session.tidb_redact_log").Check(testkit.Rows("0")) + tk.MustQuery("select @@session.tidb_slow_log_masking").Check(testkit.Rows("0")) +} + func (s *testSessionSerialSuite) TestDoDDLJobQuit(c *C) { // test https://github.com/pingcap/tidb/issues/18714, imitate DM's use environment // use isolated store, because in below failpoint we will cancel its context @@ -3295,3 +3717,515 @@ func (s *testBackupRestoreSuite) TestBackupAndRestore(c *C) { tk.MustExec("drop database br02") } } + +func (s *testSessionSuite2) TestIssue19127(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + tk.MustExec("drop table if exists issue19127") + tk.MustExec("create table issue19127 (c_int int, c_str varchar(40), primary key (c_int, c_str) ) partition by hash (c_int) partitions 4;") + tk.MustExec("insert into issue19127 values (9, 'angry williams'), (10, 'thirsty hugle');") + tk.Exec("update issue19127 set c_int = c_int + 10, c_str = 'adoring stonebraker' where c_int in (10, 9);") + c.Assert(tk.Se.AffectedRows(), Equals, uint64(2)) +} + +func (s *testSessionSuite2) TestMemoryUsageAlarmVariable(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + tk.MustExec("set @@session.tidb_memory_usage_alarm_ratio=1") + tk.MustQuery("select @@session.tidb_memory_usage_alarm_ratio").Check(testkit.Rows("1")) + tk.MustExec("set @@session.tidb_memory_usage_alarm_ratio=0") + tk.MustQuery("select @@session.tidb_memory_usage_alarm_ratio").Check(testkit.Rows("0")) + tk.MustExec("set @@session.tidb_memory_usage_alarm_ratio=0.7") + tk.MustQuery("select @@session.tidb_memory_usage_alarm_ratio").Check(testkit.Rows("0.7")) + err := tk.ExecToErr("set @@session.tidb_memory_usage_alarm_ratio=1.1") + c.Assert(err.Error(), Equals, "[variable:1231]Variable 'tidb_memory_usage_alarm_ratio' can't be set to the value of '1.1'") + err = tk.ExecToErr("set @@session.tidb_memory_usage_alarm_ratio=-1") + c.Assert(err.Error(), Equals, "[variable:1231]Variable 'tidb_memory_usage_alarm_ratio' can't be set to the value of '-1'") + err = tk.ExecToErr("set @@global.tidb_memory_usage_alarm_ratio=0.8") + c.Assert(err.Error(), Equals, "Variable 'tidb_memory_usage_alarm_ratio' is a SESSION variable and can't be used with SET GLOBAL") +} + +func (s *testSessionSuite2) TestSelectLockInShare(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("DROP TABLE IF EXISTS t_sel_in_share") + tk1.MustExec("CREATE TABLE t_sel_in_share (id int DEFAULT NULL)") + tk1.MustExec("insert into t_sel_in_share values (11)") + err := tk1.ExecToErr("select * from t_sel_in_share lock in share mode") + c.Assert(err, NotNil) + tk1.MustExec("set @@tidb_enable_noop_functions = 1") + tk1.MustQuery("select * from t_sel_in_share lock in share mode").Check(testkit.Rows("11")) + tk1.MustExec("DROP TABLE t_sel_in_share") +} + +func (s *testSessionSerialSuite) TestCoprocessorOOMAction(c *C) { + // Assert Coprocessor OOMAction + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec(`set @@tidb_wait_split_region_finish=1`) + // create table for non keep-order case + tk.MustExec("drop table if exists t5") + tk.MustExec("create table t5(id int)") + tk.MustQuery(`split table t5 between (0) and (10000) regions 10`).Check(testkit.Rows("9 1")) + // create table for keep-order case + tk.MustExec("drop table if exists t6") + tk.MustExec("create table t6(id int, index(id))") + tk.MustQuery(`split table t6 between (0) and (10000) regions 10`).Check(testkit.Rows("10 1")) + tk.MustQuery("split table t6 INDEX id between (0) and (10000) regions 10;").Check(testkit.Rows("10 1")) + count := 10 + for i := 0; i < count; i++ { + tk.MustExec(fmt.Sprintf("insert into t5 (id) values (%v)", i)) + tk.MustExec(fmt.Sprintf("insert into t6 (id) values (%v)", i)) + } + + testcases := []struct { + name string + sql string + }{ + { + name: "keep Order", + sql: "select id from t6 order by id", + }, + { + name: "non keep Order", + sql: "select id from t5", + }, + } + defer config.RestoreFunc()() + config.UpdateGlobal(func(conf *config.Config) { + conf.OOMAction = config.OOMActionCancel + }) + failpoint.Enable("github.com/pingcap/tidb/store/copr/testRateLimitActionMockConsumeAndAssert", `return(true)`) + defer failpoint.Disable("github.com/pingcap/tidb/store/copr/testRateLimitActionMockConsumeAndAssert") + + enableOOM := func(tk *testkit.TestKit, name, sql string) { + c.Logf("enable OOM, testcase: %v", name) + // larger than 4 copResponse, smaller than 5 copResponse + quota := 5*copr.MockResponseSizeForTest - 100 + tk.MustExec("use test") + tk.MustExec("set @@tidb_distsql_scan_concurrency = 10") + tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + var expect []string + for i := 0; i < count; i++ { + expect = append(expect, fmt.Sprintf("%v", i)) + } + tk.MustQuery(sql).Sort().Check(testkit.Rows(expect...)) + // assert oom action worked by max consumed > memory quota + c.Assert(tk.Se.GetSessionVars().StmtCtx.MemTracker.MaxConsumed(), Greater, int64(quota)) + } + + disableOOM := func(tk *testkit.TestKit, name, sql string) { + c.Logf("disable OOM, testcase: %v", name) + quota := 5*copr.MockResponseSizeForTest - 100 + tk.MustExec("use test") + tk.MustExec("set @@tidb_distsql_scan_concurrency = 10") + tk.MustExec(fmt.Sprintf("set @@tidb_mem_quota_query=%v;", quota)) + err := tk.QueryToErr(sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") + } + + failpoint.Enable("github.com/pingcap/tidb/store/copr/testRateLimitActionMockWaitMax", `return(true)`) + // assert oom action and switch + for _, testcase := range testcases { + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + enableOOM(tk, testcase.name, testcase.sql) + tk.MustExec("set @@tidb_enable_rate_limit_action = 0") + disableOOM(tk, testcase.name, testcase.sql) + tk.MustExec("set @@tidb_enable_rate_limit_action = 1") + enableOOM(tk, testcase.name, testcase.sql) + se.Close() + } + + globaltk := testkit.NewTestKitWithInit(c, s.store) + globaltk.MustExec("set global tidb_enable_rate_limit_action= 0") + for _, testcase := range testcases { + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + disableOOM(tk, testcase.name, testcase.sql) + se.Close() + } + globaltk.MustExec("set global tidb_enable_rate_limit_action= 1") + for _, testcase := range testcases { + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + enableOOM(tk, testcase.name, testcase.sql) + se.Close() + } + failpoint.Disable("github.com/pingcap/tidb/store/copr/testRateLimitActionMockWaitMax") + + // assert oom fallback + for _, testcase := range testcases { + c.Log(testcase.name) + se, err := session.CreateSession4Test(s.store) + c.Check(err, IsNil) + tk.Se = se + tk.MustExec("use test") + tk.MustExec("set tidb_distsql_scan_concurrency = 1") + tk.MustExec("set @@tidb_mem_quota_query=1;") + err = tk.QueryToErr(testcase.sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, "Out Of Memory Quota.*") + se.Close() + } +} + +// TestDefaultWeekFormat checks for issue #21510. +func (s *testSessionSerialSuite) TestDefaultWeekFormat(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + tk1.MustExec("set @@global.default_week_format = 4;") + defer tk1.MustExec("set @@global.default_week_format = default;") + + tk2 := testkit.NewTestKitWithInit(c, s.store) + tk2.MustQuery("select week('2020-02-02'), @@default_week_format, week('2020-02-02');").Check(testkit.Rows("6 4 6")) +} + +func (s *testSessionSerialSuite) TestIssue21944(c *C) { + tk1 := testkit.NewTestKitWithInit(c, s.store) + _, err := tk1.Exec("set @@tidb_current_ts=1;") + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'tidb_current_ts' is a read only variable") +} + +func (s *testSessionSerialSuite) TestIssue21943(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + _, err := tk.Exec("set @@last_plan_from_binding='123';") + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'last_plan_from_binding' is a read only variable") + + _, err = tk.Exec("set @@last_plan_from_cache='123';") + c.Assert(err.Error(), Equals, "[variable:1238]Variable 'last_plan_from_cache' is a read only variable") +} + +func (s *testSessionSuite) TestValidateReadOnlyInStalenessTransaction(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + testcases := []struct { + name string + sql string + isValidate bool + }{ + { + name: "select statement", + sql: `select * from t;`, + isValidate: true, + }, + { + name: "explain statement", + sql: `explain insert into t (id) values (1);`, + isValidate: true, + }, + { + name: "explain analyze insert statement", + sql: `explain analyze insert into t (id) values (1);`, + isValidate: false, + }, + { + name: "explain analyze select statement", + sql: `explain analyze select * from t `, + isValidate: true, + }, + { + name: "execute insert statement", + sql: `EXECUTE stmt1;`, + isValidate: false, + }, + { + name: "execute select statement", + sql: `EXECUTE stmt2;`, + isValidate: true, + }, + { + name: "show statement", + sql: `show tables;`, + isValidate: true, + }, + { + name: "set union", + sql: `SELECT 1, 2 UNION SELECT 'a', 'b';`, + isValidate: true, + }, + { + name: "insert", + sql: `insert into t (id) values (1);`, + isValidate: false, + }, + { + name: "delete", + sql: `delete from t where id =1`, + isValidate: false, + }, + { + name: "update", + sql: "update t set id =2 where id =1", + isValidate: false, + }, + { + name: "point get", + sql: `select * from t where id = 1`, + isValidate: true, + }, + { + name: "batch point get", + sql: `select * from t where id in (1,2,3);`, + isValidate: true, + }, + { + name: "split table", + sql: `SPLIT TABLE t BETWEEN (0) AND (1000000000) REGIONS 16;`, + isValidate: true, + }, + { + name: "do statement", + sql: `DO SLEEP(1);`, + isValidate: true, + }, + { + name: "select for update", + sql: "select * from t where id = 1 for update", + isValidate: false, + }, + { + name: "select lock in share mode", + sql: "select * from t where id = 1 lock in share mode", + isValidate: true, + }, + { + name: "select for update union statement", + sql: "select * from t for update union select * from t;", + isValidate: false, + }, + { + name: "replace statement", + sql: "replace into t(id) values (1)", + isValidate: false, + }, + { + name: "load data statement", + sql: "LOAD DATA LOCAL INFILE '/mn/asa.csv' INTO TABLE t FIELDS TERMINATED BY x'2c' ENCLOSED BY b'100010' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (id);", + isValidate: false, + }, + { + name: "update multi tables", + sql: "update t,t1 set t.id = 1,t1.id = 2 where t.1 = 2 and t1.id = 3;", + isValidate: false, + }, + { + name: "delete multi tables", + sql: "delete t from t1 where t.id = t1.id", + isValidate: false, + }, + { + name: "insert select", + sql: "insert into t select * from t1;", + isValidate: false, + }, + } + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t (id int);") + tk.MustExec("create table t1 (id int);") + tk.MustExec(`PREPARE stmt1 FROM 'insert into t(id) values (5);';`) + tk.MustExec(`PREPARE stmt2 FROM 'select * from t';`) + tk.MustExec(`set @@tidb_enable_noop_functions=1;`) + for _, testcase := range testcases { + c.Log(testcase.name) + tk.MustExec(`START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`) + if testcase.isValidate { + _, err := tk.Exec(testcase.sql) + c.Assert(err, IsNil) + tk.MustExec("commit") + } else { + err := tk.ExecToErr(testcase.sql) + c.Assert(err, NotNil) + c.Assert(err.Error(), Matches, `.*only support read-only statement during read-only staleness transactions.*`) + } + } +} + +func (s *testSessionSerialSuite) TestSpecialSQLInStalenessTxn(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer", "return(false)"), IsNil) + defer failpoint.Disable("github.com/pingcap/tidb/executor/mockStalenessTxnSchemaVer") + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + testcases := []struct { + name string + sql string + sameSession bool + }{ + { + name: "ddl", + sql: "create table t (id int, b int,INDEX(b));", + sameSession: false, + }, + { + name: "set global session", + sql: `SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER';`, + sameSession: true, + }, + { + name: "analyze table", + sql: "analyze table t", + sameSession: true, + }, + { + name: "session binding", + sql: "CREATE SESSION BINDING FOR SELECT * FROM t WHERE b = 123 USING SELECT * FROM t IGNORE INDEX (b) WHERE b = 123;", + sameSession: true, + }, + { + name: "global binding", + sql: "CREATE GLOBAL BINDING FOR SELECT * FROM t WHERE b = 123 USING SELECT * FROM t IGNORE INDEX (b) WHERE b = 123;", + sameSession: true, + }, + { + name: "grant statements", + sql: "GRANT ALL ON test.* TO 'newuser';", + sameSession: false, + }, + { + name: "revoke statements", + sql: "REVOKE ALL ON test.* FROM 'newuser';", + sameSession: false, + }, + } + tk.MustExec("CREATE USER 'newuser' IDENTIFIED BY 'mypassword';") + for _, testcase := range testcases { + comment := Commentf(testcase.name) + tk.MustExec(`START TRANSACTION READ ONLY WITH TIMESTAMP BOUND READ TIMESTAMP '2020-09-06 00:00:00';`) + c.Assert(tk.Se.GetSessionVars().TxnCtx.IsStaleness, Equals, true, comment) + tk.MustExec(testcase.sql) + c.Assert(tk.Se.GetSessionVars().TxnCtx.IsStaleness, Equals, testcase.sameSession, comment) + } +} + +func (s *testSessionSerialSuite) TestRemovedSysVars(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + variable.RegisterSysVar(&variable.SysVar{Scope: variable.ScopeGlobal | variable.ScopeSession, Name: "bogus_var", Value: "acdc"}) + result := tk.MustQuery("SHOW GLOBAL VARIABLES LIKE 'bogus_var'") + result.Check(testkit.Rows("bogus_var acdc")) + result = tk.MustQuery("SELECT @@GLOBAL.bogus_var") + result.Check(testkit.Rows("acdc")) + tk.MustExec("SET GLOBAL bogus_var = 'newvalue'") + + // unregister + variable.UnregisterSysVar("bogus_var") + + result = tk.MustQuery("SHOW GLOBAL VARIABLES LIKE 'bogus_var'") + result.Check(testkit.Rows()) // empty + _, err := tk.Exec("SET GLOBAL bogus_var = 'newvalue'") + c.Assert(err.Error(), Equals, "[variable:1193]Unknown system variable 'bogus_var'") + _, err = tk.Exec("SELECT @@GLOBAL.bogus_var") + c.Assert(err.Error(), Equals, "[variable:1193]Unknown system variable 'bogus_var'") +} + +func (s *testSessionSerialSuite) TestTiKVSystemVars(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + + result := tk.MustQuery("SHOW GLOBAL VARIABLES LIKE 'tidb_gc_enable'") // default is on from the sysvar + result.Check(testkit.Rows("tidb_gc_enable ON")) + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_enable'") + result.Check(testkit.Rows()) // but no value in the table (yet) because the value has not been set and the GC has never been run + + // update will set a value in the table + tk.MustExec("SET GLOBAL tidb_gc_enable = 1") + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_enable'") + result.Check(testkit.Rows("true")) + + tk.MustExec("UPDATE mysql.tidb SET variable_value = 'false' WHERE variable_name='tikv_gc_enable'") + result = tk.MustQuery("SELECT @@tidb_gc_enable;") + result.Check(testkit.Rows("0")) // reads from mysql.tidb value and changes to false + + tk.MustExec("SET GLOBAL tidb_gc_concurrency = -1") // sets auto concurrency and concurrency + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_auto_concurrency'") + result.Check(testkit.Rows("true")) + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_concurrency'") + result.Check(testkit.Rows("-1")) + + tk.MustExec("SET GLOBAL tidb_gc_concurrency = 5") // sets auto concurrency and concurrency + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_auto_concurrency'") + result.Check(testkit.Rows("false")) + result = tk.MustQuery("SELECT variable_value FROM mysql.tidb WHERE variable_name = 'tikv_gc_concurrency'") + result.Check(testkit.Rows("5")) + + tk.MustExec("UPDATE mysql.tidb SET variable_value = 'true' WHERE variable_name='tikv_gc_auto_concurrency'") + result = tk.MustQuery("SELECT @@tidb_gc_concurrency;") + result.Check(testkit.Rows("-1")) // because auto_concurrency is turned on it takes precedence + + tk.MustExec("REPLACE INTO mysql.tidb (variable_value, variable_name) VALUES ('15m', 'tikv_gc_run_interval')") + result = tk.MustQuery("SELECT @@GLOBAL.tidb_gc_run_interval;") + result.Check(testkit.Rows("15m0s")) + result = tk.MustQuery("SHOW GLOBAL VARIABLES LIKE 'tidb_gc_run_interval'") + result.Check(testkit.Rows("tidb_gc_run_interval 15m0s")) + + _, err := tk.Exec("SET GLOBAL tidb_gc_run_interval = '9m'") // too small + c.Assert(err.Error(), Equals, "[variable:1232]Incorrect argument type to variable 'tidb_gc_run_interval'") + + tk.MustExec("SET GLOBAL tidb_gc_run_interval = '700000000000ns'") // specified in ns, also valid + + _, err = tk.Exec("SET GLOBAL tidb_gc_run_interval = '11mins'") + c.Assert(err.Error(), Equals, "[variable:1232]Incorrect argument type to variable 'tidb_gc_run_interval'") // wrong format + +} + +func (s *testSessionSerialSuite) TestProcessInfoIssue22068(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int)") + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + tk.MustQuery("select 1 from t where a = (select sleep(5));").Check(testkit.Rows()) + wg.Done() + }() + time.Sleep(2 * time.Second) + pi := tk.Se.ShowProcess() + c.Assert(pi, NotNil) + c.Assert(pi.Info, Equals, "select 1 from t where a = (select sleep(5));") + c.Assert(pi.Plan, IsNil) + wg.Wait() +} + +func (s *testSessionSerialSuite) TestParseWithParams(c *C) { + tk := testkit.NewTestKitWithInit(c, s.store) + se := tk.Se + exec := se.(sqlexec.RestrictedSQLExecutor) + + // test compatibility with ExcuteInternal + origin := se.GetSessionVars().InRestrictedSQL + se.GetSessionVars().InRestrictedSQL = true + defer func() { + se.GetSessionVars().InRestrictedSQL = origin + }() + _, err := exec.ParseWithParams(context.TODO(), "SELECT 4") + c.Assert(err, IsNil) + + // test charset attack + stmt, err := exec.ParseWithParams(context.TODO(), "SELECT * FROM test WHERE name = %? LIMIT 1", "\xbf\x27 OR 1=1 /*") + c.Assert(err, IsNil) + + var sb strings.Builder + ctx := format.NewRestoreCtx(format.RestoreStringDoubleQuotes, &sb) + err = stmt.Restore(ctx) + c.Assert(err, IsNil) + c.Assert(sb.String(), Equals, "SELECT * FROM test WHERE name=_utf8mb4\"\xbf' OR 1=1 /*\" LIMIT 1") + + // test invalid sql + _, err = exec.ParseWithParams(context.TODO(), "SELECT") + c.Assert(err, ErrorMatches, ".*You have an error in your SQL syntax.*") + + // test invalid arguments to escape + _, err = exec.ParseWithParams(context.TODO(), "SELECT %?, %?", 3) + c.Assert(err, ErrorMatches, "missing arguments.*") + + // test noescape + stmt, err = exec.ParseWithParams(context.TODO(), "SELECT 3") + c.Assert(err, IsNil) + + sb.Reset() + ctx = format.NewRestoreCtx(0, &sb) + err = stmt.Restore(ctx) + c.Assert(err, IsNil) + c.Assert(sb.String(), Equals, "SELECT 3") +} diff --git a/session/testdata/clustered_index_suite_in.json b/session/testdata/clustered_index_suite_in.json new file mode 100644 index 0000000000000..d347e1c6c0c50 --- /dev/null +++ b/session/testdata/clustered_index_suite_in.json @@ -0,0 +1,11 @@ +[ + { + "name": "TestClusteredPrefixColumn", + "cases": [ + "select c2 from t1 use index(idx1)", + "select count(1) from t1 use index(idx1) where c2 = 'cd'", + "select c2 from t2 use index(idx1)", + "select count(1) from t2 use index(idx1) where c2 = 'cd'" + ] + } +] diff --git a/session/testdata/clustered_index_suite_out.json b/session/testdata/clustered_index_suite_out.json new file mode 100644 index 0000000000000..d8bfedd2e3a95 --- /dev/null +++ b/session/testdata/clustered_index_suite_out.json @@ -0,0 +1,53 @@ +[ + { + "Name": "TestClusteredPrefixColumn", + "Cases": [ + { + "SQL": "select c2 from t1 use index(idx1)", + "Plan": [ + "IndexReader_5 10000.00 root index:IndexFullScan_4", + "└─IndexFullScan_4 10000.00 cop[tikv] table:t1, index:idx1(c2) keep order:false, stats:pseudo" + ], + "Res": [ + "cd" + ] + }, + { + "SQL": "select count(1) from t1 use index(idx1) where c2 = 'cd'", + "Plan": [ + "StreamAgg_20 1.00 root funcs:count(Column#6)->Column#4", + "└─IndexReader_21 1.00 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#6", + " └─Selection_19 10.00 cop[tikv] eq(test.t1.c2, \"cd\")", + " └─IndexRangeScan_18 10.00 cop[tikv] table:t1, index:idx1(c2) range:[\"c\",\"c\"], keep order:false, stats:pseudo" + ], + "Res": [ + "1" + ] + }, + { + "SQL": "select c2 from t2 use index(idx1)", + "Plan": [ + "IndexReader_5 10000.00 root index:IndexFullScan_4", + "└─IndexFullScan_4 10000.00 cop[tikv] table:t2, index:idx1(c1, c2) keep order:false, stats:pseudo" + ], + "Res": [ + "cd" + ] + }, + { + "SQL": "select count(1) from t2 use index(idx1) where c2 = 'cd'", + "Plan": [ + "StreamAgg_20 1.00 root funcs:count(Column#9)->Column#4", + "└─IndexReader_21 1.00 root index:StreamAgg_9", + " └─StreamAgg_9 1.00 cop[tikv] funcs:count(1)->Column#9", + " └─Selection_19 10.00 cop[tikv] eq(test.t2.c2, \"cd\")", + " └─IndexFullScan_18 10000.00 cop[tikv] table:t2, index:idx1(c1, c2) keep order:false, stats:pseudo" + ], + "Res": [ + "1" + ] + } + ] + } +] diff --git a/session/tidb.go b/session/tidb.go index 8aec544b7b968..8dc13ed580d65 100644 --- a/session/tidb.go +++ b/session/tidb.go @@ -26,8 +26,6 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser" "github.com/pingcap/parser/ast" - "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/errno" @@ -37,6 +35,7 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/sqlexec" "go.uber.org/zap" @@ -119,7 +118,9 @@ var ( statsLease = int64(3 * time.Second) // indexUsageSyncLease is the time for index usage synchronization. - indexUsageSyncLease = int64(60 * time.Second) + // Because we have not completed GC and other functions, we set it to 0. + // TODO: Set indexUsageSyncLease to 60s. + indexUsageSyncLease = int64(0 * time.Second) ) // ResetStoreForWithTiKVTest is only used in the test code. @@ -170,7 +171,7 @@ func Parse(ctx sessionctx.Context, src string) ([]ast.StmtNode, error) { logutil.BgLogger().Debug("compiling", zap.String("source", src)) charset, collation := ctx.GetSessionVars().GetCharsetInfo() p := parser.New() - p.EnableWindowFunc(ctx.GetSessionVars().EnableWindowFunction) + p.SetParserConfig(ctx.GetSessionVars().BuildParserConfig()) p.SetSQLMode(ctx.GetSessionVars().SQLMode) stmts, warns, err := p.Parse(src, charset, collation) for _, warn := range warns { @@ -195,6 +196,22 @@ func recordAbortTxnDuration(sessVars *variable.SessionVars) { } func finishStmt(ctx context.Context, se *session, meetsErr error, sql sqlexec.Statement) error { + sessVars := se.sessionVars + if !sql.IsReadOnly(sessVars) { + // All the history should be added here. + if meetsErr == nil && sessVars.TxnCtx.CouldRetry { + GetHistory(se).Add(sql, sessVars.StmtCtx) + } + + // Handle the stmt commit/rollback. + if se.txn.Valid() { + if meetsErr != nil { + se.StmtRollback() + } else { + se.StmtCommit() + } + } + } err := autoCommitAfterStmt(ctx, se, meetsErr, sql) if se.txn.pending() { // After run statement finish, txn state is still pending means the @@ -257,7 +274,7 @@ func checkStmtLimit(ctx context.Context, se *session) error { // The last history could not be "commit"/"rollback" statement. // It means it is impossible to start a new transaction at the end of the transaction. // Because after the server executed "commit"/"rollback" statement, the session is out of the transaction. - sessVars.SetStatusFlag(mysql.ServerStatusInTrans, true) + sessVars.SetInTxn(true) } return err } @@ -330,5 +347,5 @@ func ResultSetToStringSlice(ctx context.Context, s Session, rs sqlexec.RecordSet // Session errors. var ( - ErrForUpdateCantRetry = terror.ClassSession.New(errno.ErrForUpdateCantRetry, errno.MySQLErrName[errno.ErrForUpdateCantRetry]) + ErrForUpdateCantRetry = dbterror.ClassSession.NewStd(errno.ErrForUpdateCantRetry) ) diff --git a/session/tidb_test.go b/session/tidb_test.go index f48cf471feac7..80da89191d9a9 100644 --- a/session/tidb_test.go +++ b/session/tidb_test.go @@ -23,7 +23,9 @@ import ( "time" . "github.com/pingcap/check" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/auth" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/planner/core" @@ -40,6 +42,10 @@ func TestT(t *testing.T) { logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) CustomVerboseFlag = true SetSchemaLease(20 * time.Millisecond) + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) TestingT(t) } @@ -76,17 +82,23 @@ func (s *testMainSuite) TestSysSessionPoolGoroutineLeak(c *C) { se, err := createSession(store) c.Assert(err, IsNil) + count := 200 + stmts := make([]ast.StmtNode, count) + for i := 0; i < count; i++ { + stmt, err := se.ParseWithParams(context.Background(), "select * from mysql.user limit 1") + c.Assert(err, IsNil) + stmts[i] = stmt + } // Test an issue that sysSessionPool doesn't call session's Close, cause // asyncGetTSWorker goroutine leak. - count := 200 var wg sync.WaitGroup wg.Add(count) for i := 0; i < count; i++ { - go func(se *session) { - _, _, err := se.ExecRestrictedSQL("select * from mysql.user limit 1") + go func(se *session, stmt ast.StmtNode) { + _, _, err := se.ExecRestrictedStmt(context.Background(), stmt) c.Assert(err, IsNil) wg.Done() - }(se) + }(se, stmts[i]) } wg.Wait() } diff --git a/session/txn.go b/session/txn.go index 9858d134cf8e7..bccf130fb988a 100644 --- a/session/txn.go +++ b/session/txn.go @@ -24,6 +24,7 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" @@ -53,87 +54,97 @@ type TxnState struct { mutations map[int64]*binlog.TableMutation } -func (st *TxnState) init() { - st.mutations = make(map[int64]*binlog.TableMutation) +// GetTableInfo returns the cached index name. +func (txn *TxnState) GetTableInfo(id int64) *model.TableInfo { + return txn.Transaction.GetTableInfo(id) } -func (st *TxnState) initStmtBuf() { - if st.Transaction == nil { +// CacheTableInfo caches the index name. +func (txn *TxnState) CacheTableInfo(id int64, info *model.TableInfo) { + txn.Transaction.CacheTableInfo(id, info) +} + +func (txn *TxnState) init() { + txn.mutations = make(map[int64]*binlog.TableMutation) +} + +func (txn *TxnState) initStmtBuf() { + if txn.Transaction == nil { return } - buf := st.Transaction.GetMemBuffer() - st.initCnt = buf.Len() - st.stagingHandle = buf.Staging() + buf := txn.Transaction.GetMemBuffer() + txn.initCnt = buf.Len() + txn.stagingHandle = buf.Staging() } // countHint is estimated count of mutations. -func (st *TxnState) countHint() int { - if st.stagingHandle == kv.InvalidStagingHandle { +func (txn *TxnState) countHint() int { + if txn.stagingHandle == kv.InvalidStagingHandle { return 0 } - return st.Transaction.GetMemBuffer().Len() - st.initCnt + return txn.Transaction.GetMemBuffer().Len() - txn.initCnt } -func (st *TxnState) flushStmtBuf() { - if st.stagingHandle == kv.InvalidStagingHandle { +func (txn *TxnState) flushStmtBuf() { + if txn.stagingHandle == kv.InvalidStagingHandle { return } - buf := st.Transaction.GetMemBuffer() - buf.Release(st.stagingHandle) - st.initCnt = buf.Len() + buf := txn.Transaction.GetMemBuffer() + buf.Release(txn.stagingHandle) + txn.initCnt = buf.Len() } -func (st *TxnState) cleanupStmtBuf() { - if st.stagingHandle == kv.InvalidStagingHandle { +func (txn *TxnState) cleanupStmtBuf() { + if txn.stagingHandle == kv.InvalidStagingHandle { return } - buf := st.Transaction.GetMemBuffer() - buf.Cleanup(st.stagingHandle) - st.initCnt = buf.Len() + buf := txn.Transaction.GetMemBuffer() + buf.Cleanup(txn.stagingHandle) + txn.initCnt = buf.Len() } // Size implements the MemBuffer interface. -func (st *TxnState) Size() int { - if st.Transaction == nil { +func (txn *TxnState) Size() int { + if txn.Transaction == nil { return 0 } - return st.Transaction.Size() + return txn.Transaction.Size() } // Valid implements the kv.Transaction interface. -func (st *TxnState) Valid() bool { - return st.Transaction != nil && st.Transaction.Valid() +func (txn *TxnState) Valid() bool { + return txn.Transaction != nil && txn.Transaction.Valid() } -func (st *TxnState) pending() bool { - return st.Transaction == nil && st.txnFuture != nil +func (txn *TxnState) pending() bool { + return txn.Transaction == nil && txn.txnFuture != nil } -func (st *TxnState) validOrPending() bool { - return st.txnFuture != nil || st.Valid() +func (txn *TxnState) validOrPending() bool { + return txn.txnFuture != nil || txn.Valid() } -func (st *TxnState) String() string { - if st.Transaction != nil { - return st.Transaction.String() +func (txn *TxnState) String() string { + if txn.Transaction != nil { + return txn.Transaction.String() } - if st.txnFuture != nil { + if txn.txnFuture != nil { return "txnFuture" } return "invalid transaction" } // GoString implements the "%#v" format for fmt.Printf. -func (st *TxnState) GoString() string { +func (txn *TxnState) GoString() string { var s strings.Builder s.WriteString("Txn{") - if st.pending() { + if txn.pending() { s.WriteString("state=pending") - } else if st.Valid() { + } else if txn.Valid() { s.WriteString("state=valid") - fmt.Fprintf(&s, ", txnStartTS=%d", st.Transaction.StartTS()) - if len(st.mutations) > 0 { - fmt.Fprintf(&s, ", len(mutations)=%d, %#v", len(st.mutations), st.mutations) + fmt.Fprintf(&s, ", txnStartTS=%d", txn.Transaction.StartTS()) + if len(txn.mutations) > 0 { + fmt.Fprintf(&s, ", len(mutations)=%d, %#v", len(txn.mutations), txn.mutations) } } else { s.WriteString("state=invalid") @@ -143,43 +154,43 @@ func (st *TxnState) GoString() string { return s.String() } -func (st *TxnState) changeInvalidToValid(txn kv.Transaction) { - st.Transaction = txn - st.initStmtBuf() - st.txnFuture = nil +func (txn *TxnState) changeInvalidToValid(kvTxn kv.Transaction) { + txn.Transaction = kvTxn + txn.initStmtBuf() + txn.txnFuture = nil } -func (st *TxnState) changeInvalidToPending(future *txnFuture) { - st.Transaction = nil - st.txnFuture = future +func (txn *TxnState) changeInvalidToPending(future *txnFuture) { + txn.Transaction = nil + txn.txnFuture = future } -func (st *TxnState) changePendingToValid(ctx context.Context) error { - if st.txnFuture == nil { +func (txn *TxnState) changePendingToValid(ctx context.Context) error { + if txn.txnFuture == nil { return errors.New("transaction future is not set") } - future := st.txnFuture - st.txnFuture = nil + future := txn.txnFuture + txn.txnFuture = nil defer trace.StartRegion(ctx, "WaitTsoFuture").End() - txn, err := future.wait() + t, err := future.wait() if err != nil { - st.Transaction = nil + txn.Transaction = nil return err } - st.Transaction = txn - st.initStmtBuf() + txn.Transaction = t + txn.initStmtBuf() return nil } -func (st *TxnState) changeToInvalid() { - if st.stagingHandle != kv.InvalidStagingHandle { - st.Transaction.GetMemBuffer().Cleanup(st.stagingHandle) +func (txn *TxnState) changeToInvalid() { + if txn.stagingHandle != kv.InvalidStagingHandle { + txn.Transaction.GetMemBuffer().Cleanup(txn.stagingHandle) } - st.stagingHandle = kv.InvalidStagingHandle - st.Transaction = nil - st.txnFuture = nil + txn.stagingHandle = kv.InvalidStagingHandle + txn.Transaction = nil + txn.txnFuture = nil } var hasMockAutoIncIDRetry = int64(0) @@ -209,12 +220,12 @@ func ResetMockAutoRandIDRetryCount(failTimes int64) { } // Commit overrides the Transaction interface. -func (st *TxnState) Commit(ctx context.Context) error { - defer st.reset() - if len(st.mutations) != 0 || st.countHint() != 0 { +func (txn *TxnState) Commit(ctx context.Context) error { + defer txn.reset() + if len(txn.mutations) != 0 || txn.countHint() != 0 { logutil.BgLogger().Error("the code should never run here", - zap.String("TxnState", st.GoString()), - zap.Int("staging handler", int(st.stagingHandle)), + zap.String("TxnState", txn.GoString()), + zap.Int("staging handler", int(txn.stagingHandle)), zap.Stack("something must be wrong")) return errors.Trace(kv.ErrInvalidTxn) } @@ -241,36 +252,36 @@ func (st *TxnState) Commit(ctx context.Context) error { } }) - return st.Transaction.Commit(ctx) + return txn.Transaction.Commit(ctx) } // Rollback overrides the Transaction interface. -func (st *TxnState) Rollback() error { - defer st.reset() - return st.Transaction.Rollback() +func (txn *TxnState) Rollback() error { + defer txn.reset() + return txn.Transaction.Rollback() } -func (st *TxnState) reset() { - st.cleanup() - st.changeToInvalid() +func (txn *TxnState) reset() { + txn.cleanup() + txn.changeToInvalid() } -func (st *TxnState) cleanup() { - st.cleanupStmtBuf() - st.initStmtBuf() - for key := range st.mutations { - delete(st.mutations, key) +func (txn *TxnState) cleanup() { + txn.cleanupStmtBuf() + txn.initStmtBuf() + for key := range txn.mutations { + delete(txn.mutations, key) } } // KeysNeedToLock returns the keys need to be locked. -func (st *TxnState) KeysNeedToLock() ([]kv.Key, error) { - if st.stagingHandle == kv.InvalidStagingHandle { +func (txn *TxnState) KeysNeedToLock() ([]kv.Key, error) { + if txn.stagingHandle == kv.InvalidStagingHandle { return nil, nil } - keys := make([]kv.Key, 0, st.countHint()) - buf := st.Transaction.GetMemBuffer() - buf.InspectStage(st.stagingHandle, func(k kv.Key, flags kv.KeyFlags, v []byte) { + keys := make([]kv.Key, 0, txn.countHint()) + buf := txn.Transaction.GetMemBuffer() + buf.InspectStage(txn.stagingHandle, func(k kv.Key, flags kv.KeyFlags, v []byte) { if !keyNeedToLock(k, v, flags) { return } @@ -288,11 +299,12 @@ func keyNeedToLock(k, v []byte, flags kv.KeyFlags) bool { if flags.HasPresumeKeyNotExists() { return true } - isDelete := len(v) == 0 - if isDelete { - // only need to delete row key. - return k[10] == 'r' + + // lock row key, primary key and unique index for delete operation, + if len(v) == 0 { + return flags.HasNeedLocked() || tablecodec.IsRecordKey(k) } + if tablecodec.IsUntouchedIndexKValue(k, v) { return false } @@ -330,21 +342,22 @@ func (txnFailFuture) Wait() (uint64, error) { // txnFuture is a promise, which promises to return a txn in future. type txnFuture struct { - future oracle.Future - store kv.Storage + future oracle.Future + store kv.Storage + txnScope string } func (tf *txnFuture) wait() (kv.Transaction, error) { startTS, err := tf.future.Wait() if err == nil { - return tf.store.BeginWithStartTS(startTS) + return tf.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(tf.txnScope).SetStartTs(startTS)) } else if config.GetGlobalConfig().Store == "unistore" { return nil, err } logutil.BgLogger().Warn("wait tso failed", zap.Error(err)) // It would retry get timestamp. - return tf.store.Begin() + return tf.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(tf.txnScope)) } func (s *session) getTxnFuture(ctx context.Context) *txnFuture { @@ -357,11 +370,11 @@ func (s *session) getTxnFuture(ctx context.Context) *txnFuture { oracleStore := s.store.GetOracle() var tsFuture oracle.Future if s.sessionVars.LowResolutionTSO { - tsFuture = oracleStore.GetLowResolutionTimestampAsync(ctx) + tsFuture = oracleStore.GetLowResolutionTimestampAsync(ctx, &oracle.Option{TxnScope: s.sessionVars.CheckAndGetTxnScope()}) } else { - tsFuture = oracleStore.GetTimestampAsync(ctx) + tsFuture = oracleStore.GetTimestampAsync(ctx, &oracle.Option{TxnScope: s.sessionVars.CheckAndGetTxnScope()}) } - ret := &txnFuture{future: tsFuture, store: s.store} + ret := &txnFuture{future: tsFuture, store: s.store, txnScope: s.sessionVars.CheckAndGetTxnScope()} failpoint.InjectContext(ctx, "mockGetTSFail", func() { ret.future = txnFailFuture{} }) diff --git a/sessionctx/binloginfo/binloginfo.go b/sessionctx/binloginfo/binloginfo.go index 712d8ccf96527..60f5c75b84668 100644 --- a/sessionctx/binloginfo/binloginfo.go +++ b/sessionctx/binloginfo/binloginfo.go @@ -44,9 +44,8 @@ func init() { // shared by all sessions. var pumpsClient *pumpcli.PumpsClient var pumpsClientLock sync.RWMutex -var shardPat = regexp.MustCompile(`SHARD_ROW_ID_BITS\s*=\s*\d+\s*`) -var preSplitPat = regexp.MustCompile(`PRE_SPLIT_REGIONS\s*=\s*\d+\s*`) -var autoRandomPat = regexp.MustCompile(`AUTO_RANDOM\s*\(\s*\d+\s*\)\s*`) +var shardPat = regexp.MustCompile(`(?PSHARD_ROW_ID_BITS\s*=\s*\d+\s*)`) +var preSplitPat = regexp.MustCompile(`(?PPRE_SPLIT_REGIONS\s*=\s*\d+\s*)`) // BinlogInfo contains binlog data and binlog client. type BinlogInfo struct { @@ -58,13 +57,13 @@ type BinlogInfo struct { type BinlogStatus int const ( - //BinlogStatusUnknown stands for unknown binlog status + // BinlogStatusUnknown stands for unknown binlog status BinlogStatusUnknown BinlogStatus = iota - //BinlogStatusOn stands for the binlog is enabled + // BinlogStatusOn stands for the binlog is enabled BinlogStatusOn - //BinlogStatusOff stands for the binlog is disabled + // BinlogStatusOff stands for the binlog is disabled BinlogStatusOff - //BinlogStatusSkipping stands for the binlog status + // BinlogStatusSkipping stands for the binlog status BinlogStatusSkipping ) @@ -301,7 +300,7 @@ func SetDDLBinlog(client *pumpcli.PumpsClient, txn kv.Transaction, jobID int64, const specialPrefix = `/*T! ` // AddSpecialComment uses to add comment for table option in DDL query. -// Export for testing. +// Used by pingcap/ticdc. func AddSpecialComment(ddlQuery string) string { if strings.Contains(ddlQuery, specialPrefix) || strings.Contains(ddlQuery, driver.SpecialCommentVersionPrefix) { return ddlQuery @@ -321,7 +320,17 @@ func addSpecialCommentByRegexps(ddlQuery string, prefix string, regs ...*regexp. minIdx := math.MaxInt64 for i := 0; i < len(regs); { reg := regs[i] - loc := reg.FindStringIndex(upperQuery) + locs := reg.FindStringSubmatchIndex(upperQuery) + ns := reg.SubexpNames() + var loc []int + if len(locs) > 0 { + for i, n := range ns { + if n == "REPLACE" { + loc = locs[i*2 : (i+1)*2] + break + } + } + } if len(loc) < 2 { i++ continue diff --git a/sessionctx/binloginfo/binloginfo_test.go b/sessionctx/binloginfo/binloginfo_test.go index 213132c1f01d4..a64d2684aec26 100644 --- a/sessionctx/binloginfo/binloginfo_test.go +++ b/sessionctx/binloginfo/binloginfo_test.go @@ -187,7 +187,7 @@ func (s *testBinlogSuite) TestBinlog(c *C) { c.Assert(gotRows, DeepEquals, expected) // Test table primary key is not integer. - tk.MustExec("set @@tidb_enable_clustered_index=0;") + tk.Se.GetSessionVars().EnableClusteredIndex = false tk.MustExec("create table local_binlog2 (name varchar(64) primary key, age int)") tk.MustExec("insert local_binlog2 values ('abc', 16), ('def', 18)") tk.MustExec("delete from local_binlog2 where name = 'def'") @@ -256,6 +256,24 @@ func (s *testBinlogSuite) TestBinlog(c *C) { binlog.MutationType_Insert, }) + // Test cannot build clustered index tables when binlog client exists. + tk.MustExec("create table local_clustered_index (c1 varchar(255) primary key clustered);") + warnMsg := "Warning 1105 cannot build clustered index table because the binlog is ON" + tk.MustQuery("show warnings;").Check(testkit.Rows(warnMsg)) + tk.MustQuery("select tidb_pk_type from information_schema.tables where table_name = 'local_clustered_index' and table_schema = 'test';"). + Check(testkit.Rows("NON-CLUSTERED")) + tk.MustExec("drop table if exists local_clustered_index;") + // Test clustered index tables will not write binlog. + tk.Se.GetSessionVars().BinlogClient = nil + tk.MustExec("create table local_clustered_index (c1 varchar(255) primary key clustered);") + tk.MustQuery("select tidb_pk_type from information_schema.tables where table_name = 'local_clustered_index' and table_schema = 'test';"). + Check(testkit.Rows("CLUSTERED")) + tk.Se.GetSessionVars().BinlogClient = s.client + // This statement should not write binlog. + tk.MustExec(`insert into local_clustered_index values ("aaaaaa")`) + prewriteVal = getLatestBinlogPrewriteValue(c, pump) + c.Assert(len(prewriteVal.Mutations), Equals, 0) + checkBinlogCount(c, pump) pump.mu.Lock() @@ -592,6 +610,50 @@ func (s *testBinlogSuite) TestAddSpecialComment(c *C) { "create table t1 (id int) /*T![auto_id_cache] auto_id_cache=5 */ ;", "create table t1 (id int) /*T![auto_id_cache] auto_id_cache=5 */ ;", }, + { + "create table t1 (id int, a varchar(255), primary key (a, b) clustered);", + "create table t1 (id int, a varchar(255), primary key (a, b) /*T![clustered_index] clustered */ );", + }, + { + "create table t1(id int, v int, primary key(a) clustered);", + "create table t1(id int, v int, primary key(a) /*T![clustered_index] clustered */ );", + }, + { + "create table t1(id int primary key clustered, v int);", + "create table t1(id int primary key /*T![clustered_index] clustered */ , v int);", + }, + { + "alter table t add primary key(a) clustered;", + "alter table t add primary key(a) /*T![clustered_index] clustered */ ;", + }, + { + "create table t1 (id int, a varchar(255), primary key (a, b) nonclustered);", + "create table t1 (id int, a varchar(255), primary key (a, b) /*T![clustered_index] nonclustered */ );", + }, + { + "create table t1 (id int, a varchar(255), primary key (a, b) /*T![clustered_index] nonclustered */);", + "create table t1 (id int, a varchar(255), primary key (a, b) /*T![clustered_index] nonclustered */);", + }, + { + "create table clustered_test(id int)", + "create table clustered_test(id int)", + }, + { + "create database clustered_test", + "create database clustered_test", + }, + { + "create database clustered", + "create database clustered", + }, + { + "create table clustered (id int)", + "create table clustered (id int)", + }, + { + "create table t1 (id int, a varchar(255) key clustered);", + "create table t1 (id int, a varchar(255) key /*T![clustered_index] clustered */ );", + }, } for _, ca := range testCase { re := binloginfo.AddSpecialComment(ca.input) diff --git a/sessionctx/context.go b/sessionctx/context.go index c7804b53a3bb3..ba98df59e5d25 100644 --- a/sessionctx/context.go +++ b/sessionctx/context.go @@ -17,6 +17,7 @@ import ( "context" "fmt" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/owner" @@ -42,6 +43,9 @@ type Context interface { // GetClient gets a kv.Client. GetClient() kv.Client + // GetClient gets a kv.Client. + GetMPPClient() kv.MPPClient + // SetValue saves a value associated with this context for key. SetValue(key fmt.Stringer, value interface{}) @@ -68,6 +72,9 @@ type Context interface { // It should be called right before we builds an executor. InitTxnWithStartTS(startTS uint64) error + // NewTxnWithStalenessOption initializes a transaction with StalenessTxnOption + NewTxnWithStalenessOption(ctx context.Context, option StalenessTxnOption) error + // GetStore returns the store of session. GetStore() kv.Storage @@ -104,6 +111,8 @@ type Context interface { HasLockedTables() bool // PrepareTSFuture uses to prepare timestamp by future. PrepareTSFuture(ctx context.Context) + // StoreIndexUsage stores the index usage information. + StoreIndexUsage(tblID int64, idxID int64, rowsSelected int64) } type basicCtxType int @@ -130,12 +139,9 @@ const ( LastExecuteDDL basicCtxType = 3 ) -type connIDCtxKeyType struct{} - -// ConnID is the key in context. -var ConnID = connIDCtxKeyType{} - -// SetCommitCtx sets connection id into context -func SetCommitCtx(ctx context.Context, sessCtx Context) context.Context { - return context.WithValue(ctx, ConnID, sessCtx.GetSessionVars().ConnectionID) +// StalenessTxnOption represents available options for the InitTxnWithStaleness +type StalenessTxnOption struct { + Mode ast.TimestampBoundMode + PrevSec uint64 + StartTS uint64 } diff --git a/sessionctx/stmtctx/stmtctx.go b/sessionctx/stmtctx/stmtctx.go index f11c62dacafc9..b200ac131753b 100644 --- a/sessionctx/stmtctx/stmtctx.go +++ b/sessionctx/stmtctx/stmtctx.go @@ -60,25 +60,29 @@ type StatementContext struct { // IsDDLJobInQueue is used to mark whether the DDL job is put into the queue. // If IsDDLJobInQueue is true, it means the DDL job is in the queue of storage, and it can be handled by the DDL worker. - IsDDLJobInQueue bool - InInsertStmt bool - InUpdateStmt bool - InDeleteStmt bool - InSelectStmt bool - InLoadDataStmt bool - InExplainStmt bool - IgnoreTruncate bool - IgnoreZeroInDate bool - DupKeyAsWarning bool - BadNullAsWarning bool - DividedByZeroAsWarning bool - TruncateAsWarning bool - OverflowAsWarning bool - InShowWarning bool - UseCache bool - BatchCheck bool - InNullRejectCheck bool - AllowInvalidDate bool + IsDDLJobInQueue bool + InInsertStmt bool + InUpdateStmt bool + InDeleteStmt bool + InSelectStmt bool + InLoadDataStmt bool + InExplainStmt bool + InCreateOrAlterStmt bool + IgnoreTruncate bool + IgnoreZeroInDate bool + DupKeyAsWarning bool + BadNullAsWarning bool + DividedByZeroAsWarning bool + TruncateAsWarning bool + OverflowAsWarning bool + InShowWarning bool + UseCache bool + BatchCheck bool + InNullRejectCheck bool + AllowInvalidDate bool + IgnoreNoPartition bool + OptimDependOnMutableConst bool + IgnoreExplainIDSuffix bool // mu struct holds variables that change during execution. mu struct { @@ -145,6 +149,9 @@ type StatementContext struct { // planNormalized use for cache the normalized plan, avoid duplicate builds. planNormalized string planDigest string + encodedPlan string + planHint string + planHintSet bool Tables []TableEntry PointExec bool // for point update cached execution, Constant expression need to set "paramMarker" lockWaitStartTime int64 // LockWaitStartTime stores the pessimistic lock wait start time @@ -177,6 +184,7 @@ type StmtHints struct { HasReplicaReadHint bool HasMaxExecutionTime bool HasEnableCascadesPlannerHint bool + SetVars map[string]string } // TaskMapNeedBackUp indicates that whether we need to back up taskMap during physical optimizing. @@ -225,6 +233,27 @@ func (sc *StatementContext) SetPlanDigest(normalized, planDigest string) { sc.planNormalized, sc.planDigest = normalized, planDigest } +// GetEncodedPlan gets the encoded plan, it is used to avoid repeated encode. +func (sc *StatementContext) GetEncodedPlan() string { + return sc.encodedPlan +} + +// SetEncodedPlan sets the encoded plan, it is used to avoid repeated encode. +func (sc *StatementContext) SetEncodedPlan(encodedPlan string) { + sc.encodedPlan = encodedPlan +} + +// GetPlanHint gets the hint string generated from the plan. +func (sc *StatementContext) GetPlanHint() (string, bool) { + return sc.planHint, sc.planHintSet +} + +// SetPlanHint sets the hint for the plan. +func (sc *StatementContext) SetPlanHint(hint string) { + sc.planHintSet = true + sc.planHint = hint +} + // TableEntry presents table in db. type TableEntry struct { DB string @@ -491,18 +520,40 @@ func (sc *StatementContext) ResetForRetry() { // the information in slow query log. func (sc *StatementContext) MergeExecDetails(details *execdetails.ExecDetails, commitDetails *execdetails.CommitDetails) { sc.mu.Lock() + defer sc.mu.Unlock() if details != nil { sc.mu.execDetails.CopTime += details.CopTime - sc.mu.execDetails.ProcessTime += details.ProcessTime - sc.mu.execDetails.WaitTime += details.WaitTime sc.mu.execDetails.BackoffTime += details.BackoffTime sc.mu.execDetails.RequestCount++ - sc.mu.execDetails.TotalKeys += details.TotalKeys - sc.mu.execDetails.ProcessedKeys += details.ProcessedKeys + sc.MergeScanDetail(details.ScanDetail) + sc.MergeTimeDetail(details.TimeDetail) sc.mu.allExecDetails = append(sc.mu.allExecDetails, details) } - sc.mu.execDetails.CommitDetail = commitDetails - sc.mu.Unlock() + if commitDetails != nil { + if sc.mu.execDetails.CommitDetail == nil { + sc.mu.execDetails.CommitDetail = commitDetails + } else { + sc.mu.execDetails.CommitDetail.Merge(commitDetails) + } + } +} + +// MergeScanDetail merges scan details into self. +func (sc *StatementContext) MergeScanDetail(scanDetail *execdetails.ScanDetail) { + // Currently TiFlash cop task does not fill scanDetail, so need to skip it if scanDetail is nil + if scanDetail == nil { + return + } + if sc.mu.execDetails.ScanDetail == nil { + sc.mu.execDetails.ScanDetail = &execdetails.ScanDetail{} + } + sc.mu.execDetails.ScanDetail.Merge(scanDetail) +} + +// MergeTimeDetail merges time details into self. +func (sc *StatementContext) MergeTimeDetail(timeDetail execdetails.TimeDetail) { + sc.mu.execDetails.TimeDetail.ProcessTime += timeDetail.ProcessTime + sc.mu.execDetails.TimeDetail.WaitTime += timeDetail.WaitTime } // MergeLockKeysExecDetails merges lock keys execution details into self. @@ -527,12 +578,10 @@ func (sc *StatementContext) GetExecDetails() execdetails.ExecDetails { } // ShouldClipToZero indicates whether values less than 0 should be clipped to 0 for unsigned integer types. -// This is the case for `insert`, `update`, `alter table` and `load data infile` statements, when not in strict SQL mode. +// This is the case for `insert`, `update`, `alter table`, `create table` and `load data infile` statements, when not in strict SQL mode. // see https://dev.mysql.com/doc/refman/5.7/en/out-of-range-and-overflow.html func (sc *StatementContext) ShouldClipToZero() bool { - // TODO: Currently altering column of integer to unsigned integer is not supported. - // If it is supported one day, that case should be added here. - return sc.InInsertStmt || sc.InLoadDataStmt || sc.InUpdateStmt + return sc.InInsertStmt || sc.InLoadDataStmt || sc.InUpdateStmt || sc.InCreateOrAlterStmt || sc.IsDDLJobInQueue } // ShouldIgnoreOverflowError indicates whether we should ignore the error when type conversion overflows, @@ -591,21 +640,21 @@ func (sc *StatementContext) CopTasksDetails() *CopTasksDetails { if n == 0 { return d } - d.AvgProcessTime = sc.mu.execDetails.ProcessTime / time.Duration(n) - d.AvgWaitTime = sc.mu.execDetails.WaitTime / time.Duration(n) + d.AvgProcessTime = sc.mu.execDetails.TimeDetail.ProcessTime / time.Duration(n) + d.AvgWaitTime = sc.mu.execDetails.TimeDetail.WaitTime / time.Duration(n) sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { - return sc.mu.allExecDetails[i].ProcessTime < sc.mu.allExecDetails[j].ProcessTime + return sc.mu.allExecDetails[i].TimeDetail.ProcessTime < sc.mu.allExecDetails[j].TimeDetail.ProcessTime }) - d.P90ProcessTime = sc.mu.allExecDetails[n*9/10].ProcessTime - d.MaxProcessTime = sc.mu.allExecDetails[n-1].ProcessTime + d.P90ProcessTime = sc.mu.allExecDetails[n*9/10].TimeDetail.ProcessTime + d.MaxProcessTime = sc.mu.allExecDetails[n-1].TimeDetail.ProcessTime d.MaxProcessAddress = sc.mu.allExecDetails[n-1].CalleeAddress sort.Slice(sc.mu.allExecDetails, func(i, j int) bool { - return sc.mu.allExecDetails[i].WaitTime < sc.mu.allExecDetails[j].WaitTime + return sc.mu.allExecDetails[i].TimeDetail.WaitTime < sc.mu.allExecDetails[j].TimeDetail.WaitTime }) - d.P90WaitTime = sc.mu.allExecDetails[n*9/10].WaitTime - d.MaxWaitTime = sc.mu.allExecDetails[n-1].WaitTime + d.P90WaitTime = sc.mu.allExecDetails[n*9/10].TimeDetail.WaitTime + d.MaxWaitTime = sc.mu.allExecDetails[n-1].TimeDetail.WaitTime d.MaxWaitAddress = sc.mu.allExecDetails[n-1].CalleeAddress // calculate backoff details @@ -670,7 +719,7 @@ func (sc *StatementContext) GetLockWaitStartTime() time.Time { return time.Unix(0, startTime) } -//CopTasksDetails collects some useful information of cop-tasks during execution. +// CopTasksDetails collects some useful information of cop-tasks during execution. type CopTasksDetails struct { NumCopTasks int diff --git a/sessionctx/stmtctx/stmtctx_test.go b/sessionctx/stmtctx/stmtctx_test.go index c786d5e10fcbf..cd0a51800a471 100644 --- a/sessionctx/stmtctx/stmtctx_test.go +++ b/sessionctx/stmtctx/stmtctx_test.go @@ -37,10 +37,12 @@ func (s *stmtctxSuit) TestCopTasksDetails(c *C) { for i := 0; i < 100; i++ { d := &execdetails.ExecDetails{ CalleeAddress: fmt.Sprintf("%v", i+1), - ProcessTime: time.Second * time.Duration(i+1), - WaitTime: time.Millisecond * time.Duration(i+1), BackoffSleep: make(map[string]time.Duration), BackoffTimes: make(map[string]int), + TimeDetail: execdetails.TimeDetail{ + ProcessTime: time.Second * time.Duration(i+1), + WaitTime: time.Millisecond * time.Duration(i+1), + }, } for _, backoff := range backoffs { d.BackoffSleep[backoff] = time.Millisecond * 100 * time.Duration(i+1) diff --git a/sessionctx/variable/error.go b/sessionctx/variable/error.go index 016783bdb64a3..b9c21782e5be2 100644 --- a/sessionctx/variable/error.go +++ b/sessionctx/variable/error.go @@ -14,24 +14,22 @@ package variable import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // Error instances. var ( - errCantGetValidID = terror.ClassVariable.New(mysql.ErrCantGetValidID, mysql.MySQLErrName[mysql.ErrCantGetValidID]) - errWarnDeprecatedSyntax = terror.ClassVariable.New(mysql.ErrWarnDeprecatedSyntax, mysql.MySQLErrName[mysql.ErrWarnDeprecatedSyntax]) - ErrCantSetToNull = terror.ClassVariable.New(mysql.ErrCantSetToNull, mysql.MySQLErrName[mysql.ErrCantSetToNull]) - ErrSnapshotTooOld = terror.ClassVariable.New(mysql.ErrSnapshotTooOld, mysql.MySQLErrName[mysql.ErrSnapshotTooOld]) - ErrUnsupportedValueForVar = terror.ClassVariable.New(mysql.ErrUnsupportedValueForVar, mysql.MySQLErrName[mysql.ErrUnsupportedValueForVar]) - ErrUnknownSystemVar = terror.ClassVariable.New(mysql.ErrUnknownSystemVariable, mysql.MySQLErrName[mysql.ErrUnknownSystemVariable]) - ErrIncorrectScope = terror.ClassVariable.New(mysql.ErrIncorrectGlobalLocalVar, mysql.MySQLErrName[mysql.ErrIncorrectGlobalLocalVar]) - ErrUnknownTimeZone = terror.ClassVariable.New(mysql.ErrUnknownTimeZone, mysql.MySQLErrName[mysql.ErrUnknownTimeZone]) - ErrReadOnly = terror.ClassVariable.New(mysql.ErrVariableIsReadonly, mysql.MySQLErrName[mysql.ErrVariableIsReadonly]) - ErrWrongValueForVar = terror.ClassVariable.New(mysql.ErrWrongValueForVar, mysql.MySQLErrName[mysql.ErrWrongValueForVar]) - ErrWrongTypeForVar = terror.ClassVariable.New(mysql.ErrWrongTypeForVar, mysql.MySQLErrName[mysql.ErrWrongTypeForVar]) - ErrTruncatedWrongValue = terror.ClassVariable.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrTruncatedWrongValue]) - ErrMaxPreparedStmtCountReached = terror.ClassVariable.New(mysql.ErrMaxPreparedStmtCountReached, mysql.MySQLErrName[mysql.ErrMaxPreparedStmtCountReached]) - ErrUnsupportedIsolationLevel = terror.ClassVariable.New(mysql.ErrUnsupportedIsolationLevel, mysql.MySQLErrName[mysql.ErrUnsupportedIsolationLevel]) + errWarnDeprecatedSyntax = dbterror.ClassVariable.NewStd(mysql.ErrWarnDeprecatedSyntax) + ErrSnapshotTooOld = dbterror.ClassVariable.NewStd(mysql.ErrSnapshotTooOld) + ErrUnsupportedValueForVar = dbterror.ClassVariable.NewStd(mysql.ErrUnsupportedValueForVar) + ErrUnknownSystemVar = dbterror.ClassVariable.NewStd(mysql.ErrUnknownSystemVariable) + ErrIncorrectScope = dbterror.ClassVariable.NewStd(mysql.ErrIncorrectGlobalLocalVar) + ErrUnknownTimeZone = dbterror.ClassVariable.NewStd(mysql.ErrUnknownTimeZone) + ErrReadOnly = dbterror.ClassVariable.NewStd(mysql.ErrVariableIsReadonly) + ErrWrongValueForVar = dbterror.ClassVariable.NewStd(mysql.ErrWrongValueForVar) + ErrWrongTypeForVar = dbterror.ClassVariable.NewStd(mysql.ErrWrongTypeForVar) + ErrTruncatedWrongValue = dbterror.ClassVariable.NewStd(mysql.ErrTruncatedWrongValue) + ErrMaxPreparedStmtCountReached = dbterror.ClassVariable.NewStd(mysql.ErrMaxPreparedStmtCountReached) + ErrUnsupportedIsolationLevel = dbterror.ClassVariable.NewStd(mysql.ErrUnsupportedIsolationLevel) ) diff --git a/sessionctx/variable/mock_globalaccessor.go b/sessionctx/variable/mock_globalaccessor.go index 9230de81e75b2..b2b47c8185dbf 100644 --- a/sessionctx/variable/mock_globalaccessor.go +++ b/sessionctx/variable/mock_globalaccessor.go @@ -35,8 +35,3 @@ func (m *MockGlobalAccessor) GetGlobalSysVar(name string) (string, error) { func (m *MockGlobalAccessor) SetGlobalSysVar(name string, value string) error { panic("not supported") } - -// GetAllSysVars implements GlobalVarAccessor.GetAllSysVars interface. -func (m *MockGlobalAccessor) GetAllSysVars() (map[string]string, error) { - panic("not supported") -} diff --git a/sessionctx/variable/noop.go b/sessionctx/variable/noop.go new file mode 100644 index 0000000000000..28f98813daa28 --- /dev/null +++ b/sessionctx/variable/noop.go @@ -0,0 +1,505 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package variable + +import ( + "math" +) + +// The following sysVars are noops. +// Some applications will depend on certain variables to be present or settable, +// for example query_cache_time. These are included for MySQL compatibility, +// but changing them has no effect on behavior. + +var noopSysVars = []*SysVar{ + {Scope: ScopeGlobal, Name: ConnectTimeout, Value: "10", Type: TypeUnsigned, MinValue: 2, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheWlockInvalidate, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "sql_buffer_result", Value: BoolOff, IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: MyISAMUseMmap, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: "gtid_mode", Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: FlushTime, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "performance_schema_max_mutex_classes", Value: "200"}, + {Scope: ScopeGlobal | ScopeSession, Name: LowPriorityUpdates, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: SessionTrackGtids, Value: BoolOff, Type: TypeEnum, PossibleValues: []string{BoolOff, "OWN_GTID", "ALL_GTIDS"}}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_max_rows", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_option", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: OldPasswords, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 2, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "innodb_version", Value: "5.6.25"}, + {Scope: ScopeGlobal | ScopeSession, Name: BigTables, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "skip_external_locking", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_sync_array_size", Value: "1"}, + {Scope: ScopeSession, Name: "rand_seed2", Value: ""}, + {Scope: ScopeGlobal, Name: ValidatePasswordCheckUserName, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: ValidatePasswordNumberCount, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, + {Scope: ScopeSession, Name: "gtid_next", Value: ""}, + {Scope: ScopeGlobal, Name: "ndb_show_foreign_key_mock_tables", Value: ""}, + {Scope: ScopeNone, Name: "multi_range_count", Value: "256"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_error_action", Value: "IGNORE_ERROR"}, + {Scope: ScopeGlobal | ScopeSession, Name: "default_storage_engine", Value: "InnoDB"}, + {Scope: ScopeNone, Name: "ft_query_expansion_limit", Value: "20"}, + {Scope: ScopeGlobal, Name: MaxConnectErrors, Value: "100", Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, + {Scope: ScopeGlobal, Name: SyncBinlog, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 4294967295, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "max_digest_length", Value: "1024"}, + {Scope: ScopeNone, Name: "innodb_force_load_corrupted", Value: "0"}, + {Scope: ScopeNone, Name: "performance_schema_max_table_handles", Value: "4000"}, + {Scope: ScopeGlobal, Name: InnodbFastShutdown, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: 2, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "ft_max_word_len", Value: "84"}, + {Scope: ScopeGlobal, Name: "log_backward_compatible_user_definitions", Value: ""}, + {Scope: ScopeNone, Name: "lc_messages_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/"}, + {Scope: ScopeGlobal, Name: "ft_boolean_syntax", Value: "+ -><()~*:\"\"&|"}, + {Scope: ScopeGlobal, Name: TableDefinitionCache, Value: "-1", Type: TypeUnsigned, MinValue: 400, MaxValue: 524288, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: SkipNameResolve, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "performance_schema_max_file_handles", Value: "32768"}, + {Scope: ScopeSession, Name: "transaction_allow_batching", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_max_statement_classes", Value: "168"}, + {Scope: ScopeGlobal, Name: "server_id", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_flushing_avg_loops", Value: "30"}, + {Scope: ScopeGlobal | ScopeSession, Name: TmpTableSize, Value: "16777216", Type: TypeUnsigned, MinValue: 1024, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true, IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "innodb_max_purge_lag", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "preload_buffer_size", Value: "32768"}, + {Scope: ScopeGlobal, Name: CheckProxyUsers, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "have_query_cache", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_flush_log_at_timeout", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_max_undo_log_size", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "range_alloc_block_size", Value: "4096", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "have_rtree_keys", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_old_blocks_pct", Value: "37"}, + {Scope: ScopeGlobal, Name: "innodb_file_format", Value: "Antelope"}, + {Scope: ScopeGlobal, Name: "innodb_compression_failure_threshold_pct", Value: "5"}, + {Scope: ScopeNone, Name: "performance_schema_events_waits_history_long_size", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_checksum_algorithm", Value: "innodb"}, + {Scope: ScopeNone, Name: "innodb_ft_sort_pll_degree", Value: "2"}, + {Scope: ScopeNone, Name: "thread_stack", Value: "262144"}, + {Scope: ScopeGlobal, Name: "relay_log_info_repository", Value: "FILE"}, + {Scope: ScopeGlobal, Name: SuperReadOnly, Value: "0", Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_delayed_threads", Value: "20"}, + {Scope: ScopeNone, Name: "protocol_version", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "new", Value: BoolOff}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_sort_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_offset", Value: "-1"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpAtShutdown, Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLNotes, Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbCmpPerIndexEnabled, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: "innodb_ft_server_stopword_table", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_max_file_instances", Value: "7693"}, + {Scope: ScopeNone, Name: "log_output", Value: "FILE"}, + {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_delay", Value: ""}, + {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_no_delay_count", Value: ""}, + {Scope: ScopeNone, Name: "have_crypt", Value: "YES"}, + {Scope: ScopeGlobal, Name: "innodb_log_write_ahead_size", Value: ""}, + {Scope: ScopeNone, Name: "innodb_log_group_home_dir", Value: "./"}, + {Scope: ScopeNone, Name: "performance_schema_events_statements_history_size", Value: "10"}, + {Scope: ScopeGlobal, Name: GeneralLog, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "validate_password_dictionary_file", Value: ""}, + {Scope: ScopeGlobal, Name: BinlogOrderCommits, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "key_cache_division_limit", Value: "100"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_insert_delayed_threads", Value: "20"}, + {Scope: ScopeNone, Name: "performance_schema_session_connect_attrs_size", Value: "512"}, + {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct", Value: "75"}, + {Scope: ScopeGlobal, Name: InnodbFilePerTable, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: InnodbLogCompressedPages, Value: "1"}, + {Scope: ScopeNone, Name: "skip_networking", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_reset", Value: ""}, + {Scope: ScopeNone, Name: "have_ssl", Value: "DISABLED"}, + {Scope: ScopeNone, Name: "have_openssl", Value: "DISABLED"}, + {Scope: ScopeNone, Name: "ssl_ca", Value: ""}, + {Scope: ScopeNone, Name: "ssl_cert", Value: ""}, + {Scope: ScopeNone, Name: "ssl_key", Value: ""}, + {Scope: ScopeNone, Name: "ssl_cipher", Value: ""}, + {Scope: ScopeNone, Name: "tls_version", Value: "TLSv1,TLSv1.1,TLSv1.2"}, + {Scope: ScopeGlobal, Name: InnodbPrintAllDeadlocks, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeNone, Name: "innodb_autoinc_lock_mode", Value: "1"}, + {Scope: ScopeGlobal, Name: "key_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal, Name: "host_cache_size", Value: "279"}, + {Scope: ScopeGlobal, Name: DelayKeyWrite, Value: BoolOn, Type: TypeEnum, PossibleValues: []string{BoolOff, BoolOn, "ALL"}}, + {Scope: ScopeNone, Name: "metadata_locks_cache_size", Value: "1024"}, + {Scope: ScopeNone, Name: "innodb_force_recovery", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_file_format_max", Value: "Antelope"}, + {Scope: ScopeGlobal | ScopeSession, Name: "debug", Value: ""}, + {Scope: ScopeGlobal, Name: "log_warnings", Value: "1"}, + {Scope: ScopeGlobal, Name: OfflineMode, Value: "0", Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbStrictMode, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: "innodb_rollback_segments", Value: "128"}, + {Scope: ScopeGlobal | ScopeSession, Name: "join_buffer_size", Value: "262144", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "innodb_mirrored_log_groups", Value: "1"}, + {Scope: ScopeGlobal, Name: "max_binlog_size", Value: "1073741824"}, + {Scope: ScopeGlobal, Name: "concurrent_insert", Value: "AUTO"}, + {Scope: ScopeGlobal, Name: InnodbAdaptiveHashIndex, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: InnodbFtEnableStopword, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: "general_log_file", Value: "/usr/local/mysql/data/localhost.log"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbSupportXA, Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_compression_level", Value: "6"}, + {Scope: ScopeNone, Name: "innodb_file_format_check", Value: "1"}, + {Scope: ScopeNone, Name: "myisam_mmap_size", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: "innodb_buffer_pool_instances", Value: "8"}, + {Scope: ScopeGlobal | ScopeSession, Name: BlockEncryptionMode, Value: "aes-128-ecb"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_length_for_sort_data", Value: "1024", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "character_set_system", Value: "utf8"}, + {Scope: ScopeGlobal | ScopeSession, Name: InteractiveTimeout, Value: "28800", Type: TypeUnsigned, MinValue: 1, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, + {Scope: ScopeGlobal, Name: InnodbOptimizeFullTextOnly, Value: "0"}, + {Scope: ScopeNone, Name: "character_sets_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/"}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheType, Value: BoolOff, Type: TypeEnum, PossibleValues: []string{BoolOff, BoolOn, "DEMAND"}}, + {Scope: ScopeNone, Name: "innodb_rollback_on_timeout", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "query_alloc_block_size", Value: "8192"}, + {Scope: ScopeGlobal | ScopeSession, Name: InitConnect, Value: ""}, + {Scope: ScopeNone, Name: "have_compress", Value: "YES"}, + {Scope: ScopeNone, Name: "thread_concurrency", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "query_prealloc_size", Value: "8192"}, + {Scope: ScopeNone, Name: "relay_log_space_limit", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxUserConnections, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 4294967295, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "performance_schema_max_thread_classes", Value: "50"}, + {Scope: ScopeGlobal, Name: "innodb_api_trx_level", Value: "0"}, + {Scope: ScopeNone, Name: "disconnect_on_expired_password", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_max_file_classes", Value: "50"}, + {Scope: ScopeGlobal, Name: "expire_logs_days", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: BinlogRowQueryLogEvents, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "default_password_lifetime", Value: ""}, + {Scope: ScopeNone, Name: "pid_file", Value: "/usr/local/mysql/data/localhost.pid"}, + {Scope: ScopeNone, Name: "innodb_undo_tablespaces", Value: "0"}, + {Scope: ScopeGlobal, Name: InnodbStatusOutputLocks, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeNone, Name: "performance_schema_accounts_size", Value: "100"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_error_count", Value: "64", IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "max_write_lock_count", Value: "18446744073709551615"}, + {Scope: ScopeNone, Name: "performance_schema_max_socket_instances", Value: "322"}, + {Scope: ScopeNone, Name: "performance_schema_max_table_instances", Value: "12500"}, + {Scope: ScopeGlobal, Name: "innodb_stats_persistent_sample_pages", Value: "20"}, + {Scope: ScopeGlobal, Name: "show_compatibility_56", Value: ""}, + {Scope: ScopeNone, Name: "innodb_open_files", Value: "2000"}, + {Scope: ScopeGlobal, Name: "innodb_spin_wait_delay", Value: "6"}, + {Scope: ScopeGlobal, Name: "thread_cache_size", Value: "9"}, + {Scope: ScopeGlobal, Name: LogSlowAdminStatements, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "innodb_checksums", Type: TypeBool, Value: BoolOn}, + {Scope: ScopeNone, Name: "ft_stopword_file", Value: "(built-in)"}, + {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct_lwm", Value: "0"}, + {Scope: ScopeGlobal, Name: LogQueriesNotUsingIndexes, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_heap_table_size", Value: "16777216", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "div_precision_increment", Value: "4", IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "innodb_lru_scan_depth", Value: "1024"}, + {Scope: ScopeGlobal, Name: "innodb_purge_rseg_truncate_frequency", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLAutoIsNull, Value: BoolOff, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "innodb_api_enable_binlog", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "innodb_ft_user_stopword_table", Value: ""}, + {Scope: ScopeNone, Name: "server_id_bits", Value: "32"}, + {Scope: ScopeGlobal, Name: "innodb_log_checksum_algorithm", Value: ""}, + {Scope: ScopeNone, Name: "innodb_buffer_pool_load_at_startup", Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "sort_buffer_size", Value: "262144", IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "innodb_flush_neighbors", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_use_sys_malloc", Value: "1"}, + {Scope: ScopeSession, Name: PluginLoad, Value: ""}, + {Scope: ScopeSession, Name: PluginDir, Value: "/data/deploy/plugin"}, + {Scope: ScopeNone, Name: "performance_schema_max_socket_classes", Value: "10"}, + {Scope: ScopeNone, Name: "performance_schema_max_stage_classes", Value: "150"}, + {Scope: ScopeGlobal, Name: "innodb_purge_batch_size", Value: "300"}, + {Scope: ScopeNone, Name: "have_profiling", Value: "NO"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpNow, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: RelayLogPurge, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "ndb_distribution", Value: ""}, + {Scope: ScopeGlobal, Name: "myisam_data_pointer_size", Value: "6"}, + {Scope: ScopeGlobal, Name: "ndb_optimization_delay", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_ft_num_word_optimize", Value: "2000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_join_size", Value: "18446744073709551615", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: CoreFile, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_seeks_for_key", Value: "18446744073709551615", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "innodb_log_buffer_size", Value: "8388608"}, + {Scope: ScopeGlobal, Name: "delayed_insert_timeout", Value: "300"}, + {Scope: ScopeGlobal, Name: "max_relay_log_size", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxSortLength, Value: "1024", Type: TypeUnsigned, MinValue: 4, MaxValue: 8388608, AutoConvertOutOfRange: true, IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "metadata_locks_hash_instances", Value: "8"}, + {Scope: ScopeGlobal, Name: "ndb_eventbuffer_free_percent", Value: ""}, + {Scope: ScopeNone, Name: "large_files_support", Value: "1"}, + {Scope: ScopeGlobal, Name: "binlog_max_flush_queue_time", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_fill_factor", Value: ""}, + {Scope: ScopeGlobal, Name: "log_syslog_facility", Value: ""}, + {Scope: ScopeNone, Name: "innodb_ft_min_token_size", Value: "3"}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_write_set_extraction", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_blob_write_batch_bytes", Value: ""}, + {Scope: ScopeGlobal, Name: "automatic_sp_privileges", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_flush_sync", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_events_statements_history_long_size", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_disable", Value: ""}, + {Scope: ScopeNone, Name: "innodb_doublewrite", Value: "1"}, + {Scope: ScopeNone, Name: "log_bin_use_v1_row_events", Value: "0"}, + {Scope: ScopeSession, Name: "innodb_optimize_point_storage", Value: ""}, + {Scope: ScopeNone, Name: "innodb_api_disable_rowlock", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_adaptive_flushing_lwm", Value: "10"}, + {Scope: ScopeNone, Name: "innodb_log_files_in_group", Value: "2"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadNow, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeNone, Name: "performance_schema_max_rwlock_classes", Value: "40"}, + {Scope: ScopeNone, Name: "binlog_gtid_simple_recovery", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_digests_size", Value: "10000"}, + {Scope: ScopeGlobal | ScopeSession, Name: Profiling, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeSession, Name: "rand_seed1", Value: ""}, + {Scope: ScopeGlobal, Name: "sha256_password_proxy_users", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLQuoteShowCreate, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlogging_impossible_mode", Value: "IGNORE_ERROR"}, + {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheSize, Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_stats_transient_sample_pages", Value: "8"}, + {Scope: ScopeGlobal, Name: InnodbStatsOnMetadata, Value: "0"}, + {Scope: ScopeNone, Name: "server_uuid", Value: "00000000-0000-0000-0000-000000000000"}, + {Scope: ScopeNone, Name: "open_files_limit", Value: "5000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_force_send", Value: ""}, + {Scope: ScopeNone, Name: "skip_show_database", Value: "0"}, + {Scope: ScopeGlobal, Name: "log_timestamps", Value: ""}, + {Scope: ScopeNone, Name: "version_compile_machine", Value: "x86_64"}, + {Scope: ScopeGlobal, Name: "event_scheduler", Value: BoolOff}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_deferred_constraints", Value: ""}, + {Scope: ScopeGlobal, Name: "log_syslog_include_pid", Value: ""}, + {Scope: ScopeSession, Name: "last_insert_id", Value: ""}, + {Scope: ScopeNone, Name: "innodb_ft_cache_size", Value: "8000000"}, + {Scope: ScopeGlobal, Name: InnodbDisableSortFileCache, Value: "0"}, + {Scope: ScopeGlobal, Name: "log_error_verbosity", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_hosts_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "innodb_replication_delay", Value: "0"}, + {Scope: ScopeGlobal, Name: SlowQueryLog, Value: "0"}, + {Scope: ScopeSession, Name: "debug_sync", Value: ""}, + {Scope: ScopeGlobal, Name: InnodbStatsAutoRecalc, Value: "1"}, + {Scope: ScopeGlobal | ScopeSession, Name: "lc_messages", Value: "en_US"}, + {Scope: ScopeGlobal | ScopeSession, Name: "bulk_insert_buffer_size", Value: "8388608", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: BinlogDirectNonTransactionalUpdates, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "innodb_change_buffering", Value: "all"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLBigSelects, Value: BoolOn, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "innodb_max_purge_lag_delay", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_schema", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_io_capacity_max", Value: "2000"}, + {Scope: ScopeGlobal, Name: "innodb_autoextend_increment", Value: "64"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_format", Value: "STATEMENT"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace", Value: "enabled=off,one_line=off"}, + {Scope: ScopeGlobal | ScopeSession, Name: "read_rnd_buffer_size", Value: "262144", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: NetWriteTimeout, Value: "60"}, + {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadAbort, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_prealloc_size", Value: "4096"}, + {Scope: ScopeNone, Name: "performance_schema_setup_objects_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "sync_relay_log", Value: "10000"}, + {Scope: ScopeGlobal, Name: "innodb_ft_result_cache_limit", Value: "2000000000"}, + {Scope: ScopeNone, Name: "innodb_sort_buffer_size", Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_ft_enable_diag_print", Type: TypeBool, Value: BoolOff}, + {Scope: ScopeNone, Name: "thread_handling", Value: "one-thread-per-connection"}, + {Scope: ScopeGlobal, Name: "stored_program_cache", Value: "256"}, + {Scope: ScopeNone, Name: "performance_schema_max_mutex_instances", Value: "15906"}, + {Scope: ScopeGlobal, Name: "innodb_adaptive_max_sleep_delay", Value: "150000"}, + {Scope: ScopeNone, Name: "large_pages", Value: BoolOff}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_system_variables", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_change_buffer_max_size", Value: "25"}, + {Scope: ScopeGlobal, Name: LogBinTrustFunctionCreators, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "innodb_write_io_threads", Value: "4"}, + {Scope: ScopeGlobal, Name: "mysql_native_password_proxy_users", Value: ""}, + {Scope: ScopeGlobal, Name: serverReadOnly, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "large_page_size", Value: "0"}, + {Scope: ScopeNone, Name: "table_open_cache_instances", Value: "1"}, + {Scope: ScopeGlobal, Name: InnodbStatsPersistent, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "session_track_state_change", Value: ""}, + {Scope: ScopeNone, Name: OptimizerSwitch, Value: "index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on", IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "delayed_queue_size", Value: "1000"}, + {Scope: ScopeNone, Name: "innodb_read_only", Value: "0"}, + {Scope: ScopeNone, Name: "datetime_format", Value: "%Y-%m-%d %H:%i:%s"}, + {Scope: ScopeGlobal, Name: "log_syslog", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "transaction_alloc_block_size", Value: "8192"}, + {Scope: ScopeGlobal, Name: "innodb_large_prefix", Type: TypeBool, Value: BoolOff}, + {Scope: ScopeNone, Name: "performance_schema_max_cond_classes", Value: "80"}, + {Scope: ScopeGlobal, Name: "innodb_io_capacity", Value: "200"}, + {Scope: ScopeGlobal, Name: "max_binlog_cache_size", Value: "18446744073709547520"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_enable", Value: ""}, + {Scope: ScopeGlobal, Name: "executed_gtids_compression_period", Value: ""}, + {Scope: ScopeNone, Name: "time_format", Value: "%H:%i:%s"}, + {Scope: ScopeGlobal | ScopeSession, Name: OldAlterTable, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "long_query_time", Value: "10.000000"}, + {Scope: ScopeNone, Name: "innodb_use_native_aio", Value: "0"}, + {Scope: ScopeGlobal, Name: "log_throttle_queries_not_using_indexes", Value: "0"}, + {Scope: ScopeNone, Name: "locked_in_memory", Value: "0"}, + {Scope: ScopeNone, Name: "innodb_api_enable_mdl", Value: "0"}, + {Scope: ScopeGlobal, Name: "binlog_cache_size", Value: "32768"}, + {Scope: ScopeGlobal, Name: "innodb_compression_pad_pct_max", Value: "50"}, + {Scope: ScopeGlobal, Name: InnodbCommitConcurrency, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 1000, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "ft_min_word_len", Value: "4"}, + {Scope: ScopeGlobal, Name: EnforceGtidConsistency, Value: BoolOff, Type: TypeEnum, PossibleValues: []string{BoolOff, BoolOn, "WARN"}}, + {Scope: ScopeGlobal, Name: SecureAuth, Value: BoolOn, Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if TiDBOptOn(normalizedValue) { + return BoolOn, nil + } + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(SecureAuth, originalValue) + }}, + {Scope: ScopeNone, Name: "max_tmp_tables", Value: "32"}, + {Scope: ScopeGlobal, Name: InnodbRandomReadAhead, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal | ScopeSession, Name: UniqueChecks, Value: BoolOn, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "internal_tmp_disk_storage_engine", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_repair_threads", Value: "1"}, + {Scope: ScopeGlobal, Name: "ndb_eventbuffer_max_alloc", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_read_ahead_threshold", Value: "56"}, + {Scope: ScopeGlobal, Name: "key_cache_block_size", Value: "1024"}, + {Scope: ScopeNone, Name: "ndb_recv_thread_cpu_mask", Value: ""}, + {Scope: ScopeGlobal, Name: "gtid_purged", Value: ""}, + {Scope: ScopeGlobal, Name: "max_binlog_stmt_cache_size", Value: "18446744073709547520"}, + {Scope: ScopeGlobal | ScopeSession, Name: "lock_wait_timeout", Value: "31536000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "read_buffer_size", Value: "131072", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "innodb_read_io_threads", Value: "4"}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxSpRecursionDepth, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 255, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "ignore_builtin_innodb", Value: "0"}, + {Scope: ScopeGlobal, Name: "slow_query_log_file", Value: "/usr/local/mysql/data/localhost-slow.log"}, + {Scope: ScopeGlobal, Name: "innodb_thread_sleep_delay", Value: "10000"}, + {Scope: ScopeNone, Name: "license", Value: "Apache License 2.0"}, + {Scope: ScopeGlobal, Name: "innodb_ft_aux_table", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLWarnings, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: KeepFilesOnCreate, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "innodb_data_file_path", Value: "ibdata1:12M:autoextend"}, + {Scope: ScopeNone, Name: "performance_schema_setup_actors_size", Value: "100"}, + {Scope: ScopeNone, Name: "innodb_additional_mem_pool_size", Value: "8388608"}, + {Scope: ScopeNone, Name: "log_error", Value: "/usr/local/mysql/data/localhost.err"}, + {Scope: ScopeGlobal, Name: "binlog_stmt_cache_size", Value: "32768"}, + {Scope: ScopeNone, Name: "relay_log_info_file", Value: "relay-log.info"}, + {Scope: ScopeNone, Name: "innodb_ft_total_cache_size", Value: "640000000"}, + {Scope: ScopeNone, Name: "performance_schema_max_rwlock_instances", Value: "9102"}, + {Scope: ScopeGlobal, Name: "table_open_cache", Value: "2000"}, + {Scope: ScopeNone, Name: "performance_schema_events_stages_history_long_size", Value: "10000"}, + {Scope: ScopeSession, Name: "insert_id", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "default_tmp_storage_engine", Value: "InnoDB", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_search_depth", Value: "62", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_points_in_geometry", Value: "65536", IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: "innodb_stats_sample_pages", Value: "8"}, + {Scope: ScopeGlobal | ScopeSession, Name: "profiling_history_size", Value: "15"}, + {Scope: ScopeNone, Name: "have_symlink", Value: "YES"}, + {Scope: ScopeGlobal | ScopeSession, Name: "storage_engine", Value: "InnoDB"}, + {Scope: ScopeGlobal | ScopeSession, Name: "sql_log_off", Value: "0"}, + // In MySQL, the default value of `explicit_defaults_for_timestamp` is `0`. + // But In TiDB, it's set to `1` to be consistent with TiDB timestamp behavior. + // See: https://github.com/pingcap/tidb/pull/6068 for details + {Scope: ScopeNone, Name: "explicit_defaults_for_timestamp", Value: BoolOn, Type: TypeBool}, + {Scope: ScopeNone, Name: "performance_schema_events_waits_history_size", Value: "10"}, + {Scope: ScopeGlobal, Name: "log_syslog_tag", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_undo_log_truncate", Value: ""}, + {Scope: ScopeSession, Name: "innodb_create_intrinsic", Value: ""}, + {Scope: ScopeGlobal, Name: "gtid_executed_compression_period", Value: ""}, + {Scope: ScopeGlobal, Name: "ndb_log_empty_epochs", Value: ""}, + {Scope: ScopeNone, Name: "have_geometry", Value: "YES"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_max_mem_size", Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: "net_retry_count", Value: "10"}, + {Scope: ScopeSession, Name: "ndb_table_no_logging", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_features", Value: "greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on"}, + {Scope: ScopeGlobal, Name: "innodb_flush_log_at_trx_commit", Value: "1"}, + {Scope: ScopeGlobal, Name: "rewriter_enabled", Value: ""}, + {Scope: ScopeGlobal, Name: "query_cache_min_res_unit", Value: "4096"}, + {Scope: ScopeGlobal | ScopeSession, Name: "updatable_views_with_limit", Value: "YES", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_prune_level", Value: "1", IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: "completion_type", Value: "NO_CHAIN"}, + {Scope: ScopeGlobal, Name: "binlog_checksum", Value: "CRC32"}, + {Scope: ScopeNone, Name: "report_port", Value: "3306"}, + {Scope: ScopeGlobal | ScopeSession, Name: ShowOldTemporals, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "query_cache_limit", Value: "1048576"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_size", Value: "134217728"}, + {Scope: ScopeGlobal, Name: InnodbAdaptiveFlushing, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeGlobal, Name: "innodb_monitor_enable", Value: ""}, + {Scope: ScopeNone, Name: "date_format", Value: "%Y-%m-%d"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_filename", Value: "ib_buffer_pool"}, + {Scope: ScopeGlobal, Name: "slow_launch_time", Value: "2"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_use_transactions", Value: ""}, + {Scope: ScopeNone, Name: "innodb_purge_threads", Value: "1"}, + {Scope: ScopeGlobal, Name: "innodb_concurrency_tickets", Value: "5000"}, + {Scope: ScopeGlobal, Name: "innodb_monitor_reset_all", Value: ""}, + {Scope: ScopeNone, Name: "performance_schema_users_size", Value: "100"}, + {Scope: ScopeGlobal, Name: "ndb_log_updated_only", Value: ""}, + {Scope: ScopeNone, Name: "basedir", Value: "/usr/local/mysql"}, + {Scope: ScopeGlobal, Name: "innodb_old_blocks_time", Value: "1000"}, + {Scope: ScopeGlobal, Name: "innodb_stats_method", Value: "nulls_equal"}, + {Scope: ScopeGlobal, Name: LocalInFile, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "myisam_stats_method", Value: "nulls_unequal"}, + {Scope: ScopeNone, Name: "version_compile_os", Value: "osx10.8"}, + {Scope: ScopeNone, Name: "relay_log_recovery", Value: "0"}, + {Scope: ScopeNone, Name: "old", Value: "0"}, + {Scope: ScopeGlobal | ScopeSession, Name: InnodbTableLocks, Value: BoolOn, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeNone, Name: PerformanceSchema, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeNone, Name: "myisam_recover_options", Value: BoolOff}, + {Scope: ScopeGlobal | ScopeSession, Name: NetBufferLength, Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: "binlog_row_image", Value: "FULL"}, + {Scope: ScopeNone, Name: "innodb_locks_unsafe_for_binlog", Value: "0"}, + {Scope: ScopeSession, Name: "rbr_exec_mode", Value: ""}, + {Scope: ScopeGlobal, Name: "myisam_max_sort_file_size", Value: "9223372036853727232"}, + {Scope: ScopeNone, Name: "back_log", Value: "80"}, + {Scope: ScopeSession, Name: "pseudo_thread_id", Value: ""}, + {Scope: ScopeNone, Name: "have_dynamic_loading", Value: "YES"}, + {Scope: ScopeGlobal, Name: "rewriter_verbose", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_undo_logs", Value: "128"}, + {Scope: ScopeNone, Name: "performance_schema_max_cond_instances", Value: "3504"}, + {Scope: ScopeGlobal, Name: "delayed_insert_limit", Value: "100"}, + {Scope: ScopeGlobal, Name: Flush, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: "eq_range_index_dive_limit", Value: "200", IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "performance_schema_events_stages_history_size", Value: "10"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndb_join_pushdown", Value: ""}, + {Scope: ScopeGlobal, Name: "validate_password_special_char_count", Value: "1"}, + {Scope: ScopeNone, Name: "performance_schema_max_thread_instances", Value: "402"}, + {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_show_hidden", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "net_read_timeout", Value: "30"}, + {Scope: ScopeNone, Name: "innodb_page_size", Value: "16384"}, + {Scope: ScopeNone, Name: "innodb_log_file_size", Value: "50331648"}, + {Scope: ScopeGlobal, Name: "sync_relay_log_info", Value: "10000"}, + {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_limit", Value: "1"}, + {Scope: ScopeNone, Name: "innodb_ft_max_token_size", Value: "84"}, + {Scope: ScopeGlobal, Name: ValidatePasswordLength, Value: "8", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, + {Scope: ScopeGlobal, Name: "ndb_log_binlog_index", Value: ""}, + {Scope: ScopeGlobal, Name: "innodb_api_bk_commit_interval", Value: "5"}, + {Scope: ScopeNone, Name: "innodb_undo_directory", Value: "."}, + {Scope: ScopeNone, Name: "bind_address", Value: "*"}, + {Scope: ScopeGlobal, Name: "innodb_sync_spin_loops", Value: "30"}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLSafeUpdates, Value: BoolOff, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeNone, Name: "tmpdir", Value: "/var/tmp/"}, + {Scope: ScopeGlobal, Name: "innodb_thread_concurrency", Value: "0"}, + {Scope: ScopeGlobal, Name: "innodb_buffer_pool_dump_pct", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "lc_time_names", Value: "en_US"}, + {Scope: ScopeGlobal | ScopeSession, Name: "max_statement_time", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: EndMarkersInJSON, Value: BoolOff, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeGlobal, Name: AvoidTemporalUpgrade, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "key_cache_age_threshold", Value: "300"}, + {Scope: ScopeGlobal, Name: InnodbStatusOutput, Value: BoolOff, Type: TypeBool, AutoConvertNegativeBool: true}, + {Scope: ScopeSession, Name: "identity", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: "min_examined_row_limit", Value: "0"}, + {Scope: ScopeGlobal, Name: "sync_frm", Type: TypeBool, Value: BoolOn}, + {Scope: ScopeGlobal, Name: "innodb_online_alter_log_max_size", Value: "134217728"}, + {Scope: ScopeGlobal | ScopeSession, Name: "information_schema_stats_expiry", Value: "86400"}, + {Scope: ScopeGlobal, Name: ThreadPoolSize, Value: "16", Type: TypeUnsigned, MinValue: 1, MaxValue: 64, AutoConvertOutOfRange: true}, + {Scope: ScopeNone, Name: "lower_case_file_system", Value: "1"}, + // for compatibility purpose, we should leave them alone. + // TODO: Follow the Terminology Updates of MySQL after their changes arrived. + // https://mysqlhighavailability.com/mysql-terminology-updates/ + {Scope: ScopeSession, Name: PseudoSlaveMode, Value: "", Type: TypeInt}, + {Scope: ScopeGlobal, Name: "slave_pending_jobs_size_max", Value: "16777216"}, + {Scope: ScopeGlobal, Name: "slave_transaction_retries", Value: "10"}, + {Scope: ScopeGlobal, Name: "slave_checkpoint_period", Value: "300"}, + {Scope: ScopeGlobal, Name: MasterVerifyChecksum, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_trace_level", Value: ""}, + {Scope: ScopeGlobal, Name: "master_info_repository", Value: "FILE"}, + {Scope: ScopeGlobal, Name: "rpl_stop_slave_timeout", Value: "31536000"}, + {Scope: ScopeGlobal, Name: "slave_net_timeout", Value: "3600"}, + {Scope: ScopeGlobal, Name: "sync_master_info", Value: "10000"}, + {Scope: ScopeGlobal, Name: "init_slave", Value: ""}, + {Scope: ScopeGlobal, Name: SlaveCompressedProtocol, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_trace_level", Value: ""}, + {Scope: ScopeGlobal, Name: LogSlowSlaveStatements, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "slave_checkpoint_group", Value: "512"}, + {Scope: ScopeNone, Name: "slave_load_tmpdir", Value: "/var/tmp/"}, + {Scope: ScopeGlobal, Name: "slave_parallel_type", Value: ""}, + {Scope: ScopeGlobal, Name: "slave_parallel_workers", Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_timeout", Value: "10000", Type: TypeInt}, + {Scope: ScopeNone, Name: "slave_skip_errors", Value: BoolOff}, + {Scope: ScopeGlobal, Name: "sql_slave_skip_counter", Value: "0"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_enabled", Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_enabled", Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "slave_preserve_commit_order", Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "slave_exec_mode", Value: "STRICT"}, + {Scope: ScopeNone, Name: "log_slave_updates", Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_point", Value: "AFTER_SYNC", Type: TypeEnum, PossibleValues: []string{"AFTER_SYNC", "AFTER_COMMIT"}}, + {Scope: ScopeGlobal, Name: "slave_sql_verify_checksum", Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "slave_max_allowed_packet", Value: "1073741824"}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_for_slave_count", Value: "1", Type: TypeInt, MinValue: 1, MaxValue: 65535}, + {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_no_slave", Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal, Name: "slave_rows_search_algorithms", Value: "TABLE_SCAN,INDEX_SCAN"}, + {Scope: ScopeGlobal, Name: SlaveAllowBatching, Value: BoolOff, Type: TypeBool}, +} diff --git a/sessionctx/variable/session.go b/sessionctx/variable/session.go index 3bb947b2a9bfa..1f939a607ac63 100644 --- a/sessionctx/variable/session.go +++ b/sessionctx/variable/session.go @@ -20,6 +20,7 @@ import ( "fmt" "math" "math/rand" + "net" "sort" "strconv" "strings" @@ -29,6 +30,7 @@ import ( "github.com/klauspost/cpuid" "github.com/pingcap/errors" + "github.com/pingcap/parser" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/auth" "github.com/pingcap/parser/charset" @@ -41,20 +43,21 @@ import ( "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/store/tikv/storeutil" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/execdetails" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/rowcodec" - "github.com/pingcap/tidb/util/storeutil" "github.com/pingcap/tidb/util/stringutil" "github.com/pingcap/tidb/util/timeutil" "github.com/twmb/murmur3" atomic2 "go.uber.org/atomic" ) -var preparedStmtCount int64 +// PreparedStmtCount is exported for test. +var PreparedStmtCount int64 // RetryInfo saves retry information. type RetryInfo struct { @@ -86,7 +89,7 @@ func (r *RetryInfo) AddAutoIncrementID(id int64) { } // GetCurrAutoIncrementID gets current autoIncrementID. -func (r *RetryInfo) GetCurrAutoIncrementID() (int64, error) { +func (r *RetryInfo) GetCurrAutoIncrementID() (int64, bool) { return r.autoIncrementIDs.getCurrent() } @@ -96,7 +99,7 @@ func (r *RetryInfo) AddAutoRandomID(id int64) { } // GetCurrAutoRandomID gets current AutoRandomID. -func (r *RetryInfo) GetCurrAutoRandomID() (int64, error) { +func (r *RetryInfo) GetCurrAutoRandomID() (int64, bool) { return r.autoRandomIDs.getCurrent() } @@ -116,19 +119,13 @@ func (r *retryInfoAutoIDs) clean() { } } -func (r *retryInfoAutoIDs) getCurrent() (int64, error) { +func (r *retryInfoAutoIDs) getCurrent() (int64, bool) { if r.currentOffset >= len(r.autoIDs) { - return 0, errCantGetValidID + return 0, false } id := r.autoIDs[r.currentOffset] r.currentOffset++ - return id, nil -} - -// stmtFuture is used to async get timestamp for statement. -type stmtFuture struct { - future oracle.Future - cachedTS uint64 + return id, true } // TransactionContext is used to store variables that has transaction scope. @@ -148,8 +145,8 @@ type TransactionContext struct { shardRand *rand.Rand // TableDeltaMap is used in the schema validator for DDL changes in one table not to block others. - // It's also used in the statistias updating. - // Note: for the partitionted table, it stores all the partition IDs. + // It's also used in the statistics updating. + // Note: for the partitioned table, it stores all the partition IDs. TableDeltaMap map[int64]TableDelta // unchangedRowKeys is used to store the unchanged rows that needs to lock for pessimistic transaction. @@ -165,9 +162,19 @@ type TransactionContext struct { StatementCount int CouldRetry bool IsPessimistic bool - Isolation string - LockExpire uint32 - ForUpdate uint32 + // IsStaleness indicates whether the txn is read only staleness txn. + IsStaleness bool + // IsExplicit indicates whether the txn is an interactive txn, which is typically started with a BEGIN + // or START TRANSACTION statement, or by setting autocommit to 0. + IsExplicit bool + Isolation string + LockExpire uint32 + ForUpdate uint32 + // TxnScope indicates the value of txn_scope + TxnScope string + + // TableDeltaMap lock to prevent potential data race + tdmLock sync.Mutex } // GetShard returns the shard prefix for the next `count` rowids. @@ -216,6 +223,8 @@ func (tc *TransactionContext) CollectUnchangedRowKeys(buf []kv.Key) []kv.Key { // UpdateDeltaForTable updates the delta info for some table. func (tc *TransactionContext) UpdateDeltaForTable(physicalTableID int64, delta int64, count int64, colSize map[int64]int64) { + tc.tdmLock.Lock() + defer tc.tdmLock.Unlock() if tc.TableDeltaMap == nil { tc.TableDeltaMap = make(map[int64]TableDelta) } @@ -225,6 +234,7 @@ func (tc *TransactionContext) UpdateDeltaForTable(physicalTableID int64, delta i } item.Delta += delta item.Count += count + item.TableID = physicalTableID for key, val := range colSize { item.ColSize[key] += val } @@ -256,13 +266,18 @@ func (tc *TransactionContext) Cleanup() { // tc.InfoSchema = nil; we cannot do it now, because some operation like handleFieldList depend on this. tc.Binlog = nil tc.History = nil + tc.tdmLock.Lock() tc.TableDeltaMap = nil + tc.tdmLock.Unlock() tc.pessimisticLockCache = nil + tc.IsStaleness = false } // ClearDelta clears the delta map. func (tc *TransactionContext) ClearDelta() { + tc.tdmLock.Lock() tc.TableDeltaMap = nil + tc.tdmLock.Unlock() } // GetForUpdateTS returns the ts for update. @@ -361,8 +376,14 @@ type SessionVars struct { UsersLock sync.RWMutex // Users are user defined variables. Users map[string]types.Datum + // UserVarTypes stores the FieldType for user variables, it cannot be inferred from Users when Users have not been set yet. + // It is read/write protected by UsersLock. + UserVarTypes map[string]*types.FieldType // systems variables, don't modify it directly, use GetSystemVar/SetSystemVar method. systems map[string]string + // stmtVars variables are temporarily set by SET_VAR hint + // It only take effect for the duration of a single statement + stmtVars map[string]string // SysWarningCount is the system variable "warning_count", because it is on the hot path, so we extract it from the systems SysWarningCount int // SysErrorCount is the system variable "error_count", because it is on the hot path, so we extract it from the systems @@ -412,6 +433,9 @@ type SessionVars struct { // User is the user identity with which the session login. User *auth.UserIdentity + // Port is the port of the connected socket + Port string + // CurrentDB is the default database of this session. CurrentDB string @@ -455,17 +479,30 @@ type SessionVars struct { // AllowDistinctAggPushDown can be set true to allow agg with distinct push down to tikv/tiflash. AllowDistinctAggPushDown bool - // AllowWriteRowID can be set to false to forbid write data to _tidb_rowid. - // This variable is currently not recommended to be turned on. + // MultiStatementMode permits incorrect client library usage. Not recommended to be turned on. + MultiStatementMode int + + // AllowWriteRowID variable is currently not recommended to be turned on. AllowWriteRowID bool // AllowBatchCop means if we should send batch coprocessor to TiFlash. Default value is 1, means to use batch cop in case of aggregation and join. // If value is set to 2 , which means to force to send batch cop for any query. Value is set to 0 means never use batch cop. AllowBatchCop int + // AllowMPPExecution will prefer using mpp way to execute a query. + AllowMPPExecution bool + // TiDBAllowAutoRandExplicitInsert indicates whether explicit insertion on auto_random column is allowed. AllowAutoRandExplicitInsert bool + // BroadcastJoinThresholdSize is used to limit the size of smaller table. + // It's unit is bytes, if the size of small table is larger than it, we will not use bcj. + BroadcastJoinThresholdSize int64 + + // BroadcastJoinThresholdCount is used to limit the total count of smaller table. + // If we can't estimate the size of one side of join child, we will check if its row number exceeds this limitation. + BroadcastJoinThresholdCount int64 + // CorrelationThreshold is the guard to enable row count estimation using column order correlation. CorrelationThreshold float64 @@ -497,6 +534,10 @@ type SessionVars struct { // See http://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_values CurrInsertValues chunk.Row + // In https://github.com/pingcap/tidb/issues/14164, we can see that MySQL can enter the column that is not in the insert's SELECT's output. + // We store the extra columns in this variable. + CurrInsertBatchExtraCols [][]types.Datum + // Per-connection time zones. Each client that connects has its own time zone setting, given by the session time_zone variable. // See https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html TimeZone *time.Location @@ -535,12 +576,18 @@ type SessionVars struct { // EnableTablePartition enables table partition feature. EnableTablePartition string + // EnableListTablePartition enables list table partition feature. + EnableListTablePartition bool + // EnableCascadesPlanner enables the cascades planner. EnableCascadesPlanner bool // EnableWindowFunction enables the window function. EnableWindowFunction bool + // EnableStrictDoubleTypeCheck enables table field double type check. + EnableStrictDoubleTypeCheck bool + // EnableVectorizedExpression enables the vectorized expression evaluation. EnableVectorizedExpression bool @@ -550,6 +597,15 @@ type SessionVars struct { // EnableChangeColumnType is used to control whether to enable the change column type. EnableChangeColumnType bool + // EnableChangeMultiSchema is used to control whether to enable the multi schema change. + EnableChangeMultiSchema bool + + // EnablePointGetCache is used to cache value for point get for read only scenario. + EnablePointGetCache bool + + // EnableAlterPlacement indicates whether a user can alter table partition placement rules. + EnableAlterPlacement bool + // WaitSplitRegionFinish defines the split region behaviour is sync or async. WaitSplitRegionFinish bool @@ -641,11 +697,17 @@ type SessionVars struct { // EvolvePlanBaselines indicates whether we will evolve the plan baselines. EvolvePlanBaselines bool + // EnableExtendedStats indicates whether we enable the extended statistics feature. + EnableExtendedStats bool + // Unexported fields should be accessed and set through interfaces like GetReplicaRead() and SetReplicaRead(). // allowInSubqToJoinAndAgg can be set to false to forbid rewriting the semi join to inner join with agg. allowInSubqToJoinAndAgg bool + // preferRangeScan allows optimizer to always prefer range scan over table scan. + preferRangeScan bool + // EnableIndexMerge enables the generation of IndexMergePath. enableIndexMerge bool @@ -688,6 +750,11 @@ type SessionVars struct { // PrevFoundInPlanCache indicates whether the last statement was found in plan cache. PrevFoundInPlanCache bool + // FoundInBinding indicates whether the execution plan is matched with the hints in the binding. + FoundInBinding bool + // PrevFoundInBinding indicates whether the last execution plan is matched with the hints in the binding. + PrevFoundInBinding bool + // OptimizerUseInvisibleIndexes indicates whether optimizer can use invisible index OptimizerUseInvisibleIndexes bool @@ -703,6 +770,9 @@ type SessionVars struct { // EnableParallelApply indicates that thether to use parallel apply. EnableParallelApply bool + // EnableRedactLog indicates that whether redact log. + EnableRedactLog bool + // ShardAllocateStep indicates the max size of continuous rowid shard in one transaction. ShardAllocateStep int64 @@ -712,37 +782,109 @@ type SessionVars struct { // LastTxnInfo keeps track the info of last committed transaction. LastTxnInfo kv.TxnInfo + // LastQueryInfo keeps track the info of last query. + LastQueryInfo QueryInfo + // PartitionPruneMode indicates how and when to prune partitions. PartitionPruneMode atomic2.String + + // TxnScope indicates the scope of the transactions. It should be `global` or equal to `dc-location` in configuration. + TxnScope oracle.TxnScope + + // EnabledRateLimitAction indicates whether enabled ratelimit action during coprocessor + EnabledRateLimitAction bool + + // EnableAsyncCommit indicates whether to enable the async commit feature. + EnableAsyncCommit bool + + // Enable1PC indicates whether to enable the one-phase commit feature. + Enable1PC bool + + // GuaranteeLinearizability indicates whether to guarantee linearizability + GuaranteeLinearizability bool + + // AnalyzeVersion indicates how TiDB collect and use analyzed statistics. + AnalyzeVersion int + + // EnableIndexMergeJoin indicates whether to enable index merge join. + EnableIndexMergeJoin bool + + // TrackAggregateMemoryUsage indicates whether to track the memory usage of aggregate function. + TrackAggregateMemoryUsage bool + + // TiDBEnableExchangePartition indicates whether to enable exchange partition + TiDBEnableExchangePartition bool + + // AllowFallbackToTiKV indicates the engine types whose unavailability triggers fallback to TiKV. + // Now we only support TiFlash. + AllowFallbackToTiKV map[kv.StoreType]struct{} +} + +// CheckAndGetTxnScope will return the transaction scope we should use in the current session. +func (s *SessionVars) CheckAndGetTxnScope() string { + if s.InRestrictedSQL { + return oracle.GlobalTxnScope + } + if s.TxnScope.GetVarValue() == oracle.LocalTxnScope { + return s.TxnScope.GetTxnScope() + } + return oracle.GlobalTxnScope } // UseDynamicPartitionPrune indicates whether use new dynamic partition prune. func (s *SessionVars) UseDynamicPartitionPrune() bool { - return PartitionPruneMode(s.PartitionPruneMode.Load()) == DynamicOnly + return PartitionPruneMode(s.PartitionPruneMode.Load()) == Dynamic +} + +// BuildParserConfig generate parser.ParserConfig for initial parser +func (s *SessionVars) BuildParserConfig() parser.ParserConfig { + return parser.ParserConfig{ + EnableWindowFunction: s.EnableWindowFunction, + EnableStrictDoubleTypeCheck: s.EnableStrictDoubleTypeCheck, + } } // PartitionPruneMode presents the prune mode used. type PartitionPruneMode string const ( - // StaticOnly indicates only prune at plan phase. + // Static indicates only prune at plan phase. + Static PartitionPruneMode = "static" + // Dynamic indicates only prune at execute phase. + Dynamic PartitionPruneMode = "dynamic" + + // Don't use out-of-date mode. + + // StaticOnly is out-of-date. StaticOnly PartitionPruneMode = "static-only" - // DynamicOnly indicates only prune at execute phase. + // DynamicOnly is out-of-date. DynamicOnly PartitionPruneMode = "dynamic-only" - // StaticButPrepareDynamic indicates prune at plan phase but collect stats need for dynamic prune. + // StaticButPrepareDynamic is out-of-date. StaticButPrepareDynamic PartitionPruneMode = "static-collect-dynamic" ) // Valid indicate PruneMode is validated. func (p PartitionPruneMode) Valid() bool { switch p { - case StaticOnly, StaticButPrepareDynamic, DynamicOnly: + case Static, Dynamic, StaticOnly, DynamicOnly: return true default: return false } } +// Update updates out-of-date PruneMode. +func (p PartitionPruneMode) Update() PartitionPruneMode { + switch p { + case StaticOnly, StaticButPrepareDynamic: + return Static + case DynamicOnly: + return Dynamic + default: + return p + } +} + // PreparedParams contains the parameters of the current prepared statement when executing it. type PreparedParams []types.Datum @@ -755,7 +897,7 @@ func (pps PreparedParams) String() string { // ConnectionInfo present connection used by audit. type ConnectionInfo struct { - ConnectionID uint32 + ConnectionID uint64 ConnectionType string Host string ClientIP string @@ -777,7 +919,9 @@ type ConnectionInfo struct { func NewSessionVars() *SessionVars { vars := &SessionVars{ Users: make(map[string]types.Datum), + UserVarTypes: make(map[string]*types.FieldType), systems: make(map[string]string), + stmtVars: make(map[string]string), PreparedStmts: make(map[uint32]interface{}), PreparedStmtNameToID: make(map[string]uint32), PreparedParams: make([]types.Datum, 0, 10), @@ -791,11 +935,14 @@ func NewSessionVars() *SessionVars { StmtCtx: new(stmtctx.StatementContext), AllowAggPushDown: false, AllowBCJ: false, + BroadcastJoinThresholdSize: DefBroadcastJoinThresholdSize, + BroadcastJoinThresholdCount: DefBroadcastJoinThresholdSize, OptimizerSelectivityLevel: DefTiDBOptimizerSelectivityLevel, RetryLimit: DefTiDBRetryLimit, DisableTxnAutoRetry: DefTiDBDisableTxnAutoRetry, DDLReorgPriority: kv.PriorityLow, allowInSubqToJoinAndAgg: DefOptInSubqToJoinAndAgg, + preferRangeScan: DefOptPreferRangeScan, CorrelationThreshold: DefOptCorrelationThreshold, CorrelationExpFactor: DefOptCorrelationExpFactor, CPUFactor: DefOptCPUFactor, @@ -822,6 +969,7 @@ func NewSessionVars() *SessionVars { AllowRemoveAutoInc: DefTiDBAllowRemoveAutoInc, UsePlanBaselines: DefTiDBUsePlanBaselines, EvolvePlanBaselines: DefTiDBEvolvePlanBaselines, + EnableExtendedStats: false, IsolationReadEngines: make(map[kv.StoreType]struct{}), LockWaitTimeout: DefInnodbLockWaitTimeout * 1000, MetricSchemaStep: DefTiDBMetricSchemaStep, @@ -830,13 +978,27 @@ func NewSessionVars() *SessionVars { WindowingUseHighPrecision: true, PrevFoundInPlanCache: DefTiDBFoundInPlanCache, FoundInPlanCache: DefTiDBFoundInPlanCache, + PrevFoundInBinding: DefTiDBFoundInBinding, + FoundInBinding: DefTiDBFoundInBinding, SelectLimit: math.MaxUint64, AllowAutoRandExplicitInsert: DefTiDBAllowAutoRandExplicitInsert, EnableClusteredIndex: DefTiDBEnableClusteredIndex, EnableParallelApply: DefTiDBEnableParallelApply, ShardAllocateStep: DefTiDBShardAllocateStep, EnableChangeColumnType: DefTiDBChangeColumnType, + EnableChangeMultiSchema: DefTiDBChangeMultiSchema, + EnablePointGetCache: DefTiDBPointGetCache, + EnableAlterPlacement: DefTiDBEnableAlterPlacement, EnableAmendPessimisticTxn: DefTiDBEnableAmendPessimisticTxn, + PartitionPruneMode: *atomic2.NewString(DefTiDBPartitionPruneMode), + TxnScope: oracle.GetTxnScope(), + EnabledRateLimitAction: DefTiDBEnableRateLimitAction, + EnableAsyncCommit: DefTiDBEnableAsyncCommit, + Enable1PC: DefTiDBEnable1PC, + GuaranteeLinearizability: DefTiDBGuaranteeLinearizability, + AnalyzeVersion: DefTiDBAnalyzeVersion, + EnableIndexMergeJoin: DefTiDBEnableIndexMergeJoin, + AllowFallbackToTiKV: make(map[kv.StoreType]struct{}), } vars.KVVars = kv.NewVariables(&vars.Killed) vars.Concurrency = Concurrency{ @@ -849,11 +1011,13 @@ func NewSessionVars() *SessionVars { hashAggPartialConcurrency: DefTiDBHashAggPartialConcurrency, hashAggFinalConcurrency: DefTiDBHashAggFinalConcurrency, windowConcurrency: DefTiDBWindowConcurrency, + mergeJoinConcurrency: DefTiDBMergeJoinConcurrency, + streamAggConcurrency: DefTiDBStreamAggConcurrency, ExecutorConcurrency: DefExecutorConcurrency, } vars.MemQuota = MemQuota{ - MemQuotaQuery: config.GetGlobalConfig().MemQuotaQuery, - NestedLoopJoinCacheCapacity: config.GetGlobalConfig().NestedLoopJoinCacheCapacity, + MemQuotaQuery: config.GetGlobalConfig().MemQuotaQuery, + MemQuotaApplyCache: DefTiDBMemQuotaApplyCache, // The variables below do not take any effect anymore, it's remaining for compatibility. // TODO: remove them in v4.1 @@ -863,7 +1027,6 @@ func NewSessionVars() *SessionVars { MemQuotaTopn: DefTiDBMemQuotaTopn, MemQuotaIndexLookupReader: DefTiDBMemQuotaIndexLookupReader, MemQuotaIndexLookupJoin: DefTiDBMemQuotaIndexLookupJoin, - MemQuotaNestedLoopApply: DefTiDBMemQuotaNestedLoopApply, MemQuotaDistSQL: DefTiDBMemQuotaDistSQL, } vars.BatchSize = BatchSize{ @@ -882,6 +1045,7 @@ func NewSessionVars() *SessionVars { terror.Log(vars.SetSystemVar(TiDBEnableStreaming, enableStreaming)) vars.AllowBatchCop = DefTiDBAllowBatchCop + vars.AllowMPPExecution = DefTiDBAllowMPPExecution var enableChunkRPC string if config.GetGlobalConfig().TiKVClient.EnableChunkRPC { @@ -916,6 +1080,16 @@ func (s *SessionVars) SetAllowInSubqToJoinAndAgg(val bool) { s.allowInSubqToJoinAndAgg = val } +// GetAllowPreferRangeScan get preferRangeScan from SessionVars.preferRangeScan. +func (s *SessionVars) GetAllowPreferRangeScan() bool { + return s.preferRangeScan +} + +// SetAllowPreferRangeScan set SessionVars.preferRangeScan. +func (s *SessionVars) SetAllowPreferRangeScan(val bool) { + s.preferRangeScan = val +} + // GetEnableCascadesPlanner get EnableCascadesPlanner from sql hints and SessionVars.EnableCascadesPlanner. func (s *SessionVars) GetEnableCascadesPlanner() bool { if s.StmtCtx.HasEnableCascadesPlannerHint { @@ -1025,6 +1199,15 @@ func (s *SessionVars) GetStatusFlag(flag uint16) bool { return s.Status&flag > 0 } +// SetInTxn sets whether the session is in transaction. +// It also updates the IsExplicit flag in TxnCtx if val is true. +func (s *SessionVars) SetInTxn(val bool) { + s.SetStatusFlag(mysql.ServerStatusInTrans, val) + if val { + s.TxnCtx.IsExplicit = true + } +} + // InTxn returns if the session is in transaction. func (s *SessionVars) InTxn() bool { return s.GetStatusFlag(mysql.ServerStatusInTrans) @@ -1035,10 +1218,10 @@ func (s *SessionVars) IsAutocommit() bool { return s.GetStatusFlag(mysql.ServerStatusAutocommit) } -// IsReadConsistencyTxn if true it means the transaction is an read consistency (read committed) transaction. -func (s *SessionVars) IsReadConsistencyTxn() bool { +// IsIsolation if true it means the transaction is at that isolation level. +func (s *SessionVars) IsIsolation(isolation string) bool { if s.TxnCtx.Isolation != "" { - return s.TxnCtx.Isolation == ast.ReadCommitted + return s.TxnCtx.Isolation == isolation } if s.txnIsolationLevelOneShot.state == oneShotUse { s.TxnCtx.Isolation = s.txnIsolationLevelOneShot.value @@ -1046,7 +1229,7 @@ func (s *SessionVars) IsReadConsistencyTxn() bool { if s.TxnCtx.Isolation == "" { s.TxnCtx.Isolation, _ = s.GetSystemVar(TxnIsolation) } - return s.TxnCtx.Isolation == ast.ReadCommitted + return s.TxnCtx.Isolation == isolation } // SetTxnIsolationLevelOneShotStateForNextTxn sets the txnIsolationLevelOneShot.state for next transaction. @@ -1064,7 +1247,7 @@ func (s *SessionVars) SetTxnIsolationLevelOneShotStateForNextTxn() { // IsPessimisticReadConsistency if true it means the statement is in an read consistency pessimistic transaction. func (s *SessionVars) IsPessimisticReadConsistency() bool { - return s.TxnCtx.IsPessimistic && s.IsReadConsistencyTxn() + return s.TxnCtx.IsPessimistic && s.IsIsolation(ast.ReadCommitted) } // GetNextPreparedStmtID generates and returns the next session scope prepared statement id. @@ -1089,6 +1272,12 @@ func (s *SessionVars) GetSystemVar(name string) (string, bool) { } else if name == ErrorCount { return strconv.Itoa(int(s.SysErrorCount)), true } + if name == TiDBSlowLogMasking { + name = TiDBRedactLog + } + if val, ok := s.stmtVars[name]; ok { + return val, ok + } val, ok := s.systems[name] return val, ok } @@ -1115,9 +1304,9 @@ func (s *SessionVars) AddPreparedStmt(stmtID uint32, stmt interface{}) error { if err != nil { maxPreparedStmtCount = DefMaxPreparedStmtCount } - newPreparedStmtCount := atomic.AddInt64(&preparedStmtCount, 1) + newPreparedStmtCount := atomic.AddInt64(&PreparedStmtCount, 1) if maxPreparedStmtCount >= 0 && newPreparedStmtCount > maxPreparedStmtCount { - atomic.AddInt64(&preparedStmtCount, -1) + atomic.AddInt64(&PreparedStmtCount, -1) return ErrMaxPreparedStmtCountReached.GenWithStackByArgs(maxPreparedStmtCount) } metrics.PreparedStmtGauge.Set(float64(newPreparedStmtCount)) @@ -1133,7 +1322,7 @@ func (s *SessionVars) RemovePreparedStmt(stmtID uint32) { return } delete(s.PreparedStmts, stmtID) - afterMinus := atomic.AddInt64(&preparedStmtCount, -1) + afterMinus := atomic.AddInt64(&PreparedStmtCount, -1) metrics.PreparedStmtGauge.Set(float64(afterMinus)) } @@ -1143,10 +1332,21 @@ func (s *SessionVars) WithdrawAllPreparedStmt() { if psCount == 0 { return } - afterMinus := atomic.AddInt64(&preparedStmtCount, -int64(psCount)) + afterMinus := atomic.AddInt64(&PreparedStmtCount, -int64(psCount)) metrics.PreparedStmtGauge.Set(float64(afterMinus)) } +// SetStmtVar sets the value of a system variable temporarily +func (s *SessionVars) SetStmtVar(name string, val string) error { + s.stmtVars[name] = val + return nil +} + +// ClearStmtVars clear temporarily system variables. +func (s *SessionVars) ClearStmtVars() { + s.stmtVars = make(map[string]string) +} + // SetSystemVar sets the value of a system variable. func (s *SessionVars) SetSystemVar(name string, val string) error { switch name { @@ -1161,7 +1361,7 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { if !TiDBOptOn(skipIsolationLevelCheck) || err != nil { return returnErr } - //SET TRANSACTION ISOLATION LEVEL will affect two internal variables: + // SET TRANSACTION ISOLATION LEVEL will affect two internal variables: // 1. tx_isolation // 2. transaction_isolation // The following if condition is used to deduplicate two same warnings. @@ -1196,7 +1396,7 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { isAutocommit := TiDBOptOn(val) s.SetStatusFlag(mysql.ServerStatusAutocommit, isAutocommit) if isAutocommit { - s.SetStatusFlag(mysql.ServerStatusInTrans, false) + s.SetInTxn(false) } case AutoIncrementIncrement: // AutoIncrementIncrement is valid in [1, 65535]. @@ -1220,12 +1420,18 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.AllowAggPushDown = TiDBOptOn(val) case TiDBOptBCJ: s.AllowBCJ = TiDBOptOn(val) + case TiDBBCJThresholdSize: + s.BroadcastJoinThresholdSize = tidbOptInt64(val, DefBroadcastJoinThresholdSize) + case TiDBBCJThresholdCount: + s.BroadcastJoinThresholdCount = tidbOptInt64(val, DefBroadcastJoinThresholdCount) case TiDBOptDistinctAggPushDown: s.AllowDistinctAggPushDown = TiDBOptOn(val) case TiDBOptWriteRowID: s.AllowWriteRowID = TiDBOptOn(val) case TiDBOptInSubqToJoinAndAgg: s.SetAllowInSubqToJoinAndAgg(TiDBOptOn(val)) + case TiDBOptPreferRangeScan: + s.SetAllowPreferRangeScan(TiDBOptOn(val)) case TiDBOptCorrelationThreshold: s.CorrelationThreshold = tidbOptFloat64(val, DefOptCorrelationThreshold) case TiDBOptCorrelationExpFactor: @@ -1258,6 +1464,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.IndexJoinBatchSize = tidbOptPositiveInt32(val, DefIndexJoinBatchSize) case TiDBAllowBatchCop: s.AllowBatchCop = int(tidbOptInt64(val, DefTiDBAllowBatchCop)) + case TiDBAllowMPPExecution: + s.AllowMPPExecution = TiDBOptOn(val) case TiDBIndexLookupSize: s.IndexLookupSize = tidbOptPositiveInt32(val, DefIndexLookupSize) case TiDBHashJoinConcurrency: @@ -1270,6 +1478,10 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.hashAggFinalConcurrency = tidbOptPositiveInt32(val, ConcurrencyUnset) case TiDBWindowConcurrency: s.windowConcurrency = tidbOptPositiveInt32(val, ConcurrencyUnset) + case TiDBMergeJoinConcurrency: + s.mergeJoinConcurrency = tidbOptPositiveInt32(val, ConcurrencyUnset) + case TiDBStreamAggConcurrency: + s.streamAggConcurrency = tidbOptPositiveInt32(val, ConcurrencyUnset) case TiDBDistSQLScanConcurrency: s.distSQLScanConcurrency = tidbOptPositiveInt32(val, DefDistSQLScanConcurrency) case TiDBIndexSerialScanConcurrency: @@ -1290,16 +1502,14 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.BatchCommit = TiDBOptOn(val) case TiDBDMLBatchSize: s.DMLBatchSize = int(tidbOptInt64(val, DefOptCorrelationExpFactor)) - case TiDBCurrentTS, TiDBLastTxnInfo, TiDBConfig: - return ErrReadOnly case TiDBMaxChunkSize: s.MaxChunkSize = tidbOptPositiveInt32(val, DefMaxChunkSize) case TiDBInitChunkSize: s.InitChunkSize = tidbOptPositiveInt32(val, DefInitChunkSize) case TIDBMemQuotaQuery: s.MemQuotaQuery = tidbOptInt64(val, config.GetGlobalConfig().MemQuotaQuery) - case TIDBNestedLoopJoinCacheCapacity: - s.NestedLoopJoinCacheCapacity = tidbOptInt64(val, config.GetGlobalConfig().NestedLoopJoinCacheCapacity) + case TiDBMemQuotaApplyCache: + s.MemQuotaApplyCache = tidbOptInt64(val, DefTiDBMemQuotaApplyCache) case TIDBMemQuotaHashJoin: s.MemQuotaHashJoin = tidbOptInt64(val, DefTiDBMemQuotaHashJoin) case TIDBMemQuotaMergeJoin: @@ -1312,10 +1522,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.MemQuotaIndexLookupReader = tidbOptInt64(val, DefTiDBMemQuotaIndexLookupReader) case TIDBMemQuotaIndexLookupJoin: s.MemQuotaIndexLookupJoin = tidbOptInt64(val, DefTiDBMemQuotaIndexLookupJoin) - case TIDBMemQuotaNestedLoopApply: - s.MemQuotaNestedLoopApply = tidbOptInt64(val, DefTiDBMemQuotaNestedLoopApply) case TiDBGeneralLog: - atomic.StoreUint32(&ProcessGeneralLog, uint32(tidbOptPositiveInt32(val, DefTiDBGeneralLog))) + ProcessGeneralLog.Store(TiDBOptOn(val)) case TiDBPProfSQLCPU: EnablePProfSQLCPU.Store(uint32(tidbOptPositiveInt32(val, DefTiDBPProfSQLCPU)) > 0) case TiDBDDLSlowOprThreshold: @@ -1334,6 +1542,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.OptimizerSelectivityLevel = tidbOptPositiveInt32(val, DefTiDBOptimizerSelectivityLevel) case TiDBEnableTablePartition: s.EnableTablePartition = val + case TiDBEnableListTablePartition: + s.EnableListTablePartition = TiDBOptOn(val) case TiDBDDLReorgPriority: s.setDDLReorgPriority(val) case TiDBForcePriority: @@ -1342,6 +1552,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.EnableRadixJoin = TiDBOptOn(val) case TiDBEnableWindowFunction: s.EnableWindowFunction = TiDBOptOn(val) + case TiDBEnableStrictDoubleTypeCheck: + s.EnableStrictDoubleTypeCheck = TiDBOptOn(val) case TiDBEnableVectorizedExpression: s.EnableVectorizedExpression = TiDBOptOn(val) case TiDBOptJoinReorderThreshold: @@ -1388,6 +1600,8 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.UsePlanBaselines = TiDBOptOn(val) case TiDBEvolvePlanBaselines: s.EvolvePlanBaselines = TiDBOptOn(val) + case TiDBEnableExtendedStats: + s.EnableExtendedStats = TiDBOptOn(val) case TiDBIsolationReadEngines: s.IsolationReadEngines = make(map[kv.StoreType]struct{}) for _, engine := range strings.Split(val, ",") { @@ -1407,27 +1621,52 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { case TiDBMetricSchemaRangeDuration: s.MetricSchemaRangeDuration = tidbOptInt64(val, DefTiDBMetricSchemaRangeDuration) case CollationConnection, CollationDatabase, CollationServer: - if _, err := collate.GetCollationByName(val); err != nil { - var ok bool - var charsetVal string - var err2 error - if name == CollationConnection { - charsetVal, ok = s.systems[CharacterSetConnection] - } else if name == CollationDatabase { - charsetVal, ok = s.systems[CharsetDatabase] - } else { - // CollationServer - charsetVal, ok = s.systems[CharacterSetServer] - } - if !ok { + coll, err := collate.GetCollationByName(val) + if err != nil { + logutil.BgLogger().Warn(err.Error()) + coll, err = collate.GetCollationByName(charset.CollationUTF8MB4) + if err != nil { return err } - val, err2 = charset.GetDefaultCollation(charsetVal) - if err2 != nil { - return err2 + } + switch name { + case CollationConnection: + s.systems[CollationConnection] = coll.Name + s.systems[CharacterSetConnection] = coll.CharsetName + case CollationDatabase: + s.systems[CollationDatabase] = coll.Name + s.systems[CharsetDatabase] = coll.CharsetName + case CollationServer: + s.systems[CollationServer] = coll.Name + s.systems[CharacterSetServer] = coll.CharsetName + } + val = coll.Name + case CharacterSetConnection, CharacterSetClient, CharacterSetResults, + CharacterSetServer, CharsetDatabase, CharacterSetFilesystem: + if val == "" { + if name == CharacterSetResults { + s.systems[CharacterSetResults] = "" + return nil } + return ErrWrongValueForVar.GenWithStackByArgs(name, "NULL") + } + cht, coll, err := charset.GetCharsetInfo(val) + if err != nil { logutil.BgLogger().Warn(err.Error()) + cht, coll = charset.GetDefaultCharsetAndCollate() + } + switch name { + case CharacterSetConnection: + s.systems[CollationConnection] = coll + s.systems[CharacterSetConnection] = cht + case CharsetDatabase: + s.systems[CollationDatabase] = coll + s.systems[CharsetDatabase] = cht + case CharacterSetServer: + s.systems[CollationServer] = coll + s.systems[CharacterSetServer] = cht } + val = cht case TiDBSlowLogThreshold: atomic.StoreUint64(&config.GetGlobalConfig().Log.SlowThreshold, uint64(tidbOptInt64(val, logutil.DefaultSlowThreshold))) case TiDBRecordPlanInSlowLog: @@ -1440,8 +1679,16 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { config.GetGlobalConfig().CheckMb4ValueInUTF8 = TiDBOptOn(val) case TiDBFoundInPlanCache: s.FoundInPlanCache = TiDBOptOn(val) + case TiDBFoundInBinding: + s.FoundInBinding = TiDBOptOn(val) case TiDBEnableCollectExecutionInfo: - config.GetGlobalConfig().EnableCollectExecutionInfo = TiDBOptOn(val) + oldConfig := config.GetGlobalConfig() + newValue := TiDBOptOn(val) + if oldConfig.EnableCollectExecutionInfo != newValue { + newConfig := *oldConfig + newConfig.EnableCollectExecutionInfo = newValue + config.StoreGlobalConfig(&newConfig) + } case SQLSelectLimit: result, err := strconv.ParseUint(val, 10, 64) if err != nil { @@ -1456,14 +1703,61 @@ func (s *SessionVars) SetSystemVar(name string, val string) error { s.PartitionPruneMode.Store(strings.ToLower(strings.TrimSpace(val))) case TiDBEnableParallelApply: s.EnableParallelApply = TiDBOptOn(val) - case TiDBSlowLogMasking, TiDBRedactLog: - config.SetRedactLog(TiDBOptOn(val)) + case TiDBSlowLogMasking: + // TiDBSlowLogMasking is deprecated and a alias of TiDBRedactLog. + return s.SetSystemVar(TiDBRedactLog, val) + case TiDBRedactLog: + s.EnableRedactLog = TiDBOptOn(val) + errors.RedactLogEnabled.Store(s.EnableRedactLog) case TiDBShardAllocateStep: s.ShardAllocateStep = tidbOptInt64(val, DefTiDBShardAllocateStep) case TiDBEnableChangeColumnType: s.EnableChangeColumnType = TiDBOptOn(val) + case TiDBEnableChangeMultiSchema: + s.EnableChangeMultiSchema = TiDBOptOn(val) + case TiDBEnablePointGetCache: + s.EnablePointGetCache = TiDBOptOn(val) + case TiDBEnableAlterPlacement: + s.EnableAlterPlacement = TiDBOptOn(val) case TiDBEnableAmendPessimisticTxn: s.EnableAmendPessimisticTxn = TiDBOptOn(val) + case TiDBTxnScope: + switch val { + case oracle.GlobalTxnScope: + s.TxnScope = oracle.NewGlobalTxnScope() + case oracle.LocalTxnScope: + s.TxnScope = oracle.GetTxnScope() + default: + return ErrWrongValueForVar.GenWithStack("@@txn_scope value should be global or local") + } + case TiDBMemoryUsageAlarmRatio: + MemoryUsageAlarmRatio.Store(tidbOptFloat64(val, 0.8)) + case TiDBEnableRateLimitAction: + s.EnabledRateLimitAction = TiDBOptOn(val) + case TiDBEnableAsyncCommit: + s.EnableAsyncCommit = TiDBOptOn(val) + case TiDBEnable1PC: + s.Enable1PC = TiDBOptOn(val) + case TiDBGuaranteeLinearizability: + s.GuaranteeLinearizability = TiDBOptOn(val) + case TiDBAnalyzeVersion: + s.AnalyzeVersion = tidbOptPositiveInt32(val, DefTiDBAnalyzeVersion) + case TiDBEnableIndexMergeJoin: + s.EnableIndexMergeJoin = TiDBOptOn(val) + case TiDBTrackAggregateMemoryUsage: + s.TrackAggregateMemoryUsage = TiDBOptOn(val) + case TiDBMultiStatementMode: + s.MultiStatementMode = TiDBOptMultiStmt(val) + case TiDBEnableExchangePartition: + s.TiDBEnableExchangePartition = TiDBOptOn(val) + case TiDBAllowFallbackToTiKV: + s.AllowFallbackToTiKV = make(map[kv.StoreType]struct{}) + for _, engine := range strings.Split(val, ",") { + switch engine { + case kv.TiFlash.Name(): + s.AllowFallbackToTiKV[kv.TiFlash] = struct{}{} + } + } } s.systems[name] = val return nil @@ -1518,6 +1812,8 @@ func SetLocalSystemVar(name string, val string) { SetDDLReorgBatchSize(int32(tidbOptPositiveInt32(val, DefTiDBDDLReorgBatchSize))) case TiDBDDLErrorCountLimit: SetDDLErrorCountLimit(tidbOptInt64(val, DefTiDBDDLErrorCountLimit)) + case TiDBRowFormatVersion: + SetDDLReorgRowFormat(tidbOptInt64(val, DefTiDBRowFormatV2)) } } @@ -1555,6 +1851,7 @@ type TableDelta struct { Count int64 ColSize map[int64]int64 InitTime time.Time // InitTime is the time that this delta is generated. + TableID int64 } // ConcurrencyUnset means the value the of the concurrency related variable is unset. @@ -1594,11 +1891,21 @@ type Concurrency struct { // windowConcurrency is deprecated, use ExecutorConcurrency instead. windowConcurrency int + // mergeJoinConcurrency is the number of concurrent merge join worker + mergeJoinConcurrency int + + // streamAggConcurrency is the number of concurrent stream aggregation worker. + // streamAggConcurrency is deprecated, use ExecutorConcurrency instead. + streamAggConcurrency int + // indexSerialScanConcurrency is the number of concurrent index serial scan worker. indexSerialScanConcurrency int // ExecutorConcurrency is the number of concurrent worker for all executors. ExecutorConcurrency int + + // SourceAddr is the source address of request. Available in coprocessor ONLY. + SourceAddr net.TCPAddr } // SetIndexLookupConcurrency set the number of concurrent index lookup worker. @@ -1641,6 +1948,16 @@ func (c *Concurrency) SetWindowConcurrency(n int) { c.windowConcurrency = n } +// SetMergeJoinConcurrency set the number of concurrent merge join worker. +func (c *Concurrency) SetMergeJoinConcurrency(n int) { + c.mergeJoinConcurrency = n +} + +// SetStreamAggConcurrency set the number of concurrent stream aggregation worker. +func (c *Concurrency) SetStreamAggConcurrency(n int) { + c.streamAggConcurrency = n +} + // SetIndexSerialScanConcurrency set the number of concurrent index serial scan worker. func (c *Concurrency) SetIndexSerialScanConcurrency(n int) { c.indexSerialScanConcurrency = n @@ -1707,6 +2024,22 @@ func (c *Concurrency) WindowConcurrency() int { return c.ExecutorConcurrency } +// MergeJoinConcurrency return the number of concurrent merge join worker. +func (c *Concurrency) MergeJoinConcurrency() int { + if c.mergeJoinConcurrency != ConcurrencyUnset { + return c.mergeJoinConcurrency + } + return c.ExecutorConcurrency +} + +// StreamAggConcurrency return the number of concurrent stream aggregation worker. +func (c *Concurrency) StreamAggConcurrency() int { + if c.streamAggConcurrency != ConcurrencyUnset { + return c.streamAggConcurrency + } + return c.ExecutorConcurrency +} + // IndexSerialScanConcurrency return the number of concurrent index serial scan worker. // This option is not sync with ExecutorConcurrency since it's used by Analyze table. func (c *Concurrency) IndexSerialScanConcurrency() int { @@ -1722,9 +2055,8 @@ func (c *Concurrency) UnionConcurrency() int { type MemQuota struct { // MemQuotaQuery defines the memory quota for a query. MemQuotaQuery int64 - - // NestedLoopJoinCacheCapacity defines the memory capacity for apply cache. - NestedLoopJoinCacheCapacity int64 + // MemQuotaApplyCache defines the memory capacity for apply cache. + MemQuotaApplyCache int64 // The variables below do not take any effect anymore, it's remaining for compatibility. // TODO: remove them in v4.1 @@ -1740,8 +2072,6 @@ type MemQuota struct { MemQuotaIndexLookupReader int64 // MemQuotaIndexLookupJoin defines the memory quota for a index lookup join executor. MemQuotaIndexLookupJoin int64 - // MemQuotaNestedLoopApply defines the memory quota for a nested loop apply executor. - MemQuotaNestedLoopApply int64 // MemQuotaDistSQL defines the memory quota for all operators in DistSQL layer like co-processor and selectResult. MemQuotaDistSQL int64 } @@ -1838,6 +2168,8 @@ const ( SlowLogPrepared = "Prepared" // SlowLogPlanFromCache is used to indicate whether this plan is from plan cache. SlowLogPlanFromCache = "Plan_from_cache" + // SlowLogPlanFromBinding is used to indicate whether this plan is matched with the hints in the binding. + SlowLogPlanFromBinding = "Plan_from_binding" // SlowLogHasMoreResults is used to indicate whether this sql has more following results. SlowLogHasMoreResults = "Has_more_results" // SlowLogSucc is used to indicate whether this sql execute successfully. @@ -1866,6 +2198,8 @@ const ( SlowLogExecRetryCount = "Exec_retry_count" // SlowLogExecRetryTime is the execution retry time. SlowLogExecRetryTime = "Exec_retry_time" + // SlowLogBackoffDetail is the detail of backoff. + SlowLogBackoffDetail = "Backoff_Detail" ) // SlowQueryLogItems is a collection of items that should be included in the @@ -1888,6 +2222,7 @@ type SlowQueryLogItems struct { Succ bool Prepared bool PlanFromCache bool + PlanFromBinding bool HasMoreResults bool PrevStmt string Plan string @@ -2055,6 +2390,7 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { writeSlowLogItem(&buf, SlowLogPrepared, strconv.FormatBool(logItems.Prepared)) writeSlowLogItem(&buf, SlowLogPlanFromCache, strconv.FormatBool(logItems.PlanFromCache)) + writeSlowLogItem(&buf, SlowLogPlanFromBinding, strconv.FormatBool(logItems.PlanFromBinding)) writeSlowLogItem(&buf, SlowLogHasMoreResults, strconv.FormatBool(logItems.HasMoreResults)) writeSlowLogItem(&buf, SlowLogKVTotal, strconv.FormatFloat(logItems.KVTotal.Seconds(), 'f', -1, 64)) writeSlowLogItem(&buf, SlowLogPDTotal, strconv.FormatFloat(logItems.PDTotal.Seconds(), 'f', -1, 64)) @@ -2088,3 +2424,11 @@ func (s *SessionVars) SlowLogFormat(logItems *SlowQueryLogItems) string { func writeSlowLogItem(buf *bytes.Buffer, key, value string) { buf.WriteString(SlowLogRowPrefixStr + key + SlowLogSpaceMarkStr + value + "\n") } + +// QueryInfo represents the information of last executed query. It's used to expose information for test purpose. +type QueryInfo struct { + TxnScope string `json:"txn_scope"` + StartTS uint64 `json:"start_ts"` + ForUpdateTS uint64 `json:"for_update_ts"` + ErrMsg string `json:"error,omitempty"` +} diff --git a/sessionctx/variable/session_test.go b/sessionctx/variable/session_test.go index 7ab9927005305..ccd60b2bfc38b 100644 --- a/sessionctx/variable/session_test.go +++ b/sessionctx/variable/session_test.go @@ -53,7 +53,7 @@ func (*testSessionSuite) TestSetSystemVariable(c *C) { {variable.TIDBMemQuotaTopn, "1024", false}, {variable.TIDBMemQuotaIndexLookupReader, "1024", false}, {variable.TIDBMemQuotaIndexLookupJoin, "1024", false}, - {variable.TIDBMemQuotaNestedLoopApply, "1024", false}, + {variable.TiDBMemQuotaApplyCache, "1024", false}, {variable.TiDBEnableStmtSummary, "1", false}, } for _, t := range tests { @@ -136,12 +136,16 @@ func (*testSessionSuite) TestSlowLogFormat(c *C) { txnTS := uint64(406649736972468225) costTime := time.Second execDetail := execdetails.ExecDetails{ - ProcessTime: time.Second * time.Duration(2), - WaitTime: time.Minute, - BackoffTime: time.Millisecond, - RequestCount: 2, - TotalKeys: 10000, - ProcessedKeys: 20001, + BackoffTime: time.Millisecond, + RequestCount: 2, + ScanDetail: &execdetails.ScanDetail{ + ProcessedKeys: 20001, + TotalKeys: 10000, + }, + TimeDetail: execdetails.TimeDetail{ + ProcessTime: time.Second * time.Duration(2), + WaitTime: time.Minute, + }, } statsInfos := make(map[string]uint64) statsInfos["t1"] = 0 @@ -185,11 +189,11 @@ func (*testSessionSuite) TestSlowLogFormat(c *C) { # Rewrite_time: 0.000000003 Preproc_subqueries: 2 Preproc_subqueries_time: 0.000000002 # Optimize_time: 0.00000001 # Wait_TS: 0.000000003 -# Process_time: 2 Wait_time: 60 Backoff_time: 0.001 Request_count: 2 Total_keys: 10000 Process_keys: 20001 +# Process_time: 2 Wait_time: 60 Backoff_time: 0.001 Request_count: 2 Process_keys: 20001 Total_keys: 10000 # DB: test # Index_names: [t1:a,t2:b] # Is_internal: true -# Digest: f94c76d7fa8f60e438118752bfbfb71fe9e1934888ac415ddd8625b121af124c +# Digest: 01d00e6e93b28184beae487ac05841145d2a2f6a7b16de32a763bed27967e83d # Stats: t1:pseudo # Num_cop_tasks: 10 # Cop_proc_avg: 1 Cop_proc_p90: 2 Cop_proc_max: 3 Cop_proc_addr: 10.6.131.78 @@ -201,6 +205,7 @@ func (*testSessionSuite) TestSlowLogFormat(c *C) { # Disk_max: 6666 # Prepared: true # Plan_from_cache: true +# Plan_from_binding: true # Has_more_results: true # KV_total: 10 # PD_total: 11 @@ -226,6 +231,7 @@ func (*testSessionSuite) TestSlowLogFormat(c *C) { DiskMax: diskMax, Prepared: true, PlanFromCache: true, + PlanFromBinding: true, HasMoreResults: true, KVTotal: 10 * time.Second, PDTotal: 11 * time.Second, diff --git a/sessionctx/variable/sysvar.go b/sessionctx/variable/sysvar.go index 4cbaaa27910af..c8aae167e6b34 100644 --- a/sessionctx/variable/sysvar.go +++ b/sessionctx/variable/sysvar.go @@ -14,17 +14,26 @@ package variable import ( + "fmt" "math" "strconv" "strings" "sync" "sync/atomic" + "time" + "github.com/cznic/mathutil" + "github.com/pingcap/errors" + "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/versioninfo" + atomic2 "go.uber.org/atomic" ) // ScopeFlag is for system variable whether can be changed in global/session dynamically or not. @@ -41,53 +50,317 @@ const ( // ScopeSession means the system variable can only be changed in current session. ScopeSession ScopeFlag = 1 << 1 - // TypeUnknown for not yet defined - TypeUnknown TypeFlag = 0 + // TypeStr is the default + TypeStr TypeFlag = 0 // TypeBool for boolean TypeBool TypeFlag = 1 // TypeInt for integer TypeInt TypeFlag = 2 - // TypeLong for Long - TypeLong TypeFlag = 3 - // TypeLongLong for LongLong - TypeLongLong TypeFlag = 4 - // TypeStr for String - TypeStr TypeFlag = 5 // TypeEnum for Enum - TypeEnum TypeFlag = 6 - // TypeSet for Set - TypeSet TypeFlag = 7 - // TypeDouble for Double - TypeDouble TypeFlag = 8 + TypeEnum TypeFlag = 3 + // TypeFloat for Double + TypeFloat TypeFlag = 4 // TypeUnsigned for Unsigned integer - TypeUnsigned TypeFlag = 9 + TypeUnsigned TypeFlag = 5 + // TypeTime for time of day (a TiDB extension) + TypeTime TypeFlag = 6 + // TypeDuration for a golang duration (a TiDB extension) + TypeDuration TypeFlag = 7 + + // BoolOff is the canonical string representation of a boolean false. + BoolOff = "OFF" + // BoolOn is the canonical string representation of a boolean true. + BoolOn = "ON" + // On is the canonical string for ON + On = "ON" + + // Off is the canonical string for OFF + Off = "OFF" + + // Warn means return warnings + Warn = "WARN" ) // SysVar is for system variable. type SysVar struct { // Scope is for whether can be changed or not Scope ScopeFlag - // Name is the variable name. Name string - // Value is the variable value. Value string - // Type is the MySQL type (optional) Type TypeFlag - // MinValue will automatically be validated when specified (optional) MinValue int64 - // MaxValue will automatically be validated when specified (optional) MaxValue uint64 - // AutoConvertNegativeBool applies to boolean types (optional) AutoConvertNegativeBool bool - // AutoConvertOutOfRange applies to int and unsigned types. AutoConvertOutOfRange bool + // ReadOnly applies to all types + ReadOnly bool + // PossibleValues applies to ENUM type + PossibleValues []string + // AllowEmpty is a special TiDB behavior which means "read value from config" (do not use) + AllowEmpty bool + // AllowEmptyAll is a special behavior that only applies to TiDBCapturePlanBaseline, TiDBTxnMode (do not use) + AllowEmptyAll bool + // AllowAutoValue means that the special value "-1" is permitted, even when outside of range. + AllowAutoValue bool + // Validation is a callback after the type validation has been performed + Validation func(*SessionVars, string, string, ScopeFlag) (string, error) + // IsHintUpdatable indicate whether it's updatable via SET_VAR() hint (optional) + IsHintUpdatable bool +} + +// ValidateFromType provides automatic validation based on the SysVar's type +func (sv *SysVar) ValidateFromType(vars *SessionVars, value string, scope ScopeFlag) (string, error) { + // Some sysvars are read-only. Attempting to set should always fail. + if sv.ReadOnly || sv.Scope == ScopeNone { + return value, ErrIncorrectScope.GenWithStackByArgs(sv.Name, "read only") + } + // The string "DEFAULT" is a special keyword in MySQL, which restores + // the compiled sysvar value. In which case we can skip further validation. + if strings.EqualFold(value, "DEFAULT") { + return sv.Value, nil + } + // Some sysvars in TiDB have a special behavior where the empty string means + // "use the config file value". This needs to be cleaned up once the behavior + // for instance variables is determined. + if value == "" && ((sv.AllowEmpty && scope == ScopeSession) || sv.AllowEmptyAll) { + return value, nil + } + // Provide validation using the SysVar struct + switch sv.Type { + case TypeUnsigned: + return sv.checkUInt64SystemVar(value, vars) + case TypeInt: + return sv.checkInt64SystemVar(value, vars) + case TypeBool: + return sv.checkBoolSystemVar(value, vars) + case TypeFloat: + return sv.checkFloatSystemVar(value, vars) + case TypeEnum: + return sv.checkEnumSystemVar(value, vars) + case TypeTime: + return sv.checkTimeSystemVar(value, vars) + case TypeDuration: + return sv.checkDurationSystemVar(value, vars) + } + return value, nil // typeString +} + +const ( + localDayTimeFormat = "15:04" + // FullDayTimeFormat is the full format of analyze start time and end time. + FullDayTimeFormat = "15:04 -0700" +) + +func (sv *SysVar) checkTimeSystemVar(value string, vars *SessionVars) (string, error) { + var t time.Time + var err error + if len(value) <= len(localDayTimeFormat) { + t, err = time.ParseInLocation(localDayTimeFormat, value, vars.TimeZone) + } else { + t, err = time.ParseInLocation(FullDayTimeFormat, value, vars.TimeZone) + } + if err != nil { + return "", err + } + return t.Format(FullDayTimeFormat), nil +} + +func (sv *SysVar) checkDurationSystemVar(value string, vars *SessionVars) (string, error) { + d, err := time.ParseDuration(value) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + // Check for min/max violations + if int64(d) < sv.MinValue { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if uint64(d) > sv.MaxValue { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + // return a string representation of the duration + return d.String(), nil +} + +func (sv *SysVar) checkUInt64SystemVar(value string, vars *SessionVars) (string, error) { + if sv.AllowAutoValue && value == "-1" { + return value, nil + } + // There are two types of validation behaviors for integer values. The default + // is to return an error saying the value is out of range. For MySQL compatibility, some + // values prefer convert the value to the min/max and return a warning. + if !sv.AutoConvertOutOfRange { + return sv.checkUint64SystemVarWithError(value) + } + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if value[0] == '-' { + _, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + val, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < uint64(sv.MinValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + if val > sv.MaxValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MaxValue), nil + } + return value, nil +} + +func (sv *SysVar) checkInt64SystemVar(value string, vars *SessionVars) (string, error) { + if sv.AllowAutoValue && value == "-1" { + return value, nil + } + // There are two types of validation behaviors for integer values. The default + // is to return an error saying the value is out of range. For MySQL compatibility, some + // values prefer convert the value to the min/max and return a warning. + if !sv.AutoConvertOutOfRange { + return sv.checkInt64SystemVarWithError(value) + } + val, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < sv.MinValue { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MinValue), nil + } + if val > int64(sv.MaxValue) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(sv.Name, value)) + return fmt.Sprintf("%d", sv.MaxValue), nil + } + return value, nil +} + +func (sv *SysVar) checkEnumSystemVar(value string, vars *SessionVars) (string, error) { + // The value could be either a string or the ordinal position in the PossibleValues. + // This allows for the behavior 0 = OFF, 1 = ON, 2 = DEMAND etc. + var iStr string + for i, v := range sv.PossibleValues { + iStr = fmt.Sprintf("%d", i) + if strings.EqualFold(value, v) || strings.EqualFold(value, iStr) { + return v, nil + } + } + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) +} + +func (sv *SysVar) checkFloatSystemVar(value string, vars *SessionVars) (string, error) { + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + val, err := strconv.ParseFloat(value, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < float64(sv.MinValue) || val > float64(sv.MaxValue) { + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) + } + return value, nil +} + +func (sv *SysVar) checkBoolSystemVar(value string, vars *SessionVars) (string, error) { + if strings.EqualFold(value, "ON") { + return BoolOn, nil + } else if strings.EqualFold(value, "OFF") { + return BoolOff, nil + } + val, err := strconv.ParseInt(value, 10, 64) + if err == nil { + // There are two types of conversion rules for integer values. + // The default only allows 0 || 1, but a subset of values convert any + // negative integer to 1. + if !sv.AutoConvertNegativeBool { + if val == 0 { + return BoolOff, nil + } else if val == 1 { + return BoolOn, nil + } + } else { + if val == 1 || val < 0 { + return BoolOn, nil + } else if val == 0 { + return BoolOff, nil + } + } + } + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) +} + +func (sv *SysVar) checkUint64SystemVarWithError(value string) (string, error) { + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if value[0] == '-' { + // // in strict it expects the error WrongValue, but in non-strict it returns WrongType + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) + } + val, err := strconv.ParseUint(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < uint64(sv.MinValue) || val > sv.MaxValue { + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) + } + return value, nil +} + +func (sv *SysVar) checkInt64SystemVarWithError(value string) (string, error) { + if len(value) == 0 { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + val, err := strconv.ParseInt(value, 10, 64) + if err != nil { + return value, ErrWrongTypeForVar.GenWithStackByArgs(sv.Name) + } + if val < sv.MinValue || val > int64(sv.MaxValue) { + return value, ErrWrongValueForVar.GenWithStackByArgs(sv.Name, value) + } + return value, nil +} + +// ValidateFromHook calls the anonymous function on the sysvar if it exists. +func (sv *SysVar) ValidateFromHook(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if sv.Validation != nil { + return sv.Validation(vars, normalizedValue, originalValue, scope) + } + return normalizedValue, nil +} + +// GetNativeValType attempts to convert the val to the approx MySQL non-string type +func (sv *SysVar) GetNativeValType(val string) (types.Datum, byte, uint) { + switch sv.Type { + case TypeUnsigned: + u, err := strconv.ParseUint(val, 10, 64) + if err != nil { + u = 0 + } + return types.NewUintDatum(u), mysql.TypeLonglong, mysql.UnsignedFlag + case TypeBool: + optVal := int64(0) // OFF + if TiDBOptOn(val) { + optVal = 1 + } + return types.NewIntDatum(optVal), mysql.TypeLong, 0 + } + return types.NewStringDatum(val), mysql.TypeVarString, 0 } var sysVars map[string]*SysVar @@ -101,6 +374,15 @@ func RegisterSysVar(sv *SysVar) { sysVarsLock.Unlock() } +// UnregisterSysVar removes a sysvar from the SysVars list +// currently only used in tests. +func UnregisterSysVar(name string) { + name = strings.ToLower(name) + sysVarsLock.Lock() + delete(sysVars, name) + sysVarsLock.Unlock() +} + // GetSysVar returns sys var info for name as key. func GetSysVar(name string) *SysVar { name = strings.ToLower(name) @@ -109,7 +391,8 @@ func GetSysVar(name string) *SysVar { return sysVars[name] } -// SetSysVar sets a sysvar. This will not propagate to the cluster, so it should only be used for instance scoped AUTO variables such as system_time_zone. +// SetSysVar sets a sysvar. This will not propagate to the cluster, so it should only be +// used for instance scoped AUTO variables such as system_time_zone. func SetSysVar(name string, value string) { name = strings.ToLower(name) sysVarsLock.Lock() @@ -132,559 +415,226 @@ func init() { for _, v := range defaultSysVars { RegisterSysVar(v) } + for _, v := range noopSysVars { + RegisterSysVar(v) + } initSynonymsSysVariables() } -// BoolToIntStr converts bool to int string, for example "0" or "1". -func BoolToIntStr(b bool) string { +// BoolToOnOff returns the string representation of a bool, i.e. "ON/OFF" +func BoolToOnOff(b bool) string { if b { - return "1" + return BoolOn } - return "0" + return BoolOff } -func boolToOnOff(b bool) string { - if b { - return "on" +func int32ToBoolStr(i int32) string { + if i == 1 { + return BoolOn } - return "off" + return BoolOff } -// BoolToInt32 converts bool to int32 -func BoolToInt32(b bool) int32 { - if b { - return 1 +func checkCharacterValid(normalizedValue string, argName string) (string, error) { + if normalizedValue == "" { + return normalizedValue, errors.Trace(ErrWrongValueForVar.GenWithStackByArgs(argName, "NULL")) + } + cht, _, err := charset.GetCharsetInfo(normalizedValue) + if err != nil { + return normalizedValue, errors.Trace(err) } - return 0 + return cht, nil } -// we only support MySQL now var defaultSysVars = []*SysVar{ - {Scope: ScopeGlobal, Name: "gtid_mode", Value: "OFF", Type: TypeBool}, - {Scope: ScopeGlobal, Name: FlushTime, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "performance_schema_max_mutex_classes", Value: "200"}, - {Scope: ScopeGlobal | ScopeSession, Name: LowPriorityUpdates, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: SessionTrackGtids, Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_max_rows", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_option", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: OldPasswords, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 2, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "innodb_version", Value: "5.6.25"}, {Scope: ScopeGlobal, Name: MaxConnections, Value: "151", Type: TypeUnsigned, MinValue: 1, MaxValue: 100000, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: BigTables, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "skip_external_locking", Value: "1"}, - {Scope: ScopeNone, Name: "innodb_sync_array_size", Value: "1"}, - {Scope: ScopeSession, Name: "rand_seed2", Value: ""}, - {Scope: ScopeGlobal, Name: ValidatePasswordCheckUserName, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: ValidatePasswordNumberCount, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeSession, Name: "gtid_next", Value: ""}, {Scope: ScopeGlobal | ScopeSession, Name: SQLSelectLimit, Value: "18446744073709551615", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: "ndb_show_foreign_key_mock_tables", Value: ""}, - {Scope: ScopeNone, Name: "multi_range_count", Value: "256"}, {Scope: ScopeGlobal | ScopeSession, Name: DefaultWeekFormat, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 7, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: "binlog_error_action", Value: "IGNORE_ERROR"}, - {Scope: ScopeGlobal | ScopeSession, Name: "default_storage_engine", Value: "InnoDB"}, - {Scope: ScopeNone, Name: "ft_query_expansion_limit", Value: "20"}, - {Scope: ScopeGlobal, Name: MaxConnectErrors, Value: "100", Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: SyncBinlog, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 4294967295, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "max_digest_length", Value: "1024"}, - {Scope: ScopeNone, Name: "innodb_force_load_corrupted", Value: "0"}, - {Scope: ScopeNone, Name: "performance_schema_max_table_handles", Value: "4000"}, - {Scope: ScopeGlobal, Name: InnodbFastShutdown, Value: "1", Type: TypeUnsigned, MinValue: 0, MaxValue: 2, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "ft_max_word_len", Value: "84"}, - {Scope: ScopeGlobal, Name: "log_backward_compatible_user_definitions", Value: ""}, - {Scope: ScopeNone, Name: "lc_messages_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/"}, - {Scope: ScopeGlobal, Name: "ft_boolean_syntax", Value: "+ -><()~*:\"\"&|"}, - {Scope: ScopeGlobal, Name: TableDefinitionCache, Value: "-1", Type: TypeUnsigned, MinValue: 400, MaxValue: 524288, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: SkipNameResolve, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "performance_schema_max_file_handles", Value: "32768"}, - {Scope: ScopeSession, Name: "transaction_allow_batching", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLModeVar, Value: mysql.DefaultSQLMode}, - {Scope: ScopeNone, Name: "performance_schema_max_statement_classes", Value: "168"}, - {Scope: ScopeGlobal, Name: "server_id", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_flushing_avg_loops", Value: "30"}, - {Scope: ScopeGlobal | ScopeSession, Name: TmpTableSize, Value: "16777216", Type: TypeUnsigned, MinValue: 1024, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: "innodb_max_purge_lag", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: "preload_buffer_size", Value: "32768"}, - {Scope: ScopeGlobal, Name: CheckProxyUsers, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "have_query_cache", Value: "YES"}, - {Scope: ScopeGlobal, Name: "innodb_flush_log_at_timeout", Value: "1"}, - {Scope: ScopeGlobal, Name: "innodb_max_undo_log_size", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "range_alloc_block_size", Value: "4096"}, - {Scope: ScopeGlobal, Name: ConnectTimeout, Value: "10", Type: TypeUnsigned, MinValue: 2, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: MaxExecutionTime, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: CollationServer, Value: mysql.DefaultCollationName}, - {Scope: ScopeNone, Name: "have_rtree_keys", Value: "YES"}, - {Scope: ScopeGlobal, Name: "innodb_old_blocks_pct", Value: "37"}, - {Scope: ScopeGlobal, Name: "innodb_file_format", Value: "Antelope"}, - {Scope: ScopeGlobal, Name: "innodb_compression_failure_threshold_pct", Value: "5"}, - {Scope: ScopeNone, Name: "performance_schema_events_waits_history_long_size", Value: "10000"}, - {Scope: ScopeGlobal, Name: "innodb_checksum_algorithm", Value: "innodb"}, - {Scope: ScopeNone, Name: "innodb_ft_sort_pll_degree", Value: "2"}, - {Scope: ScopeNone, Name: "thread_stack", Value: "262144"}, - {Scope: ScopeGlobal, Name: "relay_log_info_repository", Value: "FILE"}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLLogBin, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal, Name: SuperReadOnly, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_delayed_threads", Value: "20"}, - {Scope: ScopeNone, Name: "protocol_version", Value: "10"}, - {Scope: ScopeGlobal | ScopeSession, Name: "new", Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: "myisam_sort_buffer_size", Value: "8388608"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_offset", Value: "-1"}, - {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpAtShutdown, Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLNotes, Value: "1"}, - {Scope: ScopeGlobal, Name: InnodbCmpPerIndexEnabled, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: "innodb_ft_server_stopword_table", Value: ""}, - {Scope: ScopeNone, Name: "performance_schema_max_file_instances", Value: "7693"}, - {Scope: ScopeNone, Name: "log_output", Value: "FILE"}, - {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_delay", Value: ""}, - {Scope: ScopeGlobal, Name: "binlog_group_commit_sync_no_delay_count", Value: ""}, - {Scope: ScopeNone, Name: "have_crypt", Value: "YES"}, - {Scope: ScopeGlobal, Name: "innodb_log_write_ahead_size", Value: ""}, - {Scope: ScopeNone, Name: "innodb_log_group_home_dir", Value: "./"}, - {Scope: ScopeNone, Name: "performance_schema_events_statements_history_size", Value: "10"}, - {Scope: ScopeGlobal, Name: GeneralLog, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "validate_password_dictionary_file", Value: ""}, - {Scope: ScopeGlobal, Name: BinlogOrderCommits, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "key_cache_division_limit", Value: "100"}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_insert_delayed_threads", Value: "20"}, - {Scope: ScopeNone, Name: "performance_schema_session_connect_attrs_size", Value: "512"}, - {Scope: ScopeGlobal | ScopeSession, Name: "time_zone", Value: "SYSTEM"}, - {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct", Value: "75"}, - {Scope: ScopeGlobal, Name: InnodbFilePerTable, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: InnodbLogCompressedPages, Value: "1"}, - {Scope: ScopeNone, Name: "skip_networking", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_monitor_reset", Value: ""}, - {Scope: ScopeNone, Name: "have_ssl", Value: "DISABLED"}, - {Scope: ScopeNone, Name: "have_openssl", Value: "DISABLED"}, - {Scope: ScopeNone, Name: "ssl_ca", Value: ""}, - {Scope: ScopeNone, Name: "ssl_cert", Value: ""}, - {Scope: ScopeNone, Name: "ssl_key", Value: ""}, - {Scope: ScopeNone, Name: "ssl_cipher", Value: ""}, - {Scope: ScopeNone, Name: "tls_version", Value: "TLSv1,TLSv1.1,TLSv1.2"}, - {Scope: ScopeNone, Name: "system_time_zone", Value: "CST"}, - {Scope: ScopeGlobal, Name: InnodbPrintAllDeadlocks, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeNone, Name: "innodb_autoinc_lock_mode", Value: "1"}, - {Scope: ScopeGlobal, Name: "key_buffer_size", Value: "8388608"}, - {Scope: ScopeGlobal | ScopeSession, Name: ForeignKeyChecks, Value: "OFF"}, - {Scope: ScopeGlobal, Name: "host_cache_size", Value: "279"}, - {Scope: ScopeGlobal, Name: DelayKeyWrite, Value: "ON"}, - {Scope: ScopeNone, Name: "metadata_locks_cache_size", Value: "1024"}, - {Scope: ScopeNone, Name: "innodb_force_recovery", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_file_format_max", Value: "Antelope"}, - {Scope: ScopeGlobal | ScopeSession, Name: "debug", Value: ""}, - {Scope: ScopeGlobal, Name: "log_warnings", Value: "1"}, - {Scope: ScopeGlobal, Name: OfflineMode, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: InnodbStrictMode, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: "innodb_rollback_segments", Value: "128"}, - {Scope: ScopeGlobal | ScopeSession, Name: "join_buffer_size", Value: "262144"}, - {Scope: ScopeNone, Name: "innodb_mirrored_log_groups", Value: "1"}, - {Scope: ScopeGlobal, Name: "max_binlog_size", Value: "1073741824"}, - {Scope: ScopeGlobal, Name: "concurrent_insert", Value: "AUTO"}, - {Scope: ScopeGlobal, Name: InnodbAdaptiveHashIndex, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: InnodbFtEnableStopword, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: "general_log_file", Value: "/usr/local/mysql/data/localhost.log"}, - {Scope: ScopeGlobal | ScopeSession, Name: InnodbSupportXA, Value: "1"}, - {Scope: ScopeGlobal, Name: "innodb_compression_level", Value: "6"}, - {Scope: ScopeNone, Name: "innodb_file_format_check", Value: "1"}, - {Scope: ScopeNone, Name: "myisam_mmap_size", Value: "18446744073709551615"}, - {Scope: ScopeNone, Name: "innodb_buffer_pool_instances", Value: "8"}, - {Scope: ScopeGlobal | ScopeSession, Name: BlockEncryptionMode, Value: "aes-128-ecb"}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_length_for_sort_data", Value: "1024"}, - {Scope: ScopeNone, Name: "character_set_system", Value: "utf8"}, - {Scope: ScopeGlobal | ScopeSession, Name: InteractiveTimeout, Value: "28800", Type: TypeUnsigned, MinValue: 1, MaxValue: secondsPerYear, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: InnodbOptimizeFullTextOnly, Value: "0"}, - {Scope: ScopeNone, Name: "character_sets_dir", Value: "/usr/local/mysql-5.6.25-osx10.8-x86_64/share/charsets/"}, - {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheType, Value: "OFF"}, - {Scope: ScopeNone, Name: "innodb_rollback_on_timeout", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: "query_alloc_block_size", Value: "8192"}, - {Scope: ScopeGlobal | ScopeSession, Name: InitConnect, Value: ""}, - {Scope: ScopeNone, Name: "have_compress", Value: "YES"}, - {Scope: ScopeNone, Name: "thread_concurrency", Value: "10"}, - {Scope: ScopeGlobal | ScopeSession, Name: "query_prealloc_size", Value: "8192"}, - {Scope: ScopeNone, Name: "relay_log_space_limit", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: MaxUserConnections, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 4294967295, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "performance_schema_max_thread_classes", Value: "50"}, - {Scope: ScopeGlobal, Name: "innodb_api_trx_level", Value: "0"}, - {Scope: ScopeNone, Name: "disconnect_on_expired_password", Value: "1"}, - {Scope: ScopeNone, Name: "performance_schema_max_file_classes", Value: "50"}, - {Scope: ScopeGlobal, Name: "expire_logs_days", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: BinlogRowQueryLogEvents, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "default_password_lifetime", Value: ""}, - {Scope: ScopeNone, Name: "pid_file", Value: "/usr/local/mysql/data/localhost.pid"}, - {Scope: ScopeNone, Name: "innodb_undo_tablespaces", Value: "0"}, - {Scope: ScopeGlobal, Name: InnodbStatusOutputLocks, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeNone, Name: "performance_schema_accounts_size", Value: "100"}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_error_count", Value: "64"}, - {Scope: ScopeGlobal, Name: "max_write_lock_count", Value: "18446744073709551615"}, - {Scope: ScopeNone, Name: "performance_schema_max_socket_instances", Value: "322"}, - {Scope: ScopeNone, Name: "performance_schema_max_table_instances", Value: "12500"}, - {Scope: ScopeGlobal, Name: "innodb_stats_persistent_sample_pages", Value: "20"}, - {Scope: ScopeGlobal, Name: "show_compatibility_56", Value: ""}, - {Scope: ScopeNone, Name: "innodb_open_files", Value: "2000"}, - {Scope: ScopeGlobal, Name: "innodb_spin_wait_delay", Value: "6"}, - {Scope: ScopeGlobal, Name: "thread_cache_size", Value: "9"}, - {Scope: ScopeGlobal, Name: LogSlowAdminStatements, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "innodb_checksums", Value: "ON"}, - {Scope: ScopeNone, Name: "hostname", Value: ServerHostname}, - {Scope: ScopeGlobal | ScopeSession, Name: "auto_increment_offset", Value: "1"}, - {Scope: ScopeNone, Name: "ft_stopword_file", Value: "(built-in)"}, - {Scope: ScopeGlobal, Name: "innodb_max_dirty_pages_pct_lwm", Value: "0"}, - {Scope: ScopeGlobal, Name: LogQueriesNotUsingIndexes, Value: "0", Type: TypeBool}, - {Scope: ScopeSession, Name: "timestamp", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheWlockInvalidate, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "sql_buffer_result", Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: "character_set_filesystem", Value: "binary"}, - {Scope: ScopeGlobal | ScopeSession, Name: "collation_database", Value: mysql.DefaultCollationName}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLModeVar, Value: mysql.DefaultSQLMode, IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: MaxExecutionTime, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true, IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: CollationServer, Value: mysql.DefaultCollationName, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if _, err := collate.GetCollationByName(normalizedValue); err != nil { + return normalizedValue, errors.Trace(err) + } + return normalizedValue, nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: SQLLogBin, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TimeZone, Value: "SYSTEM", IsHintUpdatable: true, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if strings.EqualFold(normalizedValue, "SYSTEM") { + return "SYSTEM", nil + } + _, err := parseTimeZone(normalizedValue) + return normalizedValue, err + }}, + {Scope: ScopeNone, Name: SystemTimeZone, Value: "CST"}, + {Scope: ScopeGlobal | ScopeSession, Name: ForeignKeyChecks, Value: BoolOff, Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if TiDBOptOn(normalizedValue) { + // TiDB does not yet support foreign keys. + // Return the original value in the warning, so that users are not confused. + vars.StmtCtx.AppendWarning(ErrUnsupportedValueForVar.GenWithStackByArgs(ForeignKeyChecks, originalValue)) + return BoolOff, nil + } else if !TiDBOptOn(normalizedValue) { + return BoolOff, nil + } + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(ForeignKeyChecks, originalValue) + }}, + {Scope: ScopeNone, Name: Hostname, Value: ServerHostname}, + {Scope: ScopeSession, Name: Timestamp, Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetFilesystem, Value: "binary", Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + return checkCharacterValid(normalizedValue, CharacterSetFilesystem) + }}, + {Scope: ScopeGlobal | ScopeSession, Name: CollationDatabase, Value: mysql.DefaultCollationName, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if _, err := collate.GetCollationByName(normalizedValue); err != nil { + return normalizedValue, errors.Trace(err) + } + return normalizedValue, nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: AutoIncrementIncrement, Value: strconv.FormatInt(DefAutoIncrementIncrement, 10), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint16, AutoConvertOutOfRange: true}, {Scope: ScopeGlobal | ScopeSession, Name: AutoIncrementOffset, Value: strconv.FormatInt(DefAutoIncrementOffset, 10), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint16, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_heap_table_size", Value: "16777216"}, - {Scope: ScopeGlobal | ScopeSession, Name: "div_precision_increment", Value: "4"}, - {Scope: ScopeGlobal, Name: "innodb_lru_scan_depth", Value: "1024"}, - {Scope: ScopeGlobal, Name: "innodb_purge_rseg_truncate_frequency", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLAutoIsNull, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "innodb_api_enable_binlog", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: "innodb_ft_user_stopword_table", Value: ""}, - {Scope: ScopeNone, Name: "server_id_bits", Value: "32"}, - {Scope: ScopeGlobal, Name: "innodb_log_checksum_algorithm", Value: ""}, - {Scope: ScopeNone, Name: "innodb_buffer_pool_load_at_startup", Value: "1"}, - {Scope: ScopeGlobal | ScopeSession, Name: "sort_buffer_size", Value: "262144"}, - {Scope: ScopeGlobal, Name: "innodb_flush_neighbors", Value: "1"}, - {Scope: ScopeNone, Name: "innodb_use_sys_malloc", Value: "1"}, - {Scope: ScopeSession, Name: PluginLoad, Value: ""}, - {Scope: ScopeSession, Name: PluginDir, Value: "/data/deploy/plugin"}, - {Scope: ScopeNone, Name: "performance_schema_max_socket_classes", Value: "10"}, - {Scope: ScopeNone, Name: "performance_schema_max_stage_classes", Value: "150"}, - {Scope: ScopeGlobal, Name: "innodb_purge_batch_size", Value: "300"}, - {Scope: ScopeNone, Name: "have_profiling", Value: "NO"}, - {Scope: ScopeGlobal | ScopeSession, Name: "character_set_client", Value: mysql.DefaultCharset}, - {Scope: ScopeGlobal, Name: InnodbBufferPoolDumpNow, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal, Name: RelayLogPurge, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "ndb_distribution", Value: ""}, - {Scope: ScopeGlobal, Name: "myisam_data_pointer_size", Value: "6"}, - {Scope: ScopeGlobal, Name: "ndb_optimization_delay", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_ft_num_word_optimize", Value: "2000"}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_join_size", Value: "18446744073709551615"}, - {Scope: ScopeNone, Name: CoreFile, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_seeks_for_key", Value: "18446744073709551615"}, - {Scope: ScopeNone, Name: "innodb_log_buffer_size", Value: "8388608"}, - {Scope: ScopeGlobal, Name: "delayed_insert_timeout", Value: "300"}, - {Scope: ScopeGlobal, Name: "max_relay_log_size", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: MaxSortLength, Value: "1024", Type: TypeUnsigned, MinValue: 4, MaxValue: 8388608, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "metadata_locks_hash_instances", Value: "8"}, - {Scope: ScopeGlobal, Name: "ndb_eventbuffer_free_percent", Value: ""}, - {Scope: ScopeNone, Name: "large_files_support", Value: "1"}, - {Scope: ScopeGlobal, Name: "binlog_max_flush_queue_time", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_fill_factor", Value: ""}, - {Scope: ScopeGlobal, Name: "log_syslog_facility", Value: ""}, - {Scope: ScopeNone, Name: "innodb_ft_min_token_size", Value: "3"}, - {Scope: ScopeGlobal | ScopeSession, Name: "transaction_write_set_extraction", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_blob_write_batch_bytes", Value: ""}, - {Scope: ScopeGlobal, Name: "automatic_sp_privileges", Value: "1"}, - {Scope: ScopeGlobal, Name: "innodb_flush_sync", Value: ""}, - {Scope: ScopeNone, Name: "performance_schema_events_statements_history_long_size", Value: "10000"}, - {Scope: ScopeGlobal, Name: "innodb_monitor_disable", Value: ""}, - {Scope: ScopeNone, Name: "innodb_doublewrite", Value: "1"}, - {Scope: ScopeNone, Name: "log_bin_use_v1_row_events", Value: "0"}, - {Scope: ScopeSession, Name: "innodb_optimize_point_storage", Value: ""}, - {Scope: ScopeNone, Name: "innodb_api_disable_rowlock", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_adaptive_flushing_lwm", Value: "10"}, - {Scope: ScopeNone, Name: "innodb_log_files_in_group", Value: "2"}, - {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadNow, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeNone, Name: "performance_schema_max_rwlock_classes", Value: "40"}, - {Scope: ScopeNone, Name: "binlog_gtid_simple_recovery", Value: "1"}, - {Scope: ScopeNone, Name: Port, Value: "4000"}, - {Scope: ScopeNone, Name: "performance_schema_digests_size", Value: "10000"}, - {Scope: ScopeGlobal | ScopeSession, Name: Profiling, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "lower_case_table_names", Value: "2"}, - {Scope: ScopeSession, Name: "rand_seed1", Value: ""}, - {Scope: ScopeGlobal, Name: "sha256_password_proxy_users", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLQuoteShowCreate, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "binlogging_impossible_mode", Value: "IGNORE_ERROR"}, - {Scope: ScopeGlobal | ScopeSession, Name: QueryCacheSize, Value: "1048576"}, - {Scope: ScopeGlobal, Name: "innodb_stats_transient_sample_pages", Value: "8"}, - {Scope: ScopeGlobal, Name: InnodbStatsOnMetadata, Value: "0"}, - {Scope: ScopeNone, Name: "server_uuid", Value: "00000000-0000-0000-0000-000000000000"}, - {Scope: ScopeNone, Name: "open_files_limit", Value: "5000"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_force_send", Value: ""}, - {Scope: ScopeNone, Name: "skip_show_database", Value: "0"}, - {Scope: ScopeGlobal, Name: "log_timestamps", Value: ""}, - {Scope: ScopeNone, Name: "version_compile_machine", Value: "x86_64"}, - {Scope: ScopeGlobal, Name: "event_scheduler", Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_deferred_constraints", Value: ""}, - {Scope: ScopeGlobal, Name: "log_syslog_include_pid", Value: ""}, - {Scope: ScopeSession, Name: "last_insert_id", Value: ""}, - {Scope: ScopeNone, Name: "innodb_ft_cache_size", Value: "8000000"}, - {Scope: ScopeNone, Name: LogBin, Value: "0"}, - {Scope: ScopeGlobal, Name: InnodbDisableSortFileCache, Value: "0"}, - {Scope: ScopeGlobal, Name: "log_error_verbosity", Value: ""}, - {Scope: ScopeNone, Name: "performance_schema_hosts_size", Value: "100"}, - {Scope: ScopeGlobal, Name: "innodb_replication_delay", Value: "0"}, - {Scope: ScopeGlobal, Name: SlowQueryLog, Value: "0"}, - {Scope: ScopeSession, Name: "debug_sync", Value: ""}, - {Scope: ScopeGlobal, Name: InnodbStatsAutoRecalc, Value: "1"}, - {Scope: ScopeGlobal | ScopeSession, Name: "lc_messages", Value: "en_US"}, - {Scope: ScopeGlobal | ScopeSession, Name: "bulk_insert_buffer_size", Value: "8388608"}, - {Scope: ScopeGlobal | ScopeSession, Name: BinlogDirectNonTransactionalUpdates, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "innodb_change_buffering", Value: "all"}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLBigSelects, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetResults, Value: mysql.DefaultCharset}, - {Scope: ScopeGlobal, Name: "innodb_max_purge_lag_delay", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: "session_track_schema", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_io_capacity_max", Value: "2000"}, - {Scope: ScopeGlobal, Name: "innodb_autoextend_increment", Value: "64"}, - {Scope: ScopeGlobal | ScopeSession, Name: "binlog_format", Value: "STATEMENT"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace", Value: "enabled=off,one_line=off"}, - {Scope: ScopeGlobal | ScopeSession, Name: "read_rnd_buffer_size", Value: "262144"}, - {Scope: ScopeNone, Name: "version_comment", Value: "TiDB Server (Apache License 2.0) " + versioninfo.TiDBEdition + " Edition, MySQL 5.7 compatible"}, - {Scope: ScopeGlobal | ScopeSession, Name: NetWriteTimeout, Value: "60"}, - {Scope: ScopeGlobal, Name: InnodbBufferPoolLoadAbort, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal | ScopeSession, Name: TxnIsolation, Value: "REPEATABLE-READ"}, - {Scope: ScopeGlobal | ScopeSession, Name: TransactionIsolation, Value: "REPEATABLE-READ"}, - {Scope: ScopeGlobal | ScopeSession, Name: "collation_connection", Value: mysql.DefaultCollationName}, - {Scope: ScopeGlobal | ScopeSession, Name: "transaction_prealloc_size", Value: "4096"}, - {Scope: ScopeNone, Name: "performance_schema_setup_objects_size", Value: "100"}, - {Scope: ScopeGlobal, Name: "sync_relay_log", Value: "10000"}, - {Scope: ScopeGlobal, Name: "innodb_ft_result_cache_limit", Value: "2000000000"}, - {Scope: ScopeNone, Name: "innodb_sort_buffer_size", Value: "1048576"}, - {Scope: ScopeGlobal, Name: "innodb_ft_enable_diag_print", Value: "OFF"}, - {Scope: ScopeNone, Name: "thread_handling", Value: "one-thread-per-connection"}, - {Scope: ScopeGlobal, Name: "stored_program_cache", Value: "256"}, - {Scope: ScopeNone, Name: "performance_schema_max_mutex_instances", Value: "15906"}, - {Scope: ScopeGlobal, Name: "innodb_adaptive_max_sleep_delay", Value: "150000"}, - {Scope: ScopeNone, Name: "large_pages", Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: "session_track_system_variables", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_change_buffer_max_size", Value: "25"}, - {Scope: ScopeGlobal, Name: LogBinTrustFunctionCreators, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "innodb_write_io_threads", Value: "4"}, - {Scope: ScopeGlobal, Name: "mysql_native_password_proxy_users", Value: ""}, - {Scope: ScopeGlobal, Name: serverReadOnly, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "large_page_size", Value: "0"}, - {Scope: ScopeNone, Name: "table_open_cache_instances", Value: "1"}, - {Scope: ScopeGlobal, Name: InnodbStatsPersistent, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal | ScopeSession, Name: "session_track_state_change", Value: ""}, - {Scope: ScopeNone, Name: "optimizer_switch", Value: "index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on"}, - {Scope: ScopeGlobal, Name: "delayed_queue_size", Value: "1000"}, - {Scope: ScopeNone, Name: "innodb_read_only", Value: "0"}, - {Scope: ScopeNone, Name: "datetime_format", Value: "%Y-%m-%d %H:%i:%s"}, - {Scope: ScopeGlobal, Name: "log_syslog", Value: ""}, - {Scope: ScopeNone, Name: "version", Value: mysql.ServerVersion}, - {Scope: ScopeGlobal | ScopeSession, Name: "transaction_alloc_block_size", Value: "8192"}, - {Scope: ScopeGlobal, Name: "innodb_large_prefix", Value: "OFF"}, - {Scope: ScopeNone, Name: "performance_schema_max_cond_classes", Value: "80"}, - {Scope: ScopeGlobal, Name: "innodb_io_capacity", Value: "200"}, - {Scope: ScopeGlobal, Name: "max_binlog_cache_size", Value: "18446744073709547520"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_index_stat_enable", Value: ""}, - {Scope: ScopeGlobal, Name: "executed_gtids_compression_period", Value: ""}, - {Scope: ScopeNone, Name: "time_format", Value: "%H:%i:%s"}, - {Scope: ScopeGlobal | ScopeSession, Name: OldAlterTable, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "long_query_time", Value: "10.000000"}, - {Scope: ScopeNone, Name: "innodb_use_native_aio", Value: "0"}, - {Scope: ScopeGlobal, Name: "log_throttle_queries_not_using_indexes", Value: "0"}, - {Scope: ScopeNone, Name: "locked_in_memory", Value: "0"}, - {Scope: ScopeNone, Name: "innodb_api_enable_mdl", Value: "0"}, - {Scope: ScopeGlobal, Name: "binlog_cache_size", Value: "32768"}, - {Scope: ScopeGlobal, Name: "innodb_compression_pad_pct_max", Value: "50"}, - {Scope: ScopeGlobal, Name: InnodbCommitConcurrency, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 1000, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "ft_min_word_len", Value: "4"}, - {Scope: ScopeGlobal, Name: EnforceGtidConsistency, Value: "OFF"}, - {Scope: ScopeGlobal, Name: SecureAuth, Value: "1"}, - {Scope: ScopeNone, Name: "max_tmp_tables", Value: "32"}, - {Scope: ScopeGlobal, Name: InnodbRandomReadAhead, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal | ScopeSession, Name: UniqueChecks, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "internal_tmp_disk_storage_engine", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "myisam_repair_threads", Value: "1"}, - {Scope: ScopeGlobal, Name: "ndb_eventbuffer_max_alloc", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_read_ahead_threshold", Value: "56"}, - {Scope: ScopeGlobal, Name: "key_cache_block_size", Value: "1024"}, - {Scope: ScopeNone, Name: "ndb_recv_thread_cpu_mask", Value: ""}, - {Scope: ScopeGlobal, Name: "gtid_purged", Value: ""}, - {Scope: ScopeGlobal, Name: "max_binlog_stmt_cache_size", Value: "18446744073709547520"}, - {Scope: ScopeGlobal | ScopeSession, Name: "lock_wait_timeout", Value: "31536000"}, - {Scope: ScopeGlobal | ScopeSession, Name: "read_buffer_size", Value: "131072"}, - {Scope: ScopeNone, Name: "innodb_read_io_threads", Value: "4"}, - {Scope: ScopeGlobal | ScopeSession, Name: MaxSpRecursionDepth, Value: "0", Type: TypeUnsigned, MinValue: 0, MaxValue: 255, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "ignore_builtin_innodb", Value: "0"}, - {Scope: ScopeGlobal, Name: "slow_query_log_file", Value: "/usr/local/mysql/data/localhost-slow.log"}, - {Scope: ScopeGlobal, Name: "innodb_thread_sleep_delay", Value: "10000"}, - {Scope: ScopeNone, Name: "license", Value: "Apache License 2.0"}, - {Scope: ScopeGlobal, Name: "innodb_ft_aux_table", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLWarnings, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: KeepFilesOnCreate, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "innodb_data_file_path", Value: "ibdata1:12M:autoextend"}, - {Scope: ScopeNone, Name: "performance_schema_setup_actors_size", Value: "100"}, - {Scope: ScopeNone, Name: "innodb_additional_mem_pool_size", Value: "8388608"}, - {Scope: ScopeNone, Name: "log_error", Value: "/usr/local/mysql/data/localhost.err"}, - {Scope: ScopeGlobal, Name: "binlog_stmt_cache_size", Value: "32768"}, - {Scope: ScopeNone, Name: "relay_log_info_file", Value: "relay-log.info"}, - {Scope: ScopeNone, Name: "innodb_ft_total_cache_size", Value: "640000000"}, - {Scope: ScopeNone, Name: "performance_schema_max_rwlock_instances", Value: "9102"}, - {Scope: ScopeGlobal, Name: "table_open_cache", Value: "2000"}, - {Scope: ScopeNone, Name: "performance_schema_events_stages_history_long_size", Value: "10000"}, - {Scope: ScopeGlobal | ScopeSession, Name: AutoCommit, Value: "1", Type: TypeBool}, - {Scope: ScopeSession, Name: "insert_id", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "default_tmp_storage_engine", Value: "InnoDB"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_search_depth", Value: "62"}, - {Scope: ScopeGlobal, Name: "max_points_in_geometry", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_stats_sample_pages", Value: "8"}, - {Scope: ScopeGlobal | ScopeSession, Name: "profiling_history_size", Value: "15"}, - {Scope: ScopeGlobal | ScopeSession, Name: "character_set_database", Value: mysql.DefaultCharset}, - {Scope: ScopeNone, Name: "have_symlink", Value: "YES"}, - {Scope: ScopeGlobal | ScopeSession, Name: "storage_engine", Value: "InnoDB"}, - {Scope: ScopeGlobal | ScopeSession, Name: "sql_log_off", Value: "0"}, - // In MySQL, the default value of `explicit_defaults_for_timestamp` is `0`. - // But In TiDB, it's set to `1` to be consistent with TiDB timestamp behavior. - // See: https://github.com/pingcap/tidb/pull/6068 for details - {Scope: ScopeNone, Name: "explicit_defaults_for_timestamp", Value: "1"}, - {Scope: ScopeNone, Name: "performance_schema_events_waits_history_size", Value: "10"}, - {Scope: ScopeGlobal, Name: "log_syslog_tag", Value: ""}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetClient, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + return checkCharacterValid(normalizedValue, CharacterSetClient) + }}, + {Scope: ScopeNone, Name: Port, Value: "4000", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint16}, + {Scope: ScopeNone, Name: LowerCaseTableNames, Value: "2"}, + {Scope: ScopeNone, Name: LogBin, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetResults, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "" { + return normalizedValue, nil + } + return checkCharacterValid(normalizedValue, "") + }}, + {Scope: ScopeNone, Name: VersionComment, Value: "TiDB Server (Apache License 2.0) " + versioninfo.TiDBEdition + " Edition, MySQL 5.7 compatible"}, + {Scope: ScopeGlobal | ScopeSession, Name: TxnIsolation, Value: "REPEATABLE-READ", Type: TypeEnum, PossibleValues: []string{"READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ", "SERIALIZABLE"}, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "SERIALIZABLE" || normalizedValue == "READ-UNCOMMITTED" { + if skipIsolationLevelCheck, err := GetSessionSystemVar(vars, TiDBSkipIsolationLevelCheck); err != nil { + return normalizedValue, err + } else if !TiDBOptOn(skipIsolationLevelCheck) { + return normalizedValue, ErrUnsupportedIsolationLevel.GenWithStackByArgs(normalizedValue) + } + } + return normalizedValue, nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TransactionIsolation, Value: "REPEATABLE-READ", Type: TypeEnum, PossibleValues: []string{"READ-UNCOMMITTED", "READ-COMMITTED", "REPEATABLE-READ", "SERIALIZABLE"}, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "SERIALIZABLE" || normalizedValue == "READ-UNCOMMITTED" { + returnErr := ErrUnsupportedIsolationLevel.GenWithStackByArgs(normalizedValue) + if skipIsolationLevelCheck, err := GetSessionSystemVar(vars, TiDBSkipIsolationLevelCheck); err != nil { + return normalizedValue, err + } else if !TiDBOptOn(skipIsolationLevelCheck) { + return normalizedValue, returnErr + } + vars.StmtCtx.AppendWarning(returnErr) + } + return normalizedValue, nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: CollationConnection, Value: mysql.DefaultCollationName, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if _, err := collate.GetCollationByName(normalizedValue); err != nil { + return normalizedValue, errors.Trace(err) + } + return normalizedValue, nil + }}, + {Scope: ScopeNone, Name: Version, Value: mysql.ServerVersion}, + {Scope: ScopeGlobal | ScopeSession, Name: AutoCommit, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: CharsetDatabase, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + return checkCharacterValid(normalizedValue, CharsetDatabase) + }}, {Scope: ScopeGlobal | ScopeSession, Name: TxReadOnly, Value: "0"}, {Scope: ScopeGlobal | ScopeSession, Name: TransactionReadOnly, Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_undo_log_truncate", Value: ""}, - {Scope: ScopeSession, Name: "innodb_create_intrinsic", Value: ""}, - {Scope: ScopeGlobal, Name: "gtid_executed_compression_period", Value: ""}, - {Scope: ScopeGlobal, Name: "ndb_log_empty_epochs", Value: ""}, {Scope: ScopeGlobal, Name: MaxPreparedStmtCount, Value: strconv.FormatInt(DefMaxPreparedStmtCount, 10), Type: TypeInt, MinValue: -1, MaxValue: 1048576, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "have_geometry", Value: "YES"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_max_mem_size", Value: "16384"}, - {Scope: ScopeGlobal | ScopeSession, Name: "net_retry_count", Value: "10"}, - {Scope: ScopeSession, Name: "ndb_table_no_logging", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_features", Value: "greedy_search=on,range_optimizer=on,dynamic_range=on,repeated_subselect=on"}, - {Scope: ScopeGlobal, Name: "innodb_flush_log_at_trx_commit", Value: "1"}, - {Scope: ScopeGlobal, Name: "rewriter_enabled", Value: ""}, - {Scope: ScopeGlobal, Name: "query_cache_min_res_unit", Value: "4096"}, - {Scope: ScopeGlobal | ScopeSession, Name: "updatable_views_with_limit", Value: "YES"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_prune_level", Value: "1"}, - {Scope: ScopeGlobal | ScopeSession, Name: "completion_type", Value: "NO_CHAIN"}, - {Scope: ScopeGlobal, Name: "binlog_checksum", Value: "CRC32"}, - {Scope: ScopeNone, Name: "report_port", Value: "3306"}, - {Scope: ScopeGlobal | ScopeSession, Name: ShowOldTemporals, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "query_cache_limit", Value: "1048576"}, - {Scope: ScopeGlobal, Name: "innodb_buffer_pool_size", Value: "134217728"}, - {Scope: ScopeGlobal, Name: InnodbAdaptiveFlushing, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeNone, Name: "datadir", Value: "/usr/local/mysql/data/"}, + {Scope: ScopeNone, Name: DataDir, Value: "/usr/local/mysql/data/"}, {Scope: ScopeGlobal | ScopeSession, Name: WaitTimeout, Value: strconv.FormatInt(DefWaitTimeout, 10), Type: TypeUnsigned, MinValue: 0, MaxValue: 31536000, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: "innodb_monitor_enable", Value: ""}, - {Scope: ScopeNone, Name: "date_format", Value: "%Y-%m-%d"}, - {Scope: ScopeGlobal, Name: "innodb_buffer_pool_filename", Value: "ib_buffer_pool"}, - {Scope: ScopeGlobal, Name: "slow_launch_time", Value: "2"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_use_transactions", Value: ""}, - {Scope: ScopeNone, Name: "innodb_purge_threads", Value: "1"}, - {Scope: ScopeGlobal, Name: "innodb_concurrency_tickets", Value: "5000"}, - {Scope: ScopeGlobal, Name: "innodb_monitor_reset_all", Value: ""}, - {Scope: ScopeNone, Name: "performance_schema_users_size", Value: "100"}, - {Scope: ScopeGlobal, Name: "ndb_log_updated_only", Value: ""}, - {Scope: ScopeNone, Name: "basedir", Value: "/usr/local/mysql"}, - {Scope: ScopeGlobal, Name: "innodb_old_blocks_time", Value: "1000"}, - {Scope: ScopeGlobal, Name: "innodb_stats_method", Value: "nulls_equal"}, {Scope: ScopeGlobal | ScopeSession, Name: InnodbLockWaitTimeout, Value: strconv.FormatInt(DefInnodbLockWaitTimeout, 10), Type: TypeUnsigned, MinValue: 1, MaxValue: 1073741824, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: LocalInFile, Value: "1", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "myisam_stats_method", Value: "nulls_unequal"}, - {Scope: ScopeNone, Name: "version_compile_os", Value: "osx10.8"}, - {Scope: ScopeNone, Name: "relay_log_recovery", Value: "0"}, - {Scope: ScopeNone, Name: "old", Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: InnodbTableLocks, Value: "1", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeNone, Name: PerformanceSchema, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "myisam_recover_options", Value: "OFF"}, - {Scope: ScopeGlobal | ScopeSession, Name: NetBufferLength, Value: "16384"}, - {Scope: ScopeGlobal | ScopeSession, Name: "binlog_row_image", Value: "FULL"}, - {Scope: ScopeNone, Name: "innodb_locks_unsafe_for_binlog", Value: "0"}, - {Scope: ScopeSession, Name: "rbr_exec_mode", Value: ""}, - {Scope: ScopeGlobal, Name: "myisam_max_sort_file_size", Value: "9223372036853727232"}, - {Scope: ScopeNone, Name: "back_log", Value: "80"}, - {Scope: ScopeNone, Name: "lower_case_file_system", Value: "1"}, - {Scope: ScopeGlobal | ScopeSession, Name: GroupConcatMaxLen, Value: "1024", AutoConvertOutOfRange: true}, - {Scope: ScopeSession, Name: "pseudo_thread_id", Value: ""}, - {Scope: ScopeNone, Name: "socket", Value: "/tmp/myssock"}, - {Scope: ScopeNone, Name: "have_dynamic_loading", Value: "YES"}, - {Scope: ScopeGlobal, Name: "rewriter_verbose", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_undo_logs", Value: "128"}, - {Scope: ScopeNone, Name: "performance_schema_max_cond_instances", Value: "3504"}, - {Scope: ScopeGlobal, Name: "delayed_insert_limit", Value: "100"}, - {Scope: ScopeGlobal, Name: Flush, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: "eq_range_index_dive_limit", Value: "10"}, - {Scope: ScopeNone, Name: "performance_schema_events_stages_history_size", Value: "10"}, - {Scope: ScopeGlobal | ScopeSession, Name: "character_set_connection", Value: mysql.DefaultCharset}, - {Scope: ScopeGlobal, Name: MyISAMUseMmap, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndb_join_pushdown", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetServer, Value: mysql.DefaultCharset}, - {Scope: ScopeGlobal, Name: "validate_password_special_char_count", Value: "1"}, - {Scope: ScopeNone, Name: "performance_schema_max_thread_instances", Value: "402"}, - {Scope: ScopeGlobal | ScopeSession, Name: "ndbinfo_show_hidden", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "net_read_timeout", Value: "30"}, - {Scope: ScopeNone, Name: "innodb_page_size", Value: "16384"}, + {Scope: ScopeGlobal | ScopeSession, Name: GroupConcatMaxLen, Value: "1024", AutoConvertOutOfRange: true, IsHintUpdatable: true, Type: TypeUnsigned, MinValue: 4, MaxValue: math.MaxUint64, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + // https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len + // Minimum Value 4 + // Maximum Value (64-bit platforms) 18446744073709551615 + // Maximum Value (32-bit platforms) 4294967295 + if mathutil.IntBits == 32 { + if val, err := strconv.ParseUint(normalizedValue, 10, 64); err == nil { + if val > uint64(math.MaxUint32) { + vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(GroupConcatMaxLen, originalValue)) + return fmt.Sprintf("%d", math.MaxUint32), nil + } + } + } + return normalizedValue, nil + }}, + {Scope: ScopeNone, Name: Socket, Value: "/tmp/myssock"}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetConnection, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + return checkCharacterValid(normalizedValue, CharacterSetConnection) + }}, + {Scope: ScopeGlobal | ScopeSession, Name: CharacterSetServer, Value: mysql.DefaultCharset, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + return checkCharacterValid(normalizedValue, CharacterSetServer) + }}, {Scope: ScopeGlobal | ScopeSession, Name: MaxAllowedPacket, Value: "67108864", Type: TypeUnsigned, MinValue: 1024, MaxValue: MaxOfMaxAllowedPacket, AutoConvertOutOfRange: true}, - {Scope: ScopeNone, Name: "innodb_log_file_size", Value: "50331648"}, - {Scope: ScopeGlobal, Name: "sync_relay_log_info", Value: "10000"}, - {Scope: ScopeGlobal | ScopeSession, Name: "optimizer_trace_limit", Value: "1"}, - {Scope: ScopeNone, Name: "innodb_ft_max_token_size", Value: "84"}, - {Scope: ScopeGlobal, Name: ValidatePasswordLength, Value: "8", Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: "ndb_log_binlog_index", Value: ""}, - {Scope: ScopeGlobal, Name: "innodb_api_bk_commit_interval", Value: "5"}, - {Scope: ScopeNone, Name: "innodb_undo_directory", Value: "."}, - {Scope: ScopeNone, Name: "bind_address", Value: "*"}, - {Scope: ScopeGlobal, Name: "innodb_sync_spin_loops", Value: "30"}, - {Scope: ScopeGlobal | ScopeSession, Name: SQLSafeUpdates, Value: "0", Type: TypeBool}, - {Scope: ScopeNone, Name: "tmpdir", Value: "/var/tmp/"}, - {Scope: ScopeGlobal, Name: "innodb_thread_concurrency", Value: "0"}, - {Scope: ScopeGlobal, Name: "innodb_buffer_pool_dump_pct", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "lc_time_names", Value: "en_US"}, - {Scope: ScopeGlobal | ScopeSession, Name: "max_statement_time", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: EndMakersInJSON, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: AvoidTemporalUpgrade, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "key_cache_age_threshold", Value: "300"}, - {Scope: ScopeGlobal, Name: InnodbStatusOutput, Value: "0", Type: TypeBool, AutoConvertNegativeBool: true}, - {Scope: ScopeSession, Name: "identity", Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: "min_examined_row_limit", Value: "0"}, - {Scope: ScopeGlobal, Name: "sync_frm", Value: "ON"}, - {Scope: ScopeGlobal, Name: "innodb_online_alter_log_max_size", Value: "134217728"}, - {Scope: ScopeSession, Name: WarningCount, Value: "0"}, - {Scope: ScopeSession, Name: ErrorCount, Value: "0"}, - {Scope: ScopeGlobal | ScopeSession, Name: "information_schema_stats_expiry", Value: "86400"}, - {Scope: ScopeGlobal, Name: ThreadPoolSize, Value: "16", Type: TypeUnsigned, MinValue: 1, MaxValue: 64, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: WindowingUseHighPrecision, Value: "ON", Type: TypeBool}, + {Scope: ScopeSession, Name: WarningCount, Value: "0", ReadOnly: true}, + {Scope: ScopeSession, Name: ErrorCount, Value: "0", ReadOnly: true}, + {Scope: ScopeGlobal | ScopeSession, Name: WindowingUseHighPrecision, Value: BoolOn, Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeSession, Name: TiDBTxnScope, Value: func() string { + if isGlobal, _ := config.GetTxnScopeFromConfig(); isGlobal { + return oracle.GlobalTxnScope + } + return oracle.LocalTxnScope + }()}, /* TiDB specific variables */ + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowMPPExecution, Type: TypeBool, Value: BoolToOnOff(DefTiDBAllowMPPExecution)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBCJThresholdCount, Value: strconv.Itoa(DefBroadcastJoinThresholdCount), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBBCJThresholdSize, Value: strconv.Itoa(DefBroadcastJoinThresholdSize), Type: TypeInt, MinValue: 0, MaxValue: math.MaxInt64}, {Scope: ScopeSession, Name: TiDBSnapshot, Value: ""}, - {Scope: ScopeSession, Name: TiDBOptAggPushDown, Value: BoolToIntStr(DefOptAggPushDown), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptBCJ, Value: BoolToIntStr(DefOptBCJ)}, - {Scope: ScopeSession, Name: TiDBOptDistinctAggPushDown, Value: BoolToIntStr(config.GetGlobalConfig().Performance.DistinctAggPushDown), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBOptWriteRowID, Value: BoolToIntStr(DefOptWriteRowID)}, + {Scope: ScopeSession, Name: TiDBOptAggPushDown, Value: BoolToOnOff(DefOptAggPushDown), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptBCJ, Value: BoolToOnOff(DefOptBCJ), Type: TypeBool, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if TiDBOptOn(normalizedValue) && vars.AllowBatchCop == 0 { + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs("Can't set Broadcast Join to 1 but tidb_allow_batch_cop is 0, please active batch cop at first.") + } + return normalizedValue, nil + }}, + {Scope: ScopeSession, Name: TiDBOptDistinctAggPushDown, Value: BoolToOnOff(config.GetGlobalConfig().Performance.DistinctAggPushDown), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBOptWriteRowID, Value: BoolToOnOff(DefOptWriteRowID)}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBBuildStatsConcurrency, Value: strconv.Itoa(DefBuildStatsConcurrency)}, - {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeRatio, Value: strconv.FormatFloat(DefAutoAnalyzeRatio, 'f', -1, 64)}, - {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeStartTime, Value: DefAutoAnalyzeStartTime}, - {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeEndTime, Value: DefAutoAnalyzeEndTime}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeRatio, Value: strconv.FormatFloat(DefAutoAnalyzeRatio, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeStartTime, Value: DefAutoAnalyzeStartTime, Type: TypeTime}, + {Scope: ScopeGlobal, Name: TiDBAutoAnalyzeEndTime, Value: DefAutoAnalyzeEndTime, Type: TypeTime}, {Scope: ScopeSession, Name: TiDBChecksumTableConcurrency, Value: strconv.Itoa(DefChecksumTableConcurrency)}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBExecutorConcurrency, Value: strconv.Itoa(DefExecutorConcurrency), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBDistSQLScanConcurrency, Value: strconv.Itoa(DefDistSQLScanConcurrency), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptInSubqToJoinAndAgg, Value: BoolToIntStr(DefOptInSubqToJoinAndAgg), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCorrelationThreshold, Value: strconv.FormatFloat(DefOptCorrelationThreshold, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptInSubqToJoinAndAgg, Value: BoolToOnOff(DefOptInSubqToJoinAndAgg), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBOptPreferRangeScan, Value: BoolToOnOff(DefOptPreferRangeScan), Type: TypeBool, IsHintUpdatable: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCorrelationThreshold, Value: strconv.FormatFloat(DefOptCorrelationThreshold, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: 1}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCorrelationExpFactor, Value: strconv.Itoa(DefOptCorrelationExpFactor), Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCPUFactor, Value: strconv.FormatFloat(DefOptCPUFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptTiFlashConcurrencyFactor, Value: strconv.FormatFloat(DefOptTiFlashConcurrencyFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCopCPUFactor, Value: strconv.FormatFloat(DefOptCopCPUFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptNetworkFactor, Value: strconv.FormatFloat(DefOptNetworkFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptScanFactor, Value: strconv.FormatFloat(DefOptScanFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDescScanFactor, Value: strconv.FormatFloat(DefOptDescScanFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptSeekFactor, Value: strconv.FormatFloat(DefOptSeekFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptMemoryFactor, Value: strconv.FormatFloat(DefOptMemoryFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDiskFactor, Value: strconv.FormatFloat(DefOptDiskFactor, 'f', -1, 64)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptConcurrencyFactor, Value: strconv.FormatFloat(DefOptConcurrencyFactor, 'f', -1, 64)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCPUFactor, Value: strconv.FormatFloat(DefOptCPUFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptTiFlashConcurrencyFactor, Value: strconv.FormatFloat(DefOptTiFlashConcurrencyFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptCopCPUFactor, Value: strconv.FormatFloat(DefOptCopCPUFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptNetworkFactor, Value: strconv.FormatFloat(DefOptNetworkFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptScanFactor, Value: strconv.FormatFloat(DefOptScanFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDescScanFactor, Value: strconv.FormatFloat(DefOptDescScanFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptSeekFactor, Value: strconv.FormatFloat(DefOptSeekFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptMemoryFactor, Value: strconv.FormatFloat(DefOptMemoryFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptDiskFactor, Value: strconv.FormatFloat(DefOptDiskFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptConcurrencyFactor, Value: strconv.FormatFloat(DefOptConcurrencyFactor, 'f', -1, 64), Type: TypeFloat, MinValue: 0, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexJoinBatchSize, Value: strconv.Itoa(DefIndexJoinBatchSize), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupSize, Value: strconv.Itoa(DefIndexLookupSize), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupConcurrency, Value: strconv.Itoa(DefIndexLookupConcurrency)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupJoinConcurrency, Value: strconv.Itoa(DefIndexLookupJoinConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupConcurrency, Value: strconv.Itoa(DefIndexLookupConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexLookupJoinConcurrency, Value: strconv.Itoa(DefIndexLookupJoinConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBIndexSerialScanConcurrency, Value: strconv.Itoa(DefIndexSerialScanConcurrency), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipUTF8Check, Value: BoolToIntStr(DefSkipUTF8Check), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipASCIICheck, Value: BoolToIntStr(DefSkipASCIICheck), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBBatchInsert, Value: BoolToIntStr(DefBatchInsert), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBBatchDelete, Value: BoolToIntStr(DefBatchDelete), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBBatchCommit, Value: BoolToIntStr(DefBatchCommit), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipUTF8Check, Value: BoolToOnOff(DefSkipUTF8Check), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipASCIICheck, Value: BoolToOnOff(DefSkipASCIICheck), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBBatchInsert, Value: BoolToOnOff(DefBatchInsert), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBBatchDelete, Value: BoolToOnOff(DefBatchDelete), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBBatchCommit, Value: BoolToOnOff(DefBatchCommit), Type: TypeBool}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBDMLBatchSize, Value: strconv.Itoa(DefDMLBatchSize), Type: TypeUnsigned, MinValue: 0, MaxValue: math.MaxUint64}, - {Scope: ScopeSession, Name: TiDBCurrentTS, Value: strconv.Itoa(DefCurretTS)}, - {Scope: ScopeSession, Name: TiDBLastTxnInfo, Value: strconv.Itoa(DefCurretTS)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBMaxChunkSize, Value: strconv.Itoa(DefMaxChunkSize)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowBatchCop, Value: strconv.Itoa(DefTiDBAllowBatchCop)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBInitChunkSize, Value: strconv.Itoa(DefInitChunkSize)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableCascadesPlanner, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableIndexMerge, Value: "0", Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBCurrentTS, Value: strconv.Itoa(DefCurretTS), ReadOnly: true}, + {Scope: ScopeSession, Name: TiDBLastTxnInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true}, + {Scope: ScopeSession, Name: TiDBLastQueryInfo, Value: strconv.Itoa(DefCurretTS), ReadOnly: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMaxChunkSize, Value: strconv.Itoa(DefMaxChunkSize), Type: TypeUnsigned, MinValue: maxChunkSizeLowerBound, MaxValue: math.MaxUint64}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowBatchCop, Value: strconv.Itoa(DefTiDBAllowBatchCop), Type: TypeInt, MinValue: 0, MaxValue: 2, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "0" && vars.AllowBCJ { + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs("Can't set batch cop 0 but tidb_opt_broadcast_join is 1, please set tidb_opt_broadcast_join 0 at first") + } + return normalizedValue, nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBInitChunkSize, Value: strconv.Itoa(DefInitChunkSize), Type: TypeUnsigned, MinValue: 1, MaxValue: initChunkSizeUpperBound}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableCascadesPlanner, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableIndexMerge, Value: BoolOff, Type: TypeBool}, {Scope: ScopeSession, Name: TIDBMemQuotaQuery, Value: strconv.FormatInt(config.GetGlobalConfig().MemQuotaQuery, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, {Scope: ScopeSession, Name: TIDBMemQuotaHashJoin, Value: strconv.FormatInt(DefTiDBMemQuotaHashJoin, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, {Scope: ScopeSession, Name: TIDBMemQuotaMergeJoin, Value: strconv.FormatInt(DefTiDBMemQuotaMergeJoin, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, @@ -692,122 +642,181 @@ var defaultSysVars = []*SysVar{ {Scope: ScopeSession, Name: TIDBMemQuotaTopn, Value: strconv.FormatInt(DefTiDBMemQuotaTopn, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, {Scope: ScopeSession, Name: TIDBMemQuotaIndexLookupReader, Value: strconv.FormatInt(DefTiDBMemQuotaIndexLookupReader, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, {Scope: ScopeSession, Name: TIDBMemQuotaIndexLookupJoin, Value: strconv.FormatInt(DefTiDBMemQuotaIndexLookupJoin, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeSession, Name: TIDBMemQuotaNestedLoopApply, Value: strconv.FormatInt(DefTiDBMemQuotaNestedLoopApply, 10), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeSession, Name: TiDBEnableStreaming, Value: "0", Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBEnableChunkRPC, Value: "1", Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBEnableStreaming, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBEnableChunkRPC, Value: BoolOn, Type: TypeBool}, {Scope: ScopeSession, Name: TxnIsolationOneShot, Value: ""}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableTablePartition, Value: "on"}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashJoinConcurrency, Value: strconv.Itoa(DefTiDBHashJoinConcurrency)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableTablePartition, Value: BoolOn, Type: TypeEnum, PossibleValues: []string{BoolOff, BoolOn, "AUTO"}}, + {Scope: ScopeSession, Name: TiDBEnableListTablePartition, Value: BoolOff, Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashJoinConcurrency, Value: strconv.Itoa(DefTiDBHashJoinConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBProjectionConcurrency, Value: strconv.Itoa(DefTiDBProjectionConcurrency), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggPartialConcurrency, Value: strconv.Itoa(DefTiDBHashAggPartialConcurrency)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggFinalConcurrency, Value: strconv.Itoa(DefTiDBHashAggFinalConcurrency)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBWindowConcurrency, Value: strconv.Itoa(DefTiDBWindowConcurrency)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableParallelApply, Value: BoolToIntStr(DefTiDBEnableParallelApply), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggPartialConcurrency, Value: strconv.Itoa(DefTiDBHashAggPartialConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBHashAggFinalConcurrency, Value: strconv.Itoa(DefTiDBHashAggFinalConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBWindowConcurrency, Value: strconv.Itoa(DefTiDBWindowConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMergeJoinConcurrency, Value: strconv.Itoa(DefTiDBMergeJoinConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStreamAggConcurrency, Value: strconv.Itoa(DefTiDBStreamAggConcurrency), Type: TypeInt, MinValue: 1, MaxValue: math.MaxInt64, AllowAutoValue: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableParallelApply, Value: BoolToOnOff(DefTiDBEnableParallelApply), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMemQuotaApplyCache, Value: strconv.Itoa(DefTiDBMemQuotaApplyCache)}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBBackoffLockFast, Value: strconv.Itoa(kv.DefBackoffLockFast), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBBackOffWeight, Value: strconv.Itoa(kv.DefBackOffWeight), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBRetryLimit, Value: strconv.Itoa(DefTiDBRetryLimit), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBDisableTxnAutoRetry, Value: BoolToIntStr(DefTiDBDisableTxnAutoRetry), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBConstraintCheckInPlace, Value: BoolToIntStr(DefTiDBConstraintCheckInPlace), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnMode, Value: DefTiDBTxnMode}, - {Scope: ScopeGlobal, Name: TiDBRowFormatVersion, Value: strconv.Itoa(DefTiDBRowFormatV1)}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBDisableTxnAutoRetry, Value: BoolToOnOff(DefTiDBDisableTxnAutoRetry), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBConstraintCheckInPlace, Value: BoolToOnOff(DefTiDBConstraintCheckInPlace), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTxnMode, Value: DefTiDBTxnMode, AllowEmptyAll: true, Type: TypeEnum, PossibleValues: []string{"pessimistic", "optimistic"}}, + {Scope: ScopeGlobal, Name: TiDBRowFormatVersion, Value: strconv.Itoa(DefTiDBRowFormatV1), Type: TypeUnsigned, MinValue: 1, MaxValue: 2}, {Scope: ScopeSession, Name: TiDBOptimizerSelectivityLevel, Value: strconv.Itoa(DefTiDBOptimizerSelectivityLevel), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableWindowFunction, Value: BoolToIntStr(DefEnableWindowFunction), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableVectorizedExpression, Value: BoolToIntStr(DefEnableVectorizedExpression), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableFastAnalyze, Value: BoolToIntStr(DefTiDBUseFastAnalyze), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipIsolationLevelCheck, Value: BoolToIntStr(DefTiDBSkipIsolationLevelCheck), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableWindowFunction, Value: BoolToOnOff(DefEnableWindowFunction), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableStrictDoubleTypeCheck, Value: BoolToOnOff(DefEnableStrictDoubleTypeCheck), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableVectorizedExpression, Value: BoolToOnOff(DefEnableVectorizedExpression), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableFastAnalyze, Value: BoolToOnOff(DefTiDBUseFastAnalyze), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSkipIsolationLevelCheck, Value: BoolToOnOff(DefTiDBSkipIsolationLevelCheck), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableRateLimitAction, Value: BoolToOnOff(DefTiDBEnableRateLimitAction), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowFallbackToTiKV, Value: "", Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "" { + return "", nil + } + engines := strings.Split(normalizedValue, ",") + var formatVal string + storeTypes := make(map[kv.StoreType]struct{}) + for i, engine := range engines { + engine = strings.TrimSpace(engine) + switch { + case strings.EqualFold(engine, kv.TiFlash.Name()): + if _, ok := storeTypes[kv.TiFlash]; !ok { + if i != 0 { + formatVal += "," + } + formatVal += kv.TiFlash.Name() + storeTypes[kv.TiFlash] = struct{}{} + } + default: + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(TiDBAllowFallbackToTiKV, normalizedValue) + } + } + return formatVal, nil + }}, /* The following variable is defined as session scope but is actually server scope. */ - {Scope: ScopeSession, Name: TiDBGeneralLog, Value: strconv.Itoa(DefTiDBGeneralLog), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBPProfSQLCPU, Value: strconv.Itoa(DefTiDBPProfSQLCPU), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBGeneralLog, Value: BoolToOnOff(DefTiDBGeneralLog), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBPProfSQLCPU, Value: strconv.Itoa(DefTiDBPProfSQLCPU), Type: TypeInt, MinValue: 0, MaxValue: 1}, {Scope: ScopeSession, Name: TiDBDDLSlowOprThreshold, Value: strconv.Itoa(DefTiDBDDLSlowOprThreshold)}, - {Scope: ScopeSession, Name: TiDBConfig, Value: ""}, - {Scope: ScopeGlobal, Name: TiDBDDLReorgWorkerCount, Value: strconv.Itoa(DefTiDBDDLReorgWorkerCount), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxUint64}, + {Scope: ScopeSession, Name: TiDBConfig, Value: "", ReadOnly: true}, + {Scope: ScopeGlobal, Name: TiDBDDLReorgWorkerCount, Value: strconv.Itoa(DefTiDBDDLReorgWorkerCount), Type: TypeUnsigned, MinValue: 1, MaxValue: uint64(maxDDLReorgWorkerCount)}, {Scope: ScopeGlobal, Name: TiDBDDLReorgBatchSize, Value: strconv.Itoa(DefTiDBDDLReorgBatchSize), Type: TypeUnsigned, MinValue: int64(MinDDLReorgBatchSize), MaxValue: uint64(MaxDDLReorgBatchSize), AutoConvertOutOfRange: true}, {Scope: ScopeGlobal, Name: TiDBDDLErrorCountLimit, Value: strconv.Itoa(DefTiDBDDLErrorCountLimit), Type: TypeUnsigned, MinValue: 0, MaxValue: uint64(math.MaxInt64), AutoConvertOutOfRange: true}, {Scope: ScopeSession, Name: TiDBDDLReorgPriority, Value: "PRIORITY_LOW"}, {Scope: ScopeGlobal, Name: TiDBMaxDeltaSchemaCount, Value: strconv.Itoa(DefTiDBMaxDeltaSchemaCount), Type: TypeUnsigned, MinValue: 100, MaxValue: 16384, AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: TiDBEnableChangeColumnType, Value: BoolToIntStr(DefTiDBChangeColumnType), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableChangeColumnType, Value: BoolToOnOff(DefTiDBChangeColumnType), Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBEnableChangeMultiSchema, Value: BoolToOnOff(DefTiDBChangeMultiSchema), Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBEnablePointGetCache, Value: BoolToOnOff(DefTiDBPointGetCache), Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBEnableAlterPlacement, Value: BoolToOnOff(DefTiDBEnableAlterPlacement), Type: TypeBool}, {Scope: ScopeSession, Name: TiDBForcePriority, Value: mysql.Priority2Str[DefTiDBForcePriority]}, - {Scope: ScopeSession, Name: TiDBEnableRadixJoin, Value: BoolToIntStr(DefTiDBUseRadixJoin), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptJoinReorderThreshold, Value: strconv.Itoa(DefTiDBOptJoinReorderThreshold)}, + {Scope: ScopeSession, Name: TiDBEnableRadixJoin, Value: BoolToOnOff(DefTiDBUseRadixJoin), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBOptJoinReorderThreshold, Value: strconv.Itoa(DefTiDBOptJoinReorderThreshold), Type: TypeUnsigned, MinValue: 0, MaxValue: 63}, {Scope: ScopeSession, Name: TiDBSlowQueryFile, Value: ""}, - {Scope: ScopeGlobal, Name: TiDBScatterRegion, Value: BoolToIntStr(DefTiDBScatterRegion), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBWaitSplitRegionFinish, Value: BoolToIntStr(DefTiDBWaitSplitRegionFinish), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBWaitSplitRegionTimeout, Value: strconv.Itoa(DefWaitSplitRegionTimeout)}, - {Scope: ScopeSession, Name: TiDBLowResolutionTSO, Value: "0", Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBScatterRegion, Value: BoolToOnOff(DefTiDBScatterRegion), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBWaitSplitRegionFinish, Value: BoolToOnOff(DefTiDBWaitSplitRegionFinish), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBWaitSplitRegionTimeout, Value: strconv.Itoa(DefWaitSplitRegionTimeout), Type: TypeUnsigned, MinValue: 1, MaxValue: math.MaxInt64}, + {Scope: ScopeSession, Name: TiDBLowResolutionTSO, Value: BoolOff, Type: TypeBool}, {Scope: ScopeSession, Name: TiDBExpensiveQueryTimeThreshold, Value: strconv.Itoa(DefTiDBExpensiveQueryTimeThreshold), Type: TypeUnsigned, MinValue: int64(MinExpensiveQueryTimeThreshold), MaxValue: uint64(math.MaxInt64), AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNoopFuncs, Value: BoolToIntStr(DefTiDBEnableNoopFuncs), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBReplicaRead, Value: "leader"}, - {Scope: ScopeSession, Name: TiDBAllowRemoveAutoInc, Value: BoolToIntStr(DefTiDBAllowRemoveAutoInc), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableStmtSummary, Value: BoolToIntStr(config.GetGlobalConfig().StmtSummary.Enable)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryInternalQuery, Value: BoolToIntStr(config.GetGlobalConfig().StmtSummary.EnableInternalQuery)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryRefreshInterval, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.RefreshInterval)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryHistorySize, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.HistorySize)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxStmtCount, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxStmtCount), 10)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxSQLLength, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxSQLLength), 10)}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBCapturePlanBaseline, Value: "off"}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBUsePlanBaselines, Value: boolToOnOff(DefTiDBUsePlanBaselines), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEvolvePlanBaselines, Value: boolToOnOff(DefTiDBEvolvePlanBaselines), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBMemoryUsageAlarmRatio, Value: strconv.FormatFloat(config.GetGlobalConfig().Performance.MemoryUsageAlarmRatio, 'f', -1, 64), Type: TypeFloat, MinValue: 0.0, MaxValue: 1.0}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableNoopFuncs, Value: BoolToOnOff(DefTiDBEnableNoopFuncs), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBReplicaRead, Value: "leader", Type: TypeEnum, PossibleValues: []string{"leader", "follower", "leader-and-follower"}}, + {Scope: ScopeSession, Name: TiDBAllowRemoveAutoInc, Value: BoolToOnOff(DefTiDBAllowRemoveAutoInc), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableStmtSummary, Value: BoolToOnOff(config.GetGlobalConfig().StmtSummary.Enable), Type: TypeBool, AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryInternalQuery, Value: BoolToOnOff(config.GetGlobalConfig().StmtSummary.EnableInternalQuery), Type: TypeBool, AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryRefreshInterval, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.RefreshInterval), Type: TypeInt, MinValue: 1, MaxValue: uint64(math.MaxInt32), AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryHistorySize, Value: strconv.Itoa(config.GetGlobalConfig().StmtSummary.HistorySize), Type: TypeInt, MinValue: 0, MaxValue: uint64(math.MaxUint8), AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxStmtCount, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxStmtCount), 10), Type: TypeInt, MinValue: 1, MaxValue: uint64(math.MaxInt16), AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBStmtSummaryMaxSQLLength, Value: strconv.FormatUint(uint64(config.GetGlobalConfig().StmtSummary.MaxSQLLength), 10), Type: TypeInt, MinValue: 0, MaxValue: uint64(math.MaxInt32), AllowEmpty: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBCapturePlanBaseline, Value: BoolOff, Type: TypeBool, AllowEmptyAll: true}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBUsePlanBaselines, Value: BoolToOnOff(DefTiDBUsePlanBaselines), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEvolvePlanBaselines, Value: BoolToOnOff(DefTiDBEvolvePlanBaselines), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableExtendedStats, Value: BoolToOnOff(false), Type: TypeBool}, {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskMaxTime, Value: strconv.Itoa(DefTiDBEvolvePlanTaskMaxTime), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskStartTime, Value: DefTiDBEvolvePlanTaskStartTime}, - {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskEndTime, Value: DefTiDBEvolvePlanTaskEndTime}, - {Scope: ScopeSession, Name: TiDBIsolationReadEngines, Value: strings.Join(config.GetGlobalConfig().IsolationRead.Engines, ", ")}, + {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskStartTime, Value: DefTiDBEvolvePlanTaskStartTime, Type: TypeTime}, + {Scope: ScopeGlobal, Name: TiDBEvolvePlanTaskEndTime, Value: DefTiDBEvolvePlanTaskEndTime, Type: TypeTime}, + {Scope: ScopeSession, Name: TiDBIsolationReadEngines, Value: strings.Join(config.GetGlobalConfig().IsolationRead.Engines, ", "), Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + engines := strings.Split(normalizedValue, ",") + var formatVal string + for i, engine := range engines { + engine = strings.TrimSpace(engine) + if i != 0 { + formatVal += "," + } + switch { + case strings.EqualFold(engine, kv.TiKV.Name()): + formatVal += kv.TiKV.Name() + case strings.EqualFold(engine, kv.TiFlash.Name()): + formatVal += kv.TiFlash.Name() + case strings.EqualFold(engine, kv.TiDB.Name()): + formatVal += kv.TiDB.Name() + default: + return normalizedValue, ErrWrongValueForVar.GenWithStackByArgs(TiDBIsolationReadEngines, normalizedValue) + } + } + return formatVal, nil + }}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBStoreLimit, Value: strconv.FormatInt(atomic.LoadInt64(&config.GetGlobalConfig().TiKVClient.StoreLimit), 10), Type: TypeInt, MinValue: 0, MaxValue: uint64(math.MaxInt64), AutoConvertOutOfRange: true}, - {Scope: ScopeSession, Name: TiDBMetricSchemaStep, Value: strconv.Itoa(DefTiDBMetricSchemaStep)}, - {Scope: ScopeSession, Name: TiDBMetricSchemaRangeDuration, Value: strconv.Itoa(DefTiDBMetricSchemaRangeDuration)}, + {Scope: ScopeSession, Name: TiDBMetricSchemaStep, Value: strconv.Itoa(DefTiDBMetricSchemaStep), Type: TypeUnsigned, MinValue: 10, MaxValue: 60 * 60 * 60}, + {Scope: ScopeSession, Name: TiDBMetricSchemaRangeDuration, Value: strconv.Itoa(DefTiDBMetricSchemaRangeDuration), Type: TypeUnsigned, MinValue: 10, MaxValue: 60 * 60 * 60}, {Scope: ScopeSession, Name: TiDBSlowLogThreshold, Value: strconv.Itoa(logutil.DefaultSlowThreshold), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeSession, Name: TiDBRecordPlanInSlowLog, Value: strconv.Itoa(logutil.DefaultRecordPlanInSlowLog), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBEnableSlowLog, Value: BoolToIntStr(logutil.DefaultTiDBEnableSlowLog), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBRecordPlanInSlowLog, Value: int32ToBoolStr(logutil.DefaultRecordPlanInSlowLog), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBEnableSlowLog, Value: BoolToOnOff(logutil.DefaultTiDBEnableSlowLog), Type: TypeBool}, {Scope: ScopeSession, Name: TiDBQueryLogMaxLen, Value: strconv.Itoa(logutil.DefaultQueryLogMaxLen), Type: TypeInt, MinValue: -1, MaxValue: math.MaxInt64}, - {Scope: ScopeSession, Name: TiDBCheckMb4ValueInUTF8, Value: BoolToIntStr(config.GetGlobalConfig().CheckMb4ValueInUTF8), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBFoundInPlanCache, Value: BoolToIntStr(DefTiDBFoundInPlanCache), Type: TypeBool}, - {Scope: ScopeSession, Name: TiDBEnableCollectExecutionInfo, Value: BoolToIntStr(DefTiDBEnableCollectExecutionInfo), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowAutoRandExplicitInsert, Value: boolToOnOff(DefTiDBAllowAutoRandExplicitInsert), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableClusteredIndex, Value: BoolToIntStr(DefTiDBEnableClusteredIndex), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBPartitionPruneMode, Value: string(StaticOnly)}, - {Scope: ScopeGlobal, Name: TiDBSlowLogMasking, Value: BoolToIntStr(DefTiDBSlowLogMasking)}, - {Scope: ScopeGlobal, Name: TiDBRedactLog, Value: strconv.Itoa(config.DefTiDBRedactLog)}, + {Scope: ScopeSession, Name: TiDBCheckMb4ValueInUTF8, Value: BoolToOnOff(config.GetGlobalConfig().CheckMb4ValueInUTF8), Type: TypeBool}, + {Scope: ScopeSession, Name: TiDBFoundInPlanCache, Value: BoolToOnOff(DefTiDBFoundInPlanCache), Type: TypeBool, ReadOnly: true}, + {Scope: ScopeSession, Name: TiDBFoundInBinding, Value: BoolToOnOff(DefTiDBFoundInBinding), Type: TypeBool, ReadOnly: true}, + {Scope: ScopeSession, Name: TiDBEnableCollectExecutionInfo, Value: BoolToOnOff(DefTiDBEnableCollectExecutionInfo), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAllowAutoRandExplicitInsert, Value: BoolToOnOff(DefTiDBAllowAutoRandExplicitInsert), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableClusteredIndex, Value: BoolToOnOff(DefTiDBEnableClusteredIndex), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBPartitionPruneMode, Value: string(Static), Type: TypeStr, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + mode := PartitionPruneMode(normalizedValue).Update() + if !mode.Valid() { + return normalizedValue, ErrWrongTypeForVar.GenWithStackByArgs(TiDBPartitionPruneMode) + } + return string(mode), nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBSlowLogMasking, Value: BoolToOnOff(DefTiDBRedactLog), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBRedactLog, Value: BoolToOnOff(DefTiDBRedactLog), Type: TypeBool}, {Scope: ScopeGlobal | ScopeSession, Name: TiDBShardAllocateStep, Value: strconv.Itoa(DefTiDBShardAllocateStep), Type: TypeInt, MinValue: 1, MaxValue: uint64(math.MaxInt64), AutoConvertOutOfRange: true}, - {Scope: ScopeGlobal, Name: TiDBEnableTelemetry, Value: BoolToIntStr(DefTiDBEnableTelemetry), Type: TypeBool}, - {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAmendPessimisticTxn, Value: boolToOnOff(DefTiDBEnableAmendPessimisticTxn), Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBEnableTelemetry, Value: BoolToOnOff(DefTiDBEnableTelemetry), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAmendPessimisticTxn, Value: BoolToOnOff(DefTiDBEnableAmendPessimisticTxn), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableAsyncCommit, Value: BoolToOnOff(DefTiDBEnableAsyncCommit), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnable1PC, Value: BoolToOnOff(DefTiDBEnable1PC), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBGuaranteeLinearizability, Value: BoolToOnOff(DefTiDBGuaranteeLinearizability), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBAnalyzeVersion, Value: strconv.Itoa(DefTiDBAnalyzeVersion), Type: TypeInt, MinValue: 1, MaxValue: 2, Validation: func(vars *SessionVars, normalizedValue string, originalValue string, scope ScopeFlag) (string, error) { + if normalizedValue == "2" && FeedbackProbability.Load() > 0 { + var original string + var err error + if scope == ScopeGlobal { + original, err = vars.GlobalVarsAccessor.GetGlobalSysVar(TiDBAnalyzeVersion) + if err != nil { + return normalizedValue, nil + } + } else { + original = strconv.Itoa(vars.AnalyzeVersion) + } + vars.StmtCtx.AppendError(errors.New("variable tidb_analyze_version not updated because analyze version 2 is incompatible with query feedback. Please consider setting feedback-probability to 0.0 in config file to disable query feedback")) + return original, nil + } + return normalizedValue, nil + }}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableIndexMergeJoin, Value: BoolToOnOff(DefTiDBEnableIndexMergeJoin), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBTrackAggregateMemoryUsage, Value: BoolToOnOff(DefTiDBTrackAggregateMemoryUsage), Type: TypeBool}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBMultiStatementMode, Value: Off, Type: TypeEnum, PossibleValues: []string{Off, On, Warn}}, + {Scope: ScopeGlobal | ScopeSession, Name: TiDBEnableExchangePartition, Value: BoolToOnOff(DefTiDBEnableExchangePartition), Type: TypeBool}, - // for compatibility purpose, we should leave them alone. - // TODO: Follow the Terminology Updates of MySQL after their changes arrived. - // https://mysqlhighavailability.com/mysql-terminology-updates/ - {Scope: ScopeSession, Name: PseudoSlaveMode, Value: "", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "slave_pending_jobs_size_max", Value: "16777216"}, - {Scope: ScopeGlobal, Name: "slave_transaction_retries", Value: "10"}, - {Scope: ScopeGlobal, Name: "slave_checkpoint_period", Value: "300"}, - {Scope: ScopeGlobal, Name: MasterVerifyChecksum, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_trace_level", Value: ""}, - {Scope: ScopeGlobal, Name: "master_info_repository", Value: "FILE"}, - {Scope: ScopeGlobal, Name: "rpl_stop_slave_timeout", Value: "31536000"}, - {Scope: ScopeGlobal, Name: "slave_net_timeout", Value: "3600"}, - {Scope: ScopeGlobal, Name: "sync_master_info", Value: "10000"}, - {Scope: ScopeGlobal, Name: "init_slave", Value: ""}, - {Scope: ScopeGlobal, Name: SlaveCompressedProtocol, Value: "0"}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_trace_level", Value: ""}, - {Scope: ScopeGlobal, Name: LogSlowSlaveStatements, Value: "0", Type: TypeBool}, - {Scope: ScopeGlobal, Name: "slave_checkpoint_group", Value: "512"}, - {Scope: ScopeNone, Name: "slave_load_tmpdir", Value: "/var/tmp/"}, - {Scope: ScopeGlobal, Name: "slave_parallel_type", Value: ""}, - {Scope: ScopeGlobal, Name: "slave_parallel_workers", Value: "0"}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_timeout", Value: ""}, - {Scope: ScopeNone, Name: "slave_skip_errors", Value: "OFF"}, - {Scope: ScopeGlobal, Name: "sql_slave_skip_counter", Value: "0"}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_slave_enabled", Value: ""}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_enabled", Value: ""}, - {Scope: ScopeGlobal, Name: "slave_preserve_commit_order", Value: ""}, - {Scope: ScopeGlobal, Name: "slave_exec_mode", Value: "STRICT"}, - {Scope: ScopeNone, Name: "log_slave_updates", Value: "0"}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_point", Value: ""}, - {Scope: ScopeGlobal, Name: "slave_sql_verify_checksum", Value: "1"}, - {Scope: ScopeGlobal, Name: "slave_max_allowed_packet", Value: "1073741824"}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_for_slave_count", Value: ""}, - {Scope: ScopeGlobal, Name: "rpl_semi_sync_master_wait_no_slave", Value: ""}, - {Scope: ScopeGlobal, Name: "slave_rows_search_algorithms", Value: "TABLE_SCAN,INDEX_SCAN"}, - {Scope: ScopeGlobal, Name: SlaveAllowBatching, Value: "0", Type: TypeBool}, + /* tikv gc metrics */ + {Scope: ScopeGlobal, Name: TiDBGCEnable, Value: BoolOn, Type: TypeBool}, + {Scope: ScopeGlobal, Name: TiDBGCRunInterval, Value: "10m0s", Type: TypeDuration, MinValue: int64(time.Minute * 10), MaxValue: math.MaxInt64}, + {Scope: ScopeGlobal, Name: TiDBGCLifetime, Value: "10m0s", Type: TypeDuration, MinValue: int64(time.Minute * 10), MaxValue: math.MaxInt64}, + {Scope: ScopeGlobal, Name: TiDBGCConcurrency, Value: "-1", Type: TypeInt, MinValue: 1, MaxValue: 128, AllowAutoValue: true}, + {Scope: ScopeGlobal, Name: TiDBGCScanLockMode, Value: "PHYSICAL", Type: TypeEnum, PossibleValues: []string{"PHYSICAL", "LEGACY"}}, } +// FeedbackProbability points to the FeedbackProbability in statistics package. +// It's initialized in init() in feedback.go to solve import cycle. +var FeedbackProbability *atomic2.Float64 + // SynonymsSysVariables is synonyms of system variables. var SynonymsSysVariables = map[string][]string{} @@ -824,15 +833,15 @@ func initSynonymsSysVariables() { // SetNamesVariables is the system variable names related to set names statements. var SetNamesVariables = []string{ - "character_set_client", - "character_set_connection", - "character_set_results", + CharacterSetClient, + CharacterSetConnection, + CharacterSetResults, } // SetCharsetVariables is the system variable names related to set charset statements. var SetCharsetVariables = []string{ - "character_set_client", - "character_set_results", + CharacterSetClient, + CharacterSetResults, } const ( @@ -844,6 +853,12 @@ const ( CharsetDatabase = "character_set_database" // CollationDatabase is the name for collation_database system variable. CollationDatabase = "collation_database" + // CharacterSetFilesystem is the name for character_set_filesystem system variable. + CharacterSetFilesystem = "character_set_filesystem" + // CharacterSetClient is the name for character_set_client system variable. + CharacterSetClient = "character_set_client" + // CharacterSetSystem is the name for character_set_system system variable. + CharacterSetSystem = "character_set_system" // GeneralLog is the name for 'general_log' system variable. GeneralLog = "general_log" // AvoidTemporalUpgrade is the name for 'avoid_temporal_upgrade' system variable. @@ -862,8 +877,10 @@ const ( GroupConcatMaxLen = "group_concat_max_len" // DelayKeyWrite is the name for 'delay_key_write' system variable. DelayKeyWrite = "delay_key_write" - // EndMakersInJSON is the name for 'end_markers_in_json' system variable. - EndMakersInJSON = "end_markers_in_json" + // EndMarkersInJSON is the name for 'end_markers_in_json' system variable. + EndMarkersInJSON = "end_markers_in_json" + // Hostname is the name for 'hostname' system variable. + Hostname = "hostname" // InnodbCommitConcurrency is the name for 'innodb_commit_concurrency' system variable. InnodbCommitConcurrency = "innodb_commit_concurrency" // InnodbFastShutdown is the name for 'innodb_fast_shutdown' system variable. @@ -890,6 +907,8 @@ const ( PseudoSlaveMode = "pseudo_slave_mode" // LowPriorityUpdates is the name for 'low_priority_updates' system variable. LowPriorityUpdates = "low_priority_updates" + // LowerCaseTableNames is the name for 'lower_case_table_names' system variable. + LowerCaseTableNames = "lower_case_table_names" // SessionTrackGtids is the name for 'session_track_gtids' system variable. SessionTrackGtids = "session_track_gtids" // OldPasswords is the name for 'old_passwords' system variable. @@ -914,6 +933,8 @@ const ( TableDefinitionCache = "table_definition_cache" // TmpTableSize is the name for 'tmp_table_size' system variable. TmpTableSize = "tmp_table_size" + // Timestamp is the name for 'timestamp' system variable. + Timestamp = "timestamp" // ConnectTimeout is the name for 'connect_timeout' system variable. ConnectTimeout = "connect_timeout" // SyncBinlog is the name for 'sync_binlog' system variable. @@ -926,6 +947,10 @@ const ( ValidatePasswordNumberCount = "validate_password_number_count" // ValidatePasswordLength is the name of 'validate_password_length' system variable. ValidatePasswordLength = "validate_password_length" + // Version is the name of 'version' system variable. + Version = "version" + // VersionComment is the name of 'version_comment' system variable. + VersionComment = "version_comment" // PluginDir is the name of 'plugin_dir' system variable. PluginDir = "plugin_dir" // PluginLoad is the name of 'plugin_load' system variable. @@ -1048,7 +1073,6 @@ const ( InnodbTableLocks = "innodb_table_locks" // InnodbStatusOutput is the name for 'innodb_status_output' system variable. InnodbStatusOutput = "innodb_status_output" - // NetBufferLength is the name for 'net_buffer_length' system variable. NetBufferLength = "net_buffer_length" // QueryCacheSize is the name of 'query_cache_size' system variable. @@ -1073,12 +1097,14 @@ const ( ThreadPoolSize = "thread_pool_size" // WindowingUseHighPrecision is the name of 'windowing_use_high_precision' system variable. WindowingUseHighPrecision = "windowing_use_high_precision" + // OptimizerSwitch is the name of 'optimizer_switch' system variable. + OptimizerSwitch = "optimizer_switch" + // SystemTimeZone is the name of 'system_time_zone' system variable. + SystemTimeZone = "system_time_zone" ) // GlobalVarAccessor is the interface for accessing global scope system and status variables. type GlobalVarAccessor interface { - // GetAllSysVars gets all the global system variable values. - GetAllSysVars() (map[string]string, error) // GetGlobalSysVar gets the global system variable value for name. GetGlobalSysVar(name string) (string, error) // SetGlobalSysVar sets the global system variable name to value. diff --git a/sessionctx/variable/sysvar_test.go b/sessionctx/variable/sysvar_test.go index 51c6eba70134a..bdfbf0f39b563 100644 --- a/sessionctx/variable/sysvar_test.go +++ b/sessionctx/variable/sysvar_test.go @@ -40,20 +40,20 @@ func (*testSysVarSuite) TestSysVar(c *C) { f = GetSysVar("explicit_defaults_for_timestamp") c.Assert(f, NotNil) - c.Assert(f.Value, Equals, "1") + c.Assert(f.Value, Equals, "ON") f = GetSysVar("port") c.Assert(f, NotNil) c.Assert(f.Value, Equals, "4000") f = GetSysVar("tidb_low_resolution_tso") - c.Assert(f.Value, Equals, "0") + c.Assert(f.Value, Equals, "OFF") f = GetSysVar("tidb_replica_read") c.Assert(f.Value, Equals, "leader") f = GetSysVar("tidb_enable_table_partition") - c.Assert(f.Value, Equals, "on") + c.Assert(f.Value, Equals, "ON") } func (*testSysVarSuite) TestTxnMode(c *C) { @@ -70,11 +70,6 @@ func (*testSysVarSuite) TestTxnMode(c *C) { c.Assert(err, NotNil) } -func (*testSysVarSuite) TestBoolToInt32(c *C) { - c.Assert(BoolToInt32(true), Equals, int32(1)) - c.Assert(BoolToInt32(false), Equals, int32(0)) -} - func (*testSysVarSuite) TestError(c *C) { kvErrs := []*terror.Error{ ErrUnsupportedValueForVar, diff --git a/sessionctx/variable/tidb_vars.go b/sessionctx/variable/tidb_vars.go index d05fc43b7dd82..3b8851c1e7ff4 100644 --- a/sessionctx/variable/tidb_vars.go +++ b/sessionctx/variable/tidb_vars.go @@ -18,6 +18,7 @@ import ( "os" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/config" "github.com/uber-go/atomic" ) @@ -50,6 +51,14 @@ const ( // tidb_opt_distinct_agg_push_down is used to decide whether agg with distinct should be pushed to tikv/tiflash. TiDBOptDistinctAggPushDown = "tidb_opt_distinct_agg_push_down" + // tidb_broadcast_join_threshold_size is used to limit the size of small table for mpp broadcast join. + // It's unit is bytes, if the size of small table is larger than it, we will not use bcj. + TiDBBCJThresholdSize = "tidb_broadcast_join_threshold_size" + + // tidb_broadcast_join_threshold_count is used to limit the count of small table for mpp broadcast join. + // If we can't estimate the size of one side of join child, we will check if its row number exceeds this limitation. + TiDBBCJThresholdCount = "tidb_broadcast_join_threshold_count" + // tidb_opt_write_row_id is used to enable/disable the operations of insert、replace and update to _tidb_rowid. TiDBOptWriteRowID = "tidb_opt_write_row_id" @@ -72,6 +81,9 @@ const ( // TiDBLastTxnInfo is used to get the last transaction info within the current session. TiDBLastTxnInfo = "tidb_last_txn_info" + // TiDBLastTxnInfo is used to get the last query info within the current session. + TiDBLastQueryInfo = "tidb_last_query_info" + // tidb_config is a read-only variable that shows the config of the current server. TiDBConfig = "tidb_config" @@ -95,8 +107,8 @@ const ( // The following session variables controls the memory quota during query execution. // "tidb_mem_quota_query": control the memory quota of a query. - TIDBMemQuotaQuery = "tidb_mem_quota_query" // Bytes. - TIDBNestedLoopJoinCacheCapacity = "tidb_nested_loop_join_cache_capacity" + TIDBMemQuotaQuery = "tidb_mem_quota_query" // Bytes. + TiDBMemQuotaApplyCache = "tidb_mem_quota_apply_cache" // TODO: remove them below sometime, it should have only one Quota(TIDBMemQuotaQuery). TIDBMemQuotaHashJoin = "tidb_mem_quota_hashjoin" // Bytes. TIDBMemQuotaMergeJoin = "tidb_mem_quota_mergejoin" // Bytes. @@ -104,7 +116,6 @@ const ( TIDBMemQuotaTopn = "tidb_mem_quota_topn" // Bytes. TIDBMemQuotaIndexLookupReader = "tidb_mem_quota_indexlookupreader" // Bytes. TIDBMemQuotaIndexLookupJoin = "tidb_mem_quota_indexlookupjoin" // Bytes. - TIDBMemQuotaNestedLoopApply = "tidb_mem_quota_nestedloopapply" // Bytes. // tidb_general_log is used to log every query in the server in info level. TiDBGeneralLog = "tidb_general_log" @@ -139,6 +150,9 @@ const ( // off: always disable table partition. TiDBEnableTablePartition = "tidb_enable_table_partition" + // tidb_enable_list_partition is used to control list table partition feature. + TiDBEnableListTablePartition = "tidb_enable_list_partition" + // tidb_skip_isolation_level_check is used to control whether to return error when set unsupported transaction // isolation level. TiDBSkipIsolationLevelCheck = "tidb_skip_isolation_level_check" @@ -152,6 +166,10 @@ const ( // TiDBAllowRemoveAutoInc indicates whether a user can drop the auto_increment column attribute or not. TiDBAllowRemoveAutoInc = "tidb_allow_remove_auto_inc" + // TiDBMultiStatementMode enables multi statement at the risk of SQL injection + // provides backwards compatibility + TiDBMultiStatementMode = "tidb_multi_statement_mode" + // TiDBEvolvePlanTaskMaxTime controls the max time of a single evolution task. TiDBEvolvePlanTaskMaxTime = "tidb_evolve_plan_task_max_time" @@ -178,8 +196,14 @@ const ( // TiDBFoundInPlanCache indicates whether the last statement was found in plan cache TiDBFoundInPlanCache = "last_plan_from_cache" + // TiDBFoundInBinding indicates whether the last statement was matched with the hints in the binding. + TiDBFoundInBinding = "last_plan_from_binding" + // TiDBAllowAutoRandExplicitInsert indicates whether explicit insertion on auto_random column is allowed. TiDBAllowAutoRandExplicitInsert = "allow_auto_random_explicit_insert" + + // TiDBTxnScope indicates whether using global transactions or local transactions. + TiDBTxnScope = "txn_scope" ) // TiDB system variable names that both in session and global scope. @@ -198,6 +222,9 @@ const ( // tidb_opt_insubquery_to_join_and_agg is used to enable/disable the optimizer rule of rewriting IN subquery. TiDBOptInSubqToJoinAndAgg = "tidb_opt_insubq_to_join_and_agg" + // tidb_opt_prefer_range_scan is used to enable/disable the optimizer to always prefer range scan over table scan, ignoring their costs. + TiDBOptPreferRangeScan = "tidb_opt_prefer_range_scan" + // tidb_opt_correlation_threshold is a guard to enable row count estimation using column order correlation. TiDBOptCorrelationThreshold = "tidb_opt_correlation_threshold" @@ -264,6 +291,8 @@ const ( // The default value is 0 TiDBAllowBatchCop = "tidb_allow_batch_cop" + TiDBAllowMPPExecution = "tidb_allow_mpp" + // TiDBInitChunkSize is used to control the init chunk size during query execution. TiDBInitChunkSize = "tidb_init_chunk_size" @@ -303,6 +332,13 @@ const ( // tidb_window_concurrency is deprecated, use tidb_executor_concurrency instead. TiDBWindowConcurrency = "tidb_window_concurrency" + // tidb_merge_join_concurrency is used for merge join parallel executor + TiDBMergeJoinConcurrency = "tidb_merge_join_concurrency" + + // tidb_stream_agg_concurrency is used for stream aggregation parallel executor. + // tidb_stream_agg_concurrency is deprecated, use tidb_executor_concurrency instead. + TiDBStreamAggConcurrency = "tidb_streamagg_concurrency" + // tidb_enable_parallel_apply is used for parallel apply. TiDBEnableParallelApply = "tidb_enable_parallel_apply" @@ -331,6 +367,15 @@ const ( // TiDBEnableChangeColumnType is used to control whether to enable the change column type. TiDBEnableChangeColumnType = "tidb_enable_change_column_type" + // TiDBEnableChangeMultiSchema is used to control whether to enable the change multi schema. + TiDBEnableChangeMultiSchema = "tidb_enable_change_multi_schema" + + // TiDBEnablePointGetCache is used to control whether to enable the point get cache for special scenario. + TiDBEnablePointGetCache = "tidb_enable_point_get_cache" + + // TiDBEnableAlterPlacement is used to control whether to enable alter table partition. + TiDBEnableAlterPlacement = "tidb_enable_alter_placement" + // tidb_max_delta_schema_count defines the max length of deltaSchemaInfos. // deltaSchemaInfos is a queue that maintains the history of schema changes. TiDBMaxDeltaSchemaCount = "tidb_max_delta_schema_count" @@ -359,6 +404,9 @@ const ( // tidb_enable_window_function is used to control whether to enable the window function. TiDBEnableWindowFunction = "tidb_enable_window_function" + // tidb_enable_strict_double_type_check is used to control table field double type syntax check. + TiDBEnableStrictDoubleTypeCheck = "tidb_enable_strict_double_type_check" + // tidb_enable_vectorized_expression is used to control whether to enable the vectorized expression evaluation. TiDBEnableVectorizedExpression = "tidb_enable_vectorized_expression" @@ -408,6 +456,9 @@ const ( // TiDBEvolvePlanBaselines indicates whether the evolution of plan baselines is enabled. TiDBEvolvePlanBaselines = "tidb_evolve_plan_baselines" + // TiDBEnableExtendedStats indicates whether the extended statistics feature is enabled. + TiDBEnableExtendedStats = "tidb_enable_extended_stats" + // TiDBIsolationReadEngines indicates the tidb only read from the stores whose engine type is involved in IsolationReadEngines. // Now, only support TiKV and TiFlash. TiDBIsolationReadEngines = "tidb_isolation_read_engines" @@ -433,7 +484,7 @@ const ( // TiDBPartitionPruneMode indicates the partition prune mode used. TiDBPartitionPruneMode = "tidb_partition_prune_mode" - // TiDBSlowLogMasking indicates that whether masking the query data when log slow query. + // TiDBSlowLogMasking is deprecated and a alias of TiDBRedactLog. // Deprecated: use TiDBRedactLog instead. TiDBSlowLogMasking = "tidb_slow_log_masking" @@ -447,6 +498,52 @@ const ( // TiDBEnableAmendPessimisticTxn indicates if amend pessimistic transactions is enabled. TiDBEnableAmendPessimisticTxn = "tidb_enable_amend_pessimistic_txn" + + // TiDBMemoryUsageAlarmRatio indicates the alarm threshold when memory usage of the tidb-server exceeds. + TiDBMemoryUsageAlarmRatio = "tidb_memory_usage_alarm_ratio" + + // TiDBEnableRateLimitAction indicates whether enabled ratelimit action + TiDBEnableRateLimitAction = "tidb_enable_rate_limit_action" + + // TiDBEnableAsyncCommit indicates whether to enable the async commit feature. + TiDBEnableAsyncCommit = "tidb_enable_async_commit" + + // TiDBEnable1PC indicates whether to enable the one-phase commit feature. + TiDBEnable1PC = "tidb_enable_1pc" + + // TiDBGuaranteeLinearizability indicates whether to guarantee linearizability. + TiDBGuaranteeLinearizability = "tidb_guarantee_linearizability" + + // TiDBAnalyzeVersion indicates the how tidb collects the analyzed statistics and how use to it. + TiDBAnalyzeVersion = "tidb_analyze_version" + + // TiDBEnableIndexMergeJoin indicates whether to enable index merge join. + TiDBEnableIndexMergeJoin = "tidb_enable_index_merge_join" + + // TiDBTrackAggregateMemoryUsage indicates whether track the memory usage of aggregate function. + TiDBTrackAggregateMemoryUsage = "tidb_track_aggregate_memory_usage" + + // TiDBEnableExchangePartition indicates whether to enable exchange partition. + TiDBEnableExchangePartition = "tidb_enable_exchange_partition" + + // TiDBAllowFallbackToTiKV indicates the engine types whose unavailability triggers fallback to TiKV. + // Now we only support TiFlash. + TiDBAllowFallbackToTiKV = "tidb_allow_fallback_to_tikv" +) + +// TiDB vars that have only global scope + +const ( + // TiDBGCEnable turns garbage collection on or OFF + TiDBGCEnable = "tidb_gc_enable" + // TiDBGCRunInterval sets the interval that GC runs + TiDBGCRunInterval = "tidb_gc_run_interval" + // TiDBGCLifetime sets the retention window of older versions + TiDBGCLifetime = "tidb_gc_life_time" + // TiDBGCConcurrency sets the concurrency of garbage collection. -1 = AUTO value + TiDBGCConcurrency = "tidb_gc_concurrency" + // TiDBGCScanLockMode enables the green GC feature (default) + TiDBGCScanLockMode = "tidb_gc_scan_lock_mode" ) // Default TiDB system variable values. @@ -483,6 +580,7 @@ const ( DefOptDiskFactor = 1.5 DefOptConcurrencyFactor = 3.0 DefOptInSubqToJoinAndAgg = true + DefOptPreferRangeScan = false DefBatchInsert = false DefBatchDelete = false DefBatchCommit = false @@ -492,23 +590,26 @@ const ( DefDMLBatchSize = 0 DefMaxPreparedStmtCount = -1 DefWaitTimeout = 0 + DefTiDBMemQuotaApplyCache = 32 << 20 // 32MB. DefTiDBMemQuotaHashJoin = 32 << 30 // 32GB. DefTiDBMemQuotaMergeJoin = 32 << 30 // 32GB. DefTiDBMemQuotaSort = 32 << 30 // 32GB. DefTiDBMemQuotaTopn = 32 << 30 // 32GB. DefTiDBMemQuotaIndexLookupReader = 32 << 30 // 32GB. DefTiDBMemQuotaIndexLookupJoin = 32 << 30 // 32GB. - DefTiDBMemQuotaNestedLoopApply = 32 << 30 // 32GB. DefTiDBMemQuotaDistSQL = 32 << 30 // 32GB. - DefTiDBGeneralLog = 0 + DefTiDBGeneralLog = false DefTiDBPProfSQLCPU = 0 DefTiDBRetryLimit = 10 DefTiDBDisableTxnAutoRetry = true DefTiDBConstraintCheckInPlace = false DefTiDBHashJoinConcurrency = ConcurrencyUnset DefTiDBProjectionConcurrency = ConcurrencyUnset + DefBroadcastJoinThresholdSize = 100 * 1024 * 1024 + DefBroadcastJoinThresholdCount = 10 * 1024 DefTiDBOptimizerSelectivityLevel = 0 DefTiDBAllowBatchCop = 1 + DefTiDBAllowMPPExecution = false DefTiDBTxnMode = "" DefTiDBRowFormatV1 = 1 DefTiDBRowFormatV2 = 2 @@ -517,12 +618,18 @@ const ( DefTiDBDDLErrorCountLimit = 512 DefTiDBMaxDeltaSchemaCount = 1024 DefTiDBChangeColumnType = false + DefTiDBChangeMultiSchema = false + DefTiDBPointGetCache = false + DefTiDBEnableAlterPlacement = false DefTiDBHashAggPartialConcurrency = ConcurrencyUnset DefTiDBHashAggFinalConcurrency = ConcurrencyUnset DefTiDBWindowConcurrency = ConcurrencyUnset + DefTiDBMergeJoinConcurrency = 1 // disable optimization by default + DefTiDBStreamAggConcurrency = 1 DefTiDBForcePriority = mysql.NoPriority DefTiDBUseRadixJoin = false DefEnableWindowFunction = true + DefEnableStrictDoubleTypeCheck = true DefEnableVectorizedExpression = true DefTiDBOptJoinReorderThreshold = 0 DefTiDBDDLSlowOprThreshold = 300 @@ -544,24 +651,35 @@ const ( DefTiDBMetricSchemaStep = 60 // 60s DefTiDBMetricSchemaRangeDuration = 60 // 60s DefTiDBFoundInPlanCache = false + DefTiDBFoundInBinding = false DefTiDBEnableCollectExecutionInfo = true DefTiDBAllowAutoRandExplicitInsert = false DefTiDBEnableClusteredIndex = false - DefTiDBSlowLogMasking = false + DefTiDBRedactLog = false DefTiDBShardAllocateStep = math.MaxInt64 DefTiDBEnableTelemetry = true DefTiDBEnableParallelApply = false - DefTiDBEnableAmendPessimisticTxn = true + DefTiDBEnableAmendPessimisticTxn = false + DefTiDBPartitionPruneMode = "static" + DefTiDBEnableRateLimitAction = true + DefTiDBEnableAsyncCommit = false + DefTiDBEnable1PC = false + DefTiDBGuaranteeLinearizability = true + DefTiDBAnalyzeVersion = 1 + DefTiDBEnableIndexMergeJoin = false + DefTiDBTrackAggregateMemoryUsage = true + DefTiDBEnableExchangePartition = false ) // Process global variables. var ( - ProcessGeneralLog uint32 + ProcessGeneralLog = atomic.NewBool(false) EnablePProfSQLCPU = atomic.NewBool(false) ddlReorgWorkerCounter int32 = DefTiDBDDLReorgWorkerCount maxDDLReorgWorkerCount int32 = 128 ddlReorgBatchSize int32 = DefTiDBDDLReorgBatchSize ddlErrorCountlimit int64 = DefTiDBDDLErrorCountLimit + ddlReorgRowFormat int64 = DefTiDBRowFormatV2 maxDeltaSchemaCount int64 = DefTiDBMaxDeltaSchemaCount // Export for testing. MaxDDLReorgBatchSize int32 = 10240 @@ -572,7 +690,31 @@ var ( ServerHostname, _ = os.Hostname() MaxOfMaxAllowedPacket uint64 = 1073741824 ExpensiveQueryTimeThreshold uint64 = DefTiDBExpensiveQueryTimeThreshold - MinExpensiveQueryTimeThreshold uint64 = 10 //10s - CapturePlanBaseline = serverGlobalVariable{globalVal: "0"} + MinExpensiveQueryTimeThreshold uint64 = 10 // 10s + CapturePlanBaseline = serverGlobalVariable{globalVal: BoolOff} DefExecutorConcurrency = 5 + MemoryUsageAlarmRatio = atomic.NewFloat64(config.GetGlobalConfig().Performance.MemoryUsageAlarmRatio) ) + +// FeatureSwitchVariables is used to filter result of show variables, these switches should be turn blind to users. +var FeatureSwitchVariables = []string{ + TiDBEnableChangeColumnType, + TiDBEnablePointGetCache, + TiDBEnableAlterPlacement, + TiDBEnableChangeMultiSchema, + TiDBEnableAsyncCommit, + TiDBEnable1PC, + TiDBGuaranteeLinearizability, + TiDBEnableClusteredIndex, + TiDBTrackAggregateMemoryUsage, +} + +// FilterImplicitFeatureSwitch is used to filter result of show variables, these switches should be turn blind to users. +func FilterImplicitFeatureSwitch(sysVar *SysVar) bool { + for _, one := range FeatureSwitchVariables { + if one == sysVar.Name { + return true + } + } + return false +} diff --git a/sessionctx/variable/varsutil.go b/sessionctx/variable/varsutil.go index 8c43d7e788324..ef37f5c7b9748 100644 --- a/sessionctx/variable/varsutil.go +++ b/sessionctx/variable/varsutil.go @@ -16,21 +16,15 @@ package variable import ( "encoding/json" "fmt" - "math" "strconv" "strings" "sync" "sync/atomic" "time" - "github.com/cznic/mathutil" - "github.com/pingcap/errors" - "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/timeutil" ) @@ -78,6 +72,16 @@ func GetDDLErrorCountLimit() int64 { return atomic.LoadInt64(&ddlErrorCountlimit) } +// SetDDLReorgRowFormat sets ddlReorgRowFormat version. +func SetDDLReorgRowFormat(format int64) { + atomic.StoreInt64(&ddlReorgRowFormat, format) +} + +// GetDDLReorgRowFormat gets ddlReorgRowFormat version. +func GetDDLReorgRowFormat() int64 { + return atomic.LoadInt64(&ddlReorgRowFormat) +} + // SetMaxDeltaSchemaCount sets maxDeltaSchemaCount size. func SetMaxDeltaSchemaCount(cnt int64) { atomic.StoreInt64(&maxDeltaSchemaCount, cnt) @@ -122,8 +126,14 @@ func GetSessionOnlySysVars(s *SessionVars, key string) (string, bool, error) { return "", true, err } return string(info), true, nil + case TiDBLastQueryInfo: + info, err := json.Marshal(s.LastQueryInfo) + if err != nil { + return "", true, err + } + return string(info), true, nil case TiDBGeneralLog: - return fmt.Sprintf("%d", atomic.LoadUint32(&ProcessGeneralLog)), true, nil + return BoolToOnOff(ProcessGeneralLog.Load()), true, nil case TiDBPProfSQLCPU: val := "0" if EnablePProfSQLCPU.Load() { @@ -132,6 +142,8 @@ func GetSessionOnlySysVars(s *SessionVars, key string) (string, bool, error) { return val, true, nil case TiDBExpensiveQueryTimeThreshold: return fmt.Sprintf("%d", atomic.LoadUint64(&ExpensiveQueryTimeThreshold)), true, nil + case TiDBMemoryUsageAlarmRatio: + return fmt.Sprintf("%g", MemoryUsageAlarmRatio.Load()), true, nil case TiDBConfig: conf := config.GetGlobalConfig() j, err := json.MarshalIndent(conf, "", "\t") @@ -152,17 +164,21 @@ func GetSessionOnlySysVars(s *SessionVars, key string) (string, bool, error) { case TiDBRecordPlanInSlowLog: return strconv.FormatUint(uint64(atomic.LoadUint32(&config.GetGlobalConfig().Log.RecordPlanInSlowLog)), 10), true, nil case TiDBEnableSlowLog: - return BoolToIntStr(config.GetGlobalConfig().Log.EnableSlowLog), true, nil + return BoolToOnOff(config.GetGlobalConfig().Log.EnableSlowLog), true, nil case TiDBQueryLogMaxLen: return strconv.FormatUint(atomic.LoadUint64(&config.GetGlobalConfig().Log.QueryLogMaxLen), 10), true, nil case TiDBCheckMb4ValueInUTF8: - return BoolToIntStr(config.GetGlobalConfig().CheckMb4ValueInUTF8), true, nil + return BoolToOnOff(config.GetGlobalConfig().CheckMb4ValueInUTF8), true, nil case TiDBCapturePlanBaseline: return CapturePlanBaseline.GetVal(), true, nil case TiDBFoundInPlanCache: - return BoolToIntStr(s.PrevFoundInPlanCache), true, nil + return BoolToOnOff(s.PrevFoundInPlanCache), true, nil + case TiDBFoundInBinding: + return BoolToOnOff(s.PrevFoundInBinding), true, nil case TiDBEnableCollectExecutionInfo: - return BoolToIntStr(config.GetGlobalConfig().EnableCollectExecutionInfo), true, nil + return BoolToOnOff(config.GetGlobalConfig().EnableCollectExecutionInfo), true, nil + case TiDBTxnScope: + return s.TxnScope.GetVarValue(), true, nil } sVal, ok := s.GetSystemVar(key) if ok { @@ -209,7 +225,7 @@ const epochShiftBits = 18 func SetSessionSystemVar(vars *SessionVars, name string, value types.Datum) error { sysVar := GetSysVar(name) if sysVar == nil { - return ErrUnknownSystemVar + return ErrUnknownSystemVar.GenWithStackByArgs(name) } sVal := "" var err error @@ -227,6 +243,21 @@ func SetSessionSystemVar(vars *SessionVars, name string, value types.Datum) erro return vars.SetSystemVar(name, sVal) } +// SetStmtVar sets system variable and updates SessionVars states. +func SetStmtVar(vars *SessionVars, name string, value string) error { + name = strings.ToLower(name) + sysVar := GetSysVar(name) + if sysVar == nil { + return ErrUnknownSystemVar + } + sVal, err := ValidateSetSystemVar(vars, name, value, ScopeSession) + if err != nil { + return err + } + CheckDeprecationSetSystemVar(vars, name) + return vars.SetStmtVar(name, sVal) +} + // ValidateGetSystemVar checks if system variable exists and validates its scope when get system variable. func ValidateGetSystemVar(name string, isGlobal bool) error { sysVar := GetSysVar(name) @@ -246,124 +277,6 @@ func ValidateGetSystemVar(name string, isGlobal bool) error { return nil } -func checkUInt64SystemVar(name, value string, min, max uint64, vars *SessionVars) (string, error) { - // There are two types of validation behaviors for integer values. The default - // is to return an error saying the value is out of range. For MySQL compatibility, some - // values prefer convert the value to the min/max and return a warning. - sv := GetSysVar(name) - if sv != nil && !sv.AutoConvertOutOfRange { - return checkUint64SystemVarWithError(name, value, min, max) - } - if len(value) == 0 { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if value[0] == '-' { - _, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(name, value)) - return fmt.Sprintf("%d", min), nil - } - val, err := strconv.ParseUint(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if val < min { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(name, value)) - return fmt.Sprintf("%d", min), nil - } - if val > max { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(name, value)) - return fmt.Sprintf("%d", max), nil - } - return value, nil -} - -func checkInt64SystemVar(name, value string, min, max int64, vars *SessionVars) (string, error) { - // There are two types of validation behaviors for integer values. The default - // is to return an error saying the value is out of range. For MySQL compatibility, some - // values prefer convert the value to the min/max and return a warning. - sv := GetSysVar(name) - if sv != nil && !sv.AutoConvertOutOfRange { - return checkInt64SystemVarWithError(name, value, min, max) - } - val, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if val < min { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(name, value)) - return fmt.Sprintf("%d", min), nil - } - if val > max { - vars.StmtCtx.AppendWarning(ErrTruncatedWrongValue.GenWithStackByArgs(name, value)) - return fmt.Sprintf("%d", max), nil - } - return value, nil -} - -func checkBoolSystemVar(name, value string, vars *SessionVars) (string, error) { - if strings.EqualFold(value, "ON") { - return "1", nil - } else if strings.EqualFold(value, "OFF") { - return "0", nil - } - val, err := strconv.ParseInt(value, 10, 64) - if err == nil { - // Confusingly, there are two types of conversion rules for integer values. - // The default only allows 0 || 1, but a subset of values convert any - // negative integer to 1. - sv := GetSysVar(name) - if !sv.AutoConvertNegativeBool { - if val == 0 { - return "0", nil - } else if val == 1 { - return "1", nil - } - } else { - if val == 1 || val < 0 { - return "1", nil - } else if val == 0 { - return "0", nil - } - } - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) -} - -func checkUint64SystemVarWithError(name, value string, min, max uint64) (string, error) { - if len(value) == 0 { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if value[0] == '-' { - // // in strict it expects the error WrongValue, but in non-strict it returns WrongType - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - val, err := strconv.ParseUint(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if val < min || val > max { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil -} - -func checkInt64SystemVarWithError(name, value string, min, max int64) (string, error) { - if len(value) == 0 { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - val, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if val < min || val > max { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil -} - const ( // initChunkSizeUpperBound indicates upper bound value of tidb_init_chunk_size. initChunkSizeUpperBound = 32 @@ -376,12 +289,11 @@ func CheckDeprecationSetSystemVar(s *SessionVars, name string) { switch name { case TiDBIndexLookupConcurrency, TiDBIndexLookupJoinConcurrency, TiDBHashJoinConcurrency, TiDBHashAggPartialConcurrency, TiDBHashAggFinalConcurrency, - TiDBProjectionConcurrency, TiDBWindowConcurrency: + TiDBProjectionConcurrency, TiDBWindowConcurrency, TiDBMergeJoinConcurrency, TiDBStreamAggConcurrency: s.StmtCtx.AppendWarning(errWarnDeprecatedSyntax.FastGenByArgs(name, TiDBExecutorConcurrency)) case TIDBMemQuotaHashJoin, TIDBMemQuotaMergeJoin, TIDBMemQuotaSort, TIDBMemQuotaTopn, - TIDBMemQuotaIndexLookupReader, TIDBMemQuotaIndexLookupJoin, - TIDBMemQuotaNestedLoopApply: + TIDBMemQuotaIndexLookupReader, TIDBMemQuotaIndexLookupJoin: s.StmtCtx.AppendWarning(errWarnDeprecatedSyntax.FastGenByArgs(name, TIDBMemQuotaQuery)) } } @@ -389,363 +301,17 @@ func CheckDeprecationSetSystemVar(s *SessionVars, name string) { // ValidateSetSystemVar checks if system variable satisfies specific restriction. func ValidateSetSystemVar(vars *SessionVars, name string, value string, scope ScopeFlag) (string, error) { sv := GetSysVar(name) - // The string "DEFAULT" is a special keyword in MySQL, which restores - // the compiled sysvar value. In which case we can skip further validation. - if strings.EqualFold(value, "DEFAULT") { - if sv != nil { - return sv.Value, nil - } + if sv == nil { return value, ErrUnknownSystemVar.GenWithStackByArgs(name) } - // Attempt to provide validation using the SysVar struct. - // Eventually the struct should handle all validation - var err error - if sv != nil { - switch sv.Type { - case TypeUnsigned: - value, err = checkUInt64SystemVar(name, value, uint64(sv.MinValue), sv.MaxValue, vars) - case TypeInt: - value, err = checkInt64SystemVar(name, value, sv.MinValue, int64(sv.MaxValue), vars) - case TypeBool: - value, err = checkBoolSystemVar(name, value, vars) - } - // If there is no error, follow through and handle legacy cases of validation that are not handled by the type. - // TODO: Move each of these validations into the SysVar as an anonymous function. - if err != nil { - return value, err - } - } - switch name { - case DelayKeyWrite: - if strings.EqualFold(value, "ON") || value == "1" { - return "ON", nil - } else if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } else if strings.EqualFold(value, "ALL") || value == "2" { - return "ALL", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case ForeignKeyChecks: - if strings.EqualFold(value, "ON") || value == "1" { - // TiDB does not yet support foreign keys. - // For now, resist the change and show a warning. - vars.StmtCtx.AppendWarning(ErrUnsupportedValueForVar.GenWithStackByArgs(name, value)) - return "OFF", nil - } else if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case GroupConcatMaxLen: - // https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_group_concat_max_len - // Minimum Value 4 - // Maximum Value (64-bit platforms) 18446744073709551615 - // Maximum Value (32-bit platforms) 4294967295 - maxLen := uint64(math.MaxUint64) - if mathutil.IntBits == 32 { - maxLen = uint64(math.MaxUint32) - } - return checkUInt64SystemVar(name, value, 4, maxLen, vars) - case SessionTrackGtids: - if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } else if strings.EqualFold(value, "OWN_GTID") || value == "1" { - return "OWN_GTID", nil - } else if strings.EqualFold(value, "ALL_GTIDS") || value == "2" { - return "ALL_GTIDS", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TimeZone: - if strings.EqualFold(value, "SYSTEM") { - return "SYSTEM", nil - } - _, err := parseTimeZone(value) - return value, err - case WarningCount, ErrorCount: - return value, ErrReadOnly.GenWithStackByArgs(name) - case EnforceGtidConsistency: - if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } else if strings.EqualFold(value, "ON") || value == "1" { - return "ON", nil - } else if strings.EqualFold(value, "WARN") || value == "2" { - return "WARN", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case QueryCacheType: - if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } else if strings.EqualFold(value, "ON") || value == "1" { - return "ON", nil - } else if strings.EqualFold(value, "DEMAND") || value == "2" { - return "DEMAND", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case SecureAuth: - if strings.EqualFold(value, "ON") || value == "1" { - return "1", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case WindowingUseHighPrecision: - if strings.EqualFold(value, "OFF") || value == "0" { - return "OFF", nil - } else if strings.EqualFold(value, "ON") || value == "1" { - return "ON", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBOptBCJ: - if (strings.EqualFold(value, "ON") || value == "1") && vars.AllowBatchCop == 0 { - return value, ErrWrongValueForVar.GenWithStackByArgs("Can't set Broadcast Join to 1 but tidb_allow_batch_cop is 0, please active batch cop at first.") - } - return value, nil - case TiDBEnableTablePartition: - switch { - case strings.EqualFold(value, "ON") || value == "1": - return "on", nil - case strings.EqualFold(value, "OFF") || value == "0": - return "off", nil - case strings.EqualFold(value, "AUTO"): - return "auto", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBIndexLookupConcurrency, - TiDBIndexLookupJoinConcurrency, - TiDBHashJoinConcurrency, - TiDBHashAggPartialConcurrency, - TiDBHashAggFinalConcurrency, - TiDBWindowConcurrency: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v <= 0 && v != ConcurrencyUnset { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil - case TiDBOptCorrelationThreshold: - v, err := strconv.ParseFloat(value, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v < 0 || v > 1 { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil - case TiDBAllowBatchCop: - v, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v == 0 && vars.AllowBCJ { - return value, ErrWrongValueForVar.GenWithStackByArgs("Can't set batch cop 0 but tidb_opt_broadcast_join is 1, please set tidb_opt_broadcast_join 0 at first") - } - if v < 0 || v > 2 { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil - case TiDBOptCPUFactor, - TiDBOptTiFlashConcurrencyFactor, - TiDBOptCopCPUFactor, - TiDBOptNetworkFactor, - TiDBOptScanFactor, - TiDBOptDescScanFactor, - TiDBOptSeekFactor, - TiDBOptMemoryFactor, - TiDBOptDiskFactor, - TiDBOptConcurrencyFactor: - v, err := strconv.ParseFloat(value, 64) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v < 0 { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil - case TiDBAutoAnalyzeStartTime, TiDBAutoAnalyzeEndTime, TiDBEvolvePlanTaskStartTime, TiDBEvolvePlanTaskEndTime: - v, err := setDayTime(vars, value) - if err != nil { - return "", err - } - return v, nil - case TiDBAutoAnalyzeRatio: - v, err := strconv.ParseFloat(value, 64) - if err != nil || v < 0 { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - return value, nil - case TxnIsolation, TransactionIsolation: - upVal := strings.ToUpper(value) - _, exists := TxIsolationNames[upVal] - if !exists { - return "", ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - switch upVal { - case "SERIALIZABLE", "READ-UNCOMMITTED": - skipIsolationLevelCheck, err := GetSessionSystemVar(vars, TiDBSkipIsolationLevelCheck) - returnErr := ErrUnsupportedIsolationLevel.GenWithStackByArgs(value) - if err != nil { - returnErr = err - } - if !TiDBOptOn(skipIsolationLevelCheck) || err != nil { - return "", returnErr - } - //SET TRANSACTION ISOLATION LEVEL will affect two internal variables: - // 1. tx_isolation - // 2. transaction_isolation - // The following if condition is used to deduplicate two same warnings. - if name == "transaction_isolation" { - vars.StmtCtx.AppendWarning(returnErr) - } - } - return upVal, nil - case TiDBInitChunkSize: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v <= 0 { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - if v > initChunkSizeUpperBound { - return value, errors.Errorf("tidb_init_chunk_size(%d) cannot be bigger than %d", v, initChunkSizeUpperBound) - } - return value, nil - case TiDBMaxChunkSize: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v < maxChunkSizeLowerBound { - return value, errors.Errorf("tidb_max_chunk_size(%d) cannot be smaller than %d", v, maxChunkSizeLowerBound) - } - return value, nil - case TiDBOptJoinReorderThreshold: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v < 0 || v >= 64 { - return value, errors.Errorf("tidb_join_order_algo_threshold(%d) cannot be smaller than 0 or larger than 63", v) - } - case TiDBWaitSplitRegionTimeout: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v <= 0 { - return value, errors.Errorf("tidb_wait_split_region_timeout(%d) cannot be smaller than 1", v) - } - case TiDBReplicaRead: - if strings.EqualFold(value, "follower") { - return "follower", nil - } else if strings.EqualFold(value, "leader-and-follower") { - return "leader-and-follower", nil - } else if strings.EqualFold(value, "leader") || len(value) == 0 { - return "leader", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBTxnMode: - switch strings.ToUpper(value) { - case ast.Pessimistic, ast.Optimistic, "": - default: - return value, ErrWrongValueForVar.GenWithStackByArgs(TiDBTxnMode, value) - } - case TiDBRowFormatVersion: - v, err := strconv.Atoi(value) - if err != nil { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - if v != DefTiDBRowFormatV1 && v != DefTiDBRowFormatV2 { - return value, errors.Errorf("Unsupported row format version %d", v) - } - case TiDBPartitionPruneMode: - if !PartitionPruneMode(value).Valid() { - return value, ErrWrongTypeForVar.GenWithStackByArgs(name) - } - case TiDBAllowRemoveAutoInc, TiDBUsePlanBaselines, TiDBEvolvePlanBaselines, TiDBEnableParallelApply: - switch { - case strings.EqualFold(value, "ON") || value == "1": - return "on", nil - case strings.EqualFold(value, "OFF") || value == "0": - return "off", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBCapturePlanBaseline: - switch { - case strings.EqualFold(value, "ON") || value == "1": - return "on", nil - case strings.EqualFold(value, "OFF") || value == "0": - return "off", nil - case value == "": - return "", nil - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBEnableStmtSummary, TiDBStmtSummaryInternalQuery: - switch { - case strings.EqualFold(value, "ON") || value == "1": - return "1", nil - case strings.EqualFold(value, "OFF") || value == "0": - return "0", nil - case value == "": - if scope == ScopeSession { - return "", nil - } - } - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - case TiDBStmtSummaryRefreshInterval: - if value == "" && scope == ScopeSession { - return "", nil - } - return checkInt64SystemVarWithError(name, value, 1, math.MaxInt32) - case TiDBStmtSummaryHistorySize: - if value == "" && scope == ScopeSession { - return "", nil - } - return checkInt64SystemVarWithError(name, value, 0, math.MaxUint8) - case TiDBStmtSummaryMaxStmtCount: - if value == "" && scope == ScopeSession { - return "", nil - } - return checkInt64SystemVarWithError(name, value, 1, math.MaxInt16) - case TiDBStmtSummaryMaxSQLLength: - if value == "" && scope == ScopeSession { - return "", nil - } - return checkInt64SystemVarWithError(name, value, 0, math.MaxInt32) - case TiDBIsolationReadEngines: - engines := strings.Split(value, ",") - var formatVal string - for i, engine := range engines { - engine = strings.TrimSpace(engine) - if i != 0 { - formatVal += "," - } - switch { - case strings.EqualFold(engine, kv.TiKV.Name()): - formatVal += kv.TiKV.Name() - case strings.EqualFold(engine, kv.TiFlash.Name()): - formatVal += kv.TiFlash.Name() - case strings.EqualFold(engine, kv.TiDB.Name()): - formatVal += kv.TiDB.Name() - default: - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - } - return formatVal, nil - case TiDBMetricSchemaStep, TiDBMetricSchemaRangeDuration: - v, err := strconv.ParseInt(value, 10, 64) - if err != nil { - return value, ErrWrongValueForVar.GenWithStackByArgs(name, value) - } - if v < 10 || v > 60*60*60 { - return value, errors.Errorf("%v(%d) cannot be smaller than %v or larger than %v", name, v, 10, 60*60*60) - } - return value, nil - case CollationConnection, CollationDatabase, CollationServer: - if _, err := collate.GetCollationByName(value); err != nil { - return value, errors.Trace(err) - } + // Normalize the value and apply validation based on type. + // i.e. TypeBool converts 1/on/ON to ON. + normalizedValue, err := sv.ValidateFromType(vars, value, scope) + if err != nil { + return normalizedValue, err } - return value, nil + // If type validation was successful, call the (optional) validation function + return sv.ValidateFromHook(vars, normalizedValue, value, scope) } // TiDBOptOn could be used for all tidb session variable options, we use "ON"/1 to turn on those options. @@ -753,6 +319,26 @@ func TiDBOptOn(opt string) bool { return strings.EqualFold(opt, "ON") || opt == "1" } +const ( + // OffInt is used by TiDBMultiStatementMode + OffInt = 0 + // OnInt is used TiDBMultiStatementMode + OnInt = 1 + // WarnInt is used by TiDBMultiStatementMode + WarnInt = 2 +) + +// TiDBOptMultiStmt converts multi-stmt options to int. +func TiDBOptMultiStmt(opt string) int { + switch opt { + case BoolOff: + return OffInt + case BoolOn: + return OnInt + } + return WarnInt +} + func tidbOptPositiveInt32(opt string, defaultVal int) int { val, err := strconv.Atoi(opt) if err != nil || val <= 0 { @@ -840,26 +426,6 @@ func GoTimeToTS(t time.Time) uint64 { return uint64(ts) } -const ( - localDayTimeFormat = "15:04" - // FullDayTimeFormat is the full format of analyze start time and end time. - FullDayTimeFormat = "15:04 -0700" -) - -func setDayTime(s *SessionVars, val string) (string, error) { - var t time.Time - var err error - if len(val) <= len(localDayTimeFormat) { - t, err = time.ParseInLocation(localDayTimeFormat, val, s.TimeZone) - } else { - t, err = time.ParseInLocation(FullDayTimeFormat, val, s.TimeZone) - } - if err != nil { - return "", err - } - return t.Format(FullDayTimeFormat), nil -} - // serverGlobalVariable is used to handle variables that acts in server and global scope. type serverGlobalVariable struct { sync.Mutex diff --git a/sessionctx/variable/varsutil_test.go b/sessionctx/variable/varsutil_test.go index 9dbf0443f3a4e..b5ad1c5b20486 100644 --- a/sessionctx/variable/varsutil_test.go +++ b/sessionctx/variable/varsutil_test.go @@ -74,11 +74,15 @@ func (s *testVarsutilSuite) TestNewSessionVars(c *C) { c.Assert(vars.hashAggPartialConcurrency, Equals, ConcurrencyUnset) c.Assert(vars.hashAggFinalConcurrency, Equals, ConcurrencyUnset) c.Assert(vars.windowConcurrency, Equals, ConcurrencyUnset) + c.Assert(vars.mergeJoinConcurrency, Equals, DefTiDBMergeJoinConcurrency) + c.Assert(vars.streamAggConcurrency, Equals, DefTiDBStreamAggConcurrency) c.Assert(vars.distSQLScanConcurrency, Equals, DefDistSQLScanConcurrency) c.Assert(vars.ProjectionConcurrency(), Equals, DefExecutorConcurrency) c.Assert(vars.HashAggPartialConcurrency(), Equals, DefExecutorConcurrency) c.Assert(vars.HashAggFinalConcurrency(), Equals, DefExecutorConcurrency) c.Assert(vars.WindowConcurrency(), Equals, DefExecutorConcurrency) + c.Assert(vars.MergeJoinConcurrency(), Equals, DefTiDBMergeJoinConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, DefTiDBStreamAggConcurrency) c.Assert(vars.DistSQLScanConcurrency(), Equals, DefDistSQLScanConcurrency) c.Assert(vars.ExecutorConcurrency, Equals, DefExecutorConcurrency) c.Assert(vars.MaxChunkSize, Equals, DefMaxChunkSize) @@ -90,15 +94,17 @@ func (s *testVarsutilSuite) TestNewSessionVars(c *C) { c.Assert(vars.MemQuotaTopn, Equals, int64(DefTiDBMemQuotaTopn)) c.Assert(vars.MemQuotaIndexLookupReader, Equals, int64(DefTiDBMemQuotaIndexLookupReader)) c.Assert(vars.MemQuotaIndexLookupJoin, Equals, int64(DefTiDBMemQuotaIndexLookupJoin)) - c.Assert(vars.MemQuotaNestedLoopApply, Equals, int64(DefTiDBMemQuotaNestedLoopApply)) + c.Assert(vars.MemQuotaApplyCache, Equals, int64(DefTiDBMemQuotaApplyCache)) c.Assert(vars.EnableRadixJoin, Equals, DefTiDBUseRadixJoin) c.Assert(vars.AllowWriteRowID, Equals, DefOptWriteRowID) c.Assert(vars.TiDBOptJoinReorderThreshold, Equals, DefTiDBOptJoinReorderThreshold) c.Assert(vars.EnableFastAnalyze, Equals, DefTiDBUseFastAnalyze) c.Assert(vars.FoundInPlanCache, Equals, DefTiDBFoundInPlanCache) + c.Assert(vars.FoundInBinding, Equals, DefTiDBFoundInBinding) c.Assert(vars.AllowAutoRandExplicitInsert, Equals, DefTiDBAllowAutoRandExplicitInsert) c.Assert(vars.ShardAllocateStep, Equals, int64(DefTiDBShardAllocateStep)) c.Assert(vars.EnableChangeColumnType, Equals, DefTiDBChangeColumnType) + c.Assert(vars.AnalyzeVersion, Equals, DefTiDBAnalyzeVersion) assertFieldsGreaterThanZero(c, reflect.ValueOf(vars.MemQuota)) assertFieldsGreaterThanZero(c, reflect.ValueOf(vars.BatchSize)) @@ -120,7 +126,7 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { c.Assert(err, IsNil) val, err := GetSessionSystemVar(v, "autocommit") c.Assert(err, IsNil) - c.Assert(val, Equals, "1") + c.Assert(val, Equals, "ON") c.Assert(SetSessionSystemVar(v, "autocommit", types.Datum{}), NotNil) // 0 converts to OFF @@ -166,8 +172,8 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { }{ {"Europe/Helsinki", "Europe/Helsinki", true, -2 * time.Hour, nil}, {"US/Eastern", "US/Eastern", true, 5 * time.Hour, nil}, - //TODO: Check it out and reopen this case. - //{"SYSTEM", "Local", false, 0}, + // TODO: Check it out and reopen this case. + // {"SYSTEM", "Local", false, 0}, {"+10:00", "", true, -10 * time.Hour, nil}, {"-6:00", "", true, 6 * time.Hour, nil}, {"+14:00", "", true, -14 * time.Hour, nil}, @@ -240,7 +246,7 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { // Test case for TiDBConfig session variable. err = SetSessionSystemVar(v, TiDBConfig, types.NewStringDatum("abc")) - c.Assert(terror.ErrorEqual(err, ErrReadOnly), IsTrue) + c.Assert(terror.ErrorEqual(err, ErrIncorrectScope), IsTrue) val, err = GetSessionSystemVar(v, TiDBConfig) c.Assert(err, IsNil) bVal, err := json.MarshalIndent(config.GetGlobalConfig(), "", "\t") @@ -250,12 +256,12 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { SetSessionSystemVar(v, TiDBEnableStreaming, types.NewStringDatum("1")) val, err = GetSessionSystemVar(v, TiDBEnableStreaming) c.Assert(err, IsNil) - c.Assert(val, Equals, "1") + c.Assert(val, Equals, "ON") c.Assert(v.EnableStreaming, Equals, true) SetSessionSystemVar(v, TiDBEnableStreaming, types.NewStringDatum("0")) val, err = GetSessionSystemVar(v, TiDBEnableStreaming) c.Assert(err, IsNil) - c.Assert(val, Equals, "0") + c.Assert(val, Equals, "OFF") c.Assert(v.EnableStreaming, Equals, false) c.Assert(v.OptimizerSelectivityLevel, Equals, DefTiDBOptimizerSelectivityLevel) @@ -280,8 +286,16 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { c.Assert(err, IsNil) val, err = GetSessionSystemVar(v, TiDBEnableTablePartition) c.Assert(err, IsNil) - c.Assert(val, Equals, "on") - c.Assert(v.EnableTablePartition, Equals, "on") + c.Assert(val, Equals, "ON") + c.Assert(v.EnableTablePartition, Equals, "ON") + + c.Assert(v.EnableListTablePartition, Equals, false) + err = SetSessionSystemVar(v, TiDBEnableListTablePartition, types.NewStringDatum("on")) + c.Assert(err, IsNil) + val, err = GetSessionSystemVar(v, TiDBEnableListTablePartition) + c.Assert(err, IsNil) + c.Assert(val, Equals, "ON") + c.Assert(v.EnableListTablePartition, Equals, true) c.Assert(v.TiDBOptJoinReorderThreshold, Equals, DefTiDBOptJoinReorderThreshold) err = SetSessionSystemVar(v, TiDBOptJoinReorderThreshold, types.NewIntDatum(5)) @@ -295,24 +309,24 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { c.Assert(err, IsNil) val, err = GetSessionSystemVar(v, TiDBCheckMb4ValueInUTF8) c.Assert(err, IsNil) - c.Assert(val, Equals, "1") + c.Assert(val, Equals, "ON") c.Assert(config.GetGlobalConfig().CheckMb4ValueInUTF8, Equals, true) err = SetSessionSystemVar(v, TiDBCheckMb4ValueInUTF8, types.NewStringDatum("0")) c.Assert(err, IsNil) val, err = GetSessionSystemVar(v, TiDBCheckMb4ValueInUTF8) c.Assert(err, IsNil) - c.Assert(val, Equals, "0") + c.Assert(val, Equals, "OFF") c.Assert(config.GetGlobalConfig().CheckMb4ValueInUTF8, Equals, false) SetSessionSystemVar(v, TiDBLowResolutionTSO, types.NewStringDatum("1")) val, err = GetSessionSystemVar(v, TiDBLowResolutionTSO) c.Assert(err, IsNil) - c.Assert(val, Equals, "1") + c.Assert(val, Equals, "ON") c.Assert(v.LowResolutionTSO, Equals, true) SetSessionSystemVar(v, TiDBLowResolutionTSO, types.NewStringDatum("0")) val, err = GetSessionSystemVar(v, TiDBLowResolutionTSO) c.Assert(err, IsNil) - c.Assert(val, Equals, "0") + c.Assert(val, Equals, "OFF") c.Assert(v.LowResolutionTSO, Equals, false) c.Assert(v.CorrelationThreshold, Equals, 0.9) @@ -419,11 +433,17 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { c.Assert(val, Equals, "leader-and-follower") c.Assert(v.GetReplicaRead(), Equals, kv.ReplicaReadMixed) - err = SetSessionSystemVar(v, TiDBEnableStmtSummary, types.NewStringDatum("on")) + err = SetSessionSystemVar(v, TiDBEnableStmtSummary, types.NewStringDatum("ON")) c.Assert(err, IsNil) val, err = GetSessionSystemVar(v, TiDBEnableStmtSummary) c.Assert(err, IsNil) - c.Assert(val, Equals, "1") + c.Assert(val, Equals, "ON") + + err = SetSessionSystemVar(v, TiDBRedactLog, types.NewStringDatum("ON")) + c.Assert(err, IsNil) + val, err = GetSessionSystemVar(v, TiDBRedactLog) + c.Assert(err, IsNil) + c.Assert(val, Equals, "ON") err = SetSessionSystemVar(v, TiDBStmtSummaryRefreshInterval, types.NewStringDatum("10")) c.Assert(err, IsNil) @@ -454,18 +474,23 @@ func (s *testVarsutilSuite) TestVarsutil(c *C) { c.Assert(err, ErrorMatches, ".*Incorrect argument type to variable 'tidb_stmt_summary_max_sql_length'") err = SetSessionSystemVar(v, TiDBFoundInPlanCache, types.NewStringDatum("1")) - c.Assert(err, IsNil) - val, err = GetSessionSystemVar(v, TiDBFoundInPlanCache) - c.Assert(err, IsNil) - c.Assert(val, Equals, "0") - c.Assert(v.systems[TiDBFoundInPlanCache], Equals, "1") + c.Assert(err, ErrorMatches, ".*]Variable 'last_plan_from_cache' is a read only variable") - err = SetSessionSystemVar(v, TiDBEnableChangeColumnType, types.NewStringDatum("on")) + err = SetSessionSystemVar(v, TiDBFoundInBinding, types.NewStringDatum("1")) + c.Assert(err, ErrorMatches, ".*]Variable 'last_plan_from_binding' is a read only variable") + + err = SetSessionSystemVar(v, TiDBEnableChangeColumnType, types.NewStringDatum("ON")) c.Assert(err, IsNil) val, err = GetSessionSystemVar(v, TiDBEnableChangeColumnType) c.Assert(err, IsNil) - c.Assert(val, Equals, "1") - c.Assert(v.systems[TiDBEnableChangeColumnType], Equals, "1") + c.Assert(val, Equals, "ON") + c.Assert(v.systems[TiDBEnableChangeColumnType], Equals, "ON") + + err = SetSessionSystemVar(v, "UnknownVariable", types.NewStringDatum("on")) + c.Assert(err, ErrorMatches, ".*]Unknown system variable 'UnknownVariable'") + + err = SetSessionSystemVar(v, TiDBAnalyzeVersion, types.NewStringDatum("3")) + c.Assert(err, ErrorMatches, ".*Variable 'tidb_analyze_version' can't be set to the value of '3'") } func (s *testVarsutilSuite) TestSetOverflowBehave(c *C) { @@ -523,6 +548,9 @@ func (s *testVarsutilSuite) TestValidate(c *C) { {TiDBEnableTablePartition, "OFF", false}, {TiDBEnableTablePartition, "AUTO", false}, {TiDBEnableTablePartition, "UN", true}, + {TiDBEnableListTablePartition, "ON", false}, + {TiDBEnableListTablePartition, "OFF", false}, + {TiDBEnableListTablePartition, "list", true}, {TiDBOptCorrelationExpFactor, "a", true}, {TiDBOptCorrelationExpFactor, "-10", true}, {TiDBOptCorrelationThreshold, "a", true}, @@ -568,6 +596,12 @@ func (s *testVarsutilSuite) TestValidate(c *C) { {TiDBEnableAmendPessimisticTxn, "0", false}, {TiDBEnableAmendPessimisticTxn, "1", false}, {TiDBEnableAmendPessimisticTxn, "256", true}, + {TiDBAllowFallbackToTiKV, "", false}, + {TiDBAllowFallbackToTiKV, "tiflash", false}, + {TiDBAllowFallbackToTiKV, " tiflash ", false}, + {TiDBAllowFallbackToTiKV, "tikv", true}, + {TiDBAllowFallbackToTiKV, "tidb", true}, + {TiDBAllowFallbackToTiKV, "tiflash,tikv,tidb", true}, } for _, t := range tests { @@ -647,6 +681,22 @@ func (s *testVarsutilSuite) TestConcurrencyVariables(c *C) { c.Assert(vars.windowConcurrency, Equals, wdConcurrency) c.Assert(vars.WindowConcurrency(), Equals, wdConcurrency) + mjConcurrency := 2 + c.Assert(vars.mergeJoinConcurrency, Equals, DefTiDBMergeJoinConcurrency) + c.Assert(vars.MergeJoinConcurrency(), Equals, DefTiDBMergeJoinConcurrency) + err = SetSessionSystemVar(vars, TiDBMergeJoinConcurrency, types.NewIntDatum(int64(mjConcurrency))) + c.Assert(err, IsNil) + c.Assert(vars.mergeJoinConcurrency, Equals, mjConcurrency) + c.Assert(vars.MergeJoinConcurrency(), Equals, mjConcurrency) + + saConcurrency := 2 + c.Assert(vars.streamAggConcurrency, Equals, DefTiDBStreamAggConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, DefTiDBStreamAggConcurrency) + err = SetSessionSystemVar(vars, TiDBStreamAggConcurrency, types.NewIntDatum(int64(saConcurrency))) + c.Assert(err, IsNil) + c.Assert(vars.streamAggConcurrency, Equals, saConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, saConcurrency) + c.Assert(vars.indexLookupConcurrency, Equals, ConcurrencyUnset) c.Assert(vars.IndexLookupConcurrency(), Equals, DefExecutorConcurrency) exeConcurrency := DefExecutorConcurrency + 1 @@ -655,4 +705,7 @@ func (s *testVarsutilSuite) TestConcurrencyVariables(c *C) { c.Assert(vars.indexLookupConcurrency, Equals, ConcurrencyUnset) c.Assert(vars.IndexLookupConcurrency(), Equals, exeConcurrency) c.Assert(vars.WindowConcurrency(), Equals, wdConcurrency) + c.Assert(vars.MergeJoinConcurrency(), Equals, mjConcurrency) + c.Assert(vars.StreamAggConcurrency(), Equals, saConcurrency) + } diff --git a/statistics/analyze_jobs.go b/statistics/analyze_jobs.go index ded4b7d66225d..18fe32c4e3d3a 100644 --- a/statistics/analyze_jobs.go +++ b/statistics/analyze_jobs.go @@ -92,6 +92,9 @@ func GetAllAnalyzeJobs() []*AnalyzeJob { // Start marks status of the analyze job as running and update the start time. func (job *AnalyzeJob) Start() { + if job == nil { + return + } job.Mutex.Lock() job.State = running now := time.Now() @@ -102,6 +105,9 @@ func (job *AnalyzeJob) Start() { // Update updates the row count of analyze job. func (job *AnalyzeJob) Update(rowCount int64) { + if job == nil { + return + } job.Mutex.Lock() job.RowCount += rowCount job.updateTime = time.Now() @@ -110,6 +116,9 @@ func (job *AnalyzeJob) Update(rowCount int64) { // Finish update the status of analyze job to finished or failed according to `meetError`. func (job *AnalyzeJob) Finish(meetError bool) { + if job == nil { + return + } job.Mutex.Lock() if meetError { job.State = failed @@ -121,6 +130,9 @@ func (job *AnalyzeJob) Finish(meetError bool) { } func (job *AnalyzeJob) getUpdateTime() time.Time { + if job == nil { + return time.Time{} + } job.Mutex.Lock() defer job.Mutex.Unlock() return job.updateTime diff --git a/statistics/builder.go b/statistics/builder.go index 45ae0a5678c3f..81c2f52dc84a9 100644 --- a/statistics/builder.go +++ b/statistics/builder.go @@ -14,10 +14,13 @@ package statistics import ( + "bytes" + "github.com/pingcap/errors" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/codec" ) // SortedBuilder is used to build histograms for PK and index. @@ -29,15 +32,17 @@ type SortedBuilder struct { bucketIdx int64 Count int64 hist *Histogram + needBucketNDV bool } // NewSortedBuilder creates a new SortedBuilder. -func NewSortedBuilder(sc *stmtctx.StatementContext, numBuckets, id int64, tp *types.FieldType) *SortedBuilder { +func NewSortedBuilder(sc *stmtctx.StatementContext, numBuckets, id int64, tp *types.FieldType, statsVer int) *SortedBuilder { return &SortedBuilder{ sc: sc, numBuckets: numBuckets, valuesPerBucket: 1, hist: NewHistogram(id, 0, 0, 0, tp, int(numBuckets), 0), + needBucketNDV: statsVer == Version2, } } @@ -49,8 +54,14 @@ func (b *SortedBuilder) Hist() *Histogram { // Iterate updates the histogram incrementally. func (b *SortedBuilder) Iterate(data types.Datum) error { b.Count++ + appendBucket := b.hist.AppendBucket + if b.needBucketNDV { + appendBucket = func(lower, upper *types.Datum, count, repeat int64) { + b.hist.AppendBucketWithNDV(lower, upper, count, repeat, 1) + } + } if b.Count == 1 { - b.hist.AppendBucket(&data, &data, 1, 1) + appendBucket(&data, &data, 1, 1) b.hist.NDV = 1 return nil } @@ -66,7 +77,7 @@ func (b *SortedBuilder) Iterate(data types.Datum) error { b.hist.Buckets[b.bucketIdx].Repeat++ } else if b.hist.Buckets[b.bucketIdx].Count+1-b.lastNumber <= b.valuesPerBucket { // The bucket still have room to store a new item, update the bucket. - b.hist.updateLastBucket(&data, b.hist.Buckets[b.bucketIdx].Count+1, 1) + b.hist.updateLastBucket(&data, b.hist.Buckets[b.bucketIdx].Count+1, 1, b.needBucketNDV) b.hist.NDV++ } else { // All buckets are full, we should merge buckets. @@ -82,11 +93,11 @@ func (b *SortedBuilder) Iterate(data types.Datum) error { } // We may merge buckets, so we should check it again. if b.hist.Buckets[b.bucketIdx].Count+1-b.lastNumber <= b.valuesPerBucket { - b.hist.updateLastBucket(&data, b.hist.Buckets[b.bucketIdx].Count+1, 1) + b.hist.updateLastBucket(&data, b.hist.Buckets[b.bucketIdx].Count+1, 1, b.needBucketNDV) } else { b.lastNumber = b.hist.Buckets[b.bucketIdx].Count b.bucketIdx++ - b.hist.AppendBucket(&data, &data, b.lastNumber+1, 1) + appendBucket(&data, &data, b.lastNumber+1, 1) } b.hist.NDV++ } @@ -116,26 +127,38 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa } hg := NewHistogram(id, ndv, nullCount, 0, tp, int(numBuckets), collector.TotalSize) + corrXYSum, err := buildHist(sc, hg, samples, count, ndv, numBuckets) + if err != nil { + return nil, err + } + hg.Correlation = calcCorrelation(int64(len(samples)), corrXYSum) + return hg, nil +} + +// buildHist builds histogram from samples and other information. +// It stores the built histogram in hg and return corrXYSum used for calculating the correlation. +func buildHist(sc *stmtctx.StatementContext, hg *Histogram, samples []*SampleItem, count, ndv, numBuckets int64) (corrXYSum float64, err error) { sampleNum := int64(len(samples)) // As we use samples to build the histogram, the bucket number and repeat should multiply a factor. - sampleFactor := float64(count) / float64(len(samples)) + sampleFactor := float64(count) / float64(sampleNum) + ndvFactor := float64(count) / float64(ndv) + if ndvFactor > sampleFactor { + ndvFactor = sampleFactor + } // Since bucket count is increased by sampleFactor, so the actual max values per bucket is // floor(valuesPerBucket/sampleFactor)*sampleFactor, which may less than valuesPerBucket, // thus we need to add a sampleFactor to avoid building too many buckets. valuesPerBucket := float64(count)/float64(numBuckets) + sampleFactor - ndvFactor := float64(count) / float64(hg.NDV) - if ndvFactor > sampleFactor { - ndvFactor = sampleFactor - } + bucketIdx := 0 var lastCount int64 - var corrXYSum float64 + corrXYSum = float64(0) hg.AppendBucket(&samples[0].Value, &samples[0].Value, int64(sampleFactor), int64(ndvFactor)) for i := int64(1); i < sampleNum; i++ { corrXYSum += float64(i) * float64(samples[i].Ordinal) cmp, err := hg.GetUpper(bucketIdx).CompareDatum(sc, &samples[i].Value) if err != nil { - return nil, errors.Trace(err) + return 0, errors.Trace(err) } totalCount := float64(i+1) * sampleFactor if cmp == 0 { @@ -143,14 +166,14 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa // a same value only stored in a single bucket, we do not increase bucketIdx even if it exceeds // valuesPerBucket. hg.Buckets[bucketIdx].Count = int64(totalCount) - if float64(hg.Buckets[bucketIdx].Repeat) == ndvFactor { + if hg.Buckets[bucketIdx].Repeat == int64(ndvFactor) { hg.Buckets[bucketIdx].Repeat = int64(2 * sampleFactor) } else { hg.Buckets[bucketIdx].Repeat += int64(sampleFactor) } } else if totalCount-float64(lastCount) <= valuesPerBucket { // The bucket still have room to store a new item, update the bucket. - hg.updateLastBucket(&samples[i].Value, int64(totalCount), int64(ndvFactor)) + hg.updateLastBucket(&samples[i].Value, int64(totalCount), int64(ndvFactor), false) } else { lastCount = hg.Buckets[bucketIdx].Count // The bucket is full, store the item in the next bucket. @@ -158,12 +181,15 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa hg.AppendBucket(&samples[i].Value, &samples[i].Value, int64(totalCount), int64(ndvFactor)) } } - // Compute column order correlation with handle. + return corrXYSum, nil +} + +// calcCorrelation computes column order correlation with the handle. +func calcCorrelation(sampleNum int64, corrXYSum float64) float64 { if sampleNum == 1 { - hg.Correlation = 1 - return hg, nil + return 1 } - // X means the ordinal of the item in original sequence, Y means the oridnal of the item in the + // X means the ordinal of the item in original sequence, Y means the ordinal of the item in the // sorted sequence, we know that X and Y value sets are both: // 0, 1, ..., sampleNum-1 // we can simply compute sum(X) = sum(Y) = @@ -176,11 +202,146 @@ func BuildColumnHist(ctx sessionctx.Context, numBuckets, id int64, collector *Sa itemsCount := float64(sampleNum) corrXSum := (itemsCount - 1) * itemsCount / 2.0 corrX2Sum := (itemsCount - 1) * itemsCount * (2*itemsCount - 1) / 6.0 - hg.Correlation = (itemsCount*corrXYSum - corrXSum*corrXSum) / (itemsCount*corrX2Sum - corrXSum*corrXSum) - return hg, nil + return (itemsCount*corrXYSum - corrXSum*corrXSum) / (itemsCount*corrX2Sum - corrXSum*corrXSum) } // BuildColumn builds histogram from samples for column. func BuildColumn(ctx sessionctx.Context, numBuckets, id int64, collector *SampleCollector, tp *types.FieldType) (*Histogram, error) { return BuildColumnHist(ctx, numBuckets, id, collector, tp, collector.Count, collector.FMSketch.NDV(), collector.NullCount) } + +// BuildColumnHistAndTopN build a histogram and TopN for a column from samples. +func BuildColumnHistAndTopN(ctx sessionctx.Context, numBuckets, numTopN int, id int64, collector *SampleCollector, tp *types.FieldType) (*Histogram, *TopN, error) { + count := collector.Count + ndv := collector.FMSketch.NDV() + nullCount := collector.NullCount + if ndv > count { + ndv = count + } + if count == 0 || len(collector.Samples) == 0 { + return NewHistogram(id, ndv, nullCount, 0, tp, 0, collector.TotalSize), nil, nil + } + sc := ctx.GetSessionVars().StmtCtx + samples := collector.Samples + samples, err := SortSampleItems(sc, samples) + if err != nil { + return nil, nil, err + } + hg := NewHistogram(id, ndv, nullCount, 0, tp, numBuckets, collector.TotalSize) + + sampleNum := int64(len(samples)) + // As we use samples to build the histogram, the bucket number and repeat should multiply a factor. + sampleFactor := float64(count) / float64(len(samples)) + + // Step1: collect topn from samples + + // the topNList is always sorted by count from more to less + topNList := make([]TopNMeta, 0, numTopN) + cur, err := codec.EncodeKey(ctx.GetSessionVars().StmtCtx, nil, samples[0].Value) + if err != nil { + return nil, nil, errors.Trace(err) + } + curCnt := float64(0) + var corrXYSum float64 + + // Iterate through the samples + for i := int64(0); i < sampleNum; i++ { + corrXYSum += float64(i) * float64(samples[i].Ordinal) + + sampleBytes, err := codec.EncodeKey(ctx.GetSessionVars().StmtCtx, nil, samples[i].Value) + if err != nil { + return nil, nil, errors.Trace(err) + } + // case 1, this value is equal to the last one: current count++ + if bytes.Equal(cur, sampleBytes) { + curCnt += 1 + continue + } + // case 2, meet a different value: counting for the "current" is complete + // case 2-1, now topn is empty: append the "current" count directly + if len(topNList) == 0 { + topNList = append(topNList, TopNMeta{Encoded: cur, Count: uint64(curCnt)}) + cur, curCnt = sampleBytes, 1 + continue + } + // case 2-2, now topn is full, and the "current" count is less than the least count in the topn: no need to insert the "current" + if len(topNList) >= numTopN && uint64(curCnt) <= topNList[len(topNList)-1].Count { + cur, curCnt = sampleBytes, 1 + continue + } + // case 2-3, now topn is not full, or the "current" count is larger than the least count in the topn: need to find a slot to insert the "current" + j := len(topNList) + for ; j > 0; j-- { + if uint64(curCnt) < topNList[j-1].Count { + break + } + } + topNList = append(topNList, TopNMeta{}) + copy(topNList[j+1:], topNList[j:]) + topNList[j] = TopNMeta{Encoded: cur, Count: uint64(curCnt)} + if len(topNList) > numTopN { + topNList = topNList[:numTopN] + } + cur, curCnt = sampleBytes, 1 + } + + // Calc the correlation of the column between the handle column. + hg.Correlation = calcCorrelation(sampleNum, corrXYSum) + + // Handle the counting for the last value. Basically equal to the case 2 above. + // now topn is empty: append the "current" count directly + if len(topNList) == 0 { + topNList = append(topNList, TopNMeta{Encoded: cur, Count: uint64(curCnt)}) + } else if len(topNList) < numTopN || uint64(curCnt) > topNList[len(topNList)-1].Count { + // now topn is not full, or the "current" count is larger than the least count in the topn: need to find a slot to insert the "current" + j := len(topNList) + for ; j > 0; j-- { + if uint64(curCnt) < topNList[j-1].Count { + break + } + } + topNList = append(topNList, TopNMeta{}) + copy(topNList[j+1:], topNList[j:]) + topNList[j] = TopNMeta{Encoded: cur, Count: uint64(curCnt)} + if len(topNList) > numTopN { + topNList = topNList[:numTopN] + } + } + + // Step2: exclude topn from samples + for i := int64(0); i < int64(len(samples)); i++ { + sampleBytes, err := codec.EncodeKey(ctx.GetSessionVars().StmtCtx, nil, samples[i].Value) + if err != nil { + return nil, nil, errors.Trace(err) + } + for j := 0; j < len(topNList); j++ { + if bytes.Equal(sampleBytes, topNList[j].Encoded) { + // find the same value in topn: need to skip over this value in samples + copy(samples[i:], samples[uint64(i)+topNList[j].Count:]) + samples = samples[:uint64(len(samples))-topNList[j].Count] + i-- + continue + } + } + } + + for i := 0; i < len(topNList); i++ { + topNList[i].Count *= uint64(sampleFactor) + } + topn := &TopN{TopN: topNList} + + if uint64(count) <= topn.TotalCount() || int(hg.NDV) <= len(topn.TopN) { + // TopN includes all sample data + return hg, topn, nil + } + + // Step3: build histogram with the rest samples + if len(samples) > 0 { + _, err = buildHist(sc, hg, samples, count-int64(topn.TotalCount()), ndv-int64(len(topn.TopN)), int64(numBuckets)) + if err != nil { + return nil, nil, err + } + } + + return hg, topn, nil +} diff --git a/statistics/cmsketch.go b/statistics/cmsketch.go index bd3ab0211a8ad..5b847333d5c0e 100644 --- a/statistics/cmsketch.go +++ b/statistics/cmsketch.go @@ -22,6 +22,7 @@ import ( "github.com/cznic/mathutil" "github.com/cznic/sortutil" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" @@ -42,19 +43,6 @@ type CMSketch struct { count uint64 // TopN is not counted in count defaultValue uint64 // In sampled data, if cmsketch returns a small value (less than avg value / 2), then this will returned. table [][]uint32 - topN map[uint64][]*TopNMeta -} - -// TopNMeta is a simple counter used by BuildTopN. -type TopNMeta struct { - h2 uint64 // h2 is the second part of `murmur3.Sum128()`, it is always used with the first part `h1`. - Data []byte - Count uint64 -} - -// GetH2 get the the second part of `murmur3.Sum128()`, just for test. -func (t *TopNMeta) GetH2() uint64 { - return t.h2 } // NewCMSketch returns a new CM sketch. @@ -121,10 +109,10 @@ func newTopNHelper(sample [][]byte, numTop uint32) *topNHelper { return &topNHelper{uint64(len(sample)), sorted, onlyOnceItems, sumTopN, actualNumTop} } -// NewCMSketchWithTopN returns a new CM sketch with TopN elements, the estimate NDV and the scale ratio. -func NewCMSketchWithTopN(d, w int32, sample [][]byte, numTop uint32, rowCount uint64) (*CMSketch, uint64, uint64) { +// NewCMSketchAndTopN returns a new CM sketch with TopN elements, the estimate NDV and the scale ratio. +func NewCMSketchAndTopN(d, w int32, sample [][]byte, numTop uint32, rowCount uint64) (*CMSketch, *TopN, uint64, uint64) { if rowCount == 0 || len(sample) == 0 { - return nil, 0, 0 + return nil, nil, 0, 0 } helper := newTopNHelper(sample, numTop) // rowCount is not a accurate value when fast analyzing @@ -132,20 +120,20 @@ func NewCMSketchWithTopN(d, w int32, sample [][]byte, numTop uint32, rowCount ui rowCount = mathutil.MaxUint64(rowCount, uint64(len(sample))) estimateNDV, scaleRatio := calculateEstimateNDV(helper, rowCount) defaultVal := calculateDefaultVal(helper, estimateNDV, scaleRatio, rowCount) - c := buildCMSWithTopN(helper, d, w, scaleRatio, defaultVal) - return c, estimateNDV, scaleRatio + c, t := buildCMSAndTopN(helper, d, w, scaleRatio, defaultVal) + return c, t, estimateNDV, scaleRatio } -func buildCMSWithTopN(helper *topNHelper, d, w int32, scaleRatio uint64, defaultVal uint64) (c *CMSketch) { +func buildCMSAndTopN(helper *topNHelper, d, w int32, scaleRatio uint64, defaultVal uint64) (c *CMSketch, t *TopN) { c = NewCMSketch(d, w) enableTopN := helper.sampleSize/topNThreshold <= helper.sumTopN if enableTopN { - c.topN = make(map[uint64][]*TopNMeta, helper.actualNumTop) + t = NewTopN(int(helper.actualNumTop)) for i := uint32(0); i < helper.actualNumTop; i++ { data, cnt := helper.sorted[i].data, helper.sorted[i].cnt - h1, h2 := murmur3.Sum128(data) - c.topN[h1] = append(c.topN[h1], &TopNMeta{h2, data, cnt * scaleRatio}) + t.AppendTopN(data, cnt*scaleRatio) } + t.Sort() helper.sorted = helper.sorted[helper.actualNumTop:] } c.defaultValue = defaultVal @@ -157,7 +145,7 @@ func buildCMSWithTopN(helper *topNHelper, d, w int32, scaleRatio uint64, default if cnt > 1 { rowCount = cnt * scaleRatio } - c.insertBytesByCount(data, rowCount) + c.InsertBytesByCount(data, rowCount) } return } @@ -171,15 +159,6 @@ func calculateDefaultVal(helper *topNHelper, estimateNDV, scaleRatio, rowCount u return estimateRemainingCount / mathutil.MaxUint64(1, estimateNDV-sampleNDV+helper.onlyOnceItems) } -func (c *CMSketch) findTopNMeta(h1, h2 uint64, d []byte) *TopNMeta { - for _, meta := range c.topN[h1] { - if meta.h2 == h2 && bytes.Equal(d, meta.Data) { - return meta - } - } - return nil -} - // MemoryUsage returns the total memory usage of a CMSketch. // only calc the hashtable size(CMSketch.table) and the CMSketch.topN // data are not tracked because size of CMSketch.topN take little influence @@ -191,41 +170,30 @@ func (c *CMSketch) MemoryUsage() (sum int64) { // queryAddTopN TopN adds count to CMSketch.topN if exists, and returns the count of such elements after insert. // If such elements does not in topn elements, nothing will happen and false will be returned. -func (c *CMSketch) updateTopNWithDelta(h1, h2 uint64, d []byte, delta uint64) bool { - if c.topN == nil { +func (c *TopN) updateTopNWithDelta(d []byte, delta uint64, increase bool) bool { + if c == nil || c.TopN == nil { return false } - meta := c.findTopNMeta(h1, h2, d) - if meta != nil { - meta.Count += delta + idx := c.findTopN(d) + if idx >= 0 { + if increase { + c.TopN[idx].Count += delta + } else { + c.TopN[idx].Count -= delta + } return true } return false } -// QueryTopN returns the results for (h1, h2) in murmur3.Sum128(), if not exists, return (0, false). -func (c *CMSketch) QueryTopN(h1, h2 uint64, d []byte) (uint64, bool) { - if c.topN == nil { - return 0, false - } - meta := c.findTopNMeta(h1, h2, d) - if meta != nil { - return meta.Count, true - } - return 0, false -} - // InsertBytes inserts the bytes value into the CM Sketch. func (c *CMSketch) InsertBytes(bytes []byte) { - c.insertBytesByCount(bytes, 1) + c.InsertBytesByCount(bytes, 1) } -// insertBytesByCount adds the bytes value into the TopN (if value already in TopN) or CM Sketch by delta, this does not updates c.defaultValue. -func (c *CMSketch) insertBytesByCount(bytes []byte, count uint64) { +// InsertBytesByCount adds the bytes value into the TopN (if value already in TopN) or CM Sketch by delta, this does not updates c.defaultValue. +func (c *CMSketch) InsertBytesByCount(bytes []byte, count uint64) { h1, h2 := murmur3.Sum128(bytes) - if c.updateTopNWithDelta(h1, h2, bytes, count) { - return - } c.count += count for i := range c.table { j := (h1 + h2*uint64(i)) % uint64(c.width) @@ -237,12 +205,14 @@ func (c *CMSketch) considerDefVal(cnt uint64) bool { return (cnt == 0 || (cnt > c.defaultValue && cnt < 2*(c.count/uint64(c.width)))) && c.defaultValue > 0 } -// updateValueBytes updates value of d to count. -func (c *CMSketch) updateValueBytes(d []byte, count uint64) { +func updateValueBytes(c *CMSketch, t *TopN, d []byte, count uint64) { h1, h2 := murmur3.Sum128(d) - if oriCount, ok := c.QueryTopN(h1, h2, d); ok { - deltaCount := count - oriCount - c.updateTopNWithDelta(h1, h2, d, deltaCount) + if oriCount, ok := t.QueryTopN(d); ok { + if count > oriCount { + t.updateTopNWithDelta(d, count-oriCount, true) + } else { + t.updateTopNWithDelta(d, oriCount-count, false) + } } c.setValue(h1, h2, count) } @@ -269,7 +239,8 @@ func (c *CMSketch) setValue(h1, h2 uint64, count uint64) { } } -func (c *CMSketch) subValue(h1, h2 uint64, count uint64) { +// SubValue remove a value from the CMSketch. +func (c *CMSketch) SubValue(h1, h2 uint64, count uint64) { c.count -= count for i := range c.table { j := (h1 + h2*uint64(i)) % uint64(c.width) @@ -277,20 +248,24 @@ func (c *CMSketch) subValue(h1, h2 uint64, count uint64) { } } -func (c *CMSketch) queryValue(sc *stmtctx.StatementContext, val types.Datum) (uint64, error) { +func queryValue(sc *stmtctx.StatementContext, c *CMSketch, t *TopN, val types.Datum) (uint64, error) { bytes, err := tablecodec.EncodeValue(sc, nil, val) if err != nil { return 0, errors.Trace(err) } - return c.QueryBytes(bytes), nil + h1, h2 := murmur3.Sum128(bytes) + if ret, ok := t.QueryTopN(bytes); ok { + return ret, nil + } + return c.queryHashValue(h1, h2), nil } // QueryBytes is used to query the count of specified bytes. func (c *CMSketch) QueryBytes(d []byte) uint64 { + failpoint.Inject("mockQueryBytesMaxUint64", func(val failpoint.Value) { + failpoint.Return(uint64(val.(int))) + }) h1, h2 := murmur3.Sum128(d) - if count, ok := c.QueryTopN(h1, h2, d); ok { - return count - } return c.queryHashValue(h1, h2) } @@ -329,54 +304,29 @@ func (c *CMSketch) queryHashValue(h1, h2 uint64) uint64 { return uint64(res) } -func (c *CMSketch) mergeTopN(lTopN map[uint64][]*TopNMeta, rTopN map[uint64][]*TopNMeta, numTop uint32, usingMax bool) { - counter := make(map[hack.MutableString]uint64) - for _, metas := range lTopN { - for _, meta := range metas { - counter[hack.String(meta.Data)] += meta.Count - } +// MergeTopNAndUpdateCMSketch merges the src TopN into the dst, and spilled values will be inserted into the CMSketch. +func MergeTopNAndUpdateCMSketch(dst, src *TopN, c *CMSketch, numTop uint32) []TopNMeta { + topNs := []*TopN{src, dst} + mergedTopN, popedTopNPair := MergeTopN(topNs, numTop) + if mergedTopN == nil { + // mergedTopN == nil means the total count of the input TopN are equal to zero + return popedTopNPair } - for _, metas := range rTopN { - for _, meta := range metas { - if usingMax { - counter[hack.String(meta.Data)] = mathutil.MaxUint64(counter[hack.String(meta.Data)], meta.Count) - } else { - counter[hack.String(meta.Data)] += meta.Count - } - } - } - sorted := make([]uint64, len(counter)) - for _, cnt := range counter { - sorted = append(sorted, cnt) - } - sort.Slice(sorted, func(i, j int) bool { - return sorted[i] > sorted[j] - }) - numTop = mathutil.MinUint32(uint32(len(counter)), numTop) - lastTopCnt := sorted[numTop-1] - c.topN = make(map[uint64][]*TopNMeta) - for value, cnt := range counter { - data := hack.Slice(string(value)) - if cnt >= lastTopCnt { - h1, h2 := murmur3.Sum128(data) - c.topN[h1] = append(c.topN[h1], &TopNMeta{h2, data, cnt}) - } else { - c.insertBytesByCount(data, cnt) - } + dst.TopN = mergedTopN.TopN + for _, topNMeta := range popedTopNPair { + c.InsertBytesByCount(topNMeta.Encoded, topNMeta.Count) } + return popedTopNPair } // MergeCMSketch merges two CM Sketch. -func (c *CMSketch) MergeCMSketch(rc *CMSketch, numTopN uint32) error { +func (c *CMSketch) MergeCMSketch(rc *CMSketch) error { if c == nil || rc == nil { return nil } if c.depth != rc.depth || c.width != rc.width { return errors.New("Dimensions of Count-Min Sketch should be the same") } - if len(c.topN) > 0 || len(rc.topN) > 0 { - c.mergeTopN(c.topN, rc.topN, numTopN, false) - } c.count += rc.count for i := range c.table { for j := range c.table[i] { @@ -398,9 +348,6 @@ func (c *CMSketch) MergeCMSketch4IncrementalAnalyze(rc *CMSketch, numTopN uint32 if c.depth != rc.depth || c.width != rc.width { return errors.New("Dimensions of Count-Min Sketch should be the same") } - if len(c.topN) > 0 || len(rc.topN) > 0 { - c.mergeTopN(c.topN, rc.topN, numTopN, true) - } for i := range c.table { c.count = 0 for j := range c.table[i] { @@ -412,27 +359,30 @@ func (c *CMSketch) MergeCMSketch4IncrementalAnalyze(rc *CMSketch, numTopN uint32 } // CMSketchToProto converts CMSketch to its protobuf representation. -func CMSketchToProto(c *CMSketch) *tipb.CMSketch { - protoSketch := &tipb.CMSketch{Rows: make([]*tipb.CMSketchRow, c.depth)} - for i := range c.table { - protoSketch.Rows[i] = &tipb.CMSketchRow{Counters: make([]uint32, c.width)} - for j := range c.table[i] { - protoSketch.Rows[i].Counters[j] = c.table[i][j] +func CMSketchToProto(c *CMSketch, topn *TopN) *tipb.CMSketch { + protoSketch := &tipb.CMSketch{} + if c != nil { + protoSketch.Rows = make([]*tipb.CMSketchRow, c.depth) + for i := range c.table { + protoSketch.Rows[i] = &tipb.CMSketchRow{Counters: make([]uint32, c.width)} + for j := range c.table[i] { + protoSketch.Rows[i].Counters[j] = c.table[i][j] + } } + protoSketch.DefaultValue = c.defaultValue } - for _, dataSlice := range c.topN { - for _, dataMeta := range dataSlice { - protoSketch.TopN = append(protoSketch.TopN, &tipb.CMSketchTopN{Data: dataMeta.Data, Count: dataMeta.Count}) + if topn != nil { + for _, dataMeta := range topn.TopN { + protoSketch.TopN = append(protoSketch.TopN, &tipb.CMSketchTopN{Data: dataMeta.Encoded, Count: dataMeta.Count}) } } - protoSketch.DefaultValue = c.defaultValue return protoSketch } -// CMSketchFromProto converts CMSketch from its protobuf representation. -func CMSketchFromProto(protoSketch *tipb.CMSketch) *CMSketch { +// CMSketchAndTopNFromProto converts CMSketch and TopN from its protobuf representation. +func CMSketchAndTopNFromProto(protoSketch *tipb.CMSketch) (*CMSketch, *TopN) { if protoSketch == nil || len(protoSketch.Rows) == 0 { - return nil + return nil, nil } c := NewCMSketch(int32(len(protoSketch.Rows)), int32(len(protoSketch.Rows[0].Counters))) for i, row := range protoSketch.Rows { @@ -444,14 +394,21 @@ func CMSketchFromProto(protoSketch *tipb.CMSketch) *CMSketch { } c.defaultValue = protoSketch.DefaultValue if len(protoSketch.TopN) == 0 { - return c + return c, nil } - c.topN = make(map[uint64][]*TopNMeta, len(protoSketch.TopN)) - for _, e := range protoSketch.TopN { - h1, h2 := murmur3.Sum128(e.Data) - c.topN[h1] = append(c.topN[h1], &TopNMeta{h2, e.Data, e.Count}) + return c, TopNFromProto(protoSketch.TopN) +} + +// TopNFromProto converts TopN from its protobuf representation. +func TopNFromProto(protoTopN []*tipb.CMSketchTopN) *TopN { + topN := NewTopN(32) + for _, e := range protoTopN { + d := make([]byte, len(e.Data)) + copy(d, e.Data) + topN.AppendTopN(d, e.Count) } - return c + topN.Sort() + return topN } // EncodeCMSketchWithoutTopN encodes the given CMSketch to byte slice. @@ -460,39 +417,34 @@ func EncodeCMSketchWithoutTopN(c *CMSketch) ([]byte, error) { if c == nil { return nil, nil } - p := CMSketchToProto(c) + p := CMSketchToProto(c, nil) p.TopN = nil protoData, err := p.Marshal() return protoData, err } -// DecodeCMSketch decode a CMSketch from the given byte slice. -func DecodeCMSketch(data []byte, topNRows []chunk.Row) (*CMSketch, error) { +// DecodeCMSketchAndTopN decode a CMSketch from the given byte slice. +func DecodeCMSketchAndTopN(data []byte, topNRows []chunk.Row) (*CMSketch, *TopN, error) { if data == nil { - return nil, nil + return nil, nil, nil } p := &tipb.CMSketch{} err := p.Unmarshal(data) if err != nil { - return nil, errors.Trace(err) + return nil, nil, errors.Trace(err) } for _, row := range topNRows { data := make([]byte, len(row.GetBytes(0))) copy(data, row.GetBytes(0)) p.TopN = append(p.TopN, &tipb.CMSketchTopN{Data: data, Count: row.GetUint64(1)}) } - return CMSketchFromProto(p), nil + cm, topN := CMSketchAndTopNFromProto(p) + return cm, topN, nil } // TotalCount returns the total count in the sketch, it is only used for test. func (c *CMSketch) TotalCount() uint64 { - res := c.count - for _, metas := range c.topN { - for _, meta := range metas { - res += meta.Count - } - } - return res + return c.count } // Equal tests if two CM Sketch equal, it is only used for test. @@ -510,62 +462,214 @@ func (c *CMSketch) Copy() *CMSketch { tbl[i] = make([]uint32, c.width) copy(tbl[i], c.table[i]) } - var topN map[uint64][]*TopNMeta - if c.topN != nil { - topN = make(map[uint64][]*TopNMeta, len(c.topN)) - for h1, vals := range c.topN { - newVals := make([]*TopNMeta, 0, len(vals)) - for _, val := range vals { - newVal := TopNMeta{h2: val.h2, Count: val.Count, Data: make([]byte, len(val.Data))} - copy(newVal.Data, val.Data) - newVals = append(newVals, &newVal) - } - topN[h1] = newVals + return &CMSketch{count: c.count, width: c.width, depth: c.depth, table: tbl, defaultValue: c.defaultValue} +} + +// AppendTopN appends a topn into the TopN struct. +func (c *TopN) AppendTopN(data []byte, count uint64) { + c.TopN = append(c.TopN, TopNMeta{data, count}) +} + +// GetWidthAndDepth returns the width and depth of CM Sketch. +func (c *CMSketch) GetWidthAndDepth() (int32, int32) { + return c.width, c.depth +} + +// CalcDefaultValForAnalyze calculate the default value for Analyze. +// The value of it is count / NDV in CMSketch. This means count and NDV are not include topN. +func (c *CMSketch) CalcDefaultValForAnalyze(NDV uint64) { + c.defaultValue = c.count / mathutil.MaxUint64(1, NDV) +} + +// TopN stores most-common values, which is used to estimate point queries. +type TopN struct { + TopN []TopNMeta +} + +// Copy makes a copy for current TopN. +func (c *TopN) Copy() *TopN { + if c == nil { + return nil + } + topN := make([]TopNMeta, len(c.TopN)) + for i, t := range c.TopN { + topN[i].Encoded = make([]byte, len(t.Encoded)) + copy(topN[i].Encoded, t.Encoded) + topN[i].Count = t.Count + } + return &TopN{ + TopN: topN, + } +} + +// TopNMeta stores the unit of the TopN. +type TopNMeta struct { + Encoded []byte + Count uint64 +} + +// QueryTopN returns the results for (h1, h2) in murmur3.Sum128(), if not exists, return (0, false). +func (c *TopN) QueryTopN(d []byte) (uint64, bool) { + if c == nil { + return 0, false + } + idx := c.findTopN(d) + if idx < 0 { + return 0, false + } + return c.TopN[idx].Count, true +} + +func (c *TopN) findTopN(d []byte) int { + if c == nil { + return -1 + } + match := false + idx := sort.Search(len(c.TopN), func(i int) bool { + cmp := bytes.Compare(c.TopN[i].Encoded, d) + if cmp == 0 { + match = true } + return cmp >= 0 + }) + if !match { + return -1 } - return &CMSketch{count: c.count, width: c.width, depth: c.depth, table: tbl, defaultValue: c.defaultValue, topN: topN} + return idx } -// TopN gets all the topN meta. -func (c *CMSketch) TopN() []*TopNMeta { +// LowerBound searches on the sorted top-n items, +// returns the smallest index i such that the value at element i is not less than `d`. +func (c *TopN) LowerBound(d []byte) (idx int, match bool) { if c == nil { - return nil + return 0, false } - topN := make([]*TopNMeta, 0, len(c.topN)) - for _, meta := range c.topN { - topN = append(topN, meta...) + idx = sort.Search(len(c.TopN), func(i int) bool { + cmp := bytes.Compare(c.TopN[i].Encoded, d) + if cmp == 0 { + match = true + } + return cmp >= 0 + }) + return idx, match +} + +// BetweenCount estimates the row count for interval [l, r). +func (c *TopN) BetweenCount(l, r []byte) uint64 { + if c == nil { + return 0 } - return topN + lIdx, _ := c.LowerBound(l) + rIdx, _ := c.LowerBound(r) + ret := uint64(0) + for i := lIdx; i < rIdx; i++ { + ret += c.TopN[i].Count + } + return ret } -// TopNMap gets the origin topN map. -func (c *CMSketch) TopNMap() map[uint64][]*TopNMeta { - return c.topN +// Sort sorts the topn items. +func (c *TopN) Sort() { + if c == nil { + return + } + sort.Slice(c.TopN, func(i, j int) bool { + return bytes.Compare(c.TopN[i].Encoded, c.TopN[j].Encoded) < 0 + }) } -// AppendTopN appends a topn into the cm sketch. -func (c *CMSketch) AppendTopN(data []byte, count uint64) { - if c.topN == nil { - c.topN = make(map[uint64][]*TopNMeta) +// TotalCount returns how many data is stored in TopN. +func (c *TopN) TotalCount() uint64 { + if c == nil { + return 0 } - h1, h2 := murmur3.Sum128(data) - c.topN[h1] = append(c.topN[h1], &TopNMeta{h2, data, count}) + total := uint64(0) + for _, t := range c.TopN { + total += t.Count + } + return total } -// GetWidthAndDepth returns the width and depth of CM Sketch. -func (c *CMSketch) GetWidthAndDepth() (int32, int32) { - return c.width, c.depth +// Equal checks whether the two TopN are equal. +func (c *TopN) Equal(cc *TopN) bool { + if c == nil && cc == nil { + return true + } else if c == nil || cc == nil { + return false + } + if len(c.TopN) != len(cc.TopN) { + return false + } + for i := range c.TopN { + if !bytes.Equal(c.TopN[i].Encoded, cc.TopN[i].Encoded) { + return false + } + if c.TopN[i].Count != cc.TopN[i].Count { + return false + } + } + return true } -// CalcDefaultValForAnalyze calculate the default value for Analyze. -// The value of it is count / NDV in CMSketch. This means count and NDV are not include topN. -func (c *CMSketch) CalcDefaultValForAnalyze(NDV uint64) { - // If NDV <= TopN, all values should be in TopN. - // So we set c.defaultValue to 0 and return immediately. - if NDV <= uint64(len(c.topN)) { - c.defaultValue = 0 +// RemoveVal remove the val from TopN if it exists. +func (c *TopN) RemoveVal(val []byte) { + if c == nil { + return + } + pos := c.findTopN(val) + if pos == -1 { return } - remainNDV := NDV - uint64(len(c.topN)) - c.defaultValue = c.count / mathutil.MaxUint64(1, remainNDV) + c.TopN = append(c.TopN[:pos], c.TopN[pos+1:]...) +} + +// NewTopN creates the new TopN struct by the given size. +func NewTopN(n int) *TopN { + return &TopN{TopN: make([]TopNMeta, 0, n)} +} + +// MergeTopN is used to merge more TopN structures to generate a new TopN struct by the given size. +// The input parameters are multiple TopN structures to be merged and the size of the new TopN that will be generated. +// The output parameters are the newly generated TopN structure and the remaining numbers. +// Notice: The n can be 0. So n has no default value, we must explicitly specify this value. +func MergeTopN(topNs []*TopN, n uint32) (*TopN, []TopNMeta) { + totCnt := uint64(0) + for _, topN := range topNs { + totCnt += topN.TotalCount() + } + if totCnt == 0 { + return nil, nil + } + // Different TopN structures may hold the same value, we have to merge them. + counter := make(map[hack.MutableString]uint64) + for _, topN := range topNs { + if topN.TotalCount() == 0 { + continue + } + for _, val := range topN.TopN { + counter[hack.String(val.Encoded)] += val.Count + } + } + + numTop := len(counter) + if numTop == 0 { + return nil, nil + } + sorted := make([]TopNMeta, 0, numTop) + for value, cnt := range counter { + data := hack.Slice(string(value)) + sorted = append(sorted, TopNMeta{Encoded: data, Count: cnt}) + } + sort.Slice(sorted, func(i, j int) bool { + if sorted[i].Count != sorted[j].Count { + return sorted[i].Count > sorted[j].Count + } + return bytes.Compare(sorted[i].Encoded, sorted[j].Encoded) < 0 + }) + n = mathutil.MinUint32(uint32(numTop), n) + + var finalTopN TopN + finalTopN.TopN = sorted[:n] + finalTopN.Sort() + return &finalTopN, sorted[n:] } diff --git a/statistics/cmsketch_test.go b/statistics/cmsketch_test.go index 21f95c2c4c157..38fe81c79c60f 100644 --- a/statistics/cmsketch_test.go +++ b/statistics/cmsketch_test.go @@ -26,7 +26,6 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" - "github.com/twmb/murmur3" ) func (c *CMSketch) insert(val *types.Datum) error { @@ -38,17 +37,17 @@ func (c *CMSketch) insert(val *types.Datum) error { return nil } -func prepareCMSWithTopN(d, w int32, vals []*types.Datum, n uint32, total uint64) (*CMSketch, error) { +func prepareCMSAndTopN(d, w int32, vals []*types.Datum, n uint32, total uint64) (*CMSketch, *TopN, error) { data := make([][]byte, 0, len(vals)) for _, v := range vals { bytes, err := codec.EncodeValue(nil, nil, *v) if err != nil { - return nil, errors.Trace(err) + return nil, nil, errors.Trace(err) } data = append(data, bytes) } - cms, _, _ := NewCMSketchWithTopN(d, w, data, n, total) - return cms, nil + cms, topN, _, _ := NewCMSketchAndTopN(d, w, data, n, total) + return cms, topN, nil } // buildCMSketchAndMapWithOffset builds cm sketch using zipf and the generated values starts from `offset`. @@ -71,7 +70,7 @@ func buildCMSketchAndMap(d, w int32, seed int64, total, imax uint64, s float64) return buildCMSketchAndMapWithOffset(d, w, seed, total, imax, s, 0) } -func buildCMSketchTopNAndMap(d, w, n, sample int32, seed int64, total, imax uint64, s float64) (*CMSketch, map[int64]uint32, error) { +func buildCMSketchTopNAndMap(d, w, n, sample int32, seed int64, total, imax uint64, s float64) (*CMSketch, *TopN, map[int64]uint32, error) { mp := make(map[int64]uint32) zipf := rand.NewZipf(rand.New(rand.NewSource(seed)), s, 1, imax) vals := make([]*types.Datum, 0) @@ -82,15 +81,15 @@ func buildCMSketchTopNAndMap(d, w, n, sample int32, seed int64, total, imax uint vals = append(vals, &val) } } - cms, err := prepareCMSWithTopN(d, w, vals, uint32(n), total) - return cms, mp, err + cms, topN, err := prepareCMSAndTopN(d, w, vals, uint32(n), total) + return cms, topN, mp, err } -func averageAbsoluteError(cms *CMSketch, mp map[int64]uint32) (uint64, error) { +func averageAbsoluteError(cms *CMSketch, topN *TopN, mp map[int64]uint32) (uint64, error) { sc := &stmtctx.StatementContext{TimeZone: time.Local} var total uint64 for num, count := range mp { - estimate, err := cms.queryValue(sc, types.NewIntDatum(num)) + estimate, err := queryValue(sc, cms, topN, types.NewIntDatum(num)) if err != nil { return 0, errors.Trace(err) } @@ -128,22 +127,22 @@ func (s *testStatisticsSuite) TestCMSketch(c *C) { for _, t := range tests { lSketch, lMap, err := buildCMSketchAndMap(d, w, 0, total, imax, t.zipfFactor) c.Check(err, IsNil) - avg, err := averageAbsoluteError(lSketch, lMap) + avg, err := averageAbsoluteError(lSketch, nil, lMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) rSketch, rMap, err := buildCMSketchAndMap(d, w, 1, total, imax, t.zipfFactor) c.Check(err, IsNil) - avg, err = averageAbsoluteError(rSketch, rMap) + avg, err = averageAbsoluteError(rSketch, nil, rMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) - err = lSketch.MergeCMSketch(rSketch, 0) + err = lSketch.MergeCMSketch(rSketch) c.Assert(err, IsNil) for val, count := range rMap { lMap[val] += count } - avg, err = averageAbsoluteError(lSketch, lMap) + avg, err = averageAbsoluteError(lSketch, nil, lMap) c.Assert(err, IsNil) c.Check(avg, Less, t.avgError*2) } @@ -160,7 +159,7 @@ func (s *testStatisticsSuite) TestCMSketchCoding(c *C) { bytes, err := EncodeCMSketchWithoutTopN(lSketch) c.Assert(err, IsNil) c.Assert(len(bytes), Equals, 61457) - rSketch, err := DecodeCMSketch(bytes, nil) + rSketch, _, err := DecodeCMSketchAndTopN(bytes, nil) c.Assert(err, IsNil) c.Assert(lSketch.Equal(rSketch), IsTrue) } @@ -194,10 +193,10 @@ func (s *testStatisticsSuite) TestCMSketchTopN(c *C) { d, w := int32(5), int32(2048) total, imax := uint64(1000000), uint64(1000000) for _, t := range tests { - lSketch, lMap, err := buildCMSketchTopNAndMap(d, w, 20, 1000, 0, total, imax, t.zipfFactor) + lSketch, topN, lMap, err := buildCMSketchTopNAndMap(d, w, 20, 1000, 0, total, imax, t.zipfFactor) c.Check(err, IsNil) - c.Assert(len(lSketch.TopN()), LessEqual, 40) - avg, err := averageAbsoluteError(lSketch, lMap) + c.Assert(len(topN.TopN), LessEqual, 40) + avg, err := averageAbsoluteError(lSketch, topN, lMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) } @@ -230,13 +229,13 @@ func (s *testStatisticsSuite) TestMergeCMSketch4IncrementalAnalyze(c *C) { for _, t := range tests { lSketch, lMap, err := buildCMSketchAndMap(d, w, 0, total, imax, t.zipfFactor) c.Check(err, IsNil) - avg, err := averageAbsoluteError(lSketch, lMap) + avg, err := averageAbsoluteError(lSketch, nil, lMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) rSketch, rMap, err := buildCMSketchAndMapWithOffset(d, w, 1, total, imax, t.zipfFactor, int64(imax)) c.Check(err, IsNil) - avg, err = averageAbsoluteError(rSketch, rMap) + avg, err = averageAbsoluteError(rSketch, nil, rMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) @@ -244,7 +243,7 @@ func (s *testStatisticsSuite) TestMergeCMSketch4IncrementalAnalyze(c *C) { lMap[key] += val } c.Assert(lSketch.MergeCMSketch4IncrementalAnalyze(rSketch, 0), IsNil) - avg, err = averageAbsoluteError(lSketch, lMap) + avg, err = averageAbsoluteError(lSketch, nil, lMap) c.Assert(err, IsNil) c.Check(avg, LessEqual, t.avgError) width, depth := lSketch.GetWidthAndDepth() @@ -265,13 +264,13 @@ func (s *testStatisticsSuite) TestCMSketchTopNUniqueData(c *C) { vals = append(vals, &val) } } - cms, err := prepareCMSWithTopN(d, w, vals, uint32(20), total) + cms, topN, err := prepareCMSAndTopN(d, w, vals, uint32(20), total) c.Assert(err, IsNil) - avg, err := averageAbsoluteError(cms, mp) + avg, err := averageAbsoluteError(cms, topN, mp) c.Assert(err, IsNil) c.Check(cms.defaultValue, Equals, uint64(1)) c.Check(avg, Equals, uint64(0)) - c.Check(len(cms.topN), Equals, 0) + c.Check(topN, IsNil) } func (s *testStatisticsSuite) TestCMSketchCodingTopN(c *C) { @@ -282,15 +281,14 @@ func (s *testStatisticsSuite) TestCMSketchCodingTopN(c *C) { lSketch.table[i][j] = math.MaxUint32 } } - lSketch.topN = make(map[uint64][]*TopNMeta) + topN := make([]TopNMeta, 20) unsignedLong := types.NewFieldType(mysql.TypeLonglong) unsignedLong.Flag |= mysql.UnsignedFlag chk := chunk.New([]*types.FieldType{types.NewFieldType(mysql.TypeBlob), unsignedLong}, 20, 20) var rows []chunk.Row for i := 0; i < 20; i++ { tString := []byte(fmt.Sprintf("%20000d", i)) - h1, h2 := murmur3.Sum128(tString) - lSketch.topN[h1] = []*TopNMeta{{h2, tString, math.MaxUint64}} + topN[i] = TopNMeta{tString, math.MaxUint64} chk.AppendBytes(0, tString) chk.AppendUint64(1, math.MaxUint64) rows = append(rows, chk.GetRow(i)) @@ -299,9 +297,9 @@ func (s *testStatisticsSuite) TestCMSketchCodingTopN(c *C) { bytes, err := EncodeCMSketchWithoutTopN(lSketch) c.Assert(err, IsNil) c.Assert(len(bytes), Equals, 61457) - rSketch, err := DecodeCMSketch(bytes, rows) + rSketch, _, err := DecodeCMSketchAndTopN(bytes, rows) c.Assert(err, IsNil) c.Assert(lSketch.Equal(rSketch), IsTrue) // do not panic - DecodeCMSketch([]byte{}, rows) + DecodeCMSketchAndTopN([]byte{}, rows) } diff --git a/statistics/feedback.go b/statistics/feedback.go index fb709eaaf3893..ebd366052b0fc 100644 --- a/statistics/feedback.go +++ b/statistics/feedback.go @@ -28,6 +28,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -44,6 +45,7 @@ type Feedback struct { Upper *types.Datum Count int64 Repeat int64 + Ndv int64 } // QueryFeedback is used to represent the query feedback info. It contains the query's scan ranges and number of rows @@ -143,6 +145,13 @@ var ( FeedbackProbability = atomic.NewFloat64(0) ) +func init() { + // This is for solving import cycle. + // We need to read the value of FeedbackProbability when setting the variable tidb_analyze_version in sessionctx/variable package + // but we have imported sessionctx/variable in statistics package here. + variable.FeedbackProbability = FeedbackProbability +} + // CalcErrorRate calculates the error rate the current QueryFeedback. func (q *QueryFeedback) CalcErrorRate() float64 { expected := float64(q.Expected) @@ -236,7 +245,7 @@ func (q *QueryFeedback) DecodeIntValues() *QueryFeedback { func (q *QueryFeedback) StoreRanges(ranges []*ranger.Range) { q.Feedback = make([]Feedback, 0, len(ranges)) for _, ran := range ranges { - q.Feedback = append(q.Feedback, Feedback{&ran.LowVal[0], &ran.HighVal[0], 0, 0}) + q.Feedback = append(q.Feedback, Feedback{&ran.LowVal[0], &ran.HighVal[0], 0, 0, 0}) } } @@ -258,7 +267,7 @@ func (q *QueryFeedback) Actual() int64 { // Update updates the query feedback. `startKey` is the start scan key of the partial result, used to find // the range for update. `counts` is the scan counts of each range, used to update the feedback count info. -func (q *QueryFeedback) Update(startKey kv.Key, counts []int64) { +func (q *QueryFeedback) Update(startKey kv.Key, counts, ndvs []int64) { // Older versions do not have the counts info. if len(counts) == 0 { q.Invalidate() @@ -292,6 +301,7 @@ func (q *QueryFeedback) Update(startKey kv.Key, counts []int64) { for i := 0; i < len(counts)/2; i++ { j := len(counts) - i - 1 counts[i], counts[j] = counts[j], counts[i] + ndvs[i], ndvs[j] = ndvs[j], ndvs[i] } } // Update the feedback count info. @@ -301,6 +311,7 @@ func (q *QueryFeedback) Update(startKey kv.Key, counts []int64) { break } q.Feedback[i+idx].Count += count + q.Feedback[i+idx].Ndv += ndvs[i] } } @@ -503,23 +514,25 @@ type bucket = Feedback // calculates the count for each new bucket, merge the new bucket whose count // is smaller than "minBucketFraction*totalCount" with the next new bucket // until the last new bucket. -func (b *BucketFeedback) splitBucket(newNumBkts int, totalCount float64, originBucketCount float64) []bucket { +func (b *BucketFeedback) splitBucket(newNumBkts int, totalCount float64, originBucketCount float64, originalNdv int64) []bucket { // Split the bucket. bounds := b.getBoundaries(newNumBkts + 1) bkts := make([]bucket, 0, len(bounds)-1) sc := &stmtctx.StatementContext{TimeZone: time.UTC} for i := 1; i < len(bounds); i++ { - newBkt := bucket{&bounds[i-1], bounds[i].Clone(), 0, 0} + newBkt := bucket{&bounds[i-1], bounds[i].Clone(), 0, 0, 0} // get bucket count - _, ratio := getOverlapFraction(Feedback{b.lower, b.upper, int64(originBucketCount), 0}, newBkt) + _, ratio := getOverlapFraction(Feedback{b.lower, b.upper, int64(originBucketCount), 0, 0}, newBkt) countInNewBkt := originBucketCount * ratio - countInNewBkt = b.refineBucketCount(sc, newBkt, countInNewBkt) + ndvInNewBkt := int64(float64(originalNdv) * ratio) + countInNewBkt, ndvInNewBkt = b.refineBucketCount(sc, newBkt, countInNewBkt, ndvInNewBkt) // do not split if the count of result bucket is too small. if countInNewBkt < minBucketFraction*totalCount { bounds[i] = bounds[i-1] continue } newBkt.Count = int64(countInNewBkt) + newBkt.Ndv = ndvInNewBkt bkts = append(bkts, newBkt) // To guarantee that each bucket's range will not overlap. setNextValue(&bounds[i]) @@ -556,45 +569,51 @@ func getOverlapFraction(fb Feedback, bkt bucket) (float64, float64) { } // mergeFullyContainedFeedback merges the max fraction of non-overlapped feedbacks that are fully contained in the bucket. -func (b *BucketFeedback) mergeFullyContainedFeedback(sc *stmtctx.StatementContext, bkt bucket) (float64, float64, bool) { +func (b *BucketFeedback) mergeFullyContainedFeedback(sc *stmtctx.StatementContext, bkt bucket) (float64, float64, int64, bool) { feedbacks := make([]Feedback, 0, len(b.feedback)) // Get all the fully contained feedbacks. for _, fb := range b.feedback { res, err := outOfRange(sc, bkt.Lower, bkt.Upper, fb.Lower) if res != 0 || err != nil { - return 0, 0, false + return 0, 0, 0, false } res, err = outOfRange(sc, bkt.Lower, bkt.Upper, fb.Upper) if res != 0 || err != nil { - return 0, 0, false + return 0, 0, 0, false } feedbacks = append(feedbacks, fb) } if len(feedbacks) == 0 { - return 0, 0, false + return 0, 0, 0, false } sortedFBs, ok := NonOverlappedFeedbacks(sc, feedbacks) if !ok { - return 0, 0, false + return 0, 0, 0, false } - var sumFraction, sumCount float64 + var ( + sumFraction, sumCount float64 + ndv int64 + ) for _, fb := range sortedFBs { fraction, _ := getOverlapFraction(fb, bkt) sumFraction += fraction sumCount += float64(fb.Count) + ndv += fb.Ndv } - return sumFraction, sumCount, true + return sumFraction, sumCount, ndv, true } // refineBucketCount refine the newly split bucket count. It uses the feedback that overlaps most // with the bucket to get the bucket count. -func (b *BucketFeedback) refineBucketCount(sc *stmtctx.StatementContext, bkt bucket, defaultCount float64) float64 { +func (b *BucketFeedback) refineBucketCount(sc *stmtctx.StatementContext, bkt bucket, defaultCount float64, defaultNdv int64) (float64, int64) { bestFraction := minBucketFraction count := defaultCount - sumFraction, sumCount, ok := b.mergeFullyContainedFeedback(sc, bkt) + ndv := defaultNdv + sumFraction, sumCount, sumNdv, ok := b.mergeFullyContainedFeedback(sc, bkt) if ok && sumFraction > bestFraction { bestFraction = sumFraction count = sumCount / sumFraction + ndv = int64(float64(sumNdv) / sumFraction) } for _, fb := range b.feedback { fraction, ratio := getOverlapFraction(fb, bkt) @@ -602,9 +621,10 @@ func (b *BucketFeedback) refineBucketCount(sc *stmtctx.StatementContext, bkt buc if fraction > bestFraction { bestFraction = fraction count = float64(fb.Count) * ratio + ndv = int64(float64(fb.Ndv) * ratio) } } - return count + return count, ndv } const ( @@ -685,6 +705,7 @@ func mergeBuckets(bkts []bucket, isNewBuckets []bool, totalCount float64) []buck bkts[bktCursor-1].Upper = bkts[i].Upper bkts[bktCursor-1].Count += bkts[i].Count bkts[bktCursor-1].Repeat = bkts[i].Repeat + bkts[bktCursor-1].Ndv += bkts[i].Ndv idCursor++ } else { bkts[bktCursor] = bkts[i] @@ -705,13 +726,13 @@ func splitBuckets(h *Histogram, feedback *QueryFeedback) ([]bucket, []bool, int6 bktFB, ok := bktID2FB[i] // No feedback, just use the original one. if !ok { - buckets = append(buckets, bucket{h.GetLower(i), h.GetUpper(i), h.bucketCount(i), h.Buckets[i].Repeat}) + buckets = append(buckets, bucket{h.GetLower(i), h.GetUpper(i), h.bucketCount(i), h.Buckets[i].Repeat, h.Buckets[i].NDV}) isNewBuckets = append(isNewBuckets, false) continue } // Distribute the total split count to bucket based on number of bucket feedback. newBktNums := splitCount * len(bktFB.feedback) / numTotalFBs - bkts := bktFB.splitBucket(newBktNums, h.TotalRowCount(), float64(h.bucketCount(i))) + bkts := bktFB.splitBucket(newBktNums, h.TotalRowCount(), float64(h.bucketCount(i)), h.Buckets[i].NDV) buckets = append(buckets, bkts...) if len(bkts) == 1 { isNewBuckets = append(isNewBuckets, false) @@ -729,34 +750,48 @@ func splitBuckets(h *Histogram, feedback *QueryFeedback) ([]bucket, []bool, int6 } // UpdateHistogram updates the histogram according buckets. -func UpdateHistogram(h *Histogram, feedback *QueryFeedback) *Histogram { +func UpdateHistogram(h *Histogram, feedback *QueryFeedback, statsVer int) *Histogram { + if statsVer < Version2 { + // If it's the stats we haven't maintain the bucket NDV yet. Reset the ndv. + for i := range feedback.Feedback { + feedback.Feedback[i].Ndv = 0 + } + } buckets, isNewBuckets, totalCount := splitBuckets(h, feedback) buckets = mergeBuckets(buckets, isNewBuckets, float64(totalCount)) hist := buildNewHistogram(h, buckets) // Update the NDV of primary key column. if feedback.Tp == PkType { hist.NDV = int64(hist.TotalRowCount()) + // If we maintained the NDV of bucket. We can also update the total ndv. + } else if feedback.Tp == IndexType && statsVer == 2 { + totNdv := int64(0) + for _, bkt := range buckets { + totNdv += bkt.Ndv + } + hist.NDV = totNdv } return hist } -// UpdateCMSketch updates the CMSketch by feedback. -func UpdateCMSketch(c *CMSketch, eqFeedbacks []Feedback) *CMSketch { +// UpdateCMSketchAndTopN updates the CMSketch and TopN by feedback. +func UpdateCMSketchAndTopN(c *CMSketch, t *TopN, eqFeedbacks []Feedback) (*CMSketch, *TopN) { if c == nil || len(eqFeedbacks) == 0 { - return c + return c, t } newCMSketch := c.Copy() + newTopN := t.Copy() for _, fb := range eqFeedbacks { - newCMSketch.updateValueBytes(fb.Lower.GetBytes(), uint64(fb.Count)) + updateValueBytes(newCMSketch, newTopN, fb.Lower.GetBytes(), uint64(fb.Count)) } - return newCMSketch + return newCMSketch, newTopN } func buildNewHistogram(h *Histogram, buckets []bucket) *Histogram { hist := NewHistogram(h.ID, h.NDV, h.NullCount, h.LastUpdateVersion, h.Tp, len(buckets), h.TotColSize) preCount := int64(0) for _, bkt := range buckets { - hist.AppendBucket(bkt.Lower, bkt.Upper, bkt.Count+preCount, bkt.Repeat) + hist.AppendBucketWithNDV(bkt.Lower, bkt.Upper, bkt.Count+preCount, bkt.Repeat, bkt.Ndv) preCount += bkt.Count } return hist @@ -775,6 +810,8 @@ type queryFeedback struct { // After that, it stores the Ranges for `HashValues`. Counts []int64 ColumnRanges [][]byte + + Ndvs []int64 } func encodePKFeedback(q *QueryFeedback) (*queryFeedback, error) { @@ -794,6 +831,7 @@ func encodePKFeedback(q *QueryFeedback) (*queryFeedback, error) { } pb.IntRanges = append(pb.IntRanges, low, high) pb.Counts = append(pb.Counts, fb.Count) + pb.Ndvs = append(pb.Ndvs, fb.Ndv) } return pb, nil } @@ -805,9 +843,11 @@ func encodeIndexFeedback(q *QueryFeedback) *queryFeedback { if bytes.Compare(kv.Key(fb.Lower.GetBytes()).PrefixNext(), fb.Upper.GetBytes()) >= 0 { pb.IndexPoints = append(pb.IndexPoints, fb.Lower.GetBytes()) pointCounts = append(pointCounts, fb.Count) + pb.Ndvs = append(pb.Ndvs, fb.Ndv) } else { pb.IndexRanges = append(pb.IndexRanges, fb.Lower.GetBytes(), fb.Upper.GetBytes()) pb.Counts = append(pb.Counts, fb.Count) + pb.Ndvs = append(pb.Ndvs, fb.Ndv) } } pb.Counts = append(pb.Counts, pointCounts...) @@ -853,28 +893,24 @@ func EncodeFeedback(q *QueryFeedback) ([]byte, error) { return buf.Bytes(), errors.Trace(err) } -func decodeFeedbackForIndex(q *QueryFeedback, pb *queryFeedback, c *CMSketch) { +func decodeFeedbackForIndex(q *QueryFeedback, pb *queryFeedback, c *CMSketch, t *TopN) { q.Tp = IndexType // decode the index range feedback for i := 0; i < len(pb.IndexRanges); i += 2 { lower, upper := types.NewBytesDatum(pb.IndexRanges[i]), types.NewBytesDatum(pb.IndexRanges[i+1]) - q.Feedback = append(q.Feedback, Feedback{&lower, &upper, pb.Counts[i/2], 0}) + q.Feedback = append(q.Feedback, Feedback{&lower, &upper, pb.Counts[i/2], 0, pb.Ndvs[i/2]}) } if c != nil { // decode the index point feedback, just set value count in CM Sketch start := len(pb.IndexRanges) / 2 if len(pb.HashValues) > 0 { - // It needs raw values to update the top n, so just skip it here. - if len(c.topN) > 0 { - return - } for i := 0; i < len(pb.HashValues); i += 2 { c.setValue(pb.HashValues[i], pb.HashValues[i+1], uint64(pb.Counts[start+i/2])) } return } for i := 0; i < len(pb.IndexPoints); i++ { - c.updateValueBytes(pb.IndexPoints[i], uint64(pb.Counts[start+i])) + updateValueBytes(c, t, pb.IndexPoints[i], uint64(pb.Counts[start+i])) } } } @@ -891,7 +927,7 @@ func decodeFeedbackForPK(q *QueryFeedback, pb *queryFeedback, isUnsigned bool) { lower.SetInt64(pb.IntRanges[i]) upper.SetInt64(pb.IntRanges[i+1]) } - q.Feedback = append(q.Feedback, Feedback{&lower, &upper, pb.Counts[i/2], 0}) + q.Feedback = append(q.Feedback, Feedback{&lower, &upper, pb.Counts[i/2], 0, pb.Ndvs[i/2]}) } } @@ -930,13 +966,13 @@ func decodeFeedbackForColumn(q *QueryFeedback, pb *queryFeedback, ft *types.Fiel if err != nil { return err } - q.Feedback = append(q.Feedback, Feedback{&low[0], &high[0], pb.Counts[i/2], 0}) + q.Feedback = append(q.Feedback, Feedback{&low[0], &high[0], pb.Counts[i/2], 0, 0}) } return nil } // DecodeFeedback decodes a byte slice to feedback. -func DecodeFeedback(val []byte, q *QueryFeedback, c *CMSketch, ft *types.FieldType) error { +func DecodeFeedback(val []byte, q *QueryFeedback, c *CMSketch, t *TopN, ft *types.FieldType) error { buf := bytes.NewBuffer(val) dec := gob.NewDecoder(buf) pb := &queryFeedback{} @@ -945,7 +981,7 @@ func DecodeFeedback(val []byte, q *QueryFeedback, c *CMSketch, ft *types.FieldTy return errors.Trace(err) } if len(pb.IndexRanges) > 0 || len(pb.HashValues) > 0 || len(pb.IndexPoints) > 0 { - decodeFeedbackForIndex(q, pb, c) + decodeFeedbackForIndex(q, pb, c, t) } else if len(pb.IntRanges) > 0 { decodeFeedbackForPK(q, pb, mysql.HasUnsignedFlag(ft.Flag)) } else { @@ -968,6 +1004,21 @@ func SplitFeedbackByQueryType(feedbacks []Feedback) ([]Feedback, []Feedback) { return eqFB, ranFB } +// CleanRangeFeedbackByTopN will not update the part containing the TopN. +func CleanRangeFeedbackByTopN(feedbacks []Feedback, topN *TopN) []Feedback { + for i := len(feedbacks) - 1; i >= 0; i-- { + lIdx, lMatch := topN.LowerBound(feedbacks[i].Lower.GetBytes()) + rIdx, _ := topN.LowerBound(feedbacks[i].Upper.GetBytes()) + // If the LowerBound return the same result for the range's upper bound and lower bound and the lower one isn't matched, + // we can indicate that no top-n overlaps the feedback's ranges. + if lIdx == rIdx && !lMatch { + continue + } + feedbacks = append(feedbacks[:i], feedbacks[i+1:]...) + } + return feedbacks +} + // setNextValue sets the next value for the given datum. For types like float, // we do not set because it is not discrete and does not matter too much when estimating the scalar info. func setNextValue(d *types.Datum) { diff --git a/statistics/feedback_test.go b/statistics/feedback_test.go index 1d778660171ba..12b87ffa57c3f 100644 --- a/statistics/feedback_test.go +++ b/statistics/feedback_test.go @@ -17,9 +17,11 @@ import ( "bytes" . "github.com/pingcap/check" + "github.com/pingcap/log" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" + "go.uber.org/zap" ) var _ = Suite(&testFeedbackSuite{}) @@ -27,22 +29,22 @@ var _ = Suite(&testFeedbackSuite{}) type testFeedbackSuite struct { } -func newFeedback(lower, upper, count int64) Feedback { +func newFeedback(lower, upper, count, ndv int64) Feedback { low, upp := types.NewIntDatum(lower), types.NewIntDatum(upper) - return Feedback{&low, &upp, count, 0} + return Feedback{&low, &upp, count, 0, ndv} } func genFeedbacks(lower, upper int64) []Feedback { var feedbacks []Feedback for i := lower; i < upper; i++ { - feedbacks = append(feedbacks, newFeedback(i, upper, upper-i+1)) + feedbacks = append(feedbacks, newFeedback(i, upper, upper-i+1, upper-i+1)) } return feedbacks } func appendBucket(h *Histogram, l, r int64) { lower, upper := types.NewIntDatum(l), types.NewIntDatum(r) - h.AppendBucket(&lower, &upper, 0, 0) + h.AppendBucketWithNDV(&lower, &upper, 0, 0, 0) } func genHistogram() *Histogram { @@ -57,11 +59,11 @@ func genHistogram() *Histogram { func (s *testFeedbackSuite) TestUpdateHistogram(c *C) { feedbacks := []Feedback{ - newFeedback(0, 1, 10000), - newFeedback(1, 2, 1), - newFeedback(2, 3, 3), - newFeedback(4, 5, 2), - newFeedback(5, 7, 4), + newFeedback(0, 1, 10000, 1), + newFeedback(1, 2, 1, 1), + newFeedback(2, 3, 3, 1), + newFeedback(4, 5, 2, 1), + newFeedback(5, 7, 4, 1), } feedbacks = append(feedbacks, genFeedbacks(8, 20)...) feedbacks = append(feedbacks, genFeedbacks(21, 60)...) @@ -71,52 +73,66 @@ func (s *testFeedbackSuite) TestUpdateHistogram(c *C) { originBucketCount := defaultBucketCount defaultBucketCount = 7 defer func() { defaultBucketCount = originBucketCount }() - c.Assert(UpdateHistogram(q.Hist, q).ToString(0), Equals, + c.Assert(UpdateHistogram(q.Hist, q, Version2).ToString(0), Equals, "column:0 ndv:10053 totColSize:0\n"+ - "num: 10001 lower_bound: 0 upper_bound: 2 repeats: 0\n"+ - "num: 7 lower_bound: 2 upper_bound: 5 repeats: 0\n"+ - "num: 4 lower_bound: 5 upper_bound: 7 repeats: 0\n"+ - "num: 11 lower_bound: 10 upper_bound: 20 repeats: 0\n"+ - "num: 19 lower_bound: 30 upper_bound: 49 repeats: 0\n"+ - "num: 11 lower_bound: 50 upper_bound: 60 repeats: 0") + "num: 10001 lower_bound: 0 upper_bound: 2 repeats: 0 ndv: 2\n"+ + "num: 7 lower_bound: 2 upper_bound: 5 repeats: 0 ndv: 2\n"+ + "num: 4 lower_bound: 5 upper_bound: 7 repeats: 0 ndv: 1\n"+ + "num: 11 lower_bound: 10 upper_bound: 20 repeats: 0 ndv: 11\n"+ + "num: 19 lower_bound: 30 upper_bound: 49 repeats: 0 ndv: 19\n"+ + "num: 11 lower_bound: 50 upper_bound: 60 repeats: 0 ndv: 11") } func (s *testFeedbackSuite) TestSplitBuckets(c *C) { // test bucket split - feedbacks := []Feedback{newFeedback(0, 1, 1)} + feedbacks := []Feedback{newFeedback(0, 1, 1, 1)} for i := 0; i < 100; i++ { - feedbacks = append(feedbacks, newFeedback(10, 15, 5)) + feedbacks = append(feedbacks, newFeedback(10, 15, 5, 5)) } q := NewQueryFeedback(0, genHistogram(), 0, false) q.Feedback = feedbacks + oldCnts := make([]int64, q.Hist.Len()) + for i := range q.Hist.Buckets { + oldCnts[i] = q.Hist.bucketCount(i) + } + oldNdvs := make([]int64, q.Hist.Len()) + for i := range q.Hist.Buckets { + oldNdvs[i] = q.Hist.Buckets[i].NDV + } + log.Warn("in test", zap.Int64s("ndvs", oldNdvs), zap.Int64s("cnts", oldCnts)) buckets, isNewBuckets, totalCount := splitBuckets(q.Hist, q) + ndvs := make([]int64, len(buckets)) + for i := range buckets { + ndvs[i] = buckets[i].Ndv + } + log.Warn("in test", zap.Int64s("ndvs", ndvs)) c.Assert(buildNewHistogram(q.Hist, buckets).ToString(0), Equals, "column:0 ndv:0 totColSize:0\n"+ - "num: 1 lower_bound: 0 upper_bound: 1 repeats: 0\n"+ - "num: 0 lower_bound: 2 upper_bound: 3 repeats: 0\n"+ - "num: 0 lower_bound: 5 upper_bound: 7 repeats: 0\n"+ - "num: 5 lower_bound: 10 upper_bound: 15 repeats: 0\n"+ - "num: 0 lower_bound: 16 upper_bound: 20 repeats: 0\n"+ - "num: 0 lower_bound: 30 upper_bound: 50 repeats: 0") + "num: 1 lower_bound: 0 upper_bound: 1 repeats: 0 ndv: 1\n"+ + "num: 0 lower_bound: 2 upper_bound: 3 repeats: 0 ndv: 0\n"+ + "num: 0 lower_bound: 5 upper_bound: 7 repeats: 0 ndv: 0\n"+ + "num: 5 lower_bound: 10 upper_bound: 15 repeats: 0 ndv: 5\n"+ + "num: 0 lower_bound: 16 upper_bound: 20 repeats: 0 ndv: 0\n"+ + "num: 0 lower_bound: 30 upper_bound: 50 repeats: 0 ndv: 0") c.Assert(isNewBuckets, DeepEquals, []bool{false, false, false, true, true, false}) c.Assert(totalCount, Equals, int64(6)) // test do not split if the bucket count is too small - feedbacks = []Feedback{newFeedback(0, 1, 100000)} + feedbacks = []Feedback{newFeedback(0, 1, 100000, 1)} for i := 0; i < 100; i++ { - feedbacks = append(feedbacks, newFeedback(10, 15, 1)) + feedbacks = append(feedbacks, newFeedback(10, 15, 1, 1)) } q = NewQueryFeedback(0, genHistogram(), 0, false) q.Feedback = feedbacks buckets, isNewBuckets, totalCount = splitBuckets(q.Hist, q) c.Assert(buildNewHistogram(q.Hist, buckets).ToString(0), Equals, "column:0 ndv:0 totColSize:0\n"+ - "num: 100000 lower_bound: 0 upper_bound: 1 repeats: 0\n"+ - "num: 0 lower_bound: 2 upper_bound: 3 repeats: 0\n"+ - "num: 0 lower_bound: 5 upper_bound: 7 repeats: 0\n"+ - "num: 1 lower_bound: 10 upper_bound: 15 repeats: 0\n"+ - "num: 0 lower_bound: 16 upper_bound: 20 repeats: 0\n"+ - "num: 0 lower_bound: 30 upper_bound: 50 repeats: 0") + "num: 100000 lower_bound: 0 upper_bound: 1 repeats: 0 ndv: 1\n"+ + "num: 0 lower_bound: 2 upper_bound: 3 repeats: 0 ndv: 0\n"+ + "num: 0 lower_bound: 5 upper_bound: 7 repeats: 0 ndv: 0\n"+ + "num: 1 lower_bound: 10 upper_bound: 15 repeats: 0 ndv: 1\n"+ + "num: 0 lower_bound: 16 upper_bound: 20 repeats: 0 ndv: 0\n"+ + "num: 0 lower_bound: 30 upper_bound: 50 repeats: 0 ndv: 0") c.Assert(isNewBuckets, DeepEquals, []bool{false, false, false, true, true, false}) c.Assert(totalCount, Equals, int64(100001)) @@ -124,16 +140,17 @@ func (s *testFeedbackSuite) TestSplitBuckets(c *C) { h := NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeLong), 5, 0) appendBucket(h, 0, 1000000) h.Buckets[0].Count = 1000000 + h.Buckets[0].NDV = 1000000 feedbacks = feedbacks[:0] for i := 0; i < 100; i++ { - feedbacks = append(feedbacks, newFeedback(0, 10, 1)) + feedbacks = append(feedbacks, newFeedback(0, 10, 1, 1)) } q = NewQueryFeedback(0, h, 0, false) q.Feedback = feedbacks buckets, isNewBuckets, totalCount = splitBuckets(q.Hist, q) c.Assert(buildNewHistogram(q.Hist, buckets).ToString(0), Equals, "column:0 ndv:0 totColSize:0\n"+ - "num: 1000000 lower_bound: 0 upper_bound: 1000000 repeats: 0") + "num: 1000000 lower_bound: 0 upper_bound: 1000000 repeats: 0 ndv: 1000000") c.Assert(isNewBuckets, DeepEquals, []bool{false}) c.Assert(totalCount, Equals, int64(1000000)) @@ -142,15 +159,15 @@ func (s *testFeedbackSuite) TestSplitBuckets(c *C) { appendBucket(h, 0, 1000000) feedbacks = feedbacks[:0] for i := 0; i < 100; i++ { - feedbacks = append(feedbacks, newFeedback(0, 10, 1)) + feedbacks = append(feedbacks, newFeedback(0, 10, 1, 1)) } q = NewQueryFeedback(0, h, 0, false) q.Feedback = feedbacks buckets, isNewBuckets, totalCount = splitBuckets(q.Hist, q) c.Assert(buildNewHistogram(q.Hist, buckets).ToString(0), Equals, "column:0 ndv:0 totColSize:0\n"+ - "num: 1 lower_bound: 0 upper_bound: 10 repeats: 0\n"+ - "num: 0 lower_bound: 11 upper_bound: 1000000 repeats: 0") + "num: 1 lower_bound: 0 upper_bound: 10 repeats: 0 ndv: 1\n"+ + "num: 0 lower_bound: 11 upper_bound: 1000000 repeats: 0 ndv: 0") c.Assert(isNewBuckets, DeepEquals, []bool{true, true}) c.Assert(totalCount, Equals, int64(1)) @@ -158,14 +175,14 @@ func (s *testFeedbackSuite) TestSplitBuckets(c *C) { h = NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeLong), 5, 0) appendBucket(h, 0, 10000) feedbacks = feedbacks[:0] - feedbacks = append(feedbacks, newFeedback(0, 4000, 4000)) - feedbacks = append(feedbacks, newFeedback(4001, 9999, 1000)) + feedbacks = append(feedbacks, newFeedback(0, 4000, 4000, 4000)) + feedbacks = append(feedbacks, newFeedback(4001, 9999, 1000, 1000)) q = NewQueryFeedback(0, h, 0, false) q.Feedback = feedbacks buckets, isNewBuckets, totalCount = splitBuckets(q.Hist, q) c.Assert(buildNewHistogram(q.Hist, buckets).ToString(0), Equals, "column:0 ndv:0 totColSize:0\n"+ - "num: 5001 lower_bound: 0 upper_bound: 10000 repeats: 0") + "num: 5001 lower_bound: 0 upper_bound: 10000 repeats: 0 ndv: 5001") c.Assert(isNewBuckets, DeepEquals, []bool{false}) c.Assert(totalCount, Equals, int64(5001)) } @@ -176,6 +193,7 @@ func (s *testFeedbackSuite) TestMergeBuckets(c *C) { tests := []struct { points []int64 counts []int64 + ndvs []int64 isNewBuckets []bool bucketCount int result string @@ -183,37 +201,43 @@ func (s *testFeedbackSuite) TestMergeBuckets(c *C) { { points: []int64{1, 2}, counts: []int64{1}, + ndvs: []int64{1}, isNewBuckets: []bool{false}, bucketCount: 1, - result: "column:0 ndv:0 totColSize:0\nnum: 1 lower_bound: 1 upper_bound: 2 repeats: 0", + result: "column:0 ndv:0 totColSize:0\nnum: 1 lower_bound: 1 upper_bound: 2 repeats: 0 ndv: 1", }, { points: []int64{1, 2, 2, 3, 3, 4}, counts: []int64{100000, 1, 1}, + ndvs: []int64{1, 1, 1}, isNewBuckets: []bool{false, false, false}, bucketCount: 2, result: "column:0 ndv:0 totColSize:0\n" + - "num: 100000 lower_bound: 1 upper_bound: 2 repeats: 0\n" + - "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0", + "num: 100000 lower_bound: 1 upper_bound: 2 repeats: 0 ndv: 1\n" + + "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0 ndv: 2", }, // test do not Merge if the result bucket count is too large { points: []int64{1, 2, 2, 3, 3, 4, 4, 5}, counts: []int64{1, 1, 100000, 100000}, + ndvs: []int64{1, 1, 1, 1}, isNewBuckets: []bool{false, false, false, false}, bucketCount: 3, result: "column:0 ndv:0 totColSize:0\n" + - "num: 2 lower_bound: 1 upper_bound: 3 repeats: 0\n" + - "num: 100000 lower_bound: 3 upper_bound: 4 repeats: 0\n" + - "num: 100000 lower_bound: 4 upper_bound: 5 repeats: 0", + "num: 2 lower_bound: 1 upper_bound: 3 repeats: 0 ndv: 2\n" + + "num: 100000 lower_bound: 3 upper_bound: 4 repeats: 0 ndv: 1\n" + + "num: 100000 lower_bound: 4 upper_bound: 5 repeats: 0 ndv: 1", }, } for _, t := range tests { + if len(t.counts) != len(t.ndvs) { + c.Assert(false, IsTrue) + } bkts := make([]bucket, 0, len(t.counts)) totalCount := int64(0) for i := 0; i < len(t.counts); i++ { lower, upper := types.NewIntDatum(t.points[2*i]), types.NewIntDatum(t.points[2*i+1]) - bkts = append(bkts, bucket{&lower, &upper, t.counts[i], 0}) + bkts = append(bkts, bucket{&lower, &upper, t.counts[i], 0, t.ndvs[i]}) totalCount += t.counts[i] } defaultBucketCount = t.bucketCount @@ -232,12 +256,12 @@ func encodeInt(v int64) *types.Datum { func (s *testFeedbackSuite) TestFeedbackEncoding(c *C) { hist := NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeLong), 0, 0) q := &QueryFeedback{Hist: hist, Tp: PkType} - q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(3), 1, 0}) - q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(5), 1, 0}) + q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(3), 1, 0, 1}) + q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(5), 1, 0, 1}) val, err := EncodeFeedback(q) c.Assert(err, IsNil) rq := &QueryFeedback{} - c.Assert(DecodeFeedback(val, rq, nil, hist.Tp), IsNil) + c.Assert(DecodeFeedback(val, rq, nil, nil, hist.Tp), IsNil) for _, fb := range rq.Feedback { fb.Lower.SetBytes(codec.EncodeInt(nil, fb.Lower.GetInt64())) fb.Upper.SetBytes(codec.EncodeInt(nil, fb.Upper.GetInt64())) @@ -246,13 +270,13 @@ func (s *testFeedbackSuite) TestFeedbackEncoding(c *C) { hist.Tp = types.NewFieldType(mysql.TypeBlob) q = &QueryFeedback{Hist: hist} - q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(3), 1, 0}) - q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(1), 1, 0}) + q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(3), 1, 0, 1}) + q.Feedback = append(q.Feedback, Feedback{encodeInt(0), encodeInt(1), 1, 0, 1}) val, err = EncodeFeedback(q) c.Assert(err, IsNil) rq = &QueryFeedback{} cms := NewCMSketch(4, 4) - c.Assert(DecodeFeedback(val, rq, cms, hist.Tp), IsNil) + c.Assert(DecodeFeedback(val, rq, cms, nil, hist.Tp), IsNil) c.Assert(cms.QueryBytes(codec.EncodeInt(nil, 0)), Equals, uint64(1)) q.Feedback = q.Feedback[:1] c.Assert(q.Equal(rq), IsTrue) @@ -268,6 +292,9 @@ func (q *QueryFeedback) Equal(rq *QueryFeedback) bool { if fb.Count != rfb.Count { return false } + if fb.Ndv != rfb.Ndv { + return false + } if fb.Lower.Kind() == types.KindInt64 { if fb.Lower.GetInt64() != rfb.Lower.GetInt64() { return false diff --git a/statistics/fmsketch.go b/statistics/fmsketch.go index 235f942bf8415..f640500bae5bf 100644 --- a/statistics/fmsketch.go +++ b/statistics/fmsketch.go @@ -41,6 +41,23 @@ func NewFMSketch(maxSize int) *FMSketch { } } +// Copy makes a copy for current FMSketch. +func (s *FMSketch) Copy() *FMSketch { + if s == nil { + return nil + } + hashset := make(map[uint64]bool) + for key, value := range s.hashset { + hashset[key] = value + } + return &FMSketch{ + hashset: hashset, + mask: s.mask, + maxSize: s.maxSize, + hashFunc: murmur3.New64(), + } +} + // NDV returns the ndv of the sketch. func (s *FMSketch) NDV() int64 { return int64(s.mask+1) * int64(len(s.hashset)) @@ -87,7 +104,11 @@ func buildFMSketch(sc *stmtctx.StatementContext, values []types.Datum, maxSize i return s, s.NDV(), nil } -func (s *FMSketch) mergeFMSketch(rs *FMSketch) { +// MergeFMSketch merges two FM Sketch. +func (s *FMSketch) MergeFMSketch(rs *FMSketch) { + if s == nil || rs == nil { + return + } if s.mask < rs.mask { s.mask = rs.mask for key := range s.hashset { @@ -104,15 +125,20 @@ func (s *FMSketch) mergeFMSketch(rs *FMSketch) { // FMSketchToProto converts FMSketch to its protobuf representation. func FMSketchToProto(s *FMSketch) *tipb.FMSketch { protoSketch := new(tipb.FMSketch) - protoSketch.Mask = s.mask - for val := range s.hashset { - protoSketch.Hashset = append(protoSketch.Hashset, val) + if s != nil { + protoSketch.Mask = s.mask + for val := range s.hashset { + protoSketch.Hashset = append(protoSketch.Hashset, val) + } } return protoSketch } // FMSketchFromProto converts FMSketch from its protobuf representation. func FMSketchFromProto(protoSketch *tipb.FMSketch) *FMSketch { + if protoSketch == nil { + return nil + } sketch := &FMSketch{ hashset: make(map[uint64]bool, len(protoSketch.Hashset)), mask: protoSketch.Mask, @@ -122,3 +148,37 @@ func FMSketchFromProto(protoSketch *tipb.FMSketch) *FMSketch { } return sketch } + +// EncodeFMSketch encodes the given FMSketch to byte slice. +func EncodeFMSketch(c *FMSketch) ([]byte, error) { + if c == nil { + return nil, nil + } + p := FMSketchToProto(c) + protoData, err := p.Marshal() + return protoData, err +} + +// DecodeFMSketch decode a FMSketch from the given byte slice. +func DecodeFMSketch(data []byte) (*FMSketch, error) { + if data == nil { + return nil, nil + } + p := &tipb.FMSketch{} + err := p.Unmarshal(data) + if err != nil { + return nil, errors.Trace(err) + } + fm := FMSketchFromProto(p) + fm.maxSize = 10000 // TODO: add this attribute to PB and persist it instead of using a fixed number(executor.maxSketchSize) + return fm, nil +} + +// MemoryUsage returns the total memory usage of a FMSketch. +func (s *FMSketch) MemoryUsage() (sum int64) { + // In FMSketch, we will ignore the memory usage of `hashFunc`. + // As for the variables mask(uint64) and maxSize(int) each will consume 8 bytes. This is the origin of the constant 16. + // And for the variables hashset(map[uint64]bool), each element in map will consume 9 bytes(8[uint64] + 1[bool]). + sum = int64(16 + 9*len(s.hashset)) + return +} diff --git a/statistics/fmsketch_test.go b/statistics/fmsketch_test.go index fe6a38472b94c..91d0bbea69a23 100644 --- a/statistics/fmsketch_test.go +++ b/statistics/fmsketch_test.go @@ -46,8 +46,8 @@ func (s *testStatisticsSuite) TestSketch(c *C) { c.Check(err, IsNil) c.Check(ndv, Equals, int64(100480)) - sampleSketch.mergeFMSketch(pkSketch) - sampleSketch.mergeFMSketch(rcSketch) + sampleSketch.MergeFMSketch(pkSketch) + sampleSketch.MergeFMSketch(rcSketch) c.Check(sampleSketch.NDV(), Equals, int64(100480)) maxSize = 2 @@ -74,3 +74,34 @@ func (s *testStatisticsSuite) TestSketchProtoConversion(c *C) { c.Assert(f.hashset[val], IsTrue) } } + +func (s *testStatisticsSuite) TestFMSketchCoding(c *C) { + sc := &stmtctx.StatementContext{TimeZone: time.Local} + maxSize := 1000 + sampleSketch, ndv, err := buildFMSketch(sc, extractSampleItemsDatums(s.samples), maxSize) + c.Check(err, IsNil) + c.Check(ndv, Equals, int64(6232)) + bytes, err := EncodeFMSketch(sampleSketch) + c.Assert(err, IsNil) + fmsketch, err := DecodeFMSketch(bytes) + c.Assert(err, IsNil) + c.Assert(sampleSketch.NDV(), Equals, fmsketch.NDV()) + + rcSketch, ndv, err := buildFMSketch(sc, s.rc.(*recordSet).data, maxSize) + c.Check(err, IsNil) + c.Check(ndv, Equals, int64(73344)) + bytes, err = EncodeFMSketch(rcSketch) + c.Assert(err, IsNil) + fmsketch, err = DecodeFMSketch(bytes) + c.Assert(err, IsNil) + c.Assert(rcSketch.NDV(), Equals, fmsketch.NDV()) + + pkSketch, ndv, err := buildFMSketch(sc, s.pk.(*recordSet).data, maxSize) + c.Check(err, IsNil) + c.Check(ndv, Equals, int64(100480)) + bytes, err = EncodeFMSketch(pkSketch) + c.Assert(err, IsNil) + fmsketch, err = DecodeFMSketch(bytes) + c.Assert(err, IsNil) + c.Assert(pkSketch.NDV(), Equals, fmsketch.NDV()) +} diff --git a/statistics/handle/bootstrap.go b/statistics/handle/bootstrap.go index f545fda4741cd..83f844934b3c4 100644 --- a/statistics/handle/bootstrap.go +++ b/statistics/handle/bootstrap.go @@ -23,7 +23,6 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/infoschema" - "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" @@ -60,18 +59,16 @@ func (h *Handle) initStatsMeta4Chunk(is infoschema.InfoSchema, cache *statsCache func (h *Handle) initStatsMeta(is infoschema.InfoSchema) (statsCache, error) { sql := "select HIGH_PRIORITY version, table_id, modify_count, count from mysql.stats_meta" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) - } + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) if err != nil { return statsCache{}, errors.Trace(err) } + defer terror.Call(rc.Close) tables := statsCache{tables: make(map[int64]*statistics.Table)} - req := rc[0].NewChunk() + req := rc.NewChunk() iter := chunk.NewIterator4Chunk(req) for { - err := rc[0].Next(context.TODO(), req) + err := rc.Next(context.TODO(), req) if err != nil { return statsCache{}, errors.Trace(err) } @@ -85,7 +82,8 @@ func (h *Handle) initStatsMeta(is infoschema.InfoSchema) (statsCache, error) { func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *statsCache, iter *chunk.Iterator4Chunk) { for row := iter.Begin(); row != iter.End(); row = iter.Next() { - table, ok := cache.tables[row.GetInt64(0)] + tblID, statsVer := row.GetInt64(0), row.GetInt64(8) + table, ok := cache.tables[tblID] if !ok { continue } @@ -103,7 +101,7 @@ func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *stat if idxInfo == nil { continue } - cms, err := statistics.DecodeCMSketch(row.GetBytes(6), nil) + cms, topN, err := statistics.DecodeCMSketchAndTopN(row.GetBytes(6), nil) if err != nil { cms = nil terror.Log(errors.Trace(err)) @@ -112,8 +110,9 @@ func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *stat index := &statistics.Index{ Histogram: *hist, CMSketch: cms, + TopN: topN, Info: idxInfo, - StatsVer: row.GetInt64(8), + StatsVer: statsVer, Flag: row.GetInt64(10), } lastAnalyzePos.Copy(&index.LastAnalyzePos) @@ -129,15 +128,26 @@ func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *stat if colInfo == nil { continue } + var topnCount int64 + // If this is stats of the Version2, we need to consider the topn's count as well. + // See the comments of Version2 for more details. + if statsVer == statistics.Version2 { + var err error + topnCount, err = h.initTopNCountSum(tblID, id) + if err != nil { + terror.Log(err) + } + } hist := statistics.NewHistogram(id, ndv, nullCount, version, &colInfo.FieldType, 0, totColSize) hist.Correlation = row.GetFloat64(9) col := &statistics.Column{ Histogram: *hist, PhysicalID: table.PhysicalID, Info: colInfo, - Count: nullCount, + Count: nullCount + topnCount, IsHandle: tbl.Meta().PKIsHandle && mysql.HasPriKeyFlag(colInfo.Flag), Flag: row.GetInt64(10), + StatsVer: statsVer, } lastAnalyzePos.Copy(&col.LastAnalyzePos) table.Columns[hist.ID] = col @@ -147,17 +157,15 @@ func (h *Handle) initStatsHistograms4Chunk(is infoschema.InfoSchema, cache *stat func (h *Handle) initStatsHistograms(is infoschema.InfoSchema, cache *statsCache) error { sql := "select HIGH_PRIORITY table_id, is_index, hist_id, distinct_count, version, null_count, cm_sketch, tot_col_size, stats_ver, correlation, flag, last_analyze_pos from mysql.stats_histograms" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) - } + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) if err != nil { return errors.Trace(err) } - req := rc[0].NewChunk() + defer terror.Call(rc.Close) + req := rc.NewChunk() iter := chunk.NewIterator4Chunk(req) for { - err := rc[0].Next(context.TODO(), req) + err := rc.Next(context.TODO(), req) if err != nil { return errors.Trace(err) } @@ -170,6 +178,7 @@ func (h *Handle) initStatsHistograms(is infoschema.InfoSchema, cache *statsCache } func (h *Handle) initStatsTopN4Chunk(cache *statsCache, iter *chunk.Iterator4Chunk) { + affectedIndexes := make(map[int64]*statistics.Index) for row := iter.Begin(); row != iter.End(); row = iter.Next() { table, ok := cache.tables[row.GetInt64(0)] if !ok { @@ -179,25 +188,30 @@ func (h *Handle) initStatsTopN4Chunk(cache *statsCache, iter *chunk.Iterator4Chu if !ok || idx.CMSketch == nil { continue } + if idx.TopN == nil { + idx.TopN = statistics.NewTopN(32) + } + affectedIndexes[row.GetInt64(1)] = idx data := make([]byte, len(row.GetBytes(2))) copy(data, row.GetBytes(2)) - idx.CMSketch.AppendTopN(data, row.GetUint64(3)) + idx.TopN.AppendTopN(data, row.GetUint64(3)) + } + for _, idx := range affectedIndexes { + idx.TopN.Sort() } } func (h *Handle) initStatsTopN(cache *statsCache) error { sql := "select HIGH_PRIORITY table_id, hist_id, value, count from mysql.stats_top_n where is_index = 1" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) - } + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) if err != nil { return errors.Trace(err) } - req := rc[0].NewChunk() + defer terror.Call(rc.Close) + req := rc.NewChunk() iter := chunk.NewIterator4Chunk(req) for { - err := rc[0].Next(context.TODO(), req) + err := rc.Next(context.TODO(), req) if err != nil { return errors.Trace(err) } @@ -209,7 +223,48 @@ func (h *Handle) initStatsTopN(cache *statsCache) error { return nil } -func initStatsBuckets4Chunk(ctx sessionctx.Context, cache *statsCache, iter *chunk.Iterator4Chunk) { +func (h *Handle) initStatsFMSketch4Chunk(cache *statsCache, iter *chunk.Iterator4Chunk) { + for row := iter.Begin(); row != iter.End(); row = iter.Next() { + table, ok := cache.tables[row.GetInt64(0)] + if !ok { + continue + } + colStats, ok := table.Columns[row.GetInt64(1)] + if !ok { + continue + } + fms, err := statistics.DecodeFMSketch(row.GetBytes(2)) + if err != nil { + fms = nil + terror.Log(errors.Trace(err)) + } + colStats.FMSketch = fms + } +} + +func (h *Handle) initStatsFMSketch(cache *statsCache) error { + sql := "select HIGH_PRIORITY table_id, hist_id, value from mysql.stats_fm_sketch where is_index = 0" + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) + if err != nil { + return errors.Trace(err) + } + defer terror.Call(rc.Close) + req := rc.NewChunk() + iter := chunk.NewIterator4Chunk(req) + for { + err := rc.Next(context.TODO(), req) + if err != nil { + return errors.Trace(err) + } + if req.NumRows() == 0 { + break + } + h.initStatsFMSketch4Chunk(cache, iter) + } + return nil +} + +func (h *Handle) initStatsBuckets4Chunk(cache *statsCache, iter *chunk.Iterator4Chunk) { for row := iter.Begin(); row != iter.End(); row = iter.Next() { tableID, isIndex, histID := row.GetInt64(0), row.GetInt64(1), row.GetInt64(2) table, ok := cache.tables[tableID] @@ -237,44 +292,66 @@ func initStatsBuckets4Chunk(ctx sessionctx.Context, cache *statsCache, iter *chu hist = &column.Histogram d := types.NewBytesDatum(row.GetBytes(5)) var err error - lower, err = d.ConvertTo(ctx.GetSessionVars().StmtCtx, &column.Info.FieldType) + lower, err = d.ConvertTo(h.mu.ctx.GetSessionVars().StmtCtx, &column.Info.FieldType) if err != nil { logutil.BgLogger().Debug("decode bucket lower bound failed", zap.Error(err)) delete(table.Columns, histID) continue } d = types.NewBytesDatum(row.GetBytes(6)) - upper, err = d.ConvertTo(ctx.GetSessionVars().StmtCtx, &column.Info.FieldType) + upper, err = d.ConvertTo(h.mu.ctx.GetSessionVars().StmtCtx, &column.Info.FieldType) if err != nil { logutil.BgLogger().Debug("decode bucket upper bound failed", zap.Error(err)) delete(table.Columns, histID) continue } } - hist.AppendBucket(&lower, &upper, row.GetInt64(3), row.GetInt64(4)) + hist.AppendBucketWithNDV(&lower, &upper, row.GetInt64(3), row.GetInt64(4), row.GetInt64(7)) } } -func (h *Handle) initStatsBuckets(cache *statsCache) error { - sql := "select HIGH_PRIORITY table_id, is_index, hist_id, count, repeats, lower_bound, upper_bound from mysql.stats_buckets order by table_id, is_index, hist_id, bucket_id" - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) +func (h *Handle) initTopNCountSum(tableID, colID int64) (int64, error) { + // Before stats ver 2, histogram represents all data in this column. + // In stats ver 2, histogram + TopN represent all data in this column. + // So we need to add TopN total count here. + selSQL := fmt.Sprintf("select sum(count) from mysql.stats_top_n where table_id = %d and is_index = 0 and hist_id = %d", tableID, colID) + rs, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), selSQL) + if len(rs) > 0 { + defer terror.Call(rs[0].Close) } + if err != nil { + return 0, err + } + req := rs[0].NewChunk() + iter := chunk.NewIterator4Chunk(req) + err = rs[0].Next(context.TODO(), req) + if err != nil { + return 0, err + } + if req.NumRows() == 0 { + return 0, nil + } + return iter.Begin().GetMyDecimal(0).ToInt() +} + +func (h *Handle) initStatsBuckets(cache *statsCache) error { + sql := "select HIGH_PRIORITY table_id, is_index, hist_id, count, repeats, lower_bound, upper_bound, ndv from mysql.stats_buckets order by table_id, is_index, hist_id, bucket_id" + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql) if err != nil { return errors.Trace(err) } - req := rc[0].NewChunk() + defer terror.Call(rc.Close) + req := rc.NewChunk() iter := chunk.NewIterator4Chunk(req) for { - err := rc[0].Next(context.TODO(), req) + err := rc.Next(context.TODO(), req) if err != nil { return errors.Trace(err) } if req.NumRows() == 0 { break } - initStatsBuckets4Chunk(h.mu.ctx, cache, iter) + h.initStatsBuckets4Chunk(cache, iter) } lastVersion := uint64(0) for _, table := range cache.tables { @@ -300,13 +377,13 @@ func (h *Handle) initStatsBuckets(cache *statsCache) error { func (h *Handle) InitStats(is infoschema.InfoSchema) (err error) { h.mu.Lock() defer func() { - _, err1 := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), "commit") + _, err1 := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), "commit") if err == nil && err1 != nil { err = err1 } h.mu.Unlock() }() - _, err = h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), "begin") + _, err = h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), "begin") if err != nil { return err } @@ -322,6 +399,10 @@ func (h *Handle) InitStats(is infoschema.InfoSchema) (err error) { if err != nil { return err } + err = h.initStatsFMSketch(&cache) + if err != nil { + return err + } err = h.initStatsBuckets(&cache) if err != nil { return errors.Trace(err) diff --git a/statistics/handle/ddl.go b/statistics/handle/ddl.go index eaed8e036c7fa..4004fd1145c49 100644 --- a/statistics/handle/ddl.go +++ b/statistics/handle/ddl.go @@ -15,13 +15,13 @@ package handle import ( "context" - "fmt" "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl/util" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/sqlexec" ) @@ -30,38 +30,52 @@ import ( func (h *Handle) HandleDDLEvent(t *util.Event) error { switch t.Tp { case model.ActionCreateTable, model.ActionTruncateTable: - ids := getPhysicalIDs(t.TableInfo) + ids := h.getInitStateTableIDs(t.TableInfo) for _, id := range ids { if err := h.insertTableStats2KV(t.TableInfo, id); err != nil { return err } } case model.ActionAddColumn, model.ActionAddColumns, model.ActionModifyColumn: - ids := getPhysicalIDs(t.TableInfo) + ids := h.getInitStateTableIDs(t.TableInfo) for _, id := range ids { if err := h.insertColStats2KV(id, t.ColumnInfos); err != nil { return err } } case model.ActionAddTablePartition, model.ActionTruncateTablePartition: - for _, def := range t.PartInfo.Definitions { - if err := h.insertTableStats2KV(t.TableInfo, def.ID); err != nil { - return err + pruneMode := h.CurrentPruneMode() + if pruneMode == variable.Static { + for _, def := range t.PartInfo.Definitions { + if err := h.insertTableStats2KV(t.TableInfo, def.ID); err != nil { + return err + } } } + if pruneMode == variable.Dynamic { + // TODO: need trigger full analyze + } + case model.ActionDropTablePartition: + pruneMode := h.CurrentPruneMode() + if pruneMode == variable.Dynamic { + // TODO: need trigger full analyze + } } return nil } -func getPhysicalIDs(tblInfo *model.TableInfo) []int64 { +func (h *Handle) getInitStateTableIDs(tblInfo *model.TableInfo) (ids []int64) { pi := tblInfo.GetPartitionInfo() if pi == nil { return []int64{tblInfo.ID} } - ids := make([]int64, 0, len(pi.Definitions)) + ids = make([]int64, 0, len(pi.Definitions)+1) for _, def := range pi.Definitions { ids = append(ids, def.ID) } + if h.CurrentPruneMode() == variable.Dynamic { + ids = append(ids, tblInfo.ID) + } return ids } @@ -75,28 +89,34 @@ func (h *Handle) DDLEventCh() chan *util.Event { func (h *Handle) insertTableStats2KV(info *model.TableInfo, physicalID int64) (err error) { h.mu.Lock() defer h.mu.Unlock() + ctx := context.Background() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(context.Background(), "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return errors.Trace(err) } defer func() { - err = finishTransaction(context.Background(), exec, err) + err = finishTransaction(ctx, exec, err) }() txn, err := h.mu.ctx.Txn(true) if err != nil { return errors.Trace(err) } startTS := txn.StartTS() - sqls := make([]string, 0, 1+len(info.Columns)+len(info.Indices)) - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_meta (version, table_id) values(%d, %d)", startTS, physicalID)) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_meta (version, table_id) values(%?, %?)", startTS, physicalID); err != nil { + return err + } for _, col := range info.Columns { - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 0, %d, 0, %d)", physicalID, col.ID, startTS)) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%?, 0, %?, 0, %?)", physicalID, col.ID, startTS); err != nil { + return err + } } for _, idx := range info.Indices { - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%d, 1, %d, 0, %d)", physicalID, idx.ID, startTS)) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version) values(%?, 1, %?, 0, %?)", physicalID, idx.ID, startTS); err != nil { + return err + } } - return execSQLs(context.Background(), exec, sqls) + return nil } // insertColStats2KV insert a record to stats_histograms with distinct_count 1 and insert a bucket to stats_buckets with default value. @@ -105,13 +125,14 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf h.mu.Lock() defer h.mu.Unlock() + ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(context.Background(), "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return errors.Trace(err) } defer func() { - err = finishTransaction(context.Background(), exec, err) + err = finishTransaction(ctx, exec, err) }() txn, err := h.mu.ctx.Txn(true) if err != nil { @@ -119,29 +140,25 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf } startTS := txn.StartTS() // First of all, we update the version. - _, err = exec.Execute(context.Background(), fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", startTS, physicalID)) + _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %? where table_id = %?", startTS, physicalID) if err != nil { return } - ctx := context.TODO() // If we didn't update anything by last SQL, it means the stats of this table does not exist. if h.mu.ctx.GetSessionVars().StmtCtx.AffectedRows() > 0 { // By this step we can get the count of this table, then we can sure the count and repeats of bucket. - var rs []sqlexec.RecordSet - rs, err = exec.Execute(ctx, fmt.Sprintf("select count from mysql.stats_meta where table_id = %d", physicalID)) - if len(rs) > 0 { - defer terror.Call(rs[0].Close) - } + var rs sqlexec.RecordSet + rs, err = exec.ExecuteInternal(ctx, "select count from mysql.stats_meta where table_id = %?", physicalID) if err != nil { return } - req := rs[0].NewChunk() - err = rs[0].Next(ctx, req) + defer terror.Call(rs.Close) + req := rs.NewChunk() + err = rs.Next(ctx, req) if err != nil { return } count := req.GetRow(0).GetInt64(0) - sqls := make([]string, 0, len(colInfos)) for _, colInfo := range colInfos { value := types.NewDatum(colInfo.GetOriginDefaultValue()) value, err = value.ConvertTo(h.mu.ctx.GetSessionVars().StmtCtx, &colInfo.FieldType) @@ -150,19 +167,24 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf } if value.IsNull() { // If the adding column has default value null, all the existing rows have null value on the newly added column. - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, null_count) values (%d, %d, 0, %d, 0, %d)", startTS, physicalID, colInfo.ID, count)) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, null_count) values (%?, %?, 0, %?, 0, %?)", startTS, physicalID, colInfo.ID, count); err != nil { + return err + } } else { // If this stats exists, we insert histogram meta first, the distinct_count will always be one. - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, tot_col_size) values (%d, %d, 0, %d, 1, %d)", startTS, physicalID, colInfo.ID, int64(len(value.GetBytes()))*count)) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_histograms (version, table_id, is_index, hist_id, distinct_count, tot_col_size) values (%?, %?, 0, %?, 1, %?)", startTS, physicalID, colInfo.ID, int64(len(value.GetBytes()))*count); err != nil { + return err + } value, err = value.ConvertTo(h.mu.ctx.GetSessionVars().StmtCtx, types.NewFieldType(mysql.TypeBlob)) if err != nil { return } // There must be only one bucket for this new column and the value is the default value. - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_buckets (table_id, is_index, hist_id, bucket_id, repeats, count, lower_bound, upper_bound) values (%d, 0, %d, 0, %d, %d, X'%X', X'%X')", physicalID, colInfo.ID, count, count, value.GetBytes(), value.GetBytes())) + if _, err := exec.ExecuteInternal(ctx, "insert into mysql.stats_buckets (table_id, is_index, hist_id, bucket_id, repeats, count, lower_bound, upper_bound) values (%?, 0, %?, 0, %?, %?, %?, %?)", physicalID, colInfo.ID, count, count, value.GetBytes(), value.GetBytes()); err != nil { + return err + } } } - return execSQLs(context.Background(), exec, sqls) } return } @@ -170,20 +192,10 @@ func (h *Handle) insertColStats2KV(physicalID int64, colInfos []*model.ColumnInf // finishTransaction will execute `commit` when error is nil, otherwise `rollback`. func finishTransaction(ctx context.Context, exec sqlexec.SQLExecutor, err error) error { if err == nil { - _, err = exec.Execute(ctx, "commit") + _, err = exec.ExecuteInternal(ctx, "commit") } else { - _, err1 := exec.Execute(ctx, "rollback") + _, err1 := exec.ExecuteInternal(ctx, "rollback") terror.Log(errors.Trace(err1)) } return errors.Trace(err) } - -func execSQLs(ctx context.Context, exec sqlexec.SQLExecutor, sqls []string) error { - for _, sql := range sqls { - _, err := exec.Execute(ctx, sql) - if err != nil { - return err - } - } - return nil -} diff --git a/statistics/handle/ddl_test.go b/statistics/handle/ddl_test.go index 348f65f160ca1..c62e80d372766 100644 --- a/statistics/handle/ddl_test.go +++ b/statistics/handle/ddl_test.go @@ -119,7 +119,7 @@ func (s *testStatsSuite) TestDDLHistogram(c *C) { statsTbl := do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.Pseudo, IsFalse) c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].NullCount, Equals, int64(2)) - c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].NDV, Equals, int64(0)) + c.Check(statsTbl.Columns[tableInfo.Columns[2].ID].Histogram.NDV, Equals, int64(0)) testKit.MustExec("alter table t add column c3 int NOT NULL") err = h.HandleDDLEvent(<-h.DDLEventCh()) @@ -185,7 +185,7 @@ func (s *testStatsSuite) TestDDLHistogram(c *C) { func (s *testStatsSuite) TestDDLPartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("drop table if exists t") createTable := `CREATE TABLE t (a int, b int, primary key(a), index idx(b)) diff --git a/statistics/handle/dump.go b/statistics/handle/dump.go index 18729063b48a9..1f20855742a76 100644 --- a/statistics/handle/dump.go +++ b/statistics/handle/dump.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/infoschema" + "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/types" @@ -41,7 +42,6 @@ type JSONTable struct { type jsonExtendedStats struct { StatsName string `json:"stats_name"` - DB string `json:"db"` ColIDs []int64 `json:"cols"` Tp uint8 `json:"type"` ScalarVals float64 `json:"scalar_vals"` @@ -53,10 +53,9 @@ func dumpJSONExtendedStats(statsColl *statistics.ExtendedStatsColl) []*jsonExten return nil } stats := make([]*jsonExtendedStats, 0, len(statsColl.Stats)) - for key, item := range statsColl.Stats { + for name, item := range statsColl.Stats { js := &jsonExtendedStats{ - StatsName: key.StatsName, - DB: key.DB, + StatsName: name, ColIDs: item.ColIDs, Tp: item.Tp, ScalarVals: item.ScalarVals, @@ -73,17 +72,13 @@ func extendedStatsFromJSON(statsColl []*jsonExtendedStats) *statistics.ExtendedS } stats := statistics.NewExtendedStatsColl() for _, js := range statsColl { - key := statistics.ExtendedStatsKey{ - StatsName: js.StatsName, - DB: js.DB, - } item := &statistics.ExtendedStatsItem{ ColIDs: js.ColIDs, Tp: js.Tp, ScalarVals: js.ScalarVals, StringVals: js.StringVals, } - stats.Stats[key] = item + stats.Stats[js.StatsName] = item } return stats } @@ -91,31 +86,48 @@ func extendedStatsFromJSON(statsColl []*jsonExtendedStats) *statistics.ExtendedS type jsonColumn struct { Histogram *tipb.Histogram `json:"histogram"` CMSketch *tipb.CMSketch `json:"cm_sketch"` + FMSketch *tipb.FMSketch `json:"fm_sketch"` NullCount int64 `json:"null_count"` TotColSize int64 `json:"tot_col_size"` LastUpdateVersion uint64 `json:"last_update_version"` Correlation float64 `json:"correlation"` + // StatsVer is a pointer here since the old version json file would not contain version information. + StatsVer *int64 `json:"stats_ver"` } -func dumpJSONCol(hist *statistics.Histogram, CMSketch *statistics.CMSketch) *jsonColumn { +func dumpJSONCol(hist *statistics.Histogram, CMSketch *statistics.CMSketch, topn *statistics.TopN, FMSketch *statistics.FMSketch, statsVer *int64) *jsonColumn { jsonCol := &jsonColumn{ Histogram: statistics.HistogramToProto(hist), NullCount: hist.NullCount, TotColSize: hist.TotColSize, LastUpdateVersion: hist.LastUpdateVersion, Correlation: hist.Correlation, + StatsVer: statsVer, + } + if CMSketch != nil || topn != nil { + jsonCol.CMSketch = statistics.CMSketchToProto(CMSketch, topn) } - if CMSketch != nil { - jsonCol.CMSketch = statistics.CMSketchToProto(CMSketch) + if FMSketch != nil { + jsonCol.FMSketch = statistics.FMSketchToProto(FMSketch) } return jsonCol } // DumpStatsToJSON dumps statistic to json. func (h *Handle) DumpStatsToJSON(dbName string, tableInfo *model.TableInfo, historyStatsExec sqlexec.RestrictedSQLExecutor) (*JSONTable, error) { + var snapshot uint64 + if historyStatsExec != nil { + sctx := historyStatsExec.(sessionctx.Context) + snapshot = sctx.GetSessionVars().SnapshotTS + } + return h.DumpStatsToJSONBySnapshot(dbName, tableInfo, snapshot) +} + +// DumpStatsToJSONBySnapshot dumps statistic to json. +func (h *Handle) DumpStatsToJSONBySnapshot(dbName string, tableInfo *model.TableInfo, snapshot uint64) (*JSONTable, error) { pi := tableInfo.GetPartitionInfo() if pi == nil { - return h.tableStatsToJSON(dbName, tableInfo, tableInfo.ID, historyStatsExec) + return h.tableStatsToJSON(dbName, tableInfo, tableInfo.ID, snapshot) } jsonTbl := &JSONTable{ DatabaseName: dbName, @@ -123,7 +135,7 @@ func (h *Handle) DumpStatsToJSON(dbName string, tableInfo *model.TableInfo, hist Partitions: make(map[string]*JSONTable, len(pi.Definitions)), } for _, def := range pi.Definitions { - tbl, err := h.tableStatsToJSON(dbName, tableInfo, def.ID, historyStatsExec) + tbl, err := h.tableStatsToJSON(dbName, tableInfo, def.ID, snapshot) if err != nil { return nil, errors.Trace(err) } @@ -132,15 +144,23 @@ func (h *Handle) DumpStatsToJSON(dbName string, tableInfo *model.TableInfo, hist } jsonTbl.Partitions[def.Name.L] = tbl } + // dump its global-stats if existed + tbl, err := h.tableStatsToJSON(dbName, tableInfo, tableInfo.ID, snapshot) + if err != nil { + return nil, errors.Trace(err) + } + if tbl != nil { + jsonTbl.Partitions["global"] = tbl + } return jsonTbl, nil } -func (h *Handle) tableStatsToJSON(dbName string, tableInfo *model.TableInfo, physicalID int64, historyStatsExec sqlexec.RestrictedSQLExecutor) (*JSONTable, error) { - tbl, err := h.tableStatsFromStorage(tableInfo, physicalID, true, historyStatsExec) +func (h *Handle) tableStatsToJSON(dbName string, tableInfo *model.TableInfo, physicalID int64, snapshot uint64) (*JSONTable, error) { + tbl, err := h.TableStatsFromStorage(tableInfo, physicalID, true, snapshot) if err != nil || tbl == nil { return nil, err } - tbl.Version, tbl.ModifyCount, tbl.Count, err = h.statsMetaByTableIDFromStorage(physicalID, historyStatsExec) + tbl.Version, tbl.ModifyCount, tbl.Count, err = h.statsMetaByTableIDFromStorage(physicalID, snapshot) if err != nil { return nil, err } @@ -159,11 +179,11 @@ func (h *Handle) tableStatsToJSON(dbName string, tableInfo *model.TableInfo, phy if err != nil { return nil, errors.Trace(err) } - jsonTbl.Columns[col.Info.Name.L] = dumpJSONCol(hist, col.CMSketch) + jsonTbl.Columns[col.Info.Name.L] = dumpJSONCol(hist, col.CMSketch, col.TopN, col.FMSketch, &col.StatsVer) } for _, idx := range tbl.Indices { - jsonTbl.Indices[idx.Info.Name.L] = dumpJSONCol(&idx.Histogram, idx.CMSketch) + jsonTbl.Indices[idx.Info.Name.L] = dumpJSONCol(&idx.Histogram, idx.CMSketch, idx.TopN, nil, &idx.StatsVer) } jsonTbl.ExtStats = dumpJSONExtendedStats(tbl.ExtendedStats) return jsonTbl, nil @@ -177,15 +197,12 @@ func (h *Handle) LoadStatsFromJSON(is infoschema.InfoSchema, jsonTbl *JSONTable) } tableInfo := table.Meta() pi := tableInfo.GetPartitionInfo() - if pi == nil { + if pi == nil || jsonTbl.Partitions == nil { err := h.loadStatsFromJSON(tableInfo, tableInfo.ID, jsonTbl) if err != nil { return errors.Trace(err) } } else { - if jsonTbl.Partitions == nil { - return errors.New("No partition statistics") - } for _, def := range pi.Definitions { tbl := jsonTbl.Partitions[def.Name.L] if tbl == nil { @@ -196,6 +213,12 @@ func (h *Handle) LoadStatsFromJSON(is infoschema.InfoSchema, jsonTbl *JSONTable) return errors.Trace(err) } } + // load global-stats if existed + if globalStats, ok := jsonTbl.Partitions["global"]; ok { + if err := h.loadStatsFromJSON(tableInfo, tableInfo.ID, globalStats); err != nil { + return errors.Trace(err) + } + } } return errors.Trace(h.Update(is)) } @@ -207,13 +230,13 @@ func (h *Handle) loadStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, } for _, col := range tbl.Columns { - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, &col.Histogram, col.CMSketch, 1) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 0, &col.Histogram, col.CMSketch, col.TopN, col.FMSketch, int(col.StatsVer), 1) if err != nil { return errors.Trace(err) } } for _, idx := range tbl.Indices { - err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 1, &idx.Histogram, idx.CMSketch, 1) + err = h.SaveStatsToStorage(tbl.PhysicalID, tbl.Count, 1, &idx.Histogram, idx.CMSketch, idx.TopN, nil, int(idx.StatsVer), 1) if err != nil { return errors.Trace(err) } @@ -245,10 +268,19 @@ func TableStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, jsonTbl *J } hist := statistics.HistogramFromProto(jsonIdx.Histogram) hist.ID, hist.NullCount, hist.LastUpdateVersion, hist.Correlation = idxInfo.ID, jsonIdx.NullCount, jsonIdx.LastUpdateVersion, jsonIdx.Correlation + cm, topN := statistics.CMSketchAndTopNFromProto(jsonIdx.CMSketch) + // If the statistics is loaded from a JSON without stats version, + // we set it to 1. + statsVer := int64(statistics.Version1) + if jsonIdx.StatsVer != nil { + statsVer = *jsonIdx.StatsVer + } idx := &statistics.Index{ Histogram: *hist, - CMSketch: statistics.CMSketchFromProto(jsonIdx.CMSketch), + CMSketch: cm, + TopN: topN, Info: idxInfo, + StatsVer: statsVer, } tbl.Indices[idx.ID] = idx } @@ -260,21 +292,31 @@ func TableStatsFromJSON(tableInfo *model.TableInfo, physicalID int64, jsonTbl *J continue } hist := statistics.HistogramFromProto(jsonCol.Histogram) - count := int64(hist.TotalRowCount()) sc := &stmtctx.StatementContext{TimeZone: time.UTC} hist, err := hist.ConvertTo(sc, &colInfo.FieldType) if err != nil { return nil, errors.Trace(err) } + cm, topN := statistics.CMSketchAndTopNFromProto(jsonCol.CMSketch) + fms := statistics.FMSketchFromProto(jsonCol.FMSketch) hist.ID, hist.NullCount, hist.LastUpdateVersion, hist.TotColSize, hist.Correlation = colInfo.ID, jsonCol.NullCount, jsonCol.LastUpdateVersion, jsonCol.TotColSize, jsonCol.Correlation + // If the statistics is loaded from a JSON without stats version, + // we set it to 1. + statsVer := int64(statistics.Version1) + if jsonCol.StatsVer != nil { + statsVer = *jsonCol.StatsVer + } col := &statistics.Column{ PhysicalID: physicalID, Histogram: *hist, - CMSketch: statistics.CMSketchFromProto(jsonCol.CMSketch), + CMSketch: cm, + TopN: topN, + FMSketch: fms, Info: colInfo, - Count: count, IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.Flag), + StatsVer: statsVer, } + col.Count = int64(col.TotalRowCount()) tbl.Columns[col.ID] = col } } diff --git a/statistics/handle/dump_test.go b/statistics/handle/dump_test.go index d68181e0e8cab..ef02403c48ac5 100644 --- a/statistics/handle/dump_test.go +++ b/statistics/handle/dump_test.go @@ -14,6 +14,7 @@ package handle_test import ( + "encoding/json" "fmt" "sync" @@ -63,6 +64,70 @@ func (s *testStatsSuite) TestConversion(c *C) { assertTableEqual(c, loadTblInStorage, tbl) } +func (s *testStatsSuite) getStatsJSON(c *C, db, tableName string) *handle.JSONTable { + is := s.do.InfoSchema() + h := s.do.StatsHandle() + c.Assert(h.Update(is), IsNil) + table, err := is.TableByName(model.NewCIStr(db), model.NewCIStr(tableName)) + c.Assert(err, IsNil) + tableInfo := table.Meta() + jsonTbl, err := h.DumpStatsToJSON("test", tableInfo, nil) + c.Assert(err, IsNil) + return jsonTbl +} + +func (s *testStatsSuite) TestDumpGlobalStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode = 'static'") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, key(a)) partition by hash(a) partitions 2") + tk.MustExec("insert into t values (1), (2)") + tk.MustExec("analyze table t") + + // global-stats is not existed + stats := s.getStatsJSON(c, "test", "t") + c.Assert(stats.Partitions["p0"], NotNil) + c.Assert(stats.Partitions["p1"], NotNil) + c.Assert(stats.Partitions["global"], IsNil) + + // global-stats is existed + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("analyze table t") + stats = s.getStatsJSON(c, "test", "t") + c.Assert(stats.Partitions["p0"], NotNil) + c.Assert(stats.Partitions["p1"], NotNil) + c.Assert(stats.Partitions["global"], NotNil) +} + +func (s *testStatsSuite) TestLoadGlobalStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t (a int, key(a)) partition by hash(a) partitions 2") + tk.MustExec("insert into t values (1), (2)") + tk.MustExec("analyze table t") + globalStats := s.getStatsJSON(c, "test", "t") + + // remove all statistics + tk.MustExec("delete from mysql.stats_meta") + tk.MustExec("delete from mysql.stats_histograms") + tk.MustExec("delete from mysql.stats_buckets") + s.do.StatsHandle().Clear() + clearedStats := s.getStatsJSON(c, "test", "t") + c.Assert(len(clearedStats.Partitions), Equals, 0) + + // load global-stats back + c.Assert(s.do.StatsHandle().LoadStatsFromJSON(s.do.InfoSchema(), globalStats), IsNil) + loadedStats := s.getStatsJSON(c, "test", "t") + c.Assert(len(loadedStats.Partitions), Equals, 3) // p0, p1, global +} + func (s *testStatsSuite) TestDumpPartitions(c *C) { defer cleanEnv(c, s.store, s.do) tk := testkit.NewTestKit(c, s.store) @@ -147,10 +212,10 @@ func (s *testStatsSuite) TestDumpCMSketchWithTopN(c *C) { for i := 0; i < 30; i++ { fakeData = append(fakeData, []byte(fmt.Sprintf("%01024d", i))) } - cms, _, _ := statistics.NewCMSketchWithTopN(5, 2048, fakeData, 20, 100) + cms, _, _, _ := statistics.NewCMSketchAndTopN(5, 2048, fakeData, 20, 100) stat := h.GetTableStats(tableInfo) - err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, 1) + err = h.SaveStatsToStorage(tableInfo.ID, 1, 0, &stat.Columns[tableInfo.Columns[0].ID].Histogram, cms, nil, nil, statistics.Version2, 1) c.Assert(err, IsNil) c.Assert(h.Update(is), IsNil) @@ -188,13 +253,14 @@ func (s *testStatsSuite) TestDumpPseudoColumns(c *C) { func (s *testStatsSuite) TestDumpExtendedStats(c *C) { defer cleanEnv(c, s.store, s.do) tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set session tidb_enable_extended_stats = on") tk.MustExec("use test") tk.MustExec("drop table if exists t") tk.MustExec("create table t(a int, b int)") tk.MustExec("insert into t values(1,5),(2,4),(3,3),(4,2),(5,1)") h := s.do.StatsHandle() c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - tk.MustExec("create statistics s1(correlation) on t(a,b)") + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") tk.MustExec("analyze table t") is := s.do.InfoSchema() @@ -220,3 +286,54 @@ func (s *testStatsSuite) TestDumpExtendedStats(c *C) { loadTblInStorage := h.GetTableStats(tableInfo.Meta()) assertTableEqual(c, loadTblInStorage, tbl) } + +func (s *testStatsSuite) TestDumpVer2Stats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b varchar(10))") + tk.MustExec("insert into t value(1, 'aaa'), (3, 'aab'), (5, 'bba'), (2, 'bbb'), (4, 'cca'), (6, 'ccc')") + // mark column stats as needed + tk.MustExec("select * from t where a = 3") + tk.MustExec("select * from t where b = 'bbb'") + tk.MustExec("alter table t add index single(a)") + tk.MustExec("alter table t add index multi(a, b)") + tk.MustExec("analyze table t with 2 topn") + h := s.do.StatsHandle() + is := s.do.InfoSchema() + tableInfo, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + + storageTbl, err := h.TableStatsFromStorage(tableInfo.Meta(), tableInfo.Meta().ID, false, 0) + c.Assert(err, IsNil) + + dumpJSONTable, err := h.DumpStatsToJSON("test", tableInfo.Meta(), nil) + c.Assert(err, IsNil) + + jsonBytes, err := json.MarshalIndent(dumpJSONTable, "", " ") + c.Assert(err, IsNil) + + loadJSONTable := &handle.JSONTable{} + err = json.Unmarshal(jsonBytes, loadJSONTable) + c.Assert(err, IsNil) + + loadTbl, err := handle.TableStatsFromJSON(tableInfo.Meta(), tableInfo.Meta().ID, loadJSONTable) + c.Assert(err, IsNil) + + // assert that a statistics.Table from storage dumped into JSON text and then unmarshalled into a statistics.Table keeps unchanged + assertTableEqual(c, loadTbl, storageTbl) + + // assert that this statistics.Table is the same as the one in stats cache + statsCacheTbl := h.GetTableStats(tableInfo.Meta()) + assertTableEqual(c, loadTbl, statsCacheTbl) + + err = h.LoadStatsFromJSON(is, loadJSONTable) + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + statsCacheTbl = h.GetTableStats(tableInfo.Meta()) + // assert that after the JSONTable above loaded into storage then updated into the stats cache, + // the statistics.Table in the stats cache is the same as the unmarshalled statistics.Table + assertTableEqual(c, statsCacheTbl, loadTbl) +} diff --git a/statistics/handle/gc.go b/statistics/handle/gc.go index 65f978c82c7b0..6a7500d663528 100644 --- a/statistics/handle/gc.go +++ b/statistics/handle/gc.go @@ -16,7 +16,6 @@ package handle import ( "context" "encoding/json" - "fmt" "time" "github.com/cznic/mathutil" @@ -30,6 +29,7 @@ import ( // GCStats will garbage collect the useless stats info. For dropped tables, we will first update their version so that // other tidb could know that table is deleted. func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error { + ctx := context.Background() // To make sure that all the deleted tables' schema and stats info have been acknowledged to all tidb, // we only garbage collect version before 10 lease. lease := mathutil.MaxInt64(int64(h.Lease()), int64(ddlLease)) @@ -38,8 +38,7 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error return nil } gcVer := h.LastUpdateVersion() - offset - sql := fmt.Sprintf("select table_id from mysql.stats_meta where version < %d", gcVer) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + rows, _, err := h.execRestrictedSQL(ctx, "select table_id from mysql.stats_meta where version < %?", gcVer) if err != nil { return errors.Trace(err) } @@ -52,23 +51,24 @@ func (h *Handle) GCStats(is infoschema.InfoSchema, ddlLease time.Duration) error } func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error { - sql := fmt.Sprintf("select is_index, hist_id from mysql.stats_histograms where table_id = %d", physicalID) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + ctx := context.Background() + rows, _, err := h.execRestrictedSQL(ctx, "select is_index, hist_id from mysql.stats_histograms where table_id = %?", physicalID) if err != nil { return errors.Trace(err) } // The table has already been deleted in stats and acknowledged to all tidb, // we can safely remove the meta info now. if len(rows) == 0 { - sql := fmt.Sprintf("delete from mysql.stats_meta where table_id = %d", physicalID) - _, _, err := h.restrictedExec.ExecRestrictedSQL(sql) - return errors.Trace(err) + _, _, err = h.execRestrictedSQL(ctx, "delete from mysql.stats_meta where table_id = %?", physicalID) + if err != nil { + return errors.Trace(err) + } } h.mu.Lock() tbl, ok := h.getTableByPhysicalID(is, physicalID) h.mu.Unlock() if !ok { - return errors.Trace(h.DeleteTableStatsFromKV(physicalID)) + return errors.Trace(h.DeleteTableStatsFromKV([]int64{physicalID})) } tblInfo := tbl.Meta() for _, row := range rows { @@ -96,8 +96,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error } } // Mark records in mysql.stats_extended as `deleted`. - sql = fmt.Sprintf("select stats_name, db, column_ids from mysql.stats_extended where table_id = %d and status in (%d, %d)", physicalID, StatsStatusAnalyzed, StatsStatusInited) - rows, _, err = h.restrictedExec.ExecRestrictedSQL(sql) + rows, _, err = h.execRestrictedSQL(ctx, "select name, column_ids from mysql.stats_extended where table_id = %? and status in (%?, %?)", physicalID, StatsStatusAnalyzed, StatsStatusInited) if err != nil { return errors.Trace(err) } @@ -105,7 +104,7 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error return nil } for _, row := range rows { - statsName, db, strColIDs := row.GetString(0), row.GetString(1), row.GetString(2) + statsName, strColIDs := row.GetString(0), row.GetString(1) var colIDs []int64 err = json.Unmarshal([]byte(strColIDs), &colIDs) if err != nil { @@ -121,9 +120,9 @@ func (h *Handle) gcTableStats(is infoschema.InfoSchema, physicalID int64) error } } if !found { - err = h.MarkExtendedStatsDeleted(statsName, db, physicalID) + err = h.MarkExtendedStatsDeleted(statsName, physicalID, true) if err != nil { - logutil.BgLogger().Debug("update stats_extended status failed", zap.String("stats_name", statsName), zap.String("db", db), zap.Error(err)) + logutil.BgLogger().Debug("update stats_extended status failed", zap.String("stats_name", statsName), zap.Error(err)) return errors.Trace(err) } break @@ -138,37 +137,46 @@ func (h *Handle) deleteHistStatsFromKV(physicalID int64, histID int64, isIndex i h.mu.Lock() defer h.mu.Unlock() + ctx := context.Background() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(context.Background(), "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return errors.Trace(err) } defer func() { - err = finishTransaction(context.Background(), exec, err) + err = finishTransaction(ctx, exec, err) }() txn, err := h.mu.ctx.Txn(true) if err != nil { return errors.Trace(err) } startTS := txn.StartTS() - sqls := make([]string, 0, 4) // First of all, we update the version. If this table doesn't exist, it won't have any problem. Because we cannot delete anything. - sqls = append(sqls, fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", startTS, physicalID)) + if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %? where table_id = %? ", startTS, physicalID); err != nil { + return err + } // delete histogram meta - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d and hist_id = %d and is_index = %d", physicalID, histID, isIndex)) + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_histograms where table_id = %? and hist_id = %? and is_index = %?", physicalID, histID, isIndex); err != nil { + return err + } // delete top n data - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_top_n where table_id = %d and hist_id = %d and is_index = %d", physicalID, histID, isIndex)) + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_top_n where table_id = %? and hist_id = %? and is_index = %?", physicalID, histID, isIndex); err != nil { + return err + } // delete all buckets - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d and hist_id = %d and is_index = %d", physicalID, histID, isIndex)) - return execSQLs(context.Background(), exec, sqls) + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_buckets where table_id = %? and hist_id = %? and is_index = %?", physicalID, histID, isIndex); err != nil { + return err + } + return nil } // DeleteTableStatsFromKV deletes table statistics from kv. -func (h *Handle) DeleteTableStatsFromKV(physicalID int64) (err error) { +// A statsID refers to statistic of a table or a partition. +func (h *Handle) DeleteTableStatsFromKV(statsIDs []int64) (err error) { h.mu.Lock() defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(context.Background(), "begin") + _, err = exec.ExecuteInternal(context.Background(), "begin") if err != nil { return errors.Trace(err) } @@ -179,16 +187,30 @@ func (h *Handle) DeleteTableStatsFromKV(physicalID int64) (err error) { if err != nil { return errors.Trace(err) } + ctx := context.Background() startTS := txn.StartTS() - sqls := make([]string, 0, 5) - // We only update the version so that other tidb will know that this table is deleted. - sqls = append(sqls, fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d ", startTS, physicalID)) - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_histograms where table_id = %d", physicalID)) - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d", physicalID)) - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_top_n where table_id = %d", physicalID)) - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_feedback where table_id = %d", physicalID)) - sqls = append(sqls, fmt.Sprintf("update mysql.stats_extended set version = %d, status = %d where table_id = %d and status in (%d, %d)", startTS, StatsStatusDeleted, physicalID, StatsStatusAnalyzed, StatsStatusInited)) - return execSQLs(context.Background(), exec, sqls) + for _, statsID := range statsIDs { + // We only update the version so that other tidb will know that this table is deleted. + if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %? where table_id = %? ", startTS, statsID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_histograms where table_id = %?", statsID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_buckets where table_id = %?", statsID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_top_n where table_id = %?", statsID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_feedback where table_id = %?", statsID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_extended set version = %?, status = %? where table_id = %? and status in (%?, %?)", startTS, StatsStatusDeleted, statsID, StatsStatusAnalyzed, StatsStatusInited); err != nil { + return err + } + } + return nil } func (h *Handle) removeDeletedExtendedStats(version uint64) (err error) { @@ -196,14 +218,14 @@ func (h *Handle) removeDeletedExtendedStats(version uint64) (err error) { defer h.mu.Unlock() exec := h.mu.ctx.(sqlexec.SQLExecutor) ctx := context.Background() - _, err = exec.Execute(ctx, "begin pessimistic") + _, err = exec.ExecuteInternal(ctx, "begin pessimistic") if err != nil { return errors.Trace(err) } defer func() { err = finishTransaction(ctx, exec, err) }() - sql := fmt.Sprintf("delete from mysql.stats_extended where status = %d and version < %d", StatsStatusDeleted, version) - _, err = exec.Execute(ctx, sql) + const sql = "delete from mysql.stats_extended where status = %? and version < %?" + _, err = exec.ExecuteInternal(ctx, sql, StatsStatusDeleted, version) return } diff --git a/statistics/handle/gc_test.go b/statistics/handle/gc_test.go index 63b9013561b69..2bcd01e318442 100644 --- a/statistics/handle/gc_test.go +++ b/statistics/handle/gc_test.go @@ -58,7 +58,7 @@ func (s *testStatsSuite) TestGCStats(c *C) { func (s *testStatsSuite) TestGCPartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("set @@session.tidb_enable_table_partition=1") testKit.MustExec(`create table t (a bigint(64), b bigint(64), index idx(a, b)) @@ -96,33 +96,34 @@ func (s *testStatsSuite) TestGCPartition(c *C) { func (s *testStatsSuite) TestGCExtendedStats(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("set session tidb_enable_extended_stats = on") testKit.MustExec("use test") testKit.MustExec("create table t(a int, b int, c int)") testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3)") - testKit.MustExec("create statistics s1(correlation) on t(a,b)") - testKit.MustExec("create statistics s2(correlation) on t(b,c)") + testKit.MustExec("alter table t add stats_extended s1 correlation(a,b)") + testKit.MustExec("alter table t add stats_extended s2 correlation(b,c)") testKit.MustExec("analyze table t") - testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( - "s1 test 2 [1,2] 1 1", - "s2 test 2 [2,3] 1 1", + testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "s1 2 [1,2] 1.000000 1", + "s2 2 [2,3] 1.000000 1", )) testKit.MustExec("alter table t drop column a") - testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( - "s1 test 2 [1,2] 1 1", - "s2 test 2 [2,3] 1 1", + testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "s1 2 [1,2] 1.000000 1", + "s2 2 [2,3] 1.000000 1", )) h := s.do.StatsHandle() h.SetLastUpdateVersion(math.MaxUint64) ddlLease := time.Duration(0) c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows( - "s2 test 2 [2,3] 1 1", + testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Check(testkit.Rows( + "s2 2 [2,3] 1.000000 1", )) testKit.MustExec("drop table t") - testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows( - "s2 test 2 [2,3] 1 1", + testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Check(testkit.Rows( + "s2 2 [2,3] 1.000000 1", )) c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) - testKit.MustQuery("select stats_name, db, type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows()) + testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Check(testkit.Rows()) } diff --git a/statistics/handle/handle.go b/statistics/handle/handle.go index 2eaa839037e17..6e8b3b3d3f607 100644 --- a/statistics/handle/handle.go +++ b/statistics/handle/handle.go @@ -17,17 +17,18 @@ import ( "context" "encoding/json" "fmt" + "strconv" "sync" "sync/atomic" "time" "github.com/cznic/mathutil" + "github.com/ngaut/pools" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/infoschema" "github.com/pingcap/tidb/kv" @@ -46,12 +47,26 @@ import ( "go.uber.org/zap" ) +const ( + // TiDBGlobalStats represents the global-stats for a partitioned table. + TiDBGlobalStats = "global" +) + // statsCache caches the tables in memory for Handle. type statsCache struct { tables map[int64]*statistics.Table - // version is the latest version of cache. - version uint64 - memUsage int64 + // version is the latest version of cache. It is bumped when new records of `mysql.stats_meta` are loaded into cache. + version uint64 + // minorVersion is to differentiate the cache when the version is unchanged while the cache contents are + // modified indeed. This can happen when we load extra column histograms into cache, or when we modify the cache with + // statistics feedbacks, etc. We cannot bump the version then because no new changes of `mysql.stats_meta` are loaded, + // while the override of statsCache is in a copy-on-write way, to make sure the statsCache is unchanged by others during the + // the interval of 'copy' and 'write', every 'write' should bump / check this minorVersion if the version keeps + // unchanged. + // This bump / check logic is encapsulated in `statsCache.update` and `updateStatsCache`, callers don't need to care + // about this minorVersion actually. + minorVersion uint64 + memUsage int64 } // Handle can update stats info periodically. @@ -75,7 +90,7 @@ type Handle struct { memTracker *memory.Tracker } - restrictedExec sqlexec.RestrictedSQLExecutor + pool sessionPool // ddlEventCh is a channel to notify a ddl operation has happened. // It is sent only by owner or the drop stats executor, and read by stats handle. @@ -88,6 +103,57 @@ type Handle struct { feedback *statistics.QueryFeedbackMap lease atomic2.Duration + + // idxUsageListHead contains all the index usage collectors required by session. + idxUsageListHead *SessionIndexUsageCollector +} + +func (h *Handle) withRestrictedSQLExecutor(ctx context.Context, fn func(context.Context, sqlexec.RestrictedSQLExecutor) ([]chunk.Row, []*ast.ResultField, error)) ([]chunk.Row, []*ast.ResultField, error) { + se, err := h.pool.Get() + if err != nil { + return nil, nil, errors.Trace(err) + } + defer h.pool.Put(se) + + exec := se.(sqlexec.RestrictedSQLExecutor) + return fn(ctx, exec) +} + +func (h *Handle) execRestrictedSQL(ctx context.Context, sql string, params ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { + return h.withRestrictedSQLExecutor(ctx, func(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) ([]chunk.Row, []*ast.ResultField, error) { + stmt, err := exec.ParseWithParams(ctx, sql, params...) + if err != nil { + return nil, nil, errors.Trace(err) + } + return exec.ExecRestrictedStmt(ctx, stmt) + }) +} + +func (h *Handle) execRestrictedSQLWithStatsVer(ctx context.Context, statsVer int, sql string, params ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { + return h.withRestrictedSQLExecutor(ctx, func(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) ([]chunk.Row, []*ast.ResultField, error) { + stmt, err := exec.ParseWithParams(ctx, sql, params...) + // TODO: An ugly way to set @@tidb_partition_prune_mode. Need to be improved. + if _, ok := stmt.(*ast.AnalyzeTableStmt); ok { + pruneMode := h.CurrentPruneMode() + if session, ok := exec.(sessionctx.Context); ok { + session.GetSessionVars().PartitionPruneMode.Store(string(pruneMode)) + } + } + if err != nil { + return nil, nil, errors.Trace(err) + } + return exec.ExecRestrictedStmt(ctx, stmt, execOptionForAnalyze[statsVer]) + }) +} + +func (h *Handle) execRestrictedSQLWithSnapshot(ctx context.Context, sql string, snapshot uint64, params ...interface{}) ([]chunk.Row, []*ast.ResultField, error) { + return h.withRestrictedSQLExecutor(ctx, func(ctx context.Context, exec sqlexec.RestrictedSQLExecutor) ([]chunk.Row, []*ast.ResultField, error) { + stmt, err := exec.ParseWithParams(ctx, sql, params...) + if err != nil { + return nil, nil, errors.Trace(err) + } + return exec.ExecRestrictedStmt(ctx, stmt, sqlexec.ExecOptionWithSnapshot(snapshot)) + }) } // Clear the statsCache, only for test. @@ -111,24 +177,32 @@ func (h *Handle) Clear() { h.mu.Unlock() } +type sessionPool interface { + Get() (pools.Resource, error) + Put(pools.Resource) +} + // NewHandle creates a Handle for update stats. -func NewHandle(ctx sessionctx.Context, lease time.Duration) *Handle { +func NewHandle(ctx sessionctx.Context, lease time.Duration, pool sessionPool) (*Handle, error) { handle := &Handle{ - ddlEventCh: make(chan *util.Event, 100), - listHead: &SessionStatsCollector{mapper: make(tableDeltaMap), rateMap: make(errorRateDeltaMap)}, - globalMap: make(tableDeltaMap), - feedback: statistics.NewQueryFeedbackMap(), + ddlEventCh: make(chan *util.Event, 100), + listHead: &SessionStatsCollector{mapper: make(tableDeltaMap), rateMap: make(errorRateDeltaMap)}, + globalMap: make(tableDeltaMap), + feedback: statistics.NewQueryFeedbackMap(), + idxUsageListHead: &SessionIndexUsageCollector{mapper: make(indexUsageMap)}, + pool: pool, } handle.lease.Store(lease) - // It is safe to use it concurrently because the exec won't touch the ctx. - if exec, ok := ctx.(sqlexec.RestrictedSQLExecutor); ok { - handle.restrictedExec = exec - } + handle.pool = pool handle.statsCache.memTracker = memory.NewTracker(memory.LabelForStatsCache, -1) handle.mu.ctx = ctx handle.mu.rateMap = make(errorRateDeltaMap) handle.statsCache.Store(statsCache{tables: make(map[int64]*statistics.Table)}) - return handle + err := handle.RefreshVars() + if err != nil { + return nil, err + } + return handle, nil } // Lease returns the stats lease. @@ -169,8 +243,8 @@ func (h *Handle) Update(is infoschema.InfoSchema) error { } else { lastVersion = 0 } - sql := fmt.Sprintf("SELECT version, table_id, modify_count, count from mysql.stats_meta where version > %d order by version", lastVersion) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + ctx := context.Background() + rows, _, err := h.execRestrictedSQL(ctx, "SELECT version, table_id, modify_count, count from mysql.stats_meta where version > %? order by version", lastVersion) if err != nil { return errors.Trace(err) } @@ -192,10 +266,10 @@ func (h *Handle) Update(is infoschema.InfoSchema) error { continue } tableInfo := table.Meta() - tbl, err := h.tableStatsFromStorage(tableInfo, physicalID, false, nil) + tbl, err := h.TableStatsFromStorage(tableInfo, physicalID, false, 0) // Error is not nil may mean that there are some ddl changes on this table, we will not update it. if err != nil { - logutil.BgLogger().Debug("error occurred when read table stats", zap.String("table", tableInfo.Name.O), zap.Error(err)) + logutil.BgLogger().Error("[stats] error occurred when read table stats", zap.String("table", tableInfo.Name.O), zap.Error(err)) continue } if tbl == nil { @@ -212,6 +286,192 @@ func (h *Handle) Update(is infoschema.InfoSchema) error { return nil } +// UpdateSessionVar updates the necessary session variables for the stats reader. +func (h *Handle) UpdateSessionVar() error { + h.mu.Lock() + defer h.mu.Unlock() + verInString, err := h.mu.ctx.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBAnalyzeVersion) + if err != nil { + return err + } + ver, err := strconv.ParseInt(verInString, 10, 64) + if err != nil { + return err + } + h.mu.ctx.GetSessionVars().AnalyzeVersion = int(ver) + return err +} + +// GlobalStats is used to store the statistics contained in the global-level stats +// which is generated by the merge of partition-level stats. +// It will both store the column stats and index stats. +// In the column statistics, the variable `num` is equal to the number of columns in the partition table. +// In the index statistics, the variable `num` is always equal to one. +type GlobalStats struct { + Num int + Count int64 + Hg []*statistics.Histogram + Cms []*statistics.CMSketch + TopN []*statistics.TopN + Fms []*statistics.FMSketch +} + +// MergePartitionStats2GlobalStats merge the partition-level stats to global-level stats based on the tableID. +func (h *Handle) MergePartitionStats2GlobalStats(sc sessionctx.Context, opts map[ast.AnalyzeOptionType]uint64, is infoschema.InfoSchema, physicalID int64, isIndex int, idxID int64) (globalStats *GlobalStats, err error) { + // get the partition table IDs + h.mu.Lock() + globalTable, ok := h.getTableByPhysicalID(is, physicalID) + h.mu.Unlock() + if !ok { + err = errors.Errorf("unknown physical ID %d in stats meta table, maybe it has been dropped", physicalID) + return + } + globalTableInfo := globalTable.Meta() + partitionNum := len(globalTableInfo.Partition.Definitions) + partitionIDs := make([]int64, 0, partitionNum) + for i := 0; i < partitionNum; i++ { + partitionIDs = append(partitionIDs, globalTableInfo.Partition.Definitions[i].ID) + } + + // initialized the globalStats + globalStats = new(GlobalStats) + if isIndex == 0 { + globalStats.Num = len(globalTableInfo.Columns) + } else { + globalStats.Num = 1 + } + globalStats.Count = 0 + globalStats.Hg = make([]*statistics.Histogram, globalStats.Num) + globalStats.Cms = make([]*statistics.CMSketch, globalStats.Num) + globalStats.TopN = make([]*statistics.TopN, globalStats.Num) + globalStats.Fms = make([]*statistics.FMSketch, globalStats.Num) + + // The first dimension of slice is means the number of column or index stats in the globalStats. + // The second dimension of slice is means the number of partition tables. + // Because all topN and histograms need to be collected before they can be merged. + // So we should store all of the partition-level stats first, and merge them together. + allHg := make([][]*statistics.Histogram, globalStats.Num) + allCms := make([][]*statistics.CMSketch, globalStats.Num) + allTopN := make([][]*statistics.TopN, globalStats.Num) + allFms := make([][]*statistics.FMSketch, globalStats.Num) + for i := 0; i < globalStats.Num; i++ { + allHg[i] = make([]*statistics.Histogram, 0, partitionNum) + allCms[i] = make([]*statistics.CMSketch, 0, partitionNum) + allTopN[i] = make([]*statistics.TopN, 0, partitionNum) + allFms[i] = make([]*statistics.FMSketch, 0, partitionNum) + } + statsVer := sc.GetSessionVars().AnalyzeVersion + + for _, partitionID := range partitionIDs { + h.mu.Lock() + partitionTable, ok := h.getTableByPhysicalID(is, partitionID) + h.mu.Unlock() + if !ok { + err = errors.Errorf("unknown physical ID %d in stats meta table, maybe it has been dropped", partitionID) + return + } + tableInfo := partitionTable.Meta() + var partitionStats *statistics.Table + partitionStats, err = h.TableStatsFromStorage(tableInfo, partitionID, true, 0) + if err != nil { + return + } + // if the err == nil && partitionStats == nil, it means we lack the partition-level stats which the physicalID is equal to partitionID. + if partitionStats == nil { + var errMsg string + if isIndex == 0 { + errMsg = fmt.Sprintf("`%s`", tableInfo.Name.L) + } else { + indexName := "" + for _, idx := range tableInfo.Indices { + if idx.ID == idxID { + indexName = idx.Name.L + } + } + errMsg = fmt.Sprintf("`%s` index: `%s`", tableInfo.Name.L, indexName) + } + err = types.ErrPartitionStatsMissing.GenWithStackByArgs(errMsg) + return + } + statistics.CheckAnalyzeVerOnTable(partitionStats, &statsVer) + if statsVer != statistics.Version2 { // global-stats only support stats-ver2 + return nil, fmt.Errorf("[stats]: some partition level statistics are not in statistics version 2, please set tidb_analyze_version to 2 and analyze the this table") + } + for i := 0; i < globalStats.Num; i++ { + ID := tableInfo.Columns[i].ID + if isIndex != 0 { + // If the statistics is the index stats, we should use the index ID to replace the column ID. + ID = idxID + } + count, hg, cms, topN, fms := partitionStats.GetStatsInfo(ID, isIndex == 1) + if i == 0 { + // In a partition, we will only update globalStats.Count once + globalStats.Count += count + } + allHg[i] = append(allHg[i], hg) + allCms[i] = append(allCms[i], cms) + allTopN[i] = append(allTopN[i], topN) + allFms[i] = append(allFms[i], fms) + } + } + + // After collect all of the statistics from the partition-level stats, + // we should merge them together. + for i := 0; i < globalStats.Num; i++ { + // Merge CMSketch + globalStats.Cms[i] = allCms[i][0].Copy() + for j := 1; j < partitionNum; j++ { + err = globalStats.Cms[i].MergeCMSketch(allCms[i][j]) + if err != nil { + return + } + } + + // Merge topN. We need to merge TopN before merging the histogram. + // Because after merging TopN, some numbers will be left. + // These remaining topN numbers will be used as a separate bucket for later histogram merging. + var popedTopN []statistics.TopNMeta + globalStats.TopN[i], popedTopN = statistics.MergeTopN(allTopN[i], uint32(opts[ast.AnalyzeOptNumTopN])) + + // Merge histogram + globalStats.Hg[i], err = statistics.MergePartitionHist2GlobalHist(sc.GetSessionVars().StmtCtx, allHg[i], popedTopN, int64(opts[ast.AnalyzeOptNumBuckets]), isIndex == 1) + if err != nil { + return + } + + // Update NDV of global-level stats + if isIndex == 0 { + // For the column stats, we should merge the FMSketch first. And use the FMSketch to calculate the new NDV. + // merge FMSketch + globalStats.Fms[i] = allFms[i][0].Copy() + for j := 1; j < partitionNum; j++ { + globalStats.Fms[i].MergeFMSketch(allFms[i][j]) + } + + // update the NDV + globalStatsNDV := globalStats.Fms[i].NDV() + if globalStatsNDV > globalStats.Count { + globalStatsNDV = globalStats.Count + } + globalStats.Hg[i].NDV = globalStatsNDV + } else { + // For the index stats, we get the final NDV by accumulating the NDV of each bucket in the index histogram. + globalStatsNDV := int64(0) + for _, bucket := range globalStats.Hg[i].Buckets { + globalStatsNDV += bucket.NDV + } + globalStats.Hg[i].NDV = globalStatsNDV + + // hg.NDV still includes TopN although TopN is not included by hg.Buckets + // TODO: remove the line below after fixing the meaning of hg.NDV + if globalStats.TopN[i] != nil { // if analyze with 0 topN, topN is nil here + globalStats.Hg[i].NDV += int64(len(globalStats.TopN[i].TopN)) + } + } + } + return +} + func (h *Handle) getTableByPhysicalID(is infoschema.InfoSchema, physicalID int64) (table.Table, bool) { if is.SchemaMetaVersion() != h.mu.schemaVersion { h.mu.schemaVersion = is.SchemaMetaVersion() @@ -246,18 +506,6 @@ func (h *Handle) GetMemConsumed() (size int64) { return } -// GetAllTableStatsMemUsage get all the mem usage with true table. -// only used by test. -func (h *Handle) GetAllTableStatsMemUsage() int64 { - data := h.statsCache.Value.Load().(statsCache) - cache := data.copy() - allUsage := int64(0) - for _, t := range cache.tables { - allUsage += t.MemoryUsage() - } - return allUsage -} - // GetTableStats retrieves the statistics table from cache, and the cache will be updated by a goroutine. func (h *Handle) GetTableStats(tblInfo *model.TableInfo) *statistics.Table { return h.GetPartitionStats(tblInfo, tblInfo.ID) @@ -276,20 +524,27 @@ func (h *Handle) GetPartitionStats(tblInfo *model.TableInfo, pid int64) *statist return tbl } -func (h *Handle) updateStatsCache(newCache statsCache) { +// updateStatsCache overrides the global statsCache with a new one, it may fail +// if the global statsCache has been modified by others already. +// Callers should add retry loop if necessary. +func (h *Handle) updateStatsCache(newCache statsCache) (updated bool) { h.statsCache.Lock() oldCache := h.statsCache.Load().(statsCache) - if oldCache.version <= newCache.version { + if oldCache.version < newCache.version || (oldCache.version == newCache.version && oldCache.minorVersion < newCache.minorVersion) { h.statsCache.memTracker.Consume(newCache.memUsage - oldCache.memUsage) h.statsCache.Store(newCache) + updated = true } h.statsCache.Unlock() + return } func (sc statsCache) copy() statsCache { newCache := statsCache{tables: make(map[int64]*statistics.Table, len(sc.tables)), - version: sc.version, - memUsage: sc.memUsage} + version: sc.version, + minorVersion: sc.minorVersion, + memUsage: sc.memUsage, + } for k, v := range sc.tables { newCache.tables[k] = v } @@ -310,7 +565,12 @@ func (sc statsCache) initMemoryUsage() { // update updates the statistics table cache using copy on write. func (sc statsCache) update(tables []*statistics.Table, deletedIDs []int64, newVersion uint64) statsCache { newCache := sc.copy() - newCache.version = newVersion + if newVersion == newCache.version { + newCache.minorVersion += uint64(1) + } else { + newCache.version = newVersion + newCache.minorVersion = uint64(0) + } for _, tbl := range tables { id := tbl.PhysicalID if ptbl, ok := newCache.tables[id]; ok { @@ -331,7 +591,7 @@ func (sc statsCache) update(tables []*statistics.Table, deletedIDs []int64, newV // LoadNeededHistograms will load histograms for those needed columns. func (h *Handle) LoadNeededHistograms() (err error) { cols := statistics.HistogramNeededColumns.AllCols() - reader, err := h.getStatsReader(nil) + reader, err := h.getStatsReader(0) if err != nil { return err } @@ -344,35 +604,59 @@ func (h *Handle) LoadNeededHistograms() (err error) { }() for _, col := range cols { - statsCache := h.statsCache.Load().(statsCache) - tbl, ok := statsCache.tables[col.TableID] + oldCache := h.statsCache.Load().(statsCache) + tbl, ok := oldCache.tables[col.TableID] if !ok { continue } - tbl = tbl.Copy() c, ok := tbl.Columns[col.ColumnID] if !ok || c.Len() > 0 { statistics.HistogramNeededColumns.Delete(col) continue } - hg, err := h.histogramFromStorage(reader, col.TableID, c.ID, &c.Info.FieldType, c.NDV, 0, c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) + hg, err := h.histogramFromStorage(reader, col.TableID, c.ID, &c.Info.FieldType, c.Histogram.NDV, 0, c.LastUpdateVersion, c.NullCount, c.TotColSize, c.Correlation) + if err != nil { + return errors.Trace(err) + } + cms, topN, err := h.cmSketchAndTopNFromStorage(reader, col.TableID, 0, col.ColumnID) + if err != nil { + return errors.Trace(err) + } + fms, err := h.fmSketchFromStorage(reader, col.TableID, 0, col.ColumnID) if err != nil { return errors.Trace(err) } - cms, err := h.cmSketchFromStorage(reader, col.TableID, 0, col.ColumnID) + rows, _, err := reader.read("select stats_ver from mysql.stats_histograms where is_index = 0 and table_id = %? and hist_id = %?", col.TableID, col.ColumnID) if err != nil { return errors.Trace(err) } - tbl.Columns[c.ID] = &statistics.Column{ + if len(rows) == 0 { + logutil.BgLogger().Error("fail to get stats version for this histogram", zap.Int64("table_id", col.TableID), zap.Int64("hist_id", col.ColumnID)) + } + colHist := &statistics.Column{ PhysicalID: col.TableID, Histogram: *hg, Info: c.Info, CMSketch: cms, + TopN: topN, + FMSketch: fms, Count: int64(hg.TotalRowCount()), IsHandle: c.IsHandle, + StatsVer: rows[0].GetInt64(0), + } + colHist.Count = int64(colHist.TotalRowCount()) + // Reload the latest stats cache, otherwise the `updateStatsCache` may fail with high probability, because functions + // like `GetPartitionStats` called in `fmSketchFromStorage` would have modified the stats cache already. + oldCache = h.statsCache.Load().(statsCache) + tbl, ok = oldCache.tables[col.TableID] + if !ok { + continue + } + tbl = tbl.Copy() + tbl.Columns[c.ID] = colHist + if h.updateStatsCache(oldCache.update([]*statistics.Table{tbl}, nil, oldCache.version)) { + statistics.HistogramNeededColumns.Delete(col) } - h.updateStatsCache(statsCache.update([]*statistics.Table{tbl}, nil, statsCache.version)) - statistics.HistogramNeededColumns.Delete(col) } return nil } @@ -393,29 +677,35 @@ func (h *Handle) FlushStats() { for len(h.ddlEventCh) > 0 { e := <-h.ddlEventCh if err := h.HandleDDLEvent(e); err != nil { - logutil.BgLogger().Debug("[stats] handle ddl event fail", zap.Error(err)) + logutil.BgLogger().Error("[stats] handle ddl event fail", zap.Error(err)) } } if err := h.DumpStatsDeltaToKV(DumpAll); err != nil { - logutil.BgLogger().Debug("[stats] dump stats delta fail", zap.Error(err)) + logutil.BgLogger().Error("[stats] dump stats delta fail", zap.Error(err)) } if err := h.DumpStatsFeedbackToKV(); err != nil { - logutil.BgLogger().Debug("[stats] dump stats feedback fail", zap.Error(err)) + logutil.BgLogger().Error("[stats] dump stats feedback fail", zap.Error(err)) } } -func (h *Handle) cmSketchFromStorage(reader *statsReader, tblID int64, isIndex, histID int64) (_ *statistics.CMSketch, err error) { - selSQL := fmt.Sprintf("select cm_sketch from mysql.stats_histograms where table_id = %d and is_index = %d and hist_id = %d", tblID, isIndex, histID) - rows, _, err := reader.read(selSQL) +func (h *Handle) cmSketchAndTopNFromStorage(reader *statsReader, tblID int64, isIndex, histID int64) (_ *statistics.CMSketch, _ *statistics.TopN, err error) { + rows, _, err := reader.read("select cm_sketch from mysql.stats_histograms where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) if err != nil || len(rows) == 0 { - return nil, err + return nil, nil, err } - selSQL = fmt.Sprintf("select HIGH_PRIORITY value, count from mysql.stats_top_n where table_id = %d and is_index = %d and hist_id = %d", tblID, isIndex, histID) - topNRows, _, err := reader.read(selSQL) + topNRows, _, err := reader.read("select HIGH_PRIORITY value, count from mysql.stats_top_n where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) if err != nil { + return nil, nil, err + } + return statistics.DecodeCMSketchAndTopN(rows[0].GetBytes(0), topNRows) +} + +func (h *Handle) fmSketchFromStorage(reader *statsReader, tblID int64, isIndex, histID int64) (_ *statistics.FMSketch, err error) { + rows, _, err := reader.read("select value from mysql.stats_fm_sketch where table_id = %? and is_index = %? and hist_id = %?", tblID, isIndex, histID) + if err != nil || len(rows) == 0 { return nil, err } - return statistics.DecodeCMSketch(rows[0].GetBytes(0), topNRows) + return statistics.DecodeFMSketch(rows[0].GetBytes(0)) } func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table *statistics.Table, tableInfo *model.TableInfo) error { @@ -441,11 +731,11 @@ func (h *Handle) indexStatsFromStorage(reader *statsReader, row chunk.Row, table if err != nil { return errors.Trace(err) } - cms, err := h.cmSketchFromStorage(reader, table.PhysicalID, 1, idxInfo.ID) + cms, topN, err := h.cmSketchAndTopNFromStorage(reader, table.PhysicalID, 1, idxInfo.ID) if err != nil { return errors.Trace(err) } - idx = &statistics.Index{Histogram: *hg, CMSketch: cms, Info: idxInfo, ErrorRate: errorRate, StatsVer: row.GetInt64(7), Flag: flag} + idx = &statistics.Index{Histogram: *hg, CMSketch: cms, TopN: topN, Info: idxInfo, ErrorRate: errorRate, StatsVer: row.GetInt64(7), Flag: flag} lastAnalyzePos.Copy(&idx.LastAnalyzePos) } break @@ -464,8 +754,13 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl histVer := row.GetUint64(4) nullCount := row.GetInt64(5) totColSize := row.GetInt64(6) + statsVer := row.GetInt64(7) correlation := row.GetFloat64(9) lastAnalyzePos := row.GetDatum(10, types.NewFieldType(mysql.TypeBlob)) + fmSketch, err := h.fmSketchFromStorage(reader, table.PhysicalID, 0, histID) + if err != nil { + return errors.Trace(err) + } col := table.Columns[histID] errorRate := statistics.ErrorRate{} flag := row.GetInt64(8) @@ -489,18 +784,20 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl (col == nil || col.Len() == 0 && col.LastUpdateVersion < histVer) && !loadAll if notNeedLoad { - count, err := h.columnCountFromStorage(reader, table.PhysicalID, histID) + count, err := h.columnCountFromStorage(reader, table.PhysicalID, histID, statsVer) if err != nil { return errors.Trace(err) } col = &statistics.Column{ PhysicalID: table.PhysicalID, Histogram: *statistics.NewHistogram(histID, distinct, nullCount, histVer, &colInfo.FieldType, 0, totColSize), + FMSketch: fmSketch, Info: colInfo, Count: count + nullCount, ErrorRate: errorRate, IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.Flag), Flag: flag, + StatsVer: statsVer, } lastAnalyzePos.Copy(&col.LastAnalyzePos) col.Histogram.Correlation = correlation @@ -511,7 +808,7 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl if err != nil { return errors.Trace(err) } - cms, err := h.cmSketchFromStorage(reader, table.PhysicalID, 0, colInfo.ID) + cms, topN, err := h.cmSketchAndTopNFromStorage(reader, table.PhysicalID, 0, colInfo.ID) if err != nil { return errors.Trace(err) } @@ -520,11 +817,15 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl Histogram: *hg, Info: colInfo, CMSketch: cms, + TopN: topN, + FMSketch: fmSketch, Count: int64(hg.TotalRowCount()), ErrorRate: errorRate, IsHandle: tableInfo.PKIsHandle && mysql.HasPriKeyFlag(colInfo.Flag), Flag: flag, + StatsVer: statsVer, } + col.Count = int64(col.TotalRowCount()) lastAnalyzePos.Copy(&col.LastAnalyzePos) break } @@ -546,9 +847,9 @@ func (h *Handle) columnStatsFromStorage(reader *statsReader, row chunk.Row, tabl return nil } -// tableStatsFromStorage loads table stats info from storage. -func (h *Handle) tableStatsFromStorage(tableInfo *model.TableInfo, physicalID int64, loadAll bool, historyStatsExec sqlexec.RestrictedSQLExecutor) (_ *statistics.Table, err error) { - reader, err := h.getStatsReader(historyStatsExec) +// TableStatsFromStorage loads table stats info from storage. +func (h *Handle) TableStatsFromStorage(tableInfo *model.TableInfo, physicalID int64, loadAll bool, snapshot uint64) (_ *statistics.Table, err error) { + reader, err := h.getStatsReader(snapshot) if err != nil { return nil, err } @@ -561,7 +862,7 @@ func (h *Handle) tableStatsFromStorage(tableInfo *model.TableInfo, physicalID in table, ok := h.statsCache.Load().(statsCache).tables[physicalID] // If table stats is pseudo, we also need to copy it, since we will use the column stats when // the average error rate of it is small. - if !ok || historyStatsExec != nil { + if !ok || snapshot > 0 { histColl := statistics.HistColl{ PhysicalID: physicalID, HavePhysicalID: true, @@ -576,8 +877,15 @@ func (h *Handle) tableStatsFromStorage(tableInfo *model.TableInfo, physicalID in table = table.Copy() } table.Pseudo = false - selSQL := fmt.Sprintf("select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = %d", physicalID) - rows, _, err := reader.read(selSQL) + + rows, _, err := reader.read("select modify_count, count from mysql.stats_meta where table_id = %?", physicalID) + if err != nil || len(rows) == 0 { + return nil, err + } + table.ModifyCount = rows[0].GetInt64(0) + table.Count = rows[0].GetInt64(1) + + rows, _, err = reader.read("select table_id, is_index, hist_id, distinct_count, version, null_count, tot_col_size, stats_ver, flag, correlation, last_analyze_pos from mysql.stats_histograms where table_id = %?", physicalID) // Check deleted table. if err != nil || len(rows) == 0 { return nil, nil @@ -602,33 +910,39 @@ func (h *Handle) extendedStatsFromStorage(reader *statsReader, table *statistics } else { table.ExtendedStats = statistics.NewExtendedStatsColl() } - sql := fmt.Sprintf("select stats_name, db, status, type, column_ids, scalar_stats, blob_stats, version from mysql.stats_extended where table_id = %d and status in (%d, %d) and version > %d", physicalID, StatsStatusAnalyzed, StatsStatusDeleted, lastVersion) - rows, _, err := reader.read(sql) + rows, _, err := reader.read("select name, status, type, column_ids, stats, version from mysql.stats_extended where table_id = %? and status in (%?, %?) and version > %?", physicalID, StatsStatusAnalyzed, StatsStatusDeleted, lastVersion) if err != nil || len(rows) == 0 { return table, nil } for _, row := range rows { - lastVersion = mathutil.MaxUint64(lastVersion, row.GetUint64(7)) - key := statistics.ExtendedStatsKey{ - StatsName: row.GetString(0), - DB: row.GetString(1), - } - status := uint8(row.GetInt64(2)) + lastVersion = mathutil.MaxUint64(lastVersion, row.GetUint64(5)) + name := row.GetString(0) + status := uint8(row.GetInt64(1)) if status == StatsStatusDeleted { - delete(table.ExtendedStats.Stats, key) + delete(table.ExtendedStats.Stats, name) } else { item := &statistics.ExtendedStatsItem{ - Tp: uint8(row.GetInt64(3)), - ScalarVals: row.GetFloat64(5), - StringVals: row.GetString(6), + Tp: uint8(row.GetInt64(2)), } - colIDs := row.GetString(4) + colIDs := row.GetString(3) err := json.Unmarshal([]byte(colIDs), &item.ColIDs) if err != nil { - logutil.BgLogger().Debug("decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) + logutil.BgLogger().Error("[stats] decode column IDs failed", zap.String("column_ids", colIDs), zap.Error(err)) return nil, err } - table.ExtendedStats.Stats[key] = item + statsStr := row.GetString(4) + if item.Tp == ast.StatsTypeCardinality || item.Tp == ast.StatsTypeCorrelation { + if statsStr != "" { + item.ScalarVals, err = strconv.ParseFloat(statsStr, 64) + if err != nil { + logutil.BgLogger().Error("[stats] parse scalar stats failed", zap.String("stats", statsStr), zap.Error(err)) + return nil, err + } + } + } else { + item.StringVals = statsStr + } + table.ExtendedStats.Stats[name] = item } } table.ExtendedStats.LastUpdateVersion = lastVersion @@ -636,12 +950,12 @@ func (h *Handle) extendedStatsFromStorage(reader *statsReader, table *statistics } // SaveStatsToStorage saves the stats to storage. -func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg *statistics.Histogram, cms *statistics.CMSketch, isAnalyzed int64) (err error) { +func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, fms *statistics.FMSketch, statsVersion int, isAnalyzed int64) (err error) { h.mu.Lock() defer h.mu.Unlock() ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return errors.Trace(err) } @@ -654,29 +968,50 @@ func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg } version := txn.StartTS() - sqls := make([]string, 0, 4) // If the count is less than 0, then we do not want to update the modify count and count. if count >= 0 { - sqls = append(sqls, fmt.Sprintf("replace into mysql.stats_meta (version, table_id, count) values (%d, %d, %d)", version, tableID, count)) + _, err = exec.ExecuteInternal(ctx, "replace into mysql.stats_meta (version, table_id, count) values (%?, %?, %?)", version, tableID, count) } else { - sqls = append(sqls, fmt.Sprintf("update mysql.stats_meta set version = %d where table_id = %d", version, tableID)) + _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %? where table_id = %?", version, tableID) } - data, err := statistics.EncodeCMSketchWithoutTopN(cms) if err != nil { - return + return err + } + cmSketch, err := statistics.EncodeCMSketchWithoutTopN(cms) + if err != nil { + return err + } + fmSketch, err := statistics.EncodeFMSketch(fms) + if err != nil { + return err } // Delete outdated data - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_top_n where table_id = %d and is_index = %d and hist_id = %d", tableID, isIndex, hg.ID)) - for _, meta := range cms.TopN() { - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_top_n (table_id, is_index, hist_id, value, count) values (%d, %d, %d, X'%X', %d)", tableID, isIndex, hg.ID, meta.Data, meta.Count)) + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_top_n where table_id = %? and is_index = %? and hist_id = %?", tableID, isIndex, hg.ID); err != nil { + return err + } + if topN != nil { + for _, meta := range topN.TopN { + if _, err = exec.ExecuteInternal(ctx, "insert into mysql.stats_top_n (table_id, is_index, hist_id, value, count) values (%?, %?, %?, %?, %?)", tableID, isIndex, hg.ID, meta.Encoded, meta.Count); err != nil { + return err + } + } + } + if fmSketch != nil { + if _, err = exec.ExecuteInternal(ctx, "insert into mysql.stats_fm_sketch (table_id, is_index, hist_id, value) values (%?, %?, %?, %?)", tableID, isIndex, hg.ID, fmSketch); err != nil { + return err + } } flag := 0 if isAnalyzed == 1 { flag = statistics.AnalyzeFlag } - sqls = append(sqls, fmt.Sprintf("replace into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version, null_count, cm_sketch, tot_col_size, stats_ver, flag, correlation) values (%d, %d, %d, %d, %d, %d, X'%X', %d, %d, %d, %f)", - tableID, isIndex, hg.ID, hg.NDV, version, hg.NullCount, data, hg.TotColSize, statistics.CurStatsVersion, flag, hg.Correlation)) - sqls = append(sqls, fmt.Sprintf("delete from mysql.stats_buckets where table_id = %d and is_index = %d and hist_id = %d", tableID, isIndex, hg.ID)) + if _, err = exec.ExecuteInternal(ctx, "replace into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, version, null_count, cm_sketch, tot_col_size, stats_ver, flag, correlation) values (%?, %?, %?, %?, %?, %?, %?, %?, %?, %?, %?)", + tableID, isIndex, hg.ID, hg.NDV, version, hg.NullCount, cmSketch, hg.TotColSize, statsVersion, flag, hg.Correlation); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_buckets where table_id = %? and is_index = %? and hist_id = %?", tableID, isIndex, hg.ID); err != nil { + return err + } sc := h.mu.ctx.GetSessionVars().StmtCtx var lastAnalyzePos []byte for i := range hg.Buckets { @@ -697,12 +1032,16 @@ func (h *Handle) SaveStatsToStorage(tableID int64, count int64, isIndex int, hg if err != nil { return } - sqls = append(sqls, fmt.Sprintf("insert into mysql.stats_buckets(table_id, is_index, hist_id, bucket_id, count, repeats, lower_bound, upper_bound) values(%d, %d, %d, %d, %d, %d, X'%X', X'%X')", tableID, isIndex, hg.ID, i, count, hg.Buckets[i].Repeat, lowerBound.GetBytes(), upperBound.GetBytes())) + if _, err = exec.ExecuteInternal(ctx, "insert into mysql.stats_buckets(table_id, is_index, hist_id, bucket_id, count, repeats, lower_bound, upper_bound, ndv) values(%?, %?, %?, %?, %?, %?, %?, %?, %?)", tableID, isIndex, hg.ID, i, count, hg.Buckets[i].Repeat, lowerBound.GetBytes(), upperBound.GetBytes(), hg.Buckets[i].NDV); err != nil { + return err + } } if isAnalyzed == 1 && len(lastAnalyzePos) > 0 { - sqls = append(sqls, fmt.Sprintf("update mysql.stats_histograms set last_analyze_pos = X'%X' where table_id = %d and is_index = %d and hist_id = %d", lastAnalyzePos, tableID, isIndex, hg.ID)) + if _, err = exec.ExecuteInternal(ctx, "update mysql.stats_histograms set last_analyze_pos = %? where table_id = %? and is_index = %? and hist_id = %?", lastAnalyzePos, tableID, isIndex, hg.ID); err != nil { + return err + } } - return execSQLs(context.Background(), exec, sqls) + return } // SaveMetaToStorage will save stats_meta to storage. @@ -711,7 +1050,7 @@ func (h *Handle) SaveMetaToStorage(tableID, count, modifyCount int64) (err error defer h.mu.Unlock() ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return errors.Trace(err) } @@ -722,16 +1061,13 @@ func (h *Handle) SaveMetaToStorage(tableID, count, modifyCount int64) (err error if err != nil { return errors.Trace(err) } - var sql string version := txn.StartTS() - sql = fmt.Sprintf("replace into mysql.stats_meta (version, table_id, count, modify_count) values (%d, %d, %d, %d)", version, tableID, count, modifyCount) - _, err = exec.Execute(ctx, sql) - return + _, err = exec.ExecuteInternal(ctx, "replace into mysql.stats_meta (version, table_id, count, modify_count) values (%?, %?, %?, %?)", version, tableID, count, modifyCount) + return err } func (h *Handle) histogramFromStorage(reader *statsReader, tableID int64, colID int64, tp *types.FieldType, distinct int64, isIndex int, ver uint64, nullCount int64, totColSize int64, corr float64) (_ *statistics.Histogram, err error) { - selSQL := fmt.Sprintf("select count, repeats, lower_bound, upper_bound from mysql.stats_buckets where table_id = %d and is_index = %d and hist_id = %d order by bucket_id", tableID, isIndex, colID) - rows, fields, err := reader.read(selSQL) + rows, fields, err := reader.read("select count, repeats, lower_bound, upper_bound, ndv from mysql.stats_buckets where table_id = %? and is_index = %? and hist_id = %? order by bucket_id", tableID, isIndex, colID) if err != nil { return nil, errors.Trace(err) } @@ -760,31 +1096,53 @@ func (h *Handle) histogramFromStorage(reader *statsReader, tableID int64, colID } } totalCount += count - hg.AppendBucket(&lowerBound, &upperBound, totalCount, repeats) + hg.AppendBucketWithNDV(&lowerBound, &upperBound, totalCount, repeats, rows[i].GetInt64(4)) } hg.PreCalculateScalar() return hg, nil } -func (h *Handle) columnCountFromStorage(reader *statsReader, tableID, colID int64) (int64, error) { - selSQL := fmt.Sprintf("select sum(count) from mysql.stats_buckets where table_id = %d and is_index = %d and hist_id = %d", tableID, 0, colID) - rows, _, err := reader.read(selSQL) +func (h *Handle) columnCountFromStorage(reader *statsReader, tableID, colID, statsVer int64) (int64, error) { + rows, _, err := reader.read("select sum(count) from mysql.stats_buckets where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) if err != nil { return 0, errors.Trace(err) } if rows[0].IsNull(0) { return 0, nil } - return rows[0].GetMyDecimal(0).ToInt() + count, err := rows[0].GetMyDecimal(0).ToInt() + if err != nil { + return 0, errors.Trace(err) + } + if statsVer == statistics.Version2 { + // Before stats ver 2, histogram represents all data in this column. + // In stats ver 2, histogram + TopN represent all data in this column. + // So we need to add TopN total count here. + rows, _, err = reader.read("select sum(count) from mysql.stats_top_n where table_id = %? and is_index = 0 and hist_id = %?", tableID, colID) + if err != nil { + return 0, errors.Trace(err) + } + if !rows[0].IsNull(0) { + topNCount, err := rows[0].GetMyDecimal(0).ToInt() + if err != nil { + return 0, errors.Trace(err) + } + count += topNCount + } + } + return count, err } -func (h *Handle) statsMetaByTableIDFromStorage(tableID int64, historyStatsExec sqlexec.RestrictedSQLExecutor) (version uint64, modifyCount, count int64, err error) { - selSQL := fmt.Sprintf("SELECT version, modify_count, count from mysql.stats_meta where table_id = %d order by version", tableID) +func (h *Handle) statsMetaByTableIDFromStorage(tableID int64, snapshot uint64) (version uint64, modifyCount, count int64, err error) { + ctx := context.Background() var rows []chunk.Row - if historyStatsExec == nil { - rows, _, err = h.restrictedExec.ExecRestrictedSQL(selSQL) + if snapshot == 0 { + rows, _, err = h.execRestrictedSQL(ctx, "SELECT version, modify_count, count from mysql.stats_meta where table_id = %? order by version", tableID) } else { - rows, _, err = historyStatsExec.ExecRestrictedSQLWithSnapshot(selSQL) + rows, _, err = h.execRestrictedSQLWithSnapshot(ctx, "SELECT version, modify_count, count from mysql.stats_meta where table_id = %? order by version", snapshot, tableID) + if err != nil { + return 0, 0, 0, err + } } if err != nil || len(rows) == 0 { return @@ -798,63 +1156,57 @@ func (h *Handle) statsMetaByTableIDFromStorage(tableID int64, historyStatsExec s // statsReader is used for simplify code that needs to read system tables in different sqls // but requires the same transactions. type statsReader struct { - ctx sessionctx.Context - history sqlexec.RestrictedSQLExecutor + ctx sqlexec.RestrictedSQLExecutor + snapshot uint64 } -func (sr *statsReader) read(sql string) (rows []chunk.Row, fields []*ast.ResultField, err error) { - if sr.history != nil { - return sr.history.ExecRestrictedSQLWithSnapshot(sql) - } - rc, err := sr.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) - } +func (sr *statsReader) read(sql string, args ...interface{}) (rows []chunk.Row, fields []*ast.ResultField, err error) { + ctx := context.TODO() + stmt, err := sr.ctx.ParseWithParams(ctx, sql, args...) if err != nil { - return nil, nil, err + return nil, nil, errors.Trace(err) } - for { - req := rc[0].NewChunk() - err := rc[0].Next(context.TODO(), req) - if err != nil { - return nil, nil, err - } - if req.NumRows() == 0 { - break - } - for i := 0; i < req.NumRows(); i++ { - rows = append(rows, req.GetRow(i)) - } + if sr.snapshot > 0 { + return sr.ctx.ExecRestrictedStmt(ctx, stmt, sqlexec.ExecOptionWithSnapshot(sr.snapshot)) } - return rows, rc[0].Fields(), nil + return sr.ctx.ExecRestrictedStmt(ctx, stmt) } func (sr *statsReader) isHistory() bool { - return sr.history != nil + return sr.snapshot > 0 } -func (h *Handle) getStatsReader(history sqlexec.RestrictedSQLExecutor) (*statsReader, error) { +func (h *Handle) getStatsReader(snapshot uint64) (reader *statsReader, err error) { failpoint.Inject("mockGetStatsReaderFail", func(val failpoint.Value) { if val.(bool) { failpoint.Return(nil, errors.New("gofail genStatsReader error")) } }) - if history != nil { - return &statsReader{history: history}, nil + if snapshot > 0 { + return &statsReader{ctx: h.mu.ctx.(sqlexec.RestrictedSQLExecutor), snapshot: snapshot}, nil } h.mu.Lock() - _, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), "begin") + defer func() { + if r := recover(); r != nil { + err = fmt.Errorf("getStatsReader panic %v", r) + } + if err != nil { + h.mu.Unlock() + } + }() + failpoint.Inject("mockGetStatsReaderPanic", nil) + _, err = h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), "begin") if err != nil { return nil, err } - return &statsReader{ctx: h.mu.ctx}, nil + return &statsReader{ctx: h.mu.ctx.(sqlexec.RestrictedSQLExecutor)}, nil } func (h *Handle) releaseStatsReader(reader *statsReader) error { - if reader.history != nil { + if reader.snapshot > 0 { return nil } - _, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), "commit") + _, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), "commit") h.mu.Unlock() return err } @@ -869,7 +1221,7 @@ const ( ) // InsertExtendedStats inserts a record into mysql.stats_extended and update version in mysql.stats_meta. -func (h *Handle) InsertExtendedStats(statsName, db string, colIDs []int64, tp int, tableID int64, ifNotExists bool) (err error) { +func (h *Handle) InsertExtendedStats(statsName string, colIDs []int64, tp int, tableID int64, ifNotExists bool) (err error) { bytes, err := json.Marshal(colIDs) if err != nil { return errors.Trace(err) @@ -879,7 +1231,7 @@ func (h *Handle) InsertExtendedStats(statsName, db string, colIDs []int64, tp in defer h.mu.Unlock() ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin pessimistic") + _, err = exec.ExecuteInternal(ctx, "begin pessimistic") if err != nil { return errors.Trace(err) } @@ -891,8 +1243,8 @@ func (h *Handle) InsertExtendedStats(statsName, db string, colIDs []int64, tp in return errors.Trace(err) } version := txn.StartTS() - sql := fmt.Sprintf("INSERT INTO mysql.stats_extended(stats_name, db, type, table_id, column_ids, version, status) VALUES ('%s', '%s', %d, %d, '%s', %d, %d)", statsName, db, tp, tableID, strColIDs, version, StatsStatusInited) - _, err = exec.Execute(ctx, sql) + const sql = "INSERT INTO mysql.stats_extended(name, type, table_id, column_ids, version, status) VALUES (%?, %?, %?, %?, %?, %?)" + _, err = exec.ExecuteInternal(ctx, sql, statsName, tp, tableID, strColIDs, version, StatsStatusInited) // Key exists, but `if not exists` is specified, so we ignore this error. if kv.ErrKeyExists.Equal(err) && ifNotExists { err = nil @@ -901,68 +1253,104 @@ func (h *Handle) InsertExtendedStats(statsName, db string, colIDs []int64, tp in } // MarkExtendedStatsDeleted update the status of mysql.stats_extended to be `deleted` and the version of mysql.stats_meta. -func (h *Handle) MarkExtendedStatsDeleted(statsName, db string, tableID int64) (err error) { - if tableID < 0 { - sql := fmt.Sprintf("SELECT table_id FROM mysql.stats_extended WHERE stats_name = '%s' and db = '%s'", statsName, db) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) - if err != nil { - return errors.Trace(err) - } - if len(rows) == 0 { +func (h *Handle) MarkExtendedStatsDeleted(statsName string, tableID int64, ifExists bool) (err error) { + ctx := context.Background() + rows, _, err := h.execRestrictedSQL(ctx, "SELECT name FROM mysql.stats_extended WHERE name = %? and table_id = %? and status in (%?, %?)", statsName, tableID, StatsStatusInited, StatsStatusAnalyzed) + if err != nil { + return errors.Trace(err) + } + if len(rows) == 0 { + if ifExists { return nil } - tableID = rows[0].GetInt64(0) + return errors.New(fmt.Sprintf("extended statistics '%s' for the specified table does not exist", statsName)) } + if len(rows) > 1 { + logutil.BgLogger().Warn("unexpected duplicate extended stats records found", zap.String("name", statsName), zap.Int64("table_id", tableID)) + } + h.mu.Lock() defer h.mu.Unlock() - ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin pessimistic") + _, err = exec.ExecuteInternal(ctx, "begin pessimistic") if err != nil { return errors.Trace(err) } defer func() { - err = finishTransaction(ctx, exec, err) + err1 := finishTransaction(ctx, exec, err) + if err == nil && err1 == nil { + h.removeExtendedStatsItem(tableID, statsName) + } + err = err1 }() txn, err := h.mu.ctx.Txn(true) if err != nil { return errors.Trace(err) } version := txn.StartTS() - sqls := make([]string, 2) - sqls[0] = fmt.Sprintf("UPDATE mysql.stats_extended SET version = %d, status = %d WHERE stats_name = '%s' and db = '%s'", version, StatsStatusDeleted, statsName, db) - sqls[1] = fmt.Sprintf("UPDATE mysql.stats_meta SET version = %d WHERE table_id = %d", version, tableID) - return execSQLs(ctx, exec, sqls) + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_extended SET version = %?, status = %? WHERE name = %? and table_id = %?", version, StatsStatusDeleted, statsName, tableID); err != nil { + return err + } + if _, err = exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID); err != nil { + return err + } + return nil +} + +const updateStatsCacheRetryCnt = 5 + +func (h *Handle) removeExtendedStatsItem(tableID int64, statsName string) { + for retry := updateStatsCacheRetryCnt; retry > 0; retry-- { + oldCache := h.statsCache.Load().(statsCache) + tbl, ok := oldCache.tables[tableID] + if !ok || tbl.ExtendedStats == nil || len(tbl.ExtendedStats.Stats) == 0 { + return + } + newTbl := tbl.Copy() + delete(newTbl.ExtendedStats.Stats, statsName) + if h.updateStatsCache(oldCache.update([]*statistics.Table{newTbl}, nil, oldCache.version)) { + return + } + if retry == 1 { + logutil.BgLogger().Info("remove extended stats cache failed", zap.String("stats_name", statsName), zap.Int64("table_id", tableID)) + } else { + logutil.BgLogger().Info("remove extended stats cache failed, retrying", zap.String("stats_name", statsName), zap.Int64("table_id", tableID)) + } + } } // ReloadExtendedStatistics drops the cache for extended statistics and reload data from mysql.stats_extended. func (h *Handle) ReloadExtendedStatistics() error { - reader, err := h.getStatsReader(nil) - if err != nil { - return err - } - oldCache := h.statsCache.Load().(statsCache) - tables := make([]*statistics.Table, 0, len(oldCache.tables)) - for physicalID, tbl := range oldCache.tables { - t, err := h.extendedStatsFromStorage(reader, tbl.Copy(), physicalID, true) + for retry := updateStatsCacheRetryCnt; retry > 0; retry-- { + reader, err := h.getStatsReader(0) if err != nil { return err } - tables = append(tables, t) - } - err = h.releaseStatsReader(reader) - if err != nil { - return err + oldCache := h.statsCache.Load().(statsCache) + tables := make([]*statistics.Table, 0, len(oldCache.tables)) + for physicalID, tbl := range oldCache.tables { + t, err := h.extendedStatsFromStorage(reader, tbl.Copy(), physicalID, true) + if err != nil { + return err + } + tables = append(tables, t) + } + err = h.releaseStatsReader(reader) + if err != nil { + return err + } + if h.updateStatsCache(oldCache.update(tables, nil, oldCache.version)) { + return nil + } } - // Note that this update may fail when the statsCache.version has been modified by others. - h.updateStatsCache(oldCache.update(tables, nil, oldCache.version)) - return nil + return errors.New(fmt.Sprintf("update stats cache failed for %d attempts", updateStatsCacheRetryCnt)) } // BuildExtendedStats build extended stats for column groups if needed based on the column samples. func (h *Handle) BuildExtendedStats(tableID int64, cols []*model.ColumnInfo, collectors []*statistics.SampleCollector) (*statistics.ExtendedStatsColl, error) { - sql := fmt.Sprintf("SELECT stats_name, db, type, column_ids FROM mysql.stats_extended WHERE table_id = %d and status in (%d, %d)", tableID, StatsStatusAnalyzed, StatsStatusInited) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + ctx := context.Background() + const sql = "SELECT name, type, column_ids FROM mysql.stats_extended WHERE table_id = %? and status in (%?, %?)" + rows, _, err := h.execRestrictedSQL(ctx, sql, tableID, StatsStatusAnalyzed, StatsStatusInited) if err != nil { return nil, errors.Trace(err) } @@ -971,12 +1359,9 @@ func (h *Handle) BuildExtendedStats(tableID int64, cols []*model.ColumnInfo, col } statsColl := statistics.NewExtendedStatsColl() for _, row := range rows { - key := statistics.ExtendedStatsKey{ - StatsName: row.GetString(0), - DB: row.GetString(1), - } - item := &statistics.ExtendedStatsItem{Tp: uint8(row.GetInt64(2))} - colIDs := row.GetString(3) + name := row.GetString(0) + item := &statistics.ExtendedStatsItem{Tp: uint8(row.GetInt64(1))} + colIDs := row.GetString(2) err := json.Unmarshal([]byte(colIDs), &item.ColIDs) if err != nil { logutil.BgLogger().Error("invalid column_ids in mysql.stats_extended, skip collecting extended stats for this row", zap.String("column_ids", colIDs), zap.Error(err)) @@ -984,7 +1369,7 @@ func (h *Handle) BuildExtendedStats(tableID int64, cols []*model.ColumnInfo, col } item = h.fillExtendedStatsItemVals(item, cols, collectors) if item != nil { - statsColl.Stats[key] = item + statsColl.Stats[name] = item } } if len(statsColl.Stats) == 0 { @@ -1018,6 +1403,9 @@ func (h *Handle) fillExtStatsCorrVals(item *statistics.ExtendedStatsItem, cols [ } // samplesX and samplesY are in order of handle, i.e, their SampleItem.Ordinals are in order. samplesX := collectors[colOffsets[0]].Samples + if len(samplesX) == 0 { + return nil + } // We would modify Ordinal of samplesY, so we make a deep copy. samplesY := statistics.CopySampleItems(collectors[colOffsets[1]].Samples) sampleNum := len(samplesX) @@ -1073,7 +1461,7 @@ func (h *Handle) SaveExtendedStatsToStorage(tableID int64, extStats *statistics. defer h.mu.Unlock() ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin pessimistic") + _, err = exec.ExecuteInternal(ctx, "begin pessimistic") if err != nil { return errors.Trace(err) } @@ -1085,25 +1473,30 @@ func (h *Handle) SaveExtendedStatsToStorage(tableID int64, extStats *statistics. return errors.Trace(err) } version := txn.StartTS() - sqls := make([]string, 0, 1+len(extStats.Stats)) - for key, item := range extStats.Stats { + for name, item := range extStats.Stats { bytes, err := json.Marshal(item.ColIDs) if err != nil { return errors.Trace(err) } strColIDs := string(bytes) + var statsStr string switch item.Tp { case ast.StatsTypeCardinality, ast.StatsTypeCorrelation: - // If isLoad is true, it's INSERT; otherwise, it's UPDATE. - sqls = append(sqls, fmt.Sprintf("replace into mysql.stats_extended values ('%s', '%s', %d, %d, '%s', %f, null, %d, %d)", key.StatsName, key.DB, item.Tp, tableID, strColIDs, item.ScalarVals, version, StatsStatusAnalyzed)) + statsStr = fmt.Sprintf("%f", item.ScalarVals) case ast.StatsTypeDependency: - sqls = append(sqls, fmt.Sprintf("replace into mysql.stats_extended values ('%s', '%s', %d, %d, '%s', null, '%s', %d, %d)", key.StatsName, key.DB, item.Tp, tableID, strColIDs, item.StringVals, version, StatsStatusAnalyzed)) + statsStr = item.StringVals + } + // If isLoad is true, it's INSERT; otherwise, it's UPDATE. + if _, err := exec.ExecuteInternal(ctx, "replace into mysql.stats_extended values (%?, %?, %?, %?, %?, %?, %?)", name, item.Tp, tableID, strColIDs, statsStr, version, StatsStatusAnalyzed); err != nil { + return err } } if !isLoad { - sqls = append(sqls, fmt.Sprintf("UPDATE mysql.stats_meta SET version = %d WHERE table_id = %d", version, tableID)) + if _, err := exec.ExecuteInternal(ctx, "UPDATE mysql.stats_meta SET version = %? WHERE table_id = %?", version, tableID); err != nil { + return err + } } - return execSQLs(ctx, exec, sqls) + return nil } // CurrentPruneMode indicates whether tbl support runtime prune for table and first partition id. @@ -1119,3 +1512,19 @@ func (h *Handle) RefreshVars() error { defer h.mu.Unlock() return h.mu.ctx.RefreshVars(context.Background()) } + +// CheckAnalyzeVersion checks whether all the statistics versions of this table's columns and indexes are the same. +func (h *Handle) CheckAnalyzeVersion(tblInfo *model.TableInfo, physicalIDs []int64, version *int) bool { + // We simply choose one physical id to get its stats. + var tbl *statistics.Table + for _, pid := range physicalIDs { + tbl = h.GetPartitionStats(tblInfo, pid) + if !tbl.Pseudo { + break + } + } + if tbl == nil || tbl.Pseudo { + return true + } + return statistics.CheckAnalyzeVerOnTable(tbl, version) +} diff --git a/statistics/handle/handle_test.go b/statistics/handle/handle_test.go index 3cc530b47cc70..9d5c2eccf57d3 100644 --- a/statistics/handle/handle_test.go +++ b/statistics/handle/handle_test.go @@ -14,6 +14,7 @@ package handle_test import ( + "bytes" "fmt" "math" "testing" @@ -28,6 +29,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" "github.com/pingcap/tidb/statistics/handle" "github.com/pingcap/tidb/store/mockstore" @@ -52,6 +54,8 @@ func cleanEnv(c *C, store kv.Storage, do *domain.Domain) { tk.MustExec("delete from mysql.stats_histograms") tk.MustExec("delete from mysql.stats_buckets") tk.MustExec("delete from mysql.stats_extended") + tk.MustExec("delete from mysql.stats_fm_sketch") + tk.MustExec("delete from mysql.schema_index_usage") do.StatsHandle().Clear() } @@ -112,13 +116,10 @@ func (s *testStatsSuite) TestStatsCacheMemTracker(c *C) { c.Assert(err, IsNil) tableInfo := tbl.Meta() statsTbl := do.StatsHandle().GetTableStats(tableInfo) - c.Assert(statsTbl.Pseudo, IsTrue) - testKit.MustExec("analyze table t") - - statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.MemoryUsage() > 0, IsTrue) - c.Assert(do.StatsHandle().GetAllTableStatsMemUsage(), Equals, do.StatsHandle().GetMemConsumed()) + c.Assert(statsTbl.Pseudo, IsTrue) + testKit.MustExec("analyze table t") statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.Pseudo, IsFalse) @@ -144,7 +145,6 @@ func (s *testStatsSuite) TestStatsCacheMemTracker(c *C) { statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.MemoryUsage() > 0, IsTrue) - c.Assert(do.StatsHandle().GetAllTableStatsMemUsage(), Equals, do.StatsHandle().GetMemConsumed()) c.Assert(statsTbl.Pseudo, IsFalse) // If the new schema add a column, the table stats can still work. @@ -155,7 +155,6 @@ func (s *testStatsSuite) TestStatsCacheMemTracker(c *C) { do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.Pseudo, IsFalse) - c.Assert(do.StatsHandle().GetAllTableStatsMemUsage(), Equals, do.StatsHandle().GetMemConsumed()) } func assertTableEqual(c *C, a *statistics.Table, b *statistics.Table) { @@ -170,15 +169,18 @@ func assertTableEqual(c *C, a *statistics.Table, b *statistics.Table) { } else { c.Assert(a.Columns[i].CMSketch.Equal(b.Columns[i].CMSketch), IsTrue) } + // The nil case has been considered in (*TopN).Equal() so we don't need to consider it here. + c.Assert(a.Columns[i].TopN.Equal(b.Columns[i].TopN), IsTrue) } c.Assert(len(a.Indices), Equals, len(b.Indices)) for i := range a.Indices { c.Assert(statistics.HistogramEqual(&a.Indices[i].Histogram, &b.Indices[i].Histogram, false), IsTrue) - if a.Columns[i].CMSketch == nil { - c.Assert(b.Columns[i].CMSketch, IsNil) + if a.Indices[i].CMSketch == nil { + c.Assert(b.Indices[i].CMSketch, IsNil) } else { - c.Assert(a.Columns[i].CMSketch.Equal(b.Columns[i].CMSketch), IsTrue) + c.Assert(a.Indices[i].CMSketch.Equal(b.Indices[i].CMSketch), IsTrue) } + c.Assert(a.Indices[i].TopN.Equal(b.Indices[i].TopN), IsTrue) } c.Assert(isSameExtendedStats(a.ExtendedStats, b.ExtendedStats), IsTrue) } @@ -354,7 +356,8 @@ func (s *testStatsSuite) TestVersion(c *C) { tbl1, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) c.Assert(err, IsNil) tableInfo1 := tbl1.Meta() - h := handle.NewHandle(testKit.Se, time.Millisecond) + h, err := handle.NewHandle(testKit.Se, time.Millisecond, do.SysSessionPool()) + c.Assert(err, IsNil) unit := oracle.ComposeTS(1, 0) testKit.MustExec("update mysql.stats_meta set version = ? where table_id = ?", 2*unit, tableInfo1.ID) @@ -507,6 +510,36 @@ func (s *testStatsSuite) TestInitStats(c *C) { h.SetLease(0) } +func (s *testStatsSuite) TestInitStatsVer2(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@session.tidb_analyze_version=2") + tk.MustExec("create table t(a int, b int, c int, index idx(a), index idxab(a, b))") + tk.MustExec("insert into t values(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 4), (4, 4, 4), (4, 4, 4)") + tk.MustExec("analyze table t with 2 topn, 3 buckets") + h := s.do.StatsHandle() + is := s.do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + // `Update` will not use load by need strategy when `Lease` is 0, and `InitStats` is only called when + // `Lease` is not 0, so here we just change it. + h.SetLease(time.Millisecond) + + h.Clear() + c.Assert(h.InitStats(is), IsNil) + table0 := h.GetTableStats(tbl.Meta()) + cols := table0.Columns + c.Assert(cols[1].LastAnalyzePos.GetBytes()[0], Equals, uint8(0x33)) + c.Assert(cols[2].LastAnalyzePos.GetBytes()[0], Equals, uint8(0x33)) + c.Assert(cols[3].LastAnalyzePos.GetBytes()[0], Equals, uint8(0x33)) + h.Clear() + c.Assert(h.Update(is), IsNil) + table1 := h.GetTableStats(tbl.Meta()) + assertTableEqual(c, table0, table1) + h.SetLease(0) +} + func (s *testStatsSuite) TestLoadStats(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) @@ -534,7 +567,8 @@ func (s *testStatsSuite) TestLoadStats(c *C) { hg = stat.Indices[tableInfo.Indices[0].ID].Histogram c.Assert(hg.Len(), Greater, 0) cms = stat.Indices[tableInfo.Indices[0].ID].CMSketch - c.Assert(cms.TotalCount(), Greater, uint64(0)) + topN := stat.Indices[tableInfo.Indices[0].ID].TopN + c.Assert(cms.TotalCount()+topN.TotalCount(), Greater, uint64(0)) hg = stat.Columns[tableInfo.Columns[2].ID].Histogram c.Assert(hg.Len(), Equals, 0) cms = stat.Columns[tableInfo.Columns[2].ID].CMSketch @@ -550,6 +584,13 @@ func (s *testStatsSuite) TestLoadStats(c *C) { err = h.LoadNeededHistograms() c.Assert(err, NotNil) c.Assert(failpoint.Disable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderFail"), IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderPanic", "panic"), IsNil) + err = h.LoadNeededHistograms() + c.Assert(err, ErrorMatches, ".*getStatsReader panic.*") + c.Assert(failpoint.Disable("github.com/pingcap/tidb/statistics/handle/mockGetStatsReaderPanic"), IsNil) + err = h.LoadNeededHistograms() + c.Assert(err, IsNil) } func newStoreWithBootstrap() (kv.Storage, *domain.Domain, error) { @@ -581,9 +622,16 @@ func (s *testStatsSuite) TestCorrelation(c *C) { result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() c.Assert(len(result.Rows()), Equals, 2) c.Assert(result.Rows()[0][9], Equals, "0") - c.Assert(result.Rows()[1][9], Equals, "0.828571") + c.Assert(result.Rows()[1][9], Equals, "0.8285714285714286") + testKit.MustExec("set @@session.tidb_analyze_version=2") + testKit.MustExec("analyze table t") + result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][9], Equals, "0") + c.Assert(result.Rows()[1][9], Equals, "0.8285714285714286") testKit.MustExec("truncate table t") + testKit.MustExec("set @@session.tidb_analyze_version=1") result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() c.Assert(len(result.Rows()), Equals, 0) testKit.MustExec("insert into t values(1,21),(3,12),(4,7),(2,20),(5,1)") @@ -597,9 +645,16 @@ func (s *testStatsSuite) TestCorrelation(c *C) { result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() c.Assert(len(result.Rows()), Equals, 2) c.Assert(result.Rows()[0][9], Equals, "0") - c.Assert(result.Rows()[1][9], Equals, "-0.942857") + c.Assert(result.Rows()[1][9], Equals, "-0.9428571428571428") + testKit.MustExec("set @@session.tidb_analyze_version=2") + testKit.MustExec("analyze table t") + result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][9], Equals, "0") + c.Assert(result.Rows()[1][9], Equals, "-0.9428571428571428") testKit.MustExec("truncate table t") + testKit.MustExec("set @@session.tidb_analyze_version=1") testKit.MustExec("insert into t values (1,1),(2,1),(3,1),(4,1),(5,1),(6,1),(7,1),(8,1),(9,1),(10,1),(11,1),(12,1),(13,1),(14,1),(15,1),(16,1),(17,1),(18,1),(19,1),(20,2),(21,2),(22,2),(23,2),(24,2),(25,2)") testKit.MustExec("analyze table t") result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() @@ -614,14 +669,20 @@ func (s *testStatsSuite) TestCorrelation(c *C) { result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() c.Assert(len(result.Rows()), Equals, 2) c.Assert(result.Rows()[0][9], Equals, "1") - c.Assert(result.Rows()[1][9], Equals, "0.828571") + c.Assert(result.Rows()[1][9], Equals, "0.8285714285714286") + testKit.MustExec("set @@session.tidb_analyze_version=2") + testKit.MustExec("analyze table t") + result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][9], Equals, "1") + c.Assert(result.Rows()[1][9], Equals, "0.8285714285714286") testKit.MustExec("truncate table t") testKit.MustExec("insert into t values(1,1),(2,7),(3,12),(8,18),(4,20),(5,21)") testKit.MustExec("analyze table t") result = testKit.MustQuery("show stats_histograms where Table_name = 't'").Sort() c.Assert(len(result.Rows()), Equals, 2) - c.Assert(result.Rows()[0][9], Equals, "0.828571") + c.Assert(result.Rows()[0][9], Equals, "0.8285714285714286") c.Assert(result.Rows()[1][9], Equals, "1") testKit.MustExec("drop table t") @@ -638,33 +699,908 @@ func (s *testStatsSuite) TestCorrelation(c *C) { c.Assert(result.Rows()[0][9], Equals, "0") } +func (s *testStatsSuite) TestShowGlobalStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("set @@tidb_partition_prune_mode = 'static'") + tk.MustExec("create table t (a int, key(a)) partition by hash(a) partitions 2") + tk.MustExec("insert into t values (1), (2), (3), (4)") + tk.MustExec("analyze table t with 1 buckets") + c.Assert(len(tk.MustQuery("show stats_meta").Rows()), Equals, 2) + c.Assert(len(tk.MustQuery("show stats_meta where partition_name='global'").Rows()), Equals, 0) + c.Assert(len(tk.MustQuery("show stats_buckets").Rows()), Equals, 4) // 2 partitions * (1 for the column_a and 1 for the index_a) + c.Assert(len(tk.MustQuery("show stats_buckets where partition_name='global'").Rows()), Equals, 0) + c.Assert(len(tk.MustQuery("show stats_histograms").Rows()), Equals, 4) + c.Assert(len(tk.MustQuery("show stats_histograms where partition_name='global'").Rows()), Equals, 0) + c.Assert(len(tk.MustQuery("show stats_healthy").Rows()), Equals, 2) + c.Assert(len(tk.MustQuery("show stats_healthy where partition_name='global'").Rows()), Equals, 0) + + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic'") + tk.MustExec("analyze table t with 0 topn, 1 buckets") + c.Assert(len(tk.MustQuery("show stats_meta").Rows()), Equals, 3) + c.Assert(len(tk.MustQuery("show stats_meta where partition_name='global'").Rows()), Equals, 1) + c.Assert(len(tk.MustQuery("show stats_buckets").Rows()), Equals, 6) + c.Assert(len(tk.MustQuery("show stats_buckets where partition_name='global'").Rows()), Equals, 2) + c.Assert(len(tk.MustQuery("show stats_histograms").Rows()), Equals, 6) + c.Assert(len(tk.MustQuery("show stats_histograms where partition_name='global'").Rows()), Equals, 2) + c.Assert(len(tk.MustQuery("show stats_healthy").Rows()), Equals, 3) + c.Assert(len(tk.MustQuery("show stats_healthy where partition_name='global'").Rows()), Equals, 1) +} + +func (s *testStatsSuite) TestBuildGlobalLevelStats(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t, t1;") + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustExec("set @@tidb_partition_prune_mode = 'static';") + testKit.MustExec("create table t(a int, b int, c int) PARTITION BY HASH(a) PARTITIONS 3;") + testKit.MustExec("create table t1(a int);") + testKit.MustExec("insert into t values(1,1,1),(3,12,3),(4,20,4),(2,7,2),(5,21,5);") + testKit.MustExec("insert into t1 values(1),(3),(4),(2),(5);") + testKit.MustExec("create index idx_t_ab on t(a, b);") + testKit.MustExec("create index idx_t_b on t(b);") + testKit.MustExec("analyze table t, t1;") + result := testKit.MustQuery("show stats_meta where table_name = 't';").Sort() + c.Assert(len(result.Rows()), Equals, 3) + c.Assert(result.Rows()[0][5], Equals, "1") + c.Assert(result.Rows()[1][5], Equals, "2") + c.Assert(result.Rows()[2][5], Equals, "2") + result = testKit.MustQuery("show stats_histograms where table_name = 't';").Sort() + c.Assert(len(result.Rows()), Equals, 15) + + result = testKit.MustQuery("show stats_meta where table_name = 't1';").Sort() + c.Assert(len(result.Rows()), Equals, 1) + c.Assert(result.Rows()[0][5], Equals, "5") + result = testKit.MustQuery("show stats_histograms where table_name = 't1';").Sort() + c.Assert(len(result.Rows()), Equals, 1) + + // Test the 'dynamic' mode + testKit.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + testKit.MustExec("analyze table t, t1;") + result = testKit.MustQuery("show stats_meta where table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 4) + c.Assert(result.Rows()[0][5], Equals, "5") + c.Assert(result.Rows()[1][5], Equals, "1") + c.Assert(result.Rows()[2][5], Equals, "2") + c.Assert(result.Rows()[3][5], Equals, "2") + result = testKit.MustQuery("show stats_histograms where table_name = 't';").Sort() + c.Assert(len(result.Rows()), Equals, 20) + + result = testKit.MustQuery("show stats_meta where table_name = 't1';").Sort() + c.Assert(len(result.Rows()), Equals, 1) + c.Assert(result.Rows()[0][5], Equals, "5") + result = testKit.MustQuery("show stats_histograms where table_name = 't1';").Sort() + c.Assert(len(result.Rows()), Equals, 1) + + testKit.MustExec("analyze table t index idx_t_ab, idx_t_b;") + result = testKit.MustQuery("show stats_meta where table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 4) + c.Assert(result.Rows()[0][5], Equals, "5") + c.Assert(result.Rows()[1][5], Equals, "1") + c.Assert(result.Rows()[2][5], Equals, "2") + c.Assert(result.Rows()[3][5], Equals, "2") + result = testKit.MustQuery("show stats_histograms where table_name = 't';").Sort() + c.Assert(len(result.Rows()), Equals, 20) +} + +func (s *testStatsSuite) prepareForGlobalStatsWithOpts(c *C, tk *testkit.TestKit) { + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(` create table t (a int, key(a)) partition by range (a) ` + + `(partition p0 values less than (100000), partition p1 values less than (200000))`) + buf1 := bytes.NewBufferString("insert into t values (0)") + buf2 := bytes.NewBufferString("insert into t values (100000)") + for i := 0; i < 5000; i += 3 { + buf1.WriteString(fmt.Sprintf(", (%v)", i)) + buf2.WriteString(fmt.Sprintf(", (%v)", 100000+i)) + } + tk.MustExec(buf1.String()) + tk.MustExec(buf2.String()) + tk.MustExec("set @@tidb_analyze_version=2") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) +} + +func (s *testStatsSuite) checkForGlobalStatsWithOpts(c *C, tk *testkit.TestKit, p string, topn, buckets int) { + delta := buckets/2 + 1 + for _, isIdx := range []int{0, 1} { + c.Assert(len(tk.MustQuery(fmt.Sprintf("show stats_topn where partition_name='%v' and is_index=%v", p, isIdx)).Rows()), Equals, topn) + numBuckets := len(tk.MustQuery(fmt.Sprintf("show stats_buckets where partition_name='%v' and is_index=%v", p, isIdx)).Rows()) + // since the hist-building algorithm doesn't stipulate the final bucket number to be equal to the expected number exactly, + // we have to check the results by a range here. + c.Assert(numBuckets >= buckets-delta, IsTrue) + c.Assert(numBuckets <= buckets+delta, IsTrue) + } +} + +func (s *testStatsSuite) TestAnalyzeGlobalStatsWithOpts(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + s.prepareForGlobalStatsWithOpts(c, tk) + + type opt struct { + topn int + buckets int + err bool + } + + cases := []opt{ + {1, 37, false}, + {2, 47, false}, + {10, 77, false}, + {77, 219, false}, + {-31, 222, true}, + {10, -77, true}, + {10000, 47, true}, + {77, 47000, true}, + } + for _, ca := range cases { + sql := fmt.Sprintf("analyze table t with %v topn, %v buckets", ca.topn, ca.buckets) + if !ca.err { + tk.MustExec(sql) + s.checkForGlobalStatsWithOpts(c, tk, "global", ca.topn, ca.buckets) + s.checkForGlobalStatsWithOpts(c, tk, "p0", ca.topn, ca.buckets) + s.checkForGlobalStatsWithOpts(c, tk, "p1", ca.topn, ca.buckets) + } else { + err := tk.ExecToErr(sql) + c.Assert(err, NotNil) + } + } +} + +func (s *testStatsSuite) TestAnalyzeGlobalStatsWithOpts2(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + s.prepareForGlobalStatsWithOpts(c, tk) + + tk.MustExec("analyze table t with 20 topn, 50 buckets") + s.checkForGlobalStatsWithOpts(c, tk, "global", 20, 50) + s.checkForGlobalStatsWithOpts(c, tk, "p0", 20, 50) + s.checkForGlobalStatsWithOpts(c, tk, "p1", 20, 50) + + // analyze a partition to let its options be different with others' + tk.MustExec("analyze table t partition p0 with 10 topn, 20 buckets") + s.checkForGlobalStatsWithOpts(c, tk, "global", 10, 20) // use new options + s.checkForGlobalStatsWithOpts(c, tk, "p0", 10, 20) + s.checkForGlobalStatsWithOpts(c, tk, "p1", 20, 50) + + tk.MustExec("analyze table t partition p1 with 100 topn, 200 buckets") + s.checkForGlobalStatsWithOpts(c, tk, "global", 100, 200) + s.checkForGlobalStatsWithOpts(c, tk, "p0", 10, 20) + s.checkForGlobalStatsWithOpts(c, tk, "p1", 100, 200) + + tk.MustExec("analyze table t partition p0") // default options + s.checkForGlobalStatsWithOpts(c, tk, "global", 20, 256) + s.checkForGlobalStatsWithOpts(c, tk, "p0", 20, 256) + s.checkForGlobalStatsWithOpts(c, tk, "p1", 100, 200) +} + +func (s *testStatsSuite) TestGlobalStatsHealthy(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(` +create table t ( + a int, + key(a) +) +partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20) +)`) + + checkModifyAndCount := func(gModify, gCount, p0Modify, p0Count, p1Modify, p1Count int) { + rs := tk.MustQuery("show stats_meta").Rows() + c.Assert(rs[0][4].(string), Equals, fmt.Sprintf("%v", gModify)) // global.modify_count + c.Assert(rs[0][5].(string), Equals, fmt.Sprintf("%v", gCount)) // global.row_count + c.Assert(rs[1][4].(string), Equals, fmt.Sprintf("%v", p0Modify)) // p0.modify_count + c.Assert(rs[1][5].(string), Equals, fmt.Sprintf("%v", p0Count)) // p0.row_count + c.Assert(rs[2][4].(string), Equals, fmt.Sprintf("%v", p1Modify)) // p1.modify_count + c.Assert(rs[2][5].(string), Equals, fmt.Sprintf("%v", p1Count)) // p1.row_count + } + checkHealthy := func(gH, p0H, p1H int) { + tk.MustQuery("show stats_healthy").Check(testkit.Rows( + fmt.Sprintf("test t global %v", gH), + fmt.Sprintf("test t p0 %v", p0H), + fmt.Sprintf("test t p1 %v", p1H))) + } + + tk.MustExec("set @@tidb_analyze_version=2") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("analyze table t") + checkModifyAndCount(0, 0, 0, 0, 0, 0) + checkHealthy(100, 100, 100) + + tk.MustExec("insert into t values (1), (2)") // update p0 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(s.do.StatsHandle().Update(s.do.InfoSchema()), IsNil) + checkModifyAndCount(2, 2, 2, 2, 0, 0) + checkHealthy(0, 0, 100) + + tk.MustExec("insert into t values (11), (12), (13), (14)") // update p1 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(s.do.StatsHandle().Update(s.do.InfoSchema()), IsNil) + checkModifyAndCount(6, 6, 2, 2, 4, 4) + checkHealthy(0, 0, 0) + + tk.MustExec("analyze table t") + checkModifyAndCount(0, 6, 0, 2, 0, 4) + checkHealthy(100, 100, 100) + + tk.MustExec("insert into t values (4), (5), (15), (16)") // update p0 and p1 together + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(s.do.StatsHandle().Update(s.do.InfoSchema()), IsNil) + checkModifyAndCount(4, 10, 2, 4, 2, 6) + checkHealthy(60, 50, 66) +} + +func (s *testStatsSuite) TestGlobalStatsData(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(` +create table t ( + a int, + key(a) +) +partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20) +)`) + tk.MustExec("set @@tidb_analyze_version=2") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("insert into t values (1), (2), (3), (4), (5), (6), (6), (null), (11), (12), (13), (14), (15), (16), (17), (18), (19), (19)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table t with 0 topn, 2 buckets") + + tk.MustQuery("select modify_count, count from mysql.stats_meta order by table_id asc").Check( + testkit.Rows("0 18", "0 8", "0 10")) // global row-count = sum(partition row-count) + + // distinct, null_count, tot_col_size should be the sum of their values in partition-stats, and correlation should be 0 + tk.MustQuery("select distinct_count, null_count, tot_col_size, correlation=0 from mysql.stats_histograms where is_index=0 order by table_id asc").Check( + testkit.Rows("15 1 17 1", "6 1 7 0", "9 0 10 0")) + tk.MustQuery("select distinct_count, null_count, tot_col_size, correlation=0 from mysql.stats_histograms where is_index=1 order by table_id asc").Check( + testkit.Rows("15 1 0 1", "6 1 0 1", "9 0 0 1")) + + tk.MustQuery("show stats_buckets where is_index=0").Check( + // db table partition col is_idx bucket_id count repeats lower upper ndv + testkit.Rows("test t global a 0 0 7 2 1 6 0", + "test t global a 0 1 17 2 6 19 0", + "test t p0 a 0 0 4 1 1 4 0", + "test t p0 a 0 1 7 2 5 6 0", + "test t p1 a 0 0 6 1 11 16 0", + "test t p1 a 0 1 10 2 17 19 0")) + tk.MustQuery("show stats_buckets where is_index=1").Check( + testkit.Rows("test t global a 1 0 7 2 1 6 6", + "test t global a 1 1 17 2 6 19 9", + "test t p0 a 1 0 4 1 1 4 4", + "test t p0 a 1 1 7 2 5 6 2", + "test t p1 a 1 0 8 1 11 18 8", + "test t p1 a 1 1 10 2 19 19 1")) +} + +func (s *testStatsSuite) TestGlobalStatsData2(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("set @@tidb_analyze_version=2") + + // int + (column & index with 1 column) + tk.MustExec("drop table if exists tint") + tk.MustExec("create table tint (c int, key(c)) partition by range (c) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec("insert into tint values (1), (2), (3), (4), (4), (5), (5), (5), (null), (11), (12), (13), (14), (15), (16), (16), (16), (16), (17), (17)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table tint with 2 topn, 2 buckets") + + tk.MustQuery("select modify_count, count from mysql.stats_meta order by table_id asc").Check(testkit.Rows( + "0 20", // global: g.count = p0.count + p1.count + "0 9", // p0 + "0 11")) // p1 + + tk.MustQuery("show stats_topn where table_name='tint' and is_index=0").Check(testkit.Rows( + "test tint global c 0 5 3", + "test tint global c 0 16 4", + "test tint p0 c 0 4 2", + "test tint p0 c 0 5 3", + "test tint p1 c 0 16 4", + "test tint p1 c 0 17 2")) + + tk.MustQuery("show stats_topn where table_name='tint' and is_index=1").Check(testkit.Rows( + "test tint global c 1 5 3", + "test tint global c 1 16 4", + "test tint p0 c 1 4 2", + "test tint p0 c 1 5 3", + "test tint p1 c 1 16 4", + "test tint p1 c 1 17 2")) + + tk.MustQuery("show stats_buckets where is_index=0").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tint global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms + "test tint global c 0 1 12 2 4 17 0", + "test tint p0 c 0 0 2 1 1 2 0", + "test tint p0 c 0 1 3 1 3 3 0", + "test tint p1 c 0 0 3 1 11 13 0", + "test tint p1 c 0 1 5 1 14 15 0")) + + tk.MustQuery("select distinct_count, null_count, tot_col_size from mysql.stats_histograms where is_index=0 order by table_id asc").Check( + testkit.Rows("12 1 19", // global, g = p0 + p1 + "5 1 8", // p0 + "7 0 11")) // p1 + + tk.MustQuery("show stats_buckets where is_index=1").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tint global c 1 0 5 0 1 5 4", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tint global c 1 1 12 2 5 17 6", + "test tint p0 c 1 0 3 0 1 4 3", + "test tint p0 c 1 1 3 0 5 5 0", + "test tint p1 c 1 0 5 0 11 16 5", + "test tint p1 c 1 1 5 0 17 17 0")) + + tk.MustQuery("select distinct_count, null_count from mysql.stats_histograms where is_index=1 order by table_id asc").Check( + testkit.Rows("12 1", // global, g = p0 + p1 + "5 1", // p0 + "7 0")) // p1 + + // double + (column + index with 1 column) + tk.MustExec("drop table if exists tdouble") + tk.MustExec(`create table tdouble (a int, c double, key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdouble values ` + + `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 + `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table tdouble with 2 topn, 2 buckets") + + rs := tk.MustQuery("show stats_meta where table_name='tdouble'").Rows() + c.Assert(rs[0][5].(string), Equals, "20") // g.count = p0.count + p1.count + c.Assert(rs[1][5].(string), Equals, "9") // p0.count + c.Assert(rs[2][5].(string), Equals, "11") // p1.count + + tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdouble global c 0 5 3`, + `test tdouble global c 0 16 4`, + `test tdouble p0 c 0 4 2`, + `test tdouble p0 c 0 5 3`, + `test tdouble p1 c 0 16 4`, + `test tdouble p1 c 0 17 2`)) + + tk.MustQuery("show stats_topn where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdouble global c 1 5 3`, + `test tdouble global c 1 16 4`, + `test tdouble p0 c 1 4 2`, + `test tdouble p0 c 1 5 3`, + `test tdouble p1 c 1 16 4`, + `test tdouble p1 c 1 17 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdouble global c 0 0 5 2 1 4 0", // bucket.ndv is not maintained for column histograms + "test tdouble global c 0 1 12 2 4 17 0", + "test tdouble p0 c 0 0 2 1 1 2 0", + "test tdouble p0 c 0 1 3 1 3 3 0", + "test tdouble p1 c 0 0 3 1 11 13 0", + "test tdouble p1 c 0 1 5 1 14 15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=0").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + tk.MustQuery("show stats_buckets where table_name='tdouble' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdouble global c 1 0 5 0 1 5 4", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdouble global c 1 1 12 2 5 17 6", + "test tdouble p0 c 1 0 3 0 1 4 3", + "test tdouble p0 c 1 1 3 0 5 5 0", + "test tdouble p1 c 1 0 5 0 11 16 5", + "test tdouble p1 c 1 1 5 0 17 17 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdouble' and column_name='c' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + // decimal + (column + index with 1 column) + tk.MustExec("drop table if exists tdecimal") + tk.MustExec(`create table tdecimal (a int, c decimal(10, 2), key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdecimal values ` + + `(1, 1), (2, 2), (3, 3), (4, 4), (4, 4), (5, 5), (5, 5), (5, 5), (null, null), ` + // values in p0 + `(11, 11), (12, 12), (13, 13), (14, 14), (15, 15), (16, 16), (16, 16), (16, 16), (16, 16), (17, 17), (17, 17)`) // values in p1 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table tdecimal with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tdecimal'").Rows() + c.Assert(rs[0][5].(string), Equals, "20") // g.count = p0.count + p1.count + c.Assert(rs[1][5].(string), Equals, "9") // p0.count + c.Assert(rs[2][5].(string), Equals, "11") // p1.count + + tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdecimal global c 0 5.00 3`, + `test tdecimal global c 0 16.00 4`, + `test tdecimal p0 c 0 4.00 2`, + `test tdecimal p0 c 0 5.00 3`, + `test tdecimal p1 c 0 16.00 4`, + `test tdecimal p1 c 0 17.00 2`)) + + tk.MustQuery("show stats_topn where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdecimal global c 1 5.00 3`, + `test tdecimal global c 1 16.00 4`, + `test tdecimal p0 c 1 4.00 2`, + `test tdecimal p0 c 1 5.00 3`, + `test tdecimal p1 c 1 16.00 4`, + `test tdecimal p1 c 1 17.00 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdecimal global c 0 0 5 2 1.00 4.00 0", // bucket.ndv is not maintained for column histograms + "test tdecimal global c 0 1 12 2 4.00 17.00 0", + "test tdecimal p0 c 0 0 2 1 1.00 2.00 0", + "test tdecimal p0 c 0 1 3 1 3.00 3.00 0", + "test tdecimal p1 c 0 0 3 1 11.00 13.00 0", + "test tdecimal p1 c 0 1 5 1 14.00 15.00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=0").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + tk.MustQuery("show stats_buckets where table_name='tdecimal' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdecimal global c 1 0 5 0 1.00 5.00 4", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdecimal global c 1 1 12 2 5.00 17.00 6", + "test tdecimal p0 c 1 0 3 0 1.00 4.00 3", + "test tdecimal p0 c 1 1 3 0 5.00 5.00 0", + "test tdecimal p1 c 1 0 5 0 11.00 16.00 5", + "test tdecimal p1 c 1 1 5 0 17.00 17.00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdecimal' and column_name='c' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + // datetime + (column + index with 1 column) + tk.MustExec("drop table if exists tdatetime") + tk.MustExec(`create table tdatetime (a int, c datetime, key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tdatetime values ` + + `(1, '2000-01-01'), (2, '2000-01-02'), (3, '2000-01-03'), (4, '2000-01-04'), (4, '2000-01-04'), (5, '2000-01-05'), (5, '2000-01-05'), (5, '2000-01-05'), (null, null), ` + // values in p0 + `(11, '2000-01-11'), (12, '2000-01-12'), (13, '2000-01-13'), (14, '2000-01-14'), (15, '2000-01-15'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (16, '2000-01-16'), (17, '2000-01-17'), (17, '2000-01-17')`) // values in p1 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table tdatetime with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tdatetime'").Rows() + c.Assert(rs[0][5].(string), Equals, "20") // g.count = p0.count + p1.count + c.Assert(rs[1][5].(string), Equals, "9") // p0.count + c.Assert(rs[2][5].(string), Equals, "11") // p1.count + + tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tdatetime global c 0 2000-01-05 00:00:00 3`, + `test tdatetime global c 0 2000-01-16 00:00:00 4`, + `test tdatetime p0 c 0 2000-01-04 00:00:00 2`, + `test tdatetime p0 c 0 2000-01-05 00:00:00 3`, + `test tdatetime p1 c 0 2000-01-16 00:00:00 4`, + `test tdatetime p1 c 0 2000-01-17 00:00:00 2`)) + + tk.MustQuery("show stats_topn where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tdatetime global c 1 2000-01-05 00:00:00 3`, + `test tdatetime global c 1 2000-01-16 00:00:00 4`, + `test tdatetime p0 c 1 2000-01-04 00:00:00 2`, + `test tdatetime p0 c 1 2000-01-05 00:00:00 3`, + `test tdatetime p1 c 1 2000-01-16 00:00:00 4`, + `test tdatetime p1 c 1 2000-01-17 00:00:00 2`)) + + tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdatetime global c 0 0 5 2 2000-01-01 00:00:00 2000-01-04 00:00:00 0", // bucket.ndv is not maintained for column histograms + "test tdatetime global c 0 1 12 2 2000-01-04 00:00:00 2000-01-17 00:00:00 0", + "test tdatetime p0 c 0 0 2 1 2000-01-01 00:00:00 2000-01-02 00:00:00 0", + "test tdatetime p0 c 0 1 3 1 2000-01-03 00:00:00 2000-01-03 00:00:00 0", + "test tdatetime p1 c 0 0 3 1 2000-01-11 00:00:00 2000-01-13 00:00:00 0", + "test tdatetime p1 c 0 1 5 1 2000-01-14 00:00:00 2000-01-15 00:00:00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=0").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + tk.MustQuery("show stats_buckets where table_name='tdatetime' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tdatetime global c 1 0 5 0 2000-01-01 00:00:00 2000-01-05 00:00:00 4", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tdatetime global c 1 1 12 2 2000-01-05 00:00:00 2000-01-17 00:00:00 6", + "test tdatetime p0 c 1 0 3 0 2000-01-01 00:00:00 2000-01-04 00:00:00 3", + "test tdatetime p0 c 1 1 3 0 2000-01-05 00:00:00 2000-01-05 00:00:00 0", + "test tdatetime p1 c 1 0 5 0 2000-01-11 00:00:00 2000-01-16 00:00:00 5", + "test tdatetime p1 c 1 1 5 0 2000-01-17 00:00:00 2000-01-17 00:00:00 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdatetime' and column_name='c' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + // string + (column + index with 1 column) + tk.MustExec("drop table if exists tstring") + tk.MustExec(`create table tstring (a int, c varchar(32), key(c)) partition by range (a)` + + `(partition p0 values less than(10),partition p1 values less than(20))`) + tk.MustExec(`insert into tstring values ` + + `(1, 'a1'), (2, 'a2'), (3, 'a3'), (4, 'a4'), (4, 'a4'), (5, 'a5'), (5, 'a5'), (5, 'a5'), (null, null), ` + // values in p0 + `(11, 'b11'), (12, 'b12'), (13, 'b13'), (14, 'b14'), (15, 'b15'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (16, 'b16'), (17, 'b17'), (17, 'b17')`) // values in p1 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table tstring with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tstring'").Rows() + c.Assert(rs[0][5].(string), Equals, "20") // g.count = p0.count + p1.count + c.Assert(rs[1][5].(string), Equals, "9") // p0.count + c.Assert(rs[2][5].(string), Equals, "11") // p1.count + + tk.MustQuery("show stats_topn where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( + `test tstring global c 0 a5 3`, + `test tstring global c 0 b16 4`, + `test tstring p0 c 0 a4 2`, + `test tstring p0 c 0 a5 3`, + `test tstring p1 c 0 b16 4`, + `test tstring p1 c 0 b17 2`)) + + tk.MustQuery("show stats_topn where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( + `test tstring global c 1 a5 3`, + `test tstring global c 1 b16 4`, + `test tstring p0 c 1 a4 2`, + `test tstring p0 c 1 a5 3`, + `test tstring p1 c 1 b16 4`, + `test tstring p1 c 1 b17 2`)) + + tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=0 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tstring global c 0 0 5 2 a1 a4 0", // bucket.ndv is not maintained for column histograms + "test tstring global c 0 1 12 2 a4 b17 0", + "test tstring p0 c 0 0 2 1 a1 a2 0", + "test tstring p0 c 0 1 3 1 a3 a3 0", + "test tstring p1 c 0 0 3 1 b11 b13 0", + "test tstring p1 c 0 1 5 1 b14 b15 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=0").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") + + tk.MustQuery("show stats_buckets where table_name='tstring' and is_index=1 and column_name='c'").Check(testkit.Rows( + // db, tbl, part, col, isIdx, bucketID, count, repeat, lower, upper, ndv + "test tstring global c 1 0 5 0 a1 a5 4", // 4 is popped from p0.TopN, so g.ndv = p0.ndv+1 + "test tstring global c 1 1 12 2 a5 b17 6", + "test tstring p0 c 1 0 3 0 a1 a4 3", + "test tstring p0 c 1 1 3 0 a5 a5 0", + "test tstring p1 c 1 0 5 0 b11 b16 5", + "test tstring p1 c 1 1 5 0 b17 b17 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tstring' and column_name='c' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "12") // g.ndv = p0 + p1 + c.Assert(rs[1][6].(string), Equals, "5") + c.Assert(rs[2][6].(string), Equals, "7") + c.Assert(rs[0][7].(string), Equals, "1") // g.null_count = p0 + p1 + c.Assert(rs[1][7].(string), Equals, "1") + c.Assert(rs[2][7].(string), Equals, "0") +} + +func (s *testStatsSuite) TestGlobalStatsData3(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("set @@tidb_analyze_version=2") + + // index(int, int) + tk.MustExec("drop table if exists tintint") + tk.MustExec("create table tintint (a int, b int, key(a, b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec(`insert into tintint values ` + + `(1, 1), (1, 2), (2, 1), (2, 2), (2, 3), (2, 3), (3, 1), (3, 1), (3, 1),` + // values in p0 + `(11, 1), (12, 1), (12, 2), (13, 1), (13, 1), (13, 2), (13, 2), (13, 2)`) // values in p1 + tk.MustExec("analyze table tintint with 2 topn, 2 buckets") + + rs := tk.MustQuery("show stats_meta where table_name='tintint'").Rows() + c.Assert(rs[0][5].(string), Equals, "17") // g.total = p0.total + p1.total + c.Assert(rs[1][5].(string), Equals, "9") + c.Assert(rs[2][5].(string), Equals, "8") + + tk.MustQuery("show stats_topn where table_name='tintint' and is_index=1").Check(testkit.Rows( + "test tintint global a 1 (3, 1) 3", + "test tintint global a 1 (13, 2) 3", + "test tintint p0 a 1 (2, 3) 2", + "test tintint p0 a 1 (3, 1) 3", + "test tintint p1 a 1 (13, 1) 2", + "test tintint p1 a 1 (13, 2) 3")) + + tk.MustQuery("show stats_buckets where table_name='tintint' and is_index=1").Check(testkit.Rows( + "test tintint global a 1 0 6 0 (1, 1) (3, 1) 5", // (2, 3) is popped into it + "test tintint global a 1 1 11 0 (3, 1) (13, 2) 4", // (13, 1) is popped into it + "test tintint p0 a 1 0 4 1 (1, 1) (2, 2) 4", + "test tintint p0 a 1 1 4 0 (2, 3) (3, 1) 0", + "test tintint p1 a 1 0 3 0 (11, 1) (13, 1) 3", + "test tintint p1 a 1 1 3 0 (13, 2) (13, 2) 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tintint' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "11") // g.ndv = p0.ndv + p1.ndv + c.Assert(rs[1][6].(string), Equals, "6") + c.Assert(rs[2][6].(string), Equals, "5") + + // index(int, string) + tk.MustExec("drop table if exists tintstr") + tk.MustExec("create table tintstr (a int, b varchar(32), key(a, b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec(`insert into tintstr values ` + + `(1, '1'), (1, '2'), (2, '1'), (2, '2'), (2, '3'), (2, '3'), (3, '1'), (3, '1'), (3, '1'),` + // values in p0 + `(11, '1'), (12, '1'), (12, '2'), (13, '1'), (13, '1'), (13, '2'), (13, '2'), (13, '2')`) // values in p1 + tk.MustExec("analyze table tintstr with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tintstr'").Rows() + c.Assert(rs[0][5].(string), Equals, "17") // g.total = p0.total + p1.total + c.Assert(rs[1][5].(string), Equals, "9") + c.Assert(rs[2][5].(string), Equals, "8") + + tk.MustQuery("show stats_topn where table_name='tintstr' and is_index=1").Check(testkit.Rows( + "test tintstr global a 1 (3, 1) 3", + "test tintstr global a 1 (13, 2) 3", + "test tintstr p0 a 1 (2, 3) 2", + "test tintstr p0 a 1 (3, 1) 3", + "test tintstr p1 a 1 (13, 1) 2", + "test tintstr p1 a 1 (13, 2) 3")) + + tk.MustQuery("show stats_buckets where table_name='tintstr' and is_index=1").Check(testkit.Rows( + "test tintstr global a 1 0 6 0 (1, 1) (3, 1) 5", // (2, 3) is popped into it + "test tintstr global a 1 1 11 0 (3, 1) (13, 2) 4", // (13, 1) is popped into it + "test tintstr p0 a 1 0 4 1 (1, 1) (2, 2) 4", + "test tintstr p0 a 1 1 4 0 (2, 3) (3, 1) 0", + "test tintstr p1 a 1 0 3 0 (11, 1) (13, 1) 3", + "test tintstr p1 a 1 1 3 0 (13, 2) (13, 2) 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tintstr' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "11") // g.ndv = p0.ndv + p1.ndv + c.Assert(rs[1][6].(string), Equals, "6") + c.Assert(rs[2][6].(string), Equals, "5") + + // index(int, double) + tk.MustExec("drop table if exists tintdouble") + tk.MustExec("create table tintdouble (a int, b double, key(a, b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec(`insert into tintdouble values ` + + `(1, 1), (1, 2), (2, 1), (2, 2), (2, 3), (2, 3), (3, 1), (3, 1), (3, 1),` + // values in p0 + `(11, 1), (12, 1), (12, 2), (13, 1), (13, 1), (13, 2), (13, 2), (13, 2)`) // values in p1 + tk.MustExec("analyze table tintdouble with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tintdouble'").Rows() + c.Assert(rs[0][5].(string), Equals, "17") // g.total = p0.total + p1.total + c.Assert(rs[1][5].(string), Equals, "9") + c.Assert(rs[2][5].(string), Equals, "8") + + tk.MustQuery("show stats_topn where table_name='tintdouble' and is_index=1").Check(testkit.Rows( + "test tintdouble global a 1 (3, 1) 3", + "test tintdouble global a 1 (13, 2) 3", + "test tintdouble p0 a 1 (2, 3) 2", + "test tintdouble p0 a 1 (3, 1) 3", + "test tintdouble p1 a 1 (13, 1) 2", + "test tintdouble p1 a 1 (13, 2) 3")) + + tk.MustQuery("show stats_buckets where table_name='tintdouble' and is_index=1").Check(testkit.Rows( + "test tintdouble global a 1 0 6 0 (1, 1) (3, 1) 5", // (2, 3) is popped into it + "test tintdouble global a 1 1 11 0 (3, 1) (13, 2) 4", // (13, 1) is popped into it + "test tintdouble p0 a 1 0 4 1 (1, 1) (2, 2) 4", + "test tintdouble p0 a 1 1 4 0 (2, 3) (3, 1) 0", + "test tintdouble p1 a 1 0 3 0 (11, 1) (13, 1) 3", + "test tintdouble p1 a 1 1 3 0 (13, 2) (13, 2) 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tintdouble' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "11") // g.ndv = p0.ndv + p1.ndv + c.Assert(rs[1][6].(string), Equals, "6") + c.Assert(rs[2][6].(string), Equals, "5") + + // index(double, decimal) + tk.MustExec("drop table if exists tdoubledecimal") + tk.MustExec("create table tdoubledecimal (a int, b decimal(30, 2), key(a, b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec(`insert into tdoubledecimal values ` + + `(1, 1), (1, 2), (2, 1), (2, 2), (2, 3), (2, 3), (3, 1), (3, 1), (3, 1),` + // values in p0 + `(11, 1), (12, 1), (12, 2), (13, 1), (13, 1), (13, 2), (13, 2), (13, 2)`) // values in p1 + tk.MustExec("analyze table tdoubledecimal with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tdoubledecimal'").Rows() + c.Assert(rs[0][5].(string), Equals, "17") // g.total = p0.total + p1.total + c.Assert(rs[1][5].(string), Equals, "9") + c.Assert(rs[2][5].(string), Equals, "8") + + tk.MustQuery("show stats_topn where table_name='tdoubledecimal' and is_index=1").Check(testkit.Rows( + "test tdoubledecimal global a 1 (3, 1.00) 3", + "test tdoubledecimal global a 1 (13, 2.00) 3", + "test tdoubledecimal p0 a 1 (2, 3.00) 2", + "test tdoubledecimal p0 a 1 (3, 1.00) 3", + "test tdoubledecimal p1 a 1 (13, 1.00) 2", + "test tdoubledecimal p1 a 1 (13, 2.00) 3")) + + tk.MustQuery("show stats_buckets where table_name='tdoubledecimal' and is_index=1").Check(testkit.Rows( + "test tdoubledecimal global a 1 0 6 0 (1, 1.00) (3, 1.00) 5", // (2, 3) is popped into it + "test tdoubledecimal global a 1 1 11 0 (3, 1.00) (13, 2.00) 4", // (13, 1) is popped into it + "test tdoubledecimal p0 a 1 0 4 1 (1, 1.00) (2, 2.00) 4", + "test tdoubledecimal p0 a 1 1 4 0 (2, 3.00) (3, 1.00) 0", + "test tdoubledecimal p1 a 1 0 3 0 (11, 1.00) (13, 1.00) 3", + "test tdoubledecimal p1 a 1 1 3 0 (13, 2.00) (13, 2.00) 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tdoubledecimal' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "11") // g.ndv = p0.ndv + p1.ndv + c.Assert(rs[1][6].(string), Equals, "6") + c.Assert(rs[2][6].(string), Equals, "5") + + // index(string, datetime) + tk.MustExec("drop table if exists tstrdt") + tk.MustExec("create table tstrdt (a int, b datetime, key(a, b)) partition by range (a) (partition p0 values less than (10), partition p1 values less than (20))") + tk.MustExec(`insert into tstrdt values ` + + `(1, '2000-01-01'), (1, '2000-01-02'), (2, '2000-01-01'), (2, '2000-01-02'), (2, '2000-01-03'), (2, '2000-01-03'), (3, '2000-01-01'), (3, '2000-01-01'), (3, '2000-01-01'),` + // values in p0 + `(11, '2000-01-01'), (12, '2000-01-01'), (12, '2000-01-02'), (13, '2000-01-01'), (13, '2000-01-01'), (13, '2000-01-02'), (13, '2000-01-02'), (13, '2000-01-02')`) // values in p1 + tk.MustExec("analyze table tstrdt with 2 topn, 2 buckets") + + rs = tk.MustQuery("show stats_meta where table_name='tstrdt'").Rows() + c.Assert(rs[0][5].(string), Equals, "17") // g.total = p0.total + p1.total + c.Assert(rs[1][5].(string), Equals, "9") + c.Assert(rs[2][5].(string), Equals, "8") + + tk.MustQuery("show stats_topn where table_name='tstrdt' and is_index=1").Check(testkit.Rows( + "test tstrdt global a 1 (3, 2000-01-01 00:00:00) 3", + "test tstrdt global a 1 (13, 2000-01-02 00:00:00) 3", + "test tstrdt p0 a 1 (2, 2000-01-03 00:00:00) 2", + "test tstrdt p0 a 1 (3, 2000-01-01 00:00:00) 3", + "test tstrdt p1 a 1 (13, 2000-01-01 00:00:00) 2", + "test tstrdt p1 a 1 (13, 2000-01-02 00:00:00) 3")) + + tk.MustQuery("show stats_buckets where table_name='tstrdt' and is_index=1").Check(testkit.Rows( + "test tstrdt global a 1 0 6 0 (1, 2000-01-01 00:00:00) (3, 2000-01-01 00:00:00) 5", // (2, 3) is popped into it + "test tstrdt global a 1 1 11 0 (3, 2000-01-01 00:00:00) (13, 2000-01-02 00:00:00) 4", // (13, 1) is popped into it + "test tstrdt p0 a 1 0 4 1 (1, 2000-01-01 00:00:00) (2, 2000-01-02 00:00:00) 4", + "test tstrdt p0 a 1 1 4 0 (2, 2000-01-03 00:00:00) (3, 2000-01-01 00:00:00) 0", + "test tstrdt p1 a 1 0 3 0 (11, 2000-01-01 00:00:00) (13, 2000-01-01 00:00:00) 3", + "test tstrdt p1 a 1 1 3 0 (13, 2000-01-02 00:00:00) (13, 2000-01-02 00:00:00) 0")) + + rs = tk.MustQuery("show stats_histograms where table_name='tstrdt' and is_index=1").Rows() + c.Assert(rs[0][6].(string), Equals, "11") // g.ndv = p0.ndv + p1.ndv + c.Assert(rs[1][6].(string), Equals, "6") + c.Assert(rs[2][6].(string), Equals, "5") +} + +func (s *testStatsSuite) TestGlobalStatsVersion(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec(` +create table t ( + a int +) +partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20) +)`) + tk.MustExec("insert into t values (1), (5), (null), (11), (15)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + + tk.MustExec("set @@tidb_partition_prune_mode='static'") + tk.MustExec("set @@session.tidb_analyze_version=1") + tk.MustExec("analyze table t") // both p0 and p1 are in ver1 + c.Assert(len(tk.MustQuery("show stats_meta").Rows()), Equals, 2) + + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("set @@session.tidb_analyze_version=1") + err := tk.ExecToErr("analyze table t") // try to build global-stats on ver1 + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[stats]: some partition level statistics are not in statistics version 2, please set tidb_analyze_version to 2 and analyze the this table") + + tk.MustExec("set @@tidb_partition_prune_mode='dynamic'") + tk.MustExec("set @@session.tidb_analyze_version=2") + err = tk.ExecToErr("analyze table t partition p1") // only analyze p1 to let it in ver2 while p0 is in ver1 + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[stats]: some partition level statistics are not in statistics version 2, please set tidb_analyze_version to 2 and analyze the this table") + + tk.MustExec("analyze table t") // both p0 and p1 are in ver2 + c.Assert(len(tk.MustQuery("show stats_meta").Rows()), Equals, 3) + + // If we already have global-stats, we can get the latest global-stats by analyzing the newly added partition. + tk.MustExec("alter table t add partition (partition p2 values less than (30))") + tk.MustExec("insert t values (13), (14), (22), (23)") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + tk.MustExec("analyze table t partition p2") // it will success since p0 and p1 are both in ver2 + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + do := s.do + is := do.InfoSchema() + h := do.StatsHandle() + c.Assert(h.Update(is), IsNil) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + globalStats := h.GetTableStats(tableInfo) + // global.count = p0.count(3) + p1.count(2) + p2.count(2) + // We did not analyze partition p1, so the value here has not changed + c.Assert(globalStats.Count, Equals, int64(7)) + + tk.MustExec("analyze table t partition p1;") + globalStats = h.GetTableStats(tableInfo) + // global.count = p0.count(3) + p1.count(4) + p2.count(4) + // The value of p1.Count is correct now. + c.Assert(globalStats.Count, Equals, int64(9)) + c.Assert(globalStats.ModifyCount, Equals, int64(0)) + + tk.MustExec("alter table t drop partition p2;") + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + globalStats = h.GetTableStats(tableInfo) + // The value of global.count will be updated the next time analyze. + c.Assert(globalStats.Count, Equals, int64(9)) + c.Assert(globalStats.ModifyCount, Equals, int64(0)) + + tk.MustExec("analyze table t;") + globalStats = h.GetTableStats(tableInfo) + // global.count = p0.count(3) + p1.count(4) + // The value of global.Count is correct now. + c.Assert(globalStats.Count, Equals, int64(7)) +} + +func (s *testStatsSuite) TestExtendedStatsDefaultSwitch(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int primary key, b int, c int, d int)") + err := tk.ExecToErr("alter table t add stats_extended s1 correlation(b,c)") + c.Assert(err.Error(), Equals, "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + err = tk.ExecToErr("alter table t drop stats_extended s1") + c.Assert(err.Error(), Equals, "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") + err = tk.ExecToErr("admin reload stats_extended") + c.Assert(err.Error(), Equals, "Extended statistics feature is not generally available now, and tidb_enable_extended_stats is OFF") +} + func (s *testStatsSuite) TestExtendedStatsOps(c *C) { defer cleanEnv(c, s.store, s.do) tk := testkit.NewTestKit(c, s.store) - err := tk.ExecToErr("drop statistics s1") - c.Assert(err.Error(), Equals, "[planner:1046]No database selected") + tk.MustExec("set session tidb_enable_extended_stats = on") tk.MustExec("use test") tk.MustExec("create table t(a int primary key, b int, c int, d int)") tk.MustExec("insert into t values(1,1,5,1),(2,2,4,2),(3,3,3,3),(4,4,2,4),(5,5,1,5)") tk.MustExec("analyze table t") - err = tk.ExecToErr("create statistics s1(correlation) on not_exist_db.t(b,c)") + err := tk.ExecToErr("alter table not_exist_db.t add stats_extended s1 correlation(b,c)") c.Assert(err.Error(), Equals, "[schema:1146]Table 'not_exist_db.t' doesn't exist") - err = tk.ExecToErr("create statistics s1(correlation) on not_exist_tbl(b,c)") + err = tk.ExecToErr("alter table not_exist_tbl add stats_extended s1 correlation(b,c)") c.Assert(err.Error(), Equals, "[schema:1146]Table 'test.not_exist_tbl' doesn't exist") - err = tk.ExecToErr("create statistics s1(correlation) on t(b,e)") - c.Assert(err.Error(), Equals, "[ddl:1072]column does not exist: e") - tk.MustExec("create statistics s1(correlation) on t(a,b)") + err = tk.ExecToErr("alter table t add stats_extended s1 correlation(b,e)") + c.Assert(err.Error(), Equals, "[schema:1054]Unknown column 'e' in 't'") + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") tk.MustQuery("show warnings").Check(testkit.Rows( "Warning 1105 No need to create correlation statistics on the integer primary key column", )) - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended where stats_name = 's1' and db = 'test'").Check(testkit.Rows()) - err = tk.ExecToErr("create statistics s1(correlation) on t(b,c,d)") - c.Assert(err.Error(), Equals, "[planner:1815]Only support Correlation and Dependency statistics types on 2 columns") - - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended where stats_name = 's1' and db = 'test'").Check(testkit.Rows()) - tk.MustExec("create statistics s1(correlation) on t(b,c)") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended where stats_name = 's1' and db = 'test'").Check(testkit.Rows( - "2 [2,3] 0", + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows()) + err = tk.ExecToErr("alter table t add stats_extended s1 correlation(b,c,d)") + c.Assert(err.Error(), Equals, "Only support Correlation and Dependency statistics types on 2 columns") + + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows()) + tk.MustExec("alter table t add stats_extended s1 correlation(b,c)") + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + "2 [2,3] 0", )) do := s.do is := do.InfoSchema() @@ -677,7 +1613,7 @@ func (s *testStatsSuite) TestExtendedStatsOps(c *C) { c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 0) - tk.MustExec("update mysql.stats_extended set status = 1 where stats_name = 's1' and db = 'test'") + tk.MustExec("update mysql.stats_extended set status = 1 where name = 's1'") do.StatsHandle().Clear() do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) @@ -685,9 +1621,9 @@ func (s *testStatsSuite) TestExtendedStatsOps(c *C) { c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 1) - tk.MustExec("drop statistics s1") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended where stats_name = 's1' and db = 'test'").Check(testkit.Rows( - "2 [2,3] 2", + tk.MustExec("alter table t drop stats_extended s1") + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + "2 [2,3] 2", )) do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) @@ -698,13 +1634,14 @@ func (s *testStatsSuite) TestExtendedStatsOps(c *C) { func (s *testStatsSuite) TestAdminReloadStatistics(c *C) { defer cleanEnv(c, s.store, s.do) tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set session tidb_enable_extended_stats = on") tk.MustExec("use test") tk.MustExec("create table t(a int primary key, b int, c int, d int)") tk.MustExec("insert into t values(1,1,5,1),(2,2,4,2),(3,3,3,3),(4,4,2,4),(5,5,1,5)") tk.MustExec("analyze table t") - tk.MustExec("create statistics s1(correlation) on t(b,c)") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended where stats_name = 's1' and db = 'test'").Check(testkit.Rows( - "2 [2,3] 0", + tk.MustExec("alter table t add stats_extended s1 correlation(b,c)") + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended where name = 's1'").Check(testkit.Rows( + "2 [2,3] 0", )) do := s.do is := do.InfoSchema() @@ -717,7 +1654,7 @@ func (s *testStatsSuite) TestAdminReloadStatistics(c *C) { c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 0) - tk.MustExec("update mysql.stats_extended set status = 1 where stats_name = 's1' and db = 'test'") + tk.MustExec("update mysql.stats_extended set status = 1 where name = 's1'") do.StatsHandle().Clear() do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) @@ -725,13 +1662,13 @@ func (s *testStatsSuite) TestAdminReloadStatistics(c *C) { c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 1) - tk.MustExec("delete from mysql.stats_extended where stats_name = 's1' and db = 'test'") + tk.MustExec("delete from mysql.stats_extended where name = 's1'") do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 1) - tk.MustExec("admin reload statistics") + tk.MustExec("admin reload stats_extended") statsTbl = do.StatsHandle().GetTableStats(tableInfo) c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 0) @@ -740,16 +1677,17 @@ func (s *testStatsSuite) TestAdminReloadStatistics(c *C) { func (s *testStatsSuite) TestCorrelationStatsCompute(c *C) { defer cleanEnv(c, s.store, s.do) tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set session tidb_enable_extended_stats = on") tk.MustExec("use test") tk.MustExec("create table t(a int, b int, c int)") tk.MustExec("insert into t values(1,1,5),(2,2,4),(3,3,3),(4,4,2),(5,5,1)") tk.MustExec("analyze table t") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Check(testkit.Rows()) - tk.MustExec("create statistics s1(correlation) on t(a,b)") - tk.MustExec("create statistics s2(correlation) on t(a,c)") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( - "2 [1,2] 0", - "2 [1,3] 0", + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended").Check(testkit.Rows()) + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") + tk.MustExec("alter table t add stats_extended s2 correlation(a,c)") + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "2 [1,2] 0", + "2 [1,3] 0", )) do := s.do is := do.InfoSchema() @@ -763,9 +1701,9 @@ func (s *testStatsSuite) TestCorrelationStatsCompute(c *C) { c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 0) tk.MustExec("analyze table t") - tk.MustQuery("select type, column_ids, scalar_stats, blob_stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( - "2 [1,2] 1 1", - "2 [1,3] -1 1", + tk.MustQuery("select type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows( + "2 [1,2] 1.000000 1", + "2 [1,3] -1.000000 1", )) do.StatsHandle().Update(is) statsTbl = do.StatsHandle().GetTableStats(tableInfo) @@ -773,9 +1711,8 @@ func (s *testStatsSuite) TestCorrelationStatsCompute(c *C) { c.Assert(statsTbl.ExtendedStats, NotNil) c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 2) foundS1, foundS2 := false, false - for key, item := range statsTbl.ExtendedStats.Stats { - c.Assert(key.DB, Equals, "test") - switch key.StatsName { + for name, item := range statsTbl.ExtendedStats.Stats { + switch name { case "s1": foundS1 = true c.Assert(item.ScalarVals, Equals, float64(1)) @@ -788,3 +1725,357 @@ func (s *testStatsSuite) TestCorrelationStatsCompute(c *C) { } c.Assert(foundS1 && foundS2, IsTrue) } + +func (s *testStatsSuite) TestSyncStatsExtendedRemoval(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set session tidb_enable_extended_stats = on") + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int)") + tk.MustExec("insert into t values(1,1),(2,2),(3,3)") + tk.MustExec("alter table t add stats_extended s1 correlation(a,b)") + tk.MustExec("analyze table t") + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + statsTbl := do.StatsHandle().GetTableStats(tableInfo) + c.Assert(statsTbl, NotNil) + c.Assert(statsTbl.ExtendedStats, NotNil) + c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 1) + item := statsTbl.ExtendedStats.Stats["s1"] + c.Assert(item, NotNil) + result := tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") + c.Assert(len(result.Rows()), Equals, 1) + + tk.MustExec("alter table t drop stats_extended s1") + statsTbl = do.StatsHandle().GetTableStats(tableInfo) + c.Assert(statsTbl, NotNil) + c.Assert(statsTbl.ExtendedStats, NotNil) + c.Assert(len(statsTbl.ExtendedStats.Stats), Equals, 0) + result = tk.MustQuery("show stats_extended where db_name = 'test' and table_name = 't'") + c.Assert(len(result.Rows()), Equals, 0) +} + +func (s *testStatsSuite) TestStaticPartitionPruneMode(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Static) + "'") + tk.MustExec("use test") + tk.MustExec(`create table t (a int, key(a)) partition by range(a) + (partition p0 values less than (10), + partition p1 values less than (22))`) + tk.MustExec(`insert into t values (1), (2), (3), (10), (11)`) + tk.MustExec(`analyze table t`) + c.Assert(tk.MustNoGlobalStats("t"), IsTrue) + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Dynamic) + "'") + c.Assert(tk.MustNoGlobalStats("t"), IsTrue) + + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Static) + "'") + tk.MustExec(`insert into t values (4), (5), (6)`) + tk.MustExec(`analyze table t partition p0`) + c.Assert(tk.MustNoGlobalStats("t"), IsTrue) + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Dynamic) + "'") + c.Assert(tk.MustNoGlobalStats("t"), IsTrue) + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Static) + "'") +} + +func (s *testStatsSuite) TestMergeIdxHist(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Dynamic) + "'") + defer tk.MustExec("set @@tidb_partition_prune_mode='" + string(variable.Static) + "'") + tk.MustExec("use test") + tk.MustExec(` + create table t (a int, key(a)) + partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20))`) + tk.MustExec("set @@tidb_analyze_version=2") + defer tk.MustExec("set @@tidb_analyze_version=1") + tk.MustExec("insert into t values (1), (2), (3), (4), (5), (6), (6), (null), (11), (12), (13), (14), (15), (16), (17), (18), (19), (19)") + + tk.MustExec("analyze table t with 2 topn, 2 buckets") + rows := tk.MustQuery("show stats_buckets where partition_name like 'global'") + c.Assert(len(rows.Rows()), Equals, 4) +} + +func (s *testStatsSuite) TestAnalyzeWithDynamicPartitionPruneMode(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Dynamic) + "'") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec(`create table t (a int, key(a)) partition by range(a) + (partition p0 values less than (10), + partition p1 values less than (22))`) + tk.MustExec(`insert into t values (1), (2), (3), (10), (11)`) + tk.MustExec(`analyze table t with 1 topn, 2 buckets`) + rows := tk.MustQuery("show stats_buckets where partition_name = 'global' and is_index=1").Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[1][6], Equals, "4") + tk.MustExec("insert into t values (1), (2), (2)") + tk.MustExec("analyze table t partition p0 with 1 topn, 2 buckets") + rows = tk.MustQuery("show stats_buckets where partition_name = 'global' and is_index=1").Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[1][6], Equals, "5") + tk.MustExec("insert into t values (3)") + tk.MustExec("analyze table t partition p0 index a with 1 topn, 2 buckets") + rows = tk.MustQuery("show stats_buckets where partition_name = 'global' and is_index=1").Rows() + c.Assert(len(rows), Equals, 2) + c.Assert(rows[1][6], Equals, "6") +} + +func (s *testStatsSuite) TestPartitionPruneModeSessionVariable(c *C) { + defer cleanEnv(c, s.store, s.do) + tk1 := testkit.NewTestKit(c, s.store) + tk1.MustExec("use test") + tk1.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Dynamic) + "'") + tk1.MustExec(`set @@tidb_analyze_version=2`) + + tk2 := testkit.NewTestKit(c, s.store) + tk2.MustExec("use test") + tk2.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Static) + "'") + tk2.MustExec(`set @@tidb_analyze_version=2`) + + tk1.MustExec(`create table t (a int, key(a)) partition by range(a) + (partition p0 values less than (10), + partition p1 values less than (22))`) + + tk1.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "TableReader 10000.00 root partition:all data:TableFullScan", + "└─TableFullScan 10000.00 cop[tikv] table:t keep order:false, stats:pseudo", + )) + tk2.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "PartitionUnion 20000.00 root ", + "├─TableReader 10000.00 root data:TableFullScan", + "│ └─TableFullScan 10000.00 cop[tikv] table:t, partition:p0 keep order:false, stats:pseudo", + "└─TableReader 10000.00 root data:TableFullScan", + " └─TableFullScan 10000.00 cop[tikv] table:t, partition:p1 keep order:false, stats:pseudo", + )) + + tk1.MustExec(`insert into t values (1), (2), (3), (10), (11)`) + tk1.MustExec(`analyze table t with 1 topn, 2 buckets`) + tk1.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "TableReader 5.00 root partition:all data:TableFullScan", + "└─TableFullScan 5.00 cop[tikv] table:t keep order:false", + )) + tk2.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "PartitionUnion 5.00 root ", + "├─TableReader 3.00 root data:TableFullScan", + "│ └─TableFullScan 3.00 cop[tikv] table:t, partition:p0 keep order:false", + "└─TableReader 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tikv] table:t, partition:p1 keep order:false", + )) + + tk1.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Static) + "'") + tk1.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "PartitionUnion 5.00 root ", + "├─TableReader 3.00 root data:TableFullScan", + "│ └─TableFullScan 3.00 cop[tikv] table:t, partition:p0 keep order:false", + "└─TableReader 2.00 root data:TableFullScan", + " └─TableFullScan 2.00 cop[tikv] table:t, partition:p1 keep order:false", + )) + tk2.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Dynamic) + "'") + tk2.MustQuery("explain format = 'brief' select * from t").Check(testkit.Rows( + "TableReader 5.00 root partition:all data:TableFullScan", + "└─TableFullScan 5.00 cop[tikv] table:t keep order:false", + )) +} + +func (s *testStatsSuite) TestFMSWithAnalyzePartition(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set @@tidb_partition_prune_mode = '" + string(variable.Dynamic) + "'") + tk.MustExec("set @@tidb_analyze_version = 2") + tk.MustExec(`create table t (a int, key(a)) partition by range(a) + (partition p0 values less than (10), + partition p1 values less than (22))`) + tk.MustExec(`insert into t values (1), (2), (3), (10), (11)`) + tk.MustQuery("select count(*) from mysql.stats_fm_sketch").Check(testkit.Rows("0")) + tk.MustExec("analyze table t partition p0 with 1 topn, 2 buckets") + tk.MustQuery("show warnings").Sort().Check(testkit.Rows( + "Warning 8131 Build table: `t` global-level stats failed due to missing partition-level stats", + "Warning 8131 Build table: `t` index: `a` global-level stats failed due to missing partition-level stats", + )) + tk.MustQuery("select count(*) from mysql.stats_fm_sketch").Check(testkit.Rows("1")) +} + +var _ = SerialSuites(&statsSerialSuite{}) + +type statsSerialSuite struct { + testSuiteBase +} + +func (s *statsSerialSuite) TestIndexUsageInformation(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t_idx(a int, b int)") + tk.MustExec("create unique index idx_a on t_idx(a)") + tk.MustExec("create unique index idx_b on t_idx(b)") + tk.MustQuery("select a from t_idx where a=1") + querySQL := `select idx.table_schema, idx.table_name, idx.key_name, stats.query_count, stats.rows_selected + from mysql.schema_index_usage as stats, information_schema.tidb_indexes as idx, information_schema.tables as tables + where tables.table_schema = idx.table_schema + AND tables.table_name = idx.table_name + AND tables.tidb_table_id = stats.table_id + AND idx.index_id = stats.index_id + AND idx.table_name = "t_idx"` + do := s.do + err := do.StatsHandle().DumpIndexUsageToKV() + c.Assert(err, IsNil) + tk.MustQuery(querySQL).Check(testkit.Rows( + "test t_idx idx_a 1 0", + )) + tk.MustExec("insert into t_idx values(1, 0)") + tk.MustQuery("select a from t_idx where a=1") + tk.MustQuery("select a from t_idx where a=1") + err = do.StatsHandle().DumpIndexUsageToKV() + c.Assert(err, IsNil) + tk.MustQuery(querySQL).Check(testkit.Rows( + "test t_idx idx_a 3 2", + )) + tk.MustQuery("select b from t_idx where b=0") + tk.MustQuery("select b from t_idx where b=0") + err = do.StatsHandle().DumpIndexUsageToKV() + c.Assert(err, IsNil) + tk.MustQuery(querySQL).Check(testkit.Rows( + "test t_idx idx_a 3 2", + "test t_idx idx_b 2 2", + )) +} + +func (s *statsSerialSuite) TestGCIndexUsageInformation(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t_idx(a int, b int)") + tk.MustExec("create unique index idx_a on t_idx(a)") + tk.MustQuery("select a from t_idx where a=1") + do := s.do + err := do.StatsHandle().DumpIndexUsageToKV() + c.Assert(err, IsNil) + querySQL := `select count(distinct idx.table_schema, idx.table_name, idx.key_name, stats.query_count, stats.rows_selected) + from mysql.schema_index_usage as stats, information_schema.tidb_indexes as idx, information_schema.tables as tables + where tables.table_schema = idx.table_schema + AND tables.table_name = idx.table_name + AND tables.tidb_table_id = stats.table_id + AND idx.index_id = stats.index_id + AND idx.table_name = "t_idx"` + tk.MustQuery(querySQL).Check(testkit.Rows("1")) + tk.MustExec("drop index `idx_a` on t_idx") + err = do.StatsHandle().GCIndexUsage() + c.Assert(err, IsNil) + tk.MustQuery(querySQL).Check(testkit.Rows("0")) +} + +func (s *statsSerialSuite) TestFeedbackWithGlobalStats(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("set @@tidb_analyze_version = 1") + + oriProbability := statistics.FeedbackProbability.Load() + oriNumber := statistics.MaxNumberOfRanges + oriMinLogCount := handle.MinLogScanCount + oriErrorRate := handle.MinLogErrorRate + defer func() { + statistics.FeedbackProbability.Store(oriProbability) + statistics.MaxNumberOfRanges = oriNumber + handle.MinLogScanCount = oriMinLogCount + handle.MinLogErrorRate = oriErrorRate + }() + // Case 1: You can't set tidb_analyze_version to 2 if feedback is enabled. + // Note: if we want to set @@tidb_partition_prune_mode = 'dynamic'. We must set tidb_analyze_version to 2 first. We have already tested this. + statistics.FeedbackProbability.Store(1) + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustQuery("show warnings").Check(testkit.Rows(`Error 1105 variable tidb_analyze_version not updated because analyze version 2 is incompatible with query feedback. Please consider setting feedback-probability to 0.0 in config file to disable query feedback`)) + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) + + h := s.do.StatsHandle() + var err error + // checkFeedbackOnPartitionTable is used to check whether the statistics are the same as before. + checkFeedbackOnPartitionTable := func(statsBefore *statistics.Table, tblInfo *model.TableInfo) { + h.UpdateStatsByLocalFeedback(s.do.InfoSchema()) + err = h.DumpStatsFeedbackToKV() + c.Assert(err, IsNil) + err = h.HandleUpdateStats(s.do.InfoSchema()) + c.Assert(err, IsNil) + statsTblAfter := h.GetTableStats(tblInfo) + // assert that statistics not changed + // the feedback can not work for the partition table in both static and dynamic mode + assertTableEqual(c, statsBefore, statsTblAfter) + } + + // Case 2: Feedback wouldn't be applied on version 2 and global-level statistics. + statistics.FeedbackProbability.Store(0) + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("2")) + testKit.MustExec("create table t (a bigint(64), b bigint(64), index idx(b)) PARTITION BY HASH(a) PARTITIONS 2;") + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t values (1,2),(2,2),(4,5),(2,3),(3,4)") + } + testKit.MustExec("analyze table t with 0 topn") + is := s.do.InfoSchema() + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblInfo := table.Meta() + testKit.MustExec("analyze table t") + err = h.Update(s.do.InfoSchema()) + c.Assert(err, IsNil) + statsTblBefore := h.GetTableStats(tblInfo) + statistics.FeedbackProbability.Store(1) + // make the statistics inaccurate. + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t values (3,4), (3,4), (3,4), (3,4), (3,4)") + } + // trigger feedback + testKit.MustExec("select b from t partition(p0) use index(idx) where t.b <= 3;") + testKit.MustExec("select b from t partition(p1) use index(idx) where t.b <= 3;") + testKit.MustExec("select b from t use index(idx) where t.b <= 3 order by b;") + testKit.MustExec("select b from t use index(idx) where t.b <= 3;") + checkFeedbackOnPartitionTable(statsTblBefore, tblInfo) + + // Case 3: Feedback is also not effective on version 1 and partition-level statistics. + testKit.MustExec("set tidb_analyze_version = 1") + testKit.MustExec("set @@tidb_partition_prune_mode = 'static';") + testKit.MustExec("create table t1 (a bigint(64), b bigint(64), index idx(b)) PARTITION BY HASH(a) PARTITIONS 2") + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t1 values (1,2),(2,2),(4,5),(2,3),(3,4)") + } + testKit.MustExec("analyze table t1 with 0 topn") + // make the statistics inaccurate. + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t1 values (3,4), (3,4), (3,4), (3,4), (3,4)") + } + is = s.do.InfoSchema() + table, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + tblInfo = table.Meta() + statsTblBefore = h.GetTableStats(tblInfo) + // trigger feedback + testKit.MustExec("select b from t1 partition(p0) use index(idx) where t1.b <= 3;") + testKit.MustExec("select b from t1 partition(p1) use index(idx) where t1.b <= 3;") + testKit.MustExec("select b from t1 use index(idx) where t1.b <= 3 order by b;") + testKit.MustExec("select b from t1 use index(idx) where t1.b <= 3;") + checkFeedbackOnPartitionTable(statsTblBefore, tblInfo) +} + +func (s *testStatsSuite) TestExtendedStatsPartitionTable(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set session tidb_enable_extended_stats = on") + tk.MustExec("use test") + tk.MustExec("drop table if exists t1, t2") + tk.MustExec("create table t1(a int, b int, c int) partition by range(a) (partition p0 values less than (5), partition p1 values less than (10))") + tk.MustExec("create table t2(a int, b int, c int) partition by hash(a) partitions 4") + err := tk.ExecToErr("alter table t1 add stats_extended s1 correlation(b,c)") + c.Assert(err.Error(), Equals, "Extended statistics on partitioned tables are not supported now") + err = tk.ExecToErr("alter table t2 add stats_extended s1 correlation(b,c)") + c.Assert(err.Error(), Equals, "Extended statistics on partitioned tables are not supported now") +} diff --git a/statistics/handle/update.go b/statistics/handle/update.go index 28f331761f9fa..8a2266888f44d 100644 --- a/statistics/handle/update.go +++ b/statistics/handle/update.go @@ -208,6 +208,127 @@ func (h *Handle) NewSessionStatsCollector() *SessionStatsCollector { return newCollector } +// IndexUsageInformation is the data struct to store index usage information. +type IndexUsageInformation struct { + QueryCount int64 + RowsSelected int64 + LastUsedAt string +} + +// GlobalIndexID is the key type for indexUsageMap. +type GlobalIndexID struct { + TableID int64 + IndexID int64 +} + +type indexUsageMap map[GlobalIndexID]IndexUsageInformation + +// SessionIndexUsageCollector is a list item that holds the index usage mapper. If you want to write or read mapper, you must lock it. +type SessionIndexUsageCollector struct { + sync.Mutex + + mapper indexUsageMap + next *SessionIndexUsageCollector + deleted bool +} + +func (m indexUsageMap) updateByKey(id GlobalIndexID, value *IndexUsageInformation) { + item := m[id] + item.QueryCount += value.QueryCount + item.RowsSelected += value.RowsSelected + if item.LastUsedAt < value.LastUsedAt { + item.LastUsedAt = value.LastUsedAt + } + m[id] = item +} + +func (m indexUsageMap) update(tableID int64, indexID int64, value *IndexUsageInformation) { + id := GlobalIndexID{TableID: tableID, IndexID: indexID} + m.updateByKey(id, value) +} + +func (m indexUsageMap) merge(destMap indexUsageMap) { + for id, item := range destMap { + m.updateByKey(id, &item) + } +} + +// Update updates the mapper in SessionIndexUsageCollector. +func (s *SessionIndexUsageCollector) Update(tableID int64, indexID int64, value *IndexUsageInformation) { + value.LastUsedAt = time.Now().Format(types.TimeFSPFormat) + s.Lock() + defer s.Unlock() + s.mapper.update(tableID, indexID, value) +} + +// Delete will set s.deleted to true which means it can be deleted from linked list. +func (s *SessionIndexUsageCollector) Delete() { + s.Lock() + defer s.Unlock() + s.deleted = true +} + +// NewSessionIndexUsageCollector will add a new SessionIndexUsageCollector into linked list headed by idxUsageListHead. +// idxUsageListHead always points to an empty SessionIndexUsageCollector as a sentinel node. So we let idxUsageListHead.next +// points to new item. It's helpful to sweepIdxUsageList. +func (h *Handle) NewSessionIndexUsageCollector() *SessionIndexUsageCollector { + h.idxUsageListHead.Lock() + defer h.idxUsageListHead.Unlock() + newCollector := &SessionIndexUsageCollector{ + mapper: make(indexUsageMap), + next: h.idxUsageListHead.next, + } + h.idxUsageListHead.next = newCollector + return newCollector +} + +// sweepIdxUsageList will loop over the list, merge each session's local index usage information into handle +// and remove closed session's collector. +// For convenience, we keep idxUsageListHead always points to sentinel node. So that we don't need to consider corner case. +func (h *Handle) sweepIdxUsageList() indexUsageMap { + prev := h.idxUsageListHead + prev.Lock() + mapper := make(indexUsageMap) + for curr := prev.next; curr != nil; curr = curr.next { + curr.Lock() + mapper.merge(curr.mapper) + if curr.deleted { + prev.next = curr.next + curr.Unlock() + } else { + prev.Unlock() + curr.mapper = make(indexUsageMap) + prev = curr + } + } + prev.Unlock() + return mapper +} + +// DumpIndexUsageToKV will dump in-memory index usage information to KV. +func (h *Handle) DumpIndexUsageToKV() error { + ctx := context.Background() + mapper := h.sweepIdxUsageList() + for id, value := range mapper { + const sql = `insert into mysql.SCHEMA_INDEX_USAGE values (%?, %?, %?, %?, %?) on duplicate key update query_count=query_count+%?, rows_selected=rows_selected+%?, last_used_at=greatest(last_used_at, %?)` + _, _, err := h.execRestrictedSQL(ctx, sql, id.TableID, id.IndexID, value.QueryCount, value.RowsSelected, value.LastUsedAt, value.QueryCount, value.RowsSelected, value.LastUsedAt) + if err != nil { + return err + } + } + return nil +} + +// GCIndexUsage will delete the usage information of those indexes that do not exist. +func (h *Handle) GCIndexUsage() error { + // For performance and implementation reasons, mysql.schema_index_usage doesn't handle DDL. + // We periodically delete the usage information of non-existent indexes through information_schema.tidb_indexes. + // This sql will delete the usage information of those indexes that not in information_schema.tidb_indexes. + sql := `delete from mysql.SCHEMA_INDEX_USAGE as stats where stats.index_id not in (select idx.index_id from information_schema.tidb_indexes as idx)` + _, _, err := h.execRestrictedSQL(context.Background(), sql) + return err +} + var ( // DumpStatsDeltaRatio is the lower bound of `Modify Count / Table Count` for stats delta to be dumped. DumpStatsDeltaRatio = 1 / 10000.0 @@ -331,7 +452,7 @@ func (h *Handle) dumpTableStatCountToKV(id int64, delta variable.TableDelta) (up defer h.mu.Unlock() ctx := context.TODO() exec := h.mu.ctx.(sqlexec.SQLExecutor) - _, err = exec.Execute(ctx, "begin") + _, err = exec.ExecuteInternal(ctx, "begin") if err != nil { return false, errors.Trace(err) } @@ -344,14 +465,33 @@ func (h *Handle) dumpTableStatCountToKV(id int64, delta variable.TableDelta) (up return false, errors.Trace(err) } startTS := txn.StartTS() - var sql string - if delta.Delta < 0 { - sql = fmt.Sprintf("update mysql.stats_meta set version = %d, count = count - %d, modify_count = modify_count + %d where table_id = %d and count >= %d", startTS, -delta.Delta, delta.Count, id, -delta.Delta) - } else { - sql = fmt.Sprintf("update mysql.stats_meta set version = %d, count = count + %d, modify_count = modify_count + %d where table_id = %d", startTS, delta.Delta, delta.Count, id) + updateStatsMeta := func(id int64) error { + var err error + if delta.Delta < 0 { + _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %?, count = count - %?, modify_count = modify_count + %? where table_id = %? and count >= %?", startTS, -delta.Delta, delta.Count, id, -delta.Delta) + } else { + _, err = exec.ExecuteInternal(ctx, "update mysql.stats_meta set version = %?, count = count + %?, modify_count = modify_count + %? where table_id = %?", startTS, delta.Delta, delta.Count, id) + } + return errors.Trace(err) + } + if err = updateStatsMeta(id); err != nil { + return + } + affectedRows := h.mu.ctx.GetSessionVars().StmtCtx.AffectedRows() + + // if it's a partitioned table and its global-stats exists, update its count and modify_count as well. + is := infoschema.GetInfoSchema(h.mu.ctx) + if is == nil { + return false, errors.New("cannot get the information schema") } - err = execSQLs(context.Background(), exec, []string{sql}) - updated = h.mu.ctx.GetSessionVars().StmtCtx.AffectedRows() > 0 + if tbl, _, _ := is.FindTableByPartitionID(id); tbl != nil { + if err = updateStatsMeta(tbl.Meta().ID); err != nil { + return + } + } + + affectedRows += h.mu.ctx.GetSessionVars().StmtCtx.AffectedRows() + updated = affectedRows > 0 return } @@ -371,7 +511,7 @@ func (h *Handle) dumpTableStatColSizeToKV(id int64, delta variable.TableDelta) e } sql := fmt.Sprintf("insert into mysql.stats_histograms (table_id, is_index, hist_id, distinct_count, tot_col_size) "+ "values %s on duplicate key update tot_col_size = tot_col_size + values(tot_col_size)", strings.Join(values, ",")) - _, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + _, _, err := h.execRestrictedSQL(context.Background(), sql) return errors.Trace(err) } @@ -384,8 +524,17 @@ func (h *Handle) DumpStatsFeedbackToKV() error { err = h.DumpFeedbackToKV(fb) } else { t, ok := h.statsCache.Load().(statsCache).tables[fb.PhysicalID] - if ok { + if !ok { + continue + } + idx, ok := t.Indices[fb.Hist.ID] + if !ok { + continue + } + if idx.StatsVer == statistics.Version1 { err = h.DumpFeedbackForIndex(fb, t) + } else { + err = h.DumpFeedbackToKV(fb) } } if err != nil { @@ -409,10 +558,9 @@ func (h *Handle) DumpFeedbackToKV(fb *statistics.QueryFeedback) error { if fb.Tp == statistics.IndexType { isIndex = 1 } - sql := fmt.Sprintf("insert into mysql.stats_feedback (table_id, hist_id, is_index, feedback) values "+ - "(%d, %d, %d, X'%X')", fb.PhysicalID, fb.Hist.ID, isIndex, vals) + const sql = "insert into mysql.stats_feedback (table_id, hist_id, is_index, feedback) values (%?, %?, %?, %?)" h.mu.Lock() - _, err = h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + _, err = h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql, fb.PhysicalID, fb.Hist.ID, isIndex, vals) h.mu.Unlock() if err != nil { metrics.DumpFeedbackCounter.WithLabelValues(metrics.LblError).Inc() @@ -428,6 +576,7 @@ func (h *Handle) DumpFeedbackToKV(fb *statistics.QueryFeedback) error { // feedback locally on this tidb-server, so it could be used more timely. func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { h.sweepList() +OUTER: for _, fbs := range h.feedback.Feedbacks { for _, fb := range fbs { h.mu.Lock() @@ -436,6 +585,10 @@ func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { if !ok { continue } + if table.Meta().Partition != nil { + // If the table is partition table, the feedback will not work. + continue + } tblStats := h.GetPartitionStats(table.Meta(), fb.PhysicalID) newTblStats := tblStats.Copy() if fb.Tp == statistics.IndexType { @@ -445,8 +598,13 @@ func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { } newIdx := *idx eqFB, ranFB := statistics.SplitFeedbackByQueryType(fb.Feedback) - newIdx.CMSketch = statistics.UpdateCMSketch(idx.CMSketch, eqFB) - newIdx.Histogram = *statistics.UpdateHistogram(&idx.Histogram, &statistics.QueryFeedback{Feedback: ranFB}) + if idx.StatsVer >= statistics.Version2 { + // // For StatsVersion higher than Version1, the topn is extracted out of histogram. So we don't update the histogram if the feedback overlaps with some topn. + // ranFB = statistics.CleanRangeFeedbackByTopN(ranFB, idx.TopN) + continue OUTER + } + newIdx.CMSketch, newIdx.TopN = statistics.UpdateCMSketchAndTopN(idx.CMSketch, idx.TopN, eqFB) + newIdx.Histogram = *statistics.UpdateHistogram(&idx.Histogram, &statistics.QueryFeedback{Feedback: ranFB}, int(idx.StatsVer)) newIdx.Histogram.PreCalculateScalar() newIdx.Flag = statistics.ResetAnalyzeFlag(newIdx.Flag) newTblStats.Indices[fb.Hist.ID] = &newIdx @@ -455,17 +613,26 @@ func (h *Handle) UpdateStatsByLocalFeedback(is infoschema.InfoSchema) { if !ok || col.Histogram.Len() == 0 { continue } + if col.StatsVer >= statistics.Version2 { + // // For StatsVersion higher than Version1, the topn is extracted out of histogram. So we don't update the histogram if the feedback overlaps with some topn. + // ranFB = statistics.CleanRangeFeedbackByTopN(ranFB, idx.TopN) + continue OUTER + } newCol := *col // only use the range query to update primary key _, ranFB := statistics.SplitFeedbackByQueryType(fb.Feedback) newFB := &statistics.QueryFeedback{Feedback: ranFB} newFB = newFB.DecodeIntValues() - newCol.Histogram = *statistics.UpdateHistogram(&col.Histogram, newFB) + newCol.Histogram = *statistics.UpdateHistogram(&col.Histogram, newFB, statistics.Version1) newCol.Flag = statistics.ResetAnalyzeFlag(newCol.Flag) newTblStats.Columns[fb.Hist.ID] = &newCol } - oldCache := h.statsCache.Load().(statsCache) - h.updateStatsCache(oldCache.update([]*statistics.Table{newTblStats}, nil, oldCache.version)) + for retry := updateStatsCacheRetryCnt; retry > 0; retry-- { + oldCache := h.statsCache.Load().(statsCache) + if h.updateStatsCache(oldCache.update([]*statistics.Table{newTblStats}, nil, oldCache.version)) { + break + } + } } } } @@ -497,14 +664,18 @@ func (h *Handle) UpdateErrorRate(is infoschema.InfoSchema) { delete(h.mu.rateMap, id) } h.mu.Unlock() - oldCache := h.statsCache.Load().(statsCache) - h.updateStatsCache(oldCache.update(tbls, nil, oldCache.version)) + for retry := updateStatsCacheRetryCnt; retry > 0; retry-- { + oldCache := h.statsCache.Load().(statsCache) + if h.updateStatsCache(oldCache.update(tbls, nil, oldCache.version)) { + break + } + } } // HandleUpdateStats update the stats using feedback. func (h *Handle) HandleUpdateStats(is infoschema.InfoSchema) error { - sql := "SELECT distinct table_id from mysql.stats_feedback" - tables, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + ctx := context.Background() + tables, _, err := h.execRestrictedSQL(ctx, "SELECT distinct table_id from mysql.stats_feedback") if err != nil { return errors.Trace(err) } @@ -516,20 +687,18 @@ func (h *Handle) HandleUpdateStats(is infoschema.InfoSchema) error { // this func lets `defer` works normally, where `Close()` should be called before any return err = func() error { tbl := ptbl.GetInt64(0) - sql = fmt.Sprintf("select table_id, hist_id, is_index, feedback from mysql.stats_feedback where table_id=%d order by hist_id, is_index", tbl) - rc, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) - if len(rc) > 0 { - defer terror.Call(rc[0].Close) - } + const sql = "select table_id, hist_id, is_index, feedback from mysql.stats_feedback where table_id=%? order by hist_id, is_index" + rc, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql, tbl) if err != nil { return errors.Trace(err) } + defer terror.Call(rc.Close) tableID, histID, isIndex := int64(-1), int64(-1), int64(-1) var rows []chunk.Row for { - req := rc[0].NewChunk() + req := rc.NewChunk() iter := chunk.NewIterator4Chunk(req) - err := rc[0].Next(context.TODO(), req) + err := rc.Next(context.TODO(), req) if err != nil { return errors.Trace(err) } @@ -581,25 +750,44 @@ func (h *Handle) handleSingleHistogramUpdate(is infoschema.InfoSchema, rows []ch return nil } var tbl *statistics.Table - if table.Meta().GetPartitionInfo() != nil { - tbl = h.GetPartitionStats(table.Meta(), physicalTableID) - } else { + if table.Meta().GetPartitionInfo() == nil || h.CurrentPruneMode() == variable.Dynamic { tbl = h.GetTableStats(table.Meta()) + } else { + tbl = h.GetPartitionStats(table.Meta(), physicalTableID) } var cms *statistics.CMSketch var hist *statistics.Histogram + var topN *statistics.TopN + var fms *statistics.FMSketch + var statsVer int64 = statistics.Version1 if isIndex == 1 { idx, ok := tbl.Indices[histID] + statsVer = idx.StatsVer + if statsVer >= 2 { + logutil.BgLogger().Warn("[stats] Feedback is discarded because statistics on this table is version 2, which is incompatible with feedback. "+ + "Please consider setting feedback-probability to 0.0 in config file to disable query feedback.", + zap.Int64("table_id", physicalTableID), zap.Int64("hist_id", histID), zap.Int64("is_index", isIndex)) + return err + } if ok && idx.Histogram.Len() > 0 { + statsVer = idx.StatsVer idxHist := idx.Histogram hist = &idxHist cms = idx.CMSketch.Copy() + topN = idx.TopN.Copy() } } else { col, ok := tbl.Columns[histID] + if ok && col.StatsVer >= 2 { + logutil.BgLogger().Warn("[stats] Feedback is discarded because statistics on this table is version 2, which is incompatible with feedback. "+ + "Please consider setting feedback-probability to 0.0 in config file to disable query feedback.", + zap.Int64("table_id", physicalTableID), zap.Int64("hist_id", histID), zap.Int64("is_index", isIndex)) + return err + } if ok && col.Histogram.Len() > 0 { colHist := col.Histogram hist = &colHist + fms = col.FMSketch } } // The column or index has been deleted. @@ -608,12 +796,12 @@ func (h *Handle) handleSingleHistogramUpdate(is infoschema.InfoSchema, rows []ch } q := &statistics.QueryFeedback{} for _, row := range rows { - err1 := statistics.DecodeFeedback(row.GetBytes(3), q, cms, hist.Tp) + err1 := statistics.DecodeFeedback(row.GetBytes(3), q, cms, topN, hist.Tp) if err1 != nil { - logutil.BgLogger().Debug("decode feedback failed", zap.Error(err)) + logutil.BgLogger().Debug("decode feedback failed", zap.Error(err1)) } } - err = h.dumpStatsUpdateToKV(physicalTableID, isIndex, q, hist, cms) + err = h.dumpStatsUpdateToKV(physicalTableID, isIndex, q, hist, cms, topN, fms, statsVer) return errors.Trace(err) } @@ -622,8 +810,8 @@ func (h *Handle) deleteOutdatedFeedback(tableID, histID, isIndex int64) error { defer h.mu.Unlock() hasData := true for hasData { - sql := fmt.Sprintf("delete from mysql.stats_feedback where table_id = %d and hist_id = %d and is_index = %d limit 10000", tableID, histID, isIndex) - _, err := h.mu.ctx.(sqlexec.SQLExecutor).Execute(context.TODO(), sql) + sql := "delete from mysql.stats_feedback where table_id = %? and hist_id = %? and is_index = %? limit 10000" + _, err := h.mu.ctx.(sqlexec.SQLExecutor).ExecuteInternal(context.TODO(), sql, tableID, histID, isIndex) if err != nil { return errors.Trace(err) } @@ -632,9 +820,9 @@ func (h *Handle) deleteOutdatedFeedback(tableID, histID, isIndex int64) error { return nil } -func (h *Handle) dumpStatsUpdateToKV(tableID, isIndex int64, q *statistics.QueryFeedback, hist *statistics.Histogram, cms *statistics.CMSketch) error { - hist = statistics.UpdateHistogram(hist, q) - err := h.SaveStatsToStorage(tableID, -1, int(isIndex), hist, cms, 0) +func (h *Handle) dumpStatsUpdateToKV(tableID, isIndex int64, q *statistics.QueryFeedback, hist *statistics.Histogram, cms *statistics.CMSketch, topN *statistics.TopN, fms *statistics.FMSketch, statsVersion int64) error { + hist = statistics.UpdateHistogram(hist, q, int(statsVersion)) + err := h.SaveStatsToStorage(tableID, -1, int(isIndex), hist, cms, topN, fms, int(statsVersion), 0) metrics.UpdateStatsCounter.WithLabelValues(metrics.RetLabel(err)).Inc() return errors.Trace(err) } @@ -671,6 +859,11 @@ func TableAnalyzed(tbl *statistics.Table) bool { // "tbl.ModifyCount/tbl.Count > autoAnalyzeRatio" and the current time is // between `start` and `end`. func NeedAnalyzeTable(tbl *statistics.Table, limit time.Duration, autoAnalyzeRatio float64, start, end, now time.Time) (bool, string) { + // Tests if current time is within the time period. + if !timeutil.WithinDayTimePeriod(start, end, now) { + return false, "" + } + analyzed := TableAnalyzed(tbl) if !analyzed { t := time.Unix(0, oracle.ExtractPhysical(tbl.Version)*int64(time.Millisecond)) @@ -685,14 +878,13 @@ func NeedAnalyzeTable(tbl *statistics.Table, limit time.Duration, autoAnalyzeRat if float64(tbl.ModifyCount)/float64(tbl.Count) <= autoAnalyzeRatio { return false, "" } - // Tests if current time is within the time period. - return timeutil.WithinDayTimePeriod(start, end, now), fmt.Sprintf("too many modifications(%v/%v>%v)", tbl.ModifyCount, tbl.Count, autoAnalyzeRatio) + return true, fmt.Sprintf("too many modifications(%v/%v>%v)", tbl.ModifyCount, tbl.Count, autoAnalyzeRatio) } func (h *Handle) getAutoAnalyzeParameters() map[string]string { - sql := fmt.Sprintf("select variable_name, variable_value from mysql.global_variables where variable_name in ('%s', '%s', '%s')", - variable.TiDBAutoAnalyzeRatio, variable.TiDBAutoAnalyzeStartTime, variable.TiDBAutoAnalyzeEndTime) - rows, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + ctx := context.Background() + sql := "select variable_name, variable_value from mysql.global_variables where variable_name in (%?, %?, %?)" + rows, _, err := h.execRestrictedSQL(ctx, sql, variable.TiDBAutoAnalyzeRatio, variable.TiDBAutoAnalyzeStartTime, variable.TiDBAutoAnalyzeEndTime) if err != nil { return map[string]string{} } @@ -727,69 +919,148 @@ func parseAnalyzePeriod(start, end string) (time.Time, time.Time, error) { } // HandleAutoAnalyze analyzes the newly created table or index. -func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) { +func (h *Handle) HandleAutoAnalyze(is infoschema.InfoSchema) (analyzed bool) { + err := h.UpdateSessionVar() + if err != nil { + logutil.BgLogger().Error("[stats] update analyze version for auto analyze session failed", zap.Error(err)) + return false + } dbs := is.AllSchemaNames() parameters := h.getAutoAnalyzeParameters() autoAnalyzeRatio := parseAutoAnalyzeRatio(parameters[variable.TiDBAutoAnalyzeRatio]) start, end, err := parseAnalyzePeriod(parameters[variable.TiDBAutoAnalyzeStartTime], parameters[variable.TiDBAutoAnalyzeEndTime]) if err != nil { logutil.BgLogger().Error("[stats] parse auto analyze period failed", zap.Error(err)) - return + return false } + pruneMode := h.CurrentPruneMode() for _, db := range dbs { tbls := is.SchemaTables(model.NewCIStr(db)) for _, tbl := range tbls { tblInfo := tbl.Meta() pi := tblInfo.GetPartitionInfo() - pruneMode := h.CurrentPruneMode() - if pi == nil || pruneMode == variable.DynamicOnly || pruneMode == variable.StaticButPrepareDynamic { + if pi == nil { statsTbl := h.GetTableStats(tblInfo) - sql := "analyze table `" + db + "`.`" + tblInfo.Name.O + "`" - analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql) + sql := "analyze table %n.%n" + analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql, db, tblInfo.Name.O) if analyzed { - return + // analyze one table at a time to let it get the freshest parameters. + // others will be analyzed next round which is just 3s later. + return true } continue } - if h.CurrentPruneMode() == variable.StaticOnly || pruneMode == variable.StaticButPrepareDynamic { - for _, def := range pi.Definitions { - sql := "analyze table `" + db + "`.`" + tblInfo.Name.O + "`" + " partition `" + def.Name.O + "`" - statsTbl := h.GetPartitionStats(tblInfo, def.ID) - analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql) - if analyzed { - return - } - continue + if pruneMode == variable.Dynamic { + analyzed := h.autoAnalyzePartitionTable(tblInfo, pi, db, start, end, autoAnalyzeRatio) + if analyzed { + return true } continue } + for _, def := range pi.Definitions { + sql := "analyze table %n.%n partition %n" + statsTbl := h.GetPartitionStats(tblInfo, def.ID) + analyzed := h.autoAnalyzeTable(tblInfo, statsTbl, start, end, autoAnalyzeRatio, sql, db, tblInfo.Name.O, def.Name.O) + if analyzed { + return true + } + } } } + return false } -func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics.Table, start, end time.Time, ratio float64, sql string) bool { +func (h *Handle) autoAnalyzeTable(tblInfo *model.TableInfo, statsTbl *statistics.Table, start, end time.Time, ratio float64, sql string, params ...interface{}) bool { if statsTbl.Pseudo || statsTbl.Count < AutoAnalyzeMinCnt { return false } if needAnalyze, reason := NeedAnalyzeTable(statsTbl, 20*h.Lease(), ratio, start, end, time.Now()); needAnalyze { logutil.BgLogger().Info("[stats] auto analyze triggered", zap.String("sql", sql), zap.String("reason", reason)) - h.execAutoAnalyze(sql) + tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion + statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) + h.execAutoAnalyze(tableStatsVer, sql, params...) return true } for _, idx := range tblInfo.Indices { if _, ok := statsTbl.Indices[idx.ID]; !ok && idx.State == model.StatePublic { - sql = fmt.Sprintf("%s index `%s`", sql, idx.Name.O) logutil.BgLogger().Info("[stats] auto analyze for unanalyzed", zap.String("sql", sql)) - h.execAutoAnalyze(sql) + tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion + statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) + h.execAutoAnalyze(tableStatsVer, sql+" index %n", append(params, idx.Name.O)...) + return true + } + } + return false +} + +func (h *Handle) autoAnalyzePartitionTable(tblInfo *model.TableInfo, pi *model.PartitionInfo, db string, start, end time.Time, ratio float64) bool { + tableStatsVer := h.mu.ctx.GetSessionVars().AnalyzeVersion + partitionNames := make([]interface{}, 0, len(pi.Definitions)) + for _, def := range pi.Definitions { + partitionStatsTbl := h.GetPartitionStats(tblInfo, def.ID) + if partitionStatsTbl.Pseudo || partitionStatsTbl.Count < AutoAnalyzeMinCnt { + continue + } + if needAnalyze, _ := NeedAnalyzeTable(partitionStatsTbl, 20*h.Lease(), ratio, start, end, time.Now()); needAnalyze { + partitionNames = append(partitionNames, def.Name.O) + statistics.CheckAnalyzeVerOnTable(partitionStatsTbl, &tableStatsVer) + } + } + getSQL := func(prefix, suffix string, numPartitions int) string { + var sqlBuilder strings.Builder + sqlBuilder.WriteString(prefix) + for i := 0; i < numPartitions; i++ { + if i != 0 { + sqlBuilder.WriteString(",") + } + sqlBuilder.WriteString(" %n") + } + sqlBuilder.WriteString(suffix) + return sqlBuilder.String() + } + if len(partitionNames) > 0 { + logutil.BgLogger().Info("[stats] auto analyze triggered") + sql := getSQL("analyze table %n.%n partition", "", len(partitionNames)) + params := append([]interface{}{db, tblInfo.Name.O}, partitionNames...) + statsTbl := h.GetTableStats(tblInfo) + statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) + h.execAutoAnalyze(tableStatsVer, sql, params...) + return true + } + for _, idx := range tblInfo.Indices { + if idx.State != model.StatePublic { + continue + } + for _, def := range pi.Definitions { + partitionStatsTbl := h.GetPartitionStats(tblInfo, def.ID) + if _, ok := partitionStatsTbl.Indices[idx.ID]; !ok { + partitionNames = append(partitionNames, def.Name.O) + statistics.CheckAnalyzeVerOnTable(partitionStatsTbl, &tableStatsVer) + } + } + if len(partitionNames) > 0 { + logutil.BgLogger().Info("[stats] auto analyze for unanalyzed") + sql := getSQL("analyze table %n.%n partition", " index %n", len(partitionNames)) + params := append([]interface{}{db, tblInfo.Name.O}, partitionNames...) + params = append(params, idx.Name.O) + statsTbl := h.GetTableStats(tblInfo) + statistics.CheckAnalyzeVerOnTable(statsTbl, &tableStatsVer) + h.execAutoAnalyze(tableStatsVer, sql, params...) return true } } return false } -func (h *Handle) execAutoAnalyze(sql string) { +var execOptionForAnalyze = map[int]sqlexec.OptionFuncAlias{ + statistics.Version0: sqlexec.ExecOptionAnalyzeVer1, + statistics.Version1: sqlexec.ExecOptionAnalyzeVer1, + statistics.Version2: sqlexec.ExecOptionAnalyzeVer2, +} + +func (h *Handle) execAutoAnalyze(statsVer int, sql string, params ...interface{}) { startTime := time.Now() - _, _, err := h.restrictedExec.ExecRestrictedSQL(sql) + _, _, err := h.execRestrictedSQLWithStatsVer(context.Background(), statsVer, sql, params...) dur := time.Since(startTime) metrics.AutoAnalyzeHistogram.Observe(dur.Seconds()) if err != nil { @@ -867,7 +1138,7 @@ func logForIndex(prefix string, t *statistics.Table, idx *statistics.Index, rang if err != nil { continue } - equalityCount := idx.CMSketch.QueryBytes(bytes) + equalityCount := idx.QueryBytes(bytes) rang := ranger.Range{ LowVal: []types.Datum{ran.LowVal[rangePosition]}, HighVal: []types.Datum{ran.HighVal[rangePosition]}, @@ -965,7 +1236,7 @@ func (h *Handle) RecalculateExpectCount(q *statistics.QueryFeedback) error { expected := 0.0 if isIndex { idx := t.Indices[id] - expected, err = idx.GetRowCount(sc, ranges, t.ModifyCount) + expected, err = idx.GetRowCount(sc, nil, ranges, t.ModifyCount) expected *= idx.GetIncreaseFactor(t.Count) } else { c := t.Columns[id] @@ -1048,7 +1319,7 @@ func (h *Handle) DumpFeedbackForIndex(q *statistics.QueryFeedback, t *statistics return nil } sc := &stmtctx.StatementContext{TimeZone: time.UTC} - if idx.CMSketch == nil || idx.StatsVer != statistics.Version1 { + if idx.CMSketch == nil || idx.StatsVer < statistics.Version1 { return h.DumpFeedbackToKV(q) } ranges, err := q.DecodeToRanges(true) @@ -1068,7 +1339,7 @@ func (h *Handle) DumpFeedbackForIndex(q *statistics.QueryFeedback, t *statistics logutil.BgLogger().Debug("encode keys fail", zap.Error(err)) continue } - equalityCount := float64(idx.CMSketch.QueryBytes(bytes)) * idx.GetIncreaseFactor(t.Count) + equalityCount := float64(idx.QueryBytes(bytes)) * idx.GetIncreaseFactor(t.Count) rang := &ranger.Range{ LowVal: []types.Datum{ran.LowVal[rangePosition]}, HighVal: []types.Datum{ran.HighVal[rangePosition]}, diff --git a/statistics/handle/update_test.go b/statistics/handle/update_test.go index 25c9b933c7854..9c8c7ea39d600 100644 --- a/statistics/handle/update_test.go +++ b/statistics/handle/update_test.go @@ -16,7 +16,9 @@ package handle_test import ( "fmt" "math" + "math/rand" "os" + "strconv" "strings" "time" @@ -26,6 +28,7 @@ import ( "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" @@ -36,19 +39,44 @@ import ( "github.com/pingcap/tidb/util/ranger" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" + dto "github.com/prometheus/client_model/go" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var _ = Suite(&testStatsSuite{}) +var _ = SerialSuites(&testSerialStatsSuite{}) -type testStatsSuite struct { +type testSerialStatsSuite struct { + store kv.Storage + do *domain.Domain +} + +func (s *testSerialStatsSuite) SetUpSuite(c *C) { + testleak.BeforeTest() + // Add the hook here to avoid data race. + var err error + s.store, s.do, err = newStoreWithBootstrap() + c.Assert(err, IsNil) +} + +func (s *testSerialStatsSuite) TearDownSuite(c *C) { + s.do.Close() + s.store.Close() + testleak.AfterTest(c)() +} + +type testSuiteBase struct { store kv.Storage do *domain.Domain hook *logHook } -func (s *testStatsSuite) SetUpSuite(c *C) { +type testStatsSuite struct { + testSuiteBase +} + +func (s *testSuiteBase) SetUpSuite(c *C) { testleak.BeforeTest() // Add the hook here to avoid data race. s.registerHook() @@ -57,13 +85,13 @@ func (s *testStatsSuite) SetUpSuite(c *C) { c.Assert(err, IsNil) } -func (s *testStatsSuite) TearDownSuite(c *C) { +func (s *testSuiteBase) TearDownSuite(c *C) { s.do.Close() s.store.Close() testleak.AfterTest(c)() } -func (s *testStatsSuite) registerHook() { +func (s *testSuiteBase) registerHook() { conf := &log.Config{Level: os.Getenv("log_level"), File: log.FileLogConfig{}} _, r, _ := log.InitLogger(conf) s.hook = &logHook{r.Core, ""} @@ -321,57 +349,61 @@ func (s *testStatsSuite) TestTxnWithFailure(c *C) { func (s *testStatsSuite) TestUpdatePartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) + testKit.MustQuery("select @@tidb_partition_prune_mode").Check(testkit.Rows(string(s.do.StatsHandle().CurrentPruneMode()))) testKit.MustExec("use test") - testKit.MustExec("drop table if exists t") - createTable := `CREATE TABLE t (a int, b char(5)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11))` - testKit.MustExec(createTable) - do := s.do - is := do.InfoSchema() - tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) - c.Assert(err, IsNil) - tableInfo := tbl.Meta() - h := do.StatsHandle() - err = h.HandleDDLEvent(<-h.DDLEventCh()) - c.Assert(err, IsNil) - pi := tableInfo.GetPartitionInfo() - c.Assert(len(pi.Definitions), Equals, 2) - bColID := tableInfo.Columns[1].ID + testkit.WithPruneMode(testKit, variable.Static, func() { + s.do.StatsHandle().RefreshVars() + testKit.MustExec("drop table if exists t") + createTable := `CREATE TABLE t (a int, b char(5)) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6),PARTITION p1 VALUES LESS THAN (11))` + testKit.MustExec(createTable) + do := s.do + is := do.InfoSchema() + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + h := do.StatsHandle() + err = h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(err, IsNil) + pi := tableInfo.GetPartitionInfo() + c.Assert(len(pi.Definitions), Equals, 2) + bColID := tableInfo.Columns[1].ID - testKit.MustExec(`insert into t values (1, "a"), (7, "a")`) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.ModifyCount, Equals, int64(1)) - c.Assert(statsTbl.Count, Equals, int64(1)) - c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(2)) - } + testKit.MustExec(`insert into t values (1, "a"), (7, "a")`) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(1)) + c.Assert(statsTbl.Count, Equals, int64(1)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(2)) + } - testKit.MustExec(`update t set a = a + 1, b = "aa"`) - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.ModifyCount, Equals, int64(2)) - c.Assert(statsTbl.Count, Equals, int64(1)) - c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(3)) - } + testKit.MustExec(`update t set a = a + 1, b = "aa"`) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(2)) + c.Assert(statsTbl.Count, Equals, int64(1)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(3)) + } - testKit.MustExec("delete from t") - c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) - c.Assert(h.Update(is), IsNil) - for _, def := range pi.Definitions { - statsTbl := h.GetPartitionStats(tableInfo, def.ID) - c.Assert(statsTbl.ModifyCount, Equals, int64(3)) - c.Assert(statsTbl.Count, Equals, int64(0)) - c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(0)) - } + testKit.MustExec("delete from t") + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + for _, def := range pi.Definitions { + statsTbl := h.GetPartitionStats(tableInfo, def.ID) + c.Assert(statsTbl.ModifyCount, Equals, int64(3)) + c.Assert(statsTbl.Count, Equals, int64(0)) + c.Assert(statsTbl.Columns[bColID].TotColSize, Equals, int64(0)) + } + }) } func (s *testStatsSuite) TestAutoUpdate(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("create table t (a varchar(20))") @@ -470,7 +502,7 @@ func (s *testStatsSuite) TestAutoUpdate(c *C) { func (s *testStatsSuite) TestAutoUpdatePartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - testkit.WithPruneMode(testKit, variable.StaticOnly, func() { + testkit.WithPruneMode(testKit, variable.Static, func() { testKit.MustExec("use test") testKit.MustExec("drop table if exists t") testKit.MustExec("create table t (a int) PARTITION BY RANGE (a) (PARTITION p0 VALUES LESS THAN (6))") @@ -506,6 +538,113 @@ func (s *testStatsSuite) TestAutoUpdatePartition(c *C) { }) } +func (s *testSerialStatsSuite) TestAutoAnalyzeOnEmptyTable(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + + oriStart := tk.MustQuery("select @@tidb_auto_analyze_start_time").Rows()[0][0].(string) + oriEnd := tk.MustQuery("select @@tidb_auto_analyze_end_time").Rows()[0][0].(string) + defer func() { + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_start_time='%v'", oriStart)) + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_end_time='%v'", oriEnd)) + }() + + t := time.Now().Add(-1 * time.Minute) + h, m := t.Hour(), t.Minute() + start, end := fmt.Sprintf("%02d:%02d +0000", h, m), fmt.Sprintf("%02d:%02d +0000", h, m) + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_start_time='%v'", start)) + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_end_time='%v'", end)) + s.do.StatsHandle().HandleAutoAnalyze(s.do.InfoSchema()) + + tk.MustExec("use test") + tk.MustExec("create table t (a int, index idx(a))") + // to pass the stats.Pseudo check in autoAnalyzeTable + tk.MustExec("analyze table t") + // to pass the AutoAnalyzeMinCnt check in autoAnalyzeTable + tk.MustExec("insert into t values (1)" + strings.Repeat(", (1)", int(handle.AutoAnalyzeMinCnt))) + c.Assert(s.do.StatsHandle().DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(s.do.StatsHandle().Update(s.do.InfoSchema()), IsNil) + + // test if it will be limited by the time range + c.Assert(s.do.StatsHandle().HandleAutoAnalyze(s.do.InfoSchema()), IsFalse) + + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_start_time='00:00 +0000'")) + tk.MustExec(fmt.Sprintf("set global tidb_auto_analyze_end_time='23:59 +0000'")) + c.Assert(s.do.StatsHandle().HandleAutoAnalyze(s.do.InfoSchema()), IsTrue) +} + +func (s *testSerialStatsSuite) TestAutoAnalyzeOnChangeAnalyzeVer(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, index idx(a))") + tk.MustExec("insert into t values(1)") + tk.MustExec("set @@global.tidb_analyze_version = 1") + do := s.do + handle.AutoAnalyzeMinCnt = 0 + defer func() { + handle.AutoAnalyzeMinCnt = 1000 + }() + h := do.StatsHandle() + h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + is := do.InfoSchema() + err := h.UpdateSessionVar() + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + // Auto analyze when global ver is 1. + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + statsTbl1 := h.GetTableStats(tbl.Meta()) + // Check that all the version of t's stats are 1. + for _, col := range statsTbl1.Columns { + c.Assert(col.StatsVer, Equals, int64(1)) + } + for _, idx := range statsTbl1.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } + tk.MustExec("set @@global.tidb_analyze_version = 2") + err = h.UpdateSessionVar() + c.Assert(err, IsNil) + tk.MustExec("insert into t values(1), (2), (3), (4)") + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + // Auto analyze t whose version is 1 after setting global ver to 2. + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + statsTbl1 = h.GetTableStats(tbl.Meta()) + c.Assert(statsTbl1.Count, Equals, int64(5)) + // All of its statistics should still be version 1. + for _, col := range statsTbl1.Columns { + c.Assert(col.StatsVer, Equals, int64(1)) + } + for _, idx := range statsTbl1.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } + // Add a new table after the analyze version set to 2. + tk.MustExec("create table tt(a int, index idx(a))") + tk.MustExec("insert into tt values(1), (2), (3), (4), (5)") + h.HandleDDLEvent(<-h.DDLEventCh()) + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + is = do.InfoSchema() + tbl2, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("tt")) + c.Assert(err, IsNil) + c.Assert(h.Update(is), IsNil) + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + statsTbl2 := h.GetTableStats(tbl2.Meta()) + // Since it's a newly created table. Auto analyze should analyze it's statistics to version2. + for _, idx := range statsTbl2.Indices { + c.Assert(idx.StatsVer, Equals, int64(2)) + } + for _, col := range statsTbl2.Columns { + c.Assert(col.StatsVer, Equals, int64(2)) + } + tk.MustExec("set @@global.tidb_analyze_version = 1") +} + func (s *testStatsSuite) TestTableAnalyzed(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) @@ -546,11 +685,11 @@ func (s *testStatsSuite) TestUpdateErrorRate(c *C) { is := s.do.InfoSchema() h.SetLease(0) c.Assert(h.Update(is), IsNil) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -621,11 +760,11 @@ func (s *testStatsSuite) TestUpdatePartitionErrorRate(c *C) { is := s.do.InfoSchema() h.SetLease(0) c.Assert(h.Update(is), IsNil) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -635,7 +774,7 @@ func (s *testStatsSuite) TestUpdatePartitionErrorRate(c *C) { testKit := testkit.NewTestKit(c, s.store) testKit.MustExec("use test") - testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) testKit.MustExec("create table t (a bigint(64), primary key(a)) partition by range (a) (partition p0 values less than (30))") h.HandleDDLEvent(<-h.DDLEventCh()) @@ -670,8 +809,8 @@ func (s *testStatsSuite) TestUpdatePartitionErrorRate(c *C) { c.Assert(h.Update(is), IsNil) tbl = h.GetPartitionStats(tblInfo, pid) - // The error rate of this column is not larger than MaxErrorRate now. - c.Assert(tbl.Columns[aID].NotAccurate(), IsFalse) + // Feedback will not take effect under partition table. + c.Assert(tbl.Columns[aID].NotAccurate(), IsTrue) } func appendBucket(h *statistics.Histogram, l, r int64) { @@ -739,16 +878,16 @@ func (s *testStatsSuite) TestQueryFeedback(c *C) { testKit.MustExec("use test") testKit.MustExec("create table t (a bigint(64), b bigint(64), primary key(a), index idx(b))") testKit.MustExec("insert into t values (1,2),(2,2),(4,5)") - testKit.MustExec("analyze table t") + testKit.MustExec("analyze table t with 0 topn") testKit.MustExec("insert into t values (3,4)") h := s.do.StatsHandle() - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriNumber := statistics.MaxNumberOfRanges oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) statistics.MaxNumberOfRanges = oriNumber handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate @@ -765,25 +904,25 @@ func (s *testStatsSuite) TestQueryFeedback(c *C) { // test primary key feedback sql: "select * from t where t.a <= 5 order by a desc", hist: "column:1 ndv:4 totColSize:0\n" + - "num: 1 lower_bound: -9223372036854775808 upper_bound: 2 repeats: 0\n" + - "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0\n" + - "num: 1 lower_bound: 4 upper_bound: 4 repeats: 1", + "num: 1 lower_bound: -9223372036854775808 upper_bound: 2 repeats: 0 ndv: 0\n" + + "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0 ndv: 0\n" + + "num: 1 lower_bound: 4 upper_bound: 4 repeats: 1 ndv: 0", idxCols: 0, }, { // test index feedback by double read sql: "select * from t use index(idx) where t.b <= 5", hist: "index:1 ndv:2\n" + - "num: 3 lower_bound: -inf upper_bound: 5 repeats: 0\n" + - "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1", + "num: 3 lower_bound: -inf upper_bound: 5 repeats: 0 ndv: 0\n" + + "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1 ndv: 0", idxCols: 1, }, { // test index feedback by single read sql: "select b from t use index(idx) where t.b <= 5", hist: "index:1 ndv:2\n" + - "num: 3 lower_bound: -inf upper_bound: 5 repeats: 0\n" + - "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1", + "num: 3 lower_bound: -inf upper_bound: 5 repeats: 0 ndv: 0\n" + + "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1 ndv: 0", idxCols: 1, }, } @@ -855,7 +994,7 @@ func (s *testStatsSuite) TestQueryFeedbackForPartition(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) testKit.MustExec("use test") - testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) testKit.MustExec(`create table t (a bigint(64), b bigint(64), primary key(a), index idx(b)) partition by range (a) ( partition p0 values less than (3), @@ -863,11 +1002,11 @@ func (s *testStatsSuite) TestQueryFeedbackForPartition(c *C) { testKit.MustExec("insert into t values (1,2),(2,2),(3,4),(4,1),(5,6)") testKit.MustExec("analyze table t") - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -876,6 +1015,7 @@ func (s *testStatsSuite) TestQueryFeedbackForPartition(c *C) { handle.MinLogErrorRate = 0 h := s.do.StatsHandle() + // Feedback will not take effect under partition table. tests := []struct { sql string hist string @@ -884,23 +1024,23 @@ func (s *testStatsSuite) TestQueryFeedbackForPartition(c *C) { { // test primary key feedback sql: "select * from t where t.a <= 5", - hist: "column:1 ndv:2 totColSize:0\n" + - "num: 1 lower_bound: -9223372036854775808 upper_bound: 2 repeats: 0\n" + - "num: 1 lower_bound: 2 upper_bound: 5 repeats: 0", + hist: "column:1 ndv:2 totColSize:2\n" + + "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1 ndv: 0\n" + + "num: 1 lower_bound: 2 upper_bound: 2 repeats: 1 ndv: 0", idxCols: 0, }, { // test index feedback by double read sql: "select * from t use index(idx) where t.b <= 5", hist: "index:1 ndv:1\n" + - "num: 2 lower_bound: -inf upper_bound: 6 repeats: 0", + "num: 2 lower_bound: 2 upper_bound: 2 repeats: 2 ndv: 0", idxCols: 1, }, { // test index feedback by single read sql: "select b from t use index(idx) where t.b <= 5", hist: "index:1 ndv:1\n" + - "num: 2 lower_bound: -inf upper_bound: 6 repeats: 0", + "num: 2 lower_bound: 2 upper_bound: 2 repeats: 2 ndv: 0", idxCols: 1, }, } @@ -987,18 +1127,18 @@ func (s *testStatsSuite) TestUpdateStatsByLocalFeedback(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) testKit.MustExec("use test") - testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) testKit.MustExec("create table t (a bigint(64), b bigint(64), primary key(a), index idx(b))") testKit.MustExec("insert into t values (1,2),(2,2),(4,5)") - testKit.MustExec("analyze table t") + testKit.MustExec("analyze table t with 0 topn") testKit.MustExec("insert into t values (3,5)") h := s.do.StatsHandle() - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate oriNumber := statistics.MaxNumberOfRanges defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate statistics.MaxNumberOfRanges = oriNumber @@ -1022,9 +1162,9 @@ func (s *testStatsSuite) TestUpdateStatsByLocalFeedback(c *C) { tbl := h.GetTableStats(tblInfo) c.Assert(tbl.Columns[tblInfo.Columns[0].ID].ToString(0), Equals, "column:1 ndv:3 totColSize:0\n"+ - "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1\n"+ - "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0\n"+ - "num: 1 lower_bound: 4 upper_bound: 9223372036854775807 repeats: 0") + "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1 ndv: 0\n"+ + "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0 ndv: 0\n"+ + "num: 1 lower_bound: 4 upper_bound: 9223372036854775807 repeats: 0 ndv: 0") sc := &stmtctx.StatementContext{TimeZone: time.Local} low, err := codec.EncodeKey(sc, nil, types.NewIntDatum(5)) c.Assert(err, IsNil) @@ -1032,8 +1172,8 @@ func (s *testStatsSuite) TestUpdateStatsByLocalFeedback(c *C) { c.Assert(tbl.Indices[tblInfo.Indices[0].ID].CMSketch.QueryBytes(low), Equals, uint64(2)) c.Assert(tbl.Indices[tblInfo.Indices[0].ID].ToString(1), Equals, "index:1 ndv:2\n"+ - "num: 2 lower_bound: -inf upper_bound: 5 repeats: 0\n"+ - "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1") + "num: 2 lower_bound: -inf upper_bound: 5 repeats: 0 ndv: 0\n"+ + "num: 1 lower_bound: 5 upper_bound: 5 repeats: 1 ndv: 0") // Test that it won't cause panic after update. testKit.MustQuery("select * from t use index(idx) where b > 0") @@ -1047,17 +1187,17 @@ func (s *testStatsSuite) TestUpdatePartitionStatsByLocalFeedback(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) testKit.MustExec("use test") - testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.StaticOnly) + `'`) + testKit.MustExec(`set @@tidb_partition_prune_mode='` + string(variable.Static) + `'`) testKit.MustExec("create table t (a bigint(64), b bigint(64), primary key(a)) partition by range (a) (partition p0 values less than (6))") testKit.MustExec("insert into t values (1,2),(2,2),(4,5)") testKit.MustExec("analyze table t") testKit.MustExec("insert into t values (3,5)") h := s.do.StatsHandle() - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -1077,10 +1217,112 @@ func (s *testStatsSuite) TestUpdatePartitionStatsByLocalFeedback(c *C) { pid := tblInfo.Partition.Definitions[0].ID tbl := h.GetPartitionStats(tblInfo, pid) + // Feedback will not take effect under partition table. c.Assert(tbl.Columns[tblInfo.Columns[0].ID].ToString(0), Equals, "column:1 ndv:3 totColSize:0\n"+ - "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1\n"+ - "num: 2 lower_bound: 2 upper_bound: 4 repeats: 0\n"+ - "num: 1 lower_bound: 4 upper_bound: 9223372036854775807 repeats: 0") + "num: 1 lower_bound: 1 upper_bound: 1 repeats: 1 ndv: 0\n"+ + "num: 1 lower_bound: 2 upper_bound: 2 repeats: 1 ndv: 0\n"+ + "num: 1 lower_bound: 4 upper_bound: 4 repeats: 1 ndv: 0") +} + +func (s *testStatsSuite) TestFeedbackWithStatsVer2(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("set global tidb_analyze_version = 1") + testKit.MustExec("set @@tidb_analyze_version = 1") + + oriProbability := statistics.FeedbackProbability.Load() + oriNumber := statistics.MaxNumberOfRanges + oriMinLogCount := handle.MinLogScanCount + oriErrorRate := handle.MinLogErrorRate + defer func() { + statistics.FeedbackProbability.Store(oriProbability) + statistics.MaxNumberOfRanges = oriNumber + handle.MinLogScanCount = oriMinLogCount + handle.MinLogErrorRate = oriErrorRate + }() + // Case 1: You can't set tidb_analyze_version to 2 if feedback is enabled. + statistics.FeedbackProbability.Store(1) + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustQuery("show warnings").Check(testkit.Rows(`Error 1105 variable tidb_analyze_version not updated because analyze version 2 is incompatible with query feedback. Please consider setting feedback-probability to 0.0 in config file to disable query feedback`)) + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("1")) + + // Case 2: Feedback wouldn't be applied on version 2 statistics. + statistics.FeedbackProbability.Store(0) + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustQuery("select @@tidb_analyze_version").Check(testkit.Rows("2")) + testKit.MustExec("create table t (a bigint(64), b bigint(64), index idx(b))") + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t values (1,2),(2,2),(4,5),(2,3),(3,4)") + } + testKit.MustExec("analyze table t with 0 topn") + h := s.do.StatsHandle() + is := s.do.InfoSchema() + table, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tblInfo := table.Meta() + testKit.MustExec("analyze table t") + err = h.Update(s.do.InfoSchema()) + c.Assert(err, IsNil) + statsTblBefore := h.GetTableStats(tblInfo) + statistics.FeedbackProbability.Store(1) + // make the statistics inaccurate. + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t values (3,4), (3,4), (3,4), (3,4), (3,4)") + } + // trigger feedback + testKit.MustExec("select * from t where t.a <= 5 order by a desc") + testKit.MustExec("select b from t use index(idx) where t.b <= 5") + + h.UpdateStatsByLocalFeedback(s.do.InfoSchema()) + err = h.DumpStatsFeedbackToKV() + c.Assert(err, IsNil) + err = h.HandleUpdateStats(s.do.InfoSchema()) + c.Assert(err, IsNil) + statsTblAfter := h.GetTableStats(tblInfo) + // assert that statistics not changed + assertTableEqual(c, statsTblBefore, statsTblAfter) + + // Case 3: Feedback is still effective on version 1 statistics. + testKit.MustExec("set tidb_analyze_version = 1") + testKit.MustExec("create table t1 (a bigint(64), b bigint(64), index idx(b))") + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t1 values (1,2),(2,2),(4,5),(2,3),(3,4)") + } + testKit.MustExec("analyze table t1 with 0 topn") + // make the statistics inaccurate. + for i := 0; i < 200; i++ { + testKit.MustExec("insert into t1 values (3,4), (3,4), (3,4), (3,4), (3,4)") + } + is = s.do.InfoSchema() + table, err = is.TableByName(model.NewCIStr("test"), model.NewCIStr("t1")) + c.Assert(err, IsNil) + tblInfo = table.Meta() + statsTblBefore = h.GetTableStats(tblInfo) + // trigger feedback + testKit.MustExec("select b from t1 use index(idx) where t1.b <= 5") + + h.UpdateStatsByLocalFeedback(s.do.InfoSchema()) + err = h.DumpStatsFeedbackToKV() + c.Assert(err, IsNil) + err = h.HandleUpdateStats(s.do.InfoSchema()) + c.Assert(err, IsNil) + statsTblAfter = h.GetTableStats(tblInfo) + // assert that statistics changed(feedback worked) + c.Assert(statistics.HistogramEqual(&statsTblBefore.Indices[1].Histogram, &statsTblAfter.Indices[1].Histogram, false), IsFalse) + + // Case 4: When existing version 1 stats + tidb_analyze_version=2 + feedback enabled, explicitly running `analyze table` still results in version 1 stats. + statistics.FeedbackProbability.Store(0) + testKit.MustExec("set tidb_analyze_version = 2") + statistics.FeedbackProbability.Store(1) + testKit.MustExec("analyze table t1 with 0 topn") + testKit.MustQuery("show warnings").Check(testkit.Rows( + "Warning 1105 Use analyze version 1 on table `t1` because this table already has version 1 statistics and query feedback is also enabled." + + " If you want to switch to version 2 statistics, please first disable query feedback by setting feedback-probability to 0.0 in the config file.")) + testKit.MustQuery(fmt.Sprintf("select stats_ver from mysql.stats_histograms where table_id = %d", tblInfo.ID)).Check(testkit.Rows("1", "1", "1")) + + testKit.MustExec("set global tidb_analyze_version = 1") } type logHook struct { @@ -1123,13 +1365,13 @@ func (h *logHook) Check(e zapcore.Entry, ce *zapcore.CheckedEntry) *zapcore.Chec func (s *testStatsSuite) TestLogDetailedInfo(c *C) { defer cleanEnv(c, s.store, s.do) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriMinError := handle.MinLogErrorRate oriLevel := log.GetLevel() oriLease := s.do.StatsHandle().Lease() defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriMinError s.do.StatsHandle().SetLease(oriLease) @@ -1153,17 +1395,17 @@ func (s *testStatsSuite) TestLogDetailedInfo(c *C) { }{ { sql: "select * from t where t.a <= 15", - result: "[stats-feedback] test.t, column=a, rangeStr=range: [-inf,8), actual: 8, expected: 8, buckets: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1, num: 8 lower_bound: 8 upper_bound: 15 repeats: 1}" + - "[stats-feedback] test.t, column=a, rangeStr=range: [8,15), actual: 8, expected: 7, buckets: {num: 8 lower_bound: 8 upper_bound: 15 repeats: 1}", + result: "[stats-feedback] test.t, column=a, rangeStr=range: [-inf,8), actual: 8, expected: 8, buckets: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1 ndv: 0, num: 8 lower_bound: 8 upper_bound: 15 repeats: 1 ndv: 0}" + + "[stats-feedback] test.t, column=a, rangeStr=range: [8,15), actual: 8, expected: 7, buckets: {num: 8 lower_bound: 8 upper_bound: 15 repeats: 1 ndv: 0}", }, { sql: "select * from t use index(idx) where t.b <= 15", - result: "[stats-feedback] test.t, index=idx, rangeStr=range: [-inf,8), actual: 8, expected: 8, histogram: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1, num: 8 lower_bound: 8 upper_bound: 15 repeats: 1}" + - "[stats-feedback] test.t, index=idx, rangeStr=range: [8,16), actual: 8, expected: 8, histogram: {num: 8 lower_bound: 8 upper_bound: 15 repeats: 1, num: 4 lower_bound: 16 upper_bound: 19 repeats: 1}", + result: "[stats-feedback] test.t, index=idx, rangeStr=range: [-inf,8), actual: 8, expected: 8, histogram: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1 ndv: 0, num: 8 lower_bound: 8 upper_bound: 15 repeats: 1 ndv: 0}" + + "[stats-feedback] test.t, index=idx, rangeStr=range: [8,16), actual: 8, expected: 8, histogram: {num: 8 lower_bound: 8 upper_bound: 15 repeats: 1 ndv: 0, num: 4 lower_bound: 16 upper_bound: 19 repeats: 1 ndv: 0}", }, { sql: "select b from t use index(idx_ba) where b = 1 and a <= 5", - result: "[stats-feedback] test.t, index=idx_ba, actual=1, equality=1, expected equality=1, range=range: [-inf,6], actual: -1, expected: 6, buckets: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1}", + result: "[stats-feedback] test.t, index=idx_ba, actual=1, equality=1, expected equality=1, range=range: [-inf,6], actual: -1, expected: 6, buckets: {num: 8 lower_bound: 0 upper_bound: 7 repeats: 1 ndv: 0}", }, { sql: "select b from t use index(idx_bc) where b = 1 and c <= 5", @@ -1302,9 +1544,9 @@ func (s *testStatsSuite) TestIndexQueryFeedback(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) }() statistics.FeedbackProbability.Store(1) @@ -1436,11 +1678,11 @@ func (s *testStatsSuite) TestIndexQueryFeedback4TopN(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -1483,11 +1725,11 @@ func (s *testStatsSuite) TestAbnormalIndexFeedback(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate }() @@ -1500,7 +1742,7 @@ func (s *testStatsSuite) TestAbnormalIndexFeedback(c *C) { for i := 0; i < 20; i++ { testKit.MustExec(fmt.Sprintf("insert into t values (%d, %d)", i/5, i)) } - testKit.MustExec("analyze table t with 3 buckets") + testKit.MustExec("analyze table t with 3 buckets, 0 topn") testKit.MustExec("delete from t where a = 1") testKit.MustExec("delete from t where b > 10") is := s.do.InfoSchema() @@ -1519,9 +1761,9 @@ func (s *testStatsSuite) TestAbnormalIndexFeedback(c *C) { // The real count of `a = 1` is 0. sql: "select * from t where a = 1 and b < 21", hist: "column:2 ndv:20 totColSize:20\n" + - "num: 5 lower_bound: -9223372036854775808 upper_bound: 7 repeats: 0\n" + - "num: 4 lower_bound: 7 upper_bound: 14 repeats: 0\n" + - "num: 4 lower_bound: 14 upper_bound: 21 repeats: 0", + "num: 5 lower_bound: -9223372036854775808 upper_bound: 7 repeats: 0 ndv: 0\n" + + "num: 4 lower_bound: 7 upper_bound: 14 repeats: 0 ndv: 0\n" + + "num: 4 lower_bound: 14 upper_bound: 21 repeats: 0 ndv: 0", rangeID: tblInfo.Columns[1].ID, idxID: tblInfo.Indices[0].ID, eqCount: 3, @@ -1530,9 +1772,9 @@ func (s *testStatsSuite) TestAbnormalIndexFeedback(c *C) { // The real count of `b > 10` is 0. sql: "select * from t where a = 2 and b > 10", hist: "column:2 ndv:20 totColSize:20\n" + - "num: 5 lower_bound: -9223372036854775808 upper_bound: 7 repeats: 0\n" + - "num: 4 lower_bound: 7 upper_bound: 14 repeats: 0\n" + - "num: 5 lower_bound: 14 upper_bound: 9223372036854775807 repeats: 0", + "num: 5 lower_bound: -9223372036854775808 upper_bound: 7 repeats: 0 ndv: 0\n" + + "num: 4 lower_bound: 7 upper_bound: 14 repeats: 0 ndv: 0\n" + + "num: 5 lower_bound: 14 upper_bound: 9223372036854775807 repeats: 0 ndv: 0", rangeID: tblInfo.Columns[1].ID, idxID: tblInfo.Indices[0].ID, eqCount: 3, @@ -1556,12 +1798,12 @@ func (s *testStatsSuite) TestFeedbackRanges(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) h := s.do.StatsHandle() - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriNumber := statistics.MaxNumberOfRanges oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) statistics.MaxNumberOfRanges = oriNumber handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate @@ -1590,25 +1832,25 @@ func (s *testStatsSuite) TestFeedbackRanges(c *C) { { sql: "select * from t where a <= 50 or (a > 130 and a < 140)", hist: "column:1 ndv:30 totColSize:0\n" + - "num: 8 lower_bound: -128 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0", + "num: 8 lower_bound: -128 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0 ndv: 0", colID: 1, }, { sql: "select * from t where a >= 10", hist: "column:1 ndv:30 totColSize:0\n" + - "num: 8 lower_bound: -128 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 127 repeats: 0", + "num: 8 lower_bound: -128 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 127 repeats: 0 ndv: 0", colID: 1, }, { sql: "select * from t use index(idx) where a = 1 and (b <= 50 or (b > 130 and b < 140))", hist: "column:2 ndv:20 totColSize:30\n" + - "num: 8 lower_bound: -128 upper_bound: 7 repeats: 0\n" + - "num: 8 lower_bound: 7 upper_bound: 14 repeats: 0\n" + - "num: 7 lower_bound: 14 upper_bound: 51 repeats: 0", + "num: 8 lower_bound: -128 upper_bound: 7 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 7 upper_bound: 14 repeats: 0 ndv: 0\n" + + "num: 7 lower_bound: 14 upper_bound: 51 repeats: 0 ndv: 0", colID: 2, }, } @@ -1632,12 +1874,12 @@ func (s *testStatsSuite) TestUnsignedFeedbackRanges(c *C) { testKit := testkit.NewTestKit(c, s.store) h := s.do.StatsHandle() - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() oriMinLogCount := handle.MinLogScanCount oriErrorRate := handle.MinLogErrorRate oriNumber := statistics.MaxNumberOfRanges defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) handle.MinLogScanCount = oriMinLogCount handle.MinLogErrorRate = oriErrorRate statistics.MaxNumberOfRanges = oriNumber @@ -1670,33 +1912,33 @@ func (s *testStatsSuite) TestUnsignedFeedbackRanges(c *C) { { sql: "select * from t where a <= 50", hist: "column:1 ndv:30 totColSize:10\n" + - "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0", + "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0 ndv: 0", tblName: "t", }, { sql: "select count(*) from t", hist: "column:1 ndv:30 totColSize:10\n" + - "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 255 repeats: 0", + "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 255 repeats: 0 ndv: 0", tblName: "t", }, { sql: "select * from t1 where a <= 50", hist: "column:1 ndv:30 totColSize:10\n" + - "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0", + "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 50 repeats: 0 ndv: 0", tblName: "t1", }, { sql: "select count(*) from t1", hist: "column:1 ndv:30 totColSize:10\n" + - "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0\n" + - "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0\n" + - "num: 14 lower_bound: 16 upper_bound: 18446744073709551615 repeats: 0", + "num: 8 lower_bound: 0 upper_bound: 8 repeats: 0 ndv: 0\n" + + "num: 8 lower_bound: 8 upper_bound: 16 repeats: 0 ndv: 0\n" + + "num: 14 lower_bound: 16 upper_bound: 18446744073709551615 repeats: 0 ndv: 0", tblName: "t1", }, } @@ -1744,9 +1986,9 @@ func (s *testStatsSuite) TestDeleteUpdateFeedback(c *C) { defer cleanEnv(c, s.store, s.do) testKit := testkit.NewTestKit(c, s.store) - oriProbability := statistics.FeedbackProbability + oriProbability := statistics.FeedbackProbability.Load() defer func() { - statistics.FeedbackProbability = oriProbability + statistics.FeedbackProbability.Store(oriProbability) }() statistics.FeedbackProbability.Store(1) @@ -1780,3 +2022,214 @@ func (s *testStatsSuite) BenchmarkHandleAutoAnalyze(c *C) { h.HandleAutoAnalyze(is) } } + +// subtraction parses the number for counter and returns new - old. +// string for counter will be `label: counter: ` +func subtraction(newMetric *dto.Metric, oldMetric *dto.Metric) int { + newStr := newMetric.String() + oldStr := oldMetric.String() + newIdx := strings.LastIndex(newStr, ":") + newNum, _ := strconv.Atoi(newStr[newIdx+1 : len(newStr)-3]) + oldIdx := strings.LastIndex(oldStr, ":") + oldNum, _ := strconv.Atoi(oldStr[oldIdx+1 : len(oldStr)-3]) + return newNum - oldNum +} + +func (s *testStatsSuite) TestDisableFeedback(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + + oriProbability := statistics.FeedbackProbability.Load() + defer func() { + statistics.FeedbackProbability.Store(oriProbability) + }() + statistics.FeedbackProbability.Store(0.0) + oldNum := &dto.Metric{} + metrics.StoreQueryFeedbackCounter.WithLabelValues(metrics.LblOK).Write(oldNum) + testKit.MustExec("use test") + testKit.MustExec("create table t (a int, b int, index idx_a(a))") + testKit.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (5, 5)") + testKit.MustExec("analyze table t with 0 topn") + for i := 0; i < 20; i++ { + testKit.MustQuery("select /*+ use_index(t, idx_a) */ * from t where a < 4") + } + + newNum := &dto.Metric{} + metrics.StoreQueryFeedbackCounter.WithLabelValues(metrics.LblOK).Write(newNum) + c.Assert(subtraction(newNum, oldNum), Equals, 0) +} + +func (s *testStatsSuite) TestFeedbackCounter(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + + oriProbability := statistics.FeedbackProbability.Load() + defer func() { + statistics.FeedbackProbability.Store(oriProbability) + }() + statistics.FeedbackProbability.Store(1) + oldNum := &dto.Metric{} + metrics.StoreQueryFeedbackCounter.WithLabelValues(metrics.LblOK).Write(oldNum) + testKit.MustExec("use test") + testKit.MustExec("create table t (a int, b int, index idx_a(a))") + testKit.MustExec("insert into t values (1, 1), (2, 2), (3, 3), (5, 5)") + testKit.MustExec("analyze table t with 0 topn") + for i := 0; i < 20; i++ { + testKit.MustQuery("select /*+ use_index(t, idx_a) */ * from t where a < 4") + } + + newNum := &dto.Metric{} + metrics.StoreQueryFeedbackCounter.WithLabelValues(metrics.LblOK).Write(newNum) + c.Assert(subtraction(newNum, oldNum), Equals, 20) +} + +func (s *testSerialStatsSuite) TestMergeTopN(c *C) { + // Move this test to here to avoid race test. + tests := []struct { + topnNum int + n int + maxTopNVal int + maxTopNCnt int + }{ + { + topnNum: 10, + n: 5, + maxTopNVal: 50, + maxTopNCnt: 100, + }, + { + topnNum: 1, + n: 5, + maxTopNVal: 50, + maxTopNCnt: 100, + }, + { + topnNum: 5, + n: 5, + maxTopNVal: 5, + maxTopNCnt: 100, + }, + { + topnNum: 5, + n: 5, + maxTopNVal: 10, + maxTopNCnt: 100, + }, + } + for _, t := range tests { + topnNum, n := t.topnNum, t.n + maxTopNVal, maxTopNCnt := t.maxTopNVal, t.maxTopNCnt + + // the number of maxTopNVal should be bigger than n. + ok := maxTopNVal >= n + c.Assert(ok, Equals, true) + + topNs := make([]*statistics.TopN, 0, topnNum) + res := make(map[int]uint64) + rand.Seed(time.Now().Unix()) + for i := 0; i < topnNum; i++ { + topN := statistics.NewTopN(n) + occur := make(map[int]bool) + for j := 0; j < n; j++ { + // The range of numbers in the topn structure is in [0, maxTopNVal) + // But there cannot be repeated occurrences of value in a topN structure. + randNum := rand.Intn(maxTopNVal) + for occur[randNum] { + randNum = rand.Intn(maxTopNVal) + } + occur[randNum] = true + tString := []byte(fmt.Sprintf("%d", randNum)) + // The range of the number of occurrences in the topn structure is in [0, maxTopNCnt) + randCnt := uint64(rand.Intn(maxTopNCnt)) + res[randNum] += randCnt + topNMeta := statistics.TopNMeta{Encoded: tString, Count: randCnt} + topN.TopN = append(topN.TopN, topNMeta) + } + topNs = append(topNs, topN) + } + topN, remainTopN := statistics.MergeTopN(topNs, uint32(n)) + cnt := len(topN.TopN) + var minTopNCnt uint64 + for _, topNMeta := range topN.TopN { + val, err := strconv.Atoi(string(topNMeta.Encoded)) + c.Assert(err, IsNil) + c.Assert(topNMeta.Count, Equals, res[val]) + minTopNCnt = topNMeta.Count + } + if remainTopN != nil { + cnt += len(remainTopN) + for _, remainTopNMeta := range remainTopN { + val, err := strconv.Atoi(string(remainTopNMeta.Encoded)) + c.Assert(err, IsNil) + c.Assert(remainTopNMeta.Count, Equals, res[val]) + ok = minTopNCnt > remainTopNMeta.Count + c.Assert(ok, Equals, true) + } + } + c.Assert(cnt, Equals, len(res)) + } +} + +func (s *testSerialStatsSuite) TestAutoUpdatePartitionInDynamicOnlyMode(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testkit.WithPruneMode(testKit, variable.DynamicOnly, func() { + testKit.MustExec("use test") + testKit.MustExec("set @@tidb_analyze_version = 2;") + testKit.MustExec("drop table if exists t") + testKit.MustExec(`create table t (a int, b varchar(10), index idx_ab(a, b)) + partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (30))`) + + do := s.do + is := do.InfoSchema() + h := do.StatsHandle() + c.Assert(h.RefreshVars(), IsNil) + c.Assert(h.HandleDDLEvent(<-h.DDLEventCh()), IsNil) + + testKit.MustExec("insert into t values (1, 'a'), (2, 'b'), (11, 'c'), (12, 'd'), (21, 'e'), (22, 'f')") + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + testKit.MustExec("set @@tidb_analyze_version = 2") + testKit.MustExec("analyze table t") + + handle.AutoAnalyzeMinCnt = 0 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.1") + defer func() { + handle.AutoAnalyzeMinCnt = 1000 + testKit.MustExec("set global tidb_auto_analyze_ratio = 0.0") + }() + + c.Assert(h.Update(is), IsNil) + tbl, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + tableInfo := tbl.Meta() + pi := tableInfo.GetPartitionInfo() + globalStats := h.GetTableStats(tableInfo) + partitionStats := h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) + c.Assert(globalStats.Count, Equals, int64(6)) + c.Assert(globalStats.ModifyCount, Equals, int64(0)) + c.Assert(partitionStats.Count, Equals, int64(2)) + c.Assert(partitionStats.ModifyCount, Equals, int64(0)) + + testKit.MustExec("insert into t values (3, 'g')") + c.Assert(h.DumpStatsDeltaToKV(handle.DumpAll), IsNil) + c.Assert(h.Update(is), IsNil) + globalStats = h.GetTableStats(tableInfo) + partitionStats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) + c.Assert(globalStats.Count, Equals, int64(7)) + c.Assert(globalStats.ModifyCount, Equals, int64(1)) + c.Assert(partitionStats.Count, Equals, int64(3)) + c.Assert(partitionStats.ModifyCount, Equals, int64(1)) + + h.HandleAutoAnalyze(is) + c.Assert(h.Update(is), IsNil) + globalStats = h.GetTableStats(tableInfo) + partitionStats = h.GetPartitionStats(tableInfo, pi.Definitions[0].ID) + c.Assert(globalStats.Count, Equals, int64(7)) + c.Assert(globalStats.ModifyCount, Equals, int64(0)) + c.Assert(partitionStats.Count, Equals, int64(3)) + c.Assert(partitionStats.ModifyCount, Equals, int64(0)) + }) +} diff --git a/statistics/histogram.go b/statistics/histogram.go index 8ae95e64cb692..64b95e0749211 100644 --- a/statistics/histogram.go +++ b/statistics/histogram.go @@ -23,6 +23,8 @@ import ( "unsafe" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/parser/charset" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" @@ -80,6 +82,7 @@ type Histogram struct { type Bucket struct { Count int64 Repeat int64 + NDV int64 } type scalar struct { @@ -90,6 +93,13 @@ type scalar struct { // NewHistogram creates a new histogram. func NewHistogram(id, ndv, nullCount int64, version uint64, tp *types.FieldType, bucketSize int, totColSize int64) *Histogram { + if tp.EvalType() == types.ETString { + // The histogram will store the string value's 'sort key' representation of its collation. + // If we directly set the field type's collation to its original one. We would decode the Key representation using its collation. + // This would cause panic. So we apply a little trick here to avoid decoding it by explicitly changing the collation to 'CollationBin'. + tp = tp.Clone() + tp.Collate = charset.CollationBin + } return &Histogram{ ID: id, NDV: ndv, @@ -202,16 +212,26 @@ func (c *Column) AvgColSizeListInDisk(count int64) float64 { // AppendBucket appends a bucket into `hg`. func (hg *Histogram) AppendBucket(lower *types.Datum, upper *types.Datum, count, repeat int64) { - hg.Buckets = append(hg.Buckets, Bucket{Count: count, Repeat: repeat}) + hg.AppendBucketWithNDV(lower, upper, count, repeat, 0) +} + +// AppendBucketWithNDV appends a bucket into `hg` and set value for field `NDV`. +func (hg *Histogram) AppendBucketWithNDV(lower *types.Datum, upper *types.Datum, count, repeat, ndv int64) { + hg.Buckets = append(hg.Buckets, Bucket{Count: count, Repeat: repeat, NDV: ndv}) hg.Bounds.AppendDatum(0, lower) hg.Bounds.AppendDatum(0, upper) } -func (hg *Histogram) updateLastBucket(upper *types.Datum, count, repeat int64) { - len := hg.Len() - hg.Bounds.TruncateTo(2*len - 1) +func (hg *Histogram) updateLastBucket(upper *types.Datum, count, repeat int64, needBucketNDV bool) { + l := hg.Len() + hg.Bounds.TruncateTo(2*l - 1) hg.Bounds.AppendDatum(0, upper) - hg.Buckets[len-1] = Bucket{Count: count, Repeat: repeat} + // The sampling case doesn't hold NDV since the low sampling rate. So check the NDV here. + if needBucketNDV && hg.Buckets[l-1].NDV > 0 { + hg.Buckets[l-1].NDV++ + } + hg.Buckets[l-1].Count = count + hg.Buckets[l-1].Repeat = repeat } // DecodeTo decodes the histogram bucket values into `Tp`. @@ -263,8 +283,21 @@ func HistogramEqual(a, b *Histogram, ignoreID bool) bool { // constants for stats version. These const can be used for solving compatibility issue. const ( - CurStatsVersion = Version1 - Version1 = 1 + // Version0 is the state that no statistics is actually collected, only the meta info.(the total count and the average col size) + Version0 = 0 + // In Version1 + // Column stats: CM Sketch is built in TiKV using full data. Histogram is built from samples. TopN is extracted from CM Sketch. + // TopN + CM Sketch represent all data. Histogram also represents all data. + // Index stats: CM Sketch and Histogram is built in TiKV using full data. TopN is extracted from histogram. Then values covered by TopN is removed from CM Sketch. + // TopN + CM Sketch represent all data. Histogram also represents all data. + // Int PK column stats is always Version1 because it only has histogram built from full data. + // Fast analyze is always Version1 currently. + Version1 = 1 + // In Version2 + // Column stats: CM Sketch is not used. TopN and Histogram are built from samples. TopN + Histogram represent all data. + // Index stats: CM SKetch is not used. TopN and Histograms are built in TiKV using full data. NDV is also collected for each bucket in histogram. + // Then values covered by TopN is removed from Histogram. TopN + Histogram represent all data. + Version2 = 2 ) // AnalyzeFlag is set when the statistics comes from analyze and has not been modified by feedback. @@ -307,7 +340,70 @@ func (hg *Histogram) BucketToString(bktID, idxCols int) string { terror.Log(errors.Trace(err)) lowerVal, err := ValueToString(nil, hg.GetLower(bktID), idxCols, nil) terror.Log(errors.Trace(err)) - return fmt.Sprintf("num: %d lower_bound: %s upper_bound: %s repeats: %d", hg.bucketCount(bktID), lowerVal, upperVal, hg.Buckets[bktID].Repeat) + return fmt.Sprintf("num: %d lower_bound: %s upper_bound: %s repeats: %d ndv: %d", hg.bucketCount(bktID), lowerVal, upperVal, hg.Buckets[bktID].Repeat, hg.Buckets[bktID].NDV) +} + +// RemoveIdxVals remove the given values from the histogram. +func (hg *Histogram) RemoveIdxVals(idxValCntPairs []TopNMeta) { + totalSubCnt := int64(0) + for bktIdx, pairIdx := 0, 0; bktIdx < hg.Len(); bktIdx++ { + for pairIdx < len(idxValCntPairs) { + // If the current val smaller than current bucket's lower bound, skip it. + cmpResult := bytes.Compare(hg.Bounds.Column(0).GetBytes(bktIdx*2), idxValCntPairs[pairIdx].Encoded) + if cmpResult > 0 { + continue + } + // If the current val bigger than current bucket's upper bound, break. + cmpResult = bytes.Compare(hg.Bounds.Column(0).GetBytes(bktIdx*2+1), idxValCntPairs[pairIdx].Encoded) + if cmpResult < 0 { + break + } + totalSubCnt += int64(idxValCntPairs[pairIdx].Count) + if hg.Buckets[bktIdx].NDV > 0 { + hg.Buckets[bktIdx].NDV-- + } + pairIdx++ + if cmpResult == 0 { + hg.Buckets[bktIdx].Repeat = 0 + break + } + } + hg.Buckets[bktIdx].Count -= totalSubCnt + if hg.Buckets[bktIdx].Count < 0 { + hg.Buckets[bktIdx].Count = 0 + } + } +} + +// AddIdxVals adds the given values to the histogram. +func (hg *Histogram) AddIdxVals(idxValCntPairs []TopNMeta) { + totalAddCnt := int64(0) + sort.Slice(idxValCntPairs, func(i, j int) bool { + return bytes.Compare(idxValCntPairs[i].Encoded, idxValCntPairs[j].Encoded) < 0 + }) + for bktIdx, pairIdx := 0, 0; bktIdx < hg.Len(); bktIdx++ { + for pairIdx < len(idxValCntPairs) { + // If the current val smaller than current bucket's lower bound, skip it. + cmpResult := bytes.Compare(hg.Bounds.Column(0).GetBytes(bktIdx*2), idxValCntPairs[pairIdx].Encoded) + if cmpResult > 0 { + continue + } + // If the current val bigger than current bucket's upper bound, break. + cmpResult = bytes.Compare(hg.Bounds.Column(0).GetBytes(bktIdx*2+1), idxValCntPairs[pairIdx].Encoded) + if cmpResult < 0 { + break + } + totalAddCnt += int64(idxValCntPairs[pairIdx].Count) + hg.Buckets[bktIdx].NDV++ + if cmpResult == 0 { + hg.Buckets[bktIdx].Repeat = int64(idxValCntPairs[pairIdx].Count) + pairIdx++ + break + } + pairIdx++ + } + hg.Buckets[bktIdx].Count += totalAddCnt + } } // ToString gets the string representation for the histogram. @@ -325,13 +421,16 @@ func (hg *Histogram) ToString(idxCols int) string { } // equalRowCount estimates the row count where the column equals to value. -func (hg *Histogram) equalRowCount(value types.Datum) float64 { +func (hg *Histogram) equalRowCount(value types.Datum, hasBucketNDV bool) float64 { index, match := hg.Bounds.LowerBound(0, &value) // Since we store the lower and upper bound together, if the index is an odd number, then it points to a upper bound. if index%2 == 1 { if match { return float64(hg.Buckets[index/2].Repeat) } + if hasBucketNDV && hg.Buckets[index/2].NDV > 1 { + return float64(hg.bucketCount(index/2)-hg.Buckets[index/2].Repeat) / float64(hg.Buckets[index/2].NDV-1) + } return hg.notNullCount() / float64(hg.NDV) } if match { @@ -339,14 +438,18 @@ func (hg *Histogram) equalRowCount(value types.Datum) float64 { if cmp(hg.Bounds.GetRow(index), 0, hg.Bounds.GetRow(index+1), 0) == 0 { return float64(hg.Buckets[index/2].Repeat) } + if hasBucketNDV && hg.Buckets[index/2].NDV > 1 { + return float64(hg.bucketCount(index/2)-hg.Buckets[index/2].Repeat) / float64(hg.Buckets[index/2].NDV-1) + } return hg.notNullCount() / float64(hg.NDV) } return 0 } // greaterRowCount estimates the row count where the column greater than value. +// It's deprecated. Only used for test. func (hg *Histogram) greaterRowCount(value types.Datum) float64 { - gtCount := hg.notNullCount() - hg.lessRowCount(value) - hg.equalRowCount(value) + gtCount := hg.notNullCount() - hg.lessRowCount(value) - hg.equalRowCount(value, false) return math.Max(0, gtCount) } @@ -395,6 +498,23 @@ func (hg *Histogram) BetweenRowCount(a, b types.Datum) float64 { return lessCountB - lessCountA } +// BetweenRowCount estimates the row count for interval [l, r). +func (c *Column) BetweenRowCount(sc *stmtctx.StatementContext, l, r types.Datum) (float64, error) { + histBetweenCnt := c.Histogram.BetweenRowCount(l, r) + if c.StatsVer <= Version1 { + return histBetweenCnt, nil + } + lBytes, err := codec.EncodeKey(sc, nil, l) + if err != nil { + return 0, errors.Trace(err) + } + rBytes, err := codec.EncodeKey(sc, nil, r) + if err != nil { + return 0, errors.Trace(err) + } + return float64(c.TopN.BetweenCount(lBytes, rBytes)) + histBetweenCnt, nil +} + // TotalRowCount returns the total count of this histogram. func (hg *Histogram) TotalRowCount() float64 { return hg.notNullCount() + float64(hg.NullCount) @@ -415,7 +535,9 @@ func (hg *Histogram) mergeBuckets(bucketIdx int) { curBuck := 0 c := chunk.NewChunkWithCapacity([]*types.FieldType{hg.Tp}, bucketIdx) for i := 0; i+1 <= bucketIdx; i += 2 { - hg.Buckets[curBuck] = hg.Buckets[i+1] + hg.Buckets[curBuck].NDV = hg.Buckets[i+1].NDV + hg.Buckets[i].NDV + hg.Buckets[curBuck].Count = hg.Buckets[i+1].Count + hg.Buckets[curBuck].Repeat = hg.Buckets[i+1].Repeat c.AppendDatum(0, hg.GetLower(i)) c.AppendDatum(0, hg.GetUpper(i+1)) curBuck++ @@ -430,6 +552,24 @@ func (hg *Histogram) mergeBuckets(bucketIdx int) { hg.Buckets = hg.Buckets[:curBuck] } +// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. +func (idx *Index) GetIncreaseFactor(totalCount int64) float64 { + columnCount := idx.TotalRowCount() + if columnCount == 0 { + return 1.0 + } + return float64(totalCount) / columnCount +} + +// BetweenRowCount estimates the row count for interval [l, r). +func (idx *Index) BetweenRowCount(l, r types.Datum) float64 { + histBetweenCnt := idx.Histogram.BetweenRowCount(l, r) + if idx.StatsVer == Version1 { + return histBetweenCnt + } + return float64(idx.TopN.BetweenCount(l.GetBytes(), r.GetBytes())) + histBetweenCnt +} + // GetIncreaseFactor will return a factor of data increasing after the last analysis. func (hg *Histogram) GetIncreaseFactor(totalCount int64) float64 { columnCount := hg.TotalRowCount() @@ -583,6 +723,7 @@ func HistogramToProto(hg *Histogram) *tipb.Histogram { LowerBound: hg.GetLower(i).GetBytes(), UpperBound: hg.GetUpper(i).GetBytes(), Repeats: hg.Buckets[i].Repeat, + Ndv: &hg.Buckets[i].NDV, } protoHg.Buckets = append(protoHg.Buckets, bkt) } @@ -597,7 +738,11 @@ func HistogramFromProto(protoHg *tipb.Histogram) *Histogram { hg := NewHistogram(0, protoHg.Ndv, 0, 0, tp, len(protoHg.Buckets), 0) for _, bucket := range protoHg.Buckets { lower, upper := types.NewBytesDatum(bucket.LowerBound), types.NewBytesDatum(bucket.UpperBound) - hg.AppendBucket(&lower, &upper, bucket.Count, bucket.Repeats) + if bucket.Ndv != nil { + hg.AppendBucketWithNDV(&lower, &upper, bucket.Count, bucket.Repeats, *bucket.Ndv) + } else { + hg.AppendBucket(&lower, &upper, bucket.Count, bucket.Repeats) + } } return hg } @@ -615,7 +760,7 @@ func (hg *Histogram) IsIndexHist() bool { } // MergeHistograms merges two histograms. -func MergeHistograms(sc *stmtctx.StatementContext, lh *Histogram, rh *Histogram, bucketSize int) (*Histogram, error) { +func MergeHistograms(sc *stmtctx.StatementContext, lh *Histogram, rh *Histogram, bucketSize int, statsVer int) (*Histogram, error) { if lh.Len() == 0 { return rh, nil } @@ -631,7 +776,12 @@ func MergeHistograms(sc *stmtctx.StatementContext, lh *Histogram, rh *Histogram, offset := int64(0) if cmp == 0 { lh.NDV-- - lh.updateLastBucket(rh.GetUpper(0), lh.Buckets[lLen-1].Count+rh.Buckets[0].Count, rh.Buckets[0].Repeat) + lh.Buckets[lLen-1].NDV += rh.Buckets[0].NDV + // There's an overlapped one. So we need to subtract it if needed. + if rh.Buckets[0].NDV > 0 && lh.Buckets[lLen-1].Repeat > 0 { + lh.Buckets[lLen-1].NDV-- + } + lh.updateLastBucket(rh.GetUpper(0), lh.Buckets[lLen-1].Count+rh.Buckets[0].Count, rh.Buckets[0].Repeat, false) offset = rh.Buckets[0].Count rh.popFirstBucket() } @@ -657,6 +807,10 @@ func MergeHistograms(sc *stmtctx.StatementContext, lh *Histogram, rh *Histogram, rAvg *= 2 } for i := 0; i < rh.Len(); i++ { + if statsVer == Version2 { + lh.AppendBucketWithNDV(rh.GetLower(i), rh.GetUpper(i), rh.Buckets[i].Count+lCount-offset, rh.Buckets[i].Repeat, rh.Buckets[i].NDV) + continue + } lh.AppendBucket(rh.GetLower(i), rh.GetUpper(i), rh.Buckets[i].Count+lCount-offset, rh.Buckets[i].Repeat) } for lh.Len() > bucketSize { @@ -696,6 +850,9 @@ func (hg *Histogram) Copy() *Histogram { func (hg *Histogram) RemoveUpperBound() *Histogram { hg.Buckets[hg.Len()-1].Count -= hg.Buckets[hg.Len()-1].Repeat hg.Buckets[hg.Len()-1].Repeat = 0 + if hg.NDV > 0 { + hg.NDV-- + } return hg } @@ -743,6 +900,8 @@ func (e *ErrorRate) Merge(rate *ErrorRate) { type Column struct { Histogram *CMSketch + *TopN + *FMSketch PhysicalID int64 Count int64 Info *model.ColumnInfo @@ -750,12 +909,38 @@ type Column struct { ErrorRate Flag int64 LastAnalyzePos types.Datum + StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility } func (c *Column) String() string { return c.Histogram.ToString(0) } +// TotalRowCount returns the total count of this column. +func (c *Column) TotalRowCount() float64 { + if c.StatsVer == Version2 { + return c.Histogram.TotalRowCount() + float64(c.TopN.TotalCount()) + } + return c.Histogram.TotalRowCount() +} + +func (c *Column) notNullCount() float64 { + if c.StatsVer == Version2 { + return c.Histogram.notNullCount() + float64(c.TopN.TotalCount()) + } + return c.Histogram.notNullCount() +} + +// GetIncreaseFactor get the increase factor to adjust the final estimated count when the table is modified. +func (c *Column) GetIncreaseFactor(totalCount int64) float64 { + columnCount := c.TotalRowCount() + if columnCount == 0 { + // avoid dividing by 0 + return 1.0 + } + return float64(totalCount) / columnCount +} + // MemoryUsage returns the total memory usage of Histogram and CMSketch in Column. // We ignore the size of other metadata in Column func (c *Column) MemoryUsage() (sum int64) { @@ -763,6 +948,9 @@ func (c *Column) MemoryUsage() (sum int64) { if c.CMSketch != nil { sum += c.CMSketch.MemoryUsage() } + if c.FMSketch != nil { + sum += c.FMSketch.MemoryUsage() + } return } @@ -776,29 +964,71 @@ func (c *Column) IsInvalid(sc *stmtctx.StatementContext, collPseudo bool) bool { if collPseudo && c.NotAccurate() { return true } - if c.NDV > 0 && c.Len() == 0 && sc != nil { + if c.Histogram.NDV > 0 && c.notNullCount() == 0 && sc != nil { sc.SetHistogramsNotLoad() HistogramNeededColumns.insert(tableColumnID{TableID: c.PhysicalID, ColumnID: c.Info.ID}) } - return c.TotalRowCount() == 0 || (c.NDV > 0 && c.Len() == 0) + return c.TotalRowCount() == 0 || (c.Histogram.NDV > 0 && c.notNullCount() == 0) } func (c *Column) equalRowCount(sc *stmtctx.StatementContext, val types.Datum, modifyCount int64) (float64, error) { if val.IsNull() { return float64(c.NullCount), nil } - // All the values are null. - if c.Histogram.Bounds.NumRows() == 0 { - return 0.0, nil + if c.StatsVer < Version2 { + // All the values are null. + if c.Histogram.Bounds.NumRows() == 0 { + return 0.0, nil + } + if c.Histogram.NDV > 0 && c.outOfRange(val) { + return outOfRangeEQSelectivity(c.Histogram.NDV, modifyCount, int64(c.TotalRowCount())) * c.TotalRowCount(), nil + } + if c.CMSketch != nil { + count, err := queryValue(sc, c.CMSketch, c.TopN, val) + return float64(count), errors.Trace(err) + } + return c.Histogram.equalRowCount(val, false), nil } - if c.NDV > 0 && c.outOfRange(val) { - return outOfRangeEQSelectivity(c.NDV, modifyCount, int64(c.TotalRowCount())) * c.TotalRowCount(), nil + // Stats version == 2 + // 1. try to find this value in TopN + if c.TopN != nil { + valBytes, err := codec.EncodeKey(sc, nil, val) + if err != nil { + return 0, errors.Trace(err) + } + rowcount, ok := c.QueryTopN(valBytes) + if ok { + return float64(rowcount), nil + } } - if c.CMSketch != nil { - count, err := c.CMSketch.queryValue(sc, val) - return float64(count), errors.Trace(err) + // 2. try to find this value in bucket.repeats(the last value in every bucket) + index, match := c.Histogram.Bounds.LowerBound(0, &val) + if index%2 == 1 && match { + return float64(c.Histogram.Buckets[index/2].Repeat), nil + } + if match { + cmp := chunk.GetCompareFunc(c.Histogram.Tp) + if cmp(c.Histogram.Bounds.GetRow(index), 0, c.Histogram.Bounds.GetRow(index+1), 0) == 0 { + return float64(c.Histogram.Buckets[index/2].Repeat), nil + } + } + // 3. use uniform distribution assumption for the rest + cnt := c.Histogram.notNullCount() + for _, bkt := range c.Histogram.Buckets { + if cnt <= float64(bkt.Repeat) { + return 0, nil + } + cnt -= float64(bkt.Repeat) + } + topNLen := int64(0) + if c.TopN != nil { + topNLen = int64(len(c.TopN.TopN)) + } + ndv := c.Histogram.NDV - topNLen - int64(len(c.Histogram.Buckets)) + if ndv <= 0 { + return 0, nil } - return c.Histogram.equalRowCount(val), nil + return cnt / float64(ndv), nil } // GetColumnRowCount estimates the row count by a slice of Range. @@ -808,18 +1038,10 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range highVal := *rg.HighVal[0].Clone() lowVal := *rg.LowVal[0].Clone() if highVal.Kind() == types.KindString { - highVal.SetBytesAsString(collate.GetCollator( - highVal.Collation()).Key(highVal.GetString()), - highVal.Collation(), - uint32(highVal.Length()), - ) + highVal.SetBytes(collate.GetCollator(highVal.Collation()).Key(highVal.GetString())) } if lowVal.Kind() == types.KindString { - lowVal.SetBytesAsString(collate.GetCollator( - lowVal.Collation()).Key(lowVal.GetString()), - lowVal.Collation(), - uint32(lowVal.Length()), - ) + lowVal.SetBytes(collate.GetCollator(lowVal.Collation()).Key(lowVal.GetString())) } cmp, err := lowVal.CompareDatum(sc, &highVal) if err != nil { @@ -855,7 +1077,10 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range continue } // The interval case. - cnt := c.BetweenRowCount(lowVal, highVal) + cnt, err := c.BetweenRowCount(sc, lowVal, highVal) + if err != nil { + return 0, err + } if (c.outOfRange(lowVal) && !lowVal.IsNull()) || c.outOfRange(highVal) { cnt += outOfRangeEQSelectivity(outOfRangeBetweenRate, modifyCount, int64(c.TotalRowCount())) * c.TotalRowCount() } @@ -893,6 +1118,7 @@ func (c *Column) GetColumnRowCount(sc *stmtctx.StatementContext, ranges []*range type Index struct { Histogram *CMSketch + *TopN ErrorRate StatsVer int64 // StatsVer is the version of the current stats, used to maintain compatibility Info *model.IndexInfo @@ -904,6 +1130,14 @@ func (idx *Index) String() string { return idx.Histogram.ToString(len(idx.Info.Columns)) } +// TotalRowCount returns the total count of this index. +func (idx *Index) TotalRowCount() float64 { + if idx.StatsVer == Version2 { + return idx.Histogram.TotalRowCount() + float64(idx.TopN.TotalCount()) + } + return idx.Histogram.TotalRowCount() +} + // IsInvalid checks if this index is invalid. func (idx *Index) IsInvalid(collPseudo bool) bool { return (collPseudo && idx.NotAccurate()) || idx.TotalRowCount() == 0 @@ -921,25 +1155,42 @@ func (idx *Index) MemoryUsage() (sum int64) { var nullKeyBytes, _ = codec.EncodeKey(nil, nil, types.NewDatum(nil)) -func (idx *Index) equalRowCount(sc *stmtctx.StatementContext, b []byte, modifyCount int64) (float64, error) { +func (idx *Index) equalRowCount(b []byte, modifyCount int64) float64 { if len(idx.Info.Columns) == 1 { if bytes.Equal(b, nullKeyBytes) { - return float64(idx.NullCount), nil + return float64(idx.NullCount) } } val := types.NewBytesDatum(b) if idx.NDV > 0 && idx.outOfRange(val) { - return outOfRangeEQSelectivity(idx.NDV, modifyCount, int64(idx.TotalRowCount())) * idx.TotalRowCount(), nil + return outOfRangeEQSelectivity(idx.NDV, modifyCount, int64(idx.TotalRowCount())) * idx.TotalRowCount() } - if idx.CMSketch != nil { - return float64(idx.CMSketch.QueryBytes(b)), nil + if idx.CMSketch != nil && idx.StatsVer < Version2 { + return float64(idx.QueryBytes(b)) + } + // If it's version2, query the top-n first. + if idx.StatsVer == Version2 { + count, found := idx.TopN.QueryTopN(b) + if found { + return float64(count) + } + return idx.Histogram.equalRowCount(val, true) } - return idx.Histogram.equalRowCount(val), nil + return idx.Histogram.equalRowCount(val, false) +} + +// QueryBytes is used to query the count of specified bytes. +func (idx *Index) QueryBytes(d []byte) uint64 { + h1, h2 := murmur3.Sum128(d) + if count, ok := idx.TopN.QueryTopN(d); ok { + return count + } + return idx.queryHashValue(h1, h2) } // GetRowCount returns the row count of the given ranges. // It uses the modifyCount to adjust the influence of modifications on the table. -func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, indexRanges []*ranger.Range, modifyCount int64) (float64, error) { +func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, coll *HistColl, indexRanges []*ranger.Range, modifyCount int64) (float64, error) { totalCount := float64(0) isSingleCol := len(idx.Info.Columns) == 1 for _, indexRange := range indexRanges { @@ -962,14 +1213,12 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, indexRanges []*range totalCount += 1 continue } - count, err := idx.equalRowCount(sc, lb, modifyCount) - if err != nil { - return 0, err - } + count := idx.equalRowCount(lb, modifyCount) totalCount += count continue } } + // The final interval is [low, high) if indexRange.LowExclude { lb = kv.Key(lb).PrefixNext() } @@ -978,7 +1227,6 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, indexRanges []*range } l := types.NewBytesDatum(lb) r := types.NewBytesDatum(rb) - totalCount += idx.BetweenRowCount(l, r) lowIsNull := bytes.Equal(lb, nullKeyBytes) if (idx.outOfRange(l) && !(isSingleCol && lowIsNull)) || idx.outOfRange(r) { totalCount += outOfRangeEQSelectivity(outOfRangeBetweenRate, modifyCount, int64(idx.TotalRowCount())) * idx.TotalRowCount() @@ -986,6 +1234,22 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, indexRanges []*range if isSingleCol && lowIsNull { totalCount += float64(idx.NullCount) } + expBackoffSuccess := false + // Due to the limitation of calcFraction and convertDatumToScalar, the histogram actually won't estimate anything. + // If the first column's range is point. + if rangePosition := GetOrdinalOfRangeCond(sc, indexRange); rangePosition > 0 && idx.StatsVer == Version2 && coll != nil { + var expBackoffSel float64 + expBackoffSel, expBackoffSuccess, err = idx.expBackoffEstimation(sc, coll, indexRange) + if err != nil { + return 0, err + } + if expBackoffSuccess { + totalCount += expBackoffSel * idx.TotalRowCount() + } + } + if !expBackoffSuccess { + totalCount += idx.BetweenRowCount(l, r) + } } if totalCount > idx.TotalRowCount() { totalCount = idx.TotalRowCount() @@ -993,6 +1257,70 @@ func (idx *Index) GetRowCount(sc *stmtctx.StatementContext, indexRanges []*range return totalCount, nil } +// expBackoffEstimation estimate the multi-col cases following the Exponential Backoff. See comment below for details. +func (idx *Index) expBackoffEstimation(sc *stmtctx.StatementContext, coll *HistColl, indexRange *ranger.Range) (float64, bool, error) { + tmpRan := []*ranger.Range{ + { + LowVal: make([]types.Datum, 1), + HighVal: make([]types.Datum, 1), + }, + } + colsIDs := coll.Idx2ColumnIDs[idx.ID] + singleColumnEstResults := make([]float64, 0, len(indexRange.LowVal)) + // The following codes uses Exponential Backoff to reduce the impact of independent assumption. It works like: + // 1. Calc the selectivity of each column. + // 2. Sort them and choose the first 4 most selective filter and the corresponding selectivity is sel_1, sel_2, sel_3, sel_4 where i < j => sel_i < sel_j. + // 3. The final selectivity would be sel_1 * sel_2^{1/2} * sel_3^{1/4} * sel_4^{1/8}. + // This calculation reduced the independence assumption and can work well better than it. + for i := 0; i < len(indexRange.LowVal); i++ { + tmpRan[0].LowVal[0] = indexRange.LowVal[i] + tmpRan[0].HighVal[0] = indexRange.HighVal[i] + if i == len(indexRange.LowVal)-1 { + tmpRan[0].LowExclude = indexRange.LowExclude + tmpRan[0].HighExclude = indexRange.HighExclude + } + colID := colsIDs[i] + var ( + count float64 + err error + ) + if anotherIdxID, ok := coll.ColID2IdxID[colID]; ok && anotherIdxID != idx.ID { + count, err = coll.GetRowCountByIndexRanges(sc, anotherIdxID, tmpRan) + } else if col, ok := coll.Columns[colID]; ok && !col.IsInvalid(sc, coll.Pseudo) { + count, err = coll.GetRowCountByColumnRanges(sc, colID, tmpRan) + } else { + continue + } + if err != nil { + return 0, false, err + } + singleColumnEstResults = append(singleColumnEstResults, count) + } + // Sort them. + sort.Slice(singleColumnEstResults, func(i, j int) bool { + return singleColumnEstResults[i] < singleColumnEstResults[j] + }) + l := len(singleColumnEstResults) + // Convert the first 4 to selectivity results. + for i := 0; i < l && i < 4; i++ { + singleColumnEstResults[i] = singleColumnEstResults[i] / float64(coll.Count) + } + failpoint.Inject("cleanEstResults", func() { + singleColumnEstResults = singleColumnEstResults[:0] + l = 0 + }) + if l == 1 { + return singleColumnEstResults[0], true, nil + } else if l == 2 { + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]), true, nil + } else if l == 3 { + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])), true, nil + } else if l == 0 { + return 0, false, nil + } + return singleColumnEstResults[0] * math.Sqrt(singleColumnEstResults[1]) * math.Sqrt(math.Sqrt(singleColumnEstResults[2])) * math.Sqrt(math.Sqrt(math.Sqrt(singleColumnEstResults[3]))), true, nil +} + type countByRangeFunc = func(*stmtctx.StatementContext, int64, []*ranger.Range) (float64, error) // newHistogramBySelectivity fulfills the content of new histogram by the given selectivity result. @@ -1121,7 +1449,7 @@ func (coll *HistColl) NewHistCollBySelectivity(sc *stmtctx.StatementContext, sta IsHandle: oldCol.IsHandle, CMSketch: oldCol.CMSketch, } - newCol.Histogram = *NewHistogram(oldCol.ID, int64(float64(oldCol.NDV)*node.Selectivity), 0, 0, oldCol.Tp, chunk.InitialCapacity, 0) + newCol.Histogram = *NewHistogram(oldCol.ID, int64(float64(oldCol.Histogram.NDV)*node.Selectivity), 0, 0, oldCol.Tp, chunk.InitialCapacity, 0) var err error splitRanges, ok := oldCol.Histogram.SplitRange(sc, node.Ranges, false) if !ok { @@ -1191,7 +1519,8 @@ type dataCnt struct { cnt uint64 } -func getIndexPrefixLens(data []byte, numCols int) (prefixLens []int, err error) { +// GetIndexPrefixLens returns an array representing +func GetIndexPrefixLens(data []byte, numCols int) (prefixLens []int, err error) { prefixLens = make([]int, 0, numCols) var colData []byte prefixLen := 0 @@ -1207,7 +1536,7 @@ func getIndexPrefixLens(data []byte, numCols int) (prefixLens []int, err error) } // ExtractTopN extracts topn from histogram. -func (hg *Histogram) ExtractTopN(cms *CMSketch, numCols int, numTopN uint32) error { +func (hg *Histogram) ExtractTopN(cms *CMSketch, topN *TopN, numCols int, numTopN uint32) error { if hg.Len() == 0 || cms == nil || numTopN == 0 { return nil } @@ -1219,7 +1548,7 @@ func (hg *Histogram) ExtractTopN(cms *CMSketch, numCols int, numTopN uint32) err // Since our histogram are equal depth, they must occurs on the boundaries of buckets. for i := 0; i < hg.Bounds.NumRows(); i++ { data := hg.Bounds.GetRow(i).GetBytes(0) - prefixLens, err := getIndexPrefixLens(data, numCols) + prefixLens, err := GetIndexPrefixLens(data, numCols) if err != nil { return err } @@ -1240,12 +1569,362 @@ func (hg *Histogram) ExtractTopN(cms *CMSketch, numCols int, numTopN uint32) err if len(dataCnts) > int(numTopN) { dataCnts = dataCnts[:numTopN] } - cms.topN = make(map[uint64][]*TopNMeta, len(dataCnts)) + topN.TopN = make([]TopNMeta, 0, len(dataCnts)) for _, dataCnt := range dataCnts { h1, h2 := murmur3.Sum128(dataCnt.data) realCnt := cms.queryHashValue(h1, h2) - cms.subValue(h1, h2, realCnt) - cms.topN[h1] = append(cms.topN[h1], &TopNMeta{h2, dataCnt.data, realCnt}) + cms.SubValue(h1, h2, realCnt) + topN.AppendTopN(dataCnt.data, realCnt) } + topN.Sort() return nil } + +// bucket4Merging is only used for merging partition hists to global hist. +type bucket4Merging struct { + lower *types.Datum + upper *types.Datum + Bucket + // disjointNDV is used for merging bucket NDV, see mergeBucketNDV for more details. + disjointNDV int64 +} + +func newBucket4Meging() *bucket4Merging { + return &bucket4Merging{ + lower: new(types.Datum), + upper: new(types.Datum), + Bucket: Bucket{ + Repeat: 0, + NDV: 0, + Count: 0, + }, + disjointNDV: 0, + } +} + +// buildBucket4Merging builds bucket4Merging from Histogram +// Notice: Count in Histogram.Buckets is prefix sum but in bucket4Merging is not. +func (hg *Histogram) buildBucket4Merging() []*bucket4Merging { + buckets := make([]*bucket4Merging, 0, hg.Len()) + for i := 0; i < hg.Len(); i++ { + b := newBucket4Meging() + hg.GetLower(i).Copy(b.lower) + hg.GetUpper(i).Copy(b.upper) + b.Repeat = hg.Buckets[i].Repeat + b.NDV = hg.Buckets[i].NDV + b.Count = hg.Buckets[i].Count + if i != 0 { + b.Count -= hg.Buckets[i-1].Count + } + buckets = append(buckets, b) + } + return buckets +} + +func (b *bucket4Merging) Clone() bucket4Merging { + return bucket4Merging{ + lower: b.lower.Clone(), + upper: b.upper.Clone(), + Bucket: Bucket{ + Repeat: b.Repeat, + NDV: b.NDV, + Count: b.Count, + }, + disjointNDV: b.disjointNDV, + } +} + +// mergeBucketNDV merges bucket NDV from tow bucket `right` & `left`. +// Before merging, you need to make sure that when using (upper, lower) as the comparison key, `right` is greater than `left` +func mergeBucketNDV(sc *stmtctx.StatementContext, left *bucket4Merging, right *bucket4Merging) (*bucket4Merging, error) { + res := right.Clone() + if left.NDV == 0 { + return &res, nil + } + if right.NDV == 0 { + res.lower = left.lower.Clone() + res.upper = left.upper.Clone() + res.NDV = left.NDV + return &res, nil + } + upperCompare, err := right.upper.CompareDatum(sc, left.upper) + if err != nil { + return nil, err + } + // __right__| + // _______left____| + // illegal order. + if upperCompare < 0 { + return nil, errors.Errorf("illegal bucket order") + } + // ___right_| + // ___left__| + // They have the same upper. + if upperCompare == 0 { + lowerCompare, err := right.lower.CompareDatum(sc, left.lower) + if err != nil { + return nil, err + } + // |____right____| + // |__left____| + // illegal order. + if lowerCompare < 0 { + return nil, errors.Errorf("illegal bucket order") + } + // |___right___| + // |____left___| + // ndv = max(right.ndv, left.ndv) + if lowerCompare == 0 { + if left.NDV > right.NDV { + res.NDV = left.NDV + } + return &res, nil + } + // |_right_| + // |_____left______| + // |-ratio-| + // ndv = ratio * left.ndv + max((1-ratio) * left.ndv, right.ndv) + ratio := calcFraction4Datums(left.lower, left.upper, right.lower) + res.NDV = int64(ratio*float64(left.NDV) + math.Max((1-ratio)*float64(left.NDV), float64(right.NDV))) + res.lower = left.lower.Clone() + return &res, nil + } + // ____right___| + // ____left__| + // right.upper > left.upper + lowerCompareUpper, err := right.lower.CompareDatum(sc, left.upper) + if err != nil { + return nil, err + } + // |_right_| + // |___left____| + // `left` and `right` do not intersect + // We add right.ndv in `disjointNDV`, and let `right.ndv = left.ndv` be used for subsequent merge. + // This is because, for the merging of many buckets, we merge them from back to front. + if lowerCompareUpper >= 0 { + res.upper = left.upper.Clone() + res.lower = left.lower.Clone() + res.disjointNDV += right.NDV + res.NDV = left.NDV + return &res, nil + } + upperRatio := calcFraction4Datums(right.lower, right.upper, left.upper) + lowerCompare, err := right.lower.CompareDatum(sc, left.lower) + if err != nil { + return nil, err + } + // |-upperRatio-| + // |_______right_____| + // |_______left______________| + // |-lowerRatio-| + // ndv = lowerRatio * left.ndv + // + max((1-lowerRatio) * left.ndv, upperRatio * right.ndv) + // + (1-upperRatio) * right.ndv + if lowerCompare >= 0 { + lowerRatio := calcFraction4Datums(left.lower, left.upper, right.lower) + res.NDV = int64(lowerRatio*float64(left.NDV) + + math.Max((1-lowerRatio)*float64(left.NDV), upperRatio*float64(right.NDV)) + + (1-upperRatio)*float64(right.NDV)) + res.lower = left.lower.Clone() + return &res, nil + } + // |------upperRatio--------| + // |-lowerRatio-| + // |____________right______________| + // |___left____| + // ndv = lowerRatio * right.ndv + // + max(left.ndv + (upperRatio - lowerRatio) * right.ndv) + // + (1-upperRatio) * right.ndv + lowerRatio := calcFraction4Datums(right.lower, right.upper, left.lower) + res.NDV = int64(lowerRatio*float64(right.NDV) + + math.Max(float64(left.NDV), (upperRatio-lowerRatio)*float64(right.NDV)) + + (1-upperRatio)*float64(right.NDV)) + return &res, nil +} + +// mergeParitionBuckets merges buckets[l...r) to one global bucket. +// global bucket: +// upper = buckets[r-1].upper +// count = sum of buckets[l...r).count +// repeat = sum of buckets[i] (buckets[i].upper == global bucket.upper && i in [l...r)) +// ndv = merge bucket ndv from r-1 to l by mergeBucketNDV +// Notice: lower is not calculated here. +func mergePartitionBuckets(sc *stmtctx.StatementContext, buckets []*bucket4Merging) (*bucket4Merging, error) { + if len(buckets) == 0 { + return nil, errors.Errorf("not enough buckets to merge") + } + res := bucket4Merging{} + res.upper = buckets[len(buckets)-1].upper.Clone() + right := buckets[len(buckets)-1].Clone() + for i := len(buckets) - 1; i >= 0; i-- { + res.Count += buckets[i].Count + compare, err := buckets[i].upper.CompareDatum(sc, res.upper) + if err != nil { + return nil, err + } + if compare == 0 { + res.Repeat += buckets[i].Repeat + } + if i != len(buckets)-1 { + tmp, err := mergeBucketNDV(sc, buckets[i], &right) + if err != nil { + return nil, err + } + right = *tmp + } + } + res.NDV = right.NDV + right.disjointNDV + return &res, nil +} + +func (t *TopNMeta) buildBucket4Merging(d *types.Datum) *bucket4Merging { + res := newBucket4Meging() + res.lower = d.Clone() + res.upper = d.Clone() + res.Count = int64(t.Count) + res.Repeat = int64(t.Count) + res.NDV = int64(1) + return res +} + +// MergePartitionHist2GlobalHist merges hists (partition-level Histogram) to a global-level Histogram +func MergePartitionHist2GlobalHist(sc *stmtctx.StatementContext, hists []*Histogram, popedTopN []TopNMeta, expBucketNumber int64, isIndex bool) (*Histogram, error) { + var totCount, totNull, bucketNumber, totColSize int64 + if expBucketNumber == 0 { + return nil, errors.Errorf("expBucketNumber can not be zero") + } + // minValue is used to calc the bucket lower. + var minValue *types.Datum + for _, hist := range hists { + totColSize += hist.TotColSize + totNull += hist.NullCount + bucketNumber += int64(hist.Len()) + if hist.Len() > 0 { + totCount += hist.Buckets[hist.Len()-1].Count + if minValue == nil { + minValue = hist.GetLower(0).Clone() + continue + } + res, err := hist.GetLower(0).CompareDatum(sc, minValue) + if err != nil { + return nil, err + } + if res < 0 { + minValue = hist.GetLower(0).Clone() + } + } + } + + bucketNumber += int64(len(popedTopN)) + buckets := make([]*bucket4Merging, 0, bucketNumber) + globalBuckets := make([]*bucket4Merging, 0, expBucketNumber) + + // init `buckets`. + for _, hist := range hists { + buckets = append(buckets, hist.buildBucket4Merging()...) + } + + for _, meta := range popedTopN { + totCount += int64(meta.Count) + var d types.Datum + if isIndex { + d.SetBytes(meta.Encoded) + } else { + var err error + if types.IsTypeTime(hists[0].Tp.Tp) { + // handle datetime values specially since they are encoded to int and we'll get int values if using DecodeOne. + _, d, err = codec.DecodeAsDateTime(meta.Encoded, hists[0].Tp.Tp, sc.TimeZone) + } else { + _, d, err = codec.DecodeOne(meta.Encoded) + } + if err != nil { + return nil, err + } + } + if minValue == nil { + minValue = d.Clone() + continue + } + res, err := d.CompareDatum(sc, minValue) + if err != nil { + return nil, err + } + if res < 0 { + minValue = d.Clone() + } + buckets = append(buckets, meta.buildBucket4Merging(&d)) + } + + var sortError error + sort.Slice(buckets, func(i, j int) bool { + res, err := buckets[i].upper.CompareDatum(sc, buckets[j].upper) + if err != nil { + sortError = err + } + if res != 0 { + return res < 0 + } + res, err = buckets[i].lower.CompareDatum(sc, buckets[j].lower) + if err != nil { + sortError = err + } + return res < 0 + }) + if sortError != nil { + return nil, sortError + } + var sum int64 + r := len(buckets) + bucketCount := int64(1) + for i := len(buckets) - 1; i >= 0; i-- { + sum += buckets[i].Count + if sum >= totCount*bucketCount/expBucketNumber { + // if the buckets have the same upper, we merge them into the same new buckets. + for ; i > 0; i-- { + res, err := buckets[i-1].upper.CompareDatum(sc, buckets[i].upper) + if err != nil { + return nil, err + } + if res != 0 { + break + } + } + merged, err := mergePartitionBuckets(sc, buckets[i:r]) + if err != nil { + return nil, err + } + globalBuckets = append(globalBuckets, merged) + r = i + bucketCount++ + } + } + if r > 0 { + merged, err := mergePartitionBuckets(sc, buckets[0:r]) + if err != nil { + return nil, err + } + globalBuckets = append(globalBuckets, merged) + } + // Because we merge backwards, we need to flip the slices. + for i, j := 0, len(globalBuckets)-1; i < j; i, j = i+1, j-1 { + globalBuckets[i], globalBuckets[j] = globalBuckets[j], globalBuckets[i] + } + + // Calc the bucket lower. + if minValue == nil { // both hists and popedTopN are empty, returns an empty hist in this case + return NewHistogram(hists[0].ID, 0, totNull, hists[0].LastUpdateVersion, hists[0].Tp, len(globalBuckets), totColSize), nil + } + globalBuckets[0].lower = minValue.Clone() + for i := 1; i < len(globalBuckets); i++ { + globalBuckets[i].lower = globalBuckets[i-1].upper.Clone() + globalBuckets[i].Count = globalBuckets[i].Count + globalBuckets[i-1].Count + } + globalHist := NewHistogram(hists[0].ID, 0, totNull, hists[0].LastUpdateVersion, hists[0].Tp, len(globalBuckets), totColSize) + for _, bucket := range globalBuckets { + if !isIndex { + bucket.NDV = 0 // bucket.NDV is not maintained for column histograms + } + globalHist.AppendBucketWithNDV(bucket.lower, bucket.upper, bucket.Count, bucket.Repeat, bucket.NDV) + } + return globalHist, nil +} diff --git a/statistics/histogram_test.go b/statistics/histogram_test.go index cd0196501a1d4..a1505a352568c 100644 --- a/statistics/histogram_test.go +++ b/statistics/histogram_test.go @@ -14,6 +14,8 @@ package statistics import ( + "fmt" + . "github.com/pingcap/check" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -49,11 +51,11 @@ func (s *testStatisticsSuite) TestNewHistogramBySelectivity(c *C) { node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeDatums(13), HighVal: types.MakeDatums(13)}) node.Ranges = append(node.Ranges, &ranger.Range{LowVal: types.MakeDatums(25), HighVal: []types.Datum{types.MaxValueDatum()}}) intColResult := `column:1 ndv:16 totColSize:0 -num: 30 lower_bound: 0 upper_bound: 2 repeats: 10 -num: 11 lower_bound: 6 upper_bound: 8 repeats: 0 -num: 30 lower_bound: 9 upper_bound: 11 repeats: 0 -num: 1 lower_bound: 12 upper_bound: 14 repeats: 0 -num: 30 lower_bound: 27 upper_bound: 29 repeats: 0` +num: 30 lower_bound: 0 upper_bound: 2 repeats: 10 ndv: 0 +num: 11 lower_bound: 6 upper_bound: 8 repeats: 0 ndv: 0 +num: 30 lower_bound: 9 upper_bound: 11 repeats: 0 ndv: 0 +num: 1 lower_bound: 12 upper_bound: 14 repeats: 0 ndv: 0 +num: 30 lower_bound: 27 upper_bound: 29 repeats: 0 ndv: 0` stringCol := &Column{} stringCol.Histogram = *NewHistogram(2, 15, 30, 0, types.NewFieldType(mysql.TypeString), chunk.InitialCapacity, 0) @@ -82,11 +84,11 @@ num: 30 lower_bound: 27 upper_bound: 29 repeats: 0` node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeDatums("ddd"), HighVal: types.MakeDatums("fff")}) node2.Ranges = append(node2.Ranges, &ranger.Range{LowVal: types.MakeDatums("ggg"), HighVal: []types.Datum{types.MaxValueDatum()}}) stringColResult := `column:2 ndv:9 totColSize:0 -num: 60 lower_bound: a upper_bound: aaaabbbb repeats: 0 -num: 52 lower_bound: bbbb upper_bound: fdsfdsfds repeats: 0 -num: 54 lower_bound: kkkkk upper_bound: ooooo repeats: 0 -num: 60 lower_bound: oooooo upper_bound: sssss repeats: 0 -num: 60 lower_bound: ssssssu upper_bound: yyyyy repeats: 0` +num: 60 lower_bound: a upper_bound: aaaabbbb repeats: 0 ndv: 0 +num: 52 lower_bound: bbbb upper_bound: fdsfdsfds repeats: 0 ndv: 0 +num: 54 lower_bound: kkkkk upper_bound: ooooo repeats: 0 ndv: 0 +num: 60 lower_bound: oooooo upper_bound: sssss repeats: 0 ndv: 0 +num: 60 lower_bound: ssssssu upper_bound: yyyyy repeats: 0 ndv: 0` newColl := coll.NewHistCollBySelectivity(sc, []*StatsNode{node, node2}) c.Assert(newColl.Columns[1].String(), Equals, intColResult) @@ -110,10 +112,10 @@ num: 60 lower_bound: ssssssu upper_bound: yyyyy repeats: 0` node3.Ranges = append(node3.Ranges, &ranger.Range{LowVal: types.MakeDatums(10), HighVal: types.MakeDatums(13)}) idxResult := `index:0 ndv:7 -num: 30 lower_bound: 0 upper_bound: 2 repeats: 10 -num: 30 lower_bound: 3 upper_bound: 5 repeats: 10 -num: 30 lower_bound: 9 upper_bound: 11 repeats: 10 -num: 30 lower_bound: 12 upper_bound: 14 repeats: 10` +num: 30 lower_bound: 0 upper_bound: 2 repeats: 10 ndv: 0 +num: 30 lower_bound: 3 upper_bound: 5 repeats: 10 ndv: 0 +num: 30 lower_bound: 9 upper_bound: 11 repeats: 10 ndv: 0 +num: 30 lower_bound: 12 upper_bound: 14 repeats: 10 ndv: 0` newColl = coll.NewHistCollBySelectivity(sc, []*StatsNode{node3}) c.Assert(newColl.Indices[0].String(), Equals, idxResult) @@ -139,3 +141,326 @@ func (s *testStatisticsSuite) TestValueToString4InvalidKey(c *C) { c.Assert(err, IsNil) c.Assert(res, Equals, "(1, 0.5, \x14)") } + +type bucket4Test struct { + lower int64 + upper int64 + count int64 + repeat int64 + ndv int64 +} + +type topN4Test struct { + data int64 + count int64 +} + +func genHist4Test(c *C, buckets []*bucket4Test, totColSize int64) *Histogram { + h := NewHistogram(0, 0, 0, 0, types.NewFieldType(mysql.TypeBlob), len(buckets), totColSize) + for _, bucket := range buckets { + lower, err := codec.EncodeKey(nil, nil, types.NewIntDatum(bucket.lower)) + c.Assert(err, IsNil) + upper, err := codec.EncodeKey(nil, nil, types.NewIntDatum(bucket.upper)) + c.Assert(err, IsNil) + di, du := types.NewBytesDatum(lower), types.NewBytesDatum(upper) + h.AppendBucketWithNDV(&di, &du, bucket.count, bucket.repeat, bucket.ndv) + } + return h +} + +func (s *testStatisticsSuite) TestMergePartitionLevelHist(c *C) { + type testCase struct { + partitionHists [][]*bucket4Test + totColSize []int64 + popedTopN []topN4Test + expHist []*bucket4Test + expBucketNumber int64 + } + tests := []testCase{ + { + partitionHists: [][]*bucket4Test{ + { + // Col(1) = [1, 4,|| 6, 9, 9,|| 12, 12, 12,|| 13, 14, 15] + { + lower: 1, + upper: 4, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 9, + count: 5, + repeat: 2, + ndv: 2, + }, + { + lower: 12, + upper: 12, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 15, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + // Col(2) = [2, 5,|| 6, 7, 7,|| 11, 11, 11,|| 13, 14, 17] + { + { + lower: 2, + upper: 5, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 7, + count: 5, + repeat: 2, + ndv: 2, + }, + { + lower: 11, + upper: 11, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 17, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + }, + totColSize: []int64{11, 11}, + popedTopN: []topN4Test{}, + expHist: []*bucket4Test{ + { + lower: 1, + upper: 7, + count: 7, + repeat: 2, + ndv: 4, + }, + { + lower: 7, + upper: 11, + count: 13, + repeat: 3, + ndv: 3, + }, + { + lower: 11, + upper: 17, + count: 22, + repeat: 1, + ndv: 5, + }, + }, + expBucketNumber: 3, + }, + { + partitionHists: [][]*bucket4Test{ + { + // Col(1) = [1, 4,|| 6, 9, 9,|| 12, 12, 12,|| 13, 14, 15] + { + lower: 1, + upper: 4, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 9, + count: 5, + repeat: 2, + ndv: 2, + }, + { + lower: 12, + upper: 12, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 15, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + // Col(2) = [2, 5,|| 6, 7, 7,|| 11, 11, 11,|| 13, 14, 17] + { + { + lower: 2, + upper: 5, + count: 2, + repeat: 1, + ndv: 2, + }, + { + lower: 6, + upper: 7, + count: 5, + repeat: 2, + ndv: 2, + }, + { + lower: 11, + upper: 11, + count: 8, + repeat: 3, + ndv: 1, + }, + { + lower: 13, + upper: 17, + count: 11, + repeat: 1, + ndv: 3, + }, + }, + }, + totColSize: []int64{11, 11}, + popedTopN: []topN4Test{ + { + data: 18, + count: 5, + }, + { + data: 4, + count: 6, + }, + }, + expHist: []*bucket4Test{ + { + lower: 1, + upper: 5, + count: 10, + repeat: 1, + ndv: 3, + }, + { + lower: 5, + upper: 12, + count: 22, + repeat: 3, + ndv: 5, + }, + { + lower: 12, + upper: 18, + count: 33, + repeat: 5, + ndv: 5, + }, + }, + expBucketNumber: 3, + }, + } + + for _, t := range tests { + var expTotColSize int64 + hists := make([]*Histogram, 0, len(t.partitionHists)) + for i := range t.partitionHists { + hists = append(hists, genHist4Test(c, t.partitionHists[i], t.totColSize[i])) + expTotColSize += t.totColSize[i] + } + ctx := mock.NewContext() + sc := ctx.GetSessionVars().StmtCtx + poped := make([]TopNMeta, 0, len(t.popedTopN)) + for _, top := range t.popedTopN { + b, err := codec.EncodeKey(sc, nil, types.NewIntDatum(top.data)) + c.Assert(err, IsNil) + tmp := TopNMeta{ + Encoded: b, + Count: uint64(top.count), + } + poped = append(poped, tmp) + } + globalHist, err := MergePartitionHist2GlobalHist(sc, hists, poped, t.expBucketNumber, true) + c.Assert(err, IsNil) + for i, b := range t.expHist { + lo, err := ValueToString(ctx.GetSessionVars(), globalHist.GetLower(i), 1, []byte{types.KindInt64}) + c.Assert(err, IsNil) + up, err := ValueToString(ctx.GetSessionVars(), globalHist.GetUpper(i), 1, []byte{types.KindInt64}) + c.Assert(err, IsNil) + c.Assert(fmt.Sprintf("%v", b.lower), Equals, lo) + c.Assert(fmt.Sprintf("%v", b.upper), Equals, up) + c.Assert(b.count, Equals, globalHist.Buckets[i].Count) + c.Assert(b.repeat, Equals, globalHist.Buckets[i].Repeat) + c.Assert(b.ndv, Equals, globalHist.Buckets[i].NDV) + } + c.Assert(globalHist.TotColSize, Equals, expTotColSize) + } +} + +func genBucket4Merging4Test(lower, upper, ndv, disjointNDV int64) bucket4Merging { + l := types.NewIntDatum(lower) + r := types.NewIntDatum(upper) + return bucket4Merging{ + lower: &l, + upper: &r, + Bucket: Bucket{ + NDV: ndv, + }, + disjointNDV: disjointNDV, + } +} + +func (s *testStatisticsSuite) TestMergeBucketNDV(c *C) { + type testData struct { + left bucket4Merging + right bucket4Merging + result bucket4Merging + } + tests := []testData{ + { + left: genBucket4Merging4Test(1, 2, 2, 0), + right: genBucket4Merging4Test(1, 2, 3, 0), + result: genBucket4Merging4Test(1, 2, 3, 0), + }, + { + left: genBucket4Merging4Test(1, 3, 2, 0), + right: genBucket4Merging4Test(2, 3, 2, 0), + result: genBucket4Merging4Test(1, 3, 3, 0), + }, + { + left: genBucket4Merging4Test(1, 3, 2, 0), + right: genBucket4Merging4Test(4, 6, 2, 2), + result: genBucket4Merging4Test(1, 3, 2, 4), + }, + { + left: genBucket4Merging4Test(1, 5, 5, 0), + right: genBucket4Merging4Test(2, 6, 5, 0), + result: genBucket4Merging4Test(1, 6, 6, 0), + }, + { + left: genBucket4Merging4Test(3, 5, 3, 0), + right: genBucket4Merging4Test(2, 6, 4, 0), + result: genBucket4Merging4Test(2, 6, 5, 0), + }, + } + sc := mock.NewContext().GetSessionVars().StmtCtx + for _, t := range tests { + res, err := mergeBucketNDV(sc, &t.left, &t.right) + c.Assert(err, IsNil) + c.Assert(t.result.lower.GetInt64(), Equals, res.lower.GetInt64()) + c.Assert(t.result.upper.GetInt64(), Equals, res.upper.GetInt64()) + c.Assert(t.result.NDV, Equals, res.NDV) + c.Assert(t.result.disjointNDV, Equals, res.disjointNDV) + } +} diff --git a/statistics/integration_test.go b/statistics/integration_test.go new file mode 100644 index 0000000000000..1a2b1727ba8e0 --- /dev/null +++ b/statistics/integration_test.go @@ -0,0 +1,321 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. +package statistics_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/failpoint" + "github.com/pingcap/parser/model" + "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/testkit" + "github.com/pingcap/tidb/util/testleak" + "github.com/pingcap/tidb/util/testutil" +) + +var _ = Suite(&testIntegrationSuite{}) + +type testIntegrationSuite struct { + store kv.Storage + do *domain.Domain + testData testutil.TestData +} + +func (s *testIntegrationSuite) SetUpSuite(c *C) { + testleak.BeforeTest() + var err error + s.store, s.do, err = newStoreWithBootstrap() + c.Assert(err, IsNil) + s.testData, err = testutil.LoadTestSuiteData("testdata", "integration_suite") + c.Assert(err, IsNil) +} + +func (s *testIntegrationSuite) TearDownSuite(c *C) { + s.do.Close() + c.Assert(s.store.Close(), IsNil) + testleak.AfterTest(c)() + c.Assert(s.testData.GenerateOutputIfNeeded(), IsNil) +} + +func (s *testIntegrationSuite) TestChangeVerTo2Behavior(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, index idx(a))") + tk.MustExec("set @@session.tidb_analyze_version = 1") + tk.MustExec("insert into t values(1, 1), (1, 2), (1, 3)") + tk.MustExec("analyze table t") + is := s.do.InfoSchema() + tblT, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + h := s.do.StatsHandle() + c.Assert(h.Update(is), IsNil) + statsTblT := h.GetTableStats(tblT.Meta()) + // Analyze table with version 1 success, all statistics are version 1. + for _, col := range statsTblT.Columns { + c.Assert(col.StatsVer, Equals, int64(1)) + } + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } + tk.MustExec("set @@session.tidb_analyze_version = 2") + tk.MustExec("analyze table t index idx") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } + tk.MustExec("analyze table t index") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } + tk.MustExec("analyze table t ") + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, col := range statsTblT.Columns { + c.Assert(col.StatsVer, Equals, int64(2)) + } + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(2)) + } + tk.MustExec("set @@session.tidb_analyze_version = 1") + tk.MustExec("analyze table t index idx") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(2)) + } + tk.MustExec("analyze table t index") + tk.MustQuery("show warnings").Check(testkit.Rows("Warning 1105 The analyze version from the session is not compatible with the existing statistics of the table. Use the existing version instead")) + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(2)) + } + tk.MustExec("analyze table t ") + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, col := range statsTblT.Columns { + c.Assert(col.StatsVer, Equals, int64(1)) + } + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } +} + +func (s *testIntegrationSuite) TestFastAnalyzeOnVer2(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, index idx(a))") + tk.MustExec("set @@session.tidb_analyze_version = 2") + tk.MustExec("set @@session.tidb_enable_fast_analyze = 1") + tk.MustExec("insert into t values(1, 1), (1, 2), (1, 3)") + _, err := tk.Exec("analyze table t") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently.") + tk.MustExec("set @@session.tidb_enable_fast_analyze = 0") + tk.MustExec("analyze table t") + is := s.do.InfoSchema() + tblT, err := is.TableByName(model.NewCIStr("test"), model.NewCIStr("t")) + c.Assert(err, IsNil) + h := s.do.StatsHandle() + c.Assert(h.Update(is), IsNil) + statsTblT := h.GetTableStats(tblT.Meta()) + for _, col := range statsTblT.Columns { + c.Assert(col.StatsVer, Equals, int64(2)) + } + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(2)) + } + tk.MustExec("set @@session.tidb_enable_fast_analyze = 1") + err = tk.ExecToErr("analyze table t index idx") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently.") + tk.MustExec("set @@session.tidb_analyze_version = 1") + _, err = tk.Exec("analyze table t index idx") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently. But the existing statistics of the table is not version 1.") + _, err = tk.Exec("analyze table t index") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "Fast analyze hasn't reached General Availability and only support analyze version 1 currently. But the existing statistics of the table is not version 1.") + tk.MustExec("analyze table t") + c.Assert(h.Update(is), IsNil) + statsTblT = h.GetTableStats(tblT.Meta()) + for _, col := range statsTblT.Columns { + c.Assert(col.StatsVer, Equals, int64(1)) + } + for _, idx := range statsTblT.Indices { + c.Assert(idx.StatsVer, Equals, int64(1)) + } +} + +func (s *testIntegrationSuite) TestIncAnalyzeOnVer2(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table t(a int, b int, index idx(a))") + tk.MustExec("set @@session.tidb_analyze_version = 2") + tk.MustExec("insert into t values(1, 1), (1, 2)") + tk.MustExec("analyze table t with 2 topn") + is := s.do.InfoSchema() + h := s.do.StatsHandle() + c.Assert(h.Update(is), IsNil) + tk.MustExec("insert into t values(2, 1), (2, 2), (2, 3), (3, 3), (4, 4), (4, 3), (4, 2), (4, 1)") + c.Assert(h.Update(is), IsNil) + tk.MustExec("analyze incremental table t index idx with 2 topn") + // After analyze, there's two val in hist. + tk.MustQuery("show stats_buckets where table_name = 't' and column_name = 'idx'").Check(testkit.Rows( + "test t idx 1 0 2 2 1 1 1", + "test t idx 1 1 3 0 2 4 1", + )) + // Two val in topn. + tk.MustQuery("show stats_topn where table_name = 't' and column_name = 'idx'").Check(testkit.Rows( + "test t idx 1 2 3", + "test t idx 1 4 4", + )) +} + +func (s *testIntegrationSuite) TestExpBackoffEstimation(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("create table exp_backoff(a int, b int, c int, d int, index idx(a, b, c, d))") + tk.MustExec("insert into exp_backoff values(1, 1, 1, 1), (1, 1, 1, 2), (1, 1, 2, 3), (1, 2, 2, 4), (1, 2, 3, 5)") + tk.MustExec("set @@session.tidb_analyze_version=2") + tk.MustExec("analyze table exp_backoff") + var ( + input []string + output [][]string + ) + s.testData.GetTestCases(c, &input, &output) + inputLen := len(input) + // The test cases are: + // Query a = 1, b = 1, c = 1, d >= 3 and d <= 5 separately. We got 5, 3, 2, 3. + // And then query and a = 1 and b = 1 and c = 1 and d >= 3 and d <= 5. It's result should follow the exp backoff, + // which is 2/5 * (3/5)^{1/2} * (3/5)*{1/4} * 1^{1/8} * 5 = 1.3634. + for i := 0; i < inputLen-1; i++ { + s.testData.OnRecord(func() { + output[i] = s.testData.ConvertRowsToStrings(tk.MustQuery(input[i]).Rows()) + }) + tk.MustQuery(input[i]).Check(testkit.Rows(output[i]...)) + } + + // The last case is that no column is loaded and we get no stats at all. + c.Assert(failpoint.Enable("github.com/pingcap/tidb/statistics/cleanEstResults", `return(true)`), IsNil) + s.testData.OnRecord(func() { + output[inputLen-1] = s.testData.ConvertRowsToStrings(tk.MustQuery(input[inputLen-1]).Rows()) + }) + tk.MustQuery(input[inputLen-1]).Check(testkit.Rows(output[inputLen-1]...)) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/statistics/cleanEstResults"), IsNil) +} + +func (s *testIntegrationSuite) TestGlobalStats(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t;") + tk.MustExec("set @@session.tidb_analyze_version = 2;") + tk.MustExec(`create table t (a int, key(a)) partition by range (a) ( + partition p0 values less than (10), + partition p1 values less than (20), + partition p2 values less than (30) + );`) + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("insert into t values (1), (5), (null), (11), (15), (21), (25);") + tk.MustExec("analyze table t;") + // On the table with global-stats, we use explain to query a multi-partition query. + // And we should get the result that global-stats is used instead of pseudo-stats. + tk.MustQuery("explain format = 'brief' select a from t where a > 5").Check(testkit.Rows( + "IndexReader 4.00 root partition:all index:IndexRangeScan", + "└─IndexRangeScan 4.00 cop[tikv] table:t, index:a(a) range:(5,+inf], keep order:false")) + // On the table with global-stats, we use explain to query a single-partition query. + // And we should get the result that global-stats is used instead of pseudo-stats. + tk.MustQuery("explain format = 'brief' select * from t partition(p1) where a > 15;").Check(testkit.Rows( + "IndexReader 2.00 root partition:p1 index:IndexRangeScan", + "└─IndexRangeScan 2.00 cop[tikv] table:t, index:a(a) range:(15,+inf], keep order:false")) + + // Even if we have global-stats, we will not use it when the switch is set to `static`. + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustQuery("explain format = 'brief' select a from t where a > 5").Check(testkit.Rows( + "PartitionUnion 4.00 root ", + "├─IndexReader 0.00 root index:IndexRangeScan", + "│ └─IndexRangeScan 0.00 cop[tikv] table:t, partition:p0, index:a(a) range:(5,+inf], keep order:false", + "├─IndexReader 2.00 root index:IndexRangeScan", + "│ └─IndexRangeScan 2.00 cop[tikv] table:t, partition:p1, index:a(a) range:(5,+inf], keep order:false", + "└─IndexReader 2.00 root index:IndexRangeScan", + " └─IndexRangeScan 2.00 cop[tikv] table:t, partition:p2, index:a(a) range:(5,+inf], keep order:false")) + + tk.MustExec("set @@tidb_partition_prune_mode = 'static';") + tk.MustExec("drop table t;") + tk.MustExec("create table t(a int, b int, key(a)) PARTITION BY HASH(a) PARTITIONS 2;") + tk.MustExec("insert into t values(1,1),(3,3),(4,4),(2,2),(5,5);") + // When we set the mode to `static`, using analyze will not report an error and will not generate global-stats. + // In addition, when using explain to view the plan of the related query, it was found that `Union` was used. + tk.MustExec("analyze table t;") + result := tk.MustQuery("show stats_meta where table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 2) + c.Assert(result.Rows()[0][5], Equals, "2") + c.Assert(result.Rows()[1][5], Equals, "3") + tk.MustQuery("explain format = 'brief' select a from t where a > 3;").Check(testkit.Rows( + "PartitionUnion 2.00 root ", + "├─IndexReader 1.00 root index:IndexRangeScan", + "│ └─IndexRangeScan 1.00 cop[tikv] table:t, partition:p0, index:a(a) range:(3,+inf], keep order:false", + "└─IndexReader 1.00 root index:IndexRangeScan", + " └─IndexRangeScan 1.00 cop[tikv] table:t, partition:p1, index:a(a) range:(3,+inf], keep order:false")) + + // When we turned on the switch, we found that pseudo-stats will be used in the plan instead of `Union`. + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + tk.MustQuery("explain format = 'brief' select a from t where a > 3;").Check(testkit.Rows( + "IndexReader 3333.33 root partition:all index:IndexRangeScan", + "└─IndexRangeScan 3333.33 cop[tikv] table:t, index:a(a) range:(3,+inf], keep order:false, stats:pseudo")) + + // Execute analyze again without error and can generate global-stats. + // And when executing related queries, neither Union nor pseudo-stats are used. + tk.MustExec("analyze table t;") + result = tk.MustQuery("show stats_meta where table_name = 't'").Sort() + c.Assert(len(result.Rows()), Equals, 3) + c.Assert(result.Rows()[0][5], Equals, "5") + c.Assert(result.Rows()[1][5], Equals, "2") + c.Assert(result.Rows()[2][5], Equals, "3") + tk.MustQuery("explain format = 'brief' select a from t where a > 3;").Check(testkit.Rows( + "IndexReader 2.00 root partition:all index:IndexRangeScan", + "└─IndexRangeScan 2.00 cop[tikv] table:t, index:a(a) range:(3,+inf], keep order:false")) + + tk.MustExec("drop table t;") + tk.MustExec("create table t (a int, b int, c int) PARTITION BY HASH(a) PARTITIONS 2;") + tk.MustExec("set @@tidb_partition_prune_mode = 'dynamic';") + tk.MustExec("create index idx_ab on t(a, b);") + tk.MustExec("insert into t values (1, 1, 1), (5, 5, 5), (11, 11, 11), (15, 15, 15), (21, 21, 21), (25, 25, 25);") + tk.MustExec("analyze table t;") + // test the indexScan + tk.MustQuery("explain format = 'brief' select b from t where a > 5 and b > 10;").Check(testkit.Rows( + "Projection 2.67 root test.t.b", + "└─IndexReader 2.67 root partition:all index:Selection", + " └─Selection 2.67 cop[tikv] gt(test.t.b, 10)", + " └─IndexRangeScan 4.00 cop[tikv] table:t, index:idx_ab(a, b) range:(5,+inf], keep order:false")) + // test the indexLookUp + tk.MustQuery("explain format = 'brief' select * from t use index(idx_ab) where a > 1;").Check(testkit.Rows( + "IndexLookUp 5.00 root partition:all ", + "├─IndexRangeScan(Build) 5.00 cop[tikv] table:t, index:idx_ab(a, b) range:(1,+inf], keep order:false", + "└─TableRowIDScan(Probe) 5.00 cop[tikv] table:t keep order:false")) + // test the tableScan + tk.MustQuery("explain format = 'brief' select * from t;").Check(testkit.Rows( + "TableReader 6.00 root partition:all data:TableFullScan", + "└─TableFullScan 6.00 cop[tikv] table:t keep order:false")) +} diff --git a/statistics/sample.go b/statistics/sample.go index aec37794c6ce8..28d40c3af6744 100644 --- a/statistics/sample.go +++ b/statistics/sample.go @@ -98,6 +98,7 @@ type SampleCollector struct { MaxSampleSize int64 FMSketch *FMSketch CMSketch *CMSketch + TopN *TopN TotalSize int64 // TotalSize is the total size of column. } @@ -106,9 +107,9 @@ func (c *SampleCollector) MergeSampleCollector(sc *stmtctx.StatementContext, rc c.NullCount += rc.NullCount c.Count += rc.Count c.TotalSize += rc.TotalSize - c.FMSketch.mergeFMSketch(rc.FMSketch) + c.FMSketch.MergeFMSketch(rc.FMSketch) if rc.CMSketch != nil { - err := c.CMSketch.MergeCMSketch(rc.CMSketch, 0) + err := c.CMSketch.MergeCMSketch(rc.CMSketch) terror.Log(errors.Trace(err)) } for _, item := range rc.Samples { @@ -126,7 +127,7 @@ func SampleCollectorToProto(c *SampleCollector) *tipb.SampleCollector { TotalSize: &c.TotalSize, } if c.CMSketch != nil { - collector.CmSketch = CMSketchToProto(c.CMSketch) + collector.CmSketch = CMSketchToProto(c.CMSketch, nil) } for _, item := range c.Samples { collector.Samples = append(collector.Samples, item.Value.GetBytes()) @@ -146,7 +147,7 @@ func SampleCollectorFromProto(collector *tipb.SampleCollector) *SampleCollector if collector.TotalSize != nil { s.TotalSize = *collector.TotalSize } - s.CMSketch = CMSketchFromProto(collector.CmSketch) + s.CMSketch, s.TopN = CMSketchAndTopNFromProto(collector.CmSketch) for _, val := range collector.Samples { // When store the histogram bucket boundaries to kv, we need to limit the length of the value. if len(val) <= maxSampleValueLength { @@ -302,7 +303,7 @@ func (c *SampleCollector) ExtractTopN(numTop uint32, sc *stmtctx.StatementContex } helper := newTopNHelper(values, numTop) cms := c.CMSketch - cms.topN = make(map[uint64][]*TopNMeta, helper.actualNumTop) + c.TopN = NewTopN(int(helper.actualNumTop)) // Process them decreasingly so we can handle most frequent values first and reduce the probability of hash collision // by small values. for i := uint32(0); i < helper.actualNumTop; i++ { @@ -318,8 +319,9 @@ func (c *SampleCollector) ExtractTopN(numTop uint32, sc *stmtctx.StatementContex if err != nil { return err } - cms.subValue(h1, h2, realCnt) - cms.topN[h1] = append(cms.topN[h1], &TopNMeta{h2, data, realCnt}) + cms.SubValue(h1, h2, realCnt) + c.TopN.AppendTopN(data, realCnt) } + c.TopN.Sort() return nil } diff --git a/statistics/sample_test.go b/statistics/sample_test.go index 34d3f31117db9..1a9647505b547 100644 --- a/statistics/sample_test.go +++ b/statistics/sample_test.go @@ -60,7 +60,7 @@ func (s *testSampleSuite) TestCollectColumnStats(c *C) { Sc: sc, RecordSet: s.rs, ColLen: 1, - PkBuilder: NewSortedBuilder(sc, 256, 1, types.NewFieldType(mysql.TypeLonglong)), + PkBuilder: NewSortedBuilder(sc, 256, 1, types.NewFieldType(mysql.TypeLonglong), Version2), MaxSampleSize: 10000, MaxBucketSize: 256, MaxFMSketchSize: 1000, diff --git a/statistics/selectivity.go b/statistics/selectivity.go index 8f46ce1bb17d1..3cb909af8ef2b 100644 --- a/statistics/selectivity.go +++ b/statistics/selectivity.go @@ -203,8 +203,8 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp } colHist := coll.Columns[c.UniqueID] - if colHist.NDV > 0 { - ret *= 1 / float64(colHist.NDV) + if colHist.Histogram.NDV > 0 { + ret *= 1 / float64(colHist.Histogram.NDV) } else { ret *= 1.0 / pseudoEqualRate } @@ -289,6 +289,7 @@ func (coll *HistColl) Selectivity(ctx sessionctx.Context, exprs []expression.Exp // Now we try to cover those still not covered DNF conditions using independence assumption, // i.e., sel(condA or condB) = sel(condA) + sel(condB) - sel(condA) * sel(condB) if mask > 0 { + OUTER: for i, expr := range remainedExprs { if mask&(1< 7") + + // Test issue 22134 + // Information about column n will not be in stats immediately after this SQL executed. + // If we don't have a check against this, DNF condition could lead to infinite recursion in Selectivity(). + testKit.MustExec("alter table t add column n timestamp;") + testKit.MustExec("select * from t where n = '2000-01-01' or n = '2000-01-02';") +} + +func (s *testStatsSuite) TestIndexEstimationCrossValidate(c *C) { + defer cleanEnv(c, s.store, s.do) + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int, b int, key(a,b))") + tk.MustExec("insert into t values(1, 1), (1, 2), (1, 3), (2, 2)") + tk.MustExec("analyze table t") + c.Assert(failpoint.Enable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64", `return(100000)`), IsNil) + tk.MustQuery("explain select * from t where a = 1 and b = 2").Check(testkit.Rows( + "IndexReader_6 1.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.00 cop[tikv] table:t, index:a(a, b) range:[1 2,1 2], keep order:false")) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/statistics/table/mockQueryBytesMaxUint64"), IsNil) + + // Test issue 22466 + tk.MustExec("drop table if exists t2") + tk.MustExec("create table t2(a int, b int, key b(b))") + tk.MustExec("insert into t2 values(1, 1), (2, 2), (3, 3), (4, 4), (5,5)") + // This line of select will mark column b stats as needed, and an invalid(empty) stats for column b + // will be loaded at the next analyze line, this will trigger the bug. + tk.MustQuery("select * from t2 where b=2") + tk.MustExec("analyze table t2 index b") + tk.MustQuery("explain select * from t2 where b=2").Check(testkit.Rows( + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.t2.b, 2)", + " └─TableFullScan_5 5.00 cop[tikv] table:t2 keep order:false")) } diff --git a/statistics/statistics_test.go b/statistics/statistics_test.go index 4fbf65ffffc50..255914c3caf4a 100644 --- a/statistics/statistics_test.go +++ b/statistics/statistics_test.go @@ -24,6 +24,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" @@ -37,6 +38,10 @@ import ( ) func TestT(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) TestingT(t) } @@ -175,7 +180,7 @@ func encodeKey(key types.Datum) types.Datum { } func buildPK(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.RecordSet) (int64, *Histogram, error) { - b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeLonglong)) + b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeLonglong), Version1) ctx := context.Background() for { req := records.NewChunk() @@ -199,7 +204,7 @@ func buildPK(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.Reco } func buildIndex(sctx sessionctx.Context, numBuckets, id int64, records sqlexec.RecordSet) (int64, *Histogram, *CMSketch, error) { - b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeBlob)) + b := NewSortedBuilder(sctx.GetSessionVars().StmtCtx, numBuckets, id, types.NewFieldType(mysql.TypeBlob), Version1) cms := NewCMSketch(8, 2048) ctx := context.Background() req := records.NewChunk() @@ -237,6 +242,7 @@ func checkRepeats(c *C, hg *Histogram) { func (s *testStatisticsSuite) TestBuild(c *C) { bucketCount := int64(256) + topNCount := 20 ctx := mock.NewContext() sc := ctx.GetSessionVars().StmtCtx sketch, _, err := buildFMSketch(sc, s.rc.(*recordSet).data, 1000) @@ -253,7 +259,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { checkRepeats(c, col) col.PreCalculateScalar() c.Check(col.Len(), Equals, 226) - count := col.equalRowCount(types.NewIntDatum(1000)) + count := col.equalRowCount(types.NewIntDatum(1000), false) c.Check(int(count), Equals, 0) count = col.lessRowCount(types.NewIntDatum(1000)) c.Check(int(count), Equals, 10000) @@ -265,12 +271,35 @@ func (s *testStatisticsSuite) TestBuild(c *C) { c.Check(int(count), Equals, 100000) count = col.greaterRowCount(types.NewIntDatum(200000000)) c.Check(count, Equals, 0.0) - count = col.equalRowCount(types.NewIntDatum(200000000)) + count = col.equalRowCount(types.NewIntDatum(200000000), false) c.Check(count, Equals, 0.0) count = col.BetweenRowCount(types.NewIntDatum(3000), types.NewIntDatum(3500)) c.Check(int(count), Equals, 4994) count = col.lessRowCount(types.NewIntDatum(1)) - c.Check(int(count), Equals, 9) + c.Check(int(count), Equals, 5) + + colv2, topnv2, err := BuildColumnHistAndTopN(ctx, int(bucketCount), topNCount, 2, collector, types.NewFieldType(mysql.TypeLonglong)) + c.Check(err, IsNil) + c.Check(topnv2.TopN, NotNil) + expectedTopNCount := []uint64{9990, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30} + for i, meta := range topnv2.TopN { + c.Check(meta.Count, Equals, expectedTopNCount[i]) + } + c.Check(colv2.Len(), Equals, 256) + count = colv2.lessRowCount(types.NewIntDatum(1000)) + c.Check(int(count), Equals, 325) + count = colv2.lessRowCount(types.NewIntDatum(2000)) + c.Check(int(count), Equals, 9430) + count = colv2.greaterRowCount(types.NewIntDatum(2000)) + c.Check(int(count), Equals, 80008) + count = colv2.lessRowCount(types.NewIntDatum(200000000)) + c.Check(int(count), Equals, 89440) + count = colv2.greaterRowCount(types.NewIntDatum(200000000)) + c.Check(count, Equals, 0.0) + count = colv2.BetweenRowCount(types.NewIntDatum(3000), types.NewIntDatum(3500)) + c.Check(int(count), Equals, 4995) + count = colv2.lessRowCount(types.NewIntDatum(1)) + c.Check(int(count), Equals, 0) builder := SampleBuilder{ Sc: mock.NewContext().GetSessionVars().StmtCtx, @@ -295,7 +324,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { checkRepeats(c, col) col.PreCalculateScalar() c.Check(int(tblCount), Equals, 100000) - count = col.equalRowCount(encodeKey(types.NewIntDatum(10000))) + count = col.equalRowCount(encodeKey(types.NewIntDatum(10000)), false) c.Check(int(count), Equals, 1) count = col.lessRowCount(encodeKey(types.NewIntDatum(20000))) c.Check(int(count), Equals, 19999) @@ -312,7 +341,7 @@ func (s *testStatisticsSuite) TestBuild(c *C) { checkRepeats(c, col) col.PreCalculateScalar() c.Check(int(tblCount), Equals, 100000) - count = col.equalRowCount(types.NewIntDatum(10000)) + count = col.equalRowCount(types.NewIntDatum(10000), false) c.Check(int(count), Equals, 1) count = col.lessRowCount(types.NewIntDatum(20000)) c.Check(int(count), Equals, 20000) @@ -398,7 +427,7 @@ func (s *testStatisticsSuite) TestMergeHistogram(c *C) { for _, t := range tests { lh := mockHistogram(t.leftLower, t.leftNum) rh := mockHistogram(t.rightLower, t.rightNum) - h, err := MergeHistograms(sc, lh, rh, bucketCount) + h, err := MergeHistograms(sc, lh, rh, bucketCount, Version1) c.Assert(err, IsNil) c.Assert(h.NDV, Equals, t.ndv) c.Assert(h.Len(), Equals, t.bucketNum) diff --git a/statistics/table.go b/statistics/table.go index e080e755b1061..69a71ee44801e 100644 --- a/statistics/table.go +++ b/statistics/table.go @@ -64,12 +64,6 @@ type Table struct { ExtendedStats *ExtendedStatsColl } -// ExtendedStatsKey is the key for cached item of a mysql.stats_extended record. -type ExtendedStatsKey struct { - StatsName string - DB string -} - // ExtendedStatsItem is the cached item of a mysql.stats_extended record. type ExtendedStatsItem struct { ColIDs []int64 @@ -80,13 +74,13 @@ type ExtendedStatsItem struct { // ExtendedStatsColl is a collection of cached items for mysql.stats_extended records. type ExtendedStatsColl struct { - Stats map[ExtendedStatsKey]*ExtendedStatsItem + Stats map[string]*ExtendedStatsItem LastUpdateVersion uint64 } // NewExtendedStatsColl allocate an ExtendedStatsColl struct. func NewExtendedStatsColl() *ExtendedStatsColl { - return &ExtendedStatsColl{Stats: make(map[ExtendedStatsKey]*ExtendedStatsItem)} + return &ExtendedStatsColl{Stats: make(map[string]*ExtendedStatsItem)} } // HistColl is a collection of histogram. It collects enough information for plan to calculate the selectivity. @@ -148,11 +142,11 @@ func (t *Table) Copy() *Table { } if t.ExtendedStats != nil { newExtStatsColl := &ExtendedStatsColl{ - Stats: make(map[ExtendedStatsKey]*ExtendedStatsItem), + Stats: make(map[string]*ExtendedStatsItem), LastUpdateVersion: t.ExtendedStats.LastUpdateVersion, } - for key, item := range t.ExtendedStats.Stats { - newExtStatsColl.Stats[key] = item + for name, item := range t.ExtendedStats.Stats { + newExtStatsColl.Stats[name] = item } nt.ExtendedStats = newExtStatsColl } @@ -203,6 +197,16 @@ func (t *Table) ColumnByName(colName string) *Column { return nil } +// GetStatsInfo returns their statistics according to the ID of the column or index, including histogram, CMSketch, TopN and FMSketch. +func (t *Table) GetStatsInfo(ID int64, isIndex bool) (int64, *Histogram, *CMSketch, *TopN, *FMSketch) { + if isIndex { + idxStatsInfo := t.Indices[ID] + return int64(idxStatsInfo.TotalRowCount()), idxStatsInfo.Histogram.Copy(), idxStatsInfo.CMSketch.Copy(), idxStatsInfo.TopN.Copy(), nil + } + colStatsInfo := t.Columns[ID] + return int64(colStatsInfo.TotalRowCount()), colStatsInfo.Histogram.Copy(), colStatsInfo.CMSketch.Copy(), colStatsInfo.TopN.Copy(), colStatsInfo.FMSketch.Copy() +} + type tableColumnID struct { TableID int64 ColumnID int64 @@ -271,7 +275,10 @@ func (t *Table) ColumnBetweenRowCount(sc *stmtctx.StatementContext, a, b types.D if !ok || c.IsInvalid(sc, t.Pseudo) { return float64(t.Count) / pseudoBetweenRate } - count := c.BetweenRowCount(a, b) + count, err := c.BetweenRowCount(sc, a, b) + if err != nil { + return 0 + } if a.IsNull() { count += float64(c.NullCount) } @@ -332,7 +339,7 @@ func (coll *HistColl) GetRowCountByIndexRanges(sc *stmtctx.StatementContext, idx if idx.CMSketch != nil && idx.StatsVer == Version1 { result, err = coll.getIndexRowCount(sc, idxID, indexRanges) } else { - result, err = idx.GetRowCount(sc, indexRanges, coll.ModifyCount) + result, err = idx.GetRowCount(sc, coll, indexRanges, coll.ModifyCount) } result *= idx.GetIncreaseFactor(coll.Count) return result, errors.Trace(err) @@ -464,19 +471,66 @@ func outOfRangeEQSelectivity(ndv, modifyRows, totalRows int64) float64 { return selectivity } +// crossValidationSelectivity gets the selectivity of multi-column equal conditions by cross validation. +func (coll *HistColl) crossValidationSelectivity(sc *stmtctx.StatementContext, idx *Index, usedColsLen int, idxPointRange *ranger.Range) (float64, float64, error) { + minRowCount := math.MaxFloat64 + cols := coll.Idx2ColumnIDs[idx.ID] + crossValidationSelectivity := 1.0 + totalRowCount := idx.TotalRowCount() + for i, colID := range cols { + if i >= usedColsLen { + break + } + if col, ok := coll.Columns[colID]; ok { + if col.IsInvalid(sc, coll.Pseudo) { + continue + } + lowExclude := idxPointRange.LowExclude + highExclude := idxPointRange.HighExclude + // Consider this case: + // create table t(a int, b int, c int, primary key(a,b,c)); + // insert into t values(1,1,1),(2,2,3); + // explain select * from t where (a,b) in ((1,1),(2,2)) and c > 2; + // For column a, we will get range: (1, 1], (2, 2], but GetColumnRowCount() with rang = (2, 2] will return 0. + // And the result of the explain statement will output estRow 0.0. So we change it to [2, 2]. + if lowExclude != highExclude && i < usedColsLen { + lowExclude = false + highExclude = false + } + rang := ranger.Range{ + LowVal: []types.Datum{idxPointRange.LowVal[i]}, + LowExclude: lowExclude, + HighVal: []types.Datum{idxPointRange.HighVal[i]}, + HighExclude: highExclude, + } + + rowCount, err := col.GetColumnRowCount(sc, []*ranger.Range{&rang}, coll.ModifyCount, col.IsHandle) + if err != nil { + return 0, 0, err + } + crossValidationSelectivity = crossValidationSelectivity * (rowCount / totalRowCount) + + if rowCount < minRowCount { + minRowCount = rowCount + } + } + } + return minRowCount, crossValidationSelectivity, nil +} + // getEqualCondSelectivity gets the selectivity of the equal conditions. -func (coll *HistColl) getEqualCondSelectivity(idx *Index, bytes []byte, usedColsLen int) float64 { +func (coll *HistColl) getEqualCondSelectivity(sc *stmtctx.StatementContext, idx *Index, bytes []byte, usedColsLen int, idxPointRange *ranger.Range) (float64, error) { coverAll := len(idx.Info.Columns) == usedColsLen // In this case, the row count is at most 1. if idx.Info.Unique && coverAll { - return 1.0 / float64(idx.TotalRowCount()) + return 1.0 / float64(idx.TotalRowCount()), nil } val := types.NewBytesDatum(bytes) if idx.outOfRange(val) { // When the value is out of range, we could not found this value in the CM Sketch, // so we use heuristic methods to estimate the selectivity. if idx.NDV > 0 && coverAll { - return outOfRangeEQSelectivity(idx.NDV, coll.ModifyCount, int64(idx.TotalRowCount())) + return outOfRangeEQSelectivity(idx.NDV, coll.ModifyCount, int64(idx.TotalRowCount())), nil } // The equal condition only uses prefix columns of the index. colIDs := coll.Idx2ColumnIDs[idx.ID] @@ -485,11 +539,23 @@ func (coll *HistColl) getEqualCondSelectivity(idx *Index, bytes []byte, usedCols if i >= usedColsLen { break } - ndv = mathutil.MaxInt64(ndv, coll.Columns[colID].NDV) + if col, ok := coll.Columns[colID]; ok { + ndv = mathutil.MaxInt64(ndv, col.Histogram.NDV) + } } - return outOfRangeEQSelectivity(ndv, coll.ModifyCount, int64(idx.TotalRowCount())) + return outOfRangeEQSelectivity(ndv, coll.ModifyCount, int64(idx.TotalRowCount())), nil } - return float64(idx.CMSketch.QueryBytes(bytes)) / float64(idx.TotalRowCount()) + + minRowCount, crossValidationSelectivity, err := coll.crossValidationSelectivity(sc, idx, usedColsLen, idxPointRange) + if err != nil { + return 0, nil + } + + idxCount := float64(idx.QueryBytes(bytes)) + if minRowCount < idxCount { + return crossValidationSelectivity, nil + } + return idxCount / idx.TotalRowCount(), nil } func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64, indexRanges []*ranger.Range) (float64, error) { @@ -509,7 +575,7 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 // on single-column index, use previous way as well, because CMSketch does not contain null // values in this case. if rangePosition == 0 || isSingleColIdxNullRange(idx, ran) { - count, err := idx.GetRowCount(sc, []*ranger.Range{ran}, coll.ModifyCount) + count, err := idx.GetRowCount(sc, nil, []*ranger.Range{ran}, coll.ModifyCount) if err != nil { return 0, errors.Trace(err) } @@ -523,7 +589,10 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 if err != nil { return 0, errors.Trace(err) } - selectivity = coll.getEqualCondSelectivity(idx, bytes, rangePosition) + selectivity, err = coll.getEqualCondSelectivity(sc, idx, bytes, rangePosition, ran) + if err != nil { + return 0, errors.Trace(err) + } } else { bytes, err := codec.EncodeKey(sc, nil, ran.LowVal[:rangePosition-1]...) if err != nil { @@ -536,7 +605,11 @@ func (coll *HistColl) getIndexRowCount(sc *stmtctx.StatementContext, idxID int64 if err != nil { return 0, err } - selectivity += coll.getEqualCondSelectivity(idx, bytes, rangePosition) + res, err := coll.getEqualCondSelectivity(sc, idx, bytes, rangePosition, ran) + if err != nil { + return 0, errors.Trace(err) + } + selectivity += res } } // use histogram to estimate the range condition @@ -838,3 +911,35 @@ func (coll *HistColl) GetIndexAvgRowSize(ctx sessionctx.Context, cols []*express } return } + +// CheckAnalyzeVerOnTable checks whether the given version is the one from the tbl. +// If not, it will return false and set the version to the tbl's. +// We use this check to make sure all the statistics of the table are in the same version. +func CheckAnalyzeVerOnTable(tbl *Table, version *int) bool { + for _, col := range tbl.Columns { + // Version0 means no statistics is collected currently. + if col.StatsVer == Version0 { + continue + } + if col.StatsVer != int64(*version) { + *version = int(col.StatsVer) + return false + } + // If we found one column and the version is the same, we can directly return since all the versions from this table is the same. + return true + } + for _, idx := range tbl.Indices { + // Version0 means no statistics is collected currently. + if idx.StatsVer == Version0 { + continue + } + if idx.StatsVer != int64(*version) { + *version = int(idx.StatsVer) + return false + } + // If we found one column and the version is the same, we can directly return since all the versions from this table is the same. + return true + } + // This table has no statistics yet. We can directly return true. + return true +} diff --git a/statistics/testdata/integration_suite_in.json b/statistics/testdata/integration_suite_in.json new file mode 100644 index 0000000000000..61f4badc3bb72 --- /dev/null +++ b/statistics/testdata/integration_suite_in.json @@ -0,0 +1,13 @@ +[ + { + "name": "TestExpBackoffEstimation", + "cases": [ + "explain select * from exp_backoff where a = 1", + "explain select * from exp_backoff where b = 1", + "explain select * from exp_backoff where c = 1", + "explain select * from exp_backoff where d >= 3 and d <= 5", + "explain select * from exp_backoff where a = 1 and b = 1 and c = 1 and d >= 3 and d<= 5", + "explain select * from exp_backoff where a = 1 and b = 1 and c = 1 and d >= 3 and d<= 5" + ] + } +] diff --git a/statistics/testdata/integration_suite_out.json b/statistics/testdata/integration_suite_out.json new file mode 100644 index 0000000000000..d5f6ff224a282 --- /dev/null +++ b/statistics/testdata/integration_suite_out.json @@ -0,0 +1,34 @@ +[ + { + "Name": "TestExpBackoffEstimation", + "Cases": [ + [ + "IndexReader_6 5.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 5.00 cop[tikv] table:exp_backoff, index:idx(a, b, c, d) range:[1,1], keep order:false" + ], + [ + "TableReader_7 3.00 root data:Selection_6", + "└─Selection_6 3.00 cop[tikv] eq(test.exp_backoff.b, 1)", + " └─TableFullScan_5 5.00 cop[tikv] table:exp_backoff keep order:false" + ], + [ + "TableReader_7 2.00 root data:Selection_6", + "└─Selection_6 2.00 cop[tikv] eq(test.exp_backoff.c, 1)", + " └─TableFullScan_5 5.00 cop[tikv] table:exp_backoff keep order:false" + ], + [ + "TableReader_7 3.00 root data:Selection_6", + "└─Selection_6 3.00 cop[tikv] ge(test.exp_backoff.d, 3), le(test.exp_backoff.d, 5)", + " └─TableFullScan_5 5.00 cop[tikv] table:exp_backoff keep order:false" + ], + [ + "IndexReader_6 1.36 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 1.36 cop[tikv] table:exp_backoff, index:idx(a, b, c, d) range:[1 1 1 3,1 1 1 5], keep order:false" + ], + [ + "IndexReader_6 0.00 root index:IndexRangeScan_5", + "└─IndexRangeScan_5 0.00 cop[tikv] table:exp_backoff, index:idx(a, b, c, d) range:[1 1 1 3,1 1 1 5], keep order:false" + ] + ] + } +] diff --git a/statistics/testdata/stats_suite_in.json b/statistics/testdata/stats_suite_in.json index be99041cd9465..6aef592ae4fa5 100644 --- a/statistics/testdata/stats_suite_in.json +++ b/statistics/testdata/stats_suite_in.json @@ -5,6 +5,67 @@ "explain select * from t where a = 1 and b = 5 and 1 = 1" ] }, + { + "name": "TestStatsVer2", + "cases": [ + "show stats_topn", + "show stats_buckets", + "explain select * from tint where a=1", + "explain select * from tint where a=4", + "explain select * from tint where a=8", + "explain select * from tdouble where a=1", + "explain select * from tdouble where a=4", + "explain select * from tdouble where a=8", + "explain select * from tdecimal where a=1", + "explain select * from tdecimal where a=4", + "explain select * from tdecimal where a=8", + "explain select * from tstring where a='1'", + "explain select * from tstring where a='4'", + "explain select * from tstring where a='8'", + "explain select * from tdatetime where a='2001-01-01'", + "explain select * from tdatetime where a='2001-01-02'", + "explain select * from tdatetime where a='2001-01-04'", + "explain select * from tprefix where a='111'", + "explain select * from tprefix where a='444'", + "explain select * from tprefix where a='888'", + "explain select * from tint where b=1 and c=1", + "explain select * from tint where b=4 and c=4", + "explain select * from tint where b=8 and c=8", + "explain select * from tdouble where b=1 and c=1", + "explain select * from tdouble where b=4 and c=4", + "explain select * from tdouble where b=8 and c=8", + "explain select * from tdecimal where b=1 and c=1", + "explain select * from tdecimal where b=4 and c=4", + "explain select * from tdecimal where b=8 and c=8", + "explain select * from tstring where b='1' and c='1'", + "explain select * from tstring where b='4' and c='4'", + "explain select * from tstring where b='8' and c='8'", + "explain select * from tdatetime where b='2001-01-01' and c='2001-01-01'", + "explain select * from tdatetime where b='2001-01-02' and c='2001-01-02'", + "explain select * from tdatetime where b='2001-01-04' and c='2001-01-04'", + "explain select * from tint where b=1", + "explain select * from tint where b=4", + "explain select * from tint where b=8", + "explain select * from tdouble where b=1", + "explain select * from tdouble where b=4", + "explain select * from tdouble where b=8", + "explain select * from tdecimal where b=1", + "explain select * from tdecimal where b=4", + "explain select * from tdecimal where b=8", + "explain select * from tstring where b='1'", + "explain select * from tstring where b='4'", + "explain select * from tstring where b='8'", + "explain select * from tdatetime where b='2001-01-01'", + "explain select * from tdatetime where b='2001-01-02'", + "explain select * from tdatetime where b='2001-01-04'", + "explain select * from ct1 where pk>='1' and pk <='4'", + "explain select * from ct1 where pk>='4' and pk <='6'", + "explain select * from ct1 where pk>='6' and pk <='8'", + "explain select * from ct2 where a=1 and b>=1 and b<=8", + "explain select * from ct2 where a=4 and b>=1 and b<=8", + "explain select * from ct2 where a=8 and b>=1 and b<=8" + ] + }, { "name": "TestColumnIndexNullEstimation", "cases": [ diff --git a/statistics/testdata/stats_suite_out.json b/statistics/testdata/stats_suite_out.json index 624f8b2a65a10..df094ad5283b9 100644 --- a/statistics/testdata/stats_suite_out.json +++ b/statistics/testdata/stats_suite_out.json @@ -7,6 +7,421 @@ ] ] }, + { + "Name": "TestStatsVer2", + "Cases": [ + [ + "test tint a 0 1 1", + "test tint a 0 2 1", + "test tint b 0 1 1", + "test tint b 0 2 1", + "test tint c 0 1 1", + "test tint c 0 2 1", + "test tint singular 1 1 1", + "test tint singular 1 2 1", + "test tint multi 1 (1, 1) 1", + "test tint multi 1 (2, 2) 1", + "test tdouble a 0 1 1", + "test tdouble a 0 2 1", + "test tdouble b 0 1 1", + "test tdouble b 0 2 1", + "test tdouble c 0 1 1", + "test tdouble c 0 2 1", + "test tdouble singular 1 1 1", + "test tdouble singular 1 2 1", + "test tdouble multi 1 (1, 1) 1", + "test tdouble multi 1 (2, 2) 1", + "test tdecimal a 0 1.00000000000000000000 1", + "test tdecimal a 0 2.00000000000000000000 1", + "test tdecimal b 0 1.00000000000000000000 1", + "test tdecimal b 0 2.00000000000000000000 1", + "test tdecimal c 0 1.00000000000000000000 1", + "test tdecimal c 0 2.00000000000000000000 1", + "test tdecimal singular 1 1.00000000000000000000 1", + "test tdecimal singular 1 2.00000000000000000000 1", + "test tdecimal multi 1 (1.00000000000000000000, 1.00000000000000000000) 1", + "test tdecimal multi 1 (2.00000000000000000000, 2.00000000000000000000) 1", + "test tstring a 0 1 1", + "test tstring a 0 2 1", + "test tstring b 0 1 1", + "test tstring b 0 2 1", + "test tstring c 0 1 1", + "test tstring c 0 2 1", + "test tstring singular 1 1 1", + "test tstring singular 1 2 1", + "test tstring multi 1 (1, 1) 1", + "test tstring multi 1 (2, 2) 1", + "test tdatetime a 0 2001-01-01 00:00:00 1", + "test tdatetime a 0 2001-01-02 00:00:00 1", + "test tdatetime b 0 2001-01-01 00:00:00 1", + "test tdatetime b 0 2001-01-02 00:00:00 1", + "test tdatetime c 0 2001-01-01 00:00:00 1", + "test tdatetime c 0 2001-01-02 00:00:00 1", + "test tdatetime singular 1 2001-01-01 00:00:00 1", + "test tdatetime singular 1 2001-01-02 00:00:00 1", + "test tdatetime multi 1 (2001-01-01 00:00:00, 2001-01-01 00:00:00) 1", + "test tdatetime multi 1 (2001-01-02 00:00:00, 2001-01-02 00:00:00) 1", + "test tprefix a 0 111 1", + "test tprefix a 0 222 1", + "test tprefix b 0 111 1", + "test tprefix b 0 222 1", + "test tprefix prefixa 1 11 1", + "test tprefix prefixa 1 22 1", + "test ct1 a 0 1 1", + "test ct1 a 0 2 1", + "test ct1 pk 0 1 1", + "test ct1 pk 0 2 1", + "test ct1 PRIMARY 1 1 1", + "test ct1 PRIMARY 1 2 1", + "test ct2 a 0 1 1", + "test ct2 a 0 2 1", + "test ct2 b 0 1 1", + "test ct2 b 0 2 1", + "test ct2 c 0 1 1", + "test ct2 c 0 2 1", + "test ct2 PRIMARY 1 (1, 1) 1", + "test ct2 PRIMARY 1 (2, 2) 1" + ], + [ + "test tint a 0 0 3 1 3 5 0", + "test tint a 0 1 6 1 6 8 0", + "test tint b 0 0 3 1 3 5 0", + "test tint b 0 1 6 1 6 8 0", + "test tint c 0 0 3 1 3 5 0", + "test tint c 0 1 6 1 6 8 0", + "test tint singular 1 0 2 1 1 4 2", + "test tint singular 1 1 6 1 5 8 4", + "test tint multi 1 0 2 1 (1, 1) (4, 4) 2", + "test tint multi 1 1 6 1 (5, 5) (8, 8) 4", + "test tdouble a 0 0 3 1 3 5 0", + "test tdouble a 0 1 6 1 6 8 0", + "test tdouble b 0 0 3 1 3 5 0", + "test tdouble b 0 1 6 1 6 8 0", + "test tdouble c 0 0 3 1 3 5 0", + "test tdouble c 0 1 6 1 6 8 0", + "test tdouble singular 1 0 2 1 1 4 2", + "test tdouble singular 1 1 6 1 5 8 4", + "test tdouble multi 1 0 2 1 (1, 1) (4, 4) 2", + "test tdouble multi 1 1 6 1 (5, 5) (8, 8) 4", + "test tdecimal a 0 0 3 1 3.00000000000000000000 5.00000000000000000000 0", + "test tdecimal a 0 1 6 1 6.00000000000000000000 8.00000000000000000000 0", + "test tdecimal b 0 0 3 1 3.00000000000000000000 5.00000000000000000000 0", + "test tdecimal b 0 1 6 1 6.00000000000000000000 8.00000000000000000000 0", + "test tdecimal c 0 0 3 1 3.00000000000000000000 5.00000000000000000000 0", + "test tdecimal c 0 1 6 1 6.00000000000000000000 8.00000000000000000000 0", + "test tdecimal singular 1 0 2 1 1.00000000000000000000 4.00000000000000000000 2", + "test tdecimal singular 1 1 6 1 5.00000000000000000000 8.00000000000000000000 4", + "test tdecimal multi 1 0 2 1 (1.00000000000000000000, 1.00000000000000000000) (4.00000000000000000000, 4.00000000000000000000) 2", + "test tdecimal multi 1 1 6 1 (5.00000000000000000000, 5.00000000000000000000) (8.00000000000000000000, 8.00000000000000000000) 4", + "test tstring a 0 0 3 1 3 5 0", + "test tstring a 0 1 6 1 6 8 0", + "test tstring b 0 0 3 1 3 5 0", + "test tstring b 0 1 6 1 6 8 0", + "test tstring c 0 0 3 1 3 5 0", + "test tstring c 0 1 6 1 6 8 0", + "test tstring singular 1 0 2 1 1 4 2", + "test tstring singular 1 1 6 1 5 8 4", + "test tstring multi 1 0 2 1 (1, 1) (4, 4) 2", + "test tstring multi 1 1 6 1 (5, 5) (8, 8) 4", + "test tdatetime a 0 0 1 1 2001-01-03 00:00:00 2001-01-03 00:00:00 0", + "test tdatetime a 0 1 2 1 2001-01-04 00:00:00 2001-01-04 00:00:00 0", + "test tdatetime b 0 0 1 1 2001-01-03 00:00:00 2001-01-03 00:00:00 0", + "test tdatetime b 0 1 2 1 2001-01-04 00:00:00 2001-01-04 00:00:00 0", + "test tdatetime c 0 0 1 1 2001-01-03 00:00:00 2001-01-03 00:00:00 0", + "test tdatetime c 0 1 2 1 2001-01-04 00:00:00 2001-01-04 00:00:00 0", + "test tdatetime singular 1 0 0 0 2001-01-01 00:00:00 2001-01-02 00:00:00 0", + "test tdatetime singular 1 1 2 1 2001-01-03 00:00:00 2001-01-04 00:00:00 2", + "test tdatetime multi 1 0 0 0 (2001-01-01 00:00:00, 2001-01-01 00:00:00) (2001-01-02 00:00:00, 2001-01-02 00:00:00) 0", + "test tdatetime multi 1 1 2 1 (2001-01-03 00:00:00, 2001-01-03 00:00:00) (2001-01-04 00:00:00, 2001-01-04 00:00:00) 2", + "test tprefix a 0 0 2 1 333 444 0", + "test tprefix a 0 1 4 1 555 666 0", + "test tprefix b 0 0 2 1 333 444 0", + "test tprefix b 0 1 4 1 555 666 0", + "test tprefix prefixa 1 0 0 0 11 22 0", + "test tprefix prefixa 1 1 2 1 33 44 2", + "test tprefix prefixa 1 2 4 1 55 66 2", + "test ct1 a 0 0 3 1 3 5 0", + "test ct1 a 0 1 6 1 6 8 0", + "test ct1 pk 0 0 3 1 3 5 0", + "test ct1 pk 0 1 6 1 6 8 0", + "test ct1 PRIMARY 1 0 2 1 1 4 2", + "test ct1 PRIMARY 1 1 6 1 5 8 4", + "test ct2 a 0 0 3 1 3 5 0", + "test ct2 a 0 1 6 1 6 8 0", + "test ct2 b 0 0 3 1 3 5 0", + "test ct2 b 0 1 6 1 6 8 0", + "test ct2 c 0 0 3 1 3 5 0", + "test ct2 c 0 1 6 1 6 8 0", + "test ct2 PRIMARY 1 0 2 1 (1, 1) (4, 4) 2", + "test ct2 PRIMARY 1 1 6 1 (5, 5) (8, 8) 4" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.a, 1)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.a, 4)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.a, 8)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:singular(a) range:[1,1], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:singular(a) range:[4,4], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:singular(a) range:[8,8], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:singular(a) range:[1.00000000000000000000,1.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:singular(a) range:[4.00000000000000000000,4.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:singular(a) range:[8.00000000000000000000,8.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.a, \"1\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.a, \"4\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.a, \"8\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.a, 2001-01-01 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.a, 2001-01-02 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.a, 2001-01-04 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tprefix.a, \"111\")", + " └─TableFullScan_5 6.00 cop[tikv] table:tprefix keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tprefix.a, \"444\")", + " └─TableFullScan_5 6.00 cop[tikv] table:tprefix keep order:false" + ], + [ + "IndexLookUp_11 0.00 root ", + "├─IndexRangeScan_8(Build) 0.00 cop[tikv] table:tprefix, index:prefixa(a) range:[\"88\",\"88\"], keep order:false", + "└─Selection_10(Probe) 0.00 cop[tikv] eq(test.tprefix.a, \"888\")", + " └─TableRowIDScan_9 0.00 cop[tikv] table:tprefix keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 1), eq(test.tint.c, 1)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 4), eq(test.tint.c, 4)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 8), eq(test.tint.c, 8)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[1 1,1 1], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[4 4,4 4], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[8 8,8 8], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[1.00000000000000000000 1.00000000000000000000,1.00000000000000000000 1.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[4.00000000000000000000 4.00000000000000000000,4.00000000000000000000 4.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[8.00000000000000000000 8.00000000000000000000,8.00000000000000000000 8.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"1\"), eq(test.tstring.c, \"1\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"4\"), eq(test.tstring.c, \"4\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"8\"), eq(test.tstring.c, \"8\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-01 00:00:00.000000), eq(test.tdatetime.c, 2001-01-01 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-02 00:00:00.000000), eq(test.tdatetime.c, 2001-01-02 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-04 00:00:00.000000), eq(test.tdatetime.c, 2001-01-04 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 1)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 4)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tint.b, 8)", + " └─TableFullScan_5 8.00 cop[tikv] table:tint keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[1,1], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[4,4], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdouble, index:multi(b, c) range:[8,8], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdouble keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[1.00000000000000000000,1.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[4.00000000000000000000,4.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "IndexLookUp_10 1.00 root ", + "├─IndexRangeScan_8(Build) 1.00 cop[tikv] table:tdecimal, index:multi(b, c) range:[8.00000000000000000000,8.00000000000000000000], keep order:false", + "└─TableRowIDScan_9(Probe) 1.00 cop[tikv] table:tdecimal keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"1\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"4\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tstring.b, \"8\")", + " └─TableFullScan_5 8.00 cop[tikv] table:tstring keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-01 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-02 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_7 1.00 root data:Selection_6", + "└─Selection_6 1.00 cop[tikv] eq(test.tdatetime.b, 2001-01-04 00:00:00.000000)", + " └─TableFullScan_5 4.00 cop[tikv] table:tdatetime keep order:false" + ], + [ + "TableReader_6 4.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 4.00 cop[tikv] table:ct1 range:[\"1\",\"4\"], keep order:false" + ], + [ + "TableReader_6 2.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 2.00 cop[tikv] table:ct1 range:[\"4\",\"6\"], keep order:false" + ], + [ + "TableReader_6 3.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 3.00 cop[tikv] table:ct1 range:[\"6\",\"8\"], keep order:false" + ], + [ + "TableReader_6 1.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 1.00 cop[tikv] table:ct2 range:[1 1,1 8], keep order:false" + ], + [ + "TableReader_6 1.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 1.00 cop[tikv] table:ct2 range:[4 1,4 8], keep order:false" + ], + [ + "TableReader_6 1.00 root data:TableRangeScan_5", + "└─TableRangeScan_5 1.00 cop[tikv] table:ct2 range:[8 1,8 8], keep order:false" + ] + ] + }, { "Name": "TestColumnIndexNullEstimation", "Cases": [ @@ -92,8 +507,8 @@ "Name": "TestCollationColumnEstimate", "Cases": [ [ - "test t a 0 0 2 2 \u0000A\u0000A\u0000A \u0000A\u0000A\u0000A", - "test t a 0 1 4 2 \u0000B\u0000B\u0000B \u0000B\u0000B\u0000B" + "test t a 0 0 2 2 \u0000A\u0000A\u0000A \u0000A\u0000A\u0000A 0", + "test t a 0 1 4 2 \u0000B\u0000B\u0000B \u0000B\u0000B\u0000B 0" ], [ "TableReader_7 2.00 root data:Selection_6", diff --git a/store/tikv/batch_coprocessor_test.go b/store/batch_coprocessor_test.go similarity index 87% rename from store/tikv/batch_coprocessor_test.go rename to store/batch_coprocessor_test.go index 11fffd6c330df..6ccf9cc21d3a3 100644 --- a/store/tikv/batch_coprocessor_test.go +++ b/store/batch_coprocessor_test.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv_test +package store import ( "context" @@ -27,8 +27,8 @@ import ( "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/util/testkit" ) @@ -41,20 +41,19 @@ var _ = SerialSuites(&testBatchCopSuite{}) func newStoreWithBootstrap(tiflashNum int) (kv.Storage, *domain.Domain, error) { store, err := mockstore.NewMockStore( mockstore.WithClusterInspector(func(c cluster.Cluster) { - mockCluster := c.(*mocktikv.Cluster) + mockCluster := c.(*unistore.Cluster) _, _, region1 := mockstore.BootstrapWithSingleStore(c) tiflashIdx := 0 for tiflashIdx < tiflashNum { store2 := c.AllocID() peer2 := c.AllocID() addr2 := fmt.Sprintf("tiflash%d", tiflashIdx) - mockCluster.AddStore(store2, addr2) - mockCluster.UpdateStoreAddr(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) + mockCluster.AddStore(store2, addr2, &metapb.StoreLabel{Key: "engine", Value: "tiflash"}) mockCluster.AddPeer(region1, store2, peer2) tiflashIdx++ } }), - mockstore.WithStoreType(mockstore.MockTiKV), + mockstore.WithStoreType(mockstore.EmbedUnistore), ) if err != nil { @@ -104,16 +103,16 @@ func (s *testBatchCopSuite) TestStoreErr(c *C) { tk.MustExec("insert into t values(1,0)") tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/BatchCopCancelled", "1*return(true)"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopCancelled", "1*return(true)"), IsNil) err = tk.QueryToErr("select count(*) from t") c.Assert(errors.Cause(err), Equals, context.Canceled) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/BatchCopRpcErrtiflash0", "1*return(\"tiflash0\")"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0", "1*return(\"tiflash0\")"), IsNil) tk.MustQuery("select count(*) from t").Check(testkit.Rows("1")) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) err = tk.QueryToErr("select count(*) from t") c.Assert(err, NotNil) } @@ -139,11 +138,11 @@ func (s *testBatchCopSuite) TestStoreSwitchPeer(c *C) { tk.MustExec("insert into t values(1,0)") tk.MustExec("set @@session.tidb_isolation_read_engines=\"tiflash\"") - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash0", "return(\"tiflash0\")"), IsNil) tk.MustQuery("select count(*) from t").Check(testkit.Rows("1")) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/BatchCopRpcErrtiflash1", "return(\"tiflash1\")"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/BatchCopRpcErrtiflash1", "return(\"tiflash1\")"), IsNil) err = tk.QueryToErr("select count(*) from t") c.Assert(err, NotNil) diff --git a/store/tikv/batch_coprocessor.go b/store/copr/batch_coprocessor.go similarity index 72% rename from store/tikv/batch_coprocessor.go rename to store/copr/batch_coprocessor.go index 59db552d4a0de..e5ce311030425 100644 --- a/store/tikv/batch_coprocessor.go +++ b/store/copr/batch_coprocessor.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv +package copr import ( "context" @@ -25,8 +25,11 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/util/memory" "go.uber.org/zap" ) @@ -90,25 +93,25 @@ func (rs *batchCopResponse) RespTime() time.Duration { type copTaskAndRPCContext struct { task *copTask - ctx *RPCContext + ctx *tikv.RPCContext } -func buildBatchCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, req *kv.Request) ([]*batchCopTask, error) { +func buildBatchCopTasks(bo *tikv.Backoffer, cache *tikv.RegionCache, ranges *tikv.KeyRanges, storeType kv.StoreType) ([]*batchCopTask, error) { start := time.Now() const cmdType = tikvrpc.CmdBatchCop - rangesLen := ranges.len() + rangesLen := ranges.Len() for { var tasks []*copTask - appendTask := func(regionWithRangeInfo *KeyLocation, ranges *copRanges) { + appendTask := func(regionWithRangeInfo *tikv.KeyLocation, ranges *tikv.KeyRanges) { tasks = append(tasks, &copTask{ region: regionWithRangeInfo.Region, ranges: ranges, cmdType: cmdType, - storeType: req.StoreType, + storeType: storeType, }) } - err := splitRanges(bo, cache, ranges, appendTask) + err := tikv.SplitKeyRanges(bo, cache, ranges, appendTask) if err != nil { return nil, errors.Trace(err) } @@ -126,12 +129,10 @@ func buildBatchCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, re // of date and already be cleaned up. We should retry and generate new tasks. if rpcCtx == nil { needRetry = true - err = bo.Backoff(BoRegionMiss, errors.New("Cannot find region or TiFlash peer")) - logutil.BgLogger().Info("retry for TiFlash peer or region missing", zap.Uint64("region id", task.region.GetID())) - if err != nil { - return nil, errors.Trace(err) - } - break + logutil.BgLogger().Info("retry for TiFlash peer with region missing", zap.Uint64("region id", task.region.GetID())) + // Probably all the regions are invalid. Make the loop continue and mark all the regions invalid. + // Then `splitRegion` will reloads these regions. + continue } if batchCop, ok := storeTaskMap[rpcCtx.Addr]; ok { batchCop.copTasks = append(batchCop.copTasks, copTaskAndRPCContext{task: task, ctx: rpcCtx}) @@ -145,6 +146,11 @@ func buildBatchCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, re } } if needRetry { + // Backoff once for each retry. + err = bo.Backoff(tikv.BoRegionMiss, errors.New("Cannot find region with TiFlash peer")) + if err != nil { + return nil, errors.Trace(err) + } continue } for _, task := range storeTaskMap { @@ -157,7 +163,7 @@ func buildBatchCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, re zap.Int("range len", rangesLen), zap.Int("task len", len(batchTasks))) } - tikvTxnRegionsNumHistogramWithBatchCoprocessor.Observe(float64(len(batchTasks))) + metrics.TxnRegionsNumHistogramWithBatchCoprocessor.Observe(float64(len(batchTasks))) return batchTasks, nil } } @@ -166,27 +172,22 @@ func (c *CopClient) sendBatch(ctx context.Context, req *kv.Request, vars *kv.Var if req.KeepOrder || req.Desc { return copErrorResponse{errors.New("batch coprocessor cannot prove keep order or desc property")} } - ctx = context.WithValue(ctx, txnStartKey, req.StartTs) - bo := NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) - tasks, err := buildBatchCopTasks(bo, c.store.regionCache, &copRanges{mid: req.KeyRanges}, req) + ctx = context.WithValue(ctx, tikv.TxnStartKey, req.StartTs) + bo := tikv.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) + tasks, err := buildBatchCopTasks(bo, c.store.GetRegionCache(), tikv.NewKeyRanges(req.KeyRanges), req.StoreType) if err != nil { return copErrorResponse{err} } it := &batchCopIterator{ - store: c.store, - req: req, - finishCh: make(chan struct{}), - vars: vars, - memTracker: req.MemTracker, - clientHelper: clientHelper{ - LockResolver: c.store.lockResolver, - RegionCache: c.store.regionCache, - Client: c.store.client, - minCommitTSPushed: &minCommitTSPushed{data: make(map[uint64]struct{}, 5)}, - }, - rpcCancel: NewRPCanceller(), + store: c.store.KVStore, + req: req, + finishCh: make(chan struct{}), + vars: vars, + memTracker: req.MemTracker, + ClientHelper: tikv.NewClientHelper(c.store.KVStore, util.NewTSSet(5)), + rpcCancel: tikv.NewRPCanceller(), } - ctx = context.WithValue(ctx, RPCCancellerCtxKey{}, it.rpcCancel) + ctx = context.WithValue(ctx, tikv.RPCCancellerCtxKey{}, it.rpcCancel) it.tasks = tasks it.respChan = make(chan *batchCopResponse, 2048) go it.run(ctx) @@ -194,9 +195,9 @@ func (c *CopClient) sendBatch(ctx context.Context, req *kv.Request, vars *kv.Var } type batchCopIterator struct { - clientHelper + *tikv.ClientHelper - store *tikvStore + store *tikv.KVStore req *kv.Request finishCh chan struct{} @@ -209,9 +210,7 @@ type batchCopIterator struct { memTracker *memory.Tracker - replicaReadSeed uint32 - - rpcCancel *RPCCanceller + rpcCancel *tikv.RPCCanceller wg sync.WaitGroup // closed represents when the Close is called. @@ -224,7 +223,7 @@ func (b *batchCopIterator) run(ctx context.Context) { // We run workers for every batch cop. for _, task := range b.tasks { b.wg.Add(1) - bo := NewBackofferWithVars(ctx, copNextMaxBackoff, b.vars) + bo := tikv.NewBackofferWithVars(ctx, copNextMaxBackoff, b.vars) go b.handleTask(ctx, bo, task) } b.wg.Wait() @@ -266,7 +265,7 @@ func (b *batchCopIterator) recvFromRespCh(ctx context.Context) (resp *batchCopRe return case <-ticker.C: if atomic.LoadUint32(b.vars.Killed) == 1 { - resp = &batchCopResponse{err: ErrQueryInterrupted} + resp = &batchCopResponse{err: tikv.ErrQueryInterrupted} ok = true return } @@ -294,8 +293,7 @@ func (b *batchCopIterator) Close() error { return nil } -func (b *batchCopIterator) handleTask(ctx context.Context, bo *Backoffer, task *batchCopTask) { - logutil.BgLogger().Debug("handle batch task") +func (b *batchCopIterator) handleTask(ctx context.Context, bo *tikv.Backoffer, task *batchCopTask) { tasks := []*batchCopTask{task} for idx := 0; idx < len(tasks); idx++ { ret, err := b.handleTaskOnce(ctx, bo, tasks[idx]) @@ -310,28 +308,27 @@ func (b *batchCopIterator) handleTask(ctx context.Context, bo *Backoffer, task * } // Merge all ranges and request again. -func (b *batchCopIterator) retryBatchCopTask(ctx context.Context, bo *Backoffer, batchTask *batchCopTask) ([]*batchCopTask, error) { - ranges := &copRanges{} +func (b *batchCopIterator) retryBatchCopTask(ctx context.Context, bo *tikv.Backoffer, batchTask *batchCopTask) ([]*batchCopTask, error) { + var ranges []kv.KeyRange for _, taskCtx := range batchTask.copTasks { - taskCtx.task.ranges.do(func(ran *kv.KeyRange) { - ranges.mid = append(ranges.mid, *ran) + taskCtx.task.ranges.Do(func(ran *kv.KeyRange) { + ranges = append(ranges, *ran) }) } - return buildBatchCopTasks(bo, b.RegionCache, ranges, b.req) + return buildBatchCopTasks(bo, b.store.GetRegionCache(), tikv.NewKeyRanges(ranges), b.req.StoreType) } -func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *Backoffer, task *batchCopTask) ([]*batchCopTask, error) { - logutil.BgLogger().Debug("handle batch task once") - sender := NewRegionBatchRequestSender(b.store.regionCache, b.store.client) +func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *tikv.Backoffer, task *batchCopTask) ([]*batchCopTask, error) { + sender := NewRegionBatchRequestSender(b.store.GetRegionCache(), b.store.GetTiKVClient()) var regionInfos []*coprocessor.RegionInfo for _, task := range task.copTasks { regionInfos = append(regionInfos, &coprocessor.RegionInfo{ - RegionId: task.task.region.id, + RegionId: task.task.region.GetID(), RegionEpoch: &metapb.RegionEpoch{ - ConfVer: task.task.region.confVer, - Version: task.task.region.ver, + ConfVer: task.task.region.GetConfVer(), + Version: task.task.region.GetVer(), }, - Ranges: task.task.ranges.toPBRanges(), + Ranges: task.task.ranges.ToPBRanges(), }) } @@ -344,17 +341,17 @@ func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *Backoffer, ta } req := tikvrpc.NewRequest(task.cmdType, &copReq, kvrpcpb.Context{ - IsolationLevel: pbIsolationLevel(b.req.IsolationLevel), - Priority: kvPriorityToCommandPri(b.req.Priority), + IsolationLevel: tikv.IsolationLevelToPB(b.req.IsolationLevel), + Priority: tikv.PriorityToPB(b.req.Priority), NotFillCache: b.req.NotFillCache, - HandleTime: true, - ScanDetail: true, + RecordTimeStat: true, + RecordScanStat: true, TaskId: b.req.TaskID, }) req.StoreTp = kv.TiFlash logutil.BgLogger().Debug("send batch request to ", zap.String("req info", req.String()), zap.Int("cop task len", len(task.copTasks))) - resp, retry, cancel, err := sender.sendStreamReqToAddr(bo, task.copTasks, req, ReadTimeoutUltraLong) + resp, retry, cancel, err := sender.sendStreamReqToAddr(bo, task.copTasks, req, tikv.ReadTimeoutUltraLong) // If there are store errors, we should retry for all regions. if retry { return b.retryBatchCopTask(ctx, bo, task) @@ -366,7 +363,7 @@ func (b *batchCopIterator) handleTaskOnce(ctx context.Context, bo *Backoffer, ta return nil, b.handleStreamedBatchCopResponse(ctx, bo, resp.Resp.(*tikvrpc.BatchCopStreamResponse), task) } -func (b *batchCopIterator) handleStreamedBatchCopResponse(ctx context.Context, bo *Backoffer, response *tikvrpc.BatchCopStreamResponse, task *batchCopTask) (err error) { +func (b *batchCopIterator) handleStreamedBatchCopResponse(ctx context.Context, bo *tikv.Backoffer, response *tikvrpc.BatchCopStreamResponse, task *batchCopTask) (err error) { defer response.Close() resp := response.BatchResponse if resp == nil { @@ -384,7 +381,7 @@ func (b *batchCopIterator) handleStreamedBatchCopResponse(ctx context.Context, b return nil } - if err1 := bo.Backoff(boTiKVRPC, errors.Errorf("recv stream response error: %v, task store addr: %s", err, task.storeAddr)); err1 != nil { + if err1 := bo.Backoff(tikv.BoTiKVRPC, errors.Errorf("recv stream response error: %v, task store addr: %s", err, task.storeAddr)); err1 != nil { return errors.Trace(err) } @@ -394,12 +391,12 @@ func (b *batchCopIterator) handleStreamedBatchCopResponse(ctx context.Context, b } else { logutil.BgLogger().Info("stream unknown error", zap.Error(err)) } - return errors.Trace(err) + return tikv.ErrTiFlashServerTimeout } } } -func (b *batchCopIterator) handleBatchCopResponse(bo *Backoffer, response *coprocessor.BatchResponse, task *batchCopTask) (err error) { +func (b *batchCopIterator) handleBatchCopResponse(bo *tikv.Backoffer, response *coprocessor.BatchResponse, task *batchCopTask) (err error) { if otherErr := response.GetOtherError(); otherErr != "" { err = errors.Errorf("other error: %s", otherErr) logutil.BgLogger().Warn("other error", @@ -414,13 +411,14 @@ func (b *batchCopIterator) handleBatchCopResponse(bo *Backoffer, response *copro detail: new(CopRuntimeStats), } - resp.detail.BackoffTime = time.Duration(bo.totalSleep) * time.Millisecond - resp.detail.BackoffSleep = make(map[string]time.Duration, len(bo.backoffTimes)) - resp.detail.BackoffTimes = make(map[string]int, len(bo.backoffTimes)) - for backoff := range bo.backoffTimes { + backoffTimes := bo.GetBackoffTimes() + resp.detail.BackoffTime = time.Duration(bo.GetTotalSleep()) * time.Millisecond + resp.detail.BackoffSleep = make(map[string]time.Duration, len(backoffTimes)) + resp.detail.BackoffTimes = make(map[string]int, len(backoffTimes)) + for backoff := range backoffTimes { backoffName := backoff.String() - resp.detail.BackoffTimes[backoffName] = bo.backoffTimes[backoff] - resp.detail.BackoffSleep[backoffName] = time.Duration(bo.backoffSleepMS[backoff]) * time.Millisecond + resp.detail.BackoffTimes[backoffName] = backoffTimes[backoff] + resp.detail.BackoffSleep[backoffName] = time.Duration(bo.GetBackoffSleepMS()[backoff]) * time.Millisecond } resp.detail.CalleeAddress = task.storeAddr diff --git a/store/copr/batch_request_sender.go b/store/copr/batch_request_sender.go new file mode 100644 index 0000000000000..7865380f56ee5 --- /dev/null +++ b/store/copr/batch_request_sender.go @@ -0,0 +1,90 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package copr + +import ( + "context" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/tikvrpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// RegionBatchRequestSender sends BatchCop requests to TiFlash server by stream way. +type RegionBatchRequestSender struct { + *tikv.RegionRequestSender +} + +// NewRegionBatchRequestSender creates a RegionBatchRequestSender object. +func NewRegionBatchRequestSender(cache *tikv.RegionCache, client tikv.Client) *RegionBatchRequestSender { + return &RegionBatchRequestSender{ + RegionRequestSender: tikv.NewRegionRequestSender(cache, client), + } +} + +func (ss *RegionBatchRequestSender) sendStreamReqToAddr(bo *tikv.Backoffer, ctxs []copTaskAndRPCContext, req *tikvrpc.Request, timout time.Duration) (resp *tikvrpc.Response, retry bool, cancel func(), err error) { + // use the first ctx to send request, because every ctx has same address. + cancel = func() {} + rpcCtx := ctxs[0].ctx + if e := tikvrpc.SetContext(req, rpcCtx.Meta, rpcCtx.Peer); e != nil { + return nil, false, cancel, errors.Trace(e) + } + ctx := bo.GetCtx() + if rawHook := ctx.Value(tikv.RPCCancellerCtxKey{}); rawHook != nil { + ctx, cancel = rawHook.(*tikv.RPCCanceller).WithCancel(ctx) + } + start := time.Now() + resp, err = ss.GetClient().SendRequest(ctx, rpcCtx.Addr, req, timout) + if ss.Stats != nil { + tikv.RecordRegionRequestRuntimeStats(ss.Stats, req.Type, time.Since(start)) + } + if err != nil { + cancel() + ss.SetRPCError(err) + e := ss.onSendFail(bo, ctxs, err) + if e != nil { + return nil, false, func() {}, errors.Trace(e) + } + return nil, true, func() {}, nil + } + // We don't need to process region error or lock error. Because TiFlash will retry by itself. + return +} + +func (ss *RegionBatchRequestSender) onSendFail(bo *tikv.Backoffer, ctxs []copTaskAndRPCContext, err error) error { + // If it failed because the context is cancelled by ourself, don't retry. + if errors.Cause(err) == context.Canceled || status.Code(errors.Cause(err)) == codes.Canceled { + return errors.Trace(err) + } else if atomic.LoadUint32(&tikv.ShuttingDown) > 0 { + return tikv.ErrTiDBShuttingDown + } + + for _, failedCtx := range ctxs { + ctx := failedCtx.ctx + if ctx.Meta != nil { + ss.GetRegionCache().OnSendFail(bo, ctx, ss.NeedReloadRegion(ctx), err) + } + } + + // Retry on send request failure when it's not canceled. + // When a store is not available, the leader of related region should be elected quickly. + // TODO: the number of retry time should be limited:since region may be unavailable + // when some unrecoverable disaster happened. + err = bo.Backoff(tikv.BoTiFlashRPC, errors.Errorf("send tikv request error: %v, ctxs: %v, try next peer later", err, ctxs)) + return errors.Trace(err) +} diff --git a/store/tikv/coprocessor.go b/store/copr/coprocessor.go similarity index 59% rename from store/tikv/coprocessor.go rename to store/copr/coprocessor.go index e730cdf43cc85..90427eed8d217 100644 --- a/store/tikv/coprocessor.go +++ b/store/copr/coprocessor.go @@ -11,14 +11,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv +package copr import ( - "bytes" "context" "fmt" "io" - "sort" "strconv" "strings" "sync" @@ -36,37 +34,42 @@ import ( "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + tidbmetrics "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" ) -var ( - tikvTxnRegionsNumHistogramWithCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("coprocessor") - tikvTxnRegionsNumHistogramWithBatchCoprocessor = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("batch_coprocessor") - coprCacheHistogramEvict = metrics.DistSQLCoprCacheHistogram.WithLabelValues("evict") +var coprCacheHistogramEvict = tidbmetrics.DistSQLCoprCacheHistogram.WithLabelValues("evict") + +// Maximum total sleep time(in ms) for kv/cop commands. +const ( + copBuildTaskMaxBackoff = 5000 + copNextMaxBackoff = 20000 ) // CopClient is coprocessor client. type CopClient struct { kv.RequestTypeSupportedChecker - store *tikvStore + store *Store replicaReadSeed uint32 } // Send builds the request and gets the coprocessor iterator response. -func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variables, sessionMemTracker *memory.Tracker) kv.Response { +func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variables, sessionMemTracker *memory.Tracker, enabledRateLimitAction bool) kv.Response { if req.StoreType == kv.TiFlash && req.BatchCop { logutil.BgLogger().Debug("send batch requests") return c.sendBatch(ctx, req, vars) } - ctx = context.WithValue(ctx, txnStartKey, req.StartTs) - bo := NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) - tasks, err := buildCopTasks(bo, c.store.regionCache, &copRanges{mid: req.KeyRanges}, req) + ctx = context.WithValue(ctx, tikv.TxnStartKey, req.StartTs) + bo := tikv.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, vars) + tasks, err := buildCopTasks(bo, c.store.GetRegionCache(), tikv.NewKeyRanges(req.KeyRanges), req) if err != nil { return copErrorResponse{err} } @@ -78,11 +81,9 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variable vars: vars, memTracker: req.MemTracker, replicaReadSeed: c.replicaReadSeed, - rpcCancel: NewRPCanceller(), - maxID: &maxIDHandler{}, + rpcCancel: tikv.NewRPCanceller(), + resolvedLocks: util.NewTSSet(5), } - it.maxID.maxID = 0 - it.minCommitTSPushed.data = make(map[uint64]struct{}, 5) it.tasks = tasks if it.concurrency > len(tasks) { it.concurrency = len(tasks) @@ -93,28 +94,35 @@ func (c *CopClient) Send(ctx context.Context, req *kv.Request, vars *kv.Variable } if it.req.KeepOrder { - it.sendRate = newRateLimit(2 * it.concurrency) + it.sendRate = util.NewRateLimit(2 * it.concurrency) + it.respChan = nil } else { - it.respChan = make(chan *copResponse, it.concurrency) - it.sendRate = newRateLimit(it.concurrency) + capacity := it.concurrency + if enabledRateLimitAction { + // The count of cached response in memory is controlled by the capacity of the it.sendRate, not capacity of the respChan. + // As the worker will send finCopResponse after each task being handled, we make the capacity of the respCh equals to + // 2*it.concurrency to avoid deadlock in the unit test caused by the `MustExec` or `Exec` + capacity = it.concurrency * 2 + } + it.respChan = make(chan *copResponse, capacity) + it.sendRate = util.NewRateLimit(it.concurrency) } - it.actionOnExceed = newRateLimitAction(uint(cap(it.sendRate.token)), sync.NewCond(&sync.Mutex{})) + it.actionOnExceed = newRateLimitAction(uint(it.sendRate.GetCapacity())) if sessionMemTracker != nil { sessionMemTracker.FallbackOldAndSetNewAction(it.actionOnExceed) } if !it.req.Streaming { - ctx = context.WithValue(ctx, RPCCancellerCtxKey{}, it.rpcCancel) + ctx = context.WithValue(ctx, tikv.RPCCancellerCtxKey{}, it.rpcCancel) } - it.open(ctx) + it.open(ctx, enabledRateLimitAction) return it } // copTask contains a related Region and KeyRange for a kv.Request. type copTask struct { - id uint32 - region RegionVerID - ranges *copRanges + region tikv.RegionVerID + ranges *tikv.KeyRanges respChan chan *copResponse storeAddr string @@ -124,123 +132,13 @@ type copTask struct { func (r *copTask) String() string { return fmt.Sprintf("region(%d %d %d) ranges(%d) store(%s)", - r.region.id, r.region.confVer, r.region.ver, r.ranges.len(), r.storeAddr) -} - -// copRanges is like []kv.KeyRange, but may has extra elements at head/tail. -// It's for avoiding alloc big slice during build copTask. -type copRanges struct { - first *kv.KeyRange - mid []kv.KeyRange - last *kv.KeyRange -} - -func (r *copRanges) String() string { - var s string - r.do(func(ran *kv.KeyRange) { - s += fmt.Sprintf("[%q, %q]", ran.StartKey, ran.EndKey) - }) - return s -} - -func (r *copRanges) len() int { - var l int - if r.first != nil { - l++ - } - l += len(r.mid) - if r.last != nil { - l++ - } - return l -} - -func (r *copRanges) at(i int) kv.KeyRange { - if r.first != nil { - if i == 0 { - return *r.first - } - i-- - } - if i < len(r.mid) { - return r.mid[i] - } - return *r.last -} - -func (r *copRanges) slice(from, to int) *copRanges { - var ran copRanges - if r.first != nil { - if from == 0 && to > 0 { - ran.first = r.first - } - if from > 0 { - from-- - } - if to > 0 { - to-- - } - } - if to <= len(r.mid) { - ran.mid = r.mid[from:to] - } else { - if from <= len(r.mid) { - ran.mid = r.mid[from:] - } - if from < to { - ran.last = r.last - } - } - return &ran -} - -func (r *copRanges) do(f func(ran *kv.KeyRange)) { - if r.first != nil { - f(r.first) - } - for _, ran := range r.mid { - f(&ran) - } - if r.last != nil { - f(r.last) - } -} - -func (r *copRanges) toPBRanges() []*coprocessor.KeyRange { - ranges := make([]*coprocessor.KeyRange, 0, r.len()) - r.do(func(ran *kv.KeyRange) { - ranges = append(ranges, &coprocessor.KeyRange{ - Start: ran.StartKey, - End: ran.EndKey, - }) - }) - return ranges -} - -// split ranges into (left, right) by key. -func (r *copRanges) split(key []byte) (*copRanges, *copRanges) { - n := sort.Search(r.len(), func(i int) bool { - cur := r.at(i) - return len(cur.EndKey) == 0 || bytes.Compare(cur.EndKey, key) > 0 - }) - // If a range p contains the key, it will split to 2 parts. - if n < r.len() { - p := r.at(n) - if bytes.Compare(key, p.StartKey) > 0 { - left := r.slice(0, n) - left.last = &kv.KeyRange{StartKey: p.StartKey, EndKey: key} - right := r.slice(n+1, r.len()) - right.first = &kv.KeyRange{StartKey: key, EndKey: p.EndKey} - return left, right - } - } - return r.slice(0, n), r.slice(n, r.len()) + r.region.GetID(), r.region.GetConfVer(), r.region.GetVer(), r.ranges.Len(), r.storeAddr) } // rangesPerTask limits the length of the ranges slice sent in one copTask. const rangesPerTask = 25000 -func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, req *kv.Request) ([]*copTask, error) { +func buildCopTasks(bo *tikv.Backoffer, cache *tikv.RegionCache, ranges *tikv.KeyRanges, req *kv.Request) ([]*copTask, error) { start := time.Now() cmdType := tikvrpc.CmdCop if req.Streaming { @@ -251,17 +149,17 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, req *kv return buildTiDBMemCopTasks(ranges, req) } - rangesLen := ranges.len() + rangesLen := ranges.Len() var tasks []*copTask - appendTask := func(regionWithRangeInfo *KeyLocation, ranges *copRanges) { + appendTask := func(regionWithRangeInfo *tikv.KeyLocation, ranges *tikv.KeyRanges) { // TiKV will return gRPC error if the message is too large. So we need to limit the length of the ranges slice // to make sure the message can be sent successfully. - rLen := ranges.len() + rLen := ranges.Len() for i := 0; i < rLen; { nextI := mathutil.Min(i+rangesPerTask, rLen) tasks = append(tasks, &copTask{ region: regionWithRangeInfo.Region, - ranges: ranges.slice(i, nextI), + ranges: ranges.Slice(i, nextI), // Channel buffer is 2 for handling region split. // In a common case, two region split tasks will not be blocked. respChan: make(chan *copResponse, 2), @@ -272,7 +170,7 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, req *kv } } - err := splitRanges(bo, cache, ranges, appendTask) + err := tikv.SplitKeyRanges(bo, cache, ranges, appendTask) if err != nil { return nil, errors.Trace(err) } @@ -286,11 +184,11 @@ func buildCopTasks(bo *Backoffer, cache *RegionCache, ranges *copRanges, req *kv zap.Int("range len", rangesLen), zap.Int("task len", len(tasks))) } - tikvTxnRegionsNumHistogramWithCoprocessor.Observe(float64(len(tasks))) + metrics.TxnRegionsNumHistogramWithCoprocessor.Observe(float64(len(tasks))) return tasks, nil } -func buildTiDBMemCopTasks(ranges *copRanges, req *kv.Request) ([]*copTask, error) { +func buildTiDBMemCopTasks(ranges *tikv.KeyRanges, req *kv.Request) ([]*copTask, error) { servers, err := infosync.GetAllServerInfo(context.Background()) if err != nil { return nil, err @@ -301,6 +199,10 @@ func buildTiDBMemCopTasks(ranges *copRanges, req *kv.Request) ([]*copTask, error } tasks := make([]*copTask, 0, len(servers)) for _, ser := range servers { + if req.TiDBServerID > 0 && req.TiDBServerID != ser.ServerIDGetter() { + continue + } + addr := ser.IP + ":" + strconv.FormatUint(uint64(ser.StatusPort), 10) tasks = append(tasks, &copTask{ ranges: ranges, @@ -313,71 +215,6 @@ func buildTiDBMemCopTasks(ranges *copRanges, req *kv.Request) ([]*copTask, error return tasks, nil } -func splitRanges(bo *Backoffer, cache *RegionCache, ranges *copRanges, fn func(regionWithRangeInfo *KeyLocation, ranges *copRanges)) error { - for ranges.len() > 0 { - loc, err := cache.LocateKey(bo, ranges.at(0).StartKey) - if err != nil { - return errors.Trace(err) - } - - // Iterate to the first range that is not complete in the region. - var i int - for ; i < ranges.len(); i++ { - r := ranges.at(i) - if !(loc.Contains(r.EndKey) || bytes.Equal(loc.EndKey, r.EndKey)) { - break - } - } - // All rest ranges belong to the same region. - if i == ranges.len() { - fn(loc, ranges) - break - } - - r := ranges.at(i) - if loc.Contains(r.StartKey) { - // Part of r is not in the region. We need to split it. - taskRanges := ranges.slice(0, i) - taskRanges.last = &kv.KeyRange{ - StartKey: r.StartKey, - EndKey: loc.EndKey, - } - fn(loc, taskRanges) - - ranges = ranges.slice(i+1, ranges.len()) - ranges.first = &kv.KeyRange{ - StartKey: loc.EndKey, - EndKey: r.EndKey, - } - } else { - // rs[i] is not in the region. - taskRanges := ranges.slice(0, i) - fn(loc, taskRanges) - ranges = ranges.slice(i, ranges.len()) - } - } - - return nil -} - -// SplitRegionRanges get the split ranges from pd region. -func SplitRegionRanges(bo *Backoffer, cache *RegionCache, keyRanges []kv.KeyRange) ([]kv.KeyRange, error) { - ranges := copRanges{mid: keyRanges} - - var ret []kv.KeyRange - appendRange := func(regionWithRangeInfo *KeyLocation, ranges *copRanges) { - for i := 0; i < ranges.len(); i++ { - ret = append(ret, ranges.at(i)) - } - } - - err := splitRanges(bo, cache, &ranges, appendRange) - if err != nil { - return nil, errors.Trace(err) - } - return ret, nil -} - func reverseTasks(tasks []*copTask) { for i := 0; i < len(tasks)/2; i++ { j := len(tasks) - i - 1 @@ -386,7 +223,7 @@ func reverseTasks(tasks []*copTask) { } type copIterator struct { - store *tikvStore + store *Store req *kv.Request concurrency int finishCh chan struct{} @@ -396,11 +233,8 @@ type copIterator struct { // curr indicates the curr id of the finished copTask curr int - // maxID indicates the max id of the running copTask - maxID *maxIDHandler - // sendRate controls the sending rate of copIteratorTaskSender - sendRate *rateLimit + sendRate *util.RateLimit // Otherwise, results are stored in respChan. respChan chan *copResponse @@ -411,7 +245,7 @@ type copIterator struct { replicaReadSeed uint32 - rpcCancel *RPCCanceller + rpcCancel *tikv.RPCCanceller wg sync.WaitGroup // closed represents when the Close is called. @@ -419,7 +253,7 @@ type copIterator struct { // when the Close is called. we use atomic.CompareAndSwap `closed` to to make sure the channel is not closed twice. closed uint32 - minCommitTSPushed + resolvedLocks *util.TSSet actionOnExceed *rateLimitAction } @@ -428,22 +262,18 @@ type copIterator struct { type copIteratorWorker struct { taskCh <-chan *copTask wg *sync.WaitGroup - store *tikvStore + store *Store req *kv.Request respChan chan<- *copResponse finishCh <-chan struct{} vars *kv.Variables - clientHelper + *tikv.ClientHelper memTracker *memory.Tracker replicaReadSeed uint32 - sendRate *rateLimit - actionOnExceed *rateLimitAction - - maxID *maxIDHandler } // copIteratorTaskSender sends tasks to taskCh then wait for the workers to exit. @@ -453,7 +283,7 @@ type copIteratorTaskSender struct { tasks []*copTask finishCh <-chan struct{} respChan chan<- *copResponse - sendRate *rateLimit + sendRate *util.RateLimit } type copResponse struct { @@ -465,10 +295,7 @@ type copResponse struct { respTime time.Duration } -const ( - sizeofExecDetails = int(unsafe.Sizeof(execdetails.ExecDetails{})) - sizeofCommitDetails = int(unsafe.Sizeof(execdetails.CommitDetails{})) -) +const sizeofExecDetails = int(unsafe.Sizeof(execdetails.ExecDetails{})) // GetData implements the kv.ResultSubset GetData interface. func (rs *copResponse) GetData() []byte { @@ -489,6 +316,9 @@ func (rs *copResponse) MemSize() int64 { if rs.respSize != 0 { return rs.respSize } + if rs == finCopResp { + return 0 + } // ignore rs.err rs.respSize += int64(cap(rs.startKey)) @@ -508,22 +338,39 @@ func (rs *copResponse) RespTime() time.Duration { const minLogCopTaskTime = 300 * time.Millisecond +// When the worker finished `handleTask`, we need to notify the copIterator that there is one task finished. +// For the non-keep-order case, we send a finCopResp into the respCh after `handleTask`. When copIterator recv +// finCopResp from the respCh, it will be aware that there is one task finished. +var finCopResp *copResponse + +func init() { + finCopResp = &copResponse{} +} + // run is a worker function that get a copTask from channel, handle it and // send the result back. func (worker *copIteratorWorker) run(ctx context.Context) { - defer worker.wg.Done() + defer func() { + failpoint.Inject("ticase-4169", func(val failpoint.Value) { + if val.(bool) { + worker.memTracker.Consume(10 * MockResponseSizeForTest) + worker.memTracker.Consume(10 * MockResponseSizeForTest) + } + }) + worker.wg.Done() + }() for task := range worker.taskCh { respCh := worker.respChan if respCh == nil { respCh = task.respChan } worker.handleTask(ctx, task, respCh) + if worker.respChan != nil { + // When a task is finished by the worker, send a finCopResp into channel to notify the copIterator that + // there is a task finished. + worker.sendToRespCh(finCopResp, worker.respChan, false) + } close(task.respChan) - worker.maxID.setMaxIDIfLarger(task.id) - worker.actionOnExceed.destroyTokenIfNeeded(func() { - worker.sendRate.putToken() - }) - worker.actionOnExceed.waitIfNeeded() if worker.vars != nil && worker.vars.Killed != nil && atomic.LoadUint32(worker.vars.Killed) == 1 { return } @@ -536,32 +383,23 @@ func (worker *copIteratorWorker) run(ctx context.Context) { } // open starts workers and sender goroutines. -func (it *copIterator) open(ctx context.Context) { +func (it *copIterator) open(ctx context.Context, enabledRateLimitAction bool) { taskCh := make(chan *copTask, 1) it.wg.Add(it.concurrency) // Start it.concurrency number of workers to handle cop requests. for i := 0; i < it.concurrency; i++ { worker := &copIteratorWorker{ - taskCh: taskCh, - wg: &it.wg, - store: it.store, - req: it.req, - respChan: it.respChan, - finishCh: it.finishCh, - vars: it.vars, - clientHelper: clientHelper{ - LockResolver: it.store.lockResolver, - RegionCache: it.store.regionCache, - minCommitTSPushed: &it.minCommitTSPushed, - Client: it.store.client, - }, - - memTracker: it.memTracker, - + taskCh: taskCh, + wg: &it.wg, + store: it.store, + req: it.req, + respChan: it.respChan, + finishCh: it.finishCh, + vars: it.vars, + ClientHelper: tikv.NewClientHelper(it.store.KVStore, it.resolvedLocks), + memTracker: it.memTracker, replicaReadSeed: it.replicaReadSeed, - sendRate: it.sendRate, actionOnExceed: it.actionOnExceed, - maxID: it.maxID, } go worker.run(ctx) } @@ -573,23 +411,28 @@ func (it *copIterator) open(ctx context.Context) { sendRate: it.sendRate, } taskSender.respChan = it.respChan - it.actionOnExceed.setEnabled(true) + it.actionOnExceed.setEnabled(enabledRateLimitAction) + failpoint.Inject("ticase-4171", func(val failpoint.Value) { + if val.(bool) { + it.memTracker.Consume(10 * MockResponseSizeForTest) + it.memTracker.Consume(10 * MockResponseSizeForTest) + } + }) go taskSender.run() } func (sender *copIteratorTaskSender) run() { // Send tasks to feed the worker goroutines. - for i, t := range sender.tasks { + for _, t := range sender.tasks { // we control the sending rate to prevent all tasks // being done (aka. all of the responses are buffered) by copIteratorWorker. // We keep the number of inflight tasks within the number of 2 * concurrency when Keep Order is true. // If KeepOrder is false, the number equals the concurrency. // It sends one more task if a task has been finished in copIterator.Next. - exit := sender.sendRate.getToken(sender.finishCh) + exit := sender.sendRate.GetToken(sender.finishCh) if exit { break } - t.id = uint32(i) exit = sender.sendToTaskCh(t) if exit { break @@ -612,9 +455,11 @@ func (it *copIterator) recvFromRespCh(ctx context.Context, respCh <-chan *copRes case resp, ok = <-respCh: if it.memTracker != nil && resp != nil { consumed := resp.MemSize() - failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + failpoint.Inject("testRateLimitActionMockConsumeAndAssert", func(val failpoint.Value) { if val.(bool) { - consumed = 100 + if resp != finCopResp { + consumed = MockResponseSizeForTest + } } }) it.memTracker.Consume(-consumed) @@ -625,7 +470,7 @@ func (it *copIterator) recvFromRespCh(ctx context.Context, respCh <-chan *copRes return case <-ticker.C: if atomic.LoadUint32(it.vars.Killed) == 1 { - resp = &copResponse{err: ErrQueryInterrupted} + resp = &copResponse{err: tikv.ErrQueryInterrupted} ok = true return } @@ -652,9 +497,11 @@ func (sender *copIteratorTaskSender) sendToTaskCh(t *copTask) (exit bool) { func (worker *copIteratorWorker) sendToRespCh(resp *copResponse, respCh chan<- *copResponse, checkOOM bool) (exit bool) { if worker.memTracker != nil && checkOOM { consumed := resp.MemSize() - failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + failpoint.Inject("testRateLimitActionMockConsumeAndAssert", func(val failpoint.Value) { if val.(bool) { - consumed = 100 + if resp != finCopResp { + consumed = MockResponseSizeForTest + } } }) worker.memTracker.Consume(consumed) @@ -667,6 +514,9 @@ func (worker *copIteratorWorker) sendToRespCh(resp *copResponse, respCh chan<- * return } +// MockResponseSizeForTest mock the response size +const MockResponseSizeForTest = 100 * 1024 * 1024 + // Next returns next coprocessor result. // NOTE: Use nil to indicate finish, so if the returned ResultSubset is not nil, reader should continue to call Next(). func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { @@ -675,14 +525,27 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { ok bool closed bool ) - // wait unit at least 2 copResponse received. - failpoint.Inject("testRateLimitActionMockConsume", func(val failpoint.Value) { + defer func() { + if resp == nil { + failpoint.Inject("ticase-4170", func(val failpoint.Value) { + if val.(bool) { + it.memTracker.Consume(10 * MockResponseSizeForTest) + it.memTracker.Consume(10 * MockResponseSizeForTest) + } + }) + } + }() + // wait unit at least 5 copResponse received. + failpoint.Inject("testRateLimitActionMockWaitMax", func(val failpoint.Value) { if val.(bool) { - for it.memTracker.MaxConsumed() < 200 { + // we only need to trigger oom at least once. + if len(it.tasks) > 9 { + for it.memTracker.MaxConsumed() < 5*MockResponseSizeForTest { + time.Sleep(10 * time.Millisecond) + } } } }) - // If data order matters, response should be returned in the same order as copTask slice. // Otherwise all responses are returned from a single channel. if it.respChan != nil { @@ -692,8 +555,12 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { it.actionOnExceed.close() return nil, nil } - // The respCh has been drained out - it.actionOnExceed.broadcastIfNeeded(len(it.respChan) < 1) + if resp == finCopResp { + it.actionOnExceed.destroyTokenIfNeeded(func() { + it.sendRate.PutToken() + }) + return it.Next(ctx) + } } else { for { if it.curr >= len(it.tasks) { @@ -710,15 +577,12 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { if ok { break } - finishedTaskID := it.tasks[it.curr].id + it.actionOnExceed.destroyTokenIfNeeded(func() { + it.sendRate.PutToken() + }) // Switch to next task. it.tasks[it.curr] = nil it.curr++ - maxID := it.maxID.getMaxID() - // The tasks whose id is less than maxID are assumed that being sending to their task channel. - // So the response channel would be thought as drained out if the current taskID is greater or equal than - // the maxID as all the workers are being suspended at that time. - it.actionOnExceed.broadcastIfNeeded(finishedTaskID >= maxID) } } @@ -735,13 +599,13 @@ func (it *copIterator) Next(ctx context.Context) (kv.ResultSubset, error) { // Associate each region with an independent backoffer. In this way, when multiple regions are // unavailable, TiDB can execute very quickly without blocking -func chooseBackoffer(ctx context.Context, backoffermap map[uint64]*Backoffer, task *copTask, worker *copIteratorWorker) *Backoffer { - bo, ok := backoffermap[task.region.id] +func chooseBackoffer(ctx context.Context, backoffermap map[uint64]*tikv.Backoffer, task *copTask, worker *copIteratorWorker) *tikv.Backoffer { + bo, ok := backoffermap[task.region.GetID()] if ok { return bo } - newbo := NewBackofferWithVars(ctx, copNextMaxBackoff, worker.vars) - backoffermap[task.region.id] = newbo + newbo := tikv.NewBackofferWithVars(ctx, copNextMaxBackoff, worker.vars) + backoffermap[task.region.GetID()] = newbo return newbo } @@ -759,7 +623,7 @@ func (worker *copIteratorWorker) handleTask(ctx context.Context, task *copTask, } }() remainTasks := []*copTask{task} - backoffermap := make(map[uint64]*Backoffer) + backoffermap := make(map[uint64]*tikv.Backoffer) for len(remainTasks) > 0 { curTask := remainTasks[0] bo := chooseBackoffer(ctx, backoffermap, curTask, worker) @@ -770,7 +634,7 @@ func (worker *copIteratorWorker) handleTask(ctx context.Context, task *copTask, return } // test whether the ctx is cancelled - if bo.vars != nil && bo.vars.Killed != nil && atomic.LoadUint32(bo.vars.Killed) == 1 { + if vars := bo.GetVars(); vars != nil && vars.Killed != nil && atomic.LoadUint32(vars.Killed) == 1 { return } @@ -787,7 +651,7 @@ func (worker *copIteratorWorker) handleTask(ctx context.Context, task *copTask, // handleTaskOnce handles single copTask, successful results are send to channel. // If error happened, returns error. If region split or meet lock, returns the remain tasks. -func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch chan<- *copResponse) ([]*copTask, error) { +func (worker *copIteratorWorker) handleTaskOnce(bo *tikv.Backoffer, task *copTask, ch chan<- *copResponse) ([]*copTask, error) { failpoint.Inject("handleTaskOnceError", func(val failpoint.Value) { if val.(bool) { failpoint.Return(nil, errors.New("mock handleTaskOnce error")) @@ -798,7 +662,7 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch Tp: worker.req.Tp, StartTs: worker.req.StartTs, Data: worker.req.Data, - Ranges: task.ranges.toPBRanges(), + Ranges: task.ranges.ToPBRanges(), SchemaVer: worker.req.SchemaVar, } @@ -807,13 +671,13 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch // If there are many ranges, it is very likely to be a TableLookupRequest. They are not worth to cache since // computing is not the main cost. Ignore such requests directly to avoid slowly building the cache key. - if task.cmdType == tikvrpc.CmdCop && worker.store.coprCache != nil && worker.req.Cacheable && len(copReq.Ranges) < 10 { + if task.cmdType == tikvrpc.CmdCop && worker.store.coprCache != nil && worker.req.Cacheable && worker.store.coprCache.CheckRequestAdmission(len(copReq.Ranges)) { cKey, err := coprCacheBuildKey(&copReq) if err == nil { cacheKey = cKey cValue := worker.store.coprCache.Get(cKey) copReq.IsCacheEnabled = true - if cValue != nil && cValue.RegionID == task.region.id && cValue.TimeStamp <= worker.req.StartTs { + if cValue != nil && cValue.RegionID == task.region.GetID() && cValue.TimeStamp <= worker.req.StartTs { // Append cache version to the request to skip Coprocessor computation if possible // when request result is cached copReq.CacheIfMatchVersion = cValue.RegionDataVersion @@ -827,19 +691,26 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch } req := tikvrpc.NewReplicaReadRequest(task.cmdType, &copReq, worker.req.ReplicaRead, &worker.replicaReadSeed, kvrpcpb.Context{ - IsolationLevel: pbIsolationLevel(worker.req.IsolationLevel), - Priority: kvPriorityToCommandPri(worker.req.Priority), + IsolationLevel: tikv.IsolationLevelToPB(worker.req.IsolationLevel), + Priority: tikv.PriorityToPB(worker.req.Priority), NotFillCache: worker.req.NotFillCache, - HandleTime: true, - ScanDetail: true, + RecordTimeStat: true, + RecordScanStat: true, TaskId: worker.req.TaskID, }) req.StoreTp = task.storeType startTime := time.Now() if worker.Stats == nil { - worker.Stats = make(map[tikvrpc.CmdType]*RPCRuntimeStats) + worker.Stats = make(map[tikvrpc.CmdType]*tikv.RPCRuntimeStats) } - resp, rpcCtx, storeAddr, err := worker.SendReqCtx(bo, req, task.region, ReadTimeoutMedium, task.storeType, task.storeAddr) + if worker.req.IsStaleness { + req.EnableStaleRead() + } + var ops []tikv.StoreSelectorOption + if len(worker.req.MatchStoreLabels) > 0 { + ops = append(ops, tikv.WithMatchLabels(worker.req.MatchStoreLabels)) + } + resp, rpcCtx, storeAddr, err := worker.SendReqCtx(bo, req, task.region, tikv.ReadTimeoutMedium, task.storeType, task.storeAddr, ops...) if err != nil { if task.storeType == kv.TiDB { err = worker.handleTiDBSendReqErr(err, task, ch) @@ -864,106 +735,28 @@ func (worker *copIteratorWorker) handleTaskOnce(bo *Backoffer, task *copTask, ch return worker.handleCopResponse(bo, rpcCtx, &copResponse{pbResp: resp.Resp.(*coprocessor.Response)}, cacheKey, cacheValue, task, ch, nil, costTime) } -type minCommitTSPushed struct { - data map[uint64]struct{} - sync.RWMutex -} - -func (m *minCommitTSPushed) Update(from []uint64) { - m.Lock() - for _, v := range from { - m.data[v] = struct{}{} - } - m.Unlock() -} - -func (m *minCommitTSPushed) Get() []uint64 { - m.RLock() - defer m.RUnlock() - if len(m.data) == 0 { - return nil - } - - ret := make([]uint64, 0, len(m.data)) - for k := range m.data { - ret = append(ret, k) - } - return ret -} - -// clientHelper wraps LockResolver and RegionRequestSender. -// It's introduced to support the new lock resolving pattern in the large transaction. -// In the large transaction protocol, sending requests and resolving locks are -// context-dependent. For example, when a send request meets a secondary lock, we'll -// call ResolveLock, and if the lock belongs to a large transaction, we may retry -// the request. If there is no context information about the resolved locks, we'll -// meet the secondary lock again and run into a deadloop. -type clientHelper struct { - *LockResolver - *RegionCache - *minCommitTSPushed - Client - resolveLite bool - RegionRequestRuntimeStats -} - -// ResolveLocks wraps the ResolveLocks function and store the resolved result. -func (ch *clientHelper) ResolveLocks(bo *Backoffer, callerStartTS uint64, locks []*Lock) (int64, error) { - var err error - var resolvedLocks []uint64 - var msBeforeTxnExpired int64 - if ch.Stats != nil { - defer func(start time.Time) { - recordRegionRequestRuntimeStats(ch.Stats, tikvrpc.CmdResolveLock, time.Since(start)) - }(time.Now()) - } - if ch.resolveLite { - msBeforeTxnExpired, resolvedLocks, err = ch.LockResolver.resolveLocksLite(bo, callerStartTS, locks) - } else { - msBeforeTxnExpired, resolvedLocks, err = ch.LockResolver.ResolveLocks(bo, callerStartTS, locks) - } - if err != nil { - return msBeforeTxnExpired, err - } - if len(resolvedLocks) > 0 { - ch.minCommitTSPushed.Update(resolvedLocks) - return 0, nil - } - return msBeforeTxnExpired, nil -} - -// SendReqCtx wraps the SendReqCtx function and use the resolved lock result in the kvrpcpb.Context. -func (ch *clientHelper) SendReqCtx(bo *Backoffer, req *tikvrpc.Request, regionID RegionVerID, timeout time.Duration, sType kv.StoreType, directStoreAddr string) (*tikvrpc.Response, *RPCContext, string, error) { - sender := NewRegionRequestSender(ch.RegionCache, ch.Client) - if len(directStoreAddr) > 0 { - sender.storeAddr = directStoreAddr - } - sender.Stats = ch.Stats - req.Context.ResolvedLocks = ch.minCommitTSPushed.Get() - resp, ctx, err := sender.SendReqCtx(bo, req, regionID, timeout, sType) - return resp, ctx, sender.storeAddr, err -} - const ( minLogBackoffTime = 100 minLogKVProcessTime = 100 - minLogKVWaitTime = 200 ) -func (worker *copIteratorWorker) logTimeCopTask(costTime time.Duration, task *copTask, bo *Backoffer, resp *tikvrpc.Response) { - logStr := fmt.Sprintf("[TIME_COP_PROCESS] resp_time:%s txnStartTS:%d region_id:%d store_addr:%s", costTime, worker.req.StartTs, task.region.id, task.storeAddr) - if bo.totalSleep > minLogBackoffTime { - backoffTypes := strings.Replace(fmt.Sprintf("%v", bo.types), " ", ",", -1) - logStr += fmt.Sprintf(" backoff_ms:%d backoff_types:%s", bo.totalSleep, backoffTypes) +func (worker *copIteratorWorker) logTimeCopTask(costTime time.Duration, task *copTask, bo *tikv.Backoffer, resp *tikvrpc.Response) { + logStr := fmt.Sprintf("[TIME_COP_PROCESS] resp_time:%s txnStartTS:%d region_id:%d store_addr:%s", costTime, worker.req.StartTs, task.region.GetID(), task.storeAddr) + if bo.GetTotalSleep() > minLogBackoffTime { + backoffTypes := strings.Replace(fmt.Sprintf("%v", bo.GetTypes()), " ", ",", -1) + logStr += fmt.Sprintf(" backoff_ms:%d backoff_types:%s", bo.GetTotalSleep(), backoffTypes) } + var detailV2 *kvrpcpb.ExecDetailsV2 var detail *kvrpcpb.ExecDetails if resp.Resp != nil { switch r := resp.Resp.(type) { case *coprocessor.Response: + detailV2 = r.ExecDetailsV2 detail = r.ExecDetails case *tikvrpc.CopStreamResponse: // streaming request returns io.EOF, so the first CopStreamResponse.Response maybe nil. if r.Response != nil { + detailV2 = r.Response.ExecDetailsV2 detail = r.Response.ExecDetails } default: @@ -971,25 +764,34 @@ func (worker *copIteratorWorker) logTimeCopTask(costTime time.Duration, task *co } } - if detail != nil && detail.HandleTime != nil { - processMs := detail.HandleTime.ProcessMs - waitMs := detail.HandleTime.WaitMs - if processMs > minLogKVProcessTime { - logStr += fmt.Sprintf(" kv_process_ms:%d", processMs) - if detail.ScanDetail != nil { - logStr = appendScanDetail(logStr, "write", detail.ScanDetail.Write) - logStr = appendScanDetail(logStr, "data", detail.ScanDetail.Data) - logStr = appendScanDetail(logStr, "lock", detail.ScanDetail.Lock) - } - } - if waitMs > minLogKVWaitTime { - logStr += fmt.Sprintf(" kv_wait_ms:%d", waitMs) - if processMs <= minLogKVProcessTime { - logStr = strings.Replace(logStr, "TIME_COP_PROCESS", "TIME_COP_WAIT", 1) - } + var timeDetail *kvrpcpb.TimeDetail + if detailV2 != nil && detailV2.TimeDetail != nil { + timeDetail = detailV2.TimeDetail + } else if detail != nil && detail.TimeDetail != nil { + timeDetail = detail.TimeDetail + } + if timeDetail != nil { + logStr += fmt.Sprintf(" kv_process_ms:%d", timeDetail.ProcessWallTimeMs) + logStr += fmt.Sprintf(" kv_wait_ms:%d", timeDetail.WaitWallTimeMs) + if timeDetail.ProcessWallTimeMs <= minLogKVProcessTime { + logStr = strings.Replace(logStr, "TIME_COP_PROCESS", "TIME_COP_WAIT", 1) } } - logutil.Logger(bo.ctx).Info(logStr) + + if detailV2 != nil && detailV2.ScanDetailV2 != nil { + logStr += fmt.Sprintf(" processed_versions:%d", detailV2.ScanDetailV2.ProcessedVersions) + logStr += fmt.Sprintf(" total_versions:%d", detailV2.ScanDetailV2.TotalVersions) + logStr += fmt.Sprintf(" rocksdb_delete_skipped_count:%d", detailV2.ScanDetailV2.RocksdbDeleteSkippedCount) + logStr += fmt.Sprintf(" rocksdb_key_skipped_count:%d", detailV2.ScanDetailV2.RocksdbKeySkippedCount) + logStr += fmt.Sprintf(" rocksdb_cache_hit_count:%d", detailV2.ScanDetailV2.RocksdbBlockCacheHitCount) + logStr += fmt.Sprintf(" rocksdb_read_count:%d", detailV2.ScanDetailV2.RocksdbBlockReadCount) + logStr += fmt.Sprintf(" rocksdb_read_byte:%d", detailV2.ScanDetailV2.RocksdbBlockReadByte) + } else if detail != nil && detail.ScanDetail != nil { + logStr = appendScanDetail(logStr, "write", detail.ScanDetail.Write) + logStr = appendScanDetail(logStr, "data", detail.ScanDetail.Data) + logStr = appendScanDetail(logStr, "lock", detail.ScanDetail.Lock) + } + logutil.Logger(bo.GetCtx()).Info(logStr) } func appendScanDetail(logStr string, columnFamily string, scanInfo *kvrpcpb.ScanInfo) string { @@ -1000,7 +802,7 @@ func appendScanDetail(logStr string, columnFamily string, scanInfo *kvrpcpb.Scan return logStr } -func (worker *copIteratorWorker) handleCopStreamResult(bo *Backoffer, rpcCtx *RPCContext, stream *tikvrpc.CopStreamResponse, task *copTask, ch chan<- *copResponse, costTime time.Duration) ([]*copTask, error) { +func (worker *copIteratorWorker) handleCopStreamResult(bo *tikv.Backoffer, rpcCtx *tikv.RPCContext, stream *tikvrpc.CopStreamResponse, task *copTask, ch chan<- *copResponse, costTime time.Duration) ([]*copTask, error) { defer stream.Close() var resp *coprocessor.Response var lastRange *coprocessor.KeyRange @@ -1020,7 +822,11 @@ func (worker *copIteratorWorker) handleCopStreamResult(bo *Backoffer, rpcCtx *RP return nil, nil } - if err1 := bo.Backoff(boTiKVRPC, errors.Errorf("recv stream response error: %v, task: %s", err, task)); err1 != nil { + boRPCType := tikv.BoTiKVRPC + if task.storeType == kv.TiFlash { + boRPCType = tikv.BoTiFlashRPC + } + if err1 := bo.Backoff(boRPCType, errors.Errorf("recv stream response error: %v, task: %s", err, task)); err1 != nil { return nil, errors.Trace(err) } @@ -1042,7 +848,7 @@ func (worker *copIteratorWorker) handleCopStreamResult(bo *Backoffer, rpcCtx *RP // returns more tasks when that happens, or handles the response if no error. // if we're handling streaming coprocessor response, lastRange is the range of last // successful response, otherwise it's nil. -func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCContext, resp *copResponse, cacheKey []byte, cacheValue *coprCacheValue, task *copTask, ch chan<- *copResponse, lastRange *coprocessor.KeyRange, costTime time.Duration) ([]*copTask, error) { +func (worker *copIteratorWorker) handleCopResponse(bo *tikv.Backoffer, rpcCtx *tikv.RPCContext, resp *copResponse, cacheKey []byte, cacheValue *coprCacheValue, task *copTask, ch chan<- *copResponse, lastRange *coprocessor.KeyRange, costTime time.Duration) ([]*copTask, error) { if regionErr := resp.pbResp.GetRegionError(); regionErr != nil { if rpcCtx != nil && task.storeType == kv.TiDB { resp.err = errors.Errorf("error: %v", regionErr) @@ -1050,22 +856,22 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCCon return nil, nil } errStr := fmt.Sprintf("region_id:%v, region_ver:%v, store_type:%s, peer_addr:%s, error:%s", - task.region.id, task.region.ver, task.storeType.Name(), task.storeAddr, regionErr.String()) - if err := bo.Backoff(BoRegionMiss, errors.New(errStr)); err != nil { + task.region.GetID(), task.region.GetVer(), task.storeType.Name(), task.storeAddr, regionErr.String()) + if err := bo.Backoff(tikv.BoRegionMiss, errors.New(errStr)); err != nil { return nil, errors.Trace(err) } // We may meet RegionError at the first packet, but not during visiting the stream. - return buildCopTasks(bo, worker.store.regionCache, task.ranges, worker.req) + return buildCopTasks(bo, worker.store.GetRegionCache(), task.ranges, worker.req) } if lockErr := resp.pbResp.GetLocked(); lockErr != nil { logutil.BgLogger().Debug("coprocessor encounters", zap.Stringer("lock", lockErr)) - msBeforeExpired, err1 := worker.ResolveLocks(bo, worker.req.StartTs, []*Lock{NewLock(lockErr)}) + msBeforeExpired, err1 := worker.ResolveLocks(bo, worker.req.StartTs, []*tikv.Lock{tikv.NewLock(lockErr)}) if err1 != nil { return nil, errors.Trace(err1) } if msBeforeExpired > 0 { - if err := bo.BackoffWithMaxSleep(boTxnLockFast, int(msBeforeExpired), errors.New(lockErr.String())); err != nil { + if err := bo.BackoffWithMaxSleep(tikv.BoTxnLockFast, int(msBeforeExpired), errors.New(lockErr.String())); err != nil { return nil, errors.Trace(err) } } @@ -1075,7 +881,7 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCCon err := errors.Errorf("other error: %s", otherErr) logutil.BgLogger().Warn("other error", zap.Uint64("txnStartTS", worker.req.StartTs), - zap.Uint64("regionID", task.region.id), + zap.Uint64("regionID", task.region.GetID()), zap.String("storeAddr", task.storeAddr), zap.Error(err)) return nil, errors.Trace(err) @@ -1083,38 +889,50 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCCon // When the request is using streaming API, the `Range` is not nil. if resp.pbResp.Range != nil { resp.startKey = resp.pbResp.Range.Start - } else if task.ranges != nil && task.ranges.len() > 0 { - resp.startKey = task.ranges.at(0).StartKey + } else if task.ranges != nil && task.ranges.Len() > 0 { + resp.startKey = task.ranges.At(0).StartKey } if resp.detail == nil { resp.detail = new(CopRuntimeStats) } resp.detail.Stats = worker.Stats worker.Stats = nil - resp.detail.BackoffTime = time.Duration(bo.totalSleep) * time.Millisecond - resp.detail.BackoffSleep = make(map[string]time.Duration, len(bo.backoffTimes)) - resp.detail.BackoffTimes = make(map[string]int, len(bo.backoffTimes)) - for backoff := range bo.backoffTimes { + backoffTimes := bo.GetBackoffTimes() + resp.detail.BackoffTime = time.Duration(bo.GetTotalSleep()) * time.Millisecond + resp.detail.BackoffSleep = make(map[string]time.Duration, len(backoffTimes)) + resp.detail.BackoffTimes = make(map[string]int, len(backoffTimes)) + for backoff := range backoffTimes { backoffName := backoff.String() - resp.detail.BackoffTimes[backoffName] = bo.backoffTimes[backoff] - resp.detail.BackoffSleep[backoffName] = time.Duration(bo.backoffSleepMS[backoff]) * time.Millisecond + resp.detail.BackoffTimes[backoffName] = backoffTimes[backoff] + resp.detail.BackoffSleep[backoffName] = time.Duration(bo.GetBackoffSleepMS()[backoff]) * time.Millisecond } if rpcCtx != nil { resp.detail.CalleeAddress = rpcCtx.Addr } resp.respTime = costTime - if pbDetails := resp.pbResp.ExecDetails; pbDetails != nil { - if handleTime := pbDetails.HandleTime; handleTime != nil { - resp.detail.WaitTime = time.Duration(handleTime.WaitMs) * time.Millisecond - resp.detail.ProcessTime = time.Duration(handleTime.ProcessMs) * time.Millisecond + sd := &execdetails.ScanDetail{} + td := execdetails.TimeDetail{} + if pbDetails := resp.pbResp.ExecDetailsV2; pbDetails != nil { + // Take values in `ExecDetailsV2` first. + if timeDetail := pbDetails.TimeDetail; timeDetail != nil { + td.MergeFromTimeDetail(timeDetail) + } + if scanDetailV2 := pbDetails.ScanDetailV2; scanDetailV2 != nil { + sd.MergeFromScanDetailV2(scanDetailV2) + } + } else if pbDetails := resp.pbResp.ExecDetails; pbDetails != nil { + if timeDetail := pbDetails.TimeDetail; timeDetail != nil { + td.MergeFromTimeDetail(timeDetail) } if scanDetail := pbDetails.ScanDetail; scanDetail != nil { if scanDetail.Write != nil { - resp.detail.TotalKeys += scanDetail.Write.Total - resp.detail.ProcessedKeys += scanDetail.Write.Processed + sd.ProcessedKeys = scanDetail.Write.Processed + sd.TotalKeys = scanDetail.Write.Total } } } + resp.detail.ScanDetail = sd + resp.detail.TimeDetail = td if resp.pbResp.IsCacheHit { if cacheValue == nil { return nil, errors.New("Internal error: received illegal TiKV response") @@ -1127,14 +945,14 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCCon } else { // Cache not hit or cache hit but not valid: update the cache if the response can be cached. if cacheKey != nil && resp.pbResp.CanBeCached && resp.pbResp.CacheLastVersion > 0 { - if worker.store.coprCache.CheckAdmission(resp.pbResp.Data.Size(), resp.detail.ProcessTime) { + if worker.store.coprCache.CheckResponseAdmission(resp.pbResp.Data.Size(), resp.detail.TimeDetail.ProcessTime) { data := make([]byte, len(resp.pbResp.Data)) copy(data, resp.pbResp.Data) newCacheValue := coprCacheValue{ Data: data, TimeStamp: worker.req.StartTs, - RegionID: task.region.id, + RegionID: task.region.GetID(), RegionDataVersion: resp.pbResp.CacheLastVersion, } worker.store.coprCache.Set(cacheKey, &newCacheValue) @@ -1148,7 +966,7 @@ func (worker *copIteratorWorker) handleCopResponse(bo *Backoffer, rpcCtx *RPCCon // CopRuntimeStats contains execution detail information. type CopRuntimeStats struct { execdetails.ExecDetails - RegionRequestRuntimeStats + tikv.RegionRequestRuntimeStats CoprCacheHit bool } @@ -1156,10 +974,14 @@ type CopRuntimeStats struct { func (worker *copIteratorWorker) handleTiDBSendReqErr(err error, task *copTask, ch chan<- *copResponse) error { errCode := errno.ErrUnknown errMsg := err.Error() - if terror.ErrorEqual(err, ErrTiKVServerTimeout) { + if terror.ErrorEqual(err, tikv.ErrTiKVServerTimeout) { errCode = errno.ErrTiKVServerTimeout errMsg = "TiDB server timeout, address is " + task.storeAddr } + if terror.ErrorEqual(err, tikv.ErrTiFlashServerTimeout) { + errCode = errno.ErrTiFlashServerTimeout + errMsg = "TiDB server timeout, address is " + task.storeAddr + } selResp := tipb.SelectResponse{ Warnings: []*tipb.Error{ { @@ -1182,12 +1004,12 @@ func (worker *copIteratorWorker) handleTiDBSendReqErr(err error, task *copTask, return nil } -func (worker *copIteratorWorker) buildCopTasksFromRemain(bo *Backoffer, lastRange *coprocessor.KeyRange, task *copTask) ([]*copTask, error) { +func (worker *copIteratorWorker) buildCopTasksFromRemain(bo *tikv.Backoffer, lastRange *coprocessor.KeyRange, task *copTask) ([]*copTask, error) { remainedRanges := task.ranges if worker.req.Streaming && lastRange != nil { remainedRanges = worker.calculateRemain(task.ranges, lastRange, worker.req.Desc) } - return buildCopTasks(bo, worker.store.regionCache, remainedRanges, worker.req) + return buildCopTasks(bo, worker.store.GetRegionCache(), remainedRanges, worker.req) } // calculateRemain splits the input ranges into two, and take one of them according to desc flag. @@ -1197,12 +1019,12 @@ func (worker *copIteratorWorker) buildCopTasksFromRemain(bo *Backoffer, lastRang // split: [s1 --> s2) // In normal scan order, all data before s1 is consumed, so the remain ranges should be [s1 --> r2) [r3 --> r4) // In reverse scan order, all data after s2 is consumed, so the remain ranges should be [r1 --> r2) [r3 --> s2) -func (worker *copIteratorWorker) calculateRemain(ranges *copRanges, split *coprocessor.KeyRange, desc bool) *copRanges { +func (worker *copIteratorWorker) calculateRemain(ranges *tikv.KeyRanges, split *coprocessor.KeyRange, desc bool) *tikv.KeyRanges { if desc { - left, _ := ranges.split(split.End) + left, _ := ranges.Split(split.End) return left } - _, right := ranges.split(split.Start) + _, right := ranges.Split(split.Start) return right } @@ -1216,33 +1038,6 @@ func (it *copIterator) Close() error { return nil } -type rateLimit struct { - token chan struct{} -} - -func newRateLimit(n int) *rateLimit { - return &rateLimit{ - token: make(chan struct{}, n), - } -} - -func (r *rateLimit) getToken(done <-chan struct{}) (exit bool) { - select { - case <-done: - return true - case r.token <- struct{}{}: - return false - } -} - -func (r *rateLimit) putToken() { - select { - case <-r.token: - default: - panic("put a redundant token") - } -} - // copErrorResponse returns error when calling Next() type copErrorResponse struct{ error } @@ -1258,34 +1053,34 @@ func (it copErrorResponse) Close() error { // set on initial. Each time the Action is triggered, one token would be destroyed. If the count of the token is less // than 2, the action would be delegated to the fallback action. type rateLimitAction struct { + memory.BaseOOMAction // enabled indicates whether the rateLimitAction is permitted to Action. 1 means permitted, 0 denied. - enabled uint32 - fallbackAction memory.ActionOnExceed + enabled uint32 // totalTokenNum indicates the total token at initial totalTokenNum uint cond struct { - *sync.Cond + sync.Mutex // exceeded indicates whether have encountered OOM situation. exceeded bool // remainingTokenNum indicates the count of tokens which still exists remainingTokenNum uint - // isTokenDestroyed indicates whether there is one token has been isTokenDestroyed after Action been triggered - isTokenDestroyed bool - once sync.Once + once sync.Once + // triggerCountForTest indicates the total count of the rateLimitAction's Action being executed + triggerCountForTest uint } } -func newRateLimitAction(totalTokenNumber uint, cond *sync.Cond) *rateLimitAction { +func newRateLimitAction(totalTokenNumber uint) *rateLimitAction { return &rateLimitAction{ totalTokenNum: totalTokenNumber, cond: struct { - *sync.Cond - exceeded bool - remainingTokenNum uint - isTokenDestroyed bool - once sync.Once + sync.Mutex + exceeded bool + remainingTokenNum uint + once sync.Once + triggerCountForTest uint }{ - Cond: cond, + Mutex: sync.Mutex{}, exceeded: false, remainingTokenNum: totalTokenNumber, once: sync.Once{}, @@ -1295,15 +1090,9 @@ func newRateLimitAction(totalTokenNumber uint, cond *sync.Cond) *rateLimitAction // Action implements ActionOnExceed.Action func (e *rateLimitAction) Action(t *memory.Tracker) { - failpoint.Inject("testRateLimitActionDisable", func(val failpoint.Value) { - if val.(bool) { - e.setEnabled(false) - } - }) - if !e.isEnabled() { - if e.fallbackAction != nil { - e.fallbackAction.Action(t) + if fallback := e.GetFallback(); fallback != nil { + fallback.Action(t) } return } @@ -1312,20 +1101,27 @@ func (e *rateLimitAction) Action(t *memory.Tracker) { e.cond.once.Do(func() { if e.cond.remainingTokenNum < 2 { e.setEnabled(false) - logutil.BgLogger().Info("memory exceed quota, rateLimitAction delegate to fallback action", + logutil.BgLogger().Info("memory exceeds quota, rateLimitAction delegate to fallback action", zap.Uint("total token count", e.totalTokenNum)) - if e.fallbackAction != nil { - e.fallbackAction.Action(t) + if fallback := e.GetFallback(); fallback != nil { + fallback.Action(t) } return } + failpoint.Inject("testRateLimitActionMockConsumeAndAssert", func(val failpoint.Value) { + if val.(bool) { + if e.cond.triggerCountForTest+e.cond.remainingTokenNum != e.totalTokenNum { + panic("triggerCount + remainingTokenNum not equal to totalTokenNum") + } + } + }) logutil.BgLogger().Info("memory exceeds quota, destroy one token now.", zap.Int64("consumed", t.BytesConsumed()), zap.Int64("quota", t.GetBytesLimit()), zap.Uint("total token count", e.totalTokenNum), zap.Uint("remaining token count", e.cond.remainingTokenNum)) - e.cond.isTokenDestroyed = false e.cond.exceeded = true + e.cond.triggerCountForTest++ }) } @@ -1334,64 +1130,48 @@ func (e *rateLimitAction) SetLogHook(hook func(uint64)) { } -// SetFallback implements ActionOnExceed.SetFallback -func (e *rateLimitAction) SetFallback(a memory.ActionOnExceed) { - e.fallbackAction = a -} - -// broadcastIfNeeded will check whether the copWorkers is under suspended status. -// If they are, `broadcastIfNeeded` would try to recover them if there are no more -// copResponse remained in the channel. -func (e *rateLimitAction) broadcastIfNeeded(needed bool) { - e.conditionLock() - defer e.conditionUnlock() - if e.cond.exceeded && needed { - e.cond.exceeded = false - e.cond.Broadcast() - e.cond.once = sync.Once{} - } +// GetPriority get the priority of the Action. +func (e *rateLimitAction) GetPriority() int64 { + return memory.DefRateLimitPriority } // destroyTokenIfNeeded will check the `exceed` flag after copWorker finished one task. // If the exceed flag is true and there is no token been destroyed before, one token will be destroyed, // or the token would be return back. func (e *rateLimitAction) destroyTokenIfNeeded(returnToken func()) { - e.conditionLock() - defer e.conditionUnlock() - // If actionOnExceed has been triggered and there is no token have been destroyed before, - // destroy one token. - if e.cond.exceeded && !e.cond.isTokenDestroyed { - e.cond.remainingTokenNum = e.cond.remainingTokenNum - 1 - e.cond.isTokenDestroyed = true - } else { + if !e.isEnabled() { returnToken() + return } -} - -func (e *rateLimitAction) waitIfNeeded() { e.conditionLock() defer e.conditionUnlock() - for e.cond.exceeded { - e.cond.Wait() + if !e.cond.exceeded { + returnToken() + return } + // If actionOnExceed has been triggered and there is no token have been destroyed before, + // destroy one token. + e.cond.remainingTokenNum = e.cond.remainingTokenNum - 1 + e.cond.exceeded = false + e.cond.once = sync.Once{} } func (e *rateLimitAction) conditionLock() { - e.cond.L.Lock() + e.cond.Lock() } func (e *rateLimitAction) conditionUnlock() { - e.cond.L.Unlock() + e.cond.Unlock() } func (e *rateLimitAction) close() { + if !e.isEnabled() { + return + } e.setEnabled(false) e.conditionLock() defer e.conditionUnlock() e.cond.exceeded = false - e.cond.isTokenDestroyed = false - // broadcast the signal in order not to leak worker goroutine if it is being suspended - e.cond.Broadcast() } func (e *rateLimitAction) setEnabled(enabled bool) { @@ -1405,22 +1185,3 @@ func (e *rateLimitAction) setEnabled(enabled bool) { func (e *rateLimitAction) isEnabled() bool { return atomic.LoadUint32(&e.enabled) > 0 } - -type maxIDHandler struct { - sync.Mutex - maxID uint32 -} - -func (handler *maxIDHandler) getMaxID() uint32 { - handler.Lock() - defer handler.Unlock() - return handler.maxID -} - -func (handler *maxIDHandler) setMaxIDIfLarger(newID uint32) { - handler.Lock() - defer handler.Unlock() - if newID > handler.maxID { - handler.maxID = newID - } -} diff --git a/store/tikv/coprocessor_cache.go b/store/copr/coprocessor_cache.go similarity index 85% rename from store/tikv/coprocessor_cache.go rename to store/copr/coprocessor_cache.go index 771f75b96ec47..377690fc8d543 100644 --- a/store/tikv/coprocessor_cache.go +++ b/store/copr/coprocessor_cache.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv +package copr import ( "bytes" @@ -24,11 +24,12 @@ import ( "github.com/dgraph-io/ristretto" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/coprocessor" - "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/store/tikv/config" ) type coprCache struct { cache *ristretto.Cache + admissionMaxRanges int admissionMaxSize int admissionMinProcessTime time.Duration } @@ -56,7 +57,7 @@ func (v *coprCacheValue) Len() int { } func newCoprCache(config *config.CoprocessorCache) (*coprCache, error) { - if config == nil || !config.Enable { + if config == nil || config.CapacityMB == 0 { return nil, nil } capacityInBytes := int64(config.CapacityMB * 1024.0 * 1024.0) @@ -81,6 +82,7 @@ func newCoprCache(config *config.CoprocessorCache) (*coprCache, error) { } c := coprCache{ cache: cache, + admissionMaxRanges: int(config.AdmissionMaxRanges), admissionMaxSize: int(maxEntityInBytes), admissionMinProcessTime: time.Duration(config.AdmissionMinProcessMs) * time.Millisecond, } @@ -158,8 +160,19 @@ func (c *coprCache) Get(key []byte) *coprCacheValue { return typedValue } -// CheckAdmission checks whether an item is worth caching. -func (c *coprCache) CheckAdmission(dataSize int, processTime time.Duration) bool { +// CheckRequestAdmission checks whether a response item is worth caching. +func (c *coprCache) CheckRequestAdmission(ranges int) bool { + if c == nil { + return false + } + if c.admissionMaxRanges != 0 && ranges > c.admissionMaxRanges { + return false + } + return true +} + +// CheckResponseAdmission checks whether a response item is worth caching. +func (c *coprCache) CheckResponseAdmission(dataSize int, processTime time.Duration) bool { if c == nil { return false } @@ -173,7 +186,8 @@ func (c *coprCache) CheckAdmission(dataSize int, processTime time.Duration) bool } // Set inserts an item to the cache. -// It is recommended to call `CheckAdmission` before inserting the item to the cache. +// It is recommended to call `CheckRequestAdmission` and `CheckResponseAdmission` before inserting +// the item to the cache. func (c *coprCache) Set(key []byte, value *coprCacheValue) bool { if c == nil { return false diff --git a/store/tikv/coprocessor_cache_test.go b/store/copr/coprocessor_cache_test.go similarity index 69% rename from store/tikv/coprocessor_cache_test.go rename to store/copr/coprocessor_cache_test.go index 66125da999b3c..45ee3ef0ddfac 100644 --- a/store/tikv/coprocessor_cache_test.go +++ b/store/copr/coprocessor_cache_test.go @@ -11,19 +11,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv +package copr import ( "time" . "github.com/pingcap/check" "github.com/pingcap/kvproto/pkg/coprocessor" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/config" ) type testCoprocessorCacheSuite struct { - OneByOneSuite } var _ = Suite(&testCoprocessorCacheSuite{}) @@ -73,7 +72,7 @@ func (s *testCoprocessorSuite) TestBuildCacheKey(c *C) { } func (s *testCoprocessorSuite) TestDisable(c *C) { - cache, err := newCoprCache(&config.CoprocessorCache{Enable: false}) + cache, err := newCoprCache(&config.CoprocessorCache{CapacityMB: 0}) c.Assert(err, IsNil) c.Assert(cache, IsNil) @@ -83,55 +82,74 @@ func (s *testCoprocessorSuite) TestDisable(c *C) { v2 := cache.Get([]byte("foo")) c.Assert(v2, IsNil) - v = cache.CheckAdmission(1024, time.Second*5) + v = cache.CheckResponseAdmission(1024, time.Second*5) c.Assert(v, Equals, false) - cache, err = newCoprCache(&config.CoprocessorCache{Enable: true, CapacityMB: 0, AdmissionMaxResultMB: 1}) + cache, err = newCoprCache(&config.CoprocessorCache{CapacityMB: 0.1, AdmissionMaxResultMB: 1}) c.Assert(err, NotNil) c.Assert(cache, IsNil) - cache, err = newCoprCache(&config.CoprocessorCache{Enable: true, CapacityMB: 0.001}) + cache, err = newCoprCache(&config.CoprocessorCache{CapacityMB: 0.001}) c.Assert(err, NotNil) c.Assert(cache, IsNil) - cache, err = newCoprCache(&config.CoprocessorCache{Enable: true, CapacityMB: 0.001, AdmissionMaxResultMB: 1}) + cache, err = newCoprCache(&config.CoprocessorCache{CapacityMB: 0.001, AdmissionMaxResultMB: 1}) c.Assert(err, IsNil) c.Assert(cache, NotNil) } func (s *testCoprocessorSuite) TestAdmission(c *C) { - cache, err := newCoprCache(&config.CoprocessorCache{Enable: true, AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) + cache, err := newCoprCache(&config.CoprocessorCache{AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) c.Assert(err, IsNil) c.Assert(cache, NotNil) - v := cache.CheckAdmission(0, 0) + v := cache.CheckRequestAdmission(0) + c.Assert(v, Equals, true) + + v = cache.CheckRequestAdmission(1000) + c.Assert(v, Equals, true) + + v = cache.CheckResponseAdmission(0, 0) c.Assert(v, Equals, false) - v = cache.CheckAdmission(0, 4*time.Millisecond) + v = cache.CheckResponseAdmission(0, 4*time.Millisecond) c.Assert(v, Equals, false) - v = cache.CheckAdmission(0, 5*time.Millisecond) + v = cache.CheckResponseAdmission(0, 5*time.Millisecond) c.Assert(v, Equals, false) - v = cache.CheckAdmission(1, 0) + v = cache.CheckResponseAdmission(1, 0) c.Assert(v, Equals, false) - v = cache.CheckAdmission(1, 4*time.Millisecond) + v = cache.CheckResponseAdmission(1, 4*time.Millisecond) c.Assert(v, Equals, false) - v = cache.CheckAdmission(1, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1, 5*time.Millisecond) c.Assert(v, Equals, true) - v = cache.CheckAdmission(1024, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024, 5*time.Millisecond) c.Assert(v, Equals, true) - v = cache.CheckAdmission(1024*1024, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024, 5*time.Millisecond) c.Assert(v, Equals, true) - v = cache.CheckAdmission(1024*1024+1, 5*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024+1, 5*time.Millisecond) c.Assert(v, Equals, false) - v = cache.CheckAdmission(1024*1024+1, 4*time.Millisecond) + v = cache.CheckResponseAdmission(1024*1024+1, 4*time.Millisecond) + c.Assert(v, Equals, false) + + cache, err = newCoprCache(&config.CoprocessorCache{AdmissionMaxRanges: 5, AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) + c.Assert(err, IsNil) + c.Assert(cache, NotNil) + + v = cache.CheckRequestAdmission(0) + c.Assert(v, Equals, true) + + v = cache.CheckRequestAdmission(5) + c.Assert(v, Equals, true) + + v = cache.CheckRequestAdmission(6) c.Assert(v, Equals, false) } @@ -155,7 +173,7 @@ func (s *testCoprocessorSuite) TestCacheValueLen(c *C) { } func (s *testCoprocessorSuite) TestGetSet(c *C) { - cache, err := newCoprCache(&config.CoprocessorCache{Enable: true, AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) + cache, err := newCoprCache(&config.CoprocessorCache{AdmissionMinProcessMs: 5, AdmissionMaxResultMB: 1, CapacityMB: 1}) c.Assert(err, IsNil) c.Assert(cache, NotNil) diff --git a/store/tikv/coprocessor_test.go b/store/copr/coprocessor_test.go similarity index 59% rename from store/tikv/coprocessor_test.go rename to store/copr/coprocessor_test.go index 49fd9c9b434df..4a3a020191230 100644 --- a/store/tikv/coprocessor_test.go +++ b/store/copr/coprocessor_test.go @@ -11,19 +11,18 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv +package copr import ( "context" - "time" . "github.com/pingcap/check" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv" ) type testCoprocessorSuite struct { - OneByOneSuite } var _ = Suite(&testCoprocessorSuite{}) @@ -33,11 +32,11 @@ func (s *testCoprocessorSuite) TestBuildTasks(c *C) { // <- 0 -> <- 1 -> <- 2 -> <- 3 -> cluster := mocktikv.NewCluster(mocktikv.MustNewMVCCStore()) _, regionIDs, _ := mocktikv.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &codecPDClient{mocktikv.NewPDClient(cluster)} - cache := NewRegionCache(pdCli) + pdCli := &tikv.CodecPDClient{Client: mocktikv.NewPDClient(cluster)} + cache := tikv.NewRegionCache(pdCli) defer cache.Close() - bo := NewBackofferWithVars(context.Background(), 3000, nil) + bo := tikv.NewBackofferWithVars(context.Background(), 3000, nil) req := &kv.Request{} flashReq := &kv.Request{} @@ -150,49 +149,49 @@ func (s *testCoprocessorSuite) TestSplitRegionRanges(c *C) { // <- 0 -> <- 1 -> <- 2 -> <- 3 -> cluster := mocktikv.NewCluster(mocktikv.MustNewMVCCStore()) mocktikv.BootstrapWithMultiRegions(cluster, []byte("g"), []byte("n"), []byte("t")) - pdCli := &codecPDClient{mocktikv.NewPDClient(cluster)} - cache := NewRegionCache(pdCli) + pdCli := &tikv.CodecPDClient{Client: mocktikv.NewPDClient(cluster)} + cache := tikv.NewRegionCache(pdCli) defer cache.Close() - bo := NewBackofferWithVars(context.Background(), 3000, nil) + bo := tikv.NewBackofferWithVars(context.Background(), 3000, nil) - ranges, err := SplitRegionRanges(bo, cache, buildKeyRanges("a", "c")) + ranges, err := tikv.SplitRegionRanges(bo, cache, buildKeyRanges("a", "c")) c.Assert(err, IsNil) c.Assert(ranges, HasLen, 1) s.rangeEqual(c, ranges, "a", "c") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("h", "y")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("h", "y")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 3) s.rangeEqual(c, ranges, "h", "n", "n", "t", "t", "y") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("s", "z")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("s", "z")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 2) s.rangeEqual(c, ranges, "s", "t", "t", "z") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("s", "s")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("s", "s")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 1) s.rangeEqual(c, ranges, "s", "s") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("t", "t")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("t", "t")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 1) s.rangeEqual(c, ranges, "t", "t") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("t", "u")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("t", "u")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 1) s.rangeEqual(c, ranges, "t", "u") - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("u", "z")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("u", "z")) c.Assert(err, IsNil) c.Assert(len(ranges), Equals, 1) s.rangeEqual(c, ranges, "u", "z") // min --> max - ranges, err = SplitRegionRanges(bo, cache, buildKeyRanges("a", "z")) + ranges, err = tikv.SplitRegionRanges(bo, cache, buildKeyRanges("a", "z")) c.Assert(err, IsNil) c.Assert(ranges, HasLen, 4) s.rangeEqual(c, ranges, "a", "g", "g", "n", "n", "t", "t", "z") @@ -203,10 +202,10 @@ func (s *testCoprocessorSuite) TestRebuild(c *C) { // <- 0 -> <- 1 -> cluster := mocktikv.NewCluster(mocktikv.MustNewMVCCStore()) storeID, regionIDs, peerIDs := mocktikv.BootstrapWithMultiRegions(cluster, []byte("m")) - pdCli := &codecPDClient{mocktikv.NewPDClient(cluster)} - cache := NewRegionCache(pdCli) + pdCli := &tikv.CodecPDClient{Client: mocktikv.NewPDClient(cluster)} + cache := tikv.NewRegionCache(pdCli) defer cache.Close() - bo := NewBackofferWithVars(context.Background(), 3000, nil) + bo := tikv.NewBackofferWithVars(context.Background(), 3000, nil) req := &kv.Request{} tasks, err := buildCopTasks(bo, cache, buildCopRanges("a", "z"), req) @@ -242,15 +241,14 @@ func buildKeyRanges(keys ...string) []kv.KeyRange { return ranges } -func buildCopRanges(keys ...string) *copRanges { - ranges := buildKeyRanges(keys...) - return &copRanges{mid: ranges} +func buildCopRanges(keys ...string) *tikv.KeyRanges { + return tikv.NewKeyRanges(buildKeyRanges(keys...)) } func (s *testCoprocessorSuite) taskEqual(c *C, task *copTask, regionID uint64, keys ...string) { - c.Assert(task.region.id, Equals, regionID) - for i := 0; i < task.ranges.len(); i++ { - r := task.ranges.at(i) + c.Assert(task.region.GetID(), Equals, regionID) + for i := 0; i < task.ranges.Len(); i++ { + r := task.ranges.At(i) c.Assert(string(r.StartKey), Equals, keys[2*i]) c.Assert(string(r.EndKey), Equals, keys[2*i+1]) } @@ -263,133 +261,3 @@ func (s *testCoprocessorSuite) rangeEqual(c *C, ranges []kv.KeyRange, keys ...st c.Assert(string(r.EndKey), Equals, keys[2*i+1]) } } - -func (s *testCoprocessorSuite) TestCopRanges(c *C) { - ranges := []kv.KeyRange{ - {StartKey: []byte("a"), EndKey: []byte("b")}, - {StartKey: []byte("c"), EndKey: []byte("d")}, - {StartKey: []byte("e"), EndKey: []byte("f")}, - } - - s.checkEqual(c, &copRanges{mid: ranges}, ranges, true) - s.checkEqual(c, &copRanges{first: &ranges[0], mid: ranges[1:]}, ranges, true) - s.checkEqual(c, &copRanges{mid: ranges[:2], last: &ranges[2]}, ranges, true) - s.checkEqual(c, &copRanges{first: &ranges[0], mid: ranges[1:2], last: &ranges[2]}, ranges, true) -} - -func (s *testCoprocessorSuite) checkEqual(c *C, copRanges *copRanges, ranges []kv.KeyRange, slice bool) { - c.Assert(copRanges.len(), Equals, len(ranges)) - for i := range ranges { - c.Assert(copRanges.at(i), DeepEquals, ranges[i]) - } - if slice { - for i := 0; i <= copRanges.len(); i++ { - for j := i; j <= copRanges.len(); j++ { - s.checkEqual(c, copRanges.slice(i, j), ranges[i:j], false) - } - } - } -} - -func (s *testCoprocessorSuite) TestCopRangeSplit(c *C) { - first := &kv.KeyRange{StartKey: []byte("a"), EndKey: []byte("b")} - mid := []kv.KeyRange{ - {StartKey: []byte("c"), EndKey: []byte("d")}, - {StartKey: []byte("e"), EndKey: []byte("g")}, - {StartKey: []byte("l"), EndKey: []byte("o")}, - } - last := &kv.KeyRange{StartKey: []byte("q"), EndKey: []byte("t")} - left := true - right := false - - // input range: [c-d) [e-g) [l-o) - ranges := &copRanges{mid: mid} - s.testSplit(c, ranges, right, - splitCase{"c", buildCopRanges("c", "d", "e", "g", "l", "o")}, - splitCase{"d", buildCopRanges("e", "g", "l", "o")}, - splitCase{"f", buildCopRanges("f", "g", "l", "o")}, - ) - - // input range: [a-b) [c-d) [e-g) [l-o) - ranges = &copRanges{first: first, mid: mid} - s.testSplit(c, ranges, right, - splitCase{"a", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, - splitCase{"c", buildCopRanges("c", "d", "e", "g", "l", "o")}, - splitCase{"m", buildCopRanges("m", "o")}, - ) - - // input range: [a-b) [c-d) [e-g) [l-o) [q-t) - ranges = &copRanges{first: first, mid: mid, last: last} - s.testSplit(c, ranges, right, - splitCase{"f", buildCopRanges("f", "g", "l", "o", "q", "t")}, - splitCase{"h", buildCopRanges("l", "o", "q", "t")}, - splitCase{"r", buildCopRanges("r", "t")}, - ) - - // input range: [c-d) [e-g) [l-o) - ranges = &copRanges{mid: mid} - s.testSplit(c, ranges, left, - splitCase{"m", buildCopRanges("c", "d", "e", "g", "l", "m")}, - splitCase{"g", buildCopRanges("c", "d", "e", "g")}, - splitCase{"g", buildCopRanges("c", "d", "e", "g")}, - ) - - // input range: [a-b) [c-d) [e-g) [l-o) - ranges = &copRanges{first: first, mid: mid} - s.testSplit(c, ranges, left, - splitCase{"d", buildCopRanges("a", "b", "c", "d")}, - splitCase{"d", buildCopRanges("a", "b", "c", "d")}, - splitCase{"o", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, - ) - - // input range: [a-b) [c-d) [e-g) [l-o) [q-t) - ranges = &copRanges{first: first, mid: mid, last: last} - s.testSplit(c, ranges, left, - splitCase{"o", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, - splitCase{"p", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, - splitCase{"t", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o", "q", "t")}, - ) -} - -func (s *testCoprocessorSuite) TestRateLimit(c *C) { - done := make(chan struct{}, 1) - rl := newRateLimit(1) - c.Assert(rl.putToken, PanicMatches, "put a redundant token") - exit := rl.getToken(done) - c.Assert(exit, Equals, false) - rl.putToken() - c.Assert(rl.putToken, PanicMatches, "put a redundant token") - - exit = rl.getToken(done) - c.Assert(exit, Equals, false) - done <- struct{}{} - exit = rl.getToken(done) // blocked but exit - c.Assert(exit, Equals, true) - - sig := make(chan int, 1) - go func() { - exit = rl.getToken(done) // blocked - c.Assert(exit, Equals, false) - close(sig) - }() - time.Sleep(200 * time.Millisecond) - rl.putToken() - <-sig -} - -type splitCase struct { - key string - *copRanges -} - -func (s *testCoprocessorSuite) testSplit(c *C, ranges *copRanges, checkLeft bool, cases ...splitCase) { - for _, t := range cases { - left, right := ranges.split([]byte(t.key)) - expect := t.copRanges - if checkLeft { - s.checkEqual(c, left, expect.mid, false) - } else { - s.checkEqual(c, right, expect.mid, false) - } - } -} diff --git a/store/copr/mpp.go b/store/copr/mpp.go new file mode 100644 index 0000000000000..8a6bd3c108b38 --- /dev/null +++ b/store/copr/mpp.go @@ -0,0 +1,446 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package copr + +import ( + "context" + "io" + "sync" + "sync/atomic" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/kvproto/pkg/mpp" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/tikvrpc" + "go.uber.org/zap" +) + +// MPPClient servers MPP requests. +type MPPClient struct { + store *tikv.KVStore +} + +// GetAddress returns the network address. +func (c *batchCopTask) GetAddress() string { + return c.storeAddr +} + +func (c *MPPClient) selectAllTiFlashStore() []kv.MPPTaskMeta { + resultTasks := make([]kv.MPPTaskMeta, 0) + for _, addr := range c.store.GetRegionCache().GetTiFlashStoreAddrs() { + task := &batchCopTask{storeAddr: addr, cmdType: tikvrpc.CmdMPPTask} + resultTasks = append(resultTasks, task) + } + return resultTasks +} + +// ConstructMPPTasks receives ScheduleRequest, which are actually collects of kv ranges. We allocates MPPTaskMeta for them and returns. +func (c *MPPClient) ConstructMPPTasks(ctx context.Context, req *kv.MPPBuildTasksRequest) ([]kv.MPPTaskMeta, error) { + ctx = context.WithValue(ctx, tikv.TxnStartKey, req.StartTS) + bo := tikv.NewBackofferWithVars(ctx, copBuildTaskMaxBackoff, nil) + if req.KeyRanges == nil { + return c.selectAllTiFlashStore(), nil + } + tasks, err := buildBatchCopTasks(bo, c.store.GetRegionCache(), tikv.NewKeyRanges(req.KeyRanges), kv.TiFlash) + if err != nil { + return nil, errors.Trace(err) + } + mppTasks := make([]kv.MPPTaskMeta, 0, len(tasks)) + for _, copTask := range tasks { + mppTasks = append(mppTasks, copTask) + } + return mppTasks, nil +} + +// mppResponse wraps mpp data packet. +type mppResponse struct { + pbResp *mpp.MPPDataPacket + detail *CopRuntimeStats + respTime time.Duration + respSize int64 + + err error +} + +// GetData implements the kv.ResultSubset GetData interface. +func (m *mppResponse) GetData() []byte { + return m.pbResp.Data +} + +// GetStartKey implements the kv.ResultSubset GetStartKey interface. +func (m *mppResponse) GetStartKey() kv.Key { + return nil +} + +// GetExecDetails is unavailable currently. +func (m *mppResponse) GetCopRuntimeStats() *CopRuntimeStats { + return m.detail +} + +// MemSize returns how many bytes of memory this response use +func (m *mppResponse) MemSize() int64 { + if m.respSize != 0 { + return m.respSize + } + + if m.detail != nil { + m.respSize += int64(sizeofExecDetails) + } + if m.pbResp != nil { + m.respSize += int64(m.pbResp.Size()) + } + return m.respSize +} + +func (m *mppResponse) RespTime() time.Duration { + return m.respTime +} + +type mppIterator struct { + store *tikv.KVStore + + tasks []*kv.MPPDispatchRequest + finishCh chan struct{} + + startTs uint64 + + respChan chan *mppResponse + + cancelFunc context.CancelFunc + + wg sync.WaitGroup + + closed uint32 + + vars *kv.Variables + + mu sync.Mutex +} + +func (m *mppIterator) run(ctx context.Context) { + for _, task := range m.tasks { + if atomic.LoadUint32(&m.closed) == 1 { + break + } + m.mu.Lock() + switch task.State { + case kv.MppTaskReady: + task.State = kv.MppTaskRunning + m.mu.Unlock() + default: + m.mu.Unlock() + break + } + m.wg.Add(1) + bo := tikv.NewBackoffer(ctx, copNextMaxBackoff) + go m.handleDispatchReq(ctx, bo, task) + } + m.wg.Wait() + close(m.respChan) +} + +func (m *mppIterator) sendError(err error) { + m.sendToRespCh(&mppResponse{err: err}) + m.cancelMppTasks() +} + +func (m *mppIterator) sendToRespCh(resp *mppResponse) (exit bool) { + select { + case m.respChan <- resp: + case <-m.finishCh: + exit = true + } + return +} + +// TODO:: Consider that which way is better: +// - dispatch all tasks at once, and connect tasks at second. +// - dispatch tasks and establish connection at the same time. +func (m *mppIterator) handleDispatchReq(ctx context.Context, bo *tikv.Backoffer, req *kv.MPPDispatchRequest) { + defer func() { + m.wg.Done() + }() + var regionInfos []*coprocessor.RegionInfo + originalTask := req.Meta.(*batchCopTask) + for _, task := range originalTask.copTasks { + regionInfos = append(regionInfos, &coprocessor.RegionInfo{ + RegionId: task.task.region.GetID(), + RegionEpoch: &metapb.RegionEpoch{ + ConfVer: task.task.region.GetConfVer(), + Version: task.task.region.GetVer(), + }, + Ranges: task.task.ranges.ToPBRanges(), + }) + } + + // meta for current task. + taskMeta := &mpp.TaskMeta{StartTs: req.StartTs, TaskId: req.ID, Address: originalTask.storeAddr} + + mppReq := &mpp.DispatchTaskRequest{ + Meta: taskMeta, + EncodedPlan: req.Data, + // TODO: This is only an experience value. It's better to be configurable. + Timeout: 60, + SchemaVer: req.SchemaVar, + Regions: regionInfos, + } + + wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPTask, mppReq, kvrpcpb.Context{}) + wrappedReq.StoreTp = kv.TiFlash + + // TODO: Handle dispatch task response correctly, including retry logic and cancel logic. + var rpcResp *tikvrpc.Response + var err error + // If copTasks is not empty, we should send request according to region distribution. + // Or else it's the task without region, which always happens in high layer task without table. + // In that case + if len(originalTask.copTasks) != 0 { + sender := NewRegionBatchRequestSender(m.store.GetRegionCache(), m.store.GetTiKVClient()) + rpcResp, _, _, err = sender.sendStreamReqToAddr(bo, originalTask.copTasks, wrappedReq, tikv.ReadTimeoutMedium) + // No matter what the rpc error is, we won't retry the mpp dispatch tasks. + // TODO: If we want to retry, we must redo the plan fragment cutting and task scheduling. + // That's a hard job but we can try it in the future. + if sender.GetRPCError() != nil { + logutil.BgLogger().Error("mpp dispatch meet io error", zap.String("error", sender.GetRPCError().Error())) + // we return timeout to trigger tikv's fallback + m.sendError(tikv.ErrTiFlashServerTimeout) + return + } + } else { + rpcResp, err = m.store.GetTiKVClient().SendRequest(ctx, originalTask.storeAddr, wrappedReq, tikv.ReadTimeoutMedium) + } + + if err != nil { + logutil.BgLogger().Error("mpp dispatch meet error", zap.String("error", err.Error())) + // we return timeout to trigger tikv's fallback + m.sendError(tikv.ErrTiFlashServerTimeout) + return + } + + realResp := rpcResp.Resp.(*mpp.DispatchTaskResponse) + + if realResp.Error != nil { + m.sendError(errors.New(realResp.Error.Msg)) + return + } + failpoint.Inject("mppNonRootTaskError", func(val failpoint.Value) { + if val.(bool) && !req.IsRoot { + time.Sleep(1 * time.Second) + m.sendError(tikv.ErrTiFlashServerTimeout) + return + } + }) + if !req.IsRoot { + return + } + + m.establishMPPConns(bo, req, taskMeta) +} + +// NOTE: We do not retry here, because retry is helpless when errors result from TiFlash or Network. If errors occur, the execution on TiFlash will finally stop after some minutes. +// This function is exclusively called, and only the first call succeeds sending tasks and setting all tasks as cancelled, while others will not work. +func (m *mppIterator) cancelMppTasks() { + m.mu.Lock() + defer m.mu.Unlock() + killReq := &mpp.CancelTaskRequest{ + Meta: &mpp.TaskMeta{StartTs: m.startTs}, + } + + wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPCancel, killReq, kvrpcpb.Context{}) + wrappedReq.StoreTp = kv.TiFlash + + usedStoreAddrs := make(map[string]bool) + for _, task := range m.tasks { + // get the store address of running tasks + if task.State == kv.MppTaskRunning && !usedStoreAddrs[task.Meta.GetAddress()] { + usedStoreAddrs[task.Meta.GetAddress()] = true + } else if task.State == kv.MppTaskCancelled { + return + } + task.State = kv.MppTaskCancelled + } + + // send cancel cmd to all stores where tasks run + for addr := range usedStoreAddrs { + _, err := m.store.GetTiKVClient().SendRequest(context.Background(), addr, wrappedReq, tikv.ReadTimeoutUltraLong) + logutil.BgLogger().Debug("cancel task ", zap.Uint64("query id ", m.startTs), zap.String(" on addr ", addr)) + if err != nil { + logutil.BgLogger().Error("cancel task error: ", zap.Error(err), zap.Uint64(" for query id ", m.startTs), zap.String(" on addr ", addr)) + } + } +} + +func (m *mppIterator) establishMPPConns(bo *tikv.Backoffer, req *kv.MPPDispatchRequest, taskMeta *mpp.TaskMeta) { + connReq := &mpp.EstablishMPPConnectionRequest{ + SenderMeta: taskMeta, + ReceiverMeta: &mpp.TaskMeta{ + StartTs: req.StartTs, + TaskId: -1, + }, + } + + wrappedReq := tikvrpc.NewRequest(tikvrpc.CmdMPPConn, connReq, kvrpcpb.Context{}) + wrappedReq.StoreTp = kv.TiFlash + + // Drain result from root task. + // We don't need to process any special error. When we meet errors, just let it fail. + rpcResp, err := m.store.GetTiKVClient().SendRequest(bo.GetCtx(), req.Meta.GetAddress(), wrappedReq, tikv.ReadTimeoutUltraLong) + + if err != nil { + m.sendError(err) + return + } + + stream := rpcResp.Resp.(*tikvrpc.MPPStreamResponse) + defer stream.Close() + + resp := stream.MPPDataPacket + if resp == nil { + return + } + + for { + err := m.handleMPPStreamResponse(bo, resp, req) + if err != nil { + m.sendError(err) + return + } + + resp, err = stream.Recv() + if err != nil { + if errors.Cause(err) == io.EOF { + return + } + + if err1 := bo.Backoff(tikv.BoTiKVRPC, errors.Errorf("recv stream response error: %v", err)); err1 != nil { + if errors.Cause(err) == context.Canceled { + logutil.BgLogger().Info("stream recv timeout", zap.Error(err)) + } else { + logutil.BgLogger().Info("stream unknown error", zap.Error(err)) + } + } + m.sendError(tikv.ErrTiFlashServerTimeout) + return + } + } +} + +// TODO: Test the case that user cancels the query. +func (m *mppIterator) Close() error { + if atomic.CompareAndSwapUint32(&m.closed, 0, 1) { + close(m.finishCh) + } + m.cancelFunc() + m.wg.Wait() + return nil +} + +func (m *mppIterator) handleMPPStreamResponse(bo *tikv.Backoffer, response *mpp.MPPDataPacket, req *kv.MPPDispatchRequest) (err error) { + if response.Error != nil { + err = errors.Errorf("other error for mpp stream: %s", response.Error.Msg) + logutil.BgLogger().Warn("other error", + zap.Uint64("txnStartTS", req.StartTs), + zap.String("storeAddr", req.Meta.GetAddress()), + zap.Error(err)) + return err + } + + resp := &mppResponse{ + pbResp: response, + detail: new(CopRuntimeStats), + } + + backoffTimes := bo.GetBackoffTimes() + resp.detail.BackoffTime = time.Duration(bo.GetTotalSleep()) * time.Millisecond + resp.detail.BackoffSleep = make(map[string]time.Duration, len(backoffTimes)) + resp.detail.BackoffTimes = make(map[string]int, len(backoffTimes)) + for backoff := range backoffTimes { + backoffName := backoff.String() + resp.detail.BackoffTimes[backoffName] = backoffTimes[backoff] + resp.detail.BackoffSleep[backoffName] = time.Duration(bo.GetBackoffSleepMS()[backoff]) * time.Millisecond + } + resp.detail.CalleeAddress = req.Meta.GetAddress() + + m.sendToRespCh(resp) + return +} + +func (m *mppIterator) nextImpl(ctx context.Context) (resp *mppResponse, ok bool, exit bool, err error) { + ticker := time.NewTicker(3 * time.Second) + defer ticker.Stop() + for { + select { + case resp, ok = <-m.respChan: + return + case <-ticker.C: + if m.vars != nil && m.vars.Killed != nil && atomic.LoadUint32(m.vars.Killed) == 1 { + err = tikv.ErrQueryInterrupted + exit = true + return + } + case <-m.finishCh: + exit = true + return + case <-ctx.Done(): + if atomic.CompareAndSwapUint32(&m.closed, 0, 1) { + close(m.finishCh) + } + exit = true + return + } + } +} + +func (m *mppIterator) Next(ctx context.Context) (kv.ResultSubset, error) { + resp, ok, closed, err := m.nextImpl(ctx) + if err != nil { + return nil, errors.Trace(err) + } + if !ok || closed { + return nil, nil + } + + if resp.err != nil { + return nil, errors.Trace(resp.err) + } + + err = m.store.CheckVisibility(m.startTs) + if err != nil { + return nil, errors.Trace(err) + } + return resp, nil +} + +// DispatchMPPTasks dispatches all the mpp task and waits for the responses. +func (c *MPPClient) DispatchMPPTasks(ctx context.Context, vars *kv.Variables, dispatchReqs []*kv.MPPDispatchRequest) kv.Response { + ctxChild, cancelFunc := context.WithCancel(ctx) + iter := &mppIterator{ + store: c.store, + tasks: dispatchReqs, + finishCh: make(chan struct{}), + cancelFunc: cancelFunc, + respChan: make(chan *mppResponse, 4096), + startTs: dispatchReqs[0].StartTs, + vars: vars, + } + go iter.run(ctxChild) + return iter +} diff --git a/store/copr/store.go b/store/copr/store.go new file mode 100644 index 0000000000000..fac0bae7dfcc1 --- /dev/null +++ b/store/copr/store.go @@ -0,0 +1,70 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package copr + +import ( + "math/rand" + "sync/atomic" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/config" +) + +// Store wraps tikv.KVStore and provides coprocessor utilities. +type Store struct { + *tikv.KVStore + coprCache *coprCache + replicaReadSeed uint32 +} + +// NewStore creates a new store instance. +func NewStore(kvStore *tikv.KVStore, coprCacheConfig *config.CoprocessorCache) (*Store, error) { + coprCache, err := newCoprCache(coprCacheConfig) + if err != nil { + return nil, errors.Trace(err) + } + return &Store{ + KVStore: kvStore, + coprCache: coprCache, + replicaReadSeed: rand.Uint32(), + }, nil +} + +// Close releases resources allocated for coprocessor. +func (s *Store) Close() { + if s.coprCache != nil { + s.coprCache.cache.Close() + } +} + +func (s *Store) nextReplicaReadSeed() uint32 { + return atomic.AddUint32(&s.replicaReadSeed, 1) +} + +// GetClient gets a client instance. +func (s *Store) GetClient() kv.Client { + return &CopClient{ + store: s, + replicaReadSeed: s.nextReplicaReadSeed(), + } +} + +// GetMPPClient gets a mpp client instance. +func (s *Store) GetMPPClient() kv.MPPClient { + return &MPPClient{ + store: s.KVStore, + } +} diff --git a/store/driver/kv_test.go b/store/driver/kv_test.go new file mode 100644 index 0000000000000..f9c206aea4610 --- /dev/null +++ b/store/driver/kv_test.go @@ -0,0 +1,27 @@ +package driver + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/store/tikv/config" +) + +type testTiKVDriverSuite struct { + OneByOneSuite +} + +var _ = Suite(&testTiKVDriverSuite{}) + +func (s *testTiKVDriverSuite) TestSetDefaultAndOptions(c *C) { + globalConfig := config.GetGlobalConfig() + originSec := globalConfig.Security + + d := TiKVDriver{} + security := config.Security{ClusterSSLCA: "test"} + d.setDefaultAndOptions(WithSecurity(security)) + + c.Assert(d.security, DeepEquals, security) + c.Assert(d.tikvConfig, DeepEquals, globalConfig.TiKVClient) + c.Assert(d.txnLocalLatches, DeepEquals, globalConfig.TxnLocalLatches) + c.Assert(d.pdConfig, DeepEquals, globalConfig.PDClient) + c.Assert(config.GetGlobalConfig().Security, DeepEquals, originSec) +} diff --git a/store/tikv/sql_fail_test.go b/store/driver/sql_fail_test.go similarity index 95% rename from store/tikv/sql_fail_test.go rename to store/driver/sql_fail_test.go index dec73a581b136..22306c69cbed2 100644 --- a/store/tikv/sql_fail_test.go +++ b/store/driver/sql_fail_test.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package tikv_test +package driver import ( "context" @@ -25,8 +25,9 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/domain" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" - . "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv" "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/testkit" ) @@ -44,14 +45,14 @@ type testSQLSerialSuite struct { type testSQLSuiteBase struct { OneByOneSuite - store Storage + store kv.Storage dom *domain.Domain } func (s *testSQLSuiteBase) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) var err error - s.store = NewTestStore(c).(Storage) + s.store = NewTestStore(c) // actual this is better done in `OneByOneSuite.SetUpSuite`, but this would cause circle dependency if *WithTiKV { session.ResetStoreForWithTiKVTest(s.store) @@ -99,7 +100,7 @@ func (s *testSQLSerialSuite) TestFailBusyServerCop(c *C) { } func TestMain(m *testing.M) { - ReadTimeoutMedium = 2 * time.Second + tikv.ReadTimeoutMedium = 2 * time.Second os.Exit(m.Run()) } @@ -116,7 +117,7 @@ func (s *testSQLSuite) TestCoprocessorStreamRecvTimeout(c *C) { enable := true visited := make(chan int, 1) timeouted := false - timeout := ReadTimeoutMedium + 100*time.Second + timeout := tikv.ReadTimeoutMedium + 100*time.Second ctx := context.WithValue(context.Background(), mock.HookKeyForTest("mockTiKVStreamRecvHook"), func(ctx context.Context) { if !enable { return diff --git a/store/driver/tikv_driver.go b/store/driver/tikv_driver.go new file mode 100644 index 0000000000000..6096ec5403121 --- /dev/null +++ b/store/driver/tikv_driver.go @@ -0,0 +1,321 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "context" + "crypto/tls" + "fmt" + "math/rand" + "net/url" + "strings" + "sync" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/copr" + txn_driver "github.com/pingcap/tidb/store/driver/txn" + "github.com/pingcap/tidb/store/gcworker" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/util/execdetails" + "github.com/pingcap/tidb/util/logutil" + pd "github.com/tikv/pd/client" + "go.uber.org/zap" + "google.golang.org/grpc" + "google.golang.org/grpc/keepalive" +) + +type storeCache struct { + sync.Mutex + cache map[string]*tikvStore +} + +var mc storeCache + +func init() { + mc.cache = make(map[string]*tikvStore) + rand.Seed(time.Now().UnixNano()) +} + +// Option is a function that changes some config of Driver +type Option func(*TiKVDriver) + +// WithSecurity changes the config.Security used by tikv driver. +func WithSecurity(s config.Security) Option { + return func(c *TiKVDriver) { + c.security = s + } +} + +// WithTiKVClientConfig changes the config.TiKVClient used by tikv driver. +func WithTiKVClientConfig(client config.TiKVClient) Option { + return func(c *TiKVDriver) { + c.tikvConfig = client + } +} + +// WithTxnLocalLatches changes the config.TxnLocalLatches used by tikv driver. +func WithTxnLocalLatches(t config.TxnLocalLatches) Option { + return func(c *TiKVDriver) { + c.txnLocalLatches = t + } +} + +// WithPDClientConfig changes the config.PDClient used by tikv driver. +func WithPDClientConfig(client config.PDClient) Option { + return func(c *TiKVDriver) { + c.pdConfig = client + } +} + +// TiKVDriver implements engine TiKV. +type TiKVDriver struct { + pdConfig config.PDClient + security config.Security + tikvConfig config.TiKVClient + txnLocalLatches config.TxnLocalLatches +} + +// Open opens or creates an TiKV storage with given path using global config. +// Path example: tikv://etcd-node1:port,etcd-node2:port?cluster=1&disableGC=false +func (d TiKVDriver) Open(path string) (kv.Storage, error) { + return d.OpenWithOptions(path) +} + +func (d *TiKVDriver) setDefaultAndOptions(options ...Option) { + tidbCfg := config.GetGlobalConfig() + d.pdConfig = tidbCfg.PDClient + d.security = tidbCfg.Security + d.tikvConfig = tidbCfg.TiKVClient + d.txnLocalLatches = tidbCfg.TxnLocalLatches + for _, f := range options { + f(d) + } +} + +// OpenWithOptions is used by other program that use tidb as a library, to avoid modifying GlobalConfig +// unspecified options will be set to global config +func (d TiKVDriver) OpenWithOptions(path string, options ...Option) (kv.Storage, error) { + mc.Lock() + defer mc.Unlock() + d.setDefaultAndOptions(options...) + etcdAddrs, disableGC, err := config.ParsePath(path) + if err != nil { + return nil, errors.Trace(err) + } + + pdCli, err := pd.NewClient(etcdAddrs, pd.SecurityOption{ + CAPath: d.security.ClusterSSLCA, + CertPath: d.security.ClusterSSLCert, + KeyPath: d.security.ClusterSSLKey, + }, pd.WithGRPCDialOptions( + grpc.WithKeepaliveParams(keepalive.ClientParameters{ + Time: time.Duration(d.tikvConfig.GrpcKeepAliveTime) * time.Second, + Timeout: time.Duration(d.tikvConfig.GrpcKeepAliveTimeout) * time.Second, + }), + ), pd.WithCustomTimeoutOption(time.Duration(d.pdConfig.PDServerTimeout)*time.Second)) + pdCli = execdetails.InterceptedPDClient{Client: pdCli} + + if err != nil { + return nil, errors.Trace(err) + } + + // FIXME: uuid will be a very long and ugly string, simplify it. + uuid := fmt.Sprintf("tikv-%v", pdCli.GetClusterID(context.TODO())) + if store, ok := mc.cache[uuid]; ok { + return store, nil + } + + tlsConfig, err := d.security.ToTLSConfig() + if err != nil { + return nil, errors.Trace(err) + } + + spkv, err := tikv.NewEtcdSafePointKV(etcdAddrs, tlsConfig) + if err != nil { + return nil, errors.Trace(err) + } + + pdClient := tikv.CodecPDClient{Client: pdCli} + s, err := tikv.NewKVStore(uuid, &pdClient, spkv, tikv.NewRPCClient(d.security)) + if err != nil { + return nil, errors.Trace(err) + } + if d.txnLocalLatches.Enabled { + s.EnableTxnLocalLatches(d.txnLocalLatches.Capacity) + } + coprCacheConfig := &config.GetGlobalConfig().TiKVClient.CoprCache + coprStore, err := copr.NewStore(s, coprCacheConfig) + if err != nil { + return nil, errors.Trace(err) + } + + store := &tikvStore{ + KVStore: s, + etcdAddrs: etcdAddrs, + tlsConfig: tlsConfig, + memCache: kv.NewCacheDB(), + pdClient: &pdClient, + enableGC: !disableGC, + coprStore: coprStore, + } + + mc.cache[uuid] = store + return store, nil +} + +type tikvStore struct { + *tikv.KVStore + etcdAddrs []string + tlsConfig *tls.Config + memCache kv.MemManager // this is used to query from memory + pdClient pd.Client + enableGC bool + gcWorker *gcworker.GCWorker + coprStore *copr.Store +} + +// Name gets the name of the storage engine +func (s *tikvStore) Name() string { + return "TiKV" +} + +// Describe returns of brief introduction of the storage +func (s *tikvStore) Describe() string { + return "TiKV is a distributed transactional key-value database" +} + +var ( + ldflagGetEtcdAddrsFromConfig = "0" // 1:Yes, otherwise:No +) + +// EtcdAddrs returns etcd server addresses. +func (s *tikvStore) EtcdAddrs() ([]string, error) { + if s.etcdAddrs == nil { + return nil, nil + } + + if ldflagGetEtcdAddrsFromConfig == "1" { + // For automated test purpose. + // To manipulate connection to etcd by mandatorily setting path to a proxy. + cfg := config.GetGlobalConfig() + return strings.Split(cfg.Path, ","), nil + } + + ctx := context.Background() + bo := tikv.NewBackoffer(ctx, tikv.GetAllMembersBackoff) + etcdAddrs := make([]string, 0) + pdClient := s.GetPDClient() + if pdClient == nil { + return nil, errors.New("Etcd client not found") + } + for { + members, err := pdClient.GetAllMembers(ctx) + if err != nil { + err := bo.Backoff(tikv.BoRegionMiss, err) + if err != nil { + return nil, err + } + continue + } + for _, member := range members { + if len(member.ClientUrls) > 0 { + u, err := url.Parse(member.ClientUrls[0]) + if err != nil { + logutil.BgLogger().Error("fail to parse client url from pd members", zap.String("client_url", member.ClientUrls[0]), zap.Error(err)) + return nil, err + } + etcdAddrs = append(etcdAddrs, u.Host) + } + } + return etcdAddrs, nil + } +} + +// TLSConfig returns the tls config to connect to etcd. +func (s *tikvStore) TLSConfig() *tls.Config { + return s.tlsConfig +} + +// StartGCWorker starts GC worker, it's called in BootstrapSession, don't call this function more than once. +func (s *tikvStore) StartGCWorker() error { + if !s.enableGC { + return nil + } + + gcWorker, err := gcworker.NewGCWorker(s, s.pdClient) + if err != nil { + return errors.Trace(err) + } + gcWorker.Start() + s.gcWorker = gcWorker + return nil +} + +func (s *tikvStore) GetClient() kv.Client { + return s.coprStore.GetClient() +} + +func (s *tikvStore) GetMPPClient() kv.MPPClient { + return s.coprStore.GetMPPClient() +} + +// Close and unregister the store. +func (s *tikvStore) Close() error { + mc.Lock() + defer mc.Unlock() + delete(mc.cache, s.UUID()) + if s.gcWorker != nil { + s.gcWorker.Close() + } + s.coprStore.Close() + return s.KVStore.Close() +} + +// GetMemCache return memory manager of the storage +func (s *tikvStore) GetMemCache() kv.MemManager { + return s.memCache +} + +// Begin a global transaction. +func (s *tikvStore) Begin() (kv.Transaction, error) { + txn, err := s.KVStore.Begin() + if err != nil { + return nil, errors.Trace(err) + } + return txn_driver.NewTiKVTxn(txn), err +} + +// BeginWithOption begins a transaction with given option +func (s *tikvStore) BeginWithOption(option kv.TransactionOption) (kv.Transaction, error) { + txn, err := s.KVStore.BeginWithOption(option) + if err != nil { + return nil, errors.Trace(err) + } + return txn_driver.NewTiKVTxn(txn), err +} + +// GetSnapshot gets a snapshot that is able to read any data which data is <= ver. +// if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. +func (s *tikvStore) GetSnapshot(ver kv.Version) kv.Snapshot { + return s.KVStore.GetSnapshot(ver.Ver) +} + +// CurrentVersion returns current max committed version with the given txnScope (local or global). +func (s *tikvStore) CurrentVersion(txnScope string) (kv.Version, error) { + ver, err := s.KVStore.CurrentTimestamp(txnScope) + return kv.NewVersion(ver), err +} diff --git a/store/driver/txn/txn_driver.go b/store/driver/txn/txn_driver.go new file mode 100644 index 0000000000000..95e3d916ac1a6 --- /dev/null +++ b/store/driver/txn/txn_driver.go @@ -0,0 +1,195 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package txn + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" + "go.uber.org/zap" +) + +type tikvTxn struct { + *tikv.KVTxn + idxNameCache map[int64]*model.TableInfo +} + +// NewTiKVTxn returns a new Transaction. +func NewTiKVTxn(txn *tikv.KVTxn) kv.Transaction { + return &tikvTxn{txn, make(map[int64]*model.TableInfo)} +} + +func (txn *tikvTxn) GetTableInfo(id int64) *model.TableInfo { + return txn.idxNameCache[id] +} + +func (txn *tikvTxn) CacheTableInfo(id int64, info *model.TableInfo) { + txn.idxNameCache[id] = info +} + +// lockWaitTime in ms, except that kv.LockAlwaysWait(0) means always wait lock, kv.LockNowait(-1) means nowait lock +func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput ...kv.Key) error { + err := txn.KVTxn.LockKeys(ctx, lockCtx, keysInput...) + return txn.extractKeyErr(err) +} + +func (txn *tikvTxn) Commit(ctx context.Context) error { + err := txn.KVTxn.Commit(ctx) + return txn.extractKeyErr(err) +} + +// GetSnapshot returns the Snapshot binding to this transaction. +func (txn *tikvTxn) GetSnapshot() kv.Snapshot { + return txn.KVTxn.GetSnapshot() +} + +func (txn *tikvTxn) extractKeyErr(err error) error { + if e, ok := errors.Cause(err).(*tikv.ErrKeyExist); ok { + return txn.extractKeyExistsErr(e.GetKey()) + } + return errors.Trace(err) +} + +func (txn *tikvTxn) extractKeyExistsErr(key kv.Key) error { + tableID, indexID, isRecord, err := tablecodec.DecodeKeyHead(key) + if err != nil { + return genKeyExistsError("UNKNOWN", key.String(), err) + } + + tblInfo := txn.GetTableInfo(tableID) + if tblInfo == nil { + return genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find table info")) + } + + value, err := txn.GetUnionStore().GetMemBuffer().SelectValueHistory(key, func(value []byte) bool { return len(value) != 0 }) + if err != nil { + return genKeyExistsError("UNKNOWN", key.String(), err) + } + + if isRecord { + return extractKeyExistsErrFromHandle(key, value, tblInfo) + } + return extractKeyExistsErrFromIndex(key, value, tblInfo, indexID) +} + +func genKeyExistsError(name string, value string, err error) error { + if err != nil { + logutil.BgLogger().Info("extractKeyExistsErr meets error", zap.Error(err)) + } + return kv.ErrKeyExists.FastGenByArgs(value, name) +} + +func extractKeyExistsErrFromHandle(key kv.Key, value []byte, tblInfo *model.TableInfo) error { + const name = "PRIMARY" + _, handle, err := tablecodec.DecodeRecordKey(key) + if err != nil { + return genKeyExistsError(name, key.String(), err) + } + + if handle.IsInt() { + if pkInfo := tblInfo.GetPkColInfo(); pkInfo != nil { + if mysql.HasUnsignedFlag(pkInfo.Flag) { + handleStr := fmt.Sprintf("%d", uint64(handle.IntValue())) + return genKeyExistsError(name, handleStr, nil) + } + } + return genKeyExistsError(name, handle.String(), nil) + } + + if len(value) == 0 { + return genKeyExistsError(name, handle.String(), errors.New("missing value")) + } + + idxInfo := tables.FindPrimaryIndex(tblInfo) + if idxInfo == nil { + return genKeyExistsError(name, handle.String(), errors.New("cannot find index info")) + } + + cols := make(map[int64]*types.FieldType, len(tblInfo.Columns)) + for _, col := range tblInfo.Columns { + cols[col.ID] = &col.FieldType + } + handleColIDs := make([]int64, 0, len(idxInfo.Columns)) + for _, col := range idxInfo.Columns { + handleColIDs = append(handleColIDs, tblInfo.Columns[col.Offset].ID) + } + + row, err := tablecodec.DecodeRowToDatumMap(value, cols, time.Local) + if err != nil { + return genKeyExistsError(name, handle.String(), err) + } + + data, err := tablecodec.DecodeHandleToDatumMap(handle, handleColIDs, cols, time.Local, row) + if err != nil { + return genKeyExistsError(name, handle.String(), err) + } + + valueStr := make([]string, 0, len(data)) + for _, col := range idxInfo.Columns { + d := data[tblInfo.Columns[col.Offset].ID] + str, err := d.ToString() + if err != nil { + return genKeyExistsError(name, key.String(), err) + } + valueStr = append(valueStr, str) + } + return genKeyExistsError(name, strings.Join(valueStr, "-"), nil) +} + +func extractKeyExistsErrFromIndex(key kv.Key, value []byte, tblInfo *model.TableInfo, indexID int64) error { + var idxInfo *model.IndexInfo + for _, index := range tblInfo.Indices { + if index.ID == indexID { + idxInfo = index + } + } + if idxInfo == nil { + return genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find index info")) + } + name := idxInfo.Name.String() + + if len(value) == 0 { + return genKeyExistsError(name, key.String(), errors.New("missing value")) + } + + colInfo := tables.BuildRowcodecColInfoForIndexColumns(idxInfo, tblInfo) + values, err := tablecodec.DecodeIndexKV(key, value, len(idxInfo.Columns), tablecodec.HandleNotNeeded, colInfo) + if err != nil { + return genKeyExistsError(name, key.String(), err) + } + valueStr := make([]string, 0, len(values)) + for i, val := range values { + d, err := tablecodec.DecodeColumnValue(val, colInfo[i].Ft, time.Local) + if err != nil { + return genKeyExistsError(name, key.String(), err) + } + str, err := d.ToString() + if err != nil { + return genKeyExistsError(name, key.String(), err) + } + valueStr = append(valueStr, str) + } + return genKeyExistsError(name, strings.Join(valueStr, "-"), nil) +} diff --git a/store/driver/util_test.go b/store/driver/util_test.go new file mode 100644 index 0000000000000..62477bd5bf202 --- /dev/null +++ b/store/driver/util_test.go @@ -0,0 +1,95 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package driver + +import ( + "context" + "flag" + "fmt" + "sync" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/copr" + "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv" +) + +var ( + withTiKVGlobalLock sync.RWMutex + WithTiKV = flag.Bool("with-tikv", false, "run tests with TiKV cluster started. (not use the mock server)") + pdAddrs = flag.String("pd-addrs", "127.0.0.1:2379", "pd addrs") +) + +// NewTestStore creates a kv.Storage for testing purpose. +func NewTestStore(c *C) kv.Storage { + if !flag.Parsed() { + flag.Parse() + } + + if *WithTiKV { + var d TiKVDriver + store, err := d.Open(fmt.Sprintf("tikv://%s", *pdAddrs)) + c.Assert(err, IsNil) + err = clearStorage(store) + c.Assert(err, IsNil) + return store + } + client, pdClient, cluster, err := unistore.New("") + c.Assert(err, IsNil) + unistore.BootstrapWithSingleStore(cluster) + store, err := tikv.NewTestTiKVStore(client, pdClient, nil, nil, 0) + c.Assert(err, IsNil) + coprStore, err := copr.NewStore(store, nil) + c.Assert(err, IsNil) + return &tikvStore{KVStore: store, coprStore: coprStore} +} + +func clearStorage(store kv.Storage) error { + txn, err := store.Begin() + if err != nil { + return errors.Trace(err) + } + iter, err := txn.Iter(nil, nil) + if err != nil { + return errors.Trace(err) + } + for iter.Valid() { + txn.Delete(iter.Key()) + if err := iter.Next(); err != nil { + return errors.Trace(err) + } + } + return txn.Commit(context.Background()) +} + +// OneByOneSuite is a suite, When with-tikv flag is true, there is only one storage, so the test suite have to run one by one. +type OneByOneSuite struct{} + +func (s *OneByOneSuite) SetUpSuite(c *C) { + if *WithTiKV { + withTiKVGlobalLock.Lock() + } else { + withTiKVGlobalLock.RLock() + } +} + +func (s *OneByOneSuite) TearDownSuite(c *C) { + if *WithTiKV { + withTiKVGlobalLock.Unlock() + } else { + withTiKVGlobalLock.RUnlock() + } +} diff --git a/store/tikv/gcworker/gc_worker.go b/store/gcworker/gc_worker.go similarity index 87% rename from store/tikv/gcworker/gc_worker.go rename to store/gcworker/gc_worker.go index ad4b761d04614..b85095850d183 100644 --- a/store/tikv/gcworker/gc_worker.go +++ b/store/gcworker/gc_worker.go @@ -17,6 +17,7 @@ import ( "bytes" "container/heap" "context" + "encoding/json" "fmt" "math" "os" @@ -31,19 +32,23 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/metrics" "github.com/pingcap/tidb/privilege" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" - tidbutil "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/logutil" + tikvutil "github.com/pingcap/tidb/store/tikv/util" + "github.com/pingcap/tidb/util/admin" pd "github.com/tikv/pd/client" "go.uber.org/zap" ) @@ -52,21 +57,22 @@ import ( type GCWorker struct { uuid string desc string - store tikv.Storage + store kv.Storage + tikvStore tikv.Storage pdClient pd.Client gcIsRunning bool lastFinish time.Time cancel context.CancelFunc done chan error testingKnobs struct { - scanLocks func(key []byte) []*tikv.Lock - resolveLocks func(regionID tikv.RegionVerID) (ok bool, err error) + scanLocks func(key []byte, regionID uint64) []*tikv.Lock + resolveLocks func(locks []*tikv.Lock, regionID tikv.RegionVerID) (ok bool, err error) } } // NewGCWorker creates a GCWorker instance. -func NewGCWorker(store tikv.Storage, pdClient pd.Client) (tikv.GCHandler, error) { - ver, err := store.CurrentVersion() +func NewGCWorker(store kv.Storage, pdClient pd.Client) (*GCWorker, error) { + ver, err := store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { return nil, errors.Trace(err) } @@ -74,15 +80,21 @@ func NewGCWorker(store tikv.Storage, pdClient pd.Client) (tikv.GCHandler, error) if err != nil { hostName = "unknown" } + tikvStore, ok := store.(tikv.Storage) + if !ok { + return nil, errors.New("GC should run against TiKV storage") + } worker := &GCWorker{ uuid: strconv.FormatUint(ver.Ver, 16), desc: fmt.Sprintf("host:%s, pid:%d, start at %s", hostName, os.Getpid(), time.Now()), store: store, + tikvStore: tikvStore, pdClient: pdClient, gcIsRunning: false, lastFinish: time.Now(), done: make(chan error), } + variable.RegisterStatistics(worker) return worker, nil } @@ -139,12 +151,19 @@ const ( gcScanLockModeKey = "tikv_gc_scan_lock_mode" gcScanLockModeLegacy = "legacy" gcScanLockModePhysical = "physical" - gcScanLockModeDefault = gcScanLockModePhysical + gcScanLockModeDefault = gcScanLockModeLegacy gcAutoConcurrencyKey = "tikv_gc_auto_concurrency" gcDefaultAutoConcurrency = true gcWorkerServiceSafePointID = "gc_worker" + + // Status var names start with tidb_% + tidbGCLastRunTime = "tidb_gc_last_run_time" + tidbGCLeaderDesc = "tidb_gc_leader_desc" + tidbGCLeaderLease = "tidb_gc_leader_lease" + tidbGCLeaderUUID = "tidb_gc_leader_uuid" + tidbGCSafePoint = "tidb_gc_safe_point" ) var gcSafePointCacheInterval = tikv.GcSafePointCacheInterval @@ -213,6 +232,32 @@ func createSession(store kv.Storage) session.Session { } } +// GetScope gets the status variables scope. +func (w *GCWorker) GetScope(status string) variable.ScopeFlag { + return variable.DefaultStatusVarScopeFlag +} + +// Stats returns the server statistics. +func (w *GCWorker) Stats(vars *variable.SessionVars) (map[string]interface{}, error) { + m := make(map[string]interface{}) + if v, err := w.loadValueFromSysTable(gcLeaderUUIDKey); err == nil { + m[tidbGCLeaderUUID] = v + } + if v, err := w.loadValueFromSysTable(gcLeaderDescKey); err == nil { + m[tidbGCLeaderDesc] = v + } + if v, err := w.loadValueFromSysTable(gcLeaderLeaseKey); err == nil { + m[tidbGCLeaderLease] = v + } + if v, err := w.loadValueFromSysTable(gcLastRunTimeKey); err == nil { + m[tidbGCLastRunTime] = v + } + if v, err := w.loadValueFromSysTable(gcSafePointKey); err == nil { + m[tidbGCSafePoint] = v + } + return m, nil +} + func (w *GCWorker) tick(ctx context.Context) { isLeader, err := w.checkLeader() if err != nil { @@ -286,7 +331,7 @@ func (w *GCWorker) prepare() (bool, uint64, error) { ctx := context.Background() se := createSession(w.store) defer se.Close() - _, err := se.Execute(ctx, "BEGIN") + _, err := se.ExecuteInternal(ctx, "BEGIN") if err != nil { return false, 0, errors.Trace(err) } @@ -319,7 +364,7 @@ func (w *GCWorker) checkPrepare(ctx context.Context) (bool, uint64, error) { if err != nil || !ok { return false, 0, errors.Trace(err) } - newSafePoint, newSafePointValue, err := w.calculateNewSafePoint(ctx, now) + newSafePoint, newSafePointValue, err := w.calcNewSafePoint(ctx, now) if err != nil || newSafePoint == nil { return false, 0, errors.Trace(err) } @@ -334,12 +379,10 @@ func (w *GCWorker) checkPrepare(ctx context.Context) (bool, uint64, error) { return true, newSafePointValue, nil } -// calculateNewSafePoint uses the current global transaction min start timestamp to calculate the new safe point. -func (w *GCWorker) calSafePointByMinStartTS(ctx context.Context, safePoint time.Time) time.Time { - kvs, err := w.store.GetSafePointKV().GetWithPrefix(infosync.ServerMinStartTSPath) +func (w *GCWorker) calcGlobalMinStartTS(ctx context.Context) (uint64, error) { + kvs, err := w.tikvStore.GetSafePointKV().GetWithPrefix(infosync.ServerMinStartTSPath) if err != nil { - logutil.Logger(ctx).Warn("get all minStartTS failed", zap.Error(err)) - return safePoint + return 0, err } var globalMinStartTS uint64 = math.MaxUint64 @@ -353,26 +396,33 @@ func (w *GCWorker) calSafePointByMinStartTS(ctx context.Context, safePoint time. globalMinStartTS = minStartTS } } + return globalMinStartTS, nil +} - safePointTS := variable.GoTimeToTS(safePoint) - if globalMinStartTS < safePointTS { - safePoint = time.Unix(0, oracle.ExtractPhysical(globalMinStartTS)*1e6) +// calcNewSafePoint uses the current global transaction min start timestamp to calculate the new safe point. +func (w *GCWorker) calcSafePointByMinStartTS(ctx context.Context, safePoint uint64) uint64 { + globalMinStartTS, err := w.calcGlobalMinStartTS(ctx) + if err != nil { + logutil.Logger(ctx).Warn("get all minStartTS failed", zap.Error(err)) + return safePoint + } + + if globalMinStartTS < safePoint { logutil.Logger(ctx).Info("[gc worker] gc safepoint blocked by a running session", zap.String("uuid", w.uuid), zap.Uint64("globalMinStartTS", globalMinStartTS), - zap.Time("safePoint", safePoint)) + zap.Uint64("safePoint", safePoint)) + safePoint = globalMinStartTS } return safePoint } func (w *GCWorker) getOracleTime() (time.Time, error) { - currentVer, err := w.store.CurrentVersion() + currentVer, err := w.store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { return time.Time{}, errors.Trace(err) } - physical := oracle.ExtractPhysical(currentVer.Ver) - sec, nsec := physical/1e3, (physical%1e3)*1e6 - return time.Unix(sec, nsec), nil + return oracle.GetTimeFromTS(currentVer.Ver), nil } func (w *GCWorker) checkGCEnable() (bool, error) { @@ -476,7 +526,7 @@ func (w *GCWorker) validateGCLifeTime(lifeTime time.Duration) (time.Duration, er return gcMinLifeTime, err } -func (w *GCWorker) calculateNewSafePoint(ctx context.Context, now time.Time) (*time.Time, uint64, error) { +func (w *GCWorker) calcNewSafePoint(ctx context.Context, now time.Time) (*time.Time, uint64, error) { lifeTime, err := w.loadDurationWithDefault(gcLifeTimeKey, gcDefaultLifeTime) if err != nil { return nil, 0, errors.Trace(err) @@ -486,21 +536,24 @@ func (w *GCWorker) calculateNewSafePoint(ctx context.Context, now time.Time) (*t return nil, 0, err } metrics.GCConfigGauge.WithLabelValues(gcLifeTimeKey).Set(lifeTime.Seconds()) + lastSafePoint, err := w.loadTime(gcSafePointKey) if err != nil { return nil, 0, errors.Trace(err) } - safePoint := w.calSafePointByMinStartTS(ctx, now.Add(-*lifeTime)) - safePointValue := oracle.ComposeTS(oracle.GetPhysical(safePoint), 0) + safePointValue := w.calcSafePointByMinStartTS(ctx, oracle.GoTimeToTS(now.Add(-*lifeTime))) safePointValue, err = w.setGCWorkerServiceSafePoint(ctx, safePointValue) - safePoint = oracle.GetTimeFromTS(safePointValue) - if err != nil { return nil, 0, errors.Trace(err) } + + // safepoint is recorded in time.Time format which strips the logical part of the timestamp. + // To prevent the GC worker from keeping working due to the loss of logical part when the + // safe point isn't changed, we should compare them in time.Time format. + safePoint := oracle.GetTimeFromTS(safePointValue) // We should never decrease safePoint. - if lastSafePoint != nil && safePoint.Before(*lastSafePoint) { + if lastSafePoint != nil && !safePoint.After(*lastSafePoint) { logutil.BgLogger().Info("[gc worker] last safe point is later than current one."+ "No need to gc."+ "This might be caused by manually enlarging gc lifetime", @@ -555,7 +608,7 @@ func (w *GCWorker) runGCJob(ctx context.Context, safePoint uint64, concurrency i } // Save safe point to pd. - err = w.saveSafePoint(w.store.GetSafePointKV(), safePoint) + err = w.saveSafePoint(w.tikvStore.GetSafePointKV(), safePoint) if err != nil { logutil.Logger(ctx).Error("[gc worker] failed to save safe point to PD", zap.String("uuid", w.uuid), @@ -655,6 +708,17 @@ func (w *GCWorker) deleteRanges(ctx context.Context, safePoint uint64, concurren zap.Error(err)) metrics.GCUnsafeDestroyRangeFailuresCounterVec.WithLabelValues("save").Inc() } + + pid, err := w.doGCPlacementRules(r) + if err != nil { + logutil.Logger(ctx).Error("[gc worker] gc placement rules failed on range", + zap.String("uuid", w.uuid), + zap.Int64("jobID", r.JobID), + zap.Int64("elementID", r.ElementID), + zap.Int64("pid", pid), + zap.Error(err)) + continue + } } logutil.Logger(ctx).Info("[gc worker] finish delete ranges", zap.String("uuid", w.uuid), @@ -742,7 +806,7 @@ func (w *GCWorker) doUnsafeDestroyRangeRequest(ctx context.Context, startKey []b go func() { defer wg.Done() - resp, err1 := w.store.GetTiKVClient().SendRequest(ctx, address, req, tikv.UnsafeDestroyRangeTimeout) + resp, err1 := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, tikv.UnsafeDestroyRangeTimeout) if err1 == nil { if resp == nil || resp.Resp == nil { err1 = errors.Errorf("unsafe destroy range returns nil response from store %v", storeID) @@ -776,7 +840,7 @@ func (w *GCWorker) doUnsafeDestroyRangeRequest(ctx context.Context, startKey []b } // Notify all affected regions in the range that UnsafeDestroyRange occurs. - notifyTask := tikv.NewNotifyDeleteRangeTask(w.store, startKey, endKey, concurrency) + notifyTask := tikv.NewNotifyDeleteRangeTask(w.tikvStore, startKey, endKey, concurrency) err = notifyTask.Execute(ctx) if err != nil { return errors.Annotate(err, "[gc worker] failed notifying regions affected by UnsafeDestroyRange") @@ -785,12 +849,6 @@ func (w *GCWorker) doUnsafeDestroyRangeRequest(ctx context.Context, startKey []b return nil } -const ( - engineLabelKey = "engine" - engineLabelTiFlash = "tiflash" - engineLabelTiKV = "tikv" -) - // needsGCOperationForStore checks if the store-level requests related to GC needs to be sent to the store. The store-level // requests includes UnsafeDestroyRange, PhysicalScanLock, etc. func needsGCOperationForStore(store *metapb.Store) (bool, error) { @@ -803,23 +861,21 @@ func needsGCOperationForStore(store *metapb.Store) (bool, error) { engineLabel := "" for _, label := range store.GetLabels() { - if label.GetKey() == engineLabelKey { + if label.GetKey() == placement.EngineLabelKey { engineLabel = label.GetValue() break } } switch engineLabel { - case engineLabelTiFlash: + case placement.EngineLabelTiFlash: // For a TiFlash node, it uses other approach to delete dropped tables, so it's safe to skip sending // UnsafeDestroyRange requests; it has only learner peers and their data must exist in TiKV, so it's safe to // skip physical resolve locks for it. return false, nil - case "": + case placement.EngineLabelTiKV, "": // If no engine label is set, it should be a TiKV node. - fallthrough - case engineLabelTiKV: return true, nil default: @@ -970,7 +1026,7 @@ func (w *GCWorker) legacyResolveLocks(ctx context.Context, safePoint uint64, con return w.resolveLocksForRange(ctx, safePoint, r.StartKey, r.EndKey) } - runner := tikv.NewRangeTaskRunner("resolve-locks-runner", w.store, concurrency, handler) + runner := tikv.NewRangeTaskRunner("resolve-locks-runner", w.tikvStore, concurrency, handler) // Run resolve lock on the whole TiKV cluster. Empty keys means the range is unbounded. err := runner.RunOnRange(ctx, []byte(""), []byte("")) if err != nil { @@ -998,6 +1054,10 @@ func (w *GCWorker) resolveLocksForRange(ctx context.Context, safePoint uint64, s Limit: gcScanLockLimit, }) + failpoint.Inject("lowScanLockLimit", func() { + req.ScanLock().Limit = 3 + }) + var stat tikv.RangeTaskStat key := startKey bo := tikv.NewBackofferWithVars(ctx, tikv.GcResolveLockMaxBackoff, nil) @@ -1016,11 +1076,12 @@ retryScanAndResolve: } req.ScanLock().StartKey = key - loc, err := w.store.GetRegionCache().LocateKey(bo, key) + loc, err := w.tikvStore.GetRegionCache().LocateKey(bo, key) if err != nil { return stat, errors.Trace(err) } - resp, err := w.store.SendReq(bo, req, loc.Region, tikv.ReadTimeoutMedium) + req.ScanLock().EndKey = loc.EndKey + resp, err := w.tikvStore.SendReq(bo, req, loc.Region, tikv.ReadTimeoutMedium) if err != nil { return stat, errors.Trace(err) } @@ -1048,12 +1109,18 @@ retryScanAndResolve: locks[i] = tikv.NewLock(locksInfo[i]) } if w.testingKnobs.scanLocks != nil { - locks = append(locks, w.testingKnobs.scanLocks(key)...) + locks = append(locks, w.testingKnobs.scanLocks(key, loc.Region.GetID())...) } + locForResolve := loc for { - ok, err1 := w.store.GetLockResolver().BatchResolveLocks(bo, locks, loc.Region) + var ( + ok bool + err1 error + ) if w.testingKnobs.resolveLocks != nil { - ok, err1 = w.testingKnobs.resolveLocks(loc.Region) + ok, err1 = w.testingKnobs.resolveLocks(locks, locForResolve.Region) + } else { + ok, err1 = w.tikvStore.GetLockResolver().BatchResolveLocks(bo, locks, locForResolve.Region) } if err1 != nil { return stat, errors.Trace(err1) @@ -1068,7 +1135,7 @@ retryScanAndResolve: return stat, errors.Trace(err) } if stillInSame { - loc = refreshedLoc + locForResolve = refreshedLoc continue } continue retryScanAndResolve @@ -1081,7 +1148,7 @@ retryScanAndResolve: } else { logutil.Logger(ctx).Info("[gc worker] region has more than limit locks", zap.String("uuid", w.uuid), - zap.Uint64("region", loc.Region.GetID()), + zap.Uint64("region", locForResolve.Region.GetID()), zap.Int("scan lock limit", gcScanLockLimit)) metrics.GCRegionTooManyLocksCounter.Inc() key = locks[len(locks)-1].Key @@ -1103,7 +1170,7 @@ func (w *GCWorker) tryRelocateLocksRegion(bo *tikv.Backoffer, locks []*tikv.Lock if len(locks) == 0 { return } - refreshedLoc, err = w.store.GetRegionCache().LocateKey(bo, locks[0].Key) + refreshedLoc, err = w.tikvStore.GetRegionCache().LocateKey(bo, locks[0].Key) if err != nil { return } @@ -1206,7 +1273,7 @@ func (w *GCWorker) registerLockObservers(ctx context.Context, safePoint uint64, for _, store := range stores { address := store.Address - resp, err := w.store.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) + resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) if err != nil { return errors.Trace(err) } @@ -1246,7 +1313,7 @@ func (w *GCWorker) checkLockObservers(ctx context.Context, safePoint uint64, sto for _, store := range stores { address := store.Address - resp, err := w.store.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) + resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) if err != nil { logError(store, err) continue @@ -1312,7 +1379,7 @@ func (w *GCWorker) removeLockObservers(ctx context.Context, safePoint uint64, st for _, store := range stores { address := store.Address - resp, err := w.store.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) + resp, err := w.tikvStore.GetTiKVClient().SendRequest(ctx, address, req, tikv.AccessLockObserverTimeout) if err != nil { logError(store, err) continue @@ -1335,7 +1402,7 @@ func (w *GCWorker) physicalScanAndResolveLocks(ctx context.Context, safePoint ui // Cancel all spawned goroutines for lock scanning and resolving. defer cancel() - scanner := newMergeLockScanner(safePoint, w.store.GetTiKVClient(), stores) + scanner := newMergeLockScanner(safePoint, w.tikvStore.GetTiKVClient(), stores) err := scanner.Start(ctx) if err != nil { return nil, errors.Trace(err) @@ -1411,7 +1478,7 @@ func (w *GCWorker) resolveLocksAcrossRegions(ctx context.Context, locks []*tikv. } key := locks[0].Key - loc, err := w.store.GetRegionCache().LocateKey(bo, key) + loc, err := w.tikvStore.GetRegionCache().LocateKey(bo, key) if err != nil { return errors.Trace(err) } @@ -1426,7 +1493,7 @@ func (w *GCWorker) resolveLocksAcrossRegions(ctx context.Context, locks []*tikv. } } - ok, err := w.store.GetLockResolver().BatchResolveLocks(bo, locksInRegion, loc.Region) + ok, err := w.tikvStore.GetLockResolver().BatchResolveLocks(bo, locksInRegion, loc.Region) if err != nil { return errors.Trace(err) } @@ -1488,7 +1555,7 @@ func (w *GCWorker) doGCForRange(ctx context.Context, startKey []byte, endKey []b key := startKey for { bo := tikv.NewBackofferWithVars(ctx, tikv.GcOneRegionMaxBackoff, nil) - loc, err := w.store.GetRegionCache().LocateKey(bo, key) + loc, err := w.tikvStore.GetRegionCache().LocateKey(bo, key) if err != nil { return stat, errors.Trace(err) } @@ -1532,7 +1599,7 @@ func (w *GCWorker) doGCForRegion(bo *tikv.Backoffer, safePoint uint64, region ti SafePoint: safePoint, }) - resp, err := w.store.SendReq(bo, req, region, tikv.GCTimeout) + resp, err := w.tikvStore.SendReq(bo, req, region, tikv.GCTimeout) if err != nil { return nil, errors.Trace(err) } @@ -1565,7 +1632,7 @@ func (w *GCWorker) doGC(ctx context.Context, safePoint uint64, concurrency int) runner := tikv.NewRangeTaskRunner( "gc-runner", - w.store, + w.tikvStore, concurrency, func(ctx context.Context, r kv.KeyRange) (tikv.RangeTaskStat, error) { return w.doGCForRange(ctx, r.StartKey, r.EndKey, safePoint) @@ -1600,7 +1667,7 @@ func (w *GCWorker) checkLeader() (bool, error) { defer se.Close() ctx := context.Background() - _, err := se.Execute(ctx, "BEGIN") + _, err := se.ExecuteInternal(ctx, "BEGIN") if err != nil { return false, errors.Trace(err) } @@ -1625,7 +1692,7 @@ func (w *GCWorker) checkLeader() (bool, error) { se.RollbackTxn(ctx) - _, err = se.Execute(ctx, "BEGIN") + _, err = se.ExecuteInternal(ctx, "BEGIN") if err != nil { return false, errors.Trace(err) } @@ -1675,7 +1742,7 @@ func (w *GCWorker) saveSafePoint(kv tikv.SafePointKV, t uint64) error { } func (w *GCWorker) saveTime(key string, t time.Time) error { - err := w.saveValueToSysTable(key, t.Format(tidbutil.GCTimeFormat)) + err := w.saveValueToSysTable(key, t.Format(tikvutil.GCTimeFormat)) return errors.Trace(err) } @@ -1687,7 +1754,7 @@ func (w *GCWorker) loadTime(key string) (*time.Time, error) { if str == "" { return nil, nil } - t, err := tidbutil.CompatibleParseGCTime(str) + t, err := tikvutil.CompatibleParseGCTime(str) if err != nil { return nil, errors.Trace(err) } @@ -1733,16 +1800,15 @@ func (w *GCWorker) loadValueFromSysTable(key string) (string, error) { ctx := context.Background() se := createSession(w.store) defer se.Close() - stmt := fmt.Sprintf(`SELECT HIGH_PRIORITY (variable_value) FROM mysql.tidb WHERE variable_name='%s' FOR UPDATE`, key) - rs, err := se.Execute(ctx, stmt) - if len(rs) > 0 { - defer terror.Call(rs[0].Close) + rs, err := se.ExecuteInternal(ctx, `SELECT HIGH_PRIORITY (variable_value) FROM mysql.tidb WHERE variable_name=%? FOR UPDATE`, key) + if rs != nil { + defer terror.Call(rs.Close) } if err != nil { return "", errors.Trace(err) } - req := rs[0].NewChunk() - err = rs[0].Next(ctx, req) + req := rs.NewChunk() + err = rs.Next(ctx, req) if err != nil { return "", errors.Trace(err) } @@ -1759,13 +1825,14 @@ func (w *GCWorker) loadValueFromSysTable(key string) (string, error) { } func (w *GCWorker) saveValueToSysTable(key, value string) error { - stmt := fmt.Sprintf(`INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') + const stmt = `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES (%?, %?, %?) ON DUPLICATE KEY - UPDATE variable_value = '%[2]s', comment = '%[3]s'`, - key, value, gcVariableComments[key]) + UPDATE variable_value = %?, comment = %?` se := createSession(w.store) defer se.Close() - _, err := se.Execute(context.Background(), stmt) + _, err := se.ExecuteInternal(context.Background(), stmt, + key, value, gcVariableComments[key], + value, gcVariableComments[key]) logutil.BgLogger().Debug("[gc worker] save kv", zap.String("key", key), zap.String("value", value), @@ -1773,12 +1840,67 @@ func (w *GCWorker) saveValueToSysTable(key, value string) error { return errors.Trace(err) } +// GC placement rules when the partitions are removed by the GC worker. +// Placement rules cannot be removed immediately after drop table / truncate table, +// because the tables can be flashed back or recovered. +func (w *GCWorker) doGCPlacementRules(dr util.DelRangeTask) (pid int64, err error) { + // Get the job from the job history + var historyJob *model.Job + failpoint.Inject("mockHistoryJobForGC", func(v failpoint.Value) { + args, err1 := json.Marshal([]interface{}{kv.Key{}, []int64{int64(v.(int))}}) + if err1 != nil { + return + } + historyJob = &model.Job{ + ID: dr.JobID, + Type: model.ActionDropTable, + RawArgs: args, + } + }) + if historyJob == nil { + err = kv.RunInNewTxn(context.Background(), w.store, false, func(ctx context.Context, txn kv.Transaction) error { + var err1 error + t := meta.NewMeta(txn) + historyJob, err1 = t.GetHistoryDDLJob(dr.JobID) + return err1 + }) + if err != nil { + return + } + if historyJob == nil { + return 0, admin.ErrDDLJobNotFound.GenWithStackByArgs(dr.JobID) + } + } + + // Get the partition ID from the job and DelRangeTask. + switch historyJob.Type { + case model.ActionDropTable, model.ActionTruncateTable: + var physicalTableIDs []int64 + var startKey kv.Key + if err = historyJob.DecodeArgs(&startKey, &physicalTableIDs); err != nil { + return + } + // If it's a partitioned table, then the element ID is the partition ID. + if len(physicalTableIDs) > 0 { + pid = dr.ElementID + } + } + // Not drop table / truncate table or not a partitioned table, no need to GC placement rules. + if pid == 0 { + return + } + // Notify PD to drop the placement rules, even if there may be no placement rules. + bundles := []*placement.Bundle{placement.BuildPlacementDropBundle(pid)} + err = infosync.PutRuleBundles(context.TODO(), bundles) + return +} + // RunGCJob sends GC command to KV. It is exported for kv api, do not use it with GCWorker at the same time. func RunGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int) error { gcWorker := &GCWorker{ - store: s, - uuid: identifier, - pdClient: pd, + tikvStore: s, + uuid: identifier, + pdClient: pd, } if concurrency <= 0 { @@ -1795,7 +1917,7 @@ func RunGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint6 return errors.Trace(err) } - err = gcWorker.saveSafePoint(gcWorker.store.GetSafePointKV(), safePoint) + err = gcWorker.saveSafePoint(gcWorker.tikvStore.GetSafePointKV(), safePoint) if err != nil { return errors.Trace(err) } @@ -1813,9 +1935,9 @@ func RunGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint6 // Param concurrency specifies the concurrency of resolveLocks phase. func RunDistributedGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int) error { gcWorker := &GCWorker{ - store: s, - uuid: identifier, - pdClient: pd, + tikvStore: s, + uuid: identifier, + pdClient: pd, } safePoint, err := gcWorker.setGCWorkerServiceSafePoint(ctx, safePoint) @@ -1829,7 +1951,7 @@ func RunDistributedGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safe } // Save safe point to pd. - err = gcWorker.saveSafePoint(gcWorker.store.GetSafePointKV(), safePoint) + err = gcWorker.saveSafePoint(gcWorker.tikvStore.GetSafePointKV(), safePoint) if err != nil { return errors.Trace(err) } @@ -1847,9 +1969,9 @@ func RunDistributedGCJob(ctx context.Context, s tikv.Storage, pd pd.Client, safe // It is exported only for test, do not use it in the production environment. func RunResolveLocks(ctx context.Context, s tikv.Storage, pd pd.Client, safePoint uint64, identifier string, concurrency int, usePhysical bool) (bool, error) { gcWorker := &GCWorker{ - store: s, - uuid: identifier, - pdClient: pd, + tikvStore: s, + uuid: identifier, + pdClient: pd, } return gcWorker.resolveLocks(ctx, safePoint, concurrency, usePhysical) } @@ -1860,8 +1982,8 @@ type MockGCWorker struct { } // NewMockGCWorker creates a MockGCWorker instance ONLY for test. -func NewMockGCWorker(store tikv.Storage) (*MockGCWorker, error) { - ver, err := store.CurrentVersion() +func NewMockGCWorker(store kv.Storage) (*MockGCWorker, error) { + ver, err := store.CurrentVersion(oracle.GlobalTxnScope) if err != nil { return nil, errors.Trace(err) } @@ -1873,6 +1995,7 @@ func NewMockGCWorker(store tikv.Storage) (*MockGCWorker, error) { uuid: strconv.FormatUint(ver.Ver, 16), desc: fmt.Sprintf("host:%s, pid:%d, start at %s", hostName, os.Getpid(), time.Now()), store: store, + tikvStore: store.(tikv.Storage), gcIsRunning: false, lastFinish: time.Now(), done: make(chan error), @@ -1969,12 +2092,16 @@ type scanLockResult struct { } func newMergeLockScanner(safePoint uint64, client tikv.Client, stores map[uint64]*metapb.Store) *mergeLockScanner { - return &mergeLockScanner{ + scanner := &mergeLockScanner{ safePoint: safePoint, client: client, stores: stores, scanLockLimit: gcScanLockLimit, } + failpoint.Inject("lowPhysicalScanLockLimit", func() { + scanner.scanLockLimit = 3 + }) + return scanner } // Start initializes the scanner and enables retrieving items from the scanner. diff --git a/store/tikv/gcworker/gc_worker_test.go b/store/gcworker/gc_worker_test.go similarity index 85% rename from store/tikv/gcworker/gc_worker_test.go rename to store/gcworker/gc_worker_test.go index 222954145efba..c4006fa3f31aa 100644 --- a/store/tikv/gcworker/gc_worker_test.go +++ b/store/gcworker/gc_worker_test.go @@ -31,17 +31,18 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/ddl/util" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/domain/infosync" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" - "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/store/mockoracle" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/mockstore/mocktikv" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/store/tikv/oracle/oracles" "github.com/pingcap/tidb/store/tikv/tikvrpc" pd "github.com/tikv/pd/client" ) @@ -51,20 +52,24 @@ func TestT(t *testing.T) { } type testGCWorkerSuite struct { - store tikv.Storage - cluster cluster.Cluster - oracle *mockoracle.MockOracle - gcWorker *GCWorker - dom *domain.Domain - client *testGCWorkerClient - pdClient pd.Client + store kv.Storage + tikvStore tikv.Storage + cluster cluster.Cluster + oracle *oracles.MockOracle + gcWorker *GCWorker + dom *domain.Domain + client *testGCWorkerClient + pdClient pd.Client + initRegion struct { + storeIDs []uint64 + peerIDs []uint64 + regionID uint64 + } } var _ = SerialSuites(&testGCWorkerSuite{}) func (s *testGCWorkerSuite) SetUpTest(c *C) { - tikv.NewGCHandlerFunc = NewGCWorker - hijackClient := func(client tikv.Client) tikv.Client { s.client = &testGCWorkerClient{ Client: client, @@ -74,8 +79,9 @@ func (s *testGCWorkerSuite) SetUpTest(c *C) { } store, err := mockstore.NewMockStore( + mockstore.WithStoreType(mockstore.MockTiKV), mockstore.WithClusterInspector(func(c cluster.Cluster) { - mockstore.BootstrapWithMultiStores(c, 3) + s.initRegion.storeIDs, s.initRegion.peerIDs, s.initRegion.regionID, _ = mockstore.BootstrapWithMultiStores(c, 3) s.cluster = c }), mockstore.WithClientHijacker(hijackClient), @@ -86,10 +92,10 @@ func (s *testGCWorkerSuite) SetUpTest(c *C) { ) c.Assert(err, IsNil) - s.store = store.(tikv.Storage) - c.Assert(err, IsNil) - s.oracle = &mockoracle.MockOracle{} - s.store.SetOracle(s.oracle) + s.store = store + s.tikvStore = store.(tikv.Storage) + s.oracle = &oracles.MockOracle{} + s.tikvStore.SetOracle(s.oracle) s.dom, err = session.BootstrapSession(s.store) c.Assert(err, IsNil) @@ -97,7 +103,7 @@ func (s *testGCWorkerSuite) SetUpTest(c *C) { c.Assert(err, IsNil) gcWorker.Start() gcWorker.Close() - s.gcWorker = gcWorker.(*GCWorker) + s.gcWorker = gcWorker } func (s *testGCWorkerSuite) TearDownTest(c *C) { @@ -120,17 +126,15 @@ func (s *testGCWorkerSuite) mustPut(c *C, key, value string) { } func (s *testGCWorkerSuite) mustGet(c *C, key string, ts uint64) string { - snap, err := s.store.GetSnapshot(kv.Version{Ver: ts}) - c.Assert(err, IsNil) + snap := s.store.GetSnapshot(kv.Version{Ver: ts}) value, err := snap.Get(context.TODO(), []byte(key)) c.Assert(err, IsNil) return string(value) } func (s *testGCWorkerSuite) mustGetNone(c *C, key string, ts uint64) { - snap, err := s.store.GetSnapshot(kv.Version{Ver: ts}) - c.Assert(err, IsNil) - _, err = snap.Get(context.TODO(), []byte(key)) + snap := s.store.GetSnapshot(kv.Version{Ver: ts}) + _, err := snap.Get(context.TODO(), []byte(key)) if err != nil { // Unistore's gc is based on compaction filter. // So skip the error check if err == nil. @@ -139,7 +143,7 @@ func (s *testGCWorkerSuite) mustGetNone(c *C, key string, ts uint64) { } func (s *testGCWorkerSuite) mustAllocTs(c *C) uint64 { - ts, err := s.oracle.GetTimestamp(context.Background()) + ts, err := s.oracle.GetTimestamp(context.Background(), &oracle.Option{}) c.Assert(err, IsNil) return ts } @@ -232,33 +236,32 @@ func (s *testGCWorkerSuite) TestGetOracleTime(c *C) { func (s *testGCWorkerSuite) TestMinStartTS(c *C) { ctx := context.Background() - spkv := s.store.GetSafePointKV() + spkv := s.tikvStore.GetSafePointKV() err := spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), strconv.FormatUint(math.MaxUint64, 10)) c.Assert(err, IsNil) - now := time.Now() - sp := s.gcWorker.calSafePointByMinStartTS(ctx, now) - c.Assert(sp.Second(), Equals, now.Second()) + now := oracle.GoTimeToTS(time.Now()) + sp := s.gcWorker.calcSafePointByMinStartTS(ctx, now) + c.Assert(sp, Equals, now) err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), "0") c.Assert(err, IsNil) - sp = s.gcWorker.calSafePointByMinStartTS(ctx, now) - zeroTime := time.Unix(0, oracle.ExtractPhysical(0)*1e6) - c.Assert(sp, Equals, zeroTime) + sp = s.gcWorker.calcSafePointByMinStartTS(ctx, now) + c.Assert(sp, Equals, uint64(0)) err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), "0") c.Assert(err, IsNil) err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "b"), "1") c.Assert(err, IsNil) - sp = s.gcWorker.calSafePointByMinStartTS(ctx, now) - c.Assert(sp, Equals, zeroTime) + sp = s.gcWorker.calcSafePointByMinStartTS(ctx, now) + c.Assert(sp, Equals, uint64(0)) err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), - strconv.FormatUint(variable.GoTimeToTS(now), 10)) + strconv.FormatUint(now, 10)) c.Assert(err, IsNil) err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "b"), - strconv.FormatUint(variable.GoTimeToTS(now.Add(-20*time.Second)), 10)) + strconv.FormatUint(now-oracle.EncodeTSO(20000), 10)) c.Assert(err, IsNil) - sp = s.gcWorker.calSafePointByMinStartTS(ctx, now.Add(-10*time.Second)) - c.Assert(sp.Second(), Equals, now.Add(-20*time.Second).Second()) + sp = s.gcWorker.calcSafePointByMinStartTS(ctx, now-oracle.EncodeTSO(10000)) + c.Assert(sp, Equals, now-oracle.EncodeTSO(20000)) } func (s *testGCWorkerSuite) TestPrepareGC(c *C) { @@ -372,12 +375,45 @@ func (s *testGCWorkerSuite) TestPrepareGC(c *C) { useAutoConcurrency, err = s.gcWorker.checkUseAutoConcurrency() c.Assert(err, IsNil) c.Assert(useAutoConcurrency, IsTrue) + + // Check skipping GC if safe point is not changed. + safePointTime, err := s.gcWorker.loadTime(gcSafePointKey) + minStartTS := oracle.GoTimeToTS(*safePointTime) + 1 + c.Assert(err, IsNil) + spkv := s.tikvStore.GetSafePointKV() + err = spkv.Put(fmt.Sprintf("%s/%s", infosync.ServerMinStartTSPath, "a"), strconv.FormatUint(minStartTS, 10)) + c.Assert(err, IsNil) + s.oracle.AddOffset(time.Minute * 40) + ok, safepoint, err := s.gcWorker.prepare() + c.Assert(err, IsNil) + c.Assert(ok, IsFalse) + c.Assert(safepoint, Equals, uint64(0)) +} + +func (s *testGCWorkerSuite) TestStatusVars(c *C) { + // Status variables should now exist for: + // tidb_gc_safe_point, tidb_gc_last_run_time + se := createSession(s.gcWorker.store) + defer se.Close() + + safePoint, err := s.gcWorker.loadValueFromSysTable(gcSafePointKey) + c.Assert(err, IsNil) + lastRunTime, err := s.gcWorker.loadValueFromSysTable(gcLastRunTimeKey) + c.Assert(err, IsNil) + + statusVars, _ := s.gcWorker.Stats(se.GetSessionVars()) + val, ok := statusVars[tidbGCSafePoint] + c.Assert(ok, IsTrue) + c.Assert(val, Equals, safePoint) + val, ok = statusVars[tidbGCLastRunTime] + c.Assert(ok, IsTrue) + c.Assert(val, Equals, lastRunTime) } func (s *testGCWorkerSuite) TestDoGCForOneRegion(c *C) { ctx := context.Background() bo := tikv.NewBackofferWithVars(ctx, tikv.GcOneRegionMaxBackoff, nil) - loc, err := s.store.GetRegionCache().LocateKey(bo, []byte("")) + loc, err := s.tikvStore.GetRegionCache().LocateKey(bo, []byte("")) c.Assert(err, IsNil) var regionErr *errorpb.Error @@ -481,23 +517,24 @@ func (s *testGCWorkerSuite) TestCheckGCMode(c *C) { func (s *testGCWorkerSuite) TestCheckScanLockMode(c *C) { usePhysical, err := s.gcWorker.checkUsePhysicalScanLock() c.Assert(err, IsNil) + c.Assert(usePhysical, Equals, false) c.Assert(usePhysical, Equals, gcScanLockModeDefault == gcScanLockModePhysical) // Now the row must be set to the default value. str, err := s.gcWorker.loadValueFromSysTable(gcScanLockModeKey) c.Assert(err, IsNil) c.Assert(str, Equals, gcScanLockModeDefault) - err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModeLegacy) + err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModePhysical) c.Assert(err, IsNil) usePhysical, err = s.gcWorker.checkUsePhysicalScanLock() c.Assert(err, IsNil) - c.Assert(usePhysical, Equals, false) + c.Assert(usePhysical, Equals, true) - err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModePhysical) + err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, gcScanLockModeLegacy) c.Assert(err, IsNil) usePhysical, err = s.gcWorker.checkUsePhysicalScanLock() c.Assert(err, IsNil) - c.Assert(usePhysical, Equals, true) + c.Assert(usePhysical, Equals, false) err = s.gcWorker.saveValueToSysTable(gcScanLockModeKey, "invalid_mode") c.Assert(err, IsNil) @@ -511,7 +548,7 @@ func (s *testGCWorkerSuite) TestNeedsGCOperationForStore(c *C) { store := &metapb.Store{} store.State = state if hasEngineLabel { - store.Labels = []*metapb.StoreLabel{{Key: engineLabelKey, Value: engineLabel}} + store.Labels = []*metapb.StoreLabel{{Key: placement.EngineLabelKey, Value: engineLabel}} } return store } @@ -525,12 +562,12 @@ func (s *testGCWorkerSuite) TestNeedsGCOperationForStore(c *C) { res, err = needsGCOperationForStore(newStore(state, true, "")) c.Assert(err, IsNil) c.Assert(res, Equals, needGC) - res, err = needsGCOperationForStore(newStore(state, true, engineLabelTiKV)) + res, err = needsGCOperationForStore(newStore(state, true, placement.EngineLabelTiKV)) c.Assert(err, IsNil) c.Assert(res, Equals, needGC) // TiFlash does not need these operations. - res, err = needsGCOperationForStore(newStore(state, true, engineLabelTiFlash)) + res, err = needsGCOperationForStore(newStore(state, true, placement.EngineLabelTiFlash)) c.Assert(err, IsNil) c.Assert(res, IsFalse) } @@ -546,6 +583,11 @@ const ( ) func (s *testGCWorkerSuite) testDeleteRangesFailureImpl(c *C, failType int) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC", "return(1)"), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC"), IsNil) + }() + // Put some delete range tasks. se := createSession(s.gcWorker.store) defer se.Close() @@ -830,10 +872,10 @@ func (s *testGCWorkerSuite) TestLeaderTick(c *C) { func (s *testGCWorkerSuite) TestResolveLockRangeInfine(c *C) { c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/invalidCacheAndRetry", "return(true)"), IsNil) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/setGcResolveMaxBackoff", "return(1)"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/setGcResolveMaxBackoff", "return(1)"), IsNil) defer func() { c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/invalidCacheAndRetry"), IsNil) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/setGcResolveMaxBackoff"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/setGcResolveMaxBackoff"), IsNil) }() _, err := s.gcWorker.resolveLocksForRange(context.Background(), 1, []byte{0}, []byte{1}) c.Assert(err, NotNil) @@ -846,7 +888,7 @@ func (s *testGCWorkerSuite) TestResolveLockRangeMeetRegionCacheMiss(c *C) { resolveCnt int resolveCntRef = &resolveCnt ) - s.gcWorker.testingKnobs.scanLocks = func(key []byte) []*tikv.Lock { + s.gcWorker.testingKnobs.scanLocks = func(key []byte, regionID uint64) []*tikv.Lock { *scanCntRef++ return []*tikv.Lock{ { @@ -857,10 +899,10 @@ func (s *testGCWorkerSuite) TestResolveLockRangeMeetRegionCacheMiss(c *C) { }, } } - s.gcWorker.testingKnobs.resolveLocks = func(regionID tikv.RegionVerID) (ok bool, err error) { + s.gcWorker.testingKnobs.resolveLocks = func(locks []*tikv.Lock, regionID tikv.RegionVerID) (ok bool, err error) { *resolveCntRef++ if *resolveCntRef == 1 { - s.gcWorker.store.GetRegionCache().InvalidateCachedRegion(regionID) + s.gcWorker.tikvStore.GetRegionCache().InvalidateCachedRegion(regionID) // mock the region cache miss error return false, nil } @@ -872,6 +914,75 @@ func (s *testGCWorkerSuite) TestResolveLockRangeMeetRegionCacheMiss(c *C) { c.Assert(scanCnt, Equals, 1) } +func (s *testGCWorkerSuite) TestResolveLockRangeMeetRegionEnlargeCausedByRegionMerge(c *C) { + var ( + firstAccess = true + firstAccessRef = &firstAccess + resolvedLock [][]byte + ) + + // key range: ['' - 'm' - 'z'] + region2 := s.cluster.AllocID() + newPeers := []uint64{s.cluster.AllocID(), s.cluster.AllocID(), s.cluster.AllocID()} + s.cluster.Split(s.initRegion.regionID, region2, []byte("m"), newPeers, newPeers[0]) + + // init a, b lock in region1 and o, p locks in region2 + s.gcWorker.testingKnobs.scanLocks = func(key []byte, regionID uint64) []*tikv.Lock { + if regionID == s.initRegion.regionID { + return []*tikv.Lock{{Key: []byte("a")}, {Key: []byte("b")}} + } + if regionID == region2 { + return []*tikv.Lock{{Key: []byte("o")}, {Key: []byte("p")}} + } + return []*tikv.Lock{} + } + + s.gcWorker.testingKnobs.resolveLocks = func(locks []*tikv.Lock, regionID tikv.RegionVerID) (ok bool, err error) { + if regionID.GetID() == s.initRegion.regionID && *firstAccessRef { + *firstAccessRef = false + // merge region2 into region1 and return EpochNotMatch error. + mCluster := s.cluster.(*mocktikv.Cluster) + mCluster.Merge(s.initRegion.regionID, region2) + regionMeta, _ := mCluster.GetRegion(s.initRegion.regionID) + err := s.tikvStore.GetRegionCache().OnRegionEpochNotMatch( + tikv.NewNoopBackoff(context.Background()), + &tikv.RPCContext{Region: regionID, Store: &tikv.Store{}}, + []*metapb.Region{regionMeta}) + c.Assert(err, IsNil) + // also let region1 contains all 4 locks + s.gcWorker.testingKnobs.scanLocks = func(key []byte, regionID uint64) []*tikv.Lock { + if regionID == s.initRegion.regionID { + locks := []*tikv.Lock{ + {Key: []byte("a")}, + {Key: []byte("b")}, + {Key: []byte("o")}, + {Key: []byte("p")}, + } + for i, lock := range locks { + if bytes.Compare(key, lock.Key) <= 0 { + return locks[i:] + } + } + } + return []*tikv.Lock{} + } + return false, nil + } + for _, lock := range locks { + resolvedLock = append(resolvedLock, lock.Key) + } + return true, nil + } + + _, err := s.gcWorker.resolveLocksForRange(context.Background(), 1, []byte(""), []byte("z")) + c.Assert(err, IsNil) + c.Assert(len(resolvedLock), Equals, 4) + expects := [][]byte{[]byte("a"), []byte("b"), []byte("o"), []byte("p")} + for i, l := range resolvedLock { + c.Assert(l, BytesEquals, expects[i]) + } +} + func (s *testGCWorkerSuite) TestRunGCJob(c *C) { gcSafePointCacheInterval = 0 @@ -953,7 +1064,7 @@ func (s *testGCWorkerSuite) TestRunGCJobAPI(c *C) { p := s.createGCProbe(c, "k1") safePoint := s.mustAllocTs(c) - err := RunGCJob(context.Background(), s.store, s.pdClient, safePoint, "mock", 1) + err := RunGCJob(context.Background(), s.tikvStore, s.pdClient, safePoint, "mock", 1) c.Assert(err, IsNil) s.checkCollected(c, p) etcdSafePoint := s.loadEtcdSafePoint(c) @@ -965,7 +1076,7 @@ func (s *testGCWorkerSuite) TestRunDistGCJobAPI(c *C) { gcSafePointCacheInterval = 0 safePoint := s.mustAllocTs(c) - err := RunDistributedGCJob(context.Background(), s.store, s.pdClient, safePoint, "mock", 1) + err := RunDistributedGCJob(context.Background(), s.tikvStore, s.pdClient, safePoint, "mock", 1) c.Assert(err, IsNil) pdSafePoint := s.mustGetSafePointFromPd(c) c.Assert(pdSafePoint, Equals, safePoint) @@ -988,7 +1099,7 @@ func (s *testGCWorkerSuite) TestStartWithRunGCJobFailures(c *C) { } func (s *testGCWorkerSuite) loadEtcdSafePoint(c *C) uint64 { - val, err := s.gcWorker.store.GetSafePointKV().Get(tikv.GcSavedSafePoint) + val, err := s.gcWorker.tikvStore.GetSafePointKV().Get(tikv.GcSavedSafePoint) c.Assert(err, IsNil) res, err := strconv.ParseUint(val, 10, 64) c.Assert(err, IsNil) @@ -1110,9 +1221,7 @@ func (s *testGCWorkerSuite) TestMergeLockScanner(c *C) { makeLockList := func(locks ...*tikv.Lock) []*tikv.Lock { res := make([]*tikv.Lock, 0, len(locks)) - for _, lock := range locks { - res = append(res, lock) - } + res = append(res, locks...) return res } @@ -1298,11 +1407,11 @@ func (s *testGCWorkerSuite) TestResolveLocksPhysical(c *C) { locks := []*kvrpcpb.LockInfo{{Key: []byte{0}}} return &tikvrpc.Response{Resp: &kvrpcpb.PhysicalScanLockResponse{Locks: locks, Error: ""}}, nil } - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/resolveLocksAcrossRegionsErr", "return(100)"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/resolveLocksAcrossRegionsErr", "return(100)"), IsNil) physicalUsed, err = s.gcWorker.resolveLocks(ctx, safePoint, 3, true) c.Assert(physicalUsed, IsFalse) c.Assert(err, IsNil) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/resolveLocksAcrossRegionsErr"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/resolveLocksAcrossRegionsErr"), IsNil) // Shouldn't fall back when fails to scan locks less than 3 times. reset() @@ -1345,7 +1454,7 @@ func (s *testGCWorkerSuite) TestResolveLocksPhysical(c *C) { reset() var wg sync.WaitGroup wg.Add(1) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers", "pause"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers", "pause"), IsNil) go func() { defer wg.Done() physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) @@ -1364,13 +1473,13 @@ func (s *testGCWorkerSuite) TestResolveLocksPhysical(c *C) { } return alwaysSucceedHanlder(addr, req) } - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers"), IsNil) wg.Wait() // Shouldn't fall back when a store is removed. reset() wg.Add(1) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers", "pause"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers", "pause"), IsNil) go func() { defer wg.Done() physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) @@ -1380,13 +1489,13 @@ func (s *testGCWorkerSuite) TestResolveLocksPhysical(c *C) { // Sleep to let the goroutine pause. time.Sleep(500 * time.Millisecond) s.cluster.RemoveStore(100) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers"), IsNil) wg.Wait() // Should fall back when a cleaned store becomes dirty. reset() wg.Add(1) - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers", "pause"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers", "pause"), IsNil) go func() { defer wg.Done() physicalUsed, err := s.gcWorker.resolveLocks(ctx, safePoint, 3, true) @@ -1417,7 +1526,7 @@ func (s *testGCWorkerSuite) TestResolveLocksPhysical(c *C) { return alwaysSucceedHanlder(addr, req) } } - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/beforeCheckLockObservers"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/beforeCheckLockObservers"), IsNil) wg.Wait() // Shouldn't fall back when fails to remove lock observers. @@ -1452,9 +1561,9 @@ func (s *testGCWorkerSuite) TestPhyscailScanLockDeadlock(c *C) { // Sleep 1000ms to let the main goroutine block on sending tasks. // Inject error to the goroutine resolving locks so that the main goroutine will block forever if it doesn't handle channels properly. - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/gcworker/resolveLocksAcrossRegionsErr", "return(1000)"), IsNil) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/resolveLocksAcrossRegionsErr", "return(1000)"), IsNil) defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/gcworker/resolveLocksAcrossRegionsErr"), IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/resolveLocksAcrossRegionsErr"), IsNil) }() done := make(chan interface{}) @@ -1471,3 +1580,15 @@ func (s *testGCWorkerSuite) TestPhyscailScanLockDeadlock(c *C) { c.Fatal("physicalScanAndResolveLocks blocks") } } + +func (s *testGCWorkerSuite) TestGCPlacementRules(c *C) { + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC", "return(1)"), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/gcworker/mockHistoryJobForGC"), IsNil) + }() + + dr := util.DelRangeTask{JobID: 1, ElementID: 1} + pid, err := s.gcWorker.doGCPlacementRules(dr) + c.Assert(pid, Equals, int64(1)) + c.Assert(err, IsNil) +} diff --git a/store/helper/helper.go b/store/helper/helper.go index bf8ad5a012da2..71ddb5c942a9e 100644 --- a/store/helper/helper.go +++ b/store/helper/helper.go @@ -33,6 +33,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util" @@ -43,14 +44,43 @@ import ( "go.uber.org/zap" ) +// Storage represents a storage that connects TiKV. +// Methods copied from kv.Storage and tikv.Storage due to limitation of go1.13. +type Storage interface { + Begin() (kv.Transaction, error) + BeginWithOption(option kv.TransactionOption) (kv.Transaction, error) + GetSnapshot(ver kv.Version) kv.Snapshot + GetClient() kv.Client + GetMPPClient() kv.MPPClient + Close() error + UUID() string + CurrentVersion(txnScope string) (kv.Version, error) + CurrentTimestamp(txnScop string) (uint64, error) + GetOracle() oracle.Oracle + SupportDeleteRange() (supported bool) + Name() string + Describe() string + ShowStatus(ctx context.Context, key string) (interface{}, error) + GetMemCache() kv.MemManager + GetRegionCache() *tikv.RegionCache + SendReq(bo *tikv.Backoffer, req *tikvrpc.Request, regionID tikv.RegionVerID, timeout time.Duration) (*tikvrpc.Response, error) + GetLockResolver() *tikv.LockResolver + GetSafePointKV() tikv.SafePointKV + UpdateSPCache(cachedSP uint64, cachedTime time.Time) + SetOracle(oracle oracle.Oracle) + SetTiKVClient(client tikv.Client) + GetTiKVClient() tikv.Client + Closed() <-chan struct{} +} + // Helper is a middleware to get some information from tikv/pd. It can be used for TiDB's http api or mem table. type Helper struct { - Store tikv.Storage + Store Storage RegionCache *tikv.RegionCache } -// NewHelper get a Helper from Storage -func NewHelper(store tikv.Storage) *Helper { +// NewHelper gets a Helper from Storage +func NewHelper(store Storage) *Helper { return &Helper{ Store: store, RegionCache: store.GetRegionCache(), @@ -118,7 +148,7 @@ func (h *Helper) ScrapeHotInfo(rw string, allSchemas []*model.DBInfo) ([]HotTabl // FetchHotRegion fetches the hot region information from PD's http api. func (h *Helper) FetchHotRegion(rw string) (map[uint64]RegionMetric, error) { - etcd, ok := h.Store.(tikv.EtcdBackend) + etcd, ok := h.Store.(kv.EtcdBackend) if !ok { return nil, errors.WithStack(errors.New("not implemented")) } @@ -204,6 +234,7 @@ type HotTableIndex struct { func (h *Helper) FetchRegionTableIndex(metrics map[uint64]RegionMetric, allSchemas []*model.DBInfo) ([]HotTableIndex, error) { hotTables := make([]HotTableIndex, 0, len(metrics)) for regionID, regionMetric := range metrics { + regionMetric := regionMetric t := HotTableIndex{RegionID: regionID, RegionMetric: ®ionMetric} region, err := h.RegionCache.LocateRegionByID(tikv.NewBackofferWithVars(context.Background(), 500, nil), regionID) if err != nil { @@ -571,6 +602,22 @@ func newIndexWithKeyRange(db *model.DBInfo, table *model.TableInfo, index *model } } +func newPartitionTableWithKeyRange(db *model.DBInfo, table *model.TableInfo, partitionID int64) tableInfoWithKeyRange { + sk, ek := tablecodec.GetTableHandleKeyRange(partitionID) + startKey := bytesKeyToHex(codec.EncodeBytes(nil, sk)) + endKey := bytesKeyToHex(codec.EncodeBytes(nil, ek)) + return tableInfoWithKeyRange{ + &TableInfo{ + DB: db, + Table: table, + IsIndex: false, + Index: nil, + }, + startKey, + endKey, + } +} + // GetRegionsTableInfo returns a map maps region id to its tables or indices. // Assuming tables or indices key ranges never intersect. // Regions key ranges can intersect. @@ -586,7 +633,13 @@ func (h *Helper) GetRegionsTableInfo(regionsInfo *RegionsInfo, schemas []*model. tables := []tableInfoWithKeyRange{} for _, db := range schemas { for _, table := range db.Tables { - tables = append(tables, newTableWithKeyRange(db, table)) + if table.Partition != nil { + for _, partition := range table.Partition.Definitions { + tables = append(tables, newPartitionTableWithKeyRange(db, table, partition.ID)) + } + } else { + tables = append(tables, newTableWithKeyRange(db, table)) + } for _, index := range table.Indices { tables = append(tables, newIndexWithKeyRange(db, table, index)) } @@ -638,7 +691,7 @@ func (h *Helper) GetRegionInfoByID(regionID uint64) (*RegionInfo, error) { // request PD API, decode the response body into res func (h *Helper) requestPD(method, uri string, body io.Reader, res interface{}) error { - etcd, ok := h.Store.(tikv.EtcdBackend) + etcd, ok := h.Store.(kv.EtcdBackend) if !ok { return errors.WithStack(errors.New("not implemented")) } @@ -724,7 +777,7 @@ type StoreDetailStat struct { // GetStoresStat gets the TiKV store information by accessing PD's api. func (h *Helper) GetStoresStat() (*StoresStat, error) { - etcd, ok := h.Store.(tikv.EtcdBackend) + etcd, ok := h.Store.(kv.EtcdBackend) if !ok { return nil, errors.WithStack(errors.New("not implemented")) } @@ -759,7 +812,7 @@ func (h *Helper) GetStoresStat() (*StoresStat, error) { // GetPDAddr return the PD Address. func (h *Helper) GetPDAddr() ([]string, error) { - etcd, ok := h.Store.(tikv.EtcdBackend) + etcd, ok := h.Store.(kv.EtcdBackend) if !ok { return nil, errors.New("not implemented") } diff --git a/store/helper/helper_test.go b/store/helper/helper_test.go index 8f25dfb4efdca..80020d5dde240 100644 --- a/store/helper/helper_test.go +++ b/store/helper/helper_test.go @@ -27,13 +27,13 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/tidb/store/helper" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/pdapi" "go.uber.org/zap" ) type HelperTestSuite struct { - store tikv.Storage + store helper.Storage } var _ = Suite(new(HelperTestSuite)) @@ -44,7 +44,7 @@ func TestT(t *testing.T) { } type mockStore struct { - tikv.Storage + helper.Storage pdAddrs []string } @@ -60,12 +60,25 @@ func (s *mockStore) TLSConfig() *tls.Config { panic("not implemented") } +func (s *mockStore) Name() string { + return "mock store" +} + +func (s *mockStore) Describe() string { + return "" +} + func (s *HelperTestSuite) SetUpSuite(c *C) { url := s.mockPDHTTPServer(c) time.Sleep(100 * time.Millisecond) - mockTikvStore, err := mockstore.NewMockStore() + mockTikvStore, err := mockstore.NewMockStore( + mockstore.WithClusterInspector(func(c cluster.Cluster) { + mockstore.BootstrapWithMultiRegions(c, []byte("x")) + }), + ) + s.store = &mockStore{ - mockTikvStore.(tikv.Storage), + mockTikvStore.(helper.Storage), []string{url[len("http://"):]}, } c.Assert(err, IsNil) @@ -78,18 +91,25 @@ func (s *HelperTestSuite) TestHotRegion(c *C) { } regionMetric, err := h.FetchHotRegion(pdapi.HotRead) c.Assert(err, IsNil, Commentf("err: %+v", err)) - expected := make(map[uint64]helper.RegionMetric) - expected[1] = helper.RegionMetric{ - FlowBytes: 100, - MaxHotDegree: 1, - Count: 0, + expected := map[uint64]helper.RegionMetric{ + 2: { + FlowBytes: 100, + MaxHotDegree: 1, + Count: 0, + }, + 4: { + FlowBytes: 200, + MaxHotDegree: 2, + Count: 0, + }, } c.Assert(regionMetric, DeepEquals, expected) dbInfo := &model.DBInfo{ Name: model.NewCIStr("test"), } c.Assert(err, IsNil) - _, err = h.FetchRegionTableIndex(regionMetric, []*model.DBInfo{dbInfo}) + res, err := h.FetchRegionTableIndex(regionMetric, []*model.DBInfo{dbInfo}) + c.Assert(res[0].RegionMetric, Not(Equals), res[1].RegionMetric) c.Assert(err, IsNil, Commentf("err: %+v", err)) } @@ -141,9 +161,14 @@ func (s *HelperTestSuite) mockHotRegionResponse(w http.ResponseWriter, req *http RegionsStat: []helper.RegionStat{ { FlowBytes: 100, - RegionID: 1, + RegionID: 2, HotDegree: 1, }, + { + FlowBytes: 200, + RegionID: 4, + HotDegree: 2, + }, }, } resp := helper.StoreHotRegionInfos{ diff --git a/store/mockstore/mockstore.go b/store/mockstore/mockstore.go index 9ed1832f75288..77fb061ae56bf 100644 --- a/store/mockstore/mockstore.go +++ b/store/mockstore/mockstore.go @@ -20,10 +20,10 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" pd "github.com/tikv/pd/client" ) diff --git a/store/mockstore/mocktikv/analyze.go b/store/mockstore/mocktikv/analyze.go index 8027823818899..a575f5536015d 100644 --- a/store/mockstore/mocktikv/analyze.go +++ b/store/mockstore/mocktikv/analyze.go @@ -81,7 +81,7 @@ func (h *rpcHandler) handleAnalyzeIndexReq(req *coprocessor.Request, analyzeReq execDetail: new(execDetail), hdStatus: tablecodec.HandleNotNeeded, } - statsBuilder := statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob)) + statsBuilder := statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statistics.Version1) var cms *statistics.CMSketch if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) @@ -111,7 +111,7 @@ func (h *rpcHandler) handleAnalyzeIndexReq(req *coprocessor.Request, analyzeReq hg := statistics.HistogramToProto(statsBuilder.Hist()) var cm *tipb.CMSketch if cms != nil { - cm = statistics.CMSketchToProto(cms) + cm = statistics.CMSketchToProto(cms, nil) } data, err := proto.Marshal(&tipb.AnalyzeIndexResp{Hist: hg, Cms: cm}) if err != nil { @@ -212,7 +212,7 @@ func (h *rpcHandler) handleAnalyzeColumnsReq(req *coprocessor.Request, analyzeRe ColsFieldType: fts, } if pkID != -1 { - builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob)) + builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statistics.Version1) } if colReq.CmsketchWidth != nil && colReq.CmsketchDepth != nil { builder.CMSketchWidth = *colReq.CmsketchWidth diff --git a/store/mockstore/mocktikv/cluster.go b/store/mockstore/mocktikv/cluster.go index d7131647a69b6..abeade418cd69 100644 --- a/store/mockstore/mocktikv/cluster.go +++ b/store/mockstore/mocktikv/cluster.go @@ -24,10 +24,8 @@ import ( "github.com/golang/protobuf/proto" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/tablecodec" pd "github.com/tikv/pd/client" - "go.uber.org/atomic" ) // Cluster simulates a TiKV cluster. It focuses on management and the change of @@ -152,7 +150,7 @@ func (c *Cluster) CancelStore(storeID uint64) { c.Lock() defer c.Unlock() - //A store returns context.Cancelled Error when cancel is true. + // A store returns context.Cancelled Error when cancel is true. if store := c.stores[storeID]; store != nil { store.cancel = true } @@ -182,27 +180,28 @@ func (c *Cluster) GetStoreByAddr(addr string) *metapb.Store { } // GetAndCheckStoreByAddr checks and returns a Store's meta by an addr -func (c *Cluster) GetAndCheckStoreByAddr(addr string) (*metapb.Store, error) { +func (c *Cluster) GetAndCheckStoreByAddr(addr string) (ss []*metapb.Store, err error) { c.RLock() defer c.RUnlock() for _, s := range c.stores { if s.cancel { - return nil, context.Canceled + err = context.Canceled + return } if s.meta.GetAddress() == addr { - return proto.Clone(s.meta).(*metapb.Store), nil + ss = append(ss, proto.Clone(s.meta).(*metapb.Store)) } } - return nil, nil + return } // AddStore add a new Store to the cluster. -func (c *Cluster) AddStore(storeID uint64, addr string) { +func (c *Cluster) AddStore(storeID uint64, addr string, labels ...*metapb.StoreLabel) { c.Lock() defer c.Unlock() - c.stores[storeID] = newStore(storeID, addr) + c.stores[storeID] = newStore(storeID, addr, labels...) } // RemoveStore removes a Store from the cluster. @@ -213,6 +212,15 @@ func (c *Cluster) RemoveStore(storeID uint64) { delete(c.stores, storeID) } +// MarkTombstone marks store as tombstone. +func (c *Cluster) MarkTombstone(storeID uint64) { + c.Lock() + defer c.Unlock() + nm := *c.stores[storeID].meta + nm.State = metapb.StoreState_Tombstone + c.stores[storeID].meta = &nm +} + // UpdateStoreAddr updates store address for cluster. func (c *Cluster) UpdateStoreAddr(storeID uint64, addr string, labels ...*metapb.StoreLabel) { c.Lock() @@ -420,7 +428,7 @@ func (c *Cluster) SplitIndex(tableID, indexID int64, count int) { // SplitKeys evenly splits the start, end key into "count" regions. // Only works for single store. -func (c *Cluster) SplitKeys(start, end kv.Key, count int) { +func (c *Cluster) SplitKeys(start, end []byte, count int) { c.splitRange(c.mvccStore, NewMvccKey(start), NewMvccKey(end), count) } @@ -431,6 +439,13 @@ func (c *Cluster) ScheduleDelay(startTS, regionID uint64, dur time.Duration) { c.delayMu.Unlock() } +// UpdateStoreLabels merge the target and owned labels together +func (c *Cluster) UpdateStoreLabels(storeID uint64, labels []*metapb.StoreLabel) { + c.Lock() + defer c.Unlock() + c.stores[storeID].mergeLabels(labels) +} + func (c *Cluster) handleDelay(startTS, regionID uint64) { key := delayKey{startTS: startTS, regionID: regionID} c.delayMu.Lock() @@ -651,9 +666,8 @@ func (r *Region) incVersion() { // Store is the Store's meta data. type Store struct { - meta *metapb.Store - cancel bool // return context.Cancelled error when cancel is true. - tokenCount atomic.Int64 + meta *metapb.Store + cancel bool // return context.Cancelled error when cancel is true. } func newStore(storeID uint64, addr string, labels ...*metapb.StoreLabel) *Store { @@ -665,3 +679,25 @@ func newStore(storeID uint64, addr string, labels ...*metapb.StoreLabel) *Store }, } } + +func (s *Store) mergeLabels(labels []*metapb.StoreLabel) { + if len(s.meta.Labels) < 1 { + s.meta.Labels = labels + return + } + kv := make(map[string]string, len(s.meta.Labels)) + for _, label := range s.meta.Labels { + kv[label.Key] = label.Value + } + for _, label := range labels { + kv[label.Key] = label.Value + } + mergedLabels := make([]*metapb.StoreLabel, 0, len(kv)) + for k, v := range kv { + mergedLabels = append(mergedLabels, &metapb.StoreLabel{ + Key: k, + Value: v, + }) + } + s.meta.Labels = mergedLabels +} diff --git a/store/mockstore/mocktikv/cluster_manipulate.go b/store/mockstore/mocktikv/cluster_manipulate.go index bc7a1121ff8da..11512521609f5 100644 --- a/store/mockstore/mocktikv/cluster_manipulate.go +++ b/store/mockstore/mocktikv/cluster_manipulate.go @@ -13,7 +13,11 @@ package mocktikv -import "fmt" +import ( + "fmt" + + "github.com/pingcap/kvproto/pkg/metapb" +) // BootstrapWithSingleStore initializes a Cluster with 1 Region and 1 Store. func BootstrapWithSingleStore(cluster *Cluster) (storeID, peerID, regionID uint64) { @@ -31,7 +35,13 @@ func BootstrapWithMultiStores(cluster *Cluster, n int) (storeIDs, peerIDs []uint leaderPeer = peerIDs[0] regionID = cluster.AllocID() for _, storeID := range storeIDs { - cluster.AddStore(storeID, fmt.Sprintf("store%d", storeID)) + labels := []*metapb.StoreLabel{ + { + Key: "id", + Value: fmt.Sprintf("%v", storeID), + }, + } + cluster.AddStore(storeID, fmt.Sprintf("store%d", storeID), labels...) } cluster.Bootstrap(regionID, storeIDs, peerIDs, leaderPeer) return diff --git a/store/mockstore/mocktikv/cluster_test.go b/store/mockstore/mocktikv/cluster_test.go index a281766ce6c92..0e85fb5b6ca33 100644 --- a/store/mockstore/mocktikv/cluster_test.go +++ b/store/mockstore/mocktikv/cluster_test.go @@ -35,7 +35,7 @@ import ( var _ = Suite(&testClusterSuite{}) type testClusterSuite struct { - store kv.Storage + store tikv.Storage } func (s *testClusterSuite) TestClusterSplit(c *C) { diff --git a/store/mockstore/mocktikv/cop_handler_dag.go b/store/mockstore/mocktikv/cop_handler_dag.go index 8c8874fab2094..d020d058467ee 100644 --- a/store/mockstore/mocktikv/cop_handler_dag.go +++ b/store/mockstore/mocktikv/cop_handler_dag.go @@ -925,6 +925,6 @@ func fieldTypeFromPBColumn(col *tipb.ColumnInfo) *types.FieldType { Flen: int(col.GetColumnLen()), Decimal: int(col.GetDecimal()), Elems: col.Elems, - Collate: mysql.Collations[uint8(collate.RestoreCollationIDIfNeeded(col.GetCollation()))], + Collate: collate.CollationID2Name(collate.RestoreCollationIDIfNeeded(col.GetCollation())), } } diff --git a/store/mockstore/mocktikv/executor_test.go b/store/mockstore/mocktikv/executor_test.go index a9c964a4591ba..62bde121c059b 100644 --- a/store/mockstore/mocktikv/executor_test.go +++ b/store/mockstore/mocktikv/executor_test.go @@ -23,8 +23,10 @@ import ( "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" + "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/mockstore/mocktikv" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/testkit" ) @@ -46,7 +48,7 @@ func (s *testExecutorSuite) SetUpSuite(c *C) { s.mvccStore = rpcClient.MvccStore store, err := tikv.NewTestTiKVStore(rpcClient, pdClient, nil, nil, 0) c.Assert(err, IsNil) - s.store = store + s.store = mockstore.NewMockStorage(store) session.SetSchemaLease(0) session.DisableStats4Test() s.dom, err = session.BootstrapSession(s.store) @@ -72,8 +74,8 @@ func (s *testExecutorSuite) TestResolvedLargeTxnLocks(c *C) { tk.MustExec("insert into t values (1, 1)") - oracle := s.store.GetOracle() - tso, err := oracle.GetTimestamp(context.Background()) + o := s.store.GetOracle() + tso, err := o.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) key := tablecodec.EncodeRowKeyWithHandle(tbl.Meta().ID, kv.IntHandle(1)) diff --git a/store/mockstore/mocktikv/mock_tikv_test.go b/store/mockstore/mocktikv/mock_tikv_test.go index 5444c8ddcc828..7ddcf8f360cb3 100644 --- a/store/mockstore/mocktikv/mock_tikv_test.go +++ b/store/mockstore/mocktikv/mock_tikv_test.go @@ -689,21 +689,21 @@ func (s *testMVCCLevelDB) TestCheckTxnStatus(c *C) { startTS := uint64(5 << 18) s.mustPrewriteWithTTLOK(c, putMutations("pk", "val"), "pk", startTS, 666) - ttl, commitTS, action, err := s.store.CheckTxnStatus([]byte("pk"), startTS, startTS+100, 666, false) + ttl, commitTS, action, err := s.store.CheckTxnStatus([]byte("pk"), startTS, startTS+100, 666, false, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(666)) c.Assert(commitTS, Equals, uint64(0)) c.Assert(action, Equals, kvrpcpb.Action_MinCommitTSPushed) // MaxUint64 as callerStartTS shouldn't update minCommitTS but return Action_MinCommitTSPushed. - ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk"), startTS, math.MaxUint64, 666, false) + ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk"), startTS, math.MaxUint64, 666, false, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(666)) c.Assert(commitTS, Equals, uint64(0)) c.Assert(action, Equals, kvrpcpb.Action_MinCommitTSPushed) s.mustCommitOK(c, [][]byte{[]byte("pk")}, startTS, startTS+101) - ttl, commitTS, _, err = s.store.CheckTxnStatus([]byte("pk"), startTS, 0, 666, false) + ttl, commitTS, _, err = s.store.CheckTxnStatus([]byte("pk"), startTS, 0, 666, false, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(0)) c.Assert(commitTS, Equals, startTS+101) @@ -711,7 +711,7 @@ func (s *testMVCCLevelDB) TestCheckTxnStatus(c *C) { s.mustPrewriteWithTTLOK(c, putMutations("pk1", "val"), "pk1", startTS, 666) s.mustRollbackOK(c, [][]byte{[]byte("pk1")}, startTS) - ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk1"), startTS, 0, 666, false) + ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk1"), startTS, 0, 666, false, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(0)) c.Assert(commitTS, Equals, uint64(0)) @@ -719,21 +719,21 @@ func (s *testMVCCLevelDB) TestCheckTxnStatus(c *C) { s.mustPrewriteWithTTLOK(c, putMutations("pk2", "val"), "pk2", startTS, 666) currentTS := uint64(777 << 18) - ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk2"), startTS, 0, currentTS, false) + ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("pk2"), startTS, 0, currentTS, false, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(0)) c.Assert(commitTS, Equals, uint64(0)) c.Assert(action, Equals, kvrpcpb.Action_TTLExpireRollback) // Cover the TxnNotFound case. - _, _, _, err = s.store.CheckTxnStatus([]byte("txnNotFound"), 5, 0, 666, false) + _, _, _, err = s.store.CheckTxnStatus([]byte("txnNotFound"), 5, 0, 666, false, false) c.Assert(err, NotNil) notFound, ok := errors.Cause(err).(*ErrTxnNotFound) c.Assert(ok, IsTrue) c.Assert(notFound.StartTs, Equals, uint64(5)) c.Assert(string(notFound.PrimaryKey), Equals, "txnNotFound") - ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("txnNotFound"), 5, 0, 666, true) + ttl, commitTS, action, err = s.store.CheckTxnStatus([]byte("txnNotFound"), 5, 0, 666, true, false) c.Assert(err, IsNil) c.Assert(ttl, Equals, uint64(0)) c.Assert(commitTS, Equals, uint64(0)) @@ -753,7 +753,7 @@ func (s *testMVCCLevelDB) TestCheckTxnStatus(c *C) { func (s *testMVCCLevelDB) TestRejectCommitTS(c *C) { s.mustPrewriteOK(c, putMutations("x", "A"), "x", 5) // Push the minCommitTS - _, _, _, err := s.store.CheckTxnStatus([]byte("x"), 5, 100, 100, false) + _, _, _, err := s.store.CheckTxnStatus([]byte("x"), 5, 100, 100, false, false) c.Assert(err, IsNil) err = s.store.Commit([][]byte{[]byte("x")}, 5, 10) e, ok := errors.Cause(err).(*ErrCommitTSExpired) diff --git a/store/mockstore/mocktikv/mvcc.go b/store/mockstore/mocktikv/mvcc.go index c02c3d718349e..98cbbb6ce0ce3 100644 --- a/store/mockstore/mocktikv/mvcc.go +++ b/store/mockstore/mocktikv/mvcc.go @@ -242,15 +242,6 @@ func (e *mvccEntry) Get(ts uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLock return nil, nil } -type rawEntry struct { - key []byte - value []byte -} - -func (e *rawEntry) Less(than btree.Item) bool { - return bytes.Compare(e.key, than.(*rawEntry).key) < 0 -} - // MVCCStore is a mvcc key-value storage. type MVCCStore interface { Get(key []byte, startTS uint64, isoLevel kvrpcpb.IsolationLevel, resolvedLocks []uint64) ([]byte, error) @@ -269,7 +260,7 @@ type MVCCStore interface { BatchResolveLock(startKey, endKey []byte, txnInfos map[uint64]uint64) error GC(startKey, endKey []byte, safePoint uint64) error DeleteRange(startKey, endKey []byte) error - CheckTxnStatus(primaryKey []byte, lockTS uint64, startTS, currentTS uint64, rollbackIfNotFound bool) (uint64, uint64, kvrpcpb.Action, error) + CheckTxnStatus(primaryKey []byte, lockTS uint64, startTS, currentTS uint64, rollbackIfNotFound bool, resolvingPessimisticLock bool) (uint64, uint64, kvrpcpb.Action, error) Close() error } diff --git a/store/mockstore/mocktikv/mvcc_leveldb.go b/store/mockstore/mocktikv/mvcc_leveldb.go index e1f191009f806..57327deac8045 100644 --- a/store/mockstore/mocktikv/mvcc_leveldb.go +++ b/store/mockstore/mocktikv/mvcc_leveldb.go @@ -1122,7 +1122,7 @@ func (mvcc *MVCCLevelDB) Cleanup(key []byte, startTS, currentTS uint64) error { // callerStartTS is the start ts of reader transaction. // currentTS is the current ts, but it may be inaccurate. Just use it to check TTL. func (mvcc *MVCCLevelDB) CheckTxnStatus(primaryKey []byte, lockTS, callerStartTS, currentTS uint64, - rollbackIfNotExist bool) (ttl uint64, commitTS uint64, action kvrpcpb.Action, err error) { + rollbackIfNotExist bool, resolvingPessimisticLock bool) (ttl uint64, commitTS uint64, action kvrpcpb.Action, err error) { mvcc.mu.Lock() defer mvcc.mu.Unlock() @@ -1151,15 +1151,24 @@ func (mvcc *MVCCLevelDB) CheckTxnStatus(primaryKey []byte, lockTS, callerStartTS // If the lock has already outdated, clean up it. if uint64(oracle.ExtractPhysical(lock.startTS))+lock.ttl < uint64(oracle.ExtractPhysical(currentTS)) { - if err = rollbackLock(batch, primaryKey, lockTS); err != nil { - err = errors.Trace(err) - return + if resolvingPessimisticLock && lock.op == kvrpcpb.Op_PessimisticLock { + action = kvrpcpb.Action_TTLExpirePessimisticRollback + if err = pessimisticRollbackKey(mvcc.db, batch, primaryKey, lock.startTS, lock.forUpdateTS); err != nil { + err = errors.Trace(err) + return + } + } else { + action = kvrpcpb.Action_TTLExpireRollback + if err = rollbackLock(batch, primaryKey, lockTS); err != nil { + err = errors.Trace(err) + return + } } if err = mvcc.db.Write(batch, nil); err != nil { err = errors.Trace(err) return } - return 0, 0, kvrpcpb.Action_TTLExpireRollback, nil + return 0, 0, action, nil } // If the caller_start_ts is MaxUint64, it's a point get in the autocommit transaction. @@ -1225,6 +1234,9 @@ func (mvcc *MVCCLevelDB) CheckTxnStatus(primaryKey []byte, lockTS, callerStartTS // written before the primary lock. if rollbackIfNotExist { + if resolvingPessimisticLock { + return 0, 0, kvrpcpb.Action_LockNotExistDoNothing, nil + } // Write rollback record, but not delete the lock on the primary key. There may exist lock which has // different lock.startTS with input lockTS, for example the primary key could be already // locked by the caller transaction, deleting this key will mistakenly delete the lock on diff --git a/store/mockstore/mocktikv/pd.go b/store/mockstore/mocktikv/pd.go index f4d28932b53cf..b2db0de8fb343 100644 --- a/store/mockstore/mocktikv/pd.go +++ b/store/mockstore/mocktikv/pd.go @@ -69,10 +69,18 @@ func (c *pdClient) GetTS(context.Context) (int64, int64, error) { return tsMu.physicalTS, tsMu.logicalTS, nil } +func (c *pdClient) GetLocalTS(ctx context.Context, dcLocation string) (int64, int64, error) { + return c.GetTS(ctx) +} + func (c *pdClient) GetTSAsync(ctx context.Context) pd.TSFuture { return &mockTSFuture{c, ctx, false} } +func (c *pdClient) GetLocalTSAsync(ctx context.Context, dcLocation string) pd.TSFuture { + return c.GetTSAsync(ctx) +} + type mockTSFuture struct { pdc *pdClient ctx context.Context @@ -92,6 +100,10 @@ func (c *pdClient) GetRegion(ctx context.Context, key []byte) (*pd.Region, error return &pd.Region{Meta: region, Leader: peer}, nil } +func (c *pdClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string) (*pd.Region, error) { + return &pd.Region{}, nil +} + func (c *pdClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Region, error) { region, peer := c.cluster.GetPrevRegionByKey(key) return &pd.Region{Meta: region, Leader: peer}, nil @@ -167,15 +179,19 @@ func (c *pdClient) ScatterRegion(ctx context.Context, regionID uint64) error { return nil } -func (c *pdClient) ScatterRegionWithOption(ctx context.Context, regionID uint64, opts ...pd.ScatterRegionOption) error { - return nil +func (c *pdClient) ScatterRegions(ctx context.Context, regionsID []uint64, opts ...pd.RegionsOption) (*pdpb.ScatterRegionResponse, error) { + return nil, nil +} + +func (c *pdClient) SplitRegions(ctx context.Context, splitKeys [][]byte, opts ...pd.RegionsOption) (*pdpb.SplitRegionsResponse, error) { + return nil, nil } func (c *pdClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) { return &pdpb.GetOperatorResponse{Status: pdpb.OperatorStatus_SUCCESS}, nil } -func (c *pdClient) GetMemberInfo(ctx context.Context) ([]*pdpb.Member, error) { +func (c *pdClient) GetAllMembers(ctx context.Context) ([]*pdpb.Member, error) { return nil, nil } diff --git a/store/mockstore/mocktikv/rpc.go b/store/mockstore/mocktikv/rpc.go index 8bd3aa6c3ae20..2ef026b408249 100644 --- a/store/mockstore/mocktikv/rpc.go +++ b/store/mockstore/mocktikv/rpc.go @@ -32,6 +32,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tipb/go-tipb" @@ -161,7 +162,7 @@ type rpcHandler struct { func isTiFlashStore(store *metapb.Store) bool { for _, l := range store.GetLabels() { - if l.GetKey() == "engine" && l.GetValue() == "tiflash" { + if l.GetKey() == placement.EngineLabelKey && l.GetValue() == placement.EngineLabelTiFlash { return true } } @@ -396,7 +397,7 @@ func (h *rpcHandler) handleKvCheckTxnStatus(req *kvrpcpb.CheckTxnStatusRequest) panic("KvCheckTxnStatus: key not in region") } var resp kvrpcpb.CheckTxnStatusResponse - ttl, commitTS, action, err := h.mvccStore.CheckTxnStatus(req.GetPrimaryKey(), req.GetLockTs(), req.GetCallerStartTs(), req.GetCurrentTs(), req.GetRollbackIfNotExist()) + ttl, commitTS, action, err := h.mvccStore.CheckTxnStatus(req.GetPrimaryKey(), req.GetLockTs(), req.GetCallerStartTs(), req.GetCurrentTs(), req.GetRollbackIfNotExist(), req.ResolvingPessimisticLock) if err != nil { resp.Error = convertToKeyError(err) } else { @@ -749,18 +750,20 @@ func NewRPCClient(cluster *Cluster, mvccStore MVCCStore) *RPCClient { } func (c *RPCClient) getAndCheckStoreByAddr(addr string) (*metapb.Store, error) { - store, err := c.Cluster.GetAndCheckStoreByAddr(addr) + stores, err := c.Cluster.GetAndCheckStoreByAddr(addr) if err != nil { return nil, err } - if store == nil { + if len(stores) == 0 { return nil, errors.New("connect fail") } - if store.GetState() == metapb.StoreState_Offline || - store.GetState() == metapb.StoreState_Tombstone { - return nil, errors.New("connection refused") + for _, store := range stores { + if store.GetState() != metapb.StoreState_Offline && + store.GetState() != metapb.StoreState_Tombstone { + return store, nil + } } - return store, nil + return nil, errors.New("connection refused") } func (c *RPCClient) checkArgs(ctx context.Context, addr string) (*rpcHandler, error) { diff --git a/store/mockstore/tikv.go b/store/mockstore/tikv.go index 37aad76bb81d3..9d783ca39c539 100644 --- a/store/mockstore/tikv.go +++ b/store/mockstore/tikv.go @@ -29,5 +29,9 @@ func newMockTikvStore(opt *mockOptions) (kv.Storage, error) { } opt.clusterInspector(cluster) - return tikv.NewTestTiKVStore(client, pdClient, opt.clientHijacker, opt.pdClientHijacker, opt.txnLocalLatches) + kvstore, err := tikv.NewTestTiKVStore(client, pdClient, opt.clientHijacker, opt.pdClientHijacker, opt.txnLocalLatches) + if err != nil { + return nil, err + } + return NewMockStorage(kvstore), nil } diff --git a/store/mockstore/tikv_test.go b/store/mockstore/tikv_test.go index 038c41e0da380..ef69860e52c00 100644 --- a/store/mockstore/tikv_test.go +++ b/store/mockstore/tikv_test.go @@ -17,7 +17,8 @@ import ( "testing" . "github.com/pingcap/check" - "github.com/pingcap/tidb/config" + tidbcfg "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/store/tikv/config" ) func TestT(t *testing.T) { @@ -31,7 +32,7 @@ func (s testSuite) SetUpSuite(c *C) {} var _ = Suite(testSuite{}) func (s testSuite) TestConfig(c *C) { - config.UpdateGlobal(func(conf *config.Config) { + tidbcfg.UpdateGlobal(func(conf *tidbcfg.Config) { conf.TxnLocalLatches = config.TxnLocalLatches{ Enabled: true, Capacity: 10240, @@ -48,7 +49,7 @@ func (s testSuite) TestConfig(c *C) { c.Assert(store.(LatchEnableChecker).IsLatchEnabled(), IsTrue) store.Close() - config.UpdateGlobal(func(conf *config.Config) { + tidbcfg.UpdateGlobal(func(conf *tidbcfg.Config) { conf.TxnLocalLatches = config.TxnLocalLatches{ Enabled: false, Capacity: 10240, diff --git a/store/mockstore/unistore.go b/store/mockstore/unistore.go index 0e9e2cd44ff4d..6842fb59f8d9f 100644 --- a/store/mockstore/unistore.go +++ b/store/mockstore/unistore.go @@ -14,10 +14,16 @@ package mockstore import ( + "crypto/tls" + "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/copr" + driver "github.com/pingcap/tidb/store/driver/txn" "github.com/pingcap/tidb/store/mockstore/unistore" "github.com/pingcap/tidb/store/tikv" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/util/execdetails" ) func newUnistore(opts *mockOptions) (kv.Storage, error) { @@ -26,6 +32,95 @@ func newUnistore(opts *mockOptions) (kv.Storage, error) { return nil, errors.Trace(err) } opts.clusterInspector(cluster) + pdClient = execdetails.InterceptedPDClient{ + Client: pdClient, + } + + kvstore, err := tikv.NewTestTiKVStore(client, pdClient, opts.clientHijacker, opts.pdClientHijacker, opts.txnLocalLatches) + if err != nil { + return nil, err + } + return NewMockStorage(kvstore), nil +} + +// Wraps tikv.KVStore and make it compatible with kv.Storage. +type mockStorage struct { + *tikv.KVStore + *copr.Store + memCache kv.MemManager +} + +// NewMockStorage wraps tikv.KVStore as kv.Storage. +func NewMockStorage(tikvStore *tikv.KVStore) kv.Storage { + coprConfig := config.DefaultConfig().TiKVClient.CoprCache + coprStore, err := copr.NewStore(tikvStore, &coprConfig) + if err != nil { + panic(err) + } + return &mockStorage{ + KVStore: tikvStore, + Store: coprStore, + memCache: kv.NewCacheDB(), + } +} + +func (s *mockStorage) EtcdAddrs() ([]string, error) { + return nil, nil +} + +func (s *mockStorage) TLSConfig() *tls.Config { + return nil +} + +// GetMemCache return memory mamager of the storage +func (s *mockStorage) GetMemCache() kv.MemManager { + return s.memCache +} + +func (s *mockStorage) StartGCWorker() error { + return nil +} + +func (s *mockStorage) Name() string { + return "mock-storage" +} + +func (s *mockStorage) Describe() string { + return "" +} + +// Begin a global transaction. +func (s *mockStorage) Begin() (kv.Transaction, error) { + txn, err := s.KVStore.Begin() + return newTiKVTxn(txn, err) +} + +// BeginWithOption begins a transaction with given option +func (s *mockStorage) BeginWithOption(option kv.TransactionOption) (kv.Transaction, error) { + txn, err := s.KVStore.BeginWithOption(option) + return newTiKVTxn(txn, err) +} + +// GetSnapshot gets a snapshot that is able to read any data which data is <= ver. +// if ver is MaxVersion or > current max committed version, we will use current version for this snapshot. +func (s *mockStorage) GetSnapshot(ver kv.Version) kv.Snapshot { + return s.KVStore.GetSnapshot(ver.Ver) +} + +// CurrentVersion returns current max committed version with the given txnScope (local or global). +func (s *mockStorage) CurrentVersion(txnScope string) (kv.Version, error) { + ver, err := s.KVStore.CurrentTimestamp(txnScope) + return kv.NewVersion(ver), err +} + +func newTiKVTxn(txn *tikv.KVTxn, err error) (kv.Transaction, error) { + if err != nil { + return nil, err + } + return driver.NewTiKVTxn(txn), nil +} - return tikv.NewTestTiKVStore(client, pdClient, opts.clientHijacker, opts.pdClientHijacker, opts.txnLocalLatches) +func (s *mockStorage) Close() error { + s.Store.Close() + return s.KVStore.Close() } diff --git a/store/mockstore/unistore/client/client.go b/store/mockstore/unistore/client/client.go new file mode 100644 index 0000000000000..e81a09f7af654 --- /dev/null +++ b/store/mockstore/unistore/client/client.go @@ -0,0 +1,30 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "time" + + "github.com/pingcap/tidb/store/tikv/tikvrpc" + "golang.org/x/net/context" +) + +// Client is a client that sends RPC. +// This is same with tikv.Client, define again for avoid circle import. +type Client interface { + // Close should release all data. + Close() error + // SendRequest sends Request. + SendRequest(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (*tikvrpc.Response, error) +} diff --git a/store/mockstore/unistore/cluster.go b/store/mockstore/unistore/cluster.go index 1b8e79a230806..72a45477e7410 100644 --- a/store/mockstore/unistore/cluster.go +++ b/store/mockstore/unistore/cluster.go @@ -20,7 +20,7 @@ import ( us "github.com/ngaut/unistore/tikv" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/codec" ) @@ -82,6 +82,11 @@ func (c *Cluster) SplitRaw(regionID, newRegionID uint64, rawKey []byte, peerIDs return c.MockRegionManager.SplitRaw(regionID, newRegionID, encodedKey, peerIDs, leaderPeerID) } +// SplitKeys evenly splits the start, end key into "count" regions. +func (c *Cluster) SplitKeys(start, end []byte, count int) { + c.MockRegionManager.SplitKeys(start, end, count) +} + // BootstrapWithSingleStore initializes a Cluster with 1 Region and 1 Store. func BootstrapWithSingleStore(cluster *Cluster) (storeID, peerID, regionID uint64) { storeID, regionID, peerID = cluster.AllocID(), cluster.AllocID(), cluster.AllocID() diff --git a/store/mockstore/unistore/cophandler/analyze.go b/store/mockstore/unistore/cophandler/analyze.go index 4c9aaf92a7a7b..56206fdb7d2db 100644 --- a/store/mockstore/unistore/cophandler/analyze.go +++ b/store/mockstore/unistore/cophandler/analyze.go @@ -14,13 +14,15 @@ package cophandler import ( + "bytes" "math" + "sort" "time" "github.com/golang/protobuf/proto" - "github.com/juju/errors" "github.com/ngaut/unistore/tikv/dbreader" "github.com/pingcap/badger/y" + "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" @@ -34,6 +36,7 @@ import ( "github.com/pingcap/tidb/util/collate" "github.com/pingcap/tidb/util/rowcodec" "github.com/pingcap/tipb/go-tipb" + "github.com/twmb/murmur3" "golang.org/x/net/context" ) @@ -62,8 +65,10 @@ func handleCopAnalyzeRequest(dbReader *dbreader.DBReader, req *coprocessor.Reque resp, err = handleAnalyzeIndexReq(dbReader, ranges, analyzeReq, req.StartTs) } else if analyzeReq.Tp == tipb.AnalyzeType_TypeCommonHandle { resp, err = handleAnalyzeCommonHandleReq(dbReader, ranges, analyzeReq, req.StartTs) - } else { + } else if analyzeReq.Tp == tipb.AnalyzeType_TypeColumn { resp, err = handleAnalyzeColumnsReq(dbReader, ranges, analyzeReq, req.StartTs) + } else { + resp, err = handleAnalyzeMixedReq(dbReader, ranges, analyzeReq, req.StartTs) } if err != nil { resp = &coprocessor.Response{ @@ -74,9 +79,17 @@ func handleCopAnalyzeRequest(dbReader *dbreader.DBReader, req *coprocessor.Reque } func handleAnalyzeIndexReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) { + statsVer := int32(statistics.Version1) + if analyzeReq.IdxReq.Version != nil { + statsVer = *analyzeReq.IdxReq.Version + } processor := &analyzeIndexProcessor{ colLen: int(analyzeReq.IdxReq.NumColumns), - statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob)), + statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), + statsVer: statsVer, + } + if analyzeReq.IdxReq.TopNSize != nil { + processor.topNCount = *analyzeReq.IdxReq.TopNSize } if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { processor.cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) @@ -87,10 +100,32 @@ func handleAnalyzeIndexReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, anal return nil, err } } + if statsVer == statistics.Version2 { + if processor.topNCurValuePair.Count != 0 { + processor.topNValuePairs = append(processor.topNValuePairs, processor.topNCurValuePair) + } + sort.Slice(processor.topNValuePairs, func(i, j int) bool { + if processor.topNValuePairs[i].Count > processor.topNValuePairs[j].Count { + return true + } else if processor.topNValuePairs[i].Count < processor.topNValuePairs[j].Count { + return false + } + return bytes.Compare(processor.topNValuePairs[i].Encoded, processor.topNValuePairs[j].Encoded) < 0 + }) + if len(processor.topNValuePairs) > int(processor.topNCount) { + processor.topNValuePairs = processor.topNValuePairs[:processor.topNCount] + } + } hg := statistics.HistogramToProto(processor.statsBuilder.Hist()) var cm *tipb.CMSketch if processor.cms != nil { - cm = statistics.CMSketchToProto(processor.cms) + if statsVer == statistics.Version2 { + for _, valueCnt := range processor.topNValuePairs { + h1, h2 := murmur3.Sum128(valueCnt.Encoded) + processor.cms.SubValue(h1, h2, valueCnt.Count) + } + } + cm = statistics.CMSketchToProto(processor.cms, &statistics.TopN{TopN: processor.topNValuePairs}) } data, err := proto.Marshal(&tipb.AnalyzeIndexResp{Hist: hg, Cms: cm}) if err != nil { @@ -100,9 +135,13 @@ func handleAnalyzeIndexReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, anal } func handleAnalyzeCommonHandleReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) { + statsVer := statistics.Version1 + if analyzeReq.IdxReq.Version != nil { + statsVer = int(*analyzeReq.IdxReq.Version) + } processor := &analyzeCommonHandleProcessor{ colLen: int(analyzeReq.IdxReq.NumColumns), - statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob)), + statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), statsVer), } if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { processor.cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) @@ -116,7 +155,7 @@ func handleAnalyzeCommonHandleReq(dbReader *dbreader.DBReader, rans []kv.KeyRang hg := statistics.HistogramToProto(processor.statsBuilder.Hist()) var cm *tipb.CMSketch if processor.cms != nil { - cm = statistics.CMSketchToProto(processor.cms) + cm = statistics.CMSketchToProto(processor.cms, nil) } data, err := proto.Marshal(&tipb.AnalyzeIndexResp{Hist: hg, Cms: cm}) if err != nil { @@ -132,20 +171,37 @@ type analyzeIndexProcessor struct { statsBuilder *statistics.SortedBuilder cms *statistics.CMSketch rowBuf []byte + + statsVer int32 + topNCount int32 + topNValuePairs []statistics.TopNMeta + topNCurValuePair statistics.TopNMeta } -func (p *analyzeIndexProcessor) Process(key, value []byte) error { +func (p *analyzeIndexProcessor) Process(key, _ []byte) error { values, _, err := tablecodec.CutIndexKeyNew(key, p.colLen) if err != nil { return err } p.rowBuf = p.rowBuf[:0] + for _, val := range values { p.rowBuf = append(p.rowBuf, val...) if p.cms != nil { p.cms.InsertBytes(p.rowBuf) } } + if p.statsVer == statistics.Version2 { + if bytes.Equal(p.topNCurValuePair.Encoded, p.rowBuf) { + p.topNCurValuePair.Count++ + } else { + if p.topNCurValuePair.Count > 0 { + p.topNValuePairs = append(p.topNValuePairs, p.topNCurValuePair) + } + p.topNCurValuePair.Encoded = safeCopy(p.rowBuf) + p.topNCurValuePair.Count = 1 + } + } rowData := safeCopy(p.rowBuf) err = p.statsBuilder.Iterate(types.NewBytesDatum(rowData)) if err != nil { @@ -199,7 +255,7 @@ type analyzeColumnsExec struct { fields []*ast.ResultField } -func handleAnalyzeColumnsReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) { +func buildBaseAnalyzeColumnsExec(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*analyzeColumnsExec, *statistics.SampleBuilder, int64, error) { sc := flagsToStatementContext(analyzeReq.Flags) sc.TimeZone = time.FixedZone("UTC", int(analyzeReq.TimeZoneOffset)) evalCtx := &evalContext{sc: sc} @@ -208,9 +264,9 @@ func handleAnalyzeColumnsReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, an if len(analyzeReq.ColReq.PrimaryColumnIds) > 0 { evalCtx.primaryCols = analyzeReq.ColReq.PrimaryColumnIds } - decoder, err := evalCtx.newRowDecoder() + decoder, err := newRowDecoder(evalCtx.columnInfos, evalCtx.fieldTps, evalCtx.primaryCols, evalCtx.sc.TimeZone) if err != nil { - return nil, err + return nil, nil, -1, err } e := &analyzeColumnsExec{ reader: dbReader, @@ -250,7 +306,6 @@ func handleAnalyzeColumnsReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, an colReq := analyzeReq.ColReq builder := statistics.SampleBuilder{ Sc: sc, - RecordSet: e, ColLen: numCols, MaxBucketSize: colReq.BucketSize, MaxFMSketchSize: colReq.SketchSize, @@ -258,13 +313,26 @@ func handleAnalyzeColumnsReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, an Collators: collators, ColsFieldType: fts, } + statsVer := statistics.Version1 + if analyzeReq.ColReq.Version != nil { + statsVer = int(*analyzeReq.ColReq.Version) + } if pkID != -1 { - builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob)) + builder.PkBuilder = statistics.NewSortedBuilder(sc, builder.MaxBucketSize, pkID, types.NewFieldType(mysql.TypeBlob), statsVer) } if colReq.CmsketchWidth != nil && colReq.CmsketchDepth != nil { builder.CMSketchWidth = *colReq.CmsketchWidth builder.CMSketchDepth = *colReq.CmsketchDepth } + return e, &builder, pkID, nil +} + +func handleAnalyzeColumnsReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) { + recordSet, builder, pkID, err := buildBaseAnalyzeColumnsExec(dbReader, rans, analyzeReq, startTS) + if err != nil { + return nil, err + } + builder.RecordSet = recordSet collectors, pkBuilder, err := builder.CollectColumnStats() if err != nil { return nil, errors.Trace(err) @@ -350,3 +418,142 @@ func (e *analyzeColumnsExec) NewChunk() *chunk.Chunk { func (e *analyzeColumnsExec) Close() error { return nil } + +func handleAnalyzeMixedReq(dbReader *dbreader.DBReader, rans []kv.KeyRange, analyzeReq *tipb.AnalyzeReq, startTS uint64) (*coprocessor.Response, error) { + statsVer := int32(statistics.Version1) + if analyzeReq.IdxReq.Version != nil { + statsVer = *analyzeReq.IdxReq.Version + } + colExec, builder, _, err := buildBaseAnalyzeColumnsExec(dbReader, rans, analyzeReq, startTS) + if err != nil { + return nil, err + } + e := &analyzeMixedExec{ + analyzeColumnsExec: *colExec, + colLen: int(analyzeReq.IdxReq.NumColumns), + statsBuilder: statistics.NewSortedBuilder(flagsToStatementContext(analyzeReq.Flags), analyzeReq.IdxReq.BucketSize, 0, types.NewFieldType(mysql.TypeBlob), int(statsVer)), + statsVer: statsVer, + } + builder.RecordSet = e + if analyzeReq.IdxReq.TopNSize != nil { + e.topNCount = *analyzeReq.IdxReq.TopNSize + } + if analyzeReq.IdxReq.CmsketchDepth != nil && analyzeReq.IdxReq.CmsketchWidth != nil { + e.cms = statistics.NewCMSketch(*analyzeReq.IdxReq.CmsketchDepth, *analyzeReq.IdxReq.CmsketchWidth) + } + collectors, _, err := builder.CollectColumnStats() + if err != nil { + return nil, errors.Trace(err) + } + // columns + colResp := &tipb.AnalyzeColumnsResp{} + for _, c := range collectors { + colResp.Collectors = append(colResp.Collectors, statistics.SampleCollectorToProto(c)) + } + // common handle + if statsVer == statistics.Version2 { + if e.topNCurValuePair.Count != 0 { + e.topNValuePairs = append(e.topNValuePairs, e.topNCurValuePair) + } + sort.Slice(e.topNValuePairs, func(i, j int) bool { + if e.topNValuePairs[i].Count > e.topNValuePairs[j].Count { + return true + } else if e.topNValuePairs[i].Count < e.topNValuePairs[j].Count { + return false + } + return bytes.Compare(e.topNValuePairs[i].Encoded, e.topNValuePairs[j].Encoded) < 0 + }) + if len(e.topNValuePairs) > int(e.topNCount) { + e.topNValuePairs = e.topNValuePairs[:e.topNCount] + } + } + hg := statistics.HistogramToProto(e.statsBuilder.Hist()) + var cm *tipb.CMSketch + if e.cms != nil { + if statsVer == statistics.Version2 { + for _, valueCnt := range e.topNValuePairs { + h1, h2 := murmur3.Sum128(valueCnt.Encoded) + e.cms.SubValue(h1, h2, valueCnt.Count) + } + } + cm = statistics.CMSketchToProto(e.cms, &statistics.TopN{TopN: e.topNValuePairs}) + } + commonHandleResp := &tipb.AnalyzeIndexResp{Hist: hg, Cms: cm} + resp := &tipb.AnalyzeMixedResp{ + ColumnsResp: colResp, + IndexResp: commonHandleResp, + } + data, err := proto.Marshal(resp) + if err != nil { + return nil, errors.Trace(err) + } + return &coprocessor.Response{Data: data}, nil +} + +type analyzeMixedExec struct { + analyzeColumnsExec + + colLen int + statsBuilder *statistics.SortedBuilder + cms *statistics.CMSketch + rowBuf []byte + + statsVer int32 + topNCount int32 + topNValuePairs []statistics.TopNMeta + topNCurValuePair statistics.TopNMeta +} + +func (e *analyzeMixedExec) Process(key, value []byte) error { + // common handle + values, _, err := tablecodec.CutCommonHandle(key, e.colLen) + if err != nil { + return err + } + e.rowBuf = e.rowBuf[:0] + for _, val := range values { + e.rowBuf = append(e.rowBuf, val...) + if e.cms != nil { + e.cms.InsertBytes(e.rowBuf) + } + } + if e.statsVer == statistics.Version2 { + if bytes.Equal(e.topNCurValuePair.Encoded, e.rowBuf) { + e.topNCurValuePair.Count++ + } else { + if e.topNCurValuePair.Count > 0 { + e.topNValuePairs = append(e.topNValuePairs, e.topNCurValuePair) + } + e.topNCurValuePair.Encoded = safeCopy(e.rowBuf) + e.topNCurValuePair.Count = 1 + } + } + rowData := safeCopy(e.rowBuf) + err = e.statsBuilder.Iterate(types.NewBytesDatum(rowData)) + if err != nil { + return err + } + + // columns + err = e.analyzeColumnsExec.Process(key, value) + return err +} + +func (e *analyzeMixedExec) Next(ctx context.Context, req *chunk.Chunk) error { + req.Reset() + e.req = req + err := e.reader.Scan(e.seekKey, e.endKey, math.MaxInt64, e.startTS, e) + if err != nil { + return err + } + if req.NumRows() < req.Capacity() { + if e.curRan == len(e.ranges)-1 { + e.seekKey = e.endKey + } else { + e.curRan++ + e.seekKey = e.ranges[e.curRan].StartKey + e.endKey = e.ranges[e.curRan].EndKey + } + } + return nil +} diff --git a/store/mockstore/unistore/cophandler/closure_exec.go b/store/mockstore/unistore/cophandler/closure_exec.go index 60b4f4e617f91..841a4f19e14f6 100644 --- a/store/mockstore/unistore/cophandler/closure_exec.go +++ b/store/mockstore/unistore/cophandler/closure_exec.go @@ -18,10 +18,11 @@ import ( "fmt" "math" "sort" + "time" - "github.com/juju/errors" "github.com/ngaut/unistore/tikv/dbreader" "github.com/ngaut/unistore/tikv/mvcc" + "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -37,6 +38,7 @@ import ( "github.com/pingcap/tidb/util/codec" mockpkg "github.com/pingcap/tidb/util/mock" "github.com/pingcap/tidb/util/rowcodec" + "github.com/pingcap/tidb/util/timeutil" "github.com/pingcap/tipb/go-tipb" ) @@ -61,32 +63,82 @@ func mapPkStatusToHandleStatus(pkStatus int) tablecodec.HandleStatus { return tablecodec.HandleDefault } -// buildClosureExecutor build a closureExecutor for the DAGRequest. -// Currently the composition of executors are: -// tableScan|indexScan [selection] [topN | limit | agg] -func buildClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closureExecutor, error) { - ce, err := newClosureExecutor(dagCtx, dagReq) - if err != nil { - return nil, errors.Trace(err) +func getExecutorListFromRootExec(rootExec *tipb.Executor) ([]*tipb.Executor, error) { + executors := make([]*tipb.Executor, 0, 3) + currentExec := rootExec + for !isScanNode(currentExec) { + executors = append(executors, currentExec) + switch currentExec.Tp { + case tipb.ExecType_TypeTopN: + currentExec = currentExec.TopN.Child + case tipb.ExecType_TypeStreamAgg, tipb.ExecType_TypeAggregation: + currentExec = currentExec.Aggregation.Child + case tipb.ExecType_TypeLimit: + currentExec = currentExec.Limit.Child + case tipb.ExecType_TypeExchangeSender: + currentExec = currentExec.ExchangeSender.Child + default: + return nil, errors.New("unsupported executor type " + currentExec.Tp.String()) + } } - executors := dagReq.Executors + executors = append(executors, currentExec) + for i, j := 0, len(executors)-1; i < j; i, j = i+1, j-1 { + executors[i], executors[j] = executors[j], executors[i] + } + return executors, nil +} + +func getExecutorList(dagReq *tipb.DAGRequest) ([]*tipb.Executor, error) { + if len(dagReq.Executors) > 0 { + return dagReq.Executors, nil + } + // convert TiFlash executors tree to executor list + return getExecutorListFromRootExec(dagReq.RootExecutor) +} + +func buildClosureExecutorFromExecutorList(dagCtx *dagContext, executors []*tipb.Executor, ce *closureExecutor) error { scanExec := executors[0] if scanExec.Tp == tipb.ExecType_TypeTableScan { ce.processor = &tableScanProcessor{closureExecutor: ce} - } else { + } else if scanExec.Tp == tipb.ExecType_TypeIndexScan { ce.processor = &indexScanProcessor{closureExecutor: ce} + } else if scanExec.Tp == tipb.ExecType_TypeJoin || scanExec.Tp == tipb.ExecType_TypeExchangeReceiver { + ce.processor = &mockReaderScanProcessor{closureExecutor: ce} + } + outputFieldTypes := make([]*types.FieldType, 0, 1) + lastExecutor := executors[len(executors)-1] + originalOutputFieldTypes := dagCtx.fieldTps + if lastExecutor.Tp == tipb.ExecType_TypeAggregation || lastExecutor.Tp == tipb.ExecType_TypeStreamAgg { + originalOutputFieldTypes = nil + for _, agg := range lastExecutor.Aggregation.AggFunc { + originalOutputFieldTypes = append(originalOutputFieldTypes, expression.PbTypeToFieldType(agg.FieldType)) + } + for _, gby := range lastExecutor.Aggregation.GroupBy { + originalOutputFieldTypes = append(originalOutputFieldTypes, expression.PbTypeToFieldType(gby.FieldType)) + } + } + if ce.outputOff != nil { + for _, idx := range ce.outputOff { + outputFieldTypes = append(outputFieldTypes, originalOutputFieldTypes[idx]) + } + } else { + for _, tp := range originalOutputFieldTypes { + outputFieldTypes = append(outputFieldTypes, tp) + } } if len(executors) == 1 { - return ce, nil + ce.resultFieldType = outputFieldTypes + return nil } + var err error = nil if secondExec := executors[1]; secondExec.Tp == tipb.ExecType_TypeSelection { ce.selectionCtx.conditions, err = convertToExprs(ce.sc, ce.fieldTps, secondExec.Selection.Conditions) if err != nil { - return nil, errors.Trace(err) + return errors.Trace(err) } + ce.selectionCtx.execDetail = new(execDetail) ce.processor = &selectionProcessor{closureExecutor: ce} } - lastExecutor := executors[len(executors)-1] switch lastExecutor.Tp { case tipb.ExecType_TypeLimit: ce.limit = int(lastExecutor.Limit.Limit) @@ -99,8 +151,33 @@ func buildClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closure case tipb.ExecType_TypeSelection: ce.processor = &selectionProcessor{closureExecutor: ce} default: - panic("unknown executor type " + lastExecutor.Tp.String()) + panic("unsupported executor type " + lastExecutor.Tp.String()) + } + if err != nil { + return err + } + ce.resultFieldType = outputFieldTypes + return nil +} + +// buildClosureExecutor build a closureExecutor for the DAGRequest. +// Currently the composition of executors are: +// tableScan|indexScan [selection] [topN | limit | agg] +func buildClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closureExecutor, error) { + scanExec, err := getScanExec(dagReq) + if err != nil { + return nil, err } + ce, err := newClosureExecutor(dagCtx, dagReq.OutputOffsets, scanExec, dagReq.GetCollectRangeCounts()) + if err != nil { + return nil, errors.Trace(err) + } + executors, err1 := getExecutorList(dagReq) + if err1 != nil { + return nil, err1 + } + + err = buildClosureExecutorFromExecutorList(dagCtx, executors, ce) if err != nil { return nil, err } @@ -119,45 +196,92 @@ func convertToExprs(sc *stmtctx.StatementContext, fieldTps []*types.FieldType, p return exprs, nil } -func newClosureExecutor(dagCtx *dagContext, dagReq *tipb.DAGRequest) (*closureExecutor, error) { +func isScanNode(executor *tipb.Executor) bool { + switch executor.Tp { + case tipb.ExecType_TypeTableScan, tipb.ExecType_TypeExchangeReceiver, + tipb.ExecType_TypeIndexScan, tipb.ExecType_TypeJoin: + return true + default: + return false + } +} + +func getScanExecFromRootExec(rootExec *tipb.Executor) (*tipb.Executor, error) { + currentExec := rootExec + for !isScanNode(currentExec) { + switch currentExec.Tp { + case tipb.ExecType_TypeAggregation, tipb.ExecType_TypeStreamAgg: + currentExec = currentExec.Aggregation.Child + case tipb.ExecType_TypeLimit: + currentExec = currentExec.Limit.Child + case tipb.ExecType_TypeSelection: + currentExec = currentExec.Selection.Child + case tipb.ExecType_TypeTopN: + currentExec = currentExec.TopN.Child + case tipb.ExecType_TypeExchangeSender: + currentExec = currentExec.ExchangeSender.Child + default: + return nil, errors.New("Unsupported DAG request") + } + } + return currentExec, nil +} + +func getScanExec(dagReq *tipb.DAGRequest) (*tipb.Executor, error) { + if len(dagReq.Executors) > 0 { + return dagReq.Executors[0], nil + } + return getScanExecFromRootExec(dagReq.RootExecutor) +} + +func newClosureExecutor(dagCtx *dagContext, outputOffsets []uint32, scanExec *tipb.Executor, collectRangeCounts bool) (*closureExecutor, error) { e := &closureExecutor{ dagContext: dagCtx, - outputOff: dagReq.OutputOffsets, + outputOff: outputOffsets, startTS: dagCtx.startTS, limit: math.MaxInt64, } seCtx := mockpkg.NewContext() seCtx.GetSessionVars().StmtCtx = e.sc e.seCtx = seCtx - executors := dagReq.Executors - scanExec := executors[0] switch scanExec.Tp { case tipb.ExecType_TypeTableScan: - tblScan := executors[0].TblScan + dagCtx.setColumnInfo(scanExec.TblScan.Columns) + dagCtx.primaryCols = scanExec.TblScan.PrimaryColumnIds + tblScan := scanExec.TblScan e.unique = true e.scanCtx.desc = tblScan.Desc + e.scanType = TableScan case tipb.ExecType_TypeIndexScan: - idxScan := executors[0].IdxScan + dagCtx.setColumnInfo(scanExec.IdxScan.Columns) + idxScan := scanExec.IdxScan e.unique = idxScan.GetUnique() e.scanCtx.desc = idxScan.Desc e.initIdxScanCtx(idxScan) + if collectRangeCounts { + e.idxScanCtx.collectNDV = true + e.idxScanCtx.prevVals = make([][]byte, e.idxScanCtx.columnLen) + } + e.scanType = IndexScan default: - panic(fmt.Sprintf("unknown first executor type %s", executors[0].Tp)) + panic(fmt.Sprintf("unknown first executor type %s", scanExec.Tp)) } ranges, err := extractKVRanges(dagCtx.dbReader.StartKey, dagCtx.dbReader.EndKey, dagCtx.keyRanges, e.scanCtx.desc) if err != nil { return nil, errors.Trace(err) } - if dagReq.GetCollectRangeCounts() { + if collectRangeCounts { e.counts = make([]int64, len(ranges)) + e.ndvs = make([]int64, len(ranges)) } e.kvRanges = ranges e.scanCtx.chk = chunk.NewChunkWithCapacity(e.fieldTps, 32) - if e.idxScanCtx == nil { - e.scanCtx.decoder, err = e.evalContext.newRowDecoder() + if e.scanType == TableScan { + e.scanCtx.decoder, err = newRowDecoder(e.evalContext.columnInfos, e.evalContext.fieldTps, e.evalContext.primaryCols, e.evalContext.sc.TimeZone) if err != nil { return nil, errors.Trace(err) } + e.scanCtx.execDetail = new(execDetail) } return e, nil } @@ -166,6 +290,7 @@ func (e *closureExecutor) initIdxScanCtx(idxScan *tipb.IndexScan) { e.idxScanCtx = new(idxScanCtx) e.idxScanCtx.columnLen = len(e.columnInfos) e.idxScanCtx.pkStatus = pkColNotExists + e.idxScanCtx.execDetail = new(execDetail) e.idxScanCtx.primaryColumnIds = idxScan.PrimaryColumnIds lastColumn := e.columnInfos[len(e.columnInfos)-1] @@ -248,6 +373,7 @@ func tryBuildCountProcessor(e *closureExecutor, executors []*tipb.Executor) (boo default: e.processor = &countStarProcessor{skipVal: skipVal(true), closureExecutor: e} } + e.aggCtx.execDetail = new(execDetail) return true, nil } @@ -260,7 +386,8 @@ func buildTopNProcessor(e *closureExecutor, topN *tipb.TopN) error { ctx := &topNCtx{ heap: heap, orderByExprs: conds, - sortRow: e.newTopNSortRow(), + sortRow: newTopNSortRow(len(conds)), + execDetail: new(execDetail), } e.topNCtx = ctx @@ -281,6 +408,7 @@ func buildHashAggProcessor(e *closureExecutor, ctx *dagContext, agg *tipb.Aggreg groupKeys: nil, aggCtxsMap: map[string][]*aggregation.AggEvaluateContext{}, } + e.aggCtx.execDetail = new(execDetail) return nil } @@ -292,22 +420,63 @@ func buildStreamAggProcessor(e *closureExecutor, ctx *dagContext, executors []*t return buildHashAggProcessor(e, ctx, executors[len(executors)-1].Aggregation) } +type execDetail struct { + timeProcessed time.Duration + numProducedRows int + numIterations int +} + +func (e *execDetail) update(begin time.Time, gotRow bool) { + e.timeProcessed += time.Since(begin) + e.numIterations++ + if gotRow { + e.numProducedRows++ + } +} + +func (e *execDetail) updateOnlyRows(gotRow int) { + e.numProducedRows += gotRow +} + +func (e *execDetail) buildSummary() *tipb.ExecutorExecutionSummary { + costNs := uint64(e.timeProcessed / time.Nanosecond) + rows := uint64(e.numProducedRows) + numIter := uint64(e.numIterations) + return &tipb.ExecutorExecutionSummary{ + TimeProcessedNs: &costNs, + NumProducedRows: &rows, + NumIterations: &numIter, + } +} + +type scanType uint8 + +const ( + // TableScan means reading from a table by table scan + TableScan scanType = iota + // IndexScan means reading from a table by index scan + IndexScan +) + // closureExecutor is an execution engine that flatten the DAGRequest.Executors to a single closure `processor` that // process key/value pairs. We can define many closures for different kinds of requests, try to use the specially // optimized one for some frequently used query. type closureExecutor struct { *dagContext - outputOff []uint32 - seCtx sessionctx.Context - kvRanges []kv.KeyRange - startTS uint64 - ignoreLock bool - lockChecked bool - scanCtx scanCtx - idxScanCtx *idxScanCtx - selectionCtx selectionCtx - aggCtx aggCtx - topNCtx *topNCtx + outputOff []uint32 + resultFieldType []*types.FieldType + seCtx sessionctx.Context + kvRanges []kv.KeyRange + startTS uint64 + ignoreLock bool + lockChecked bool + scanType scanType + scanCtx scanCtx + idxScanCtx *idxScanCtx + selectionCtx selectionCtx + aggCtx aggCtx + topNCtx *topNCtx + mockReader *mockReader rowCount int unique bool @@ -318,6 +487,23 @@ type closureExecutor struct { processor closureProcessor counts []int64 + ndvs []int64 + curNdv int64 +} + +func pbChunkToChunk(pbChk tipb.Chunk, chk *chunk.Chunk, fieldTypes []*types.FieldType) error { + rowsData := pbChk.RowsData + var err error + decoder := codec.NewDecoder(chk, timeutil.SystemLocation()) + for len(rowsData) > 0 { + for i := 0; i < len(fieldTypes); i++ { + rowsData, err = decoder.DecodeOne(rowsData, i, fieldTypes[i]) + if err != nil { + return err + } + } + } + return nil } type closureProcessor interface { @@ -326,15 +512,13 @@ type closureProcessor interface { } type scanCtx struct { - count int - limit int - chk *chunk.Chunk - desc bool - decoder *rowcodec.ChunkDecoder - primaryColumnIds []int64 + chk *chunk.Chunk + desc bool + decoder *rowcodec.ChunkDecoder newCollationRd *rowcodec.BytesDecoder newCollationIds map[int64]int + execDetail *execDetail } type idxScanCtx struct { @@ -342,20 +526,31 @@ type idxScanCtx struct { columnLen int colInfos []rowcodec.ColInfo primaryColumnIds []int64 + execDetail *execDetail + collectNDV bool + prevVals [][]byte } type aggCtx struct { - col *tipb.ColumnInfo + col *tipb.ColumnInfo + execDetail *execDetail } type selectionCtx struct { conditions []expression.Expression + execDetail *execDetail } type topNCtx struct { heap *topNHeap orderByExprs []expression.Expression sortRow *sortRow + execDetail *execDetail +} + +type mockReader struct { + chk *chunk.Chunk + currentIndex int } func (e *closureExecutor) execute() ([]tipb.Chunk, error) { @@ -365,6 +560,7 @@ func (e *closureExecutor) execute() ([]tipb.Chunk, error) { } dbReader := e.dbReader for i, ran := range e.kvRanges { + e.curNdv = 0 if e.isPointGetRange(ran) { val, err := dbReader.Get(ran.StartKey, e.startTS) if err != nil { @@ -375,6 +571,7 @@ func (e *closureExecutor) execute() ([]tipb.Chunk, error) { } if e.counts != nil { e.counts[i]++ + e.ndvs[i] = 1 } err = e.processor.Process(ran.StartKey, val) if err != nil { @@ -390,6 +587,7 @@ func (e *closureExecutor) execute() ([]tipb.Chunk, error) { delta := int64(e.rowCount - oldCnt) if e.counts != nil { e.counts[i] += delta + e.ndvs[i] = e.curNdv } if err != nil { return nil, errors.Trace(err) @@ -445,11 +643,20 @@ type countStarProcessor struct { // countStarProcess is used for `count(*)`. func (e *countStarProcessor) Process(key, value []byte) error { + defer func(begin time.Time) { + if e.idxScanCtx != nil { + e.idxScanCtx.execDetail.update(begin, true) + } else { + e.scanCtx.execDetail.update(begin, true) + } + e.aggCtx.execDetail.update(begin, false) + }(time.Now()) e.rowCount++ return nil } func (e *countStarProcessor) Finish() error { + e.aggCtx.execDetail.updateOnlyRows(1) return e.countFinish() } @@ -470,13 +677,35 @@ type countColumnProcessor struct { } func (e *countColumnProcessor) Process(key, value []byte) error { - if e.idxScanCtx != nil { + gotRow := false + defer func(begin time.Time) { + if e.idxScanCtx != nil { + e.idxScanCtx.execDetail.update(begin, gotRow) + } else { + e.scanCtx.execDetail.update(begin, gotRow) + } + e.aggCtx.execDetail.update(begin, false) + }(time.Now()) + if e.mockReader != nil { + row := e.mockReader.chk.GetRow(e.mockReader.currentIndex) + isNull := false + if e.aggCtx.col.ColumnId < int64(e.mockReader.chk.NumCols()) { + isNull = row.IsNull(int(e.aggCtx.col.ColumnId)) + } else { + isNull = e.aggCtx.col.DefaultVal == nil + } + if !isNull { + e.rowCount++ + gotRow = true + } + } else if e.idxScanCtx != nil { values, _, err := tablecodec.CutIndexKeyNew(key, e.idxScanCtx.columnLen) if err != nil { return errors.Trace(err) } if values[0][0] != codec.NilFlag { e.rowCount++ + gotRow = true } } else { // Since the handle value doesn't affect the count result, we don't need to decode the handle. @@ -486,12 +715,14 @@ func (e *countColumnProcessor) Process(key, value []byte) error { } if !isNull { e.rowCount++ + gotRow = true } } return nil } func (e *countColumnProcessor) Finish() error { + e.aggCtx.execDetail.updateOnlyRows(1) return e.countFinish() } @@ -511,6 +742,7 @@ func (e *tableScanProcessor) Process(key, value []byte) error { return dbreader.ScanBreak } e.rowCount++ + e.curNdv++ err := e.tableScanProcessCore(key, value) if e.scanCtx.chk.NumRows() == chunkMaxRows { err = e.chunkToOldChunk(e.scanCtx.chk) @@ -522,7 +754,31 @@ func (e *tableScanProcessor) Finish() error { return e.scanFinish() } +type mockReaderScanProcessor struct { + skipVal + *closureExecutor +} + +func (e *mockReaderScanProcessor) Process(key, value []byte) error { + if e.rowCount == e.limit { + return dbreader.ScanBreak + } + e.rowCount++ + err := e.mockReadScanProcessCore(key, value) + if e.scanCtx.chk.NumRows() == chunkMaxRows { + err = e.chunkToOldChunk(e.scanCtx.chk) + } + return err +} + +func (e *mockReaderScanProcessor) Finish() error { + return e.scanFinish() +} + func (e *closureExecutor) processCore(key, value []byte) error { + if e.mockReader != nil { + return e.mockReadScanProcessCore(key, value) + } if e.idxScanCtx != nil { return e.indexScanProcessCore(key, value) } @@ -533,7 +789,12 @@ func (e *closureExecutor) hasSelection() bool { return len(e.selectionCtx.conditions) > 0 } -func (e *closureExecutor) processSelection() (gotRow bool, err error) { +func (e *closureExecutor) processSelection(needCollectDetail bool) (gotRow bool, err error) { + if needCollectDetail { + defer func(begin time.Time) { + e.selectionCtx.execDetail.update(begin, gotRow) + }(time.Now()) + } chk := e.scanCtx.chk row := chk.GetRow(chk.NumRows() - 1) gotRow = true @@ -585,7 +846,17 @@ func (e *closureExecutor) copyError(err error) error { return ret } +func (e *closureExecutor) mockReadScanProcessCore(key, value []byte) error { + e.scanCtx.chk.AppendRow(e.mockReader.chk.GetRow(e.mockReader.currentIndex)) + e.mockReader.currentIndex++ + return nil +} + func (e *closureExecutor) tableScanProcessCore(key, value []byte) error { + incRow := false + defer func(begin time.Time) { + e.scanCtx.execDetail.update(begin, incRow) + }(time.Now()) handle, err := tablecodec.DecodeRowKey(key) if err != nil { return errors.Trace(err) @@ -594,6 +865,7 @@ func (e *closureExecutor) tableScanProcessCore(key, value []byte) error { if err != nil { return errors.Trace(err) } + incRow = true return nil } @@ -622,7 +894,20 @@ func (e *indexScanProcessor) Finish() error { return e.scanFinish() } +func (isc *idxScanCtx) checkVal(curVals [][]byte) bool { + for i := 0; i < isc.columnLen; i++ { + if !bytes.Equal(isc.prevVals[i], curVals[i]) { + return false + } + } + return true +} + func (e *closureExecutor) indexScanProcessCore(key, value []byte) error { + gotRow := false + defer func(begin time.Time) { + e.idxScanCtx.execDetail.update(begin, gotRow) + }(time.Now()) handleStatus := mapPkStatusToHandleStatus(e.idxScanCtx.pkStatus) restoredCols := make([]rowcodec.ColInfo, 0, len(e.idxScanCtx.colInfos)) for _, c := range e.idxScanCtx.colInfos { @@ -634,6 +919,14 @@ func (e *closureExecutor) indexScanProcessCore(key, value []byte) error { if err != nil { return err } + if e.idxScanCtx.collectNDV { + if len(e.idxScanCtx.prevVals[0]) == 0 || !e.idxScanCtx.checkVal(values) { + e.curNdv++ + for i := 0; i < e.idxScanCtx.columnLen; i++ { + e.idxScanCtx.prevVals[i] = append(e.idxScanCtx.prevVals[i][:0], values[i]...) + } + } + } chk := e.scanCtx.chk decoder := codec.NewDecoder(chk, e.sc.TimeZone) for i, colVal := range values { @@ -644,6 +937,7 @@ func (e *closureExecutor) indexScanProcessCore(key, value []byte) error { } } } + gotRow = true return nil } @@ -651,9 +945,16 @@ func (e *closureExecutor) chunkToOldChunk(chk *chunk.Chunk) error { var oldRow []types.Datum for i := 0; i < chk.NumRows(); i++ { oldRow = oldRow[:0] - for _, outputOff := range e.outputOff { - d := chk.GetRow(i).GetDatum(int(outputOff), e.fieldTps[outputOff]) - oldRow = append(oldRow, d) + if e.outputOff != nil { + for _, outputOff := range e.outputOff { + d := chk.GetRow(i).GetDatum(int(outputOff), e.fieldTps[outputOff]) + oldRow = append(oldRow, d) + } + } else { + for colIdx := 0; colIdx < chk.NumCols(); colIdx++ { + d := chk.GetRow(i).GetDatum(colIdx, e.fieldTps[colIdx]) + oldRow = append(oldRow, d) + } } var err error e.oldRowBuf, err = codec.EncodeValue(e.sc, e.oldRowBuf[:0], oldRow...) @@ -672,6 +973,10 @@ type selectionProcessor struct { } func (e *selectionProcessor) Process(key, value []byte) error { + var gotRow bool + defer func(begin time.Time) { + e.selectionCtx.execDetail.update(begin, gotRow) + }(time.Now()) if e.rowCount == e.limit { return dbreader.ScanBreak } @@ -679,7 +984,7 @@ func (e *selectionProcessor) Process(key, value []byte) error { if err != nil { return errors.Trace(err) } - gotRow, err := e.processSelection() + gotRow, err = e.processSelection(false) if err != nil { return err } @@ -702,11 +1007,15 @@ type topNProcessor struct { } func (e *topNProcessor) Process(key, value []byte) (err error) { + gotRow := false + defer func(begin time.Time) { + e.topNCtx.execDetail.update(begin, gotRow) + }(time.Now()) if err = e.processCore(key, value); err != nil { return err } if e.hasSelection() { - gotRow, err1 := e.processSelection() + gotRow, err1 := e.processSelection(true) if err1 != nil || !gotRow { return err1 } @@ -726,14 +1035,17 @@ func (e *topNProcessor) Process(key, value []byte) (err error) { if ctx.heap.tryToAddRow(ctx.sortRow) { ctx.sortRow.data[0] = safeCopy(key) ctx.sortRow.data[1] = safeCopy(value) - ctx.sortRow = e.newTopNSortRow() + ctx.sortRow = newTopNSortRow(len(ctx.orderByExprs)) + } + if ctx.heap.err == nil { + gotRow = true } return errors.Trace(ctx.heap.err) } -func (e *closureExecutor) newTopNSortRow() *sortRow { +func newTopNSortRow(numOrderByExprs int) *sortRow { return &sortRow{ - key: make([]types.Datum, len(e.evalContext.columnInfos)), + key: make([]types.Datum, numOrderByExprs), data: make([][]byte, 2), } } @@ -768,12 +1080,16 @@ type hashAggProcessor struct { } func (e *hashAggProcessor) Process(key, value []byte) (err error) { + incRow := false + defer func(begin time.Time) { + e.aggCtx.execDetail.update(begin, incRow) + }(time.Now()) err = e.processCore(key, value) if err != nil { return err } if e.hasSelection() { - gotRow, err1 := e.processSelection() + gotRow, err1 := e.processSelection(true) if err1 != nil || !gotRow { return err1 } @@ -783,6 +1099,7 @@ func (e *hashAggProcessor) Process(key, value []byte) (err error) { if _, ok := e.groups[string(gk)]; !ok { e.groups[string(gk)] = struct{}{} e.groupKeys = append(e.groupKeys, gk) + incRow = true } // Update aggregate expressions. aggCtxs := e.getContexts(gk) @@ -843,6 +1160,15 @@ func (e *hashAggProcessor) Finish() error { e.oldRowBuf = append(e.oldRowBuf, gk...) e.oldChunks = appendRow(e.oldChunks, e.oldRowBuf, i) } + if e.aggCtx.execDetail.numIterations == 0 && e.aggCtx.execDetail.numProducedRows == 0 && + len(e.aggCtxsMap) == 0 && len(e.outputOff) == 1 { + for _, exec := range e.dagReq.GetExecutors() { + if exec.Tp == tipb.ExecType_TypeStreamAgg { + e.aggCtx.execDetail.updateOnlyRows(1) + e.oldChunks = appendRow(e.oldChunks, make([]byte, 1), 0) + } + } + } return nil } diff --git a/store/mockstore/unistore/cophandler/cop_handler.go b/store/mockstore/unistore/cophandler/cop_handler.go index 787f3c1264ef9..c119a49db16e2 100644 --- a/store/mockstore/unistore/cophandler/cop_handler.go +++ b/store/mockstore/unistore/cophandler/cop_handler.go @@ -15,6 +15,7 @@ package cophandler import ( "bytes" + "context" "fmt" "time" @@ -22,6 +23,7 @@ import ( "github.com/ngaut/unistore/lockstore" "github.com/ngaut/unistore/tikv/dbreader" "github.com/pingcap/errors" + "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/model" @@ -31,7 +33,7 @@ import ( "github.com/pingcap/tidb/expression/aggregation" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx/stmtctx" - "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/store/mockstore/unistore/client" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/codec" @@ -40,10 +42,28 @@ import ( "github.com/pingcap/tipb/go-tipb" ) +// MPPCtx is the mpp execution context +type MPPCtx struct { + RPCClient client.Client + StoreAddr string + TaskHandler *MPPTaskHandler + Ctx context.Context +} + // HandleCopRequest handles coprocessor request. func HandleCopRequest(dbReader *dbreader.DBReader, lockStore *lockstore.MemStore, req *coprocessor.Request) *coprocessor.Response { + return HandleCopRequestWithMPPCtx(dbReader, lockStore, req, nil) +} + +// HandleCopRequestWithMPPCtx handles coprocessor request, actually, this is the updated version for +// HandleCopRequest(after mpp test is supported), however, go does not support function overloading, +// I have to rename it to HandleCopRequestWithMPPCtx. +func HandleCopRequestWithMPPCtx(dbReader *dbreader.DBReader, lockStore *lockstore.MemStore, req *coprocessor.Request, mppCtx *MPPCtx) *coprocessor.Response { switch req.Tp { case kv.ReqTypeDAG: + if mppCtx != nil && mppCtx.TaskHandler != nil { + return HandleMPPDAGReq(dbReader, req, mppCtx) + } return handleCopDAGRequest(dbReader, lockStore, req) case kv.ReqTypeAnalyze: return handleCopAnalyzeRequest(dbReader, req) @@ -64,9 +84,28 @@ type dagContext struct { } // handleCopDAGRequest handles coprocessor DAG request. -func handleCopDAGRequest(dbReader *dbreader.DBReader, lockStore *lockstore.MemStore, req *coprocessor.Request) *coprocessor.Response { +func handleCopDAGRequest(dbReader *dbreader.DBReader, lockStore *lockstore.MemStore, req *coprocessor.Request) (resp *coprocessor.Response) { startTime := time.Now() - resp := &coprocessor.Response{} + resp = &coprocessor.Response{} + failpoint.Inject("mockCopCacheInUnistore", func(cacheVersion failpoint.Value) { + if req.IsCacheEnabled { + if uint64(cacheVersion.(int)) == req.CacheIfMatchVersion { + failpoint.Return(&coprocessor.Response{IsCacheHit: true, CacheLastVersion: uint64(cacheVersion.(int))}) + } else { + defer func() { + resp.CanBeCached = true + resp.CacheLastVersion = uint64(cacheVersion.(int)) + if resp.ExecDetails == nil { + resp.ExecDetails = &kvrpcpb.ExecDetails{TimeDetail: &kvrpcpb.TimeDetail{ProcessWallTimeMs: 500}} + } else if resp.ExecDetails.TimeDetail == nil { + resp.ExecDetails.TimeDetail = &kvrpcpb.TimeDetail{ProcessWallTimeMs: 500} + } else { + resp.ExecDetails.TimeDetail.ProcessWallTimeMs = 500 + } + }() + } + } + }) dagCtx, dagReq, err := buildDAG(dbReader, lockStore, req) if err != nil { resp.OtherError = err.Error() @@ -74,10 +113,10 @@ func handleCopDAGRequest(dbReader *dbreader.DBReader, lockStore *lockstore.MemSt } closureExec, err := buildClosureExecutor(dagCtx, dagReq) if err != nil { - return buildResp(nil, nil, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) + return buildResp(nil, nil, nil, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) } chunks, err := closureExec.execute() - return buildResp(chunks, closureExec.counts, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) + return buildResp(chunks, closureExec, closureExec.ndvs, dagReq, err, dagCtx.sc.GetWarnings(), time.Since(startTime)) } func buildDAG(reader *dbreader.DBReader, lockStore *lockstore.MemStore, req *coprocessor.Request) (*dagContext, *tipb.DAGRequest, error) { @@ -104,13 +143,6 @@ func buildDAG(reader *dbreader.DBReader, lockStore *lockstore.MemStore, req *cop startTS: req.StartTs, resolvedLocks: req.Context.ResolvedLocks, } - scanExec := dagReq.Executors[0] - if scanExec.Tp == tipb.ExecType_TypeTableScan { - ctx.setColumnInfo(scanExec.TblScan.Columns) - ctx.primaryCols = scanExec.TblScan.PrimaryColumnIds - } else { - ctx.setColumnInfo(scanExec.IdxScan.Columns) - } return ctx, dagReq, err } @@ -154,7 +186,6 @@ func getTopNInfo(ctx *evalContext, topN *tipb.TopN) (heap *topNHeap, conds []exp } type evalContext struct { - colIDs map[int64]int columnInfos []*tipb.ColumnInfo fieldTps []*types.FieldType primaryCols []int64 @@ -165,23 +196,45 @@ func (e *evalContext) setColumnInfo(cols []*tipb.ColumnInfo) { e.columnInfos = make([]*tipb.ColumnInfo, len(cols)) copy(e.columnInfos, cols) - e.colIDs = make(map[int64]int, len(e.columnInfos)) e.fieldTps = make([]*types.FieldType, 0, len(e.columnInfos)) - for i, col := range e.columnInfos { + for _, col := range e.columnInfos { ft := fieldTypeFromPBColumn(col) e.fieldTps = append(e.fieldTps, ft) - e.colIDs[col.GetColumnId()] = i } } -func (e *evalContext) newRowDecoder() (*rowcodec.ChunkDecoder, error) { +func (e *evalContext) fillColumnInfo(fieldTypes []*tipb.FieldType) { + e.columnInfos = make([]*tipb.ColumnInfo, 0, len(fieldTypes)) + e.fieldTps = make([]*types.FieldType, 0, len(fieldTypes)) + for i, pbType := range fieldTypes { + e.columnInfos = append(e.columnInfos, &tipb.ColumnInfo{ColumnId: int64(i), + Tp: pbType.Tp, Collation: pbType.Collate, ColumnLen: pbType.Flen, + Decimal: pbType.Decimal, Flag: int32(pbType.Flag)}) + // todo fill collate and charset field + e.fieldTps = append(e.fieldTps, &types.FieldType{Tp: byte(pbType.Tp), + Flag: uint(pbType.Flag), Flen: int(pbType.Flen), Decimal: int(pbType.Decimal)}) + } +} + +func (e *evalContext) fillColumnInfoFromTPs(fieldTypes []*types.FieldType) { + e.columnInfos = make([]*tipb.ColumnInfo, 0, len(fieldTypes)) + e.fieldTps = append(e.fieldTps, fieldTypes...) + for i, fieldType := range fieldTypes { + pbType := expression.ToPBFieldType(fieldType) + e.columnInfos = append(e.columnInfos, &tipb.ColumnInfo{ColumnId: int64(i), + Tp: pbType.Tp, Collation: pbType.Collate, ColumnLen: pbType.Flen, + Decimal: pbType.Decimal, Flag: int32(pbType.Flag)}) + } +} + +func newRowDecoder(columnInfos []*tipb.ColumnInfo, fieldTps []*types.FieldType, primaryCols []int64, timeZone *time.Location) (*rowcodec.ChunkDecoder, error) { var ( pkCols []int64 - cols = make([]rowcodec.ColInfo, 0, len(e.columnInfos)) + cols = make([]rowcodec.ColInfo, 0, len(columnInfos)) ) - for i := range e.columnInfos { - info := e.columnInfos[i] - ft := e.fieldTps[i] + for i := range columnInfos { + info := columnInfos[i] + ft := fieldTps[i] col := rowcodec.ColInfo{ ID: info.ColumnId, Ft: ft, @@ -193,38 +246,26 @@ func (e *evalContext) newRowDecoder() (*rowcodec.ChunkDecoder, error) { } } if len(pkCols) == 0 { - if e.primaryCols != nil { - pkCols = e.primaryCols + if primaryCols != nil { + pkCols = primaryCols } else { pkCols = []int64{0} } } def := func(i int, chk *chunk.Chunk) error { - info := e.columnInfos[i] + info := columnInfos[i] if info.PkHandle || len(info.DefaultVal) == 0 { chk.AppendNull(i) return nil } - decoder := codec.NewDecoder(chk, e.sc.TimeZone) - _, err := decoder.DecodeOne(info.DefaultVal, i, e.fieldTps[i]) + decoder := codec.NewDecoder(chk, timeZone) + _, err := decoder.DecodeOne(info.DefaultVal, i, fieldTps[i]) if err != nil { return err } return nil } - return rowcodec.NewChunkDecoder(cols, pkCols, def, e.sc.TimeZone), nil -} - -// decodeRelatedColumnVals decodes data to Datum slice according to the row information. -func (e *evalContext) decodeRelatedColumnVals(relatedColOffsets []int, value [][]byte, row []types.Datum) error { - var err error - for _, offset := range relatedColOffsets { - row[offset], err = tablecodec.DecodeColumnValue(value[offset], e.fieldTps[offset], e.sc.TimeZone) - if err != nil { - return errors.Trace(err) - } - } - return nil + return rowcodec.NewChunkDecoder(cols, pkCols, def, timeZone), nil } // flagsToStatementContext creates a StatementContext from a `tipb.SelectRequest.Flags`. @@ -268,18 +309,49 @@ func (e *ErrLocked) Error() string { return fmt.Sprintf("key is locked, key: %q, Type: %v, primary: %q, startTS: %v", e.Key, e.LockType, e.Primary, e.StartTS) } -func buildResp(chunks []tipb.Chunk, counts []int64, dagReq *tipb.DAGRequest, err error, warnings []stmtctx.SQLWarn, dur time.Duration) *coprocessor.Response { +func buildResp(chunks []tipb.Chunk, closureExecutor *closureExecutor, ndvs []int64, dagReq *tipb.DAGRequest, err error, warnings []stmtctx.SQLWarn, dur time.Duration) *coprocessor.Response { resp := &coprocessor.Response{} + var counts []int64 + if closureExecutor != nil { + counts = closureExecutor.counts + } selResp := &tipb.SelectResponse{ Error: toPBError(err), Chunks: chunks, OutputCounts: counts, + Ndvs: ndvs, } + executors := dagReq.Executors if dagReq.CollectExecutionSummaries != nil && *dagReq.CollectExecutionSummaries { - execSummary := make([]*tipb.ExecutorExecutionSummary, len(dagReq.Executors)) + execSummary := make([]*tipb.ExecutorExecutionSummary, len(executors)) for i := range execSummary { - // TODO: Add real executor execution summary information. - execSummary[i] = &tipb.ExecutorExecutionSummary{} + if closureExecutor == nil { + selResp.ExecutionSummaries = execSummary + continue + } + switch executors[i].Tp { + case tipb.ExecType_TypeTableScan: + execSummary[i] = closureExecutor.scanCtx.execDetail.buildSummary() + case tipb.ExecType_TypeIndexScan: + execSummary[i] = closureExecutor.idxScanCtx.execDetail.buildSummary() + case tipb.ExecType_TypeSelection: + execSummary[i] = closureExecutor.selectionCtx.execDetail.buildSummary() + case tipb.ExecType_TypeTopN: + execSummary[i] = closureExecutor.topNCtx.execDetail.buildSummary() + case tipb.ExecType_TypeAggregation, tipb.ExecType_TypeStreamAgg: + execSummary[i] = closureExecutor.aggCtx.execDetail.buildSummary() + case tipb.ExecType_TypeLimit: + costNs := uint64(0) + rows := uint64(closureExecutor.rowCount) + numIter := uint64(1) + execSummary[i] = &tipb.ExecutorExecutionSummary{ + TimeProcessedNs: &costNs, + NumProducedRows: &rows, + NumIterations: &numIter, + } + default: + execSummary[i] = &tipb.ExecutorExecutionSummary{} + } } selResp.ExecutionSummaries = execSummary } @@ -298,7 +370,10 @@ func buildResp(chunks []tipb.Chunk, counts []int64, dagReq *tipb.DAGRequest, err } } resp.ExecDetails = &kvrpcpb.ExecDetails{ - HandleTime: &kvrpcpb.HandleTime{ProcessMs: int64(dur / time.Millisecond)}, + TimeDetail: &kvrpcpb.TimeDetail{ProcessWallTimeMs: int64(dur / time.Millisecond)}, + } + resp.ExecDetailsV2 = &kvrpcpb.ExecDetailsV2{ + TimeDetail: resp.ExecDetails.TimeDetail, } data, err := proto.Marshal(selResp) if err != nil { @@ -399,7 +474,7 @@ func fieldTypeFromPBColumn(col *tipb.ColumnInfo) *types.FieldType { Flen: int(col.GetColumnLen()), Decimal: int(col.GetDecimal()), Elems: col.Elems, - Collate: mysql.Collations[uint8(collate.RestoreCollationIDIfNeeded(col.GetCollation()))], + Collate: collate.CollationID2Name(collate.RestoreCollationIDIfNeeded(col.GetCollation())), } } diff --git a/store/mockstore/unistore/cophandler/mpp.go b/store/mockstore/unistore/cophandler/mpp.go new file mode 100644 index 0000000000000..9849f53921099 --- /dev/null +++ b/store/mockstore/unistore/cophandler/mpp.go @@ -0,0 +1,422 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package cophandler + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/golang/protobuf/proto" + "github.com/ngaut/unistore/tikv/dbreader" + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/kvproto/pkg/mpp" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/store/mockstore/unistore/client" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tipb/go-tipb" + "github.com/uber-go/atomic" +) + +const ( + // MPPErrTunnelNotFound means you can't find an expected tunnel. + MPPErrTunnelNotFound = iota + // MPPErrEstablishConnMultiTimes means we receive the Establish requests at least twice. + MPPErrEstablishConnMultiTimes +) + +type mppExecBuilder struct { + sc *stmtctx.StatementContext + dbReader *dbreader.DBReader + req *coprocessor.Request + mppCtx *MPPCtx + dagReq *tipb.DAGRequest +} + +func (b *mppExecBuilder) buildMPPTableScan(pb *tipb.TableScan) (*tableScanExec, error) { + ranges, err := extractKVRanges(b.dbReader.StartKey, b.dbReader.EndKey, b.req.Ranges, false) + if err != nil { + return nil, errors.Trace(err) + } + ts := &tableScanExec{ + baseMPPExec: baseMPPExec{sc: b.sc, mppCtx: b.mppCtx}, + startTS: b.req.StartTs, + kvRanges: ranges, + dbReader: b.dbReader, + } + for _, col := range pb.Columns { + ft := fieldTypeFromPBColumn(col) + ts.fieldTypes = append(ts.fieldTypes, ft) + } + ts.decoder, err = newRowDecoder(pb.Columns, ts.fieldTypes, pb.PrimaryColumnIds, b.sc.TimeZone) + return ts, err +} + +func (b *mppExecBuilder) buildMPPExchangeSender(pb *tipb.ExchangeSender) (*exchSenderExec, error) { + child, err := b.buildMPPExecutor(pb.Child) + if err != nil { + return nil, err + } + + e := &exchSenderExec{ + baseMPPExec: baseMPPExec{ + sc: b.sc, + mppCtx: b.mppCtx, + children: []mppExec{child}, + fieldTypes: child.getFieldTypes(), + }, + exchangeTp: pb.Tp, + } + if pb.Tp == tipb.ExchangeType_Hash { + if len(pb.PartitionKeys) != 1 { + return nil, errors.New("The number of hash key must be 1") + } + expr, err := expression.PBToExpr(pb.PartitionKeys[0], child.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + col, ok := expr.(*expression.Column) + if !ok { + return nil, errors.New("Hash key must be column type") + } + e.hashKeyOffset = col.Index + } + + for _, taskMeta := range pb.EncodedTaskMeta { + targetTask := new(mpp.TaskMeta) + err := targetTask.Unmarshal(taskMeta) + if err != nil { + return nil, err + } + tunnel := &ExchangerTunnel{ + DataCh: make(chan *tipb.Chunk, 10), + sourceTask: b.mppCtx.TaskHandler.Meta, + targetTask: targetTask, + connectedCh: make(chan struct{}), + ErrCh: make(chan error, 1), + } + e.tunnels = append(e.tunnels, tunnel) + err = b.mppCtx.TaskHandler.registerTunnel(tunnel) + if err != nil { + return nil, err + } + } + e.outputOffsets = b.dagReq.OutputOffsets + return e, nil +} + +func (b *mppExecBuilder) buildMPPExchangeReceiver(pb *tipb.ExchangeReceiver) (*exchRecvExec, error) { + e := &exchRecvExec{ + baseMPPExec: baseMPPExec{ + sc: b.sc, + mppCtx: b.mppCtx, + }, + exchangeReceiver: pb, + } + + for _, pbType := range pb.FieldTypes { + tp := expression.FieldTypeFromPB(pbType) + if tp.Tp == mysql.TypeEnum { + tp.Elems = append(tp.Elems, pbType.Elems...) + } + e.fieldTypes = append(e.fieldTypes, tp) + } + return e, nil +} + +func (b *mppExecBuilder) buildMPPJoin(pb *tipb.Join, children []*tipb.Executor) (*joinExec, error) { + e := &joinExec{ + baseMPPExec: baseMPPExec{ + sc: b.sc, + mppCtx: b.mppCtx, + }, + Join: pb, + hashMap: make(map[string][]chunk.Row), + buildSideIdx: pb.InnerIdx, + } + leftCh, err := b.buildMPPExecutor(children[0]) + if err != nil { + return nil, errors.Trace(err) + } + rightCh, err := b.buildMPPExecutor(children[1]) + if err != nil { + return nil, errors.Trace(err) + } + if pb.JoinType == tipb.JoinType_TypeLeftOuterJoin { + for _, tp := range rightCh.getFieldTypes() { + tp.Flag &= ^mysql.NotNullFlag + } + defaultInner := chunk.MutRowFromTypes(rightCh.getFieldTypes()) + for i := range rightCh.getFieldTypes() { + defaultInner.SetDatum(i, types.NewDatum(nil)) + } + e.defaultInner = defaultInner.ToRow() + } else if pb.JoinType == tipb.JoinType_TypeRightOuterJoin { + for _, tp := range leftCh.getFieldTypes() { + tp.Flag &= ^mysql.NotNullFlag + } + defaultInner := chunk.MutRowFromTypes(leftCh.getFieldTypes()) + for i := range leftCh.getFieldTypes() { + defaultInner.SetDatum(i, types.NewDatum(nil)) + } + e.defaultInner = defaultInner.ToRow() + } + // because the field type is immutable, so this kind of appending is safe. + e.fieldTypes = append(leftCh.getFieldTypes(), rightCh.getFieldTypes()...) + if pb.InnerIdx == 1 { + e.probeChild = leftCh + e.buildChild = rightCh + probeExpr, err := expression.PBToExpr(pb.LeftJoinKeys[0], leftCh.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.probeKey = probeExpr.(*expression.Column) + buildExpr, err := expression.PBToExpr(pb.RightJoinKeys[0], rightCh.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.buildKey = buildExpr.(*expression.Column) + } else { + e.probeChild = rightCh + e.buildChild = leftCh + buildExpr, err := expression.PBToExpr(pb.LeftJoinKeys[0], leftCh.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.buildKey = buildExpr.(*expression.Column) + probeExpr, err := expression.PBToExpr(pb.RightJoinKeys[0], rightCh.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.probeKey = probeExpr.(*expression.Column) + } + return e, nil +} + +func (b *mppExecBuilder) buildMPPProj(proj *tipb.Projection) (*projExec, error) { + e := &projExec{} + + chExec, err := b.buildMPPExecutor(proj.Child) + if err != nil { + return nil, errors.Trace(err) + } + e.children = []mppExec{chExec} + + for _, pbExpr := range proj.Exprs { + expr, err := expression.PBToExpr(pbExpr, chExec.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.exprs = append(e.exprs, expr) + e.fieldTypes = append(e.fieldTypes, expr.GetType()) + } + return e, nil +} + +func (b *mppExecBuilder) buildMPPSel(sel *tipb.Selection) (*selExec, error) { + chExec, err := b.buildMPPExecutor(sel.Child) + if err != nil { + return nil, errors.Trace(err) + } + e := &selExec{ + baseMPPExec: baseMPPExec{ + fieldTypes: chExec.getFieldTypes(), + sc: b.sc, + mppCtx: b.mppCtx, + children: []mppExec{chExec}, + }, + } + + for _, pbExpr := range sel.Conditions { + expr, err := expression.PBToExpr(pbExpr, chExec.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.conditions = append(e.conditions, expr) + } + return e, nil +} + +func (b *mppExecBuilder) buildMPPAgg(agg *tipb.Aggregation) (*aggExec, error) { + e := &aggExec{ + groups: make(map[string]struct{}), + aggCtxsMap: make(map[string][]*aggregation.AggEvaluateContext), + processed: false, + } + + chExec, err := b.buildMPPExecutor(agg.Child) + if err != nil { + return nil, errors.Trace(err) + } + e.children = []mppExec{chExec} + for _, aggFunc := range agg.AggFunc { + ft := expression.PbTypeToFieldType(aggFunc.FieldType) + e.fieldTypes = append(e.fieldTypes, ft) + aggExpr, err := aggregation.NewDistAggFunc(aggFunc, chExec.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.aggExprs = append(e.aggExprs, aggExpr) + } + + for _, gby := range agg.GroupBy { + ft := expression.PbTypeToFieldType(gby.FieldType) + e.fieldTypes = append(e.fieldTypes, ft) + e.groupByTypes = append(e.groupByTypes, ft) + gbyExpr, err := expression.PBToExpr(gby, chExec.getFieldTypes(), b.sc) + if err != nil { + return nil, errors.Trace(err) + } + e.groupByExprs = append(e.groupByExprs, gbyExpr) + } + return e, nil +} + +func (b *mppExecBuilder) buildMPPExecutor(exec *tipb.Executor) (mppExec, error) { + switch exec.Tp { + case tipb.ExecType_TypeTableScan: + ts := exec.TblScan + return b.buildMPPTableScan(ts) + case tipb.ExecType_TypeExchangeReceiver: + rec := exec.ExchangeReceiver + return b.buildMPPExchangeReceiver(rec) + case tipb.ExecType_TypeExchangeSender: + send := exec.ExchangeSender + return b.buildMPPExchangeSender(send) + case tipb.ExecType_TypeJoin: + join := exec.Join + return b.buildMPPJoin(join, join.Children) + case tipb.ExecType_TypeAggregation: + agg := exec.Aggregation + return b.buildMPPAgg(agg) + case tipb.ExecType_TypeProjection: + return b.buildMPPProj(exec.Projection) + case tipb.ExecType_TypeSelection: + return b.buildMPPSel(exec.Selection) + default: + return nil, errors.Errorf("Do not support executor %s", exec.Tp.String()) + } +} + +// HandleMPPDAGReq handles a cop request that is converted from mpp request. +// It returns nothing. Real data will return by stream rpc. +func HandleMPPDAGReq(dbReader *dbreader.DBReader, req *coprocessor.Request, mppCtx *MPPCtx) *coprocessor.Response { + dagReq := new(tipb.DAGRequest) + err := proto.Unmarshal(req.Data, dagReq) + if err != nil { + return &coprocessor.Response{OtherError: err.Error()} + } + builder := mppExecBuilder{ + dbReader: dbReader, + req: req, + mppCtx: mppCtx, + sc: flagsToStatementContext(dagReq.Flags), + dagReq: dagReq, + } + mppExec, err := builder.buildMPPExecutor(dagReq.RootExecutor) + if err != nil { + panic("build error: " + err.Error()) + } + err = mppExec.open() + if err != nil { + panic("open phase find error: " + err.Error()) + } + _, err = mppExec.next() + if err != nil { + panic("running phase find error: " + err.Error()) + } + return &coprocessor.Response{} +} + +// MPPTaskHandler exists in a single store. +type MPPTaskHandler struct { + // When a connect request comes, it contains server task (source) and client task (target), Exchanger dataCh set will find dataCh by client task. + tunnelSetLock sync.Mutex + TunnelSet map[int64]*ExchangerTunnel + + Meta *mpp.TaskMeta + RPCClient client.Client + + Status atomic.Int32 + Err error +} + +// HandleEstablishConn handles EstablishMPPConnectionRequest +func (h *MPPTaskHandler) HandleEstablishConn(_ context.Context, req *mpp.EstablishMPPConnectionRequest) (*ExchangerTunnel, error) { + meta := req.ReceiverMeta + for i := 0; i < 10; i++ { + tunnel, err := h.getAndActiveTunnel(req) + if err == nil { + return tunnel, nil + } + time.Sleep(time.Second) + } + return nil, errors.Errorf("cannot find client task %d registered in server task %d", meta.TaskId, req.SenderMeta.TaskId) +} + +func (h *MPPTaskHandler) registerTunnel(tunnel *ExchangerTunnel) error { + taskID := tunnel.targetTask.TaskId + h.tunnelSetLock.Lock() + defer h.tunnelSetLock.Unlock() + _, ok := h.TunnelSet[taskID] + if ok { + return errors.Errorf("task id %d has been registered", taskID) + } + h.TunnelSet[taskID] = tunnel + return nil +} + +func (h *MPPTaskHandler) getAndActiveTunnel(req *mpp.EstablishMPPConnectionRequest) (*ExchangerTunnel, *mpp.Error) { + targetID := req.ReceiverMeta.TaskId + h.tunnelSetLock.Lock() + defer h.tunnelSetLock.Unlock() + if tunnel, ok := h.TunnelSet[targetID]; ok { + close(tunnel.connectedCh) + return tunnel, nil + } + // We dont find this dataCh, may be task not ready or have been deleted. + return nil, &mpp.Error{Code: MPPErrTunnelNotFound, Msg: "task not found, please wait for a while"} +} + +// ExchangerTunnel contains a channel that can transfer data. +// Only One Sender and Receiver use this channel, so it's safe to close it by sender. +type ExchangerTunnel struct { + DataCh chan *tipb.Chunk + + sourceTask *mpp.TaskMeta // source task is nearer to the data source + targetTask *mpp.TaskMeta // target task is nearer to the client end , as tidb. + + connectedCh chan struct{} + ErrCh chan error +} + +func (tunnel *ExchangerTunnel) debugString() string { + return fmt.Sprintf("(%d->%d)", tunnel.sourceTask.TaskId, tunnel.targetTask.TaskId) +} + +// RecvChunk recive tipb chunk +func (tunnel *ExchangerTunnel) RecvChunk() (tipbChunk *tipb.Chunk, err error) { + tipbChunk = <-tunnel.DataCh + select { + case err = <-tunnel.ErrCh: + default: + } + return tipbChunk, err +} diff --git a/store/mockstore/unistore/cophandler/mpp_exec.go b/store/mockstore/unistore/cophandler/mpp_exec.go new file mode 100644 index 0000000000000..8da2ed1085f1d --- /dev/null +++ b/store/mockstore/unistore/cophandler/mpp_exec.go @@ -0,0 +1,655 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package cophandler + +import ( + "io" + "math" + "sync" + "time" + + "github.com/ngaut/unistore/tikv/dbreader" + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/mpp" + "github.com/pingcap/parser/mysql" + "github.com/pingcap/tidb/expression" + "github.com/pingcap/tidb/expression/aggregation" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx/stmtctx" + "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/tablecodec" + "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/rowcodec" + "github.com/pingcap/tipb/go-tipb" +) + +// mpp executor that only servers for mpp execution +type mppExec interface { + open() error + next() (*chunk.Chunk, error) + getFieldTypes() []*types.FieldType +} + +type baseMPPExec struct { + sc *stmtctx.StatementContext + + mppCtx *MPPCtx + + children []mppExec + + fieldTypes []*types.FieldType +} + +func (b *baseMPPExec) getFieldTypes() []*types.FieldType { + return b.fieldTypes +} + +type tableScanExec struct { + baseMPPExec + + kvRanges []kv.KeyRange + startTS uint64 + dbReader *dbreader.DBReader + + chunks []*chunk.Chunk + chkIdx int + + decoder *rowcodec.ChunkDecoder +} + +func (e *tableScanExec) SkipValue() bool { return false } + +func (e *tableScanExec) Process(key, value []byte) error { + handle, err := tablecodec.DecodeRowKey(key) + if err != nil { + return errors.Trace(err) + } + chk := chunk.NewChunkWithCapacity(e.fieldTypes, 0) + err = e.decoder.DecodeToChunk(value, handle, chk) + e.chunks = append(e.chunks, chk) + if err != nil { + return errors.Trace(err) + } + return nil +} + +func (e *tableScanExec) open() error { + for _, ran := range e.kvRanges { + err := e.dbReader.Scan(ran.StartKey, ran.EndKey, math.MaxInt64, e.startTS, e) + if err != nil { + return errors.Trace(err) + } + } + return nil +} + +func (e *tableScanExec) next() (*chunk.Chunk, error) { + if e.chkIdx < len(e.chunks) { + e.chkIdx++ + return e.chunks[e.chkIdx-1], nil + } + return nil, nil +} + +type exchSenderExec struct { + baseMPPExec + + exchangeSender *tipb.ExchangeSender + tunnels []*ExchangerTunnel + outputOffsets []uint32 + exchangeTp tipb.ExchangeType + hashKeyOffset int +} + +func (e *exchSenderExec) open() error { + return e.children[0].open() +} + +func (e *exchSenderExec) toTiPBChunk(chk *chunk.Chunk) ([]tipb.Chunk, error) { + var oldRow []types.Datum + oldChunks := make([]tipb.Chunk, 0) + for i := 0; i < chk.NumRows(); i++ { + oldRow = oldRow[:0] + for _, outputOff := range e.outputOffsets { + d := chk.GetRow(i).GetDatum(int(outputOff), e.fieldTypes[outputOff]) + oldRow = append(oldRow, d) + } + var err error + var oldRowBuf []byte + oldRowBuf, err = codec.EncodeValue(e.sc, oldRowBuf[:0], oldRow...) + if err != nil { + return nil, errors.Trace(err) + } + oldChunks = appendRow(oldChunks, oldRowBuf, i) + } + return oldChunks, nil +} + +func (e *exchSenderExec) next() (*chunk.Chunk, error) { + defer func() { + for _, tunnel := range e.tunnels { + <-tunnel.connectedCh + close(tunnel.ErrCh) + close(tunnel.DataCh) + } + }() + for { + chk, err := e.children[0].next() + if err != nil { + for _, tunnel := range e.tunnels { + tunnel.ErrCh <- err + } + return nil, nil + } else if chk != nil { + if e.exchangeTp == tipb.ExchangeType_Hash { + rows := chk.NumRows() + targetChunks := make([]*chunk.Chunk, 0, len(e.tunnels)) + for i := 0; i < len(e.tunnels); i++ { + targetChunks = append(targetChunks, chunk.NewChunkWithCapacity(e.fieldTypes, rows)) + } + for i := 0; i < rows; i++ { + row := chk.GetRow(i) + d := row.GetDatum(e.hashKeyOffset, e.fieldTypes[e.hashKeyOffset]) + if d.IsNull() { + targetChunks[0].AppendRow(row) + } else { + hashKey := int(d.GetInt64() % int64(len(e.tunnels))) + targetChunks[hashKey].AppendRow(row) + } + } + for i, tunnel := range e.tunnels { + if targetChunks[i].NumRows() > 0 { + tipbChunks, err := e.toTiPBChunk(targetChunks[i]) + if err != nil { + for _, tunnel := range e.tunnels { + tunnel.ErrCh <- err + } + return nil, nil + } + for _, tipbChunk := range tipbChunks { + tunnel.DataCh <- &tipbChunk + } + } + } + } else { + for _, tunnel := range e.tunnels { + tipbChunks, err := e.toTiPBChunk(chk) + if err != nil { + for _, tunnel := range e.tunnels { + tunnel.ErrCh <- err + } + return nil, nil + } + for _, tipbChunk := range tipbChunks { + tunnel.DataCh <- &tipbChunk + } + } + } + } else { + return nil, nil + } + } +} + +type exchRecvExec struct { + baseMPPExec + + exchangeReceiver *tipb.ExchangeReceiver + chk *chunk.Chunk + lock sync.Mutex + wg sync.WaitGroup + err error + inited bool +} + +func (e *exchRecvExec) open() error { + return nil +} + +func (e *exchRecvExec) init() error { + e.chk = chunk.NewChunkWithCapacity(e.fieldTypes, 0) + serverMetas := make([]*mpp.TaskMeta, 0, len(e.exchangeReceiver.EncodedTaskMeta)) + for _, encodedMeta := range e.exchangeReceiver.EncodedTaskMeta { + meta := new(mpp.TaskMeta) + err := meta.Unmarshal(encodedMeta) + if err != nil { + return errors.Trace(err) + } + serverMetas = append(serverMetas, meta) + } + for _, meta := range serverMetas { + e.wg.Add(1) + go e.runTunnelWorker(e.mppCtx.TaskHandler, meta) + } + e.wg.Wait() + return e.err +} + +func (e *exchRecvExec) next() (*chunk.Chunk, error) { + if !e.inited { + e.inited = true + if err := e.init(); err != nil { + return nil, err + } + } + if e.chk != nil { + defer func() { + e.chk = nil + }() + } + return e.chk, nil +} + +func (e *exchRecvExec) EstablishConnAndReceiveData(h *MPPTaskHandler, meta *mpp.TaskMeta) ([]*mpp.MPPDataPacket, error) { + req := &mpp.EstablishMPPConnectionRequest{ReceiverMeta: h.Meta, SenderMeta: meta} + rpcReq := tikvrpc.NewRequest(tikvrpc.CmdMPPConn, req, kvrpcpb.Context{}) + rpcResp, err := h.RPCClient.SendRequest(e.mppCtx.Ctx, meta.Address, rpcReq, 3600*time.Second) + if err != nil { + return nil, errors.Trace(err) + } + + resp := rpcResp.Resp.(*tikvrpc.MPPStreamResponse) + + mppResponse := resp.MPPDataPacket + ret := make([]*mpp.MPPDataPacket, 0, 3) + for { + if mppResponse == nil { + return ret, nil + } + if mppResponse.Error != nil { + return nil, errors.New(mppResponse.Error.Msg) + } + ret = append(ret, mppResponse) + mppResponse, err = resp.Recv() + if err != nil { + if errors.Cause(err) == io.EOF { + return ret, nil + } + return nil, errors.Trace(err) + } + if mppResponse == nil { + return ret, nil + } + } +} + +func (e *exchRecvExec) runTunnelWorker(h *MPPTaskHandler, meta *mpp.TaskMeta) { + defer func() { + e.wg.Done() + }() + + var ( + err error + resp []*mpp.MPPDataPacket + ) + + resp, err = e.EstablishConnAndReceiveData(h, meta) + if err != nil { + e.err = err + return + } + for _, mppData := range resp { + var selectResp tipb.SelectResponse + err = selectResp.Unmarshal(mppData.Data) + if err != nil { + e.err = err + return + } + for _, tipbChunk := range selectResp.Chunks { + chk := chunk.NewChunkWithCapacity(e.fieldTypes, 0) + err = pbChunkToChunk(tipbChunk, chk, e.fieldTypes) + if err != nil { + e.err = err + return + } + e.lock.Lock() + e.chk.Append(chk, 0, chk.NumRows()) + e.lock.Unlock() + } + } +} + +// TODO: Let the join support conditions / multiple keys +type joinExec struct { + baseMPPExec + + *tipb.Join + + hashMap map[string][]chunk.Row + + buildKey *expression.Column + probeKey *expression.Column + + buildSideIdx int64 + + buildChild mppExec + probeChild mppExec + + idx int + reservedRows []chunk.Row + + defaultInner chunk.Row + inited bool +} + +func (e *joinExec) buildHashTable() error { + for { + chk, err := e.buildChild.next() + if err != nil { + return errors.Trace(err) + } + if chk == nil { + return nil + } + rows := chk.NumRows() + for i := 0; i < rows; i++ { + row := chk.GetRow(i) + keyCol := row.GetDatum(e.buildKey.Index, e.buildChild.getFieldTypes()[e.buildKey.Index]) + key, err := keyCol.ToString() + if err != nil { + return errors.Trace(err) + } + if rowSet, ok := e.hashMap[key]; ok { + rowSet = append(rowSet, row) + e.hashMap[key] = rowSet + } else { + e.hashMap[key] = []chunk.Row{row} + } + } + } +} + +func (e *joinExec) fetchRows() (bool, error) { + chk, err := e.probeChild.next() + if err != nil { + return false, errors.Trace(err) + } + if chk == nil { + return true, nil + } + e.idx = 0 + e.reservedRows = make([]chunk.Row, 0) + chkSize := chk.NumRows() + for i := 0; i < chkSize; i++ { + row := chk.GetRow(i) + keyCol := row.GetDatum(e.probeKey.Index, e.probeChild.getFieldTypes()[e.probeKey.Index]) + key, err := keyCol.ToString() + if err != nil { + return false, errors.Trace(err) + } + if rowSet, ok := e.hashMap[key]; ok { + for _, matched := range rowSet { + newRow := chunk.MutRowFromTypes(e.fieldTypes) + if e.buildSideIdx == 0 { + newRow.ShallowCopyPartialRow(0, matched) + newRow.ShallowCopyPartialRow(matched.Len(), row) + } else { + newRow.ShallowCopyPartialRow(0, row) + newRow.ShallowCopyPartialRow(row.Len(), matched) + } + e.reservedRows = append(e.reservedRows, newRow.ToRow()) + } + } else if e.Join.JoinType == tipb.JoinType_TypeLeftOuterJoin { + newRow := chunk.MutRowFromTypes(e.fieldTypes) + newRow.ShallowCopyPartialRow(0, row) + newRow.ShallowCopyPartialRow(row.Len(), e.defaultInner) + e.reservedRows = append(e.reservedRows, newRow.ToRow()) + } else if e.Join.JoinType == tipb.JoinType_TypeRightOuterJoin { + newRow := chunk.MutRowFromTypes(e.fieldTypes) + newRow.ShallowCopyPartialRow(0, e.defaultInner) + newRow.ShallowCopyPartialRow(e.defaultInner.Len(), row) + e.reservedRows = append(e.reservedRows, newRow.ToRow()) + } + } + return false, nil +} + +func (e *joinExec) open() error { + err := e.buildChild.open() + if err != nil { + return errors.Trace(err) + } + err = e.probeChild.open() + if err != nil { + return errors.Trace(err) + } + return nil +} + +func (e *joinExec) next() (*chunk.Chunk, error) { + if !e.inited { + e.inited = true + if err := e.buildHashTable(); err != nil { + return nil, err + } + } + for { + if e.idx < len(e.reservedRows) { + idx := e.idx + e.idx++ + return e.reservedRows[idx].Chunk(), nil + } + eof, err := e.fetchRows() + if err != nil { + return nil, errors.Trace(err) + } + if eof { + return nil, nil + } + } +} + +type aggExec struct { + baseMPPExec + + aggExprs []aggregation.Aggregation + groupByExprs []expression.Expression + groups map[string]struct{} + groupKeys [][]byte + aggCtxsMap map[string][]*aggregation.AggEvaluateContext + + groupByRows []chunk.Row + groupByTypes []*types.FieldType + + processed bool +} + +func (e *aggExec) open() error { + return e.children[0].open() +} + +func (e *aggExec) getGroupKey(row chunk.Row) (*chunk.MutRow, []byte, error) { + length := len(e.groupByExprs) + if length == 0 { + return nil, nil, nil + } + key := make([]byte, 0, 32) + gbyRow := chunk.MutRowFromTypes(e.groupByTypes) + for i, item := range e.groupByExprs { + v, err := item.Eval(row) + if err != nil { + return nil, nil, errors.Trace(err) + } + gbyRow.SetDatum(i, v) + b, err := codec.EncodeValue(e.sc, nil, v) + if err != nil { + return nil, nil, errors.Trace(err) + } + key = append(key, b...) + } + return &gbyRow, key, nil +} + +func (e *aggExec) getContexts(groupKey []byte) []*aggregation.AggEvaluateContext { + aggCtxs, ok := e.aggCtxsMap[string(groupKey)] + if !ok { + aggCtxs = make([]*aggregation.AggEvaluateContext, 0, len(e.aggExprs)) + for _, agg := range e.aggExprs { + aggCtxs = append(aggCtxs, agg.CreateContext(e.sc)) + } + e.aggCtxsMap[string(groupKey)] = aggCtxs + } + return aggCtxs +} + +func (e *aggExec) processAllRows() (*chunk.Chunk, error) { + for { + chk, err := e.children[0].next() + if err != nil { + return nil, errors.Trace(err) + } + if chk == nil { + break + } + rows := chk.NumRows() + for i := 0; i < rows; i++ { + row := chk.GetRow(i) + gbyRow, gk, err := e.getGroupKey(row) + if err != nil { + return nil, errors.Trace(err) + } + if _, ok := e.groups[string(gk)]; !ok { + e.groups[string(gk)] = struct{}{} + e.groupKeys = append(e.groupKeys, gk) + if gbyRow != nil { + e.groupByRows = append(e.groupByRows, gbyRow.ToRow()) + } + } + + aggCtxs := e.getContexts(gk) + for i, agg := range e.aggExprs { + err = agg.Update(aggCtxs[i], e.sc, row) + if err != nil { + return nil, errors.Trace(err) + } + } + } + } + + chk := chunk.NewChunkWithCapacity(e.fieldTypes, 0) + + for i, gk := range e.groupKeys { + newRow := chunk.MutRowFromTypes(e.fieldTypes) + aggCtxs := e.getContexts(gk) + for i, agg := range e.aggExprs { + result := agg.GetResult(aggCtxs[i]) + if e.fieldTypes[i].Tp == mysql.TypeLonglong && result.Kind() == types.KindMysqlDecimal { + var err error + result, err = result.ConvertTo(e.sc, e.fieldTypes[i]) + if err != nil { + return nil, errors.Trace(err) + } + } + newRow.SetDatum(i, result) + } + if len(e.groupByRows) > 0 { + newRow.ShallowCopyPartialRow(len(e.aggExprs), e.groupByRows[i]) + } + chk.AppendRow(newRow.ToRow()) + } + return chk, nil +} + +func (e *aggExec) next() (*chunk.Chunk, error) { + if !e.processed { + e.processed = true + return e.processAllRows() + } + return nil, nil +} + +type selExec struct { + baseMPPExec + + conditions []expression.Expression +} + +func (e *selExec) open() error { + return e.children[0].open() +} + +func (e *selExec) next() (*chunk.Chunk, error) { + chk, err := e.children[0].next() + if err != nil { + return nil, errors.Trace(err) + } + if chk == nil { + return nil, nil + } + for rows := chk.NumRows() - 1; rows >= 0; rows-- { + row := chk.GetRow(rows) + for _, cond := range e.conditions { + d, err := cond.Eval(row) + if err != nil { + return nil, errors.Trace(err) + } + + var passCheck bool + if d.IsNull() { + passCheck = false + } else { + isBool, err := d.ToBool(e.sc) + if err != nil { + return nil, errors.Trace(err) + } + isBool, err = expression.HandleOverflowOnSelection(e.sc, isBool, err) + if err != nil { + return nil, errors.Trace(err) + } + passCheck = isBool != 0 + } + if !passCheck { + chk.TruncateTo(rows) + break + } + } + } + return chk, nil +} + +type projExec struct { + baseMPPExec + exprs []expression.Expression +} + +func (e *projExec) open() error { + return e.children[0].open() +} + +func (e *projExec) next() (*chunk.Chunk, error) { + chk, err := e.children[0].next() + if err != nil { + return nil, errors.Trace(err) + } + if chk == nil { + return nil, nil + } + newChunk := chunk.NewChunkWithCapacity(e.fieldTypes, 10) + for i := 0; i < chk.NumRows(); i++ { + row := chk.GetRow(i) + newRow := chunk.MutRowFromTypes(e.fieldTypes) + for i, expr := range e.exprs { + d, err := expr.Eval(row) + if err != nil { + return nil, errors.Trace(err) + } + newRow.SetDatum(i, d) + } + newChunk.AppendRow(newRow.ToRow()) + } + return newChunk, nil +} diff --git a/store/mockstore/unistore/cophandler/topn.go b/store/mockstore/unistore/cophandler/topn.go index e19625c8e4162..f7ad71c946b1c 100644 --- a/store/mockstore/unistore/cophandler/topn.go +++ b/store/mockstore/unistore/cophandler/topn.go @@ -16,7 +16,7 @@ package cophandler import ( "container/heap" - "github.com/juju/errors" + "github.com/pingcap/errors" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" tipb "github.com/pingcap/tipb/go-tipb" diff --git a/store/mockstore/unistore/mock.go b/store/mockstore/unistore/mock.go index 8db4b3757ab9c..4fc64d5a48beb 100644 --- a/store/mockstore/unistore/mock.go +++ b/store/mockstore/unistore/mock.go @@ -65,6 +65,7 @@ func New(path string) (*RPCClient, pd.Client, *Cluster, error) { persistent: persistent, rawHandler: newRawHandler(), } + srv.RPCClient = client pdClient := newPDClient(pd) return client, pdClient, cluster, nil diff --git a/store/mockstore/unistore/pd.go b/store/mockstore/unistore/pd.go index fd935036a7893..ea27bb50c7771 100644 --- a/store/mockstore/unistore/pd.go +++ b/store/mockstore/unistore/pd.go @@ -40,10 +40,18 @@ func newPDClient(pd *us.MockPD) *pdClient { } } +func (c *pdClient) GetLocalTS(ctx context.Context, dcLocation string) (int64, int64, error) { + return c.GetTS(ctx) +} + func (c *pdClient) GetTSAsync(ctx context.Context) pd.TSFuture { return &mockTSFuture{c, ctx, false} } +func (c *pdClient) GetLocalTSAsync(ctx context.Context, dcLocation string) pd.TSFuture { + return &mockTSFuture{c, ctx, false} +} + type mockTSFuture struct { pdc *pdClient ctx context.Context @@ -93,10 +101,18 @@ func (c *pdClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetO return &pdpb.GetOperatorResponse{Status: pdpb.OperatorStatus_SUCCESS}, nil } -func (c *pdClient) ScatterRegionWithOption(ctx context.Context, regionID uint64, opts ...pd.ScatterRegionOption) error { - return nil +func (c *pdClient) GetAllMembers(ctx context.Context) ([]*pdpb.Member, error) { + return nil, nil +} + +func (c *pdClient) ScatterRegions(ctx context.Context, regionsID []uint64, opts ...pd.RegionsOption) (*pdpb.ScatterRegionResponse, error) { + return nil, nil +} + +func (c *pdClient) SplitRegions(ctx context.Context, splitKeys [][]byte, opts ...pd.RegionsOption) (*pdpb.SplitRegionsResponse, error) { + return nil, nil } -func (c *pdClient) GetMemberInfo(ctx context.Context) ([]*pdpb.Member, error) { +func (c *pdClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string) (*pd.Region, error) { return nil, nil } diff --git a/store/mockstore/unistore/raw_handler_test.go b/store/mockstore/unistore/raw_handler_test.go index 9bd1ba83dc63c..5396cc2dadad6 100644 --- a/store/mockstore/unistore/raw_handler_test.go +++ b/store/mockstore/unistore/raw_handler_test.go @@ -14,6 +14,7 @@ package unistore import ( + "context" "fmt" "testing" @@ -35,18 +36,19 @@ var _ = Suite(testSuite{}) func (ts testSuite) TestRawHandler(c *C) { h := newRawHandler() + ctx := context.Background() keys := make([][]byte, 10) vals := make([][]byte, 10) for i := 0; i < 10; i++ { keys[i] = []byte(fmt.Sprintf("key%d", i)) vals[i] = []byte(fmt.Sprintf("val%d", i)) } - putResp, _ := h.RawPut(nil, &kvrpcpb.RawPutRequest{Key: keys[0], Value: vals[0]}) + putResp, _ := h.RawPut(ctx, &kvrpcpb.RawPutRequest{Key: keys[0], Value: vals[0]}) c.Assert(putResp, NotNil) - getResp, _ := h.RawGet(nil, &kvrpcpb.RawGetRequest{Key: keys[0]}) + getResp, _ := h.RawGet(ctx, &kvrpcpb.RawGetRequest{Key: keys[0]}) c.Assert(getResp, NotNil) c.Assert(getResp.Value, BytesEquals, vals[0]) - delResp, _ := h.RawDelete(nil, &kvrpcpb.RawDeleteRequest{Key: keys[0]}) + delResp, _ := h.RawDelete(ctx, &kvrpcpb.RawDeleteRequest{Key: keys[0]}) c.Assert(delResp, NotNil) batchPutReq := &kvrpcpb.RawBatchPutRequest{Pairs: []*kvrpcpb.KvPair{ @@ -54,12 +56,12 @@ func (ts testSuite) TestRawHandler(c *C) { {Key: keys[3], Value: vals[3]}, {Key: keys[5], Value: vals[5]}, }} - batchPutResp, _ := h.RawBatchPut(nil, batchPutReq) + batchPutResp, _ := h.RawBatchPut(ctx, batchPutReq) c.Assert(batchPutResp, NotNil) - batchGetResp, _ := h.RawBatchGet(nil, &kvrpcpb.RawBatchGetRequest{Keys: [][]byte{keys[1], keys[3], keys[5]}}) + batchGetResp, _ := h.RawBatchGet(ctx, &kvrpcpb.RawBatchGetRequest{Keys: [][]byte{keys[1], keys[3], keys[5]}}) c.Assert(batchGetResp, NotNil) c.Assert(batchGetResp.Pairs, DeepEquals, batchPutReq.Pairs) - batchDelResp, _ := h.RawBatchDelete(nil, &kvrpcpb.RawBatchDeleteRequest{Keys: [][]byte{keys[1], keys[3], keys[5]}}) + batchDelResp, _ := h.RawBatchDelete(ctx, &kvrpcpb.RawBatchDeleteRequest{Keys: [][]byte{keys[1], keys[3], keys[5]}}) c.Assert(batchDelResp, NotNil) batchPutReq.Pairs = []*kvrpcpb.KvPair{ @@ -67,18 +69,18 @@ func (ts testSuite) TestRawHandler(c *C) { {Key: keys[7], Value: vals[7]}, {Key: keys[8], Value: vals[8]}, } - batchPutResp, _ = h.RawBatchPut(nil, batchPutReq) + batchPutResp, _ = h.RawBatchPut(ctx, batchPutReq) c.Assert(batchPutResp, NotNil) scanReq := &kvrpcpb.RawScanRequest{StartKey: keys[0], EndKey: keys[9], Limit: 2} - scanResp, _ := h.RawScan(nil, scanReq) + scanResp, _ := h.RawScan(ctx, scanReq) c.Assert(batchPutResp, NotNil) c.Assert(scanResp.Kvs, HasLen, 2) c.Assert(batchPutReq.Pairs[:2], DeepEquals, scanResp.Kvs) - delRangeResp, _ := h.RawDeleteRange(nil, &kvrpcpb.RawDeleteRangeRequest{StartKey: keys[0], EndKey: keys[9]}) + delRangeResp, _ := h.RawDeleteRange(ctx, &kvrpcpb.RawDeleteRangeRequest{StartKey: keys[0], EndKey: keys[9]}) c.Assert(delRangeResp, NotNil) - scanResp, _ = h.RawScan(nil, scanReq) + scanResp, _ = h.RawScan(ctx, scanReq) c.Assert(scanResp.Kvs, HasLen, 0) } diff --git a/store/mockstore/unistore/rpc.go b/store/mockstore/unistore/rpc.go index 8ef39ed5b6c5f..72f36eb239abe 100644 --- a/store/mockstore/unistore/rpc.go +++ b/store/mockstore/unistore/rpc.go @@ -31,6 +31,7 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/kvproto/pkg/mpp" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv/tikvrpc" @@ -82,23 +83,52 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R return nil, context.Canceled } + storeID, err := c.usSvr.GetStoreIdByAddr(addr) + if err != nil { + return nil, err + } + resp := &tikvrpc.Response{} - var err error switch req.Type { case tikvrpc.CmdGet: resp.Resp, err = c.usSvr.KvGet(ctx, req.Get()) case tikvrpc.CmdScan: - resp.Resp, err = c.usSvr.KvScan(ctx, req.Scan()) - case tikvrpc.CmdPrewrite: - failpoint.Inject("rpcPrewriteResult", func(val failpoint.Value) { + kvScanReq := req.Scan() + failpoint.Inject("rpcScanResult", func(val failpoint.Value) { switch val.(string) { - case "notLeader": + case "keyError": failpoint.Return(&tikvrpc.Response{ - Resp: &kvrpcpb.PrewriteResponse{RegionError: &errorpb.Error{NotLeader: &errorpb.NotLeader{}}}, + Resp: &kvrpcpb.ScanResponse{Error: &kvrpcpb.KeyError{ + Locked: &kvrpcpb.LockInfo{ + PrimaryLock: kvScanReq.StartKey, + LockVersion: kvScanReq.Version - 1, + Key: kvScanReq.StartKey, + LockTtl: 50, + TxnSize: 1, + LockType: kvrpcpb.Op_Put, + }, + }}, }, nil) } }) + resp.Resp, err = c.usSvr.KvScan(ctx, kvScanReq) + case tikvrpc.CmdPrewrite: + failpoint.Inject("rpcPrewriteResult", func(val failpoint.Value) { + if val != nil { + switch val.(string) { + case "notLeader": + failpoint.Return(&tikvrpc.Response{ + Resp: &kvrpcpb.PrewriteResponse{RegionError: &errorpb.Error{NotLeader: &errorpb.NotLeader{}}}, + }, nil) + case "writeConflict": + failpoint.Return(&tikvrpc.Response{ + Resp: &kvrpcpb.PrewriteResponse{Errors: []*kvrpcpb.KeyError{{Conflict: &kvrpcpb.WriteConflict{}}}}, + }, nil) + } + } + }) + r := req.Prewrite() c.cluster.handleDelay(r.StartVersion, r.Context.RegionId) resp.Resp, err = c.usSvr.KvPrewrite(ctx, r) @@ -146,7 +176,26 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R case tikvrpc.CmdTxnHeartBeat: resp.Resp, err = c.usSvr.KvTxnHeartBeat(ctx, req.TxnHeartBeat()) case tikvrpc.CmdBatchGet: - resp.Resp, err = c.usSvr.KvBatchGet(ctx, req.BatchGet()) + batchGetReq := req.BatchGet() + failpoint.Inject("rpcBatchGetResult", func(val failpoint.Value) { + switch val.(string) { + case "keyError": + failpoint.Return(&tikvrpc.Response{ + Resp: &kvrpcpb.BatchGetResponse{Error: &kvrpcpb.KeyError{ + Locked: &kvrpcpb.LockInfo{ + PrimaryLock: batchGetReq.Keys[0], + LockVersion: batchGetReq.Version - 1, + Key: batchGetReq.Keys[0], + LockTtl: 50, + TxnSize: 1, + LockType: kvrpcpb.Op_Put, + }, + }}, + }, nil) + } + }) + + resp.Resp, err = c.usSvr.KvBatchGet(ctx, batchGetReq) case tikvrpc.CmdBatchRollback: resp.Resp, err = c.usSvr.KvBatchRollback(ctx, req.BatchRollback()) case tikvrpc.CmdScanLock: @@ -177,6 +226,29 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R resp.Resp, err = c.usSvr.Coprocessor(ctx, req.Cop()) case tikvrpc.CmdCopStream: resp.Resp, err = c.handleCopStream(ctx, req.Cop()) + case tikvrpc.CmdBatchCop: + failpoint.Inject("BatchCopCancelled", func(value failpoint.Value) { + if value.(bool) { + failpoint.Return(nil, context.Canceled) + } + }) + + failpoint.Inject("BatchCopRpcErr"+addr, func(value failpoint.Value) { + if value.(string) == addr { + failpoint.Return(nil, errors.New("rpc error")) + } + }) + resp.Resp, err = c.handleBatchCop(ctx, req.BatchCop(), timeout) + case tikvrpc.CmdMPPConn: + resp.Resp, err = c.handleEstablishMPPConnection(ctx, req.EstablishMPPConn(), timeout, storeID) + case tikvrpc.CmdMPPTask: + failpoint.Inject("mppDispatchTimeout", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, errors.New("rpc error")) + } + }) + resp.Resp, err = c.handleDispatchMPPTask(ctx, req.DispatchMPPTask(), storeID) + case tikvrpc.CmdMPPCancel: case tikvrpc.CmdMvccGetByKey: resp.Resp, err = c.usSvr.MvccGetByKey(ctx, req.MvccGetByKey()) case tikvrpc.CmdMvccGetByStartTs: @@ -187,12 +259,15 @@ func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R resp.Resp, err = c.handleDebugGetRegionProperties(ctx, req.DebugGetRegionProperties()) return resp, err default: - err = errors.Errorf("unsupport this request type %v", req.Type) + err = errors.Errorf("not support this request type %v", req.Type) } if err != nil { return nil, err } - regErr, err := resp.GetRegionError() + var regErr *errorpb.Error = nil + if req.Type != tikvrpc.CmdBatchCop && req.Type != tikvrpc.CmdMPPConn && req.Type != tikvrpc.CmdMPPTask { + regErr, err = resp.GetRegionError() + } if err != nil { return nil, err } @@ -217,6 +292,50 @@ func (c *RPCClient) handleCopStream(ctx context.Context, req *coprocessor.Reques }, nil } +func (c *RPCClient) handleEstablishMPPConnection(ctx context.Context, r *mpp.EstablishMPPConnectionRequest, timeout time.Duration, storeID uint64) (*tikvrpc.MPPStreamResponse, error) { + mockServer := new(mockMPPConnectStreamServer) + err := c.usSvr.EstablishMPPConnectionWithStoreId(r, mockServer, storeID) + if err != nil { + return nil, err + } + var mockClient = mockMPPConnectionClient{mppResponses: mockServer.mppResponses, idx: 0, ctx: ctx, targetTask: r.ReceiverMeta} + streamResp := &tikvrpc.MPPStreamResponse{Tikv_EstablishMPPConnectionClient: &mockClient} + _, cancel := context.WithCancel(ctx) + streamResp.Lease.Cancel = cancel + streamResp.Timeout = timeout + first, err := streamResp.Recv() + if err != nil { + if errors.Cause(err) != io.EOF { + return nil, errors.Trace(err) + } + } + streamResp.MPPDataPacket = first + return streamResp, nil +} + +func (c *RPCClient) handleDispatchMPPTask(ctx context.Context, r *mpp.DispatchTaskRequest, storeID uint64) (*mpp.DispatchTaskResponse, error) { + return c.usSvr.DispatchMPPTaskWithStoreId(ctx, r, storeID) +} + +func (c *RPCClient) handleBatchCop(ctx context.Context, r *coprocessor.BatchRequest, timeout time.Duration) (*tikvrpc.BatchCopStreamResponse, error) { + mockBatchCopServer := &mockBatchCoprocessorStreamServer{} + err := c.usSvr.BatchCoprocessor(r, mockBatchCopServer) + if err != nil { + return nil, err + } + var mockBatchCopClient = mockBatchCopClient{batchResponses: mockBatchCopServer.batchResponses, idx: 0} + batchResp := &tikvrpc.BatchCopStreamResponse{Tikv_BatchCoprocessorClient: &mockBatchCopClient} + _, cancel := context.WithCancel(ctx) + batchResp.Lease.Cancel = cancel + batchResp.Timeout = timeout + first, err := batchResp.Recv() + if err != nil { + return nil, errors.Trace(err) + } + batchResp.BatchResponse = first + return batchResp, nil +} + func (c *RPCClient) handleDebugGetRegionProperties(ctx context.Context, req *debugpb.GetRegionPropertiesRequest) (*debugpb.GetRegionPropertiesResponse, error) { region := c.cluster.GetRegion(req.RegionId) _, start, err := codec.DecodeBytes(region.StartKey, nil) @@ -324,3 +443,91 @@ type mockCopStreamClient struct { func (mock *mockCopStreamClient) Recv() (*coprocessor.Response, error) { return nil, io.EOF } + +type mockBatchCopClient struct { + mockClientStream + batchResponses []*coprocessor.BatchResponse + idx int +} + +func (mock *mockBatchCopClient) Recv() (*coprocessor.BatchResponse, error) { + if mock.idx < len(mock.batchResponses) { + ret := mock.batchResponses[mock.idx] + mock.idx++ + var err error = nil + if len(ret.OtherError) > 0 { + err = errors.New(ret.OtherError) + ret = nil + } + return ret, err + } + failpoint.Inject("batchCopRecvTimeout", func(val failpoint.Value) { + if val.(bool) { + failpoint.Return(nil, context.Canceled) + } + }) + return nil, io.EOF +} + +type mockMPPConnectionClient struct { + mockClientStream + mppResponses []*mpp.MPPDataPacket + idx int + ctx context.Context + targetTask *mpp.TaskMeta +} + +func (mock *mockMPPConnectionClient) Recv() (*mpp.MPPDataPacket, error) { + if mock.idx < len(mock.mppResponses) { + ret := mock.mppResponses[mock.idx] + mock.idx++ + return ret, nil + } + failpoint.Inject("mppRecvTimeout", func(val failpoint.Value) { + if int64(val.(int)) == mock.targetTask.TaskId { + failpoint.Return(nil, context.Canceled) + } + }) + failpoint.Inject("mppRecvHang", func(val failpoint.Value) { + for val.(bool) { + select { + case <-mock.ctx.Done(): + { + failpoint.Return(nil, context.Canceled) + } + default: + time.Sleep(1 * time.Second) + } + } + }) + return nil, io.EOF +} + +type mockServerStream struct{} + +func (mockServerStream) SetHeader(metadata.MD) error { return nil } +func (mockServerStream) SendHeader(metadata.MD) error { return nil } +func (mockServerStream) SetTrailer(metadata.MD) {} +func (mockServerStream) Context() context.Context { return nil } +func (mockServerStream) SendMsg(interface{}) error { return nil } +func (mockServerStream) RecvMsg(interface{}) error { return nil } + +type mockBatchCoprocessorStreamServer struct { + mockServerStream + batchResponses []*coprocessor.BatchResponse +} + +func (mockBatchCopServer *mockBatchCoprocessorStreamServer) Send(response *coprocessor.BatchResponse) error { + mockBatchCopServer.batchResponses = append(mockBatchCopServer.batchResponses, response) + return nil +} + +type mockMPPConnectStreamServer struct { + mockServerStream + mppResponses []*mpp.MPPDataPacket +} + +func (mockMPPConnectStreamServer *mockMPPConnectStreamServer) Send(mppResponse *mpp.MPPDataPacket) error { + mockMPPConnectStreamServer.mppResponses = append(mockMPPConnectStreamServer.mppResponses, mppResponse) + return nil +} diff --git a/store/store_test.go b/store/store_test.go index 066d7334e48d4..627a214badee7 100644 --- a/store/store_test.go +++ b/store/store_test.go @@ -26,6 +26,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/testleak" ) @@ -542,12 +543,11 @@ func (s *testKVSuite) TestDBClose(c *C) { err = txn.Commit(context.Background()) c.Assert(err, IsNil) - ver, err := store.CurrentVersion() + ver, err := store.CurrentVersion(oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(kv.MaxVersion.Cmp(ver), Equals, 1) - snap, err := store.GetSnapshot(kv.MaxVersion) - c.Assert(err, IsNil) + snap := store.GetSnapshot(kv.MaxVersion) _, err = snap.Get(context.TODO(), []byte("a")) c.Assert(err, IsNil) @@ -561,8 +561,7 @@ func (s *testKVSuite) TestDBClose(c *C) { _, err = store.Begin() c.Assert(err, NotNil) - _, err = store.GetSnapshot(kv.MaxVersion) - c.Assert(err, NotNil) + _ = store.GetSnapshot(kv.MaxVersion) err = txn.Set([]byte("a"), []byte("b")) c.Assert(err, IsNil) @@ -584,7 +583,7 @@ func (s *testKVSuite) TestIsolationInc(c *C) { defer wg.Done() for j := 0; j < 100; j++ { var id int64 - err := kv.RunInNewTxn(s.s, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.s, true, func(ctx context.Context, txn kv.Transaction) error { var err1 error id, err1 = kv.IncInt64(txn, []byte("key"), 1) return err1 @@ -626,7 +625,7 @@ func (s *testKVSuite) TestIsolationMultiInc(c *C) { go func() { defer wg.Done() for j := 0; j < incCnt; j++ { - err := kv.RunInNewTxn(s.s, true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.s, true, func(ctx context.Context, txn kv.Transaction) error { for _, key := range keys { _, err1 := kv.IncInt64(txn, key, 1) if err1 != nil { @@ -643,7 +642,7 @@ func (s *testKVSuite) TestIsolationMultiInc(c *C) { wg.Wait() - err := kv.RunInNewTxn(s.s, false, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), s.s, false, func(ctx context.Context, txn kv.Transaction) error { for _, key := range keys { id, err1 := kv.GetInt64(context.TODO(), txn, key) if err1 != nil { diff --git a/store/tikv/1pc_test.go b/store/tikv/1pc_test.go new file mode 100644 index 0000000000000..f3dd54593257f --- /dev/null +++ b/store/tikv/1pc_test.go @@ -0,0 +1,271 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "context" + + . "github.com/pingcap/check" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/store/tikv/util" +) + +func (s *testAsyncCommitCommon) begin1PC(c *C) *KVTxn { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + txn.SetOption(kv.Enable1PC, true) + return txn +} + +type testOnePCSuite struct { + OneByOneSuite + testAsyncCommitCommon + bo *Backoffer +} + +var _ = SerialSuites(&testOnePCSuite{}) + +func (s *testOnePCSuite) SetUpTest(c *C) { + s.testAsyncCommitCommon.setUpTest(c) + s.bo = NewBackofferWithVars(context.Background(), 5000, nil) +} + +func (s *testOnePCSuite) Test1PC(c *C) { + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + + k1 := []byte("k1") + v1 := []byte("v1") + + txn := s.begin1PC(c) + err := txn.Set(k1, v1) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsTrue) + c.Assert(txn.committer.onePCCommitTS, Equals, txn.committer.commitTS) + c.Assert(txn.committer.onePCCommitTS, Greater, txn.startTS) + // ttlManager is not used for 1PC. + c.Assert(txn.committer.ttlManager.state, Equals, stateUninitialized) + + // 1PC doesn't work if sessionID == 0 + k2 := []byte("k2") + v2 := []byte("v2") + + txn = s.begin1PC(c) + err = txn.Set(k2, v2) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsFalse) + c.Assert(txn.committer.onePCCommitTS, Equals, uint64(0)) + c.Assert(txn.committer.commitTS, Greater, txn.startTS) + + // 1PC doesn't work if system variable not set + + k3 := []byte("k3") + v3 := []byte("v3") + + txn = s.begin(c) + err = txn.Set(k3, v3) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsFalse) + c.Assert(txn.committer.onePCCommitTS, Equals, uint64(0)) + c.Assert(txn.committer.commitTS, Greater, txn.startTS) + + // Test multiple keys + k4 := []byte("k4") + v4 := []byte("v4") + k5 := []byte("k5") + v5 := []byte("v5") + k6 := []byte("k6") + v6 := []byte("v6") + + txn = s.begin1PC(c) + err = txn.Set(k4, v4) + c.Assert(err, IsNil) + err = txn.Set(k5, v5) + c.Assert(err, IsNil) + err = txn.Set(k6, v6) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsTrue) + c.Assert(txn.committer.onePCCommitTS, Equals, txn.committer.commitTS) + c.Assert(txn.committer.onePCCommitTS, Greater, txn.startTS) + // Check keys are committed with the same version + s.mustGetFromSnapshot(c, txn.commitTS, k4, v4) + s.mustGetFromSnapshot(c, txn.commitTS, k5, v5) + s.mustGetFromSnapshot(c, txn.commitTS, k6, v6) + s.mustGetNoneFromSnapshot(c, txn.commitTS-1, k4) + s.mustGetNoneFromSnapshot(c, txn.commitTS-1, k5) + s.mustGetNoneFromSnapshot(c, txn.commitTS-1, k6) + + // Overwriting in MVCC + v6New := []byte("v6new") + txn = s.begin1PC(c) + err = txn.Set(k6, v6New) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsTrue) + c.Assert(txn.committer.onePCCommitTS, Equals, txn.committer.commitTS) + c.Assert(txn.committer.onePCCommitTS, Greater, txn.startTS) + s.mustGetFromSnapshot(c, txn.commitTS, k6, v6New) + s.mustGetFromSnapshot(c, txn.commitTS-1, k6, v6) + + // Check all keys + keys := [][]byte{k1, k2, k3, k4, k5, k6} + values := [][]byte{v1, v2, v3, v4, v5, v6New} + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) + c.Assert(err, IsNil) + snap := s.store.GetSnapshot(ver) + for i, k := range keys { + v, err := snap.Get(ctx, k) + c.Assert(err, IsNil) + c.Assert(v, BytesEquals, values[i]) + } +} + +func (s *testOnePCSuite) Test1PCIsolation(c *C) { + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + + k := []byte("k") + v1 := []byte("v1") + + txn := s.begin1PC(c) + txn.Set(k, v1) + err := txn.Commit(ctx) + c.Assert(err, IsNil) + + v2 := []byte("v2") + txn = s.begin1PC(c) + txn.Set(k, v2) + + // Make `txn`'s commitTs more likely to be less than `txn2`'s startTs if there's bug in commitTs + // calculation. + for i := 0; i < 10; i++ { + _, err := s.store.oracle.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + c.Assert(err, IsNil) + } + + txn2 := s.begin1PC(c) + s.mustGetFromTxn(c, txn2, k, v1) + + err = txn.Commit(ctx) + c.Assert(txn.committer.isOnePC(), IsTrue) + c.Assert(err, IsNil) + + s.mustGetFromTxn(c, txn2, k, v1) + c.Assert(txn2.Rollback(), IsNil) + + s.mustGetFromSnapshot(c, txn.commitTS, k, v2) + s.mustGetFromSnapshot(c, txn.commitTS-1, k, v1) +} + +func (s *testOnePCSuite) Test1PCDisallowMultiRegion(c *C) { + // This test doesn't support tikv mode. + if *WithTiKV { + return + } + + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + + txn := s.begin1PC(c) + + keys := []string{"k0", "k1", "k2", "k3"} + values := []string{"v0", "v1", "v2", "v3"} + + err := txn.Set([]byte(keys[0]), []byte(values[0])) + c.Assert(err, IsNil) + err = txn.Set([]byte(keys[3]), []byte(values[3])) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + + // 1PC doesn't work if it affects multiple regions. + loc, err := s.store.regionCache.LocateKey(s.bo, []byte(keys[2])) + c.Assert(err, IsNil) + newRegionID := s.cluster.AllocID() + newPeerID := s.cluster.AllocID() + s.cluster.Split(loc.Region.id, newRegionID, []byte(keys[2]), []uint64{newPeerID}, newPeerID) + + txn = s.begin1PC(c) + err = txn.Set([]byte(keys[1]), []byte(values[1])) + c.Assert(err, IsNil) + err = txn.Set([]byte(keys[2]), []byte(values[2])) + c.Assert(err, IsNil) + err = txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isOnePC(), IsFalse) + c.Assert(txn.committer.onePCCommitTS, Equals, uint64(0)) + c.Assert(txn.committer.commitTS, Greater, txn.startTS) + + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) + c.Assert(err, IsNil) + snap := s.store.GetSnapshot(ver) + for i, k := range keys { + v, err := snap.Get(ctx, []byte(k)) + c.Assert(err, IsNil) + c.Assert(v, BytesEquals, []byte(values[i])) + } +} + +// It's just a simple validation of linearizability. +// Extra tests are needed to test this feature with the control of the TiKV cluster. +func (s *testOnePCSuite) Test1PCLinearizability(c *C) { + t1, err := s.store.Begin() + c.Assert(err, IsNil) + t2, err := s.store.Begin() + c.Assert(err, IsNil) + err = t1.Set([]byte("a"), []byte("a1")) + c.Assert(err, IsNil) + err = t2.Set([]byte("b"), []byte("b1")) + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + // t2 commits earlier than t1 + err = t2.Commit(ctx) + c.Assert(err, IsNil) + err = t1.Commit(ctx) + c.Assert(err, IsNil) + commitTS1 := t1.committer.commitTS + commitTS2 := t2.committer.commitTS + c.Assert(commitTS2, Less, commitTS1) +} + +func (s *testOnePCSuite) Test1PCWithMultiDC(c *C) { + // It requires setting placement rules to run with TiKV + if *WithTiKV { + return + } + + localTxn := s.begin1PC(c) + err := localTxn.Set([]byte("a"), []byte("a1")) + localTxn.SetOption(kv.TxnScope, "bj") + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + err = localTxn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(localTxn.committer.isOnePC(), IsFalse) + + globalTxn := s.begin1PC(c) + err = globalTxn.Set([]byte("b"), []byte("b1")) + globalTxn.SetOption(kv.TxnScope, oracle.GlobalTxnScope) + c.Assert(err, IsNil) + err = globalTxn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(globalTxn.committer.isOnePC(), IsTrue) +} diff --git a/store/tikv/2pc.go b/store/tikv/2pc.go index 9d2ebc089e7ca..5e0e4cbdb91c8 100644 --- a/store/tikv/2pc.go +++ b/store/tikv/2pc.go @@ -16,7 +16,9 @@ package tikv import ( "bytes" "context" + "encoding/hex" "math" + "math/rand" "strings" "sync" "sync/atomic" @@ -26,22 +28,16 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/parser/model" - "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/sessionctx/binloginfo" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/table/tables" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/rowcodec" - "github.com/pingcap/tipb/go-binlog" "github.com/prometheus/client_golang/prometheus" zap "go.uber.org/zap" ) @@ -52,42 +48,26 @@ type twoPhaseCommitAction interface { String() string } -var ( - tikvSecondaryLockCleanupFailureCounterRollback = metrics.TiKVSecondaryLockCleanupFailureCounter.WithLabelValues("rollback") - tiKVTxnHeartBeatHistogramOK = metrics.TiKVTxnHeartBeatHistogram.WithLabelValues("ok") - tiKVTxnHeartBeatHistogramError = metrics.TiKVTxnHeartBeatHistogram.WithLabelValues("err") - tikvAsyncCommitTxnCounterOk = metrics.TiKVAsyncCommitTxnCounter.WithLabelValues("ok") - tikvAsyncCommitTxnCounterError = metrics.TiKVAsyncCommitTxnCounter.WithLabelValues("err") -) - // Global variable set by config file. var ( ManagedLockTTL uint64 = 20000 // 20s ) -// metricsTag returns detail tag for metrics. -func metricsTag(action string) string { - return "2pc_" + action -} - // twoPhaseCommitter executes a two-phase commit protocol. type twoPhaseCommitter struct { - store *tikvStore - txn *tikvTxn + store *KVStore + txn *KVTxn startTS uint64 - mutations CommitterMutations + mutations *memBufferMutations lockTTL uint64 commitTS uint64 priority pb.CommandPri - connID uint64 // connID is used for log. + sessionID uint64 // sessionID is used for log. cleanWg sync.WaitGroup detail unsafe.Pointer txnSize int hasNoNeedCommitKeys bool - prewriteOnlyKeys int - ignoredKeys int - primaryKey []byte forUpdateTS uint64 @@ -111,21 +91,99 @@ type twoPhaseCommitter struct { noFallBack bool } - useAsyncCommit uint32 - minCommitTS uint64 + useAsyncCommit uint32 + minCommitTS uint64 + maxCommitTS uint64 + prewriteStarted bool + prewriteCancelled uint32 + useOnePC uint32 + onePCCommitTS uint64 + + // doingAmend means the amend prewrite is ongoing. + doingAmend bool + + binlog BinlogExecutor +} + +type memBufferMutations struct { + storage kv.MemBuffer + handles []kv.MemKeyHandle +} + +func newMemBufferMutations(sizeHint int, storage kv.MemBuffer) *memBufferMutations { + return &memBufferMutations{ + handles: make([]kv.MemKeyHandle, 0, sizeHint), + storage: storage, + } +} + +func (m *memBufferMutations) Len() int { + return len(m.handles) +} + +func (m *memBufferMutations) GetKey(i int) []byte { + return m.storage.GetKeyByHandle(m.handles[i]) +} + +func (m *memBufferMutations) GetKeys() [][]byte { + ret := make([][]byte, m.Len()) + for i := range ret { + ret[i] = m.GetKey(i) + } + return ret +} + +func (m *memBufferMutations) GetValue(i int) []byte { + v, _ := m.storage.GetValueByHandle(m.handles[i]) + return v +} + +func (m *memBufferMutations) GetOp(i int) pb.Op { + return pb.Op(m.handles[i].UserData >> 1) +} + +func (m *memBufferMutations) IsPessimisticLock(i int) bool { + return m.handles[i].UserData&1 != 0 +} + +func (m *memBufferMutations) Slice(from, to int) CommitterMutations { + return &memBufferMutations{ + handles: m.handles[from:to], + storage: m.storage, + } +} + +func (m *memBufferMutations) Push(op pb.Op, isPessimisticLock bool, handle kv.MemKeyHandle) { + aux := uint16(op) << 1 + if isPessimisticLock { + aux |= 1 + } + handle.UserData = aux + m.handles = append(m.handles, handle) +} + +// CommitterMutations contains the mutations to be submitted. +type CommitterMutations interface { + Len() int + GetKey(i int) []byte + GetKeys() [][]byte + GetOp(i int) pb.Op + GetValue(i int) []byte + IsPessimisticLock(i int) bool + Slice(from, to int) CommitterMutations } -// CommitterMutations contains transaction operations. -type CommitterMutations struct { +// PlainMutations contains transaction operations. +type PlainMutations struct { ops []pb.Op keys [][]byte values [][]byte isPessimisticLock []bool } -// NewCommiterMutations creates a CommitterMutations object with sizeHint reserved. -func NewCommiterMutations(sizeHint int) CommitterMutations { - return CommitterMutations{ +// NewPlainMutations creates a PlainMutations object with sizeHint reserved. +func NewPlainMutations(sizeHint int) PlainMutations { + return PlainMutations{ ops: make([]pb.Op, 0, sizeHint), keys: make([][]byte, 0, sizeHint), values: make([][]byte, 0, sizeHint), @@ -133,8 +191,9 @@ func NewCommiterMutations(sizeHint int) CommitterMutations { } } -func (c *CommitterMutations) subRange(from, to int) CommitterMutations { - var res CommitterMutations +// Slice return a sub mutations in range [from, to). +func (c *PlainMutations) Slice(from, to int) CommitterMutations { + var res PlainMutations res.keys = c.keys[from:to] if c.ops != nil { res.ops = c.ops[from:to] @@ -145,191 +204,112 @@ func (c *CommitterMutations) subRange(from, to int) CommitterMutations { if c.isPessimisticLock != nil { res.isPessimisticLock = c.isPessimisticLock[from:to] } - return res + return &res } // Push another mutation into mutations. -func (c *CommitterMutations) Push(op pb.Op, key []byte, value []byte, isPessimisticLock bool) { +func (c *PlainMutations) Push(op pb.Op, key []byte, value []byte, isPessimisticLock bool) { c.ops = append(c.ops, op) c.keys = append(c.keys, key) c.values = append(c.values, value) c.isPessimisticLock = append(c.isPessimisticLock, isPessimisticLock) } -func (c *CommitterMutations) len() int { +// Len returns the count of mutations. +func (c *PlainMutations) Len() int { return len(c.keys) } +// GetKey returns the key at index. +func (c *PlainMutations) GetKey(i int) []byte { + return c.keys[i] +} + // GetKeys returns the keys. -func (c *CommitterMutations) GetKeys() [][]byte { +func (c *PlainMutations) GetKeys() [][]byte { return c.keys } // GetOps returns the key ops. -func (c *CommitterMutations) GetOps() []pb.Op { +func (c *PlainMutations) GetOps() []pb.Op { return c.ops } // GetValues returns the key values. -func (c *CommitterMutations) GetValues() [][]byte { +func (c *PlainMutations) GetValues() [][]byte { return c.values } // GetPessimisticFlags returns the key pessimistic flags. -func (c *CommitterMutations) GetPessimisticFlags() []bool { +func (c *PlainMutations) GetPessimisticFlags() []bool { return c.isPessimisticLock } +// GetOp returns the key op at index. +func (c *PlainMutations) GetOp(i int) pb.Op { + return c.ops[i] +} + +// GetValue returns the key value at index. +func (c *PlainMutations) GetValue(i int) []byte { + if len(c.values) <= i { + return nil + } + return c.values[i] +} + +// IsPessimisticLock returns the key pessimistic flag at index. +func (c *PlainMutations) IsPessimisticLock(i int) bool { + return c.isPessimisticLock[i] +} + +// PlainMutation represents a single transaction operation. +type PlainMutation struct { + KeyOp pb.Op + Key []byte + Value []byte + IsPessimisticLock bool +} + // MergeMutations append input mutations into current mutations. -func (c *CommitterMutations) MergeMutations(mutations CommitterMutations) { +func (c *PlainMutations) MergeMutations(mutations PlainMutations) { c.ops = append(c.ops, mutations.ops...) c.keys = append(c.keys, mutations.keys...) c.values = append(c.values, mutations.values...) c.isPessimisticLock = append(c.isPessimisticLock, mutations.isPessimisticLock...) } +// AppendMutation merges a single Mutation into the current mutations. +func (c *PlainMutations) AppendMutation(mutation PlainMutation) { + c.ops = append(c.ops, mutation.KeyOp) + c.keys = append(c.keys, mutation.Key) + c.values = append(c.values, mutation.Value) + c.isPessimisticLock = append(c.isPessimisticLock, mutation.IsPessimisticLock) +} + // newTwoPhaseCommitter creates a twoPhaseCommitter. -func newTwoPhaseCommitter(txn *tikvTxn, connID uint64) (*twoPhaseCommitter, error) { +func newTwoPhaseCommitter(txn *KVTxn, sessionID uint64) (*twoPhaseCommitter, error) { return &twoPhaseCommitter{ store: txn.store, txn: txn, startTS: txn.StartTS(), - connID: connID, + sessionID: sessionID, regionTxnSize: map[uint64]int{}, ttlManager: ttlManager{ ch: make(chan struct{}), }, isPessimistic: txn.IsPessimistic(), + binlog: &binlogExecutor{ + txn: txn, + }, }, nil } -func (c *twoPhaseCommitter) extractKeyExistsErr(key kv.Key) error { - if !c.txn.us.HasPresumeKeyNotExists(key) { - return errors.Errorf("conn %d, existErr for key:%s should not be nil", c.connID, key) - } - - tableID, indexID, isRecord, err := tablecodec.DecodeKeyHead(key) - if err != nil { - return c.genKeyExistsError("UNKNOWN", key.String(), err) - } - - tblInfo := c.txn.us.GetTableInfo(tableID) - if tblInfo == nil { - return c.genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find table info")) - } - - value, err := c.txn.us.GetMemBuffer().SelectValueHistory(key, func(value []byte) bool { return len(value) != 0 }) - if err != nil { - return c.genKeyExistsError("UNKNOWN", key.String(), err) - } - - if isRecord { - return c.extractKeyExistsErrFromHandle(key, value, tblInfo) - } - return c.extractKeyExistsErrFromIndex(key, value, tblInfo, indexID) -} - -func (c *twoPhaseCommitter) extractKeyExistsErrFromIndex(key kv.Key, value []byte, tblInfo *model.TableInfo, indexID int64) error { - var idxInfo *model.IndexInfo - for _, index := range tblInfo.Indices { - if index.ID == indexID { - idxInfo = index - } - } - if idxInfo == nil { - return c.genKeyExistsError("UNKNOWN", key.String(), errors.New("cannot find index info")) +func (c *twoPhaseCommitter) extractKeyExistsErr(err *ErrKeyExist) error { + if !c.txn.us.HasPresumeKeyNotExists(err.GetKey()) { + return errors.Errorf("session %d, existErr for key:%s should not be nil", c.sessionID, err.GetKey()) } - name := idxInfo.Name.String() - - if len(value) == 0 { - return c.genKeyExistsError(name, key.String(), errors.New("missing value")) - } - - colInfo := make([]rowcodec.ColInfo, 0, len(idxInfo.Columns)) - for _, idxCol := range idxInfo.Columns { - col := tblInfo.Columns[idxCol.Offset] - colInfo = append(colInfo, rowcodec.ColInfo{ - ID: col.ID, - IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), - Ft: rowcodec.FieldTypeFromModelColumn(col), - }) - } - - values, err := tablecodec.DecodeIndexKV(key, value, len(idxInfo.Columns), tablecodec.HandleNotNeeded, colInfo) - if err != nil { - return c.genKeyExistsError(name, key.String(), err) - } - valueStr := make([]string, 0, len(values)) - for i, val := range values { - d, err := tablecodec.DecodeColumnValue(val, colInfo[i].Ft, time.Local) - if err != nil { - return c.genKeyExistsError(name, key.String(), err) - } - str, err := d.ToString() - if err != nil { - return c.genKeyExistsError(name, key.String(), err) - } - valueStr = append(valueStr, str) - } - return c.genKeyExistsError(name, strings.Join(valueStr, "-"), nil) -} - -func (c *twoPhaseCommitter) extractKeyExistsErrFromHandle(key kv.Key, value []byte, tblInfo *model.TableInfo) error { - const name = "PRIMARY" - _, handle, err := tablecodec.DecodeRecordKey(key) - if err != nil { - return c.genKeyExistsError(name, key.String(), err) - } - - if handle.IsInt() { - return c.genKeyExistsError(name, handle.String(), nil) - } - - if len(value) == 0 { - return c.genKeyExistsError(name, handle.String(), errors.New("missing value")) - } - - idxInfo := tables.FindPrimaryIndex(tblInfo) - if idxInfo == nil { - return c.genKeyExistsError(name, handle.String(), errors.New("cannot find index info")) - } - - cols := make(map[int64]*types.FieldType, len(tblInfo.Columns)) - for _, col := range tblInfo.Columns { - cols[col.ID] = &col.FieldType - } - handleColIDs := make([]int64, 0, len(idxInfo.Columns)) - for _, col := range idxInfo.Columns { - handleColIDs = append(handleColIDs, tblInfo.Columns[col.Offset].ID) - } - - row, err := tablecodec.DecodeRowToDatumMap(value, cols, time.Local) - if err != nil { - return c.genKeyExistsError(name, handle.String(), err) - } - - data, err := tablecodec.DecodeHandleToDatumMap(handle, handleColIDs, cols, time.Local, row) - if err != nil { - return c.genKeyExistsError(name, handle.String(), err) - } - - valueStr := make([]string, 0, len(data)) - for _, col := range idxInfo.Columns { - d := data[tblInfo.Columns[col.Offset].ID] - str, err := d.ToString() - if err != nil { - return c.genKeyExistsError(name, key.String(), err) - } - valueStr = append(valueStr, str) - } - return c.genKeyExistsError(name, strings.Join(valueStr, "-"), nil) -} - -func (c *twoPhaseCommitter) genKeyExistsError(name string, value string, err error) error { - if err != nil { - logutil.BgLogger().Info("extractKeyExistsErr meets error", zap.Error(err)) - } - return kv.ErrKeyExists.FastGenByArgs(value, name) + return errors.Trace(err) } func (c *twoPhaseCommitter) initKeysAndMutations() error { @@ -338,7 +318,7 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { txn := c.txn memBuf := txn.GetMemBuffer() sizeHint := txn.us.GetMemBuffer().Len() - mutations := NewCommiterMutations(sizeHint) + c.mutations = newMemBufferMutations(sizeHint, memBuf) c.isPessimistic = txn.IsPessimistic() var err error @@ -359,13 +339,18 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { value = it.Value() if len(value) > 0 { if tablecodec.IsUntouchedIndexKValue(key, value) { - continue - } - op = pb.Op_Put - if flags.HasPresumeKeyNotExists() { - op = pb.Op_Insert + if !flags.HasLocked() { + continue + } + op = pb.Op_Lock + lockCnt++ + } else { + op = pb.Op_Put + if flags.HasPresumeKeyNotExists() { + op = pb.Op_Insert + } + putCnt++ } - putCnt++ } else { if !txn.IsPessimistic() && flags.HasPresumeKeyNotExists() { // delete-your-writes keys in optimistic txn need check not exists in prewrite-phase @@ -386,7 +371,7 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { if flags.HasLocked() { isPessimistic = c.isPessimistic } - mutations.Push(op, key, value, isPessimistic) + c.mutations.Push(op, isPessimistic, it.Handle()) size += len(key) + len(value) if len(c.primaryKey) == 0 && op != pb.Op_CheckNotExists { @@ -394,7 +379,7 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { } } - if mutations.len() == 0 { + if c.mutations.Len() == 0 { return nil } c.txnSize = size @@ -404,13 +389,13 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { } const logEntryCount = 10000 const logSize = 4 * 1024 * 1024 // 4MB - if mutations.len() > logEntryCount || size > logSize { - tableID := tablecodec.DecodeTableID(mutations.keys[0]) + if c.mutations.Len() > logEntryCount || size > logSize { + tableID := tablecodec.DecodeTableID(c.mutations.GetKey(0)) logutil.BgLogger().Info("[BIG_TXN]", - zap.Uint64("con", c.connID), + zap.Uint64("session", c.sessionID), zap.Int64("table ID", tableID), zap.Int("size", size), - zap.Int("keys", mutations.len()), + zap.Int("keys", c.mutations.Len()), zap.Int("puts", putCnt), zap.Int("dels", delCnt), zap.Int("locks", lockCnt), @@ -422,16 +407,15 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { if txn.StartTS() == math.MaxUint64 { err = errors.Errorf("try to commit with invalid txnStartTS: %d", txn.StartTS()) logutil.BgLogger().Error("commit failed", - zap.Uint64("conn", c.connID), + zap.Uint64("session", c.sessionID), zap.Error(err)) return errors.Trace(err) } - commitDetail := &execdetails.CommitDetails{WriteSize: size, WriteKeys: mutations.len()} + commitDetail := &execdetails.CommitDetails{WriteSize: size, WriteKeys: c.mutations.Len()} metrics.TiKVTxnWriteKVCountHistogram.Observe(float64(commitDetail.WriteKeys)) metrics.TiKVTxnWriteSizeHistogram.Observe(float64(commitDetail.WriteSize)) c.hasNoNeedCommitKeys = checkCnt > 0 - c.mutations = mutations c.lockTTL = txnLockTTL(txn.startTime, size) c.priority = getTxnPriority(txn) c.syncLog = getTxnSyncLog(txn) @@ -441,16 +425,17 @@ func (c *twoPhaseCommitter) initKeysAndMutations() error { func (c *twoPhaseCommitter) primary() []byte { if len(c.primaryKey) == 0 { - return c.mutations.keys[0] + return c.mutations.GetKey(0) } return c.primaryKey } // asyncSecondaries returns all keys that must be checked in the recovery phase of an async commit. func (c *twoPhaseCommitter) asyncSecondaries() [][]byte { - secondaries := make([][]byte, 0, len(c.mutations.keys)) - for i, k := range c.mutations.keys { - if bytes.Equal(k, c.primary()) || c.mutations.ops[i] == pb.Op_CheckNotExists { + secondaries := make([][]byte, 0, c.mutations.Len()) + for i := 0; i < c.mutations.Len(); i++ { + k := c.mutations.GetKey(i) + if bytes.Equal(k, c.primary()) || c.mutations.GetOp(i) == pb.Op_CheckNotExists { continue } secondaries = append(secondaries, k) @@ -491,7 +476,7 @@ var preSplitSizeThreshold uint32 = 32 << 20 // it does action on primary batch first, then on secondary batches. If action is commit, secondary batches // is done in background goroutine. func (c *twoPhaseCommitter) doActionOnMutations(bo *Backoffer, action twoPhaseCommitAction, mutations CommitterMutations) error { - if mutations.len() == 0 { + if mutations.Len() == 0 { return nil } groups, err := c.groupMutations(bo, mutations) @@ -499,12 +484,16 @@ func (c *twoPhaseCommitter) doActionOnMutations(bo *Backoffer, action twoPhaseCo return errors.Trace(err) } + // This is redundant since `doActionOnGroupMutations` will still split groups into batches and + // check the number of batches. However we don't want the check fail after any code changes. + c.checkOnePCFallBack(action, len(groups)) + return c.doActionOnGroupMutations(bo, action, groups) } // groupMutations groups mutations by region, then checks for any large groups and in that case pre-splits the region. func (c *twoPhaseCommitter) groupMutations(bo *Backoffer, mutations CommitterMutations) ([]groupedMutations, error) { - groups, err := c.store.regionCache.GroupSortedMutationsByRegion(bo, mutations) + groups, err := c.store.regionCache.groupSortedMutationsByRegion(bo, mutations) if err != nil { return nil, errors.Trace(err) } @@ -514,10 +503,10 @@ func (c *twoPhaseCommitter) groupMutations(bo *Backoffer, mutations CommitterMut var didPreSplit bool preSplitDetectThresholdVal := atomic.LoadUint32(&preSplitDetectThreshold) for _, group := range groups { - if uint32(group.mutations.len()) >= preSplitDetectThresholdVal { + if uint32(group.mutations.Len()) >= preSplitDetectThresholdVal { logutil.BgLogger().Info("2PC detect large amount of mutations on a single region", zap.Uint64("region", group.region.GetID()), - zap.Int("mutations count", group.mutations.len())) + zap.Int("mutations count", group.mutations.Len())) // Use context.Background, this time should not add up to Backoffer. if c.store.preSplitRegion(context.Background(), group) { didPreSplit = true @@ -526,7 +515,7 @@ func (c *twoPhaseCommitter) groupMutations(bo *Backoffer, mutations CommitterMut } // Reload region cache again. if didPreSplit { - groups, err = c.store.regionCache.GroupSortedMutationsByRegion(bo, mutations) + groups, err = c.store.regionCache.groupSortedMutationsByRegion(bo, mutations) if err != nil { return nil, errors.Trace(err) } @@ -547,7 +536,7 @@ func (c *twoPhaseCommitter) doActionOnGroupMutations(bo *Backoffer, action twoPh // Do not update regionTxnSize on retries. They are not used when building a PrewriteRequest. if len(bo.errors) == 0 { for _, group := range groups { - c.regionTxnSize[group.region.id] = group.mutations.len() + c.regionTxnSize[group.region.id] = group.mutations.Len() } } sizeFunc = c.keyValueSize @@ -568,10 +557,12 @@ func (c *twoPhaseCommitter) doActionOnGroupMutations(bo *Backoffer, action twoPh _, actionIsCleanup := action.(actionCleanup) _, actionIsPessimiticLock := action.(actionPessimisticLock) + c.checkOnePCFallBack(action, len(batchBuilder.allBatches())) + var err error failpoint.Inject("skipKeyReturnOK", func(val failpoint.Value) { valStr, ok := val.(string) - if ok && c.connID > 0 { + if ok && c.sessionID > 0 { if firstIsPrimary && actionIsPessimiticLock { logutil.Logger(bo.ctx).Warn("pessimisticLock failpoint", zap.String("valStr", valStr)) switch valStr { @@ -587,7 +578,7 @@ func (c *twoPhaseCommitter) doActionOnGroupMutations(bo *Backoffer, action twoPh }) failpoint.Inject("pessimisticRollbackDoNth", func() { _, actionIsPessimisticRollback := action.(actionPessimisticRollback) - if actionIsPessimisticRollback && c.connID > 0 { + if actionIsPessimisticRollback && c.sessionID > 0 { logutil.Logger(bo.ctx).Warn("pessimisticRollbackDoNth failpoint") failpoint.Return(nil) } @@ -610,13 +601,27 @@ func (c *twoPhaseCommitter) doActionOnGroupMutations(bo *Backoffer, action twoPh if actionIsCommit && !actionCommit.retry && !c.isAsyncCommit() { secondaryBo := NewBackofferWithVars(context.Background(), int(atomic.LoadUint64(&CommitMaxBackoff)), c.txn.vars) go func() { + if c.sessionID > 0 { + failpoint.Inject("beforeCommitSecondaries", func(v failpoint.Value) { + if s, ok := v.(string); !ok { + logutil.Logger(bo.ctx).Info("[failpoint] sleep 2s before commit secondary keys", + zap.Uint64("sessionID", c.sessionID), zap.Uint64("txnStartTS", c.startTS), zap.Uint64("txnCommitTS", c.commitTS)) + time.Sleep(2 * time.Second) + } else if s == "skip" { + logutil.Logger(bo.ctx).Info("[failpoint] injected skip committing secondaries", + zap.Uint64("sessionID", c.sessionID), zap.Uint64("txnStartTS", c.startTS), zap.Uint64("txnCommitTS", c.commitTS)) + failpoint.Return() + } + }) + } + e := c.doActionOnBatches(secondaryBo, action, batchBuilder.allBatches()) if e != nil { logutil.BgLogger().Debug("2PC async doActionOnBatches", - zap.Uint64("conn", c.connID), + zap.Uint64("session", c.sessionID), zap.Stringer("action type", action), zap.Error(e)) - tikvSecondaryLockCleanupFailureCounterCommit.Inc() + metrics.SecondaryLockCleanupFailureCounterCommit.Inc() } }() } else { @@ -642,7 +647,7 @@ func (c *twoPhaseCommitter) doActionOnBatches(bo *Backoffer, action twoPhaseComm e := action.handleSingleBatch(c, bo, b) if e != nil { logutil.BgLogger().Debug("2PC doActionOnBatches failed", - zap.Uint64("conn", c.connID), + zap.Uint64("session", c.sessionID), zap.Stringer("action type", action), zap.Error(e), zap.Uint64("txnStartTS", c.startTS)) @@ -656,8 +661,8 @@ func (c *twoPhaseCommitter) doActionOnBatches(bo *Backoffer, action twoPhaseComm // If the rate limit is too high, tikv will report service is busy. // If the rate limit is too low, we can't full utilize the tikv's throughput. // TODO: Find a self-adaptive way to control the rate limit here. - if rateLim > config.GetGlobalConfig().Performance.CommitterConcurrency { - rateLim = config.GetGlobalConfig().Performance.CommitterConcurrency + if rateLim > config.GetGlobalConfig().CommitterConcurrency { + rateLim = config.GetGlobalConfig().CommitterConcurrency } batchExecutor := newBatchExecutor(rateLim, c, action, bo) err := batchExecutor.process(batches) @@ -692,7 +697,14 @@ func (tm *ttlManager) run(c *twoPhaseCommitter, lockCtx *kv.LockCtx) { return } tm.lockCtx = lockCtx - go tm.keepAlive(c) + noKeepAlive := false + failpoint.Inject("doNotKeepAlive", func() { + noKeepAlive = true + }) + + if !noKeepAlive { + go tm.keepAlive(c) + } } func (tm *ttlManager) close() { @@ -716,7 +728,7 @@ func (tm *ttlManager) keepAlive(c *twoPhaseCommitter) { return } bo := NewBackofferWithVars(context.Background(), pessimisticLockMaxBackoff, c.txn.vars) - now, err := c.store.GetOracle().GetTimestamp(bo.ctx) + now, err := c.store.GetOracle().GetTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) if err != nil { err1 := bo.Backoff(BoPDRPC, err) if err1 != nil { @@ -728,13 +740,13 @@ func (tm *ttlManager) keepAlive(c *twoPhaseCommitter) { } uptime := uint64(oracle.ExtractPhysical(now) - oracle.ExtractPhysical(c.startTS)) - if uptime > config.GetGlobalConfig().Performance.MaxTxnTTL { + if uptime > config.GetGlobalConfig().MaxTxnTTL { // Checks maximum lifetime for the ttlManager, so when something goes wrong // the key will not be locked forever. logutil.Logger(bo.ctx).Info("ttlManager live up to its lifetime", zap.Uint64("txnStartTS", c.startTS), zap.Uint64("uptime", uptime), - zap.Uint64("maxTxnTTL", config.GetGlobalConfig().Performance.MaxTxnTTL)) + zap.Uint64("maxTxnTTL", config.GetGlobalConfig().MaxTxnTTL)) metrics.TiKVTTLLifeTimeReachCounter.Inc() // the pessimistic locks may expire if the ttl manager has timed out, set `LockExpired` flag // so that this transaction could only commit or rollback with no more statement executions @@ -750,18 +762,18 @@ func (tm *ttlManager) keepAlive(c *twoPhaseCommitter) { startTime := time.Now() _, err = sendTxnHeartBeat(bo, c.store, c.primary(), c.startTS, newTTL) if err != nil { - tiKVTxnHeartBeatHistogramError.Observe(time.Since(startTime).Seconds()) + metrics.TxnHeartBeatHistogramError.Observe(time.Since(startTime).Seconds()) logutil.Logger(bo.ctx).Warn("send TxnHeartBeat failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) return } - tiKVTxnHeartBeatHistogramOK.Observe(time.Since(startTime).Seconds()) + metrics.TxnHeartBeatHistogramOK.Observe(time.Since(startTime).Seconds()) } } } -func sendTxnHeartBeat(bo *Backoffer, store *tikvStore, primary []byte, startTS, ttl uint64) (uint64, error) { +func sendTxnHeartBeat(bo *Backoffer, store *KVStore, primary []byte, startTS, ttl uint64) (uint64, error) { req := tikvrpc.NewRequest(tikvrpc.CmdTxnHeartBeat, &pb.TxnHeartBeatRequest{ PrimaryLock: primary, StartVersion: startTS, @@ -792,7 +804,7 @@ func sendTxnHeartBeat(bo *Backoffer, store *tikvStore, primary []byte, startTS, } cmdResp := resp.Resp.(*pb.TxnHeartBeatResponse) if keyErr := cmdResp.GetError(); keyErr != nil { - return 0, errors.Errorf("txn %d heartbeat fail, primary key = %v, err = %s", startTS, primary, keyErr.Abort) + return 0, errors.Errorf("txn %d heartbeat fail, primary key = %v, err = %s", startTS, hex.EncodeToString(primary), extractKeyErr(keyErr)) } return cmdResp.GetLockTtl(), nil } @@ -800,15 +812,23 @@ func sendTxnHeartBeat(bo *Backoffer, store *tikvStore, primary []byte, startTS, // checkAsyncCommit checks if async commit protocol is available for current transaction commit, true is returned if possible. func (c *twoPhaseCommitter) checkAsyncCommit() bool { + // Disable async commit in local transactions + txnScopeOption := c.txn.us.GetOption(kv.TxnScope) + if txnScopeOption == nil || txnScopeOption.(string) != oracle.GlobalTxnScope { + return false + } + + enableAsyncCommitOption := c.txn.us.GetOption(kv.EnableAsyncCommit) + enableAsyncCommit := enableAsyncCommitOption != nil && enableAsyncCommitOption.(bool) asyncCommitCfg := config.GetGlobalConfig().TiKVClient.AsyncCommit // TODO the keys limit need more tests, this value makes the unit test pass by now. // Async commit is not compatible with Binlog because of the non unique timestamp issue. - if c.connID > 0 && asyncCommitCfg.Enable && - uint(len(c.mutations.keys)) <= asyncCommitCfg.KeysLimit && + if c.sessionID > 0 && enableAsyncCommit && + uint(c.mutations.Len()) <= asyncCommitCfg.KeysLimit && !c.shouldWriteBinlog() { totalKeySize := uint64(0) - for _, key := range c.mutations.keys { - totalKeySize += uint64(len(key)) + for i := 0; i < c.mutations.Len(); i++ { + totalKeySize += uint64(len(c.mutations.GetKey(i))) if totalKeySize > asyncCommitCfg.TotalKeySizeLimit { return false } @@ -818,6 +838,24 @@ func (c *twoPhaseCommitter) checkAsyncCommit() bool { return false } +// checkOnePC checks if 1PC protocol is available for current transaction. +func (c *twoPhaseCommitter) checkOnePC() bool { + // Disable 1PC in local transactions + txnScopeOption := c.txn.us.GetOption(kv.TxnScope) + if txnScopeOption == nil || txnScopeOption.(string) != oracle.GlobalTxnScope { + return false + } + + enable1PCOption := c.txn.us.GetOption(kv.Enable1PC) + return c.sessionID > 0 && !c.shouldWriteBinlog() && enable1PCOption != nil && enable1PCOption.(bool) +} + +func (c *twoPhaseCommitter) needLinearizability() bool { + GuaranteeLinearizabilityOption := c.txn.us.GetOption(kv.GuaranteeLinearizability) + // by default, guarantee + return GuaranteeLinearizabilityOption == nil || GuaranteeLinearizabilityOption.(bool) +} + func (c *twoPhaseCommitter) isAsyncCommit() bool { return atomic.LoadUint32(&c.useAsyncCommit) > 0 } @@ -830,13 +868,40 @@ func (c *twoPhaseCommitter) setAsyncCommit(val bool) { } } +func (c *twoPhaseCommitter) isOnePC() bool { + return atomic.LoadUint32(&c.useOnePC) > 0 +} + +func (c *twoPhaseCommitter) setOnePC(val bool) { + if val { + atomic.StoreUint32(&c.useOnePC, 1) + } else { + atomic.StoreUint32(&c.useOnePC, 0) + } +} + +func (c *twoPhaseCommitter) checkOnePCFallBack(action twoPhaseCommitAction, batchCount int) { + if _, ok := action.(actionPrewrite); ok { + if batchCount > 1 { + c.setOnePC(false) + } + } +} + func (c *twoPhaseCommitter) cleanup(ctx context.Context) { c.cleanWg.Add(1) go func() { - cleanupKeysCtx := context.WithValue(context.Background(), txnStartKey, ctx.Value(txnStartKey)) + failpoint.Inject("commitFailedSkipCleanup", func() { + logutil.Logger(ctx).Info("[failpoint] injected skip cleanup secondaries on failure", + zap.Uint64("txnStartTS", c.startTS)) + c.cleanWg.Done() + failpoint.Return() + }) + + cleanupKeysCtx := context.WithValue(context.Background(), TxnStartKey, ctx.Value(TxnStartKey)) err := c.cleanupMutations(NewBackofferWithVars(cleanupKeysCtx, cleanupMaxBackoff, c.txn.vars), c.mutations) if err != nil { - tikvSecondaryLockCleanupFailureCounterRollback.Inc() + metrics.SecondaryLockCleanupFailureCounterRollback.Inc() logutil.Logger(ctx).Info("2PC cleanup failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) @@ -852,7 +917,24 @@ func (c *twoPhaseCommitter) cleanup(ctx context.Context) { func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { var binlogSkipped bool defer func() { - if !c.isAsyncCommit() { + if c.isOnePC() { + // The error means the 1PC transaction failed. + if err != nil { + metrics.OnePCTxnCounterError.Inc() + } else { + metrics.OnePCTxnCounterOk.Inc() + } + } else if c.isAsyncCommit() { + // The error means the async commit should not succeed. + if err != nil { + if c.getUndeterminedErr() == nil { + c.cleanup(ctx) + } + metrics.AsyncCommitTxnCounterError.Inc() + } else { + metrics.AsyncCommitTxnCounterOk.Inc() + } + } else { // Always clean up all written keys if the txn does not commit. c.mu.RLock() committed := c.mu.committed @@ -863,33 +945,60 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { } c.txn.commitTS = c.commitTS if binlogSkipped { - binloginfo.RemoveOneSkippedCommitter() - } else { - if err != nil { - c.writeFinishBinlog(ctx, binlog.BinlogType_Rollback, 0) - } else { - c.writeFinishBinlog(ctx, binlog.BinlogType_Commit, int64(c.commitTS)) - } + c.binlog.Skip() + return + } + if !c.shouldWriteBinlog() { + return } - } else { - // The error means the async commit should not succeed. if err != nil { - if c.getUndeterminedErr() == nil { - c.cleanup(ctx) - } - tikvAsyncCommitTxnCounterError.Inc() + c.binlog.Commit(ctx, 0) } else { - tikvAsyncCommitTxnCounterOk.Inc() + c.binlog.Commit(ctx, int64(c.commitTS)) } } }() + commitTSMayBeCalculated := false // Check async commit is available or not. if c.checkAsyncCommit() { + commitTSMayBeCalculated = true c.setAsyncCommit(true) } + // Check if 1PC is enabled. + if c.checkOnePC() { + commitTSMayBeCalculated = true + c.setOnePC(true) + } + // If we want to use async commit or 1PC and also want linearizability across + // all nodes, we have to make sure the commit TS of this transaction is greater + // than the snapshot TS of all existent readers. So we get a new timestamp + // from PD as our MinCommitTS. + if commitTSMayBeCalculated && c.needLinearizability() { + failpoint.Inject("getMinCommitTSFromTSO", nil) + minCommitTS, err := c.store.oracle.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + // If we fail to get a timestamp from PD, we just propagate the failure + // instead of falling back to the normal 2PC because a normal 2PC will + // also be likely to fail due to the same timestamp issue. + if err != nil { + return errors.Trace(err) + } + c.minCommitTS = minCommitTS + } + // Calculate maxCommitTS if necessary + if commitTSMayBeCalculated { + if err = c.calculateMaxCommitTS(ctx); err != nil { + return errors.Trace(err) + } + } + + failpoint.Inject("beforePrewrite", nil) - binlogChan := c.prewriteBinlog(ctx) + c.prewriteStarted = true + var binlogChan <-chan BinlogWriteResult + if c.shouldWriteBinlog() { + binlogChan = c.binlog.Prewrite(ctx, c.primary()) + } prewriteBo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) start := time.Now() err = c.prewriteMutations(prewriteBo, c.mutations) @@ -938,16 +1047,35 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { c.stripNoNeedCommitKeys() var commitTS uint64 + + if c.isOnePC() { + if c.onePCCommitTS == 0 { + err = errors.Errorf("session %d invalid onePCCommitTS for 1PC protocol after prewrite, startTS=%v", c.sessionID, c.startTS) + return errors.Trace(err) + } + c.commitTS = c.onePCCommitTS + c.txn.commitTS = c.commitTS + logutil.Logger(ctx).Debug("1PC protocol is used to commit this txn", + zap.Uint64("startTS", c.startTS), zap.Uint64("commitTS", c.commitTS), + zap.Uint64("session", c.sessionID)) + return nil + } + + if c.onePCCommitTS != 0 { + logutil.Logger(ctx).Fatal("non 1PC transaction committed in 1PC", + zap.Uint64("session", c.sessionID), zap.Uint64("startTS", c.startTS)) + } + if c.isAsyncCommit() { if c.minCommitTS == 0 { - err = errors.Errorf("conn %d invalid minCommitTS for async commit protocol after prewrite, startTS=%v", c.connID, c.startTS) + err = errors.Errorf("session %d invalid minCommitTS for async commit protocol after prewrite, startTS=%v", c.sessionID, c.startTS) return errors.Trace(err) } commitTS = c.minCommitTS } else { start = time.Now() logutil.Event(ctx, "start get commit ts") - commitTS, err = c.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, c.txn.vars)) + commitTS, err = c.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, c.txn.vars), c.txn.GetUnionStore().GetOption(kv.TxnScope).(string)) if err != nil { logutil.Logger(ctx).Warn("2PC get commitTS failed", zap.Error(err), @@ -959,57 +1087,89 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { logutil.SetTag(ctx, "commitTs", commitTS) } - tryAmend := c.isPessimistic && c.connID > 0 && !c.isAsyncCommit() && c.txn.schemaAmender != nil - if !tryAmend { - _, _, err = c.checkSchemaValid(ctx, commitTS, c.txn.txnInfoSchema, false) - if err != nil { - return errors.Trace(err) - } - } else { - relatedSchemaChange, memAmended, err := c.checkSchemaValid(ctx, commitTS, c.txn.txnInfoSchema, true) - if err != nil { - return errors.Trace(err) - } - if memAmended { - // Get new commitTS and check schema valid again. - newCommitTS, err := c.getCommitTS(ctx, commitDetail) + if c.sessionID > 0 { + failpoint.Inject("beforeSchemaCheck", func() { + c.ttlManager.close() + failpoint.Return() + }) + } + + if !c.isAsyncCommit() { + tryAmend := c.isPessimistic && c.sessionID > 0 && c.txn.schemaAmender != nil + if !tryAmend { + _, _, err = c.checkSchemaValid(ctx, commitTS, c.txn.txnInfoSchema, false) if err != nil { return errors.Trace(err) } - // If schema check failed between commitTS and newCommitTs, report schema change error. - _, _, err = c.checkSchemaValid(ctx, newCommitTS, relatedSchemaChange.LatestInfoSchema, false) + } else { + relatedSchemaChange, memAmended, err := c.checkSchemaValid(ctx, commitTS, c.txn.txnInfoSchema, true) if err != nil { return errors.Trace(err) } - commitTS = newCommitTS + if memAmended { + // Get new commitTS and check schema valid again. + newCommitTS, err := c.getCommitTS(ctx, commitDetail) + if err != nil { + return errors.Trace(err) + } + // If schema check failed between commitTS and newCommitTs, report schema change error. + _, _, err = c.checkSchemaValid(ctx, newCommitTS, relatedSchemaChange.LatestInfoSchema, false) + if err != nil { + logutil.Logger(ctx).Info("schema check after amend failed, it means the schema version changed again", + zap.Uint64("startTS", c.startTS), + zap.Uint64("amendTS", c.commitTS), + zap.Int64("amendedSchemaVersion", relatedSchemaChange.LatestInfoSchema.SchemaMetaVersion()), + zap.Uint64("newCommitTS", newCommitTS)) + return errors.Trace(err) + } + commitTS = newCommitTS + } } } - c.commitTS = commitTS + atomic.StoreUint64(&c.commitTS, commitTS) - if c.store.oracle.IsExpired(c.startTS, kv.MaxTxnTimeUse) { - err = errors.Errorf("conn %d txn takes too much time, txnStartTS: %d, comm: %d", - c.connID, c.startTS, c.commitTS) + if c.store.oracle.IsExpired(c.startTS, kv.MaxTxnTimeUse, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) { + err = errors.Errorf("session %d txn takes too much time, txnStartTS: %d, comm: %d", + c.sessionID, c.startTS, c.commitTS) return err } - if c.connID > 0 { - failpoint.Inject("beforeCommit", func() {}) + if c.sessionID > 0 { + failpoint.Inject("beforeCommit", func(val failpoint.Value) { + // Pass multiple instructions in one string, delimited by commas, to trigger multiple behaviors, like + // `return("delay,fail")`. Then they will be executed sequentially at once. + if v, ok := val.(string); ok { + for _, action := range strings.Split(v, ",") { + // Async commit transactions cannot return error here, since it's already successful. + if action == "fail" && !c.isAsyncCommit() { + logutil.Logger(ctx).Info("[failpoint] injected failure before commit", zap.Uint64("txnStartTS", c.startTS)) + failpoint.Return(errors.New("injected failure before commit")) + } else if action == "delay" { + duration := time.Duration(rand.Int63n(int64(time.Second) * 5)) + logutil.Logger(ctx).Info("[failpoint] injected delay before commit", + zap.Uint64("txnStartTS", c.startTS), zap.Duration("duration", duration)) + time.Sleep(duration) + } + } + } + }) } if c.isAsyncCommit() { // For async commit protocol, the commit is considered success here. c.txn.commitTS = c.commitTS - logutil.Logger(ctx).Info("2PC will use async commit protocol to commit this txn", zap.Uint64("startTS", c.startTS), - zap.Uint64("commitTS", c.commitTS)) + logutil.Logger(ctx).Debug("2PC will use async commit protocol to commit this txn", + zap.Uint64("startTS", c.startTS), zap.Uint64("commitTS", c.commitTS), + zap.Uint64("sessionID", c.sessionID)) go func() { + defer c.ttlManager.close() failpoint.Inject("asyncCommitDoNothing", func() { failpoint.Return() }) - defer c.ttlManager.close() commitBo := NewBackofferWithVars(ctx, int(atomic.LoadUint64(&CommitMaxBackoff)), c.txn.vars) err := c.commitMutations(commitBo, c.mutations) if err != nil { - logutil.Logger(ctx).Warn("2PC async commit failed", zap.Uint64("connID", c.connID), + logutil.Logger(ctx).Warn("2PC async commit failed", zap.Uint64("sessionID", c.sessionID), zap.Uint64("startTS", c.startTS), zap.Uint64("commitTS", c.commitTS), zap.Error(err)) } }() @@ -1019,7 +1179,6 @@ func (c *twoPhaseCommitter) execute(ctx context.Context) (err error) { } func (c *twoPhaseCommitter) commitTxn(ctx context.Context, commitDetail *execdetails.CommitDetails) error { - c.mutations.values = nil c.txn.GetMemBuffer().DiscardValues() start := time.Now() @@ -1057,27 +1216,18 @@ func (c *twoPhaseCommitter) stripNoNeedCommitKeys() { if !c.hasNoNeedCommitKeys { return } - m := &c.mutations + m := c.mutations var newIdx int - for oldIdx := range m.keys { - key := m.keys[oldIdx] + for oldIdx := range m.handles { + key := m.GetKey(oldIdx) flags, err := c.txn.GetMemBuffer().GetFlags(key) if err == nil && flags.HasPrewriteOnly() { continue } - m.keys[newIdx] = key - if m.ops != nil { - m.ops[newIdx] = m.ops[oldIdx] - } - if m.values != nil { - m.values[newIdx] = m.values[oldIdx] - } - if m.isPessimisticLock != nil { - m.isPessimisticLock[newIdx] = m.isPessimisticLock[oldIdx] - } + m.handles[newIdx] = m.handles[oldIdx] newIdx++ } - c.mutations = m.subRange(0, newIdx) + c.mutations.handles = c.mutations.handles[:newIdx] } // SchemaVer is the infoSchema which will return the schema version. @@ -1100,21 +1250,100 @@ type RelatedSchemaChange struct { Amendable bool } +func (c *twoPhaseCommitter) amendPessimisticLock(ctx context.Context, addMutations CommitterMutations) error { + keysNeedToLock := NewPlainMutations(addMutations.Len()) + for i := 0; i < addMutations.Len(); i++ { + if addMutations.IsPessimisticLock(i) { + keysNeedToLock.Push(addMutations.GetOp(i), addMutations.GetKey(i), addMutations.GetValue(i), addMutations.IsPessimisticLock(i)) + } + } + // For unique index amend, we need to pessimistic lock the generated new index keys first. + // Set doingAmend to true to force the pessimistic lock do the exist check for these keys. + c.doingAmend = true + defer func() { c.doingAmend = false }() + if keysNeedToLock.Len() > 0 { + lCtx := &kv.LockCtx{ + Killed: c.lockCtx.Killed, + ForUpdateTS: c.forUpdateTS, + LockWaitTime: c.lockCtx.LockWaitTime, + WaitStartTime: time.Now(), + } + tryTimes := uint(0) + retryLimit := config.GetGlobalConfig().PessimisticTxn.MaxRetryCount + var err error + for tryTimes < retryLimit { + pessimisticLockBo := NewBackofferWithVars(ctx, pessimisticLockMaxBackoff, c.txn.vars) + err = c.pessimisticLockMutations(pessimisticLockBo, lCtx, &keysNeedToLock) + if err != nil { + // KeysNeedToLock won't change, so don't async rollback pessimistic locks here for write conflict. + if terror.ErrorEqual(kv.ErrWriteConflict, err) { + newForUpdateTSVer, err := c.store.CurrentTimestamp(oracle.GlobalTxnScope) + if err != nil { + return errors.Trace(err) + } + lCtx.ForUpdateTS = newForUpdateTSVer + c.forUpdateTS = newForUpdateTSVer + logutil.Logger(ctx).Info("amend pessimistic lock pessimistic retry lock", + zap.Uint("tryTimes", tryTimes), zap.Uint64("startTS", c.startTS), + zap.Uint64("newForUpdateTS", c.forUpdateTS)) + tryTimes++ + continue + } + logutil.Logger(ctx).Warn("amend pessimistic lock has failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) + return err + } + logutil.Logger(ctx).Info("amend pessimistic lock finished", zap.Uint64("startTS", c.startTS), + zap.Uint64("forUpdateTS", c.forUpdateTS), zap.Int("keys", keysNeedToLock.Len())) + break + } + if err != nil { + logutil.Logger(ctx).Warn("amend pessimistic lock failed after retry", + zap.Uint("tryTimes", tryTimes), zap.Uint64("startTS", c.startTS)) + return err + } + } + return nil +} + func (c *twoPhaseCommitter) tryAmendTxn(ctx context.Context, startInfoSchema SchemaVer, change *RelatedSchemaChange) (bool, error) { addMutations, err := c.txn.schemaAmender.AmendTxn(ctx, startInfoSchema, change, c.mutations) if err != nil { return false, err } - // Prewrite new mutations. - if addMutations != nil && len(addMutations.keys) > 0 { - prewriteBo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) - err = c.prewriteMutations(prewriteBo, *addMutations) + // Add new mutations to the mutation list or prewrite them if prewrite already starts. + if addMutations != nil && addMutations.Len() > 0 { + err = c.amendPessimisticLock(ctx, addMutations) if err != nil { - logutil.Logger(ctx).Warn("amend prewrite has failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) + logutil.Logger(ctx).Info("amendPessimisticLock has failed", zap.Error(err)) return false, err } - logutil.Logger(ctx).Info("amend prewrite finished", zap.Uint64("txnStartTS", c.startTS)) - return true, nil + if c.prewriteStarted { + prewriteBo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) + err = c.prewriteMutations(prewriteBo, addMutations) + if err != nil { + logutil.Logger(ctx).Warn("amend prewrite has failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) + return false, err + } + logutil.Logger(ctx).Info("amend prewrite finished", zap.Uint64("txnStartTS", c.startTS)) + return true, nil + } + memBuf := c.txn.GetMemBuffer() + for i := 0; i < addMutations.Len(); i++ { + key := addMutations.GetKey(i) + op := addMutations.GetOp(i) + var err error + if op == pb.Op_Del { + err = memBuf.Delete(key) + } else { + err = memBuf.Set(key, addMutations.GetValue(i)) + } + if err != nil { + logutil.Logger(ctx).Warn("amend mutations has failed", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) + return false, err + } + handle := c.txn.GetMemBuffer().IterWithFlags(key, nil).Handle() + c.mutations.Push(op, addMutations.IsPessimisticLock(i), handle) + } } return false, nil } @@ -1122,7 +1351,7 @@ func (c *twoPhaseCommitter) tryAmendTxn(ctx context.Context, startInfoSchema Sch func (c *twoPhaseCommitter) getCommitTS(ctx context.Context, commitDetail *execdetails.CommitDetails) (uint64, error) { start := time.Now() logutil.Event(ctx, "start get commit ts") - commitTS, err := c.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, c.txn.vars)) + commitTS, err := c.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, c.txn.vars), c.txn.GetUnionStore().GetOption(kv.TxnScope).(string)) if err != nil { logutil.Logger(ctx).Warn("2PC get commitTS failed", zap.Error(err), @@ -1135,8 +1364,8 @@ func (c *twoPhaseCommitter) getCommitTS(ctx context.Context, commitDetail *execd // Check commitTS. if commitTS <= c.startTS { - err = errors.Errorf("conn %d invalid transaction tso with txnStartTS=%v while txnCommitTS=%v", - c.connID, c.startTS, commitTS) + err = errors.Errorf("session %d invalid transaction tso with txnStartTS=%v while txnCommitTS=%v", + c.sessionID, c.startTS, commitTS) logutil.BgLogger().Error("invalid transaction", zap.Error(err)) return 0, errors.Trace(err) } @@ -1149,9 +1378,9 @@ func (c *twoPhaseCommitter) checkSchemaValid(ctx context.Context, checkTS uint64 tryAmend bool) (*RelatedSchemaChange, bool, error) { checker, ok := c.txn.us.GetOption(kv.SchemaChecker).(schemaLeaseChecker) if !ok { - if c.connID > 0 { + if c.sessionID > 0 { logutil.Logger(ctx).Warn("schemaLeaseChecker is not set for this transaction", - zap.Uint64("connID", c.connID), + zap.Uint64("sessionID", c.sessionID), zap.Uint64("startTS", c.startTS), zap.Uint64("commitTS", checkTS)) } @@ -1162,12 +1391,12 @@ func (c *twoPhaseCommitter) checkSchemaValid(ctx context.Context, checkTS uint64 if tryAmend && relatedChanges != nil && relatedChanges.Amendable && c.txn.schemaAmender != nil { memAmended, amendErr := c.tryAmendTxn(ctx, startInfoSchema, relatedChanges) if amendErr != nil { - logutil.BgLogger().Info("txn amend has failed", zap.Uint64("connID", c.connID), + logutil.BgLogger().Info("txn amend has failed", zap.Uint64("sessionID", c.sessionID), zap.Uint64("startTS", c.startTS), zap.Error(amendErr)) return nil, false, err } - logutil.Logger(ctx).Info("amend txn successfully for pessimistic commit", - zap.Uint64("connID", c.connID), zap.Uint64("txn startTS", c.startTS), zap.Bool("memAmended", memAmended), + logutil.Logger(ctx).Info("amend txn successfully", + zap.Uint64("sessionID", c.sessionID), zap.Uint64("txn startTS", c.startTS), zap.Bool("memAmended", memAmended), zap.Uint64("checkTS", checkTS), zap.Int64("startInfoSchemaVer", startInfoSchema.SchemaMetaVersion()), zap.Int64s("table ids", relatedChanges.PhyTblIDS), zap.Uint64s("action types", relatedChanges.ActionTypes)) return relatedChanges, memAmended, nil @@ -1177,63 +1406,27 @@ func (c *twoPhaseCommitter) checkSchemaValid(ctx context.Context, checkTS uint64 return nil, false, nil } -func (c *twoPhaseCommitter) prewriteBinlog(ctx context.Context) chan *binloginfo.WriteResult { - if !c.shouldWriteBinlog() { - return nil +func (c *twoPhaseCommitter) calculateMaxCommitTS(ctx context.Context) error { + // Amend txn with current time first, then we can make sure we have another SafeWindow time to commit + currentTS := oracle.EncodeTSO(int64(time.Since(c.txn.startTime)/time.Millisecond)) + c.startTS + _, _, err := c.checkSchemaValid(ctx, currentTS, c.txn.txnInfoSchema, true) + if err != nil { + logutil.Logger(ctx).Error("Schema changed for async commit txn", + zap.Error(err), + zap.Uint64("startTS", c.startTS)) + return errors.Trace(err) } - ch := make(chan *binloginfo.WriteResult, 1) - go func() { - logutil.Eventf(ctx, "start prewrite binlog") - binInfo := c.txn.us.GetOption(kv.BinlogInfo).(*binloginfo.BinlogInfo) - bin := binInfo.Data - bin.StartTs = int64(c.startTS) - if bin.Tp == binlog.BinlogType_Prewrite { - bin.PrewriteKey = c.primary() - } - wr := binInfo.WriteBinlog(c.store.clusterID) - if wr.Skipped() { - binInfo.Data.PrewriteValue = nil - binloginfo.AddOneSkippedCommitter() - } - logutil.Eventf(ctx, "finish prewrite binlog") - ch <- wr - }() - return ch -} -func (c *twoPhaseCommitter) writeFinishBinlog(ctx context.Context, tp binlog.BinlogType, commitTS int64) { - if !c.shouldWriteBinlog() { - return - } - binInfo := c.txn.us.GetOption(kv.BinlogInfo).(*binloginfo.BinlogInfo) - binInfo.Data.Tp = tp - binInfo.Data.CommitTs = commitTS - binInfo.Data.PrewriteValue = nil - - wg := sync.WaitGroup{} - mock := false - failpoint.Inject("mockSyncBinlogCommit", func(val failpoint.Value) { - if val.(bool) { - wg.Add(1) - mock = true - } - }) - go func() { - logutil.Eventf(ctx, "start write finish binlog") - binlogWriteResult := binInfo.WriteBinlog(c.store.clusterID) - err := binlogWriteResult.GetError() - if err != nil { - logutil.BgLogger().Error("failed to write binlog", - zap.Error(err)) - } - logutil.Eventf(ctx, "finish write finish binlog") - if mock { - wg.Done() - } - }() - if mock { - wg.Wait() - } + safeWindow := config.GetGlobalConfig().TiKVClient.AsyncCommit.SafeWindow + maxCommitTS := oracle.EncodeTSO(int64(safeWindow/time.Millisecond)) + currentTS + logutil.BgLogger().Debug("calculate MaxCommitTS", + zap.Time("startTime", c.txn.startTime), + zap.Duration("safeWindow", safeWindow), + zap.Uint64("startTS", c.startTS), + zap.Uint64("maxCommitTS", maxCommitTS)) + + c.maxCommitTS = maxCommitTS + return nil } func (c *twoPhaseCommitter) shouldWriteBinlog() bool { @@ -1265,15 +1458,17 @@ func newBatched(primaryKey []byte) *batched { // appendBatchMutationsBySize appends mutations to b. It may split the keys to make // sure each batch's size does not exceed the limit. func (b *batched) appendBatchMutationsBySize(region RegionVerID, mutations CommitterMutations, sizeFn func(k, v []byte) int, limit int) { + failpoint.Inject("twoPCRequestBatchSizeLimit", func() { + limit = 1 + }) + var start, end int - for start = 0; start < mutations.len(); start = end { + for start = 0; start < mutations.Len(); start = end { var size int - for end = start; end < mutations.len() && size < limit; end++ { + for end = start; end < mutations.Len() && size < limit; end++ { var k, v []byte - k = mutations.keys[end] - if end < len(mutations.values) { - v = mutations.values[end] - } + k = mutations.GetKey(end) + v = mutations.GetValue(end) size += sizeFn(k, v) if b.primaryIdx < 0 && bytes.Equal(k, b.primaryKey) { b.primaryIdx = len(b.batches) @@ -1281,7 +1476,7 @@ func (b *batched) appendBatchMutationsBySize(region RegionVerID, mutations Commi } b.batches = append(b.batches, batchMutations{ region: region, - mutations: mutations.subRange(start, end), + mutations: mutations.Slice(start, end), }) } } @@ -1320,7 +1515,7 @@ func (b *batched) forgetPrimary() { // batchExecutor is txn controller providing rate control like utils type batchExecutor struct { rateLim int // concurrent worker numbers - rateLimiter *rateLimit // rate limiter for concurrency control, maybe more strategies + rateLimiter *util.RateLimit // rate limiter for concurrency control, maybe more strategies committer *twoPhaseCommitter // here maybe more different type committer in the future action twoPhaseCommitAction // the work action type backoffer *Backoffer // Backoffer @@ -1337,7 +1532,7 @@ func newBatchExecutor(rateLimit int, committer *twoPhaseCommitter, // initUtils do initialize batchExecutor related policies like rateLimit util func (batchExe *batchExecutor) initUtils() error { // init rateLimiter by injected rate limit number - batchExe.rateLimiter = newRateLimit(batchExe.rateLim) + batchExe.rateLimiter = util.NewRateLimit(batchExe.rateLim) return nil } @@ -1345,11 +1540,11 @@ func (batchExe *batchExecutor) initUtils() error { func (batchExe *batchExecutor) startWorker(exitCh chan struct{}, ch chan error, batches []batchMutations) { for idx, batch1 := range batches { waitStart := time.Now() - if exit := batchExe.rateLimiter.getToken(exitCh); !exit { + if exit := batchExe.rateLimiter.GetToken(exitCh); !exit { batchExe.tokenWaitDuration += time.Since(waitStart) batch := batch1 go func() { - defer batchExe.rateLimiter.putToken() + defer batchExe.rateLimiter.PutToken() var singleBatchBackoffer *Backoffer if _, ok := batchExe.action.(actionCommit); ok { // Because the secondary batches of the commit actions are implemented to be @@ -1396,10 +1591,9 @@ func (batchExe *batchExecutor) process(batches []batchMutations) error { } // For prewrite, stop sending other requests after receiving first error. - backoffer := batchExe.backoffer var cancel context.CancelFunc if _, ok := batchExe.action.(actionPrewrite); ok { - backoffer, cancel = batchExe.backoffer.Fork() + batchExe.backoffer, cancel = batchExe.backoffer.Fork() defer cancel() } // concurrently do the work for each batch. @@ -1409,17 +1603,18 @@ func (batchExe *batchExecutor) process(batches []batchMutations) error { // check results for i := 0; i < len(batches); i++ { if e := <-ch; e != nil { - logutil.Logger(backoffer.ctx).Debug("2PC doActionOnBatch failed", - zap.Uint64("conn", batchExe.committer.connID), + logutil.Logger(batchExe.backoffer.ctx).Debug("2PC doActionOnBatch failed", + zap.Uint64("session", batchExe.committer.sessionID), zap.Stringer("action type", batchExe.action), zap.Error(e), zap.Uint64("txnStartTS", batchExe.committer.startTS)) // Cancel other requests and return the first error. if cancel != nil { - logutil.Logger(backoffer.ctx).Debug("2PC doActionOnBatch to cancel other actions", - zap.Uint64("conn", batchExe.committer.connID), + logutil.Logger(batchExe.backoffer.ctx).Debug("2PC doActionOnBatch to cancel other actions", + zap.Uint64("session", batchExe.committer.sessionID), zap.Stringer("action type", batchExe.action), zap.Uint64("txnStartTS", batchExe.committer.startTS)) + atomic.StoreUint32(&batchExe.committer.prewriteCancelled, 1) cancel() } if err == nil { @@ -1432,21 +1627,22 @@ func (batchExe *batchExecutor) process(batches []batchMutations) error { return err } -func getTxnPriority(txn *tikvTxn) pb.CommandPri { +func getTxnPriority(txn *KVTxn) pb.CommandPri { if pri := txn.us.GetOption(kv.Priority); pri != nil { - return kvPriorityToCommandPri(pri.(int)) + return PriorityToPB(pri.(int)) } return pb.CommandPri_Normal } -func getTxnSyncLog(txn *tikvTxn) bool { +func getTxnSyncLog(txn *KVTxn) bool { if syncOption := txn.us.GetOption(kv.SyncLog); syncOption != nil { return syncOption.(bool) } return false } -func kvPriorityToCommandPri(pri int) pb.CommandPri { +// PriorityToPB converts priority type to wire type. +func PriorityToPB(pri int) pb.CommandPri { switch pri { case kv.PriorityLow: return pb.CommandPri_Low diff --git a/store/tikv/2pc_fail_test.go b/store/tikv/2pc_fail_test.go index fc7e02287c120..1ceb40d23f78d 100644 --- a/store/tikv/2pc_fail_test.go +++ b/store/tikv/2pc_fail_test.go @@ -21,7 +21,6 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/util/israce" ) // TestFailCommitPrimaryRpcErrors tests rpc errors are handled properly when @@ -117,30 +116,3 @@ func (s *testCommitterSuite) TestFailCommitTimeout(c *C) { c.Assert(err, IsNil) c.Assert(len(value), Greater, 0) } - -// TestFailPrewriteRegionError tests data race does not happen on retries -func (s *testCommitterSuite) TestFailPrewriteRegionError(c *C) { - if israce.RaceEnabled { - c.Skip("skip race test") - } - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/mocktikv/rpcPrewriteResult", `return("notLeader")`), IsNil) - defer func() { - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/mocktikv/rpcPrewriteResult"), IsNil) - }() - - txn := s.begin(c) - - // Set the value big enough to create many batches. This increases the chance of data races. - var bigVal [18000]byte - for i := 0; i < 1000; i++ { - err := txn.Set([]byte{byte(i)}, bigVal[:]) - c.Assert(err, IsNil) - } - - committer, err := newTwoPhaseCommitterWithInit(txn, 1) - c.Assert(err, IsNil) - - ctx := context.Background() - err = committer.prewriteMutations(NewBackofferWithVars(ctx, 1000, nil), committer.mutations) - c.Assert(err, NotNil) -} diff --git a/store/tikv/2pc_test.go b/store/tikv/2pc_test.go index 8bbb53225a0f2..4d33968e75cba 100644 --- a/store/tikv/2pc_test.go +++ b/store/tikv/2pc_test.go @@ -28,18 +28,20 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/config" + pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/tablecodec" ) type testCommitterSuite struct { OneByOneSuite cluster cluster.Cluster - store *tikvStore + store *KVStore } var _ = SerialSuites(&testCommitterSuite{}) @@ -57,9 +59,9 @@ func (s *testCommitterSuite) SetUpTest(c *C) { mocktikv.BootstrapWithMultiRegions(cluster, []byte("a"), []byte("b"), []byte("c")) s.cluster = cluster client := mocktikv.NewRPCClient(cluster, mvccStore) - pdCli := &codecPDClient{mocktikv.NewPDClient(cluster)} + pdCli := &CodecPDClient{mocktikv.NewPDClient(cluster)} spkv := NewMockSafePointKV() - store, err := newTikvStore("mocktikv-store", pdCli, spkv, client, false, nil) + store, err := NewKVStore("mocktikv-store", pdCli, spkv, client) store.EnableTxnLocalLatches(1024000) c.Assert(err, IsNil) @@ -86,10 +88,17 @@ func (s *testCommitterSuite) TearDownSuite(c *C) { s.OneByOneSuite.TearDownSuite(c) } -func (s *testCommitterSuite) begin(c *C) *tikvTxn { +func (s *testCommitterSuite) begin(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn +} + +func (s *testCommitterSuite) beginAsyncCommit(c *C) *KVTxn { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + txn.SetOption(kv.EnableAsyncCommit, true) + return txn } func (s *testCommitterSuite) checkValues(c *C, m map[string]string) { @@ -226,9 +235,9 @@ func (s *testCommitterSuite) TestPrewriteRollback(c *C) { err = committer.prewriteMutations(NewBackofferWithVars(ctx, PrewriteMaxBackoff, nil), committer.mutations) c.Assert(err, IsNil) } - committer.commitTS, err = s.store.oracle.GetTimestamp(ctx) + committer.commitTS, err = s.store.oracle.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) - err = committer.commitMutations(NewBackofferWithVars(ctx, int(atomic.LoadUint64(&CommitMaxBackoff)), nil), CommitterMutations{keys: [][]byte{[]byte("a")}}) + err = committer.commitMutations(NewBackofferWithVars(ctx, int(atomic.LoadUint64(&CommitMaxBackoff)), nil), &PlainMutations{keys: [][]byte{[]byte("a")}}) c.Assert(err, IsNil) txn3 := s.begin(c) @@ -296,6 +305,27 @@ func (s *testCommitterSuite) TestContextCancelRetryable(c *C) { c.Assert(kv.ErrWriteConflictInTiDB.Equal(err), IsTrue, Commentf("err: %s", err)) } +func (s *testCommitterSuite) TestContextCancelCausingUndetermined(c *C) { + // For a normal transaction, if RPC returns context.Canceled error while sending commit + // requests, the transaction should go to the undetermined state. + txn := s.begin(c) + err := txn.Set([]byte("a"), []byte("va")) + c.Assert(err, IsNil) + committer, err := newTwoPhaseCommitterWithInit(txn, 0) + c.Assert(err, IsNil) + committer.prewriteMutations(NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil), committer.mutations) + c.Assert(err, IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/rpcContextCancelErr", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/rpcContextCancelErr"), IsNil) + }() + + err = committer.commitMutations(NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil), committer.mutations) + c.Assert(committer.mu.undeterminedErr, NotNil) + c.Assert(errors.Cause(err), Equals, context.Canceled) +} + func (s *testCommitterSuite) mustGetRegionID(c *C, key []byte) uint64 { loc, err := s.store.regionCache.LocateKey(NewBackofferWithVars(context.Background(), getMaxBackoff, nil), key) c.Assert(err, IsNil) @@ -303,12 +333,12 @@ func (s *testCommitterSuite) mustGetRegionID(c *C, key []byte) uint64 { } func (s *testCommitterSuite) isKeyLocked(c *C, key []byte) bool { - ver, err := s.store.CurrentVersion() + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) c.Assert(err, IsNil) bo := NewBackofferWithVars(context.Background(), getMaxBackoff, nil) req := tikvrpc.NewRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{ Key: key, - Version: ver.Ver, + Version: ver, }) loc, err := s.store.regionCache.LocateKey(bo, key) c.Assert(err, IsNil) @@ -393,8 +423,8 @@ func errMsgMustContain(c *C, err error, msg string) { c.Assert(strings.Contains(err.Error(), msg), IsTrue) } -func newTwoPhaseCommitterWithInit(txn *tikvTxn, connID uint64) (*twoPhaseCommitter, error) { - c, err := newTwoPhaseCommitter(txn, connID) +func newTwoPhaseCommitterWithInit(txn *KVTxn, sessionID uint64) (*twoPhaseCommitter, error) { + c, err := newTwoPhaseCommitter(txn, sessionID) if err != nil { return nil, errors.Trace(err) } @@ -553,9 +583,9 @@ func (s *testCommitterSuite) TestRejectCommitTS(c *C) { c.Assert(err, IsNil) mutations := []*kvrpcpb.Mutation{ { - Op: committer.mutations.ops[0], - Key: committer.mutations.keys[0], - Value: committer.mutations.values[0], + Op: committer.mutations.GetOp(0), + Key: committer.mutations.GetKey(0), + Value: committer.mutations.GetValue(0), }, } prewrite := &kvrpcpb.PrewriteRequest{ @@ -580,12 +610,12 @@ func (s *testCommitterSuite) TestRejectCommitTS(c *C) { // Use max.Uint64 to read the data and success. // That means the final commitTS > startTS+2, it's not the one we provide. // So we cover the rety commitTS logic. - txn1, err := s.store.BeginWithStartTS(committer.startTS + 2) + txn1, err := s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(oracle.GlobalTxnScope).SetStartTs(committer.startTS + 2)) c.Assert(err, IsNil) _, err = txn1.Get(bo.ctx, []byte("x")) c.Assert(kv.IsErrNotFound(err), IsTrue) - txn2, err := s.store.BeginWithStartTS(math.MaxUint64) + txn2, err := s.store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(oracle.GlobalTxnScope).SetStartTs(math.MaxUint64)) c.Assert(err, IsNil) val, err := txn2.Get(bo.ctx, []byte("x")) c.Assert(err, IsNil) @@ -602,7 +632,7 @@ func (s *testCommitterSuite) TestPessimisticPrewriteRequest(c *C) { c.Assert(err, IsNil) committer.forUpdateTS = 100 var batch batchMutations - batch.mutations = committer.mutations.subRange(0, 1) + batch.mutations = committer.mutations.Slice(0, 1) batch.region = RegionVerID{1, 1, 1} req := committer.buildPrewriteRequest(batch, 1) c.Assert(len(req.Prewrite().IsPessimisticLock), Greater, 0) @@ -656,12 +686,12 @@ func (s *testCommitterSuite) TestPessimisticTTL(c *C) { err = txn.LockKeys(context.Background(), lockCtx, key2) c.Assert(err, IsNil) lockInfo := s.getLockInfo(c, key) - msBeforeLockExpired := s.store.GetOracle().UntilExpired(txn.StartTS(), lockInfo.LockTtl) + msBeforeLockExpired := s.store.GetOracle().UntilExpired(txn.StartTS(), lockInfo.LockTtl, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(msBeforeLockExpired, GreaterEqual, int64(100)) lr := newLockResolver(s.store) bo := NewBackofferWithVars(context.Background(), getMaxBackoff, nil) - status, err := lr.getTxnStatus(bo, txn.startTS, key2, 0, txn.startTS, true) + status, err := lr.getTxnStatus(bo, txn.startTS, key2, 0, txn.startTS, true, false, nil) c.Assert(err, IsNil) c.Assert(status.ttl, GreaterEqual, lockInfo.LockTtl) @@ -669,7 +699,7 @@ func (s *testCommitterSuite) TestPessimisticTTL(c *C) { for i := 0; i < 50; i++ { lockInfoNew := s.getLockInfo(c, key) if lockInfoNew.LockTtl > lockInfo.LockTtl { - currentTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx) + currentTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) // Check that the TTL is update to a reasonable range. expire := oracle.ExtractPhysical(txn.startTS) + int64(lockInfoNew.LockTtl) @@ -879,7 +909,7 @@ func (s *testCommitterSuite) getLockInfo(c *C, key []byte) *kvrpcpb.LockInfo { bo := NewBackofferWithVars(context.Background(), getMaxBackoff, nil) loc, err := s.store.regionCache.LocateKey(bo, key) c.Assert(err, IsNil) - batch := batchMutations{region: loc.Region, mutations: committer.mutations.subRange(0, 1)} + batch := batchMutations{region: loc.Region, mutations: committer.mutations.Slice(0, 1)} req := committer.buildPrewriteRequest(batch, 1) resp, err := s.store.SendReq(bo, req, loc.Region, readTimeoutShort) c.Assert(err, IsNil) @@ -894,38 +924,55 @@ func (s *testCommitterSuite) getLockInfo(c *C, key []byte) *kvrpcpb.LockInfo { func (s *testCommitterSuite) TestPkNotFound(c *C) { atomic.StoreUint64(&ManagedLockTTL, 100) // 100ms defer atomic.StoreUint64(&ManagedLockTTL, 3000) // restore default value - // k1 is the primary lock of txn1 + ctx := context.Background() + // k1 is the primary lock of txn1. k1 := kv.Key("k1") - // k2 is a secondary lock of txn1 and a key txn2 wants to lock + // k2 is a secondary lock of txn1 and a key txn2 wants to lock. k2 := kv.Key("k2") k3 := kv.Key("k3") txn1 := s.begin(c) txn1.SetOption(kv.Pessimistic, true) - // lock the primary key + // lock the primary key. lockCtx := &kv.LockCtx{ForUpdateTS: txn1.startTS, WaitStartTime: time.Now()} - err := txn1.LockKeys(context.Background(), lockCtx, k1) + err := txn1.LockKeys(ctx, lockCtx, k1) c.Assert(err, IsNil) - // lock the secondary key + // lock the secondary key. lockCtx = &kv.LockCtx{ForUpdateTS: txn1.startTS, WaitStartTime: time.Now()} - err = txn1.LockKeys(context.Background(), lockCtx, k2) + err = txn1.LockKeys(ctx, lockCtx, k2, k3) c.Assert(err, IsNil) - // Stop txn ttl manager and remove primary key, like tidb server crashes and the priamry key lock does not exists actually, - // while the secondary lock operation succeeded - bo := NewBackofferWithVars(context.Background(), pessimisticLockMaxBackoff, nil) + // while the secondary lock operation succeeded. txn1.committer.ttlManager.close() - err = txn1.committer.pessimisticRollbackMutations(bo, CommitterMutations{keys: [][]byte{k1}}) + + var status TxnStatus + bo := NewBackofferWithVars(ctx, pessimisticLockMaxBackoff, nil) + lockKey2 := &Lock{ + Key: k2, + Primary: k1, + TxnID: txn1.startTS, + TTL: 0, // let the primary lock k1 expire doing check. + TxnSize: txnCommitBatchSize, + LockType: kvrpcpb.Op_PessimisticLock, + LockForUpdateTS: txn1.startTS, + } + status, err = s.store.lockResolver.getTxnStatusFromLock(bo, lockKey2, oracle.GoTimeToTS(time.Now().Add(200*time.Millisecond)), false) c.Assert(err, IsNil) + c.Assert(status.Action(), Equals, kvrpcpb.Action_TTLExpirePessimisticRollback) - // Txn2 tries to lock the secondary key k2, dead loop if the left secondary lock by txn1 not resolved + // Txn2 tries to lock the secondary key k2, there should be no dead loop. + // Since the resolving key k2 is a pessimistic lock, no rollback record should be written, and later lock + // and the other secondary key k3 should succeed if there is no fail point enabled. + status, err = s.store.lockResolver.getTxnStatusFromLock(bo, lockKey2, oracle.GoTimeToTS(time.Now().Add(200*time.Millisecond)), false) + c.Assert(err, IsNil) + c.Assert(status.Action(), Equals, kvrpcpb.Action_LockNotExistDoNothing) txn2 := s.begin(c) txn2.SetOption(kv.Pessimistic, true) lockCtx = &kv.LockCtx{ForUpdateTS: txn2.startTS, WaitStartTime: time.Now()} - err = txn2.LockKeys(context.Background(), lockCtx, k2) + err = txn2.LockKeys(ctx, lockCtx, k2) c.Assert(err, IsNil) - // Using smaller forUpdateTS cannot rollback this lock, other lock will fail + // Pessimistic rollback using smaller forUpdateTS does not take effect. lockKey3 := &Lock{ Key: k3, Primary: k1, @@ -938,17 +985,20 @@ func (s *testCommitterSuite) TestPkNotFound(c *C) { cleanTxns := make(map[RegionVerID]struct{}) err = s.store.lockResolver.resolvePessimisticLock(bo, lockKey3, cleanTxns) c.Assert(err, IsNil) - lockCtx = &kv.LockCtx{ForUpdateTS: txn1.startTS, WaitStartTime: time.Now()} - err = txn1.LockKeys(context.Background(), lockCtx, k3) + err = txn1.LockKeys(ctx, lockCtx, k3) c.Assert(err, IsNil) + + // After disable fail point, the rollbackIfNotExist flag will be set, and the resolve should succeed. In this + // case, the returned action of TxnStatus should be LockNotExistDoNothing, and lock on k3 could be resolved. txn3 := s.begin(c) txn3.SetOption(kv.Pessimistic, true) - lockCtx = &kv.LockCtx{ForUpdateTS: txn1.startTS - 1, WaitStartTime: time.Now(), LockWaitTime: kv.LockNoWait} - c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/txnNotFoundRetTTL", "return"), IsNil) - err = txn3.LockKeys(context.Background(), lockCtx, k3) - c.Assert(err.Error(), Equals, ErrLockAcquireFailAndNoWaitSet.Error()) - c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/txnNotFoundRetTTL"), IsNil) + lockCtx = &kv.LockCtx{ForUpdateTS: txn3.startTS, WaitStartTime: time.Now(), LockWaitTime: kv.LockNoWait} + err = txn3.LockKeys(ctx, lockCtx, k3) + c.Assert(err, IsNil) + status, err = s.store.lockResolver.getTxnStatusFromLock(bo, lockKey3, oracle.GoTimeToTS(time.Now().Add(200*time.Millisecond)), false) + c.Assert(err, IsNil) + c.Assert(status.Action(), Equals, kvrpcpb.Action_LockNotExistDoNothing) } func (s *testCommitterSuite) TestPessimisticLockPrimary(c *C) { @@ -989,16 +1039,39 @@ func (s *testCommitterSuite) TestPessimisticLockPrimary(c *C) { } func (c *twoPhaseCommitter) mutationsOfKeys(keys [][]byte) CommitterMutations { - var res CommitterMutations - for i := range c.mutations.keys { + var res PlainMutations + for i := 0; i < c.mutations.Len(); i++ { for _, key := range keys { - if bytes.Equal(c.mutations.keys[i], key) { - res.Push(c.mutations.ops[i], c.mutations.keys[i], c.mutations.values[i], c.mutations.isPessimisticLock[i]) + if bytes.Equal(c.mutations.GetKey(i), key) { + res.Push(c.mutations.GetOp(i), c.mutations.GetKey(i), c.mutations.GetValue(i), c.mutations.IsPessimisticLock(i)) break } } } - return res + return &res +} + +func (s *testCommitterSuite) TestResolvePessimisticLock(c *C) { + untouchedIndexKey := kv.Key("t00000001_i000000001") + untouchedIndexValue := []byte{0, 0, 0, 0, 0, 0, 0, 1, 49} + noValueIndexKey := kv.Key("t00000001_i000000002") + c.Assert(tablecodec.IsUntouchedIndexKValue(untouchedIndexKey, untouchedIndexValue), IsTrue) + txn := s.begin(c) + err := txn.Set(untouchedIndexKey, untouchedIndexValue) + c.Assert(err, IsNil) + lockCtx := &kv.LockCtx{ForUpdateTS: txn.startTS, WaitStartTime: time.Now(), LockWaitTime: kv.LockNoWait} + err = txn.LockKeys(context.Background(), lockCtx, untouchedIndexKey, noValueIndexKey) + c.Assert(err, IsNil) + commit, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(err, IsNil) + mutation := commit.mutationsOfKeys([][]byte{untouchedIndexKey, noValueIndexKey}) + c.Assert(mutation.Len(), Equals, 2) + c.Assert(mutation.GetOp(0), Equals, pb.Op_Lock) + c.Assert(mutation.GetKey(0), BytesEquals, []byte(untouchedIndexKey)) + c.Assert(mutation.GetValue(0), BytesEquals, untouchedIndexValue) + c.Assert(mutation.GetOp(1), Equals, pb.Op_Lock) + c.Assert(mutation.GetKey(1), BytesEquals, []byte(noValueIndexKey)) + c.Assert(mutation.GetValue(1), BytesEquals, []byte{}) } func (s *testCommitterSuite) TestCommitDeadLock(c *C) { @@ -1070,7 +1143,7 @@ func (s *testCommitterSuite) TestPushPessimisticLock(c *C) { err = txn1.committer.initKeysAndMutations() c.Assert(err, IsNil) // Strip the prewrite of the primary key. - txn1.committer.mutations = txn1.committer.mutations.subRange(1, 2) + txn1.committer.mutations.handles = txn1.committer.mutations.handles[1:2] c.Assert(err, IsNil) err = txn1.committer.prewriteMutations(NewBackofferWithVars(ctx, PrewriteMaxBackoff, nil), txn1.committer.mutations) c.Assert(err, IsNil) @@ -1139,7 +1212,7 @@ func (s *testCommitterSuite) TestResolveMixed(c *C) { // stop txn ttl manager and remove primary key, make the other keys left behind bo := NewBackofferWithVars(context.Background(), pessimisticLockMaxBackoff, nil) txn1.committer.ttlManager.close() - err = txn1.committer.pessimisticRollbackMutations(bo, CommitterMutations{keys: [][]byte{pk}}) + err = txn1.committer.pessimisticRollbackMutations(bo, &PlainMutations{keys: [][]byte{pk}}) c.Assert(err, IsNil) // try to resolve the left optimistic locks, use clean whole region @@ -1166,18 +1239,13 @@ func (s *testCommitterSuite) TestResolveMixed(c *C) { // TestSecondaryKeys tests that when async commit is enabled, each prewrite message includes an // accurate list of secondary keys. func (s *testCommitterSuite) TestPrewriteSecondaryKeys(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true - }) - // Prepare two regions first: (, 100) and [100, ) region, _ := s.cluster.GetRegionByKey([]byte{50}) newRegionID := s.cluster.AllocID() newPeerID := s.cluster.AllocID() s.cluster.Split(region.Id, newRegionID, []byte{100}, []uint64{newPeerID}, newPeerID) - txn := s.begin(c) + txn := s.beginAsyncCommit(c) var val [1024]byte for i := byte(50); i < 120; i++ { err := txn.Set([]byte{i}, val[:]) @@ -1205,17 +1273,12 @@ func (s *testCommitterSuite) TestPrewriteSecondaryKeys(c *C) { } func (s *testCommitterSuite) TestAsyncCommit(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true - }) - ctx := context.Background() pk := kv.Key("tpk") pkVal := []byte("pkVal") k1 := kv.Key("tk1") k1Val := []byte("k1Val") - txn1 := s.begin(c) + txn1 := s.beginAsyncCommit(c) err := txn1.Set(pk, pkVal) c.Assert(err, IsNil) err = txn1.Set(k1, k1Val) @@ -1223,28 +1286,40 @@ func (s *testCommitterSuite) TestAsyncCommit(c *C) { committer, err := newTwoPhaseCommitterWithInit(txn1, 0) c.Assert(err, IsNil) - committer.connID = 1 + committer.sessionID = 1 committer.minCommitTS = txn1.startTS + 10 err = committer.execute(ctx) c.Assert(err, IsNil) - // TODO remove sleep when recovery logic is done - time.Sleep(1 * time.Second) s.checkValues(c, map[string]string{ string(pk): string(pkVal), string(k1): string(k1Val), }) } +func updateGlobalConfig(f func(conf *config.Config)) { + g := config.GetGlobalConfig() + newConf := *g + f(&newConf) + config.StoreGlobalConfig(&newConf) +} + +// restoreFunc gets a function that restore the config to the current value. +func restoreGlobalConfFunc() (restore func()) { + g := config.GetGlobalConfig() + return func() { + config.StoreGlobalConfig(g) + } +} + func (s *testCommitterSuite) TestAsyncCommitCheck(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true + defer restoreGlobalConfFunc()() + updateGlobalConfig(func(conf *config.Config) { conf.TiKVClient.AsyncCommit.KeysLimit = 16 conf.TiKVClient.AsyncCommit.TotalKeySizeLimit = 64 }) - txn := s.begin(c) + txn := s.beginAsyncCommit(c) buf := []byte{0, 0, 0, 0} // Set 16 keys, each key is 4 bytes long. So the total size of keys is 64 bytes. for i := 0; i < 16; i++ { @@ -1257,12 +1332,12 @@ func (s *testCommitterSuite) TestAsyncCommitCheck(c *C) { c.Assert(err, IsNil) c.Assert(committer.checkAsyncCommit(), IsTrue) - config.UpdateGlobal(func(conf *config.Config) { + updateGlobalConfig(func(conf *config.Config) { conf.TiKVClient.AsyncCommit.KeysLimit = 15 }) c.Assert(committer.checkAsyncCommit(), IsFalse) - config.UpdateGlobal(func(conf *config.Config) { + updateGlobalConfig(func(conf *config.Config) { conf.TiKVClient.AsyncCommit.KeysLimit = 20 conf.TiKVClient.AsyncCommit.TotalKeySizeLimit = 63 }) diff --git a/store/tikv/2pc_utils.go b/store/tikv/2pc_utils.go deleted file mode 100644 index 01e1832a75118..0000000000000 --- a/store/tikv/2pc_utils.go +++ /dev/null @@ -1,621 +0,0 @@ -// Copyright 2020 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package tikv - -import ( - "bytes" - "context" - "math" - "sort" - "sync/atomic" - - "github.com/pingcap/errors" - pb "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/util/logutil" - "go.uber.org/zap" -) - -func (c *twoPhaseCommitter) initCommitterStates(ctx context.Context) error { - txn := c.txn - c.isPessimistic = txn.IsPessimistic() - bo := NewBackofferWithVars(ctx, PrewriteMaxBackoff, c.txn.vars) - - // Sanity check for startTS. - if txn.StartTS() == math.MaxUint64 { - err := errors.Errorf("try to commit with invalid txnStartTS: %d", txn.StartTS()) - logutil.BgLogger().Error("commit failed", - zap.Uint64("conn", c.connID), - zap.Error(err)) - return errors.Trace(err) - } - - var ( - firstKey []byte - regionSizeCal regionTxnSizeCalculator - txnDetailsCal txnDetailsCalculator - preSplitCal preSplitCalculator - it = c.mapWithRegion(bo, committerTxnMutations{c, true}.Iter(nil, nil)) - ) - for { - m, err := it.Next() - if err != nil { - return errors.Trace(err) - } - if m.key == nil { - break - } - if firstKey == nil { - firstKey = m.key - } - - if len(c.primaryKey) == 0 && m.op != pb.Op_CheckNotExists { - c.primaryKey = m.key - } - - regionSizeCal.Process(m) - txnDetailsCal.Process(m) - preSplitCal.Process(m) - } - if len(c.primaryKey) == 0 { - c.primaryKey = firstKey - } - - if err := txnDetailsCal.Finish(c); err != nil { - return errors.Trace(err) - } - regionSizeCal.Finish(c) - splitKeys, splitRegions := preSplitCal.Finish() - - if c.txnSize == 0 { - return nil - } - - if c.trySplitRegions(splitKeys, splitRegions) { - if err := c.reCalRegionTxnSize(bo); err != nil { - return err - } - } - - mutationsIt := it.src.(*txnMutationsIter) - c.prewriteOnlyKeys = mutationsIt.prewriteOnlyKeys - c.ignoredKeys = mutationsIt.ignoredKeys - - c.lockTTL = txnLockTTL(txn.startTime, txn.Size()) - c.priority = getTxnPriority(txn) - c.syncLog = getTxnSyncLog(txn) - return nil -} - -type mutation struct { - key []byte - value []byte - isPessimisticLock bool - op pb.Op -} - -type mutationWithRegion struct { - mutation - region RegionVerID -} - -type mutations interface { - Iter(start, end []byte) mutationsIter - Len() int -} - -type mutationsIter interface { - Next() mutation - WithFilter(func([]byte) bool) -} - -type regionTxnSizeCalculator struct { - result map[uint64]int - prevRegion RegionVerID - numKeys int -} - -func (c *regionTxnSizeCalculator) Process(m mutationWithRegion) { - if c.result == nil { - c.result = make(map[uint64]int) - } - if m.region.id != c.prevRegion.id { - if c.prevRegion.id != 0 { - c.result[c.prevRegion.id] = c.numKeys - } - c.prevRegion = m.region - c.numKeys = 0 - } - c.numKeys++ -} - -func (c *regionTxnSizeCalculator) Finish(committer *twoPhaseCommitter) { - if c.prevRegion.id != 0 { - c.result[c.prevRegion.id] = c.numKeys - } - committer.regionTxnSize = c.result - committer.getDetail().PrewriteRegionNum = int32(len(c.result)) -} - -type txnDetailsCalculator struct { - writeKeys int - writeSize int - putCnt int - delCnt int - lockCnt int - checkCnt int -} - -func (c *txnDetailsCalculator) Process(m mutationWithRegion) { - c.writeKeys++ - c.writeSize += len(m.key) + len(m.value) - switch m.op { - case pb.Op_CheckNotExists: - c.checkCnt++ - case pb.Op_Del: - c.delCnt++ - case pb.Op_Put, pb.Op_Insert: - c.putCnt++ - case pb.Op_Lock: - c.lockCnt++ - } -} - -func (c *txnDetailsCalculator) Finish(committer *twoPhaseCommitter) error { - if c.writeSize > int(kv.TxnTotalSizeLimit) { - return kv.ErrTxnTooLarge.GenWithStackByArgs(c.writeSize) - } - - const logEntryCount = 10000 - const logSize = 4 * 1024 * 1024 // 4MB - if c.writeKeys > logEntryCount || c.writeSize > logSize { - tableID := tablecodec.DecodeTableID(committer.primaryKey) - logutil.BgLogger().Info("[BIG_TXN]", - zap.Uint64("con", committer.connID), - zap.Int64("table ID", tableID), - zap.Int("size", c.writeSize), - zap.Int("keys", c.writeKeys), - zap.Int("puts", c.putCnt), - zap.Int("dels", c.delCnt), - zap.Int("locks", c.lockCnt), - zap.Int("checks", c.checkCnt), - zap.Uint64("txnStartTS", committer.txn.startTS)) - } - - committer.txnSize = c.writeSize - details := committer.getDetail() - details.WriteKeys = c.writeKeys - details.WriteSize = c.writeSize - - metrics.TiKVTxnWriteKVCountHistogram.Observe(float64(c.writeKeys)) - metrics.TiKVTxnWriteSizeHistogram.Observe(float64(c.writeSize)) - - return nil -} - -type preSplitCalculator struct { - limit uint32 - size int - splitKeys [][]byte - splitRegions []RegionVerID -} - -func (c *preSplitCalculator) Process(m mutationWithRegion) { - if c.limit == 0 { - c.limit = atomic.LoadUint32(&preSplitSizeThreshold) - } - c.size += len(m.key) + len(m.value) - if uint32(c.size) >= c.limit { - c.splitKeys = append(c.splitKeys, m.key) - if len(c.splitRegions) == 0 || c.splitRegions[len(c.splitRegions)-1] != m.region { - c.splitRegions = append(c.splitRegions, m.region) - } - c.size = 0 - } -} - -func (c *preSplitCalculator) Finish() ([][]byte, []RegionVerID) { - return c.splitKeys, c.splitRegions -} - -func (c *twoPhaseCommitter) trySplitRegions(splitKeys [][]byte, splitRegions []RegionVerID) bool { - if len(splitKeys) == 0 { - return false - } - ctx := context.Background() - regions := make([]uint64, len(splitRegions)) - for i := range regions { - regions[i] = splitRegions[i].id - } - logutil.BgLogger().Info("2PC detect large amount of mutations on some region", zap.Uint64s("regions", regions)) - newRegions, err := c.store.SplitRegions(ctx, splitKeys, true, nil) - if err != nil { - logutil.BgLogger().Warn("2PC split regions failed", zap.Uint64s("regions", regions), zap.Error(err)) - return false - } - - for _, regionID := range newRegions { - err := c.store.WaitScatterRegionFinish(ctx, regionID, 0) - if err != nil { - logutil.BgLogger().Warn("2PC wait scatter region failed", zap.Uint64("regionID", regionID), zap.Error(err)) - } - } - - for _, region := range splitRegions { - c.store.regionCache.InvalidateCachedRegion(region) - } - return true -} - -func (c *twoPhaseCommitter) reCalRegionTxnSize(bo *Backoffer) error { - it := c.mapWithRegion(bo, committerTxnMutations{c, true}.Iter(nil, nil)) - var regionSizeCal regionTxnSizeCalculator - for { - m, err := it.Next() - if err != nil { - return errors.Trace(err) - } - if m.key == nil { - break - } - regionSizeCal.Process(m) - } - regionSizeCal.Finish(c) - return nil -} - -type lockKeysMutations struct { - keys [][]byte -} - -func (m lockKeysMutations) Iter(start, end []byte) mutationsIter { - it := &lockKeysMutationsIter{ - keys: m.keys, - end: end, - } - if len(start) != 0 { - it.idx = sort.Search(len(m.keys), func(i int) bool { - return bytes.Compare(m.keys[i], start) >= 0 - }) - } - return it -} - -func (m lockKeysMutations) Len() int { - return len(m.keys) -} - -type lockKeysMutationsIter struct { - keys [][]byte - idx int - end []byte - keep func([]byte) bool -} - -func (it *lockKeysMutationsIter) Next() mutation { - for ; it.idx < len(it.keys); it.idx++ { - key := it.keys[it.idx] - if it.keep != nil && !it.keep(key) { - continue - } - - if len(it.end) > 0 && bytes.Compare(key, it.end) >= 0 { - return mutation{} - } - - it.idx++ - return mutation{key: key} - } - return mutation{} -} - -func (it *lockKeysMutationsIter) WithFilter(f func([]byte) bool) { - it.keep = f -} - -type staticMutations struct { - mutations CommitterMutations -} - -func (m staticMutations) Iter(start, end []byte) mutationsIter { - it := &staticMutationsIter{ - mutations: m.mutations, - end: end, - } - if len(start) != 0 { - it.idx = sort.Search(len(m.mutations.keys), func(i int) bool { - return bytes.Compare(m.mutations.keys[i], start) >= 0 - }) - } - return it -} - -func (m staticMutations) Len() int { - return m.mutations.len() -} - -type staticMutationsIter struct { - mutations CommitterMutations - idx int - end []byte - keep func([]byte) bool -} - -func (it *staticMutationsIter) Next() mutation { - for ; it.idx < len(it.mutations.keys); it.idx++ { - m := mutation{ - key: it.mutations.keys[it.idx], - } - if len(it.end) > 0 && bytes.Compare(m.key, it.end) >= 0 { - return mutation{} - } - if it.idx < len(it.mutations.values) { - m.value = it.mutations.values[it.idx] - m.op = it.mutations.ops[it.idx] - m.isPessimisticLock = it.mutations.isPessimisticLock[it.idx] - } - if it.keep != nil && !it.keep(m.key) { - continue - } - - it.idx++ - return m - } - return mutation{} -} - -func (it *staticMutationsIter) WithFilter(f func([]byte) bool) { - it.keep = f -} - -type committerTxnMutations struct { - *twoPhaseCommitter - isPrewrite bool -} - -func (m committerTxnMutations) Iter(start, end []byte) mutationsIter { - return m.newMutationsIter(m.txn.GetMemBuffer().IterWithFlags(start, end), m.isPrewrite) -} - -func (m committerTxnMutations) Len() int { - base := m.txn.Len() - m.ignoredKeys - if m.isPrewrite { - return base - } - return base - m.prewriteOnlyKeys -} - -type txnMutationsIter struct { - src kv.MemBufferIterator - isPrewrite bool - isPessimistic bool - keep func(key []byte) bool - - prewriteOnlyKeys int - ignoredKeys int -} - -func (c *twoPhaseCommitter) newMutationsIter(src kv.MemBufferIterator, isPrewrite bool) *txnMutationsIter { - return &txnMutationsIter{ - src: src, - isPrewrite: isPrewrite, - isPessimistic: c.txn.IsPessimistic(), - } -} - -func (it *txnMutationsIter) WithFilter(f func(key []byte) bool) { - it.keep = f -} - -func (it *txnMutationsIter) Next() (m mutation) { - var err error - for src := it.src; src.Valid(); err = src.Next() { - _ = err - m.key = src.Key() - m.value = nil - m.isPessimisticLock = false - flags := src.Flags() - - if it.keep != nil && !it.keep(m.key) { - continue - } - - if flags.HasIgnoredIn2PC() { - continue - } - - if it.isPrewrite { - if ignored := it.fillMutationForPrewrite(&m, src); ignored { - // Because we will have discarded values in Commit phase, - // we must record the `ignore` decision in MemBuffer at here. - src.UpdateFlags(kv.SetIgnoredIn2PC) - it.ignoredKeys++ - continue - } - } else { - // For commit and cleanup, we only need keys. - if flags.HasPrewriteOnly() { - continue - } - } - - err = src.Next() - _ = err - return - } - return mutation{} -} - -func (it *txnMutationsIter) fillMutationForPrewrite(m *mutation, src kv.MemBufferIterator) bool { - flags := src.Flags() - - if !src.HasValue() { - if flags.HasLocked() { - m.op = pb.Op_Lock - } else { - // 2PC don't care other flags. - return true - } - } else { - m.value = src.Value() - if kv.IsTombstone(m.value) { - if !it.isPessimistic && flags.HasPresumeKeyNotExists() { - // delete-your-writes keys in optimistic txn need check not exists in prewrite-phase - // due to `Op_CheckNotExists` doesn't prewrite lock, so mark those keys should not be used in commit-phase. - m.op = pb.Op_CheckNotExists - src.UpdateFlags(kv.SetPrewriteOnly) - it.prewriteOnlyKeys++ - } else { - // normal delete keys in optimistic txn can be delete without not exists checking - // delete-your-writes keys in pessimistic txn can ensure must be no exists so can directly delete them - m.op = pb.Op_Del - } - } else { - if tablecodec.IsUntouchedIndexKValue(m.key, m.value) { - return true - } - m.op = pb.Op_Put - if flags.HasPresumeKeyNotExists() { - m.op = pb.Op_Insert - } - } - } - if flags.HasLocked() { - m.isPessimisticLock = it.isPessimistic - } - - return false -} - -type mutationWithRegionIter struct { - src mutationsIter - - rc *RegionCache - loc *KeyLocation - bo *Backoffer -} - -func (c *twoPhaseCommitter) mapWithRegion(bo *Backoffer, src mutationsIter) *mutationWithRegionIter { - return &mutationWithRegionIter{ - src: src, - rc: c.store.regionCache, - bo: bo, - } -} - -func (it *mutationWithRegionIter) Next() (mutationWithRegion, error) { - m := it.src.Next() - if m.key == nil { - return mutationWithRegion{}, nil - } - - var err error - if it.loc == nil || !it.loc.Contains(m.key) { - it.loc, err = it.rc.LocateKey(it.bo, m.key) - if err != nil { - return mutationWithRegion{}, errors.Trace(err) - } - } - - return mutationWithRegion{m, it.loc.Region}, nil -} - -type mutationBatchCollector struct { - src *mutationWithRegionIter - primaryKey []byte - limit int - done bool - onlyCollectKey bool - - curr mutationWithRegion - lenHint int -} - -func (c *twoPhaseCommitter) newBatchCollector(bo *Backoffer, src mutationsIter, limit int, isPrewrite bool) (*mutationBatchCollector, error) { - mutations := c.mapWithRegion(bo, src) - m, err := mutations.Next() - if err != nil { - return nil, err - } - - return &mutationBatchCollector{ - src: mutations, - curr: m, - limit: txnCommitBatchSize, - primaryKey: c.primaryKey, - onlyCollectKey: !isPrewrite, - }, nil -} - -func (c *mutationBatchCollector) Collect() (*batchMutations, error) { - if c.done { - return nil, nil - } - - var ( - mutations = NewCommiterMutations(c.lenHint) - region = c.curr.region - m = c.curr - isPrimary bool - size int - err error - ) - - for { - if m.key == nil { - c.done = true - break - } - - if c.onlyCollectKey { - mutations.keys = append(mutations.keys, m.key) - size += len(m.key) - } else { - mutations.Push(m.op, m.key, m.value, m.isPessimisticLock) - size += len(m.key) + len(m.value) - } - - if !isPrimary { - isPrimary = bytes.Equal(m.key, c.primaryKey) - } - - m, err = c.src.Next() - if err != nil { - return nil, errors.Trace(err) - } - - if size >= c.limit || m.region.id != region.id { - c.curr = m - break - } - } - - var ret *batchMutations - if mutations.len() != 0 { - c.lenHint = mutations.len() - ret = &batchMutations{ - mutations: mutations, - region: region, - isPrimary: isPrimary, - } - } - - return ret, nil -} - -func (c *mutationBatchCollector) Finished() bool { - return c.curr.key == nil -} diff --git a/store/tikv/async_commit_fail_test.go b/store/tikv/async_commit_fail_test.go index 2ded260a50964..11f78376efbd8 100644 --- a/store/tikv/async_commit_fail_test.go +++ b/store/tikv/async_commit_fail_test.go @@ -23,40 +23,29 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv/util" ) type testAsyncCommitFailSuite struct { OneByOneSuite testAsyncCommitCommon - cluster cluster.Cluster - store *tikvStore } var _ = SerialSuites(&testAsyncCommitFailSuite{}) func (s *testAsyncCommitFailSuite) SetUpTest(c *C) { - client, pdClient, cluster, err := unistore.New("") - c.Assert(err, IsNil) - unistore.BootstrapWithSingleStore(cluster) - s.cluster = cluster - store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) - c.Assert(err, IsNil) - - s.store = store.(*tikvStore) + s.testAsyncCommitCommon.setUpTest(c) } // TestFailCommitPrimaryRpcErrors tests rpc errors are handled properly when // committing primary region task. func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true - }) + // This test doesn't support tikv mode because it needs setting failpoint in unistore. + if *WithTiKV { + return + } + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/noRetryOnRpcError", "return(true)"), IsNil) c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteTimeout", `return(true)`), IsNil) defer func() { @@ -64,11 +53,10 @@ func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/noRetryOnRpcError"), IsNil) }() // The rpc error will be wrapped to ErrResultUndetermined. - t1, err := s.store.Begin() + t1 := s.beginAsyncCommit(c) + err := t1.Set([]byte("a"), []byte("a1")) c.Assert(err, IsNil) - err = t1.Set([]byte("a"), []byte("a1")) - c.Assert(err, IsNil) - ctx := context.WithValue(context.Background(), sessionctx.ConnID, uint64(1)) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) err = t1.Commit(ctx) c.Assert(err, NotNil) c.Assert(terror.ErrorEqual(err, terror.ErrResultUndetermined), IsTrue, Commentf("%s", errors.ErrorStack(err))) @@ -78,20 +66,78 @@ func (s *testAsyncCommitFailSuite) TestFailAsyncCommitPrewriteRpcErrors(c *C) { c.Assert(err, Equals, kv.ErrInvalidTxn) // Create a new transaction to check. The previous transaction should actually commit. - t2, err := s.store.Begin() - c.Assert(err, IsNil) + t2 := s.beginAsyncCommit(c) res, err := t2.Get(context.Background(), []byte("a")) c.Assert(err, IsNil) c.Assert(bytes.Equal(res, []byte("a1")), IsTrue) } +func (s *testAsyncCommitFailSuite) TestAsyncCommitPrewriteCancelled(c *C) { + // This test doesn't support tikv mode because it needs setting failpoint in unistore. + if *WithTiKV { + return + } + + // Split into two regions. + splitKey := "s" + bo := NewBackofferWithVars(context.Background(), 5000, nil) + loc, err := s.store.GetRegionCache().LocateKey(bo, []byte(splitKey)) + c.Assert(err, IsNil) + newRegionID := s.cluster.AllocID() + newPeerID := s.cluster.AllocID() + s.cluster.Split(loc.Region.GetID(), newRegionID, []byte(splitKey), []uint64{newPeerID}, newPeerID) + s.store.GetRegionCache().InvalidateCachedRegion(loc.Region) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteResult", `1*return("writeConflict")->sleep(50)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcPrewriteResult"), IsNil) + }() + + t1 := s.beginAsyncCommit(c) + err = t1.Set([]byte("a"), []byte("a")) + c.Assert(err, IsNil) + err = t1.Set([]byte("z"), []byte("z")) + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + err = t1.Commit(ctx) + c.Assert(err, NotNil) + c.Assert(kv.ErrWriteConflict.Equal(err), IsTrue, Commentf("%s", errors.ErrorStack(err))) +} + +func (s *testAsyncCommitFailSuite) TestPointGetWithAsyncCommit(c *C) { + s.putAlphabets(c, true) + + txn := s.beginAsyncCommit(c) + txn.Set([]byte("a"), []byte("v1")) + txn.Set([]byte("b"), []byte("v2")) + s.mustPointGet(c, []byte("a"), []byte("a")) + s.mustPointGet(c, []byte("b"), []byte("b")) + + // PointGet cannot ignore async commit transactions' locks. + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing", "return"), IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + err := txn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(txn.committer.isAsyncCommit(), IsTrue) + s.mustPointGet(c, []byte("a"), []byte("v1")) + s.mustPointGet(c, []byte("b"), []byte("v2")) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing"), IsNil) + + // PointGet will not push the `max_ts` to its ts which is MaxUint64. + txn2 := s.beginAsyncCommit(c) + s.mustGetFromTxn(c, txn2, []byte("a"), []byte("v1")) + s.mustGetFromTxn(c, txn2, []byte("b"), []byte("v2")) + err = txn2.Rollback() + c.Assert(err, IsNil) +} + func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true - }) + // This test doesn't support tikv mode. + if *WithTiKV { + return + } - s.putAlphabets(c, s.store) + s.putAlphabets(c, true) // Split into several regions. for _, splitKey := range []string{"h", "o", "u"} { @@ -116,13 +162,12 @@ func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { c.Assert([]byte(loc.StartKey), BytesEquals, []byte("o")) c.Assert([]byte(loc.EndKey), BytesEquals, []byte("u")) - var connID uint64 = 0 + var sessionID uint64 = 0 test := func(keys []string, values []string) { - connID++ - ctx := context.WithValue(context.Background(), sessionctx.ConnID, connID) + sessionID++ + ctx := context.WithValue(context.Background(), util.SessionID, sessionID) - txn, err := s.store.Begin() - c.Assert(err, IsNil) + txn := s.beginAsyncCommit(c) for i := range keys { txn.Set([]byte(keys[i]), []byte(values[i])) } @@ -132,10 +177,9 @@ func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { err = txn.Commit(ctx) c.Assert(err, IsNil) - tikvTxn := txn.(*tikvTxn) - primary := tikvTxn.committer.primary() + primary := txn.committer.primary() bo := NewBackofferWithVars(context.Background(), 5000, nil) - txnStatus, err := s.store.lockResolver.getTxnStatus(bo, txn.StartTS(), primary, 0, 0, false) + txnStatus, err := s.store.lockResolver.getTxnStatus(bo, txn.StartTS(), primary, 0, 0, false, false, nil) c.Assert(err, IsNil) c.Assert(txnStatus.IsCommitted(), IsFalse) c.Assert(txnStatus.action, Equals, kvrpcpb.Action_NoAction) @@ -159,6 +203,8 @@ func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { c.Assert(gotSecondaries, DeepEquals, expectedSecondaries) c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing"), IsNil) + txn.committer.cleanup(context.Background()) + txn.committer.cleanWg.Wait() } test([]string{"a"}, []string{"a1"}) @@ -167,3 +213,21 @@ func (s *testAsyncCommitFailSuite) TestSecondaryListInPrimaryLock(c *C) { test([]string{"a", "b", "h", "i", "u"}, []string{"a4", "b4", "h4", "i4", "u4"}) test([]string{"i", "a", "z", "u", "b"}, []string{"i5", "a5", "z5", "u5", "b5"}) } + +func (s *testAsyncCommitFailSuite) TestAsyncCommitContextCancelCausingUndetermined(c *C) { + // For an async commit transaction, if RPC returns context.Canceled error when prewriting, the + // transaction should go to undetermined state. + txn := s.beginAsyncCommit(c) + err := txn.Set([]byte("a"), []byte("va")) + c.Assert(err, IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/rpcContextCancelErr", `return(true)`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/rpcContextCancelErr"), IsNil) + }() + + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + err = txn.Commit(ctx) + c.Assert(err, NotNil) + c.Assert(txn.committer.mu.undeterminedErr, NotNil) +} diff --git a/store/tikv/async_commit_test.go b/store/tikv/async_commit_test.go index fcd452f9d2dde..343c37ee3e345 100644 --- a/store/tikv/async_commit_test.go +++ b/store/tikv/async_commit_test.go @@ -23,25 +23,27 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/store/tikv/util" ) -type testAsyncCommitCommon struct{} - -type testAsyncCommitSuite struct { - OneByOneSuite - testAsyncCommitCommon +// testAsyncCommitCommon is used to put common parts that will be both used by +// testAsyncCommitSuite and testAsyncCommitFailSuite. +type testAsyncCommitCommon struct { cluster cluster.Cluster - store *tikvStore - bo *Backoffer + store *KVStore } -var _ = Suite(&testAsyncCommitSuite{}) +func (s *testAsyncCommitCommon) setUpTest(c *C) { + if *WithTiKV { + s.store = NewTestStore(c) + return + } -func (s *testAsyncCommitSuite) SetUpTest(c *C) { client, pdClient, cluster, err := unistore.New("") c.Assert(err, IsNil) unistore.BootstrapWithSingleStore(cluster) @@ -49,29 +51,106 @@ func (s *testAsyncCommitSuite) SetUpTest(c *C) { store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) c.Assert(err, IsNil) - s.store = store.(*tikvStore) - s.bo = NewBackofferWithVars(context.Background(), 5000, nil) + s.store = store } -func (s *testAsyncCommitCommon) putAlphabets(c *C, store *tikvStore) { +func (s *testAsyncCommitCommon) putAlphabets(c *C, enableAsyncCommit bool) { for ch := byte('a'); ch <= byte('z'); ch++ { - s.putKV(c, store, []byte{ch}, []byte{ch}) + s.putKV(c, []byte{ch}, []byte{ch}, enableAsyncCommit) } } -func (s *testAsyncCommitCommon) putKV(c *C, store *tikvStore, key, value []byte) (uint64, uint64) { - txn, err := store.Begin() - c.Assert(err, IsNil) - err = txn.Set(key, value) +func (s *testAsyncCommitCommon) putKV(c *C, key, value []byte, enableAsyncCommit bool) (uint64, uint64) { + txn := s.beginAsyncCommit(c) + err := txn.Set(key, value) c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) - return txn.StartTS(), txn.(*tikvTxn).commitTS + return txn.StartTS(), txn.commitTS +} + +func (s *testAsyncCommitCommon) mustGetFromTxn(c *C, txn *KVTxn, key, expectedValue []byte) { + v, err := txn.Get(context.Background(), key) + c.Assert(err, IsNil) + c.Assert(v, BytesEquals, expectedValue) +} + +func (s *testAsyncCommitCommon) mustGetLock(c *C, key []byte) *Lock { + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) + c.Assert(err, IsNil) + req := tikvrpc.NewRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{ + Key: key, + Version: ver, + }) + bo := NewBackofferWithVars(context.Background(), 5000, nil) + loc, err := s.store.regionCache.LocateKey(bo, key) + c.Assert(err, IsNil) + resp, err := s.store.SendReq(bo, req, loc.Region, readTimeoutShort) + c.Assert(err, IsNil) + c.Assert(resp.Resp, NotNil) + keyErr := resp.Resp.(*kvrpcpb.GetResponse).GetError() + c.Assert(keyErr, NotNil) + lock, err := extractLockFromKeyErr(keyErr) + c.Assert(err, IsNil) + return lock +} + +func (s *testAsyncCommitCommon) mustPointGet(c *C, key, expectedValue []byte) { + snap := s.store.GetSnapshot(maxTimestamp) + value, err := snap.Get(context.Background(), key) + c.Assert(err, IsNil) + c.Assert(value, BytesEquals, expectedValue) +} + +func (s *testAsyncCommitCommon) mustGetFromSnapshot(c *C, version uint64, key, expectedValue []byte) { + snap := s.store.GetSnapshot(version) + value, err := snap.Get(context.Background(), key) + c.Assert(err, IsNil) + c.Assert(value, BytesEquals, expectedValue) +} + +func (s *testAsyncCommitCommon) mustGetNoneFromSnapshot(c *C, version uint64, key []byte) { + snap := s.store.GetSnapshot(version) + _, err := snap.Get(context.Background(), key) + c.Assert(errors.Cause(err), Equals, kv.ErrNotExist) +} + +func (s *testAsyncCommitCommon) beginAsyncCommitWithLinearizability(c *C) *KVTxn { + txn := s.beginAsyncCommit(c) + txn.SetOption(kv.GuaranteeLinearizability, true) + return txn +} + +func (s *testAsyncCommitCommon) beginAsyncCommit(c *C) *KVTxn { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + txn.SetOption(kv.EnableAsyncCommit, true) + return txn +} + +func (s *testAsyncCommitCommon) begin(c *C) *KVTxn { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + return txn +} + +type testAsyncCommitSuite struct { + OneByOneSuite + testAsyncCommitCommon + bo *Backoffer +} + +var _ = SerialSuites(&testAsyncCommitSuite{}) + +func (s *testAsyncCommitSuite) SetUpTest(c *C) { + s.testAsyncCommitCommon.setUpTest(c) + s.bo = NewBackofferWithVars(context.Background(), 5000, nil) } -func (s *testAsyncCommitSuite) lockKeys(c *C, keys, values [][]byte, primaryKey, primaryValue []byte, commitPrimary bool) (uint64, uint64) { - txn, err := newTiKVTxn(s.store) +func (s *testAsyncCommitSuite) lockKeysWithAsyncCommit(c *C, keys, values [][]byte, primaryKey, primaryValue []byte, commitPrimary bool) (uint64, uint64) { + txn, err := newTiKVTxn(s.store, oracle.GlobalTxnScope) c.Assert(err, IsNil) + txn.SetOption(kv.EnableAsyncCommit, true) for i, k := range keys { if len(values[i]) > 0 { err = txn.Set(k, values[i]) @@ -95,7 +174,7 @@ func (s *testAsyncCommitSuite) lockKeys(c *C, keys, values [][]byte, primaryKey, c.Assert(err, IsNil) if commitPrimary { - tpc.commitTS, err = s.store.oracle.GetTimestamp(ctx) + tpc.commitTS, err = s.store.oracle.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) err = tpc.commitMutations(NewBackofferWithVars(ctx, int(atomic.LoadUint64(&CommitMaxBackoff)), nil), tpc.mutationsOfKeys([][]byte{primaryKey})) c.Assert(err, IsNil) @@ -103,32 +182,13 @@ func (s *testAsyncCommitSuite) lockKeys(c *C, keys, values [][]byte, primaryKey, return txn.startTS, tpc.commitTS } -func (s *testAsyncCommitSuite) mustGetLock(c *C, key []byte) *Lock { - ver, err := s.store.CurrentVersion() - c.Assert(err, IsNil) - req := tikvrpc.NewRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{ - Key: key, - Version: ver.Ver, - }) - loc, err := s.store.regionCache.LocateKey(s.bo, key) - c.Assert(err, IsNil) - resp, err := s.store.SendReq(s.bo, req, loc.Region, readTimeoutShort) - c.Assert(err, IsNil) - c.Assert(resp.Resp, NotNil) - keyErr := resp.Resp.(*kvrpcpb.GetResponse).GetError() - c.Assert(keyErr, NotNil) - lock, err := extractLockFromKeyErr(keyErr) - c.Assert(err, IsNil) - return lock -} - func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { - defer config.RestoreFunc()() - config.UpdateGlobal(func(conf *config.Config) { - conf.TiKVClient.AsyncCommit.Enable = true - }) + // This test doesn't support tikv mode. + if *WithTiKV { + return + } - s.putAlphabets(c, s.store) + s.putAlphabets(c, true) loc, err := s.store.GetRegionCache().LocateKey(s.bo, []byte("a")) c.Assert(err, IsNil) @@ -137,24 +197,24 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { s.store.GetRegionCache().InvalidateCachedRegion(loc.Region) // No locks to check, only primary key is locked, should be successful. - s.lockKeys(c, [][]byte{}, [][]byte{}, []byte("z"), []byte("z"), false) + s.lockKeysWithAsyncCommit(c, [][]byte{}, [][]byte{}, []byte("z"), []byte("z"), false) lock := s.mustGetLock(c, []byte("z")) lock.UseAsyncCommit = true - ts, err := s.store.oracle.GetTimestamp(context.Background()) + ts, err := s.store.oracle.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) status := TxnStatus{primaryLock: &kvrpcpb.LockInfo{Secondaries: [][]byte{}, UseAsyncCommit: true, MinCommitTs: ts}} err = s.store.lockResolver.resolveLockAsync(s.bo, lock, status) c.Assert(err, IsNil) - currentTS, err := s.store.oracle.GetTimestamp(context.Background()) + currentTS, err := s.store.oracle.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) - status, err = s.store.lockResolver.getTxnStatus(s.bo, lock.TxnID, []byte("z"), currentTS, currentTS, true) + status, err = s.store.lockResolver.getTxnStatus(s.bo, lock.TxnID, []byte("z"), currentTS, currentTS, true, false, nil) c.Assert(err, IsNil) c.Assert(status.IsCommitted(), IsTrue) c.Assert(status.CommitTS(), Equals, ts) // One key is committed (i), one key is locked (a). Should get committed. - ts, err = s.store.oracle.GetTimestamp(context.Background()) + ts, err = s.store.oracle.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) commitTs := ts + 10 @@ -174,7 +234,7 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { atomic.StoreInt64(&gotCheckA, 1) resp = kvrpcpb.CheckSecondaryLocksResponse{ - Locks: []*kvrpcpb.LockInfo{{Key: []byte("a"), PrimaryLock: []byte("z"), LockVersion: ts}}, + Locks: []*kvrpcpb.LockInfo{{Key: []byte("a"), PrimaryLock: []byte("z"), LockVersion: ts, UseAsyncCommit: true}}, CommitTs: commitTs, } } else if bytes.Equal(k, []byte("i")) { @@ -221,8 +281,7 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { MinCommitTS: ts + 5, } - _, err = s.store.Begin() - c.Assert(err, IsNil) + _ = s.beginAsyncCommit(c) err = s.store.lockResolver.resolveLockAsync(s.bo, lock, status) c.Assert(err, IsNil) @@ -232,7 +291,7 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { c.Assert(gotResolve, Equals, int64(1)) // One key has been rolled back (b), one is locked (a). Should be rolled back. - ts, err = s.store.oracle.GetTimestamp(context.Background()) + ts, err = s.store.oracle.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) commitTs = ts + 10 @@ -269,6 +328,89 @@ func (s *testAsyncCommitSuite) TestCheckSecondaries(c *C) { c.Assert(gotOther, Equals, int64(0)) } +func (s *testAsyncCommitSuite) TestRepeatableRead(c *C) { + var sessionID uint64 = 0 + test := func(isPessimistic bool) { + s.putKV(c, []byte("k1"), []byte("v1"), true) + + sessionID++ + ctx := context.WithValue(context.Background(), util.SessionID, sessionID) + txn1 := s.beginAsyncCommit(c) + txn1.SetOption(kv.Pessimistic, isPessimistic) + s.mustGetFromTxn(c, txn1, []byte("k1"), []byte("v1")) + txn1.Set([]byte("k1"), []byte("v2")) + + for i := 0; i < 20; i++ { + _, err := s.store.GetOracle().GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + c.Assert(err, IsNil) + } + + txn2 := s.beginAsyncCommit(c) + s.mustGetFromTxn(c, txn2, []byte("k1"), []byte("v1")) + + err := txn1.Commit(ctx) + c.Assert(err, IsNil) + // Check txn1 is committed in async commit. + c.Assert(txn1.committer.isAsyncCommit(), IsTrue) + s.mustGetFromTxn(c, txn2, []byte("k1"), []byte("v1")) + err = txn2.Rollback() + c.Assert(err, IsNil) + + txn3 := s.beginAsyncCommit(c) + s.mustGetFromTxn(c, txn3, []byte("k1"), []byte("v2")) + err = txn3.Rollback() + c.Assert(err, IsNil) + } + + test(false) + test(true) +} + +// It's just a simple validation of linearizability. +// Extra tests are needed to test this feature with the control of the TiKV cluster. +func (s *testAsyncCommitSuite) TestAsyncCommitLinearizability(c *C) { + t1 := s.beginAsyncCommitWithLinearizability(c) + t2 := s.beginAsyncCommitWithLinearizability(c) + err := t1.Set([]byte("a"), []byte("a1")) + c.Assert(err, IsNil) + err = t2.Set([]byte("b"), []byte("b1")) + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + // t2 commits earlier than t1 + err = t2.Commit(ctx) + c.Assert(err, IsNil) + err = t1.Commit(ctx) + c.Assert(err, IsNil) + commitTS1 := t1.committer.commitTS + commitTS2 := t2.committer.commitTS + c.Assert(commitTS2, Less, commitTS1) +} + +// TestAsyncCommitWithMultiDC tests that async commit can only be enabled in global transactions +func (s *testAsyncCommitSuite) TestAsyncCommitWithMultiDC(c *C) { + // It requires setting placement rules to run with TiKV + if *WithTiKV { + return + } + + localTxn := s.beginAsyncCommit(c) + err := localTxn.Set([]byte("a"), []byte("a1")) + localTxn.SetOption(kv.TxnScope, "bj") + c.Assert(err, IsNil) + ctx := context.WithValue(context.Background(), util.SessionID, uint64(1)) + err = localTxn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(localTxn.committer.isAsyncCommit(), IsFalse) + + globalTxn := s.beginAsyncCommit(c) + err = globalTxn.Set([]byte("b"), []byte("b1")) + globalTxn.SetOption(kv.TxnScope, oracle.GlobalTxnScope) + c.Assert(err, IsNil) + err = globalTxn.Commit(ctx) + c.Assert(err, IsNil) + c.Assert(globalTxn.committer.isAsyncCommit(), IsTrue) +} + type mockResolveClient struct { inner Client onResolveLock func(*kvrpcpb.ResolveLockRequest) (*tikvrpc.Response, error) diff --git a/store/tikv/backoff.go b/store/tikv/backoff.go index 02f01c4bc4210..71ecfc65465d0 100644 --- a/store/tikv/backoff.go +++ b/store/tikv/backoff.go @@ -17,6 +17,7 @@ import ( "context" "fmt" "math" + "math/rand" "strings" "sync/atomic" "time" @@ -25,10 +26,9 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/log" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/fastrand" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -45,35 +45,25 @@ const ( DecorrJitter ) -var ( - tikvBackoffHistogramRPC = metrics.TiKVBackoffHistogram.WithLabelValues("tikvRPC") - tikvBackoffHistogramLock = metrics.TiKVBackoffHistogram.WithLabelValues("txnLock") - tikvBackoffHistogramLockFast = metrics.TiKVBackoffHistogram.WithLabelValues("tikvLockFast") - tikvBackoffHistogramPD = metrics.TiKVBackoffHistogram.WithLabelValues("pdRPC") - tikvBackoffHistogramRegionMiss = metrics.TiKVBackoffHistogram.WithLabelValues("regionMiss") - tikvBackoffHistogramServerBusy = metrics.TiKVBackoffHistogram.WithLabelValues("serverBusy") - tikvBackoffHistogramStaleCmd = metrics.TiKVBackoffHistogram.WithLabelValues("staleCommand") - tikvBackoffHistogramEmpty = metrics.TiKVBackoffHistogram.WithLabelValues("") -) - -func (t backoffType) metric() prometheus.Observer { +func (t BackoffType) metric() prometheus.Observer { switch t { - case boTiKVRPC: - return tikvBackoffHistogramRPC + // TODO: distinguish tikv and tiflash in metrics + case BoTiKVRPC, BoTiFlashRPC: + return metrics.BackoffHistogramRPC case BoTxnLock: - return tikvBackoffHistogramLock - case boTxnLockFast: - return tikvBackoffHistogramLockFast + return metrics.BackoffHistogramLock + case BoTxnLockFast: + return metrics.BackoffHistogramLockFast case BoPDRPC: - return tikvBackoffHistogramPD + return metrics.BackoffHistogramPD case BoRegionMiss: - return tikvBackoffHistogramRegionMiss - case boServerBusy: - return tikvBackoffHistogramServerBusy + return metrics.BackoffHistogramRegionMiss + case boTiKVServerBusy, boTiFlashServerBusy: + return metrics.BackoffHistogramServerBusy case boStaleCmd: - return tikvBackoffHistogramStaleCmd + return metrics.BackoffHistogramStaleCmd } - return tikvBackoffHistogramEmpty + return metrics.BackoffHistogramEmpty } // NewBackoffFn creates a backoff func which implements exponential backoff with @@ -93,12 +83,12 @@ func NewBackoffFn(base, cap, jitter int) func(ctx context.Context, maxSleepMs in sleep = expo(base, cap, attempts) case FullJitter: v := expo(base, cap, attempts) - sleep = int(fastrand.Uint32N(uint32(v))) + sleep = rand.Intn(v) case EqualJitter: v := expo(base, cap, attempts) - sleep = v/2 + int(fastrand.Uint32N(uint32(v/2))) + sleep = v/2 + rand.Intn(v/2) case DecorrJitter: - sleep = int(math.Min(float64(cap), float64(base+int(fastrand.Uint32N(uint32(lastSleep*3-base)))))) + sleep = int(math.Min(float64(cap), float64(base+rand.Intn(lastSleep*3-base)))) } logutil.BgLogger().Debug("backoff", zap.Int("base", base), @@ -124,31 +114,34 @@ func expo(base, cap, n int) int { return int(math.Min(float64(cap), float64(base)*math.Pow(2.0, float64(n)))) } -type backoffType int +// BackoffType defines the backoff type. +type BackoffType int // Back off types. const ( - boTiKVRPC backoffType = iota + BoTiKVRPC BackoffType = iota + BoTiFlashRPC BoTxnLock - boTxnLockFast + BoTxnLockFast BoPDRPC BoRegionMiss - boServerBusy + boTiKVServerBusy + boTiFlashServerBusy boTxnNotFound boStaleCmd boMaxTsNotSynced ) -func (t backoffType) createFn(vars *kv.Variables) func(context.Context, int) int { +func (t BackoffType) createFn(vars *kv.Variables) func(context.Context, int) int { if vars.Hook != nil { vars.Hook(t.String(), vars) } switch t { - case boTiKVRPC: + case BoTiKVRPC, BoTiFlashRPC: return NewBackoffFn(100, 2000, EqualJitter) case BoTxnLock: return NewBackoffFn(200, 3000, EqualJitter) - case boTxnLockFast: + case BoTxnLockFast: return NewBackoffFn(vars.BackoffLockFast, 3000, EqualJitter) case BoPDRPC: return NewBackoffFn(500, 3000, EqualJitter) @@ -157,7 +150,7 @@ func (t backoffType) createFn(vars *kv.Variables) func(context.Context, int) int return NewBackoffFn(2, 500, NoJitter) case boTxnNotFound: return NewBackoffFn(2, 500, NoJitter) - case boServerBusy: + case boTiKVServerBusy, boTiFlashServerBusy: return NewBackoffFn(2000, 10000, EqualJitter) case boStaleCmd: return NewBackoffFn(2, 1000, NoJitter) @@ -167,20 +160,24 @@ func (t backoffType) createFn(vars *kv.Variables) func(context.Context, int) int return nil } -func (t backoffType) String() string { +func (t BackoffType) String() string { switch t { - case boTiKVRPC: + case BoTiKVRPC: return "tikvRPC" + case BoTiFlashRPC: + return "tiflashRPC" case BoTxnLock: return "txnLock" - case boTxnLockFast: + case BoTxnLockFast: return "txnLockFast" case BoPDRPC: return "pdRPC" case BoRegionMiss: return "regionMiss" - case boServerBusy: - return "serverBusy" + case boTiKVServerBusy: + return "tikvServerBusy" + case boTiFlashServerBusy: + return "tiflashServerBusy" case boStaleCmd: return "staleCommand" case boTxnNotFound: @@ -191,18 +188,23 @@ func (t backoffType) String() string { return "" } -func (t backoffType) TError() error { +// TError returns pingcap/error of the backoff type. +func (t BackoffType) TError() error { switch t { - case boTiKVRPC: + case BoTiKVRPC: return ErrTiKVServerTimeout - case BoTxnLock, boTxnLockFast, boTxnNotFound: + case BoTiFlashRPC: + return ErrTiFlashServerTimeout + case BoTxnLock, BoTxnLockFast, boTxnNotFound: return ErrResolveLockTimeout case BoPDRPC: return ErrPDServerTimeout case BoRegionMiss: return ErrRegionUnavailable - case boServerBusy: + case boTiKVServerBusy: return ErrTiKVServerBusy + case boTiFlashServerBusy: + return ErrTiFlashServerBusy case boStaleCmd: return ErrTiKVStaleCommand case boMaxTsNotSynced: @@ -213,12 +215,10 @@ func (t backoffType) TError() error { // Maximum total sleep time(in ms) for kv/cop commands. const ( - GetMemberInfoBackoff = 5000 - copBuildTaskMaxBackoff = 5000 + GetAllMembersBackoff = 5000 tsoMaxBackoff = 15000 scannerNextMaxBackoff = 20000 batchGetMaxBackoff = 20000 - copNextMaxBackoff = 20000 getMaxBackoff = 20000 cleanupMaxBackoff = 20000 GcOneRegionMaxBackoff = 20000 @@ -227,7 +227,6 @@ const ( rawkvMaxBackoff = 20000 splitRegionBackoff = 20000 maxSplitRegionsBackoff = 120000 - scatterRegionBackoff = 20000 waitScatterRegionFinishBackoff = 120000 locateRegionMaxBackoff = 20000 pessimisticLockMaxBackoff = 20000 @@ -246,7 +245,7 @@ var ( type Backoffer struct { ctx context.Context - fn map[backoffType]func(context.Context, int) int + fn map[BackoffType]func(context.Context, int) int maxSleep int totalSleep int errors []error @@ -254,14 +253,14 @@ type Backoffer struct { vars *kv.Variables noop bool - backoffSleepMS map[backoffType]int - backoffTimes map[backoffType]int + backoffSleepMS map[BackoffType]int + backoffTimes map[BackoffType]int } type txnStartCtxKeyType struct{} -// txnStartKey is a key for transaction start_ts info in context.Context. -var txnStartKey = txnStartCtxKeyType{} +// TxnStartKey is a key for transaction start_ts info in context.Context. +var TxnStartKey interface{} = txnStartCtxKeyType{} // NewBackoffer (Deprecated) creates a Backoffer with maximum sleep time(in ms). func NewBackoffer(ctx context.Context, maxSleep int) *Backoffer { @@ -297,7 +296,7 @@ func (b *Backoffer) withVars(vars *kv.Variables) *Backoffer { // Backoff sleeps a while base on the backoffType and records the error message. // It returns a retryable error if total sleep time exceeds maxSleep. -func (b *Backoffer) Backoff(typ backoffType, err error) error { +func (b *Backoffer) Backoff(typ BackoffType, err error) error { if span := opentracing.SpanFromContext(b.ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan(fmt.Sprintf("tikv.backoff.%s", typ), opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -308,7 +307,7 @@ func (b *Backoffer) Backoff(typ backoffType, err error) error { // BackoffWithMaxSleep sleeps a while base on the backoffType and records the error message // and never sleep more than maxSleepMs for each sleep. -func (b *Backoffer) BackoffWithMaxSleep(typ backoffType, maxSleepMs int, err error) error { +func (b *Backoffer) BackoffWithMaxSleep(typ BackoffType, maxSleepMs int, err error) error { if strings.Contains(err.Error(), mismatchClusterID) { logutil.BgLogger().Fatal("critical error", zap.Error(err)) } @@ -330,12 +329,12 @@ func (b *Backoffer) BackoffWithMaxSleep(typ backoffType, maxSleepMs int, err err } logutil.BgLogger().Warn(errMsg) // Use the first backoff type to generate a MySQL error. - return b.types[0].(backoffType).TError() + return b.types[0].(BackoffType).TError() } // Lazy initialize. if b.fn == nil { - b.fn = make(map[backoffType]func(context.Context, int) int) + b.fn = make(map[BackoffType]func(context.Context, int) int) } f, ok := b.fn[typ] if !ok { @@ -347,11 +346,11 @@ func (b *Backoffer) BackoffWithMaxSleep(typ backoffType, maxSleepMs int, err err typ.metric().Observe(float64(realSleep) / 1000) b.totalSleep += realSleep if b.backoffSleepMS == nil { - b.backoffSleepMS = make(map[backoffType]int) + b.backoffSleepMS = make(map[BackoffType]int) } b.backoffSleepMS[typ] += realSleep if b.backoffTimes == nil { - b.backoffTimes = make(map[backoffType]int) + b.backoffTimes = make(map[BackoffType]int) } b.backoffTimes[typ]++ @@ -369,7 +368,7 @@ func (b *Backoffer) BackoffWithMaxSleep(typ backoffType, maxSleepMs int, err err } var startTs interface{} - if ts := b.ctx.Value(txnStartKey); ts != nil { + if ts := b.ctx.Value(TxnStartKey); ts != nil { startTs = ts } logutil.Logger(b.ctx).Debug("retry later", @@ -412,3 +411,33 @@ func (b *Backoffer) Fork() (*Backoffer, context.CancelFunc) { vars: b.vars, }, cancel } + +// GetVars returns the binded vars. +func (b *Backoffer) GetVars() *kv.Variables { + return b.vars +} + +// GetTotalSleep returns total sleep time. +func (b *Backoffer) GetTotalSleep() int { + return b.totalSleep +} + +// GetTypes returns type list. +func (b *Backoffer) GetTypes() []fmt.Stringer { + return b.types +} + +// GetCtx returns the binded context. +func (b *Backoffer) GetCtx() context.Context { + return b.ctx +} + +// GetBackoffTimes returns a map contains backoff time count by type. +func (b *Backoffer) GetBackoffTimes() map[BackoffType]int { + return b.backoffTimes +} + +// GetBackoffSleepMS returns a map contains backoff sleep time by type. +func (b *Backoffer) GetBackoffSleepMS() map[BackoffType]int { + return b.backoffSleepMS +} diff --git a/store/tikv/backoff_test.go b/store/tikv/backoff_test.go index c8037674b3aaf..6713fd9984d55 100644 --- a/store/tikv/backoff_test.go +++ b/store/tikv/backoff_test.go @@ -22,13 +22,13 @@ import ( type testBackoffSuite struct { OneByOneSuite - store *tikvStore + store *KVStore } var _ = Suite(&testBackoffSuite{}) func (s *testBackoffSuite) SetUpTest(c *C) { - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) } func (s *testBackoffSuite) TearDownTest(c *C) { @@ -37,7 +37,7 @@ func (s *testBackoffSuite) TearDownTest(c *C) { func (s *testBackoffSuite) TestBackoffWithMax(c *C) { b := NewBackofferWithVars(context.TODO(), 2000, nil) - err := b.BackoffWithMaxSleep(boTxnLockFast, 30, errors.New("test")) + err := b.BackoffWithMaxSleep(BoTxnLockFast, 30, errors.New("test")) c.Assert(err, IsNil) c.Assert(b.totalSleep, Equals, 30) } diff --git a/store/tikv/binlog.go b/store/tikv/binlog.go new file mode 100644 index 0000000000000..ac800c09873c8 --- /dev/null +++ b/store/tikv/binlog.go @@ -0,0 +1,103 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "context" + "sync" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/sessionctx/binloginfo" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tipb/go-binlog" + zap "go.uber.org/zap" +) + +// BinlogExecutor defines the logic to replicate binlogs during transaction commit. +type BinlogExecutor interface { + Prewrite(ctx context.Context, primary []byte) <-chan BinlogWriteResult + Commit(ctx context.Context, commitTS int64) + Skip() +} + +// BinlogWriteResult defines the result of prewrite binlog. +type BinlogWriteResult interface { + Skipped() bool + GetError() error +} + +type binlogExecutor struct { + txn *KVTxn +} + +func (e *binlogExecutor) Skip() { + binloginfo.RemoveOneSkippedCommitter() +} + +func (e *binlogExecutor) Prewrite(ctx context.Context, primary []byte) <-chan BinlogWriteResult { + ch := make(chan BinlogWriteResult, 1) + go func() { + logutil.Eventf(ctx, "start prewrite binlog") + binInfo := e.txn.us.GetOption(kv.BinlogInfo).(*binloginfo.BinlogInfo) + bin := binInfo.Data + bin.StartTs = int64(e.txn.startTS) + if bin.Tp == binlog.BinlogType_Prewrite { + bin.PrewriteKey = primary + } + wr := binInfo.WriteBinlog(e.txn.store.clusterID) + if wr.Skipped() { + binInfo.Data.PrewriteValue = nil + binloginfo.AddOneSkippedCommitter() + } + logutil.Eventf(ctx, "finish prewrite binlog") + ch <- wr + }() + return ch +} + +func (e *binlogExecutor) Commit(ctx context.Context, commitTS int64) { + binInfo := e.txn.us.GetOption(kv.BinlogInfo).(*binloginfo.BinlogInfo) + binInfo.Data.Tp = binlog.BinlogType_Commit + if commitTS == 0 { + binInfo.Data.Tp = binlog.BinlogType_Rollback + } + binInfo.Data.CommitTs = commitTS + binInfo.Data.PrewriteValue = nil + + wg := sync.WaitGroup{} + mock := false + failpoint.Inject("mockSyncBinlogCommit", func(val failpoint.Value) { + if val.(bool) { + wg.Add(1) + mock = true + } + }) + go func() { + logutil.Eventf(ctx, "start write finish binlog") + binlogWriteResult := binInfo.WriteBinlog(e.txn.store.clusterID) + err := binlogWriteResult.GetError() + if err != nil { + logutil.BgLogger().Error("failed to write binlog", + zap.Error(err)) + } + logutil.Eventf(ctx, "finish write finish binlog") + if mock { + wg.Done() + } + }() + if mock { + wg.Wait() + } +} diff --git a/store/tikv/cleanup.go b/store/tikv/cleanup.go index ba203d438f954..1dd56f54f63e3 100644 --- a/store/tikv/cleanup.go +++ b/store/tikv/cleanup.go @@ -16,9 +16,9 @@ package tikv import ( "github.com/pingcap/errors" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" ) @@ -26,19 +26,18 @@ import ( type actionCleanup struct{} var _ twoPhaseCommitAction = actionCleanup{} -var tiKVTxnRegionsNumHistogramCleanup = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues(metricsTag("cleanup")) func (actionCleanup) String() string { return "cleanup" } func (actionCleanup) tiKVTxnRegionsNumHistogram() prometheus.Observer { - return tiKVTxnRegionsNumHistogramCleanup + return metrics.TxnRegionsNumHistogramCleanup } func (actionCleanup) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch batchMutations) error { req := tikvrpc.NewRequest(tikvrpc.CmdBatchRollback, &pb.BatchRollbackRequest{ - Keys: batch.mutations.keys, + Keys: batch.mutations.GetKeys(), StartVersion: c.startTS, }, pb.Context{Priority: c.priority, SyncLog: c.syncLog}) resp, err := c.store.SendReq(bo, req, batch.region, readTimeoutShort) @@ -58,7 +57,7 @@ func (actionCleanup) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batc return errors.Trace(err) } if keyErr := resp.Resp.(*pb.BatchRollbackResponse).GetError(); keyErr != nil { - err = errors.Errorf("conn %d 2PC cleanup failed: %s", c.connID, keyErr) + err = errors.Errorf("session %d 2PC cleanup failed: %s", c.sessionID, keyErr) logutil.BgLogger().Debug("2PC failed cleanup key", zap.Error(err), zap.Uint64("txnStartTS", c.startTS)) diff --git a/store/tikv/client.go b/store/tikv/client.go index cc69766f18a83..910ee19bad5f3 100644 --- a/store/tikv/client.go +++ b/store/tikv/client.go @@ -16,6 +16,7 @@ package tikv import ( "context" + "fmt" "io" "math" "runtime/trace" @@ -29,19 +30,22 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/debugpb" + "github.com/pingcap/kvproto/pkg/mpp" "github.com/pingcap/kvproto/pkg/tikvpb" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + tidbmetrics "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "google.golang.org/grpc" "google.golang.org/grpc/backoff" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/encoding/gzip" "google.golang.org/grpc/keepalive" ) @@ -120,7 +124,7 @@ func (a *connArray) Init(addr string, security config.Security, idleNotify *uint unaryInterceptor grpc.UnaryClientInterceptor streamInterceptor grpc.StreamClientInterceptor ) - if cfg.OpenTracing.Enable { + if cfg.OpenTracingEnable { unaryInterceptor = grpc_opentracing.UnaryClientInterceptor() streamInterceptor = grpc_opentracing.StreamClientInterceptor() } @@ -128,12 +132,18 @@ func (a *connArray) Init(addr string, security config.Security, idleNotify *uint allowBatch := (cfg.TiKVClient.MaxBatchSize > 0) && enableBatch if allowBatch { a.batchConn = newBatchConn(uint(len(a.v)), cfg.TiKVClient.MaxBatchSize, idleNotify) - a.pendingRequests = metrics.TiKVPendingBatchRequests.WithLabelValues(a.target) + a.pendingRequests = metrics.TiKVBatchPendingRequests.WithLabelValues(a.target) + a.batchSize = metrics.TiKVBatchRequests.WithLabelValues(a.target) } keepAlive := cfg.TiKVClient.GrpcKeepAliveTime keepAliveTimeout := cfg.TiKVClient.GrpcKeepAliveTimeout for i := range a.v { ctx, cancel := context.WithTimeout(context.Background(), a.dialTimeout) + var callOptions []grpc.CallOption + callOptions = append(callOptions, grpc.MaxCallRecvMsgSize(MaxRecvMsgSize)) + if cfg.TiKVClient.GrpcCompressionType == gzip.Name { + callOptions = append(callOptions, grpc.UseCompressor(gzip.Name)) + } conn, err := grpc.DialContext( ctx, addr, @@ -142,7 +152,7 @@ func (a *connArray) Init(addr string, security config.Security, idleNotify *uint grpc.WithInitialConnWindowSize(grpcInitialConnWindowSize), grpc.WithUnaryInterceptor(unaryInterceptor), grpc.WithStreamInterceptor(streamInterceptor), - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(MaxRecvMsgSize)), + grpc.WithDefaultCallOptions(callOptions...), grpc.WithConnectParams(grpc.ConnectParams{ Backoff: backoff.Config{ BaseDelay: 100 * time.Millisecond, // Default was 1s. @@ -209,25 +219,29 @@ func (a *connArray) Close() { close(a.done) } -// rpcClient is RPC client struct. +// RPCClient is RPC client struct. // TODO: Add flow control between RPC clients in TiDB ond RPC servers in TiKV. // Since we use shared client connection to communicate to the same TiKV, it's possible // that there are too many concurrent requests which overload the service of TiKV. -type rpcClient struct { +type RPCClient struct { sync.RWMutex conns map[string]*connArray security config.Security idleNotify uint32 + // recycleMu protect the conns from being modified during a connArray is taken out and used. + // That means recycleIdleConnArray() will wait until nobody doing sendBatchRequest() + recycleMu sync.RWMutex // Periodically check whether there is any connection that is idle and then close and remove these connections. // Implement background cleanup. isClosed bool dialTimeout time.Duration } -func newRPCClient(security config.Security, opts ...func(c *rpcClient)) *rpcClient { - cli := &rpcClient{ +// NewRPCClient creates a client that manages connections and rpc calls with tikv-servers. +func NewRPCClient(security config.Security, opts ...func(c *RPCClient)) *RPCClient { + cli := &RPCClient{ conns: make(map[string]*connArray), security: security, dialTimeout: dialTimeout, @@ -240,10 +254,10 @@ func newRPCClient(security config.Security, opts ...func(c *rpcClient)) *rpcClie // NewTestRPCClient is for some external tests. func NewTestRPCClient(security config.Security) Client { - return newRPCClient(security) + return NewRPCClient(security) } -func (c *rpcClient) getConnArray(addr string, enableBatch bool, opt ...func(cfg *config.TiKVClient)) (*connArray, error) { +func (c *RPCClient) getConnArray(addr string, enableBatch bool, opt ...func(cfg *config.TiKVClient)) (*connArray, error) { c.RLock() if c.isClosed { c.RUnlock() @@ -261,7 +275,7 @@ func (c *rpcClient) getConnArray(addr string, enableBatch bool, opt ...func(cfg return array, nil } -func (c *rpcClient) createConnArray(addr string, enableBatch bool, opts ...func(cfg *config.TiKVClient)) (*connArray, error) { +func (c *RPCClient) createConnArray(addr string, enableBatch bool, opts ...func(cfg *config.TiKVClient)) (*connArray, error) { c.Lock() defer c.Unlock() array, ok := c.conns[addr] @@ -280,7 +294,7 @@ func (c *rpcClient) createConnArray(addr string, enableBatch bool, opts ...func( return array, nil } -func (c *rpcClient) closeConns() { +func (c *RPCClient) closeConns() { c.Lock() if !c.isClosed { c.isClosed = true @@ -299,7 +313,7 @@ type sendReqHistCacheKey struct { id uint64 } -func (c *rpcClient) updateTiKVSendReqHistogram(req *tikvrpc.Request, start time.Time) { +func (c *RPCClient) updateTiKVSendReqHistogram(req *tikvrpc.Request, start time.Time) { key := sendReqHistCacheKey{ req.Type, req.Context.GetPeer().GetStoreId(), @@ -317,9 +331,9 @@ func (c *rpcClient) updateTiKVSendReqHistogram(req *tikvrpc.Request, start time. } // SendRequest sends a Request to server and receives Response. -func (c *rpcClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (*tikvrpc.Response, error) { +func (c *RPCClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (*tikvrpc.Response, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("rpcClient.SendRequest", opentracing.ChildOf(span.Context())) + span1 := span.Tracer().StartSpan(fmt.Sprintf("rpcClient.SendRequest, region ID: %d, type: %s", req.RegionId, req.Type), opentracing.ChildOf(span.Context())) defer span1.Finish() ctx = opentracing.ContextWithSpan(ctx, span1) } @@ -335,11 +349,15 @@ func (c *rpcClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R }() if atomic.CompareAndSwapUint32(&c.idleNotify, 1, 0) { + c.recycleMu.Lock() c.recycleIdleConnArray() + c.recycleMu.Unlock() } // TiDB will not send batch commands to TiFlash, to resolve the conflict with Batch Cop Request. enableBatch := req.StoreTp != kv.TiDB && req.StoreTp != kv.TiFlash + c.recycleMu.RLock() + defer c.recycleMu.RUnlock() connArray, err := c.getConnArray(addr, enableBatch) if err != nil { return nil, errors.Trace(err) @@ -357,7 +375,7 @@ func (c *rpcClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R clientConn := connArray.Get() if state := clientConn.GetState(); state == connectivity.TransientFailure { storeID := strconv.FormatUint(req.Context.GetPeer().GetStoreId(), 10) - metrics.GRPCConnTransientFailureCounter.WithLabelValues(addr, storeID).Inc() + tidbmetrics.GRPCConnTransientFailureCounter.WithLabelValues(addr, storeID).Inc() } if req.IsDebugReq() { @@ -369,19 +387,21 @@ func (c *rpcClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.R client := tikvpb.NewTikvClient(clientConn) - if req.Type == tikvrpc.CmdBatchCop { + switch req.Type { + case tikvrpc.CmdBatchCop: return c.getBatchCopStreamResponse(ctx, client, req, timeout, connArray) - } - - if req.Type == tikvrpc.CmdCopStream { + case tikvrpc.CmdCopStream: return c.getCopStreamResponse(ctx, client, req, timeout, connArray) + case tikvrpc.CmdMPPConn: + return c.getMPPStreamResponse(ctx, client, req, timeout, connArray) } + // Or else it's a unary call. ctx1, cancel := context.WithTimeout(ctx, timeout) defer cancel() return tikvrpc.CallRPC(ctx1, client, req) } -func (c *rpcClient) getCopStreamResponse(ctx context.Context, client tikvpb.TikvClient, req *tikvrpc.Request, timeout time.Duration, connArray *connArray) (*tikvrpc.Response, error) { +func (c *RPCClient) getCopStreamResponse(ctx context.Context, client tikvpb.TikvClient, req *tikvrpc.Request, timeout time.Duration, connArray *connArray) (*tikvrpc.Response, error) { // Coprocessor streaming request. // Use context to support timeout for grpc streaming client. ctx1, cancel := context.WithCancel(ctx) @@ -416,7 +436,7 @@ func (c *rpcClient) getCopStreamResponse(ctx context.Context, client tikvpb.Tikv } -func (c *rpcClient) getBatchCopStreamResponse(ctx context.Context, client tikvpb.TikvClient, req *tikvrpc.Request, timeout time.Duration, connArray *connArray) (*tikvrpc.Response, error) { +func (c *RPCClient) getBatchCopStreamResponse(ctx context.Context, client tikvpb.TikvClient, req *tikvrpc.Request, timeout time.Duration, connArray *connArray) (*tikvrpc.Response, error) { // Coprocessor streaming request. // Use context to support timeout for grpc streaming client. ctx1, cancel := context.WithCancel(ctx) @@ -448,10 +468,43 @@ func (c *rpcClient) getBatchCopStreamResponse(ctx context.Context, client tikvpb } copStream.BatchResponse = first return resp, nil +} + +func (c *RPCClient) getMPPStreamResponse(ctx context.Context, client tikvpb.TikvClient, req *tikvrpc.Request, timeout time.Duration, connArray *connArray) (*tikvrpc.Response, error) { + // MPP streaming request. + // Use context to support timeout for grpc streaming client. + ctx1, cancel := context.WithCancel(ctx) + // Should NOT call defer cancel() here because it will cancel further stream.Recv() + // We put it in copStream.Lease.Cancel call this cancel at copStream.Close + // TODO: add unit test for SendRequest. + resp, err := tikvrpc.CallRPC(ctx1, client, req) + if err != nil { + cancel() + return nil, errors.Trace(err) + } + // Put the lease object to the timeout channel, so it would be checked periodically. + copStream := resp.Resp.(*tikvrpc.MPPStreamResponse) + copStream.Timeout = timeout + copStream.Lease.Cancel = cancel + connArray.streamTimeout <- &copStream.Lease + + // Read the first streaming response to get CopStreamResponse. + // This can make error handling much easier, because SendReq() retry on + // region error automatically. + var first *mpp.MPPDataPacket + first, err = copStream.Recv() + if err != nil { + if errors.Cause(err) != io.EOF { + return nil, errors.Trace(err) + } + } + copStream.MPPDataPacket = first + return resp, nil } -func (c *rpcClient) Close() error { +// Close closes all connections. +func (c *RPCClient) Close() error { // TODO: add a unit test for SendRequest After Closed c.closeConns() return nil diff --git a/store/tikv/client_batch.go b/store/tikv/client_batch.go index 3d58890dae71a..5f36df341613e 100644 --- a/store/tikv/client_batch.go +++ b/store/tikv/client_batch.go @@ -26,10 +26,11 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/tikvpb" "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/metrics" + tidbmetrics "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" "google.golang.org/grpc" @@ -51,7 +52,8 @@ type batchConn struct { idleNotify *uint32 idleDetect *time.Timer - pendingRequests prometheus.Gauge + pendingRequests prometheus.Observer + batchSize prometheus.Observer index uint32 } @@ -77,7 +79,7 @@ func (a *batchConn) fetchAllPendingRequests( maxBatchSize int, entries *[]*batchCommandsEntry, requests *[]*tikvpb.BatchCommandsRequest_Request, -) { +) time.Time { // Block on the first element. var headEntry *batchCommandsEntry select { @@ -91,13 +93,14 @@ func (a *batchConn) fetchAllPendingRequests( atomic.AddUint32(&a.idle, 1) atomic.CompareAndSwapUint32(a.idleNotify, 0, 1) // This batchConn to be recycled - return + return time.Now() case <-a.closed: - return + return time.Now() } if headEntry == nil { - return + return time.Now() } + ts := time.Now() *entries = append(*entries, headEntry) *requests = append(*requests, headEntry.req) @@ -106,14 +109,15 @@ func (a *batchConn) fetchAllPendingRequests( select { case entry := <-a.batchCommandsCh: if entry == nil { - return + return ts } *entries = append(*entries, entry) *requests = append(*requests, entry.req) default: - return + return ts } } + return ts } // fetchMorePendingRequests fetches more pending requests from the channel. @@ -125,8 +129,6 @@ func fetchMorePendingRequests( entries *[]*batchCommandsEntry, requests *[]*tikvpb.BatchCommandsRequest_Request, ) { - waitStart := time.Now() - // Try to collect `batchWaitSize` requests, or wait `maxWaitTime`. after := time.NewTimer(maxWaitTime) for len(*entries) < batchWaitSize { @@ -137,8 +139,7 @@ func fetchMorePendingRequests( } *entries = append(*entries, entry) *requests = append(*requests, entry.req) - case waitEnd := <-after.C: - metrics.TiKVBatchWaitDuration.Observe(float64(waitEnd.Sub(waitStart))) + case <-after.C: return } } @@ -156,7 +157,6 @@ func fetchMorePendingRequests( *entries = append(*entries, entry) *requests = append(*requests, entry.req) default: - metrics.TiKVBatchWaitDuration.Observe(float64(time.Since(waitStart))) return } } @@ -224,7 +224,8 @@ func (c *batchCommandsClient) send(request *tikvpb.BatchCommandsRequest, entries } } - if err := c.initBatchClient(); err != nil { + err := c.initBatchClient() + if err != nil { logutil.BgLogger().Warn( "init create streaming fail", zap.String("target", c.target), @@ -233,6 +234,7 @@ func (c *batchCommandsClient) send(request *tikvpb.BatchCommandsRequest, entries c.failPendingRequests(err) return } + if err := c.client.Send(request); err != nil { logutil.BgLogger().Info( "sending batch commands meets error", @@ -247,7 +249,7 @@ func (c *batchCommandsClient) send(request *tikvpb.BatchCommandsRequest, entries func (c *batchCommandsClient) recv() (resp *tikvpb.BatchCommandsResponse, err error) { defer func() { if r := recover(); r != nil { - metrics.PanicCounter.WithLabelValues(metrics.LabelBatchRecvLoop).Inc() + tidbmetrics.PanicCounter.WithLabelValues(metrics.LabelBatchRecvLoop).Inc() logutil.BgLogger().Error("batchCommandsClient.recv panic", zap.Reflect("r", r), zap.Stack("stack")) @@ -329,7 +331,7 @@ func (c *batchCommandsClient) reCreateStreamingClientOnce(perr error) error { func (c *batchCommandsClient) batchRecvLoop(cfg config.TiKVClient, tikvTransportLayerLoad *uint64) { defer func() { if r := recover(); r != nil { - metrics.PanicCounter.WithLabelValues(metrics.LabelBatchRecvLoop).Inc() + tidbmetrics.PanicCounter.WithLabelValues(metrics.LabelBatchRecvLoop).Inc() logutil.BgLogger().Error("batchRecvLoop", zap.Reflect("r", r), zap.Stack("stack")) @@ -403,7 +405,7 @@ func (c *batchCommandsClient) reCreateStreamingClient(err error) (stopped bool) break } - err2 := b.Backoff(boTiKVRPC, err1) + err2 := b.Backoff(BoTiKVRPC, err1) // As timeout is set to math.MaxUint32, err2 should always be nil. // This line is added to make the 'make errcheck' pass. terror.Log(err2) @@ -446,7 +448,7 @@ func resetRequests(requests []*tikvpb.BatchCommandsRequest_Request) []*tikvpb.Ba func (a *batchConn) batchSendLoop(cfg config.TiKVClient) { defer func() { if r := recover(); r != nil { - metrics.PanicCounter.WithLabelValues(metrics.LabelBatchSendLoop).Inc() + tidbmetrics.PanicCounter.WithLabelValues(metrics.LabelBatchSendLoop).Inc() logutil.BgLogger().Error("batchSendLoop", zap.Reflect("r", r), zap.Stack("stack")) @@ -469,8 +471,9 @@ func (a *batchConn) batchSendLoop(cfg config.TiKVClient) { requests = resetRequests(requests) requestIDs = requestIDs[:0] - a.pendingRequests.Set(float64(len(a.batchCommandsCh))) - a.fetchAllPendingRequests(int(cfg.MaxBatchSize), &entries, &requests) + start := a.fetchAllPendingRequests(int(cfg.MaxBatchSize), &entries, &requests) + a.pendingRequests.Observe(float64(len(a.batchCommandsCh))) + a.batchSize.Observe(float64(len(requests))) // curl -XPUT -d 'return(true)' http://0.0.0.0:10080/fail/github.com/pingcap/tidb/store/tikv/mockBlockOnBatchClient failpoint.Inject("mockBlockOnBatchClient", func(val failpoint.Value) { @@ -482,6 +485,7 @@ func (a *batchConn) batchSendLoop(cfg config.TiKVClient) { if len(entries) < int(cfg.MaxBatchSize) && cfg.MaxBatchWaitTime > 0 { // If the target TiKV is overload, wait a while to collect more requests. if atomic.LoadUint64(&a.tikvTransportLayerLoad) >= uint64(cfg.OverloadThreshold) { + metrics.TiKvBatchWaitOverLoad.Add(1) fetchMorePendingRequests( a.batchCommandsCh, int(cfg.MaxBatchSize), int(bestBatchWaitSize), cfg.MaxBatchWaitTime, &entries, &requests, @@ -505,6 +509,7 @@ func (a *batchConn) batchSendLoop(cfg config.TiKVClient) { } a.getClientAndSend(entries, requests, requestIDs) + metrics.TiKVBatchSendLatency.Observe(float64(time.Since(start))) } } @@ -612,6 +617,7 @@ func sendBatchRequest( timer := time.NewTimer(timeout) defer timer.Stop() + start := time.Now() select { case batchConn.batchCommandsCh <- entry: case <-ctx.Done(): @@ -621,6 +627,7 @@ func sendBatchRequest( case <-timer.C: return nil, errors.SuspendStack(errors.Annotate(context.DeadlineExceeded, "wait sendLoop")) } + metrics.TiKVBatchWaitDuration.Observe(float64(time.Since(start))) select { case res, ok := <-entry.res: @@ -638,7 +645,7 @@ func sendBatchRequest( } } -func (c *rpcClient) recycleIdleConnArray() { +func (c *RPCClient) recycleIdleConnArray() { var addrs []string c.RLock() for _, conn := range c.conns { diff --git a/store/tikv/client_fail_test.go b/store/tikv/client_fail_test.go index 6e8a3215f4b22..cadf1dbe06f6e 100644 --- a/store/tikv/client_fail_test.go +++ b/store/tikv/client_fail_test.go @@ -21,7 +21,7 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/tikvpb" - "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/store/tikv/config" "github.com/pingcap/tidb/store/tikv/tikvrpc" ) @@ -47,7 +47,7 @@ func (s *testClientFailSuite) TestPanicInRecvLoop(c *C) { defer server.Stop() addr := fmt.Sprintf("%s:%d", "127.0.0.1", port) - rpcClient := newRPCClient(config.Security{}, func(c *rpcClient) { + rpcClient := NewRPCClient(config.Security{}, func(c *RPCClient) { c.dialTimeout = time.Second / 3 }) diff --git a/store/tikv/client_helper.go b/store/tikv/client_helper.go new file mode 100644 index 0000000000000..aea3e7137e878 --- /dev/null +++ b/store/tikv/client_helper.go @@ -0,0 +1,93 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "time" + + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/store/tikv/util" +) + +// ClientHelper wraps LockResolver and RegionRequestSender. +// It's introduced to support the new lock resolving pattern in the large transaction. +// In the large transaction protocol, sending requests and resolving locks are +// context-dependent. For example, when a send request meets a secondary lock, we'll +// call ResolveLock, and if the lock belongs to a large transaction, we may retry +// the request. If there is no context information about the resolved locks, we'll +// meet the secondary lock again and run into a deadloop. +type ClientHelper struct { + lockResolver *LockResolver + regionCache *RegionCache + resolvedLocks *util.TSSet + client Client + resolveLite bool + RegionRequestRuntimeStats +} + +// NewClientHelper creates a helper instance. +func NewClientHelper(store *KVStore, resolvedLocks *util.TSSet) *ClientHelper { + return &ClientHelper{ + lockResolver: store.GetLockResolver(), + regionCache: store.GetRegionCache(), + resolvedLocks: resolvedLocks, + client: store.GetTiKVClient(), + } +} + +// ResolveLocks wraps the ResolveLocks function and store the resolved result. +func (ch *ClientHelper) ResolveLocks(bo *Backoffer, callerStartTS uint64, locks []*Lock) (int64, error) { + var err error + var resolvedLocks []uint64 + var msBeforeTxnExpired int64 + if ch.Stats != nil { + defer func(start time.Time) { + RecordRegionRequestRuntimeStats(ch.Stats, tikvrpc.CmdResolveLock, time.Since(start)) + }(time.Now()) + } + if ch.resolveLite { + msBeforeTxnExpired, resolvedLocks, err = ch.lockResolver.ResolveLocksLite(bo, callerStartTS, locks) + } else { + msBeforeTxnExpired, resolvedLocks, err = ch.lockResolver.ResolveLocks(bo, callerStartTS, locks) + } + if err != nil { + return msBeforeTxnExpired, err + } + if len(resolvedLocks) > 0 { + ch.resolvedLocks.Put(resolvedLocks...) + return 0, nil + } + return msBeforeTxnExpired, nil +} + +// SendReqCtx wraps the SendReqCtx function and use the resolved lock result in the kvrpcpb.Context. +func (ch *ClientHelper) SendReqCtx(bo *Backoffer, req *tikvrpc.Request, regionID RegionVerID, timeout time.Duration, sType kv.StoreType, directStoreAddr string, opts ...StoreSelectorOption) (*tikvrpc.Response, *RPCContext, string, error) { + sender := NewRegionRequestSender(ch.regionCache, ch.client) + if len(directStoreAddr) > 0 { + sender.SetStoreAddr(directStoreAddr) + } + sender.Stats = ch.Stats + req.Context.ResolvedLocks = ch.resolvedLocks.GetAll() + failpoint.Inject("assertStaleReadFlag", func(val failpoint.Value) { + if val.(bool) { + if len(opts) > 0 && !req.StaleRead { + panic("req.StaleRead shouldn't be false when opts is not empty") + } + } + }) + resp, ctx, err := sender.SendReqCtx(bo, req, regionID, timeout, sType, opts...) + return resp, ctx, sender.GetStoreAddr(), err +} diff --git a/store/tikv/client_test.go b/store/tikv/client_test.go index 7d2bde13a075b..1ce1326731fd4 100644 --- a/store/tikv/client_test.go +++ b/store/tikv/client_test.go @@ -25,7 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/tikvpb" - "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/store/tikv/config" "github.com/pingcap/tidb/store/tikv/tikvrpc" ) @@ -47,16 +47,16 @@ var _ = SerialSuites(&testClientFailSuite{}) var _ = SerialSuites(&testClientSerialSuite{}) func setMaxBatchSize(size uint) { - newConf := config.NewConfig() + newConf := config.DefaultConfig() newConf.TiKVClient.MaxBatchSize = size - config.StoreGlobalConfig(newConf) + config.StoreGlobalConfig(&newConf) } func (s *testClientSerialSuite) TestConn(c *C) { maxBatchSize := config.GetGlobalConfig().TiKVClient.MaxBatchSize setMaxBatchSize(0) - client := newRPCClient(config.Security{}) + client := NewRPCClient(config.Security{}) addr := "127.0.0.1:6379" conn1, err := client.getConnArray(addr, true) @@ -114,7 +114,7 @@ func (s *testClientSuite) TestSendWhenReconnect(c *C) { server, port := startMockTikvService() c.Assert(port > 0, IsTrue) - rpcClient := newRPCClient(config.Security{}) + rpcClient := NewRPCClient(config.Security{}) addr := fmt.Sprintf("%s:%d", "127.0.0.1", port) conn, err := rpcClient.getConnArray(addr, true) c.Assert(err, IsNil) diff --git a/store/tikv/commit.go b/store/tikv/commit.go index 9a4d28f30a8aa..495bbdffb52d2 100644 --- a/store/tikv/commit.go +++ b/store/tikv/commit.go @@ -19,9 +19,10 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" ) @@ -30,21 +31,19 @@ type actionCommit struct{ retry bool } var _ twoPhaseCommitAction = actionCommit{} -var tikvSecondaryLockCleanupFailureCounterCommit = metrics.TiKVSecondaryLockCleanupFailureCounter.WithLabelValues("commit") -var tiKVTxnRegionsNumHistogramCommit = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues(metricsTag("commit")) - func (actionCommit) String() string { return "commit" } func (actionCommit) tiKVTxnRegionsNumHistogram() prometheus.Observer { - return tiKVTxnRegionsNumHistogramCommit + return metrics.TxnRegionsNumHistogramCommit } func (actionCommit) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch batchMutations) error { + keys := batch.mutations.GetKeys() req := tikvrpc.NewRequest(tikvrpc.CmdCommit, &pb.CommitRequest{ StartVersion: c.startTS, - Keys: batch.mutations.keys, + Keys: keys, CommitVersion: c.commitTS, }, pb.Context{Priority: c.priority, SyncLog: c.syncLog}) @@ -100,7 +99,7 @@ func (actionCommit) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch } // Update commit ts and retry. - commitTS, err := c.store.getTimestampWithRetry(bo) + commitTS, err := c.store.getTimestampWithRetry(bo, c.txn.GetUnionStore().GetOption(kv.TxnScope).(string)) if err != nil { logutil.Logger(bo.ctx).Warn("2PC get commitTS failed", zap.Error(err), @@ -131,7 +130,7 @@ func (actionCommit) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch zap.Error(err), zap.Uint64("txnStartTS", c.startTS), zap.Uint64("commitTS", c.commitTS), - zap.Strings("keys", hexBatchKeys(batch.mutations.keys))) + zap.Strings("keys", hexBatchKeys(keys))) return errors.Trace(err) } // The transaction maybe rolled back by concurrent transactions. diff --git a/store/tikv/config/client.go b/store/tikv/config/client.go new file mode 100644 index 0000000000000..97dc281722093 --- /dev/null +++ b/store/tikv/config/client.go @@ -0,0 +1,143 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "fmt" + "time" + + "google.golang.org/grpc/encoding/gzip" +) + +const ( + // DefStoreLivenessTimeout is the default value for store liveness timeout. + DefStoreLivenessTimeout = "5s" +) + +// TiKVClient is the config for tikv client. +type TiKVClient struct { + // GrpcConnectionCount is the max gRPC connections that will be established + // with each tikv-server. + GrpcConnectionCount uint `toml:"grpc-connection-count" json:"grpc-connection-count"` + // After a duration of this time in seconds if the client doesn't see any activity it pings + // the server to see if the transport is still alive. + GrpcKeepAliveTime uint `toml:"grpc-keepalive-time" json:"grpc-keepalive-time"` + // After having pinged for keepalive check, the client waits for a duration of Timeout in seconds + // and if no activity is seen even after that the connection is closed. + GrpcKeepAliveTimeout uint `toml:"grpc-keepalive-timeout" json:"grpc-keepalive-timeout"` + // GrpcCompressionType is the compression type for gRPC channel: none or gzip. + GrpcCompressionType string `toml:"grpc-compression-type" json:"grpc-compression-type"` + // CommitTimeout is the max time which command 'commit' will wait. + CommitTimeout string `toml:"commit-timeout" json:"commit-timeout"` + AsyncCommit AsyncCommit `toml:"async-commit" json:"async-commit"` + // MaxBatchSize is the max batch size when calling batch commands API. + MaxBatchSize uint `toml:"max-batch-size" json:"max-batch-size"` + // If TiKV load is greater than this, TiDB will wait for a while to avoid little batch. + OverloadThreshold uint `toml:"overload-threshold" json:"overload-threshold"` + // MaxBatchWaitTime in nanosecond is the max wait time for batch. + MaxBatchWaitTime time.Duration `toml:"max-batch-wait-time" json:"max-batch-wait-time"` + // BatchWaitSize is the max wait size for batch. + BatchWaitSize uint `toml:"batch-wait-size" json:"batch-wait-size"` + // EnableChunkRPC indicate the data encode in chunk format for coprocessor requests. + EnableChunkRPC bool `toml:"enable-chunk-rpc" json:"enable-chunk-rpc"` + // If a Region has not been accessed for more than the given duration (in seconds), it + // will be reloaded from the PD. + RegionCacheTTL uint `toml:"region-cache-ttl" json:"region-cache-ttl"` + // If a store has been up to the limit, it will return error for successive request to + // prevent the store occupying too much token in dispatching level. + StoreLimit int64 `toml:"store-limit" json:"store-limit"` + // StoreLivenessTimeout is the timeout for store liveness check request. + StoreLivenessTimeout string `toml:"store-liveness-timeout" json:"store-liveness-timeout"` + CoprCache CoprocessorCache `toml:"copr-cache" json:"copr-cache"` + // TTLRefreshedTxnSize controls whether a transaction should update its TTL or not. + TTLRefreshedTxnSize int64 `toml:"ttl-refreshed-txn-size" json:"ttl-refreshed-txn-size"` +} + +// AsyncCommit is the config for the async commit feature. The switch to enable it is a system variable. +type AsyncCommit struct { + // Use async commit only if the number of keys does not exceed KeysLimit. + KeysLimit uint `toml:"keys-limit" json:"keys-limit"` + // Use async commit only if the total size of keys does not exceed TotalKeySizeLimit. + TotalKeySizeLimit uint64 `toml:"total-key-size-limit" json:"total-key-size-limit"` + // The duration within which is safe for async commit or 1PC to commit with an old schema. + // The following two fields should NOT be modified in most cases. If both async commit + // and 1PC are disabled in the whole cluster, they can be set to zero to avoid waiting in DDLs. + SafeWindow time.Duration `toml:"safe-window" json:"safe-window"` + // The duration in addition to SafeWindow to make DDL safe. + AllowedClockDrift time.Duration `toml:"allowed-clock-drift" json:"allowed-clock-drift"` +} + +// CoprocessorCache is the config for coprocessor cache. +type CoprocessorCache struct { + // The capacity in MB of the cache. Zero means disable coprocessor cache. + CapacityMB float64 `toml:"capacity-mb" json:"capacity-mb"` + + // No json fields for below config. Intend to hide them. + + // Only cache requests that containing small number of ranges. May to be changed in future. + AdmissionMaxRanges uint64 `toml:"admission-max-ranges" json:"-"` + // Only cache requests whose result set is small. + AdmissionMaxResultMB float64 `toml:"admission-max-result-mb" json:"-"` + // Only cache requests takes notable time to process. + AdmissionMinProcessMs uint64 `toml:"admission-min-process-ms" json:"-"` +} + +// DefaultTiKVClient returns default config for TiKVClient. +func DefaultTiKVClient() TiKVClient { + return TiKVClient{ + GrpcConnectionCount: 4, + GrpcKeepAliveTime: 10, + GrpcKeepAliveTimeout: 3, + GrpcCompressionType: "none", + CommitTimeout: "41s", + AsyncCommit: AsyncCommit{ + // FIXME: Find an appropriate default limit. + KeysLimit: 256, + TotalKeySizeLimit: 4 * 1024, // 4 KiB + SafeWindow: 2 * time.Second, + AllowedClockDrift: 500 * time.Millisecond, + }, + + MaxBatchSize: 128, + OverloadThreshold: 200, + MaxBatchWaitTime: 0, + BatchWaitSize: 8, + + EnableChunkRPC: true, + + RegionCacheTTL: 600, + StoreLimit: 0, + StoreLivenessTimeout: DefStoreLivenessTimeout, + + TTLRefreshedTxnSize: 32 * 1024 * 1024, + + CoprCache: CoprocessorCache{ + CapacityMB: 1000, + AdmissionMaxRanges: 500, + AdmissionMaxResultMB: 10, + AdmissionMinProcessMs: 5, + }, + } +} + +// Valid checks if this config is valid. +func (config *TiKVClient) Valid() error { + if config.GrpcConnectionCount == 0 { + return fmt.Errorf("grpc-connection-count should be greater than 0") + } + if config.GrpcCompressionType != "none" && config.GrpcCompressionType != gzip.Name { + return fmt.Errorf("grpc-compression-type should be none or %s, but got %s", gzip.Name, config.GrpcCompressionType) + } + return nil +} diff --git a/store/tikv/config/config.go b/store/tikv/config/config.go new file mode 100644 index 0000000000000..ee08e1bab4922 --- /dev/null +++ b/store/tikv/config/config.go @@ -0,0 +1,144 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "fmt" + "net/url" + "strings" + "sync/atomic" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/store/tikv/logutil" + "go.uber.org/zap" +) + +var ( + globalConf atomic.Value +) + +const ( + // DefStoresRefreshInterval is the default value of StoresRefreshInterval + DefStoresRefreshInterval = 60 +) + +// Config contains configuration options. +type Config struct { + CommitterConcurrency int + MaxTxnTTL uint64 + ServerMemoryQuota uint64 + TiKVClient TiKVClient + Security Security + PDClient PDClient + PessimisticTxn PessimisticTxn + TxnLocalLatches TxnLocalLatches + // StoresRefreshInterval indicates the interval of refreshing stores info, the unit is second. + StoresRefreshInterval uint64 + OpenTracingEnable bool + Path string +} + +// DefaultConfig returns the default configuration. +func DefaultConfig() Config { + return Config{ + CommitterConcurrency: 16, + MaxTxnTTL: 60 * 60 * 1000, // 1hour + ServerMemoryQuota: 0, + TiKVClient: DefaultTiKVClient(), + PDClient: DefaultPDClient(), + TxnLocalLatches: DefaultTxnLocalLatches(), + StoresRefreshInterval: DefStoresRefreshInterval, + OpenTracingEnable: false, + Path: "", + } +} + +// PDClient is the config for PD client. +type PDClient struct { + // PDServerTimeout is the max time which PD client will wait for the PD server in seconds. + PDServerTimeout uint `toml:"pd-server-timeout" json:"pd-server-timeout"` +} + +// DefaultPDClient returns the default configuration for PDClient +func DefaultPDClient() PDClient { + return PDClient{ + PDServerTimeout: 3, + } +} + +// TxnLocalLatches is the TxnLocalLatches section of the config. +type TxnLocalLatches struct { + Enabled bool `toml:"-" json:"-"` + Capacity uint `toml:"-" json:"-"` +} + +// DefaultTxnLocalLatches returns the default configuration for TxnLocalLatches +func DefaultTxnLocalLatches() TxnLocalLatches { + return TxnLocalLatches{ + Enabled: false, + Capacity: 0, + } +} + +// Valid returns true if the configuration is valid. +func (c *TxnLocalLatches) Valid() error { + if c.Enabled && c.Capacity == 0 { + return fmt.Errorf("txn-local-latches.capacity can not be 0") + } + return nil +} + +// PessimisticTxn is the config for pessimistic transaction. +type PessimisticTxn struct { + // The max count of retry for a single statement in a pessimistic transaction. + MaxRetryCount uint `toml:"max-retry-count" json:"max-retry-count"` +} + +// GetGlobalConfig returns the global configuration for this server. +// It should store configuration from command line and configuration file. +// Other parts of the system can read the global configuration use this function. +func GetGlobalConfig() *Config { + return globalConf.Load().(*Config) +} + +// StoreGlobalConfig stores a new config to the globalConf. It mostly uses in the test to avoid some data races. +func StoreGlobalConfig(config *Config) { + globalConf.Store(config) +} + +// ParsePath parses this path. +// Path example: tikv://etcd-node1:port,etcd-node2:port?cluster=1&disableGC=false +func ParsePath(path string) (etcdAddrs []string, disableGC bool, err error) { + var u *url.URL + u, err = url.Parse(path) + if err != nil { + err = errors.Trace(err) + return + } + if strings.ToLower(u.Scheme) != "tikv" { + err = errors.Errorf("Uri scheme expected [tikv] but found [%s]", u.Scheme) + logutil.BgLogger().Error("parsePath error", zap.Error(err)) + return + } + switch strings.ToLower(u.Query().Get("disableGC")) { + case "true": + disableGC = true + case "false", "": + default: + err = errors.New("disableGC flag should be true/false") + return + } + etcdAddrs = strings.Split(u.Host, ",") + return +} diff --git a/store/tikv/config/config_test.go b/store/tikv/config/config_test.go new file mode 100644 index 0000000000000..c8fc674fcd973 --- /dev/null +++ b/store/tikv/config/config_test.go @@ -0,0 +1,33 @@ +// Copyright 2017 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + . "github.com/pingcap/check" +) + +var _ = SerialSuites(&testConfigSuite{}) + +func (s *testConfigSuite) TestParsePath(c *C) { + etcdAddrs, disableGC, err := ParsePath("tikv://node1:2379,node2:2379") + c.Assert(err, IsNil) + c.Assert(etcdAddrs, DeepEquals, []string{"node1:2379", "node2:2379"}) + c.Assert(disableGC, IsFalse) + + _, _, err = ParsePath("tikv://node1:2379") + c.Assert(err, IsNil) + _, disableGC, err = ParsePath("tikv://node1:2379?disableGC=true") + c.Assert(err, IsNil) + c.Assert(disableGC, IsTrue) +} diff --git a/store/tikv/config/security.go b/store/tikv/config/security.go new file mode 100644 index 0000000000000..4cb414c050675 --- /dev/null +++ b/store/tikv/config/security.go @@ -0,0 +1,85 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "crypto/tls" + "crypto/x509" + "io/ioutil" + + "github.com/pingcap/errors" +) + +// Security is the security section of the config. +type Security struct { + ClusterSSLCA string `toml:"cluster-ssl-ca" json:"cluster-ssl-ca"` + ClusterSSLCert string `toml:"cluster-ssl-cert" json:"cluster-ssl-cert"` + ClusterSSLKey string `toml:"cluster-ssl-key" json:"cluster-ssl-key"` + ClusterVerifyCN []string `toml:"cluster-verify-cn" json:"cluster-verify-cn"` +} + +// NewSecurity creates a Security. +func NewSecurity(sslCA, sslCert, sslKey string, verityCN []string) Security { + return Security{ + ClusterSSLCA: sslCA, + ClusterSSLCert: sslCert, + ClusterSSLKey: sslKey, + ClusterVerifyCN: verityCN, + } +} + +// ToTLSConfig generates tls's config based on security section of the config. +func (s *Security) ToTLSConfig() (tlsConfig *tls.Config, err error) { + if len(s.ClusterSSLCA) != 0 { + certPool := x509.NewCertPool() + // Create a certificate pool from the certificate authority + var ca []byte + ca, err = ioutil.ReadFile(s.ClusterSSLCA) + if err != nil { + err = errors.Errorf("could not read ca certificate: %s", err) + return + } + // Append the certificates from the CA + if !certPool.AppendCertsFromPEM(ca) { + err = errors.New("failed to append ca certs") + return + } + tlsConfig = &tls.Config{ + RootCAs: certPool, + ClientCAs: certPool, + } + + if len(s.ClusterSSLCert) != 0 && len(s.ClusterSSLKey) != 0 { + getCert := func() (*tls.Certificate, error) { + // Load the client certificates from disk + cert, err := tls.LoadX509KeyPair(s.ClusterSSLCert, s.ClusterSSLKey) + if err != nil { + return nil, errors.Errorf("could not load client key pair: %s", err) + } + return &cert, nil + } + // pre-test cert's loading. + if _, err = getCert(); err != nil { + return + } + tlsConfig.GetClientCertificate = func(info *tls.CertificateRequestInfo) (certificate *tls.Certificate, err error) { + return getCert() + } + tlsConfig.GetCertificate = func(info *tls.ClientHelloInfo) (certificate *tls.Certificate, err error) { + return getCert() + } + } + } + return +} diff --git a/store/tikv/config/security_test.go b/store/tikv/config/security_test.go new file mode 100644 index 0000000000000..ad08c5b39452b --- /dev/null +++ b/store/tikv/config/security_test.go @@ -0,0 +1,113 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "os" + "path/filepath" + "runtime" + "testing" + + . "github.com/pingcap/check" +) + +var _ = SerialSuites(&testConfigSuite{}) + +type testConfigSuite struct{} + +func TestT(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +func (s *testConfigSuite) TestConfig(c *C) { + // Test for TLS config. + certFile := "cert.pem" + _, localFile, _, _ := runtime.Caller(0) + certFile = filepath.Join(filepath.Dir(localFile), certFile) + f, err := os.Create(certFile) + c.Assert(err, IsNil) + _, err = f.WriteString(`-----BEGIN CERTIFICATE----- +MIIC+jCCAeKgAwIBAgIRALsvlisKJzXtiwKcv7toreswDQYJKoZIhvcNAQELBQAw +EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0xOTAzMTMwNzExNDhaFw0yMDAzMTIwNzEx +NDhaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDECyY5cZ4SccQdk4XCgENwOLsE92uZvutBcYHk8ndIpxuxQnmS/2af +JxWlduKgauuLlwRYrzwvmUQumzB0LIJIwZN37KMeepTv+cf1Iv0U1Tw2PyXa7jD1 +VxccI7lHxqObYrnLdZ1AOG2SyWoJp/g6jZqbdGnYAbBxbZXYv9FyA6h0FksDysEP +62zu5YwtRcmhob7L5Wezq0/eV/2U1WdbGGWMCUs2LKQav4TP7Kaopk+MAl9UpSoc +arl+NGxs39TsvrxQvT7k/W6g7mo0rOc5PEc6Zho2+E8JjnEYCdGKmMW/Bea6V1yc +ShMe79lwN7ISCw3e7GZhZGM2XFTjvhH/AgMBAAGjSzBJMA4GA1UdDwEB/wQEAwIF +oDATBgNVHSUEDDAKBggrBgEFBQcDATAMBgNVHRMBAf8EAjAAMBQGA1UdEQQNMAuC +CWxvY2FsaG9zdDANBgkqhkiG9w0BAQsFAAOCAQEAK+pS76DxAbQBdbpyqt0Xi1QY +SnWxFEFepP3pHC28oy8fzHiys9fwMvJwgMgLcwyB9GUhMZ/xsO2ehutWbzYCCRmV +4einEx9Ipr26i2txzZPphqXNkV+ZhPeQK54fWrzAkRq4qKNyoYfvhldZ+uTuKNiS +If0KbvbS6qDfimA+m0m6n5yDzc5tPl+kgKyeivSyqeG7T9m40gvCLAMgI7iTFhIZ +BvUPi88z3wGa8rmhn9dOvkwauLFU5i5dqoz6m9HXmaEKzAAigGzgU8vPDt/Dxxgu +c933WW1E0hCtvuGxWFIFtoJMQoyH0Pl4ACmY/6CokCCZKDInrPdhhf3MGRjkkw== +-----END CERTIFICATE----- +`) + c.Assert(err, IsNil) + c.Assert(f.Close(), IsNil) + + keyFile := "key.pem" + keyFile = filepath.Join(filepath.Dir(localFile), keyFile) + f, err = os.Create(keyFile) + c.Assert(err, IsNil) + _, err = f.WriteString(`-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEAxAsmOXGeEnHEHZOFwoBDcDi7BPdrmb7rQXGB5PJ3SKcbsUJ5 +kv9mnycVpXbioGrri5cEWK88L5lELpswdCyCSMGTd+yjHnqU7/nH9SL9FNU8Nj8l +2u4w9VcXHCO5R8ajm2K5y3WdQDhtkslqCaf4Oo2am3Rp2AGwcW2V2L/RcgOodBZL +A8rBD+ts7uWMLUXJoaG+y+Vns6tP3lf9lNVnWxhljAlLNiykGr+Ez+ymqKZPjAJf +VKUqHGq5fjRsbN/U7L68UL0+5P1uoO5qNKznOTxHOmYaNvhPCY5xGAnRipjFvwXm +uldcnEoTHu/ZcDeyEgsN3uxmYWRjNlxU474R/wIDAQABAoIBAGyZAIOxvK7a9pir +r90e0DzKME9//8sbR5bpGduJtSo558051b7oXCCttgAC62eR0wlwjqfR6rUzYeGv +dhfk0AcdtGMqYvHvVbHZ3DqfNzLjLIegU4gDintd0x9zap+oGdlpxyI99O4uVASM +LoFK2ucUqiCTTE6sIOG0ot1+5LcS9xlygmmBfl8Q+6dG1D+vtPlU4J1kQ1MZV/JI +01Mbea4iiUKD9qrbxfsMiu52u/J3MMoWJHsvAA/LpOp2Ua6pUECluZECslxYSnJJ +IyjeGYxAIfXj81bqBk3RpemlX7YAxMbn6noZPQ6KUzS4IT2clrG10boCBdUNK1pN +WjVOEoECgYEA0/aP1wvrC3sZtHmURHv1El0vmaZocmH3sdwUfrW5cMqqhOosax6d +5iKAJQ1cAL6ZivIB4WJ3X8mlfMOaHPOQxqdudPui0sMHQehT2NBl/gwX9wXMwxXl +t+ebqK5DSSbVuJQS45sSdYPQvrMVDB/owHHjfdeOk1EwmqxHv1r338UCgYEA7MXk +IIF+LETxkw4QqbEPzwJ8kVRjkU3jmlEClOatTe+RQJxanErgMiGi9NZMM+Vm5GjC +5kzAuNgMDuD/NAWyzPzWd+mbeG/2IHYf44OiK1TmnFHkTc0JW7s4tUQgDMQccheR +EgA3UDGU9aevUoUDUhpeXxBdtnf66qw0e1cSovMCgYBLJdg7UsNjT6J+ZLhXS2dI +unb8z42qN+d8TF2LytvTDFdGRku3MqSiicrK2CCtNuXy5/gYszNFZ5VfVW3XI9dJ +RuUXXnuMo454JGlNrhzq49i/QHQnGiVWfSunsxix363YAc9smHcD6NbiNVWZ9dos +GHSiEgE/Y4KK49eQFS1aTQKBgQC+xzznTC+j7/FOcjjO4hJA1FoWp46Kl93ai4eu +/qeJcozxKIqCAHrhKeUprjo8Xo0nYZoZAqMOzVX57yTyf9zv+pG8kQhqZJxGz6cm +JPxYOdKPBhUU8y6lMReiRsAkSSg6be7AOFhZT3oc7f4AWZixYPnFU2SPD+GnkRXA +hApKLQKBgHUG+SjrxQjiFipE52YNGFLzbMR6Uga4baACW05uGPpao/+MkCGRAidL +d/8eU66iPNt/23iVAbqkF8mRpCxC0+O5HRqTEzgrlWKabXfmhYqIVjq+tkonJ0NU +xkNuJ2BlEGkwWLiRbKy1lNBBFUXKuhh3L/EIY10WTnr3TQzeL6H1 +-----END RSA PRIVATE KEY----- +`) + c.Assert(err, IsNil) + c.Assert(f.Close(), IsNil) + security := Security{ + ClusterSSLCA: certFile, + ClusterSSLCert: certFile, + ClusterSSLKey: keyFile, + } + + tlsConfig, err := security.ToTLSConfig() + c.Assert(err, IsNil) + c.Assert(tlsConfig, NotNil) + + // Note that on windows, we can't Remove a file if the file is not closed. + // The behavior is different on linux, we can always Remove a file even + // if it's open. The OS maintains a reference count for open/close, the file + // is recycled when the reference count drops to 0. + c.Assert(os.Remove(certFile), IsNil) + c.Assert(os.Remove(keyFile), IsNil) +} diff --git a/store/tikv/delete_range_test.go b/store/tikv/delete_range_test.go index bf14d221617fe..533749b0f6d2f 100644 --- a/store/tikv/delete_range_test.go +++ b/store/tikv/delete_range_test.go @@ -20,14 +20,14 @@ import ( "sort" . "github.com/pingcap/check" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" ) type testDeleteRangeSuite struct { OneByOneSuite cluster cluster.Cluster - store *tikvStore + store *KVStore } var _ = Suite(&testDeleteRangeSuite{}) @@ -50,7 +50,7 @@ func (s *testDeleteRangeSuite) SetUpTest(c *C) { // ) // c.Assert(err, IsNil) - s.store = store.(*tikvStore) + s.store = store } func (s *testDeleteRangeSuite) TearDownTest(c *C) { diff --git a/store/tikv/error.go b/store/tikv/error.go index e18cdde9ec96d..33521d62c15bf 100644 --- a/store/tikv/error.go +++ b/store/tikv/error.go @@ -17,15 +17,15 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/pdpb" - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) var ( // ErrBodyMissing response body is missing error ErrBodyMissing = errors.New("response body is missing") - // When TiDB is closing and send request to tikv fail, do not retry, return this error. - errTiDBShuttingDown = errors.New("tidb server shutting down") + // ErrTiDBShuttingDown is returned when TiDB is closing and send request to tikv fail, do not retry. + ErrTiDBShuttingDown = errors.New("tidb server shutting down") ) // mismatchClusterID represents the message that the cluster ID of the PD client does not match the PD. @@ -33,27 +33,29 @@ const mismatchClusterID = "mismatch cluster id" // MySQL error instances. var ( - ErrTiKVServerTimeout = terror.ClassTiKV.New(mysql.ErrTiKVServerTimeout, mysql.MySQLErrName[mysql.ErrTiKVServerTimeout]) - ErrResolveLockTimeout = terror.ClassTiKV.New(mysql.ErrResolveLockTimeout, mysql.MySQLErrName[mysql.ErrResolveLockTimeout]) - ErrPDServerTimeout = terror.ClassTiKV.New(mysql.ErrPDServerTimeout, mysql.MySQLErrName[mysql.ErrPDServerTimeout]) - ErrRegionUnavailable = terror.ClassTiKV.New(mysql.ErrRegionUnavailable, mysql.MySQLErrName[mysql.ErrRegionUnavailable]) - ErrTiKVServerBusy = terror.ClassTiKV.New(mysql.ErrTiKVServerBusy, mysql.MySQLErrName[mysql.ErrTiKVServerBusy]) - ErrTiKVStaleCommand = terror.ClassTiKV.New(mysql.ErrTiKVStaleCommand, mysql.MySQLErrName[mysql.ErrTiKVStaleCommand]) - ErrTiKVMaxTimestampNotSynced = terror.ClassTiKV.New(mysql.ErrTiKVMaxTimestampNotSynced, mysql.MySQLErrName[mysql.ErrTiKVMaxTimestampNotSynced]) - ErrGCTooEarly = terror.ClassTiKV.New(mysql.ErrGCTooEarly, mysql.MySQLErrName[mysql.ErrGCTooEarly]) - ErrQueryInterrupted = terror.ClassTiKV.New(mysql.ErrQueryInterrupted, mysql.MySQLErrName[mysql.ErrQueryInterrupted]) - ErrLockAcquireFailAndNoWaitSet = terror.ClassTiKV.New(mysql.ErrLockAcquireFailAndNoWaitSet, mysql.MySQLErrName[mysql.ErrLockAcquireFailAndNoWaitSet]) - ErrLockWaitTimeout = terror.ClassTiKV.New(mysql.ErrLockWaitTimeout, mysql.MySQLErrName[mysql.ErrLockWaitTimeout]) - ErrTokenLimit = terror.ClassTiKV.New(mysql.ErrTiKVStoreLimit, mysql.MySQLErrName[mysql.ErrTiKVStoreLimit]) - ErrLockExpire = terror.ClassTiKV.New(mysql.ErrLockExpire, mysql.MySQLErrName[mysql.ErrLockExpire]) - ErrUnknown = terror.ClassTiKV.New(mysql.ErrUnknown, mysql.MySQLErrName[mysql.ErrUnknown]) + ErrTiKVServerTimeout = dbterror.ClassTiKV.NewStd(mysql.ErrTiKVServerTimeout) + ErrTiFlashServerTimeout = dbterror.ClassTiKV.NewStd(mysql.ErrTiFlashServerTimeout) + ErrResolveLockTimeout = dbterror.ClassTiKV.NewStd(mysql.ErrResolveLockTimeout) + ErrPDServerTimeout = dbterror.ClassTiKV.NewStd(mysql.ErrPDServerTimeout) + ErrRegionUnavailable = dbterror.ClassTiKV.NewStd(mysql.ErrRegionUnavailable) + ErrTiKVServerBusy = dbterror.ClassTiKV.NewStd(mysql.ErrTiKVServerBusy) + ErrTiFlashServerBusy = dbterror.ClassTiKV.NewStd(mysql.ErrTiFlashServerBusy) + ErrTiKVStaleCommand = dbterror.ClassTiKV.NewStd(mysql.ErrTiKVStaleCommand) + ErrTiKVMaxTimestampNotSynced = dbterror.ClassTiKV.NewStd(mysql.ErrTiKVMaxTimestampNotSynced) + ErrGCTooEarly = dbterror.ClassTiKV.NewStd(mysql.ErrGCTooEarly) + ErrQueryInterrupted = dbterror.ClassTiKV.NewStd(mysql.ErrQueryInterrupted) + ErrLockAcquireFailAndNoWaitSet = dbterror.ClassTiKV.NewStd(mysql.ErrLockAcquireFailAndNoWaitSet) + ErrLockWaitTimeout = dbterror.ClassTiKV.NewStd(mysql.ErrLockWaitTimeout) + ErrTokenLimit = dbterror.ClassTiKV.NewStd(mysql.ErrTiKVStoreLimit) + ErrLockExpire = dbterror.ClassTiKV.NewStd(mysql.ErrLockExpire) + ErrUnknown = dbterror.ClassTiKV.NewStd(mysql.ErrUnknown) ) // Registers error returned from TiKV. var ( - _ = terror.ClassTiKV.NewStd(mysql.ErrDataOutOfRange) - _ = terror.ClassTiKV.NewStd(mysql.ErrTruncatedWrongValue) - _ = terror.ClassTiKV.NewStd(mysql.ErrDivisionByZero) + _ = dbterror.ClassTiKV.NewStd(mysql.ErrDataOutOfRange) + _ = dbterror.ClassTiKV.NewStd(mysql.ErrTruncatedWrongValue) + _ = dbterror.ClassTiKV.NewStd(mysql.ErrDivisionByZero) ) // ErrDeadlock wraps *kvrpcpb.Deadlock to implement the error interface. @@ -75,3 +77,12 @@ type PDError struct { func (d *PDError) Error() string { return d.Err.String() } + +// ErrKeyExist wraps *pdpb.AlreadyExist to implement the error interface. +type ErrKeyExist struct { + *kvrpcpb.AlreadyExist +} + +func (k *ErrKeyExist) Error() string { + return k.AlreadyExist.String() +} diff --git a/store/tikv/failpoint.go b/store/tikv/failpoint.go new file mode 100644 index 0000000000000..4e0094c445370 --- /dev/null +++ b/store/tikv/failpoint.go @@ -0,0 +1,27 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "github.com/pingcap/failpoint" +) + +var ( + // MockRetryableErrorResp mocks an retryable error while processing response + MockRetryableErrorResp failpoint.Failpoint + // MockScatterRegionTimeout mocks timeout when trying to scatter region + MockScatterRegionTimeout failpoint.Failpoint + // MockSplitRegionTimeout mocks timeout when trying to split region + MockSplitRegionTimeout failpoint.Failpoint +) diff --git a/store/tikv/interface.go b/store/tikv/interface.go index 426a73a235981..507cce87535f0 100644 --- a/store/tikv/interface.go +++ b/store/tikv/interface.go @@ -14,18 +14,15 @@ package tikv import ( + "context" "time" - "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/tikv/pd/client" ) // Storage represent the kv.Storage runs on TiKV. type Storage interface { - kv.Storage - // GetRegionCache gets the RegionCache. GetRegionCache() *RegionCache @@ -41,9 +38,6 @@ type Storage interface { // UpdateSPCache updates the cache of safe point. UpdateSPCache(cachedSP uint64, cachedTime time.Time) - // GetGCHandler gets the GCHandler. - GetGCHandler() GCHandler - // SetOracle sets the Oracle. SetOracle(oracle oracle.Oracle) @@ -55,17 +49,17 @@ type Storage interface { // Closed returns the closed channel. Closed() <-chan struct{} -} -// GCHandler runs garbage collection job. -type GCHandler interface { - // Start starts the GCHandler. - Start() - - // Close closes the GCHandler. - Close() + // Close store + Close() error + // UUID return a unique ID which represents a Storage. + UUID() string + // CurrentTimestamp returns current timestamp with the given txnScope (local or global). + CurrentTimestamp(txnScope string) (uint64, error) + // GetOracle gets a timestamp oracle client. + GetOracle() oracle.Oracle + // SupportDeleteRange gets the storage support delete range or not. + SupportDeleteRange() (supported bool) + // ShowStatus returns the specified status of the storage + ShowStatus(ctx context.Context, key string) (interface{}, error) } - -// NewGCHandlerFunc creates a new GCHandler. -// To enable real GC, we should assign the function to `gcworker.NewGCWorker`. -var NewGCHandlerFunc func(storage Storage, pdClient pd.Client) (GCHandler, error) diff --git a/store/tikv/isolation_test.go b/store/tikv/isolation_test.go index d8dd333201cde..7e1561d2d0869 100644 --- a/store/tikv/isolation_test.go +++ b/store/tikv/isolation_test.go @@ -30,14 +30,14 @@ import ( // The test suite takes too long under the race detector. type testIsolationSuite struct { OneByOneSuite - store *tikvStore + store *KVStore } var _ = Suite(&testIsolationSuite{}) func (s *testIsolationSuite) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) } func (s *testIsolationSuite) TearDownSuite(c *C) { @@ -68,7 +68,7 @@ func (s *testIsolationSuite) SetWithRetry(c *C, k, v []byte) writeRecord { if err == nil { return writeRecord{ startTS: txn.StartTS(), - commitTS: txn.(*tikvTxn).commitTS, + commitTS: txn.commitTS, } } } diff --git a/store/tikv/key_ranges.go b/store/tikv/key_ranges.go new file mode 100644 index 0000000000000..fd52496634240 --- /dev/null +++ b/store/tikv/key_ranges.go @@ -0,0 +1,210 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "bytes" + "fmt" + "sort" + + "github.com/pingcap/errors" + "github.com/pingcap/kvproto/pkg/coprocessor" + "github.com/pingcap/tidb/kv" +) + +// KeyRanges is like []kv.KeyRange, but may has extra elements at head/tail. +// It's for avoiding alloc big slice during build copTask. +type KeyRanges struct { + first *kv.KeyRange + mid []kv.KeyRange + last *kv.KeyRange +} + +// NewKeyRanges constructs a KeyRanges instance. +func NewKeyRanges(ranges []kv.KeyRange) *KeyRanges { + return &KeyRanges{mid: ranges} +} + +func (r *KeyRanges) String() string { + var s string + r.Do(func(ran *kv.KeyRange) { + s += fmt.Sprintf("[%q, %q]", ran.StartKey, ran.EndKey) + }) + return s +} + +// Len returns the count of ranges. +func (r *KeyRanges) Len() int { + var l int + if r.first != nil { + l++ + } + l += len(r.mid) + if r.last != nil { + l++ + } + return l +} + +// At returns the range at the ith position. +func (r *KeyRanges) At(i int) kv.KeyRange { + if r.first != nil { + if i == 0 { + return *r.first + } + i-- + } + if i < len(r.mid) { + return r.mid[i] + } + return *r.last +} + +// Slice returns the sub ranges [from, to). +func (r *KeyRanges) Slice(from, to int) *KeyRanges { + var ran KeyRanges + if r.first != nil { + if from == 0 && to > 0 { + ran.first = r.first + } + if from > 0 { + from-- + } + if to > 0 { + to-- + } + } + if to <= len(r.mid) { + ran.mid = r.mid[from:to] + } else { + if from <= len(r.mid) { + ran.mid = r.mid[from:] + } + if from < to { + ran.last = r.last + } + } + return &ran +} + +// Do applies a functions to all ranges. +func (r *KeyRanges) Do(f func(ran *kv.KeyRange)) { + if r.first != nil { + f(r.first) + } + for _, ran := range r.mid { + f(&ran) + } + if r.last != nil { + f(r.last) + } +} + +// Split ranges into (left, right) by key. +func (r *KeyRanges) Split(key []byte) (*KeyRanges, *KeyRanges) { + n := sort.Search(r.Len(), func(i int) bool { + cur := r.At(i) + return len(cur.EndKey) == 0 || bytes.Compare(cur.EndKey, key) > 0 + }) + // If a range p contains the key, it will split to 2 parts. + if n < r.Len() { + p := r.At(n) + if bytes.Compare(key, p.StartKey) > 0 { + left := r.Slice(0, n) + left.last = &kv.KeyRange{StartKey: p.StartKey, EndKey: key} + right := r.Slice(n+1, r.Len()) + right.first = &kv.KeyRange{StartKey: key, EndKey: p.EndKey} + return left, right + } + } + return r.Slice(0, n), r.Slice(n, r.Len()) +} + +// ToPBRanges converts ranges to wire type. +func (r *KeyRanges) ToPBRanges() []*coprocessor.KeyRange { + ranges := make([]*coprocessor.KeyRange, 0, r.Len()) + r.Do(func(ran *kv.KeyRange) { + ranges = append(ranges, &coprocessor.KeyRange{ + Start: ran.StartKey, + End: ran.EndKey, + }) + }) + return ranges +} + +// SplitRegionRanges get the split ranges from pd region. +func SplitRegionRanges(bo *Backoffer, cache *RegionCache, keyRanges []kv.KeyRange) ([]kv.KeyRange, error) { + ranges := NewKeyRanges(keyRanges) + + var ret []kv.KeyRange + appendRange := func(regionWithRangeInfo *KeyLocation, ranges *KeyRanges) { + for i := 0; i < ranges.Len(); i++ { + ret = append(ret, ranges.At(i)) + } + } + + err := SplitKeyRanges(bo, cache, ranges, appendRange) + if err != nil { + return nil, errors.Trace(err) + } + return ret, nil +} + +// SplitKeyRanges splits KeyRanges by the regions info from cache. +func SplitKeyRanges(bo *Backoffer, cache *RegionCache, ranges *KeyRanges, fn func(regionWithRangeInfo *KeyLocation, ranges *KeyRanges)) error { + for ranges.Len() > 0 { + loc, err := cache.LocateKey(bo, ranges.At(0).StartKey) + if err != nil { + return errors.Trace(err) + } + + // Iterate to the first range that is not complete in the region. + var i int + for ; i < ranges.Len(); i++ { + r := ranges.At(i) + if !(loc.Contains(r.EndKey) || bytes.Equal(loc.EndKey, r.EndKey)) { + break + } + } + // All rest ranges belong to the same region. + if i == ranges.Len() { + fn(loc, ranges) + break + } + + r := ranges.At(i) + if loc.Contains(r.StartKey) { + // Part of r is not in the region. We need to split it. + taskRanges := ranges.Slice(0, i) + taskRanges.last = &kv.KeyRange{ + StartKey: r.StartKey, + EndKey: loc.EndKey, + } + fn(loc, taskRanges) + + ranges = ranges.Slice(i+1, ranges.Len()) + ranges.first = &kv.KeyRange{ + StartKey: loc.EndKey, + EndKey: r.EndKey, + } + } else { + // rs[i] is not in the region. + taskRanges := ranges.Slice(0, i) + fn(loc, taskRanges) + ranges = ranges.Slice(i, ranges.Len()) + } + } + + return nil +} diff --git a/store/tikv/key_ranges_test.go b/store/tikv/key_ranges_test.go new file mode 100644 index 0000000000000..6478c607693e9 --- /dev/null +++ b/store/tikv/key_ranges_test.go @@ -0,0 +1,143 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/kv" +) + +type testKeyRangesSuite struct { +} + +var _ = Suite(&testKeyRangesSuite{}) + +func (s *testKeyRangesSuite) TestCopRanges(c *C) { + ranges := []kv.KeyRange{ + {StartKey: []byte("a"), EndKey: []byte("b")}, + {StartKey: []byte("c"), EndKey: []byte("d")}, + {StartKey: []byte("e"), EndKey: []byte("f")}, + } + + s.checkEqual(c, &KeyRanges{mid: ranges}, ranges, true) + s.checkEqual(c, &KeyRanges{first: &ranges[0], mid: ranges[1:]}, ranges, true) + s.checkEqual(c, &KeyRanges{mid: ranges[:2], last: &ranges[2]}, ranges, true) + s.checkEqual(c, &KeyRanges{first: &ranges[0], mid: ranges[1:2], last: &ranges[2]}, ranges, true) +} + +func (s *testKeyRangesSuite) TestCopRangeSplit(c *C) { + first := &kv.KeyRange{StartKey: []byte("a"), EndKey: []byte("b")} + mid := []kv.KeyRange{ + {StartKey: []byte("c"), EndKey: []byte("d")}, + {StartKey: []byte("e"), EndKey: []byte("g")}, + {StartKey: []byte("l"), EndKey: []byte("o")}, + } + last := &kv.KeyRange{StartKey: []byte("q"), EndKey: []byte("t")} + left := true + right := false + + // input range: [c-d) [e-g) [l-o) + ranges := &KeyRanges{mid: mid} + s.testSplit(c, ranges, right, + splitCase{"c", buildCopRanges("c", "d", "e", "g", "l", "o")}, + splitCase{"d", buildCopRanges("e", "g", "l", "o")}, + splitCase{"f", buildCopRanges("f", "g", "l", "o")}, + ) + + // input range: [a-b) [c-d) [e-g) [l-o) + ranges = &KeyRanges{first: first, mid: mid} + s.testSplit(c, ranges, right, + splitCase{"a", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, + splitCase{"c", buildCopRanges("c", "d", "e", "g", "l", "o")}, + splitCase{"m", buildCopRanges("m", "o")}, + ) + + // input range: [a-b) [c-d) [e-g) [l-o) [q-t) + ranges = &KeyRanges{first: first, mid: mid, last: last} + s.testSplit(c, ranges, right, + splitCase{"f", buildCopRanges("f", "g", "l", "o", "q", "t")}, + splitCase{"h", buildCopRanges("l", "o", "q", "t")}, + splitCase{"r", buildCopRanges("r", "t")}, + ) + + // input range: [c-d) [e-g) [l-o) + ranges = &KeyRanges{mid: mid} + s.testSplit(c, ranges, left, + splitCase{"m", buildCopRanges("c", "d", "e", "g", "l", "m")}, + splitCase{"g", buildCopRanges("c", "d", "e", "g")}, + splitCase{"g", buildCopRanges("c", "d", "e", "g")}, + ) + + // input range: [a-b) [c-d) [e-g) [l-o) + ranges = &KeyRanges{first: first, mid: mid} + s.testSplit(c, ranges, left, + splitCase{"d", buildCopRanges("a", "b", "c", "d")}, + splitCase{"d", buildCopRanges("a", "b", "c", "d")}, + splitCase{"o", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, + ) + + // input range: [a-b) [c-d) [e-g) [l-o) [q-t) + ranges = &KeyRanges{first: first, mid: mid, last: last} + s.testSplit(c, ranges, left, + splitCase{"o", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, + splitCase{"p", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o")}, + splitCase{"t", buildCopRanges("a", "b", "c", "d", "e", "g", "l", "o", "q", "t")}, + ) +} + +func (s *testKeyRangesSuite) checkEqual(c *C, copRanges *KeyRanges, ranges []kv.KeyRange, slice bool) { + c.Assert(copRanges.Len(), Equals, len(ranges)) + for i := range ranges { + c.Assert(copRanges.At(i), DeepEquals, ranges[i]) + } + if slice { + for i := 0; i <= copRanges.Len(); i++ { + for j := i; j <= copRanges.Len(); j++ { + s.checkEqual(c, copRanges.Slice(i, j), ranges[i:j], false) + } + } + } +} + +type splitCase struct { + key string + *KeyRanges +} + +func (s *testKeyRangesSuite) testSplit(c *C, ranges *KeyRanges, checkLeft bool, cases ...splitCase) { + for _, t := range cases { + left, right := ranges.Split([]byte(t.key)) + expect := t.KeyRanges + if checkLeft { + s.checkEqual(c, left, expect.mid, false) + } else { + s.checkEqual(c, right, expect.mid, false) + } + } +} + +func buildKeyRanges(keys ...string) []kv.KeyRange { + var ranges []kv.KeyRange + for i := 0; i < len(keys); i += 2 { + ranges = append(ranges, kv.KeyRange{ + StartKey: []byte(keys[i]), + EndKey: []byte(keys[i+1]), + }) + } + return ranges +} + +func buildCopRanges(keys ...string) *KeyRanges { + return NewKeyRanges(buildKeyRanges(keys...)) +} diff --git a/store/tikv/kv.go b/store/tikv/kv.go index 6b9b7f11971f4..549b3211d4c53 100644 --- a/store/tikv/kv.go +++ b/store/tikv/kv.go @@ -16,9 +16,7 @@ package tikv import ( "context" "crypto/tls" - "fmt" "math/rand" - "net/url" "sync" "sync/atomic" "time" @@ -26,34 +24,19 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" "github.com/pingcap/tidb/store/tikv/latch" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/oracle/oracles" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/fastrand" - "github.com/pingcap/tidb/util/logutil" pd "github.com/tikv/pd/client" "go.etcd.io/etcd/clientv3" "go.uber.org/zap" - "google.golang.org/grpc" - "google.golang.org/grpc/keepalive" ) -type storeCache struct { - sync.Mutex - cache map[string]*tikvStore -} - -var mc storeCache - -// Driver implements engine Driver. -type Driver struct { -} - func createEtcdKV(addrs []string, tlsConfig *tls.Config) (*clientv3.Client, error) { cfg := config.GetGlobalConfig() cli, err := clientv3.New(clientv3.Config{ @@ -70,92 +53,21 @@ func createEtcdKV(addrs []string, tlsConfig *tls.Config) (*clientv3.Client, erro return cli, nil } -// Open opens or creates an TiKV storage with given path. -// Path example: tikv://etcd-node1:port,etcd-node2:port?cluster=1&disableGC=false -func (d Driver) Open(path string) (kv.Storage, error) { - mc.Lock() - defer mc.Unlock() - - security := config.GetGlobalConfig().Security - tikvConfig := config.GetGlobalConfig().TiKVClient - txnLocalLatches := config.GetGlobalConfig().TxnLocalLatches - etcdAddrs, disableGC, err := config.ParsePath(path) - if err != nil { - return nil, errors.Trace(err) - } - - pdCli, err := pd.NewClient(etcdAddrs, pd.SecurityOption{ - CAPath: security.ClusterSSLCA, - CertPath: security.ClusterSSLCert, - KeyPath: security.ClusterSSLKey, - }, pd.WithGRPCDialOptions( - grpc.WithKeepaliveParams(keepalive.ClientParameters{ - Time: time.Duration(tikvConfig.GrpcKeepAliveTime) * time.Second, - Timeout: time.Duration(tikvConfig.GrpcKeepAliveTimeout) * time.Second, - }), - )) - pdCli = execdetails.InterceptedPDClient{Client: pdCli} - - if err != nil { - return nil, errors.Trace(err) - } - - // FIXME: uuid will be a very long and ugly string, simplify it. - uuid := fmt.Sprintf("tikv-%v", pdCli.GetClusterID(context.TODO())) - if store, ok := mc.cache[uuid]; ok { - return store, nil - } - - tlsConfig, err := security.ToTLSConfig() - if err != nil { - return nil, errors.Trace(err) - } - - spkv, err := NewEtcdSafePointKV(etcdAddrs, tlsConfig) - if err != nil { - return nil, errors.Trace(err) - } - - coprCacheConfig := &config.GetGlobalConfig().TiKVClient.CoprCache - s, err := newTikvStore(uuid, &codecPDClient{pdCli}, spkv, newRPCClient(security), !disableGC, coprCacheConfig) - if err != nil { - return nil, errors.Trace(err) - } - if txnLocalLatches.Enabled { - s.EnableTxnLocalLatches(txnLocalLatches.Capacity) - } - s.etcdAddrs = etcdAddrs - s.tlsConfig = tlsConfig - - mc.cache[uuid] = s - return s, nil -} - -// EtcdBackend is used for judging a storage is a real TiKV. -type EtcdBackend interface { - EtcdAddrs() ([]string, error) - TLSConfig() *tls.Config - StartGCWorker() error -} - // update oracle's lastTS every 2000ms. var oracleUpdateInterval = 2000 -type tikvStore struct { +// KVStore contains methods to interact with a TiKV cluster. +type KVStore struct { clusterID uint64 uuid string oracle oracle.Oracle client Client pdClient pd.Client regionCache *RegionCache - coprCache *coprCache lockResolver *LockResolver txnLatches *latch.LatchesScheduler - gcWorker GCHandler - etcdAddrs []string - tlsConfig *tls.Config - mock bool - enableGC bool + + mock bool kv SafePointKV safePoint uint64 @@ -166,14 +78,16 @@ type tikvStore struct { replicaReadSeed uint32 // this is used to load balance followers / learners when replica read is enabled } -func (s *tikvStore) UpdateSPCache(cachedSP uint64, cachedTime time.Time) { +// UpdateSPCache updates cached safepoint. +func (s *KVStore) UpdateSPCache(cachedSP uint64, cachedTime time.Time) { s.spMutex.Lock() s.safePoint = cachedSP s.spTime = cachedTime s.spMutex.Unlock() } -func (s *tikvStore) CheckVisibility(startTime uint64) error { +// CheckVisibility checks if it is safe to read using given ts. +func (s *KVStore) CheckVisibility(startTime uint64) error { s.spMutex.RLock() cachedSafePoint := s.safePoint cachedTime := s.spTime @@ -193,102 +107,44 @@ func (s *tikvStore) CheckVisibility(startTime uint64) error { return nil } -func newTikvStore(uuid string, pdClient pd.Client, spkv SafePointKV, client Client, enableGC bool, coprCacheConfig *config.CoprocessorCache) (*tikvStore, error) { +// NewKVStore creates a new TiKV store instance. +func NewKVStore(uuid string, pdClient pd.Client, spkv SafePointKV, client Client) (*KVStore, error) { o, err := oracles.NewPdOracle(pdClient, time.Duration(oracleUpdateInterval)*time.Millisecond) if err != nil { return nil, errors.Trace(err) } - store := &tikvStore{ + store := &KVStore{ clusterID: pdClient.GetClusterID(context.TODO()), uuid: uuid, oracle: o, client: reqCollapse{client}, pdClient: pdClient, regionCache: NewRegionCache(pdClient), - coprCache: nil, kv: spkv, safePoint: 0, spTime: time.Now(), closed: make(chan struct{}), - replicaReadSeed: fastrand.Uint32(), + replicaReadSeed: rand.Uint32(), } store.lockResolver = newLockResolver(store) - store.enableGC = enableGC - - coprCache, err := newCoprCache(coprCacheConfig) - if err != nil { - return nil, errors.Trace(err) - } - store.coprCache = coprCache go store.runSafePointChecker() return store, nil } -func (s *tikvStore) EnableTxnLocalLatches(size uint) { +// EnableTxnLocalLatches enables txn latch. It should be called before using +// the store to serve any requests. +func (s *KVStore) EnableTxnLocalLatches(size uint) { s.txnLatches = latch.NewScheduler(size) } // IsLatchEnabled is used by mockstore.TestConfig. -func (s *tikvStore) IsLatchEnabled() bool { +func (s *KVStore) IsLatchEnabled() bool { return s.txnLatches != nil } -func (s *tikvStore) EtcdAddrs() ([]string, error) { - if s.etcdAddrs == nil { - return nil, nil - } - ctx := context.Background() - bo := NewBackoffer(ctx, GetMemberInfoBackoff) - etcdAddrs := make([]string, 0) - pdClient := s.pdClient - if pdClient == nil { - return nil, errors.New("Etcd client not found") - } - for { - members, err := pdClient.GetMemberInfo(ctx) - if err != nil { - err := bo.Backoff(BoRegionMiss, err) - if err != nil { - return nil, err - } - continue - } - for _, member := range members { - if len(member.ClientUrls) > 0 { - u, err := url.Parse(member.ClientUrls[0]) - if err != nil { - logutil.BgLogger().Error("fail to parse client url from pd members", zap.String("client_url", member.ClientUrls[0]), zap.Error(err)) - return nil, err - } - etcdAddrs = append(etcdAddrs, u.Host) - } - } - return etcdAddrs, nil - } -} - -func (s *tikvStore) TLSConfig() *tls.Config { - return s.tlsConfig -} - -// StartGCWorker starts GC worker, it's called in BootstrapSession, don't call this function more than once. -func (s *tikvStore) StartGCWorker() error { - if !s.enableGC || NewGCHandlerFunc == nil { - return nil - } - - gcWorker, err := NewGCHandlerFunc(s, s.pdClient) - if err != nil { - return errors.Trace(err) - } - gcWorker.Start() - s.gcWorker = gcWorker - return nil -} - -func (s *tikvStore) runSafePointChecker() { +func (s *KVStore) runSafePointChecker() { d := gcSafePointUpdateInterval for { select { @@ -309,38 +165,63 @@ func (s *tikvStore) runSafePointChecker() { } } -func (s *tikvStore) Begin() (kv.Transaction, error) { - txn, err := newTiKVTxn(s) +// Begin a global transaction. +func (s *KVStore) Begin() (*KVTxn, error) { + return s.beginWithTxnScope(oracle.GlobalTxnScope) +} + +// BeginWithOption begins a transaction with given option +func (s *KVStore) BeginWithOption(option kv.TransactionOption) (*KVTxn, error) { + txnScope := option.TxnScope + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + if option.StartTS != nil { + return s.beginWithStartTS(txnScope, *option.StartTS) + } else if option.PrevSec != nil { + return s.beginWithExactStaleness(txnScope, *option.PrevSec) + } + return s.beginWithTxnScope(txnScope) +} + +// beginWithTxnScope begins a transaction with the given txnScope (local or global) +func (s *KVStore) beginWithTxnScope(txnScope string) (*KVTxn, error) { + txn, err := newTiKVTxn(s, txnScope) if err != nil { return nil, errors.Trace(err) } return txn, nil } -// BeginWithStartTS begins a transaction with startTS. -func (s *tikvStore) BeginWithStartTS(startTS uint64) (kv.Transaction, error) { - txn, err := newTikvTxnWithStartTS(s, startTS, s.nextReplicaReadSeed()) +// beginWithStartTS begins a transaction with startTS. +func (s *KVStore) beginWithStartTS(txnScope string, startTS uint64) (*KVTxn, error) { + txn, err := newTiKVTxnWithStartTS(s, txnScope, startTS, s.nextReplicaReadSeed()) if err != nil { return nil, errors.Trace(err) } return txn, nil } -func (s *tikvStore) GetSnapshot(ver kv.Version) (kv.Snapshot, error) { - snapshot := newTiKVSnapshot(s, ver, s.nextReplicaReadSeed()) - return snapshot, nil +// beginWithExactStaleness begins transaction with given staleness +func (s *KVStore) beginWithExactStaleness(txnScope string, prevSec uint64) (*KVTxn, error) { + txn, err := newTiKVTxnWithExactStaleness(s, txnScope, prevSec) + if err != nil { + return nil, errors.Trace(err) + } + return txn, nil } -func (s *tikvStore) Close() error { - mc.Lock() - defer mc.Unlock() +// GetSnapshot gets a snapshot that is able to read any data which data is <= ver. +// if ts is MaxVersion or > current max committed version, we will use current version for this snapshot. +func (s *KVStore) GetSnapshot(ts uint64) *KVSnapshot { + snapshot := newTiKVSnapshot(s, ts, s.nextReplicaReadSeed()) + return snapshot +} - delete(mc.cache, s.uuid) +// Close store +func (s *KVStore) Close() error { s.oracle.Close() s.pdClient.Close() - if s.gcWorker != nil { - s.gcWorker.Close() - } close(s.closed) if err := s.client.Close(); err != nil { @@ -351,31 +232,37 @@ func (s *tikvStore) Close() error { s.txnLatches.Close() } s.regionCache.Close() + + if err := s.kv.Close(); err != nil { + return errors.Trace(err) + } return nil } -func (s *tikvStore) UUID() string { +// UUID return a unique ID which represents a Storage. +func (s *KVStore) UUID() string { return s.uuid } -func (s *tikvStore) CurrentVersion() (kv.Version, error) { +// CurrentTimestamp returns current timestamp with the given txnScope (local or global). +func (s *KVStore) CurrentTimestamp(txnScope string) (uint64, error) { bo := NewBackofferWithVars(context.Background(), tsoMaxBackoff, nil) - startTS, err := s.getTimestampWithRetry(bo) + startTS, err := s.getTimestampWithRetry(bo, txnScope) if err != nil { - return kv.NewVersion(0), errors.Trace(err) + return 0, errors.Trace(err) } - return kv.NewVersion(startTS), nil + return startTS, nil } -func (s *tikvStore) getTimestampWithRetry(bo *Backoffer) (uint64, error) { +func (s *KVStore) getTimestampWithRetry(bo *Backoffer, txnScope string) (uint64, error) { if span := opentracing.SpanFromContext(bo.ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("tikvStore.getTimestampWithRetry", opentracing.ChildOf(span.Context())) + span1 := span.Tracer().StartSpan("TiKVStore.getTimestampWithRetry", opentracing.ChildOf(span.Context())) defer span1.Finish() bo.ctx = opentracing.ContextWithSpan(bo.ctx, span1) } for { - startTS, err := s.oracle.GetTimestamp(bo.ctx) + startTS, err := s.oracle.GetTimestamp(bo.ctx, &oracle.Option{TxnScope: txnScope}) // mockGetTSErrorInRetry should wait MockCommitErrorOnce first, then will run into retry() logic. // Then mockGetTSErrorInRetry will return retryable error when first retry. // Before PR #8743, we don't cleanup txn after meet error such as error like: PD server timeout @@ -396,75 +283,80 @@ func (s *tikvStore) getTimestampWithRetry(bo *Backoffer) (uint64, error) { } } -func (s *tikvStore) nextReplicaReadSeed() uint32 { - return atomic.AddUint32(&s.replicaReadSeed, 1) -} - -func (s *tikvStore) GetClient() kv.Client { - return &CopClient{ - store: s, - replicaReadSeed: s.nextReplicaReadSeed(), +func (s *KVStore) getStalenessTimestamp(bo *Backoffer, txnScope string, prevSec uint64) (uint64, error) { + for { + startTS, err := s.oracle.GetStaleTimestamp(bo.ctx, txnScope, prevSec) + if err == nil { + return startTS, nil + } + err = bo.Backoff(BoPDRPC, errors.Errorf("get staleness timestamp failed: %v", err)) + if err != nil { + return 0, errors.Trace(err) + } } } -func (s *tikvStore) GetOracle() oracle.Oracle { - return s.oracle +func (s *KVStore) nextReplicaReadSeed() uint32 { + return atomic.AddUint32(&s.replicaReadSeed, 1) } -func (s *tikvStore) Name() string { - return "TiKV" +// GetOracle gets a timestamp oracle client. +func (s *KVStore) GetOracle() oracle.Oracle { + return s.oracle } -func (s *tikvStore) Describe() string { - return "TiKV is a distributed transactional key-value database" +// GetPDClient returns the PD client. +func (s *KVStore) GetPDClient() pd.Client { + return s.pdClient } -func (s *tikvStore) ShowStatus(ctx context.Context, key string) (interface{}, error) { +// ShowStatus returns the specified status of the storage +func (s *KVStore) ShowStatus(ctx context.Context, key string) (interface{}, error) { return nil, kv.ErrNotImplemented } -func (s *tikvStore) SupportDeleteRange() (supported bool) { +// SupportDeleteRange gets the storage support delete range or not. +func (s *KVStore) SupportDeleteRange() (supported bool) { return !s.mock } -func (s *tikvStore) SendReq(bo *Backoffer, req *tikvrpc.Request, regionID RegionVerID, timeout time.Duration) (*tikvrpc.Response, error) { +// SendReq sends a request to region. +func (s *KVStore) SendReq(bo *Backoffer, req *tikvrpc.Request, regionID RegionVerID, timeout time.Duration) (*tikvrpc.Response, error) { sender := NewRegionRequestSender(s.regionCache, s.client) return sender.SendReq(bo, req, regionID, timeout) } -func (s *tikvStore) GetRegionCache() *RegionCache { +// GetRegionCache returns the region cache instance. +func (s *KVStore) GetRegionCache() *RegionCache { return s.regionCache } -func (s *tikvStore) GetLockResolver() *LockResolver { +// GetLockResolver returns the lock resolver instance. +func (s *KVStore) GetLockResolver() *LockResolver { return s.lockResolver } -func (s *tikvStore) GetGCHandler() GCHandler { - return s.gcWorker -} - -func (s *tikvStore) Closed() <-chan struct{} { +// Closed returns a channel that indicates if the store is closed. +func (s *KVStore) Closed() <-chan struct{} { return s.closed } -func (s *tikvStore) GetSafePointKV() SafePointKV { +// GetSafePointKV returns the kv store that used for safepoint. +func (s *KVStore) GetSafePointKV() SafePointKV { return s.kv } -func (s *tikvStore) SetOracle(oracle oracle.Oracle) { +// SetOracle resets the oracle instance. +func (s *KVStore) SetOracle(oracle oracle.Oracle) { s.oracle = oracle } -func (s *tikvStore) SetTiKVClient(client Client) { +// SetTiKVClient resets the client instance. +func (s *KVStore) SetTiKVClient(client Client) { s.client = client } -func (s *tikvStore) GetTiKVClient() (client Client) { +// GetTiKVClient gets the client instance. +func (s *KVStore) GetTiKVClient() (client Client) { return s.client } - -func init() { - mc.cache = make(map[string]*tikvStore) - rand.Seed(time.Now().UnixNano()) -} diff --git a/store/tikv/latch/latch.go b/store/tikv/latch/latch.go index 8f6456fcace62..812e15c96fbd3 100644 --- a/store/tikv/latch/latch.go +++ b/store/tikv/latch/latch.go @@ -21,7 +21,7 @@ import ( "time" "github.com/cznic/mathutil" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/twmb/murmur3" "go.uber.org/zap" ) diff --git a/store/tikv/lock_resolver.go b/store/tikv/lock_resolver.go index 54bb85934f0f2..5279b74beeba7 100644 --- a/store/tikv/lock_resolver.go +++ b/store/tikv/lock_resolver.go @@ -25,12 +25,13 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" pd "github.com/tikv/pd/client" "go.uber.org/zap" ) @@ -41,26 +42,9 @@ const ResolvedCacheSize = 2048 // bigTxnThreshold : transaction involves keys exceed this threshold can be treated as `big transaction`. const bigTxnThreshold = 16 -var ( - tikvLockResolverCountWithBatchResolve = metrics.TiKVLockResolverCounter.WithLabelValues("batch_resolve") - tikvLockResolverCountWithExpired = metrics.TiKVLockResolverCounter.WithLabelValues("expired") - tikvLockResolverCountWithNotExpired = metrics.TiKVLockResolverCounter.WithLabelValues("not_expired") - tikvLockResolverCountWithWaitExpired = metrics.TiKVLockResolverCounter.WithLabelValues("wait_expired") - tikvLockResolverCountWithResolve = metrics.TiKVLockResolverCounter.WithLabelValues("resolve") - tikvLockResolverCountWithResolveForWrite = metrics.TiKVLockResolverCounter.WithLabelValues("resolve_for_write") - tikvLockResolverCountWithResolveAsync = metrics.TiKVLockResolverCounter.WithLabelValues("resolve_async_commit") - tikvLockResolverCountWithWriteConflict = metrics.TiKVLockResolverCounter.WithLabelValues("write_conflict") - tikvLockResolverCountWithQueryTxnStatus = metrics.TiKVLockResolverCounter.WithLabelValues("query_txn_status") - tikvLockResolverCountWithQueryTxnStatusCommitted = metrics.TiKVLockResolverCounter.WithLabelValues("query_txn_status_committed") - tikvLockResolverCountWithQueryTxnStatusRolledBack = metrics.TiKVLockResolverCounter.WithLabelValues("query_txn_status_rolled_back") - tikvLockResolverCountWithQueryCheckSecondaryLocks = metrics.TiKVLockResolverCounter.WithLabelValues("query_check_secondary_locks") - tikvLockResolverCountWithResolveLocks = metrics.TiKVLockResolverCounter.WithLabelValues("query_resolve_locks") - tikvLockResolverCountWithResolveLockLite = metrics.TiKVLockResolverCounter.WithLabelValues("query_resolve_lock_lite") -) - // LockResolver resolves locks and also caches resolved txn status. type LockResolver struct { - store Storage + store *KVStore mu struct { sync.RWMutex // resolved caches resolved txns (FIFO, txn id -> txnStatus). @@ -72,7 +56,7 @@ type LockResolver struct { } } -func newLockResolver(store Storage) *LockResolver { +func newLockResolver(store *KVStore) *LockResolver { r := &LockResolver{ store: store, } @@ -109,7 +93,7 @@ func NewLockResolver(etcdAddrs []string, security config.Security, opts ...pd.Cl return nil, errors.Trace(err) } - s, err := newTikvStore(uuid, &codecPDClient{pdCli}, spkv, newRPCClient(security), false, nil) + s, err := NewKVStore(uuid, &CodecPDClient{pdCli}, spkv, NewRPCClient(security)) if err != nil { return nil, errors.Trace(err) } @@ -136,6 +120,30 @@ func (s TxnStatus) TTL() uint64 { return s.ttl } // Action returns what the CheckTxnStatus request have done to the transaction. func (s TxnStatus) Action() kvrpcpb.Action { return s.action } +// StatusCacheable checks whether the transaction status is certain.True will be +// returned if its status is certain: +// If transaction is already committed, the result could be cached. +// Otherwise: +// If l.LockType is pessimistic lock type: +// - if its primary lock is pessimistic too, the check txn status result should not be cached. +// - if its primary lock is prewrite lock type, the check txn status could be cached. +// If l.lockType is prewrite lock type: +// - always cache the check txn status result. +// For prewrite locks, their primary keys should ALWAYS be the correct one and will NOT change. +func (s TxnStatus) StatusCacheable() bool { + if s.IsCommitted() { + return true + } + if s.ttl == 0 { + if s.action == kvrpcpb.Action_NoAction || + s.action == kvrpcpb.Action_LockNotExistRollback || + s.action == kvrpcpb.Action_TTLExpireRollback { + return true + } + } + return false +} + // By default, locks after 3000ms is considered unusual (the client created the // lock might be dead). Other client may cleanup this kind of lock. // For locks created recently, we will do backoff and retry. @@ -212,13 +220,13 @@ func (lr *LockResolver) BatchResolveLocks(bo *Backoffer, locks []*Lock, loc Regi return true, nil } - tikvLockResolverCountWithBatchResolve.Inc() + metrics.LockResolverCountWithBatchResolve.Inc() // The GCWorker kill all ongoing transactions, because it must make sure all // locks have been cleaned before GC. expiredLocks := locks - callerStartTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx) + callerStartTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) if err != nil { return false, errors.Trace(err) } @@ -229,10 +237,10 @@ func (lr *LockResolver) BatchResolveLocks(bo *Backoffer, locks []*Lock, loc Regi if _, ok := txnInfos[l.TxnID]; ok { continue } - tikvLockResolverCountWithExpired.Inc() + metrics.LockResolverCountWithExpired.Inc() // Use currentTS = math.MaxUint64 means rollback the txn, no matter the lock is expired or not! - status, err := lr.getTxnStatus(bo, l.TxnID, l.Primary, callerStartTS, math.MaxUint64, true) + status, err := lr.getTxnStatus(bo, l.TxnID, l.Primary, callerStartTS, math.MaxUint64, true, false, l) if err != nil { return false, err } @@ -241,11 +249,18 @@ func (lr *LockResolver) BatchResolveLocks(bo *Backoffer, locks []*Lock, loc Regi // Then we need to check the secondary locks to determine the final status of the transaction. if status.primaryLock != nil && status.primaryLock.UseAsyncCommit { resolveData, err := lr.checkAllSecondaries(bo, l, &status) - if err != nil { + if err == nil { + txnInfos[l.TxnID] = resolveData.commitTs + continue + } + if _, ok := errors.Cause(err).(*nonAsyncCommitLock); ok { + status, err = lr.getTxnStatus(bo, l.TxnID, l.Primary, callerStartTS, math.MaxUint64, true, true, l) + if err != nil { + return false, err + } + } else { return false, err } - txnInfos[l.TxnID] = resolveData.commitTs - continue } if status.ttl > 0 { @@ -314,7 +329,8 @@ func (lr *LockResolver) ResolveLocks(bo *Backoffer, callerStartTS uint64, locks return lr.resolveLocks(bo, callerStartTS, locks, false, false) } -func (lr *LockResolver) resolveLocksLite(bo *Backoffer, callerStartTS uint64, locks []*Lock) (int64, []uint64 /*pushed*/, error) { +// ResolveLocksLite resolves locks while preventing scan whole region. +func (lr *LockResolver) ResolveLocksLite(bo *Backoffer, callerStartTS uint64, locks []*Lock) (int64, []uint64 /*pushed*/, error) { return lr.resolveLocks(bo, callerStartTS, locks, false, true) } @@ -328,9 +344,9 @@ func (lr *LockResolver) resolveLocks(bo *Backoffer, callerStartTS uint64, locks } if forWrite { - tikvLockResolverCountWithResolveForWrite.Inc() + metrics.LockResolverCountWithResolveForWrite.Inc() } else { - tikvLockResolverCountWithResolve.Inc() + metrics.LockResolverCountWithResolve.Inc() } var pushFail bool @@ -343,16 +359,15 @@ func (lr *LockResolver) resolveLocks(bo *Backoffer, callerStartTS uint64, locks pushed = make([]uint64, 0, len(locks)) } - for _, l := range locks { - status, err := lr.getTxnStatusFromLock(bo, l, callerStartTS) + var resolve func(*Lock, bool) error + resolve = func(l *Lock, forceSyncCommit bool) error { + status, err := lr.getTxnStatusFromLock(bo, l, callerStartTS, forceSyncCommit) if err != nil { - msBeforeTxnExpired.update(0) - err = errors.Trace(err) - return msBeforeTxnExpired.value(), nil, err + return err } if status.ttl == 0 { - tikvLockResolverCountWithExpired.Inc() + metrics.LockResolverCountWithExpired.Inc() // If the lock is committed or rollbacked, resolve lock. cleanRegions, exists := cleanTxns[l.TxnID] if !exists { @@ -360,23 +375,24 @@ func (lr *LockResolver) resolveLocks(bo *Backoffer, callerStartTS uint64, locks cleanTxns[l.TxnID] = cleanRegions } - if status.primaryLock != nil && status.primaryLock.UseAsyncCommit && !exists { + if status.primaryLock != nil && !forceSyncCommit && status.primaryLock.UseAsyncCommit && !exists { err = lr.resolveLockAsync(bo, l, status) + if _, ok := errors.Cause(err).(*nonAsyncCommitLock); ok { + err = resolve(l, true) + } } else if l.LockType == kvrpcpb.Op_PessimisticLock { err = lr.resolvePessimisticLock(bo, l, cleanRegions) } else { err = lr.resolveLock(bo, l, status, lite, cleanRegions) } if err != nil { - msBeforeTxnExpired.update(0) - err = errors.Trace(err) - return msBeforeTxnExpired.value(), nil, err + return err } } else { - tikvLockResolverCountWithNotExpired.Inc() + metrics.LockResolverCountWithNotExpired.Inc() // If the lock is valid, the txn may be a pessimistic transaction. // Update the txn expire time. - msBeforeLockExpired := lr.store.GetOracle().UntilExpired(l.TxnID, status.ttl) + msBeforeLockExpired := lr.store.GetOracle().UntilExpired(l.TxnID, status.ttl, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) msBeforeTxnExpired.update(msBeforeLockExpired) if forWrite { // Write conflict detected! @@ -384,17 +400,27 @@ func (lr *LockResolver) resolveLocks(bo *Backoffer, callerStartTS uint64, locks // abort current transaction. // This could avoids the deadlock scene of two large transaction. if l.LockType != kvrpcpb.Op_PessimisticLock && l.TxnID > callerStartTS { - tikvLockResolverCountWithWriteConflict.Inc() - return msBeforeTxnExpired.value(), nil, kv.ErrWriteConflict.GenWithStackByArgs(callerStartTS, l.TxnID, status.commitTS, l.Key) + metrics.LockResolverCountWithWriteConflict.Inc() + return kv.ErrWriteConflict.GenWithStackByArgs(callerStartTS, l.TxnID, status.commitTS, l.Key) } } else { if status.action != kvrpcpb.Action_MinCommitTSPushed { pushFail = true - continue + return nil } pushed = append(pushed, l.TxnID) } } + return nil + } + + for _, l := range locks { + err := resolve(l, false) + if err != nil { + msBeforeTxnExpired.update(0) + err = errors.Trace(err) + return msBeforeTxnExpired.value(), nil, err + } } if pushFail { // If any of the lock fails to push minCommitTS, don't return the pushed array. @@ -403,7 +429,7 @@ func (lr *LockResolver) resolveLocks(bo *Backoffer, callerStartTS uint64, locks if msBeforeTxnExpired.value() > 0 && len(pushed) == 0 { // If len(pushed) > 0, the caller will not block on the locks, it push the minCommitTS instead. - tikvLockResolverCountWithWaitExpired.Inc() + metrics.LockResolverCountWithWaitExpired.Inc() } return msBeforeTxnExpired.value(), pushed, nil } @@ -446,18 +472,18 @@ func (t *txnExpireTime) value() int64 { func (lr *LockResolver) GetTxnStatus(txnID uint64, callerStartTS uint64, primary []byte) (TxnStatus, error) { var status TxnStatus bo := NewBackoffer(context.Background(), cleanupMaxBackoff) - currentTS, err := lr.store.GetOracle().GetLowResolutionTimestamp(bo.ctx) + currentTS, err := lr.store.GetOracle().GetLowResolutionTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) if err != nil { return status, err } - return lr.getTxnStatus(bo, txnID, primary, callerStartTS, currentTS, true) + return lr.getTxnStatus(bo, txnID, primary, callerStartTS, currentTS, true, false, nil) } -func (lr *LockResolver) getTxnStatusFromLock(bo *Backoffer, l *Lock, callerStartTS uint64) (TxnStatus, error) { +func (lr *LockResolver) getTxnStatusFromLock(bo *Backoffer, l *Lock, callerStartTS uint64, forceSyncCommit bool) (TxnStatus, error) { var currentTS uint64 var err error var status TxnStatus - if l.UseAsyncCommit { + if l.UseAsyncCommit && !forceSyncCommit { // Async commit doesn't need the current ts since it uses the minCommitTS. currentTS = 0 // Set to 0 so as not to push forward min commit ts. @@ -469,7 +495,7 @@ func (lr *LockResolver) getTxnStatusFromLock(bo *Backoffer, l *Lock, callerStart // Set currentTS to max uint64 to make the lock expired. currentTS = math.MaxUint64 } else { - currentTS, err = lr.store.GetOracle().GetLowResolutionTimestamp(bo.ctx) + currentTS, err = lr.store.GetOracle().GetLowResolutionTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) if err != nil { return TxnStatus{}, err } @@ -480,7 +506,7 @@ func (lr *LockResolver) getTxnStatusFromLock(bo *Backoffer, l *Lock, callerStart time.Sleep(100 * time.Millisecond) }) for { - status, err = lr.getTxnStatus(bo, l.TxnID, l.Primary, callerStartTS, currentTS, rollbackIfNotExist) + status, err = lr.getTxnStatus(bo, l.TxnID, l.Primary, callerStartTS, currentTS, rollbackIfNotExist, forceSyncCommit, l) if err == nil { return status, nil } @@ -502,17 +528,18 @@ func (lr *LockResolver) getTxnStatusFromLock(bo *Backoffer, l *Lock, callerStart logutil.Logger(bo.ctx).Warn("getTxnStatusFromLock backoff fail", zap.Error(err)) } - if lr.store.GetOracle().UntilExpired(l.TxnID, l.TTL) <= 0 { + if lr.store.GetOracle().UntilExpired(l.TxnID, l.TTL, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) <= 0 { logutil.Logger(bo.ctx).Warn("lock txn not found, lock has expired", zap.Uint64("CallerStartTs", callerStartTS), zap.Stringer("lock str", l)) if l.LockType == kvrpcpb.Op_PessimisticLock { failpoint.Inject("txnExpireRetTTL", func() { - failpoint.Return(TxnStatus{ttl: l.TTL, action: kvrpcpb.Action_NoAction}, + failpoint.Return(TxnStatus{action: kvrpcpb.Action_LockNotExistDoNothing}, errors.New("error txn not found and lock expired")) }) - return TxnStatus{}, nil } + // For pessimistic lock resolving, if the primary lock dose not exist and rollbackIfNotExist is true, + // The Action_LockNotExistDoNothing will be returned as the status. rollbackIfNotExist = true } else { if l.LockType == kvrpcpb.Op_PessimisticLock { @@ -532,12 +559,13 @@ func (e txnNotFoundErr) Error() string { // getTxnStatus sends the CheckTxnStatus request to the TiKV server. // When rollbackIfNotExist is false, the caller should be careful with the txnNotFoundErr error. -func (lr *LockResolver) getTxnStatus(bo *Backoffer, txnID uint64, primary []byte, callerStartTS, currentTS uint64, rollbackIfNotExist bool) (TxnStatus, error) { +func (lr *LockResolver) getTxnStatus(bo *Backoffer, txnID uint64, primary []byte, + callerStartTS, currentTS uint64, rollbackIfNotExist bool, forceSyncCommit bool, lockInfo *Lock) (TxnStatus, error) { if s, ok := lr.getResolved(txnID); ok { return s, nil } - tikvLockResolverCountWithQueryTxnStatus.Inc() + metrics.LockResolverCountWithQueryTxnStatus.Inc() // CheckTxnStatus may meet the following cases: // 1. LOCK @@ -549,12 +577,15 @@ func (lr *LockResolver) getTxnStatus(bo *Backoffer, txnID uint64, primary []byte // 2.3 No lock -- pessimistic lock rollback, concurrence prewrite. var status TxnStatus + resolvingPessimisticLock := lockInfo != nil && lockInfo.LockType == kvrpcpb.Op_PessimisticLock req := tikvrpc.NewRequest(tikvrpc.CmdCheckTxnStatus, &kvrpcpb.CheckTxnStatusRequest{ - PrimaryKey: primary, - LockTs: txnID, - CallerStartTs: callerStartTS, - CurrentTs: currentTS, - RollbackIfNotExist: rollbackIfNotExist, + PrimaryKey: primary, + LockTs: txnID, + CallerStartTs: callerStartTS, + CurrentTs: currentTS, + RollbackIfNotExist: rollbackIfNotExist, + ForceSyncCommit: forceSyncCommit, + ResolvingPessimisticLock: resolvingPessimisticLock, }) for { loc, err := lr.store.GetRegionCache().LocateKey(bo, primary) @@ -594,20 +625,22 @@ func (lr *LockResolver) getTxnStatus(bo *Backoffer, txnID uint64, primary []byte status.primaryLock = cmdResp.LockInfo if status.primaryLock != nil && status.primaryLock.UseAsyncCommit { - if !lr.store.GetOracle().IsExpired(txnID, cmdResp.LockTtl) { + if !lr.store.GetOracle().IsExpired(txnID, cmdResp.LockTtl, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) { status.ttl = cmdResp.LockTtl } } else if cmdResp.LockTtl != 0 { status.ttl = cmdResp.LockTtl } else { if cmdResp.CommitVersion == 0 { - tikvLockResolverCountWithQueryTxnStatusRolledBack.Inc() + metrics.LockResolverCountWithQueryTxnStatusRolledBack.Inc() } else { - tikvLockResolverCountWithQueryTxnStatusCommitted.Inc() + metrics.LockResolverCountWithQueryTxnStatusCommitted.Inc() } status.commitTS = cmdResp.CommitVersion - lr.saveResolved(txnID, status) + if status.StatusCacheable() { + lr.saveResolved(txnID, status) + } } return status, nil @@ -627,6 +660,12 @@ type asyncResolveData struct { missingLock bool } +type nonAsyncCommitLock struct{} + +func (*nonAsyncCommitLock) Error() string { + return "CheckSecondaryLocks receives a non-async-commit lock" +} + // addKeys adds the keys from locks to data, keeping other fields up to date. startTS and commitTS are for the // transaction being resolved. // @@ -670,7 +709,9 @@ func (data *asyncResolveData) addKeys(locks []*kvrpcpb.LockInfo, expected int, s logutil.BgLogger().Error("addLocks error", zap.Error(err)) return err } - + if !lockInfo.UseAsyncCommit { + return &nonAsyncCommitLock{} + } if !data.missingLock && lockInfo.MinCommitTs > data.commitTs { data.commitTs = lockInfo.MinCommitTs } @@ -686,7 +727,7 @@ func (lr *LockResolver) checkSecondaries(bo *Backoffer, txnID uint64, curKeys [] StartVersion: txnID, } req := tikvrpc.NewRequest(tikvrpc.CmdCheckSecondaryLocks, checkReq) - tikvLockResolverCountWithQueryCheckSecondaryLocks.Inc() + metrics.LockResolverCountWithQueryCheckSecondaryLocks.Inc() resp, err := lr.store.SendReq(bo, req, curRegionID, readTimeoutShort) if err != nil { return errors.Trace(err) @@ -727,7 +768,7 @@ func (lr *LockResolver) checkSecondaries(bo *Backoffer, txnID uint64, curKeys [] // resolveLockAsync resolves l assuming it was locked using the async commit protocol. func (lr *LockResolver) resolveLockAsync(bo *Backoffer, l *Lock, status TxnStatus) error { - tikvLockResolverCountWithResolveAsync.Inc() + metrics.LockResolverCountWithResolveAsync.Inc() resolveData, err := lr.checkAllSecondaries(bo, l, &status) if err != nil { @@ -785,30 +826,24 @@ func (lr *LockResolver) checkAllSecondaries(bo *Backoffer, l *Lock, status *TxnS } errChan := make(chan error, len(regions)) - + checkBo, cancel := bo.Fork() + defer cancel() for regionID, keys := range regions { curRegionID := regionID curKeys := keys go func() { - errChan <- lr.checkSecondaries(bo, l.TxnID, curKeys, curRegionID, &shared) + errChan <- lr.checkSecondaries(checkBo, l.TxnID, curKeys, curRegionID, &shared) }() } - var errs []string for range regions { - err1 := <-errChan - if err1 != nil { - errs = append(errs, err1.Error()) + err := <-errChan + if err != nil { + return nil, err } } - if len(errs) > 0 { - return nil, errors.Errorf("async commit recovery (sending CheckSecondaryLocks) finished with errors: %v", errs) - } - - // TODO(nrc, cfzjywxk) schema lease check - return &shared, nil } @@ -866,7 +901,7 @@ func (lr *LockResolver) resolveRegionLocks(bo *Backoffer, l *Lock, region Region } func (lr *LockResolver) resolveLock(bo *Backoffer, l *Lock, status TxnStatus, lite bool, cleanRegions map[RegionVerID]struct{}) error { - tikvLockResolverCountWithResolveLocks.Inc() + metrics.LockResolverCountWithResolveLocks.Inc() resolveLite := lite || l.TxnSize < bigTxnThreshold for { loc, err := lr.store.GetRegionCache().LocateKey(bo, l.Key) @@ -888,7 +923,7 @@ func (lr *LockResolver) resolveLock(bo *Backoffer, l *Lock, status TxnStatus, li if resolveLite { // Only resolve specified keys when it is a small transaction, // prevent from scanning the whole region in this case. - tikvLockResolverCountWithResolveLockLite.Inc() + metrics.LockResolverCountWithResolveLockLite.Inc() lreq.Keys = [][]byte{l.Key} } req := tikvrpc.NewRequest(tikvrpc.CmdResolveLock, lreq) @@ -924,7 +959,7 @@ func (lr *LockResolver) resolveLock(bo *Backoffer, l *Lock, status TxnStatus, li } func (lr *LockResolver) resolvePessimisticLock(bo *Backoffer, l *Lock, cleanRegions map[RegionVerID]struct{}) error { - tikvLockResolverCountWithResolveLocks.Inc() + metrics.LockResolverCountWithResolveLocks.Inc() for { loc, err := lr.store.GetRegionCache().LocateKey(bo, l.Key) if err != nil { diff --git a/store/tikv/lock_test.go b/store/tikv/lock_test.go index c992b2d12df8a..84d2cadde7455 100644 --- a/store/tikv/lock_test.go +++ b/store/tikv/lock_test.go @@ -29,18 +29,19 @@ import ( "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" ) type testLockSuite struct { OneByOneSuite - store *tikvStore + store *KVStore } var _ = Suite(&testLockSuite{}) func (s *testLockSuite) SetUpTest(c *C) { - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) } func (s *testLockSuite) TearDownTest(c *C) { @@ -48,7 +49,7 @@ func (s *testLockSuite) TearDownTest(c *C) { } func (s *testLockSuite) lockKey(c *C, key, value, primaryKey, primaryValue []byte, commitPrimary bool) (uint64, uint64) { - txn, err := newTiKVTxn(s.store) + txn, err := newTiKVTxn(s.store, oracle.GlobalTxnScope) c.Assert(err, IsNil) if len(value) > 0 { err = txn.Set(key, value) @@ -72,7 +73,7 @@ func (s *testLockSuite) lockKey(c *C, key, value, primaryKey, primaryValue []byt c.Assert(err, IsNil) if commitPrimary { - tpc.commitTS, err = s.store.oracle.GetTimestamp(ctx) + tpc.commitTS, err = s.store.oracle.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) err = tpc.commitMutations(NewBackofferWithVars(ctx, int(atomic.LoadUint64(&CommitMaxBackoff)), nil), tpc.mutationsOfKeys([][]byte{primaryKey})) c.Assert(err, IsNil) @@ -93,7 +94,7 @@ func (s *testLockSuite) putKV(c *C, key, value []byte) (uint64, uint64) { c.Assert(err, IsNil) err = txn.Commit(context.Background()) c.Assert(err, IsNil) - return txn.StartTS(), txn.(*tikvTxn).commitTS + return txn.StartTS(), txn.commitTS } func (s *testLockSuite) prepareAlphabetLocks(c *C) { @@ -159,7 +160,7 @@ func (s *testLockSuite) TestScanLockResolveWithBatchGet(c *C) { keys = append(keys, []byte{ch}) } - ver, err := s.store.CurrentVersion() + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) c.Assert(err, IsNil) snapshot := newTiKVSnapshot(s.store, ver, 0) m, err := snapshot.BatchGet(context.Background(), keys) @@ -210,11 +211,11 @@ func (s *testLockSuite) TestCheckTxnStatusTTL(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) txn.Set(kv.Key("key"), []byte("value")) - s.prewriteTxnWithTTL(c, txn.(*tikvTxn), 1000) + s.prewriteTxnWithTTL(c, txn, 1000) bo := NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil) lr := newLockResolver(s.store) - callerStartTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx) + callerStartTS, err := lr.store.GetOracle().GetTimestamp(bo.ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) // Check the lock TTL of a transaction. @@ -250,7 +251,7 @@ func (s *testLockSuite) TestTxnHeartBeat(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) txn.Set(kv.Key("key"), []byte("value")) - s.prewriteTxn(c, txn.(*tikvTxn)) + s.prewriteTxn(c, txn) bo := NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil) newTTL, err := sendTxnHeartBeat(bo, s.store, []byte("key"), txn.StartTS(), 6666) @@ -277,17 +278,17 @@ func (s *testLockSuite) TestCheckTxnStatus(c *C) { c.Assert(err, IsNil) txn.Set(kv.Key("key"), []byte("value")) txn.Set(kv.Key("second"), []byte("xxx")) - s.prewriteTxnWithTTL(c, txn.(*tikvTxn), 1000) + s.prewriteTxnWithTTL(c, txn, 1000) - oracle := s.store.GetOracle() - currentTS, err := oracle.GetTimestamp(context.Background()) + o := s.store.GetOracle() + currentTS, err := o.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) c.Assert(currentTS, Greater, txn.StartTS()) bo := NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil) resolver := newLockResolver(s.store) // Call getTxnStatus to check the lock status. - status, err := resolver.getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, currentTS, true) + status, err := resolver.getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, currentTS, true, false, nil) c.Assert(err, IsNil) c.Assert(status.IsCommitted(), IsFalse) c.Assert(status.ttl, Greater, uint64(0)) @@ -307,9 +308,9 @@ func (s *testLockSuite) TestCheckTxnStatus(c *C) { c.Assert(timeBeforeExpire, Equals, int64(0)) // Then call getTxnStatus again and check the lock status. - currentTS, err = oracle.GetTimestamp(context.Background()) + currentTS, err = o.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) - status, err = newLockResolver(s.store).getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, 0, true) + status, err = newLockResolver(s.store).getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, 0, true, false, nil) c.Assert(err, IsNil) c.Assert(status.ttl, Equals, uint64(0)) c.Assert(status.commitTS, Equals, uint64(0)) @@ -317,7 +318,7 @@ func (s *testLockSuite) TestCheckTxnStatus(c *C) { // Call getTxnStatus on a committed transaction. startTS, commitTS := s.putKV(c, []byte("a"), []byte("a")) - status, err = newLockResolver(s.store).getTxnStatus(bo, startTS, []byte("a"), currentTS, currentTS, true) + status, err = newLockResolver(s.store).getTxnStatus(bo, startTS, []byte("a"), currentTS, currentTS, true, false, nil) c.Assert(err, IsNil) c.Assert(status.ttl, Equals, uint64(0)) c.Assert(status.commitTS, Equals, commitTS) @@ -328,24 +329,24 @@ func (s *testLockSuite) TestCheckTxnStatusNoWait(c *C) { c.Assert(err, IsNil) txn.Set(kv.Key("key"), []byte("value")) txn.Set(kv.Key("second"), []byte("xxx")) - committer, err := newTwoPhaseCommitterWithInit(txn.(*tikvTxn), 0) + committer, err := newTwoPhaseCommitterWithInit(txn, 0) c.Assert(err, IsNil) // Increase lock TTL to make CI more stable. - committer.lockTTL = txnLockTTL(txn.(*tikvTxn).startTime, 200*1024*1024) + committer.lockTTL = txnLockTTL(txn.startTime, 200*1024*1024) // Only prewrite the secondary key to simulate a concurrent prewrite case: // prewrite secondary regions success and prewrite the primary region is pending. err = committer.prewriteMutations(NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil), committer.mutationsOfKeys([][]byte{[]byte("second")})) c.Assert(err, IsNil) - oracle := s.store.GetOracle() - currentTS, err := oracle.GetTimestamp(context.Background()) + o := s.store.GetOracle() + currentTS, err := o.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) bo := NewBackofferWithVars(context.Background(), PrewriteMaxBackoff, nil) resolver := newLockResolver(s.store) // Call getTxnStatus for the TxnNotFound case. - _, err = resolver.getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, currentTS, false) + _, err = resolver.getTxnStatus(bo, txn.StartTS(), []byte("key"), currentTS, currentTS, false, false, nil) c.Assert(err, NotNil) _, ok := errors.Cause(err).(txnNotFoundErr) c.Assert(ok, IsTrue) @@ -362,14 +363,14 @@ func (s *testLockSuite) TestCheckTxnStatusNoWait(c *C) { TTL: 100000, } // Call getTxnStatusFromLock to cover the retry logic. - status, err := resolver.getTxnStatusFromLock(bo, lock, currentTS) + status, err := resolver.getTxnStatusFromLock(bo, lock, currentTS, false) c.Assert(err, IsNil) c.Assert(status.ttl, Greater, uint64(0)) c.Assert(<-errCh, IsNil) c.Assert(committer.cleanupMutations(bo, committer.mutations), IsNil) // Call getTxnStatusFromLock to cover TxnNotFound and retry timeout. - startTS, err := oracle.GetTimestamp(context.Background()) + startTS, err := o.GetTimestamp(context.Background(), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(err, IsNil) lock = &Lock{ Key: []byte("second"), @@ -377,18 +378,18 @@ func (s *testLockSuite) TestCheckTxnStatusNoWait(c *C) { TxnID: startTS, TTL: 1000, } - status, err = resolver.getTxnStatusFromLock(bo, lock, currentTS) + status, err = resolver.getTxnStatusFromLock(bo, lock, currentTS, false) c.Assert(err, IsNil) c.Assert(status.ttl, Equals, uint64(0)) c.Assert(status.commitTS, Equals, uint64(0)) c.Assert(status.action, Equals, kvrpcpb.Action_LockNotExistRollback) } -func (s *testLockSuite) prewriteTxn(c *C, txn *tikvTxn) { +func (s *testLockSuite) prewriteTxn(c *C, txn *KVTxn) { s.prewriteTxnWithTTL(c, txn, 0) } -func (s *testLockSuite) prewriteTxnWithTTL(c *C, txn *tikvTxn, ttl uint64) { +func (s *testLockSuite) prewriteTxnWithTTL(c *C, txn *KVTxn, ttl uint64) { committer, err := newTwoPhaseCommitterWithInit(txn, 0) c.Assert(err, IsNil) if ttl > 0 { @@ -400,12 +401,12 @@ func (s *testLockSuite) prewriteTxnWithTTL(c *C, txn *tikvTxn, ttl uint64) { } func (s *testLockSuite) mustGetLock(c *C, key []byte) *Lock { - ver, err := s.store.CurrentVersion() + ver, err := s.store.CurrentTimestamp(oracle.GlobalTxnScope) c.Assert(err, IsNil) bo := NewBackofferWithVars(context.Background(), getMaxBackoff, nil) req := tikvrpc.NewRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{ Key: key, - Version: ver.Ver, + Version: ver, }) loc, err := s.store.regionCache.LocateKey(bo, key) c.Assert(err, IsNil) @@ -435,7 +436,7 @@ func (s *testLockSuite) TestLockTTL(c *C) { c.Assert(err, IsNil) txn.Set(kv.Key("key"), []byte("value")) time.Sleep(time.Millisecond) - s.prewriteTxnWithTTL(c, txn.(*tikvTxn), 3100) + s.prewriteTxnWithTTL(c, txn, 3100) l := s.mustGetLock(c, []byte("key")) c.Assert(l.TTL >= defaultLockTTL, IsTrue) @@ -448,7 +449,7 @@ func (s *testLockSuite) TestLockTTL(c *C) { k, v := randKV(1024, 1024) txn.Set(kv.Key(k), []byte(v)) } - s.prewriteTxn(c, txn.(*tikvTxn)) + s.prewriteTxn(c, txn) l = s.mustGetLock(c, []byte("key")) s.ttlEquals(c, l.TTL, uint64(ttlFactor*2)+uint64(time.Since(start)/time.Millisecond)) @@ -458,7 +459,7 @@ func (s *testLockSuite) TestLockTTL(c *C) { c.Assert(err, IsNil) time.Sleep(time.Millisecond * 50) txn.Set(kv.Key("key"), []byte("value")) - s.prewriteTxn(c, txn.(*tikvTxn)) + s.prewriteTxn(c, txn) l = s.mustGetLock(c, []byte("key")) s.ttlEquals(c, l.TTL, defaultLockTTL+uint64(time.Since(start)/time.Millisecond)) } @@ -469,14 +470,14 @@ func (s *testLockSuite) TestBatchResolveLocks(c *C) { c.Assert(err, IsNil) txn.Set(kv.Key("k1"), []byte("v1")) txn.Set(kv.Key("k2"), []byte("v2")) - s.prewriteTxnWithTTL(c, txn.(*tikvTxn), 20000) + s.prewriteTxnWithTTL(c, txn, 20000) // The second transaction is an async commit transaction txn, err = s.store.Begin() c.Assert(err, IsNil) txn.Set(kv.Key("k3"), []byte("v3")) txn.Set(kv.Key("k4"), []byte("v4")) - tikvTxn := txn.(*tikvTxn) + tikvTxn := txn committer, err := newTwoPhaseCommitterWithInit(tikvTxn, 0) c.Assert(err, IsNil) committer.setAsyncCommit(true) @@ -491,9 +492,9 @@ func (s *testLockSuite) TestBatchResolveLocks(c *C) { } // Locks may not expired - msBeforeLockExpired := s.store.GetOracle().UntilExpired(locks[0].TxnID, locks[1].TTL) + msBeforeLockExpired := s.store.GetOracle().UntilExpired(locks[0].TxnID, locks[1].TTL, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(msBeforeLockExpired, Greater, int64(0)) - msBeforeLockExpired = s.store.GetOracle().UntilExpired(locks[3].TxnID, locks[3].TTL) + msBeforeLockExpired = s.store.GetOracle().UntilExpired(locks[3].TxnID, locks[3].TTL, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) c.Assert(msBeforeLockExpired, Greater, int64(0)) lr := newLockResolver(s.store) @@ -539,7 +540,7 @@ func (s *testLockSuite) TestZeroMinCommitTS(c *C) { mockValue := fmt.Sprintf(`return(%d)`, txn.StartTS()) c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/mockZeroCommitTS", mockValue), IsNil) - s.prewriteTxnWithTTL(c, txn.(*tikvTxn), 1000) + s.prewriteTxnWithTTL(c, txn, 1000) c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/mockZeroCommitTS"), IsNil) lock := s.mustGetLock(c, []byte("key")) @@ -584,3 +585,89 @@ func (s *testLockSuite) TestDeduplicateKeys(c *C) { c.Assert(out, Equals, "a b c") } } + +func (s *testLockSuite) prepareTxnFallenBackFromAsyncCommit(c *C) { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + err = txn.Set([]byte("fb1"), []byte("1")) + c.Assert(err, IsNil) + err = txn.Set([]byte("fb2"), []byte("2")) + c.Assert(err, IsNil) + + committer, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(err, IsNil) + c.Assert(committer.mutations.Len(), Equals, 2) + committer.lockTTL = 0 + committer.setAsyncCommit(true) + committer.maxCommitTS = committer.startTS + (100 << 18) // 100ms + + bo := NewBackoffer(context.Background(), PrewriteMaxBackoff) + err = committer.prewriteMutations(bo, committer.mutations.Slice(0, 1)) + c.Assert(err, IsNil) + c.Assert(committer.isAsyncCommit(), IsTrue) + + // Set an invalid maxCommitTS to produce MaxCommitTsTooLarge + committer.maxCommitTS = committer.startTS - 1 + err = committer.prewriteMutations(bo, committer.mutations.Slice(1, 2)) + c.Assert(err, IsNil) + c.Assert(committer.isAsyncCommit(), IsFalse) // Fallback due to MaxCommitTsTooLarge +} + +func (s *testLockSuite) TestCheckLocksFallenBackFromAsyncCommit(c *C) { + s.prepareTxnFallenBackFromAsyncCommit(c) + + lock := s.mustGetLock(c, []byte("fb1")) + c.Assert(lock.UseAsyncCommit, IsTrue) + bo := NewBackoffer(context.Background(), getMaxBackoff) + lr := newLockResolver(s.store) + status, err := lr.getTxnStatusFromLock(bo, lock, 0, false) + c.Assert(err, IsNil) + c.Assert(NewLock(status.primaryLock), DeepEquals, lock) + + _, err = lr.checkAllSecondaries(bo, lock, &status) + c.Assert(err.(*nonAsyncCommitLock), NotNil) + + status, err = lr.getTxnStatusFromLock(bo, lock, 0, true) + c.Assert(err, IsNil) + c.Assert(status.action, Equals, kvrpcpb.Action_TTLExpireRollback) + c.Assert(status.TTL(), Equals, uint64(0)) +} + +func (s *testLockSuite) TestResolveTxnFallenBackFromAsyncCommit(c *C) { + s.prepareTxnFallenBackFromAsyncCommit(c) + + lock := s.mustGetLock(c, []byte("fb1")) + c.Assert(lock.UseAsyncCommit, IsTrue) + bo := NewBackoffer(context.Background(), getMaxBackoff) + expire, pushed, err := newLockResolver(s.store).ResolveLocks(bo, 0, []*Lock{lock}) + c.Assert(err, IsNil) + c.Assert(expire, Equals, int64(0)) + c.Assert(len(pushed), Equals, 0) + + t3, err := s.store.Begin() + c.Assert(err, IsNil) + _, err = t3.Get(context.Background(), []byte("fb1")) + errMsgMustContain(c, err, "key not exist") + _, err = t3.Get(context.Background(), []byte("fb2")) + errMsgMustContain(c, err, "key not exist") +} + +func (s *testLockSuite) TestBatchResolveTxnFallenBackFromAsyncCommit(c *C) { + s.prepareTxnFallenBackFromAsyncCommit(c) + + lock := s.mustGetLock(c, []byte("fb1")) + c.Assert(lock.UseAsyncCommit, IsTrue) + bo := NewBackoffer(context.Background(), getMaxBackoff) + loc, err := s.store.regionCache.LocateKey(bo, []byte("fb1")) + c.Assert(err, IsNil) + ok, err := newLockResolver(s.store).BatchResolveLocks(bo, []*Lock{lock}, loc.Region) + c.Assert(err, IsNil) + c.Assert(ok, IsTrue) + + t3, err := s.store.Begin() + c.Assert(err, IsNil) + _, err = t3.Get(context.Background(), []byte("fb1")) + errMsgMustContain(c, err, "key not exist") + _, err = t3.Get(context.Background(), []byte("fb2")) + errMsgMustContain(c, err, "key not exist") +} diff --git a/store/tikv/logutil/hex.go b/store/tikv/logutil/hex.go new file mode 100644 index 0000000000000..cc657d311cad4 --- /dev/null +++ b/store/tikv/logutil/hex.go @@ -0,0 +1,78 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "bytes" + "encoding/hex" + "fmt" + "io" + "reflect" + "strings" + + "github.com/golang/protobuf/proto" +) + +// Hex defines a fmt.Stringer for proto.Message. +// We can't define the String() method on proto.Message, but we can wrap it. +func Hex(msg proto.Message) fmt.Stringer { + return hexStringer{msg} +} + +type hexStringer struct { + proto.Message +} + +func (h hexStringer) String() string { + val := reflect.ValueOf(h.Message) + var w bytes.Buffer + prettyPrint(&w, val) + return w.String() +} + +func prettyPrint(w io.Writer, val reflect.Value) { + tp := val.Type() + switch val.Kind() { + case reflect.Slice: + elemType := tp.Elem() + if elemType.Kind() == reflect.Uint8 { + fmt.Fprintf(w, "%s", hex.EncodeToString(val.Bytes())) + } else { + fmt.Fprintf(w, "%s", val.Interface()) + } + case reflect.Struct: + fmt.Fprintf(w, "{") + for i := 0; i < val.NumField(); i++ { + fv := val.Field(i) + ft := tp.Field(i) + if strings.HasPrefix(ft.Name, "XXX_") { + continue + } + if i != 0 { + fmt.Fprintf(w, " ") + } + fmt.Fprintf(w, "%s:", ft.Name) + prettyPrint(w, fv) + } + fmt.Fprintf(w, "}") + case reflect.Ptr: + if val.IsNil() { + fmt.Fprintf(w, "%v", val.Interface()) + } else { + prettyPrint(w, reflect.Indirect(val)) + } + default: + fmt.Fprintf(w, "%v", val.Interface()) + } +} diff --git a/store/tikv/logutil/log.go b/store/tikv/logutil/log.go new file mode 100644 index 0000000000000..9ddf5b98f644a --- /dev/null +++ b/store/tikv/logutil/log.go @@ -0,0 +1,41 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "context" + + "github.com/pingcap/log" + "go.uber.org/zap" +) + +// BgLogger returns the default global logger. +func BgLogger() *zap.Logger { + return log.L() +} + +// Logger gets a contextual logger from current context. +// contextual logger will output common fields from context. +func Logger(ctx context.Context) *zap.Logger { + if ctxlogger, ok := ctx.Value(CtxLogKey).(*zap.Logger); ok { + return ctxlogger + } + return log.L() +} + +type ctxLogKeyType struct{} + +// CtxLogKey is the key to retrieve logger from context. +// It can be assigned to another value. +var CtxLogKey interface{} = ctxLogKeyType{} diff --git a/store/tikv/logutil/tracing.go b/store/tikv/logutil/tracing.go new file mode 100644 index 0000000000000..e45f1a586bf5a --- /dev/null +++ b/store/tikv/logutil/tracing.go @@ -0,0 +1,46 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package logutil + +import ( + "context" + "fmt" + + "github.com/opentracing/opentracing-go" + "github.com/opentracing/opentracing-go/log" +) + +// TraceEventKey presents the TraceEventKey in span log. +var TraceEventKey = "event" + +// Event records event in current tracing span. +func Event(ctx context.Context, event string) { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span.LogFields(log.String(TraceEventKey, event)) + } +} + +// Eventf records event in current tracing span with format support. +func Eventf(ctx context.Context, format string, args ...interface{}) { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span.LogFields(log.String(TraceEventKey, fmt.Sprintf(format, args...))) + } +} + +// SetTag sets tag kv-pair in current tracing span +func SetTag(ctx context.Context, key string, value interface{}) { + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span.SetTag(key, value) + } +} diff --git a/store/tikv/metrics/metrics.go b/store/tikv/metrics/metrics.go new file mode 100644 index 0000000000000..2af1abfcab912 --- /dev/null +++ b/store/tikv/metrics/metrics.go @@ -0,0 +1,407 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import "github.com/prometheus/client_golang/prometheus" + +// Client metrics. +var ( + TiKVTxnCmdHistogram *prometheus.HistogramVec + TiKVBackoffHistogram *prometheus.HistogramVec + TiKVSendReqHistogram *prometheus.HistogramVec + TiKVCoprocessorHistogram prometheus.Histogram + TiKVLockResolverCounter *prometheus.CounterVec + TiKVRegionErrorCounter *prometheus.CounterVec + TiKVTxnWriteKVCountHistogram prometheus.Histogram + TiKVTxnWriteSizeHistogram prometheus.Histogram + TiKVRawkvCmdHistogram *prometheus.HistogramVec + TiKVRawkvSizeHistogram *prometheus.HistogramVec + TiKVTxnRegionsNumHistogram *prometheus.HistogramVec + TiKVLoadSafepointCounter *prometheus.CounterVec + TiKVSecondaryLockCleanupFailureCounter *prometheus.CounterVec + TiKVRegionCacheCounter *prometheus.CounterVec + TiKVLocalLatchWaitTimeHistogram prometheus.Histogram + TiKVStatusDuration *prometheus.HistogramVec + TiKVStatusCounter *prometheus.CounterVec + TiKVBatchWaitDuration prometheus.Histogram + TiKVBatchSendLatency prometheus.Histogram + TiKvBatchWaitOverLoad prometheus.Counter + TiKVBatchPendingRequests *prometheus.HistogramVec + TiKVBatchRequests *prometheus.HistogramVec + TiKVBatchClientUnavailable prometheus.Histogram + TiKVBatchClientWaitEstablish prometheus.Histogram + TiKVRangeTaskStats *prometheus.GaugeVec + TiKVRangeTaskPushDuration *prometheus.HistogramVec + TiKVTokenWaitDuration prometheus.Histogram + TiKVTxnHeartBeatHistogram *prometheus.HistogramVec + TiKVPessimisticLockKeysDuration prometheus.Histogram + TiKVTTLLifeTimeReachCounter prometheus.Counter + TiKVNoAvailableConnectionCounter prometheus.Counter + TiKVAsyncCommitTxnCounter *prometheus.CounterVec + TiKVOnePCTxnCounter *prometheus.CounterVec + TiKVStoreLimitErrorCounter *prometheus.CounterVec +) + +// Label constants. +const ( + LblType = "type" + LblResult = "result" + LblStore = "store" + LblCommit = "commit" + LblAbort = "abort" + LblRollback = "rollback" + LblBatchGet = "batch_get" + LblGet = "get" + LblLockKeys = "lock_keys" + LabelBatchRecvLoop = "batch-recv-loop" + LabelBatchSendLoop = "batch-send-loop" + LblAddress = "address" +) + +func initMetrics(namespace, subsystem string) { + TiKVTxnCmdHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "txn_cmd_duration_seconds", + Help: "Bucketed histogram of processing time of txn cmds.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }, []string{LblType}) + + TiKVBackoffHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "backoff_seconds", + Help: "total backoff seconds of a single backoffer.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }, []string{LblType}) + + TiKVSendReqHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "request_seconds", + Help: "Bucketed histogram of sending request duration.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }, []string{LblType, LblStore}) + + TiKVCoprocessorHistogram = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "cop_duration_seconds", + Help: "Run duration of a single coprocessor task, includes backoff time.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }) + + TiKVLockResolverCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "lock_resolver_actions_total", + Help: "Counter of lock resolver actions.", + }, []string{LblType}) + + TiKVRegionErrorCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "region_err_total", + Help: "Counter of region errors.", + }, []string{LblType}) + + TiKVTxnWriteKVCountHistogram = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "txn_write_kv_num", + Help: "Count of kv pairs to write in a transaction.", + Buckets: prometheus.ExponentialBuckets(1, 4, 17), // 1 ~ 4G + }) + + TiKVTxnWriteSizeHistogram = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "txn_write_size_bytes", + Help: "Size of kv pairs to write in a transaction.", + Buckets: prometheus.ExponentialBuckets(16, 4, 17), // 16Bytes ~ 64GB + }) + + TiKVRawkvCmdHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "rawkv_cmd_seconds", + Help: "Bucketed histogram of processing time of rawkv cmds.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 29), // 0.5ms ~ 1.5days + }, []string{LblType}) + + TiKVRawkvSizeHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "rawkv_kv_size_bytes", + Help: "Size of key/value to put, in bytes.", + Buckets: prometheus.ExponentialBuckets(1, 2, 30), // 1Byte ~ 512MB + }, []string{LblType}) + + TiKVTxnRegionsNumHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "txn_regions_num", + Help: "Number of regions in a transaction.", + Buckets: prometheus.ExponentialBuckets(1, 2, 25), // 1 ~ 16M + }, []string{LblType}) + + TiKVLoadSafepointCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "load_safepoint_total", + Help: "Counter of load safepoint.", + }, []string{LblType}) + + TiKVSecondaryLockCleanupFailureCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "lock_cleanup_task_total", + Help: "failure statistic of secondary lock cleanup task.", + }, []string{LblType}) + + TiKVRegionCacheCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "region_cache_operations_total", + Help: "Counter of region cache.", + }, []string{LblType, LblResult}) + + TiKVLocalLatchWaitTimeHistogram = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "local_latch_wait_seconds", + Help: "Wait time of a get local latch.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 20), // 0.5ms ~ 262s + }) + + TiKVStatusDuration = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "kv_status_api_duration", + Help: "duration for kv status api.", + Buckets: prometheus.ExponentialBuckets(0.0005, 2, 20), // 0.5ms ~ 262s + }, []string{"store"}) + + TiKVStatusCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "kv_status_api_count", + Help: "Counter of access kv status api.", + }, []string{LblResult}) + + TiKVBatchWaitDuration = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_wait_duration", + Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s + Help: "batch wait duration", + }) + TiKVBatchSendLatency = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_send_latency", + Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s + Help: "batch send latency", + }) + TiKvBatchWaitOverLoad = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_wait_overload", + Help: "event of tikv transport layer overload", + }) + TiKVBatchPendingRequests = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_pending_requests", + Buckets: prometheus.ExponentialBuckets(1, 2, 8), + Help: "number of requests pending in the batch channel", + }, []string{"store"}) + TiKVBatchRequests = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_requests", + Buckets: prometheus.ExponentialBuckets(1, 2, 8), + Help: "number of requests in one batch", + }, []string{"store"}) + TiKVBatchClientUnavailable = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_client_unavailable_seconds", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days + Help: "batch client unavailable", + }) + TiKVBatchClientWaitEstablish = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_client_wait_connection_establish", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 28), // 1ms ~ 1.5days + Help: "batch client wait new connection establish", + }) + + TiKVRangeTaskStats = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "range_task_stats", + Help: "stat of range tasks", + }, []string{LblType, LblResult}) + + TiKVRangeTaskPushDuration = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "range_task_push_duration", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s + Help: "duration to push sub tasks to range task workers", + }, []string{LblType}) + TiKVTokenWaitDuration = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_executor_token_wait_duration", + Buckets: prometheus.ExponentialBuckets(1, 2, 34), // 1ns ~ 8s + Help: "tidb txn token wait duration to process batches", + }) + + TiKVTxnHeartBeatHistogram = prometheus.NewHistogramVec( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "txn_heart_beat", + Help: "Bucketed histogram of the txn_heartbeat request duration.", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 20), // 1ms ~ 524s + }, []string{LblType}) + TiKVPessimisticLockKeysDuration = prometheus.NewHistogram( + prometheus.HistogramOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "pessimistic_lock_keys_duration", + Buckets: prometheus.ExponentialBuckets(0.001, 2, 24), // 1ms ~ 8389s + Help: "tidb txn pessimistic lock keys duration", + }) + + TiKVTTLLifeTimeReachCounter = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "ttl_lifetime_reach_total", + Help: "Counter of ttlManager live too long.", + }) + + TiKVNoAvailableConnectionCounter = prometheus.NewCounter( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "batch_client_no_available_connection_total", + Help: "Counter of no available batch client.", + }) + + TiKVAsyncCommitTxnCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "async_commit_txn_counter", + Help: "Counter of async commit transactions.", + }, []string{LblType}) + + TiKVOnePCTxnCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "one_pc_txn_counter", + Help: "Counter of 1PC transactions.", + }, []string{LblType}) + + TiKVStoreLimitErrorCounter = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "get_store_limit_token_error", + Help: "store token is up to the limit, probably because one of the stores is the hotspot or unavailable", + }, []string{LblAddress, LblStore}) + + initShortcuts() +} + +func init() { + initMetrics("tikv", "client_go") +} + +// InitMetrics initializes metrics variables with given namespace and subsystem name. +func InitMetrics(namespace, subsystem string) { + initMetrics(namespace, subsystem) +} + +// RegisterMetrics registers all metrics variables. +// Note: to change default namespace and subsystem name, call `InitMetrics` before registering. +func RegisterMetrics() { + prometheus.MustRegister(TiKVTxnCmdHistogram) + prometheus.MustRegister(TiKVBackoffHistogram) + prometheus.MustRegister(TiKVSendReqHistogram) + prometheus.MustRegister(TiKVCoprocessorHistogram) + prometheus.MustRegister(TiKVLockResolverCounter) + prometheus.MustRegister(TiKVRegionErrorCounter) + prometheus.MustRegister(TiKVTxnWriteKVCountHistogram) + prometheus.MustRegister(TiKVTxnWriteSizeHistogram) + prometheus.MustRegister(TiKVRawkvCmdHistogram) + prometheus.MustRegister(TiKVRawkvSizeHistogram) + prometheus.MustRegister(TiKVTxnRegionsNumHistogram) + prometheus.MustRegister(TiKVLoadSafepointCounter) + prometheus.MustRegister(TiKVSecondaryLockCleanupFailureCounter) + prometheus.MustRegister(TiKVRegionCacheCounter) + prometheus.MustRegister(TiKVLocalLatchWaitTimeHistogram) + prometheus.MustRegister(TiKVStatusDuration) + prometheus.MustRegister(TiKVStatusCounter) + prometheus.MustRegister(TiKVBatchWaitDuration) + prometheus.MustRegister(TiKVBatchSendLatency) + prometheus.MustRegister(TiKvBatchWaitOverLoad) + prometheus.MustRegister(TiKVBatchPendingRequests) + prometheus.MustRegister(TiKVBatchRequests) + prometheus.MustRegister(TiKVBatchClientUnavailable) + prometheus.MustRegister(TiKVBatchClientWaitEstablish) + prometheus.MustRegister(TiKVRangeTaskStats) + prometheus.MustRegister(TiKVRangeTaskPushDuration) + prometheus.MustRegister(TiKVTokenWaitDuration) + prometheus.MustRegister(TiKVTxnHeartBeatHistogram) + prometheus.MustRegister(TiKVPessimisticLockKeysDuration) + prometheus.MustRegister(TiKVTTLLifeTimeReachCounter) + prometheus.MustRegister(TiKVNoAvailableConnectionCounter) + prometheus.MustRegister(TiKVAsyncCommitTxnCounter) + prometheus.MustRegister(TiKVOnePCTxnCounter) + prometheus.MustRegister(TiKVStoreLimitErrorCounter) +} diff --git a/store/tikv/metrics/shortcuts.go b/store/tikv/metrics/shortcuts.go new file mode 100644 index 0000000000000..5f82405e7041c --- /dev/null +++ b/store/tikv/metrics/shortcuts.go @@ -0,0 +1,175 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package metrics + +import "github.com/prometheus/client_golang/prometheus" + +// Shortcuts for performance improvement. +var ( + TxnCmdHistogramWithCommit prometheus.Observer + TxnCmdHistogramWithRollback prometheus.Observer + TxnCmdHistogramWithBatchGet prometheus.Observer + TxnCmdHistogramWithGet prometheus.Observer + TxnCmdHistogramWithLockKeys prometheus.Observer + + RawkvCmdHistogramWithGet prometheus.Observer + RawkvCmdHistogramWithBatchGet prometheus.Observer + RawkvCmdHistogramWithBatchPut prometheus.Observer + RawkvCmdHistogramWithDelete prometheus.Observer + RawkvCmdHistogramWithBatchDelete prometheus.Observer + RawkvCmdHistogramWithRawScan prometheus.Observer + RawkvCmdHistogramWithRawReversScan prometheus.Observer + RawkvSizeHistogramWithKey prometheus.Observer + RawkvSizeHistogramWithValue prometheus.Observer + + BackoffHistogramRPC prometheus.Observer + BackoffHistogramLock prometheus.Observer + BackoffHistogramLockFast prometheus.Observer + BackoffHistogramPD prometheus.Observer + BackoffHistogramRegionMiss prometheus.Observer + BackoffHistogramServerBusy prometheus.Observer + BackoffHistogramStaleCmd prometheus.Observer + BackoffHistogramEmpty prometheus.Observer + + TxnRegionsNumHistogramWithSnapshot prometheus.Observer + TxnRegionsNumHistogramPrewrite prometheus.Observer + TxnRegionsNumHistogramCommit prometheus.Observer + TxnRegionsNumHistogramCleanup prometheus.Observer + TxnRegionsNumHistogramPessimisticLock prometheus.Observer + TxnRegionsNumHistogramPessimisticRollback prometheus.Observer + TxnRegionsNumHistogramWithCoprocessor prometheus.Observer + TxnRegionsNumHistogramWithBatchCoprocessor prometheus.Observer + + LockResolverCountWithBatchResolve prometheus.Counter + LockResolverCountWithExpired prometheus.Counter + LockResolverCountWithNotExpired prometheus.Counter + LockResolverCountWithWaitExpired prometheus.Counter + LockResolverCountWithResolve prometheus.Counter + LockResolverCountWithResolveForWrite prometheus.Counter + LockResolverCountWithResolveAsync prometheus.Counter + LockResolverCountWithWriteConflict prometheus.Counter + LockResolverCountWithQueryTxnStatus prometheus.Counter + LockResolverCountWithQueryTxnStatusCommitted prometheus.Counter + LockResolverCountWithQueryTxnStatusRolledBack prometheus.Counter + LockResolverCountWithQueryCheckSecondaryLocks prometheus.Counter + LockResolverCountWithResolveLocks prometheus.Counter + LockResolverCountWithResolveLockLite prometheus.Counter + + RegionCacheCounterWithInvalidateRegionFromCacheOK prometheus.Counter + RegionCacheCounterWithSendFail prometheus.Counter + RegionCacheCounterWithGetRegionByIDOK prometheus.Counter + RegionCacheCounterWithGetRegionByIDError prometheus.Counter + RegionCacheCounterWithGetRegionOK prometheus.Counter + RegionCacheCounterWithGetRegionError prometheus.Counter + RegionCacheCounterWithScanRegionsOK prometheus.Counter + RegionCacheCounterWithScanRegionsError prometheus.Counter + RegionCacheCounterWithGetStoreOK prometheus.Counter + RegionCacheCounterWithGetStoreError prometheus.Counter + RegionCacheCounterWithInvalidateStoreRegionsOK prometheus.Counter + + TxnHeartBeatHistogramOK prometheus.Observer + TxnHeartBeatHistogramError prometheus.Observer + + StatusCountWithOK prometheus.Counter + StatusCountWithError prometheus.Counter + + SecondaryLockCleanupFailureCounterCommit prometheus.Counter + SecondaryLockCleanupFailureCounterRollback prometheus.Counter + + AsyncCommitTxnCounterOk prometheus.Counter + AsyncCommitTxnCounterError prometheus.Counter + + OnePCTxnCounterOk prometheus.Counter + OnePCTxnCounterError prometheus.Counter + OnePCTxnCounterFallback prometheus.Counter +) + +func initShortcuts() { + TxnCmdHistogramWithCommit = TiKVTxnCmdHistogram.WithLabelValues(LblCommit) + TxnCmdHistogramWithRollback = TiKVTxnCmdHistogram.WithLabelValues(LblRollback) + TxnCmdHistogramWithBatchGet = TiKVTxnCmdHistogram.WithLabelValues(LblBatchGet) + TxnCmdHistogramWithGet = TiKVTxnCmdHistogram.WithLabelValues(LblGet) + TxnCmdHistogramWithLockKeys = TiKVTxnCmdHistogram.WithLabelValues(LblLockKeys) + + RawkvCmdHistogramWithGet = TiKVRawkvCmdHistogram.WithLabelValues("get") + RawkvCmdHistogramWithBatchGet = TiKVRawkvCmdHistogram.WithLabelValues("batch_get") + RawkvCmdHistogramWithBatchPut = TiKVRawkvCmdHistogram.WithLabelValues("batch_put") + RawkvCmdHistogramWithDelete = TiKVRawkvCmdHistogram.WithLabelValues("delete") + RawkvCmdHistogramWithBatchDelete = TiKVRawkvCmdHistogram.WithLabelValues("batch_delete") + RawkvCmdHistogramWithRawScan = TiKVRawkvCmdHistogram.WithLabelValues("raw_scan") + RawkvCmdHistogramWithRawReversScan = TiKVRawkvCmdHistogram.WithLabelValues("raw_reverse_scan") + RawkvSizeHistogramWithKey = TiKVRawkvSizeHistogram.WithLabelValues("key") + RawkvSizeHistogramWithValue = TiKVRawkvSizeHistogram.WithLabelValues("value") + + BackoffHistogramRPC = TiKVBackoffHistogram.WithLabelValues("tikvRPC") + BackoffHistogramLock = TiKVBackoffHistogram.WithLabelValues("txnLock") + BackoffHistogramLockFast = TiKVBackoffHistogram.WithLabelValues("tikvLockFast") + BackoffHistogramPD = TiKVBackoffHistogram.WithLabelValues("pdRPC") + BackoffHistogramRegionMiss = TiKVBackoffHistogram.WithLabelValues("regionMiss") + BackoffHistogramServerBusy = TiKVBackoffHistogram.WithLabelValues("serverBusy") + BackoffHistogramStaleCmd = TiKVBackoffHistogram.WithLabelValues("staleCommand") + BackoffHistogramEmpty = TiKVBackoffHistogram.WithLabelValues("") + + TxnRegionsNumHistogramWithSnapshot = TiKVTxnRegionsNumHistogram.WithLabelValues("snapshot") + TxnRegionsNumHistogramPrewrite = TiKVTxnRegionsNumHistogram.WithLabelValues("2pc_prewrite") + TxnRegionsNumHistogramCommit = TiKVTxnRegionsNumHistogram.WithLabelValues("2pc_commit") + TxnRegionsNumHistogramCleanup = TiKVTxnRegionsNumHistogram.WithLabelValues("2pc_cleanup") + TxnRegionsNumHistogramPessimisticLock = TiKVTxnRegionsNumHistogram.WithLabelValues("2pc_pessimistic_lock") + TxnRegionsNumHistogramPessimisticRollback = TiKVTxnRegionsNumHistogram.WithLabelValues("2pc_pessimistic_rollback") + TxnRegionsNumHistogramWithCoprocessor = TiKVTxnRegionsNumHistogram.WithLabelValues("coprocessor") + TxnRegionsNumHistogramWithBatchCoprocessor = TiKVTxnRegionsNumHistogram.WithLabelValues("batch_coprocessor") + + LockResolverCountWithBatchResolve = TiKVLockResolverCounter.WithLabelValues("batch_resolve") + LockResolverCountWithExpired = TiKVLockResolverCounter.WithLabelValues("expired") + LockResolverCountWithNotExpired = TiKVLockResolverCounter.WithLabelValues("not_expired") + LockResolverCountWithWaitExpired = TiKVLockResolverCounter.WithLabelValues("wait_expired") + LockResolverCountWithResolve = TiKVLockResolverCounter.WithLabelValues("resolve") + LockResolverCountWithResolveForWrite = TiKVLockResolverCounter.WithLabelValues("resolve_for_write") + LockResolverCountWithResolveAsync = TiKVLockResolverCounter.WithLabelValues("resolve_async_commit") + LockResolverCountWithWriteConflict = TiKVLockResolverCounter.WithLabelValues("write_conflict") + LockResolverCountWithQueryTxnStatus = TiKVLockResolverCounter.WithLabelValues("query_txn_status") + LockResolverCountWithQueryTxnStatusCommitted = TiKVLockResolverCounter.WithLabelValues("query_txn_status_committed") + LockResolverCountWithQueryTxnStatusRolledBack = TiKVLockResolverCounter.WithLabelValues("query_txn_status_rolled_back") + LockResolverCountWithQueryCheckSecondaryLocks = TiKVLockResolverCounter.WithLabelValues("query_check_secondary_locks") + LockResolverCountWithResolveLocks = TiKVLockResolverCounter.WithLabelValues("query_resolve_locks") + LockResolverCountWithResolveLockLite = TiKVLockResolverCounter.WithLabelValues("query_resolve_lock_lite") + + RegionCacheCounterWithInvalidateRegionFromCacheOK = TiKVRegionCacheCounter.WithLabelValues("invalidate_region_from_cache", "ok") + RegionCacheCounterWithSendFail = TiKVRegionCacheCounter.WithLabelValues("send_fail", "ok") + RegionCacheCounterWithGetRegionByIDOK = TiKVRegionCacheCounter.WithLabelValues("get_region_by_id", "ok") + RegionCacheCounterWithGetRegionByIDError = TiKVRegionCacheCounter.WithLabelValues("get_region_by_id", "err") + RegionCacheCounterWithGetRegionOK = TiKVRegionCacheCounter.WithLabelValues("get_region", "ok") + RegionCacheCounterWithGetRegionError = TiKVRegionCacheCounter.WithLabelValues("get_region", "err") + RegionCacheCounterWithScanRegionsOK = TiKVRegionCacheCounter.WithLabelValues("scan_regions", "ok") + RegionCacheCounterWithScanRegionsError = TiKVRegionCacheCounter.WithLabelValues("scan_regions", "err") + RegionCacheCounterWithGetStoreOK = TiKVRegionCacheCounter.WithLabelValues("get_store", "ok") + RegionCacheCounterWithGetStoreError = TiKVRegionCacheCounter.WithLabelValues("get_store", "err") + RegionCacheCounterWithInvalidateStoreRegionsOK = TiKVRegionCacheCounter.WithLabelValues("invalidate_store_regions", "ok") + + TxnHeartBeatHistogramOK = TiKVTxnHeartBeatHistogram.WithLabelValues("ok") + TxnHeartBeatHistogramError = TiKVTxnHeartBeatHistogram.WithLabelValues("err") + + StatusCountWithOK = TiKVStatusCounter.WithLabelValues("ok") + StatusCountWithError = TiKVStatusCounter.WithLabelValues("err") + + SecondaryLockCleanupFailureCounterCommit = TiKVSecondaryLockCleanupFailureCounter.WithLabelValues("commit") + SecondaryLockCleanupFailureCounterRollback = TiKVSecondaryLockCleanupFailureCounter.WithLabelValues("rollback") + + AsyncCommitTxnCounterOk = TiKVAsyncCommitTxnCounter.WithLabelValues("ok") + AsyncCommitTxnCounterError = TiKVAsyncCommitTxnCounter.WithLabelValues("err") + + OnePCTxnCounterOk = TiKVOnePCTxnCounter.WithLabelValues("ok") + OnePCTxnCounterError = TiKVOnePCTxnCounter.WithLabelValues("err") + OnePCTxnCounterFallback = TiKVOnePCTxnCounter.WithLabelValues("fallback") +} diff --git a/store/tikv/mock_tikv_service_test.go b/store/tikv/mock_tikv_service_test.go index f092f8ee780bc..d86c90bb10d41 100644 --- a/store/tikv/mock_tikv_service_test.go +++ b/store/tikv/mock_tikv_service_test.go @@ -6,7 +6,7 @@ import ( "time" "github.com/pingcap/kvproto/pkg/tikvpb" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/store/tikv/logutil" "go.uber.org/zap" "google.golang.org/grpc" ) diff --git a/store/mockstore/cluster/cluster.go b/store/tikv/mockstore/cluster/cluster.go similarity index 94% rename from store/mockstore/cluster/cluster.go rename to store/tikv/mockstore/cluster/cluster.go index 569bb3717095a..d1fda9483d4da 100644 --- a/store/mockstore/cluster/cluster.go +++ b/store/tikv/mockstore/cluster/cluster.go @@ -17,7 +17,6 @@ import ( "time" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/kv" ) // Cluster simulates a TiKV cluster. @@ -41,9 +40,9 @@ type Cluster interface { // SplitIndex evenly splits the data in index into count regions. SplitIndex(tableID, indexID int64, count int) // SplitKeys evenly splits the start, end key into "count" regions. - SplitKeys(start, end kv.Key, count int) + SplitKeys(start, end []byte, count int) // AddStore adds a new Store to the cluster. - AddStore(storeID uint64, addr string) + AddStore(storeID uint64, addr string, labels ...*metapb.StoreLabel) // RemoveStore removes a Store from the cluster. RemoveStore(storeID uint64) } diff --git a/store/tikv/oracle/oracle.go b/store/tikv/oracle/oracle.go index 9381622e3b3a9..94b45c3517858 100644 --- a/store/tikv/oracle/oracle.go +++ b/store/tikv/oracle/oracle.go @@ -18,18 +18,25 @@ import ( "time" "github.com/pingcap/failpoint" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/store/tikv/logutil" "go.uber.org/zap" ) +// Option represents available options for the oracle.Oracle. +type Option struct { + TxnScope string +} + // Oracle is the interface that provides strictly ascending timestamps. type Oracle interface { - GetTimestamp(ctx context.Context) (uint64, error) - GetTimestampAsync(ctx context.Context) Future - GetLowResolutionTimestamp(ctx context.Context) (uint64, error) - GetLowResolutionTimestampAsync(ctx context.Context) Future - IsExpired(lockTimestamp uint64, TTL uint64) bool - UntilExpired(lockTimeStamp uint64, TTL uint64) int64 + GetTimestamp(ctx context.Context, opt *Option) (uint64, error) + GetTimestampAsync(ctx context.Context, opt *Option) Future + GetLowResolutionTimestamp(ctx context.Context, opt *Option) (uint64, error) + GetLowResolutionTimestampAsync(ctx context.Context, opt *Option) Future + GetStaleTimestamp(ctx context.Context, txnScope string, prevSecond uint64) (uint64, error) + IsExpired(lockTimestamp, TTL uint64, opt *Option) bool + UntilExpired(lockTimeStamp, TTL uint64, opt *Option) int64 Close() } @@ -38,7 +45,57 @@ type Future interface { Wait() (uint64, error) } -const physicalShiftBits = 18 +// TxnScope indicates the used txnScope for oracle +type TxnScope struct { + // varValue indicates the value of @@txn_scope, which can only be `global` or `local` + varValue string + // txnScope indicates the value which the tidb-server holds to request tso to pd + txnScope string +} + +// GetTxnScope gets oracle.TxnScope from config +func GetTxnScope() TxnScope { + isGlobal, location := config.GetTxnScopeFromConfig() + if isGlobal { + return NewGlobalTxnScope() + } + return NewLocalTxnScope(location) +} + +// NewGlobalTxnScope creates a Global TxnScope +func NewGlobalTxnScope() TxnScope { + return newTxnScope(GlobalTxnScope, GlobalTxnScope) +} + +// NewLocalTxnScope creates a Local TxnScope with given real txnScope value. +func NewLocalTxnScope(txnScope string) TxnScope { + return newTxnScope(LocalTxnScope, txnScope) +} + +// GetVarValue returns the value of @@txn_scope which can only be `global` or `local` +func (t TxnScope) GetVarValue() string { + return t.varValue +} + +// GetTxnScope returns the value of the tidb-server holds to request tso to pd. +func (t TxnScope) GetTxnScope() string { + return t.txnScope +} + +func newTxnScope(varValue string, txnScope string) TxnScope { + return TxnScope{ + varValue: varValue, + txnScope: txnScope, + } +} + +const ( + physicalShiftBits = 18 + // GlobalTxnScope is the default transaction scope for a Oracle service. + GlobalTxnScope = "global" + // LocalTxnScope indicates the local txn scope for a Oracle service. + LocalTxnScope = "local" +) // ComposeTS creates a ts from physical and logical parts. func ComposeTS(physical, logical int64) uint64 { @@ -78,3 +135,9 @@ func GetTimeFromTS(ts uint64) time.Time { ms := ExtractPhysical(ts) return time.Unix(ms/1e3, (ms%1e3)*1e6) } + +// GoTimeToTS converts a Go time to uint64 timestamp. +func GoTimeToTS(t time.Time) uint64 { + ts := (t.UnixNano() / int64(time.Millisecond)) << physicalShiftBits + return uint64(ts) +} diff --git a/store/tikv/oracle/oracles/export_test.go b/store/tikv/oracle/oracles/export_test.go index 999c8cf5f6e39..50d3bf076230c 100644 --- a/store/tikv/oracle/oracles/export_test.go +++ b/store/tikv/oracle/oracles/export_test.go @@ -14,6 +14,7 @@ package oracles import ( + "sync/atomic" "time" "github.com/pingcap/tidb/store/tikv/oracle" @@ -45,10 +46,24 @@ func NewEmptyPDOracle() oracle.Oracle { return &pdOracle{} } -// SetEmptyPDOracleLastTs exports PD oracle's last ts to test. +// SetEmptyPDOracleLastTs exports PD oracle's global last ts to test. func SetEmptyPDOracleLastTs(oc oracle.Oracle, ts uint64) { switch o := oc.(type) { case *pdOracle: - o.lastTS = ts + lastTSInterface, _ := o.lastTSMap.LoadOrStore(oracle.GlobalTxnScope, new(uint64)) + lastTSPointer := lastTSInterface.(*uint64) + atomic.StoreUint64(lastTSPointer, ts) + lasTSArrivalInterface, _ := o.lastArrivalTSMap.LoadOrStore(oracle.GlobalTxnScope, new(uint64)) + lasTSArrivalPointer := lasTSArrivalInterface.(*uint64) + atomic.StoreUint64(lasTSArrivalPointer, uint64(time.Now().Unix()*1000)) + } + setEmptyPDOracleLastArrivalTs(oc, ts) +} + +// setEmptyPDOracleLastArrivalTs exports PD oracle's global last ts to test. +func setEmptyPDOracleLastArrivalTs(oc oracle.Oracle, ts uint64) { + switch o := oc.(type) { + case *pdOracle: + o.setLastArrivalTS(ts, oracle.GlobalTxnScope) } } diff --git a/store/tikv/oracle/oracles/local.go b/store/tikv/oracle/oracles/local.go index 8c4f069f1c0fa..4fcd7cbc51d78 100644 --- a/store/tikv/oracle/oracles/local.go +++ b/store/tikv/oracle/oracles/local.go @@ -37,7 +37,7 @@ func NewLocalOracle() oracle.Oracle { return &localOracle{} } -func (l *localOracle) IsExpired(lockTS uint64, TTL uint64) bool { +func (l *localOracle) IsExpired(lockTS, TTL uint64, _ *oracle.Option) bool { now := time.Now() if l.hook != nil { now = l.hook.currentTime @@ -45,7 +45,7 @@ func (l *localOracle) IsExpired(lockTS uint64, TTL uint64) bool { return oracle.GetPhysical(now) >= oracle.ExtractPhysical(lockTS)+int64(TTL) } -func (l *localOracle) GetTimestamp(context.Context) (uint64, error) { +func (l *localOracle) GetTimestamp(ctx context.Context, _ *oracle.Option) (uint64, error) { l.Lock() defer l.Unlock() now := time.Now() @@ -63,19 +63,26 @@ func (l *localOracle) GetTimestamp(context.Context) (uint64, error) { return ts, nil } -func (l *localOracle) GetTimestampAsync(ctx context.Context) oracle.Future { +func (l *localOracle) GetTimestampAsync(ctx context.Context, _ *oracle.Option) oracle.Future { return &future{ ctx: ctx, l: l, } } -func (l *localOracle) GetLowResolutionTimestamp(ctx context.Context) (uint64, error) { - return l.GetTimestamp(ctx) +func (l *localOracle) GetLowResolutionTimestamp(ctx context.Context, opt *oracle.Option) (uint64, error) { + return l.GetTimestamp(ctx, opt) } -func (l *localOracle) GetLowResolutionTimestampAsync(ctx context.Context) oracle.Future { - return l.GetTimestampAsync(ctx) +func (l *localOracle) GetLowResolutionTimestampAsync(ctx context.Context, opt *oracle.Option) oracle.Future { + return l.GetTimestampAsync(ctx, opt) +} + +// GetStaleTimestamp return physical +func (l *localOracle) GetStaleTimestamp(ctx context.Context, txnScope string, prevSecond uint64) (ts uint64, err error) { + physical := oracle.GetPhysical(time.Now().Add(-time.Second * time.Duration(prevSecond))) + ts = oracle.ComposeTS(physical, 0) + return ts, nil } type future struct { @@ -84,11 +91,11 @@ type future struct { } func (f *future) Wait() (uint64, error) { - return f.l.GetTimestamp(f.ctx) + return f.l.GetTimestamp(f.ctx, &oracle.Option{}) } // UntilExpired implement oracle.Oracle interface. -func (l *localOracle) UntilExpired(lockTimeStamp uint64, TTL uint64) int64 { +func (l *localOracle) UntilExpired(lockTimeStamp, TTL uint64, opt *oracle.Option) int64 { now := time.Now() if l.hook != nil { now = l.hook.currentTime diff --git a/store/tikv/oracle/oracles/local_test.go b/store/tikv/oracle/oracles/local_test.go index d2dd31bfe5ee5..b478811002e84 100644 --- a/store/tikv/oracle/oracles/local_test.go +++ b/store/tikv/oracle/oracles/local_test.go @@ -15,54 +15,49 @@ package oracles_test import ( "context" - "testing" "time" + . "github.com/pingcap/check" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/oracle/oracles" ) -func TestLocalOracle(t *testing.T) { +var _ = Suite(&testOraclesSuite{}) + +type testOraclesSuite struct{} + +func (s *testOraclesSuite) TestLocalOracle(c *C) { l := oracles.NewLocalOracle() defer l.Close() m := map[uint64]struct{}{} for i := 0; i < 100000; i++ { - ts, err := l.GetTimestamp(context.Background()) - if err != nil { - t.Error(err) - } + ts, err := l.GetTimestamp(context.Background(), &oracle.Option{}) + c.Assert(err, IsNil) m[ts] = struct{}{} } - if len(m) != 100000 { - t.Error("generated same ts") - } + c.Assert(len(m), Equals, 100000, Commentf("should generate same ts")) } -func TestIsExpired(t *testing.T) { +func (s *testOraclesSuite) TestIsExpired(c *C) { o := oracles.NewLocalOracle() defer o.Close() start := time.Now() oracles.SetOracleHookCurrentTime(o, start) - ts, _ := o.GetTimestamp(context.Background()) + ts, _ := o.GetTimestamp(context.Background(), &oracle.Option{}) oracles.SetOracleHookCurrentTime(o, start.Add(10*time.Millisecond)) - expire := o.IsExpired(ts, 5) - if !expire { - t.Error("should expired") - } - expire = o.IsExpired(ts, 200) - if expire { - t.Error("should not expired") - } + expire := o.IsExpired(ts, 5, &oracle.Option{}) + c.Assert(expire, IsTrue, Commentf("should expire")) + expire = o.IsExpired(ts, 200, &oracle.Option{}) + c.Assert(expire, IsFalse, Commentf("should not expire")) } -func TestLocalOracle_UntilExpired(t *testing.T) { +func (s *testOraclesSuite) TestLocalOracle_UntilExpired(c *C) { o := oracles.NewLocalOracle() defer o.Close() start := time.Now() oracles.SetOracleHookCurrentTime(o, start) - ts, _ := o.GetTimestamp(context.Background()) + ts, _ := o.GetTimestamp(context.Background(), &oracle.Option{}) oracles.SetOracleHookCurrentTime(o, start.Add(10*time.Millisecond)) - if o.UntilExpired(ts, 5) != -5 || o.UntilExpired(ts, 15) != 5 { - t.Error("until expired should be +-5") - } + c.Assert(o.UntilExpired(ts, 5, &oracle.Option{}) == -5 && o.UntilExpired(ts, 15, &oracle.Option{}) == 5, IsTrue, Commentf("before it is expired, it should be +-5")) } diff --git a/store/mockoracle/oracle.go b/store/tikv/oracle/oracles/mock.go similarity index 73% rename from store/mockoracle/oracle.go rename to store/tikv/oracle/oracles/mock.go index c822696657d77..2afd962fb5c42 100644 --- a/store/mockoracle/oracle.go +++ b/store/tikv/oracle/oracles/mock.go @@ -11,7 +11,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package mockoracle +package oracles import ( "context" @@ -55,7 +55,7 @@ func (o *MockOracle) AddOffset(d time.Duration) { } // GetTimestamp implements oracle.Oracle interface. -func (o *MockOracle) GetTimestamp(context.Context) (uint64, error) { +func (o *MockOracle) GetTimestamp(ctx context.Context, _ *oracle.Option) (uint64, error) { o.Lock() defer o.Unlock() @@ -71,32 +71,39 @@ func (o *MockOracle) GetTimestamp(context.Context) (uint64, error) { return ts, nil } +// GetStaleTimestamp implements oracle.Oracle interface. +func (o *MockOracle) GetStaleTimestamp(ctx context.Context, txnScope string, prevSecond uint64) (ts uint64, err error) { + physical := oracle.GetPhysical(time.Now().Add(-time.Second * time.Duration(prevSecond))) + ts = oracle.ComposeTS(physical, 0) + return ts, nil +} + type mockOracleFuture struct { o *MockOracle ctx context.Context } func (m *mockOracleFuture) Wait() (uint64, error) { - return m.o.GetTimestamp(m.ctx) + return m.o.GetTimestamp(m.ctx, &oracle.Option{}) } // GetTimestampAsync implements oracle.Oracle interface. -func (o *MockOracle) GetTimestampAsync(ctx context.Context) oracle.Future { +func (o *MockOracle) GetTimestampAsync(ctx context.Context, _ *oracle.Option) oracle.Future { return &mockOracleFuture{o, ctx} } // GetLowResolutionTimestamp implements oracle.Oracle interface. -func (o *MockOracle) GetLowResolutionTimestamp(ctx context.Context) (uint64, error) { - return o.GetTimestamp(ctx) +func (o *MockOracle) GetLowResolutionTimestamp(ctx context.Context, opt *oracle.Option) (uint64, error) { + return o.GetTimestamp(ctx, opt) } // GetLowResolutionTimestampAsync implements oracle.Oracle interface. -func (o *MockOracle) GetLowResolutionTimestampAsync(ctx context.Context) oracle.Future { - return o.GetTimestampAsync(ctx) +func (o *MockOracle) GetLowResolutionTimestampAsync(ctx context.Context, opt *oracle.Option) oracle.Future { + return o.GetTimestampAsync(ctx, opt) } // IsExpired implements oracle.Oracle interface. -func (o *MockOracle) IsExpired(lockTimestamp uint64, TTL uint64) bool { +func (o *MockOracle) IsExpired(lockTimestamp, TTL uint64, _ *oracle.Option) bool { o.RLock() defer o.RUnlock() @@ -104,7 +111,7 @@ func (o *MockOracle) IsExpired(lockTimestamp uint64, TTL uint64) bool { } // UntilExpired implement oracle.Oracle interface. -func (o *MockOracle) UntilExpired(lockTimeStamp uint64, TTL uint64) int64 { +func (o *MockOracle) UntilExpired(lockTimeStamp, TTL uint64, _ *oracle.Option) int64 { o.RLock() defer o.RUnlock() return oracle.ExtractPhysical(lockTimeStamp) + int64(TTL) - oracle.GetPhysical(time.Now().Add(o.offset)) diff --git a/store/tikv/oracle/oracles/pd.go b/store/tikv/oracle/oracles/pd.go index a088ab5106271..011561a2b42d3 100644 --- a/store/tikv/oracle/oracles/pd.go +++ b/store/tikv/oracle/oracles/pd.go @@ -15,14 +15,16 @@ package oracles import ( "context" + "strings" + "sync" "sync/atomic" "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/pingcap/tidb/store/tikv/oracle" - "github.com/pingcap/tidb/util/logutil" - "github.com/tikv/pd/client" + pd "github.com/tikv/pd/client" "go.uber.org/zap" ) @@ -32,9 +34,12 @@ const slowDist = 30 * time.Millisecond // pdOracle is an Oracle that uses a placement driver client as source. type pdOracle struct { - c pd.Client - lastTS uint64 - quit chan struct{} + c pd.Client + // txn_scope (string) -> lastTSPointer (*uint64) + lastTSMap sync.Map + // txn_scope (string) -> lastArrivalTSPointer (*uint64) + lastArrivalTSMap sync.Map + quit chan struct{} } // NewPdOracle create an Oracle that uses a pd client source. @@ -49,8 +54,8 @@ func NewPdOracle(pdClient pd.Client, updateInterval time.Duration) (oracle.Oracl } ctx := context.TODO() go o.updateTS(ctx, updateInterval) - // Initialize lastTS by Get. - _, err := o.GetTimestamp(ctx) + // Initialize the timestamp of the global txnScope by Get. + _, err := o.GetTimestamp(ctx, &oracle.Option{TxnScope: oracle.GlobalTxnScope}) if err != nil { o.Close() return nil, errors.Trace(err) @@ -60,24 +65,28 @@ func NewPdOracle(pdClient pd.Client, updateInterval time.Duration) (oracle.Oracl // IsExpired returns whether lockTS+TTL is expired, both are ms. It uses `lastTS` // to compare, may return false negative result temporarily. -func (o *pdOracle) IsExpired(lockTS, TTL uint64) bool { - lastTS := atomic.LoadUint64(&o.lastTS) +func (o *pdOracle) IsExpired(lockTS, TTL uint64, opt *oracle.Option) bool { + lastTS, exist := o.getLastTS(opt.TxnScope) + if !exist { + return true + } return oracle.ExtractPhysical(lastTS) >= oracle.ExtractPhysical(lockTS)+int64(TTL) } // GetTimestamp gets a new increasing time. -func (o *pdOracle) GetTimestamp(ctx context.Context) (uint64, error) { - ts, err := o.getTimestamp(ctx) +func (o *pdOracle) GetTimestamp(ctx context.Context, opt *oracle.Option) (uint64, error) { + ts, err := o.getTimestamp(ctx, opt.TxnScope) if err != nil { return 0, errors.Trace(err) } - o.setLastTS(ts) + o.setLastTS(ts, opt.TxnScope) return ts, nil } type tsFuture struct { pd.TSFuture - o *pdOracle + o *pdOracle + txnScope string } // Wait implements the oracle.Future interface. @@ -89,18 +98,31 @@ func (f *tsFuture) Wait() (uint64, error) { return 0, errors.Trace(err) } ts := oracle.ComposeTS(physical, logical) - f.o.setLastTS(ts) + f.o.setLastTS(ts, f.txnScope) return ts, nil } -func (o *pdOracle) GetTimestampAsync(ctx context.Context) oracle.Future { - ts := o.c.GetTSAsync(ctx) - return &tsFuture{ts, o} +func (o *pdOracle) GetTimestampAsync(ctx context.Context, opt *oracle.Option) oracle.Future { + var ts pd.TSFuture + if opt.TxnScope == oracle.GlobalTxnScope || opt.TxnScope == "" { + ts = o.c.GetTSAsync(ctx) + } else { + ts = o.c.GetLocalTSAsync(ctx, opt.TxnScope) + } + return &tsFuture{ts, o, opt.TxnScope} } -func (o *pdOracle) getTimestamp(ctx context.Context) (uint64, error) { +func (o *pdOracle) getTimestamp(ctx context.Context, txnScope string) (uint64, error) { now := time.Now() - physical, logical, err := o.c.GetTS(ctx) + var ( + physical, logical int64 + err error + ) + if txnScope == oracle.GlobalTxnScope || txnScope == "" { + physical, logical, err = o.c.GetTS(ctx) + } else { + physical, logical, err = o.c.GetLocalTS(ctx, txnScope) + } if err != nil { return 0, errors.Trace(err) } @@ -112,11 +134,71 @@ func (o *pdOracle) getTimestamp(ctx context.Context) (uint64, error) { return oracle.ComposeTS(physical, logical), nil } -func (o *pdOracle) setLastTS(ts uint64) { - lastTS := atomic.LoadUint64(&o.lastTS) - if ts > lastTS { - atomic.CompareAndSwapUint64(&o.lastTS, lastTS, ts) +func (o *pdOracle) getArrivalTimestamp() uint64 { + return oracle.ComposeTS(oracle.GetPhysical(time.Now()), 0) +} + +func (o *pdOracle) setLastTS(ts uint64, txnScope string) { + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + lastTSInterface, ok := o.lastTSMap.Load(txnScope) + if !ok { + lastTSInterface, _ = o.lastTSMap.LoadOrStore(txnScope, new(uint64)) + } + lastTSPointer := lastTSInterface.(*uint64) + for { + lastTS := atomic.LoadUint64(lastTSPointer) + if ts <= lastTS { + return + } + if atomic.CompareAndSwapUint64(lastTSPointer, lastTS, ts) { + break + } + } + o.setLastArrivalTS(o.getArrivalTimestamp(), txnScope) +} + +func (o *pdOracle) setLastArrivalTS(ts uint64, txnScope string) { + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + lastTSInterface, ok := o.lastArrivalTSMap.Load(txnScope) + if !ok { + lastTSInterface, _ = o.lastArrivalTSMap.LoadOrStore(txnScope, new(uint64)) } + lastTSPointer := lastTSInterface.(*uint64) + for { + lastTS := atomic.LoadUint64(lastTSPointer) + if ts <= lastTS { + return + } + if atomic.CompareAndSwapUint64(lastTSPointer, lastTS, ts) { + return + } + } +} + +func (o *pdOracle) getLastTS(txnScope string) (uint64, bool) { + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + lastTSInterface, ok := o.lastTSMap.Load(txnScope) + if !ok { + return 0, false + } + return atomic.LoadUint64(lastTSInterface.(*uint64)), true +} + +func (o *pdOracle) getLastArrivalTS(txnScope string) (uint64, bool) { + if txnScope == "" { + txnScope = oracle.GlobalTxnScope + } + lastArrivalTSInterface, ok := o.lastArrivalTSMap.Load(txnScope) + if !ok { + return 0, false + } + return atomic.LoadUint64(lastArrivalTSInterface.(*uint64)), true } func (o *pdOracle) updateTS(ctx context.Context, interval time.Duration) { @@ -125,12 +207,17 @@ func (o *pdOracle) updateTS(ctx context.Context, interval time.Duration) { for { select { case <-ticker.C: - ts, err := o.getTimestamp(ctx) - if err != nil { - logutil.Logger(ctx).Error("updateTS error", zap.Error(err)) - break - } - o.setLastTS(ts) + // Update the timestamp for each txnScope + o.lastTSMap.Range(func(key, _ interface{}) bool { + txnScope := key.(string) + ts, err := o.getTimestamp(ctx, txnScope) + if err != nil { + logutil.Logger(ctx).Error("updateTS error", zap.String("txnScope", txnScope), zap.Error(err)) + return true + } + o.setLastTS(ts, txnScope) + return true + }) case <-o.quit: return } @@ -138,8 +225,11 @@ func (o *pdOracle) updateTS(ctx context.Context, interval time.Duration) { } // UntilExpired implement oracle.Oracle interface. -func (o *pdOracle) UntilExpired(lockTS uint64, TTL uint64) int64 { - lastTS := atomic.LoadUint64(&o.lastTS) +func (o *pdOracle) UntilExpired(lockTS uint64, TTL uint64, opt *oracle.Option) int64 { + lastTS, ok := o.getLastTS(opt.TxnScope) + if !ok { + return 0 + } return oracle.ExtractPhysical(lockTS) + int64(TTL) - oracle.ExtractPhysical(lastTS) } @@ -148,20 +238,71 @@ func (o *pdOracle) Close() { } // A future that resolves immediately to a low resolution timestamp. -type lowResolutionTsFuture uint64 +type lowResolutionTsFuture struct { + ts uint64 + err error +} // Wait implements the oracle.Future interface. func (f lowResolutionTsFuture) Wait() (uint64, error) { - return uint64(f), nil + return f.ts, f.err } // GetLowResolutionTimestamp gets a new increasing time. -func (o *pdOracle) GetLowResolutionTimestamp(ctx context.Context) (uint64, error) { - lastTS := atomic.LoadUint64(&o.lastTS) +func (o *pdOracle) GetLowResolutionTimestamp(ctx context.Context, opt *oracle.Option) (uint64, error) { + lastTS, ok := o.getLastTS(opt.TxnScope) + if !ok { + return 0, errors.Errorf("get low resolution timestamp fail, invalid txnScope = %s", opt.TxnScope) + } return lastTS, nil } -func (o *pdOracle) GetLowResolutionTimestampAsync(ctx context.Context) oracle.Future { - lastTS := atomic.LoadUint64(&o.lastTS) - return lowResolutionTsFuture(lastTS) +func (o *pdOracle) GetLowResolutionTimestampAsync(ctx context.Context, opt *oracle.Option) oracle.Future { + lastTS, ok := o.getLastTS(opt.TxnScope) + if !ok { + return lowResolutionTsFuture{ + ts: 0, + err: errors.Errorf("get low resolution timestamp async fail, invalid txnScope = %s", opt.TxnScope), + } + } + return lowResolutionTsFuture{ + ts: lastTS, + err: nil, + } +} + +func (o *pdOracle) getStaleTimestamp(txnScope string, prevSecond uint64) (uint64, error) { + ts, ok := o.getLastTS(txnScope) + if !ok { + return 0, errors.Errorf("get stale timestamp fail, txnScope: %s", txnScope) + } + arrivalTS, ok := o.getLastArrivalTS(txnScope) + if !ok { + return 0, errors.Errorf("get stale arrival timestamp fail, txnScope: %s", txnScope) + } + arrivalTime := oracle.GetTimeFromTS(arrivalTS) + physicalTime := oracle.GetTimeFromTS(ts) + if uint64(physicalTime.Unix()) <= prevSecond { + return 0, errors.Errorf("invalid prevSecond %v", prevSecond) + } + + staleTime := physicalTime.Add(-arrivalTime.Sub(time.Now().Add(-time.Duration(prevSecond) * time.Second))) + + return oracle.ComposeTS(oracle.GetPhysical(staleTime), 0), nil +} + +// GetStaleTimestamp generate a TSO which represents for the TSO prevSecond secs ago. +func (o *pdOracle) GetStaleTimestamp(ctx context.Context, txnScope string, prevSecond uint64) (ts uint64, err error) { + ts, err = o.getStaleTimestamp(txnScope, prevSecond) + if err != nil { + if !strings.HasPrefix(err.Error(), "invalid prevSecond") { + // If any error happened, we will try to fetch tso and set it as last ts. + _, tErr := o.GetTimestamp(ctx, &oracle.Option{TxnScope: txnScope}) + if tErr != nil { + return 0, errors.Trace(tErr) + } + } + return 0, errors.Trace(err) + } + return ts, nil } diff --git a/store/tikv/oracle/oracles/pd_test.go b/store/tikv/oracle/oracles/pd_test.go index e5199fbf2ad7f..4e881a82126b5 100644 --- a/store/tikv/oracle/oracles/pd_test.go +++ b/store/tikv/oracle/oracles/pd_test.go @@ -14,6 +14,8 @@ package oracles_test import ( + "context" + "math" "testing" "time" @@ -26,14 +28,61 @@ func TestT(t *testing.T) { TestingT(t) } -func TestPDOracle_UntilExpired(t *testing.T) { +var _ = Suite(&testPDSuite{}) + +type testPDSuite struct{} + +func (s *testPDSuite) TestPDOracle_UntilExpired(c *C) { lockAfter, lockExp := 10, 15 o := oracles.NewEmptyPDOracle() start := time.Now() oracles.SetEmptyPDOracleLastTs(o, oracle.ComposeTS(oracle.GetPhysical(start), 0)) lockTs := oracle.ComposeTS(oracle.GetPhysical(start.Add(time.Duration(lockAfter)*time.Millisecond)), 1) - waitTs := o.UntilExpired(lockTs, uint64(lockExp)) - if waitTs != int64(lockAfter+lockExp) { - t.Errorf("waitTs shoulb be %d but got %d", int64(lockAfter+lockExp), waitTs) + waitTs := o.UntilExpired(lockTs, uint64(lockExp), &oracle.Option{TxnScope: oracle.GlobalTxnScope}) + c.Assert(waitTs, Equals, int64(lockAfter+lockExp), Commentf("waitTs shoulb be %d but got %d", int64(lockAfter+lockExp), waitTs)) +} + +func (s *testPDSuite) TestPdOracle_GetStaleTimestamp(c *C) { + o := oracles.NewEmptyPDOracle() + start := time.Now() + oracles.SetEmptyPDOracleLastTs(o, oracle.ComposeTS(oracle.GetPhysical(start), 0)) + ts, err := o.GetStaleTimestamp(context.Background(), oracle.GlobalTxnScope, 10) + c.Assert(err, IsNil) + + duration := start.Sub(oracle.GetTimeFromTS(ts)) + c.Assert(duration <= 12*time.Second && duration >= 8*time.Second, IsTrue, Commentf("stable TS have accuracy err, expect: %d +-2, obtain: %d", 10, duration)) + + _, err = o.GetStaleTimestamp(context.Background(), oracle.GlobalTxnScope, 1e12) + c.Assert(err, NotNil, Commentf("expect exceed err but get nil")) + + testcases := []struct { + name string + preSec uint64 + expectErr string + }{ + { + name: "normal case", + preSec: 6, + expectErr: "", + }, + { + name: "preSec too large", + preSec: math.MaxUint64, + expectErr: ".*invalid prevSecond.*", + }, + } + + for _, testcase := range testcases { + comment := Commentf("%s", testcase.name) + start = time.Now() + oracles.SetEmptyPDOracleLastTs(o, oracle.ComposeTS(oracle.GetPhysical(start), 0)) + ts, err = o.GetStaleTimestamp(context.Background(), oracle.GlobalTxnScope, testcase.preSec) + if testcase.expectErr == "" { + c.Assert(err, IsNil, comment) + duration = start.Sub(oracle.GetTimeFromTS(ts)) + c.Assert(duration <= time.Duration(testcase.preSec+2)*time.Second && duration >= time.Duration(testcase.preSec-2)*time.Second, IsTrue, Commentf("%s: stable TS have accuracy err, expect: %d +-2, obtain: %d", comment.CheckCommentString(), testcase.preSec, duration)) + } else { + c.Assert(err, ErrorMatches, testcase.expectErr, comment) + } } } diff --git a/store/tikv/pd_codec.go b/store/tikv/pd_codec.go index 1f29cf38c6c1a..0a6a3b0ab2dc0 100644 --- a/store/tikv/pd_codec.go +++ b/store/tikv/pd_codec.go @@ -18,23 +18,26 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/metapb" - "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/store/tikv/util/codec" pd "github.com/tikv/pd/client" ) -type codecPDClient struct { +// CodecPDClient wraps a PD Client to decode the encoded keys in region meta. +type CodecPDClient struct { pd.Client } // GetRegion encodes the key before send requests to pd-server and decodes the // returned StartKey && EndKey from pd-server. -func (c *codecPDClient) GetRegion(ctx context.Context, key []byte) (*pd.Region, error) { +func (c *CodecPDClient) GetRegion(ctx context.Context, key []byte) (*pd.Region, error) { encodedKey := codec.EncodeBytes([]byte(nil), key) region, err := c.Client.GetRegion(ctx, encodedKey) return processRegionResult(region, err) } -func (c *codecPDClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Region, error) { +// GetPrevRegion encodes the key before send requests to pd-server and decodes the +// returned StartKey && EndKey from pd-server. +func (c *CodecPDClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Region, error) { encodedKey := codec.EncodeBytes([]byte(nil), key) region, err := c.Client.GetPrevRegion(ctx, encodedKey) return processRegionResult(region, err) @@ -42,12 +45,14 @@ func (c *codecPDClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Regi // GetRegionByID encodes the key before send requests to pd-server and decodes the // returned StartKey && EndKey from pd-server. -func (c *codecPDClient) GetRegionByID(ctx context.Context, regionID uint64) (*pd.Region, error) { +func (c *CodecPDClient) GetRegionByID(ctx context.Context, regionID uint64) (*pd.Region, error) { region, err := c.Client.GetRegionByID(ctx, regionID) return processRegionResult(region, err) } -func (c *codecPDClient) ScanRegions(ctx context.Context, startKey []byte, endKey []byte, limit int) ([]*pd.Region, error) { +// ScanRegions encodes the key before send requests to pd-server and decodes the +// returned StartKey && EndKey from pd-server. +func (c *CodecPDClient) ScanRegions(ctx context.Context, startKey []byte, endKey []byte, limit int) ([]*pd.Region, error) { startKey = codec.EncodeBytes([]byte(nil), startKey) if len(endKey) > 0 { endKey = codec.EncodeBytes([]byte(nil), endKey) diff --git a/store/tikv/pessimistic.go b/store/tikv/pessimistic.go index df5836f7ee6c5..2f85cc723a7c8 100644 --- a/store/tikv/pessimistic.go +++ b/store/tikv/pessimistic.go @@ -14,6 +14,9 @@ package tikv import ( + "encoding/hex" + "math/rand" + "strings" "sync/atomic" "time" @@ -21,9 +24,11 @@ import ( "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" "github.com/prometheus/client_golang/prometheus" + "go.uber.org/zap" ) type actionPessimisticLock struct { @@ -34,9 +39,6 @@ type actionPessimisticRollback struct{} var ( _ twoPhaseCommitAction = actionPessimisticLock{} _ twoPhaseCommitAction = actionPessimisticRollback{} - - tiKVTxnRegionsNumHistogramPessimisticLock = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues(metricsTag("pessimistic_lock")) - tiKVTxnRegionsNumHistogramPessimisticRollback = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues(metricsTag("pessimistic_rollback")) ) func (actionPessimisticLock) String() string { @@ -44,7 +46,7 @@ func (actionPessimisticLock) String() string { } func (actionPessimisticLock) tiKVTxnRegionsNumHistogram() prometheus.Observer { - return tiKVTxnRegionsNumHistogramPessimisticLock + return metrics.TxnRegionsNumHistogramPessimisticLock } func (actionPessimisticRollback) String() string { @@ -52,29 +54,39 @@ func (actionPessimisticRollback) String() string { } func (actionPessimisticRollback) tiKVTxnRegionsNumHistogram() prometheus.Observer { - return tiKVTxnRegionsNumHistogramPessimisticRollback + return metrics.TxnRegionsNumHistogramPessimisticRollback } func (action actionPessimisticLock) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch batchMutations) error { - m := &batch.mutations - mutations := make([]*pb.Mutation, m.len()) - for i := range m.keys { + m := batch.mutations + mutations := make([]*pb.Mutation, m.Len()) + for i := 0; i < m.Len(); i++ { mut := &pb.Mutation{ Op: pb.Op_PessimisticLock, - Key: m.keys[i], + Key: m.GetKey(i), } - if c.txn.us.HasPresumeKeyNotExists(m.keys[i]) { + if c.txn.us.HasPresumeKeyNotExists(m.GetKey(i)) || (c.doingAmend && m.GetOp(i) == pb.Op_Insert) { mut.Assertion = pb.Assertion_NotExist } mutations[i] = mut } elapsed := uint64(time.Since(c.txn.startTime) / time.Millisecond) + ttl := elapsed + atomic.LoadUint64(&ManagedLockTTL) + failpoint.Inject("shortPessimisticLockTTL", func() { + ttl = 1 + keys := make([]string, 0, len(mutations)) + for _, m := range mutations { + keys = append(keys, hex.EncodeToString(m.Key)) + } + logutil.BgLogger().Info("[failpoint] injected lock ttl = 1 on pessimistic lock", + zap.Uint64("txnStartTS", c.startTS), zap.Strings("keys", keys)) + }) req := tikvrpc.NewRequest(tikvrpc.CmdPessimisticLock, &pb.PessimisticLockRequest{ Mutations: mutations, PrimaryLock: c.primary(), StartVersion: c.startTS, ForUpdateTs: c.forUpdateTS, - LockTtl: elapsed + atomic.LoadUint64(&ManagedLockTTL), + LockTtl: ttl, IsFirstLock: c.isFirstLock, WaitTimeout: action.LockWaitTime, ReturnValues: action.ReturnValues, @@ -135,8 +147,8 @@ func (action actionPessimisticLock) handleSingleBatch(c *twoPhaseCommitter, bo * for _, keyErr := range keyErrs { // Check already exists error if alreadyExist := keyErr.GetAlreadyExist(); alreadyExist != nil { - key := alreadyExist.GetKey() - return c.extractKeyExistsErr(key) + e := &ErrKeyExist{AlreadyExist: alreadyExist} + return c.extractKeyExistsErr(e) } if deadlock := keyErr.Deadlock; deadlock != nil { return &ErrDeadlock{Deadlock: deadlock} @@ -196,7 +208,7 @@ func (actionPessimisticRollback) handleSingleBatch(c *twoPhaseCommitter, bo *Bac req := tikvrpc.NewRequest(tikvrpc.CmdPessimisticRollback, &pb.PessimisticRollbackRequest{ StartVersion: c.startTS, ForUpdateTs: c.forUpdateTS, - Keys: batch.mutations.keys, + Keys: batch.mutations.GetKeys(), }) resp, err := c.store.SendReq(bo, req, batch.region, readTimeoutShort) if err != nil { @@ -218,6 +230,26 @@ func (actionPessimisticRollback) handleSingleBatch(c *twoPhaseCommitter, bo *Bac } func (c *twoPhaseCommitter) pessimisticLockMutations(bo *Backoffer, lockCtx *kv.LockCtx, mutations CommitterMutations) error { + if c.sessionID > 0 { + failpoint.Inject("beforePessimisticLock", func(val failpoint.Value) { + // Pass multiple instructions in one string, delimited by commas, to trigger multiple behaviors, like + // `return("delay,fail")`. Then they will be executed sequentially at once. + if v, ok := val.(string); ok { + for _, action := range strings.Split(v, ",") { + if action == "delay" { + duration := time.Duration(rand.Int63n(int64(time.Second) * 5)) + logutil.Logger(bo.ctx).Info("[failpoint] injected delay at pessimistic lock", + zap.Uint64("txnStartTS", c.startTS), zap.Duration("duration", duration)) + time.Sleep(duration) + } else if action == "fail" { + logutil.Logger(bo.ctx).Info("[failpoint] injected failure at pessimistic lock", + zap.Uint64("txnStartTS", c.startTS)) + failpoint.Return(errors.New("injected failure at pessimistic lock")) + } + } + } + }) + } return c.doActionOnMutations(bo, actionPessimisticLock{lockCtx}, mutations) } diff --git a/store/tikv/prewrite.go b/store/tikv/prewrite.go index 05250737a5559..5583a1e8525e2 100644 --- a/store/tikv/prewrite.go +++ b/store/tikv/prewrite.go @@ -14,6 +14,7 @@ package tikv import ( + "encoding/hex" "math" "sync/atomic" "time" @@ -22,10 +23,10 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "github.com/prometheus/client_golang/prometheus" "go.uber.org/zap" ) @@ -33,30 +34,33 @@ import ( type actionPrewrite struct{} var _ twoPhaseCommitAction = actionPrewrite{} -var tiKVTxnRegionsNumHistogramPrewrite = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues(metricsTag("prewrite")) func (actionPrewrite) String() string { return "prewrite" } func (actionPrewrite) tiKVTxnRegionsNumHistogram() prometheus.Observer { - return tiKVTxnRegionsNumHistogramPrewrite + return metrics.TxnRegionsNumHistogramPrewrite } func (c *twoPhaseCommitter) buildPrewriteRequest(batch batchMutations, txnSize uint64) *tikvrpc.Request { - m := &batch.mutations - mutations := make([]*pb.Mutation, m.len()) - for i := range m.keys { + m := batch.mutations + mutations := make([]*pb.Mutation, m.Len()) + isPessimisticLock := make([]bool, m.Len()) + for i := 0; i < m.Len(); i++ { mutations[i] = &pb.Mutation{ - Op: m.ops[i], - Key: m.keys[i], - Value: m.values[i], + Op: m.GetOp(i), + Key: m.GetKey(i), + Value: m.GetValue(i), } + isPessimisticLock[i] = m.IsPessimisticLock(i) } - var minCommitTS uint64 - if c.forUpdateTS > 0 { + c.mu.Lock() + minCommitTS := c.minCommitTS + c.mu.Unlock() + if c.forUpdateTS > 0 && c.forUpdateTS >= minCommitTS { minCommitTS = c.forUpdateTS + 1 - } else { + } else if c.startTS >= minCommitTS { minCommitTS = c.startTS + 1 } @@ -67,30 +71,83 @@ func (c *twoPhaseCommitter) buildPrewriteRequest(batch batchMutations, txnSize u } }) + ttl := c.lockTTL + + if c.sessionID > 0 { + failpoint.Inject("twoPCShortLockTTL", func() { + ttl = 1 + keys := make([]string, 0, len(mutations)) + for _, m := range mutations { + keys = append(keys, hex.EncodeToString(m.Key)) + } + logutil.BgLogger().Info("[failpoint] injected lock ttl = 1 on prewrite", + zap.Uint64("txnStartTS", c.startTS), zap.Strings("keys", keys)) + }) + } + req := &pb.PrewriteRequest{ Mutations: mutations, PrimaryLock: c.primary(), StartVersion: c.startTS, - LockTtl: c.lockTTL, - IsPessimisticLock: m.isPessimisticLock, + LockTtl: ttl, + IsPessimisticLock: isPessimisticLock, ForUpdateTs: c.forUpdateTS, TxnSize: txnSize, MinCommitTs: minCommitTS, + MaxCommitTs: c.maxCommitTS, } + failpoint.Inject("invalidMaxCommitTS", func() { + if req.MaxCommitTs > 0 { + req.MaxCommitTs = minCommitTS - 1 + } + }) + if c.isAsyncCommit() { if batch.isPrimary { req.Secondaries = c.asyncSecondaries() } req.UseAsyncCommit = true - // The async commit can not be used for large transactions, and the commit ts can't be pushed. - req.MinCommitTs = 0 + } + + if c.isOnePC() { + req.TryOnePc = true } return tikvrpc.NewRequest(tikvrpc.CmdPrewrite, req, pb.Context{Priority: c.priority, SyncLog: c.syncLog}) } func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoffer, batch batchMutations) error { + // WARNING: This function only tries to send a single request to a single region, so it don't + // need to unset the `useOnePC` flag when it fails. A special case is that when TiKV returns + // regionErr, it's uncertain if the request will be splitted into multiple and sent to multiple + // regions. It invokes `prewriteMutations` recursively here, and the number of batches will be + // checked there. + + if c.sessionID > 0 { + failpoint.Inject("prewritePrimaryFail", func() { + if batch.isPrimary { + // Delay to avoid cancelling other normally ongoing prewrite requests. + time.Sleep(time.Millisecond * 50) + logutil.Logger(bo.ctx).Info("[failpoint] injected error on prewriting primary batch", + zap.Uint64("txnStartTS", c.startTS)) + failpoint.Return(errors.New("injected error on prewriting primary batch")) + } + }) + } + + if c.sessionID > 0 { + failpoint.Inject("prewriteSecondaryFail", func() { + if !batch.isPrimary { + // Delay to avoid cancelling other normally ongoing prewrite requests. + time.Sleep(time.Millisecond * 50) + logutil.Logger(bo.ctx).Info("[failpoint] injected error on prewriting secondary batch", + zap.Uint64("txnStartTS", c.startTS)) + failpoint.Return(errors.New("injected error on prewriting secondary batch")) + } + }) + } + txnSize := uint64(c.regionTxnSize[batch.region.id]) // When we retry because of a region miss, we don't know the transaction size. We set the transaction size here // to MaxUint64 to avoid unexpected "resolve lock lite". @@ -105,7 +162,9 @@ func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoff // If we fail to receive response for async commit prewrite, it will be undetermined whether this // transaction has been successfully committed. - if c.isAsyncCommit() && sender.rpcError != nil { + // If prewrite has been cancelled, all ongoing prewrite RPCs will become errors, we needn't set undetermined + // errors. + if (c.isAsyncCommit() || c.isOnePC()) && sender.rpcError != nil && atomic.LoadUint32(&c.prewriteCancelled) == 0 { c.setUndeterminedErr(errors.Trace(sender.rpcError)) } @@ -131,12 +190,39 @@ func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoff keyErrs := prewriteResp.GetErrors() if len(keyErrs) == 0 { if batch.isPrimary { - // After writing the primary key, if the size of the transaction is large than 32M, + // After writing the primary key, if the size of the transaction is larger than 32M, // start the ttlManager. The ttlManager will be closed in tikvTxn.Commit(). - if int64(c.txnSize) > config.GetGlobalConfig().TiKVClient.TTLRefreshedTxnSize { + // In this case 1PC is not expected to be used, but still check it for safety. + if int64(c.txnSize) > config.GetGlobalConfig().TiKVClient.TTLRefreshedTxnSize && + prewriteResp.OnePcCommitTs == 0 { c.run(c, nil) } } + + if c.isOnePC() { + if prewriteResp.OnePcCommitTs == 0 { + if prewriteResp.MinCommitTs != 0 { + return errors.Trace(errors.New("MinCommitTs must be 0 when 1pc falls back to 2pc")) + } + logutil.Logger(bo.ctx).Warn("1pc failed and fallbacks to normal commit procedure", + zap.Uint64("startTS", c.startTS)) + metrics.OnePCTxnCounterFallback.Inc() + c.setOnePC(false) + c.setAsyncCommit(false) + } else { + // For 1PC, there's no racing to access to access `onePCCommmitTS` so it's safe + // not to lock the mutex. + if c.onePCCommitTS != 0 { + logutil.Logger(bo.ctx).Fatal("one pc happened multiple times", + zap.Uint64("startTS", c.startTS)) + } + c.onePCCommitTS = prewriteResp.OnePcCommitTs + } + return nil + } else if prewriteResp.OnePcCommitTs != 0 { + logutil.Logger(bo.ctx).Fatal("tikv committed a non-1pc transaction with 1pc protocol", + zap.Uint64("startTS", c.startTS)) + } if c.isAsyncCommit() { // 0 if the min_commit_ts is not ready or any other reason that async // commit cannot proceed. The client can then fallback to normal way to @@ -162,8 +248,8 @@ func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoff for _, keyErr := range keyErrs { // Check already exists error if alreadyExist := keyErr.GetAlreadyExist(); alreadyExist != nil { - key := alreadyExist.GetKey() - return c.extractKeyExistsErr(key) + e := &ErrKeyExist{AlreadyExist: alreadyExist} + return c.extractKeyExistsErr(e) } // Extract lock from key error @@ -172,7 +258,7 @@ func (action actionPrewrite) handleSingleBatch(c *twoPhaseCommitter, bo *Backoff return errors.Trace(err1) } logutil.BgLogger().Info("prewrite encounters lock", - zap.Uint64("conn", c.connID), + zap.Uint64("session", c.sessionID), zap.Stringer("lock", lock)) locks = append(locks, lock) } @@ -198,5 +284,6 @@ func (c *twoPhaseCommitter) prewriteMutations(bo *Backoffer, mutations Committer bo.ctx = opentracing.ContextWithSpan(bo.ctx, span1) } + // `doActionOnMutations` will unset `useOnePC` if the mutations is splitted into multiple batches. return c.doActionOnMutations(bo, actionPrewrite{}, mutations) } diff --git a/store/tikv/prewrite_test.go b/store/tikv/prewrite_test.go new file mode 100644 index 0000000000000..b9287c0d7e620 --- /dev/null +++ b/store/tikv/prewrite_test.go @@ -0,0 +1,67 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + . "github.com/pingcap/check" + pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/store/mockstore/unistore" +) + +type testPrewriteSuite struct { + store *KVStore +} + +var _ = Suite(&testPrewriteSuite{}) + +func (s *testPrewriteSuite) SetUpTest(c *C) { + client, pdClient, cluster, err := unistore.New("") + c.Assert(err, IsNil) + unistore.BootstrapWithSingleStore(cluster) + store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) + c.Assert(err, IsNil) + s.store = store +} + +func (s *testPrewriteSuite) TestSetMinCommitTSInAsyncCommit(c *C) { + t, err := s.store.Begin() + c.Assert(err, IsNil) + txn := t + err = txn.Set([]byte("k"), []byte("v")) + c.Assert(err, IsNil) + committer, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(err, IsNil) + committer.useAsyncCommit = 1 + + buildRequest := func() *pb.PrewriteRequest { + batch := batchMutations{mutations: committer.mutations} + req := committer.buildPrewriteRequest(batch, 1) + return req.Req.(*pb.PrewriteRequest) + } + + // no forUpdateTS + req := buildRequest() + c.Assert(req.MinCommitTs, Equals, txn.startTS+1) + + // forUpdateTS is set + committer.forUpdateTS = txn.startTS + (5 << 18) + req = buildRequest() + c.Assert(req.MinCommitTs, Equals, committer.forUpdateTS+1) + + // minCommitTS is set + committer.minCommitTS = txn.startTS + (10 << 18) + req = buildRequest() + c.Assert(req.MinCommitTs, Equals, committer.minCommitTS) + +} diff --git a/store/tikv/range_task.go b/store/tikv/range_task.go index d2ed911b57ec0..57960c21f126b 100644 --- a/store/tikv/range_task.go +++ b/store/tikv/range_task.go @@ -22,8 +22,8 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "go.uber.org/zap" ) diff --git a/store/tikv/range_task_test.go b/store/tikv/range_task_test.go index e72e148fce1db..bea102dc839f1 100644 --- a/store/tikv/range_task_test.go +++ b/store/tikv/range_task_test.go @@ -21,14 +21,14 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" ) type testRangeTaskSuite struct { OneByOneSuite cluster cluster.Cluster - store *tikvStore + store *KVStore testRanges []kv.KeyRange expectedRanges [][]kv.KeyRange @@ -77,7 +77,7 @@ func (s *testRangeTaskSuite) SetUpTest(c *C) { // }), // ) // c.Assert(err, IsNil) - s.store = store.(*tikvStore) + s.store = store s.testRanges = []kv.KeyRange{ makeRange("", ""), diff --git a/store/tikv/rawkv.go b/store/tikv/rawkv.go index e165293758b87..dd5b621bb1092 100644 --- a/store/tikv/rawkv.go +++ b/store/tikv/rawkv.go @@ -20,10 +20,10 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/kvproto/pkg/kvrpcpb" - "github.com/pingcap/tidb/config" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/tikv/pd/client" + pd "github.com/tikv/pd/client" ) var ( @@ -33,19 +33,6 @@ var ( ErrMaxScanLimitExceeded = errors.New("limit should be less than MaxRawKVScanLimit") ) -var ( - tikvRawkvCmdHistogramWithGet = metrics.TiKVRawkvCmdHistogram.WithLabelValues("get") - tikvRawkvCmdHistogramWithBatchGet = metrics.TiKVRawkvCmdHistogram.WithLabelValues("batch_get") - tikvRawkvCmdHistogramWithBatchPut = metrics.TiKVRawkvCmdHistogram.WithLabelValues("batch_put") - tikvRawkvCmdHistogramWithDelete = metrics.TiKVRawkvCmdHistogram.WithLabelValues("delete") - tikvRawkvCmdHistogramWithBatchDelete = metrics.TiKVRawkvCmdHistogram.WithLabelValues("batch_delete") - tikvRawkvCmdHistogramWithRawScan = metrics.TiKVRawkvCmdHistogram.WithLabelValues("raw_scan") - tikvRawkvCmdHistogramWithRawReversScan = metrics.TiKVRawkvCmdHistogram.WithLabelValues("raw_reverse_scan") - - tikvRawkvSizeHistogramWithKey = metrics.TiKVRawkvSizeHistogram.WithLabelValues("key") - tikvRawkvSizeHistogramWithValue = metrics.TiKVRawkvSizeHistogram.WithLabelValues("value") -) - const ( // rawBatchPutSize is the maximum size limit for rawkv each batch put request. rawBatchPutSize = 16 * 1024 @@ -76,7 +63,7 @@ func NewRawKVClient(pdAddrs []string, security config.Security, opts ...pd.Clien clusterID: pdCli.GetClusterID(context.TODO()), regionCache: NewRegionCache(pdCli), pdClient: pdCli, - rpcClient: newRPCClient(security), + rpcClient: NewRPCClient(security), }, nil } @@ -102,7 +89,7 @@ func (c *RawKVClient) ClusterID() uint64 { // Get queries value with the key. When the key does not exist, it returns `nil, nil`. func (c *RawKVClient) Get(key []byte) ([]byte, error) { start := time.Now() - defer func() { tikvRawkvCmdHistogramWithGet.Observe(time.Since(start).Seconds()) }() + defer func() { metrics.RawkvCmdHistogramWithGet.Observe(time.Since(start).Seconds()) }() req := tikvrpc.NewRequest(tikvrpc.CmdRawGet, &kvrpcpb.RawGetRequest{Key: key}) resp, _, err := c.sendReq(key, req, false) @@ -126,7 +113,7 @@ func (c *RawKVClient) Get(key []byte) ([]byte, error) { func (c *RawKVClient) BatchGet(keys [][]byte) ([][]byte, error) { start := time.Now() defer func() { - tikvRawkvCmdHistogramWithBatchGet.Observe(time.Since(start).Seconds()) + metrics.RawkvCmdHistogramWithBatchGet.Observe(time.Since(start).Seconds()) }() bo := NewBackofferWithVars(context.Background(), rawkvMaxBackoff, nil) @@ -155,9 +142,9 @@ func (c *RawKVClient) BatchGet(keys [][]byte) ([][]byte, error) { // Put stores a key-value pair to TiKV. func (c *RawKVClient) Put(key, value []byte) error { start := time.Now() - defer func() { tikvRawkvCmdHistogramWithBatchPut.Observe(time.Since(start).Seconds()) }() - tikvRawkvSizeHistogramWithKey.Observe(float64(len(key))) - tikvRawkvSizeHistogramWithValue.Observe(float64(len(value))) + defer func() { metrics.RawkvCmdHistogramWithBatchPut.Observe(time.Since(start).Seconds()) }() + metrics.RawkvSizeHistogramWithKey.Observe(float64(len(key))) + metrics.RawkvSizeHistogramWithValue.Observe(float64(len(value))) if len(value) == 0 { return errors.New("empty value is not supported") @@ -185,7 +172,7 @@ func (c *RawKVClient) Put(key, value []byte) error { func (c *RawKVClient) BatchPut(keys, values [][]byte) error { start := time.Now() defer func() { - tikvRawkvCmdHistogramWithBatchPut.Observe(time.Since(start).Seconds()) + metrics.RawkvCmdHistogramWithBatchPut.Observe(time.Since(start).Seconds()) }() if len(keys) != len(values) { @@ -204,7 +191,7 @@ func (c *RawKVClient) BatchPut(keys, values [][]byte) error { // Delete deletes a key-value pair from TiKV. func (c *RawKVClient) Delete(key []byte) error { start := time.Now() - defer func() { tikvRawkvCmdHistogramWithDelete.Observe(time.Since(start).Seconds()) }() + defer func() { metrics.RawkvCmdHistogramWithDelete.Observe(time.Since(start).Seconds()) }() req := tikvrpc.NewRequest(tikvrpc.CmdRawDelete, &kvrpcpb.RawDeleteRequest{ Key: key, @@ -227,7 +214,7 @@ func (c *RawKVClient) Delete(key []byte) error { func (c *RawKVClient) BatchDelete(keys [][]byte) error { start := time.Now() defer func() { - tikvRawkvCmdHistogramWithBatchDelete.Observe(time.Since(start).Seconds()) + metrics.RawkvCmdHistogramWithBatchDelete.Observe(time.Since(start).Seconds()) }() bo := NewBackofferWithVars(context.Background(), rawkvMaxBackoff, nil) @@ -285,7 +272,7 @@ func (c *RawKVClient) DeleteRange(startKey []byte, endKey []byte) error { // `Scan(push(startKey, '\0'), push(endKey, '\0'), limit)`. func (c *RawKVClient) Scan(startKey, endKey []byte, limit int) (keys [][]byte, values [][]byte, err error) { start := time.Now() - defer func() { tikvRawkvCmdHistogramWithRawScan.Observe(time.Since(start).Seconds()) }() + defer func() { metrics.RawkvCmdHistogramWithRawScan.Observe(time.Since(start).Seconds()) }() if limit > MaxRawKVScanLimit { return nil, nil, errors.Trace(ErrMaxScanLimitExceeded) @@ -327,7 +314,7 @@ func (c *RawKVClient) Scan(startKey, endKey []byte, limit int) (keys [][]byte, v func (c *RawKVClient) ReverseScan(startKey, endKey []byte, limit int) (keys [][]byte, values [][]byte, err error) { start := time.Now() defer func() { - tikvRawkvCmdHistogramWithRawReversScan.Observe(time.Since(start).Seconds()) + metrics.RawkvCmdHistogramWithRawReversScan.Observe(time.Since(start).Seconds()) }() if limit > MaxRawKVScanLimit { diff --git a/store/tikv/rawkv_test.go b/store/tikv/rawkv_test.go index dcfc117c08ecc..3ad65f919b41e 100644 --- a/store/tikv/rawkv_test.go +++ b/store/tikv/rawkv_test.go @@ -19,8 +19,8 @@ import ( "fmt" . "github.com/pingcap/check" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/unistore" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" ) type testRawKVSuite struct { diff --git a/store/tikv/region_cache.go b/store/tikv/region_cache.go index 37582c919b40e..ba99e18d3d882 100644 --- a/store/tikv/region_cache.go +++ b/store/tikv/region_cache.go @@ -25,13 +25,16 @@ import ( "github.com/gogo/protobuf/proto" "github.com/google/btree" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/tidb/ddl/placement" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/logutil" pd "github.com/tikv/pd/client" atomic2 "go.uber.org/atomic" "go.uber.org/zap" @@ -47,23 +50,6 @@ const ( // RegionCacheTTLSec is the max idle time for regions in the region cache. var RegionCacheTTLSec int64 = 600 -var ( - tikvRegionCacheCounterWithInvalidateRegionFromCacheOK = metrics.TiKVRegionCacheCounter.WithLabelValues("invalidate_region_from_cache", "ok") - tikvRegionCacheCounterWithSendFail = metrics.TiKVRegionCacheCounter.WithLabelValues("send_fail", "ok") - tikvRegionCacheCounterWithGetRegionByIDOK = metrics.TiKVRegionCacheCounter.WithLabelValues("get_region_by_id", "ok") - tikvRegionCacheCounterWithGetRegionByIDError = metrics.TiKVRegionCacheCounter.WithLabelValues("get_region_by_id", "err") - tikvRegionCacheCounterWithGetRegionOK = metrics.TiKVRegionCacheCounter.WithLabelValues("get_region", "ok") - tikvRegionCacheCounterWithGetRegionError = metrics.TiKVRegionCacheCounter.WithLabelValues("get_region", "err") - tikvRegionCacheCounterWithScanRegionsOK = metrics.TiKVRegionCacheCounter.WithLabelValues("scan_regions", "ok") - tikvRegionCacheCounterWithScanRegionsError = metrics.TiKVRegionCacheCounter.WithLabelValues("scan_regions", "err") - tikvRegionCacheCounterWithGetStoreOK = metrics.TiKVRegionCacheCounter.WithLabelValues("get_store", "ok") - tikvRegionCacheCounterWithGetStoreError = metrics.TiKVRegionCacheCounter.WithLabelValues("get_store", "err") - tikvRegionCacheCounterWithInvalidateStoreRegionsOK = metrics.TiKVRegionCacheCounter.WithLabelValues("invalidate_store_regions", "ok") - - tikvStatusCountWithOK = metrics.TiKVStatusCounter.WithLabelValues("ok") - tikvStatusCountWithError = metrics.TiKVStatusCounter.WithLabelValues("err") -) - const ( updated int32 = iota // region is updated and no need to reload. needSync // need sync new region info. @@ -77,29 +63,6 @@ type Region struct { lastAccess int64 // last region access time, see checkRegionCacheTTL } -// AccessMode uses to index stores for different region cache access requirements. -type AccessMode int - -const ( - // TiKvOnly indicates stores list that use for TiKv access(include both leader request and follower read). - TiKvOnly AccessMode = iota - // TiFlashOnly indicates stores list that use for TiFlash request. - TiFlashOnly - // NumAccessMode reserved to keep max access mode value. - NumAccessMode -) - -func (a AccessMode) String() string { - switch a { - case TiKvOnly: - return "TiKvOnly" - case TiFlashOnly: - return "TiFlashOnly" - default: - return fmt.Sprintf("%d", a) - } -} - // AccessIndex represent the index for accessIndex array type AccessIndex int @@ -140,8 +103,8 @@ func (r *RegionStore) clone() *RegionStore { } // return next follower store's index -func (r *RegionStore) follower(seed uint32) AccessIndex { - l := uint32(r.accessStoreNum(TiKvOnly)) +func (r *RegionStore) follower(seed uint32, op *storeSelectorOp) AccessIndex { + l := uint32(r.accessStoreNum(TiKVOnly)) if l <= 1 { return r.workTiKVIdx } @@ -151,8 +114,8 @@ func (r *RegionStore) follower(seed uint32) AccessIndex { if followerIdx >= r.workTiKVIdx { followerIdx++ } - storeIdx, s := r.accessStore(TiKvOnly, followerIdx) - if r.storeEpochs[storeIdx] == atomic.LoadUint32(&s.epoch) { + storeIdx, s := r.accessStore(TiKVOnly, followerIdx) + if r.storeEpochs[storeIdx] == atomic.LoadUint32(&s.epoch) && r.filterStoreCandidate(followerIdx, op) { return followerIdx } seed++ @@ -161,20 +124,25 @@ func (r *RegionStore) follower(seed uint32) AccessIndex { } // return next leader or follower store's index -func (r *RegionStore) kvPeer(seed uint32) AccessIndex { - candidates := make([]AccessIndex, 0, r.accessStoreNum(TiKvOnly)) - for i := 0; i < r.accessStoreNum(TiKvOnly); i++ { - storeIdx, s := r.accessStore(TiKvOnly, AccessIndex(i)) - if r.storeEpochs[storeIdx] != atomic.LoadUint32(&s.epoch) { +func (r *RegionStore) kvPeer(seed uint32, op *storeSelectorOp) AccessIndex { + candidates := make([]AccessIndex, 0, r.accessStoreNum(TiKVOnly)) + for i := 0; i < r.accessStoreNum(TiKVOnly); i++ { + storeIdx, s := r.accessStore(TiKVOnly, AccessIndex(i)) + if r.storeEpochs[storeIdx] != atomic.LoadUint32(&s.epoch) || !r.filterStoreCandidate(AccessIndex(i), op) { continue } candidates = append(candidates, AccessIndex(i)) } - if len(candidates) == 0 { return r.workTiKVIdx } - return candidates[int32(seed)%int32(len(candidates))] + return candidates[seed%uint32(len(candidates))] +} + +func (r *RegionStore) filterStoreCandidate(aidx AccessIndex, op *storeSelectorOp) bool { + _, s := r.accessStore(TiKVOnly, aidx) + // filter label unmatched store + return s.IsLabelsMatch(op.labels) } // init initializes region after constructed. @@ -199,9 +167,9 @@ func (r *Region) init(c *RegionCache) error { return err } switch store.storeType { - case kv.TiKV: - rs.accessIndex[TiKvOnly] = append(rs.accessIndex[TiKvOnly], len(rs.stores)) - case kv.TiFlash: + case TiKV: + rs.accessIndex[TiKVOnly] = append(rs.accessIndex[TiKVOnly], len(rs.stores)) + case TiFlash: rs.accessIndex[TiFlashOnly] = append(rs.accessIndex[TiFlashOnly], len(rs.stores)) } rs.stores = append(rs.stores, store) @@ -224,6 +192,10 @@ func (r *Region) compareAndSwapStore(oldStore, newStore *RegionStore) bool { } func (r *Region) checkRegionCacheTTL(ts int64) bool { + // Only consider use percentage on this failpoint, for example, "2%return" + failpoint.Inject("invalidateRegionCache", func() { + r.invalidate() + }) for { lastAccess := atomic.LoadInt64(&r.lastAccess) if ts-lastAccess > RegionCacheTTLSec { @@ -237,7 +209,7 @@ func (r *Region) checkRegionCacheTTL(ts int64) bool { // invalidate invalidates a region, next time it will got null result. func (r *Region) invalidate() { - tikvRegionCacheCounterWithInvalidateRegionFromCacheOK.Inc() + metrics.RegionCacheCounterWithInvalidateRegionFromCacheOK.Inc() atomic.StoreInt64(&r.lastAccess, invalidatedLastAccessTime) } @@ -286,7 +258,8 @@ func NewRegionCache(pdClient pd.Client) *RegionCache { c.storeMu.stores = make(map[uint64]*Store) c.notifyCheckCh = make(chan struct{}, 1) c.closeCh = make(chan struct{}) - go c.asyncCheckAndResolveLoop() + interval := config.GetGlobalConfig().StoresRefreshInterval + go c.asyncCheckAndResolveLoop(time.Duration(interval) * time.Second) return c } @@ -296,7 +269,9 @@ func (c *RegionCache) Close() { } // asyncCheckAndResolveLoop with -func (c *RegionCache) asyncCheckAndResolveLoop() { +func (c *RegionCache) asyncCheckAndResolveLoop(interval time.Duration) { + ticker := time.NewTicker(interval) + defer ticker.Stop() var needCheckStores []*Store for { select { @@ -305,6 +280,18 @@ func (c *RegionCache) asyncCheckAndResolveLoop() { case <-c.notifyCheckCh: needCheckStores = needCheckStores[:0] c.checkAndResolve(needCheckStores) + case <-ticker.C: + // refresh store once a minute to update labels + var stores []*Store + c.storeMu.RLock() + stores = make([]*Store, 0, len(c.storeMu.stores)) + for _, s := range c.storeMu.stores { + stores = append(stores, s) + } + c.storeMu.RUnlock() + for _, store := range stores { + store.reResolve(c) + } } } } @@ -355,9 +342,23 @@ func (c *RPCContext) String() string { c.Region.GetID(), c.Meta, c.Peer, c.Addr, c.AccessIdx, c.AccessMode, runStoreType) } +type storeSelectorOp struct { + labels []*metapb.StoreLabel +} + +// StoreSelectorOption configures storeSelectorOp. +type StoreSelectorOption func(*storeSelectorOp) + +// WithMatchLabels indicates selecting stores with matched labels +func WithMatchLabels(labels []*metapb.StoreLabel) StoreSelectorOption { + return func(op *storeSelectorOp) { + op.labels = labels + } +} + // GetTiKVRPCContext returns RPCContext for a region. If it returns nil, the region // must be out of date and already dropped from cache. -func (c *RegionCache) GetTiKVRPCContext(bo *Backoffer, id RegionVerID, replicaRead kv.ReplicaReadType, followerStoreSeed uint32) (*RPCContext, error) { +func (c *RegionCache) GetTiKVRPCContext(bo *Backoffer, id RegionVerID, replicaRead kv.ReplicaReadType, followerStoreSeed uint32, opts ...StoreSelectorOption) (*RPCContext, error) { ts := time.Now().Unix() cachedRegion := c.getCachedRegionWithRLock(id) @@ -376,11 +377,30 @@ func (c *RegionCache) GetTiKVRPCContext(bo *Backoffer, id RegionVerID, replicaRe storeIdx int accessIdx AccessIndex ) + options := &storeSelectorOp{} + for _, op := range opts { + op(options) + } + failpoint.Inject("assertStoreLabels", func(val failpoint.Value) { + if len(opts) > 0 { + value := val.(string) + v := "" + for _, label := range options.labels { + if label.Key == placement.DCLabelKey { + v = label.Value + break + } + } + if v != value { + panic(fmt.Sprintf("StoreSelectorOption's label %v is not %v", v, value)) + } + } + }) switch replicaRead { case kv.ReplicaReadFollower: - store, peer, accessIdx, storeIdx = cachedRegion.FollowerStorePeer(regionStore, followerStoreSeed) + store, peer, accessIdx, storeIdx = cachedRegion.FollowerStorePeer(regionStore, followerStoreSeed, options) case kv.ReplicaReadMixed: - store, peer, accessIdx, storeIdx = cachedRegion.AnyStorePeer(regionStore, followerStoreSeed) + store, peer, accessIdx, storeIdx = cachedRegion.AnyStorePeer(regionStore, followerStoreSeed, options) default: store, peer, accessIdx, storeIdx = cachedRegion.WorkStorePeer(regionStore) } @@ -416,7 +436,7 @@ func (c *RegionCache) GetTiKVRPCContext(bo *Backoffer, id RegionVerID, replicaRe AccessIdx: accessIdx, Store: store, Addr: addr, - AccessMode: TiKvOnly, + AccessMode: TiKVOnly, }, nil } @@ -551,7 +571,7 @@ func (c *RegionCache) findRegionByKey(bo *Backoffer, key []byte, isEndKey bool) // OnSendFail handles send request fail logic. func (c *RegionCache) OnSendFail(bo *Backoffer, ctx *RPCContext, scheduleReload bool, err error) { - tikvRegionCacheCounterWithSendFail.Inc() + metrics.RegionCacheCounterWithSendFail.Inc() r := c.getCachedRegionWithRLock(ctx.Region) if r != nil { peersNum := len(r.meta.Peers) @@ -571,7 +591,7 @@ func (c *RegionCache) OnSendFail(bo *Backoffer, ctx *RPCContext, scheduleReload // send fail but store is reachable, keep retry current peer for replica leader request. // but we still need switch peer for follower-read or learner-read(i.e. tiflash) - if ctx.Store.storeType == kv.TiKV && !followerRead && s.requestLiveness(bo) == reachable { + if ctx.Store.storeType == TiKV && !followerRead && s.requestLiveness(bo) == reachable { return } @@ -579,7 +599,7 @@ func (c *RegionCache) OnSendFail(bo *Backoffer, ctx *RPCContext, scheduleReload epoch := rs.storeEpochs[storeIdx] if atomic.CompareAndSwapUint32(&s.epoch, epoch, epoch+1) { logutil.BgLogger().Info("mark store's regions need be refill", zap.String("store", s.addr)) - tikvRegionCacheCounterWithInvalidateStoreRegionsOK.Inc() + metrics.RegionCacheCounterWithInvalidateStoreRegionsOK.Inc() } // schedule a store addr resolve. @@ -587,7 +607,7 @@ func (c *RegionCache) OnSendFail(bo *Backoffer, ctx *RPCContext, scheduleReload } // try next peer to found new leader. - if ctx.AccessMode == TiKvOnly { + if ctx.AccessMode == TiKVOnly { rs.switchNextTiKVPeer(r, ctx.AccessIdx) } else { rs.switchNextFlashPeer(r, ctx.AccessIdx) @@ -679,24 +699,24 @@ type groupedMutations struct { mutations CommitterMutations } -// GroupSortedMutationsByRegion separates keys into groups by their belonging Regions. -func (c *RegionCache) GroupSortedMutationsByRegion(bo *Backoffer, m CommitterMutations) ([]groupedMutations, error) { +// groupSortedMutationsByRegion separates keys into groups by their belonging Regions. +func (c *RegionCache) groupSortedMutationsByRegion(bo *Backoffer, m CommitterMutations) ([]groupedMutations, error) { var ( groups []groupedMutations lastLoc *KeyLocation ) lastUpperBound := 0 - for i := range m.keys { - if lastLoc == nil || !lastLoc.Contains(m.keys[i]) { + for i := 0; i < m.Len(); i++ { + if lastLoc == nil || !lastLoc.Contains(m.GetKey(i)) { if lastLoc != nil { groups = append(groups, groupedMutations{ region: lastLoc.Region, - mutations: m.subRange(lastUpperBound, i), + mutations: m.Slice(lastUpperBound, i), }) lastUpperBound = i } var err error - lastLoc, err = c.LocateKey(bo, m.keys[i]) + lastLoc, err = c.LocateKey(bo, m.GetKey(i)) if err != nil { return nil, errors.Trace(err) } @@ -705,7 +725,7 @@ func (c *RegionCache) GroupSortedMutationsByRegion(bo *Backoffer, m CommitterMut if lastLoc != nil { groups = append(groups, groupedMutations{ region: lastLoc.Region, - mutations: m.subRange(lastUpperBound, m.len()), + mutations: m.Slice(lastUpperBound, m.Len()), }) } return groups, nil @@ -925,6 +945,13 @@ func filterUnavailablePeers(region *pd.Region) { // If the given key is the end key of the region that you want, you may set the second argument to true. This is useful // when processing in reverse order. func (c *RegionCache) loadRegion(bo *Backoffer, key []byte, isEndKey bool) (*Region, error) { + ctx := bo.ctx + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("loadRegion", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + } + var backoffErr error searchPrev := false for { @@ -937,14 +964,14 @@ func (c *RegionCache) loadRegion(bo *Backoffer, key []byte, isEndKey bool) (*Reg var reg *pd.Region var err error if searchPrev { - reg, err = c.pdClient.GetPrevRegion(bo.ctx, key) + reg, err = c.pdClient.GetPrevRegion(ctx, key) } else { - reg, err = c.pdClient.GetRegion(bo.ctx, key) + reg, err = c.pdClient.GetRegion(ctx, key) } if err != nil { - tikvRegionCacheCounterWithGetRegionError.Inc() + metrics.RegionCacheCounterWithGetRegionError.Inc() } else { - tikvRegionCacheCounterWithGetRegionOK.Inc() + metrics.RegionCacheCounterWithGetRegionOK.Inc() } if err != nil { backoffErr = errors.Errorf("loadRegion from PD failed, key: %q, err: %v", key, err) @@ -976,6 +1003,12 @@ func (c *RegionCache) loadRegion(bo *Backoffer, key []byte, isEndKey bool) (*Reg // loadRegionByID loads region from pd client, and picks the first peer as leader. func (c *RegionCache) loadRegionByID(bo *Backoffer, regionID uint64) (*Region, error) { + ctx := bo.ctx + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("loadRegionByID", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + } var backoffErr error for { if backoffErr != nil { @@ -984,11 +1017,11 @@ func (c *RegionCache) loadRegionByID(bo *Backoffer, regionID uint64) (*Region, e return nil, errors.Trace(err) } } - reg, err := c.pdClient.GetRegionByID(bo.ctx, regionID) + reg, err := c.pdClient.GetRegionByID(ctx, regionID) if err != nil { - tikvRegionCacheCounterWithGetRegionByIDError.Inc() + metrics.RegionCacheCounterWithGetRegionByIDError.Inc() } else { - tikvRegionCacheCounterWithGetRegionByIDOK.Inc() + metrics.RegionCacheCounterWithGetRegionByIDOK.Inc() } if err != nil { backoffErr = errors.Errorf("loadRegion from PD failed, regionID: %v, err: %v", regionID, err) @@ -1019,6 +1052,12 @@ func (c *RegionCache) scanRegions(bo *Backoffer, startKey, endKey []byte, limit if limit == 0 { return nil, nil } + ctx := bo.ctx + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("scanRegions", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + } var backoffErr error for { @@ -1028,9 +1067,9 @@ func (c *RegionCache) scanRegions(bo *Backoffer, startKey, endKey []byte, limit return nil, errors.Trace(err) } } - regionsInfo, err := c.pdClient.ScanRegions(bo.ctx, startKey, endKey, limit) + regionsInfo, err := c.pdClient.ScanRegions(ctx, startKey, endKey, limit) if err != nil { - tikvRegionCacheCounterWithScanRegionsError.Inc() + metrics.RegionCacheCounterWithScanRegionsError.Inc() backoffErr = errors.Errorf( "scanRegion from PD failed, startKey: %q, limit: %q, err: %v", startKey, @@ -1039,7 +1078,7 @@ func (c *RegionCache) scanRegions(bo *Backoffer, startKey, endKey []byte, limit continue } - tikvRegionCacheCounterWithScanRegionsOK.Inc() + metrics.RegionCacheCounterWithScanRegionsOK.Inc() if len(regionsInfo) == 0 { return nil, errors.New("PD returned no region") @@ -1130,6 +1169,18 @@ func (c *RegionCache) getStoreByStoreID(storeID uint64) (store *Store) { return } +func (c *RegionCache) getStoresByLabels(labels []*metapb.StoreLabel) []*Store { + c.storeMu.RLock() + defer c.storeMu.RUnlock() + s := make([]*Store, 0) + for _, store := range c.storeMu.stores { + if store.IsLabelsMatch(labels) { + s = append(s, store) + } + } + return s +} + // OnRegionEpochNotMatch removes the old region and inserts new regions into the cache. func (c *RegionCache) OnRegionEpochNotMatch(bo *Backoffer, ctx *RPCContext, currentRegions []*metapb.Region) error { // Find whether the region epoch in `ctx` is ahead of TiKV's. If so, backoff. @@ -1148,7 +1199,7 @@ func (c *RegionCache) OnRegionEpochNotMatch(bo *Backoffer, ctx *RPCContext, curr needInvalidateOld := true // If the region epoch is not ahead of TiKV's, replace region meta in region cache. for _, meta := range currentRegions { - if _, ok := c.pdClient.(*codecPDClient); ok { + if _, ok := c.pdClient.(*CodecPDClient); ok { var err error if meta, err = decodeRegionMetaKeyWithShallowCopy(meta); err != nil { return errors.Errorf("newRegion's range key is not encoded: %v, %v", meta, err) @@ -1160,7 +1211,7 @@ func (c *RegionCache) OnRegionEpochNotMatch(bo *Backoffer, ctx *RPCContext, curr return err } var initLeader uint64 - if ctx.Store.storeType == kv.TiFlash { + if ctx.Store.storeType == TiFlash { initLeader = region.findElectableStoreID() } else { initLeader = ctx.Store.storeID @@ -1185,6 +1236,19 @@ func (c *RegionCache) PDClient() pd.Client { return c.pdClient } +// GetTiFlashStoreAddrs returns addresses of all tiflash nodes. +func (c *RegionCache) GetTiFlashStoreAddrs() []string { + c.storeMu.RLock() + defer c.storeMu.RUnlock() + var addrs []string + for _, s := range c.storeMu.stores { + if s.storeType == TiFlash { + addrs = append(addrs, s.addr) + } + } + return addrs +} + // btreeItem is BTree's Item that uses []byte to compare. type btreeItem struct { key []byte @@ -1221,25 +1285,25 @@ func (r *Region) GetMeta() *metapb.Region { // GetLeaderPeerID returns leader peer ID. func (r *Region) GetLeaderPeerID() uint64 { store := r.getStore() - if int(store.workTiKVIdx) >= store.accessStoreNum(TiKvOnly) { + if int(store.workTiKVIdx) >= store.accessStoreNum(TiKVOnly) { return 0 } - storeIdx, _ := store.accessStore(TiKvOnly, store.workTiKVIdx) + storeIdx, _ := store.accessStore(TiKVOnly, store.workTiKVIdx) return r.meta.Peers[storeIdx].Id } // GetLeaderStoreID returns the store ID of the leader region. func (r *Region) GetLeaderStoreID() uint64 { store := r.getStore() - if int(store.workTiKVIdx) >= store.accessStoreNum(TiKvOnly) { + if int(store.workTiKVIdx) >= store.accessStoreNum(TiKVOnly) { return 0 } - storeIdx, _ := store.accessStore(TiKvOnly, store.workTiKVIdx) + storeIdx, _ := store.accessStore(TiKVOnly, store.workTiKVIdx) return r.meta.Peers[storeIdx].StoreId } func (r *Region) getKvStorePeer(rs *RegionStore, aidx AccessIndex) (store *Store, peer *metapb.Peer, accessIdx AccessIndex, storeIdx int) { - storeIdx, store = rs.accessStore(TiKvOnly, aidx) + storeIdx, store = rs.accessStore(TiKVOnly, aidx) peer = r.meta.Peers[storeIdx] accessIdx = aidx return @@ -1251,13 +1315,13 @@ func (r *Region) WorkStorePeer(rs *RegionStore) (store *Store, peer *metapb.Peer } // FollowerStorePeer returns a follower store with follower peer. -func (r *Region) FollowerStorePeer(rs *RegionStore, followerStoreSeed uint32) (store *Store, peer *metapb.Peer, accessIdx AccessIndex, storeIdx int) { - return r.getKvStorePeer(rs, rs.follower(followerStoreSeed)) +func (r *Region) FollowerStorePeer(rs *RegionStore, followerStoreSeed uint32, op *storeSelectorOp) (store *Store, peer *metapb.Peer, accessIdx AccessIndex, storeIdx int) { + return r.getKvStorePeer(rs, rs.follower(followerStoreSeed, op)) } // AnyStorePeer returns a leader or follower store with the associated peer. -func (r *Region) AnyStorePeer(rs *RegionStore, followerStoreSeed uint32) (store *Store, peer *metapb.Peer, accessIdx AccessIndex, storeIdx int) { - return r.getKvStorePeer(rs, rs.kvPeer(followerStoreSeed)) +func (r *Region) AnyStorePeer(rs *RegionStore, followerStoreSeed uint32, op *storeSelectorOp) (store *Store, peer *metapb.Peer, accessIdx AccessIndex, storeIdx int) { + return r.getKvStorePeer(rs, rs.kvPeer(followerStoreSeed, op)) } // RegionVerID is a unique ID that can identify a Region at a specific version. @@ -1309,7 +1373,7 @@ retry: // switch to new leader. oldRegionStore := r.getStore() var leaderIdx AccessIndex - for i, gIdx := range oldRegionStore.accessIndex[TiKvOnly] { + for i, gIdx := range oldRegionStore.accessIndex[TiKVOnly] { if gIdx == globalStoreIdx { leaderIdx = AccessIndex(i) } @@ -1336,7 +1400,7 @@ func (r *RegionStore) switchNextTiKVPeer(rr *Region, currentPeerIdx AccessIndex) if r.workTiKVIdx != currentPeerIdx { return } - nextIdx := (currentPeerIdx + 1) % AccessIndex(r.accessStoreNum(TiKvOnly)) + nextIdx := (currentPeerIdx + 1) % AccessIndex(r.accessStoreNum(TiKVOnly)) newRegionStore := r.clone() newRegionStore.workTiKVIdx = nextIdx rr.compareAndSwapStore(r, newRegionStore) @@ -1385,14 +1449,15 @@ func (r *Region) ContainsByEnd(key []byte) bool { // Store contains a kv process's address. type Store struct { - addr string // loaded store address - saddr string // loaded store status address - storeID uint64 // store's id - state uint64 // unsafe store storeState - resolveMutex sync.Mutex // protect pd from concurrent init requests - epoch uint32 // store fail epoch, see RegionStore.storeEpochs - storeType kv.StoreType // type of the store - tokenCount atomic2.Int64 // used store token count + addr string // loaded store address + saddr string // loaded store status address + storeID uint64 // store's id + state uint64 // unsafe store storeState + labels []*metapb.StoreLabel // stored store labels + resolveMutex sync.Mutex // protect pd from concurrent init requests + epoch uint32 // store fail epoch, see RegionStore.storeEpochs + storeType StoreType // type of the store + tokenCount atomic2.Int64 // used store token count } type resolveState uint64 @@ -1417,9 +1482,9 @@ func (s *Store) initResolve(bo *Backoffer, c *RegionCache) (addr string, err err for { store, err = c.pdClient.GetStore(bo.ctx, s.storeID) if err != nil { - tikvRegionCacheCounterWithGetStoreError.Inc() + metrics.RegionCacheCounterWithGetStoreError.Inc() } else { - tikvRegionCacheCounterWithGetStoreOK.Inc() + metrics.RegionCacheCounterWithGetStoreOK.Inc() } if err != nil { // TODO: more refine PD error status handle. @@ -1439,6 +1504,7 @@ func (s *Store) initResolve(bo *Backoffer, c *RegionCache) (addr string, err err s.addr = addr s.saddr = store.GetStatusAddress() s.storeType = GetStoreTypeByMeta(store) + s.labels = store.GetLabels() retry: state = s.getResolveState() if state != unresolved { @@ -1452,48 +1518,34 @@ func (s *Store) initResolve(bo *Backoffer, c *RegionCache) (addr string, err err } } -// GetStoreTypeByMeta gets store type by store meta pb. -func GetStoreTypeByMeta(store *metapb.Store) kv.StoreType { - tp := kv.TiKV - for _, label := range store.Labels { - if label.Key == "engine" { - if label.Value == kv.TiFlash.Name() { - tp = kv.TiFlash - } - break - } - } - return tp -} - // reResolve try to resolve addr for store that need check. func (s *Store) reResolve(c *RegionCache) { var addr string store, err := c.pdClient.GetStore(context.Background(), s.storeID) if err != nil { - tikvRegionCacheCounterWithGetStoreError.Inc() + metrics.RegionCacheCounterWithGetStoreError.Inc() } else { - tikvRegionCacheCounterWithGetStoreOK.Inc() + metrics.RegionCacheCounterWithGetStoreOK.Inc() } if err != nil { logutil.BgLogger().Error("loadStore from PD failed", zap.Uint64("id", s.storeID), zap.Error(err)) // we cannot do backoff in reResolve loop but try check other store and wait tick. return } - if store == nil { + if store == nil || store.State == metapb.StoreState_Tombstone { // store has be removed in PD, we should invalidate all regions using those store. logutil.BgLogger().Info("invalidate regions in removed store", zap.Uint64("store", s.storeID), zap.String("add", s.addr)) atomic.AddUint32(&s.epoch, 1) - tikvRegionCacheCounterWithInvalidateStoreRegionsOK.Inc() + metrics.RegionCacheCounterWithInvalidateStoreRegionsOK.Inc() return } storeType := GetStoreTypeByMeta(store) addr = store.GetAddress() - if s.addr != addr { + if s.addr != addr || !s.IsSameLabels(store.GetLabels()) { state := resolved - newStore := &Store{storeID: s.storeID, addr: addr, saddr: store.GetStatusAddress(), storeType: storeType} + newStore := &Store{storeID: s.storeID, addr: addr, saddr: store.GetStatusAddress(), storeType: storeType, labels: store.GetLabels()} newStore.state = *(*uint64)(&state) c.storeMu.Lock() c.storeMu.stores[newStore.storeID] = newStore @@ -1547,7 +1599,34 @@ retry: case notifyCheckCh <- struct{}{}: default: } +} + +// IsSameLabels returns whether the store have the same labels with target labels +func (s *Store) IsSameLabels(labels []*metapb.StoreLabel) bool { + if len(s.labels) != len(labels) { + return false + } + return s.IsLabelsMatch(labels) +} +// IsLabelsMatch return whether the store's labels match the target labels +func (s *Store) IsLabelsMatch(labels []*metapb.StoreLabel) bool { + if len(labels) < 1 { + return true + } + for _, targetLabel := range labels { + match := false + for _, label := range s.labels { + if targetLabel.Key == label.Key && targetLabel.Value == label.Value { + match = true + break + } + } + if !match { + return false + } + } + return true } type livenessState uint32 @@ -1562,7 +1641,6 @@ const ( unknown livenessState = iota reachable unreachable - offline ) func (s *Store) requestLiveness(bo *Backoffer) (l livenessState) { @@ -1598,9 +1676,9 @@ func invokeKVStatusAPI(saddr string, timeout time.Duration) (l livenessState) { start := time.Now() defer func() { if l == reachable { - tikvStatusCountWithOK.Inc() + metrics.StatusCountWithOK.Inc() } else { - tikvStatusCountWithError.Inc() + metrics.StatusCountWithError.Inc() } metrics.TiKVStatusDuration.WithLabelValues(saddr).Observe(time.Since(start).Seconds()) }() diff --git a/store/tikv/region_cache_test.go b/store/tikv/region_cache_test.go index 0b259ddf6b110..650650f1ee89a 100644 --- a/store/tikv/region_cache_test.go +++ b/store/tikv/region_cache_test.go @@ -53,7 +53,7 @@ func (s *testRegionCacheSuite) SetUpTest(c *C) { s.store2 = storeIDs[1] s.peer1 = peerIDs[0] s.peer2 = peerIDs[1] - pdCli := &codecPDClient{mocktikv.NewPDClient(s.cluster)} + pdCli := &CodecPDClient{mocktikv.NewPDClient(s.cluster)} s.cache = NewRegionCache(pdCli) s.bo = NewBackofferWithVars(context.Background(), 5000, nil) } @@ -121,6 +121,34 @@ func (s *testRegionCacheSuite) getAddr(c *C, key []byte, replicaRead kv.ReplicaR return ctx.Addr } +func (s *testRegionCacheSuite) TestStoreLabels(c *C) { + testcases := []struct { + storeID uint64 + }{ + { + storeID: s.store1, + }, + { + storeID: s.store2, + }, + } + for _, testcase := range testcases { + c.Log(testcase.storeID) + store := s.cache.getStoreByStoreID(testcase.storeID) + _, err := store.initResolve(s.bo, s.cache) + c.Assert(err, IsNil) + labels := []*metapb.StoreLabel{ + { + Key: "id", + Value: fmt.Sprintf("%v", testcase.storeID), + }, + } + stores := s.cache.getStoresByLabels(labels) + c.Assert(len(stores), Equals, 1) + c.Assert(stores[0].labels, DeepEquals, labels) + } +} + func (s *testRegionCacheSuite) TestSimple(c *C) { seed := rand.Uint32() r := s.getRegion(c, []byte("a")) @@ -595,6 +623,96 @@ func (s *testRegionCacheSuite) TestSendFailedInMultipleNode(c *C) { c.Assert(ctxFollower1.Peer.Id, Not(Equals), ctxFollower2.Peer.Id) } +func (s *testRegionCacheSuite) TestLabelSelectorTiKVPeer(c *C) { + dc1Label := []*metapb.StoreLabel{ + { + Key: "zone", + Value: "dc-1", + }, + } + dc2Label := []*metapb.StoreLabel{ + { + Key: "zone", + Value: "dc-2", + }, + } + dc3Label := []*metapb.StoreLabel{ + { + Key: "zone", + Value: "dc-3", + }, + } + s.cluster.UpdateStoreLabels(s.store1, dc1Label) + s.cluster.UpdateStoreLabels(s.store2, dc2Label) + + store3 := s.cluster.AllocID() + peer3 := s.cluster.AllocID() + s.cluster.AddStore(store3, s.storeAddr(store3)) + s.cluster.AddPeer(s.region1, store3, peer3) + s.cluster.UpdateStoreLabels(store3, dc1Label) + // Region have 3 peer, leader located in dc-1, followers located in dc-1, dc-2 + loc, err := s.cache.LocateKey(s.bo, []byte("a")) + c.Assert(err, IsNil) + seed := rand.Uint32() + + testcases := []struct { + name string + t kv.ReplicaReadType + labels []*metapb.StoreLabel + expectStoreIDRange map[uint64]struct{} + }{ + { + name: "any Peer,located in dc-1", + t: kv.ReplicaReadMixed, + labels: dc1Label, + expectStoreIDRange: map[uint64]struct{}{ + s.store1: {}, + store3: {}, + }, + }, + { + name: "any Peer,located in dc-2", + t: kv.ReplicaReadMixed, + labels: dc2Label, + expectStoreIDRange: map[uint64]struct{}{ + s.store2: {}, + }, + }, + { + name: "only follower,located in dc-1", + t: kv.ReplicaReadFollower, + labels: dc1Label, + expectStoreIDRange: map[uint64]struct{}{ + store3: {}, + }, + }, + { + name: "only leader, shouldn't consider labels", + t: kv.ReplicaReadLeader, + labels: dc2Label, + expectStoreIDRange: map[uint64]struct{}{ + s.store1: {}, + }, + }, + { + name: "no label matching, fallback to leader", + t: kv.ReplicaReadMixed, + labels: dc3Label, + expectStoreIDRange: map[uint64]struct{}{ + s.store1: {}, + }, + }, + } + + for _, testcase := range testcases { + c.Log(testcase.name) + ctx, err := s.cache.GetTiKVRPCContext(s.bo, loc.Region, testcase.t, seed, WithMatchLabels(testcase.labels)) + c.Assert(err, IsNil) + _, exist := testcase.expectStoreIDRange[ctx.Store.storeID] + c.Assert(exist, Equals, true) + } +} + func (s *testRegionCacheSuite) TestSplit(c *C) { seed := rand.Uint32() r := s.getRegion(c, []byte("x")) @@ -663,7 +781,7 @@ func (s *testRegionCacheSuite) TestReconnect(c *C) { func (s *testRegionCacheSuite) TestRegionEpochAheadOfTiKV(c *C) { // Create a separated region cache to do this test. - pdCli := &codecPDClient{mocktikv.NewPDClient(s.cluster)} + pdCli := &CodecPDClient{mocktikv.NewPDClient(s.cluster)} cache := NewRegionCache(pdCli) defer cache.Close() @@ -832,6 +950,33 @@ func (s *testRegionCacheSuite) TestReplaceNewAddrAndOldOfflineImmediately(c *C) c.Assert(getVal, BytesEquals, testValue) } +func (s *testRegionCacheSuite) TestReplaceStore(c *C) { + mvccStore := mocktikv.MustNewMVCCStore() + defer mvccStore.Close() + + client := &RawKVClient{ + clusterID: 0, + regionCache: NewRegionCache(mocktikv.NewPDClient(s.cluster)), + rpcClient: mocktikv.NewRPCClient(s.cluster, mvccStore), + } + defer client.Close() + testKey := []byte("test_key") + testValue := []byte("test_value") + err := client.Put(testKey, testValue) + c.Assert(err, IsNil) + + s.cluster.MarkTombstone(s.store1) + store3 := s.cluster.AllocID() + peer3 := s.cluster.AllocID() + s.cluster.AddStore(store3, s.storeAddr(s.store1)) + s.cluster.AddPeer(s.region1, store3, peer3) + s.cluster.RemovePeer(s.region1, s.peer1) + s.cluster.ChangeLeader(s.region1, peer3) + + err = client.Put(testKey, testValue) + c.Assert(err, IsNil) +} + func (s *testRegionCacheSuite) TestListRegionIDsInCache(c *C) { // ['' - 'm' - 'z'] region2 := s.cluster.AllocID() @@ -1116,7 +1261,7 @@ func (s *testRegionCacheSuite) TestPeersLenChange(c *C) { s.cache.OnSendFail(NewNoopBackoff(context.Background()), ctx, false, errors.New("send fail")) } -func (s *testRegionRequestSuite) TestGetRegionByIDFromCache(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestGetRegionByIDFromCache(c *C) { region, err := s.cache.LocateRegionByID(s.bo, s.region) c.Assert(err, IsNil) c.Assert(region, NotNil) @@ -1219,7 +1364,7 @@ func BenchmarkOnRequestFail(b *testing.B) { AccessIdx: accessIdx, Peer: peer, Store: store, - AccessMode: TiKvOnly, + AccessMode: TiKVOnly, } r := cache.getCachedRegionWithRLock(rpcCtx.Region) if r != nil { diff --git a/store/tikv/region_request.go b/store/tikv/region_request.go index 447f6b1fad986..7182bf23d9e91 100644 --- a/store/tikv/region_request.go +++ b/store/tikv/region_request.go @@ -33,10 +33,12 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" + "github.com/pingcap/tidb/store/tikv/storeutil" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/storeutil" + "github.com/pingcap/tidb/store/tikv/util" + "github.com/pingcap/tidb/util/execdetails" ) // ShuttingDown is a flag to indicate tidb-server is exiting (Ctrl+C signal @@ -94,11 +96,23 @@ func (r *RegionRequestRuntimeStats) String() string { if buf.Len() > 0 { buf.WriteByte(',') } - buf.WriteString(fmt.Sprintf("%s:{num_rpc:%d, total_time:%s}", k.String(), v.Count, time.Duration(v.Consume))) + buf.WriteString(fmt.Sprintf("%s:{num_rpc:%d, total_time:%s}", k.String(), v.Count, execdetails.FormatDuration(time.Duration(v.Consume)))) } return buf.String() } +// Clone returns a copy of itself. +func (r *RegionRequestRuntimeStats) Clone() RegionRequestRuntimeStats { + newRs := NewRegionRequestRuntimeStats() + for cmd, v := range r.Stats { + newRs.Stats[cmd] = &RPCRuntimeStats{ + Count: v.Count, + Consume: v.Consume, + } + } + return newRs +} + // Merge merges other RegionRequestRuntimeStats. func (r *RegionRequestRuntimeStats) Merge(rs RegionRequestRuntimeStats) { for cmd, v := range rs.Stats { @@ -115,46 +129,8 @@ func (r *RegionRequestRuntimeStats) Merge(rs RegionRequestRuntimeStats) { } } -// RegionBatchRequestSender sends BatchCop requests to TiFlash server by stream way. -type RegionBatchRequestSender struct { - RegionRequestSender -} - -// NewRegionBatchRequestSender creates a RegionBatchRequestSender object. -func NewRegionBatchRequestSender(cache *RegionCache, client Client) *RegionBatchRequestSender { - return &RegionBatchRequestSender{RegionRequestSender: RegionRequestSender{regionCache: cache, client: client}} -} - -func (ss *RegionBatchRequestSender) sendStreamReqToAddr(bo *Backoffer, ctxs []copTaskAndRPCContext, req *tikvrpc.Request, timout time.Duration) (resp *tikvrpc.Response, retry bool, cancel func(), err error) { - // use the first ctx to send request, because every ctx has same address. - cancel = func() {} - rpcCtx := ctxs[0].ctx - if e := tikvrpc.SetContext(req, rpcCtx.Meta, rpcCtx.Peer); e != nil { - return nil, false, cancel, errors.Trace(e) - } - ctx := bo.ctx - if rawHook := ctx.Value(RPCCancellerCtxKey{}); rawHook != nil { - ctx, cancel = rawHook.(*RPCCanceller).WithCancel(ctx) - } - start := time.Now() - resp, err = ss.client.SendRequest(ctx, rpcCtx.Addr, req, timout) - if ss.Stats != nil { - recordRegionRequestRuntimeStats(ss.Stats, req.Type, time.Since(start)) - } - if err != nil { - cancel() - ss.rpcError = err - e := ss.onSendFail(bo, ctxs, err) - if e != nil { - return nil, false, func() {}, errors.Trace(e) - } - return nil, true, func() {}, nil - } - // We don't need to process region error or lock error. Because TiFlash will retry by itself. - return -} - -func recordRegionRequestRuntimeStats(stats map[tikvrpc.CmdType]*RPCRuntimeStats, cmd tikvrpc.CmdType, d time.Duration) { +// RecordRegionRequestRuntimeStats records request runtime stats. +func RecordRegionRequestRuntimeStats(stats map[tikvrpc.CmdType]*RPCRuntimeStats, cmd tikvrpc.CmdType, d time.Duration) { stat, ok := stats[cmd] if !ok { stats[cmd] = &RPCRuntimeStats{ @@ -167,29 +143,6 @@ func recordRegionRequestRuntimeStats(stats map[tikvrpc.CmdType]*RPCRuntimeStats, stat.Consume += int64(d) } -func (ss *RegionBatchRequestSender) onSendFail(bo *Backoffer, ctxs []copTaskAndRPCContext, err error) error { - // If it failed because the context is cancelled by ourself, don't retry. - if errors.Cause(err) == context.Canceled || status.Code(errors.Cause(err)) == codes.Canceled { - return errors.Trace(err) - } else if atomic.LoadUint32(&ShuttingDown) > 0 { - return errTiDBShuttingDown - } - - for _, failedCtx := range ctxs { - ctx := failedCtx.ctx - if ctx.Meta != nil { - ss.regionCache.OnSendFail(bo, ctx, ss.needReloadRegion(ctx), err) - } - } - - // Retry on send request failure when it's not canceled. - // When a store is not available, the leader of related region should be elected quickly. - // TODO: the number of retry time should be limited:since region may be unavailable - // when some unrecoverable disaster happened. - err = bo.Backoff(boTiKVRPC, errors.Errorf("send tikv request error: %v, ctxs: %v, try next peer later", err, ctxs)) - return errors.Trace(err) -} - // NewRegionRequestSender creates a new sender. func NewRegionRequestSender(regionCache *RegionCache, client Client) *RegionRequestSender { return &RegionRequestSender{ @@ -198,12 +151,65 @@ func NewRegionRequestSender(regionCache *RegionCache, client Client) *RegionRequ } } +// GetRegionCache returns the region cache. +func (s *RegionRequestSender) GetRegionCache() *RegionCache { + return s.regionCache +} + +// GetClient returns the RPC client. +func (s *RegionRequestSender) GetClient() Client { + return s.client +} + +// SetStoreAddr specifies the dest store address. +func (s *RegionRequestSender) SetStoreAddr(addr string) { + s.storeAddr = addr +} + +// GetStoreAddr returns the dest store address. +func (s *RegionRequestSender) GetStoreAddr() string { + return s.storeAddr +} + +// GetRPCError returns the RPC error. +func (s *RegionRequestSender) GetRPCError() error { + return s.rpcError +} + +// SetRPCError rewrite the rpc error. +func (s *RegionRequestSender) SetRPCError(err error) { + s.rpcError = err +} + // SendReq sends a request to tikv server. func (s *RegionRequestSender) SendReq(bo *Backoffer, req *tikvrpc.Request, regionID RegionVerID, timeout time.Duration) (*tikvrpc.Response, error) { resp, _, err := s.SendReqCtx(bo, req, regionID, timeout, kv.TiKV) return resp, err } +func (s *RegionRequestSender) getRPCContext( + bo *Backoffer, + req *tikvrpc.Request, + regionID RegionVerID, + sType kv.StoreType, + opts ...StoreSelectorOption, +) (*RPCContext, error) { + switch sType { + case kv.TiKV: + var seed uint32 + if req.ReplicaReadSeed != nil { + seed = *req.ReplicaReadSeed + } + return s.regionCache.GetTiKVRPCContext(bo, regionID, req.ReplicaReadType, seed, opts...) + case kv.TiFlash: + return s.regionCache.GetTiFlashRPCContext(bo, regionID) + case kv.TiDB: + return &RPCContext{Addr: s.storeAddr}, nil + default: + return nil, errors.Errorf("unsupported storage type: %v", sType) + } +} + // SendReqCtx sends a request to tikv server and return response and RPCCtx of this RPC. func (s *RegionRequestSender) SendReqCtx( bo *Backoffer, @@ -211,13 +217,14 @@ func (s *RegionRequestSender) SendReqCtx( regionID RegionVerID, timeout time.Duration, sType kv.StoreType, + opts ...StoreSelectorOption, ) ( resp *tikvrpc.Response, rpcCtx *RPCContext, err error, ) { if span := opentracing.SpanFromContext(bo.ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("regionReqauest.SendReqCtx", opentracing.ChildOf(span.Context())) + span1 := span.Tracer().StartSpan("regionRequest.SendReqCtx", opentracing.ChildOf(span.Context())) defer span1.Finish() bo = bo.Clone() bo.ctx = opentracing.ContextWithSpan(bo.ctx, span1) @@ -247,41 +254,26 @@ func (s *RegionRequestSender) SendReqCtx( if sType == kv.TiDB { failpoint.Return(nil, nil, ErrTiKVServerTimeout) } + case "requestTiFlashError": + if sType == kv.TiFlash { + failpoint.Return(nil, nil, ErrTiFlashServerTimeout) + } } }) - var replicaRead kv.ReplicaReadType - if req.ReplicaRead { - replicaRead = kv.ReplicaReadFollower - } else { - replicaRead = kv.ReplicaReadLeader - } tryTimes := 0 for { if (tryTimes > 0) && (tryTimes%100000 == 0) { logutil.Logger(bo.ctx).Warn("retry get ", zap.Uint64("region = ", regionID.GetID()), zap.Int("times = ", tryTimes)) } - switch sType { - case kv.TiKV: - var seed uint32 - if req.ReplicaReadSeed != nil { - seed = *req.ReplicaReadSeed - } - rpcCtx, err = s.regionCache.GetTiKVRPCContext(bo, regionID, replicaRead, seed) - case kv.TiFlash: - rpcCtx, err = s.regionCache.GetTiFlashRPCContext(bo, regionID) - case kv.TiDB: - rpcCtx = &RPCContext{ - Addr: s.storeAddr, - } - default: - err = errors.Errorf("unsupported storage type: %v", sType) - } + + rpcCtx, err = s.getRPCContext(bo, req, regionID, sType, opts...) if err != nil { return nil, nil, err } + failpoint.Inject("invalidCacheAndRetry", func() { - // cooperate with github.com/pingcap/tidb/store/tikv/gcworker/setGcResolveMaxBackoff + // cooperate with github.com/pingcap/tidb/store/gcworker/setGcResolveMaxBackoff if c := bo.ctx.Value("injectedBackoff"); c != nil { resp, err = tikvrpc.GenRegionErrorResp(req, &errorpb.Error{EpochNotMatch: &errorpb.EpochNotMatch{}}) failpoint.Return(resp, nil, err) @@ -404,21 +396,89 @@ func (s *RegionRequestSender) sendReqToRegion(bo *Backoffer, rpcCtx *RPCContext, ctx, cancel = rawHook.(*RPCCanceller).WithCancel(ctx) defer cancel() } - start := time.Now() - resp, err = s.client.SendRequest(ctx, rpcCtx.Addr, req, timeout) - if s.Stats != nil { - recordRegionRequestRuntimeStats(s.Stats, req.Type, time.Since(start)) - failpoint.Inject("tikvStoreRespResult", func(val failpoint.Value) { + + var sessionID uint64 + if v := bo.ctx.Value(util.SessionID); v != nil { + sessionID = v.(uint64) + } + + injectFailOnSend := false + failpoint.Inject("rpcFailOnSend", func(val failpoint.Value) { + inject := true + // Optional filters + if s, ok := val.(string); ok { + if s == "greengc" && !req.IsGreenGCRequest() { + inject = false + } else if s == "write" && !req.IsTxnWriteRequest() { + inject = false + } + } else if sessionID == 0 { + inject = false + } + + if inject { + logutil.Logger(ctx).Info("[failpoint] injected RPC error on send", zap.Stringer("type", req.Type), + zap.Stringer("req", req.Req.(fmt.Stringer)), zap.Stringer("ctx", &req.Context)) + injectFailOnSend = true + err = errors.New("injected RPC error on send") + } + }) + + if !injectFailOnSend { + start := time.Now() + resp, err = s.client.SendRequest(ctx, rpcCtx.Addr, req, timeout) + if s.Stats != nil { + RecordRegionRequestRuntimeStats(s.Stats, req.Type, time.Since(start)) + failpoint.Inject("tikvStoreRespResult", func(val failpoint.Value) { + if val.(bool) { + if req.Type == tikvrpc.CmdCop && bo.totalSleep == 0 { + failpoint.Return(&tikvrpc.Response{ + Resp: &coprocessor.Response{RegionError: &errorpb.Error{EpochNotMatch: &errorpb.EpochNotMatch{}}}, + }, false, nil) + } + } + }) + } + + failpoint.Inject("rpcFailOnRecv", func(val failpoint.Value) { + inject := true + // Optional filters + if s, ok := val.(string); ok { + if s == "greengc" && !req.IsGreenGCRequest() { + inject = false + } else if s == "write" && !req.IsTxnWriteRequest() { + inject = false + } + } else if sessionID == 0 { + inject = false + } + + if inject { + logutil.Logger(ctx).Info("[failpoint] injected RPC error on recv", zap.Stringer("type", req.Type), + zap.Stringer("req", req.Req.(fmt.Stringer)), zap.Stringer("ctx", &req.Context)) + err = errors.New("injected RPC error on recv") + resp = nil + } + }) + + failpoint.Inject("rpcContextCancelErr", func(val failpoint.Value) { if val.(bool) { - if req.Type == tikvrpc.CmdCop && bo.totalSleep == 0 { - failpoint.Return(&tikvrpc.Response{ - Resp: &coprocessor.Response{RegionError: &errorpb.Error{EpochNotMatch: &errorpb.EpochNotMatch{}}}, - }, false, nil) + ctx1, cancel := context.WithCancel(context.Background()) + cancel() + select { + case <-ctx1.Done(): } + + ctx = ctx1 + err = ctx.Err() + resp = nil } }) } + if err != nil { + s.rpcError = err + // Because in rpc logic, context.Cancel() will be transferred to rpcContext.Cancel error. For rpcContext cancel, // we need to retry the request. But for context cancel active, for example, limitExec gets the required rows, // we shouldn't retry the request, it will go to backoff and hang in retry logic. @@ -426,7 +486,6 @@ func (s *RegionRequestSender) sendReqToRegion(bo *Backoffer, rpcCtx *RPCContext, return nil, false, errors.Trace(ctx.Err()) } - s.rpcError = err failpoint.Inject("noRetryOnRpcError", func(val failpoint.Value) { if val.(bool) { failpoint.Return(nil, false, err) @@ -448,7 +507,7 @@ func (s *RegionRequestSender) getStoreToken(st *Store, limit int64) error { st.tokenCount.Add(1) return nil } - metrics.GetStoreLimitErrorCounter.WithLabelValues(st.addr, strconv.FormatUint(st.storeID, 10)).Inc() + metrics.TiKVStoreLimitErrorCounter.WithLabelValues(st.addr, strconv.FormatUint(st.storeID, 10)).Inc() return ErrTokenLimit.GenWithStackByArgs(st.storeID) } @@ -474,7 +533,7 @@ func (s *RegionRequestSender) onSendFail(bo *Backoffer, ctx *RPCContext, err err if errors.Cause(err) == context.Canceled { return errors.Trace(err) } else if atomic.LoadUint32(&ShuttingDown) > 0 { - return errTiDBShuttingDown + return ErrTiDBShuttingDown } if status.Code(errors.Cause(err)) == codes.Canceled { select { @@ -489,19 +548,23 @@ func (s *RegionRequestSender) onSendFail(bo *Backoffer, ctx *RPCContext, err err } if ctx.Meta != nil { - s.regionCache.OnSendFail(bo, ctx, s.needReloadRegion(ctx), err) + s.regionCache.OnSendFail(bo, ctx, s.NeedReloadRegion(ctx), err) } // Retry on send request failure when it's not canceled. // When a store is not available, the leader of related region should be elected quickly. // TODO: the number of retry time should be limited:since region may be unavailable // when some unrecoverable disaster happened. - err = bo.Backoff(boTiKVRPC, errors.Errorf("send tikv request error: %v, ctx: %v, try next peer later", err, ctx)) + if ctx.Store != nil && ctx.Store.storeType == TiFlash { + err = bo.Backoff(BoTiFlashRPC, errors.Errorf("send tiflash request error: %v, ctx: %v, try next peer later", err, ctx)) + } else { + err = bo.Backoff(BoTiKVRPC, errors.Errorf("send tikv request error: %v, ctx: %v, try next peer later", err, ctx)) + } return errors.Trace(err) } -// needReloadRegion checks is all peers has sent failed, if so need reload. -func (s *RegionRequestSender) needReloadRegion(ctx *RPCContext) (need bool) { +// NeedReloadRegion checks is all peers has sent failed, if so need reload. +func (s *RegionRequestSender) NeedReloadRegion(ctx *RPCContext) (need bool) { if s.failStoreIDs == nil { s.failStoreIDs = make(map[uint64]struct{}) } @@ -566,7 +629,7 @@ func (s *RegionRequestSender) onRegionError(bo *Backoffer, ctx *RPCContext, seed if storeNotMatch := regionErr.GetStoreNotMatch(); storeNotMatch != nil { // store not match - logutil.BgLogger().Warn("tikv reports `StoreNotMatch` retry later", + logutil.BgLogger().Debug("tikv reports `StoreNotMatch` retry later", zap.Stringer("storeNotMatch", storeNotMatch), zap.Stringer("ctx", ctx)) ctx.Store.markNeedCheck(s.regionCache.notifyCheckCh) @@ -587,7 +650,11 @@ func (s *RegionRequestSender) onRegionError(bo *Backoffer, ctx *RPCContext, seed logutil.BgLogger().Warn("tikv reports `ServerIsBusy` retry later", zap.String("reason", regionErr.GetServerIsBusy().GetReason()), zap.Stringer("ctx", ctx)) - err = bo.Backoff(boServerBusy, errors.Errorf("server is busy, ctx: %v", ctx)) + if ctx != nil && ctx.Store != nil && ctx.Store.storeType == TiFlash { + err = bo.Backoff(boTiFlashServerBusy, errors.Errorf("server is busy, ctx: %v", ctx)) + } else { + err = bo.Backoff(boTiKVServerBusy, errors.Errorf("server is busy, ctx: %v", ctx)) + } if err != nil { return false, errors.Trace(err) } @@ -631,7 +698,8 @@ func (s *RegionRequestSender) onRegionError(bo *Backoffer, ctx *RPCContext, seed return false, nil } -func pbIsolationLevel(level kv.IsoLevel) kvrpcpb.IsolationLevel { +// IsolationLevelToPB converts isolation level to wire type. +func IsolationLevelToPB(level kv.IsoLevel) kvrpcpb.IsolationLevel { switch level { case kv.RC: return kvrpcpb.IsolationLevel_RC diff --git a/store/tikv/region_request_test.go b/store/tikv/region_request_test.go index 4943ea04742b6..d2df27b16e8c7 100644 --- a/store/tikv/region_request_test.go +++ b/store/tikv/region_request_test.go @@ -25,16 +25,18 @@ import ( "github.com/pingcap/kvproto/pkg/coprocessor" "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/mpp" "github.com/pingcap/kvproto/pkg/tikvpb" - "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/storeutil" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/storeutil" "google.golang.org/grpc" ) -type testRegionRequestSuite struct { +type testRegionRequestToSingleStoreSuite struct { cluster *mocktikv.Cluster store uint64 peer uint64 @@ -45,7 +47,7 @@ type testRegionRequestSuite struct { mvccStore mocktikv.MVCCStore } -type testStoreLimitSuite struct { +type testRegionRequestToThreeStoresSuite struct { cluster *mocktikv.Cluster storeIDs []uint64 peerIDs []uint64 @@ -57,13 +59,13 @@ type testStoreLimitSuite struct { mvccStore mocktikv.MVCCStore } -var _ = Suite(&testRegionRequestSuite{}) -var _ = Suite(&testStoreLimitSuite{}) +var _ = Suite(&testRegionRequestToSingleStoreSuite{}) +var _ = Suite(&testRegionRequestToThreeStoresSuite{}) -func (s *testRegionRequestSuite) SetUpTest(c *C) { +func (s *testRegionRequestToSingleStoreSuite) SetUpTest(c *C) { s.cluster = mocktikv.NewCluster(mocktikv.MustNewMVCCStore()) s.store, s.peer, s.region = mocktikv.BootstrapWithSingleStore(s.cluster) - pdCli := &codecPDClient{mocktikv.NewPDClient(s.cluster)} + pdCli := &CodecPDClient{mocktikv.NewPDClient(s.cluster)} s.cache = NewRegionCache(pdCli) s.bo = NewNoopBackoff(context.Background()) s.mvccStore = mocktikv.MustNewMVCCStore() @@ -71,10 +73,10 @@ func (s *testRegionRequestSuite) SetUpTest(c *C) { s.regionRequestSender = NewRegionRequestSender(s.cache, client) } -func (s *testStoreLimitSuite) SetUpTest(c *C) { +func (s *testRegionRequestToThreeStoresSuite) SetUpTest(c *C) { s.cluster = mocktikv.NewCluster(mocktikv.MustNewMVCCStore()) s.storeIDs, s.peerIDs, s.regionID, s.leaderPeer = mocktikv.BootstrapWithMultiStores(s.cluster, 3) - pdCli := &codecPDClient{mocktikv.NewPDClient(s.cluster)} + pdCli := &CodecPDClient{mocktikv.NewPDClient(s.cluster)} s.cache = NewRegionCache(pdCli) s.bo = NewNoopBackoff(context.Background()) s.mvccStore = mocktikv.MustNewMVCCStore() @@ -82,11 +84,11 @@ func (s *testStoreLimitSuite) SetUpTest(c *C) { s.regionRequestSender = NewRegionRequestSender(s.cache, client) } -func (s *testRegionRequestSuite) TearDownTest(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TearDownTest(c *C) { s.cache.Close() } -func (s *testStoreLimitSuite) TearDownTest(c *C) { +func (s *testRegionRequestToThreeStoresSuite) TearDownTest(c *C) { s.cache.Close() } @@ -102,7 +104,36 @@ func (f *fnClient) SendRequest(ctx context.Context, addr string, req *tikvrpc.Re return f.fn(ctx, addr, req, timeout) } -func (s *testRegionRequestSuite) TestOnRegionError(c *C) { +func (s *testRegionRequestToThreeStoresSuite) TestGetRPCContext(c *C) { + // Load the bootstrapped region into the cache. + _, err := s.cache.BatchLoadRegionsFromKey(s.bo, []byte{}, 1) + c.Assert(err, IsNil) + + var seed uint32 = 0 + var regionID = RegionVerID{s.regionID, 0, 0} + + req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdGet, &kvrpcpb.GetRequest{}, kv.ReplicaReadLeader, &seed) + rpcCtx, err := s.regionRequestSender.getRPCContext(s.bo, req, regionID, kv.TiKV) + c.Assert(err, IsNil) + c.Assert(rpcCtx.Peer.Id, Equals, s.leaderPeer) + + req.ReplicaReadType = kv.ReplicaReadFollower + rpcCtx, err = s.regionRequestSender.getRPCContext(s.bo, req, regionID, kv.TiKV) + c.Assert(err, IsNil) + c.Assert(rpcCtx.Peer.Id, Not(Equals), s.leaderPeer) + + req.ReplicaReadType = kv.ReplicaReadMixed + rpcCtx, err = s.regionRequestSender.getRPCContext(s.bo, req, regionID, kv.TiKV) + c.Assert(err, IsNil) + c.Assert(rpcCtx.Peer.Id, Equals, s.leaderPeer) + + seed = 1 + rpcCtx, err = s.regionRequestSender.getRPCContext(s.bo, req, regionID, kv.TiKV) + c.Assert(err, IsNil) + c.Assert(rpcCtx.Peer.Id, Not(Equals), s.leaderPeer) +} + +func (s *testRegionRequestToSingleStoreSuite) TestOnRegionError(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -131,7 +162,7 @@ func (s *testRegionRequestSuite) TestOnRegionError(c *C) { } -func (s *testStoreLimitSuite) TestStoreTokenLimit(c *C) { +func (s *testRegionRequestToThreeStoresSuite) TestStoreTokenLimit(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdPrewrite, &kvrpcpb.PrewriteRequest{}, kvrpcpb.Context{}) region, err := s.cache.LocateRegionByID(s.bo, s.regionID) c.Assert(err, IsNil) @@ -147,7 +178,7 @@ func (s *testStoreLimitSuite) TestStoreTokenLimit(c *C) { storeutil.StoreLimit.Store(oldStoreLimit) } -func (s *testRegionRequestSuite) TestOnSendFailedWithStoreRestart(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestOnSendFailedWithStoreRestart(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -177,7 +208,7 @@ func (s *testRegionRequestSuite) TestOnSendFailedWithStoreRestart(c *C) { c.Assert(resp.Resp, NotNil) } -func (s *testRegionRequestSuite) TestOnSendFailedWithCloseKnownStoreThenUseNewOne(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestOnSendFailedWithCloseKnownStoreThenUseNewOne(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -211,7 +242,7 @@ func (s *testRegionRequestSuite) TestOnSendFailedWithCloseKnownStoreThenUseNewOn c.Assert(resp.Resp, NotNil) } -func (s *testRegionRequestSuite) TestSendReqCtx(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestSendReqCtx(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -230,7 +261,7 @@ func (s *testRegionRequestSuite) TestSendReqCtx(c *C) { c.Assert(ctx, NotNil) } -func (s *testRegionRequestSuite) TestOnSendFailedWithCancelled(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestOnSendFailedWithCancelled(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -260,7 +291,7 @@ func (s *testRegionRequestSuite) TestOnSendFailedWithCancelled(c *C) { c.Assert(resp.Resp, NotNil) } -func (s *testRegionRequestSuite) TestNoReloadRegionWhenCtxCanceled(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestNoReloadRegionWhenCtxCanceled(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), Value: []byte("value"), @@ -394,6 +425,15 @@ func (s *mockTikvGrpcServer) Coprocessor(context.Context, *coprocessor.Request) func (s *mockTikvGrpcServer) BatchCoprocessor(*coprocessor.BatchRequest, tikvpb.Tikv_BatchCoprocessorServer) error { return errors.New("unreachable") } +func (s *mockTikvGrpcServer) DispatchMPPTask(context.Context, *mpp.DispatchTaskRequest) (*mpp.DispatchTaskResponse, error) { + return nil, errors.New("unreachable") +} +func (s *mockTikvGrpcServer) EstablishMPPConnection(*mpp.EstablishMPPConnectionRequest, tikvpb.Tikv_EstablishMPPConnectionServer) error { + return errors.New("unreachable") +} +func (s *mockTikvGrpcServer) CancelMPPTask(context.Context, *mpp.CancelTaskRequest) (*mpp.CancelTaskResponse, error) { + return nil, errors.New("unreachable") +} func (s *mockTikvGrpcServer) Raft(tikvpb.Tikv_RaftServer) error { return errors.New("unreachable") } @@ -449,7 +489,15 @@ func (s *mockTikvGrpcServer) VerDeleteRange(context.Context, *kvrpcpb.VerDeleteR return nil, errors.New("unreachable") } -func (s *testRegionRequestSuite) TestNoReloadRegionForGrpcWhenCtxCanceled(c *C) { +func (s *mockTikvGrpcServer) CheckLeader(context.Context, *kvrpcpb.CheckLeaderRequest) (*kvrpcpb.CheckLeaderResponse, error) { + return nil, errors.New("unreachable") +} + +func (s *mockTikvGrpcServer) RawGetKeyTTL(ctx context.Context, req *kvrpcpb.RawGetKeyTTLRequest) (*kvrpcpb.RawGetKeyTTLResponse, error) { + return nil, errors.New("unreachable") +} + +func (s *testRegionRequestToSingleStoreSuite) TestNoReloadRegionForGrpcWhenCtxCanceled(c *C) { // prepare a mock tikv grpc server addr := "localhost:56341" lis, err := net.Listen("tcp", addr) @@ -463,7 +511,7 @@ func (s *testRegionRequestSuite) TestNoReloadRegionForGrpcWhenCtxCanceled(c *C) wg.Done() }() - client := newRPCClient(config.Security{}) + client := NewRPCClient(config.Security{}) sender := NewRegionRequestSender(s.cache, client) req := tikvrpc.NewRequest(tikvrpc.CmdRawPut, &kvrpcpb.RawPutRequest{ Key: []byte("key"), @@ -480,7 +528,7 @@ func (s *testRegionRequestSuite) TestNoReloadRegionForGrpcWhenCtxCanceled(c *C) // Just for covering error code = codes.Canceled. client1 := &cancelContextClient{ - Client: newRPCClient(config.Security{}), + Client: NewRPCClient(config.Security{}), redirectAddr: addr, } sender = NewRegionRequestSender(s.cache, client1) @@ -491,7 +539,7 @@ func (s *testRegionRequestSuite) TestNoReloadRegionForGrpcWhenCtxCanceled(c *C) wg.Wait() } -func (s *testRegionRequestSuite) TestOnMaxTimestampNotSyncedError(c *C) { +func (s *testRegionRequestToSingleStoreSuite) TestOnMaxTimestampNotSyncedError(c *C) { req := tikvrpc.NewRequest(tikvrpc.CmdPrewrite, &kvrpcpb.PrewriteRequest{}) region, err := s.cache.LocateRegionByID(s.bo, s.region) c.Assert(err, IsNil) @@ -505,7 +553,7 @@ func (s *testRegionRequestSuite) TestOnMaxTimestampNotSyncedError(c *C) { }() count := 0 s.regionRequestSender.client = &fnClient{func(ctx context.Context, addr string, req *tikvrpc.Request, timeout time.Duration) (response *tikvrpc.Response, err error) { - count += 1 + count++ var resp *tikvrpc.Response if count < 3 { resp = &tikvrpc.Response{Resp: &kvrpcpb.PrewriteResponse{ diff --git a/store/tikv/safepoint.go b/store/tikv/safepoint.go index c6b119fd2af56..3aa8b5ece26e5 100644 --- a/store/tikv/safepoint.go +++ b/store/tikv/safepoint.go @@ -22,7 +22,7 @@ import ( "time" "github.com/pingcap/errors" - "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/store/tikv/logutil" "go.etcd.io/etcd/clientv3" "go.etcd.io/etcd/mvcc/mvccpb" "go.uber.org/zap" @@ -46,6 +46,7 @@ type SafePointKV interface { Put(k string, v string) error Get(k string) (string, error) GetWithPrefix(k string) ([]*mvccpb.KeyValue, error) + Close() error } // MockSafePointKV implements SafePointKV at mock test @@ -90,6 +91,11 @@ func (w *MockSafePointKV) GetWithPrefix(prefix string) ([]*mvccpb.KeyValue, erro return kvs, nil } +// Close implements the Close method for SafePointKV +func (w *MockSafePointKV) Close() error { + return nil +} + // EtcdSafePointKV implements SafePointKV at runtime type EtcdSafePointKV struct { cli *clientv3.Client @@ -140,6 +146,11 @@ func (w *EtcdSafePointKV) GetWithPrefix(k string) ([]*mvccpb.KeyValue, error) { return resp.Kvs, nil } +// Close implements the Close for SafePointKV +func (w *EtcdSafePointKV) Close() error { + return errors.Trace(w.cli.Close()) +} + func saveSafePoint(kv SafePointKV, t uint64) error { s := strconv.FormatUint(t, 10) err := kv.Put(GcSavedSafePoint, s) diff --git a/store/tikv/safepoint_test.go b/store/tikv/safepoint_test.go index e61a2c7ff20e6..b1cea4bf6e5bb 100644 --- a/store/tikv/safepoint_test.go +++ b/store/tikv/safepoint_test.go @@ -26,7 +26,7 @@ import ( type testSafePointSuite struct { OneByOneSuite - store *tikvStore + store *KVStore prefix string } @@ -34,7 +34,7 @@ var _ = Suite(&testSafePointSuite{}) func (s *testSafePointSuite) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) s.prefix = fmt.Sprintf("seek_%d", time.Now().Unix()) } @@ -44,10 +44,10 @@ func (s *testSafePointSuite) TearDownSuite(c *C) { s.OneByOneSuite.TearDownSuite(c) } -func (s *testSafePointSuite) beginTxn(c *C) *tikvTxn { +func (s *testSafePointSuite) beginTxn(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn } func mymakeKeys(rowNum int, prefix string) []kv.Key { @@ -113,7 +113,7 @@ func (s *testSafePointSuite) TestSafePoint(c *C) { s.waitUntilErrorPlugIn(txn4.startTS) - snapshot := newTiKVSnapshot(s.store, kv.Version{Ver: txn4.StartTS()}, 0) + snapshot := newTiKVSnapshot(s.store, txn4.StartTS(), 0) _, batchgeterr := snapshot.BatchGet(context.Background(), keys) c.Assert(batchgeterr, NotNil) isFallBehind = terror.ErrorEqual(errors.Cause(geterr2), ErrGCTooEarly) diff --git a/store/tikv/scan.go b/store/tikv/scan.go index 479e9a95b37c0..52b7317fcfc79 100644 --- a/store/tikv/scan.go +++ b/store/tikv/scan.go @@ -20,14 +20,14 @@ import ( "github.com/pingcap/errors" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) // Scanner support tikv scan type Scanner struct { - snapshot *tikvSnapshot + snapshot *KVSnapshot batchSize int cache []*pb.KvPair idx int @@ -42,7 +42,7 @@ type Scanner struct { eof bool } -func newScanner(snapshot *tikvSnapshot, startKey []byte, endKey []byte, batchSize int, reverse bool) (*Scanner, error) { +func newScanner(snapshot *KVSnapshot, startKey []byte, endKey []byte, batchSize int, reverse bool) (*Scanner, error) { // It must be > 1. Otherwise scanner won't skipFirst. if batchSize <= 1 { batchSize = scanBatchSize @@ -86,7 +86,7 @@ func (s *Scanner) Value() []byte { // Next return next element. func (s *Scanner) Next() error { - bo := NewBackofferWithVars(context.WithValue(context.Background(), txnStartKey, s.snapshot.version.Ver), scannerNextMaxBackoff, s.snapshot.vars) + bo := NewBackofferWithVars(context.WithValue(context.Background(), TxnStartKey, s.snapshot.version), scannerNextMaxBackoff, s.snapshot.vars) if !s.valid { return errors.New("scanner iterator is invalid") } @@ -140,7 +140,7 @@ func (s *Scanner) Close() { } func (s *Scanner) startTS() uint64 { - return s.snapshot.version.Ver + return s.snapshot.version } func (s *Scanner) resolveCurrentLock(bo *Backoffer, current *pb.KvPair) error { @@ -190,7 +190,7 @@ func (s *Scanner) getData(bo *Backoffer) error { Context: &pb.Context{ Priority: s.snapshot.priority, NotFillCache: s.snapshot.notFillCache, - IsolationLevel: pbIsolationLevel(s.snapshot.isolationLevel), + IsolationLevel: IsolationLevelToPB(s.snapshot.isolationLevel), }, StartKey: s.nextStartKey, EndKey: reqEndKey, @@ -204,11 +204,13 @@ func (s *Scanner) getData(bo *Backoffer) error { sreq.EndKey = reqStartKey sreq.Reverse = true } - req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdScan, sreq, s.snapshot.replicaRead, &s.snapshot.replicaReadSeed, pb.Context{ + s.snapshot.mu.RLock() + req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdScan, sreq, s.snapshot.mu.replicaRead, &s.snapshot.replicaReadSeed, pb.Context{ Priority: s.snapshot.priority, NotFillCache: s.snapshot.notFillCache, - TaskId: s.snapshot.taskID, + TaskId: s.snapshot.mu.taskID, }) + s.snapshot.mu.RUnlock() resp, err := sender.SendReq(bo, req, loc.Region, ReadTimeoutMedium) if err != nil { return errors.Trace(err) @@ -236,6 +238,26 @@ func (s *Scanner) getData(bo *Backoffer) error { return errors.Trace(err) } + // When there is a response-level key error, the returned pairs are incomplete. + // We should resolve the lock first and then retry the same request. + if keyErr := cmdScanResp.GetError(); keyErr != nil { + lock, err := extractLockFromKeyErr(keyErr) + if err != nil { + return errors.Trace(err) + } + msBeforeExpired, _, err := newLockResolver(s.snapshot.store).ResolveLocks(bo, s.snapshot.version, []*Lock{lock}) + if err != nil { + return errors.Trace(err) + } + if msBeforeExpired > 0 { + err = bo.BackoffWithMaxSleep(BoTxnLockFast, int(msBeforeExpired), errors.Errorf("key is locked during scanning")) + if err != nil { + return errors.Trace(err) + } + } + continue + } + kvPairs := cmdScanResp.Pairs // Check if kvPair contains error, it should be a Lock. for _, pair := range kvPairs { diff --git a/store/tikv/scan_mock_test.go b/store/tikv/scan_mock_test.go index f7f2628d63e61..4f184e5c556be 100644 --- a/store/tikv/scan_mock_test.go +++ b/store/tikv/scan_mock_test.go @@ -17,7 +17,6 @@ import ( "context" . "github.com/pingcap/check" - "github.com/pingcap/tidb/kv" ) type testScanMockSuite struct { @@ -27,7 +26,7 @@ type testScanMockSuite struct { var _ = Suite(&testScanMockSuite{}) func (s *testScanMockSuite) TestScanMultipleRegions(c *C) { - store := NewTestStore(c).(*tikvStore) + store := NewTestStore(c) defer store.Close() txn, err := store.Begin() @@ -41,7 +40,7 @@ func (s *testScanMockSuite) TestScanMultipleRegions(c *C) { txn, err = store.Begin() c.Assert(err, IsNil) - snapshot := newTiKVSnapshot(store, kv.Version{Ver: txn.StartTS()}, 0) + snapshot := newTiKVSnapshot(store, txn.StartTS(), 0) scanner, err := newScanner(snapshot, []byte("a"), nil, 10, false) c.Assert(err, IsNil) for ch := byte('a'); ch <= byte('z'); ch++ { @@ -60,7 +59,7 @@ func (s *testScanMockSuite) TestScanMultipleRegions(c *C) { } func (s *testScanMockSuite) TestReverseScan(c *C) { - store := NewTestStore(c).(*tikvStore) + store := NewTestStore(c) defer store.Close() txn, err := store.Begin() @@ -74,7 +73,7 @@ func (s *testScanMockSuite) TestReverseScan(c *C) { txn, err = store.Begin() c.Assert(err, IsNil) - snapshot := newTiKVSnapshot(store, kv.Version{Ver: txn.StartTS()}, 0) + snapshot := newTiKVSnapshot(store, txn.StartTS(), 0) scanner, err := newScanner(snapshot, nil, []byte("z"), 10, true) c.Assert(err, IsNil) for ch := byte('y'); ch >= byte('a'); ch-- { diff --git a/store/tikv/scan_test.go b/store/tikv/scan_test.go index 80806c8e8be59..ac48684427a77 100644 --- a/store/tikv/scan_test.go +++ b/store/tikv/scan_test.go @@ -20,16 +20,16 @@ import ( . "github.com/pingcap/check" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/tablecodec" - "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/rowcodec" "go.uber.org/zap" ) type testScanSuite struct { OneByOneSuite - store *tikvStore + store *KVStore recordPrefix []byte rowNums []int ctx context.Context @@ -39,11 +39,11 @@ var _ = SerialSuites(&testScanSuite{}) func (s *testScanSuite) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) s.recordPrefix = tablecodec.GenTableRecordPrefix(1) s.rowNums = append(s.rowNums, 1, scanBatchSize, scanBatchSize+1, scanBatchSize*3) // Avoid using async commit logic. - s.ctx = context.WithValue(context.Background(), sessionctx.ConnID, uint64(0)) + s.ctx = context.WithValue(context.Background(), util.SessionID, uint64(0)) } func (s *testScanSuite) TearDownSuite(c *C) { @@ -64,10 +64,10 @@ func (s *testScanSuite) TearDownSuite(c *C) { s.OneByOneSuite.TearDownSuite(c) } -func (s *testScanSuite) beginTxn(c *C) *tikvTxn { +func (s *testScanSuite) beginTxn(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn } func (s *testScanSuite) TestScan(c *C) { diff --git a/store/tikv/snapshot.go b/store/tikv/snapshot.go index 4c895e1c6e9d2..eba840db15190 100644 --- a/store/tikv/snapshot.go +++ b/store/tikv/snapshot.go @@ -29,42 +29,36 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/store/tikv/tikvrpc" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) -var ( - _ kv.Snapshot = (*tikvSnapshot)(nil) -) - const ( scanBatchSize = 256 batchGetSize = 5120 + maxTimestamp = math.MaxUint64 ) -var ( - tikvTxnRegionsNumHistogramWithSnapshot = metrics.TiKVTxnRegionsNumHistogram.WithLabelValues("snapshot") -) - -// tikvSnapshot implements the kv.Snapshot interface. -type tikvSnapshot struct { - store *tikvStore - version kv.Version +// KVSnapshot implements the kv.Snapshot interface. +type KVSnapshot struct { + store *KVStore + version uint64 isolationLevel kv.IsoLevel priority pb.CommandPri notFillCache bool syncLog bool keyOnly bool vars *kv.Variables - replicaRead kv.ReplicaReadType replicaReadSeed uint32 - taskID uint64 - minCommitTSPushed + resolvedLocks *util.TSSet // Cache the result of BatchGet. // The invariance is that calling BatchGet multiple times using the same start ts, @@ -75,50 +69,55 @@ type tikvSnapshot struct { // It's OK as long as there are no zero-byte values in the protocol. mu struct { sync.RWMutex - hitCnt int64 - cached map[string][]byte - stats *SnapshotRuntimeStats + hitCnt int64 + cached map[string][]byte + cachedSize int + stats *SnapshotRuntimeStats + replicaRead kv.ReplicaReadType + taskID uint64 + isStaleness bool + // MatchStoreLabels indicates the labels the store should be matched + matchStoreLabels []*metapb.StoreLabel } sampleStep uint32 + txnScope string } // newTiKVSnapshot creates a snapshot of an TiKV store. -func newTiKVSnapshot(store *tikvStore, ver kv.Version, replicaReadSeed uint32) *tikvSnapshot { +func newTiKVSnapshot(store *KVStore, ts uint64, replicaReadSeed uint32) *KVSnapshot { // Sanity check for snapshot version. - if ver.Ver >= math.MaxInt64 && ver.Ver != math.MaxUint64 { - err := errors.Errorf("try to get snapshot with a large ts %d", ver.Ver) + if ts >= math.MaxInt64 && ts != math.MaxUint64 { + err := errors.Errorf("try to get snapshot with a large ts %d", ts) panic(err) } - return &tikvSnapshot{ + return &KVSnapshot{ store: store, - version: ver, + version: ts, priority: pb.CommandPri_Normal, vars: kv.DefaultVars, replicaReadSeed: replicaReadSeed, - minCommitTSPushed: minCommitTSPushed{ - data: make(map[uint64]struct{}, 5), - }, + resolvedLocks: util.NewTSSet(5), } } -func (s *tikvSnapshot) setSnapshotTS(ts uint64) { +func (s *KVSnapshot) setSnapshotTS(ts uint64) { // Sanity check for snapshot version. if ts >= math.MaxInt64 && ts != math.MaxUint64 { err := errors.Errorf("try to get snapshot with a large ts %d", ts) panic(err) } // Invalidate cache if the snapshotTS change! - s.version.Ver = ts + s.version = ts s.mu.Lock() s.mu.cached = nil s.mu.Unlock() // And also the minCommitTS pushed information. - s.minCommitTSPushed.data = make(map[uint64]struct{}, 5) + s.resolvedLocks = util.NewTSSet(5) } // BatchGet gets all the keys' value from kv-server and returns a map contains key/value pairs. // The map will not contain nonexistent keys. -func (s *tikvSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { +func (s *KVSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { // Check the cached value first. m := make(map[string][]byte) s.mu.RLock() @@ -144,7 +143,7 @@ func (s *tikvSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string] // We want [][]byte instead of []kv.Key, use some magic to save memory. bytesKeys := *(*[][]byte)(unsafe.Pointer(&keys)) - ctx = context.WithValue(ctx, txnStartKey, s.version.Ver) + ctx = context.WithValue(ctx, TxnStartKey, s.version) bo := NewBackofferWithVars(ctx, batchGetMaxBackoff, s.vars) // Create a map to collect key-values from region servers. @@ -163,7 +162,7 @@ func (s *tikvSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string] return nil, errors.Trace(err) } - err = s.store.CheckVisibility(s.version.Ver) + err = s.store.CheckVisibility(s.version) if err != nil { return nil, errors.Trace(err) } @@ -174,7 +173,23 @@ func (s *tikvSnapshot) BatchGet(ctx context.Context, keys []kv.Key) (map[string] s.mu.cached = make(map[string][]byte, len(m)) } for _, key := range keys { - s.mu.cached[string(key)] = m[string(key)] + val := m[string(key)] + s.mu.cachedSize += len(key) + len(val) + s.mu.cached[string(key)] = val + } + + const cachedSizeLimit = 10 << 30 + if s.mu.cachedSize >= cachedSizeLimit { + for k, v := range s.mu.cached { + if _, needed := m[k]; needed { + continue + } + delete(s.mu.cached, k) + s.mu.cachedSize -= len(k) + len(v) + if s.mu.cachedSize < cachedSizeLimit { + break + } + } } s.mu.Unlock() @@ -203,16 +218,16 @@ func appendBatchKeysBySize(b []batchKeys, region RegionVerID, keys [][]byte, siz return b } -func (s *tikvSnapshot) batchGetKeysByRegions(bo *Backoffer, keys [][]byte, collectF func(k, v []byte)) error { +func (s *KVSnapshot) batchGetKeysByRegions(bo *Backoffer, keys [][]byte, collectF func(k, v []byte)) error { defer func(start time.Time) { - tikvTxnCmdHistogramWithBatchGet.Observe(time.Since(start).Seconds()) + metrics.TxnCmdHistogramWithBatchGet.Observe(time.Since(start).Seconds()) }(time.Now()) groups, _, err := s.store.regionCache.GroupKeysByRegion(bo, keys, nil) if err != nil { return errors.Trace(err) } - tikvTxnRegionsNumHistogramWithSnapshot.Observe(float64(len(groups))) + metrics.TxnRegionsNumHistogramWithSnapshot.Observe(float64(len(groups))) var batches []batchKeys for id, g := range groups { @@ -238,39 +253,48 @@ func (s *tikvSnapshot) batchGetKeysByRegions(bo *Backoffer, keys [][]byte, colle if e := <-ch; e != nil { logutil.BgLogger().Debug("snapshot batchGet failed", zap.Error(e), - zap.Uint64("txnStartTS", s.version.Ver)) + zap.Uint64("txnStartTS", s.version)) err = e } } return errors.Trace(err) } -func (s *tikvSnapshot) batchGetSingleRegion(bo *Backoffer, batch batchKeys, collectF func(k, v []byte)) error { - cli := clientHelper{ - LockResolver: s.store.lockResolver, - RegionCache: s.store.regionCache, - minCommitTSPushed: &s.minCommitTSPushed, - Client: s.store.client, - } +func (s *KVSnapshot) batchGetSingleRegion(bo *Backoffer, batch batchKeys, collectF func(k, v []byte)) error { + cli := NewClientHelper(s.store, s.resolvedLocks) + s.mu.RLock() if s.mu.stats != nil { cli.Stats = make(map[tikvrpc.CmdType]*RPCRuntimeStats) defer func() { s.mergeRegionRequestStats(cli.Stats) }() } + s.mu.RUnlock() pending := batch.keys for { + isStaleness := false + var matchStoreLabels []*metapb.StoreLabel + s.mu.RLock() req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdBatchGet, &pb.BatchGetRequest{ Keys: pending, - Version: s.version.Ver, - }, s.replicaRead, &s.replicaReadSeed, pb.Context{ + Version: s.version, + }, s.mu.replicaRead, &s.replicaReadSeed, pb.Context{ Priority: s.priority, NotFillCache: s.notFillCache, - TaskId: s.taskID, + TaskId: s.mu.taskID, }) - - resp, _, _, err := cli.SendReqCtx(bo, req, batch.region, ReadTimeoutMedium, kv.TiKV, "") + isStaleness = s.mu.isStaleness + matchStoreLabels = s.mu.matchStoreLabels + s.mu.RUnlock() + var ops []StoreSelectorOption + if isStaleness { + req.EnableStaleRead() + } + if len(matchStoreLabels) > 0 { + ops = append(ops, WithMatchLabels(matchStoreLabels)) + } + resp, _, _, err := cli.SendReqCtx(bo, req, batch.region, ReadTimeoutMedium, kv.TiKV, "", ops...) if err != nil { return errors.Trace(err) @@ -295,31 +319,48 @@ func (s *tikvSnapshot) batchGetSingleRegion(bo *Backoffer, batch batchKeys, coll lockedKeys [][]byte locks []*Lock ) - for _, pair := range batchGetResp.Pairs { - keyErr := pair.GetError() - if keyErr == nil { - collectF(pair.GetKey(), pair.GetValue()) - continue - } + if keyErr := batchGetResp.GetError(); keyErr != nil { + // If a response-level error happens, skip reading pairs. lock, err := extractLockFromKeyErr(keyErr) if err != nil { return errors.Trace(err) } lockedKeys = append(lockedKeys, lock.Key) locks = append(locks, lock) + } else { + for _, pair := range batchGetResp.Pairs { + keyErr := pair.GetError() + if keyErr == nil { + collectF(pair.GetKey(), pair.GetValue()) + continue + } + lock, err := extractLockFromKeyErr(keyErr) + if err != nil { + return errors.Trace(err) + } + lockedKeys = append(lockedKeys, lock.Key) + locks = append(locks, lock) + } + } + if batchGetResp.ExecDetailsV2 != nil { + s.mergeExecDetail(batchGetResp.ExecDetailsV2) } if len(lockedKeys) > 0 { - msBeforeExpired, err := cli.ResolveLocks(bo, s.version.Ver, locks) + msBeforeExpired, err := cli.ResolveLocks(bo, s.version, locks) if err != nil { return errors.Trace(err) } if msBeforeExpired > 0 { - err = bo.BackoffWithMaxSleep(boTxnLockFast, int(msBeforeExpired), errors.Errorf("batchGet lockedKeys: %d", len(lockedKeys))) + err = bo.BackoffWithMaxSleep(BoTxnLockFast, int(msBeforeExpired), errors.Errorf("batchGet lockedKeys: %d", len(lockedKeys))) if err != nil { return errors.Trace(err) } } - pending = lockedKeys + // Only reduce pending keys when there is no response-level error. Otherwise, + // lockedKeys may be incomplete. + if batchGetResp.GetError() == nil { + pending = lockedKeys + } continue } return nil @@ -327,20 +368,20 @@ func (s *tikvSnapshot) batchGetSingleRegion(bo *Backoffer, batch batchKeys, coll } // Get gets the value for key k from snapshot. -func (s *tikvSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { +func (s *KVSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { defer func(start time.Time) { - tikvTxnCmdHistogramWithGet.Observe(time.Since(start).Seconds()) + metrics.TxnCmdHistogramWithGet.Observe(time.Since(start).Seconds()) }(time.Now()) - ctx = context.WithValue(ctx, txnStartKey, s.version.Ver) + ctx = context.WithValue(ctx, TxnStartKey, s.version) bo := NewBackofferWithVars(ctx, getMaxBackoff, s.vars) val, err := s.get(ctx, bo, k) s.recordBackoffInfo(bo) if err != nil { return nil, errors.Trace(err) } - err = s.store.CheckVisibility(s.version.Ver) + err = s.store.CheckVisibility(s.version) if err != nil { return nil, errors.Trace(err) } @@ -351,7 +392,7 @@ func (s *tikvSnapshot) Get(ctx context.Context, k kv.Key) ([]byte, error) { return val, nil } -func (s *tikvSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte, error) { +func (s *KVSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte, error) { // Check the cached values first. s.mu.RLock() if s.mu.cached != nil { @@ -373,35 +414,50 @@ func (s *tikvSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte } }) - cli := clientHelper{ - LockResolver: s.store.lockResolver, - RegionCache: s.store.regionCache, - minCommitTSPushed: &s.minCommitTSPushed, - Client: s.store.client, - resolveLite: true, + cli := NewClientHelper(s.store, s.resolvedLocks) + + // Secondary locks or async commit locks cannot be ignored when getting using the max version. + // So we concurrently get a TS from PD and use it in retries to avoid unnecessary blocking. + var tsFuture oracle.Future + if s.version == maxTimestamp { + tsFuture = s.store.oracle.GetTimestampAsync(ctx, &oracle.Option{TxnScope: s.txnScope}) } + failpoint.Inject("snapshotGetTSAsync", nil) + + isStaleness := false + var matchStoreLabels []*metapb.StoreLabel + s.mu.RLock() if s.mu.stats != nil { cli.Stats = make(map[tikvrpc.CmdType]*RPCRuntimeStats) defer func() { s.mergeRegionRequestStats(cli.Stats) }() } - req := tikvrpc.NewReplicaReadRequest(tikvrpc.CmdGet, &pb.GetRequest{ Key: k, - Version: s.version.Ver, - }, s.replicaRead, &s.replicaReadSeed, pb.Context{ + Version: s.version, + }, s.mu.replicaRead, &s.replicaReadSeed, pb.Context{ Priority: s.priority, NotFillCache: s.notFillCache, - TaskId: s.taskID, + TaskId: s.mu.taskID, }) + isStaleness = s.mu.isStaleness + matchStoreLabels = s.mu.matchStoreLabels + s.mu.RUnlock() + var ops []StoreSelectorOption + if isStaleness { + req.EnableStaleRead() + } + if len(matchStoreLabels) > 0 { + ops = append(ops, WithMatchLabels(matchStoreLabels)) + } for { loc, err := s.store.regionCache.LocateKey(bo, k) if err != nil { return nil, errors.Trace(err) } - resp, _, _, err := cli.SendReqCtx(bo, req, loc.Region, readTimeoutShort, kv.TiKV, "") + resp, _, _, err := cli.SendReqCtx(bo, req, loc.Region, readTimeoutShort, kv.TiKV, "", ops...) if err != nil { return nil, errors.Trace(err) } @@ -420,18 +476,39 @@ func (s *tikvSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte return nil, errors.Trace(ErrBodyMissing) } cmdGetResp := resp.Resp.(*pb.GetResponse) + if cmdGetResp.ExecDetailsV2 != nil { + s.mergeExecDetail(cmdGetResp.ExecDetailsV2) + } val := cmdGetResp.GetValue() if keyErr := cmdGetResp.GetError(); keyErr != nil { lock, err := extractLockFromKeyErr(keyErr) if err != nil { return nil, errors.Trace(err) } - msBeforeExpired, err := cli.ResolveLocks(bo, s.version.Ver, []*Lock{lock}) + + snapVer := s.version + if s.version == maxTimestamp { + newTS, err := tsFuture.Wait() + if err != nil { + return nil, errors.Trace(err) + } + s.version = newTS + req.Req.(*pb.GetRequest).Version = newTS + // skip lock resolving and backoff if the lock does not block the read + if newTS < lock.TxnID || newTS < lock.MinCommitTS { + continue + } + } + + // Use the original snapshot version to resolve locks so we can use MaxUint64 + // as the callerStartTS if it's an auto-commit point get. This could save us + // one write at TiKV by not pushing forward the minCommitTS. + msBeforeExpired, err := cli.ResolveLocks(bo, snapVer, []*Lock{lock}) if err != nil { return nil, errors.Trace(err) } if msBeforeExpired > 0 { - err = bo.BackoffWithMaxSleep(boTxnLockFast, int(msBeforeExpired), errors.New(keyErr.String())) + err = bo.BackoffWithMaxSleep(BoTxnLockFast, int(msBeforeExpired), errors.New(keyErr.String())) if err != nil { return nil, errors.Trace(err) } @@ -442,26 +519,42 @@ func (s *tikvSnapshot) get(ctx context.Context, bo *Backoffer, k kv.Key) ([]byte } } +func (s *KVSnapshot) mergeExecDetail(detail *pb.ExecDetailsV2) { + s.mu.Lock() + defer s.mu.Unlock() + if detail == nil || s.mu.stats == nil { + return + } + if s.mu.stats.scanDetail == nil { + s.mu.stats.scanDetail = &execdetails.ScanDetail{} + } + if s.mu.stats.timeDetail == nil { + s.mu.stats.timeDetail = &execdetails.TimeDetail{} + } + s.mu.stats.scanDetail.MergeFromScanDetailV2(detail.ScanDetailV2) + s.mu.stats.timeDetail.MergeFromTimeDetail(detail.TimeDetail) +} + // Iter return a list of key-value pair after `k`. -func (s *tikvSnapshot) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) { +func (s *KVSnapshot) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) { scanner, err := newScanner(s, k, upperBound, scanBatchSize, false) return scanner, errors.Trace(err) } // IterReverse creates a reversed Iterator positioned on the first entry which key is less than k. -func (s *tikvSnapshot) IterReverse(k kv.Key) (kv.Iterator, error) { +func (s *KVSnapshot) IterReverse(k kv.Key) (kv.Iterator, error) { scanner, err := newScanner(s, nil, k, scanBatchSize, true) return scanner, errors.Trace(err) } // SetOption sets an option with a value, when val is nil, uses the default // value of this option. Only ReplicaRead is supported for snapshot -func (s *tikvSnapshot) SetOption(opt kv.Option, val interface{}) { +func (s *KVSnapshot) SetOption(opt kv.Option, val interface{}) { switch opt { case kv.IsolationLevel: s.isolationLevel = val.(kv.IsoLevel) case kv.Priority: - s.priority = kvPriorityToCommandPri(val.(int)) + s.priority = PriorityToPB(val.(int)) case kv.NotFillCache: s.notFillCache = val.(bool) case kv.SyncLog: @@ -471,23 +564,39 @@ func (s *tikvSnapshot) SetOption(opt kv.Option, val interface{}) { case kv.SnapshotTS: s.setSnapshotTS(val.(uint64)) case kv.ReplicaRead: - s.replicaRead = val.(kv.ReplicaReadType) + s.mu.Lock() + s.mu.replicaRead = val.(kv.ReplicaReadType) + s.mu.Unlock() case kv.TaskID: - s.taskID = val.(uint64) + s.mu.Lock() + s.mu.taskID = val.(uint64) + s.mu.Unlock() case kv.CollectRuntimeStats: s.mu.Lock() s.mu.stats = val.(*SnapshotRuntimeStats) s.mu.Unlock() case kv.SampleStep: s.sampleStep = val.(uint32) + case kv.IsStalenessReadOnly: + s.mu.Lock() + s.mu.isStaleness = val.(bool) + s.mu.Unlock() + case kv.MatchStoreLabels: + s.mu.Lock() + s.mu.matchStoreLabels = val.([]*metapb.StoreLabel) + s.mu.Unlock() + case kv.TxnScope: + s.txnScope = val.(string) } } -// ClearFollowerRead disables follower read on current transaction -func (s *tikvSnapshot) DelOption(opt kv.Option) { +// DelOption deletes an option. +func (s *KVSnapshot) DelOption(opt kv.Option) { switch opt { case kv.ReplicaRead: - s.replicaRead = kv.ReplicaReadLeader + s.mu.Lock() + s.mu.replicaRead = kv.ReplicaReadLeader + s.mu.Unlock() case kv.CollectRuntimeStats: s.mu.Lock() s.mu.stats = nil @@ -495,24 +604,16 @@ func (s *tikvSnapshot) DelOption(opt kv.Option) { } } -// SnapCacheHitCount gets the snapshot cache hit count. -func SnapCacheHitCount(snap kv.Snapshot) int { - tikvSnap, ok := snap.(*tikvSnapshot) - if !ok { - return 0 - } - return int(atomic.LoadInt64(&tikvSnap.mu.hitCnt)) +// SnapCacheHitCount gets the snapshot cache hit count. Only for test. +func (s *KVSnapshot) SnapCacheHitCount() int { + return int(atomic.LoadInt64(&s.mu.hitCnt)) } -// SnapCacheSize gets the snapshot cache size. -func SnapCacheSize(snap kv.Snapshot) int { - tikvSnap, ok := snap.(*tikvSnapshot) - if !ok { - return 0 - } - tikvSnap.mu.RLock() - defer tikvSnap.mu.RLock() - return len(tikvSnap.mu.cached) +// SnapCacheSize gets the snapshot cache size. Only for test. +func (s *KVSnapshot) SnapCacheSize() int { + s.mu.RLock() + defer s.mu.RLock() + return len(s.mu.cached) } func extractLockFromKeyErr(keyErr *pb.KeyError) (*Lock, error) { @@ -523,12 +624,12 @@ func extractLockFromKeyErr(keyErr *pb.KeyError) (*Lock, error) { } func extractKeyErr(keyErr *pb.KeyError) error { - failpoint.Inject("ErrMockRetryableOnly", func(val failpoint.Value) { + if val, err := MockRetryableErrorResp.Eval(); err == nil { if val.(bool) { keyErr.Conflict = nil keyErr.Retryable = "mock retryable error" } - }) + } if keyErr.Conflict != nil { return newWriteConflictError(keyErr.Conflict) @@ -542,6 +643,15 @@ func extractKeyErr(keyErr *pb.KeyError) error { logutil.BgLogger().Warn("2PC failed", zap.Error(err)) return errors.Trace(err) } + if keyErr.CommitTsTooLarge != nil { + err := errors.Errorf("commit TS %v is too large", keyErr.CommitTsTooLarge.CommitTs) + logutil.BgLogger().Warn("2PC failed", zap.Error(err)) + return errors.Trace(err) + } + if keyErr.TxnNotFound != nil { + err := errors.Errorf("txn %d not found", keyErr.TxnNotFound.StartTs) + return errors.Trace(err) + } return errors.Errorf("unexpected KeyError: %s", keyErr.String()) } @@ -618,10 +728,13 @@ func prettyWriteKey(buf *bytes.Buffer, key []byte) { } } -func (s *tikvSnapshot) recordBackoffInfo(bo *Backoffer) { +func (s *KVSnapshot) recordBackoffInfo(bo *Backoffer) { + s.mu.RLock() if s.mu.stats == nil || bo.totalSleep == 0 { + s.mu.RUnlock() return } + s.mu.RUnlock() s.mu.Lock() defer s.mu.Unlock() if s.mu.stats == nil { @@ -640,7 +753,7 @@ func (s *tikvSnapshot) recordBackoffInfo(bo *Backoffer) { } } -func (s *tikvSnapshot) mergeRegionRequestStats(stats map[tikvrpc.CmdType]*RPCRuntimeStats) { +func (s *KVSnapshot) mergeRegionRequestStats(stats map[tikvrpc.CmdType]*RPCRuntimeStats) { s.mu.Lock() defer s.mu.Unlock() if s.mu.stats == nil { @@ -664,8 +777,10 @@ func (s *tikvSnapshot) mergeRegionRequestStats(stats map[tikvrpc.CmdType]*RPCRun // SnapshotRuntimeStats records the runtime stats of snapshot. type SnapshotRuntimeStats struct { rpcStats RegionRequestRuntimeStats - backoffSleepMS map[backoffType]int - backoffTimes map[backoffType]int + backoffSleepMS map[BackoffType]int + backoffTimes map[BackoffType]int + scanDetail *execdetails.ScanDetail + timeDetail *execdetails.TimeDetail } // Tp implements the RuntimeStats interface. @@ -682,8 +797,8 @@ func (rs *SnapshotRuntimeStats) Clone() execdetails.RuntimeStats { } } if len(rs.backoffSleepMS) > 0 { - newRs.backoffSleepMS = make(map[backoffType]int) - newRs.backoffTimes = make(map[backoffType]int) + newRs.backoffSleepMS = make(map[BackoffType]int) + newRs.backoffTimes = make(map[BackoffType]int) for k, v := range rs.backoffSleepMS { newRs.backoffSleepMS[k] += v } @@ -708,10 +823,10 @@ func (rs *SnapshotRuntimeStats) Merge(other execdetails.RuntimeStats) { } if len(tmp.backoffSleepMS) > 0 { if rs.backoffSleepMS == nil { - rs.backoffSleepMS = make(map[backoffType]int) + rs.backoffSleepMS = make(map[BackoffType]int) } if rs.backoffTimes == nil { - rs.backoffTimes = make(map[backoffType]int) + rs.backoffTimes = make(map[BackoffType]int) } for k, v := range tmp.backoffSleepMS { rs.backoffSleepMS[k] += v @@ -731,7 +846,18 @@ func (rs *SnapshotRuntimeStats) String() string { buf.WriteByte(',') } ms := rs.backoffSleepMS[k] - buf.WriteString(fmt.Sprintf("%s_backoff:{num:%d, total_time:%d ms}", k.String(), v, ms)) + d := time.Duration(ms) * time.Millisecond + buf.WriteString(fmt.Sprintf("%s_backoff:{num:%d, total_time:%s}", k.String(), v, execdetails.FormatDuration(d))) + } + timeDetail := rs.timeDetail.String() + if timeDetail != "" { + buf.WriteString(", ") + buf.WriteString(timeDetail) + } + scanDetail := rs.scanDetail.String() + if scanDetail != "" { + buf.WriteString(", ") + buf.WriteString(scanDetail) } return buf.String() } diff --git a/store/tikv/snapshot_fail_test.go b/store/tikv/snapshot_fail_test.go new file mode 100644 index 0000000000000..dba9942f5367c --- /dev/null +++ b/store/tikv/snapshot_fail_test.go @@ -0,0 +1,216 @@ +// Copyright 2016 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "context" + "sync/atomic" + "time" + + . "github.com/pingcap/check" + "github.com/pingcap/failpoint" + "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/mockstore/unistore" +) + +type testSnapshotFailSuite struct { + OneByOneSuite + store *KVStore +} + +var _ = SerialSuites(&testSnapshotFailSuite{}) + +func (s *testSnapshotFailSuite) SetUpSuite(c *C) { + s.OneByOneSuite.SetUpSuite(c) + client, pdClient, cluster, err := unistore.New("") + c.Assert(err, IsNil) + unistore.BootstrapWithSingleStore(cluster) + store, err := NewTestTiKVStore(client, pdClient, nil, nil, 0) + c.Assert(err, IsNil) + s.store = store +} + +func (s *testSnapshotFailSuite) TearDownSuite(c *C) { + s.OneByOneSuite.TearDownSuite(c) +} + +func (s *testSnapshotFailSuite) cleanup(c *C) { + txn, err := s.store.Begin() + c.Assert(err, IsNil) + iter, err := txn.Iter(kv.Key(""), kv.Key("")) + c.Assert(err, IsNil) + for iter.Valid() { + err = txn.Delete(iter.Key()) + c.Assert(err, IsNil) + err = iter.Next() + c.Assert(err, IsNil) + } + c.Assert(txn.Commit(context.TODO()), IsNil) +} + +func (s *testSnapshotFailSuite) TestBatchGetResponseKeyError(c *C) { + // Meaningless to test with tikv because it has a mock key error + if *WithTiKV { + return + } + defer s.cleanup(c) + + // Put two KV pairs + txn, err := s.store.Begin() + c.Assert(err, IsNil) + err = txn.Set([]byte("k1"), []byte("v1")) + c.Assert(err, IsNil) + err = txn.Set([]byte("k2"), []byte("v2")) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcBatchGetResult", `1*return("keyError")`), IsNil) + defer func() { + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcBatchGetResult"), IsNil) + }() + + txn, err = s.store.Begin() + c.Assert(err, IsNil) + res, err := txn.BatchGet(context.Background(), []kv.Key{[]byte("k1"), []byte("k2")}) + c.Assert(err, IsNil) + c.Assert(res, DeepEquals, map[string][]byte{"k1": []byte("v1"), "k2": []byte("v2")}) +} + +func (s *testSnapshotFailSuite) TestScanResponseKeyError(c *C) { + // Meaningless to test with tikv because it has a mock key error + if *WithTiKV { + return + } + defer s.cleanup(c) + + // Put two KV pairs + txn, err := s.store.Begin() + c.Assert(err, IsNil) + err = txn.Set([]byte("k1"), []byte("v1")) + c.Assert(err, IsNil) + err = txn.Set([]byte("k2"), []byte("v2")) + c.Assert(err, IsNil) + err = txn.Set([]byte("k3"), []byte("v3")) + c.Assert(err, IsNil) + err = txn.Commit(context.Background()) + c.Assert(err, IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcScanResult", `1*return("keyError")`), IsNil) + txn, err = s.store.Begin() + c.Assert(err, IsNil) + iter, err := txn.Iter([]byte("a"), []byte("z")) + c.Assert(err, IsNil) + c.Assert(iter.Key(), DeepEquals, kv.Key("k1")) + c.Assert(iter.Value(), DeepEquals, []byte("v1")) + c.Assert(iter.Next(), IsNil) + c.Assert(iter.Key(), DeepEquals, kv.Key("k2")) + c.Assert(iter.Value(), DeepEquals, []byte("v2")) + c.Assert(iter.Next(), IsNil) + c.Assert(iter.Key(), DeepEquals, kv.Key("k3")) + c.Assert(iter.Value(), DeepEquals, []byte("v3")) + c.Assert(iter.Next(), IsNil) + c.Assert(iter.Valid(), IsFalse) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcScanResult"), IsNil) + + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/mockstore/unistore/rpcScanResult", `1*return("keyError")`), IsNil) + txn, err = s.store.Begin() + c.Assert(err, IsNil) + iter, err = txn.Iter([]byte("k2"), []byte("k4")) + c.Assert(err, IsNil) + c.Assert(iter.Key(), DeepEquals, kv.Key("k2")) + c.Assert(iter.Value(), DeepEquals, []byte("v2")) + c.Assert(iter.Next(), IsNil) + c.Assert(iter.Key(), DeepEquals, kv.Key("k3")) + c.Assert(iter.Value(), DeepEquals, []byte("v3")) + c.Assert(iter.Next(), IsNil) + c.Assert(iter.Valid(), IsFalse) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/mockstore/unistore/rpcScanResult"), IsNil) +} + +func (s *testSnapshotFailSuite) TestRetryPointGetWithTS(c *C) { + defer s.cleanup(c) + + snapshot := s.store.GetSnapshot(maxTimestamp) + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/snapshotGetTSAsync", `pause`), IsNil) + ch := make(chan error) + go func() { + _, err := snapshot.Get(context.Background(), []byte("k4")) + ch <- err + }() + + txn, err := s.store.Begin() + c.Assert(err, IsNil) + err = txn.Set([]byte("k4"), []byte("v4")) + c.Assert(err, IsNil) + txn.SetOption(kv.EnableAsyncCommit, true) + txn.SetOption(kv.Enable1PC, false) + txn.SetOption(kv.GuaranteeLinearizability, false) + // Prewrite an async-commit lock and do not commit it. + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing", `return`), IsNil) + committer, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(err, IsNil) + // Sets its minCommitTS to one second later, so the lock will be ignored by point get. + committer.minCommitTS = committer.startTS + (1000 << 18) + err = committer.execute(context.Background()) + c.Assert(err, IsNil) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/snapshotGetTSAsync"), IsNil) + + err = <-ch + c.Assert(err, ErrorMatches, ".*key not exist") + + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/asyncCommitDoNothing"), IsNil) +} + +func (s *testSnapshotFailSuite) TestRetryPointGetResolveTS(c *C) { + defer s.cleanup(c) + + txn, err := s.store.Begin() + c.Assert(err, IsNil) + err = txn.Set([]byte("k1"), []byte("v1")) + err = txn.Set([]byte("k2"), []byte("v2")) + c.Assert(err, IsNil) + txn.SetOption(kv.EnableAsyncCommit, false) + txn.SetOption(kv.Enable1PC, false) + txn.SetOption(kv.GuaranteeLinearizability, false) + + // Prewrite the lock without committing it + c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/beforeCommit", `pause`), IsNil) + ch := make(chan struct{}) + committer, err := newTwoPhaseCommitterWithInit(txn, 1) + c.Assert(committer.primary(), DeepEquals, []byte("k1")) + go func() { + c.Assert(err, IsNil) + err = committer.execute(context.Background()) + c.Assert(err, IsNil) + ch <- struct{}{} + }() + + // Wait until prewrite finishes + time.Sleep(200 * time.Millisecond) + // Should get nothing with max version, and **not pushing forward minCommitTS** of the primary lock + snapshot := s.store.GetSnapshot(maxTimestamp) + _, err = snapshot.Get(context.Background(), []byte("k2")) + c.Assert(err, ErrorMatches, ".*key not exist") + + initialCommitTS := atomic.LoadUint64(&committer.commitTS) + c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/beforeCommit"), IsNil) + + <-ch + // check the minCommitTS is not pushed forward + snapshot = s.store.GetSnapshot(initialCommitTS) + v, err := snapshot.Get(context.Background(), []byte("k2")) + c.Assert(err, IsNil) + c.Assert(v, DeepEquals, []byte("v2")) +} diff --git a/store/tikv/snapshot_test.go b/store/tikv/snapshot_test.go index 9f5697ef1cee3..4e0b9a3f5bc3a 100644 --- a/store/tikv/snapshot_test.go +++ b/store/tikv/snapshot_test.go @@ -24,14 +24,14 @@ import ( "github.com/pingcap/failpoint" pb "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) type testSnapshotSuite struct { OneByOneSuite - store *tikvStore + store *KVStore prefix string rowNums []int } @@ -40,7 +40,7 @@ var _ = Suite(&testSnapshotSuite{}) func (s *testSnapshotSuite) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) s.prefix = fmt.Sprintf("snapshot_%d", time.Now().Unix()) s.rowNums = append(s.rowNums, 1, 100, 191) } @@ -63,15 +63,15 @@ func (s *testSnapshotSuite) TearDownSuite(c *C) { s.OneByOneSuite.TearDownSuite(c) } -func (s *testSnapshotSuite) beginTxn(c *C) *tikvTxn { +func (s *testSnapshotSuite) beginTxn(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn } func (s *testSnapshotSuite) checkAll(keys []kv.Key, c *C) { txn := s.beginTxn(c) - snapshot := newTiKVSnapshot(s.store, kv.Version{Ver: txn.StartTS()}, 0) + snapshot := newTiKVSnapshot(s.store, txn.StartTS(), 0) m, err := snapshot.BatchGet(context.Background(), keys) c.Assert(err, IsNil) @@ -130,7 +130,7 @@ func (s *testSnapshotSuite) TestSnapshotCache(c *C) { c.Assert(txn.Commit(context.Background()), IsNil) txn = s.beginTxn(c) - snapshot := newTiKVSnapshot(s.store, kv.Version{Ver: txn.StartTS()}, 0) + snapshot := newTiKVSnapshot(s.store, txn.StartTS(), 0) _, err := snapshot.BatchGet(context.Background(), []kv.Key{kv.Key("x"), kv.Key("y")}) c.Assert(err, IsNil) @@ -256,7 +256,7 @@ func (s *testSnapshotSuite) TestPointGetSkipTxnLock(c *C) { committer.lockTTL = 3000 c.Assert(committer.prewriteMutations(bo, committer.mutations), IsNil) - snapshot := newTiKVSnapshot(s.store, kv.MaxVersion, 0) + snapshot := newTiKVSnapshot(s.store, maxTimestamp, 0) start := time.Now() c.Assert(committer.primary(), BytesEquals, []byte(x)) // Point get secondary key. Shouldn't be blocked by the lock and read old data. @@ -268,7 +268,7 @@ func (s *testSnapshotSuite) TestPointGetSkipTxnLock(c *C) { committer.commitTS = txn.StartTS() + 1 committer.commitMutations(bo, committer.mutationsOfKeys([][]byte{committer.primary()})) - snapshot = newTiKVSnapshot(s.store, kv.MaxVersion, 0) + snapshot = newTiKVSnapshot(s.store, maxTimestamp, 0) start = time.Now() // Point get secondary key. Should read committed data. value, err := snapshot.Get(ctx, y) @@ -285,7 +285,7 @@ func (s *testSnapshotSuite) TestSnapshotThreadSafe(c *C) { err := txn.Commit(context.Background()) c.Assert(err, IsNil) - snapshot := newTiKVSnapshot(s.store, kv.MaxVersion, 0) + snapshot := newTiKVSnapshot(s.store, maxTimestamp, 0) var wg sync.WaitGroup wg.Add(5) for i := 0; i < 5; i++ { @@ -304,17 +304,50 @@ func (s *testSnapshotSuite) TestSnapshotThreadSafe(c *C) { func (s *testSnapshotSuite) TestSnapshotRuntimeStats(c *C) { reqStats := NewRegionRequestRuntimeStats() - recordRegionRequestRuntimeStats(reqStats.Stats, tikvrpc.CmdGet, time.Second) - recordRegionRequestRuntimeStats(reqStats.Stats, tikvrpc.CmdGet, time.Millisecond) - snapshot := newTiKVSnapshot(s.store, kv.Version{Ver: 0}, 0) + RecordRegionRequestRuntimeStats(reqStats.Stats, tikvrpc.CmdGet, time.Second) + RecordRegionRequestRuntimeStats(reqStats.Stats, tikvrpc.CmdGet, time.Millisecond) + snapshot := newTiKVSnapshot(s.store, 0, 0) snapshot.SetOption(kv.CollectRuntimeStats, &SnapshotRuntimeStats{}) snapshot.mergeRegionRequestStats(reqStats.Stats) snapshot.mergeRegionRequestStats(reqStats.Stats) bo := NewBackofferWithVars(context.Background(), 2000, nil) - err := bo.BackoffWithMaxSleep(boTxnLockFast, 30, errors.New("test")) + err := bo.BackoffWithMaxSleep(BoTxnLockFast, 30, errors.New("test")) c.Assert(err, IsNil) snapshot.recordBackoffInfo(bo) snapshot.recordBackoffInfo(bo) - expect := "Get:{num_rpc:4, total_time:2.002s},txnLockFast_backoff:{num:2, total_time:60 ms}" + expect := "Get:{num_rpc:4, total_time:2s},txnLockFast_backoff:{num:2, total_time:60ms}" + c.Assert(snapshot.mu.stats.String(), Equals, expect) + detail := &pb.ExecDetailsV2{ + TimeDetail: &pb.TimeDetail{ + WaitWallTimeMs: 100, + ProcessWallTimeMs: 100, + }, + ScanDetailV2: &pb.ScanDetailV2{ + ProcessedVersions: 10, + TotalVersions: 15, + RocksdbBlockReadCount: 20, + RocksdbBlockReadByte: 15, + RocksdbDeleteSkippedCount: 5, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 10, + }, + } + snapshot.mergeExecDetail(detail) + expect = "Get:{num_rpc:4, total_time:2s},txnLockFast_backoff:{num:2, total_time:60ms}, " + + "total_process_time: 100ms, total_wait_time: 100ms, " + + "scan_detail: {total_process_keys: 10, " + + "total_keys: 15, " + + "rocksdb: {delete_skipped_count: 5, " + + "key_skipped_count: 1, " + + "block: {cache_hit_count: 10, read_count: 20, read_byte: 15 Bytes}}}" + c.Assert(snapshot.mu.stats.String(), Equals, expect) + snapshot.mergeExecDetail(detail) + expect = "Get:{num_rpc:4, total_time:2s},txnLockFast_backoff:{num:2, total_time:60ms}, " + + "total_process_time: 200ms, total_wait_time: 200ms, " + + "scan_detail: {total_process_keys: 20, " + + "total_keys: 30, " + + "rocksdb: {delete_skipped_count: 10, " + + "key_skipped_count: 2, " + + "block: {cache_hit_count: 20, read_count: 40, read_byte: 30 Bytes}}}" c.Assert(snapshot.mu.stats.String(), Equals, expect) } diff --git a/store/tikv/split_region.go b/store/tikv/split_region.go index 6092bc6d48399..0357e55a26a4a 100644 --- a/store/tikv/split_region.go +++ b/store/tikv/split_region.go @@ -21,15 +21,13 @@ import ( "sync/atomic" "github.com/pingcap/errors" - "github.com/pingcap/failpoint" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/store/tikv/logutil" "github.com/pingcap/tidb/store/tikv/tikvrpc" - "github.com/pingcap/tidb/util" - "github.com/pingcap/tidb/util/logutil" - "github.com/pingcap/tidb/util/stringutil" + "github.com/pingcap/tidb/store/tikv/util" pd "github.com/tikv/pd/client" "go.uber.org/zap" ) @@ -40,7 +38,7 @@ func equalRegionStartKey(key, regionStartKey []byte) bool { return bytes.Equal(key, regionStartKey) } -func (s *tikvStore) splitBatchRegionsReq(bo *Backoffer, keys [][]byte, scatter bool, tableID *int64) (*tikvrpc.Response, error) { +func (s *KVStore) splitBatchRegionsReq(bo *Backoffer, keys [][]byte, scatter bool, tableID *int64) (*tikvrpc.Response, error) { // equalRegionStartKey is used to filter split keys. // If the split key is equal to the start key of the region, then the key has been split, we need to skip the split key. groups, _, err := s.regionCache.GroupKeysByRegion(bo, keys, equalRegionStartKey) @@ -108,14 +106,14 @@ func (s *tikvStore) splitBatchRegionsReq(bo *Backoffer, keys [][]byte, scatter b return &tikvrpc.Response{Resp: srResp}, errors.Trace(err) } -func (s *tikvStore) batchSendSingleRegion(bo *Backoffer, batch batch, scatter bool, tableID *int64) singleBatchResp { - failpoint.Inject("MockSplitRegionTimeout", func(val failpoint.Value) { +func (s *KVStore) batchSendSingleRegion(bo *Backoffer, batch batch, scatter bool, tableID *int64) singleBatchResp { + if val, err := MockSplitRegionTimeout.Eval(); err == nil { if val.(bool) { if _, ok := bo.ctx.Deadline(); ok { <-bo.ctx.Done() } } - }) + } req := tikvrpc.NewRequest(tikvrpc.CmdSplitRegion, &kvrpcpb.SplitRegionRequest{ SplitKeys: batch.keys, @@ -155,15 +153,14 @@ func (s *tikvStore) batchSendSingleRegion(bo *Backoffer, batch batch, scatter bo // so n-1 needs to be scattered to other stores. spResp.Regions = regions[:len(regions)-1] } + var newRegionLeft string + if len(spResp.Regions) > 0 { + newRegionLeft = logutil.Hex(spResp.Regions[0]).String() + } logutil.BgLogger().Info("batch split regions complete", zap.Uint64("batch region ID", batch.regionID.id), zap.Stringer("first at", kv.Key(batch.keys[0])), - zap.Stringer("first new region left", stringutil.MemoizeStr(func() string { - if len(spResp.Regions) == 0 { - return "" - } - return logutil.Hex(spResp.Regions[0]).String() - })), + zap.String("first new region left", newRegionLeft), zap.Int("new region count", len(spResp.Regions))) if !scatter { @@ -195,7 +192,7 @@ func (s *tikvStore) batchSendSingleRegion(bo *Backoffer, batch batch, scatter bo } // SplitRegions splits regions by splitKeys. -func (s *tikvStore) SplitRegions(ctx context.Context, splitKeys [][]byte, scatter bool, tableID *int64) (regionIDs []uint64, err error) { +func (s *KVStore) SplitRegions(ctx context.Context, splitKeys [][]byte, scatter bool, tableID *int64) (regionIDs []uint64, err error) { bo := NewBackofferWithVars(ctx, int(math.Min(float64(len(splitKeys))*splitRegionBackoff, maxSplitRegionsBackoff)), nil) resp, err := s.splitBatchRegionsReq(bo, splitKeys, scatter, tableID) regionIDs = make([]uint64, 0, len(splitKeys)) @@ -209,21 +206,21 @@ func (s *tikvStore) SplitRegions(ctx context.Context, splitKeys [][]byte, scatte return regionIDs, errors.Trace(err) } -func (s *tikvStore) scatterRegion(bo *Backoffer, regionID uint64, tableID *int64) error { +func (s *KVStore) scatterRegion(bo *Backoffer, regionID uint64, tableID *int64) error { logutil.BgLogger().Info("start scatter region", zap.Uint64("regionID", regionID)) for { - opts := make([]pd.ScatterRegionOption, 0, 1) + opts := make([]pd.RegionsOption, 0, 1) if tableID != nil { opts = append(opts, pd.WithGroup(fmt.Sprintf("%v", *tableID))) } - err := s.pdClient.ScatterRegionWithOption(bo.ctx, regionID, opts...) + _, err := s.pdClient.ScatterRegions(bo.ctx, []uint64{regionID}, opts...) - failpoint.Inject("MockScatterRegionTimeout", func(val failpoint.Value) { + if val, err2 := MockScatterRegionTimeout.Eval(); err2 == nil { if val.(bool) { err = ErrPDServerTimeout } - }) + } if err == nil { break @@ -238,23 +235,19 @@ func (s *tikvStore) scatterRegion(bo *Backoffer, regionID uint64, tableID *int64 return nil } -func (s *tikvStore) preSplitRegion(ctx context.Context, group groupedMutations) bool { +func (s *KVStore) preSplitRegion(ctx context.Context, group groupedMutations) bool { splitKeys := make([][]byte, 0, 4) preSplitSizeThresholdVal := atomic.LoadUint32(&preSplitSizeThreshold) regionSize := 0 - keysLength := group.mutations.len() - valsLength := len(group.mutations.values) + keysLength := group.mutations.Len() // The value length maybe zero for pessimistic lock keys for i := 0; i < keysLength; i++ { - regionSize = regionSize + len(group.mutations.keys[i]) - if i < valsLength { - regionSize = regionSize + len(group.mutations.values[i]) - } + regionSize = regionSize + len(group.mutations.GetKey(i)) + len(group.mutations.GetValue(i)) // The second condition is used for testing. if regionSize >= int(preSplitSizeThresholdVal) { regionSize = 0 - splitKeys = append(splitKeys, group.mutations.keys[i]) + splitKeys = append(splitKeys, group.mutations.GetKey(i)) } } if len(splitKeys) == 0 { @@ -264,7 +257,7 @@ func (s *tikvStore) preSplitRegion(ctx context.Context, group groupedMutations) regionIDs, err := s.SplitRegions(ctx, splitKeys, true, nil) if err != nil { logutil.BgLogger().Warn("2PC split regions failed", zap.Uint64("regionID", group.region.id), - zap.Int("keys count", keysLength), zap.Int("values count", valsLength), zap.Error(err)) + zap.Int("keys count", keysLength), zap.Error(err)) return false } @@ -282,7 +275,7 @@ func (s *tikvStore) preSplitRegion(ctx context.Context, group groupedMutations) // WaitScatterRegionFinish implements SplittableStore interface. // backOff is the back off time of the wait scatter region.(Milliseconds) // if backOff <= 0, the default wait scatter back off time will be used. -func (s *tikvStore) WaitScatterRegionFinish(ctx context.Context, regionID uint64, backOff int) error { +func (s *KVStore) WaitScatterRegionFinish(ctx context.Context, regionID uint64, backOff int) error { if backOff <= 0 { backOff = waitScatterRegionFinishBackoff } @@ -327,7 +320,7 @@ func (s *tikvStore) WaitScatterRegionFinish(ctx context.Context, regionID uint64 } // CheckRegionInScattering uses to check whether scatter region finished. -func (s *tikvStore) CheckRegionInScattering(regionID uint64) (bool, error) { +func (s *KVStore) CheckRegionInScattering(regionID uint64) (bool, error) { bo := NewBackofferWithVars(context.Background(), locateRegionMaxBackoff, nil) for { resp, err := s.pdClient.GetOperator(context.Background(), regionID) diff --git a/store/tikv/split_test.go b/store/tikv/split_test.go index 07225f2307359..7076b72f6d59f 100644 --- a/store/tikv/split_test.go +++ b/store/tikv/split_test.go @@ -17,15 +17,14 @@ import ( "context" . "github.com/pingcap/check" - "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/mockstore/cluster" "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" ) type testSplitSuite struct { OneByOneSuite cluster cluster.Cluster - store *tikvStore + store *KVStore bo *Backoffer } @@ -47,14 +46,14 @@ func (s *testSplitSuite) SetUpTest(c *C) { // }), // ) // c.Assert(err, IsNil) - s.store = store.(*tikvStore) + s.store = store s.bo = NewBackofferWithVars(context.Background(), 5000, nil) } -func (s *testSplitSuite) begin(c *C) *tikvTxn { +func (s *testSplitSuite) begin(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn } func (s *testSplitSuite) split(c *C, regionID uint64, key []byte) { @@ -67,7 +66,7 @@ func (s *testSplitSuite) TestSplitBatchGet(c *C) { c.Assert(err, IsNil) txn := s.begin(c) - snapshot := newTiKVSnapshot(s.store, kv.Version{Ver: txn.StartTS()}, 0) + snapshot := newTiKVSnapshot(s.store, txn.StartTS(), 0) keys := [][]byte{{'a'}, {'b'}, {'c'}} _, region, err := s.store.regionCache.GroupKeysByRegion(s.bo, keys, nil) diff --git a/store/tikv/store_test.go b/store/tikv/store_test.go index f6163cf0b2d63..d1f9322e299cd 100644 --- a/store/tikv/store_test.go +++ b/store/tikv/store_test.go @@ -25,7 +25,8 @@ import ( "github.com/pingcap/kvproto/pkg/metapb" "github.com/pingcap/kvproto/pkg/pdpb" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/store/mockoracle" + "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/store/tikv/oracle/oracles" "github.com/pingcap/tidb/store/tikv/tikvrpc" pd "github.com/tikv/pd/client" ) @@ -42,14 +43,14 @@ type testStoreSerialSuite struct { type testStoreSuiteBase struct { OneByOneSuite - store *tikvStore + store *KVStore } var _ = Suite(&testStoreSuite{}) var _ = SerialSuites(&testStoreSerialSuite{}) func (s *testStoreSuiteBase) SetUpTest(c *C) { - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) } func (s *testStoreSuiteBase) TearDownTest(c *C) { @@ -57,24 +58,24 @@ func (s *testStoreSuiteBase) TearDownTest(c *C) { } func (s *testStoreSuite) TestOracle(c *C) { - o := &mockoracle.MockOracle{} + o := &oracles.MockOracle{} s.store.oracle = o ctx := context.Background() - t1, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil)) + t1, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil), oracle.GlobalTxnScope) c.Assert(err, IsNil) - t2, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil)) + t2, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil), oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(t1, Less, t2) - t1, err = o.GetLowResolutionTimestamp(ctx) + t1, err = o.GetLowResolutionTimestamp(ctx, &oracle.Option{}) c.Assert(err, IsNil) - t2, err = o.GetLowResolutionTimestamp(ctx) + t2, err = o.GetLowResolutionTimestamp(ctx, &oracle.Option{}) c.Assert(err, IsNil) c.Assert(t1, Less, t2) - f := o.GetLowResolutionTimestampAsync(ctx) + f := o.GetLowResolutionTimestampAsync(ctx, &oracle.Option{}) c.Assert(f, NotNil) - _ = o.UntilExpired(0, 0) + _ = o.UntilExpired(0, 0, &oracle.Option{}) // Check retry. var wg sync.WaitGroup @@ -89,10 +90,10 @@ func (s *testStoreSuite) TestOracle(c *C) { go func() { defer wg.Done() - t3, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, nil)) + t3, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, tsoMaxBackoff, nil), oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(t2, Less, t3) - expired := s.store.oracle.IsExpired(t2, 50) + expired := s.store.oracle.IsExpired(t2, 50, &oracle.Option{}) c.Assert(expired, IsTrue) }() @@ -117,7 +118,7 @@ func (c *mockPDClient) disable() { c.stop = true } -func (c *mockPDClient) GetMemberInfo(ctx context.Context) ([]*pdpb.Member, error) { +func (c *mockPDClient) GetAllMembers(ctx context.Context) ([]*pdpb.Member, error) { return nil, nil } @@ -135,10 +136,18 @@ func (c *mockPDClient) GetTS(ctx context.Context) (int64, int64, error) { return c.client.GetTS(ctx) } +func (c *mockPDClient) GetLocalTS(ctx context.Context, dcLocation string) (int64, int64, error) { + return c.GetTS(ctx) +} + func (c *mockPDClient) GetTSAsync(ctx context.Context) pd.TSFuture { return nil } +func (c *mockPDClient) GetLocalTSAsync(ctx context.Context, dcLocation string) pd.TSFuture { + return nil +} + func (c *mockPDClient) GetRegion(ctx context.Context, key []byte) (*pd.Region, error) { c.RLock() defer c.RUnlock() @@ -149,6 +158,10 @@ func (c *mockPDClient) GetRegion(ctx context.Context, key []byte) (*pd.Region, e return c.client.GetRegion(ctx, key) } +func (c *mockPDClient) GetRegionFromMember(ctx context.Context, key []byte, memberURLs []string) (*pd.Region, error) { + return nil, nil +} + func (c *mockPDClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Region, error) { c.RLock() defer c.RUnlock() @@ -213,16 +226,20 @@ func (c *mockPDClient) ScatterRegion(ctx context.Context, regionID uint64) error return nil } +func (c *mockPDClient) ScatterRegions(ctx context.Context, regionsID []uint64, opts ...pd.RegionsOption) (*pdpb.ScatterRegionResponse, error) { + return nil, nil +} + +func (c *mockPDClient) SplitRegions(ctx context.Context, splitKeys [][]byte, opts ...pd.RegionsOption) (*pdpb.SplitRegionsResponse, error) { + return nil, nil +} + func (c *mockPDClient) GetOperator(ctx context.Context, regionID uint64) (*pdpb.GetOperatorResponse, error) { return &pdpb.GetOperatorResponse{Status: pdpb.OperatorStatus_SUCCESS}, nil } func (c *mockPDClient) GetLeaderAddr() string { return "mockpd" } -func (c *mockPDClient) ScatterRegionWithOption(ctx context.Context, regionID uint64, opts ...pd.ScatterRegionOption) error { - return nil -} - type checkRequestClient struct { Client priority pb.CommandPri @@ -290,13 +307,13 @@ func (s *testStoreSerialSuite) TestOracleChangeByFailpoint(c *C) { }() c.Assert(failpoint.Enable("github.com/pingcap/tidb/store/tikv/oracle/changeTSFromPD", "return(10000)"), IsNil) - o := &mockoracle.MockOracle{} + o := &oracles.MockOracle{} s.store.oracle = o ctx := context.Background() - t1, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil)) + t1, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil), oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(failpoint.Disable("github.com/pingcap/tidb/store/tikv/oracle/changeTSFromPD"), IsNil) - t2, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil)) + t2, err := s.store.getTimestampWithRetry(NewBackofferWithVars(ctx, 100, nil), oracle.GlobalTxnScope) c.Assert(err, IsNil) c.Assert(t1, Greater, t2) } diff --git a/store/tikv/store_type.go b/store/tikv/store_type.go new file mode 100644 index 0000000000000..8791d99d90d12 --- /dev/null +++ b/store/tikv/store_type.go @@ -0,0 +1,83 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package tikv + +import ( + "fmt" + + "github.com/pingcap/kvproto/pkg/metapb" +) + +// AccessMode uses to index stores for different region cache access requirements. +type AccessMode int + +const ( + // TiKVOnly indicates stores list that use for TiKv access(include both leader request and follower read). + TiKVOnly AccessMode = iota + // TiFlashOnly indicates stores list that use for TiFlash request. + TiFlashOnly + // NumAccessMode reserved to keep max access mode value. + NumAccessMode +) + +func (a AccessMode) String() string { + switch a { + case TiKVOnly: + return "TiKvOnly" + case TiFlashOnly: + return "TiFlashOnly" + default: + return fmt.Sprintf("%d", a) + } +} + +// Constants to determine engine type. +// They should be synced with PD. +const ( + engineLabelKey = "engine" + engineLabelTiFlash = "tiflash" +) + +// GetStoreTypeByMeta gets store type by store meta pb. +func GetStoreTypeByMeta(store *metapb.Store) StoreType { + tp := TiKV + for _, label := range store.Labels { + if label.Key == engineLabelKey { + if label.Value == engineLabelTiFlash { + tp = TiFlash + } + break + } + } + return tp +} + +// StoreType represents the type of a store. +type StoreType uint8 + +// Store type enums. +const ( + TiKV StoreType = iota + TiFlash +) + +// Name returns the name of store type. +func (t StoreType) Name() string { + if t == TiFlash { + return "tiflash" + } else if t == TiKV { + return "tikv" + } + return "unspecified" +} diff --git a/util/storeutil/store_vars.go b/store/tikv/storeutil/store_vars.go similarity index 100% rename from util/storeutil/store_vars.go rename to store/tikv/storeutil/store_vars.go diff --git a/store/tikv/test_util.go b/store/tikv/test_util.go index 59562755a3a63..ea309f33fd789 100644 --- a/store/tikv/test_util.go +++ b/store/tikv/test_util.go @@ -16,17 +16,16 @@ package tikv import ( "github.com/google/uuid" "github.com/pingcap/errors" - "github.com/pingcap/tidb/kv" - "github.com/tikv/pd/client" + pd "github.com/tikv/pd/client" ) // NewTestTiKVStore creates a test store with Option -func NewTestTiKVStore(client Client, pdClient pd.Client, clientHijack func(Client) Client, pdClientHijack func(pd.Client) pd.Client, txnLocalLatches uint) (kv.Storage, error) { +func NewTestTiKVStore(client Client, pdClient pd.Client, clientHijack func(Client) Client, pdClientHijack func(pd.Client) pd.Client, txnLocalLatches uint) (*KVStore, error) { if clientHijack != nil { client = clientHijack(client) } - pdCli := pd.Client(&codecPDClient{pdClient}) + pdCli := pd.Client(&CodecPDClient{pdClient}) if pdClientHijack != nil { pdCli = pdClientHijack(pdCli) } @@ -34,7 +33,7 @@ func NewTestTiKVStore(client Client, pdClient pd.Client, clientHijack func(Clien // Make sure the uuid is unique. uid := uuid.New().String() spkv := NewMockSafePointKV() - tikvStore, err := newTikvStore(uid, pdCli, spkv, client, false, nil) + tikvStore, err := NewKVStore(uid, pdCli, spkv, client) if txnLocalLatches > 0 { tikvStore.EnableTxnLocalLatches(txnLocalLatches) diff --git a/store/tikv/ticlient_test.go b/store/tikv/ticlient_test.go index f5e7ec21b4e99..4bc82ce509143 100644 --- a/store/tikv/ticlient_test.go +++ b/store/tikv/ticlient_test.go @@ -17,6 +17,7 @@ import ( "context" "flag" "fmt" + "strings" "sync" "time" @@ -24,7 +25,9 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/store/mockstore/unistore" - "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/store/tikv/config" + "github.com/pingcap/tidb/store/tikv/util/codec" + pd "github.com/tikv/pd/client" ) var ( @@ -33,15 +36,22 @@ var ( pdAddrs = flag.String("pd-addrs", "127.0.0.1:2379", "pd addrs") ) -// NewTestStore creates a kv.Storage for testing purpose. -func NewTestStore(c *C) kv.Storage { +// NewTestStore creates a KVStore for testing purpose. +func NewTestStore(c *C) *KVStore { if !flag.Parsed() { flag.Parse() } if *WithTiKV { - var d Driver - store, err := d.Open(fmt.Sprintf("tikv://%s", *pdAddrs)) + addrs := strings.Split(*pdAddrs, ",") + pdClient, err := pd.NewClient(addrs, pd.SecurityOption{}) + c.Assert(err, IsNil) + var securityConfig config.Security + tlsConfig, err := securityConfig.ToTLSConfig() + c.Assert(err, IsNil) + spKV, err := NewEtcdSafePointKV(addrs, tlsConfig) + c.Assert(err, IsNil) + store, err := NewKVStore("test-store", &CodecPDClient{Client: pdClient}, spKV, NewRPCClient(securityConfig)) c.Assert(err, IsNil) err = clearStorage(store) c.Assert(err, IsNil) @@ -55,7 +65,7 @@ func NewTestStore(c *C) kv.Storage { return store } -func clearStorage(store kv.Storage) error { +func clearStorage(store *KVStore) error { txn, err := store.Begin() if err != nil { return errors.Trace(err) @@ -75,7 +85,7 @@ func clearStorage(store kv.Storage) error { type testTiclientSuite struct { OneByOneSuite - store *tikvStore + store *KVStore // prefix is prefix of each key in this test. It is used for table isolation, // or it may pollute other data. prefix string @@ -85,7 +95,7 @@ var _ = Suite(&testTiclientSuite{}) func (s *testTiclientSuite) SetUpSuite(c *C) { s.OneByOneSuite.SetUpSuite(c) - s.store = NewTestStore(c).(*tikvStore) + s.store = NewTestStore(c) s.prefix = fmt.Sprintf("ticlient_%d", time.Now().Unix()) } @@ -108,10 +118,10 @@ func (s *testTiclientSuite) TearDownSuite(c *C) { s.OneByOneSuite.TearDownSuite(c) } -func (s *testTiclientSuite) beginTxn(c *C) *tikvTxn { +func (s *testTiclientSuite) beginTxn(c *C) *KVTxn { txn, err := s.store.Begin() c.Assert(err, IsNil) - return txn.(*tikvTxn) + return txn } func (s *testTiclientSuite) TestSingleKey(c *C) { diff --git a/store/tikv/tikvrpc/tikvrpc.go b/store/tikv/tikvrpc/tikvrpc.go index b210431e4f7c8..ed4da00e146a9 100644 --- a/store/tikv/tikvrpc/tikvrpc.go +++ b/store/tikv/tikvrpc/tikvrpc.go @@ -25,6 +25,7 @@ import ( "github.com/pingcap/kvproto/pkg/errorpb" "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/kvproto/pkg/metapb" + "github.com/pingcap/kvproto/pkg/mpp" "github.com/pingcap/kvproto/pkg/tikvpb" "github.com/pingcap/tidb/kv" ) @@ -70,6 +71,9 @@ const ( CmdCop CmdType = 512 + iota CmdCopStream CmdBatchCop + CmdMPPTask + CmdMPPConn + CmdMPPCancel CmdMvccGetByKey CmdType = 1024 + iota CmdMvccGetByStartTs @@ -140,6 +144,12 @@ func (t CmdType) String() string { return "CopStream" case CmdBatchCop: return "BatchCop" + case CmdMPPTask: + return "DispatchMPPTask" + case CmdMPPConn: + return "EstablishMPPConnection" + case CmdMPPCancel: + return "CancelMPPTask" case CmdMvccGetByKey: return "MvccGetByKey" case CmdMvccGetByStartTs: @@ -163,7 +173,8 @@ type Request struct { Type CmdType Req interface{} kvrpcpb.Context - ReplicaReadSeed *uint32 // pointer to follower read seed in snapshot/coprocessor + ReplicaReadType kv.ReplicaReadType // different from `kvrpcpb.Context.ReplicaRead` + ReplicaReadSeed *uint32 // pointer to follower read seed in snapshot/coprocessor StoreTp kv.StoreType } @@ -186,6 +197,7 @@ func NewRequest(typ CmdType, pointer interface{}, ctxs ...kvrpcpb.Context) *Requ func NewReplicaReadRequest(typ CmdType, pointer interface{}, replicaReadType kv.ReplicaReadType, replicaReadSeed *uint32, ctxs ...kvrpcpb.Context) *Request { req := NewRequest(typ, pointer, ctxs...) req.ReplicaRead = replicaReadType.IsFollowerRead() + req.ReplicaReadType = replicaReadType req.ReplicaReadSeed = replicaReadSeed return req } @@ -315,11 +327,26 @@ func (req *Request) Cop() *coprocessor.Request { return req.Req.(*coprocessor.Request) } -// BatchCop returns coprocessor request in request. +// BatchCop returns BatchCop request in request. func (req *Request) BatchCop() *coprocessor.BatchRequest { return req.Req.(*coprocessor.BatchRequest) } +// DispatchMPPTask returns dispatch task request in request. +func (req *Request) DispatchMPPTask() *mpp.DispatchTaskRequest { + return req.Req.(*mpp.DispatchTaskRequest) +} + +// EstablishMPPConn returns EstablishMPPConnectionRequest in request. +func (req *Request) EstablishMPPConn() *mpp.EstablishMPPConnectionRequest { + return req.Req.(*mpp.EstablishMPPConnectionRequest) +} + +// CancelMPPTask returns canceling task in request +func (req *Request) CancelMPPTask() *mpp.CancelTaskRequest { + return req.Req.(*mpp.CancelTaskRequest) +} + // MvccGetByKey returns MvccGetByKeyRequest in request. func (req *Request) MvccGetByKey() *kvrpcpb.MvccGetByKeyRequest { return req.Req.(*kvrpcpb.MvccGetByKeyRequest) @@ -370,6 +397,13 @@ func (req *Request) TxnHeartBeat() *kvrpcpb.TxnHeartBeatRequest { return req.Req.(*kvrpcpb.TxnHeartBeatRequest) } +// EnableStaleRead enables stale read +func (req *Request) EnableStaleRead() { + req.StaleRead = true + req.ReplicaReadType = kv.ReplicaReadMixed + req.ReplicaRead = false +} + // ToBatchCommandsRequest converts the request to an entry in BatchCommands request. func (req *Request) ToBatchCommandsRequest() *tikvpb.BatchCommandsRequest_Request { switch req.Type { @@ -505,7 +539,7 @@ func FromBatchCommandsResponse(res *tikvpb.BatchCommandsResponse_Response) (*Res panic("unreachable") } -// CopStreamResponse combinates tikvpb.Tikv_CoprocessorStreamClient and the first Recv() result together. +// CopStreamResponse combines tikvpb.Tikv_CoprocessorStreamClient and the first Recv() result together. // In streaming API, get grpc stream client may not involve any network packet, then region error have // to be handled in Recv() function. This struct facilitates the error handling. type CopStreamResponse struct { @@ -523,6 +557,14 @@ type BatchCopStreamResponse struct { Lease // Shared by this object and a background goroutine. } +// MPPStreamResponse is indeed a wrapped client that can receive data packet from tiflash mpp server. +type MPPStreamResponse struct { + tikvpb.Tikv_EstablishMPPConnectionClient + *mpp.MPPDataPacket + Timeout time.Duration + Lease +} + // SetContext set the Context field for the given req to the specified ctx. func SetContext(req *Request, region *metapb.Region, peer *metapb.Peer) error { ctx := &req.Context @@ -591,6 +633,8 @@ func SetContext(req *Request, region *metapb.Region, peer *metapb.Peer) error { req.Cop().Context = ctx case CmdBatchCop: req.BatchCop().Context = ctx + case CmdMPPTask: + // Dispatching MPP tasks don't need a region context, because it's a request for store but not region. case CmdMvccGetByKey: req.MvccGetByKey().Context = ctx case CmdMvccGetByStartTs: @@ -767,7 +811,7 @@ func (resp *Response) GetRegionError() (*errorpb.Error, error) { } // CallRPC launches a rpc call. -// ch is needed to implement timeout for coprocessor streaing, the stream object's +// ch is needed to implement timeout for coprocessor streaming, the stream object's // cancel function will be sent to the channel, together with a lease checked by a background goroutine. func CallRPC(ctx context.Context, client tikvpb.TikvClient, req *Request) (*Response, error) { resp := &Response{} @@ -827,6 +871,17 @@ func CallRPC(ctx context.Context, client tikvpb.TikvClient, req *Request) (*Resp resp.Resp, err = client.PhysicalScanLock(ctx, req.PhysicalScanLock()) case CmdCop: resp.Resp, err = client.Coprocessor(ctx, req.Cop()) + case CmdMPPTask: + resp.Resp, err = client.DispatchMPPTask(ctx, req.DispatchMPPTask()) + case CmdMPPConn: + var streamClient tikvpb.Tikv_EstablishMPPConnectionClient + streamClient, err = client.EstablishMPPConnection(ctx, req.EstablishMPPConn()) + resp.Resp = &MPPStreamResponse{ + Tikv_EstablishMPPConnectionClient: streamClient, + } + case CmdMPPCancel: + // it cannot use the ctx with cancel(), otherwise this cmd will fail. + resp.Resp, err = client.CancelMPPTask(ctx, req.CancelMPPTask()) case CmdCopStream: var streamClient tikvpb.Tikv_CoprocessorStreamClient streamClient, err = client.CoprocessorStream(ctx, req.Cop()) @@ -913,7 +968,7 @@ func (resp *BatchCopStreamResponse) Recv() (*coprocessor.BatchResponse, error) { return ret, errors.Trace(err) } -// Close closes the CopStreamResponse object. +// Close closes the BatchCopStreamResponse object. func (resp *BatchCopStreamResponse) Close() { atomic.StoreInt64(&resp.Lease.deadline, 1) // We also call cancel here because CheckStreamTimeoutLoop @@ -923,7 +978,28 @@ func (resp *BatchCopStreamResponse) Close() { } } -// CheckStreamTimeoutLoop runs periodically to check is there any stream request timeouted. +// Recv overrides the stream client Recv() function. +func (resp *MPPStreamResponse) Recv() (*mpp.MPPDataPacket, error) { + deadline := time.Now().Add(resp.Timeout).UnixNano() + atomic.StoreInt64(&resp.Lease.deadline, deadline) + + ret, err := resp.Tikv_EstablishMPPConnectionClient.Recv() + + atomic.StoreInt64(&resp.Lease.deadline, 0) // Stop the lease check. + return ret, errors.Trace(err) +} + +// Close closes the MPPStreamResponse object. +func (resp *MPPStreamResponse) Close() { + atomic.StoreInt64(&resp.Lease.deadline, 1) + // We also call cancel here because CheckStreamTimeoutLoop + // is not guaranteed to cancel all items when it exits. + if resp.Lease.Cancel != nil { + resp.Lease.Cancel() + } +} + +// CheckStreamTimeoutLoop runs periodically to check is there any stream request timed out. // Lease is an object to track stream requests, call this function with "go CheckStreamTimeoutLoop()" // It is not guaranteed to call every Lease.Cancel() putting into channel when exits. // If grpc-go supports SetDeadline(https://github.com/grpc/grpc-go/issues/2917), we can stop using this method. @@ -968,3 +1044,33 @@ func keepOnlyActive(array []*Lease, now int64) []*Lease { } return array[:idx] } + +// IsGreenGCRequest checks if the request is used by Green GC's protocol. This is used for failpoints to inject errors +// to specified RPC requests. +func (req *Request) IsGreenGCRequest() bool { + if req.Type == CmdCheckLockObserver || + req.Type == CmdRegisterLockObserver || + req.Type == CmdRemoveLockObserver || + req.Type == CmdPhysicalScanLock { + return true + } + return false +} + +// IsTxnWriteRequest checks if the request is a transactional write request. This is used for failpoints to inject +// errors to specified RPC requests. +func (req *Request) IsTxnWriteRequest() bool { + if req.Type == CmdPessimisticLock || + req.Type == CmdPrewrite || + req.Type == CmdCommit || + req.Type == CmdBatchRollback || + req.Type == CmdPessimisticRollback || + req.Type == CmdCheckTxnStatus || + req.Type == CmdCheckSecondaryLocks || + req.Type == CmdCleanup || + req.Type == CmdTxnHeartBeat || + req.Type == CmdResolveLock { + return true + } + return false +} diff --git a/store/tikv/txn.go b/store/tikv/txn.go index 401900a74dc60..382586cd746f9 100644 --- a/store/tikv/txn.go +++ b/store/tikv/txn.go @@ -17,6 +17,7 @@ import ( "bytes" "context" "fmt" + "math/rand" "runtime/trace" "sort" "sync" @@ -27,38 +28,28 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/kvproto/pkg/kvrpcpb" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/kv" - "github.com/pingcap/tidb/metrics" - "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/store/tikv/logutil" + "github.com/pingcap/tidb/store/tikv/metrics" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/util/execdetails" - "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) -var ( - _ kv.Transaction = (*tikvTxn)(nil) -) - -var ( - tikvTxnCmdHistogramWithCommit = metrics.TiKVTxnCmdHistogram.WithLabelValues(metrics.LblCommit) - tikvTxnCmdHistogramWithRollback = metrics.TiKVTxnCmdHistogram.WithLabelValues(metrics.LblRollback) - tikvTxnCmdHistogramWithBatchGet = metrics.TiKVTxnCmdHistogram.WithLabelValues(metrics.LblBatchGet) - tikvTxnCmdHistogramWithGet = metrics.TiKVTxnCmdHistogram.WithLabelValues(metrics.LblGet) -) - // SchemaAmender is used by pessimistic transactions to amend commit mutations for schema change during 2pc. type SchemaAmender interface { // AmendTxn is the amend entry, new mutations will be generated based on input mutations using schema change info. // The returned results are mutations need to prewrite and mutations need to cleanup. - AmendTxn(ctx context.Context, startInfoSchema SchemaVer, change *RelatedSchemaChange, mutations CommitterMutations) (*CommitterMutations, error) + AmendTxn(ctx context.Context, startInfoSchema SchemaVer, change *RelatedSchemaChange, mutations CommitterMutations) (CommitterMutations, error) } -// tikvTxn implements kv.Transaction. -type tikvTxn struct { - snapshot *tikvSnapshot +// KVTxn contains methods to interact with a TiKV transaction. +type KVTxn struct { + snapshot *KVSnapshot us kv.UnionStore - store *tikvStore // for connection to region. + store *KVStore // for connection to region. startTS uint64 startTime time.Time // Monotonic timestamp for recording txn time consuming. commitTS uint64 @@ -68,15 +59,7 @@ type tikvTxn struct { committer *twoPhaseCommitter lockedCnt int - // For data consistency check. - // assertions[:confirmed] is the assertion of current transaction. - // assertions[confirmed:len(assertions)] is the assertions of current statement. - // StmtCommit/StmtRollback may change the confirmed position. - assertions []assertionPair - confirmed int - valid bool - dirty bool // txnInfoSchema is the infoSchema fetched at startTS. txnInfoSchema SchemaVer @@ -86,20 +69,19 @@ type tikvTxn struct { commitCallback func(info kv.TxnInfo, err error) } -func newTiKVTxn(store *tikvStore) (*tikvTxn, error) { +func newTiKVTxn(store *KVStore, txnScope string) (*KVTxn, error) { bo := NewBackofferWithVars(context.Background(), tsoMaxBackoff, nil) - startTS, err := store.getTimestampWithRetry(bo) + startTS, err := store.getTimestampWithRetry(bo, txnScope) if err != nil { return nil, errors.Trace(err) } - return newTikvTxnWithStartTS(store, startTS, store.nextReplicaReadSeed()) + return newTiKVTxnWithStartTS(store, txnScope, startTS, store.nextReplicaReadSeed()) } -// newTikvTxnWithStartTS creates a txn with startTS. -func newTikvTxnWithStartTS(store *tikvStore, startTS uint64, replicaReadSeed uint32) (*tikvTxn, error) { - ver := kv.NewVersion(startTS) - snapshot := newTiKVSnapshot(store, ver, replicaReadSeed) - return &tikvTxn{ +// newTiKVTxnWithStartTS creates a txn with startTS. +func newTiKVTxnWithStartTS(store *KVStore, txnScope string, startTS uint64, replicaReadSeed uint32) (*KVTxn, error) { + snapshot := newTiKVSnapshot(store, startTS, replicaReadSeed) + newTiKVTxn := &KVTxn{ snapshot: snapshot, us: kv.NewUnionStore(snapshot), store: store, @@ -107,22 +89,25 @@ func newTikvTxnWithStartTS(store *tikvStore, startTS uint64, replicaReadSeed uin startTime: time.Now(), valid: true, vars: kv.DefaultVars, - }, nil -} - -type assertionPair struct { - key kv.Key - assertion kv.AssertionType + } + newTiKVTxn.SetOption(kv.TxnScope, txnScope) + return newTiKVTxn, nil } -func (a assertionPair) String() string { - return fmt.Sprintf("key: %s, assertion type: %d", a.key, a.assertion) +func newTiKVTxnWithExactStaleness(store *KVStore, txnScope string, prevSec uint64) (*KVTxn, error) { + bo := NewBackofferWithVars(context.Background(), tsoMaxBackoff, nil) + startTS, err := store.getStalenessTimestamp(bo, txnScope, prevSec) + if err != nil { + return nil, errors.Trace(err) + } + return newTiKVTxnWithStartTS(store, txnScope, startTS, store.nextReplicaReadSeed()) } // SetSuccess is used to probe if kv variables are set or not. It is ONLY used in test cases. var SetSuccess = false -func (txn *tikvTxn) SetVars(vars *kv.Variables) { +// SetVars sets variables to the transaction. +func (txn *KVTxn) SetVars(vars *kv.Variables) { txn.vars = vars txn.snapshot.vars = vars failpoint.Inject("probeSetVars", func(val failpoint.Value) { @@ -132,12 +117,13 @@ func (txn *tikvTxn) SetVars(vars *kv.Variables) { }) } -func (txn *tikvTxn) GetVars() *kv.Variables { +// GetVars gets variables from the transaction. +func (txn *KVTxn) GetVars() *kv.Variables { return txn.vars } // Get implements transaction interface. -func (txn *tikvTxn) Get(ctx context.Context, k kv.Key) ([]byte, error) { +func (txn *KVTxn) Get(ctx context.Context, k kv.Key) ([]byte, error) { ret, err := txn.us.Get(ctx, k) if kv.IsErrNotFound(err) { return nil, err @@ -149,7 +135,10 @@ func (txn *tikvTxn) Get(ctx context.Context, k kv.Key) ([]byte, error) { return ret, nil } -func (txn *tikvTxn) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { +// BatchGet gets kv from the memory buffer of statement and transaction, and the kv storage. +// Do not use len(value) == 0 or value == nil to represent non-exist. +// If a key doesn't exist, there shouldn't be any corresponding entry in the result map. +func (txn *KVTxn) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]byte, error) { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("tikvTxn.BatchGet", opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -158,29 +147,39 @@ func (txn *tikvTxn) BatchGet(ctx context.Context, keys []kv.Key) (map[string][]b return kv.NewBufferBatchGetter(txn.GetMemBuffer(), nil, txn.snapshot).BatchGet(ctx, keys) } -func (txn *tikvTxn) Set(k kv.Key, v []byte) error { +// Set sets the value for key k as v into kv store. +// v must NOT be nil or empty, otherwise it returns ErrCannotSetNilValue. +func (txn *KVTxn) Set(k kv.Key, v []byte) error { txn.setCnt++ return txn.us.GetMemBuffer().Set(k, v) } -func (txn *tikvTxn) String() string { +// String implements fmt.Stringer interface. +func (txn *KVTxn) String() string { return fmt.Sprintf("%d", txn.StartTS()) } -func (txn *tikvTxn) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) { +// Iter creates an Iterator positioned on the first entry that k <= entry's key. +// If such entry is not found, it returns an invalid Iterator with no error. +// It yields only keys that < upperBound. If upperBound is nil, it means the upperBound is unbounded. +// The Iterator must be Closed after use. +func (txn *KVTxn) Iter(k kv.Key, upperBound kv.Key) (kv.Iterator, error) { return txn.us.Iter(k, upperBound) } // IterReverse creates a reversed Iterator positioned on the first entry which key is less than k. -func (txn *tikvTxn) IterReverse(k kv.Key) (kv.Iterator, error) { +func (txn *KVTxn) IterReverse(k kv.Key) (kv.Iterator, error) { return txn.us.IterReverse(k) } -func (txn *tikvTxn) Delete(k kv.Key) error { +// Delete removes the entry for key k from kv store. +func (txn *KVTxn) Delete(k kv.Key) error { return txn.us.GetMemBuffer().Delete(k) } -func (txn *tikvTxn) SetOption(opt kv.Option, val interface{}) { +// SetOption sets an option with a value, when val is nil, uses the default +// value of this option. +func (txn *KVTxn) SetOption(opt kv.Option, val interface{}) { txn.us.SetOption(opt, val) txn.snapshot.SetOption(opt, val) switch opt { @@ -193,15 +192,23 @@ func (txn *tikvTxn) SetOption(opt kv.Option, val interface{}) { } } -func (txn *tikvTxn) DelOption(opt kv.Option) { +// GetOption returns the option +func (txn *KVTxn) GetOption(opt kv.Option) interface{} { + return txn.us.GetOption(opt) +} + +// DelOption deletes an option. +func (txn *KVTxn) DelOption(opt kv.Option) { txn.us.DelOption(opt) } -func (txn *tikvTxn) IsPessimistic() bool { +// IsPessimistic returns true if it is pessimistic. +func (txn *KVTxn) IsPessimistic() bool { return txn.us.GetOption(kv.Pessimistic) != nil } -func (txn *tikvTxn) Commit(ctx context.Context) error { +// Commit commits the transaction operations to KV store. +func (txn *KVTxn) Commit(ctx context.Context) error { if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { span1 := span.Tracer().StartSpan("tikvTxn.Commit", opentracing.ChildOf(span.Context())) defer span1.Finish() @@ -222,20 +229,20 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { }) start := time.Now() - defer func() { tikvTxnCmdHistogramWithCommit.Observe(time.Since(start).Seconds()) }() + defer func() { metrics.TxnCmdHistogramWithCommit.Observe(time.Since(start).Seconds()) }() - // connID is used for log. - var connID uint64 - val := ctx.Value(sessionctx.ConnID) + // sessionID is used for log. + var sessionID uint64 + val := ctx.Value(util.SessionID) if val != nil { - connID = val.(uint64) + sessionID = val.(uint64) } var err error // If the txn use pessimistic lock, committer is initialized. committer := txn.committer if committer == nil { - committer, err = newTwoPhaseCommitter(txn, connID) + committer, err = newTwoPhaseCommitter(txn, sessionID) if err != nil { return errors.Trace(err) } @@ -254,7 +261,7 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { if err != nil { return errors.Trace(err) } - if committer.mutations.len() == 0 { + if committer.mutations.Len() == 0 { return nil } @@ -273,7 +280,7 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { // pessimistic transaction should also bypass latch. if txn.store.txnLatches == nil || txn.IsPessimistic() { err = committer.execute(ctx) - if val == nil || connID > 0 { + if val == nil || sessionID > 0 { txn.onCommitted(err) } logutil.Logger(ctx).Debug("[kv] txnLatches disabled, 2pc directly", zap.Error(err)) @@ -283,7 +290,7 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { // latches enabled // for transactions which need to acquire latches start = time.Now() - lock := txn.store.txnLatches.Lock(committer.startTS, committer.mutations.keys) + lock := txn.store.txnLatches.Lock(committer.startTS, committer.mutations.GetKeys()) commitDetail := committer.getDetail() commitDetail.LocalLatchTime = time.Since(start) if commitDetail.LocalLatchTime > 0 { @@ -294,7 +301,7 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { return kv.ErrWriteConflictInTiDB.FastGenByArgs(txn.startTS) } err = committer.execute(ctx) - if val == nil || connID > 0 { + if val == nil || sessionID > 0 { txn.onCommitted(err) } if err == nil { @@ -304,11 +311,12 @@ func (txn *tikvTxn) Commit(ctx context.Context) error { return errors.Trace(err) } -func (txn *tikvTxn) close() { +func (txn *KVTxn) close() { txn.valid = false } -func (txn *tikvTxn) Rollback() error { +// Rollback undoes the transaction operations to KV store. +func (txn *KVTxn) Rollback() error { if !txn.valid { return kv.ErrInvalidTxn } @@ -323,20 +331,20 @@ func (txn *tikvTxn) Rollback() error { } txn.close() logutil.BgLogger().Debug("[kv] rollback txn", zap.Uint64("txnStartTS", txn.StartTS())) - tikvTxnCmdHistogramWithRollback.Observe(time.Since(start).Seconds()) + metrics.TxnCmdHistogramWithRollback.Observe(time.Since(start).Seconds()) return nil } -func (txn *tikvTxn) rollbackPessimisticLocks() error { +func (txn *KVTxn) rollbackPessimisticLocks() error { if txn.lockedCnt == 0 { return nil } bo := NewBackofferWithVars(context.Background(), cleanupMaxBackoff, txn.vars) keys := txn.collectLockedKeys() - return txn.committer.pessimisticRollbackMutations(bo, CommitterMutations{keys: keys}) + return txn.committer.pessimisticRollbackMutations(bo, &PlainMutations{keys: keys}) } -func (txn *tikvTxn) collectLockedKeys() [][]byte { +func (txn *KVTxn) collectLockedKeys() [][]byte { keys := make([][]byte, 0, txn.lockedCnt) buf := txn.GetMemBuffer() var err error @@ -349,9 +357,9 @@ func (txn *tikvTxn) collectLockedKeys() [][]byte { return keys } -func (txn *tikvTxn) onCommitted(err error) { +func (txn *KVTxn) onCommitted(err error) { if txn.commitCallback != nil { - info := kv.TxnInfo{StartTS: txn.startTS, CommitTS: txn.commitTS} + info := kv.TxnInfo{TxnScope: txn.GetUnionStore().GetOption(kv.TxnScope).(string), StartTS: txn.startTS, CommitTS: txn.commitTS} if err != nil { info.ErrMsg = err.Error() } @@ -359,8 +367,9 @@ func (txn *tikvTxn) onCommitted(err error) { } } +// LockKeys tries to lock the entries with the keys in KV store. // lockWaitTime in ms, except that kv.LockAlwaysWait(0) means always wait lock, kv.LockNowait(-1) means nowait lock -func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput ...kv.Key) error { +func (txn *KVTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput ...kv.Key) error { // Exclude keys that are already locked. var err error keys := make([][]byte, 0, len(keysInput)) @@ -368,6 +377,7 @@ func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput txn.mu.Lock() defer txn.mu.Unlock() defer func() { + metrics.TxnCmdHistogramWithLockKeys.Observe(time.Since(startTime).Seconds()) if err == nil { if lockCtx.PessimisticLockWaited != nil { if atomic.LoadInt32(lockCtx.PessimisticLockWaited) > 0 { @@ -402,7 +412,9 @@ func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput keys = append(keys, key) } else if txn.IsPessimistic() { if checkKeyExists && valueExist { - return txn.committer.extractKeyExistsErr(key) + alreadyExist := kvrpcpb.AlreadyExist{Key: key} + e := &ErrKeyExist{AlreadyExist: &alreadyExist} + return txn.committer.extractKeyExistsErr(e) } } if lockCtx.ReturnValues && locked { @@ -417,14 +429,14 @@ func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput keys = deduplicateKeys(keys) if txn.IsPessimistic() && lockCtx.ForUpdateTS > 0 { if txn.committer == nil { - // connID is used for log. - var connID uint64 + // sessionID is used for log. + var sessionID uint64 var err error - val := ctx.Value(sessionctx.ConnID) + val := ctx.Value(util.SessionID) if val != nil { - connID = val.(uint64) + sessionID = val.(uint64) } - txn.committer, err = newTwoPhaseCommitter(txn, connID) + txn.committer, err = newTwoPhaseCommitter(txn, sessionID) if err != nil { return err } @@ -443,7 +455,7 @@ func (txn *tikvTxn) LockKeys(ctx context.Context, lockCtx *kv.LockCtx, keysInput // If the number of keys greater than 1, it can be on different region, // concurrently execute on multiple regions may lead to deadlock. txn.committer.isFirstLock = txn.lockedCnt == 0 && len(keys) == 1 - err = txn.committer.pessimisticLockMutations(bo, lockCtx, CommitterMutations{keys: keys}) + err = txn.committer.pessimisticLockMutations(bo, lockCtx, &PlainMutations{keys: keys}) if bo.totalSleep > 0 { atomic.AddInt64(&lockCtx.Stats.BackoffTime, int64(bo.totalSleep)*int64(time.Millisecond)) lockCtx.Stats.Mu.Lock() @@ -517,11 +529,11 @@ func deduplicateKeys(keys [][]byte) [][]byte { return deduped } -func (txn *tikvTxn) asyncPessimisticRollback(ctx context.Context, keys [][]byte) *sync.WaitGroup { +func (txn *KVTxn) asyncPessimisticRollback(ctx context.Context, keys [][]byte) *sync.WaitGroup { // Clone a new committer for execute in background. committer := &twoPhaseCommitter{ store: txn.committer.store, - connID: txn.committer.connID, + sessionID: txn.committer.sessionID, startTS: txn.committer.startTS, forUpdateTS: txn.committer.forUpdateTS, primaryKey: txn.committer.primaryKey, @@ -529,10 +541,23 @@ func (txn *tikvTxn) asyncPessimisticRollback(ctx context.Context, keys [][]byte) wg := new(sync.WaitGroup) wg.Add(1) go func() { - failpoint.Inject("AsyncRollBackSleep", func() { - time.Sleep(100 * time.Millisecond) + failpoint.Inject("beforeAsyncPessimisticRollback", func(val failpoint.Value) { + if s, ok := val.(string); ok { + if s == "skip" { + logutil.Logger(ctx).Info("[failpoint] injected skip async pessimistic rollback", + zap.Uint64("txnStartTS", txn.startTS)) + wg.Done() + failpoint.Return() + } else if s == "delay" { + duration := time.Duration(rand.Int63n(int64(time.Second) * 2)) + logutil.Logger(ctx).Info("[failpoint] injected delay before async pessimistic rollback", + zap.Uint64("txnStartTS", txn.startTS), zap.Duration("duration", duration)) + time.Sleep(duration) + } + } }) - err := committer.pessimisticRollbackMutations(NewBackofferWithVars(ctx, pessimisticRollbackMaxBackoff, txn.vars), CommitterMutations{keys: keys}) + + err := committer.pessimisticRollbackMutations(NewBackofferWithVars(ctx, pessimisticRollbackMaxBackoff, txn.vars), &PlainMutations{keys: keys}) if err != nil { logutil.Logger(ctx).Warn("[kv] pessimisticRollback failed.", zap.Error(err)) } @@ -550,38 +575,48 @@ func hashInKeys(deadlockKeyHash uint64, keys [][]byte) bool { return false } -func (txn *tikvTxn) IsReadOnly() bool { +// IsReadOnly checks if the transaction has only performed read operations. +func (txn *KVTxn) IsReadOnly() bool { return !txn.us.GetMemBuffer().Dirty() } -func (txn *tikvTxn) StartTS() uint64 { +// StartTS returns the transaction start timestamp. +func (txn *KVTxn) StartTS() uint64 { return txn.startTS } -func (txn *tikvTxn) Valid() bool { +// Valid returns if the transaction is valid. +// A transaction become invalid after commit or rollback. +func (txn *KVTxn) Valid() bool { return txn.valid } -func (txn *tikvTxn) Len() int { +// Len returns the number of entries in the DB. +func (txn *KVTxn) Len() int { return txn.us.GetMemBuffer().Len() } -func (txn *tikvTxn) Size() int { +// Size returns sum of keys and values length. +func (txn *KVTxn) Size() int { return txn.us.GetMemBuffer().Size() } -func (txn *tikvTxn) Reset() { +// Reset reset the Transaction to initial states. +func (txn *KVTxn) Reset() { txn.us.GetMemBuffer().Reset() } -func (txn *tikvTxn) GetUnionStore() kv.UnionStore { +// GetUnionStore returns the UnionStore binding to this transaction. +func (txn *KVTxn) GetUnionStore() kv.UnionStore { return txn.us } -func (txn *tikvTxn) GetMemBuffer() kv.MemBuffer { +// GetMemBuffer return the MemBuffer binding to this transaction. +func (txn *KVTxn) GetMemBuffer() kv.MemBuffer { return txn.us.GetMemBuffer() } -func (txn *tikvTxn) GetSnapshot() kv.Snapshot { +// GetSnapshot returns the Snapshot binding to this transaction. +func (txn *KVTxn) GetSnapshot() *KVSnapshot { return txn.snapshot } diff --git a/store/tikv/util/codec/bytes.go b/store/tikv/util/codec/bytes.go new file mode 100644 index 0000000000000..58c9890d724d9 --- /dev/null +++ b/store/tikv/util/codec/bytes.go @@ -0,0 +1,170 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package codec + +import ( + "runtime" + "unsafe" + + "github.com/pingcap/errors" +) + +const ( + encGroupSize = 8 + encMarker = byte(0xFF) + encPad = byte(0x0) +) + +var ( + pads = make([]byte, encGroupSize) +) + +// EncodeBytes guarantees the encoded value is in ascending order for comparison, +// encoding with the following rule: +// [group1][marker1]...[groupN][markerN] +// group is 8 bytes slice which is padding with 0. +// marker is `0xFF - padding 0 count` +// For example: +// [] -> [0, 0, 0, 0, 0, 0, 0, 0, 247] +// [1, 2, 3] -> [1, 2, 3, 0, 0, 0, 0, 0, 250] +// [1, 2, 3, 0] -> [1, 2, 3, 0, 0, 0, 0, 0, 251] +// [1, 2, 3, 4, 5, 6, 7, 8] -> [1, 2, 3, 4, 5, 6, 7, 8, 255, 0, 0, 0, 0, 0, 0, 0, 0, 247] +// Refer: https://github.com/facebook/mysql-5.6/wiki/MyRocks-record-format#memcomparable-format +func EncodeBytes(b []byte, data []byte) []byte { + // Allocate more space to avoid unnecessary slice growing. + // Assume that the byte slice size is about `(len(data) / encGroupSize + 1) * (encGroupSize + 1)` bytes, + // that is `(len(data) / 8 + 1) * 9` in our implement. + dLen := len(data) + reallocSize := (dLen/encGroupSize + 1) * (encGroupSize + 1) + result := reallocBytes(b, reallocSize) + for idx := 0; idx <= dLen; idx += encGroupSize { + remain := dLen - idx + padCount := 0 + if remain >= encGroupSize { + result = append(result, data[idx:idx+encGroupSize]...) + } else { + padCount = encGroupSize - remain + result = append(result, data[idx:]...) + result = append(result, pads[:padCount]...) + } + + marker := encMarker - byte(padCount) + result = append(result, marker) + } + + return result +} + +func decodeBytes(b []byte, buf []byte, reverse bool) ([]byte, []byte, error) { + if buf == nil { + buf = make([]byte, 0, len(b)) + } + buf = buf[:0] + for { + if len(b) < encGroupSize+1 { + return nil, nil, errors.New("insufficient bytes to decode value") + } + + groupBytes := b[:encGroupSize+1] + + group := groupBytes[:encGroupSize] + marker := groupBytes[encGroupSize] + + var padCount byte + if reverse { + padCount = marker + } else { + padCount = encMarker - marker + } + if padCount > encGroupSize { + return nil, nil, errors.Errorf("invalid marker byte, group bytes %q", groupBytes) + } + + realGroupSize := encGroupSize - padCount + buf = append(buf, group[:realGroupSize]...) + b = b[encGroupSize+1:] + + if padCount != 0 { + var padByte = encPad + if reverse { + padByte = encMarker + } + // Check validity of padding bytes. + for _, v := range group[realGroupSize:] { + if v != padByte { + return nil, nil, errors.Errorf("invalid padding byte, group bytes %q", groupBytes) + } + } + break + } + } + if reverse { + reverseBytes(buf) + } + return b, buf, nil +} + +// DecodeBytes decodes bytes which is encoded by EncodeBytes before, +// returns the leftover bytes and decoded value if no error. +// `buf` is used to buffer data to avoid the cost of makeslice in decodeBytes when DecodeBytes is called by Decoder.DecodeOne. +func DecodeBytes(b []byte, buf []byte) ([]byte, []byte, error) { + return decodeBytes(b, buf, false) +} + +// See https://golang.org/src/crypto/cipher/xor.go +const wordSize = int(unsafe.Sizeof(uintptr(0))) +const supportsUnaligned = runtime.GOARCH == "386" || runtime.GOARCH == "amd64" + +func fastReverseBytes(b []byte) { + n := len(b) + w := n / wordSize + if w > 0 { + bw := *(*[]uintptr)(unsafe.Pointer(&b)) + for i := 0; i < w; i++ { + bw[i] = ^bw[i] + } + } + + for i := w * wordSize; i < n; i++ { + b[i] = ^b[i] + } +} + +func safeReverseBytes(b []byte) { + for i := range b { + b[i] = ^b[i] + } +} + +func reverseBytes(b []byte) { + if supportsUnaligned { + fastReverseBytes(b) + return + } + + safeReverseBytes(b) +} + +// reallocBytes is like realloc. +func reallocBytes(b []byte, n int) []byte { + newSize := len(b) + n + if cap(b) < newSize { + bs := make([]byte, len(b), newSize) + copy(bs, b) + return bs + } + + // slice b has capability to store n bytes + return b +} diff --git a/store/tikv/util/misc.go b/store/tikv/util/misc.go new file mode 100644 index 0000000000000..05a2692aa61a6 --- /dev/null +++ b/store/tikv/util/misc.go @@ -0,0 +1,76 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "context" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/store/tikv/logutil" + "go.uber.org/zap" +) + +// GCTimeFormat is the format that gc_worker used to store times. +const GCTimeFormat = "20060102-15:04:05 -0700" + +// CompatibleParseGCTime parses a string with `GCTimeFormat` and returns a time.Time. If `value` can't be parsed as that +// format, truncate to last space and try again. This function is only useful when loading times that saved by +// gc_worker. We have changed the format that gc_worker saves time (removed the last field), but when loading times it +// should be compatible with the old format. +func CompatibleParseGCTime(value string) (time.Time, error) { + t, err := time.Parse(GCTimeFormat, value) + + if err != nil { + // Remove the last field that separated by space + parts := strings.Split(value, " ") + prefix := strings.Join(parts[:len(parts)-1], " ") + t, err = time.Parse(GCTimeFormat, prefix) + } + + if err != nil { + err = errors.Errorf("string \"%v\" doesn't has a prefix that matches format \"%v\"", value, GCTimeFormat) + } + return t, err +} + +// WithRecovery wraps goroutine startup call with force recovery. +// it will dump current goroutine stack into log if catch any recover result. +// exec: execute logic function. +// recoverFn: handler will be called after recover and before dump stack, passing `nil` means noop. +func WithRecovery(exec func(), recoverFn func(r interface{})) { + defer func() { + r := recover() + if recoverFn != nil { + recoverFn(r) + } + if r != nil { + logutil.BgLogger().Error("panic in the recoverable goroutine", + zap.Reflect("r", r), + zap.Stack("stack trace")) + } + }() + exec() +} + +type sessionIDCtxKey struct{} + +// SessionID is the context key type to mark a session. +var SessionID = sessionIDCtxKey{} + +// SetSessionID sets session id into context +func SetSessionID(ctx context.Context, sessionID uint64) context.Context { + return context.WithValue(ctx, SessionID, sessionID) +} diff --git a/store/tikv/util/misc_test.go b/store/tikv/util/misc_test.go new file mode 100644 index 0000000000000..2f0eeb63de767 --- /dev/null +++ b/store/tikv/util/misc_test.go @@ -0,0 +1,73 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "testing" + "time" + + . "github.com/pingcap/check" +) + +func TestT(t *testing.T) { + TestingT(t) +} + +var _ = Suite(&testMiscSuite{}) + +type testMiscSuite struct { +} + +func (s *testMiscSuite) TestCompatibleParseGCTime(c *C) { + values := []string{ + "20181218-19:53:37 +0800 CST", + "20181218-19:53:37 +0800 MST", + "20181218-19:53:37 +0800 FOO", + "20181218-19:53:37 +0800 +08", + "20181218-19:53:37 +0800", + "20181218-19:53:37 +0800 ", + "20181218-11:53:37 +0000", + } + + invalidValues := []string{ + "", + " ", + "foo", + "20181218-11:53:37", + "20181218-19:53:37 +0800CST", + "20181218-19:53:37 +0800 FOO BAR", + "20181218-19:53:37 +0800FOOOOOOO BAR", + "20181218-19:53:37 ", + } + + expectedTime := time.Date(2018, 12, 18, 11, 53, 37, 0, time.UTC) + expectedTimeFormatted := "20181218-19:53:37 +0800" + + beijing, err := time.LoadLocation("Asia/Shanghai") + c.Assert(err, IsNil) + + for _, value := range values { + t, err := CompatibleParseGCTime(value) + c.Assert(err, IsNil) + c.Assert(t.Equal(expectedTime), Equals, true) + + formatted := t.In(beijing).Format(GCTimeFormat) + c.Assert(formatted, Equals, expectedTimeFormatted) + } + + for _, value := range invalidValues { + _, err := CompatibleParseGCTime(value) + c.Assert(err, NotNil) + } +} diff --git a/store/tikv/util/rate_limit.go b/store/tikv/util/rate_limit.go new file mode 100644 index 0000000000000..04aa1f3b89e47 --- /dev/null +++ b/store/tikv/util/rate_limit.go @@ -0,0 +1,52 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +// RateLimit wraps a fix sized channel to control concurrency. +type RateLimit struct { + capacity int + token chan struct{} +} + +// NewRateLimit creates a limit controller with capacity n. +func NewRateLimit(n int) *RateLimit { + return &RateLimit{ + capacity: n, + token: make(chan struct{}, n), + } +} + +// GetToken acquires a token. +func (r *RateLimit) GetToken(done <-chan struct{}) (exit bool) { + select { + case <-done: + return true + case r.token <- struct{}{}: + return false + } +} + +// PutToken puts a token back. +func (r *RateLimit) PutToken() { + select { + case <-r.token: + default: + panic("put a redundant token") + } +} + +// GetCapacity returns the token capacity. +func (r *RateLimit) GetCapacity() int { + return r.capacity +} diff --git a/store/tikv/util/rate_limit_test.go b/store/tikv/util/rate_limit_test.go new file mode 100644 index 0000000000000..29f4a72b75e0f --- /dev/null +++ b/store/tikv/util/rate_limit_test.go @@ -0,0 +1,46 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import ( + "time" + + . "github.com/pingcap/check" +) + +func (s *testMiscSuite) TestRateLimit(c *C) { + done := make(chan struct{}, 1) + rl := NewRateLimit(1) + c.Assert(rl.PutToken, PanicMatches, "put a redundant token") + exit := rl.GetToken(done) + c.Assert(exit, Equals, false) + rl.PutToken() + c.Assert(rl.PutToken, PanicMatches, "put a redundant token") + + exit = rl.GetToken(done) + c.Assert(exit, Equals, false) + done <- struct{}{} + exit = rl.GetToken(done) // blocked but exit + c.Assert(exit, Equals, true) + + sig := make(chan int, 1) + go func() { + exit = rl.GetToken(done) // blocked + c.Assert(exit, Equals, false) + close(sig) + }() + time.Sleep(200 * time.Millisecond) + rl.PutToken() + <-sig +} diff --git a/store/tikv/util/ts_set.go b/store/tikv/util/ts_set.go new file mode 100644 index 0000000000000..798772dd84c54 --- /dev/null +++ b/store/tikv/util/ts_set.go @@ -0,0 +1,52 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util + +import "sync" + +// TSSet is a set of timestamps. +type TSSet struct { + sync.RWMutex + m map[uint64]struct{} +} + +// NewTSSet creates a set to store timestamps. +func NewTSSet(capacity int) *TSSet { + return &TSSet{ + m: make(map[uint64]struct{}, capacity), + } +} + +// Put puts timestamps into the map. +func (s *TSSet) Put(tss ...uint64) { + s.Lock() + defer s.Unlock() + for _, ts := range tss { + s.m[ts] = struct{}{} + } +} + +// GetAll returns all timestamps in the set. +func (s *TSSet) GetAll() []uint64 { + s.RLock() + defer s.RUnlock() + if len(s.m) == 0 { + return nil + } + ret := make([]uint64, 0, len(s.m)) + for ts := range s.m { + ret = append(ret, ts) + } + return ret +} diff --git a/structure/structure.go b/structure/structure.go index dce4ff8dd7204..e46160c71d599 100644 --- a/structure/structure.go +++ b/structure/structure.go @@ -14,20 +14,20 @@ package structure import ( - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" + "github.com/pingcap/tidb/util/dbterror" ) var ( // ErrInvalidHashKeyFlag used by structure - ErrInvalidHashKeyFlag = terror.ClassStructure.New(mysql.ErrInvalidHashKeyFlag, mysql.MySQLErrName[mysql.ErrInvalidHashKeyFlag]) + ErrInvalidHashKeyFlag = dbterror.ClassStructure.NewStd(mysql.ErrInvalidHashKeyFlag) // ErrInvalidListIndex used by structure - ErrInvalidListIndex = terror.ClassStructure.New(mysql.ErrInvalidListIndex, mysql.MySQLErrName[mysql.ErrInvalidListIndex]) + ErrInvalidListIndex = dbterror.ClassStructure.NewStd(mysql.ErrInvalidListIndex) // ErrInvalidListMetaData used by structure - ErrInvalidListMetaData = terror.ClassStructure.New(mysql.ErrInvalidListMetaData, mysql.MySQLErrName[mysql.ErrInvalidListMetaData]) + ErrInvalidListMetaData = dbterror.ClassStructure.NewStd(mysql.ErrInvalidListMetaData) // ErrWriteOnSnapshot used by structure - ErrWriteOnSnapshot = terror.ClassStructure.New(mysql.ErrWriteOnSnapshot, mysql.MySQLErrName[mysql.ErrWriteOnSnapshot]) + ErrWriteOnSnapshot = dbterror.ClassStructure.NewStd(mysql.ErrWriteOnSnapshot) ) // NewStructure creates a TxStructure with Retriever, RetrieverMutator and key prefix. diff --git a/structure/structure_test.go b/structure/structure_test.go index 487826be70a25..000ed6e611154 100644 --- a/structure/structure_test.go +++ b/structure/structure_test.go @@ -53,7 +53,6 @@ func (s *testTxStructureSuite) TearDownSuite(c *C) { func (s *testTxStructureSuite) TestString(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() tx := structure.NewStructure(txn, txn, []byte{0x00}) @@ -102,7 +101,6 @@ func (s *testTxStructureSuite) TestString(c *C) { func (s *testTxStructureSuite) TestList(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() tx := structure.NewStructure(txn, txn, []byte{0x00}) @@ -210,7 +208,6 @@ func (s *testTxStructureSuite) TestList(c *C) { func (s *testTxStructureSuite) TestHash(c *C) { txn, err := s.store.Begin() c.Assert(err, IsNil) - defer txn.Rollback() tx := structure.NewStructure(txn, txn, []byte{0x00}) @@ -385,7 +382,7 @@ func (s *testTxStructureSuite) TestHash(c *C) { err = txn.Commit(context.Background()) c.Assert(err, IsNil) - err = kv.RunInNewTxn(s.store, false, func(txn kv.Transaction) error { + err = kv.RunInNewTxn(context.Background(), s.store, false, func(ctx context.Context, txn kv.Transaction) error { t := structure.NewStructure(txn, txn, []byte{0x00}) err = t.Set(key, []byte("abc")) c.Assert(err, IsNil) diff --git a/table/column.go b/table/column.go index 783be21341d7e..a55ad384d4cd3 100644 --- a/table/column.go +++ b/table/column.go @@ -158,6 +158,80 @@ func handleWrongUtf8Value(ctx sessionctx.Context, col *model.ColumnInfo, casted return truncateVal, err } +func handleZeroDatetime(ctx sessionctx.Context, col *model.ColumnInfo, casted types.Datum, str string, tmIsInvalid bool) (types.Datum, bool, error) { + sc := ctx.GetSessionVars().StmtCtx + tm := casted.GetMysqlTime() + mode := ctx.GetSessionVars().SQLMode + + var ( + zeroV types.Time + zeroT string + ) + switch col.Tp { + case mysql.TypeDate: + zeroV, zeroT = types.ZeroDate, types.DateStr + case mysql.TypeDatetime: + zeroV, zeroT = types.ZeroDatetime, types.DateTimeStr + case mysql.TypeTimestamp: + zeroV, zeroT = types.ZeroTimestamp, types.TimestampStr + } + + // ref https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sqlmode_no_zero_date + // if NO_ZERO_DATE is not enabled, '0000-00-00' is permitted and inserts produce no warning + // if NO_ZERO_DATE is enabled, '0000-00-00' is permitted and inserts produce a warning + // If NO_ZERO_DATE mode and strict mode are enabled, '0000-00-00' is not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, '0000-00-00' is permitted and inserts produce a warning. + // if NO_ZERO_IN_DATE is not enabled, dates with zero parts are permitted and inserts produce no warning + // if NO_ZERO_IN_DATE is enabled, dates with zero parts are inserted as '0000-00-00' and produce a warning + // If NO_ZERO_IN_DATE mode and strict mode are enabled, dates with zero parts are not permitted and inserts produce an error, unless IGNORE is given as well. For INSERT IGNORE and UPDATE IGNORE, dates with zero parts are inserted as '0000-00-00' and produce a warning. + + ignoreErr := sc.DupKeyAsWarning + + // in MySQL 8.0, the Timestamp's case is different to Datetime/Date, as shown below: + // + // | | NZD | NZD|ST | ELSE | ELSE|ST | + // | ------------ | ----------------- | ------- | ----------------- | -------- | + // | `0000-00-01` | Success + Warning | Error | Success + Warning | Error | + // | `0000-00-00` | Success + Warning | Error | Success | Success | + // + // * **NZD**: NO_ZERO_DATE_MODE + // * **ST**: STRICT_TRANS_TABLES + // * **ELSE**: empty or NO_ZERO_IN_DATE_MODE + if tm.IsZero() && col.Tp == mysql.TypeTimestamp { + innerErr := types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + if mode.HasStrictMode() && !ignoreErr && (tmIsInvalid || mode.HasNoZeroDateMode()) { + return types.NewDatum(zeroV), true, innerErr + } + + if tmIsInvalid || mode.HasNoZeroDateMode() { + sc.AppendWarning(innerErr) + } + return types.NewDatum(zeroV), true, nil + } else if tm.IsZero() || tm.InvalidZero() { + if tm.IsZero() { + if !mode.HasNoZeroDateMode() { + return types.NewDatum(zeroV), true, nil + } + } else if tm.InvalidZero() { + if !mode.HasNoZeroInDateMode() { + return casted, true, nil + } + } + + innerErr := types.ErrWrongValue.GenWithStackByArgs(zeroT, str) + if mode.HasStrictMode() && !ignoreErr { + return types.NewDatum(zeroV), true, innerErr + } + + // TODO: as in MySQL 8.0's implement, warning message is `types.ErrWarnDataOutOfRange`, + // but this error message need a `rowIdx` argument, in this context, the `rowIdx` is missing. + // And refactor this function seems too complicated, so we set the warning message the same to error's. + sc.AppendWarning(innerErr) + return types.NewDatum(zeroV), true, nil + } + + return casted, false, nil +} + // CastValue casts a value based on column type. // If forceIgnoreTruncate is true, truncated errors will be ignored. // If returnOverflow is true, don't handle overflow errors in this function. @@ -165,11 +239,11 @@ func handleWrongUtf8Value(ctx sessionctx.Context, col *model.ColumnInfo, casted // Set it to true only in FillVirtualColumnValue and UnionScanExec.Next() // If the handle of err is changed latter, the behavior of forceIgnoreTruncate also need to change. // TODO: change the third arg to TypeField. Not pass ColumnInfo. -func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, returnOverflow, forceIgnoreTruncate bool) (casted types.Datum, err error) { +func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, returnErr, forceIgnoreTruncate bool) (casted types.Datum, err error) { sc := ctx.GetSessionVars().StmtCtx casted, err = val.ConvertTo(sc, &col.FieldType) // TODO: make sure all truncate errors are handled by ConvertTo. - if returnOverflow && types.ErrOverflow.Equal(err) { + if returnErr && err != nil { return casted, err } if err != nil && types.ErrTruncated.Equal(err) && col.Tp != mysql.TypeSet && col.Tp != mysql.TypeEnum { @@ -177,10 +251,17 @@ func CastValue(ctx sessionctx.Context, val types.Datum, col *model.ColumnInfo, r if err1 != nil { logutil.BgLogger().Warn("Datum ToString failed", zap.Stringer("Datum", val), zap.Error(err1)) } - err = sc.HandleTruncate(types.ErrTruncatedWrongVal.GenWithStackByArgs(col.FieldType.CompactStr(), str)) - } else { - err = sc.HandleTruncate(err) + err = types.ErrTruncatedWrongVal.GenWithStackByArgs(col.FieldType.CompactStr(), str) + } else if (sc.InInsertStmt || sc.InUpdateStmt) && !casted.IsNull() && + (val.Kind() != types.KindMysqlTime || !val.GetMysqlTime().IsZero()) && + (col.Tp == mysql.TypeDate || col.Tp == mysql.TypeDatetime || col.Tp == mysql.TypeTimestamp) { + if innCasted, exit, innErr := handleZeroDatetime(ctx, col, casted, val.GetString(), types.ErrWrongValue.Equal(err)); exit { + return innCasted, innErr + } } + + err = sc.HandleTruncate(err) + if forceIgnoreTruncate { err = nil } else if err != nil { @@ -295,8 +376,8 @@ func NewColDesc(col *Column) *ColDesc { if mysql.HasAutoIncrementFlag(col.Flag) { extra = "auto_increment" } else if mysql.HasOnUpdateNowFlag(col.Flag) { - //in order to match the rules of mysql 8.0.16 version - //see https://github.com/pingcap/tidb/issues/10337 + // in order to match the rules of mysql 8.0.16 version + // see https://github.com/pingcap/tidb/issues/10337 extra = "DEFAULT_GENERATED on update CURRENT_TIMESTAMP" + OptionalFsp(&col.FieldType) } else if col.IsGenerated() { if col.GeneratedStored { @@ -502,14 +583,14 @@ func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo) (t } vars := ctx.GetSessionVars() sc := vars.StmtCtx - if sc.BadNullAsWarning { - sc.AppendWarning(ErrColumnCantNull.FastGenByArgs(col.Name)) - return GetZeroValue(col), nil - } if !vars.StrictSQLMode { sc.AppendWarning(ErrNoDefaultValue.FastGenByArgs(col.Name)) return GetZeroValue(col), nil } + if sc.BadNullAsWarning { + sc.AppendWarning(ErrColumnCantNull.FastGenByArgs(col.Name)) + return GetZeroValue(col), nil + } return types.Datum{}, ErrNoDefaultValue.FastGenByArgs(col.Name) } @@ -517,12 +598,14 @@ func getColDefaultValueFromNil(ctx sessionctx.Context, col *model.ColumnInfo) (t func GetZeroValue(col *model.ColumnInfo) types.Datum { var d types.Datum switch col.Tp { - case mysql.TypeTiny, mysql.TypeInt24, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear: + case mysql.TypeTiny, mysql.TypeInt24, mysql.TypeShort, mysql.TypeLong, mysql.TypeLonglong: if mysql.HasUnsignedFlag(col.Flag) { d.SetUint64(0) } else { d.SetInt64(0) } + case mysql.TypeYear: + d.SetInt64(0) case mysql.TypeFloat: d.SetFloat32(0) case mysql.TypeDouble: @@ -537,10 +620,8 @@ func GetZeroValue(col *model.ColumnInfo) types.Datum { } else { d.SetString("", col.Collate) } - case mysql.TypeVarString, mysql.TypeVarchar: + case mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: d.SetString("", col.Collate) - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - d.SetBytes([]byte{}) case mysql.TypeDuration: d.SetMysqlDuration(types.ZeroDuration) case mysql.TypeDate: diff --git a/table/column_test.go b/table/column_test.go index 8b1084aae0bcf..5f1646c807f6d 100644 --- a/table/column_test.go +++ b/table/column_test.go @@ -104,12 +104,16 @@ func (t *testTableSuite) TestCheck(c *C) { col := newCol("a") col.Flag = mysql.AutoIncrementFlag cols := []*Column{col, col} - CheckOnce(cols) + err := CheckOnce(cols) + c.Assert(err, NotNil) cols = cols[:1] - CheckNotNull(cols, types.MakeDatums(nil)) + err = CheckNotNull(cols, types.MakeDatums(nil)) + c.Assert(err, IsNil) cols[0].Flag |= mysql.NotNullFlag - CheckNotNull(cols, types.MakeDatums(nil)) - CheckOnce([]*Column{}) + err = CheckNotNull(cols, types.MakeDatums(nil)) + c.Assert(err, NotNil) + err = CheckOnce([]*Column{}) + c.Assert(err, IsNil) } func (t *testTableSuite) TestHandleBadNull(c *C) { @@ -187,7 +191,7 @@ func (t *testTableSuite) TestGetZeroValue(c *C) { }, { types.NewFieldType(mysql.TypeBlob), - types.NewBytesDatum([]byte{}), + types.NewStringDatum(""), }, { types.NewFieldType(mysql.TypeDuration), diff --git a/table/index.go b/table/index.go index b5059beece5ec..5a9f32fbbfd3f 100644 --- a/table/index.go +++ b/table/index.go @@ -64,9 +64,9 @@ type Index interface { // Meta returns IndexInfo. Meta() *model.IndexInfo // Create supports insert into statement. - Create(ctx sessionctx.Context, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle, opts ...CreateIdxOptFunc) (kv.Handle, error) + Create(ctx sessionctx.Context, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle, handleRestoreData []types.Datum, opts ...CreateIdxOptFunc) (kv.Handle, error) // Delete supports delete from statement. - Delete(sc *stmtctx.StatementContext, m kv.Mutator, indexedValues []types.Datum, h kv.Handle) error + Delete(sc *stmtctx.StatementContext, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle) error // Drop supports drop table, drop index statements. Drop(us kv.UnionStore) error // Exist supports check index exists or not. diff --git a/table/table.go b/table/table.go index 938deaa840fe6..b39304adcaaa6 100644 --- a/table/table.go +++ b/table/table.go @@ -22,23 +22,23 @@ import ( "github.com/opentracing/opentracing-go" "github.com/pingcap/parser/model" - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/types" + "github.com/pingcap/tidb/util/dbterror" ) // Type , the type of table, store data in different ways. type Type int16 const ( - // NormalTable , store data in tikv, mocktikv and so on. + // NormalTable stores data in tikv, mocktikv and so on. NormalTable Type = iota - // VirtualTable , store no data, just extract data from the memory struct. + // VirtualTable stores no data, just extract data from the memory struct. VirtualTable - // ClusterTable , contain the `VirtualTable` in the all cluster tidb nodes. + // ClusterTable contains the `VirtualTable` in the all cluster tidb nodes. ClusterTable ) @@ -57,53 +57,46 @@ func (tp Type) IsClusterTable() bool { return tp == ClusterTable } -const ( - // DirtyTableAddRow is the constant for dirty table operation type. - DirtyTableAddRow = iota - // DirtyTableDeleteRow is the constant for dirty table operation type. - DirtyTableDeleteRow -) - var ( // ErrColumnCantNull is used for inserting null to a not null column. - ErrColumnCantNull = terror.ClassTable.New(mysql.ErrBadNull, mysql.MySQLErrName[mysql.ErrBadNull]) + ErrColumnCantNull = dbterror.ClassTable.NewStd(mysql.ErrBadNull) // ErrUnknownColumn is returned when accessing an unknown column. - ErrUnknownColumn = terror.ClassTable.New(mysql.ErrBadField, mysql.MySQLErrName[mysql.ErrBadField]) - errDuplicateColumn = terror.ClassTable.New(mysql.ErrFieldSpecifiedTwice, mysql.MySQLErrName[mysql.ErrFieldSpecifiedTwice]) + ErrUnknownColumn = dbterror.ClassTable.NewStd(mysql.ErrBadField) + errDuplicateColumn = dbterror.ClassTable.NewStd(mysql.ErrFieldSpecifiedTwice) - errGetDefaultFailed = terror.ClassTable.New(mysql.ErrFieldGetDefaultFailed, mysql.MySQLErrName[mysql.ErrFieldGetDefaultFailed]) + errGetDefaultFailed = dbterror.ClassTable.NewStd(mysql.ErrFieldGetDefaultFailed) // ErrNoDefaultValue is used when insert a row, the column value is not given, and the column has not null flag // and it doesn't have a default value. - ErrNoDefaultValue = terror.ClassTable.New(mysql.ErrNoDefaultForField, mysql.MySQLErrName[mysql.ErrNoDefaultForField]) + ErrNoDefaultValue = dbterror.ClassTable.NewStd(mysql.ErrNoDefaultForField) // ErrIndexOutBound returns for index column offset out of bound. - ErrIndexOutBound = terror.ClassTable.New(mysql.ErrIndexOutBound, mysql.MySQLErrName[mysql.ErrIndexOutBound]) + ErrIndexOutBound = dbterror.ClassTable.NewStd(mysql.ErrIndexOutBound) // ErrUnsupportedOp returns for unsupported operation. - ErrUnsupportedOp = terror.ClassTable.New(mysql.ErrUnsupportedOp, mysql.MySQLErrName[mysql.ErrUnsupportedOp]) + ErrUnsupportedOp = dbterror.ClassTable.NewStd(mysql.ErrUnsupportedOp) // ErrRowNotFound returns for row not found. - ErrRowNotFound = terror.ClassTable.New(mysql.ErrRowNotFound, mysql.MySQLErrName[mysql.ErrRowNotFound]) + ErrRowNotFound = dbterror.ClassTable.NewStd(mysql.ErrRowNotFound) // ErrTableStateCantNone returns for table none state. - ErrTableStateCantNone = terror.ClassTable.New(mysql.ErrTableStateCantNone, mysql.MySQLErrName[mysql.ErrTableStateCantNone]) + ErrTableStateCantNone = dbterror.ClassTable.NewStd(mysql.ErrTableStateCantNone) // ErrColumnStateCantNone returns for column none state. - ErrColumnStateCantNone = terror.ClassTable.New(mysql.ErrColumnStateCantNone, mysql.MySQLErrName[mysql.ErrColumnStateCantNone]) + ErrColumnStateCantNone = dbterror.ClassTable.NewStd(mysql.ErrColumnStateCantNone) // ErrColumnStateNonPublic returns for column non-public state. - ErrColumnStateNonPublic = terror.ClassTable.New(mysql.ErrColumnStateNonPublic, mysql.MySQLErrName[mysql.ErrColumnStateNonPublic]) + ErrColumnStateNonPublic = dbterror.ClassTable.NewStd(mysql.ErrColumnStateNonPublic) // ErrIndexStateCantNone returns for index none state. - ErrIndexStateCantNone = terror.ClassTable.New(mysql.ErrIndexStateCantNone, mysql.MySQLErrName[mysql.ErrIndexStateCantNone]) + ErrIndexStateCantNone = dbterror.ClassTable.NewStd(mysql.ErrIndexStateCantNone) // ErrInvalidRecordKey returns for invalid record key. - ErrInvalidRecordKey = terror.ClassTable.New(mysql.ErrInvalidRecordKey, mysql.MySQLErrName[mysql.ErrInvalidRecordKey]) + ErrInvalidRecordKey = dbterror.ClassTable.NewStd(mysql.ErrInvalidRecordKey) // ErrTruncatedWrongValueForField returns for truncate wrong value for field. - ErrTruncatedWrongValueForField = terror.ClassTable.New(mysql.ErrTruncatedWrongValueForField, mysql.MySQLErrName[mysql.ErrTruncatedWrongValueForField]) + ErrTruncatedWrongValueForField = dbterror.ClassTable.NewStd(mysql.ErrTruncatedWrongValueForField) // ErrUnknownPartition returns unknown partition error. - ErrUnknownPartition = terror.ClassTable.New(mysql.ErrUnknownPartition, mysql.MySQLErrName[mysql.ErrUnknownPartition]) + ErrUnknownPartition = dbterror.ClassTable.NewStd(mysql.ErrUnknownPartition) // ErrNoPartitionForGivenValue returns table has no partition for value. - ErrNoPartitionForGivenValue = terror.ClassTable.New(mysql.ErrNoPartitionForGivenValue, mysql.MySQLErrName[mysql.ErrNoPartitionForGivenValue]) + ErrNoPartitionForGivenValue = dbterror.ClassTable.NewStd(mysql.ErrNoPartitionForGivenValue) // ErrLockOrActiveTransaction returns when execute unsupported statement in a lock session or an active transaction. - ErrLockOrActiveTransaction = terror.ClassTable.New(mysql.ErrLockOrActiveTransaction, mysql.MySQLErrName[mysql.ErrLockOrActiveTransaction]) + ErrLockOrActiveTransaction = dbterror.ClassTable.NewStd(mysql.ErrLockOrActiveTransaction) // ErrSequenceHasRunOut returns when sequence has run out. - ErrSequenceHasRunOut = terror.ClassTable.New(mysql.ErrSequenceRunOut, mysql.MySQLErrName[mysql.ErrSequenceRunOut]) + ErrSequenceHasRunOut = dbterror.ClassTable.NewStd(mysql.ErrSequenceRunOut) // ErrRowDoesNotMatchGivenPartitionSet returns when the destination partition conflict with the partition selection. - ErrRowDoesNotMatchGivenPartitionSet = terror.ClassTable.NewStd(mysql.ErrRowDoesNotMatchGivenPartitionSet) + ErrRowDoesNotMatchGivenPartitionSet = dbterror.ClassTable.NewStd(mysql.ErrRowDoesNotMatchGivenPartitionSet) ) // RecordIterFunc is used for low-level record iteration. @@ -144,17 +137,7 @@ func (i isUpdate) ApplyOn(opt *AddRecordOpt) { opt.IsUpdate = true } -// Table is used to retrieve and modify rows in table. -type Table interface { - // IterRecords iterates records in the table and calls fn. - IterRecords(ctx sessionctx.Context, startKey kv.Key, cols []*Column, fn RecordIterFunc) error - - // RowWithCols returns a row that contains the given cols. - RowWithCols(ctx sessionctx.Context, h kv.Handle, cols []*Column) ([]types.Datum, error) - - // Row returns a row for all columns. - Row(ctx sessionctx.Context, h kv.Handle) ([]types.Datum, error) - +type columnAPI interface { // Cols returns the columns of the table which is used in select, including hidden columns. Cols() []*Column @@ -170,28 +153,19 @@ type Table interface { // FullHiddenColsAndVisibleCols returns hidden columns in all states and unhidden columns in public states. FullHiddenColsAndVisibleCols() []*Column +} + +// Table is used to retrieve and modify rows in table. +type Table interface { + columnAPI // Indices returns the indices of the table. + // The caller must be aware of that not all the returned indices are public. Indices() []Index - // WritableIndices returns write-only and public indices of the table. - WritableIndices() []Index - - // DeletableIndices returns delete-only, write-only and public indices of the table. - DeletableIndices() []Index - // RecordPrefix returns the record key prefix. RecordPrefix() kv.Key - // IndexPrefix returns the index key prefix. - IndexPrefix() kv.Key - - // FirstKey returns the first key. - FirstKey() kv.Key - - // RecordKey returns the key in KV storage for the row. - RecordKey(h kv.Handle) kv.Key - // AddRecord inserts a row which should contain only public columns AddRecord(ctx sessionctx.Context, r []types.Datum, opts ...AddRecordOption) (recordID kv.Handle, err error) @@ -212,9 +186,6 @@ type Table interface { // Meta returns TableInfo. Meta() *model.TableInfo - // Seek returns the handle greater or equal to h. - Seek(ctx sessionctx.Context, h kv.Handle) (handle kv.Handle, found bool, err error) - // Type returns the type of table Type() Type } @@ -227,7 +198,7 @@ func AllocAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Conte } increment := sctx.GetSessionVars().AutoIncrementIncrement offset := sctx.GetSessionVars().AutoIncrementOffset - _, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(t.Meta().ID, uint64(1), int64(increment), int64(offset)) + _, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(ctx, t.Meta().ID, uint64(1), int64(increment), int64(offset)) if err != nil { return 0, err } @@ -237,13 +208,9 @@ func AllocAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Conte // AllocBatchAutoIncrementValue allocates batch auto_increment value for rows, returning firstID, increment and err. // The caller can derive the autoID by adding increment to firstID for N-1 times. func AllocBatchAutoIncrementValue(ctx context.Context, t Table, sctx sessionctx.Context, N int) (firstID int64, increment int64, err error) { - if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { - span1 := span.Tracer().StartSpan("table.AllocBatchAutoIncrementValue", opentracing.ChildOf(span.Context())) - defer span1.Finish() - } increment = int64(sctx.GetSessionVars().AutoIncrementIncrement) offset := int64(sctx.GetSessionVars().AutoIncrementOffset) - min, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(t.Meta().ID, uint64(N), increment, offset) + min, max, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(ctx, t.Meta().ID, uint64(N), increment, offset) if err != nil { return min, max, err } @@ -267,6 +234,7 @@ type PartitionedTable interface { Table GetPartition(physicalID int64) PhysicalTable GetPartitionByRow(sessionctx.Context, []types.Datum) (PhysicalTable, error) + GetAllPartitionIDs() []int64 } // TableFromMeta builds a table.Table from *model.TableInfo. diff --git a/table/tables/index.go b/table/tables/index.go index 37abff8770f31..2fd978383b12a 100644 --- a/table/tables/index.go +++ b/table/tables/index.go @@ -16,6 +16,7 @@ package tables import ( "context" "io" + "time" "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" @@ -27,14 +28,16 @@ import ( "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" - "github.com/pingcap/tidb/util/codec" + "github.com/pingcap/tidb/util/rowcodec" ) // indexIter is for KV store index iterator. type indexIter struct { - it kv.Iterator - idx *index - prefix kv.Key + it kv.Iterator + idx *index + prefix kv.Key + colInfos []rowcodec.ColInfo + tps []*types.FieldType } // Close does the clean up works when KV store index iterator is closed. @@ -46,61 +49,58 @@ func (c *indexIter) Close() { } // Next returns current key and moves iterator to the next step. -func (c *indexIter) Next() (val []types.Datum, h kv.Handle, err error) { +func (c *indexIter) Next() (indexData []types.Datum, h kv.Handle, err error) { if !c.it.Valid() { return nil, nil, errors.Trace(io.EOF) } if !c.it.Key().HasPrefix(c.prefix) { return nil, nil, errors.Trace(io.EOF) } - // get indexedValues - buf := c.it.Key()[len(c.prefix):] - vv, err := codec.Decode(buf, len(c.idx.idxInfo.Columns)) + vals, err := tablecodec.DecodeIndexKV(c.it.Key(), c.it.Value(), len(c.colInfos), tablecodec.HandleNotNeeded, c.colInfos) if err != nil { - return nil, nil, err + return nil, nil, errors.Trace(err) } - if len(vv) > len(c.idx.idxInfo.Columns) { - h = kv.IntHandle(vv[len(vv)-1].GetInt64()) - val = vv[0 : len(vv)-1] - } else { - // If the index is unique and the value isn't nil, the handle is in value. - h, err = tablecodec.DecodeHandleInUniqueIndexValue(c.it.Value(), c.idx.tblInfo.IsCommonHandle) + handle, err := tablecodec.DecodeIndexHandle(c.it.Key(), c.it.Value(), len(c.colInfos)) + if err != nil { + return nil, nil, errors.Trace(err) + } + for i, v := range vals { + d, err := tablecodec.DecodeColumnValue(v, c.tps[i], time.Local) if err != nil { - return nil, nil, err + return nil, nil, errors.Trace(err) } - val = vv + indexData = append(indexData, d) } // update new iter to next err = c.it.Next() if err != nil { return nil, nil, err } - return + return indexData, handle, nil } // index is the data structure for index data in the KV store. type index struct { - idxInfo *model.IndexInfo - tblInfo *model.TableInfo - prefix kv.Key - containNonBinaryString bool - phyTblID int64 + idxInfo *model.IndexInfo + tblInfo *model.TableInfo + prefix kv.Key + needRestoredData bool + phyTblID int64 } -// ContainsNonBinaryString checks whether the index columns contains non binary string column, the input -// colInfos should be column info correspond to the table contains the index. -func ContainsNonBinaryString(idxCols []*model.IndexColumn, colInfos []*model.ColumnInfo) bool { +// NeedRestoredData checks whether the index columns needs restored data. +func NeedRestoredData(idxCols []*model.IndexColumn, colInfos []*model.ColumnInfo) bool { for _, idxCol := range idxCols { col := colInfos[idxCol.Offset] - if col.EvalType() == types.ETString && !mysql.HasBinaryFlag(col.Flag) { + if types.NeedRestoredData(&col.FieldType) { return true } } return false } -func (c *index) checkContainNonBinaryString() bool { - return ContainsNonBinaryString(c.idxInfo.Columns, c.tblInfo.Columns) +func (c *index) checkNeedRestoredData() bool { + return NeedRestoredData(c.idxInfo.Columns, c.tblInfo.Columns) } // NewIndex builds a new Index object. @@ -120,7 +120,7 @@ func NewIndex(physicalID int64, tblInfo *model.TableInfo, indexInfo *model.Index prefix: prefix, phyTblID: physicalID, } - index.containNonBinaryString = index.checkContainNonBinaryString() + index.needRestoredData = index.checkNeedRestoredData() return index } @@ -142,43 +142,9 @@ func (c *index) GenIndexKey(sc *stmtctx.StatementContext, indexedValues []types. // Create creates a new entry in the kvIndex data. // If the index is unique and there is an existing entry with the same key, // Create will return the existing entry's handle as the first return value, ErrKeyExists as the second return value. -// Value layout: -// +--New Encoding (with restore data, or common handle, or index is global) -// | -// | Layout: TailLen | Options | Padding | [IntHandle] | [UntouchedFlag] -// | Length: 1 | len(options) | len(padding) | 8 | 1 -// | -// | TailLen: len(padding) + len(IntHandle) + len(UntouchedFlag) -// | Options: Encode some value for new features, such as common handle, new collations or global index. -// | See below for more information. -// | Padding: Ensure length of value always >= 10. (or >= 11 if UntouchedFlag exists.) -// | IntHandle: Only exists when table use int handles and index is unique. -// | UntouchedFlag: Only exists when index is untouched. -// | -// | Layout of Options: -// | -// | Segment: Common Handle | Global Index | New Collation -// | Layout: CHandle Flag | CHandle Len | CHandle | PidFlag | PartitionID | restoreData -// | Length: 1 | 2 | len(CHandle) | 1 | 8 | len(restoreData) -// | -// | Common Handle Segment: Exists when unique index used common handles. -// | Global Index Segment: Exists when index is global. -// | New Collation Segment: Exists when new collation is used and index contains non-binary string. -// | -// +--Old Encoding (without restore data, integer handle, local) -// -// Layout: [Handle] | [UntouchedFlag] -// Length: 8 | 1 -// -// Handle: Only exists in unique index. -// UntouchedFlag: Only exists when index is untouched. -// -// If neither Handle nor UntouchedFlag exists, value will be one single byte '0' (i.e. []byte{'0'}). -// Length of value <= 9, use to distinguish from the new encoding. -// -func (c *index) Create(sctx sessionctx.Context, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle, opts ...table.CreateIdxOptFunc) (kv.Handle, error) { +func (c *index) Create(sctx sessionctx.Context, txn kv.Transaction, indexedValues []types.Datum, h kv.Handle, handleRestoreData []types.Datum, opts ...table.CreateIdxOptFunc) (kv.Handle, error) { if c.Meta().Unique { - us.CacheTableInfo(c.phyTblID, c.tblInfo) + txn.CacheTableInfo(c.phyTblID, c.tblInfo) } var opt table.CreateIdxOpt for _, fn := range opts { @@ -209,12 +175,12 @@ func (c *index) Create(sctx sessionctx.Context, us kv.UnionStore, indexedValues // save the key buffer to reuse. writeBufs.IndexKeyBuf = key - idxVal, err := tablecodec.GenIndexValueNew(sctx.GetSessionVars().StmtCtx, c.tblInfo, c.idxInfo, - c.containNonBinaryString, distinct, opt.Untouched, indexedValues, h, c.phyTblID) + idxVal, err := tablecodec.GenIndexValuePortal(sctx.GetSessionVars().StmtCtx, c.tblInfo, c.idxInfo, c.needRestoredData, distinct, opt.Untouched, indexedValues, h, c.phyTblID, handleRestoreData) if err != nil { return nil, err } + us := txn.GetUnionStore() if !distinct || skipCheck || opt.Untouched { err = us.GetMemBuffer().Set(key, idxVal) return nil, err @@ -255,13 +221,17 @@ func (c *index) Create(sctx sessionctx.Context, us kv.UnionStore, indexedValues return handle, kv.ErrKeyExists } -// Delete removes the entry for handle h and indexdValues from KV index. -func (c *index) Delete(sc *stmtctx.StatementContext, m kv.Mutator, indexedValues []types.Datum, h kv.Handle) error { - key, _, err := c.GenIndexKey(sc, indexedValues, h, nil) +// Delete removes the entry for handle h and indexedValues from KV index. +func (c *index) Delete(sc *stmtctx.StatementContext, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle) error { + key, distinct, err := c.GenIndexKey(sc, indexedValues, h, nil) if err != nil { return err } - err = m.Delete(key) + if distinct { + err = us.GetMemBuffer().DeleteWithFlags(key, kv.SetNeedLocked) + } else { + err = us.GetMemBuffer().Delete(key) + } return err } @@ -307,7 +277,9 @@ func (c *index) Seek(sc *stmtctx.StatementContext, r kv.Retriever, indexedValues if it.Valid() && it.Key().Cmp(key) == 0 { hit = true } - return &indexIter{it: it, idx: c, prefix: c.prefix}, hit, nil + colInfos := BuildRowcodecColInfoForIndexColumns(c.idxInfo, c.tblInfo) + tps := BuildFieldTypesForIndexColumns(c.idxInfo, c.tblInfo) + return &indexIter{it: it, idx: c, prefix: c.prefix, colInfos: colInfos, tps: tps}, hit, nil } // SeekFirst returns an iterator which points to the first entry of the KV index. @@ -317,7 +289,9 @@ func (c *index) SeekFirst(r kv.Retriever) (iter table.IndexIterator, err error) if err != nil { return nil, err } - return &indexIter{it: it, idx: c, prefix: c.prefix}, nil + colInfos := BuildRowcodecColInfoForIndexColumns(c.idxInfo, c.tblInfo) + tps := BuildFieldTypesForIndexColumns(c.idxInfo, c.tblInfo) + return &indexIter{it: it, idx: c, prefix: c.prefix, colInfos: colInfos, tps: tps}, nil } func (c *index) Exist(sc *stmtctx.StatementContext, us kv.UnionStore, indexedValues []types.Datum, h kv.Handle) (bool, kv.Handle, error) { @@ -374,3 +348,54 @@ func FindChangingCol(cols []*table.Column, idxInfo *model.IndexInfo) *table.Colu } return nil } + +// IsIndexWritable check whether the index is writable. +func IsIndexWritable(idx table.Index) bool { + s := idx.Meta().State + if s != model.StateDeleteOnly && s != model.StateDeleteReorganization { + return true + } + return false +} + +// BuildRowcodecColInfoForIndexColumns builds []rowcodec.ColInfo for the given index. +// The result can be used for decoding index key-values. +func BuildRowcodecColInfoForIndexColumns(idxInfo *model.IndexInfo, tblInfo *model.TableInfo) []rowcodec.ColInfo { + colInfo := make([]rowcodec.ColInfo, 0, len(idxInfo.Columns)) + for _, idxCol := range idxInfo.Columns { + col := tblInfo.Columns[idxCol.Offset] + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: col.ID, + IsPKHandle: tblInfo.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), + Ft: rowcodec.FieldTypeFromModelColumn(col), + }) + } + return colInfo +} + +// BuildFieldTypesForIndexColumns builds the index columns field types. +func BuildFieldTypesForIndexColumns(idxInfo *model.IndexInfo, tblInfo *model.TableInfo) []*types.FieldType { + tps := make([]*types.FieldType, 0, len(idxInfo.Columns)) + for _, idxCol := range idxInfo.Columns { + col := tblInfo.Columns[idxCol.Offset] + tps = append(tps, rowcodec.FieldTypeFromModelColumn(col)) + } + return tps +} + +// TryAppendCommonHandleRowcodecColInfos tries to append common handle columns to `colInfo`. +func TryAppendCommonHandleRowcodecColInfos(colInfo []rowcodec.ColInfo, tblInfo *model.TableInfo) []rowcodec.ColInfo { + if !tblInfo.IsCommonHandle || tblInfo.CommonHandleVersion == 0 { + return colInfo + } + if pkIdx := FindPrimaryIndex(tblInfo); pkIdx != nil { + for _, idxCol := range pkIdx.Columns { + col := tblInfo.Columns[idxCol.Offset] + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: col.ID, + Ft: rowcodec.FieldTypeFromModelColumn(col), + }) + } + } + return colInfo +} diff --git a/table/tables/index_test.go b/table/tables/index_test.go index 6279995773893..9345e86bab185 100644 --- a/table/tables/index_test.go +++ b/table/tables/index_test.go @@ -90,7 +90,7 @@ func (s *testIndexSuite) TestIndex(c *C) { values := types.MakeDatums(1, 2) mockCtx := mock.NewContext() - _, err = index.Create(mockCtx, txn.GetUnionStore(), values, kv.IntHandle(1)) + _, err = index.Create(mockCtx, txn, values, kv.IntHandle(1), nil) c.Assert(err, IsNil) it, err := index.SeekFirst(txn) @@ -112,7 +112,7 @@ func (s *testIndexSuite) TestIndex(c *C) { c.Assert(err, IsNil) c.Assert(exist, IsTrue) - err = index.Delete(sc, txn, values, kv.IntHandle(1)) + err = index.Delete(sc, txn.GetUnionStore(), values, kv.IntHandle(1)) c.Assert(err, IsNil) it, err = index.SeekFirst(txn) @@ -122,7 +122,7 @@ func (s *testIndexSuite) TestIndex(c *C) { c.Assert(terror.ErrorEqual(err, io.EOF), IsTrue, Commentf("err %v", err)) it.Close() - _, err = index.Create(mockCtx, txn.GetUnionStore(), values, kv.IntHandle(0)) + _, err = index.Create(mockCtx, txn, values, kv.IntHandle(0), nil) c.Assert(err, IsNil) _, err = index.SeekFirst(txn) @@ -177,10 +177,10 @@ func (s *testIndexSuite) TestIndex(c *C) { txn, err = s.s.Begin() c.Assert(err, IsNil) - _, err = index.Create(mockCtx, txn.GetUnionStore(), values, kv.IntHandle(1)) + _, err = index.Create(mockCtx, txn, values, kv.IntHandle(1), nil) c.Assert(err, IsNil) - _, err = index.Create(mockCtx, txn.GetUnionStore(), values, kv.IntHandle(2)) + _, err = index.Create(mockCtx, txn, values, kv.IntHandle(2), nil) c.Assert(err, NotNil) it, err = index.SeekFirst(txn) @@ -215,7 +215,7 @@ func (s *testIndexSuite) TestIndex(c *C) { // Test the function of Next when the value of unique key is nil. values2 := types.MakeDatums(nil, nil) - _, err = index.Create(mockCtx, txn.GetUnionStore(), values2, kv.IntHandle(2)) + _, err = index.Create(mockCtx, txn, values2, kv.IntHandle(2), nil) c.Assert(err, IsNil) it, err = index.SeekFirst(txn) c.Assert(err, IsNil) @@ -257,7 +257,7 @@ func (s *testIndexSuite) TestCombineIndexSeek(c *C) { mockCtx := mock.NewContext() values := types.MakeDatums("abc", "def") - _, err = index.Create(mockCtx, txn.GetUnionStore(), values, kv.IntHandle(1)) + _, err = index.Create(mockCtx, txn, values, kv.IntHandle(1), nil) c.Assert(err, IsNil) index2 := tables.NewIndex(tblInfo.ID, tblInfo, tblInfo.Indices[0]) @@ -298,12 +298,12 @@ func (s *testIndexSuite) TestSingleColumnCommonHandle(c *C) { for _, idx := range []table.Index{idxUnique, idxNonUnique} { key, _, err := idx.GenIndexKey(sc, idxColVals, commonHandle, nil) c.Assert(err, IsNil) - _, err = idx.Create(mockCtx, txn.GetUnionStore(), idxColVals, commonHandle) + _, err = idx.Create(mockCtx, txn, idxColVals, commonHandle, nil) c.Assert(err, IsNil) val, err := txn.Get(context.Background(), key) c.Assert(err, IsNil) colVals, err := tablecodec.DecodeIndexKV(key, val, 1, tablecodec.HandleDefault, - createRowcodecColInfo(tblInfo, idx.Meta())) + tables.BuildRowcodecColInfoForIndexColumns(idx.Meta(), tblInfo)) c.Assert(err, IsNil) c.Assert(colVals, HasLen, 2) _, d, err := codec.DecodeOne(colVals[0]) @@ -320,7 +320,7 @@ func (s *testIndexSuite) TestSingleColumnCommonHandle(c *C) { unTouchedVal := append([]byte{1}, val[1:]...) unTouchedVal = append(unTouchedVal, kv.UnCommitIndexKVFlag) _, err = tablecodec.DecodeIndexKV(key, unTouchedVal, 1, tablecodec.HandleDefault, - createRowcodecColInfo(tblInfo, idx.Meta())) + tables.BuildRowcodecColInfoForIndexColumns(idx.Meta(), tblInfo)) c.Assert(err, IsNil) } } @@ -338,6 +338,16 @@ func (s *testIndexSuite) TestMultiColumnCommonHandle(c *C) { idxNonUnique = idx } } + var a, b *model.ColumnInfo + for _, col := range tblInfo.Columns { + if col.Name.String() == "a" { + a = col + } else if col.Name.String() == "b" { + b = col + } + } + c.Assert(a, NotNil) + c.Assert(b, NotNil) txn, err := s.s.Begin() c.Assert(err, IsNil) @@ -354,12 +364,22 @@ func (s *testIndexSuite) TestMultiColumnCommonHandle(c *C) { for _, idx := range []table.Index{idxUnique, idxNonUnique} { key, _, err := idx.GenIndexKey(sc, idxColVals, commonHandle, nil) c.Assert(err, IsNil) - _, err = idx.Create(mockCtx, txn.GetUnionStore(), idxColVals, commonHandle) + _, err = idx.Create(mockCtx, txn, idxColVals, commonHandle, nil) c.Assert(err, IsNil) val, err := txn.Get(context.Background(), key) c.Assert(err, IsNil) - colVals, err := tablecodec.DecodeIndexKV(key, val, 1, tablecodec.HandleDefault, - createRowcodecColInfo(tblInfo, idx.Meta())) + colInfo := tables.BuildRowcodecColInfoForIndexColumns(idx.Meta(), tblInfo) + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: a.ID, + IsPKHandle: false, + Ft: rowcodec.FieldTypeFromModelColumn(a), + }) + colInfo = append(colInfo, rowcodec.ColInfo{ + ID: b.ID, + IsPKHandle: false, + Ft: rowcodec.FieldTypeFromModelColumn(b), + }) + colVals, err := tablecodec.DecodeIndexKV(key, val, 1, tablecodec.HandleDefault, colInfo) c.Assert(err, IsNil) c.Assert(colVals, HasLen, 3) _, d, err := codec.DecodeOne(colVals[0]) @@ -385,16 +405,3 @@ func buildTableInfo(c *C, sql string) *model.TableInfo { c.Assert(err, IsNil) return tblInfo } - -func createRowcodecColInfo(table *model.TableInfo, index *model.IndexInfo) []rowcodec.ColInfo { - colInfos := make([]rowcodec.ColInfo, 0, len(index.Columns)) - for _, idxCol := range index.Columns { - col := table.Columns[idxCol.Offset] - colInfos = append(colInfos, rowcodec.ColInfo{ - ID: col.ID, - IsPKHandle: table.PKIsHandle && mysql.HasPriKeyFlag(col.Flag), - Ft: rowcodec.FieldTypeFromModelColumn(col), - }) - } - return colInfos -} diff --git a/table/tables/partition.go b/table/tables/partition.go index bcb5e6a2b28c2..d59df6a02febc 100644 --- a/table/tables/partition.go +++ b/table/tables/partition.go @@ -31,18 +31,20 @@ import ( "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/table" "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/chunk" + "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/logutil" "github.com/pingcap/tidb/util/mock" "go.uber.org/zap" ) // Both partition and partitionedTable implement the table.Table interface. -var _ table.Table = &partition{} +var _ table.PhysicalTable = &partition{} var _ table.Table = &partitionedTable{} // partitionedTable implements the table.PartitionedTable interface. @@ -116,6 +118,8 @@ func newPartitionExpr(tblInfo *model.TableInfo) (*PartitionExpr, error) { return generateRangePartitionExpr(ctx, pi, columns, names) case model.PartitionTypeHash: return generateHashPartitionExpr(ctx, pi, columns, names) + case model.PartitionTypeList: + return generateListPartitionExpr(ctx, tblInfo, columns, names) } panic("cannot reach here") } @@ -134,6 +138,9 @@ type PartitionExpr struct { *ForRangeColumnsPruning // ColOffset is the offsets of partition columns. ColumnOffset []int + // InValues: x in (1,2); x in (3,4); x in (5,6), used for list partition. + InValues []expression.Expression + *ForListPruning } func initEvalBufferType(t *partitionedTable) { @@ -192,6 +199,173 @@ func parseSimpleExprWithNames(p *parser.Parser, ctx sessionctx.Context, exprStr return expression.RewriteSimpleExprWithNames(ctx, exprNode, schema, names) } +// ForListPruning is used for list partition pruning. +type ForListPruning struct { + // LocateExpr uses to locate list partition by row. + LocateExpr expression.Expression + // PruneExpr uses to prune list partition in partition pruner. + PruneExpr expression.Expression + // PruneExprCols is the columns of PruneExpr, it has removed the duplicate columns. + PruneExprCols []*expression.Column + // valueMap is column value -> partition idx, uses to locate list partition. + valueMap map[int64]int + // nullPartitionIdx is the partition idx for null value. + nullPartitionIdx int + + // For list columns partition pruning + ColPrunes []*ForListColumnPruning +} + +// ForListColumnPruning is used for list columns partition pruning. +type ForListColumnPruning struct { + ExprCol *expression.Column + valueTp *types.FieldType + valueMap map[string]ListPartitionLocation +} + +// ListPartitionGroup indicate the group index of the column value in a partition. +type ListPartitionGroup struct { + // Such as: list columns (a,b) (partition p0 values in ((1,5),(1,6))); + // For the column a which value is 1, the ListPartitionGroup is: + // ListPartitionGroup { + // PartIdx: 0, // 0 is the partition p0 index in all partitions. + // GroupIdxs: []int{0,1}, // p0 has 2 value group: (1,5) and (1,6), and they both contain the column a where value is 1; + // } // the value of GroupIdxs `0,1` is the index of the value group that contain the column a which value is 1. + PartIdx int + GroupIdxs []int +} + +// ListPartitionLocation indicate the partition location for the column value in list columns partition. +// Here is an example: +// Suppose the list columns partition is: list columns (a,b) (partition p0 values in ((1,5),(1,6)), partition p1 values in ((1,7),(9,9))); +// How to express the location of the column a which value is 1? +// For the column a which value is 1, both partition p0 and p1 contain the column a which value is 1. +// In partition p0, both value group0 (1,5) and group1 (1,6) are contain the column a which value is 1. +// In partition p1, value group0 (1,7) contains the column a which value is 1. +// So, the ListPartitionLocation of column a which value is 1 is: +// []ListPartitionGroup{ +// { +// PartIdx: 0, // `0` is the partition p0 index in all partitions. +// GroupIdxs: []int{0, 1} // `0,1` is the index of the value group0, group1. +// }, +// { +// PartIdx: 1, // `1` is the partition p1 index in all partitions. +// GroupIdxs: []int{0} // `0` is the index of the value group0. +// }, +// } +type ListPartitionLocation []ListPartitionGroup + +// IsEmpty returns true if the ListPartitionLocation is empty. +func (ps ListPartitionLocation) IsEmpty() bool { + for _, pg := range ps { + if len(pg.GroupIdxs) > 0 { + return false + } + } + return true +} + +func (ps ListPartitionLocation) findByPartitionIdx(partIdx int) int { + for i, p := range ps { + if p.PartIdx == partIdx { + return i + } + } + return -1 +} + +type listPartitionLocationHelper struct { + initialized bool + location ListPartitionLocation +} + +// NewListPartitionLocationHelper returns a new listPartitionLocationHelper. +func NewListPartitionLocationHelper() *listPartitionLocationHelper { + return &listPartitionLocationHelper{} +} + +// GetLocation gets the list partition location. +func (p *listPartitionLocationHelper) GetLocation() ListPartitionLocation { + return p.location +} + +// UnionPartitionGroup unions with the list-partition-value-group. +func (p *listPartitionLocationHelper) UnionPartitionGroup(pg ListPartitionGroup) { + idx := p.location.findByPartitionIdx(pg.PartIdx) + if idx < 0 { + // copy the group idx. + groupIdxs := make([]int, len(pg.GroupIdxs)) + copy(groupIdxs, pg.GroupIdxs) + p.location = append(p.location, ListPartitionGroup{ + PartIdx: pg.PartIdx, + GroupIdxs: groupIdxs, + }) + return + } + p.location[idx].union(pg) +} + +// Union unions with the other location. +func (p *listPartitionLocationHelper) Union(location ListPartitionLocation) { + for _, pg := range location { + p.UnionPartitionGroup(pg) + } +} + +// Intersect intersect with other location. +func (p *listPartitionLocationHelper) Intersect(location ListPartitionLocation) bool { + if !p.initialized { + p.initialized = true + p.location = make([]ListPartitionGroup, 0, len(location)) + p.location = append(p.location, location...) + return true + } + currPgs := p.location + var remainPgs []ListPartitionGroup + for _, pg := range location { + idx := currPgs.findByPartitionIdx(pg.PartIdx) + if idx < 0 { + continue + } + if !currPgs[idx].intersect(pg) { + continue + } + remainPgs = append(remainPgs, currPgs[idx]) + } + p.location = remainPgs + return len(remainPgs) > 0 +} + +func (pg *ListPartitionGroup) intersect(otherPg ListPartitionGroup) bool { + if pg.PartIdx != otherPg.PartIdx { + return false + } + var groupIdxs []int + for _, gidx := range otherPg.GroupIdxs { + if pg.findGroupIdx(gidx) { + groupIdxs = append(groupIdxs, gidx) + } + } + pg.GroupIdxs = groupIdxs + return len(groupIdxs) > 0 +} + +func (pg *ListPartitionGroup) union(otherPg ListPartitionGroup) { + if pg.PartIdx != otherPg.PartIdx { + return + } + pg.GroupIdxs = append(pg.GroupIdxs, otherPg.GroupIdxs...) +} + +func (pg *ListPartitionGroup) findGroupIdx(groupIdx int) bool { + for _, gidx := range pg.GroupIdxs { + if gidx == groupIdx { + return true + } + } + return false +} + // ForRangePruning is used for range partition pruning. type ForRangePruning struct { LessThan []int64 @@ -258,7 +432,7 @@ func rangePartitionString(pi *model.PartitionInfo) string { // partition by range columns (c1) if len(pi.Columns) == 1 { - return pi.Columns[0].L + return "`" + pi.Columns[0].L + "`" } // partition by range columns (c1, c2, ...) @@ -297,7 +471,7 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, // build column offset. partExp := pi.Expr if len(pi.Columns) == 1 { - partExp = pi.Columns[0].L + partExp = "`" + pi.Columns[0].L + "`" } exprs, err := parseSimpleExprWithNames(p, ctx, partExp, schema, names) if err != nil { @@ -334,6 +508,281 @@ func generateRangePartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, return ret, nil } +func getColumnsOffset(cols, columns []*expression.Column) []int { + colsOffset := make([]int, len(cols)) + for i, col := range columns { + if idx := findIdxByColUniqueID(cols, col); idx >= 0 { + colsOffset[idx] = i + } + } + return colsOffset +} + +func findIdxByColUniqueID(cols []*expression.Column, col *expression.Column) int { + for idx, c := range cols { + if c.UniqueID == col.UniqueID { + return idx + } + } + return -1 +} + +func extractListPartitionExprColumns(ctx sessionctx.Context, pi *model.PartitionInfo, columns []*expression.Column, names types.NameSlice) ([]*expression.Column, []int, error) { + var cols []*expression.Column + if len(pi.Columns) == 0 { + schema := expression.NewSchema(columns...) + exprs, err := expression.ParseSimpleExprsWithNames(ctx, pi.Expr, schema, names) + if err != nil { + return nil, nil, err + } + cols = expression.ExtractColumns(exprs[0]) + } else { + for _, col := range pi.Columns { + idx := expression.FindFieldNameIdxByColName(names, col.L) + if idx < 0 { + panic("should never happen") + } + cols = append(cols, columns[idx]) + } + } + offset := getColumnsOffset(cols, columns) + deDupCols := make([]*expression.Column, 0, len(cols)) + for _, col := range cols { + if findIdxByColUniqueID(deDupCols, col) < 0 { + c := col.Clone().(*expression.Column) + deDupCols = append(deDupCols, c) + } + } + return deDupCols, offset, nil +} + +func generateListPartitionExpr(ctx sessionctx.Context, tblInfo *model.TableInfo, + columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { + // The caller should assure partition info is not nil. + pi := tblInfo.GetPartitionInfo() + exprCols, offset, err := extractListPartitionExprColumns(ctx, pi, columns, names) + if err != nil { + return nil, err + } + listPrune := &ForListPruning{} + if len(pi.Columns) == 0 { + err = listPrune.buildListPruner(ctx, tblInfo, exprCols, columns, names) + } else { + err = listPrune.buildListColumnsPruner(ctx, tblInfo, columns, names) + } + if err != nil { + return nil, err + } + ret := &PartitionExpr{ + ForListPruning: listPrune, + ColumnOffset: offset, + } + return ret, nil +} + +func (lp *ForListPruning) buildListPruner(ctx sessionctx.Context, tblInfo *model.TableInfo, exprCols []*expression.Column, + columns []*expression.Column, names types.NameSlice) error { + pi := tblInfo.GetPartitionInfo() + schema := expression.NewSchema(columns...) + p := parser.New() + expr, err := parseSimpleExprWithNames(p, ctx, pi.Expr, schema, names) + if err != nil { + // If it got an error here, ddl may hang forever, so this error log is important. + logutil.BgLogger().Error("wrong table partition expression", zap.String("expression", pi.Expr), zap.Error(err)) + return errors.Trace(err) + } + // Since need to change the column index of the expresion, clone the expression first. + lp.LocateExpr = expr.Clone() + lp.PruneExprCols = exprCols + lp.PruneExpr = expr.Clone() + cols := expression.ExtractColumns(lp.PruneExpr) + for _, c := range cols { + idx := findIdxByColUniqueID(exprCols, c) + if idx < 0 { + return table.ErrUnknownColumn.GenWithStackByArgs(c.OrigName) + } + c.Index = idx + } + err = lp.buildListPartitionValueMap(ctx, tblInfo, schema, names, p) + if err != nil { + return err + } + return nil +} + +func (lp *ForListPruning) buildListColumnsPruner(ctx sessionctx.Context, tblInfo *model.TableInfo, + columns []*expression.Column, names types.NameSlice) error { + pi := tblInfo.GetPartitionInfo() + schema := expression.NewSchema(columns...) + p := parser.New() + colPrunes := make([]*ForListColumnPruning, 0, len(pi.Columns)) + for colIdx := range pi.Columns { + colInfo := model.FindColumnInfo(tblInfo.Columns, pi.Columns[colIdx].L) + if colInfo == nil { + return table.ErrUnknownColumn.GenWithStackByArgs(pi.Columns[colIdx].L) + } + idx := expression.FindFieldNameIdxByColName(names, pi.Columns[colIdx].L) + if idx < 0 { + return table.ErrUnknownColumn.GenWithStackByArgs(pi.Columns[colIdx].L) + } + colPrune := &ForListColumnPruning{ + ExprCol: columns[idx], + valueTp: &colInfo.FieldType, + valueMap: make(map[string]ListPartitionLocation), + } + err := colPrune.buildPartitionValueMap(ctx, tblInfo, colIdx, schema, names, p) + if err != nil { + return err + } + colPrunes = append(colPrunes, colPrune) + } + lp.ColPrunes = colPrunes + return nil +} + +// buildListPartitionValueMap builds list partition value map. +// The map is column value -> partition index. +// colIdx is the column index in the list columns. +func (lp *ForListPruning) buildListPartitionValueMap(ctx sessionctx.Context, tblInfo *model.TableInfo, + schema *expression.Schema, names types.NameSlice, p *parser.Parser) error { + pi := tblInfo.GetPartitionInfo() + lp.valueMap = map[int64]int{} + lp.nullPartitionIdx = -1 + for partitionIdx, def := range pi.Definitions { + for _, vs := range def.InValues { + expr, err := parseSimpleExprWithNames(p, ctx, vs[0], schema, names) + if err != nil { + return errors.Trace(err) + } + v, isNull, err := expr.EvalInt(ctx, chunk.Row{}) + if err != nil { + return errors.Trace(err) + } + if isNull { + lp.nullPartitionIdx = partitionIdx + continue + } + lp.valueMap[v] = partitionIdx + } + } + return nil +} + +// LocatePartition locates partition by the column value +func (lp *ForListPruning) LocatePartition(value int64, isNull bool) int { + if isNull { + return lp.nullPartitionIdx + } + partitionIdx, ok := lp.valueMap[value] + if !ok { + return -1 + } + return partitionIdx +} + +func (lp *ForListPruning) locateListPartitionByRow(ctx sessionctx.Context, r []types.Datum) (int, error) { + value, isNull, err := lp.LocateExpr.EvalInt(ctx, chunk.MutRowFromDatums(r).ToRow()) + if err != nil { + return -1, errors.Trace(err) + } + idx := lp.LocatePartition(value, isNull) + if idx >= 0 { + return idx, nil + } + if isNull { + return -1, table.ErrNoPartitionForGivenValue.GenWithStackByArgs("NULL") + } + return -1, table.ErrNoPartitionForGivenValue.GenWithStackByArgs(strconv.FormatInt(value, 10)) +} + +func (lp *ForListPruning) locateListColumnsPartitionByRow(ctx sessionctx.Context, r []types.Datum) (int, error) { + helper := NewListPartitionLocationHelper() + sc := ctx.GetSessionVars().StmtCtx + for _, colPrune := range lp.ColPrunes { + location, err := colPrune.LocatePartition(sc, r[colPrune.ExprCol.Index]) + if err != nil { + return -1, errors.Trace(err) + } + if !helper.Intersect(location) { + break + } + } + location := helper.GetLocation() + if location.IsEmpty() { + return -1, table.ErrNoPartitionForGivenValue.GenWithStackByArgs("from column_list") + } + return location[0].PartIdx, nil +} + +// buildListPartitionValueMap builds list columns partition value map for the specified column. +// colIdx is the specified column index in the list columns. +func (lp *ForListColumnPruning) buildPartitionValueMap(ctx sessionctx.Context, tblInfo *model.TableInfo, colIdx int, + schema *expression.Schema, names types.NameSlice, p *parser.Parser) error { + pi := tblInfo.GetPartitionInfo() + sc := ctx.GetSessionVars().StmtCtx + for partitionIdx, def := range pi.Definitions { + for groupIdx, vs := range def.InValues { + keyBytes, err := lp.genConstExprKey(ctx, sc, vs[colIdx], schema, names, p) + if err != nil { + return errors.Trace(err) + } + key := string(keyBytes) + location, ok := lp.valueMap[key] + if ok { + idx := location.findByPartitionIdx(partitionIdx) + if idx != -1 { + location[idx].GroupIdxs = append(location[idx].GroupIdxs, groupIdx) + continue + } + } + location = append(location, ListPartitionGroup{ + PartIdx: partitionIdx, + GroupIdxs: []int{groupIdx}, + }) + lp.valueMap[key] = location + } + } + return nil +} + +func (lp *ForListColumnPruning) genConstExprKey(ctx sessionctx.Context, sc *stmtctx.StatementContext, exprStr string, + schema *expression.Schema, names types.NameSlice, p *parser.Parser) ([]byte, error) { + expr, err := parseSimpleExprWithNames(p, ctx, exprStr, schema, names) + if err != nil { + return nil, errors.Trace(err) + } + v, err := expr.Eval(chunk.Row{}) + if err != nil { + return nil, errors.Trace(err) + } + key, err := lp.genKey(sc, v) + if err != nil { + return nil, errors.Trace(err) + } + return key, nil +} + +func (lp *ForListColumnPruning) genKey(sc *stmtctx.StatementContext, v types.Datum) ([]byte, error) { + v, err := v.ConvertTo(sc, lp.valueTp) + if err != nil { + return nil, errors.Trace(err) + } + return codec.EncodeKey(sc, nil, v) +} + +// LocatePartition locates partition by the column value +func (lp *ForListColumnPruning) LocatePartition(sc *stmtctx.StatementContext, v types.Datum) (ListPartitionLocation, error) { + key, err := lp.genKey(sc, v) + if err != nil { + return nil, errors.Trace(err) + } + location, ok := lp.valueMap[string(key)] + if !ok { + return nil, nil + } + return location, nil +} + func generateHashPartitionExpr(ctx sessionctx.Context, pi *model.PartitionInfo, columns []*expression.Column, names types.NameSlice) (*PartitionExpr, error) { // The caller should assure partition info is not nil. @@ -390,6 +839,8 @@ func (t *partitionedTable) locatePartition(ctx sessionctx.Context, pi *model.Par } case model.PartitionTypeHash: idx, err = t.locateHashPartition(ctx, pi, r) + case model.PartitionTypeList: + idx, err = t.locateListPartition(ctx, pi, r) } if err != nil { return 0, errors.Trace(err) @@ -442,6 +893,14 @@ func (t *partitionedTable) locateRangeColumnPartition(ctx sessionctx.Context, pi return idx, nil } +func (t *partitionedTable) locateListPartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { + lp := t.partitionExpr.ForListPruning + if len(lp.ColPrunes) == 0 { + return lp.locateListPartitionByRow(ctx, r) + } + return lp.locateListColumnsPartitionByRow(ctx, r) +} + func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { var ( ret int64 @@ -499,7 +958,18 @@ func (t *partitionedTable) locateRangePartition(ctx sessionctx.Context, pi *mode // TODO: supports linear hashing func (t *partitionedTable) locateHashPartition(ctx sessionctx.Context, pi *model.PartitionInfo, r []types.Datum) (int, error) { if col, ok := t.partitionExpr.Expr.(*expression.Column); ok { - ret := r[col.Index].GetInt64() + var data types.Datum + switch r[col.Index].Kind() { + case types.KindInt64, types.KindUint64: + data = r[col.Index] + default: + var err error + data, err = r[col.Index].ConvertTo(ctx.GetSessionVars().StmtCtx, types.NewFieldType(mysql.TypeLong)) + if err != nil { + return 0, err + } + } + ret := data.GetInt64() ret = ret % int64(t.meta.Partition.Num) if ret < 0 { ret = -ret @@ -588,6 +1058,14 @@ func (t *partitionTableWithGivenSets) AddRecord(ctx sessionctx.Context, r []type return partitionedTableAddRecord(ctx, t.partitionedTable, r, t.partitions, opts) } +func (t *partitionTableWithGivenSets) GetAllPartitionIDs() []int64 { + ptIDs := make([]int64, 0, len(t.partitions)) + for id := range t.partitions { + ptIDs = append(ptIDs, id) + } + return ptIDs +} + // RemoveRecord implements table.Table RemoveRecord interface. func (t *partitionedTable) RemoveRecord(ctx sessionctx.Context, h kv.Handle, r []types.Datum) error { partitionInfo := t.meta.GetPartitionInfo() @@ -600,6 +1078,14 @@ func (t *partitionedTable) RemoveRecord(ctx sessionctx.Context, h kv.Handle, r [ return tbl.RemoveRecord(ctx, h, r) } +func (t *partitionedTable) GetAllPartitionIDs() []int64 { + ptIDs := make([]int64, 0, len(t.partitions)) + for id := range t.partitions { + ptIDs = append(ptIDs, id) + } + return ptIDs +} + // UpdateRecord implements table.Table UpdateRecord interface. // `touched` means which columns are really modified, used for secondary indices. // Length of `oldData` and `newData` equals to length of `t.WritableCols()`. diff --git a/table/tables/partition_test.go b/table/tables/partition_test.go index 51287e0f222a4..a453c3b2ee967 100644 --- a/table/tables/partition_test.go +++ b/table/tables/partition_test.go @@ -111,7 +111,8 @@ PARTITION BY RANGE ( id ) ( // Value must locates in one partition. _, err = tb.AddRecord(ts.se, types.MakeDatums(22)) c.Assert(table.ErrNoPartitionForGivenValue.Equal(err), IsTrue) - ts.se.Execute(context.Background(), "rollback") + _, err = ts.se.Execute(context.Background(), "rollback") + c.Assert(err, IsNil) createTable2 := `CREATE TABLE test.t2 (id int(11)) PARTITION BY RANGE ( id ) ( @@ -502,3 +503,30 @@ func (ts *testSuite) TestHashPartitionAndConditionConflict(c *C) { tk.MustQuery("select * from t2 partition (p1) where t2.a = 6;").Check(testkit.Rows()) } + +func (ts *testSuite) TestHashPartitionInsertValue(c *C) { + tk := testkit.NewTestKitWithInit(c, ts.store) + tk.MustExec("use test") + tk.MustExec("drop tables if exists t4") + tk.MustExec(`CREATE TABLE t4( + a bit(1) DEFAULT NULL, + b int(11) DEFAULT NULL + ) PARTITION BY HASH(a) + PARTITIONS 3`) + defer tk.MustExec("drop tables if exists t4") + tk.MustExec("INSERT INTO t4 VALUES(0, 0)") + tk.MustExec("INSERT INTO t4 VALUES(1, 1)") + result := tk.MustQuery("SELECT * FROM t4 WHERE a = 1") + result.Check(testkit.Rows("\x01 1")) +} + +func (ts *testSuite) TestIssue21574(c *C) { + tk := testkit.NewTestKitWithInit(c, ts.store) + tk.MustExec("use test") + tk.MustExec("drop tables if exists t_21574") + tk.MustExec("create table t_21574 (`key` int, `table` int) partition by range columns (`key`) (partition p0 values less than (10));") + tk.MustExec("drop table t_21574") + tk.MustExec("create table t_21574 (`key` int, `table` int) partition by list columns (`key`) (partition p0 values in (10));") + tk.MustExec("drop table t_21574") + tk.MustExec("create table t_21574 (`key` int, `table` int) partition by list columns (`key`,`table`) (partition p0 values in ((1,1)));") +} diff --git a/table/tables/tables.go b/table/tables/tables.go index 53ebde58dcf52..7dd3894898a52 100644 --- a/table/tables/tables.go +++ b/table/tables/tables.go @@ -25,6 +25,7 @@ import ( "sync" "time" + "github.com/opentracing/opentracing-go" "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" @@ -60,7 +61,6 @@ type TableCommon struct { HiddenColumns []*table.Column WritableColumns []*table.Column FullHiddenColsAndVisibleColumns []*table.Column - writableIndices []table.Index indices []table.Index meta *model.TableInfo allocs autoid.Allocators @@ -160,7 +160,6 @@ func initTableCommon(t *TableCommon, tblInfo *model.TableInfo, physicalTableID i t.HiddenColumns = t.HiddenCols() t.WritableColumns = t.WritableCols() t.FullHiddenColsAndVisibleColumns = t.FullHiddenColsAndVisibleCols() - t.writableIndices = t.WritableIndices() t.recordPrefix = tablecodec.GenTableRecordPrefix(physicalTableID) t.indexPrefix = tablecodec.GenTableIndexPrefix(physicalTableID) if tblInfo.IsSequence() { @@ -180,7 +179,6 @@ func initTableIndices(t *TableCommon) error { idx := NewIndex(t.physicalTableID, tblInfo, idxInfo) t.indices = append(t.indices, idx) } - t.writableIndices = t.WritableIndices() return nil } @@ -194,25 +192,12 @@ func (t *TableCommon) Indices() []table.Index { return t.indices } -// WritableIndices implements table.Table WritableIndices interface. -func (t *TableCommon) WritableIndices() []table.Index { - if len(t.writableIndices) > 0 { - return t.writableIndices - } - writable := make([]table.Index, 0, len(t.indices)) - for _, index := range t.indices { - s := index.Meta().State - if s != model.StateDeleteOnly && s != model.StateDeleteReorganization { - writable = append(writable, index) - } - } - return writable -} - // GetWritableIndexByName gets the index meta from the table by the index name. func GetWritableIndexByName(idxName string, t table.Table) table.Index { - indices := t.WritableIndices() - for _, idx := range indices { + for _, idx := range t.Indices() { + if !IsIndexWritable(idx) { + continue + } if idxName == idx.Meta().Name.L { return idx } @@ -220,8 +205,8 @@ func GetWritableIndexByName(idxName string, t table.Table) table.Index { return nil } -// DeletableIndices implements table.Table DeletableIndices interface. -func (t *TableCommon) DeletableIndices() []table.Index { +// deletableIndices implements table.Table deletableIndices interface. +func (t *TableCommon) deletableIndices() []table.Index { // All indices are deletable because we don't need to check StateNone. return t.indices } @@ -318,21 +303,11 @@ func (t *TableCommon) RecordPrefix() kv.Key { return t.recordPrefix } -// IndexPrefix implements table.Table interface. -func (t *TableCommon) IndexPrefix() kv.Key { - return t.indexPrefix -} - // RecordKey implements table.Table interface. func (t *TableCommon) RecordKey(h kv.Handle) kv.Key { return tablecodec.EncodeRecordKey(t.recordPrefix, h) } -// FirstKey implements table.Table interface. -func (t *TableCommon) FirstKey() kv.Key { - return t.RecordKey(kv.IntHandle(math.MinInt64)) -} - // UpdateRecord implements table.Table UpdateRecord interface. // `touched` means which columns are really modified, used for secondary indices. // Length of `oldData` and `newData` equals to length of `t.WritableCols()`. @@ -351,7 +326,7 @@ func (t *TableCommon) UpdateRecord(ctx context.Context, sctx sessionctx.Context, numColsCap := len(newData) + 1 // +1 for the extra handle column that we may need to append. colIDs = make([]int64, 0, numColsCap) row = make([]types.Datum, 0, numColsCap) - if shouldWriteBinlog(sctx) { + if shouldWriteBinlog(sctx, t.meta) { binlogColIDs = make([]int64, 0, numColsCap) binlogOldRow = make([]types.Datum, 0, numColsCap) binlogNewRow = make([]types.Datum, 0, numColsCap) @@ -393,21 +368,32 @@ func (t *TableCommon) UpdateRecord(ctx context.Context, sctx sessionctx.Context, colIDs = append(colIDs, col.ID) row = append(row, value) } - if shouldWriteBinlog(sctx) && !t.canSkipUpdateBinlog(col, value) { + if shouldWriteBinlog(sctx, t.meta) && !t.canSkipUpdateBinlog(col, value) { binlogColIDs = append(binlogColIDs, col.ID) binlogOldRow = append(binlogOldRow, oldData[col.Offset]) binlogNewRow = append(binlogNewRow, value) } } - + sessVars := sctx.GetSessionVars() // rebuild index - err = t.rebuildIndices(sctx, txn, h, touched, oldData, newData, table.WithCtx(ctx)) - if err != nil { - return err + if !sessVars.InTxn() { + savePresumeKeyNotExist := sessVars.PresumeKeyNotExists + if !sessVars.ConstraintCheckInPlace && sessVars.TxnCtx.IsPessimistic { + sessVars.PresumeKeyNotExists = true + } + err = t.rebuildIndices(sctx, txn, h, touched, oldData, newData, table.WithCtx(ctx)) + sessVars.PresumeKeyNotExists = savePresumeKeyNotExist + if err != nil { + return err + } + } else { + err = t.rebuildIndices(sctx, txn, h, touched, oldData, newData, table.WithCtx(ctx)) + if err != nil { + return err + } } key := t.RecordKey(h) - sessVars := sctx.GetSessionVars() sc, rd := sessVars.StmtCtx, &sessVars.RowEncoder value, err := tablecodec.EncodeRow(sc, row, colIDs, nil, nil, rd) if err != nil { @@ -417,7 +403,7 @@ func (t *TableCommon) UpdateRecord(ctx context.Context, sctx sessionctx.Context, return err } memBuffer.Release(sh) - if shouldWriteBinlog(sctx) { + if shouldWriteBinlog(sctx, t.meta) { if !t.meta.PKIsHandle { binlogColIDs = append(binlogColIDs, model.ExtraHandleID) binlogOldRow = append(binlogOldRow, types.NewIntDatum(h.IntValue())) @@ -447,7 +433,7 @@ func (t *TableCommon) UpdateRecord(ctx context.Context, sctx sessionctx.Context, } func (t *TableCommon) rebuildIndices(ctx sessionctx.Context, txn kv.Transaction, h kv.Handle, touched []bool, oldData []types.Datum, newData []types.Datum, opts ...table.CreateIdxOptFunc) error { - for _, idx := range t.DeletableIndices() { + for _, idx := range t.deletableIndices() { if t.meta.IsCommonHandle && idx.Meta().Primary { continue } @@ -465,7 +451,10 @@ func (t *TableCommon) rebuildIndices(ctx sessionctx.Context, txn kv.Transaction, break } } - for _, idx := range t.WritableIndices() { + for _, idx := range t.Indices() { + if !IsIndexWritable(idx) { + continue + } if t.meta.IsCommonHandle && idx.Meta().Primary { continue } @@ -485,7 +474,7 @@ func (t *TableCommon) rebuildIndices(ctx sessionctx.Context, txn kv.Transaction, if err != nil { return err } - if err := t.buildIndexForRow(ctx, h, newVs, idx, txn, untouched, opts...); err != nil { + if err := t.buildIndexForRow(ctx, h, newVs, newData, idx, txn, untouched, opts...); err != nil { return err } } @@ -565,6 +554,21 @@ func TryGetCommonPkColumnIds(tbl *model.TableInfo) []int64 { return pkColIds } +// PrimaryPrefixColumnIDs get prefix column ids in primary key. +func PrimaryPrefixColumnIDs(tbl *model.TableInfo) (prefixCols []int64) { + for _, idx := range tbl.Indices { + if !idx.Primary { + continue + } + for _, col := range idx.Columns { + if col.Length > 0 && tbl.Columns[col.Offset].Flen > col.Length { + prefixCols = append(prefixCols, tbl.Columns[col.Offset].ID) + } + } + } + return +} + // TryGetCommonPkColumns get the primary key columns if the table has common handle. func TryGetCommonPkColumns(tbl table.Table) []*table.Column { var pkCols []*table.Column @@ -590,6 +594,18 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . for _, fn := range opts { fn.ApplyOn(&opt) } + + var ctx context.Context + if opt.Ctx != nil { + ctx = opt.Ctx + if span := opentracing.SpanFromContext(ctx); span != nil && span.Tracer() != nil { + span1 := span.Tracer().StartSpan("table.AddRecord", opentracing.ChildOf(span.Context())) + defer span1.Finish() + ctx = opentracing.ContextWithSpan(ctx, span1) + } + } else { + ctx = context.Background() + } var hasRecordID bool cols := t.Cols() // opt.IsUpdate is a flag for update. @@ -601,7 +617,7 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . hasRecordID = true } else { tblInfo := t.Meta() - txn.GetUnionStore().CacheTableInfo(t.physicalTableID, tblInfo) + txn.CacheTableInfo(t.physicalTableID, tblInfo) if tblInfo.PKIsHandle { recordID = kv.IntHandle(r[tblInfo.GetPkColInfo().Offset].GetInt64()) hasRecordID = true @@ -631,13 +647,13 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . // following AddRecord() operation. // Make the IDs continuous benefit for the performance of TiKV. stmtCtx := sctx.GetSessionVars().StmtCtx - stmtCtx.BaseRowID, stmtCtx.MaxRowID, err = allocHandleIDs(sctx, t, uint64(opt.ReserveAutoID)) + stmtCtx.BaseRowID, stmtCtx.MaxRowID, err = allocHandleIDs(ctx, sctx, t, uint64(opt.ReserveAutoID)) if err != nil { return nil, err } } - recordID, err = AllocHandle(sctx, t) + recordID, err = AllocHandle(ctx, sctx, t) if err != nil { return nil, err } @@ -660,6 +676,8 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . for _, col := range t.WritableCols() { var value types.Datum + // In column type change, since we have set the origin default value for changing col, but + // for the new insert statement, we should use the casted value of relative column to insert. if col.ChangeStateInfo != nil && col.State != model.StatePublic { // TODO: Check overflow or ignoreTruncate. value, err = table.CastValue(sctx, r[col.DependencyColumnOffset], col.ColumnInfo, false, false) @@ -703,6 +721,8 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . writeBufs := sessVars.GetWriteStmtBufs() adjustRowValuesBuf(writeBufs, len(row)) key := t.RecordKey(recordID) + logutil.BgLogger().Debug("addRecord", + zap.Stringer("key", key)) sc, rd := sessVars.StmtCtx, &sessVars.RowEncoder writeBufs.RowValBuf, err = tablecodec.EncodeRow(sc, row, colIDs, writeBufs.RowValBuf, writeBufs.AddRowValues, rd) if err != nil { @@ -711,12 +731,6 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . value := writeBufs.RowValBuf var setPresume bool - var ctx context.Context - if opt.Ctx != nil { - ctx = opt.Ctx - } else { - ctx = context.Background() - } skipCheck := sctx.GetSessionVars().StmtCtx.BatchCheck if (t.meta.IsCommonHandle || t.meta.PKIsHandle) && !skipCheck && !opt.SkipHandleCheck { if sctx.GetSessionVars().LazyCheckKeyNotExists() { @@ -732,7 +746,7 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . _, err = txn.Get(ctx, key) } if err == nil { - handleStr := kv.GetDuplicateErrorHandleString(recordID) + handleStr := getDuplicateErrorHandleString(t, recordID, r) return recordID, kv.ErrKeyExists.FastGenByArgs(handleStr, "PRIMARY") } else if !kv.ErrNotExist.Equal(err) { return recordID, err @@ -765,7 +779,7 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . memBuffer.Release(sh) - if shouldWriteBinlog(sctx) { + if shouldWriteBinlog(sctx, t.meta) { // For insert, TiDB and Binlog can use same row and schema. binlogRow = row binlogColIDs = colIDs @@ -774,7 +788,6 @@ func (t *TableCommon) AddRecord(sctx sessionctx.Context, r []types.Datum, opts . return nil, err } } - sc.AddAffectedRows(1) if sessVars.TxnCtx == nil { return recordID, nil } @@ -813,7 +826,10 @@ func (t *TableCommon) addIndices(sctx sessionctx.Context, recordID kv.Handle, r writeBufs := sctx.GetSessionVars().GetWriteStmtBufs() indexVals := writeBufs.IndexValsBuf skipCheck := sctx.GetSessionVars().StmtCtx.BatchCheck - for _, v := range t.WritableIndices() { + for _, v := range t.Indices() { + if !IsIndexWritable(v) { + continue + } if t.meta.IsCommonHandle && v.Meta().Primary { continue } @@ -830,7 +846,8 @@ func (t *TableCommon) addIndices(sctx sessionctx.Context, recordID kv.Handle, r idxMeta := v.Meta() dupErr = kv.ErrKeyExists.FastGenByArgs(entryKey, idxMeta.Name.String()) } - if dupHandle, err := v.Create(sctx, txn.GetUnionStore(), indexVals, recordID, opts...); err != nil { + rsData := TryGetHandleRestoredDataWrapper(t, r, nil) + if dupHandle, err := v.Create(sctx, txn, indexVals, recordID, rsData, opts...); err != nil { if kv.ErrKeyExists.Equal(err) { return dupHandle, dupErr } @@ -842,10 +859,10 @@ func (t *TableCommon) addIndices(sctx sessionctx.Context, recordID kv.Handle, r return nil, nil } -// RowWithCols implements table.Table RowWithCols interface. -func (t *TableCommon) RowWithCols(ctx sessionctx.Context, h kv.Handle, cols []*table.Column) ([]types.Datum, error) { +// RowWithCols is used to get the corresponding column datum values with the given handle. +func RowWithCols(t table.Table, ctx sessionctx.Context, h kv.Handle, cols []*table.Column) ([]types.Datum, error) { // Get raw row data from kv. - key := t.RecordKey(h) + key := tablecodec.EncodeRecordKey(t.RecordPrefix(), h) txn, err := ctx.Txn(true) if err != nil { return nil, err @@ -861,11 +878,24 @@ func (t *TableCommon) RowWithCols(ctx sessionctx.Context, h kv.Handle, cols []*t return v, nil } +func containFullColInHandle(meta *model.TableInfo, col *table.Column) (containFullCol bool, idxInHandle int) { + pkIdx := FindPrimaryIndex(meta) + for i, idxCol := range pkIdx.Columns { + if meta.Columns[idxCol.Offset].ID == col.ID { + idxInHandle = i + containFullCol = idxCol.Length == types.UnspecifiedLength + return + } + } + return +} + // DecodeRawRowData decodes raw row data into a datum slice and a (columnID:columnValue) map. func DecodeRawRowData(ctx sessionctx.Context, meta *model.TableInfo, h kv.Handle, cols []*table.Column, value []byte) ([]types.Datum, map[int64]types.Datum, error) { v := make([]types.Datum, len(cols)) colTps := make(map[int64]*types.FieldType, len(cols)) + prefixCols := make(map[int64]struct{}) for i, col := range cols { if col == nil { continue @@ -878,26 +908,21 @@ func DecodeRawRowData(ctx sessionctx.Context, meta *model.TableInfo, h kv.Handle } continue } - if col.IsCommonHandleColumn(meta) { - pkIdx := FindPrimaryIndex(meta) - var idxOfIdx int - for i, idxCol := range pkIdx.Columns { - if meta.Columns[idxCol.Offset].ID == col.ID { - idxOfIdx = i - break + if col.IsCommonHandleColumn(meta) && !types.CommonHandleNeedRestoredData(&col.FieldType) { + if containFullCol, idxInHandle := containFullColInHandle(meta, col); containFullCol { + dtBytes := h.EncodedCol(idxInHandle) + _, dt, err := codec.DecodeOne(dtBytes) + if err != nil { + return nil, nil, err } + dt, err = tablecodec.Unflatten(dt, &col.FieldType, ctx.GetSessionVars().Location()) + if err != nil { + return nil, nil, err + } + v[i] = dt + continue } - dtBytes := h.EncodedCol(idxOfIdx) - _, dt, err := codec.DecodeOne(dtBytes) - if err != nil { - return nil, nil, err - } - dt, err = tablecodec.Unflatten(dt, &col.FieldType, ctx.GetSessionVars().Location()) - if err != nil { - return nil, nil, err - } - v[i] = dt - continue + prefixCols[col.ID] = struct{}{} } colTps[col.ID] = &col.FieldType } @@ -910,8 +935,10 @@ func DecodeRawRowData(ctx sessionctx.Context, meta *model.TableInfo, h kv.Handle if col == nil { continue } - if col.IsPKHandleColumn(meta) || col.IsCommonHandleColumn(meta) { - continue + if col.IsPKHandleColumn(meta) || (col.IsCommonHandleColumn(meta) && !types.CommonHandleNeedRestoredData(&col.FieldType)) { + if _, isPrefix := prefixCols[col.ID]; !isPrefix { + continue + } } ri, ok := rowMap[col.ID] if ok { @@ -958,11 +985,6 @@ func GetChangingColVal(ctx sessionctx.Context, cols []*table.Column, col *table. return idxColumnVal, true, nil } -// Row implements table.Table Row interface. -func (t *TableCommon) Row(ctx sessionctx.Context, h kv.Handle) ([]types.Datum, error) { - return t.RowWithCols(ctx, h, t.Cols()) -} - // RemoveRecord implements table.Table RemoveRecord interface. func (t *TableCommon) RemoveRecord(ctx sessionctx.Context, h kv.Handle, r []types.Datum) error { err := t.removeRowData(ctx, h) @@ -978,7 +1000,7 @@ func (t *TableCommon) RemoveRecord(ctx sessionctx.Context, h kv.Handle, r []type return err } - if shouldWriteBinlog(ctx) { + if shouldWriteBinlog(ctx, t.meta) { cols := t.Cols() colIDs := make([]int64, 0, len(cols)+1) for _, col := range cols { @@ -1073,7 +1095,7 @@ func writeSequenceUpdateValueBinlog(ctx sessionctx.Context, db, sequence string, sequenceFullName := stringutil.Escape(db, sqlMode) + "." + stringutil.Escape(sequence, sqlMode) sql := "select setval(" + sequenceFullName + ", " + strconv.FormatInt(end, 10) + ")" - err := kv.RunInNewTxn(ctx.GetStore(), true, func(txn kv.Transaction) error { + err := kv.RunInNewTxn(context.Background(), ctx.GetStore(), true, func(ctx context.Context, txn kv.Transaction) error { m := meta.NewMeta(txn) mockJobID, err := m.GenGlobalID() if err != nil { @@ -1093,11 +1115,7 @@ func (t *TableCommon) removeRowData(ctx sessionctx.Context, h kv.Handle) error { } key := t.RecordKey(h) - err = txn.Delete(key) - if err != nil { - return err - } - return nil + return txn.Delete(key) } // removeRowIndices removes all the indices of a row. @@ -1106,13 +1124,13 @@ func (t *TableCommon) removeRowIndices(ctx sessionctx.Context, h kv.Handle, rec if err != nil { return err } - for _, v := range t.DeletableIndices() { + for _, v := range t.deletableIndices() { vals, err := v.FetchValues(rec, nil) if err != nil { logutil.BgLogger().Info("remove row index failed", zap.Any("index", v.Meta()), zap.Uint64("txnStartTS", txn.StartTS()), zap.String("handle", h.String()), zap.Any("record", rec), zap.Error(err)) return err } - if err = v.Delete(ctx.GetSessionVars().StmtCtx, txn, vals, h); err != nil { + if err = v.Delete(ctx.GetSessionVars().StmtCtx, txn.GetUnionStore(), vals, h); err != nil { if v.Meta().State != model.StatePublic && kv.ErrNotExist.Equal(err) { // If the index is not in public state, we may have not created the index, // or already deleted the index, so skip ErrNotExist error. @@ -1127,17 +1145,18 @@ func (t *TableCommon) removeRowIndices(ctx sessionctx.Context, h kv.Handle, rec // removeRowIndex implements table.Table RemoveRowIndex interface. func (t *TableCommon) removeRowIndex(sc *stmtctx.StatementContext, h kv.Handle, vals []types.Datum, idx table.Index, txn kv.Transaction) error { - return idx.Delete(sc, txn, vals, h) + return idx.Delete(sc, txn.GetUnionStore(), vals, h) } // buildIndexForRow implements table.Table BuildIndexForRow interface. -func (t *TableCommon) buildIndexForRow(ctx sessionctx.Context, h kv.Handle, vals []types.Datum, idx table.Index, txn kv.Transaction, untouched bool, popts ...table.CreateIdxOptFunc) error { +func (t *TableCommon) buildIndexForRow(ctx sessionctx.Context, h kv.Handle, vals []types.Datum, newData []types.Datum, idx table.Index, txn kv.Transaction, untouched bool, popts ...table.CreateIdxOptFunc) error { var opts []table.CreateIdxOptFunc opts = append(opts, popts...) if untouched { opts = append(opts, table.IndexIsUntouched) } - if _, err := idx.Create(ctx, txn.GetUnionStore(), vals, h, opts...); err != nil { + rsData := TryGetHandleRestoredDataWrapper(t, newData, nil) + if _, err := idx.Create(ctx, txn, vals, h, rsData, opts...); err != nil { if kv.ErrKeyExists.Equal(err) { // Make error message consistent with MySQL. entryKey, err1 := t.genIndexKeyStr(vals) @@ -1153,8 +1172,8 @@ func (t *TableCommon) buildIndexForRow(ctx sessionctx.Context, h kv.Handle, vals return nil } -// IterRecords implements table.Table IterRecords interface. -func (t *TableCommon) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols []*table.Column, +// IterRecords iterates records in the table and calls fn. +func IterRecords(t table.Table, ctx sessionctx.Context, cols []*table.Column, fn table.RecordIterFunc) error { prefix := t.RecordPrefix() txn, err := ctx.Txn(true) @@ -1162,6 +1181,7 @@ func (t *TableCommon) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols return err } + startKey := tablecodec.EncodeRecordKey(t.RecordPrefix(), kv.IntHandle(math.MinInt64)) it, err := txn.Iter(startKey, prefix.PrefixNext()) if err != nil { return err @@ -1191,10 +1211,10 @@ func (t *TableCommon) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols if err != nil { return err } - pkIds, decodeLoc := TryGetCommonPkColumnIds(t.meta), ctx.GetSessionVars().Location() + pkIds, decodeLoc := TryGetCommonPkColumnIds(t.Meta()), ctx.GetSessionVars().Location() data := make([]types.Datum, len(cols)) for _, col := range cols { - if col.IsPKHandleColumn(t.meta) { + if col.IsPKHandleColumn(t.Meta()) { if mysql.HasUnsignedFlag(col.Flag) { data[col.Offset].SetUint64(uint64(handle.IntValue())) } else { @@ -1222,7 +1242,7 @@ func (t *TableCommon) IterRecords(ctx sessionctx.Context, startKey kv.Key, cols return err } - rk := t.RecordKey(handle) + rk := tablecodec.EncodeRecordKey(t.RecordPrefix(), handle) err = kv.NextUntil(it, util.RowKeyPrefixFilter(rk)) if err != nil { return err @@ -1274,9 +1294,9 @@ func GetColDefaultValue(ctx sessionctx.Context, col *table.Column, defaultVals [ // AllocHandle allocate a new handle. // A statement could reserve some ID in the statement context, try those ones first. -func AllocHandle(ctx sessionctx.Context, t table.Table) (kv.Handle, error) { - if ctx != nil { - if stmtCtx := ctx.GetSessionVars().StmtCtx; stmtCtx != nil { +func AllocHandle(ctx context.Context, sctx sessionctx.Context, t table.Table) (kv.Handle, error) { + if sctx != nil { + if stmtCtx := sctx.GetSessionVars().StmtCtx; stmtCtx != nil { // First try to alloc if the statement has reserved auto ID. if stmtCtx.BaseRowID < stmtCtx.MaxRowID { stmtCtx.BaseRowID += 1 @@ -1285,13 +1305,13 @@ func AllocHandle(ctx sessionctx.Context, t table.Table) (kv.Handle, error) { } } - _, rowID, err := allocHandleIDs(ctx, t, 1) + _, rowID, err := allocHandleIDs(ctx, sctx, t, 1) return kv.IntHandle(rowID), err } -func allocHandleIDs(ctx sessionctx.Context, t table.Table, n uint64) (int64, int64, error) { +func allocHandleIDs(ctx context.Context, sctx sessionctx.Context, t table.Table, n uint64) (int64, int64, error) { meta := t.Meta() - base, maxID, err := t.Allocators(ctx).Get(autoid.RowIDAllocType).Alloc(meta.ID, n, 1, 1) + base, maxID, err := t.Allocators(sctx).Get(autoid.RowIDAllocType).Alloc(ctx, meta.ID, n, 1, 1) if err != nil { return 0, 0, err } @@ -1307,7 +1327,7 @@ func allocHandleIDs(ctx sessionctx.Context, t table.Table, n uint64) (int64, int // shard = 0010000000000000000000000000000000000000000000000000000000000000 return 0, 0, autoid.ErrAutoincReadFailed } - txnCtx := ctx.GetSessionVars().TxnCtx + txnCtx := sctx.GetSessionVars().TxnCtx shard := txnCtx.GetShard(meta.ShardRowIDBits, autoid.RowIDBitLength, true, int(n)) base |= shard maxID |= shard @@ -1356,38 +1376,16 @@ func (t *TableCommon) RebaseAutoID(ctx sessionctx.Context, newBase int64, isSetS return t.Allocators(ctx).Get(tp).Rebase(t.tableID, newBase, isSetStep) } -// Seek implements table.Table Seek interface. -func (t *TableCommon) Seek(ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) { - txn, err := ctx.Txn(true) - if err != nil { - return nil, false, err - } - seekKey := tablecodec.EncodeRowKeyWithHandle(t.physicalTableID, h) - iter, err := txn.Iter(seekKey, t.RecordPrefix().PrefixNext()) - if err != nil { - return nil, false, err - } - if !iter.Valid() || !iter.Key().HasPrefix(t.RecordPrefix()) { - // No more records in the table, skip to the end. - return nil, false, nil - } - handle, err := tablecodec.DecodeRowKey(iter.Key()) - if err != nil { - return nil, false, err - } - return handle, true, nil -} - // Type implements table.Table Type interface. func (t *TableCommon) Type() table.Type { return table.NormalTable } -func shouldWriteBinlog(ctx sessionctx.Context) bool { +func shouldWriteBinlog(ctx sessionctx.Context, tblInfo *model.TableInfo) bool { if ctx.GetSessionVars().BinlogClient == nil { return false } - return !ctx.GetSessionVars().InRestrictedSQL + return !ctx.GetSessionVars().InRestrictedSQL && !tblInfo.IsCommonHandle } func (t *TableCommon) getMutation(ctx sessionctx.Context) *binlog.TableMutation { @@ -1400,7 +1398,7 @@ func (t *TableCommon) canSkip(col *table.Column, value *types.Datum) bool { // CanSkip is for these cases, we can skip the columns in encoded row: // 1. the column is included in primary key; -// 2. the column's default value is null, and the value equals to that; +// 2. the column's default value is null, and the value equals to that but has no origin default; // 3. the column is virtual generated. func CanSkip(info *model.TableInfo, col *table.Column, value *types.Datum) bool { if col.IsPKHandleColumn(info) { @@ -1413,14 +1411,11 @@ func CanSkip(info *model.TableInfo, col *table.Column, value *types.Datum) bool continue } canSkip := idxCol.Length == types.UnspecifiedLength - isNewCollation := collate.NewCollationEnabled() && - col.EvalType() == types.ETString && - !mysql.HasBinaryFlag(col.Flag) - canSkip = canSkip && !isNewCollation + canSkip = canSkip && !types.CommonHandleNeedRestoredData(&col.FieldType) return canSkip } } - if col.GetDefaultValue() == nil && value.IsNull() { + if col.GetDefaultValue() == nil && value.IsNull() && col.GetOriginDefaultValue() == nil { return true } if col.IsGenerated() && !col.GeneratedStored { @@ -1455,23 +1450,26 @@ func FindIndexByColName(t table.Table, name string) table.Index { // CheckHandleExists check whether recordID key exists. if not exists, return nil, // otherwise return kv.ErrKeyExists error. func CheckHandleExists(ctx context.Context, sctx sessionctx.Context, t table.Table, recordID kv.Handle, data []types.Datum) error { + physicalTableID := t.Meta().ID if pt, ok := t.(*partitionedTable); ok { info := t.Meta().GetPartitionInfo() pid, err := pt.locatePartition(sctx, info, data) if err != nil { return err } - t = pt.GetPartition(pid) + partition := pt.GetPartition(pid) + physicalTableID = partition.GetPhysicalID() } txn, err := sctx.Txn(true) if err != nil { return err } // Check key exists. - recordKey := t.RecordKey(recordID) + prefix := tablecodec.GenTableRecordPrefix(physicalTableID) + recordKey := tablecodec.EncodeRecordKey(prefix, recordID) _, err = txn.Get(ctx, recordKey) if err == nil { - handleStr := kv.GetDuplicateErrorHandleString(recordID) + handleStr := getDuplicateErrorHandleString(t, recordID, data) return kv.ErrKeyExists.FastGenByArgs(handleStr, "PRIMARY") } else if !kv.ErrNotExist.Equal(err) { return err @@ -1479,6 +1477,31 @@ func CheckHandleExists(ctx context.Context, sctx sessionctx.Context, t table.Tab return nil } +func getDuplicateErrorHandleString(t table.Table, handle kv.Handle, row []types.Datum) string { + if handle.IsInt() { + return kv.GetDuplicateErrorHandleString(handle) + } + var pk table.Index + for _, idx := range t.Indices() { + if idx.Meta().Primary { + pk = idx + break + } + } + if pk == nil { + return kv.GetDuplicateErrorHandleString(handle) + } + var err error + str := make([]string, len(pk.Meta().Columns)) + for i, col := range pk.Meta().Columns { + str[i], err = row[col.Offset].ToString() + if err != nil { + return kv.GetDuplicateErrorHandleString(handle) + } + } + return strings.Join(str, "-") +} + func init() { table.TableFromMeta = TableFromMeta table.MockTableFromMeta = MockTableFromMeta @@ -1671,6 +1694,50 @@ func (t *TableCommon) GetSequenceCommon() *sequenceCommon { return t.sequence } +// TryGetHandleRestoredDataWrapper tries to get the restored data for handle if needed. The argument can be a slice or a map. +func TryGetHandleRestoredDataWrapper(t table.Table, row []types.Datum, rowMap map[int64]types.Datum) []types.Datum { + if !collate.NewCollationEnabled() || !t.Meta().IsCommonHandle || t.Meta().CommonHandleVersion == 0 { + return nil + } + + useIDMap := false + if len(rowMap) > 0 { + useIDMap = true + } + + var datum types.Datum + rsData := make([]types.Datum, 0, 4) + pkCols := TryGetCommonPkColumns(t) + for _, col := range pkCols { + if !types.NeedRestoredData(&col.FieldType) { + continue + } + if collate.IsBinCollation(col.Collate) { + if useIDMap { + datum = rowMap[col.ID] + } else { + datum = row[col.Offset] + } + rsData = append(rsData, types.NewIntDatum(stringutil.GetTailSpaceCount(datum.GetString()))) + } else { + if useIDMap { + rsData = append(rsData, rowMap[col.ID]) + } else { + rsData = append(rsData, row[col.Offset]) + } + } + } + + for _, idx := range t.Meta().Indices { + if idx.Primary { + tablecodec.TruncateIndexValues(t.Meta(), idx, rsData) + break + } + } + + return rsData +} + func getSequenceAllocator(allocs autoid.Allocators) (autoid.Allocator, error) { for _, alloc := range allocs { if alloc.GetType() == autoid.SequenceType { @@ -1689,5 +1756,8 @@ func BuildTableScanFromInfos(tableInfo *model.TableInfo, columnInfos []*model.Co Columns: util.ColumnsToProto(columnInfos, tableInfo.PKIsHandle), PrimaryColumnIds: pkColIds, } + if tableInfo.IsCommonHandle { + tsExec.PrimaryPrefixColumnIds = PrimaryPrefixColumnIDs(tableInfo) + } return tsExec } diff --git a/table/tables/tables_test.go b/table/tables/tables_test.go index b9fb958e7ad11..9b7df03bb33d1 100644 --- a/table/tables/tables_test.go +++ b/table/tables/tables_test.go @@ -15,12 +15,16 @@ package tables_test import ( "context" + "math" "strconv" "testing" + "time" . "github.com/pingcap/check" "github.com/pingcap/errors" + "github.com/pingcap/parser/auth" "github.com/pingcap/parser/model" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/domain" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta/autoid" @@ -73,6 +77,36 @@ func (ts *testSuite) TearDownSuite(c *C) { testleak.AfterTest(c)() } +func firstKey(t table.Table) kv.Key { + return tablecodec.EncodeRecordKey(t.RecordPrefix(), kv.IntHandle(math.MinInt64)) +} + +func indexPrefix(t table.PhysicalTable) kv.Key { + return tablecodec.GenTableIndexPrefix(t.GetPhysicalID()) +} + +func seek(t table.PhysicalTable, ctx sessionctx.Context, h kv.Handle) (kv.Handle, bool, error) { + txn, err := ctx.Txn(true) + if err != nil { + return nil, false, err + } + recordPrefix := t.RecordPrefix() + seekKey := tablecodec.EncodeRowKeyWithHandle(t.GetPhysicalID(), h) + iter, err := txn.Iter(seekKey, recordPrefix.PrefixNext()) + if err != nil { + return nil, false, err + } + if !iter.Valid() || !iter.Key().HasPrefix(recordPrefix) { + // No more records in the table, skip to the end. + return nil, false, nil + } + handle, err := tablecodec.DecodeRowKey(iter.Key()) + if err != nil { + return nil, false, err + } + return handle, true, nil +} + type mockPumpClient struct{} func (m mockPumpClient) WriteBinlog(ctx context.Context, in *binlog.WriteBinlogReq, opts ...grpc.CallOption) (*binlog.WriteBinlogResp, error) { @@ -93,8 +127,8 @@ func (ts *testSuite) TestBasic(c *C) { c.Assert(tb.Meta().Name.L, Equals, "t") c.Assert(tb.Meta(), NotNil) c.Assert(tb.Indices(), NotNil) - c.Assert(string(tb.FirstKey()), Not(Equals), "") - c.Assert(string(tb.IndexPrefix()), Not(Equals), "") + c.Assert(string(firstKey(tb)), Not(Equals), "") + c.Assert(string(indexPrefix(tb.(table.PhysicalTable))), Not(Equals), "") c.Assert(string(tb.RecordPrefix()), Not(Equals), "") c.Assert(tables.FindIndexByColName(tb, "b"), NotNil) @@ -102,7 +136,7 @@ func (ts *testSuite) TestBasic(c *C) { c.Assert(err, IsNil) c.Assert(autoID, Greater, int64(0)) - handle, err := tables.AllocHandle(nil, tb) + handle, err := tables.AllocHandle(context.Background(), nil, tb) c.Assert(err, IsNil) c.Assert(handle.IntValue(), Greater, int64(0)) @@ -110,7 +144,7 @@ func (ts *testSuite) TestBasic(c *C) { rid, err := tb.AddRecord(ctx, types.MakeDatums(1, "abc")) c.Assert(err, IsNil) c.Assert(rid.IntValue(), Greater, int64(0)) - row, err := tb.Row(ctx, rid) + row, err := tables.RowWithCols(tb, ctx, rid, tb.Cols()) c.Assert(err, IsNil) c.Assert(len(row), Equals, 2) c.Assert(row[0].GetInt64(), Equals, int64(1)) @@ -122,23 +156,24 @@ func (ts *testSuite) TestBasic(c *C) { c.Assert(tb.UpdateRecord(context.Background(), ctx, rid, types.MakeDatums(1, "abc"), types.MakeDatums(1, "cba"), []bool{false, true}), IsNil) - tb.IterRecords(ctx, tb.FirstKey(), tb.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tb, ctx, tb.Cols(), func(_ kv.Handle, data []types.Datum, cols []*table.Column) (bool, error) { return true, nil }) + c.Assert(err, IsNil) indexCnt := func() int { - cnt, err1 := countEntriesWithPrefix(ctx, tb.IndexPrefix()) + cnt, err1 := countEntriesWithPrefix(ctx, indexPrefix(tb.(table.PhysicalTable))) c.Assert(err1, IsNil) return cnt } // RowWithCols test - vals, err := tb.RowWithCols(ctx, kv.IntHandle(1), tb.Cols()) + vals, err := tables.RowWithCols(tb, ctx, kv.IntHandle(1), tb.Cols()) c.Assert(err, IsNil) c.Assert(vals, HasLen, 2) c.Assert(vals[0].GetInt64(), Equals, int64(1)) cols := []*table.Column{tb.Cols()[1]} - vals, err = tb.RowWithCols(ctx, kv.IntHandle(1), cols) + vals, err = tables.RowWithCols(tb, ctx, kv.IntHandle(1), cols) c.Assert(err, IsNil) c.Assert(vals, HasLen, 1) c.Assert(vals[0].GetBytes(), DeepEquals, []byte("cba")) @@ -151,7 +186,7 @@ func (ts *testSuite) TestBasic(c *C) { _, err = tb.AddRecord(ctx, types.MakeDatums(1, "abc")) c.Assert(err, IsNil) c.Assert(indexCnt(), Greater, 0) - handle, found, err := tb.Seek(ctx, kv.IntHandle(0)) + handle, found, err := seek(tb.(table.PhysicalTable), ctx, kv.IntHandle(0)) c.Assert(handle.IntValue(), Equals, int64(1)) c.Assert(found, Equals, true) c.Assert(err, IsNil) @@ -241,12 +276,12 @@ func (ts *testSuite) TestUniqueIndexMultipleNullEntries(c *C) { c.Assert(tb.Meta().Name.L, Equals, "t") c.Assert(tb.Meta(), NotNil) c.Assert(tb.Indices(), NotNil) - c.Assert(string(tb.FirstKey()), Not(Equals), "") - c.Assert(string(tb.IndexPrefix()), Not(Equals), "") + c.Assert(string(firstKey(tb)), Not(Equals), "") + c.Assert(string(indexPrefix(tb.(table.PhysicalTable))), Not(Equals), "") c.Assert(string(tb.RecordPrefix()), Not(Equals), "") c.Assert(tables.FindIndexByColName(tb, "b"), NotNil) - handle, err := tables.AllocHandle(nil, tb) + handle, err := tables.AllocHandle(context.Background(), nil, tb) c.Assert(err, IsNil) c.Assert(handle.IntValue(), Greater, int64(0)) @@ -309,15 +344,17 @@ func (ts *testSuite) TestRowKeyCodec(c *C) { } func (ts *testSuite) TestUnsignedPK(c *C) { - ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tPK") - _, err := ts.se.Execute(context.Background(), "CREATE TABLE test.tPK (a bigint unsigned primary key, b varchar(255))") + _, err := ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tPK") + c.Assert(err, IsNil) + _, err = ts.se.Execute(context.Background(), "CREATE TABLE test.tPK (a bigint unsigned primary key, b varchar(255))") c.Assert(err, IsNil) tb, err := ts.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tPK")) c.Assert(err, IsNil) c.Assert(ts.se.NewTxn(context.Background()), IsNil) rid, err := tb.AddRecord(ts.se, types.MakeDatums(1, "abc")) c.Assert(err, IsNil) - row, err := tb.Row(ts.se, rid) + pt := tb.(table.PhysicalTable) + row, err := tables.RowWithCols(pt, ts.se, rid, tb.Cols()) c.Assert(err, IsNil) c.Assert(len(row), Equals, 2) c.Assert(row[0].Kind(), Equals, types.KindUint64) @@ -328,8 +365,9 @@ func (ts *testSuite) TestUnsignedPK(c *C) { } func (ts *testSuite) TestIterRecords(c *C) { - ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tIter") - _, err := ts.se.Execute(context.Background(), "CREATE TABLE test.tIter (a int primary key, b int)") + _, err := ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tIter") + c.Assert(err, IsNil) + _, err = ts.se.Execute(context.Background(), "CREATE TABLE test.tIter (a int primary key, b int)") c.Assert(err, IsNil) _, err = ts.se.Execute(context.Background(), "INSERT test.tIter VALUES (-1, 2), (2, NULL)") c.Assert(err, IsNil) @@ -337,7 +375,7 @@ func (ts *testSuite) TestIterRecords(c *C) { tb, err := ts.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tIter")) c.Assert(err, IsNil) totalCount := 0 - err = tb.IterRecords(ts.se, tb.FirstKey(), tb.Cols(), func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tb, ts.se, tb.Cols(), func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { totalCount++ c.Assert(rec[0].IsNull(), IsFalse) return true, nil @@ -354,16 +392,20 @@ func (ts *testSuite) TestTableFromMeta(c *C) { tk.MustExec("use test") tk.MustExec("CREATE TABLE meta (a int primary key auto_increment, b varchar(255) unique)") c.Assert(ts.se.NewTxn(context.Background()), IsNil) + _, err := ts.se.Txn(true) + c.Assert(err, IsNil) tb, err := ts.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("meta")) c.Assert(err, IsNil) tbInfo := tb.Meta() // For test coverage tbInfo.Columns[0].GeneratedExprString = "a" - tables.TableFromMeta(nil, tbInfo) + _, err = tables.TableFromMeta(nil, tbInfo) + c.Assert(err, IsNil) tbInfo.Columns[0].GeneratedExprString = "test" - tables.TableFromMeta(nil, tbInfo) + _, err = tables.TableFromMeta(nil, tbInfo) + c.Assert(err, NotNil) tbInfo.Columns[0].State = model.StateNone tb, err = tables.TableFromMeta(nil, tbInfo) c.Assert(tb, IsNil) @@ -385,14 +427,14 @@ func (ts *testSuite) TestTableFromMeta(c *C) { tk.MustExec("create table t_meta (a int) shard_row_id_bits = 15") tb, err = domain.GetDomain(tk.Se).InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("t_meta")) c.Assert(err, IsNil) - _, err = tables.AllocHandle(tk.Se, tb) + _, err = tables.AllocHandle(context.Background(), tk.Se, tb) c.Assert(err, IsNil) maxID := 1<<(64-15-1) - 1 err = tb.RebaseAutoID(tk.Se, int64(maxID), false, autoid.RowIDAllocType) c.Assert(err, IsNil) - _, err = tables.AllocHandle(tk.Se, tb) + _, err = tables.AllocHandle(context.Background(), tk.Se, tb) c.Assert(err, NotNil) } @@ -465,7 +507,7 @@ func (ts *testSuite) TestHiddenColumn(c *C) { " `a` int(11) NOT NULL,\n" + " `c` int(11) DEFAULT NULL,\n" + " `e` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`a`)\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) // Test show (extended) columns @@ -567,7 +609,7 @@ func (ts *testSuite) TestHiddenColumn(c *C) { " `a` int(11) NOT NULL,\n" + " `c` int(11) DEFAULT NULL,\n" + " `e` int(11) DEFAULT NULL,\n" + - " PRIMARY KEY (`a`)\n" + + " PRIMARY KEY (`a`) /*T![clustered_index] CLUSTERED */\n" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin")) tk.MustQuery("show extended columns from t").Check(testutil.RowsWithSep("|", "a|int(11)|NO|PRI||", @@ -579,12 +621,16 @@ func (ts *testSuite) TestHiddenColumn(c *C) { } func (ts *testSuite) TestAddRecordWithCtx(c *C) { - ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tRecord") - _, err := ts.se.Execute(context.Background(), "CREATE TABLE test.tRecord (a bigint unsigned primary key, b varchar(255))") + _, err := ts.se.Execute(context.Background(), "DROP TABLE IF EXISTS test.tRecord") + c.Assert(err, IsNil) + _, err = ts.se.Execute(context.Background(), "CREATE TABLE test.tRecord (a bigint unsigned primary key, b varchar(255))") c.Assert(err, IsNil) tb, err := ts.dom.InfoSchema().TableByName(model.NewCIStr("test"), model.NewCIStr("tRecord")) c.Assert(err, IsNil) - defer ts.se.Execute(context.Background(), "DROP TABLE test.tRecord") + defer func() { + _, err := ts.se.Execute(context.Background(), "DROP TABLE test.tRecord") + c.Assert(err, IsNil) + }() c.Assert(ts.se.NewTxn(context.Background()), IsNil) _, err = ts.se.Txn(true) @@ -597,14 +643,14 @@ func (ts *testSuite) TestAddRecordWithCtx(c *C) { for _, r := range records { rid, err := tb.AddRecord(ts.se, r) c.Assert(err, IsNil) - row, err := tb.Row(ts.se, rid) + row, err := tables.RowWithCols(tb.(table.PhysicalTable), ts.se, rid, tb.Cols()) c.Assert(err, IsNil) c.Assert(len(row), Equals, len(r)) c.Assert(row[0].Kind(), Equals, types.KindUint64) } i := 0 - err = tb.IterRecords(ts.se, tb.FirstKey(), tb.Cols(), func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { + err = tables.IterRecords(tb, ts.se, tb.Cols(), func(_ kv.Handle, rec []types.Datum, cols []*table.Column) (bool, error) { i++ return true, nil }) @@ -616,3 +662,87 @@ func (ts *testSuite) TestAddRecordWithCtx(c *C) { c.Assert(err, IsNil) c.Assert(txn.Commit(context.Background()), IsNil) } + +func (ts *testSuite) TestConstraintCheckForUniqueIndex(c *C) { + // auto-commit + tk := testkit.NewTestKit(c, ts.store) + tk.MustExec("set @@autocommit = 1") + tk.MustExec("use test") + tk.MustExec("drop table if exists ttt") + tk.MustExec("create table ttt(id int(11) NOT NULL AUTO_INCREMENT,k int(11) NOT NULL DEFAULT '0',c char(120) NOT NULL DEFAULT '',PRIMARY KEY (id),UNIQUE KEY k_1 (k,c))") + tk.MustExec("insert into ttt(k,c) values(1, 'tidb')") + tk.MustExec("insert into ttt(k,c) values(2, 'tidb')") + _, err := tk.Exec("update ttt set k=1 where id=2") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1-tidb' for key 'k_1'") + tk.MustExec("rollback") + + // no auto-commit + tk.MustExec("set @@autocommit = 0") + tk.MustExec("set @@tidb_constraint_check_in_place = 0") + tk.MustExec("begin") + _, err = tk.Exec("update ttt set k=1 where id=2") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1-tidb' for key 'k_1'") + tk.MustExec("rollback") + + tk.MustExec("set @@tidb_constraint_check_in_place = 1") + tk.MustExec("begin") + _, err = tk.Exec("update ttt set k=1 where id=2") + c.Assert(err.Error(), Equals, "[kv:1062]Duplicate entry '1-tidb' for key 'k_1'") + tk.MustExec("rollback") + + // This test check that with @@tidb_constraint_check_in_place = 0, although there is not KV request for the unique index, the pessimistic lock should still be written. + tk1 := testkit.NewTestKit(c, ts.store) + tk2 := testkit.NewTestKit(c, ts.store) + tk1.MustExec("set @@tidb_txn_mode = 'pessimistic'") + tk1.MustExec("set @@tidb_constraint_check_in_place = 0") + tk2.MustExec("set @@tidb_txn_mode = 'pessimistic'") + tk1.MustExec("use test") + tk1.MustExec("begin") + tk1.MustExec("update ttt set k=3 where id=2") + + ch := make(chan int, 2) + go func() { + tk2.MustExec("use test") + _, err = tk2.Exec("insert into ttt(k,c) values(3, 'tidb')") + c.Assert(err, IsNil) + ch <- 2 + }() + // Sleep 100ms for tk2 to execute, if it's not blocked, 2 should have been sent to the channel. + time.Sleep(100 * time.Millisecond) + ch <- 1 + _, err = tk1.Exec("commit") + c.Assert(err, IsNil) + // The data in channel is 1 means tk2 is blocked, that's the expected behavior. + c.Assert(<-ch, Equals, 1) +} + +func (ts *testSuite) TestViewColumns(c *C) { + se, err := session.CreateSession4Test(ts.store) + c.Assert(err, IsNil) + c.Assert(se.Auth(&auth.UserIdentity{Username: "root", Hostname: "%"}, nil, nil), IsTrue) + tk := testkit.NewTestKitWithSession(c, ts.store, se) + tk.MustExec("use test") + tk.MustExec("drop table if exists t") + tk.MustExec("create table t(a int primary key, b varchar(20))") + tk.MustExec("drop view if exists v") + tk.MustExec("create view v as select * from t") + tk.MustExec("drop view if exists va") + tk.MustExec("create view va as select count(a) from t") + testCases := []struct { + query string + expected []string + }{ + {"select data_type from INFORMATION_SCHEMA.columns where table_name = 'v'", []string{types.TypeToStr(mysql.TypeLong, ""), types.TypeToStr(mysql.TypeVarchar, "")}}, + {"select data_type from INFORMATION_SCHEMA.columns where table_name = 'va'", []string{types.TypeToStr(mysql.TypeLonglong, "")}}, + } + for _, testCase := range testCases { + tk.MustQuery(testCase.query).Check(testutil.RowsWithSep("|", testCase.expected...)) + } + tk.MustExec("drop table if exists t") + for _, testCase := range testCases { + c.Assert(tk.MustQuery(testCase.query).Rows(), HasLen, 0) + tk.MustQuery("show warnings").Check(testutil.RowsWithSep("|", + "Warning|1356|View 'test.v' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them", + "Warning|1356|View 'test.va' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them")) + } +} diff --git a/tablecodec/bench_test.go b/tablecodec/bench_test.go index b025e8beb96bc..b6e4afc663d1b 100644 --- a/tablecodec/bench_test.go +++ b/tablecodec/bench_test.go @@ -46,6 +46,9 @@ func BenchmarkEncodeRowKeyWithPrefixNex(b *testing.B) { func BenchmarkDecodeRowKey(b *testing.B) { rowKey := EncodeRowKeyWithHandle(100, kv.IntHandle(100)) for i := 0; i < b.N; i++ { - DecodeRowKey(rowKey) + _, err := DecodeRowKey(rowKey) + if err != nil { + b.Fatal(err) + } } } diff --git a/tablecodec/tablecodec.go b/tablecodec/tablecodec.go index 953614205a805..9b7b933305eca 100644 --- a/tablecodec/tablecodec.go +++ b/tablecodec/tablecodec.go @@ -17,6 +17,7 @@ import ( "bytes" "encoding/binary" "math" + "strings" "time" "unicode/utf8" @@ -32,13 +33,15 @@ import ( "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/codec" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/rowcodec" + "github.com/pingcap/tidb/util/stringutil" ) var ( - errInvalidKey = terror.ClassXEval.New(errno.ErrInvalidKey, errno.MySQLErrName[errno.ErrInvalidKey]) - errInvalidRecordKey = terror.ClassXEval.New(errno.ErrInvalidRecordKey, errno.MySQLErrName[errno.ErrInvalidRecordKey]) - errInvalidIndexKey = terror.ClassXEval.New(errno.ErrInvalidIndexKey, errno.MySQLErrName[errno.ErrInvalidIndexKey]) + errInvalidKey = dbterror.ClassXEval.NewStd(errno.ErrInvalidKey) + errInvalidRecordKey = dbterror.ClassXEval.NewStd(errno.ErrInvalidRecordKey) + errInvalidIndexKey = dbterror.ClassXEval.NewStd(errno.ErrInvalidIndexKey) ) var ( @@ -63,6 +66,8 @@ const ( CommonHandleFlag byte = 127 // PartitionIDFlag is the flag used to decode the partition ID in global index value. PartitionIDFlag byte = 126 + // IndexVersionFlag is the flag used to decode the index's version info. + IndexVersionFlag byte = 125 // RestoreDataFlag is the flag that RestoreData begin with. // See rowcodec.Encoder.Encode and rowcodec.row.toBytes RestoreDataFlag byte = rowcodec.CodecVer @@ -473,6 +478,9 @@ func DecodeHandleToDatumMap(handle kv.Handle, handleColIDs []int64, if id != hid { continue } + if types.CommonHandleNeedRestoredData(ft) { + continue + } d, err := decodeHandleToDatum(handle, ft, idx) if err != nil { return row, err @@ -715,6 +723,19 @@ func reEncodeHandle(handle kv.Handle, unsigned bool) ([][]byte, error) { return [][]byte{intHandleBytes}, err } +// reEncodeHandleConsiderNewCollation encodes the handle as a Datum so it can be properly decoded later. +func reEncodeHandleConsiderNewCollation(handle kv.Handle, columns []rowcodec.ColInfo, restoreData []byte) ([][]byte, error) { + handleColLen := handle.NumCols() + cHandleBytes := make([][]byte, 0, handleColLen) + for i := 0; i < handleColLen; i++ { + cHandleBytes = append(cHandleBytes, handle.EncodedCol(i)) + } + if len(restoreData) == 0 { + return cHandleBytes, nil + } + return decodeRestoredValuesV5(columns, cHandleBytes, restoreData) +} + func decodeRestoredValues(columns []rowcodec.ColInfo, restoredVal []byte) ([][]byte, error) { colIDs := make(map[int64]int, len(columns)) for i, col := range columns { @@ -729,6 +750,78 @@ func decodeRestoredValues(columns []rowcodec.ColInfo, restoredVal []byte) ([][]b return resultValues, nil } +// decodeRestoredValuesV5 decodes index values whose format is introduced in TiDB 5.0. +// Unlike the format in TiDB 4.0, the new format is optimized for storage space: +// 1. If the index is a composed index, only the non-binary string column's value need to write to value, not all. +// 2. If a string column's collation is _bin, then we only write the number of the truncated spaces to value. +// 3. If a string column is char, not varchar, then we use the sortKey directly. +func decodeRestoredValuesV5(columns []rowcodec.ColInfo, results [][]byte, restoredVal []byte) ([][]byte, error) { + colIDOffsets := buildColumnIDOffsets(columns) + colInfosNeedRestore := buildRestoredColumn(columns) + rd := rowcodec.NewByteDecoder(colInfosNeedRestore, nil, nil, nil) + newResults, err := rd.DecodeToBytesNoHandle(colIDOffsets, restoredVal) + if err != nil { + return nil, errors.Trace(err) + } + for i := range newResults { + noRestoreData := len(newResults[i]) == 0 + if noRestoreData { + newResults[i] = results[i] + continue + } + if collate.IsBinCollation(columns[i].Ft.Collate) { + noPaddingDatum, err := DecodeColumnValue(results[i], columns[i].Ft, nil) + if err != nil { + return nil, errors.Trace(err) + } + paddingCountDatum, err := DecodeColumnValue(newResults[i], types.NewFieldType(mysql.TypeLonglong), nil) + if err != nil { + return nil, errors.Trace(err) + } + noPaddingStr, paddingCount := noPaddingDatum.GetString(), int(paddingCountDatum.GetInt64()) + // Skip if padding count is 0. + if paddingCount == 0 { + newResults[i] = results[i] + continue + } + newDatum := &noPaddingDatum + newDatum.SetString(noPaddingStr+strings.Repeat(" ", paddingCount), newDatum.Collation()) + newResults[i] = newResults[i][:0] + newResults[i] = append(newResults[i], rowcodec.BytesFlag) + newResults[i] = codec.EncodeBytes(newResults[i], newDatum.GetBytes()) + } + } + return newResults, nil +} + +func buildColumnIDOffsets(allCols []rowcodec.ColInfo) map[int64]int { + colIDOffsets := make(map[int64]int, len(allCols)) + for i, col := range allCols { + colIDOffsets[col.ID] = i + } + return colIDOffsets +} + +func buildRestoredColumn(allCols []rowcodec.ColInfo) []rowcodec.ColInfo { + restoredColumns := make([]rowcodec.ColInfo, 0, len(allCols)) + for i, col := range allCols { + if !types.NeedRestoredData(col.Ft) { + continue + } + copyColInfo := rowcodec.ColInfo{ + ID: col.ID, + } + if collate.IsBinCollation(col.Ft.Collate) { + // Change the fieldType from string to uint since we store the number of the truncated spaces. + copyColInfo.Ft = types.NewFieldType(mysql.TypeLonglong) + } else { + copyColInfo.Ft = allCols[i].Ft + } + restoredColumns = append(restoredColumns, copyColInfo) + } + return restoredColumns +} + func decodeIndexKvOldCollation(key, value []byte, colsLen int, hdStatus HandleStatus) ([][]byte, error) { resultValues, b, err := CutIndexKeyNew(key, colsLen) if err != nil { @@ -761,11 +854,27 @@ func decodeIndexKvOldCollation(key, value []byte, colsLen int, hdStatus HandleSt return resultValues, nil } +func getIndexVersion(value []byte) int { + if len(value) <= MaxOldEncodeValueLen { + return 0 + } + tailLen := int(value[0]) + if (tailLen == 0 || tailLen == 1) && value[1] == IndexVersionFlag { + return int(value[2]) + } + return 0 +} + // DecodeIndexKV uses to decode index key values. +// `colsLen` is expected to be index columns count. +// `columns` is expected to be index columns + handle columns(if hdStatus is not HandleNotNeeded). func DecodeIndexKV(key, value []byte, colsLen int, hdStatus HandleStatus, columns []rowcodec.ColInfo) ([][]byte, error) { if len(value) <= MaxOldEncodeValueLen { return decodeIndexKvOldCollation(key, value, colsLen, hdStatus) } + if getIndexVersion(value) == 1 { + return decodeIndexKvForClusteredIndexVersion1(key, value, colsLen, hdStatus, columns) + } return decodeIndexKvGeneral(key, value, colsLen, hdStatus, columns) } @@ -796,6 +905,10 @@ func decodeHandleInIndexKey(keySuffix []byte) (kv.Handle, error) { } func decodeHandleInIndexValue(value []byte) (kv.Handle, error) { + if getIndexVersion(value) == 1 { + seg := SplitIndexValueForClusteredIndexVersion1(value) + return kv.NewCommonHandle(seg.CommonHandle) + } if len(value) > MaxOldEncodeValueLen { tailLen := value[0] if tailLen >= 8 { @@ -856,6 +969,11 @@ func GenTableIndexPrefix(tableID int64) kv.Key { return appendTableIndexPrefix(buf, tableID) } +// IsRecordKey is used to check whether the key is an record key. +func IsRecordKey(k []byte) bool { + return len(k) > 11 && k[0] == 't' && k[10] == 'r' +} + // IsIndexKey is used to check whether the key is an index key. func IsIndexKey(k []byte) bool { return len(k) > 11 && k[0] == 't' && k[10] == 'i' @@ -955,15 +1073,143 @@ func GenIndexKey(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo return } -// GenIndexValue creates encoded index value and returns the result, only support local index -func GenIndexValue(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, containNonBinaryString bool, - distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle) ([]byte, error) { - return GenIndexValueNew(sc, tblInfo, idxInfo, containNonBinaryString, distinct, untouched, indexedValues, h, 0) +// GenIndexValuePortal is the portal for generating index value. +// Value layout: +// +-- IndexValueVersion0 (with restore data, or common handle, or index is global) +// | +// | Layout: TailLen | Options | Padding | [IntHandle] | [UntouchedFlag] +// | Length: 1 | len(options) | len(padding) | 8 | 1 +// | +// | TailLen: len(padding) + len(IntHandle) + len(UntouchedFlag) +// | Options: Encode some value for new features, such as common handle, new collations or global index. +// | See below for more information. +// | Padding: Ensure length of value always >= 10. (or >= 11 if UntouchedFlag exists.) +// | IntHandle: Only exists when table use int handles and index is unique. +// | UntouchedFlag: Only exists when index is untouched. +// | +// +-- Old Encoding (without restore data, integer handle, local) +// | +// | Layout: [Handle] | [UntouchedFlag] +// | Length: 8 | 1 +// | +// | Handle: Only exists in unique index. +// | UntouchedFlag: Only exists when index is untouched. +// | +// | If neither Handle nor UntouchedFlag exists, value will be one single byte '0' (i.e. []byte{'0'}). +// | Length of value <= 9, use to distinguish from the new encoding. +// | +// +-- IndexValueForClusteredIndexVersion1 +// | +// | Layout: TailLen | VersionFlag | Version | Options | [UntouchedFlag] +// | Length: 1 | 1 | 1 | len(options) | 1 +// | +// | TailLen: len(UntouchedFlag) +// | Options: Encode some value for new features, such as common handle, new collations or global index. +// | See below for more information. +// | UntouchedFlag: Only exists when index is untouched. +// | +// | Layout of Options: +// | +// | Segment: Common Handle | Global Index | New Collation +// | Layout: CHandle Flag | CHandle Len | CHandle | PidFlag | PartitionID | restoreData +// | Length: 1 | 2 | len(CHandle) | 1 | 8 | len(restoreData) +// | +// | Common Handle Segment: Exists when unique index used common handles. +// | Global Index Segment: Exists when index is global. +// | New Collation Segment: Exists when new collation is used and index or handle contains non-binary string. +// | In v4.0, restored data contains all the index values. For example, (a int, b char(10)) and index (a, b). +// | The restored data contains both the values of a and b. +// | In v5.0, restored data contains only non-binary data(except for char and _bin). In the above example, the restored data contains only the value of b. +// | Besides, if the collation of b is _bin, then restored data is an integer indicate the spaces are truncated. Then we use sortKey +// | and the restored data together to restore original data. +func GenIndexValuePortal(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, needRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64, restoredData []types.Datum) ([]byte, error) { + if tblInfo.IsCommonHandle && tblInfo.CommonHandleVersion == 1 { + return GenIndexValueForClusteredIndexVersion1(sc, tblInfo, idxInfo, needRestoredData, distinct, untouched, indexedValues, h, partitionID, restoredData) + } + return genIndexValueVersion0(sc, tblInfo, idxInfo, needRestoredData, distinct, untouched, indexedValues, h, partitionID) +} + +// TryGetCommonPkColumnRestoredIds get the IDs of primary key columns which need restored data if the table has common handle. +// Caller need to make sure the table has common handle. +func TryGetCommonPkColumnRestoredIds(tbl *model.TableInfo) []int64 { + var pkColIds []int64 + var pkIdx *model.IndexInfo + for _, idx := range tbl.Indices { + if idx.Primary { + pkIdx = idx + break + } + } + if pkIdx == nil { + return pkColIds + } + for _, idxCol := range pkIdx.Columns { + if types.NeedRestoredData(&tbl.Columns[idxCol.Offset].FieldType) { + pkColIds = append(pkColIds, tbl.Columns[idxCol.Offset].ID) + } + } + return pkColIds } -// GenIndexValueNew create index value for both local and global index. -func GenIndexValueNew(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, containNonBinaryString bool, - distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64) ([]byte, error) { +// GenIndexValueForClusteredIndexVersion1 generates the index value for the clustered index with version 1(New in v5.0.0). +func GenIndexValueForClusteredIndexVersion1(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64, handleRestoredData []types.Datum) ([]byte, error) { + idxVal := make([]byte, 1) + tailLen := 0 + // Version info. + idxVal = append(idxVal, IndexVersionFlag) + idxVal = append(idxVal, byte(1)) + + if distinct { + idxVal = encodeCommonHandle(idxVal, h) + } + if idxInfo.Global { + idxVal = encodePartitionID(idxVal, partitionID) + } + if collate.NewCollationEnabled() && (IdxValNeedRestoredData || len(handleRestoredData) > 0) { + colIds := make([]int64, 0, len(idxInfo.Columns)) + allRestoredData := make([]types.Datum, 0, len(handleRestoredData)+len(idxInfo.Columns)) + for i, idxCol := range idxInfo.Columns { + col := tblInfo.Columns[idxCol.Offset] + // If the column is the primary key's column, + // the restored data will be written later. Skip writing it here to avoid redundancy. + if mysql.HasPriKeyFlag(col.Flag) { + continue + } + if types.NeedRestoredData(&col.FieldType) { + colIds = append(colIds, col.ID) + if collate.IsBinCollation(col.Collate) { + allRestoredData = append(allRestoredData, types.NewUintDatum(uint64(stringutil.GetTailSpaceCount(indexedValues[i].GetString())))) + } else { + allRestoredData = append(allRestoredData, indexedValues[i]) + } + } + } + + if len(handleRestoredData) > 0 { + pkColIds := TryGetCommonPkColumnRestoredIds(tblInfo) + colIds = append(colIds, pkColIds...) + allRestoredData = append(allRestoredData, handleRestoredData...) + } + + rd := rowcodec.Encoder{Enable: true} + rowRestoredValue, err := rd.Encode(sc, colIds, allRestoredData, nil) + if err != nil { + return nil, err + } + idxVal = append(idxVal, rowRestoredValue...) + } + + if untouched { + tailLen = 1 + idxVal = append(idxVal, kv.UnCommitIndexKVFlag) + } + idxVal[0] = byte(tailLen) + + return idxVal, nil +} + +// genIndexValueVersion0 create index value for both local and global index. +func genIndexValueVersion0(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, idxInfo *model.IndexInfo, IdxValNeedRestoredData bool, distinct bool, untouched bool, indexedValues []types.Datum, h kv.Handle, partitionID int64) ([]byte, error) { idxVal := make([]byte, 1) newEncode := false tailLen := 0 @@ -975,7 +1221,7 @@ func GenIndexValueNew(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, id idxVal = encodePartitionID(idxVal, partitionID) newEncode = true } - if collate.NewCollationEnabled() && containNonBinaryString { + if collate.NewCollationEnabled() && IdxValNeedRestoredData { colIds := make([]int64, len(idxInfo.Columns)) for i, col := range idxInfo.Columns { colIds[i] = tblInfo.Columns[col.Offset].ID @@ -1030,32 +1276,35 @@ func GenIndexValueNew(sc *stmtctx.StatementContext, tblInfo *model.TableInfo, id // TruncateIndexValues truncates the index values created using only the leading part of column values. func TruncateIndexValues(tblInfo *model.TableInfo, idxInfo *model.IndexInfo, indexedValues []types.Datum) { for i := 0; i < len(indexedValues); i++ { - v := &indexedValues[i] idxCol := idxInfo.Columns[i] - noPrefixIndex := idxCol.Length == types.UnspecifiedLength - if noPrefixIndex { - continue - } - notStringType := v.Kind() != types.KindString && v.Kind() != types.KindBytes - if notStringType { - continue - } + tblCol := tblInfo.Columns[idxCol.Offset] + TruncateIndexValue(&indexedValues[i], idxCol, tblCol) + } +} - colInfo := tblInfo.Columns[idxCol.Offset] - isUTF8Charset := colInfo.Charset == charset.CharsetUTF8 || colInfo.Charset == charset.CharsetUTF8MB4 - if isUTF8Charset && utf8.RuneCount(v.GetBytes()) > idxCol.Length { - rs := bytes.Runes(v.GetBytes()) - truncateStr := string(rs[:idxCol.Length]) - // truncate value and limit its length - v.SetString(truncateStr, colInfo.Collate) - if v.Kind() == types.KindBytes { - v.SetBytes(v.GetBytes()) - } - } else if !isUTF8Charset && len(v.GetBytes()) > idxCol.Length { - v.SetBytes(v.GetBytes()[:idxCol.Length]) - if v.Kind() == types.KindString { - v.SetString(v.GetString(), colInfo.Collate) - } +// TruncateIndexValue truncate one value in the index. +func TruncateIndexValue(v *types.Datum, idxCol *model.IndexColumn, tblCol *model.ColumnInfo) { + noPrefixIndex := idxCol.Length == types.UnspecifiedLength + if noPrefixIndex { + return + } + notStringType := v.Kind() != types.KindString && v.Kind() != types.KindBytes + if notStringType { + return + } + isUTF8Charset := tblCol.Charset == charset.CharsetUTF8 || tblCol.Charset == charset.CharsetUTF8MB4 + if isUTF8Charset && utf8.RuneCount(v.GetBytes()) > idxCol.Length { + rs := bytes.Runes(v.GetBytes()) + truncateStr := string(rs[:idxCol.Length]) + // truncate value and limit its length + v.SetString(truncateStr, tblCol.Collate) + if v.Kind() == types.KindBytes { + v.SetBytes(v.GetBytes()) + } + } else if !isUTF8Charset && len(v.GetBytes()) > idxCol.Length { + v.SetBytes(v.GetBytes()[:idxCol.Length]) + if v.Kind() == types.KindString { + v.SetString(v.GetString(), tblCol.Collate) } } } @@ -1091,6 +1340,15 @@ func DecodeHandleInUniqueIndexValue(data []byte, isCommonHandle bool) (kv.Handle } return kv.IntHandle(int64(binary.BigEndian.Uint64(data[dLen-int(data[0]):]))), nil } + if getIndexVersion(data) == 1 { + seg := SplitIndexValueForClusteredIndexVersion1(data) + h, err := kv.NewCommonHandle(seg.CommonHandle) + if err != nil { + return nil, err + } + return h, nil + } + tailLen := int(data[0]) data = data[:len(data)-tailLen] handleLen := uint16(data[2])<<8 + uint16(data[3]) @@ -1108,50 +1366,121 @@ func encodePartitionID(idxVal []byte, partitionID int64) []byte { return idxVal } -type indexValueSegments struct { - commonHandle []byte - partitionID []byte - restoredValues []byte - intHandle []byte +// IndexValueSegments use to store result of SplitIndexValue. +type IndexValueSegments struct { + CommonHandle []byte + PartitionID []byte + RestoredValues []byte + IntHandle []byte } -// splitIndexValue splits index value into segments. -func splitIndexValue(value []byte) (segs indexValueSegments) { +// SplitIndexValue splits index value into segments. +func SplitIndexValue(value []byte) (segs IndexValueSegments) { tailLen := int(value[0]) tail := value[len(value)-tailLen:] value = value[1 : len(value)-tailLen] if len(tail) >= 8 { - segs.intHandle = tail[:8] + segs.IntHandle = tail[:8] + } + if len(value) > 0 && value[0] == CommonHandleFlag { + handleLen := uint16(value[1])<<8 + uint16(value[2]) + handleEndOff := 3 + handleLen + segs.CommonHandle = value[3:handleEndOff] + value = value[handleEndOff:] + } + if len(value) > 0 && value[0] == PartitionIDFlag { + segs.PartitionID = value[1:9] + value = value[9:] } + if len(value) > 0 && value[0] == RestoreDataFlag { + segs.RestoredValues = value + } + return +} + +// SplitIndexValueForClusteredIndexVersion1 splits index value into segments. +func SplitIndexValueForClusteredIndexVersion1(value []byte) (segs IndexValueSegments) { + tailLen := int(value[0]) + // Skip the tailLen and version info. + value = value[3 : len(value)-tailLen] if len(value) > 0 && value[0] == CommonHandleFlag { handleLen := uint16(value[1])<<8 + uint16(value[2]) handleEndOff := 3 + handleLen - segs.commonHandle = value[3:handleEndOff] + segs.CommonHandle = value[3:handleEndOff] value = value[handleEndOff:] } if len(value) > 0 && value[0] == PartitionIDFlag { - segs.partitionID = value[1:9] + segs.PartitionID = value[1:9] value = value[9:] } if len(value) > 0 && value[0] == RestoreDataFlag { - segs.restoredValues = value + segs.RestoredValues = value } return } +func decodeIndexKvForClusteredIndexVersion1(key, value []byte, colsLen int, hdStatus HandleStatus, columns []rowcodec.ColInfo) ([][]byte, error) { + var resultValues [][]byte + var keySuffix []byte + var handle kv.Handle + var err error + segs := SplitIndexValueForClusteredIndexVersion1(value) + resultValues, keySuffix, err = CutIndexKeyNew(key, colsLen) + if err != nil { + return nil, err + } + if segs.RestoredValues != nil { + resultValues, err = decodeRestoredValuesV5(columns[:colsLen], resultValues, segs.RestoredValues) + if err != nil { + return nil, err + } + } + if hdStatus == HandleNotNeeded { + return resultValues, nil + } + if segs.CommonHandle != nil { + // In unique common handle index. + handle, err = kv.NewCommonHandle(segs.CommonHandle) + } else { + // In non-unique index, decode handle in keySuffix. + handle, err = kv.NewCommonHandle(keySuffix) + } + if err != nil { + return nil, err + } + handleBytes, err := reEncodeHandleConsiderNewCollation(handle, columns[colsLen:], segs.RestoredValues) + if err != nil { + return nil, err + } + resultValues = append(resultValues, handleBytes...) + if segs.PartitionID != nil { + _, pid, err := codec.DecodeInt(segs.PartitionID) + if err != nil { + return nil, err + } + datum := types.NewIntDatum(pid) + pidBytes, err := codec.EncodeValue(nil, nil, datum) + if err != nil { + return nil, err + } + resultValues = append(resultValues, pidBytes) + } + return resultValues, nil +} + // decodeIndexKvGeneral decodes index key value pair of new layout in an extensible way. func decodeIndexKvGeneral(key, value []byte, colsLen int, hdStatus HandleStatus, columns []rowcodec.ColInfo) ([][]byte, error) { var resultValues [][]byte var keySuffix []byte var handle kv.Handle var err error - segs := splitIndexValue(value) + segs := SplitIndexValue(value) resultValues, keySuffix, err = CutIndexKeyNew(key, colsLen) if err != nil { return nil, err } - if segs.restoredValues != nil { // new collation - resultValues, err = decodeRestoredValues(columns[:colsLen], segs.restoredValues) + if segs.RestoredValues != nil { // new collation + resultValues, err = decodeRestoredValues(columns[:colsLen], segs.RestoredValues) if err != nil { return nil, err } @@ -1160,12 +1489,12 @@ func decodeIndexKvGeneral(key, value []byte, colsLen int, hdStatus HandleStatus, return resultValues, nil } - if segs.intHandle != nil { + if segs.IntHandle != nil { // In unique int handle index. - handle = decodeIntHandleInIndexValue(segs.intHandle) - } else if segs.commonHandle != nil { + handle = decodeIntHandleInIndexValue(segs.IntHandle) + } else if segs.CommonHandle != nil { // In unique common handle index. - handle, err = decodeHandleInIndexKey(segs.commonHandle) + handle, err = decodeHandleInIndexKey(segs.CommonHandle) if err != nil { return nil, err } @@ -1181,8 +1510,8 @@ func decodeIndexKvGeneral(key, value []byte, colsLen int, hdStatus HandleStatus, return nil, err } resultValues = append(resultValues, handleBytes...) - if segs.partitionID != nil { - _, pid, err := codec.DecodeInt(segs.partitionID) + if segs.PartitionID != nil { + _, pid, err := codec.DecodeInt(segs.PartitionID) if err != nil { return nil, err } diff --git a/tablecodec/tablecodec_test.go b/tablecodec/tablecodec_test.go index 0e3a9fb906bb2..82ad65c32b5d8 100644 --- a/tablecodec/tablecodec_test.go +++ b/tablecodec/tablecodec_test.go @@ -108,7 +108,7 @@ func (s *testTableCodecSuite) TestRowCodec(c *C) { } // colMap may contains more columns than encoded row. - //colMap[4] = types.NewFieldType(mysql.TypeFloat) + // colMap[4] = types.NewFieldType(mysql.TypeFloat) r, err = DecodeRowToDatumMap(bs, colMap, time.UTC) c.Assert(err, IsNil) c.Assert(r, NotNil) @@ -544,7 +544,10 @@ func BenchmarkEncodeValue(b *testing.B) { for i := 0; i < b.N; i++ { for _, d := range row { encodedCol = encodedCol[:0] - EncodeValue(nil, encodedCol, d) + _, err := EncodeValue(nil, encodedCol, d) + if err != nil { + b.Fatal(err) + } } } } diff --git a/telemetry/data_cluster_hardware.go b/telemetry/data_cluster_hardware.go index 318e1ba63f48f..eb380e9503ac7 100644 --- a/telemetry/data_cluster_hardware.go +++ b/telemetry/data_cluster_hardware.go @@ -14,6 +14,7 @@ package telemetry import ( + "context" "regexp" "sort" "strings" @@ -66,7 +67,12 @@ func normalizeFieldName(name string) string { } func getClusterHardware(ctx sessionctx.Context) ([]*clusterHardwareItem, error) { - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(`SELECT TYPE, INSTANCE, DEVICE_TYPE, DEVICE_NAME, NAME, VALUE FROM information_schema.cluster_hardware`) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT TYPE, INSTANCE, DEVICE_TYPE, DEVICE_NAME, NAME, VALUE FROM information_schema.cluster_hardware`) + if err != nil { + return nil, errors.Trace(err) + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return nil, errors.Trace(err) } diff --git a/telemetry/data_cluster_info.go b/telemetry/data_cluster_info.go index fdb1be6bafc27..46b8cfb8f7b47 100644 --- a/telemetry/data_cluster_info.go +++ b/telemetry/data_cluster_info.go @@ -14,6 +14,8 @@ package telemetry import ( + "context" + "github.com/pingcap/errors" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/util/sqlexec" @@ -33,7 +35,12 @@ type clusterInfoItem struct { func getClusterInfo(ctx sessionctx.Context) ([]*clusterInfoItem, error) { // Explicitly list all field names instead of using `*` to avoid potential leaking sensitive info when adding new fields in future. - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(`SELECT TYPE, INSTANCE, STATUS_ADDRESS, VERSION, GIT_HASH, START_TIME, UPTIME FROM information_schema.cluster_info`) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.TODO(), `SELECT TYPE, INSTANCE, STATUS_ADDRESS, VERSION, GIT_HASH, START_TIME, UPTIME FROM information_schema.cluster_info`) + if err != nil { + return nil, errors.Trace(err) + } + rows, _, err := exec.ExecRestrictedStmt(context.TODO(), stmt) if err != nil { return nil, errors.Trace(err) } diff --git a/telemetry/telemetry.go b/telemetry/telemetry.go index f677578e81096..e62bef6bed44a 100644 --- a/telemetry/telemetry.go +++ b/telemetry/telemetry.go @@ -17,14 +17,13 @@ import ( "bytes" "context" "encoding/json" - "fmt" "net/http" "time" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/sessionctx" - "github.com/pingcap/tidb/util/sqlexec" + "github.com/pingcap/tidb/sessionctx/variable" "go.etcd.io/etcd/clientv3" ) @@ -44,14 +43,8 @@ const ( ) func getTelemetryGlobalVariable(ctx sessionctx.Context) (bool, error) { - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(`SELECT @@global.tidb_enable_telemetry`) - if err != nil { - return false, errors.Trace(err) - } - if len(rows) != 1 || rows[0].Len() == 0 { - return false, fmt.Errorf("unexpected telemetry global variable") - } - return rows[0].GetString(0) == "1", nil + val, err := ctx.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBEnableTelemetry) + return variable.TiDBOptOn(val), err } func isTelemetryEnabled(ctx sessionctx.Context) (bool, error) { diff --git a/tests/globalkilltest/Makefile b/tests/globalkilltest/Makefile new file mode 100644 index 0000000000000..e5250ce9ab0de --- /dev/null +++ b/tests/globalkilltest/Makefile @@ -0,0 +1,40 @@ +# Copyright 2020 PingCAP, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. + +BASE_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../..) +OUT_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/bin) + +include $(BASE_DIR)/Makefile.common + +GLOBAL_KILL_TEST_SERVER_LDFLAGS = -X "github.com/pingcap/tidb/domain.ldflagIsGlobalKillTest=1" +GLOBAL_KILL_TEST_SERVER_LDFLAGS += -X "github.com/pingcap/tidb/domain.ldflagServerIDTTL=10" +GLOBAL_KILL_TEST_SERVER_LDFLAGS += -X "github.com/pingcap/tidb/domain.ldflagServerIDTimeToKeepAlive=1" +GLOBAL_KILL_TEST_SERVER_LDFLAGS += -X "github.com/pingcap/tidb/domain.ldflagServerIDTimeToCheckPDConnectionRestored=1" +GLOBAL_KILL_TEST_SERVER_LDFLAGS += -X "github.com/pingcap/tidb/domain.ldflagLostConnectionToPDTimeout=5" +GLOBAL_KILL_TEST_SERVER_LDFLAGS += -X "github.com/pingcap/tidb/store.ldflagGetEtcdAddrsFromConfig=1" + +.PHONY: server buildsucc + +default: server buildsucc + +buildsucc: + @echo "Build TiDB Server (Global Kill Test) successfully! Setup a cluster with PD & TiKV, then Run ./run-tests.sh --pd=." + +server: +ifeq ($(TARGET), "") + cd ${BASE_DIR} && \ + CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(GLOBAL_KILL_TEST_SERVER_LDFLAGS) $(CHECK_FLAG)' -o $(OUT_DIR)/globalkilltest_tidb-server tidb-server/main.go +else + cd ${BASE_DIR} && \ + CGO_ENABLED=1 $(GOBUILD) $(RACE_FLAG) -ldflags '$(LDFLAGS) $(GLOBAL_KILL_TEST_SERVER_LDFLAGS) $(CHECK_FLAG)' -o '$(TARGET)' tidb-server/main.go +endif diff --git a/tests/globalkilltest/README.md b/tests/globalkilltest/README.md new file mode 100644 index 0000000000000..9107b4f6deeeb --- /dev/null +++ b/tests/globalkilltest/README.md @@ -0,0 +1,101 @@ +# GlobalKillTest + +GlobalKillTest is a test command tool for TiDB __"Global Kill"__ feature. + +_(About __"Global Kill"__, see [design doc](https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-01-global-kill.md) for detail.)_ + +``` +Usage: ./run-tests.sh [options] + + -h: Print this help message. + + -L : Log level of testing. Defaults to "info". + + --server_log_level : Log level of TiDB server. Defaults to "info". + + --tmp : Temporary files path. Defaults to "/tmp/tidb_globalkilltest". + + -s : Use tidb-server in for testing. + Defaults to "bin/globalkilltest_tidb-server". + + --tidb_start_port : First TiDB server listening port. port ~ port+2 will be used. + Defaults to "5000". + + --tidb_status_port : First TiDB server status listening port. port ~ port+2 will be used. + Defaults to "8000". + + --pd : PD client path, ip:port list seperated by comma. + Defaults to "127.0.0.1:2379". + + --pd_proxy_port : PD proxy port. PD proxy is used to simulate lost connection between TiDB and PD. + Defaults to "3379". + + --conn_lost : Lost connection to PD timeout, + should be the same as TiDB ldflag . + See tidb/Makefile for detail. + Defaults to "5". + + --conn_restored : Time to check PD connection restored, + should be the same as TiDB ldflag + . + See tidb/Makefile for detail. + Defaults to "1". + +``` + + +## Prerequisite +1. Build TiDB binary for test. See [Makefile](https://github.com/pingcap/tidb/blob/master/tests/globalkilltest/Makefile) for detail. + +2. Establish a cluster with PD & TiKV, and provide PD client path by `--pd=ip:port[,ip:port]`. + + +## Test Scenarios + +1. A TiDB without PD, killed by Ctrl+C, and killed by KILL. + +2. One TiDB with PD, killed by Ctrl+C, and killed by KILL. + +3. Multiple TiDB nodes, killed {local,remote} by {Ctrl-C,KILL}. + +4. TiDB with PD, existing connections are killed after PD lost connection for long time. + +5. TiDB with PD, new connections are not accepted after PD lost connection for long time. + +6. TiDB with PD, new connections are accepted after PD lost connection for long time and then recovered. + +7. TiDB with PD, connections can be killed (see 3) after PD lost connection for long time and then recovered. + + +## How it works + +* TiDB is built by [Makefile](https://github.com/pingcap/tidb/blob/master/tests/globalkilltest/Makefile), to hack some timeout variables, as the default value of these variables are too long _(several hours)_ for automated testing. + +* Execute `SELECT SLEEP(x)` as payload, and kill the query before `x` expired. If the query had no error and elapsed less than `x`, the test is PASSED. + +* Run a embedded [tcp proxy](https://github.com/inetaf/tcpproxy) before PD. Stop & restart the proxy to simulate connection between TiDB and PD lost & restored. + + +## Usage + +### Regression Execute in Integration Test + +In Integration Test after commit and before merge, run these commands under TiDB `tests/globalkilltest` folder. + +```sh +cd tests/globalkilltest +make +./run-tests.sh --pd= +``` + +Again, before testing, establish a cluster with PD & TiKV and provide `pd client path` by `--pd=`. + +### Manual Test + +Run a single test manually (take `TestMultipleTiDB` as example): + +```sh +cd tests/globalkilltest +make +go test -check.f TestMultipleTiDB -args --pd= +``` diff --git a/tests/globalkilltest/config.toml b/tests/globalkilltest/config.toml new file mode 100644 index 0000000000000..a7421047275ed --- /dev/null +++ b/tests/globalkilltest/config.toml @@ -0,0 +1,2 @@ +[experimental] +enable-global-kill=true diff --git a/tests/globalkilltest/global_kill_test.go b/tests/globalkilltest/global_kill_test.go new file mode 100644 index 0000000000000..7d07298e6f39b --- /dev/null +++ b/tests/globalkilltest/global_kill_test.go @@ -0,0 +1,521 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package globalkilltest + +import ( + "context" + "database/sql" + "flag" + "fmt" + "net/url" + "os" + "os/exec" + "strings" + "testing" + "time" + + _ "github.com/go-sql-driver/mysql" + "github.com/juju/errors" + . "github.com/pingcap/check" + zaplog "github.com/pingcap/log" + "github.com/pingcap/tidb/util/logutil" + log "github.com/sirupsen/logrus" + "go.etcd.io/etcd/clientv3" + "go.uber.org/zap" + "google.golang.org/grpc" +) + +func TestGlobalKill(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var ( + logLevel = flag.String("L", "info", "test log level") + serverLogLevel = flag.String("server_log_level", "info", "server log level") + tmpPath = flag.String("tmp", "/tmp/tidb_globalkilltest", "temporary files path") + + tidbBinaryPath = flag.String("s", "bin/globalkilltest_tidb-server", "tidb server binary path") + tidbStartPort = flag.Int("tidb_start_port", 5000, "first tidb server listening port") + tidbStatusPort = flag.Int("tidb_status_port", 8000, "first tidb server status port") + + pdClientPath = flag.String("pd", "127.0.0.1:2379", "pd client path") + pdProxyPort = flag.String("pd_proxy_port", "3379", "pd proxy port") + + lostConnectionToPDTimeout = flag.Int("conn_lost", 5, "lost connection to PD timeout, should be the same as TiDB ldflag ") + timeToCheckPDConnectionRestored = flag.Int("conn_restored", 1, "time to check PD connection restored, should be the same as TiDB ldflag ") +) + +const ( + waitToStartup = 500 * time.Millisecond + msgErrConnectPD = "connect PD err: %v. Establish a cluster with PD & TiKV, and provide PD client path by `--pd=[,]" +) + +var _ = Suite(&TestGlobalKillSuite{}) + +// TestGlobakKillSuite is used for automated test of "Global Kill" feature. +// See https://github.com/pingcap/tidb/blob/master/docs/design/2020-06-01-global-kill.md. +type TestGlobalKillSuite struct { + pdCli *clientv3.Client + pdErr error +} + +func (s *TestGlobalKillSuite) SetUpSuite(c *C) { + err := logutil.InitLogger(&logutil.LogConfig{Config: zaplog.Config{Level: *logLevel}}) + c.Assert(err, IsNil) + + s.pdCli, s.pdErr = s.connectPD() +} + +func (s *TestGlobalKillSuite) TearDownSuite(c *C) { + if s.pdCli != nil { + s.pdCli.Close() + } +} + +func (s *TestGlobalKillSuite) connectPD() (cli *clientv3.Client, err error) { + etcdLogCfg := zap.NewProductionConfig() + etcdLogCfg.Level = zap.NewAtomicLevelAt(zap.ErrorLevel) + cli, err = clientv3.New(clientv3.Config{ + LogConfig: &etcdLogCfg, + Endpoints: strings.Split(*pdClientPath, ","), + AutoSyncInterval: 30 * time.Second, + DialTimeout: 5 * time.Second, + DialOptions: []grpc.DialOption{ + grpc.WithBackoffMaxDelay(time.Second * 3), + }, + }) + if err != nil { + return nil, errors.Trace(err) + } + + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) // use `Sync` to test connection, and get current members. + err = cli.Sync(ctx) + cancel() + if err != nil { + cli.Close() + return nil, errors.Trace(err) + } + log.Infof("pd connected") + return cli, nil +} + +func (s *TestGlobalKillSuite) startTiDBWithoutPD(port int, statusPort int) (cmd *exec.Cmd, err error) { + cmd = exec.Command(*tidbBinaryPath, + "--store=mocktikv", + fmt.Sprintf("-L=%s", *serverLogLevel), + fmt.Sprintf("--path=%s/mocktikv", *tmpPath), + fmt.Sprintf("-P=%d", port), + fmt.Sprintf("--status=%d", statusPort), + fmt.Sprintf("--log-file=%s/tidb%d.log", *tmpPath, port), + fmt.Sprintf("--config=%s", "./config.toml")) + log.Infof("starting tidb: %v", cmd) + err = cmd.Start() + if err != nil { + return nil, errors.Trace(err) + } + time.Sleep(500 * time.Millisecond) + return cmd, nil +} + +func (s *TestGlobalKillSuite) startTiDBWithPD(port int, statusPort int, pdPath string) (cmd *exec.Cmd, err error) { + cmd = exec.Command(*tidbBinaryPath, + "--store=tikv", + fmt.Sprintf("-L=%s", *serverLogLevel), + fmt.Sprintf("--path=%s", pdPath), + fmt.Sprintf("-P=%d", port), + fmt.Sprintf("--status=%d", statusPort), + fmt.Sprintf("--log-file=%s/tidb%d.log", *tmpPath, port), + fmt.Sprintf("--config=%s", "./config.toml")) + log.Infof("starting tidb: %v", cmd) + err = cmd.Start() + if err != nil { + return nil, errors.Trace(err) + } + time.Sleep(500 * time.Millisecond) + return cmd, nil +} + +func (s *TestGlobalKillSuite) stopService(name string, cmd *exec.Cmd, graceful bool) (err error) { + if graceful { + if err = cmd.Process.Signal(os.Interrupt); err != nil { + return errors.Trace(err) + } + if err = cmd.Wait(); err != nil { + return errors.Trace(err) + } + log.Infof("service \"%s\" stopped gracefully", name) + return nil + } + + if err = cmd.Process.Kill(); err != nil { + return errors.Trace(err) + } + time.Sleep(1 * time.Second) + log.Infof("service \"%s\" killed", name) + return nil +} + +func (s *TestGlobalKillSuite) startPDProxy() (proxy *pdProxy, err error) { + from := fmt.Sprintf(":%s", *pdProxyPort) + if len(s.pdCli.Endpoints()) == 0 { + return nil, errors.New("PD no available endpoint") + } + u, err := url.Parse(s.pdCli.Endpoints()[0]) // use first endpoint, as proxy can accept ONLY one destination. + if err != nil { + return nil, errors.Trace(err) + } + dst := u.Host + + var p pdProxy + p.AddRoute(from, to(dst)) + if err := p.Start(); err != nil { + return nil, err + } + log.Infof("start PD proxy: %s --> %s", from, dst) + return &p, nil +} + +func (s *TestGlobalKillSuite) connectTiDB(port int) (db *sql.DB, err error) { + addr := fmt.Sprintf("127.0.0.1:%d", port) + dsn := fmt.Sprintf("root@(%s)/test", addr) + sleepTime := 250 * time.Millisecond + startTime := time.Now() + for i := 0; i < 5; i++ { + db, err = sql.Open("mysql", dsn) + if err != nil { + log.Warnf("open addr %v failed, retry count %d err %v", addr, i, err) + continue + } + err = db.Ping() + if err == nil { + break + } + log.Warnf("ping addr %v failed, retry count %d err %v", addr, i, err) + + err = db.Close() + if err != nil { + return nil, errors.Trace(err) + } + time.Sleep(sleepTime) + sleepTime += sleepTime + } + if err != nil { + log.Errorf("connect to server addr %v failed %v, take time %v", addr, err, time.Since(startTime)) + return nil, errors.Trace(err) + } + db.SetMaxOpenConns(10) + + log.Infof("connect to server %s ok", addr) + return db, nil +} + +type sleepResult struct { + elapsed time.Duration + err error +} + +func (s *TestGlobalKillSuite) killByCtrlC(c *C, port int, sleepTime int) time.Duration { + cli := exec.Command("mysql", + "-h127.0.0.1", + fmt.Sprintf("-P%d", port), + "-uroot", + "-e", fmt.Sprintf("SELECT SLEEP(%d);", sleepTime)) + log.Infof("run mysql cli: %v", cli) + + ch := make(chan sleepResult) + go func() { + startTS := time.Now() + err := cli.Run() + if err != nil { + ch <- sleepResult{err: errors.Trace(err)} + return + } + + elapsed := time.Since(startTS) + log.Infof("mysql cli takes: %v", elapsed) + ch <- sleepResult{elapsed: elapsed} + }() + + time.Sleep(waitToStartup) // wait before mysql cli running. + err := cli.Process.Signal(os.Interrupt) // send "CTRL-C". + c.Assert(err, IsNil) + + r := <-ch + c.Assert(r.err, IsNil) + return r.elapsed +} + +func sleepRoutine(ctx context.Context, sleepTime int, conn *sql.Conn, connID uint64, ch chan<- sleepResult) { + var err error + startTS := time.Now() + sql := fmt.Sprintf("SELECT SLEEP(%d);", sleepTime) + if connID > 0 { + log.Infof("exec: %s [on 0x%x]", sql, connID) + } else { + log.Infof("exec: %s", sql) + } + rows, err := conn.QueryContext(ctx, sql) + if err != nil { + ch <- sleepResult{err: err} + return + } + defer rows.Close() + if rows.Err() != nil { + ch <- sleepResult{err: rows.Err()} + return + } + + elapsed := time.Since(startTS) + log.Infof("sleepRoutine takes %v", elapsed) + ch <- sleepResult{elapsed: elapsed} +} + +// NOTICE: db1 & db2 can be the same object, for getting conn1 & conn2 from the same TiDB instance. +func (s *TestGlobalKillSuite) killByKillStatement(c *C, db1 *sql.DB, db2 *sql.DB, sleepTime int) time.Duration { + ctx := context.TODO() + + conn1, err := db1.Conn(ctx) + c.Assert(err, IsNil) + defer conn1.Close() + + var connID1 uint64 + err = conn1.QueryRowContext(ctx, "SELECT CONNECTION_ID();").Scan(&connID1) + c.Assert(err, IsNil) + log.Infof("connID1: 0x%x", connID1) + + ch := make(chan sleepResult) + go sleepRoutine(ctx, sleepTime, conn1, connID1, ch) + + time.Sleep(waitToStartup) // wait go-routine to start. + conn2, err := db2.Conn(ctx) + c.Assert(err, IsNil) + defer conn2.Close() + + var connID2 uint64 + err = conn2.QueryRowContext(ctx, "SELECT CONNECTION_ID();").Scan(&connID2) + c.Assert(err, IsNil) + log.Infof("connID2: 0x%x", connID2) + + log.Infof("exec: KILL QUERY %v(0x%x) [on 0x%x]", connID1, connID1, connID2) + _, err = conn2.ExecContext(ctx, fmt.Sprintf("KILL QUERY %v", connID1)) + c.Assert(err, IsNil) + + r := <-ch + c.Assert(r.err, IsNil) + return r.elapsed +} + +// [Test Scenario 1] A TiDB without PD, killed by Ctrl+C, and killed by KILL. +func (s *TestGlobalKillSuite) TestWithoutPD(c *C) { + var err error + port := *tidbStartPort + tidb, err := s.startTiDBWithoutPD(port, *tidbStatusPort) + c.Assert(err, IsNil) + defer s.stopService("tidb", tidb, true) + + db, err := s.connectTiDB(port) + c.Assert(err, IsNil) + defer func(){ + err := db.Close() + c.Assert(err, IsNil) + }() + + const sleepTime = 2 + + // Test mysql client CTRL-C + // mysql client "CTRL-C" truncate connection id to 32bits, and is ignored by TiDB. + elapsed := s.killByCtrlC(c, port, sleepTime) + c.Assert(elapsed, GreaterEqual, sleepTime*time.Second) + + // Test KILL statement + elapsed = s.killByKillStatement(c, db, db, sleepTime) + c.Assert(elapsed, Less, sleepTime*time.Second) +} + +// [Test Scenario 2] One TiDB with PD, killed by Ctrl+C, and killed by KILL. +func (s *TestGlobalKillSuite) TestOneTiDB(c *C) { + c.Assert(s.pdErr, IsNil, Commentf(msgErrConnectPD, s.pdErr)) + + port := *tidbStartPort + 1 + tidb, err := s.startTiDBWithPD(port, *tidbStatusPort+1, *pdClientPath) + c.Assert(err, IsNil) + defer s.stopService("tidb", tidb, true) + + db, err := s.connectTiDB(port) + c.Assert(err, IsNil) + defer func(){ + err := db.Close() + c.Assert(err, IsNil) + }() + + const sleepTime = 2 + + // Test mysql client CTRL-C + // mysql client "CTRL-C" truncate connection id to 32bits, and is ignored by TiDB. + // see TiDB's logging for the truncation warning. + elapsed := s.killByCtrlC(c, port, sleepTime) + c.Assert(elapsed, GreaterEqual, sleepTime*time.Second) + + // Test KILL statement + elapsed = s.killByKillStatement(c, db, db, sleepTime) + c.Assert(elapsed, Less, sleepTime*time.Second) +} + +// [Test Scenario 3] Multiple TiDB nodes, killed {local,remote} by {Ctrl-C,KILL}. +func (s *TestGlobalKillSuite) TestMultipleTiDB(c *C) { + c.Assert(s.pdErr, IsNil, Commentf(msgErrConnectPD, s.pdErr)) + + // tidb1 & conn1a,conn1b + port1 := *tidbStartPort + 1 + tidb1, err := s.startTiDBWithPD(port1, *tidbStatusPort+1, *pdClientPath) + c.Assert(err, IsNil) + defer s.stopService("tidb1", tidb1, true) + + db1a, err := s.connectTiDB(port1) + c.Assert(err, IsNil) + defer db1a.Close() + + db1b, err := s.connectTiDB(port1) + c.Assert(err, IsNil) + defer db1b.Close() + + // tidb2 & conn2 + port2 := *tidbStartPort + 2 + tidb2, err := s.startTiDBWithPD(port2, *tidbStatusPort+2, *pdClientPath) + c.Assert(err, IsNil) + defer s.stopService("tidb2", tidb2, true) + + db2, err := s.connectTiDB(port2) + c.Assert(err, IsNil) + defer db2.Close() + + const sleepTime = 2 + var elapsed time.Duration + + // kill local by CTRL-C + // mysql client "CTRL-C" truncate connection id to 32bits, and is ignored by TiDB. + // see TiDB's logging for the truncation warning. + elapsed = s.killByCtrlC(c, port1, sleepTime) + c.Assert(elapsed, GreaterEqual, sleepTime*time.Second) + + // kill local by KILL + elapsed = s.killByKillStatement(c, db1a, db1b, sleepTime) + c.Assert(elapsed, Less, sleepTime*time.Second) + + // kill remotely + elapsed = s.killByKillStatement(c, db1a, db2, sleepTime) + c.Assert(elapsed, Less, sleepTime*time.Second) +} + +func (s *TestGlobalKillSuite) TestLostConnection(c *C) { + c.Assert(s.pdErr, IsNil, Commentf(msgErrConnectPD, s.pdErr)) + + // PD proxy + pdProxy, err := s.startPDProxy() + c.Assert(err, IsNil) + pdPath := fmt.Sprintf("127.0.0.1:%s", *pdProxyPort) + + // tidb1 + port1 := *tidbStartPort + 1 + tidb1, err := s.startTiDBWithPD(port1, *tidbStatusPort+1, pdPath) + c.Assert(err, IsNil) + defer s.stopService("tidb1", tidb1, true) + + db1, err := s.connectTiDB(port1) + c.Assert(err, IsNil) + defer db1.Close() + + // tidb2 + port2 := *tidbStartPort + 2 + tidb2, err := s.startTiDBWithPD(port2, *tidbStatusPort+2, pdPath) + c.Assert(err, IsNil) + defer s.stopService("tidb2", tidb2, true) + + db2, err := s.connectTiDB(port2) + c.Assert(err, IsNil) + defer db2.Close() + + // verify it's working. + ctx := context.TODO() + conn1, err := db1.Conn(ctx) + c.Assert(err, IsNil) + defer conn1.Close() + err = conn1.PingContext(ctx) + c.Assert(err, IsNil) + + // a running sql + sqlTime := *lostConnectionToPDTimeout + 10 + ch := make(chan sleepResult) + go sleepRoutine(ctx, sqlTime, conn1, 0, ch) + time.Sleep(waitToStartup) // wait go-routine to start. + + // disconnect to PD by closing PD proxy. + log.Infof("shutdown PD proxy to simulate lost connection to PD.") + pdProxy.Close() + pdProxy.closeAllConnections() + + // wait for "lostConnectionToPDTimeout" elapsed. + // delay additional 3 seconds for TiDB would have a small interval to detect lost connection more than "lostConnectionToPDTimeout". + sleepTime := time.Duration(*lostConnectionToPDTimeout+3) * time.Second + log.Infof("sleep %v to wait for TiDB had detected lost connection", sleepTime) + time.Sleep(sleepTime) + + // check running sql + // [Test Scenario 4] Existing connections are killed after PD lost connection for long time. + r := <-ch + log.Infof("sleepRoutine err: %v", r.err) + c.Assert(r.err, NotNil) + c.Assert(r.err.Error(), Equals, "invalid connection") + + // check new connection. + // [Test Scenario 5] New connections are not accepted after PD lost connection for long time. + log.Infof("check connection after lost connection to PD.") + _, err = s.connectTiDB(port1) + log.Infof("connectTiDB err: %v", err) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "driver: bad connection") + + // start PD proxy to restore connection. + log.Infof("restart pdProxy") + pdProxy1, err := s.startPDProxy() + c.Assert(err, IsNil) + defer pdProxy1.Close() + + // wait for "timeToCheckPDConnectionRestored" elapsed. + // delay additional 3 seconds for TiDB would have a small interval to detect lost connection restored more than "timeToCheckPDConnectionRestored". + sleepTime = time.Duration(*timeToCheckPDConnectionRestored+3) * time.Second + log.Infof("sleep %v to wait for TiDB had detected lost connection restored", sleepTime) + time.Sleep(sleepTime) + + // check restored + { + // [Test Scenario 6] New connections are accepted after PD lost connection for long time and then recovered. + db1, err := s.connectTiDB(port1) + c.Assert(err, IsNil) + defer db1.Close() + + db2, err := s.connectTiDB(port2) + c.Assert(err, IsNil) + defer db2.Close() + + // [Test Scenario 7] Connections can be killed after PD lost connection for long time and then recovered. + sleepTime := 2 + elapsed := s.killByKillStatement(c, db1, db1, sleepTime) + c.Assert(elapsed, Less, time.Duration(sleepTime)*time.Second) + + elapsed = s.killByKillStatement(c, db1, db2, sleepTime) + c.Assert(elapsed, Less, time.Duration(sleepTime)*time.Second) + } +} diff --git a/tests/globalkilltest/go.mod b/tests/globalkilltest/go.mod new file mode 100644 index 0000000000000..c879e206adaff --- /dev/null +++ b/tests/globalkilltest/go.mod @@ -0,0 +1,17 @@ +module github.com/pingcap/tests/globalkilltest + +go 1.13 + +require ( + github.com/go-sql-driver/mysql v1.5.0 + github.com/juju/errors v0.0.0-20200330140219-3fe23663418f + github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 + github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 + github.com/pingcap/tidb v1.1.0-beta.0.20201020170636-b71b6323fd4d + github.com/pingcap/tipb v0.0.0-20201020032630-6dac8b6c0aab // indirect + github.com/sirupsen/logrus v1.6.0 + go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 + go.uber.org/zap v1.16.0 + google.golang.org/grpc v1.26.0 + inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252 +) diff --git a/tests/globalkilltest/go.sum b/tests/globalkilltest/go.sum new file mode 100644 index 0000000000000..e6365673c2875 --- /dev/null +++ b/tests/globalkilltest/go.sum @@ -0,0 +1,868 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0 h1:0E3eE8MX426vUOs7aHfI7aN1BrIzzzf4ccKCSfSjGmc= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0 h1:sAbMqjY1PEQKZBWfbu6Y6bsupJ9c4QdHnzg/VvYTLcE= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0 h1:9/vpR43S4aJaROxqQHQ3nH9lfyKKV0dC3vOmnw8ebQQ= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0 h1:RPUcBvDeYgQFMfQu1eBMq6piD1SXmLH+vK3qjewZPus= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +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/HdrHistogram/hdrhistogram-go v0.9.0 h1:dpujRju0R4M/QZzcnR1LH1qm+TVG3UzkWdp5tH1WMcg= +github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= +github.com/Jeffail/gabs/v2 v2.5.1 h1:ANfZYjpMlfTTKebycu4X1AgkVWumFVDYQl7JwOr4mDk= +github.com/Jeffail/gabs/v2 v2.5.1/go.mod h1:xCn81vdHKxFUuWWAaD5jCTQDNPBMh5pPs9IJ+NcziBI= +github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE= +github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d h1:G0m3OIz70MZUWq3EgK3CesDbo8upS2Vm9/P3FtgI+Jk= +github.com/StackExchange/wmi v0.0.0-20190523213315-cbe66965904d/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= +github.com/VividCortex/ewma v1.1.1 h1:MnEK4VOv6n0RSY4vtRe3h11qjxL3+t0B8yOL8iMXdcM= +github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= +github.com/VividCortex/mysqlerr v0.0.0-20200629151747-c28746d985dd/go.mod h1:f3HiCrHjHBdcm6E83vGaXh1KomZMA2P6aeo3hKx/wg0= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= +github.com/appleboy/gin-jwt/v2 v2.6.3/go.mod h1:MfPYA4ogzvOcVkRwAxT7quHOtQmVKDpTwxyUrC2DNw0= +github.com/appleboy/gofight/v2 v2.1.2/go.mod h1:frW+U1QZEdDgixycTj4CygQ48yLTUhplt43+Wczp3rw= +github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/aws/aws-sdk-go v1.30.24 h1:y3JPD51VuEmVqN3BEDVm4amGpDma2cKJcDPuAU1OR58= +github.com/aws/aws-sdk-go v1.30.24/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d h1:rQlvB2AYWme2bIB18r/SipGiMEVJYE9U0z+MGoU/LtQ= +github.com/blacktear23/go-proxyprotocol v0.0.0-20180807104634-af7a81e8dd0d/go.mod h1:VKt7CNAQxpFpSDz3sXyj9hY/GbVsQCr0sB3w59nE7lU= +github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5 h1:BjkPE3785EwPhhyuFkbINB+2a1xATwk8SNDWnJiD41g= +github.com/cakturk/go-netstat v0.0.0-20200220111822-e5b49efee7a5/go.mod h1:jtAfVaU/2cu1+wdSRPWE2c1N2qeAA3K4RH9pYgqwets= +github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cheggaaa/pb/v3 v3.0.4 h1:QZEPYOj2ix6d5oEg63fbHmpolrnNiwjUsk+h74Yt4bM= +github.com/cheggaaa/pb/v3 v3.0.4/go.mod h1:7rgWxLrAUcFMkvJuv09+DYi7mMUYi8nO9iOWcvGJPfw= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= +github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= +github.com/codahale/hdrhistogram v0.9.0 h1:9GjrtRI+mLEFPtTfR/AZhcxp+Ii8NZYWq5104FbZQY0= +github.com/codahale/hdrhistogram v0.9.0/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= +github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64 h1:W1SHiII3e0jVwvaQFglwu3kS9NLxOeTpvik7MbKCyuQ= +github.com/coocood/bbloom v0.0.0-20190830030839-58deb6228d64/go.mod h1:F86k/6c7aDUdwSUevnLpHS/3Q9hzYCE99jGk2xsHnt0= +github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2 h1:NnLfQ77q0G4k2Of2c1ceQ0ec6MkLQyDp+IGdVM0D8XM= +github.com/coocood/rtutil v0.0.0-20190304133409-c84515f646f2/go.mod h1:7qG7YFnOALvsx6tKTNmQot8d7cGFXM9TidzvRFLWYwM= +github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= +github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= +github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= +github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= +github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= +github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/pkg v0.0.0-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/corona10/goimagehash v1.0.2/go.mod h1:/l9umBhvcHQXVtQO1V6Gp1yD20STawkhRnnX0D1bvVI= +github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= +github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cznic/golex v0.0.0-20181122101858-9c343928389c/go.mod h1:+bmmJDNmKlhWNG+gwWCkaBoTy39Fs+bzRxVBzoTQbIc= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548 h1:iwZdTE0PVqJCos1vaoKsclOGD3ADKpshg3SRtYBbwso= +github.com/cznic/mathutil v0.0.0-20181122101859-297441e03548/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM= +github.com/cznic/parser v0.0.0-20160622100904-31edd927e5b1/go.mod h1:2B43mz36vGZNZEwkWi8ayRSSUXLfjL8OkbzwW4NcPMM= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8 h1:LpMLYGyy67BoAFGda1NeOBQwqlv7nUXpm+rIVHGxZZ4= +github.com/cznic/sortutil v0.0.0-20181122101858-f5f958428db8/go.mod h1:q2w6Bg5jeox1B+QkJ6Wp/+Vn0G/bo3f1uY7Fn3vivIQ= +github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186/go.mod h1:AHHPPPXTw0h6pVabbcbyGRK1DckRn7r/STdZEeIDzZc= +github.com/cznic/y v0.0.0-20170802143616-045f81c6662a/go.mod h1:1rk5VM7oSnA4vjp+hrLQ3HWHa+Y4yPCa3/CsJrcNnvs= +github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37 h1:X6mKGhCFOxrKeeHAjv/3UvT6e5RRxW6wRdlqlV6/H4w= +github.com/danjacques/gofslock v0.0.0-20191023191349-0a45f885bc37/go.mod h1:DC3JtzuG7kxMvJ6dZmf2ymjNyoXwgtklr7FN+Um2B0U= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/denisenkom/go-mssqldb v0.0.0-20191124224453-732737034ffd/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= +github.com/dgraph-io/ristretto v0.0.1 h1:cJwdnj42uV8Jg4+KLrYovLiCgIfz9wtWm6E6KA+1tLs= +github.com/dgraph-io/ristretto v0.0.1/go.mod h1:T40EBc7CJke8TkpiYfGGKAeFjSaxuFXhuXRyumBd6RE= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-farm v0.0.0-20190104051053-3adb47b1fb0f/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= +github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= +github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/erikstmartin/go-testdb v0.0.0-20160219214506-8d10e4a1bae5/go.mod h1:a2zkGnVExMxdzMo3M0Hi/3sEU+cWnZpSni0O6/Yb/P0= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/frankban/quicktest v1.11.1 h1:stwUsXhUGliQs9t0ZS39BWCltFdOHgABiIlihop8AD4= +github.com/frankban/quicktest v1.11.1/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= +github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7gIh9+5fvk= +github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w= +github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y= +github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/go-chi/chi v4.0.2+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI= +github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM= +github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= +github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= +github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= +github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.19.4/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= +github.com/go-openapi/swag v0.17.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.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/overalls v0.0.0-20180201144345-22ec1a223b7c/go.mod h1:UqxAgEOt89sCiXlrc/ycnx00LVvUO/eS8tMUkWX4R7w= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/goccy/go-graphviz v0.0.5/go.mod h1:wXVsXxmyMQU6TN3zGRttjNn3h+iCAS7xQFC6TlNvLhk= +github.com/gogo/protobuf v0.0.0-20180717141946-636bf0302bc9/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= +github.com/gogo/protobuf v1.3.1 h1:DqDEcV5aeaTmdFBePNpYsp3FlcVH/2ISVVM9Qf8PSls= +github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= +github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7 h1:5ZkaAPbicIKTF2I64qf5Fh8Aa83Q/dnOafMYV0OMwjA= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/protobuf v0.0.0-20180814211427-aa810b61a9c7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0 h1:0udJVsspx3VBr5FwtLhQQtuAsVc79tTq0ocGIPAU6qo= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9 h1:K+lX49/3eURCE1IjlaZN//u6c+9nfDAMnyQ9E2dsJbY= +github.com/google/pprof v0.0.0-20200407044318-7d83b28da2e9/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIEPstU94h88MWPXP2ektJZ8cZ0YntAmXiE= +github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/handlers v1.4.2 h1:0QniY0USkHQ1RGCLfKxeNHK9bkDHGRYGNDFBCS+YARg= +github.com/gorilla/handlers v1.4.2/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4 h1:z53tR0945TRRQO/fLEVPI6SMv7ZflF0TEaTAoU7tOzg= +github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= +github.com/grpc-ecosystem/grpc-gateway v1.12.1 h1:zCy2xE9ablevUOrUZc3Dl72Dt+ya2FNAvC2yLYMHzi4= +github.com/grpc-ecosystem/grpc-gateway v1.12.1/go.mod h1:8XEsbTttt/W+VvjtQhLACqCisSPWTxCZ7sBRjU6iH9c= +github.com/gtank/cryptopasta v0.0.0-20170601214702-1f550f6f2f69/go.mod h1:YLEMZOtU+AZ7dhN9T/IpGhXVGly2bvkJQ+zxj3WeVQo= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/hypnoglow/gormzap v0.3.0/go.mod h1:5Wom8B7Jl2oK0Im9hs6KQ+Kl92w4Y7gKCrj66rhyvw0= +github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 h1:VHgatEHNcBFEB7inlalqfNqw65aNkM1lGX2yt3NmbS8= +github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jinzhu/gorm v1.9.12/go.mod h1:vhTjlKSJUTWNtcbQtrMBFCxy7eXTzeCAzfL5fBZT/Qs= +github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc= +github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8= +github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= +github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= +github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= +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/joomcode/errorx v1.0.1/go.mod h1:kgco15ekB6cs+4Xjzo7SPeXzx38PbJzBwbnu9qfVNHQ= +github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= +github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/juju/ansiterm v0.0.0-20160907234532-b99631de12cf/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU= +github.com/juju/clock v0.0.0-20190205081909-9c5c9712527c/go.mod h1:nD0vlnrUjcjJhqN5WuCWZyzfd5AHZAC9/ajvbSx69xA= +github.com/juju/cmd v0.0.0-20171107070456-e74f39857ca0/go.mod h1:yWJQHl73rdSX4DHVKGqkAip+huBslxRwS8m9CrOLq18= +github.com/juju/collections v0.0.0-20200605021417-0d0ec82b7271/go.mod h1:5XgO71dV1JClcOJE+4dzdn4HrI5LiyKd7PlVG6eZYhY= +github.com/juju/errors v0.0.0-20150916125642-1b5e39b83d18/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/errors v0.0.0-20200330140219-3fe23663418f h1:MCOvExGLpaSIzLYB4iQXEHP4jYVU6vmzLNQPdMVrxnM= +github.com/juju/errors v0.0.0-20200330140219-3fe23663418f/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= +github.com/juju/httpprof v0.0.0-20141217160036-14bf14c30767/go.mod h1:+MaLYz4PumRkkyHYeXJ2G5g5cIW0sli2bOfpmbaMV/g= +github.com/juju/loggo v0.0.0-20170605014607-8232ab8918d9/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e h1:FdDd7bdI6cjq5vaoYlK1mfQYfF9sF2VZw8VEZMsl5t8= +github.com/juju/loggo v0.0.0-20200526014432-9ce3a2e09b5e/go.mod h1:vgyd7OREkbtVEN/8IXZe5Ooef3LQePvuBm9UWj6ZL8U= +github.com/juju/mutex v0.0.0-20171110020013-1fe2a4bf0a3a/go.mod h1:Y3oOzHH8CQ0Ppt0oCKJ2JFO81/EsWenH5AEqigLH+yY= +github.com/juju/ratelimit v1.0.1 h1:+7AIFJVQ0EQgq/K9+0Krm7m530Du7tIz0METWzN0RgY= +github.com/juju/ratelimit v1.0.1/go.mod h1:qapgC/Gy+xNh9UxzV13HGGl/6UXNN+ct+vwSgWNm/qk= +github.com/juju/retry v0.0.0-20151029024821-62c620325291/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= +github.com/juju/retry v0.0.0-20180821225755-9058e192b216/go.mod h1:OohPQGsr4pnxwD5YljhQ+TZnuVRYpa5irjugL1Yuif4= +github.com/juju/testing v0.0.0-20180402130637-44801989f0f7/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/juju/testing v0.0.0-20190723135506-ce30eb24acd2/go.mod h1:63prj8cnj0tU0S9OHjGJn+b1h0ZghCndfnbQolrYTwA= +github.com/juju/testing v0.0.0-20200923013621-75df6121fbb0 h1:ZNHhUeJYnc98o0ZpU7/c2TBuQokG5TBiDx8UvhDTIt0= +github.com/juju/testing v0.0.0-20200923013621-75df6121fbb0/go.mod h1:Ky6DwobyXXeXSqRJCCuHpAtVEGRPOT8gUsFpJhDoXZ8= +github.com/juju/utils v0.0.0-20180424094159-2000ea4ff043/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= +github.com/juju/utils v0.0.0-20200116185830-d40c2fe10647/go.mod h1:6/KLg8Wz/y2KVGWEpkK9vMNGkOnu4k/cqs8Z1fKjTOk= +github.com/juju/utils/v2 v2.0.0-20200923005554-4646bfea2ef1/go.mod h1:fdlDtQlzundleLLz/ggoYinEt/LmnrpNKcNTABQATNI= +github.com/juju/version v0.0.0-20161031051906-1f41e27e54f2/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= +github.com/juju/version v0.0.0-20180108022336-b64dbd566305/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= +github.com/juju/version v0.0.0-20191219164919-81c1be00b9a6/go.mod h1:kE8gK5X0CImdr7qpSKl3xB2PmpySSmfj7zVbkZFs81U= +github.com/julienschmidt/httprouter v1.1.1-0.20151013225520-77a895ad01eb/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= +github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.9.5 h1:U+CaK85mrNNb4k8BNOfgJtJ/gr6kswUCFj6miSzVC6M= +github.com/klauspost/compress v1.9.5/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= +github.com/klauspost/cpuid v1.2.1 h1:vJi+O/nMdFt0vqm8NZBI6wzALWdA2X+egi0ogNyrC/w= +github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= +github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/lib/pq v1.1.1/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= +github.com/lunixbochs/vtclean v0.0.0-20160125035106-4fbf7632a2c6/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/masterzen/azure-sdk-for-go v3.2.0-beta.0.20161014135628-ee4f0065d00c+incompatible/go.mod h1:mf8fjOu33zCqxUjuiU3I8S1lJMyEAlH+0F2+M5xl3hE= +github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc= +github.com/masterzen/winrm v0.0.0-20161014151040-7a535cd943fc/go.mod h1:CfZSN7zwz5gJiFhZJz49Uzk7mEBHIceWmbFmYx7Hf7E= +github.com/masterzen/xmlpath v0.0.0-20140218185901-13f4951698ad/go.mod h1:A0zPC53iKKKcXYxr4ROjpQRQ5FgJXtelNdSmHHuq/tY= +github.com/mattn/go-colorable v0.0.6/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.0-20160806122752-66b8e73f3f5c/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= +github.com/mattn/go-isatty v0.0.11 h1:FxPOTFNqGkuDUGi3H/qkUbQO4ZiBa2brKq5r0l8TGeM= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= +github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= +github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= +github.com/mattn/go-sqlite3 v2.0.1+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mgechev/dots v0.0.0-20190921121421-c36f7dcfbb81/go.mod h1:KQ7+USdGKfpPjXk4Ga+5XxQM4Lm4e3gAogrreFAYpOg= +github.com/mgechev/revive v1.0.2/go.mod h1:rb0dQy1LVAxW9SWy5R3LPUjevzUbUS316U5MFySA2lo= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb h1:bsjNADsjHq0gjU7KO7zwoX5k3HtFdf6TDzB3ncl5iUs= +github.com/montanaflynn/stats v0.0.0-20151014174947-eeaced052adb/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/ncw/directio v1.0.4 h1:CojwI07mCEmRkajgx42Pf8jyCwTs1ji9/Ij9/PJG12k= +github.com/ncw/directio v1.0.4/go.mod h1:CKGdcN7StAaqjT7Qack3lAXeX4pjnyc46YeqZH1yWVY= +github.com/nfnt/resize v0.0.0-20160724205520-891127d8d1b5/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= +github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7 h1:7KAv7KMGTTqSmYZtNdcNTgsos+vFzULLwyElndwn+5c= +github.com/ngaut/pools v0.0.0-20180318154953-b7bc8c42aac7/go.mod h1:iWMfgwqYW+e8n5lC/jjNEhwcjbRDpl5NT7n2h+4UNcI= +github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef h1:K0Fn+DoFqNqktdZtdV3bPQ/0cuYh2H4rkg0tytX/07k= +github.com/ngaut/sync2 v0.0.0-20141008032647-7a24ed77b2ef/go.mod h1:7WjlapSfwQyo6LNmIvEWzsW1hbBQfpUO4JWnuQRmva8= +github.com/ngaut/unistore v0.0.0-20200929093420-76a7b18be28e h1:1a8YbLM1sBmwEjzEVT/JD12Vjf6BNnBBEUV3nAcZYKU= +github.com/ngaut/unistore v0.0.0-20200929093420-76a7b18be28e/go.mod h1:ZR3NH+HzqfiYetwdoAivApnIy8iefPZHTMLfrFNm8g4= +github.com/nicksnyder/go-i18n v1.10.0/go.mod h1:HrK7VCrbOvQoUAQ7Vpy7i87N7JZZZ7R2xBGjv0j365Q= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= +github.com/olekukonko/tablewriter v0.0.4/go.mod h1:zq6QwlOf5SlnkVbMSr5EoBv3636FWnp+qbPhuoO21uA= +github.com/onsi/ginkgo v1.6.0 h1:Ix8l273rp3QzYgXSR+c8d1fTG7UPgYkOSELPhiY/YGw= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.4.2 h1:3mYCb7aPxS/RU7TI1y4rkEn1oKmPRjNJLNEXgw7MH2I= +github.com/onsi/gomega v1.4.2/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/opentracing/basictracer-go v1.0.0 h1:YyUAhaEfjoWXclZVJ9sGoNct7j4TVk7lZWlQw5UXuoo= +github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= +github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.1.0 h1:pWlfV3Bxv7k65HYwkikxat0+s3pV4bsqf19k25Ur8rU= +github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pelletier/go-toml v1.3.0/go.mod h1:PN7xzY2wHTK0K9p34ErDQMlFxa51Fk0OUruD3k1mMwo= +github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= +github.com/phayes/freeport v0.0.0-20180830031419-95f893ade6f2/go.mod h1:iIss55rKnNBTvrwdmkUpLnDpZoAHvWaiq5+iMmen4AE= +github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d h1:U+PMnTlV2tu7RuMK5etusZG3Cf+rpow5hqQByeCzJ2g= +github.com/phf/go-queue v0.0.0-20170504031614-9abe38d0371d/go.mod h1:lXfE4PvvTW5xOjO6Mba8zDPyw8M93B6AQ7frTGnMlA8= +github.com/pierrec/lz4 v2.5.2+incompatible h1:WCjObylUIOlKy/+7Abdn34TLIkXiA4UWUMhxq9m9ZXI= +github.com/pierrec/lz4 v2.5.2+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pingcap-incubator/tidb-dashboard v0.0.0-20200908071351-a715a95c7de2/go.mod h1:X3r7/4Wr9fSC5KlsfezBh/5noeWGEJNQuSvjgS2rvdI= +github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19 h1:IXpGy7y9HyoShAFmzW2OPF0xCA5EOoSTyZHwsgYk9Ro= +github.com/pingcap/badger v1.5.1-0.20200908111422-2e78ee155d19/go.mod h1:LyrqUOHZrUDf9oGi1yoz1+qw9ckSIhQb5eMa1acOLNQ= +github.com/pingcap/br v4.0.0-beta.2.0.20201014031603-5676c8fdad1a+incompatible h1:RMx7D+dQtUTUZjelJyV0WwYr3GFxrjsSarFXhV2SWzI= +github.com/pingcap/br v4.0.0-beta.2.0.20201014031603-5676c8fdad1a+incompatible/go.mod h1:ymVmo50lQydxib0tmK5hHk4oteB7hZ0IMCArunwy3UQ= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= +github.com/pingcap/check v0.0.0-20191107115940-caf2b9e6ccf4/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= +github.com/pingcap/check v0.0.0-20191216031241-8a5a85928f12/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= +github.com/pingcap/errcode v0.0.0-20180921232412-a1a7271709d9/go.mod h1:4b2X8xSqxIroj/IZ9MX/VGZhAwc11wB9wRIzHvz6SeM= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.5-0.20190809092503-95897b64e011/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/errors v0.11.5-0.20200902104258-eba4f1d8f6de/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= +github.com/pingcap/errors v0.11.5-0.20200917111840-a15ef68f753d/go.mod h1:g4vx//d6VakjJ0mk7iLBlKA8LFavV/sAVINT/1PFxeQ= +github.com/pingcap/failpoint v0.0.0-20191029060244-12f4ac2fd11d/go.mod h1:DNS3Qg7bEDhU6EXNHF+XSv/PGznQaMJ5FWvctpm6pQI= +github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce h1:Y1kCxlCtlPTMtVcOkjUcuQKh+YrluSo7+7YMCQSzy30= +github.com/pingcap/failpoint v0.0.0-20200702092429-9f69995143ce/go.mod h1:w4PEZ5y16LeofeeGwdgZB4ddv9bLyDuIX+ljstgKZyk= +github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d h1:rCmRK0lCRrHMUbS99BKFYhK9YxJDNw0xB033cQbYo0s= +github.com/pingcap/fn v0.0.0-20191016082858-07623b84a47d/go.mod h1:fMRU1BA1y+r89AxUoaAar4JjrhUkVDt0o0Np6V8XbDQ= +github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989 h1:surzm05a8C9dN8dIUmo4Be2+pMRb6f55i+UIYrluu2E= +github.com/pingcap/goleveldb v0.0.0-20191226122134-f82aafb29989/go.mod h1:O17XtbryoCJhkKGbT62+L2OlrniwqiGLSqrmdHCMzZw= +github.com/pingcap/kvproto v0.0.0-20191211054548-3c6b38ea5107/go.mod h1:WWLmULLO7l8IOcQG+t+ItJ3fEcrL5FxF0Wu+HrMy26w= +github.com/pingcap/kvproto v0.0.0-20200411081810-b85805c9476c/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20200810113304-6157337686b1/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20200827082727-23dedec2339b/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/kvproto v0.0.0-20200927054727-1290113160f0 h1:yNUYt8kP/fAEhNi7wUfU0pvk6ZgoEHgJIyeM/CTeS3g= +github.com/pingcap/kvproto v0.0.0-20200927054727-1290113160f0/go.mod h1:IOdRDPLyda8GX2hE/jO7gqaCV/PNFh8BZQCQZXfIOqI= +github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/log v0.0.0-20200117041106-d28c14d3b1cd/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/log v0.0.0-20200511115504-543df19646ad/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463 h1:Jboj+s4jSCp5E1WDgmRUv5rIFKFHaaSWuSZ4wMwXIcc= +github.com/pingcap/log v0.0.0-20200828042413-fce0951f1463/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pingcap/parser v0.0.0-20201014065945-fb6bde872a79 h1:Dcxi/lDJ6C3M5ocRbhR66MBDMmqFkPVt/Y79DVb5QR8= +github.com/pingcap/parser v0.0.0-20201014065945-fb6bde872a79/go.mod h1:RlLfMRJwFBSiXd2lUaWdV5pSXtrpyvZM8k5bbZWsheU= +github.com/pingcap/sysutil v0.0.0-20200206130906-2bfa6dc40bcd/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= +github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a h1:i2RElJ2aykSqZKeY+3SK18NHhajil8cQdG77wHe+P1Y= +github.com/pingcap/sysutil v0.0.0-20200715082929-4c47bcac246a/go.mod h1:EB/852NMQ+aRKioCpToQ94Wl7fktV+FNnxf3CX/TTXI= +github.com/pingcap/tidb v1.1.0-beta.0.20201020170636-b71b6323fd4d h1:cud4Np00Bg+jPJttmZAPw4mq/7vDHqCZ5OB6MdAGags= +github.com/pingcap/tidb v1.1.0-beta.0.20201020170636-b71b6323fd4d/go.mod h1:txOcY5994Z1sG1qqTaxNGQQWS6muamDcFp4NW8xTUEc= +github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible h1:qPppnsXVh3KswqRZdSAShGLLPd7dB+5w4lXDnpYn0SQ= +github.com/pingcap/tidb-tools v4.0.5-0.20200820092506-34ea90c93237+incompatible/go.mod h1:XGdcy9+yqlDSEMTpOXnwf3hiTeqrV6MN/u1se9N8yIM= +github.com/pingcap/tipb v0.0.0-20200618092958-4fad48b4c8c3/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= +github.com/pingcap/tipb v0.0.0-20201020032630-6dac8b6c0aab h1:3BEwEmcbZZuXfaxAhBQykZUzSHQb6G0ix8cvLmshU/4= +github.com/pingcap/tipb v0.0.0-20201020032630-6dac8b6c0aab/go.mod h1:RtkHW8WbcNxj8lsbzjaILci01CtYnYbIkQhjyZWrWVI= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +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 v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_golang v0.9.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.5.1 h1:bdHYieyGlH+6OLEk2YQha8THib30KP0/yD0YH9m6xcA= +github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M= +github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.0.0-20181020173914-7e9e6cabbd39/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= +github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.9.1 h1:KOMtN28tlbam3/7ZKEYKHhKoJZYYj3gMH4uc62x7X7U= +github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +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/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237 h1:HQagqIiBmr8YXawX/le3+O26N+vPPC1PtjaF3mwnook= +github.com/remyoudompheng/bigfft v0.0.0-20190728182440-6a916e37a237/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sasha-s/go-deadlock v0.2.0/go.mod h1:StQn567HiB1fF2yJ44N9au7wOhrPS3iZqiDbRupzT10= +github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sergi/go-diff v1.0.1-0.20180205163309-da645544ed44/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shirou/gopsutil v2.19.10+incompatible h1:lA4Pi29JEVIQIgATSeftHSY0rMGI9CLrl2ZvDLiahto= +github.com/shirou/gopsutil v2.19.10+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4 h1:udFKJ0aHUL60LboW/A+DfgoHVedieIzIXE8uylPue0U= +github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd h1:ug7PpSOB5RBPK1Kg6qskGBoP3Vnj/aNYFTznWvlkGo0= +github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= +github.com/sirupsen/logrus v1.6.0 h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I= +github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= +github.com/soheilhy/cmux v0.1.4 h1:0HKaf1o97UwFjHH9o5XsHUOF+tqmdA7KEzXLpiyaw0E= +github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72 h1:qLC7fQah7D6K1B0ujays3HV9gkFtllcxhzImRR7ArPQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/cobra v1.0.0 h1:6m/oheQuQ13N9ks4hubMG6BnvwOeaJrqSPLahSnczz8= +github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= +github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E= +github.com/swaggo/gin-swagger v1.2.0/go.mod h1:qlH2+W7zXGZkczuL+r2nEBR2JTT+/lX05Nn6vPhc7OI= +github.com/swaggo/http-swagger v0.0.0-20200308142732-58ac5e232fba/go.mod h1:O1lAbCgAAX/KZ80LM/OXwtWFI/5TvZlwxSg8Cq08PV0= +github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y= +github.com/swaggo/swag v1.6.3/go.mod h1:wcc83tB4Mb2aNiL/HP4MFeQdpHUrca+Rp/DRNgWAUio= +github.com/swaggo/swag v1.6.6-0.20200529100950-7c765ddd0476/go.mod h1:xDhTyuFIujYiN3DKWC/H/83xcfHp+UE/IzWWampG7Zc= +github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d h1:4J9HCZVpvDmj2tiKGSTUnb3Ok/9CEQb9oqu9LHKQQpc= +github.com/syndtr/goleveldb v0.0.0-20180815032940-ae2bd5eed72d/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2 h1:mbAskLJ0oJfDRtkanvQPiooDH8HvJ2FBh+iKT/OmiQQ= +github.com/tiancaiamao/appdash v0.0.0-20181126055449-889f96f722a2/go.mod h1:2PfKggNGDuadAa0LElHrByyrz4JPZ9fFx6Gs7nx7ZZU= +github.com/tidwall/gjson v1.3.5/go.mod h1:P256ACg0Mn+j1RXIDXoss50DeIABTYK1PULOJHhxOls= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tikv/pd v1.1.0-beta.0.20200910042021-254d1345be09 h1:5NsHTjk0O7C3/d8vfl/cWu9L6db+8YGvEj7XBGbMTbY= +github.com/tikv/pd v1.1.0-beta.0.20200910042021-254d1345be09/go.mod h1:Z+EQXV6FyfpH7olLqXH0zvYOnFcCNGJmzm+MN4W1/RE= +github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5 h1:LnC5Kc/wtumK+WB441p7ynQJzVuNRJiqddSIE3IlSEQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/twmb/murmur3 v1.1.3 h1:D83U0XYKcHRYwYIpBKf3Pks91Z0Byda/9SJ8B6EMRcA= +github.com/twmb/murmur3 v1.1.3/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= +github.com/uber-go/atomic v1.3.2 h1:Azu9lPBWRNKzYXSIwRfgRuDuS0YKsK4NFhiQv98gkxo= +github.com/uber-go/atomic v1.3.2/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.22.1+incompatible h1:NHcubEkVbahf9t3p75TOCR83gdUHXjRJvjoBh1yACsM= +github.com/uber/jaeger-client-go v2.22.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.4.0+incompatible h1:fY7QsGQWiCt8pajv4r7JEvmATdCVaWxXbjwyYwsNaLQ= +github.com/uber/jaeger-lib v2.4.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.5-pre/go.mod h1:FwP/aQVg39TXzItUBMwnWp9T9gPQnXw4Poh4/oBQZ/0= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.5-pre/go.mod h1:tULtS6Gy1AE1yCENaw4Vb//HLH5njI2tfCQDUqRd8fI= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +github.com/unrolled/render v0.0.0-20171102162132-65450fb6b2d3/go.mod h1:tu82oB5W2ykJRVioYsB+IQKcft7ryBr7w12qMBUPyXg= +github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= +github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/negroni v0.3.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/vmihailenco/msgpack/v4 v4.3.11/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= +github.com/vmihailenco/msgpack/v5 v5.0.0-beta.1/go.mod h1:xlngVLeyQ/Qi05oQxhQ+oTuqa03RjMwMfk/7/TCs+QI= +github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2 h1:eY9dn8+vbi4tKz5Qo6v2eYzo7kUS51QINcR5jNpbZS8= +github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= +github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/yookoala/realpath v1.0.0/go.mod h1:gJJMA9wuX7AcqLy1+ffPatSCySA1FQ2S8Ya9AIoYBpE= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/zhangjinpeng1987/raft v0.0.0-20200819064223-df31bb68a018 h1:T3OrqVdcH6z6SakR7WkECvGpdkfB0MAur/6zf66GPxQ= +github.com/zhangjinpeng1987/raft v0.0.0-20200819064223-df31bb68a018/go.mod h1:rTSjwgeYU2on64W50csWDlhyy0x9UYVYJUovHlYdt5s= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/bbolt v1.3.3 h1:MUGmc65QhB3pIlaQ5bB4LwqSj6GIonVJXpZiaKNyaKk= +go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738 h1:lWF4f9Nypl1ZqSb4gLeh/DGvBYVaUYHuiB93teOmwgc= +go.etcd.io/etcd v0.5.0-alpha.5.0.20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2 h1:75k/FF0Q2YM8QYo07VPddOLBslDt1MZOdEslOHvmzAs= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/automaxprocs v1.2.0/go.mod h1:YfO3fm683kQpzETxlTGZhGIVmXAhaw3gxeBADbpZtnU= +go.uber.org/dig v1.8.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.10.0/go.mod h1:vLRicqpG/qQEzno4SYU86iCwfT95EZza+Eba0ItuxqY= +go.uber.org/goleak v0.10.0 h1:G3eWbSNIskeRqtsN/1uI5B+eP73y3JUuBsv9AZjehb4= +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.8.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= +golang.org/x/crypto v0.0.0-20180214000028-650f4a345ab4/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +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-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM= +golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299 h1:zQpM52jfKHG6II1ISZY1ZcpygvuSFZpLwfluuF89XOg= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f h1:J5lckAjkw6qYlOZNj90mLYNTEKDvWeuc1yieZ8qUzUE= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +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.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180406214816-61147c48b25b/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= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191002035440-2ec189313ef0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73 h1:MXfv8rhZWmFeqX3GNZRsd6vOLoaCHjYEX3qkRo3YBUA= +golang.org/x/net v0.0.0-20200904194848-62affa334b73/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6 h1:pE8b58s1HRDMi8RDc79m0HISf9D4TzseP40cEA6IGfs= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190610200419-93c9922d18ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/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-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200819171115-d785dc25833f h1:KJuwZVtZBVzDmEDtB2zro9CXkD9O0dpCv4o2LHbQIAw= +golang.org/x/sys v0.0.0-20200819171115-d785dc25833f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +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-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200225230052-807dcd883420/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200527183253-8e7acdbce89d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac h1:DugppSxw0LSF8lcjaODPJZoDzq0ElTGskTst3ZaBkHI= +golang.org/x/tools v0.0.0-20200820010801-b793a1359eac/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +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.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.1 h1:5mMS6mYvK5LVB8+ujVBC33Y8gltBo/kT6HBm6kU80G4= +google.golang.org/api v0.15.1/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpCM= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20181004005441-af9cb2a35e7f/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20190927181202-20e1ac93f88c/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb h1:ADPHZzpzM4tk4V4S5cnCrr5SwzvlrPRmqqCuJDB8UTs= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/grpc v0.0.0-20180607172857-7a6a684ca69e/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0 h1:2dTRdpdFEEhJYQD8EMLB61nnrzSCTbG38PhqdhvOltg= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +gopkg.in/alecthomas/gometalinter.v2 v2.0.12/go.mod h1:NDRytsqEZyolNuAgTzJkZMkSQM7FIKyzVzGhjB/qfYo= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20180810215634-df19058c872c/go.mod h1:3HH7i1SgMqlzxCcBmUHW657sD4Kvv9sC3HpL3YukzwA= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20160105164936-4f90aeace3a2/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b h1:QRR6H1YWRnHb4Y/HeNFCTJLFVxaq6wH4YuVdsUOr75U= +gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= +gopkg.in/errgo.v1 v1.0.0-20161222125816-442357a80af5/go.mod h1:u0ALmqvLRxLI95fkdCEWrE6mhWYZW1aMOJHp5YXLHTg= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/httprequest.v1 v1.1.1/go.mod h1:/CkavNL+g3qLOrpFHVrEx4NKepeqR4XTZWNj4sGGjz0= +gopkg.in/mgo.v2 v2.0.0-20160818015218-f2b6f6c918c4/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/yaml.v2 v2.0.0-20170712054546-1be3d31502d6/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.6 h1:W18jzjh8mfPez+AwGLxmOImucz/IFjpNlrKVnaj2YVc= +honnef.co/go/tools v0.0.1-2020.1.6/go.mod h1:pyyisuGw24ruLjrr1ddx39WE0y9OooInRzEYLhQB2YY= +inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252 h1:gmJCKidOfjKDUHF1jjke+I+2iQIyE3HNNxu2OKO/FUI= +inet.af/tcpproxy v0.0.0-20200125044825-b6bb9b5b8252/go.mod h1:zq+R+tLcdHugi7Jt+FtIQY6m6wtX34lr2CdQVH2fhW0= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= +launchpad.net/xmlpath v0.0.0-20130614043138-000000000004/go.mod h1:vqyExLOM3qBx7mvYRkoxjSCF945s0mbe7YynlKYXtsA= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= +sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4 h1:VO9oZbbkvTwqLimlQt15QNdOOBArT2dw/bvzsMZBiqQ= +sourcegraph.com/sourcegraph/appdash v0.0.0-20180531100431-4c381bd170b4/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67 h1:e1sMhtVq9AfcEy8AXNb8eSg6gbzfdpYhoNqnPJa+GzI= +sourcegraph.com/sourcegraph/appdash-data v0.0.0-20151005221446-73f23eafcf67/go.mod h1:L5q+DGLGOQFpo1snNEkLOJT2d1YTW66rWNzatr3He1k= diff --git a/tests/globalkilltest/proxy.go b/tests/globalkilltest/proxy.go new file mode 100644 index 0000000000000..2a6b95761ca51 --- /dev/null +++ b/tests/globalkilltest/proxy.go @@ -0,0 +1,73 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package globalkilltest + +import ( + "net" + + log "github.com/sirupsen/logrus" + "inet.af/tcpproxy" +) + +// pdProxy used to simulate "lost connection" between TiDB and PD. +// Add "close existed connection" to `tcpproxy.Proxy`, which support closing listener only. +type pdProxy struct { + tcpproxy.Proxy + dialProxies []*pdDialProxy +} + +// AddRoute implements the Proxy interface. +func (p *pdProxy) AddRoute(ipPort string, dest tcpproxy.Target) { + if dp, ok := dest.(*pdDialProxy); ok { + p.dialProxies = append(p.dialProxies, dp) + } + p.Proxy.AddRoute(ipPort, dest) +} + +func (p *pdProxy) closeAllConnections() { + for _, dp := range p.dialProxies { + dp.closeAllConnections() + } +} + +// pdDialProxy add "close existed connections" to `tcpproxy.DialProxy`, +// which support closing listener only. +type pdDialProxy struct { + tcpproxy.DialProxy + connections []net.Conn +} + +// HandleConn implements the Target interface. +func (dp *pdDialProxy) HandleConn(src net.Conn) { + dp.connections = append(dp.connections, tcpproxy.UnderlyingConn(src)) + dp.DialProxy.HandleConn(src) +} + +func (dp *pdDialProxy) closeAllConnections() { + for _, conn := range dp.connections { + if err := conn.Close(); err != nil { // Notice: will close a connection twice. Ignore for test purpose. + log.Errorf("closeAllConnections err: %v", err) + } + } +} + +// to is shorthand way of new pdDialProxy. +func to(addr string) *pdDialProxy { + return &pdDialProxy{ + DialProxy: tcpproxy.DialProxy{ + Addr: addr, + KeepAlivePeriod: -1, + }, + } +} diff --git a/tests/globalkilltest/run-tests.sh b/tests/globalkilltest/run-tests.sh new file mode 100755 index 0000000000000..70ff6467fd382 --- /dev/null +++ b/tests/globalkilltest/run-tests.sh @@ -0,0 +1,95 @@ +#!/usr/bin/env bash +# Copyright 2020 PingCAP, Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu +trap 'set +e; PIDS=$(jobs -p); [ -n "$PIDS" ] && kill -9 $PIDS' EXIT + +function help_message() +{ + echo "Usage: $0 [options]" + echo ' + -h: Print this help message. + + -L : Log level of testing. Defaults to "info". + + --server_log_level : Log level of TiDB server. Defaults to "info". + + --tmp : Temporary files path. Defaults to "/tmp/tidb_globalkilltest". + + -s : Use tidb-server in for testing. + Defaults to "bin/globalkilltest_tidb-server". + + --tidb_start_port : First TiDB server listening port. port ~ port+2 will be used. + Defaults to "5000". + + --tidb_status_port : First TiDB server status listening port. port ~ port+2 will be used. + Defaults to "8000". + + --pd_proxy_port : PD proxy port. PD proxy is used to simulate lost connection between TiDB and PD. + Defaults to "3379". + + --conn_lost : Lost connection to PD timeout, + should be the same as TiDB ldflag . + See tidb/Makefile for detail. + Defaults to "5". + + --conn_restored : Time to check PD connection restored, + should be the same as TiDB ldflag + . + See tidb/Makefile for detail. + Defaults to "1". +' +} + +function start_cluster() +{ + ${PD} --name=pd --data-dir=pd &>pd.log & + sleep 10 + + ${TIKV} --pd=127.0.0.1:2379 -s tikv --addr=0.0.0.0:20160 --advertise-addr=127.0.0.1:20160 &>tikv.log & + sleep 10 +} + +function clean_cluster() +{ + set +e + killall -9 -r tidb-server + killall -9 -r tikv-server + killall -9 -r pd-server + set -e +} + +function go_tests() +{ + go test -args $* +} + +while getopts "h" opt; do + case $opt in + h) + help_message + exit 0 + ;; + esac +done + +clean_cluster + +start_cluster + +go_tests + +clean_cluster + +echo "globalkilltest end" diff --git a/tests/graceshutdown/.gitignore b/tests/graceshutdown/.gitignore new file mode 100644 index 0000000000000..3521e226f227a --- /dev/null +++ b/tests/graceshutdown/.gitignore @@ -0,0 +1 @@ +tidb-slow.log diff --git a/tests/graceshutdown/Makefile b/tests/graceshutdown/Makefile new file mode 100644 index 0000000000000..f1f028514b1c0 --- /dev/null +++ b/tests/graceshutdown/Makefile @@ -0,0 +1,33 @@ +# Copyright 2020 PingCAP, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. + +BASE_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/../..) +OUT_DIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST)))/bin) + +include $(BASE_DIR)/Makefile.common + +.PHONY: server buildsucc + +default: server buildsucc + +buildsucc: + @echo "Build TiDB Server successfully!" + +server: +ifeq ($(TARGET), "") + cd ${BASE_DIR} && \ + CGO_ENABLED=1 $(GOBUILD) -ldflags '$(LDFLAGS)' -o $(OUT_DIR)/tidb-server tidb-server/main.go +else + cd ${BASE_DIR} && \ + CGO_ENABLED=1 $(GOBUILD) -ldflags '$(LDFLAGS)' -o '$(TARGET)' tidb-server/main.go +endif diff --git a/tests/graceshutdown/go.mod b/tests/graceshutdown/go.mod new file mode 100644 index 0000000000000..0b1063caec2ad --- /dev/null +++ b/tests/graceshutdown/go.mod @@ -0,0 +1,10 @@ +module graceshutdown + +go 1.15 + +require ( + github.com/go-sql-driver/mysql v1.5.0 + github.com/juju/errors v0.0.0-20200330140219-3fe23663418f + github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 + github.com/sirupsen/logrus v1.7.0 +) diff --git a/tests/graceshutdown/go.sum b/tests/graceshutdown/go.sum new file mode 100644 index 0000000000000..086b125d80d92 --- /dev/null +++ b/tests/graceshutdown/go.sum @@ -0,0 +1,64 @@ +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-sql-driver/mysql v1.5.0 h1:ozyZYNQW3x3HtqT1jira07DN2PArx2v7/mN66gGcHOs= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/juju/errors v0.0.0-20200330140219-3fe23663418f h1:MCOvExGLpaSIzLYB4iQXEHP4jYVU6vmzLNQPdMVrxnM= +github.com/juju/errors v0.0.0-20200330140219-3fe23663418f/go.mod h1:W54LbzXuIE0boCoNJfwqpmkKJ1O4TCTZMetAt6jGk7Q= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/pingcap/check v0.0.0-20190102082844-67f458068fc8/go.mod h1:B1+S9LNcuMyLH/4HMTViQOJevkGiik3wW2AN9zb2fNQ= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712 h1:R8gStypOBmpnHEx1qi//SaqxJVI4inOqljg/Aj5/390= +github.com/pingcap/check v0.0.0-20200212061837-5e12011dc712/go.mod h1:PYMCGwN0JHjoqGr3HrZoD+b8Tgx8bKnArhSq8YVzUMc= +github.com/pingcap/errors v0.11.0/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= +github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9 h1:AJD9pZYm72vMgPcQDww9rkZ1DnWfl0pXV3BOWlkYIjA= +github.com/pingcap/log v0.0.0-20191012051959-b742a5d432e9/go.mod h1:4rbK1p9ILyIfb6hU7OG2CiWSqMXnp3JMbiaVJ6mvoY8= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/sirupsen/logrus v1.7.0 h1:ShrD1U9pZB12TX0cVy0DtePoCH97K8EtX+mg7ZARUtM= +github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.5.0 h1:OI5t8sDa1Or+q8AeE+yKeB/SDYioSHAgcVljj9JIETY= +go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.4.0 h1:f3WCSC2KzAcBXGATIxAB1E2XuCpNU255wNKZ505qi3E= +go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= +go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.12.0 h1:dySoUQPFBGj6xwjmBzageVL8jGi8uxc6bEmJQjA06bw= +go.uber.org/zap v1.12.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191107010934-f79515f33823/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= diff --git a/tests/graceshutdown/graceshutdown_test.go b/tests/graceshutdown/graceshutdown_test.go new file mode 100644 index 0000000000000..d76fa9ba0d288 --- /dev/null +++ b/tests/graceshutdown/graceshutdown_test.go @@ -0,0 +1,153 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package graceshutdown + +import ( + "context" + "database/sql" + "flag" + "fmt" + "os" + "os/exec" + "testing" + "time" + + _ "github.com/go-sql-driver/mysql" + "github.com/juju/errors" + . "github.com/pingcap/check" + log "github.com/sirupsen/logrus" +) + +var ( + tidbBinaryPath = flag.String("s", "bin/tidb-server", "tidb server binary path") + tmpPath = flag.String("tmp", "/tmp/tidb_gracefulshutdown", "temporary files path") + tidbStartPort = flag.Int("tidb_start_port", 5500, "first tidb server listening port") + tidbStatusPort = flag.Int("tidb_status_port", 8500, "first tidb server status port") +) + +func TestGracefulShutdown(t *testing.T) { + CustomVerboseFlag = true + TestingT(t) +} + +var _ = Suite(&TestGracefulShutdownSuite{}) + +type TestGracefulShutdownSuite struct { +} + +func (s *TestGracefulShutdownSuite) SetUpSuite(c *C) { +} +func (s *TestGracefulShutdownSuite) TearDownSuite(c *C) { +} + +func (s *TestGracefulShutdownSuite) startTiDBWithoutPD(port int, statusPort int) (cmd *exec.Cmd, err error) { + cmd = exec.Command(*tidbBinaryPath, + "--store=mocktikv", + fmt.Sprintf("--path=%s/mocktikv", *tmpPath), + fmt.Sprintf("-P=%d", port), + fmt.Sprintf("--status=%d", statusPort), + fmt.Sprintf("--log-file=%s/tidb%d.log", *tmpPath, port)) + log.Infof("starting tidb: %v", cmd) + err = cmd.Start() + if err != nil { + return nil, errors.Trace(err) + } + time.Sleep(500 * time.Millisecond) + return cmd, nil +} + +func (s *TestGracefulShutdownSuite) stopService(name string, cmd *exec.Cmd) (err error) { + if err = cmd.Process.Signal(os.Interrupt); err != nil { + return errors.Trace(err) + } + log.Infof("service \"%s\" Interrupt", name) + if err = cmd.Wait(); err != nil { + return errors.Trace(err) + } + log.Infof("service \"%s\" stopped gracefully", name) + return nil +} + +func (s *TestGracefulShutdownSuite) connectTiDB(port int) (db *sql.DB, err error) { + addr := fmt.Sprintf("127.0.0.1:%d", port) + dsn := fmt.Sprintf("root@(%s)/test", addr) + sleepTime := 250 * time.Millisecond + startTime := time.Now() + for i := 0; i < 5; i++ { + db, err = sql.Open("mysql", dsn) + if err != nil { + log.Warnf("open addr %v failed, retry count %d err %v", addr, i, err) + continue + } + err = db.Ping() + if err == nil { + break + } + log.Warnf("ping addr %v failed, retry count %d err %v", addr, i, err) + + err = db.Close() + if err != nil { + log.Warnf("close db failed, retry count %d err %v", i, err) + break + } + time.Sleep(sleepTime) + sleepTime += sleepTime + } + if err != nil { + log.Errorf("connect to server addr %v failed %v, take time %v", addr, err, time.Since(startTime)) + return nil, errors.Trace(err) + } + db.SetMaxOpenConns(10) + + log.Infof("connect to server %s ok", addr) + return db, nil +} + +func (s *TestGracefulShutdownSuite) TestGracefulShutdown(c *C) { + port := *tidbStartPort + 1 + tidb, err := s.startTiDBWithoutPD(port, *tidbStatusPort) + c.Assert(err, IsNil) + + db, err := s.connectTiDB(port) + c.Assert(err, IsNil) + defer func(){ + err := db.Close() + c.Assert(err, IsNil) + }() + + ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(10*time.Second)) + defer cancel() + conn1, err := db.Conn(ctx) + c.Assert(err, IsNil) + defer conn1.Close() + + _, err = conn1.ExecContext(ctx, "drop table if exists t;") + c.Assert(err, IsNil) + _, err = conn1.ExecContext(ctx, "create table t(a int);") + c.Assert(err, IsNil) + _, err = conn1.ExecContext(ctx, "insert into t values(1);") + c.Assert(err, IsNil) + + go func() { + time.Sleep(1e9) + err = s.stopService("tidb", tidb) + c.Assert(err, IsNil) + }() + + sql := `select 1 from t where not (select sleep(3)) ;` + var a int64 + err = conn1.QueryRowContext(ctx, sql).Scan(&a) + c.Assert(err, IsNil) + c.Assert(a, Equals, int64(1)) +} diff --git a/tests/graceshutdown/run-tests.sh b/tests/graceshutdown/run-tests.sh new file mode 100755 index 0000000000000..a4def89eaf845 --- /dev/null +++ b/tests/graceshutdown/run-tests.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +# Copyright 2020 PingCAP, Inc. + +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at + +# http://www.apache.org/licenses/LICENSE-2.0 + +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. + +set -eu +trap 'set +e; PIDS=$(jobs -p); [ -n "$PIDS" ] && kill -9 $PIDS' EXIT + +go test diff --git a/tidb-server/main.go b/tidb-server/main.go index b73988b1c0bf3..f9cb021a894e8 100644 --- a/tidb-server/main.go +++ b/tidb-server/main.go @@ -48,9 +48,10 @@ import ( "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/statistics" kvstore "github.com/pingcap/tidb/store" + "github.com/pingcap/tidb/store/driver" "github.com/pingcap/tidb/store/mockstore" "github.com/pingcap/tidb/store/tikv" - "github.com/pingcap/tidb/store/tikv/gcworker" + "github.com/pingcap/tidb/store/tikv/storeutil" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/disk" "github.com/pingcap/tidb/util/domainutil" @@ -60,7 +61,6 @@ import ( "github.com/pingcap/tidb/util/printer" "github.com/pingcap/tidb/util/profile" "github.com/pingcap/tidb/util/signal" - "github.com/pingcap/tidb/util/storeutil" "github.com/pingcap/tidb/util/sys/linux" storageSys "github.com/pingcap/tidb/util/sys/storage" "github.com/pingcap/tidb/util/systimemon" @@ -247,9 +247,8 @@ func setHeapProfileTracker() { } func registerStores() { - err := kvstore.Register("tikv", tikv.Driver{}) + err := kvstore.Register("tikv", driver.TiKVDriver{}) terror.MustNil(err) - tikv.NewGCHandlerFunc = gcworker.NewGCWorker err = kvstore.Register("mocktikv", mockstore.MockTiKVDriver{}) terror.MustNil(err) err = kvstore.Register("unistore", mockstore.EmbedUnistoreDriver{}) @@ -417,6 +416,11 @@ func overrideConfig(cfg *config.Config) { cfg.Host = *host } if actualFlags[nmAdvertiseAddress] { + var err error + if len(strings.Split(*advertiseAddress, " ")) > 1 { + err = errors.Errorf("Only support one advertise-address") + } + terror.MustNil(err) cfg.AdvertiseAddress = *advertiseAddress } if len(cfg.AdvertiseAddress) == 0 && cfg.Host == "0.0.0.0" { @@ -527,6 +531,8 @@ func setGlobalVars() { runtime.GOMAXPROCS(int(cfg.Performance.MaxProcs)) metrics.MaxProcs.Set(float64(runtime.GOMAXPROCS(0))) + util.SetGOGC(cfg.Performance.GOGC) + ddlLeaseDuration := parseDuration(cfg.Lease) session.SetSchemaLease(ddlLeaseDuration) statsLeaseDuration := parseDuration(cfg.Performance.StatsLease) @@ -554,15 +560,16 @@ func setGlobalVars() { variable.ForcePriority = int32(priority) variable.SetSysVar(variable.TiDBForcePriority, mysql.Priority2Str[priority]) - variable.SetSysVar(variable.TiDBOptDistinctAggPushDown, variable.BoolToIntStr(cfg.Performance.DistinctAggPushDown)) + variable.SetSysVar(variable.TiDBOptDistinctAggPushDown, variable.BoolToOnOff(cfg.Performance.DistinctAggPushDown)) variable.SetSysVar(variable.TIDBMemQuotaQuery, strconv.FormatInt(cfg.MemQuotaQuery, 10)) variable.SetSysVar("lower_case_table_names", strconv.Itoa(cfg.LowerCaseTableNames)) - variable.SetSysVar(variable.LogBin, variable.BoolToIntStr(config.GetGlobalConfig().Binlog.Enable)) + variable.SetSysVar(variable.LogBin, variable.BoolToOnOff(config.GetGlobalConfig().Binlog.Enable)) variable.SetSysVar(variable.Port, fmt.Sprintf("%d", cfg.Port)) variable.SetSysVar(variable.Socket, cfg.Socket) variable.SetSysVar(variable.DataDir, cfg.Path) variable.SetSysVar(variable.TiDBSlowQueryFile, cfg.Log.SlowQueryFile) variable.SetSysVar(variable.TiDBIsolationReadEngines, strings.Join(cfg.IsolationRead.Engines, ", ")) + variable.MemoryUsageAlarmRatio.Store(cfg.Performance.MemoryUsageAlarmRatio) // For CI environment we default enable prepare-plan-cache. plannercore.SetPreparedPlanCache(config.CheckTableBeforeDrop || cfg.PreparedPlanCache.Enabled) @@ -636,6 +643,7 @@ func createServer() { // Both domain and storage have started, so we have to clean them before exiting. terror.MustNil(err, closeDomainAndStorage) svr.SetDomain(dom) + svr.InitGlobalConnID(dom.ServerID) go dom.ExpensiveQueryHandle().SetSessionManager(svr).Run() dom.InfoSyncer().SetSessionManager(svr) } diff --git a/tools/check/check-errdoc.sh b/tools/check/check-errdoc.sh new file mode 100755 index 0000000000000..56d64ba282ca9 --- /dev/null +++ b/tools/check/check-errdoc.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Copyright 2020 PingCAP, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# See the License for the specific language governing permissions and +# limitations under the License. +# +# set is used to set the environment variables. +# -e: exit immediately when a command returning a non-zero exit code. +# -u: treat unset variables as an error. +# -o pipefail: sets the exit code of a pipeline to that of the rightmost command to exit with a non-zero status, +# or to zero if all commands of the pipeline exit successfully. +set -euo pipefail + +cd -P . + +cp errors.toml /tmp/errors.toml.before +./tools/bin/errdoc-gen --source . --module github.com/pingcap/tidb --output errors.toml +diff -q errors.toml /tmp/errors.toml.before diff --git a/types/compare.go b/types/compare.go index 560631130f9d0..f9fb7f84054c5 100644 --- a/types/compare.go +++ b/types/compare.go @@ -42,7 +42,7 @@ func CompareUint64(x, y uint64) int { return 1 } -//VecCompareUU returns []int64 comparing the []uint64 x to []uint64 y +// VecCompareUU returns []int64 comparing the []uint64 x to []uint64 y func VecCompareUU(x, y []uint64, res []int64) { n := len(x) for i := 0; i < n; i++ { @@ -56,7 +56,7 @@ func VecCompareUU(x, y []uint64, res []int64) { } } -//VecCompareII returns []int64 comparing the []int64 x to []int64 y +// VecCompareII returns []int64 comparing the []int64 x to []int64 y func VecCompareII(x, y, res []int64) { n := len(x) for i := 0; i < n; i++ { @@ -70,7 +70,7 @@ func VecCompareII(x, y, res []int64) { } } -//VecCompareUI returns []int64 comparing the []uint64 x to []int64y +// VecCompareUI returns []int64 comparing the []uint64 x to []int64y func VecCompareUI(x []uint64, y, res []int64) { n := len(x) for i := 0; i < n; i++ { @@ -86,7 +86,7 @@ func VecCompareUI(x []uint64, y, res []int64) { } } -//VecCompareIU returns []int64 comparing the []int64 x to []uint64y +// VecCompareIU returns []int64 comparing the []int64 x to []uint64y func VecCompareIU(x []int64, y []uint64, res []int64) { n := len(x) for i := 0; i < n; i++ { diff --git a/types/const_test.go b/types/const_test.go index 626bd1f60bb48..f32f455edd982 100644 --- a/types/const_test.go +++ b/types/const_test.go @@ -24,8 +24,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" - "github.com/pingcap/tidb/store/mockstore/mocktikv" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/testkit" "github.com/pingcap/tidb/util/testleak" ) @@ -33,10 +32,9 @@ import ( var _ = Suite(&testMySQLConstSuite{}) type testMySQLConstSuite struct { - cluster cluster.Cluster - mvccStore mocktikv.MVCCStore - store kv.Storage - dom *domain.Domain + cluster cluster.Cluster + store kv.Storage + dom *domain.Domain *parser.Parser } @@ -153,17 +151,184 @@ func (s *testMySQLConstSuite) TestPipesAsConcatMode(c *C) { r.Check(testkit.Rows("helloworld")) } +func (s *testMySQLConstSuite) TestIssue22387(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode=''") + err := tk.QueryToErr("select 12 - cast(15 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(12 - 15)'") + + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION';") + tk.MustQuery("select 12 - cast(15 as unsigned);").Check(testkit.Rows("-3")) +} + +func (s *testMySQLConstSuite) TestIssue22389(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION';") + tk.MustExec("DROP TABLE IF EXISTS tb5") + tk.MustExec("create table tb5(a bigint, b bigint);") + tk.MustExec("insert into tb5 values (10, -9223372036854775808);") + err := tk.QueryToErr("select a - b from tb5;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(test.tb5.a - test.tb5.b)'") + tk.MustExec("set sql_mode=''") + err = tk.QueryToErr("select a - b from tb5;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(test.tb5.a - test.tb5.b)'") +} + +func (s *testMySQLConstSuite) TestIssue22390(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("use test") + tk.MustExec("set sql_mode='';") + tk.MustExec("DROP TABLE IF EXISTS tb5") + tk.MustExec("create table tb5(a bigint, b bigint);") + tk.MustExec("insert into tb5 values (10, -9223372036854775808);") + err := tk.QueryToErr("select a - b from tb5;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(test.tb5.a - test.tb5.b)'") + + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION';") + err = tk.QueryToErr("select a - b from tb5;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(test.tb5.a - test.tb5.b)'") +} + +func (s *testMySQLConstSuite) TestIssue22442(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode='';") + tk.MustQuery("select cast(-1 as unsigned) - cast(-1 as unsigned);").Check(testkit.Rows("0")) + + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION';") + tk.MustQuery("select cast(-1 as unsigned) - cast(-1 as unsigned);").Check(testkit.Rows("0")) +} + +func (s *testMySQLConstSuite) TestIssue22444(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'; ") + tk.MustQuery("select cast(-1 as unsigned) - cast(-10000 as unsigned); ").Check(testkit.Rows("9999")) + + tk.MustExec("set sql_mode='';") + tk.MustQuery("select cast(-1 as unsigned) - cast(-10000 as unsigned); ").Check(testkit.Rows("9999")) +} + +func (s *testMySQLConstSuite) TestIssue22445(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'; ") + tk.MustQuery("select cast(-12 as unsigned) - cast(-1 as unsigned);").Check(testkit.Rows("-11")) + + tk.MustExec("set sql_mode='';") + err := tk.QueryToErr("select cast(-12 as unsigned) - cast(-1 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(18446744073709551604 - 18446744073709551615)'") +} + +func (s *testMySQLConstSuite) TestIssue22446(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'; ") + tk.MustQuery("select cast(-1 as unsigned) - 9223372036854775808").Check(testkit.Rows("9223372036854775807")) + + tk.MustExec("set sql_mode=''; ") + tk.MustQuery("select cast(-1 as unsigned) - 9223372036854775808").Check(testkit.Rows("9223372036854775807")) +} + +func (s *testMySQLConstSuite) TestIssue22447(c *C) { + tk := testkit.NewTestKit(c, s.store) + tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'; ") + tk.MustQuery("select 9223372036854775808 - cast(-1 as unsigned)").Check(testkit.Rows("-9223372036854775807")) + + tk.MustExec("set sql_mode='';") + err := tk.QueryToErr("select 9223372036854775808 - cast(-1 as unsigned)") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT UNSIGNED value is out of range in '(9223372036854775808 - 18446744073709551615)'") +} + func (s *testMySQLConstSuite) TestNoUnsignedSubtractionMode(c *C) { tk := testkit.NewTestKit(c, s.store) ctx := context.Background() tk.MustExec("set sql_mode='NO_UNSIGNED_SUBTRACTION'") r := tk.MustQuery("SELECT CAST(0 as UNSIGNED) - 1;") r.Check(testkit.Rows("-1")) - rs, _ := tk.Exec("SELECT CAST(18446744073709551615 as UNSIGNED) - 1;") - _, err := session.GetRows4Test(ctx, tk.Se, rs) + + // 1. minusFUU + err := tk.QueryToErr("SELECT CAST(-1 as UNSIGNED) - cast(9223372036854775807 as unsigned);") c.Assert(err, NotNil) - c.Assert(rs.Close(), IsNil) - rs, _ = tk.Exec("SELECT 1 - CAST(18446744073709551615 as UNSIGNED);") + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(18446744073709551615 - 9223372036854775807)'") + + err = tk.QueryToErr("SELECT CAST(0 as UNSIGNED) - cast(9223372036854775809 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(0 - 9223372036854775809)'") + + tk.MustQuery("SELECT CAST(0 as UNSIGNED) - cast(9223372036854775808 as unsigned);").Check(testkit.Rows("-9223372036854775808")) + tk.MustQuery("SELECT CAST(-1 as UNSIGNED) - cast(-9223372036854775808 as unsigned);").Check(testkit.Rows("9223372036854775807")) + tk.MustQuery("SELECT cast(0 as unsigned) - cast(9223372036854775808 as unsigned);").Check(testkit.Rows("-9223372036854775808")) + + // 2. minusSS + err = tk.QueryToErr("SELECT -9223372036854775808 - (1);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-9223372036854775808 - 1)'") + + err = tk.QueryToErr("SELECT 1 - (-9223372036854775808);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(1 - -9223372036854775808)'") + + err = tk.QueryToErr("SELECT 1 - (-9223372036854775807);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(1 - -9223372036854775807)'") + + // 3. minusFUS + err = tk.QueryToErr("SELECT CAST(-12 as UNSIGNED) - (-1);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(18446744073709551604 - -1)'") + + err = tk.QueryToErr("SELECT CAST(9223372036854775808 as UNSIGNED) - (0);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(9223372036854775808 - 0)'") + + err = tk.QueryToErr("SELECT CAST(-1 as UNSIGNED) - (9223372036854775807);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(18446744073709551615 - 9223372036854775807)'") + + err = tk.QueryToErr("SELECT CAST(9223372036854775808 as UNSIGNED) - 0;") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(9223372036854775808 - 0)'") + + tk.MustQuery("SELECT CAST(-1 as UNSIGNED) - (9223372036854775808);").Check(testkit.Rows("9223372036854775807")) + + err = tk.QueryToErr("SELECT CAST(1 as UNSIGNED) - (-9223372036854775808);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(1 - -9223372036854775808)'") + + err = tk.QueryToErr("SELECT CAST(1 as UNSIGNED) - (-9223372036854775807);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(1 - -9223372036854775807)'") + + tk.MustQuery("SELECT CAST(1 as UNSIGNED) - (-9223372036854775806)").Check(testkit.Rows("9223372036854775807")) + tk.MustQuery("select cast(0 as unsigned) - 9223372036854775807").Check(testkit.Rows("-9223372036854775807")) + + // 4. minusFSU + err = tk.QueryToErr("SELECT CAST(1 as SIGNED) - cast(9223372036854775810 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(1 - 9223372036854775810)'") + + err = tk.QueryToErr("SELECT CAST(-1 as SIGNED) - cast(9223372036854775808 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-1 - 9223372036854775808)'") + + err = tk.QueryToErr("SELECT CAST(-9223372036854775807 as SIGNED) - cast(-1 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-9223372036854775807 - 18446744073709551615)'") + + err = tk.QueryToErr("SELECT CAST(-1 as SIGNED) - cast(9223372036854775808 as unsigned);") + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:1690]BIGINT value is out of range in '(-1 - 9223372036854775808)'") + + tk.MustQuery("select 0 - cast(9223372036854775807 as unsigned)").Check(testkit.Rows("-9223372036854775807")) + tk.MustQuery("SELECT CAST(1 as SIGNED) - cast(9223372036854775809 as unsigned)").Check(testkit.Rows("-9223372036854775808")) + tk.MustQuery("SELECT CAST(-1 as SIGNED) - cast(9223372036854775807 as unsigned)").Check(testkit.Rows("-9223372036854775808")) + + rs, _ := tk.Exec("SELECT 1 - CAST(18446744073709551615 as UNSIGNED);") _, err = session.GetRows4Test(ctx, tk.Se, rs) c.Assert(err, NotNil) c.Assert(rs.Close(), IsNil) @@ -173,7 +338,7 @@ func (s *testMySQLConstSuite) TestNoUnsignedSubtractionMode(c *C) { c.Assert(rs.Close(), IsNil) rs, _ = tk.Exec("SELECT CAST(9223372036854775808 as UNSIGNED) - 1") _, err = session.GetRows4Test(ctx, tk.Se, rs) - c.Assert(err, NotNil) + c.Assert(err, IsNil) c.Assert(rs.Close(), IsNil) } diff --git a/types/convert.go b/types/convert.go index 02d2c0f187cf9..ee32a73a30f1d 100644 --- a/types/convert.go +++ b/types/convert.go @@ -264,7 +264,7 @@ func convertDecimalStrToUint(sc *stmtctx.StatementContext, str string, upperBoun val, err := strconv.ParseUint(intStr, 10, 64) if err != nil { - return val, errors.Trace(err) + return val, overflow(str, tp) } return val + round, nil } @@ -353,7 +353,7 @@ func NumberToDuration(number int64, fsp int8) (Duration, error) { } if number/10000 > TimeMaxHour || number%100 >= 60 || (number/100)%100 >= 60 { - return ZeroDuration, errors.Trace(ErrWrongValue.GenWithStackByArgs(TimeStr, strconv.FormatInt(number, 10))) + return ZeroDuration, errors.Trace(ErrTruncatedWrongVal.GenWithStackByArgs(TimeStr, strconv.FormatInt(number, 10))) } dur := NewDuration(int(number/10000), int((number/100)%100), int(number%100), 0, fsp) if neg { @@ -392,7 +392,7 @@ func getValidIntPrefix(sc *stmtctx.StatementContext, str string, isFuncCast bool valid = "0" } if validLen == 0 || validLen != len(str) { - return valid, errors.Trace(handleTruncateError(sc, ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", str))) + return valid, errors.Trace(sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", str))) } return valid, nil } @@ -543,11 +543,16 @@ func StrToFloat(sc *stmtctx.StatementContext, str string, isFuncCast bool) (floa return f, errors.Trace(err) } -// ConvertJSONToInt casts JSON into int64. -func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned bool) (int64, error) { +// ConvertJSONToInt64 casts JSON into int64. +func ConvertJSONToInt64(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned bool) (int64, error) { + return ConvertJSONToInt(sc, j, unsigned, mysql.TypeLonglong) +} + +// ConvertJSONToInt casts JSON into int by type. +func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned bool, tp byte) (int64, error) { switch j.TypeCode { case json.TypeCodeObject, json.TypeCodeArray: - return 0, nil + return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("INTEGER", j.String())) case json.TypeCodeLiteral: switch j.Value[0] { case json.LiteralNil, json.LiteralFalse: @@ -555,18 +560,39 @@ func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned default: return 1, nil } - case json.TypeCodeInt64, json.TypeCodeUint64: - return j.GetInt64(), nil + case json.TypeCodeInt64: + i := j.GetInt64() + if unsigned { + uBound := IntergerUnsignedUpperBound(tp) + u, err := ConvertIntToUint(sc, i, uBound, tp) + return int64(u), sc.HandleOverflow(err, err) + } + + lBound := IntergerSignedLowerBound(tp) + uBound := IntergerSignedUpperBound(tp) + i, err := ConvertIntToInt(i, lBound, uBound, tp) + return i, sc.HandleOverflow(err, err) + case json.TypeCodeUint64: + u := j.GetUint64() + if unsigned { + uBound := IntergerUnsignedUpperBound(tp) + u, err := ConvertUintToUint(u, uBound, tp) + return int64(u), sc.HandleOverflow(err, err) + } + + uBound := IntergerSignedUpperBound(tp) + i, err := ConvertUintToInt(u, uBound, tp) + return i, sc.HandleOverflow(err, err) case json.TypeCodeFloat64: f := j.GetFloat64() if !unsigned { - lBound := IntergerSignedLowerBound(mysql.TypeLonglong) - uBound := IntergerSignedUpperBound(mysql.TypeLonglong) - u, e := ConvertFloatToInt(f, lBound, uBound, mysql.TypeLonglong) + lBound := IntergerSignedLowerBound(tp) + uBound := IntergerSignedUpperBound(tp) + u, e := ConvertFloatToInt(f, lBound, uBound, tp) return u, sc.HandleOverflow(e, e) } - bound := IntergerUnsignedUpperBound(mysql.TypeLonglong) - u, err := ConvertFloatToUint(sc, f, bound, mysql.TypeLonglong) + bound := IntergerUnsignedUpperBound(tp) + u, err := ConvertFloatToUint(sc, f, bound, tp) return int64(u), sc.HandleOverflow(err, err) case json.TypeCodeString: str := string(hack.String(j.GetString())) @@ -584,7 +610,7 @@ func ConvertJSONToInt(sc *stmtctx.StatementContext, j json.BinaryJSON, unsigned func ConvertJSONToFloat(sc *stmtctx.StatementContext, j json.BinaryJSON) (float64, error) { switch j.TypeCode { case json.TypeCodeObject, json.TypeCodeArray: - return 0, nil + return 0, sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("FLOAT", j.String())) case json.TypeCodeLiteral: switch j.Value[0] { case json.LiteralNil, json.LiteralFalse: @@ -607,16 +633,31 @@ func ConvertJSONToFloat(sc *stmtctx.StatementContext, j json.BinaryJSON) (float6 // ConvertJSONToDecimal casts JSON into decimal. func ConvertJSONToDecimal(sc *stmtctx.StatementContext, j json.BinaryJSON) (*MyDecimal, error) { + var err error = nil res := new(MyDecimal) - if j.TypeCode != json.TypeCodeString { - f64, err := ConvertJSONToFloat(sc, j) - if err != nil { - return res, errors.Trace(err) + switch j.TypeCode { + case json.TypeCodeObject, json.TypeCodeArray: + err = ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", j.String()) + case json.TypeCodeLiteral: + switch j.Value[0] { + case json.LiteralNil, json.LiteralFalse: + res = res.FromInt(0) + default: + res = res.FromInt(1) } - err = res.FromFloat64(f64) + case json.TypeCodeInt64: + res = res.FromInt(j.GetInt64()) + case json.TypeCodeUint64: + res = res.FromUint(j.GetUint64()) + case json.TypeCodeFloat64: + err = res.FromFloat64(j.GetFloat64()) + case json.TypeCodeString: + err = res.FromString(j.GetString()) + } + err = sc.HandleTruncate(err) + if err != nil { return res, errors.Trace(err) } - err := sc.HandleTruncate(res.FromString(j.GetString())) return res, errors.Trace(err) } @@ -654,6 +695,9 @@ func getValidFloatPrefix(sc *stmtctx.StatementContext, s string, isFuncCast bool break } eIdx = i + } else if c == '\u0000' { + s = s[:validLen] + break } else if c < '0' || c > '9' { break } else { @@ -666,7 +710,7 @@ func getValidFloatPrefix(sc *stmtctx.StatementContext, s string, isFuncCast bool valid = "0" } if validLen == 0 || validLen != len(s) { - err = errors.Trace(handleTruncateError(sc, ErrTruncatedWrongVal.GenWithStackByArgs("FLOAT", s))) + err = errors.Trace(sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("FLOAT", s))) } return valid, err } diff --git a/types/convert_test.go b/types/convert_test.go index 7d5147f0f7de0..34a5f5aea5435 100644 --- a/types/convert_test.go +++ b/types/convert_test.go @@ -235,7 +235,7 @@ func (s *testTypeConvertSuite) TestConvertType(c *C) { c.Assert(err, IsNil, Commentf(errors.ErrorStack(err))) c.Assert(v.(*MyDecimal).String(), Equals, "3.1416") v, err = Convert("3.1415926", ft) - c.Assert(terror.ErrorEqual(err, ErrTruncatedWrongVal), IsTrue, Commentf("err %v", err)) + c.Assert(err, IsNil) c.Assert(v.(*MyDecimal).String(), Equals, "3.1416") v, err = Convert("99999", ft) c.Assert(terror.ErrorEqual(err, ErrOverflow), IsTrue, Commentf("err %v", err)) @@ -243,6 +243,15 @@ func (s *testTypeConvertSuite) TestConvertType(c *C) { v, err = Convert("-10000", ft) c.Assert(terror.ErrorEqual(err, ErrOverflow), IsTrue, Commentf("err %v", err)) c.Assert(v.(*MyDecimal).String(), Equals, "-9999.9999") + v, err = Convert("1,999.00", ft) + c.Assert(terror.ErrorEqual(err, ErrBadNumber), IsTrue, Commentf("err %v", err)) + c.Assert(v.(*MyDecimal).String(), Equals, "1.0000") + v, err = Convert("1,999,999.00", ft) + c.Assert(terror.ErrorEqual(err, ErrBadNumber), IsTrue, Commentf("err %v", err)) + c.Assert(v.(*MyDecimal).String(), Equals, "1.0000") + v, err = Convert("199.00 ", ft) + c.Assert(err, IsNil) + c.Assert(v.(*MyDecimal).String(), Equals, "199.0000") // Test Datum.ToDecimal with bad number. d := NewDatum("hello") @@ -272,6 +281,23 @@ func (s *testTypeConvertSuite) TestConvertType(c *C) { v, err = Convert(ZeroDuration, ft) c.Assert(err, IsNil) c.Assert(v, Equals, int64(time.Now().Year())) + bj1, err := json.ParseBinaryFromString("99") + c.Assert(err, IsNil) + v, err = Convert(bj1, ft) + c.Assert(err, IsNil) + c.Assert(v, Equals, int64(1999)) + bj2, err := json.ParseBinaryFromString("-1") + c.Assert(err, IsNil) + _, err = Convert(bj2, ft) + c.Assert(err, NotNil) + bj3, err := json.ParseBinaryFromString("{\"key\": 99}") + c.Assert(err, IsNil) + _, err = Convert(bj3, ft) + c.Assert(err, NotNil) + bj4, err := json.ParseBinaryFromString("[99, 0, 1]") + c.Assert(err, IsNil) + _, err = Convert(bj4, ft) + c.Assert(err, NotNil) // For enum ft = NewFieldType(mysql.TypeEnum) @@ -341,7 +367,7 @@ func (s *testTypeConvertSuite) TestConvertToString(c *C) { ft.Flen = 10 ft.Decimal = 5 v, err := Convert(3.1415926, ft) - c.Assert(terror.ErrorEqual(err, ErrTruncatedWrongVal), IsTrue, Commentf("err %v", err)) + c.Assert(err, IsNil) testToString(c, v, "3.14159") _, err = ToString(&invalidMockType{}) @@ -673,20 +699,20 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeDouble, "1e+1", "10") // year - signedDeny(c, mysql.TypeYear, 123, "0") - signedDeny(c, mysql.TypeYear, 3000, "0") + signedDeny(c, mysql.TypeYear, 123, "1901") + signedDeny(c, mysql.TypeYear, 3000, "2155") signedAccept(c, mysql.TypeYear, "2000", "2000") signedAccept(c, mysql.TypeYear, "abc", "0") signedAccept(c, mysql.TypeYear, "00abc", "2000") signedAccept(c, mysql.TypeYear, "0019", "2019") signedAccept(c, mysql.TypeYear, 2155, "2155") signedAccept(c, mysql.TypeYear, 2155.123, "2155") - signedDeny(c, mysql.TypeYear, 2156, "0") - signedDeny(c, mysql.TypeYear, 123.123, "0") - signedDeny(c, mysql.TypeYear, 1900, "0") + signedDeny(c, mysql.TypeYear, 2156, "2155") + signedDeny(c, mysql.TypeYear, 123.123, "1901") + signedDeny(c, mysql.TypeYear, 1900, "1901") signedAccept(c, mysql.TypeYear, 1901, "1901") signedAccept(c, mysql.TypeYear, 1900.567, "1901") - signedDeny(c, mysql.TypeYear, 1900.456, "0") + signedDeny(c, mysql.TypeYear, 1900.456, "1901") signedAccept(c, mysql.TypeYear, 0, "0") signedAccept(c, mysql.TypeYear, "0", "2000") signedAccept(c, mysql.TypeYear, "00", "2000") @@ -707,7 +733,7 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeYear, "70", "1970") signedAccept(c, mysql.TypeYear, 99, "1999") signedAccept(c, mysql.TypeYear, "99", "1999") - signedDeny(c, mysql.TypeYear, 100, "0") + signedDeny(c, mysql.TypeYear, 100, "1901") signedDeny(c, mysql.TypeYear, "99999999999999999999999999999999999", "0") // time from string @@ -737,7 +763,7 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeString, ZeroDatetime, "0000-00-00 00:00:00") signedAccept(c, mysql.TypeString, []byte("123"), "123") - //TODO add more tests + // TODO add more tests signedAccept(c, mysql.TypeNewDecimal, 123, "123") signedAccept(c, mysql.TypeNewDecimal, int64(123), "123") signedAccept(c, mysql.TypeNewDecimal, uint64(123), "123") @@ -746,8 +772,10 @@ func (s *testTypeConvertSuite) TestConvert(c *C) { signedAccept(c, mysql.TypeNewDecimal, "-123.456", "-123.456") signedAccept(c, mysql.TypeNewDecimal, NewDecFromInt(12300000), "12300000") dec := NewDecFromInt(-123) - dec.Shift(-5) - dec.Round(dec, 5, ModeHalfEven) + err := dec.Shift(-5) + c.Assert(err, IsNil) + err = dec.Round(dec, 5, ModeHalfEven) + c.Assert(err, IsNil) signedAccept(c, mysql.TypeNewDecimal, dec, "-0.00123") } @@ -867,6 +895,7 @@ func (s *testTypeConvertSuite) TestGetValidFloat(c *C) { {"123.e", "123."}, {"0-123", "0"}, {"9-3", "9"}, + {"1001001\\u0000\\u0000\\u0000", "1001001"}, } sc := new(stmtctx.StatementContext) for _, tt := range tests { @@ -969,7 +998,7 @@ func (s *testTypeConvertSuite) TestConvertJSONToInt(c *C) { {`[]`, 0}, {`3`, 3}, {`-3`, -3}, - {`4.5`, 5}, + {`4.5`, 4}, {`true`, 1}, {`false`, 0}, {`null`, 0}, @@ -981,7 +1010,7 @@ func (s *testTypeConvertSuite) TestConvertJSONToInt(c *C) { j, err := json.ParseBinaryFromString(tt.In) c.Assert(err, IsNil) - casted, _ := ConvertJSONToInt(new(stmtctx.StatementContext), j, false) + casted, _ := ConvertJSONToInt64(new(stmtctx.StatementContext), j, false) c.Assert(casted, Equals, tt.Out) } } @@ -1018,8 +1047,6 @@ func (s *testTypeConvertSuite) TestConvertJSONToDecimal(c *C) { In string Out *MyDecimal }{ - {`{}`, NewDecFromStringForTest("0")}, - {`[]`, NewDecFromStringForTest("0")}, {`3`, NewDecFromStringForTest("3")}, {`-3`, NewDecFromStringForTest("-3")}, {`4.5`, NewDecFromStringForTest("4.5")}, @@ -1159,6 +1186,7 @@ func (s *testTypeConvertSuite) TestConvertDecimalStrToUint(c *C) { {"18446744073709551614.55", 18446744073709551615, true}, {"18446744073709551615.344", 18446744073709551615, true}, {"18446744073709551615.544", 0, false}, + {"-111.111", 0, false}, } for _, ca := range cases { result, err := convertDecimalStrToUint(&stmtctx.StatementContext{}, ca.input, math.MaxUint64, 0) diff --git a/types/core_time.go b/types/core_time.go index ebb4baafc306c..f8cf9a0b0db9d 100644 --- a/types/core_time.go +++ b/types/core_time.go @@ -251,7 +251,7 @@ func compareTime(a, b CoreTime) int { // When we execute select date_add('2018-01-31',interval 1 month) in mysql we got 2018-02-28 // but in tidb we got 2018-03-03. // Dig it and we found it's caused by golang api time.Date(year int, month Month, day, hour, min, sec, nsec int, loc *Location) Time , -// it says October 32 converts to November 1 ,it conflits with mysql. +// it says October 32 converts to November 1 ,it conflicts with mysql. // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_date-add func AddDate(year, month, day int64, ot gotime.Time) (nt gotime.Time) { df := getFixDays(int(year), int(month), int(day), ot) diff --git a/types/datum.go b/types/datum.go index 464d213a040ec..d6542f7507631 100644 --- a/types/datum.go +++ b/types/datum.go @@ -101,6 +101,11 @@ func (d *Datum) Collation() string { return d.collation } +// SetCollation sets the collation of the datum. +func (d *Datum) SetCollation(collation string) { + d.collation = collation +} + // Frac gets the frac of the datum. func (d *Datum) Frac() int { return int(d.decimal) @@ -189,7 +194,10 @@ var sink = func(s string) { // GetBytes gets bytes value. func (d *Datum) GetBytes() []byte { - return d.b + if d.b != nil { + return d.b + } + return []byte{} } // SetBytes sets bytes value to datum. @@ -897,9 +905,15 @@ func ProduceFloatWithSpecifiedTp(f float64, target *FieldType, sc *stmtctx.State return f, errors.Trace(err) } } - if (mysql.HasUnsignedFlag(target.Flag) && f < 0) || (target.Tp == mysql.TypeFloat && (f > math.MaxFloat32 || f < -math.MaxFloat32)) { + if mysql.HasUnsignedFlag(target.Flag) && f < 0 { return 0, overflow(f, target.Tp) } + if target.Tp == mysql.TypeFloat && (f > math.MaxFloat32 || f < -math.MaxFloat32) { + if f > 0 { + return math.MaxFloat32, overflow(f, target.Tp) + } + return -math.MaxFloat32, overflow(f, target.Tp) + } return f, nil } @@ -947,10 +961,14 @@ func (d *Datum) convertToString(sc *stmtctx.StatementContext, target *FieldType) func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementContext, padZero bool) (_ string, err error) { flen, chs := tp.Flen, tp.Charset if flen >= 0 { + // overflowed stores the part of the string that is out of the length contraint, it is later checked to see if the + // overflowed part is all whitespaces + var overflowed string + var characterLen int // Flen is the rune length, not binary length, for UTF8 charset, we need to calculate the // rune count and truncate to Flen runes if it is too long. if chs == charset.CharsetUTF8 || chs == charset.CharsetUTF8MB4 { - characterLen := utf8.RuneCountInString(s) + characterLen = utf8.RuneCountInString(s) if characterLen > flen { // 1. If len(s) is 0 and flen is 0, truncateLen will be 0, don't truncate s. // CREATE TABLE t (a char(0)); @@ -967,13 +985,27 @@ func ProduceStrWithSpecifiedTp(s string, tp *FieldType, sc *stmtctx.StatementCon } runeCount++ } - err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, characterLen) + overflowed = s[truncateLen:] s = truncateStr(s, truncateLen) } } else if len(s) > flen { - err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, len(s)) + characterLen = len(s) + overflowed = s[flen:] s = truncateStr(s, flen) - } else if tp.Tp == mysql.TypeString && IsBinaryStr(tp) && len(s) < flen && padZero { + } + + if len(overflowed) != 0 { + trimed := strings.TrimRight(overflowed, " \t\n\r") + if len(trimed) == 0 && !IsBinaryStr(tp) && IsTypeChar(tp.Tp) { + if tp.Tp == mysql.TypeVarchar { + sc.AppendWarning(ErrTruncated.GenWithStack("Data truncated, field len %d, data len %d", flen, characterLen)) + } + } else { + err = ErrDataTooLong.GenWithStack("Data Too Long, field len %d, data len %d", flen, characterLen) + } + } + + if tp.Tp == mysql.TypeString && IsBinaryStr(tp) && len(s) < flen && padZero { padding := make([]byte, flen-len(s)) s = string(append([]byte(s), padding...)) } @@ -1042,7 +1074,7 @@ func (d *Datum) convertToUint(sc *stmtctx.StatementContext, target *FieldType) ( } case KindMysqlJSON: var i64 int64 - i64, err = ConvertJSONToInt(sc, d.GetMysqlJSON(), true) + i64, err = ConvertJSONToInt(sc, d.GetMysqlJSON(), true, tp) val = uint64(i64) default: return invalidConv(d, target.Tp) @@ -1258,11 +1290,11 @@ func (d *Datum) convertToMysqlDecimal(sc *stmtctx.StatementContext, target *Fiel err = err1 dec.FromUint(val) case KindMysqlJSON: - f, err1 := ConvertJSONToFloat(sc, d.GetMysqlJSON()) + f, err1 := ConvertJSONToDecimal(sc, d.GetMysqlJSON()) if err1 != nil { return ret, errors.Trace(err1) } - err = dec.FromFloat64(f) + dec = f default: return invalidConv(d, target.Tp) } @@ -1300,14 +1332,8 @@ func ProduceDecWithSpecifiedTp(dec *MyDecimal, tp *FieldType, sc *stmtctx.Statem return nil, err } if !dec.IsZero() && frac > decimal && dec.Compare(&old) != 0 { - if sc.InInsertStmt || sc.InUpdateStmt || sc.InDeleteStmt { - // fix https://github.com/pingcap/tidb/issues/3895 - // fix https://github.com/pingcap/tidb/issues/5532 - sc.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", &old)) - err = nil - } else { - err = sc.HandleTruncate(ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", &old)) - } + sc.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("DECIMAL", &old)) + err = nil } } } @@ -1348,6 +1374,12 @@ func (d *Datum) convertToMysqlYear(sc *stmtctx.StatementContext, target *FieldTy y = int64(d.GetMysqlTime().Year()) case KindMysqlDuration: y = int64(time.Now().Year()) + case KindMysqlJSON: + y, err = ConvertJSONToInt64(sc, d.GetMysqlJSON(), false) + if err != nil { + ret.SetInt64(0) + return ret, errors.Trace(err) + } default: ret, err = d.convertToInt(sc, NewFieldType(mysql.TypeLonglong)) if err != nil { @@ -1358,20 +1390,90 @@ func (d *Datum) convertToMysqlYear(sc *stmtctx.StatementContext, target *FieldTy y = ret.GetInt64() } y, err = AdjustYear(y, adjust) - if err != nil { - err = ErrOverflow.GenWithStackByArgs("DECIMAL", fmt.Sprintf("(%d, %d)", target.Flen, target.Decimal)) - } ret.SetInt64(y) + return ret, errors.Trace(err) +} + +// ConvertDatumToFloatYear converts datum into MySQL year with float type +func ConvertDatumToFloatYear(sc *stmtctx.StatementContext, d Datum) (Datum, error) { + return d.convertToMysqlFloatYear(sc, types.NewFieldType(mysql.TypeYear)) +} + +func (d *Datum) convertToMysqlFloatYear(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { + var ( + ret Datum + y float64 + err error + adjust bool + ) + switch d.k { + case KindString, KindBytes: + s := d.GetString() + trimS := strings.TrimSpace(s) + y, err = StrToFloat(sc, trimS, false) + if err != nil { + ret.SetFloat64(0) + return ret, errors.Trace(err) + } + // condition: + // parsed to 0, not a string of length 4, the first valid char is a 0 digit + if len(s) != 4 && y == 0 && strings.HasPrefix(trimS, "0") { + adjust = true + } + case KindMysqlTime: + y = float64(d.GetMysqlTime().Year()) + case KindMysqlDuration: + y = float64(time.Now().Year()) + case KindNull: + // if datum is NULL, we should keep it as it is, instead of setting it to zero or any other value. + ret = *d + return ret, nil + default: + ret, err = d.convertToFloat(sc, NewFieldType(mysql.TypeDouble)) + if err != nil { + _, err = invalidConv(d, target.Tp) + ret.SetFloat64(0) + return ret, err + } + y = ret.GetFloat64() + } + y = adjustYearForFloat(y, adjust) + ret.SetFloat64(y) return ret, err } +func (d *Datum) convertStringToMysqlBit(sc *stmtctx.StatementContext) (uint64, error) { + bitStr, err := ParseBitStr(BinaryLiteral(d.b).ToString()) + if err != nil { + // It cannot be converted to bit type, so we need to convert it to int type. + return BinaryLiteral(d.b).ToInt(sc) + } + return bitStr.ToInt(sc) +} + func (d *Datum) convertToMysqlBit(sc *stmtctx.StatementContext, target *FieldType) (Datum, error) { var ret Datum var uintValue uint64 var err error switch d.k { - case KindString, KindBytes: + case KindBytes: uintValue, err = BinaryLiteral(d.b).ToInt(sc) + case KindString: + // For single bit value, we take string like "true", "1" as 1, and "false", "0" as 0, + // this behavior is not documented in MySQL, but it behaves so, for more information, see issue #18681 + s := BinaryLiteral(d.b).ToString() + if target.Flen == 1 { + switch strings.ToLower(s) { + case "true", "1": + uintValue = 1 + case "false", "0": + uintValue = 0 + default: + uintValue, err = d.convertStringToMysqlBit(sc) + } + } else { + uintValue, err = d.convertStringToMysqlBit(sc) + } case KindInt64: // if input kind is int64 (signed), when trans to bit, we need to treat it as unsigned d.k = KindUint64 @@ -1400,12 +1502,12 @@ func (d *Datum) convertToMysqlEnum(sc *stmtctx.StatementContext, target *FieldTy err error ) switch d.k { - case KindString, KindBytes: - e, err = ParseEnumName(target.Elems, d.GetString(), target.Collate) + case KindString, KindBytes, KindBinaryLiteral: + e, err = ParseEnum(target.Elems, d.GetString(), target.Collate) case KindMysqlEnum: - e, err = ParseEnumName(target.Elems, d.GetMysqlEnum().Name, target.Collate) + e, err = ParseEnum(target.Elems, d.GetMysqlEnum().Name, target.Collate) case KindMysqlSet: - e, err = ParseEnumName(target.Elems, d.GetMysqlSet().Name, target.Collate) + e, err = ParseEnum(target.Elems, d.GetMysqlSet().Name, target.Collate) default: var uintDatum Datum uintDatum, err = d.convertToUint(sc, target) @@ -1427,12 +1529,12 @@ func (d *Datum) convertToMysqlSet(sc *stmtctx.StatementContext, target *FieldTyp err error ) switch d.k { - case KindString, KindBytes: - s, err = ParseSetName(target.Elems, d.GetString(), target.Collate) + case KindString, KindBytes, KindBinaryLiteral: + s, err = ParseSet(target.Elems, d.GetString(), target.Collate) case KindMysqlEnum: - s, err = ParseSetName(target.Elems, d.GetMysqlEnum().Name, target.Collate) + s, err = ParseSet(target.Elems, d.GetMysqlEnum().Name, target.Collate) case KindMysqlSet: - s, err = ParseSetName(target.Elems, d.GetMysqlSet().Name, target.Collate) + s, err = ParseSet(target.Elems, d.GetMysqlSet().Name, target.Collate) default: var uintDatum Datum uintDatum, err = d.convertToUint(sc, target) @@ -1557,11 +1659,11 @@ func ConvertDatumToDecimal(sc *stmtctx.StatementContext, d Datum) (*MyDecimal, e dec.FromUint(val) err = err1 case KindMysqlJSON: - f, err1 := ConvertJSONToFloat(sc, d.GetMysqlJSON()) + f, err1 := ConvertJSONToDecimal(sc, d.GetMysqlJSON()) if err1 != nil { return nil, errors.Trace(err1) } - err = dec.FromFloat64(f) + dec = f default: err = fmt.Errorf("can't convert %v to decimal", d.GetValue()) } @@ -1654,7 +1756,7 @@ func (d *Datum) toSignedInteger(sc *stmtctx.StatementContext, tp byte) (int64, e fval := d.GetMysqlSet().ToNumber() return ConvertFloatToInt(fval, lowerBound, upperBound, tp) case KindMysqlJSON: - return ConvertJSONToInt(sc, d.GetMysqlJSON(), false) + return ConvertJSONToInt(sc, d.GetMysqlJSON(), false, tp) case KindBinaryLiteral, KindMysqlBit: val, err := d.GetBinaryLiteral().ToInt(sc) if err != nil { @@ -1919,29 +2021,6 @@ func MaxValueDatum() Datum { return Datum{k: KindMaxValue} } -// EqualDatums compare if a and b contains the same datum values. -func EqualDatums(sc *stmtctx.StatementContext, a []Datum, b []Datum) (bool, error) { - if len(a) != len(b) { - return false, nil - } - if a == nil && b == nil { - return true, nil - } - if a == nil || b == nil { - return false, nil - } - for i, ai := range a { - v, err := ai.CompareDatum(sc, &b[i]) - if err != nil { - return false, errors.Trace(err) - } - if v != 0 { - return false, nil - } - } - return true, nil -} - // SortDatums sorts a slice of datum. func SortDatums(sc *stmtctx.StatementContext, datums []Datum) error { sorter := datumsSorter{datums: datums, sc: sc} @@ -1972,17 +2051,6 @@ func (ds *datumsSorter) Swap(i, j int) { ds.datums[i], ds.datums[j] = ds.datums[j], ds.datums[i] } -func handleTruncateError(sc *stmtctx.StatementContext, err error) error { - if sc.IgnoreTruncate { - return nil - } - if !sc.TruncateAsWarning { - return err - } - sc.AppendWarning(err) - return nil -} - // DatumsToString converts several datums to formatted string. func DatumsToString(datums []Datum, handleSpecialValue bool) (string, error) { strs := make([]string, 0, len(datums)) @@ -2044,14 +2112,10 @@ func GetMaxValue(ft *FieldType) (max Datum) { max.SetFloat32(float32(GetMaxFloat(ft.Flen, ft.Decimal))) case mysql.TypeDouble: max.SetFloat64(GetMaxFloat(ft.Flen, ft.Decimal)) - case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar: + case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: // codec.Encode KindMaxValue, to avoid import circle bytes := []byte{250} max.SetString(string(bytes), ft.Collate) - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - // codec.Encode KindMaxValue, to avoid import circle - bytes := []byte{250} - max.SetBytes(bytes) case mysql.TypeNewDecimal: max.SetMysqlDecimal(NewMaxOrMinDec(false, ft.Flen, ft.Decimal)) case mysql.TypeDuration: @@ -2079,14 +2143,10 @@ func GetMinValue(ft *FieldType) (min Datum) { min.SetFloat32(float32(-GetMaxFloat(ft.Flen, ft.Decimal))) case mysql.TypeDouble: min.SetFloat64(-GetMaxFloat(ft.Flen, ft.Decimal)) - case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar: + case mysql.TypeString, mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: // codec.Encode KindMinNotNull, to avoid import circle bytes := []byte{1} min.SetString(string(bytes), ft.Collate) - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - // codec.Encode KindMinNotNull, to avoid import circle - bytes := []byte{1} - min.SetBytes(bytes) case mysql.TypeNewDecimal: min.SetMysqlDecimal(NewMaxOrMinDec(true, ft.Flen, ft.Decimal)) case mysql.TypeDuration: diff --git a/types/datum_test.go b/types/datum_test.go index c5b3ea491a48a..ef3dc177b0a16 100644 --- a/types/datum_test.go +++ b/types/datum_test.go @@ -114,42 +114,6 @@ func (ts *testDatumSuite) TestToBool(c *C) { c.Assert(err, NotNil) } -func (ts *testDatumSuite) TestEqualDatums(c *C) { - tests := []struct { - a []interface{} - b []interface{} - same bool - }{ - // Positive cases - {[]interface{}{1}, []interface{}{1}, true}, - {[]interface{}{1, "aa"}, []interface{}{1, "aa"}, true}, - {[]interface{}{1, "aa", 1}, []interface{}{1, "aa", 1}, true}, - - // negative cases - {[]interface{}{1}, []interface{}{2}, false}, - {[]interface{}{1, "a"}, []interface{}{1, "aaaaaa"}, false}, - {[]interface{}{1, "aa", 3}, []interface{}{1, "aa", 2}, false}, - - // Corner cases - {[]interface{}{}, []interface{}{}, true}, - {[]interface{}{nil}, []interface{}{nil}, true}, - {[]interface{}{}, []interface{}{1}, false}, - {[]interface{}{1}, []interface{}{1, 1}, false}, - {[]interface{}{nil}, []interface{}{1}, false}, - } - for _, tt := range tests { - testEqualDatums(c, tt.a, tt.b, tt.same) - } -} - -func testEqualDatums(c *C, a []interface{}, b []interface{}, same bool) { - sc := new(stmtctx.StatementContext) - sc.IgnoreTruncate = true - res, err := EqualDatums(sc, MakeDatums(a...), MakeDatums(b...)) - c.Assert(err, IsNil) - c.Assert(res, Equals, same, Commentf("a: %v, b: %v", a, b)) -} - func testDatumToInt64(c *C, val interface{}, expect int64) { d := NewDatum(val) sc := new(stmtctx.StatementContext) @@ -540,13 +504,39 @@ func prepareCompareDatums() ([]Datum, []Datum) { return vals, vals1 } +func (ts *testDatumSuite) TestStringToMysqlBit(c *C) { + tests := []struct { + a Datum + out []byte + }{ + {NewStringDatum("true"), []byte{1}}, + {NewStringDatum("false"), []byte{0}}, + {NewStringDatum("1"), []byte{1}}, + {NewStringDatum("0"), []byte{0}}, + {NewStringDatum("b'1'"), []byte{1}}, + {NewStringDatum("b'0'"), []byte{0}}, + } + sc := new(stmtctx.StatementContext) + sc.IgnoreTruncate = true + tp := NewFieldType(mysql.TypeBit) + tp.Flen = 1 + for _, tt := range tests { + bin, err := tt.a.convertToMysqlBit(nil, tp) + c.Assert(err, IsNil) + c.Assert(bin.b, BytesEquals, tt.out) + } +} + func BenchmarkCompareDatum(b *testing.B) { vals, vals1 := prepareCompareDatums() sc := new(stmtctx.StatementContext) b.ResetTimer() for i := 0; i < b.N; i++ { for j, v := range vals { - v.CompareDatum(sc, &vals1[j]) + _, err := v.CompareDatum(sc, &vals1[j]) + if err != nil { + b.Fatal(err) + } } } } diff --git a/types/enum.go b/types/enum.go index 841b2cdc39beb..f80e3c3e6b07c 100644 --- a/types/enum.go +++ b/types/enum.go @@ -45,6 +45,19 @@ func (e Enum) ToNumber() float64 { return float64(e.Value) } +// ParseEnum creates a Enum with item name or value. +func ParseEnum(elems []string, name string, collation string) (Enum, error) { + if enumName, err := ParseEnumName(elems, name, collation); err == nil { + return enumName, nil + } + // name doesn't exist, maybe an integer? + if num, err := strconv.ParseUint(name, 0, 64); err == nil { + return ParseEnumValue(elems, num) + } + + return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) +} + // ParseEnumName creates a Enum with item name. func ParseEnumName(elems []string, name string, collation string) (Enum, error) { ctor := collate.GetCollator(collation) @@ -54,11 +67,6 @@ func ParseEnumName(elems []string, name string, collation string) (Enum, error) } } - // name doesn't exist, maybe an integer? - if num, err := strconv.ParseUint(name, 0, 64); err == nil { - return ParseEnumValue(elems, num) - } - return Enum{}, errors.Errorf("item %s is not in enum %v", name, elems) } diff --git a/types/enum_test.go b/types/enum_test.go index f7fd82bf87518..df97b649a72df 100644 --- a/types/enum_test.go +++ b/types/enum_test.go @@ -51,7 +51,7 @@ func (s *testEnumSuite) TestEnum(c *C) { } for _, t := range tbl { - e, err := ParseEnumName(t.Elems, t.Name, mysql.DefaultCollationName) + e, err := ParseEnum(t.Elems, t.Name, mysql.DefaultCollationName) if t.Expected == 0 { c.Assert(err, NotNil) c.Assert(e.ToNumber(), Equals, float64(0)) @@ -65,7 +65,7 @@ func (s *testEnumSuite) TestEnum(c *C) { } for _, t := range tbl { - e, err := ParseEnumName(t.Elems, t.Name, "utf8_unicode_ci") + e, err := ParseEnum(t.Elems, t.Name, "utf8_unicode_ci") if t.Expected == 0 { c.Assert(err, NotNil) c.Assert(e.ToNumber(), Equals, float64(0)) @@ -79,7 +79,7 @@ func (s *testEnumSuite) TestEnum(c *C) { } for _, t := range citbl { - e, err := ParseEnumName(t.Elems, t.Name, "utf8_general_ci") + e, err := ParseEnum(t.Elems, t.Name, "utf8_general_ci") if t.Expected == 0 { c.Assert(err, NotNil) c.Assert(e.ToNumber(), Equals, float64(0)) diff --git a/types/errors.go b/types/errors.go index e55eb32208015..bb006c921ff04 100644 --- a/types/errors.go +++ b/types/errors.go @@ -14,65 +14,76 @@ package types import ( - "github.com/pingcap/parser/terror" parser_types "github.com/pingcap/parser/types" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // const strings for ErrWrongValue const ( - DateTimeStr = "datetime" - TimeStr = "time" + DateTimeStr = "datetime" + DateStr = "date" + TimeStr = "time" + TimestampStr = "timestamp" ) var ( // ErrInvalidDefault is returned when meet a invalid default value. ErrInvalidDefault = parser_types.ErrInvalidDefault // ErrDataTooLong is returned when converts a string value that is longer than field type length. - ErrDataTooLong = terror.ClassTypes.New(mysql.ErrDataTooLong, mysql.MySQLErrName[mysql.ErrDataTooLong]) + ErrDataTooLong = dbterror.ClassTypes.NewStd(mysql.ErrDataTooLong) // ErrIllegalValueForType is returned when value of type is illegal. - ErrIllegalValueForType = terror.ClassTypes.New(mysql.ErrIllegalValueForType, mysql.MySQLErrName[mysql.ErrIllegalValueForType]) + ErrIllegalValueForType = dbterror.ClassTypes.NewStd(mysql.ErrIllegalValueForType) // ErrTruncated is returned when data has been truncated during conversion. - ErrTruncated = terror.ClassTypes.New(mysql.WarnDataTruncated, mysql.MySQLErrName[mysql.WarnDataTruncated]) + ErrTruncated = dbterror.ClassTypes.NewStd(mysql.WarnDataTruncated) // ErrOverflow is returned when data is out of range for a field type. - ErrOverflow = terror.ClassTypes.New(mysql.ErrDataOutOfRange, mysql.MySQLErrName[mysql.ErrDataOutOfRange]) + ErrOverflow = dbterror.ClassTypes.NewStd(mysql.ErrDataOutOfRange) // ErrDivByZero is return when do division by 0. - ErrDivByZero = terror.ClassTypes.New(mysql.ErrDivisionByZero, mysql.MySQLErrName[mysql.ErrDivisionByZero]) + ErrDivByZero = dbterror.ClassTypes.NewStd(mysql.ErrDivisionByZero) // ErrTooBigDisplayWidth is return when display width out of range for column. - ErrTooBigDisplayWidth = terror.ClassTypes.New(mysql.ErrTooBigDisplaywidth, mysql.MySQLErrName[mysql.ErrTooBigDisplaywidth]) + ErrTooBigDisplayWidth = dbterror.ClassTypes.NewStd(mysql.ErrTooBigDisplaywidth) // ErrTooBigFieldLength is return when column length too big for column. - ErrTooBigFieldLength = terror.ClassTypes.New(mysql.ErrTooBigFieldlength, mysql.MySQLErrName[mysql.ErrTooBigFieldlength]) + ErrTooBigFieldLength = dbterror.ClassTypes.NewStd(mysql.ErrTooBigFieldlength) // ErrTooBigSet is returned when too many strings for column. - ErrTooBigSet = terror.ClassTypes.New(mysql.ErrTooBigSet, mysql.MySQLErrName[mysql.ErrTooBigSet]) + ErrTooBigSet = dbterror.ClassTypes.NewStd(mysql.ErrTooBigSet) // ErrTooBigScale is returned when type DECIMAL/NUMERIC scale is bigger than mysql.MaxDecimalScale. - ErrTooBigScale = terror.ClassTypes.New(mysql.ErrTooBigScale, mysql.MySQLErrName[mysql.ErrTooBigScale]) + ErrTooBigScale = dbterror.ClassTypes.NewStd(mysql.ErrTooBigScale) // ErrTooBigPrecision is returned when type DECIMAL/NUMERIC precision is bigger than mysql.MaxDecimalWidth - ErrTooBigPrecision = terror.ClassTypes.New(mysql.ErrTooBigPrecision, mysql.MySQLErrName[mysql.ErrTooBigPrecision]) + ErrTooBigPrecision = dbterror.ClassTypes.NewStd(mysql.ErrTooBigPrecision) // ErrBadNumber is return when parsing an invalid binary decimal number. - ErrBadNumber = terror.ClassTypes.New(mysql.ErrBadNumber, mysql.MySQLErrName[mysql.ErrBadNumber]) + ErrBadNumber = dbterror.ClassTypes.NewStd(mysql.ErrBadNumber) // ErrInvalidFieldSize is returned when the precision of a column is out of range. - ErrInvalidFieldSize = terror.ClassTypes.New(mysql.ErrInvalidFieldSize, mysql.MySQLErrName[mysql.ErrInvalidFieldSize]) + ErrInvalidFieldSize = dbterror.ClassTypes.NewStd(mysql.ErrInvalidFieldSize) // ErrMBiggerThanD is returned when precision less than the scale. - ErrMBiggerThanD = terror.ClassTypes.New(mysql.ErrMBiggerThanD, mysql.MySQLErrName[mysql.ErrMBiggerThanD]) + ErrMBiggerThanD = dbterror.ClassTypes.NewStd(mysql.ErrMBiggerThanD) // ErrWarnDataOutOfRange is returned when the value in a numeric column that is outside the permissible range of the column data type. // See https://dev.mysql.com/doc/refman/5.5/en/out-of-range-and-overflow.html for details - ErrWarnDataOutOfRange = terror.ClassTypes.New(mysql.ErrWarnDataOutOfRange, mysql.MySQLErrName[mysql.ErrWarnDataOutOfRange]) + ErrWarnDataOutOfRange = dbterror.ClassTypes.NewStd(mysql.ErrWarnDataOutOfRange) // ErrDuplicatedValueInType is returned when enum column has duplicated value. - ErrDuplicatedValueInType = terror.ClassTypes.New(mysql.ErrDuplicatedValueInType, mysql.MySQLErrName[mysql.ErrDuplicatedValueInType]) + ErrDuplicatedValueInType = dbterror.ClassTypes.NewStd(mysql.ErrDuplicatedValueInType) // ErrDatetimeFunctionOverflow is returned when the calculation in datetime function cause overflow. - ErrDatetimeFunctionOverflow = terror.ClassTypes.New(mysql.ErrDatetimeFunctionOverflow, mysql.MySQLErrName[mysql.ErrDatetimeFunctionOverflow]) + ErrDatetimeFunctionOverflow = dbterror.ClassTypes.NewStd(mysql.ErrDatetimeFunctionOverflow) // ErrCastAsSignedOverflow is returned when positive out-of-range integer, and convert to it's negative complement. - ErrCastAsSignedOverflow = terror.ClassTypes.New(mysql.ErrCastAsSignedOverflow, mysql.MySQLErrName[mysql.ErrCastAsSignedOverflow]) + ErrCastAsSignedOverflow = dbterror.ClassTypes.NewStd(mysql.ErrCastAsSignedOverflow) // ErrCastNegIntAsUnsigned is returned when a negative integer be casted to an unsigned int. - ErrCastNegIntAsUnsigned = terror.ClassTypes.New(mysql.ErrCastNegIntAsUnsigned, mysql.MySQLErrName[mysql.ErrCastNegIntAsUnsigned]) + ErrCastNegIntAsUnsigned = dbterror.ClassTypes.NewStd(mysql.ErrCastNegIntAsUnsigned) // ErrInvalidYearFormat is returned when the input is not a valid year format. - ErrInvalidYearFormat = terror.ClassTypes.New(mysql.ErrInvalidYearFormat, mysql.MySQLErrName[mysql.ErrInvalidYearFormat]) + ErrInvalidYearFormat = dbterror.ClassTypes.NewStd(mysql.ErrInvalidYearFormat) // ErrInvalidYear is returned when the input value is not a valid year. - ErrInvalidYear = terror.ClassTypes.New(mysql.ErrInvalidYear, mysql.MySQLErrName[mysql.ErrInvalidYear]) + ErrInvalidYear = dbterror.ClassTypes.NewStd(mysql.ErrInvalidYear) // ErrTruncatedWrongVal is returned when data has been truncated during conversion. - ErrTruncatedWrongVal = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrTruncatedWrongValue]) + ErrTruncatedWrongVal = dbterror.ClassTypes.NewStd(mysql.ErrTruncatedWrongValue) // ErrInvalidWeekModeFormat is returned when the week mode is wrong. - ErrInvalidWeekModeFormat = terror.ClassTypes.New(mysql.ErrInvalidWeekModeFormat, mysql.MySQLErrName[mysql.ErrInvalidWeekModeFormat]) + ErrInvalidWeekModeFormat = dbterror.ClassTypes.NewStd(mysql.ErrInvalidWeekModeFormat) + // ErrWrongFieldSpec is returned when the column specifier incorrect. + ErrWrongFieldSpec = dbterror.ClassTypes.NewStd(mysql.ErrWrongFieldSpec) + // ErrSyntax is returned when the syntax is not allowed. + ErrSyntax = dbterror.ClassTypes.NewStdErr(mysql.ErrParse, mysql.MySQLErrName[mysql.ErrSyntax]) // ErrWrongValue is returned when the input value is in wrong format. - ErrWrongValue = terror.ClassTypes.New(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrWrongValue]) + ErrWrongValue = dbterror.ClassTypes.NewStdErr(mysql.ErrTruncatedWrongValue, mysql.MySQLErrName[mysql.ErrWrongValue]) + // ErrWrongValueForType is returned when the input value is in wrong format for function. + ErrWrongValueForType = dbterror.ClassTypes.NewStdErr(mysql.ErrWrongValueForType, mysql.MySQLErrName[mysql.ErrWrongValueForType]) + // ErrPartitionStatsMissing is returned when the partition-level stats is missing and the build global-level stats fails. + // Put this error here is to prevent `import cycle not allowed`. + ErrPartitionStatsMissing = dbterror.ClassTypes.NewStd(mysql.ErrPartitionStatsMissing) ) diff --git a/types/etc.go b/types/etc.go index 94f932c1d9bb3..90d7da96287d3 100644 --- a/types/etc.go +++ b/types/etc.go @@ -26,6 +26,7 @@ import ( "github.com/pingcap/parser/opcode" "github.com/pingcap/parser/terror" ast "github.com/pingcap/parser/types" + "github.com/pingcap/tidb/util/collate" ) // IsTypeBlob returns a boolean indicating whether the tp is a blob type. @@ -64,6 +65,15 @@ func IsTypeTime(tp byte) bool { return tp == mysql.TypeDatetime || tp == mysql.TypeDate || tp == mysql.TypeTimestamp } +// IsTypeInteger returns a boolean indicating whether the tp is integer type. +func IsTypeInteger(tp byte) bool { + switch tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong, mysql.TypeYear: + return true + } + return false +} + // IsTypeNumeric returns a boolean indicating whether the tp is numeric type. func IsTypeNumeric(tp byte) bool { switch tp { @@ -95,6 +105,15 @@ func IsNonBinaryStr(ft *FieldType) bool { return false } +// NeedRestoredData returns if a type needs restored data. +// If the type is char and the collation is _bin, NeedRestoredData() returns false. +func NeedRestoredData(ft *FieldType) bool { + if IsNonBinaryStr(ft) && !(collate.IsBinCollation(ft.Collate) && !IsTypeVarchar(ft.Tp)) { + return true + } + return false +} + // IsString returns a boolean indicating // whether the field type is a string type. func IsString(tp byte) bool { diff --git a/types/etc_test.go b/types/etc_test.go index 2fe5dbb885e9f..aa15804185ff5 100644 --- a/types/etc_test.go +++ b/types/etc_test.go @@ -137,14 +137,14 @@ func (s *testTypeEtcSuite) TestRoundFloat(c *C) { Input float64 Expect float64 }{ - {2.5, 3}, + {2.5, 2}, {1.5, 2}, - {0.5, 1}, + {0.5, 0}, {0.49999999999999997, 0}, {0, 0}, {-0.49999999999999997, 0}, - {-0.5, -1}, - {-2.5, -3}, + {-0.5, 0}, + {-2.5, -2}, {-1.5, -2}, } diff --git a/types/field_name.go b/types/field_name.go index a026b2a6fe98e..1212d760c5c2d 100644 --- a/types/field_name.go +++ b/types/field_name.go @@ -16,6 +16,7 @@ package types import ( "strings" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" ) @@ -60,3 +61,15 @@ func (s NameSlice) Shallow() NameSlice { // EmptyName is to occupy the position in the name slice. If it's set, that column's name is hidden. var EmptyName = &FieldName{Hidden: true} + +// FindAstColName checks whether the given ast.ColumnName is appeared in this slice. +func (s NameSlice) FindAstColName(name *ast.ColumnName) bool { + for _, fieldName := range s { + if (name.Schema.L == "" || name.Schema.L == fieldName.DBName.L) && + (name.Table.L == "" || name.Table.L == fieldName.TblName.L) && + name.Name.L == fieldName.ColName.L { + return true + } + } + return false +} diff --git a/types/field_type.go b/types/field_type.go index a097a59130747..a98c7634f5156 100644 --- a/types/field_type.go +++ b/types/field_type.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/parser/mysql" ast "github.com/pingcap/parser/types" "github.com/pingcap/tidb/types/json" + "github.com/pingcap/tidb/util/collate" utilMath "github.com/pingcap/tidb/util/math" ) @@ -65,15 +66,42 @@ func NewFieldTypeWithCollation(tp byte, collation string, length int) *FieldType // Aggregation is performed by MergeFieldType function. func AggFieldType(tps []*FieldType) *FieldType { var currType FieldType + isMixedSign := false for i, t := range tps { if i == 0 && currType.Tp == mysql.TypeUnspecified { currType = *t continue } mtp := MergeFieldType(currType.Tp, t.Tp) + isMixedSign = isMixedSign || (mysql.HasUnsignedFlag(currType.Flag) != mysql.HasUnsignedFlag(t.Flag)) currType.Tp = mtp currType.Flag = mergeTypeFlag(currType.Flag, t.Flag) } + // integral promotion when tps contains signed and unsigned + if isMixedSign && IsTypeInteger(currType.Tp) { + bumpRange := false // indicate one of tps bump currType range + for _, t := range tps { + bumpRange = bumpRange || (mysql.HasUnsignedFlag(t.Flag) && (t.Tp == currType.Tp || t.Tp == mysql.TypeBit)) + } + if bumpRange { + switch currType.Tp { + case mysql.TypeTiny: + currType.Tp = mysql.TypeShort + case mysql.TypeShort: + currType.Tp = mysql.TypeInt24 + case mysql.TypeInt24: + currType.Tp = mysql.TypeLong + case mysql.TypeLong: + currType.Tp = mysql.TypeLonglong + case mysql.TypeLonglong: + currType.Tp = mysql.TypeNewDecimal + } + } + } + + if mysql.HasUnsignedFlag(currType.Flag) && !isMixedSign { + currType.Flag |= mysql.UnsignedFlag + } return &currType } @@ -106,8 +134,8 @@ func AggregateEvalType(fts []*FieldType, flag *uint) EvalType { } lft = rft } - setTypeFlag(flag, mysql.UnsignedFlag, unsigned) - setTypeFlag(flag, mysql.BinaryFlag, !aggregatedEvalType.IsStringKind() || gotBinString) + SetTypeFlag(flag, mysql.UnsignedFlag, unsigned) + SetTypeFlag(flag, mysql.BinaryFlag, !aggregatedEvalType.IsStringKind() || gotBinString) return aggregatedEvalType } @@ -132,7 +160,8 @@ func mergeEvalType(lhs, rhs EvalType, lft, rft *FieldType, isLHSUnsigned, isRHSU return ETInt } -func setTypeFlag(flag *uint, flagItem uint, on bool) { +// SetTypeFlag turns the flagItem on or off. +func SetTypeFlag(flag *uint, flagItem uint, on bool) { if on { *flag |= flagItem } else { @@ -161,7 +190,7 @@ func DefaultParamTypeForValue(value interface{}, tp *FieldType) { func hasVariantFieldLength(tp *FieldType) bool { switch tp.Tp { case mysql.TypeLonglong, mysql.TypeVarString, mysql.TypeDouble, mysql.TypeBlob, - mysql.TypeBit, mysql.TypeDuration, mysql.TypeNewDecimal, mysql.TypeEnum, mysql.TypeSet: + mysql.TypeBit, mysql.TypeDuration, mysql.TypeEnum, mysql.TypeSet: return true } return false @@ -310,10 +339,10 @@ func MergeFieldType(a byte, b byte) byte { } // mergeTypeFlag merges two MySQL type flag to a new one -// currently only NotNullFlag is checked -// todo more flag need to be checked, for example: UnsignedFlag +// currently only NotNullFlag and UnsignedFlag is checked +// todo more flag need to be checked func mergeTypeFlag(a, b uint) uint { - return a & (b&mysql.NotNullFlag | ^mysql.NotNullFlag) + return a & (b&mysql.NotNullFlag | ^mysql.NotNullFlag) & (b&mysql.UnsignedFlag | ^mysql.UnsignedFlag) } func getFieldTypeIndex(tp byte) int { @@ -333,926 +362,926 @@ const ( var fieldTypeMergeRules = [fieldTypeNum][fieldTypeNum]byte{ /* mysql.TypeUnspecified -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeUnspecified, mysql.TypeUnspecified, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeTiny -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeTiny, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeTiny, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeShort -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeShort, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeShort, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeShort, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeLong -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeLong, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeLong, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeLong, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeLong, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeLong, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeFloat -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeDouble, mysql.TypeFloat, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeFloat, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeFloat, mysql.TypeFloat, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeFloat, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeDouble -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeDouble, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeDouble, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeNull -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeNull, mysql.TypeTimestamp, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeLonglong, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeDate, mysql.TypeDuration, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeYear, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeBit, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeJSON, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeEnum, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeSet, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeGeometry, }, /* mysql.TypeTimestamp -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeTimestamp, mysql.TypeTimestamp, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeLonglong -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeLonglong, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeLonglong, mysql.TypeLonglong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeLonglong, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeLong, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeLonglong, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeInt24 -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeInt24, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeInt24, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeInt24, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeInt24, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeDate -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeDate, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeDate, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeTime -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeDuration, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeDatetime, mysql.TypeDuration, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeDatetime -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeDatetime, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeYear -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeUnspecified, mysql.TypeTiny, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeShort, mysql.TypeLong, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeFloat, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeYear, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLonglong, mysql.TypeInt24, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeYear, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeNewDate -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeNewDate, mysql.TypeDatetime, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeDatetime, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeNewDate, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeVarchar -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeVarchar, mysql.TypeVarchar, }, /* mysql.TypeBit -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeBit, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeBit, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeJSON -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewFloat mysql.TypeDouble + // mysql.TypeNewFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeJSON, mysql.TypeVarchar, - //mysql.TypeLongLONG mysql.TypeInt24 + // mysql.TypeLongLONG mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate MYSQL_TYPE_TIME + // mysql.TypeDate MYSQL_TYPE_TIME mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime MYSQL_TYPE_YEAR + // mysql.TypeDatetime MYSQL_TYPE_YEAR mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeJSON, - //mysql.TypeNewDecimal MYSQL_TYPE_ENUM + // mysql.TypeNewDecimal MYSQL_TYPE_ENUM mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeLongBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeLongBlob, mysql.TypeVarchar, - //mysql.TypeString MYSQL_TYPE_GEOMETRY + // mysql.TypeString MYSQL_TYPE_GEOMETRY mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeNewDecimal -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeDouble, mysql.TypeDouble, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeNewDecimal, mysql.TypeNewDecimal, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeNewDecimal, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeNewDecimal, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeEnum -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeEnum, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeSet -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeSet, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeVarchar, }, /* mysql.TypeTinyBlob -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeTinyBlob, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeLongBlob, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeTinyBlob, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeTinyBlob, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeTinyBlob, mysql.TypeTinyBlob, }, /* mysql.TypeMediumBlob -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeMediumBlob, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeLongBlob, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeMediumBlob, mysql.TypeMediumBlob, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeMediumBlob, mysql.TypeMediumBlob, }, /* mysql.TypeLongBlob -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeLongBlob, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeLongBlob, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeLongBlob, mysql.TypeLongBlob, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeLongBlob, mysql.TypeLongBlob, }, /* mysql.TypeBlob -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeBlob, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeLongBlob, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeBlob, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeBlob, mysql.TypeBlob, }, /* mysql.TypeVarString -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeVarchar, mysql.TypeVarchar, }, /* mysql.TypeString -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeString, mysql.TypeString, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeString, mysql.TypeString, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeString, mysql.TypeString, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeString, mysql.TypeString, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeString, mysql.TypeString, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeString, mysql.TypeString, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeString, mysql.TypeString, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeString, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeString, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeString, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeString, mysql.TypeString, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeString, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeString, }, /* mysql.TypeGeometry -> */ { - //mysql.TypeUnspecified mysql.TypeTiny + // mysql.TypeUnspecified mysql.TypeTiny mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeShort mysql.TypeLong + // mysql.TypeShort mysql.TypeLong mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeFloat mysql.TypeDouble + // mysql.TypeFloat mysql.TypeDouble mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNull mysql.TypeTimestamp + // mysql.TypeNull mysql.TypeTimestamp mysql.TypeGeometry, mysql.TypeVarchar, - //mysql.TypeLonglong mysql.TypeInt24 + // mysql.TypeLonglong mysql.TypeInt24 mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDate mysql.TypeTime + // mysql.TypeDate mysql.TypeTime mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeDatetime mysql.TypeYear + // mysql.TypeDatetime mysql.TypeYear mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeNewDate mysql.TypeVarchar + // mysql.TypeNewDate mysql.TypeVarchar mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeBit <16>-<244> + // mysql.TypeBit <16>-<244> mysql.TypeVarchar, - //mysql.TypeJSON + // mysql.TypeJSON mysql.TypeVarchar, - //mysql.TypeNewDecimal mysql.TypeEnum + // mysql.TypeNewDecimal mysql.TypeEnum mysql.TypeVarchar, mysql.TypeVarchar, - //mysql.TypeSet mysql.TypeTinyBlob + // mysql.TypeSet mysql.TypeTinyBlob mysql.TypeVarchar, mysql.TypeTinyBlob, - //mysql.TypeMediumBlob mysql.TypeLongBlob + // mysql.TypeMediumBlob mysql.TypeLongBlob mysql.TypeMediumBlob, mysql.TypeLongBlob, - //mysql.TypeBlob mysql.TypeVarString + // mysql.TypeBlob mysql.TypeVarString mysql.TypeBlob, mysql.TypeVarchar, - //mysql.TypeString mysql.TypeGeometry + // mysql.TypeString mysql.TypeGeometry mysql.TypeString, mysql.TypeGeometry, }, } @@ -1266,3 +1295,11 @@ func SetBinChsClnFlag(ft *FieldType) { // VarStorageLen indicates this column is a variable length column. const VarStorageLen = ast.VarStorageLen + +// CommonHandleNeedRestoredData indicates whether the column can be decoded directly from the common handle. +// If can, then returns false. Otherwise returns true. +func CommonHandleNeedRestoredData(ft *FieldType) bool { + return collate.NewCollationEnabled() && + ft.EvalType() == ETString && + !mysql.HasBinaryFlag(ft.Flag) +} diff --git a/types/field_type_test.go b/types/field_type_test.go index 8381398935d6e..08522b1025cca 100644 --- a/types/field_type_test.go +++ b/types/field_type_test.go @@ -327,6 +327,44 @@ func (s *testFieldTypeSuite) TestAggFieldTypeForTypeFlag(c *C) { c.Assert(aggTp.Flag, Equals, mysql.NotNullFlag) } +func (s testFieldTypeSuite) TestAggFieldTypeForIntegralPromotion(c *C) { + fts := []*FieldType{ + NewFieldType(mysql.TypeTiny), + NewFieldType(mysql.TypeShort), + NewFieldType(mysql.TypeInt24), + NewFieldType(mysql.TypeLong), + NewFieldType(mysql.TypeLonglong), + NewFieldType(mysql.TypeNewDecimal), + } + + for i := 1; i < len(fts)-1; i++ { + tps := fts[i-1 : i+1] + + tps[0].Flag = 0 + tps[1].Flag = 0 + aggTp := AggFieldType(tps) + c.Assert(aggTp.Tp, Equals, fts[i].Tp) + c.Assert(aggTp.Flag, Equals, uint(0)) + + tps[0].Flag = mysql.UnsignedFlag + aggTp = AggFieldType(tps) + c.Assert(aggTp.Tp, Equals, fts[i].Tp) + c.Assert(aggTp.Flag, Equals, uint(0)) + + tps[0].Flag = mysql.UnsignedFlag + tps[1].Flag = mysql.UnsignedFlag + aggTp = AggFieldType(tps) + c.Assert(aggTp.Tp, Equals, fts[i].Tp) + c.Assert(aggTp.Flag, Equals, mysql.UnsignedFlag) + + tps[0].Flag = 0 + tps[1].Flag = mysql.UnsignedFlag + aggTp = AggFieldType(tps) + c.Assert(aggTp.Tp, Equals, fts[i+1].Tp) + c.Assert(aggTp.Flag, Equals, uint(0)) + } +} + func (s *testFieldTypeSuite) TestAggregateEvalType(c *C) { defer testleak.AfterTest(c)() fts := []*FieldType{ diff --git a/types/fsp.go b/types/fsp.go index 1059c9d5dd789..a3b15c61389b6 100644 --- a/types/fsp.go +++ b/types/fsp.go @@ -38,8 +38,10 @@ func CheckFsp(fsp int) (int8, error) { if fsp == int(UnspecifiedFsp) { return DefaultFsp, nil } - if fsp < int(MinFsp) || fsp > int(MaxFsp) { + if fsp < int(MinFsp) { return DefaultFsp, errors.Errorf("Invalid fsp %d", fsp) + } else if fsp > int(MaxFsp) { + return MaxFsp, nil } return int8(fsp), nil } diff --git a/types/fsp_test.go b/types/fsp_test.go index 0288dffeca737..f8e3b210b6300 100644 --- a/types/fsp_test.go +++ b/types/fsp_test.go @@ -43,16 +43,16 @@ func (s *FspTest) TestCheckFsp(c *C) { c.Assert(err, IsNil) obtained, err = CheckFsp(int(MaxFsp) + 1) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(int(MaxFsp)+1)) + c.Assert(obtained, Equals, MaxFsp) + c.Assert(err, IsNil) obtained, err = CheckFsp(int(MaxFsp) + 2019) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(int(MaxFsp)+2019)) + c.Assert(obtained, Equals, MaxFsp) + c.Assert(err, IsNil) obtained, err = CheckFsp(int(MaxFsp) + 4294967296) - c.Assert(obtained, Equals, DefaultFsp) - c.Assert(err, ErrorMatches, "Invalid fsp "+strconv.Itoa(int(MaxFsp)+4294967296)) + c.Assert(obtained, Equals, MaxFsp) + c.Assert(err, IsNil) obtained, err = CheckFsp(int(MaxFsp+MinFsp) / 2) c.Assert(obtained, Equals, (MaxFsp+MinFsp)/2) diff --git a/types/helper.go b/types/helper.go index 2c8d4b3c8f9f8..e0ea721c53a96 100644 --- a/types/helper.go +++ b/types/helper.go @@ -21,16 +21,12 @@ import ( "github.com/pingcap/errors" ) -// RoundFloat rounds float val to the nearest integer value with float64 format, like MySQL Round function. +// RoundFloat rounds float val to the nearest even integer value with float64 format, like MySQL Round function. // RoundFloat uses default rounding mode, see https://dev.mysql.com/doc/refman/5.7/en/precision-math-rounding.html -// so rounding use "round half away from zero". +// so rounding use "round to nearest even". // e.g, 1.5 -> 2, -1.5 -> -2. func RoundFloat(f float64) float64 { - if math.Abs(f) < 0.5 { - return 0 - } - - return math.Trunc(f + math.Copysign(0.5, f)) + return math.RoundToEven(f) } // Round rounds the argument f to dec decimal places. diff --git a/types/json/binary.go b/types/json/binary.go index 076db6b1df7f0..80647dabe7e85 100644 --- a/types/json/binary.go +++ b/types/json/binary.go @@ -145,7 +145,7 @@ func (bj BinaryJSON) marshalTo(buf []byte) ([]byte, error) { return buf, nil } -//IsZero return a boolean indicate whether BinaryJSON is Zero +// IsZero return a boolean indicate whether BinaryJSON is Zero func (bj BinaryJSON) IsZero() bool { isZero := false switch bj.TypeCode { @@ -402,7 +402,7 @@ func ParseBinaryFromString(s string) (bj BinaryJSON, err error) { err = ErrInvalidJSONText.GenWithStackByArgs("The document root must not be followed by other values.") return } - if err = bj.UnmarshalJSON(data); err != nil { + if err = bj.UnmarshalJSON(data); err != nil && !ErrJSONObjectKeyTooLong.Equal(err) { err = ErrInvalidJSONText.GenWithStackByArgs(err) } return @@ -428,6 +428,36 @@ func (bj *BinaryJSON) UnmarshalJSON(data []byte) error { return nil } +// HashValue converts certain JSON values for aggregate comparisons. +// For example int64(3) == float64(3.0) +func (bj BinaryJSON) HashValue(buf []byte) []byte { + switch bj.TypeCode { + case TypeCodeInt64: + // Convert to a FLOAT if no precision is lost. + // In the future, it will be better to convert to a DECIMAL value instead + // See: https://github.com/pingcap/tidb/issues/9988 + if bj.GetInt64() == int64(float64(bj.GetInt64())) { + buf = appendBinaryFloat64(buf, float64(bj.GetInt64())) + } else { + buf = append(buf, bj.Value...) + } + case TypeCodeArray: + elemCount := int(endian.Uint32(bj.Value)) + for i := 0; i < elemCount; i++ { + buf = bj.arrayGetElem(i).HashValue(buf) + } + case TypeCodeObject: + elemCount := int(endian.Uint32(bj.Value)) + for i := 0; i < elemCount; i++ { + buf = append(buf, bj.objectGetKey(i)...) + buf = bj.objectGetVal(i).HashValue(buf) + } + default: + buf = append(buf, bj.Value...) + } + return buf +} + // CreateBinary creates a BinaryJSON from interface. func CreateBinary(in interface{}) BinaryJSON { typeCode, buf, err := appendBinary(nil, in) @@ -510,29 +540,29 @@ func appendUint32(buf []byte, v uint32) []byte { } func appendBinaryNumber(buf []byte, x json.Number) (TypeCode, []byte, error) { - var typeCode TypeCode + // The type interpretation process is as follows: + // - Attempt float64 if it contains Ee. + // - Next attempt int64 + // - Then uint64 (valid in MySQL JSON, not in JSON decode library) + // - Then float64 + // - Return an error if strings.ContainsAny(string(x), "Ee.") { - typeCode = TypeCodeFloat64 f64, err := x.Float64() if err != nil { - return typeCode, nil, errors.Trace(err) - } - buf = appendBinaryFloat64(buf, f64) - } else { - typeCode = TypeCodeInt64 - i64, err := x.Int64() - if err != nil { - typeCode = TypeCodeFloat64 - f64, err := x.Float64() - if err != nil { - return typeCode, nil, errors.Trace(err) - } - buf = appendBinaryFloat64(buf, f64) - } else { - buf = appendBinaryUint64(buf, uint64(i64)) + return TypeCodeFloat64, nil, errors.Trace(err) } + return TypeCodeFloat64, appendBinaryFloat64(buf, f64), nil + } else if val, err := x.Int64(); err == nil { + return TypeCodeInt64, appendBinaryUint64(buf, uint64(val)), nil + } else if val, err := strconv.ParseUint(string(x), 10, 64); err == nil { + return TypeCodeUint64, appendBinaryUint64(buf, val), nil } - return typeCode, buf, nil + val, err := x.Float64() + if err == nil { + return TypeCodeFloat64, appendBinaryFloat64(buf, val), nil + } + var typeCode TypeCode + return typeCode, nil, errors.Trace(err) } func appendBinaryString(buf []byte, v string) []byte { @@ -623,6 +653,9 @@ func appendBinaryObject(buf []byte, x map[string]interface{}) ([]byte, error) { keyEntryOff := keyEntryBegin + i*keyEntrySize keyOff := len(buf) - docOff keyLen := uint32(len(field.key)) + if keyLen > math.MaxUint16 { + return nil, ErrJSONObjectKeyTooLong + } endian.PutUint32(buf[keyEntryOff:], uint32(keyOff)) endian.PutUint16(buf[keyEntryOff+keyLenOff:], uint16(keyLen)) buf = append(buf, field.key...) diff --git a/types/json/binary_functions.go b/types/json/binary_functions.go index 3cccc8baa462c..9f76ffb5d3d44 100644 --- a/types/json/binary_functions.go +++ b/types/json/binary_functions.go @@ -18,6 +18,7 @@ import ( "encoding/binary" "encoding/hex" "fmt" + "math" "sort" "unicode/utf8" @@ -316,7 +317,7 @@ func buildBinaryElements(buf []byte, entryStart int, elems []BinaryJSON) []byte return buf } -func buildBinaryObject(keys [][]byte, elems []BinaryJSON) BinaryJSON { +func buildBinaryObject(keys [][]byte, elems []BinaryJSON) (BinaryJSON, error) { totalSize := headerSize + len(elems)*(keyEntrySize+valEntrySize) for i, elem := range elems { if elem.TypeCode != TypeCodeLiteral { @@ -328,13 +329,16 @@ func buildBinaryObject(keys [][]byte, elems []BinaryJSON) BinaryJSON { endian.PutUint32(buf, uint32(len(elems))) endian.PutUint32(buf[dataSizeOff:], uint32(totalSize)) for i, key := range keys { + if len(key) > math.MaxUint16 { + return BinaryJSON{}, ErrJSONObjectKeyTooLong + } endian.PutUint32(buf[headerSize+i*keyEntrySize:], uint32(len(buf))) endian.PutUint16(buf[headerSize+i*keyEntrySize+keyLenOff:], uint16(len(key))) buf = append(buf, key...) } entryStart := headerSize + len(elems)*keyEntrySize buf = buildBinaryElements(buf, entryStart, elems) - return BinaryJSON{TypeCode: TypeCodeObject, Value: buf} + return BinaryJSON{TypeCode: TypeCodeObject, Value: buf}, nil } // Modify modifies a JSON object by insert, replace or set. @@ -362,6 +366,9 @@ func (bj BinaryJSON) Modify(pathExprList []PathExpression, values []BinaryJSON, case ModifySet: bj = modifier.set(pathExpr, value) } + if modifier.err != nil { + return BinaryJSON{}, modifier.err + } } return bj, nil } @@ -422,6 +429,9 @@ func (bj BinaryJSON) Remove(pathExprList []PathExpression) (BinaryJSON, error) { } modifer := &binaryModifier{bj: bj} bj = modifer.remove(pathExpr) + if modifer.err != nil { + return BinaryJSON{}, modifer.err + } } return bj, nil } @@ -430,6 +440,7 @@ type binaryModifier struct { bj BinaryJSON modifyPtr *byte modifyValue BinaryJSON + err error } func (bm *binaryModifier) set(path PathExpression, newBj BinaryJSON) BinaryJSON { @@ -441,6 +452,9 @@ func (bm *binaryModifier) set(path PathExpression, newBj BinaryJSON) BinaryJSON return bm.rebuild() } bm.doInsert(path, newBj) + if bm.err != nil { + return BinaryJSON{} + } return bm.rebuild() } @@ -462,6 +476,9 @@ func (bm *binaryModifier) insert(path PathExpression, newBj BinaryJSON) BinaryJS return bm.bj } bm.doInsert(path, newBj) + if bm.err != nil { + return BinaryJSON{} + } return bm.rebuild() } @@ -512,7 +529,8 @@ func (bm *binaryModifier) doInsert(path PathExpression, newBj BinaryJSON) { keys = append(keys, insertKey) elems = append(elems, newBj) } - bm.modifyValue = buildBinaryObject(keys, elems) + bm.modifyValue, bm.err = buildBinaryObject(keys, elems) + return } func (bm *binaryModifier) remove(path PathExpression) BinaryJSON { @@ -522,6 +540,9 @@ func (bm *binaryModifier) remove(path PathExpression) BinaryJSON { return bm.bj } bm.doRemove(path) + if bm.err != nil { + return BinaryJSON{} + } return bm.rebuild() } @@ -563,7 +584,8 @@ func (bm *binaryModifier) doRemove(path PathExpression) { elems = append(elems, parentBj.objectGetVal(i)) } } - bm.modifyValue = buildBinaryObject(keys, elems) + bm.modifyValue, bm.err = buildBinaryObject(keys, elems) + return } // rebuild merges the old and the modified JSON into a new BinaryJSON @@ -647,6 +669,16 @@ func compareInt64(x int64, y int64) int { return 1 } +func compareFloat64(x float64, y float64) int { + if x < y { + return -1 + } else if x == y { + return 0 + } + + return 1 +} + func compareUint64(x uint64, y uint64) int { if x < y { return -1 @@ -712,7 +744,7 @@ func CompareBinary(left, right BinaryJSON) int { case TypeCodeUint64: cmp = compareFloat64Uint64(left.GetFloat64(), right.GetUint64()) case TypeCodeFloat64: - cmp = compareFloat64PrecisionLoss(left.GetFloat64(), right.GetFloat64()) + cmp = compareFloat64(left.GetFloat64(), right.GetFloat64()) } case TypeCodeString: cmp = bytes.Compare(left.GetString(), right.GetString()) @@ -729,9 +761,24 @@ func CompareBinary(left, right BinaryJSON) int { } cmp = leftCount - rightCount case TypeCodeObject: - // only equal is defined on two json objects. - // larger and smaller are not defined. - cmp = bytes.Compare(left.Value, right.Value) + // reference: + // https://github.com/mysql/mysql-server/blob/ee4455a33b10f1b1886044322e4893f587b319ed/sql/json_dom.cc#L2561 + leftCount, rightCount := left.GetElemCount(), right.GetElemCount() + cmp := compareInt64(int64(leftCount), int64(rightCount)) + if cmp != 0 { + return cmp + } + for i := 0; i < leftCount; i++ { + leftKey, rightKey := left.objectGetKey(i), right.objectGetKey(i) + cmp = bytes.Compare(leftKey, rightKey) + if cmp != 0 { + return cmp + } + cmp = CompareBinary(left.objectGetVal(i), right.objectGetVal(i)) + if cmp != 0 { + return cmp + } + } } } else { cmp = precedence1 - precedence2 @@ -811,7 +858,11 @@ func mergeBinaryObject(objects []BinaryJSON) BinaryJSON { for i, key := range keys { values[i] = keyValMap[string(key)] } - return buildBinaryObject(keys, values) + binaryObject, err := buildBinaryObject(keys, values) + if err != nil { + panic("mergeBinaryObject should never panic, please contact the TiDB team for help") + } + return binaryObject } // PeekBytesAsJSON trys to peek some bytes from b, until @@ -980,7 +1031,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra elemCount := bj.GetElemCount() if currentLeg.arrayIndex == arrayIndexAsterisk { for i := 0; i < elemCount; i++ { - //buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr) + // buf = bj.arrayGetElem(i).extractTo(buf, subPathExpr) path := fullpath.pushBackOneIndexLeg(i) stop, err = bj.arrayGetElem(i).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { @@ -988,7 +1039,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra } } } else if currentLeg.arrayIndex < elemCount { - //buf = bj.arrayGetElem(currentLeg.arrayIndex).extractTo(buf, subPathExpr) + // buf = bj.arrayGetElem(currentLeg.arrayIndex).extractTo(buf, subPathExpr) path := fullpath.pushBackOneIndexLeg(currentLeg.arrayIndex) stop, err = bj.arrayGetElem(currentLeg.arrayIndex).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { @@ -999,7 +1050,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra elemCount := bj.GetElemCount() if currentLeg.dotKey == "*" { for i := 0; i < elemCount; i++ { - //buf = bj.objectGetVal(i).extractTo(buf, subPathExpr) + // buf = bj.objectGetVal(i).extractTo(buf, subPathExpr) path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i))) stop, err = bj.objectGetVal(i).extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { @@ -1009,7 +1060,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra } else { child, ok := bj.objectSearchKey(hack.Slice(currentLeg.dotKey)) if ok { - //buf = child.extractTo(buf, subPathExpr) + // buf = child.extractTo(buf, subPathExpr) path := fullpath.pushBackOneKeyLeg(currentLeg.dotKey) stop, err = child.extractToCallback(subPathExpr, callbackFn, path) if stop || err != nil { @@ -1018,7 +1069,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra } } } else if currentLeg.typ == pathLegDoubleAsterisk { - //buf = bj.extractTo(buf, subPathExpr) + // buf = bj.extractTo(buf, subPathExpr) stop, err = bj.extractToCallback(subPathExpr, callbackFn, fullpath) if stop || err != nil { return @@ -1027,7 +1078,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra if bj.TypeCode == TypeCodeArray { elemCount := bj.GetElemCount() for i := 0; i < elemCount; i++ { - //buf = bj.arrayGetElem(i).extractTo(buf, pathExpr) + // buf = bj.arrayGetElem(i).extractTo(buf, pathExpr) path := fullpath.pushBackOneIndexLeg(i) stop, err = bj.arrayGetElem(i).extractToCallback(pathExpr, callbackFn, path) if stop || err != nil { @@ -1037,7 +1088,7 @@ func (bj BinaryJSON) extractToCallback(pathExpr PathExpression, callbackFn extra } else if bj.TypeCode == TypeCodeObject { elemCount := bj.GetElemCount() for i := 0; i < elemCount; i++ { - //buf = bj.objectGetVal(i).extractTo(buf, pathExpr) + // buf = bj.objectGetVal(i).extractTo(buf, pathExpr) path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i))) stop, err = bj.objectGetVal(i).extractToCallback(pathExpr, callbackFn, path) if stop || err != nil { diff --git a/types/json/binary_test.go b/types/json/binary_test.go index c557839febb64..bd375746a046c 100644 --- a/types/json/binary_test.go +++ b/types/json/binary_test.go @@ -15,6 +15,7 @@ package json import ( "math" + "strings" "testing" . "github.com/pingcap/check" @@ -351,7 +352,7 @@ func BenchmarkBinaryMarshal(b *testing.B) { b.SetBytes(int64(len(benchStr))) bj, _ := ParseBinaryFromString(benchStr) for i := 0; i < b.N; i++ { - bj.MarshalJSON() + _, _ = bj.MarshalJSON() } } @@ -405,6 +406,16 @@ func (s *testJSONSuite) TestGetKeys(c *C) { c.Assert(parsedBJ.GetKeys().String(), Equals, "[]") parsedBJ = mustParseBinaryFromString(c, "{}") c.Assert(parsedBJ.GetKeys().String(), Equals, "[]") + + b := strings.Builder{} + b.WriteString("{\"") + for i := 0; i < 65536; i++ { + b.WriteByte('a') + } + b.WriteString("\": 1}") + parsedBJ, err := ParseBinaryFromString(b.String()) + c.Assert(err, NotNil) + c.Assert(err.Error(), Equals, "[types:8129]TiDB does not yet support JSON objects with the key length >= 65536") } func (s *testJSONSuite) TestBinaryJSONDepth(c *C) { diff --git a/types/json/constants.go b/types/json/constants.go index c6f17c992ad67..e0184b7301bbe 100644 --- a/types/json/constants.go +++ b/types/json/constants.go @@ -17,8 +17,8 @@ import ( "encoding/binary" "unicode/utf8" - "github.com/pingcap/parser/terror" mysql "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" ) // TypeCode indicates JSON type. @@ -206,21 +206,23 @@ const ( var ( // ErrInvalidJSONText means invalid JSON text. - ErrInvalidJSONText = terror.ClassJSON.New(mysql.ErrInvalidJSONText, mysql.MySQLErrName[mysql.ErrInvalidJSONText]) + ErrInvalidJSONText = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONText) // ErrInvalidJSONPath means invalid JSON path. - ErrInvalidJSONPath = terror.ClassJSON.New(mysql.ErrInvalidJSONPath, mysql.MySQLErrName[mysql.ErrInvalidJSONPath]) + ErrInvalidJSONPath = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONPath) // ErrInvalidJSONData means invalid JSON data. - ErrInvalidJSONData = terror.ClassJSON.New(mysql.ErrInvalidJSONData, mysql.MySQLErrName[mysql.ErrInvalidJSONData]) + ErrInvalidJSONData = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONData) // ErrInvalidJSONPathWildcard means invalid JSON path that contain wildcard characters. - ErrInvalidJSONPathWildcard = terror.ClassJSON.New(mysql.ErrInvalidJSONPathWildcard, mysql.MySQLErrName[mysql.ErrInvalidJSONPathWildcard]) + ErrInvalidJSONPathWildcard = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONPathWildcard) // ErrInvalidJSONContainsPathType means invalid JSON contains path type. - ErrInvalidJSONContainsPathType = terror.ClassJSON.New(mysql.ErrInvalidJSONContainsPathType, mysql.MySQLErrName[mysql.ErrInvalidJSONContainsPathType]) + ErrInvalidJSONContainsPathType = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONContainsPathType) // ErrJSONDocumentNULLKey means that json's key is null - ErrJSONDocumentNULLKey = terror.ClassJSON.New(mysql.ErrJSONDocumentNULLKey, mysql.MySQLErrName[mysql.ErrJSONDocumentNULLKey]) + ErrJSONDocumentNULLKey = dbterror.ClassJSON.NewStd(mysql.ErrJSONDocumentNULLKey) // ErrInvalidJSONPathArrayCell means invalid JSON path for an array cell. - ErrInvalidJSONPathArrayCell = terror.ClassJSON.New(mysql.ErrInvalidJSONPathArrayCell, mysql.MySQLErrName[mysql.ErrInvalidJSONPathArrayCell]) + ErrInvalidJSONPathArrayCell = dbterror.ClassJSON.NewStd(mysql.ErrInvalidJSONPathArrayCell) // ErrUnsupportedSecondArgumentType means unsupported second argument type in json_objectagg - ErrUnsupportedSecondArgumentType = terror.ClassJSON.New(mysql.ErrUnsupportedSecondArgumentType, mysql.MySQLErrName[mysql.ErrUnsupportedSecondArgumentType]) + ErrUnsupportedSecondArgumentType = dbterror.ClassJSON.NewStd(mysql.ErrUnsupportedSecondArgumentType) + // ErrJSONObjectKeyTooLong means JSON object with key length >= 65536 which is not yet supported. + ErrJSONObjectKeyTooLong = dbterror.ClassTypes.NewStdErr(mysql.ErrJSONObjectKeyTooLong, mysql.MySQLErrName[mysql.ErrJSONObjectKeyTooLong]) ) // json_contains_path function type choices diff --git a/types/mydecimal.go b/types/mydecimal.go index f86d74206049b..acd5ca48ff01d 100644 --- a/types/mydecimal.go +++ b/types/mydecimal.go @@ -389,6 +389,8 @@ func (d *MyDecimal) ToString() (str []byte) { // FromString parses decimal from string. func (d *MyDecimal) FromString(str []byte) error { + // strErr is used to check str is bad number or not + var strErr error for i := 0; i < len(str); i++ { if !isSpace(str[i]) { str = str[i:] @@ -419,6 +421,8 @@ func (d *MyDecimal) FromString(str []byte) error { endIdx++ } digitsFrac = endIdx - strIdx - 1 + } else if strIdx < len(str) && (str[strIdx] != 'e' && str[strIdx] != 'E' && str[strIdx] != ' ') { + strErr = ErrBadNumber } else { digitsFrac = 0 endIdx = strIdx @@ -519,6 +523,9 @@ func (d *MyDecimal) FromString(str []byte) error { d.negative = false } d.resultFrac = d.digitsFrac + if strErr != nil { + return strErr + } return err } diff --git a/types/mydecimal_benchmark_test.go b/types/mydecimal_benchmark_test.go index 3c484799f8caa..fc2d05aafeb95 100644 --- a/types/mydecimal_benchmark_test.go +++ b/types/mydecimal_benchmark_test.go @@ -41,19 +41,31 @@ func BenchmarkRound(b *testing.B) { } for i := 0; i < len(tests); i++ { - tests[i].inputDec.FromString([]byte(tests[i].input)) + err := tests[i].inputDec.FromString([]byte(tests[i].input)) + if err != nil { + b.Fatal(err) + } } b.StartTimer() for n := 0; n < b.N; n++ { for i := 0; i < len(tests); i++ { - tests[i].inputDec.Round(&roundTo, tests[i].scale, ModeHalfEven) + err := tests[i].inputDec.Round(&roundTo, tests[i].scale, ModeHalfEven) + if err != nil { + b.Fatal(err) + } } for i := 0; i < len(tests); i++ { - tests[i].inputDec.Round(&roundTo, tests[i].scale, ModeTruncate) + err := tests[i].inputDec.Round(&roundTo, tests[i].scale, ModeTruncate) + if err != nil { + b.Fatal(err) + } } for i := 0; i < len(tests); i++ { - tests[i].inputDec.Round(&roundTo, tests[i].scale, modeCeiling) + err := tests[i].inputDec.Round(&roundTo, tests[i].scale, modeCeiling) + if err != nil { + b.Fatal(err) + } } } } diff --git a/types/mydecimal_test.go b/types/mydecimal_test.go index 4b4a31f4f6411..59788a365be3e 100644 --- a/types/mydecimal_test.go +++ b/types/mydecimal_test.go @@ -82,7 +82,8 @@ func (s *testMyDecimalSuite) TestToInt(c *C) { } for _, tt := range tests { var dec MyDecimal - dec.FromString([]byte(tt.input)) + err := dec.FromString([]byte(tt.input)) + c.Assert(err, IsNil) result, ec := dec.ToInt() c.Check(ec, Equals, tt.err) c.Check(result, Equals, tt.output) @@ -106,7 +107,8 @@ func (s *testMyDecimalSuite) TestToUint(c *C) { } for _, tt := range tests { var dec MyDecimal - dec.FromString([]byte(tt.input)) + err := dec.FromString([]byte(tt.input)) + c.Assert(err, IsNil) result, ec := dec.ToUint() c.Check(ec, Equals, tt.err) c.Check(result, Equals, tt.output) @@ -144,7 +146,8 @@ func (s *testMyDecimalSuite) TestToFloat(c *C) { } for _, ca := range tests { var dec MyDecimal - dec.FromString([]byte(ca.s)) + err := dec.FromString([]byte(ca.s)) + c.Assert(err, IsNil) f, err := dec.ToFloat64() c.Check(err, IsNil) c.Check(f, Equals, ca.f) @@ -402,9 +405,10 @@ func (s *testMyDecimalSuite) TestRoundWithHalfEven(c *C) { for _, ca := range tests { var dec MyDecimal - dec.FromString([]byte(ca.input)) + err := dec.FromString([]byte(ca.input)) + c.Assert(err, IsNil) var rounded MyDecimal - err := dec.Round(&rounded, ca.scale, ModeHalfEven) + err = dec.Round(&rounded, ca.scale, ModeHalfEven) c.Check(err, Equals, ca.err) result := rounded.ToString() c.Check(string(result), Equals, ca.output) @@ -436,9 +440,10 @@ func (s *testMyDecimalSuite) TestRoundWithTruncate(c *C) { } for _, ca := range tests { var dec MyDecimal - dec.FromString([]byte(ca.input)) + err := dec.FromString([]byte(ca.input)) + c.Assert(err, IsNil) var rounded MyDecimal - err := dec.Round(&rounded, ca.scale, ModeTruncate) + err = dec.Round(&rounded, ca.scale, ModeTruncate) c.Check(err, Equals, ca.err) result := rounded.ToString() c.Check(string(result), Equals, ca.output) @@ -471,9 +476,10 @@ func (s *testMyDecimalSuite) TestRoundWithCeil(c *C) { } for _, ca := range tests { var dec MyDecimal - dec.FromString([]byte(ca.input)) + err := dec.FromString([]byte(ca.input)) + c.Assert(err, IsNil) var rounded MyDecimal - err := dec.Round(&rounded, ca.scale, modeCeiling) + err = dec.Round(&rounded, ca.scale, modeCeiling) c.Check(err, Equals, ca.err) result := rounded.ToString() c.Check(string(result), Equals, ca.output) @@ -508,6 +514,7 @@ func (s *testMyDecimalSerialSuite) TestFromString(c *C) { {"1e 1dddd ", "10", ErrTruncated}, {"1e - 1", "1", ErrTruncated}, {"1e -1", "0.1", nil}, + {"0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "0.000000000000000000000000000000000000000000000000000000000000000000000000", ErrTruncated}, } for _, ca := range tests { var dec MyDecimal @@ -543,7 +550,8 @@ func (s *testMyDecimalSuite) TestToString(c *C) { } for _, ca := range tests { var dec MyDecimal - dec.FromString([]byte(ca.input)) + err := dec.FromString([]byte(ca.input)) + c.Assert(err, IsNil) result := dec.ToString() c.Check(string(result), Equals, ca.output) } @@ -640,8 +648,10 @@ func (s *testMyDecimalSuite) TestCompare(c *C) { } for _, tt := range tests { var a, b MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) c.Assert(a.Compare(&b), Equals, tt.cmp) } } @@ -681,12 +691,11 @@ func (s *testMyDecimalSuite) TestNeg(c *C) { type testCase struct { a string result string - err error } tests := []testCase{ - {"-0.0000000000000000000000000000000000000000000000000017382578996420603", "0.0000000000000000000000000000000000000000000000000017382578996420603", nil}, - {"-13890436710184412000000000000000000000000000000000000000000000000000000000000", "13890436710184412000000000000000000000000000000000000000000000000000000000000", nil}, - {"0", "0", nil}, + {"-0.0000000000000000000000000000000000000000000000000017382578996420603", "0.0000000000000000000000000000000000000000000000000017382578996420603"}, + {"-13890436710184412000000000000000000000000000000000000000000000000000000000000", "13890436710184412000000000000000000000000000000000000000000000000000000000000"}, + {"0", "0"}, } for _, tt := range tests { a := NewDecFromStringForTest(tt.a) @@ -758,9 +767,11 @@ func (s *testMyDecimalSuite) TestSub(c *C) { } for _, tt := range tests { var a, b, sum MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) - err := DecimalSub(&a, &b, &sum) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) + err = DecimalSub(&a, &b, &sum) c.Assert(err, Equals, tt.err) result := sum.ToString() c.Assert(string(result), Equals, tt.result) @@ -790,9 +801,11 @@ func (s *testMyDecimalSuite) TestMul(c *C) { } for _, tt := range tests { var a, b, product MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) - err := DecimalMul(&a, &b, &product) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) + err = DecimalMul(&a, &b, &product) c.Check(err, Equals, tt.err) result := product.String() c.Assert(result, Equals, tt.result) @@ -825,9 +838,11 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { } for _, tt := range tests { var a, b, to MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) - err := DecimalDiv(&a, &b, &to, 5) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) + err = DecimalDiv(&a, &b, &to, 5) c.Check(err, Equals, tt.err) if tt.err == ErrDivByZero { continue @@ -848,8 +863,10 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { } for _, tt := range tests { var a, b, to MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) ec := DecimalMod(&a, &b, &to) c.Check(ec, Equals, tt.err) if tt.err == ErrDivByZero { @@ -869,8 +886,10 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { } for _, tt := range tests { var a, b, to MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) ec := DecimalDiv(&a, &b, &to, DivFracIncr) c.Check(ec, Equals, tt.err) if tt.err == ErrDivByZero { @@ -887,8 +906,10 @@ func (s *testMyDecimalSuite) TestDivMod(c *C) { } for _, tt := range tests { var a, b, to MyDecimal - a.FromString([]byte(tt.a)) - b.FromString([]byte(tt.b)) + err := a.FromString([]byte(tt.a)) + c.Assert(err, IsNil) + err = b.FromString([]byte(tt.b)) + c.Assert(err, IsNil) ec := DecimalMod(&a, &b, &to) c.Check(ec, Equals, tt.err) if tt.err == ErrDivByZero { diff --git a/types/overflow.go b/types/overflow.go index 6bb9d658acae8..c1533d4a4451c 100644 --- a/types/overflow.go +++ b/types/overflow.go @@ -200,7 +200,7 @@ func DivUintWithInt(a uint64, b int64) (uint64, error) { func DivIntWithUint(a int64, b uint64) (uint64, error) { if a < 0 { if uint64(-a) >= b { - return 0, ErrOverflow.GenWithStackByArgs("BIGINT", fmt.Sprintf("(%d, %d)", a, b)) + return 0, ErrOverflow.GenWithStackByArgs("BIGINT UNSIGNED", fmt.Sprintf("(%d, %d)", a, b)) } return 0, nil diff --git a/types/overflow_test.go b/types/overflow_test.go index 27b7c2f80dd70..78d214f39bf3b 100644 --- a/types/overflow_test.go +++ b/types/overflow_test.go @@ -329,16 +329,18 @@ func (s *testOverflowSuite) TestDiv(c *C) { rsh uint64 ret uint64 overflow bool + err string }{ - {math.MinInt64, math.MaxInt64, 0, true}, - {0, 1, 0, false}, - {-1, math.MaxInt64, 0, false}, + {math.MinInt64, math.MaxInt64, 0, true, "*BIGINT UNSIGNED value is out of range in '\\(-9223372036854775808, 9223372036854775807\\)'"}, + {0, 1, 0, false, ""}, + {-1, math.MaxInt64, 0, false, ""}, } for _, t := range tblInt2 { ret, err := DivIntWithUint(t.lsh, t.rsh) if t.overflow { c.Assert(err, NotNil) + c.Assert(err, ErrorMatches, t.err) } else { c.Assert(ret, Equals, t.ret) } diff --git a/types/parser_driver/special_cmt_ctrl.go b/types/parser_driver/special_cmt_ctrl.go index c1b018b685705..6fa7ebf67d6cd 100644 --- a/types/parser_driver/special_cmt_ctrl.go +++ b/types/parser_driver/special_cmt_ctrl.go @@ -34,6 +34,7 @@ func init() { parser.SpecialCommentsController.Register(string(FeatureIDAutoRandom)) parser.SpecialCommentsController.Register(string(FeatureIDAutoIDCache)) parser.SpecialCommentsController.Register(string(FeatureIDAutoRandomBase)) + parser.SpecialCommentsController.Register(string(FeatureClusteredIndex)) } // SpecialCommentVersionPrefix is the prefix of TiDB executable comments. @@ -58,11 +59,14 @@ const ( FeatureIDAutoIDCache featureID = "auto_id_cache" // FeatureIDAutoRandomBase is the `auto_random_base` feature. FeatureIDAutoRandomBase featureID = "auto_rand_base" + // FeatureClusteredIndex is the `clustered_index` feature. + FeatureClusteredIndex featureID = "clustered_index" ) // FeatureIDPatterns is used to record special comments patterns. var FeatureIDPatterns = map[featureID]*regexp.Regexp{ - FeatureIDAutoRandom: regexp.MustCompile(`(?i)AUTO_RANDOM\b\s*(\s*\(\s*\d+\s*\)\s*)?`), - FeatureIDAutoIDCache: regexp.MustCompile(`(?i)AUTO_ID_CACHE\s*=?\s*\d+\s*`), - FeatureIDAutoRandomBase: regexp.MustCompile(`(?i)AUTO_RANDOM_BASE\s*=?\s*\d+\s*`), + FeatureIDAutoRandom: regexp.MustCompile(`(?P(?i)AUTO_RANDOM\b\s*(\s*\(\s*\d+\s*\)\s*)?)`), + FeatureIDAutoIDCache: regexp.MustCompile(`(?P(?i)AUTO_ID_CACHE\s*=?\s*\d+\s*)`), + FeatureIDAutoRandomBase: regexp.MustCompile(`(?P(?i)AUTO_RANDOM_BASE\s*=?\s*\d+\s*)`), + FeatureClusteredIndex: regexp.MustCompile(`(?i)(PRIMARY)?\s+KEY(\s*\(.*\))?\s+(?P(NON)?CLUSTERED\b)`), } diff --git a/types/parser_driver/value_expr.go b/types/parser_driver/value_expr.go index a2398f42ad6f5..d3f358994f5be 100644 --- a/types/parser_driver/value_expr.go +++ b/types/parser_driver/value_expr.go @@ -17,6 +17,7 @@ import ( "fmt" "io" "strconv" + "strings" "github.com/pingcap/errors" "github.com/pingcap/parser/ast" @@ -45,6 +46,9 @@ func init() { ast.NewDecimal = func(str string) (interface{}, error) { dec := new(types.MyDecimal) err := dec.FromString(hack.Slice(str)) + if err == types.ErrTruncated { + err = nil + } return dec, err } ast.NewHexLiteral = func(str string) (interface{}, error) { @@ -96,8 +100,16 @@ func (n *ValueExpr) Restore(ctx *format.RestoreCtx) error { case types.KindFloat64: ctx.WritePlain(strconv.FormatFloat(n.GetFloat64(), 'e', -1, 64)) case types.KindString: - // TODO: Try other method to restore the character set introducer. For example, add a field in ValueExpr. - ctx.WriteString(n.GetString()) + // This part is used to process flag HasStringWithoutDefaultCharset, which means if we have this flag and the + // charset is mysql.DefaultCharset, we don't need to write the default. + if n.Type.Charset != "" && + !ctx.Flags.HasStringWithoutCharset() && + (!ctx.Flags.HasStringWithoutDefaultCharset() || n.Type.Charset != mysql.DefaultCharset) { + ctx.WritePlain("_") + ctx.WriteKeyWord(n.Type.Charset) + } + // Replace '\' to '\\' regardless of sql_mode "NO_BACKSLASH_ESCAPES", which is the same as MySQL. + ctx.WriteString(strings.ReplaceAll(n.GetString(), "\\", "\\\\")) case types.KindBytes: ctx.WriteString(n.GetString()) case types.KindMysqlDecimal: diff --git a/types/parser_driver/value_expr_test.go b/types/parser_driver/value_expr_test.go index 40d949bbd67aa..f65d092e33a29 100644 --- a/types/parser_driver/value_expr_test.go +++ b/types/parser_driver/value_expr_test.go @@ -48,6 +48,7 @@ func (s *testValueExprRestoreSuite) TestValueExprRestore(c *C) { {types.NewDecimalDatum(types.NewDecFromInt(321)), "321"}, {types.NewDurationDatum(types.ZeroDuration), "'00:00:00'"}, {types.NewTimeDatum(types.ZeroDatetime), "'0000-00-00 00:00:00'"}, + {types.NewStringDatum("\\"), "'\\\\'"}, } // Run Test var sb strings.Builder diff --git a/types/set.go b/types/set.go index 48a6d2a84a6c0..9c369d8104d41 100644 --- a/types/set.go +++ b/types/set.go @@ -48,6 +48,19 @@ func (e Set) Copy() Set { } } +// ParseSet creates a Set with name or value. +func ParseSet(elems []string, name string, collation string) (Set, error) { + if setName, err := ParseSetName(elems, name, collation); err == nil { + return setName, nil + } + // name doesn't exist, maybe an integer? + if num, err := strconv.ParseUint(name, 0, 64); err == nil { + return ParseSetValue(elems, num) + } + + return Set{}, errors.Errorf("item %s is not in Set %v", name, elems) +} + // ParseSetName creates a Set with name. func ParseSetName(elems []string, name string, collation string) (Set, error) { if len(name) == 0 { @@ -77,11 +90,6 @@ func ParseSetName(elems []string, name string, collation string) (Set, error) { return Set{Name: strings.Join(items, ","), Value: value}, nil } - // name doesn't exist, maybe an integer? - if num, err := strconv.ParseUint(name, 0, 64); err == nil { - return ParseSetValue(elems, num) - } - return Set{}, errors.Errorf("item %s is not in Set %v", name, elems) } diff --git a/types/set_test.go b/types/set_test.go index d3c692842033f..37188740c2f46 100644 --- a/types/set_test.go +++ b/types/set_test.go @@ -53,21 +53,21 @@ func (s *testSetSuite) TestSet(c *C) { } for _, t := range tbl { - e, err := ParseSetName(elems, t.Name, mysql.DefaultCollationName) + e, err := ParseSet(elems, t.Name, mysql.DefaultCollationName) c.Assert(err, IsNil) c.Assert(e.ToNumber(), Equals, float64(t.ExpectedValue)) c.Assert(e.String(), Equals, t.ExpectedName) } for _, t := range tbl { - e, err := ParseSetName(elems, t.Name, "utf8_unicode_ci") + e, err := ParseSet(elems, t.Name, "utf8_unicode_ci") c.Assert(err, IsNil) c.Assert(e.ToNumber(), Equals, float64(t.ExpectedValue)) c.Assert(e.String(), Equals, t.ExpectedName) } for _, t := range citbl { - e, err := ParseSetName(elems, t.Name, "utf8_general_ci") + e, err := ParseSet(elems, t.Name, "utf8_general_ci") c.Assert(err, IsNil) c.Assert(e.ToNumber(), Equals, float64(t.ExpectedValue)) c.Assert(e.String(), Equals, t.ExpectedName) @@ -95,7 +95,7 @@ func (s *testSetSuite) TestSet(c *C) { "e.f", } for _, t := range tblErr { - _, err := ParseSetName(elems, t, mysql.DefaultCollationName) + _, err := ParseSet(elems, t, mysql.DefaultCollationName) c.Assert(err, NotNil) } diff --git a/types/time.go b/types/time.go index 14c6aaac82945..615bb86ed6437 100644 --- a/types/time.go +++ b/types/time.go @@ -739,8 +739,8 @@ func ParseDateFormat(format string) []string { return nil } - // Date format must start and end with number. - if !isDigit(format[0]) || !isDigit(format[len(format)-1]) { + // Date format must start with number. + if !isDigit(format[0]) { return nil } @@ -786,18 +786,132 @@ func isValidSeparator(c byte, prevParts int) bool { return true } - return prevParts == 2 && (c == ' ' || c == 'T') + if prevParts == 2 && (c == ' ' || c == 'T') { + return true + } + + if prevParts > 4 && !isDigit(c) { + return true + } + return false } -// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html. -// The only delimiter recognized between a date and time part and a fractional seconds part is the decimal point. -func splitDateTime(format string) (seps []string, fracStr string) { - index := GetFracIndex(format) - if index > 0 { - fracStr = format[index+1:] - format = format[:index] +var validIdxCombinations = map[int]struct { + h int + m int +}{ + 100: {0, 0}, // 23:59:59Z + 30: {2, 0}, // 23:59:59+08 + 50: {4, 2}, // 23:59:59+0800 + 63: {5, 2}, // 23:59:59+08:00 + // postgres supports the following additional syntax that deviates from ISO8601, although we won't support it + // currently, it will be fairly easy to add in the current parsing framework + // 23:59:59Z+08 + // 23:59:59Z+08:00 +} + +// GetTimezone parses the trailing timezone information of a given time string literal. If idx = -1 is returned, it +// means timezone information not found, otherwise it indicates the index of the starting index of the timezone +// information. If the timezone contains sign, hour part and/or minute part, it will be returned as is, otherwise an +// empty string will be returned. +// +// Supported syntax: +// MySQL compatible: ((?P[-+])(?P[0-9]{2}):(?P[0-9]{2})){0,1}$, see +// https://dev.mysql.com/doc/refman/8.0/en/time-zone-support.html and https://dev.mysql.com/doc/refman/8.0/en/datetime.html +// the first link specified that timezone information should be in "[H]H:MM, prefixed with a + or -" while the +// second link specified that for string literal, "hour values less than than 10, a leading zero is required.". +// ISO-8601: Z|((((?P[-+])(?P[0-9]{2})(:(?P[0-9]{2}){0,1}){0,1})|((?P[0-9]{2}){0,1}){0,1}))$ +// see https://www.cl.cam.ac.uk/~mgk25/iso-time.html +func GetTimezone(lit string) (idx int, tzSign, tzHour, tzSep, tzMinute string) { + idx, zidx, sidx, spidx := -1, -1, -1, -1 + // idx is for the position of the starting of the timezone information + // zidx is for the z symbol + // sidx is for the sign + // spidx is for the separator + l := len(lit) + // the following loop finds the first index of Z, sign, and separator from backwards. + for i := l - 1; 0 <= i; i-- { + if lit[i] == 'Z' { + zidx = i + break + } + if sidx == -1 && (lit[i] == '-' || lit[i] == '+') { + sidx = i + } + if spidx == -1 && lit[i] == ':' { + spidx = i + } + } + // we could enumerate all valid combinations of these values and look it up in a table, see validIdxCombinations + // zidx can be -1 (23:59:59+08:00), l-1 (23:59:59Z) + // sidx can be -1, l-3, l-5, l-6 + // spidx can be -1, l-3 + k := 0 + if l-zidx == 1 { + k += 100 + } + if t := l - sidx; t == 3 || t == 5 || t == 6 { + k += t * 10 + } + if l-spidx == 3 { + k += 3 } + if v, ok := validIdxCombinations[k]; ok { + hidx, midx := l-v.h, l-v.m + valid := func(v string) bool { + return '0' <= v[0] && v[0] <= '9' && '0' <= v[1] && v[1] <= '9' + } + if sidx != -1 { + tzSign = lit[sidx : sidx+1] + idx = sidx + } + if zidx != -1 { + idx = zidx + } + if (l - spidx) == 3 { + tzSep = lit[spidx : spidx+1] + } + if v.h != 0 { + tzHour = lit[hidx : hidx+2] + if !valid(tzHour) { + return -1, "", "", "", "" + } + } + if v.m != 0 { + tzMinute = lit[midx : midx+2] + if !valid(tzMinute) { + return -1, "", "", "", "" + } + } + return + } + return -1, "", "", "", "" +} +// See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html. +// splitDateTime splits the string literal into 3 parts, date & time, FSP and time zone. +// For FSP, The only delimiter recognized between a date & time part and a fractional seconds part is the decimal point, +// therefore we could look from backwards at the literal to find the index of the decimal point. +// For time zone, the possible delimiter could be +/- (w.r.t. MySQL 8.0, see +// https://dev.mysql.com/doc/refman/8.0/en/datetime.html) and Z/z (w.r.t. ISO 8601, see section Time zone in +// https://www.cl.cam.ac.uk/~mgk25/iso-time.html). We also look from backwards for the delimiter, see GetTimezone. +func splitDateTime(format string) (seps []string, fracStr string, hasTZ bool, tzSign, tzHour, tzSep, tzMinute string) { + tzIndex, tzSign, tzHour, tzSep, tzMinute := GetTimezone(format) + if tzIndex > 0 { + hasTZ = true + for ; tzIndex > 0 && isPunctuation(format[tzIndex-1]); tzIndex-- { + // in case of multiple separators, e.g. 2020-10--10 + } + format = format[:tzIndex] + } + fracIndex := GetFracIndex(format) + if fracIndex > 0 { + fracStr = format[fracIndex+1:] + for ; fracIndex > 0 && isPunctuation(format[fracIndex-1]); fracIndex-- { + // in case of multiple separators, e.g. 2020-10..10 + } + format = format[:fracIndex] + } seps = ParseDateFormat(format) return } @@ -805,17 +919,115 @@ func splitDateTime(format string) (seps []string, fracStr string) { // See https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html. func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int8, isFloat bool) (Time, error) { var ( - year, month, day, hour, minute, second int - fracStr string - hhmmss bool - err error + year, month, day, hour, minute, second, deltaHour, deltaMinute int + fracStr string + tzSign, tzHour, tzSep, tzMinute string + hasTZ, hhmmss bool + err error ) - seps, fracStr := splitDateTime(str) + seps, fracStr, hasTZ, tzSign, tzHour, tzSep, tzMinute := splitDateTime(str) + var truncatedOrIncorrect bool + /* + if we have timezone parsed, there are the following cases to be considered, however some of them are wrongly parsed, and we should consider absorb them back to seps. + + 1. Z, then it must be time zone information, and we should not tamper with it + 2. -HH, it might be from + 1. no fracStr + 1. YYYY-MM-DD + 2. YYYY-MM-DD-HH + 3. YYYY-MM-DD HH-MM + 4. YYYY-MM-DD HH:MM-SS + 5. YYYY-MM-DD HH:MM:SS-HH (correct, no need absorb) + 2. with fracStr + 1. YYYY.MM-DD + 2. YYYY-MM.DD-HH + 3. YYYY-MM-DD.HH-MM + 4. YYYY-MM-DD HH.MM-SS + 5. YYYY-MM-DD HH:MM.SS-HH (correct, no need absorb) + 3. -HH:MM, similarly it might be from + 1. no fracStr + 1. YYYY-MM:DD + 2. YYYY-MM-DD:HH + 3. YYYY-MM-DD-HH:MM + 4. YYYY-MM-DD HH-MM:SS + 5. YYYY-MM-DD HH:MM-SS:HH (invalid) + 6. YYYY-MM-DD HH:MM:SS-HH:MM (correct, no need absorb) + 2. with fracStr + 1. YYYY.MM-DD:HH + 2. YYYY-MM.DD-HH:MM + 3. YYYY-MM-DD.HH-MM:SS + 4. YYYY-MM-DD HH.MM-SS:HH (invalid) + 5. YYYY-MM-DD HH:MM.SS-HH:MM (correct, no need absorb) + 4. -HHMM, there should only be one case, that is both the date and time part have existed, only then could we have fracStr or time zone + 1. YYYY-MM-DD HH:MM:SS.FSP-HHMM (correct, no need absorb) + + to summarize, FSP and timezone is only valid if we have date and time presented, otherwise we should consider absorbing + FSP or timezone into seps. additionally, if we want to absorb timezone, we either absorb them all, or not, meaning + we won't only absorb tzHour but not tzMinute. + + additional case to consider is that when the time literal is presented in float string (e.g. `YYYYMMDD.HHMMSS`), in + this case, FSP should not be absorbed and only `+HH:MM` would be allowed (i.e. Z, +HHMM, +HH that comes from ISO8601 + should be banned), because it only conforms to MySQL's timezone parsing logic, but it is not valid in ISO8601. + However, I think it is generally acceptable to allow a wider spectrum of timezone format in string literal. + */ + + // noAbsorb tests if can absorb FSP or TZ + noAbsorb := func(seps []string) bool { + // if we have more than 5 parts (i.e. 6), the tailing part can't be absorbed + // or if we only have 1 part, but its length is longer than 4, then it is at least YYMMD, in this case, FSP can + // not be absorbed, and it will be handled later, and the leading sign prevents TZ from being absorbed, because + // if date part has no separators, we can't use -/+ as separators between date & time. + return len(seps) > 5 || (len(seps) == 1 && len(seps[0]) > 4) + } + if len(fracStr) != 0 && !isFloat { + if !noAbsorb(seps) { + seps = append(seps, fracStr) + fracStr = "" + } + } + if hasTZ && tzSign != "" { + // if tzSign is empty, we can be sure that the string literal contains timezone (such as 2010-10-10T10:10:10Z), + // therefore we could safely skip this branch. + if !noAbsorb(seps) && !(tzMinute != "" && tzSep == "") { + // we can't absorb timezone if there is no separate between tzHour and tzMinute + if len(tzHour) != 0 { + seps = append(seps, tzHour) + } + if len(tzMinute) != 0 { + seps = append(seps, tzMinute) + } + hasTZ = false + } + } switch len(seps) { + case 0: + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) case 1: l := len(seps[0]) + // Values specified as numbers + if isFloat { + numOfTime, err := StrToInt(sc, seps[0], false) + if err != nil { + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + } + + dateTime, err := ParseDatetimeFromNum(sc, numOfTime) + if err != nil { + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + } + + year, month, day, hour, minute, second = + dateTime.Year(), dateTime.Month(), dateTime.Day(), dateTime.Hour(), dateTime.Minute(), dateTime.Second() + if l >= 9 && l <= 14 { + hhmmss = true + } + + break + } + + // Values specified as strings switch l { case 14: // No delimiter. // YYYYMMDDHHMMSS @@ -881,14 +1093,7 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int8, isFloat b err = nil } case 2: - // YYYY-MM is not valid - if len(fracStr) == 0 { - return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) - } - - // YYYY-MM.DD, DD is treat as fracStr - err = scanTimeArgs(append(seps, fracStr), &year, &month, &day) - fracStr = "" + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) case 3: // YYYY-MM-DD err = scanTimeArgs(seps, &year, &month, &day) @@ -904,7 +1109,14 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int8, isFloat b err = scanTimeArgs(seps, &year, &month, &day, &hour, &minute, &second) hhmmss = true default: - return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + // For case like `2020-05-28 23:59:59 00:00:00`, the seps should be > 6, the reluctant parts should be truncated. + seps = seps[:6] + // YYYY-MM-DD HH-MM-SS + if sc != nil { + sc.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs("datetime", str)) + } + err = scanTimeArgs(seps, &year, &month, &day, &hour, &minute, &second) + hhmmss = true } if err != nil { return ZeroDatetime, errors.Trace(err) @@ -924,7 +1136,8 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int8, isFloat b var microsecond int var overflow bool if hhmmss { - // If input string is "20170118.999", without hhmmss, fsp is meanless. + // If input string is "20170118.999", without hhmmss, fsp is meaningless. + // TODO: this case is not only meaningless, but erroneous, please confirm. microsecond, overflow, err = ParseFrac(fracStr, fsp) if err != nil { return ZeroDatetime, errors.Trace(err) @@ -943,6 +1156,36 @@ func parseDatetime(sc *stmtctx.StatementContext, str string, fsp int8, isFloat b } tmp = FromGoTime(t1.Add(gotime.Second)) } + if hasTZ { + // without hhmmss, timezone is also meaningless + if !hhmmss { + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStack(DateTimeStr, str)) + } + if len(tzHour) != 0 { + deltaHour = int((tzHour[0]-'0')*10 + (tzHour[1] - '0')) + } + if len(tzMinute) != 0 { + deltaMinute = int((tzMinute[0]-'0')*10 + (tzMinute[1] - '0')) + } + // allowed delta range is [-14:00, 14:00], and we will intentionally reject -00:00 + if deltaHour > 14 || deltaMinute > 59 || (deltaHour == 14 && deltaMinute != 0) || (tzSign == "-" && deltaHour == 0 && deltaMinute == 0) { + return ZeroDatetime, errors.Trace(ErrWrongValue.GenWithStackByArgs(DateTimeStr, str)) + } + // by default, if the temporal string literal does not contain timezone information, it will be in the timezone + // specified by the time_zone system variable. However, if the timezone is specified in the string literal, we + // will use the specified timezone to interpret the string literal and convert it into the system timezone. + offset := deltaHour*60*60 + deltaMinute*60 + if tzSign == "-" { + offset = -offset + } + loc := gotime.FixedZone(fmt.Sprintf("UTC%s%s:%s", tzSign, tzHour, tzMinute), offset) + t1, err := tmp.GoTime(loc) + if err != nil { + return ZeroDatetime, errors.Trace(err) + } + t1 = t1.In(sc.TimeZone) + tmp = FromGoTime(t1) + } nt := NewTime(tmp, mysql.TypeDatetime, fsp) @@ -999,18 +1242,36 @@ func adjustYear(y int) int { } // AdjustYear is used for adjusting year and checking its validation. -func AdjustYear(y int64, shouldAdjust bool) (int64, error) { - if y == 0 && !shouldAdjust { +func AdjustYear(y int64, adjustZero bool) (int64, error) { + if y == 0 && !adjustZero { return y, nil } y = int64(adjustYear(int(y))) - if y < int64(MinYear) || y > int64(MaxYear) { + if y < 0 { return 0, errors.Trace(ErrInvalidYear) } + if y < int64(MinYear) { + return int64(MinYear), errors.Trace(ErrInvalidYear) + } + if y > int64(MaxYear) { + return int64(MaxYear), errors.Trace(ErrInvalidYear) + } return y, nil } +func adjustYearForFloat(y float64, shouldAdjust bool) float64 { + if y == 0 && !shouldAdjust { + return y + } + if y >= 0 && y <= 69 { + y = 2000 + y + } else if y >= 70 && y <= 99 { + y = 1900 + y + } + return y +} + // NewDuration construct duration with time. func NewDuration(hour, minute, second, microsecond int, fsp int8) Duration { return Duration{ @@ -1613,11 +1874,6 @@ func parseDateTimeFromNum(sc *stmtctx.StatementContext, num int64) (Time, error) return getTime(sc, num, t.Type()) } - // Check YYYYMMDD. - if num < 10000101 { - return t, errors.Trace(ErrWrongValue.GenWithStackByArgs(TimeStr, strconv.FormatInt(num, 10))) - } - // Adjust hour/min/second. if num <= 99991231 { num = num * 1000000 @@ -1712,6 +1968,17 @@ func ParseDate(sc *stmtctx.StatementContext, str string) (Time, error) { return ParseTime(sc, str, mysql.TypeDate, MinFsp) } +// ParseTimeFromYear parse a `YYYY` formed year to corresponded Datetime type. +// Note: the invoker must promise the `year` is in the range [MinYear, MaxYear]. +func ParseTimeFromYear(sc *stmtctx.StatementContext, year int64) (Time, error) { + if year == 0 { + return NewTime(ZeroCoreTime, mysql.TypeDate, DefaultFsp), nil + } + + dt := FromDate(int(year), 0, 0, 0, 0, 0, 0) + return NewTime(dt, mysql.TypeDatetime, DefaultFsp), nil +} + // ParseTimeFromNum parses a formatted int64, // returns the value which type is tp. func ParseTimeFromNum(sc *stmtctx.StatementContext, num int64, tp byte, fsp int8) (Time, error) { @@ -1937,6 +2204,14 @@ func ExtractDurationNum(d *Duration, unit string) (int64, error) { return int64(d.Hour())*10000 + int64(d.Minute())*100 + int64(d.Second()), nil case "HOUR_MINUTE": return int64(d.Hour())*100 + int64(d.Minute()), nil + case "DAY_MICROSECOND": + return int64(d.Hour()*10000+d.Minute()*100+d.Second())*1000000 + int64(d.MicroSecond()), nil + case "DAY_SECOND": + return int64(d.Hour())*10000 + int64(d.Minute())*100 + int64(d.Second()), nil + case "DAY_MINUTE": + return int64(d.Hour())*100 + int64(d.Minute()), nil + case "DAY_HOUR": + return int64(d.Hour()), nil default: return 0, errors.Errorf("invalid unit %s", unit) } @@ -1965,13 +2240,15 @@ func parseSingleTimeValue(unit string, format string, strictCheck bool) (int64, lf := len(format) - 1 // Has fraction part if decimalPointPos < lf { - if lf-decimalPointPos >= 6 { + dvPre := oneToSixDigitRegex.FindString(format[decimalPointPos+1:]) // the numberical prefix of the fraction part + dvPreLen := len(dvPre) + if dvPreLen >= 6 { // MySQL rounds down to 1e-6. - if dv, err = strconv.ParseInt(format[decimalPointPos+1:decimalPointPos+7], 10, 64); err != nil { + if dv, err = strconv.ParseInt(dvPre[0:6], 10, 64); err != nil { return 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) } } else { - if dv, err = strconv.ParseInt(format[decimalPointPos+1:]+"000000"[:6-(lf-decimalPointPos)], 10, 64); err != nil { + if dv, err = strconv.ParseInt(dvPre[:]+"000000"[:6-dvPreLen], 10, 64); err != nil { return 0, 0, 0, 0, ErrWrongValue.GenWithStackByArgs(DateTimeStr, format) } } @@ -2456,7 +2733,8 @@ func abbrDayOfMonth(day int) string { func (t *Time) StrToDate(sc *stmtctx.StatementContext, date, format string) bool { ctx := make(map[string]int) var tm CoreTime - if !strToDate(&tm, date, format, ctx) { + success, warning := strToDate(&tm, date, format, ctx) + if !success { t.SetCoreTime(ZeroCoreTime) t.SetType(mysql.TypeDatetime) t.SetFsp(0) @@ -2468,7 +2746,15 @@ func (t *Time) StrToDate(sc *stmtctx.StatementContext, date, format string) bool t.SetCoreTime(tm) t.SetType(mysql.TypeDatetime) - return t.check(sc) == nil + if t.check(sc) != nil { + return false + } + if warning { + // Only append this warning when success but still need warning. + // Currently this only happens when `date` has extra characters at the end. + sc.AppendWarning(ErrTruncatedWrongVal.GenWithStackByArgs(DateTimeStr, date)) + } + return true } // mysqlTimeFix fixes the Time use the values in the context. @@ -2506,30 +2792,35 @@ func mysqlTimeFix(t *CoreTime, ctx map[string]int) error { return nil } -// strToDate converts date string according to format, returns true on success, +// strToDate converts date string according to format, // the value will be stored in argument t or ctx. -func strToDate(t *CoreTime, date string, format string, ctx map[string]int) bool { +// The second return value is true when success but still need to append a warning. +func strToDate(t *CoreTime, date string, format string, ctx map[string]int) (success bool, warning bool) { date = skipWhiteSpace(date) format = skipWhiteSpace(format) token, formatRemain, succ := getFormatToken(format) if !succ { - return false + return false, false } if token == "" { - // Extra characters at the end of date are ignored. - return true + if len(date) != 0 { + // Extra characters at the end of date are ignored, but a warning should be reported at this case. + return true, true + } + // Normal case. Both token and date are empty now. + return true, false } if len(date) == 0 { ctx[token] = 0 - return true + return true, false } dateRemain, succ := matchDateWithToken(t, date, token, ctx) if !succ { - return false + return false, false } return strToDate(t, dateRemain, formatRemain, ctx) @@ -2605,6 +2896,9 @@ var dateFormatParserTable = map[string]dateFormatParser{ "%S": secondsNumeric, // Seconds (00..59) "%T": time24Hour, // Time, 24-hour (hh:mm:ss) "%Y": yearNumericFourDigits, // Year, numeric, four digits + "%#": skipAllNums, // Skip all numbers + "%.": skipAllPunct, // Skip all punctation characters + "%@": skipAllAlpha, // Skip all alpha characters // Deprecated since MySQL 5.7.5 "%y": yearNumericTwoDigits, // Year, numeric (two digits) // TODO: Add the following... @@ -2726,8 +3020,10 @@ func time12Hour(t *CoreTime, input string, ctx map[string]int) (string, bool) { switch { case strings.HasPrefix(remain, "AM"): t.setHour(uint8(hour)) + remain = strings.TrimPrefix(remain, "AM") case strings.HasPrefix(remain, "PM"): t.setHour(uint8(hour + 12)) + remain = strings.TrimPrefix(remain, "PM") default: return input, false } @@ -2983,3 +3279,39 @@ func DateTimeIsOverflow(sc *stmtctx.StatementContext, date Time) (bool, error) { inRange := (t.After(b) || t.Equal(b)) && (t.Before(e) || t.Equal(e)) return !inRange, nil } + +func skipAllNums(t *CoreTime, input string, ctx map[string]int) (string, bool) { + retIdx := 0 + for i, ch := range input { + if unicode.IsNumber(ch) { + retIdx = i + 1 + } else { + break + } + } + return input[retIdx:], true +} + +func skipAllPunct(t *CoreTime, input string, ctx map[string]int) (string, bool) { + retIdx := 0 + for i, ch := range input { + if unicode.IsPunct(ch) { + retIdx = i + 1 + } else { + break + } + } + return input[retIdx:], true +} + +func skipAllAlpha(t *CoreTime, input string, ctx map[string]int) (string, bool) { + retIdx := 0 + for i, ch := range input { + if unicode.IsLetter(ch) { + retIdx = i + 1 + } else { + break + } + } + return input[retIdx:], true +} diff --git a/types/time_test.go b/types/time_test.go index 7f74dc01ba0de..6d294494b0082 100644 --- a/types/time_test.go +++ b/types/time_test.go @@ -14,6 +14,7 @@ package types_test import ( + "fmt" "math" "testing" "time" @@ -98,9 +99,22 @@ func (s *testTimeSuite) TestDateTime(c *C) { {"2018-01-01 18", "2018-01-01 18:00:00"}, {"18-01-01 18", "2018-01-01 18:00:00"}, {"2018.01.01", "2018-01-01 00:00:00.00"}, + {"2020.10.10 10.10.10", "2020-10-10 10:10:10.00"}, + {"2020-10-10 10-10.10", "2020-10-10 10:10:10.00"}, + {"2020-10-10 10.10", "2020-10-10 10:10:00.00"}, + {"2018.01.01", "2018-01-01 00:00:00.00"}, {"2018.01.01 00:00:00", "2018-01-01 00:00:00"}, {"2018/01/01-00:00:00", "2018-01-01 00:00:00"}, {"4710072", "2047-10-07 02:00:00"}, + {"2016-06-01 00:00:00 00:00:00", "2016-06-01 00:00:00"}, + {"2020-06-01 00:00:00ads!,?*da;dsx", "2020-06-01 00:00:00"}, + + // For issue 22231 + {"2020-05-28 23:59:59 00:00:00", "2020-05-28 23:59:59"}, + {"2020-05-28 23:59:59-00:00:00", "2020-05-28 23:59:59"}, + {"2020-05-28 23:59:59T T00:00:00", "2020-05-28 23:59:59"}, + {"2020-10-22 10:31-10:12", "2020-10-22 10:31:10"}, + {"2018.01.01 01:00:00", "2018-01-01 01:00:00"}, } for _, test := range table { @@ -125,6 +139,10 @@ func (s *testTimeSuite) TestDateTime(c *C) { {"2017.00.05 23:59:58.575601", 3, "2017-00-05 23:59:58.576"}, {"2017/00/05 23:59:58.575601", 3, "2017-00-05 23:59:58.576"}, {"2017/00/05-23:59:58.575601", 3, "2017-00-05 23:59:58.576"}, + {"1710-10:00", 0, "1710-10-00 00:00:00"}, + {"1710.10+00", 0, "1710-10-00 00:00:00"}, + {"2020-10:15", 0, "2020-10-15 00:00:00"}, + {"2020.09-10:15", 0, "2020-09-10 15:00:00"}, } for _, test := range fspTbl { @@ -149,11 +167,18 @@ func (s *testTimeSuite) TestDateTime(c *C) { "20170118.999", "2018-01", "2018.01", + "20170118-12:34", + "20170118-1234", + "170118-1234", + "170118-12", + "1710-10", + "1710-1000", } for _, test := range errTable { _, err := types.ParseDatetime(sc, test) - c.Assert(err, NotNil) + c.Assert(err != nil || sc.WarningCount() > 0, Equals, true) + sc.SetWarnings(nil) } } @@ -246,6 +271,7 @@ func (s *testTimeSuite) TestDate(c *C) { // extra separators {"2011-12--13", "2011-12-13"}, {"2011--12-13", "2011-12-13"}, + {"2011-12..13", "2011-12-13"}, {"2011----12----13", "2011-12-13"}, {"2011~/.12)_#13T T.12~)12[~12", "2011-12-13"}, // combinations @@ -467,7 +493,6 @@ func (s *testTimeSuite) TestTimeFsp(c *C) { Fsp int8 }{ {"00:00:00.1", -2}, - {"00:00:00.1", 7}, } for _, test := range errTable { @@ -614,7 +639,7 @@ func (s *testTimeSuite) TestParseTimeFromNum(c *C) { {2010101011, true, types.ZeroDatetimeStr, true, types.ZeroDatetimeStr, true, types.ZeroDateStr}, {201010101, false, "2000-02-01 01:01:01", false, "2000-02-01 01:01:01", false, "2000-02-01"}, {20101010, false, "2010-10-10 00:00:00", false, "2010-10-10 00:00:00", false, "2010-10-10"}, - {2010101, true, types.ZeroDatetimeStr, true, types.ZeroDatetimeStr, true, types.ZeroDateStr}, + {2010101, false, "0201-01-01 00:00:00", true, types.ZeroDatetimeStr, false, "0201-01-01"}, {201010, false, "2020-10-10 00:00:00", false, "2020-10-10 00:00:00", false, "2020-10-10"}, {20101, false, "2002-01-01 00:00:00", false, "2002-01-01 00:00:00", false, "2002-01-01"}, {2010, true, types.ZeroDatetimeStr, true, types.ZeroDatetimeStr, true, types.ZeroDateStr}, @@ -747,6 +772,39 @@ func (s *testTimeSuite) TestToNumber(c *C) { } } +func (s *testTimeSuite) TestParseTimeFromFloatString(c *C) { + sc := mock.NewContext().GetSessionVars().StmtCtx + sc.IgnoreZeroInDate = true + defer testleak.AfterTest(c)() + table := []struct { + Input string + Fsp int8 + ExpectError bool + Expect string + }{ + {"20170118.123", 3, false, "2017-01-18 00:00:00.000"}, + {"121231113045.123345", 6, false, "2012-12-31 11:30:45.123345"}, + {"20121231113045.123345", 6, false, "2012-12-31 11:30:45.123345"}, + {"121231113045.9999999", 6, false, "2012-12-31 11:30:46.000000"}, + {"170105084059.575601", 6, false, "2017-01-05 08:40:59.575601"}, + {"201705051315111.22", 2, true, "0000-00-00 00:00:00.00"}, + {"2011110859.1111", 4, true, "0000-00-00 00:00:00.0000"}, + {"2011110859.1111", 4, true, "0000-00-00 00:00:00.0000"}, + {"191203081.1111", 4, true, "0000-00-00 00:00:00.0000"}, + {"43128.121105", 6, true, "0000-00-00 00:00:00.000000"}, + } + + for _, test := range table { + t, err := types.ParseTimeFromFloatString(sc, test.Input, mysql.TypeDatetime, test.Fsp) + if test.ExpectError { + c.Assert(err, NotNil) + } else { + c.Assert(err, IsNil) + c.Assert(t.String(), Equals, test.Expect) + } + } +} + func (s *testTimeSuite) TestParseFrac(c *C) { defer testleak.AfterTest(c)() tbl := []struct { @@ -1017,7 +1075,7 @@ func (s *testTimeSuite) TestParseDateFormat(c *C) { {"2011-11-11 10:10:10", []string{"2011", "11", "11", "10", "10", "10"}}, {"xx2011-11-11 10:10:10", nil}, {"T10:10:10", nil}, - {"2011-11-11x", nil}, + {"2011-11-11x", []string{"2011", "11", "11x"}}, {"xxx 10:10:10", nil}, } @@ -1027,7 +1085,7 @@ func (s *testTimeSuite) TestParseDateFormat(c *C) { } } -func (s *testTimeSuite) TestTamestampDiff(c *C) { +func (s *testTimeSuite) TestTimestampDiff(c *C) { tests := []struct { unit string t1 types.CoreTime @@ -1081,7 +1139,8 @@ func (s *testTimeSuite) TestConvertTimeZone(c *C) { for _, test := range tests { t := types.NewTime(test.input, 0, 0) - t.ConvertTimeZone(test.from, test.to) + err := t.ConvertTimeZone(test.from, test.to) + c.Assert(err, IsNil) c.Assert(t.Compare(types.NewTime(test.expect, 0, 0)), Equals, 0) } } @@ -1360,6 +1419,11 @@ func (s *testTimeSuite) TestExtractDurationValue(c *C) { format: "-3020400", failed: true, }, + { + unit: "SECOND", + format: "50.-2", + ans: "00:00:50", + }, { unit: "MONTH", format: "1", @@ -1508,6 +1572,10 @@ func (s *testTimeSuite) TestExtractDurationNum(c *C) { {"HOUR_MICROSECOND", 31536}, {"HOUR_SECOND", 0}, {"HOUR_MINUTE", 0}, + {"DAY_MICROSECOND", 31536}, + {"DAY_SECOND", 0}, + {"DAY_MINUTE", 0}, + {"DAY_HOUR", 0}, } for _, col := range tbl { @@ -1830,10 +1898,136 @@ func (s *testTimeSuite) TestFromGoTime(c *C) { } +func (s *testTimeSuite) TestGetTimezone(c *C) { + cases := []struct { + input string + idx int + tzSign string + tzHour string + tzSep string + tzMinute string + }{ + {"2020-10-10T10:10:10Z", 19, "", "", "", ""}, + {"2020-10-10T10:10:10", -1, "", "", "", ""}, + {"2020-10-10T10:10:10-08", 19, "-", "08", "", ""}, + {"2020-10-10T10:10:10-0700", 19, "-", "07", "", "00"}, + {"2020-10-10T10:10:10+08:20", 19, "+", "08", ":", "20"}, + {"2020-10-10T10:10:10+08:10", 19, "+", "08", ":", "10"}, + {"2020-10-10T10:10:10+8:00", -1, "", "", "", ""}, + {"2020-10-10T10:10:10+082:10", -1, "", "", "", ""}, + {"2020-10-10T10:10:10+08:101", -1, "", "", "", ""}, + {"2020-10-10T10:10:10+T8:11", -1, "", "", "", ""}, + {"2020-09-06T05:49:13.293Z", 23, "", "", "", ""}, + {"2020-09-06T05:49:13.293", -1, "", "", "", ""}, + } + for ith, ca := range cases { + idx, tzSign, tzHour, tzSep, tzMinute := types.GetTimezone(ca.input) + c.Assert([5]interface{}{idx, tzSign, tzHour, tzSep, tzMinute}, Equals, [5]interface{}{ca.idx, ca.tzSign, ca.tzHour, ca.tzSep, ca.tzMinute}, Commentf("idx %d", ith)) + } +} + +func (s *testTimeSuite) TestParseWithTimezone(c *C) { + getTZ := func(tzSign string, tzHour, tzMinue int) *time.Location { + offset := tzHour*60*60 + tzMinue*60 + if tzSign == "-" { + offset = -offset + } + return time.FixedZone(fmt.Sprintf("UTC%s%02d:%02d", tzSign, tzHour, tzMinue), offset) + } + // lit is the string literal to be parsed, which contains timezone, and gt is the ground truth time + // in go's time.Time, while sysTZ is the system timezone where the string literal gets parsed. + // we first parse the string literal, and convert it into UTC and then compare it with the ground truth time in UTC. + // note that sysTZ won't affect the physical time the string literal represents. + cases := []struct { + lit string + fsp int8 + parseChecker Checker + gt time.Time + sysTZ *time.Location + }{ + { + "2006-01-02T15:04:05Z", + 0, + IsNil, + time.Date(2006, 1, 2, 15, 4, 5, 0, getTZ("+", 0, 0)), + getTZ("+", 0, 0), + }, + { + "2006-01-02T15:04:05Z", + 0, + IsNil, + time.Date(2006, 1, 2, 15, 4, 5, 0, getTZ("+", 0, 0)), + getTZ("+", 10, 0), + }, + { + "2020-10-21T16:05:10.50Z", + 2, + IsNil, + time.Date(2020, 10, 21, 16, 5, 10, 500*1000*1000, getTZ("+", 0, 0)), + getTZ("-", 10, 0), + }, + { + "2020-10-21T16:05:10.50+08", + 2, + IsNil, + time.Date(2020, 10, 21, 16, 5, 10, 500*1000*1000, getTZ("+", 8, 0)), + getTZ("-", 10, 0), + }, + { + "2020-10-21T16:05:10.50-0700", + 2, + IsNil, + time.Date(2020, 10, 21, 16, 5, 10, 500*1000*1000, getTZ("-", 7, 0)), + getTZ("-", 10, 0), + }, + { + "2020-10-21T16:05:10.50+09:00", + 2, + IsNil, + time.Date(2020, 10, 21, 16, 5, 10, 500*1000*1000, getTZ("+", 9, 0)), + getTZ("-", 10, 0), + }, + { + "2006-01-02T15:04:05+09:00", + 0, + IsNil, + time.Date(2006, 1, 2, 15, 4, 5, 0, getTZ("+", 9, 0)), + getTZ("+", 8, 0), + }, + { + "2006-01-02T15:04:05-02:00", + 0, + IsNil, + time.Date(2006, 1, 2, 15, 4, 5, 0, getTZ("-", 2, 0)), + getTZ("+", 3, 0), + }, + { + "2006-01-02T15:04:05-14:00", + 0, + IsNil, + time.Date(2006, 1, 2, 15, 4, 5, 0, getTZ("-", 14, 0)), + getTZ("+", 14, 0), + }, + } + for ith, ca := range cases { + t, err := types.ParseTime(&stmtctx.StatementContext{TimeZone: ca.sysTZ}, ca.lit, mysql.TypeTimestamp, ca.fsp) + c.Assert(err, ca.parseChecker, Commentf("tidb time parse misbehaved on %d", ith)) + if err != nil { + continue + } + t1, err := t.GoTime(ca.sysTZ) + c.Assert(err, IsNil, Commentf("tidb time convert failed on %d", ith)) + c.Assert(t1.In(time.UTC), Equals, ca.gt.In(time.UTC), Commentf("parsed time mismatch on %dth case", ith)) + } +} + func BenchmarkFormat(b *testing.B) { t1 := types.NewTime(types.FromGoTime(time.Now()), mysql.TypeTimestamp, 0) for i := 0; i < b.N; i++ { - t1.DateFormat("%Y-%m-%d %H:%i:%s") + _, err := t1.DateFormat("%Y-%m-%d %H:%i:%s") + if err != nil { + b.Fatal(err) + } } } @@ -1844,7 +2038,10 @@ func BenchmarkTimeAdd(b *testing.B) { arg1, _ := types.ParseTime(sc, "2017-01-18", mysql.TypeDatetime, types.MaxFsp) arg2, _ := types.ParseDuration(sc, "12:30:59", types.MaxFsp) for i := 0; i < b.N; i++ { - arg1.Add(sc, arg2) + _, err := arg1.Add(sc, arg2) + if err != nil { + b.Fatal(err) + } } } @@ -1900,12 +2097,19 @@ func BenchmarkParseDateFormat(b *testing.B) { benchmarkDateFormat(b, "datetime repeated delimiters", "2011---12---13 14::15::16..123456") } -func BenchmarkParseDatetime(b *testing.B) { - sc := &stmtctx.StatementContext{TimeZone: time.UTC} - str := "2011-10-10 11:11:11.123456" +func benchmarkDatetimeFormat(b *testing.B, name string, sc *stmtctx.StatementContext, str string) { + b.Run(name, func(b *testing.B) { + for i := 0; i < b.N; i++ { + _, err := types.ParseDatetime(sc, str) + if err != nil { + b.Fatal(err) + } + } + }) +} - b.ResetTimer() - for i := 0; i < b.N; i++ { - types.ParseDatetime(sc, str) - } +func BenchmarkParseDatetimeFormat(b *testing.B) { + sc := &stmtctx.StatementContext{TimeZone: time.UTC} + benchmarkDatetimeFormat(b, "datetime without timezone", sc, "2020-10-10T10:10:10") + benchmarkDatetimeFormat(b, "datetime with timezone", sc, "2020-10-10T10:10:10Z+08:00") } diff --git a/util/admin/admin.go b/util/admin/admin.go index a10045cc13b4d..20217a53c1b6d 100644 --- a/util/admin/admin.go +++ b/util/admin/admin.go @@ -16,15 +16,14 @@ package admin import ( "context" "encoding/json" - "fmt" "math" "sort" "time" "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" @@ -34,6 +33,7 @@ import ( "github.com/pingcap/tidb/tablecodec" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" decoder "github.com/pingcap/tidb/util/rowDecoder" "github.com/pingcap/tidb/util/sqlexec" @@ -43,7 +43,7 @@ import ( // DDLInfo is for DDL information. type DDLInfo struct { SchemaVer int64 - ReorgHandle kv.Handle // It's only used for DDL information. + ReorgHandle kv.Key // It's only used for DDL information. Jobs []*model.Job // It's the currently running jobs. } @@ -77,12 +77,7 @@ func GetDDLInfo(txn kv.Transaction) (*DDLInfo, error) { return info, nil } - tbl, err := t.GetTable(addIdxJob.SchemaID, addIdxJob.TableID) - if err != nil { - return info, nil - } - - _, info.ReorgHandle, _, _, err = t.GetDDLReorgHandle(addIdxJob, tbl.IsCommonHandle) + _, info.ReorgHandle, _, _, err = t.GetDDLReorgHandle(addIdxJob) if err != nil { if meta.ErrDDLReorgElementNotExist.Equal(err) { return info, nil @@ -295,13 +290,13 @@ type RecordData struct { Values []types.Datum } -func getCount(ctx sessionctx.Context, sql string) (int64, error) { - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQLWithSnapshot(sql) +func getCount(exec sqlexec.RestrictedSQLExecutor, stmt ast.StmtNode, snapshot uint64) (int64, error) { + rows, _, err := exec.ExecRestrictedStmt(context.Background(), stmt, sqlexec.ExecOptionWithSnapshot(snapshot)) if err != nil { return 0, errors.Trace(err) } if len(rows) != 1 { - return 0, errors.Errorf("can not get count, sql %s result rows %d", sql, len(rows)) + return 0, errors.Errorf("can not get count, rows count = %d", len(rows)) } return rows[0].GetInt64(0), nil } @@ -322,14 +317,34 @@ func CheckIndicesCount(ctx sessionctx.Context, dbName, tableName string, indices // Here we need check all indexes, includes invisible index ctx.GetSessionVars().OptimizerUseInvisibleIndexes = true // Add `` for some names like `table name`. - sql := fmt.Sprintf("SELECT COUNT(*) FROM `%s`.`%s` USE INDEX()", dbName, tableName) - tblCnt, err := getCount(ctx, sql) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.Background(), "SELECT COUNT(*) FROM %n.%n USE INDEX()", dbName, tableName) + if err != nil { + return 0, 0, errors.Trace(err) + } + + var snapshot uint64 + txn, err := ctx.Txn(false) + if err != nil { + return 0, 0, err + } + if txn.Valid() { + snapshot = txn.StartTS() + } + if ctx.GetSessionVars().SnapshotTS != 0 { + snapshot = ctx.GetSessionVars().SnapshotTS + } + + tblCnt, err := getCount(exec, stmt, snapshot) if err != nil { return 0, 0, errors.Trace(err) } for i, idx := range indices { - sql = fmt.Sprintf("SELECT COUNT(*) FROM `%s`.`%s` USE INDEX(`%s`)", dbName, tableName, idx) - idxCnt, err := getCount(ctx, sql) + stmt, err := exec.ParseWithParams(context.Background(), "SELECT COUNT(*) FROM %n.%n USE INDEX(%n)", dbName, tableName, idx) + if err != nil { + return 0, i, errors.Trace(err) + } + idxCnt, err := getCount(exec, stmt, snapshot) if err != nil { return 0, i, errors.Trace(err) } @@ -358,7 +373,7 @@ func CheckRecordAndIndex(sessCtx sessionctx.Context, txn kv.Transaction, t table cols[i] = t.Cols()[col.Offset] } - startKey := t.RecordKey(kv.IntHandle(math.MinInt64)) + startKey := tablecodec.EncodeRecordKey(t.RecordPrefix(), kv.IntHandle(math.MinInt64)) filterFunc := func(h1 kv.Handle, vals1 []types.Datum, cols []*table.Column) (bool, error) { for i, val := range vals1 { col := cols[i] @@ -454,7 +469,7 @@ func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Tab return errors.Trace(err) } - rk := t.RecordKey(handle) + rk := tablecodec.EncodeRecordKey(t.RecordPrefix(), handle) err = kv.NextUntil(it, util.RowKeyPrefixFilter(rk)) if err != nil { return errors.Trace(err) @@ -466,13 +481,13 @@ func iterRecords(sessCtx sessionctx.Context, retriever kv.Retriever, t table.Tab var ( // ErrDataInConsistent indicate that meets inconsistent data. - ErrDataInConsistent = terror.ClassAdmin.New(errno.ErrDataInConsistent, errno.MySQLErrName[errno.ErrDataInConsistent]) + ErrDataInConsistent = dbterror.ClassAdmin.NewStd(errno.ErrDataInConsistent) // ErrDDLJobNotFound indicates the job id was not found. - ErrDDLJobNotFound = terror.ClassAdmin.New(errno.ErrDDLJobNotFound, errno.MySQLErrName[errno.ErrDDLJobNotFound]) + ErrDDLJobNotFound = dbterror.ClassAdmin.NewStd(errno.ErrDDLJobNotFound) // ErrCancelFinishedDDLJob returns when cancel a finished ddl job. - ErrCancelFinishedDDLJob = terror.ClassAdmin.New(errno.ErrCancelFinishedDDLJob, errno.MySQLErrName[errno.ErrCancelFinishedDDLJob]) + ErrCancelFinishedDDLJob = dbterror.ClassAdmin.NewStd(errno.ErrCancelFinishedDDLJob) // ErrCannotCancelDDLJob returns when cancel a almost finished ddl job, because cancel in now may cause data inconsistency. - ErrCannotCancelDDLJob = terror.ClassAdmin.New(errno.ErrCannotCancelDDLJob, errno.MySQLErrName[errno.ErrCannotCancelDDLJob]) + ErrCannotCancelDDLJob = dbterror.ClassAdmin.NewStd(errno.ErrCannotCancelDDLJob) // ErrAdminCheckTable returns when the table records is inconsistent with the index values. - ErrAdminCheckTable = terror.ClassAdmin.New(errno.ErrAdminCheckTable, errno.MySQLErrName[errno.ErrAdminCheckTable]) + ErrAdminCheckTable = dbterror.ClassAdmin.NewStd(errno.ErrAdminCheckTable) ) diff --git a/util/admin/admin_integration_test.go b/util/admin/admin_integration_test.go index 989aa3df71a61..586f865b26387 100644 --- a/util/admin/admin_integration_test.go +++ b/util/admin/admin_integration_test.go @@ -21,7 +21,7 @@ import ( "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/session" "github.com/pingcap/tidb/store/mockstore" - "github.com/pingcap/tidb/store/mockstore/cluster" + "github.com/pingcap/tidb/store/tikv/mockstore/cluster" "github.com/pingcap/tidb/util/testkit" ) @@ -109,7 +109,7 @@ func (s *testAdminSuite) TestAdminCheckTableClusterIndex(c *C) { tk.MustExec("create database admin_check_table_clustered_index;") tk.MustExec("use admin_check_table_clustered_index;") - tk.MustExec("set @@tidb_enable_clustered_index = 1;") + tk.Se.GetSessionVars().EnableClusteredIndex = true tk.MustExec("create table t (a bigint, b varchar(255), c int, primary key (a, b), index idx_0(a, b), index idx_1(b, c));") tk.MustExec("insert into t values (1, '1', 1);") diff --git a/util/admin/admin_test.go b/util/admin/admin_test.go index 86ac87a4a454b..fa7f4316173b4 100644 --- a/util/admin/admin_test.go +++ b/util/admin/admin_test.go @@ -20,6 +20,7 @@ import ( "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/meta" "github.com/pingcap/tidb/store/mockstore" @@ -29,6 +30,10 @@ import ( ) func TestT(t *testing.T) { + config.UpdateGlobal(func(conf *config.Config) { + conf.TiKVClient.AsyncCommit.SafeWindow = 0 + conf.TiKVClient.AsyncCommit.AllowedClockDrift = 0 + }) CustomVerboseFlag = true TestingT(t) } @@ -81,7 +86,7 @@ func (s *testSuite) TestGetDDLInfo(c *C) { c.Assert(err, IsNil) c.Assert(info.Jobs, HasLen, 1) c.Assert(info.Jobs[0], DeepEquals, job) - c.Assert(info.ReorgHandle, Equals, nil) + c.Assert(info.ReorgHandle, IsNil) // Two jobs. t = meta.NewMeta(txn, meta.AddIndexJobListKey) err = t.EnQueueDDLJob(job1) @@ -91,7 +96,7 @@ func (s *testSuite) TestGetDDLInfo(c *C) { c.Assert(info.Jobs, HasLen, 2) c.Assert(info.Jobs[0], DeepEquals, job) c.Assert(info.Jobs[1], DeepEquals, job1) - c.Assert(info.ReorgHandle, Equals, nil) + c.Assert(info.ReorgHandle, IsNil) err = txn.Rollback() c.Assert(err, IsNil) } diff --git a/util/chunk/chunk.go b/util/chunk/chunk.go index 304d9d6c95202..a4350bd9628e3 100644 --- a/util/chunk/chunk.go +++ b/util/chunk/chunk.go @@ -706,3 +706,22 @@ func (c *Chunk) ToString(ft []*types.FieldType) string { } return string(buf) } + +// AppendRows appends multiple rows to the chunk. +func (c *Chunk) AppendRows(rows []Row) { + c.AppendPartialRows(0, rows) + c.numVirtualRows += len(rows) +} + +// AppendPartialRows appends multiple rows to the chunk. +func (c *Chunk) AppendPartialRows(colOff int, rows []Row) { + columns := c.columns[colOff:] + for i, dstCol := range columns { + for _, srcRow := range rows { + if i == 0 { + c.appendSel(colOff) + } + appendCellByCell(dstCol, srcRow.c.columns[i], srcRow.idx) + } + } +} diff --git a/util/chunk/chunk_test.go b/util/chunk/chunk_test.go index 7bd09ca1e02e7..67222328794db 100644 --- a/util/chunk/chunk_test.go +++ b/util/chunk/chunk_test.go @@ -560,7 +560,7 @@ func (s *testChunkSuite) TestChunkMemoryUsage(c *check.C) { initCap := 10 chk := NewChunkWithCapacity(fieldTypes, initCap) - //cap(c.nullBitmap) + cap(c.offsets)*8 + cap(c.data) + cap(c.elemBuf) + // cap(c.nullBitmap) + cap(c.offsets)*8 + cap(c.data) + cap(c.elemBuf) colUsage := make([]int, len(fieldTypes)) colUsage[0] = (initCap+7)>>3 + 0 + initCap*4 + 4 colUsage[1] = (initCap+7)>>3 + (initCap+1)*8 + initCap*8 + 0 @@ -631,22 +631,28 @@ func (s *testChunkSuite) TestSwapColumn(c *check.C) { c.Assert(chk2.columns[0] == chk2.columns[1], check.IsTrue) } - chk1.SwapColumn(0, chk2, 0) + err := chk1.SwapColumn(0, chk2, 0) + c.Assert(err, check.IsNil) checkRef() - chk1.SwapColumn(0, chk2, 1) + err = chk1.SwapColumn(0, chk2, 1) + c.Assert(err, check.IsNil) checkRef() - chk2.SwapColumn(1, chk2, 0) + err = chk2.SwapColumn(1, chk2, 0) + c.Assert(err, check.IsNil) checkRef() - chk2.SwapColumn(1, chk2, 1) + err = chk2.SwapColumn(1, chk2, 1) + c.Assert(err, check.IsNil) checkRef() - chk2.SwapColumn(1, chk2, 2) + err = chk2.SwapColumn(1, chk2, 2) + c.Assert(err, check.IsNil) checkRef() - chk2.SwapColumn(2, chk2, 0) + err = chk2.SwapColumn(2, chk2, 0) + c.Assert(err, check.IsNil) checkRef() } @@ -779,8 +785,10 @@ func (s *testChunkSuite) TestMakeRefTo(c *check.C) { chk1.AppendFloat32(1, 3) chk2 := NewChunkWithCapacity(fieldTypes, 1) - chk2.MakeRefTo(0, chk1, 1) - chk2.MakeRefTo(1, chk1, 0) + err := chk2.MakeRefTo(0, chk1, 1) + c.Assert(err, check.IsNil) + err = chk2.MakeRefTo(1, chk1, 0) + c.Assert(err, check.IsNil) c.Assert(chk2.columns[0] == chk1.columns[1], check.IsTrue) c.Assert(chk2.columns[1] == chk1.columns[0], check.IsTrue) @@ -1083,3 +1091,91 @@ func benchmarkChunkGrow(t benchChunkGrowCase) func(b *testing.B) { } } } + +func (s *testChunkSuite) TestAppendRows(c *check.C) { + numCols := 6 + numRows := 10 + chk := newChunk(8, 8, 0, 0, 40, 0) + strFmt := "%d.12345" + for i := 0; i < numRows; i++ { + chk.AppendNull(0) + chk.AppendInt64(1, int64(i)) + str := fmt.Sprintf(strFmt, i) + chk.AppendString(2, str) + chk.AppendBytes(3, []byte(str)) + chk.AppendMyDecimal(4, types.NewDecFromStringForTest(str)) + chk.AppendJSON(5, json.CreateBinary(str)) + } + c.Assert(chk.NumCols(), check.Equals, numCols) + c.Assert(chk.NumRows(), check.Equals, numRows) + + chk2 := newChunk(8, 8, 0, 0, 40, 0) + c.Assert(chk.NumCols(), check.Equals, numCols) + rows := make([]Row, numRows) + for i := 0; i < numRows; i++ { + rows[i] = chk.GetRow(i) + } + chk2.AppendRows(rows) + for i := 0; i < numRows; i++ { + row := chk2.GetRow(i) + c.Assert(row.GetInt64(0), check.Equals, int64(0)) + c.Assert(row.IsNull(0), check.IsTrue) + c.Assert(row.GetInt64(1), check.Equals, int64(i)) + str := fmt.Sprintf(strFmt, i) + c.Assert(row.IsNull(2), check.IsFalse) + c.Assert(row.GetString(2), check.Equals, str) + c.Assert(row.IsNull(3), check.IsFalse) + c.Assert(row.GetBytes(3), check.BytesEquals, []byte(str)) + c.Assert(row.IsNull(4), check.IsFalse) + c.Assert(row.GetMyDecimal(4).String(), check.Equals, str) + c.Assert(row.IsNull(5), check.IsFalse) + c.Assert(string(row.GetJSON(5).GetString()), check.Equals, str) + } +} + +func BenchmarkBatchAppendRows(b *testing.B) { + b.ReportAllocs() + numRows := 4096 + rowChk := newChunk(8, 8, 0, 0) + for i := 0; i < numRows; i++ { + rowChk.AppendNull(0) + rowChk.AppendInt64(1, 1) + rowChk.AppendString(2, "abcd") + rowChk.AppendBytes(3, []byte("abcd")) + } + chk := newChunk(8, 8, 0, 0) + type testCaseConf struct { + batchSize int + } + testCaseConfs := []testCaseConf{ + {batchSize: 10}, + {batchSize: 100}, + {batchSize: 500}, + {batchSize: 1000}, + {batchSize: 1500}, + {batchSize: 2000}, + {batchSize: 3000}, + {batchSize: 4000}, + } + for _, conf := range testCaseConfs { + b.Run(fmt.Sprintf("row-%d", conf.batchSize), func(b *testing.B) { + for i := 0; i < b.N; i++ { + chk.Reset() + for j := 0; j < conf.batchSize; j++ { + chk.AppendRow(rowChk.GetRow(j)) + } + } + }) + b.ResetTimer() + b.Run(fmt.Sprintf("column-%d", conf.batchSize), func(b *testing.B) { + rows := make([]Row, conf.batchSize) + for i := 0; i < conf.batchSize; i++ { + rows[i] = rowChk.GetRow(i) + } + for i := 0; i < b.N; i++ { + chk.Reset() + chk.AppendRows(rows) + } + }) + } +} diff --git a/util/chunk/chunk_util_test.go b/util/chunk/chunk_util_test.go index b8ca3f0b69b12..56fc64a1bd10f 100644 --- a/util/chunk/chunk_util_test.go +++ b/util/chunk/chunk_util_test.go @@ -61,7 +61,10 @@ func TestCopySelectedJoinRows(t *testing.T) { } // batch copy dstChk2 := newChunkWithInitCap(numRows, 0, 0, 8, 8, sizeTime, 0) - CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 3, 3, 3, selected, dstChk2) + _, err := CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 3, 3, 3, selected, dstChk2) + if err != nil { + t.Fatal(err) + } if !reflect.DeepEqual(dstChk, dstChk2) { t.Fatal() @@ -88,7 +91,10 @@ func TestCopySelectedJoinRowsWithoutSameOuters(t *testing.T) { } // batch copy dstChk2 := newChunkWithInitCap(numRows, 0, 0, 8, 8, sizeTime, 0) - CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 6, 0, 0, selected, dstChk2) + _, err := CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 6, 0, 0, selected, dstChk2) + if err != nil { + t.Fatal(err) + } if !reflect.DeepEqual(dstChk, dstChk2) { t.Fatal() @@ -115,7 +121,10 @@ func TestCopySelectedJoinRowsDirect(t *testing.T) { } // batch copy dstChk2 := newChunkWithInitCap(numRows, 0, 0, 8, 8, sizeTime, 0) - CopySelectedJoinRowsDirect(srcChk, selected, dstChk2) + _, err := CopySelectedJoinRowsDirect(srcChk, selected, dstChk2) + if err != nil { + t.Fatal(err) + } if !reflect.DeepEqual(dstChk, dstChk2) { t.Fatal() @@ -195,7 +204,10 @@ func BenchmarkCopySelectedJoinRows(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { dstChk.Reset() - CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 3, 3, 3, selected, dstChk) + _, err := CopySelectedJoinRowsWithSameOuterRows(srcChk, 0, 3, 3, 3, selected, dstChk) + if err != nil { + b.Fatal(err) + } } } func BenchmarkCopySelectedJoinRowsDirect(b *testing.B) { @@ -204,7 +216,10 @@ func BenchmarkCopySelectedJoinRowsDirect(b *testing.B) { b.ResetTimer() for i := 0; i < b.N; i++ { dstChk.Reset() - CopySelectedJoinRowsDirect(srcChk, selected, dstChk) + _, err := CopySelectedJoinRowsDirect(srcChk, selected, dstChk) + if err != nil { + b.Fatal(err) + } } } func BenchmarkAppendSelectedRow(b *testing.B) { diff --git a/util/chunk/codec_test.go b/util/chunk/codec_test.go index bbf54464f1391..3e8f1322e92b2 100644 --- a/util/chunk/codec_test.go +++ b/util/chunk/codec_test.go @@ -15,7 +15,6 @@ package chunk import ( "fmt" - "runtime" "testing" "github.com/pingcap/check" @@ -29,10 +28,6 @@ var _ = check.Suite(&testCodecSuite{}) type testCodecSuite struct{} func (s *testCodecSuite) TestCodec(c *check.C) { - if runtime.Version() >= "go1.14" { - // TODO: fix https://github.com/pingcap/tidb/issues/15154 - c.Skip("cannot pass checkptr, TODO to fix https://github.com/pingcap/tidb/issues/15154") - } numCols := 6 numRows := 10 @@ -105,14 +100,13 @@ func BenchmarkEncodeChunk(b *testing.B) { numCols := 4 numRows := 1024 - chk := &Chunk{columns: make([]*Column, numCols)} + colTypes := make([]*types.FieldType, numCols) for i := 0; i < numCols; i++ { - chk.columns[i] = &Column{ - length: numRows, - nullBitmap: make([]byte, numRows/8+1), - data: make([]byte, numRows*8), + colTypes[i] = &types.FieldType{ + Tp: mysql.TypeLonglong, } } + chk := NewChunkWithCapacity(colTypes, numRows) codec := &Codec{} @@ -127,17 +121,12 @@ func BenchmarkDecode(b *testing.B) { numRows := 1024 colTypes := make([]*types.FieldType, numCols) - chk := &Chunk{columns: make([]*Column, numCols)} for i := 0; i < numCols; i++ { - chk.columns[i] = &Column{ - length: numRows, - nullBitmap: make([]byte, numRows/8+1), - data: make([]byte, numRows*8), - } colTypes[i] = &types.FieldType{ Tp: mysql.TypeLonglong, } } + chk := NewChunkWithCapacity(colTypes, numRows) codec := &Codec{colTypes} buffer := codec.Encode(chk) diff --git a/util/chunk/disk.go b/util/chunk/disk.go index e2d5bf90c0cd8..c7962c9aa9e9d 100644 --- a/util/chunk/disk.go +++ b/util/chunk/disk.go @@ -21,6 +21,7 @@ import ( "strconv" "sync" + errors2 "github.com/pingcap/errors" "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/config" "github.com/pingcap/tidb/types" @@ -68,7 +69,7 @@ func (l *ListInDisk) initDiskFile() (err error) { } l.disk, err = ioutil.TempFile(config.GetGlobalConfig().TempStoragePath, defaultChunkListInDiskPath+strconv.Itoa(l.diskTracker.Label())) if err != nil { - return + return errors2.Trace(err) } var underlying io.WriteCloser = l.disk if config.GetGlobalConfig().Security.SpilledFileEncryptionMethod != config.SpilledFileEncryptionMethodPlaintext { @@ -116,7 +117,7 @@ func (l *ListInDisk) flush() (err error) { // after calling l.w.Close, we need to reopen it before reading rows. l.disk, err = os.Open(l.disk.Name()) if err != nil { - return + return errors2.Trace(err) } } return diff --git a/util/chunk/list.go b/util/chunk/list.go index 4e7e9034df87d..85e47f21cdf90 100644 --- a/util/chunk/list.go +++ b/util/chunk/list.go @@ -14,12 +14,9 @@ package chunk import ( - "fmt" - "github.com/pingcap/errors" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/memory" - "github.com/pingcap/tidb/util/stringutil" ) // List holds a slice of chunks, use to append rows with max chunk size properly handled. @@ -42,8 +39,6 @@ type RowPtr struct { RowIdx uint32 } -var chunkListLabel fmt.Stringer = stringutil.StringerStr("chunk.List") - // NewList creates a new List with field types, init chunk size and max chunk size. func NewList(fieldTypes []*types.FieldType, initChunkSize, maxChunkSize int) *List { l := &List{ diff --git a/util/chunk/pool_test.go b/util/chunk/pool_test.go index e30f3bd6b256c..0cdc34a2ab96f 100644 --- a/util/chunk/pool_test.go +++ b/util/chunk/pool_test.go @@ -46,8 +46,8 @@ func (s *poolTestSuite) TestPoolGetChunk(c *check.C) { {Tp: mysql.TypeNewDecimal}, {Tp: mysql.TypeDouble}, {Tp: mysql.TypeLonglong}, - //{Tp: mysql.TypeTimestamp}, - //{Tp: mysql.TypeDatetime}, + // {Tp: mysql.TypeTimestamp}, + // {Tp: mysql.TypeDatetime}, } chk := pool.GetChunk(fieldTypes) @@ -59,15 +59,15 @@ func (s *poolTestSuite) TestPoolGetChunk(c *check.C) { c.Assert(len(chk.columns[3].elemBuf), check.Equals, getFixedLen(fieldTypes[3])) c.Assert(len(chk.columns[4].elemBuf), check.Equals, getFixedLen(fieldTypes[4])) c.Assert(len(chk.columns[5].elemBuf), check.Equals, getFixedLen(fieldTypes[5])) - //c.Assert(len(chk.columns[6].elemBuf), check.Equals, getFixedLen(fieldTypes[6])) - //c.Assert(len(chk.columns[7].elemBuf), check.Equals, getFixedLen(fieldTypes[7])) + // c.Assert(len(chk.columns[6].elemBuf), check.Equals, getFixedLen(fieldTypes[6])) + // c.Assert(len(chk.columns[7].elemBuf), check.Equals, getFixedLen(fieldTypes[7])) c.Assert(cap(chk.columns[2].data), check.Equals, initCap*getFixedLen(fieldTypes[2])) c.Assert(cap(chk.columns[3].data), check.Equals, initCap*getFixedLen(fieldTypes[3])) c.Assert(cap(chk.columns[4].data), check.Equals, initCap*getFixedLen(fieldTypes[4])) c.Assert(cap(chk.columns[5].data), check.Equals, initCap*getFixedLen(fieldTypes[5])) - //c.Assert(cap(chk.columns[6].data), check.Equals, initCap*getFixedLen(fieldTypes[6])) - //c.Assert(cap(chk.columns[7].data), check.Equals, initCap*getFixedLen(fieldTypes[7])) + // c.Assert(cap(chk.columns[6].data), check.Equals, initCap*getFixedLen(fieldTypes[6])) + // c.Assert(cap(chk.columns[7].data), check.Equals, initCap*getFixedLen(fieldTypes[7])) } func (s *poolTestSuite) TestPoolPutChunk(c *check.C) { diff --git a/util/chunk/row.go b/util/chunk/row.go index 993ec9b58b9d1..0951de6803900 100644 --- a/util/chunk/row.go +++ b/util/chunk/row.go @@ -148,14 +148,10 @@ func (r Row) GetDatum(colIdx int, tp *types.FieldType) types.Datum { if !r.IsNull(colIdx) { d.SetFloat64(r.GetFloat64(colIdx)) } - case mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeString: + case mysql.TypeVarchar, mysql.TypeVarString, mysql.TypeString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: if !r.IsNull(colIdx) { d.SetString(r.GetString(colIdx), tp.Collate) } - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - if !r.IsNull(colIdx) { - d.SetBytes(r.GetBytes(colIdx)) - } case mysql.TypeDate, mysql.TypeDatetime, mysql.TypeTimestamp: if !r.IsNull(colIdx) { d.SetMysqlTime(r.GetTime(colIdx)) diff --git a/util/chunk/row_container.go b/util/chunk/row_container.go index 6ff4d4300ff99..475e3110949ed 100644 --- a/util/chunk/row_container.go +++ b/util/chunk/row_container.go @@ -259,11 +259,11 @@ func (c *RowContainer) ActionSpillForTest() *SpillDiskAction { // the memory quota of a query is exceeded, SpillDiskAction.Action is // triggered. type SpillDiskAction struct { - c *RowContainer - fallbackAction memory.ActionOnExceed - m sync.Mutex - once sync.Once - cond spillStatusCond + memory.BaseOOMAction + c *RowContainer + m sync.Mutex + once sync.Once + cond spillStatusCond // test function only used for test sync. testSyncInputFunc func() @@ -333,8 +333,8 @@ func (a *SpillDiskAction) Action(t *memory.Tracker) { if !t.CheckExceed() { return } - if a.fallbackAction != nil { - a.fallbackAction.Action(t) + if fallback := a.GetFallback(); fallback != nil { + fallback.Action(t) } } @@ -346,14 +346,14 @@ func (a *SpillDiskAction) Reset() { a.once = sync.Once{} } -// SetFallback sets the fallback action. -func (a *SpillDiskAction) SetFallback(fallback memory.ActionOnExceed) { - a.fallbackAction = fallback -} - // SetLogHook sets the hook, it does nothing just to form the memory.ActionOnExceed interface. func (a *SpillDiskAction) SetLogHook(hook func(uint64)) {} +// GetPriority get the priority of the Action. +func (a *SpillDiskAction) GetPriority() int64 { + return memory.DefSpillPriority +} + // WaitForTest waits all goroutine have gone. func (a *SpillDiskAction) WaitForTest() { a.testWg.Wait() @@ -528,16 +528,11 @@ func (a *SortAndSpillDiskAction) Action(t *memory.Tracker) { if !t.CheckExceed() { return } - if a.fallbackAction != nil { - a.fallbackAction.Action(t) + if fallback := a.GetFallback(); fallback != nil { + fallback.Action(t) } } -// SetFallback sets the fallback action. -func (a *SortAndSpillDiskAction) SetFallback(fallback memory.ActionOnExceed) { - a.fallbackAction = fallback -} - // SetLogHook sets the hook, it does nothing just to form the memory.ActionOnExceed interface. func (a *SortAndSpillDiskAction) SetLogHook(hook func(uint64)) {} diff --git a/util/codec/bench_test.go b/util/codec/bench_test.go index 0dd8d2d05b5d3..6e6034f73760c 100644 --- a/util/codec/bench_test.go +++ b/util/codec/bench_test.go @@ -37,7 +37,10 @@ func BenchmarkDecodeWithSize(b *testing.B) { bs := composeEncodedData(valueCnt) b.StartTimer() for i := 0; i < b.N; i++ { - Decode(bs, valueCnt) + _, err := Decode(bs, valueCnt) + if err != nil { + b.Fatal(err) + } } } @@ -46,7 +49,10 @@ func BenchmarkDecodeWithOutSize(b *testing.B) { bs := composeEncodedData(valueCnt) b.StartTimer() for i := 0; i < b.N; i++ { - Decode(bs, 1) + _, err := Decode(bs, 1) + if err != nil { + b.Fatal(err) + } } } @@ -65,12 +71,18 @@ func BenchmarkEncodeIntWithOutSize(b *testing.B) { func BenchmarkDecodeDecimal(b *testing.B) { dec := &types.MyDecimal{} - dec.FromFloat64(1211.1211113) + err := dec.FromFloat64(1211.1211113) + if err != nil { + b.Fatal(err) + } precision, frac := dec.PrecisionAndFrac() raw, _ := EncodeDecimal([]byte{}, dec, precision, frac) b.ResetTimer() for i := 0; i < b.N; i++ { - DecodeDecimal(raw) + _, _, _, _, err := DecodeDecimal(raw) + if err != nil { + b.Fatal(err) + } } } @@ -84,6 +96,9 @@ func BenchmarkDecodeOneToChunk(b *testing.B) { b.ResetTimer() decoder := NewDecoder(chunk.New([]*types.FieldType{intType}, 32, 32), nil) for i := 0; i < b.N; i++ { - decoder.DecodeOne(raw, 0, intType) + _, err := decoder.DecodeOne(raw, 0, intType) + if err != nil { + b.Fatal(err) + } } } diff --git a/util/codec/codec.go b/util/codec/codec.go index 38a99b53b85dc..9b5e6b82a808d 100644 --- a/util/codec/codec.go +++ b/util/codec/codec.go @@ -359,13 +359,19 @@ func encodeHashChunkRowIdx(sc *stmtctx.StatementContext, row chunk.Row, tp *type case mysql.TypeEnum: flag = compactBytesFlag v := uint64(row.GetEnum(idx).ToNumber()) - str := tp.Elems[v-1] + str := "" + if enum, err := types.ParseEnumValue(tp.Elems, v); err == nil { + // str will be empty string if v out of definition of enum. + str = enum.Name + } b = ConvertByCollation(hack.Slice(str), tp) case mysql.TypeSet: flag = compactBytesFlag - v := uint64(row.GetSet(idx).ToNumber()) - str := tp.Elems[v-1] - b = ConvertByCollation(hack.Slice(str), tp) + s, err := types.ParseSetValue(tp.Elems, row.GetSet(idx).Value) + if err != nil { + return 0, nil, err + } + b = ConvertByCollation(hack.Slice(s.Name), tp) case mysql.TypeBit: // We don't need to handle errors here since the literal is ensured to be able to store in uint64 in convertToMysqlBit. flag = uvarintFlag @@ -569,7 +575,11 @@ func HashChunkSelected(sc *stmtctx.StatementContext, h []hash.Hash64, chk *chunk } else { buf[0] = compactBytesFlag v := uint64(column.GetEnum(i).ToNumber()) - str := tp.Elems[v-1] + str := "" + if enum, err := types.ParseEnumValue(tp.Elems, v); err == nil { + // str will be empty string if v out of definition of enum. + str = enum.Name + } b = ConvertByCollation(hack.Slice(str), tp) } @@ -588,9 +598,11 @@ func HashChunkSelected(sc *stmtctx.StatementContext, h []hash.Hash64, chk *chunk isNull[i] = !ignoreNull } else { buf[0] = compactBytesFlag - v := uint64(column.GetSet(i).ToNumber()) - str := tp.Elems[v-1] - b = ConvertByCollation(hack.Slice(str), tp) + s, err := types.ParseSetValue(tp.Elems, column.GetSet(i).Value) + if err != nil { + return err + } + b = ConvertByCollation(hack.Slice(s.Name), tp) } // As the golang doc described, `Hash.Write` never returns an error. @@ -744,7 +756,8 @@ func DecodeRange(b []byte, size int, idxColumnTypes []byte, loc *time.Location) if i >= len(idxColumnTypes) { return values, b, errors.New("invalid length of index's columns") } - if idxColumnTypes[i] == mysql.TypeDatetime || idxColumnTypes[i] == mysql.TypeTimestamp || idxColumnTypes[i] == mysql.TypeDate { + if types.IsTypeTime(idxColumnTypes[i]) { + // handle datetime values specially since they are encoded to int and we'll get int values if using DecodeOne. b, d, err = DecodeAsDateTime(b, idxColumnTypes[i], loc) } else { b, d, err = DecodeOne(b) @@ -917,6 +930,7 @@ func SetRawValues(data []byte, values []types.Datum) error { // peek peeks the first encoded value from b and returns its length. func peek(b []byte) (length int, err error) { + originLength := len(b) if len(b) < 1 { return 0, errors.New("invalid encoded key") } @@ -948,6 +962,10 @@ func peek(b []byte) (length int, err error) { return 0, errors.Trace(err) } length += l + if length > originLength { + return 0, errors.Errorf("invalid encoded key, "+ + "expected length: %d, actual length: %d", length, originLength) + } return } @@ -1245,9 +1263,7 @@ func HashGroupKey(sc *stmtctx.StatementContext, n int, col *chunk.Column, buf [] buf[i] = append(buf[i], NilFlag) } else { buf[i] = append(buf[i], jsonFlag) - j := col.GetJSON(i) - buf[i] = append(buf[i], j.TypeCode) - buf[i] = append(buf[i], j.Value...) + buf[i] = col.GetJSON(i).HashValue(buf[i]) } } case types.ETString: diff --git a/util/codec/codec_test.go b/util/codec/codec_test.go index eb0fff931be78..6863a7a5a0902 100644 --- a/util/codec/codec_test.go +++ b/util/codec/codec_test.go @@ -565,7 +565,8 @@ func (s *testCodecSuite) TestTime(c *C) { c.Assert(err, IsNil) var t types.Time t.SetType(mysql.TypeDatetime) - t.FromPackedUint(v[0].GetUint64()) + err = t.FromPackedUint(v[0].GetUint64()) + c.Assert(err, IsNil) c.Assert(types.NewDatum(t), DeepEquals, m) } @@ -927,6 +928,15 @@ func (s *testCodecSuite) TestCut(c *C) { c.Assert(n, Equals, int64(42)) } +func (s *testCodecSuite) TestCutOneError(c *C) { + var b []byte + _, _, err := CutOne(b) + c.Assert(err, ErrorMatches, "invalid encoded key") + b = []byte{4 /* codec.uintFlag */, 0, 0, 0} + _, _, err = CutOne(b) + c.Assert(err, ErrorMatches, "invalid encoded key.*") +} + func (s *testCodecSuite) TestSetRawValues(c *C) { sc := &stmtctx.StatementContext{TimeZone: time.Local} datums := types.MakeDatums(1, "abc", 1.1, []byte("def")) @@ -1034,6 +1044,7 @@ func datumsForTest(sc *stmtctx.StatementContext) ([]types.Datum, []*types.FieldT {types.Duration{Duration: time.Second, Fsp: 1}, types.NewFieldType(mysql.TypeDuration)}, {types.Enum{Name: "a", Value: 1}, &types.FieldType{Tp: mysql.TypeEnum, Elems: []string{"a"}}}, {types.Set{Name: "a", Value: 1}, &types.FieldType{Tp: mysql.TypeSet, Elems: []string{"a"}}}, + {types.Set{Name: "f", Value: 32}, &types.FieldType{Tp: mysql.TypeSet, Elems: []string{"a", "b", "c", "d", "e", "f"}}}, {types.BinaryLiteral{100}, &types.FieldType{Tp: mysql.TypeBit, Flen: 8}}, {json.CreateBinary("abc"), types.NewFieldType(mysql.TypeJSON)}, {int64(1), types.NewFieldType(mysql.TypeYear)}, diff --git a/util/codec/decimal.go b/util/codec/decimal.go index 54e649007b3e0..92cdb04f2f662 100644 --- a/util/codec/decimal.go +++ b/util/codec/decimal.go @@ -16,6 +16,7 @@ package codec import ( "github.com/pingcap/errors" "github.com/pingcap/failpoint" + "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/types" ) @@ -24,6 +25,9 @@ func EncodeDecimal(b []byte, dec *types.MyDecimal, precision, frac int) ([]byte, if precision == 0 { precision, frac = dec.PrecisionAndFrac() } + if frac > mysql.MaxDecimalScale { + frac = mysql.MaxDecimalScale + } b = append(b, byte(precision), byte(frac)) b, err := dec.WriteBin(precision, frac, b) return b, errors.Trace(err) diff --git a/util/collate/bin.go b/util/collate/bin.go index 3761c683530e5..637ef745248e5 100644 --- a/util/collate/bin.go +++ b/util/collate/bin.go @@ -55,7 +55,7 @@ func (bpc *binPaddingCollator) Pattern() WildcardPattern { } type binPattern struct { - patChars []byte + patChars []rune patTypes []byte } diff --git a/util/collate/collate.go b/util/collate/collate.go index dcb60e0ead7f5..86a599318b587 100644 --- a/util/collate/collate.go +++ b/util/collate/collate.go @@ -21,6 +21,7 @@ import ( "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -34,18 +35,26 @@ var ( binCollatorInstance = &binCollator{} // ErrUnsupportedCollation is returned when an unsupported collation is specified. - ErrUnsupportedCollation = terror.ClassDDL.New(mysql.ErrUnknownCollation, "Unsupported collation when new collation is enabled: '%-.64s'") + ErrUnsupportedCollation = dbterror.ClassDDL.NewStdErr(mysql.ErrUnknownCollation, mysql.Message("Unsupported collation when new collation is enabled: '%-.64s'", nil)) // ErrIllegalMixCollation is returned when illegal mix of collations. - ErrIllegalMixCollation = terror.ClassExpression.New(mysql.ErrCantAggregateNcollations, mysql.MySQLErrName[mysql.ErrCantAggregateNcollations]) + ErrIllegalMixCollation = dbterror.ClassExpression.NewStd(mysql.ErrCantAggregateNcollations) // ErrIllegalMix2Collation is returned when illegal mix of 2 collations. - ErrIllegalMix2Collation = terror.ClassExpression.New(mysql.ErrCantAggregate2collations, mysql.MySQLErrName[mysql.ErrCantAggregate2collations]) + ErrIllegalMix2Collation = dbterror.ClassExpression.NewStd(mysql.ErrCantAggregate2collations) // ErrIllegalMix3Collation is returned when illegal mix of 3 collations. - ErrIllegalMix3Collation = terror.ClassExpression.New(mysql.ErrCantAggregate3collations, mysql.MySQLErrName[mysql.ErrCantAggregate3collations]) + ErrIllegalMix3Collation = dbterror.ClassExpression.NewStd(mysql.ErrCantAggregate3collations) ) -// DefaultLen is set for datum if the string datum don't know its length. const ( + // DefaultLen is set for datum if the string datum don't know its length. DefaultLen = 0 + // first byte of a 2-byte encoding starts 110 and carries 5 bits of data + b2Mask = 0x1F // 0001 1111 + // first byte of a 3-byte encoding starts 1110 and carries 4 bits of data + b3Mask = 0x0F // 0000 1111 + // first byte of a 4-byte encoding starts 11110 and carries 3 bits of data + b4Mask = 0x07 // 0000 0111 + // non-first bytes start 10 and carry 6 bits of data + mbMask = 0x3F // 0011 1111 ) // Collator provides functionality for comparing strings for a given @@ -163,16 +172,25 @@ func GetCollatorByID(id int) Collator { // CollationID2Name return the collation name by the given id. // If the id is not found in the map, the default collation is returned. func CollationID2Name(id int32) string { - name, ok := mysql.Collations[uint8(id)] - if !ok { + collation, err := charset.GetCollationByID(int(id)) + if err != nil { // TODO(bb7133): fix repeating logs when the following code is uncommented. - //logutil.BgLogger().Warn( - // "Unable to get collation name from ID, use default collation instead.", - // zap.Int32("ID", id), - // zap.Stack("stack")) + // logutil.BgLogger().Warn( + // "Unable to get collation name from ID, use default collation instead.", + // zap.Int32("ID", id), + // zap.Stack("stack")) return mysql.DefaultCollationName } - return name + return collation.Name +} + +// CollationName2ID return the collation id by the given name. +// If the name is not found in the map, the default collation id is returned +func CollationName2ID(name string) int { + if coll, err := charset.GetCollationByName(name); err == nil { + return coll.ID + } + return mysql.DefaultCollationID } // GetCollationByName wraps charset.GetCollationByName, it checks the collation. @@ -220,32 +238,74 @@ func truncateTailingSpace(str string) string { return str } +func sign(i int) int { + if i < 0 { + return -1 + } else if i > 0 { + return 1 + } + return 0 +} + +// decode rune by hand +func decodeRune(s string, si int) (r rune, newIndex int) { + switch b := s[si]; { + case b < 0x80: + r = rune(b) + newIndex = si + 1 + case b < 0xE0: + r = rune(b&b2Mask)<<6 | + rune(s[1+si]&mbMask) + newIndex = si + 2 + case b < 0xF0: + r = rune(b&b3Mask)<<12 | + rune(s[si+1]&mbMask)<<6 | + rune(s[si+2]&mbMask) + newIndex = si + 3 + default: + r = rune(b&b4Mask)<<18 | + rune(s[si+1]&mbMask)<<12 | + rune(s[si+2]&mbMask)<<6 | + rune(s[si+3]&mbMask) + newIndex = si + 4 + } + return +} + // IsCICollation returns if the collation is case-sensitive func IsCICollation(collate string) bool { return collate == "utf8_general_ci" || collate == "utf8mb4_general_ci" || collate == "utf8_unicode_ci" || collate == "utf8mb4_unicode_ci" } +// IsBinCollation returns if the collation is 'xx_bin' +func IsBinCollation(collate string) bool { + return collate == "ascii_bin" || collate == "latin1_bin" || + collate == "utf8_bin" || collate == "utf8mb4_bin" +} + func init() { newCollatorMap = make(map[string]Collator) newCollatorIDMap = make(map[int]Collator) newCollatorMap["binary"] = &binCollator{} - newCollatorIDMap[int(mysql.CollationNames["binary"])] = &binCollator{} + newCollatorIDMap[CollationName2ID("binary")] = &binCollator{} newCollatorMap["ascii_bin"] = &binPaddingCollator{} - newCollatorIDMap[int(mysql.CollationNames["ascii_bin"])] = &binPaddingCollator{} + newCollatorIDMap[CollationName2ID("ascii_bin")] = &binPaddingCollator{} newCollatorMap["latin1_bin"] = &binPaddingCollator{} - newCollatorIDMap[int(mysql.CollationNames["latin1_bin"])] = &binPaddingCollator{} + newCollatorIDMap[CollationName2ID("latin1_bin")] = &binPaddingCollator{} newCollatorMap["utf8mb4_bin"] = &binPaddingCollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8mb4_bin"])] = &binPaddingCollator{} + newCollatorIDMap[CollationName2ID("utf8mb4_bin")] = &binPaddingCollator{} newCollatorMap["utf8_bin"] = &binPaddingCollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8_bin"])] = &binPaddingCollator{} + newCollatorIDMap[CollationName2ID("utf8_bin")] = &binPaddingCollator{} newCollatorMap["utf8mb4_general_ci"] = &generalCICollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8mb4_general_ci"])] = &generalCICollator{} + newCollatorIDMap[CollationName2ID("utf8mb4_general_ci")] = &generalCICollator{} newCollatorMap["utf8_general_ci"] = &generalCICollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8_general_ci"])] = &generalCICollator{} + newCollatorIDMap[CollationName2ID("utf8_general_ci")] = &generalCICollator{} newCollatorMap["utf8mb4_unicode_ci"] = &unicodeCICollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8mb4_unicode_ci"])] = &unicodeCICollator{} + newCollatorIDMap[CollationName2ID("utf8mb4_unicode_ci")] = &unicodeCICollator{} newCollatorMap["utf8_unicode_ci"] = &unicodeCICollator{} - newCollatorIDMap[int(mysql.CollationNames["utf8_unicode_ci"])] = &unicodeCICollator{} + newCollatorIDMap[CollationName2ID("utf8_unicode_ci")] = &unicodeCICollator{} + newCollatorMap["utf8mb4_zh_pinyin_tidb_as_cs"] = &zhPinyinTiDBASCSCollator{} + newCollatorIDMap[CollationName2ID("utf8mb4_zh_pinyin_tidb_as_cs")] = &zhPinyinTiDBASCSCollator{} } diff --git a/util/collate/collate_bench_test.go b/util/collate/collate_bench_test.go index 36dae660c4e35..9195019a07036 100644 --- a/util/collate/collate_bench_test.go +++ b/util/collate/collate_bench_test.go @@ -27,8 +27,7 @@ func compare(b *testing.B, collator Collator, length int) { b.ResetTimer() for i := 0; i < b.N; i++ { - if collator.Compare(s1, s2) != 0 { - } + collator.Compare(s1, s2) } } diff --git a/util/collate/collate_test.go b/util/collate/collate_test.go index f727cf000a87a..1da50af005ce8 100644 --- a/util/collate/collate_test.go +++ b/util/collate/collate_test.go @@ -126,7 +126,6 @@ func (s *testCollateSuite) TestGeneralCICollator(c *C) { {"Foo © bar 𝌆 baz ☃ qux", []byte{0x0, 0x46, 0x0, 0x4f, 0x0, 0x4f, 0x0, 0x20, 0x0, 0xa9, 0x0, 0x20, 0x0, 0x42, 0x0, 0x41, 0x0, 0x52, 0x0, 0x20, 0xff, 0xfd, 0x0, 0x20, 0x0, 0x42, 0x0, 0x41, 0x0, 0x5a, 0x0, 0x20, 0x26, 0x3, 0x0, 0x20, 0x0, 0x51, 0x0, 0x55, 0x0, 0x58}}, - {string([]byte{0x88, 0xe6}), []byte{0xff, 0xfd, 0xff, 0xfd}}, {"a ", []byte{0x0, 0x41}}, {"a", []byte{0x0, 0x41}}, } @@ -199,6 +198,7 @@ func (s *testCollateSuite) TestGetCollator(c *C) { c.Assert(GetCollator("utf8_general_ci"), FitsTypeOf, &generalCICollator{}) c.Assert(GetCollator("utf8mb4_unicode_ci"), FitsTypeOf, &unicodeCICollator{}) c.Assert(GetCollator("utf8_unicode_ci"), FitsTypeOf, &unicodeCICollator{}) + c.Assert(GetCollator("utf8mb4_zh_pinyin_tidb_as_cs"), FitsTypeOf, &zhPinyinTiDBASCSCollator{}) c.Assert(GetCollator("default_test"), FitsTypeOf, &binPaddingCollator{}) c.Assert(GetCollatorByID(63), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(46), FitsTypeOf, &binPaddingCollator{}) @@ -207,6 +207,7 @@ func (s *testCollateSuite) TestGetCollator(c *C) { c.Assert(GetCollatorByID(33), FitsTypeOf, &generalCICollator{}) c.Assert(GetCollatorByID(224), FitsTypeOf, &unicodeCICollator{}) c.Assert(GetCollatorByID(192), FitsTypeOf, &unicodeCICollator{}) + c.Assert(GetCollatorByID(2048), FitsTypeOf, &zhPinyinTiDBASCSCollator{}) c.Assert(GetCollatorByID(9999), FitsTypeOf, &binPaddingCollator{}) SetNewCollationEnabledForTest(false) @@ -217,6 +218,7 @@ func (s *testCollateSuite) TestGetCollator(c *C) { c.Assert(GetCollator("utf8_general_ci"), FitsTypeOf, &binCollator{}) c.Assert(GetCollator("utf8mb4_unicode_ci"), FitsTypeOf, &binCollator{}) c.Assert(GetCollator("utf8_unicode_ci"), FitsTypeOf, &binCollator{}) + c.Assert(GetCollator("utf8mb4_zh_pinyin_tidb_as_cs"), FitsTypeOf, &binCollator{}) c.Assert(GetCollator("default_test"), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(63), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(46), FitsTypeOf, &binCollator{}) @@ -225,5 +227,6 @@ func (s *testCollateSuite) TestGetCollator(c *C) { c.Assert(GetCollatorByID(33), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(224), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(192), FitsTypeOf, &binCollator{}) + c.Assert(GetCollatorByID(2048), FitsTypeOf, &binCollator{}) c.Assert(GetCollatorByID(9999), FitsTypeOf, &binCollator{}) } diff --git a/util/collate/general_ci.go b/util/collate/general_ci.go index 2adbb12e5f75d..bfa94148610d4 100644 --- a/util/collate/general_ci.go +++ b/util/collate/general_ci.go @@ -14,143 +14,28 @@ package collate import ( - "unicode/utf8" - "github.com/pingcap/tidb/util/stringutil" ) type generalCICollator struct { } -func sign(i int) int { - if i < 0 { - return -1 - } else if i > 0 { - return 1 - } - return 0 -} - -// compilePatternGeneralCI handles escapes and wild cards, generate pattern weights and types. -// This function is modified from stringutil.CompilePattern. -func compilePatternGeneralCI(pattern string, escape byte) (patWeights []uint16, patTypes []byte) { - runes := []rune(pattern) - escapeRune := rune(escape) - lenRunes := len(runes) - patWeights = make([]uint16, lenRunes) - patTypes = make([]byte, lenRunes) - patLen := 0 - for i := 0; i < lenRunes; i++ { - var tp byte - var r = runes[i] - switch r { - case escapeRune: - tp = stringutil.PatMatch - if i < lenRunes-1 { - i++ - r = runes[i] - if r == escapeRune || r == '_' || r == '%' { - // Valid escape. - } else { - // Invalid escape, fall back to escape byte. - // mysql will treat escape character as the origin value even - // the escape sequence is invalid in Go or C. - // e.g., \m is invalid in Go, but in MySQL we will get "m" for select '\m'. - // Following case is correct just for escape \, not for others like +. - // TODO: Add more checks for other escapes. - i-- - r = escapeRune - } - } - case '_': - // %_ => _% - if patLen > 0 && patTypes[patLen-1] == stringutil.PatAny { - tp = stringutil.PatAny - r = '%' - patWeights[patLen-1], patTypes[patLen-1] = '_', stringutil.PatOne - } else { - tp = stringutil.PatOne - } - case '%': - // %% => % - if patLen > 0 && patTypes[patLen-1] == stringutil.PatAny { - continue - } - tp = stringutil.PatAny - default: - tp = stringutil.PatMatch - } - patWeights[patLen] = convertRune(r) - patTypes[patLen] = tp - patLen++ - } - patWeights = patWeights[:patLen] - patTypes = patTypes[:patLen] - return -} - -// doMatchGeneralCI matches the string with patWeights and patTypes. -// The algorithm has linear time complexity. -// https://research.swtch.com/glob -// This function is modified from stringutil.DoMatch. -func doMatchGeneralCI(str string, patWeights []uint16, patTypes []byte) bool { - // TODO(bb7133): it is possible to get the rune one by one to avoid the cost of get them as a whole. - runes := []rune(str) - lenRunes := len(runes) - var rIdx, pIdx, nextRIdx, nextPIdx int - for pIdx < len(patWeights) || rIdx < lenRunes { - if pIdx < len(patWeights) { - switch patTypes[pIdx] { - case stringutil.PatMatch: - if rIdx < lenRunes && convertRune(runes[rIdx]) == patWeights[pIdx] { - pIdx++ - rIdx++ - continue - } - case stringutil.PatOne: - if rIdx < lenRunes { - pIdx++ - rIdx++ - continue - } - case stringutil.PatAny: - // Try to match at sIdx. - // If that doesn't work out, - // restart at sIdx+1 next. - nextPIdx = pIdx - nextRIdx = rIdx + 1 - pIdx++ - continue - } - } - // Mismatch. Maybe restart. - if 0 < nextRIdx && nextRIdx <= lenRunes { - pIdx = nextPIdx - rIdx = nextRIdx - continue - } - return false - } - // Matched all of pattern to all of name. Success. - return true -} - // Compare implements Collator interface. func (gc *generalCICollator) Compare(a, b string) int { a = truncateTailingSpace(a) b = truncateTailingSpace(b) - for len(a) > 0 && len(b) > 0 { - r1, r1size := utf8.DecodeRuneInString(a) - r2, r2size := utf8.DecodeRuneInString(b) + r1, r2 := rune(0), rune(0) + ai, bi := 0, 0 + for ai < len(a) && bi < len(b) { + r1, ai = decodeRune(a, ai) + r2, bi = decodeRune(b, bi) - cmp := int(convertRune(r1)) - int(convertRune(r2)) + cmp := int(convertRuneGeneralCI(r1)) - int(convertRuneGeneralCI(r2)) if cmp != 0 { return sign(cmp) } - a = a[r1size:] - b = b[r2size:] } - return sign(len(a) - len(b)) + return sign((len(a) - ai) - (len(b) - bi)) } // Key implements Collator interface. @@ -158,10 +43,11 @@ func (gc *generalCICollator) Key(str string) []byte { str = truncateTailingSpace(str) buf := make([]byte, 0, len(str)) i := 0 - for _, r := range []rune(str) { - u16 := convertRune(r) + r := rune(0) + for i < len(str) { + r, i = decodeRune(str, i) + u16 := convertRuneGeneralCI(r) buf = append(buf, byte(u16>>8), byte(u16)) - i++ } return buf } @@ -172,21 +58,23 @@ func (gc *generalCICollator) Pattern() WildcardPattern { } type ciPattern struct { - patChars []uint16 + patChars []rune patTypes []byte } // Compile implements WildcardPattern interface. func (p *ciPattern) Compile(patternStr string, escape byte) { - p.patChars, p.patTypes = compilePatternGeneralCI(patternStr, escape) + p.patChars, p.patTypes = stringutil.CompilePatternInner(patternStr, escape) } // Compile implements WildcardPattern interface. func (p *ciPattern) DoMatch(str string) bool { - return doMatchGeneralCI(str, p.patChars, p.patTypes) + return stringutil.DoMatchInner(str, p.patChars, p.patTypes, func(a, b rune) bool { + return convertRuneGeneralCI(a) == convertRuneGeneralCI(b) + }) } -func convertRune(r rune) uint16 { +func convertRuneGeneralCI(r rune) uint16 { if r > 0xFFFF { return 0xFFFD } diff --git a/util/collate/pinyin_tidb_as_cs.go b/util/collate/pinyin_tidb_as_cs.go new file mode 100644 index 0000000000000..565680e2cff56 --- /dev/null +++ b/util/collate/pinyin_tidb_as_cs.go @@ -0,0 +1,33 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package collate + +// Collation of utf8mb4_zh_pinyin_tidb_as_cs +type zhPinyinTiDBASCSCollator struct { +} + +// Collator interface, no implements now. +func (py *zhPinyinTiDBASCSCollator) Compare(a, b string) int { + panic("implement me") +} + +// Collator interface, no implements now. +func (py *zhPinyinTiDBASCSCollator) Key(str string) []byte { + panic("implement me") +} + +// Collator interface, no implements now. +func (py *zhPinyinTiDBASCSCollator) Pattern() WildcardPattern { + panic("implement me") +} diff --git a/util/collate/unicode_ci.go b/util/collate/unicode_ci.go index fd3d57799d9ee..aceffeafd9783 100644 --- a/util/collate/unicode_ci.go +++ b/util/collate/unicode_ci.go @@ -20,44 +20,8 @@ import ( const ( // magic number indicate weight has 2 uint64, should get from `longRuneMap` longRune uint64 = 0xFFFD - // first byte of a 2-byte encoding starts 110 and carries 5 bits of data - b2Mask = 0x1F // 0001 1111 - - // first byte of a 3-byte encoding starts 1110 and carries 4 bits of data - b3Mask = 0x0F // 0000 1111 - - // first byte of a 4-byte encoding starts 11110 and carries 3 bits of data - b4Mask = 0x07 // 0000 0111 - - // non-first bytes start 10 and carry 6 bits of data - mbMask = 0x3F // 0011 1111 ) -// decode rune by hand -func decodeRune(s string, si int) (r rune, newIndex int) { - switch b := s[si]; { - case b < 0x80: - r = rune(b) - newIndex = si + 1 - case b < 0xE0: - r = rune(b&b2Mask)<<6 | - rune(s[1+si]&mbMask) - newIndex = si + 2 - case b < 0xF0: - r = rune(b&b3Mask)<<12 | - rune(s[si+1]&mbMask)<<6 | - rune(s[si+2]&mbMask) - newIndex = si + 3 - default: - r = rune(b&b4Mask)<<18 | - rune(s[si+1]&mbMask)<<12 | - rune(s[si+2]&mbMask)<<6 | - rune(s[si+3]&mbMask) - newIndex = si + 4 - } - return -} - // unicodeCICollator implements UCA. see http://unicode.org/reports/tr10/ type unicodeCICollator struct { } @@ -78,7 +42,7 @@ func (uc *unicodeCICollator) Compare(a, b string) int { if as == 0 { for an == 0 && ai < len(a) { ar, ai = decodeRune(a, ai) - an, as = convertUnicode(ar) + an, as = convertRuneUnicodeCI(ar) } } else { an = as @@ -90,7 +54,7 @@ func (uc *unicodeCICollator) Compare(a, b string) int { if bs == 0 { for bn == 0 && bi < len(b) { br, bi = decodeRune(b, bi) - bn, bs = convertUnicode(br) + bn, bs = convertRuneUnicodeCI(br) } } else { bn = bs @@ -128,7 +92,7 @@ func (uc *unicodeCICollator) Key(str string) []byte { for si < len(str) { r, si = decodeRune(str, si) - sn, ss = convertUnicode(r) + sn, ss = convertRuneUnicodeCI(r) for sn != 0 { buf = append(buf, byte((sn&0xFF00)>>8), byte(sn)) sn >>= 16 @@ -144,7 +108,7 @@ func (uc *unicodeCICollator) Key(str string) []byte { // convert rune to weights. // `first` represent first 4 uint16 weights of rune // `second` represent last 4 uint16 weights of rune if exist, 0 if not -func convertUnicode(r rune) (first, second uint64) { +func convertRuneUnicodeCI(r rune) (first, second uint64) { if r > 0xFFFF { return 0xFFFD, 0 } @@ -166,131 +130,25 @@ type unicodePattern struct { // Compile implements WildcardPattern interface. func (p *unicodePattern) Compile(patternStr string, escape byte) { - p.patChars, p.patTypes = compilePatternUnicodeCI(patternStr, escape) + p.patChars, p.patTypes = stringutil.CompilePatternInner(patternStr, escape) } // DoMatch implements WildcardPattern interface. func (p *unicodePattern) DoMatch(str string) bool { - return doMatchUnicodeCI(str, p.patChars, p.patTypes) -} - -// compilePatternUnicodeCI handles escapes and wild cards, generate pattern weights and types. -// This function is modified from stringutil.CompilePattern. -func compilePatternUnicodeCI(pattern string, escape byte) (patWeights []rune, patTypes []byte) { - runes := []rune(pattern) - escapeRune := rune(escape) - lenRunes := len(runes) - patWeights = make([]rune, lenRunes) - patTypes = make([]byte, lenRunes) - patLen := 0 - for i := 0; i < lenRunes; i++ { - var tp byte - var r = runes[i] - switch r { - case escapeRune: - tp = stringutil.PatMatch - if i < lenRunes-1 { - i++ - r = runes[i] - if r == escapeRune || r == '_' || r == '%' { - // Valid escape. - } else { - // Invalid escape, fall back to escape byte. - // mysql will treat escape character as the origin value even - // the escape sequence is invalid in Go or C. - // e.g., \m is invalid in Go, but in MySQL we will get "m" for select '\m'. - // Following case is correct just for escape \, not for others like +. - // TODO: Add more checks for other escapes. - i-- - r = escapeRune - } - } - case '_': - // %_ => _% - if patLen > 0 && patTypes[patLen-1] == stringutil.PatAny { - tp = stringutil.PatAny - r = '%' - patWeights[patLen-1], patTypes[patLen-1] = '_', stringutil.PatOne - } else { - tp = stringutil.PatOne - } - case '%': - // %% => % - if patLen > 0 && patTypes[patLen-1] == stringutil.PatAny { - continue - } - tp = stringutil.PatAny - default: - tp = stringutil.PatMatch + return stringutil.DoMatchInner(str, p.patChars, p.patTypes, func(a, b rune) bool { + if a > 0xFFFF || b > 0xFFFF { + return a == b } - patWeights[patLen] = r - patTypes[patLen] = tp - patLen++ - } - patWeights = patWeights[:patLen] - patTypes = patTypes[:patLen] - return -} -// doMatchUnicodeCI matches the string with patWeights and patTypes. -// The algorithm has linear time complexity. -// https://research.swtch.com/glob -// This function is modified from stringutil.DoMatch. -func doMatchUnicodeCI(str string, patWeights []rune, patTypes []byte) bool { - runes := []rune(str) - lenRunes := len(runes) - var rIdx, pIdx, nextRIdx, nextPIdx int - for pIdx < len(patWeights) || rIdx < lenRunes { - if pIdx < len(patWeights) { - switch patTypes[pIdx] { - case stringutil.PatMatch: - if rIdx < lenRunes && runeEqual(runes[rIdx], patWeights[pIdx]) { - pIdx++ - rIdx++ - continue - } - case stringutil.PatOne: - if rIdx < lenRunes { - pIdx++ - rIdx++ - continue - } - case stringutil.PatAny: - // Try to match at sIdx. - // If that doesn't work out, - // restart at sIdx+1 next. - nextPIdx = pIdx - nextRIdx = rIdx + 1 - pIdx++ - continue - } + ar, br := mapTable[a], mapTable[b] + if ar != br { + return false } - // Mismatch. Maybe restart. - if 0 < nextRIdx && nextRIdx <= lenRunes { - pIdx = nextPIdx - rIdx = nextRIdx - continue - } - return false - } - // Matched all of pattern to all of name. Success. - return true -} - -// runeEqual compare rune is equal with unicode_ci collation -func runeEqual(a, b rune) bool { - if a > 0xFFFF || b > 0xFFFF { - return a == b - } - ar, br := mapTable[a], mapTable[b] - if ar != br { - return false - } - - if ar == longRune { - return a == b - } + if ar == longRune { + return a == b + } - return true + return true + }) } diff --git a/util/dbterror/terror.go b/util/dbterror/terror.go new file mode 100644 index 0000000000000..3f8918efa9ddf --- /dev/null +++ b/util/dbterror/terror.go @@ -0,0 +1,56 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package dbterror + +import ( + "github.com/pingcap/parser/terror" + "github.com/pingcap/tidb/errno" +) + +// ErrClass represents a class of errors. +type ErrClass struct{ terror.ErrClass } + +// Error classes. +var ( + ClassAutoid = ErrClass{terror.ClassAutoid} + ClassDDL = ErrClass{terror.ClassDDL} + ClassDomain = ErrClass{terror.ClassDomain} + ClassExecutor = ErrClass{terror.ClassExecutor} + ClassExpression = ErrClass{terror.ClassExpression} + ClassAdmin = ErrClass{terror.ClassAdmin} + ClassKV = ErrClass{terror.ClassKV} + ClassMeta = ErrClass{terror.ClassMeta} + ClassOptimizer = ErrClass{terror.ClassOptimizer} + ClassPrivilege = ErrClass{terror.ClassPrivilege} + ClassSchema = ErrClass{terror.ClassSchema} + ClassServer = ErrClass{terror.ClassServer} + ClassStructure = ErrClass{terror.ClassStructure} + ClassVariable = ErrClass{terror.ClassVariable} + ClassXEval = ErrClass{terror.ClassXEval} + ClassTable = ErrClass{terror.ClassTable} + ClassTypes = ErrClass{terror.ClassTypes} + ClassJSON = ErrClass{terror.ClassJSON} + ClassTiKV = ErrClass{terror.ClassTiKV} + ClassSession = ErrClass{terror.ClassSession} + ClassPlugin = ErrClass{terror.ClassPlugin} + ClassUtil = ErrClass{terror.ClassUtil} +) + +// NewStd calls New using the standard message for the error code +// Attention: +// this method is not goroutine-safe and +// usually be used in global variable initializer +func (ec ErrClass) NewStd(code terror.ErrCode) *terror.Error { + return ec.NewStdErr(code, errno.MySQLErrName[uint16(code)]) +} diff --git a/util/dbterror/terror_test.go b/util/dbterror/terror_test.go new file mode 100644 index 0000000000000..2f1c23506d70e --- /dev/null +++ b/util/dbterror/terror_test.go @@ -0,0 +1,90 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package dbterror + +import ( + "fmt" + "strings" + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/errors" + "github.com/pingcap/tidb/errno" +) + +func TestT(t *testing.T) { + TestingT(t) +} + +var _ = Suite(&testkSuite{}) + +type testkSuite struct{} + +func genErrMsg(pattern string, a ...interface{}) string { + return fmt.Sprintf(pattern, a...) +} + +func (s *testkSuite) TestErrorRedact(c *C) { + original := errors.RedactLogEnabled.Load() + errors.RedactLogEnabled.Store(true) + defer func() { errors.RedactLogEnabled.Store(original) }() + + class := ErrClass{} + + NoSensitiveValue := "no_sensitive" + SensitiveData := "sensitive_data" + QuestionMark := "?" + + err := class.NewStd(errno.ErrDupEntry).GenWithStackByArgs(SensitiveData, NoSensitiveValue) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDupEntry].Raw, QuestionMark, NoSensitiveValue)), IsTrue) + err = class.NewStd(errno.ErrCutValueGroupConcat).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrCutValueGroupConcat].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrDuplicatedValueInType).GenWithStackByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDuplicatedValueInType].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrTruncatedWrongValue).GenWithStackByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValue].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrInvalidCharacterString).FastGenByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidCharacterString].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrTruncatedWrongValueForField).FastGenByArgs(SensitiveData, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTruncatedWrongValueForField].Raw, QuestionMark, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrIllegalValueForType).FastGenByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIllegalValueForType].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + + err = class.NewStd(errno.ErrPartitionWrongValues).GenWithStackByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrPartitionWrongValues].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrNoParts).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoParts].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrWrongValue).GenWithStackByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWrongValue].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrNoPartitionForGivenValue).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrNoPartitionForGivenValue].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrDataOutOfRange).GenWithStackByArgs(NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrDataOutOfRange].Raw, NoSensitiveValue, QuestionMark)), IsTrue) + + err = class.NewStd(errno.ErrRowInWrongPartition).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowInWrongPartition].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrInvalidJSONText).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidJSONText].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrTxnRetryable).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, QuestionMark)), IsTrue) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrTxnRetryable].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrIncorrectDatetimeValue).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrIncorrectDatetimeValue].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrInvalidTimeFormat).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrInvalidTimeFormat].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrRowNotFound).GenWithStackByArgs(SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrRowNotFound].Raw, QuestionMark)), IsTrue) + err = class.NewStd(errno.ErrWriteConflict).GenWithStackByArgs(NoSensitiveValue, NoSensitiveValue, NoSensitiveValue, SensitiveData) + c.Assert(strings.Contains(err.Error(), genErrMsg(errno.MySQLErrName[errno.ErrWriteConflict].Raw, NoSensitiveValue, NoSensitiveValue, NoSensitiveValue, QuestionMark)), IsTrue) +} diff --git a/util/disk/tempDir.go b/util/disk/tempDir.go index 3c182c0311f67..2d42d21d82d39 100644 --- a/util/disk/tempDir.go +++ b/util/disk/tempDir.go @@ -32,6 +32,11 @@ var ( sf singleflight.Group ) +const ( + lockFile = "_dir.lock" + recordDir = "record" +) + // CheckAndInitTempDir check whether the temp directory is existed. // If not, initializes the temp directory. func CheckAndInitTempDir() (err error) { @@ -64,7 +69,6 @@ func InitializeTempDir() error { return err } } - lockFile := "_dir.lock" tempDirLock, err = fslock.Lock(filepath.Join(tempDir, lockFile)) if err != nil { switch err { @@ -83,11 +87,12 @@ func InitializeTempDir() error { } // If it exists others files except lock file, creates another goroutine to clean them. - if len(subDirs) > 1 { + if len(subDirs) > 2 { go func() { for _, subDir := range subDirs { // Do not remove the lock file. - if subDir.Name() == lockFile { + switch subDir.Name() { + case lockFile, recordDir: continue } err := os.RemoveAll(filepath.Join(tempDir, subDir.Name())) @@ -108,3 +113,15 @@ func CleanUp() { terror.Log(errors.Trace(err)) } } + +// CheckAndCreateDir check whether the directory is existed. If not, then create it. +func CheckAndCreateDir(path string) error { + _, err := os.Stat(path) + if err != nil && !os.IsExist(err) { + err = os.MkdirAll(path, 0755) + if err != nil { + return err + } + } + return nil +} diff --git a/util/disk/tempDir_test.go b/util/disk/tempDir_test.go index 5df72c9caabc5..019f122f22da8 100644 --- a/util/disk/tempDir_test.go +++ b/util/disk/tempDir_test.go @@ -14,6 +14,7 @@ package disk import ( + "io/ioutil" "os" "sync" "testing" @@ -23,6 +24,12 @@ import ( ) func TestT(t *testing.T) { + path, _ := ioutil.TempDir("", "tmp-storage-disk-pkg") + config.UpdateGlobal(func(conf *config.Config) { + conf.TempStoragePath = path + }) + _ = os.RemoveAll(path) // clean the uncleared temp file during the last run. + _ = os.MkdirAll(path, 0755) check.TestingT(t) } diff --git a/util/encrypt/aes_layer_test.go b/util/encrypt/aes_layer_test.go index e3287e3d422cb..4bee05f02546c 100644 --- a/util/encrypt/aes_layer_test.go +++ b/util/encrypt/aes_layer_test.go @@ -150,7 +150,10 @@ func benchmarkReadAtWithCase(b *testing.B, testCase readAtTestCase) { rBuf := make([]byte, 10) b.ResetTimer() for i := 0; i < b.N; i++ { - r.ReadAt(rBuf, int64(i%(n1+n2))) + _, err := r.ReadAt(rBuf, int64(i%(n1+n2))) + if err != nil { + b.Fatal(err) + } } } diff --git a/util/encrypt/crypt.go b/util/encrypt/crypt.go index 6b6b4c207b531..3531fada7c34f 100644 --- a/util/encrypt/crypt.go +++ b/util/encrypt/crypt.go @@ -106,7 +106,7 @@ func (sc *sqlCrypt) decode(str []byte, length int) { } } -//SQLDecode Function to handle the decode() function +// SQLDecode Function to handle the decode() function func SQLDecode(str string, password string) (string, error) { var sc sqlCrypt diff --git a/util/execdetails/execdetails.go b/util/execdetails/execdetails.go index 5b7c28e2d8909..322b639f3c6e5 100644 --- a/util/execdetails/execdetails.go +++ b/util/execdetails/execdetails.go @@ -16,6 +16,7 @@ package execdetails import ( "bytes" "fmt" + "math" "sort" "strconv" "strings" @@ -23,6 +24,8 @@ import ( "sync/atomic" "time" + "github.com/pingcap/kvproto/pkg/kvrpcpb" + "github.com/pingcap/tidb/util/memory" "github.com/pingcap/tipb/go-tipb" "go.uber.org/zap" ) @@ -42,17 +45,15 @@ var ( type ExecDetails struct { CalleeAddress string CopTime time.Duration - ProcessTime time.Duration - WaitTime time.Duration BackoffTime time.Duration LockKeysDuration time.Duration BackoffSleep map[string]time.Duration BackoffTimes map[string]int RequestCount int - TotalKeys int64 - ProcessedKeys int64 CommitDetail *CommitDetails LockKeysDetail *LockKeysDetails + ScanDetail *ScanDetail + TimeDetail TimeDetail } type stmtExecDetailKeyType struct{} @@ -168,6 +169,120 @@ func (ld *LockKeysDetails) Clone() *LockKeysDetails { return lock } +// TimeDetail contains coprocessor time detail information. +type TimeDetail struct { + // WaitWallTimeMs is the off-cpu wall time which is elapsed in TiKV side. Usually this includes queue waiting time and + // other kind of waitings in series. + ProcessTime time.Duration + // Off-cpu and on-cpu wall time elapsed to actually process the request payload. It does not + // include `wait_wall_time`. + // This field is very close to the CPU time in most cases. Some wait time spend in RocksDB + // cannot be excluded for now, like Mutex wait time, which is included in this field, so that + // this field is called wall time instead of CPU time. + WaitTime time.Duration +} + +// String implements the fmt.Stringer interface. +func (td *TimeDetail) String() string { + if td == nil { + return "" + } + buf := bytes.NewBuffer(make([]byte, 0, 16)) + if td.ProcessTime > 0 { + buf.WriteString("total_process_time: ") + buf.WriteString(FormatDuration(td.ProcessTime)) + } + if td.WaitTime > 0 { + if buf.Len() > 0 { + buf.WriteString(", ") + } + buf.WriteString("total_wait_time: ") + buf.WriteString(FormatDuration(td.WaitTime)) + } + return buf.String() +} + +// MergeFromTimeDetail merges time detail from pb into itself. +func (td *TimeDetail) MergeFromTimeDetail(timeDetail *kvrpcpb.TimeDetail) { + if timeDetail != nil { + td.WaitTime += time.Duration(timeDetail.WaitWallTimeMs) * time.Millisecond + td.ProcessTime += time.Duration(timeDetail.ProcessWallTimeMs) * time.Millisecond + } +} + +// ScanDetail contains coprocessor scan detail information. +type ScanDetail struct { + // TotalKeys is the approximate number of MVCC keys meet during scanning. It includes + // deleted versions, but does not include RocksDB tombstone keys. + TotalKeys int64 + // ProcessedKeys is the number of user keys scanned from the storage. + // It does not include deleted version or RocksDB tombstone keys. + // For Coprocessor requests, it includes keys that has been filtered out by Selection. + ProcessedKeys int64 + // RocksdbDeleteSkippedCount is the total number of deletes and single deletes skipped over during + // iteration, i.e. how many RocksDB tombstones are skipped. + RocksdbDeleteSkippedCount uint64 + // RocksdbKeySkippedCount it the total number of internal keys skipped over during iteration. + RocksdbKeySkippedCount uint64 + // RocksdbBlockCacheHitCount is the total number of RocksDB block cache hits. + RocksdbBlockCacheHitCount uint64 + // RocksdbBlockReadCount is the total number of block reads (with IO). + RocksdbBlockReadCount uint64 + // RocksdbBlockReadByte is the total number of bytes from block reads. + RocksdbBlockReadByte uint64 +} + +// Merge merges scan detail execution details into self. +func (sd *ScanDetail) Merge(scanDetail *ScanDetail) { + atomic.AddInt64(&sd.TotalKeys, scanDetail.TotalKeys) + atomic.AddInt64(&sd.ProcessedKeys, scanDetail.ProcessedKeys) + atomic.AddUint64(&sd.RocksdbDeleteSkippedCount, scanDetail.RocksdbDeleteSkippedCount) + atomic.AddUint64(&sd.RocksdbKeySkippedCount, scanDetail.RocksdbKeySkippedCount) + atomic.AddUint64(&sd.RocksdbBlockCacheHitCount, scanDetail.RocksdbBlockCacheHitCount) + atomic.AddUint64(&sd.RocksdbBlockReadCount, scanDetail.RocksdbBlockReadCount) + atomic.AddUint64(&sd.RocksdbBlockReadByte, scanDetail.RocksdbBlockReadByte) +} + +// String implements the fmt.Stringer interface. +func (sd *ScanDetail) String() string { + if sd == nil { + return "" + } + buf := bytes.NewBuffer(make([]byte, 0, 16)) + buf.WriteString("scan_detail: {") + buf.WriteString("total_process_keys: ") + buf.WriteString(strconv.FormatInt(sd.ProcessedKeys, 10)) + buf.WriteString(", total_keys: ") + buf.WriteString(strconv.FormatInt(sd.TotalKeys, 10)) + buf.WriteString(", rocksdb: {") + buf.WriteString("delete_skipped_count: ") + buf.WriteString(strconv.FormatUint(sd.RocksdbDeleteSkippedCount, 10)) + buf.WriteString(", key_skipped_count: ") + buf.WriteString(strconv.FormatUint(sd.RocksdbKeySkippedCount, 10)) + buf.WriteString(", block: {") + buf.WriteString("cache_hit_count: ") + buf.WriteString(strconv.FormatUint(sd.RocksdbBlockCacheHitCount, 10)) + buf.WriteString(", read_count: ") + buf.WriteString(strconv.FormatUint(sd.RocksdbBlockReadCount, 10)) + buf.WriteString(", read_byte: ") + buf.WriteString(memory.FormatBytes(int64(sd.RocksdbBlockReadByte))) + buf.WriteString("}}}") + return buf.String() +} + +// MergeFromScanDetailV2 merges scan detail from pb into itself. +func (sd *ScanDetail) MergeFromScanDetailV2(scanDetail *kvrpcpb.ScanDetailV2) { + if scanDetail != nil { + sd.TotalKeys += int64(scanDetail.TotalVersions) + sd.ProcessedKeys += int64(scanDetail.ProcessedVersions) + sd.RocksdbDeleteSkippedCount += scanDetail.RocksdbDeleteSkippedCount + sd.RocksdbKeySkippedCount += scanDetail.RocksdbKeySkippedCount + sd.RocksdbBlockCacheHitCount += scanDetail.RocksdbBlockCacheHitCount + sd.RocksdbBlockReadCount += scanDetail.RocksdbBlockReadCount + sd.RocksdbBlockReadByte += scanDetail.RocksdbBlockReadByte + } +} + const ( // CopTimeStr represents the sum of cop-task time spend in TiDB distSQL. CopTimeStr = "Cop_time" @@ -209,6 +324,16 @@ const ( PrewriteRegionStr = "Prewrite_region" // TxnRetryStr means the count of transaction retry. TxnRetryStr = "Txn_retry" + // RocksdbDeleteSkippedCountStr means the count of rocksdb delete skipped count. + RocksdbDeleteSkippedCountStr = "Rocksdb_delete_skipped_count" + // RocksdbKeySkippedCountStr means the count of rocksdb key skipped count. + RocksdbKeySkippedCountStr = "Rocksdb_key_skipped_count" + // RocksdbBlockCacheHitCountStr means the count of rocksdb block cache hit. + RocksdbBlockCacheHitCountStr = "Rocksdb_block_cache_hit_count" + // RocksdbBlockReadCountStr means the count of rocksdb block read. + RocksdbBlockReadCountStr = "Rocksdb_block_read_count" + // RocksdbBlockReadByteStr means the bytes of rocksdb block read. + RocksdbBlockReadByteStr = "Rocksdb_block_read_byte" ) // String implements the fmt.Stringer interface. @@ -217,11 +342,11 @@ func (d ExecDetails) String() string { if d.CopTime > 0 { parts = append(parts, CopTimeStr+": "+strconv.FormatFloat(d.CopTime.Seconds(), 'f', -1, 64)) } - if d.ProcessTime > 0 { - parts = append(parts, ProcessTimeStr+": "+strconv.FormatFloat(d.ProcessTime.Seconds(), 'f', -1, 64)) + if d.TimeDetail.ProcessTime > 0 { + parts = append(parts, ProcessTimeStr+": "+strconv.FormatFloat(d.TimeDetail.ProcessTime.Seconds(), 'f', -1, 64)) } - if d.WaitTime > 0 { - parts = append(parts, WaitTimeStr+": "+strconv.FormatFloat(d.WaitTime.Seconds(), 'f', -1, 64)) + if d.TimeDetail.WaitTime > 0 { + parts = append(parts, WaitTimeStr+": "+strconv.FormatFloat(d.TimeDetail.WaitTime.Seconds(), 'f', -1, 64)) } if d.BackoffTime > 0 { parts = append(parts, BackoffTimeStr+": "+strconv.FormatFloat(d.BackoffTime.Seconds(), 'f', -1, 64)) @@ -232,12 +357,6 @@ func (d ExecDetails) String() string { if d.RequestCount > 0 { parts = append(parts, RequestCountStr+": "+strconv.FormatInt(int64(d.RequestCount), 10)) } - if d.TotalKeys > 0 { - parts = append(parts, TotalKeysStr+": "+strconv.FormatInt(d.TotalKeys, 10)) - } - if d.ProcessedKeys > 0 { - parts = append(parts, ProcessKeysStr+": "+strconv.FormatInt(d.ProcessedKeys, 10)) - } commitDetails := d.CommitDetail if commitDetails != nil { if commitDetails.PrewriteTime > 0 { @@ -282,6 +401,30 @@ func (d ExecDetails) String() string { parts = append(parts, TxnRetryStr+": "+strconv.FormatInt(int64(commitDetails.TxnRetry), 10)) } } + scanDetail := d.ScanDetail + if scanDetail != nil { + if scanDetail.ProcessedKeys > 0 { + parts = append(parts, ProcessKeysStr+": "+strconv.FormatInt(scanDetail.ProcessedKeys, 10)) + } + if scanDetail.TotalKeys > 0 { + parts = append(parts, TotalKeysStr+": "+strconv.FormatInt(scanDetail.TotalKeys, 10)) + } + if scanDetail.RocksdbDeleteSkippedCount > 0 { + parts = append(parts, RocksdbDeleteSkippedCountStr+": "+strconv.FormatUint(scanDetail.RocksdbDeleteSkippedCount, 10)) + } + if scanDetail.RocksdbKeySkippedCount > 0 { + parts = append(parts, RocksdbKeySkippedCountStr+": "+strconv.FormatUint(scanDetail.RocksdbKeySkippedCount, 10)) + } + if scanDetail.RocksdbBlockCacheHitCount > 0 { + parts = append(parts, RocksdbBlockCacheHitCountStr+": "+strconv.FormatUint(scanDetail.RocksdbBlockCacheHitCount, 10)) + } + if scanDetail.RocksdbBlockReadCount > 0 { + parts = append(parts, RocksdbBlockReadCountStr+": "+strconv.FormatUint(scanDetail.RocksdbBlockReadCount, 10)) + } + if scanDetail.RocksdbBlockReadByte > 0 { + parts = append(parts, RocksdbBlockReadByteStr+": "+strconv.FormatUint(scanDetail.RocksdbBlockReadByte, 10)) + } + } return strings.Join(parts, " ") } @@ -291,11 +434,11 @@ func (d ExecDetails) ToZapFields() (fields []zap.Field) { if d.CopTime > 0 { fields = append(fields, zap.String(strings.ToLower(CopTimeStr), strconv.FormatFloat(d.CopTime.Seconds(), 'f', -1, 64)+"s")) } - if d.ProcessTime > 0 { - fields = append(fields, zap.String(strings.ToLower(ProcessTimeStr), strconv.FormatFloat(d.ProcessTime.Seconds(), 'f', -1, 64)+"s")) + if d.TimeDetail.ProcessTime > 0 { + fields = append(fields, zap.String(strings.ToLower(ProcessTimeStr), strconv.FormatFloat(d.TimeDetail.ProcessTime.Seconds(), 'f', -1, 64)+"s")) } - if d.WaitTime > 0 { - fields = append(fields, zap.String(strings.ToLower(WaitTimeStr), strconv.FormatFloat(d.WaitTime.Seconds(), 'f', -1, 64)+"s")) + if d.TimeDetail.WaitTime > 0 { + fields = append(fields, zap.String(strings.ToLower(WaitTimeStr), strconv.FormatFloat(d.TimeDetail.WaitTime.Seconds(), 'f', -1, 64)+"s")) } if d.BackoffTime > 0 { fields = append(fields, zap.String(strings.ToLower(BackoffTimeStr), strconv.FormatFloat(d.BackoffTime.Seconds(), 'f', -1, 64)+"s")) @@ -303,11 +446,11 @@ func (d ExecDetails) ToZapFields() (fields []zap.Field) { if d.RequestCount > 0 { fields = append(fields, zap.String(strings.ToLower(RequestCountStr), strconv.FormatInt(int64(d.RequestCount), 10))) } - if d.TotalKeys > 0 { - fields = append(fields, zap.String(strings.ToLower(TotalKeysStr), strconv.FormatInt(d.TotalKeys, 10))) + if d.ScanDetail != nil && d.ScanDetail.TotalKeys > 0 { + fields = append(fields, zap.String(strings.ToLower(TotalKeysStr), strconv.FormatInt(d.ScanDetail.TotalKeys, 10))) } - if d.ProcessedKeys > 0 { - fields = append(fields, zap.String(strings.ToLower(ProcessKeysStr), strconv.FormatInt(d.ProcessedKeys, 10))) + if d.ScanDetail != nil && d.ScanDetail.ProcessedKeys > 0 { + fields = append(fields, zap.String(strings.ToLower(ProcessKeysStr), strconv.FormatInt(d.ScanDetail.ProcessedKeys, 10))) } commitDetails := d.CommitDetail if commitDetails != nil { @@ -353,6 +496,46 @@ func (d ExecDetails) ToZapFields() (fields []zap.Field) { return fields } +type basicCopRuntimeStats struct { + BasicRuntimeStats + threads int32 + storeType string +} + +// String implements the RuntimeStats interface. +func (e *basicCopRuntimeStats) String() string { + if e.storeType == "tiflash" { + return fmt.Sprintf("time:%v, loops:%d, threads:%d", FormatDuration(time.Duration(e.consume)), e.loop, e.threads) + } + return fmt.Sprintf("time:%v, loops:%d", FormatDuration(time.Duration(e.consume)), e.loop) +} + +// Clone implements the RuntimeStats interface. +func (e *basicCopRuntimeStats) Clone() RuntimeStats { + return &basicCopRuntimeStats{ + BasicRuntimeStats: BasicRuntimeStats{loop: e.loop, consume: e.consume, rows: e.rows}, + threads: e.threads, + storeType: e.storeType, + } +} + +// Merge implements the RuntimeStats interface. +func (e *basicCopRuntimeStats) Merge(rs RuntimeStats) { + tmp, ok := rs.(*basicCopRuntimeStats) + if !ok { + return + } + e.loop += tmp.loop + e.consume += tmp.consume + e.rows += tmp.rows + e.threads += tmp.threads +} + +// Tp implements the RuntimeStats interface. +func (e *basicCopRuntimeStats) Tp() int { + return TpBasicCopRunTimeStats +} + // CopRuntimeStats collects cop tasks' execution info. type CopRuntimeStats struct { sync.Mutex @@ -362,7 +545,10 @@ type CopRuntimeStats struct { // have many region leaders, several coprocessor tasks can be sent to the // same tikv-server instance. We have to use a list to maintain all tasks // executed on each instance. - stats map[string][]*BasicRuntimeStats + stats map[string][]*basicCopRuntimeStats + scanDetail *ScanDetail + // do not use kv.StoreType because it will meet cycle import error + storeType string } // RecordOneCopTask records a specific cop tasks's execution detail. @@ -370,9 +556,11 @@ func (crs *CopRuntimeStats) RecordOneCopTask(address string, summary *tipb.Execu crs.Lock() defer crs.Unlock() crs.stats[address] = append(crs.stats[address], - &BasicRuntimeStats{loop: int32(*summary.NumIterations), + &basicCopRuntimeStats{BasicRuntimeStats: BasicRuntimeStats{loop: int32(*summary.NumIterations), consume: int64(*summary.TimeProcessedNs), - rows: int64(*summary.NumProducedRows)}) + rows: int64(*summary.NumProducedRows)}, + threads: int32(summary.GetConcurrency()), + storeType: crs.storeType}) } // GetActRows return total rows of CopRuntimeStats. @@ -392,23 +580,45 @@ func (crs *CopRuntimeStats) String() string { var totalTasks int64 var totalIters int32 + var totalThreads int32 procTimes := make([]time.Duration, 0, 32) for _, instanceStats := range crs.stats { for _, stat := range instanceStats { procTimes = append(procTimes, time.Duration(stat.consume)*time.Nanosecond) totalIters += stat.loop + totalThreads += stat.threads totalTasks++ } } + isTiFlashCop := crs.storeType == "tiflash" + buf := bytes.NewBuffer(make([]byte, 0, 16)) if totalTasks == 1 { - return fmt.Sprintf("time:%v, loops:%d", procTimes[0], totalIters) + buf.WriteString(fmt.Sprintf("%v_task:{time:%v, loops:%d", crs.storeType, FormatDuration(procTimes[0]), totalIters)) + if isTiFlashCop { + buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) + } else { + buf.WriteString("}") + } + } else { + n := len(procTimes) + sort.Slice(procTimes, func(i, j int) bool { return procTimes[i] < procTimes[j] }) + buf.WriteString(fmt.Sprintf("%v_task:{proc max:%v, min:%v, p80:%v, p95:%v, iters:%v, tasks:%v", + crs.storeType, FormatDuration(procTimes[n-1]), FormatDuration(procTimes[0]), + FormatDuration(procTimes[n*4/5]), FormatDuration(procTimes[n*19/20]), totalIters, totalTasks)) + if isTiFlashCop { + buf.WriteString(fmt.Sprintf(", threads:%d}", totalThreads)) + } else { + buf.WriteString("}") + } } - - n := len(procTimes) - sort.Slice(procTimes, func(i, j int) bool { return procTimes[i] < procTimes[j] }) - return fmt.Sprintf("proc max:%v, min:%v, p80:%v, p95:%v, iters:%v, tasks:%v", - procTimes[n-1], procTimes[0], procTimes[n*4/5], procTimes[n*19/20], totalIters, totalTasks) + if !isTiFlashCop { + if detail := crs.scanDetail; detail != nil { + buf.WriteString(", ") + buf.WriteString(detail.String()) + } + } + return buf.String() } const ( @@ -432,6 +642,16 @@ const ( TpSelectResultRuntimeStats // TpInsertRuntimeStat is the tp for InsertRuntimeStat TpInsertRuntimeStat + // TpIndexLookUpRunTimeStats is the tp for TpIndexLookUpRunTimeStats + TpIndexLookUpRunTimeStats + // TpSlowQueryRuntimeStat is the tp for TpSlowQueryRuntimeStat + TpSlowQueryRuntimeStat + // TpHashAggRuntimeStat is the tp for HashAggRuntimeStat + TpHashAggRuntimeStat + // TpIndexMergeRunTimeStats is the tp for TpIndexMergeRunTimeStats + TpIndexMergeRunTimeStats + // TpBasicCopRunTimeStats is the tp for TpBasicCopRunTimeStats + TpBasicCopRunTimeStats ) // RuntimeStats is used to express the executor runtime information. @@ -547,7 +767,7 @@ func (e *BasicRuntimeStats) SetRowNum(rowNum int64) { // String implements the RuntimeStats interface. func (e *BasicRuntimeStats) String() string { - return fmt.Sprintf("time:%v, loops:%d", time.Duration(e.consume), e.loop) + return fmt.Sprintf("time:%v, loops:%d", FormatDuration(time.Duration(e.consume)), e.loop) } // GetTime get the int64 total time @@ -616,7 +836,22 @@ func (e *RuntimeStatsColl) GetCopStats(planID int) *CopRuntimeStats { defer e.mu.Unlock() copStats, ok := e.copStats[planID] if !ok { - copStats = &CopRuntimeStats{stats: make(map[string][]*BasicRuntimeStats)} + return nil + } + return copStats +} + +// GetOrCreateCopStats gets the CopRuntimeStats specified by planID, if not exists a new one will be created. +func (e *RuntimeStatsColl) GetOrCreateCopStats(planID int, storeType string) *CopRuntimeStats { + e.mu.Lock() + defer e.mu.Unlock() + copStats, ok := e.copStats[planID] + if !ok { + copStats = &CopRuntimeStats{ + stats: make(map[string][]*basicCopRuntimeStats), + scanDetail: &ScanDetail{}, + storeType: storeType, + } e.copStats[planID] = copStats } return copStats @@ -633,16 +868,22 @@ func getPlanIDFromExecutionSummary(summary *tipb.ExecutorExecutionSummary) (int, } // RecordOneCopTask records a specific cop tasks's execution detail. -func (e *RuntimeStatsColl) RecordOneCopTask(planID int, address string, summary *tipb.ExecutorExecutionSummary) { +func (e *RuntimeStatsColl) RecordOneCopTask(planID int, storeType string, address string, summary *tipb.ExecutorExecutionSummary) { // for TiFlash cop response, ExecutorExecutionSummary contains executor id, so if there is a valid executor id in // summary, use it overwrite the planID if id, valid := getPlanIDFromExecutionSummary(summary); valid { planID = id } - copStats := e.GetCopStats(planID) + copStats := e.GetOrCreateCopStats(planID, storeType) copStats.RecordOneCopTask(address, summary) } +// RecordScanDetail records a specific cop tasks's cop detail. +func (e *RuntimeStatsColl) RecordScanDetail(planID int, storeType string, detail *ScanDetail) { + copStats := e.GetOrCreateCopStats(planID, storeType) + copStats.scanDetail.Merge(detail) +} + // ExistsRootStats checks if the planID exists in the rootStats collection. func (e *RuntimeStatsColl) ExistsRootStats(planID int) bool { e.mu.Lock() @@ -782,24 +1023,24 @@ func (e *RuntimeStatsWithCommit) String() string { buf.WriteString("commit_txn: {") if e.Commit.PrewriteTime > 0 { buf.WriteString("prewrite:") - buf.WriteString(e.Commit.PrewriteTime.String()) + buf.WriteString(FormatDuration(e.Commit.PrewriteTime)) } if e.Commit.WaitPrewriteBinlogTime > 0 { buf.WriteString(", wait_prewrite_binlog:") - buf.WriteString(e.Commit.WaitPrewriteBinlogTime.String()) + buf.WriteString(FormatDuration(e.Commit.WaitPrewriteBinlogTime)) } if e.Commit.GetCommitTsTime > 0 { buf.WriteString(", get_commit_ts:") - buf.WriteString(e.Commit.GetCommitTsTime.String()) + buf.WriteString(FormatDuration(e.Commit.GetCommitTsTime)) } if e.Commit.CommitTime > 0 { buf.WriteString(", commit:") - buf.WriteString(e.Commit.CommitTime.String()) + buf.WriteString(FormatDuration(e.Commit.CommitTime)) } commitBackoffTime := atomic.LoadInt64(&e.Commit.CommitBackoffTime) if commitBackoffTime > 0 { buf.WriteString(", backoff: {time: ") - buf.WriteString(time.Duration(commitBackoffTime).String()) + buf.WriteString(FormatDuration(time.Duration(commitBackoffTime))) e.Commit.Mu.Lock() if len(e.Commit.Mu.BackoffTypes) > 0 { buf.WriteString(", type: ") @@ -810,7 +1051,7 @@ func (e *RuntimeStatsWithCommit) String() string { } if e.Commit.ResolveLockTime > 0 { buf.WriteString(", resolve_lock: ") - buf.WriteString(time.Duration(e.Commit.ResolveLockTime).String()) + buf.WriteString(FormatDuration(time.Duration(e.Commit.ResolveLockTime))) } prewriteRegionNum := atomic.LoadInt32(&e.Commit.PrewriteRegionNum) @@ -839,7 +1080,7 @@ func (e *RuntimeStatsWithCommit) String() string { buf.WriteString("lock_keys: {") if e.LockKeys.TotalTime > 0 { buf.WriteString("time:") - buf.WriteString(e.LockKeys.TotalTime.String()) + buf.WriteString(FormatDuration(e.LockKeys.TotalTime)) } if e.LockKeys.RegionNum > 0 { buf.WriteString(", region:") @@ -851,11 +1092,11 @@ func (e *RuntimeStatsWithCommit) String() string { } if e.LockKeys.ResolveLockTime > 0 { buf.WriteString(", resolve_lock:") - buf.WriteString(time.Duration(e.LockKeys.ResolveLockTime).String()) + buf.WriteString(FormatDuration(time.Duration(e.LockKeys.ResolveLockTime))) } if e.LockKeys.BackoffTime > 0 { buf.WriteString(", backoff: {time: ") - buf.WriteString(time.Duration(e.LockKeys.BackoffTime).String()) + buf.WriteString(FormatDuration(time.Duration(e.LockKeys.BackoffTime))) e.LockKeys.Mu.Lock() if len(e.LockKeys.Mu.BackoffTypes) > 0 { buf.WriteString(", type: ") @@ -899,3 +1140,41 @@ func (e *RuntimeStatsWithCommit) formatBackoff(backoffTypes []fmt.Stringer) stri sort.Strings(tpArray) return fmt.Sprintf("%v", tpArray) } + +// FormatDuration uses to format duration, this function will prune precision before format duration. +// Pruning precision is for human readability. The prune rule is: +// 1. if the duration was less than 1us, return the original string. +// 2. readable value >=10, keep 1 decimal, otherwise, keep 2 decimal. such as: +// 9.412345ms -> 9.41ms +// 10.412345ms -> 10.4ms +// 5.999s -> 6s +// 100.45µs -> 100.5µs +func FormatDuration(d time.Duration) string { + if d <= time.Microsecond { + return d.String() + } + unit := getUnit(d) + if unit == time.Nanosecond { + return d.String() + } + integer := (d / unit) * unit + decimal := float64(d%unit) / float64(unit) + if d < 10*unit { + decimal = math.Round(decimal*100) / 100 + } else { + decimal = math.Round(decimal*10) / 10 + } + d = integer + time.Duration(decimal*float64(unit)) + return d.String() +} + +func getUnit(d time.Duration) time.Duration { + if d >= time.Second { + return time.Second + } else if d >= time.Millisecond { + return time.Millisecond + } else if d >= time.Microsecond { + return time.Microsecond + } + return time.Nanosecond +} diff --git a/util/execdetails/execdetails_test.go b/util/execdetails/execdetails_test.go index f10589bba4f44..4702ba3439f2f 100644 --- a/util/execdetails/execdetails_test.go +++ b/util/execdetails/execdetails_test.go @@ -31,13 +31,9 @@ func TestT(t *testing.T) { func TestString(t *testing.T) { detail := &ExecDetails{ - CopTime: time.Second + 3*time.Millisecond, - ProcessTime: 2*time.Second + 5*time.Millisecond, - WaitTime: time.Second, - BackoffTime: time.Second, - RequestCount: 1, - TotalKeys: 100, - ProcessedKeys: 10, + CopTime: time.Second + 3*time.Millisecond, + BackoffTime: time.Second, + RequestCount: 1, CommitDetail: &CommitDetails{ GetCommitTsTime: time.Second, PrewriteTime: time.Second, @@ -61,9 +57,23 @@ func TestString(t *testing.T) { PrewriteRegionNum: 1, TxnRetry: 1, }, + ScanDetail: &ScanDetail{ + ProcessedKeys: 10, + TotalKeys: 100, + RocksdbDeleteSkippedCount: 1, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 1, + RocksdbBlockReadCount: 1, + RocksdbBlockReadByte: 100, + }, + TimeDetail: TimeDetail{ + ProcessTime: 2*time.Second + 5*time.Millisecond, + WaitTime: time.Second, + }, } - expected := "Cop_time: 1.003 Process_time: 2.005 Wait_time: 1 Backoff_time: 1 Request_count: 1 Total_keys: 100 Process_keys: 10 Prewrite_time: 1 Commit_time: 1 " + - "Get_commit_ts_time: 1 Commit_backoff_time: 1 Backoff_types: [backoff1 backoff2] Resolve_lock_time: 1 Local_latch_wait_time: 1 Write_keys: 1 Write_size: 1 Prewrite_region: 1 Txn_retry: 1" + expected := "Cop_time: 1.003 Process_time: 2.005 Wait_time: 1 Backoff_time: 1 Request_count: 1 Prewrite_time: 1 Commit_time: 1 " + + "Get_commit_ts_time: 1 Commit_backoff_time: 1 Backoff_types: [backoff1 backoff2] Resolve_lock_time: 1 Local_latch_wait_time: 1 Write_keys: 1 Write_size: 1 Prewrite_region: 1 Txn_retry: 1 " + + "Process_keys: 10 Total_keys: 100 Rocksdb_delete_skipped_count: 1 Rocksdb_key_skipped_count: 1 Rocksdb_block_cache_hit_count: 1 Rocksdb_block_read_count: 1 Rocksdb_block_read_byte: 100" if str := detail.String(); str != expected { t.Errorf("got:\n%s\nexpected:\n%s", str, expected) } @@ -78,9 +88,9 @@ func mockExecutorExecutionSummary(TimeProcessedNs, NumProducedRows, NumIteration NumIterations: &NumIterations, XXX_unrecognized: nil} } -func mockExecutorExecutionSummaryForTiFlash(TimeProcessedNs, NumProducedRows, NumIterations uint64, ExecutorID string) *tipb.ExecutorExecutionSummary { +func mockExecutorExecutionSummaryForTiFlash(TimeProcessedNs, NumProducedRows, NumIterations, Concurrency uint64, ExecutorID string) *tipb.ExecutorExecutionSummary { return &tipb.ExecutorExecutionSummary{TimeProcessedNs: &TimeProcessedNs, NumProducedRows: &NumProducedRows, - NumIterations: &NumIterations, ExecutorId: &ExecutorID, XXX_unrecognized: nil} + NumIterations: &NumIterations, Concurrency: &Concurrency, ExecutorId: &ExecutorID, XXX_unrecognized: nil} } func TestCopRuntimeStats(t *testing.T) { @@ -88,16 +98,27 @@ func TestCopRuntimeStats(t *testing.T) { tableScanID := 1 aggID := 2 tableReaderID := 3 - stats.RecordOneCopTask(tableScanID, "8.8.8.8", mockExecutorExecutionSummary(1, 1, 1)) - stats.RecordOneCopTask(tableScanID, "8.8.8.9", mockExecutorExecutionSummary(2, 2, 2)) - stats.RecordOneCopTask(aggID, "8.8.8.8", mockExecutorExecutionSummary(3, 3, 3)) - stats.RecordOneCopTask(aggID, "8.8.8.9", mockExecutorExecutionSummary(4, 4, 4)) + stats.RecordOneCopTask(tableScanID, "tikv", "8.8.8.8", mockExecutorExecutionSummary(1, 1, 1)) + stats.RecordOneCopTask(tableScanID, "tikv", "8.8.8.9", mockExecutorExecutionSummary(2, 2, 2)) + stats.RecordOneCopTask(aggID, "tikv", "8.8.8.8", mockExecutorExecutionSummary(3, 3, 3)) + stats.RecordOneCopTask(aggID, "tikv", "8.8.8.9", mockExecutorExecutionSummary(4, 4, 4)) + scanDetail := &ScanDetail{ + TotalKeys: 15, + ProcessedKeys: 10, + RocksdbDeleteSkippedCount: 5, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 20, + RocksdbBlockReadByte: 100, + } + stats.RecordScanDetail(tableScanID, "tikv", scanDetail) if stats.ExistsCopStats(tableScanID) != true { t.Fatal("exist") } - cop := stats.GetCopStats(tableScanID) - if cop.String() != "proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2" { - t.Fatal("table_scan") + cop := stats.GetOrCreateCopStats(tableScanID, "tikv") + if cop.String() != "tikv_task:{proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2}, "+ + "scan_detail: {total_process_keys: 10, total_keys: 15, rocksdb: {delete_skipped_count: 5, key_skipped_count: 1, block: {cache_hit_count: 10, read_count: 20, read_byte: 100 Bytes}}}" { + t.Fatalf(cop.String()) } copStats := cop.stats["8.8.8.8"] if copStats == nil { @@ -105,12 +126,13 @@ func TestCopRuntimeStats(t *testing.T) { } copStats[0].SetRowNum(10) copStats[0].Record(time.Second, 10) - if copStats[0].String() != "time:1.000000001s, loops:2" { + if copStats[0].String() != "time:1s, loops:2" { t.Fatalf("cop stats string is not expect, got: %v", copStats[0].String()) } - if stats.GetCopStats(aggID).String() != "proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2" { - t.Fatal("agg") + if stats.GetOrCreateCopStats(aggID, "tikv").String() != "tikv_task:{proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2}, "+ + "scan_detail: {total_process_keys: 0, total_keys: 0, rocksdb: {delete_skipped_count: 0, key_skipped_count: 0, block: {cache_hit_count: 0, read_count: 0, read_byte: 0 Bytes}}}" { + t.Fatalf("agg cop stats string is not as expected, got: %v", stats.GetOrCreateCopStats(aggID, "tikv").String()) } rootStats := stats.GetRootStats(tableReaderID) if rootStats == nil { @@ -119,6 +141,15 @@ func TestCopRuntimeStats(t *testing.T) { if stats.ExistsRootStats(tableReaderID) == false { t.Fatal("table_reader not exists") } + + cop.scanDetail.ProcessedKeys = 0 + cop.scanDetail.RocksdbKeySkippedCount = 0 + cop.scanDetail.RocksdbBlockReadCount = 0 + // Print all fields even though the value of some fields is 0. + if cop.String() != "tikv_task:{proc max:1s, min:2ns, p80:1s, p95:1s, iters:4, tasks:2}, "+ + "scan_detail: {total_process_keys: 0, total_keys: 15, rocksdb: {delete_skipped_count: 5, key_skipped_count: 0, block: {cache_hit_count: 10, read_count: 0, read_byte: 100 Bytes}}}" { + t.Fatalf(cop.String()) + } } func TestCopRuntimeStatsForTiFlash(t *testing.T) { @@ -126,16 +157,26 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { tableScanID := 1 aggID := 2 tableReaderID := 3 - stats.RecordOneCopTask(aggID, "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(1, 1, 1, "tablescan_"+strconv.Itoa(tableScanID))) - stats.RecordOneCopTask(aggID, "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(2, 2, 2, "tablescan_"+strconv.Itoa(tableScanID))) - stats.RecordOneCopTask(tableScanID, "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(3, 3, 3, "aggregation_"+strconv.Itoa(aggID))) - stats.RecordOneCopTask(tableScanID, "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(4, 4, 4, "aggregation_"+strconv.Itoa(aggID))) + stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(1, 1, 1, 1, "tablescan_"+strconv.Itoa(tableScanID))) + stats.RecordOneCopTask(aggID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(2, 2, 2, 1, "tablescan_"+strconv.Itoa(tableScanID))) + stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.8", mockExecutorExecutionSummaryForTiFlash(3, 3, 3, 1, "aggregation_"+strconv.Itoa(aggID))) + stats.RecordOneCopTask(tableScanID, "tiflash", "8.8.8.9", mockExecutorExecutionSummaryForTiFlash(4, 4, 4, 1, "aggregation_"+strconv.Itoa(aggID))) + scanDetail := &ScanDetail{ + TotalKeys: 10, + ProcessedKeys: 10, + RocksdbDeleteSkippedCount: 10, + RocksdbKeySkippedCount: 1, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 10, + RocksdbBlockReadByte: 100, + } + stats.RecordScanDetail(tableScanID, "tiflash", scanDetail) if stats.ExistsCopStats(tableScanID) != true { t.Fatal("exist") } - cop := stats.GetCopStats(tableScanID) - if cop.String() != "proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2" { - t.Fatal("table_scan") + cop := stats.GetOrCreateCopStats(tableScanID, "tiflash") + if cop.String() != "tiflash_task:{proc max:2ns, min:1ns, p80:2ns, p95:2ns, iters:3, tasks:2, threads:2}" { + t.Fatal(cop.String()) } copStats := cop.stats["8.8.8.8"] if copStats == nil { @@ -143,12 +184,12 @@ func TestCopRuntimeStatsForTiFlash(t *testing.T) { } copStats[0].SetRowNum(10) copStats[0].Record(time.Second, 10) - if copStats[0].String() != "time:1.000000001s, loops:2" { + if copStats[0].String() != "time:1s, loops:2, threads:1" { t.Fatalf("cop stats string is not expect, got: %v", copStats[0].String()) } - if stats.GetCopStats(aggID).String() != "proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2" { - t.Fatal("agg") + if stats.GetOrCreateCopStats(aggID, "tiflash").String() != "tiflash_task:{proc max:4ns, min:3ns, p80:4ns, p95:4ns, iters:7, tasks:2, threads:2}" { + t.Fatalf("agg cop stats string is not as expected, got: %v", stats.GetOrCreateCopStats(aggID, "tiflash").String()) } rootStats := stats.GetRootStats(tableReaderID) if rootStats == nil { @@ -257,3 +298,53 @@ func TestRootRuntimeStats(t *testing.T) { t.Fatalf("%v != %v", stats.String(), expect) } } + +func TestFormatDurationForExplain(t *testing.T) { + cases := []struct { + t string + s string + }{ + {"0s", "0s"}, + {"1ns", "1ns"}, + {"9ns", "9ns"}, + {"10ns", "10ns"}, + {"999ns", "999ns"}, + {"1µs", "1µs"}, + {"1.123µs", "1.12µs"}, + {"1.023µs", "1.02µs"}, + {"1.003µs", "1µs"}, + {"10.456µs", "10.5µs"}, + {"10.956µs", "11µs"}, + {"999.056µs", "999.1µs"}, + {"999.988µs", "1ms"}, + {"1.123ms", "1.12ms"}, + {"1.023ms", "1.02ms"}, + {"1.003ms", "1ms"}, + {"10.456ms", "10.5ms"}, + {"10.956ms", "11ms"}, + {"999.056ms", "999.1ms"}, + {"999.988ms", "1s"}, + {"1.123s", "1.12s"}, + {"1.023s", "1.02s"}, + {"1.003s", "1s"}, + {"10.456s", "10.5s"}, + {"10.956s", "11s"}, + {"16m39.056s", "16m39.1s"}, + {"16m39.988s", "16m40s"}, + {"24h16m39.388662s", "24h16m39.4s"}, + {"9.412345ms", "9.41ms"}, + {"10.412345ms", "10.4ms"}, + {"5.999s", "6s"}, + {"100.45µs", "100.5µs"}, + } + for _, ca := range cases { + d, err := time.ParseDuration(ca.t) + if err != nil { + t.Fatalf("%v != %v", err, nil) + } + result := FormatDuration(d) + if result != ca.s { + t.Fatalf("%v != %v", result, ca.s) + } + } +} diff --git a/util/execdetails/pd_interceptor.go b/util/execdetails/pd_interceptor.go index ad046ad13b6f1..11ca15a382f2f 100644 --- a/util/execdetails/pd_interceptor.go +++ b/util/execdetails/pd_interceptor.go @@ -84,7 +84,7 @@ func (m InterceptedPDClient) GetRegion(ctx context.Context, key []byte) (*pd.Reg // GetPrevRegion implements pd.Client#GetPrevRegion. func (m InterceptedPDClient) GetPrevRegion(ctx context.Context, key []byte) (*pd.Region, error) { start := time.Now() - r, err := m.Client.GetRegion(ctx, key) + r, err := m.Client.GetPrevRegion(ctx, key) recordPDWaitTime(ctx, start) return r, err } diff --git a/util/expensivequery/expensivequerey_test.go b/util/expensivequery/expensivequerey_test.go index 066db5873ab1a..9fa8fb42089df 100644 --- a/util/expensivequery/expensivequerey_test.go +++ b/util/expensivequery/expensivequerey_test.go @@ -53,6 +53,7 @@ func (s *testSuite) TestLogFormat(c *C) { StmtCtx: &stmtctx.StatementContext{ MemTracker: mem, }, + RedactSQL: false, } costTime := time.Second * 233 logFields := genLogFields(costTime, info) @@ -68,7 +69,11 @@ func (s *testSuite) TestLogFormat(c *C) { c.Assert(logFields[4].Key, Equals, "txn_start_ts") c.Assert(logFields[4].Integer, Equals, int64(23333)) c.Assert(logFields[5].Key, Equals, "mem_max") - c.Assert(logFields[5].String, Equals, "2013265920 Bytes (1.875 GB)") + c.Assert(logFields[5].String, Equals, "2013265920 Bytes (1.88 GB)") c.Assert(logFields[6].Key, Equals, "sql") c.Assert(logFields[6].String, Equals, "select * from table where a > 1") + + info.RedactSQL = true + logFields = genLogFields(costTime, info) + c.Assert(logFields[6].String, Equals, "select * from table where `a` > ?") } diff --git a/util/expensivequery/expensivequery.go b/util/expensivequery/expensivequery.go index 8ab115e900ce6..38ef0379183ef 100644 --- a/util/expensivequery/expensivequery.go +++ b/util/expensivequery/expensivequery.go @@ -21,6 +21,7 @@ import ( "time" "github.com/pingcap/log" + "github.com/pingcap/parser" "github.com/pingcap/tidb/sessionctx/variable" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/logutil" @@ -54,6 +55,7 @@ func (eqh *Handle) Run() { ticker := time.NewTicker(tickInterval) defer ticker.Stop() sm := eqh.sm.Load().(util.SessionManager) + record := &memoryUsageAlarm{} for { select { case <-ticker.C: @@ -73,6 +75,11 @@ func (eqh *Handle) Run() { } } threshold = atomic.LoadUint64(&variable.ExpensiveQueryTimeThreshold) + + record.memoryUsageAlarmRatio = variable.MemoryUsageAlarmRatio.Load() + if record.err == nil { + record.alarm4ExcessiveMemUsage(sm) + } case <-eqh.exitCh: return } @@ -148,13 +155,16 @@ func genLogFields(costTime time.Duration, info *util.ProcessInfo) []zap.Field { } logFields = append(logFields, zap.Uint64("txn_start_ts", info.CurTxnStartTS)) if memTracker := info.StmtCtx.MemTracker; memTracker != nil { - logFields = append(logFields, zap.String("mem_max", fmt.Sprintf("%d Bytes (%v)", memTracker.MaxConsumed(), memTracker.BytesToString(memTracker.MaxConsumed())))) + logFields = append(logFields, zap.String("mem_max", fmt.Sprintf("%d Bytes (%v)", memTracker.MaxConsumed(), memTracker.FormatBytes(memTracker.MaxConsumed())))) } const logSQLLen = 1024 * 8 var sql string if len(info.Info) > 0 { sql = info.Info + if info.RedactSQL { + sql = parser.Normalize(sql) + } } if len(sql) > logSQLLen { sql = fmt.Sprintf("%s len(%d)", sql[:logSQLLen], len(sql)) diff --git a/util/expensivequery/memory_usage_alarm.go b/util/expensivequery/memory_usage_alarm.go new file mode 100644 index 0000000000000..fbe9b6c5ff438 --- /dev/null +++ b/util/expensivequery/memory_usage_alarm.go @@ -0,0 +1,253 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package expensivequery + +import ( + "fmt" + "io/ioutil" + "os" + "path/filepath" + "runtime" + rpprof "runtime/pprof" + "sort" + "strings" + "time" + + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/util/disk" + "github.com/pingcap/tidb/util/logutil" + "github.com/pingcap/tidb/util/memory" + "go.uber.org/zap" + "go.uber.org/zap/zapcore" +) + +type memoryUsageAlarm struct { + err error + initialized bool + isServerMemoryQuotaSet bool + serverMemoryQuota uint64 + memoryUsageAlarmRatio float64 + lastCheckTime time.Time + + tmpDir string + lastLogFileName []string + lastProfileFileName [][]string // heap, goroutine +} + +func (record *memoryUsageAlarm) initMemoryUsageAlarmRecord() { + if quota := config.GetGlobalConfig().Performance.ServerMemoryQuota; quota != 0 { + record.serverMemoryQuota = quota + record.isServerMemoryQuotaSet = true + } else { + record.serverMemoryQuota, record.err = memory.MemTotal() + if record.err != nil { + logutil.BgLogger().Error("get system total memory fail", zap.Error(record.err)) + return + } + record.isServerMemoryQuotaSet = false + } + record.lastCheckTime = time.Time{} + record.tmpDir = filepath.Join(config.GetGlobalConfig().TempStoragePath, "record") + if record.err = disk.CheckAndCreateDir(record.tmpDir); record.err != nil { + return + } + record.lastProfileFileName = make([][]string, 2) + // Read last records + files, err := ioutil.ReadDir(record.tmpDir) + if err != nil { + record.err = err + return + } + for _, f := range files { + name := filepath.Join(record.tmpDir, f.Name()) + if strings.Contains(f.Name(), "running_sql") { + record.lastLogFileName = append(record.lastLogFileName, name) + } + if strings.Contains(f.Name(), "heap") { + record.lastProfileFileName[0] = append(record.lastProfileFileName[0], name) + } + if strings.Contains(f.Name(), "goroutine") { + record.lastProfileFileName[1] = append(record.lastProfileFileName[1], name) + } + } + record.initialized = true + return +} + +// If Performance.ServerMemoryQuota is set, use `ServerMemoryQuota * MemoryUsageAlarmRatio` to check oom risk. +// If Performance.ServerMemoryQuota is not set, use `system total memory size * MemoryUsageAlarmRatio` to check oom risk. +func (record *memoryUsageAlarm) alarm4ExcessiveMemUsage(sm util.SessionManager) { + if record.memoryUsageAlarmRatio <= 0.0 || record.memoryUsageAlarmRatio >= 1.0 { + return + } + if !record.initialized { + record.initMemoryUsageAlarmRecord() + if record.err != nil { + return + } + } + + var memoryUsage uint64 + instanceStats := &runtime.MemStats{} + runtime.ReadMemStats(instanceStats) + if record.isServerMemoryQuotaSet { + memoryUsage = instanceStats.HeapAlloc + } else { + memoryUsage, record.err = memory.MemUsed() + if record.err != nil { + logutil.BgLogger().Error("get system memory usage fail", zap.Error(record.err)) + return + } + } + + // TODO: Consider NextGC to record SQLs. + if float64(memoryUsage) > float64(record.serverMemoryQuota)*record.memoryUsageAlarmRatio { + // At least ten seconds between two recordings that memory usage is less than threshold (default 80% system memory). + // If the memory is still exceeded, only records once. + interval := time.Since(record.lastCheckTime) + record.lastCheckTime = time.Now() + if interval > 10*time.Second { + record.doRecord(memoryUsage, instanceStats.HeapAlloc, sm) + } + } +} + +func (record *memoryUsageAlarm) doRecord(memUsage uint64, instanceMemoryUsage uint64, sm util.SessionManager) { + fields := make([]zap.Field, 0, 6) + fields = append(fields, zap.Bool("is server-memory-quota set", record.isServerMemoryQuotaSet)) + if record.isServerMemoryQuotaSet { + fields = append(fields, zap.Any("server-memory-quota", record.serverMemoryQuota)) + fields = append(fields, zap.Any("tidb-server memory usage", memUsage)) + } else { + fields = append(fields, zap.Any("system memory total", record.serverMemoryQuota)) + fields = append(fields, zap.Any("system memory usage", memUsage)) + fields = append(fields, zap.Any("tidb-server memory usage", instanceMemoryUsage)) + } + fields = append(fields, zap.Any("memory-usage-alarm-ratio", record.memoryUsageAlarmRatio)) + fields = append(fields, zap.Any("record path", record.tmpDir)) + + logutil.BgLogger().Warn("tidb-server has the risk of OOM. Running SQLs and heap profile will be recorded in record path", fields...) + + if record.err = disk.CheckAndCreateDir(record.tmpDir); record.err != nil { + return + } + record.recordSQL(sm) + record.recordProfile() + + tryRemove := func(filename *[]string) { + // Keep the last 5 files + for len(*filename) > 5 { + err := os.Remove((*filename)[0]) + if err != nil { + logutil.BgLogger().Error("remove temp files failed", zap.Error(err)) + } + *filename = (*filename)[1:] + } + } + tryRemove(&record.lastLogFileName) + for i := range record.lastProfileFileName { + tryRemove(&record.lastProfileFileName[i]) + } +} + +func (record *memoryUsageAlarm) recordSQL(sm util.SessionManager) { + processInfo := sm.ShowProcessList() + pinfo := make([]*util.ProcessInfo, 0, len(processInfo)) + for _, info := range processInfo { + if len(info.Info) != 0 { + pinfo = append(pinfo, info) + } + } + + fileName := filepath.Join(record.tmpDir, "running_sql"+record.lastCheckTime.Format(time.RFC3339)) + record.lastLogFileName = append(record.lastLogFileName, fileName) + f, err := os.Create(fileName) + if err != nil { + logutil.BgLogger().Error("create oom record file fail", zap.Error(err)) + return + } + defer func() { + err := f.Close() + if err != nil { + logutil.BgLogger().Error("close oom record file fail", zap.Error(err)) + } + }() + printTop10 := func(cmp func(i, j int) bool) { + sort.Slice(pinfo, cmp) + list := pinfo + if len(list) > 10 { + list = list[:10] + } + var buf strings.Builder + for i, info := range list { + buf.WriteString(fmt.Sprintf("SQL %v: \n", i)) + fields := genLogFields(record.lastCheckTime.Sub(info.Time), info) + for _, field := range fields { + switch field.Type { + case zapcore.StringType: + buf.WriteString(fmt.Sprintf("%v: %v", field.Key, field.String)) + case zapcore.Uint8Type, zapcore.Uint16Type, zapcore.Uint32Type, zapcore.Uint64Type: + buf.WriteString(fmt.Sprintf("%v: %v", field.Key, uint64(field.Integer))) + case zapcore.Int8Type, zapcore.Int16Type, zapcore.Int32Type, zapcore.Int64Type: + buf.WriteString(fmt.Sprintf("%v: %v", field.Key, field.Integer)) + } + buf.WriteString("\n") + } + } + buf.WriteString("\n") + _, err = f.WriteString(buf.String()) + } + + _, err = f.WriteString("The 10 SQLs with the most memory usage for OOM analysis\n") + printTop10(func(i, j int) bool { + return pinfo[i].StmtCtx.MemTracker.MaxConsumed() > pinfo[j].StmtCtx.MemTracker.MaxConsumed() + }) + + _, err = f.WriteString("The 10 SQLs with the most time usage for OOM analysis\n") + printTop10(func(i, j int) bool { + return pinfo[i].Time.Before(pinfo[j].Time) + }) +} + +func (record *memoryUsageAlarm) recordProfile() { + items := []struct { + name string + debug int + }{ + {name: "heap"}, + {name: "goroutine", debug: 2}, + } + for i, item := range items { + fileName := filepath.Join(record.tmpDir, item.name+record.lastCheckTime.Format(time.RFC3339)) + record.lastProfileFileName[i] = append(record.lastProfileFileName[i], fileName) + f, err := os.Create(fileName) + if err != nil { + logutil.BgLogger().Error(fmt.Sprintf("create %v profile file fail", item.name), zap.Error(err)) + return + } + defer func() { + err := f.Close() + if err != nil { + logutil.BgLogger().Error(fmt.Sprintf("close %v profile file fail", item.name), zap.Error(err)) + } + }() + p := rpprof.Lookup(item.name) + err = p.WriteTo(f, item.debug) + if err != nil { + logutil.BgLogger().Error(fmt.Sprintf("write %v profile file fail", item.name), zap.Error(err)) + return + } + } +} diff --git a/util/gcutil/gcutil.go b/util/gcutil/gcutil.go index f265e4dd0603f..e307d876604e4 100644 --- a/util/gcutil/gcutil.go +++ b/util/gcutil/gcutil.go @@ -14,48 +14,38 @@ package gcutil import ( - "fmt" + "context" "github.com/pingcap/errors" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" - "github.com/pingcap/tidb/util" + "github.com/pingcap/tidb/store/tikv/oracle" + "github.com/pingcap/tidb/store/tikv/util" "github.com/pingcap/tidb/util/sqlexec" ) const ( - selectVariableValueSQL = `SELECT HIGH_PRIORITY variable_value FROM mysql.tidb WHERE variable_name='%s'` - insertVariableValueSQL = `INSERT HIGH_PRIORITY INTO mysql.tidb VALUES ('%[1]s', '%[2]s', '%[3]s') - ON DUPLICATE KEY - UPDATE variable_value = '%[2]s', comment = '%[3]s'` + selectVariableValueSQL = `SELECT HIGH_PRIORITY variable_value FROM mysql.tidb WHERE variable_name=%?` ) // CheckGCEnable is use to check whether GC is enable. func CheckGCEnable(ctx sessionctx.Context) (enable bool, err error) { - sql := fmt.Sprintf(selectVariableValueSQL, "tikv_gc_enable") - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + val, err := ctx.GetSessionVars().GlobalVarsAccessor.GetGlobalSysVar(variable.TiDBGCEnable) if err != nil { return false, errors.Trace(err) } - if len(rows) != 1 { - return false, errors.New("can not get 'tikv_gc_enable'") - } - return rows[0].GetString(0) == "true", nil + return variable.TiDBOptOn(val), nil } // DisableGC will disable GC enable variable. func DisableGC(ctx sessionctx.Context) error { - sql := fmt.Sprintf(insertVariableValueSQL, "tikv_gc_enable", "false", "Current GC enable status") - _, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) - return errors.Trace(err) + return ctx.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBGCEnable, variable.BoolOff) } // EnableGC will enable GC enable variable. func EnableGC(ctx sessionctx.Context) error { - sql := fmt.Sprintf(insertVariableValueSQL, "tikv_gc_enable", "true", "Current GC enable status") - _, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) - return errors.Trace(err) + return ctx.GetSessionVars().GlobalVarsAccessor.SetGlobalSysVar(variable.TiDBGCEnable, variable.BoolOn) } // ValidateSnapshot checks that the newly set snapshot time is after GC safe point time. @@ -80,8 +70,12 @@ func ValidateSnapshotWithGCSafePoint(snapshotTS, safePointTS uint64) error { // GetGCSafePoint loads GC safe point time from mysql.tidb. func GetGCSafePoint(ctx sessionctx.Context) (uint64, error) { - sql := fmt.Sprintf(selectVariableValueSQL, "tikv_gc_safe_point") - rows, _, err := ctx.(sqlexec.RestrictedSQLExecutor).ExecRestrictedSQL(sql) + exec := ctx.(sqlexec.RestrictedSQLExecutor) + stmt, err := exec.ParseWithParams(context.Background(), selectVariableValueSQL, "tikv_gc_safe_point") + if err != nil { + return 0, errors.Trace(err) + } + rows, _, err := exec.ExecRestrictedStmt(context.Background(), stmt) if err != nil { return 0, errors.Trace(err) } @@ -93,6 +87,6 @@ func GetGCSafePoint(ctx sessionctx.Context) (uint64, error) { if err != nil { return 0, errors.Trace(err) } - ts := variable.GoTimeToTS(safePointTime) + ts := oracle.GoTimeToTS(safePointTime) return ts, nil } diff --git a/util/gogc.go b/util/gogc.go index 3d49112825901..67d69a476848b 100644 --- a/util/gogc.go +++ b/util/gogc.go @@ -34,6 +34,9 @@ func init() { // SetGOGC update GOGC and related metrics. func SetGOGC(val int) { + if val <= 0 { + val = 100 + } debug.SetGCPercent(val) metrics.GOGC.Set(float64(val)) atomic.StoreInt64(&gogcValue, int64(val)) diff --git a/util/hack/hack.go b/util/hack/hack.go index ac59b77fd5a1f..849b64e8c0e4e 100644 --- a/util/hack/hack.go +++ b/util/hack/hack.go @@ -39,9 +39,19 @@ func String(b []byte) (s MutableString) { // Use at your own risk. func Slice(s string) (b []byte) { pbytes := (*reflect.SliceHeader)(unsafe.Pointer(&b)) - pstring := *(*reflect.StringHeader)(unsafe.Pointer(&s)) + pstring := (*reflect.StringHeader)(unsafe.Pointer(&s)) pbytes.Data = pstring.Data pbytes.Len = pstring.Len pbytes.Cap = pstring.Len return } + +// LoadFactor is the maximum average load of a bucket that triggers growth is 6.5 in Golang Map. +// Represent as LoadFactorNum/LoadFactorDen, to allow integer math. +// They are from the golang definition. ref: https://github.com/golang/go/blob/go1.13.15/src/runtime/map.go#L68-L71 +const ( + // LoadFactorNum is the numerator of load factor + LoadFactorNum = 13 + // LoadFactorDen is the denominator of load factor + LoadFactorDen = 2 +) diff --git a/util/hint/hint_processor.go b/util/hint/hint_processor.go index b1fd24ed20909..0cf43f7d01e33 100644 --- a/util/hint/hint_processor.go +++ b/util/hint/hint_processor.go @@ -23,9 +23,9 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/format" "github.com/pingcap/parser/model" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -62,6 +62,18 @@ func (hs *HintsSet) ContainTableHint(hint string) bool { return false } +// setTableHints4StmtNode sets table hints for select/update/delete. +func setTableHints4StmtNode(node ast.Node, hints []*ast.TableOptimizerHint) { + switch x := node.(type) { + case *ast.SelectStmt: + x.TableHints = hints + case *ast.UpdateStmt: + x.TableHints = hints + case *ast.DeleteStmt: + x.TableHints = hints + } +} + // ExtractTableHintsFromStmtNode extracts table hints from this node. func ExtractTableHintsFromStmtNode(node ast.Node, sctx sessionctx.Context) []*ast.TableOptimizerHint { switch x := node.(type) { @@ -72,7 +84,7 @@ func ExtractTableHintsFromStmtNode(node ast.Node, sctx sessionctx.Context) []*as case *ast.DeleteStmt: return x.TableHints case *ast.InsertStmt: - //check duplicated hints + // check duplicated hints checkInsertStmtHintDuplicated(node, sctx) return x.TableHints case *ast.ExplainStmt: @@ -105,7 +117,7 @@ func checkInsertStmtHintDuplicated(node ast.Node, sctx sessionctx.Context) { } if duplicatedHint != nil { hint := fmt.Sprintf("%s(`%v`)", duplicatedHint.HintName.O, duplicatedHint.HintData) - err := terror.ClassUtil.New(errno.ErrWarnConflictingHint, fmt.Sprintf(errno.MySQLErrName[errno.ErrWarnConflictingHint], hint)) + err := dbterror.ClassUtil.NewStd(errno.ErrWarnConflictingHint).FastGenByArgs(hint) sctx.GetSessionVars().StmtCtx.AppendWarning(err) } } @@ -180,22 +192,28 @@ type hintProcessor struct { bindHint2Ast bool tableCounter int indexCounter int + blockCounter int } func (hp *hintProcessor) Enter(in ast.Node) (ast.Node, bool) { switch v := in.(type) { - case *ast.SelectStmt: + case *ast.SelectStmt, *ast.UpdateStmt, *ast.DeleteStmt: if hp.bindHint2Ast { if hp.tableCounter < len(hp.tableHints) { - v.TableHints = hp.tableHints[hp.tableCounter] + setTableHints4StmtNode(in, hp.tableHints[hp.tableCounter]) } else { - v.TableHints = nil + setTableHints4StmtNode(in, nil) } hp.tableCounter++ } else { - hp.tableHints = append(hp.tableHints, v.TableHints) + hp.tableHints = append(hp.tableHints, ExtractTableHintsFromStmtNode(in, nil)) } + hp.blockCounter++ case *ast.TableName: + // Insert cases. + if hp.blockCounter == 0 { + return in, false + } if hp.bindHint2Ast { if hp.indexCounter < len(hp.indexHints) { v.IndexHints = hp.indexHints[hp.indexCounter] @@ -211,6 +229,10 @@ func (hp *hintProcessor) Enter(in ast.Node) (ast.Node, bool) { } func (hp *hintProcessor) Leave(in ast.Node) (ast.Node, bool) { + switch in.(type) { + case *ast.SelectStmt, *ast.UpdateStmt, *ast.DeleteStmt: + hp.blockCounter-- + } return in, true } @@ -229,29 +251,37 @@ func BindHint(stmt ast.StmtNode, hintsSet *HintsSet) ast.StmtNode { } // ParseHintsSet parses a SQL string, then collects and normalizes the HintsSet. -func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*HintsSet, []error, error) { +func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*HintsSet, ast.StmtNode, []error, error) { stmtNodes, warns, err := p.Parse(sql, charset, collation) if err != nil { - return nil, nil, err + return nil, nil, nil, err } if len(stmtNodes) != 1 { - return nil, nil, errors.New(fmt.Sprintf("bind_sql must be a single statement: %s", sql)) + return nil, nil, nil, errors.New(fmt.Sprintf("bind_sql must be a single statement: %s", sql)) } hs := CollectHint(stmtNodes[0]) processor := &BlockHintProcessor{} stmtNodes[0].Accept(processor) + topNodeType := nodeType4Stmt(stmtNodes[0]) for i, tblHints := range hs.tableHints { newHints := make([]*ast.TableOptimizerHint, 0, len(tblHints)) + curOffset := i + 1 + if topNodeType == TypeDelete || topNodeType == TypeUpdate { + curOffset = curOffset - 1 + } for _, tblHint := range tblHints { if tblHint.HintName.L == hintQBName { continue } - offset := processor.GetHintOffset(tblHint.QBName, TypeSelect, i+1) - if offset < 0 || !processor.checkTableQBName(tblHint.Tables, TypeSelect) { + offset := processor.GetHintOffset(tblHint.QBName, curOffset) + if offset < 0 || !processor.checkTableQBName(tblHint.Tables) { hintStr := RestoreTableOptimizerHint(tblHint) - return nil, nil, errors.New(fmt.Sprintf("Unknown query block name in hint %s", hintStr)) + return nil, nil, nil, errors.New(fmt.Sprintf("Unknown query block name in hint %s", hintStr)) + } + tblHint.QBName, err = GenerateQBName(topNodeType, offset) + if err != nil { + return nil, nil, nil, err } - tblHint.QBName = GenerateQBName(TypeSelect, offset) for i, tbl := range tblHint.Tables { if tbl.DBName.String() == "" { tblHint.Tables[i].DBName = model.NewCIStr(db) @@ -261,7 +291,7 @@ func ParseHintsSet(p *parser.Parser, sql, charset, collation, db string) (*Hints } hs.tableHints[i] = newHints } - return hs, extractHintWarns(warns), nil + return hs, stmtNodes[0], extractHintWarns(warns), nil } func extractHintWarns(warns []error) []error { @@ -360,11 +390,27 @@ const ( TypeDelete // TypeSelect for SELECT. TypeSelect + // TypeInvalid for unexpected statements. + TypeInvalid ) -// getBlockName finds the offset of query block name. It use 0 as offset for top level update or delete, +// nodeType4Stmt returns the NodeType for a statement. The type is used for SQL bind. +func nodeType4Stmt(node ast.StmtNode) NodeType { + switch node.(type) { + // This type is used by SQL bind, we only handle SQL bind for INSERT INTO SELECT, so we treat InsertStmt as TypeSelect. + case *ast.SelectStmt, *ast.InsertStmt: + return TypeSelect + case *ast.UpdateStmt: + return TypeUpdate + case *ast.DeleteStmt: + return TypeDelete + } + return TypeInvalid +} + +// getBlockName finds the offset of query block name. It uses 0 as offset for top level update or delete, // -1 for invalid block name. -func (p *BlockHintProcessor) getBlockOffset(blockName model.CIStr, nodeType NodeType) int { +func (p *BlockHintProcessor) getBlockOffset(blockName model.CIStr) int { if p.QbNameMap != nil { level, ok := p.QbNameMap[blockName.L] if ok { @@ -372,13 +418,10 @@ func (p *BlockHintProcessor) getBlockOffset(blockName model.CIStr, nodeType Node } } // Handle the default query block name. - if nodeType == TypeUpdate && blockName.L == defaultUpdateBlockName { - return 0 - } - if nodeType == TypeDelete && blockName.L == defaultDeleteBlockName { + if blockName.L == defaultUpdateBlockName || blockName.L == defaultDeleteBlockName { return 0 } - if nodeType == TypeSelect && strings.HasPrefix(blockName.L, defaultSelectBlockPrefix) { + if strings.HasPrefix(blockName.L, defaultSelectBlockPrefix) { suffix := blockName.L[len(defaultSelectBlockPrefix):] level, err := strconv.ParseInt(suffix, 10, 64) if err != nil || level > int64(p.selectStmtOffset) { @@ -390,16 +433,16 @@ func (p *BlockHintProcessor) getBlockOffset(blockName model.CIStr, nodeType Node } // GetHintOffset gets the offset of stmt that the hints take effects. -func (p *BlockHintProcessor) GetHintOffset(qbName model.CIStr, nodeType NodeType, currentOffset int) int { +func (p *BlockHintProcessor) GetHintOffset(qbName model.CIStr, currentOffset int) int { if qbName.L != "" { - return p.getBlockOffset(qbName, nodeType) + return p.getBlockOffset(qbName) } return currentOffset } -func (p *BlockHintProcessor) checkTableQBName(tables []ast.HintTable, nodeType NodeType) bool { +func (p *BlockHintProcessor) checkTableQBName(tables []ast.HintTable) bool { for _, table := range tables { - if table.QBName.L != "" && p.getBlockOffset(table.QBName, nodeType) < 0 { + if table.QBName.L != "" && p.getBlockOffset(table.QBName) < 0 { return false } } @@ -407,7 +450,7 @@ func (p *BlockHintProcessor) checkTableQBName(tables []ast.HintTable, nodeType N } // GetCurrentStmtHints extracts all hints that take effects at current stmt. -func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint, nodeType NodeType, currentOffset int) []*ast.TableOptimizerHint { +func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint, currentOffset int) []*ast.TableOptimizerHint { if p.QbHints == nil { p.QbHints = make(map[int][]*ast.TableOptimizerHint) } @@ -415,8 +458,8 @@ func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint if hint.HintName.L == hintQBName { continue } - offset := p.GetHintOffset(hint.QBName, nodeType, currentOffset) - if offset < 0 || !p.checkTableQBName(hint.Tables, nodeType) { + offset := p.GetHintOffset(hint.QBName, currentOffset) + if offset < 0 || !p.checkTableQBName(hint.Tables) { hintStr := RestoreTableOptimizerHint(hint) p.Ctx.GetSessionVars().StmtCtx.AppendWarning(errors.New(fmt.Sprintf("Hint %s is ignored due to unknown query block name", hintStr))) continue @@ -427,11 +470,15 @@ func (p *BlockHintProcessor) GetCurrentStmtHints(hints []*ast.TableOptimizerHint } // GenerateQBName builds QBName from offset. -func GenerateQBName(nodeType NodeType, blockOffset int) model.CIStr { - if nodeType == TypeDelete && blockOffset == 0 { - return model.NewCIStr(defaultDeleteBlockName) - } else if nodeType == TypeUpdate && blockOffset == 0 { - return model.NewCIStr(defaultUpdateBlockName) +func GenerateQBName(nodeType NodeType, blockOffset int) (model.CIStr, error) { + if blockOffset == 0 { + if nodeType == TypeDelete { + return model.NewCIStr(defaultDeleteBlockName), nil + } + if nodeType == TypeUpdate { + return model.NewCIStr(defaultUpdateBlockName), nil + } + return model.NewCIStr(""), errors.New(fmt.Sprintf("Unexpected NodeType %d when block offset is 0", nodeType)) } - return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, blockOffset)) + return model.NewCIStr(fmt.Sprintf("%s%d", defaultSelectBlockPrefix, blockOffset)), nil } diff --git a/util/localpool/localpool_test.go b/util/localpool/localpool_test.go index fc62c80581ffd..77c4f92e80171 100644 --- a/util/localpool/localpool_test.go +++ b/util/localpool/localpool_test.go @@ -25,7 +25,8 @@ import ( ) type Obj struct { - val int64 + // nolint:unused + val int64 // nolint:structcheck // Dummy field to make it non-empty. } func TestT(t *testing.T) { diff --git a/util/logutil/hex_test.go b/util/logutil/hex_test.go index 44c989f9da4c8..1c2e3cca66dbe 100644 --- a/util/logutil/hex_test.go +++ b/util/logutil/hex_test.go @@ -38,7 +38,7 @@ func (s *testHexSuite) TestHex(c *C) { region.StartKey = []byte{'t', 200, '\\', 000, 000, 000, '\\', 000, 000, 000, 37, '-', 000, 000, 000, 000, 000, 000, 000, 37} region.EndKey = []byte("3asg3asd") - c.Assert(logutil.Hex(®ion).String(), Equals, "{Id:6662 StartKey:74c85c0000005c000000252d0000000000000025 EndKey:3361736733617364 RegionEpoch: Peers:[]}") + c.Assert(logutil.Hex(®ion).String(), Equals, "{Id:6662 StartKey:74c85c0000005c000000252d0000000000000025 EndKey:3361736733617364 RegionEpoch: Peers:[] EncryptionMeta:}") } func (s *testHexSuite) TestPrettyPrint(c *C) { diff --git a/util/logutil/log.go b/util/logutil/log.go index 55bbc950c3ebd..48088318b2d6b 100644 --- a/util/logutil/log.go +++ b/util/logutil/log.go @@ -29,6 +29,7 @@ import ( tlog "github.com/opentracing/opentracing-go/log" "github.com/pingcap/errors" zaplog "github.com/pingcap/log" + tikvlog "github.com/pingcap/tidb/store/tikv/logutil" log "github.com/sirupsen/logrus" "go.uber.org/zap" "go.uber.org/zap/zapcore" @@ -283,6 +284,9 @@ func InitLogger(cfg *LogConfig) error { SlowQueryLogger.Formatter = &slowLogFormatter{} } + // Setup log key for tikv client. + tikvlog.CtxLogKey = ctxLogKey + return nil } @@ -346,18 +350,18 @@ func BgLogger() *zap.Logger { } // WithConnID attaches connId to context. -func WithConnID(ctx context.Context, connID uint32) context.Context { +func WithConnID(ctx context.Context, connID uint64) context.Context { var logger *zap.Logger if ctxLogger, ok := ctx.Value(ctxLogKey).(*zap.Logger); ok { logger = ctxLogger } else { logger = zaplog.L() } - return context.WithValue(ctx, ctxLogKey, logger.With(zap.Uint32("conn", connID))) + return context.WithValue(ctx, ctxLogKey, logger.With(zap.Uint64("conn", connID))) } // WithTraceLogger attaches trace identifier to context -func WithTraceLogger(ctx context.Context, connID uint32) context.Context { +func WithTraceLogger(ctx context.Context, connID uint64) context.Context { var logger *zap.Logger if ctxLogger, ok := ctx.Value(ctxLogKey).(*zap.Logger); ok { logger = ctxLogger @@ -367,11 +371,11 @@ func WithTraceLogger(ctx context.Context, connID uint32) context.Context { return context.WithValue(ctx, ctxLogKey, wrapTraceLogger(ctx, connID, logger)) } -func wrapTraceLogger(ctx context.Context, connID uint32, logger *zap.Logger) *zap.Logger { +func wrapTraceLogger(ctx context.Context, connID uint64, logger *zap.Logger) *zap.Logger { return logger.WithOptions(zap.WrapCore(func(core zapcore.Core) zapcore.Core { tl := &traceLog{ctx: ctx} traceCore := zaplog.NewTextCore(zaplog.NewTextEncoder(&zaplog.Config{}), tl, tl). - With([]zapcore.Field{zap.Uint32("conn", connID)}) + With([]zapcore.Field{zap.Uint64("conn", connID)}) return zapcore.NewTee(traceCore, core) })) } diff --git a/util/logutil/log_test.go b/util/logutil/log_test.go index a0dd64b9968dd..4961aa28e98f1 100644 --- a/util/logutil/log_test.go +++ b/util/logutil/log_test.go @@ -215,7 +215,7 @@ func (s *testLogSuite) TestZapLoggerWithKeys(c *C) { conf := NewLogConfig("info", DefaultLogFormat, "", fileCfg, false) err := InitZapLogger(conf) c.Assert(err, IsNil) - connID := uint32(123) + connID := uint64(123) ctx := WithConnID(context.Background(), connID) s.testZapLogger(ctx, c, fileCfg.Filename, zapLogWithConnIDPattern) os.Remove(fileCfg.Filename) diff --git a/util/memory/action.go b/util/memory/action.go index b1081ba5c1adc..4f12a5d90f139 100644 --- a/util/memory/action.go +++ b/util/memory/action.go @@ -17,8 +17,8 @@ import ( "fmt" "sync" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" + "github.com/pingcap/tidb/util/dbterror" "github.com/pingcap/tidb/util/logutil" "go.uber.org/zap" ) @@ -35,10 +35,39 @@ type ActionOnExceed interface { // SetFallback sets a fallback action which will be triggered if itself has // already been triggered. SetFallback(a ActionOnExceed) + // GetFallback get the fallback action of the Action. + GetFallback() ActionOnExceed + // GetPriority get the priority of the Action. + GetPriority() int64 } +// BaseOOMAction manages the fallback action for all Action. +type BaseOOMAction struct { + fallbackAction ActionOnExceed +} + +// SetFallback sets a fallback action which will be triggered if itself has +// already been triggered. +func (b *BaseOOMAction) SetFallback(a ActionOnExceed) { + b.fallbackAction = a +} + +// GetFallback get the fallback action of the Action. +func (b *BaseOOMAction) GetFallback() ActionOnExceed { + return b.fallbackAction +} + +// Default OOM Action priority. +const ( + DefPanicPriority = iota + DefLogPriority + DefSpillPriority + DefRateLimitPriority +) + // LogOnExceed logs a warning only once when memory usage exceeds memory quota. type LogOnExceed struct { + BaseOOMAction mutex sync.Mutex // For synchronization. acted bool ConnID uint64 @@ -65,11 +94,14 @@ func (a *LogOnExceed) Action(t *Tracker) { } } -// SetFallback sets a fallback action. -func (a *LogOnExceed) SetFallback(ActionOnExceed) {} +// GetPriority get the priority of the Action +func (a *LogOnExceed) GetPriority() int64 { + return DefLogPriority +} // PanicOnExceed panics when memory usage exceeds memory quota. type PanicOnExceed struct { + BaseOOMAction mutex sync.Mutex // For synchronization. acted bool ConnID uint64 @@ -96,11 +128,13 @@ func (a *PanicOnExceed) Action(t *Tracker) { panic(PanicMemoryExceed + fmt.Sprintf("[conn_id=%d]", a.ConnID)) } -// SetFallback sets a fallback action. -func (a *PanicOnExceed) SetFallback(ActionOnExceed) {} +// GetPriority get the priority of the Action +func (a *PanicOnExceed) GetPriority() int64 { + return DefPanicPriority +} var ( - errMemExceedThreshold = terror.ClassUtil.New(errno.ErrMemExceedThreshold, errno.MySQLErrName[errno.ErrMemExceedThreshold]) + errMemExceedThreshold = dbterror.ClassUtil.NewStd(errno.ErrMemExceedThreshold) ) const ( diff --git a/util/memory/meminfo.go b/util/memory/meminfo.go index cf989203036a2..6289a46c8b286 100644 --- a/util/memory/meminfo.go +++ b/util/memory/meminfo.go @@ -14,17 +14,166 @@ package memory import ( + "io/ioutil" + "strconv" + "strings" + "sync" + "time" + + "github.com/pingcap/parser/terror" "github.com/shirou/gopsutil/mem" ) // MemTotal returns the total amount of RAM on this system -func MemTotal() (uint64, error) { +var MemTotal func() (uint64, error) + +// MemUsed returns the total used amount of RAM on this system +var MemUsed func() (uint64, error) + +// MemTotalNormal returns the total amount of RAM on this system in non-container environment. +func MemTotalNormal() (uint64, error) { + total, t := memLimit.get() + if time.Since(t) < 60*time.Second { + return total, nil + } v, err := mem.VirtualMemory() - return v.Total, err + if err != nil { + return v.Total, err + } + memLimit.set(v.Total, time.Now()) + return v.Total, nil } -// MemUsed returns the total used amount of RAM on this system -func MemUsed() (uint64, error) { +// MemUsedNormal returns the total used amount of RAM on this system in non-container environment. +func MemUsedNormal() (uint64, error) { + used, t := memUsage.get() + if time.Since(t) < 500*time.Millisecond { + return used, nil + } v, err := mem.VirtualMemory() - return v.Total - (v.Free + v.Buffers + v.Cached), err + if err != nil { + return v.Used, err + } + memUsage.set(v.Used, time.Now()) + return v.Used, nil +} + +const ( + cGroupMemLimitPath = "/sys/fs/cgroup/memory/memory.limit_in_bytes" + cGroupMemUsagePath = "/sys/fs/cgroup/memory/memory.usage_in_bytes" + selfCGroupPath = "/proc/self/cgroup" +) + +type memInfoCache struct { + *sync.RWMutex + mem uint64 + updateTime time.Time +} + +func (c *memInfoCache) get() (mem uint64, t time.Time) { + c.RLock() + defer c.RUnlock() + mem, t = c.mem, c.updateTime + return +} + +func (c *memInfoCache) set(mem uint64, t time.Time) { + c.Lock() + defer c.Unlock() + c.mem, c.updateTime = mem, t +} + +// expiration time is 60s +var memLimit *memInfoCache + +// expiration time is 500ms +var memUsage *memInfoCache + +// MemTotalCGroup returns the total amount of RAM on this system in container environment. +func MemTotalCGroup() (uint64, error) { + mem, t := memLimit.get() + if time.Since(t) < 60*time.Second { + return mem, nil + } + mem, err := readUint(cGroupMemLimitPath) + if err != nil { + return mem, err + } + memLimit.set(mem, time.Now()) + return mem, nil +} + +// MemUsedCGroup returns the total used amount of RAM on this system in container environment. +func MemUsedCGroup() (uint64, error) { + mem, t := memUsage.get() + if time.Since(t) < 500*time.Millisecond { + return mem, nil + } + mem, err := readUint(cGroupMemUsagePath) + if err != nil { + return mem, err + } + memUsage.set(mem, time.Now()) + return mem, nil +} + +func init() { + if inContainer() { + MemTotal = MemTotalCGroup + MemUsed = MemUsedCGroup + } else { + MemTotal = MemTotalNormal + MemUsed = MemUsedNormal + } + memLimit = &memInfoCache{ + RWMutex: &sync.RWMutex{}, + } + memUsage = &memInfoCache{ + RWMutex: &sync.RWMutex{}, + } + _, err := MemTotal() + terror.MustNil(err) + _, err = MemUsed() + terror.MustNil(err) +} + +func inContainer() bool { + v, err := ioutil.ReadFile(selfCGroupPath) + if err != nil { + return false + } + if strings.Contains(string(v), "docker") || + strings.Contains(string(v), "kubepods") || + strings.Contains(string(v), "containerd") { + return true + } + return false +} + +// refer to https://github.com/containerd/cgroups/blob/318312a373405e5e91134d8063d04d59768a1bff/utils.go#L251 +func parseUint(s string, base, bitSize int) (uint64, error) { + v, err := strconv.ParseUint(s, base, bitSize) + if err != nil { + intValue, intErr := strconv.ParseInt(s, base, bitSize) + // 1. Handle negative values greater than MinInt64 (and) + // 2. Handle negative values lesser than MinInt64 + if intErr == nil && intValue < 0 { + return 0, nil + } else if intErr != nil && + intErr.(*strconv.NumError).Err == strconv.ErrRange && + intValue < 0 { + return 0, nil + } + return 0, err + } + return v, nil +} + +// refer to https://github.com/containerd/cgroups/blob/318312a373405e5e91134d8063d04d59768a1bff/utils.go#L243 +func readUint(path string) (uint64, error) { + v, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + return parseUint(strings.TrimSpace(string(v)), 10, 64) } diff --git a/util/memory/tracker.go b/util/memory/tracker.go index a0edbdf912c80..3c369724c229e 100644 --- a/util/memory/tracker.go +++ b/util/memory/tracker.go @@ -16,6 +16,8 @@ package memory import ( "bytes" "fmt" + "sort" + "strconv" "sync" "sync/atomic" ) @@ -42,7 +44,7 @@ type Tracker struct { sync.Mutex // The children memory trackers. If the Tracker is the Global Tracker, like executor.GlobalDiskUsageTracker, // we wouldn't maintain its children in order to avoiding mutex contention. - children []*Tracker + children map[int][]*Tracker } actionMu struct { sync.Mutex @@ -120,8 +122,31 @@ func (t *Tracker) SetActionOnExceed(a ActionOnExceed) { func (t *Tracker) FallbackOldAndSetNewAction(a ActionOnExceed) { t.actionMu.Lock() defer t.actionMu.Unlock() - a.SetFallback(t.actionMu.actionOnExceed) - t.actionMu.actionOnExceed = a + t.actionMu.actionOnExceed = reArrangeFallback(t.actionMu.actionOnExceed, a) +} + +// GetFallbackForTest get the oom action used by test. +func (t *Tracker) GetFallbackForTest() ActionOnExceed { + t.actionMu.Lock() + defer t.actionMu.Unlock() + return t.actionMu.actionOnExceed +} + +// reArrangeFallback merge two action chains and rearrange them by priority in descending order. +func reArrangeFallback(a ActionOnExceed, b ActionOnExceed) ActionOnExceed { + if a == nil { + return b + } + if b == nil { + return a + } + if a.GetPriority() < b.GetPriority() { + a, b = b, a + a.SetFallback(b) + } else { + a.SetFallback(reArrangeFallback(a.GetFallback(), b)) + } + return a } // SetLabel sets the label of a Tracker. @@ -143,7 +168,10 @@ func (t *Tracker) AttachTo(parent *Tracker) { oldParent.remove(t) } parent.mu.Lock() - parent.mu.children = append(parent.mu.children, t) + if parent.mu.children == nil { + parent.mu.children = make(map[int][]*Tracker) + } + parent.mu.children[t.label] = append(parent.mu.children[t.label], t) parent.mu.Unlock() t.setParent(parent) @@ -164,12 +192,21 @@ func (t *Tracker) Detach() { func (t *Tracker) remove(oldChild *Tracker) { found := false + label := oldChild.label t.mu.Lock() - for i, child := range t.mu.children { - if child == oldChild { - t.mu.children = append(t.mu.children[:i], t.mu.children[i+1:]...) - found = true - break + if t.mu.children != nil { + children := t.mu.children[label] + for i, child := range children { + if child == oldChild { + children = append(children[:i], children[i+1:]...) + if len(children) > 0 { + t.mu.children[label] = children + } else { + delete(t.mu.children, label) + } + found = true + break + } } } t.mu.Unlock() @@ -188,19 +225,30 @@ func (t *Tracker) ReplaceChild(oldChild, newChild *Tracker) { return } + if oldChild.label != newChild.label { + t.remove(oldChild) + newChild.AttachTo(t) + return + } + newConsumed := newChild.BytesConsumed() newChild.setParent(t) + label := oldChild.label t.mu.Lock() - for i, child := range t.mu.children { - if child != oldChild { - continue - } + if t.mu.children != nil { + children := t.mu.children[label] + for i, child := range children { + if child != oldChild { + continue + } - newConsumed -= oldChild.BytesConsumed() - oldChild.setParent(nil) - t.mu.children[i] = newChild - break + newConsumed -= oldChild.BytesConsumed() + oldChild.setParent(nil) + children[i] = newChild + t.mu.children[label] = children + break + } } t.mu.Unlock() @@ -248,30 +296,14 @@ func (t *Tracker) MaxConsumed() int64 { return atomic.LoadInt64(&t.maxConsumed) } -// SearchTracker searches the specific tracker under this tracker. -func (t *Tracker) SearchTracker(label int) *Tracker { - if t.label == label { - return t - } - t.mu.Lock() - defer t.mu.Unlock() - for _, child := range t.mu.children { - if result := child.SearchTracker(label); result != nil { - return result - } - } - return nil -} - // SearchTrackerWithoutLock searches the specific tracker under this tracker without lock. func (t *Tracker) SearchTrackerWithoutLock(label int) *Tracker { if t.label == label { return t } - for _, child := range t.mu.children { - if result := child.SearchTrackerWithoutLock(label); result != nil { - return result - } + children := t.mu.children[label] + if len(children) > 0 { + return children[0] } return nil } @@ -286,33 +318,44 @@ func (t *Tracker) String() string { func (t *Tracker) toString(indent string, buffer *bytes.Buffer) { fmt.Fprintf(buffer, "%s\"%d\"{\n", indent, t.label) if t.bytesLimit > 0 { - fmt.Fprintf(buffer, "%s \"quota\": %s\n", indent, t.BytesToString(t.bytesLimit)) + fmt.Fprintf(buffer, "%s \"quota\": %s\n", indent, t.FormatBytes(t.bytesLimit)) } - fmt.Fprintf(buffer, "%s \"consumed\": %s\n", indent, t.BytesToString(t.BytesConsumed())) + fmt.Fprintf(buffer, "%s \"consumed\": %s\n", indent, t.FormatBytes(t.BytesConsumed())) t.mu.Lock() - for i := range t.mu.children { - if t.mu.children[i] != nil { - t.mu.children[i].toString(indent+" ", buffer) + labels := make([]int, 0, len(t.mu.children)) + for label := range t.mu.children { + labels = append(labels, label) + } + sort.Ints(labels) + for _, label := range labels { + children := t.mu.children[label] + for _, child := range children { + child.toString(indent+" ", buffer) } } t.mu.Unlock() buffer.WriteString(indent + "}\n") } +// FormatBytes uses to format bytes, this function will prune precision before format bytes. +func (t *Tracker) FormatBytes(numBytes int64) string { + return FormatBytes(numBytes) +} + // BytesToString converts the memory consumption to a readable string. -func (t *Tracker) BytesToString(numBytes int64) string { - GB := float64(numBytes) / float64(1<<30) +func BytesToString(numBytes int64) string { + GB := float64(numBytes) / float64(byteSizeGB) if GB > 1 { return fmt.Sprintf("%v GB", GB) } - MB := float64(numBytes) / float64(1<<20) + MB := float64(numBytes) / float64(byteSizeMB) if MB > 1 { return fmt.Sprintf("%v MB", MB) } - KB := float64(numBytes) / float64(1<<10) + KB := float64(numBytes) / float64(byteSizeKB) if KB > 1 { return fmt.Sprintf("%v KB", KB) } @@ -320,6 +363,43 @@ func (t *Tracker) BytesToString(numBytes int64) string { return fmt.Sprintf("%v Bytes", numBytes) } +const ( + byteSizeGB = int64(1 << 30) + byteSizeMB = int64(1 << 20) + byteSizeKB = int64(1 << 10) + byteSizeBB = int64(1) +) + +// FormatBytes uses to format bytes, this function will prune precision before format bytes. +func FormatBytes(numBytes int64) string { + if numBytes <= byteSizeKB { + return BytesToString(numBytes) + } + unit, unitStr := getByteUnit(numBytes) + if unit == byteSizeBB { + return BytesToString(numBytes) + } + v := float64(numBytes) / float64(unit) + decimal := 1 + if numBytes%unit == 0 { + decimal = 0 + } else if v < 10 { + decimal = 2 + } + return fmt.Sprintf("%v %s", strconv.FormatFloat(v, 'f', decimal, 64), unitStr) +} + +func getByteUnit(b int64) (int64, string) { + if b > byteSizeGB { + return byteSizeGB, "GB" + } else if b > byteSizeMB { + return byteSizeMB, "MB" + } else if b > byteSizeKB { + return byteSizeKB, "KB" + } + return byteSizeBB, "Bytes" +} + // AttachToGlobalTracker attach the tracker to the global tracker // AttachToGlobalTracker should be called at the initialization for the session executor's tracker func (t *Tracker) AttachToGlobalTracker(globalTracker *Tracker) { diff --git a/util/memory/tracker_test.go b/util/memory/tracker_test.go index 3dbd11ab001bb..4538d25d5504a 100644 --- a/util/memory/tracker_test.go +++ b/util/memory/tracker_test.go @@ -14,8 +14,11 @@ package memory import ( + "errors" "math/rand" "os" + "strconv" + "strings" "sync" "testing" @@ -30,7 +33,10 @@ import ( func TestT(t *testing.T) { CustomVerboseFlag = true logLevel := os.Getenv("log_level") - logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + err := logutil.InitLogger(logutil.NewLogConfig(logLevel, logutil.DefaultLogFormat, "", logutil.EmptyFileLogConfig, false)) + if err != nil { + t.Errorf(err.Error()) + } TestingT(t) } @@ -106,31 +112,32 @@ func (s *testSuite) TestOOMAction(c *C) { c.Assert(action1.called, IsFalse) c.Assert(action2.called, IsFalse) tracker.Consume(10000) - c.Assert(action1.called, IsFalse) - c.Assert(action2.called, IsTrue) + c.Assert(action1.called, IsTrue) + c.Assert(action2.called, IsFalse) tracker.Consume(10000) c.Assert(action1.called, IsTrue) c.Assert(action2.called, IsTrue) } type mockAction struct { + BaseOOMAction called bool - fallback ActionOnExceed + priority int64 } func (a *mockAction) SetLogHook(hook func(uint64)) { } func (a *mockAction) Action(t *Tracker) { - if a.called && a.fallback != nil { - a.fallback.Action(t) + if a.called && a.fallbackAction != nil { + a.fallbackAction.Action(t) return } a.called = true } -func (a *mockAction) SetFallback(fallback ActionOnExceed) { - a.fallback = fallback +func (a *mockAction) GetPriority() int64 { + return a.priority } func (s *testSuite) TestAttachTo(c *C) { @@ -143,7 +150,7 @@ func (s *testSuite) TestAttachTo(c *C) { c.Assert(oldParent.BytesConsumed(), Equals, int64(100)) c.Assert(child.getParent(), DeepEquals, oldParent) c.Assert(len(oldParent.mu.children), Equals, 1) - c.Assert(oldParent.mu.children[0], DeepEquals, child) + c.Assert(oldParent.mu.children[child.label][0], DeepEquals, child) child.AttachTo(newParent) c.Assert(child.BytesConsumed(), Equals, int64(100)) @@ -151,7 +158,7 @@ func (s *testSuite) TestAttachTo(c *C) { c.Assert(newParent.BytesConsumed(), Equals, int64(100)) c.Assert(child.getParent(), DeepEquals, newParent) c.Assert(len(newParent.mu.children), Equals, 1) - c.Assert(newParent.mu.children[0], DeepEquals, child) + c.Assert(newParent.mu.children[child.label][0], DeepEquals, child) c.Assert(len(oldParent.mu.children), Equals, 0) } @@ -163,7 +170,7 @@ func (s *testSuite) TestDetach(c *C) { c.Assert(child.BytesConsumed(), Equals, int64(100)) c.Assert(parent.BytesConsumed(), Equals, int64(100)) c.Assert(len(parent.mu.children), Equals, 1) - c.Assert(parent.mu.children[0], DeepEquals, child) + c.Assert(parent.mu.children[child.label][0], DeepEquals, child) child.Detach() c.Assert(child.BytesConsumed(), Equals, int64(100)) @@ -185,14 +192,14 @@ func (s *testSuite) TestReplaceChild(c *C) { parent.ReplaceChild(oldChild, newChild) c.Assert(parent.BytesConsumed(), Equals, int64(500)) c.Assert(len(parent.mu.children), Equals, 1) - c.Assert(parent.mu.children[0], DeepEquals, newChild) + c.Assert(parent.mu.children[newChild.label][0], DeepEquals, newChild) c.Assert(newChild.getParent(), DeepEquals, parent) c.Assert(oldChild.getParent(), IsNil) parent.ReplaceChild(oldChild, nil) c.Assert(parent.BytesConsumed(), Equals, int64(500)) c.Assert(len(parent.mu.children), Equals, 1) - c.Assert(parent.mu.children[0], DeepEquals, newChild) + c.Assert(parent.mu.children[newChild.label][0], DeepEquals, newChild) c.Assert(newChild.getParent(), DeepEquals, parent) c.Assert(oldChild.getParent(), IsNil) @@ -233,7 +240,7 @@ func (s *testSuite) TestToString(c *C) { c.Assert(parent.String(), Equals, ` "1"{ - "consumed": 4.00293168798089 GB + "consumed": 4.00 GB "2"{ "quota": 1000 Bytes "consumed": 100 Bytes @@ -327,6 +334,89 @@ func (s *testSuite) TestGlobalTracker(c *C) { } +func (s *testSuite) parseByteUnit(str string) (int64, error) { + u := strings.TrimSpace(str) + switch u { + case "GB": + return byteSizeGB, nil + case "MB": + return byteSizeMB, nil + case "KB": + return byteSizeKB, nil + case "Bytes": + return byteSizeBB, nil + } + return 0, errors.New("invalid byte unit: " + str) +} + +func (s *testSuite) parseByte(str string) (int64, error) { + vBuf := make([]byte, 0, len(str)) + uBuf := make([]byte, 0, 2) + b := int64(0) + for _, v := range str { + if (v >= '0' && v <= '9') || v == '.' { + vBuf = append(vBuf, byte(v)) + } else if v != ' ' { + uBuf = append(uBuf, byte(v)) + } + } + unit, err := s.parseByteUnit(string(uBuf)) + if err != nil { + return 0, err + } + v, err := strconv.ParseFloat(string(vBuf), 64) + if err != nil { + return 0, err + } + b = int64(v * float64(unit)) + return b, nil +} + +func (s *testSuite) TestFormatBytesWithPrune(c *C) { + cases := []struct { + b string + s string + }{ + {"0 Bytes", "0 Bytes"}, + {"1 Bytes", "1 Bytes"}, + {"9 Bytes", "9 Bytes"}, + {"10 Bytes", "10 Bytes"}, + {"999 Bytes", "999 Bytes"}, + {"1 KB", "1024 Bytes"}, + {"1.123 KB", "1.12 KB"}, + {"1.023 KB", "1.02 KB"}, + {"1.003 KB", "1.00 KB"}, + {"10.456 KB", "10.5 KB"}, + {"10.956 KB", "11.0 KB"}, + {"999.056 KB", "999.1 KB"}, + {"999.988 KB", "1000.0 KB"}, + {"1.123 MB", "1.12 MB"}, + {"1.023 MB", "1.02 MB"}, + {"1.003 MB", "1.00 MB"}, + {"10.456 MB", "10.5 MB"}, + {"10.956 MB", "11.0 MB"}, + {"999.056 MB", "999.1 MB"}, + {"999.988 MB", "1000.0 MB"}, + {"1.123 GB", "1.12 GB"}, + {"1.023 GB", "1.02 GB"}, + {"1.003 GB", "1.00 GB"}, + {"10.456 GB", "10.5 GB"}, + {"10.956 GB", "11.0 GB"}, + {"9.412345 MB", "9.41 MB"}, + {"10.412345 MB", "10.4 MB"}, + {"5.999 GB", "6.00 GB"}, + {"100.46 KB", "100.5 KB"}, + {"18.399999618530273 MB", "18.4 MB"}, + {"9.15999984741211 MB", "9.16 MB"}, + } + for _, ca := range cases { + b, err := s.parseByte(ca.b) + c.Assert(err, IsNil) + result := FormatBytes(b) + c.Assert(result, Equals, ca.s, Commentf("input: %v", ca.b)) + } +} + func BenchmarkConsume(b *testing.B) { tracker := NewTracker(1, -1) b.RunParallel(func(pb *testing.PB) { @@ -341,3 +431,38 @@ func BenchmarkConsume(b *testing.B) { func (s *testSuite) TestErrorCode(c *C) { c.Assert(int(terror.ToSQLError(errMemExceedThreshold).Code), Equals, errno.ErrMemExceedThreshold) } + +func (s *testSuite) TestOOMActionPriority(c *C) { + tracker := NewTracker(1, 100) + // make sure no panic here. + tracker.Consume(10000) + + tracker = NewTracker(1, 1) + tracker.actionMu.actionOnExceed = nil + n := 100 + actions := make([]*mockAction, n) + for i := 0; i < n; i++ { + actions[i] = &mockAction{priority: int64(i)} + } + + randomSuffle := make([]int, n) + for i := 0; i < n; i++ { + randomSuffle[i] = i + pos := rand.Int() % (i + 1) + randomSuffle[i], randomSuffle[pos] = randomSuffle[pos], randomSuffle[i] + } + + for i := 0; i < n; i++ { + tracker.FallbackOldAndSetNewAction(actions[randomSuffle[i]]) + } + for i := n - 1; i >= 0; i-- { + tracker.Consume(100) + for j := n - 1; j >= 0; j-- { + if j >= i { + c.Assert(actions[j].called, IsTrue) + } else { + c.Assert(actions[j].called, IsFalse) + } + } + } +} diff --git a/util/misc.go b/util/misc.go index 2d731f48bbcc7..13192f5811ccd 100644 --- a/util/misc.go +++ b/util/misc.go @@ -47,8 +47,6 @@ const ( DefaultMaxRetries = 30 // RetryInterval indicates retry interval. RetryInterval uint64 = 500 - // GCTimeFormat is the format that gc_worker used to store times. - GCTimeFormat = "20060102-15:04:05 -0700" ) // RunWithRetry will run the f with backoff and retry. @@ -125,26 +123,6 @@ func Recover(metricsLabel, funcInfo string, recoverFn func(), quit bool) { } } -// CompatibleParseGCTime parses a string with `GCTimeFormat` and returns a time.Time. If `value` can't be parsed as that -// format, truncate to last space and try again. This function is only useful when loading times that saved by -// gc_worker. We have changed the format that gc_worker saves time (removed the last field), but when loading times it -// should be compatible with the old format. -func CompatibleParseGCTime(value string) (time.Time, error) { - t, err := time.Parse(GCTimeFormat, value) - - if err != nil { - // Remove the last field that separated by space - parts := strings.Split(value, " ") - prefix := strings.Join(parts[:len(parts)-1], " ") - t, err = time.Parse(GCTimeFormat, prefix) - } - - if err != nil { - err = errors.Errorf("string \"%v\" doesn't has a prefix that matches format \"%v\"", value, GCTimeFormat) - } - return t, err -} - // HasCancelled checks whether context has be cancelled. func HasCancelled(ctx context.Context) (cancel bool) { select { @@ -165,7 +143,7 @@ func SyntaxError(err error) error { if err == nil { return nil } - logutil.BgLogger().Error("syntax error", zap.Error(err)) + logutil.BgLogger().Debug("syntax error", zap.Error(err)) // If the error is already a terror with stack, pass it through. if errors.HasStack(err) { @@ -524,7 +502,8 @@ func InternalHTTPSchema() string { } func initInternalClient() { - tlsCfg, err := config.GetGlobalConfig().Security.ToTLSConfig() + clusterSecurity := config.GetGlobalConfig().Security.ClusterSecurity() + tlsCfg, err := clusterSecurity.ToTLSConfig() if err != nil { logutil.BgLogger().Fatal("could not load cluster ssl", zap.Error(err)) } diff --git a/util/misc_test.go b/util/misc_test.go index 71403438d91f2..6a48ed19388f3 100644 --- a/util/misc_test.go +++ b/util/misc_test.go @@ -81,49 +81,6 @@ func (s *testMiscSuite) TestRunWithRetry(c *C) { c.Assert(cnt, Equals, 1) } -func (s *testMiscSuite) TestCompatibleParseGCTime(c *C) { - values := []string{ - "20181218-19:53:37 +0800 CST", - "20181218-19:53:37 +0800 MST", - "20181218-19:53:37 +0800 FOO", - "20181218-19:53:37 +0800 +08", - "20181218-19:53:37 +0800", - "20181218-19:53:37 +0800 ", - "20181218-11:53:37 +0000", - } - - invalidValues := []string{ - "", - " ", - "foo", - "20181218-11:53:37", - "20181218-19:53:37 +0800CST", - "20181218-19:53:37 +0800 FOO BAR", - "20181218-19:53:37 +0800FOOOOOOO BAR", - "20181218-19:53:37 ", - } - - expectedTime := time.Date(2018, 12, 18, 11, 53, 37, 0, time.UTC) - expectedTimeFormatted := "20181218-19:53:37 +0800" - - beijing, err := time.LoadLocation("Asia/Shanghai") - c.Assert(err, IsNil) - - for _, value := range values { - t, err := CompatibleParseGCTime(value) - c.Assert(err, IsNil) - c.Assert(t.Equal(expectedTime), Equals, true) - - formatted := t.In(beijing).Format(GCTimeFormat) - c.Assert(formatted, Equals, expectedTimeFormatted) - } - - for _, value := range invalidValues { - _, err := CompatibleParseGCTime(value) - c.Assert(err, NotNil) - } -} - func (s *testMiscSuite) TestX509NameParseMatch(c *C) { check := pkix.Name{ Names: []pkix.AttributeTypeAndValue{ diff --git a/util/mock/client.go b/util/mock/client.go index 5acb099328ad4..56ec53336d2e4 100644 --- a/util/mock/client.go +++ b/util/mock/client.go @@ -28,6 +28,6 @@ type Client struct { } // Send implement kv.Client interface. -func (c *Client) Send(ctx context.Context, req *kv.Request, kv *kv.Variables, sessionMemTracker *memory.Tracker) kv.Response { +func (c *Client) Send(ctx context.Context, req *kv.Request, kv *kv.Variables, sessionMemTracker *memory.Tracker, enabledRateLimit bool) kv.Response { return c.MockResponse } diff --git a/util/mock/context.go b/util/mock/context.go index d0ec81c7e4d6c..046998c8c3907 100644 --- a/util/mock/context.go +++ b/util/mock/context.go @@ -20,11 +20,13 @@ import ( "time" "github.com/pingcap/errors" + "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/owner" "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/variable" + "github.com/pingcap/tidb/store/tikv/oracle" "github.com/pingcap/tidb/util" "github.com/pingcap/tidb/util/disk" "github.com/pingcap/tidb/util/kvcache" @@ -56,14 +58,41 @@ func (txn *wrapTxn) Valid() bool { return txn.Transaction != nil && txn.Transaction.Valid() } +// GetUnionStore implements GetUnionStore +func (txn *wrapTxn) GetUnionStore() kv.UnionStore { + if txn.Transaction == nil { + return nil + } + return txn.Transaction.GetUnionStore() +} + +func (txn *wrapTxn) CacheTableInfo(id int64, info *model.TableInfo) { + if txn.Transaction == nil { + return + } + txn.Transaction.CacheTableInfo(id, info) +} + +func (txn *wrapTxn) GetTableInfo(id int64) *model.TableInfo { + if txn.Transaction == nil { + return nil + } + return txn.Transaction.GetTableInfo(id) +} + // Execute implements sqlexec.SQLExecutor Execute interface. func (c *Context) Execute(ctx context.Context, sql string) ([]sqlexec.RecordSet, error) { - return nil, errors.Errorf("Not Support.") + return nil, errors.Errorf("Not Supported.") +} + +// ExecuteStmt implements sqlexec.SQLExecutor ExecuteStmt interface. +func (c *Context) ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (sqlexec.RecordSet, error) { + return nil, errors.Errorf("Not Supported.") } // ExecuteInternal implements sqlexec.SQLExecutor ExecuteInternal interface. -func (c *Context) ExecuteInternal(ctx context.Context, sql string) ([]sqlexec.RecordSet, error) { - return nil, errors.Errorf("Not Support.") +func (c *Context) ExecuteInternal(ctx context.Context, sql string, args ...interface{}) (sqlexec.RecordSet, error) { + return nil, errors.Errorf("Not Supported.") } type mockDDLOwnerChecker struct{} @@ -114,6 +143,14 @@ func (c *Context) GetClient() kv.Client { return c.Store.GetClient() } +// GetMPPClient implements sessionctx.Context GetMPPClient interface. +func (c *Context) GetMPPClient() kv.MPPClient { + if c.Store == nil { + return nil + } + return c.Store.GetMPPClient() +} + // GetGlobalSysVar implements GlobalVarAccessor GetGlobalSysVar interface. func (c *Context) GetGlobalSysVar(ctx sessionctx.Context, name string) (string, error) { v := variable.GetSysVar(name) @@ -174,7 +211,7 @@ func (c *Context) InitTxnWithStartTS(startTS uint64) error { return nil } if c.Store != nil { - txn, err := c.Store.BeginWithStartTS(startTS) + txn, err := c.Store.BeginWithOption(kv.TransactionOption{}.SetTxnScope(oracle.GlobalTxnScope).SetStartTs(startTS)) if err != nil { return errors.Trace(err) } @@ -183,6 +220,11 @@ func (c *Context) InitTxnWithStartTS(startTS uint64) error { return nil } +// NewTxnWithStalenessOption implements the sessionctx.Context interface. +func (c *Context) NewTxnWithStalenessOption(ctx context.Context, option sessionctx.StalenessTxnOption) error { + return c.NewTxn(ctx) +} + // GetStore gets the store of session. func (c *Context) GetStore() kv.Storage { return c.Store @@ -211,6 +253,9 @@ func (c *Context) GoCtx() context.Context { // StoreQueryFeedback stores the query feedback. func (c *Context) StoreQueryFeedback(_ interface{}) {} +// StoreIndexUsage strores the index usage information. +func (c *Context) StoreIndexUsage(_ int64, _ int64, _ int64) {} + // StmtCommit implements the sessionctx.Context interface. func (c *Context) StmtCommit() {} @@ -223,10 +268,6 @@ func (c *Context) StmtGetMutation(tableID int64) *binlog.TableMutation { return nil } -// StmtAddDirtyTableOP implements the sessionctx.Context interface. -func (c *Context) StmtAddDirtyTableOP(op int, tid int64, handle kv.Handle) { -} - // AddTableLock implements the sessionctx.Context interface. func (c *Context) AddTableLock(_ []model.TableLockTpInfo) { } diff --git a/util/mock/store.go b/util/mock/store.go index 032201713311a..804f3d6a3f2d3 100644 --- a/util/mock/store.go +++ b/util/mock/store.go @@ -28,17 +28,22 @@ type Store struct { // GetClient implements kv.Storage interface. func (s *Store) GetClient() kv.Client { return s.Client } +// GetMPPClient implements kv.Storage interface. +func (s *Store) GetMPPClient() kv.MPPClient { return nil } + // GetOracle implements kv.Storage interface. func (s *Store) GetOracle() oracle.Oracle { return nil } // Begin implements kv.Storage interface. func (s *Store) Begin() (kv.Transaction, error) { return nil, nil } -// BeginWithStartTS implements kv.Storage interface. -func (s *Store) BeginWithStartTS(startTS uint64) (kv.Transaction, error) { return s.Begin() } +// BeginWithOption implements kv.Storage interface. +func (s *Store) BeginWithOption(option kv.TransactionOption) (kv.Transaction, error) { + return s.Begin() +} // GetSnapshot implements kv.Storage interface. -func (s *Store) GetSnapshot(ver kv.Version) (kv.Snapshot, error) { return nil, nil } +func (s *Store) GetSnapshot(ver kv.Version) kv.Snapshot { return nil } // Close implements kv.Storage interface. func (s *Store) Close() error { return nil } @@ -47,7 +52,7 @@ func (s *Store) Close() error { return nil } func (s *Store) UUID() string { return "mock" } // CurrentVersion implements kv.Storage interface. -func (s *Store) CurrentVersion() (kv.Version, error) { return kv.Version{}, nil } +func (s *Store) CurrentVersion(txnScope string) (kv.Version, error) { return kv.Version{}, nil } // SupportDeleteRange implements kv.Storage interface. func (s *Store) SupportDeleteRange() bool { return false } @@ -60,5 +65,10 @@ func (s *Store) Describe() string { return "UtilMockStorage is a mock Store implementation, only for unittests in util package" } +// GetMemCache implements kv.Storage interface +func (s *Store) GetMemCache() kv.MemManager { + return nil +} + // ShowStatus implements kv.Storage interface. func (s *Store) ShowStatus(ctx context.Context, key string) (interface{}, error) { return nil, nil } diff --git a/util/mvmap/mvmap_test.go b/util/mvmap/mvmap_test.go index 3c273f90d9a4e..b3a241919c9fa 100644 --- a/util/mvmap/mvmap_test.go +++ b/util/mvmap/mvmap_test.go @@ -93,7 +93,10 @@ func TestFNVHash(t *testing.T) { sum1 := fnvHash64(b) hash := fnv.New64() hash.Reset() - hash.Write(b) + _, err := hash.Write(b) + if err != nil { + t.Fatal(err) + } sum2 := hash.Sum64() if sum1 != sum2 { t.FailNow() diff --git a/util/parser/ast.go b/util/parser/ast.go index e7dfeec1a9474..de460f24378fd 100644 --- a/util/parser/ast.go +++ b/util/parser/ast.go @@ -14,7 +14,12 @@ package parser import ( + "strings" + "github.com/pingcap/parser/ast" + "github.com/pingcap/parser/format" + "github.com/pingcap/tidb/util/logutil" + "go.uber.org/zap" ) // GetDefaultDB checks if all columns in the AST have explicit DBName. If not, return specified DBName. @@ -45,3 +50,89 @@ func (i *implicitDatabase) Enter(in ast.Node) (out ast.Node, skipChildren bool) func (i *implicitDatabase) Leave(in ast.Node) (out ast.Node, ok bool) { return in, true } + +func findTablePos(s, t string) int { + l := 0 + for i := range s { + if s[i] == ' ' || s[i] == ',' { + if len(t) == i-l && strings.Compare(s[l:i], t) == 0 { + return l + } + l = i + 1 + } + } + if len(t) == len(s)-l && strings.Compare(s[l:], t) == 0 { + return l + } + return -1 +} + +// SimpleCases captures simple SQL statements and uses string replacement instead of `restore` to improve performance. +// See https://github.com/pingcap/tidb/issues/22398. +func SimpleCases(node ast.StmtNode, defaultDB, origin string) (s string, ok bool) { + if len(origin) == 0 { + return "", false + } + insert, ok := node.(*ast.InsertStmt) + if !ok { + return "", false + } + if insert.Select != nil || insert.Setlist != nil || insert.OnDuplicate != nil || (insert.TableHints != nil && len(insert.TableHints) != 0) { + return "", false + } + join := insert.Table.TableRefs + if join.Tp != 0 || join.Right != nil { + return "", false + } + ts, ok := join.Left.(*ast.TableSource) + if !ok { + return "", false + } + tn, ok := ts.Source.(*ast.TableName) + if !ok { + return "", false + } + parenPos := strings.Index(origin, "(") + if parenPos == -1 { + return "", false + } + if strings.Contains(origin[:parenPos], ".") { + return origin, true + } + lower := strings.ToLower(origin[:parenPos]) + pos := findTablePos(lower, tn.Name.L) + if pos == -1 { + return "", false + } + var builder strings.Builder + builder.WriteString(origin[:pos]) + if tn.Schema.String() != "" { + builder.WriteString(tn.Schema.String()) + } else { + builder.WriteString(defaultDB) + } + builder.WriteString(".") + builder.WriteString(origin[pos:]) + return builder.String(), true +} + +// RestoreWithDefaultDB returns restore strings for StmtNode with defaultDB +// This function is customized for SQL bind usage. +func RestoreWithDefaultDB(node ast.StmtNode, defaultDB, origin string) string { + if s, ok := SimpleCases(node, defaultDB, origin); ok { + return s + } + var sb strings.Builder + // Three flags for restore with default DB: + // 1. RestoreStringSingleQuotes specifies to use single quotes to surround the string; + // 2. RestoreSpacesAroundBinaryOperation specifies to add space around binary operation; + // 3. RestoreStringWithoutCharset specifies to not print charset before string; + // 4. RestoreNameBackQuotes specifies to use back quotes to surround the name; + ctx := format.NewRestoreCtx(format.RestoreStringSingleQuotes|format.RestoreSpacesAroundBinaryOperation|format.RestoreStringWithoutCharset|format.RestoreNameBackQuotes, &sb) + ctx.DefaultDB = defaultDB + if err := node.Restore(ctx); err != nil { + logutil.BgLogger().Debug("[sql-bind] restore SQL failed", zap.Error(err)) + return "" + } + return sb.String() +} diff --git a/util/parser/ast_test.go b/util/parser/ast_test.go new file mode 100644 index 0000000000000..177caf16f1978 --- /dev/null +++ b/util/parser/ast_test.go @@ -0,0 +1,70 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package parser_test + +import ( + "testing" + + . "github.com/pingcap/check" + "github.com/pingcap/parser" + _ "github.com/pingcap/tidb/types/parser_driver" + utilparser "github.com/pingcap/tidb/util/parser" +) + +var _ = Suite(&testASTSuite{}) + +type testASTSuite struct { +} + +func TestT(t *testing.T) { + TestingT(t) +} + +func (s *testASTSuite) TestSimpleCases(c *C) { + tests := []struct { + sql string + db string + ans string + }{ + { + sql: "insert into t values(1, 2)", + db: "test", + ans: "insert into test.t values(1, 2)", + }, + { + sql: "insert into mydb.t values(1, 2)", + db: "test", + ans: "insert into mydb.t values(1, 2)", + }, + { + sql: "insert into t(a, b) values(1, 2)", + db: "test", + ans: "insert into test.t(a, b) values(1, 2)", + }, + { + sql: "insert into value value(2, 3)", + db: "test", + ans: "insert into test.value value(2, 3)", + }, + } + + for _, t := range tests { + p := parser.New() + stmt, err := p.ParseOneStmt(t.sql, "", "") + c.Assert(err, IsNil) + ans, ok := utilparser.SimpleCases(stmt, t.db, t.sql) + c.Assert(ok, IsTrue) + c.Assert(t.ans, Equals, ans) + } +} diff --git a/util/plancodec/codec.go b/util/plancodec/codec.go index be300f84771d9..e7568493fed94 100644 --- a/util/plancodec/codec.go +++ b/util/plancodec/codec.go @@ -16,6 +16,7 @@ package plancodec import ( "bytes" "encoding/base64" + "math" "strconv" "strings" "sync" @@ -314,13 +315,18 @@ func decodePlanInfo(str string) (*planInfo, error) { // EncodePlanNode is used to encode the plan to a string. func EncodePlanNode(depth, pid int, planType string, rowCount float64, taskTypeInfo, explainInfo, actRows, analyzeInfo, memoryInfo, diskInfo string, buf *bytes.Buffer) { + explainInfo = escapeString(explainInfo) buf.WriteString(strconv.Itoa(depth)) buf.WriteByte(separator) buf.WriteString(encodeID(planType, pid)) buf.WriteByte(separator) buf.WriteString(taskTypeInfo) buf.WriteByte(separator) - buf.WriteString(strconv.FormatFloat(rowCount, 'f', -1, 64)) + if math.Round(rowCount) == rowCount { + buf.WriteString(strconv.FormatFloat(rowCount, 'f', 0, 64)) + } else { + buf.WriteString(strconv.FormatFloat(rowCount, 'f', 2, 64)) + } buf.WriteByte(separator) buf.WriteString(explainInfo) // Check whether has runtime info. @@ -337,6 +343,11 @@ func EncodePlanNode(depth, pid int, planType string, rowCount float64, buf.WriteByte(lineBreaker) } +func escapeString(s string) string { + s = strings.Replace(s, string([]byte{separator}), "\\t", -1) + return strings.Replace(s, string([]byte{lineBreaker}), "\\n", -1) +} + // NormalizePlanNode is used to normalize the plan to a string. func NormalizePlanNode(depth int, planType string, taskTypeInfo string, explainInfo string, buf *bytes.Buffer) { buf.WriteString(strconv.Itoa(depth)) diff --git a/util/plancodec/id.go b/util/plancodec/id.go index 219f2cfabedd0..36920208358f1 100644 --- a/util/plancodec/id.go +++ b/util/plancodec/id.go @@ -52,8 +52,10 @@ const ( TypeLimit = "Limit" // TypeHashJoin is the type of hash join. TypeHashJoin = "HashJoin" - // TypeBroadcastJoin is the type of broad cast join. - TypeBroadcastJoin = "BroadcastJoin" + // TypeExchangeSender is the type of mpp exchanger sender. + TypeExchangeSender = "ExchangeSender" + // TypeExchangeReceiver is the type of mpp exchanger receiver. + TypeExchangeReceiver = "ExchangeReceiver" // TypeMergeJoin is the type of merge join. TypeMergeJoin = "MergeJoin" // TypeIndexJoin is the type of index look up join. @@ -88,8 +90,8 @@ const ( TypeWindow = "Window" // TypeShuffle is the type of Shuffle. TypeShuffle = "Shuffle" - // TypeShuffleDataSourceStub is the type of Shuffle. - TypeShuffleDataSourceStub = "ShuffleDataSourceStub" + // TypeShuffleReceiver is the type of Shuffle. + TypeShuffleReceiver = "ShuffleReceiver" // TypeTiKVSingleGather is the type of TiKVSingleGather. TypeTiKVSingleGather = "TiKVSingleGather" // TypeIndexMerge is the type of IndexMergeReader @@ -104,6 +106,20 @@ const ( TypeClusterMemTableReader = "ClusterMemTableReader" // TypeDataSource is the type of DataSource. TypeDataSource = "DataSource" + // TypeLoadData is the type of LoadData. + TypeLoadData = "LoadData" + // TypeTableSample is the type of TableSample. + TypeTableSample = "TableSample" + // TypeTableFullScan is the type of TableFullScan. + TypeTableFullScan = "TableFullScan" + // TypeTableRangeScan is the type of TableRangeScan. + TypeTableRangeScan = "TableRangeScan" + // TypeTableRowIDScan is the type of TableRowIDScan. + TypeTableRowIDScan = "TableRowIDScan" + // TypeIndexFullScan is the type of IndexFullScan. + TypeIndexFullScan = "IndexFullScan" + // TypeIndexRangeScan is the type of IndexRangeScan. + TypeIndexRangeScan = "IndexRangeScan" ) // plan id. @@ -149,6 +165,15 @@ const ( typeBatchPointGet int = 38 typeClusterMemTableReader int = 39 typeDataSourceID int = 40 + typeLoadDataID int = 41 + typeTableSampleID int = 42 + typeTableFullScan int = 43 + typeTableRangeScan int = 44 + typeTableRowIDScan int = 45 + typeIndexFullScan int = 46 + typeIndexRangeScan int = 47 + typeExchangeReceiver int = 48 + typeExchangeSender int = 49 ) // TypeStringToPhysicalID converts the plan type string to plan id. @@ -234,6 +259,24 @@ func TypeStringToPhysicalID(tp string) int { return typeClusterMemTableReader case TypeDataSource: return typeDataSourceID + case TypeLoadData: + return typeLoadDataID + case TypeTableSample: + return typeTableSampleID + case TypeTableFullScan: + return typeTableFullScan + case TypeTableRangeScan: + return typeTableRangeScan + case TypeTableRowIDScan: + return typeTableRowIDScan + case TypeIndexFullScan: + return typeIndexFullScan + case TypeIndexRangeScan: + return typeIndexRangeScan + case TypeExchangeReceiver: + return typeExchangeReceiver + case TypeExchangeSender: + return typeExchangeSender } // Should never reach here. return 0 @@ -320,6 +363,22 @@ func PhysicalIDToTypeString(id int) string { return TypeBatchPointGet case typeClusterMemTableReader: return TypeClusterMemTableReader + case typeLoadDataID: + return TypeLoadData + case typeTableFullScan: + return TypeTableFullScan + case typeTableRangeScan: + return TypeTableRangeScan + case typeTableRowIDScan: + return TypeTableRowIDScan + case typeIndexFullScan: + return TypeIndexFullScan + case typeIndexRangeScan: + return TypeIndexRangeScan + case typeExchangeReceiver: + return TypeExchangeReceiver + case typeExchangeSender: + return TypeExchangeSender } // Should never reach here. diff --git a/util/plancodec/id_test.go b/util/plancodec/id_test.go index 3c008eb609659..08599887a8912 100644 --- a/util/plancodec/id_test.go +++ b/util/plancodec/id_test.go @@ -70,4 +70,13 @@ func (s *testPlanIDSuite) TestPlanIDChanged(c *C) { c.Assert(typeBatchPointGet, Equals, 38) c.Assert(typeClusterMemTableReader, Equals, 39) c.Assert(typeDataSourceID, Equals, 40) + c.Assert(typeLoadDataID, Equals, 41) + c.Assert(typeTableSampleID, Equals, 42) + c.Assert(typeTableFullScan, Equals, 43) + c.Assert(typeTableRangeScan, Equals, 44) + c.Assert(typeTableRowIDScan, Equals, 45) + c.Assert(typeIndexFullScan, Equals, 46) + c.Assert(typeIndexRangeScan, Equals, 47) + c.Assert(typeExchangeReceiver, Equals, 48) + c.Assert(typeExchangeSender, Equals, 49) } diff --git a/util/prefix_helper_test.go b/util/prefix_helper_test.go index 114fee97d5449..65fead27b7619 100644 --- a/util/prefix_helper_test.go +++ b/util/prefix_helper_test.go @@ -117,7 +117,8 @@ func (c *MockContext) CommitTxn() error { func (s *testPrefixSuite) TestPrefix(c *C) { ctx := &MockContext{10000000, make(map[fmt.Stringer]interface{}), s.s, nil} - ctx.fillTxn() + err := ctx.fillTxn() + c.Assert(err, IsNil) txn, err := ctx.GetTxn(false) c.Assert(err, IsNil) err = util.DelKeyWithPrefix(txn, encodeInt(ctx.prefix)) diff --git a/util/processinfo.go b/util/processinfo.go index 13f04bf16e655..29716d914c3de 100644 --- a/util/processinfo.go +++ b/util/processinfo.go @@ -15,8 +15,10 @@ package util import ( "crypto/tls" + "errors" "fmt" "strings" + "sync/atomic" "time" "github.com/pingcap/parser/mysql" @@ -30,6 +32,7 @@ type ProcessInfo struct { ID uint64 User string Host string + Port string DB string Digest string Plan interface{} @@ -47,6 +50,7 @@ type ProcessInfo struct { State uint16 Command byte ExceedExpensiveTimeThresh bool + RedactSQL bool } // ToRowForShow returns []interface{} for the row data of "SHOW [FULL] PROCESSLIST". @@ -64,10 +68,16 @@ func (pi *ProcessInfo) ToRowForShow(full bool) []interface{} { if len(pi.DB) > 0 { db = pi.DB } + var host string + if pi.Port != "" { + host = fmt.Sprintf("%s:%s", pi.Host, pi.Port) + } else { + host = pi.Host + } return []interface{}{ pi.ID, pi.User, - pi.Host, + host, db, mysql.Command2Str[pi.Command], t, @@ -88,10 +98,16 @@ func (pi *ProcessInfo) txnStartTs(tz *time.Location) (txnStart string) { // "SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST". func (pi *ProcessInfo) ToRow(tz *time.Location) []interface{} { bytesConsumed := int64(0) - if pi.StmtCtx != nil && pi.StmtCtx.MemTracker != nil { - bytesConsumed = pi.StmtCtx.MemTracker.BytesConsumed() + diskConsumed := int64(0) + if pi.StmtCtx != nil { + if pi.StmtCtx.MemTracker != nil { + bytesConsumed = pi.StmtCtx.MemTracker.BytesConsumed() + } + if pi.StmtCtx.DiskTracker != nil { + diskConsumed = pi.StmtCtx.DiskTracker.BytesConsumed() + } } - return append(pi.ToRowForShow(true), pi.Digest, bytesConsumed, pi.txnStartTs(tz)) + return append(pi.ToRowForShow(true), pi.Digest, bytesConsumed, diskConsumed, pi.txnStartTs(tz)) } // ascServerStatus is a slice of all defined server status in ascending order. @@ -147,5 +163,88 @@ type SessionManager interface { ShowProcessList() map[uint64]*ProcessInfo GetProcessInfo(id uint64) (*ProcessInfo, bool) Kill(connectionID uint64, query bool) + KillAllConnections() UpdateTLSConfig(cfg *tls.Config) + ServerID() uint64 +} + +// GlobalConnID is the global connection ID, providing UNIQUE connection IDs across the whole TiDB cluster. +// 64 bits version: +// 63 62 41 40 1 0 +// +--+---------------------+--------------------------------------+------+ +// | | serverId | local connId |markup| +// |=0| (22b) | (40b) | =1 | +// +--+---------------------+--------------------------------------+------+ +// 32 bits version(coming soon): +// 31 1 0 +// +-----------------------------+------+ +// | ??? |markup| +// | ??? | =0 | +// +-----------------------------+------+ +type GlobalConnID struct { + ServerID uint64 + LocalConnID uint64 + Is64bits bool + ServerIDGetter func() uint64 +} + +const ( + // MaxServerID is maximum serverID. + MaxServerID = 1<<22 - 1 +) + +func (g *GlobalConnID) makeID(localConnID uint64) uint64 { + var ( + id uint64 + serverID uint64 + ) + if g.ServerIDGetter != nil { + serverID = g.ServerIDGetter() + } else { + serverID = g.ServerID + } + if g.Is64bits { + id |= 0x1 + id |= localConnID & 0xff_ffff_ffff << 1 // 40 bits local connID. + id |= serverID & MaxServerID << 41 // 22 bits serverID. + } else { + // TODO: update after new design for 32 bits version. + id |= localConnID & 0x7fff_ffff << 1 // 31 bits local connID. + } + return id +} + +// ID returns the connection id +func (g *GlobalConnID) ID() uint64 { + return g.makeID(g.LocalConnID) +} + +// NextID returns next connection id +func (g *GlobalConnID) NextID() uint64 { + localConnID := atomic.AddUint64(&g.LocalConnID, 1) + return g.makeID(localConnID) +} + +// ParseGlobalConnID parses an uint64 to GlobalConnID. +// `isTruncated` indicates that older versions of the client truncated the 64-bit GlobalConnID to 32-bit. +func ParseGlobalConnID(id uint64) (g GlobalConnID, isTruncated bool, err error) { + if id&0x80000000_00000000 > 0 { + return GlobalConnID{}, false, errors.New("Unexpected connectionID excceeds int64") + } + if id&0x1 > 0 { + if id&0xffffffff_00000000 == 0 { + return GlobalConnID{}, true, nil + } + return GlobalConnID{ + Is64bits: true, + LocalConnID: (id >> 1) & 0xff_ffff_ffff, + ServerID: (id >> 41) & MaxServerID, + }, false, nil + } + // TODO: update after new design for 32 bits version. + return GlobalConnID{ + Is64bits: false, + LocalConnID: (id >> 1) & 0x7fff_ffff, + ServerID: 0, + }, false, nil } diff --git a/util/processinfo_test.go b/util/processinfo_test.go new file mode 100644 index 0000000000000..bd0b9f8f396c7 --- /dev/null +++ b/util/processinfo_test.go @@ -0,0 +1,71 @@ +// Copyright 2020 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package util_test + +import ( + . "github.com/pingcap/check" + "github.com/pingcap/tidb/config" + "github.com/pingcap/tidb/util" +) + +var _ = Suite(&testProcessInfoSuite{}) + +type testProcessInfoSuite struct { +} + +func (s *testProcessInfoSuite) SetUpSuite(c *C) { +} + +func (s *testProcessInfoSuite) TearDownSuite(c *C) { +} + +func (s *testProcessInfoSuite) TestGlobalConnID(c *C) { + originCfg := config.GetGlobalConfig() + newCfg := *originCfg + newCfg.Experimental.EnableGlobalKill = true + config.StoreGlobalConfig(&newCfg) + defer func() { + config.StoreGlobalConfig(originCfg) + }() + connID := util.GlobalConnID{ + Is64bits: true, + ServerID: 1001, + LocalConnID: 123, + } + c.Assert(connID.ID(), Equals, (uint64(1001)<<41)|(uint64(123)<<1)|1) + + next := connID.NextID() + c.Assert(next, Equals, (uint64(1001)<<41)|(uint64(124)<<1)|1) + + connID1, isTruncated, err := util.ParseGlobalConnID(next) + c.Assert(err, IsNil) + c.Assert(isTruncated, IsFalse) + c.Assert(connID1.ServerID, Equals, uint64(1001)) + c.Assert(connID1.LocalConnID, Equals, uint64(124)) + c.Assert(connID1.Is64bits, IsTrue) + + _, isTruncated, err = util.ParseGlobalConnID(101) + c.Assert(err, IsNil) + c.Assert(isTruncated, IsTrue) + + _, _, err = util.ParseGlobalConnID(0x80000000_00000321) + c.Assert(err, NotNil) + + connID2 := util.GlobalConnID{ + Is64bits: true, + ServerIDGetter: func() uint64 { return 2002 }, + LocalConnID: 123, + } + c.Assert(connID2.ID(), Equals, (uint64(2002)<<41)|(uint64(123)<<1)|1) +} diff --git a/util/profile/flamegraph_test.go b/util/profile/flamegraph_test.go index d02d1912a25e7..5517ccd54a7c7 100644 --- a/util/profile/flamegraph_test.go +++ b/util/profile/flamegraph_test.go @@ -89,7 +89,14 @@ func (s *profileInternalSuite) TestProfileToDatum(c *C) { c.Assert(err, IsNil, comment) comment = Commentf("row %2d, actual (%s), expected (%s)", i, rowStr, expectStr) - equal, err := types.EqualDatums(nil, row, datums[i]) + equal := true + for j, r := range row { + v, err := r.CompareDatum(nil, &datums[i][j]) + if v != 0 || err != nil { + equal = false + break + } + } c.Assert(err, IsNil, comment) c.Assert(equal, IsTrue, comment) } diff --git a/util/ranger/detacher.go b/util/ranger/detacher.go index 123a4edc39f03..817ab2b8c2004 100644 --- a/util/ranger/detacher.go +++ b/util/ranger/detacher.go @@ -14,11 +14,14 @@ package ranger import ( + "math" + "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/model" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/sessionctx" + "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" @@ -90,10 +93,11 @@ func detachColumnDNFConditions(sctx sessionctx.Context, conditions []expression. return accessConditions, hasResidualConditions } -// getEqOrInColOffset checks if the expression is a eq function that one side is constant and another is column or an +// getPotentialEqOrInColOffset checks if the expression is a eq/le/ge/lt/gt function that one side is constant and another is column or an // in function which is `column in (constant list)`. // If so, it will return the offset of this column in the slice, otherwise return -1 for not found. -func getEqOrInColOffset(expr expression.Expression, cols []*expression.Column) int { +// Since combining `x >= 2` and `x <= 2` can lead to an eq condition `x = 2`, we take le/ge/lt/gt into consideration. +func getPotentialEqOrInColOffset(expr expression.Expression, cols []*expression.Column) int { f, ok := expr.(*expression.ScalarFunction) if !ok { return -1 @@ -104,7 +108,7 @@ func getEqOrInColOffset(expr expression.Expression, cols []*expression.Column) i dnfItems := expression.FlattenDNFConditions(f) offset := int(-1) for _, dnfItem := range dnfItems { - curOffset := getEqOrInColOffset(dnfItem, cols) + curOffset := getPotentialEqOrInColOffset(dnfItem, cols) if curOffset == -1 { return -1 } @@ -114,11 +118,14 @@ func getEqOrInColOffset(expr expression.Expression, cols []*expression.Column) i offset = curOffset } return offset - case ast.EQ, ast.NullEQ: + case ast.EQ, ast.NullEQ, ast.LE, ast.GE, ast.LT, ast.GT: if c, ok := f.GetArgs()[0].(*expression.Column); ok { if c.RetType.EvalType() == types.ETString && !collate.CompatibleCollate(c.RetType.Collate, collation) { return -1 } + if (f.FuncName.L == ast.LT || f.FuncName.L == ast.GT) && c.RetType.EvalType() != types.ETInt { + return -1 + } if constVal, ok := f.GetArgs()[1].(*expression.Constant); ok { val, err := constVal.Eval(chunk.Row{}) if err != nil || val.IsNull() { @@ -137,6 +144,9 @@ func getEqOrInColOffset(expr expression.Expression, cols []*expression.Column) i if c.RetType.EvalType() == types.ETString && !collate.CompatibleCollate(c.RetType.Collate, collation) { return -1 } + if (f.FuncName.L == ast.LT || f.FuncName.L == ast.GT) && c.RetType.EvalType() != types.ETInt { + return -1 + } if constVal, ok := f.GetArgs()[0].(*expression.Constant); ok { val, err := constVal.Eval(chunk.Row{}) if err != nil || val.IsNull() { @@ -345,6 +355,97 @@ func (d *rangeDetacher) detachCNFCondAndBuildRangeForIndex(conditions []expressi return res, nil } +// excludeToIncludeForIntPoint converts `(i` to `[i+1` and `i)` to `i-1]` if `i` is integer. +// For example, if p is `(3`, i.e., point { value: int(3), excl: true, start: true }, it is equal to `[4`, i.e., point { value: int(4), excl: false, start: true }. +// Similarly, if p is `8)`, i.e., point { value: int(8), excl: true, start: false}, it is equal to `7]`, i.e., point { value: int(7), excl: false, start: false }. +// If return value is nil, it means p is unsatisfiable. For example, `(MaxInt64` is unsatisfiable. +func excludeToIncludeForIntPoint(p *point) *point { + if !p.excl { + return p + } + if p.value.Kind() == types.KindInt64 { + val := p.value.GetInt64() + if p.start { + if val == math.MaxInt64 { + return nil + } + p.value.SetInt64(val + 1) + p.excl = false + } else { + if val == math.MinInt64 { + return nil + } + p.value.SetInt64(val - 1) + p.excl = false + } + } else if p.value.Kind() == types.KindUint64 { + val := p.value.GetUint64() + if p.start { + if val == math.MaxUint64 { + return nil + } + p.value.SetUint64(val + 1) + p.excl = false + } else { + if val == 0 { + return nil + } + p.value.SetUint64(val - 1) + p.excl = false + } + } + return p +} + +// If there exists an interval whose length is large than 0, return nil. Otherwise remove all unsatisfiable intervals +// and return array of single point intervals. +func allSinglePoints(sc *stmtctx.StatementContext, points []*point) []*point { + pos := 0 + for i := 0; i < len(points); i += 2 { + // Remove unsatisfiable interval. For example, (MaxInt64, +inf) and (-inf, MinInt64) is unsatisfiable. + left := excludeToIncludeForIntPoint(points[i]) + if left == nil { + continue + } + right := excludeToIncludeForIntPoint(points[i+1]) + if right == nil { + continue + } + // If interval is not a single point, just return nil. + if !left.start || right.start || left.excl || right.excl { + return nil + } + cmp, err := left.value.CompareDatum(sc, &right.value) + if err != nil || cmp != 0 { + return nil + } + // If interval is a single point, add it back to array. + points[pos] = left + points[pos+1] = right + pos += 2 + } + return points[:pos] +} + +func allEqOrIn(expr expression.Expression) bool { + f, ok := expr.(*expression.ScalarFunction) + if !ok { + return false + } + switch f.FuncName.L { + case ast.LogicOr: + for _, arg := range f.GetArgs() { + if !allEqOrIn(arg) { + return false + } + } + return true + case ast.EQ, ast.NullEQ, ast.In: + return true + } + return false +} + // ExtractEqAndInCondition will split the given condition into three parts by the information of index columns and their lengths. // accesses: The condition will be used to build range. // filters: filters is the part that some access conditions need to be evaluate again since it's only the prefix part of char column. @@ -356,13 +457,14 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex var filters []expression.Expression rb := builder{sc: sctx.GetSessionVars().StmtCtx} accesses := make([]expression.Expression, len(cols)) - points := make([][]point, len(cols)) + points := make([][]*point, len(cols)) mergedAccesses := make([]expression.Expression, len(cols)) newConditions := make([]expression.Expression, 0, len(conditions)) - for _, cond := range conditions { - offset := getEqOrInColOffset(cond, cols) + offsets := make([]int, len(conditions)) + for i, cond := range conditions { + offset := getPotentialEqOrInColOffset(cond, cols) + offsets[i] = offset if offset == -1 { - newConditions = append(newConditions, cond) continue } if accesses[offset] == nil { @@ -384,12 +486,31 @@ func ExtractEqAndInCondition(sctx sessionctx.Context, conditions []expression.Ex for i, ma := range mergedAccesses { if ma == nil { if accesses[i] != nil { - newConditions = append(newConditions, accesses[i]) + if allEqOrIn(accesses[i]) { + newConditions = append(newConditions, accesses[i]) + } else { + accesses[i] = nil + } } continue } - accesses[i] = points2EqOrInCond(sctx, points[i], mergedAccesses[i]) - newConditions = append(newConditions, accesses[i]) + points[i] = allSinglePoints(sctx.GetSessionVars().StmtCtx, points[i]) + if points[i] == nil { + // There exists an interval whose length is larger than 0 + accesses[i] = nil + } else if len(points[i]) == 0 { + // Early termination if false expression found + return nil, nil, nil, true + } else { + // All Intervals are single points + accesses[i] = points2EqOrInCond(sctx, points[i], cols[i]) + newConditions = append(newConditions, accesses[i]) + } + } + for i, offset := range offsets { + if offset == -1 || accesses[offset] == nil { + newConditions = append(newConditions, conditions[i]) + } } for i, cond := range accesses { if cond == nil { @@ -455,6 +576,10 @@ func (d *rangeDetacher) detachDNFCondAndBuildRangeForIndex(condition *expression } } + // Take prefix index into consideration. + if hasPrefix(d.lengths) { + fixPrefixColRange(totalRanges, d.lengths, newTpSlice) + } totalRanges, err := UnionRanges(sc, totalRanges, d.mergeConsecutive) if err != nil { return nil, nil, false, errors.Trace(err) diff --git a/util/ranger/points.go b/util/ranger/points.go index 7eb4763a92db9..26359213f5c22 100644 --- a/util/ranger/points.go +++ b/util/ranger/points.go @@ -21,19 +21,18 @@ import ( "github.com/pingcap/errors" "github.com/pingcap/parser/ast" "github.com/pingcap/parser/mysql" - "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/errno" "github.com/pingcap/tidb/expression" - "github.com/pingcap/tidb/sessionctx" "github.com/pingcap/tidb/sessionctx/stmtctx" "github.com/pingcap/tidb/types" "github.com/pingcap/tidb/util/chunk" "github.com/pingcap/tidb/util/collate" + "github.com/pingcap/tidb/util/dbterror" ) // Error instances. var ( - ErrUnsupportedType = terror.ClassOptimizer.New(errno.ErrUnsupportedType, errno.MySQLErrName[errno.ErrUnsupportedType]) + ErrUnsupportedType = dbterror.ClassOptimizer.NewStd(errno.ErrUnsupportedType) ) // RangeType is alias for int. @@ -53,7 +52,7 @@ type point struct { start bool } -func (rp point) String() string { +func (rp *point) String() string { val := rp.value.GetValue() if rp.value.Kind() == types.KindMinNotNull { val = "-inf" @@ -74,8 +73,16 @@ func (rp point) String() string { return fmt.Sprintf("%v%s", val, symbol) } +func (rp *point) Clone(value types.Datum) *point { + return &point{ + value: value, + excl: rp.excl, + start: rp.start, + } +} + type pointSorter struct { - points []point + points []*point err error sc *stmtctx.StatementContext } @@ -94,7 +101,7 @@ func (r *pointSorter) Less(i, j int) bool { return less } -func rangePointLess(sc *stmtctx.StatementContext, a, b point) (bool, error) { +func rangePointLess(sc *stmtctx.StatementContext, a, b *point) (bool, error) { cmp, err := a.value.CompareDatum(sc, &b.value) if cmp != 0 { return cmp < 0, nil @@ -102,7 +109,7 @@ func rangePointLess(sc *stmtctx.StatementContext, a, b point) (bool, error) { return rangePointEqualValueLess(a, b), errors.Trace(err) } -func rangePointEqualValueLess(a, b point) bool { +func rangePointEqualValueLess(a, b *point) bool { if a.start && b.start { return !a.excl && b.excl } else if a.start { @@ -117,10 +124,15 @@ func (r *pointSorter) Swap(i, j int) { r.points[i], r.points[j] = r.points[j], r.points[i] } -// fullRange is (-∞, +∞). -var fullRange = []point{ - {start: true}, - {value: types.MaxValueDatum()}, +/* + * If use []point, fullRange will be copied when used. + * So for keep this behaver, getFullRange function is introduced. + */ +func getFullRange() []*point { + return []*point{ + {start: true}, + {value: types.MaxValueDatum()}, + } } // FullIntRange is used for table range. Since table range cannot accept MaxValueDatum as the max value. @@ -151,10 +163,9 @@ func NullRange() []*Range { type builder struct { err error sc *stmtctx.StatementContext - ctx *sessionctx.Context } -func (r *builder) build(expr expression.Expression) []point { +func (r *builder) build(expr expression.Expression) []*point { switch x := expr.(type) { case *expression.Column: return r.buildFromColumn(x) @@ -164,10 +175,10 @@ func (r *builder) build(expr expression.Expression) []point { return r.buildFromConstant(x) } - return fullRange + return getFullRange() } -func (r *builder) buildFromConstant(expr *expression.Constant) []point { +func (r *builder) buildFromConstant(expr *expression.Constant) []*point { dt, err := expr.Eval(chunk.Row{}) if err != nil { r.err = err @@ -186,21 +197,21 @@ func (r *builder) buildFromConstant(expr *expression.Constant) []point { if val == 0 { return nil } - return fullRange + return getFullRange() } -func (r *builder) buildFromColumn(expr *expression.Column) []point { +func (r *builder) buildFromColumn(expr *expression.Column) []*point { // column name expression is equivalent to column name is true. - startPoint1 := point{value: types.MinNotNullDatum(), start: true} - endPoint1 := point{excl: true} + startPoint1 := &point{value: types.MinNotNullDatum(), start: true} + endPoint1 := &point{excl: true} endPoint1.value.SetInt64(0) - startPoint2 := point{excl: true, start: true} + startPoint2 := &point{excl: true, start: true} startPoint2.value.SetInt64(0) - endPoint2 := point{value: types.MaxValueDatum()} - return []point{startPoint1, endPoint1, startPoint2, endPoint2} + endPoint2 := &point{value: types.MaxValueDatum()} + return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } -func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { +func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []*point { // This has been checked that the binary operation is comparison operation, and one of // the operand is column name expression. var ( @@ -210,11 +221,17 @@ func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { ft *types.FieldType ) - // refineValue refines the constant datum for string type since we may eval the constant to another collation instead of its own collation. - refineValue := func(col *expression.Column, value *types.Datum) { + // refineValue refines the constant datum: + // 1. for string type since we may eval the constant to another collation instead of its own collation. + // 2. for year type since 2-digit year value need adjustment, see https://dev.mysql.com/doc/refman/5.6/en/year.html + refineValue := func(col *expression.Column, value *types.Datum) (err error) { if col.RetType.EvalType() == types.ETString && value.Kind() == types.KindString { value.SetString(value.GetString(), col.RetType.Collate) } + if col.GetType().Tp == mysql.TypeYear { + *value, err = types.ConvertDatumToFloatYear(r.sc, *value) + } + return } if col, ok := expr.GetArgs()[0].(*expression.Column); ok { ft = col.RetType @@ -222,7 +239,10 @@ func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { if err != nil { return nil } - refineValue(col, &value) + err = refineValue(col, &value) + if err != nil { + return nil + } op = expr.FuncName.L } else { col, ok := expr.GetArgs()[1].(*expression.Column) @@ -234,7 +254,10 @@ func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { if err != nil { return nil } - refineValue(col, &value) + err = refineValue(col, &value) + if err != nil { + return nil + } switch expr.FuncName.L { case ast.GE: @@ -253,7 +276,12 @@ func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { return nil } - value, op, isValidRange := handleUnsignedIntCol(ft, value, op) + value, op, isValidRange := handleUnsignedCol(ft, value, op) + if !isValidRange { + return nil + } + + value, op, isValidRange = handleBoundCol(ft, value, op) if !isValidRange { return nil } @@ -261,48 +289,50 @@ func (r *builder) buildFormBinOp(expr *expression.ScalarFunction) []point { switch op { case ast.NullEQ: if value.IsNull() { - return []point{{start: true}, {}} // [null, null] + return []*point{{start: true}, {}} // [null, null] } fallthrough case ast.EQ: - startPoint := point{value: value, start: true} - endPoint := point{value: value} - return []point{startPoint, endPoint} + startPoint := &point{value: value, start: true} + endPoint := &point{value: value} + return []*point{startPoint, endPoint} case ast.NE: - startPoint1 := point{value: types.MinNotNullDatum(), start: true} - endPoint1 := point{value: value, excl: true} - startPoint2 := point{value: value, start: true, excl: true} - endPoint2 := point{value: types.MaxValueDatum()} - return []point{startPoint1, endPoint1, startPoint2, endPoint2} + startPoint1 := &point{value: types.MinNotNullDatum(), start: true} + endPoint1 := &point{value: value, excl: true} + startPoint2 := &point{value: value, start: true, excl: true} + endPoint2 := &point{value: types.MaxValueDatum()} + return []*point{startPoint1, endPoint1, startPoint2, endPoint2} case ast.LT: - startPoint := point{value: types.MinNotNullDatum(), start: true} - endPoint := point{value: value, excl: true} - return []point{startPoint, endPoint} + startPoint := &point{value: types.MinNotNullDatum(), start: true} + endPoint := &point{value: value, excl: true} + return []*point{startPoint, endPoint} case ast.LE: - startPoint := point{value: types.MinNotNullDatum(), start: true} - endPoint := point{value: value} - return []point{startPoint, endPoint} + startPoint := &point{value: types.MinNotNullDatum(), start: true} + endPoint := &point{value: value} + return []*point{startPoint, endPoint} case ast.GT: - startPoint := point{value: value, start: true, excl: true} - endPoint := point{value: types.MaxValueDatum()} - return []point{startPoint, endPoint} + startPoint := &point{value: value, start: true, excl: true} + endPoint := &point{value: types.MaxValueDatum()} + return []*point{startPoint, endPoint} case ast.GE: - startPoint := point{value: value, start: true} - endPoint := point{value: types.MaxValueDatum()} - return []point{startPoint, endPoint} + startPoint := &point{value: value, start: true} + endPoint := &point{value: types.MaxValueDatum()} + return []*point{startPoint, endPoint} } return nil } -// handleUnsignedIntCol handles the case when unsigned column meets negative integer value. +// handleUnsignedCol handles the case when unsigned column meets negative value. // The three returned values are: fixed constant value, fixed operator, and a boolean // which indicates whether the range is valid or not. -func handleUnsignedIntCol(ft *types.FieldType, val types.Datum, op string) (types.Datum, string, bool) { +func handleUnsignedCol(ft *types.FieldType, val types.Datum, op string) (types.Datum, string, bool) { isUnsigned := mysql.HasUnsignedFlag(ft.Flag) - isIntegerType := mysql.IsIntegerType(ft.Tp) - isNegativeInteger := (val.Kind() == types.KindInt64 && val.GetInt64() < 0) + isNegative := (val.Kind() == types.KindInt64 && val.GetInt64() < 0) || + (val.Kind() == types.KindFloat32 && val.GetFloat32() < 0) || + (val.Kind() == types.KindFloat64 && val.GetFloat64() < 0) || + (val.Kind() == types.KindMysqlDecimal && val.GetMysqlDecimal().IsNegative()) - if !isUnsigned || !isIntegerType || !isNegativeInteger { + if !isUnsigned || !isNegative { return val, op, true } @@ -310,76 +340,129 @@ func handleUnsignedIntCol(ft *types.FieldType, val types.Datum, op string) (type // Otherwise the value is out of valid range. if op == ast.GT || op == ast.GE || op == ast.NE { op = ast.GE - val.SetUint64(0) + switch val.Kind() { + case types.KindInt64: + val.SetUint64(0) + case types.KindFloat32: + val.SetFloat32(0) + case types.KindFloat64: + val.SetFloat64(0) + case types.KindMysqlDecimal: + val.SetMysqlDecimal(new(types.MyDecimal)) + } return val, op, true } return val, op, false } -func (r *builder) buildFromIsTrue(expr *expression.ScalarFunction, isNot int, keepNull bool) []point { +// handleBoundCol handles the case when column meets overflow value. +// The three returned values are: fixed constant value, fixed operator, and a boolean +// which indicates whether the range is valid or not. +func handleBoundCol(ft *types.FieldType, val types.Datum, op string) (types.Datum, string, bool) { + isUnsigned := mysql.HasUnsignedFlag(ft.Flag) + isNegative := val.Kind() == types.KindInt64 && val.GetInt64() < 0 + if isUnsigned { + return val, op, true + } + + switch ft.Tp { + case mysql.TypeTiny, mysql.TypeShort, mysql.TypeInt24, mysql.TypeLong, mysql.TypeLonglong: + if !isNegative && val.GetUint64() > math.MaxInt64 { + switch op { + case ast.GT, ast.GE: + return val, op, false + case ast.NE, ast.LE, ast.LT: + op = ast.LE + val = types.NewIntDatum(math.MaxInt64) + } + } + case mysql.TypeFloat: + if val.GetFloat64() > math.MaxFloat32 { + switch op { + case ast.GT, ast.GE: + return val, op, false + case ast.NE, ast.LE, ast.LT: + op = ast.LE + val = types.NewFloat32Datum(math.MaxFloat32) + } + } else if val.GetFloat64() < -math.MaxFloat32 { + switch op { + case ast.LE, ast.LT: + return val, op, false + case ast.GT, ast.GE, ast.NE: + op = ast.GE + val = types.NewFloat32Datum(-math.MaxFloat32) + } + } + } + + return val, op, true +} + +func (r *builder) buildFromIsTrue(expr *expression.ScalarFunction, isNot int, keepNull bool) []*point { if isNot == 1 { if keepNull { // Range is {[0, 0]} - startPoint := point{start: true} + startPoint := &point{start: true} startPoint.value.SetInt64(0) - endPoint := point{} + endPoint := &point{} endPoint.value.SetInt64(0) - return []point{startPoint, endPoint} + return []*point{startPoint, endPoint} } // NOT TRUE range is {[null null] [0, 0]} - startPoint1 := point{start: true} - endPoint1 := point{} - startPoint2 := point{start: true} + startPoint1 := &point{start: true} + endPoint1 := &point{} + startPoint2 := &point{start: true} startPoint2.value.SetInt64(0) - endPoint2 := point{} + endPoint2 := &point{} endPoint2.value.SetInt64(0) - return []point{startPoint1, endPoint1, startPoint2, endPoint2} + return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } // TRUE range is {[-inf 0) (0 +inf]} - startPoint1 := point{value: types.MinNotNullDatum(), start: true} - endPoint1 := point{excl: true} + startPoint1 := &point{value: types.MinNotNullDatum(), start: true} + endPoint1 := &point{excl: true} endPoint1.value.SetInt64(0) - startPoint2 := point{excl: true, start: true} + startPoint2 := &point{excl: true, start: true} startPoint2.value.SetInt64(0) - endPoint2 := point{value: types.MaxValueDatum()} - return []point{startPoint1, endPoint1, startPoint2, endPoint2} + endPoint2 := &point{value: types.MaxValueDatum()} + return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } -func (r *builder) buildFromIsFalse(expr *expression.ScalarFunction, isNot int) []point { +func (r *builder) buildFromIsFalse(expr *expression.ScalarFunction, isNot int) []*point { if isNot == 1 { // NOT FALSE range is {[-inf, 0), (0, +inf], [null, null]} - startPoint1 := point{start: true} - endPoint1 := point{excl: true} + startPoint1 := &point{start: true} + endPoint1 := &point{excl: true} endPoint1.value.SetInt64(0) - startPoint2 := point{start: true, excl: true} + startPoint2 := &point{start: true, excl: true} startPoint2.value.SetInt64(0) - endPoint2 := point{value: types.MaxValueDatum()} - return []point{startPoint1, endPoint1, startPoint2, endPoint2} + endPoint2 := &point{value: types.MaxValueDatum()} + return []*point{startPoint1, endPoint1, startPoint2, endPoint2} } // FALSE range is {[0, 0]} - startPoint := point{start: true} + startPoint := &point{start: true} startPoint.value.SetInt64(0) - endPoint := point{} + endPoint := &point{} endPoint.value.SetInt64(0) - return []point{startPoint, endPoint} + return []*point{startPoint, endPoint} } -func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]point, bool) { +func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]*point, bool) { list := expr.GetArgs()[1:] - rangePoints := make([]point, 0, len(list)*2) + rangePoints := make([]*point, 0, len(list)*2) hasNull := false colCollate := expr.GetArgs()[0].GetType().Collate for _, e := range list { v, ok := e.(*expression.Constant) if !ok { r.err = ErrUnsupportedType.GenWithStack("expr:%v is not constant", e) - return fullRange, hasNull + return getFullRange(), hasNull } dt, err := v.Eval(chunk.Row{}) if err != nil { r.err = ErrUnsupportedType.GenWithStack("expr:%v is not evaluated", e) - return fullRange, hasNull + return getFullRange(), hasNull } if dt.IsNull() { hasNull = true @@ -388,11 +471,18 @@ func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]point, bool) { if dt.Kind() == types.KindString { dt.SetString(dt.GetString(), colCollate) } + if expr.GetArgs()[0].GetType().Tp == mysql.TypeYear { + dt, err = types.ConvertDatumToFloatYear(r.sc, dt) + if err != nil { + r.err = ErrUnsupportedType.GenWithStack("expr:%v is not converted to year", e) + return getFullRange(), hasNull + } + } var startValue, endValue types.Datum dt.Copy(&startValue) dt.Copy(&endValue) - startPoint := point{value: startValue, start: true} - endPoint := point{value: endValue} + startPoint := &point{value: startValue, start: true} + endPoint := &point{value: endValue} rangePoints = append(rangePoints, startPoint, endPoint) } sorter := pointSorter{points: rangePoints, sc: r.sc} @@ -417,32 +507,32 @@ func (r *builder) buildFromIn(expr *expression.ScalarFunction) ([]point, bool) { return rangePoints[:curPos], hasNull } -func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []point { +func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []*point { _, collation := expr.CharsetAndCollation(expr.GetCtx()) if !collate.CompatibleCollate(expr.GetArgs()[0].GetType().Collate, collation) { - return fullRange + return getFullRange() } pdt, err := expr.GetArgs()[1].(*expression.Constant).Eval(chunk.Row{}) tpOfPattern := expr.GetArgs()[0].GetType() if err != nil { r.err = errors.Trace(err) - return fullRange + return getFullRange() } pattern, err := pdt.ToString() if err != nil { r.err = errors.Trace(err) - return fullRange + return getFullRange() } if pattern == "" { - startPoint := point{value: types.NewStringDatum(""), start: true} - endPoint := point{value: types.NewStringDatum("")} - return []point{startPoint, endPoint} + startPoint := &point{value: types.NewStringDatum(""), start: true} + endPoint := &point{value: types.NewStringDatum("")} + return []*point{startPoint, endPoint} } lowValue := make([]byte, 0, len(pattern)) edt, err := expr.GetArgs()[2].(*expression.Constant).Eval(chunk.Row{}) if err != nil { r.err = errors.Trace(err) - return fullRange + return getFullRange() } escape := byte(edt.GetInt64()) var exclude bool @@ -472,17 +562,17 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []poi lowValue = append(lowValue, pattern[i]) } if len(lowValue) == 0 { - return []point{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} + return []*point{{value: types.MinNotNullDatum(), start: true}, {value: types.MaxValueDatum()}} } if isExactMatch { val := types.NewCollationStringDatum(string(lowValue), tpOfPattern.Collate, tpOfPattern.Flen) - return []point{{value: val, start: true}, {value: val}} + return []*point{{value: val, start: true}, {value: val}} } - startPoint := point{start: true, excl: exclude} + startPoint := &point{start: true, excl: exclude} startPoint.value.SetBytesAsString(lowValue, tpOfPattern.Collate, uint32(tpOfPattern.Flen)) highValue := make([]byte, len(lowValue)) copy(highValue, lowValue) - endPoint := point{excl: true} + endPoint := &point{excl: true} for i := len(highValue) - 1; i >= 0; i-- { // Make the end point value more than the start point value, // and the length of the end point value is the same as the length of the start point value. @@ -497,10 +587,10 @@ func (r *builder) newBuildFromPatternLike(expr *expression.ScalarFunction) []poi endPoint.value = types.MaxValueDatum() } } - return []point{startPoint, endPoint} + return []*point{startPoint, endPoint} } -func (r *builder) buildFromNot(expr *expression.ScalarFunction) []point { +func (r *builder) buildFromNot(expr *expression.ScalarFunction) []*point { switch n := expr.FuncName.L; n { case ast.IsTruthWithoutNull: return r.buildFromIsTrue(expr, 1, false) @@ -529,30 +619,30 @@ func (r *builder) buildFromNot(expr *expression.ScalarFunction) []point { } rangePoints = rangePoints[nonNegativePos:] } - retRangePoints := make([]point, 0, 2+len(rangePoints)) + retRangePoints := make([]*point, 0, 2+len(rangePoints)) previousValue := types.Datum{} for i := 0; i < len(rangePoints); i += 2 { - retRangePoints = append(retRangePoints, point{value: previousValue, start: true, excl: true}) - retRangePoints = append(retRangePoints, point{value: rangePoints[i].value, excl: true}) + retRangePoints = append(retRangePoints, &point{value: previousValue, start: true, excl: true}) + retRangePoints = append(retRangePoints, &point{value: rangePoints[i].value, excl: true}) previousValue = rangePoints[i].value } // Append the interval (last element, max value]. - retRangePoints = append(retRangePoints, point{value: previousValue, start: true, excl: true}) - retRangePoints = append(retRangePoints, point{value: types.MaxValueDatum()}) + retRangePoints = append(retRangePoints, &point{value: previousValue, start: true, excl: true}) + retRangePoints = append(retRangePoints, &point{value: types.MaxValueDatum()}) return retRangePoints case ast.Like: // Pattern not like is not supported. r.err = ErrUnsupportedType.GenWithStack("NOT LIKE is not supported.") - return fullRange + return getFullRange() case ast.IsNull: - startPoint := point{value: types.MinNotNullDatum(), start: true} - endPoint := point{value: types.MaxValueDatum()} - return []point{startPoint, endPoint} + startPoint := &point{value: types.MinNotNullDatum(), start: true} + endPoint := &point{value: types.MaxValueDatum()} + return []*point{startPoint, endPoint} } return nil } -func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []point { +func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []*point { switch op := expr.FuncName.L; op { case ast.GE, ast.GT, ast.LT, ast.LE, ast.EQ, ast.NE, ast.NullEQ: return r.buildFormBinOp(expr) @@ -572,9 +662,9 @@ func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []point { case ast.Like: return r.newBuildFromPatternLike(expr) case ast.IsNull: - startPoint := point{start: true} - endPoint := point{} - return []point{startPoint, endPoint} + startPoint := &point{start: true} + endPoint := &point{} + return []*point{startPoint, endPoint} case ast.UnaryNot: return r.buildFromNot(expr.GetArgs()[0].(*expression.ScalarFunction)) } @@ -582,16 +672,16 @@ func (r *builder) buildFromScalarFunc(expr *expression.ScalarFunction) []point { return nil } -func (r *builder) intersection(a, b []point) []point { +func (r *builder) intersection(a, b []*point) []*point { return r.merge(a, b, false) } -func (r *builder) union(a, b []point) []point { +func (r *builder) union(a, b []*point) []*point { return r.merge(a, b, true) } -func (r *builder) mergeSorted(a, b []point) []point { - ret := make([]point, 0, len(a)+len(b)) +func (r *builder) mergeSorted(a, b []*point) []*point { + ret := make([]*point, 0, len(a)+len(b)) i, j := 0, 0 for i < len(a) && j < len(b) { less, err := rangePointLess(r.sc, a[i], b[j]) @@ -615,7 +705,7 @@ func (r *builder) mergeSorted(a, b []point) []point { return ret } -func (r *builder) merge(a, b []point, union bool) []point { +func (r *builder) merge(a, b []*point, union bool) []*point { mergedPoints := r.mergeSorted(a, b) if r.err != nil { return nil diff --git a/util/ranger/ranger.go b/util/ranger/ranger.go index 4dac8f8a8e46e..a63c77289091b 100644 --- a/util/ranger/ranger.go +++ b/util/ranger/ranger.go @@ -23,6 +23,7 @@ import ( "github.com/pingcap/parser/ast" "github.com/pingcap/parser/charset" "github.com/pingcap/parser/mysql" + "github.com/pingcap/parser/terror" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" "github.com/pingcap/tidb/sessionctx" @@ -31,7 +32,7 @@ import ( "github.com/pingcap/tidb/util/codec" ) -func validInterval(sc *stmtctx.StatementContext, low, high point) (bool, error) { +func validInterval(sc *stmtctx.StatementContext, low, high *point) (bool, error) { l, err := codec.EncodeKey(sc, nil, low.value) if err != nil { return false, errors.Trace(err) @@ -51,7 +52,7 @@ func validInterval(sc *stmtctx.StatementContext, low, high point) (bool, error) // points2Ranges build index ranges from range points. // Only one column is built there. If there're multiple columns, use appendPoints2Ranges. -func points2Ranges(sc *stmtctx.StatementContext, rangePoints []point, tp *types.FieldType) ([]*Range, error) { +func points2Ranges(sc *stmtctx.StatementContext, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { ranges := make([]*Range, 0, len(rangePoints)/2) for i := 0; i < len(rangePoints); i += 2 { startPoint, err := convertPoint(sc, rangePoints[i], tp) @@ -85,56 +86,62 @@ func points2Ranges(sc *stmtctx.StatementContext, rangePoints []point, tp *types. return ranges, nil } -func convertPoint(sc *stmtctx.StatementContext, point point, tp *types.FieldType) (point, error) { +func convertPoint(sc *stmtctx.StatementContext, point *point, tp *types.FieldType) (*point, error) { switch point.value.Kind() { case types.KindMaxValue, types.KindMinNotNull: return point, nil } casted, err := point.value.ConvertTo(sc, tp) if err != nil { - return point, errors.Trace(err) + if tp.Tp == mysql.TypeYear && terror.ErrorEqual(err, types.ErrInvalidYear) { + // see issue #20101: overflow when converting integer to year + } else if tp.Tp == mysql.TypeBit && terror.ErrorEqual(err, types.ErrDataTooLong) { + // see issue #19067: we should ignore the types.ErrDataTooLong when we convert value to TypeBit value + } else { + return point, errors.Trace(err) + } } valCmpCasted, err := point.value.CompareDatum(sc, &casted) if err != nil { return point, errors.Trace(err) } - point.value = casted + npoint := point.Clone(casted) if valCmpCasted == 0 { - return point, nil + return npoint, nil } - if point.start { - if point.excl { + if npoint.start { + if npoint.excl { if valCmpCasted < 0 { // e.g. "a > 1.9" convert to "a >= 2". - point.excl = false + npoint.excl = false } } else { if valCmpCasted > 0 { // e.g. "a >= 1.1 convert to "a > 1" - point.excl = true + npoint.excl = true } } } else { - if point.excl { + if npoint.excl { if valCmpCasted > 0 { // e.g. "a < 1.1" convert to "a <= 1" - point.excl = false + npoint.excl = false } } else { if valCmpCasted < 0 { // e.g. "a <= 1.9" convert to "a < 2" - point.excl = true + npoint.excl = true } } } - return point, nil + return npoint, nil } // appendPoints2Ranges appends additional column ranges for multi-column index. // The additional column ranges can only be appended to point ranges. // for example we have an index (a, b), if the condition is (a > 1 and b = 2) // then we can not build a conjunctive ranges for this index. -func appendPoints2Ranges(sc *stmtctx.StatementContext, origin []*Range, rangePoints []point, +func appendPoints2Ranges(sc *stmtctx.StatementContext, origin []*Range, rangePoints []*point, ft *types.FieldType) ([]*Range, error) { var newIndexRanges []*Range for i := 0; i < len(origin); i++ { @@ -152,7 +159,7 @@ func appendPoints2Ranges(sc *stmtctx.StatementContext, origin []*Range, rangePoi return newIndexRanges, nil } -func appendPoints2IndexRange(sc *stmtctx.StatementContext, origin *Range, rangePoints []point, +func appendPoints2IndexRange(sc *stmtctx.StatementContext, origin *Range, rangePoints []*point, ft *types.FieldType) ([]*Range, error) { newRanges := make([]*Range, 0, len(rangePoints)/2) for i := 0; i < len(rangePoints); i += 2 { @@ -214,7 +221,7 @@ func appendRanges2PointRanges(pointRanges []*Range, ranges []*Range) []*Range { // points2TableRanges build ranges for table scan from range points. // It will remove the nil and convert MinNotNull and MaxValue to MinInt64 or MinUint64 and MaxInt64 or MaxUint64. -func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []point, tp *types.FieldType) ([]*Range, error) { +func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []*point, tp *types.FieldType) ([]*Range, error) { ranges := make([]*Range, 0, len(rangePoints)/2) var minValueDatum, maxValueDatum types.Datum // Currently, table's kv range cannot accept encoded value of MaxValueDatum. we need to convert it. @@ -266,7 +273,7 @@ func points2TableRanges(sc *stmtctx.StatementContext, rangePoints []point, tp *t // buildColumnRange builds range from CNF conditions. func buildColumnRange(accessConditions []expression.Expression, sc *stmtctx.StatementContext, tp *types.FieldType, tableRange bool, colLen int) (ranges []*Range, err error) { rb := builder{sc: sc} - rangePoints := fullRange + rangePoints := getFullRange() for _, cond := range accessConditions { rangePoints = rb.intersection(rangePoints, rb.build(cond)) if rb.err != nil { @@ -284,7 +291,10 @@ func buildColumnRange(accessConditions []expression.Expression, sc *stmtctx.Stat } if colLen != types.UnspecifiedLength { for _, ran := range ranges { - if CutDatumByPrefixLen(&ran.LowVal[0], colLen, tp) { + // If the length of the last column of LowVal is equal to the prefix length, LowExclude should be set false. + // For example, `col_varchar > 'xx'` should be converted to range [xx, +inf) when the prefix index length of + // `col_varchar` is 2. Otherwise we would miss values like 'xxx' if we execute (xx, +inf) index range scan. + if CutDatumByPrefixLen(&ran.LowVal[0], colLen, tp) || ReachPrefixLen(&ran.LowVal[0], colLen, tp) { ran.LowExclude = false } if CutDatumByPrefixLen(&ran.HighVal[0], colLen, tp) { @@ -339,7 +349,7 @@ func (d *rangeDetacher) buildCNFIndexRange(newTp []*types.FieldType, return nil, errors.Trace(err) } } - rangePoints := fullRange + rangePoints := getFullRange() // Build rangePoints for non-equal access conditions. for i := eqAndInCount; i < len(accessCondition); i++ { rangePoints = rb.intersection(rangePoints, rb.build(accessCondition[i])) @@ -453,7 +463,10 @@ func fixPrefixColRange(ranges []*Range, lengths []int, tp []*types.FieldType) bo CutDatumByPrefixLen(&ran.LowVal[i], lengths[i], tp[i]) } lowCut := CutDatumByPrefixLen(&ran.LowVal[lowTail], lengths[lowTail], tp[lowTail]) - if lowCut { + // If the length of the last column of LowVal is equal to the prefix length, LowExclude should be set false. + // For example, `col_varchar > 'xx'` should be converted to range [xx, +inf) when the prefix index length of + // `col_varchar` is 2. Otherwise we would miss values like 'xxx' if we execute (xx, +inf) index range scan. + if lowCut || ReachPrefixLen(&ran.LowVal[lowTail], lengths[lowTail], tp[lowTail]) { ran.LowExclude = false } highTail := len(ran.HighVal) - 1 @@ -496,6 +509,20 @@ func CutDatumByPrefixLen(v *types.Datum, length int, tp *types.FieldType) bool { return false } +// ReachPrefixLen checks whether the length of v is equal to the prefix length. +func ReachPrefixLen(v *types.Datum, length int, tp *types.FieldType) bool { + if v.Kind() == types.KindString || v.Kind() == types.KindBytes { + colCharset := tp.Charset + colValue := v.GetBytes() + isUTF8Charset := colCharset == charset.CharsetUTF8 || colCharset == charset.CharsetUTF8MB4 + if isUTF8Charset { + return length != types.UnspecifiedLength && utf8.RuneCount(colValue) == length + } + return length != types.UnspecifiedLength && len(colValue) == length + } + return false +} + // We cannot use the FieldType of column directly. e.g. the column a is int32 and we have a > 1111111111111111111. // Obviously the constant is bigger than MaxInt32, so we will get overflow error if we use the FieldType of column a. func newFieldType(tp *types.FieldType) *types.FieldType { @@ -518,25 +545,15 @@ func newFieldType(tp *types.FieldType) *types.FieldType { } // points2EqOrInCond constructs a 'EQUAL' or 'IN' scalar function based on the -// 'points'. The target column is extracted from the 'expr'. +// 'points'. `col` is the target column to construct the Equal or In condition. // NOTE: -// 1. 'expr' must be either 'EQUAL' or 'IN' function. -// 2. 'points' should not be empty. -func points2EqOrInCond(ctx sessionctx.Context, points []point, expr expression.Expression) expression.Expression { +// 1. 'points' should not be empty. +func points2EqOrInCond(ctx sessionctx.Context, points []*point, col *expression.Column) expression.Expression { // len(points) cannot be 0 here, since we impose early termination in ExtractEqAndInCondition - sf, _ := expr.(*expression.ScalarFunction) // Constant and Column args should have same RetType, simply get from first arg - retType := sf.GetArgs()[0].GetType() + retType := col.GetType() args := make([]expression.Expression, 0, len(points)/2) - if sf.FuncName.L == ast.EQ { - if c, ok := sf.GetArgs()[0].(*expression.Column); ok { - args = append(args, c) - } else if c, ok := sf.GetArgs()[1].(*expression.Column); ok { - args = append(args, c) - } - } else { - args = append(args, sf.GetArgs()[0]) - } + args = append(args, col) for i := 0; i < len(points); i = i + 2 { value := &expression.Constant{ Value: points[i].value, @@ -548,7 +565,7 @@ func points2EqOrInCond(ctx sessionctx.Context, points []point, expr expression.E if len(args) > 2 { funcName = ast.In } - return expression.NewFunctionInternal(ctx, funcName, sf.GetType(), args...) + return expression.NewFunctionInternal(ctx, funcName, col.GetType(), args...) } // DetachCondAndBuildRangeForPartition will detach the index filters from table filters. diff --git a/util/ranger/ranger_test.go b/util/ranger/ranger_test.go index 87d3fa6788f17..e26624f752381 100644 --- a/util/ranger/ranger_test.go +++ b/util/ranger/ranger_test.go @@ -377,14 +377,14 @@ create table t( { indexPos: 0, exprStr: "a LIKE 'abc'", - accessConds: "[eq(test.t.a, abc)]", + accessConds: "[like(test.t.a, abc, 92)]", filterConds: "[]", resultStr: "[[\"abc\",\"abc\"]]", }, { indexPos: 0, exprStr: `a LIKE "ab\_c"`, - accessConds: "[eq(test.t.a, ab_c)]", + accessConds: "[like(test.t.a, ab\\_c, 92)]", filterConds: "[]", resultStr: "[[\"ab_c\",\"ab_c\"]]", }, @@ -398,14 +398,14 @@ create table t( { indexPos: 0, exprStr: `a LIKE '\%a'`, - accessConds: "[eq(test.t.a, %a)]", + accessConds: "[like(test.t.a, \\%a, 92)]", filterConds: "[]", resultStr: `[["%a","%a"]]`, }, { indexPos: 0, exprStr: `a LIKE "\\"`, - accessConds: "[eq(test.t.a, \\)]", + accessConds: "[like(test.t.a, \\, 92)]", filterConds: "[]", resultStr: "[[\"\\\",\"\\\"]]", }, @@ -561,7 +561,7 @@ create table t( exprStr: `e = "你好啊"`, accessConds: "[eq(test.t.e, 你好啊)]", filterConds: "[eq(test.t.e, 你好啊)]", - resultStr: "[[\"[228 189]\",\"[228 189]\"]]", + resultStr: "[[0xE4BD,0xE4BD]]", }, { indexPos: 2, @@ -582,7 +582,7 @@ create table t( exprStr: `d < "你好" || d > "你好"`, accessConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", filterConds: "[or(lt(test.t.d, 你好), gt(test.t.d, 你好))]", - resultStr: "[[-inf,\"你好\") (\"你好\",+inf]]", + resultStr: "[[-inf,+inf]]", }, { indexPos: 2, @@ -654,7 +654,7 @@ create table t( } // for issue #6661 -func (s *testRangerSuite) TestIndexRangeForUnsignedInt(c *C) { +func (s *testRangerSuite) TestIndexRangeForUnsignedAndOverflow(c *C) { defer testleak.AfterTest(c)() dom, store, err := newDomainStoreWithBootstrap(c) defer func() { @@ -665,8 +665,21 @@ func (s *testRangerSuite) TestIndexRangeForUnsignedInt(c *C) { testKit := testkit.NewTestKit(c, store) testKit.MustExec("use test") testKit.MustExec("drop table if exists t") - testKit.MustExec("create table t (a smallint(5) unsigned,key (a) )") - + testKit.MustExec(` +create table t( + a smallint(5) unsigned, + decimal_unsigned decimal unsigned, + float_unsigned float unsigned, + double_unsigned double unsigned, + col_int bigint, + col_float float, + index idx_a(a), + index idx_decimal_unsigned(decimal_unsigned), + index idx_float_unsigned(float_unsigned), + index idx_double_unsigned(double_unsigned), + index idx_int(col_int), + index idx_float(col_float) +)`) tests := []struct { indexPos int exprStr string @@ -742,6 +755,63 @@ func (s *testRangerSuite) TestIndexRangeForUnsignedInt(c *C) { filterConds: "[]", resultStr: "[]", }, + { + indexPos: 1, + exprStr: "decimal_unsigned > -100", + accessConds: "[gt(test.t.decimal_unsigned, -100)]", + filterConds: "[]", + resultStr: "[[0,+inf]]", + }, + { + indexPos: 2, + exprStr: "float_unsigned > -100", + accessConds: "[gt(test.t.float_unsigned, -100)]", + filterConds: "[]", + resultStr: "[[0,+inf]]", + }, + { + indexPos: 3, + exprStr: "double_unsigned > -100", + accessConds: "[gt(test.t.double_unsigned, -100)]", + filterConds: "[]", + resultStr: "[[0,+inf]]", + }, + // test for overflow value access index + { + indexPos: 4, + exprStr: "col_int != 9223372036854775808", + accessConds: "[ne(test.t.col_int, 9223372036854775808)]", + filterConds: "[]", + resultStr: "[[-inf,+inf]]", + }, + { + indexPos: 4, + exprStr: "col_int > 9223372036854775808", + accessConds: "[gt(test.t.col_int, 9223372036854775808)]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 4, + exprStr: "col_int < 9223372036854775808", + accessConds: "[lt(test.t.col_int, 9223372036854775808)]", + filterConds: "[]", + resultStr: "[[-inf,+inf]]", + }, + { + indexPos: 5, + exprStr: "col_float > 1000000000000000000000000000000000000000", + accessConds: "[gt(test.t.col_float, 1e+39)]", + filterConds: "[]", + resultStr: "[]", + }, + { + indexPos: 5, + exprStr: "col_float < -1000000000000000000000000000000000000000", + accessConds: "[lt(test.t.col_float, -1e+39)]", + filterConds: "[]", + resultStr: "[]", + }, } ctx := context.Background() @@ -795,6 +865,22 @@ func (s *testRangerSuite) TestColumnRange(c *C) { resultStr string length int }{ + { + colPos: 0, + exprStr: "(a = 2 or a = 2) and (a = 2 or a = 2)", + accessConds: "[or(eq(test.t.a, 2), eq(test.t.a, 2)) or(eq(test.t.a, 2), eq(test.t.a, 2))]", + filterConds: "[]", + resultStr: "[[2,2]]", + length: types.UnspecifiedLength, + }, + { + colPos: 0, + exprStr: "(a = 2 or a = 1) and (a = 3 or a = 4)", + accessConds: "[or(eq(test.t.a, 2), eq(test.t.a, 1)) or(eq(test.t.a, 3), eq(test.t.a, 4))]", + filterConds: "[]", + resultStr: "[]", + length: types.UnspecifiedLength, + }, { colPos: 0, exprStr: "a = 1 and b > 1", @@ -939,11 +1025,11 @@ func (s *testRangerSuite) TestColumnRange(c *C) { resultStr: "[[-inf,1) (2,+inf]]", length: types.UnspecifiedLength, }, - //{ - // `a > null` will be converted to `castAsString(a) > null` which can not be extracted as access condition. - // exprStr: "a not between null and 0", - // resultStr[(0,+inf]] - //}, + // { + // `a > null` will be converted to `castAsString(a) > null` which can not be extracted as access condition. + // exprStr: "a not between null and 0", + // resultStr[(0,+inf]] + // }, { colPos: 0, exprStr: "a between 2 and 1", @@ -1133,16 +1219,16 @@ func (s *testRangerSuite) TestIndexRangeElimininatedProjection(c *C) { testKit := testkit.NewTestKit(c, store) testKit.MustExec("use test") testKit.MustExec("drop table if exists t") - testKit.MustExec("set @@tidb_enable_clustered_index=0") + testKit.Se.GetSessionVars().EnableClusteredIndex = false testKit.MustExec("create table t(a int not null, b int not null, primary key(a,b))") testKit.MustExec("insert into t values(1,2)") testKit.MustExec("analyze table t") - testKit.MustQuery("explain select * from (select * from t union all select ifnull(a,b), b from t) sub where a > 0").Check(testkit.Rows( - "Union_11 2.00 root ", - "├─IndexReader_14 1.00 root index:IndexRangeScan_13", - "│ └─IndexRangeScan_13 1.00 cop[tikv] table:t, index:PRIMARY(a, b) range:(0,+inf], keep order:false", - "└─IndexReader_17 1.00 root index:IndexRangeScan_16", - " └─IndexRangeScan_16 1.00 cop[tikv] table:t, index:PRIMARY(a, b) range:(0,+inf], keep order:false", + testKit.MustQuery("explain format = 'brief' select * from (select * from t union all select ifnull(a,b), b from t) sub where a > 0").Check(testkit.Rows( + "Union 2.00 root ", + "├─IndexReader 1.00 root index:IndexRangeScan", + "│ └─IndexRangeScan 1.00 cop[tikv] table:t, index:PRIMARY(a, b) range:(0,+inf], keep order:false", + "└─IndexReader 1.00 root index:IndexRangeScan", + " └─IndexRangeScan 1.00 cop[tikv] table:t, index:PRIMARY(a, b) range:(0,+inf], keep order:false", )) testKit.MustQuery("select * from (select * from t union all select ifnull(a,b), b from t) sub where a > 0").Check(testkit.Rows( "1 2", @@ -1193,7 +1279,7 @@ func (s *testRangerSuite) TestIndexStringIsTrueRange(c *C) { testKit.MustExec("drop table if exists t0") testKit.MustExec("CREATE TABLE t0(c0 TEXT(10));") testKit.MustExec("INSERT INTO t0(c0) VALUES (1);") - testKit.MustExec("CREATE INDEX i0 ON t0(c0(10));") + testKit.MustExec("CREATE INDEX i0 ON t0(c0(255));") testKit.MustExec("analyze table t0;") var input []string @@ -1253,6 +1339,7 @@ func (s *testRangerSuite) TestCompIndexMultiColDNF1(c *C) { c.Assert(err, IsNil) testKit := testkit.NewTestKit(c, store) testKit.MustExec("use test") + testKit.Se.GetSessionVars().EnableClusteredIndex = true testKit.MustExec("drop table if exists t") testKit.MustExec("create table t(a int, b int, c int, primary key(a,b));") testKit.MustExec("insert into t values(1,1,1),(2,2,3)") @@ -1286,6 +1373,7 @@ func (s *testRangerSuite) TestCompIndexMultiColDNF2(c *C) { c.Assert(err, IsNil) testKit := testkit.NewTestKit(c, store) testKit.MustExec("use test") + testKit.Se.GetSessionVars().EnableClusteredIndex = true testKit.MustExec("drop table if exists t") testKit.MustExec("create table t(a int, b int, c int, primary key(a,b,c));") testKit.MustExec("insert into t values(1,1,1),(2,2,3)") @@ -1308,3 +1396,308 @@ func (s *testRangerSuite) TestCompIndexMultiColDNF2(c *C) { testKit.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) } } + +func (s *testRangerSuite) TestPrefixIndexMultiColDNF(c *C) { + defer testleak.AfterTest(c)() + dom, store, err := newDomainStoreWithBootstrap(c) + defer func() { + dom.Close() + store.Close() + }() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + testKit.MustExec("use test;") + testKit.MustExec("drop table if exists t2;") + testKit.MustExec("create table t2 (id int unsigned not null auto_increment primary key, t text, index(t(3)));") + testKit.MustExec("insert into t2 (t) values ('aaaa'),('a');") + + var input []string + var output []struct { + SQL string + Plan []string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + inputLen := len(input) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(testKit.MustQuery("explain " + tt).Rows()) + output[i].Result = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + testKit.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + if i+1 == inputLen/2 { + testKit.MustExec("analyze table t2;") + } + } +} + +func (s *testRangerSuite) TestIndexRangeForBit(c *C) { + defer testleak.AfterTest(c)() + dom, store, err := newDomainStoreWithBootstrap(c) + defer func() { + dom.Close() + store.Close() + }() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + testKit.MustExec("use test;") + testKit.MustExec("set @@tidb_partition_prune_mode = 'static';") + testKit.MustExec("set @@tidb_executor_concurrency = 1;") + testKit.MustExec("drop table if exists t;") + testKit.MustExec("CREATE TABLE `t` (" + + "a bit(1) DEFAULT NULL," + + "b int(11) DEFAULT NULL" + + ") PARTITION BY HASH(a)" + + "PARTITIONS 3;") + testKit.MustExec("insert ignore into t values(-1, -1), (0, 0), (1, 1), (3, 3);") + testKit.MustExec("analyze table t;") + + var input []string + var output []struct { + SQL string + Plan []string + Result []string + } + s.testData.GetTestCases(c, &input, &output) + for i, tt := range input { + s.testData.OnRecord(func() { + output[i].SQL = tt + output[i].Plan = s.testData.ConvertRowsToStrings(testKit.MustQuery("explain " + tt).Rows()) + output[i].Result = s.testData.ConvertRowsToStrings(testKit.MustQuery(tt).Rows()) + }) + testKit.MustQuery("explain " + tt).Check(testkit.Rows(output[i].Plan...)) + testKit.MustQuery(tt).Check(testkit.Rows(output[i].Result...)) + } +} + +func (s *testRangerSuite) TestIndexRangeForYear(c *C) { + defer testleak.AfterTest(c)() + dom, store, err := newDomainStoreWithBootstrap(c) + defer func() { + dom.Close() + store.Close() + }() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + + // for issue #20101: overflow when converting integer to year + testKit.MustExec("use test") + testKit.MustExec("DROP TABLE IF EXISTS `table_30_utf8_undef`") + testKit.MustExec("CREATE TABLE `table_30_utf8_undef` (\n `pk` int(11) NOT NULL\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin") + testKit.MustExec("INSERT INTO `table_30_utf8_undef` VALUES (29)") + + testKit.MustExec("DROP TABLE IF EXISTS `table_40_utf8_4`") + testKit.MustExec("CREATE TABLE `table_40_utf8_4`(\n `pk` int(11) NOT NULL,\n `col_int_key_unsigned` int(10) unsigned DEFAULT NULL,\n `col_year_key_signed` year(4) DEFAULT NULL,\n" + + "PRIMARY KEY (`pk`),\n KEY `col_int_key_unsigned` (`col_int_key_unsigned`),\n KEY `col_year_key_signed` (`col_year_key_signed`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin") + + testKit.MustExec("INSERT INTO `table_40_utf8_4` VALUES (36, 10 ,1)") + + testKit.MustQuery("SELECT sum(tmp.val) AS val FROM (" + + "SELECT count(1) AS val FROM table_40_utf8_4 JOIN table_30_utf8_undef\n" + + "WHERE table_40_utf8_4.col_year_key_signed!=table_40_utf8_4.col_int_key_unsigned\n" + + "AND table_40_utf8_4.col_int_key_unsigned=\"15698\") AS tmp"). + Check(testkit.Rows("0")) + + // test index range + testKit.MustExec("DROP TABLE IF EXISTS t") + testKit.MustExec("CREATE TABLE t (a year(4), key(a))") + testKit.MustExec("INSERT INTO t VALUES (1), (70), (99), (0), ('0')") + testKit.MustQuery("SELECT * FROM t WHERE a < 15698").Check(testkit.Rows("0", "1970", "1999", "2000", "2001")) + testKit.MustQuery("SELECT * FROM t WHERE a <= 0").Check(testkit.Rows("0")) + testKit.MustQuery("SELECT * FROM t WHERE a <= 1").Check(testkit.Rows("0", "1970", "1999", "2000", "2001")) + testKit.MustQuery("SELECT * FROM t WHERE a < 2000").Check(testkit.Rows("0", "1970", "1999")) + testKit.MustQuery("SELECT * FROM t WHERE a > -1").Check(testkit.Rows("0", "1970", "1999", "2000", "2001")) + + tests := []struct { + indexPos int + exprStr string + accessConds string + filterConds string + resultStr string + }{ + { + indexPos: 0, + exprStr: `a not in (0, 1, 2)`, + accessConds: "[not(in(test.t.a, 0, 1, 2))]", + filterConds: "[]", + resultStr: `[(NULL,0) (0,2001) (2002,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a not in (-1, 1, 2)`, + accessConds: "[not(in(test.t.a, -1, 1, 2))]", + filterConds: "[]", + resultStr: `[(NULL,0) [0,2001) (2002,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a not in (1, 2, 70)`, + accessConds: "[not(in(test.t.a, 1, 2, 70))]", // this is in accordance with MySQL, MySQL won't interpret 70 here as 1970 + filterConds: "[]", + resultStr: `[(NULL,1970) (1970,2001) (2002,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a = 1 or a = 2 or a = 70`, + accessConds: "[or(eq(test.t.a, 2001), or(eq(test.t.a, 2002), eq(test.t.a, 1970)))]", // this is in accordance with MySQL, MySQL won't interpret 70 here as 1970 + filterConds: "[]", + resultStr: `[[1970,1970] [2001,2002]]`, + }, + { + indexPos: 0, + exprStr: `a not in (99)`, + accessConds: "[ne(test.t.a, 1999)]", // this is in accordance with MySQL + filterConds: "[]", + resultStr: `[[-inf,1999) (1999,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a not in (1, 2, 15698)`, + accessConds: "[not(in(test.t.a, 1, 2, 15698))]", + filterConds: "[]", + resultStr: `[(NULL,2001) (2002,2155] (2155,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a >= -1000`, + accessConds: "[ge(test.t.a, -1000)]", + filterConds: "[]", + resultStr: `[[0,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a > -1000`, + accessConds: "[gt(test.t.a, -1000)]", + filterConds: "[]", + resultStr: `[[0,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a != 1`, + accessConds: "[ne(test.t.a, 2001)]", + filterConds: "[]", + resultStr: `[[-inf,2001) (2001,+inf]]`, + }, + { + indexPos: 0, + exprStr: `a != 2156`, + accessConds: "[ne(test.t.a, 2156)]", + filterConds: "[]", + resultStr: `[[-inf,2155] (2155,+inf]]`, + }, + { + exprStr: "a < 99 or a > 01", + accessConds: "[or(lt(test.t.a, 1999), gt(test.t.a, 2001))]", + filterConds: "[]", + resultStr: "[[-inf,1999) (2001,+inf]]", + }, + { + exprStr: "a >= 70 and a <= 69", + accessConds: "[ge(test.t.a, 1970) le(test.t.a, 2069)]", + filterConds: "[]", + resultStr: "[[1970,2069]]", + }, + } + + ctx := context.Background() + for _, tt := range tests { + sql := "select * from t where " + tt.exprStr + sctx := testKit.Se.(sessionctx.Context) + stmts, err := session.Parse(sctx, sql) + c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, tt.exprStr)) + c.Assert(stmts, HasLen, 1) + is := domain.GetDomain(sctx).InfoSchema() + err = plannercore.Preprocess(sctx, stmts[0], is) + c.Assert(err, IsNil, Commentf("error %v, for resolve name, expr %s", err, tt.exprStr)) + p, _, err := plannercore.BuildLogicalPlan(ctx, sctx, stmts[0], is) + c.Assert(err, IsNil, Commentf("error %v, for build plan, expr %s", err, tt.exprStr)) + selection := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) + tbl := selection.Children()[0].(*plannercore.DataSource).TableInfo() + c.Assert(selection, NotNil, Commentf("expr:%v", tt.exprStr)) + conds := make([]expression.Expression, len(selection.Conditions)) + for i, cond := range selection.Conditions { + conds[i] = expression.PushDownNot(sctx, cond) + } + cols, lengths := expression.IndexInfo2PrefixCols(tbl.Columns, selection.Schema().Columns, tbl.Indices[tt.indexPos]) + c.Assert(cols, NotNil) + res, err := ranger.DetachCondAndBuildRangeForIndex(sctx, conds, cols, lengths) + c.Assert(err, IsNil) + c.Assert(fmt.Sprintf("%s", res.AccessConds), Equals, tt.accessConds, Commentf("wrong access conditions for expr: %s", tt.exprStr)) + c.Assert(fmt.Sprintf("%s", res.RemainedConds), Equals, tt.filterConds, Commentf("wrong filter conditions for expr: %s", tt.exprStr)) + got := fmt.Sprintf("%v", res.Ranges) + c.Assert(got, Equals, tt.resultStr, Commentf("different for expr %s", tt.exprStr)) + } +} + +// For https://github.com/pingcap/tidb/issues/22032 +func (s *testRangerSuite) TestPrefixIndexRangeScan(c *C) { + defer testleak.AfterTest(c)() + dom, store, err := newDomainStoreWithBootstrap(c) + defer func() { + dom.Close() + store.Close() + }() + c.Assert(err, IsNil) + testKit := testkit.NewTestKit(c, store) + + testKit.MustExec("use test") + testKit.MustExec("drop table if exists t") + testKit.MustExec("create table t (a varchar(50), b varchar(50), index idx_a(a(2)), index idx_ab(a(2), b(2)))") + testKit.MustExec("insert into t values ('aa', 'bb'), ('aaa', 'bbb')") + testKit.MustQuery("select * from t use index (idx_a) where a > 'aa'").Check(testkit.Rows("aaa bbb")) + testKit.MustQuery("select * from t use index (idx_ab) where a = 'aaa' and b > 'bb' and b < 'cc'").Check(testkit.Rows("aaa bbb")) + + tests := []struct { + indexPos int + exprStr string + accessConds string + filterConds string + resultStr string + }{ + { + indexPos: 0, + exprStr: "a > 'aa'", + accessConds: "[gt(test.t.a, aa)]", + filterConds: "[gt(test.t.a, aa)]", + resultStr: "[[\"aa\",+inf]]", + }, + { + indexPos: 1, + exprStr: "a = 'aaa' and b > 'bb' and b < 'cc'", + accessConds: "[eq(test.t.a, aaa) gt(test.t.b, bb) lt(test.t.b, cc)]", + filterConds: "[eq(test.t.a, aaa) gt(test.t.b, bb) lt(test.t.b, cc)]", + resultStr: "[[\"aa\" \"bb\",\"aa\" \"cc\")]", + }, + } + + ctx := context.Background() + for _, tt := range tests { + sql := "select * from t where " + tt.exprStr + sctx := testKit.Se.(sessionctx.Context) + stmts, err := session.Parse(sctx, sql) + c.Assert(err, IsNil, Commentf("error %v, for expr %s", err, tt.exprStr)) + c.Assert(stmts, HasLen, 1) + is := domain.GetDomain(sctx).InfoSchema() + err = plannercore.Preprocess(sctx, stmts[0], is) + c.Assert(err, IsNil, Commentf("error %v, for resolve name, expr %s", err, tt.exprStr)) + p, _, err := plannercore.BuildLogicalPlan(ctx, sctx, stmts[0], is) + c.Assert(err, IsNil, Commentf("error %v, for build plan, expr %s", err, tt.exprStr)) + selection := p.(plannercore.LogicalPlan).Children()[0].(*plannercore.LogicalSelection) + tbl := selection.Children()[0].(*plannercore.DataSource).TableInfo() + c.Assert(selection, NotNil, Commentf("expr:%v", tt.exprStr)) + conds := make([]expression.Expression, len(selection.Conditions)) + for i, cond := range selection.Conditions { + conds[i] = expression.PushDownNot(sctx, cond) + } + cols, lengths := expression.IndexInfo2PrefixCols(tbl.Columns, selection.Schema().Columns, tbl.Indices[tt.indexPos]) + c.Assert(cols, NotNil) + res, err := ranger.DetachCondAndBuildRangeForIndex(sctx, conds, cols, lengths) + c.Assert(err, IsNil) + c.Assert(fmt.Sprintf("%s", res.AccessConds), Equals, tt.accessConds, Commentf("wrong access conditions for expr: %s", tt.exprStr)) + c.Assert(fmt.Sprintf("%s", res.RemainedConds), Equals, tt.filterConds, Commentf("wrong filter conditions for expr: %s", tt.exprStr)) + got := fmt.Sprintf("%v", res.Ranges) + c.Assert(got, Equals, tt.resultStr, Commentf("different for expr %s", tt.exprStr)) + } +} diff --git a/util/ranger/testdata/ranger_suite_in.json b/util/ranger/testdata/ranger_suite_in.json index ef91c4d91e0b9..20959385d317d 100644 --- a/util/ranger/testdata/ranger_suite_in.json +++ b/util/ranger/testdata/ranger_suite_in.json @@ -2,20 +2,20 @@ { "name": "TestCompIndexInExprCorrCol", "cases": [ - "explain select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t", + "explain format = 'brief' select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t", "select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t" ] }, { "name": "TestIndexStringIsTrueRange", "cases": [ - "explain select * from t0 where c0", - "explain select * from t0 where c0 and c0 > '123'", - "explain select * from t0 where c0 and c0 <> '123'", - "explain select * from t0 where c0 is true", - "explain select * from t0 where c0 is false", - "explain select * from t0 where c0 and c0 in ('123','456','789')", - "explain SELECT * FROM t0 WHERE ('a' != t0.c0) AND t0.c0;" + "explain format = 'brief' select * from t0 where c0", + "explain format = 'brief' select * from t0 where c0 and c0 > '123'", + "explain format = 'brief' select * from t0 where c0 and c0 <> '123'", + "explain format = 'brief' select * from t0 where c0 is true", + "explain format = 'brief' select * from t0 where c0 is false", + "explain format = 'brief' select * from t0 where c0 and c0 in ('123','456','789')", + "explain format = 'brief' select * FROM t0 WHERE ('a' != t0.c0) AND t0.c0;" ] }, { @@ -58,5 +58,31 @@ "select * from t where (a,b) in ((1,1),(2,2)) and c > 2;", "select * from t where ((a = 1 and b = 1) or (a = 2 and b = 2)) and c > 2;" ] + }, + { + "name": "TestPrefixIndexMultiColDNF", + "cases": [ + "select * from t2 where t='aaaa';", + "select * from t2 where t='aaaa' or t = 'a';", + "select * from t2 where t='aaaa';", + "select * from t2 where t='aaaa' or t = 'a';" + ] + }, + { + "name": "TestIndexRangeForBit", + "cases": [ + "select * from t;", + "select * from t where a = 0;", + "select * from t where a = 0 or a = 4;", + "select * from t where a = 1;", + "select * from t where a = -1;", + "select * from t where a = 3;", + "select * from t where a < 1;", + "select * from t where a < 3;", + "select * from t where a < -1;", + "select * from t where a > 0;", + "select * from t where a > -1;", + "select * from t where a > 3;" + ] } ] diff --git a/util/ranger/testdata/ranger_suite_out.json b/util/ranger/testdata/ranger_suite_out.json index afc482289f272..c0127b7f76e2f 100644 --- a/util/ranger/testdata/ranger_suite_out.json +++ b/util/ranger/testdata/ranger_suite_out.json @@ -3,18 +3,18 @@ "Name": "TestCompIndexInExprCorrCol", "Cases": [ { - "SQL": "explain select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t", + "SQL": "explain format = 'brief' select t.e in (select count(*) from t s use index(idx), t t1 where s.b = 1 and s.c in (1, 2) and s.d = t.a and s.a = t1.a) from t", "Result": [ - "Projection_11 2.00 root Column#17", - "└─Apply_13 2.00 root CARTESIAN left outer semi join, other cond:eq(test.t.e, Column#16)", - " ├─TableReader_15(Build) 2.00 root data:TableFullScan_14", - " │ └─TableFullScan_14 2.00 cop[tikv] table:t keep order:false", - " └─StreamAgg_20(Probe) 1.00 root funcs:count(1)->Column#16", - " └─IndexMergeJoin_46 2.00 root inner join, inner:TableReader_41, outer key:test.t.a, inner key:test.t.a", - " ├─IndexReader_33(Build) 2.00 root index:IndexRangeScan_32", - " │ └─IndexRangeScan_32 2.00 cop[tikv] table:s, index:idx(b, c, d) range: decided by [eq(test.t.b, 1) in(test.t.c, 1, 2) eq(test.t.d, test.t.a)], keep order:false", - " └─TableReader_41(Probe) 1.00 root data:TableRangeScan_40", - " └─TableRangeScan_40 1.00 cop[tikv] table:t1 range: decided by [test.t.a], keep order:true" + "Projection 2.00 root Column#17", + "└─Apply 2.00 root CARTESIAN left outer semi join, other cond:eq(test.t.e, Column#16)", + " ├─TableReader(Build) 2.00 root data:TableFullScan", + " │ └─TableFullScan 2.00 cop[tikv] table:t keep order:false", + " └─StreamAgg(Probe) 1.00 root funcs:count(1)->Column#16", + " └─HashJoin 2.00 root inner join, equal:[eq(test.t.a, test.t.a)]", + " ├─TableReader(Build) 2.00 root data:TableFullScan", + " │ └─TableFullScan 2.00 cop[tikv] table:t1 keep order:false", + " └─IndexReader(Probe) 2.00 root index:IndexRangeScan", + " └─IndexRangeScan 2.00 cop[tikv] table:s, index:idx(b, c, d) range: decided by [eq(test.t.b, 1) in(test.t.c, 1, 2) eq(test.t.d, test.t.a)], keep order:false" ] }, { @@ -30,59 +30,59 @@ "Name": "TestIndexStringIsTrueRange", "Cases": [ { - "SQL": "explain select * from t0 where c0", + "SQL": "explain format = 'brief' select * from t0 where c0", "Result": [ - "TableReader_7 0.80 root data:Selection_6", - "└─Selection_6 0.80 cop[tikv] test.t0.c0", - " └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false" + "TableReader 0.80 root data:Selection", + "└─Selection 0.80 cop[tikv] test.t0.c0", + " └─TableFullScan 1.00 cop[tikv] table:t0 keep order:false" ] }, { - "SQL": "explain select * from t0 where c0 and c0 > '123'", + "SQL": "explain format = 'brief' select * from t0 where c0 and c0 > '123'", "Result": [ - "IndexReader_7 1.00 root index:Selection_6", - "└─Selection_6 1.00 cop[tikv] test.t0.c0", - " └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:(\"123\",+inf], keep order:false" + "IndexReader 1.00 root index:Selection", + "└─Selection 1.00 cop[tikv] test.t0.c0", + " └─IndexRangeScan 1.00 cop[tikv] table:t0, index:i0(c0) range:(\"123\",+inf], keep order:false" ] }, { - "SQL": "explain select * from t0 where c0 and c0 <> '123'", + "SQL": "explain format = 'brief' select * from t0 where c0 and c0 <> '123'", "Result": [ - "IndexReader_7 1.00 root index:Selection_6", - "└─Selection_6 1.00 cop[tikv] test.t0.c0", - " └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"123\"), (\"123\",+inf], keep order:false" + "IndexReader 1.00 root index:Selection", + "└─Selection 1.00 cop[tikv] test.t0.c0", + " └─IndexRangeScan 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"123\"), (\"123\",+inf], keep order:false" ] }, { - "SQL": "explain select * from t0 where c0 is true", + "SQL": "explain format = 'brief' select * from t0 where c0 is true", "Result": [ - "TableReader_7 0.80 root data:Selection_6", - "└─Selection_6 0.80 cop[tikv] istrue(cast(test.t0.c0))", - " └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false" + "TableReader 0.80 root data:Selection", + "└─Selection 0.80 cop[tikv] istrue(cast(test.t0.c0))", + " └─TableFullScan 1.00 cop[tikv] table:t0 keep order:false" ] }, { - "SQL": "explain select * from t0 where c0 is false", + "SQL": "explain format = 'brief' select * from t0 where c0 is false", "Result": [ - "TableReader_7 0.80 root data:Selection_6", - "└─Selection_6 0.80 cop[tikv] isfalse(cast(test.t0.c0))", - " └─TableFullScan_5 1.00 cop[tikv] table:t0 keep order:false" + "TableReader 0.80 root data:Selection", + "└─Selection 0.80 cop[tikv] isfalse(cast(test.t0.c0))", + " └─TableFullScan 1.00 cop[tikv] table:t0 keep order:false" ] }, { - "SQL": "explain select * from t0 where c0 and c0 in ('123','456','789')", + "SQL": "explain format = 'brief' select * from t0 where c0 and c0 in ('123','456','789')", "Result": [ - "IndexReader_7 1.00 root index:Selection_6", - "└─Selection_6 1.00 cop[tikv] test.t0.c0", - " └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[\"123\",\"123\"], [\"456\",\"456\"], [\"789\",\"789\"], keep order:false" + "IndexReader 1.00 root index:Selection", + "└─Selection 1.00 cop[tikv] test.t0.c0", + " └─IndexRangeScan 1.00 cop[tikv] table:t0, index:i0(c0) range:[\"123\",\"123\"], [\"456\",\"456\"], [\"789\",\"789\"], keep order:false" ] }, { - "SQL": "explain SELECT * FROM t0 WHERE ('a' != t0.c0) AND t0.c0;", + "SQL": "explain format = 'brief' select * FROM t0 WHERE ('a' != t0.c0) AND t0.c0;", "Result": [ - "IndexReader_7 1.00 root index:Selection_6", - "└─Selection_6 1.00 cop[tikv] test.t0.c0", - " └─IndexRangeScan_5 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"a\"), (\"a\",+inf], keep order:false" + "IndexReader 1.00 root index:Selection", + "└─Selection 1.00 cop[tikv] test.t0.c0", + " └─IndexRangeScan 1.00 cop[tikv] table:t0, index:i0(c0) range:[-inf,\"a\"), (\"a\",+inf], keep order:false" ] } ] @@ -123,7 +123,7 @@ { "SQL": "select * from t where a = 1 and (b = 1 or b = 2) and b = 3 and c > 1;", "Plan": [ - "TableDual_5 0.00 root rows:0" + "TableDual_5 8000.00 root rows:0" ], "Result": null }, @@ -169,9 +169,7 @@ { "SQL": "select * from t where a = 1 and b is null and b = 1 and c > 1;", "Plan": [ - "IndexReader_7 0.27 root index:Selection_6", - "└─Selection_6 0.27 cop[tikv] isnull(test.t.b)", - " └─IndexRangeScan_5 0.33 cop[tikv] table:t, index:a(a, b, c) range:(1 1 1,1 1 +inf], keep order:false, stats:pseudo" + "TableDual_5 8000.00 root rows:0" ], "Result": null } @@ -334,5 +332,226 @@ ] } ] + }, + { + "Name": "TestPrefixIndexMultiColDNF", + "Cases": [ + { + "SQL": "select * from t2 where t='aaaa';", + "Plan": [ + "IndexLookUp_11 10.00 root ", + "├─IndexRangeScan_8(Build) 10.00 cop[tikv] table:t2, index:t(t) range:[\"aaa\",\"aaa\"], keep order:false, stats:pseudo", + "└─Selection_10(Probe) 10.00 cop[tikv] eq(test.t2.t, \"aaaa\")", + " └─TableRowIDScan_9 10.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Result": [ + "1 aaaa" + ] + }, + { + "SQL": "select * from t2 where t='aaaa' or t = 'a';", + "Plan": [ + "IndexLookUp_11 16.00 root ", + "├─IndexRangeScan_8(Build) 20.00 cop[tikv] table:t2, index:t(t) range:[\"a\",\"a\"], [\"aaa\",\"aaa\"], keep order:false, stats:pseudo", + "└─Selection_10(Probe) 16.00 cop[tikv] or(eq(test.t2.t, \"aaaa\"), eq(test.t2.t, \"a\"))", + " └─TableRowIDScan_9 20.00 cop[tikv] table:t2 keep order:false, stats:pseudo" + ], + "Result": [ + "1 aaaa", + "2 a" + ] + }, + { + "SQL": "select * from t2 where t='aaaa';", + "Plan": [ + "TableReader_7 0.00 root data:Selection_6", + "└─Selection_6 0.00 cop[tikv] eq(test.t2.t, \"aaaa\")", + " └─TableRangeScan_5 2.00 cop[tikv] table:t2 range:[0,+inf], keep order:false" + ], + "Result": [ + "1 aaaa" + ] + }, + { + "SQL": "select * from t2 where t='aaaa' or t = 'a';", + "Plan": [ + "TableReader_7 0.80 root data:Selection_6", + "└─Selection_6 0.80 cop[tikv] or(eq(test.t2.t, \"aaaa\"), eq(test.t2.t, \"a\"))", + " └─TableRangeScan_5 2.00 cop[tikv] table:t2 range:[0,+inf], keep order:false" + ], + "Result": [ + "1 aaaa", + "2 a" + ] + } + ] + }, + { + "Name": "TestIndexRangeForBit", + "Cases": [ + { + "SQL": "select * from t;", + "Plan": [ + "PartitionUnion_9 10004.00 root ", + "├─TableReader_11 1.00 root data:TableFullScan_10", + "│ └─TableFullScan_10 1.00 cop[tikv] table:t, partition:p0 keep order:false", + "├─TableReader_13 3.00 root data:TableFullScan_12", + "│ └─TableFullScan_12 3.00 cop[tikv] table:t, partition:p1 keep order:false", + "└─TableReader_15 10000.00 root data:TableFullScan_14", + " └─TableFullScan_14 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "\u0000 0", + "\u0001 -1", + "\u0001 1", + "\u0001 3" + ] + }, + { + "SQL": "select * from t where a = 0;", + "Plan": [ + "Selection_7 0.80 root eq(test.t.a, 0)", + "└─TableReader_9 1.00 root data:TableFullScan_8", + " └─TableFullScan_8 1.00 cop[tikv] table:t, partition:p0 keep order:false" + ], + "Result": [ + "\u0000 0" + ] + }, + { + "SQL": "select * from t where a = 0 or a = 4;", + "Plan": [ + "Selection_7 0.80 root or(eq(test.t.a, 0), eq(test.t.a, 4))", + "└─TableReader_9 1.00 root data:TableFullScan_8", + " └─TableFullScan_8 1.00 cop[tikv] table:t, partition:p0 keep order:false" + ], + "Result": [ + "\u0000 0" + ] + }, + { + "SQL": "select * from t where a = 1;", + "Plan": [ + "Selection_7 2.40 root eq(test.t.a, 1)", + "└─TableReader_9 3.00 root data:TableFullScan_8", + " └─TableFullScan_8 3.00 cop[tikv] table:t, partition:p1 keep order:false" + ], + "Result": [ + "\u0001 -1", + "\u0001 1", + "\u0001 3" + ] + }, + { + "SQL": "select * from t where a = -1;", + "Plan": [ + "Selection_7 0.00 root eq(test.t.a, -1)", + "└─TableDual_8 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t where a = 3;", + "Plan": [ + "Selection_7 0.00 root eq(test.t.a, 3)", + "└─TableDual_8 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t where a < 1;", + "Plan": [ + "Selection_10 8003.20 root lt(test.t.a, 1)", + "└─PartitionUnion_11 10004.00 root ", + " ├─TableReader_13 1.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 1.00 cop[tikv] table:t, partition:p0 keep order:false", + " ├─TableReader_15 3.00 root data:TableFullScan_14", + " │ └─TableFullScan_14 3.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader_17 10000.00 root data:TableFullScan_16", + " └─TableFullScan_16 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "\u0000 0" + ] + }, + { + "SQL": "select * from t where a < 3;", + "Plan": [ + "Selection_10 8003.20 root lt(test.t.a, 3)", + "└─PartitionUnion_11 10004.00 root ", + " ├─TableReader_13 1.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 1.00 cop[tikv] table:t, partition:p0 keep order:false", + " ├─TableReader_15 3.00 root data:TableFullScan_14", + " │ └─TableFullScan_14 3.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader_17 10000.00 root data:TableFullScan_16", + " └─TableFullScan_16 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "\u0000 0", + "\u0001 -1", + "\u0001 1", + "\u0001 3" + ] + }, + { + "SQL": "select * from t where a < -1;", + "Plan": [ + "Selection_7 0.00 root lt(test.t.a, -1)", + "└─TableDual_8 0.00 root rows:0" + ], + "Result": null + }, + { + "SQL": "select * from t where a > 0;", + "Plan": [ + "Selection_10 8003.20 root gt(test.t.a, 0)", + "└─PartitionUnion_11 10004.00 root ", + " ├─TableReader_13 1.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 1.00 cop[tikv] table:t, partition:p0 keep order:false", + " ├─TableReader_15 3.00 root data:TableFullScan_14", + " │ └─TableFullScan_14 3.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader_17 10000.00 root data:TableFullScan_16", + " └─TableFullScan_16 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "\u0001 -1", + "\u0001 1", + "\u0001 3" + ] + }, + { + "SQL": "select * from t where a > -1;", + "Plan": [ + "Selection_10 8003.20 root gt(test.t.a, -1)", + "└─PartitionUnion_11 10004.00 root ", + " ├─TableReader_13 1.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 1.00 cop[tikv] table:t, partition:p0 keep order:false", + " ├─TableReader_15 3.00 root data:TableFullScan_14", + " │ └─TableFullScan_14 3.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader_17 10000.00 root data:TableFullScan_16", + " └─TableFullScan_16 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": [ + "\u0000 0", + "\u0001 -1", + "\u0001 1", + "\u0001 3" + ] + }, + { + "SQL": "select * from t where a > 3;", + "Plan": [ + "Selection_10 8003.20 root gt(test.t.a, 3)", + "└─PartitionUnion_11 10004.00 root ", + " ├─TableReader_13 1.00 root data:TableFullScan_12", + " │ └─TableFullScan_12 1.00 cop[tikv] table:t, partition:p0 keep order:false", + " ├─TableReader_15 3.00 root data:TableFullScan_14", + " │ └─TableFullScan_14 3.00 cop[tikv] table:t, partition:p1 keep order:false", + " └─TableReader_17 10000.00 root data:TableFullScan_16", + " └─TableFullScan_16 10000.00 cop[tikv] table:t, partition:p2 keep order:false, stats:pseudo" + ], + "Result": null + } + ] } ] diff --git a/util/ranger/types.go b/util/ranger/types.go index fd75da35a725a..26548ac1815bb 100644 --- a/util/ranger/types.go +++ b/util/ranger/types.go @@ -105,7 +105,7 @@ func (ran *Range) IsPointNullable(sc *stmtctx.StatementContext) bool { return !ran.LowExclude && !ran.HighExclude } -//IsFullRange check if the range is full scan range +// IsFullRange check if the range is full scan range func (ran *Range) IsFullRange() bool { if len(ran.LowVal) != len(ran.HighVal) { return false @@ -122,6 +122,16 @@ func (ran *Range) IsFullRange() bool { return true } +// HasFullRange checks if any range in the slice is a full range. +func HasFullRange(ranges []*Range) bool { + for _, ran := range ranges { + if ran.IsFullRange() { + return true + } + } + return false +} + // String implements the Stringer interface. func (ran *Range) String() string { lowStrs := make([]string, 0, len(ran.LowVal)) @@ -201,7 +211,9 @@ func formatDatum(d types.Datum, isLeftSide bool) string { if d.GetUint64() == math.MaxUint64 && !isLeftSide { return "+inf" } - case types.KindString, types.KindBytes, types.KindMysqlEnum, types.KindMysqlSet, + case types.KindBytes: + return fmt.Sprintf("0x%X", d.GetValue()) + case types.KindString, types.KindMysqlEnum, types.KindMysqlSet, types.KindMysqlJSON, types.KindBinaryLiteral, types.KindMysqlBit: return fmt.Sprintf("\"%v\"", d.GetValue()) } diff --git a/util/redact/redact.go b/util/redact/redact.go deleted file mode 100644 index 11f894f5086f9..0000000000000 --- a/util/redact/redact.go +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright 2020 PingCAP, Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// See the License for the specific language governing permissions and -// limitations under the License. - -package redact - -import ( - "github.com/pingcap/parser/terror" - "github.com/pingcap/tidb/config" -) - -// TError is a alias, use to avoid `Error` method name in conflict with field name. -type TError = terror.Error - -type redactError struct { - *TError - redactPositions []int -} - -// GenWithStackByArgs generates a new *Error with the same class and code, and new arguments. -func (e *redactError) GenWithStackByArgs(args ...interface{}) error { - redactErrorArg(args, e.redactPositions) - return e.TError.GenWithStackByArgs(args...) -} - -// FastGen generates a new *Error with the same class and code, and a new arguments. -func (e *redactError) FastGenByArgs(args ...interface{}) error { - redactErrorArg(args, e.redactPositions) - return e.TError.GenWithStackByArgs(args...) -} - -// Equal checks if err is equal to e. -func (e *redactError) Equal(err error) bool { - if redactErr, ok := err.(*redactError); ok { - return e.TError.Equal(redactErr.TError) - } - return e.TError.Equal(err) -} - -// Cause implement the Cause interface. -func (e *redactError) Cause() error { - return e.TError -} - -func redactErrorArg(args []interface{}, position []int) { - if config.RedactLogEnabled() { - for _, pos := range position { - if len(args) > pos { - args[pos] = "?" - } - } - } -} - -// NewRedactError returns a new redact error. -func NewRedactError(err *terror.Error, redactPositions ...int) *redactError { - return &redactError{err, redactPositions} -} diff --git a/util/rowDecoder/decoder.go b/util/rowDecoder/decoder.go index 7d502dca38c51..111481ad7b40d 100644 --- a/util/rowDecoder/decoder.go +++ b/util/rowDecoder/decoder.go @@ -17,6 +17,7 @@ import ( "sort" "time" + "github.com/pingcap/parser/model" "github.com/pingcap/parser/mysql" "github.com/pingcap/tidb/expression" "github.com/pingcap/tidb/kv" @@ -37,14 +38,13 @@ type Column struct { // RowDecoder decodes a byte slice into datums and eval the generated column value. type RowDecoder struct { - tbl table.Table - mutRow chunk.MutRow - colMap map[int64]Column - colTypes map[int64]*types.FieldType - haveGenColumn bool - defaultVals []types.Datum - cols []*table.Column - pkCols []int64 + tbl table.Table + mutRow chunk.MutRow + colMap map[int64]Column + colTypes map[int64]*types.FieldType + defaultVals []types.Datum + cols []*table.Column + pkCols []int64 } // NewRowDecoder returns a new RowDecoder. @@ -57,7 +57,14 @@ func NewRowDecoder(tbl table.Table, cols []*table.Column, decodeColMap map[int64 tps := make([]*types.FieldType, len(cols)) for _, col := range cols { - tps[col.Offset] = &col.FieldType + if col.ChangeStateInfo == nil { + tps[col.Offset] = &col.FieldType + } else { + // Since changing column in the mutRow will be set with relative column's old value in the process of column-type-change, + // we should set fieldType as the relative column does. Otherwise it may get a panic, take change json to int as an example, + // setting json value to a int type column in mutRow will panic because it lacks of offset array. + tps[col.Offset] = &cols[col.ChangeStateInfo.DependencyColumnOffset].FieldType + } } var pkCols []int64 switch { @@ -65,6 +72,8 @@ func NewRowDecoder(tbl table.Table, cols []*table.Column, decodeColMap map[int64 pkCols = tables.TryGetCommonPkColumnIds(tbl.Meta()) case tblInfo.PKIsHandle: pkCols = []int64{tblInfo.GetPkColInfo().ID} + default: // support decoding _tidb_rowid. + pkCols = []int64{model.ExtraHandleID} } return &RowDecoder{ tbl: tbl, @@ -110,8 +119,8 @@ func (rd *RowDecoder) DecodeAndEvalRowWithMap(ctx sessionctx.Context, handle kv. } rd.mutRow.SetValue(colInfo.Offset, val.GetValue()) } - keys := make([]int, 0) - ids := make(map[int]int) + keys := make([]int, 0, len(rd.colMap)) + ids := make(map[int]int, len(rd.colMap)) for k, col := range rd.colMap { keys = append(keys, col.Col.Offset) ids[col.Col.Offset] = int(k) @@ -160,3 +169,9 @@ func BuildFullDecodeColMap(cols []*table.Column, schema *expression.Schema) map[ } return decodeColMap } + +// CurrentRowWithDefaultVal returns current decoding row with default column values set properly. +// Please make sure calling DecodeAndEvalRowWithMap first. +func (rd *RowDecoder) CurrentRowWithDefaultVal() chunk.Row { + return rd.mutRow.ToRow() +} diff --git a/util/rowDecoder/decoder_test.go b/util/rowDecoder/decoder_test.go index 4b453df81b394..04d71dda0d19a 100644 --- a/util/rowDecoder/decoder_test.go +++ b/util/rowDecoder/decoder_test.go @@ -171,7 +171,7 @@ func (s *testDecoderSuite) TestClusterIndexRowDecoder(c *C) { cols := []*model.ColumnInfo{c1, c2, c3} - tblInfo := &model.TableInfo{ID: 1, Columns: cols, Indices: []*model.IndexInfo{pk}, IsCommonHandle: true} + tblInfo := &model.TableInfo{ID: 1, Columns: cols, Indices: []*model.IndexInfo{pk}, IsCommonHandle: true, CommonHandleVersion: 1} tbl := tables.MockTableFromMeta(tblInfo) ctx := mock.NewContext() diff --git a/util/rowcodec/decoder.go b/util/rowcodec/decoder.go index 1e74e4dbc3d7f..a9ab7ab9abb20 100644 --- a/util/rowcodec/decoder.go +++ b/util/rowcodec/decoder.go @@ -120,10 +120,8 @@ func (decoder *DatumMapDecoder) decodeColDatum(col *ColInfo, colData []byte) (ty return d, err } d.SetFloat64(fVal) - case mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeString: + case mysql.TypeVarString, mysql.TypeVarchar, mysql.TypeString, mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: d.SetString(string(colData), col.Ft.Collate) - case mysql.TypeBlob, mysql.TypeTinyBlob, mysql.TypeMediumBlob, mysql.TypeLongBlob: - d.SetBytes(colData) case mysql.TypeNewDecimal: _, dec, precision, frac, err := codec.DecodeDecimal(colData) if err != nil { @@ -222,6 +220,9 @@ func (decoder *ChunkDecoder) DecodeToChunk(rowData []byte, handle kv.Handle, chk continue } + // Only try to decode handle when there is no corresponding column in the value. + // This is because the information in handle may be incomplete in some cases. + // For example, prefixed clustered index like 'primary key(col1(1))' only store the leftmost 1 char in the handle. if decoder.tryAppendHandleColumn(colIdx, col, handle, chk) { continue } @@ -254,6 +255,9 @@ func (decoder *ChunkDecoder) tryAppendHandleColumn(colIdx int, col *ColInfo, han } for i, id := range decoder.handleColIDs { if col.ID == id { + if types.CommonHandleNeedRestoredData(col.Ft) { + return false + } coder := codec.NewDecoder(chk, decoder.loc) _, err := coder.DecodeOne(handle.EncodedCol(i), colIdx, col.Ft) if err != nil { @@ -382,10 +386,6 @@ func (decoder *BytesDecoder) decodeToBytesInternal(outputOffset map[int64]int, h tp := fieldType2Flag(col.Ft.Tp, col.Ft.Flag&mysql.UnsignedFlag == 0) colID := col.ID offset := outputOffset[colID] - if decoder.tryDecodeHandle(values, offset, col, handle, cacheBytes) { - continue - } - idx, isNil, notFound := r.findColID(colID) if !notFound && !isNil { val := r.getData(idx) @@ -393,6 +393,13 @@ func (decoder *BytesDecoder) decodeToBytesInternal(outputOffset map[int64]int, h continue } + // Only try to decode handle when there is no corresponding column in the value. + // This is because the information in handle may be incomplete in some cases. + // For example, prefixed clustered index like 'primary key(col1(1))' only store the leftmost 1 char in the handle. + if decoder.tryDecodeHandle(values, offset, col, handle, cacheBytes) { + continue + } + if isNil { values[offset] = []byte{NilFlag} continue @@ -419,6 +426,9 @@ func (decoder *BytesDecoder) tryDecodeHandle(values [][]byte, offset int, col *C if handle == nil { return false } + if types.CommonHandleNeedRestoredData(col.Ft) { + return false + } if col.IsPKHandle || col.ID == model.ExtraHandleID { handleData := cacheBytes if mysql.HasUnsignedFlag(col.Ft.Flag) { diff --git a/util/rowcodec/rowcodec_test.go b/util/rowcodec/rowcodec_test.go index d3f59f63126c8..0b24f68a243c1 100644 --- a/util/rowcodec/rowcodec_test.go +++ b/util/rowcodec/rowcodec_test.go @@ -364,6 +364,8 @@ func (s *testSuite) TestTypesNewRowCodec(c *C) { c.Assert(len(remain), Equals, 0) if d.Kind() == types.KindMysqlDecimal { c.Assert(d.GetMysqlDecimal(), DeepEquals, t.bt.GetMysqlDecimal()) + } else if d.Kind() == types.KindBytes { + c.Assert(d.GetBytes(), DeepEquals, t.bt.GetBytes()) } else { c.Assert(d, DeepEquals, t.bt) } @@ -397,9 +399,9 @@ func (s *testSuite) TestTypesNewRowCodec(c *C) { }, { 24, - types.NewFieldType(mysql.TypeBlob), - types.NewBytesDatum([]byte("abc")), - types.NewBytesDatum([]byte("abc")), + types.NewFieldTypeWithCollation(mysql.TypeBlob, mysql.DefaultCollationName, types.UnspecifiedLength), + types.NewStringDatum("abc"), + types.NewStringDatum("abc"), nil, false, }, @@ -526,8 +528,8 @@ func (s *testSuite) TestTypesNewRowCodec(c *C) { testData[0].id = 1 // test large data - testData[3].dt = types.NewBytesDatum([]byte(strings.Repeat("a", math.MaxUint16+1))) - testData[3].bt = types.NewBytesDatum([]byte(strings.Repeat("a", math.MaxUint16+1))) + testData[3].dt = types.NewStringDatum(strings.Repeat("a", math.MaxUint16+1)) + testData[3].bt = types.NewStringDatum(strings.Repeat("a", math.MaxUint16+1)) encodeAndDecode(c, testData) } @@ -589,7 +591,7 @@ func (s *testSuite) TestNilAndDefault(c *C) { } } - //decode to chunk. + // decode to chunk. chk := chunk.New(fts, 1, 1) cDecoder := rowcodec.NewChunkDecoder(cols, []int64{-1}, ddf, sc.TimeZone) err = cDecoder.DecodeToChunk(newRow, kv.IntHandle(-1), chk) @@ -664,13 +666,11 @@ func (s *testSuite) TestVarintCompatibility(c *C) { // transform test data into input. colIDs := make([]int64, 0, len(testData)) dts := make([]types.Datum, 0, len(testData)) - fts := make([]*types.FieldType, 0, len(testData)) cols := make([]rowcodec.ColInfo, 0, len(testData)) for i := range testData { t := testData[i] colIDs = append(colIDs, t.id) dts = append(dts, t.dt) - fts = append(fts, t.ft) cols = append(cols, rowcodec.ColInfo{ ID: t.id, IsPKHandle: t.handle, diff --git a/util/selection/selection.go b/util/selection/selection.go index 4b95939e9d93f..9d0c649d3a5c6 100644 --- a/util/selection/selection.go +++ b/util/selection/selection.go @@ -81,12 +81,6 @@ func medianOfMedians(data Interface, left, right, k int) int { } } -type pivotFunc func(Interface, int, int) int - -func medianOf3Pivot(data Interface, left, right int) int { - return (left + right) >> 1 -} - func randomPivot(data Interface, left, right int) int { return left + (rand.Int() % (right - left + 1)) } diff --git a/util/set/set_with_memory_usage.go b/util/set/set_with_memory_usage.go new file mode 100644 index 0000000000000..da4047a0c52b6 --- /dev/null +++ b/util/set/set_with_memory_usage.go @@ -0,0 +1,125 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package set + +import ( + "unsafe" + + "github.com/pingcap/tidb/util/hack" +) + +const ( + // DefStringSetBucketMemoryUsage = bucketSize*(1+unsafe.Sizeof(string) + unsafe.Sizeof(struct{}))+2*ptrSize + // ref https://github.com/golang/go/blob/go1.15.6/src/reflect/type.go#L2162. + DefStringSetBucketMemoryUsage = 8*(1+16+0) + 16 + // DefFloat64SetBucketMemoryUsage = bucketSize*(1+unsafe.Sizeof(float64) + unsafe.Sizeof(struct{}))+2*ptrSize + DefFloat64SetBucketMemoryUsage = 8*(1+8+0) + 16 + // DefInt64SetBucketMemoryUsage = bucketSize*(1+unsafe.Sizeof(int64) + unsafe.Sizeof(struct{}))+2*ptrSize + DefInt64SetBucketMemoryUsage = 8*(1+8+0) + 16 + + // DefFloat64Size is the size of float64 + DefFloat64Size = int64(unsafe.Sizeof(float64(0))) + // DefInt64Size is the size of int64 + DefInt64Size = int64(unsafe.Sizeof(int64(0))) +) + +// StringSetWithMemoryUsage is a string set with memory usage. +type StringSetWithMemoryUsage struct { + StringSet + bInMap int64 +} + +// NewStringSetWithMemoryUsage builds a string set. +func NewStringSetWithMemoryUsage(ss ...string) (setWithMemoryUsage StringSetWithMemoryUsage, memDelta int64) { + set := make(StringSet, len(ss)) + setWithMemoryUsage = StringSetWithMemoryUsage{ + StringSet: set, + bInMap: 0, + } + memDelta = DefStringSetBucketMemoryUsage * (1 << setWithMemoryUsage.bInMap) + for _, s := range ss { + memDelta += setWithMemoryUsage.Insert(s) + } + return setWithMemoryUsage, memDelta +} + +// Insert inserts `val` into `s` and return memDelta. +func (s *StringSetWithMemoryUsage) Insert(val string) (memDelta int64) { + s.StringSet.Insert(val) + if s.Count() > (1< (1< (1< ('s1','s2'..) + // 2. %%: output % + // 3. %n: for identifiers, for example ("use %n", db) + // + // Attention: it does not prevent you from doing parse("select '%?", ";SQL injection!;") => "select '';SQL injection!;'". + // One argument should be a standalone entity. It should not "concat" with other placeholders and characters. + // This function only saves you from processing potentially unsafe parameters. + ParseWithParams(ctx context.Context, sql string, args ...interface{}) (ast.StmtNode, error) + // ExecRestrictedStmt run sql statement in ctx with some restriction. + ExecRestrictedStmt(ctx context.Context, stmt ast.StmtNode, opts ...OptionFuncAlias) ([]chunk.Row, []*ast.ResultField, error) +} + +// ExecOption is a struct defined for ExecRestrictedStmt option. +type ExecOption struct { + IgnoreWarning bool + SnapshotTS uint64 + AnalyzeVer int +} + +// OptionFuncAlias is defined for the optional paramater of ExecRestrictedStmt. +type OptionFuncAlias = func(option *ExecOption) + +// ExecOptionIgnoreWarning tells ExecRestrictedStmt to ignore the warnings. +var ExecOptionIgnoreWarning OptionFuncAlias = func(option *ExecOption) { + option.IgnoreWarning = true +} + +// ExecOptionAnalyzeVer1 tells ExecRestrictedStmt to collect statistics with version1. +var ExecOptionAnalyzeVer1 OptionFuncAlias = func(option *ExecOption) { + option.AnalyzeVer = 1 +} + +// ExecOptionAnalyzeVer2 tells ExecRestrictedStmt to collect statistics with version2. +var ExecOptionAnalyzeVer2 OptionFuncAlias = func(option *ExecOption) { + option.AnalyzeVer = 2 +} + +// ExecOptionWithSnapshot tells ExecRestrictedStmt to use a snapshot. +func ExecOptionWithSnapshot(snapshot uint64) OptionFuncAlias { + return func(option *ExecOption) { + option.SnapshotTS = snapshot + } } // SQLExecutor is an interface provides executing normal sql statement. @@ -49,9 +84,11 @@ type RestrictedSQLExecutor interface { // For example, privilege/privileges package need execute SQL, if it use // session.Session.Execute, then privilege/privileges and tidb would become a circle. type SQLExecutor interface { + // Execute is only used by plugins. It can be removed soon. Execute(ctx context.Context, sql string) ([]RecordSet, error) // ExecuteInternal means execute sql as the internal sql. - ExecuteInternal(ctx context.Context, sql string) ([]RecordSet, error) + ExecuteInternal(ctx context.Context, sql string, args ...interface{}) (RecordSet, error) + ExecuteStmt(ctx context.Context, stmtNode ast.StmtNode) (RecordSet, error) } // SQLParser is an interface provides parsing sql statement. diff --git a/util/sqlexec/utils.go b/util/sqlexec/utils.go new file mode 100644 index 0000000000000..1ffc29b72d8e0 --- /dev/null +++ b/util/sqlexec/utils.go @@ -0,0 +1,260 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlexec + +import ( + "encoding/json" + "io" + "strconv" + "strings" + "time" + + "github.com/pingcap/errors" + "github.com/pingcap/tidb/util/hack" +) + +func reserveBuffer(buf []byte, appendSize int) []byte { + newSize := len(buf) + appendSize + if cap(buf) < newSize { + newBuf := make([]byte, len(buf)*2+appendSize) + copy(newBuf, buf) + buf = newBuf + } + return buf[:newSize] +} + +// escapeBytesBackslash will escape []byte into the buffer, with backslash. +func escapeBytesBackslash(buf []byte, v []byte) []byte { + pos := len(buf) + buf = reserveBuffer(buf, len(v)*2) + + for _, c := range v { + switch c { + case '\x00': + buf[pos] = '\\' + buf[pos+1] = '0' + pos += 2 + case '\n': + buf[pos] = '\\' + buf[pos+1] = 'n' + pos += 2 + case '\r': + buf[pos] = '\\' + buf[pos+1] = 'r' + pos += 2 + case '\x1a': + buf[pos] = '\\' + buf[pos+1] = 'Z' + pos += 2 + case '\'': + buf[pos] = '\\' + buf[pos+1] = '\'' + pos += 2 + case '"': + buf[pos] = '\\' + buf[pos+1] = '"' + pos += 2 + case '\\': + buf[pos] = '\\' + buf[pos+1] = '\\' + pos += 2 + default: + buf[pos] = c + pos++ + } + } + + return buf[:pos] +} + +// escapeStringBackslash will escape string into the buffer, with backslash. +func escapeStringBackslash(buf []byte, v string) []byte { + return escapeBytesBackslash(buf, hack.Slice(v)) +} + +// escapeSQL is the internal impl of EscapeSQL and FormatSQL. +func escapeSQL(sql string, args ...interface{}) ([]byte, error) { + buf := make([]byte, 0, len(sql)) + argPos := 0 + for i := 0; i < len(sql); i++ { + q := strings.IndexByte(sql[i:], '%') + if q == -1 { + buf = append(buf, sql[i:]...) + break + } + buf = append(buf, sql[i:i+q]...) + i += q + + ch := byte(0) + if i+1 < len(sql) { + ch = sql[i+1] // get the specifier + } + switch ch { + case 'n': + if argPos >= len(args) { + return nil, errors.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) + } + arg := args[argPos] + argPos++ + + v, ok := arg.(string) + if !ok { + return nil, errors.Errorf("expect a string identifier, got %v", arg) + } + buf = append(buf, '`') + buf = append(buf, strings.Replace(v, "`", "``", -1)...) + buf = append(buf, '`') + i++ // skip specifier + case '?': + if argPos >= len(args) { + return nil, errors.Errorf("missing arguments, need %d-th arg, but only got %d args", argPos+1, len(args)) + } + arg := args[argPos] + argPos++ + + if arg == nil { + buf = append(buf, "NULL"...) + } else { + switch v := arg.(type) { + case int: + buf = strconv.AppendInt(buf, int64(v), 10) + case int8: + buf = strconv.AppendInt(buf, int64(v), 10) + case int16: + buf = strconv.AppendInt(buf, int64(v), 10) + case int32: + buf = strconv.AppendInt(buf, int64(v), 10) + case int64: + buf = strconv.AppendInt(buf, v, 10) + case uint: + buf = strconv.AppendUint(buf, uint64(v), 10) + case uint8: + buf = strconv.AppendUint(buf, uint64(v), 10) + case uint16: + buf = strconv.AppendUint(buf, uint64(v), 10) + case uint32: + buf = strconv.AppendUint(buf, uint64(v), 10) + case uint64: + buf = strconv.AppendUint(buf, v, 10) + case float32: + buf = strconv.AppendFloat(buf, float64(v), 'g', -1, 32) + case float64: + buf = strconv.AppendFloat(buf, v, 'g', -1, 64) + case bool: + if v { + buf = append(buf, '1') + } else { + buf = append(buf, '0') + } + case time.Time: + if v.IsZero() { + buf = append(buf, "'0000-00-00'"...) + } else { + buf = append(buf, '\'') + buf = v.AppendFormat(buf, "2006-01-02 15:04:05.999999") + buf = append(buf, '\'') + } + case json.RawMessage: + buf = append(buf, '\'') + buf = escapeBytesBackslash(buf, v) + buf = append(buf, '\'') + case []byte: + if v == nil { + buf = append(buf, "NULL"...) + } else { + buf = append(buf, "_binary'"...) + buf = escapeBytesBackslash(buf, v) + buf = append(buf, '\'') + } + case string: + buf = append(buf, '\'') + buf = escapeStringBackslash(buf, v) + buf = append(buf, '\'') + case []string: + for i, k := range v { + if i > 0 { + buf = append(buf, ',') + } + buf = append(buf, '\'') + buf = escapeStringBackslash(buf, k) + buf = append(buf, '\'') + } + case []float32: + for i, k := range v { + if i > 0 { + buf = append(buf, ',') + } + buf = strconv.AppendFloat(buf, float64(k), 'g', -1, 32) + } + case []float64: + for i, k := range v { + if i > 0 { + buf = append(buf, ',') + } + buf = strconv.AppendFloat(buf, k, 'g', -1, 64) + } + default: + return nil, errors.Errorf("unsupported %d-th argument: %v", argPos, arg) + } + } + i++ // skip specifier + case '%': + buf = append(buf, '%') + i++ // skip specifier + default: + buf = append(buf, '%') + } + } + return buf, nil +} + +// EscapeSQL will escape input arguments into the sql string, doing necessary processing. +// It works like printf() in c, there are following format specifiers: +// 1. %?: automatic conversion by the type of arguments. E.g. []string -> ('s1','s2'..) +// 2. %%: output % +// 3. %n: for identifiers, for example ("use %n", db) +// But it does not prevent you from doing EscapeSQL("select '%?", ";SQL injection!;") => "select '';SQL injection!;'". +// It is still your responsibility to write safe SQL. +func EscapeSQL(sql string, args ...interface{}) (string, error) { + str, err := escapeSQL(sql, args...) + return string(str), err +} + +// MustEscapeSQL is an helper around EscapeSQL. The error returned from escapeSQL can be avoided statically if you do not pass interface{}. +func MustEscapeSQL(sql string, args ...interface{}) string { + r, err := EscapeSQL(sql, args...) + if err != nil { + panic(err) + } + return r +} + +// FormatSQL is the io.Writer version of EscapeSQL. Please refer to EscapeSQL for details. +func FormatSQL(w io.Writer, sql string, args ...interface{}) error { + buf, err := escapeSQL(sql, args...) + if err != nil { + return err + } + _, err = w.Write(buf) + return err +} + +// MustFormatSQL is an helper around FormatSQL, like MustEscapeSQL. But it asks that the writer must be strings.Builder, +// which will not return error when w.Write(...). +func MustFormatSQL(w *strings.Builder, sql string, args ...interface{}) { + err := FormatSQL(w, sql, args...) + if err != nil { + panic(err) + } +} diff --git a/util/sqlexec/utils_test.go b/util/sqlexec/utils_test.go new file mode 100644 index 0000000000000..a8a912a33978f --- /dev/null +++ b/util/sqlexec/utils_test.go @@ -0,0 +1,430 @@ +// Copyright 2021 PingCAP, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// See the License for the specific language governing permissions and +// limitations under the License. + +package sqlexec + +import ( + "encoding/json" + "strings" + "testing" + "time" + + . "github.com/pingcap/check" +) + +func TestT(t *testing.T) { + TestingT(t) +} + +var _ = Suite(&testUtilsSuite{}) + +type testUtilsSuite struct{} + +func (s *testUtilsSuite) TestReserveBuffer(c *C) { + res0 := reserveBuffer(nil, 0) + c.Assert(res0, HasLen, 0) + + res1 := reserveBuffer(res0, 3) + c.Assert(res1, HasLen, 3) + res1[1] = 3 + + res2 := reserveBuffer(res1, 9) + c.Assert(res2, HasLen, 12) + c.Assert(cap(res2), Equals, 15) + c.Assert(res2[:3], DeepEquals, res1) +} + +func (s *testUtilsSuite) TestEscapeBackslash(c *C) { + type TestCase struct { + name string + input []byte + output []byte + } + tests := []TestCase{ + { + name: "normal", + input: []byte("hello"), + output: []byte("hello"), + }, + { + name: "0", + input: []byte("he\x00lo"), + output: []byte("he\\0lo"), + }, + { + name: "break line", + input: []byte("he\nlo"), + output: []byte("he\\nlo"), + }, + { + name: "carry", + input: []byte("he\rlo"), + output: []byte("he\\rlo"), + }, + { + name: "substitute", + input: []byte("he\x1alo"), + output: []byte("he\\Zlo"), + }, + { + name: "single quote", + input: []byte("he'lo"), + output: []byte("he\\'lo"), + }, + { + name: "double quote", + input: []byte("he\"lo"), + output: []byte("he\\\"lo"), + }, + { + name: "back slash", + input: []byte("he\\lo"), + output: []byte("he\\\\lo"), + }, + { + name: "double escape", + input: []byte("he\x00lo\""), + output: []byte("he\\0lo\\\""), + }, + { + name: "chinese", + input: []byte("中文?"), + output: []byte("中文?"), + }, + } + for _, t := range tests { + commentf := Commentf("%s", t.name) + c.Assert(escapeBytesBackslash(nil, t.input), DeepEquals, t.output, commentf) + c.Assert(escapeStringBackslash(nil, string(t.input)), DeepEquals, t.output, commentf) + } +} + +func (s *testUtilsSuite) TestEscapeSQL(c *C) { + type TestCase struct { + name string + input string + params []interface{} + output string + err string + } + time2, err := time.Parse("2006-01-02 15:04:05", "2018-01-23 04:03:05") + c.Assert(err, IsNil) + tests := []TestCase{ + { + name: "normal 1", + input: "select * from 1", + params: []interface{}{}, + output: "select * from 1", + err: "", + }, + { + name: "normal 2", + input: "WHERE source != 'builtin'", + params: []interface{}{}, + output: "WHERE source != 'builtin'", + err: "", + }, + { + name: "discard extra arguments", + input: "select * from 1", + params: []interface{}{4, 5, "rt"}, + output: "select * from 1", + err: "", + }, + { + name: "%? missing arguments", + input: "select %? from %?", + params: []interface{}{4}, + err: "missing arguments.*", + }, + { + name: "nil", + input: "select %?", + params: []interface{}{nil}, + output: "select NULL", + err: "", + }, + { + name: "int", + input: "select %?", + params: []interface{}{int(3)}, + output: "select 3", + err: "", + }, + { + name: "int8", + input: "select %?", + params: []interface{}{int8(4)}, + output: "select 4", + err: "", + }, + { + name: "int16", + input: "select %?", + params: []interface{}{int16(5)}, + output: "select 5", + err: "", + }, + { + name: "int32", + input: "select %?", + params: []interface{}{int32(6)}, + output: "select 6", + err: "", + }, + { + name: "int64", + input: "select %?", + params: []interface{}{int64(7)}, + output: "select 7", + err: "", + }, + { + name: "uint", + input: "select %?", + params: []interface{}{uint(8)}, + output: "select 8", + err: "", + }, + { + name: "uint8", + input: "select %?", + params: []interface{}{uint8(9)}, + output: "select 9", + err: "", + }, + { + name: "uint16", + input: "select %?", + params: []interface{}{uint16(10)}, + output: "select 10", + err: "", + }, + { + name: "uint32", + input: "select %?", + params: []interface{}{uint32(11)}, + output: "select 11", + err: "", + }, + { + name: "uint64", + input: "select %?", + params: []interface{}{uint64(12)}, + output: "select 12", + err: "", + }, + { + name: "float32", + input: "select %?", + params: []interface{}{float32(0.13)}, + output: "select 0.13", + err: "", + }, + { + name: "float64", + input: "select %?", + params: []interface{}{float64(0.14)}, + output: "select 0.14", + err: "", + }, + { + name: "bool on", + input: "select %?", + params: []interface{}{true}, + output: "select 1", + err: "", + }, + { + name: "bool off", + input: "select %?", + params: []interface{}{false}, + output: "select 0", + err: "", + }, + { + name: "time 0", + input: "select %?", + params: []interface{}{time.Time{}}, + output: "select '0000-00-00'", + err: "", + }, + { + name: "time 1", + input: "select %?", + params: []interface{}{time.Date(2019, 1, 1, 0, 0, 0, 0, time.UTC)}, + output: "select '2019-01-01 00:00:00'", + err: "", + }, + { + name: "time 2", + input: "select %?", + params: []interface{}{time2}, + output: "select '2018-01-23 04:03:05'", + err: "", + }, + { + name: "time 3", + input: "select %?", + params: []interface{}{time.Unix(0, 888888888).UTC()}, + output: "select '1970-01-01 00:00:00.888888'", + err: "", + }, + { + name: "empty byte slice1", + input: "select %?", + params: []interface{}{[]byte(nil)}, + output: "select NULL", + err: "", + }, + { + name: "empty byte slice2", + input: "select %?", + params: []interface{}{[]byte{}}, + output: "select _binary''", + err: "", + }, + { + name: "byte slice", + input: "select %?", + params: []interface{}{[]byte{2, 3}}, + output: "select _binary'\x02\x03'", + err: "", + }, + { + name: "string", + input: "select %?", + params: []interface{}{"33"}, + output: "select '33'", + }, + { + name: "string slice", + input: "select %?", + params: []interface{}{[]string{"33", "44"}}, + output: "select '33','44'", + }, + { + name: "raw json", + input: "select %?", + params: []interface{}{json.RawMessage(`{"h": "hello"}`)}, + output: "select '{\\\"h\\\": \\\"hello\\\"}'", + }, + { + name: "unsupported args", + input: "select %?", + params: []interface{}{make(chan byte)}, + err: "unsupported 1-th argument.*", + }, + { + name: "mixed arguments", + input: "select %?, %?, %?", + params: []interface{}{"33", 44, time.Time{}}, + output: "select '33', 44, '0000-00-00'", + }, + { + name: "simple injection", + input: "select %?", + params: []interface{}{"0; drop database"}, + output: "select '0; drop database'", + }, + { + name: "identifier, wrong arg", + input: "use %n", + params: []interface{}{3}, + err: "expect a string identifier.*", + }, + { + name: "identifier", + input: "use %n", + params: []interface{}{"table`"}, + output: "use `table```", + err: "", + }, + { + name: "%n missing arguments", + input: "use %n", + params: []interface{}{}, + err: "missing arguments.*", + }, + { + name: "% escape", + input: "select * from t where val = '%%?'", + params: []interface{}{}, + output: "select * from t where val = '%?'", + err: "", + }, + { + name: "unknown specifier", + input: "%v", + params: []interface{}{}, + output: "%v", + err: "", + }, + { + name: "truncated specifier ", + input: "rv %", + params: []interface{}{}, + output: "rv %", + err: "", + }, + { + name: "float32 slice", + input: "select %?", + params: []interface{}{[]float32{33.1, 0.44}}, + output: "select 33.1,0.44", + }, + { + name: "float64 slice", + input: "select %?", + params: []interface{}{[]float64{55.2, 0.66}}, + output: "select 55.2,0.66", + }, + } + for _, t := range tests { + comment := Commentf("%s", t.name) + r3 := new(strings.Builder) + r1, e1 := escapeSQL(t.input, t.params...) + r2, e2 := EscapeSQL(t.input, t.params...) + e3 := FormatSQL(r3, t.input, t.params...) + if t.err == "" { + c.Assert(e1, IsNil, comment) + c.Assert(string(r1), Equals, t.output, comment) + c.Assert(e2, IsNil, comment) + c.Assert(r2, Equals, t.output, comment) + c.Assert(e3, IsNil, comment) + c.Assert(r3.String(), Equals, t.output, comment) + } else { + c.Assert(e1, NotNil, comment) + c.Assert(e1, ErrorMatches, t.err, comment) + c.Assert(e2, NotNil, comment) + c.Assert(e2, ErrorMatches, t.err, comment) + c.Assert(e3, NotNil, comment) + c.Assert(e3, ErrorMatches, t.err, comment) + } + } +} + +func (s *testUtilsSuite) TestMustUtils(c *C) { + c.Assert(func() { + MustEscapeSQL("%?") + }, PanicMatches, "missing arguments.*") + + c.Assert(func() { + sql := new(strings.Builder) + MustFormatSQL(sql, "%?") + }, PanicMatches, "missing arguments.*") + + sql := new(strings.Builder) + MustFormatSQL(sql, "t") + MustEscapeSQL("tt") +} diff --git a/util/stmtsummary/statement_summary.go b/util/stmtsummary/statement_summary.go index 35109f9f892a2..35c93c4e926d2 100644 --- a/util/stmtsummary/statement_summary.go +++ b/util/stmtsummary/statement_summary.go @@ -104,8 +104,11 @@ type stmtSummaryByDigestElement struct { endTime int64 // basic sampleSQL string + charset string + collation string prevSQL string samplePlan string + planHint string indexNames []string execCount int64 sumErrors int @@ -125,16 +128,26 @@ type stmtSummaryByDigestElement struct { maxCopWaitTime time.Duration maxCopWaitAddress string // TiKV - sumProcessTime time.Duration - maxProcessTime time.Duration - sumWaitTime time.Duration - maxWaitTime time.Duration - sumBackoffTime time.Duration - maxBackoffTime time.Duration - sumTotalKeys int64 - maxTotalKeys int64 - sumProcessedKeys int64 - maxProcessedKeys int64 + sumProcessTime time.Duration + maxProcessTime time.Duration + sumWaitTime time.Duration + maxWaitTime time.Duration + sumBackoffTime time.Duration + maxBackoffTime time.Duration + sumTotalKeys int64 + maxTotalKeys int64 + sumProcessedKeys int64 + maxProcessedKeys int64 + sumRocksdbDeleteSkippedCount uint64 + maxRocksdbDeleteSkippedCount uint64 + sumRocksdbKeySkippedCount uint64 + maxRocksdbKeySkippedCount uint64 + sumRocksdbBlockCacheHitCount uint64 + maxRocksdbBlockCacheHitCount uint64 + sumRocksdbBlockReadCount uint64 + maxRocksdbBlockReadCount uint64 + sumRocksdbBlockReadByte uint64 + maxRocksdbBlockReadByte uint64 // txn commitCount int64 sumGetCommitTsTime time.Duration @@ -157,17 +170,20 @@ type stmtSummaryByDigestElement struct { maxPrewriteRegionNum int32 sumTxnRetry int64 maxTxnRetry int - sumExecRetryCount int64 - sumExecRetryTime time.Duration sumBackoffTimes int64 backoffTypes map[fmt.Stringer]int authUsers map[string]struct{} // other - sumMem int64 - maxMem int64 - sumDisk int64 - maxDisk int64 - sumAffectedRows uint64 + sumMem int64 + maxMem int64 + sumDisk int64 + maxDisk int64 + sumAffectedRows uint64 + sumKVTotal time.Duration + sumPDTotal time.Duration + sumBackoffTotal time.Duration + sumWriteSQLRespTotal time.Duration + prepared bool // The first time this type of SQL executes. firstSeen time.Time // The last time this type of SQL executes. @@ -175,6 +191,7 @@ type stmtSummaryByDigestElement struct { // plan cache planInCache bool planCacheHits int64 + planInBinding bool // pessimistic execution retry information. execRetryCount uint execRetryTime time.Duration @@ -184,11 +201,13 @@ type stmtSummaryByDigestElement struct { type StmtExecInfo struct { SchemaName string OriginalSQL string + Charset string + Collation string NormalizedSQL string Digest string PrevSQL string PrevSQLDigest string - PlanGenerator func() string + PlanGenerator func() (string, string) PlanDigest string PlanDigestGen func() string User string @@ -204,8 +223,11 @@ type StmtExecInfo struct { IsInternal bool Succeed bool PlanInCache bool + PlanInBinding bool ExecRetryCount uint ExecRetryTime time.Duration + execdetails.StmtExecDetails + Prepared bool } // newStmtSummaryByDigestMap creates an empty stmtSummaryByDigestMap. @@ -331,35 +353,55 @@ func (ssMap *stmtSummaryByDigestMap) ToHistoryDatum(user *auth.UserIdentity, isS return rows } -// GetMoreThanOnceSelect gets users' select SQLs that occurred more than once. -func (ssMap *stmtSummaryByDigestMap) GetMoreThanOnceSelect() ([]string, []string) { +// BindableStmt is a wrapper struct for a statement that is extracted from statements_summary and can be +// created binding on. +type BindableStmt struct { + Schema string + Query string + PlanHint string + Charset string + Collation string +} + +// GetMoreThanOnceBindableStmt gets users' select/update/delete SQLs that occurred more than once. +func (ssMap *stmtSummaryByDigestMap) GetMoreThanOnceBindableStmt() []*BindableStmt { ssMap.Lock() values := ssMap.summaryMap.Values() ssMap.Unlock() - schemas := make([]string, 0, len(values)) - sqls := make([]string, 0, len(values)) + stmts := make([]*BindableStmt, 0, len(values)) for _, value := range values { ssbd := value.(*stmtSummaryByDigest) func() { ssbd.Lock() defer ssbd.Unlock() - if ssbd.initialized && ssbd.stmtType == "Select" { + if ssbd.initialized && (ssbd.stmtType == "Select" || ssbd.stmtType == "Delete" || ssbd.stmtType == "Update" || ssbd.stmtType == "Insert" || ssbd.stmtType == "Replace") { if ssbd.history.Len() > 0 { ssElement := ssbd.history.Back().Value.(*stmtSummaryByDigestElement) ssElement.Lock() // Empty auth users means that it is an internal queries. if len(ssElement.authUsers) > 0 && (ssbd.history.Len() > 1 || ssElement.execCount > 1) { - schemas = append(schemas, ssbd.schemaName) - sqls = append(sqls, ssElement.sampleSQL) + stmt := &BindableStmt{ + Schema: ssbd.schemaName, + Query: ssElement.sampleSQL, + PlanHint: ssElement.planHint, + Charset: ssElement.charset, + Collation: ssElement.collation, + } + // If it is SQL command prepare / execute, the ssElement.sampleSQL is `execute ...`, we should get the original select query. + // If it is binary protocol prepare / execute, ssbd.normalizedSQL should be same as ssElement.sampleSQL. + if ssElement.prepared { + stmt.Query = ssbd.normalizedSQL + } + stmts = append(stmts, stmt) } ssElement.Unlock() } } }() } - return schemas, sqls + return stmts } // SetEnabled enables or disables statement summary in global(cluster) or session(server) scope. @@ -576,13 +618,17 @@ func (ssbd *stmtSummaryByDigest) collectHistorySummaries(historySize int) []*stm func newStmtSummaryByDigestElement(sei *StmtExecInfo, beginTime int64, intervalSeconds int64) *stmtSummaryByDigestElement { // sampleSQL / authUsers(sampleUser) / samplePlan / prevSQL / indexNames store the values shown at the first time, // because it compacts performance to update every time. + samplePlan, planHint := sei.PlanGenerator() ssElement := &stmtSummaryByDigestElement{ beginTime: beginTime, sampleSQL: formatSQL(sei.OriginalSQL), + charset: sei.Charset, + collation: sei.Collation, // PrevSQL is already truncated to cfg.Log.QueryLogMaxLen. prevSQL: sei.PrevSQL, // samplePlan needs to be decoded so it can't be truncated. - samplePlan: sei.PlanGenerator(), + samplePlan: samplePlan, + planHint: planHint, indexNames: sei.StmtCtx.IndexNames, minLatency: sei.TotalLatency, firstSeen: sei.StartTime, @@ -591,6 +637,8 @@ func newStmtSummaryByDigestElement(sei *StmtExecInfo, beginTime int64, intervalS authUsers: make(map[string]struct{}), planInCache: false, planCacheHits: 0, + planInBinding: false, + prepared: sei.Prepared, } ssElement.add(sei, intervalSeconds) return ssElement @@ -661,25 +709,48 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco } // TiKV - ssElement.sumProcessTime += sei.ExecDetail.ProcessTime - if sei.ExecDetail.ProcessTime > ssElement.maxProcessTime { - ssElement.maxProcessTime = sei.ExecDetail.ProcessTime + ssElement.sumProcessTime += sei.ExecDetail.TimeDetail.ProcessTime + if sei.ExecDetail.TimeDetail.ProcessTime > ssElement.maxProcessTime { + ssElement.maxProcessTime = sei.ExecDetail.TimeDetail.ProcessTime } - ssElement.sumWaitTime += sei.ExecDetail.WaitTime - if sei.ExecDetail.WaitTime > ssElement.maxWaitTime { - ssElement.maxWaitTime = sei.ExecDetail.WaitTime + ssElement.sumWaitTime += sei.ExecDetail.TimeDetail.WaitTime + if sei.ExecDetail.TimeDetail.WaitTime > ssElement.maxWaitTime { + ssElement.maxWaitTime = sei.ExecDetail.TimeDetail.WaitTime } ssElement.sumBackoffTime += sei.ExecDetail.BackoffTime if sei.ExecDetail.BackoffTime > ssElement.maxBackoffTime { ssElement.maxBackoffTime = sei.ExecDetail.BackoffTime } - ssElement.sumTotalKeys += sei.ExecDetail.TotalKeys - if sei.ExecDetail.TotalKeys > ssElement.maxTotalKeys { - ssElement.maxTotalKeys = sei.ExecDetail.TotalKeys - } - ssElement.sumProcessedKeys += sei.ExecDetail.ProcessedKeys - if sei.ExecDetail.ProcessedKeys > ssElement.maxProcessedKeys { - ssElement.maxProcessedKeys = sei.ExecDetail.ProcessedKeys + + if sei.ExecDetail.ScanDetail != nil { + ssElement.sumTotalKeys += sei.ExecDetail.ScanDetail.TotalKeys + if sei.ExecDetail.ScanDetail.TotalKeys > ssElement.maxTotalKeys { + ssElement.maxTotalKeys = sei.ExecDetail.ScanDetail.TotalKeys + } + ssElement.sumProcessedKeys += sei.ExecDetail.ScanDetail.ProcessedKeys + if sei.ExecDetail.ScanDetail.ProcessedKeys > ssElement.maxProcessedKeys { + ssElement.maxProcessedKeys = sei.ExecDetail.ScanDetail.ProcessedKeys + } + ssElement.sumRocksdbDeleteSkippedCount += sei.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount + if sei.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount > ssElement.maxRocksdbDeleteSkippedCount { + ssElement.maxRocksdbDeleteSkippedCount = sei.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount + } + ssElement.sumRocksdbKeySkippedCount += sei.ExecDetail.ScanDetail.RocksdbKeySkippedCount + if sei.ExecDetail.ScanDetail.RocksdbKeySkippedCount > ssElement.maxRocksdbKeySkippedCount { + ssElement.maxRocksdbKeySkippedCount = sei.ExecDetail.ScanDetail.RocksdbKeySkippedCount + } + ssElement.sumRocksdbBlockCacheHitCount += sei.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount + if sei.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount > ssElement.maxRocksdbBlockCacheHitCount { + ssElement.maxRocksdbBlockCacheHitCount = sei.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount + } + ssElement.sumRocksdbBlockReadCount += sei.ExecDetail.ScanDetail.RocksdbBlockReadCount + if sei.ExecDetail.ScanDetail.RocksdbBlockReadCount > ssElement.maxRocksdbBlockReadCount { + ssElement.maxRocksdbBlockReadCount = sei.ExecDetail.ScanDetail.RocksdbBlockReadCount + } + ssElement.sumRocksdbBlockReadByte += sei.ExecDetail.ScanDetail.RocksdbBlockReadByte + if sei.ExecDetail.ScanDetail.RocksdbBlockReadByte > ssElement.maxRocksdbBlockReadByte { + ssElement.maxRocksdbBlockReadByte = sei.ExecDetail.ScanDetail.RocksdbBlockReadByte + } } // txn @@ -737,7 +808,7 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco commitDetails.Mu.Unlock() } - //plan cache + // plan cache if sei.PlanInCache { ssElement.planInCache = true ssElement.planCacheHits += 1 @@ -745,6 +816,13 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco ssElement.planInCache = false } + // SPM + if sei.PlanInBinding { + ssElement.planInBinding = true + } else { + ssElement.planInBinding = false + } + // other ssElement.sumAffectedRows += sei.StmtCtx.AffectedRows() ssElement.sumMem += sei.MemMax @@ -765,6 +843,10 @@ func (ssElement *stmtSummaryByDigestElement) add(sei *StmtExecInfo, intervalSeco ssElement.execRetryCount += sei.ExecRetryCount ssElement.execRetryTime += sei.ExecRetryTime } + ssElement.sumKVTotal += time.Duration(atomic.LoadInt64(&sei.StmtExecDetails.WaitKVRespDuration)) + ssElement.sumPDTotal += time.Duration(atomic.LoadInt64(&sei.StmtExecDetails.WaitPDRespDuration)) + ssElement.sumBackoffTotal += time.Duration(atomic.LoadInt64(&sei.StmtExecDetails.BackoffDuration)) + ssElement.sumWriteSQLRespTotal += sei.StmtExecDetails.WriteSQLRespDuration } func (ssElement *stmtSummaryByDigestElement) toDatum(ssbd *stmtSummaryByDigest) []types.Datum { @@ -773,7 +855,7 @@ func (ssElement *stmtSummaryByDigestElement) toDatum(ssbd *stmtSummaryByDigest) plan, err := plancodec.DecodePlan(ssElement.samplePlan) if err != nil { - logutil.BgLogger().Error("decode plan in statement summary failed", zap.String("plan", ssElement.samplePlan), zap.Error(err)) + logutil.BgLogger().Error("decode plan in statement summary failed", zap.String("plan", ssElement.samplePlan), zap.String("query", ssElement.sampleSQL), zap.Error(err)) plan = "" } @@ -820,6 +902,16 @@ func (ssElement *stmtSummaryByDigestElement) toDatum(ssbd *stmtSummaryByDigest) ssElement.maxTotalKeys, avgInt(ssElement.sumProcessedKeys, ssElement.execCount), ssElement.maxProcessedKeys, + avgInt(int64(ssElement.sumRocksdbDeleteSkippedCount), ssElement.execCount), + ssElement.maxRocksdbDeleteSkippedCount, + avgInt(int64(ssElement.sumRocksdbKeySkippedCount), ssElement.execCount), + ssElement.maxRocksdbKeySkippedCount, + avgInt(int64(ssElement.sumRocksdbBlockCacheHitCount), ssElement.execCount), + ssElement.maxRocksdbBlockCacheHitCount, + avgInt(int64(ssElement.sumRocksdbBlockReadCount), ssElement.execCount), + ssElement.maxRocksdbBlockReadCount, + avgInt(int64(ssElement.sumRocksdbBlockReadByte), ssElement.execCount), + ssElement.maxRocksdbBlockReadByte, avgInt(int64(ssElement.sumPrewriteTime), ssElement.commitCount), int64(ssElement.maxPrewriteTime), avgInt(int64(ssElement.sumCommitTime), ssElement.commitCount), @@ -848,11 +940,17 @@ func (ssElement *stmtSummaryByDigestElement) toDatum(ssbd *stmtSummaryByDigest) ssElement.maxMem, avgInt(ssElement.sumDisk, ssElement.execCount), ssElement.maxDisk, + avgInt(int64(ssElement.sumKVTotal), ssElement.commitCount), + avgInt(int64(ssElement.sumPDTotal), ssElement.commitCount), + avgInt(int64(ssElement.sumBackoffTotal), ssElement.commitCount), + avgInt(int64(ssElement.sumWriteSQLRespTotal), ssElement.commitCount), + ssElement.prepared, avgFloat(int64(ssElement.sumAffectedRows), ssElement.execCount), types.NewTime(types.FromGoTime(ssElement.firstSeen), mysql.TypeTimestamp, 0), types.NewTime(types.FromGoTime(ssElement.lastSeen), mysql.TypeTimestamp, 0), ssElement.planInCache, ssElement.planCacheHits, + ssElement.planInBinding, ssElement.sampleSQL, ssElement.prevSQL, ssbd.planDigest, diff --git a/util/stmtsummary/statement_summary_test.go b/util/stmtsummary/statement_summary_test.go index 7517a923b9816..d81527494dbd1 100644 --- a/util/stmtsummary/statement_summary_test.go +++ b/util/stmtsummary/statement_summary_test.go @@ -38,8 +38,8 @@ type testStmtSummarySuite struct { ssMap *stmtSummaryByDigestMap } -func emptyPlanGenerator() string { - return "" +func emptyPlanGenerator() (string, string) { + return "", "" } func fakePlanDigestGenerator() string { @@ -48,9 +48,12 @@ func fakePlanDigestGenerator() string { func (s *testStmtSummarySuite) SetUpSuite(c *C) { s.ssMap = newStmtSummaryByDigestMap() - s.ssMap.SetEnabled("1", false) - s.ssMap.SetRefreshInterval("1800", false) - s.ssMap.SetHistorySize("24", false) + err := s.ssMap.SetEnabled("1", false) + c.Assert(err, IsNil) + err = s.ssMap.SetRefreshInterval("1800", false) + c.Assert(err, IsNil) + err = s.ssMap.SetHistorySize("24", false) + c.Assert(err, IsNil) } func TestT(t *testing.T) { @@ -75,11 +78,12 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { digest: stmtExecInfo1.Digest, planDigest: stmtExecInfo1.PlanDigest, } + samplePlan, _ := stmtExecInfo1.PlanGenerator() expectedSummaryElement := stmtSummaryByDigestElement{ beginTime: now + 60, endTime: now + 1860, sampleSQL: stmtExecInfo1.OriginalSQL, - samplePlan: stmtExecInfo1.PlanGenerator(), + samplePlan: samplePlan, indexNames: stmtExecInfo1.StmtCtx.IndexNames, execCount: 1, sumLatency: stmtExecInfo1.TotalLatency, @@ -94,16 +98,16 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { maxCopProcessAddress: stmtExecInfo1.CopTasks.MaxProcessAddress, maxCopWaitTime: stmtExecInfo1.CopTasks.MaxWaitTime, maxCopWaitAddress: stmtExecInfo1.CopTasks.MaxWaitAddress, - sumProcessTime: stmtExecInfo1.ExecDetail.ProcessTime, - maxProcessTime: stmtExecInfo1.ExecDetail.ProcessTime, - sumWaitTime: stmtExecInfo1.ExecDetail.WaitTime, - maxWaitTime: stmtExecInfo1.ExecDetail.WaitTime, + sumProcessTime: stmtExecInfo1.ExecDetail.TimeDetail.ProcessTime, + maxProcessTime: stmtExecInfo1.ExecDetail.TimeDetail.ProcessTime, + sumWaitTime: stmtExecInfo1.ExecDetail.TimeDetail.WaitTime, + maxWaitTime: stmtExecInfo1.ExecDetail.TimeDetail.WaitTime, sumBackoffTime: stmtExecInfo1.ExecDetail.BackoffTime, maxBackoffTime: stmtExecInfo1.ExecDetail.BackoffTime, - sumTotalKeys: stmtExecInfo1.ExecDetail.TotalKeys, - maxTotalKeys: stmtExecInfo1.ExecDetail.TotalKeys, - sumProcessedKeys: stmtExecInfo1.ExecDetail.ProcessedKeys, - maxProcessedKeys: stmtExecInfo1.ExecDetail.ProcessedKeys, + sumTotalKeys: stmtExecInfo1.ExecDetail.ScanDetail.TotalKeys, + maxTotalKeys: stmtExecInfo1.ExecDetail.ScanDetail.TotalKeys, + sumProcessedKeys: stmtExecInfo1.ExecDetail.ScanDetail.ProcessedKeys, + maxProcessedKeys: stmtExecInfo1.ExecDetail.ScanDetail.ProcessedKeys, sumGetCommitTsTime: stmtExecInfo1.ExecDetail.CommitDetail.GetCommitTsTime, maxGetCommitTsTime: stmtExecInfo1.ExecDetail.CommitDetail.GetCommitTsTime, sumPrewriteTime: stmtExecInfo1.ExecDetail.CommitDetail.PrewriteTime, @@ -175,12 +179,8 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { }, ExecDetail: &execdetails.ExecDetails{ CalleeAddress: "202", - ProcessTime: 1500, - WaitTime: 150, BackoffTime: 180, RequestCount: 20, - TotalKeys: 6000, - ProcessedKeys: 1500, CommitDetail: &execdetails.CommitDetails{ GetCommitTsTime: 500, PrewriteTime: 50000, @@ -199,6 +199,19 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { PrewriteRegionNum: 100, TxnRetry: 10, }, + ScanDetail: &execdetails.ScanDetail{ + TotalKeys: 6000, + ProcessedKeys: 1500, + RocksdbDeleteSkippedCount: 100, + RocksdbKeySkippedCount: 10, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 10, + RocksdbBlockReadByte: 1000, + }, + TimeDetail: execdetails.TimeDetail{ + ProcessTime: 1500, + WaitTime: 150, + }, }, StmtCtx: &stmtctx.StatementContext{ StmtType: "Select", @@ -223,16 +236,16 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { expectedSummaryElement.maxCopProcessAddress = stmtExecInfo2.CopTasks.MaxProcessAddress expectedSummaryElement.maxCopWaitTime = stmtExecInfo2.CopTasks.MaxWaitTime expectedSummaryElement.maxCopWaitAddress = stmtExecInfo2.CopTasks.MaxWaitAddress - expectedSummaryElement.sumProcessTime += stmtExecInfo2.ExecDetail.ProcessTime - expectedSummaryElement.maxProcessTime = stmtExecInfo2.ExecDetail.ProcessTime - expectedSummaryElement.sumWaitTime += stmtExecInfo2.ExecDetail.WaitTime - expectedSummaryElement.maxWaitTime = stmtExecInfo2.ExecDetail.WaitTime + expectedSummaryElement.sumProcessTime += stmtExecInfo2.ExecDetail.TimeDetail.ProcessTime + expectedSummaryElement.maxProcessTime = stmtExecInfo2.ExecDetail.TimeDetail.ProcessTime + expectedSummaryElement.sumWaitTime += stmtExecInfo2.ExecDetail.TimeDetail.WaitTime + expectedSummaryElement.maxWaitTime = stmtExecInfo2.ExecDetail.TimeDetail.WaitTime expectedSummaryElement.sumBackoffTime += stmtExecInfo2.ExecDetail.BackoffTime expectedSummaryElement.maxBackoffTime = stmtExecInfo2.ExecDetail.BackoffTime - expectedSummaryElement.sumTotalKeys += stmtExecInfo2.ExecDetail.TotalKeys - expectedSummaryElement.maxTotalKeys = stmtExecInfo2.ExecDetail.TotalKeys - expectedSummaryElement.sumProcessedKeys += stmtExecInfo2.ExecDetail.ProcessedKeys - expectedSummaryElement.maxProcessedKeys = stmtExecInfo2.ExecDetail.ProcessedKeys + expectedSummaryElement.sumTotalKeys += stmtExecInfo2.ExecDetail.ScanDetail.TotalKeys + expectedSummaryElement.maxTotalKeys = stmtExecInfo2.ExecDetail.ScanDetail.TotalKeys + expectedSummaryElement.sumProcessedKeys += stmtExecInfo2.ExecDetail.ScanDetail.ProcessedKeys + expectedSummaryElement.maxProcessedKeys = stmtExecInfo2.ExecDetail.ScanDetail.ProcessedKeys expectedSummaryElement.sumGetCommitTsTime += stmtExecInfo2.ExecDetail.CommitDetail.GetCommitTsTime expectedSummaryElement.maxGetCommitTsTime = stmtExecInfo2.ExecDetail.CommitDetail.GetCommitTsTime expectedSummaryElement.sumPrewriteTime += stmtExecInfo2.ExecDetail.CommitDetail.PrewriteTime @@ -293,12 +306,8 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { }, ExecDetail: &execdetails.ExecDetails{ CalleeAddress: "302", - ProcessTime: 150, - WaitTime: 15, BackoffTime: 18, RequestCount: 2, - TotalKeys: 600, - ProcessedKeys: 150, CommitDetail: &execdetails.CommitDetails{ GetCommitTsTime: 50, PrewriteTime: 5000, @@ -317,6 +326,19 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { PrewriteRegionNum: 10, TxnRetry: 1, }, + ScanDetail: &execdetails.ScanDetail{ + TotalKeys: 600, + ProcessedKeys: 150, + RocksdbDeleteSkippedCount: 100, + RocksdbKeySkippedCount: 10, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 10, + RocksdbBlockReadByte: 1000, + }, + TimeDetail: execdetails.TimeDetail{ + ProcessTime: 150, + WaitTime: 15, + }, }, StmtCtx: &stmtctx.StatementContext{ StmtType: "Select", @@ -335,11 +357,11 @@ func (s *testStmtSummarySuite) TestAddStatement(c *C) { expectedSummaryElement.sumParseLatency += stmtExecInfo3.ParseLatency expectedSummaryElement.sumCompileLatency += stmtExecInfo3.CompileLatency expectedSummaryElement.sumNumCopTasks += int64(stmtExecInfo3.CopTasks.NumCopTasks) - expectedSummaryElement.sumProcessTime += stmtExecInfo3.ExecDetail.ProcessTime - expectedSummaryElement.sumWaitTime += stmtExecInfo3.ExecDetail.WaitTime + expectedSummaryElement.sumProcessTime += stmtExecInfo3.ExecDetail.TimeDetail.ProcessTime + expectedSummaryElement.sumWaitTime += stmtExecInfo3.ExecDetail.TimeDetail.WaitTime expectedSummaryElement.sumBackoffTime += stmtExecInfo3.ExecDetail.BackoffTime - expectedSummaryElement.sumTotalKeys += stmtExecInfo3.ExecDetail.TotalKeys - expectedSummaryElement.sumProcessedKeys += stmtExecInfo3.ExecDetail.ProcessedKeys + expectedSummaryElement.sumTotalKeys += stmtExecInfo3.ExecDetail.ScanDetail.TotalKeys + expectedSummaryElement.sumProcessedKeys += stmtExecInfo3.ExecDetail.ScanDetail.ProcessedKeys expectedSummaryElement.sumGetCommitTsTime += stmtExecInfo3.ExecDetail.CommitDetail.GetCommitTsTime expectedSummaryElement.sumPrewriteTime += stmtExecInfo3.ExecDetail.CommitDetail.PrewriteTime expectedSummaryElement.sumCommitTime += stmtExecInfo3.ExecDetail.CommitDetail.CommitTime @@ -540,12 +562,8 @@ func generateAnyExecInfo() *StmtExecInfo { }, ExecDetail: &execdetails.ExecDetails{ CalleeAddress: "129", - ProcessTime: 500, - WaitTime: 50, BackoffTime: 80, RequestCount: 10, - TotalKeys: 1000, - ProcessedKeys: 500, CommitDetail: &execdetails.CommitDetails{ GetCommitTsTime: 100, PrewriteTime: 10000, @@ -564,6 +582,19 @@ func generateAnyExecInfo() *StmtExecInfo { PrewriteRegionNum: 20, TxnRetry: 2, }, + ScanDetail: &execdetails.ScanDetail{ + TotalKeys: 1000, + ProcessedKeys: 500, + RocksdbDeleteSkippedCount: 100, + RocksdbKeySkippedCount: 10, + RocksdbBlockCacheHitCount: 10, + RocksdbBlockReadCount: 10, + RocksdbBlockReadByte: 1000, + }, + TimeDetail: execdetails.TimeDetail{ + ProcessTime: 500, + WaitTime: 50, + }, }, StmtCtx: &stmtctx.StatementContext{ StmtType: "Select", @@ -599,10 +630,15 @@ func (s *testStmtSummarySuite) TestToDatum(c *C) { int64(stmtExecInfo1.ParseLatency), int64(stmtExecInfo1.ParseLatency), int64(stmtExecInfo1.CompileLatency), int64(stmtExecInfo1.CompileLatency), stmtExecInfo1.CopTasks.NumCopTasks, int64(stmtExecInfo1.CopTasks.MaxProcessTime), stmtExecInfo1.CopTasks.MaxProcessAddress, int64(stmtExecInfo1.CopTasks.MaxWaitTime), - stmtExecInfo1.CopTasks.MaxWaitAddress, int64(stmtExecInfo1.ExecDetail.ProcessTime), int64(stmtExecInfo1.ExecDetail.ProcessTime), - int64(stmtExecInfo1.ExecDetail.WaitTime), int64(stmtExecInfo1.ExecDetail.WaitTime), int64(stmtExecInfo1.ExecDetail.BackoffTime), - int64(stmtExecInfo1.ExecDetail.BackoffTime), stmtExecInfo1.ExecDetail.TotalKeys, stmtExecInfo1.ExecDetail.TotalKeys, - stmtExecInfo1.ExecDetail.ProcessedKeys, stmtExecInfo1.ExecDetail.ProcessedKeys, + stmtExecInfo1.CopTasks.MaxWaitAddress, int64(stmtExecInfo1.ExecDetail.TimeDetail.ProcessTime), int64(stmtExecInfo1.ExecDetail.TimeDetail.ProcessTime), + int64(stmtExecInfo1.ExecDetail.TimeDetail.WaitTime), int64(stmtExecInfo1.ExecDetail.TimeDetail.WaitTime), int64(stmtExecInfo1.ExecDetail.BackoffTime), + int64(stmtExecInfo1.ExecDetail.BackoffTime), stmtExecInfo1.ExecDetail.ScanDetail.TotalKeys, stmtExecInfo1.ExecDetail.ScanDetail.TotalKeys, + stmtExecInfo1.ExecDetail.ScanDetail.ProcessedKeys, stmtExecInfo1.ExecDetail.ScanDetail.ProcessedKeys, + int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount), int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbDeleteSkippedCount), + int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbKeySkippedCount), int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbKeySkippedCount), + int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount), int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockCacheHitCount), + int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockReadCount), int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockReadCount), + int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockReadByte), int64(stmtExecInfo1.ExecDetail.ScanDetail.RocksdbBlockReadByte), int64(stmtExecInfo1.ExecDetail.CommitDetail.PrewriteTime), int64(stmtExecInfo1.ExecDetail.CommitDetail.PrewriteTime), int64(stmtExecInfo1.ExecDetail.CommitDetail.CommitTime), int64(stmtExecInfo1.ExecDetail.CommitDetail.CommitTime), int64(stmtExecInfo1.ExecDetail.CommitDetail.GetCommitTsTime), int64(stmtExecInfo1.ExecDetail.CommitDetail.GetCommitTsTime), @@ -613,8 +649,9 @@ func (s *testStmtSummarySuite) TestToDatum(c *C) { stmtExecInfo1.ExecDetail.CommitDetail.WriteSize, stmtExecInfo1.ExecDetail.CommitDetail.WriteSize, stmtExecInfo1.ExecDetail.CommitDetail.PrewriteRegionNum, stmtExecInfo1.ExecDetail.CommitDetail.PrewriteRegionNum, stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, stmtExecInfo1.ExecDetail.CommitDetail.TxnRetry, 0, 0, 1, - "txnLock:1", stmtExecInfo1.MemMax, stmtExecInfo1.MemMax, stmtExecInfo1.DiskMax, stmtExecInfo1.DiskMax, stmtExecInfo1.StmtCtx.AffectedRows(), - t, t, 0, 0, stmtExecInfo1.OriginalSQL, stmtExecInfo1.PrevSQL, "plan_digest", ""} + "txnLock:1", stmtExecInfo1.MemMax, stmtExecInfo1.MemMax, stmtExecInfo1.DiskMax, stmtExecInfo1.DiskMax, + 0, 0, 0, 0, 0, stmtExecInfo1.StmtCtx.AffectedRows(), + t, t, 0, 0, 0, stmtExecInfo1.OriginalSQL, stmtExecInfo1.PrevSQL, "plan_digest", ""} match(c, datums[0], expectedDatum...) datums = s.ssMap.ToHistoryDatum(nil, true) c.Assert(len(datums), Equals, 1) @@ -806,7 +843,8 @@ func (s *testStmtSummarySuite) TestDisableStmtSummary(c *C) { now := time.Now().Unix() // Set false in global scope, it should work. - s.ssMap.SetEnabled("0", false) + err := s.ssMap.SetEnabled("0", false) + c.Assert(err, IsNil) s.ssMap.beginTimeForCurInterval = now + 60 stmtExecInfo1 := generateAnyExecInfo() @@ -815,14 +853,16 @@ func (s *testStmtSummarySuite) TestDisableStmtSummary(c *C) { c.Assert(len(datums), Equals, 0) // Set true in session scope, it will overwrite global scope. - s.ssMap.SetEnabled("1", true) + err = s.ssMap.SetEnabled("1", true) + c.Assert(err, IsNil) s.ssMap.AddStatement(stmtExecInfo1) datums = s.ssMap.ToCurrentDatum(nil, true) c.Assert(len(datums), Equals, 1) // Set false in global scope, it shouldn't work. - s.ssMap.SetEnabled("0", false) + err = s.ssMap.SetEnabled("0", false) + c.Assert(err, IsNil) s.ssMap.beginTimeForCurInterval = now + 60 stmtExecInfo2 := stmtExecInfo1 @@ -834,21 +874,24 @@ func (s *testStmtSummarySuite) TestDisableStmtSummary(c *C) { c.Assert(len(datums), Equals, 2) // Unset in session scope. - s.ssMap.SetEnabled("", true) + err = s.ssMap.SetEnabled("", true) + c.Assert(err, IsNil) s.ssMap.beginTimeForCurInterval = now + 60 s.ssMap.AddStatement(stmtExecInfo2) datums = s.ssMap.ToCurrentDatum(nil, true) c.Assert(len(datums), Equals, 0) // Unset in global scope. - s.ssMap.SetEnabled("", false) + err = s.ssMap.SetEnabled("", false) + c.Assert(err, IsNil) s.ssMap.beginTimeForCurInterval = now + 60 s.ssMap.AddStatement(stmtExecInfo1) datums = s.ssMap.ToCurrentDatum(nil, true) c.Assert(len(datums), Equals, 1) // Set back. - s.ssMap.SetEnabled("1", false) + err = s.ssMap.SetEnabled("1", false) + c.Assert(err, IsNil) } // Test disable and enable statement summary concurrently with adding statements. @@ -867,12 +910,14 @@ func (s *testStmtSummarySuite) TestEnableSummaryParallel(c *C) { // Add 32 times with same digest. for i := 0; i < loops; i++ { // Sometimes enable it and sometimes disable it. - s.ssMap.SetEnabled(fmt.Sprintf("%d", i%2), false) + err := s.ssMap.SetEnabled(fmt.Sprintf("%d", i%2), false) + c.Assert(err, IsNil) s.ssMap.AddStatement(stmtExecInfo1) // Try to read it. s.ssMap.ToHistoryDatum(nil, true) } - s.ssMap.SetEnabled("1", false) + err := s.ssMap.SetEnabled("1", false) + c.Assert(err, IsNil) } for i := 0; i < threads; i++ { @@ -885,8 +930,8 @@ func (s *testStmtSummarySuite) TestEnableSummaryParallel(c *C) { c.Assert(s.ssMap.Enabled(), IsTrue) } -// Test GetMoreThanOnceSelect. -func (s *testStmtSummarySuite) TestGetMoreThanOnceSelect(c *C) { +// Test GetMoreThanOnceBindableStmt. +func (s *testStmtSummarySuite) TestGetMoreThanOnceBindableStmt(c *C) { s.ssMap.Clear() stmtExecInfo1 := generateAnyExecInfo() @@ -894,22 +939,19 @@ func (s *testStmtSummarySuite) TestGetMoreThanOnceSelect(c *C) { stmtExecInfo1.NormalizedSQL = "insert ?" stmtExecInfo1.StmtCtx.StmtType = "Insert" s.ssMap.AddStatement(stmtExecInfo1) - schemas, sqls := s.ssMap.GetMoreThanOnceSelect() - c.Assert(len(schemas), Equals, 0) - c.Assert(len(sqls), Equals, 0) + stmts := s.ssMap.GetMoreThanOnceBindableStmt() + c.Assert(len(stmts), Equals, 0) stmtExecInfo1.NormalizedSQL = "select ?" stmtExecInfo1.Digest = "digest1" stmtExecInfo1.StmtCtx.StmtType = "Select" s.ssMap.AddStatement(stmtExecInfo1) - schemas, sqls = s.ssMap.GetMoreThanOnceSelect() - c.Assert(len(schemas), Equals, 0) - c.Assert(len(sqls), Equals, 0) + stmts = s.ssMap.GetMoreThanOnceBindableStmt() + c.Assert(len(stmts), Equals, 0) s.ssMap.AddStatement(stmtExecInfo1) - schemas, sqls = s.ssMap.GetMoreThanOnceSelect() - c.Assert(len(schemas), Equals, 1) - c.Assert(len(sqls), Equals, 1) + stmts = s.ssMap.GetMoreThanOnceBindableStmt() + c.Assert(len(stmts), Equals, 1) } // Test `formatBackoffTypes`. @@ -955,7 +997,8 @@ func (s *testStmtSummarySuite) TestRefreshCurrentSummary(c *C) { c.Assert(ssElement.beginTime, Greater, now-1900) c.Assert(ssElement.execCount, Equals, int64(1)) - s.ssMap.SetRefreshInterval("10", false) + err := s.ssMap.SetRefreshInterval("10", false) + c.Assert(err, IsNil) s.ssMap.beginTimeForCurInterval = now - 20 ssElement.beginTime = now - 20 s.ssMap.AddStatement(stmtExecInfo1) @@ -966,10 +1009,18 @@ func (s *testStmtSummarySuite) TestRefreshCurrentSummary(c *C) { func (s *testStmtSummarySuite) TestSummaryHistory(c *C) { s.ssMap.Clear() now := time.Now().Unix() - s.ssMap.SetRefreshInterval("10", false) - s.ssMap.SetHistorySize("10", false) - defer s.ssMap.SetRefreshInterval("1800", false) - defer s.ssMap.SetHistorySize("24", false) + err := s.ssMap.SetRefreshInterval("10", false) + c.Assert(err, IsNil) + err = s.ssMap.SetHistorySize("10", false) + c.Assert(err, IsNil) + defer func() { + err := s.ssMap.SetRefreshInterval("1800", false) + c.Assert(err, IsNil) + }() + defer func() { + err := s.ssMap.SetHistorySize("24", false) + c.Assert(err, IsNil) + }() stmtExecInfo1 := generateAnyExecInfo() key := &stmtSummaryByDigestKey{ @@ -1000,7 +1051,8 @@ func (s *testStmtSummarySuite) TestSummaryHistory(c *C) { datum := s.ssMap.ToHistoryDatum(nil, true) c.Assert(len(datum), Equals, 10) - s.ssMap.SetHistorySize("5", false) + err = s.ssMap.SetHistorySize("5", false) + c.Assert(err, IsNil) datum = s.ssMap.ToHistoryDatum(nil, true) c.Assert(len(datum), Equals, 5) } @@ -1061,15 +1113,20 @@ func (s *testStmtSummarySuite) TestEndTime(c *C) { c.Assert(ssElement.beginTime, Equals, now-100) c.Assert(ssElement.endTime, Equals, now+1700) - s.ssMap.SetRefreshInterval("3600", false) - defer s.ssMap.SetRefreshInterval("1800", false) + err := s.ssMap.SetRefreshInterval("3600", false) + c.Assert(err, IsNil) + defer func() { + err := s.ssMap.SetRefreshInterval("1800", false) + c.Assert(err, IsNil) + }() s.ssMap.AddStatement(stmtExecInfo1) c.Assert(ssbd.history.Len(), Equals, 1) ssElement = ssbd.history.Back().Value.(*stmtSummaryByDigestElement) c.Assert(ssElement.beginTime, Equals, now-100) c.Assert(ssElement.endTime, Equals, now+3500) - s.ssMap.SetRefreshInterval("60", false) + err = s.ssMap.SetRefreshInterval("60", false) + c.Assert(err, IsNil) s.ssMap.AddStatement(stmtExecInfo1) c.Assert(ssbd.history.Len(), Equals, 2) now2 := time.Now().Unix() diff --git a/util/stmtsummary/variables.go b/util/stmtsummary/variables.go index d8c3de68778b1..b179929002fd5 100644 --- a/util/stmtsummary/variables.go +++ b/util/stmtsummary/variables.go @@ -16,12 +16,12 @@ package stmtsummary import ( "fmt" "strconv" - "strings" "sync" "sync/atomic" "github.com/pingcap/errors" "github.com/pingcap/tidb/config" + svariable "github.com/pingcap/tidb/sessionctx/variable" ) const ( @@ -104,14 +104,10 @@ func getBoolFinalVariable(varType int, sessionValue, globalValue string) int64 { // normalizeEnableValue converts 'ON' or '1' to 1 and 'OFF' or '0' to 0. func normalizeEnableValue(value string) int64 { - switch { - case strings.EqualFold(value, "ON"): + if svariable.TiDBOptOn(value) { return 1 - case value == "1": - return 1 - default: - return 0 } + return 0 } func getIntFinalVariable(varType int, sessionValue, globalValue string, minValue int64) int64 { diff --git a/util/stmtsummary/variables_test.go b/util/stmtsummary/variables_test.go index 84f940116f350..79a8a9befbc60 100644 --- a/util/stmtsummary/variables_test.go +++ b/util/stmtsummary/variables_test.go @@ -28,25 +28,32 @@ func (s *testVariablesSuite) TestSetInVariable(c *C) { st := sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(config.GetGlobalConfig().StmtSummary.MaxStmtCount)) - sv.setVariable(typeMaxStmtCount, "10", false) + err := sv.setVariable(typeMaxStmtCount, "10", false) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(10)) - sv.setVariable(typeMaxStmtCount, "100", false) + err = sv.setVariable(typeMaxStmtCount, "100", false) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(100)) - sv.setVariable(typeMaxStmtCount, "10", true) + err = sv.setVariable(typeMaxStmtCount, "10", true) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(10)) - sv.setVariable(typeMaxStmtCount, "100", true) + err = sv.setVariable(typeMaxStmtCount, "100", true) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(100)) - sv.setVariable(typeMaxStmtCount, "10", false) + err = sv.setVariable(typeMaxStmtCount, "10", false) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(100)) - sv.setVariable(typeMaxStmtCount, "", true) + err = sv.setVariable(typeMaxStmtCount, "", true) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(10)) - sv.setVariable(typeMaxStmtCount, "", false) + err = sv.setVariable(typeMaxStmtCount, "", false) + c.Assert(err, IsNil) st = sv.getVariable(typeMaxStmtCount) c.Assert(st, Equals, int64(config.GetGlobalConfig().StmtSummary.MaxStmtCount)) } @@ -56,47 +63,59 @@ func (s *testVariablesSuite) TestSetBoolVariable(c *C) { en := sv.getVariable(typeEnable) c.Assert(en > 0, Equals, config.GetGlobalConfig().StmtSummary.Enable) - sv.setVariable(typeEnable, "OFF", false) + err := sv.setVariable(typeEnable, "OFF", false) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, false) - sv.setVariable(typeEnable, "ON", false) + err = sv.setVariable(typeEnable, "ON", false) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, true) - sv.setVariable(typeEnable, "OFF", true) + err = sv.setVariable(typeEnable, "OFF", true) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, false) - sv.setVariable(typeEnable, "ON", true) + err = sv.setVariable(typeEnable, "ON", true) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, true) - sv.setVariable(typeEnable, "OFF", false) + err = sv.setVariable(typeEnable, "OFF", false) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, true) - sv.setVariable(typeEnable, "", true) + err = sv.setVariable(typeEnable, "", true) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, false) - sv.setVariable(typeEnable, "ON", false) + err = sv.setVariable(typeEnable, "ON", false) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, true) - sv.setVariable(typeEnable, "", false) + err = sv.setVariable(typeEnable, "", false) + c.Assert(err, IsNil) en = sv.getVariable(typeEnable) c.Assert(en > 0, Equals, config.GetGlobalConfig().StmtSummary.Enable) } func (s *testVariablesSuite) TestMinValue(c *C) { sv := newSysVars() - sv.setVariable(typeMaxStmtCount, "0", false) + err := sv.setVariable(typeMaxStmtCount, "0", false) + c.Assert(err, IsNil) v := sv.getVariable(typeMaxStmtCount) c.Assert(v, Greater, int64(0)) - sv.setVariable(typeMaxSQLLength, "0", false) + err = sv.setVariable(typeMaxSQLLength, "0", false) + c.Assert(err, IsNil) v = sv.getVariable(typeMaxSQLLength) c.Assert(v, Equals, int64(0)) - sv.setVariable(typeHistorySize, "0", false) + err = sv.setVariable(typeHistorySize, "0", false) + c.Assert(err, IsNil) v = sv.getVariable(typeHistorySize) c.Assert(v, Equals, int64(0)) - sv.setVariable(typeRefreshInterval, "0", false) + err = sv.setVariable(typeRefreshInterval, "0", false) + c.Assert(err, IsNil) v = sv.getVariable(typeRefreshInterval) c.Assert(v, Greater, int64(0)) } diff --git a/util/stringutil/string_util.go b/util/stringutil/string_util.go index ec63268cb37e7..ae0722d8b0069 100644 --- a/util/stringutil/string_util.go +++ b/util/stringutil/string_util.go @@ -32,10 +32,10 @@ var ErrSyntax = errors.New("invalid syntax") // or character literal represented by the string s. // It returns four values: // -//1) value, the decoded Unicode code point or byte value; -//2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; -//3) tail, the remainder of the string after the character; and -//4) an error that will be nil if the character is syntactically valid. +// 1) value, the decoded Unicode code point or byte value; +// 2) multibyte, a boolean indicating whether the decoded character requires a multibyte UTF-8 representation; +// 3) tail, the remainder of the string after the character; and +// 4) an error that will be nil if the character is syntactically valid. // // The second argument, quote, specifies the type of literal being parsed // and therefore which escaped quote character is permitted. @@ -137,22 +137,38 @@ const ( PatAny ) -// CompilePattern handles escapes and wild cards convert pattern characters and +// CompilePatternBytes is a adapter for `CompilePatternInner`, `pattern` can only be an ascii string. +func CompilePatternBytes(pattern string, escape byte) (patChars, patTypes []byte) { + patWeights, patTypes := CompilePatternInner(pattern, escape) + patChars = []byte(string(patWeights)) + + return patChars, patTypes +} + +// CompilePattern is a adapter for `CompilePatternInner`, `pattern` can be any unicode string. +func CompilePattern(pattern string, escape byte) (patWeights []rune, patTypes []byte) { + return CompilePatternInner(pattern, escape) +} + +// CompilePatternInner handles escapes and wild cards convert pattern characters and // pattern types. -func CompilePattern(pattern string, escape byte) (patChars, patTypes []byte) { - patChars = make([]byte, len(pattern)) - patTypes = make([]byte, len(pattern)) +func CompilePatternInner(pattern string, escape byte) (patWeights []rune, patTypes []byte) { + runes := []rune(pattern) + escapeRune := rune(escape) + lenRunes := len(runes) + patWeights = make([]rune, lenRunes) + patTypes = make([]byte, lenRunes) patLen := 0 - for i := 0; i < len(pattern); i++ { + for i := 0; i < lenRunes; i++ { var tp byte - var c = pattern[i] - switch c { - case escape: + var r = runes[i] + switch r { + case escapeRune: tp = PatMatch - if i < len(pattern)-1 { + if i < lenRunes-1 { i++ - c = pattern[i] - if c == escape || c == '_' || c == '%' { + r = runes[i] + if r == escapeRune || r == '_' || r == '%' { // Valid escape. } else { // Invalid escape, fall back to escape byte. @@ -162,15 +178,15 @@ func CompilePattern(pattern string, escape byte) (patChars, patTypes []byte) { // Following case is correct just for escape \, not for others like +. // TODO: Add more checks for other escapes. i-- - c = escape + r = escapeRune } } case '_': // %_ => _% if patLen > 0 && patTypes[patLen-1] == PatAny { tp = PatAny - c = '%' - patChars[patLen-1], patTypes[patLen-1] = '_', PatOne + r = '%' + patWeights[patLen-1], patTypes[patLen-1] = '_', PatOne } else { tp = PatOne } @@ -183,16 +199,16 @@ func CompilePattern(pattern string, escape byte) (patChars, patTypes []byte) { default: tp = PatMatch } - patChars[patLen] = c + patWeights[patLen] = r patTypes[patLen] = tp patLen++ } - patChars = patChars[:patLen] + patWeights = patWeights[:patLen] patTypes = patTypes[:patLen] return } -func matchByte(a, b byte) bool { +func matchRune(a, b rune) bool { return a == b // We may reuse below code block when like function go back to case insensitive. /* @@ -209,7 +225,7 @@ func matchByte(a, b byte) bool { // CompileLike2Regexp convert a like `lhs` to a regular expression func CompileLike2Regexp(str string) string { patChars, patTypes := CompilePattern(str, '\\') - var result []byte + var result []rune for i := 0; i < len(patChars); i++ { switch patTypes[i] { case PatMatch: @@ -223,24 +239,37 @@ func CompileLike2Regexp(str string) string { return string(result) } -// DoMatch matches the string with patChars and patTypes. +// DoMatchBytes is a adapter for `DoMatchInner`, `str` can only be an ascii string. +func DoMatchBytes(str string, patChars, patTypes []byte) bool { + return DoMatchInner(str, []rune(string(patChars)), patTypes, matchRune) +} + +// DoMatch is a adapter for `DoMatchInner`, `str` can be any unicode string. +func DoMatch(str string, patChars []rune, patTypes []byte) bool { + return DoMatchInner(str, patChars, patTypes, matchRune) +} + +// DoMatchInner matches the string with patChars and patTypes. // The algorithm has linear time complexity. // https://research.swtch.com/glob -func DoMatch(str string, patChars, patTypes []byte) bool { - var sIdx, pIdx, nextSIdx, nextPIdx int - for pIdx < len(patChars) || sIdx < len(str) { - if pIdx < len(patChars) { +func DoMatchInner(str string, patWeights []rune, patTypes []byte, matcher func(a, b rune) bool) bool { + // TODO(bb7133): it is possible to get the rune one by one to avoid the cost of get them as a whole. + runes := []rune(str) + lenRunes := len(runes) + var rIdx, pIdx, nextRIdx, nextPIdx int + for pIdx < len(patWeights) || rIdx < lenRunes { + if pIdx < len(patWeights) { switch patTypes[pIdx] { case PatMatch: - if sIdx < len(str) && matchByte(str[sIdx], patChars[pIdx]) { + if rIdx < lenRunes && matcher(runes[rIdx], patWeights[pIdx]) { pIdx++ - sIdx++ + rIdx++ continue } case PatOne: - if sIdx < len(str) { + if rIdx < lenRunes { pIdx++ - sIdx++ + rIdx++ continue } case PatAny: @@ -248,15 +277,15 @@ func DoMatch(str string, patChars, patTypes []byte) bool { // If that doesn't work out, // restart at sIdx+1 next. nextPIdx = pIdx - nextSIdx = sIdx + 1 + nextRIdx = rIdx + 1 pIdx++ continue } } // Mismatch. Maybe restart. - if 0 < nextSIdx && nextSIdx <= len(str) { + if 0 < nextRIdx && nextRIdx <= lenRunes { pIdx = nextPIdx - sIdx = nextSIdx + rIdx = nextRIdx continue } return false @@ -337,3 +366,12 @@ func BuildStringFromLabels(labels map[string]string) string { returned := r.String() return returned[:len(returned)-1] } + +// GetTailSpaceCount returns the number of tailed spaces. +func GetTailSpaceCount(str string) int64 { + length := len(str) + for length > 0 && str[length-1] == ' ' { + length-- + } + return int64(len(str) - length) +} diff --git a/util/stringutil/string_util_test.go b/util/stringutil/string_util_test.go index e7d20a6a16d42..923f85fee661c 100644 --- a/util/stringutil/string_util_test.go +++ b/util/stringutil/string_util_test.go @@ -110,6 +110,7 @@ func (s *testStringUtilSuite) TestPatternMatch(c *C) { {`\%a`, `%a`, '+', false}, {`++a`, `+a`, '+', true}, {`++_a`, `+xa`, '+', true}, + {`___Հ`, `䇇Հ`, '\\', false}, // We may reopen these test when like function go back to case insensitive. /* {"_ab", "AAB", '\\', true}, diff --git a/util/testkit/testkit.go b/util/testkit/testkit.go index f586e2a18d1d3..4992e28663b1a 100644 --- a/util/testkit/testkit.go +++ b/util/testkit/testkit.go @@ -120,6 +120,15 @@ func NewTestKit(c *check.C, store kv.Storage) *TestKit { } } +// NewTestKitWithSession returns a new *TestKit with a session. +func NewTestKitWithSession(c *check.C, store kv.Storage, se session.Session) *TestKit { + return &TestKit{ + c: c, + store: store, + Se: se, + } +} + // NewTestKitWithInit returns a new *TestKit and creates a session. func NewTestKitWithInit(c *check.C, store kv.Storage) *TestKit { tk := NewTestKit(c, store) @@ -138,7 +147,7 @@ func (tk *TestKit) GetConnectionID() { } } -// Exec executes a sql statement. +// Exec executes a sql statement using the prepared stmt API func (tk *TestKit) Exec(sql string, args ...interface{}) (sqlexec.RecordSet, error) { var err error if tk.Se == nil { @@ -222,6 +231,30 @@ func (tk *TestKit) HasPlan(sql string, plan string, args ...interface{}) bool { return false } +func containGloabl(rs *Result) bool { + partitionNameCol := 2 + for i := range rs.rows { + if strings.Contains(rs.rows[i][partitionNameCol], "global") { + return true + } + } + return false +} + +// MustNoGlobalStats checks if there is no global stats. +func (tk *TestKit) MustNoGlobalStats(table string) bool { + if containGloabl(tk.MustQuery("show stats_meta where table_name like '" + table + "'")) { + return false + } + if containGloabl(tk.MustQuery("show stats_buckets where table_name like '" + table + "'")) { + return false + } + if containGloabl(tk.MustQuery("show stats_histograms where table_name like '" + table + "'")) { + return false + } + return true +} + // MustUseIndex checks if the result execution plan contains specific index(es). func (tk *TestKit) MustUseIndex(sql string, index string, args ...interface{}) bool { rs := tk.MustQuery("explain "+sql, args...) @@ -296,7 +329,7 @@ func (tk *TestKit) MustGetErrCode(sql string, errCode int) { tk.c.Assert(err, check.NotNil) originErr := errors.Cause(err) tErr, ok := originErr.(*terror.Error) - tk.c.Assert(ok, check.IsTrue, check.Commentf("expect type 'terror.Error', but obtain '%T'", originErr)) + tk.c.Assert(ok, check.IsTrue, check.Commentf("expect type 'terror.Error', but obtain '%T': %v", originErr, originErr)) sqlErr := terror.ToSQLError(tErr) tk.c.Assert(int(sqlErr.Code), check.Equals, errCode, check.Commentf("Assertion failed, origin err:\n %v", sqlErr)) } @@ -310,7 +343,7 @@ func (tk *TestKit) ResultSetToResult(rs sqlexec.RecordSet, comment check.Comment // ResultSetToResultWithCtx converts sqlexec.RecordSet to testkit.Result. func (tk *TestKit) ResultSetToResultWithCtx(ctx context.Context, rs sqlexec.RecordSet, comment check.CommentInterface) *Result { sRows, err := session.ResultSetToStringSlice(ctx, tk.Se, rs) - tk.c.Check(err, check.IsNil, comment) + tk.c.Check(errors.ErrorStack(err), check.Equals, "", comment) return &Result{rows: sRows, c: tk.c, comment: comment} } diff --git a/util/testleak/leaktest.go b/util/testleak/leaktest.go index f967b2ffeefef..fd7f06d6d5694 100644 --- a/util/testleak/leaktest.go +++ b/util/testleak/leaktest.go @@ -38,7 +38,6 @@ func interestingGoroutines() (gs []string) { "check.(*suiteRunner).runFunc", "check.(*suiteRunner).parallelRun", "localstore.(*dbStore).scheduler", - "tikv.(*noGCHandler).Start", "ddl.(*ddl).start", "ddl.(*delRange).startEmulator", "domain.NewDomain", @@ -51,6 +50,7 @@ func interestingGoroutines() (gs []string) { "interestingGoroutines", "runtime.MHeap_Scavenger", "created by os/signal.init", + "gopkg.in/natefinch/lumberjack%2ev2.(*Logger).millRun", // these go routines are async terminated, so they may still alive after test end, thus cause // false positive leak failures "google.golang.org/grpc.(*addrConn).resetTransport", @@ -61,7 +61,7 @@ func interestingGoroutines() (gs []string) { "go.etcd.io/etcd/pkg/logutil.(*MergeLogger).outputLoop", "go.etcd.io/etcd/v3/pkg/logutil.(*MergeLogger).outputLoop", "oracles.(*pdOracle).updateTS", - "tikv.(*tikvStore).runSafePointChecker", + "tikv.(*KVStore).runSafePointChecker", "tikv.(*RegionCache).asyncCheckAndResolveLoop", "github.com/pingcap/badger", "github.com/ngaut/unistore/tikv.(*MVCCStore).runUpdateSafePointLoop", diff --git a/util/testutil/testutil.go b/util/testutil/testutil.go index 12781b29b66fc..eb2c9ad565282 100644 --- a/util/testutil/testutil.go +++ b/util/testutil/testutil.go @@ -417,7 +417,6 @@ type configTestUtils struct { } type autoRandom struct { - originAllowAutoRandom bool originAlterPrimaryKey bool } diff --git a/util/timeutil/time.go b/util/timeutil/time.go index 8817f70acec0a..47e9d8fa657c1 100644 --- a/util/timeutil/time.go +++ b/util/timeutil/time.go @@ -15,6 +15,7 @@ package timeutil import ( "fmt" + "os" "path/filepath" "strings" "sync" @@ -52,6 +53,22 @@ type locCache struct { locMap map[string]*time.Location } +// inferOneStepLinkForPath only read one step link for the path, not like filepath.EvalSymlinks, which gets the +// recursive final linked file of the path. +func inferOneStepLinkForPath(path string) (string, error) { + fileInfo, err := os.Lstat(path) + if err != nil { + return path, err + } + if fileInfo.Mode()&os.ModeSymlink != 0 { + path, err = os.Readlink(path) + if err != nil { + return path, err + } + } + return path, nil +} + // InferSystemTZ reads system timezone from `TZ`, the path of the soft link of `/etc/localtime`. If both of them are failed, system timezone will be set to `UTC`. // It is exported because we need to use it during bootstrap stage. And it should be only used at that stage. func InferSystemTZ() string { @@ -64,6 +81,13 @@ func InferSystemTZ() string { case !ok: path, err1 := filepath.EvalSymlinks("/etc/localtime") if err1 == nil { + if strings.Index(path, "posixrules") != -1 { + path, err1 = inferOneStepLinkForPath("/etc/localtime") + if err1 != nil { + logutil.BgLogger().Error("locate timezone files failed", zap.Error(err1)) + return "" + } + } name, err2 := inferTZNameFromFileName(path) if err2 == nil { return name diff --git a/util/timeutil/time_test.go b/util/timeutil/time_test.go index 3aa4860c1f39a..002783f417c65 100644 --- a/util/timeutil/time_test.go +++ b/util/timeutil/time_test.go @@ -19,6 +19,8 @@ package timeutil import ( "os" + "path/filepath" + "strings" "testing" . "github.com/pingcap/check" @@ -64,3 +66,24 @@ func (s *testTimeSuite) TestLocal(c *C) { c.Assert(loc.String(), Equals, "UTC") os.Unsetenv("TZ") } + +func (s *testTimeSuite) TestInferOneStepLinkForPath(c *C) { + os.Remove(filepath.Join(os.TempDir(), "testlink1")) + os.Remove(filepath.Join(os.TempDir(), "testlink2")) + os.Remove(filepath.Join(os.TempDir(), "testlink3")) + var link2, link3 string + var err error + var link1 *os.File + link1, err = os.Create(filepath.Join(os.TempDir(), "testlink1")) + c.Assert(err, IsNil) + err = os.Symlink(link1.Name(), filepath.Join(os.TempDir(), "testlink2")) + c.Assert(err, IsNil) + err = os.Symlink(filepath.Join(os.TempDir(), "testlink2"), filepath.Join(os.TempDir(), "testlink3")) + c.Assert(err, IsNil) + link2, err = inferOneStepLinkForPath(filepath.Join(os.TempDir(), "testlink3")) + c.Assert(err, IsNil) + c.Assert(link2, Equals, filepath.Join(os.TempDir(), "testlink2")) + link3, err = filepath.EvalSymlinks(filepath.Join(os.TempDir(), "testlink3")) + c.Assert(err, IsNil) + c.Assert(strings.Index(link3, link1.Name()), Not(Equals), -1) +}